diff --git a/.codecov.yaml b/.codecov.yaml index 64b667d837..9ee8dc8b1d 100644 --- a/.codecov.yaml +++ b/.codecov.yaml @@ -18,9 +18,4 @@ coverage: only_pulls: false changes: false ignore: - - "vendor" - - "pinniped/**/*" - - "provider-bundle" - - "providers.zip" - - "providers.tar.gz" - "**/zz_generated.deepcopy.go" diff --git a/.dockerignore b/.dockerignore index 580665a530..c936ed38ce 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,3 +4,5 @@ hack/ packages/ docs/ test/ +build/ +bin/ \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a014639b2d..5112868e01 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -14,56 +14,8 @@ updates: interval: "daily" open-pull-requests-limit: 0 - - package-ecosystem: "gomod" - directory: "addons/" - schedule: - interval: "daily" - open-pull-requests-limit: 0 - - - package-ecosystem: "gomod" - directory: "pinniped-components/post-deploy/" - schedule: - interval: "daily" - open-pull-requests-limit: 0 - - package-ecosystem: "gomod" directory: "/" schedule: interval: "daily" open-pull-requests-limit: 0 - - - package-ecosystem: "gomod" - directory: "hack/packages/kbld-image-replace/" - schedule: - interval: "daily" - open-pull-requests-limit: 0 - - - package-ecosystem: "gomod" - directory: "hack/tools/" - schedule: - interval: "daily" - open-pull-requests-limit: 0 - - - package-ecosystem: "gomod" - directory: "pkg/v1/providers/tests/" - schedule: - interval: "daily" - open-pull-requests-limit: 0 - - - package-ecosystem: "npm" - directory: "tkg/web/e2e/" - schedule: - interval: "daily" - open-pull-requests-limit: 0 - - - package-ecosystem: "npm" - directory: "tkg/web/node-server/" - schedule: - interval: "daily" - open-pull-requests-limit: 0 - - - package-ecosystem: "npm" - directory: "tkg/web/" - schedule: - interval: "daily" - open-pull-requests-limit: 0 diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index e97b1fc759..4b7af2b12a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,94 +1,38 @@ name: Build -on: - pull_request: - branches: [ main, release-* ] - +on: [pull_request] jobs: build: name: build runs-on: ubuntu-latest steps: - - name: Free some disk space on runner - run: | - echo "free space before cleanup:" - df -h - sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/share/boost /usr/lib/jvm /usr/lib/firefox /opt/microsoft/powershell /opt/hostedtoolcache - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Use Node 16.x - uses: actions/setup-node@v3 - with: - node-version: 16.x - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Get npm cache directory - id: npm-cache-dir - run: | - echo "::set-output name=dir::$(npm config get cache)" - - name: npm cache - uses: actions/cache@v3 - id: npm-cache # use this to check for `cache-hit` ==> if: steps.npm-cache.outputs.cache-hit != 'true' - with: - path: ${{ steps.npm-cache-dir.outputs.dir }} - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Get dependencies - run: go mod download - - - name: Extract PR Number - uses: Dovyski/payload-info-action@master - id: get_pr_num - with: - # when event is a pull request, obtaining the PR number is obvious - filter_pull_request: '.number' - # when event is a push (merge of PR), since we require linear history, - # we are not even generating a merge commit that can help identify the - # PR number, so don't even try. Instead we just hard-code to a dummy - # value. - filter_push: 1009 - - - name: Find Comment - uses: peter-evans/find-comment@v1 - id: findcomment - with: - issue-number: ${{ steps.get_pr_num.outputs.value }} - body-includes: //usebom - direction: last - - - name: Extract Alternate BOM - shell: bash - run: | - export BOMCOMMENT=$(echo -e "${{ steps.findcomment.outputs.comment-body }}" | tr -d "[:space:]") - echo "##[set-output name=bompath;]$(echo "$BOMCOMMENT" | awk -F : '{print $2}')" - id: extract_bom - - - name: run make all - run: | - if [[ ! -z "${{ steps.extract_bom.outputs.bompath }}" ]]; then - export TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH=${{ steps.extract_bom.outputs.bompath }} - fi - env | sort - make configure-bom - make all ENVS=linux-amd64 + - name: Free some disk space on runner + run: | + echo "free space before cleanup:" + df -h + sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/share/boost /usr/lib/jvm /usr/lib/firefox /opt/microsoft/powershell /opt/hostedtoolcache + echo "free space after cleanup:" + df -h + + - name: Set up Go 1.x + uses: actions/setup-go@v3 + with: + go-version: 1.18 + id: go + + - name: Check out code into the Go module directory + uses: actions/checkout@v1 + + - name: go cache + uses: actions/cache@v3 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + + - name: run make docker-build-all + run: | + make docker-build-all diff --git a/.github/workflows/cherry-pick.yaml b/.github/workflows/cherry-pick.yaml deleted file mode 100644 index 03fdae4ab2..0000000000 --- a/.github/workflows/cherry-pick.yaml +++ /dev/null @@ -1,63 +0,0 @@ -name: Cherry-pick - -on: - pull_request: - branches: - - main - types: ["closed"] - -jobs: - cherry_pick_release_v0_28: - runs-on: ubuntu-latest - name: Cherry-pick into release-0.28 brach - if: ${{ contains(github.event.pull_request.labels.*.name, 'cherry-pick/release-0.28') && github.event.pull_request.merged == true }} - outputs: - pr_url: ${{ steps.cherrypick.outputs.html_url }} - steps: - - name: Checkout - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - name: Cherry pick into release-0.28 - id: cherrypick - uses: carloscastrojumo/github-cherry-pick-action@v1.0.9 - with: - token: ${{ secrets.ALFRED_PAT }} - committer: Alfred the Narwhal - author: Alfred the Narwhal - branch: release-0.28 - title: '[release-0.28] cherry-pick ${{github.event.number}} : {old_title}' - body: 'Cherry-pick of #{old_pull_request_id} into release-0.28 branch' - labels: "backports/release-0.28" - notify_cherrypick_status: - runs-on: ubuntu-latest - name: Notify release-0.28 cherry-pick status - needs: [cherry_pick_release_v0_28] - if: ${{ contains(github.event.pull_request.labels.*.name, 'cherry-pick/release-0.28') && github.event.pull_request.merged == true }} - steps: - - id: check - uses: martialonline/workflow-status@v3 - - name: post failure message - uses: peter-evans/create-or-update-comment@v2 - if: steps.check.outputs.status == 'failure' - with: - token: ${{ secrets.ALFRED_PAT }} - issue-number: ${{ github.event.pull_request.number }} - body: | - Failed to create cherry-pick PR, workflow failed (usually due to merge conflicts), please create the cherry-pick PR manually against release-0.28 branch. - - name: post success message - uses: peter-evans/create-or-update-comment@v2 - if: steps.check.outputs.status == 'success' - with: - token: ${{ secrets.ALFRED_PAT }} - issue-number: ${{ github.event.pull_request.number }} - body: | - Created cherry-pick PR ${{ needs.cherry_pick_release_v0_28.outputs.pr_url }} - - name: post cancelled workflow message - uses: peter-evans/create-or-update-comment@v2 - if: steps.check.outputs.status == 'cancelled' - with: - token: ${{ secrets.ALFRED_PAT }} - issue-number: ${{ github.event.pull_request.number }} - body: | - Cherry-pick workflow is cancelled, please re-run the workflow manually. diff --git a/.github/workflows/cli_core_e2e_test.yaml b/.github/workflows/cli_core_e2e_test.yaml deleted file mode 100644 index 7b9b589eef..0000000000 --- a/.github/workflows/cli_core_e2e_test.yaml +++ /dev/null @@ -1,39 +0,0 @@ -name: Tanzu CLI Core Tests - -on: - pull_request: - branches: [main, release-*] - paths: - - "cli/**" - -jobs: - build: - name: Tanzu CLI Core E2E Tests - runs-on: ubuntu-latest - steps: - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Build Core CLI - run: | - make install-tanzu-core-cli -C cli/core - - - name: Tests - run: | - make test-e2e -C cli/core diff --git a/.github/workflows/cve_scan.yaml b/.github/workflows/cve-scan.yaml similarity index 59% rename from .github/workflows/cve_scan.yaml rename to .github/workflows/cve-scan.yaml index 4872b7241b..bcd6834e91 100644 --- a/.github/workflows/cve_scan.yaml +++ b/.github/workflows/cve-scan.yaml @@ -15,7 +15,6 @@ jobs: contents: read # for actions/checkout to fetch code security-events: write # for github/codeql-action/upload-sarif to upload SARIF results actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status - pull-requests: write # Required for adding comment on PR name: Trivy Scan runs-on: "ubuntu-latest" steps: @@ -30,19 +29,7 @@ jobs: limit-severities-for-sarif: true - name: Upload Trivy scan results to GitHub Security tab - id: upload-report uses: github/codeql-action/upload-sarif@v2 if: always() with: sarif_file: 'trivy-results.sarif' - - # **The URL in comment message is formulated specifically for pull-requests.** - # If this workflow is enhanced for push/scheduled events, - # please update the message contents accordingly. - - name: Comment on PR with results URL - uses: mshick/add-pr-comment@v2 - if: ${{ steps.upload-report.outputs.sarif-id }} # Run only if report uploaded successfully - with: - message: | - CVE Scan results for this PR can be viewed from - ${{ github.server_url }}/${{ github.repository }}/security/code-scanning?query=pr%3A${{ github.event.number }} diff --git a/.github/workflows/dev_tag_retrieval_pr.yaml b/.github/workflows/dev_tag_retrieval_pr.yaml deleted file mode 100644 index 25c62bb114..0000000000 --- a/.github/workflows/dev_tag_retrieval_pr.yaml +++ /dev/null @@ -1,86 +0,0 @@ -name: Release - Dev Tag Retrieval PR Generator -on: - push: - tags: - - "v[0-9]+.[0-9]+.0" - - "!*-*" -jobs: - gen_dev_tag_retrieval_pr: - name: Generate Dev Tag Retrieval PR - # Only run this job if we're in the main repo, not a fork. - if: github.repository == 'vmware-tanzu/tanzu-framework' - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v1 - - - name: Fetch current version - id: get_version - run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} - - - name: Increment Version to dev - id: next_version - run: | - IFS='.' read -ra ver <<< "${{ steps.get_version.outputs.VERSION }}" - patch=${ver[2]} - minor=${ver[1]} - major=${ver[0]} - patch=0 - minor=$((minor+1)) - echo ::set-output name=NEXT_VERSION::$major.$minor.$patch-dev - - - name: Update version in file - run: | - sed -i -e "/TKGManagementClusterPluginVersion/ s/= .*/= \"${{ steps.next_version.outputs.NEXT_VERSION }}\"/" tkg/tkgconfigpaths/zz_bundled_default_bom_files_configdata.go - sed -i -e "/Version/ s/= .*/= \"${{ steps.next_version.outputs.NEXT_VERSION }}\"/" cli/runtime/version/zz_generated_plugin_runtime_version.go - - - name: Set variables - id: vars - run: | - body=$(cat << EOF - ### What this PR does / why we need it - Updating version tag used for BOM retrieval to ${{ steps.next_version.outputs.NEXT_VERSION }}\ - - ### Which issue(s) this PR fixes - - Fixes # - - ### Describe testing done for PR - - ### Release note - ```release-note - - ``` - - ### PR Checklist - - - [x] Squash the commits into one or a small number of logical commits - - [x] Use good commit [messages](https://github.com/vmware-tanzu/tanzu-framework/blob/main/CONTRIBUTING.md) - - [x] Ensure PR contains terms all contributors can understand and links all contributors can access - - - ### Additional information - - #### Special notes for your reviewer - EOF - ) - body="${body//'%'/'%25'}" - body="${body//$'\n'/'%0A'}" - body="${body//$'\r'/'%0D'}" - echo ::set-output name=pr_title::"Update the BOM retrieval version to ${{ steps.next_version.outputs.NEXT_VERSION }}" - echo ::set-output name=commit_message::"Update the BOM retrieval version to ${{ steps.next_version.outputs.NEXT_VERSION }}" - echo ::set-output name=pr_body::$body - echo ::set-output name=pr_branch::"topic/releng/rel${{ steps.next_version.outputs.NEXT_VERSION }}" - - - name: Create Pull Request - uses: peter-evans/create-pull-request@v4 - with: - branch: ${{ steps.vars.outputs.pr_branch }} - token: ${{ secrets.GITHUB_TOKEN }} - base: main - title: ${{ steps.vars.outputs.pr_title }} - commit-message: ${{ steps.vars.outputs.commit_message }} - body: ${{ steps.vars.outputs.pr_body }} - delete-branch: true - labels: | - area/release diff --git a/.github/workflows/lint-all.yaml b/.github/workflows/lint-all.yaml new file mode 100644 index 0000000000..fc89769f0d --- /dev/null +++ b/.github/workflows/lint-all.yaml @@ -0,0 +1,49 @@ +name: Lint + +on: + pull_request: + branches: [ main, release-* ] + +jobs: + lint: + name: lint + runs-on: ubuntu-latest + steps: + - name: Free some disk space on runner + run: | + echo "free space before cleanup:" + df -h + sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/share/boost /usr/lib/jvm /usr/lib/firefox /opt/microsoft/powershell /opt/hostedtoolcache + echo "free space after cleanup:" + df -h + + - name: Set up Go 1.x + uses: actions/setup-go@v3 + with: + go-version: 1.18 + id: go + + - name: Check out code into the Go module directory + uses: actions/checkout@v1 + + - name: go cache + uses: actions/cache@v3 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + + - name: Cache linting + uses: actions/cache@v3 + with: + path: ${{ runner.temp }}/lint_cache + key: ${{ runner.os }}-lint-cache-2 + + - name: Run lint checks + env: + GOLANGCI_LINT_CACHE: ${{ runner.temp }}/lint_cache + run: | + make lint-all diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml deleted file mode 100644 index c319e1b4fd..0000000000 --- a/.github/workflows/lint.yaml +++ /dev/null @@ -1,49 +0,0 @@ -name: Lint - -on: - pull_request: - branches: [ main, release-* ] - -jobs: - lint: - name: lint - runs-on: ubuntu-latest - steps: - - name: Free some disk space on runner - run: | - echo "free space before cleanup:" - df -h - sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/share/boost /usr/lib/jvm /usr/lib/firefox /opt/microsoft/powershell /opt/hostedtoolcache - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Cache linting - uses: actions/cache@v3 - with: - path: ${{ runner.temp }}/lint_cache - key: ${{ runner.os }}-lint-cache-2 - - - name: Run lint checks - env: - GOLANGCI_LINT_CACHE: ${{ runner.temp }}/lint_cache - run: | - make lint diff --git a/.github/workflows/package_integration_test.yaml b/.github/workflows/package_integration_test.yaml deleted file mode 100644 index 5680a89c25..0000000000 --- a/.github/workflows/package_integration_test.yaml +++ /dev/null @@ -1,99 +0,0 @@ -name: Package Plugin Integration Tests - -on: - pull_request: - branches: [ main, release-* ] - paths: - - '.github/workflows/package_integration_test.yaml' - - 'packageclients/**' - - 'cmd/cli/plugin/package/**' - - 'cmd/cli/plugin/secret/**' - - 'tkg/tkgctl' - -concurrency: - group: ${{ format('package-plugin-integration-tests-{0}', github.head_ref) }} - cancel-in-progress: true - -jobs: - integ-tests-package-plugin-docker: - if: false - name: Package Plugin Tests CAPD - runs-on: tkg - steps: - - name: Free disk space and clean up installed plugins on runner - run: | - sudo rm -rf /usr/share/dotnet - sudo rm -rf /home/tanzu/.cache - sudo rm -rf /home/tanzu/.kube - sudo rm -rf /home/tanzu/.local/share/tanzu-cli/* - sudo sh -c 'find /tmp -type d -name "go-build*" -mtime +3 | xargs rm -rf' - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Get dependencies - run: go mod download - - - name: Build Tools - run: make tools - - - name: Extract PR Number - uses: Dovyski/payload-info-action@master - id: get_pr_num - with: - # when event is a pull request, obtaining the PR number is obvious - filter_pull_request: '.number' - # when event is a push (merge of PR), since we require linear history, - # we are not even generating a merge commit that can help identify the - # PR number, so don't even try. Instead we just hard-code to a dummy - # value. - filter_push: 1009 - - - name: Find Comment - uses: peter-evans/find-comment@v1 - id: findcomment - with: - issue-number: ${{ steps.get_pr_num.outputs.value }} - body-includes: //usebom - direction: last - - - name: Extract Alternate BOM - shell: bash - run: | - export BOMCOMMENT=$(echo -e "${{ steps.findcomment.outputs.comment-body }}" | tr -d "[:space:]") - echo "##[set-output name=bompath;]$(echo "$BOMCOMMENT" | awk -F : '{print $2}')" - id: extract_bom - - - name: Cleanup - run: rm -rf ~/.tanzu ~/.tkg ~/.config; docker kill $(docker ps -q) | true; docker system prune -a --volumes -f - - - name: Run Package plugin integration tests - run: | - if [[ ! -z "${{ steps.extract_bom.outputs.bompath }}" ]]; then - export TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH=${{ steps.extract_bom.outputs.bompath }} - fi - make configure-bom - make generate-embedproviders - make build-cli-local - make install-cli - make install-cli-plugins - export PROJ_ROOT=$PWD - cd cmd/cli/plugin/package/test/ - E2E_CONFIG=$PROJ_ROOT/cmd/cli/plugin/package/test/config/package_plugin_config.yaml $PROJ_ROOT/hack/tools/bin/ginkgo -v -trace -tags embedproviders . - cd $PROJ_ROOT diff --git a/.github/workflows/plugin_tests.yaml b/.github/workflows/plugin_tests.yaml deleted file mode 100644 index 83884f178b..0000000000 --- a/.github/workflows/plugin_tests.yaml +++ /dev/null @@ -1,105 +0,0 @@ -name: Plugin Tests - -on: - pull_request: - branches: [main, release-* ] - paths: - - "cmd/cli/plugin/cluster/**" - - "cmd/cli/plugin/managementcluster/**" - - 'tkg/**' - - 'providers/**' - - '.github/workflows/plugin_tests.yaml' - - Makefile - - 'cli/**' - -concurrency: - group: ${{ format('plugin-tests-{0}', github.head_ref) }} - cancel-in-progress: true - -jobs: - build: - name: Plugin Tests - runs-on: tkg - steps: - - name: Free disk space and clean up installed plugins on runner - run: | - sudo rm -rf /usr/share/dotnet - sudo rm -rf /home/tanzu/.cache - sudo rm -rf /home/tanzu/.kube - sudo rm -rf /home/tanzu/.local/share/tanzu-cli/* - sudo sh -c 'find /tmp -type d -name "go-build*" -mtime +3 | xargs rm -rf' - mkdir -p /home/tanzu/.local/share/tanzu-cli/test - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Get dependencies - run: go mod download - - - name: Extract PR Number - uses: Dovyski/payload-info-action@master - id: get_pr_num - with: - # when event is a pull request, obtaining the PR number is obvious - filter_pull_request: '.number' - # when event is a push (merge of PR), since we require linear history, - # we are not even generating a merge commit that can help identify the - # PR number, so don't even try. Instead we just hard-code to a dummy - # value. - filter_push: 1009 - - - name: Find Comment - uses: peter-evans/find-comment@v1 - id: findcomment - with: - issue-number: ${{ steps.get_pr_num.outputs.value }} - body-includes: //usebom - direction: last - - - name: Extract Alternate BOM - shell: bash - run: | - export BOMCOMMENT=$(echo -e "${{ steps.findcomment.outputs.comment-body }}" | tr -d "[:space:]") - echo "##[set-output name=bompath;]$(echo "$BOMCOMMENT" | awk -F : '{print $2}')" - id: extract_bom - - - name: Build - run: | - if [[ ! -z "${{ steps.extract_bom.outputs.bompath }}" ]]; then - export TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH=${{ steps.extract_bom.outputs.bompath }} - fi - env | sort - make configure-bom - make build-cli-local - - - name: Cleanup - run: rm -rf ~/.tanzu ~/.tkg ~/.config ~/.cache/tanzu; docker kill $(docker ps -q) | true; docker system prune -a --volumes -f - - - name: Install Tanzu CLI - run: | - make install-cli - tanzu config set features.global.context-aware-cli-for-plugins true - - - name: Install CLI plugins - run: | - tanzu plugin install all --local artifacts/linux/amd64/cli/ - tanzu plugin install all --local artifacts-admin/linux/amd64/cli/ - - - name: Run cluster test plugin - run: tanzu test plugin cluster diff --git a/.github/workflows/providers.yaml b/.github/workflows/providers.yaml deleted file mode 100644 index 56fd27554c..0000000000 --- a/.github/workflows/providers.yaml +++ /dev/null @@ -1,101 +0,0 @@ -name: Provider Template Tests -# note: this name is referenced in recv_providers.yaml - -on: - # only on pull requests as some tests involves comparing results based on differences - # between source and target branches - pull_request: - branches: [ main, release-* ] - paths: - - 'tkg/**' - - 'providers/**' - - '.github/workflows/providers.yaml' - -jobs: - build: - name: Providers Templates Tests - runs-on: ubuntu-latest - steps: - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: yaml-lint - uses: ibiqlik/action-yamllint@v3 - with: - file_or_dir: providers - config_file: providers/.yamllint - - - name: Free some disk space on runner - run: | - df -h - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/share/boost - sudo rm -rf /usr/lib/jvm - sudo rm -rf /usr/lib/firefox - sudo rm -rf /opt/microsoft/powershell - sudo rm -rf /opt/hostedtoolcache - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Extract PR Info - shell: bash - run: | - echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" - echo "##[set-output name=basebranch;]$(echo ${GITHUB_BASE_REF#refs/heads/})" - echo "##[set-output name=prnum;]$(echo "$GITHUB_REF" | awk -F / '{print $3}')" - id: extract_pr - - - name: Setup dependencies - run: | - mkdir -p bin - wget -q https://storage.googleapis.com/tkg-cli-builds/bin/pict.linux -O bin/pict - chmod +x bin/pict - wget -q https://storage.googleapis.com/tkg-cli-builds/bin/clusterctl -O bin/clusterctl - chmod +x bin/clusterctl - wget -q https://github.com/vmware-tanzu/carvel-ytt/releases/download/v0.30.0/ytt-linux-amd64 -O bin/ytt - chmod +x bin/ytt - echo "$PWD/bin" >> $GITHUB_PATH - sudo apt-get update -y - sudo apt-get install -y wdiff - - - name: Run clustergen verification tests - run: | - echo BRANCH=${{ steps.extract_pr.outputs.branch }} - echo PRNUM==${{ steps.extract_pr.outputs.prnum }} - echo BASEBRANCH=${{ steps.extract_pr.outputs.basebranch }} - env BASEBRANCH=${{ steps.extract_pr.outputs.basebranch }} - status=$(test -s ./providers/tests/clustergen/testdata/clustergen.diff.txt; echo $?) - CLUSTERCTL=clusterctl CLI_REPO=$PWD ./hack/clustergen/ci-validate-clustergen.sh ${{ steps.extract_pr.outputs.branch }} ${{ steps.extract_pr.outputs.basebranch }} - echo "##[set-output name=diffstatus;]$status" - echo $status > ./providers/tests/clustergen/testdata/clustergen.status - echo ${{ steps.extract_pr.outputs.prnum }} > ./providers/tests/clustergen/testdata/prnum - id: clustergen - - - id: publish-clustergen-results-as-artifacts - uses: actions/upload-artifact@v3 - with: - name: clustergen-output - path: | - ./providers/tests/clustergen/testdata/prnum - ./providers/tests/clustergen/testdata/clustergen.status - ./providers/tests/clustergen/testdata/clustergen.diff.txt - ./providers/tests/clustergen/testdata/clustergen_cc.diff.txt - ./providers/tests/clustergen/testdata/clustergen_noncc_vs_cc.diff.txt - ./providers/tests/clustergen/testdata/clustergen.html diff --git a/.github/workflows/recv_providers.yaml b/.github/workflows/recv_providers.yaml deleted file mode 100644 index 3cb0a3ba93..0000000000 --- a/.github/workflows/recv_providers.yaml +++ /dev/null @@ -1,87 +0,0 @@ -name: Post Cluster Generation Results As Comment - -# Adapted from https://securitylab.github.com/research/github-actions-preventing-pwn-requests/ -on: - workflow_run: - workflows: ["Provider Template Tests"] - types: - - completed - -jobs: - comment: - runs-on: ubuntu-latest - if: > - ${{ github.event.workflow_run.event == 'pull_request' && - github.event.workflow_run.conclusion == 'success' }} - steps: - - name: 'Download artifact' - uses: actions/github-script@v6.3.3 - with: - script: | - var artifacts = await github.rest.actions.listWorkflowRunArtifacts({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: ${{github.event.workflow_run.id }}, - }); - var matchArtifact = artifacts.data.artifacts.filter((artifact) => { - return artifact.name == "clustergen-output" - })[0]; - var download = await github.rest.actions.downloadArtifact({ - owner: context.repo.owner, - repo: context.repo.repo, - artifact_id: matchArtifact.id, - archive_format: 'zip', - }); - var fs = require('fs'); - fs.writeFileSync('${{github.workspace}}/clustergen-output.zip', Buffer.from(download.data)); - - - name: Read artifact info - shell: bash - run: | - unzip clustergen-output.zip - echo "##[set-output name=diffstatus;]$(cat ./clustergen.status)" - echo "##[set-output name=prnum;]$(cat ./prnum)" - id: read_artifact - - - name: Get Time - id: time - uses: nanzm/get-time-action@v1.1 - with: - format: 'YYYYMMDDHHmmss' - - - id: upload-clustergen-results - if: ${{ steps.read_actifact.outputs.diffstatus == 0 }} - uses: google-github-actions/upload-cloud-storage@v0.10.4 - with: - path: . - destination: tkg-clustergen/${{ steps.read_artifact.outputs.prnum }}/${{ steps.time.outputs.time }} - credentials: ${{ secrets.GCP_BUCKET_SA }} - glob: clustergen*.diff.txt - - - id: upload-clustergen-results2 - if: ${{ steps.clustergen.outputs.diffstatus == 0 }} - uses: google-github-actions/upload-cloud-storage@v0.10.4 - with: - path: ./clustergen.html - destination: tkg-clustergen/${{ steps.read_artifact.outputs.prnum }}/${{ steps.time.outputs.time }} - credentials: ${{ secrets.GCP_BUCKET_SA }} - - - name: Create comment with diffs - if: ${{ steps.read_actifact.outputs.diffstatus == 0 }} - uses: peter-evans/create-or-update-comment@v1 - with: - issue-number: ${{ steps.read_artifact.outputs.prnum }} - body: | - Cluster Generation A/B Results: - https://storage.googleapis.com/tkg-clustergen/${{ steps.read_artifact.outputs.prnum }}/${{ steps.time.outputs.time }}/clustergen.diff.txt - Author/reviewers: - Please review to verify that the effects on the generated cluster configurations are exactly what the PR intended, and give a thumbs-up if so. - - - name: Create comment indicating no changes detected - if: ${{ steps.read_actifact.outputs.diffstatus != 0 }} - uses: peter-evans/create-or-update-comment@v1 - with: - issue-number: ${{ steps.read_artifact.outputs.prnum }} - body: | - Cluster Generation A/B Results: (no changes detected) - diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index cc0c3f2623..0000000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,180 +0,0 @@ -name: Release - -on: - push: - branches: - - "!not_activated_on_branches!*" - tags: - - "v[0-9]+.[0-9]+.[0-9]+" - - "!*-*" - -jobs: - - build: - name: Release - runs-on: ubuntu-latest - steps: - - name: Free some disk space on runner - run: | - df -h - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/share/boost - sudo rm -rf /usr/lib/jvm - sudo rm -rf /usr/lib/firefox - sudo rm -rf /opt/microsoft/powershell - sudo rm -rf /opt/hostedtoolcache - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Get dependencies - run: go mod download - - - name: Build - run: make all - - - name: Verify - run: | - make verify - - - name: Test - run: make test - - - id: upload-cli-admin-artifacts - # disable unsigned/untested artifacts upload to bucket - if: ${{ false }} - uses: google-github-actions/upload-cloud-storage@v0.10.4 - with: - path: ./artifacts-admin - destination: tanzu-cli-admin-plugins - credentials: ${{ secrets.GCP_BUCKET_SA }} - - - name: Generate details for creating release notes - id: generate-release-details - shell: bash - run: | - set -o xtrace - RELEASE_BRANCH="main" - RELEASE_VERSION=${GITHUB_REF#refs/*/} - major=$(echo "$RELEASE_VERSION" | sed 's/^v\(.*\)/\1/' | cut -d. -f1) - minor=$(echo "$RELEASE_VERSION" | cut -d. -f2) - revision=$(echo "$RELEASE_VERSION" | cut -d. -f3) - if [ "$revision" -gt 0 ];then - revision=$(($revision-1)) - RELEASE_BRANCH="release-${major}.${minor}" - elif [ "$minor" -gt 0 ]; then - minor=$(($minor-1)) - elif [ "$major" -gt 0 ]; then - major=$(($major-1)) - else - echo "Please validate that the tag release version(${RELEASE_VERSION}) conforms to semver." - exit 1 - fi - LAST_TAG="v${major}.${minor}.${revision}" - echo "Last release tag - $LAST_TAG" - START_SHA=$(git rev-list -n 1 $LAST_TAG) - echo "Release note generator start SHA - $START_SHA" - END_SHA=$(git rev-list -n 1 $RELEASE_VERSION) - echo "Release note generator end SHA - $END_SHA" - - echo "::set-output name=start-sha::$START_SHA" - echo "::set-output name=end-sha::$END_SHA" - echo "::set-output name=release-version::$RELEASE_VERSION" - echo "::set-output name=prev-release-version::$LAST_TAG" - echo "::set-output name=repo-name::$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')" - echo "::set-output name=repo-org::$(echo '${{ github.repository }}' | awk -F '/' '{print $1}')" - echo "::set-output name=release-branch::$RELEASE_BRANCH" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Install release-note dependency - run: | - go get k8s.io/release/cmd/release-notes@v0.13.0 - - - name: Get Time - id: time - uses: nanzm/get-time-action@v1.1 - with: - format: 'YYYYMMDDHHmmss' - - - name: Generate release notes - id: get-release-notes - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - release-notes \ - --github-base-url https://github.com \ - --org ${{ steps.generate-release-details.outputs.repo-org }} \ - --repo ${{ steps.generate-release-details.outputs.repo-name }} \ - --branch ${{ steps.generate-release-details.outputs.release-branch }} \ - --required-author "" \ - --start-sha ${{ steps.generate-release-details.outputs.start-sha }} \ - --end-sha ${{ steps.generate-release-details.outputs.end-sha }} \ - --output /tmp/${{ steps.time.outputs.time }}-bin-notes - - - name: Get Github Release notes - uses: octokit/request-action@v2.x - id: get-github-release-notes - with: - route: POST /repos/{owner}/{repo}/releases/generate-notes - owner: ${{ steps.generate-release-details.outputs.repo-org }} - repo: ${{ steps.generate-release-details.outputs.repo-name }} - tag_name: ${{ steps.generate-release-details.outputs.release-version }} - previous_tag_name: ${{ steps.generate-release-details.outputs.prev-release-version }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: 'Identify New Contributors section' - id: get-new-contributors - run: | - githubOutput="/tmp/${{ steps.time.outputs.time }}-github-output" - echo "${{ fromJson(steps.get-github-release-notes.outputs.data).body }}" > "$githubOutput" - - - - name: Generate the release notes - shell: bash - run: | - NEW_CONTRIBUTORS=$(sed -n '/## New Contributors/,$p' /tmp/${{ steps.time.outputs.time }}-github-output) - RELEASE_TOOL_NOTES=$(sed 's/### Uncategorized/### Miscellaneous/g' /tmp/${{ steps.time.outputs.time }}-bin-notes) - RELEASE_NOTES=$(cat <<-END - ## Tanzu CLI Installation Instructions - - If you are installing Tanzu CLI using the artifacts published as part of this release, please follow the [instructions](https://github.com/vmware-tanzu/tanzu-framework/blob/main/docs/cli/getting-started.md). - - $RELEASE_TOOL_NOTES - - $NEW_CONTRIBUTORS - END - ) - echo "$RELEASE_NOTES" - echo "RELEASE_NOTES<> $GITHUB_ENV - echo "$RELEASE_NOTES" >> $GITHUB_ENV - echo "EOF" >> $GITHUB_ENV - - - id: create_draft_release - name: Create Draft Release - uses: softprops/action-gh-release@v1 - with: - draft: true - body: ${{ env.RELEASE_NOTES }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release_staging.yaml b/.github/workflows/release_staging.yaml deleted file mode 100644 index 06eea033ee..0000000000 --- a/.github/workflows/release_staging.yaml +++ /dev/null @@ -1,79 +0,0 @@ -name: Release Staging - -on: - push: - branches: [ main ] - -jobs: - - build: - name: Release Staging - runs-on: ubuntu-latest - steps: - - name: Free some disk space on runner - run: | - df -h - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/share/boost - sudo rm -rf /usr/lib/jvm - sudo rm -rf /usr/lib/firefox - sudo rm -rf /opt/microsoft/powershell - sudo rm -rf /opt/hostedtoolcache - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Get dependencies - run: go mod download - - - name: Build - run: BUILD_VERSION=dev make all - - - name: Verify - run: | - make verify - - - name: Test - run: make test - - - name: Upload coverage reports to Codecov with GitHub Action - uses: codecov/codecov-action@v3 - with: - files: ./coverage1.txt,./coverage2.txt,./coverage3.txt,./addons/coverage.txt,./pinniped-components/post-deploy/coverage.txt,./pinniped-components/tanzu-auth-controller-manager/coverage.txt,./cli/core/coverage.txt,./cli/runtime/coverage.txt,./tkg/coverage.txt,./featuregates/client/cover.out,./featuregates/controller/cover.out,./capabilities/client/cover.out,./capabilities/controller/cover.out,./cmd/cli/plugin-admin/builder/cover.out,./cmd/cli/plugin-admin/codegen/cover.out,./cmd/cli/plugin-admin/test/cover.out,./apis/config/cover.out,./apis/run/cover.out,./packageclients/cover.out,./apis/addonconfigs/cover.out,./apis/cli/cover.out,./apis/core/cover.out,./cmd/cli/plugin/feature/cover.out,./cmd/cli/plugin/login/cover.out,./cmd/cli/plugin/package/cover.out,./cmd/cli/plugin/pinniped-auth/cover.out,./cmd/cli/plugin/secret/cover.out - - - id: upload-cli-artifacts - # do not upload unsigned/untested artifacts to GCP bucket - if: ${{ false }} - uses: google-github-actions/upload-cloud-storage@v0.10.4 - with: - path: ./artifacts - destination: tanzu-cli-framework - credentials: ${{ secrets.GCP_BUCKET_SA }} - - - id: upload-cli-admin-artifacts - # do not upload unsigned/untested artifacts to GCP bucket - if: ${{ false }} - uses: google-github-actions/upload-cloud-storage@v0.10.4 - with: - path: ./artifacts-admin - destination: tanzu-cli-admin-plugins - credentials: ${{ secrets.GCP_BUCKET_SA }} diff --git a/.github/workflows/security_codeql.yaml b/.github/workflows/security_codeql.yaml deleted file mode 100644 index 054773b0e1..0000000000 --- a/.github/workflows/security_codeql.yaml +++ /dev/null @@ -1,48 +0,0 @@ -name: 'Security - CodeQL scan (periodic)' - -on: - schedule: - - cron: '* 1 * * *' - -jobs: - analyze: - name: Analyze - CodeQL - runs-on: ubuntu-latest - - steps: - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Get dependencies - run: go mod download - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: go, javascript - - - name: Build - run: | - env | sort - make configure-bom - make all - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/test-release-artifacts-linux-macos.yaml b/.github/workflows/test-release-artifacts-linux-macos.yaml deleted file mode 100644 index aa04de1ebe..0000000000 --- a/.github/workflows/test-release-artifacts-linux-macos.yaml +++ /dev/null @@ -1,28 +0,0 @@ -name: Test Release Artifacts on MacOS and Linux OS - -on: - workflow_dispatch: - inputs: - release_version: - description: "Release version that has to be tested" - required: true - - -jobs: - release-gate-macos-and-linux-release-builds: - name: Test Release Artifacts on MacOS and Linux OS - # Only run this job if we're in the main repo, not a fork. - if: github.repository == 'vmware-tanzu/tanzu-framework' - strategy: - matrix: - os: [macos-latest, ubuntu-latest] - runs-on: ${{ matrix.os }} - steps: - - name: Check out code - uses: actions/checkout@v1 - - - name: Test Release Artifacts on MacOS and Linux OS - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - ./hack/test-release-artifacts.sh ${{ github.event.inputs.release_version }} diff --git a/.github/workflows/test-release-artifacts-windows.yaml b/.github/workflows/test-release-artifacts-windows.yaml deleted file mode 100644 index 3205de6efe..0000000000 --- a/.github/workflows/test-release-artifacts-windows.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: Test Release Artifacts on Windows OS - -on: - workflow_dispatch: - inputs: - release_version: - description: "Release version that has to be tested" - required: true - -jobs: - release-gate-macos-and-linux-release-builds: - name: Test Release Artifacts on Windows OS - # Only run this job if we're in the main repo, not a fork. - if: github.repository == 'vmware-tanzu/tanzu-framework' - runs-on: windows-latest - steps: - - name: Check out code - uses: actions/checkout@v1 - - - name: Test Release Artifacts on Windows OS - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - .\hack\test-release-artifacts.ps1 -version ${{ github.event.inputs.release_version }} -signToolPath "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool.exe" - diff --git a/.github/workflows/tkg_integration_tests.yaml b/.github/workflows/tkg_integration_tests.yaml deleted file mode 100644 index 21ad39deb1..0000000000 --- a/.github/workflows/tkg_integration_tests.yaml +++ /dev/null @@ -1,241 +0,0 @@ -name: TKG Integration Tests - -on: - pull_request: - branches: [ main, release-* ] - paths: - - 'tkg/**' - - '!packageclients/**' - - '!cmd/cli/plugin/package/test/**' - - 'providers/**' - - '.github/workflows/tkg_integration_tests.yaml' - -concurrency: - group: ${{ format('integration-tests-{0}', github.head_ref) }} - cancel-in-progress: true - -jobs: - integ-tests-docker: - if: false - name: TKG Integration Tests CAPD - runs-on: tkg - steps: - - name: Free disk space and clean up installed plugins on runner - run: | - df -h - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/share/boost - sudo rm -rf /usr/lib/jvm - sudo rm -rf /usr/lib/firefox - sudo rm -rf /opt/microsoft/powershell - sudo rm -rf /opt/hostedtoolcache - sudo rm -rf /home/tanzu/.cache - sudo rm -rf /home/tanzu/.kube - sudo rm -rf /home/tanzu/.local/share/tanzu-cli/* - sudo sh -c 'find /tmp -type d -name "go-build*" -mtime +3 | xargs rm -rf' - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Get dependencies - run: | - go get -v -t -d ./... - if [ -f Gopkg.toml ]; then - curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh - dep ensure - fi - - - name: Build Tools - run: make tools - - - name: Extract PR Number - uses: Dovyski/payload-info-action@master - id: get_pr_num - with: - # when event is a pull request, obtaining the PR number is obvious - filter_pull_request: '.number' - # when event is a push (merge of PR), since we require linear history, - # we are not even generating a merge commit that can help identify the - # PR number, so don't even try. Instead we just hard-code to a dummy - # value. - filter_push: 1009 - - - name: Find Comment - uses: peter-evans/find-comment@v1 - id: findcomment - with: - issue-number: ${{ steps.get_pr_num.outputs.value }} - body-includes: //usebom - direction: last - - - name: Extract Alternate BOM - shell: bash - run: | - export BOMCOMMENT=$(echo -e "${{ steps.findcomment.outputs.comment-body }}" | tr -d "[:space:]") - echo "##[set-output name=bompath;]$(echo "$BOMCOMMENT" | awk -F : '{print $2}')" - id: extract_bom - - - name: Cleanup - run: rm -rf ~/.tanzu ~/.tkg ~/.config; docker kill $(docker ps -q) | true; docker system prune -a --volumes -f - - - name: Build CLI - run: | - make install-cli - - - name: Run TKG integration tests - run: | - if [[ ! -z "${{ steps.extract_bom.outputs.bompath }}" ]]; then - export TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH=${{ steps.extract_bom.outputs.bompath }} - fi - make configure-bom - make generate-embedproviders - pushd tkg - E2E_CONFIG=$PWD/test/config/docker.yaml ../hack/tools/bin/ginkgo -nodes=3 -v -trace -tags embedproviders test/tkgctl/docker - popd - - integ-tests-azure: - name: TKG Integration Tests CAPZ - runs-on: ubuntu-latest - env: - azure_client_id: ${{secrets.AZURE_CLIENT_ID_SAIB}} - steps: - - name: Free disk space and clean up installed plugins on runner - run: | - df -h - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/share/boost - sudo rm -rf /usr/lib/jvm - sudo rm -rf /usr/lib/firefox - sudo rm -rf /opt/microsoft/powershell - sudo rm -rf /opt/hostedtoolcache - sudo rm -rf /home/tanzu/.cache - sudo rm -rf /home/tanzu/.kube - sudo rm -rf /home/tanzu/.local/share/tanzu-cli/* - sudo sh -c 'find /tmp -type d -name "go-build*" -mtime +3 | xargs rm -rf' - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Get dependencies - run: go mod download - - - name: Build Tools - run: make tools - - - name: Extract PR Number - uses: Dovyski/payload-info-action@master - id: get_pr_num - with: - # when event is a pull request, obtaining the PR number is obvious - filter_pull_request: '.number' - # when event is a push (merge of PR), since we require linear history, - # we are not even generating a merge commit that can help identify the - # PR number, so don't even try. Instead we just hard-code to a dummy - # value. - filter_push: 1009 - - - name: Find Comment - uses: peter-evans/find-comment@v1 - id: findcomment - with: - issue-number: ${{ steps.get_pr_num.outputs.value }} - body-includes: //usebom - direction: last - - - name: Extract Alternate BOM - shell: bash - run: | - export BOMCOMMENT=$(echo -e "${{ steps.findcomment.outputs.comment-body }}" | tr -d "[:space:]") - echo "##[set-output name=bompath;]$(echo "$BOMCOMMENT" | awk -F : '{print $2}')" - id: extract_bom - - - name: Cleanup - run: rm -rf ~/.tanzu ~/.tkg ~/.config; docker kill $(docker ps -q) | true; docker system prune -a --volumes -f - - - name: Build CLI - run: | - make install-cli - - - name: Generate cluster prefix - if: ${{ env.azure_client_id != '' }} - env: - NUM: ${{ github.run_number }} - ACTIONS_ALLOW_UNSECURE_COMMANDS: true - run: | - echo ::set-env name=CLUSTER_PREFIX::"github-$NUM-" - - uses: microsoft/variable-substitution@v1 - if: ${{ env.azure_client_id != '' }} - with: - files: 'tkg/test/config/azure.yaml' - env: - tkg_config_variables.AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID_SAIB }} - tkg_config_variables.AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID_SAIB }} - tkg_config_variables.AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_SAIB }} - tkg_config_variables.AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET_SAIB }} - cluster_prefix: ${{ env.CLUSTER_PREFIX }} - - run: | - cat tkg/test/config/azure.yaml - - name: Run TKG integration tests - if: ${{ env.azure_client_id != '' }} - run: | - if [[ ! -z "${{ steps.extract_bom.outputs.bompath }}" ]]; then - export TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH=${{ steps.extract_bom.outputs.bompath }} - fi - make configure-bom - make generate-embedproviders - pushd tkg - E2E_CONFIG=$PWD/test/config/azure.yaml ../hack/tools/bin/ginkgo -nodes=3 -v -trace -tags embedproviders test/tkgctl/azure - popd - - - uses: Azure/login@v1.1 - if: ${{ always() && env.azure_client_id != '' }} - with: - creds: '{"clientId":"${{ secrets.AZURE_CLIENT_ID_SAIB }}","clientSecret":"${{ secrets.AZURE_CLIENT_SECRET_SAIB }}","subscriptionId":"${{ secrets.AZURE_SUBSCRIPTION_ID_SAIB }}","tenantId":"${{ secrets.AZURE_TENANT_ID_SAIB }}"}' - - - name: Cleanup Azure resources - if: ${{ always() }} - run: | - for rgname in `az group list --query "[? contains(name,'${cluster_prefix}')][].{name:name}" -o tsv`; do - echo Deleting ${rgname} - az group delete -n ${rgname} --yes --no-wait - done - env: - cluster_prefix: ${{ env.CLUSTER_PREFIX }} diff --git a/.github/workflows/tkg_integration_tests_clusterclass.yaml b/.github/workflows/tkg_integration_tests_clusterclass.yaml deleted file mode 100644 index ac9d794d61..0000000000 --- a/.github/workflows/tkg_integration_tests_clusterclass.yaml +++ /dev/null @@ -1,505 +0,0 @@ -name: TKG Integration Tests ClusterClass - -on: - pull_request: - branches: [ main, release-* ] - paths: - - 'tkg/**' - - 'pkg/v1/tkr/**' - - 'tkr/**' - - 'featuregates/**' - - 'capabilities/**' - - 'object-propagation/**' - - 'addons/**' - - 'packages/**' - - '!packageclients/**' - - '!cmd/cli/plugin/package/test/**' - - 'providers/**' - - '.github/workflows/tkg_integration_tests*.yaml' - - push: - branches: [ main, release-* ] - paths: - - 'tkg/**' - - 'pkg/v1/tkr/**' - - 'tkr/**' - - 'featuregates/**' - - 'capabilities/**' - - 'object-propagation/**' - - 'addons/**' - - 'packages/**' - - '!packageclients/**' - - '!cmd/cli/plugin/package/test/**' - - 'providers/**' - - '.github/workflows/tkg_integration_tests*.yaml' - -concurrency: - group: ${{ format('integration-tests-clusterclass-{0}', github.head_ref) }} - cancel-in-progress: true - -jobs: - build-and-publish-packages: - name: Build and Publish Carvel Packages - runs-on: tkg - env: - gcp_bucket_sa: ${{ secrets.GCP_BUCKET_SA }} - outputs: - bompath: ${{ steps.extract_bom.outputs.bompath }} - registry: ${{ steps.set_registry.outputs.registry }} - regdir: ${{ steps.extract_reg_dir.outputs.regdir }} - steps: - - name: Free disk space and clean up installed plugins on runner - run: | - df -h - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/share/boost - sudo rm -rf /usr/lib/jvm - sudo rm -rf /usr/lib/firefox - sudo rm -rf /opt/microsoft/powershell - sudo rm -rf /opt/hostedtoolcache - sudo rm -rf /home/tanzu/.cache - sudo rm -rf /home/tanzu/.kube - sudo rm -rf /home/tanzu/.local/share/tanzu-cli/* - sudo sh -c 'find /tmp -type d -name "go-build*" -mtime +3 | xargs rm -rf' - echo "free space after cleanup:" - df -h - - - name: show environment - uses: hmarr/debug-action@v2 - - - name: Extract PR Number - uses: Dovyski/payload-info-action@master - id: get_pr_num - with: - # when event is a pull request, obtaining the PR number is obvious - filter_pull_request: '.number' - # when event is a push (merge of PR), since we require linear history, - # we are not even generating a merge commit that can help identify the - # PR number, so don't even try. Instead we just hard-code to a dummy - # value. - filter_push: 1009 - - - name: Determine registry directory - uses: Dovyski/payload-info-action@master - id: get_registry_dir - with: - # when event is a pull request, use the PR number as the registry dir - filter_pull_request: '.number' - # when event is a push, use branch name instead - filter_push: '.ref | sub("^refs/heads/"; "")' - - - name: Extract registry directory - shell: bash - run: | - export REGDIR=$(echo ${{ steps.get_registry_dir.outputs.value }} | tr -d '"') - echo "##[set-output name=regdir;]$(echo $REGDIR)" - id: extract_reg_dir - - - name: Set registry - id: set_registry - shell: bash - run: | - if [ -z "${gcp_bucket_sa}" ]; then - echo "##[set-output name=registry;]localhost:5001" - else - echo "##[set-output name=registry;]gcr.io/eminent-nation-87317" - fi - - - name: Find Comment - uses: peter-evans/find-comment@v1 - id: findcomment - with: - issue-number: ${{ steps.get_pr_num.outputs.value }} - body-includes: //usebom - direction: last - - - name: Extract Alternate BOM - shell: bash - run: | - export BOMCOMMENT=$(echo -e "${{ steps.findcomment.outputs.comment-body }}" | tr -d "[:space:]") - echo "##[set-output name=bompath;]$(echo "$BOMCOMMENT" | awk -F : '{print $2}')" - id: extract_bom - - - name: Free disk space and clean up installed plugins on runner - run: | - df -h - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/share/boost - sudo rm -rf /usr/lib/jvm - sudo rm -rf /usr/lib/firefox - sudo rm -rf /opt/microsoft/powershell - sudo rm -rf /opt/hostedtoolcache - sudo rm -rf /home/tanzu/.cache - sudo rm -rf /home/tanzu/.kube - sudo rm -rf /home/tanzu/.local/share/tanzu-cli/* - sudo sh -c 'find /tmp -type d -name "go-build*" -mtime +3 | xargs rm -rf' - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v2 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Build Tools - run: make tools - - - name: Login to GCR - if: ${{ env.gcp_bucket_sa != '' }} - uses: docker/login-action@v2 - with: - registry: gcr.io - username: _json_key - password: ${{ secrets.GCP_BUCKET_SA }} - - - name: Build management packages - env: - NUM: ${{ github.run_id }} - OCI_REGISTRY: ${{ steps.set_registry.outputs.registry }}/tanzu_framework/github-actions/${{ steps.extract_reg_dir.outputs.regdir }} - COMPONENTS: "tkr/controller/tkr-source tkr/controller/tkr-status featuregates addons capabilities tkr/webhook/tkr-conversion tkr/webhook/cluster/tkr-resolver tkg/vsphere-template-resolver pinniped-components/tanzu-auth-controller-manager object-propagation" - BUILD_VERSION: "v0.21.0" - IMG_VERSION_OVERRIDE: latest - run: | - make local-registry - make docker-build - - - name: Publish management packages - env: - NUM: ${{ github.run_number }} - OCI_REGISTRY: ${{ steps.set_registry.outputs.registry }}/tanzu_framework/github-actions/${{ steps.extract_reg_dir.outputs.regdir }} - COMPONENTS: "tkr/controller/tkr-source tkr/controller/tkr-status featuregates addons capabilities tkr/webhook/tkr-conversion tkr/webhook/cluster/tkr-resolver tkg/vsphere-template-resolver pinniped-components/tanzu-auth-controller-manager object-propagation" - BUILD_VERSION: "v0.21.0" - IMG_VERSION_OVERRIDE: latest - run: | - make docker-publish - cp tkg/test/config/packages/core-management-plugins/kbld-config_test.yaml packages/core-management-plugins/kbld-config.yaml - make kbld-image-replace - make package-push-bundles-repo PACKAGE_REPOSITORY=management - make clean-registry - - integ-tests-docker-cc: - if: false - name: TKG Integration Tests CAPD (ClusterClass) - runs-on: tkg - needs: build-and-publish-packages - env: - gcp_bucket_sa: ${{ secrets.GCP_BUCKET_SA }} - steps: - - name: show environment - uses: hmarr/debug-action@v2 - - - name: Extract Alternate BOM - shell: bash - run: | - export BOMCOMMENT=$(echo -e "${{ needs.build-and-publish-packages.steps.findcomment.outputs.comment-body }}" | tr -d "[:space:]") - echo "##[set-output name=bompath;]$(echo "$BOMCOMMENT" | awk -F : '{print $2}')" - id: extract_bom - - - name: Free disk space and clean up installed plugins on runner - run: | - df -h - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/share/boost - sudo rm -rf /usr/lib/jvm - sudo rm -rf /usr/lib/firefox - sudo rm -rf /opt/microsoft/powershell - sudo rm -rf /opt/hostedtoolcache - sudo rm -rf /home/tanzu/.cache - sudo rm -rf /home/tanzu/.kube - sudo rm -rf /home/tanzu/.local/share/tanzu-cli/* - sudo sh -c 'find /tmp -type d -name "go-build*" -mtime +3 | xargs rm -rf' - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Build Tools - run: make tools - - - name: Login to GCR - if: ${{ env.gcp_bucket_sa != '' }} - uses: docker/login-action@v2 - with: - registry: gcr.io - username: _json_key - password: ${{ secrets.GCP_BUCKET_SA }} - - - name: Cleanup - run: rm -rf ~/.tanzu ~/.tkg ~/.config; docker kill $(docker ps -q) | true; docker system prune -a --volumes -f - - - name: Run TKG integration tests - if: ${{ env.gcp_bucket_sa != '' }} - run: | - if [[ ! -z "${{ needs.build-and-publish-packages.outputs.bompath }}" ]]; then - export TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH=${{ needs.build-and-publish-packages.outputs.bompath }} - fi - make configure-bom - make generate-embedproviders - pushd tkg - E2E_CONFIG=$PWD/test/config/cc/docker/docker.yaml ../hack/tools/bin/ginkgo -nodes=3 -v -trace -tags embedproviders test/tkgctl/docker_cc - popd - env: - _MANAGEMENT_PACKAGE_REPO_IMAGE: ${{ needs.build-and-publish-packages.outputs.registry }}/tanzu_framework/github-actions/${{ needs.build-and-publish-packages.outputs.regdir }}/management:v0.21.0 - _MANAGEMENT_PACKAGE_VERSION: "0.21.0" - TKG_CUSTOM_IMAGE_REPOSITORY: "projects-stg.registry.vmware.com/tkg" - - - integ-tests-aws-cc: - name: TKG Integration Tests CAPA (ClusterClass) - runs-on: ubuntu-latest - needs: build-and-publish-packages - env: - gcp_bucket_sa: ${{ secrets.GCP_BUCKET_SA }} - steps: - - name: show environment - uses: hmarr/debug-action@v2 - - - name: Free disk space and clean up installed plugins on runner - run: | - df -h - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/share/boost - sudo rm -rf /usr/lib/jvm - sudo rm -rf /usr/lib/firefox - sudo rm -rf /opt/microsoft/powershell - sudo rm -rf /opt/hostedtoolcache - sudo rm -rf /home/tanzu/.cache - sudo rm -rf /home/tanzu/.kube - sudo rm -rf /home/tanzu/.local/share/tanzu-cli/* - sudo sh -c 'find /tmp -type d -name "go-build*" -mtime +3 | xargs rm -rf' - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v2 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Build Tools - run: make tools - - - name: Cleanup - run: rm -rf ~/.tanzu ~/.tkg ~/.config; docker kill $(docker ps -q) | true; docker system prune -a --volumes -f - - - name: Build CLI - run: | - make install-cli - - - name: Setup AWS access - run: USER_PASS='${{ secrets.CG_ID }}:${{ secrets.CG_SECRET }}' tkg/test/scripts/aws_setup.sh - - - name: Mask AWS access - run: | - echo "::add-mask::${{ env.AWS_ACCESS_KEY_ID }}" - echo "::add-mask::${{ env.AWS_SECRET_ACCESS_KEY }}" - echo "::add-mask::${{ env.AWS_SESSION_TOKEN }}" - echo "::add-mask::${{ env.AWS_REGION }}" - - - name: Generate cluster prefix - if: ${{ env.AWS_ACCESS_KEY_ID != '' }} - env: - NUM: ${{ github.run_number }} - ACTIONS_ALLOW_UNSECURE_COMMANDS: true - run: | - echo ::set-env name=CLUSTER_PREFIX::"github-$NUM-" - - - uses: microsoft/variable-substitution@v1 - if: ${{ env.AWS_ACCESS_KEY_ID != '' }} - with: - files: 'tkg/test/config/aws.yaml' - env: - tkg_config_variables.AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }} - tkg_config_variables.AWS_SECRET_ACCESS_KEY: ${{ env.AWS_SECRET_ACCESS_KEY }} - tkg_config_variables.AWS_SESSION_TOKEN: ${{ env.AWS_SESSION_TOKEN }} - cluster_prefix: ${{ env.CLUSTER_PREFIX }} - - run: | - cat tkg/test/config/aws.yaml - - - name: Run TKG integration tests - if: ${{ env.AWS_ACCESS_KEY_ID != '' }} - run: | - if [[ ! -z "${{ needs.build-and-publish-packages.outputs.bompath }}" ]]; then - export TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH=${{ needs.build-and-publish-packages.outputs.bompath }} - fi - make configure-bom - make generate-embedproviders - pushd tkg - E2E_CONFIG=$PWD/test/config/aws.yaml ../hack/tools/bin/ginkgo -nodes=3 -v -trace -tags embedproviders test/tkgctl/aws_cc - popd - env: - AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ env.AWS_SECRET_ACCESS_KEY }} - AWS_SESSION_TOKEN: ${{ env.AWS_SESSION_TOKEN }} - AWS_REGION: ${{ env.AWS_REGION }} - _MANAGEMENT_PACKAGE_REPO_IMAGE: ${{ needs.build-and-publish-packages.outputs.registry }}/tanzu_framework/github-actions/${{ needs.build-and-publish-packages.outputs.regdir }}/management:v0.21.0 - _MANAGEMENT_PACKAGE_VERSION: "0.21.0" - TKG_CUSTOM_IMAGE_REPOSITORY: "projects-stg.registry.vmware.com/tkg" - - - name: Cleanup AWS resources - if: ${{ always() }} - run: | - tkg/test/scripts/aws_cleanup.sh ${{ env.AWS_ACCESS_KEY_ID }} ${{ env.AWS_SECRET_ACCESS_KEY }} "${{ env.AWS_SESSION_TOKEN }}" "${{ env.AWS_REGION }}" ${{ env.CLUSTER_PREFIX }} - env: - cluster_prefix: ${{ env.CLUSTER_PREFIX }} - - integ-tests-azure-cc: - name: TKG Integration Tests CAPZ (ClusterClass) - runs-on: ubuntu-latest - needs: build-and-publish-packages - env: - azure_client_id: ${{secrets.AZURE_CLIENT_ID_SAIB}} - gcp_bucket_sa: ${{ secrets.GCP_BUCKET_SA }} - steps: - - name: show environment - uses: hmarr/debug-action@v2 - - - name: Free disk space and clean up installed plugins on runner - run: | - df -h - sudo rm -rf /usr/share/dotnet - sudo rm -rf /opt/ghc - sudo rm -rf /usr/local/share/boost - sudo rm -rf /usr/lib/jvm - sudo rm -rf /usr/lib/firefox - sudo rm -rf /opt/microsoft/powershell - sudo rm -rf /opt/hostedtoolcache - sudo rm -rf /home/tanzu/.cache - sudo rm -rf /home/tanzu/.kube - sudo rm -rf /home/tanzu/.local/share/tanzu-cli/* - sudo sh -c 'find /tmp -type d -name "go-build*" -mtime +3 | xargs rm -rf' - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v2 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Build Tools - run: make tools - - - name: Cleanup - run: rm -rf ~/.tanzu ~/.tkg ~/.config; docker kill $(docker ps -q) | true; docker system prune -a --volumes -f - - - name: Build CLI - run: | - make install-cli - - - name: Generate cluster prefix - if: ${{ env.azure_client_id != '' }} - env: - NUM: ${{ github.run_number }} - ACTIONS_ALLOW_UNSECURE_COMMANDS: true - run: | - echo ::set-env name=CLUSTER_PREFIX::"github-$NUM-" - - - uses: microsoft/variable-substitution@v1 - if: ${{ env.azure_client_id != '' }} - with: - files: 'tkg/test/config/azure.yaml' - env: - tkg_config_variables.AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID_SAIB }} - tkg_config_variables.AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID_SAIB }} - tkg_config_variables.AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_SAIB }} - tkg_config_variables.AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET_SAIB }} - cluster_prefix: ${{ env.CLUSTER_PREFIX }} - - run: | - cat tkg/test/config/azure.yaml - - - name: Run TKG integration tests - if: ${{ env.azure_client_id != '' }} - run: | - if [[ ! -z "${{ needs.build-and-publish-packages.outputs.bompath }}" ]]; then - export TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH=${{ needs.build-and-publish-packages.outputs.bompath }} - fi - make configure-bom - make generate-embedproviders - pushd tkg - E2E_CONFIG=$PWD/test/config/azure.yaml ../hack/tools/bin/ginkgo -nodes=3 -v -trace -tags embedproviders test/tkgctl/azure_cc - popd - env: - tkg_config_variables.AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID_SAIB }} - tkg_config_variables.AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID_SAIB }} - tkg_config_variables.AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID_SAIB }} - tkg_config_variables.AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET_SAIB }} - _MANAGEMENT_PACKAGE_REPO_IMAGE: ${{ needs.build-and-publish-packages.outputs.registry }}/tanzu_framework/github-actions/${{ needs.build-and-publish-packages.outputs.regdir }}/management:v0.21.0 - _MANAGEMENT_PACKAGE_VERSION: "0.21.0" - TKG_CUSTOM_IMAGE_REPOSITORY: "projects-stg.registry.vmware.com/tkg" - - - uses: Azure/login@v1.1 - if: ${{ always() && env.azure_client_id != '' }} - with: - creds: '{"clientId":"${{ secrets.AZURE_CLIENT_ID_SAIB }}","clientSecret":"${{ secrets.AZURE_CLIENT_SECRET_SAIB }}","subscriptionId":"${{ secrets.AZURE_SUBSCRIPTION_ID_SAIB }}","tenantId":"${{ secrets.AZURE_TENANT_ID_SAIB }}"}' - - - name: Cleanup Azure resources - if: ${{ always() }} - run: | - for rgname in `az group list --query "[? contains(name,'${cluster_prefix}')][].{name:name}" -o tsv`; do - echo Deleting ${rgname} - az group delete -n ${rgname} --yes --no-wait - done - env: - cluster_prefix: ${{ env.CLUSTER_PREFIX }} diff --git a/.github/workflows/unittests.yaml b/.github/workflows/unittests.yaml deleted file mode 100644 index 98d1ccf5e3..0000000000 --- a/.github/workflows/unittests.yaml +++ /dev/null @@ -1,80 +0,0 @@ -name: Unittests - -on: - pull_request: - branches: [ main, release-* ] - -jobs: - unittests: - name: unittests - runs-on: ubuntu-latest - steps: - - name: Free some disk space on runner - run: | - echo "free space before cleanup:" - df -h - sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/share/boost /usr/lib/jvm /usr/lib/firefox /opt/microsoft/powershell /opt/hostedtoolcache - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Get dependencies - run: go mod download - - - name: Extract PR Number - uses: Dovyski/payload-info-action@master - id: get_pr_num - with: - # when event is a pull request, obtaining the PR number is obvious - filter_pull_request: '.number' - # when event is a push (merge of PR), since we require linear history, - # we are not even generating a merge commit that can help identify the - # PR number, so don't even try. Instead we just hard-code to a dummy - # value. - filter_push: 1009 - - - name: Find Comment - uses: peter-evans/find-comment@v1 - id: findcomment - with: - issue-number: ${{ steps.get_pr_num.outputs.value }} - body-includes: //usebom - direction: last - - - name: Extract Alternate BOM - shell: bash - run: | - export BOMCOMMENT=$(echo -e "${{ steps.findcomment.outputs.comment-body }}" | tr -d "[:space:]") - echo "##[set-output name=bompath;]$(echo "$BOMCOMMENT" | awk -F : '{print $2}')" - id: extract_bom - - - name: Run make test - run: | - if [[ ! -z "${{ steps.extract_bom.outputs.bompath }}" ]]; then - export TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH=${{ steps.extract_bom.outputs.bompath }} - fi - make configure-bom - make test ENVS=linux-amd64 - - - name: Upload coverage reports to Codecov with GitHub Action - uses: codecov/codecov-action@v3 - with: - files: ./coverage1.txt,./coverage2.txt,./coverage3.txt,./addons/coverage.txt,./pinniped-components/post-deploy/coverage.txt,./pinniped-components/tanzu-auth-controller-manager/coverage.txt,./cli/core/coverage.txt,./cli/runtime/coverage.txt,./tkg/coverage.txt,./featuregates/client/cover.out,./featuregates/controller/cover.out,./capabilities/client/cover.out,./capabilities/controller/cover.out,./cmd/cli/plugin-admin/builder/cover.out,./cmd/cli/plugin-admin/codegen/cover.out,./cmd/cli/plugin-admin/test/cover.out,./apis/config/cover.out,./apis/run/cover.out,./packageclients/cover.out,./apis/addonconfigs/cover.out,./apis/cli/cover.out,./apis/core/cover.out,./cmd/cli/plugin/feature/cover.out,./cmd/cli/plugin/login/cover.out,./cmd/cli/plugin/package/cover.out,./cmd/cli/plugin/pinniped-auth/cover.out,./cmd/cli/plugin/secret/cover.out,./cmd/cli/plugin/cluster/coverage.txt,./cmd/cli/plugin/managementcluster/coverage.txt,./cmd/cli/plugin/isolated-cluster/coverage.txt diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml deleted file mode 100644 index 0ca8907b40..0000000000 --- a/.github/workflows/verify.yaml +++ /dev/null @@ -1,44 +0,0 @@ -name: Verify - -on: - pull_request: - branches: [ main, release-* ] - -jobs: - verify: - name: verify - runs-on: ubuntu-latest - steps: - - name: Free some disk space on runner - run: | - echo "free space before cleanup:" - df -h - sudo rm -rf /usr/share/dotnet /opt/ghc /usr/local/share/boost /usr/lib/jvm /usr/lib/firefox /opt/microsoft/powershell /opt/hostedtoolcache - echo "free space after cleanup:" - df -h - - - name: Set up Go 1.x - uses: actions/setup-go@v3 - with: - go-version: 1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v1 - - - name: go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - - name: Get dependencies - run: go mod download - - - name: Run make verify - run: | - make verify diff --git a/.gitignore b/.gitignore index 637cedd476..0bba48dbed 100644 --- a/.gitignore +++ b/.gitignore @@ -18,20 +18,6 @@ *.bak bin artifacts -artifacts-admin -test/cli/mock/artifacts* -tanzu -addons/artifacts -addons/controllers/testdata/internal-crds -pinniped/ -!addons/pinniped/ -!pinniped-components/ - -# providers/clustergen-related files -provider-bundle -providers.zip -providers.tar.gz -hack/providers-sync-tools/**/build # Build artifacts that may not be cleaned up properly .rendered-output/ diff --git a/.golangci.yaml b/.golangci.yaml index 647abb21a7..176e36e5f5 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -113,12 +113,6 @@ issues: - '(Expect directory permissions to be 0750 or less|Expect (WriteFile|file) permissions to be 0600 or less)' exclude-rules: - - path: pinniped/internal/mocks - linters: - - goimports - - path: apis/run/v1alpha1 - linters: - - goimports - path: _test\.go linters: - dupl @@ -130,11 +124,6 @@ issues: - gocritic text: "unnecessaryDefer:" - - path: pkg/v1/tkr/controllers/source/suite_test.go - linters: - - nolintlint - text: "is unused for linter staticcheck" - - linters: - revive text: "that stutters" diff --git a/CODEOWNERS b/CODEOWNERS index 411b61a019..e18b554bfa 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,41 +1 @@ -* @vmware-tanzu/tanzu-framework-reviewers -/addons @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-addons-owners -/addons/pinniped @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-iam-owners -/pinniped-components @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-iam-owners -/cmd/cli @vmware-tanzu/tanzu-framework-reviewers -/cmd/cli/plugin/package @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-addons-owners -/cmd/cli/plugin/package/kctrl @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/carvel-kctrl -/cmd/cli/plugin/pinniped-auth @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-iam-owners -/cmd/cli/plugin/secret @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-addons-owners -/cmd/cli/plugin/tkr @vmware-tanzu/tanzu-framework-reviewers @prkalle -/docs @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-iam-owners @vmware-tanzu/tkg-addons-owners @vmware-tanzu/tanzu-framework-lcm-reviewers @vmware-tanzu/tanzu-framework-docs -/tkg/auth @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-iam-owners -/pkg/v1/cli @vmware-tanzu/tanzu-framework-reviewers -/providers @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-lcm-reviewers @vmware-tanzu/tkg-infra-x @vmware-tanzu/tkg-iam-owners -/providers/ytt/02_addons/auth @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-iam-owners -/providers/ytt/02_addons/avi @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/ako-owners -/providers/ytt/03_customizations/02_avi @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/ako-owners -/tkg @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-lcm-reviewers -/packageclients/pkg/kappclient @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-addons-owners -/tkg/tkgconfigpaths @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-release-team -/packageclients/pkg/packageclient @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-addons-owners -/packageclients/pkg/packagedatamodel @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-addons-owners -/tkg/web @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-ui-reviewers -/pkg/v1/tkr @vmware-tanzu/tanzu-framework-reviewers @prkalle -# API Machinery related files -/apis/config @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -/apis/run @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -/apis/core @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -/featuregates @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -/capabilities @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -/cmd/cli/plugin/feature @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -/cmd/cli/plugin-admin/codegen @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -/pkg/v1/codegen @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -/providers/ytt/02_addons/management-packages @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -/hack/packages @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -/docs/api-machinery @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -# Package owners. Add individual packages here if they need to be owned by a specific team. -/packages/featuregates @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners -/packages/tanzu-auth @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-iam-owners -/packages/addons-manager @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tkg-addons-owners -/packages/capabilities @vmware-tanzu/tanzu-framework-reviewers @vmware-tanzu/tanzu-framework-api-machinery-owners +* @vmware-tanzu/tanzu-runtime-core-maintainers \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..647f18b1a4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,78 @@ +# Copyright 2023 VMware, Inc. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +# This Dockerfile is currently consumed by build tooling https://github.com/vmware-tanzu/build-tooling-for-integrations +# to build components in tanzu-framework, check out build-tooling.mk to understand how this is being consumed. + +ARG BUILDER_BASE_IMAGE=golang:1.18 + +FROM --platform=${BUILDPLATFORM} $BUILDER_BASE_IMAGE as base +ARG COMPONENT +ARG GOPROXY_ARG +ENV GOPROXY=${GOPROXY_ARG} +WORKDIR /workspace +RUN --mount=target=. \ + --mount=type=cache,target=/go/pkg/mod \ + cd $COMPONENT && go mod download + +# Linting +FROM harbor-repo.vmware.com/dockerhub-proxy-cache/golangci/golangci-lint:v1.50 AS lint-base +FROM base AS lint +RUN --mount=target=. \ + --mount=from=lint-base,src=/usr/bin/golangci-lint,target=/usr/bin/golangci-lint \ + --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + --mount=type=cache,target=/root/.cache/golangci-lint \ + cd $COMPONENT && golangci-lint run --config /workspace/.golangci.yaml --timeout 10m0s ./... + +FROM base AS fmt +RUN --mount=target=. \ + --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + cd $COMPONENT && go fmt ./... + +FROM base AS vet +RUN --mount=target=. \ + --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + cd $COMPONENT && go vet ./... + +# Testing +FROM base AS test +RUN --mount=target=. \ + --mount=type=cache,target=/go/pkg/mod \ + --mount=type=cache,target=/root/.cache/go-build \ + cd $COMPONENT && mkdir /out && go test -v -coverprofile=/out/cover.out ./... + +# Build the manager binary +FROM base as builder +ARG TARGETOS +ARG TARGETARCH +ARG LD_FLAGS +ENV LD_FLAGS="$LD_FLAGS "'-extldflags "-static"' +RUN --mount=target=. \ + --mount=type=cache,target=/go/pkg/mod \ + cd $COMPONENT && CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} GO111MODULE=on go build -o /out/manager ./main.go + +# Use distroless as minimal base image to package the manager binary +# Refer to https://github.com/GoogleContainerTools/distroless for more details +FROM gcr.io/distroless/static:nonroot as image +WORKDIR / +COPY --from=builder /out/manager . +USER nonroot:nonroot + +ENTRYPOINT ["/manager"] + +FROM scratch AS unit-test-coverage +COPY --from=test /out/cover.out /cover.out + +FROM scratch AS bin-unix +COPY --from=builder /out/manager / + +FROM bin-unix AS bin-linux +FROM bin-unix AS bin-darwin + +FROM scratch AS bin-windows +COPY --from=builder /out/manager /manager.exe + +FROM bin-${TARGETOS} as bin diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 406a64d2cb..fe6a45ad8f 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -2,34 +2,19 @@ ## Maintainers -| Maintainer | GitHub ID | Affiliation | -|------------|-----------|-------------| -|Vui Lam | [vuil](https://github.com/vuil) | [VMware](https://www.github.com/vmware/) | -|Vijay Katam | [vijaykatam](https://github.com/vijaykatam ) | [VMware](https://www.github.com/vmware/) | -|Jeff Moroski | [jmoroski](https://github.com/jmoroski ) | [VMware](https://www.github.com/vmware/) | +| Maintainer | GitHub ID | Affiliation | +|--------------|------------------------------------------|------------------------------------------| +| Jeff Moroski | [jmoroski](https://github.com/jmoroski ) | [VMware](https://www.github.com/vmware/) | ## Framework Core Contributors and Stakeholders -| Feature Area | Lead | -|--------------|------| -| Tech Lead | Vui Lam [vuil](https://github.com/vuil) | -| Tech Lead | Vijay Katam [vijaykatam](https://github.com/vijaykatam) | -| Tech Lead | Jeff Moroski [jmoroski](https://github.com/jmoroski) | -| Tech Lead | Justin Miclette [miclettej](https://github.com/miclettej) | -| Eng Management | Shyaam Nagarajan [shyaamsn](https://github.com/shyaamsn) | -| Eng Management | Maggie Cai [Maggiecai-vmw](https://github.com/Maggiecai-vmw) | -| Eng Management | Maharshi Bhatt [bhattm-vmware](https://github.com/bhattm-vmware) | -| Product Management | Natalie Fisher [nfisher-tkg](https://github.com/nfisher-tkg) | -| Engineering | Danniel Guo [danniel1205](https://github.com/danniel1205) | -| Engineering | Anuj Chaudhari [Anuj2512](https://github.com/Anuj2512) | -| Engineering | Marjan Alavi [maralavi](https://github.com/maralavi) | -| Engineering | Shivaani Gupta [shivaani0505](https://github.com/shivaani0505) | -| Engineering | Guanpeng Gao [ggpaue](https://github.com/ggpaue) | -| Engineering | Lucheng Bao [blc1996](https://github.com/blc1996) | -| Engineering | Rajath Agasthya [rajathagasthya](https://github.com/rajathagasthya) | -| Engineering | Harish Yayi [yharish991](https://github.com/yharish991) | - -## Emeritus - -* Ian Coffey [iancoffey](https://github.com/iancoffey) -* Jesse Hu [jessehu](https://github.com/jessehu) +| Feature Area | Lead | +|------------------------|-------------------------------------------------------------------------------| +| Tech Lead | Jeff Moroski [jmoroski](https://github.com/jmoroski) | +| Engineering Management | Daniel Guo [danniel1205](https://github.com/danniel1205) | +| Engineering | Rajath Agasthya [rajathagasthya](https://github.com/rajathagasthya) | +| Engineering | Harish Yayi [yharish991](https://github.com/yharish991) | +| Engineering | Frankie Gold [codegold79](https://github.com/codegold79) | +| Engineering | Sathyanarayanan Saravanamuthu [sathyanarays](https://github.com/sathyanarays) | +| Engineering | Avi Sharma [avi-08](https://github.com/avi-08) | +| Engineering | Vandana Pathak [Vandy-P](https://github.com/Vandy-P) | diff --git a/Makefile b/Makefile index e728f3dace..743d6d7d44 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,12 @@ # Copyright 2021 VMware, Inc. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 -include ./common.mk +include ./common.mk ./build.mk + +.DEFAULT_GOAL:=help SHELL := /usr/bin/env bash -# Image URL to use all building/pushing image targets -IMG ?= controller:latest # Produce CRDs that work back to Kubernetes 1.11 (no version conversion) CRD_OPTIONS ?= "crd" @@ -21,564 +21,69 @@ endif TOOLS_DIR := $(abspath hack/tools) TOOLS_BIN_DIR := $(TOOLS_DIR)/bin BIN_DIR := bin -ADDONS_DIR := addons -YTT_TESTS_DIR := providers/tests -PACKAGES_SCRIPTS_DIR := $(abspath hack/packages/scripts) -UI_DIR := tkg/web -GO_MODULES=$(shell find . -path "*/go.mod" | grep -v "^./pinniped/" | xargs -I _ dirname _) -PROVIDER_BUNDLE_ZIP = providers/client/manifest/providers.zip -TKG_PROVIDER_BUNDLE_ZIP = tkg/tkgctl/client/manifest/providers.zip - -PINNIPED_GIT_REPOSITORY = https://github.com/vmware-tanzu/pinniped.git -PINNIPED_VERSIONS = v0.12.1 +GO_MODULES=$(shell find . -path "*/go.mod" | xargs -I _ dirname _) ifndef IS_OFFICIAL_BUILD IS_OFFICIAL_BUILD = "" endif -ifndef TANZU_PLUGIN_UNSTABLE_VERSIONS # Config used to install cli plugins without discovery -TANZU_PLUGIN_UNSTABLE_VERSIONS = "experimental" -endif - -# NPM registry to use for downloading node modules for UI build -CUSTOM_NPM_REGISTRY ?= $(shell git config tkg.npmregistry) - -# TKG Compatibility Image repo and path related configuration -# These set the defaults after a fresh install in ~/.config/tanzu/config.yaml -# Users can change these values by running commands like: -# tanzu config set cli.edition tce -ifndef TKG_DEFAULT_IMAGE_REPOSITORY -TKG_DEFAULT_IMAGE_REPOSITORY = "projects-stg.registry.vmware.com/tkg" -endif -ifndef TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH -# TODO change it to "tkg-compatibility" once the image is pushed to registry -TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH = "framework-zshippable/tkg-compatibility" -endif - -ifndef ENABLE_CONTEXT_AWARE_PLUGIN_DISCOVERY # Current Default Plugin Discovery more info https://github.com/vmware-tanzu/tanzu-framework/blob/main/docs/design/context-aware-plugin-discovery-design.md -ENABLE_CONTEXT_AWARE_PLUGIN_DISCOVERY = "true" -endif -ifndef DEFAULT_STANDALONE_DISCOVERY_IMAGE_PATH # Image path Config used for Plugins Discovery i.e. Independent of the CLI context and are discovered using standalone discovery source -DEFAULT_STANDALONE_DISCOVERY_IMAGE_PATH = "packages/standalone-plugins" -endif -ifndef DEFAULT_STANDALONE_DISCOVERY_IMAGE_TAG # Build version used for Plugins Discovery i.e. Independent of the CLI context and are discovered using standalone discovery source -DEFAULT_STANDALONE_DISCOVERY_IMAGE_TAG = "${BUILD_VERSION}" -endif -ifndef DEFAULT_STANDALONE_DISCOVERY_TYPE -DEFAULT_STANDALONE_DISCOVERY_TYPE = "local" -endif -ifndef DEFAULT_STANDALONE_DISCOVERY_LOCAL_PATH # Local path config used for Plugins Discovery i.e. Independent of the CLI context and are discovered using standalone discovery source -DEFAULT_STANDALONE_DISCOVERY_LOCAL_PATH = "standalone" -endif -ifndef TANZU_PLUGINS_ALLOWED_IMAGE_REPOSITORIES -TANZU_PLUGINS_ALLOWED_IMAGE_REPOSITORIES = "projects-stg.registry.vmware.com/tkg" -endif - # Package tooling related variables PACKAGE_VERSION ?= ${BUILD_VERSION} REPO_BUNDLE_VERSION ?= ${BUILD_VERSION} -PLUGIN_PATH ?= ./cmd/cli/plugin - -DOCKER_DIR := /app -SWAGGER=docker run --rm -v ${PWD}:${DOCKER_DIR}:$(DOCKER_VOL_OPTS) quay.io/goswagger/swagger:v0.21.0 # OCI registry for hosting tanzu framework components (containers and packages) OCI_REGISTRY ?= projects.registry.vmware.com/tanzu_framework - -.DEFAULT_GOAL:=help - -# TODO: Change package path to cli/runtime when this var is moved there. -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/pkg/v1/buildinfo.IsOfficialBuild=$(IS_OFFICIAL_BUILD)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/tkg/buildinfo.IsOfficialBuild=$(IS_OFFICIAL_BUILD)' - -ifneq ($(strip $(TANZU_CORE_BUCKET)),) # Name of the core plugin repository bucket to use. Ex:- tanzu-cli-framework -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.CoreBucketName=$(TANZU_CORE_BUCKET)' -endif - -ifneq ($(strip $(TKG_DEFAULT_IMAGE_REPOSITORY)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryRepository=$(TKG_DEFAULT_IMAGE_REPOSITORY)' -endif -ifneq ($(strip $(TANZU_PLUGINS_ALLOWED_IMAGE_REPOSITORIES)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultAllowedPluginRepositories=$(TANZU_PLUGINS_ALLOWED_IMAGE_REPOSITORIES)' -endif - -ifneq ($(strip $(ENABLE_CONTEXT_AWARE_PLUGIN_DISCOVERY)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.IsContextAwareDiscoveryEnabled=$(ENABLE_CONTEXT_AWARE_PLUGIN_DISCOVERY)' -endif -ifneq ($(strip $(DEFAULT_STANDALONE_DISCOVERY_IMAGE_PATH)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryImagePath=$(DEFAULT_STANDALONE_DISCOVERY_IMAGE_PATH)' -endif -ifneq ($(strip $(DEFAULT_STANDALONE_DISCOVERY_IMAGE_TAG)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryImageTag=$(DEFAULT_STANDALONE_DISCOVERY_IMAGE_TAG)' -endif -ifneq ($(strip $(DEFAULT_STANDALONE_DISCOVERY_LOCAL_PATH)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryLocalPath=$(DEFAULT_STANDALONE_DISCOVERY_LOCAL_PATH)' -endif - - -BUILD_TAGS ?= - -ARTIFACTS_DIR ?= $(ROOT_DIR)/artifacts -ARTIFACTS_ADMIN_DIR ?= $(ROOT_DIR)/artifacts-admin - -XDG_CACHE_HOME := ${HOME}/.cache -XDG_CONFIG_HOME := ${HOME}/.config -# Local path to publish the tanzu CLI plugins -TANZU_PLUGIN_PUBLISH_PATH ?= $(XDG_CONFIG_HOME)/tanzu-plugins -export XDG_DATA_HOME -export XDG_CACHE_HOME -export XDG_CONFIG_HOME export OCI_REGISTRY +## +## Install targets +## -all: manager ui-build build-cli - -manager: generate ## Build manager binary - $(GO) build -ldflags "$(LD_FLAGS)" -o bin/manager main.go - -run: generate manifests ## Run against the configured Kubernetes cluster in ~/.kube/config - $(GO) run -ldflags "$(LD_FLAGS)" ./main.go - -install: manifests tools ## Install CRDs into a cluster - kustomize build config/crd | kubectl apply -f - +.PHONY: install +# Install CRDs into a cluster +install: manifests tools + kubectl apply -f apis/core/config/crd/bases -uninstall: manifests ## Uninstall CRDs from a cluster - kustomize build config/crd | kubectl delete -f - +.PHONY: uninstall +# Uninstall CRDs from a cluster +uninstall: manifests + kubectl delete -f apis/core/config/crd/bases -deploy: manifests tools ## Deploy controller in the configured Kubernetes cluster in ~/.kube/config - cd config/manager && kustomize edit set image controller=${IMG} - kustomize build config/default | kubectl apply -f - - -manifests: ## Generate manifests e.g. CRD, RBAC etc. - $(MAKE) generate-manifests - $(MAKE) -C apis/addonconfigs generate-manifests - $(MAKE) -C apis/cli generate-manifests - $(MAKE) -C apis/config generate-manifests - $(MAKE) -C apis/core generate-manifests - $(MAKE) -C apis/run generate-manifests - $(MAKE) -C cli/runtime generate-manifests - -generate-go: $(COUNTERFEITER) ## Generate code via go generate. - @for i in $(GO_MODULES); do \ - echo "-- Running go generate ./... $$i --"; \ - pushd $${i}; \ - PATH=$(abspath hack/tools/bin):"$(PATH)" go generate ./...; \ - $(MAKE) fmt; \ - popd; \ - done - -generate: tools ## Generate code (legacy) - $(MAKE) generate-controller-code - @for i in $(GO_MODULES); do \ - echo "-- Running $(MAKE) -C $$i generate-controller-code --"; \ - pushd $${i}; \ - $(MAKE) -C $${i} generate-controller-code; \ - popd; \ - done - -## -------------------------------------- -##@ Version -## -------------------------------------- +## +## Version +## .PHONY: version -version: ## Show version +# Show generated build version +version: @echo $(BUILD_VERSION) -## -------------------------------------- -##@ Build prerequisites -## -------------------------------------- - -.PHONY: ensure-pinniped-repo -ensure-pinniped-repo: ## Clone Pinniped - @rm -rf pinniped - @mkdir -p pinniped - @GIT_TERMINAL_PROMPT=0 git clone -q ${PINNIPED_GIT_REPOSITORY} pinniped > ${NUL} 2>&1 - -.PHONY: prep-build-cli -prep-build-cli: ensure-pinniped-repo ## Prepare for building the CLI - $(GO) mod download - $(GO) mod tidy - EMBED_PROVIDERS_TAG=embedproviders -ifeq "${BUILD_TAGS}" "${EMBED_PROVIDERS_TAG}" - make -C providers -f Makefile generate-provider-bundle-zip - cp -f ${PROVIDER_BUNDLE_ZIP} $(TKG_PROVIDER_BUNDLE_ZIP) -endif - -.PHONY: configure-buildtags-% -configure-buildtags-%: ## Configure build tags -ifeq ($(strip $(BUILD_TAGS)),) - $(eval TAGS = $(word 1,$(subst -, ,$*))) - $(eval BUILD_TAGS=$(TAGS)) -endif - @echo "BUILD_TAGS set to '$(BUILD_TAGS)'" - -## -------------------------------------- -##@ Build binaries and plugins -## -------------------------------------- - -# Dynamically generate the OS-ARCH targets to allow for parallel execution -CLI_JOBS_OCI_DISCOVERY := $(addprefix build-cli-oci-,${ENVS}) -CLI_ADMIN_JOBS_OCI_DISCOVERY := $(addprefix build-plugin-admin-oci-,${ENVS}) - -CLI_JOBS_LOCAL_DISCOVERY := $(addprefix build-cli-local-,${ENVS}) -CLI_ADMIN_JOBS_LOCAL_DISCOVERY := $(addprefix build-plugin-admin-local-,${ENVS}) - -LOCAL_PUBLISH_PLUGINS_JOBS := $(addprefix publish-plugins-local-,$(ENVS)) - - -RELEASE_JOBS := $(addprefix release-,${ENVS}) - -BUILDER := $(ROOT_DIR)/bin/builder -BUILDER_SRC := $(shell find cmd/cli/plugin-admin/builder -type f -print) -$(BUILDER): $(BUILDER_SRC) - cd cmd/cli/plugin-admin/builder && $(GO) build -o $(BUILDER) . - -.PHONY: prepare-builder -prepare-builder: $(BUILDER) ## Build Tanzu CLI Plugin Admin builder - -.PHONY: build-cli -build-cli: build-cli-with-local-discovery ## Build Tanzu CLI - -.PHONY: build-cli-with-oci-discovery -build-cli-with-oci-discovery: ${CLI_ADMIN_JOBS_OCI_DISCOVERY} ${CLI_JOBS_OCI_DISCOVERY} publish-plugins-all-oci publish-admin-plugins-all-oci ## Build Tanzu CLI with OCI standalone discovery - @rm -rf pinniped - -.PHONY: build-cli-with-local-discovery -build-cli-with-local-discovery: ${CLI_ADMIN_JOBS_LOCAL_DISCOVERY} ${CLI_JOBS_LOCAL_DISCOVERY} publish-plugins-all-local publish-admin-plugins-all-local ## Build Tanzu CLI with Local standalone discovery - @rm -rf pinniped - -.PHONY: build-plugin-admin-with-oci-discovery -build-plugin-admin-with-oci-discovery: ${CLI_ADMIN_JOBS_OCI_DISCOVERY} publish-admin-plugins-all-oci ## Build Tanzu CLI admin plugins with OCI standalone discovery - -.PHONY: build-plugin-admin-with-local-discovery -build-plugin-admin-with-local-discovery: ${CLI_ADMIN_JOBS_LOCAL_DISCOVERY} publish-admin-plugins-all-local ## Build Tanzu CLI admin plugins with Local standalone discovery - -.PHONY: build-plugin-local -build-plugin-local: prepare-builder ## Build given CLI Plugin locally, needs PLUGIN_NAME - @if [ "${PLUGIN_NAME}" = "" ] || [ ! -d ${PLUGIN_PATH}/${PLUGIN_NAME} ]; then \ - echo "The PLUGIN_NAME: '${PLUGIN_NAME}' is not valid or not exists or empty, please provide valid PLUGIN_NAME." ; \ - else \ - $(BUILDER) cli compile --match "$(PLUGIN_NAME)" --version $(BUILD_VERSION) --ldflags "$(LD_FLAGS)" --path $(PLUGIN_PATH) --target local --artifacts artifacts/${GOHOSTOS}/${GOHOSTARCH}/cli ; \ - fi - -.PHONY: install-plugin-local -install-plugin-local: build-plugin-local ## Build and Install given CLI Plugin locally, needs PLUGIN_NAME - @if [ "${PLUGIN_NAME}" != "" ] && [ -d ${PLUGIN_PATH}/${PLUGIN_NAME} ]; then \ - tanzu plugin install ${PLUGIN_NAME} --local $(ARTIFACTS_DIR)/$(GOHOSTOS)/$(GOHOSTARCH)/cli ; \ - fi - -.PHONY: build-plugin-admin-% -build-plugin-admin-%: prepare-builder - $(eval ARCH = $(word 3,$(subst -, ,$*))) - $(eval OS = $(word 2,$(subst -, ,$*))) - $(eval DISCOVERY_TYPE = $(word 1,$(subst -, ,$*))) - - @if [ "$(filter $(OS)-$(ARCH),$(ENVS))" = "" ]; then\ - printf "\n\n======================================\n";\ - printf "! $(OS)-$(ARCH) is not an officially supported platform!\n";\ - printf "! Make sure to perform a full build to make sure expected plugins are available!\n";\ - printf "======================================\n\n";\ - fi - - @echo build version: $(BUILD_VERSION) - $(BUILDER) cli compile --version $(BUILD_VERSION) --ldflags "$(LD_FLAGS) -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryType=${DISCOVERY_TYPE}'" --tags "${BUILD_TAGS}" --path ./cmd/cli/plugin-admin --artifacts artifacts-admin/${OS}/${ARCH}/cli --target ${OS}_${ARCH} - -.PHONY: build-cli-% -build-cli-%: prepare-builder prep-build-cli - $(eval ARCH = $(word 3,$(subst -, ,$*))) - $(eval OS = $(word 2,$(subst -, ,$*))) - $(eval DISCOVERY_TYPE = $(word 1,$(subst -, ,$*))) +## +## Testing, verification, formating and cleanup +## - @if [ "$(filter $(OS)-$(ARCH),$(ENVS))" = "" ]; then\ - printf "\n\n======================================\n";\ - printf "! $(OS)-$(ARCH) is not an officially supported platform!\n";\ - printf "! Make sure to perform a full build to make sure expected plugins are available!\n";\ - printf "======================================\n\n";\ - fi - - ./hack/embed-pinniped-binary.sh go ${OS} ${ARCH} ${PINNIPED_VERSIONS} - $(BUILDER) cli compile --version $(BUILD_VERSION) --ldflags "$(LD_FLAGS) -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryType=${DISCOVERY_TYPE}'" --tags "${BUILD_TAGS}" --path "cmd/cli/plugin" --artifacts artifacts/${OS}/${ARCH}/cli --target ${OS}_${ARCH} - $(MAKE) build-tanzu-core-cli-$(DISCOVERY_TYPE)-$(OS)-$(ARCH) -C cli/core - -## -------------------------------------- -##@ Build locally -## -------------------------------------- - -# Building CLI and plugins locally with `make build-cli-local` is different in 2 ways compared to official build -# 1. It uses `local` file-system based standalone-discovery for plugin discovery and installation -# whereas official build uses `OCI` based standalone-discovery for plugin discovery and installation -# 2. On official build, provider templates are published as an OCI image and consumed from BoM file -# but with `build-cli-local`, it ensures that the cluster and management-cluster plugins are build -# with embedded provider templates. This is used only for dev build and not for production builds. -# When using embedded providers, `~/.config/tanzu/tkg/providers` directory always gets overwritten with the -# embdedded providers. To skip the provider updates, specify `SUPPRESS_PROVIDERS_UPDATE` environment variable. -# Note: If any local builds want to skip embedding providers and want utilize providers from TKG BoM file, -# To skip provider embedding, pass `BUILD_TAGS=skipembedproviders` to make target (`make BUILD_TAGS=skipembedproviders build-cli-local) -.PHONY: build-cli-local -build-cli-local: prepare-builder configure-buildtags-embedproviders build-cli-local-${GOHOSTOS}-${GOHOSTARCH} publish-plugins-local ## Build Tanzu CLI with local standalone discovery. cluster and management-cluster plugins are built with embedded providers. - $(BUILDER) cli compile --version $(BUILD_VERSION) --ldflags "$(LD_FLAGS) -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryType=local'" --tags "${BUILD_TAGS}" --path ./cmd/cli/plugin-admin --artifacts artifacts-admin/${GOHOSTOS}/${GOHOSTARCH}/cli --target local - $(MAKE) publish-admin-plugins-local -.PHONY: build-install-cli-local -build-install-cli-local: clean-catalog-cache clean-cli-plugins build-cli-local install-cli-plugins install-cli ## Local build and install the CLI plugins with local standalone discovery - -## -------------------------------------- -##@ Build and publish CLI plugin discovery resource files and binaries -## -------------------------------------- - -.PHONY: publish-plugins-all-local -publish-plugins-all-local: prepare-builder ## Publish CLI plugins locally for all supported os-arch - $(BUILDER) publish --type local --plugins "$(PLUGINS)" --version $(BUILD_VERSION) --os-arch "${ENVS}" --local-output-discovery-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/discovery/standalone" --local-output-distribution-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/distribution" --input-artifact-dir $(ARTIFACTS_DIR) - -.PHONY: publish-admin-plugins-all-local -publish-admin-plugins-all-local: prepare-builder ## Publish CLI admin plugins locally for all supported os-arch - $(BUILDER) publish --type local --plugins "$(ADMIN_PLUGINS)" --version $(BUILD_VERSION) --os-arch "${ENVS}" --local-output-discovery-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/discovery/admin" --local-output-distribution-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/distribution" --input-artifact-dir $(ARTIFACTS_ADMIN_DIR) - -.PHONY: publish-plugins-local -publish-plugins-local: prepare-builder ## Publish CLI plugins locally for current host os-arch only - $(BUILDER) publish --type local --plugins "$(PLUGINS)" --version $(BUILD_VERSION) --os-arch "${GOHOSTOS}-${GOHOSTARCH}" --local-output-discovery-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/discovery/standalone" --local-output-distribution-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/distribution" --input-artifact-dir $(ARTIFACTS_DIR) - -.PHONY: publish-plugins-local-% -publish-plugins-local-%: prepare-builder ## Publish CLI plugins to local directory that can be shared. Configure TANZU_PLUGIN_PUBLISH_PATH, PLUGINS, ARTIFACTS_DIR, DISCOVERY_NAME variables - $(eval ARCH = $(word 2,$(subst -, ,$*))) - $(eval OS = $(word 1,$(subst -, ,$*))) - $(BUILDER) publish --type local --plugins "$(PLUGINS)" --version $(BUILD_VERSION) --os-arch "${OS}-${ARCH}" --local-output-discovery-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/${OS}-${ARCH}-$(DISCOVERY_NAME)/discovery/$(DISCOVERY_NAME)" --local-output-distribution-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/${OS}-${ARCH}-$(DISCOVERY_NAME)/distribution" --input-artifact-dir $(ARTIFACTS_DIR) - -.PHONY: publish-plugins-local-generic -publish-plugins-local-generic: ${LOCAL_PUBLISH_PLUGINS_JOBS} ## Publish CLI plugins to local directory that can be shared. Configure TANZU_PLUGIN_PUBLISH_PATH, PLUGINS, ARTIFACTS_DIR, DISCOVERY_NAME variables - -.PHONY: publish-admin-plugins-local -publish-admin-plugins-local: prepare-builder ## Publish CLI admin plugins locally for current host os-arch only - $(BUILDER) publish --type local --plugins "$(ADMIN_PLUGINS)" --version $(BUILD_VERSION) --os-arch "${GOHOSTOS}-${GOHOSTARCH}" --local-output-discovery-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/discovery/admin" --local-output-distribution-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/distribution" --input-artifact-dir $(ARTIFACTS_ADMIN_DIR) - - -.PHONY: publish-plugins-all-oci -publish-plugins-all-oci: prepare-builder ## Publish CLI plugins as OCI image for all supported os-arch - $(BUILDER) publish --type oci --plugins "$(STANDALONE_PLUGINS)" --version $(BUILD_VERSION) --os-arch "${ENVS}" --oci-discovery-image ${OCI_REGISTRY}/tanzu-plugins/discovery/standalone:${BUILD_VERSION} --oci-distribution-image-repository ${OCI_REGISTRY}/tanzu-plugins/distribution/ --input-artifact-dir $(ROOT_DIR)/$(ARTIFACTS_DIR) - $(BUILDER) publish --type oci --plugins "$(CONTEXTAWARE_PLUGINS)" --version $(BUILD_VERSION) --os-arch "${ENVS}" --oci-discovery-image ${OCI_REGISTRY}/tanzu-plugins/discovery/context:${BUILD_VERSION} --oci-distribution-image-repository ${OCI_REGISTRY}/tanzu-plugins/distribution/ --input-artifact-dir $(ROOT_DIR)/$(ARTIFACTS_DIR) - -.PHONY: publish-admin-plugins-all-oci -publish-admin-plugins-all-oci: prepare-builder ## Publish CLI admin plugins as OCI image for all supported os-arch - $(BUILDER) publish --type oci --plugins "$(ADMIN_PLUGINS)" --version $(BUILD_VERSION) --os-arch "${ENVS}" --oci-discovery-image ${OCI_REGISTRY}/tanzu-plugins/discovery/admin:${BUILD_VERSION} --oci-distribution-image-repository ${OCI_REGISTRY}/tanzu-plugins/distribution/ --input-artifact-dir $(ROOT_DIR)/$(ARTIFACTS_ADMIN_DIR) - -.PHONY: publish-plugins-oci -publish-plugins-oci: prepare-builder ## Publish CLI plugins as OCI image for current host os-arch only - $(BUILDER) publish --type oci --plugins "$(STANDALONE_PLUGINS)" --version $(BUILD_VERSION) --os-arch "${GOHOSTOS}-${GOHOSTARCH}" --oci-discovery-image ${OCI_REGISTRY}/tanzu-plugins/discovery/standalone:${BUILD_VERSION} --oci-distribution-image-repository ${OCI_REGISTRY}/tanzu-plugins/distribution/ --input-artifact-dir $(ROOT_DIR)/$(ARTIFACTS_DIR) - $(BUILDER) publish --type oci --plugins "$(CONTEXTAWARE_PLUGINS)" --version $(BUILD_VERSION) --os-arch "${GOHOSTOS}-${GOHOSTARCH}" --oci-discovery-image ${OCI_REGISTRY}/tanzu-plugins/discovery/context:${BUILD_VERSION} --oci-distribution-image-repository ${OCI_REGISTRY}/tanzu-plugins/distribution/ --input-artifact-dir $(ROOT_DIR)/$(ARTIFACTS_DIR) - -.PHONY: publish-admin-plugins-oci -publish-admin-plugins-oci: prepare-builder ## Publish CLI admin plugins as OCI image for current host os-arch only - $(BUILDER) publish --type oci --plugins "$(ADMIN_PLUGINS)" --version $(BUILD_VERSION) --os-arch "${GOHOSTOS}-${GOHOSTARCH}" --oci-discovery-image ${OCI_REGISTRY}/tanzu-plugins/discovery/admin:${BUILD_VERSION} --oci-distribution-image-repository ${OCI_REGISTRY}/tanzu-plugins/distribution/ --input-artifact-dir $(ROOT_DIR)/$(ARTIFACTS_ADMIN_DIR) - - -.PHONY: build-publish-plugins-all-local -build-publish-plugins-all-local: clean-catalog-cache clean-cli-plugins build-cli-with-local-discovery ## Build and Publish CLI plugins locally with local standalone discovery for all supported os-arch - -.PHONY: build-publish-plugins-local -build-publish-plugins-local: clean-catalog-cache clean-cli-plugins build-cli-local ## Build and publish CLI Plugins locally with local standalone discovery for current host os-arch only - -.PHONY: build-publish-plugins-all-oci -build-publish-plugins-all-oci: clean-catalog-cache clean-cli-plugins build-cli publish-plugins-all-oci ## Build and Publish CLI Plugins as OCI image for all supported os-arch - -## -------------------------------------- -##@ Manage CLI mocks -## -------------------------------------- - -.PHONY: build-cli-mocks -build-cli-mocks: prepare-builder ## Build Tanzu CLI mocks - $(BUILDER) cli compile $(addprefix --target ,$(subst -,_,${ENVS})) --version 0.0.1 --ldflags "$(LD_FLAGS)" --tags "${BUILD_TAGS}" --path ./test/cli/mock/plugin-old --artifacts ./test/cli/mock/artifacts-old - $(BUILDER) cli compile $(addprefix --target ,$(subst -,_,${ENVS})) --version 0.0.2 --ldflags "$(LD_FLAGS)" --tags "${BUILD_TAGS}" --path ./test/cli/mock/plugin-new --artifacts ./test/cli/mock/artifacts-new - $(BUILDER) cli compile $(addprefix --target ,$(subst -,_,${ENVS})) --version 0.0.3 --ldflags "$(LD_FLAGS)" --tags "${BUILD_TAGS}" --path ./test/cli/mock/plugin-alt --artifacts ./test/cli/mock/artifacts-alt - -## -------------------------------------- -##@ Install binaries and plugins -## -------------------------------------- - -.PHONY: install-cli -install-cli: install-cli-local ## Install Tanzu CLI with local discovery - -.PHONY: install-cli-% -install-cli-%: ## Install Tanzu CLI - $(eval DISCOVERY_TYPE = $(word 1,$(subst -, ,$*))) - $(MAKE) install-tanzu-core-cli-$(DISCOVERY_TYPE) -C cli/core - -.PHONY: install-cli-plugins -install-cli-plugins: ## Install Tanzu CLI plugins - @if [ "${ENABLE_CONTEXT_AWARE_PLUGIN_DISCOVERY}" = "true" ]; then \ - $(MAKE) install-cli-plugins-from-local-discovery ; \ - else \ - $(MAKE) install-cli-plugins-without-discovery ; \ - fi - -.PHONY: install-cli-plugins-without-discovery -install-cli-plugins-without-discovery: set-unstable-versions set-context-aware-cli-for-plugins ## Install Tanzu CLI plugins when context-aware discovery is disabled - cd ./cli/core && TANZU_CLI_NO_INIT=true $(GO) run -ldflags "$(LD_FLAGS)" ./cmd/tanzu/main.go \ - plugin install all --local $(ARTIFACTS_DIR)/$(GOHOSTOS)/$(GOHOSTARCH)/cli - cd ./cli/core && TANZU_CLI_NO_INIT=true $(GO) run -ldflags "$(LD_FLAGS)" ./cmd/tanzu/main.go \ - plugin install all --local $(ARTIFACTS_DIR)-admin/$(GOHOSTOS)/$(GOHOSTARCH)/cli - cd ./cli/core && TANZU_CLI_NO_INIT=true $(GO) run -ldflags "$(LD_FLAGS)" ./cmd/tanzu/main.go \ - test fetch --local $(ARTIFACTS_DIR)/$(GOHOSTOS)/$(GOHOSTARCH)/cli --local $(ARTIFACTS_DIR)-admin/$(GOHOSTOS)/$(GOHOSTARCH)/cli - -.PHONY: install-cli-plugins-from-local-discovery -install-cli-plugins-from-local-discovery: clean-catalog-cache clean-cli-plugins set-context-aware-cli-for-plugins configure-admin-plugins-discovery-source-local ## Install Tanzu CLI plugins from local discovery - cd ./cli/core && TANZU_CLI_NO_INIT=true $(GO) run -ldflags "$(LD_FLAGS) -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryType=local'" ./cmd/tanzu/main.go plugin sync - -.PHONY: install-cli-plugins-from-oci-discovery -install-cli-plugins-from-oci-discovery: clean-catalog-cache clean-cli-plugins set-context-aware-cli-for-plugins ## Install Tanzu CLI plugins from OCI discovery - cd ./cli/core && TANZU_CLI_NO_INIT=true $(GO) run -ldflags "$(LD_FLAGS) -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryType=oci'" ./cmd/tanzu/main.go plugin sync - -.PHONY: set-unstable-versions -set-unstable-versions: ## Configures the unstable versions - cd ./cli/core && TANZU_CLI_NO_INIT=true $(GO) run -ldflags "$(LD_FLAGS)" ./cmd/tanzu/main.go config set unstable-versions $(TANZU_PLUGIN_UNSTABLE_VERSIONS) - -.PHONY: set-context-aware-cli-for-plugins -set-context-aware-cli-for-plugins: ## Configures the context-aware-cli-for-plugins-beta feature flag - cd ./cli/core && TANZU_CLI_NO_INIT=true $(GO) run -ldflags "$(LD_FLAGS)" ./cmd/tanzu/main.go config set features.global.context-aware-cli-for-plugins $(ENABLE_CONTEXT_AWARE_PLUGIN_DISCOVERY) - -.PHONY: configure-admin-plugins-discovery-source-local -configure-admin-plugins-discovery-source-local: ## Configures the admin plugins discovery source - cd ./cli/core && TANZU_CLI_NO_INIT=true $(GO) run -ldflags "$(LD_FLAGS)" ./cmd/tanzu/main.go plugin source add --name admin-local --type local --uri admin || true - cd ./cli/core && TANZU_CLI_NO_INIT=true $(GO) run -ldflags "$(LD_FLAGS)" ./cmd/tanzu/main.go plugin source update admin-local --type local --uri admin || true - -.PHONY: build-install-cli-all ## Build and install the CLI plugins -build-install-cli-all: build-install-cli-all-with-local-discovery ## Build and install Tanzu CLI plugins - -.PHONY: build-install-cli-all-with-local-discovery ## Build and install the CLI plugins with local standalone discovery -build-install-cli-all-with-local-discovery: clean-catalog-cache clean-cli-plugins build-cli-with-local-discovery install-cli-plugins-from-local-discovery install-cli-local ## Build and install Tanzu CLI plugins - -.PHONY: build-install-cli-all-with-oci-discovery ## Build and install the CLI plugins with oci standalone discovery -build-install-cli-all-with-oci-discovery: clean-catalog-cache clean-cli-plugins build-cli-with-oci-discovery install-cli-plugins-from-oci-discovery install-cli-oci ## Build and install Tanzu CLI plugins - -# This target is added as some tests still relies on tkg cli. -# TODO: Remove this target when all tests are migrated to use tanzu cli -.PHONY: tkg-cli ## Builds TKG-CLI binary -tkg-cli: configure-buildtags-embedproviders configure-bom prep-build-cli ## Build tkg CLI binary only, and without rebuilding ui bits (providers are embedded to the binary) - GO111MODULE=on $(GO) build -o $(BIN_DIR)/tkg-${GOHOSTOS}-${GOHOSTARCH} --gcflags "${GC_FLAGS}" -ldflags "${LD_FLAGS}" -tags "${BUILD_TAGS}" cmd/cli/tkg/main.go - -.PHONY: build-cli-image -build-cli-image: ## Build the CLI image - docker build -t projects.registry.vmware.com/tanzu/cli:latest -f Dockerfile.cli . - -## -------------------------------------- -##@ Release binaries -## -------------------------------------- - -# TODO (pbarker): should work this logic into the builder plugin -.PHONY: release -release: ensure-pinniped-repo ${RELEASE_JOBS} ## Create release binaries - @rm -rf pinniped - -.PHONY: release-% -release-%: prepare-builder ## Create release for a platform - $(eval ARCH = $(word 2,$(subst -, ,$*))) - $(eval OS = $(word 1,$(subst -, ,$*))) - - $(BUILDER) cli compile --version $(BUILD_VERSION) --ldflags "$(LD_FLAGS) -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryType=oci'" --tags "${BUILD_TAGS}" --path ./cmd/cli/plugin-admin --artifacts artifacts-admin/${OS}/${ARCH}/cli --target ${OS}_${ARCH} - ./hack/embed-pinniped-binary.sh go ${OS} ${ARCH} ${PINNIPED_VERSIONS} - $(BUILDER) cli compile --version $(BUILD_VERSION) --ldflags "$(LD_FLAGS) -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryType=oci'" --tags "${BUILD_TAGS}" --path "cmd/cli/plugin" --artifacts artifacts/${OS}/${ARCH}/cli --target ${OS}_${ARCH} - $(MAKE) build-tanzu-core-cli-oci-$(OS)-$(ARCH) -C cli/core - -## -------------------------------------- -##@ Testing, verification, formating and cleanup -## -------------------------------------- - -.PHONY: test -test: generate manifests build-cli-mocks ## Run tests - ## Skip running TKG integration tests - $(MAKE) ytt -C $(TOOLS_DIR) - - echo "Verifying cluster-api packages and providers are in sync..." - make -C hack/providers-sync-tools validate - echo "... cluster-api packages are in sync" - - ## Test the YTT cluster templates - echo "Changing into the provider test directory to verify ytt cluster templates..." - cd ./providers/tests/unit && PATH=$(abspath hack/tools/bin):"$(PATH)" $(GO) test -coverprofile coverage1.txt -v -timeout 120s ./ - echo "... ytt cluster template verification complete!" - - echo "Verifying package tests..." - find ./packages/ -name "test" -type d | \ - xargs -n1 -I {} bash -c 'cd {} && PATH=$(abspath hack/tools/bin):"$(PATH)" $(GO) test -coverprofile coverage2.txt -v -timeout 120s ./...' \; - echo "... package tests complete!" - - PATH=$(abspath hack/tools/bin):"$(PATH)" $(GO) test -coverprofile coverage3.txt -v `go list ./... | grep -Ev '(github.com/vmware-tanzu/tanzu-framework/tkg/test|github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/package/test)'` - - $(MAKE) kubebuilder -C $(TOOLS_DIR) - KUBEBUILDER_ASSETS=$(ROOT_DIR)/$(KUBEBUILDER)/bin $(MAKE) test -C addons - - # pinniped post-deploy - $(MAKE) test -C pinniped-components/post-deploy - # pinniped tanzu-auth-controller-manager - pinniped-components/tanzu-auth-controller-manager/hack/test.sh - - #Test core cli runtime library - $(MAKE) test -C cli/runtime - - # Test core cli - $(MAKE) test -C cli/core - - # Test tkg module - $(MAKE) test -C tkg - - # Test feature gates - $(MAKE) test -C featuregates - - # Test capabilities - $(MAKE) test -C capabilities - - # Test other modules. - # TODO: This should be a call to a "test" target in that module's Makefile - cd apis/config && $(GO) test ./... -coverprofile cover.out - cd apis/run && $(GO) test ./... -coverprofile cover.out - cd packageclients && $(GO) test ./... -coverprofile cover.out - cd apis/addonconfigs && $(GO) test ./... -coverprofile cover.out - cd apis/cli && $(GO) test ./... -coverprofile cover.out - cd apis/core && $(GO) test ./... -coverprofile cover.out - - # Test admin plugins - cd cmd/cli/plugin-admin/builder && $(GO) test ./... -coverprofile cover.out - cd cmd/cli/plugin-admin/codegen && $(GO) test ./... -coverprofile cover.out - cd cmd/cli/plugin-admin/test && $(GO) test ./... -coverprofile cover.out - - # Test plugins - cd cmd/cli/plugin/feature && $(GO) test ./... -coverprofile cover.out - cd cmd/cli/plugin/login && $(GO) test ./... -coverprofile cover.out - cd cmd/cli/plugin/pinniped-auth && $(GO) test ./... -coverprofile cover.out - cd cmd/cli/plugin/secret && $(GO) test ./... -coverprofile cover.out - - # Test package plugin but skip package/test which are e2e tests run separately in CI - cd cmd/cli/plugin/package && $(GO) test -coverprofile cover.out -v `go list ./... | grep -v github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/package/test` - - # Cluster plugin tests - $(MAKE) test -C cmd/cli/plugin/cluster - - # Cluster plugin tests - $(MAKE) test -C cmd/cli/plugin/managementcluster - - # isolated-cluster plugin tests - $(MAKE) test -C cmd/cli/plugin/isolated-cluster - -.PHONY: test-cli -test-cli: build-cli-mocks ## Run tests - $(GO) test ./pkg/v1/auth/... ./pkg/v1/builder/... ./pkg/v1/encoding/... ./pkg/v1/grpc/... - #Test core cli - $(MAKE) test -C cli/core - -lint: tools go-lint doc-lint misspell yamllint ## Run linting and misspell checks +.PHONY: lint-all +# Run linting and misspell checks +lint-all: tools go-lint doc-lint misspell yamllint # Check licenses in shell scripts and Makefiles hack/check-license.sh +.PHONY: misspell misspell: hack/check/misspell.sh +.PHONY: yamllint yamllint: hack/check/check-yaml.sh # These are the modules that still contain issues reported by golangci-lint. # Once a module is updated to be lint-free, remove from list to catch lint regressions. -MODULES_NEEDING_LINT_FIX=./cmd/cli/plugin/cluster ./cmd/cli/plugin/login ./cmd/cli/plugin/package ./cmd/cli/plugin-admin/builder . ./apis/core ./apis/addonconfigs ./capabilities/client ./addons ./hack/packages/package-tools ./packageclients ./tkg ./tkr ./pinniped-components/post-deploy ./pkg/v1/tkr +MODULES_NEEDING_LINT_FIX= . ./apis/core -go-lint: tools ## Run linting of go source +.PHONY: go-lint +# Run linting of go source +go-lint: tools @for i in $(GO_MODULES); do \ echo "-- Linting $$i --"; \ pushd $${i} > /dev/null; \ @@ -596,7 +101,7 @@ go-lint: tools ## Run linting of go source done # Prevent use of deprecated ioutils module - @CHECK=$$(grep -r --include="*.go" --exclude-dir="pinniped" --exclude="zz_generated*" ioutil .); \ + @CHECK=$$(grep -r --include="*.go" --exclude="zz_generated*" ioutil .); \ if [ -n "$${CHECK}" ]; then \ echo "ioutil is deprecated, use io or os replacements"; \ echo "https://go.dev/doc/go1.16#ioutil"; \ @@ -604,7 +109,9 @@ go-lint: tools ## Run linting of go source exit 1; \ fi -doc-lint: tools ## Run linting checks for docs +.PHONY: doc-lint +# Run linting checks for docs +doc-lint: tools $(VALE) --config=.vale/config.ini --glob='*.md' ./ # mdlint rules with possible errors and fixes can be found here: # https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md @@ -612,7 +119,8 @@ doc-lint: tools ## Run linting checks for docs hack/check-mdlint.sh .PHONY: modules -modules: ## Runs go mod to ensure modules are up to date. +# Runs go mod tidy to ensure modules are up to date. +modules: @for i in $(GO_MODULES); do \ echo "-- Tidying $$i --"; \ pushd $${i}; \ @@ -621,281 +129,92 @@ modules: ## Runs go mod to ensure modules are up to date. done .PHONY: verify -verify: tools modules ## Run all verification scripts +# Run all verification scripts +verify: tools modules $(MAKE) smoke-build generate-go generate - ./packages/tkg-clusterclass/hack/sync-cc.sh ./hack/verify-dirty.sh -.PHONY: clean-catalog-cache -clean-catalog-cache: ## Cleans catalog cache - @rm -rf ${XDG_CACHE_HOME}/tanzu/* - -.PHONY: clean-cli-plugins -clean-cli-plugins: ## Remove Tanzu CLI plugins - - rm -rf ${XDG_DATA_HOME}/tanzu-cli/* - -## -------------------------------------- -##@ UI Build & Test -## -------------------------------------- -.PHONY: update-npm-registry -update-npm-registry: ## set alternate npm registry -ifneq ($(strip $(CUSTOM_NPM_REGISTRY)),) - npm config set registry $(CUSTOM_NPM_REGISTRY) web -endif - -.PHONY: ui-build-image -ui-build-image: ## Builds image with npm dependencies and compiled Angular app - cd $(UI_DIR); docker build -t "ui-build-image:latest" . +.PHONY: smoke-build +# Do a quick test that all directories can be built +smoke-build: + @for i in $(GO_MODULES); do \ + echo "-- Building $$i --"; \ + pushd $${i}; \ + $(GO) build ./... || exit 1; \ + $(GO) clean -i ./... || exit 1; \ + popd; \ + done -.PHONY: ui-build -ui-build: ui-build-image ## Creates temp docker container and copies prod Angular assets to host UI_DIR - docker cp $$(docker create --name ui-build-container ui-build-image:latest):/workspace/dist $(UI_DIR) && docker rm ui-build-container && docker rmi ui-build-image - $(MAKE) generate-ui-bindata -.PHONY: verify-ui-bindata -verify-ui-bindata: ## Run verification for UI bindata - git diff --exit-code tkg/manifest/server/zz_generated.bindata.go +## +## Code scaffolding targets +## -## -------------------------------------- -##@ Generate files -## -------------------------------------- +.PHONY: manifests +# Generate manifests e.g. CRD, RBAC etc. +manifests: + $(MAKE) -C apis/config generate-manifests + $(MAKE) -C apis/core generate-manifests -.PHONY: cobra-docs -cobra-docs: - cd cli/core && TANZU_CLI_NO_INIT=true TANZU_CLI_NO_COLOR=true $(GO) run ./cmd/tanzu generate-all-docs --docs-dir "$(ROOT_DIR)/docs/cli/commands" - sed -i.bak -E 's/\/[A-Za-z]*\/([a-z]*)\/.config\/tanzu\/pinniped\/sessions.yaml/~\/.config\/tanzu\/pinniped\/sessions.yaml/g' docs/cli/commands/tanzu_pinniped-auth_login.md +.PHONY: generate-go +# Generate code via go generate. +generate-go: $(COUNTERFEITER) + @for i in $(GO_MODULES); do \ + echo "-- Running go generate ./... $$i --"; \ + pushd $${i}; \ + PATH=$(abspath hack/tools/bin):"$(PATH)" go generate ./...; \ + popd; \ + done +.PHONY: generate +# Generate code (legacy) +generate: tools + $(MAKE) generate-controller-code + @for i in $(GO_MODULES); do \ + echo "-- Running $(MAKE) -C $$i generate-controller-code --"; \ + pushd $${i}; \ + $(MAKE) -C $${i} generate-controller-code; \ + popd; \ + done .PHONY: generate-fakes -generate-fakes: ## Generate fakes for writing unit tests +# Generate fakes for writing unit tests +generate-fakes: $(GO) generate ./... $(MAKE) fmt -.PHONY: generate-ui-bindata -generate-ui-bindata: $(GOBINDATA) ## Generate go-bindata for ui files - $(GOBINDATA) -mode=420 -modtime=1 -o=tkg/manifest/server/zz_generated.bindata.go -pkg=server $(UI_DIR)/dist/... - $(MAKE) fmt - -.PHONY: generate-telemetry-bindata -generate-telemetry-bindata: $(GOBINDATA) ## Generate telemetry bindata - $(GOBINDATA) -mode=420 -modtime=1 -o=tkg/manifest/telemetry/zz_generated.bindata.go -pkg=telemetry tkg/manifest/telemetry/... - $(MAKE) fmt - - # TODO: Remove bindata dependency and use go embed -.PHONY: generate-bindata ## Generate go-bindata files -generate-bindata: generate-telemetry-bindata generate-ui-bindata - -.PHONY: configure-bom -configure-bom: configure-plugin-runtime-version ## Configure bill of materials - # Update default BoM Filename variable in tkgconfig pkg - sed "s+TKG_DEFAULT_IMAGE_REPOSITORY+${TKG_DEFAULT_IMAGE_REPOSITORY}+g" hack/update-bundled-bom-filename/update-bundled-default-bom-files-configdata.txt | \ - sed "s+TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH+${TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH}+g" | \ - sed "s+TKG_MANAGEMENT_CLUSTER_PLUGIN_VERSION+${BUILD_VERSION}+g" > tkg/tkgconfigpaths/zz_bundled_default_bom_files_configdata.go - -.PHONY: configure-plugin-runtime-version -configure-plugin-runtime-version: ## Configure plugin runtime version - $(MAKE) configure-version -C cli/runtime - -.PHONY: generate-ui-swagger-api -generate-ui-swagger-api: ## Generate swagger files for UI backend - rm -rf ${UI_DIR}/server/client ${UI_DIR}/server/models ${UI_DIR}/server/restapi/operations - ${SWAGGER} generate server -q -A kickstartUI -t $(DOCKER_DIR)/${UI_DIR}/server -f $(DOCKER_DIR)/${UI_DIR}/api/spec.yaml --exclude-main - ${SWAGGER} generate client -q -A kickstartUI -t $(DOCKER_DIR)/${UI_DIR}/server -f $(DOCKER_DIR)/${UI_DIR}/api/spec.yaml - # reset the server.go file to avoid goswagger overwritting our custom changes. - git reset HEAD ${UI_DIR}/server/restapi/server.go - git checkout HEAD ${UI_DIR}/server/restapi/server.go - $(MAKE) fmt - .PHONY: clean-generated-conversions -clean-generated-conversions: ## Remove files generated by conversion-gen from the mentioned dirs. Example SRC_DIRS="./api/run/v1alpha1" +# Remove files generated by conversion-gen from the mentioned dirs. Example SRC_DIRS="./api/core/v1alpha1" +clean-generated-conversions: (IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name 'zz_generated.conversion*' -exec rm -f {} \;; done) .PHONY: generate-go-conversions -generate-go-conversions: $(CONVERSION_GEN) ## Generate conversions go code +# Generate conversions go code +generate-go-conversions: $(CONVERSION_GEN) $(CONVERSION_GEN) \ -v 3 --logtostderr \ - --input-dirs="./apis/run/v1alpha1,./apis/run/v1alpha2" \ + --input-dirs="./apis/core/v1alpha1,./apis/core/v1alpha2" \ --build-tag=ignore_autogenerated_core \ --output-base ./ \ --output-file-base=zz_generated.conversion \ --go-header-file=./hack/boilerplate.go.txt -.PHONY: generate-package-config ## Generate the default package config CR e.g. make generate-package-config apiGroup=cni.tanzu.vmware.com kind=AntreaConfig version=v1alpha1 tkr=v1.23.3---vmware.1-tkg.1 namespace=tkg-system -generate-package-config: - @cd addons/config && \ - ./hack/test.sh verifyAddonConfigTemplateForGVR ${apiGroup} ${version} $(shell echo $(kind) | tr A-Z a-z) $(or $(iaas),default) && \ - $(YTT) --ignore-unknown-comments \ - -f templates/${apiGroup}/${version}/$(shell echo $(kind) | tr A-Z a-z).yaml \ - -f testcases/${apiGroup}/${version}/$(shell echo $(kind) | tr A-Z a-z)/$(or $(iaas),default).yaml \ - -v TKR_VERSION=${tkr} -v GLOBAL_NAMESPACE=$(or $(namespace),"tkg-system") ;\ - .PHONY: generate-package-secret -generate-package-secret: ## Generate the default package values secret. Usage: make generate-package-secret PACKAGE=pinniped tkr=v1.23.3---vmware.1-tkg.1 iaas=vsphere +# Generate the default package values secret. Usage: make generate-package-secret PACKAGE=capabilities tkr=v1.23.3---vmware.1-tkg.1 iaas=vsphere +generate-package-secret: @if [ -z "$(PACKAGE)" ]; then \ echo "PACKAGE argument required"; \ exit 1 ;\ fi - @if [ $(PACKAGE) == 'pinniped' ]; then \ - ./pinniped-components/tanzu-auth-controller-manager/hack/generate-package-secret.sh -v tkr=${tkr} -v infrastructure_provider=${iaas} ;\ - elif [ $(PACKAGE) == 'capabilities' ]; then \ + @if [ $(PACKAGE) == 'capabilities' ]; then \ ./capabilities/hack/generate-package-secret.sh -v tkr=${tkr} --data-value-yaml 'rbac.podSecurityPolicyNames=[${psp}]';\ else \ echo "invalid PACKAGE: $(PACKAGE)" ;\ exit 1 ;\ fi -## -------------------------------------- -##@ Provider templates/overlays -## -------------------------------------- - -.PHONY: clustergen -clustergen: ## Generate diff between 'before' and 'after' of cluster configuration outputs using clustergen - CLUSTERGEN_BASE=${CLUSTERGEN_BASE} make -C providers -f Makefile cluster-generation-diffs - -.PHONY: generate-embedproviders -generate-embedproviders: ## Generate provider bundle to be embedded for local testing - make -C providers -f Makefile generate-provider-bundle-zip - cp -f ${PROVIDER_BUNDLE_ZIP} $(TKG_PROVIDER_BUNDLE_ZIP) - -## -------------------------------------- -##@ TKG integration tests -## -------------------------------------- - -GINKGO_NODES ?= 1 -GINKGO_NOCOLOR ?= false - -.PHONY: e2e-tkgctl-docker -e2e-tkgctl-docker: $(GINKGO) generate-embedproviders ## Run ginkgo tkgctl E2E tests for Docker clusters - $(GINKGO) -v -trace -nodes=$(GINKGO_NODES) --noColor=$(GINKGO_NOCOLOR) $(GINKGO_ARGS) -tags embedproviders tkg/test/tkgctl/docker - -.PHONY: e2e-tkgctl-azure -e2e-tkgctl-azure: $(GINKGO) generate-embedproviders ## Run ginkgo tkgctl E2E tests for Azure clusters - $(GINKGO) -v -trace -nodes=$(GINKGO_NODES) --noColor=$(GINKGO_NOCOLOR) $(GINKGO_ARGS) -tags embedproviders tkg/test/tkgctl/azure - -.PHONY: e2e-tkgctl-aws -e2e-tkgctl-aws: $(GINKGO) generate-embedproviders ## Run ginkgo tkgctl E2E tests for AWS clusters - $(GINKGO) -v -trace -nodes=$(GINKGO_NODES) --noColor=$(GINKGO_NOCOLOR) $(GINKGO_ARGS) -tags embedproviders tkg/test/tkgctl/aws - -.PHONY: e2e-tkgctl-vc67 -e2e-tkgctl-vc67: $(GINKGO) generate-embedproviders ## Run ginkgo tkgctl E2E tests for Vsphere clusters - $(GINKGO) -v -trace -nodes=$(GINKGO_NODES) --noColor=$(GINKGO_NOCOLOR) $(GINKGO_ARGS) -tags embedproviders tkg/test/tkgctl/vsphere67 - -.PHONY: e2e-packageclient-docker -e2e-packageclient-docker: $(GINKGO) generate-embedproviders ## Run ginkgo packageclient E2E tests for TKG client library - $(GINKGO) -v -trace -nodes=$(GINKGO_NODES) --noColor=$(GINKGO_NOCOLOR) $(GINKGO_ARGS) -tags embedproviders cmd/cli/plugin/package/test - -## -------------------------------------- -##@ Docker build -## -------------------------------------- - -# These are the components in this repo that need to have a docker image built. -# This variable refers to directory paths that contain a Makefile with `docker-build`, `docker-publish` and -# `kbld-image-replace` targets that can build and push a docker image for that component. -COMPONENTS ?= \ - tkr/controller/tkr-source \ - tkr/controller/tkr-status \ - featuregates \ - addons \ - cliplugins \ - capabilities \ - tkr/webhook/tkr-conversion \ - tkr/webhook/cluster/tkr-resolver \ - tkg/vsphere-template-resolver \ - pinniped-components/tanzu-auth-controller-manager \ - object-propagation - -.PHONY: docker-build -docker-build: TARGET=docker-build -docker-build: $(COMPONENTS) ## Build Docker images - -.PHONY: docker-publish -docker-publish: TARGET=docker-publish -docker-publish: $(COMPONENTS) ## Push Docker images - -.PHONY: kbld-image-replace -kbld-image-replace: TARGET=kbld-image-replace -kbld-image-replace: $(COMPONENTS) ## Resolve Docker images - -.PHONY: $(COMPONENTS) -$(COMPONENTS): - $(MAKE) -C $@ $(TARGET) - -.PHONY: docker-all -docker-all: docker-build docker-publish kbld-image-replace ## Ship Docker images - -## -------------------------------------- -##@ Packages -## -------------------------------------- - .PHONY: create-package -create-package: ## Stub out new package directories and manifests. Usage: make create-package PACKAGE_NAME=foobar +# Stub out new package directories and manifests. Usage: make create-package PACKAGE_NAME=foobar +create-package: @hack/packages/scripts/create-package.sh $(PACKAGE_NAME) - -.PHONY: prep-package-tools -prep-package-tools: - cd hack/packages/package-tools && $(GO) mod tidy - -.PHONY: package-bundle -package-bundle: tools prep-package-tools ## Build one specific tar bundle package, needs PACKAGE_NAME VERSION - cd hack/packages/package-tools && $(GO) run main.go package-bundle generate $(PACKAGE_NAME) --thick --version=$(PACKAGE_VERSION) --sub-version=$(PACKAGE_SUB_VERSION) --registry=$(OCI_REGISTRY) - -.PHONY: package-bundle-thin -package-bundle-thin: tools prep-package-tools ## Build one specific tar bundle package, needs PACKAGE_NAME VERSION - cd hack/packages/package-tools && $(GO) run main.go package-bundle generate $(PACKAGE_NAME) --repository=$(PACKAGE_REPOSITORY) --version=$(PACKAGE_VERSION) --sub-version=$(PACKAGE_SUB_VERSION) - -.PHONY: package-bundles -package-bundles: tools prep-package-tools ## Build tar bundles for multiple packages - cd hack/packages/package-tools && $(GO) run main.go package-bundle generate --all --thick --repository=$(PACKAGE_REPOSITORY) --version=$(PACKAGE_VERSION) --sub-version=$(PACKAGE_SUB_VERSION) --registry=$(OCI_REGISTRY) - -.PHONY: package-bundles-thin -package-bundles-thin: tools prep-package-tools ## Build tar bundles for multiple packages - cd hack/packages/package-tools && $(GO) run main.go package-bundle generate --all --repository=$(PACKAGE_REPOSITORY) --version=$(PACKAGE_VERSION) --sub-version=$(PACKAGE_SUB_VERSION) - -.PHONY: package-repo-bundle -package-repo-bundle: tools prep-package-tools ## Build tar bundles for package repo with given package-values.yaml file - cd hack/packages/package-tools && $(GO) run main.go repo-bundle generate --repository=$(PACKAGE_REPOSITORY) --registry=$(OCI_REGISTRY) --package-values-file=$(PACKAGE_VALUES_FILE) --version=$(REPO_BUNDLE_VERSION) --sub-version=$(REPO_BUNDLE_SUB_VERSION) - -.PHONY: push-package-bundles -push-package-bundles: tools prep-package-tools ## Push specified package bundle(s) in a package repository. -## Specified package bundles must be set to the PACKAGE_BUNDLES environment variable as comma-separated values -## and must not contain spaces. Example: PACKAGE_BUNDLES=featuregates,core-management-plugins - cd hack/packages/package-tools && $(GO) run main.go package-bundle push $(PACKAGE_BUNDLES) --registry=$(OCI_REGISTRY) --version=$(BUILD_VERSION) --sub-version=$(PACKAGE_SUB_VERSION) - -.PHONY: push-all-package-bundles -push-all-package-bundles: tools prep-package-tools ## Push all package bundles in a package repository - cd hack/packages/package-tools && $(GO) run main.go package-bundle push --repository=$(PACKAGE_REPOSITORY) --registry=$(OCI_REGISTRY) --version=$(BUILD_VERSION) --sub-version=$(PACKAGE_SUB_VERSION) --all - -.PHONY: push-package-repo-bundle -push-package-repo-bundle: tools prep-package-tools ## Push package repo bundles - cd hack/packages/package-tools && $(GO) run main.go repo-bundle push --repository=$(PACKAGE_REPOSITORY) --registry=$(OCI_REGISTRY) --version=$(REPO_BUNDLE_VERSION) --sub-version=$(REPO_BUNDLE_SUB_VERSION) - -.PHONY: package-vendir-sync -package-vendir-sync: tools ## Performs a `vendir sync` for each package in a repository - cd hack/packages/package-tools && $(GO) run main.go vendir sync --repository=$(PACKAGE_REPOSITORY) - -.PHONY: local-registry -local-registry: clean-registry ## Starts up a local docker registry. Local docker registry is used for pushing the package bundle to get the sha256, for using it later when producing repo bundle - docker run -d -p 5001:5000 --name registry mirror.gcr.io/library/registry:2 - -.PHONY: clean-registry -clean-registry: ## Stops and removes local docker registry - docker container stop registry && docker container rm -v registry || true - -.PHONY: trivy-scan -trivy-scan: ## Trivy scan images used in packages - make -C $(TOOLS_DIR) trivy - $(PACKAGES_SCRIPTS_DIR)/package-utils.sh trivy_scan - -.PHONY: package-push-bundles-repo ## Performs build and publishes packages and repo bundles -package-push-bundles-repo: package-bundles push-all-package-bundles package-repo-bundle push-package-repo-bundle - -.PHONY: smoke-build -smoke-build: ## Do a quick test that all directories can be built - @for i in $(GO_MODULES); do \ - echo "-- Building $$i --"; \ - pushd $${i}; \ - $(GO) build ./... || exit 1; \ - $(GO) clean -i ./... || exit 1; \ - popd; \ - done diff --git a/PROJECT b/PROJECT index 0b70b855d1..85212e0065 100644 --- a/PROJECT +++ b/PROJECT @@ -2,15 +2,9 @@ domain: tanzu.vmware.com multigroup: true repo: github.com/vmware-tanzu/tanzu-framework resources: -- group: config - kind: ClientConfig - version: v1alpha1 - group: run kind: TanzuKubernetesRelease version: v1alpha1 -- group: cli - kind: Catalog - version: v1alpha1 - group: config kind: Feature version: v1alpha1 @@ -20,12 +14,6 @@ resources: - group: config kind: FeatureGate version: v1alpha1 -- group: cni - kind: CalicoConfig - version: v1alpha1 -- group: cni - kind: AntreaConfig - version: v1alpha1 - group: run kind: ClusterBootstrap version: v1alpha3 @@ -38,27 +26,12 @@ resources: - group: run kind: TanzuKubernetesRelease version: v1alpha3 -- group: cpi - kind: CPIConfig - version: v1alpha1 -- group: csi - kind: AzureDiskCSIConfig - version: v1alpha1 - group: core kind: Capability version: v1alpha1 -- group: csi - kind: AwsEbsCSIConfig - version: v1alpha1 -- group: csi - kind: AzureFileCSIConfig - version: v1alpha1 - group: core kind: Capability version: v1alpha2 -- group: cpi - kind: KubevipCPIConfig - version: v1alpha1 - group: core kind: FeatureGate version: v1alpha2 diff --git a/README.md b/README.md index 835f52fb4e..4314c9cf4c 100644 --- a/README.md +++ b/README.md @@ -4,25 +4,22 @@ ## Overview -Tanzu Framework provides a set of building blocks to build atop of the [Tanzu](https://tanzu.vmware.com/tanzu) platform, which includes the following: +Tanzu Framework provides a set of building blocks to build on top of the [Tanzu](https://tanzu.vmware.com/tanzu) +platform. -* **API Machinery:** For defining and implementing APIs and their controllers -* **CLI Machinery:** For extending the command line experience -* **Packages:** For consistent delivery of core and optional components +Framework provides APIs and Packages that enables Tanzu Kubernetes clusters to function in an enterprise-ready way. -Framework leverages [Carvel](https://carvel.dev/) packaging and plugins to provide users with a much stronger, more integrated experience than the loose coupling and stand-alone commands of the previous generation of tools. +Framework leverages [Carvel](https://carvel.dev/) packaging and plugins to provide users with a much stronger, more +integrated experience than the loose coupling and stand-alone commands of the previous generation of tools. ## Documentation -The [documentation](docs) provides a getting started guide and information about building from source, the Tanzu Framework architecture, extending the Tanzu platform, and more. - -## Getting Started - -The best way to get started with Tanzu Framework is by using the CLI. Please see our getting started with the CLI [guide](docs/cli/getting-started.md) for more details. +The [documentation](docs) provides information about the project, including user and developer guides. ## Contributing -Thanks for taking the time to join our community and start contributing! We welcome pull requests. Feel free to dig through the [issues](https://github.com/vmware-tanzu/tanzu-framework/issues) and jump in. +Thanks for taking the time to join our community and start contributing! We welcome pull requests. Feel free to dig +through the [issues](https://github.com/vmware-tanzu/tanzu-framework/issues) and jump in. ### Before you begin @@ -34,6 +31,6 @@ Thanks for taking the time to join our community and start contributing! We welc Check out Framework's project [Roadmap](ROADMAP.md) and consider contributing! -## Cherry-pick process +## Release Process -Check quick instructions [here](./docs/release/cherry-pick.md) +Check quick instructions [here](./docs/release/README.md) diff --git a/ROADMAP.md b/ROADMAP.md index 06af4f9881..7b0791b3ff 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -26,6 +26,4 @@ Last Updated: 7/8/21 |Issue|Description| |---|---| -|[725](https://github.com/vmware-tanzu/tanzu-framework/issues/725)|Capabilities Part 2 - TKG Discovery API| -|[726](https://github.com/vmware-tanzu/tanzu-framework/issues/725)|Capabilities Part 3 - Capabilities Custom Resource| -|[558](https://github.com/vmware-tanzu/tanzu-framework/issues/558)|Controller Devex Tools| +| TBD | TBD| diff --git a/addons/Dockerfile b/addons/Dockerfile deleted file mode 100644 index ba67f05ac5..0000000000 --- a/addons/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Enable Buildkit -# syntax=docker/dockerfile:1.4 - -# Build from publicly reachable source by default, but allow people to re-build images on -# top of their own trusted images. -ARG BUILDER_BASE_IMAGE=golang:1.18 -ARG DISTROLESS_BASE_IMAGE=gcr.io/distroless/static:nonroot -# Build the manager binary -FROM $BUILDER_BASE_IMAGE as builder -WORKDIR /workspace -# Copy the go source -COPY ./ ./ - -# Setting default GOPROXY to https://proxy.golang.org,direct and GOSUMDB to sum.golang.org which can be override by Makefile -ARG GOSUMDB -ARG GOPROXY -ENV GOSUMDB=$GOSUMDB -ENV GOPROXY=$GOPROXY -# cache deps before building and copying source so that we don't need to re-download as much -# and so that source changes don't invalidate our downloaded layer -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod go mod download - -# Build -ARG LD_FLAGS -ENV LD_FLAGS="$LD_FLAGS "'-extldflags "-static"' -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod cd addons && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -ldflags "$LD_FLAGS" -o bin/manager main.go - -# Use distroless as minimal base image to package the manager binary -# Refer to https://github.com/GoogleContainerTools/distroless for more details -FROM $DISTROLESS_BASE_IMAGE -WORKDIR / -COPY --from=builder /workspace/addons/bin/manager . -USER nonroot:nonroot - -ENTRYPOINT ["/manager"] diff --git a/addons/Makefile b/addons/Makefile deleted file mode 100644 index 6fa7a11d87..0000000000 --- a/addons/Makefile +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../common.mk - -.DEFAULT_GOAL := help - -ADDONS_DIR := $(dir $(shell pwd)) - -# Active module mode, as we use go modules to manage dependencies -export GO111MODULE := on - -# Image URL to use all building/pushing image targets -IMG_DEFAULT_NAME ?= addons-controller -IMG_DEFAULT_TAG := $(shell git describe --always --dirty --tags) -IMG_DEFAULT_NAME_TAG := $(IMG_DEFAULT_NAME):latest - -IMG_VERSION_OVERRIDE ?= $(shell git describe --always --dirty --tags) - -ifeq ($(strip $(OCI_REGISTRY)),) - IMG ?= $(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -else - IMG ?= $(OCI_REGISTRY)/$(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -endif - -# Directories -BIN_DIR := bin -KUBEBUILDER_BIN_DIR := $(TOOLS_BIN_DIR)/kubebuilder/bin - -export PATH := $(abspath $(BIN_DIR)):$(PATH) - -# Binaries -MANAGER := $(BIN_DIR)/manager - -.PHONY: all -all: test manager ## Tests and builds the binaries - -## -------------------------------------- -## Testing -## -------------------------------------- - -.PHONY: test -test: fmt vet template-tests ## Run Tests - $(MAKE) kubebuilder -C $(TOOLS_DIR) - KUBEBUILDER_ASSETS=$(KUBEBUILDER_BIN_DIR) go test ./... -timeout 60m -race -coverprofile coverage.txt -v 2 - -.PHONY: test-verbose -test-verbose: ## Verbose tests with streaming output for debugging - $(MAKE) kubebuilder -C $(TOOLS_DIR) - KUBEBUILDER_ASSETS=$(KUBEBUILDER_BIN_DIR) $(TOOLS_DIR)/bin/ginkgo -v ./... -timeout 60m -coverprofile coverage.txt -v 2 - -.PHONY: template-tests -template-tests: ## Sanity tests to verify the addon config CR templates - ./config/hack/test.sh verifyAllAddonConfigTemplates - -## -------------------------------------- -## Binaries -## -------------------------------------- - -.PHONY: manager-binary -manager-binary: $(MANAGER) ## Build manager binary -$(MANAGER): - go build -o $@ -ldflags "$(LD_FLAGS) "'-extldflags "-static"' - -.PHONY: manager -manager: fmt vet manager-binary ## Build manager binary - -## -------------------------------------- -## Linting and fixing linter errors -## -------------------------------------- - -.PHONY: vet -vet: ## Vet codebase - go vet ./... - -## -------------------------------------- -## Development - local -## -------------------------------------- - -.PHONY: run -run: fmt vet ## Run locally - go run -ldflags "$(LD_FLAGS)" ./main.go - -## -------------------------------------- -## Docker -## -------------------------------------- - -.PHONY: docker-build -docker-build: ## Build the docker image - cd .. && docker build -t $(IMG) -f addons/Dockerfile --build-arg LD_FLAGS="$(LD_FLAGS)" --build-arg DISTROLESS_BASE_IMAGE="$(DISTROLESS_BASE_IMAGE)" --build-arg GOPROXY="$(GOPROXY)" --build-arg GOSUMDB="$(GOSUMDB)" . - -.PHONY: docker-push -docker-push: ## Push the docker image - docker push $(IMG) - -.PHONY: docker-publish ## Push the docker image -docker-publish: docker-push - -.PHONY: docker-remove -docker-remove: ## Remove the docker image - docker rmi $(IMG) 2>/dev/null || true - -.PHONY: docker-build-and-publish -docker-build-and-publish: docker-build docker-publish kbld-image-replace - -## -------------------------------------- -## Update kbld-config -## -------------------------------------- - -.PHONY: kbld-image-replace -kbld-image-replace: ## Add newImage in kbld-config.yaml - cd ../hack/packages/kbld-image-replace && \ - go run main.go -kbld-config ../../../packages/addons-manager/kbld-config.yaml $(IMG_DEFAULT_NAME_TAG) $(IMG) - -## -------------------------------------- -## Clean -## -------------------------------------- - -.PHONY: clean ## Remove all generated files -clean: docker-remove - rm -rf bin - -TOOLS_BIN_DIR := hack/tools/bin -$(TOOLS_BIN_DIR): - mkdir -p $(TOOLS_BIN_DIR) - -COUNTERFEITER := $(TOOLS_BIN_DIR)/counterfeiter -$(COUNTERFEITER): $(TOOLS_BIN_DIR) go.mod go.sum ## Build counterfeiter - cd hack/tools && $(GO) build -tags=tools -o bin/ github.com/maxbrunsfeld/counterfeiter/v6 - -generate-fakes: $(COUNTERFEITER) ## Generate fakes for unit tests - PATH=$(PWD)/$(TOOLS_BIN_DIR):"$(PATH)" $(GO) generate ./... - $(MAKE) fmt diff --git a/addons/README.md b/addons/README.md deleted file mode 100644 index 0ce4980ec8..0000000000 --- a/addons/README.md +++ /dev/null @@ -1,453 +0,0 @@ -# Tanzu Addons Manager - -Tanzu Addons Manager manages the lifecycle of core Carvel packages such as Kapp-controller, CNI, CPI, CSI and a list of arbitrary Carvel Packages. -The mechanism for determining the versions of packages is via an imgpkg bundle(TKr package) that contains a number of resources which are described below. - -## APIs - -The following are the primary APIs used by the addons manager for determining what packages, versions and configurations go into a kubernetes cluster. - -1. **TanzuKubernetesRelease(tkr)** - This is a resource that represents a summary of items contained in a Tanzu Kubernetes release. -It aggregates VM images using OSImages resource, packages and versions shipped with a release. It specifies all the components -that will be automatically life cycled managed. -2. **ClusterBootstrapTemplate(cbt)** - This is a cookie cutter template resource of opinionated Carvel packages and their configurations that will be installed on a cluster. -There is a 1:1 relationship with tkr resource. This establishes a mapping of compatibility between a kubernetes version and a package version. -3. **ClusterBootstrap(cb)** - This is a resource that has 1:1 relationship with a Cluster resource. When a tanzu cluster is created a cbt resource is cloned to create a cb resource. -Once cloned the cb resource has no linkage to a cbt until a new version of tkr is rolled out and the tkr components update the version - -The next set of APIs are used to provide values for configuring packages in ClusterBootstrap. Tanzu-framework defines -a set of APIs for core packages, but they can be overridden by an OEM distributor of Tanzu by bringing their own mechanism of -configuring their package. See the provider model below for more information - -1. **KappControllerConfig** - This is a resource that represents the configuration of kapp-controller carvel package. -2. **AntreaConfig** - This is a resource that represents the configuration of antrea carvel package. -3. **CalicoConfig** - This is a resource that represents the configuration of calico carvel package. -4. **VSphereCPIConfig** - This is a resource that represents the configuration of vsphere cloud provider carvel package for both paravirtual and non-paravirtual modes of operation. -5. **VSphereCSIConfig** - This is a resource that represnets the configuration of vsphere csi carvel package for both paravirtual and non-paravirtual modes of operation. - -## Webhooks - -1. A validating webhook for ClusterBootstrapTemplate ensures that - 1. it can only be created in a system namespace - 2. required packages such as kapp and cni are set - 3. only one type of valuesFrom is defined for a package - 4. it is immutable -2. A validating webhook for ClusterBootstrap ensures that - 1. required packages such as kapp and cni are set and valid - 2. any package being set is available in a system namespace(provided by TKR components) - 3. an update does not remove required packages - 4. an update does not downgrade a package version - 5. an update does not delete any package - 6. an update does not change package ref for core packages, for example changing cni from antrea to calico is not allowed - 7. an update does not alter the mechanism used to provide valuesFrom -3. A defaulting webhook for ClusterBootstrap is a convenience to enable API users to provide partial objects with an annotation -to fill missing information from a ClusterBootstrapTemplate. This allows a user to customize packages or a specific package in a cluster. - -## Object relationship - -```mermaid -classDiagram - Cluster --> ClusterClass - TanzuKubernetesRelease o-- OSImage: Aggregates - TanzuKubernetesRelease o-- ClusterBootstrapTemplate: Aggregates - Cluster --> ClusterBootstrap: 1-to-1 - Cluster ..|> TanzuKubernetesRelease - ClusterBootstrapTemplate ..> ClusterBootstrapPackage: Package representation - ClusterBootstrapPackage ..> ValuesFrom: ValuesFrom representation - ClusterBootstrap .. ClusterBootstrapTemplate: cloned from - - - class Cluster{ - +spec.topology.class - +spec.topology.version - } - class TanzuKubernetesRelease{ - +spec.version - +spec.kubernetesVersion - +spec.bootstrapPackages[] - - } - class ClusterBootstrapTemplate{ - +spec.CNI - +spec.CSI - +spec.CPI - +spec.Kapp - +spec.additionalPackages[] - } - class ClusterBootstrapPackage{ - +refName // fully qualified Carvel Package Name - +valuesFrom // package values - } - class ValuesFrom{ - +inline // map - +secretRef - +providerRef - } -``` - -## Objects in Supervisor/Management and Workload cluster - -![supervisor-workload](docs/images/supervisor-workload.jpg) - -1. A TKr package bundle corresponding to a kubernetes version is installed by TKR service on a Supervisor/Management Cluster(SC). -2. The bundle provides a number of resources as TKR, OSImage, CBT and various AddonConfig resources. -3. A Cluster object corresponding to a ClusterClass and a version results in TKR service adding metadata to the Cluster object -to indicate the TKR to use for this cluster. -4. Addons-manager which includes a number of controllers and webhooks will pick the CBT corresponding to the TKR and clone -it to a CB along with all its dependencies into the namespace of Workload Cluster(W1) in SC. -5. Various addon config controllers will create secrets corresponding to configuration required to install packages. -6. After W1 api-server endpoint is available, a PackageInstall is created for kapp-controller in the namespace of the W1 in the SC. -7. kapp-controller on SC will then create kapp-controller on W1. -8. Addons controller will create PackageInstalls for all core packages(excluding kapp) and additional packages on W1. -9. Addons controller will update current status of various packages in W1 back into status of CB in SC located in namespace of W1. - -## Sequence of operations - -### Create - -```mermaid -sequenceDiagram -participant U as User -participant S as Supervisor/Mgmt cluster -participant T as TKR Resolver/Service -participant A as Addons manager -participant W as Workload cluster - -S->>S: Install TKr package in system namespace. Provides TKR, OSImage, CBT... -A-->>S: Setup watches - - -U->>S: Create namespace my-ns -U->>+S: Create workload cluster W in my-ns -S->>T: Invoke webhook -T-->>S: Return cluster with TKR metadata -S-->>-U: Cluster created with TKR metadata -Note right of S: CAP* reconcile - -A-->S: Get CBT associated to TKR -A->>S: init of ClusterBootstrap(+ associated) in my-ns -S-->>S: Invokes webhooks for ClusterBootstrap and *Config -Note right of S: APIEndpoint available in W -A->>S: Create Remote PackageInstall for kapp-controller pkg -S->>W: Kapp-controller reconciles kapp-controller pkg -A->>W: Sync Package CRs to W -A->>W: Reconcile package secrets provided by various controllers -A->>W: Reconcile PackageInstalls, service accounts, rbac and secrets for above cni,cpi,csi -A->>S: Update status of ClusterBootstrap object with conditions -A-->>S: Get other Packages from CBT -A->>W: Sync other PackageInstalls -A->>S: Update status of ClusterBootstrap object with conditions -``` - -### Upgrade - -An upgrade of all managed packages is triggered when `spec.status.resolvedTKR` in a ClusterBootstrap is different from the -tkr label `run.tanzu.vmware.com/tkr` on a Cluster object. - -```mermaid -sequenceDiagram -participant U as User -participant S as Supervisor/Mgmt cluster -participant T as TKR Resolver/Service -participant A as Addons manager -participant W as Workload cluster - -S->>S: Install TKr v2 package in system namespace -U->>S: Update Cluster version -A-->>S: Cluster update Webhook intercept -A->>S: Pause Cluster so that CAPI does not rollout new machines -T-->>T: TKR resolution for W -T->>S: Update TKR label and metadata for W -A-->>S: Find associated CBT for newer TKR -A->>W: Sync new Package CRs versions -A->>S: Update CBT correspoding to W. -A->>S: Merge existing configs and bump package versions in ClusterBootstrap -A->>S: Update PackageInstall for kapp with nodeSelector for workload clusters on supervisor -S->>W: Kapp-controller update -A->>W: Update PackageInstalls for others with nodeSelector for workload clusters on supervisor -A->>S: Update resolvedTKR in ClusterBootstrap -A->>S: Unpause Cluster -A-->>W: Fetch statuses of PackageInstalls -A->>S: Update statuses in ClusterBootstrap -``` - -## Customizing a cluster - -In most use cases clusters should be created with just a Cluster object and TKG components will create an opinionated -cluster with packages and configurations. Customizing packages and configurations in a cluster is supported(see below). OEM distributors of TKG should -create their own TKr package that conforms to their majority use cases so that end users need not go down the path of customizing. - -### Options for customizing - -#### Pre-create specific *Config CR - -Example Use case: Customize MTU for antrea -Solution: Create custom AntreaConfig with same name format as {CLUSTER_NAME}-{package-short-name}-package in the namespace as the Cluster object. -Ordering the resources is enforced by tools such as kubectl or tanzu CLI. - -Explanation: The controllers will attempt to create a config with above name in the namespace of the cluster. If one already exists then only the -owner references of the existing resource are updated. - -```yaml -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: {CLUSTER_NAME}-antrea-package - namespace: my-ns -spec: - antrea: - config: - defaultMTU: 9000 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: my-cluster - namespace: my-ns -spec: - infrastructureRef: - kind: VSphereCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] -... -... -``` - -When the config resource is pre-created, addons-controller will use it in lieu of the one provided by CBT. - -#### Pre-create ClusterBootstrap resource - -If the use case is to swap out a specific package, for example CNI with your own package then create the ClusterBootstrap object in its entirety -with the same name as the Cluster resource. Creating this resouce in its entirety can put additional burden on clients so a defaulting webhook is -provided. - -```yaml -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - name: my-cluster - namespace: my-ns -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.30.3 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-cluster-tcbt-2-kapp-controller-config - additionalPackages: - - refName: foobar1.example.com.1.17.2 - valuesFrom: - secretRef: foobar2secret - cni: - refName: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: test-cluster-tcbt-2 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: my-cluster - namespace: my-ns -spec: - infrastructureRef: - kind: VSphereCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] -... -... -``` - -#### Day 2 customization - -A package and its configuration can be modified post cluster creation by updating associated Config. It will be retained -post cluster upgrade. Note that package versions are tightly controlled by the TKR, if the version is bumped then it will -be reset on a cluster upgrade. - -#### Defaulting webhook for ClusterBootstrap - -A defaulting webhook for ClusterBootstrap allows a client to provide partial information and the webhook will fill out -rest of the information. The webhook will default whenever it sees an annotation that matches a TKR. The annotation is -of the format `tkg.tanzu.vmware.com/add-missing-fields-from-tkr:v1.22.4`. - -Additionally a client can provide a wildcard for a package `refName` and the webhook will find the appropriate version based -on the TKR - -```yaml -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - name: my-cluster - namespace: my-ns - annotations: - tkg.tanzu.vmware.com/add-missing-fields-from-tkr: v1.22.4 -spec: - cni: - refName: calico* - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: CalicoConfig - name: sample-config -``` - -#### Create fully custom ClusterBootstrap and Config custom resources - -There might be cases where the user wants to create custom Config and ClusterBootstrap resources on their entirety. The user might choose to -create these custom resources prior to or after the creation of the cluster object. In such cases, the user needs to add the annotation of the -format `tkg.tanzu.vmware.com/custom-clusterbootstrap : ""` to the Cluster resource. When this annotation exists on the Cluster object, the -ClusterBootstrap resource will not get cloned from the ClusterBootstrapTemplate anymore. - -## Provider values to a Package - -Configuration for a package can be provided using one of three approaches. By definition providerRef and secretRef cannot cross namespace boundary. - -```yaml -... -refName: mypackage.acme.com.1.23 -valuesFrom: - providerRef: - apiGroup: acme.com - kind: AcmeConfig - name: sample-config ---- -refName: mypackage.acme.com.1.23 -valuesFrom: - secretRef: my-secret-key ---- -refName: mypackage.acme.com.1.23 -valuesFrom: - inline: - key1: value1 - nested_key: - key2: value2 -``` - -### ProviderRef - -A ProviderRef allows you to define a strong API type that is versioned via a CustomResourceDefinition. ClusterBootstrap -consumes the `providerRef` by specifying `apiGroup`, `kind` and `name`. Resource version is inferred from the api server by -querying for `ServerPreferredResources`. - -The contract for providerRef is to ensure that a secret name is provided by a reconciling controller in `.status.secretRef`. - -Example provider - -```yaml -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: my-cni - namespace: my-ns -spec: - antrea: - config: - trafficEncapMode: "encap" - noSNAT: false - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - disableUdpTunnelOffload: false - featureGates: - AntreaProxy: true - EndpointSlice: true - AntreaPolicy: true - NodePortLocal: false - AntreaTraceflow: true - Egress: false - FlowExporter: false -``` - -A controller that is reconciling this provider should write the desired configuration to status - -```yaml -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: my-cni - namespace: my-ns -spec: -... -... -status: - secretRef: my-cni-config ---- -apiVersion: v1 -kind: Secret -metadata: - name: my-cni-config - namespace: my-ns -data: -... -... -``` - -## How to bring your own package as a managed addon - -1. Create or use an existing carvel package. The Package CR must be added to a cluster - -```yaml -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.1 - namespace: cluster-namespace-2 -spec: - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.1 - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v3.19.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.1 values schema -``` - -1. Decide how to plumb data values to the package if any. - -```mermaid -flowchart TD - A[Package] --> B{Needs Config} - B -->|Yes| C{Static config} - C -->|Yes| D{Contains sensitive data} - D -->|Yes| E[Use secret value] - D -->|NO| F[Use inline value] - C -->|No| G[Use value from a provider] - B ---->|No| Z[No values] -``` - -1. If using a provider, create an API + Controller. It is not necessary that the API and controller live in tanzu-framework. -As long as the API satisfies the contract(see above), the controller code and CRD can live anywhere. See the following for -examples. - -![vsphere-csi-config API](../apis/addonconfigs/csi/v1alpha1/vspherecsiconfig_types.go) - -![vsphere-csi-config Controller](controllers/csi/vspherecsiconfig_controller.go) diff --git a/addons/config/README.md b/addons/config/README.md deleted file mode 100644 index d56e5c9d88..0000000000 --- a/addons/config/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# Addon Config CR templates - -This folder stores YTT template for generating default addon config CRs used by ClusterBootstrapTemplate. It will be invoked by the make targed at the root of tanzu-framework. - -The make target takes 4 required inputs, which are group, version and kind of the config CR, and the current TKR version. The global namespace is taken as an optional input, defaulted to `tkg-system` if not provided. - -``` bash -make generate-package-config apiGroup=cni.tanzu.vmware.com kind=AntreaConfig version=v1alpha1 tkr=v1.23.3---vmware.1-tkg.1 namespace=tkg-system -``` - -## Folder structure - -``` text -| templates -├── {Group1} -│ └── {Version1} -│ ├── {Kind1}.yaml -│ └── {Kind2}.yaml -│ └── {Version2} -│ ├── {Kind1}.yaml -│ └── {Kind2}.yaml -├── {Group2} -│ └── {Version1} -│ ├── {Kind1}.yaml -│ └── {Kind2}.yaml -...... -``` - -## Templates - -Typical templating needed would be `Name` and `Namespace` - -``` yaml -metadata: - name: #@ data.values.TKR_VERSION - namespace: #@ data.values.GLOBAL_NAMESPACE -``` - -Other values are included if the value should be different from the default value set for the config CR. You can refer to the kubebuilder definitions in `apis/` to find the default values. - -## Expected - -Each template should have it's corresponding expected output. - -For all the expected outputs, `GLOBAL_NAMESPACE=tkg-system` and `TKR_VERSION=v1.23.3---vmware.1-tkg.1` are used as sample input diff --git a/addons/config/expected/cni.tanzu.vmware.com/v1alpha1/antreaconfig/default.yaml b/addons/config/expected/cni.tanzu.vmware.com/v1alpha1/antreaconfig/default.yaml deleted file mode 100644 index 335e124fae..0000000000 --- a/addons/config/expected/cni.tanzu.vmware.com/v1alpha1/antreaconfig/default.yaml +++ /dev/null @@ -1,59 +0,0 @@ -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: v1.23.3---vmware.1-tkg.1 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - antrea: - config: - trafficEncapMode: encap - noSNAT: false - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - disableUdpTunnelOffload: false - featureGates: - AntreaIPAM: false - AntreaPolicy: true - AntreaProxy: true - AntreaTraceflow: true - Egress: true - EndpointSlice: true - FlowExporter: false - Multicast: false - Multicluster: false - NetworkPolicyStats: false - NodePortLocal: true - SecondaryNetwork: false - ServiceExternalIP: false - TrafficControl: false ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: v1.23.3---vmware.1-tkg.1-routable - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - antrea: - config: - trafficEncapMode: noEncap - noSNAT: true - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - disableUdpTunnelOffload: false - featureGates: - AntreaIPAM: false - AntreaPolicy: true - AntreaProxy: true - AntreaTraceflow: true - Egress: true - EndpointSlice: true - FlowExporter: false - Multicast: false - Multicluster: false - NetworkPolicyStats: false - NodePortLocal: true - SecondaryNetwork: false - ServiceExternalIP: false - TrafficControl: false diff --git a/addons/config/expected/cni.tanzu.vmware.com/v1alpha1/calicoconfig/default.yaml b/addons/config/expected/cni.tanzu.vmware.com/v1alpha1/calicoconfig/default.yaml deleted file mode 100644 index 4f076c3102..0000000000 --- a/addons/config/expected/cni.tanzu.vmware.com/v1alpha1/calicoconfig/default.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: v1.23.3---vmware.1-tkg.1 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - calico: - config: - vethMTU: 0 - skipCNIBinaries: true ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: v1.23.3---vmware.1-tkg.1-docker - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - calico: - config: - vethMTU: 0 - skipCNIBinaries: false diff --git a/addons/config/expected/cpi.tanzu.vmware.com/v1alpha1/kubevipcpiconfig/default.yaml b/addons/config/expected/cpi.tanzu.vmware.com/v1alpha1/kubevipcpiconfig/default.yaml deleted file mode 100644 index 98f5634066..0000000000 --- a/addons/config/expected/cpi.tanzu.vmware.com/v1alpha1/kubevipcpiconfig/default.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: KubevipCPIConfig -metadata: - name: v1.23.3---vmware.1-tkg.1 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - loadbalancerIPRanges: "" - loadbalancerCIDRs: "" diff --git a/addons/config/expected/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/default.yaml b/addons/config/expected/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/default.yaml deleted file mode 100644 index 7c1e88c4e1..0000000000 --- a/addons/config/expected/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/default.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: v1.23.3---vmware.1-tkg.1 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - vsphereCPI: - mode: vsphereCPI diff --git a/addons/config/expected/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/tkgs.yaml b/addons/config/expected/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/tkgs.yaml deleted file mode 100644 index 71c7a3ca09..0000000000 --- a/addons/config/expected/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/tkgs.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: v1.23.3---vmware.1-tkg.1 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - vsphereCPI: - mode: vsphereParavirtualCPI ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: v1.23.3---vmware.1-tkg.1-routable - namespace: tkg-system -spec: - vsphereCPI: - mode: vsphereParavirtualCPI - antreaNSXPodRoutingEnabled: true diff --git a/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/awsebscsiconfig/default.yaml b/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/awsebscsiconfig/default.yaml deleted file mode 100644 index ea3405e01c..0000000000 --- a/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/awsebscsiconfig/default.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AwsEbsCSIConfig -metadata: - name: v1.23.3---vmware.1-tkg.1 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - awsEBSCSIDriver: - namespace: kube-system - deploymentReplicas: 3 diff --git a/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/azurediskcsiconfig/default.yaml b/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/azurediskcsiconfig/default.yaml deleted file mode 100644 index 1c759a920a..0000000000 --- a/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/azurediskcsiconfig/default.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AzureDiskCSIConfig -metadata: - name: v1.23.3---vmware.1-tkg.1 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - azureDiskCSIDriver: - namespace: kube-system - deploymentReplicas: 3 diff --git a/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/azurefilecsiconfig/default.yaml b/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/azurefilecsiconfig/default.yaml deleted file mode 100644 index 29ff2dd237..0000000000 --- a/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/azurefilecsiconfig/default.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AzureFileCSIConfig -metadata: - name: v1.23.3---vmware.1-tkg.1 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - azureFileCSIDriver: - namespace: kube-system - deploymentReplicas: 3 diff --git a/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/default.yaml b/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/default.yaml deleted file mode 100644 index 4e34ec19ef..0000000000 --- a/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/default.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: VSphereCSIConfig -metadata: - name: v1.23.3---vmware.1-tkg.1 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - vsphereCSI: - mode: vsphereCSI diff --git a/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/tkgs.yaml b/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/tkgs.yaml deleted file mode 100644 index 14658cbddb..0000000000 --- a/addons/config/expected/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/tkgs.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: VSphereCSIConfig -metadata: - name: v1.23.3---vmware.1-tkg.1 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - vsphereCSI: - mode: vsphereParavirtualCSI diff --git a/addons/config/expected/run.tanzu.vmware.com/v1alpha3/kappcontrollerconfig/default.yaml b/addons/config/expected/run.tanzu.vmware.com/v1alpha3/kappcontrollerconfig/default.yaml deleted file mode 100644 index ffffcd28a2..0000000000 --- a/addons/config/expected/run.tanzu.vmware.com/v1alpha3/kappcontrollerconfig/default.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: v1.23.3---vmware.1-tkg.1 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - namespace: tkg-system - kappController: - globalNamespace: tkg-system - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" diff --git a/addons/config/hack/test.sh b/addons/config/hack/test.sh deleted file mode 100755 index 08cdfe2adc..0000000000 --- a/addons/config/hack/test.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -MY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -TF_ROOT="${MY_DIR}/../../.." -TF_TOOL_DIR="${TF_ROOT}/hack/tools/bin" - -# Always run from addons/config directory -cd "${MY_DIR}/.." - -# Default test inputs -TKR_INPUT="v1.23.3---vmware.1-tkg.1" -NAMESPACE_INPUT="tkg-system" - -function verifyAddonConfigTemplateForGVR() { - TEST_RESULT=$(${TF_TOOL_DIR}/ytt --ignore-unknown-comments -f templates/${1}/${2}/${3}.yaml \ - -v TKR_VERSION=${TKR_INPUT} -v GLOBAL_NAMESPACE=${NAMESPACE_INPUT} \ - -f "testcases/${1}/${2}/${3}/${4}.yaml") - EXPECTED="$(cat "expected/${1}/${2}/${3}/${4}.yaml")" - - if [[ "${TEST_RESULT}" != "${EXPECTED}" ]] - then - echo -e "$(tput setaf 1)Failed to run template sanity test.\nDefault config generation does not match expected output\n$(tput sgr 0)" - echo -e "result: \n${TEST_RESULT}\n" - echo -e "expected: \n${EXPECTED}\n" - diff <(echo "${TEST_RESULT}") <(echo "${EXPECTED}") - exit 1 - fi -} - -function verifyAllAddonConfigTemplates() { - # scan for config CRs with all the versions - echo "Checking all addon Config CR templates..." - for groupPath in "templates"/*; do - for versionPath in "${groupPath}"/*; do - for kindPath in "${versionPath}"/*; do - IFS='/' read -r -a array <<< "${kindPath}" - - testcasePath="testcases/${array[1]}/${array[2]}/${array[3]%.yaml}" - if [ ! -d "${testcasePath}" ]; then - echo "-- Test cases are not provided for ${kindPath}" - else - for testcase in "${testcasePath}"/*; do - IFS='/' read -r -a array <<< "${testcase}" - verifyAddonConfigTemplateForGVR "${array[1]}" "${array[2]}" "${array[3]}" "${array[4]%.yaml}" - echo "-- Successfully did sanity check on ${kindPath} with data values ${testcase}" - done - fi - done - done - done -} - -"$@" diff --git a/addons/config/templates/cni.tanzu.vmware.com/v1alpha1/antreaconfig.yaml b/addons/config/templates/cni.tanzu.vmware.com/v1alpha1/antreaconfig.yaml deleted file mode 100644 index f37c568dac..0000000000 --- a/addons/config/templates/cni.tanzu.vmware.com/v1alpha1/antreaconfig.yaml +++ /dev/null @@ -1,61 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: #@ data.values.TKR_VERSION - namespace: #@ data.values.GLOBAL_NAMESPACE - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - antrea: - config: - trafficEncapMode: "encap" - noSNAT: false - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - disableUdpTunnelOffload: false - featureGates: - AntreaIPAM: false - AntreaPolicy: true - AntreaProxy: true - AntreaTraceflow: true - Egress: true - EndpointSlice: true - FlowExporter: false - Multicast: false - Multicluster: false - NetworkPolicyStats: false - NodePortLocal: true - SecondaryNetwork: false - ServiceExternalIP: false - TrafficControl: false ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: #@ "{}-routable".format(data.values.TKR_VERSION) - namespace: #@ data.values.GLOBAL_NAMESPACE - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - antrea: - config: - trafficEncapMode: "noEncap" - noSNAT: true - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - disableUdpTunnelOffload: false - featureGates: - AntreaIPAM: false - AntreaPolicy: true - AntreaProxy: true - AntreaTraceflow: true - Egress: true - EndpointSlice: true - FlowExporter: false - Multicast: false - Multicluster: false - NetworkPolicyStats: false - NodePortLocal: true - SecondaryNetwork: false - ServiceExternalIP: false - TrafficControl: false diff --git a/addons/config/templates/cni.tanzu.vmware.com/v1alpha1/calicoconfig.yaml b/addons/config/templates/cni.tanzu.vmware.com/v1alpha1/calicoconfig.yaml deleted file mode 100644 index 107807055d..0000000000 --- a/addons/config/templates/cni.tanzu.vmware.com/v1alpha1/calicoconfig.yaml +++ /dev/null @@ -1,27 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: #@ data.values.TKR_VERSION - namespace: #@ data.values.GLOBAL_NAMESPACE - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - calico: - config: - vethMTU: 0 - skipCNIBinaries: true ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: #@ "{}-docker".format(data.values.TKR_VERSION) - namespace: #@ data.values.GLOBAL_NAMESPACE - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - calico: - config: - vethMTU: 0 - skipCNIBinaries: false diff --git a/addons/config/templates/cpi.tanzu.vmware.com/v1alpha1/kubevipcpiconfig.yaml b/addons/config/templates/cpi.tanzu.vmware.com/v1alpha1/kubevipcpiconfig.yaml deleted file mode 100644 index c13dd1b8d6..0000000000 --- a/addons/config/templates/cpi.tanzu.vmware.com/v1alpha1/kubevipcpiconfig.yaml +++ /dev/null @@ -1,12 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: KubevipCPIConfig -metadata: - name: #@ data.values.TKR_VERSION - namespace: #@ data.values.GLOBAL_NAMESPACE - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - loadbalancerIPRanges: "" - loadbalancerCIDRs: "" diff --git a/addons/config/templates/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig.yaml b/addons/config/templates/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig.yaml deleted file mode 100644 index 1b4f90bc6b..0000000000 --- a/addons/config/templates/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig.yaml +++ /dev/null @@ -1,24 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: #@ data.values.TKR_VERSION - namespace: #@ data.values.GLOBAL_NAMESPACE - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - vsphereCPI: - mode: #@ "vsphereCPI" if data.values.IAAS != "tkgs" else "vsphereParavirtualCPI" ---- -#@ if data.values.IAAS == "tkgs": -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: #@ "{}-routable".format(data.values.TKR_VERSION) - namespace: #@ data.values.GLOBAL_NAMESPACE -spec: - vsphereCPI: - mode: vsphereParavirtualCPI - antreaNSXPodRoutingEnabled: true -#@ end diff --git a/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/awsebscsiconfig.yaml b/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/awsebscsiconfig.yaml deleted file mode 100644 index 51c480df3c..0000000000 --- a/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/awsebscsiconfig.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AwsEbsCSIConfig -metadata: - name: #@ data.values.TKR_VERSION - namespace: #@ data.values.GLOBAL_NAMESPACE - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - awsEBSCSIDriver: - namespace: kube-system - deploymentReplicas: 3 diff --git a/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/azurediskcsiconfig.yaml b/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/azurediskcsiconfig.yaml deleted file mode 100644 index 1a4b0fe81c..0000000000 --- a/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/azurediskcsiconfig.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AzureDiskCSIConfig -metadata: - name: #@ data.values.TKR_VERSION - namespace: #@ data.values.GLOBAL_NAMESPACE - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - azureDiskCSIDriver: - namespace: kube-system - deploymentReplicas: 3 diff --git a/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/azurefilecsiconfig.yaml b/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/azurefilecsiconfig.yaml deleted file mode 100644 index b75d680d8b..0000000000 --- a/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/azurefilecsiconfig.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AzureFileCSIConfig -metadata: - name: #@ data.values.TKR_VERSION - namespace: #@ data.values.GLOBAL_NAMESPACE - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - azureFileCSIDriver: - namespace: kube-system - deploymentReplicas: 3 diff --git a/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig.yaml b/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig.yaml deleted file mode 100644 index 1aa2afc58b..0000000000 --- a/addons/config/templates/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig.yaml +++ /dev/null @@ -1,12 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: VSphereCSIConfig -metadata: - name: #@ data.values.TKR_VERSION - namespace: #@ data.values.GLOBAL_NAMESPACE - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - vsphereCSI: - mode: #@ "vsphereCSI" if data.values.IAAS != "tkgs" else "vsphereParavirtualCSI" diff --git a/addons/config/templates/run.tanzu.vmware.com/v1alpha3/kappcontrollerconfig.yaml b/addons/config/templates/run.tanzu.vmware.com/v1alpha3/kappcontrollerconfig.yaml deleted file mode 100644 index d98bc82ac8..0000000000 --- a/addons/config/templates/run.tanzu.vmware.com/v1alpha3/kappcontrollerconfig.yaml +++ /dev/null @@ -1,32 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: #@ data.values.TKR_VERSION - namespace: #@ data.values.GLOBAL_NAMESPACE - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - namespace: #@ data.values.GLOBAL_NAMESPACE - kappController: - globalNamespace: #@ data.values.GLOBAL_NAMESPACE - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - diff --git a/addons/config/testcases/cni.tanzu.vmware.com/v1alpha1/antreaconfig/default.yaml b/addons/config/testcases/cni.tanzu.vmware.com/v1alpha1/antreaconfig/default.yaml deleted file mode 100644 index e25fdc8014..0000000000 --- a/addons/config/testcases/cni.tanzu.vmware.com/v1alpha1/antreaconfig/default.yaml +++ /dev/null @@ -1,2 +0,0 @@ -#@data/values ---- diff --git a/addons/config/testcases/cni.tanzu.vmware.com/v1alpha1/calicoconfig/default.yaml b/addons/config/testcases/cni.tanzu.vmware.com/v1alpha1/calicoconfig/default.yaml deleted file mode 100644 index e25fdc8014..0000000000 --- a/addons/config/testcases/cni.tanzu.vmware.com/v1alpha1/calicoconfig/default.yaml +++ /dev/null @@ -1,2 +0,0 @@ -#@data/values ---- diff --git a/addons/config/testcases/cpi.tanzu.vmware.com/v1alpha1/kubevipcpiconfig/default.yaml b/addons/config/testcases/cpi.tanzu.vmware.com/v1alpha1/kubevipcpiconfig/default.yaml deleted file mode 100644 index e25fdc8014..0000000000 --- a/addons/config/testcases/cpi.tanzu.vmware.com/v1alpha1/kubevipcpiconfig/default.yaml +++ /dev/null @@ -1,2 +0,0 @@ -#@data/values ---- diff --git a/addons/config/testcases/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/default.yaml b/addons/config/testcases/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/default.yaml deleted file mode 100644 index 0770146825..0000000000 --- a/addons/config/testcases/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/default.yaml +++ /dev/null @@ -1,3 +0,0 @@ -#@data/values ---- -IAAS: vsphere diff --git a/addons/config/testcases/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/tkgs.yaml b/addons/config/testcases/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/tkgs.yaml deleted file mode 100644 index 8224fc0066..0000000000 --- a/addons/config/testcases/cpi.tanzu.vmware.com/v1alpha1/vspherecpiconfig/tkgs.yaml +++ /dev/null @@ -1,3 +0,0 @@ -#@data/values ---- -IAAS: tkgs diff --git a/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/awsebscsiconfig/default.yaml b/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/awsebscsiconfig/default.yaml deleted file mode 100644 index e25fdc8014..0000000000 --- a/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/awsebscsiconfig/default.yaml +++ /dev/null @@ -1,2 +0,0 @@ -#@data/values ---- diff --git a/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/azurediskcsiconfig/default.yaml b/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/azurediskcsiconfig/default.yaml deleted file mode 100644 index 01167b2596..0000000000 --- a/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/azurediskcsiconfig/default.yaml +++ /dev/null @@ -1,3 +0,0 @@ -#@data/values ---- -IAAS: azure diff --git a/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/azurefilecsiconfig/default.yaml b/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/azurefilecsiconfig/default.yaml deleted file mode 100644 index 01167b2596..0000000000 --- a/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/azurefilecsiconfig/default.yaml +++ /dev/null @@ -1,3 +0,0 @@ -#@data/values ---- -IAAS: azure diff --git a/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/default.yaml b/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/default.yaml deleted file mode 100644 index 0770146825..0000000000 --- a/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/default.yaml +++ /dev/null @@ -1,3 +0,0 @@ -#@data/values ---- -IAAS: vsphere diff --git a/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/tkgs.yaml b/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/tkgs.yaml deleted file mode 100644 index 8224fc0066..0000000000 --- a/addons/config/testcases/csi.tanzu.vmware.com/v1alpha1/vspherecsiconfig/tkgs.yaml +++ /dev/null @@ -1,3 +0,0 @@ -#@data/values ---- -IAAS: tkgs diff --git a/addons/config/testcases/run.tanzu.vmware.com/v1alpha3/kappcontrollerconfig/default.yaml b/addons/config/testcases/run.tanzu.vmware.com/v1alpha3/kappcontrollerconfig/default.yaml deleted file mode 100644 index e25fdc8014..0000000000 --- a/addons/config/testcases/run.tanzu.vmware.com/v1alpha3/kappcontrollerconfig/default.yaml +++ /dev/null @@ -1,2 +0,0 @@ -#@data/values ---- diff --git a/addons/controllers/addon_controller.go b/addons/controllers/addon_controller.go deleted file mode 100644 index be1a95f3a3..0000000000 --- a/addons/controllers/addon_controller.go +++ /dev/null @@ -1,652 +0,0 @@ -// Copyright 2020 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - "time" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/utils/pointer" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - controlplanev1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - clusterApiPredicates "sigs.k8s.io/cluster-api/util/predicates" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/builder" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/source" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - addonpredicates "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" - runtanzuv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" -) - -const ( - deleteRequeueAfter = 10 * time.Second -) - -// AddonReconciler contains the reconciler information for addon controllers. -type AddonReconciler struct { - Client client.Client - Log logr.Logger - Scheme *runtime.Scheme - controller controller.Controller - Config addonconfig.AddonControllerConfig -} - -// SetupWithManager performs the setup actions for an add on controller, using the passed in mgr. -func (r *AddonReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { - addonController, err := ctrl.NewControllerManagedBy(mgr). - For(&clusterapiv1beta1.Cluster{}). - Watches( - &source.Kind{Type: &corev1.Secret{}}, - handler.EnqueueRequestsFromMapFunc(r.AddonSecretToClusters), - builder.WithPredicates( - addonpredicates.AddonSecret(r.Log), - ), - ). - Watches( - &source.Kind{Type: &runtanzuv1alpha1.TanzuKubernetesRelease{}}, - handler.EnqueueRequestsFromMapFunc(r.TKRToClusters), - builder.WithPredicates( - addonpredicates.TKR(r.Log), - ), - ). - Watches( - &source.Kind{Type: &corev1.ConfigMap{}}, - handler.EnqueueRequestsFromMapFunc(r.BOMConfigMapToClusters), - builder.WithPredicates( - addonpredicates.BomConfigMap(r.Log), - ), - ). - Watches( - &source.Kind{Type: &controlplanev1beta1.KubeadmControlPlane{}}, - handler.EnqueueRequestsFromMapFunc(r.KubeadmControlPlaneToClusters), - builder.WithPredicates( - addonpredicates.KubeadmControlPlane(r.Log), - ), - ). - WithOptions(options). - WithEventFilter(clusterApiPredicates.ResourceNotPaused(r.Log)). - WithEventFilter(addonpredicates.ClusterHasLabel(constants.TKRLabel, r.Log)). - Build(r) - if err != nil { - r.Log.Error(err, "Error creating an addon controller") - return err - } - - r.controller = addonController - - return nil -} - -// Reconcile performs the reconciliation action for the controller. -func (r *AddonReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ ctrl.Result, reterr error) { - log := r.Log.WithValues(constants.ClusterNamespaceLogKey, req.Namespace, constants.ClusterNameLogKey, req.Name) - - // get cluster object - cluster := &clusterapiv1beta1.Cluster{} - if err := r.Client.Get(ctx, req.NamespacedName, cluster); err != nil { - if apierrors.IsNotFound(err) { - log.Info("Cluster not found") - return ctrl.Result{}, nil - } - - log.Error(err, "unable to fetch cluster") - return ctrl.Result{}, err - } - - tkrName := util.GetClusterLabel(cluster.Labels, constants.TKRLabel) - if tkrName == "" { - return ctrl.Result{}, nil - } - - tkr, err := util.GetTKRByNameV1Alpha1(ctx, r.Client, tkrName) - if err != nil { - log.Error(err, "unable to fetch TKR object", "name", tkrName) - return ctrl.Result{}, err - } - - // if tkr is not found, should not requeue for the reconciliation - if tkr == nil { - log.Info("TKR object not found", "name", tkrName) - return ctrl.Result{}, nil - } - - log.Info("Reconciling cluster") - - // if deletion timestamp is set, handle cluster deletion - if !cluster.GetDeletionTimestamp().IsZero() { - result, err := r.reconcileDelete(ctx, log, cluster) - if err != nil { - log.Error(err, "failed to reconcile cluster") - return ctrl.Result{}, err - } - return result, nil - } - - // reconcile addons in cluster - result, err := r.reconcileNormal(ctx, log, cluster) - if err != nil { - log.Error(err, "failed to reconcile cluster") - return ctrl.Result{}, err - } - - return result, nil -} - -// reconcileDelete deletes the addon secrets that belong to the cluster -func (r *AddonReconciler) reconcileDelete( - ctx context.Context, - log logr.Logger, - cluster *clusterapiv1beta1.Cluster) (ctrl.Result, error) { - - log.Info("Reconciling cluster deletion") - - // Get addon secrets for the cluster - addonSecrets, err := util.GetAddonSecretsForCluster(ctx, r.Client, cluster) - if err != nil { - log.Error(err, "Error getting addon secrets for cluster") - return ctrl.Result{}, err - } - - var errors []error - - // When cluster is deleted, we need to delete all the secrets. - for i := range addonSecrets.Items { - addonSecret := addonSecrets.Items[i] - addonName := util.GetAddonNameFromAddonSecret(&addonSecret) - - logWithContext := log.WithValues(constants.AddonSecretNamespaceLogKey, addonSecret.Namespace, - constants.AddonSecretNameLogKey, addonSecret.Name, constants.AddonNameLogKey, addonName) - - // Create a patch helper for addon secret - patchHelper, err := clusterapipatchutil.NewHelper(&addonSecret, r.Client) - if err != nil { - errors = append(errors, err) - continue - } - - // If App is remote i.e. App resides in the management cluster, delete the app and its secret - // from management cluster when the workload cluster is deleted. - // For Apps residing in workload cluster, it is not necessary to delete the app and its secret since the - // cluster itself is deleted. - if util.IsRemoteApp(&addonSecret) { - if err := r.reconcileAddonDelete(ctx, logWithContext, nil, &addonSecret); err != nil { - logWithContext.Error(err, "Error deleting remote app for addon") - errors = append(errors, err) - continue - } - } - - // Remove finalizer from addon secret - finalizerRemoved, _, err := r.removeFinalizerFromAddonSecret(ctx, logWithContext, false, nil, &addonSecret) - if err != nil { - logWithContext.Error(err, "Error removing metadata from addon secret") - errors = append(errors, err) - continue - } - - // Patch addon secret - if finalizerRemoved { - // Patch addon secret before returning the function - logWithContext.Info("Patching addon secret to remove finalizer") - if err := patchHelper.Patch(ctx, addonSecret.DeepCopy()); err != nil { - logWithContext.Error(err, "Error patching addon secret to remove finalizer") - errors = append(errors, err) - continue - } - } - - // Delete addon secret - if err := r.Client.Delete(ctx, &addonSecret); err != nil { - if apierrors.IsNotFound(err) { - logWithContext.Info("Addon secret not found") - continue - } - logWithContext.Error(err, "Error deleting addon secret") - errors = append(errors, err) - continue - } - } - - if len(errors) > 0 { - return ctrl.Result{}, kerrors.NewAggregate(errors) - } - - _, isManagmentCluster := cluster.Labels[constants.ManagementClusterRoleLabel] - if !isManagmentCluster { - err = r.removeFinalizer(ctx, cluster, cluster.DeepCopy()) - if err != nil { - log.Error(err, "failed to remove finalizer from cluster") - return ctrl.Result{}, err - } - } - - return ctrl.Result{}, nil -} - -// reconcileNormal reconciles the addons belonging to the cluster -func (r *AddonReconciler) reconcileNormal( - ctx context.Context, - log logr.Logger, - cluster *clusterapiv1beta1.Cluster) (ctrl.Result, error) { - - _, isManagmentCluster := cluster.Labels[constants.ManagementClusterRoleLabel] - if !isManagmentCluster { - err := r.addFinalizer(ctx, cluster, cluster.DeepCopy()) - if err != nil { - log.Error(err, "failed to add finalizer to cluster") - return ctrl.Result{}, err - } - } - - // Get addon secrets for the cluster - addonSecrets, err := util.GetAddonSecretsForCluster(ctx, r.Client, cluster) - if err != nil { - log.Error(err, "Error getting addon secrets for cluster") - return ctrl.Result{}, err - } - - // Get bom for cluster - bom, err := util.GetBOMForCluster(ctx, r.Client, cluster) - if err != nil { - log.Error(err, "Error getting BOM") - return ctrl.Result{}, err - } - - if bom == nil { - log.Info("Bom not found") - return ctrl.Result{}, nil - } - - // Get remote cluster live client. - remoteClient, err := util.GetClusterClient(ctx, r.Client, r.Scheme, clusterapiutil.ObjectKey(cluster)) - if err != nil { - log.Error(err, "Error getting remote cluster client") - return ctrl.Result{}, err - } - - // Get the repository used for all images - imageRepository, err := util.GetAddonImageRepository(ctx, r.Client, bom) - if err != nil || imageRepository == "" { - log.Info("Error getting image repository") - return ctrl.Result{}, err - } - - var ( - errors []error - result ctrl.Result - ) - // Skip reconcile core package repository in the management cluster if the package based cc is enabled. - // Because in the package based cc cluster, the core packages are managed by the tkr - _, isMgmtCluster := cluster.ObjectMeta.Labels[constants.ManagementClusterRoleLabel] - if isMgmtCluster && r.Config.FeatureGateClusterBootstrap { - log.Info("skip reconciling the core package repository on the management cluster when the package based cc is enabled") - } else { - // Reconcile core package repository in the cluster - pkgReconciler := &PackageReconciler{ctx: ctx, log: log, clusterClient: remoteClient, Config: r.Config} - err = pkgReconciler.reconcileCorePackageRepository(imageRepository, bom) - if err != nil { - log.Error(err, "Error reconciling core package repository") - errors = append(errors, err) - } - } - - for i := range addonSecrets.Items { - addonSecret := addonSecrets.Items[i] - logWithContext := log.WithValues(constants.AddonSecretNamespaceLogKey, addonSecret.Namespace, constants.AddonSecretNameLogKey, addonSecret.Name) - - result, err = r.reconcileAddonSecret(ctx, logWithContext, cluster, remoteClient, &addonSecret, imageRepository, bom) - if err != nil { - logWithContext.Error(err, "Error reconciling addon secret") - errors = append(errors, err) - continue - } - } - - if len(errors) > 0 { - return ctrl.Result{}, kerrors.NewAggregate(errors) - } - - return result, nil -} - -func (r *AddonReconciler) addFinalizer(ctx context.Context, o, deepCopy client.Object) error { - if !controllerutil.ContainsFinalizer(deepCopy, addontypes.AddonFinalizer) { - controllerutil.AddFinalizer(deepCopy, addontypes.AddonFinalizer) - return r.Client.Patch(ctx, deepCopy, client.MergeFrom(o)) - } - return nil -} - -func (r *AddonReconciler) removeFinalizer(ctx context.Context, o, deepCopy client.Object) error { - if controllerutil.ContainsFinalizer(deepCopy, addontypes.AddonFinalizer) { - controllerutil.RemoveFinalizer(deepCopy, addontypes.AddonFinalizer) - return r.Client.Patch(ctx, deepCopy, client.MergeFrom(o)) - } - return nil -} - -// reconcileNormal reconciles the addons belonging to the cluster -func (r *AddonReconciler) reconcileAddonSecret( - ctx context.Context, - log logr.Logger, - cluster *clusterapiv1beta1.Cluster, - clusterClient client.Client, - addonSecret *corev1.Secret, - imageRepository string, - bom *tkrv1.Bom) (_ ctrl.Result, retErr error) { - - var ( - patchAddonSecret bool - ) - - log.Info("Reconciling addon secret") - - addonName := util.GetAddonNameFromAddonSecret(addonSecret) - if addonName == "" { - log.Info("Addon name not found from addon secret") - return ctrl.Result{}, nil - } - - log.Info("Reconciling addon", constants.AddonNameLogKey, addonName) - - // Create a patch helper for addon secret - patchHelper, err := clusterapipatchutil.NewHelper(addonSecret, r.Client) - if err != nil { - return ctrl.Result{}, err - } - - // Patch addon secret before returning the function - defer func() { - // patchAddonSecret will be true if finalizer or ownerrefence is added/removed - if patchAddonSecret { - log.Info("Patching addon secret", constants.AddonNameLogKey, addonName) - - if err := patchHelper.Patch(ctx, addonSecret.DeepCopy()); err != nil { - log.Error(err, "Error patching addon secret", constants.AddonNameLogKey, addonName) - retErr = err - } - } - }() - - // If addon secret is marked for deletion then delete the addon, else create/patch it - if !addonSecret.GetDeletionTimestamp().IsZero() { - result, err := r.reconcileAddonSecretDelete(ctx, log, addonName, clusterClient, addonSecret, &patchAddonSecret) - if err != nil { - log.Error(err, "Error reconciling addon secret delete", constants.AddonNameLogKey, addonName) - return ctrl.Result{}, err - } - return result, nil - } - - result, err := r.reconcileAddonSecretNormal(ctx, log, addonName, cluster, clusterClient, addonSecret, &patchAddonSecret, imageRepository, bom) - if err != nil { - log.Error(err, "Error reconciling addon secret", constants.AddonNameLogKey, addonName) - return ctrl.Result{}, err - } - return result, nil -} - -// reconcileAddonSecretDelete reconciles a deletion of addon secret -func (r *AddonReconciler) reconcileAddonSecretDelete( - ctx context.Context, - log logr.Logger, - addonName string, - clusterClient client.Client, - addonSecret *corev1.Secret, - patchAddonSecret *bool) (ctrl.Result, error) { - - if r.shouldNotReconcile(log, addonSecret) { - return ctrl.Result{}, nil - } - - // delete remote app and data values secret - if err := r.reconcileAddonDelete(ctx, log, clusterClient, addonSecret); err != nil { - log.Error(err, "Error reconciling addon delete", constants.AddonNameLogKey, addonName) - return ctrl.Result{}, err - } - - // Remove finalizer from addon secret - finalizerRemoved, requeue, err := r.removeFinalizerFromAddonSecret(ctx, log, true, clusterClient, addonSecret) - if err != nil { - log.Error(err, "Error removing metadata from addon secret", constants.AddonNameLogKey, addonName) - return ctrl.Result{}, err - } - - *patchAddonSecret = finalizerRemoved - - if requeue { - return ctrl.Result{RequeueAfter: deleteRequeueAfter}, nil - } - - return ctrl.Result{}, nil -} - -// reconcileAddonSecretNormal reconciles a addon secret -func (r *AddonReconciler) reconcileAddonSecretNormal( - ctx context.Context, - log logr.Logger, - addonName string, - cluster *clusterapiv1beta1.Cluster, - clusterClient client.Client, - addonSecret *corev1.Secret, - patchAddonSecret *bool, - imageRepository string, - bom *tkrv1.Bom) (ctrl.Result, error) { - - // get addon config from BOM - addonConfig, err := bom.GetAddon(addonName) - if err != nil { - log.Info("Addon config not found from BOM for addon", constants.AddonNameLogKey, addonName) - return ctrl.Result{}, err - } - - // Add finalizer and owner reference to addon secret - metadataAdded := r.addMetadataToAddonSecret(log, cluster, addonSecret) - - *patchAddonSecret = metadataAdded - - if r.shouldNotReconcile(log, addonSecret) { - return ctrl.Result{}, nil - } - - // create/patch remote app and data values secret - if err := r.reconcileAddonNormal(ctx, log, cluster, clusterClient, addonSecret, &addonConfig, imageRepository, bom); err != nil { - log.Error(err, "Error reconciling addon", constants.AddonNameLogKey, addonName) - return ctrl.Result{}, err - } - - return ctrl.Result{}, nil -} - -// removeFinalizerFromAddonSecret removes finalizer from addon secret if it is present and returns true if it is removed -func (r *AddonReconciler) removeFinalizerFromAddonSecret( - ctx context.Context, - log logr.Logger, - checkAppBeforeRemoval bool, - clusterClient client.Client, - addonSecret *corev1.Secret) (finalizerRemoved, requeue bool, err error) { - - addonName := util.GetAddonNameFromAddonSecret(addonSecret) - - if checkAppBeforeRemoval { - appPresent, err := util.IsAppPresent(ctx, r.Client, clusterClient, addonSecret, r.Config.AddonNamespace) - if err != nil { - log.Error(err, "Error checking if app is present", constants.AddonNameLogKey, addonName) - return false, false, err - } - // If app is present, return without removing finalizer - if appPresent { - log.V(4).Info("App still present. Not removing finalizer", constants.AddonNameLogKey, addonName) - return false, true, nil - } - } - - // remove finalizer from addon secret - if controllerutil.ContainsFinalizer(addonSecret, addontypes.AddonFinalizer) { - log.Info("Removing finalizer from addon secret", constants.AddonNameLogKey, addonName) - controllerutil.RemoveFinalizer(addonSecret, addontypes.AddonFinalizer) - return true, false, nil - } - - return false, false, nil -} - -// addMetadataToAddonSecret adds finalizer and owner reference to the addon secret if not present and -// returns true if finalizer or owner reference is added -func (r *AddonReconciler) addMetadataToAddonSecret( - log logr.Logger, - cluster *clusterapiv1beta1.Cluster, - addonSecret *corev1.Secret) bool { - - var patchAddonSecret bool - - addonName := util.GetAddonNameFromAddonSecret(addonSecret) - - // add finalizer to addon secret - if !controllerutil.ContainsFinalizer(addonSecret, addontypes.AddonFinalizer) { - log.Info("Adding finalizer to addon secret", constants.AddonNameLogKey, addonName) - controllerutil.AddFinalizer(addonSecret, addontypes.AddonFinalizer) - patchAddonSecret = true - } - - // add owner reference to addon secret - ownerReference := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: "Cluster", - Name: cluster.Name, - UID: cluster.UID, - Controller: pointer.BoolPtr(true), - BlockOwnerDeletion: pointer.BoolPtr(true), - } - - if !clusterapiutil.HasOwnerRef(addonSecret.OwnerReferences, ownerReference) { - log.Info("Adding owner reference to addon secret", constants.AddonNameLogKey, addonName) - addonSecret.OwnerReferences = clusterapiutil.EnsureOwnerRef(addonSecret.OwnerReferences, ownerReference) - patchAddonSecret = true - } - - return patchAddonSecret -} - -func (r *AddonReconciler) shouldNotReconcile( - log logr.Logger, - addonSecret *corev1.Secret) bool { - - if util.IsAddonPaused(addonSecret) { - log.Info("Addon paused") - return true - } - - return false -} - -// logOperationResult logs the reconcile operation results -func logOperationResult(log logr.Logger, resourceName string, result controllerutil.OperationResult) { - switch result { - case controllerutil.OperationResultCreated, - controllerutil.OperationResultUpdated, - controllerutil.OperationResultUpdatedStatus, - controllerutil.OperationResultUpdatedStatusOnly: - log.Info(fmt.Sprintf("Resource %s %s", resourceName, result)) - default: - } -} - -// GetAddonKappResourceReconciler gets the correct kapp resource reconciler -func (r *AddonReconciler) GetAddonKappResourceReconciler( - ctx context.Context, - log logr.Logger, - clusterClient client.Client, - reconcilerType string) (AddonKappResourceReconciler, error) { - - switch reconcilerType { - case constants.TKGAppReconcilerKey: - return &AppReconciler{ctx: ctx, log: log, clusterClient: clusterClient, Config: r.Config}, nil - case constants.TKGPackageReconcilerKey: - return &PackageReconciler{ctx: ctx, log: log, clusterClient: clusterClient, Config: r.Config}, nil - } - return nil, fmt.Errorf("invalid reconciler type: %s", reconcilerType) -} - -// GetExternalCRDs returns all external custom resources that addon controller depends on -func GetExternalCRDs() (map[schema.GroupVersion]*sets.String, []client.Object) { - var crds = map[schema.GroupVersion]*sets.String{} - // cluster-api - clusterapiv1alpha3Resources := sets.NewString("clusters") - crds[clusterapiv1beta1.GroupVersion] = &clusterapiv1alpha3Resources - - controlplanev1alpha3Resources := sets.NewString("kubeadmcontrolplanes") - crds[controlplanev1beta1.GroupVersion] = &controlplanev1alpha3Resources - - // tkr - runtanzuv1alpha1Resources := sets.NewString("tanzukubernetesreleases") - crds[runtanzuv1alpha1.GroupVersion] = &runtanzuv1alpha1Resources - - // kapp-controller APIs - kappctrlv1alpha1Resources := sets.NewString("apps") - crds[kappctrl.SchemeGroupVersion] = &kappctrlv1alpha1Resources - - kapppkgv1alpha1Resources := sets.NewString("packageinstalls", "packagerepositories") - crds[kapppkg.SchemeGroupVersion] = &kapppkgv1alpha1Resources - - // Add CustomResourceDefinition for the above apis - clusterCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "clusters.cluster.x-k8s.io"}, - Spec: apiextensionsv1.CustomResourceDefinitionSpec{Group: "cluster.x-k8s.io", Versions: []apiextensionsv1.CustomResourceDefinitionVersion{{Name: "v1beta1"}}}, - } - - kubeadmcontrolplaneCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "kubeadmcontrolplanes.controlplane.cluster.x-k8s.io"}, - } - - PackageInstallCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "packageinstalls.packaging.carvel.dev"}, - } - - tanzukubernetesreleaseCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "tanzukubernetesreleases.run.tanzu.vmware.com"}, - } - - packagerepositorieCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "packagerepositories.packaging.carvel.dev"}, - } - - appCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "apps.kappctrl.k14s.io"}, - } - - initObjs := []client.Object{ - clusterCRD.DeepCopy(), - kubeadmcontrolplaneCRD.DeepCopy(), - PackageInstallCRD.DeepCopy(), - tanzukubernetesreleaseCRD.DeepCopy(), - packagerepositorieCRD.DeepCopy(), - appCRD.DeepCopy(), - } - - return crds, initObjs -} diff --git a/addons/controllers/addon_controller_test.go b/addons/controllers/addon_controller_test.go deleted file mode 100644 index 0abf09604d..0000000000 --- a/addons/controllers/addon_controller_test.go +++ /dev/null @@ -1,502 +0,0 @@ -// Copyright 2020 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "os" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - v1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/secret" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - pkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" -) - -var _ = Describe("Addon Reconciler", func() { - var ( - clusterName string - clusterResourceFilePath string - ) - - JustBeforeEach(func() { - // create cluster resources - By("Creating a cluster, tkr, BOM config map and addon secret") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - Expect(testutil.CreateResources(f, cfg, dynamicClient)).To(Succeed()) - - By("Creating kubeconfig for cluster") - Expect(testutil.CreateKubeconfigSecret(cfg, clusterName, "default", k8sClient)).To(Succeed()) - }) - - AfterEach(func() { - By("Deleting cluster, tkr, BOM config map and addon secret") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - Expect(testutil.DeleteResources(f, cfg, dynamicClient, true)).To(Succeed()) - - By("Deleting Addon data-values secrets") - addonSecretKey := client.ObjectKey{ - Namespace: addonNamespace, - Name: "antrea-data-values", - } - dataValuesSecret := &v1.Secret{} - Expect(k8sClient.Get(ctx, addonSecretKey, dataValuesSecret)).To(Succeed()) - Expect(k8sClient.Delete(ctx, dataValuesSecret)).To(Succeed()) - - By("Deleting Addon app CR") - appKey := client.ObjectKey{ - Namespace: addonNamespace, - Name: "antrea", - } - antreaApp := &kappctrl.App{} - // some testcases don't create App CR - k8sClient.Get(ctx, appKey, antreaApp) // nolint:errcheck - k8sClient.Delete(ctx, antreaApp) // nolint:errcheck - - By("Deleting kubeconfig for cluster") - key := client.ObjectKey{ - Namespace: "default", - Name: secret.Name(clusterName, secret.Kubeconfig), - } - s := &v1.Secret{} - Expect(k8sClient.Get(ctx, key, s)).To(Succeed()) - Expect(k8sClient.Delete(ctx, s)).To(Succeed()) - }) - - Context("reconcileAddonNormal for a tkr 1.18.1", func() { - - BeforeEach(func() { - clusterName = "test-cluster-1" - clusterResourceFilePath = "testdata/test-cluster-1.yaml" - }) - - It("Should create addon namespace, service account cluster admin service role and role binding", func() { - - Eventually(func() bool { - ns := &v1.NamespaceList{} - err := k8sClient.List(ctx, ns) - if err != nil { - return false - } - for _, n := range ns.Items { - if n.Name == addonNamespace { - return true - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - key := client.ObjectKey{ - Namespace: addonNamespace, - Name: addonServiceAccount, - } - svc := &v1.ServiceAccount{} - err := k8sClient.Get(ctx, key, svc) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - roles := &rbacv1.ClusterRoleList{} - err := k8sClient.List(ctx, roles) - if err != nil { - return false - } - for _, r := range roles.Items { - if r.Name == addonClusterRole { - rule := r.Rules[0] - if rule.APIGroups[0] == "*" && rule.Verbs[0] == "*" && rule.Resources[0] == "*" { - return true - } - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - roleBindings := &rbacv1.ClusterRoleBindingList{} - err := k8sClient.List(ctx, roleBindings) - if err != nil { - return false - } - for _, r := range roleBindings.Items { - if r.Name == addonClusterRoleBinding && - r.RoleRef.Name == addonClusterRole { - if r.Subjects[0].Name == addonServiceAccount && - r.Subjects[0].Namespace == addonNamespace { - return true - } - - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - }) - - It("Should create addon resources", func() { - - Eventually(func() bool { - key := client.ObjectKey{ - Namespace: addonNamespace, - Name: "antrea-data-values", - } - secret := &v1.Secret{} - err := k8sClient.Get(ctx, key, secret) - if err != nil { - return false - } - Expect(secret.Type).Should(Equal(v1.SecretTypeOpaque)) - secretData := string(secret.Data["values.yaml"]) - Expect(strings.Contains(secretData, "serviceCidr: 100.64.0.0/13")).Should(BeTrue()) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - key := client.ObjectKey{ - Namespace: addonNamespace, - Name: "antrea", - } - app := &kappctrl.App{} - Expect(k8sClient.Get(ctx, key, app)).To(Succeed()) - - Expect(app.Annotations[addontypes.AddonTypeAnnotation]).Should(Equal("cni/antrea")) - Expect(app.Annotations[addontypes.AddonNameAnnotation]).Should(Equal("test-cluster-1-antrea")) - // TODO why is this needed - Expect(app.Annotations[addontypes.AddonNamespaceAnnotation]).Should(Equal("default")) - - Expect(app.Spec.ServiceAccountName).Should(Equal(addonServiceAccount)) - - Expect(app.Spec.Fetch[0].Image.URL).Should(Equal("projects-stg.registry.vmware.com/tkg/addons/antrea-templates:98adbf4")) - - appTmplYtt := kappctrl.AppTemplateYtt{ - IgnoreUnknownComments: true, - Strict: false, - Inline: &kappctrl.AppFetchInline{ - PathsFrom: []kappctrl.AppFetchInlineSource{ - { - SecretRef: &kappctrl.AppFetchInlineSourceRef{ - Name: "antrea-data-values", - }, - }, - }, - }, - } - - Expect(*app.Spec.Template[0].Ytt).Should(Equal(appTmplYtt)) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - }) - }) - - Context("reconcileAddonNormal for a tkr 1.20.5", func() { - - BeforeEach(func() { - clusterName = "test-cluster-2" - clusterResourceFilePath = "testdata/test-cluster-2.yaml" - }) - - It("Should create addon resources", func() { - - Eventually(func() bool { - key := client.ObjectKey{ - Namespace: addonNamespace, - Name: "antrea-data-values", - } - secret := &v1.Secret{} - err := k8sClient.Get(ctx, key, secret) - if err != nil { - return false - } - Expect(secret.Type).Should(Equal(v1.SecretTypeOpaque)) - secretData := string(secret.Data["values.yaml"]) - Expect(secretData).Should(Equal("serviceCidr: 100.64.0.0/13\n")) - imageInfoData := string(secret.Data["imageInfo.yaml"]) - Expect(strings.Contains(imageInfoData, "imageRepository: projects.registry.vmware.com/tkg")).Should(BeTrue()) - Expect(strings.Contains(imageInfoData, "imagePath: antrea/antrea-debian")).Should(BeTrue()) - Expect(strings.Contains(imageInfoData, "tag: v0.11.3_vmware.2")).Should(BeTrue()) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - key := client.ObjectKey{ - Namespace: addonNamespace, - Name: "antrea", - } - app := &kappctrl.App{} - Expect(k8sClient.Get(ctx, key, app)).To(Succeed()) - - Expect(app.Annotations[addontypes.AddonTypeAnnotation]).Should(Equal("cni/antrea")) - Expect(app.Annotations[addontypes.AddonNameAnnotation]).Should(Equal("test-cluster-2-antrea")) - // TODO why is this needed - Expect(app.Annotations[addontypes.AddonNamespaceAnnotation]).Should(Equal("default")) - - Expect(app.Spec.ServiceAccountName).Should(Equal(addonServiceAccount)) - - Expect(app.Spec.Fetch[0].Image.URL).Should(Equal("projects.registry.vmware.com/tkg/tanzu_core/addons/antrea-templates:v1.3.1")) - - appTmplYtt := kappctrl.AppTemplateYtt{ - IgnoreUnknownComments: true, - Strict: false, - Inline: &kappctrl.AppFetchInline{ - PathsFrom: []kappctrl.AppFetchInlineSource{ - { - SecretRef: &kappctrl.AppFetchInlineSourceRef{ - Name: "antrea-data-values", - }, - }, - }, - }, - } - - Expect(*app.Spec.Template[0].Ytt).Should(Equal(appTmplYtt)) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - }) - - }) - - Context("reconcileAddonNormal for a tkr 1.20.6", func() { - - BeforeEach(func() { - clusterName = "test-cluster-3" - clusterResourceFilePath = "testdata/test-cluster-3.yaml" - }) - - It("Should create addon resources", func() { - - Eventually(func() bool { - key := client.ObjectKey{ - Namespace: addonNamespace, - Name: "antrea-data-values", - } - secret := &v1.Secret{} - err := k8sClient.Get(ctx, key, secret) - if err != nil { - return false - } - Expect(secret.Type).Should(Equal(v1.SecretTypeOpaque)) - secretData := string(secret.Data["values.yaml"]) - Expect(secretData).Should(Equal("serviceCidr: 100.64.0.0/13\n")) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - key := client.ObjectKey{ - Name: corePackageRepoName, - Namespace: addonNamespace, - } - pkgr := &pkgiv1alpha1.PackageRepository{} - Expect(k8sClient.Get(ctx, key, pkgr)).To(Succeed()) - - pkgrSpec := pkgiv1alpha1.PackageRepositorySpec{ - Fetch: &pkgiv1alpha1.PackageRepositoryFetch{ - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{ - Image: "projects.registry.vmware.com/tkg/tanzu_core_repo/core-package-repository:v1.4.0+vmware.0", - }, - }, - } - - Expect(pkgr.Spec).Should(Equal(pkgrSpec)) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - key := client.ObjectKey{ - Namespace: addonNamespace, - Name: "antrea", - } - ipkg := &pkgiv1alpha1.PackageInstall{} - Expect(k8sClient.Get(ctx, key, ipkg)).To(Succeed()) - - Expect(ipkg.Annotations[addontypes.AddonTypeAnnotation]).Should(Equal("cni/antrea")) - Expect(ipkg.Annotations[addontypes.AddonNameAnnotation]).Should(Equal("test-cluster-3-antrea")) - // TODO why is this needed - Expect(ipkg.Annotations[addontypes.AddonNamespaceAnnotation]).Should(Equal("default")) - - Expect(ipkg.Spec.ServiceAccountName).Should(Equal(addonServiceAccount)) - - Expect(ipkg.Spec.SyncPeriod).Should(Equal(&metav1.Duration{Duration: appSyncPeriod})) - Expect(ipkg.Spec.PackageRef).ShouldNot(BeNil()) - Expect(ipkg.Spec.PackageRef.RefName).Should(Equal("antrea.vmware.com")) - Expect(ipkg.Spec.PackageRef.VersionSelection.Prereleases).ShouldNot(Equal(nil)) - - ipkgValues := []pkgiv1alpha1.PackageInstallValues{ - { - SecretRef: &pkgiv1alpha1.PackageInstallValuesSecretRef{ - Name: "antrea-data-values", - }, - }, - } - - Expect(ipkg.Spec.Values).Should(Equal(ipkgValues)) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - key := client.ObjectKey{ - Namespace: "default", - Name: "test-cluster-3-kapp-controller", - } - app := &kappctrl.App{} - Expect(k8sClient.Get(ctx, key, app)).To(Succeed()) - - Expect(app.Annotations[addontypes.AddonTypeAnnotation]).Should(Equal("addons-management/kapp-controller")) - Expect(app.Annotations[addontypes.AddonNameAnnotation]).Should(Equal("test-cluster-3-kapp-controller")) - // TODO why is this needed - Expect(app.Annotations[addontypes.AddonNamespaceAnnotation]).Should(Equal("default")) - - appCluster := &kappctrl.AppCluster{ - KubeconfigSecretRef: &kappctrl.AppClusterKubeconfigSecretRef{ - Name: "test-cluster-3-kubeconfig", - Key: "value", - }, - } - Expect(app.Spec.Cluster).Should(Equal(appCluster)) - - Expect(app.Spec.Fetch[0].ImgpkgBundle.Image).Should(Equal("projects.registry.vmware.com/tkg/tanzu_core/addons/kapp-controller-package:v1.4.0+vmware.1")) - - appTmplYtt := kappctrl.AppTemplateYtt{ - IgnoreUnknownComments: true, - Strict: false, - Paths: []string{"config"}, - Inline: &kappctrl.AppFetchInline{ - PathsFrom: []kappctrl.AppFetchInlineSource{ - { - SecretRef: &kappctrl.AppFetchInlineSourceRef{ - Name: "test-cluster-3-kapp-controller-data-values", - }, - }, - }, - }, - } - - Expect(*app.Spec.Template[0].Ytt).Should(Equal(appTmplYtt)) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - }) - - }) - -}) - -var _ = Describe("Addon cluster finalizer", func() { - var ( - clusterName string - clusterNamespace string - clusterResourceFilePath string - finalizerPresent bool - ) - - JustBeforeEach(func() { - // create namespace - ns := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: clusterNamespace}} - Expect(k8sClient.Create(ctx, ns)).To(Succeed()) - clusterName = clusterNamespace + "-cluster" - clusterResourceFilePath = "testdata/test-" + clusterNamespace + ".yaml" - // create cluster resources - By("Creating cluster") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - Expect(testutil.CreateResources(f, cfg, dynamicClient)).To(Succeed()) - By("Creating kubeconfig for cluster") - Expect(testutil.CreateKubeconfigSecret(cfg, clusterName, clusterNamespace, k8sClient)).To(Succeed()) - - By("Check if finalizer is set correctly") - key := client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, cluster); err != nil { - return false - } - return controllerutil.ContainsFinalizer(cluster, addontypes.AddonFinalizer) == finalizerPresent - }, 20, pollingInterval).Should(BeTrue()) - - By("Check that finalizers is remove if necessary") - Expect(k8sClient.Delete(ctx, cluster)).To(Succeed()) - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, cluster); apierrors.IsNotFound(err) { - return false // if the cluster was deleted it means finalizer was removed. - } - Expect(err).To(BeNil()) // If error is not nil at this point lets fail test altogether - return controllerutil.ContainsFinalizer(cluster, addontypes.AddonFinalizer) - - }, 20, pollingInterval).Should(BeFalse()) - }) - - AfterEach(func() { - // some resources should have already been deleted by test, so we don't error out if this deletion attempt fails. - // we attempt to delete them in case something failed, so other tests don't get blocked by orphaned resources - By("Deleting cluster, tkr, BOM config map and addon secret") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - - testutil.DeleteResources(f, cfg, dynamicClient, true) // nolint:errcheck - - By("Deleting Addon data-values secrets") - addonSecretKey := client.ObjectKey{ - Namespace: addonNamespace, - Name: "antrea-data-values", - } - dataValuesSecret := &v1.Secret{} - k8sClient.Get(ctx, addonSecretKey, dataValuesSecret) // nolint:errcheck - k8sClient.Delete(ctx, dataValuesSecret) // nolint:errcheck - - By("Deleting Addon app CR") - appKey := client.ObjectKey{ - Namespace: addonNamespace, - Name: "antrea", - } - antreaApp := &kappctrl.App{} - // some testcases don't create App CR - k8sClient.Get(ctx, appKey, antreaApp) // nolint:errcheck - k8sClient.Delete(ctx, antreaApp) // nolint:errcheck - - By("Deleting kubeconfig for cluster") - key := client.ObjectKey{ - Namespace: clusterNamespace, - Name: secret.Name(clusterName, secret.Kubeconfig), - } - s := &v1.Secret{} - k8sClient.Get(ctx, key, s) // nolint:errcheck - k8sClient.Delete(ctx, s) // nolint:errcheck - }) - Context("workload cluster finalizer", func() { - BeforeEach(func() { - clusterNamespace = "workload-finalizer" - finalizerPresent = true - }) - It("Should add and remove finalizer to/from workload cluster", func() {}) - }) - - Context("management cluster finalizer", func() { - BeforeEach(func() { - clusterNamespace = "management-finalizer" - finalizerPresent = false - }) - It("Should add and remove finalizer to/from management cluster", func() {}) - }) -}) diff --git a/addons/controllers/addon_handlers.go b/addons/controllers/addon_handlers.go deleted file mode 100644 index 8d7b55ee8e..0000000000 --- a/addons/controllers/addon_handlers.go +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "errors" - "fmt" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - controlplanev1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - runtanzuv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" -) - -// TKRToClusters returns the clusters using TKR -func (r *AddonReconciler) TKRToClusters(o client.Object) []ctrl.Request { - var tkr *runtanzuv1alpha1.TanzuKubernetesRelease - - r.Log.V(4).Info("TKr to clusters handler") - - switch obj := o.(type) { - case *runtanzuv1alpha1.TanzuKubernetesRelease: - tkr = obj - default: - r.Log.Error(errors.New("invalid type"), - "Expected to receive TKr resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - log := r.Log.WithValues(constants.TKRNameLogKey, tkr.Name) - - log.V(4).Info("Mapping TKr to cluster") - - clusters, err := util.GetClustersByTKR(context.TODO(), r.Client, tkr) - if err != nil { - log.Error(err, "Error getting clusters using TKr") - return nil - } - - return r.clustersToRequests(clusters, log) -} - -func (r *AddonReconciler) clustersToRequests(clusters []*clusterv1beta1.Cluster, log logr.Logger) []ctrl.Request { - var requests []ctrl.Request - - for _, cluster := range clusters { - log.V(4).Info("Adding cluster for reconciliation", - constants.ClusterNamespaceLogKey, cluster.Namespace, constants.ClusterNameLogKey, cluster.Name) - - requests = append(requests, ctrl.Request{ - NamespacedName: clusterapiutil.ObjectKey(cluster), - }) - } - - return requests -} - -// AddonSecretToClusters returns the clusters on which the addon needs to be installed -func (r *AddonReconciler) AddonSecretToClusters(o client.Object) []ctrl.Request { - var secret *corev1.Secret - - r.Log.V(4).Info("Addon secret to clusters handler") - - switch obj := o.(type) { - case *corev1.Secret: - secret = obj - default: - r.Log.Error(errors.New("invalid type"), - "Expected to receive Secret resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - log := r.Log.WithValues(constants.AddonSecretNamespaceLogKey, secret.Namespace, constants.AddonSecretNameLogKey, secret.Name) - - log.V(4).Info("Mapping Addon Secret to cluster") - - clusterName := util.GetClusterNameFromAddonSecret(secret) - if clusterName == "" { - log.Info("Cluster name label not found on secret") - } - - cluster, err := util.GetClusterByName(context.TODO(), r.Client, secret.Namespace, clusterName) - if err != nil { - log.Error(err, "Error getting cluster object", - constants.ClusterNamespaceLogKey, secret.Namespace, constants.ClusterNameLogKey, clusterName) - return nil - } - - if cluster == nil { - log.Info("Cluster not found for addon secret") - return nil - } - - if !cluster.GetDeletionTimestamp().IsZero() { - log.Info("Cluster is getting deleted, so skipping request for cluster", - constants.ClusterNamespaceLogKey, secret.Namespace, constants.ClusterNameLogKey, clusterName) - return nil - } - - log.V(4).Info("Adding cluster for reconciliation", - constants.ClusterNamespaceLogKey, cluster.Namespace, constants.ClusterNameLogKey, cluster.Name) - - return []ctrl.Request{{ - NamespacedName: clusterapiutil.ObjectKey(cluster), - }} -} - -// BOMConfigMapToClusters returns the clusters using the BOM -func (r *AddonReconciler) BOMConfigMapToClusters(o client.Object) []ctrl.Request { - var configmap *corev1.ConfigMap - - r.Log.V(4).Info("BOM configmap to clusters handler") - - switch obj := o.(type) { - case *corev1.ConfigMap: - configmap = obj - default: - r.Log.Error(errors.New("invalid type"), - "Expected to receive ConfigMap resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - log := r.Log.WithValues(constants.BOMNamespaceLogKey, configmap.Namespace, constants.BOMNameLogKey, configmap.Name) - log.V(4).Info("Mapping BOM configmap to cluster") - - tkrName := util.GetTKRNameFromBOMConfigMap(configmap) - if tkrName == "" { - log.Info("TKr label not found on BOM configmap") - return nil - } - - tkr, err := util.GetTKRByNameV1Alpha1(context.TODO(), r.Client, tkrName) - if err != nil || tkr == nil { - log.Error(err, "Error getting TKr", constants.TKRNameLogKey, tkrName) - return nil - } - - clusters, err := util.GetClustersByTKR(context.TODO(), r.Client, tkr) - if err != nil { - log.Error(err, "Error getting clusters using TKr", constants.TKRNameLogKey, tkr.GetName()) - return nil - } - - return r.clustersToRequests(clusters, log) -} - -// KubeadmControlPlaneToClusters returns the cluster where kcp is present -func (r *AddonReconciler) KubeadmControlPlaneToClusters(o client.Object) []ctrl.Request { - var kcp *controlplanev1beta1.KubeadmControlPlane - - r.Log.V(4).Info("Kubeadm control plane to clusters handler") - - switch obj := o.(type) { - case *controlplanev1beta1.KubeadmControlPlane: - kcp = obj - default: - r.Log.Error(errors.New("invalid type"), - "Expected to receive kubeadm control plane resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - log := r.Log.WithValues(constants.KCPNamespaceLogKey, kcp.Namespace, constants.KCPNameLogKey, kcp.Name) - - log.V(4).Info("Mapping kubeadm control plane to cluster") - - cluster, err := util.GetOwnerCluster(context.TODO(), r.Client, &kcp.ObjectMeta) - if err != nil || cluster == nil { - log.Error(err, "Failed to get cluster owning kcp") - return nil - } - - if cluster == nil { - log.Info("Cluster not found for kcp") - return nil - } - - log.V(4).Info("Adding cluster for reconciliation", - constants.ClusterNamespaceLogKey, cluster.Namespace, constants.ClusterNameLogKey, cluster.Name) - - return []ctrl.Request{{ - NamespacedName: clusterapiutil.ObjectKey(cluster), - }} -} diff --git a/addons/controllers/addon_reconcilers.go b/addons/controllers/addon_reconcilers.go deleted file mode 100644 index 09867d9e0e..0000000000 --- a/addons/controllers/addon_reconcilers.go +++ /dev/null @@ -1,333 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" -) - -// AddonKappResourceReconciler is the interface for Kapp related reconcilers -type AddonKappResourceReconciler interface { - ReconcileAddonKappResourceNormal( - remoteApp bool, - remoteCluster *clusterapiv1beta1.Cluster, - addonSecret *corev1.Secret, - addonConfig *tkrv1.Addon, - imageRepository string, - bom *tkrv1.Bom) error - - ReconcileAddonKappResourceDelete( - addonSecret *corev1.Secret) error -} - -func (r *AddonReconciler) reconcileAddonNamespace( - ctx context.Context, - log logr.Logger, - clusterClient client.Client) error { - - addonNamespace := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: r.Config.AddonNamespace, - }, - } - - result, err := controllerutil.CreateOrPatch(ctx, clusterClient, addonNamespace, nil) - if err != nil { - log.Error(err, "Error creating or patching addon namespace") - return err - } - - logOperationResult(log, "addon namespace", result) - - return nil -} - -func (r *AddonReconciler) reconcileAddonServiceAccount( - ctx context.Context, - log logr.Logger, - clusterClient client.Client) error { - - addonServiceAccount := &corev1.ServiceAccount{ - ObjectMeta: metav1.ObjectMeta{ - Name: r.Config.AddonServiceAccount, - Namespace: r.Config.AddonNamespace, - }, - } - - result, err := controllerutil.CreateOrPatch(ctx, clusterClient, addonServiceAccount, nil) - if err != nil { - log.Error(err, "Error creating or patching addon service account") - return err - } - - logOperationResult(log, "addon service account", result) - - return nil -} - -func (r *AddonReconciler) reconcileAddonRole( - ctx context.Context, - log logr.Logger, - clusterClient client.Client) error { - - addonRole := &rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{ - Name: r.Config.AddonClusterRole, - }, - } - - addonRoleMutateFn := func() error { - addonRole.Rules = []rbacv1.PolicyRule{ - { - APIGroups: []string{"*"}, - Verbs: []string{"*"}, - Resources: []string{"*"}, - }, - } - - return nil - } - - roleResult, err := controllerutil.CreateOrPatch(ctx, clusterClient, addonRole, addonRoleMutateFn) - if err != nil { - log.Error(err, "Error creating or patching addon role") - return err - } - - logOperationResult(log, "addon role", roleResult) - - addonRoleBinding := &rbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{ - Name: r.Config.AddonClusterRoleBinding, - }, - } - - addonRoleBindingMutateFn := func() error { - addonRoleBinding.Subjects = []rbacv1.Subject{ - { - Kind: "ServiceAccount", - Name: r.Config.AddonServiceAccount, - Namespace: r.Config.AddonNamespace, - }, - } - - addonRoleBinding.RoleRef = rbacv1.RoleRef{ - APIGroup: "rbac.authorization.k8s.io", - Kind: "ClusterRole", - Name: r.Config.AddonClusterRole, - } - - return nil - } - - roleBindingResult, err := controllerutil.CreateOrPatch(ctx, clusterClient, addonRoleBinding, addonRoleBindingMutateFn) - if err != nil { - log.Error(err, "Error creating or patching addon role binding") - return err - } - - logOperationResult(log, "addon role binding", roleBindingResult) - - return nil -} - -func (r *AddonReconciler) reconcileAddonDataValuesSecretDelete( - ctx context.Context, - log logr.Logger, - clusterClient client.Client, - addonSecret *corev1.Secret) error { - - addonDataValuesSecret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateAppSecretNameFromAddonSecret(addonSecret), - Namespace: util.GenerateAppNamespaceFromAddonSecret(addonSecret, r.Config.AddonNamespace), - }, - } - - if err := clusterClient.Delete(ctx, addonDataValuesSecret); err != nil { - if apierrors.IsNotFound(err) { - log.Info("Addon data values secret not found") - return nil - } - log.Error(err, "Error deleting addon data values secret") - return err - } - - log.Info("Deleted app data value secret") - - return nil -} - -// ReconcileAddonDataValuesSecretNormal reconciles addons data values secrets -func (r *AddonReconciler) ReconcileAddonDataValuesSecretNormal( - ctx context.Context, - log logr.Logger, - clusterClient client.Client, - addonSecret *corev1.Secret, - addonConfig *tkrv1.Addon, - imageRepository string, - bom *tkrv1.Bom) error { - - addonDataValuesSecret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateAppSecretNameFromAddonSecret(addonSecret), - Namespace: util.GenerateAppNamespaceFromAddonSecret(addonSecret, r.Config.AddonNamespace), - }, - } - - addonDataValuesSecretMutateFn := func() error { - addonDataValuesSecret.Type = corev1.SecretTypeOpaque - addonDataValuesSecret.Data = map[string][]byte{} - for k, v := range addonSecret.Data { - addonDataValuesSecret.Data[k] = v - } - // Add or updates the imageInfo if container image reference exists - if len(addonConfig.AddonContainerImages) > 0 { - imageInfoBytes, err := util.GetImageInfo(addonConfig, imageRepository, r.Config.AddonImagePullPolicy, bom) - if err != nil { - log.Error(err, "Error retrieving addon image info") - return err - } - addonDataValuesSecret.Data["imageInfo.yaml"] = imageInfoBytes - } - - return nil - } - - result, err := controllerutil.CreateOrPatch(ctx, clusterClient, addonDataValuesSecret, addonDataValuesSecretMutateFn) - if err != nil { - log.Error(err, "Error creating or patching addon data values secret") - return err - } - - logOperationResult(log, "addon app data values secret", result) - - return nil -} - -func (r *AddonReconciler) reconcileAddonDelete( - ctx context.Context, - log logr.Logger, - remoteClusterClient client.Client, - addonSecret *corev1.Secret) error { - - addonName := util.GetAddonNameFromAddonSecret(addonSecret) - - logWithContext := r.Log.WithValues(constants.AddonNameLogKey, addonName) - logWithContext.Info("Reconciling addon delete") - - clusterClient := util.GetClientFromAddonSecret(addonSecret, r.Client, remoteClusterClient) - - var reconcilerKey string - // When deleting, check if the corresponding packageInstall is created. - // If so, delete packageInstall CR. Otherwise, delete App CR. - pkgiPresent, err := util.IsPackageInstallPresent(ctx, clusterClient, addonSecret, r.Config.AddonNamespace) - if err != nil { - log.Error(err, "Error checking if PackageInstall is present", constants.AddonNameLogKey, addonName) - return err - } - if pkgiPresent { - log.Info("Deleting PackageInstall") - reconcilerKey = constants.TKGPackageReconcilerKey - } else { - log.Info("Deleting App") - reconcilerKey = constants.TKGAppReconcilerKey - } - kappResourceReconciler, err := r.GetAddonKappResourceReconciler(ctx, logWithContext, clusterClient, reconcilerKey) - if err != nil { - log.Error(err, "Error finding kapp resource reconciler") - return err - } - - if err := kappResourceReconciler.ReconcileAddonKappResourceDelete(addonSecret); err != nil { - log.Error(err, "Error reconciling addon kapp resource delete") - return err - } - - if err := r.reconcileAddonDataValuesSecretDelete(ctx, logWithContext, clusterClient, addonSecret); err != nil { - log.Error(err, "Error reconciling addon data values secret delete") - return err - } - - return nil -} - -func (r *AddonReconciler) reconcileAddonNormal( - ctx context.Context, - log logr.Logger, - remoteCluster *clusterapiv1beta1.Cluster, - remoteClusterClient client.Client, - addonSecret *corev1.Secret, - addonConfig *tkrv1.Addon, - imageRepository string, - bom *tkrv1.Bom) error { - - addonName := util.GetAddonNameFromAddonSecret(addonSecret) - - logWithContext := r.Log.WithValues(constants.AddonNameLogKey, addonName) - logWithContext.Info("Reconciling addon") - - remoteApp := util.IsRemoteApp(addonSecret) - clusterClient := util.GetClientFromAddonSecret(addonSecret, r.Client, remoteClusterClient) - - /* remoteApp means App that lives in management cluster. but deployed in workload cluster. - * Since App doesn't deploy on workload cluster, namespace, serviceaccount, roles and rolebindings dont need to be created - * on management cluster. - */ - if !remoteApp { - if err := r.reconcileAddonNamespace(ctx, logWithContext, clusterClient); err != nil { - log.Error(err, "Error reconciling addon namespace") - return err - } - - if err := r.reconcileAddonServiceAccount(ctx, logWithContext, clusterClient); err != nil { - log.Error(err, "Error reconciling addon service account") - return err - } - - if err := r.reconcileAddonRole(ctx, logWithContext, clusterClient); err != nil { - log.Error(err, "Error reconciling addon roles and role bindings") - return err - } - } - - if err := r.ReconcileAddonDataValuesSecretNormal(ctx, logWithContext, clusterClient, addonSecret, addonConfig, imageRepository, bom); err != nil { - log.Error(err, "Error reconciling addon data values secret") - return err - } - - var reconcilerKey string - if addonConfig.PackageName != "" { - log.Info("Reconciling PackageInstall") - reconcilerKey = constants.TKGPackageReconcilerKey - } else { - log.Info("Reconciling App") - reconcilerKey = constants.TKGAppReconcilerKey - } - kappResourceReconciler, err := r.GetAddonKappResourceReconciler(ctx, logWithContext, clusterClient, reconcilerKey) - if err != nil { - log.Error(err, "Error finding kapp resource reconciler") - return err - } - - if err := kappResourceReconciler.ReconcileAddonKappResourceNormal(remoteApp, remoteCluster, addonSecret, addonConfig, imageRepository, bom); err != nil { - log.Error(err, "Error reconciling addon kapp resource") - return err - } - - return nil -} diff --git a/addons/controllers/antrea/antreaconfig_controller.go b/addons/controllers/antrea/antreaconfig_controller.go deleted file mode 100644 index 0818505dc5..0000000000 --- a/addons/controllers/antrea/antreaconfig_controller.go +++ /dev/null @@ -1,444 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package controllers implements k8s controller functionality for antrea. -package controllers - -import ( - "context" - "fmt" - "strings" - - "github.com/go-logr/logr" - "github.com/pkg/errors" - yaml "gopkg.in/yaml.v3" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - vsphere "sigs.k8s.io/cluster-api-provider-vsphere/apis/vmware/v1beta1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/source" - - nsxoperatorapi "github.com/vmware-tanzu/nsx-operator/pkg/apis/v1alpha1" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - cniv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha2" -) - -const ( - antreaTargetNameSpace = "vmware-system-antrea" - antreaSecretName = "supervisor-cred" - nsxServiceAccountAPIGroup = "nsx.vmware.com" - nsxServiceAccountKind = "nsxserviceaccounts" - clusterNameLabel = "tkg.tanzu.vmware.com/cluster-name" -) - -// vsphereAntreaConfigProviderServiceAccountAggregatedClusterRole is the cluster role to assign permissions to capv provider -var vsphereAntreaConfigProviderServiceAccountAggregatedClusterRole = &rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.VsphereAntreaConfigProviderServiceAccountAggregatedClusterRole, - Labels: map[string]string{ - constants.CAPVClusterRoleAggregationRuleLabelSelectorKey: constants.CAPVClusterRoleAggregationRuleLabelSelectorValue, - }, - }, -} - -// AntreaConfigReconciler reconciles a AntreaConfig object -type AntreaConfigReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Config addonconfig.AntreaConfigControllerConfig -} - -// +kubebuilder:rbac:groups=addons.tanzu.vmware.com,resources=antreaconfigs,verbs=get;list;watch;create;update;patch;delete -// +kubebuilder:rbac:groups=addons.tanzu.vmware.com,resources=antreaconfigs/status,verbs=get;update;patch -// +kubebuilder:rbac:groups=vmware.infrastructure.cluster.x-k8s.io,resources=providerserviceaccounts,verbs=get;create;list;watch;update;patch;delete -// +kubebuilder:rbac:groups=nsx.vmware.com,resources=nsxserviceaccounts,verbs=get;create;list;watch;update;patch;delete - -// Reconcile is part of the main kubernetes reconciliation loop which aims to -// move the current state of the cluster closer to the desired state. -// In Reconcile function, we compare the state specified by -// the AntreaConfig object against the actual cluster state, and then -// perform operations to make the cluster state reflect the state specified by -// the user. - -func (r *AntreaConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - log := r.Log.WithValues("antreaconfig", req.NamespacedName) - - r.Log.Info("Start reconciliation") - - // fetch AntreaConfig resource, ignore not-found errors - antreaConfig := &cniv1alpha2.AntreaConfig{} - if err := r.Client.Get(ctx, req.NamespacedName, antreaConfig); err != nil { - if apierrors.IsNotFound(err) { - r.Log.Info(fmt.Sprintf("AntreaConfig resource '%v' not found", req.NamespacedName)) - return ctrl.Result{}, nil - } - return ctrl.Result{}, err - } - - annotations := antreaConfig.GetAnnotations() - if _, ok := annotations[constants.TKGAnnotationTemplateConfig]; ok { - log.Info(fmt.Sprintf("resource '%v' is a config template. Skipping reconciling", req.NamespacedName)) - return ctrl.Result{}, nil - } - - labels := antreaConfig.GetLabels() - if _, ok := labels[addontypes.PackageNameLabel]; !ok { - r.Log.Info(fmt.Sprintf("AntreaConfig resource '%v' does not contains package name label", req.NamespacedName)) - return ctrl.Result{}, errors.New("AntreaConfig does not contains package name label") - } - - // deep copy AntreaConfig to avoid issues if in the future other controllers where interacting with the same copy - antreaConfig = antreaConfig.DeepCopy() - - cluster, err := cutil.GetOwnerCluster(ctx, r.Client, antreaConfig, req.Namespace, constants.AntreaDefaultRefName) - - if err != nil { - if apierrors.IsNotFound(err) && cluster != nil { - log.Info(fmt.Sprintf("'%s/%s' is listed as owner reference but could not be found", - cluster.Namespace, cluster.Name)) - return ctrl.Result{}, nil - } - log.Error(err, "could not determine owner cluster") - return ctrl.Result{}, err - } - - if retResult, err := r.ReconcileAntreaConfig(ctx, antreaConfig, cluster, log); err != nil { - log.Error(err, "unable to reconcile AntreaConfig") - return retResult, err - } - - return ctrl.Result{}, nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *AntreaConfigReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { - return ctrl.NewControllerManagedBy(mgr). - For(&cniv1alpha2.AntreaConfig{}). - WithOptions(options). - Watches( - &source.Kind{Type: &clusterapiv1beta1.Cluster{}}, - handler.EnqueueRequestsFromMapFunc(r.ClusterToAntreaConfig), - ). - WithEventFilter(predicates.ConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, constants.AntreaConfigKind, r.Config.SystemNamespace, r.Log)). - Complete(r) -} - -// ReconcileAntreaConfig reconciles AntreaConfig CR -func (r *AntreaConfigReconciler) ReconcileAntreaConfig( - ctx context.Context, - antreaConfig *cniv1alpha2.AntreaConfig, - cluster *clusterapiv1beta1.Cluster, - log logr.Logger) (_ ctrl.Result, retErr error) { - - patchHelper, err := clusterapipatchutil.NewHelper(antreaConfig, r.Client) - if err != nil { - return ctrl.Result{}, err - } - // Patch AntreaConfig before returning the function - defer func() { - log.Info("Patching AntreaConfig") - if err := patchHelper.Patch(ctx, antreaConfig); err != nil { - log.Error(err, "Error patching AntreaConfig") - retErr = err - } - log.Info("Successfully patched AntreaConfig") - }() - - // If AntreaConfig is marked for deletion, then no reconciliation is needed - if !antreaConfig.GetDeletionTimestamp().IsZero() { - r.deregisterAntreaNSX(ctx, antreaConfig, cluster) - return ctrl.Result{}, nil - } - - if err := r.ReconcileAntreaConfigNormal(ctx, antreaConfig, cluster, log); err != nil { - log.Error(err, "Error reconciling AntreaConfig to create data value secret") - return ctrl.Result{}, err - } - - log.Info("Successfully reconciled AntreaConfig") - return ctrl.Result{}, nil -} - -// ReconcileAntreaConfigNormal reconciles AntreaConfig by creating/patching data values secret -func (r *AntreaConfigReconciler) ReconcileAntreaConfigNormal( - ctx context.Context, - antreaConfig *cniv1alpha2.AntreaConfig, - cluster *clusterapiv1beta1.Cluster, - log logr.Logger) (retErr error) { - - // add owner reference to antreaConfig - ownerReference := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - - if !clusterapiutil.HasOwnerRef(antreaConfig.OwnerReferences, ownerReference) { - log.Info("Adding owner reference to AntreaConfig") - antreaConfig.OwnerReferences = clusterapiutil.EnsureOwnerRef(antreaConfig.OwnerReferences, ownerReference) - } - - if err := r.ReconcileAntreaConfigDataValue(ctx, antreaConfig, cluster, log); err != nil { - log.Error(err, "Error creating antreaConfig data value secret") - return err - } - - if antreaConfig.Spec.AntreaNsx.BootstrapFrom.ProviderRef != nil && antreaConfig.Spec.AntreaNsx.BootstrapFrom.Inline != nil { - err := fmt.Errorf("providerRef and inline should not be both set in AntreaConfig.spec.antreaNsx.bootstrapFrom") - antreaConfig.Status.Message = err.Error() - } else { - // clear the message here. - antreaConfig.Status.Message = "" - } - // update status.secretRef - dataValueSecretName := util.GenerateDataValueSecretName(cluster.Name, constants.AntreaAddonName) - antreaConfig.Status.SecretRef = dataValueSecretName - - return r.registerAntreaNSX(ctx, antreaConfig, cluster) -} - -func getClusterName(antreaConfig *cniv1alpha2.AntreaConfig) (name string, exists bool) { - name, exists = antreaConfig.Labels[clusterNameLabel] - if !exists { - index := strings.Index(antreaConfig.Name, "-antrea-package") - if index > 0 { - name = antreaConfig.Name[:index] - exists = true - } - } - return -} - -func (r *AntreaConfigReconciler) getProviderServiceAccountName(clusterName string) string { - return fmt.Sprintf("%s-antrea", clusterName) -} - -func (r *AntreaConfigReconciler) getNSXServiceAccountName(clusterName string) string { - return fmt.Sprintf("%s-antrea", clusterName) -} - -func (r *AntreaConfigReconciler) ensureNsxServiceAccount(ctx context.Context, antreaConfig *cniv1alpha2.AntreaConfig, cluster *clusterapiv1beta1.Cluster) error { - account := &nsxoperatorapi.NSXServiceAccount{} - - account.Name = r.getNSXServiceAccountName(cluster.Name) - account.Namespace = antreaConfig.Namespace - account.OwnerReferences = []metav1.OwnerReference{ - { - APIVersion: cluster.APIVersion, - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - }, - } - - err := r.Client.Get(ctx, types.NamespacedName{ - Namespace: account.Namespace, - Name: account.Name, - }, account) - if err == nil { - r.Log.Info("NSXServiceAccount %s/%s already exists", account.Namespace, account.Name) - return nil - } - if err != nil && !apierrors.IsNotFound(err) { - r.Log.Info("Found no existing NSXServiceAccount %s/%s", account.Namespace, account.Name) - return err - } - - result, err := controllerutil.CreateOrPatch(ctx, r.Client, account, nil) - if err != nil { - r.Log.Error(err, "Error creating or patching NSXServiceAccount", account.Namespace, account.Name) - } else { - r.Log.Info(fmt.Sprintf("NSXServiceAccount %s/%s created %s", account.Namespace, account.Name, result)) - } - return err -} - -func (r *AntreaConfigReconciler) ensureProviderServiceAccount(ctx context.Context, antreaConfig *cniv1alpha2.AntreaConfig, cluster *clusterapiv1beta1.Cluster) error { - provider := &vsphere.ProviderServiceAccount{} - vsphereCluster, err := cutil.VSphereClusterParavirtualForCAPICluster(ctx, r.Client, cluster) - if err != nil { - return err - } - clusterName, _ := getClusterName(antreaConfig) - nsxSAName := clusterName + "-antrea" - nsxSecretName := clusterName + "-antrea-nsx-cert" - clusterName = vsphereCluster.Name - providerServiceAccountRBACRules := []rbacv1.PolicyRule{ - { - APIGroups: []string{nsxServiceAccountAPIGroup}, - Resources: []string{nsxServiceAccountKind}, - ResourceNames: []string{nsxSAName}, - Verbs: []string{"get", "list", "watch"}, - }, - { - APIGroups: []string{""}, - Resources: []string{"secrets"}, - ResourceNames: []string{fmt.Sprintf(nsxSecretName)}, - Verbs: []string{"get", "list", "watch"}, - }, - } - _, err = controllerutil.CreateOrPatch(ctx, r.Client, vsphereAntreaConfigProviderServiceAccountAggregatedClusterRole, func() error { - vsphereAntreaConfigProviderServiceAccountAggregatedClusterRole.Rules = providerServiceAccountRBACRules - return nil - }) - if err != nil { - r.Log.Error(err, "Error creating or patching cluster role", "name", vsphereAntreaConfigProviderServiceAccountAggregatedClusterRole) - return err - } - provider.Name = r.getProviderServiceAccountName(clusterName) - provider.Namespace = antreaConfig.Namespace - provider.Spec = vsphere.ProviderServiceAccountSpec{ - Ref: &corev1.ObjectReference{ - APIVersion: cluster.APIVersion, - Kind: cluster.Kind, - Name: clusterName, - UID: cluster.UID, - }, - TargetNamespace: antreaTargetNameSpace, - TargetSecretName: antreaSecretName, - Rules: providerServiceAccountRBACRules, - } - result, err := controllerutil.CreateOrPatch(ctx, r.Client, provider, func() error { - return controllerutil.SetControllerReference(vsphereCluster, provider, r.Scheme) - }) - if err != nil { - r.Log.Error(err, "Error creating or patching ProviderServiceAccount", provider.Namespace, provider.Name) - } else { - r.Log.Info(fmt.Sprintf("ProviderServiceAccount %s/%s created %s: %+v", provider.Namespace, provider.Name, result, provider)) - } - return err -} - -func (r *AntreaConfigReconciler) registerAntreaNSX(ctx context.Context, antreaConfig *cniv1alpha2.AntreaConfig, cluster *clusterapiv1beta1.Cluster) error { - if !antreaConfig.Spec.AntreaNsx.Enable || antreaConfig.Spec.AntreaNsx.BootstrapFrom.Inline != nil { - r.Log.Info("antreaNsx is not enabled or inline is set, there is no ProviderServiceAccount or NsxServiceAccount to be created") - r.deregisterAntreaNSX(ctx, antreaConfig, cluster) - return nil - } - if antreaConfig.Spec.AntreaNsx.BootstrapFrom.ProviderRef != nil { - if strings.ToLower(antreaConfig.Spec.AntreaNsx.BootstrapFrom.ProviderRef.Kind) != nsxServiceAccountKind || - strings.ToLower(antreaConfig.Spec.AntreaNsx.BootstrapFrom.ProviderRef.ApiGroup) != nsxServiceAccountAPIGroup { - err := fmt.Errorf("either ProviderRef.Kind(%s) or ProviderRef.ApiGroup(%s) is invalid, expcted:ProviderRef.Kind(%s) ProviderRef.ApiGroup(%s)", - antreaConfig.Spec.AntreaNsx.BootstrapFrom.ProviderRef.Kind, antreaConfig.Spec.AntreaNsx.BootstrapFrom.ProviderRef.ApiGroup, - nsxServiceAccountKind, nsxServiceAccountAPIGroup) - antreaConfig.Status.Message = err.Error() - return err - } - } - antreaConfig.Status.Message = "" - err := r.ensureProviderServiceAccount(ctx, antreaConfig, cluster) - if err != nil { - return err - } - err = r.ensureNsxServiceAccount(ctx, antreaConfig, cluster) - return err -} - -func (r *AntreaConfigReconciler) deregisterAntreaNSX(ctx context.Context, antreaConfig *cniv1alpha2.AntreaConfig, cluster *clusterapiv1beta1.Cluster) error { - if !antreaConfig.Spec.AntreaNsx.Enable { - r.Log.Info("antreaNsx is not enabled, there is no ProviderServiceAccount or NsxServiceAccount to be deleted") - return nil - } - vsphereCluster, err := cutil.VSphereClusterParavirtualForCAPICluster(ctx, r.Client, cluster) - if err != nil { - if apierrors.IsNotFound(err) { - return nil - } - return err - } - clusterName, exists := getClusterName(antreaConfig) - if !exists { - return fmt.Errorf("invalid antreaConfig Name") - } - account := &nsxoperatorapi.NSXServiceAccount{} - - account.Name = r.getNSXServiceAccountName(clusterName) - account.Namespace = antreaConfig.Namespace - err = r.Client.Delete(ctx, account) - if err != nil && !apierrors.IsNotFound(err) { - r.Log.Error(err, "failed to delete NSXServiceAccount", account.Namespace, account.Name) - return err - } - - provider := &vsphere.ProviderServiceAccount{} - provider.Name = r.getProviderServiceAccountName(vsphereCluster.Name) - provider.Namespace = vsphereCluster.Namespace - err = r.Client.Delete(ctx, provider) - if err != nil && !apierrors.IsNotFound(err) { - r.Log.Error(err, "failed to delete ProviderServiceAccount", provider.Namespace, provider.Name) - return err - } - return nil -} - -// ReconcileAntreaConfigDataValue reconciles AntreaConfig data values secret -func (r *AntreaConfigReconciler) ReconcileAntreaConfigDataValue( - ctx context.Context, - antreaConfig *cniv1alpha2.AntreaConfig, - cluster *clusterapiv1beta1.Cluster, - log logr.Logger) (retErr error) { - - // prepare data values secret for AntreaConfig - antreaDataValuesSecret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateDataValueSecretName(cluster.Name, constants.AntreaAddonName), - Namespace: antreaConfig.Namespace, - OwnerReferences: []metav1.OwnerReference{{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - }}, - }, - } - - antreaDataValuesSecretMutateFn := func() error { - antreaDataValuesSecret.Type = corev1.SecretTypeOpaque - antreaDataValuesSecret.StringData = make(map[string]string) - - // marshall the yaml contents - antreaConfigYaml, err := mapAntreaConfigSpec(cluster, antreaConfig, r.Client) - if err != nil { - return err - } - - dataValueYamlBytes, err := yaml.Marshal(antreaConfigYaml) - if err != nil { - log.Error(err, "Error marshaling AntreaConfig to Yaml") - return err - } - - antreaDataValuesSecret.StringData[constants.TKGDataValueFileName] = string(dataValueYamlBytes) - - return nil - } - - result, err := controllerutil.CreateOrPatch(ctx, r.Client, antreaDataValuesSecret, antreaDataValuesSecretMutateFn) - if err != nil { - log.Error(err, "Error creating or patching antrea data values secret") - return err - } - - log.Info(fmt.Sprintf("Resource %s data values secret %s", constants.AntreaAddonName, result)) - - return nil -} diff --git a/addons/controllers/antrea/antreaconfig_util.go b/addons/controllers/antrea/antreaconfig_util.go deleted file mode 100644 index 645d1a4200..0000000000 --- a/addons/controllers/antrea/antreaconfig_util.go +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - "strings" - - "github.com/pkg/errors" - - "golang.org/x/mod/semver" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - cniv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha2" -) - -// AntreaConfigSpec defines the desired state of AntreaConfig -type AntreaConfigSpec struct { - InfraProvider string `yaml:"infraProvider"` - Antrea antrea `yaml:"antrea,omitempty"` - AntreaNsx antreaNsx `yaml:"antreaNsx,omitempty"` -} - -type antrea struct { - AntreaConfigDataValue antreaConfigDataValue `yaml:"config,omitempty"` -} - -type antreaNsx struct { - Enable bool `yaml:"enable,omitempty"` - BootstrapFrom antreaNsxBootstrapFrom `yaml:"bootstrapFrom,omitempty"` - AntreaNsxConfig antreaNsxConfig `yaml:"config,omitempty"` -} - -type antreaNsxBootstrapFrom struct { - // ProviderRef is used with uTKG, which will be filled by NCP operator - ProviderRef *antreaNsxProvider `yaml:"providerRef,omitempty"` - // Inline is used with TKGm, user need to fill in manually - Inline *antreaNsxInline `yaml:"inline,omitempty"` -} - -type antreaNsxProvider struct { - // Api version for nsxServiceAccount, its value is "nsx.vmware.com/v1alpha1" now - ApiVersion string `yaml:"apiVersion,omitempty"` - // Its value is NsxServiceAccount - Kind string `yaml:"kind,omitempty"` - // Name is the name for NsxServiceAccount - Name string `yaml:"name,omitempty"` -} - -type nsxCertRef struct { - // TLSCert is cert file to access nsx manager - TLSCert string `yaml:"tls.crt,omitempty"` - // TLSKey is key file to access nsx manager - TLSKey string `yaml:"tls.key,omitempty"` -} - -type antreaNsxInline struct { - NsxManagers []string `yaml:"nsxManagers,omitempty"` - ClusterName string `yaml:"clusterName,omitempty"` - NsxCertRef nsxCertRef `yaml:"NsxCert,omitempty"` -} - -type antreaNsxConfig struct { - InfraType string `yaml:"infraType,omitempty"` -} - -type antreaEgress struct { - EgressExceptCIDRs []string `yaml:"exceptCIDRs,omitempty"` -} - -type antreaNodePortLocal struct { - Enabled bool `yaml:"enabled,omitempty"` - PortRange string `yaml:"portRange,omitempty"` -} - -type antreaProxy struct { - ProxyAll bool `yaml:"proxyAll,omitempty"` - NodePortAddresses []string `yaml:"nodePortAddresses,omitempty"` - SkipServices []string `yaml:"skipServices,omitempty"` - ProxyLoadBalancerIPs bool `yaml:"proxyLoadBalancerIPs,omitempty"` -} - -type antreaFlowExporter struct { - CollectorAddress string `yaml:"collectorAddress,omitempty"` - PollInterval string `yaml:"pollInterval,omitempty"` - ActiveFlowTimeout string `yaml:"activeFlowTimeout,omitempty"` - IdleFlowTimeout string `yaml:"idleFlowTimeout,omitempty"` -} - -type antreaMultiCluster struct { - Enable bool `yaml:"enable,omitempty"` - Namespace string `yaml:"namespace,omitempty"` -} - -type antreaMulticast struct { - IGMPQueryInterval string `yaml:"igmpQueryInterval,omitempty"` -} - -type antreaWireGuard struct { - Port int `yaml:"port,omitempty"` -} - -type antreaConfigDataValue struct { - Egress antreaEgress `yaml:"egress,omitempty"` - NodePortLocal antreaNodePortLocal `yaml:"nodePortLocal,omitempty"` - AntreaProxy antreaProxy `yaml:"antreaProxy,omitempty"` - FlowExporter antreaFlowExporter `yaml:"flowExporter,omitempty"` - Multicast antreaMulticast `yaml:"multicast,omitempty"` - MultiCluster antreaMultiCluster `yaml:"multicluster,omitempty"` - KubeAPIServerOverride string `yaml:"kubeAPIServerOverride,omitempty"` - TransportInterface string `yaml:"transportInterface,omitempty"` - TransportInterfaceCIDRs []string `yaml:"transportInterfaceCIDRs,omitempty"` - MulticastInterfaces []string `yaml:"multicastInterfaces,omitempty"` - TunnelType string `yaml:"tunnelType,omitempty"` - TunnelPort int `yaml:"tunnelPort,omitempty"` - TunnelCsum bool `yaml:"tunnelCsum,omitempty"` - TrafficEncryptionMode string `yaml:"trafficEncryptionMode,omitempty"` - EnableUsageReporting bool `yaml:"enableUsageReporting,omitempty"` - WireGuard antreaWireGuard `yaml:"wireGuard,omitempty"` - ServiceCIDR string `yaml:"serviceCIDR,omitempty"` - ServiceCIDRv6 string `yaml:"serviceCIDRv6,omitempty"` - TrafficEncapMode string `yaml:"trafficEncapMode,omitempty"` - NoSNAT bool `yaml:"noSNAT,omitempty"` - TLSCipherSuites string `yaml:"tlsCipherSuites,omitempty"` - DisableUDPTunnelOffload bool `yaml:"disableUdpTunnelOffload"` - DefaultMTU string `yaml:"defaultMTU,omitempty"` - EnableBridgingMode bool `yaml:"enableBridgingMode,omitempty"` - DisableTXChecksumOffload bool `yaml:"disableTXChecksumOffload,omitempty"` - DNSServerOverride string `yaml:"dnsServerOverride,omitempty"` - FeatureGates antreaFeatureGates `yaml:"featureGates,omitempty"` -} - -type antreaFeatureGates struct { - AntreaProxy bool `yaml:"AntreaProxy"` - EndpointSlice bool `yaml:"EndpointSlice"` - AntreaPolicy bool `yaml:"AntreaPolicy"` - FlowExporter bool `yaml:"FlowExporter"` - Egress bool `yaml:"Egress"` - NodePortLocal bool `yaml:"NodePortLocal"` - AntreaTraceflow bool `yaml:"AntreaTraceflow"` - NetworkPolicyStats bool `yaml:"NetworkPolicyStats"` - AntreaIPAM bool `yaml:"AntreaIPAM"` - ServiceExternalIP bool `yaml:"ServiceExternalIP"` - Multicast bool `yaml:"Multicast"` - MultiCluster *bool `yaml:"Multicluster,omitempty"` - SecondaryNetwork *bool `yaml:"SecondaryNetwork,omitempty"` - TrafficControl *bool `yaml:"TrafficControl,omitempty"` - TopologyAwareHints *bool `yaml:"TopologyAwareHints,omitempty"` -} - -// ClusterToAntreaConfig returns a list of Requests with AntreaConfig ObjectKey -func (r *AntreaConfigReconciler) ClusterToAntreaConfig(o client.Object) []ctrl.Request { - cluster, ok := o.(*clusterv1beta1.Cluster) - if !ok { - r.Log.Error(errors.New("invalid type"), - "Expected to receive Cluster resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - r.Log.V(4).Info("Mapping cluster to AntreaConfig") - - configs := &cniv1alpha2.AntreaConfigList{} - - if err := r.Client.List(context.Background(), configs); err != nil { - r.Log.Error(err, "Error listing AntreaConfig") - return nil - } - - var requests []ctrl.Request - for i := range configs.Items { - config := &configs.Items[i] - if config.Namespace == cluster.Namespace { - // avoid enqueuing reconcile requests for template AntreaConfig CRs in event handler of Cluster CR - if _, ok := config.Annotations[constants.TKGAnnotationTemplateConfig]; ok && config.Namespace == r.Config.SystemNamespace { - continue - } - - // corresponding AntreaConfig should have following ownerRef - ownerReference := metav1.OwnerReference{ - APIVersion: clusterv1beta1.GroupVersion.String(), - // explicitly set the cluster kind from variable instead from casted object - Kind: constants.ClusterKind, - Name: cluster.Name, - UID: cluster.UID, - } - - if clusterapiutil.HasOwnerRef(config.OwnerReferences, ownerReference) { - r.Log.V(4).Info("Adding AntreaConfig for reconciliation", - constants.NamespaceLogKey, config.Namespace, constants.NameLogKey, config.Name) - - requests = append(requests, ctrl.Request{ - NamespacedName: clusterapiutil.ObjectKey(config), - }) - } - } - } - - return requests -} - -func mapAntreaConfigSpec(cluster *clusterv1beta1.Cluster, config *cniv1alpha2.AntreaConfig, client client.Client) (*AntreaConfigSpec, error) { - - packageName := config.GetLabels()[addontypes.PackageNameLabel] - version := strings.TrimPrefix(strings.Split(packageName, "---")[0], "antrea.tanzu.vmware.com.") - version = "v" + version - - configSpec := &AntreaConfigSpec{} - - // Derive InfraProvider from the cluster - infraProvider, err := util.GetInfraProvider(cluster) - if err != nil { - return nil, errors.Wrap(err, "Unable to get InfraProvider") - } - - configSpec.InfraProvider = infraProvider - - // Derive ServiceCIDRs from the cluster - serviceCIDR, serviceCIDRv6, err := util.GetServiceCIDRs(cluster) - if err != nil { - return nil, errors.Wrap(err, "Unable to get serviceCIDR") - } - - // Note: ServiceCIDR and ServiceCIDRv6 are automatically ignored when AntreaProxy is enabled - configSpec.Antrea.AntreaConfigDataValue.ServiceCIDR = serviceCIDR - configSpec.Antrea.AntreaConfigDataValue.ServiceCIDRv6 = serviceCIDRv6 - - configSpec.Antrea.AntreaConfigDataValue.Egress.EgressExceptCIDRs = config.Spec.Antrea.AntreaConfigDataValue.Egress.EgressExceptCIDRs - configSpec.Antrea.AntreaConfigDataValue.NodePortLocal.Enabled = config.Spec.Antrea.AntreaConfigDataValue.NodePortLocal.Enabled - configSpec.Antrea.AntreaConfigDataValue.NodePortLocal.PortRange = config.Spec.Antrea.AntreaConfigDataValue.NodePortLocal.PortRange - configSpec.Antrea.AntreaConfigDataValue.AntreaProxy.ProxyAll = config.Spec.Antrea.AntreaConfigDataValue.AntreaProxy.ProxyAll - configSpec.Antrea.AntreaConfigDataValue.AntreaProxy.NodePortAddresses = config.Spec.Antrea.AntreaConfigDataValue.AntreaProxy.NodePortAddresses - configSpec.Antrea.AntreaConfigDataValue.AntreaProxy.SkipServices = config.Spec.Antrea.AntreaConfigDataValue.AntreaProxy.SkipServices - configSpec.Antrea.AntreaConfigDataValue.AntreaProxy.ProxyLoadBalancerIPs = config.Spec.Antrea.AntreaConfigDataValue.AntreaProxy.ProxyLoadBalancerIPs - configSpec.Antrea.AntreaConfigDataValue.FlowExporter.CollectorAddress = config.Spec.Antrea.AntreaConfigDataValue.AntreaFlowExporter.CollectorAddress - configSpec.Antrea.AntreaConfigDataValue.FlowExporter.PollInterval = config.Spec.Antrea.AntreaConfigDataValue.AntreaFlowExporter.PollInterval - configSpec.Antrea.AntreaConfigDataValue.FlowExporter.ActiveFlowTimeout = config.Spec.Antrea.AntreaConfigDataValue.AntreaFlowExporter.ActiveFlowTimeout - configSpec.Antrea.AntreaConfigDataValue.FlowExporter.IdleFlowTimeout = config.Spec.Antrea.AntreaConfigDataValue.AntreaFlowExporter.IdleFlowTimeout - - configSpec.Antrea.AntreaConfigDataValue.KubeAPIServerOverride = config.Spec.Antrea.AntreaConfigDataValue.KubeAPIServerOverride - configSpec.Antrea.AntreaConfigDataValue.TransportInterface = config.Spec.Antrea.AntreaConfigDataValue.TransportInterface - configSpec.Antrea.AntreaConfigDataValue.TransportInterfaceCIDRs = config.Spec.Antrea.AntreaConfigDataValue.TransportInterfaceCIDRs - configSpec.Antrea.AntreaConfigDataValue.MulticastInterfaces = config.Spec.Antrea.AntreaConfigDataValue.MulticastInterfaces - configSpec.Antrea.AntreaConfigDataValue.TunnelType = config.Spec.Antrea.AntreaConfigDataValue.TunnelType - configSpec.Antrea.AntreaConfigDataValue.EnableUsageReporting = config.Spec.Antrea.AntreaConfigDataValue.EnableUsageReporting - configSpec.Antrea.AntreaConfigDataValue.WireGuard.Port = config.Spec.Antrea.AntreaConfigDataValue.WireGuard.Port - configSpec.Antrea.AntreaConfigDataValue.TrafficEncapMode = config.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode - configSpec.Antrea.AntreaConfigDataValue.NoSNAT = config.Spec.Antrea.AntreaConfigDataValue.NoSNAT - configSpec.Antrea.AntreaConfigDataValue.TLSCipherSuites = config.Spec.Antrea.AntreaConfigDataValue.TLSCipherSuites - configSpec.Antrea.AntreaConfigDataValue.DisableUDPTunnelOffload = config.Spec.Antrea.AntreaConfigDataValue.DisableUDPTunnelOffload - configSpec.Antrea.AntreaConfigDataValue.DefaultMTU = config.Spec.Antrea.AntreaConfigDataValue.DefaultMTU - - if semver.Compare(version, "v1.7.1") >= 0 { - configSpec.Antrea.AntreaConfigDataValue.MultiCluster.Enable = config.Spec.Antrea.AntreaConfigDataValue.MultiCluster.Enable - configSpec.Antrea.AntreaConfigDataValue.MultiCluster.Namespace = config.Spec.Antrea.AntreaConfigDataValue.MultiCluster.Namespace - configSpec.Antrea.AntreaConfigDataValue.EnableBridgingMode = config.Spec.Antrea.AntreaConfigDataValue.EnableBridgingMode - configSpec.Antrea.AntreaConfigDataValue.DisableTXChecksumOffload = config.Spec.Antrea.AntreaConfigDataValue.DisableTXChecksumOffload - configSpec.Antrea.AntreaConfigDataValue.DNSServerOverride = config.Spec.Antrea.AntreaConfigDataValue.DNSServerOverride - configSpec.Antrea.AntreaConfigDataValue.Multicast.IGMPQueryInterval = config.Spec.Antrea.AntreaConfigDataValue.Multicast.IGMPQueryInterval - } - - if semver.Compare(version, "v1.9.0") >= 0 { - configSpec.Antrea.AntreaConfigDataValue.TunnelPort = config.Spec.Antrea.AntreaConfigDataValue.TunnelPort - configSpec.Antrea.AntreaConfigDataValue.TunnelCsum = config.Spec.Antrea.AntreaConfigDataValue.TunnelCsum - } - - // FeatureGates - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaProxy = config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaProxy - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.EndpointSlice = config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.EndpointSlice - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaPolicy = config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaPolicy - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.FlowExporter = config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.FlowExporter - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.Egress = config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.Egress - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.NodePortLocal = config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.NodePortLocal - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaTraceflow = config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaTraceflow - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.NetworkPolicyStats = config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.NetworkPolicyStats - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaIPAM = config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaIPAM - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.ServiceExternalIP = config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.ServiceExternalIP - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.Multicast = config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.Multicast - - if semver.Compare(version, "v1.7.1") >= 0 { - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.SecondaryNetwork = &config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.SecondaryNetwork - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.TrafficControl = &config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.TrafficControl - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.MultiCluster = &config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.MultiCluster - } - - if semver.Compare(version, "v1.9.0") >= 0 { - configSpec.Antrea.AntreaConfigDataValue.FeatureGates.TopologyAwareHints = &config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.TopologyAwareHints - } - - return configSpec, nil -} diff --git a/addons/controllers/antreaconfig_controller_test.go b/addons/controllers/antreaconfig_controller_test.go deleted file mode 100644 index 7f177ac525..0000000000 --- a/addons/controllers/antreaconfig_controller_test.go +++ /dev/null @@ -1,616 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "fmt" - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "gopkg.in/yaml.v3" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - capvvmwarev1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/vmware/v1beta1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - antreatype "github.com/vmware-tanzu/tanzu-framework/addons/controllers/antrea" - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - cniv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha2" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -var _ = Describe("AntreaConfig Reconciler and Webhooks", func() { - var ( - clusterName string - clusterNamespace string - configCRName string - configName string - clusterResourceFilePath string - err error - f *os.File - tkrString string - newDefaultMTU string - clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap - clusterBoostrapFile string - clusterInfraName string - ) - - const ( - waitTimeout = waitTimeout //use this to change test speed when debugging - antreaManifestsTestFile1 = "testdata/antrea-test-1.yaml" - antreamanifestsTestFile2 = "testdata/antrea-test-2.yaml" - antreaTemplateConfigManifestsTestFile1 = "testdata/antrea-test-template-config-1.yaml" - antreaTestCluster1 = "test-cluster-4" - antreaTestCluster2 = "test-cluster-5" - vsphereCluster1 = "test-cluster-5-6gvvc" - ) - - JustBeforeEach(func() { - // Create the admission webhooks - f, err = os.Open(cniWebhookManifestFile) - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - - // set up the certificates and webhook before creating any objects - By("Creating and installing new certificates for Antrea Admission Webhooks") - err = testutil.SetupWebhookCertificates(ctx, k8sClient, k8sConfig, &webhookCertDetails) - Expect(err).ToNot(HaveOccurred()) - - // create cluster resources - By("Creating a cluster and a AntreaConfig") - f, err = os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - }) - - AfterEach(func() { - By("Deleting cluster and AntreaConfig") - f, err = os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - err = testutil.DeleteResources(f, cfg, dynamicClient, true) - Expect(err).ToNot(HaveOccurred()) - f.Close() - - By("Deleting the Admission Webhook configuration for Antrea") - f, err = os.Open(cniWebhookManifestFile) - Expect(err).ToNot(HaveOccurred()) - err = testutil.DeleteResources(f, cfg, dynamicClient, true) - Expect(err).ToNot(HaveOccurred()) - f.Close() - }) - - Context("Reconcile AntreaConfig for management cluster", func() { - - BeforeEach(func() { - clusterName = antreaTestCluster1 - clusterNamespace = defaultString - configCRName = util.GeneratePackageSecretName(clusterName, constants.AntreaDefaultRefName) - clusterResourceFilePath = antreaManifestsTestFile1 - }) - - It("Should reconcile AntreaConfig and create data value secret on management cluster", func() { - - clusterKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - configKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: configCRName, - } - - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - err := k8sClient.Get(ctx, clusterKey, cluster) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue()) - - config := &cniv1alpha2.AntreaConfig{} - Eventually(func() bool { - err := k8sClient.Get(ctx, configKey, config) - if err != nil { - return false - } - - // Check owner reference - if len(config.OwnerReferences) == 0 { - return false - } - - Expect(len(config.OwnerReferences)).Should(Equal(1)) - Expect(config.OwnerReferences[0].Name).Should(Equal(clusterName)) - - Expect(config.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode).Should(Equal("encap")) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaTraceflow).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaPolicy).Should(Equal(true)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.FlowExporter).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaIPAM).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.ServiceExternalIP).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.Multicast).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.MultiCluster).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.SecondaryNetwork).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.TrafficControl).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.NodePortLocal).Should(Equal(true)) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - cluster := &clusterapiv1beta1.Cluster{} - err := k8sClient.Get(ctx, clusterKey, cluster) - if err != nil { - return false - } - - serviceCIDR, serviceCIDRv6, err := util.GetServiceCIDRs(cluster) - if err != nil { - return false - } - - infraProvider, err := util.GetInfraProvider(cluster) - if err != nil { - return false - } - - // Check infraProvider values - Expect(infraProvider).Should(Equal("docker")) - - // Check ServiceCIDR and ServiceCIDRv6 values - Expect(serviceCIDR).Should(Equal("192.168.0.0/16")) - Expect(serviceCIDRv6).Should(Equal("fd00:100:96::/48")) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: util.GenerateDataValueSecretName(clusterName, constants.AntreaAddonName), - } - secret := &v1.Secret{} - err := k8sClient.Get(ctx, secretKey, secret) - if err != nil { - return false - } - Expect(secret.Type).Should(Equal(v1.SecretTypeOpaque)) - - // check data value secret contents - content := secret.Data["values.yaml"] - spec := antreatype.AntreaConfigSpec{} - err = yaml.Unmarshal(content, &spec) - if err != nil { - return false - } - Expect(spec.Antrea.AntreaConfigDataValue.ServiceCIDR).Should(Equal("192.168.0.0/16")) - Expect(spec.Antrea.AntreaConfigDataValue.ServiceCIDRv6).Should(Equal("fd00:100:96::/48")) - Expect(spec.InfraProvider).Should(Equal("docker")) - Expect(spec.Antrea.AntreaConfigDataValue.TrafficEncapMode).Should(Equal("encap")) - Expect(spec.Antrea.AntreaConfigDataValue.TLSCipherSuites).Should(Equal("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384")) - Expect(spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaProxy).Should(Equal(true)) - Expect(spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaPolicy).Should(Equal(true)) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - // Check status.secretRef after reconciliation - config := &cniv1alpha2.AntreaConfig{} - err := k8sClient.Get(ctx, configKey, config) - if err != nil { - return false - } - return config.Status.SecretRef == util.GenerateDataValueSecretName(clusterName, constants.AntreaAddonName) - }, waitTimeout, pollingInterval).Should(BeTrue()) - - }) - - }) - - Context("Reconcile AntreaConfig with antreaNsx enabled for management cluster", func() { - - BeforeEach(func() { - clusterName = antreaTestCluster2 - clusterNamespace = defaultString - configCRName = util.GeneratePackageSecretName(clusterName, constants.AntreaDefaultRefName) - clusterResourceFilePath = antreamanifestsTestFile2 - }) - - It("Should reconcile AntreaConfig and create data value secret on management cluster", func() { - - clusterKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - configKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: configCRName, - } - - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - err := k8sClient.Get(ctx, clusterKey, cluster) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue()) - - config := &cniv1alpha2.AntreaConfig{} - Eventually(func() bool { - err := k8sClient.Get(ctx, configKey, config) - if err != nil { - return false - } - - // Check owner reference - if len(config.OwnerReferences) == 0 { - return false - } - - Expect(len(config.OwnerReferences)).Should(Equal(1)) - Expect(config.OwnerReferences[0].Name).Should(Equal(clusterName)) - - Expect(config.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode).Should(Equal("encap")) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaTraceflow).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaPolicy).Should(Equal(true)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.FlowExporter).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaIPAM).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.ServiceExternalIP).Should(Equal(false)) - Expect(config.Spec.Antrea.AntreaConfigDataValue.FeatureGates.Multicast).Should(Equal(false)) - Expect(config.Spec.AntreaNsx.Enable).Should(Equal(true)) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - cluster := &clusterapiv1beta1.Cluster{} - err := k8sClient.Get(ctx, clusterKey, cluster) - if err != nil { - return false - } - - serviceCIDR, serviceCIDRv6, err := util.GetServiceCIDRs(cluster) - if err != nil { - return false - } - - infraProvider, err := util.GetInfraProvider(cluster) - if err != nil { - return false - } - - // Check infraProvider values - Expect(infraProvider).Should(Equal("vsphere")) - - // Check ServiceCIDR and ServiceCIDRv6 values - Expect(serviceCIDR).Should(Equal("192.168.0.0/16")) - Expect(serviceCIDRv6).Should(Equal("fd00:100:96::/48")) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: util.GenerateDataValueSecretName(clusterName, constants.AntreaAddonName), - } - secret := &v1.Secret{} - err := k8sClient.Get(ctx, secretKey, secret) - if err != nil { - return false - } - Expect(secret.Type).Should(Equal(v1.SecretTypeOpaque)) - - // check data value secret contents - content := secret.Data["values.yaml"] - spec := antreatype.AntreaConfigSpec{} - err = yaml.Unmarshal(content, &spec) - if err != nil { - return false - } - Expect(spec.Antrea.AntreaConfigDataValue.ServiceCIDR).Should(Equal("192.168.0.0/16")) - Expect(spec.Antrea.AntreaConfigDataValue.ServiceCIDRv6).Should(Equal("fd00:100:96::/48")) - Expect(spec.InfraProvider).Should(Equal("vsphere")) - Expect(spec.Antrea.AntreaConfigDataValue.TrafficEncapMode).Should(Equal("encap")) - Expect(spec.Antrea.AntreaConfigDataValue.TLSCipherSuites).Should(Equal("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384")) - Expect(spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaProxy).Should(Equal(true)) - Expect(spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaPolicy).Should(Equal(true)) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - // Check status.secretRef after reconciliation - config := &cniv1alpha2.AntreaConfig{} - err := k8sClient.Get(ctx, configKey, config) - if err != nil { - return false - } - return config.Status.SecretRef == util.GenerateDataValueSecretName(clusterName, constants.AntreaAddonName) - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // check if ProviderServiceAccount is created - By("check ProviderServiceAccount is created") - serviceAccount := &capvvmwarev1beta1.ProviderServiceAccount{} - Eventually(func() bool { - serviceAccountKey := client.ObjectKey{ - Namespace: defaultString, - Name: fmt.Sprintf("%s-antrea", vsphereCluster1), - } - if err := k8sClient.Get(ctx, serviceAccountKey, serviceAccount); err != nil { - return false - } - Expect(serviceAccount.Spec.Ref.Name).To(Equal(vsphereCluster1)) - Expect(serviceAccount.Spec.Ref.Namespace).To(Equal(serviceAccountKey.Namespace)) - Expect(serviceAccount.Spec.Rules).To(HaveLen(2)) - Expect(serviceAccount.Spec.TargetNamespace).To(Equal("vmware-system-antrea")) - Expect(serviceAccount.Spec.TargetSecretName).To(Equal("supervisor-cred")) - return true - }) - - // TODO: we shall check if nsxServiceAccount is created, but since it not registered, we do not check now - }) - - }) - - Context("Reconcile AntreaConfig used as template", func() { - - BeforeEach(func() { - clusterName = antreaTestCluster1 - configCRName = util.GeneratePackageSecretName(clusterName, constants.AntreaDefaultRefName) - clusterResourceFilePath = antreaTemplateConfigManifestsTestFile1 - }) - - It("Should skip the reconciliation", func() { - - key := client.ObjectKey{ - Namespace: addonNamespace, - Name: configCRName, - } - config := &cniv1alpha2.AntreaConfig{} - Expect(k8sClient.Get(ctx, key, config)).To(Succeed()) - - By("OwnerReferences is not set") - Expect(len(config.OwnerReferences)).Should(Equal(0)) - }) - }) - - Context("Mutating webhooks for AntreaConfig", func() { - - BeforeEach(func() { - clusterName = antreaTestCluster1 - clusterNamespace = defaultString - configCRName = util.GeneratePackageSecretName(clusterName, constants.AntreaDefaultRefName) - clusterResourceFilePath = antreaManifestsTestFile1 - }) - - It("Should fail mutating webhooks for immutable field for AntreaConfig", func() { - - key := client.ObjectKey{ - Namespace: clusterNamespace, - Name: configCRName, - } - config := &cniv1alpha2.AntreaConfig{} - Expect(k8sClient.Get(ctx, key, config)).To(Succeed()) - - By("Trying to update the immutable TrafficEncapMode field in Antrea Spec") - config.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode = "noEncap" - Expect(k8sClient.Update(ctx, config)).ToNot(Succeed()) - }) - }) - - When("antrea config is precreated with name {CLUSTER_NAME}-{package-short-name}-package", func() { - - BeforeEach(func() { - clusterName = "antrea-custom-cb-cluster" - clusterNamespace = "antrea-custom-cb-ns" - configName = util.GeneratePackageSecretName(clusterName, constants.AntreaDefaultRefName) - tkrString = "v1.23.1" - clusterResourceFilePath = "testdata/antrea-custom-tkg-system.yaml" - clusterInfraName = "custom-cb-docker-cluster" - newDefaultMTU = "8901" - ns := &v1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - } - err := k8sClient.Create(ctx, ns) - if err != nil { - Expect(apierrors.IsAlreadyExists(err)).To(BeTrue()) - } - - }) - - It("should add cluster as owner reference to antrea config", func() { - // define custom resources in cluster namespace - f, err := os.Open("testdata/antrea-custom-cb-ns.yaml") - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - - By("Create antrea config in the cluster's namespace with expected name pattern", func() { - datavalues := &cniv1alpha2.AntreaConfigDataValue{DefaultMTU: newDefaultMTU} - antreaConfig := generateAntreaConfig(configName, clusterNamespace, datavalues) - err := k8sClient.Create(ctx, antreaConfig) - Expect(err).ToNot(HaveOccurred()) - err = k8sClient.Get(ctx, client.ObjectKeyFromObject(antreaConfig), antreaConfig) - Expect(err).ToNot(HaveOccurred()) - }) - - By("Create the cluster", func() { - cluster := generateDockerCluster(clusterName, clusterNamespace, tkrString, clusterInfraName) - err := k8sClient.Create(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - err = k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), cluster) - Expect(err).ToNot(HaveOccurred()) - - }) - - By("Verify after reconciliation clusterBootstrap ProviderRef.Name points to pre-created antrea config", func() { - clusterBootstrap = &runtanzuv1alpha3.ClusterBootstrap{} - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, clusterBootstrap) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - return clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Name == configName - - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - - By("Verify contents of resulting antrea config", func() { - antreaConfig := &cniv1alpha2.AntreaConfig{} - key := client.ObjectKey{Name: clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Name, Namespace: clusterNamespace} - err := k8sClient.Get(ctx, key, antreaConfig) - Expect(err).ToNot(HaveOccurred()) - Expect(cutil.VerifyOwnerRef(antreaConfig, clusterName, constants.ClusterKind)).To(BeTrue()) - Expect(antreaConfig.Spec.Antrea.AntreaConfigDataValue.DefaultMTU).Should(Equal(newDefaultMTU)) - }) - - }) - - }) - - When("custom clusterbootstrap points to precreated antrea config", func() { - BeforeEach(func() { - clusterName = "custom-cb-2-cluster" - clusterNamespace = "custom-cb-2-namespace" - configName = "antrea-config-custom-2" - clusterBoostrapFile = "testdata/antrea-custom-cb.yaml" - clusterInfraName = "custom-cb-docker-cluster-2" - tkrString = "v1.23.2" - clusterResourceFilePath = "testdata/antrea-custom-cb-2-resources.yaml" - newDefaultMTU = "8902" - ns := &v1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - } - err := k8sClient.Create(ctx, ns) - if err != nil { - Expect(apierrors.IsAlreadyExists(err)).To(BeTrue()) - } - - }) - It("should add cluster as owner reference to precreated antrea config", func() { - By("check resources like the kapp-controller config have been created", func() { - kappConfig := &runtanzuv1alpha3.KappControllerConfig{} - kappConfigKey := client.ObjectKey{Name: "test-cluster-custom-cb-2-kapp-controller-config", - Namespace: addonNamespace} - err := k8sClient.Get(ctx, kappConfigKey, kappConfig) - Expect(err).ToNot(HaveOccurred()) - - }) - - By("Create antrea config in the cluster's namespace with random name", func() { - datavalues := &cniv1alpha2.AntreaConfigDataValue{DefaultMTU: newDefaultMTU} - antreaConfig := generateAntreaConfig(configName, clusterNamespace, datavalues) - err := k8sClient.Create(ctx, antreaConfig) - Expect(err).ToNot(HaveOccurred()) - err = k8sClient.Get(ctx, client.ObjectKeyFromObject(antreaConfig), antreaConfig) - Expect(err).ToNot(HaveOccurred()) - }) - - By("Create custom clusterbootstrap in clusters namespace", func() { - f, err := os.Open(clusterBoostrapFile) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - Expect(testutil.CreateResources(f, cfg, dynamicClient)).To(Succeed()) - - }) - - By("Create the cluster", func() { - cluster := generateDockerCluster(clusterName, clusterNamespace, tkrString, clusterInfraName) - err := k8sClient.Create(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - err = k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), cluster) - Expect(err).ToNot(HaveOccurred()) - - }) - - By("Verify contents of resulting antrea config", func() { - // eventually the secret ref to the data values should be updated - antreaConfig := &cniv1alpha2.AntreaConfig{} - Eventually(func() error { - configKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: configName, - } - if err := k8sClient.Get(ctx, configKey, antreaConfig); err != nil { - return fmt.Errorf("failed to get antrea config '%v': '%v'", configKey, err) - } - if antreaConfig.Status.SecretRef == "" { - return fmt.Errorf("antrea config status not yet updated: %v", configKey) - } - Expect(antreaConfig.Status.SecretRef).To(Equal(fmt.Sprintf("%s-%s-data-values", clusterName, constants.AntreaAddonName))) - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - - antreaConfig = &cniv1alpha2.AntreaConfig{} - key := client.ObjectKey{Name: configName, Namespace: clusterNamespace} - err := k8sClient.Get(ctx, key, antreaConfig) - Expect(err).ToNot(HaveOccurred()) - Expect(cutil.VerifyOwnerRef(antreaConfig, clusterName, constants.ClusterKind)).To(BeTrue()) - Expect(antreaConfig.Spec.Antrea.AntreaConfigDataValue.DefaultMTU).Should(Equal(newDefaultMTU)) - }) - - }) - }) -}) - -func generateAntreaConfig(name, namespace string, datavalues *cniv1alpha2.AntreaConfigDataValue) *cniv1alpha2.AntreaConfig { - labels := map[string]string{} - labels["tkg.tanzu.vmware.com/package-name"] = "antrea.tanzu.vmware.com.1.7.2---tkg.1-advanced" - config := &cniv1alpha2.AntreaConfig{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - Labels: labels, - }, - Spec: cniv1alpha2.AntreaConfigSpec{ - Antrea: cniv1alpha2.Antrea{ - AntreaConfigDataValue: *datavalues, - }, - }, - } - return config -} - -func generateDockerCluster(name, namespace, tkr, infraName string) *clusterapiv1beta1.Cluster { - labels := map[string]string{} - labels["tkg.tanzu.vmware.com/cluster-name"] = name - labels["run.tanzu.vmware.com/tkr"] = tkr - - pods := &clusterapiv1beta1.NetworkRanges{CIDRBlocks: []string{"192.168.0.0/16"}} - services := &clusterapiv1beta1.NetworkRanges{CIDRBlocks: []string{"192.168.0.0/16", "fd00:100:96::/48"}} - clusterNetworks := &clusterapiv1beta1.ClusterNetwork{ - Services: services, - Pods: pods, - } - clusterSpecs := clusterapiv1beta1.ClusterSpec{ - ClusterNetwork: clusterNetworks, - InfrastructureRef: &v1.ObjectReference{ - Kind: "DockerCluster", - Name: infraName, - APIVersion: "infrastructure.cluster.x-k8s.io/v1beta1", - }} - - cluster := &clusterapiv1beta1.Cluster{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - Labels: labels, - }, - Spec: clusterSpecs, - Status: clusterapiv1beta1.ClusterStatus{}, - } - return cluster -} diff --git a/addons/controllers/app_reconciler.go b/addons/controllers/app_reconciler.go deleted file mode 100644 index 6030465c45..0000000000 --- a/addons/controllers/app_reconciler.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - "github.com/go-logr/logr" - - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" -) - -// AppReconciler reconcile kapp App related CRs -type AppReconciler struct { - log logr.Logger - ctx context.Context - clusterClient client.Client - Config addonconfig.AddonControllerConfig -} - -// ReconcileAddonKappResourceNormal reconciles and creates App CR -func (r *AppReconciler) ReconcileAddonKappResourceNormal( // nolint:funlen - remoteApp bool, - remoteCluster *clusterapiv1beta1.Cluster, - addonSecret *corev1.Secret, - addonConfig *tkrv1.Addon, - imageRepository string, - bom *tkrv1.Bom) error { - - addonName := util.GetAddonNameFromAddonSecret(addonSecret) - - app := &kappctrl.App{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateAppNameFromAddonSecret(addonSecret), - Namespace: util.GenerateAppNamespaceFromAddonSecret(addonSecret, r.Config.AddonNamespace), - }, - } - - appMutateFn := func() error { - if app.ObjectMeta.Annotations == nil { - app.ObjectMeta.Annotations = make(map[string]string) - } - - app.ObjectMeta.Annotations[addontypes.AddonTypeAnnotation] = fmt.Sprintf("%s/%s", addonConfig.Category, addonName) - app.ObjectMeta.Annotations[addontypes.AddonNameAnnotation] = addonSecret.Name - app.ObjectMeta.Annotations[addontypes.AddonNamespaceAnnotation] = addonSecret.Namespace - - /* - * remoteApp means App CR on the management cluster that kapp-controller uses to remotely manages set of objects deployed in a workload cluster. - * workload clusters kubeconfig details need to be added for remote App so that kapp-controller on management - * cluster can reconcile and push the addon/app to the workload cluster - */ - if remoteApp { - clusterKubeconfigDetails := util.GetClusterKubeconfigSecretDetails(remoteCluster) - - app.Spec.Cluster = &kappctrl.AppCluster{ - KubeconfigSecretRef: &kappctrl.AppClusterKubeconfigSecretRef{ - Name: clusterKubeconfigDetails.Name, - Key: clusterKubeconfigDetails.Key, - }, - } - } else { - app.Spec.ServiceAccountName = r.Config.AddonServiceAccount - } - - app.Spec.SyncPeriod = &metav1.Duration{Duration: r.Config.AppSyncPeriod} - - templateImageURL, err := util.GetTemplateImageURLFromBom(addonConfig, imageRepository, bom) - if err != nil { - r.log.Error(err, "Error getting addon template image") - return err - } - r.log.Info("Addon template image found", constants.ImageURLLogKey, templateImageURL) - - app.Spec.Fetch = []kappctrl.AppFetch{ - { - Image: &kappctrl.AppFetchImage{ - URL: templateImageURL, - }, - }, - } - - app.Spec.Template = []kappctrl.AppTemplate{ - { - Ytt: &kappctrl.AppTemplateYtt{ - IgnoreUnknownComments: true, - Strict: false, - Inline: &kappctrl.AppFetchInline{ - PathsFrom: []kappctrl.AppFetchInlineSource{ - { - SecretRef: &kappctrl.AppFetchInlineSourceRef{ - Name: util.GenerateAppSecretNameFromAddonSecret(addonSecret), - }, - }, - }, - }, - }, - }, - } - - app.Spec.Deploy = []kappctrl.AppDeploy{ - { - Kapp: &kappctrl.AppDeployKapp{ - // --wait-timeout flag specifies the maximum time to wait for App deployment. In some corner cases, - // current App could have the dependency on the deployment of another App, so current App could get - // stuck in wait phase. - RawOptions: []string{fmt.Sprintf("--wait-timeout=%s", r.Config.AppWaitTimeout)}, - }, - }, - } - - // If its a remoteApp set delete to no-op since the app doesnt have to be deleted when cluster is deleted. - if remoteApp { - app.Spec.NoopDelete = true - } - - return nil - } - - result, err := controllerutil.CreateOrPatch(r.ctx, r.clusterClient, app, appMutateFn) - if err != nil { - r.log.Error(err, "Error creating or patching addon App") - return err - } - - logOperationResult(r.log, "app", result) - - return nil -} - -// ReconcileAddonKappResourceDelete reconciles and deletes App CR -func (r *AppReconciler) ReconcileAddonKappResourceDelete( // nolint:dupl - addonSecret *corev1.Secret) error { - - app := &kappctrl.App{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateAppNameFromAddonSecret(addonSecret), - Namespace: util.GenerateAppNamespaceFromAddonSecret(addonSecret, r.Config.AddonNamespace), - }, - } - - if err := r.clusterClient.Delete(r.ctx, app); err != nil { - if apierrors.IsNotFound(err) { - r.log.Info("Addon app not found") - return nil - } - r.log.Error(err, "Error deleting addon app") - return err - } - - r.log.Info("Deleted app") - - return nil -} diff --git a/addons/controllers/awsebscsi/awsebscsiconfig_controller.go b/addons/controllers/awsebscsi/awsebscsiconfig_controller.go deleted file mode 100644 index ad663dd2dc..0000000000 --- a/addons/controllers/awsebscsi/awsebscsiconfig_controller.go +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - - "github.com/go-logr/logr" - "gopkg.in/yaml.v2" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/log" - - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" -) - -// AwsEbsCSIConfigReconciler reconciles a AwsEbsCSIConfig object -type AwsEbsCSIConfigReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Config addonconfig.AwsEbsCSIConfigControllerConfig -} - -//+kubebuilder:rbac:groups=csi.tanzu.vmware.com,resources=awsebscsiconfigs,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=csi.tanzu.vmware.com,resources=awsebscsiconfigs/status,verbs=get;update;patch - -// Reconcile is part of the main kubernetes reconciliation loop which aims to -// move the current state of the cluster closer to the desired state. -func (r *AwsEbsCSIConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - logger := r.Log.WithValues("AwsEbsCSIConfig", req.NamespacedName) - r.Log.Info("Start AwsEbsCSIConfig reconciliation") - - awsebsCSIConfig := &csiv1alpha1.AwsEbsCSIConfig{} - if err := r.Get(ctx, req.NamespacedName, awsebsCSIConfig); err != nil { - if apierrors.IsNotFound(err) { - logger.Info("AwsEbsCSIConfig resource not found") - return ctrl.Result{}, nil - } - - logger.Error(err, "Unable to fetch AwsEbsCSIConfig resource") - return ctrl.Result{}, err - } - - // deep copy awsebsCSIConfig to avoid issues if in the future other controllers where interacting with the same copy - awsebsCSIConfig = awsebsCSIConfig.DeepCopy() - cluster, err := r.getOwnerCluster(ctx, awsebsCSIConfig) - if cluster == nil { - return ctrl.Result{}, err // no need to requeue if cluster is not found - } - - return r.reconcileAwsEbsCSIConfig(ctx, awsebsCSIConfig, cluster) -} - -func (r *AwsEbsCSIConfigReconciler) reconcileAwsEbsCSIConfig(ctx context.Context, - csiCfg *csiv1alpha1.AwsEbsCSIConfig, - cluster *clusterapiv1beta1.Cluster) (result ctrl.Result, retErr error) { - - logger := log.FromContext(ctx) - - patchHelper, err := clusterapipatchutil.NewHelper(csiCfg, r.Client) - if err != nil { - return ctrl.Result{}, err - } - - defer func() { - if retErr != nil { - // don't modify AwsEbsCSIConfig if there is an error - return - } - - if err := patchHelper.Patch(ctx, csiCfg); err != nil { - logger.Error(err, "Error patching AwsEbsCSIConfig") - retErr = err - } - }() - - if !csiCfg.GetDeletionTimestamp().IsZero() { - return ctrl.Result{}, nil // deleted - } - - if result, err = r.reconcileAwsEbsCSIConfigNormal(ctx, csiCfg, cluster); err != nil { - logger.Error(err, "Error reconciling AwsEbsCSIConfig") - return result, err - } - - return result, nil -} - -func (r *AwsEbsCSIConfigReconciler) reconcileAwsEbsCSIConfigNormal(ctx context.Context, - csiCfg *csiv1alpha1.AwsEbsCSIConfig, - cluster *clusterapiv1beta1.Cluster) (ctrl.Result, error) { - logger := log.FromContext(ctx) - - ownerRef := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - - if !clusterapiutil.HasOwnerRef(csiCfg.OwnerReferences, ownerRef) { - // csiCfg object is patched in defer func in 'reconcileAwsEbsCSIConfig' - csiCfg.OwnerReferences = clusterapiutil.EnsureOwnerRef(csiCfg.OwnerReferences, ownerRef) - } - - secret := &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateDataValueSecretName(cluster.Name, constants.AwsEbsCSIAddonName), - Namespace: csiCfg.Namespace}, - Type: v1.SecretTypeOpaque, - } - - mutateFn := func() error { - secret.StringData = make(map[string]string) - dvs, err := r.mapAwsEbsCSIConfigToDataValues(ctx, csiCfg, cluster) - if err != nil { - logger.Error(err, "Error while mapping AwsEbsCSIConfig to data values") - return err - } - yamlBytes, err := yaml.Marshal(dvs) - if err != nil { - logger.Error(err, "Error marshaling CSI config data values to yaml") - return err - } - secret.StringData[constants.TKGDataValueFileName] = string(yamlBytes) - return nil - } - - secret.SetOwnerReferences([]metav1.OwnerReference{ownerRef}) - - _, err := controllerutil.CreateOrPatch(ctx, r.Client, secret, mutateFn) - if err != nil { - logger.Error(err, "Error creating or patching AwsEbsCSIConfig data values secret") - return ctrl.Result{}, err - } - - csiCfg.Status.SecretRef = &secret.Name - - return ctrl.Result{}, nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *AwsEbsCSIConfigReconciler) SetupWithManager(_ context.Context, mgr ctrl.Manager, - options controller.Options) error { - return ctrl.NewControllerManagedBy(mgr). - For(&csiv1alpha1.AwsEbsCSIConfig{}). - WithOptions(options). - WithEventFilter(predicates.ConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, constants.AwsEbsCSIConfigKind, r.Config.SystemNamespace, r.Log)). - Complete(r) -} diff --git a/addons/controllers/awsebscsi/awsebscsiconfig_datavalues.go b/addons/controllers/awsebscsi/awsebscsiconfig_datavalues.go deleted file mode 100644 index 28dd7f4444..0000000000 --- a/addons/controllers/awsebscsi/awsebscsiconfig_datavalues.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -// DataValues is the data values type generated by the AwsEbsCSIConfig CR -type DataValues struct { - AwsEbsCSI *DataValuesAwsEbsCSI `yaml:"awsEBSCSIDriver,omitempty"` -} - -// DataValuesAwsEbsCSI is the data values section of AwsEbsCSI Secret -type DataValuesAwsEbsCSI struct { - Namespace string `yaml:"namespace"` - HTTPProxy string `yaml:"http_proxy"` - HTTPSProxy string `yaml:"https_proxy"` - NoProxy string `yaml:"no_proxy"` - DeploymentReplicas int32 `yaml:"deployment_replicas"` -} diff --git a/addons/controllers/awsebscsi/awsescsiconfig_utils.go b/addons/controllers/awsebscsi/awsescsiconfig_utils.go deleted file mode 100644 index 3c99f407d9..0000000000 --- a/addons/controllers/awsebscsi/awsescsiconfig_utils.go +++ /dev/null @@ -1,81 +0,0 @@ -package controllers - -import ( - "context" - "fmt" - "strings" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/types" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/log" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" -) - -const ( - defaultDataValueNameSpace = "kube-system" - defaultDataValueDeploymentReplicas = 3 -) - -// getOwnerCluster verifies that the AwsEbsCSIConfig has a cluster as its owner reference, -// and returns the cluster. It tries to read the cluster name from the AwsEbsCSIConfig's owner reference objects. -// If not there, we assume the owner cluster and AwsEbsCSIConfig always has the same name. -func (r *AwsEbsCSIConfigReconciler) getOwnerCluster(ctx context.Context, - awsebsCSIConfig *csiv1alpha1.AwsEbsCSIConfig) (*clusterapiv1beta1.Cluster, error) { - - logger := log.FromContext(ctx) - cluster := &clusterapiv1beta1.Cluster{} - // TODO donot support using addon name as cluster name - clusterName := awsebsCSIConfig.Name - - // retrieve the owner cluster for the AwsEbsCSIConfig object - for _, ownerRef := range awsebsCSIConfig.GetOwnerReferences() { - if strings.EqualFold(ownerRef.Kind, constants.ClusterKind) { - clusterName = ownerRef.Name - break - } - } - if err := r.Client.Get(ctx, types.NamespacedName{Namespace: awsebsCSIConfig.Namespace, Name: clusterName}, cluster); err != nil { - if apierrors.IsNotFound(err) { - logger.Info(fmt.Sprintf("Cluster resource '%s/%s' not found", awsebsCSIConfig.Namespace, clusterName)) - return nil, nil - } - logger.Error(err, fmt.Sprintf("Unable to fetch cluster '%s/%s'", awsebsCSIConfig.Namespace, clusterName)) - return nil, err - } - - return cluster, nil -} - -// mapAwsEbsCSIConfigToDataValues maps AwsEbsCSIConfig CR to data values -func (r *AwsEbsCSIConfigReconciler) mapAwsEbsCSIConfigToDataValues(ctx context.Context, - awsEbsCSIConfig *csiv1alpha1.AwsEbsCSIConfig, - cluster *clusterapiv1beta1.Cluster) (*DataValues, error) { - - dvs := &DataValues{ - AwsEbsCSI: &DataValuesAwsEbsCSI{ - Namespace: defaultDataValueNameSpace, - DeploymentReplicas: defaultDataValueDeploymentReplicas, - HTTPProxy: "", - HTTPSProxy: "", - NoProxy: "", - }, - } - - // TODO do we need to check namespace's existense here ? leave it not checked, in case user may create namespacd asyncly - if awsEbsCSIConfig.Spec.AwsEbsCSI.Namespace != "" { - dvs.AwsEbsCSI.Namespace = awsEbsCSIConfig.Spec.AwsEbsCSI.Namespace - } - - dvs.AwsEbsCSI.HTTPProxy = awsEbsCSIConfig.Spec.AwsEbsCSI.HTTPProxy - dvs.AwsEbsCSI.HTTPSProxy = awsEbsCSIConfig.Spec.AwsEbsCSI.HTTPSProxy - dvs.AwsEbsCSI.NoProxy = awsEbsCSIConfig.Spec.AwsEbsCSI.NoProxy - - if awsEbsCSIConfig.Spec.AwsEbsCSI.DeploymentReplicas != nil { - dvs.AwsEbsCSI.DeploymentReplicas = *awsEbsCSIConfig.Spec.AwsEbsCSI.DeploymentReplicas - } - - return dvs, nil -} diff --git a/addons/controllers/awsebscsiconfig_controller_test.go b/addons/controllers/awsebscsiconfig_controller_test.go deleted file mode 100644 index c94c6602d0..0000000000 --- a/addons/controllers/awsebscsiconfig_controller_test.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "fmt" - "os" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - v1 "k8s.io/api/core/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" -) - -var _ = Describe("AwsEbsCSIConfig Reconciler", func() { - const ( - clusterNamespace = "default" - ) - - var ( - key client.ObjectKey - clusterName string - clusterResourceFilePath string - ) - - JustBeforeEach(func() { - By("Creating cluster and AwsEbsCSIConfig resources") - key = client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - }) - - AfterEach(func() { - By("Deleting cluster and AwsEbsCSIConfig resources") - for _, filePath := range []string{clusterResourceFilePath} { - f, err := os.Open(filePath) - Expect(err).ToNot(HaveOccurred()) - err = testutil.DeleteResources(f, cfg, dynamicClient, true) - Expect(err).ToNot(HaveOccurred()) - Expect(f.Close()).ToNot(HaveOccurred()) - } - }) - - Context("reconcile AwsEbsCSIConfig for management cluster", func() { - const ( - testClusterName = "test-cluster-aws-ebs-csi" - ) - - BeforeEach(func() { - clusterName = testClusterName - clusterResourceFilePath = "testdata/test-aws-ebs-csi-config.yaml" - }) - - It("Should reconcile AwsEbsCSIConfig and create data values secret for AwsEbsCSIConfig on management cluster", func() { - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() error { - if err := k8sClient.Get(ctx, key, cluster); err != nil { - return fmt.Errorf("Failed to get Cluster '%v': '%v'", key, err) - } - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - - config := &csiv1alpha1.AwsEbsCSIConfig{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, config); err != nil { - return false - } - - // check spec values - Expect(*config.Spec.AwsEbsCSI.DeploymentReplicas).Should(Equal(int32(2))) - // check owner reference - if len(config.OwnerReferences) == 0 { - return false - } - Expect(len(config.OwnerReferences)).Should(Equal(1)) - Expect(config.OwnerReferences[0].Name).Should(Equal(testClusterName)) - Expect(*config.Status.SecretRef).Should(Equal(fmt.Sprintf("%s-%s-data-values", testClusterName, constants.AwsEbsCSIAddonName))) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: "default", - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.AwsEbsCSIAddonName), - } - secret := &v1.Secret{} - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return false - } - // check data values secret contents - Expect(secret.Type).Should(Equal(v1.SecretTypeOpaque)) - secretData := string(secret.Data["values.yaml"]) - Expect(strings.Contains(secretData, "deployment_replicas: 2")).Should(BeTrue()) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - }) -}) diff --git a/addons/controllers/azurediskcsi/azurediskconfig_datavalues.go b/addons/controllers/azurediskcsi/azurediskconfig_datavalues.go deleted file mode 100644 index 9f9840a672..0000000000 --- a/addons/controllers/azurediskcsi/azurediskconfig_datavalues.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -// DataValues is the data values type generated by the azureDiskCSIDriver CR -type DataValues struct { - AzureDiskCSI *DataValuesAzureDiskCSI `yaml:"azureDiskCSIDriver,omitempty"` -} - -// DataValuesAzureDiskCSI is the data values section of azureDiskCSI Secret -type DataValuesAzureDiskCSI struct { - Namespace string `yaml:"namespace"` - HTTPProxy string `yaml:"http_proxy"` - HTTPSProxy string `yaml:"https_proxy"` - NoProxy string `yaml:"no_proxy"` - DeploymentReplicas int32 `yaml:"deployment_replicas"` -} diff --git a/addons/controllers/azurediskcsi/azurediskconfig_utils.go b/addons/controllers/azurediskcsi/azurediskconfig_utils.go deleted file mode 100644 index 26ae658b59..0000000000 --- a/addons/controllers/azurediskcsi/azurediskconfig_utils.go +++ /dev/null @@ -1,84 +0,0 @@ -package controllers - -import ( - "context" - "fmt" - "strings" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/types" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/log" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" -) - -const ( - defaultDataValueNameSpace = "kube-system" - defaultDataValueDeploymentReplicas = 3 -) - -// getOwnerCluster verifies that the AzureDiskCSIConfig has a cluster as its owner reference, -// and returns the cluster. It tries to read the cluster name from the VSphereCSIConfig's owner reference objects. -// If not there, we assume the owner cluster and VSphereCSIConfig always has the same name. -func (r *AzureDiskCSIConfigReconciler) getOwnerCluster(ctx context.Context, - azureDiskCSIConfig *csiv1alpha1.AzureDiskCSIConfig) (*clusterapiv1beta1.Cluster, error) { - - logger := log.FromContext(ctx) - cluster := &clusterapiv1beta1.Cluster{} - clusterName := azureDiskCSIConfig.Name // usually the corresponding 'cluster' shares the same name - - // retrieve the owner cluster for the AzureCSIConfig object - for _, ownerRef := range azureDiskCSIConfig.GetOwnerReferences() { - if strings.EqualFold(ownerRef.Kind, constants.ClusterKind) { - clusterName = ownerRef.Name - break - } - } - if err := r.Client.Get(ctx, types.NamespacedName{Namespace: azureDiskCSIConfig.Namespace, Name: clusterName}, cluster); err != nil { - if apierrors.IsNotFound(err) { - logger.Info(fmt.Sprintf("Cluster resource '%s/%s' not found", azureDiskCSIConfig.Namespace, clusterName)) - return nil, nil - } - logger.Error(err, fmt.Sprintf("Unable to fetch cluster '%s/%s'", azureDiskCSIConfig.Namespace, clusterName)) - return nil, err - } - - return cluster, nil -} - -// mapAzureCSIConfigToDataValues maps VSphereCSIConfig CR to data values -func (r *AzureDiskCSIConfigReconciler) mapAzureDiskCSIConfigToDataValues(ctx context.Context, - azureDiskCSIConfig *csiv1alpha1.AzureDiskCSIConfig, - cluster *clusterapiv1beta1.Cluster) (*DataValues, error) { - dvs := &DataValues{ - AzureDiskCSI: &DataValuesAzureDiskCSI{ - Namespace: defaultDataValueNameSpace, - DeploymentReplicas: defaultDataValueDeploymentReplicas, - HTTPProxy: "", - HTTPSProxy: "", - NoProxy: "", - }, - } - - if azureDiskCSIConfig.Spec.AzureDiskCSI.Namespace != "" { - dvs.AzureDiskCSI.Namespace = azureDiskCSIConfig.Spec.AzureDiskCSI.Namespace - } - dvs.AzureDiskCSI.HTTPProxy = azureDiskCSIConfig.Spec.AzureDiskCSI.HTTPProxy - dvs.AzureDiskCSI.HTTPSProxy = azureDiskCSIConfig.Spec.AzureDiskCSI.HTTPSProxy - dvs.AzureDiskCSI.NoProxy = azureDiskCSIConfig.Spec.AzureDiskCSI.NoProxy - - if azureDiskCSIConfig.Spec.AzureDiskCSI.DeploymentReplicas != nil { - dvs.AzureDiskCSI.DeploymentReplicas = *azureDiskCSIConfig.Spec.AzureDiskCSI.DeploymentReplicas - } - - if tkgPlan, ok := cluster.Annotations[constants.TKGPlanAnnotation]; ok { - // because there is no way to get the plan input by the customization, it is mandatory to set the replica of dev to 1 - // todo: Looking for a way to better differentiate between customization and default values - if tkgPlan == constants.TKGDevPlan || tkgPlan == constants.TKGDevCCPan { - dvs.AzureDiskCSI.DeploymentReplicas = 1 - } - } - return dvs, nil -} diff --git a/addons/controllers/azurediskcsi/azurediskcsiconfig_controller.go b/addons/controllers/azurediskcsi/azurediskcsiconfig_controller.go deleted file mode 100644 index a219d8a968..0000000000 --- a/addons/controllers/azurediskcsi/azurediskcsiconfig_controller.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - - "gopkg.in/yaml.v3" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/log" - - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - - "github.com/go-logr/logr" - "k8s.io/apimachinery/pkg/runtime" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" -) - -// AzureDiskCSIConfigReconciler reconciles a AzureDiskCSIConfig object -type AzureDiskCSIConfigReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Config addonconfig.AzureDiskCSIConfigControllerConfig -} - -//+kubebuilder:rbac:groups=csi.tanzu.vmware.com,resources=azurediskcsiconfigs,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=csi.tanzu.vmware.com,resources=azurediskcsiconfigs/status,verbs=get;update;patch - -// Reconcile is part of the main kubernetes reconciliation loop which aims to -// move the current state of the cluster closer to the desired state. -func (r *AzureDiskCSIConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - _ = context.Background() - logger := r.Log.WithValues("azurediskcsiconfig", req.NamespacedName) - logger.Info("azureDiskConfig start Reconcile ") - azureDiskCSIConfig := &csiv1alpha1.AzureDiskCSIConfig{} - if err := r.Get(ctx, req.NamespacedName, azureDiskCSIConfig); err != nil { - if apierrors.IsNotFound(err) { - logger.Info("azureDiskCSIConfig resource not found") - return ctrl.Result{}, nil - } - - logger.Error(err, "Unable to fetch azureDiskCSIConfig resource") - return ctrl.Result{}, err - } - - // deep copy azureDiskCSIConfig to avoid issues if in the future other controllers where interacting with the same copy - azureDiskCSIConfig = azureDiskCSIConfig.DeepCopy() - cluster, err := r.getOwnerCluster(ctx, azureDiskCSIConfig) - if cluster == nil { - return ctrl.Result{}, err - } - - return r.reconcileAzureDiskCSIConfig(ctx, azureDiskCSIConfig, cluster) -} - -func (r *AzureDiskCSIConfigReconciler) reconcileAzureDiskCSIConfig(ctx context.Context, - csiCfg *csiv1alpha1.AzureDiskCSIConfig, - cluster *clusterapiv1beta1.Cluster) (result ctrl.Result, retErr error) { - - logger := log.FromContext(ctx) - - patchHelper, err := clusterapipatchutil.NewHelper(csiCfg, r.Client) - if err != nil { - return ctrl.Result{}, err - } - - defer func() { - if retErr != nil { - // don't modify azureDiskCSIConfig if there is an error - return - } - - if err := patchHelper.Patch(ctx, csiCfg); err != nil { - logger.Error(err, "Error patching azureDiskCSIConfig") - retErr = err - } - }() - - if !csiCfg.GetDeletionTimestamp().IsZero() { - return ctrl.Result{}, nil // deleted - } - - if result, err = r.reconcileAzureDiskCSIConfigNormal(ctx, csiCfg, cluster); err != nil { - logger.Error(err, "Error reconciling AzureDiskConfigCSI") - return result, err - } - - return result, nil -} - -func (r *AzureDiskCSIConfigReconciler) reconcileAzureDiskCSIConfigNormal(ctx context.Context, - csiCfg *csiv1alpha1.AzureDiskCSIConfig, - cluster *clusterapiv1beta1.Cluster) (ctrl.Result, error) { - logger := log.FromContext(ctx) - - ownerRef := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - - if !clusterapiutil.HasOwnerRef(csiCfg.OwnerReferences, ownerRef) { - // csiCfg object is patched in defer func in 'azureDiskCSIConfig' - csiCfg.OwnerReferences = clusterapiutil.EnsureOwnerRef(csiCfg.OwnerReferences, ownerRef) - } - - secret := &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateDataValueSecretName(cluster.Name, constants.AzureDiskCSIAddonName), - Namespace: csiCfg.Namespace}, - Type: v1.SecretTypeOpaque, - } - - mutateFn := func() error { - secret.StringData = make(map[string]string) - dvs, err := r.mapAzureDiskCSIConfigToDataValues(ctx, csiCfg, cluster) - if err != nil { - logger.Error(err, "Error while mapping azureDiskCSIConfig to data values") - return err - } - yamlBytes, err := yaml.Marshal(dvs) - if err != nil { - logger.Error(err, "Error marshaling CSI config data values to yaml") - return err - } - secret.StringData[constants.TKGDataValueFileName] = string(yamlBytes) - return nil - } - - secret.SetOwnerReferences([]metav1.OwnerReference{ownerRef}) - _, err := controllerutil.CreateOrPatch(ctx, r.Client, secret, mutateFn) - if err != nil { - logger.Error(err, "Error creating or patching azureDiskCsiConfiga data values secret") - return ctrl.Result{}, err - } - - csiCfg.Status.SecretRef = &secret.Name - - return ctrl.Result{}, nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *AzureDiskCSIConfigReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, - options controller.Options) error { - logger := log.FromContext(ctx) - logger.Info("SetupWithManager azureDiskcsicontroller start") - return ctrl.NewControllerManagedBy(mgr). - For(&csiv1alpha1.AzureDiskCSIConfig{}). - WithOptions(options). - WithEventFilter(predicates.ConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, constants.AzureDiskCSIConfigKind, r.Config.SystemNamespace, r.Log)). - Complete(r) -} diff --git a/addons/controllers/azurefilecsi/azurefilecsiconfig_controller.go b/addons/controllers/azurefilecsi/azurefilecsiconfig_controller.go deleted file mode 100644 index fe95efc31e..0000000000 --- a/addons/controllers/azurefilecsi/azurefilecsiconfig_controller.go +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright YEAR VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - - "github.com/go-logr/logr" - "gopkg.in/yaml.v2" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/log" - - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" -) - -// AzureFileCSIConfigReconciler reconciles a AzureFileCSIConfig object -type AzureFileCSIConfigReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Config addonconfig.AzureFileCSIConfigControllerConfig -} - -//+kubebuilder:rbac:groups=csi.tanzu.vmware.com,resources=azurefilecsiconfigs,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=csi.tanzu.vmware.com,resources=azurefilecsiconfigs/status,verbs=get;update;patch - -// Reconcile is part of the main kubernetes reconciliation loop which aims to -// move the current state of the cluster closer to the desired state. -func (r *AzureFileCSIConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - logger := r.Log.WithValues("AzureFileCSIConfig", req.NamespacedName) - r.Log.Info("Start AzureFileCSIConfig reconciliation") - - azurefileCSIConfig := &csiv1alpha1.AzureFileCSIConfig{} - if err := r.Get(ctx, req.NamespacedName, azurefileCSIConfig); err != nil { - if apierrors.IsNotFound(err) { - logger.Info("AzureFileCSIConfig resource not found") - return ctrl.Result{}, nil - } - - logger.Error(err, "Unable to fetch AzureFileCSIConfig resource") - return ctrl.Result{}, err - } - - // deep copy azurefileCSIConfig to avoid issues if in the future other controllers where interacting with the same copy - azurefileCSIConfig = azurefileCSIConfig.DeepCopy() - cluster, err := r.getOwnerCluster(ctx, azurefileCSIConfig) - if cluster == nil { - return ctrl.Result{}, err //cluster is not found - } - - return r.reconcileAzureFileCSIConfig(ctx, azurefileCSIConfig, cluster) -} - -func (r *AzureFileCSIConfigReconciler) reconcileAzureFileCSIConfig(ctx context.Context, - csiCfg *csiv1alpha1.AzureFileCSIConfig, - cluster *clusterapiv1beta1.Cluster) (result ctrl.Result, retErr error) { - - logger := log.FromContext(ctx) - - patchHelper, err := clusterapipatchutil.NewHelper(csiCfg, r.Client) - if err != nil { - return ctrl.Result{}, err - } - - defer func() { - if retErr != nil { - // don't modify AzureFileCSIConfig if there is an error - return - } - - if err := patchHelper.Patch(ctx, csiCfg); err != nil { - logger.Error(err, "Error patching AzureFileCSIConfig") - retErr = err - } - }() - - if !csiCfg.GetDeletionTimestamp().IsZero() { - return ctrl.Result{}, nil // deleted - } - - if result, err = r.reconcileAzureFileCSIConfigNormal(ctx, csiCfg, cluster); err != nil { - logger.Error(err, "Error reconciling AzureFileCSIConfig") - return result, err - } - - return result, nil -} - -func (r *AzureFileCSIConfigReconciler) reconcileAzureFileCSIConfigNormal(ctx context.Context, - csiCfg *csiv1alpha1.AzureFileCSIConfig, - cluster *clusterapiv1beta1.Cluster) (ctrl.Result, error) { - logger := log.FromContext(ctx) - - ownerRef := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - - if !clusterapiutil.HasOwnerRef(csiCfg.OwnerReferences, ownerRef) { - // csiCfg object is patched in defer func in 'reconcileAzureFileCSIConfig' - csiCfg.OwnerReferences = clusterapiutil.EnsureOwnerRef(csiCfg.OwnerReferences, ownerRef) - } - - secret := &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateDataValueSecretName(cluster.Name, constants.AzureFileCSIAddonName), - Namespace: csiCfg.Namespace}, - Type: v1.SecretTypeOpaque, - } - - mutateFn := func() error { - secret.StringData = make(map[string]string) - dvs, err := r.mapAzureFileCSIConfigToDataValues(ctx, csiCfg, cluster) - if err != nil { - logger.Error(err, "Error while mapping AzureFileCSIConfig to data values") - return err - } - yamlBytes, err := yaml.Marshal(dvs) - if err != nil { - logger.Error(err, "Error marshaling CSI config data values to yaml") - return err - } - secret.StringData[constants.TKGDataValueFileName] = string(yamlBytes) - return nil - } - - secret.SetOwnerReferences([]metav1.OwnerReference{ownerRef}) - - _, err := controllerutil.CreateOrPatch(ctx, r.Client, secret, mutateFn) - if err != nil { - logger.Error(err, "Error creating or patching AzureFileCSIConfig data values secret") - return ctrl.Result{}, err - } - - csiCfg.Status.SecretRef = &secret.Name - - return ctrl.Result{}, nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *AzureFileCSIConfigReconciler) SetupWithManager(_ context.Context, mgr ctrl.Manager, - options controller.Options) error { - return ctrl.NewControllerManagedBy(mgr). - For(&csiv1alpha1.AzureFileCSIConfig{}). - WithOptions(options). - WithEventFilter(predicates.ConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, constants.AzureFileCSIConfigKind, r.Config.SystemNamespace, r.Log)). - Complete(r) -} diff --git a/addons/controllers/azurefilecsi/azurefilecsiconfig_datavalues.go b/addons/controllers/azurefilecsi/azurefilecsiconfig_datavalues.go deleted file mode 100644 index 5e6afc4ab0..0000000000 --- a/addons/controllers/azurefilecsi/azurefilecsiconfig_datavalues.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -// DataValues is the data values type generated by the AzureFileCSIConfig CR -type DataValues struct { - AzureFileCSI *DataValuesAzureFileCSI `yaml:"azureFileCSIDriver,omitempty"` -} - -// DataValuesAzureFileCSI is the data values section of AzureFileCSI Secret -type DataValuesAzureFileCSI struct { - Namespace string `yaml:"namespace"` - HTTPProxy string `yaml:"http_proxy"` - HTTPSProxy string `yaml:"https_proxy"` - NoProxy string `yaml:"no_proxy"` - DeploymentReplicas int32 `yaml:"deployment_replicas"` -} diff --git a/addons/controllers/azurefilecsi/azurefilecsiconfig_utils.go b/addons/controllers/azurefilecsi/azurefilecsiconfig_utils.go deleted file mode 100644 index 99628ecf69..0000000000 --- a/addons/controllers/azurefilecsi/azurefilecsiconfig_utils.go +++ /dev/null @@ -1,86 +0,0 @@ -package controllers - -import ( - "context" - "fmt" - "strings" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/types" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/log" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" -) - -const ( - defaultDataValueNameSpace = "kube-system" - defaultDataValueDeploymentReplicas = 3 -) - -// getOwnerCluster verifies that the AzureFileCSIConfig has a cluster as its owner reference, -// and returns the cluster. It tries to read the cluster name from the AzureFileCSIConfig's owner reference objects. -// If not there, we assume the owner cluster and AzureFileCSIConfig always has the same name. -func (r *AzureFileCSIConfigReconciler) getOwnerCluster(ctx context.Context, - azurefileCSIConfig *csiv1alpha1.AzureFileCSIConfig) (*clusterapiv1beta1.Cluster, error) { - - logger := log.FromContext(ctx) - cluster := &clusterapiv1beta1.Cluster{} - clusterName := azurefileCSIConfig.Name // usually the corresponding 'cluster' shares the same name - - // retrieve the owner cluster for the AzureFileCSIConfig object - for _, ownerRef := range azurefileCSIConfig.GetOwnerReferences() { - if strings.EqualFold(ownerRef.Kind, constants.ClusterKind) { - clusterName = ownerRef.Name - break - } - } - if err := r.Client.Get(ctx, types.NamespacedName{Namespace: azurefileCSIConfig.Namespace, Name: clusterName}, cluster); err != nil { - if apierrors.IsNotFound(err) { - logger.Info(fmt.Sprintf("Cluster resource '%s/%s' not found", azurefileCSIConfig.Namespace, clusterName)) - return nil, nil - } - logger.Error(err, fmt.Sprintf("Unable to fetch cluster '%s/%s'", azurefileCSIConfig.Namespace, clusterName)) - return nil, err - } - - return cluster, nil -} - -// mapVSphereCSIConfigToDataValues maps VSphereCSIConfig CR to data values -func (r *AzureFileCSIConfigReconciler) mapAzureFileCSIConfigToDataValues(ctx context.Context, - azureFileCSIConfig *csiv1alpha1.AzureFileCSIConfig, - cluster *clusterapiv1beta1.Cluster) (*DataValues, error) { - dvs := &DataValues{ - AzureFileCSI: &DataValuesAzureFileCSI{ - Namespace: defaultDataValueNameSpace, - DeploymentReplicas: defaultDataValueDeploymentReplicas, - HTTPProxy: "", - HTTPSProxy: "", - NoProxy: "", - }, - } - - if azureFileCSIConfig.Spec.AzureFileCSI.Namespace != "" { - dvs.AzureFileCSI.Namespace = azureFileCSIConfig.Spec.AzureFileCSI.Namespace - } - dvs.AzureFileCSI.Namespace = azureFileCSIConfig.Spec.AzureFileCSI.Namespace - dvs.AzureFileCSI.HTTPProxy = azureFileCSIConfig.Spec.AzureFileCSI.HTTPProxy - dvs.AzureFileCSI.HTTPSProxy = azureFileCSIConfig.Spec.AzureFileCSI.HTTPSProxy - dvs.AzureFileCSI.NoProxy = azureFileCSIConfig.Spec.AzureFileCSI.NoProxy - - if azureFileCSIConfig.Spec.AzureFileCSI.DeploymentReplicas != nil { - dvs.AzureFileCSI.DeploymentReplicas = *azureFileCSIConfig.Spec.AzureFileCSI.DeploymentReplicas - } - - if tkgPlan, ok := cluster.Annotations[constants.TKGPlanAnnotation]; ok { - // because there is no way to get the plan input by the customization, it is mandatory to set the replica of dev to 1 - // todo: Looking for a way to better differentiate between customization and default values - if tkgPlan == constants.TKGDevPlan || tkgPlan == constants.TKGDevCCPan { - dvs.AzureFileCSI.DeploymentReplicas = 1 - } - } - - return dvs, nil -} diff --git a/addons/controllers/calico/calicoconfig_controller.go b/addons/controllers/calico/calicoconfig_controller.go deleted file mode 100644 index 69966f5948..0000000000 --- a/addons/controllers/calico/calicoconfig_controller.go +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package controllers implements k8s controller functionality for calico. -package controllers - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - yaml "gopkg.in/yaml.v3" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/source" - - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - cniv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha1" -) - -// CalicoConfigReconciler reconciles CalicoConfig resource -type CalicoConfigReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Ctx context.Context - Config addonconfig.CalicoConfigControllerConfig -} - -//+kubebuilder:rbac:groups=cni.tanzu.vmware.com,resources=calicoconfigs,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=cni.tanzu.vmware.com,resources=calicoconfigs/status,verbs=get;update;patch - -// Reconcile is part of the main kubernetes reconciliation loop which aims to -// move the current state of the cluster closer to the desired state. -func (r *CalicoConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - logger := r.Log.WithValues("CalicoConfig", req.NamespacedName) - - logger.Info("Start reconciliation") - - // fetch CalicoConfig resource, ignore not-found errors - calicoConfig := &cniv1alpha1.CalicoConfig{} - if err := r.Client.Get(ctx, req.NamespacedName, calicoConfig); err != nil { - if apierrors.IsNotFound(err) { - logger.Info("CalicoConfig resource not found") - return ctrl.Result{}, nil - } - logger.Error(err, "Unable to fetch CalicoConfig resource") - return ctrl.Result{}, err - } - - annotations := calicoConfig.GetAnnotations() - if _, ok := annotations[constants.TKGAnnotationTemplateConfig]; ok { - logger.Info(fmt.Sprintf("resource '%v' is a config template. Skipping reconciling", req.NamespacedName)) - return ctrl.Result{}, nil - } - - // deep copy CalicoConfig to avoid issues if in the future other controllers where interacting with the same copy - calicoConfig = calicoConfig.DeepCopy() - - cluster, err := cutil.GetOwnerCluster(ctx, r.Client, calicoConfig, req.Namespace, constants.CalicoDefaultRefName) - - if err != nil { - if apierrors.IsNotFound(err) && cluster != nil { - logger.Info(fmt.Sprintf("'%s/%s' is listed as owner reference but could not be found", - cluster.Namespace, cluster.Name)) - return ctrl.Result{}, err - } - logger.Error(err, "could not determine owner cluster") - return ctrl.Result{}, err - } - - // reconcile CalicoConfig resource - if retResult, err := r.ReconcileCalicoConfig(calicoConfig, cluster, logger); err != nil { - logger.Error(err, "Unable to reconcile CalicoConfig") - return retResult, err - } - - return ctrl.Result{}, nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *CalicoConfigReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { - r.Ctx = ctx - return ctrl.NewControllerManagedBy(mgr). - For(&cniv1alpha1.CalicoConfig{}). - WithOptions(options). - Watches( - &source.Kind{Type: &clusterapiv1beta1.Cluster{}}, - handler.EnqueueRequestsFromMapFunc(r.ClusterToCalicoConfig), - ). - WithEventFilter(predicates.ConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, constants.CalicoConfigKind, r.Config.SystemNamespace, r.Log)). - Complete(r) -} - -// ReconcileCalicoConfig reconciles CalicoConfig CR -func (r *CalicoConfigReconciler) ReconcileCalicoConfig( - calicoConfig *cniv1alpha1.CalicoConfig, - cluster *clusterapiv1beta1.Cluster, logger logr.Logger) (_ ctrl.Result, retErr error) { - - patchHelper, err := clusterapipatchutil.NewHelper(calicoConfig, r.Client) - if err != nil { - return ctrl.Result{}, err - } - // patch CalicoConfig before returning the function - defer func() { - logger.Info("Patching CalicoConfig") - if err := patchHelper.Patch(r.Ctx, calicoConfig); err != nil { - logger.Error(err, "Error patching CalicoConfig") - retErr = err - } - logger.Info("Successfully patched CalicoConfig") - }() - - // if CalicoConfig is marked for deletion, then no reconciliation is needed - if !calicoConfig.GetDeletionTimestamp().IsZero() { - return ctrl.Result{}, nil - } - - // reconcile CalicoConfig by creating the data values secret for CalicoConfig - if err := r.ReconcileCalicoConfigNormal(calicoConfig, cluster, logger); err != nil { - logger.Error(err, "Error reconciling CalicoConfig to create/patch data values secret") - return ctrl.Result{}, err - } - - logger.Info("Successfully reconciled CalicoConfig") - return ctrl.Result{}, nil -} - -// ReconcileCalicoConfigNormal reconciles CalicoConfig by creating/patching data values secret -func (r *CalicoConfigReconciler) ReconcileCalicoConfigNormal( - calicoConfig *cniv1alpha1.CalicoConfig, - cluster *clusterapiv1beta1.Cluster, logger logr.Logger) (retErr error) { - - // add owner reference to CalicoConfig if not already added by TanzuClusterBootstrap Controller - ownerReference := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - if !clusterapiutil.HasOwnerRef(calicoConfig.OwnerReferences, ownerReference) { - logger.Info("Adding owner reference to CalicoConfig") - calicoConfig.OwnerReferences = clusterapiutil.EnsureOwnerRef(calicoConfig.OwnerReferences, ownerReference) - } - - // create/patch data values secret for CalicoConfig - secretNamespacedName := types.NamespacedName{ - Name: util.GenerateDataValueSecretName(cluster.Name, constants.CalicoAddonName), - Namespace: calicoConfig.Namespace, - } - if err := r.ReconcileCalicoDataValuesSecret(calicoConfig, cluster, secretNamespacedName, logger); err != nil { - return err - } - - // add the name of the data values secret in the CalicoConfig Status field - calicoConfig.Status.SecretRef = secretNamespacedName.Name - - return nil -} - -func (r *CalicoConfigReconciler) ReconcileCalicoDataValuesSecret( - calicoConfig *cniv1alpha1.CalicoConfig, - cluster *clusterapiv1beta1.Cluster, - secretNamespacedName types.NamespacedName, logger logr.Logger) error { - - // prepare data values secret for CalicoConfig - calicoDataValuesSecret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: secretNamespacedName.Name, - Namespace: secretNamespacedName.Namespace, - OwnerReferences: []metav1.OwnerReference{{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - }}, - }, - Type: corev1.SecretTypeOpaque, - } - - calicoDataValuesSecretMutateFn := func() error { - calicoDataValuesSecret.StringData = make(map[string]string) - - calicoConfigYaml, err := mapCalicoConfigSpec(cluster, calicoConfig) - if err != nil { - return err - } - - dataValueYamlBytes, err := yaml.Marshal(calicoConfigYaml) - if err != nil { - logger.Error(err, "Error marshaling CalicoConfig to Yaml") - return err - } - calicoDataValuesSecret.StringData[constants.TKGDataValueFileName] = string(dataValueYamlBytes) - return nil - } - - // create/patch the data values secret for CalicoConfig - result, err := controllerutil.CreateOrPatch(r.Ctx, r.Client, calicoDataValuesSecret, calicoDataValuesSecretMutateFn) - if err != nil { - logger.Error(err, "Error creating or patching CalicoConfig data values secret") - return err - } - logger.Info(fmt.Sprintf("Resource '%s' data values secret '%s'", constants.CalicoAddonName, result)) - - return nil -} diff --git a/addons/controllers/calico/calicoconfig_utils.go b/addons/controllers/calico/calicoconfig_utils.go deleted file mode 100644 index d19aa03bd5..0000000000 --- a/addons/controllers/calico/calicoconfig_utils.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - "net" - "strconv" - "strings" - - "github.com/pkg/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - cniv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha1" -) - -// calicoConfigSpec defines the desired state of CalicoConfig. -type calicoConfigSpec struct { - InfraProvider string `yaml:"infraProvider"` - IPFamily string `yaml:"ipFamily,omitempty"` - Calico calico `yaml:"calico,omitempty"` -} - -type calico struct { - Config config `yaml:"config,omitempty"` -} - -type config struct { - VethMTU string `yaml:"vethMTU,omitempty"` - ClusterCIDR string `yaml:"clusterCIDR"` - SkipCNIBinaries bool `yaml:"skipCNIBinaries"` -} - -// ClusterToCalicoConfig returns a list of Requests with CalicoConfig ObjectKey -func (r *CalicoConfigReconciler) ClusterToCalicoConfig(o client.Object) []ctrl.Request { - cluster, ok := o.(*clusterv1beta1.Cluster) - if !ok { - r.Log.Error(errors.New("invalid type"), - "Expected to receive Cluster resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - r.Log.V(4).Info("Mapping cluster to CalicoConfig") - - configs := &cniv1alpha1.CalicoConfigList{} - - if err := r.Client.List(context.Background(), configs); err != nil { - r.Log.Error(err, "Error listing CalicoConfig") - return nil - } - - var requests []ctrl.Request - for i := range configs.Items { - config := &configs.Items[i] - if config.Namespace == cluster.Namespace { - // avoid enqueuing reconcile requests for template CalicoConfig CRs in event handler of Cluster CR - if _, ok := config.Annotations[constants.TKGAnnotationTemplateConfig]; ok && config.Namespace == r.Config.SystemNamespace { - continue - } - - // corresponding CalicoConfig should have following ownerRef - ownerReference := metav1.OwnerReference{ - APIVersion: clusterv1beta1.GroupVersion.String(), - Kind: constants.ClusterKind, - Name: cluster.Name, - UID: cluster.UID, - } - - if clusterapiutil.HasOwnerRef(config.OwnerReferences, ownerReference) { - r.Log.V(4).Info("Adding CalicoConfig for reconciliation", - constants.NamespaceLogKey, config.Namespace, constants.NameLogKey, config.Name) - - requests = append(requests, ctrl.Request{ - NamespacedName: clusterapiutil.ObjectKey(config), - }) - } - } - } - - return requests -} - -func mapCalicoConfigSpec(cluster *clusterv1beta1.Cluster, config *cniv1alpha1.CalicoConfig) (*calicoConfigSpec, error) { - var err error - - configSpec := &calicoConfigSpec{} - configSpec.Calico.Config.VethMTU = strconv.FormatInt(config.Spec.Calico.Config.VethMTU, 10) - configSpec.Calico.Config.SkipCNIBinaries = config.Spec.Calico.Config.SkipCNIBinaries - - // Derive InfraProvider from the cluster - configSpec.InfraProvider, err = util.GetInfraProvider(cluster) - if err != nil { - return nil, errors.Wrap(err, "Unable to get 'InfraProvider' setting for CalicoConfig") - } - - // Derive IPFamily, ClusterCIDR from the cluster - configSpec.IPFamily, configSpec.Calico.Config.ClusterCIDR, err = getCalicoNetworkSettings(cluster) - if err != nil { - return nil, errors.Wrap(err, "Could not get 'clusterCIDR' and 'ipFamily' settings for CalicoConfig") - } - - return configSpec, nil -} - -func getCalicoNetworkSettings(cluster *clusterv1beta1.Cluster) (string, string, error) { - clusterNetwork := cluster.Spec.ClusterNetwork - if clusterNetwork == nil { - return "", "", fmt.Errorf("cluster.Spec.ClusterNetwork is not set for cluster '%s'", cluster.Name) - } - - if clusterNetwork.Pods == nil || len(clusterNetwork.Pods.CIDRBlocks) == 0 { - return "", "", fmt.Errorf("cluster.Spec.ClusterNetwork.Pods is not set for cluster '%s'", cluster.Name) - } - - var result string - for _, cidr := range clusterNetwork.Pods.CIDRBlocks { - ip, _, err := net.ParseCIDR(cidr) - if err != nil { - return "", "", fmt.Errorf("could not parse CIDR '%s': %s", cidr, err) - } - if ip.To4() != nil { - result += "ipv4," - } else { - if ip.To16() != nil { - result += "ipv6," - } else { - return "", "", fmt.Errorf("invalid IP address '%s' in cluster.Spec.ClusterNetwork.Pods.CIDRBlocks for cluster '%s'", ip.String(), cluster.Name) - } - } - } - - cidrBlocks := strings.Join(clusterNetwork.Pods.CIDRBlocks, ",") - return strings.TrimSuffix(result, ","), cidrBlocks, nil -} diff --git a/addons/controllers/calicoconfig_controller_test.go b/addons/controllers/calicoconfig_controller_test.go deleted file mode 100644 index 4a651f3122..0000000000 --- a/addons/controllers/calicoconfig_controller_test.go +++ /dev/null @@ -1,562 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "fmt" - "os" - "strings" - - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - cniv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha1" -) - -const ( - testClusterCalico1 = "test-cluster-calico-1" - testClusterCalico2 = "test-cluster-calico-2" - testDataCalico1 = "testdata/test-calico-1.yaml" - testDataCalico2 = "testdata/test-calico-2.yaml" - testDataCalicoTemplateConfig1 = "testdata/test-calico-template-config-1.yaml" - calicoCarvelPkgRefName = "calico.tanzu.vmware.com" - calicoCustomTKGSystemFile = "testdata/calico-custom-tkg-system.yaml" -) - -var _ = Describe("CalicoConfig Reconciler and Webhooks", func() { - var ( - clusterName string - clusterNamespace string - configName string - clusterResourceFilePath string - ) - - JustBeforeEach(func() { - // Create the admission webhooks - f, err := os.Open(cniWebhookManifestFile) - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - - // set up the certificates and webhook before creating any objects - By("Creating and installing new certificates for Calico Admission Webhooks") - err = testutil.SetupWebhookCertificates(ctx, k8sClient, k8sConfig, &webhookCertDetails) - Expect(err).ToNot(HaveOccurred()) - - By("Creating cluster and CalicoConfig resources") - f, err = os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - }) - - AfterEach(func() { - By("Deleting cluster and CalicoConfig resources") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - err = testutil.DeleteResources(f, cfg, dynamicClient, true) - Expect(err).ToNot(HaveOccurred()) - f.Close() - - By("Deleting the Admission Webhook configuration for Calico") - f, err = os.Open(cniWebhookManifestFile) - Expect(err).ToNot(HaveOccurred()) - err = testutil.DeleteResources(f, cfg, dynamicClient, true) - Expect(err).ToNot(HaveOccurred()) - f.Close() - }) - - Context("reconcile default CalicoConfig for management cluster on dual-stack CIDR", func() { - BeforeEach(func() { - clusterNamespace = addonNamespace - clusterName = testClusterCalico1 - configName = util.GeneratePackageSecretName(clusterName, calicoCarvelPkgRefName) - clusterResourceFilePath = testDataCalico1 - }) - - It("Should reconcile CalicoConfig and create data values secret for CalicoConfig on management cluster", func() { - key := client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - - configKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: configName, - } - - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, cluster); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - config := &cniv1alpha1.CalicoConfig{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, configKey, config); err != nil { - return false - } - // check owner reference - return cutil.VerifyOwnerRef(config, clusterName, constants.ClusterKind) - }, waitTimeout, pollingInterval).Should(BeTrue()) - // check spec values - Expect(config.Spec.Calico.Config.VethMTU).Should(Equal(int64(7))) - Expect(config.Spec.Calico.Config.SkipCNIBinaries).Should(BeTrue()) - - secret := &v1.Secret{} - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.CalicoAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return false - } - return cutil.VerifyOwnerRef(secret, clusterName, constants.ClusterKind) - }, waitTimeout, pollingInterval).Should(BeTrue()) - // check data values secret contents - Expect(secret.Type).Should(Equal(v1.SecretTypeOpaque)) - secretData := string(secret.Data["values.yaml"]) - Expect(strings.Contains(secretData, "infraProvider: vsphere")).Should(BeTrue()) - Expect(strings.Contains(secretData, "ipFamily: ipv4,ipv6")).Should(BeTrue()) - Expect(strings.Contains(secretData, "clusterCIDR: 192.168.0.0/16,fd00:100:96::/48")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vethMTU: \"7\"")).Should(BeTrue()) - Expect(strings.Contains(secretData, "skipCNIBinaries: true")).Should(BeTrue()) - Eventually(func() bool { - config := &cniv1alpha1.CalicoConfig{} - err := k8sClient.Get(ctx, configKey, config) - if err != nil { - return false - } - // Check status.secretName after reconciliation - return config.Status.SecretRef == util.GenerateDataValueSecretName(clusterName, constants.CalicoAddonName) - - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - }) - - Context("reconcile mtu customized and cni binaries installation skipped CalicoConfig for management cluster on ipv4 CIDR", func() { - BeforeEach(func() { - clusterName = testClusterCalico2 - clusterNamespace = addonNamespace - configName = util.GeneratePackageSecretName(clusterName, constants.CalicoDefaultRefName) - clusterResourceFilePath = testDataCalico2 - }) - - It("Should reconcile CalicoConfig and create data values secret for CalicoConfig on management cluster", func() { - key := client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - - configKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: configName, - } - - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, cluster); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - config := &cniv1alpha1.CalicoConfig{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, configKey, config); err != nil { - return false - } - return cutil.VerifyOwnerRef(config, clusterName, constants.ClusterKind) - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // check spec values - Expect(config.Spec.Calico.Config.VethMTU).Should(Equal(int64(1420))) - Expect(config.Spec.Calico.Config.SkipCNIBinaries).Should(BeFalse()) - - secret := &v1.Secret{} - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: util.GenerateDataValueSecretName(clusterName, constants.CalicoAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return false - } - return cutil.VerifyOwnerRef(secret, clusterName, constants.ClusterKind) - }, waitTimeout, pollingInterval).Should(BeTrue()) - // check data values secret contents - Expect(secret.Type).Should(Equal(v1.SecretTypeOpaque)) - secretData := string(secret.Data["values.yaml"]) - Expect(strings.Contains(secretData, "infraProvider: docker")).Should(BeTrue()) - Expect(strings.Contains(secretData, "ipFamily: ipv4")).Should(BeTrue()) - Expect(strings.Contains(secretData, "clusterCIDR: 192.168.0.0/16")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vethMTU: \"1420\"")).Should(BeTrue()) - Expect(strings.Contains(secretData, "skipCNIBinaries: false")).Should(BeTrue()) - - Eventually(func() bool { - config := &cniv1alpha1.CalicoConfig{} - err := k8sClient.Get(ctx, configKey, config) - if err != nil { - return false - } - // Check status.secretName after reconciliation - expectedName := util.GenerateDataValueSecretName(clusterName, constants.CalicoAddonName) - return config.Status.SecretRef == expectedName - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - }) - - Context("Reconcile CalicoConfig used as template", func() { - - BeforeEach(func() { - clusterName = testClusterCalico1 - clusterResourceFilePath = testDataCalicoTemplateConfig1 - configName = util.GeneratePackageSecretName(clusterName, constants.CalicoDefaultRefName) - }) - - It("Should skip the reconciliation", func() { - - configKey := client.ObjectKey{ - Namespace: addonNamespace, - Name: configName, - } - config := &cniv1alpha1.CalicoConfig{} - Expect(k8sClient.Get(ctx, configKey, config)).To(Succeed()) - - By("OwnerReferences is not set") - Expect(len(config.OwnerReferences)).Should(Equal(0)) - }) - }) - - When("calico config is for management cluster", func() { - - BeforeEach(func() { - clusterName = "mgmt-cluster" - clusterNamespace = "tkg-system" - configName = util.GeneratePackageSecretName(clusterName, calicoCarvelPkgRefName) - clusterResourceFilePath = calicoCustomTKGSystemFile - - ns := &v1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - } - err := k8sClient.Create(ctx, ns) - if err != nil { - Expect(apierrors.IsAlreadyExists(err)).To(BeTrue()) - } - }) - - It("should add cluster as owner reference to calico config and name config {CLUSTER_NAME}-{short-package-name}-package", func() { - By("Creating cluster", func() { - f, err := os.Open("testdata/calico-management-cluster.yaml") - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - }) - clusterKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - - configKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: configName, - } - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, clusterKey, cluster); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("Verify new config has owner reference", func() { - config := &cniv1alpha1.CalicoConfig{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, configKey, config); err != nil { - return false - } - return cutil.VerifyOwnerRef(config, clusterName, constants.ClusterKind) - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - - By("Verify new config points to the correct secret ref", func() { - Eventually(func() bool { - config := &cniv1alpha1.CalicoConfig{} - err := k8sClient.Get(ctx, configKey, config) - if err != nil { - return false - } - // Check status.secretName after reconciliation - expectedName := util.GenerateDataValueSecretName(clusterName, constants.CalicoAddonName) - return config.Status.SecretRef == expectedName - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - }) - }) - - When("calico config is precreated with {CLUSTER_NAME}-{package-short-name}-package in cluster namespace", func() { - - BeforeEach(func() { - clusterName = "calico-custom-config-cluster" - clusterNamespace = "calico-custom-config-ns" - configName = util.GeneratePackageSecretName(clusterName, calicoCarvelPkgRefName) - clusterResourceFilePath = calicoCustomTKGSystemFile - - ns := &v1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - } - err := k8sClient.Create(ctx, ns) - if err != nil { - Expect(apierrors.IsAlreadyExists(err)).To(BeTrue()) - } - }) - - It("should add cluster as owner reference to calico config", func() { - By("Creating cluster and CalicoConfig resources", func() { - f, err := os.Open("testdata/calico-custom-config-ns.yaml") - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - }) - - By("Verify clusterBootstrap points to pre-created calico config", func() { - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, clusterBootstrap) - if err != nil { - return false - } - if clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Name == configName { - return true - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - - key := client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - - configKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: configName, - } - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, cluster); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - key = client.ObjectKey{ - Namespace: clusterNamespace, - Name: configName, - } - config := &cniv1alpha1.CalicoConfig{} - - Eventually(func() bool { - if err := k8sClient.Get(ctx, configKey, config); err != nil { - return false - } - - // check owner reference - return cutil.VerifyOwnerRef(config, clusterName, constants.ClusterKind) - - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // check spec values - Expect(config.Spec.Calico.Config.VethMTU).Should(Equal(int64(1420))) - Expect(config.Spec.Calico.Config.SkipCNIBinaries).Should(BeFalse()) - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: util.GenerateDataValueSecretName(clusterName, constants.CalicoAddonName), - } - secret := &v1.Secret{} - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return false - } - - // check data values secret contents - Expect(secret.Type).Should(Equal(v1.SecretTypeOpaque)) - secretData := string(secret.Data["values.yaml"]) - Expect(strings.Contains(secretData, "infraProvider: docker")).Should(BeTrue()) - Expect(strings.Contains(secretData, "ipFamily: ipv4")).Should(BeTrue()) - Expect(strings.Contains(secretData, "clusterCIDR: 192.168.0.0/16")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vethMTU: \"1420\"")).Should(BeTrue()) - Expect(strings.Contains(secretData, "skipCNIBinaries: false")).Should(BeTrue()) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - config := &cniv1alpha1.CalicoConfig{} - err := k8sClient.Get(ctx, configKey, config) - if err != nil { - return false - } - // Check status.secretName after reconciliation - expectedName := util.GenerateDataValueSecretName(clusterName, constants.CalicoAddonName) - return config.Status.SecretRef == expectedName - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - }) - - When("custom clusterbootstrap points to precreated calico config in cluster namespace", func() { - BeforeEach(func() { - clusterName = "calico-custom-cb-cluster" - clusterNamespace = "calico-custom-cb-ns" - configName = "calico-custom-config" - clusterResourceFilePath = calicoCustomTKGSystemFile - - ns := &v1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - } - err := k8sClient.Create(ctx, ns) - if err != nil { - Expect(apierrors.IsAlreadyExists(err)).To(BeTrue()) - } - - }) - It("values from custom config should override those of template", func() { - - // define custom resources in cluster namespace - f, err := os.Open("testdata/calico-custom-cb-ns.yaml") - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - - By("Verify contents of resulting calico config", func() { - // eventually the secret ref to the data values should be updated - calicoConfig := &cniv1alpha1.CalicoConfig{} - configKey := client.ObjectKey{Name: configName, Namespace: clusterNamespace} - Eventually(func() bool { - if err := k8sClient.Get(ctx, configKey, calicoConfig); err != nil { - return false - } - return cutil.VerifyOwnerRef(calicoConfig, clusterName, constants.ClusterKind) - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - if err := k8sClient.Get(ctx, configKey, calicoConfig); err != nil { - return false - } - expectedSecretRef := util.GenerateDataValueSecretName(clusterName, constants.CalicoDefaultRefName) - return calicoConfig.Status.SecretRef != "" && calicoConfig.Status.SecretRef == expectedSecretRef - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Expect(k8sClient.Get(ctx, configKey, calicoConfig)).To(Succeed()) - - Expect(calicoConfig.Spec.Calico.Config.VethMTU).Should(Equal(int64(1420))) - // why int64?? that would make it architecture specific, as oposed to why not just int? - // (defined in apis/addonconfigs/cni/v1alpha1/calicoconfig_types.go) - // seems to also have forced part of this fix: https://github.com/vmware-tanzu/tanzu-framework/pull/2164 - }) - - }) - }) - - When("custom clusterbootstrap uses wild card to point to precreated calico config", func() { - BeforeEach(func() { - clusterName = "calico-wildcard-cb-cluster" - clusterNamespace = "calico-wildcard-cb-ns" - configName = "calico-wildcard-config" - clusterResourceFilePath = calicoCustomTKGSystemFile - - ns := &v1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - } - err := k8sClient.Create(ctx, ns) - if err != nil { - Expect(apierrors.IsAlreadyExists(err)).To(BeTrue()) - } - - }) - It("values from custom config should override those of template", func() { - - By("define cluster namespace resources", func() { - f, err := os.Open("testdata/calico-wildcard-cb-ns.yaml") - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - }) - - By("define clusterboostrap with widlcard, config and clsuter", func() { - // define custom resources in cluster namespace - f, err := os.Open("testdata/calico-wildcard-user-input.yaml") - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - }) - By("Verify package refName has been updated correctly in the clusterboostrap", func() { - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - Eventually(func() bool { - cbKey := client.ObjectKey{Name: clusterName, Namespace: clusterNamespace} - if err := k8sClient.Get(ctx, cbKey, clusterBootstrap); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - Expect(clusterBootstrap.Spec.CNI.RefName).Should(Equal("calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1")) - - }) - By("Verify owner reference of resulting config", func() { - Eventually(func() bool { - calicoConfig := &cniv1alpha1.CalicoConfig{} - configKey := client.ObjectKey{Name: configName, Namespace: clusterNamespace} - if err := k8sClient.Get(ctx, configKey, calicoConfig); err != nil { - return false - } - // check owner reference - return cutil.VerifyOwnerRef(calicoConfig, clusterName, constants.ClusterKind) - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - By("Verify contents of resulting calico config", func() { - // eventually the secret ref to the data values should be updated - calicoConfig := &cniv1alpha1.CalicoConfig{} - configKey := client.ObjectKey{Name: configName, Namespace: clusterNamespace} - Eventually(func() bool { - if err := k8sClient.Get(ctx, configKey, calicoConfig); err != nil { - return false - } - return calicoConfig.Spec.Calico.Config.VethMTU == 1420 && !calicoConfig.Spec.Calico.Config.SkipCNIBinaries - }, waitTimeout, pollingInterval).Should(BeTrue()) - - }) - }) - }) -}) diff --git a/addons/controllers/certificates_test.go b/addons/controllers/certificates_test.go deleted file mode 100644 index 621143948a..0000000000 --- a/addons/controllers/certificates_test.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "os" - - cert2 "k8s.io/client-go/util/cert" - "k8s.io/client-go/util/keyutil" - "knative.dev/pkg/webhook/certificates/resources" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/webhooks" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" -) - -var _ = Describe("Webhook", func() { - Context("Webhook Manifests", func() { - It("Should create webhook manifests for tests", func() { - f, err := os.Open("testdata/test-webhook-manifests.yaml") - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("server's certificate and key", func() { - It("should be generated and written to the webhook server CertDir", func() { - print(certPath, keyPath, constants.WebhookScrtName, addonNamespace, webhookServiceName, webhookSelectorString) - secret, err := webhooks.InstallNewCertificates(ctx, k8sConfig, certPath, keyPath, constants.WebhookScrtName, addonNamespace, webhookServiceName, webhookSelectorString) - Expect(err).ToNot(HaveOccurred()) - Expect(secret).NotTo(BeNil()) - cert, err := cert2.CertsFromFile(certPath) - Expect(err).ToNot(HaveOccurred()) - certPEM, err := cert2.EncodeCertificates(cert[0]) - Expect(err).ToNot(HaveOccurred()) - Expect(certPEM).To(Equal(secret.Data[resources.ServerCert])) - key, err := keyutil.PrivateKeyFromFile(keyPath) - Expect(err).ToNot(HaveOccurred()) - orgKey, err := keyutil.ParsePrivateKeyPEM(secret.Data[resources.ServerKey]) - Expect(err).ToNot(HaveOccurred()) - Expect(key).To(Equal(orgKey)) - }) - }) - - Context("Mutating and Validating Configurations", func() { - It("should be updated with CA bundle ", func() { - err := testutil.SetupWebhookCertificates(ctx, k8sClient, k8sConfig, &webhookCertDetails) - Expect(err).ToNot(HaveOccurred()) - }) - It("should fail update when label selector is not provided", func() { - _, err := webhooks.InstallNewCertificates(ctx, k8sConfig, certPath, keyPath, constants.WebhookScrtName, addonNamespace, webhookServiceName, "") - Expect(err).To(HaveOccurred()) - }) - }) - - Context("Delete webhook Manifests", func() { - It("Should delete webhook manifests after tests", func() { - f, err := os.Open("testdata/test-webhook-manifests.yaml") - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - err = testutil.DeleteResources(f, cfg, dynamicClient, true) - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) diff --git a/addons/controllers/cluster_metadata_controller.go b/addons/controllers/cluster_metadata_controller.go deleted file mode 100644 index 8d0d64c42a..0000000000 --- a/addons/controllers/cluster_metadata_controller.go +++ /dev/null @@ -1,359 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterApiPredicates "sigs.k8s.io/cluster-api/util/predicates" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" -) - -// ClusterMetadataReconciler reconciles a ClusterBootstrap object -type ClusterMetadataReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - context context.Context - controller controller.Controller -} - -// NewClusterMetadataReconciler returns a reconciler for ClusterMetadata -func NewClusterMetadataReconciler(c client.Client, log logr.Logger, scheme *runtime.Scheme) *ClusterMetadataReconciler { - return &ClusterMetadataReconciler{ - Client: c, - Log: log, - Scheme: scheme, - } -} - -// SetupWithManager performs the setup actions for a cluster metadata controller, using the passed in mgr. -func (r *ClusterMetadataReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { - metadataController, err := ctrl.NewControllerManagedBy(mgr). - For(&clusterapiv1beta1.Cluster{}). - WithOptions(options).WithEventFilter(clusterApiPredicates.ResourceNotPaused(r.Log)). - WithEventFilter(predicates.TKR(r.Log)). - Named("clusterMetadata-controller"). - Build(r) - if err != nil { - r.Log.Error(err, "Error creating an cluster metadata controller") - return err - } - r.context = ctx - r.controller = metadataController - return nil -} - -// Reconcile performs the reconciliation action for the controller. -func (r *ClusterMetadataReconciler) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) { - log := r.Log.WithValues(constants.ClusterNamespaceLogKey, req.Namespace, constants.ClusterNameLogKey, req.Name) - - cluster := &clusterapiv1beta1.Cluster{} - if err := r.Client.Get(ctx, req.NamespacedName, cluster); err != nil { - if apierrors.IsNotFound(err) { - log.Info("Cluster not found") - return ctrl.Result{}, nil - } - log.Error(err, "unable to fetch cluster") - return ctrl.Result{}, err - } - - if cluster.Status.Phase != string(clusterapiv1beta1.ClusterPhaseProvisioned) { - r.Log.Info(fmt.Sprintf("cluster %s/%s does not have status phase %s", cluster.Namespace, cluster.Name, clusterapiv1beta1.ClusterPhaseProvisioned)) - return ctrl.Result{RequeueAfter: constants.RequeueAfterDuration}, nil - } - - // make sure the TKR object exists - tkrName := util.GetClusterLabel(cluster.Labels, constants.TKRLabelClassyClusters) - if tkrName == "" { - tkrName = util.GetClusterLabel(cluster.Labels, constants.TKRLabel) - if tkrName == "" { - return ctrl.Result{}, nil - } - } - - tkr, err := util.GetTKRByNameV1Alpha3(r.context, r.Client, cluster, tkrName) - if err != nil { - log.Error(err, "unable to fetch TKR object", "name", tkrName) - return ctrl.Result{}, err - } - - // if tkr is not found, should not requeue for the reconciliation - if tkr == nil { - log.Info("TKR object not found", "name", tkrName) - return ctrl.Result{}, nil - } - - log.Info("Reconciling cluster") - - // if deletion timestamp is set, handle cluster deletion - if !cluster.GetDeletionTimestamp().IsZero() { - log.Info("cluster is in a deletion process, skip") - return ctrl.Result{}, nil - } - return r.reconcileNormal(cluster, log, tkrName) -} - -// reconcileNormal reconciles the cluster object -func (r *ClusterMetadataReconciler) reconcileNormal(cluster *clusterapiv1beta1.Cluster, log logr.Logger, tkrName string) (reconcile.Result, error) { - remoteClient, err := util.GetClusterClient(r.context, r.Client, r.Scheme, clusterapiutil.ObjectKey(cluster)) - if err != nil { - return ctrl.Result{RequeueAfter: constants.RequeueAfterDuration}, fmt.Errorf("failed to get remote cluster client: %w", err) - } - - err = r.createOrUpdateClusterMetadata(remoteClient, cluster, tkrName) - if err != nil { - return ctrl.Result{RequeueAfter: constants.RequeueAfterDuration}, err - } - - return ctrl.Result{}, nil - -} - -func (r *ClusterMetadataReconciler) createOrUpdateClusterMetadata(remoteClient client.Client, cluster *clusterapiv1beta1.Cluster, tkrName string) error { - type ConfigmapRef struct { - Name string `yaml:"name"` - } - - type Bom struct { - ConfigmapRef *ConfigmapRef `yaml:"configmapRef"` - } - - type Infrastructure struct { - Provider string `yaml:"provider"` - } - - type Cluster struct { - Name string `yaml:"name"` - Type string `yaml:"type"` - Plan string `yaml:"plan"` - KubernetesProvider string `yaml:"kubernetesProvider"` - TkgVersion string `yaml:"tkgVersion"` - Edition string `yaml:"edition"` - Infrastructure *Infrastructure `yaml:"infrastructure"` - IsClusterClassBased bool `yaml:"isClusterClassBased"` - } - - type TkgMetadata struct { - Cluster *Cluster `yaml:"cluster"` - Bom *Bom `yaml:"bom"` - } - - bom, err := util.GetTkgBomForCluster(r.context, r.Client, tkrName) - if err != nil { - return errors.Wrapf(err, "cannot get the bom configuration") - } - - bomContent, err := bom.GetBomContent() - if err != nil { - return errors.Wrapf(err, "cannot get the bom content") - } - bomContentByte, err := yaml.Marshal(bomContent) - if err != nil { - return errors.Wrap(err, "unable to yaml marshal default bom configuration") - } - - clusterType := "workload" - if _, ok := cluster.Labels[constants.ManagementClusterRoleLabel]; ok { - clusterType = "management" - } - - // Could be useless information since the tce edition is deprecated - clusterEdition := "tkg" - if edition, ok := cluster.Annotations["edition"]; ok { - clusterEdition = edition - } - - isClusterClassBased := IsClusterClassBased(cluster) - - providerName, err := util.GetInfraProvider(cluster) - if err != nil { - return errors.Wrapf(err, "unable to get the infra provider for cluster %v", cluster.Name) - } - - kubernetesProvider := "VMware Tanzu Kubernetes Grid" - if providerName == "tkg-service-vsphere" { - kubernetesProvider = "VMware Tanzu Kubernetes Grid Service for vSphere" - } - - clusterPlan, found := cluster.Annotations["tkg/plan"] - if !found || clusterPlan == "" { - // following the legacy behavior to set dev plan as default when the plan information is missing - // but this should never happen - clusterPlan = "dev" - } else { - // convert cc plan to legacy plan because we do not want to expose cc plan to users - if clusterPlan == "devcc" { - clusterPlan = "dev" - } else if clusterPlan == "prodcc" { - clusterPlan = "prod" - } - } - - tkgMetadata := &TkgMetadata{ - Cluster: &Cluster{ - Name: cluster.Name, - Type: clusterType, - Plan: clusterPlan, - KubernetesProvider: kubernetesProvider, - TkgVersion: bomContent.Release.Version, - Edition: clusterEdition, - Infrastructure: &Infrastructure{ - Provider: providerName, - }, - IsClusterClassBased: isClusterClassBased, - }, - Bom: &Bom{ - ConfigmapRef: &ConfigmapRef{ - Name: constants.TkgBomConfigMapName, - }, - }, - } - - tkgMetadataByte, err := yaml.Marshal(tkgMetadata) - if err != nil { - return errors.Wrap(err, "unable to yaml marshal metadata") - } - - namespace := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.ClusterMetadataNamespace, - }, - } - - // create namespace tkg-system-public - _, err = controllerutil.CreateOrPatch(r.context, remoteClient, namespace, nil) - if err != nil { - return errors.Wrapf(err, "unable to create the namespace %v", constants.ClusterMetadataNamespace) - } - - // create role - namespaceRole := &rbacv1.Role{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.ClusterMetadataNamespaceRoleName, - Namespace: constants.ClusterMetadataNamespace, - }, - } - _, err = controllerutil.CreateOrPatch(r.context, remoteClient, namespaceRole, func() error { - namespaceRole.Rules = []rbacv1.PolicyRule{ - { - APIGroups: []string{ - "", - }, - ResourceNames: []string{ - "tkg-metadata", - "tkg-bom", - }, - Resources: []string{ - "configmaps", - }, - Verbs: []string{ - "get", - "list", - "watch", - }, - }, - } - return nil - }) - if err != nil { - return errors.Wrapf(err, "unable to create the namespace role %v", constants.ClusterMetadataNamespaceRoleName) - } - - // create role binding - namespaceRoleBinding := &rbacv1.RoleBinding{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.ClusterMetadataNamespaceRoleName, - Namespace: constants.ClusterMetadataNamespace, - }, - } - _, err = controllerutil.CreateOrPatch(r.context, remoteClient, namespaceRoleBinding, func() error { - namespaceRoleBinding.RoleRef = rbacv1.RoleRef{ - APIGroup: "rbac.authorization.k8s.io", - Kind: "Role", - Name: constants.ClusterMetadataNamespaceRoleName, - } - namespaceRoleBinding.Subjects = []rbacv1.Subject{ - { - APIGroup: "rbac.authorization.k8s.io", - Kind: "Group", - Name: constants.ClusterMetadataRolebindingSubjectName, - }, - } - return nil - }) - if err != nil { - return errors.Wrapf(err, "unable to create the namespace rolebinding %v", constants.ClusterMetadataNamespaceRoleName) - } - - // create tkg-bom configmap - tkgBomConfigMap := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: constants.ClusterMetadataNamespace, - Name: constants.TkgBomConfigMapName, - }, - } - _, err = controllerutil.CreateOrPatch(r.context, remoteClient, tkgBomConfigMap, func() error { - tkgBomConfigMap.Data = make(map[string]string) - tkgBomConfigMap.Data["bom.yaml"] = string(bomContentByte) - return nil - }) - if err != nil { - return errors.Wrapf(err, "unable to create the configmap %v", constants.TkgBomConfigMapName) - } - - // create tkg-metadata configmap - tkgMetadataConfigMap := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: constants.ClusterMetadataNamespace, - Name: constants.TkgMetadataConfigMapName, - }, - } - - _, err = controllerutil.CreateOrPatch(r.context, remoteClient, tkgMetadataConfigMap, func() error { - tkgMetadataConfigMap.Data = make(map[string]string) - tkgMetadataConfigMap.Data["metadata.yaml"] = string(tkgMetadataByte) - return nil - }) - if err != nil { - return errors.Wrapf(err, "unable to create the configmap %v", constants.TkgMetadataConfigMapName) - } - - return nil -} - -func IsClusterClassBased(clusterObj *clusterapiv1beta1.Cluster) bool { - if clusterObj.Spec.Topology == nil || clusterObj.Spec.Topology.Class == "" { - return false - } - // Make sure that Cluster resource doesn't have ownerRef indicating that other - // resource is managing this Cluster resource. When cluster is created through - // TKC API, the cluster resource will have ownerRef set - ownerRefs := clusterObj.GetOwnerReferences() - for i := range ownerRefs { - if ownerRefs[i].Kind == constants.KindTanzuKubernetesCluster { - return false - } - } - return true -} diff --git a/addons/controllers/cluster_metadata_controller_test.go b/addons/controllers/cluster_metadata_controller_test.go deleted file mode 100644 index 21db45e021..0000000000 --- a/addons/controllers/cluster_metadata_controller_test.go +++ /dev/null @@ -1,146 +0,0 @@ -package controllers - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - "sigs.k8s.io/cluster-api/util/secret" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" -) - -var _ = Describe("ClusterMetadata Reconciler", func() { - var ( - clusterName string - clusterNamespace string - clusterResourceFilePath string - ) - - JustBeforeEach(func() { - By("Creating kubeconfig for cluster") - Expect(testutil.CreateKubeconfigSecret(cfg, clusterName, clusterNamespace, k8sClient)).To(Succeed()) - // create cluster resources - By("Creating a cluster, tkr, BOM config map and addon secret") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - Expect(testutil.CreateResources(f, cfg, dynamicClient)).To(Succeed()) - - }) - - AfterEach(func() { - - By("Deleting kubeconfig for cluster") - key := client.ObjectKey{ - Namespace: clusterNamespace, - Name: secret.Name(clusterName, secret.Kubeconfig), - } - s := &corev1.Secret{} - Expect(k8sClient.Get(ctx, key, s)).To(Succeed()) - Expect(k8sClient.Delete(ctx, s)).To(Succeed()) - - // delete cluster - By("Deleting cluster") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - Expect(testutil.DeleteResources(f, cfg, dynamicClient, false)).To(Succeed()) - }) - When("reconcileAddonNormal for a tkr 1.23.2", func() { - BeforeEach(func() { - clusterName = "test-cluster-metadata" - clusterNamespace = "default" - clusterResourceFilePath = "testdata/test-cluster-metadata.yaml" - }) - Context("from a tkg-bom configmap", func() { - It("Should create metadata namespace, namespaceRole, namespaceRoleBinding tkgBomConfigMap", func() { - By("verifying CAPI cluster is created properly") - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - Expect(k8sClient.Status().Update(ctx, cluster)).To(Succeed()) - - By("verifying the metadata resource are created properly") - remoteClient, err := util.GetClusterClient(ctx, k8sClient, scheme, clusterapiutil.ObjectKey(cluster)) - Expect(err).NotTo(HaveOccurred()) - Expect(remoteClient).NotTo(BeNil()) - Eventually(func() bool { - ns := &corev1.NamespaceList{} - err := remoteClient.List(ctx, ns) - if err != nil { - return false - } - for _, n := range ns.Items { - if n.Name == constants.ClusterMetadataNamespace { - return true - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - roles := &rbacv1.RoleList{} - err := remoteClient.List(ctx, roles) - if err != nil { - return false - } - for _, r := range roles.Items { - if r.Name == constants.ClusterMetadataNamespaceRoleName { - rule := r.Rules[0] - if rule.APIGroups[0] == "" && rule.Verbs[0] == "get" && rule.Resources[0] == "configmaps" { - return true - } - return true - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - roleBindings := &rbacv1.RoleBindingList{} - err := remoteClient.List(ctx, roleBindings) - if err != nil { - return false - } - for _, r := range roleBindings.Items { - if r.Name == constants.ClusterMetadataNamespaceRoleName && - r.RoleRef.Name == constants.ClusterMetadataNamespaceRoleName { - if r.Subjects[0].Name == constants.ClusterMetadataRolebindingSubjectName { - return true - } - - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - configMaps := &corev1.ConfigMapList{} - err := remoteClient.List(ctx, configMaps) - if err != nil { - return false - } - var configmapHitCount int - for _, r := range configMaps.Items { - if r.Name == constants.TkgMetadataConfigMapName || r.Name == constants.TkgBomConfigMapName { - configmapHitCount++ - } - } - if configmapHitCount == 2 { - return true - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - }) - }) - }) -}) diff --git a/addons/controllers/cluster_pause_webhook_test.go b/addons/controllers/cluster_pause_webhook_test.go deleted file mode 100644 index eef1868f44..0000000000 --- a/addons/controllers/cluster_pause_webhook_test.go +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -var _ = Describe("when cluster paused state is managed by webhook", func() { - var ( - clusterpPauseWebhookManifestFile string - testClusterName string - ) - JustBeforeEach(func() { - // Create the webhook configurations - f, err := os.Open(clusterpPauseWebhookManifestFile) - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - - // set up the certificates and webhook before creating any objects - By("Creating and installing new certificates for ClusterBootstrap Admission Webhooks") - err = testutil.SetupWebhookCertificates(ctx, k8sClient, k8sConfig, &webhookCertDetails) - Expect(err).ToNot(HaveOccurred()) - }) - - AfterEach(func() { - By("Deleting pause webhook") - // Create the webhooks - f, err := os.Open(clusterpPauseWebhookManifestFile) - Expect(err).ToNot(HaveOccurred()) - err = testutil.DeleteResources(f, cfg, dynamicClient, true) - Expect(err).ToNot(HaveOccurred()) - f.Close() - - err = k8sClient.Delete(ctx, &clusterapiv1beta1.Cluster{ - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: addonNamespace}, - }) - Expect(err).ToNot(HaveOccurred()) - }) - - When("current cluster's corresponding TKR does not have 'run.tanzu.vmware.com/legacy-tkr' label", func() { - BeforeEach(func() { - clusterpPauseWebhookManifestFile = "testdata/webhooks/cluster-pause-webhook-manifest.yaml" - testClusterName = "pause-test-cluster" - }) - - Context("if the value of the cluster's TKR label changes", func() { - It("webhook should set pause state in cluster object", func() { - // Create a cluster object - cluster := &clusterapiv1beta1.Cluster{} - cluster.Name = testClusterName - cluster.Namespace = addonNamespace - cluster.Labels = map[string]string{v1alpha3.LabelTKR: "v1.19.3---vmware.1"} - err := k8sClient.Create(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - // It shouldn't be paused - key := client.ObjectKey{ - Namespace: cluster.Namespace, - Name: cluster.Name, - } - err = k8sClient.Get(ctx, key, cluster) - cluster = cluster.DeepCopy() - Expect(err).ToNot(HaveOccurred()) - if cluster.Annotations != nil { - _, ok := cluster.Annotations[constants.ClusterPauseLabel] - Expect(ok).ToNot(BeTrue()) - } - Expect(cluster.Spec.Paused).ToNot(BeTrue()) - - // Update cluster version - cluster.Labels = map[string]string{v1alpha3.LabelTKR: "v1.20.5---vmware.1"} - err = k8sClient.Update(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - // Cluster should be paused - Expect(cluster.Annotations).ToNot(BeNil()) - Expect(cluster.Annotations[constants.ClusterPauseLabel]).To(Equal(cluster.Labels[v1alpha3.LabelTKR])) - Expect(cluster.Spec.Paused).To(BeTrue()) - }) - }) - - Context("if previously the cluster did not have any label and during an update, TKR label is set", func() { - It("webhook should set pause state in the cluster object", func() { - // Create a cluster object - cluster := &clusterapiv1beta1.Cluster{} - cluster.Name = testClusterName - cluster.Namespace = addonNamespace - err := k8sClient.Create(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - // It shouldn't be paused - key := client.ObjectKey{ - Namespace: cluster.Namespace, - Name: cluster.Name, - } - err = k8sClient.Get(ctx, key, cluster) - cluster = cluster.DeepCopy() - Expect(err).ToNot(HaveOccurred()) - if cluster.Annotations != nil { - _, ok := cluster.Annotations[constants.ClusterPauseLabel] - Expect(ok).ToNot(BeTrue()) - } - Expect(cluster.Spec.Paused).ToNot(BeTrue()) - - // Update cluster version - cluster.Labels = map[string]string{v1alpha3.LabelTKR: "v1.19.3---vmware.1"} - err = k8sClient.Update(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - Expect(cluster.Annotations).ToNot(BeNil()) - Expect(cluster.Annotations[constants.ClusterPauseLabel]).To(Equal(cluster.Labels[v1alpha3.LabelTKR])) - Expect(cluster.Spec.Paused).To(BeTrue()) - }) - }) - - Context("if previously the cluster did not have a TKR label and during an update, TKR label is set", func() { - It("webhook should set pause state in the cluster object", func() { - // Create a cluster object - cluster := &clusterapiv1beta1.Cluster{} - cluster.Name = testClusterName - cluster.Namespace = addonNamespace - cluster.Labels = map[string]string{"someLabel": "v1.19.3---vmware.1"} - err := k8sClient.Create(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - // It shouldn't be paused - key := client.ObjectKey{ - Namespace: cluster.Namespace, - Name: cluster.Name, - } - err = k8sClient.Get(ctx, key, cluster) - cluster = cluster.DeepCopy() - Expect(err).ToNot(HaveOccurred()) - if cluster.Annotations != nil { - _, ok := cluster.Annotations[constants.ClusterPauseLabel] - Expect(ok).ToNot(BeTrue()) - } - Expect(cluster.Spec.Paused).ToNot(BeTrue()) - - // Update cluster version - cluster.Labels = map[string]string{v1alpha3.LabelTKR: "v1.19.3---vmware.1"} - err = k8sClient.Update(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - Expect(cluster.Annotations).ToNot(BeNil()) - Expect(cluster.Annotations[constants.ClusterPauseLabel]).To(Equal(cluster.Labels[v1alpha3.LabelTKR])) - Expect(cluster.Spec.Paused).To(BeTrue()) - }) - }) - - Context("if no change in the value of the cluster's TKR label", func() { - It("webhook should not set pause state in the cluster object", func() { - // Create a cluster object - cluster := &clusterapiv1beta1.Cluster{} - cluster.Name = testClusterName - cluster.Namespace = addonNamespace - cluster.Labels = map[string]string{v1alpha3.LabelTKR: "v1.19.3---vmware.1"} - err := k8sClient.Create(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - // It shouldn't be paused - key := client.ObjectKey{ - Namespace: cluster.Namespace, - Name: cluster.Name, - } - err = k8sClient.Get(ctx, key, cluster) - cluster = cluster.DeepCopy() - Expect(err).ToNot(HaveOccurred()) - if cluster.Annotations != nil { - _, ok := cluster.Annotations[constants.ClusterPauseLabel] - Expect(ok).ToNot(BeTrue()) - } - Expect(cluster.Spec.Paused).ToNot(BeTrue()) - - // Update cluster version - cluster.Labels = map[string]string{v1alpha3.LabelTKR: "v1.19.3---vmware.1"} - err = k8sClient.Update(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - // Cluster should not be paused - Expect(cluster.Spec.Paused).ToNot(BeTrue()) - Expect(cluster.Annotations).To(BeNil()) - }) - }) - - Context("if cluster's TKR label is removed during update", func() { - It("webhook should not set pause state in the cluster object", func() { - // Create a cluster object - cluster := &clusterapiv1beta1.Cluster{} - cluster.Name = testClusterName - cluster.Namespace = addonNamespace - cluster.Labels = map[string]string{v1alpha3.LabelTKR: "v1.19.3---vmware.1"} - err := k8sClient.Create(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - // It shouldn't be paused - key := client.ObjectKey{ - Namespace: cluster.Namespace, - Name: cluster.Name, - } - err = k8sClient.Get(ctx, key, cluster) - cluster = cluster.DeepCopy() - Expect(err).ToNot(HaveOccurred()) - if cluster.Annotations != nil { - _, ok := cluster.Annotations[constants.ClusterPauseLabel] - Expect(ok).ToNot(BeTrue()) - } - Expect(cluster.Spec.Paused).ToNot(BeTrue()) - - // Update cluster version - cluster.Labels = map[string]string{} - err = k8sClient.Update(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - // Cluster should not be paused - Expect(cluster.Spec.Paused).ToNot(BeTrue()) - Expect(cluster.Annotations).To(BeNil()) - }) - }) - }) - - When("current cluster's corresponding TKR has 'run.tanzu.vmware.com/legacy-tkr' label", func() { - BeforeEach(func() { - clusterpPauseWebhookManifestFile = "testdata/webhooks/cluster-pause-webhook-manifest-with-legacy-tkr-label.yaml" - testClusterName = "no-pause-test-cluster" - }) - - Context("if the value of the cluster's TKR label changes", func() { - It("webhook should not set pause state in cluster object", func() { - // Create a cluster object - cluster := &clusterapiv1beta1.Cluster{} - cluster.Name = testClusterName - cluster.Namespace = addonNamespace - cluster.Labels = map[string]string{v1alpha3.LabelTKR: "v1.19.3---vmware.1"} - err := k8sClient.Create(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - // It shouldn't be paused - key := client.ObjectKey{ - Namespace: cluster.Namespace, - Name: cluster.Name, - } - err = k8sClient.Get(ctx, key, cluster) - cluster = cluster.DeepCopy() - Expect(err).ToNot(HaveOccurred()) - if cluster.Annotations != nil { - _, ok := cluster.Annotations[constants.ClusterPauseLabel] - Expect(ok).ToNot(BeTrue()) - } - Expect(cluster.Spec.Paused).ToNot(BeTrue()) - - // Update cluster version - cluster.Labels = map[string]string{v1alpha3.LabelTKR: "v1.20.5---vmware.1"} - err = k8sClient.Update(ctx, cluster) - Expect(err).ToNot(HaveOccurred()) - - // Cluster should not be paused - Expect(cluster.Annotations).To(BeNil()) - }) - }) - }) -}) diff --git a/addons/controllers/clusterbootstrap_controller.go b/addons/controllers/clusterbootstrap_controller.go deleted file mode 100644 index 017580b688..0000000000 --- a/addons/controllers/clusterbootstrap_controller.go +++ /dev/null @@ -1,1671 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - "strings" - "time" - - "github.com/go-logr/logr" - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/kubernetes" - "k8s.io/utils/pointer" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - clusterApiPredicates "sigs.k8s.io/cluster-api/util/predicates" - secretutil "sigs.k8s.io/cluster-api/util/secret" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/builder" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/predicate" - "sigs.k8s.io/controller-runtime/pkg/source" - - kappctrlv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kapppkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - versions "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/versions/v1alpha1" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util/clusterbootstrapclone" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// ClusterBootstrapReconciler reconciles a ClusterBootstrap object -type ClusterBootstrapReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Config *addonconfig.ClusterBootstrapControllerConfig - context context.Context - - // internal properties - controller controller.Controller - dynamicClient dynamic.Interface - // on demand dynamic watches for provider refs - providerWatches map[string]client.Object - aggregatedAPIResourcesClient client.Client - // helper for looking up api-resources and getting preferred versions - gvrHelper util.GVRHelper -} - -// NewClusterBootstrapReconciler returns a reconciler for ClusterBootstrap -func NewClusterBootstrapReconciler(c client.Client, log logr.Logger, scheme *runtime.Scheme, config *addonconfig.ClusterBootstrapControllerConfig) *ClusterBootstrapReconciler { - return &ClusterBootstrapReconciler{ - Client: c, - Log: log, - Scheme: scheme, - Config: config, - } -} - -// ClusterBootstrapWatchInputs contains the inputs for Watches set in ClusterBootstrap -type ClusterBootstrapWatchInputs struct { - src source.Source - eventHandler handler.EventHandler -} - -// +kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=clusterBootstraps,verbs=get;list;watch;create;update;patch;delete -// +kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=clusterBootstraps/status,verbs=get;update;patch - -// SetupWithManager performs the setup actions for an ClusterBootstrap controller, using the passed in mgr. -func (r *ClusterBootstrapReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { - blder := ctrl.NewControllerManagedBy(mgr).For(&clusterapiv1beta1.Cluster{}) - - // Set the Watches for resources watched by ClusterBootstrap - for _, watchInputs := range r.watchesForClusterBootstrap() { - blder.Watches(watchInputs.src, watchInputs.eventHandler, builder.WithPredicates(predicates.TKR(r.Log))) - } - - ctrlr, err := blder. - WithOptions(options). - WithEventFilter(clusterApiPredicates.ResourceNotPaused(r.Log)). - WithEventFilter(predicates.ClusterHasLabel(constants.TKRLabelClassyClusters, r.Log)). - Build(r) - if err != nil { - r.Log.Error(err, "Error creating ClusterBootstrap controller") - return err - } - - r.controller = ctrlr - r.context = ctx - dynClient, err := dynamic.NewForConfig(mgr.GetConfig()) - if err != nil { - r.Log.Error(err, "Error creating dynamic client") - return err - } - r.dynamicClient = dynClient - r.providerWatches = make(map[string]client.Object) - - clientset := kubernetes.NewForConfigOrDie(mgr.GetConfig()) - r.gvrHelper = util.NewGVRHelper(ctx, clientset.DiscoveryClient) - - r.aggregatedAPIResourcesClient, err = client.New(mgr.GetConfig(), client.Options{Scheme: mgr.GetScheme()}) - if err != nil { - return err - } - - return nil -} - -// Reconcile performs the reconciliation action for the controller. -func (r *ClusterBootstrapReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - log := r.Log.WithValues(constants.ClusterNamespaceLogKey, req.Namespace, constants.ClusterNameLogKey, req.Name) - - // get cluster object - cluster := &clusterapiv1beta1.Cluster{} - if err := r.Client.Get(ctx, req.NamespacedName, cluster); err != nil { - if apierrors.IsNotFound(err) { - log.Info("Cluster not found") - return ctrl.Result{}, nil - } - - log.Error(err, "unable to fetch cluster") - return ctrl.Result{}, err - } - - // make sure the TKR object exists - tkrName := util.GetClusterLabel(cluster.Labels, constants.TKRLabelClassyClusters) - if tkrName == "" { - return ctrl.Result{}, nil - } - - tkr, err := util.GetTKRByNameV1Alpha3(r.context, r.Client, cluster, tkrName) - if err != nil { - log.Error(err, "unable to fetch TKR object", "name", tkrName) - return ctrl.Result{}, err - } - - // if tkr is not found, should not requeue for the reconciliation - if tkr == nil { - log.Info("TKR object not found", "name", tkrName) - return ctrl.Result{}, nil - } - - if _, labelFound := tkr.Labels[constants.TKRLabelLegacyClusters]; labelFound { - log.Info("Skipping reconciling due to tkr label", "name", tkrName, "label", constants.TKRLabelLegacyClusters) - return ctrl.Result{}, nil - } - - log.Info("Reconciling cluster") - - // if deletion timestamp is set, handle cluster deletion - if !cluster.GetDeletionTimestamp().IsZero() { - return r.reconcileDelete(cluster, log) - } - return r.reconcileNormal(cluster, log) -} - -// reconcileNormal reconciles the ClusterBootstrap object -func (r *ClusterBootstrapReconciler) reconcileNormal(cluster *clusterapiv1beta1.Cluster, log logr.Logger) (ctrl.Result, error) { - // get or clone or patch from template - clusterBootstrap, err := r.createOrPatchClusterBootstrapFromTemplate(cluster, log) - if err != nil { - return ctrl.Result{Requeue: true}, err - } - if clusterBootstrap == nil { - return ctrl.Result{}, nil - } - - clusterBootstrapHelper := clusterbootstrapclone.NewHelper( - r.context, r.Client, r.aggregatedAPIResourcesClient, r.dynamicClient, r.gvrHelper, r.Log) - - if err := clusterBootstrapHelper.AddClusterOwnerRefToExistingProviders(cluster, clusterBootstrap); err != nil { - log.Error(err, "could not add cluster as owner to existing providers") - return ctrl.Result{}, err - } - - // reconcile the proxy settings of the cluster - if err := r.reconcileClusterProxyAndNetworkSettings(cluster, log); err != nil { - return ctrl.Result{}, err - } - - if cluster.Status.Phase != string(clusterapiv1beta1.ClusterPhaseProvisioned) { - r.Log.Info(fmt.Sprintf("cluster %s/%s does not have status phase %s", cluster.Namespace, cluster.Name, clusterapiv1beta1.ClusterPhaseProvisioned)) - return ctrl.Result{}, nil - } - - // Create a PackageInstall CR under the cluster namespace for deploying the kapp-controller on the remote cluster. - // We need kapp-controller to be deployed prior to CNI, CPI, CSI. This will be a no-op if the cluster object is mgmt - // cluster. - if err := r.createOrPatchKappPackageInstall(clusterBootstrap, cluster); err != nil { - // Return error if kapp-controller fails to be deployed, let reconciler try again - return ctrl.Result{}, err - } - - remoteClient, err := util.GetClusterClient(r.context, r.Client, r.Scheme, clusterapiutil.ObjectKey(cluster)) - if err != nil { - return ctrl.Result{RequeueAfter: constants.RequeueAfterDuration}, fmt.Errorf("failed to get remote cluster client: %w", err) - } - - if err := r.prepareRemoteCluster(cluster, remoteClient); err != nil { - return ctrl.Result{}, err - } - - _, err = r.createOrPatchResourcesForCorePackages(cluster, clusterBootstrap, remoteClient, log) - if err != nil { - return ctrl.Result{RequeueAfter: constants.RequeueAfterDuration}, err - } - - _, err = r.createOrPatchResourcesForAdditionalPackages(cluster, clusterBootstrap, remoteClient, log) - if err != nil { - return ctrl.Result{RequeueAfter: constants.RequeueAfterDuration}, err - } - - return ctrl.Result{}, nil -} - -func (r *ClusterBootstrapReconciler) createOrPatchResourcesForCorePackages(cluster *clusterapiv1beta1.Cluster, - clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, - remoteClient client.Client, - log logr.Logger) (ctrl.Result, error) { - - // Create or patch the resources for CNI, CPI, CSI to be running on the remote cluster. - // Those resources include Package CR, data value Secret, PackageInstall CR. - var corePackages []*runtanzuv1alpha3.ClusterBootstrapPackage - corePackages = append(corePackages, clusterBootstrap.Spec.CNI, clusterBootstrap.Spec.CPI, clusterBootstrap.Spec.CSI) - - // The following filtering out of nil items is not necessary in production - // as we do not expect CNI, CPI, CSI to be nil and webhook should handle - // the validations against those fields. This nil filter is mainly to allow - // local envtest run when any above component is missing. - corePackages = removeCorePackagesNils(corePackages) - - for _, corePackage := range corePackages { - // There are different ways to have all the resources created or patched on remote cluster. Current solution is - // to handle packages in sequence order. I.e., Create all resources for CNI first, and then CPI, CSI. It is also - // possible to create all resources in a different order or in parallel. We will consider to use goroutines to create - // all resources in parallel on remote cluster if there is performance issue from sequential ordering. - if err := r.createOrPatchAddonResourcesOnRemote(cluster, corePackage, remoteClient); err != nil { - // For core packages, we require all their creation or patching to succeed, so if error happens against any of the - // packages, we return error and let the reconciler retry again. - log.Error(err, fmt.Sprintf("unable to create or patch all the required resources for %s on cluster: %s/%s", - corePackage.RefName, cluster.Namespace, cluster.Name)) - if meta.IsNoMatchError(err) { - // If the remote cluster does not have the required CRDs, we will requeue the request to try again in 10s. - log.Error(err, "reconciler error - required CRDs are not yet installed, requeing request in 10s") - return ctrl.Result{RequeueAfter: constants.RequeueAfterDuration}, nil - } - return ctrl.Result{}, err - } - // set watches on provider objects in core packages if not already set - if corePackage.ValuesFrom != nil && corePackage.ValuesFrom.ProviderRef != nil { - if err := r.watchProvider(corePackage.ValuesFrom.ProviderRef, cluster.Namespace, log); err != nil { - return ctrl.Result{}, err - } - } - } - return ctrl.Result{}, nil -} - -func (r *ClusterBootstrapReconciler) createOrPatchResourcesForAdditionalPackages(cluster *clusterapiv1beta1.Cluster, - clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, - remoteClient client.Client, - log logr.Logger) (ctrl.Result, error) { - - for _, additionalPkg := range clusterBootstrap.Spec.AdditionalPackages { - if err := r.createOrPatchAddonResourcesOnRemote(cluster, additionalPkg, remoteClient); err != nil { - // Logging has been handled in createOrPatchAddonResourcesOnRemote() - return ctrl.Result{}, err - } - // set watches on provider objects in additional packages if not already set - if additionalPkg.ValuesFrom != nil && additionalPkg.ValuesFrom.ProviderRef != nil { - if err := r.watchProvider(additionalPkg.ValuesFrom.ProviderRef, clusterBootstrap.Namespace, log); err != nil { - return ctrl.Result{}, err - } - } - } - if len(clusterBootstrap.Spec.AdditionalPackages) > 0 { // If we reach this and there are at least one additional package, we need to add finalizer unless it is a management cluster - _, isManagmentCluster := cluster.Labels[constants.ManagementClusterRoleLabel] - if !isManagmentCluster { - err := r.addFinalizersToClusterResources(cluster, log) - if err != nil { - return ctrl.Result{}, err - } - } - } - - if err := r.handleClusterUnpause(cluster, clusterBootstrap, log); err != nil { - log.Error(err, fmt.Sprintf("unable to unpause the cluster: %s/%s", cluster.Namespace, cluster.Name)) - // Need to requeue if unpause is unsuccessful - return ctrl.Result{Requeue: true}, err - } - - return ctrl.Result{}, nil -} - -func (r *ClusterBootstrapReconciler) addFinalizersToClusterResources(cluster *clusterapiv1beta1.Cluster, log logr.Logger) error { - err := r.addFinalizer(cluster, cluster.DeepCopy()) - if err != nil { - log.Error(err, "failed to add finalizer to cluster ") - return err - } - - clusterKubeConfigSecret := &corev1.Secret{} - key := client.ObjectKey{Namespace: cluster.Namespace, Name: secretutil.Name(cluster.Name, secretutil.Kubeconfig)} - err = r.Client.Get(r.context, key, clusterKubeConfigSecret) - if err != nil { - return err - } - err = r.addFinalizer(clusterKubeConfigSecret, clusterKubeConfigSecret.DeepCopy()) - if err != nil { - log.Error(err, "failed to add finalizer to cluster kubeconfig secret") - return err - } - - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err = r.Client.Get(r.context, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return err - } - err = r.addFinalizer(clusterBootstrap, clusterBootstrap.DeepCopy()) - if err != nil { - log.Error(err, "failed to add finalizer to clusterboostrap") - return err - } - - return nil -} - -func (r *ClusterBootstrapReconciler) addFinalizer(o, deepCopy client.Object) error { - controllerutil.AddFinalizer(deepCopy, addontypes.AddonFinalizer) - return r.Client.Patch(r.context, deepCopy, client.MergeFrom(o)) -} - -// handleClusterUnpause unpauses the cluster if the cluster pause annotation is set by cluster pause webhook (cluster has "tkg.tanzu.vmware.com/paused" annotation) -func (r *ClusterBootstrapReconciler) handleClusterUnpause(cluster *clusterapiv1beta1.Cluster, clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, log logr.Logger) error { - if cluster.Spec.Paused && cluster.Annotations != nil { - if value, ok := cluster.Annotations[constants.ClusterPauseLabel]; ok && value == clusterBootstrap.Status.ResolvedTKR { - patchedCluster := cluster.DeepCopy() - delete(patchedCluster.Annotations, constants.ClusterPauseLabel) - patchedCluster.Spec.Paused = false - err := r.Client.Patch(r.context, patchedCluster, client.MergeFrom(cluster)) - if err != nil { - return err - } - log.Info(fmt.Sprintf("successfully unpaused the cluster %s/%s after ClusterBootstrap reconciliation", cluster.Namespace, cluster.Name)) - } - } - return nil -} - -// createOrPatchClusterBootstrapFromTemplate will get, clone or update a ClusterBootstrap associated with a cluster -// all linked secret refs and object refs are cloned into the same namespace as ClusterBootstrap -func (r *ClusterBootstrapReconciler) createOrPatchClusterBootstrapFromTemplate(cluster *clusterapiv1beta1.Cluster, - log logr.Logger) (*runtanzuv1alpha3.ClusterBootstrap, error) { - - tkrName := cluster.Labels[constants.TKRLabelClassyClusters] - clusterBootstrapTemplate := &runtanzuv1alpha3.ClusterBootstrapTemplate{} - key := client.ObjectKey{Namespace: r.Config.SystemNamespace, Name: tkrName} - if err := r.Client.Get(r.context, key, clusterBootstrapTemplate); err != nil { - log.Error(err, "unable to fetch ClusterBootstrapTemplate", "objectkey", key) - return nil, err - } - - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err := r.Client.Get(r.context, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil && !apierrors.IsNotFound(err) { - return nil, err - } - - if clusterBootstrap.Spec != nil && clusterBootstrap.Spec.Paused { - // Skip reconcile if ClusterBootstrap is paused - log.Info("ClusterBootstrap is paused, blocking further processing") - return nil, nil - } - // if found and resolved tkr is the same, return found object as the TKR is supposed to be immutable - // also preserves any user changes - if tkrName == clusterBootstrap.Status.ResolvedTKR { - return clusterBootstrap, nil - } - - clusterBootstrapHelper := clusterbootstrapclone.NewHelper( - r.context, r.Client, r.aggregatedAPIResourcesClient, r.dynamicClient, r.gvrHelper, r.Log) - if clusterBootstrap.UID == "" { - if _, ok := cluster.Annotations[constants.CustomClusterBootstrap]; ok { - log.Info(fmt.Sprintf("ClusterBootstrap object will not be cloned for cluster %s/%s due to the existence of '%s' annotation", cluster.Namespace, cluster.Name, constants.CustomClusterBootstrap)) - return nil, nil - } - // When ClusterBootstrap.UID is empty, that means this is the ClusterBootstrap CR about to be created by clusterbootstrap_controller. - // And clusterBootstrap.Status.ResolvedTKR will be updated accordingly. - log.Info(fmt.Sprintf("ClusterBootstrap for cluster %s/%s does not exist, creating from template %s/%s", - cluster.Namespace, cluster.Name, clusterBootstrapTemplate.Namespace, clusterBootstrapTemplate.Name)) - return clusterBootstrapHelper.CreateClusterBootstrapFromTemplate(clusterBootstrapTemplate, cluster, tkrName) - } else if clusterBootstrap.Status.ResolvedTKR == "" { - // Possible cases fall into this block: - // 1. ClusterBootstrap CR has been created by clusterbootstrap_controller in first reconciliation but errored out before clusterBootstrap.Status was set. The clusterbootstrap_controller reconciles again. - // 2. ClusterBootstrap CR is created by third party(e.g. Tanzu CLI). The clusterbootstrap_controller catches the event and reconciles. - log.Info(fmt.Sprintf("Handling existing ClusterBootstrap %s/%s", clusterBootstrap.Namespace, clusterBootstrap.Name)) - return clusterBootstrapHelper.HandleExistingClusterBootstrap(clusterBootstrap, cluster, tkrName, r.Config.SystemNamespace) - } - // Handle ClusterBootstrap update when TKR version of the cluster is upgraded - if tkrName != clusterBootstrap.Status.ResolvedTKR { - log.Info(fmt.Sprintf("Upgrading ClusterBootstrap from TKR %s to TKR %s", clusterBootstrap.Status.ResolvedTKR, tkrName)) - return r.patchClusterBootstrapFromTemplate(cluster, clusterBootstrap, clusterBootstrapTemplate, clusterBootstrapHelper, tkrName, log) - } - return nil, errors.New("should not happen") -} - -// patchClusterBootstrapFromTemplate will patch ClusterBootstrap associated with a cluster in case of TKR upgrade -func (r *ClusterBootstrapReconciler) patchClusterBootstrapFromTemplate( - cluster *clusterapiv1beta1.Cluster, - clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, - clusterBootstrapTemplate *runtanzuv1alpha3.ClusterBootstrapTemplate, - clusterBootstrapHelper *clusterbootstrapclone.Helper, - tkrName string, - log logr.Logger) (*runtanzuv1alpha3.ClusterBootstrap, error) { - - // Will update ClusterBootstrap based on new clusterBootstrapTemplate - updatedClusterBootstrap := clusterBootstrap.DeepCopy() - patchHelper, err := clusterapipatchutil.NewHelper(updatedClusterBootstrap, r.Client) - if err != nil { - return nil, err - } - if clusterBootstrapTemplate.Spec == nil || updatedClusterBootstrap.Spec == nil { - return nil, errors.New("ClusterBootstrap and ClusterBootstrapTemplate spec can't be nil") - } - - packages, err := r.mergeClusterBootstrapPackagesWithTemplate(cluster, updatedClusterBootstrap, clusterBootstrapTemplate, log) - if err != nil { - return nil, err - } - - // Handle newly added package values - secrets, providers, err := clusterBootstrapHelper.CloneReferencedObjectsFromCBPackages(cluster, packages, clusterBootstrapTemplate.Namespace) - if err != nil { - r.Log.Error(err, "unable to clone secrets or providers") - return nil, err - } - - // No need to update ClusterBootstrap ownerRef - // Patch ClusterBootstrap's Spec - if err := patchHelper.Patch(r.context, updatedClusterBootstrap); err != nil { - log.Error(err, "failed to update clusterBootstrap spec") - return nil, err - } - - // Patch ClusterBootstrap's Resolved TKR - // Note that we are separating out spec and status patch calls, as per current behavior of cluster API Patch utility function, - // patching of the status of the object can go through even if the object's spec has failed to get patched - updatedClusterBootstrap.Status.ResolvedTKR = tkrName - if err := patchHelper.Patch(r.context, updatedClusterBootstrap); err != nil { - log.Error(err, "failed to update clusterBootstrap status") - return nil, err - } - - // ensure ownerRef of clusterBootstrap on created secrets and providers, this can only be done after - // clusterBootstrap is updated - if err := clusterBootstrapHelper.EnsureOwnerRef(updatedClusterBootstrap, secrets, providers); err != nil { - r.Log.Error(err, fmt.Sprintf("unable to ensure ClusterBootstrap %s/%s as a ownerRef on created secrets and providers", clusterBootstrap.Namespace, clusterBootstrap.Name)) - return nil, err - } - - r.Log.Info("updated clusterBootstrap", "clusterBootstrap", updatedClusterBootstrap) - return updatedClusterBootstrap, nil -} - -// mergeClusterBootstrapPackagesWithTemplate will merge all the packageRefs according to the new ClusterBootstrapTemplate -func (r *ClusterBootstrapReconciler) mergeClusterBootstrapPackagesWithTemplate( - cluster *clusterapiv1beta1.Cluster, - updatedClusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, - clusterBootstrapTemplate *runtanzuv1alpha3.ClusterBootstrapTemplate, - log logr.Logger) ([]*runtanzuv1alpha3.ClusterBootstrapPackage, error) { - - // Upgrade the refName of all the core packages - // Package updates keep the users' customization in valuesFrom - // We assume the following enforced by our build and also webhook: - // 1. ClusterBootstrapTemplate will always have Kapp and CNI package available - // 2. ClusterBootstrapTemplate will always have consistent core packages refNames in different TKR versions (same name, different version) - // 3. The Group and Kind for default core package providers will not change across different TKR versions - // 4. All packages, including additional packages, can't be deleted (meaning the package refName can't be changed, only allow version bump) - // 5. We will keep users' customization on valuesFrom of each package, users are responsible for the correctness of the content they put in will work with the next version. - packages := make([]*runtanzuv1alpha3.ClusterBootstrapPackage, 0) - - _, unmanagedCNI := updatedClusterBootstrap.Annotations[constants.UnmanagedCNI] - if unmanagedCNI && updatedClusterBootstrap.Spec.CNI != nil { - return nil, errors.New("Spec.CNI should be empty if the clusterbootstrap is annotated to use unmanaged CNI.") - } - - if unmanagedCNI { - log.Info("Unmanaged CNI") - } else { - if updatedClusterBootstrap.Spec.CNI == nil { - log.Info("no CNI package specified in ClusterBootstrap, and it is not annotated to use a unmanaged CNI. Continue with CNI in ClusterBootstrapTemplate of new TKR") - updatedClusterBootstrap.Spec.CNI = clusterBootstrapTemplate.Spec.CNI.DeepCopy() - } else { - // We don't allow change to the CNI selection once it starts running, however we allow version bump - // TODO: check correctness of the following statement, as we still allow version bump - // ClusterBootstrap webhook will make sure the package RefName always match the original CNI - updatedCNI, cniNamePrefix, err := util.GetBootstrapPackageNameFromTKR(r.context, r.Client, updatedClusterBootstrap.Spec.CNI.RefName, cluster) - if err != nil { - errorMsg := fmt.Sprintf("unable to find any CNI bootstrap package prefixed with '%s' for ClusterBootstrap %s/%s in TKR", cniNamePrefix, cluster.Namespace, cluster.Name) - return nil, errors.Wrap(err, errorMsg) - } - updatedClusterBootstrap.Spec.CNI.RefName = updatedCNI - } - } - - if updatedClusterBootstrap.Spec.Kapp == nil { - log.Info("no Kapp-Controller package specified in ClusterBootstarp, should not happen. Continue with Kapp-Controller in ClusterBootstrapTemplate of new TKR") - updatedClusterBootstrap.Spec.Kapp = clusterBootstrapTemplate.Spec.Kapp.DeepCopy() - } else { - updatedClusterBootstrap.Spec.Kapp.RefName = clusterBootstrapTemplate.Spec.Kapp.RefName - } - - // CSI and CPI can be nil, only update if it's present - // According to assumption 2, no need to do nil check on template - if updatedClusterBootstrap.Spec.CSI == nil { - newCSIPkg := clusterBootstrapTemplate.Spec.CSI.DeepCopy() - updatedClusterBootstrap.Spec.CSI = newCSIPkg - packages = append(packages, newCSIPkg) - } else { - updatedClusterBootstrap.Spec.CSI.RefName = clusterBootstrapTemplate.Spec.CSI.RefName - } - - if updatedClusterBootstrap.Spec.CPI == nil { - newCPIPkg := clusterBootstrapTemplate.Spec.CPI.DeepCopy() - updatedClusterBootstrap.Spec.CPI = newCPIPkg - packages = append(packages, newCPIPkg) - } else { - updatedClusterBootstrap.Spec.CPI.RefName = clusterBootstrapTemplate.Spec.CPI.RefName - } - - // Since we don't allow users to delete additional packages in our webhook - // Meaning the users will not be able to customize the packageRefName - // Find all the corresponding pairs in ClusterBootstrap and new ClusterBootstrapTemplate to update - // Add the additional package if it's only present in the new ClusterBootstrapTemplate - additionalPackageMap := map[string]*runtanzuv1alpha3.ClusterBootstrapPackage{} - for _, pkg := range updatedClusterBootstrap.Spec.AdditionalPackages { - packageRefName, _, err := util.GetPackageMetadata(r.context, r.aggregatedAPIResourcesClient, pkg.RefName, cluster.Namespace) - if err != nil || packageRefName == "" { - errorMsg := fmt.Sprintf("unable to fetch Package.Spec.RefName or Package.Spec.Version from Package %s/%s", cluster.Namespace, pkg.RefName) - r.Log.Error(err, errorMsg) - return nil, errors.Wrap(err, errorMsg) - } - additionalPackageMap[packageRefName] = pkg - } - - additionalPackageTemplateMap := map[string]*runtanzuv1alpha3.ClusterBootstrapPackage{} - for _, templatePkg := range clusterBootstrapTemplate.Spec.AdditionalPackages { - // use the refName in package CR, since the package CR hasn't been cloned at this point, use SystemNamespace to fetch packageCR - packageRefName, _, err := util.GetPackageMetadata(r.context, r.aggregatedAPIResourcesClient, templatePkg.RefName, r.Config.SystemNamespace) - if err != nil || packageRefName == "" { - errorMsg := fmt.Sprintf("unable to fetch Package.Spec.RefName or Package.Spec.Version from Package %s/%s", cluster.Namespace, templatePkg.RefName) - r.Log.Error(err, errorMsg) - return nil, errors.Wrap(err, errorMsg) - } - - // Find the one to one match for additional package in new ClusterBootstrapTemplate and old ClusterBootstrap and update - if pkg, ok := additionalPackageMap[packageRefName]; ok { - oldCBTPkg, err := r.getPackageFromCBTInResolvedTKR(pkg.RefName, cluster, updatedClusterBootstrap, log) - if err != nil { - return nil, err - } - pkg.RefName = templatePkg.RefName - - if isCBPackageValuesFromNil(pkg) && oldCBTPkg != nil && isCBPackageValuesFromNil(oldCBTPkg) { - if templatePkg.ValuesFrom != nil { - pkg.ValuesFrom = templatePkg.ValuesFrom.DeepCopy() - packages = append(packages, pkg) - } - } - - } else { - // If new additional package is added in ClusterBootstrapTemplate, just add it to updated ClusterBootstrap - newPkg := templatePkg.DeepCopy() - updatedClusterBootstrap.Spec.AdditionalPackages = append(updatedClusterBootstrap.Spec.AdditionalPackages, newPkg) - packages = append(packages, newPkg) - } - additionalPackageTemplateMap[packageRefName] = templatePkg - } - - // There might be packages in clusterbootstrap but not in clusterboostraptemplate. - // The below loop tries to find those packages and updates the RefName if it is found in tkr's spec.bootstrapPackages. - // If its not there in tkr's spec.bootstrappackages then user has to update the version of it in clusterbootstrap. - for additionalPkgRefName, additionalPkg := range additionalPackageMap { - if _, ok := additionalPackageTemplateMap[additionalPkgRefName]; !ok { - additionalPkgFromTKr, additionalPkgNamePrefix, err := util.GetBootstrapPackageNameFromTKR(r.context, r.Client, additionalPkg.RefName, cluster) - if err != nil { - log.Info(fmt.Sprintf("unable to find any additional bootstrap package prefixed with '%s' for ClusterBootstrap %s/%s in TKR", additionalPkgNamePrefix, cluster.Namespace, cluster.Name)) - } else { - additionalPkg.RefName = additionalPkgFromTKr - } - } - } - - return packages, nil -} - -func (r *ClusterBootstrapReconciler) getPackageFromCBTInResolvedTKR( - packageRefName string, - cluster *clusterapiv1beta1.Cluster, - updatedClusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, - log logr.Logger) (*runtanzuv1alpha3.ClusterBootstrapPackage, error) { - - clusterBootstrapTemplate := &runtanzuv1alpha3.ClusterBootstrapTemplate{} - key := client.ObjectKey{Namespace: r.Config.SystemNamespace, Name: updatedClusterBootstrap.Status.ResolvedTKR} - if err := r.Client.Get(r.context, key, clusterBootstrapTemplate); err != nil { - log.Error(err, "unable to fetch ClusterBootstrapTemplate", "objectkey", key) - return nil, err - } - for _, pkg := range clusterBootstrapTemplate.Spec.AdditionalPackages { - if packageRefName == pkg.RefName { - return pkg, nil - } - } - - // If the specified package is not found, it is not an error condition. So return error as nil - return nil, nil -} - -func isCBPackageValuesFromNil(cbpkg *v1alpha3.ClusterBootstrapPackage) bool { - return cbpkg.ValuesFrom == nil || (cbpkg.ValuesFrom.ProviderRef == nil && cbpkg.ValuesFrom.SecretRef == "" && cbpkg.ValuesFrom.Inline == nil) -} - -// createOrPatchKappPackageInstall contains the logic that create/update PackageInstall CR for kapp-controller on -// mgmt cluster. The kapp-controller running on mgmt cluster reconciles the PackageInstall CR and creates kapp-controller resources -// on remote workload cluster. This is required for a workload cluster and its corresponding package installations to be functional. -func (r *ClusterBootstrapReconciler) createOrPatchKappPackageInstall(clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, cluster *clusterapiv1beta1.Cluster) error { - // Skip if the cluster object represents the management cluster - if _, exists := cluster.Labels[constants.ManagementClusterRoleLabel]; exists { - r.Log.Info(fmt.Sprintf("cluster %s/%s is management cluster, skip creating or patching the PackageInstall CR for kapp-controller", cluster.Namespace, cluster.Name)) - return nil - } - - // In order to create PackageInstall CR, we need to get the Package.Spec.RefName and Package.Spec.Version - packageRefName, packageVersion, err := util.GetPackageMetadata(r.context, r.aggregatedAPIResourcesClient, clusterBootstrap.Spec.Kapp.RefName, cluster.Namespace) - if packageRefName == "" || packageVersion == "" || err != nil { - // Package.Spec.RefName and Package.Spec.Version are required fields for Package CR. We do not expect them to be - // empty and error should not happen when fetching them from a Package CR. - r.Log.Error(err, fmt.Sprintf("unable to fetch Package.Spec.RefName or Package.Spec.Version from Package %s/%s", - cluster.Namespace, clusterBootstrap.Spec.Kapp.RefName)) - return err - } - - pkgi := &kapppkgiv1alpha1.PackageInstall{ - ObjectMeta: metav1.ObjectMeta{ - // The legacy addons controller uses - convention for naming the PackageInstall CR. - // https://github.com/vmware-tanzu/tanzu-framework/blob/main/addons/controllers/package_reconciler.go#L195. - // util.GeneratePackageInstallName() follows the same pattern. - Name: util.GeneratePackageInstallName(cluster.Name, packageRefName), - // kapp-controller PackageInstall CR is installed under the same namespace as tanzuClusterBootstrap. The namespace - // is also the same as where the cluster belongs. - Namespace: cluster.Namespace, - OwnerReferences: []metav1.OwnerReference{ - { - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - }, - }, - Annotations: map[string]string{addontypes.ClusterNameAnnotation: cluster.Name, addontypes.ClusterNamespaceAnnotation: cluster.Namespace}, - }, - } - - pkgiMutateFn := func() error { - // TODO: Followup on the following fields, only add them if needed. - // https://github.com/vmware-tanzu/tanzu-framework/issues/1677 - // if ipkg.ObjectMeta.Annotations == nil { - // ipkg.ObjectMeta.Annotations = make(map[string]string) - // } - // ipkg.ObjectMeta.Annotations[addontypes.YttMarkerAnnotation] = "" - pkgi.Spec.NoopDelete = true - pkgi.Spec.SyncPeriod = &metav1.Duration{Duration: r.Config.PkgiSyncPeriod} - pkgi.Spec.PackageRef = &kapppkgiv1alpha1.PackageRef{ - // clusterBootstrap.Spec.Kapp.RefName is Package.Name. I.e., kapp-controller.tanzu.vmware.com.0.28.0+vmware.1-tkg.1-rc.1 - // PackageInstall.Spec.PackageRef looks for the Package.Spec.refName which is a short name of the full Package.Name - // packageRefName and packageVersion are fetched from the Package CR. - RefName: packageRefName, - VersionSelection: &versions.VersionSelectionSemver{ - Constraints: packageVersion, - Prereleases: &versions.VersionSelectionSemverPrereleases{}, - }, - } - // Adding the cluster reference to PackageInstall spec to instruct kapp-controller where to deploy - // the underlying resources - clusterKubeconfigDetails := util.GetClusterKubeconfigSecretDetails(cluster) - pkgi.Spec.Cluster = &kappctrlv1alpha1.AppCluster{ - KubeconfigSecretRef: &kappctrlv1alpha1.AppClusterKubeconfigSecretRef{ - Name: clusterKubeconfigDetails.Name, - Key: clusterKubeconfigDetails.Key, - }, - } - // Copy the kapp-controller secret in mgmt cluster to include the TKR nodeSelector info - secret, err := r.createOrPatchPackageInstallSecretForKapp(cluster, clusterBootstrap.Spec.Kapp, r.Client) - if err != nil { - return err - } - if secret != nil { - pkgi.Spec.Values = []kapppkgiv1alpha1.PackageInstallValues{ - {SecretRef: &kapppkgiv1alpha1.PackageInstallValuesSecretRef{ - Name: secret.Name}, - }, - } - } else { - r.Log.Info("[Warning]: Empty secret for kapp-controller package. Either KappControllerConfig controller has not reconciled yet or "+ - "ClusterBootstrap is mis-configured with an incorrect clusterBootstrap.Spec.Kapp.ValuesFrom", - "clusterBootstrap", clusterBootstrap.Name, "namespace", clusterBootstrap.Namespace) - } - - return nil - } - - _, err = controllerutil.CreateOrPatch(r.context, r.Client, pkgi, pkgiMutateFn) - if err != nil { - r.Log.Error(err, fmt.Sprintf("unable to create or patch PackageInstall %s/%s for cluster: %s", - pkgi.Namespace, pkgi.Name, cluster.Name)) - return err - } - - r.Log.Info(fmt.Sprintf("created or patched the PackageInstall %s/%s for cluster %s", pkgi.Namespace, pkgi.Name, cluster.Name)) - return nil -} - -// createOrPatchPackageOnRemote creates the Package CR on remote cluster. In order to install a package on remote cluster -// the Package CR needs to be present. -// createOrPatchPackageOnRemote returns a tuple: (, ) -func (r *ClusterBootstrapReconciler) createOrPatchPackageOnRemote(cluster *clusterapiv1beta1.Cluster, - cbPkg *runtanzuv1alpha3.ClusterBootstrapPackage, clusterClient client.Client) (*kapppkgv1alpha1.Package, error) { - - var err error - // Create or patch Package CR on remote cluster - localPackage := &kapppkgv1alpha1.Package{} - key := client.ObjectKey{Namespace: cluster.Namespace, Name: cbPkg.RefName} - if err = r.aggregatedAPIResourcesClient.Get(r.context, key, localPackage); err != nil { - // If there is an error to get the Carvel Package CR from local cluster, nothing needs to be created/cloned on remote. - // Let the reconciler try again. - r.Log.Error(err, fmt.Sprintf("unable to create or patch Package %s on cluster %s/%s. Error occurs when getting Package %s from the management cluster", - key.String(), cluster.Namespace, cluster.Name, key.String())) - return nil, err - } - remotePackage := &kapppkgv1alpha1.Package{} - remotePackage.SetName(localPackage.Name) - // The Package CR on remote cluster needs to be under configured system namespace - remotePackage.SetNamespace(r.Config.SystemNamespace) - _, err = controllerutil.CreateOrPatch(r.context, clusterClient, remotePackage, func() error { - remotePackage.Spec = *localPackage.Spec.DeepCopy() - // TODO: Follow up to see if we need to preserve all the other fields, like annotations - // https://github.com/vmware-tanzu/tanzu-framework/issues/1678 - return nil - }) - if err != nil { - r.Log.Error(err, fmt.Sprintf("unable to create or patch Package resource %s/%s on cluster: %s/%s", - remotePackage.Namespace, remotePackage.Name, cluster.Namespace, cluster.Name)) - return nil, err - } - return remotePackage, nil -} - -// createOrPatchPackageInstallOnRemote creates or patches PackageInstall CR on remote cluster. The kapp-controller -// running on remote cluster will reconcile it and deploy resources. -func (r *ClusterBootstrapReconciler) createOrPatchPackageInstallOnRemote(cluster *clusterapiv1beta1.Cluster, - cbPkg *runtanzuv1alpha3.ClusterBootstrapPackage, remoteSecret *corev1.Secret, clusterClient client.Client) (*kapppkgiv1alpha1.PackageInstall, error) { - - // In order to create PackageInstall CR, we need to get the Package.Spec.RefName and Package.Spec.Version - remotePackageRefName, remotePackageVersion, err := util.GetPackageMetadata(r.context, clusterClient, cbPkg.RefName, r.Config.SystemNamespace) - if remotePackageRefName == "" || remotePackageVersion == "" || err != nil { - // Package.Spec.RefName and Package.Spec.Version are required fields for Package CR. We do not expect them to be - // empty and error should not happen when fetching them from a Package CR. - r.Log.Error(err, fmt.Sprintf("unable to fetch Package.Spec.RefName or Package.Spec.Version from Package %s/%s on cluster %s/%s", - r.Config.SystemNamespace, cbPkg.RefName, cluster.Namespace, cluster.Name)) - return nil, err - } - - // Create PackageInstall CRs on the remote workload cluster, kapp-controller will take care of reconciling them - remotePkgi := &kapppkgiv1alpha1.PackageInstall{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GeneratePackageInstallName(cluster.Name, remotePackageRefName), - Namespace: r.Config.SystemNamespace, - Annotations: map[string]string{addontypes.ClusterNameAnnotation: cluster.Name, addontypes.ClusterNamespaceAnnotation: cluster.Namespace}, - }, - } - - _, err = controllerutil.CreateOrPatch(r.context, clusterClient, remotePkgi, func() error { - remotePkgi.Spec.ServiceAccountName = r.Config.PkgiServiceAccount - remotePkgi.Spec.SyncPeriod = &metav1.Duration{Duration: r.Config.PkgiSyncPeriod} - // remotePackageRefName and remotePackageVersion are fetched from the Package CR on remote cluster. - remotePkgi.Spec.PackageRef = &kapppkgiv1alpha1.PackageRef{ - RefName: remotePackageRefName, - VersionSelection: &versions.VersionSelectionSemver{ - Constraints: remotePackageVersion, - Prereleases: &versions.VersionSelectionSemverPrereleases{}, - }, - } - - if remoteSecret != nil { - // The nil remoteSecret means no data values for current ClusterBootstrapPackage are needed. And no remote secret - // object gets created. The PackageInstall CR should be created without specifying the spec.Values. - remotePkgi.Spec.Values = []kapppkgiv1alpha1.PackageInstallValues{ - {SecretRef: &kapppkgiv1alpha1.PackageInstallValuesSecretRef{ - Name: remoteSecret.Name}, - }, - } - } - return nil - }) - if err != nil { - r.Log.Error(err, fmt.Sprintf("unable to create or patch PackageInstall resource %s/%s on cluster: %s/%s", - remotePkgi.Namespace, remotePkgi.Name, cluster.Namespace, cluster.Name)) - return nil, err - } - - return remotePkgi, nil -} - -// reconcileSystemNamespace creates system namespace on remote workload cluster. This is because the system namespace -// might not have been created yet when this controller reconciles remote cluster. -func (r *ClusterBootstrapReconciler) reconcileSystemNamespace(clusterClient client.Client) error { - namespace := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: r.Config.SystemNamespace, - }, - } - - result, err := controllerutil.CreateOrPatch(r.context, clusterClient, namespace, nil) - if err != nil { - r.Log.Error(err, "unable to create or patch system namespace") - return err - } - if result != controllerutil.OperationResultNone { - r.Log.Info("created namespace", "namespace", r.Config.SystemNamespace) - } - return nil -} - -func (r *ClusterBootstrapReconciler) prepareRemoteCluster(cluster *clusterapiv1beta1.Cluster, clusterClient client.Client) error { - if err := r.reconcileSystemNamespace(clusterClient); err != nil { - return err - } - - // Create the ServiceAccount on remote cluster, so it could be referenced in PackageInstall CR for kapp-controller - // reconciliation. - if _, err := r.createOrPatchAddonServiceAccountOnRemote(cluster, clusterClient); err != nil { - return err - } - - // Create the ClusterRole on remote cluster, and bind it to the ServiceAccount created in above. kapp-controller - // reconciliation needs privileges. - return r.createOrPatchAddonRBACOnRemote(cluster, clusterClient) -} - -func removeCorePackagesNils(pkgs []*runtanzuv1alpha3.ClusterBootstrapPackage) []*runtanzuv1alpha3.ClusterBootstrapPackage { - var filtered []*runtanzuv1alpha3.ClusterBootstrapPackage - for _, pkg := range pkgs { - if pkg != nil { - filtered = append(filtered, pkg) - } - } - return filtered -} - -// createOrPatchAddonServiceAccountOnRemote creates or patches the addon ServiceAccount on remote cluster. -// The ServiceAccount will be referenced by the PackageInstall CR, so that kapp-controller on remote cluster could consume -// for PackageInstall reconciliation. -func (r *ClusterBootstrapReconciler) createOrPatchAddonServiceAccountOnRemote(cluster *clusterapiv1beta1.Cluster, clusterClient client.Client) (*corev1.ServiceAccount, error) { - serviceAccount := &corev1.ServiceAccount{ - ObjectMeta: metav1.ObjectMeta{ - Name: r.Config.PkgiServiceAccount, - Namespace: r.Config.SystemNamespace, - }, - } - - r.Log.Info(fmt.Sprintf("creating or patching ServiceAccount %s/%s on cluster %s/%s", - serviceAccount.Namespace, serviceAccount.Name, cluster.Namespace, cluster.Name)) - - _, err := controllerutil.CreateOrPatch(r.context, clusterClient, serviceAccount, nil) - if err != nil { - if apierrors.IsAlreadyExists(err) { - // If the error is IsAlreadyExists, we ignore and return nil - return nil, nil - } - r.Log.Error(err, fmt.Sprintf("unable to create or patch ServiceAccount %s/%s on cluster %s/%s", - serviceAccount.Namespace, serviceAccount.Name, cluster.Namespace, cluster.Name)) - return nil, err - } - - return serviceAccount, nil -} - -// createOrPatchAddonRBACOnRemote creates or patches the ClusterRole, ClusterRoleBinding on remote cluster. -// The ClusterRole is bound to the ServiceAccount which is referenced by PackageInstall CR, so that kapp-controller on remote -// cluster could have privileges to lifecycle manage package resources. -func (r *ClusterBootstrapReconciler) createOrPatchAddonRBACOnRemote(cluster *clusterapiv1beta1.Cluster, clusterClient client.Client) error { - addonRole := &rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{ - Name: r.Config.PkgiClusterRole, - }, - } - - if _, err := controllerutil.CreateOrPatch(r.context, clusterClient, addonRole, func() error { - addonRole.Rules = []rbacv1.PolicyRule{ - { - APIGroups: []string{"*"}, - Verbs: []string{"*"}, - Resources: []string{"*"}, - }, - } - return nil - }); err != nil { - if !apierrors.IsAlreadyExists(err) { - r.Log.Error(err, - fmt.Sprintf("unable to create or patch ClusterRole %s/%s on cluster %s/%s", - addonRole.Namespace, addonRole.Name, cluster.Namespace, cluster.Name)) - return err - } - r.Log.Info(fmt.Sprintf("ClusterRole %s already exists on cluster %s/%s. Nothing to create or patch.", addonRole.Name, cluster.Namespace, cluster.Name)) - } - - r.Log.Info(fmt.Sprintf("created or patched ClusterRole %s/%s on cluster %s/%s", - addonRole.Namespace, addonRole.Name, cluster.Namespace, cluster.Name)) - - addonRoleBinding := &rbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{ - Name: r.Config.PkgiClusterRoleBinding, - }, - } - if _, err := controllerutil.CreateOrPatch(r.context, clusterClient, addonRoleBinding, func() error { - addonRoleBinding.Subjects = []rbacv1.Subject{ - { - Kind: "ServiceAccount", - Name: r.Config.PkgiServiceAccount, - Namespace: r.Config.SystemNamespace, - }, - } - addonRoleBinding.RoleRef = rbacv1.RoleRef{ - APIGroup: "rbac.authorization.k8s.io", - Kind: "ClusterRole", - Name: r.Config.PkgiClusterRole, - } - return nil - }); err != nil { - if !apierrors.IsAlreadyExists(err) { - r.Log.Error(err, fmt.Sprintf("unable to create or patch ClusterRoleBinding %s/%s on cluster %s/%s", - addonRoleBinding.Namespace, addonRoleBinding.Name, cluster.Namespace, cluster.Name)) - return err - } - r.Log.Info(fmt.Sprintf("ClusterRoleBinding %s/%s already exists on cluster %s/%s. Nothing to create or patch.", - addonRoleBinding.Namespace, addonRole.Name, cluster.Namespace, cluster.Name)) - } - - return nil -} - -// createOrPatchAddonResourcesOnRemote creates or patches the resources for a cluster bootstrap package on remote workload -// cluster. The resources are [Package CR, Secret for PackageInstall, PackageInstall CR]. -func (r *ClusterBootstrapReconciler) createOrPatchAddonResourcesOnRemote(cluster *clusterapiv1beta1.Cluster, - cbPkg *runtanzuv1alpha3.ClusterBootstrapPackage, clusterClient client.Client) error { - - remotePackage, err := r.createOrPatchPackageOnRemote(cluster, cbPkg, clusterClient) - if err != nil { - return err - } - r.Log.Info(fmt.Sprintf("created the Package CR %s on cluster %s/%s", remotePackage.Name, cluster.Namespace, - cluster.Name)) - - // Create or patch the data value secret on a cluster. The data value secret has been generated by each - // addon config controller on local cluster. - remoteSecret, err := r.createOrPatchPackageInstallSecret(cluster, cbPkg, clusterClient) - if err != nil { - // We expect there is NO error to create or patch the secret used for PackageInstall in a cluster. - // Logging has been handled by createOrPatchPackageInstallSecretOnRemote() already - return err - } - if remoteSecret != nil { - r.Log.Info(fmt.Sprintf("created or patched secret %s/%s for package %s on cluster %s/%s", remoteSecret.Namespace, remoteSecret.Name, remotePackage.Name, cluster.Namespace, - cluster.Name)) - } else if remoteSecret == nil && cbPkg.ValuesFrom != nil && cbPkg.ValuesFrom.ProviderRef != nil { - // We expect the remoteSecret to be created when ProviderRef is not empty, because all addon controllers - // will generate the local secrets for their addon configs(like AntreaConfig) and copy to the remote cluster. If the - // remoteSecret is empty, it means the corresponding addon's controller has not finished generating the local secret. - // For such case, the pkgi creation will be skipped to avoid creating pkgi with empty remoteSecret while the - // addon config is provided. - r.Log.Info(fmt.Sprintf("skip creating the packageInstall for the package %s on cluster %s/%s since the data values secret is not generated yet", - remotePackage.Name, cluster.Namespace, cluster.Name)) - return nil - } - - pkgi, err := r.createOrPatchPackageInstallOnRemote(cluster, cbPkg, remoteSecret, clusterClient) - if err != nil { - return err - } - r.Log.Info(fmt.Sprintf("created or patched the PackageInstall CR %s/%s on cluster %s/%s", - pkgi.Namespace, pkgi.Name, cluster.Namespace, cluster.Name)) - - return nil -} - -func (r *ClusterBootstrapReconciler) patchSecretWithTKGSDataValues(cluster *clusterapiv1beta1.Cluster, secret *corev1.Secret) error { - // Add TKR NodeSelector info if it's a TKGS cluster - infraRef, err := util.GetInfraProvider(cluster) - if err != nil { - return err - } - if infraRef == constants.InfrastructureProviderVSphere { - ok, err := util.IsTKGSCluster(r.context, r.dynamicClient, r.gvrHelper.GetDiscoveryClient(), cluster) - if err != nil { - return err - } - if ok { - upgradeDataValues := addontypes.TKGSDataValues{ - NodeSelector: addontypes.NodeSelector{ - TanzuKubernetesRelease: cluster.Labels[constants.TKRLabelClassyClusters], - }, - Deployment: addontypes.DeploymentUpdateInfo{ - UpdateStrategy: constants.TKGSDeploymentUpdateStrategy, - RollingUpdate: &addontypes.RollingUpdateInfo{ - MaxSurge: constants.TKGSDeploymentUpdateMaxSurge, - MaxUnavailable: constants.TKGSDeploymentUpdateMaxUnavailable, - }, - }, - Daemonset: addontypes.DaemonsetUpdateInfo{ - UpdateStrategy: constants.TKGSDaemonsetUpdateStrategy, - }, - } - TKRDataValueYamlBytes, err := yaml.Marshal(upgradeDataValues) - if err != nil { - return err - } - if secret.StringData == nil { - secret.StringData = make(map[string]string) - } - secret.StringData[constants.TKGSDataValueFileName] = string(TKRDataValueYamlBytes) - - r.Log.Info(fmt.Sprintf("added TKGS data values to secret %s/%s", secret.Namespace, secret.Name)) - } else { - r.Log.Info(fmt.Sprintf("skip adding TKGS data values to secret %s/%s because %s/%s is not a TKGS cluster", secret.Namespace, secret.Name, cluster.Namespace, cluster.Name)) - } - } - - return nil -} - -func (r *ClusterBootstrapReconciler) getDataValueSecretFromBootstrapPackage(cluster *clusterapiv1beta1.Cluster, cbpkg *runtanzuv1alpha3.ClusterBootstrapPackage) (*corev1.Secret, error) { - secretName, err := r.GetDataValueSecretNameFromBootstrapPackage(cbpkg, cluster) - if err != nil { - // logging has been handled in GetDataValueSecretNameFromBootstrapPackage() - return nil, err - } - if secretName == "" && cbpkg.ValuesFrom != nil && cbpkg.ValuesFrom.ProviderRef != nil { - r.Log.Info(fmt.Sprintf("the data values secret is required but not found in the provider's status yet for ClusterBootstrapPackage: %s, nothing to be created or patched on cluster %s/%s", - cbpkg.RefName, cluster.Namespace, cluster.Name)) - return nil, nil - } else if secretName == "" { - r.Log.Info(fmt.Sprintf("no data values secret is needed for ClusterBootstrapPackage: %s, nothing to be created or patched on cluster %s/%s", - cbpkg.RefName, cluster.Namespace, cluster.Name)) - return nil, nil - } - - localSecret := &corev1.Secret{} - key := client.ObjectKey{Namespace: cluster.Namespace, Name: secretName} - if err = r.Get(r.context, key, localSecret); err != nil { - r.Log.Error(err, "unable to fetch secret", "objectKey", key) - return nil, err - } - - // TODO: This logic should be moved to cloneSecretsAndProviders() - // https://github.com/vmware-tanzu/tanzu-framework/issues/1729 - // Add cluster and package labels to secrets if not already present - // This helps us to track the secrets in the watch and trigger Reconcile requests when these secrets are updated - patchedSecret := localSecret.DeepCopy() - if patchSecretWithLabels(patchedSecret, util.ParseStringForLabel(cbpkg.RefName), cluster.Name) { - if err := r.Patch(r.context, patchedSecret, client.MergeFrom(localSecret)); err != nil { - return nil, fmt.Errorf("unable to patch secret labels for secret '%s/%s': %w", localSecret.Namespace, localSecret.Name, err) - } - r.Log.Info(fmt.Sprintf("patched the secret %s/%s with package and cluster labels", localSecret.Namespace, localSecret.Name)) - } - - return patchedSecret, nil -} - -func (r *ClusterBootstrapReconciler) createOrPatchPackageInstallSecretForKapp(cluster *clusterapiv1beta1.Cluster, - cbpkg *runtanzuv1alpha3.ClusterBootstrapPackage, clusterClient client.Client) (*corev1.Secret, error) { - - localSecret, err := r.getDataValueSecretFromBootstrapPackage(cluster, cbpkg) - if err != nil { - return nil, err - } - // controller hasn't finished reconciling - if localSecret == nil { - return nil, nil - } - - dataValuesSecretMutateFn := func() error { - if err := r.patchSecretWithTKGSDataValues(cluster, localSecret); err != nil { - return err - } - return nil - } - - _, err = controllerutil.CreateOrPatch(r.context, clusterClient, localSecret, dataValuesSecretMutateFn) - if err != nil { - r.Log.Error(err, "error creating or patching addon data values secret") - return nil, err - } - return localSecret, nil -} - -// createOrPatchPackageInstallSecret creates or patches the secret used for PackageInstall in a cluster -func (r *ClusterBootstrapReconciler) createOrPatchPackageInstallSecret(cluster *clusterapiv1beta1.Cluster, - cbpkg *runtanzuv1alpha3.ClusterBootstrapPackage, clusterClient client.Client) (*corev1.Secret, error) { - - localSecret, err := r.getDataValueSecretFromBootstrapPackage(cluster, cbpkg) - if err != nil { - return nil, err - } - if localSecret == nil { - return nil, nil - } - - packageRefName, _, err := util.GetPackageMetadata(r.context, r.aggregatedAPIResourcesClient, cbpkg.RefName, cluster.Namespace) - if err != nil { - r.Log.Error(err, fmt.Sprintf("unable to get Package CR %s/%s for its metadata", cluster.Namespace, cbpkg.RefName)) - return nil, err - } - - remoteSecret := &corev1.Secret{} - remoteSecret.Name = util.GenerateDataValueSecretName(cluster.Name, packageRefName) - // The secret will be created or patched under tkg-system namespace on remote cluster - remoteSecret.Namespace = r.Config.SystemNamespace - remoteSecret.Type = corev1.SecretTypeOpaque - - dataValuesSecretMutateFn := func() error { - remoteSecret.StringData = make(map[string]string) - for k, v := range localSecret.Data { - remoteSecret.StringData[k] = string(v) - } - - if err := r.patchSecretWithTKGSDataValues(cluster, remoteSecret); err != nil { - return err - } - - return nil - } - - _, err = controllerutil.CreateOrPatch(r.context, clusterClient, remoteSecret, dataValuesSecretMutateFn) - if err != nil { - r.Log.Error(err, "error creating or patching addon data values secret") - return nil, err - } - return remoteSecret, nil -} - -// patchSecretWithLabels updates the secret by adding package and cluster labels -// Return true if a patch was required, false if the labels were already present -func patchSecretWithLabels(secret *corev1.Secret, pkgName, clusterName string) bool { - updateLabels := false - if secret.Labels == nil { - secret.Labels = map[string]string{} - updateLabels = true - } else if secret.Labels[addontypes.PackageNameLabel] != pkgName || - secret.Labels[addontypes.ClusterNameLabel] != clusterName { - updateLabels = true - } - if updateLabels { - secret.Labels[addontypes.PackageNameLabel] = pkgName - secret.Labels[addontypes.ClusterNameLabel] = clusterName - } - return updateLabels -} - -// watchProvider will set a watch on the Type indicated by providerRef if not already watching -func (r *ClusterBootstrapReconciler) watchProvider(providerRef *corev1.TypedLocalObjectReference, namespace string, log logr.Logger) error { - if providerRef == nil { - return nil - } - groupKind := fmt.Sprintf("%s/%s", *providerRef.APIGroup, providerRef.Kind) - if _, ok := r.providerWatches[groupKind]; ok { - // nothing to do, already watching - return nil - } - - gvr, err := r.gvrHelper.GetGVR(schema.GroupKind{Group: *providerRef.APIGroup, Kind: providerRef.Kind}) - if err != nil { - log.Error(err, "failed to getGVR") - return err - } - provider, err := r.dynamicClient.Resource(*gvr).Namespace(namespace).Get(r.context, providerRef.Name, metav1.GetOptions{}) - if err != nil { - log.Error(err, "Error getting provider object", "provider", provider, "gvr", gvr) - return err - } - r.providerWatches[groupKind] = provider - - log.Info("setting watch on provider", "provider", provider) - // controller-runtime doesn't have an API to remove watches, would the controller panic if a CRD was deleted? - return r.controller.Watch(&source.Kind{Type: provider}, - handler.EnqueueRequestsFromMapFunc(r.ProviderToClusters), - predicate.Funcs{ - CreateFunc: func(e event.CreateEvent) bool { return true }, - UpdateFunc: func(e event.UpdateEvent) bool { return true }, - DeleteFunc: func(e event.DeleteEvent) bool { return false }, - GenericFunc: func(e event.GenericEvent) bool { return true }, - }, - ) -} - -// GetDataValueSecretNameFromBootstrapPackage attempts to get the data value secret name associated with a ClusterBootstrapPackage. -// Users have three ways to provide the data values for a ClusterBootstrapPackage: [Inline, SecretRef, ProviderRef], or -// leave ClusterBootstrapPackage.ValuesFrom field as nil. If data values are provided by ProviderRef, the corresponding -// controller needs to generate the secret object. -// -// Returns: -// - string: The secret name which references to the Secret CR on mgmt cluster under a particular cluster namespace. -// - error: whether there is error when getting the secret name. -func (r *ClusterBootstrapReconciler) GetDataValueSecretNameFromBootstrapPackage(cbPkg *runtanzuv1alpha3.ClusterBootstrapPackage, cluster *clusterapiv1beta1.Cluster) (string, error) { //nolint - var ( - packageRefName string - err error - ) - - packageRefName, _, err = util.GetPackageMetadata(r.context, r.aggregatedAPIResourcesClient, cbPkg.RefName, cluster.Namespace) - if packageRefName == "" || err != nil { - // Package.Spec.RefName and Package.Spec.Version are required fields for Package CR. We do not expect them to be - // empty and error should not happen when fetching them from a Package CR. - r.Log.Error(err, fmt.Sprintf("unable to fetch Package.Spec.RefName or Package.Spec.Version from Package %s/%s", - cluster.Namespace, cbPkg.RefName)) - return "", err - } - - if cbPkg.ValuesFrom != nil { - clusterBootstrapHelper := clusterbootstrapclone.NewHelper( - r.context, r.Client, r.aggregatedAPIResourcesClient, r.dynamicClient, r.gvrHelper, r.Log) - if cbPkg.ValuesFrom.Inline != nil { - packageSecretName := util.GeneratePackageSecretName(cluster.Name, packageRefName) - secret := &corev1.Secret{} - key := client.ObjectKey{Namespace: cluster.Namespace, Name: packageSecretName} - if err = r.Get(r.context, key, secret); err != nil { - if apierrors.IsNotFound(err) { - // secret for package with inline does not exist, we should create one - secret, err = clusterBootstrapHelper.CreateSecretFromInline(cluster, cbPkg, packageRefName) - if err != nil { - return "", err - } - } else { - r.Log.Error(err, "unable to fetch secret for package with inline config", "objectkey", key) - return "", err - } - } else { - secret, err = clusterBootstrapHelper.CreateOrPatchInlineSecret(cluster, cbPkg, secret) - if err != nil { - return "", err - } - } - // ensure the secret has an ownerref to cluster bootstrap - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - if err := r.Client.Get(r.context, client.ObjectKeyFromObject(cluster), clusterBootstrap); err != nil { - return "", err - } - ownerRef := metav1.OwnerReference{ - APIVersion: runtanzuv1alpha3.GroupVersion.String(), - Kind: "ClusterBootstrap", // kind is empty after create - Name: clusterBootstrap.Name, - UID: clusterBootstrap.UID, - Controller: pointer.BoolPtr(true), - BlockOwnerDeletion: pointer.BoolPtr(true), - } - ownerRefsMutateFn := func() error { - secret.OwnerReferences = clusterapiutil.EnsureOwnerRef(secret.OwnerReferences, ownerRef) - return nil - } - _, err := controllerutil.CreateOrPatch(clusterBootstrapHelper.Ctx, clusterBootstrapHelper.K8sClient, secret, ownerRefsMutateFn) - if err != nil { - r.Log.Error(err, fmt.Sprintf("unable to patch the secret %s/%s with CB ownerRef", secret.Namespace, secret.Name)) - return "", err - } - return packageSecretName, nil - } - - if cbPkg.ValuesFrom.SecretRef != "" { - return cbPkg.ValuesFrom.SecretRef, nil - } - - if cbPkg.ValuesFrom.ProviderRef != nil { - gvr, err := r.gvrHelper.GetGVR(schema.GroupKind{Group: *cbPkg.ValuesFrom.ProviderRef.APIGroup, Kind: cbPkg.ValuesFrom.ProviderRef.Kind}) - if err != nil { - r.Log.Error(err, "unable to get GVR") - return "", err - } - provider, err := r.dynamicClient.Resource(*gvr).Namespace(cluster.Namespace).Get(r.context, cbPkg.ValuesFrom.ProviderRef.Name, metav1.GetOptions{}, "status") - if err != nil { - r.Log.Error(err, "unable to fetch provider", "GVR", gvr) - return "", err - } - secretName, found, err := unstructured.NestedString(provider.UnstructuredContent(), "status", "secretRef") - if err != nil { - r.Log.Error(err, "unable to fetch secretRef in provider", "GVR", gvr) - return "", err - } - if !found { - // In this case, we expect the secretRef to be present under status subresource and its value gets updated by - // the corresponding controller. However, the config controller might not create the secret in time. - r.Log.Info("provider status does not have secretRef", "GVR", gvr) - return "", nil - } - return secretName, nil - } - } else { // if cbPkg.ValuesFrom == nil - // When valuesFrom is nil, we still need to create data values secret for vsphere infrastructure in TKGs - infraRef, err := util.GetInfraProvider(cluster) - if err != nil { - return "", err - } - if infraRef == constants.InfrastructureProviderVSphere { - ok, err := util.IsTKGSCluster(r.context, r.dynamicClient, r.gvrHelper.GetDiscoveryClient(), cluster) - if err != nil { - return "", err - } - if ok { - packageSecretName, err := r.generateSecretForPackagesWithEmptyValuesFrom(cbPkg, cluster, packageRefName) - if err != nil { - return "", err - } - return packageSecretName, nil - } - } - // cbPkg.ValuesFrom is nil and not TKGS - return "", nil - } - - // When valuesFrom is not nil, but either valuesFrom.Inline, valuesFrom.SecretRef, or valuesFrom.providerRef is empty or nil, - // we interpret it as the data value secret for that package has not been available yet. One of those three fields needs - // to be provided either by the user or the controller. - err = fmt.Errorf("unable to get the data value secret name from the ClusterBootstrapPackage.ValuesFrom field. "+ - "ClusterBootstrapPackage.RefName: %s. One of the fields under ClusterBootstrapPackage.ValuesFrom is empty or nil", - cbPkg.RefName) - // The message in err object has sufficient information - r.Log.Error(err, "") - return "", err -} - -func (r *ClusterBootstrapReconciler) watchesForClusterBootstrap() []ClusterBootstrapWatchInputs { - return []ClusterBootstrapWatchInputs{ - { - &source.Kind{Type: &runtanzuv1alpha3.TanzuKubernetesRelease{}}, - handler.EnqueueRequestsFromMapFunc(r.TKRToClusters), - }, - { - &source.Kind{Type: &runtanzuv1alpha3.ClusterBootstrap{}}, - handler.EnqueueRequestsFromMapFunc(r.ClusterBootstrapToClusters), - }, - { - &source.Kind{Type: &corev1.Secret{}}, - handler.EnqueueRequestsFromMapFunc(r.SecretsToClusters), - }, - } -} - -func (r *ClusterBootstrapReconciler) reconcileClusterProxyAndNetworkSettings(cluster *clusterapiv1beta1.Cluster, - log logr.Logger) error { - - // use patchHelper to auto detect if there is diff in Cluster CR when performing update - patchHelper, err := clusterapipatchutil.NewHelper(cluster, r.Client) - if err != nil { - return err - } - - // We want the reconciliation to continue even if there are errors in getting proxy settings - // Log an error and proceed with defaulting to empty string - // Individual config controllers are responsible for validating the info provided - HTTPProxy, err := util.ParseClusterVariableInterface(cluster, "proxy", "httpProxy") - if err != nil { - log.Error(err, "unable to fetch cluster HTTP proxy setting, defaulting to empty") - } - HTTPSProxy, err := util.ParseClusterVariableInterface(cluster, "proxy", "httpsProxy") - if err != nil { - log.Error(err, "unable to fetch cluster HTTPS proxy setting, defaulting to empty") - } - NoProxy, err := util.ParseClusterVariableInterfaceArray(cluster, "proxy", "noProxy") - if err != nil { - log.Error(err, "unable to fetch cluster no-proxy proxy setting, defaulting to empty") - } - ProxyCACert, err := util.ParseClusterVariableCert(cluster, "trust", "additionalTrustedCAs", "data") - if err != nil { - log.Error(err, "unable to fetch cluster proxy CA certificate, defaulting to empty") - } - IPFamily, err := util.ParseClusterVariableString(cluster, r.Config.IPFamilyClusterClassVarName) - if err != nil { - log.Error(err, "unable to fetch cluster IP family, defaulting to empty") - } - SkipTLSVerify, err := util.ParseClusterVariableList(cluster, "skipTLSVerify") - if err != nil { - log.Error(err, "unable to fetch cluster IP family, defaulting to empty") - } - if cluster.Annotations == nil { - cluster.Annotations = map[string]string{} - } - - cluster.Annotations[addontypes.HTTPProxyConfigAnnotation] = HTTPProxy - cluster.Annotations[addontypes.HTTPSProxyConfigAnnotation] = HTTPSProxy - cluster.Annotations[addontypes.NoProxyConfigAnnotation] = strings.Join(NoProxy, ",") - cluster.Annotations[addontypes.ProxyCACertConfigAnnotation] = ProxyCACert - cluster.Annotations[addontypes.IPFamilyConfigAnnotation] = IPFamily - cluster.Annotations[addontypes.SkipTLSVerifyConfigAnnotation] = SkipTLSVerify - - log.Info("setting proxy and network configurations in Cluster annotation", addontypes.HTTPProxyConfigAnnotation, HTTPProxy, addontypes.HTTPSProxyConfigAnnotation, HTTPSProxy, addontypes.NoProxyConfigAnnotation, NoProxy, addontypes.ProxyCACertConfigAnnotation, ProxyCACert, addontypes.IPFamilyConfigAnnotation, IPFamily, addontypes.SkipTLSVerifyConfigAnnotation, SkipTLSVerify) - - if err := patchHelper.Patch(r.context, cluster); err != nil { - log.Error(err, "unable to patch Cluster Annotation") - return err - } - - return nil -} - -func (r *ClusterBootstrapReconciler) makeClusterIsReadyForDeletion(cluster *clusterapiv1beta1.Cluster, remoteClient client.Client, log logr.Logger) (bool, error) { - log.Info("preparing cluster for deletion") - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err := r.Client.Get(r.context, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil && !apierrors.IsNotFound(err) { - log.Error(err, "failed to lookup clusterbootstrap") - return false, err - } - if apierrors.IsNotFound(err) { // if there is no clusterbootstrap then the cluster is ready for deletion - return true, nil - } - - if hasPackageInstalls(r.context, remoteClient, cluster, r.Config.SystemNamespace, clusterBootstrap.Spec.AdditionalPackages, clusterBootstrap.Annotations, log) { - log.Info("cluster has additional packageInstalls that need to be deleted") - err = r.removeAdditionalPackageInstalls(remoteClient, cluster, clusterBootstrap, log) - if err != nil { - return false, err - } - return false, nil - } - return true, nil -} - -func (r *ClusterBootstrapReconciler) removeFinalizersFromClusterResources(cluster *clusterapiv1beta1.Cluster, log logr.Logger) error { - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err := r.Client.Get(r.context, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err == nil { - log.Info("removing finalizer for clusterbootstrap") - err = r.removeFinalizer(clusterBootstrap, clusterBootstrap.DeepCopy()) - if err != nil { - return err - } - } else if err != nil && !apierrors.IsNotFound(err) { - log.Error(err, "failed to lookup clusterbootstrap") - return err - } - - clusterKubeConfigSecret := &corev1.Secret{} - key := client.ObjectKey{Namespace: cluster.Namespace, Name: secretutil.Name(cluster.Name, secretutil.Kubeconfig)} - err = r.Client.Get(r.context, key, clusterKubeConfigSecret) - if err == nil { - log.Info("removing finalizer for kubeconfig secret") - err = r.removeFinalizer(clusterKubeConfigSecret, clusterKubeConfigSecret.DeepCopy()) - if err != nil { - return err - } - } else if !apierrors.IsNotFound(err) { - return err - } - log.Info("removing finalizer for cluster") - err = r.removeFinalizer(cluster, cluster.DeepCopy()) - if err != nil { - return err - } - - return nil -} - -func (r *ClusterBootstrapReconciler) reconcileDelete(cluster *clusterapiv1beta1.Cluster, log logr.Logger) (ctrl.Result, error) { - okToRemoveFinalizers := false - var err error - - log.Info("reconciling cluster delete") - existingCluster := &clusterapiv1beta1.Cluster{} - err = r.Client.Get(r.context, client.ObjectKeyFromObject(cluster), existingCluster) - if apierrors.IsNotFound(err) { - log.Info("cluster not found. Skipping reconciling") - return ctrl.Result{}, nil - } - if err != nil { - log.Error(err, "failed to lookup cluster") - return ctrl.Result{RequeueAfter: constants.RequeueAfterDuration}, err - } - - timeOutReached := time.Now().After(cluster.GetDeletionTimestamp().Add(r.Config.ClusterDeleteTimeout)) - if timeOutReached { - log.Info("cluster delete reconcile timeout reached. Proceeding with cluster deletion") - okToRemoveFinalizers = true - } else { - remoteClient, err := util.GetClusterClient(r.context, r.Client, r.Scheme, clusterapiutil.ObjectKey(cluster)) - if err != nil { - return ctrl.Result{RequeueAfter: constants.RequeueAfterDuration}, fmt.Errorf("failed to get remote cluster client: %w", err) - } - okToRemoveFinalizers, err = r.makeClusterIsReadyForDeletion(cluster, remoteClient, log) - if err != nil { - return ctrl.Result{}, err - } - } - - if !okToRemoveFinalizers { - log.Info("cluster is not ready for deletion") - return ctrl.Result{RequeueAfter: constants.RequeueAfterDuration}, nil - } - - log.Info("cluster ready for deletion. Removing finalizers") - if err = r.removeFinalizersFromClusterResources(cluster, log); err != nil { - log.Error(err, "unable to remove finalizers") - return ctrl.Result{}, err - } - - return ctrl.Result{}, nil -} - -func (r *ClusterBootstrapReconciler) removeFinalizer(o, deepCopy client.Object) error { - if controllerutil.ContainsFinalizer(deepCopy, addontypes.AddonFinalizer) { - controllerutil.RemoveFinalizer(deepCopy, addontypes.AddonFinalizer) - return r.Client.Patch(r.context, deepCopy, client.MergeFrom(o)) - } - return nil -} - -func hasPackageInstalls(ctx context.Context, remoteClient client.Client, - cluster *clusterapiv1beta1.Cluster, namespace string, packages []*runtanzuv1alpha3.ClusterBootstrapPackage, cbAnnotations map[string]string, - log logr.Logger) bool { - - for _, pkg := range packages { - if !shouldSkipDeletePackageInstall(ctx, log, cbAnnotations, pkg.RefName) { - pkgInstallName := util.GeneratePackageInstallName(cluster.Name, pkg.RefName) - if packageInstallExistsAndCanBeDeleted(ctx, pkgInstallName, namespace, remoteClient, log) { - log.Info("found " + pkgInstallName + " packageInstall on cluster") - return true - } - } - - } - return false -} - -func shouldSkipDeletePackageInstall(ctx context.Context, log logr.Logger, cbAnnotations map[string]string, pkgName string) bool { - for k, v := range cbAnnotations { - if k == constants.SkipDeletePackageInstallAnnotation { - if len(v) != 0 { - packageNames := strings.Split(v, ",") - for _, p := range packageNames { - if strings.HasPrefix(pkgName, p) { - log.Info(fmt.Sprintf("skip deleting packageInstall for %s, since it's inside annotation %s", pkgName, constants.SkipDeletePackageInstallAnnotation)) - return true - } - } - } - } - } - return false -} - -func packageInstallExistsAndCanBeDeleted(ctx context.Context, pkgInstallName, pkgInstallNamespace string, - remoteClient client.Client, log logr.Logger) bool { - - pkgInstall := &kapppkgiv1alpha1.PackageInstall{} - if err := remoteClient.Get(ctx, client.ObjectKey{Name: pkgInstallName, Namespace: pkgInstallNamespace}, pkgInstall); err != nil { - if apierrors.IsNotFound(err) { - return false - } - log.Error(err, "could not verify status of "+pkgInstallNamespace+"/"+pkgInstallName) - return true - } - for _, condition := range pkgInstall.Status.Conditions { - if condition.Type == kappctrlv1alpha1.DeleteFailed { - log.Info("ignoring " + pkgInstallNamespace + "/" + pkgInstallName + " packageInstall because it is in " + string(kappctrlv1alpha1.DeleteFailed) + " state. ") - return false - } - } - return true -} - -func (r *ClusterBootstrapReconciler) removeAdditionalPackageInstalls(remoteClient client.Client, cluster *clusterapiv1beta1.Cluster, clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, log logr.Logger) error { - // Removes all additional package install CRs from the cluster - log.Info("queueing additional packageInstalls for deletion") - err := r.Client.Get(r.context, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return err - } - if clusterBootstrap == nil { - return nil - } - for _, additionalPkg := range clusterBootstrap.Spec.AdditionalPackages { - if !shouldSkipDeletePackageInstall(r.context, log, clusterBootstrap.Annotations, additionalPkg.RefName) { - additionalPkgInstall := &kapppkgiv1alpha1.PackageInstall{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GeneratePackageInstallName(cluster.Name, additionalPkg.RefName), - Namespace: r.Config.SystemNamespace, - }, - } - err = remoteClient.Delete(r.context, additionalPkgInstall) - if err != nil && !apierrors.IsNotFound(err) { - log.Error(err, fmt.Sprintf("unable to delete package install for %s/%s", - additionalPkgInstall.Namespace, additionalPkg.RefName)) - return err - } - } - } - return nil -} - -func (r *ClusterBootstrapReconciler) generateSecretForPackagesWithEmptyValuesFrom(cbPkg *runtanzuv1alpha3.ClusterBootstrapPackage, cluster *clusterapiv1beta1.Cluster, packageRefName string) (string, error) { - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - if err := r.Client.Get(r.context, client.ObjectKeyFromObject(cluster), clusterBootstrap); err != nil { - return "", err - } - - packageSecret := &corev1.Secret{} - packageSecret.Name = util.GeneratePackageSecretName(cluster.Name, packageRefName) - packageSecret.Namespace = cluster.Namespace - - if _, err := controllerutil.CreateOrPatch(r.context, r.Client, packageSecret, func() error { - packageSecret.StringData = make(map[string]string) - - packageSecret.OwnerReferences = []metav1.OwnerReference{ - { - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - }, - { - APIVersion: runtanzuv1alpha3.GroupVersion.String(), - Kind: "ClusterBootstrap", - Name: clusterBootstrap.Name, - UID: clusterBootstrap.UID, - Controller: pointer.BoolPtr(true), - BlockOwnerDeletion: pointer.BoolPtr(true), - }, - } - - // Set secret.Type to ClusterBootstrapManagedSecret to enable clusterbootstrap_controller to Watch these secrets - packageSecret.Type = constants.ClusterBootstrapManagedSecret - - return nil - }); err != nil { - r.Log.Error(err, "error creating or patching addon package secret") - return "", err - } - - r.Log.Info(fmt.Sprintf("created secret %v for ClusterBootstrapPackage.RefName: %s", packageSecret.Name, cbPkg.RefName)) - return packageSecret.Name, nil -} diff --git a/addons/controllers/clusterbootstrap_controller_test.go b/addons/controllers/clusterbootstrap_controller_test.go deleted file mode 100644 index 59b09bdee7..0000000000 --- a/addons/controllers/clusterbootstrap_controller_test.go +++ /dev/null @@ -1,1678 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - "os" - "strings" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - "sigs.k8s.io/cluster-api/util/secret" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - kapppkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/test/builder" - antreaconfigv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha2" - kvcpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" - vspherecpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" - vspherecsiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" -) - -var _ = Describe("ClusterBootstrap Reconciler", func() { - var ( - clusterName string - clusterNamespace string - clusterResourceFilePath string - ) - - // Constants defined in testdata manifests - const ( - foobarCarvelPackageRefName = "foobar.example.com" - foobarCarvelPackageName = "foobar.example.com.1.17.2" - foobar1CarvelPackageRefName = "foobar1.example.com" - foobar1CarvelPackageName = "foobar1.example.com.1.17.2" - foobar2CarvelPackageRefName = "foobar2.example.com" - foobar = "foobar" - foobarUpdated = "foobar-updated" - foobar1Updated = "foobar1-updated" - ) - - JustBeforeEach(func() { - // set up the certificates and webhook before creating any objects - By("Creating and installing new certificates for ClusterBootstrap Webhooks") - err := testutil.SetupWebhookCertificates(ctx, k8sClient, k8sConfig, &webhookCertDetails) - Expect(err).ToNot(HaveOccurred()) - - // create cluster resources - By("Creating a cluster") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - Expect(testutil.CreateResources(f, cfg, dynamicClient)).To(Succeed()) - - By("Creating kubeconfig for cluster") - Expect(testutil.CreateKubeconfigSecret(cfg, clusterName, clusterNamespace, k8sClient)).To(Succeed()) - }) - - AfterEach(func() { - - By("Deleting kubeconfig for cluster") - key := client.ObjectKey{ - Namespace: clusterNamespace, - Name: secret.Name(clusterName, secret.Kubeconfig), - } - s := &corev1.Secret{} - Expect(k8sClient.Get(ctx, key, s)).To(Succeed()) - Expect(k8sClient.Delete(ctx, s)).To(Succeed()) - - // delete cluster - By("Deleting cluster") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - Expect(testutil.DeleteResources(f, cfg, dynamicClient, false)).To(Succeed()) - }) - - When("cluster is created with topology", func() { - BeforeEach(func() { - clusterName = "test-cluster-tcbt" - clusterNamespace = "cluster-namespace" - clusterResourceFilePath = "testdata/test-cluster-bootstrap-1.yaml" - }) - Context("from a ClusterBootstrapTemplate", func() { - It("should create ClusterBootstrap CR and the related objects for the cluster", func() { - - By("verifying CAPI cluster is created properly") - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - Expect(k8sClient.Status().Update(ctx, cluster)).To(Succeed()) - - By("ClusterBootstrap CR is created with correct ownerReference added") - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - // Verify ownerReference for cluster in cloned object - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - for _, ownerRef := range clusterBootstrap.OwnerReferences { - if ownerRef.UID == cluster.UID { - return true - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("verifying that ClusterBootstrap CR has status resolved to correct TKR") - // Verify ResolvedTKR - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - if clusterBootstrap.Status.ResolvedTKR == "v1.22.3" { - return true - } - - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("cluster should be marked with finalizer") - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), cluster) - if err != nil { - return false - } - return controllerutil.ContainsFinalizer(cluster, addontypes.AddonFinalizer) - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("clusterbootstrap should be marked with finalizer") - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - return controllerutil.ContainsFinalizer(clusterBootstrap, addontypes.AddonFinalizer) - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("cluster kubeconfig secret should be marked with finalizer") - clusterKubeConfigSecret := &corev1.Secret{} - key := client.ObjectKey{Namespace: cluster.Namespace, Name: secret.Name(clusterName, secret.Kubeconfig)} - Eventually(func() bool { - err := k8sClient.Get(ctx, key, clusterKubeConfigSecret) - if err != nil { - return false - } - return controllerutil.ContainsFinalizer(clusterKubeConfigSecret, addontypes.AddonFinalizer) - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("packageinstall should have been created for each additional package in the clusterBoostrap") - Expect(hasPackageInstalls(ctx, k8sClient, cluster, constants.TKGSystemNS, - clusterBootstrap.Spec.AdditionalPackages, clusterBootstrap.Annotations, setupLog)).To(BeTrue()) - - By("packageinstalls for core packages should not have owner references") - var corePackages []*runtanzuv1alpha3.ClusterBootstrapPackage - corePackages = append(corePackages, clusterBootstrap.Spec.CNI, clusterBootstrap.Spec.CPI, clusterBootstrap.Spec.CSI) - pkgInstall := &kapppkgiv1alpha1.PackageInstall{} - for _, pkg := range corePackages { - pkgInstallName := util.GeneratePackageInstallName(cluster.Name, pkg.RefName) - err := k8sClient.Get(ctx, client.ObjectKey{Name: pkgInstallName, Namespace: constants.TKGSystemNS}, pkgInstall) - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgInstall.OwnerReferences) == 0).To(BeTrue()) - - } - - By("packageinstalls for additional packages should not have owner references") - pkgInstall = &kapppkgiv1alpha1.PackageInstall{} - for _, pkg := range clusterBootstrap.Spec.AdditionalPackages { - pkgInstallName := util.GeneratePackageInstallName(cluster.Name, pkg.RefName) - err := k8sClient.Get(ctx, client.ObjectKey{Name: pkgInstallName, Namespace: constants.TKGSystemNS}, pkgInstall) - // Since Foobar provider does not have a controller to create the data values secret and update to the status, the foobar packageInstall - // should not be created so far. - if pkg.RefName == foobarCarvelPackageName { - Expect(err).Should(HaveOccurred()) - Expect(strings.Contains(err.Error(), "packageinstalls.packaging.carvel.dev \"test-cluster-tcbt-foobar\" not found")).To(BeTrue()) - } else { - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgInstall.OwnerReferences) == 0).To(BeTrue()) - } - } - - By("verifying that CNI has been populated properly") - // Verify CNI is populated in the cloned object with the value from the cluster bootstrap template - Expect(clusterBootstrap.Spec.CNI).NotTo(BeNil()) - Expect(strings.HasPrefix(clusterBootstrap.Spec.CNI.RefName, "antrea")).To(BeTrue()) - - Expect(clusterBootstrap.Spec.CNI.RefName).To(Equal("antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1")) - Expect(*clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.APIGroup).To(Equal("cni.tanzu.vmware.com")) - Expect(clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Kind).To(Equal("AntreaConfig")) - providerName := fmt.Sprintf("%s-antrea-package", clusterName) - Expect(clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Name).To(Equal(providerName)) - - By("verifying that the proxy related annotations are populated to cluster object properly") - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), cluster) - if err != nil { - return false - } - if cluster.Annotations != nil && - cluster.Annotations[addontypes.HTTPProxyConfigAnnotation] == "foo.com" && - cluster.Annotations[addontypes.HTTPSProxyConfigAnnotation] == "bar.com" && - cluster.Annotations[addontypes.NoProxyConfigAnnotation] == "foobar.com,google.com" && - cluster.Annotations[addontypes.ProxyCACertConfigAnnotation] == "aGVsbG8KbHWtcH8K" && - cluster.Annotations[addontypes.IPFamilyConfigAnnotation] == "ipv4" && - cluster.Annotations[addontypes.SkipTLSVerifyConfigAnnotation] == "registry1, registry2" { - return true - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("verifying that the providerRef from additionalPackages is cloned into cluster namespace and ownerReferences set properly") - var gvr schema.GroupVersionResource - var object *unstructured.Unstructured - // Verify providerRef exists and also the cloned provider object with ownerReferences to cluster and ClusterBootstrap - Eventually(func() bool { - Expect(len(clusterBootstrap.Spec.AdditionalPackages) > 1).To(BeTrue()) - - fooPackage := clusterBootstrap.Spec.AdditionalPackages[1] - Expect(fooPackage.RefName == foobarCarvelPackageName).To(BeTrue()) - Expect(*fooPackage.ValuesFrom.ProviderRef.APIGroup == "run.tanzu.vmware.com").To(BeTrue()) - Expect(fooPackage.ValuesFrom.ProviderRef.Kind == "FooBar").To(BeTrue()) - - providerName := fmt.Sprintf("%s-foobar-package", clusterName) - Expect(fooPackage.ValuesFrom.ProviderRef.Name == providerName).To(BeTrue()) - - gvr = schema.GroupVersionResource{Group: "run.tanzu.vmware.com", Version: "v1alpha1", Resource: "foobars"} - var err error - object, err = dynamicClient.Resource(gvr).Namespace(clusterNamespace).Get(ctx, providerName, metav1.GetOptions{}) - - Expect(err).ToNot(HaveOccurred()) - - var foundClusterOwnerRef bool - var foundClusterBootstrapOwnerRef bool - var foundLabels bool - for _, ownerRef := range object.GetOwnerReferences() { - if ownerRef.UID == cluster.UID { - foundClusterOwnerRef = true - } - if ownerRef.UID == clusterBootstrap.UID { - foundClusterBootstrapOwnerRef = true - } - } - providerLabels := object.GetLabels() - if providerLabels[addontypes.ClusterNameLabel] == clusterName && - providerLabels[addontypes.PackageNameLabel] == util.ParseStringForLabel(fooPackage.RefName) { - foundLabels = true - } - - if foundClusterOwnerRef && foundClusterBootstrapOwnerRef && foundLabels { - return true - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("verifying the cloned secret of an additional package which with a secretRef") - // Verify that secret object mapping to foobar1 package exists with ownerReferences to cluster and ClusterBootstrap - Eventually(func() bool { - // "foobar1.example.com" is the carvel package ref name - foobar1SecretName := fmt.Sprintf("%s-foobar1-package", cluster.Name) - foobar1Secret := &corev1.Secret{} - if err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: foobar1SecretName}, foobar1Secret); err != nil { - return false - } - var foundClusterOwnerRef bool - var foundClusterBootstrapOwnerRef bool - var foundLabels bool - var foundType bool - for _, ownerRef := range foobar1Secret.GetOwnerReferences() { - if ownerRef.UID == cluster.UID { - foundClusterOwnerRef = true - } - if ownerRef.UID == clusterBootstrap.UID { - foundClusterBootstrapOwnerRef = true - } - } - secretLabels := foobar1Secret.GetLabels() - if secretLabels[addontypes.ClusterNameLabel] == clusterName && - secretLabels[addontypes.PackageNameLabel] == util.ParseStringForLabel(foobar1CarvelPackageName) { - // "foobar1.example.com.1.17.2" is clusterBootstrap.additionalPackages[0].refName - foundLabels = true - } - if foobar1Secret.Type == constants.ClusterBootstrapManagedSecret { - foundType = true - } - if foundClusterOwnerRef && foundClusterBootstrapOwnerRef && foundLabels && foundType { - return true - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // Update the secret created before for foobar1 - // Verify that the updated secret leads to an updated data-values secret - By("Updating the foobar1 package secret", func() { - // In test setup, foobar1 is an additional package with a secretRef as valuesFrom. The referenced secret - // is cloned into cluster namespace on mgmt cluster, and eventually get mirrored on workload cluster - // under tkg-system namespace. - // Any updates to the data value secret under cluster namespace should be eventually reflected on the - // workload cluster under tkg-system namespace. - s := &corev1.Secret{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: fmt.Sprintf("%s-foobar1-package", cluster.Name)}, s)).To(Succeed()) - s.StringData = make(map[string]string) - s.StringData["values.yaml"] = foobar1Updated - Expect(k8sClient.Update(ctx, s)).To(Succeed()) - Eventually(func() bool { - s := &corev1.Secret{} - if err := k8sClient.Get(ctx, client.ObjectKey{Namespace: constants.TKGSystemNS, Name: util.GenerateDataValueSecretName(clusterName, foobar1CarvelPackageRefName)}, s); err != nil { - return false - } - if string(s.Data["values.yaml"]) != foobar1Updated { - return false - } - // TKGS data value should not exist because no VirtualMachine is related to cluster1 - _, ok := s.Data[constants.TKGSDataValueFileName] - Expect(ok).ToNot(BeTrue()) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - - // Simulate a controller adding secretRef to provider status and - // verify that a data-values secret has been created for the Foobar package - By("patching foobar provider object's status resource with a secret ref", func() { - s := &corev1.Secret{} - s.Name = util.GenerateDataValueSecretName(clusterName, foobarCarvelPackageRefName) - s.Namespace = clusterNamespace - s.StringData = map[string]string{} - s.StringData["values.yaml"] = string(foobar) - Expect(k8sClient.Create(ctx, s)).To(Succeed()) - - Expect(unstructured.SetNestedField(object.Object, s.Name, "status", "secretRef")).To(Succeed()) - - _, err := dynamicClient.Resource(gvr).Namespace(clusterNamespace).UpdateStatus(ctx, object, metav1.UpdateOptions{}) - Expect(err).ToNot(HaveOccurred()) - - Eventually(func() bool { - s := &corev1.Secret{} - if err := k8sClient.Get(ctx, client.ObjectKey{Namespace: constants.TKGSystemNS, Name: util.GenerateDataValueSecretName(clusterName, foobarCarvelPackageRefName)}, s); err != nil { - return false - } - if string(s.Data["values.yaml"]) != foobar { - return false - } - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - - By("verifying that data value secret is created for a package with inline config") - Eventually(func() bool { - s := &corev1.Secret{} - if err := k8sClient.Get(ctx, client.ObjectKey{Namespace: constants.TKGSystemNS, Name: util.GenerateDataValueSecretName(clusterName, foobar2CarvelPackageRefName)}, s); err != nil { - return false - } - dataValue := string(s.Data["values.yaml"]) - - if !strings.Contains(dataValue, "key1") || !strings.Contains(dataValue, "sample-value1") || - !strings.Contains(dataValue, "key2") || !strings.Contains(dataValue, "sample-value2") { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("verifying that kapp-controller PackageInstall CR is created under cluster namespace properly on the management cluster") - // Verify kapp-controller PackageInstall CR has been created under cluster namespace on management cluster - kappControllerPkgi := &kapppkgiv1alpha1.PackageInstall{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, - client.ObjectKey{ - Namespace: clusterNamespace, - Name: util.GeneratePackageInstallName(clusterName, "kapp-controller.tanzu.vmware.com"), - }, kappControllerPkgi); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - Expect(len(kappControllerPkgi.OwnerReferences) == 1).To(BeTrue()) - Expect(kappControllerPkgi.OwnerReferences[0].APIVersion).To(Equal(clusterapiv1beta1.GroupVersion.String())) - Expect(kappControllerPkgi.OwnerReferences[0].Name).To(Equal(cluster.Name)) - Expect(kappControllerPkgi.Annotations).ShouldNot(BeNil()) - Expect(kappControllerPkgi.Annotations[addontypes.ClusterNamespaceAnnotation]).Should(Equal(clusterNamespace)) - Expect(kappControllerPkgi.Annotations[addontypes.ClusterNameAnnotation]).Should(Equal(clusterName)) - - remoteClient, err := util.GetClusterClient(ctx, k8sClient, scheme, clusterapiutil.ObjectKey(cluster)) - Expect(err).NotTo(HaveOccurred()) - Expect(remoteClient).NotTo(BeNil()) - - By("verifying that ServiceAccount, ClusterRole and ClusterRoleBinding are created on the workload cluster properly") - sa := &corev1.ServiceAccount{} - Eventually(func() bool { - if err := remoteClient.Get(ctx, - client.ObjectKey{Namespace: constants.TKGSystemNS, Name: constants.PackageInstallServiceAccount}, - sa); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - clusterRole := &rbacv1.ClusterRole{} - Eventually(func() bool { - if err := remoteClient.Get(ctx, - client.ObjectKey{Name: constants.PackageInstallClusterRole}, - clusterRole); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - clusterRoleBinding := &rbacv1.ClusterRoleBinding{} - Eventually(func() bool { - if err := remoteClient.Get(ctx, - client.ObjectKey{Name: constants.PackageInstallClusterRoleBinding}, - clusterRoleBinding); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("verifying that Package CRs of additionalPackages are created on the workload cluster properly") - pkg := &kapppkgv1alpha1.Package{} - pkgRefNameMap := make(map[string]string) - Eventually(func() bool { - for _, clusterBootstrapPackage := range clusterBootstrap.Spec.AdditionalPackages { - if err := remoteClient.Get(ctx, - client.ObjectKey{Namespace: constants.TKGSystemNS, Name: clusterBootstrapPackage.RefName}, - pkg); err != nil { - return false - } - pkgRefNameMap[clusterBootstrapPackage.RefName] = pkg.Spec.RefName - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("verifying that the data value secret is created on the workload cluster properly") - remoteSecret := &corev1.Secret{} - Eventually(func() bool { - for _, clusterBootstrapPackage := range clusterBootstrap.Spec.AdditionalPackages { - if err := remoteClient.Get(ctx, - client.ObjectKey{ - Namespace: constants.TKGSystemNS, - Name: util.GenerateDataValueSecretName(cluster.Name, pkgRefNameMap[clusterBootstrapPackage.RefName]), - }, remoteSecret); err != nil { - return false - } - if clusterBootstrapPackage.ValuesFrom != nil { - Expect(remoteSecret.Data).To(HaveKey("values.yaml")) - } - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("verifying that the PackageInstall CRs are created on the workload cluster properly") - remotePkgi := &kapppkgiv1alpha1.PackageInstall{} - Eventually(func() bool { - for _, clusterBootstrapPackage := range clusterBootstrap.Spec.AdditionalPackages { - if err := remoteClient.Get(ctx, - client.ObjectKey{ - Namespace: constants.TKGSystemNS, - Name: util.GeneratePackageInstallName(clusterName, pkgRefNameMap[clusterBootstrapPackage.RefName]), - }, remotePkgi); err != nil { - return false - } - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - Expect(remotePkgi.Spec.PackageRef.RefName).To(Equal(pkg.Spec.RefName)) - Expect(remotePkgi.Spec.SyncPeriod.Seconds()).To(Equal(constants.PackageInstallSyncPeriod.Seconds())) - Expect(len(remotePkgi.Spec.Values)).NotTo(BeZero()) - Expect(remotePkgi.Spec.Values[0].SecretRef.Name).To(Equal(util.GenerateDataValueSecretName(cluster.Name, pkg.Spec.RefName))) - Expect(remotePkgi.Annotations).ShouldNot(BeNil()) - Expect(remotePkgi.Annotations[addontypes.ClusterNamespaceAnnotation]).Should(Equal(clusterNamespace)) - Expect(remotePkgi.Annotations[addontypes.ClusterNameAnnotation]).Should(Equal(clusterName)) - - // Update the secret created before for foobar resource - // Verify that the updated secret leads to an updated data-values secret - By("Updating the foobar package provider secret", func() { - s := &corev1.Secret{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: util.GenerateDataValueSecretName(clusterName, foobarCarvelPackageRefName)}, s)).To(Succeed()) - s.OwnerReferences = []metav1.OwnerReference{ - { - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: "Cluster", - Name: cluster.Name, - UID: cluster.UID, - }, - } - s.StringData = make(map[string]string) - s.StringData["values.yaml"] = foobarUpdated - Expect(k8sClient.Update(ctx, s)).To(Succeed()) - - Eventually(func() bool { - s := &corev1.Secret{} - if err := k8sClient.Get(ctx, client.ObjectKey{Namespace: constants.TKGSystemNS, Name: util.GenerateDataValueSecretName(clusterName, foobarCarvelPackageRefName)}, s); err != nil { - return false - } - if string(s.Data["values.yaml"]) != foobarUpdated { - return false - } - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - - By("verifying the embedded local object reference is cloned into cluster namespace", func() { - name := "cpi-vsphere-credential" - assertEventuallyExistInNamespace(ctx, k8sClient, clusterNamespace, name, &corev1.Secret{}) - assertSecretContains(ctx, k8sClient, clusterNamespace, name, map[string][]byte{ - "username": []byte("Zm9v"), // foo - "password": []byte("YmFy"), // bar - }) - assertOwnerReferencesExist(ctx, k8sClient, clusterNamespace, name, &corev1.Secret{}, []metav1.OwnerReference{ - {APIVersion: clusterapiv1beta1.GroupVersion.String(), Kind: "Cluster", Name: clusterName}, - {APIVersion: vspherecpiv1alpha1.GroupVersion.String(), Kind: "VSphereCPIConfig", Name: "test-cluster-cpi"}, - }) - }) - - By("verifying the embedded local csi object reference is cloned into cluster namespace", func() { - name := "csi-vsphere-credential" - assertEventuallyExistInNamespace(ctx, k8sClient, clusterNamespace, name, &corev1.Secret{}) - assertSecretContains(ctx, k8sClient, clusterNamespace, name, map[string][]byte{ - "username": []byte("Zm9v"), // foo - "password": []byte("YmFy"), // bar - }) - assertOwnerReferencesExist(ctx, k8sClient, clusterNamespace, name, &corev1.Secret{}, []metav1.OwnerReference{ - {APIVersion: clusterapiv1beta1.GroupVersion.String(), Kind: "Cluster", Name: clusterName}, - {APIVersion: vspherecsiv1alpha1.GroupVersion.String(), Kind: "VSphereCSIConfig", Name: "test-cluster-csi"}, - }) - }) - - By("Updating cluster TKR version", func() { - newTKRVersion := "v1.23.3" - cluster = &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Labels[constants.TKRLabelClassyClusters] = newTKRVersion - - // Mock cluster pause mutating webhook - cluster.Spec.Paused = true - if cluster.Annotations == nil { - cluster.Annotations = map[string]string{} - } - cluster.Annotations[constants.ClusterPauseLabel] = newTKRVersion - Expect(k8sClient.Update(ctx, cluster)).To(Succeed()) - - // Wait for ClusterBootstrap upgrade reconciliation - upgradedClusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), upgradedClusterBootstrap) - if err != nil || upgradedClusterBootstrap.Status.ResolvedTKR != newTKRVersion { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // Validate CNI - cni := upgradedClusterBootstrap.Spec.CNI - Expect(strings.HasPrefix(cni.RefName, "antrea")).To(BeTrue()) - // Note: The value of CNI has been bumped to the one in TKR after cluster upgrade - Expect(cni.RefName).To(Equal("antrea.tanzu.vmware.com.1.5.2--vmware.3-tkg.1-advanced-zshippable")) - Expect(*cni.ValuesFrom.ProviderRef.APIGroup).To(Equal("cni.tanzu.vmware.com")) - Expect(cni.ValuesFrom.ProviderRef.Kind).To(Equal("AntreaConfig")) - Expect(cni.ValuesFrom.ProviderRef.Name).To(Equal(fmt.Sprintf("%s-antrea-package", clusterName))) - - // Validate Kapp - kapp := upgradedClusterBootstrap.Spec.Kapp - Expect(kapp.RefName).To(Equal("kapp-controller.tanzu.vmware.com.0.30.2")) - Expect(*kapp.ValuesFrom.ProviderRef.APIGroup).To(Equal("run.tanzu.vmware.com")) - Expect(kapp.ValuesFrom.ProviderRef.Kind).To(Equal("KappControllerConfig")) - Expect(kapp.ValuesFrom.ProviderRef.Name).To(Equal(fmt.Sprintf("%s-kapp-controller-package", clusterName))) - - // Validate additional packages - // foobar3 should be added, while foobar should be kept even it was removed from the template - Expect(len(upgradedClusterBootstrap.Spec.AdditionalPackages)).To(Equal(4)) - for _, pkg := range upgradedClusterBootstrap.Spec.AdditionalPackages { - if pkg.RefName == "foobar1.example.com.1.18.2" { - Expect(pkg.ValuesFrom.SecretRef).To(Equal(fmt.Sprintf("%s-foobar1-package", clusterName))) - } else if pkg.RefName == "foobar3.example.com.1.17.2" { - Expect(*pkg.ValuesFrom.ProviderRef.APIGroup).To(Equal("run.tanzu.vmware.com")) - Expect(pkg.ValuesFrom.ProviderRef.Kind).To(Equal("FooBar")) - Expect(pkg.ValuesFrom.ProviderRef.Name).To(Equal(fmt.Sprintf("%s-foobar3-package", clusterName))) - } else if pkg.RefName == "foobar.example.com.1.17.2" { - Expect(*pkg.ValuesFrom.ProviderRef.APIGroup).To(Equal("run.tanzu.vmware.com")) - Expect(pkg.ValuesFrom.ProviderRef.Kind).To(Equal("FooBar")) - Expect(pkg.ValuesFrom.ProviderRef.Name).To(Equal(fmt.Sprintf("%s-foobar-package", clusterName))) - } else if pkg.RefName == "foobar2.example.com.1.18.2" { - Expect(pkg.ValuesFrom.Inline).NotTo(BeNil()) - } - } - - // The cluster should be unpaused - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster) - if err != nil { - return false - } - return !cluster.Spec.Paused - }, specialWaitTimeout, pollingInterval).Should(BeTrue()) - if cluster.Annotations != nil { - _, ok := cluster.Annotations[constants.ClusterPauseLabel] - Expect(ok).ToNot(BeTrue()) - } - - }) - - By("Test ClusterBootstrap webhook validateUpdate ", func() { - // fetch the latest clusterbootstrap - Eventually(func() bool { - err = k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - for _, ownerRef := range clusterBootstrap.OwnerReferences { - if ownerRef.UID == cluster.UID { - return true - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // CNI can't be nil - mutateClusterBootstrap := clusterBootstrap.DeepCopy() - mutateClusterBootstrap.Spec.CNI = nil - err = k8sClient.Update(ctx, mutateClusterBootstrap) - Expect(err).To(HaveOccurred()) - Expect(strings.Contains(err.Error(), "spec.cni: Invalid value: \"null\": package can't be nil")).To(BeTrue()) - - // Kapp can't be nil - mutateClusterBootstrap = clusterBootstrap.DeepCopy() - mutateClusterBootstrap.Spec.Kapp = nil - err = k8sClient.Update(ctx, mutateClusterBootstrap) - Expect(err).To(HaveOccurred()) - Expect(strings.Contains(err.Error(), "spec.kapp: Invalid value: \"null\": package can't be nil")).To(BeTrue()) - - // CSI can be nil - mutateClusterBootstrap = clusterBootstrap.DeepCopy() - mutateClusterBootstrap.Spec.CSI = nil - err = k8sClient.Update(ctx, mutateClusterBootstrap) - Expect(err).ToNot(HaveOccurred()) - - err = k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - Expect(err).ToNot(HaveOccurred()) - - // Package CR must exist - mutateClusterBootstrap = clusterBootstrap.DeepCopy() - mutateClusterBootstrap.Spec.CNI.RefName = "antrea.tanzu.vmware.com.1.2.5--vmware.1-tkg.1" - err = k8sClient.Update(ctx, mutateClusterBootstrap) - Expect(strings.Contains(err.Error(), "\"antrea.tanzu.vmware.com.1.2.5--vmware.1-tkg.1\" not found")).To(BeTrue()) - - // Package Refname can't change - mutateClusterBootstrap = clusterBootstrap.DeepCopy() - mutateClusterBootstrap.Spec.CNI.RefName = "foobar1.example.com.1.17.2" - err = k8sClient.Update(ctx, mutateClusterBootstrap) - Expect(strings.Contains(err.Error(), "new package refName and old package refName should be the same")).To(BeTrue()) - - // ProviderRef can't be changed to secretRef or inline - mutateClusterBootstrap = clusterBootstrap.DeepCopy() - mutateClusterBootstrap.Spec.Kapp.ValuesFrom.ProviderRef = nil - mutateClusterBootstrap.Spec.Kapp.ValuesFrom.Inline = map[string]interface{}{} - err = k8sClient.Update(ctx, mutateClusterBootstrap) - Expect(strings.Contains(err.Error(), "change from providerRef to other types of data value representation is not allowed")).To(BeTrue()) - - // Package can't be downgraded - mutateClusterBootstrap = clusterBootstrap.DeepCopy() - mutateClusterBootstrap.Spec.CNI.RefName = "antrea.tanzu.vmware.com.0.13.3--vmware.1-tkg.1" - err = k8sClient.Update(ctx, mutateClusterBootstrap) - Expect(strings.Contains(err.Error(), "package downgrade is not allowed")).To(BeTrue()) - - // Additional package can't be removed - mutateClusterBootstrap = clusterBootstrap.DeepCopy() - mutateClusterBootstrap.Spec.AdditionalPackages = mutateClusterBootstrap.Spec.AdditionalPackages[:len(mutateClusterBootstrap.Spec.AdditionalPackages)-1] - err = k8sClient.Update(ctx, mutateClusterBootstrap) - Expect(strings.Contains(err.Error(), "missing updated additional package")).To(BeTrue()) - }) - - By("Test ClusterBootstrap webhook validateCreate", func() { - namespace := "default" - - // case1 - in := builder.ClusterBootstrap(namespace, "test-cb-1"). - WithCNIPackage(builder.ClusterBootstrapPackage("cni.example.com.1.17.2").WithProviderRef("run.tanzu.vmware.com", "foo", "bar").Build()). - WithAdditionalPackage(builder.ClusterBootstrapPackage("pinniped.example.com.1.11.3").Build()).Build() - err = k8sClient.Create(ctx, in) - Expect(err).Should(HaveOccurred()) - Expect(strings.Contains(err.Error(), "packages.data.packaging.carvel.dev \"cni.example.com.1.17.2\" not found")).To(BeTrue()) - Expect(strings.Contains(err.Error(), "package can't be nil")).To(BeTrue()) - - // case2 - in = builder.ClusterBootstrap(addonNamespace, "test-cb-1"). - WithKappPackage(builder.ClusterBootstrapPackage("kapp-controller.tanzu.vmware.com.0.30.2").WithProviderRef("run.tanzu.vmware.com", "foo", "bar").Build()). - WithCNIPackage(builder.ClusterBootstrapPackage("calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.1").WithProviderRef("cni.tanzu.vmware.com", "CalicoConfig", "invalidName").Build()). - WithAdditionalPackage(builder.ClusterBootstrapPackage("foobar.example.com.1.17.2").WithSecretRef("invalidSecret").Build()).Build() - err = k8sClient.Create(ctx, in) - Expect(err).Should(HaveOccurred()) - Expect(strings.Contains(err.Error(), "calicoconfigs.cni.tanzu.vmware.com \"invalidName\" not found")).To(BeTrue()) - Expect(strings.Contains(err.Error(), "unable to find server preferred resource run.tanzu.vmware.com/foo")).To(BeTrue()) - - }) - - By("Test ClusterBootstrapTemplate webhook validateUpdate", func() { - // fetch the latest clusterbootstraptemplate - clusterBootstrapTemplate := &runtanzuv1alpha3.ClusterBootstrapTemplate{} - key = client.ObjectKey{Namespace: addonNamespace, Name: "v1.22.3"} - err = k8sClient.Get(ctx, key, clusterBootstrapTemplate) - Expect(err).ToNot(HaveOccurred()) - - // ClusterBootstrapTemplate spec should be immutable - clusterBootstrapTemplate.Spec.Kapp = nil - err = k8sClient.Update(ctx, clusterBootstrapTemplate) - Expect(err).Should(HaveOccurred()) - Expect(strings.Contains(err.Error(), "ClusterBootstrapTemplate has immutable spec, update is not allowed")).To(BeTrue()) - }) - By("finalizers should be added back automatically to bootstrap") - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - return controllerutil.ContainsFinalizer(clusterBootstrap, addontypes.AddonFinalizer) - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("delete cluster with foreground propagation policy") - deletePropagation := metav1.DeletePropagationForeground - deleteOptions := client.DeleteOptions{PropagationPolicy: &deletePropagation} - Expect(k8sClient.Delete(ctx, cluster, &deleteOptions)).To(Succeed()) - - By("instacllpackages for additional packages should have been removed.") - Expect(hasPackageInstalls(ctx, k8sClient, cluster, constants.TKGSystemNS, - clusterBootstrap.Spec.AdditionalPackages, clusterBootstrap.Annotations, setupLog)).To(BeTrue()) - Eventually(func() bool { - return hasPackageInstalls(ctx, k8sClient, cluster, constants.TKGSystemNS, - clusterBootstrap.Spec.AdditionalPackages, clusterBootstrap.Annotations, setupLog) - }, waitTimeout, pollingInterval).Should(BeFalse()) - - By("finalizer should be removed from clusterboostrap") - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - return controllerutil.ContainsFinalizer(clusterBootstrap, addontypes.AddonFinalizer) - }, waitTimeout, pollingInterval).Should(BeFalse()) - - By("finalizer should be removed from cluster") - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), cluster) - if err != nil { - return false - } - return controllerutil.ContainsFinalizer(cluster, addontypes.AddonFinalizer) - }, waitTimeout, pollingInterval).Should(BeFalse()) - - By("finalizer should be removed from cluster kubeconfig secret") - key = client.ObjectKey{Namespace: cluster.Namespace, Name: secret.Name(clusterName, secret.Kubeconfig)} - Eventually(func() bool { - err := k8sClient.Get(ctx, key, clusterKubeConfigSecret) - if err != nil { - return false - } - return controllerutil.ContainsFinalizer(clusterKubeConfigSecret, addontypes.AddonFinalizer) - }, waitTimeout, pollingInterval).Should(BeFalse()) - }) - }) - }) - - When("cluster is created from clusterBootstrapTemplate", func() { - BeforeEach(func() { - clusterName = "test-cluster-tcbt-2" - clusterNamespace = "cluster-namespace-2" - clusterResourceFilePath = "testdata/test-cluster-bootstrap-2.yaml" - }) - Context("from a ClusterBootstrapTemplate", func() { - It("should perform ClusterBootstrap reconciliation & block reconciliation if ClusterBootstrap gets paused", func() { - - By("verifying CAPI cluster is created properly") - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - Expect(k8sClient.Status().Update(ctx, cluster)).To(Succeed()) - - By("ClusterBootstrap CR is created") - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - // Verify ownerReference for cluster in cloned object - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - for _, ownerRef := range clusterBootstrap.OwnerReferences { - if ownerRef.UID == cluster.UID { - return true - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("should create secret for packages with empty valuesFrom & corresponding data values secret in workload cluster.", func() { - remoteClient, err := util.GetClusterClient(ctx, k8sClient, scheme, clusterapiutil.ObjectKey(cluster)) - Expect(err).NotTo(HaveOccurred()) - Expect(remoteClient).NotTo(BeNil()) - - clusterBootstrapPackages := []*runtanzuv1alpha3.ClusterBootstrapPackage{ - clusterBootstrap.Spec.CNI, - clusterBootstrap.Spec.CPI, - clusterBootstrap.Spec.CSI, - clusterBootstrap.Spec.Kapp, - } - clusterBootstrapPackages = append(clusterBootstrapPackages, clusterBootstrap.Spec.AdditionalPackages...) - for _, pkg := range clusterBootstrapPackages { - if pkg == nil || pkg.ValuesFrom != nil { - continue - } - - localSecret := &corev1.Secret{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, - client.ObjectKey{ - Namespace: clusterNamespace, - Name: util.GeneratePackageSecretName(cluster.Name, pkg.RefName), - }, localSecret); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - remoteSecret := &corev1.Secret{} - Eventually(func() bool { - if err := remoteClient.Get(ctx, - client.ObjectKey{ - Namespace: constants.TKGSystemNS, - Name: util.GenerateDataValueSecretName(cluster.Name, foobar2CarvelPackageRefName), - }, remoteSecret); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Expect(remoteSecret.Data).To(HaveKey(constants.TKGSDataValueFileName)) - } - }) - - By("Should have remote secret value same as foobar1secret secret value and should have created TKGS data values") - remoteClient, err := util.GetClusterClient(ctx, k8sClient, scheme, clusterapiutil.ObjectKey(cluster)) - Expect(err).NotTo(HaveOccurred()) - Expect(remoteClient).NotTo(BeNil()) - s := &corev1.Secret{} - remoteSecret := &corev1.Secret{} - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: fmt.Sprintf("%s-foobar1-package", clusterName)}, s) - if err != nil { - return false - } - Expect(s.Data).To(HaveKey("values.yaml")) - Expect(s.Data).NotTo(HaveKey(constants.TKGSDataValueFileName)) - err = remoteClient.Get(ctx, client.ObjectKey{Namespace: constants.TKGSystemNS, Name: util.GenerateDataValueSecretName(clusterName, foobar1CarvelPackageRefName)}, remoteSecret) - if err != nil { - return false - } - if string(s.Data["values.yaml"]) != string(remoteSecret.Data["values.yaml"]) { - return false - } - Expect(remoteSecret.Data).To(HaveKey("values.yaml")) - Expect(remoteSecret.Data).To(HaveKey(constants.TKGSDataValueFileName)) - // TKGS data values should be added because cluster has related VirtualMachine - valueTexts, ok := remoteSecret.Data[constants.TKGSDataValueFileName] - if !ok { - return false - } - fmt.Println(string(valueTexts)) - Expect(strings.Contains(string(valueTexts), "nodeSelector:\n run.tanzu.vmware.com/tkr: v1.22.4")).To(BeTrue()) - Expect(strings.Contains(string(valueTexts), "deployment:\n updateStrategy: RollingUpdate")).To(BeTrue()) - Expect(strings.Contains(string(valueTexts), "daemonset:\n updateStrategy: OnDelete")).To(BeTrue()) - Expect(strings.Contains(string(valueTexts), "maxUnavailable: 0")).To(BeTrue()) - Expect(strings.Contains(string(valueTexts), "maxSurge: 1")).To(BeTrue()) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("Pause ClusterBootstrap CR") - clusterBootstrap.Spec.Paused = true - Expect(k8sClient.Update(ctx, clusterBootstrap)).To(Succeed()) - - // should block ClusterBootstrap reconciliation if it is paused - By("Should not reconcile foobar1secret secret change", func() { - // Get secretRef - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: fmt.Sprintf("%s-foobar1-package", clusterName)}, s)).To(Succeed()) - s.StringData = make(map[string]string) - s.StringData["values.yaml"] = "values changed" - Expect(k8sClient.Update(ctx, s)).To(Succeed()) - - // Wait 10 seconds in case reconciliation happens - time.Sleep(10 * time.Second) - - Eventually(func() bool { - remoteSecret := &corev1.Secret{} - if err := k8sClient.Get(ctx, client.ObjectKey{Namespace: constants.TKGSystemNS, Name: util.GenerateDataValueSecretName(clusterName, foobar1CarvelPackageRefName)}, remoteSecret); err != nil { - return false - } - // values.yaml should not update - Expect(string(s.Data["values.yaml"]) == string(remoteSecret.Data["values.yaml"])).ToNot(BeTrue()) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - }) - }) - }) - - When("Cluster is created", func() { - - var routableAntreaConfig *antreaconfigv1alpha2.AntreaConfig - - BeforeEach(func() { - clusterName = "test-cluster-tcbt-3" - clusterNamespace = "cluster-namespace-3" - clusterResourceFilePath = "testdata/test-cluster-bootstrap-3.yaml" - ns := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - } - err := k8sClient.Create(ctx, ns) - if err != nil { - Expect(apierrors.IsAlreadyExists(err)).To(BeTrue()) - } - - routableAntreaConfig = &antreaconfigv1alpha2.AntreaConfig{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%s-antrea-package", clusterName), - Namespace: clusterNamespace, - }, - Spec: antreaconfigv1alpha2.AntreaConfigSpec{ - Antrea: antreaconfigv1alpha2.Antrea{ - AntreaConfigDataValue: antreaconfigv1alpha2.AntreaConfigDataValue{ - TrafficEncapMode: "hybrid", - NoSNAT: true, - FeatureGates: antreaconfigv1alpha2.AntreaFeatureGates{ - AntreaProxy: true, - EndpointSlice: true, - }, - }, - }, - }, - } - Expect(k8sClient.Create(ctx, routableAntreaConfig)).NotTo(HaveOccurred()) - assertEventuallyExistInNamespace(ctx, k8sClient, clusterNamespace, routableAntreaConfig.Name, &antreaconfigv1alpha2.AntreaConfig{}) - }) - - Context("with a routable AntreaConfig resource already exist", func() { - It("clusterbootstrap_controller should not overwrite the existing AntreaConfig Specs", func() { - - // get clusterBootstrap object for the cluster and inspect that its CNI matches the AntreaConfig that was pre-created. - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, clusterBootstrap) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue()) - - antreaConfig := &antreaconfigv1alpha2.AntreaConfig{} - // use the name from cloned clusterBootstrap to verify it is the same - assertOwnerReferencesExist(ctx, k8sClient, clusterNamespace, clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Name, antreaConfig, []metav1.OwnerReference{ - { - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: "Cluster", - Name: clusterName, - }, - }) - Expect(antreaConfig.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode).To( - Equal(routableAntreaConfig.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode)) - Expect(antreaConfig.Spec.Antrea.AntreaConfigDataValue.NoSNAT).To( - Equal(routableAntreaConfig.Spec.Antrea.AntreaConfigDataValue.NoSNAT)) - Expect(antreaConfig.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaProxy).To( - Equal(routableAntreaConfig.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaProxy)) - Expect(antreaConfig.Spec.Antrea.AntreaConfigDataValue.FeatureGates.EndpointSlice).To( - Equal(routableAntreaConfig.Spec.Antrea.AntreaConfigDataValue.FeatureGates.EndpointSlice)) - }) - }) - }) - - When("Legacy cluster is created", func() { - BeforeEach(func() { - clusterName = "test-cluster-legacy" - clusterNamespace = "legacy-namespace" - clusterResourceFilePath = "testdata/test-cluster-legacy.yaml" - }) - Context("and clusterboostrap template does not exists", func() { - It("clusterbootstrap controller should not attempt to reconcile it", func() { - By("verifying CAPI cluster is created properly") - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - Expect(k8sClient.Status().Update(ctx, cluster)).To(Succeed()) - }) - }) - }) - - When("Cluster with no valuesFrom for kapp-controller", func() { - BeforeEach(func() { - clusterName = "test-cluster-4" - clusterNamespace = "cluster-namespace-4" - clusterResourceFilePath = "testdata/test-cluster-bootstrap-4.yaml" - ns := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - } - err := k8sClient.Create(ctx, ns) - if err != nil { - Expect(apierrors.IsAlreadyExists(err)).To(BeTrue()) - } - }) - Context("controller should not crash", func() { - It("and create package install for kapp ", func() { - By("setting cluster phase to provisioned") - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - Expect(k8sClient.Status().Update(ctx, cluster)).To(Succeed()) - - pkgiName := util.GeneratePackageInstallName(clusterName, "kapp-controller.tanzu.vmware.com.0.31.0") - pkgi := &kapppkgiv1alpha1.PackageInstall{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: pkgiName}, pkgi); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - }) - }) - - // This test case is for ensuring that controller is watching providerRef for core packages. - // 1. create antrea with foobar cr as provider, packageinstall gets generated with a given secret - // 2. replace secret in .status.secretRef of foobar cr provider - When("Cluster with external provider for CNI", func() { - BeforeEach(func() { - clusterName = "test-cluster-5" - clusterNamespace = "cluster-namespace-5" - clusterResourceFilePath = "testdata/test-cluster-bootstrap-5.yaml" - ns := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - } - Expect(k8sClient.Create(ctx, ns)).To(Succeed()) - }) - Context("When providerRef exists", func() { - It("Should create package install for antrea with package datavalues for secret and "+ - "update package install for antrea with renamed secret as controller is watching for changes to providerRef", func() { - - By("setting cluster phase to provisioned") - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - Expect(k8sClient.Status().Update(ctx, cluster)).To(Succeed()) - - Eventually(func(g Gomega) { - providerName := fmt.Sprintf("%s-antrea-package", clusterName) - gvr := schema.GroupVersionResource{Group: "run.tanzu.vmware.com", Version: "v1alpha1", Resource: "foobars"} - provider, err := dynamicClient.Resource(gvr).Namespace(clusterNamespace).Get(ctx, providerName, metav1.GetOptions{}) - g.Expect(err).ToNot(HaveOccurred()) - - s := &corev1.Secret{} - s.Name = util.GenerateDataValueSecretName(clusterName, "antrea.tanzu.vmware.com.1.10.5--vmware.1-tkg.2") - s.Namespace = clusterNamespace - s.StringData = map[string]string{} - s.StringData["values.yaml"] = foobar - err = k8sClient.Create(ctx, s) - - if err != nil { - g.Expect(apierrors.IsAlreadyExists(err)).To(BeTrue()) - } - g.Expect(unstructured.SetNestedField(provider.Object, s.Name, "status", "secretRef")).To(Succeed()) - - _, err = dynamicClient.Resource(gvr).Namespace(clusterNamespace).UpdateStatus(ctx, provider, metav1.UpdateOptions{}) - g.Expect(err).ToNot(HaveOccurred()) - - pkgiName := util.GeneratePackageInstallName(clusterName, "antrea.tanzu.vmware.com.1.10.5--vmware.1-tkg.2") - pkgi := &kapppkgiv1alpha1.PackageInstall{} - g.Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: constants.TKGSystemNS, Name: pkgiName}, pkgi)).To(Succeed()) - - g.Expect(len(pkgi.Spec.Values) > 0).To(BeTrue()) - - dataValueSecret := pkgi.Spec.Values[0].SecretRef.Name - dataValuesGenerated := &corev1.Secret{} - - g.Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: constants.TKGSystemNS, Name: dataValueSecret}, dataValuesGenerated)).To(Succeed()) - g.Expect(string(dataValuesGenerated.Data["values.yaml"])).To(Equal(foobar)) - }, waitTimeout, pollingInterval).Should(Succeed()) - - Eventually(func(g Gomega) { - providerName := fmt.Sprintf("%s-antrea-package", clusterName) - gvr := schema.GroupVersionResource{Group: "run.tanzu.vmware.com", Version: "v1alpha1", Resource: "foobars"} - provider, err := dynamicClient.Resource(gvr).Namespace(clusterNamespace).Get(ctx, providerName, metav1.GetOptions{}) - g.Expect(err).ToNot(HaveOccurred()) - - // update the secret in provider - s := &corev1.Secret{} - s.Name = "updated-antrea-secret" - s.Namespace = clusterNamespace - s.StringData = map[string]string{} - s.StringData["values.yaml"] = "foobarbaz" - err = k8sClient.Create(ctx, s) - - if err != nil { - g.Expect(apierrors.IsAlreadyExists(err)).To(BeTrue()) - } - - g.Expect(unstructured.SetNestedField(provider.Object, s.Name, "status", "secretRef")).To(Succeed()) - - _, err = dynamicClient.Resource(gvr).Namespace(clusterNamespace).UpdateStatus(ctx, provider, metav1.UpdateOptions{}) - g.Expect(err).ToNot(HaveOccurred()) - - pkgiName := util.GeneratePackageInstallName(clusterName, "antrea.tanzu.vmware.com.1.10.5--vmware.1-tkg.2") - pkgi := &kapppkgiv1alpha1.PackageInstall{} - g.Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: constants.TKGSystemNS, Name: pkgiName}, pkgi)).To(Succeed()) - - g.Expect(len(pkgi.Spec.Values) > 0).To(BeTrue()) - - dataValueSecret := pkgi.Spec.Values[0].SecretRef.Name - dataValuesGenerated := &corev1.Secret{} - g.Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: constants.TKGSystemNS, Name: dataValueSecret}, dataValuesGenerated)).To(Succeed()) - - g.Expect(string(dataValuesGenerated.Data["values.yaml"])).To(Equal("foobarbaz")) - - }, waitTimeout, pollingInterval).Should(Succeed()) - - }) - }) - }) - - When("cluster is created with custom clusterbootstrap annotation present", func() { - BeforeEach(func() { - clusterName = "test-cluster-6" - clusterNamespace = "cluster-namespace-6" - clusterResourceFilePath = "testdata/test-cluster-bootstrap-6.yaml" - }) - Context("custom ClusterBootstrap being used", func() { - It("should not create ClusterBootstrap CR by cloning from the template", func() { - - By("verifying cluster has the annotation and CB is not cloned from template") - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - Expect(cluster.Annotations).NotTo(BeNil()) - _, ok := cluster.Annotations[constants.CustomClusterBootstrap] - Expect(ok).To(BeTrue()) - - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - Expect(err).Should(HaveOccurred()) - Expect(strings.Contains(err.Error(), fmt.Sprintf("clusterbootstraps.run.tanzu.vmware.com \"%s\" not found", clusterName))).To(BeTrue()) - }) - }) - }) - - // This test case is for ensuring that controller is watching providerRef for additional packages. - // 1. create kubevip-cloudprovider with foobar cr as provider, packageinstall gets generated with a given secret - // 2. replace secret in .status.secretRef of foobar cr provider - When("Cluster with kubevipcloudprovider", func() { - BeforeEach(func() { - clusterName = "test-cluster-7" - clusterNamespace = "cluster-namespace-7" - clusterResourceFilePath = "testdata/test-cluster-bootstrap-7.yaml" - ns := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - } - Expect(k8sClient.Create(ctx, ns)).To(Succeed()) - }) - - Context("from a ClusterBootstrap", func() { - It("should perform ClusterBootstrap reconciliation", func() { - - By("verifying CAPI cluster is created properly") - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - Expect(k8sClient.Status().Update(ctx, cluster)).To(Succeed()) - - By("patching kubevip cloudprovider with ownerRef as ClusterBootstrapController would do") - // the kvcp config object should be deployed - config := &kvcpiv1alpha1.KubevipCPIConfig{} - key := client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, config); err != nil { - return false - } - - if len(config.OwnerReferences) > 0 { - return false - } - - Expect(len(config.OwnerReferences)).Should(Equal(0)) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // patch the KubevipCPIConfig with ownerRef - patchedKubevipCPIConfig := config.DeepCopy() - ownerRef := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - - ownerRef.Kind = "Cluster" - patchedKubevipCPIConfig.OwnerReferences = clusterapiutil.EnsureOwnerRef(patchedKubevipCPIConfig.OwnerReferences, ownerRef) - Expect(k8sClient.Patch(ctx, patchedKubevipCPIConfig, client.MergeFrom(config))).ShouldNot(HaveOccurred()) - - By("Should have remote secret value created for kubevip cloud provider") - remoteClient, err := util.GetClusterClient(ctx, k8sClient, scheme, clusterapiutil.ObjectKey(cluster)) - Expect(err).NotTo(HaveOccurred()) - Expect(remoteClient).NotTo(BeNil()) - remoteSecret := &corev1.Secret{} - Eventually(func() bool { - err = remoteClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: util.GenerateDataValueSecretName(clusterName, constants.KubevipCloudProviderAddonName)}, remoteSecret) - if err != nil { - return false - } - Expect(remoteSecret.Data).To(HaveKey("values.yaml")) - valueTexts, ok := remoteSecret.Data["values.yaml"] - if !ok { - return false - } - Expect(strings.Contains(string(valueTexts), "loadbalancerCIDRs: 10.0.0.1/24")).Should(BeTrue()) - Expect(strings.Contains(string(valueTexts), "loadbalancerIPRanges: 10.0.0.1-10.0.0.2")).Should(BeTrue()) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - }) - }) - - // This test case is for ensuring that controller will skip deleting additional packages that's inside annotation run.tanzu.vmware.com/skip-packageinstall-deletion - When("Cluster with ako", func() { - BeforeEach(func() { - clusterName = "test-cluster-8" - clusterNamespace = "cluster-namespace-8" - clusterResourceFilePath = "testdata/test-cluster-bootstrap-8.yaml" - ns := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterNamespace, - }, - } - Expect(k8sClient.Create(ctx, ns)).To(Succeed()) - }) - - Context("from a ClusterBootstrap", func() { - It("should perform ClusterBootstrap reconciliation", func() { - - By("verifying CAPI cluster is created properly") - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - Expect(k8sClient.Status().Update(ctx, cluster)).To(Succeed()) - - By("ClusterBootstrap CR is created with correct ownerReference added") - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - // Verify ownerReference for cluster in cloned object - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - for _, ownerRef := range clusterBootstrap.OwnerReferences { - if ownerRef.UID == cluster.UID { - return true - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - By("patching secret of ako with ownerRef as ClusterBootstrapController would do") - config := &corev1.Secret{} - key := client.ObjectKey{ - Namespace: clusterNamespace, - Name: util.GenerateDataValueSecretName(clusterName, "load-balancer-and-ingress-service"), - } - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, config); err != nil { - return false - } - - if len(config.OwnerReferences) > 0 { - return false - } - - Expect(len(config.OwnerReferences)).Should(Equal(0)) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - patchedSecret := config.DeepCopy() - ownerRef := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: "Cluster", - Name: cluster.Name, - UID: cluster.UID, - } - - patchedSecret.OwnerReferences = clusterapiutil.EnsureOwnerRef(patchedSecret.OwnerReferences, ownerRef) - Expect(k8sClient.Patch(ctx, patchedSecret, client.MergeFrom(config))).ShouldNot(HaveOccurred()) - - By("ClusterBootstrap CR is created with correct ownerReference added") - // Verify ownerReference for cluster in cloned object - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - for _, ownerRef := range clusterBootstrap.OwnerReferences { - if ownerRef.UID == cluster.UID { - return true - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("Should have remote packageinstall created for ako") - remoteClient, err := util.GetClusterClient(ctx, k8sClient, scheme, clusterapiutil.ObjectKey(cluster)) - Expect(err).NotTo(HaveOccurred()) - Expect(remoteClient).NotTo(BeNil()) - - akoPackageInstallExist := func() bool { - pkgInstall := &kapppkgiv1alpha1.PackageInstall{} - if err := remoteClient.Get(ctx, client.ObjectKey{Name: util.GeneratePackageInstallName(clusterName, "load-balancer-and-ingress-service"), Namespace: "tkg-system"}, pkgInstall); err != nil { - return false - } - return true - }() - - Eventually(akoPackageInstallExist, waitTimeout, pollingInterval).Should(BeTrue()) - - By("delete cluster with foreground propagation policy") - deletePropagation := metav1.DeletePropagationForeground - deleteOptions := client.DeleteOptions{PropagationPolicy: &deletePropagation} - Expect(k8sClient.Delete(ctx, cluster, &deleteOptions)).To(Succeed()) - - By("instacllpackages for additional packages should have been removed.") - Eventually(func() bool { - return hasPackageInstalls(ctx, k8sClient, cluster, constants.TKGSystemNS, - clusterBootstrap.Spec.AdditionalPackages, clusterBootstrap.Annotations, setupLog) - }, waitTimeout, pollingInterval).Should(BeFalse()) - - By("Should have left ako packageInstall") - Eventually(akoPackageInstallExist, waitTimeout, pollingInterval).Should(BeTrue()) - - By("finalizer should be removed from clusterboostrap") - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - return controllerutil.ContainsFinalizer(clusterBootstrap, addontypes.AddonFinalizer) - }, waitTimeout, pollingInterval).Should(BeFalse()) - }) - }) - }) - - When("cluster with custom clusterboostrap and add-missing-fields-from-tkr annotation", func() { - BeforeEach(func() { - clusterName = "test-cluster-9" - clusterNamespace = "cluster-namespace-9" - clusterResourceFilePath = "testdata/test-cluster-bootstrap-9.yaml" - }) - - Context("cluster with custom ClusterBootstrap with add-missing-fields-from-tkr annotation is being used", func() { - It("should work with custom ClusterBoostrap", func() { - - By("filling custom ClusterBootstrap correctly", func() { - Eventually(func(g Gomega) { - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, clusterBootstrap) - g.Expect(err).ShouldNot(HaveOccurred()) - g.Expect(clusterBootstrap.Spec.CNI.RefName).To(BeEquivalentTo("calico.tanzu.vmware.com.1.3.5--vmware.1-tkg.1")) - g.Expect(clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.APIGroup).NotTo(BeNil()) - g.Expect(*clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.APIGroup).To(Equal("cni.tanzu.vmware.com")) - g.Expect(clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Kind).To(Equal("CalicoConfig")) - g.Expect(clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Name).To(Equal("calico-custom-config")) - - // Validate Kapp - g.Expect(clusterBootstrap.Spec.Kapp.RefName).To(Equal("kapp-controller.tanzu.vmware.com.0.32.9")) - g.Expect(clusterBootstrap.Spec.Kapp.ValuesFrom).NotTo(BeNil()) - g.Expect(clusterBootstrap.Spec.Kapp.ValuesFrom.ProviderRef.APIGroup).NotTo(BeNil()) - g.Expect(*clusterBootstrap.Spec.Kapp.ValuesFrom.ProviderRef.APIGroup).To(Equal("run.tanzu.vmware.com")) - g.Expect(clusterBootstrap.Spec.Kapp.ValuesFrom.ProviderRef.Kind).To(Equal("KappControllerConfig")) - g.Expect(clusterBootstrap.Spec.Kapp.ValuesFrom.ProviderRef.Name).To(Equal(fmt.Sprintf("%s-kapp-controller-package", clusterName))) - - // Validate additional packages - g.Expect(len(clusterBootstrap.Spec.AdditionalPackages)).To(Equal(3)) - - g.Expect(clusterBootstrap.Spec.AdditionalPackages[0].RefName).To(BeEquivalentTo("pinniped.tanzu.vmware.com.0.13.1--vmware.1-tkg.1")) - g.Expect(clusterBootstrap.Spec.AdditionalPackages[0].ValuesFrom).NotTo(BeNil()) - g.Expect(clusterBootstrap.Spec.AdditionalPackages[0].ValuesFrom.SecretRef).To(BeEquivalentTo(fmt.Sprintf("%s-pinniped-package", clusterName))) - - g.Expect(clusterBootstrap.Spec.AdditionalPackages[1].RefName).To(BeEquivalentTo("foobar.tanzu.vmware.com.0.2.2--vmware.1-tkg.1")) - g.Expect(clusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom).NotTo(BeNil()) - g.Expect(clusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.ProviderRef.APIGroup).NotTo(BeNil()) - g.Expect(*clusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.ProviderRef.APIGroup).To(BeEquivalentTo("run.tanzu.vmware.com")) - g.Expect(clusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.ProviderRef.Kind).To(BeEquivalentTo("FooBar")) - g.Expect(clusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.ProviderRef.Name).To(BeEquivalentTo("foobar-custom-config")) - - g.Expect(clusterBootstrap.Spec.AdditionalPackages[2].RefName).To(BeEquivalentTo("barfoo.tanzu.vmware.com.1.0.0--vmware.1-tkg.1")) - g.Expect(clusterBootstrap.Spec.AdditionalPackages[2].ValuesFrom).NotTo(BeNil()) - g.Expect(clusterBootstrap.Spec.AdditionalPackages[2].ValuesFrom.Inline).NotTo(BeNil()) - }, waitTimeout, pollingInterval).Should(Succeed()) - }) - - By("setting cluster phase to provisioned", func() { - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - Expect(k8sClient.Status().Update(ctx, cluster)).To(Succeed()) - }) - - By("upgrading Cluster to newer TKR", func() { - cluster := &clusterapiv1beta1.Cluster{} - newTKRVersion := "v1.25.3-custom" - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Labels[constants.TKRLabelClassyClusters] = newTKRVersion - - // Mock cluster pause mutating webhook - cluster.Spec.Paused = true - if cluster.Annotations == nil { - cluster.Annotations = map[string]string{} - } - cluster.Annotations[constants.ClusterPauseLabel] = newTKRVersion - Expect(k8sClient.Update(ctx, cluster)).To(Succeed()) - - Eventually(func(g Gomega) { - upgradedClusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), upgradedClusterBootstrap) - - g.Expect(err).To(BeNil()) - g.Expect(upgradedClusterBootstrap.Status.ResolvedTKR).To(BeEquivalentTo(newTKRVersion)) - - // Validate CNI - cni := upgradedClusterBootstrap.Spec.CNI - // Note: The value of CNI has been bumped to the one in TKR after cluster upgrade - g.Expect(cni.RefName).To(Equal("calico.tanzu.vmware.com.1.3.6--vmware.1-tkg.1")) - g.Expect(cni.ValuesFrom).NotTo(BeNil()) - g.Expect(cni.ValuesFrom.ProviderRef.APIGroup).NotTo(BeNil()) - g.Expect(*cni.ValuesFrom.ProviderRef.APIGroup).To(Equal("cni.tanzu.vmware.com")) - g.Expect(cni.ValuesFrom.ProviderRef.Kind).To(Equal("CalicoConfig")) - g.Expect(cni.ValuesFrom.ProviderRef.Name).To(Equal("calico-custom-config")) - - // Validate Kapp - kapp := upgradedClusterBootstrap.Spec.Kapp - g.Expect(kapp.RefName).To(Equal("kapp-controller.tanzu.vmware.com.0.32.10")) - g.Expect(kapp.ValuesFrom).NotTo(BeNil()) - g.Expect(kapp.ValuesFrom.ProviderRef.APIGroup).NotTo(BeNil()) - g.Expect(*kapp.ValuesFrom.ProviderRef.APIGroup).To(Equal("run.tanzu.vmware.com")) - g.Expect(kapp.ValuesFrom.ProviderRef.Kind).To(Equal("KappControllerConfig")) - g.Expect(kapp.ValuesFrom.ProviderRef.Name).To(Equal(fmt.Sprintf("%s-kapp-controller-package", clusterName))) - - // Validate additional packages - g.Expect(len(upgradedClusterBootstrap.Spec.AdditionalPackages)).To(Equal(3)) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[0].RefName).To(BeEquivalentTo("pinniped.tanzu.vmware.com.0.13.2--vmware.1-tkg.1")) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[0].ValuesFrom).NotTo(BeNil()) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[0].ValuesFrom.SecretRef).To(BeEquivalentTo(fmt.Sprintf("%s-pinniped-package", clusterName))) - - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[1].RefName).To(BeEquivalentTo("foobar.tanzu.vmware.com.0.2.3--vmware.1-tkg.1")) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom).NotTo(BeNil()) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.ProviderRef.APIGroup).NotTo(BeNil()) - g.Expect(*upgradedClusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.ProviderRef.APIGroup).To(BeEquivalentTo("run.tanzu.vmware.com")) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.ProviderRef.Kind).To(BeEquivalentTo("FooBar")) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.ProviderRef.Name).To(BeEquivalentTo("foobar-custom-config")) - - // This package is not there in Clusterboostrap so expect the RefName not to be changed and no errors in controller - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[2].RefName).To(BeEquivalentTo("barfoo.tanzu.vmware.com.1.0.0--vmware.1-tkg.1")) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[2].ValuesFrom).NotTo(BeNil()) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[2].ValuesFrom.Inline).NotTo(BeNil()) - - g.Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - g.Expect(cluster.Spec.Paused).ToNot(BeTrue()) - if cluster.Annotations != nil { - _, ok := cluster.Annotations[constants.ClusterPauseLabel] - g.Expect(ok).ToNot(BeTrue()) - } - }, waitTimeout, pollingInterval).Should(Succeed()) - }) - - // barfoo package is not automatically upgraded since its not there in TKr spec.bootstrapPackages. This test case tests if user - // can upgrade barfoo package by updating package refname. - By("upgrading barfoo package in ClusterBootstrap", func() { - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - - clusterBootstrapToUpdate := clusterBootstrap.DeepCopy() - clusterBootstrapToUpdate.Spec.AdditionalPackages[2].RefName = "barfoo.tanzu.vmware.com.1.0.1--vmware.1-tkg.1" - Expect(k8sClient.Patch(ctx, clusterBootstrapToUpdate, client.MergeFrom(clusterBootstrap))).To(Succeed()) - - Eventually(func(g Gomega) { - updatedClusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), updatedClusterBootstrap) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(updatedClusterBootstrap.Spec.AdditionalPackages[2].RefName).To(BeEquivalentTo("barfoo.tanzu.vmware.com.1.0.1--vmware.1-tkg.1")) - - pkgInstallName := util.GeneratePackageInstallName(cluster.Name, clusterBootstrap.Spec.AdditionalPackages[2].RefName) - pkgInstall := &kapppkgiv1alpha1.PackageInstall{} - err = k8sClient.Get(ctx, client.ObjectKey{Name: pkgInstallName, Namespace: constants.TKGSystemNS}, pkgInstall) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(pkgInstall.Spec.PackageRef.VersionSelection.Constraints).To(BeEquivalentTo("1.0.1+vmware.1-tkg.1")) - }, waitTimeout, pollingInterval).Should(Succeed()) - }) - }) - }) - }) - - When("cluster upgrade with values change", func() { - BeforeEach(func() { - clusterName = "test-cluster-10" - clusterNamespace = "cluster-namespace-10" - clusterResourceFilePath = "testdata/test-cluster-bootstrap-10.yaml" - }) - - Context("cluster with no inline values are set", func() { - It("should work when no inline values are set", func() { - - By("filling ClusterBootstrap correctly", func() { - Eventually(func(g Gomega) { - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, clusterBootstrap) - g.Expect(err).ShouldNot(HaveOccurred()) - g.Expect(clusterBootstrap.Spec.CNI.RefName).To(BeEquivalentTo("antrea.tanzu.vmware.com.1.11.7--vmware.1-tkg.2")) - g.Expect(clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.APIGroup).NotTo(BeNil()) - g.Expect(*clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.APIGroup).To(Equal("cni.tanzu.vmware.com")) - g.Expect(clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Kind).To(Equal("AntreaConfig")) - g.Expect(clusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Name).To(Equal(fmt.Sprintf("%s-antrea-package", clusterName))) - - // Validate Kapp - g.Expect(clusterBootstrap.Spec.Kapp.RefName).To(Equal("kapp-controller.tanzu.vmware.com.0.32.11")) - g.Expect(clusterBootstrap.Spec.Kapp.ValuesFrom).NotTo(BeNil()) - g.Expect(clusterBootstrap.Spec.Kapp.ValuesFrom.ProviderRef.APIGroup).NotTo(BeNil()) - g.Expect(*clusterBootstrap.Spec.Kapp.ValuesFrom.ProviderRef.APIGroup).To(Equal("run.tanzu.vmware.com")) - g.Expect(clusterBootstrap.Spec.Kapp.ValuesFrom.ProviderRef.Kind).To(Equal("KappControllerConfig")) - g.Expect(clusterBootstrap.Spec.Kapp.ValuesFrom.ProviderRef.Name).To(Equal(fmt.Sprintf("%s-kapp-controller-package", clusterName))) - - // Validate additional packages - g.Expect(len(clusterBootstrap.Spec.AdditionalPackages)).To(Equal(2)) - - g.Expect(clusterBootstrap.Spec.AdditionalPackages[0].RefName).To(BeEquivalentTo("pinniped.tanzu.vmware.com.0.13.3--vmware.1-tkg.1")) - g.Expect(clusterBootstrap.Spec.AdditionalPackages[0].ValuesFrom).NotTo(BeNil()) - g.Expect(clusterBootstrap.Spec.AdditionalPackages[0].ValuesFrom.SecretRef).To(BeEquivalentTo(fmt.Sprintf("%s-pinniped-package", clusterName))) - - g.Expect(clusterBootstrap.Spec.AdditionalPackages[1].RefName).To(BeEquivalentTo("foobar.tanzu.vmware.com.0.2.4--vmware.1-tkg.1")) - //g.Expect(clusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom).To(BeNil()) - }, waitTimeout, pollingInterval).Should(Succeed()) - }) - - By("setting cluster phase to provisioned", func() { - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - Expect(k8sClient.Status().Update(ctx, cluster)).To(Succeed()) - }) - - By("upgrading Cluster to newer TKR", func() { - cluster := &clusterapiv1beta1.Cluster{} - newTKRVersion := "v1.25.6-custom" - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - cluster.Labels[constants.TKRLabelClassyClusters] = newTKRVersion - - // Mock cluster pause mutating webhook - cluster.Spec.Paused = true - if cluster.Annotations == nil { - cluster.Annotations = map[string]string{} - } - cluster.Annotations[constants.ClusterPauseLabel] = newTKRVersion - Expect(k8sClient.Update(ctx, cluster)).To(Succeed()) - - Eventually(func(g Gomega) { - upgradedClusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), upgradedClusterBootstrap) - - g.Expect(err).To(BeNil()) - g.Expect(upgradedClusterBootstrap.Status.ResolvedTKR).To(BeEquivalentTo(newTKRVersion)) - - // Validate CNI - cni := upgradedClusterBootstrap.Spec.CNI - // Note: The value of CNI has been bumped to the one in TKR after cluster upgrade - g.Expect(cni.RefName).To(Equal("antrea.tanzu.vmware.com.1.11.8--vmware.1-tkg.2")) - g.Expect(cni.ValuesFrom).NotTo(BeNil()) - g.Expect(cni.ValuesFrom.ProviderRef.APIGroup).NotTo(BeNil()) - g.Expect(*cni.ValuesFrom.ProviderRef.APIGroup).To(Equal("cni.tanzu.vmware.com")) - g.Expect(cni.ValuesFrom.ProviderRef.Kind).To(Equal("AntreaConfig")) - g.Expect(cni.ValuesFrom.ProviderRef.Name).To(Equal(fmt.Sprintf("%s-antrea-package", clusterName))) - - // Validate Kapp - kapp := upgradedClusterBootstrap.Spec.Kapp - g.Expect(kapp.RefName).To(Equal("kapp-controller.tanzu.vmware.com.0.32.12")) - g.Expect(kapp.ValuesFrom).NotTo(BeNil()) - g.Expect(kapp.ValuesFrom.ProviderRef.APIGroup).NotTo(BeNil()) - g.Expect(*kapp.ValuesFrom.ProviderRef.APIGroup).To(Equal("run.tanzu.vmware.com")) - g.Expect(kapp.ValuesFrom.ProviderRef.Kind).To(Equal("KappControllerConfig")) - g.Expect(kapp.ValuesFrom.ProviderRef.Name).To(Equal(fmt.Sprintf("%s-kapp-controller-package", clusterName))) - - // Validate additional packages - g.Expect(len(upgradedClusterBootstrap.Spec.AdditionalPackages)).To(Equal(2)) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[0].RefName).To(BeEquivalentTo("pinniped.tanzu.vmware.com.0.13.4--vmware.1-tkg.1")) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[0].ValuesFrom).NotTo(BeNil()) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[0].ValuesFrom.SecretRef).To(BeEquivalentTo(fmt.Sprintf("%s-pinniped-package", clusterName))) - - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[1].RefName).To(BeEquivalentTo("foobar.tanzu.vmware.com.0.2.5--vmware.1-tkg.1")) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom).NotTo(BeNil()) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.Inline).NotTo(BeNil()) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.Inline["key1"]).To(Equal("value1")) - g.Expect(upgradedClusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.Inline["key2"].(map[string]interface{})["key3"]).To(Equal("value3")) - - g.Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - g.Expect(cluster.Spec.Paused).ToNot(BeTrue()) - if cluster.Annotations != nil { - _, ok := cluster.Annotations[constants.ClusterPauseLabel] - g.Expect(ok).ToNot(BeTrue()) - } - }, waitTimeout, pollingInterval).Should(Succeed()) - }) - }) - }) - }) -}) - -func assertSecretContains(ctx context.Context, k8sClient client.Client, namespace, name string, secretContent map[string][]byte) { - s := &corev1.Secret{} - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: name}, s) - Expect(err).ToNot(HaveOccurred()) - for k, v := range secretContent { - Expect(string(s.Data[k]) == string(v)).ToNot(BeTrue()) - } -} - -func assertEventuallyExistInNamespace(ctx context.Context, k8sClient client.Client, namespace, name string, obj client.Object) { - Eventually(func() error { - key := client.ObjectKey{Name: name, Namespace: namespace} - return k8sClient.Get(ctx, key, obj) - }, waitTimeout, pollingInterval).Should(Succeed()) -} - -func assertOwnerReferencesExist(ctx context.Context, k8sClient client.Client, namespace, name string, obj client.Object, ownerReferencesToCheck []metav1.OwnerReference) { - Eventually(func() bool { - key := client.ObjectKey{Name: name, Namespace: namespace} - Expect(k8sClient.Get(ctx, key, obj)).NotTo(HaveOccurred()) - - for _, ownerReferenceToCheck := range ownerReferencesToCheck { - found := false - for _, ownerReferenceFromObj := range obj.GetOwnerReferences() { - // skip the comparison of UID on purpose, caller does not know the UIDs of ownerReferencesToCheck beforehand - if ownerReferenceToCheck.APIVersion == ownerReferenceFromObj.APIVersion && - ownerReferenceToCheck.Kind == ownerReferenceFromObj.Kind && - ownerReferenceToCheck.Name == ownerReferenceFromObj.Name { - found = true - } - } - if !found { - return false - } - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) -} diff --git a/addons/controllers/clusterbootstrap_handlers.go b/addons/controllers/clusterbootstrap_handlers.go deleted file mode 100644 index aa20df5c8e..0000000000 --- a/addons/controllers/clusterbootstrap_handlers.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "errors" - "fmt" - "reflect" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// TKRToClusters returns a list of Requests with Cluster ObjectKey for -func (r *ClusterBootstrapReconciler) TKRToClusters(o client.Object) []ctrl.Request { - tkr, ok := o.(*runtanzuv1alpha3.TanzuKubernetesRelease) - if !ok { - r.Log.Error(errors.New("invalid type"), - "Expected to receive TKR resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - log := r.Log.WithValues(constants.TKRNameLogKey, tkr.Name) - - log.V(4).Info("Mapping TKR to cluster") - - clustersList := &clusterv1beta1.ClusterList{} - - if err := r.Client.List(r.context, clustersList, client.MatchingLabels{constants.TKRLabel: tkr.Name}); err != nil { - log.Error(err, "Error getting clusters using TKR") - return nil - } - - var clusters []*clusterv1beta1.Cluster - for i := range clustersList.Items { - clusters = append(clusters, &clustersList.Items[i]) - } - - return util.ClustersToRequests(clusters, log) -} - -func (r *ClusterBootstrapReconciler) ClusterBootstrapToClusters(o client.Object) []ctrl.Request { - bootstrap, ok := o.(*runtanzuv1alpha3.ClusterBootstrap) - if !ok { - r.Log.Error(errors.New("invalid type"), - "Expected to receive ClusterBootstrap resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - log := r.Log.WithValues(constants.ClusterBootstrapNameLogKey, bootstrap.Name) - - log.V(4).Info("Mapping ClusterBootstrap to cluster") - - cluster := &clusterv1beta1.Cluster{} - - clusterName := bootstrap.Name - for _, ownerRef := range o.GetOwnerReferences() { - if ownerRef.APIVersion == clusterv1beta1.GroupVersion.String() { - clusterName = ownerRef.Name - break - } - } - - if err := r.Client.Get(r.context, client.ObjectKey{Namespace: bootstrap.Namespace, Name: clusterName}, cluster); err != nil { - log.Error(err, "Error getting cluster using ClusterBootstrap") - return nil - } - return []ctrl.Request{{NamespacedName: client.ObjectKeyFromObject(cluster)}} -} - -// SecretsToClusters is the Map Function for watching Secrets that filters the events on -// objects of type secret and returns requests for reconcile if required -func (r *ClusterBootstrapReconciler) SecretsToClusters(o client.Object) []ctrl.Request { - secret, ok := o.(*corev1.Secret) - if !ok { - r.Log.Error(errors.New("invalid type"), - "Expected to receive Secret resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - log := r.Log.WithValues(constants.SecretNameLogKey, secret.Name) - log.V(4).Info("Mapping secrets to cluster") - - // Here we filter based on two criteria - // 1. Secrets having the type ClusterBootstrapManagedSecret, OR - // 2. Secrets with ClusterNameLabel set - // For secrets that are cloned by ClusterBootstrap, we set the type and the first filter is used. We also - // set the ClusterNameLabel on these cloned secrets - // For other secrets such as those that we get from provider status (extensible provider model), the second - // filter is used because it is not possible to patch the Type of these secrets because the Type may be immutable - if secret.Type == constants.ClusterBootstrapManagedSecret { - for _, ownerRef := range o.GetOwnerReferences() { - if ownerRef.Kind == reflect.TypeOf(clusterv1beta1.Cluster{}).Name() { - return []ctrl.Request{{NamespacedName: types.NamespacedName{Namespace: o.GetNamespace(), Name: ownerRef.Name}}} - } - } - } - if secret.GetLabels() != nil { - clusterName := secret.GetLabels()[addontypes.ClusterNameLabel] - if clusterName != "" { - return []ctrl.Request{{NamespacedName: client.ObjectKey{Namespace: secret.Namespace, Name: clusterName}}} - } - } - - return nil -} - -func (r *ClusterBootstrapReconciler) ProviderToClusters(o client.Object) []ctrl.Request { - if o == nil { - return nil - } - for _, ownerRef := range o.GetOwnerReferences() { - if ownerRef.APIVersion == clusterv1beta1.GroupVersion.String() { - return []ctrl.Request{{NamespacedName: types.NamespacedName{Namespace: o.GetNamespace(), Name: ownerRef.Name}}} - } - } - return nil -} diff --git a/addons/controllers/cpi/cpiconfig_util.go b/addons/controllers/cpi/cpiconfig_util.go deleted file mode 100644 index 3ff74e2cd4..0000000000 --- a/addons/controllers/cpi/cpiconfig_util.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "github.com/go-logr/logr" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" -) - -type CPIConfigAction func(client.Object) - -// performActionForCPIConfigIfOwnedByCluster performs the specified action for the cluster owns the CPIConfig -// For a CPIConfig to be owned by a Cluster, it should -// 1. in the same namespace as the cluster -// 2. not a template CPIConfig, a.k.a. has annotation tkg.tanzu.vmware.com/template-config -// 3. has the Cluster as its OwnerReference -func performActionForCPIConfigIfOwnedByCluster(cpiConfig client.Object, cluster *clusterapiv1beta1.Cluster, - controllerConfig config.ConfigControllerConfig, action CPIConfigAction) { - - namespace := cpiConfig.GetNamespace() - annotations := cpiConfig.GetAnnotations() - ownerReferences := cpiConfig.GetOwnerReferences() - - if namespace == cluster.Namespace { - // avoid enqueuing reconcile requests for template CPIConfig CRs in event handler of Cluster CR - if _, ok := annotations[constants.TKGAnnotationTemplateConfig]; ok && cpiConfig.GetNamespace() == controllerConfig.SystemNamespace { - return - } - } - - // corresponding CPIConfig should have following ownerRef - ownerReference := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: constants.ClusterKind, - Name: cluster.Name, - UID: cluster.UID, - } - - if clusterapiutil.HasOwnerRef(ownerReferences, ownerReference) { - action(cpiConfig) - } -} - -// performEnqueueForCPIConfigIfOwnedByCluster enqueues the request for the cluster that owns this CPIConfig -func performEnqueueForCPIConfigIfOwnedByCluster(cpiConfig client.Object, cluster *clusterapiv1beta1.Cluster, - controllerConfig config.ConfigControllerConfig, logger logr.Logger, requests []ctrl.Request) []ctrl.Request { - - performActionForCPIConfigIfOwnedByCluster(cpiConfig, cluster, controllerConfig, func(cpiConfig client.Object) { - logger.V(4).Info("Adding "+cpiConfig.GetObjectKind().GroupVersionKind().Kind+" for reconciliation", - constants.NamespaceLogKey, cpiConfig.GetNamespace(), constants.NameLogKey, cpiConfig.GetName()) - - requests = append(requests, ctrl.Request{ - NamespacedName: clusterapiutil.ObjectKey(cpiConfig), - }) - }) - - return requests -} diff --git a/addons/controllers/cpi/oraclecpiconfig_controller.go b/addons/controllers/cpi/oraclecpiconfig_controller.go deleted file mode 100644 index 55362614d8..0000000000 --- a/addons/controllers/cpi/oraclecpiconfig_controller.go +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package controllers implements k8s controller functionality for oracle-cpi. -package controllers - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/source" - - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - cpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" -) - -// OracleCPIConfigReconciler reconciles a OracleCPIConfig object -type OracleCPIConfigReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Config addonconfig.OracleCPIConfigControllerConfig -} - -//+kubebuilder:rbac:groups=cpi.tanzu.vmware.com,resources=oraclecpiconfigs,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=cpi.tanzu.vmware.com,resources=oraclecpiconfigs/status,verbs=get;update;patch -//+kubebuilder:rbac:groups=vmware.infrastructure.cluster.x-k8s.io,resources=providerserviceaccounts,verbs=get;create;list;watch;update;patch - -// Reconcile the OracleCPIConfig CRD -func (r *OracleCPIConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - - logger := r.Log.WithValues("OracleCPIConfig", req.NamespacedName) - - // fetch OracleCPIConfig resource - cpiConfig := &cpiv1alpha1.OracleCPIConfig{} - if err := r.Client.Get(ctx, req.NamespacedName, cpiConfig); err != nil { - if apierrors.IsNotFound(err) { - logger.Info("OracleCPIConfig resource not found") - return ctrl.Result{}, nil - } - logger.Error(err, "Unable to fetch OracleCPIConfig resource") - return ctrl.Result{}, err - } - - // deep copy OracleCPIConfig to avoid issues if in the future other controllers where interacting with the same copy - cpiConfig = cpiConfig.DeepCopy() - - cluster, err := cutil.GetOwnerCluster(ctx, r.Client, cpiConfig, req.Namespace, constants.OracleCPIDefaultRefName) - if err != nil { - if apierrors.IsNotFound(err) && cluster != nil { - logger.Info(fmt.Sprintf("'%s/%s' is listed as owner reference but could not be found", - cluster.Namespace, cluster.Name)) - return ctrl.Result{}, nil - } - logger.Error(err, "could not determine owner cluster") - return ctrl.Result{}, err - } - - authSecret, err := r.getOracleAuthSecret(ctx, r.Client) - if err != nil { - logger.Error(err, "Failed to get authentication secret", "name", authenticationSecretName, "namespace", authenticationSecretNamespace) - return ctrl.Result{}, err - } - - if res, err := r.reconcileOracleCPIConfig(ctx, cpiConfig, cluster, authSecret); err != nil { - logger.Error(err, "Failed to reconcile OracleCPIConfig") - return res, err - } - - return ctrl.Result{}, nil -} - -const ( - authenticationSecretName = "capoci-auth-config" - authenticationSecretNamespace = "cluster-api-provider-oci-system" -) - -// getOracleAuthSecret returns the secret that contains authentication credentials from CAPOCI -func (r *OracleCPIConfigReconciler) getOracleAuthSecret(ctx context.Context, client client.Client) (*v1.Secret, error) { - var authSecret v1.Secret - if err := client.Get(ctx, types.NamespacedName{ - Name: authenticationSecretName, - Namespace: authenticationSecretNamespace}, &authSecret); err != nil { - return nil, err - } - return &authSecret, nil -} - -// reconcileOracleCPIConfig reconciles OracleCPIConfig with its owner cluster -// the owner cluster and the authentication secret are required to reconcile the OracleCPIConfig -func (r *OracleCPIConfigReconciler) reconcileOracleCPIConfig(ctx context.Context, cpiConfig *cpiv1alpha1.OracleCPIConfig, - cluster *clusterapiv1beta1.Cluster, auth *v1.Secret) (_ ctrl.Result, retErr error) { - // patch the CPIConfig CR in the end - patchHelper, err := clusterapipatchutil.NewHelper(cpiConfig, r.Client) - if err != nil { - return ctrl.Result{}, err - } - // patch OracleCPIConfig before returning the function - defer func() { - r.Log.Info("Patching OracleCPIConfig") - if err := patchHelper.Patch(ctx, cpiConfig); err != nil { - r.Log.Error(err, "Error patching OracleCPIConfig") - retErr = err - } - r.Log.Info("Successfully patched OracleCPIConfig") - }() - - if !cpiConfig.GetDeletionTimestamp().IsZero() { - return ctrl.Result{}, nil - } - - fingerprint, ok := auth.Data["fingerprint"] - if !ok { - r.Log.Info("Cannot extract fingerprint", "name", authenticationSecretName, "namespace", authenticationSecretNamespace) - } - key, ok := auth.Data["key"] - if !ok { - r.Log.Info("Cannot extract key", "name", authenticationSecretName, "namespace", authenticationSecretNamespace) - } - region, ok := auth.Data["region"] - if !ok { - r.Log.Info("Cannot extract region", "name", authenticationSecretName, "namespace", authenticationSecretNamespace) - } - tenancy, ok := auth.Data["tenancy"] - if !ok { - r.Log.Info("Cannot extract tenancy", "name", authenticationSecretName, "namespace", authenticationSecretNamespace) - } - user, ok := auth.Data["user"] - if !ok { - r.Log.Info("Cannot extract user", "name", authenticationSecretName, "namespace", authenticationSecretNamespace) - } - // the passphrase is optional, use zero value if not provided - passphrase := auth.Data["passphrase"] - compartment, err := util.ParseClusterVariableString(cluster, "compartmentId") - if err != nil { - r.Log.Error(err, "Cannot extract compartment from cluster", "cluster", cluster.Name) - } - vcn, err := util.ParseClusterVariableString(cluster, "externalVCNId") - if err != nil { - r.Log.Error(err, "Cannot extract vcn from cluster", "cluster", cluster.Name) - } - - subnet, err := util.ParseClusterVariableString(cluster, "privateServiceSubnetId") - if err != nil { - r.Log.Error(err, "Cannot extract private subnet from cluster", "cluster", cluster.Name) - } - - // convert the CPIConfig CR to data values - d := &OracleCPIDataValues{ - Auth: OracleCPIDataValuesAuth{ - Region: string(region), - Tenancy: string(tenancy), - User: string(user), - Key: string(key), - Fingerprint: string(fingerprint), - Passphrase: string(passphrase), - }, - Compartment: compartment, - VCN: vcn, - LoadBalancer: struct { - Subnet1 string `yaml:"subnet1"` - Subnet2 string `yaml:"subnet2"` - }{ - Subnet1: subnet, - Subnet2: subnet, - }, - } - - // generate data value secrets for the Oracle CPI package - secret := &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateDataValueSecretName(cluster.Name, constants.OracleCPIAddonName), - Namespace: cpiConfig.Namespace, - }, - Type: v1.SecretTypeOpaque, - } - - // add owner reference to OracleCPIConfig if not already added by TanzuClusterBootstrap Controller - r.Log.Info("Ensure OracleCPIConfig has the cluster as owner reference") - ownerReference := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - secret.SetOwnerReferences([]metav1.OwnerReference{ownerReference}) - - // create or patch the data value secret - result, err := controllerutil.CreateOrUpdate(ctx, r.Client, secret, func() error { - secret.StringData = make(map[string]string) - yamlBytes, err := d.Serialize() - if err != nil { - r.Log.Error(err, "Error marshaling OracleCPIConfig to Yaml") - return err - } - secret.StringData[constants.TKGDataValueFileName] = string(yamlBytes) - r.Log.Info("Mutated OracleCPIConfig data values", "newValue", string(yamlBytes)) - return nil - }) - if err != nil { - r.Log.Error(err, "Error creating or patching OracleCPIConfig data values secret") - return ctrl.Result{}, err - } - r.Log.Info(fmt.Sprintf("Resource '%s' data values secret '%s'", constants.CPIAddonName, result)) - - // update the secret reference in CPIConfig CR status - cpiConfig.Status.SecretRef = secret.Name - - return ctrl.Result{}, nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *OracleCPIConfigReconciler) SetupWithManager(_ context.Context, mgr ctrl.Manager, options controller.Options) error { - return ctrl.NewControllerManagedBy(mgr). - For(&cpiv1alpha1.OracleCPIConfig{}). - WithOptions(options). - WithEventFilter(predicates.ConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, constants.OracleCPIConfigKind, r.Config.SystemNamespace, r.Log)). - Watches( - &source.Kind{Type: &clusterapiv1beta1.Cluster{}}, - handler.EnqueueRequestsFromMapFunc(r.ClusterToOracleCPIConfig), - ). - Complete(r) -} diff --git a/addons/controllers/cpi/oraclecpiconfig_datavalues.go b/addons/controllers/cpi/oraclecpiconfig_datavalues.go deleted file mode 100644 index 66bfb47474..0000000000 --- a/addons/controllers/cpi/oraclecpiconfig_datavalues.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "gopkg.in/yaml.v3" -) - -// OracleCPIDataValues serializes the CPIConfig CR -type OracleCPIDataValues struct { - Auth OracleCPIDataValuesAuth `yaml:"auth"` - - Compartment string `yaml:"compartment"` - - VCN string `yaml:"vcn"` - - LoadBalancer struct { - Subnet1 string `yaml:"subnet1"` - Subnet2 string `yaml:"subnet2"` - } `yaml:"loadBalancer"` -} - -type OracleCPIDataValuesAuth struct { - Region string `yaml:"region"` - Tenancy string `yaml:"tenancy"` - User string `yaml:"user"` - Key string `yaml:"key"` - Fingerprint string `yaml:"fingerprint"` - Passphrase string `yaml:"passphrase"` -} - -func (v *OracleCPIDataValues) Serialize() ([]byte, error) { - return yaml.Marshal(v) -} diff --git a/addons/controllers/cpi/oraclecpiconfig_util.go b/addons/controllers/cpi/oraclecpiconfig_util.go deleted file mode 100644 index 3c741807ba..0000000000 --- a/addons/controllers/cpi/oraclecpiconfig_util.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - - "github.com/pkg/errors" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - cpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" -) - -// ClusterToOracleCPIConfig returns a list of Requests with OracleCPIConfig ObjectKey based on Cluster events -func (r *OracleCPIConfigReconciler) ClusterToOracleCPIConfig(o client.Object) []ctrl.Request { - cluster, ok := o.(*clusterapiv1beta1.Cluster) - if !ok { - r.Log.Error(errors.New("invalid type"), - "Expected to receive Cluster resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - r.Log.V(4).Info("Mapping Cluster to OracleCPIConfig") - - cs := &cpiv1alpha1.OracleCPIConfigList{} - _ = r.List(context.Background(), cs) - var requests []ctrl.Request - - for _, cpiConfig := range cs.Items { - requests = performEnqueueForCPIConfigIfOwnedByCluster(&cpiConfig, cluster, r.Config.ConfigControllerConfig, r.Log, requests) - } - - return requests -} diff --git a/addons/controllers/cpi/vspherecpiconfig_const.go b/addons/controllers/cpi/vspherecpiconfig_const.go deleted file mode 100644 index ad7ab496d6..0000000000 --- a/addons/controllers/cpi/vspherecpiconfig_const.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -// supported modes for VSphereCPIConfig -const ( - VsphereCPINonParavirtualMode = "vsphereCPI" - VSphereCPIParavirtualMode = "vsphereParavirtualCPI" -) - -// cluster variable names required by VSphereCPIConfig to derive values -const ( - NsxtPodRoutingEnabledVarName = "NSXT_POD_ROUTING_ENABLED" - NsxtRouterPathVarName = "NSXT_ROUTER_PATH" - ClusterCIDRVarName = "CLUSTER_CIDR" - NsxtUsernameVarName = "NSXT_USERNAME" - NsxtPasswordVarName = "NSXT_PASSWORD" - NsxtManagerHostVarName = "NSXT_MANAGER_HOST" - NsxtAllowUnverifiedSSLVarName = "NSXT_ALLOW_UNVERIFIED_SSL" - NsxtRemoteAuthVarName = "NSXT_REMOTE_AUTH" - NsxtVmcAccessTokenVarName = "NSXT_VMC_ACCESS_TOKEN" // nolint:gosec - NsxtVmcAuthHostVarName = "NSXT_VMC_AUTH_HOST" - NsxtClientCertKeyDataVarName = "NSXT_CLIENT_CERT_KEY_DATA" - NsxtClientCertDataVarName = "NSXT_CLIENT_CERT_DATA" - NsxtRootCADataB64VarName = "NSXT_ROOT_CA_DATA_B64" - NsxtSecretNameVarName = "NSXT_SECRET_NAME" // nolint:gosec - NsxtSecretNamespaceVarName = "NSXT_SECRET_NAMESPACE" // nolint:gosec -) - -// secret in the target cluster that contains the generated service account -// token. -const ( - ProviderServiceAccountSecretName = "cloud-provider-creds" - ProviderServiceAccountSecretNamespace = "vmware-system-cloud-provider" // nolint:gosec -) - -// TODO: make these constants accessible to other controllers (for example csi) https://github.com/vmware-tanzu/tanzu-framework/issues/2086 -// constants used for deriving supervisor API server endpoint -const ( - SupervisorLoadBalancerSvcNamespace = "kube-system" - SupervisorLoadBalancerSvcName = "kube-apiserver-lb-svc" - SupervisorLoadBalancerSvcAPIServerPortName = "kube-apiserver" - - // ConfigMapClusterInfo defines the name for the ConfigMap where the information how to connect and trust the cluster exist - ConfigMapClusterInfo = "cluster-info" - - // KubeConfigKey defines at which key in the Data object of the ConfigMap the KubeConfig object is stored - KubeConfigKey = "kubeconfig" -) diff --git a/addons/controllers/cpi/vspherecpiconfig_controller.go b/addons/controllers/cpi/vspherecpiconfig_controller.go deleted file mode 100644 index 0b5af32a2a..0000000000 --- a/addons/controllers/cpi/vspherecpiconfig_controller.go +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package controllers implements k8s controller functionality for vsphere-cpi. -package controllers - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - v1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - capvvmwarev1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/vmware/v1beta1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/source" - - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - cpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" -) - -// VSphereCPIConfigReconciler reconciles a VSphereCPIConfig object -type VSphereCPIConfigReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Config addonconfig.VSphereCPIConfigControllerConfig -} - -var providerServiceAccountRBACRules = []rbacv1.PolicyRule{ - { - Verbs: []string{"get", "create", "update", "patch", "delete"}, - APIGroups: []string{"vmoperator.vmware.com"}, - Resources: []string{"virtualmachineservices", "virtualmachineservices/status"}, - }, - { - Verbs: []string{"get", "list"}, - APIGroups: []string{"vmoperator.vmware.com"}, - Resources: []string{"virtualmachines", "virtualmachines/status"}, - }, - { - Verbs: []string{"get", "create", "update", "list", "patch", "delete", "watch"}, - APIGroups: []string{"nsx.vmware.com"}, - Resources: []string{"ippools", "ippools/status"}, - }, - { - Verbs: []string{"get", "create", "update", "list", "patch", "delete"}, - APIGroups: []string{"nsx.vmware.com"}, - Resources: []string{"routesets", "routesets/status"}, - }, -} - -// VsphereCPIProviderServiceAccountAggregatedClusterRole is the cluster role to assign permissions to capv provider -var vsphereCPIProviderServiceAccountAggregatedClusterRole = &rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.VsphereCPIProviderServiceAccountAggregatedClusterRole, - Labels: map[string]string{ - constants.CAPVClusterRoleAggregationRuleLabelSelectorKey: constants.CAPVClusterRoleAggregationRuleLabelSelectorValue, - }, - }, -} - -//+kubebuilder:rbac:groups=cpi.tanzu.vmware.com,resources=vspherecpiconfigs,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=cpi.tanzu.vmware.com,resources=vspherecpiconfigs/status,verbs=get;update;patch -//+kubebuilder:rbac:groups=vmware.infrastructure.cluster.x-k8s.io,resources=providerserviceaccounts,verbs=get;create;list;watch;update;patch - -// Reconcile the VSphereCPIConfig CRD -func (r *VSphereCPIConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - logger := r.Log.WithValues("VSphereCPIConfig", req.NamespacedName) - - logger.Info("Start reconciliation for VSphereCPIConfig") - - // fetch VSphereCPIConfig resource - cpiConfig := &cpiv1alpha1.VSphereCPIConfig{} - if err := r.Client.Get(ctx, req.NamespacedName, cpiConfig); err != nil { - if apierrors.IsNotFound(err) { - logger.Info("VSphereCPIConfig resource not found") - return ctrl.Result{}, nil - } - logger.Error(err, "Unable to fetch VSphereCPIConfig resource") - return ctrl.Result{}, err - } - - // deep copy VSphereCPIConfig to avoid issues if in the future other controllers where interacting with the same copy - cpiConfig = cpiConfig.DeepCopy() - - cluster, err := cutil.GetOwnerCluster(ctx, r.Client, cpiConfig, req.Namespace, constants.CPIDefaultRefName) - if err != nil { - if apierrors.IsNotFound(err) && cluster != nil { - logger.Info(fmt.Sprintf("'%s/%s' is listed as owner reference but could not be found", - cluster.Namespace, cluster.Name)) - return ctrl.Result{}, nil - } - logger.Error(err, "could not determine owner cluster") - return ctrl.Result{}, err - } - - if cpiConfig.Spec.VSphereCPI.Mode == nil { - logger.Info("VSphere CPI mode is not provided.") - return ctrl.Result{}, nil // no need to requeue if CPI mode is not provided - } - if res, err := r.reconcileVSphereCPIConfig(ctx, cpiConfig, cluster); err != nil { - logger.Error(err, "Failed to reconcile VSphereCPIConfig") - return res, err - } - return ctrl.Result{}, nil -} - -// reconcileVSphereCPIConfig reconciles VSphereCPIConfig with its owner cluster -func (r *VSphereCPIConfigReconciler) reconcileVSphereCPIConfig(ctx context.Context, cpiConfig *cpiv1alpha1.VSphereCPIConfig, cluster *clusterapiv1beta1.Cluster) (_ ctrl.Result, retErr error) { - patchHelper, err := clusterapipatchutil.NewHelper(cpiConfig, r.Client) - if err != nil { - return ctrl.Result{}, err - } - // patch VSphereCPIConfig before returning the function - defer func() { - r.Log.Info("Patching VSphereCPIConfig") - if err := patchHelper.Patch(ctx, cpiConfig); err != nil { - r.Log.Error(err, "Error patching VSphereCPIConfig") - retErr = err - } - r.Log.Info("Successfully patched VSphereCPIConfig") - }() - - if !cpiConfig.GetDeletionTimestamp().IsZero() { - return ctrl.Result{}, nil - } - if err = r.reconcileVSphereCPIConfigNormal(ctx, cpiConfig, cluster); err != nil { - r.Log.Error(err, "Error reconciling VSphereCPIConfig to create/patch data values secret") - return ctrl.Result{}, err - } - r.Log.Info("Successfully reconciled VSphereCPIConfig") - return ctrl.Result{}, nil -} - -// reconcileVSphereCPIConfigNormal triggers when a VSphereCPIConfig is not being deleted -// it ensures the owner reference of the VSphereCPIConfig and generates the data values secret for CPI -func (r *VSphereCPIConfigReconciler) reconcileVSphereCPIConfigNormal(ctx context.Context, - cpiConfig *cpiv1alpha1.VSphereCPIConfig, cluster *clusterapiv1beta1.Cluster) (retErr error) { - // add owner reference to VSphereCPIConfig if not already added by TanzuClusterBootstrap Controller - ownerReference := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - r.Log.Info("Ensure VSphereCPIConfig has the cluster as owner reference") - if !clusterapiutil.HasOwnerRef(cpiConfig.OwnerReferences, ownerReference) { - r.Log.Info("Adding owner reference to VSphereCPIConfig") - cpiConfig.OwnerReferences = clusterapiutil.EnsureOwnerRef(cpiConfig.OwnerReferences, ownerReference) - } - secret := &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateDataValueSecretName(cluster.Name, constants.CPIAddonName), - Namespace: cpiConfig.Namespace, - }, - Type: v1.SecretTypeOpaque, - } - secret.SetOwnerReferences([]metav1.OwnerReference{ownerReference}) - - mutateFn := func() error { - secret.StringData = make(map[string]string) - cpiConfigSpec, err := r.mapCPIConfigToDataValues(ctx, cpiConfig, cluster) - if err != nil { - r.Log.Error(err, "Error while mapping VSphereCPIConfig to data values") - return err - } - yamlBytes, err := cpiConfigSpec.Serialize() - if err != nil { - r.Log.Error(err, "Error marshaling VSphereCPIConfig to Yaml") - return err - } - secret.StringData[constants.TKGDataValueFileName] = string(yamlBytes) - r.Log.Info("Mutated VSphereCPIConfig data values") - return nil - } - result, err := controllerutil.CreateOrPatch(ctx, r.Client, secret, mutateFn) - if err != nil { - r.Log.Error(err, "Error creating or patching VSphereCPIConfig data values secret") - return err - } - - // deploy the provider service account for paravirtual mode - if *cpiConfig.Spec.VSphereCPI.Mode == VSphereCPIParavirtualMode { - // create an aggregated cluster role RBAC that will be inherited by CAPV (https://kubernetes.io/docs/reference/access-authn-authz/rbac/#aggregated-clusterroles) - // CAPV needs to hold these rules before it can grant it to serviceAccount for CPI - - _, err := controllerutil.CreateOrPatch(ctx, r.Client, vsphereCPIProviderServiceAccountAggregatedClusterRole, func() error { - vsphereCPIProviderServiceAccountAggregatedClusterRole.Rules = providerServiceAccountRBACRules - return nil - }) - if err != nil { - r.Log.Error(err, "Error creating or patching cluster role", "name", vsphereCPIProviderServiceAccountAggregatedClusterRole) - return err - } - - vsphereCluster, err := cutil.VSphereClusterParavirtualForCAPICluster(ctx, r.Client, cluster) - if err != nil { - return err - } - serviceAccount := &capvvmwarev1beta1.ProviderServiceAccount{ - ObjectMeta: metav1.ObjectMeta{ - Name: getCCMName(vsphereCluster), - Namespace: vsphereCluster.Namespace, - }, - } - _, err = controllerutil.CreateOrUpdate(ctx, r.Client, serviceAccount, func() error { - serviceAccount.Spec = r.mapCPIConfigToProviderServiceAccountSpec(vsphereCluster) - return controllerutil.SetControllerReference(vsphereCluster, serviceAccount, r.Scheme) - }) - if err != nil { - r.Log.Error(err, "Error creating or updating ProviderServiceAccount for VSphere CPI") - } - } - - r.Log.Info(fmt.Sprintf("Resource '%s' data values secret '%s'", constants.CPIAddonName, result)) - // update the secret reference in VSphereCPIConfig status - cpiConfig.Status.SecretRef = secret.Name - return nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *VSphereCPIConfigReconciler) SetupWithManager(_ context.Context, mgr ctrl.Manager, options controller.Options) error { - return ctrl.NewControllerManagedBy(mgr). - For(&cpiv1alpha1.VSphereCPIConfig{}). - WithOptions(options). - WithEventFilter(predicates.ConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, constants.VSphereCPIConfigKind, r.Config.SystemNamespace, r.Log)). - Watches( - &source.Kind{Type: &clusterapiv1beta1.Cluster{}}, - handler.EnqueueRequestsFromMapFunc(r.ClusterToVSphereCPIConfig), - ). - Complete(r) -} diff --git a/addons/controllers/cpi/vspherecpiconfig_datavalues.go b/addons/controllers/cpi/vspherecpiconfig_datavalues.go deleted file mode 100644 index 0002ce1bb2..0000000000 --- a/addons/controllers/cpi/vspherecpiconfig_datavalues.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "gopkg.in/yaml.v3" -) - -// VSphereCPIDataValues serializes the CPIConfig CR -type VSphereCPIDataValues interface { - // Serialize the struct into a data format expected by the consumer. This could be yaml or json - Serialize() ([]byte, error) -} -type VSphereCPINonParaVirtDataValues struct { - Mode string `yaml:"mode"` - TLSThumbprint string `yaml:"tlsThumbprint"` - Server string `yaml:"server"` - Datacenter string `yaml:"datacenter"` - Username string `yaml:"username"` - Password string `yaml:"password"` - Region string `yaml:"region"` - Zone string `yaml:"zone"` - InsecureFlag bool `yaml:"insecureFlag"` - IPFamily string `yaml:"ipFamily"` - VMInternalNetwork string `yaml:"vmInternalNetwork"` - VMExternalNetwork string `yaml:"vmExternalNetwork"` - VMExcludeInternalNetworkSubnetCidr string `yaml:"vmExcludeInternalNetworkSubnetCidr"` - VMExcludeExternalNetworkSubnetCidr string `yaml:"vmExcludeExternalNetworkSubnetCidr"` - CloudProviderExtraArgs CloudProviderExtraArgs `yaml:"cloudProviderExtraArgs"` - Nsxt struct { - PodRoutingEnabled bool `yaml:"podRoutingEnabled"` - Routes struct { - RouterPath string `yaml:"routerPath"` - ClusterCidr string `yaml:"clusterCidr"` - } `yaml:"routes"` - Username string `yaml:"username"` - Password string `yaml:"password"` - Host string `yaml:"host"` - Insecure bool `yaml:"insecure"` - RemoteAuthEnabled bool `yaml:"remoteAuthEnabled"` - VmcAccessToken string `yaml:"vmcAccessToken"` - VmcAuthHost string `yaml:"vmcAuthHost"` - ClientCertKeyData string `yaml:"clientCertKeyData"` - ClientCertData string `yaml:"clientCertData"` - RootCAData string `yaml:"rootCAData"` - SecretName string `yaml:"secretName"` - SecretNamespace string `yaml:"secretNamespace"` - } `yaml:"nsxt"` - HTTPProxy string `yaml:"http_proxy"` - HTTPSProxy string `yaml:"https_proxy"` - NoProxy string `yaml:"no_proxy"` -} - -func (v *VSphereCPINonParaVirtDataValues) Serialize() ([]byte, error) { - dataValues := struct { - DataValues VSphereCPINonParaVirtDataValues `yaml:"vsphereCPI"` - }{DataValues: *v} - return yaml.Marshal(dataValues) -} - -type CloudProviderExtraArgs struct { - TLSCipherSuites string `yaml:"tls-cipher-suites"` -} - -type VSphereCPIParaVirtDataValues struct { - Mode string `yaml:"mode"` - ClusterAPIVersion string `yaml:"clusterAPIVersion"` - ClusterKind string `yaml:"clusterKind"` - ClusterName string `yaml:"clusterName"` - ClusterUID string `yaml:"clusterUID"` - SupervisorMasterEndpointIP string `yaml:"supervisorMasterEndpointIP"` - SupervisorMasterPort string `yaml:"supervisorMasterPort"` - AntreaNSXPodRoutingEnabled bool `yaml:"antreaNSXPodRoutingEnabled"` -} - -func (v *VSphereCPIParaVirtDataValues) Serialize() ([]byte, error) { - dataValues := struct { - VSphereCPI VSphereCPIParaVirtDataValues `yaml:"vsphereCPI"` - }{VSphereCPI: *v} - return yaml.Marshal(dataValues) -} diff --git a/addons/controllers/cpi/vspherecpiconfig_utils.go b/addons/controllers/cpi/vspherecpiconfig_utils.go deleted file mode 100644 index 0a292bcc9c..0000000000 --- a/addons/controllers/cpi/vspherecpiconfig_utils.go +++ /dev/null @@ -1,429 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - "net/url" - "strconv" - - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/pkg/errors" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - capvvmwarev1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/vmware/v1beta1" - capvidentity "sigs.k8s.io/cluster-api-provider-vsphere/pkg/identity" - capvmanager "sigs.k8s.io/cluster-api-provider-vsphere/pkg/manager" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - pkgtypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - cpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" -) - -// ClusterToVSphereCPIConfig returns a list of Requests with VSphereCPIConfig ObjectKey based on Cluster events -func (r *VSphereCPIConfigReconciler) ClusterToVSphereCPIConfig(o client.Object) []ctrl.Request { - cluster, ok := o.(*clusterapiv1beta1.Cluster) - if !ok { - r.Log.Error(errors.New("invalid type"), - "Expected to receive Cluster resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - r.Log.V(4).Info("Mapping Cluster to VSphereCPIConfig") - - cs := &cpiv1alpha1.VSphereCPIConfigList{} - _ = r.List(context.Background(), cs) - var requests []ctrl.Request - - for _, cpiConfig := range cs.Items { - requests = performEnqueueForCPIConfigIfOwnedByCluster(&cpiConfig, cluster, r.Config.ConfigControllerConfig, r.Log, requests) - } - - return requests -} - -// mapCPIConfigToDataValuesNonParavirtual generates CPI data values for non-paravirtual modes -func (r *VSphereCPIConfigReconciler) mapCPIConfigToDataValuesNonParavirtual( // nolint - ctx context.Context, - cpiConfig *cpiv1alpha1.VSphereCPIConfig, cluster *clusterapiv1beta1.Cluster) (VSphereCPIDataValues, error, -) { // nolint:whitespace - d := &VSphereCPINonParaVirtDataValues{} - c := cpiConfig.Spec.VSphereCPI.NonParavirtualConfig - d.Mode = VsphereCPINonParavirtualMode - - // get the vsphere cluster object - vsphereCluster, err := cutil.VSphereClusterNonParavirtualForCluster(ctx, r.Client, cluster) - if err != nil { - return nil, err - } - - // derive the thumbprint, server from the vsphere cluster object - d.TLSThumbprint = vsphereCluster.Spec.Thumbprint - d.Server = vsphereCluster.Spec.Server - - // derive vSphere username and password using CAPV util function - clusterCredentials, err := capvidentity.GetCredentials(ctx, r.Client, vsphereCluster, capvmanager.DefaultPodNamespace) - if err != nil { - return nil, errors.Wrapf(err, "could not fetch credentials for VSphereCluster %s/%s", vsphereCluster.Namespace, vsphereCluster.Name) - } - d.Username = clusterCredentials.Username - d.Password = clusterCredentials.Password - - // get the control plane machine template - cpMachineTemplate, err := cutil.ControlPlaneVsphereMachineTemplateNonParavirtualForCluster(ctx, r.Client, cluster) - if err != nil { - return nil, err - } - - // derive data center information from control plane machine template, if not provided - d.Datacenter = cpMachineTemplate.Spec.Template.Spec.Datacenter - - // derive ClusterCidr from cluster.spec.clusterNetwork - if cluster.Spec.ClusterNetwork != nil && cluster.Spec.ClusterNetwork.Pods != nil && len(cluster.Spec.ClusterNetwork.Pods.CIDRBlocks) > 0 { - d.Nsxt.Routes.ClusterCidr = cluster.Spec.ClusterNetwork.Pods.CIDRBlocks[0] - } - - // derive IP family or proxy related settings from cluster annotations - if cluster.Annotations != nil { - d.IPFamily = cluster.Annotations[pkgtypes.IPFamilyConfigAnnotation] - d.HTTPProxy = cluster.Annotations[pkgtypes.HTTPProxyConfigAnnotation] - d.HTTPSProxy = cluster.Annotations[pkgtypes.HTTPSProxyConfigAnnotation] - d.NoProxy = cluster.Annotations[pkgtypes.NoProxyConfigAnnotation] - } - - // allow API user to override the derived values if he/she specified fields in the VSphereCPIConfig - d.TLSThumbprint = tryParseString(d.TLSThumbprint, c.TLSThumbprint) - d.Server = tryParseString(d.Server, c.VCenterAPIEndpoint) - d.Datacenter = tryParseString(d.Datacenter, c.Datacenter) - - if c.VSphereCredentialLocalObjRef != nil { - vsphereSecret, err := r.getSecret(ctx, cpiConfig.Namespace, c.VSphereCredentialLocalObjRef.Name) - if err != nil { - return nil, err - } - if err := r.ensureSecretOnwerRef(ctx, vsphereSecret, cluster); err != nil { - return nil, err - } - d.Username, d.Password, err = getUsernameAndPasswordFromSecret(vsphereSecret) - if err != nil { - return nil, err - } - } - - d.Region = tryParseString(d.Region, c.Region) - d.Zone = tryParseString(d.Zone, c.Zone) - - d.InsecureFlag = d.TLSThumbprint == "" - if c.Insecure != nil { - d.InsecureFlag = *c.Insecure - } - if !d.InsecureFlag && d.TLSThumbprint == "" { - return nil, errors.New("empty thumbprint is provided while TLS peer verification is enabled") - } - if d.InsecureFlag && d.TLSThumbprint != "" { - r.Log.Info("ignore provided thumbprint because TLS peer verification is disabled", "thumbprint", d.TLSThumbprint) - } - - if c.VMNetwork != nil { - d.VMInternalNetwork = tryParseString(d.VMInternalNetwork, c.VMNetwork.Internal) - d.VMExternalNetwork = tryParseString(d.VMExternalNetwork, c.VMNetwork.External) - d.VMExcludeInternalNetworkSubnetCidr = tryParseString(d.VMExcludeInternalNetworkSubnetCidr, c.VMNetwork.ExcludeInternalSubnetCidr) - d.VMExcludeExternalNetworkSubnetCidr = tryParseString(d.VMExcludeExternalNetworkSubnetCidr, c.VMNetwork.ExcludeExternalSubnetCidr) - } - d.CloudProviderExtraArgs.TLSCipherSuites = tryParseString(d.CloudProviderExtraArgs.TLSCipherSuites, c.TLSCipherSuites) - - if c.NSXT != nil { - if c.NSXT.PodRoutingEnabled != nil { - d.Nsxt.PodRoutingEnabled = *c.NSXT.PodRoutingEnabled - } - - if c.NSXT.Insecure != nil { - d.Nsxt.Insecure = *c.NSXT.Insecure - } - if c.NSXT.Route != nil { - d.Nsxt.Routes.RouterPath = tryParseString(d.Nsxt.Routes.RouterPath, c.NSXT.Route.RouterPath) - } - if c.NSXT.CredentialLocalObjRef != nil { - d.Nsxt.SecretName = c.NSXT.CredentialLocalObjRef.Name - d.Nsxt.SecretNamespace = cpiConfig.Namespace - nsxtSecret, err := r.getSecret(ctx, cpiConfig.Namespace, c.NSXT.CredentialLocalObjRef.Name) - if err != nil { - return nil, err - } - if err := r.ensureSecretOnwerRef(ctx, nsxtSecret, cluster); err != nil { - return nil, err - } - d.Nsxt.Username, d.Nsxt.Password, err = getUsernameAndPasswordFromSecret(nsxtSecret) - if err != nil { - return nil, err - } - } - d.Nsxt.Host = tryParseString(d.Nsxt.Host, c.NSXT.APIHost) - if c.NSXT.RemoteAuth != nil { - d.Nsxt.RemoteAuthEnabled = *c.NSXT.RemoteAuth - } - d.Nsxt.VmcAccessToken = tryParseString(d.Nsxt.VmcAccessToken, c.NSXT.VMCAccessToken) - d.Nsxt.VmcAuthHost = tryParseString(d.Nsxt.VmcAccessToken, c.NSXT.VMCAuthHost) - d.Nsxt.ClientCertKeyData = tryParseString(d.Nsxt.ClientCertKeyData, c.NSXT.ClientCertKeyData) - d.Nsxt.ClientCertData = tryParseString(d.Nsxt.ClientCertData, c.NSXT.ClientCertData) - d.Nsxt.RootCAData = tryParseString(d.Nsxt.RootCAData, c.NSXT.RootCAData) - } - - d.IPFamily = tryParseString(d.IPFamily, c.IPFamily) - if c.Proxy != nil { - d.HTTPProxy = tryParseString(d.HTTPProxy, c.Proxy.HTTPProxy) - d.HTTPSProxy = tryParseString(d.HTTPSProxy, c.Proxy.HTTPSProxy) - d.NoProxy = tryParseString(d.NoProxy, c.Proxy.NoProxy) - } - return d, nil -} - -// mapCPIConfigToDataValuesParavirtual generates CPI data values for paravirtual modes -func (r *VSphereCPIConfigReconciler) mapCPIConfigToDataValuesParavirtual(ctx context.Context, cpiConfig *cpiv1alpha1.VSphereCPIConfig, cluster *clusterapiv1beta1.Cluster) (VSphereCPIDataValues, error) { - c := cpiConfig.Spec.VSphereCPI.ParavirtualConfig - - d := &VSphereCPIParaVirtDataValues{} - d.Mode = VSphereCPIParavirtualMode - - // derive owner cluster information - d.ClusterAPIVersion = cluster.GroupVersionKind().GroupVersion().String() - d.ClusterKind = cluster.GroupVersionKind().Kind - d.ClusterName = cluster.ObjectMeta.Name - d.ClusterUID = string(cluster.ObjectMeta.UID) - - if c != nil && c.AntreaNSXPodRoutingEnabled != nil { - d.AntreaNSXPodRoutingEnabled = *c.AntreaNSXPodRoutingEnabled - } - - address, port, err := r.getSupervisorAPIServerAddress(ctx) - if err != nil { - return nil, err - } - - d.SupervisorMasterEndpointIP = address - d.SupervisorMasterPort = fmt.Sprint(port) - - return d, nil -} - -// getAPIServerPortFromLBService searches a port named as "kube-apiserver" in -// the service "kube-system/kube-apiserver-lb-svc" -func getAPIServerPortFromLBService(svc *v1.Service) (int32, error) { - if svc == nil { - return 0, errors.New("lb service is nil") - } - portNum := int32(0) - portFound := false - for _, port := range svc.Spec.Ports { - if port.Name == SupervisorLoadBalancerSvcAPIServerPortName { - portNum = port.Port - portFound = true - } - } - if !portFound { - return 0, errors.New("lb service doesn't have a port named as " + SupervisorLoadBalancerSvcAPIServerPortName) - } - return portNum, nil -} - -// getSupervisorAPIServerVIP attempts to extract the ingress IP for supervisor API endpoint if the service -// "kube-system/kube-apiserver-lb-svc" is available -func (r *VSphereCPIConfigReconciler) getSupervisorAPIServerVIP(ctx context.Context) (string, int32, error) { - svc := &v1.Service{} - svcKey := types.NamespacedName{Name: SupervisorLoadBalancerSvcName, Namespace: SupervisorLoadBalancerSvcNamespace} - if err := r.Client.Get(ctx, svcKey, svc); err != nil { - return "", 0, errors.Wrapf(err, "unable to get supervisor loadbalancer svc %s", svcKey) - } - if len(svc.Status.LoadBalancer.Ingress) > 0 { - ingress := svc.Status.LoadBalancer.Ingress[0] - port, err := getAPIServerPortFromLBService(svc) - if err != nil { - return "", 0, errors.Wrapf(err, "ingress %s(%s) doesn't have open port", ingress.Hostname, ingress.IP) - } - if ipAddr := ingress.IP; ipAddr != "" { - return ipAddr, port, nil - } - return ingress.Hostname, port, nil - } - return "", 0, errors.Errorf("no VIP found in the supervisor loadbalancer svc %s", svcKey) -} - -// getSupervisorAPIServerFIP get a valid Supervisor Cluster Management Network Floating IP (FIP) from the cluster-info configmap -func (r *VSphereCPIConfigReconciler) getSupervisorAPIServerFIP(ctx context.Context) (string, int32, error) { - urlString, err := r.getSupervisorAPIServerURLWithFIP(ctx) - if err != nil { - return "", 0, errors.Wrap(err, "unable to get supervisor url") - } - urlVal, err := url.Parse(urlString) - if err != nil { - return "", 0, errors.Wrapf(err, "unable to parse supervisor url from %s", urlString) - } - host := urlVal.Hostname() - port, err := strconv.ParseInt(urlVal.Port(), 10, 32) - if err != nil { - return "", 0, errors.Wrapf(err, "unable to parse supervisor port from %s", urlString) - } - if host == "" { - return "", 0, errors.Errorf("unable to get supervisor host from url %s", urlVal) - } - return host, int32(port), nil -} - -// getSupervisorAPIServerURLWithFIP get a Supervisor Cluster Management Network Floating IP (FIP) -func (r *VSphereCPIConfigReconciler) getSupervisorAPIServerURLWithFIP(ctx context.Context) (string, error) { - cm := &v1.ConfigMap{} - cmKey := types.NamespacedName{Name: ConfigMapClusterInfo, Namespace: metav1.NamespacePublic} - if err := r.Client.Get(ctx, cmKey, cm); err != nil { - return "", err - } - kubeconfig, err := tryParseClusterInfoFromConfigMap(cm) - if err != nil { - return "", err - } - clusterConfig := getClusterFromKubeConfig(kubeconfig) - if clusterConfig != nil { - return clusterConfig.Server, nil - } - return "", errors.Errorf("unable to get cluster from kubeconfig in ConfigMap %s/%s", cm.Namespace, cm.Name) -} - -// getSupervisorAPIServerAddress discovers the supervisor api server address -// 1. Check if a k8s service "kube-system/kube-apiserver-lb-svc" is available, if so, fetch the loadbalancer IP. -// 2. If not, get the Supervisor Cluster Management Network Floating IP (FIP) from the cluster-info configmap. This is -// to support non-NSX-T development use cases only. If we are unable to find the cluster-info configmap for some reason, -// we log the error. -func (r *VSphereCPIConfigReconciler) getSupervisorAPIServerAddress(ctx context.Context) (string, int32, error) { - supervisorHost, supervisorPort, err := r.getSupervisorAPIServerVIP(ctx) - if err != nil { - r.Log.Info("Unable to discover supervisor apiserver virtual ip, fallback to floating ip", "reason", err.Error()) - supervisorHost, supervisorPort, err = r.getSupervisorAPIServerFIP(ctx) - if err != nil { - r.Log.Error(err, "Unable to discover supervisor apiserver address") - return "", 0, errors.Wrapf(err, "Unable to discover supervisor apiserver address") - } - } - return supervisorHost, supervisorPort, nil -} - -// tryParseClusterInfoFromConfigMap tries to parse a kubeconfig file from a ConfigMap key -func tryParseClusterInfoFromConfigMap(cm *v1.ConfigMap) (*clientcmdapi.Config, error) { - kubeConfigString, ok := cm.Data[KubeConfigKey] - if !ok || kubeConfigString == "" { - return nil, errors.Errorf("no %s key in ConfigMap %s/%s", KubeConfigKey, cm.Namespace, cm.Name) - } - parsedKubeConfig, err := clientcmd.Load([]byte(kubeConfigString)) - if err != nil { - return nil, errors.Wrapf(err, "couldn't parse the kubeconfig file in the ConfigMap %s/%s", cm.Namespace, cm.Name) - } - return parsedKubeConfig, nil -} - -// GetClusterFromKubeConfig returns the default Cluster of the specified KubeConfig -func getClusterFromKubeConfig(config *clientcmdapi.Config) *clientcmdapi.Cluster { - // If there is an unnamed cluster object, use it - if config.Clusters[""] != nil { - return config.Clusters[""] - } - if config.Contexts[config.CurrentContext] != nil { - return config.Clusters[config.Contexts[config.CurrentContext].Cluster] - } - return nil -} - -// mapCPIConfigToDataValues maps VSphereCPIConfig CR to data values -func (r *VSphereCPIConfigReconciler) mapCPIConfigToDataValues(ctx context.Context, cpiConfig *cpiv1alpha1.VSphereCPIConfig, cluster *clusterapiv1beta1.Cluster) (VSphereCPIDataValues, error) { - mode := *cpiConfig.Spec.VSphereCPI.Mode - switch mode { - case VsphereCPINonParavirtualMode: - return r.mapCPIConfigToDataValuesNonParavirtual(ctx, cpiConfig, cluster) - case VSphereCPIParavirtualMode: - return r.mapCPIConfigToDataValuesParavirtual(ctx, cpiConfig, cluster) - default: - break - } - return nil, errors.Errorf("Invalid CPI mode %s, must either be %s or %s", mode, VSphereCPIParavirtualMode, VsphereCPINonParavirtualMode) -} - -// mapCPIConfigToProviderServiceAccountSpec maps CPIConfig and cluster to the corresponding service account spec -func (r *VSphereCPIConfigReconciler) mapCPIConfigToProviderServiceAccountSpec(vsphereCluster *capvvmwarev1beta1.VSphereCluster) capvvmwarev1beta1.ProviderServiceAccountSpec { - return capvvmwarev1beta1.ProviderServiceAccountSpec{ - Ref: &v1.ObjectReference{Name: vsphereCluster.Name, Namespace: vsphereCluster.Namespace}, - Rules: providerServiceAccountRBACRules, - TargetNamespace: ProviderServiceAccountSecretNamespace, - TargetSecretName: ProviderServiceAccountSecretName, - } -} - -// getSecret gets the secret object given its name and namespace -func (r *VSphereCPIConfigReconciler) getSecret(ctx context.Context, namespace, name string) (*v1.Secret, error) { - secret := &v1.Secret{} - if err := r.Client.Get(ctx, types.NamespacedName{Namespace: namespace, Name: name}, secret); err != nil { - if apierrors.IsNotFound(err) { - return nil, errors.Errorf("Secret %s/%s not found", namespace, name) - } - return nil, errors.Errorf("Secret %s/%s could not be fetched, error %v", namespace, name, err) - } - return secret, nil -} - -// getUsernameAndPasswordFromSecret extracts the username and password from a secret object -func getUsernameAndPasswordFromSecret(s *v1.Secret) (string, string, error) { - username, exists := s.Data["username"] - if !exists { - return "", "", errors.Errorf("Secret %s/%s doesn't have string data with username", s.Namespace, s.Name) - } - password, exists := s.Data["password"] - if !exists { - return "", "", errors.Errorf("Secret %s/%s doesn't have string data with password", s.Namespace, s.Name) - } - return string(username), string(password), nil -} - -// getCCMName returns the name of cloud control manager for a cluster -func getCCMName(cluster *capvvmwarev1beta1.VSphereCluster) string { - return fmt.Sprintf("%s-%s", cluster.Name, "ccm") -} - -// tryParseString tries to convert a string pointer and return its value, if not nil -func tryParseString(src string, sub *string) string { - if sub != nil { - return *sub - } - return src -} - -func (r *VSphereCPIConfigReconciler) ensureSecretOnwerRef(ctx context.Context, secret *v1.Secret, cluster *clusterapiv1beta1.Cluster) error { - ownerReference := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - if !clusterapiutil.HasOwnerRef(secret.OwnerReferences, ownerReference) { - r.Log.Info(fmt.Sprintf("Adding owner reference to secret %s/%s", secret.Namespace, secret.Name)) - patchHelper, err := clusterapipatchutil.NewHelper(secret, r.Client) - if err != nil { - r.Log.Info("Failed to create patchHelper") - return err - } - secret.OwnerReferences = clusterapiutil.EnsureOwnerRef(secret.OwnerReferences, ownerReference) - // Create a patch helper for addon secret - if err := patchHelper.Patch(ctx, secret.DeepCopy()); err != nil { - r.Log.Info(fmt.Sprintf("Failed to patch owner reference to secret %s/%s", secret.Namespace, secret.Name)) - return err - } - } - return nil -} diff --git a/addons/controllers/csi/vspherecsiconfig_constants.go b/addons/controllers/csi/vspherecsiconfig_constants.go deleted file mode 100644 index e82d35eca1..0000000000 --- a/addons/controllers/csi/vspherecsiconfig_constants.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package controllers ... -package controllers - -import ( - "time" -) - -// supported modes for VSphereCSIConfig -const ( - VSphereCSINonParavirtualMode = "vsphereCSI" - VSphereCSIParavirtualMode = "vsphereParavirtualCSI" -) - -// cluster variable names required by VSphereCSIConfig to derive values -const ( - VSphereNetworkVarName = "VSPHERE_NETWORK" - VSphereRegionVarName = "VSPHERE_REGION" - VSphereZoneVarName = "VSPHERE_ZONE" - VSphereVersionVarName = "VSPHERE_VERSION" - VSphereTLSThumbprintVarName = "VSPHERE_TLS_THUMBPRINT" - IsWindowsWorkloadClusterVarName = "IS_WINDOWS_WORKLOAD_CLUSTER" - ControllerRequeueDelay = 20 * time.Second -) - -const ( - VSphereCSINamespace = "kube-system" - VSphereCSIProvisionTimeout = "300s" - VSphereCSIAttachTimeout = "300s" - VSphereCSIResizerTimeout = "300s" - VSphereCSIMinDeploymentReplicas = 1 - VSphereCSIMaxDeploymentReplicas = 3 - VSphereCSIFeatureStateNamespace = VSphereSystemCSINamepace - VSphereCSIFeatureStateConfigMapName = "csi-feature-states" - LegacyZoneName = "vmware-system-legacy" -) - -const ( - VSphereSystemCSINamepace = "vmware-system-csi" - DefaultSupervisorMasterEndpointHostname = "supervisor.default.svc" - DefaultSupervisorMasterPort = 6443 -) diff --git a/addons/controllers/csi/vspherecsiconfig_controller.go b/addons/controllers/csi/vspherecsiconfig_controller.go deleted file mode 100644 index 18a3a8de1e..0000000000 --- a/addons/controllers/csi/vspherecsiconfig_controller.go +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - v1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/predicate" - "sigs.k8s.io/controller-runtime/pkg/source" - - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" -) - -// VSphereCSIConfigReconciler reconciles a VSphereCSIConfig object -type VSphereCSIConfigReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Config addonconfig.VSphereCSIConfigControllerConfig -} - -var providerServiceAccountRBACRules = []rbacv1.PolicyRule{ - { - APIGroups: []string{"vmoperator.vmware.com"}, - Resources: []string{"virtualmachines"}, - Verbs: []string{"get", "list", "watch", "update", "patch"}, - }, - { - APIGroups: []string{"cns.vmware.com"}, - Resources: []string{"cnsvolumemetadatas", "cnsfileaccessconfigs"}, - Verbs: []string{"get", "list", "watch", "update", "create", "delete"}, - }, - { - APIGroups: []string{"cns.vmware.com"}, - Resources: []string{"cnscsisvfeaturestates"}, - Verbs: []string{"get", "list", "watch"}, - }, - { - APIGroups: []string{""}, - Resources: []string{"persistentvolumeclaims"}, - Verbs: []string{"get", "list", "watch", "update", "create", "delete"}, - }, - { - APIGroups: []string{""}, - Resources: []string{"persistentvolumeclaims/status"}, - Verbs: []string{"get", "update", "patch"}, - }, - { - APIGroups: []string{""}, - Resources: []string{"events"}, - Verbs: []string{"list"}, - }, - { - APIGroups: []string{""}, - Resources: []string{"volumesnapshots"}, - Verbs: []string{"create", "delete", "get", "list", "patch"}, - }, -} - -// VsphereCSIProviderServiceAccountAggregatedClusterRole is the cluster role to assign permissions to capv provider -var vsphereCSIProviderServiceAccountAggregatedClusterRole = &rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.VsphereCSIProviderServiceAccountAggregatedClusterRole, - Labels: map[string]string{ - constants.CAPVClusterRoleAggregationRuleLabelSelectorKey: constants.CAPVClusterRoleAggregationRuleLabelSelectorValue, - }, - }, -} - -// SetupWithManager sets up the controller with the Manager. -func (r *VSphereCSIConfigReconciler) SetupWithManager(_ context.Context, mgr ctrl.Manager, - options controller.Options) error { - - c, err := ctrl.NewControllerManagedBy(mgr). - For(&csiv1alpha1.VSphereCSIConfig{}). - WithOptions(options). - Watches( - &source.Kind{Type: &clusterapiv1beta1.Cluster{}}, - handler.EnqueueRequestsFromMapFunc(r.ClusterToVSphereCSIConfig), - ). - WithEventFilter(predicates.ConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, constants.VSphereCSIConfigKind, r.Config.SystemNamespace, r.Log)). - Build(r) - if err != nil { - return errors.Wrap(err, "failed to setup vspherecsiconfig controller") - } - - fsPredicates := predicate.Funcs{ - CreateFunc: func(e event.CreateEvent) bool { - return isFeatureStatesConfigMap(e.Object) - }, - UpdateFunc: func(e event.UpdateEvent) bool { - return isFeatureStatesConfigMap(e.ObjectNew) && - e.ObjectOld.GetResourceVersion() != e.ObjectNew.GetResourceVersion() - }, - // Delete is not expected to occur - } - - if err = c.Watch(&source.Kind{Type: &v1.ConfigMap{}}, - handler.EnqueueRequestsFromMapFunc(r.ConfigMapToVSphereCSIConfig), - fsPredicates); err != nil { - return errors.Wrapf(err, - "Failed to watch for ConfigMap '%s/%s' while setting vspherecsiconfig controller", - VSphereCSIFeatureStateNamespace, - VSphereCSIFeatureStateConfigMapName) - } - - // (deliberate decision): There is no watch on AvailabilityZone in vspherecsiconfig_controller so any change to it will not trigger reconcile - // of resources. Based on discussions with TKGS team, availability zone is created at supervisor cluster init time - // and does not really change after that. - return nil -} - -//+kubebuilder:rbac:groups=csi.tanzu.vmware.com,resources=vspherecsiconfigs,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=csi.tanzu.vmware.com,resources=vspherecsiconfigs/status,verbs=get;update;patch -//+kubebuilder:rbac:groups=csi.tanzu.vmware.com,resources=vspherecsiconfigs/finalizers,verbs=update -//+kubebuilder:rbac:groups="",resources=secrets,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups="",resources=configmaps,verbs=get;list;watch -//+kubebuilder:rbac:groups=cluster.x-k8s.io,resources=clusters,verbs=get;list;watch -//+kubebuilder:rbac:groups=topology.tanzu.vmware.com,resources=availabilityzones,verbs=get;list -//+kubebuilder:rbac:groups=controlplane.cluster.x-k8s.io,resources=kubeadmcontrolplanes,verbs=get -//+kubebuilder:rbac:groups=vmware.infrastructure.cluster.x-k8s.io,resources=providerserviceaccounts,verbs=get;create;list;watch;update;patch - -// Reconcile is part of the main kubernetes reconciliation loop which aims to -// move the current state of the cluster closer to the desired state. -func (r *VSphereCSIConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - l := r.Log.WithValues("VSphereCSIConfig", req.NamespacedName) - ctx = logr.NewContext(ctx, l) - logger := log.FromContext(ctx) - - vcsiConfig := &csiv1alpha1.VSphereCSIConfig{} - if err := r.Get(ctx, req.NamespacedName, vcsiConfig); err != nil { - if apierrors.IsNotFound(err) { - logger.Info("VSphereCSIConfig resource not found") - return ctrl.Result{}, nil - } - - logger.Error(err, "Unable to fetch VSphereCSIConfig resource") - return ctrl.Result{}, err - } - - // deep copy VSphereCSIConfig to avoid issues if in the future other controllers where interacting with the same copy - vcsiConfig = vcsiConfig.DeepCopy() - - cluster, err := cutil.GetOwnerCluster(ctx, r.Client, vcsiConfig, req.Namespace, constants.CSIDefaultRefName) - if err != nil { - if apierrors.IsNotFound(err) && cluster != nil { - logger.Info(fmt.Sprintf("'%s/%s' is listed as owner reference but could not be found", - cluster.Namespace, cluster.Name)) - return ctrl.Result{}, nil - } - logger.Error(err, "could not determine owner cluster") - return ctrl.Result{}, err - } - - return r.reconcileVSphereCSIConfig(ctx, vcsiConfig, cluster) -} - -func (r *VSphereCSIConfigReconciler) reconcileVSphereCSIConfig(ctx context.Context, - csiCfg *csiv1alpha1.VSphereCSIConfig, - cluster *clusterapiv1beta1.Cluster) (result ctrl.Result, retErr error) { - - logger := log.FromContext(ctx) - - patchHelper, err := clusterapipatchutil.NewHelper(csiCfg, r.Client) - if err != nil { - return ctrl.Result{}, err - } - - defer func() { - if retErr != nil { - // don't modify VSphereCSIConfig if there is an error - return - } - - if err := patchHelper.Patch(ctx, csiCfg); err != nil { - logger.Error(err, "Error patching VSphereCSIConfig") - retErr = err - } - }() - - if !csiCfg.GetDeletionTimestamp().IsZero() { - return ctrl.Result{}, nil // deleted - } - - if result, err = r.reconcileVSphereCSIConfigNormal(ctx, csiCfg, cluster); err != nil { - logger.Error(err, "Error reconciling VSphereCSIConfig") - return result, err - } - - return result, nil -} - -func (r *VSphereCSIConfigReconciler) reconcileVSphereCSIConfigNormal(ctx context.Context, - csiCfg *csiv1alpha1.VSphereCSIConfig, - cluster *clusterapiv1beta1.Cluster) (ctrl.Result, error) { - - logger := log.FromContext(ctx) - - ownerRef := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - - if !clusterapiutil.HasOwnerRef(csiCfg.OwnerReferences, ownerRef) { - // csiCfg object is patched in defer func in 'reconcileVSphereCSIConfig' - csiCfg.OwnerReferences = clusterapiutil.EnsureOwnerRef(csiCfg.OwnerReferences, ownerRef) - } - - addonName := "" - switch csiCfg.Spec.VSphereCSI.Mode { - case VSphereCSINonParavirtualMode: - addonName = constants.CSIAddonName - case VSphereCSIParavirtualMode: - addonName = constants.PVCSIAddonName - default: - err := errors.Errorf("Invalid CSI mode '%s', must either be '%s' or '%s'", - csiCfg.Spec.VSphereCSI.Mode, VSphereCSIParavirtualMode, VSphereCSINonParavirtualMode) - logger.Error(err, "") - return ctrl.Result{}, err - } - - secret := &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateDataValueSecretName(cluster.Name, addonName), - Namespace: csiCfg.Namespace}, - Type: v1.SecretTypeOpaque, - } - - secret.SetOwnerReferences([]metav1.OwnerReference{ownerRef}) - - mutateFn := func() error { - secret.StringData = make(map[string]string) - dvs, err := r.mapVSphereCSIConfigToDataValues(ctx, csiCfg, cluster) - if err != nil { - logger.Error(err, "Error while mapping VSphereCSIConfig to data values") - return err - } - yamlBytes, err := yaml.Marshal(dvs) - if err != nil { - logger.Error(err, "Error marshaling CSI config data values to yaml") - return err - } - secret.StringData[constants.TKGDataValueFileName] = string(yamlBytes) - return nil - } - - _, err := controllerutil.CreateOrPatch(ctx, r.Client, secret, mutateFn) - - if err != nil { - logger.Error(err, "Error creating or patching VSphereCSIConfig data values secret") - return ctrl.Result{}, err - } - - // deploy the provider service account for paravirtual mode - if csiCfg.Spec.VSphereCSI.Mode == VSphereCSIParavirtualMode { - // create an aggregated cluster role RBAC that will be inherited by CAPV (https://kubernetes.io/docs/reference/access-authn-authz/rbac/#aggregated-clusterroles) - // CAPV needs to hold these rules before it can grant it to serviceAccount for CSI - _, err := controllerutil.CreateOrPatch(ctx, r.Client, vsphereCSIProviderServiceAccountAggregatedClusterRole, func() error { - vsphereCSIProviderServiceAccountAggregatedClusterRole.Rules = providerServiceAccountRBACRules - return nil - }) - - if err != nil { - r.Log.Error(err, "Error creating or patching cluster role", "name", vsphereCSIProviderServiceAccountAggregatedClusterRole) - return ctrl.Result{}, err - } - - vsphereCluster, err := cutil.VSphereClusterParavirtualForCAPICluster(ctx, r.Client, cluster) - if err != nil { - return ctrl.Result{}, err - } - serviceAccount := r.mapCSIConfigToProviderServiceAccount(vsphereCluster) - _, err = controllerutil.CreateOrUpdate(ctx, r.Client, serviceAccount, func() error { - return controllerutil.SetControllerReference(vsphereCluster, serviceAccount, r.Scheme) - }) - if err != nil { - logger.Error(err, "Error creating or updating ProviderServiceAccount for VSphere CSI") - return ctrl.Result{}, err - } - } - - csiCfg.Status.SecretRef = &secret.Name - - return ctrl.Result{}, nil -} - -func (r *VSphereCSIConfigReconciler) ConfigMapToVSphereCSIConfig(o client.Object) []ctrl.Request { - configs := &csiv1alpha1.VSphereCSIConfigList{} - _ = r.List(context.Background(), configs) - requests := []ctrl.Request{} - for i := 0; i < len(configs.Items); i++ { - // avoid enqueuing reconcile requests for template vSphereCSIConfig CRs in event handler of ConfigMap CR - if _, ok := configs.Items[i].Annotations[constants.TKGAnnotationTemplateConfig]; ok && configs.Items[i].Namespace == r.Config.SystemNamespace { - continue - } - if configs.Items[i].Spec.VSphereCSI.Mode == VSphereCSIParavirtualMode { - requests = append(requests, - ctrl.Request{NamespacedName: client.ObjectKey{Namespace: configs.Items[i].Namespace, - Name: configs.Items[i].Name}}) - } - } - return requests -} - -func isFeatureStatesConfigMap(o metav1.Object) bool { - return o.GetNamespace() == VSphereCSIFeatureStateNamespace && - o.GetName() == VSphereCSIFeatureStateConfigMapName -} diff --git a/addons/controllers/csi/vspherecsiconfig_datavalues.go b/addons/controllers/csi/vspherecsiconfig_datavalues.go deleted file mode 100644 index f087c32b76..0000000000 --- a/addons/controllers/csi/vspherecsiconfig_datavalues.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -// DataValues is the data values type generated by the VSphereCSIConfig CR -type DataValues struct { - VSphereCSI *DataValuesVSphereCSI `yaml:"vsphereCSI,omitempty"` - VSpherePVCSI *DataValuesVSpherePVCSI `yaml:"vspherePVCSI,omitempty"` -} - -type DataValuesVSpherePVCSI struct { - ClusterAPIVersion string `yaml:"cluster_api_version"` - ClusterKind string `yaml:"cluster_kind"` - ClusterName string `yaml:"cluster_name"` - ClusterUID string `yaml:"cluster_uid"` - Namespace string `yaml:"namespace"` - SupervisorMasterEndpointHostname string `yaml:"supervisor_master_endpoint_hostname"` - SupervisorMasterPort int32 `yaml:"supervisor_master_port"` - FeatureStates map[string]string `yaml:"feature_states,omitempty"` - Zone bool `yaml:"zone"` -} - -type DataValuesVSphereCSI struct { - TLSThumbprint string `yaml:"tlsThumbprint"` - Namespace string `yaml:"namespace"` - ClusterName string `yaml:"clusterName"` - Server string `yaml:"server"` - Datacenter string `yaml:"datacenter"` - PublicNetwork string `yaml:"publicNetwork"` - Username string `yaml:"username"` - Password string `yaml:"password"` - Region string `yaml:"region"` - Zone string `yaml:"zone"` - InsecureFlag bool `yaml:"insecureFlag"` - UseTopologyCategories bool `yaml:"useTopologyCategories"` - ProvisionTimeout string `yaml:"provisionTimeout"` - AttachTimeout string `yaml:"attachTimeout"` - ResizerTimeout string `yaml:"resizerTimeout"` - VSphereVersion string `yaml:"vSphereVersion"` - HTTPProxy string `yaml:"http_proxy"` - HTTPSProxy string `yaml:"https_proxy"` - NoProxy string `yaml:"no_proxy"` - DeploymentReplicas int32 `yaml:"deployment_replicas"` - WindowsSupport bool `yaml:"windows_support"` - NetPermissions map[string]*NetPermissionConfig `yaml:"netpermissions"` -} - -type NetPermissionConfig struct { - Ips string `yaml:"ips"` - Permissions string `yaml:"permissions"` - RootSquash bool `yaml:"rootsquash"` -} diff --git a/addons/controllers/csi/vspherecsiconfig_utils.go b/addons/controllers/csi/vspherecsiconfig_utils.go deleted file mode 100644 index 5a067ad632..0000000000 --- a/addons/controllers/csi/vspherecsiconfig_utils.go +++ /dev/null @@ -1,499 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "encoding/json" - "fmt" - "strings" - - "github.com/pkg/errors" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capvvmwarev1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/vmware/v1beta1" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - capictrlpkubeadmv1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/log" - - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - pkgtypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" - topologyv1alpha1 "github.com/vmware-tanzu/vm-operator/external/tanzu-topology/api/v1alpha1" -) - -const ( - varIdentityRef = "identityRef" - namespaceCAPV = "capv-system" -) - -// ClusterToVSphereCSIConfig returns a list of Requests with VSphereCSIConfig ObjectKey -func (r *VSphereCSIConfigReconciler) ClusterToVSphereCSIConfig(o client.Object) []ctrl.Request { - cluster, ok := o.(*clusterv1beta1.Cluster) - if !ok { - r.Log.Error(errors.New("invalid type"), - "Expected to receive Cluster resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - r.Log.V(4).Info("Mapping Cluster to VSphereCSIConfig") - - configs := &csiv1alpha1.VSphereCSIConfigList{} - - if err := r.Client.List(context.Background(), configs); err != nil { - r.Log.Error(err, "Error listing VSphereCSIConfig") - return nil - } - - var requests []ctrl.Request - for i := range configs.Items { - config := &configs.Items[i] - if config.Namespace == cluster.Namespace { - // avoid enqueuing reconcile requests for template VSphereCSIConfig CRs in event handler of Cluster CR - if _, ok := config.Annotations[constants.TKGAnnotationTemplateConfig]; ok && config.Namespace == r.Config.SystemNamespace { - continue - } - - // corresponding VSphereCSIConfig should have following ownerRef - ownerReference := metav1.OwnerReference{ - APIVersion: clusterv1beta1.GroupVersion.String(), - Kind: constants.ClusterKind, - Name: cluster.Name, - UID: cluster.UID, - } - - if clusterapiutil.HasOwnerRef(config.OwnerReferences, ownerReference) { - r.Log.V(4).Info("Adding VSphereCSIConfig for reconciliation", - constants.NamespaceLogKey, config.Namespace, constants.NameLogKey, config.Name) - - requests = append(requests, ctrl.Request{ - NamespacedName: clusterapiutil.ObjectKey(config), - }) - } - } - } - - return requests -} - -// mapVSphereCSIConfigToDataValues maps VSphereCSIConfig CR to data values -func (r *VSphereCSIConfigReconciler) mapVSphereCSIConfigToDataValues(ctx context.Context, - vcsiConfig *csiv1alpha1.VSphereCSIConfig, - cluster *clusterv1beta1.Cluster) (*DataValues, error) { - - switch vcsiConfig.Spec.VSphereCSI.Mode { - case VSphereCSINonParavirtualMode: - return r.mapVSphereCSIConfigToDataValuesNonParavirtual(ctx, vcsiConfig, cluster) - case VSphereCSIParavirtualMode: - return r.mapVSphereCSIConfigToDataValuesParavirtual(ctx, cluster) - default: - break - } - // TODO: implement validation webhook to prevent this https://github.com/vmware-tanzu/tanzu-framework/issues/2087 - return nil, errors.Errorf("Invalid CSI mode '%s', must either be '%s' or '%s'", - vcsiConfig.Spec.VSphereCSI.Mode, VSphereCSIParavirtualMode, VSphereCSINonParavirtualMode) -} - -func (r *VSphereCSIConfigReconciler) mapVSphereCSIConfigToDataValuesParavirtual(ctx context.Context, - cluster *clusterv1beta1.Cluster) (*DataValues, error) { - - dvs := &DataValues{} - dvs.VSpherePVCSI = &DataValuesVSpherePVCSI{} - dvs.VSpherePVCSI.ClusterAPIVersion = cluster.GroupVersionKind().GroupVersion().String() - dvs.VSpherePVCSI.ClusterKind = cluster.GroupVersionKind().Kind - dvs.VSpherePVCSI.ClusterName = cluster.Name - dvs.VSpherePVCSI.ClusterUID = string(cluster.UID) - // default values from https://github.com/vmware-tanzu/community-edition/blob/main/addons/packages/vsphere-pv-csi/2.4.1/bundle/config/values.yaml - dvs.VSpherePVCSI.Namespace = VSphereSystemCSINamepace - dvs.VSpherePVCSI.SupervisorMasterEndpointHostname = DefaultSupervisorMasterEndpointHostname - dvs.VSpherePVCSI.SupervisorMasterPort = DefaultSupervisorMasterPort - dvs.VSpherePVCSI.FeatureStates = map[string]string{} - featureStatesCM := &v1.ConfigMap{} - key := types.NamespacedName{Namespace: VSphereCSIFeatureStateNamespace, Name: VSphereCSIFeatureStateConfigMapName} - if err := r.Get(ctx, key, featureStatesCM); err != nil { - if !apierrors.IsNotFound(err) { - return nil, errors.Errorf("Error reading configmap '%s/%s': %v", key.Namespace, key.Name, err) - } - dvs.VSpherePVCSI.FeatureStates = nil - } - if dvs.VSpherePVCSI.FeatureStates != nil { - for k, v := range featureStatesCM.Data { - dvs.VSpherePVCSI.FeatureStates[k] = v - } - } - - var err error - dvs.VSpherePVCSI.Zone, err = r.isStretchedSupervisorCluster(ctx) - if err != nil { - return nil, err - } - - return dvs, nil -} - -func (r *VSphereCSIConfigReconciler) mapVSphereCSIConfigToDataValuesNonParavirtual(ctx context.Context, - vcsiConfig *csiv1alpha1.VSphereCSIConfig, - cluster *clusterv1beta1.Cluster) (*DataValues, error) { - - dvs := &DataValues{} - - // populate derived values - dvs.VSphereCSI = &DataValuesVSphereCSI{} - dvs.VSphereCSI.ClusterName = cluster.Name - - vsphereCluster, err := cutil.VSphereClusterNonParavirtualForCluster(ctx, r.Client, cluster) - if err != nil { - return nil, err - } - dvs.VSphereCSI.Server = vsphereCluster.Spec.Server - dvs.VSphereCSI.TLSThumbprint = vsphereCluster.Spec.Thumbprint - - // get the control plane machine template - cpMachineTemplate, err := cutil.ControlPlaneVsphereMachineTemplateNonParavirtualForCluster(ctx, r.Client, cluster) - if err != nil { - return nil, err - } - - dvs.VSphereCSI.Datacenter = cpMachineTemplate.Spec.Template.Spec.Datacenter - if len(cpMachineTemplate.Spec.Template.Spec.Network.Devices) > 0 { - dvs.VSphereCSI.PublicNetwork = cpMachineTemplate.Spec.Template.Spec.Network.Devices[0].NetworkName - } - - // derive vSphere username and password from the secret. - // In case of TMC based deployment, we do not create secret. - // Hence if secret is not found, check for VSphereClusterIdentity resource - // to fetch vSphere username and password - secretName := cluster.Name - secretNamespace := cluster.Namespace - for _, variable := range cluster.Spec.Topology.Variables { - if variable.Name == varIdentityRef { - identityRef := &capvv1beta1.VSphereIdentityReference{} - if err := json.Unmarshal(variable.Value.Raw, identityRef); err != nil { - return nil, errors.Wrapf(err, fmt.Sprintf("could not parse variable identityRef: %v", variable)) - } - switch identityRef.Kind { - case capvv1beta1.VSphereClusterIdentityKind: - vSphereClusterIdentity := &capvv1beta1.VSphereClusterIdentity{} - if err := r.Client.Get(ctx, client.ObjectKey{Name: identityRef.Name}, vSphereClusterIdentity); err != nil { - return nil, errors.Wrapf(err, fmt.Sprintf("could not get VSphereClusterIdentity %s", identityRef.Name)) - } - if vSphereClusterIdentity.Status.Ready { - secretName = vSphereClusterIdentity.Spec.SecretName - secretNamespace = namespaceCAPV - } else { - return nil, errors.New(fmt.Sprintf("VShereClusterIdentity %s is not ready yet", identityRef.Name)) - } - case capvv1beta1.SecretKind: - secretName = identityRef.Name - default: - return nil, errors.New(fmt.Sprintf("not supported identityRef type %s", identityRef.Kind)) - } - } - } - clusterSecret, err := cutil.GetSecret(ctx, r.Client, secretNamespace, secretName) - if err != nil { - return nil, err - } - dvs.VSphereCSI.Username, dvs.VSphereCSI.Password, err = cutil.GetUsernameAndPasswordFromSecret(clusterSecret) - if err != nil { - return nil, err - } - - if cluster.Annotations != nil { - dvs.VSphereCSI.HTTPProxy = cluster.Annotations[pkgtypes.HTTPProxyConfigAnnotation] - dvs.VSphereCSI.HTTPSProxy = cluster.Annotations[pkgtypes.HTTPSProxyConfigAnnotation] - dvs.VSphereCSI.NoProxy = cluster.Annotations[pkgtypes.NoProxyConfigAnnotation] - } - - // populated from default value in https://github.com/vmware-tanzu/community-edition/blob/main/addons/packages/vsphere-csi/2.4.1/bundle/config/values.yaml - dvs.VSphereCSI.Namespace = VSphereCSINamespace - dvs.VSphereCSI.UseTopologyCategories = false - dvs.VSphereCSI.ProvisionTimeout = VSphereCSIProvisionTimeout - dvs.VSphereCSI.AttachTimeout = VSphereCSIAttachTimeout - dvs.VSphereCSI.ResizerTimeout = VSphereCSIResizerTimeout - deploymentReplicas, err := r.computeRecommendedNumberOfDeploymentReplicas(ctx, cluster) - if err != nil { - return nil, errors.Errorf("Failed to set number of vsphere csi deployment replicas: '%v'", err) - } - dvs.VSphereCSI.DeploymentReplicas = deploymentReplicas - dvs.VSphereCSI.InsecureFlag = true - - // TODO: implement defaulting webhook for 'vspherecsiconfig' https://github.com/vmware-tanzu/tanzu-framework/issues/2088 - // override derived values IF set in csi configuration by user - if vcsiConfig.Spec.VSphereCSI.NonParavirtualConfig != nil { - if err := r.overrideDerivedValues(ctx, dvs.VSphereCSI, vcsiConfig); err != nil { - return nil, errors.Errorf("Failed to override derived values: '%v'", err) - } - } - - return dvs, nil -} - -// getOwnerCluster verifies that the VSphereCSIConfig has a cluster as its owner reference, -// and returns the cluster. It tries to read the cluster name from the VSphereCSIConfig's owner reference objects. -// If not there, we assume the owner cluster and VSphereCSIConfig always has the same name. -// -//nolint:unused -func (r *VSphereCSIConfigReconciler) getOwnerCluster(ctx context.Context, - vcsiConfig *csiv1alpha1.VSphereCSIConfig) (*clusterv1beta1.Cluster, error) { - - logger := log.FromContext(ctx) - cluster := &clusterv1beta1.Cluster{} - clusterName := vcsiConfig.Name // usually the corresponding 'cluster' shares the same name - - // retrieve the owner cluster for the VSphereCSIConfig object - for _, ownerRef := range vcsiConfig.GetOwnerReferences() { - if strings.EqualFold(ownerRef.Kind, constants.ClusterKind) { - clusterName = ownerRef.Name - break - } - } - if err := r.Client.Get(ctx, types.NamespacedName{Namespace: vcsiConfig.Namespace, Name: clusterName}, cluster); err != nil { - if apierrors.IsNotFound(err) { - logger.Info(fmt.Sprintf("Cluster resource '%s/%s' not found", vcsiConfig.Namespace, clusterName)) - return nil, nil - } - logger.Error(err, fmt.Sprintf("Unable to fetch cluster '%s/%s'", vcsiConfig.Namespace, clusterName)) - return nil, err - } - - return cluster, nil -} - -// mapCSIConfigToProviderServiceAccount maps CSIConfig and cluster to the corresponding service account -func (r *VSphereCSIConfigReconciler) mapCSIConfigToProviderServiceAccount(vsphereCluster *capvvmwarev1beta1.VSphereCluster) *capvvmwarev1beta1.ProviderServiceAccount { - serviceAccount := &capvvmwarev1beta1.ProviderServiceAccount{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%s-%s", vsphereCluster.Name, "pvcsi"), - Namespace: vsphereCluster.Namespace, - }, - Spec: capvvmwarev1beta1.ProviderServiceAccountSpec{ - Ref: &v1.ObjectReference{Name: vsphereCluster.Name, Namespace: vsphereCluster.Namespace}, - Rules: providerServiceAccountRBACRules, - TargetNamespace: "vmware-system-csi", - TargetSecretName: "pvcsi-provider-creds", - }, - } - return serviceAccount -} - -func (r *VSphereCSIConfigReconciler) overrideDerivedValues(ctx context.Context, - dvscsi *DataValuesVSphereCSI, - vcsiConfig *csiv1alpha1.VSphereCSIConfig) error { - - r.overrideProxyValues(dvscsi, vcsiConfig) - r.overrideTimeoutValues(dvscsi, vcsiConfig) - r.overrideTopologyValues(ctx, dvscsi, vcsiConfig) - r.overrideClusterValues(dvscsi, vcsiConfig) - r.overrideMiscValues(dvscsi, vcsiConfig) - r.overrideNetPermissionsValues(dvscsi, vcsiConfig) - - return r.overrideCredentialValues(ctx, dvscsi, vcsiConfig) -} - -func (r *VSphereCSIConfigReconciler) overrideProxyValues(dvscsi *DataValuesVSphereCSI, - vcsiConfig *csiv1alpha1.VSphereCSIConfig) { - - config := vcsiConfig.Spec.VSphereCSI.NonParavirtualConfig - if config.HTTPProxy != "" { - dvscsi.HTTPProxy = config.HTTPProxy - } - if config.HTTPSProxy != "" { - dvscsi.HTTPSProxy = config.HTTPSProxy - } - if config.NoProxy != "" { - dvscsi.NoProxy = config.NoProxy - } -} - -func (r *VSphereCSIConfigReconciler) overrideTimeoutValues(dvscsi *DataValuesVSphereCSI, - vcsiConfig *csiv1alpha1.VSphereCSIConfig) { - - config := vcsiConfig.Spec.VSphereCSI.NonParavirtualConfig - if config.ProvisionTimeout != "" { - dvscsi.ProvisionTimeout = config.ProvisionTimeout - } - if config.AttachTimeout != "" { - dvscsi.AttachTimeout = config.AttachTimeout - } - if config.ResizerTimeout != "" { - dvscsi.ResizerTimeout = config.ResizerTimeout - } -} - -func (r *VSphereCSIConfigReconciler) overrideTopologyValues(ctx context.Context, - dvscsi *DataValuesVSphereCSI, - vcsiConfig *csiv1alpha1.VSphereCSIConfig) { - - config := vcsiConfig.Spec.VSphereCSI.NonParavirtualConfig - if config.Server != "" { - dvscsi.Server = config.Server - } - if config.Datacenter != "" { - dvscsi.Datacenter = config.Datacenter - } - if config.PublicNetwork != "" { - dvscsi.PublicNetwork = config.PublicNetwork - } - if config.UseTopologyCategories != nil { - dvscsi.UseTopologyCategories = *config.UseTopologyCategories - } - if config.DeploymentReplicas != nil { - dvscsi.DeploymentReplicas = r.constrainNumberOfDeploymentReplicas(ctx, *config.DeploymentReplicas) - } -} - -func (r *VSphereCSIConfigReconciler) overrideCredentialValues(ctx context.Context, - dvscsi *DataValuesVSphereCSI, - vcsiConfig *csiv1alpha1.VSphereCSIConfig) error { - - config := vcsiConfig.Spec.VSphereCSI.NonParavirtualConfig - if config.VSphereCredentialLocalObjRef != nil { - secret, err := cutil.GetSecret(ctx, r.Client, vcsiConfig.Namespace, config.VSphereCredentialLocalObjRef.Name) - if err != nil { - return err - } - dvscsi.Username, dvscsi.Password, err = cutil.GetUsernameAndPasswordFromSecret(secret) - if err != nil { - return err - } - } - - return nil -} - -func (r *VSphereCSIConfigReconciler) overrideClusterValues(dvscsi *DataValuesVSphereCSI, - vcsiConfig *csiv1alpha1.VSphereCSIConfig) { - - config := vcsiConfig.Spec.VSphereCSI.NonParavirtualConfig - if config.Namespace != "" { - dvscsi.Namespace = config.Namespace - } - if config.ClusterName != "" { - dvscsi.ClusterName = config.ClusterName - } - - if config.Region != "" { - dvscsi.Region = config.Region - } - if config.Zone != "" { - dvscsi.Zone = config.Zone - } -} - -func (r *VSphereCSIConfigReconciler) overrideMiscValues(dvscsi *DataValuesVSphereCSI, - vcsiConfig *csiv1alpha1.VSphereCSIConfig) { - - config := vcsiConfig.Spec.VSphereCSI.NonParavirtualConfig - if config.VSphereVersion != "" { - dvscsi.VSphereVersion = config.VSphereVersion - } - if config.WindowsSupport != nil { - dvscsi.WindowsSupport = *config.WindowsSupport - } - if config.TLSThumbprint != "" { - dvscsi.TLSThumbprint = config.TLSThumbprint - } - if config.InsecureFlag != nil { - dvscsi.InsecureFlag = *config.InsecureFlag - } -} - -func (r *VSphereCSIConfigReconciler) overrideNetPermissionsValues(dvscsi *DataValuesVSphereCSI, - vcsiConfig *csiv1alpha1.VSphereCSIConfig) { - - config := vcsiConfig.Spec.VSphereCSI.NonParavirtualConfig - if config.NetPermissions != nil { - netPermisions := make(map[string]*NetPermissionConfig) - for permKey, permConfig := range config.NetPermissions { - netPermisionConfig := &NetPermissionConfig{} - if permConfig.Ips != "" { - netPermisionConfig.Ips = permConfig.Ips - } - if permConfig.Permissions != "" { - netPermisionConfig.Permissions = permConfig.Permissions - } - netPermisionConfig.RootSquash = permConfig.RootSquash - netPermisions[permKey] = netPermisionConfig - } - dvscsi.NetPermissions = netPermisions - } -} - -func (r *VSphereCSIConfigReconciler) constrainNumberOfDeploymentReplicas(ctx context.Context, proposedCount int32) int32 { - logger := log.FromContext(ctx) - if proposedCount < VSphereCSIMinDeploymentReplicas { - logger.Info(fmt.Sprintf("WARNING: adjusting vsphere csi replica count from '%d' to '%d'", - proposedCount, VSphereCSIMinDeploymentReplicas)) - return VSphereCSIMinDeploymentReplicas - } - - if proposedCount > VSphereCSIMaxDeploymentReplicas { - logger.Info(fmt.Sprintf("WARNING: adjusting vsphere csi replica count from '%d' to '%d'", - proposedCount, VSphereCSIMaxDeploymentReplicas)) - return VSphereCSIMaxDeploymentReplicas - } - - return proposedCount -} - -func (r *VSphereCSIConfigReconciler) computeRecommendedNumberOfDeploymentReplicas(ctx context.Context, - cluster *clusterv1beta1.Cluster) (int32, error) { - - cpNodeCount, err := r.getNumberOfControlPlaneNodes(ctx, cluster) - - if err != nil { - return -1, errors.Errorf("Failed to compute number of vsphere csi deployment replicas: '%v'", err) - } - - return r.constrainNumberOfDeploymentReplicas(ctx, cpNodeCount), nil -} - -func (r *VSphereCSIConfigReconciler) getNumberOfControlPlaneNodes(ctx context.Context, - cluster *clusterv1beta1.Cluster) (int32, error) { - - if cluster.Spec.ControlPlaneRef == nil { - return -1, fmt.Errorf("cluster %s 's controlplane reference is not set yet", cluster.Name) - } - - name := cluster.Spec.ControlPlaneRef.Name - namespace := cluster.Spec.ControlPlaneRef.Namespace - - kcp := &capictrlpkubeadmv1beta1.KubeadmControlPlane{} - if err := r.Client.Get(ctx, types.NamespacedName{ - Namespace: namespace, - Name: name, - }, kcp); err != nil { - return -1, errors.Errorf("KubeadmControlPlane %s/%s could not be fetched, error %v", - name, namespace, err) - } - return *kcp.Spec.Replicas, nil -} - -// Return true if Valid Availability Zones are present -// i.e. if the cluster is Stretch Supervisor -func (r *VSphereCSIConfigReconciler) isStretchedSupervisorCluster(ctx context.Context) (bool, error) { - azList := &topologyv1alpha1.AvailabilityZoneList{} - - err := r.Client.List(ctx, azList) - if err != nil { - return false, err - } - - if len(azList.Items) <= 1 { - // by default every non-stretched cluster contains a single zone, - // if there is only one AZ we assume it is non-stretched cluster - return false, nil - } - - return true, nil -} diff --git a/addons/controllers/doc.go b/addons/controllers/doc.go deleted file mode 100644 index 7732f440b2..0000000000 --- a/addons/controllers/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package controllers implements k8s controller functionality for addons. -package controllers diff --git a/addons/controllers/kapp-controller/kappcontrollerconfig_controller.go b/addons/controllers/kapp-controller/kappcontrollerconfig_controller.go deleted file mode 100644 index 6fb2f9f7ea..0000000000 --- a/addons/controllers/kapp-controller/kappcontrollerconfig_controller.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package controllers implements k8s controller functionality for kapp-controller config CRD. -package controllers - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - "gopkg.in/yaml.v2" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/source" - - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// KappControllerConfigReconciler reconciles a KappControllerConfig object -type KappControllerConfigReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Config addonconfig.KappControllerConfigControllerConfig -} - -//+kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=kappcontrollerconfigs,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=kappcontrollerconfigs/status,verbs=get;update;patch - -// Reconcile is part of the main kubernetes reconciliation loop which aims to -// move the current state of the cluster closer to the desired state. -func (r *KappControllerConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - log := r.Log.WithValues("kappControllerConfig", req.NamespacedName) - - // get kapp-controller config object - kappControllerConfig := &runv1alpha3.KappControllerConfig{} - if err := r.Client.Get(ctx, req.NamespacedName, kappControllerConfig); err != nil { - if apierrors.IsNotFound(err) { - r.Log.Info("kappControllerConfig resource not found") - return ctrl.Result{}, nil - } - r.Log.Error(err, "Unable to fetch kappControllerConfig resource") - return ctrl.Result{}, err - } - - annotations := kappControllerConfig.GetAnnotations() - if _, ok := annotations[constants.TKGAnnotationTemplateConfig]; ok { - r.Log.Info(fmt.Sprintf("resource '%v' is a config template. Skipping reconciling", req.NamespacedName)) - return ctrl.Result{}, nil - } - - // Deepcopy to prevent client-go cache conflict - kappControllerConfig = kappControllerConfig.DeepCopy() - - cluster, err := cutil.GetOwnerCluster(ctx, r.Client, kappControllerConfig, req.Namespace, constants.KappControllerDefaultRefName) - if err != nil { - if apierrors.IsNotFound(err) && cluster != nil { - r.Log.Info(fmt.Sprintf("'%s/%s' is listed as owner reference but could not be found", - cluster.Namespace, cluster.Name)) - return ctrl.Result{}, nil - } - r.Log.Info("could not determine owner cluster") - return ctrl.Result{}, err - } - - if retResult, err := r.ReconcileKappControllerConfig(ctx, kappControllerConfig, cluster, log); err != nil { - log.Error(err, "unable to reconcile kappControllerConfig") - return retResult, err - } - - return ctrl.Result{}, nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *KappControllerConfigReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { - return ctrl.NewControllerManagedBy(mgr). - For(&runv1alpha3.KappControllerConfig{}). - Watches( - &source.Kind{Type: &clusterapiv1beta1.Cluster{}}, - handler.EnqueueRequestsFromMapFunc(r.ClusterToKappControllerConfig), - ). - WithOptions(options). - WithEventFilter(predicates.ConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, constants.KappControllerConfigKind, r.Config.SystemNamespace, r.Log)). - Complete(r) -} - -// ReconcileKappControllerConfig reconciles KappControllerConfig CR -func (r *KappControllerConfigReconciler) ReconcileKappControllerConfig( - ctx context.Context, - kappControllerConfig *runv1alpha3.KappControllerConfig, - cluster *clusterapiv1beta1.Cluster, - log logr.Logger) (_ ctrl.Result, retErr error) { - - patchHelper, err := clusterapipatchutil.NewHelper(kappControllerConfig, r.Client) - if err != nil { - return ctrl.Result{}, err - } - // Patch KappControllerConfig before returning the function - defer func() { - log.Info("Patching kappControllerConfig") - - if err := patchHelper.Patch(ctx, kappControllerConfig); err != nil { - log.Error(err, "Error patching kappControllerConfig") - retErr = err - } - }() - - if err := r.ReconcileKappControllerConfigNormal(ctx, kappControllerConfig, cluster, log); err != nil { - log.Error(err, "Error reconciling kappControllerConfig") - return ctrl.Result{}, err - } - - log.Info("Successfully reconciled kappControllerConfig") - - return ctrl.Result{}, nil -} - -// ReconcileKappControllerConfigNormal reconciles KappControllerConfig CR -func (r *KappControllerConfigReconciler) ReconcileKappControllerConfigNormal( - ctx context.Context, - kappControllerConfig *runv1alpha3.KappControllerConfig, - cluster *clusterapiv1beta1.Cluster, - log logr.Logger) (retErr error) { - - // add owner reference to kappControllerConfig - ownerReference := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - - if !clusterapiutil.HasOwnerRef(kappControllerConfig.OwnerReferences, ownerReference) { - log.Info("Adding owner reference to kappControllerConfig") - kappControllerConfig.OwnerReferences = clusterapiutil.EnsureOwnerRef(kappControllerConfig.OwnerReferences, ownerReference) - } - - if err := r.ReconcileKappControllerConfigDataValue(ctx, kappControllerConfig, cluster, log); err != nil { - log.Error(err, "Error creating kappControllerConfig data value secret") - return err - } - - // update status.secretRef - dataValueSecretName := util.GenerateDataValueSecretName(cluster.Name, constants.KappControllerAddonName) - kappControllerConfig.Status.SecretRef = dataValueSecretName - - return nil -} - -// ReconcileKappControllerConfigDataValue reconciles KappControllerConfig data values secret -func (r *KappControllerConfigReconciler) ReconcileKappControllerConfigDataValue( - ctx context.Context, - kappControllerConfig *runv1alpha3.KappControllerConfig, - cluster *clusterapiv1beta1.Cluster, - log logr.Logger) (retErr error) { - - dataValuesSecret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateDataValueSecretName(cluster.Name, constants.KappControllerAddonName), - Namespace: cluster.Namespace, - OwnerReferences: []metav1.OwnerReference{{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - }}, - }, - } - - dataValuesSecretMutateFn := func() error { - dataValuesSecret.Type = corev1.SecretTypeOpaque - dataValuesSecret.StringData = make(map[string]string) - - // marshall the yaml contents - kappConfig, err := mapKappControllerConfigSpec(cluster, kappControllerConfig) - if err != nil { - return err - } - - dataValueYamlBytes, err := yaml.Marshal(kappConfig) - if err != nil { - return err - } - - dataValuesSecret.StringData[constants.TKGDataValueFileName] = string(dataValueYamlBytes) - - return nil - } - - result, err := controllerutil.CreateOrPatch(ctx, r.Client, dataValuesSecret, dataValuesSecretMutateFn) - if err != nil { - log.Error(err, "Error creating or patching kappControllerConfig data values secret") - return err - } - - log.Info(fmt.Sprintf("Resource %s data values secret %s", constants.KappControllerAddonName, result)) - - return nil -} diff --git a/addons/controllers/kapp-controller/kappcontrollerconfig_handlers.go b/addons/controllers/kapp-controller/kappcontrollerconfig_handlers.go deleted file mode 100644 index 48e595fc30..0000000000 --- a/addons/controllers/kapp-controller/kappcontrollerconfig_handlers.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "errors" - "fmt" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// ClusterToKappControllerConfig returns a list of Requests with KappControllerConfig ObjectKey -func (r *KappControllerConfigReconciler) ClusterToKappControllerConfig(o client.Object) []ctrl.Request { - cluster, ok := o.(*clusterv1beta1.Cluster) - if !ok { - r.Log.Error(errors.New("invalid type"), - "Expected to receive Cluster resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - log := r.Log.WithValues(constants.ClusterNameLogKey, cluster.Name) - - log.V(4).Info("Mapping cluster to KappControllerConfig") - - KappControllerConfigList := &runtanzuv1alpha3.KappControllerConfigList{} - - if err := r.Client.List(context.Background(), KappControllerConfigList); err != nil { - log.Error(err, "Error listing KappControllerConfig") - return nil - } - - var requests []ctrl.Request - for i := range KappControllerConfigList.Items { - config := &KappControllerConfigList.Items[i] - if config.Namespace == cluster.Namespace { - // avoid enqueuing reconcile requests for template KappControllerConfig CRs in event handler of Cluster CR - if _, ok := config.Annotations[constants.TKGAnnotationTemplateConfig]; ok && config.Namespace == r.Config.SystemNamespace { - continue - } - - // corresponding kappControllerConfig should have following ownerRef - ownerReference := metav1.OwnerReference{ - APIVersion: clusterv1beta1.GroupVersion.String(), - Kind: constants.ClusterKind, - Name: cluster.Name, - UID: cluster.UID, - } - - if clusterapiutil.HasOwnerRef(config.OwnerReferences, ownerReference) { - log.V(4).Info("Adding KappControllerConfig for reconciliation", - constants.NamespaceLogKey, config.Namespace, constants.NameLogKey, config.Name) - - requests = append(requests, ctrl.Request{ - NamespacedName: clusterapiutil.ObjectKey(config), - }) - } - } - } - - return requests -} diff --git a/addons/controllers/kapp-controller/kappcontrollerconfig_types.go b/addons/controllers/kapp-controller/kappcontrollerconfig_types.go deleted file mode 100644 index 6b3e7ca075..0000000000 --- a/addons/controllers/kapp-controller/kappcontrollerconfig_types.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "encoding/base64" - "reflect" - "strings" - - "github.com/pkg/errors" - netutils "k8s.io/utils/net" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// kappControllerConfigSpec defines the desired state of KappControllerConfig -type kappControllerConfigSpec struct { - Namespace string `yaml:"namespace,omitempty"` - KappController kappController `yaml:"kappController,omitempty"` - NodeSelector NodeSelector `yaml:"nodeSelector"` -} - -// NodeSelector contains the nodeSelector information -type NodeSelector struct { - NodeRoleControlPlane string `yaml:"node-role.kubernetes.io/control-plane"` -} - -type kappController struct { - CreateNamespace bool `yaml:"createNamespace,omitempty"` - GlobalNamespace string `yaml:"globalNamespace,omitempty"` - Deployment kappDeployment `yaml:"deployment,omitempty"` - Config kappConfig `yaml:"config,omitempty"` -} - -type kappDeployment struct { - CoreDNSIP string `yaml:"coreDNSIP,omitempty"` - HostNetwork bool `yaml:"hostNetwork,omitempty"` - PriorityClassName string `yaml:"priorityClassName,omitempty"` - Concurrency int `yaml:"concurrency,omitempty"` - Tolerations []map[string]string `yaml:"tolerations,omitempty"` - APIPort int `yaml:"apiPort,omitempty"` - MetricsBindAddress string `yaml:"metricsBindAddress,omitempty"` -} - -type kappConfig struct { - CaCerts string `yaml:"caCerts,omitempty"` - HTTPProxy string `yaml:"httpProxy,omitempty"` - HTTPSProxy string `yaml:"httpsProxy,omitempty"` - NoProxy string `yaml:"noProxy,omitempty"` - DangerousSkipTLSVerify string `yaml:"dangerousSkipTLSVerify,omitempty"` -} - -func getCoreDNSIP(cluster *clusterapiv1beta1.Cluster) (string, error) { - var serviceCIDR string - if cluster.Spec.ClusterNetwork != nil && cluster.Spec.ClusterNetwork.Services != nil && len(cluster.Spec.ClusterNetwork.Services.CIDRBlocks) > 0 { - serviceCIDR = cluster.Spec.ClusterNetwork.Services.CIDRBlocks[0] - } else { - return "", errors.New("Unable to get cluster serviceCIDR") - } - - svcSubnets, err := netutils.ParseCIDRs(strings.Split(serviceCIDR, ",")) - if err != nil { - return "", err - } - dnsIP, err := netutils.GetIndexedIP(svcSubnets[0], 10) - if err != nil { - return "", err - } - - return dnsIP.String(), nil -} - -func mapKappControllerConfigSpec(cluster *clusterapiv1beta1.Cluster, config *runv1alpha3.KappControllerConfig) (*kappControllerConfigSpec, error) { - configSpec := &kappControllerConfigSpec{} - - configSpec.Namespace = config.Spec.Namespace - - // KappController - configSpec.KappController.CreateNamespace = config.Spec.KappController.CreateNamespace - configSpec.KappController.GlobalNamespace = config.Spec.KappController.GlobalNamespace - - // Deployment - configSpec.KappController.Deployment.HostNetwork = config.Spec.KappController.Deployment.HostNetwork - // set the coreDNS IP if hostNetwork is enabled - if configSpec.KappController.Deployment.HostNetwork { - coreDNSIP, err := getCoreDNSIP(cluster) - if err != nil { - return nil, errors.Wrap(err, "Unable to get cluster CoreDNS IP") - } - configSpec.KappController.Deployment.CoreDNSIP = coreDNSIP - } - configSpec.KappController.Deployment.PriorityClassName = config.Spec.KappController.Deployment.PriorityClassName - configSpec.KappController.Deployment.Concurrency = config.Spec.KappController.Deployment.Concurrency - configSpec.KappController.Deployment.Tolerations = config.Spec.KappController.Deployment.Tolerations - cpToleration := map[string]string{"effect": "NoSchedule", "key": "node-role.kubernetes.io/control-plane"} - var cpTolerationExists bool - for _, toleration := range configSpec.KappController.Deployment.Tolerations { - if reflect.DeepEqual(toleration, cpToleration) { - cpTolerationExists = true - break - } - } - if !cpTolerationExists { - configSpec.KappController.Deployment.Tolerations = append(configSpec.KappController.Deployment.Tolerations, cpToleration) - } - - configSpec.KappController.Deployment.APIPort = config.Spec.KappController.Deployment.APIPort - configSpec.KappController.Deployment.MetricsBindAddress = config.Spec.KappController.Deployment.MetricsBindAddress - - // Will use cluster-wide proxy and network setting if no user input is provided - if cluster.Annotations != nil { - data, err := base64.StdEncoding.DecodeString(cluster.Annotations[types.ProxyCACertConfigAnnotation]) - if err != nil { - return nil, errors.Wrapf(err, "Unable to decode certificate from cluster annotation %s", types.ProxyCACertConfigAnnotation) - } - configSpec.KappController.Config.CaCerts = string(data) - configSpec.KappController.Config.HTTPProxy = cluster.Annotations[types.HTTPProxyConfigAnnotation] - configSpec.KappController.Config.HTTPSProxy = cluster.Annotations[types.HTTPSProxyConfigAnnotation] - configSpec.KappController.Config.NoProxy = cluster.Annotations[types.NoProxyConfigAnnotation] - configSpec.KappController.Config.DangerousSkipTLSVerify = cluster.Annotations[types.SkipTLSVerifyConfigAnnotation] - } - - // user provided proxy and network setting will override cluster-wide settings - if config.Spec.KappController.Config.CaCerts != "" { - configSpec.KappController.Config.CaCerts = config.Spec.KappController.Config.CaCerts - } - if config.Spec.KappController.Config.HTTPProxy != "" { - configSpec.KappController.Config.HTTPProxy = config.Spec.KappController.Config.HTTPProxy - } - if config.Spec.KappController.Config.HTTPSProxy != "" { - configSpec.KappController.Config.HTTPSProxy = config.Spec.KappController.Config.HTTPSProxy - } - if config.Spec.KappController.Config.NoProxy != "" { - configSpec.KappController.Config.NoProxy = config.Spec.KappController.Config.NoProxy - } - if configSpec.KappController.Config.DangerousSkipTLSVerify != "" { - configSpec.KappController.Config.DangerousSkipTLSVerify = config.Spec.KappController.Config.DangerousSkipTLSVerify - } - - configSpec.NodeSelector = NodeSelector{NodeRoleControlPlane: ""} - - return configSpec, nil -} diff --git a/addons/controllers/kappcontrollerconfig_controller_test.go b/addons/controllers/kappcontrollerconfig_controller_test.go deleted file mode 100644 index 977046caac..0000000000 --- a/addons/controllers/kappcontrollerconfig_controller_test.go +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "os" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - v1 "k8s.io/api/core/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -const ( - testKappController1 = "test-kapp-controller-1" -) - -var _ = Describe("KappControllerConfig Reconciler", func() { - var ( - clusterName string - kappConfigCRName string - clusterResourceFilePath string - ) - - JustBeforeEach(func() { - By("Creating a cluster and a KappControllerConfig") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - }) - - AfterEach(func() { - By("Deleting cluster and KappControllerConfig") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - // Best effort resource deletion - _ = testutil.DeleteResources(f, cfg, dynamicClient, true) - }) - - Context("reconcile KappControllerConfig for management cluster", func() { - - BeforeEach(func() { - clusterName = testKappController1 - kappConfigCRName = util.GeneratePackageSecretName(clusterName, constants.KappControllerDefaultRefName) - clusterResourceFilePath = "testdata/test-kapp-controller-1.yaml" - }) - - It("Should reconcile KappControllerConfig and create data value secret on management cluster", func() { - - key := client.ObjectKey{ - Namespace: defaultString, - Name: clusterName, - } - configKey := client.ObjectKey{ - Namespace: defaultString, - Name: kappConfigCRName, - } - - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - err := k8sClient.Get(ctx, key, cluster) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue()) - - config := &runv1alpha3.KappControllerConfig{} - Eventually(func() bool { - err := k8sClient.Get(ctx, configKey, config) - if err != nil { - return false - } - // check owner reference - return cutil.VerifyOwnerRef(config, clusterName, constants.ClusterKind) - - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // check spec values - Expect(config.Spec.Namespace).Should(Equal("test-ns")) - Expect(config.Spec.KappController.CreateNamespace).Should(Equal(true)) - Expect(config.Spec.KappController.GlobalNamespace).Should(Equal("tanzu-package-repo-global")) - Expect(config.Spec.KappController.Deployment.Concurrency).Should(Equal(4)) - Expect(config.Spec.KappController.Deployment.HostNetwork).Should(Equal(true)) - Expect(config.Spec.KappController.Deployment.PriorityClassName).Should(Equal("system-cluster-critical")) - Expect(config.Spec.KappController.Deployment.APIPort).Should(Equal(10100)) - Expect(config.Spec.KappController.Deployment.MetricsBindAddress).Should(Equal("0")) - Expect(config.Spec.KappController.Deployment.Tolerations).ShouldNot(BeNil()) - - secret := &v1.Secret{} - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: defaultString, - Name: util.GenerateDataValueSecretName(cluster.Name, constants.KappControllerAddonName), - } - err := k8sClient.Get(ctx, secretKey, secret) - if err != nil { - return false - } - return secret.Type == v1.SecretTypeOpaque - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // check data value secret contents - secretData := string(secret.Data["values.yaml"]) - Expect(strings.Contains(secretData, "createNamespace: true")).Should(BeTrue()) - Expect(strings.Contains(secretData, "globalNamespace: tanzu-package-repo-global")).Should(BeTrue()) - Expect(strings.Contains(secretData, "concurrency: 4")).Should(BeTrue()) - Expect(strings.Contains(secretData, "hostNetwork: true")).Should(BeTrue()) - Expect(strings.Contains(secretData, "coreDNSIP: 100.64.0.10")).Should(BeTrue()) - Expect(strings.Contains(secretData, "- key: CriticalAddonsOnly")).Should(BeTrue()) - Expect(strings.Contains(secretData, "node-role.kubernetes.io/control-plane: \"\"")).Should(BeTrue()) - Expect(strings.Contains(secretData, "key: node.kubernetes.io/not-ready")).Should(BeTrue()) - Expect(strings.Contains(secretData, "key: node.cloudprovider.kubernetes.io/uninitialized")).Should(BeTrue()) - Expect(strings.Contains(secretData, "apiPort: 10100")).Should(BeTrue()) - Expect(strings.Contains(secretData, "metricsBindAddress: \"0\"")).Should(BeTrue()) - Expect(strings.Contains(secretData, "key: node-role.kubernetes.io/control-plane")).Should(BeTrue()) - - Eventually(func() bool { - if !strings.Contains(secretData, ` caCerts: | - -----BEGIN CERTIFICATE----- - MIICxzCCAa+gAwIBAgIUMDCaC1Ve2J1cRsFLTV6ICfx5ug8wDQYJKoZIhvcNAQEL - BQAwEzERMA8GA1UEAwwIZTJlLXRlc3QwHhcNMjIxMTI5MTkyNjMzWhcNMjMxMTI5 - MTkyNjMzWjATMREwDwYDVQQDDAhlMmUtdGVzdDCCASIwDQYJKoZIhvcNAQEBBQAD - ggEPADCCAQoCggEBAMHQwDQuWqexl0G9VWjo/Ib5AkJdFioJmzmq7fTKBXkop3UL - cx6ZCkmH5Rn8C2iYCLzxnV7H2cR7MqwMzTqij5VXmovZsg/RmFSFPXHNL1yQWu6z - Hu05GWSMpfxb/YJfQS5q2ZRLOflUNKzr8o8F9x5Q9fVd0dRLAE+kauDEV85S6gSS - +YPb/lOs1O6hl8qLUo0bAmrl4vsQ1HaNusM0sUJSofV+dk0wxGDohjVKpd7MeGa9 - UEwBaxZ/OQqFPj3wYLP/qFmlll9c9aTmqRAgnL26qnJA5CPH/ULFLRwwhgi2lLaQ - Dcrn2H/M5qAfjxF/BwEke2tvn5au34DHNBasF+8CAwEAAaMTMBEwDwYDVR0RBAgw - BocEClwqCDANBgkqhkiG9w0BAQsFAAOCAQEACOJyU7BB1iXsObamAw+xNPUpsD8R - HxXvu4NCraY/hY+K3+W99H054UUWzzkMWqNqVr3UpcMsbt3C1lVoKjYhwZU0j7uu - bpb6d8obitMV7/rR93kR18wSRChTTzy9HpT/ckEvZTrAAUP8P+GBeJAcIwxglgaZ - SckCcLbBlRTlbNqQ78upb7362zWsXw4N1iKA6FfGWJghbhAw7hyKwRu1cvdVOJGz - SymehdaRUUB2VX96jW5Q9MYyinp7FiB75REtN6NaSV9nNgehBOS8oDXtt7gF3jCB - 6Mruumj7zk33iCzCA8q0ukX/FK9N8N+6Amfx6fk1NBRUDHHrlAnx1NqlNw== - -----END CERTIFICATE-----`) || - !strings.Contains(secretData, "httpsProxy: bar.com") || - !strings.Contains(secretData, "noProxy: foobar.com") || - !strings.Contains(secretData, "dangerousSkipTLSVerify: registry1,registry2") { - return false - } - - // user input should override cluster-wide config - if !strings.Contains(secretData, "httpProxy: overwrite.foo.com") { - return false - } - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Eventually(func() bool { - // Check status.secretRef after reconciliation - config := &runv1alpha3.KappControllerConfig{} - err := k8sClient.Get(ctx, configKey, config) - if err != nil { - return false - } - return config.Status.SecretRef == util.GenerateDataValueSecretName(cluster.Name, constants.KappControllerAddonName) - }, waitTimeout, pollingInterval).Should(BeTrue()) - - }) - - }) - - Context("Reconcile KappControllerConfig used as template", func() { - - BeforeEach(func() { - clusterName = testKappController1 - kappConfigCRName = util.GeneratePackageSecretName(clusterName, constants.KappControllerDefaultRefName) - clusterResourceFilePath = "testdata/test-kapp-controller-template-config-1.yaml" - }) - - It("Should skip the reconciliation", func() { - - configKey := client.ObjectKey{ - Namespace: addonNamespace, - Name: kappConfigCRName, - } - config := &runv1alpha3.KappControllerConfig{} - Expect(k8sClient.Get(ctx, configKey, config)).To(Succeed()) - - By("OwnerReferences is not set") - Expect(len(config.OwnerReferences)).Should(Equal(0)) - }) - }) -}) diff --git a/addons/controllers/kubevipcpi/kubevipcpiconfig_controller.go b/addons/controllers/kubevipcpi/kubevipcpiconfig_controller.go deleted file mode 100644 index 1b9198a1f9..0000000000 --- a/addons/controllers/kubevipcpi/kubevipcpiconfig_controller.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package controllers implements k8s controller functionality for kube-vip-cloud-provider config. -package controllers - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/source" - - cutil "github.com/vmware-tanzu/tanzu-framework/addons/controllers/utils" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - kvcpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" -) - -// KubevipCPIConfigReconciler reconciles a KubevipCPIConfig object -type KubevipCPIConfigReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Config addonconfig.KubevipCPIConfigControllerConfig -} - -//+kubebuilder:rbac:groups=cpi.tanzu.vmware.com,resources=KubevipCPIConfigs,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=cpi.tanzu.vmware.com,resources=KubevipCPIConfigs/status,verbs=get;update;patch - -// Reconcile the KubevipCPIConfig CRD -func (r *KubevipCPIConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - logger := r.Log.WithValues("KubevipCPIConfig", req.NamespacedName) - - logger.Info("Start reconciliation for KubevipCPIConfig") - - // fetch KubevipCPIConfig resource - kvcpConfig := &kvcpiv1alpha1.KubevipCPIConfig{} - if err := r.Client.Get(ctx, req.NamespacedName, kvcpConfig); err != nil { - if apierrors.IsNotFound(err) { - logger.Info("KubevipCPIConfig resource not found") - return ctrl.Result{}, nil - } - logger.Error(err, "Unable to fetch KubevipCPIConfig resource") - return ctrl.Result{}, err - } - - // deep copy KubevipCPIConfig to avoid issues if in the future other controllers where interacting with the same copy - kvcpConfig = kvcpConfig.DeepCopy() - - cluster, err := cutil.GetOwnerCluster(ctx, r.Client, kvcpConfig, req.Namespace, constants.CPIDefaultRefName) - if err != nil { - if apierrors.IsNotFound(err) && cluster != nil { - logger.Info(fmt.Sprintf("'%s/%s' is listed as owner reference but could not be found", - cluster.Namespace, cluster.Name)) - return ctrl.Result{}, nil - } - logger.Error(err, "could not determine owner cluster") - return ctrl.Result{}, err - } - - if res, err := r.reconcileKubevipCPIConfig(ctx, kvcpConfig, cluster); err != nil { - logger.Error(err, "Failed to reconcile KubevipCPIConfig") - return res, err - } - return ctrl.Result{}, nil -} - -// reconcileKubevipCPIConfig reconciles KubevipCPIConfig with its owner cluster -func (r *KubevipCPIConfigReconciler) reconcileKubevipCPIConfig(ctx context.Context, kvcpConfig *kvcpiv1alpha1.KubevipCPIConfig, cluster *clusterapiv1beta1.Cluster) (_ ctrl.Result, retErr error) { - patchHelper, err := clusterapipatchutil.NewHelper(kvcpConfig, r.Client) - if err != nil { - return ctrl.Result{}, err - } - // patch KubevipCPIConfig before returning the function - defer func() { - r.Log.Info("Patching KubevipCPIConfig") - if err := patchHelper.Patch(ctx, kvcpConfig); err != nil { - r.Log.Error(err, "Error patching KubevipCPIConfig") - retErr = err - } - r.Log.Info("Successfully patched KubevipCPIConfig") - }() - - if !kvcpConfig.GetDeletionTimestamp().IsZero() { - return ctrl.Result{}, nil - } - if err = r.reconcileKubevipCPIConfigNormal(ctx, kvcpConfig, cluster); err != nil { - r.Log.Error(err, "Error reconciling KubevipCPIConfig to create/patch data values secret") - return ctrl.Result{}, err - } - r.Log.Info("Successfully reconciled KubevipCPIConfig") - return ctrl.Result{}, nil -} - -// reconcileKubevipCPIConfigNormal triggers when a KubevipCPIConfig is not being deleted -// it ensures the owner reference of the KubevipCPIConfig and generates the data values secret for Kubevip CloudProvider -func (r *KubevipCPIConfigReconciler) reconcileKubevipCPIConfigNormal(ctx context.Context, - kvcpConfig *kvcpiv1alpha1.KubevipCPIConfig, cluster *clusterapiv1beta1.Cluster) (retErr error) { - // add owner reference to KubevipCPIConfig if not already added by TanzuClusterBootstrap Controller - ownerReference := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - r.Log.Info("Ensure KubevipCPIConfig has the cluster as owner reference") - if !clusterapiutil.HasOwnerRef(kvcpConfig.OwnerReferences, ownerReference) { - r.Log.Info("Adding owner reference to KubevipCPIConfig") - kvcpConfig.OwnerReferences = clusterapiutil.EnsureOwnerRef(kvcpConfig.OwnerReferences, ownerReference) - } - secret := &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateDataValueSecretName(cluster.Name, constants.KubevipCloudProviderAddonName), - Namespace: kvcpConfig.Namespace, - }, - Type: v1.SecretTypeOpaque, - } - secret.SetOwnerReferences([]metav1.OwnerReference{ownerReference}) - - mutateFn := func() error { - secret.StringData = make(map[string]string) - kvcpConfigSpec, err := r.mapKubevipCPIConfigToDataValues(ctx, kvcpConfig, cluster) - if err != nil { - r.Log.Error(err, "Error while mapping KubevipCPIConfig to data values") - return err - } - yamlBytes, err := kvcpConfigSpec.Serialize() - if err != nil { - r.Log.Error(err, "Error marshaling KubevipCPIConfig to Yaml") - return err - } - secret.StringData[constants.TKGDataValueFileName] = string(yamlBytes) - r.Log.Info("Mutated KubevipCPIConfig data values") - return nil - } - result, err := controllerutil.CreateOrPatch(ctx, r.Client, secret, mutateFn) - if err != nil { - r.Log.Error(err, "Error creating or patching KubevipCPIConfig data values secret") - return err - } - - r.Log.Info(fmt.Sprintf("Resource '%s' data values secret '%s'", constants.KubevipCloudProviderAddonName, result)) - // update the secret reference in KubevipCPIConfig status - kvcpConfig.Status.SecretRef = &secret.Name - return nil -} - -// SetupWithManager sets up the controller with the Manager. -func (r *KubevipCPIConfigReconciler) SetupWithManager(_ context.Context, mgr ctrl.Manager, options controller.Options) error { - return ctrl.NewControllerManagedBy(mgr). - For(&kvcpiv1alpha1.KubevipCPIConfig{}). - WithOptions(options). - WithEventFilter(predicates.ConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, constants.KubevipCPIConfigKind, r.Config.SystemNamespace, r.Log)). - Watches( - &source.Kind{Type: &clusterapiv1beta1.Cluster{}}, - handler.EnqueueRequestsFromMapFunc(r.ClusterToKubevipCPIConfig), - ). - Complete(r) -} diff --git a/addons/controllers/kubevipcpi/kubevipcpiconfig_datavalues.go b/addons/controllers/kubevipcpi/kubevipcpiconfig_datavalues.go deleted file mode 100644 index 924336b966..0000000000 --- a/addons/controllers/kubevipcpi/kubevipcpiconfig_datavalues.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "gopkg.in/yaml.v3" -) - -type KubevipCPIDataValues struct { - LoadbalancerCIDRs *string `yaml:"loadbalancerCIDRs,omitempty"` - LoadbalancerIPRanges *string `yaml:"loadbalancerIPRanges,omitempty"` -} - -func (v *KubevipCPIDataValues) Serialize() ([]byte, error) { - dataValues := struct { - DataValues KubevipCPIDataValues `yaml:"kubevipCloudProvider"` - }{DataValues: *v} - return yaml.Marshal(dataValues) -} diff --git a/addons/controllers/kubevipcpi/kubevipcpiconfig_utils.go b/addons/controllers/kubevipcpi/kubevipcpiconfig_utils.go deleted file mode 100644 index 8a48e6e253..0000000000 --- a/addons/controllers/kubevipcpi/kubevipcpiconfig_utils.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - - "github.com/pkg/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - kvcpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" -) - -// ClusterToKubevipCPIConfig returns a list of Requests with KubevipCPIConfig ObjectKey based on Cluster events -func (r *KubevipCPIConfigReconciler) ClusterToKubevipCPIConfig(o client.Object) []ctrl.Request { - cluster, ok := o.(*clusterapiv1beta1.Cluster) - if !ok { - r.Log.Error(errors.New("invalid type"), - "Expected to receive Cluster resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - r.Log.V(4).Info("Mapping Cluster to KubevipCPIConfig") - - cs := &kvcpiv1alpha1.KubevipCPIConfigList{} - _ = r.List(context.Background(), cs) - - requests := []ctrl.Request{} - for i := 0; i < len(cs.Items); i++ { - config := &cs.Items[i] - if config.Namespace == cluster.Namespace { - // avoid enqueuing reconcile requests for template KubevipCPIConfig CRs in event handler of Cluster CR - if _, ok := config.Annotations[constants.TKGAnnotationTemplateConfig]; ok && config.Namespace == r.Config.SystemNamespace { - continue - } - - // corresponding KubevipCPIConfig should have following ownerRef - ownerReference := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: constants.ClusterKind, - Name: cluster.Name, - UID: cluster.UID, - } - if clusterapiutil.HasOwnerRef(config.OwnerReferences, ownerReference) { - r.Log.V(4).Info("Adding KubevipCPIConfig for reconciliation", - constants.NamespaceLogKey, config.Namespace, constants.NameLogKey, config.Name) - - requests = append(requests, ctrl.Request{ - NamespacedName: clusterapiutil.ObjectKey(config), - }) - } - } - } - - return requests -} - -// mapKubevipCPIConfigToDataValues generates CPI data values for non-paravirtual modes -func (r *KubevipCPIConfigReconciler) mapKubevipCPIConfigToDataValues( // nolint - ctx context.Context, - kubevipCPIConfig *kvcpiv1alpha1.KubevipCPIConfig, cluster *clusterapiv1beta1.Cluster) (KubevipCPIDataValues, error, -) { // nolint:whitespace - // allow API user to override the derived values if he/she specified fields in the KubevipCPIConfig - dataValue := &KubevipCPIDataValues{} - config := kubevipCPIConfig.Spec - dataValue.LoadbalancerCIDRs = config.LoadbalancerCIDRs - dataValue.LoadbalancerIPRanges = config.LoadbalancerIPRanges - - return *dataValue, nil -} diff --git a/addons/controllers/kubevipcpiconfig_controller_test.go b/addons/controllers/kubevipcpiconfig_controller_test.go deleted file mode 100644 index 4febb2ff05..0000000000 --- a/addons/controllers/kubevipcpiconfig_controller_test.go +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "fmt" - "os" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - kvcpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" -) - -var _ = Describe("KubevipCPIConfig Reconciler", func() { - var ( - key client.ObjectKey - clusterName string - clusterNamespace string - clusterResourceFilePath string - ) - - JustBeforeEach(func() { - By("Creating cluster and KubevipCPIConfig resources") - key = client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - }) - - AfterEach(func() { - By("Deleting cluster and KubevipCPIConfig resources") - for _, filePath := range []string{clusterResourceFilePath} { - f, err := os.Open(filePath) - Expect(err).ToNot(HaveOccurred()) - if err = testutil.DeleteResources(f, cfg, dynamicClient, true); !apierrors.IsNotFound(err) { - // namespace has been explicitly deleted using testutil.DeleteNamespace - // ignore its NotFound error here - Expect(err).ToNot(HaveOccurred()) - } - Expect(f.Close()).ToNot(HaveOccurred()) - } - }) - - Context("reconcile KubevipCPIConfig manifests", func() { - BeforeEach(func() { - clusterName = "test-cluster-kvcp" - clusterNamespace = "default" - clusterResourceFilePath = "testdata/test-kubevip-cloudprovider-config.yaml" - }) - - It("Should reconcile KubevipCPIConfig and create data values secret for KubevipCPIConfig on management cluster", func() { - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, cluster); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // the kvcp config object should be deployed - config := &kvcpiv1alpha1.KubevipCPIConfig{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, config); err != nil { - return false - } - - if len(config.OwnerReferences) > 0 { - return false - } - - Expect(len(config.OwnerReferences)).Should(Equal(0)) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("patching kubevip cloudprovider with ownerRef as ClusterBootstrapController would do") - // patch the KubevipCPIConfig with ownerRef - patchedKubevipCPIConfig := config.DeepCopy() - ownerRef := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - - ownerRef.Kind = "Cluster" - patchedKubevipCPIConfig.OwnerReferences = clusterapiutil.EnsureOwnerRef(patchedKubevipCPIConfig.OwnerReferences, ownerRef) - Expect(k8sClient.Patch(ctx, patchedKubevipCPIConfig, client.MergeFrom(config))).ShouldNot(HaveOccurred()) - - // the data values secret should be generated - secret := &v1.Secret{} - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.KubevipCloudProviderAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return false - } - secretData := string(secret.Data["values.yaml"]) - Expect(len(secretData)).ShouldNot(BeZero()) - Expect(strings.Contains(secretData, "kubevipCloudProvider:")).Should(BeTrue()) - Expect(strings.Contains(secretData, "loadbalancerCIDRs: 10.0.0.1/24")).Should(BeTrue()) - Expect(strings.Contains(secretData, "loadbalancerIPRanges: 10.0.0.1-10.0.0.2")).Should(BeTrue()) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // eventually the secret ref to the data values should be updated - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, config); err != nil { - return false - } - Expect(config.Status.SecretRef).To(Equal(fmt.Sprintf("%s-%s-data-values", clusterName, constants.KubevipCloudProviderAddonName))) - return true - }) - }) - }) - - Context("reconcile KubevipCPIConfig manifests when there is only single input", func() { - BeforeEach(func() { - clusterName = "test-cluster-kvcp-2" - clusterNamespace = "default" - clusterResourceFilePath = "testdata/test-kubevip-cloudprovider-config-2.yaml" - }) - - It("Should reconcile KubevipCPIConfig and create data values secret for KubevipCPIConfig on management cluster, the secret should only has single value", func() { - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, cluster); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // the kvcp config object should be deployed - config := &kvcpiv1alpha1.KubevipCPIConfig{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, config); err != nil { - return false - } - - if len(config.OwnerReferences) > 0 { - return false - } - - Expect(len(config.OwnerReferences)).Should(Equal(0)) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("patching kubevip cloudprovider with ownerRef as ClusterBootstrapController would do") - // patch the KubevipCPIConfig with ownerRef - patchedKubevipCPIConfig := config.DeepCopy() - ownerRef := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - - ownerRef.Kind = "Cluster" - patchedKubevipCPIConfig.OwnerReferences = clusterapiutil.EnsureOwnerRef(patchedKubevipCPIConfig.OwnerReferences, ownerRef) - Expect(k8sClient.Patch(ctx, patchedKubevipCPIConfig, client.MergeFrom(config))).ShouldNot(HaveOccurred()) - - // the data values secret should be generated - secret := &v1.Secret{} - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.KubevipCloudProviderAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return false - } - secretData := string(secret.Data["values.yaml"]) - Expect(len(secretData)).ShouldNot(BeZero()) - Expect(strings.Contains(secretData, "kubevipCloudProvider:")).Should(BeTrue()) - Expect(strings.Contains(secretData, "loadbalancerCIDRs: 10.0.0.1/24")).Should(BeTrue()) - Expect(strings.Contains(secretData, "loadbalancerIPRanges")).ShouldNot((BeTrue())) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // eventually the secret ref to the data values should be updated - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, config); err != nil { - return false - } - Expect(config.Status.SecretRef).To(Equal(fmt.Sprintf("%s-%s-data-values", clusterName, constants.KubevipCloudProviderAddonName))) - return true - }) - }) - }) -}) diff --git a/addons/controllers/machine_controller.go b/addons/controllers/machine_controller.go deleted file mode 100644 index ab4f830ac6..0000000000 --- a/addons/controllers/machine_controller.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - "time" - - "github.com/go-logr/logr" - "github.com/pkg/errors" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util" - "sigs.k8s.io/cluster-api/util/annotations" - "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" - - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -type MachineReconciler struct { - Client client.Client - Log logr.Logger - Scheme *runtime.Scheme - controller controller.Controller - ctx context.Context -} - -const PreTerminateAddonsAnnotationPrefix = clusterapiv1beta1.PreTerminateDeleteHookAnnotationPrefix + "/tkg.tanzu.vmware.com" -const PreTerminateAddonsAnnotationValue = "tkg.tanzu.vmware.com/addons" -const requestRequeTime = time.Second * 5 - -// SetupWithManager adds this reconciler to a new controller then to the -// provided manager. Main object to watch/manage is the clusterapiv1beta1.Machine, but it also -// watches clusterbootstraps, and splits the clusterboostrap request into a request -// for each of the machines that are part of the cluster that owns the clusterboostrap. -func (r *MachineReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { - machineController, err := ctrl.NewControllerManagedBy(mgr). - // We need to watch for clusterboostrap - For(&clusterapiv1beta1.Machine{}). - Watches( - &source.Kind{Type: &runtanzuv1alpha3.ClusterBootstrap{}}, - handler.EnqueueRequestsFromMapFunc(r.MachinesFromClusterBoostrap), - ). - WithOptions(options). - Build(r) - if err != nil { - r.Log.Error(err, "error creating a machine controller") - return err - } - r.controller = machineController - r.ctx = ctx - return nil -} - -func (r *MachineReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ ctrl.Result, reterr error) { - log := r.Log.WithValues("machine", req.NamespacedName) - // Get machine for request - machine := &clusterapiv1beta1.Machine{} - if err := r.Client.Get(ctx, req.NamespacedName, machine); err != nil { - if apierrors.IsNotFound(err) { - return reconcile.Result{}, nil - } - return reconcile.Result{}, err - } - // Always Patch when exiting this function so changes to the resource are updated on the API server. - patchHelper, err := patch.NewHelper(machine, r.Client) - if err != nil { - return reconcile.Result{}, errors.Wrapf(err, "failed to init patch helper for %s %s", - machine.GroupVersionKind(), req.NamespacedName) - } - defer func() { - if err := patchHelper.Patch(ctx, machine); err != nil { - if reterr == nil { - reterr = err - } - log.Error(err, "patch failed") - } - }() - // Get the cluster to which the current machine belongs - cluster, err := util.GetClusterByName(ctx, r.Client, machine.ObjectMeta.Namespace, machine.Spec.ClusterName) - if err != nil { - return ctrl.Result{}, err - } - - // case when machine is being deleted but cluster is not - if !machine.GetDeletionTimestamp().IsZero() && cluster.GetDeletionTimestamp().IsZero() { - delete(machine.Annotations, PreTerminateAddonsAnnotationPrefix) - return ctrl.Result{}, nil - } - - // case when cluster is being deleted - if !cluster.GetDeletionTimestamp().IsZero() { - return r.reconcileClusterDeletion(machine, cluster, log), nil - } - - // case when machine is being created/updated - return r.reconcileNormal(machine, cluster, log), nil -} - -func (r *MachineReconciler) reconcileNormal(machine *clusterapiv1beta1.Machine, - cluster *clusterapiv1beta1.Cluster, log logr.Logger) ctrl.Result { - - if controllerutil.ContainsFinalizer(cluster, addontypes.AddonFinalizer) { - if !annotations.HasWithPrefix(PreTerminateAddonsAnnotationPrefix, machine.ObjectMeta.Annotations) { - if machine.Annotations == nil { - machine.Annotations = make(map[string]string) - } - log.Info(fmt.Sprintf("adding %s", PreTerminateAddonsAnnotationPrefix)) - machine.Annotations[PreTerminateAddonsAnnotationPrefix] = PreTerminateAddonsAnnotationValue - } - } else { - if annotations.HasWithPrefix(PreTerminateAddonsAnnotationPrefix, machine.ObjectMeta.Annotations) { - log.Info(fmt.Sprintf("removing %s", PreTerminateAddonsAnnotationPrefix)) - delete(machine.Annotations, PreTerminateAddonsAnnotationPrefix) - } - } - return ctrl.Result{} -} - -func (r *MachineReconciler) reconcileClusterDeletion(machine *clusterapiv1beta1.Machine, cluster *clusterapiv1beta1.Cluster, log logr.Logger) ctrl.Result { - if controllerutil.ContainsFinalizer(cluster, addontypes.AddonFinalizer) { - return ctrl.Result{RequeueAfter: requestRequeTime} - } - if annotations.HasWithPrefix(PreTerminateAddonsAnnotationPrefix, machine.ObjectMeta.Annotations) { - delete(machine.Annotations, PreTerminateAddonsAnnotationPrefix) - log.Info(fmt.Sprintf("removing %s", PreTerminateAddonsAnnotationPrefix)) - } - return ctrl.Result{} -} - -func (r *MachineReconciler) MachinesFromClusterBoostrap(o client.Object) []ctrl.Request { - clusterBootstrap, ok := o.(*runtanzuv1alpha3.ClusterBootstrap) - if !ok { - r.Log.Error(errors.New("invalid type"), - "Expected to receive ClusterBootstrap resource", - "actualType", fmt.Sprintf("%T", o)) - return nil - } - - // take advantage that cluster.Name = clusterBoostrap.Name to get list of machines - var machines clusterapiv1beta1.MachineList - listOptions := []client.ListOption{ - client.InNamespace(clusterBootstrap.Namespace), - client.MatchingLabels(map[string]string{clusterapiv1beta1.ClusterLabelName: clusterBootstrap.Name}), - } - if err := r.Client.List(r.ctx, &machines, listOptions...); err != nil { - return []reconcile.Request{} - } - - // Create a reconcile request for each machine resource. - - var requests []ctrl.Request - for i := range machines.Items { - requests = append(requests, ctrl.Request{ - NamespacedName: types.NamespacedName{ - Namespace: machines.Items[i].Namespace, - Name: machines.Items[i].Name, - }, - }) - } - // Return list of reconcile requests for the Machine resources. - return requests -} diff --git a/addons/controllers/machine_controller_test.go b/addons/controllers/machine_controller_test.go deleted file mode 100644 index be483ed960..0000000000 --- a/addons/controllers/machine_controller_test.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2020 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "os" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/secret" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - kapppkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -var _ = Describe("Machine Reconciler", func() { - var ( - clusterName string - clusterNamespace string - ) - - JustBeforeEach(func() { - // create cluster resources - By("Creating a cluster with machine") - - m, err := os.Open("testdata/test-machine-namespace-ns-resources.yaml") - Expect(err).ToNot(HaveOccurred()) - defer m.Close() - Expect(testutil.CreateResources(m, cfg, dynamicClient)).To(Succeed()) - - By("Creating kubeconfig for cluster") - Expect(testutil.CreateKubeconfigSecret(cfg, clusterName, clusterNamespace, k8sClient)).To(Succeed()) - - }) - - AfterEach(func() { - By("Deleting kubeconfig for cluster") - key := client.ObjectKey{ - Namespace: clusterNamespace, - Name: secret.Name(clusterName, secret.Kubeconfig), - } - s := &corev1.Secret{} - Expect(k8sClient.Get(ctx, key, s)).To(Succeed()) - Expect(k8sClient.Delete(ctx, s)).To(Succeed()) - }) - - BeforeEach(func() { - clusterName = "machine-cluster" - clusterNamespace = "machine-namespace" - - }) - - When("Clusterbootsrap is created", func() { - It("cluster machines should be annotated", func() { - - cluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespace, Name: clusterName}, cluster)).To(Succeed()) - copiedCluster := cluster.DeepCopy() - copiedCluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - Expect(k8sClient.Status().Update(ctx, copiedCluster)).To(Succeed()) - - By("check clusterboostrap has been marked with finalizer") - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - return controllerutil.ContainsFinalizer(clusterBootstrap, addontypes.AddonFinalizer) - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("cluster machines should be marked with non-delete hook") - time.Sleep(time.Second * 5) - machine1Key := client.ObjectKey{ - Namespace: cluster.Namespace, - Name: "machine-1", - } - machine := &clusterapiv1beta1.Machine{} - Eventually(func() bool { - err := k8sClient.Get(ctx, machine1Key, machine) - if err != nil { - return true - } - _, found := machine.Annotations[PreTerminateAddonsAnnotationPrefix] - return found - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("machines added to cluster after bootstrap creation should be marked with non-delete hook") - machine2 := &clusterapiv1beta1.Machine{ - TypeMeta: metav1.TypeMeta{ - Kind: "Machine", - APIVersion: "cluster.x-k8s.io/v1alpha3", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "machine-2", - Namespace: clusterNamespace, - }, - Spec: clusterapiv1beta1.MachineSpec{ - ClusterName: clusterName, - Bootstrap: clusterapiv1beta1.Bootstrap{ - ConfigRef: &corev1.ObjectReference{ - Name: "test-controlplane-0", - APIVersion: "bootstrap.cluster.x-k8s.io/v1alpha3", - }, - }, - InfrastructureRef: corev1.ObjectReference{ - Name: "test-controlplane-0", - APIVersion: "infrastructure.cluster.x-k8s.io/v1alpha3", - }, - }, - Status: clusterapiv1beta1.MachineStatus{}, - } - Expect(k8sClient.Create(ctx, machine2)).To(Succeed()) - time.Sleep(time.Second * 10) //Change to eventually - machine2Key := client.ObjectKeyFromObject(machine2) - Expect(k8sClient.Get(ctx, machine2Key, machine)).To(Succeed()) - Expect(machine.Annotations).Should(HaveKey(PreTerminateAddonsAnnotationPrefix)) - - By("should be possible to delete machines directly") - Expect(k8sClient.Delete(ctx, machine)).To(Succeed()) - Expect(apierrors.IsNotFound(k8sClient.Get(ctx, machine2Key, machine))).To(BeTrue()) - - By("When cluster boostrap is deleted, the pretermination hook should not be removed if bootstrap has finalizer") - clusterBootstrapKey := client.ObjectKeyFromObject(clusterBootstrap) - Expect(k8sClient.Get(ctx, machine1Key, machine)).To(Succeed()) - Expect(machine.Annotations).Should(HaveKey(PreTerminateAddonsAnnotationPrefix)) - Expect(k8sClient.Delete(ctx, clusterBootstrap)).To(Succeed()) - Expect(k8sClient.Get(ctx, clusterBootstrapKey, clusterBootstrap)).To(Succeed()) - Expect(controllerutil.ContainsFinalizer(clusterBootstrap, addontypes.AddonFinalizer)).To(BeTrue()) - Expect(clusterBootstrap.DeletionTimestamp.IsZero()).To(BeFalse()) - Expect(k8sClient.Get(ctx, machine1Key, machine)).To(Succeed()) - Expect(machine.Annotations).Should(HaveKey(PreTerminateAddonsAnnotationPrefix)) - - By("Additionalpackage installs should exist for each additional package in the clusterBoostrap") - pkgInstallsList := &kapppkgiv1alpha1.PackageInstallList{} - err := k8sClient.List(ctx, pkgInstallsList) - Expect(err).ToNot(HaveOccurred()) - Expect(hasPackageInstalls(ctx, k8sClient, cluster, addonNamespace, - clusterBootstrap.Spec.AdditionalPackages, clusterBootstrap.Annotations, setupLog)).To(BeTrue()) - - By("Cluster deletion with foreground propagation policy") - deletePropagation := metav1.DeletePropagationForeground - deleteOptions := client.DeleteOptions{PropagationPolicy: &deletePropagation} - Expect(k8sClient.Delete(ctx, cluster, &deleteOptions)).To(Succeed()) - - By("Results on additionalPackageInstalls being removed.") - Expect(hasPackageInstalls(ctx, k8sClient, cluster, addonNamespace, - clusterBootstrap.Spec.AdditionalPackages, clusterBootstrap.Annotations, setupLog)).To(BeTrue()) - Expect(err).ToNot(HaveOccurred()) - Eventually(func() bool { - return hasPackageInstalls(ctx, k8sClient, cluster, addonNamespace, - clusterBootstrap.Spec.AdditionalPackages, clusterBootstrap.Annotations, setupLog) - }, waitTimeout, pollingInterval).Should(BeFalse()) - Eventually(func() bool { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), clusterBootstrap) - if err != nil { - return false - } - return controllerutil.ContainsFinalizer(clusterBootstrap, addontypes.AddonFinalizer) - }, waitTimeout, pollingInterval).Should(BeFalse()) - - By("Machine pretermination annotations are removed") - - Eventually(func() bool { - err := k8sClient.Get(ctx, machine1Key, machine) - if err != nil { - return true - } - _, found := machine.Annotations[PreTerminateAddonsAnnotationPrefix] - return found - }, waitTimeout, pollingInterval).Should(BeFalse()) - - }) - }) -}) diff --git a/addons/controllers/oraclecpiconfig_controller_test.go b/addons/controllers/oraclecpiconfig_controller_test.go deleted file mode 100644 index f8ce4f39ef..0000000000 --- a/addons/controllers/oraclecpiconfig_controller_test.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "fmt" - "os" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - cpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" -) - -var _ = Describe("OracleCPIConfig Reconciler", func() { - var ( - key client.ObjectKey - clusterName string - clusterNamespace string - clusterResourceFilePath string - ) - - JustBeforeEach(func() { - By("Creating cluster and OracleCPIConfig resources") - key = client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - }) - - AfterEach(func() { - By("Deleting cluster and OracleCPIConfig resources") - for _, filePath := range []string{clusterResourceFilePath} { - f, err := os.Open(filePath) - Expect(err).ToNot(HaveOccurred()) - if err = testutil.DeleteResources(f, cfg, dynamicClient, true); !apierrors.IsNotFound(err) { - // namespace has been explicitly deleted using testutil.DeleteNamespace - // ignore its NotFound error here - Expect(err).ToNot(HaveOccurred()) - } - Expect(f.Close()).ToNot(HaveOccurred()) - } - }) - - Context("reconcile OracleCPIConfig manifests", func() { - - capociNamespace := "cluster-api-provider-oci-system" - - BeforeEach(func() { - clusterName = "test-cluster-cpi" - clusterNamespace = "default" - clusterResourceFilePath = "testdata/test-oracle-cpi.yaml" - }) - - JustAfterEach(func() { - Expect(testutil.DeleteNamespace(ctx, clientSet, capociNamespace)).To(Succeed()) - }) - - It("Should reconcile OracleCPIConfig and create data values secret", func() { - - // the cpi config object should be deployed - config := &cpiv1alpha1.OracleCPIConfig{} - Eventually(func() error { - return k8sClient.Get(ctx, key, config) - }).Should(Succeed()) - - // the data values secret should be generated - secret := &v1.Secret{} - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.OracleCPIAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return false - } - secretData := string(secret.Data["values.yaml"]) - fmt.Println(secretData) // debug dump - - Expect(len(secretData)).Should(Not(BeZero())) - Expect(strings.Contains(secretData, "compartment: test-compartment")).Should(BeTrue()) - - // expect the authentication credentials to be read - Expect(strings.Contains(secretData, "region: us-sanjose-1")).Should(BeTrue()) - Expect(strings.Contains(secretData, "tenancy: ocid1.tenancy.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")).Should(BeTrue()) - Expect(strings.Contains(secretData, "user: ocid1.user.oc1..aaaaaaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")).Should(BeTrue()) - Expect(strings.Contains(secretData, "key: |\n")).Should(BeTrue()) - Expect(strings.Contains(secretData, "-----BEGIN PRIVATE KEY-----")).Should(BeTrue()) - Expect(strings.Contains(secretData, "fingerprint: eb:02")).Should(BeTrue()) - Expect(strings.Contains(secretData, "passphrase:")).Should(BeTrue()) - - return true - }).Should(BeTrue()) - - // eventually the secret ref to the data values should be updated - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, config); err != nil { - return false - } - Expect(config.Status.SecretRef).To(Equal(fmt.Sprintf("%s-%s-data-values", clusterName, constants.CPIAddonName))) - return true - }) - }) - - }) - -}) diff --git a/addons/controllers/package_reconciler.go b/addons/controllers/package_reconciler.go deleted file mode 100644 index a2562c4477..0000000000 --- a/addons/controllers/package_reconciler.go +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - pkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - versions "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/versions/v1alpha1" - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" -) - -// PackageReconciler reconcile kapp Package related CRs -type PackageReconciler struct { - ctx context.Context - log logr.Logger - clusterClient client.Client - Config addonconfig.AddonControllerConfig -} - -// reconcileCorePackageRepository reconciles the core package repository in the cluster -func (r *PackageReconciler) reconcileCorePackageRepository( - imageRepository string, - bom *tkrv1.Bom) error { - - repositoryImage, err := util.GetCorePackageRepositoryImageFromBom(bom) - if err != nil { - r.log.Error(err, "Core package repository image not found") - return err - } - - // build the core PackageRepository CR - corePackageRepository := &pkgiv1alpha1.PackageRepository{ - ObjectMeta: metav1.ObjectMeta{ - Name: r.Config.CorePackageRepoName, - Namespace: r.Config.AddonNamespace, - }, - } - - // apply the core PackageRepository CR - packageRepositorytMutateFn := func() error { - corePackageRepository.Spec = pkgiv1alpha1.PackageRepositorySpec{ - Fetch: &pkgiv1alpha1.PackageRepositoryFetch{ - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{ - Image: fmt.Sprintf("%s/%s:%s", imageRepository, repositoryImage.ImagePath, repositoryImage.Tag), - }, - }, - } - - return nil - } - - result, err := controllerutil.CreateOrPatch(r.ctx, r.clusterClient, corePackageRepository, packageRepositorytMutateFn) - if err != nil { - r.log.Error(err, "Error creating or patching core package repository") - return err - } - logOperationResult(r.log, "core package repository", result) - - return nil -} - -// ReconcileAddonKappResourceNormal reconciles and creates packageinstall CR -func (r *PackageReconciler) ReconcileAddonKappResourceNormal( // nolint:funlen - remoteApp bool, - remoteCluster *clusterapiv1beta1.Cluster, - addonSecret *corev1.Secret, - addonConfig *tkrv1.Addon, - imageRepository string, - bom *tkrv1.Bom) error { - - addonName := util.GetAddonNameFromAddonSecret(addonSecret) - - /* - * remoteApp means App CR on the management cluster that kapp-controller uses to remotely manages set of objects deployed in a workload cluster. - * workload clusters kubeconfig details need to be added for remote App so that kapp-controller on management - * cluster can reconcile and push the addon/app to the workload cluster - */ - if remoteApp { - // TODO: Switch to remote PackageInstall when this feature is available in packaging api - - app := &kappctrl.App{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateAppNameFromAddonSecret(addonSecret), - Namespace: util.GenerateAppNamespaceFromAddonSecret(addonSecret, r.Config.AddonNamespace), - }, - } - - appMutateFn := func() error { - if app.ObjectMeta.Annotations == nil { - app.ObjectMeta.Annotations = make(map[string]string) - } - - app.ObjectMeta.Annotations[addontypes.AddonTypeAnnotation] = fmt.Sprintf("%s/%s", addonConfig.Category, addonName) - app.ObjectMeta.Annotations[addontypes.AddonNameAnnotation] = addonSecret.Name - app.ObjectMeta.Annotations[addontypes.AddonNamespaceAnnotation] = addonSecret.Namespace - - clusterKubeconfigDetails := util.GetClusterKubeconfigSecretDetails(remoteCluster) - - app.Spec.Cluster = &kappctrl.AppCluster{ - KubeconfigSecretRef: &kappctrl.AppClusterKubeconfigSecretRef{ - Name: clusterKubeconfigDetails.Name, - Key: clusterKubeconfigDetails.Key, - }, - } - - app.Spec.SyncPeriod = &metav1.Duration{Duration: r.Config.AppSyncPeriod} - - templateImageURL, err := util.GetTemplateImageURLFromBom(addonConfig, imageRepository, bom) - if err != nil { - r.log.Error(err, "Error getting addon template image") - return err - } - r.log.Info("Addon template image found", constants.ImageURLLogKey, templateImageURL) - - // Use ImgpkgBundle in App CR - app.Spec.Fetch = []kappctrl.AppFetch{ - { - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{ - Image: templateImageURL, - }, - }, - } - - app.Spec.Template = []kappctrl.AppTemplate{ - { - Ytt: &kappctrl.AppTemplateYtt{ - IgnoreUnknownComments: true, - Strict: false, - Paths: []string{"config"}, - Inline: &kappctrl.AppFetchInline{ - PathsFrom: []kappctrl.AppFetchInlineSource{ - { - SecretRef: &kappctrl.AppFetchInlineSourceRef{ - Name: util.GenerateAppSecretNameFromAddonSecret(addonSecret), - }, - }, - }, - }, - }, - }, - { - Kbld: &kappctrl.AppTemplateKbld{ - Paths: []string{ - "-", - ".imgpkg/images.yml", - }, - }, - }, - } - - app.Spec.Deploy = []kappctrl.AppDeploy{ - { - Kapp: &kappctrl.AppDeployKapp{ - // --wait-timeout flag specifies the maximum time to wait for App deployment. In some corner cases, - // current App could have the dependency on the deployment of another App, so current App could get - // stuck in wait phase. - RawOptions: []string{fmt.Sprintf("--wait-timeout=%s", r.Config.AppWaitTimeout)}, - }, - }, - } - // If its a remoteApp set delete to no-op since the app doesnt have to be deleted when cluster is deleted. - app.Spec.NoopDelete = true - - return nil - } - - result, err := controllerutil.CreateOrPatch(r.ctx, r.clusterClient, app, appMutateFn) - if err != nil { - r.log.Error(err, "Error creating or patching addon remote App") - return err - } - - logOperationResult(r.log, "app", result) - } else { - ipkg := &pkgiv1alpha1.PackageInstall{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateAppNameFromAddonSecret(addonSecret), - Namespace: util.GenerateAppNamespaceFromAddonSecret(addonSecret, r.Config.AddonNamespace), - }, - } - - ipkgMutateFn := func() error { - if ipkg.ObjectMeta.Annotations == nil { - ipkg.ObjectMeta.Annotations = make(map[string]string) - } - - ipkg.ObjectMeta.Annotations[addontypes.AddonTypeAnnotation] = fmt.Sprintf("%s/%s", addonConfig.Category, addonName) - ipkg.ObjectMeta.Annotations[addontypes.AddonNameAnnotation] = addonSecret.Name - ipkg.ObjectMeta.Annotations[addontypes.AddonNamespaceAnnotation] = addonSecret.Namespace - ipkg.ObjectMeta.Annotations[addontypes.YttMarkerAnnotation] = "" - - ipkg.Spec.SyncPeriod = &metav1.Duration{Duration: r.Config.AppSyncPeriod} - ipkg.Spec.ServiceAccountName = r.Config.AddonServiceAccount - ipkg.Spec.PackageRef = &pkgiv1alpha1.PackageRef{ - RefName: addonConfig.PackageName, - VersionSelection: &versions.VersionSelectionSemver{ - Prereleases: &versions.VersionSelectionSemverPrereleases{}, - }, - } - ipkg.Spec.Values = []pkgiv1alpha1.PackageInstallValues{ - {SecretRef: &pkgiv1alpha1.PackageInstallValuesSecretRef{ - Name: util.GenerateAppSecretNameFromAddonSecret(addonSecret)}, - }, - } - - return nil - } - - result, err := controllerutil.CreateOrPatch(r.ctx, r.clusterClient, ipkg, ipkgMutateFn) - if err != nil { - r.log.Error(err, "Error creating or patching addon PackageInstall") - return err - } - - logOperationResult(r.log, "PackageInstall", result) - } - - return nil -} - -// ReconcileAddonKappResourceDelete reconciles and deletes packageinstall CR -func (r *PackageReconciler) ReconcileAddonKappResourceDelete( // nolint:dupl - addonSecret *corev1.Secret) error { - - pkgi := &pkgiv1alpha1.PackageInstall{ - ObjectMeta: metav1.ObjectMeta{ - Name: util.GenerateAppNameFromAddonSecret(addonSecret), - Namespace: util.GenerateAppNamespaceFromAddonSecret(addonSecret, r.Config.AddonNamespace), - }, - } - - if err := r.clusterClient.Delete(r.ctx, pkgi); err != nil { - if apierrors.IsNotFound(err) { - r.log.Info("Addon PackageInstall not found") - return nil - } - r.log.Error(err, "Error deleting addon PackageInstall") - return err - } - - r.log.Info("Deleted PackageInstall") - - return nil -} diff --git a/addons/controllers/packageinstallstatus_controller.go b/addons/controllers/packageinstallstatus_controller.go deleted file mode 100644 index 5e02d9fece..0000000000 --- a/addons/controllers/packageinstallstatus_controller.go +++ /dev/null @@ -1,410 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - "strings" - - "github.com/go-logr/logr" - "github.com/pkg/errors" - "golang.org/x/text/cases" - "golang.org/x/text/language" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" - kerrors "k8s.io/apimachinery/pkg/util/errors" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/controllers/remote" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapipatchutil "sigs.k8s.io/cluster-api/util/patch" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/builder" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/predicate" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" - - kapppkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/predicates" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -type ClusterRole int - -const ( - clusterRoleManagement ClusterRole = iota - clusterRoleWorkload -) - -// PackageInstallStatusReconciler contains the reconciler information for PackageInstallStatus controller -type PackageInstallStatusReconciler struct { - Client client.Client - Log logr.Logger - Scheme *runtime.Scheme - Config *addonconfig.PackageInstallStatusControllerConfig - ctx context.Context - - controller controller.Controller - // aggregatedAPIResourcesClient is used when it is required to directly read from the server and not to use object caches - aggregatedAPIResourcesClient client.Client - // tracker is used for managing client caches for workload clusters - tracker *remote.ClusterCacheTracker -} - -// NewPackageInstallStatusReconciler returns a reconciler for PackageInstallStatus -func NewPackageInstallStatusReconciler( - c client.Client, - log logr.Logger, - scheme *runtime.Scheme, - config *addonconfig.PackageInstallStatusControllerConfig, - tracker *remote.ClusterCacheTracker) *PackageInstallStatusReconciler { - - return &PackageInstallStatusReconciler{ - Client: c, - Log: log, - Scheme: scheme, - Config: config, - tracker: tracker, - } -} - -// SetupWithManager sets up the controller with the Manager. -func (r *PackageInstallStatusReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error { - pkgiStatusController, err := ctrl.NewControllerManagedBy(mgr). - For(&clusterapiv1beta1.Cluster{}). - Watches( - &source.Kind{Type: &kapppkgiv1alpha1.PackageInstall{}}, - handler.EnqueueRequestsFromMapFunc(pkgiToCluster), - builder.WithPredicates(pkgiIsManagedAndStatusChanged(r.Log)), - ). - WithOptions(options). - WithEventFilter(predicates.ClusterHasLabel(constants.TKRLabelClassyClusters, r.Log)). - Build(r) - - if err != nil { - return errors.Wrap(err, "failed setting up with a controller manager") - } - - r.controller = pkgiStatusController - r.ctx = ctx - if r.aggregatedAPIResourcesClient, err = client.New(mgr.GetConfig(), client.Options{Scheme: mgr.GetScheme()}); err != nil { - return err - } - - return nil -} - -// +kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=clusterBootstraps,verbs=get;list;watch;create;update;patch;delete -// +kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=clusterBootstraps/status,verbs=get;update;patch - -// Reconcile performs the reconciliation action for the controller; which is reflecting the reconciliation status of each core/additional package -// into corresponding ClusterBootstrap resource of the cluster -func (r *PackageInstallStatusReconciler) Reconcile(_ context.Context, req reconcile.Request) (reconcile.Result, error) { - log := r.Log.WithValues(constants.ClusterNamespaceLogKey, req.Namespace, constants.ClusterNameLogKey, req.Name) - - var ( - clusterRole ClusterRole - ) - - // get cluster object - cluster := &clusterapiv1beta1.Cluster{} - if err := r.Client.Get(r.ctx, req.NamespacedName, cluster); err != nil { - if apierrors.IsNotFound(err) { - log.Info("cluster not found") - return ctrl.Result{}, nil - } - return ctrl.Result{}, errors.Wrap(err, "unable to fetch cluster") - } - - // if cluster is marked for deletion, then no reconciliation is needed - if !cluster.GetDeletionTimestamp().IsZero() { - return ctrl.Result{}, nil - } - - clusterLabels := cluster.GetLabels() - - // make sure the TKR object exists - tkrName := util.GetClusterLabel(cluster.Labels, constants.TKRLabelClassyClusters) - if tkrName == "" { - return ctrl.Result{}, nil - } - - tkr, err := util.GetTKRByNameV1Alpha3(r.ctx, r.Client, cluster, tkrName) - if err != nil { - return ctrl.Result{}, errors.Wrapf(err, "unable to fetch TKR object '%s'", tkrName) - } - // if tkr is not found, should not requeue for the reconciliation - if tkr == nil { - log.Info("TKR object not found", "name", tkrName) - return ctrl.Result{}, nil - } - if cluster.Status.Phase == string(clusterapiv1beta1.ClusterPhaseDeleting) || cluster.Status.Phase == string(clusterapiv1beta1.ClusterPhaseFailed) { - return ctrl.Result{}, nil - } - - if cluster.Status.Phase != string(clusterapiv1beta1.ClusterPhaseProvisioned) { - log.Info(fmt.Sprintf("cluster %s/%s does not have status phase %s", cluster.Namespace, cluster.Name, clusterapiv1beta1.ClusterPhaseProvisioned)) - return ctrl.Result{RequeueAfter: constants.RequeueAfterDuration}, nil - } - - // determine cluster role - _, isManagementCluster := clusterLabels[constants.ManagementClusterRoleLabel] - - if isManagementCluster { - // the cluster is a management cluster - clusterRole = clusterRoleManagement - if err := r.reconcile(r.Client, cluster, clusterRole, log); err != nil { - return ctrl.Result{}, err - } - } else { - // the cluster is a remote workload cluster - clusterRole = clusterRoleWorkload - remoteClient, err := r.tracker.GetClient(r.ctx, clusterapiutil.ObjectKey(cluster)) - if err != nil { - return ctrl.Result{}, errors.Wrap(err, "error getting remote cluster's client") - } - - log.Info("successfully got remoteClient") - // set watch if not already set. If the watch already exists, it doesn't get re-created - if err := watchPackageInstalls(r.ctx, r.controller, r.tracker, cluster, log); err != nil { - return ctrl.Result{}, errors.Wrap(err, "error watching PackageInstalls on target cluster") - } - log.Info("finished setting up remote watch for the cluster") - - if err := r.reconcile(remoteClient, cluster, clusterRole, log); err != nil { - return ctrl.Result{}, err - } - } - - return ctrl.Result{}, nil -} - -// reconcile iterates over all core/additional packages and calls reconcileClusterBootstrapStatus() for each. -// it eventually patches ClusterBootstrapStatus with the condition entries (one for each package) in a single patch operation -func (r *PackageInstallStatusReconciler) reconcile(clusterClient client.Client, cluster *clusterapiv1beta1.Cluster, clusterRole ClusterRole, log logr.Logger) (retErr error) { - clusterObjKey := client.ObjectKeyFromObject(cluster) - - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - // ClusterBootstrap resource exists in the management cluster, that's why we need to use local client instead of remote client for fetching it - if err := r.Client.Get(r.ctx, clusterObjKey, clusterBootstrap); err != nil { - return err - } - - var errorList []error - - patchHelper, err := clusterapipatchutil.NewHelper(clusterBootstrap, r.Client) - if err != nil { - errorList = append(errorList, errors.Wrap(err, "error patching ClusterBootstrapStatus")) - retErr = kerrors.NewAggregate(errorList) - } - - defer func() { - if err := patchHelper.Patch(r.ctx, clusterBootstrap); err != nil { - errorList = append(errorList, errors.Wrap(err, "error patching ClusterBootstrapStatus")) - retErr = kerrors.NewAggregate(errorList) - } - }() - - // this shouldn't include kapp ctrl package as it'll get processed separately - packages := append([]*runtanzuv1alpha3.ClusterBootstrapPackage{ - clusterBootstrap.Spec.CNI, - clusterBootstrap.Spec.CPI, - clusterBootstrap.Spec.CSI, - }, clusterBootstrap.Spec.AdditionalPackages...) - - for _, pkg := range packages { - if pkg == nil { - continue - } - if err := r.reconcileClusterBootstrapStatus(clusterClient, clusterBootstrap, clusterObjKey, pkg.RefName, r.Config.SystemNamespace, log); err != nil { - errorList = append(errorList, err) - // in case of error, just log the error and continue with collecting PackageInstallStatus for other packages - // if a condition corresponding to the package is existing in the ClusterBootstrapStatus, we delete it as the corresponding pkgi or package resources do not exist for the package anymore - log.Error(err, fmt.Sprintf("failed to reconcile PackageInstallStatus for package '%s/%s'", r.Config.SystemNamespace, pkg.RefName)) - r.removeConditionIfExistsForPkgName(clusterBootstrap, pkg.RefName) - } - } - - // kapp ctrl pkgi exists only for the workload cluster. - // it is installed under cluster.Namespace in the management cluster and should be handled separately - if clusterRole == clusterRoleWorkload && clusterBootstrap.Spec.Kapp != nil { - if err := r.reconcileClusterBootstrapStatus(r.Client, clusterBootstrap, clusterObjKey, clusterBootstrap.Spec.Kapp.RefName, cluster.Namespace, log); err != nil { - errorList = append(errorList, err) - // in case of error, just log the error and proceed with patching the ClusterBootstrapStatus for all packages in a single patch operation - // if a condition corresponding to the package is existing in the ClusterBootstrapStatus, we delete it as the corresponding pkgi or package resources do not exist for the package anymore - log.Error(err, fmt.Sprintf("failed to reconcile PackageInstallStatus for package '%s/%s'", cluster.Namespace, clusterBootstrap.Spec.Kapp.RefName)) - r.removeConditionIfExistsForPkgName(clusterBootstrap, clusterBootstrap.Spec.Kapp.RefName) - } - } - - return retErr -} - -// reconcileClusterBootstrapStatus reconciles clusterBootstrapStatus by setting conditions corresponding to all core/additional packages. -// The Status patch happens in the caller function -func (r *PackageInstallStatusReconciler) reconcileClusterBootstrapStatus( - clusterClient client.Client, - clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, - clusterObjKey client.ObjectKey, - pkgName string, - pkgiNamespace string, - log logr.Logger) error { - - var pkgiName, pkgShortname string - - // Use the mgmt cluster client to get Package resource for both mgmt and workload. The package resource is synced from - // mgmt to workload so it should be there on mgmt cluster. - pkgRefName, pkgVersion, err := util.GetPackageMetadata(r.ctx, r.aggregatedAPIResourcesClient, pkgName, pkgiNamespace) - - if pkgRefName == "" || pkgVersion == "" || err != nil { - return errors.Wrapf(err, "unable to fetch Package.Spec.RefName or Package.Spec.Version from Package '%s/%s'", pkgiNamespace, pkgName) - } - pkgShortname = strings.Split(pkgRefName, ".")[0] - - // package install name for core/additional packages for both management and workload clusters should follow the - naming convention - pkgiName = util.GeneratePackageInstallName(clusterObjKey.Name, pkgRefName) - - pkgi := &kapppkgiv1alpha1.PackageInstall{} - objectKey := client.ObjectKey{Namespace: pkgiNamespace, Name: pkgiName} - - if err := clusterClient.Get(r.ctx, objectKey, pkgi); err != nil { - return errors.Wrapf(err, "unable to get PackageInstall '%s/%s'", pkgiNamespace, pkgiName) - } - - // for each package, create a single summary condition from the condition slice - pkgiCondition := util.SummarizeAppConditions(pkgi.Status.Conditions) - - // in case of encountering an empty(nil) PackageInstall condition, just return err=nil and proceed with handling the next package - if pkgiCondition == nil { - log.Info(fmt.Sprintf("empty condition for '%s/%s'", pkgiNamespace, pkgiName)) - return nil - } - - // we populate 'Message' with Carvel's PackageInstall 'UsefulErrorMessage' field as it contains more detailed information in case of an error - title := cases.Title(language.Und) - // skip adding current timestamp as it frequently triggers downstream controller to go through the CB resource for no reason - condition := clusterapiv1beta1.Condition{ - Type: clusterapiv1beta1.ConditionType(title.String(pkgShortname)) + "-" + - clusterapiv1beta1.ConditionType(pkgiCondition.Type), - Status: pkgiCondition.Status, - Message: util.GetKappUsefulErrorMessage(pkgi.Status.UsefulErrorMessage), - Reason: pkgiCondition.Reason, - } - - // only add a new condition entry for the PackageInstall in the clusterBootstrapStatus in case it doesn't already exist. - // If it does, just update it with the new condition. - // Note that we did not simply use cluster API's util function conditions.Set(clusterBootstrap, &condition) cause our condition types are generated by prefixing Carvel's condition types with pkgi name and we need - // to only consider condition types' prefix (pkgi name) rather than the full condition type for condition's equality check and custom comparison logic is net implemented in CAPI's condition util Set() as of now - var conditionExists bool - for i, existingCond := range clusterBootstrap.Status.Conditions { - if !strings.Contains(string(existingCond.Type), title.String(pkgShortname)) { - continue - } - conditionExists = true - if !util.HasSameState(&clusterBootstrap.Status.Conditions[i], &condition) { - clusterBootstrap.Status.Conditions[i] = condition - } - } - if !conditionExists { - clusterBootstrap.Status.Conditions = append(clusterBootstrap.Status.Conditions, condition) - } - - return nil -} - -// removeConditionIfExistsForPkgName removes the corresponding condition for the provided pkgRefName from the clusterBootstrapStatus if existing -func (r *PackageInstallStatusReconciler) removeConditionIfExistsForPkgName(clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, pkgRefName string) { - for i, existingCond := range clusterBootstrap.Status.Conditions { - pkgShortname := strings.Split(pkgRefName, ".")[0] - if strings.Contains(string(existingCond.Type), cases.Title(language.Und).String(pkgShortname)) { - clusterBootstrap.Status.Conditions = append(clusterBootstrap.Status.Conditions[:i], clusterBootstrap.Status.Conditions[i+1:]...) - } - } -} - -// watchPackageInstalls sets a remote watch on the provided cluster on the Kind resource -func watchPackageInstalls(ctx context.Context, watcher remote.Watcher, tracker *remote.ClusterCacheTracker, cluster *clusterapiv1beta1.Cluster, log logr.Logger) error { - // If there is no tracker, don't watch remote package installs - if tracker == nil { - return nil - } - - return tracker.Watch(ctx, remote.WatchInput{ - Name: "watchPackageInstallStatus", - Cluster: clusterapiutil.ObjectKey(cluster), - Watcher: watcher, - Kind: &kapppkgiv1alpha1.PackageInstall{}, - EventHandler: handler.EnqueueRequestsFromMapFunc(pkgiToCluster), - Predicates: []predicate.Predicate{pkgiIsManagedAndStatusChanged(log)}, - }) -} - -// pkgiIsManagedAndStatusChanged returns a predicate.Predicate that filters pkgi objects which their status has changed -func pkgiIsManagedAndStatusChanged(log logr.Logger) predicate.Funcs { - return predicate.Funcs{ - CreateFunc: func(e event.CreateEvent) bool { - return processPkgiIsManagedAndStatusChanged(e.Object, log.WithValues("predicate", "createEvent")) - }, - UpdateFunc: func(e event.UpdateEvent) bool { - return processPkgiIsManagedAndStatusChanged(e.ObjectNew, log.WithValues("predicate", "updateEvent")) - }, - DeleteFunc: func(e event.DeleteEvent) bool { - return processPkgiIsManagedAndStatusChanged(e.Object, log.WithValues("predicate", "deleteEvent")) - }, - GenericFunc: func(e event.GenericEvent) bool { - return processPkgiIsManagedAndStatusChanged(e.Object, log.WithValues("predicate", "genericEvent")) - }, - } -} - -// processPkgiIsManagedAndStatusChanged returns true if pkgi status should be processed. -// pkgi status can be processed if it is a managed package and exists in the list of packages defined in ClusterBootstrap -func processPkgiIsManagedAndStatusChanged(o client.Object, log logr.Logger) bool { - var pkgi *kapppkgiv1alpha1.PackageInstall - switch obj := o.(type) { - case *kapppkgiv1alpha1.PackageInstall: - pkgi = obj - default: - log.Info("Expected object type of PackageInstall. Got object type", "actualType", fmt.Sprintf("%T", o)) - return false - } - - clusterObjKey := getClusterNamespacedName(pkgi) - if clusterObjKey == nil { - return false - } - - // check if package install name matches the names that are generated during install - if pkgi.Name == util.GeneratePackageInstallName(clusterObjKey.Name, pkgi.Spec.PackageRef.RefName) { - return true - } - return false -} - -func getClusterNamespacedName(pkgi *kapppkgiv1alpha1.PackageInstall) *client.ObjectKey { - annotations := pkgi.GetAnnotations() - if annotations == nil { - return nil - } - - clusterName, ok := annotations[types.ClusterNameAnnotation] - if !ok || clusterName == "" { - return nil - } - - clusterNamespace, ok := annotations[types.ClusterNamespaceAnnotation] - if !ok || clusterNamespace == "" { - return nil - } - - return &client.ObjectKey{Namespace: clusterNamespace, Name: clusterName} -} diff --git a/addons/controllers/packageinstallstatus_controller_test.go b/addons/controllers/packageinstallstatus_controller_test.go deleted file mode 100644 index 543b7fd5ab..0000000000 --- a/addons/controllers/packageinstallstatus_controller_test.go +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - kappctrlv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kapppkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/carvel-secretgen-controller/pkg/apis/secretgen/v1alpha1" - versions "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/versions/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -var _ = Describe("PackageInstallStatus Reconciler", func() { - const ( - antreaPkg = "antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.2" - antreaPkgRefName = "antrea.tanzu.vmware.com" - clusterNameMng = "test-mng" - clusterNamespaceMng = "tkg-system" - clusterNameWlc = "test-wlc" - clusterNamespaceWlc = "test-ns-wlc" - kappPkgRefName = "kapp-controller.tanzu.vmware.com" - ) - - var ( - clusterResourceFilePath string - mngAntreaObjKey = client.ObjectKey{Namespace: constants.TKGSystemNS, Name: util.GeneratePackageInstallName(clusterNameMng, antreaPkgRefName)} - wlcAntreaObjKey = client.ObjectKey{Namespace: constants.TKGSystemNS, Name: util.GeneratePackageInstallName(clusterNameWlc, antreaPkgRefName)} - wlcKappObjKey = client.ObjectKey{Namespace: clusterNamespaceWlc, Name: util.GeneratePackageInstallName(clusterNameWlc, kappPkgRefName)} - ) - - JustBeforeEach(func() { - By("Creating resources") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ShouldNot(HaveOccurred()) - defer f.Close() - Expect(testutil.CreateResources(f, cfg, dynamicClient)).Should(Succeed()) - - By("Installing antrea into management cluster") - installPackage(clusterNameMng, antreaPkg, constants.TKGSystemNS) - updatePkgInstallStatus(mngAntreaObjKey, kappctrlv1alpha1.ReconcileSucceeded) - - By("Creating kubeconfig for management cluster") - Expect(testutil.CreateKubeconfigSecret(cfg, clusterNameMng, clusterNamespaceMng, k8sClient)).Should(Succeed()) - - By("Creating kubeconfig for workload cluster") - Expect(testutil.CreateKubeconfigSecret(cfg, clusterNameWlc, clusterNamespaceWlc, k8sClient)).Should(Succeed()) - }) - - AfterEach(func() { - By("Deleting resources") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ShouldNot(HaveOccurred()) - defer f.Close() - // Best effort resource deletion - _ = testutil.DeleteResources(f, cfg, dynamicClient, true) - }) - - Context("reconcile PackageInstallStatus", func() { - BeforeEach(func() { - clusterResourceFilePath = "testdata/test-packageinstallstatus.yaml" - }) - - It("Should reconcile PackageInstallStatus on management & workload clusters", func() { - - By("verifying management cluster is created properly") - mngCluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespaceMng, Name: clusterNameMng}, mngCluster)).Should(Succeed()) - updateClusterStateToPhaseProvisioned(mngCluster) - - By("verifying workload cluster is created properly") - wlcCluster := &clusterapiv1beta1.Cluster{} - Expect(k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterNamespaceWlc, Name: clusterNameWlc}, wlcCluster)).Should(Succeed()) - updateClusterStateToPhaseProvisioned(wlcCluster) - - By("verifying management and workload clusters' ClusterBootstrap has been created") - clusterBootstrapGet(client.ObjectKeyFromObject(mngCluster)) - clusterBootstrapGet(client.ObjectKeyFromObject(wlcCluster)) - - //By("verifying un-managed packages do not update the 'Status.Conditions' for ClusterBootstrap") - //// install unmanaged package into management cluster. Make sure ClusterBootstrap conditions does not get changed from un-managed package - //installPackage(mngCluster.Name, "pkg.test.carvel.dev.1.0.0", mngCluster.Namespace) - //mngClusterBootstrap := clusterBootstrapGet(client.ObjectKeyFromObject(mngCluster)) - //// Antrea is already installed into management cluster's tkg-system namespace - //Expect(len(mngClusterBootstrap.Status.Conditions)).Should(Equal(1)) - //antreaCondType := "Antrea-" + clusterapiv1beta1.ConditionType(v1alpha1.ReconcileSucceeded) - //Expect(mngClusterBootstrap.Status.Conditions[0].Type).Should(Equal(antreaCondType)) - //// install unmanaged package into workload cluster. Make sure cluster bootstrap conditions does not get changed fro un-managed package - //installPackage(wlcCluster.Name, "pkg.test.carvel.dev.1.0.0", wlcCluster.Namespace) - //wlcClusterBootstrap := clusterBootstrapGet(client.ObjectKeyFromObject(wlcCluster)) - //Expect(len(wlcClusterBootstrap.Status.Conditions)).Should(Equal(0)) - - By("verifying ClusterBootstrap 'Status.Conditions' does not get updated when PackageInstall's summarized condition is Unknown") - // verify for management cluster - updatePkgInstallStatus(mngAntreaObjKey, "") - mngClusterBootstrap := clusterBootstrapGet(client.ObjectKeyFromObject(mngCluster)) - // Antrea is already installed into management cluster's tkg-system namespace - Expect(len(mngClusterBootstrap.Status.Conditions)).Should(Equal(1)) - antreaCondType := "Antrea-" + clusterapiv1beta1.ConditionType(v1alpha1.ReconcileSucceeded) - Expect(mngClusterBootstrap.Status.Conditions[0].Type).Should(Equal(antreaCondType)) - // verify for workload cluster - updatePkgInstallStatus(wlcAntreaObjKey, "") - updatePkgInstallStatus(wlcKappObjKey, "") - wlcClusterBootstrap := clusterBootstrapGet(client.ObjectKeyFromObject(wlcCluster)) - Expect(len(wlcClusterBootstrap.Status.Conditions)).Should(Equal(0)) - - By("verifying ClusterBootstrap 'Status.Conditions' gets updated for managed packages") - // verify for management cluster - mngClusterBootstrapStatus := waitForClusterBootstrapStatus(client.ObjectKeyFromObject(mngCluster), antreaCondType) - Expect(len(mngClusterBootstrapStatus.Conditions)).Should(Equal(1)) - Expect(mngClusterBootstrapStatus.Conditions[0].Type).Should(Equal(antreaCondType)) - // verify for workload cluster - updatePkgInstallStatus(wlcAntreaObjKey, kappctrlv1alpha1.ReconcileSucceeded) - updatePkgInstallStatus(wlcKappObjKey, kappctrlv1alpha1.Reconciling) - antreaCondType = "Antrea-" + clusterapiv1beta1.ConditionType(v1alpha1.ReconcileSucceeded) - kappCondType := "Kapp-Controller-" + clusterapiv1beta1.ConditionType(v1alpha1.Reconciling) - waitForClusterBootstrapStatus(client.ObjectKeyFromObject(wlcCluster), antreaCondType) - wlcClusterBootstrapStatus := waitForClusterBootstrapStatus(client.ObjectKeyFromObject(wlcCluster), kappCondType) - Expect(len(wlcClusterBootstrapStatus.Conditions)).Should(Equal(2)) - Expect(wlcClusterBootstrapStatus.Conditions[0].Type).Should(Equal(antreaCondType)) - Expect(wlcClusterBootstrapStatus.Conditions[1].Type).Should(Equal(kappCondType)) - }) - }) -}) - -// updatePkgInstallStatus simulates kapp controller PackageInstall status update -func updatePkgInstallStatus(objKey client.ObjectKey, appCondType kappctrlv1alpha1.AppConditionType) { - pkgInstall := &kapppkgiv1alpha1.PackageInstall{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, objKey, pkgInstall); err != nil { - return false - } - condition := kappctrlv1alpha1.AppCondition{Type: appCondType, Status: corev1.ConditionTrue} - pkgInstall.Status.Conditions = append(pkgInstall.Status.Conditions, condition) - err := k8sClient.Status().Update(ctx, pkgInstall) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue()) -} - -// clusterBootstrapGet gets ClusterBootstrap resource with the provided object key -func clusterBootstrapGet(objKey client.ObjectKey) *runtanzuv1alpha3.ClusterBootstrap { - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - Eventually(func() bool { - err := k8sClient.Get(ctx, objKey, clusterBootstrap) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue()) - - Expect(clusterBootstrap).ShouldNot(BeNil()) - return clusterBootstrap -} - -// waitForClusterBootstrapStatus checks ClusterBootstrap's 'Status.Conditions' includes provided condition type -func waitForClusterBootstrapStatus(objKey client.ObjectKey, condType clusterapiv1beta1.ConditionType) *runtanzuv1alpha3.ClusterBootstrapStatus { - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, objKey, clusterBootstrap); err != nil { - return false - } - for _, cond := range clusterBootstrap.Status.Conditions { - switch { - case cond.Type == condType: - return true - } - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - return &clusterBootstrap.Status -} - -// installPackage installs a package into the provided namespace -func installPackage(clusterName, pkgName, namespace string) { - packageRefName, _, err := util.GetPackageMetadata(ctx, k8sClient, pkgName, namespace) - Expect(err).ShouldNot(HaveOccurred()) - Expect(packageRefName).ShouldNot(Equal("")) - - pkg := &kapppkgv1alpha1.Package{} - key := client.ObjectKey{Namespace: namespace, Name: pkgName} - Expect(k8sClient.Get(ctx, key, pkg)).Should(Succeed()) - - pkgiName := util.GeneratePackageInstallName(clusterName, packageRefName) - pkgi := &kapppkgiv1alpha1.PackageInstall{ - ObjectMeta: metav1.ObjectMeta{ - Name: pkgiName, - Namespace: namespace, - Annotations: map[string]string{types.ClusterNameAnnotation: clusterName, types.ClusterNamespaceAnnotation: namespace}, - }, - Spec: kapppkgiv1alpha1.PackageInstallSpec{ - PackageRef: &kapppkgiv1alpha1.PackageRef{ - RefName: pkgName, - VersionSelection: &versions.VersionSelectionSemver{Constraints: "1.0.0"}, - }, - }, - } - - _, err = controllerutil.CreateOrPatch(ctx, k8sClient, pkgi, nil) - Expect(err).ShouldNot(HaveOccurred()) - - installedPkg := &kapppkgiv1alpha1.PackageInstall{} - key = client.ObjectKey{Namespace: namespace, Name: pkgiName} - Expect(k8sClient.Get(ctx, key, installedPkg)).Should(Succeed()) -} - -// updateClusterStateToPhaseProvisioned updates cluster state to 'PhaseProvisioned' -func updateClusterStateToPhaseProvisioned(cluster *clusterapiv1beta1.Cluster) { - Eventually(func() bool { - cluster.Status.Phase = string(clusterapiv1beta1.ClusterPhaseProvisioned) - if err := k8sClient.Status().Update(ctx, cluster); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) -} diff --git a/addons/controllers/packageinstallstatus_handler.go b/addons/controllers/packageinstallstatus_handler.go deleted file mode 100644 index b7f949e5c9..0000000000 --- a/addons/controllers/packageinstallstatus_handler.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - kapppkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" -) - -// pkgiToCluster returns a list of Requests with Cluster ObjectKey -func pkgiToCluster(o client.Object) []ctrl.Request { - pkgi, ok := o.(*kapppkgiv1alpha1.PackageInstall) - if !ok { - return nil - } - - clusterObjKey := getClusterNamespacedName(pkgi) - if clusterObjKey == nil { - return nil - } - - return []ctrl.Request{{NamespacedName: client.ObjectKey{Namespace: clusterObjKey.Namespace, Name: clusterObjKey.Name}}} -} diff --git a/addons/controllers/suite_test.go b/addons/controllers/suite_test.go deleted file mode 100644 index 230c9bc42d..0000000000 --- a/addons/controllers/suite_test.go +++ /dev/null @@ -1,548 +0,0 @@ -// Copyright 2020-2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "bytes" - "context" - "io" - "os" - "path" - "path/filepath" - "strings" - "testing" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - capociv1beta1 "github.com/oracle/cluster-api-provider-oci/api/v1beta1" - corev1 "k8s.io/api/core/v1" - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/selection" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/kubernetes/fake" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/rest" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capvvmwarev1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/vmware/v1beta1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - capiremote "sigs.k8s.io/cluster-api/controllers/remote" - controlplanev1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - ctrlruntimefake "sigs.k8s.io/controller-runtime/pkg/client/fake" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/envtest" - "sigs.k8s.io/controller-runtime/pkg/envtest/printer" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/log/zap" - "sigs.k8s.io/controller-runtime/pkg/manager" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - pkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - antrea "github.com/vmware-tanzu/tanzu-framework/addons/controllers/antrea" - awsebscsi "github.com/vmware-tanzu/tanzu-framework/addons/controllers/awsebscsi" - azurediskcsi "github.com/vmware-tanzu/tanzu-framework/addons/controllers/azurediskcsi" - azurefilecsi "github.com/vmware-tanzu/tanzu-framework/addons/controllers/azurefilecsi" - calico "github.com/vmware-tanzu/tanzu-framework/addons/controllers/calico" - cpi "github.com/vmware-tanzu/tanzu-framework/addons/controllers/cpi" - csi "github.com/vmware-tanzu/tanzu-framework/addons/controllers/csi" - kappcontroller "github.com/vmware-tanzu/tanzu-framework/addons/controllers/kapp-controller" - kubevipcpi "github.com/vmware-tanzu/tanzu-framework/addons/controllers/kubevipcpi" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/crdwait" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/webhooks" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - addonwebhooks "github.com/vmware-tanzu/tanzu-framework/addons/webhooks" - cniv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha1" - cniv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha2" - cpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" - runtanzuv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - vmoperatorv1alpha1 "github.com/vmware-tanzu/vm-operator-api/api/v1alpha1" - topologyv1alpha1 "github.com/vmware-tanzu/vm-operator/external/tanzu-topology/api/v1alpha1" -) - -// These tests use Ginkgo (BDD-style Go testing framework). Refer to -// http://onsi.github.io/ginkgo/ to learn more about Ginkgo. - -const ( - waitTimeout = time.Second * 90 - specialWaitTimeout = 5 * time.Minute - pollingInterval = time.Second * 2 - appSyncPeriod = 5 * time.Minute - appWaitTimeout = 30 * time.Second - addonNamespace = "tkg-system" - addonServiceAccount = "tkg-addons-app-sa" - addonClusterRole = "tkg-addons-app-cluster-role" - addonClusterRoleBinding = "tkg-addons-app-cluster-role-binding" - addonImagePullPolicy = "IfNotPresent" - corePackageRepoName = "core" - webhookServiceName = "tanzu-addons-manager-webhook-service" - cniWebhookManifestFile = "testdata/webhooks/test-antrea-calico-webhook-manifests.yaml" - clusterbootstrapWebhookManifestFile = "testdata/webhooks/clusterbootstrap-webhook-manifests.yaml" -) - -var ( - cfg *rest.Config - k8sClient client.Client - k8sConfig *rest.Config - testEnv *envtest.Environment - ctx = ctrl.SetupSignalHandler() - scheme = runtime.NewScheme() - mgr manager.Manager - dynamicClient dynamic.Interface - clientSet *kubernetes.Clientset - cancel context.CancelFunc - certPath string - keyPath string - tmpDir string - webhookCertDetails testutil.WebhookCertificatesDetails - webhookSelectorString string - addonConfigCRDBasesPath = filepath.Join("..", "..", "apis", "addonconfigs", "config", "crd", "bases") - runCRDPath = filepath.Join("..", "..", "apis", "run", "config", "crd", "bases") - localCRDPath = filepath.Join("testdata", "internal-crds") - setupLog = ctrl.Log.WithName("controllers").WithName("Addon") -) - -func TestAddonController(t *testing.T) { - RegisterFailHandler(Fail) - - RunSpecsWithDefaultAndCustomReporters(t, - "Addon Controller Suite", - []Reporter{printer.NewlineReporter{}}) -} - -var _ = BeforeSuite(func(done Done) { - - logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) - - By("bootstrapping test environment") - testEnv = &envtest.Environment{CRDInstallOptions: envtest.CRDInstallOptions{ - CleanUpAfterUse: true}, - ErrorIfCRDPathMissing: true, - } - - // For each dependency, a real module containing go files should be passed in. - externalDeps := map[string][]string{ - "sigs.k8s.io/cluster-api/api/v1beta1": {"config/crd/bases", - "controlplane/kubeadm/config/crd/bases"}, - "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1": {"config/crds.yml"}, - "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1": {"config/default/crd/bases", "config/supervisor/crd"}, - "github.com/oracle/cluster-api-provider-oci": {"config/crd/bases"}, - } - - externalCRDPaths, err := testutil.GetExternalCRDPaths(externalDeps) - Expect(err).NotTo(HaveOccurred()) - Expect(externalCRDPaths).ToNot(BeEmpty()) - testEnv.CRDDirectoryPaths = externalCRDPaths - - // copy crds into a local directory "testdata/internal-crds", while excluding "tanzukubernetesreleases" CRD file, which its v1alpha3 version is already included in "testdata/dependency/crd" directory - err = setupLocalCRDDirectory(localCRDPath) - Expect(err).NotTo(HaveOccurred()) - - copyCRDs := func(files []os.DirEntry, path string) { - for _, f := range files { - if !strings.Contains(f.Name(), "tanzukubernetesreleases") { - data, err := os.ReadFile(filepath.Join(path, f.Name())) - Expect(err).ToNot(HaveOccurred()) - - destFilePath := filepath.Join(localCRDPath, f.Name()) - destFile, err := os.OpenFile(destFilePath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755) - Expect(err).NotTo(HaveOccurred()) - - _, err = io.Copy(destFile, bytes.NewReader(data)) - Expect(err).NotTo(HaveOccurred()) - destFile.Close() - } - } - } - - files, err := os.ReadDir(addonConfigCRDBasesPath) - Expect(err).ToNot(HaveOccurred()) - copyCRDs(files, addonConfigCRDBasesPath) - - files, err = os.ReadDir(runCRDPath) - Expect(err).ToNot(HaveOccurred()) - copyCRDs(files, runCRDPath) - - // If it is not possible to include the parent repo that contains the CRD yaml file, manually add the CRD definition file into testdata/dependency/crd - // For example, virtualmachines CRD is in repo vm-operator, but introducing vm-operator would cause dependency conflict in go.mod, therefore the CRD file is manually ported in - testEnv.CRDDirectoryPaths = append(testEnv.CRDDirectoryPaths, - localCRDPath, filepath.Join("testdata"), filepath.Join("testdata", "dependency", "crd")) - testEnv.ErrorIfCRDPathMissing = true - - cfg, err = testEnv.Start() - Expect(err).ToNot(HaveOccurred()) - Expect(cfg).ToNot(BeNil()) - testEnv.ControlPlane.APIServer.Configure().Append("admission-control", "MutatingAdmissionWebhook") - testEnv.ControlPlane.APIServer.Configure().Append("admission-control", "ValidatingAdmissionWebhook") - - err = runtanzuv1alpha1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = runtanzuv1alpha3.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = clientgoscheme.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = kappctrl.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = clusterapiv1beta1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = controlplanev1beta1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = pkgiv1alpha1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = kapppkgv1alpha1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = cniv1alpha1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = cniv1alpha2.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = cpiv1alpha1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = csiv1alpha1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = capvv1beta1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = capvvmwarev1beta1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = capociv1beta1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = vmoperatorv1alpha1.AddToScheme(scheme) - Expect(err).ToNot(HaveOccurred()) - - err = topologyv1alpha1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = apiextensionsv1.AddToScheme(scheme) - Expect(err).ToNot(HaveOccurred()) - - k8sClient, err = client.New(cfg, client.Options{Scheme: scheme}) - Expect(err).ToNot(HaveOccurred()) - Expect(k8sClient).ToNot(BeNil()) - - dynamicClient, err = dynamic.NewForConfig(cfg) - Expect(err).ToNot(HaveOccurred()) - Expect(dynamicClient).ToNot(BeNil()) - - tmpDir, err = os.MkdirTemp("/tmp", "webhooktest") - Expect(err).ToNot(HaveOccurred()) - certPath = path.Join(tmpDir, "tls.crt") - keyPath = path.Join(tmpDir, "tls.key") - - options := manager.Options{ - Scheme: scheme, - MetricsBindAddress: "0", - Host: "127.0.0.1", - Port: 9443, - CertDir: tmpDir, - } - mgr, err = ctrl.NewManager(testEnv.Config, options) - Expect(err).ToNot(HaveOccurred()) - k8sConfig = mgr.GetConfig() - - clientSet, err = kubernetes.NewForConfig(cfg) - Expect(err).ToNot(HaveOccurred()) - - ctx, cancel = context.WithCancel(ctx) - - initObjs := []client.Object{} - fakeApiReader := ctrlruntimefake.NewClientBuilder().WithScheme(scheme).WithObjects(initObjs...).Build() - - crdwaiter := crdwait.CRDWaiter{ - Ctx: ctx, - ClientSet: fake.NewSimpleClientset(), - APIReader: fakeApiReader, - Logger: setupLog, - Scheme: scheme, - PollInterval: constants.CRDWaitPollInterval, - PollTimeout: constants.CRDWaitPollTimeout, - } - - crds, initObjs := GetExternalCRDs() - crdwaiter.APIReader = ctrlruntimefake.NewClientBuilder().WithScheme(scheme).WithObjects(initObjs...).Build() - - if err := crdwaiter.WaitForCRDs(crds, - &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "test-pod", Namespace: "default"}}, - constants.AddonControllerName, - ); err != nil { - setupLog.Error(err, "unable to wait for CRDs") - os.Exit(1) - } - - Expect((&AddonReconciler{ - Client: mgr.GetClient(), - Log: setupLog, - Scheme: mgr.GetScheme(), - Config: addonconfig.AddonControllerConfig{ - AppSyncPeriod: appSyncPeriod, - AppWaitTimeout: appWaitTimeout, - AddonNamespace: addonNamespace, - AddonServiceAccount: addonServiceAccount, - AddonClusterRole: addonClusterRole, - AddonClusterRoleBinding: addonClusterRoleBinding, - AddonImagePullPolicy: addonImagePullPolicy, - CorePackageRepoName: corePackageRepoName, - }, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&calico.CalicoConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("CalicoConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.CalicoConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: constants.TKGSystemNS}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&cpi.VSphereCPIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("VSphereCPIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.VSphereCPIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: constants.TKGSystemNS}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&csi.VSphereCSIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("VSphereCSIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.VSphereCSIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: constants.TKGSystemNS}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&azurefilecsi.AzureFileCSIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("AzureFileCSIConfig"), - Scheme: mgr.GetScheme(), - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&azurediskcsi.AzureDiskCSIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("AzureFileCSIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.AzureDiskCSIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: constants.TKGSystemNS}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&cpi.OracleCPIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("OracleCPIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.OracleCPIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: constants.TKGSystemNS}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&antrea.AntreaConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("AntreaConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.AntreaConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: constants.TKGSystemNS}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&kappcontroller.KappControllerConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("KappController"), - Scheme: mgr.GetScheme(), - Config: addonconfig.KappControllerConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: constants.TKGSystemNS}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&MachineReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("MachineController"), - Scheme: mgr.GetScheme(), - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&awsebscsi.AwsEbsCSIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("AwsEbsCSIConfig"), - Scheme: mgr.GetScheme(), - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - bootstrapReconciler := NewClusterBootstrapReconciler( - mgr.GetClient(), - ctrl.Log.WithName("controllers").WithName("ClusterBootstrap"), - mgr.GetScheme(), - &addonconfig.ClusterBootstrapControllerConfig{ - IPFamilyClusterClassVarName: constants.DefaultIPFamilyClusterClassVarName, - SystemNamespace: constants.TKGSystemNS, - PkgiServiceAccount: constants.PackageInstallServiceAccount, - PkgiClusterRole: constants.PackageInstallClusterRole, - PkgiClusterRoleBinding: constants.PackageInstallClusterRoleBinding, - PkgiSyncPeriod: constants.PackageInstallSyncPeriod, - ClusterDeleteTimeout: time.Second * 10, - }, - ) - Expect(bootstrapReconciler.SetupWithManager(context.Background(), mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&kubevipcpi.KubevipCPIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("KubevipCPIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.KubevipCPIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: constants.TKGSystemNS}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((&ClusterMetadataReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("ClusterMetadata"), - Scheme: mgr.GetScheme(), - context: ctx, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - // set up a ClusterCacheTracker to provide to PackageInstallStatus controller which requires a connection to remote clusters - l := ctrl.Log.WithName("remote").WithName("ClusterCacheTracker") - tracker, err := capiremote.NewClusterCacheTracker(mgr, capiremote.ClusterCacheTrackerOptions{Log: &l}) - Expect(err).Should(BeNil()) - Expect(tracker).ShouldNot(BeNil()) - - // set up CluterCacheReconciler to drops the accessor via deleteAccessor upon cluster deletion - Expect((&capiremote.ClusterCacheReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("remote").WithName("ClusterCacheReconciler"), - Tracker: tracker, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - Expect((NewPackageInstallStatusReconciler( - mgr.GetClient(), - ctrl.Log.WithName("controllers").WithName("PackageInstallStatus"), - mgr.GetScheme(), - &addonconfig.PackageInstallStatusControllerConfig{ - SystemNamespace: constants.TKGSystemNS, - }, - tracker, - )).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1})).To(Succeed()) - - // pre-create namespace - ns := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "tkr-system"}} - Expect(k8sClient.Create(context.TODO(), ns)).To(Succeed()) - - ns = &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "tkg-system"}} - Expect(k8sClient.Create(context.TODO(), ns)).To(Succeed()) - - labelMatch, err := labels.NewRequirement(constants.AddonWebhookLabelKey, selection.Equals, []string{constants.AddonWebhookLabelValue}) - Expect(err).ToNot(HaveOccurred()) - webhookSelector := labels.NewSelector() - webhookSelector = webhookSelector.Add(*labelMatch) - webhookSelectorString = webhookSelector.String() - _, err = webhooks.InstallNewCertificates(ctx, k8sConfig, certPath, keyPath, constants.WebhookScrtName, addonNamespace, webhookServiceName, webhookSelectorString) - Expect(err).ToNot(HaveOccurred()) - - // Set up the webhooks in the manager - err = (&cniv1alpha1.AntreaConfig{}).SetupWebhookWithManager(mgr) - Expect(err).ToNot(HaveOccurred()) - err = (&cniv1alpha2.AntreaConfig{}).SetupWebhookWithManager(mgr) - Expect(err).ToNot(HaveOccurred()) - err = (&cniv1alpha1.CalicoConfig{}).SetupWebhookWithManager(mgr) - Expect(err).ToNot(HaveOccurred()) - err = (&addonwebhooks.ClusterPause{Client: k8sClient}).SetupWebhookWithManager(mgr) - Expect(err).ToNot(HaveOccurred()) - clusterbootstrapWebhook := addonwebhooks.ClusterBootstrap{ - Client: k8sClient, - SystemNamespace: addonNamespace, - } - err = clusterbootstrapWebhook.SetupWebhookWithManager(ctx, mgr) - Expect(err).ToNot(HaveOccurred()) - clusterbootstrapTemplateWebhook := addonwebhooks.ClusterBootstrapTemplate{ - SystemNamespace: addonNamespace, - } - err = clusterbootstrapTemplateWebhook.SetupWebhookWithManager(mgr) - Expect(err).ToNot(HaveOccurred()) - - go func() { - defer GinkgoRecover() - Expect(mgr.Start(ctx)).To(Succeed()) - }() - - // Setup the tkg-system namespace resources. - // We do it here because specs may be executed in parallel and - // this is the only way to assure the tkg-system resources are ready before all specs start - - // Prepare clusterbootstrap webhooks webhooks - f, err := os.Open(clusterbootstrapWebhookManifestFile) - Expect(err).ToNot(HaveOccurred()) - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - f.Close() - - // set up the certificates and webhook before creating any objects - By("Creating and installing new certificates for ClusterBootstrap Admission Webhooks") - webhookCertDetails = testutil.WebhookCertificatesDetails{ - CertPath: certPath, - KeyPath: keyPath, - WebhookScrtName: constants.WebhookScrtName, - AddonNamespace: addonNamespace, - WebhookServiceName: webhookServiceName, - LabelSelector: webhookSelector, - } - err = testutil.SetupWebhookCertificates(ctx, k8sClient, k8sConfig, &webhookCertDetails) - Expect(err).ToNot(HaveOccurred()) - - // Create the rest of tkg-system resources - f, err = os.Open("testdata/test-tkg-system-ns-resources.yaml") - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - Expect(testutil.CreateResources(f, cfg, dynamicClient)).To(Succeed()) - - close(done) -}, 60) - -var _ = AfterSuite(func() { - f, err := os.Open(clusterbootstrapWebhookManifestFile) - Expect(err).ToNot(HaveOccurred()) - err = testutil.DeleteResources(f, cfg, dynamicClient, true) - Expect(err).ToNot(HaveOccurred()) - f.Close() - By("tearing down the test environment") - cancel() - err = testEnv.Stop() - Expect(err).ToNot(HaveOccurred()) - - err = removeLocalCRDDirectory(localCRDPath) - Expect(err).ToNot(HaveOccurred()) -}) - -func setupLocalCRDDirectory(path string) error { - _, err := os.Stat(path) - if err != nil { - if os.IsNotExist(err) { - if err := os.MkdirAll(path, os.ModePerm); err != nil { - return err - } - } else { - return err - } - } - return nil -} - -func removeLocalCRDDirectory(path string) error { - if err := os.RemoveAll(path); err != nil { - return err - } - return nil -} diff --git a/addons/controllers/suite_test_crd_dependencies.go b/addons/controllers/suite_test_crd_dependencies.go deleted file mode 100644 index 7e03cde77b..0000000000 --- a/addons/controllers/suite_test_crd_dependencies.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build tests -// +build tests - -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Ensure CRDs used for tests are present - -package controllers - -import ( - _ "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - _ "sigs.k8s.io/cluster-api/api/v1beta1" - - _ "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" -) diff --git a/addons/controllers/testdata/antrea-custom-cb-2-resources.yaml b/addons/controllers/testdata/antrea-custom-cb-2-resources.yaml deleted file mode 100644 index 68932b9c67..0000000000 --- a/addons/controllers/testdata/antrea-custom-cb-2-resources.yaml +++ /dev/null @@ -1,266 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.23.2 -spec: - version: v1.23.2 - kubernetes: - version: v1.23.2 - imageRepository: foo - osImages: [] - bootstrapPackages: [] ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.23.2 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.31.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-cluster-custom-cb-2-kapp-controller-config - cni: - refName: antrea.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: antrea-config-template-2 ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: antrea-config-template-2 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - antrea: - config: - trafficEncapMode: encap - defaultMTU: "8900" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerCluster -metadata: - name: custom-cb-docker-cluster-2 ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-custom-cb - namespace: custom-cb-2-namespace -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.2 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.2+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.2 - namespace: custom-cb-2-namespace -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.2+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - namespace: custom-cb-2-namespace -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: test-cluster-custom-cb-2-kapp-controller-config - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: test-cluster-custom-cb-2-kapp-controller-config - namespace: custom-cb-2-namespace -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" diff --git a/addons/controllers/testdata/antrea-custom-cb-ns.yaml b/addons/controllers/testdata/antrea-custom-cb-ns.yaml deleted file mode 100644 index b4e5bdbe1a..0000000000 --- a/addons/controllers/testdata/antrea-custom-cb-ns.yaml +++ /dev/null @@ -1,83 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-custom-cb - namespace: antrea-custom-cb-ns -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.1 - namespace: antrea-custom-cb-ns -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.1+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.5--vmware.11-tkg.1 - namespace: antrea-custom-cb-ns -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema diff --git a/addons/controllers/testdata/antrea-custom-cb.yaml b/addons/controllers/testdata/antrea-custom-cb.yaml deleted file mode 100644 index 8281390ed5..0000000000 --- a/addons/controllers/testdata/antrea-custom-cb.yaml +++ /dev/null @@ -1,21 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - name: custom-cb-2-cluster - namespace: custom-cb-2-namespace -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.31.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-cluster-custom-cb-2-kapp-controller-config - cni: - refName: antrea.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: antrea-config-custom-2 diff --git a/addons/controllers/testdata/antrea-custom-tkg-system.yaml b/addons/controllers/testdata/antrea-custom-tkg-system.yaml deleted file mode 100644 index 73e93cfe99..0000000000 --- a/addons/controllers/testdata/antrea-custom-tkg-system.yaml +++ /dev/null @@ -1,154 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.23.1 -spec: - version: v1.23.1 - kubernetes: - version: v1.23.1 - imageRepository: foo - osImages: [] - bootstrapPackages: [] ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.23.1 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.31.1 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: kapp-config-template - cni: - refName: antrea.tanzu.vmware.com.1.2.5--vmware.11-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: antrea-config-template ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: antrea-config-template - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - antrea: - config: - trafficEncapMode: encap - defaultMTU: "8900" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerCluster -metadata: - name: custom-cb-docker-cluster ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.1 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.5--vmware.11-tkg.1 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: kapp-config-template - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" diff --git a/addons/controllers/testdata/antrea-test-1.yaml b/addons/controllers/testdata/antrea-test-1.yaml deleted file mode 100644 index 495b1596a2..0000000000 --- a/addons/controllers/testdata/antrea-test-1.yaml +++ /dev/null @@ -1,96 +0,0 @@ ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-4 - namespace: default -spec: - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerCluster - name: test-cluster-4 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerCluster -metadata: - name: test-cluster-4 ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: test-cluster-4-antrea-package - namespace: default - labels: - tkg.tanzu.vmware.com/package-name: antrea.tanzu.vmware.com.1.7.2---tkg.1-advanced - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-cluster-4 - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d -spec: - antrea: - config: - egress: - exceptCIDRs: [] - nodePortLocal: - enabled: true - portRange: 61000-62000 - antreaProxy: - proxyAll: false - nodePortAddresses: [] - skipServices: [] - proxyLoadBalancerIPs: false - flowExporter: - collectorAddress: "flow-aggregator.flow-aggregator.svc:4739:tls" - pollInterval: "5s" - activeFlowTimeout: "30s" - idleFlowTimeout: "15s" - multicluster: - enable: false - namespace: null - multicast: - igmpQueryInterval: "125s" - kubeAPIServerOverride: null - transportInterface: null - transportInterfaceCIDRs: [] - multicastInterfaces: [] - tunnelType: geneve - tunnelPort: 0 - tunnelCsum: false - trafficEncryptionMode: none - wireGuard: - port: 51820 - serviceCIDR: 10.96.0.0/12 - serviceCIDRv6: null - enableUsageReporting: false - trafficEncapMode: encap - noSNAT: false - disableUdpTunnelOffload: false - defaultMTU: "" - dnsServerOverride: null - disableTXChecksumOffload: false - enableBridgingMode: false - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - featureGates: - AntreaProxy: true - EndpointSlice: false - AntreaPolicy: true - FlowExporter: false - Egress: false - NodePortLocal: true - AntreaTraceflow: false - NetworkPolicyStats: false - AntreaIPAM: false - ServiceExternalIP: false - Multicast: false - Multicluster: false - SecondaryNetwork: false - TrafficControl: false - TopologyAwareHints: false diff --git a/addons/controllers/testdata/antrea-test-2.yaml b/addons/controllers/testdata/antrea-test-2.yaml deleted file mode 100644 index 6f9eea0a0e..0000000000 --- a/addons/controllers/testdata/antrea-test-2.yaml +++ /dev/null @@ -1,98 +0,0 @@ ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-5 - namespace: default -spec: - infrastructureRef: - kind: VSphereCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - topology: - class: test-clusterclass-tcbt - version: v1.22.2 ---- -apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-5 - topology.cluster.x-k8s.io/owned: "" - name: test-cluster-5-6gvvc - namespace: default -spec: - controlPlaneEndpoint: - host: 192.168.123.3 - port: 6443 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerCluster -metadata: - name: test-cluster-5 ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: test-cluster-5-antrea-package - namespace: default - labels: - tkg.tanzu.vmware.com/package-name: antrea.tanzu.vmware.com.1.7.2---tkg.1-advanced - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-cluster-5 - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d -spec: - antrea: - config: - egress: - exceptCIDRs: [] - nodePortLocal: - enabled: true - portRange: 61000-62000 - antreaProxy: - proxyAll: false - nodePortAddresses: [] - skipServices: [] - proxyLoadBalancerIPs: false - flowExporter: - collectorAddress: "flow-aggregator.flow-aggregator.svc:4739:tls" - pollInterval: "5s" - activeFlowTimeout: "30s" - idleFlowTimeout: "15s" - kubeAPIServerOverride: null - transportInterface: null - transportInterfaceCIDRs: [] - multicastInterfaces: [] - tunnelType: geneve - trafficEncryptionMode: none - wireGuard: - port: 51820 - serviceCIDR: 10.96.0.0/12 - serviceCIDRv6: null - enableUsageReporting: false - trafficEncapMode: encap - noSNAT: false - disableUdpTunnelOffload: false - defaultMTU: "" - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - featureGates: - AntreaProxy: true - EndpointSlice: false - AntreaPolicy: true - FlowExporter: false - Egress: false - NodePortLocal: true - AntreaTraceflow: false - NetworkPolicyStats: false - AntreaIPAM: false - ServiceExternalIP: false - Multicast: false - antreaNsx: - enable: true diff --git a/addons/controllers/testdata/antrea-test-template-config-1.yaml b/addons/controllers/testdata/antrea-test-template-config-1.yaml deleted file mode 100644 index c22a8c6bfa..0000000000 --- a/addons/controllers/testdata/antrea-test-template-config-1.yaml +++ /dev/null @@ -1,49 +0,0 @@ ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: test-cluster-4-antrea-package - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - antrea: - config: - egress: - exceptCIDRs: [] - nodePortLocal: - enabled: true - portRange: 61000-62000 - antreaProxy: - proxyAll: false - nodePortAddresses: [] - skipServices: [] - proxyLoadBalancerIPs: false - kubeAPIServerOverride: null - transportInterface: null - transportInterfaceCIDRs: [] - multicastInterfaces: [] - tunnelType: geneve - trafficEncryptionMode: none - wireGuard: - port: 51820 - serviceCIDR: 10.96.0.0/12 - serviceCIDRv6: null - enableUsageReporting: false - trafficEncapMode: encap - noSNAT: false - disableUdpTunnelOffload: false - defaultMTU: "" - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - featureGates: - AntreaProxy: true - EndpointSlice: false - AntreaPolicy: true - FlowExporter: false - Egress: false - NodePortLocal: true - AntreaTraceflow: false - NetworkPolicyStats: false - AntreaIPAM: false - ServiceExternalIP: false - Multicast: false diff --git a/addons/controllers/testdata/calico-custom-cb-ns.yaml b/addons/controllers/testdata/calico-custom-cb-ns.yaml deleted file mode 100644 index 8eeb77ab0e..0000000000 --- a/addons/controllers/testdata/calico-custom-cb-ns.yaml +++ /dev/null @@ -1,160 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: calico-custom-cb-ns - namespace: calico-custom-cb-ns -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.2 - namespace: calico-custom-cb-ns -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.2+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - namespace: calico-custom-cb-ns -spec: - refName: calico.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: calico 1.2.3 https://github.com/calico-io/calico/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema - ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: kapp-config-custom - namespace: calico-custom-cb-ns -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: calico-custom-config - namespace: calico-custom-cb-ns -spec: - calico: - config: - vethMTU: 1420 - skipCNIBinaries: false ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - name: calico-custom-cb-cluster - namespace: calico-custom-cb-ns -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.31.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: kapp-config-custom - cni: - refName: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: CalicoConfig - name: calico-custom-config ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: calico-custom-cb-cluster - namespace: calico-custom-cb-ns - labels: - "tkg.tanzu.vmware.com/cluster-name": calico-custom-cb-cluster - "run.tanzu.vmware.com/tkr": v1.23.2 -spec: - infrastructureRef: - kind: DockerCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16"] diff --git a/addons/controllers/testdata/calico-custom-config-ns.yaml b/addons/controllers/testdata/calico-custom-config-ns.yaml deleted file mode 100644 index fa7f0fb412..0000000000 --- a/addons/controllers/testdata/calico-custom-config-ns.yaml +++ /dev/null @@ -1,139 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: calico-custom-config-ns - namespace: calico-custom-config-ns -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.2 - namespace: calico-custom-config-ns -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.2+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - namespace: calico-custom-config-ns -spec: - refName: calico.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: calico 1.2.3 https://github.com/calico-io/calico/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema - ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: kapp-config-custom - namespace: calico-custom-config-ns -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: calico-custom-config-cluster-calico-package - namespace: calico-custom-config-ns -spec: - calico: - config: - vethMTU: 1420 - skipCNIBinaries: false ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: calico-custom-config-cluster - namespace: calico-custom-config-ns - labels: - "tkg.tanzu.vmware.com/cluster-name": calico-custom-config-cluster - "run.tanzu.vmware.com/tkr": v1.23.2 -spec: - infrastructureRef: - kind: DockerCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16"] diff --git a/addons/controllers/testdata/calico-custom-config.yaml b/addons/controllers/testdata/calico-custom-config.yaml deleted file mode 100644 index 3f1781a1e8..0000000000 --- a/addons/controllers/testdata/calico-custom-config.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-calico-2 - namespace: default -spec: - infrastructureRef: - kind: DockerCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16"] ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: test-cluster-calico-2-calico-package - namespace: default -spec: - calico: - config: - vethMTU: 1420 - skipCNIBinaries: false diff --git a/addons/controllers/testdata/calico-custom-tkg-system.yaml b/addons/controllers/testdata/calico-custom-tkg-system.yaml deleted file mode 100644 index 194f9014ce..0000000000 --- a/addons/controllers/testdata/calico-custom-tkg-system.yaml +++ /dev/null @@ -1,140 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.23.2 -spec: - version: v1.23.2 - kubernetes: - version: v1.23.2 - imageRepository: foo - osImages: [] - bootstrapPackages: - - name: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.23.2 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.31.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: c-kapp-config-template-3 - cni: - refName: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: CalicoConfig - name: calico-config-template-3 ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: calico-config-template-3 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - calico: - config: - vethMTU: 0 - skipCNIBinaries: true ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: c-kapp-config-template-3 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerCluster -metadata: - name: custom-cb-docker-cluster - ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.2 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.2+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - namespace: tkg-system -spec: - refName: calico.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: calico 1.2.3 https://github.com/calico-io/calico/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema - diff --git a/addons/controllers/testdata/calico-management-cluster.yaml b/addons/controllers/testdata/calico-management-cluster.yaml deleted file mode 100644 index 02d18c144b..0000000000 --- a/addons/controllers/testdata/calico-management-cluster.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: mgmt-cluster - namespace: tkg-system - labels: - "tkg.tanzu.vmware.com/cluster-name": mgmt-cluster - "run.tanzu.vmware.com/tkr": v1.23.2 - "cluster-role.tkg.tanzu.vmware.com/management": "" -spec: - infrastructureRef: - kind: DockerCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16"] diff --git a/addons/controllers/testdata/calico-wildcard-cb-ns.yaml b/addons/controllers/testdata/calico-wildcard-cb-ns.yaml deleted file mode 100644 index 4a6b13f7c4..0000000000 --- a/addons/controllers/testdata/calico-wildcard-cb-ns.yaml +++ /dev/null @@ -1,114 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: calico-wildcard-cb-ns - namespace: calico-wildcard-cb-ns -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.2 - namespace: calico-wildcard-cb-ns -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.2+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - namespace: calico-wildcard-cb-ns -spec: - refName: calico.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: calico 1.2.3 https://github.com/calico-io/calico/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema - ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: kapp-config-custom - namespace: calico-wildcard-cb-ns -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - diff --git a/addons/controllers/testdata/calico-wildcard-user-input.yaml b/addons/controllers/testdata/calico-wildcard-user-input.yaml deleted file mode 100644 index 9904ac711d..0000000000 --- a/addons/controllers/testdata/calico-wildcard-user-input.yaml +++ /dev/null @@ -1,49 +0,0 @@ ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: calico-wildcard-config - namespace: calico-wildcard-cb-ns -spec: - calico: - config: - vethMTU: 1420 - skipCNIBinaries: false ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - name: calico-wildcard-cb-cluster - namespace: calico-wildcard-cb-ns - annotations: - tkg.tanzu.vmware.com/add-missing-fields-from-tkr: v1.23.2 -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.31.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: kapp-config-custom - cni: - refName: calico* - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: CalicoConfig - name: calico-wildcard-config ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: calico-wildcard-cb-cluster - namespace: calico-wildcard-cb-ns - labels: - "tkg.tanzu.vmware.com/cluster-name": calico-wildcard-cb-cluster - "run.tanzu.vmware.com/tkr": v1.23.2 -spec: - infrastructureRef: - kind: DockerCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16"] diff --git a/addons/controllers/testdata/dependency/crd/run.tanzu.vmware.com_tanzukubernetesreleases.yaml b/addons/controllers/testdata/dependency/crd/run.tanzu.vmware.com_tanzukubernetesreleases.yaml deleted file mode 100644 index 2dafbb73f6..0000000000 --- a/addons/controllers/testdata/dependency/crd/run.tanzu.vmware.com_tanzukubernetesreleases.yaml +++ /dev/null @@ -1,555 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.8.0 - creationTimestamp: null - name: tanzukubernetesreleases.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: TanzuKubernetesRelease - listKind: TanzuKubernetesReleaseList - plural: tanzukubernetesreleases - shortNames: - - tkr - singular: tanzukubernetesrelease - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG, which can be used to create TanzuKubernetesCluster instances. TKRs - are immutable to end-users. They are created and managed by TKG to provide - discovery of Kubernetes releases to TKG users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - images: - description: Images is the list of (other than Kubernetes core) essential - container images shipped by this TKR (e.g. coredns, etcd). - items: - description: ContainerImage is a struct representing a single fully - qualified container image name, constructed as `{Repository}/{Name}:{Tag}`. - properties: - name: - description: Name is the container image name without the repository - prefix. It MUST be a valid URI path, MAY contain zero or more - '/', and SHOULD NOT start or end with '/'. - type: string - repository: - description: Repository is the container image repository used - by this image. It MUST be a DNS-compatible name. - type: string - tag: - description: Tag is the container image version tag. It is the - suffix coming after ':' in a fully qualified image name. - type: string - required: - - name - type: object - type: array - kubernetesVersion: - description: KubernetesVersion is the fully qualified Semantic Versioning - conformant version of Kubernetes shipped by this TKR. The same KubernetesVersion - MAY be shipped by different TKRs. - type: string - nodeImageRef: - description: NodeImageRef refers to an object representing the image - used to create TKC nodes (e.g. VirtualMachineImage). - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - repository: - description: Repository is the container image repository for Kubernetes - core images, such as kube-apiserver, kube-proxy, etc. It MUST be - a DNS-compatible name. - type: string - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - - jsonPath: .status.conditions[?(@.type=='UpdatesAvailable')].message - name: Updates Available - type: string - name: v1alpha2 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG Service, which can be used to create TanzuKubernetesCluster instances. - TKRs are immutable to end-users. They are created and managed by TKG Service - to provide discovery of Kubernetes releases to TKG Service users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - images: - description: Images is the list of (other than Kubernetes core) essential - container images shipped by this TKR (e.g. coredns, etcd). - items: - description: ContainerImage is a struct representing a single fully - qualified container image name, constructed as `{Repository}/{Name}:{Tag}`. - properties: - name: - description: Name is the container image name without the repository - prefix. It MUST be a valid URI path, MAY contain zero or more - '/', and SHOULD NOT start or end with '/'. - type: string - repository: - description: Repository is the container image repository used - by this image. It MUST be a DNS-compatible name. - type: string - tag: - description: Tag is the container image version tag. It is the - suffix coming after ':' in a fully qualified image name. - type: string - required: - - name - type: object - type: array - kubernetesVersion: - description: KubernetesVersion is the fully qualified Semantic Versioning - conformant version of Kubernetes shipped by this TKR. The same KubernetesVersion - MAY be shipped by different TKRs. - type: string - nodeImageRef: - description: NodeImageRef refers to an object representing the image - used to create TKC nodes (e.g. VirtualMachineImage). - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - repository: - description: Repository is the container image repository for Kubernetes - core images, such as kube-apiserver, kube-proxy, etc. It MUST be - a DNS-compatible name. - type: string - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - name: v1alpha3 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG, which can be used to create TanzuKubernetesCluster instances. TKRs - are immutable to end-users. They are created and managed by TKG to provide - discovery of Kubernetes releases to TKG users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - bootstrapPackages: - description: BootstrapPackages lists references to all bootstrap packages - shipped with this TKR. - items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - type: array - kubernetes: - description: Kubernetes is Kubernetes - properties: - coredns: - description: CoreDNS specifies the container image repository - and tag for coredns. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - etcd: - description: Etcd specifies the container image repository and - tag for etcd. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - imageRepository: - description: ImageRepository specifies container image registry - to pull images from. - type: string - kube-vip: - description: KubeVIP specifies the container image repository - and tag for kube-vip. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - pause: - description: Pause specifies the container image repository and - tag for pause. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - version: - description: Version is Semantic Versioning conformant version - of the Kubernetes build shipped by this TKR. The same Kubernetes - build MAY be shipped by multiple TKRs. - type: string - required: - - version - type: object - osImages: - description: OSImages lists references to all OSImage objects shipped - with this TKR. - items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - type: array - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - kubernetes - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/addons/controllers/testdata/dependency/crd/topology.tanzu.vmware.com_availabilityzones.yaml b/addons/controllers/testdata/dependency/crd/topology.tanzu.vmware.com_availabilityzones.yaml deleted file mode 100644 index d3e4717d3c..0000000000 --- a/addons/controllers/testdata/dependency/crd/topology.tanzu.vmware.com_availabilityzones.yaml +++ /dev/null @@ -1,81 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.6.1 - creationTimestamp: null - name: availabilityzones.topology.tanzu.vmware.com -spec: - group: topology.tanzu.vmware.com - names: - kind: AvailabilityZone - listKind: AvailabilityZoneList - plural: availabilityzones - shortNames: - - az - singular: availabilityzone - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AvailabilityZone is the schema for the AvailabilityZone resource - for the vSphere topology API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AvailabilityZoneSpec defines the desired state of AvailabilityZone. - properties: - clusterComputeResourceMoId: - description: ClusterComputeResourceMoId is the managed object ID of - the vSphere ClusterComputeResource represented by this availability - zone. - type: string - namespaces: - additionalProperties: - description: NamespaceInfo contains identifying information about - the vSphere resources used to represent a Kuberentes namespace - on individual vSphere Clusters. - properties: - folderMoId: - description: FolderMoId is the managed object ID of the vSphere - Folder for a Namespace. Folders are global and not per-vSphere - Cluster, but the FolderMoId is stored here, alongside the - PoolMoId for convenience. - type: string - poolMoId: - description: PoolMoId is the managed object ID of the vSphere - ResourcePool for a Namespace on an individual vSphere Cluster. - type: string - type: object - description: Namespaces is a map that enables querying information - about the vSphere objects that make up a Kubernetes Namespace based - on its name. - type: object - type: object - status: - description: AvailabilityZoneStatus defines the observed state of AvailabilityZone. - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/addons/controllers/testdata/dependency/crd/vmoperator.vmware.com_virtualmachines.yaml b/addons/controllers/testdata/dependency/crd/vmoperator.vmware.com_virtualmachines.yaml deleted file mode 100644 index 5376a9c320..0000000000 --- a/addons/controllers/testdata/dependency/crd/vmoperator.vmware.com_virtualmachines.yaml +++ /dev/null @@ -1,535 +0,0 @@ - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.4.1 - creationTimestamp: null - name: virtualmachines.vmoperator.vmware.com -spec: - group: vmoperator.vmware.com - names: - kind: VirtualMachine - listKind: VirtualMachineList - plural: virtualmachines - shortNames: - - vm - singular: virtualmachine - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.powerState - name: PowerState - type: string - - jsonPath: .spec.className - name: Class - priority: 1 - type: string - - jsonPath: .spec.imageName - name: Image - priority: 1 - type: string - - jsonPath: .status.vmIp - name: Primary-IP - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: VirtualMachine is the Schema for the virtualmachines API. A VirtualMachine - represents the desired specification and the observed status of a VirtualMachine - instance. A VirtualMachine is realized by the VirtualMachine controller - on a backing Virtual Infrastructure provider such as vSphere. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VirtualMachineSpec defines the desired state of a VirtualMachine - properties: - advancedOptions: - description: AdvancedOptions describes a set of optional, advanced - options for configuring a VirtualMachine - properties: - changeBlockTracking: - description: ChangeBlockTracking specifies the enablement of incremental - backup support for this VirtualMachine, which can be utilized - by external backup systems such as VMware Data Recovery. - type: boolean - defaultVolumeProvisioningOptions: - description: DefaultProvisioningOptions specifies the provisioning - type to be used by default for VirtualMachine volumes exclusively - owned by this VirtualMachine. This does not apply to PersistentVolumeClaim - volumes that are created and managed externally. - properties: - eagerZeroed: - description: EagerZeroed specifies whether to use eager zero - provisioning for the VirtualMachineVolume. An eager zeroed - thick disk has all space allocated and wiped clean of any - previous contents on the physical media at creation time. - Such disks may take longer time during creation compared - to other disk formats. EagerZeroed is only applicable if - ThinProvisioned is false. This is validated by the webhook. - type: boolean - thinProvisioned: - description: ThinProvisioned specifies whether to use thin - provisioning for the VirtualMachineVolume. This means a - sparse (allocate on demand) format with additional space - optimizations. - type: boolean - type: object - type: object - className: - description: ClassName describes the name of a VirtualMachineClass - that is to be used as the overlaid resource configuration of VirtualMachine. A - VirtualMachineClass is used to further customize the attributes - of the VirtualMachine instance. See VirtualMachineClass for more - description. - type: string - imageName: - description: ImageName describes the name of a VirtualMachineImage - that is to be used as the base Operating System image of the desired - VirtualMachine instances. The VirtualMachineImage resources can - be introspected to discover identifying attributes that may help - users to identify the desired image to use. - type: string - networkInterfaces: - description: NetworkInterfaces describes a list of VirtualMachineNetworkInterfaces - to be configured on the VirtualMachine instance. Each of these VirtualMachineNetworkInterfaces - describes external network integration configurations that are to - be used by the VirtualMachine controller when integrating the VirtualMachine - into one or more external networks. - items: - description: VirtualMachineNetworkInterface defines the properties - of a network interface to attach to a VirtualMachine instance. A - VirtualMachineNetworkInterface describes network interface configuration - that is used by the VirtualMachine controller when integrating - the VirtualMachine into a VirtualNetwork. Currently, only NSX-T - and vSphere Distributed Switch (VDS) type network integrations - are supported using this VirtualMachineNetworkInterface structure. - properties: - ethernetCardType: - description: EthernetCardType describes an optional ethernet - card that should be used by the VirtualNetworkInterface (vNIC) - associated with this network integration. The default is - "vmxnet3". - type: string - networkName: - description: NetworkName describes the name of an existing virtual - network that this interface should be added to. For "nsx-t" - NetworkType, this is the name of a pre-existing NSX-T VirtualNetwork. - If unspecified, the default network for the namespace will - be used. For "vsphere-distributed" NetworkType, the NetworkName - must be specified. - type: string - networkType: - description: NetworkType describes the type of VirtualNetwork - that is referenced by the NetworkName. Currently, the only - supported NetworkTypes are "nsx-t" and "vsphere-distributed". - type: string - providerRef: - description: ProviderRef is reference to a network interface - provider object that specifies the network interface configuration. - If unset, default configuration is assumed. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. - type: string - apiVersion: - description: API version of the referent. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - apiGroup - - kind - - name - type: object - type: object - type: array - ports: - description: Ports is currently unused and can be considered deprecated. - items: - description: VirtualMachinePort is unused and can be considered - deprecated. - properties: - ip: - type: string - name: - type: string - port: - type: integer - protocol: - default: TCP - type: string - required: - - ip - - name - - port - - protocol - type: object - type: array - powerState: - description: PowerState describes the desired power state of a VirtualMachine. Valid - power states are "poweredOff" and "poweredOn". - enum: - - poweredOff - - poweredOn - type: string - readinessProbe: - description: ReadinessProbe describes a network probe that can be - used to determine if the VirtualMachine is available and responding - to the probe. - properties: - guestHeartbeat: - description: GuestHeartbeat specifies an action involving the - guest heartbeat status. - properties: - thresholdStatus: - default: green - description: ThresholdStatus is the value that the guest heartbeat - status must be at or above to be considered successful. - enum: - - yellow - - green - type: string - type: object - periodSeconds: - description: PeriodSeconds specifics how often (in seconds) to - perform the probe. Defaults to 10 seconds. Minimum value is - 1. - format: int32 - minimum: 1 - type: integer - tcpSocket: - description: TCPSocket specifies an action involving a TCP port. - properties: - host: - description: Host is an optional host name to connect to. Host - defaults to the VirtualMachine IP. - type: string - port: - anyOf: - - type: integer - - type: string - description: Port specifies a number or name of the port to - access on the VirtualMachine. If the format of port is a - number, it must be in the range 1 to 65535. If the format - of name is a string, it must be an IANA_SVC_NAME. - x-kubernetes-int-or-string: true - required: - - port - type: object - timeoutSeconds: - description: TimeoutSeconds specifies a number of seconds after - which the probe times out. Defaults to 10 seconds. Minimum value - is 1. - format: int32 - maximum: 60 - minimum: 1 - type: integer - type: object - resourcePolicyName: - description: ResourcePolicyName describes the name of a VirtualMachineSetResourcePolicy - to be used when creating the VirtualMachine instance. - type: string - storageClass: - description: StorageClass describes the name of a StorageClass that - should be used to configure storage-related attributes of the VirtualMachine - instance. - type: string - vmMetadata: - description: VmMetadata describes any optional metadata that should - be passed to the Guest OS. - properties: - configMapName: - description: ConfigMapName describes the name of the ConfigMap, - in the same Namespace as the VirtualMachine, that should be - used for VirtualMachine metadata. The contents of the Data - field of the ConfigMap is used as the VM Metadata. The format - of the contents of the VM Metadata are not parsed or interpreted - by the VirtualMachine controller. Please note, this field and - SecretName are mutually exclusive. - type: string - secretName: - description: SecretName describes the name of the Secret, in the - same Namespace as the VirtualMachine, that should be used for - VirtualMachine metadata. The contents of the Data field of the - Secret is used as the VM Metadata. The format of the contents - of the VM Metadata are not parsed or interpreted by the VirtualMachine - controller. Please note, this field and ConfigMapName are mutually - exclusive. - type: string - transport: - description: Transport describes the name of a supported VirtualMachineMetadata - transport protocol. Currently, the only supported transport - protocols are "ExtraConfig", "OvfEnv" and "CloudInit". - enum: - - ExtraConfig - - OvfEnv - - CloudInit - type: string - type: object - volumes: - description: Volumes describes the list of VirtualMachineVolumes that - are desired to be attached to the VirtualMachine. Each of these - volumes specifies a volume identity that the VirtualMachine controller - will attempt to satisfy, potentially with an external Volume Management - service. - items: - description: VirtualMachineVolume describes a Volume that should - be attached to a specific VirtualMachine. Only one of PersistentVolumeClaim, - VsphereVolume should be specified. - properties: - name: - description: Name specifies the name of the VirtualMachineVolume. Each - volume within the scope of a VirtualMachine must have a unique - name. - type: string - persistentVolumeClaim: - description: "PersistentVolumeClaim represents a reference to - a PersistentVolumeClaim in the same namespace. The PersistentVolumeClaim - must match one of the following: \n * A volume provisioned - (either statically or dynamically) by the cluster's CSI - provider. \n * An instance volume with a lifecycle coupled - to the VM." - properties: - claimName: - description: 'ClaimName is the name of a PersistentVolumeClaim - in the same namespace as the pod using this volume. More - info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' - type: string - instanceVolumeClaim: - description: InstanceVolumeClaim is set if the PVC is backed - by instance storage. - properties: - size: - anyOf: - - type: integer - - type: string - description: Size is the size of the requested instance - storage volume. - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - storageClass: - description: StorageClass is the name of the Kubernetes - StorageClass that provides the backing storage for - this instance storage volume. - type: string - required: - - size - - storageClass - type: object - readOnly: - description: Will force the ReadOnly setting in VolumeMounts. - Default false. - type: boolean - required: - - claimName - type: object - vSphereVolume: - description: VsphereVolume represents a reference to a VsphereVolumeSource - in the same namespace. Only one of PersistentVolumeClaim or - VsphereVolume can be specified. This is enforced via a webhook - properties: - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: A description of the virtual volume's resources - and capacity - type: object - deviceKey: - description: Device key of vSphere disk. - type: integer - type: object - required: - - name - type: object - type: array - required: - - className - - imageName - - powerState - type: object - status: - description: VirtualMachineStatus defines the observed state of a VirtualMachine - instance. - properties: - biosUUID: - description: BiosUUID describes a unique identifier provided by the - underlying infrastructure provider that is exposed to the Guest - OS BIOS as a unique hardware identifier. - type: string - changeBlockTracking: - description: ChangeBlockTracking describes the CBT enablement status - on the VirtualMachine. - type: boolean - conditions: - description: Conditions describes the current condition information - of the VirtualMachine. - items: - description: Condition defines an observation of a VM Operator API - resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - host: - description: Host describes the hostname or IP address of the infrastructure - host that the VirtualMachine is executing on. - type: string - instanceUUID: - description: InstanceUUID describes the unique instance UUID provided - by the underlying infrastructure provider, such as vSphere. - type: string - networkInterfaces: - description: NetworkInterfaces describes a list of current status - information for each network interface that is desired to be attached - to the VirtualMachine. - items: - description: NetworkInterfaceStatus defines the observed state of - network interfaces attached to the VirtualMachine as seen by the - Guest OS and VMware tools - properties: - connected: - description: Connected represents whether the network interface - is connected or not. - type: boolean - ipAddresses: - description: IpAddresses represents zero, one or more IP addresses - assigned to the network interface in CIDR notation. For eg, - "192.0.2.1/16". - items: - type: string - type: array - macAddress: - description: MAC address of the network adapter - type: string - required: - - connected - type: object - type: array - phase: - description: Phase describes the current phase information of the - VirtualMachine. - type: string - powerState: - description: PowerState describes the current power state of the VirtualMachine. - enum: - - poweredOff - - poweredOn - type: string - uniqueID: - description: UniqueID describes a unique identifier that is provided - by the underlying infrastructure provider, such as vSphere. - type: string - vmIp: - description: VmIp describes the Primary IP address assigned to the - guest operating system, if known. Multiple IPs can be available - for the VirtualMachine. Refer to networkInterfaces in the VirtualMachine - status for additional IPs - type: string - volumes: - description: Volumes describes a list of current status information - for each Volume that is desired to be attached to the VirtualMachine. - items: - description: VirtualMachineVolumeStatus defines the observed state - of a VirtualMachineVolume instance. - properties: - attached: - description: Attached represents whether a volume has been successfully - attached to the VirtualMachine or not. - type: boolean - diskUUID: - description: DiskUuid represents the underlying virtual disk - UUID and is present when attachment succeeds. - type: string - error: - description: Error represents the last error seen when attaching - or detaching a volume. Error will be empty if attachment - succeeds. - type: string - name: - description: Name is the name of the volume in a VirtualMachine. - type: string - required: - - attached - - diskUUID - - error - - name - type: object - type: array - zone: - description: Zone describes the availability zone where the VirtualMachine - has been scheduled. Please note this field may be empty when the - cluster is not zone-aware. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/addons/controllers/testdata/fake_package_crd.yaml b/addons/controllers/testdata/fake_package_crd.yaml deleted file mode 100644 index 85776a7b4e..0000000000 --- a/addons/controllers/testdata/fake_package_crd.yaml +++ /dev/null @@ -1,432 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: packages.data.packaging.carvel.dev -spec: - group: data.packaging.carvel.dev - names: - kind: Package - listKind: PackageList - plural: packages - singular: package - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - capacityRequirementsDescription: - type: string - licenses: - items: - type: string - type: array - refName: - type: string - releaseNotes: - type: string - releasedAt: - format: date-time - nullable: true - type: string - template: - properties: - spec: - properties: - canceled: - description: Canceled when set to true will stop all active - changes - type: boolean - cluster: - properties: - kubeconfigSecretRef: - properties: - key: - type: string - name: - type: string - type: object - namespace: - type: string - type: object - deploy: - items: - properties: - kapp: - properties: - delete: - properties: - rawOptions: - items: - type: string - type: array - type: object - inspect: - properties: - rawOptions: - items: - type: string - type: array - type: object - intoNs: - type: string - mapNs: - items: - type: string - type: array - rawOptions: - items: - type: string - type: array - type: object - type: object - type: array - fetch: - items: - properties: - git: - properties: - lfsSkipSmudge: - type: boolean - ref: - type: string - refSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - secretRef: - description: 'Secret may include one or more keys: - ssh-privatekey, ssh-knownhosts' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - subPath: - type: string - url: - type: string - type: object - helmChart: - properties: - name: - description: 'Example: stable/redis' - type: string - repository: - properties: - secretRef: - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - url: - type: string - type: object - version: - type: string - type: object - http: - properties: - secretRef: - description: 'Secret may include one or more keys: - username, password' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - sha256: - type: string - subPath: - type: string - url: - description: 'URL can point to one of following - formats: text, tgz, zip' - type: string - type: object - image: - properties: - secretRef: - description: 'Secret may include one or more keys: - username, password, token. By default anonymous - access is used for authentication. TODO support - docker config formated secret' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - subPath: - type: string - tagSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - url: - description: 'Example: username/app1-config:v0.1.0' - type: string - type: object - imgpkgBundle: - properties: - image: - type: string - secretRef: - description: 'Secret may include one or more keys: - username, password, token. By default anonymous - access is used for authentication. TODO support - docker config formated secret' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - tagSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - type: object - inline: - properties: - paths: - additionalProperties: - type: string - type: object - pathsFrom: - items: - properties: - configMapRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - type: object - type: array - type: object - type: object - type: array - noopDelete: - description: When NoopDeletion set to true, App deletion should - delete App CR but preserve App's associated resources - type: boolean - paused: - description: Paused when set to true will ignore all pending - changes, once it set back to false, pending changes will - be applied - type: boolean - serviceAccountName: - type: string - syncPeriod: - description: Controls frequency of app reconciliation - type: string - template: - items: - properties: - helmTemplate: - properties: - name: - type: string - namespace: - type: string - path: - type: string - valuesFrom: - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - jsonnet: - description: TODO implement jsonnet - type: object - kbld: - properties: - paths: - items: - type: string - type: array - type: object - kustomize: - description: TODO implement kustomize - type: object - sops: - properties: - age: - properties: - privateKeysSecretRef: - properties: - name: - type: string - type: object - type: object - paths: - items: - type: string - type: array - pgp: - properties: - privateKeysSecretRef: - properties: - name: - type: string - type: object - type: object - type: object - ytt: - properties: - fileMarks: - items: - type: string - type: array - ignoreUnknownComments: - type: boolean - inline: - properties: - paths: - additionalProperties: - type: string - type: object - pathsFrom: - items: - properties: - configMapRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - type: object - type: array - type: object - paths: - items: - type: string - type: array - strict: - type: boolean - valuesFrom: - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - type: object - type: array - type: object - required: - - spec - type: object - valuesSchema: - description: valuesSchema can be used to show template values that - can be configured by users when a Package is installed in an OpenAPI - schema format. - properties: - openAPIv3: - nullable: true - type: object - x-kubernetes-preserve-unknown-fields: true - type: object - version: - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/addons/controllers/testdata/foobar_crd.yaml b/addons/controllers/testdata/foobar_crd.yaml deleted file mode 100644 index d6a212eafb..0000000000 --- a/addons/controllers/testdata/foobar_crd.yaml +++ /dev/null @@ -1,60 +0,0 @@ - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - name: foobars.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: FooBar - listKind: FooBarList - plural: foobars - singular: foobar - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: FooBar is the Schema for the foobars API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: FooBarSpec defines the desired state of FooBar - properties: - foo: - description: Foo is an example field of FooBar. Edit foobar_types.go - to remove/update - type: string - type: object - status: - description: FooBarStatus defines the observed state of FooBar - properties: - secretRef: - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/addons/controllers/testdata/infrastructure_dockercluster.yaml b/addons/controllers/testdata/infrastructure_dockercluster.yaml deleted file mode 100644 index 35529403a0..0000000000 --- a/addons/controllers/testdata/infrastructure_dockercluster.yaml +++ /dev/null @@ -1,478 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.8.0 - creationTimestamp: null - name: dockerclusters.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: DockerCluster - listKind: DockerClusterList - plural: dockerclusters - singular: dockercluster - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: DockerCluster is the Schema for the dockerclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server is serving. - type: string - port: - description: Port is the port on which the API server is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are not usulaly defined on the spec. The - docker provider is special since failure domains don't mean anything - in a local docker environment. Instead, the docker cluster controller - will simply copy these into the Status and allow the Cluster API - controllers to do what they will with the defined failure domains. - type: object - type: object - status: - description: DockerClusterStatus defines the observed state of DockerCluster. - properties: - conditions: - description: Conditions defines current service state of the DockerCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains don't mean much in CAPD since it's all - local, but we can see how the rest of cluster API will use this - if we populate it. - type: object - ready: - description: Ready denotes that the docker cluster (infrastructure) - is ready. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerCluster - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: DockerCluster is the Schema for the dockerclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server is serving. - type: string - port: - description: Port is the port on which the API server is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are not usulaly defined on the spec. The - docker provider is special since failure domains don't mean anything - in a local docker environment. Instead, the docker cluster controller - will simply copy these into the Status and allow the Cluster API - controllers to do what they will with the defined failure domains. - type: object - loadBalancer: - description: LoadBalancer allows defining configurations for the cluster - load balancer. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull - the haproxy image from. if not set, "kindest" will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the haproxy - image. if not set, "v20210715-a6da3463" will be used instead. - type: string - type: object - type: object - status: - description: DockerClusterStatus defines the observed state of DockerCluster. - properties: - conditions: - description: Conditions defines current service state of the DockerCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains don't mean much in CAPD since it's all - local, but we can see how the rest of cluster API will use this - if we populate it. - type: object - ready: - description: Ready denotes that the docker cluster (infrastructure) - is ready. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .metadata.labels['cluster\.x-k8s\.io/cluster-name'] - name: Cluster - type: string - - description: Time duration since creation of DockerCluster - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: DockerCluster is the Schema for the dockerclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server is serving. - type: string - port: - description: Port is the port on which the API server is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are not usulaly defined on the spec. The - docker provider is special since failure domains don't mean anything - in a local docker environment. Instead, the docker cluster controller - will simply copy these into the Status and allow the Cluster API - controllers to do what they will with the defined failure domains. - type: object - loadBalancer: - description: LoadBalancer allows defining configurations for the cluster - load balancer. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull - the haproxy image from. if not set, "kindest" will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the haproxy - image. if not set, "v20210715-a6da3463" will be used instead. - type: string - type: object - type: object - status: - description: DockerClusterStatus defines the observed state of DockerCluster. - properties: - conditions: - description: Conditions defines current service state of the DockerCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains don't mean much in CAPD since it's all - local, but we can see how the rest of cluster API will use this - if we populate it. - type: object - ready: - description: Ready denotes that the docker cluster (infrastructure) - is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/addons/controllers/testdata/test-aws-ebs-csi-config.yaml b/addons/controllers/testdata/test-aws-ebs-csi-config.yaml deleted file mode 100644 index 250c9e9396..0000000000 --- a/addons/controllers/testdata/test-aws-ebs-csi-config.yaml +++ /dev/null @@ -1,22 +0,0 @@ ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-aws-ebs-csi - namespace: default -spec: - infrastructureRef: - kind: AWSCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AwsEbsCSIConfig -metadata: - name: test-cluster-aws-ebs-csi - namespace: default -spec: - awsEBSCSIDriver: - namespace: default - deploymentReplicas: 2 diff --git a/addons/controllers/testdata/test-calico-1.yaml b/addons/controllers/testdata/test-calico-1.yaml deleted file mode 100644 index 0a6e52f218..0000000000 --- a/addons/controllers/testdata/test-calico-1.yaml +++ /dev/null @@ -1,167 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.23.2 -spec: - version: v1.23.2 - kubernetes: - version: v1.23.2 - imageRepository: foo - osImages: [] - bootstrapPackages: - - name: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.23.2 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.31.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: c-kapp-config-template-3 - cni: - refName: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: CalicoConfig - name: calico-config-template-3 ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: calico-config-template-3 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - calico: - config: - vethMTU: 0 - skipCNIBinaries: true ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: c-kapp-config-template-3 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerCluster -metadata: - name: custom-cb-docker-cluster - ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.2 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.2+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - namespace: tkg-system -spec: - refName: calico.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: calico 1.2.3 https://github.com/calico-io/calico/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema - ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-calico-1 - namespace: tkg-system - labels: - "tkg.tanzu.vmware.com/cluster-name": test-cluster-calico-1 - "run.tanzu.vmware.com/tkr": v1.23.2 - cluster-role.tkg.tanzu.vmware.com/management: "" -spec: - infrastructureRef: - kind: VSphereCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: test-cluster-calico-1-calico-package - namespace: tkg-system -spec: - calico: - config: - vethMTU: 7 - skipCNIBinaries: true diff --git a/addons/controllers/testdata/test-calico-2.yaml b/addons/controllers/testdata/test-calico-2.yaml deleted file mode 100644 index 17582f0237..0000000000 --- a/addons/controllers/testdata/test-calico-2.yaml +++ /dev/null @@ -1,166 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.23.2 -spec: - version: v1.23.2 - kubernetes: - version: v1.23.2 - imageRepository: foo - osImages: [] - bootstrapPackages: - - name: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.23.2 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.31.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: c-kapp-config-template-3 - cni: - refName: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: CalicoConfig - name: calico-config-template-3 ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: calico-config-template-3 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - calico: - config: - vethMTU: 0 - skipCNIBinaries: true ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: c-kapp-config-template-3 - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerCluster -metadata: - name: custom-cb-docker-cluster - ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.2 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.2+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.2.5--vmware.12-tkg.1 - namespace: tkg-system -spec: - refName: calico.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: calico 1.2.3 https://github.com/calico-io/calico/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-calico-2 - namespace: tkg-system - labels: - "tkg.tanzu.vmware.com/cluster-name": calico-wildcard-cb-cluster - "run.tanzu.vmware.com/tkr": v1.23.2 - cluster-role.tkg.tanzu.vmware.com/management: "" -spec: - infrastructureRef: - kind: DockerCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16"] ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: test-cluster-calico-2-calico-package - namespace: tkg-system -spec: - calico: - config: - vethMTU: 1420 - skipCNIBinaries: false diff --git a/addons/controllers/testdata/test-calico-template-config-1.yaml b/addons/controllers/testdata/test-calico-template-config-1.yaml deleted file mode 100644 index e081afb78c..0000000000 --- a/addons/controllers/testdata/test-calico-template-config-1.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: test-cluster-calico-1-calico-package - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - calico: - config: - vethMTU: 0 - skipCNIBinaries: true diff --git a/addons/controllers/testdata/test-cluster-1.yaml b/addons/controllers/testdata/test-cluster-1.yaml deleted file mode 100644 index 7d07131aac..0000000000 --- a/addons/controllers/testdata/test-cluster-1.yaml +++ /dev/null @@ -1,121 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: TanzuKubernetesRelease -metadata: - name: v1.19.3---vmware.1 - namespace: tkr-system -spec: - version: v1.19.3---vmware.1 - kubernetesVersion: 1.19.3+vmware.1 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-1 - namespace: default - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-1 - tanzuKubernetesRelease: v1.19.3---vmware.1 ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: v1.19.3---vmware.1 - namespace: tkr-system - labels: - tanzuKubernetesRelease: v1.19.3---vmware.1 -data: - bomContent: | - release: - version: v1.19.3+vmware.1 - components: - coredns: - - version: v1.7.0+vmware.5 - images: - coredns: - imagePath: coredns - tag: v1.7.0_vmware.5 - etcd: - - version: v3.4.13+vmware.4 - images: - etcd: - imagePath: etcd - tag: v3.4.13_vmware.4 - kubernetes: - - version: v1.19.3+vmware.2 - imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg - addons: - tanzu-addons-manager: - category: addons-management - clusterTypes: - - management - - workload - templatesImagePath: addons/tanzu-addons-manager-templates - templatesImageTag: 98adbf4 - vsphere-cpi: - category: cpi - clusterTypes: - - management - - workload - templatesImagePath: addons/vsphere-cpi-templates - templatesImageTag: 98adbf4 - kapp-controller: - category: addons-management - clusterTypes: - - management - - workload - templatesImagePath: addons/kapp-controller-templates - templatesImageTag: 98adbf4 - pinniped-addon: - category: authentication - clusterTypes: - - management - - workload - templatesImagePath: addons/pinniped-addon-templates - templatesImageTag: 98adbf4 - antrea: - category: cni - clusterTypes: - - management - - workload - templatesImagePath: addons/antrea-templates - templatesImageTag: 98adbf4 - calico: - category: cni - clusterTypes: - - management - - workload - templatesImagePath: addons/calico-templates - templatesImageTag: 98adbf4 - metrics-server-addon: - category: metrics - clusterTypes: - - management - - workload - templatesImagePath: addons/metrics-server-addon-templates - templatesImageTag: 98adbf4 - vsphere-csi: - category: csi - clusterTypes: - - management - - workload - templatesImagePath: addons/vsphere-csi-templates - templatesImageTag: 98adbf4 - ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-1-antrea - namespace: default - labels: - tkg.tanzu.vmware.com/addon-name: antrea - tkg.tanzu.vmware.com/cluster-name: test-cluster-1 - tkg.tanzu.vmware.com/package-name: antrea.tanzu.vmware.com.1.7.2---tkg.1-advanced -# annotations: -# tkg.tanzu.vmware.com/remote-app: "true" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: | - serviceCidr: 100.64.0.0/13 diff --git a/addons/controllers/testdata/test-cluster-2.yaml b/addons/controllers/testdata/test-cluster-2.yaml deleted file mode 100644 index f31e6fed73..0000000000 --- a/addons/controllers/testdata/test-cluster-2.yaml +++ /dev/null @@ -1,557 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: TanzuKubernetesRelease -metadata: - name: v1.20.5---vmware.1 - namespace: tkr-system -spec: - version: v1.20.5---vmware.1 - kubernetesVersion: 1.20.5+vmware.1 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-2 - namespace: default - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-2 - tanzuKubernetesRelease: v1.20.5---vmware.1 ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: v1.20.5---vmware.1 - namespace: tkr-system - labels: - tanzuKubernetesRelease: v1.20.5---vmware.1 -data: - bomContent: | - apiVersion: run.tanzu.vmware.com/v1alpha1 - release: - version: v1.20.5+vmware.1-tkg.1 - components: - antrea: - - version: v0.11.3+vmware.2 - images: - antreaImage: - imagePath: antrea/antrea-debian - tag: v0.11.3_vmware.2 - calico_all: - - version: v3.11.3+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni-plugin - tag: v3.11.3_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.11.3_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.11.3_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon - tag: v3.11.3_vmware.1 - cloud_provider_vsphere: - - version: v1.18.1+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.18.1_vmware.1 - cni_plugins: - - version: v0.8.7+vmware.6 - containerd: - - version: v1.4.3+vmware.1 - coredns: - - version: v1.7.0+vmware.8 - images: - coredns: - imagePath: coredns - tag: v1.7.0_vmware.8 - cri_tools: - - version: v1.19.0+vmware.3 - csi_attacher: - - version: v3.0.0+vmware.1 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v3.0.0_vmware.1 - csi_livenessprobe: - - version: v2.1.0+vmware.1 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v2.1.0_vmware.1 - csi_node_driver_registrar: - - version: v2.0.1+vmware.1 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v2.0.1_vmware.1 - csi_provisioner: - - version: v2.0.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v2.0.0_vmware.1 - dex: - - version: v2.27.0+vmware.1 - images: - dexImage: - imagePath: dex - tag: v2.27.0_vmware.1 - etcd: - - version: v3.4.13+vmware.7 - images: - etcd: - imagePath: etcd - tag: v3.4.13_vmware.7 - kapp-controller: - - version: v0.18.0+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.18.0_vmware.1 - kubernetes: - - version: v1.20.5+vmware.1 - images: - kubeAPIServer: - imagePath: kube-apiserver - tag: v1.20.5_vmware.1 - kubeControllerManager: - imagePath: kube-controller-manager - tag: v1.20.5_vmware.1 - kubeE2e: - imagePath: e2e-test - tag: v1.20.5_vmware.1 - kubeProxy: - imagePath: kube-proxy - tag: v1.20.5_vmware.1 - kubeScheduler: - imagePath: kube-scheduler - tag: v1.20.5_vmware.1 - pause: - imagePath: pause - tag: "3.2" - kubernetes-csi_external-resizer: - - version: v1.0.0+vmware.1 - images: - csiExternalResizer: - imagePath: kubernetes-csi_external-resizer - tag: v1.0.0_vmware.1 - kubernetes-sigs_kind: - - version: v1.20.5+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.20.5_vmware.1 - metrics-server: - - version: v0.4.0+vmware.1 - images: - metricsServerImage: - imagePath: metrics-server - tag: v0.4.0_vmware.1 - pinniped: - - version: v0.4.1+vmware.1 - images: - pinnipedImage: - imagePath: pinniped - tag: v0.4.1_vmware.1 - tanzu_core_addons: - - version: v1.3.1 - images: - antreaTemplatesImage: - imagePath: tanzu_core/addons/antrea-templates - tag: v1.3.1 - calicoTemplatesImage: - imagePath: tanzu_core/addons/calico-templates - tag: v1.3.1 - kappControllerTemplatesImage: - imagePath: tanzu_core/addons/kapp-controller-templates - tag: v1.3.1 - metricsServerTemplatesImage: - imagePath: tanzu_core/addons/metrics-server-templates - tag: v1.3.1 - pinnipedTemplatesImage: - imagePath: tanzu_core/addons/pinniped-templates - tag: v1.3.1 - tanzuAddonsManagerImage: - imagePath: tanzu_core/addons/tanzu-addons-manager - tag: v1.3.1 - tanzuAddonsManagerTemplatesImage: - imagePath: tanzu_core/addons/tanzu-addons-manager-templates - tag: v1.3.1 - tkgPinnipedPostDeployImage: - imagePath: tanzu_core/addons/tkg-pinniped-post-deploy - tag: v1.3.1 - vsphereCpiTemplatesImage: - imagePath: tanzu_core/addons/vsphere-cpi-templates - tag: v1.3.1 - vsphereCsiTemplatesImage: - imagePath: tanzu_core/addons/vsphere-csi-templates - tag: v1.3.1 - vsphere_csi_driver: - - version: v2.1.0+vmware.1 - images: - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.1.0_vmware.1 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.1.0_vmware.1 - kubeadmConfigSpec: - apiVersion: kubeadm.k8s.io/v1beta2 - kind: ClusterConfiguration - imageRepository: projects.registry.vmware.com/tkg - kubernetesVersion: v1.20.5+vmware.1 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: projects.registry.vmware.com/tkg - imageTag: v3.4.13_vmware.7 - dns: - type: CoreDNS - imageRepository: projects.registry.vmware.com/tkg - imageTag: v1.7.0_vmware.8 - ova: - - name: ova-photon-3 - osinfo: - name: photon - version: "3" - arch: amd64 - version: v1.20.5+vmware.1-tkg.1-15494591720319458065 - - name: ova-ubuntu-2004 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - version: v1.20.5+vmware.1-tkg.1-16555584836258482890 - ami: - ap-northeast-1: - - id: ami-004bfb0561ac9f948 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0f9a502482c89b4c4 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-northeast-2: - - id: ami-0b46783d8a5c6a1ae - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0800192dda71783d8 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-south-1: - - id: ami-0c46f22f0cfbccfd4 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0b63a7125e6003256 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-southeast-1: - - id: ami-068c83e7b31f80e80 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0e48b04e72cd410ee - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-southeast-2: - - id: ami-07d7880ac179d7325 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-08f52ab5cce3e1d85 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-central-1: - - id: ami-0936add11804118c1 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0a2169502f58b4bce - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-1: - - id: ami-0b2ab817821fcd487 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0d641ed2f3f4afd86 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-2: - - id: ami-0f4b71348dd7055e7 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0a7dc6f8d67f5413d - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-3: - - id: ami-0c78211071ba3b893 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0070016947f71d153 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - sa-east-1: - - id: ami-0cd023fa0f54c0f3d - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-099e20147c308a3be - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-east-1: - - id: ami-010e209639e016e60 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0352020ce32fe2a67 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-east-2: - - id: ami-0cb5417c5c9ddbf2b - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0b653a47b0f814fe0 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-gov-east-1: - - id: ami-0139f751a3fb7ec58 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0a9fb40d16f95649d - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-gov-west-1: - - id: ami-0eb2edb682faf2303 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0a131787a78527e50 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-west-2: - - id: ami-0e6bac92abe2cbcf1 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0247eab6f03299f45 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - azure: - - sku: k8s-1dot20dot5-ubuntu-1804 - publisher: vmware-inc - offer: tkg-capi - version: 2021.04.13 - thirdPartyImage: true - osinfo: - name: ubuntu - version: "18.04" - arch: amd64 - - sku: k8s-1dot20dot5-ubuntu-2004 - publisher: vmware-inc - offer: tkg-capi - version: 2021.04.13 - thirdPartyImage: true - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - imageConfig: - imageRepository: projects.registry.vmware.com/tkg - addons: - antrea: - category: cni - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - antreaTemplatesImage - addonContainerImages: - - componentRef: antrea - imageRefs: - - antreaImage - calico: - category: cni - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - calicoTemplatesImage - addonContainerImages: - - componentRef: calico_all - imageRefs: - - calicoCniImage - - calicoKubecontrollerImage - - calicoNodeImage - - calicoPodDaemonImage - kapp-controller: - category: addons-management - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - kappControllerTemplatesImage - addonContainerImages: - - componentRef: kapp-controller - imageRefs: - - kappControllerImage - metrics-server: - category: metrics - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - metricsServerTemplatesImage - addonContainerImages: - - componentRef: metrics-server - imageRefs: - - metricsServerImage - pinniped: - category: authentication - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - pinnipedTemplatesImage - addonContainerImages: - - componentRef: tanzu_core_addons - imageRefs: - - tkgPinnipedPostDeployImage - - componentRef: pinniped - imageRefs: - - pinnipedImage - tanzu-addons-manager: - category: addons-management - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - tanzuAddonsManagerTemplatesImage - addonContainerImages: - - componentRef: tanzu_core_addons - imageRefs: - - tanzuAddonsManagerImage - vsphere-cpi: - category: cpi - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - vsphereCpiTemplatesImage - addonContainerImages: - - componentRef: cloud_provider_vsphere - imageRefs: - - ccmControllerImage - vsphere-csi: - category: csi - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - vsphereCsiTemplatesImage - addonContainerImages: - - componentRef: vsphere_csi_driver - imageRefs: - - csiControllerImage - - csiMetaDataSyncerImage - - componentRef: csi_attacher - imageRefs: - - csiAttacherImage - - componentRef: csi_livenessprobe - imageRefs: - - csiLivenessProbeImage - - componentRef: csi_node_driver_registrar - imageRefs: - - csiNodeDriverRegistrarImage - - componentRef: csi_provisioner - imageRefs: - - csiProvisonerImage - - componentRef: kubernetes-csi_external-resizer - imageRefs: - - csiExternalResizer ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-2-antrea - namespace: default - labels: - tkg.tanzu.vmware.com/addon-name: antrea - tkg.tanzu.vmware.com/cluster-name: test-cluster-2 - tkg.tanzu.vmware.com/package-name: antrea.tanzu.vmware.com.1.7.2---tkg.1-advanced -# annotations: -# tkg.tanzu.vmware.com/remote-app: "true" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: | - serviceCidr: 100.64.0.0/13 diff --git a/addons/controllers/testdata/test-cluster-3.yaml b/addons/controllers/testdata/test-cluster-3.yaml deleted file mode 100644 index de950c8af4..0000000000 --- a/addons/controllers/testdata/test-cluster-3.yaml +++ /dev/null @@ -1,289 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: TanzuKubernetesRelease -metadata: - name: v1.20.6---vmware.1 - namespace: tkr-system -spec: - version: v1.20.6---vmware.1 - kubernetesVersion: 1.20.6+vmware.1 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-3 - namespace: default - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-3 - tanzuKubernetesRelease: v1.20.6---vmware.1 ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: v1.20.6---vmware.1 - namespace: tkr-system - labels: - tanzuKubernetesRelease: v1.20.6---vmware.1 -data: - bomContent: | - apiVersion: run.tanzu.vmware.com/v1alpha1 - release: - version: v1.20.6+vmware.1-tkg.1 - components: - tkg-core-packages: - - version: v1.4.0+vmware.0 - images: - tanzuCorePackageRepositoryImage: - imagePath: tanzu_core_repo/core-package-repository - tag: v1.4.0+vmware.0 - antrea.vmware.com: - imagePath: tanzu_core/addons/antrea-package - tag: v1.4.0+vmware.1 - calico.vmware.com: - imagePath: tanzu_core/addons/calico-package - tag: v1.4.0+vmware.1 - kapp-controller.vmware.com: - imagePath: tanzu_core/addons/kapp-controller-package - tag: v1.4.0+vmware.1 - metrics-server.vmware.com: - imagePath: tanzu_core/addons/metrics-server-package - tag: v1.4.0+vmware.1 - pinniped.vmware.com: - imagePath: tanzu_core/addons/pinniped-package - tag: v1.4.0+vmware.1 - tanzu-addons-manager.vmware.com: - imagePath: tanzu_core/addons/tanzu-addons-manager - tag: v1.4.0+vmware.1 - vsphere-cpi.vmware.com: - imagePath: tanzu_core/addons/vsphere-cpi-package - tag: v1.4.0+vmware.1 - vsphere-csi.vmware.com: - imagePath: tanzu_core/addons/vsphere-csi-package - tag: v1.4.0+vmware.1 - antrea: - - version: v0.11.3+vmware.2 - images: - antreaImage: - imagePath: antrea/antrea-debian - tag: v0.11.3_vmware.2 - calico_all: - - version: v3.11.3+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni-plugin - tag: v3.11.3_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.11.3_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.11.3_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon - tag: v3.11.3_vmware.1 - cloud_provider_vsphere: - - version: v1.18.1+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.18.1_vmware.1 - cni_plugins: - - version: v0.8.7+vmware.6 - containerd: - - version: v1.4.3+vmware.1 - coredns: - - version: v1.7.0+vmware.8 - images: - coredns: - imagePath: coredns - tag: v1.7.0_vmware.8 - cri_tools: - - version: v1.19.0+vmware.3 - csi_attacher: - - version: v3.0.0+vmware.1 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v3.0.0_vmware.1 - csi_livenessprobe: - - version: v2.1.0+vmware.1 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v2.1.0_vmware.1 - csi_node_driver_registrar: - - version: v2.0.1+vmware.1 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v2.0.1_vmware.1 - csi_provisioner: - - version: v2.0.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v2.0.0_vmware.1 - dex: - - version: v2.27.0+vmware.1 - images: - dexImage: - imagePath: dex - tag: v2.27.0_vmware.1 - etcd: - - version: v3.4.13+vmware.7 - images: - etcd: - imagePath: etcd - tag: v3.4.13_vmware.7 - kapp-controller: - - version: v0.18.0+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.18.0_vmware.1 - kubernetes: - - version: v1.20.6+vmware.1 - images: - kubeAPIServer: - imagePath: kube-apiserver - tag: v1.20.6_vmware.1 - kubeControllerManager: - imagePath: kube-controller-manager - tag: v1.20.6_vmware.1 - kubeE2e: - imagePath: e2e-test - tag: v1.20.6_vmware.1 - kubeProxy: - imagePath: kube-proxy - tag: v1.20.6_vmware.1 - kubeScheduler: - imagePath: kube-scheduler - tag: v1.20.6_vmware.1 - pause: - imagePath: pause - tag: "3.2" - kubernetes-csi_external-resizer: - - version: v1.0.0+vmware.1 - images: - csiExternalResizer: - imagePath: kubernetes-csi_external-resizer - tag: v1.0.0_vmware.1 - kubernetes-sigs_kind: - - version: v1.20.6+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.20.6_vmware.1 - metrics-server: - - version: v0.4.0+vmware.1 - images: - metricsServerImage: - imagePath: metrics-server - tag: v0.4.0_vmware.1 - pinniped: - - version: v0.4.1+vmware.1 - images: - pinnipedImage: - imagePath: pinniped - tag: v0.4.1_vmware.1 - tanzu_core_addons: - - version: v1.3.1 - images: - tanzuAddonsManagerImage: - imagePath: tanzu_core/addons/tanzu-addons-manager - tag: v1.3.1 - tkgPinnipedPostDeployImage: - imagePath: tanzu_core/addons/tkg-pinniped-post-deploy - tag: v1.3.1 - vsphere_csi_driver: - - version: v2.1.0+vmware.1 - images: - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.1.0_vmware.1 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.1.0_vmware.1 - imageConfig: - imageRepository: projects.registry.vmware.com/tkg - addons: - antrea: - category: cni - clusterTypes: - - management - - workload - packageName: antrea.vmware.com - calico: - category: cni - clusterTypes: - - management - - workload - addonTemplatesImage: - packageName: calico.vmware.com - kapp-controller: - category: addons-management - clusterTypes: - - management - - workload - packageName: kapp-controller.vmware.com - metrics-server: - category: metrics - clusterTypes: - - management - - workload - packageName: metrics-server.vmware.com - pinniped: - category: authentication - clusterTypes: - - management - - workload - packageName: pinniped.vmware.com - tanzu-addons-manager: - category: addons-management - clusterTypes: - - management - - workload - packageName: tanzu-addons-manager.vmware.com - vsphere-cpi: - category: cpi - clusterTypes: - - management - - workload - packageName: vsphere-cpi.vmware.com - vsphere-csi: - category: csi - clusterTypes: - - management - - workload - packageName: vsphere-csi.vmware.com ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-3-antrea - namespace: default - labels: - tkg.tanzu.vmware.com/addon-name: antrea - tkg.tanzu.vmware.com/cluster-name: test-cluster-3 - tkg.tanzu.vmware.com/package-name: antrea.tanzu.vmware.com.1.7.2---tkg.1-advanced -# annotations: -# tkg.tanzu.vmware.com/remote-app: "true" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: | - serviceCidr: 100.64.0.0/13 ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-3-kapp-controller - namespace: default - labels: - tkg.tanzu.vmware.com/addon-name: kapp-controller - tkg.tanzu.vmware.com/cluster-name: test-cluster-3 - annotations: - tkg.tanzu.vmware.com/remote-app: "true" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: | - namespace: kapp-controller-ns diff --git a/addons/controllers/testdata/test-cluster-bootstrap-1.yaml b/addons/controllers/testdata/test-cluster-bootstrap-1.yaml deleted file mode 100644 index 785121e9f2..0000000000 --- a/addons/controllers/testdata/test-cluster-bootstrap-1.yaml +++ /dev/null @@ -1,636 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: cluster-namespace ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-tcbt - namespace: cluster-namespace - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-tcbt - run.tanzu.vmware.com/tkr: v1.22.3 -spec: - infrastructureRef: - kind: VSphereCluster - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: test-cluster-tcbt - namespace: cluster-namespace - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: test-cluster-tcbt-control-plane - namespace: cluster-namespace - topology: - class: test-clusterclass-tcbt - version: v1.22.3 - variables: - - name: tkg.tanzu.vmware.com/tkg-ip-family - value: "ipv4" - - name: proxy - value: - httpProxy: "foo.com" - httpsProxy: "bar.com" - noProxy: - - "foobar.com" - - "google.com" - - name: trust - value: - additionalTrustedCAs: - - name: CompanyInternalCA-1 - data: aGVsbG8= - - name: CompanyInternalCA-2 - data: bHWtcH9= - - name: skipTLSVerify - value: - - registry1 - - registry2 ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - name: test-cluster-tcbt-control-plane - namespace: cluster-namespace - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - kind: Cluster - name: test-cluster-tcbt - uid: bd834522-d9a5-4841-beac-991ff3798c01 -spec: - kubeadmConfigSpec: {} - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: test-cluster-tcbt-control-plane - namespace: cluster-namespace - replicas: 3 - version: v1.22.3 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: test-cluster-tcbt - namespace: cluster-namespace -spec: - identityRef: - kind: Secret - name: test-cluster-tcbt - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: test-cluster-tcbt-control-plane - namespace: cluster-namespace -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-tcbt - namespace: cluster-namespace -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.example.com.1.17.2 - namespace: cluster-namespace -spec: - refName: foobar.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar3.example.com.1.17.2 - namespace: cluster-namespace -spec: - refName: foobar3.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar3 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar3.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar1.example.com.1.17.2 - namespace: cluster-namespace -spec: - refName: foobar1.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar1 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar1.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar1.example.com.1.18.2 - namespace: cluster-namespace -spec: - refName: foobar1.example.com - version: 1.18.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar1 1.18.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar1.example.com.1.18.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar2.example.com.1.18.2 - namespace: cluster-namespace -spec: - refName: foobar2.example.com - version: 1.18.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar2 1.18.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar2.example.com.1.18.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.0 - namespace: cluster-namespace -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.0+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.2 - namespace: cluster-namespace -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.2 - releaseNotes: kapp-controller 0.30.2 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.2_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.2+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.1 - namespace: cluster-namespace -spec: - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.1 - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v3.19.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.5-zshippable - namespace: cluster-namespace -spec: - valuesSchema: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.5-zshippable values schema - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.5-zshippable - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/calico:v3.19.1_vmware.1-tkg.5-zshippable - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-03-07T10:53:29Z" ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - namespace: cluster-namespace -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.4-tkg.2-advanced-zshippable - namespace: cluster-namespace -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.4-tkg.2-advanced-zshippable - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/antrea:v1.2.3_vmware.4-tkg.2-advanced-zshippable - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-03-07T10:53:29Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.4-tkg.2-advanced-zshippable values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 - namespace: cluster-namespace -spec: - refName: vsphere-cpi.tanzu.vmware.com - version: 1.22.3+vmware.1-tkg.1 - releaseNotes: vsphere-cpi 1.22.3 https://github.com/kubernetes/cloud-provider-vsphere - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/vsphere-cpi:v1.22.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: vsphere-csi.community.tanzu.vmware.com.2.4.1 - namespace: cluster-namespace -spec: - refName: vsphere-csi.community.tanzu.vmware.com - version: 2.4.1 - releaseNotes: "vsphere-csi 2.4.1-rc.1 https://github.com/kubernetes-sigs/vsphere-csi-driver/releases/tag/v2.4.1-rc.1" - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects.registry.vmware.com/tce/vsphere-csi@sha256:c615f4a95de0161f244f644cfb512449ef8b2c233e63541d16fa44bcd7bd28b6 - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: {} ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.5.2--vmware.3-tkg.1-advanced-zshippable - namespace: cluster-namespace -spec: - refName: antrea.tanzu.vmware.com - version: 1.5.2+vmware.3-tkg.1-advanced-zshippable - releaseNotes: antrea 1.5.3 https://github.com/antrea-io/antrea/releases/tag/v1.5.2 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:1.5.2+vmware.3-tkg.1-advanced-zshippable - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.5.2+vmware.3-tkg.1-advanced-zshippable values schema diff --git a/addons/controllers/testdata/test-cluster-bootstrap-10.yaml b/addons/controllers/testdata/test-cluster-bootstrap-10.yaml deleted file mode 100644 index 465b903432..0000000000 --- a/addons/controllers/testdata/test-cluster-bootstrap-10.yaml +++ /dev/null @@ -1,966 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: cluster-namespace-10 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.25.5-custom -spec: - version: v1.25.5 - kubernetes: - version: v1.25.5 - imageRepository: foo - osImages: [] - bootstrapPackages: - - name: kapp-controller.tanzu.vmware.com.0.32.11 - - name: antrea.tanzu.vmware.com.1.11.7--vmware.1-tkg.2 - - name: calico.tanzu.vmware.com.1.3.7--vmware.1-tkg.1 - - name: pinniped.tanzu.vmware.com.0.13.3--vmware.1-tkg.1 - - name: foobar.tanzu.vmware.com.0.2.4--vmware.1-tkg.1 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.25.5-custom - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.32.11 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: kapp-config-custom-1 - cni: - refName: antrea.tanzu.vmware.com.1.11.7--vmware.1-tkg.2 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: antrea-config-custom-1 - additionalPackages: - - refName: pinniped.tanzu.vmware.com.0.13.3--vmware.1-tkg.1 - valuesFrom: - secretRef: default-pinniped-config-v1.23.6---vmware.1-tkg.1 - - refName: foobar.tanzu.vmware.com.0.2.4--vmware.1-tkg.1 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.25.6-custom -spec: - version: v1.25.6 - kubernetes: - version: v1.25.6 - imageRepository: foo - osImages: [] - bootstrapPackages: - - name: kapp-controller.tanzu.vmware.com.0.32.12 - - name: antrea.tanzu.vmware.com.1.11.8--vmware.1-tkg.2 - - name: calico.tanzu.vmware.com.1.3.8--vmware.1-tkg.1 - - name: pinniped.tanzu.vmware.com.0.13.4--vmware.1-tkg.1 - - name: foobar.tanzu.vmware.com.0.2.5--vmware.1-tkg.1 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.25.6-custom - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.32.12 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: kapp-config-custom-1 - cni: - refName: antrea.tanzu.vmware.com.1.11.8--vmware.1-tkg.2 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: antrea-config-custom-1 - additionalPackages: - - refName: pinniped.tanzu.vmware.com.0.13.4--vmware.1-tkg.1 - valuesFrom: - secretRef: default-pinniped-config-v1.23.7---vmware.1-tkg.1 - - refName: foobar.tanzu.vmware.com.0.2.5--vmware.1-tkg.1 - valuesFrom: - inline: - key1: value1 - key2: - key3: value3 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.32.11 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.32.11 - releaseNotes: kapp-controller 0.32.11 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.32.11_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.32.11+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.32.11 - namespace: cluster-namespace-10 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.32.11 - releaseNotes: kapp-controller 0.32.11 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.32.11_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.32.11+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.32.12 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.32.12 - releaseNotes: kapp-controller 0.32.12 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.32.12_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.32.12+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.32.12 - namespace: cluster-namespace-10 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.32.12 - releaseNotes: kapp-controller 0.32.12 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.32.12_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.32.12+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.11.7--vmware.1-tkg.2 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.11.7+vmware.1-tkg.1 - releaseNotes: antrea 1.11.7 https://github.com/antrea-io/antrea/releases/tag/v1.11.7 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.11.7_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.11.7+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.11.7--vmware.1-tkg.2 - namespace: cluster-namespace-10 -spec: - refName: antrea.tanzu.vmware.com - version: 1.11.7+vmware.1-tkg.1 - releaseNotes: antrea 1.11.7 https://github.com/antrea-io/antrea/releases/tag/v1.11.7 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.11.7_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.11.7+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.11.8--vmware.1-tkg.2 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.11.8+vmware.1-tkg.1 - releaseNotes: antrea 1.11.8 https://github.com/antrea-io/antrea/releases/tag/v1.11.8 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.11.8_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.11.8+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.11.8--vmware.1-tkg.2 - namespace: cluster-namespace-10 -spec: - refName: antrea.tanzu.vmware.com - version: 1.11.8+vmware.1-tkg.1 - releaseNotes: antrea 1.11.8 https://github.com/antrea-io/antrea/releases/tag/v1.11.8 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.11.8_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.11.8+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.3.7--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: calico.tanzu.vmware.com - version: 1.3.7+vmware.1-tkg.1 - releaseNotes: calico 1.3.7 https://github.com/calico-io/calico/releases/tag/v1.3.7 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.3.7_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.3.7+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.3.7--vmware.1-tkg.1 - namespace: cluster-namespace-10 -spec: - refName: calico.tanzu.vmware.com - version: 1.3.7+vmware.1-tkg.1 - releaseNotes: calico 1.3.7 https://github.com/calico-io/calico/releases/tag/v1.3.7 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.3.7_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.3.7+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.3.8--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: calico.tanzu.vmware.com - version: 1.3.8+vmware.1-tkg.1 - releaseNotes: calico 1.3.8 https://github.com/calico-io/calico/releases/tag/v1.3.8 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.3.8_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.3.8+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.3.8--vmware.1-tkg.1 - namespace: cluster-namespace-10 -spec: - refName: calico.tanzu.vmware.com - version: 1.3.7+vmware.1-tkg.1 - releaseNotes: calico 1.3.7 https://github.com/calico-io/calico/releases/tag/v1.3.7 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.3.7_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.3.8+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: pinniped.tanzu.vmware.com.0.13.3--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: pinniped.tanzu.vmware.com - version: 0.13.3+vmware.1-tkg.1 - releaseNotes: pinniped 0.13.3 https://github.com/vmware-tanzu/pinniped/releases/tag/v0.13.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/pinniped:v0.13.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: pinniped.tanzu.vmware.com.0.13.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: pinniped.tanzu.vmware.com.0.13.3--vmware.1-tkg.1 - namespace: cluster-namespace-10 -spec: - refName: pinniped.tanzu.vmware.com - version: 0.13.3+vmware.1-tkg.1 - releaseNotes: pinniped 0.13.3 https://github.com/vmware-tanzu/pinniped/releases/tag/v0.13.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/pinniped:v0.13.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: pinniped.tanzu.vmware.com.0.13.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: pinniped.tanzu.vmware.com.0.13.4--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: pinniped.tanzu.vmware.com - version: 0.13.4+vmware.1-tkg.1 - releaseNotes: pinniped 0.13.4 https://github.com/vmware-tanzu/pinniped/releases/tag/v0.13.4 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/pinniped:v0.13.4_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: pinniped.tanzu.vmware.com.0.13.4+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: pinniped.tanzu.vmware.com.0.13.4--vmware.1-tkg.1 - namespace: cluster-namespace-10 -spec: - refName: pinniped.tanzu.vmware.com - version: 0.13.4+vmware.1-tkg.1 - releaseNotes: pinniped 0.13.4 https://github.com/vmware-tanzu/pinniped/releases/tag/v0.13.4 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/pinniped:v0.13.4_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: pinniped.tanzu.vmware.com.0.13.4+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.tanzu.vmware.com.0.2.4--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: foobar.tanzu.vmware.com - version: 0.2.4+vmware.1-tkg.1 - releaseNotes: foobar 0.2.4 https://github.com/vmware-tanzu/foobar/releases/tag/v0.2.4 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/foobar:v0.2.4_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: foobar.tanzu.vmware.com.0.2.4+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.tanzu.vmware.com.0.2.4--vmware.1-tkg.1 - namespace: cluster-namespace-10 -spec: - refName: foobar.tanzu.vmware.com - version: 0.2.4+vmware.1-tkg.1 - releaseNotes: foobar 0.2.4 https://github.com/vmware-tanzu/foobar/releases/tag/v0.2.4 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/foobar:v0.2.4_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: foobar.tanzu.vmware.com.0.2.4+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.tanzu.vmware.com.0.2.5--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: foobar.tanzu.vmware.com - version: 0.2.5+vmware.1-tkg.1 - releaseNotes: foobar 0.2.5 https://github.com/vmware-tanzu/foobar/releases/tag/v0.2.5 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/foobar:v0.2.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: foobar.tanzu.vmware.com.0.2.5+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.tanzu.vmware.com.0.2.5--vmware.1-tkg.1 - namespace: cluster-namespace-10 -spec: - refName: foobar.tanzu.vmware.com - version: 0.2.5+vmware.1-tkg.1 - releaseNotes: foobar 0.2.5 https://github.com/vmware-tanzu/foobar/releases/tag/v0.2.5 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/foobar:v0.2.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: foobar.tanzu.vmware.com.0.2.5+vmware.1-tkg.1 values schema ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: antrea-config-custom-1 - namespace: tkg-system -spec: - antrea: - config: - trafficEncapMode: encap - noSNAT: false - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - disableUdpTunnelOffload: false - featureGates: - AntreaProxy: true - EndpointSlice: true - AntreaPolicy: true - NodePortLocal: false - AntreaTraceflow: true - Egress: false - FlowExporter: false ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: kapp-config-custom-1 - namespace: tkg-system -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -apiVersion: v1 -kind: Secret -metadata: - name: default-pinniped-config-v1.23.6---vmware.1-tkg.1 - namespace: tkg-system -stringData: - values.yaml: | - infrastructure_provider: vsphere - identity_management_type: none - tkg_cluster_role: workload ---- -apiVersion: v1 -kind: Secret -metadata: - name: default-pinniped-config-v1.23.7---vmware.1-tkg.1 - namespace: cluster-namespace-10 -stringData: - values.yaml: | - infrastructure_provider: vsphere - identity_management_type: none - tkg_cluster_role: workload ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-10 - namespace: cluster-namespace-10 - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-10 - run.tanzu.vmware.com/tkr: v1.25.5-custom -spec: - infrastructureRef: - kind: VSphereCluster - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: test-cluster-10 - namespace: cluster-namespace-10 - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: test-cluster-10 - namespace: cluster-namespace-10 -spec: - identityRef: - kind: Secret - name: test-cluster-tcbt-5 - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: test-cluster-10 - namespace: cluster-namespace-10 -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-tcbt-5 - namespace: cluster-namespace-10 -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local diff --git a/addons/controllers/testdata/test-cluster-bootstrap-2.yaml b/addons/controllers/testdata/test-cluster-bootstrap-2.yaml deleted file mode 100644 index a415395f99..0000000000 --- a/addons/controllers/testdata/test-cluster-bootstrap-2.yaml +++ /dev/null @@ -1,466 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: cluster-namespace-2 ---- -apiVersion: vmoperator.vmware.com/v1alpha1 -kind: VirtualMachine -metadata: - name: test-tkgs-virtual-machine - namespace: cluster-namespace-2 - labels: - capv.vmware.com/cluster.name: test-cluster-tcbt-2 -spec: - powerState: "poweredOn" - className: "VirtualMachineClass" - imageName: "VirtualMachineImage" ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-tcbt-2 - namespace: cluster-namespace-2 - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-tcbt-2 - run.tanzu.vmware.com/tkr: v1.22.4 -spec: - infrastructureRef: - kind: VSphereCluster - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: test-cluster-tcbt-2 - namespace: cluster-namespace-2 - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: test-cluster-tcbt-2 - namespace: cluster-namespace-2 -spec: - identityRef: - kind: Secret - name: test-cluster-tcbt-2 - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: test-cluster-tcbt-2-control-plane - namespace: cluster-namespace-2 -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.4+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-tcbt-2 - namespace: cluster-namespace-2 -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.example.com.1.17.2 - namespace: cluster-namespace-2 -spec: - refName: foobar.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar1.example.com.1.17.2 - namespace: cluster-namespace-2 -spec: - refName: foobar1.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar1 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar1.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar2.example.com.1.18.2 - namespace: cluster-namespace-2 -spec: - refName: foobar2.example.com - version: 1.18.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar2 1.18.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar2.example.com.1.18.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.3 - namespace: cluster-namespace-2 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.1 - releaseNotes: kapp-controller 0.30.1 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.1 - namespace: cluster-namespace-2 -spec: - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.1 - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v3.19.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - namespace: cluster-namespace-2 -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 - namespace: cluster-namespace-2 -spec: - refName: vsphere-cpi.tanzu.vmware.com - version: 1.22.3+vmware.1-tkg.1 - releaseNotes: vsphere-cpi 1.22.3 https://github.com/kubernetes/cloud-provider-vsphere - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/vsphere-cpi:v1.22.4_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 values schema ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.22.4 -spec: - version: v1.22.4 - kubernetes: - version: v1.22.4 - imageRepository: foo - osImages: [] - bootstrapPackages: [] ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.22.4 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.30.3 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-cluster-tcbt-2-kapp-controller-config - additionalPackages: - - refName: foobar1.example.com.1.17.2 - valuesFrom: - secretRef: foobar2secret - - refName: foobar2.example.com.1.18.2 - cni: - refName: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: test-cluster-tcbt-2 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.3 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.1 - releaseNotes: kapp-controller 0.30.1 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.3+vmware.1-tkg.1 values schema ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: test-cluster-tcbt-2-kapp-controller-config - namespace: tkg-system -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -kind: Secret -metadata: - name: foobar2secret - namespace: tkg-system -stringData: - values.yaml: | - sample-key: sample-value ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: test-cluster-tcbt-2 - namespace: tkg-system -spec: - antrea: - config: - trafficEncapMode: encap ---- diff --git a/addons/controllers/testdata/test-cluster-bootstrap-3.yaml b/addons/controllers/testdata/test-cluster-bootstrap-3.yaml deleted file mode 100644 index 9e47d98dcf..0000000000 --- a/addons/controllers/testdata/test-cluster-bootstrap-3.yaml +++ /dev/null @@ -1,245 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.23 -spec: - version: v1.23 - kubernetes: - version: v1.23 - imageRepository: foo - osImages: [] - bootstrapPackages: [] ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.23 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.31.0 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-cluster-tcbt-2-kapp-controller-config - cni: - refName: antrea.tanzu.vmware.com.1.2.5--vmware.1-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: test-cluster-tcbt-3 ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: test-cluster-tcbt-3 - namespace: tkg-system -spec: - antrea: - config: - trafficEncapMode: encap ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-tcbt-3 - namespace: cluster-namespace-3 - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-tcbt-3 - run.tanzu.vmware.com/tkr: v1.23 -spec: - infrastructureRef: - kind: VSphereCluster - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: test-cluster-tcbt-3 - namespace: cluster-namespace-3 - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: test-cluster-tcbt-3 - namespace: cluster-namespace-3 -spec: - identityRef: - kind: Secret - name: test-cluster-tcbt-3 - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: test-cluster-tcbt-3-control-plane - namespace: cluster-namespace-3 -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-tcbt-3 - namespace: cluster-namespace-3 -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.0 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.0+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.5--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.0 - namespace: cluster-namespace-3 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.0+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.5--vmware.1-tkg.1 - namespace: cluster-namespace-3 -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.5+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.5+vmware.1-tkg.1 values schema diff --git a/addons/controllers/testdata/test-cluster-bootstrap-4.yaml b/addons/controllers/testdata/test-cluster-bootstrap-4.yaml deleted file mode 100644 index 9f1e0bccd9..0000000000 --- a/addons/controllers/testdata/test-cluster-bootstrap-4.yaml +++ /dev/null @@ -1,226 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.25 -spec: - version: v1.25 - kubernetes: - version: v1.25 - imageRepository: foo - osImages: [] - bootstrapPackages: [] ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.25 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.31.8 - cni: - refName: antrea.tanzu.vmware.com.1.10.5--vmware.1-tkg.1 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-4 - namespace: cluster-namespace-4 - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-4 - run.tanzu.vmware.com/tkr: v1.25 -spec: - infrastructureRef: - kind: VSphereCluster - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: test-cluster-4 - namespace: cluster-namespace-4 - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: test-cluster-4 - namespace: cluster-namespace-4 -spec: - identityRef: - kind: Secret - name: test-cluster-tcbt-4 - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-tcbt-4 - namespace: cluster-namespace-4 -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: test-cluster-4 - namespace: cluster-namespace-4 -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.8 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.8 - releaseNotes: kapp-controller 0.31.8 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.8+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.8 - namespace: cluster-namespace-4 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.8 - releaseNotes: kapp-controller 0.31.8 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.8+vmware.1-tkg.1 values schema - - ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.10.5--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.10.5+vmware.1-tkg.1 - releaseNotes: antrea 1.10.5 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.10.5+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.10.5--vmware.1-tkg.1 - namespace: cluster-namespace-4 -spec: - refName: antrea.tanzu.vmware.com - version: 1.10.5+vmware.1-tkg.1 - releaseNotes: antrea 1.10.5 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.10.5+vmware.1-tkg.1 values schema diff --git a/addons/controllers/testdata/test-cluster-bootstrap-5.yaml b/addons/controllers/testdata/test-cluster-bootstrap-5.yaml deleted file mode 100644 index 9f84c9408e..0000000000 --- a/addons/controllers/testdata/test-cluster-bootstrap-5.yaml +++ /dev/null @@ -1,240 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.25.1 -spec: - version: v1.25.1 - kubernetes: - version: v1.25.1 - imageRepository: foo - osImages: [] - bootstrapPackages: [] ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.25.1 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.31.9 - cni: - refName: antrea.tanzu.vmware.com.1.10.5--vmware.1-tkg.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: FooBar - name: foobar-5 - ---- -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: FooBar -metadata: - name: foobar-5 - namespace: tkg-system -spec: - foo: bar ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-5 - namespace: cluster-namespace-5 - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-5 - run.tanzu.vmware.com/tkr: v1.25.1 -spec: - infrastructureRef: - kind: VSphereCluster - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: test-cluster-5 - namespace: cluster-namespace-5 - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: test-cluster-5 - namespace: cluster-namespace-5 -spec: - identityRef: - kind: Secret - name: test-cluster-tcbt-5 - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: test-cluster-5 - namespace: cluster-namespace-5 -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-tcbt-5 - namespace: cluster-namespace-5 -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.9 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.9 - releaseNotes: kapp-controller 0.31.9 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.9+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.31.9 - namespace: cluster-namespace-5 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.31.9 - releaseNotes: kapp-controller 0.31.9 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.31.9+vmware.1-tkg.1 values schema - - ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.10.5--vmware.1-tkg.2 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.10.5+vmware.1-tkg.1 - releaseNotes: antrea 1.10.5 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.10.5+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.10.5--vmware.1-tkg.2 - namespace: cluster-namespace-5 -spec: - refName: antrea.tanzu.vmware.com - version: 1.10.5+vmware.1-tkg.1 - releaseNotes: antrea 1.10.5 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.10.5+vmware.1-tkg.1 values schema diff --git a/addons/controllers/testdata/test-cluster-bootstrap-6.yaml b/addons/controllers/testdata/test-cluster-bootstrap-6.yaml deleted file mode 100644 index 35bca79949..0000000000 --- a/addons/controllers/testdata/test-cluster-bootstrap-6.yaml +++ /dev/null @@ -1,638 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: cluster-namespace-6 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-6 - namespace: cluster-namespace-6 - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-6 - run.tanzu.vmware.com/tkr: v1.22.3 - annotations: - tkg.tanzu.vmware.com/custom-clusterbootstrap : "" -spec: - infrastructureRef: - kind: VSphereCluster - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: test-cluster-6 - namespace: cluster-namespace-6 - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: test-cluster-6-control-plane - namespace: cluster-namespace-6 - topology: - class: test-clusterclass-tcbt - version: v1.22.3 - variables: - - name: tkg.tanzu.vmware.com/tkg-ip-family - value: "ipv4" - - name: proxy - value: - httpProxy: "foo.com" - httpsProxy: "bar.com" - noProxy: - - "foobar.com" - - "google.com" - - name: trust - value: - additionalTrustedCAs: - - name: CompanyInternalCA-1 - data: aGVsbG8= - - name: CompanyInternalCA-2 - data: bHWtcH9= - - name: skipTLSVerify - value: - - registry1 - - registry2 ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - name: test-cluster-6-control-plane - namespace: cluster-namespace-6 - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - kind: Cluster - name: test-cluster-6 - uid: bd834522-d9a5-4841-beac-991ff3798c01 -spec: - kubeadmConfigSpec: {} - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: test-cluster-6-control-plane - namespace: cluster-namespace-6 - replicas: 3 - version: v1.22.3 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: test-cluster-6 - namespace: cluster-namespace-6 -spec: - identityRef: - kind: Secret - name: test-cluster-6 - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: test-cluster-6-control-plane - namespace: cluster-namespace-6 -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-6 - namespace: cluster-namespace-6 -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.example.com.1.17.2 - namespace: cluster-namespace-6 -spec: - refName: foobar.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar3.example.com.1.17.2 - namespace: cluster-namespace-6 -spec: - refName: foobar3.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar3 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar3.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar1.example.com.1.17.2 - namespace: cluster-namespace-6 -spec: - refName: foobar1.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar1 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar1.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar1.example.com.1.18.2 - namespace: cluster-namespace-6 -spec: - refName: foobar1.example.com - version: 1.18.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar1 1.18.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar1.example.com.1.18.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar2.example.com.1.18.2 - namespace: cluster-namespace-6 -spec: - refName: foobar2.example.com - version: 1.18.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar2 1.18.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar2.example.com.1.18.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.0 - namespace: cluster-namespace-6 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.0+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.2 - namespace: cluster-namespace-6 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.2 - releaseNotes: kapp-controller 0.30.2 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.2_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.2+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.1 - namespace: cluster-namespace-6 -spec: - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.1 - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v3.19.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.5-zshippable - namespace: cluster-namespace-6 -spec: - valuesSchema: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.5-zshippable values schema - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.5-zshippable - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/calico:v3.19.1_vmware.1-tkg.5-zshippable - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-03-07T10:53:29Z" ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - namespace: cluster-namespace-6 -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.4-tkg.2-advanced-zshippable - namespace: cluster-namespace-6 -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.4-tkg.2-advanced-zshippable - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/antrea:v1.2.3_vmware.4-tkg.2-advanced-zshippable - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-03-07T10:53:29Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.4-tkg.2-advanced-zshippable values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 - namespace: cluster-namespace-6 -spec: - refName: vsphere-cpi.tanzu.vmware.com - version: 1.22.3+vmware.1-tkg.1 - releaseNotes: vsphere-cpi 1.22.3 https://github.com/kubernetes/cloud-provider-vsphere - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/vsphere-cpi:v1.22.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: vsphere-csi.community.tanzu.vmware.com.2.4.1 - namespace: cluster-namespace-6 -spec: - refName: vsphere-csi.community.tanzu.vmware.com - version: 2.4.1 - releaseNotes: "vsphere-csi 2.4.1-rc.1 https://github.com/kubernetes-sigs/vsphere-csi-driver/releases/tag/v2.4.1-rc.1" - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects.registry.vmware.com/tce/vsphere-csi@sha256:c615f4a95de0161f244f644cfb512449ef8b2c233e63541d16fa44bcd7bd28b6 - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: {} ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.5.2--vmware.3-tkg.1-advanced-zshippable - namespace: cluster-namespace-6 -spec: - refName: antrea.tanzu.vmware.com - version: 1.5.2+vmware.3-tkg.1-advanced-zshippable - releaseNotes: antrea 1.5.3 https://github.com/antrea-io/antrea/releases/tag/v1.5.2 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:1.5.2+vmware.3-tkg.1-advanced-zshippable - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.5.2+vmware.3-tkg.1-advanced-zshippable values schema diff --git a/addons/controllers/testdata/test-cluster-bootstrap-7.yaml b/addons/controllers/testdata/test-cluster-bootstrap-7.yaml deleted file mode 100644 index e63db9196b..0000000000 --- a/addons/controllers/testdata/test-cluster-bootstrap-7.yaml +++ /dev/null @@ -1,525 +0,0 @@ ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-7 - namespace: cluster-namespace-7 - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-7 - run.tanzu.vmware.com/tkr: v1.22.5 -spec: - infrastructureRef: - kind: VSphereCluster - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: test-cluster-7 - namespace: cluster-namespace-7 - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: test-cluster-7 - namespace: cluster-namespace-7 -spec: - identityRef: - kind: Secret - name: test-cluster-7 - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: test-cluster-7-control-plane - namespace: cluster-namespace-7 -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.5+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-7 - namespace: cluster-namespace-7 -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: cpi.tanzu.vmware.com.0.0.4 - namespace: cluster-namespace-7 -spec: - refName: cpi.tanzu.vmware.com - version: 0.0.4+vmware.1-tkg.1 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: lb 0.0.4 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: cpi.tanzu.vmware.com.0.0.4+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMwares End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kube-vip-cloud-provider:v0.0.4_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: cpi.tanzu.vmware.com.0.0.4 - namespace: tkg-system -spec: - refName: cpi.tanzu.vmware.com - version: 0.0.4+vmware.1-tkg.1 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: lb 0.0.4 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: cpi.tanzu.vmware.com.0.0.4+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMwares End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kube-vip-cloud-provider:v0.0.4_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.23 - namespace: cluster-namespace-7 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.23 - releaseNotes: kapp-controller 0.30.23 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.23_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.23+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.1 - namespace: cluster-namespace-7 -spec: - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.1 - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v3.19.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - namespace: cluster-namespace-7 -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 - namespace: cluster-namespace-7 -spec: - refName: vsphere-cpi.tanzu.vmware.com - version: 1.22.3+vmware.1-tkg.1 - releaseNotes: vsphere-cpi 1.22.3 https://github.com/kubernetes/cloud-provider-vsphere - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/vsphere-cpi:v1.22.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 values schema ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.22.5 -spec: - version: v1.22.5 - kubernetes: - version: v1.22.5 - imageRepository: foo - osImages: [] - bootstrapPackages: [] ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.23 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.23 - releaseNotes: kapp-controller 0.30.23 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.23_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.23+vmware.1-tkg.1 values schema - ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: KubevipCPIConfig -metadata: - name: test-cluster-7 - namespace: cluster-namespace-7 -spec: - loadbalancerIPRanges: 10.0.0.1-10.0.0.2 - loadbalancerCIDRs: 10.0.0.1/24 - ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: test-cluster-7-kapp-controller-config - namespace: tkg-system -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: test-cluster-7-kapp-controller-config - namespace: cluster-namespace-7 -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: test-cluster-7 - namespace: tkg-system -spec: - antrea: - config: - trafficEncapMode: encap ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: test-cluster-7 - namespace: cluster-namespace-7 -spec: - antrea: - config: - trafficEncapMode: encap ---- -kind: Secret -metadata: - name: foobar2secret - namespace: cluster-namespace-7 -stringData: - values.yaml: | - sample-key: sample-value ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar1.example.com.1.17.2 - namespace: cluster-namespace-7 -spec: - refName: foobar1.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar1 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar1.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.22.5 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.30.23 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-cluster-7-kapp-controller-config - cni: - refName: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: test-cluster-7 - ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - name: test-cluster-7 - namespace: cluster-namespace-7 -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.30.23 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-cluster-7-kapp-controller-config - cni: - refName: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: test-cluster-7 - additionalPackages: - - refName: foobar1.example.com.1.17.2 - valuesFrom: - secretRef: foobar2secret - - refName: cpi.tanzu.vmware.com.0.0.4 - valuesFrom: - providerRef: - apiGroup: cpi.tanzu.vmware.com - kind: KubevipCPIConfig - name: test-cluster-7 diff --git a/addons/controllers/testdata/test-cluster-bootstrap-8.yaml b/addons/controllers/testdata/test-cluster-bootstrap-8.yaml deleted file mode 100644 index b432ba278f..0000000000 --- a/addons/controllers/testdata/test-cluster-bootstrap-8.yaml +++ /dev/null @@ -1,471 +0,0 @@ ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-8 - namespace: cluster-namespace-8 - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-8 - run.tanzu.vmware.com/tkr: v1.22.22 -spec: - infrastructureRef: - kind: VSphereCluster - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: test-cluster-8 - namespace: cluster-namespace-8 - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: test-cluster-8 - namespace: cluster-namespace-8 -spec: - identityRef: - kind: Secret - name: test-cluster-8 - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: test-cluster-8-control-plane - namespace: cluster-namespace-8 -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.22+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-8 - namespace: cluster-namespace-8 -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: load-balancer-and-ingress-service.tanzu.vmware.com.0.0.4 - namespace: cluster-namespace-8 -spec: - refName: load-balancer-and-ingress-service.tanzu.vmware.com - version: 0.0.4+vmware.1-tkg.1 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: lb 0.0.4 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: load-balancer-and-ingress-service.tanzu.vmware.com.0.0.4+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMwares End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/ako:v0.0.4_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: load-balancer-and-ingress-service.tanzu.vmware.com.0.0.4 - namespace: tkg-system -spec: - refName: load-balancer-and-ingress-service.tanzu.vmware.com - version: 0.0.4+vmware.1-tkg.1 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: lb 0.0.4 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: load-balancer-and-ingress-service.tanzu.vmware.com.0.0.4+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMwares End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/ako:v0.0.4_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.24 - namespace: cluster-namespace-8 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.24 - releaseNotes: kapp-controller 0.30.24 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.24_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.24+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.1 - namespace: cluster-namespace-8 -spec: - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.1 - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v3.19.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - namespace: cluster-namespace-8 -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 - namespace: cluster-namespace-8 -spec: - refName: vsphere-cpi.tanzu.vmware.com - version: 1.22.3+vmware.1-tkg.1 - releaseNotes: vsphere-cpi 1.22.3 https://github.com/kubernetes/cloud-provider-vsphere - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/vsphere-cpi:v1.22.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 values schema ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.22.22 -spec: - version: v1.22.22 - kubernetes: - version: v1.22.22 - imageRepository: foo - osImages: [] - bootstrapPackages: - - name: "load-balancer-and-ingress-service.tanzu.vmware.com.0.0.4" ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.24 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.24 - releaseNotes: kapp-controller 0.30.24 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.24_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.24+vmware.1-tkg.1 values schema - ---- -kind: Secret -metadata: - name: test-cluster-8-load-balancer-and-ingress-service-data-values - namespace: cluster-namespace-8 -stringData: - values.yaml: | - sample-key: sample-value ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: test-cluster-8-kapp-controller-config - namespace: tkg-system -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: test-cluster-8-kapp-controller-config - namespace: cluster-namespace-8 -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: test-cluster-8 - namespace: tkg-system -spec: - antrea: - config: - trafficEncapMode: encap ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: test-cluster-8 - namespace: cluster-namespace-8 -spec: - antrea: - config: - trafficEncapMode: encap ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.22.22 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.30.24 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-cluster-8-kapp-controller-config - cni: - refName: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: test-cluster-8 - ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - name: test-cluster-8 - namespace: cluster-namespace-8 - annotations: - "tkg.tanzu.vmware.com/add-missing-fields-from-tkr": "v1.22.22" - "run.tanzu.vmware.com/skip-packageinstall-deletion": "load-balancer-and-ingress-service" -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.30.24 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-cluster-8-kapp-controller-config - cni: - refName: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: test-cluster-8 - additionalPackages: - - refName: load-balancer-and-ingress-service.tanzu.vmware.com* - valuesFrom: - secretRef: test-cluster-8-load-balancer-and-ingress-service-data-values diff --git a/addons/controllers/testdata/test-cluster-bootstrap-9.yaml b/addons/controllers/testdata/test-cluster-bootstrap-9.yaml deleted file mode 100644 index 8fefdcc4d2..0000000000 --- a/addons/controllers/testdata/test-cluster-bootstrap-9.yaml +++ /dev/null @@ -1,1160 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: cluster-namespace-9 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.25.2-custom -spec: - version: v1.25.2 - kubernetes: - version: v1.25.2 - imageRepository: foo - osImages: [] - bootstrapPackages: - - name: kapp-controller.tanzu.vmware.com.0.32.9 - - name: antrea.tanzu.vmware.com.1.11.5--vmware.1-tkg.2 - - name: calico.tanzu.vmware.com.1.3.5--vmware.1-tkg.1 - - name: pinniped.tanzu.vmware.com.0.13.1--vmware.1-tkg.1 - - name: foobar.tanzu.vmware.com.0.2.2--vmware.1-tkg.1 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.25.2-custom - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.32.9 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: kapp-config-custom - cni: - refName: antrea.tanzu.vmware.com.1.11.5--vmware.1-tkg.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: AntreaConfig - name: antrea-config-custom - additionalPackages: - - refName: pinniped.tanzu.vmware.com.0.13.1--vmware.1-tkg.1 - valuesFrom: - secretRef: default-pinniped-config-v1.23.5---vmware.1-tkg.1 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.25.3-custom -spec: - version: v1.25.3 - kubernetes: - version: v1.25.3 - imageRepository: foo - osImages: [] - bootstrapPackages: - - name: kapp-controller.tanzu.vmware.com.0.32.10 - - name: antrea.tanzu.vmware.com.1.11.6--vmware.1-tkg.2 - - name: calico.tanzu.vmware.com.1.3.6--vmware.1-tkg.1 - - name: pinniped.tanzu.vmware.com.0.13.2--vmware.1-tkg.1 - - name: foobar.tanzu.vmware.com.0.2.3--vmware.1-tkg.1 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.25.3-custom - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.32.10 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: kapp-config-custom - cni: - refName: antrea.tanzu.vmware.com.1.11.6--vmware.1-tkg.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: AntreaConfig - name: antrea-config-custom - additionalPackages: - - refName: pinniped.tanzu.vmware.com.0.13.2--vmware.1-tkg.1 - valuesFrom: - secretRef: default-pinniped-config-v1.23.6---vmware.1-tkg.1 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.32.9 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.32.9 - releaseNotes: kapp-controller 0.32.9 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.32.9_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.32.9+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.32.9 - namespace: cluster-namespace-9 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.32.9 - releaseNotes: kapp-controller 0.32.9 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.32.9_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.32.9+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.32.10 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.32.10 - releaseNotes: kapp-controller 0.32.10 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.32.10_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.32.10+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.32.10 - namespace: cluster-namespace-9 -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.32.10 - releaseNotes: kapp-controller 0.32.10 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.32.10_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-30T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.32.10+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.11.5--vmware.1-tkg.2 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.11.5+vmware.1-tkg.1 - releaseNotes: antrea 1.11.5 https://github.com/antrea-io/antrea/releases/tag/v1.11.5 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.11.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.11.5+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.11.5--vmware.1-tkg.2 - namespace: cluster-namespace-9 -spec: - refName: antrea.tanzu.vmware.com - version: 1.11.5+vmware.1-tkg.1 - releaseNotes: antrea 1.11.5 https://github.com/antrea-io/antrea/releases/tag/v1.11.5 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.11.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.11.5+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.11.6--vmware.1-tkg.2 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.11.6+vmware.1-tkg.1 - releaseNotes: antrea 1.11.6 https://github.com/antrea-io/antrea/releases/tag/v1.11.6 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.11.6_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.11.6+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.11.6--vmware.1-tkg.2 - namespace: cluster-namespace-9 -spec: - refName: antrea.tanzu.vmware.com - version: 1.11.6+vmware.1-tkg.1 - releaseNotes: antrea 1.11.6 https://github.com/antrea-io/antrea/releases/tag/v1.11.6 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.11.6_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.11.6+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.3.5--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: calico.tanzu.vmware.com - version: 1.3.5+vmware.1-tkg.1 - releaseNotes: calico 1.3.5 https://github.com/calico-io/calico/releases/tag/v1.3.5 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.3.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.3.5+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.3.5--vmware.1-tkg.1 - namespace: cluster-namespace-9 -spec: - refName: calico.tanzu.vmware.com - version: 1.3.5+vmware.1-tkg.1 - releaseNotes: calico 1.3.5 https://github.com/calico-io/calico/releases/tag/v1.3.5 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.3.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.3.5+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.3.6--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: calico.tanzu.vmware.com - version: 1.3.6+vmware.1-tkg.1 - releaseNotes: calico 1.3.6 https://github.com/calico-io/calico/releases/tag/v1.3.6 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.3.6_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.3.6+vmware.1-tkg.1 values schema ---- -# manually sync package to required namespace (done by kapp-controller on a real cluster) -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.1.3.6--vmware.1-tkg.1 - namespace: cluster-namespace-9 -spec: - refName: calico.tanzu.vmware.com - version: 1.3.6+vmware.1-tkg.1 - releaseNotes: calico 1.3.6 https://github.com/calico-io/calico/releases/tag/v1.3.6 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v1.3.6_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.1.3.6+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: pinniped.tanzu.vmware.com.0.13.1--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: pinniped.tanzu.vmware.com - version: 0.13.1+vmware.1-tkg.1 - releaseNotes: pinniped 0.13.1 https://github.com/vmware-tanzu/pinniped/releases/tag/v0.13.1 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/pinniped:v0.13.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: pinniped.tanzu.vmware.com.0.13.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: pinniped.tanzu.vmware.com.0.13.1--vmware.1-tkg.1 - namespace: cluster-namespace-9 -spec: - refName: pinniped.tanzu.vmware.com - version: 0.13.1+vmware.1-tkg.1 - releaseNotes: pinniped 0.13.1 https://github.com/vmware-tanzu/pinniped/releases/tag/v0.13.1 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/pinniped:v0.13.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: pinniped.tanzu.vmware.com.0.13.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: pinniped.tanzu.vmware.com.0.13.2--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: pinniped.tanzu.vmware.com - version: 0.13.2+vmware.1-tkg.1 - releaseNotes: pinniped 0.13.2 https://github.com/vmware-tanzu/pinniped/releases/tag/v0.13.2 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/pinniped:v0.13.2_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: pinniped.tanzu.vmware.com.0.13.2+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: pinniped.tanzu.vmware.com.0.13.2--vmware.1-tkg.1 - namespace: cluster-namespace-9 -spec: - refName: pinniped.tanzu.vmware.com - version: 0.13.2+vmware.1-tkg.1 - releaseNotes: pinniped 0.13.2 https://github.com/vmware-tanzu/pinniped/releases/tag/v0.13.2 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/pinniped:v0.13.2_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: pinniped.tanzu.vmware.com.0.13.2+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.tanzu.vmware.com.0.2.2--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: foobar.tanzu.vmware.com - version: 0.2.2+vmware.1-tkg.1 - releaseNotes: foobar 0.2.2 https://github.com/vmware-tanzu/foobar/releases/tag/v0.2.2 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/foobar:v0.2.2_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: foobar.tanzu.vmware.com.0.2.2+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.tanzu.vmware.com.0.2.2--vmware.1-tkg.1 - namespace: cluster-namespace-9 -spec: - refName: foobar.tanzu.vmware.com - version: 0.2.2+vmware.1-tkg.1 - releaseNotes: foobar 0.2.2 https://github.com/vmware-tanzu/foobar/releases/tag/v0.2.2 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/foobar:v0.2.2_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: foobar.tanzu.vmware.com.0.2.2+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.tanzu.vmware.com.0.2.3--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: foobar.tanzu.vmware.com - version: 0.2.3+vmware.1-tkg.1 - releaseNotes: foobar 0.2.3 https://github.com/vmware-tanzu/foobar/releases/tag/v0.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/foobar:v0.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: foobar.tanzu.vmware.com.0.2.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.tanzu.vmware.com.0.2.3--vmware.1-tkg.1 - namespace: cluster-namespace-9 -spec: - refName: foobar.tanzu.vmware.com - version: 0.2.3+vmware.1-tkg.1 - releaseNotes: foobar 0.2.3 https://github.com/vmware-tanzu/foobar/releases/tag/v0.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/foobar:v0.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: foobar.tanzu.vmware.com.0.2.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: barfoo.tanzu.vmware.com.1.0.0--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: barfoo.tanzu.vmware.com - version: 1.0.0+vmware.1-tkg.1 - releaseNotes: barfoo 1.0.0 https://github.com/vmware-tanzu/foobar/releases/tag/v1.0.0 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/barfoo:v1.0.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: barfoo.tanzu.vmware.com.1.0.0+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: barfoo.tanzu.vmware.com.1.0.0--vmware.1-tkg.1 - namespace: cluster-namespace-9 -spec: - refName: barfoo.tanzu.vmware.com - version: 1.0.0+vmware.1-tkg.1 - releaseNotes: barfoo 1.0.0 https://github.com/vmware-tanzu/foobar/releases/tag/v1.0.0 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/barfoo:v1.0.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: barfoo.tanzu.vmware.com.1.0.0+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: barfoo.tanzu.vmware.com.1.0.1--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: barfoo.tanzu.vmware.com - version: 1.0.1+vmware.1-tkg.1 - releaseNotes: barfoo 1.0.1 https://github.com/vmware-tanzu/foobar/releases/tag/v1.0.1 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/barfoo:v1.0.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: barfoo.tanzu.vmware.com.1.0.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: barfoo.tanzu.vmware.com.1.0.1--vmware.1-tkg.1 - namespace: cluster-namespace-9 -spec: - refName: barfoo.tanzu.vmware.com - version: 1.0.1+vmware.1-tkg.1 - releaseNotes: barfoo 1.0.1 https://github.com/vmware-tanzu/foobar/releases/tag/v1.0.1 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/barfoo:v1.0.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - kbld-config.yaml - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-06-21T16:00:43Z" - valuesSchema: - openAPIv3: - title: barfoo.tanzu.vmware.com.1.0.1+vmware.1-tkg.1 values schema ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: antrea-config-custom - namespace: tkg-system -spec: - antrea: - config: - trafficEncapMode: encap - noSNAT: false - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - disableUdpTunnelOffload: false - featureGates: - AntreaProxy: true - EndpointSlice: true - AntreaPolicy: true - NodePortLocal: false - AntreaTraceflow: true - Egress: false - FlowExporter: false ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: kapp-config-custom - namespace: tkg-system -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -apiVersion: v1 -kind: Secret -metadata: - name: default-pinniped-config-v1.23.5---vmware.1-tkg.1 - namespace: tkg-system -stringData: - values.yaml: | - infrastructure_provider: vsphere - identity_management_type: none - tkg_cluster_role: workload ---- -apiVersion: v1 -kind: Secret -metadata: - name: default-pinniped-config-v1.23.5---vmware.1-tkg.1 - namespace: cluster-namespace-9 -stringData: - values.yaml: | - infrastructure_provider: vsphere - identity_management_type: none - tkg_cluster_role: workload ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: calico-custom-config - namespace: cluster-namespace-9 -spec: - calico: - config: - vethMTU: 1420 - skipCNIBinaries: false ---- -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: FooBar -metadata: - name: foobar-custom-config - namespace: cluster-namespace-9 -spec: - foo: bar ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - name: test-cluster-9 - namespace: cluster-namespace-9 - annotations: - tkg.tanzu.vmware.com/add-missing-fields-from-tkr: v1.25.2-custom -spec: - kapp: - refName: kapp-controller* - cni: - refName: calico* - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: CalicoConfig - name: calico-custom-config - additionalPackages: - - refName: pinniped* - - refName: foobar* - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: FooBar - name: foobar-custom-config - - refName: barfoo.tanzu.vmware.com.1.0.0--vmware.1-tkg.1 - valuesFrom: - inline: - key1: value1 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-9 - namespace: cluster-namespace-9 - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-9 - run.tanzu.vmware.com/tkr: v1.25.2-custom -spec: - infrastructureRef: - kind: VSphereCluster - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: test-cluster-9 - namespace: cluster-namespace-9 - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: test-cluster-9 - namespace: cluster-namespace-9 -spec: - identityRef: - kind: Secret - name: test-cluster-tcbt-5 - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: test-cluster-9 - namespace: cluster-namespace-9 -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-tcbt-5 - namespace: cluster-namespace-9 -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local diff --git a/addons/controllers/testdata/test-cluster-legacy.yaml b/addons/controllers/testdata/test-cluster-legacy.yaml deleted file mode 100644 index 0213800439..0000000000 --- a/addons/controllers/testdata/test-cluster-legacy.yaml +++ /dev/null @@ -1,71 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: legacy-namespace ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-legacy - namespace: legacy-namespace - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-legacy - run.tanzu.vmware.com/tkr: v1.12.1 -spec: - infrastructureRef: - kind: VSphereCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: test-cluster-legacy-control-plane - namespace: legacy-namespace - topology: - class: test-clusterclass-legasy - version: v1.22.3 - variables: - - name: tkg.tanzu.vmware.com/tkg-ip-family - value: "ipv4" - - name: proxy - value: - httpProxy: "foo.com" - httpsProxy: "bar.com" - noProxy: - - "foobar.com" - - "google.com" - - name: trust - value: - additionalTrustedCAs: - - name: CompanyInternalCA-1 - data: aGVsbG8= - - name: CompanyInternalCA-2 - data: bHWtcH9= - - name: skipTLSVerify - value: - - registry1 - - registry2 ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - name: test-cluster-legacy-control-plane - namespace: legacy-namespace - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - kind: Cluster - name: test-cluster-legacy - uid: bd834522-d9a5-4841-beac-991ff3798c01 -spec: - kubeadmConfigSpec: {} - machineTemplate: - infrastructureRef: {} - replicas: 3 - version: v1.22.3 - - - diff --git a/addons/controllers/testdata/test-cluster-metadata.yaml b/addons/controllers/testdata/test-cluster-metadata.yaml deleted file mode 100644 index 4cf1dcbf82..0000000000 --- a/addons/controllers/testdata/test-cluster-metadata.yaml +++ /dev/null @@ -1,627 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: TanzuKubernetesRelease -metadata: - name: v1.23.8---vmware.2-tkg.2 - namespace: tkr-system -spec: - version: v1.23.8---vmware.2-tkg.2 - kubernetesVersion: v1.23.8+vmware.2 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-metadata - namespace: default - labels: - tkg.tanzu.vmware.com/cluster-name: test-cluster-metadata - run.tanzu.vmware.com/tkr: v1.23.8---vmware.2-tkg.2 - annotations: - tkg/plan: dev -spec: - infrastructureRef: - kind: VSphereCluster - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: test-cluster-metadata - namespace: default - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: test-cluster-metadata-plane - namespace: default - topology: - class: test-clusterclass-tcbt - version: v1.22.3 ---- -apiVersion: v1 -kind: Namespace -metadata: - labels: - kubernetes.io/metadata.name: tkg-system-public - name: tkg-system-public ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: tkg-bom-v1.7.0 - namespace: tkg-system-public -data: - bom.yaml: | - apiVersion: run.tanzu.vmware.com/v1alpha2 - default: - k8sVersion: v1.23.8+vmware.2-tkg.2 - release: - version: v1.7.0 - components: - aad-pod-identity: - - version: v1.8.0+vmware.1 - images: - micImage: - imagePath: cluster-api/mic - tag: v1.8.0_vmware.1 - nmiImage: - imagePath: cluster-api/nmi - tag: v1.8.0_vmware.1 - alertmanager: - - version: v0.24.0+vmware.1 - images: - alertmanagerImage: - imagePath: prometheus/alertmanager - tag: v0.24.0_vmware.1 - cloud-provider-azure: - - version: v0.7.4+vmware.1 - images: - ccmAzureControllerImage: - imagePath: azure-cloud-controller-manager - tag: v0.7.4_vmware.1 - ccmAzureNodeImage: - imagePath: azure-cloud-node-manager - tag: v0.7.4_vmware.1 - cluster-api-provider-azure: - - version: v1.6.1+vmware.1 - images: - capzControllerImage: - imagePath: cluster-api/cluster-api-azure-controller - tag: v1.6.1_vmware.1 - cluster-api-provider-bringyourownhost: - - version: v0.2.0+vmware.4 - images: - byohControllerImage: - imagePath: cluster-api/cluster-api-byoh-controller - tag: v0.2.0_vmware.4 - cluster-api-provider-oci: - - version: v0.4.0+vmware.2 - images: - capociControllerImage: - imagePath: cluster-api/cluster-api-oci-controller - tag: v0.4.0_vmware.2 - cluster_api: - - version: v1.2.4+vmware.1 - images: - cabpkControllerImage: - imagePath: cluster-api/kubeadm-bootstrap-controller - tag: v1.2.4_vmware.1 - capdManagerImage: - imagePath: cluster-api/capd-manager - tag: v1.2.4_vmware.1 - capiControllerImage: - imagePath: cluster-api/cluster-api-controller - tag: v1.2.4_vmware.1 - kcpControllerImage: - imagePath: cluster-api/kubeadm-control-plane-controller - tag: v1.2.4_vmware.1 - cluster_api_aws: - - version: v2.0.0-beta.1+vmware.1 - images: - capaControllerImage: - imagePath: cluster-api/cluster-api-aws-controller - tag: v2.0.0-beta.1_vmware.1 - cluster_api_vsphere: - - version: v1.4.1+vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/cluster-api-vsphere-controller - tag: v1.4.1_vmware.1 - configmap-reload: - - version: v0.7.1+vmware.1 - images: - configmapReloadImage: - imagePath: prometheus/configmap-reload - tag: v0.7.1_vmware.1 - contour: - - version: v1.17.2+vmware.1 - images: - contourImage: - imagePath: contour - tag: v1.17.2_vmware.1 - - version: v1.18.2+vmware.1 - images: - contourImage: - imagePath: contour - tag: v1.18.2_vmware.1 - - version: v1.20.2+vmware.1 - images: - contourImage: - imagePath: contour - tag: v1.20.2_vmware.1 - - version: v1.22.0+vmware.1 - images: - contourImage: - imagePath: contour - tag: v1.22.0_vmware.1 - crash-diagnostics: - - version: v0.3.7+vmware.6 - envoy: - - version: v1.18.4+vmware.1 - images: - envoyImage: - imagePath: envoy - tag: v1.18.4_vmware.1 - - version: v1.19.1+vmware.1 - images: - envoyImage: - imagePath: envoy - tag: v1.19.1_vmware.1 - - version: v1.21.3+vmware.1 - images: - envoyImage: - imagePath: envoy - tag: v1.21.3_vmware.1 - - version: v1.23.0+vmware.1 - images: - envoyImage: - imagePath: envoy - tag: v1.23.0_vmware.1 - external-dns: - - version: v0.12.2+vmware.1 - images: - externalDNSImage: - imagePath: external-dns - tag: v0.12.2_vmware.1 - fluent-bit: - - version: v1.8.15+vmware.1 - images: - fluentBitImage: - imagePath: fluent-bit - tag: v1.8.15_vmware.1 - grafana: - - version: v7.5.16+vmware.1 - images: - grafanaImage: - imagePath: grafana/grafana - tag: v7.5.16_vmware.1 - harbor: - - version: v2.6.1+vmware.1 - images: - harborChartMuseumImage: - imagePath: harbor/chartmuseum-photon - tag: v2.6.1_vmware.1 - harborCoreImage: - imagePath: harbor/harbor-core - tag: v2.6.1_vmware.1 - harborDatabaseImage: - imagePath: harbor/harbor-db - tag: v2.6.1_vmware.1 - harborExporterImage: - imagePath: harbor/harbor-exporter - tag: v2.6.1_vmware.1 - harborJobServiceImage: - imagePath: harbor/harbor-jobservice - tag: v2.6.1_vmware.1 - harborLogImage: - imagePath: harbor/harbor-log - tag: v2.6.1_vmware.1 - harborNginxImage: - imagePath: harbor/nginx-photon - tag: v2.6.1_vmware.1 - harborNotaryServerImage: - imagePath: harbor/notary-server-photon - tag: v2.6.1_vmware.1 - harborNotarySignerImage: - imagePath: harbor/notary-signer-photon - tag: v2.6.1_vmware.1 - harborPortalImage: - imagePath: harbor/harbor-portal - tag: v2.6.1_vmware.1 - harborPrepareImage: - imagePath: harbor/prepare - tag: v2.6.1_vmware.1 - harborRedisImage: - imagePath: harbor/redis-photon - tag: v2.6.1_vmware.1 - harborRegistryCtlImage: - imagePath: harbor/harbor-registryctl - tag: v2.6.1_vmware.1 - harborRegistryImage: - imagePath: harbor/registry-photon - tag: v2.6.1_vmware.1 - harborTrivyAdapterImage: - imagePath: harbor/trivy-adapter-photon - tag: v2.6.1_vmware.1 - image-builder: - - version: v0.1.12+vmware.2 - images: - imagebuilder-tar: - imagePath: image-builder - tag: v0.1.12_vmware.2 - imgpkg: - - version: v0.31.0+vmware.1 - jetstack_cert-manager: - - version: v1.9.1+vmware.1 - images: - certMgrControllerImage: - imagePath: cert-manager-controller - tag: v1.9.1_vmware.1 - certMgrInjectorImage: - imagePath: cert-manager-cainjector - tag: v1.9.1_vmware.1 - certMgrWebhookImage: - imagePath: cert-manager-webhook - tag: v1.9.1_vmware.1 - k8s-sidecar: - - version: v1.12.1+vmware.3 - images: - k8sSidecarImage: - imagePath: grafana/k8s-sidecar - tag: v1.12.1_vmware.3 - - version: v1.15.6+vmware.2 - images: - k8sSidecarImage: - imagePath: grafana/k8s-sidecar - tag: v1.15.6_vmware.2 - k14s_kapp: - - version: v0.53.0+vmware.1 - k14s_ytt: - - version: v0.43.0+vmware.1 - kbld: - - version: v0.35.0+vmware.1 - kube-state-metrics: - - version: v2.5.0+vmware.1 - images: - kubeStateMetricsImage: - imagePath: prometheus/kube-state-metrics - tag: v2.5.0_vmware.1 - kube-vip: - - version: v0.5.5+vmware.1 - images: - kubeVipImage: - imagePath: kube-vip - tag: v0.5.5_vmware.1 - kube-vip-cloud-provider: - - version: v0.0.4+vmware.1 - images: - kubevipcloudproviderControllerImage: - imagePath: kube-vip/kube-vip-cloud-provider - tag: v0.0.4_vmware.1 - kube_rbac_proxy: - - version: v0.11.0+vmware.2 - images: - kubeRbacProxyControllerImage: - imagePath: kube-rbac-proxy - tag: v0.11.0_vmware.2 - kubeRbacProxyControllerImageCapi: - imagePath: cluster-api/kube-rbac-proxy - tag: v0.11.0_vmware.2 - kubernetes-sigs_kind: - - version: v1.23.8+vmware.2-tkg.1_v0.11.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.23.8_vmware.2-tkg.1_v0.11.1 - kubernetes_autoscaler: - - version: v1.23.0+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.23.0_vmware.1 - metadata: - k8sversion: v1.23.3+vmware.1 - - version: v1.22.0+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.22.0_vmware.1 - metadata: - k8sversion: v1.22.3+vmware.1 - - version: v1.21.0+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.21.0_vmware.1 - metadata: - k8sversion: v1.21.1+vmware.1 - multus-cni: - - version: v3.8.0+vmware.1 - images: - multusCniImage: - imagePath: multus-cni - tag: v3.8.0_vmware.1 - prometheus: - - version: v2.36.2+vmware.1 - images: - prometheusImage: - imagePath: prometheus/prometheus - tag: v2.36.2_vmware.1 - prometheus_node_exporter: - - version: v1.3.1+vmware.1 - images: - prometheusNodeExporterImage: - imagePath: prometheus/prometheus_node_exporter - tag: v1.3.1_vmware.1 - pushgateway: - - version: v1.4.3+vmware.1 - images: - pushgatewayImage: - imagePath: prometheus/pushgateway - tag: v1.4.3_vmware.1 - sonobuoy: - - version: v0.56.6+vmware.1 - images: - sonobuoyImage: - imagePath: sonobuoy - tag: v0.56.6_vmware.1 - standalone-plugins-package: - - version: v0.28.0-dev-104-g36b89720-standalone-plugins - images: - standalone-plugins.tanzu.vmware.com: - imagePath: packages/standalone-plugins - tag: v0.28.0-dev-104-g36b89720_vmware.1 - tanzu-framework: - - version: v0.28.0-dev-104-g36b89720 - images: - capabilitiesImage: - imagePath: tanzu_core/capabilities/capabilities-controller-manager-tf - tag: v0.28.0-dev-104-g36b89720 - clipluginsClusterDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsClusterDarwinAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsClusterLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsClusterLinuxAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsClusterWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsClusterWindowsAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsFeatureDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/feature-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsFeatureDarwinAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/feature-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsFeatureLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/feature-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsFeatureLinuxAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/feature-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsFeatureWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/feature-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsFeatureWindowsAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/feature-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsKubernetesReleaseDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsKubernetesReleaseDarwinAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsKubernetesReleaseLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsKubernetesReleaseLinuxAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsKubernetesReleaseWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsKubernetesReleaseWindowsAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsLoginDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/login-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsLoginLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/login-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsLoginWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/login-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsManagementClusterDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/management-cluster-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsManagementClusterLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/management-cluster-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsManagementClusterWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/management-cluster-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsPackageDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/package-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsPackageLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/package-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsPackageWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/package-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsPinnipedAuthDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/pinniped-auth-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsPinnipedAuthLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/pinniped-auth-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsPinnipedAuthWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/pinniped-auth-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsSecretDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/secret-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsSecretLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/secret-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsSecretWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/secret-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsTelemetryDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/telemetry-darwin-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsTelemetryLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/telemetry-linux-amd64 - tag: v0.28.0-dev-104-g36b89720 - clipluginsTelemetryWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/telemetry-windows-amd64 - tag: v0.28.0-dev-104-g36b89720 - featuregatesImage: - imagePath: tanzu_core/featuregates/featuregates-controller-manager - tag: v0.28.0-dev-104-g36b89720 - objectPropagationControllerImage: - imagePath: tanzu_core/objectpropogation/object-propagation-controller - tag: v0.28.0-dev-104-g36b89720 - providerTemplateImage: - imagePath: tanzu_core/provider/provider-templates - tag: v0.28.0-dev-104-g36b89720 - tkrConversionWebhookImage: - imagePath: tanzu_core/tkr/tkr-conversion-webhook - tag: v0.28.0-dev-104-g36b89720 - tkrImage: - imagePath: tanzu_core/tkr/tkr-controller-manager - tag: v0.28.0-dev-104-g36b89720 - tkrResolverImage: - imagePath: tanzu_core/tkr/tkr-resolver-cluster-webhook - tag: v0.28.0-dev-104-g36b89720 - tkrSourceControllerImage: - imagePath: tanzu_core/tkr/tkr-source-controller - tag: v0.28.0-dev-104-g36b89720 - tkrStatusControllerImage: - imagePath: tanzu_core/tkr/tkr-status-controller - tag: v0.28.0-dev-104-g36b89720 - tkrVsphereResolverImage: - imagePath: tanzu_core/tkr/tkr-vsphere-cluster-webhook - tag: v0.28.0-dev-104-g36b89720 - tanzu-framework-management-packages: - - version: v0.28.0-dev-104-g36b89720 - images: - tanzuFrameworkManagementPackageRepositoryImage: - imagePath: packages/management/repo - tag: v0.28.0-dev-104-g36b89720 - tanzuFrameworkManagementPackageRepositoryImageUTKG: - imagePath: packages/management/repo - tag: v0.28.0-dev-104-g36b89720-utkg - tkg-bom: - - version: v1.7.0 - images: - tkgBomImage: - imagePath: tkg-bom - tag: v1.7.0 - tkg-standard-packages: - - version: v1.7.0 - images: - tanzuStandardPackageRepositoryImage: - imagePath: packages/standard/repo - tag: v1.7.0 - tkg_telemetry: - - version: v1.6.0+vmware.1 - images: - tkgTelemetryImage: - imagePath: tkg-telemetry - tag: v1.6.0_vmware.1 - velero: - - version: v1.9.2+vmware.1 - images: - veleroImage: - imagePath: velero/velero - tag: v1.9.2_vmware.1 - veleroResticRestoreHelperImage: - imagePath: velero/velero-restic-restore-helper - tag: v1.9.2_vmware.1 - velero-plugin-for-aws: - - version: v1.5.1+vmware.1 - images: - veleroPluginForAwsImage: - imagePath: velero/velero-plugin-for-aws - tag: v1.5.1_vmware.1 - velero-plugin-for-csi: - - version: v0.3.1+vmware.1 - images: - veleroPluginForCsiImage: - imagePath: velero/velero-plugin-for-csi - tag: v0.3.1_vmware.1 - velero-plugin-for-microsoft-azure: - - version: v1.5.1+vmware.1 - images: - veleroPluginForMicrosoftAzureImage: - imagePath: velero/velero-plugin-for-microsoft-azure - tag: v1.5.1_vmware.1 - velero-plugin-for-vsphere: - - version: v1.4.0+vmware.1 - images: - veleroBackupDriverImage: - imagePath: velero/backup-driver - tag: v1.4.0_vmware.1 - veleroDataManagerForPluginImage: - imagePath: velero/data-manager-for-plugin - tag: v1.4.0_vmware.1 - veleroPluginForVsphereImage: - imagePath: velero/velero-plugin-for-vsphere - tag: v1.4.0_vmware.1 - vendir: - - version: v0.30.0+vmware.1 - whereabouts: - - version: v0.5.4+vmware.1 - images: - whereaboutsImage: - imagePath: whereabouts - tag: v0.5.4_vmware.1 - kindKubeadmConfigSpec: - - 'kind: Cluster' - - 'apiVersion: kind.x-k8s.io/v1alpha4' - - 'kubeadmConfigPatches:' - - '- |' - - ' apiVersion: kubeadm.k8s.io/v1beta2' - - ' kind: ClusterConfiguration' - - ' imageRepository: projects.registry.vmware.com/tkg' - - ' etcd:' - - ' local:' - - ' imageRepository: projects.registry.vmware.com/tkg' - - ' imageTag: v3.5.4_vmware.6' - - ' dns:' - - ' type: CoreDNS' - - ' imageRepository: projects.registry.vmware.com/tkg' - - ' imageTag: v1.8.6_vmware.7' - imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg - tkr-bom: - imagePath: tkr-bom - tkr-compatibility: - imagePath: v20-v1.7.0/tkr-compatibility - tkr-package-repo: - aws: tkr-repository-aws - azure: tkr-repository-azure - vsphere-nonparavirt: tkr-repository-vsphere-nonparavirt - tkr-package: - aws: tkr-aws - azure: tkr-azure - vsphere-nonparavirt: tkr-vsphere-nonparavirt - ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: bom-metadata - namespace: tkg-system -binaryData: - compatibility: bWFuYWdlbWVudENsdXN0ZXJWZXJzaW9uczoKLSBzdXBwb3J0ZWRLdWJlcm5ldGVzVmVyc2lvbnM6CiAgLSB2MS4yMC40K3Ztd2FyZS4xLXRrZy4xCiAgLSB2MS4xOS44K3Ztd2FyZS4xLXRrZy4xCiAgLSB2MS4xOC4xNit2bXdhcmUuMS10a2cuMQogIC0gdjEuMTcuMTYrdm13YXJlLjItdGtnLjEKICB2ZXJzaW9uOiB2MS4zLjAKLSBzdXBwb3J0ZWRLdWJlcm5ldGVzVmVyc2lvbnM6CiAgLSB2MS4xOS44K3Ztd2FyZS4zLXRrZy4xCiAgLSB2MS4yMC41K3Ztd2FyZS4yLXRrZy4xCiAgLSB2MS4xOC4xNyt2bXdhcmUuMi10a2cuMQogIC0gdjEuMjAuNCt2bXdhcmUuMy10a2cuMQogIC0gdjEuMTkuOSt2bXdhcmUuMi10a2cuMQogIC0gdjEuMTguMTYrdm13YXJlLjMtdGtnLjEKICAtIHYxLjE3LjE2K3Ztd2FyZS4zLXRrZy4xCiAgdmVyc2lvbjogdjEuMy4xCi0gc3VwcG9ydGVkS3ViZXJuZXRlc1ZlcnNpb25zOgogIC0gdjEuMjAuNSt2bXdhcmUuMi1maXBzLjEtdGtnLjEKICB2ZXJzaW9uOiB2MS4zLjEtZmlwcy4xCi0gc3VwcG9ydGVkS3ViZXJuZXRlc1ZlcnNpb25zOgogIC0gdjEuMTkuOCt2bXdhcmUuMy10a2cuMQogIC0gdjEuMjAuNSt2bXdhcmUuMi10a2cuMQogIC0gdjEuMTguMTcrdm13YXJlLjItdGtnLjEKICAtIHYxLjIwLjQrdm13YXJlLjMtdGtnLjEKICAtIHYxLjE5Ljkrdm13YXJlLjItdGtnLjEKICAtIHYxLjE4LjE2K3Ztd2FyZS4zLXRrZy4xCiAgLSB2MS4xNy4xNit2bXdhcmUuMy10a2cuMQogIHZlcnNpb246IHYxLjMuMS1wYXRjaDEKLSBzdXBwb3J0ZWRLdWJlcm5ldGVzVmVyc2lvbnM6CiAgLSB2MS4xOS4xMit2bXdhcmUuMS10a2cuMQogIC0gdjEuMjEuMit2bXdhcmUuMS10a2cuMQogIC0gdjEuMjAuOCt2bXdhcmUuMS10a2cuMgogIHZlcnNpb246IHYxLjQuMAotIHN1cHBvcnRlZEt1YmVybmV0ZXNWZXJzaW9uczoKICAtIHYxLjIxLjIrdm13YXJlLjEtZmlwcy4xLXRrZy4xCiAgLSB2MS4yMC44K3Ztd2FyZS4xLWZpcHMuMS10a2cuMgogIHZlcnNpb246IHYxLjQuMC1maXBzLjEKLSBzdXBwb3J0ZWRLdWJlcm5ldGVzVmVyc2lvbnM6CiAgLSB2MS4yMS4yK3Ztd2FyZS4xLXRrZy4yCiAgLSB2MS4yMC44K3Ztd2FyZS4xLXRrZy4zCiAgLSB2MS4xOS4xMit2bXdhcmUuMS10a2cuMgogIHZlcnNpb246IHYxLjQuMQotIHN1cHBvcnRlZEt1YmVybmV0ZXNWZXJzaW9uczoKICAtIHYxLjIxLjgrdm13YXJlLjEtdGtnLjIKICAtIHYxLjE5LjE2K3Ztd2FyZS4xLXRrZy4xCiAgLSB2MS4yMC4xNCt2bXdhcmUuMS10a2cuMgogIHZlcnNpb246IHYxLjQuMgotIHN1cHBvcnRlZEt1YmVybmV0ZXNWZXJzaW9uczoKICAtIHYxLjIwLjE0K3Ztd2FyZS4xLXRrZy43CiAgLSB2MS4xOS4xNit2bXdhcmUuMS10a2cuMgogIC0gdjEuMjEuOCt2bXdhcmUuMS10a2cuNwogIHZlcnNpb246IHYxLjQuMwotIHN1cHBvcnRlZEt1YmVybmV0ZXNWZXJzaW9uczoKICAtIHYxLjIyLjUrdm13YXJlLjEtdGtnLjEKICAtIHYxLjIxLjgrdm13YXJlLjEtdGtnLjEKICAtIHYxLjIwLjE0K3Ztd2FyZS4xLXRrZy4xCiAgdmVyc2lvbjogdjEuNS4wCi0gc3VwcG9ydGVkS3ViZXJuZXRlc1ZlcnNpb25zOgogIC0gdjEuMjIuNSt2bXdhcmUuMS10a2cuMwogIC0gdjEuMjEuOCt2bXdhcmUuMS10a2cuNAogIC0gdjEuMjAuMTQrdm13YXJlLjEtdGtnLjQKICB2ZXJzaW9uOiB2MS41LjEKLSBzdXBwb3J0ZWRLdWJlcm5ldGVzVmVyc2lvbnM6CiAgLSB2MS4yMi41K3Ztd2FyZS4xLXRrZy40CiAgLSB2MS4yMC4xNCt2bXdhcmUuMS10a2cuNQogIC0gdjEuMjEuOCt2bXdhcmUuMS10a2cuNQogIHZlcnNpb246IHYxLjUuMgotIHN1cHBvcnRlZEt1YmVybmV0ZXNWZXJzaW9uczoKICAtIHYxLjIwLjE1K3Ztd2FyZS4xLXRrZy4xCiAgLSB2MS4yMi44K3Ztd2FyZS4xLXRrZy4xCiAgLSB2MS4yMS4xMSt2bXdhcmUuMS10a2cuMQogIHZlcnNpb246IHYxLjUuMwotIHN1cHBvcnRlZEt1YmVybmV0ZXNWZXJzaW9uczoKICAtIHYxLjIwLjE1K3Ztd2FyZS4xLWZpcHMuMS10a2cuMQogIC0gdjEuMjIuOCt2bXdhcmUuMS1maXBzLjEtdGtnLjEKICAtIHYxLjIxLjExK3Ztd2FyZS4xLWZpcHMuMS10a2cuMQogIHZlcnNpb246IHYxLjUuMy1maXBzLjEKLSBzdXBwb3J0ZWRLdWJlcm5ldGVzVmVyc2lvbnM6CiAgLSB2MS4yMC4xNSt2bXdhcmUuMS10a2cuMgogIC0gdjEuMjIuOSt2bXdhcmUuMS10a2cuMQogIC0gdjEuMjEuMTErdm13YXJlLjEtdGtnLjMKICB2ZXJzaW9uOiB2MS41LjQKLSBzdXBwb3J0ZWRLdWJlcm5ldGVzVmVyc2lvbnM6CiAgLSB2MS4yMC4xNSt2bXdhcmUuMi1maXBzLXRrZy4xCiAgLSB2MS4yMS4xMSt2bXdhcmUuMi1maXBzLXRrZy4xCiAgLSB2MS4yMi45K3Ztd2FyZS4xLWZpcHMtdGtnLjEKICB2ZXJzaW9uOiB2MS41LjQtZmlwcy4xCi0gc3VwcG9ydGVkS3ViZXJuZXRlc1ZlcnNpb25zOgogIC0gdjEuMjMuOCt2bXdhcmUuMi10a2cuMQogIC0gdjEuMjEuMTQrdm13YXJlLjItdGtnLjEKICAtIHYxLjIyLjExK3Ztd2FyZS4yLXRrZy4xCiAgdmVyc2lvbjogdjEuNi4wCi0gc3VwcG9ydGVkS3ViZXJuZXRlc1ZlcnNpb25zOgogIC0gdjEuMjMuOCt2bXdhcmUuMi1maXBzLjEtdGtnLjEKICAtIHYxLjIyLjExK3Ztd2FyZS4yLWZpcHMuMS10a2cuMQogIC0gdjEuMjEuMTQrdm13YXJlLjItZmlwcy4xLXRrZy4xCiAgdmVyc2lvbjogdjEuNi4wLWZpcHMuMQotIHN1cHBvcnRlZEt1YmVybmV0ZXNWZXJzaW9uczoKICAtIHYxLjI0LjYrdm13YXJlLjEtdGtnLjEKICAtIHYxLjIzLjgrdm13YXJlLjItdGtnLjIKICAtIHYxLjIyLjExK3Ztd2FyZS4yLXRrZy4yCiAgdmVyc2lvbjogdjEuNy4wCg== diff --git a/addons/controllers/testdata/test-kapp-controller-1.yaml b/addons/controllers/testdata/test-kapp-controller-1.yaml deleted file mode 100644 index 6516d02c9e..0000000000 --- a/addons/controllers/testdata/test-kapp-controller-1.yaml +++ /dev/null @@ -1,60 +0,0 @@ ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-kapp-controller-1 - namespace: default - annotations: - tkg.tanzu.vmware.com/tkg-http-proxy: "foo.com" - tkg.tanzu.vmware.com/tkg-https-proxy: "bar.com" - tkg.tanzu.vmware.com/tkg-no-proxy: "foobar.com" - tkg.tanzu.vmware.com/tkg-proxy-ca-cert: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN4ekNDQWErZ0F3SUJBZ0lVTURDYUMxVmUySjFjUnNGTFRWNklDZng1dWc4d0RRWUpLb1pJaHZjTkFRRUwKQlFBd0V6RVJNQThHQTFVRUF3d0laVEpsTFhSbGMzUXdIaGNOTWpJeE1USTVNVGt5TmpNeldoY05Nak14TVRJNQpNVGt5TmpNeldqQVRNUkV3RHdZRFZRUUREQWhsTW1VdGRHVnpkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTUhRd0RRdVdxZXhsMEc5Vldqby9JYjVBa0pkRmlvSm16bXE3ZlRLQlhrb3AzVUwKY3g2WkNrbUg1Um44QzJpWUNMenhuVjdIMmNSN01xd016VHFpajVWWG1vdlpzZy9SbUZTRlBYSE5MMXlRV3U2egpIdTA1R1dTTXBmeGIvWUpmUVM1cTJaUkxPZmxVTkt6cjhvOEY5eDVROWZWZDBkUkxBRStrYXVERVY4NVM2Z1NTCitZUGIvbE9zMU82aGw4cUxVbzBiQW1ybDR2c1ExSGFOdXNNMHNVSlNvZlYrZGswd3hHRG9oalZLcGQ3TWVHYTkKVUV3QmF4Wi9PUXFGUGozd1lMUC9xRm1sbGw5YzlhVG1xUkFnbkwyNnFuSkE1Q1BIL1VMRkxSd3doZ2kybExhUQpEY3JuMkgvTTVxQWZqeEYvQndFa2UydHZuNWF1MzRESE5CYXNGKzhDQXdFQUFhTVRNQkV3RHdZRFZSMFJCQWd3CkJvY0VDbHdxQ0RBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQUNPSnlVN0JCMWlYc09iYW1Bdyt4TlBVcHNEOFIKSHhYdnU0TkNyYVkvaFkrSzMrVzk5SDA1NFVVV3p6a01XcU5xVnIzVXBjTXNidDNDMWxWb0tqWWh3WlUwajd1dQpicGI2ZDhvYml0TVY3L3JSOTNrUjE4d1NSQ2hUVHp5OUhwVC9ja0V2WlRyQUFVUDhQK0dCZUpBY0l3eGdsZ2FaClNja0NjTGJCbFJUbGJOcVE3OHVwYjczNjJ6V3NYdzROMWlLQTZGZkdXSmdoYmhBdzdoeUt3UnUxY3ZkVk9KR3oKU3ltZWhkYVJVVUIyVlg5NmpXNVE5TVl5aW5wN0ZpQjc1UkV0TjZOYVNWOW5OZ2VoQk9TOG9EWHR0N2dGM2pDQgo2TXJ1dW1qN3prMzNpQ3pDQThxMHVrWC9GSzlOOE4rNkFtZng2ZmsxTkJSVURISHJsQW54MU5xbE53PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" - tkg.tanzu.vmware.com/tkg-ip-family: "ipv4" - tkg.tanzu.vmware.com/skip-tls-verify: "registry1,registry2" -spec: - clusterNetwork: - pods: - cidrBlocks: - - 100.96.0.0/11 - services: - cidrBlocks: - - 100.64.0.0/13 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: test-kapp-controller-1-kapp-controller-package - namespace: default - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-kapp-controller-1 - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - config: - httpProxy: "overwrite.foo.com" - dangerousSkipTLSVerify: "registry1,registry2" diff --git a/addons/controllers/testdata/test-kapp-controller-template-config-1.yaml b/addons/controllers/testdata/test-kapp-controller-template-config-1.yaml deleted file mode 100644 index 2dad3e2a5e..0000000000 --- a/addons/controllers/testdata/test-kapp-controller-template-config-1.yaml +++ /dev/null @@ -1,34 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: test-kapp-controller-1-kapp-controller-package - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - config: - httpProxy: "overwrite.foo.com" - dangerousSkipTLSVerify: "registry1,registry2" diff --git a/addons/controllers/testdata/test-kubevip-cloudprovider-config-2.yaml b/addons/controllers/testdata/test-kubevip-cloudprovider-config-2.yaml deleted file mode 100644 index 06905015cb..0000000000 --- a/addons/controllers/testdata/test-kubevip-cloudprovider-config-2.yaml +++ /dev/null @@ -1,85 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-kvcp-2 - namespace: default - annotations: - tkg.tanzu.vmware.com/tkg-http-proxy: "foo.com" - tkg.tanzu.vmware.com/tkg-https-proxy: "bar.com" - tkg.tanzu.vmware.com/tkg-no-proxy: "foobar.com" - tkg.tanzu.vmware.com/tkg-ip-family: "ipv6" -spec: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereCluster - name: test-cluster-kvcp-2 - namespace: default - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: test-cluster-kvcp-2-control-plane - namespace: default - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - topology: - class: test-clusterclass-tcbt - version: v1.24.0 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-kvcp-2 - name: test-cluster-kvcp-2 - namespace: default -spec: - identityRef: - kind: Secret - name: test-cluster-kvcp-2 - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-kvcp-2 - name: test-cluster-kvcp-2-control-plane - namespace: default -spec: - kubeadmConfigSpec: {} - replicas: 5 - version: v1.24.0 - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: test-cluster-kvcp-2-control-plane-template - namespace: default ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-kvcp-2 - name: test-cluster-kvcp-2-control-plane-template - namespace: default -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.24.0+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: KubevipCPIConfig -metadata: - name: test-cluster-kvcp-2 - namespace: default -spec: - loadbalancerCIDRs: 10.0.0.1/24 diff --git a/addons/controllers/testdata/test-kubevip-cloudprovider-config.yaml b/addons/controllers/testdata/test-kubevip-cloudprovider-config.yaml deleted file mode 100644 index fe03cce9b0..0000000000 --- a/addons/controllers/testdata/test-kubevip-cloudprovider-config.yaml +++ /dev/null @@ -1,86 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-kvcp - namespace: default - annotations: - tkg.tanzu.vmware.com/tkg-http-proxy: "foo.com" - tkg.tanzu.vmware.com/tkg-https-proxy: "bar.com" - tkg.tanzu.vmware.com/tkg-no-proxy: "foobar.com" - tkg.tanzu.vmware.com/tkg-ip-family: "ipv6" -spec: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereCluster - name: test-cluster-kvcp - namespace: default - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: test-cluster-kvcp-control-plane - namespace: default - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - topology: - class: test-clusterclass-tcbt - version: v1.24.0 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-kvcp - name: test-cluster-kvcp - namespace: default -spec: - identityRef: - kind: Secret - name: test-cluster-kvcp - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-kvcp - name: test-cluster-kvcp-control-plane - namespace: default -spec: - kubeadmConfigSpec: {} - replicas: 5 - version: v1.24.0 - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: test-cluster-kvcp-control-plane-template - namespace: default ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-kvcp - name: test-cluster-kvcp-control-plane-template - namespace: default -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.24.0+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: KubevipCPIConfig -metadata: - name: test-cluster-kvcp - namespace: default -spec: - loadbalancerIPRanges: 10.0.0.1-10.0.0.2 - loadbalancerCIDRs: 10.0.0.1/24 diff --git a/addons/controllers/testdata/test-machine-namespace-ns-resources.yaml b/addons/controllers/testdata/test-machine-namespace-ns-resources.yaml deleted file mode 100644 index e2860b8b27..0000000000 --- a/addons/controllers/testdata/test-machine-namespace-ns-resources.yaml +++ /dev/null @@ -1,535 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: machine-namespace ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: Machine -metadata: - name: machine-1 - namespace: machine-namespace - labels: - cluster.x-k8s.io/cluster-name: machine-cluster -spec: - version: v1.23.3 - clusterName: machine-cluster - bootstrap: - configRef: - apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 - kind: KubeadmConfig - name: test-controlplane-0 - infrastructureRef: - kind: DockerMachine - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - name: test-controlplane-0 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: machine-cluster - namespace: machine-namespace - labels: - tkg.tanzu.vmware.com/cluster-name: machine-cluster - run.tanzu.vmware.com/tkr: v1.22.3 -spec: - infrastructureRef: - kind: VSphereCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - topology: - class: machine-class - version: v1.22.3 - variables: - - name: tkg.tanzu.vmware.com/tkg-http-proxy - value: "foo.com" - - name: tkg.tanzu.vmware.com/tkg-https-proxy - value: "bar.com" - - name: tkg.tanzu.vmware.com/tkg-no-proxy - value: "foobar.com" - - name: tkg.tanzu.vmware.com/tkg-proxy-ca-cert - value: "dummyCertificate" - - name: tkg.tanzu.vmware.com/tkg-ip-family - value: "ipv4" ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.example.com.1.17.2 - namespace: machine-namespace -spec: - refName: foobar.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar3.example.com.1.17.2 - namespace: machine-namespace -spec: - refName: foobar3.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar3 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar3.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar1.example.com.1.17.2 - namespace: machine-namespace -spec: - refName: foobar1.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar1 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar1.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar1.example.com.1.18.2 - namespace: machine-namespace -spec: - refName: foobar1.example.com - version: 1.18.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar1 1.18.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar1.example.com.1.18.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar2.example.com.1.18.2 - namespace: machine-namespace -spec: - refName: foobar2.example.com - version: 1.18.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar2 1.18.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar2.example.com.1.18.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.0 - namespace: machine-namespace -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.0+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.community.tanzu.vmware.com.0.30.1 - namespace: machine-namespace -spec: - refName: kapp-controller.community.tanzu.vmware.com - version: 0.30.1 - releaseNotes: "kapp-controller 0.30.1 https://github.com/vmware-tanzu/carvel-kapp-controller" - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: projects.registry.vmware.com/tce/kapp-controller@sha256:f62eb81e644b2be3891ce4d09d57f61d4c6dfb6ac308f403362955fffa25f98b - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.1 - namespace: machine-namespace -spec: - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.1 - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v3.19.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.5-zshippable - namespace: machine-namespace -spec: - valuesSchema: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.5-zshippable values schema - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.5-zshippable - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/calico:v3.19.1_vmware.1-tkg.5-zshippable - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-03-07T10:53:29Z" ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - namespace: machine-namespace -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.4-tkg.2-advanced-zshippable - namespace: machine-namespace -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.4-tkg.2-advanced-zshippable - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/antrea:v1.2.3_vmware.4-tkg.2-advanced-zshippable - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-03-07T10:53:29Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.4-tkg.2-advanced-zshippable values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 - namespace: machine-namespace -spec: - refName: vsphere-cpi.tanzu.vmware.com - version: 1.22.3+vmware.1-tkg.1 - releaseNotes: vsphere-cpi 1.22.3 https://github.com/kubernetes/cloud-provider-vsphere - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/vsphere-cpi:v1.22.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: vsphere-csi.community.tanzu.vmware.com.2.4.1 - namespace: machine-namespace -spec: - refName: vsphere-csi.community.tanzu.vmware.com - version: 2.4.1 - releaseNotes: "vsphere-csi 2.4.1-rc.1 https://github.com/kubernetes-sigs/vsphere-csi-driver/releases/tag/v2.4.1-rc.1" - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects.registry.vmware.com/tce/vsphere-csi@sha256:c615f4a95de0161f244f644cfb512449ef8b2c233e63541d16fa44bcd7bd28b6 - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/addons/controllers/testdata/test-management-finalizer.yaml b/addons/controllers/testdata/test-management-finalizer.yaml deleted file mode 100644 index 44e28fe6e6..0000000000 --- a/addons/controllers/testdata/test-management-finalizer.yaml +++ /dev/null @@ -1,289 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: TanzuKubernetesRelease -metadata: - name: management-finalizer-tkr - namespace: tkr-system -spec: - version: management-finalizer-tkr - kubernetesVersion: 1.20.6+vmware.test ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: management-finalizer-cluster - namespace: management-finalizer - labels: - tkg.tanzu.vmware.com/cluster-name: management-finalizer-cluster - tanzuKubernetesRelease: management-finalizer-tkr - cluster-role.tkg.tanzu.vmware.com/management: "" ---- -apiVersion: v1 -kind: Secret -metadata: - name: management-finalizer-cluster-antrea - namespace: management-finalizer - labels: - tkg.tanzu.vmware.com/addon-name: antrea - tkg.tanzu.vmware.com/cluster-name: management-finalizer-cluster -# annotations: -# tkg.tanzu.vmware.com/remote-app: "true" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: | - serviceCidr: 100.64.0.0/13 ---- -apiVersion: v1 -kind: Secret -metadata: - name: management-finalizer-cluster-kapp-controller - namespace: management-finalizer - labels: - tkg.tanzu.vmware.com/addon-name: kapp-controller - tkg.tanzu.vmware.com/cluster-name: management-finalizer-cluster - annotations: - tkg.tanzu.vmware.com/remote-app: "true" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: | - namespace: kapp-controller-ns ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: management-finalizer-tkr - namespace: tkr-system - labels: - tanzuKubernetesRelease: management-finalizer-tkr -data: - bomContent: | - apiVersion: run.tanzu.vmware.com/v1alpha1 - release: - version: v1.20.6+vmware.1-tkg.1 - components: - tkg-core-packages: - - version: v1.4.0+vmware.0 - images: - tanzuCorePackageRepositoryImage: - imagePath: tanzu_core_repo/core-package-repository - tag: v1.4.0+vmware.0 - antrea.vmware.com: - imagePath: tanzu_core/addons/antrea-package - tag: v1.4.0+vmware.1 - calico.vmware.com: - imagePath: tanzu_core/addons/calico-package - tag: v1.4.0+vmware.1 - kapp-controller.vmware.com: - imagePath: tanzu_core/addons/kapp-controller-package - tag: v1.4.0+vmware.1 - metrics-server.vmware.com: - imagePath: tanzu_core/addons/metrics-server-package - tag: v1.4.0+vmware.1 - pinniped.vmware.com: - imagePath: tanzu_core/addons/pinniped-package - tag: v1.4.0+vmware.1 - tanzu-addons-manager.vmware.com: - imagePath: tanzu_core/addons/tanzu-addons-manager - tag: v1.4.0+vmware.1 - vsphere-cpi.vmware.com: - imagePath: tanzu_core/addons/vsphere-cpi-package - tag: v1.4.0+vmware.1 - vsphere-csi.vmware.com: - imagePath: tanzu_core/addons/vsphere-csi-package - tag: v1.4.0+vmware.1 - antrea: - - version: v0.11.3+vmware.2 - images: - antreaImage: - imagePath: antrea/antrea-debian - tag: v0.11.3_vmware.2 - calico_all: - - version: v3.11.3+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni-plugin - tag: v3.11.3_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.11.3_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.11.3_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon - tag: v3.11.3_vmware.1 - cloud_provider_vsphere: - - version: v1.18.1+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.18.1_vmware.1 - cni_plugins: - - version: v0.8.7+vmware.6 - containerd: - - version: v1.4.3+vmware.1 - coredns: - - version: v1.7.0+vmware.8 - images: - coredns: - imagePath: coredns - tag: v1.7.0_vmware.8 - cri_tools: - - version: v1.19.0+vmware.3 - csi_attacher: - - version: v3.0.0+vmware.1 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v3.0.0_vmware.1 - csi_livenessprobe: - - version: v2.1.0+vmware.1 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v2.1.0_vmware.1 - csi_node_driver_registrar: - - version: v2.0.1+vmware.1 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v2.0.1_vmware.1 - csi_provisioner: - - version: v2.0.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v2.0.0_vmware.1 - dex: - - version: v2.27.0+vmware.1 - images: - dexImage: - imagePath: dex - tag: v2.27.0_vmware.1 - etcd: - - version: v3.4.13+vmware.7 - images: - etcd: - imagePath: etcd - tag: v3.4.13_vmware.7 - kapp-controller: - - version: v0.18.0+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.18.0_vmware.1 - kubernetes: - - version: v1.20.6+vmware.1 - images: - kubeAPIServer: - imagePath: kube-apiserver - tag: v1.20.6_vmware.1 - kubeControllerManager: - imagePath: kube-controller-manager - tag: v1.20.6_vmware.1 - kubeE2e: - imagePath: e2e-test - tag: v1.20.6_vmware.1 - kubeProxy: - imagePath: kube-proxy - tag: v1.20.6_vmware.1 - kubeScheduler: - imagePath: kube-scheduler - tag: v1.20.6_vmware.1 - pause: - imagePath: pause - tag: "3.2" - kubernetes-csi_external-resizer: - - version: v1.0.0+vmware.1 - images: - csiExternalResizer: - imagePath: kubernetes-csi_external-resizer - tag: v1.0.0_vmware.1 - kubernetes-sigs_kind: - - version: v1.20.6+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.20.6_vmware.1 - metrics-server: - - version: v0.4.0+vmware.1 - images: - metricsServerImage: - imagePath: metrics-server - tag: v0.4.0_vmware.1 - pinniped: - - version: v0.4.1+vmware.1 - images: - pinnipedImage: - imagePath: pinniped - tag: v0.4.1_vmware.1 - tanzu_core_addons: - - version: v1.3.1 - images: - tanzuAddonsManagerImage: - imagePath: tanzu_core/addons/tanzu-addons-manager - tag: v1.3.1 - tkgPinnipedPostDeployImage: - imagePath: tanzu_core/addons/tkg-pinniped-post-deploy - tag: v1.3.1 - vsphere_csi_driver: - - version: v2.1.0+vmware.1 - images: - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.1.0_vmware.1 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.1.0_vmware.1 - imageConfig: - imageRepository: projects.registry.vmware.com/tkg - addons: - antrea: - category: cni - clusterTypes: - - management - - workload - packageName: antrea.vmware.com - calico: - category: cni - clusterTypes: - - management - - workload - addonTemplatesImage: - packageName: calico.vmware.com - kapp-controller: - category: addons-management - clusterTypes: - - management - - workload - packageName: kapp-controller.vmware.com - metrics-server: - category: metrics - clusterTypes: - - management - - workload - packageName: metrics-server.vmware.com - pinniped: - category: authentication - clusterTypes: - - management - - workload - packageName: pinniped.vmware.com - tanzu-addons-manager: - category: addons-management - clusterTypes: - - management - - workload - packageName: tanzu-addons-manager.vmware.com - vsphere-cpi: - category: cpi - clusterTypes: - - management - - workload - packageName: vsphere-cpi.vmware.com - vsphere-csi: - category: csi - clusterTypes: - - management - - workload - packageName: vsphere-csi.vmware.com diff --git a/addons/controllers/testdata/test-oracle-cpi.yaml b/addons/controllers/testdata/test-oracle-cpi.yaml deleted file mode 100644 index e249a8c7c2..0000000000 --- a/addons/controllers/testdata/test-oracle-cpi.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-cpi - namespace: default -spec: - infrastructureRef: - kind: OCICluster - topology: - version: v1.23.8+vmware.2 - class: tkg-oci-default - variables: - - name: compartmentId - value: test-compartment - - name: externalVCNId - value: test-vcn - - name: privateServiceSubnetId - value: ocid1.subnet.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: OracleCPIConfig -metadata: - name: test-cluster-cpi - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-cluster-cpi - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d ---- -apiVersion: v1 -kind: Namespace -metadata: - name: cluster-api-provider-oci-system ---- -apiVersion: v1 -kind: Secret -metadata: - name: capoci-auth-config - namespace: cluster-api-provider-oci-system -type: Opaque -data: - fingerprint: ZWI6MDI6ZWU6NGI6NGM6eHg6eHg6eHg6eHg6NTU6ZGY6NTQ6MDA6ZGI6YmU6MGY= - key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCgotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg== - passphrase: "" - region: dXMtc2Fuam9zZS0x - tenancy: b2NpZDEudGVuYW5jeS5vYzEuLmFhYWFhYWFheHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4 - useInstancePrincipal: ZmFsc2U= - user: b2NpZDEudXNlci5vYzEuLmFhYWFhYWFheHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: OCICluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi-paravirtual - topology.cluster.x-k8s.io/owned: "" - name: test-cluster-cpi-paravirtual-kl5tl - namespace: default -spec: - region: us-sanjose-1 diff --git a/addons/controllers/testdata/test-packageinstallstatus.yaml b/addons/controllers/testdata/test-packageinstallstatus.yaml deleted file mode 100644 index d51ca81e6b..0000000000 --- a/addons/controllers/testdata/test-packageinstallstatus.yaml +++ /dev/null @@ -1,308 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: test-ns-wlc ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.22.2 -spec: - version: v1.22.2 - kubernetes: - version: v1.22.2 - imageRepository: foo - osImages: [] - bootstrapPackages: [] ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-mng - namespace: tkg-system - labels: - cluster-role.tkg.tanzu.vmware.com/management: "" - tkg.tanzu.vmware.com/cluster-name: test-mng - run.tanzu.vmware.com/tkr: v1.22.2 -spec: - infrastructureRef: - kind: VSphereCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - topology: - class: test-clusterclass-tcbt - version: v1.22.2 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-wlc - namespace: test-ns-wlc - labels: - tkg.tanzu.vmware.com/cluster-name: test-wlc - run.tanzu.vmware.com/tkr: v1.22.2 -spec: - infrastructureRef: - kind: VSphereCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - services: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - topology: - class: test-clusterclass-tcbt - version: v1.22.2 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.22.2 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.30.1 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-mng-kapp-controller-config - cni: - refName: "antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.2" - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: test-mng ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: test-mng-kapp-controller-config - namespace: tkg-system -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: test-mng - namespace: tkg-system -spec: - antrea: - config: - trafficEncapMode: encap ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.2 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.2 - namespace: test-ns-wlc -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.1 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.1 - namespace: test-ns-wlc -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: pkg.test.carvel.dev.1.0.0 - namespace: test-ns-wlc - clusterName : test-wlc -spec: - refName: pkg.test.carvel.dev - version: 1.0.0 - template: - spec: - fetch: - - imgpkgBundle: - image: registry-svc.registry.svc.cluster.local:443/secret-test/test-bundle - template: - - ytt: {} - - kbld: - paths: - - "-" - - ".imgpkg/images.yml" - deploy: - - kapp: {} ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: pkg.test.carvel.dev.1.0.0 - namespace: tkg-system - clusterName : test-mc -spec: - refName: pkg.test.carvel.dev - version: 1.0.0 - template: - spec: - fetch: - - imgpkgBundle: - image: registry-svc.registry.svc.cluster.local:443/secret-test/test-bundle - template: - - ytt: {} - - kbld: - paths: - - "-" - - ".imgpkg/images.yml" - deploy: - - kapp: {} diff --git a/addons/controllers/testdata/test-tkg-system-ns-resources.yaml b/addons/controllers/testdata/test-tkg-system-ns-resources.yaml deleted file mode 100644 index 28e10d2234..0000000000 --- a/addons/controllers/testdata/test-tkg-system-ns-resources.yaml +++ /dev/null @@ -1,834 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.22.3 -spec: - version: v1.22.3 - kubernetes: - version: v1.22.3 - imageRepository: foo - osImages: [] - bootstrapPackages: [] ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.23.3 -spec: - version: v1.23.3 - kubernetes: - version: v1.23.3 - imageRepository: foo - osImages: [] - bootstrapPackages: - - name: antrea.tanzu.vmware.com.1.5.2--vmware.3-tkg.1-advanced-zshippable ---- - apiVersion: run.tanzu.vmware.com/v1alpha3 - kind: TanzuKubernetesRelease - metadata: - name: v1.12.1 - labels: - run.tanzu.vmware.com/legacy-tkr: "" - spec: - version: v1.12.1 - kubernetes: - version: v1.12.1 - imageRepository: foo - osImages: [ ] - bootstrapPackages: [ ] ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.22.3 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.30.0 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-cluster-tcbt-kapp-controller-config - additionalPackages: - - refName: foobar1.example.com.1.17.2 - valuesFrom: - secretRef: foobar1secret - - refName: foobar.example.com.1.17.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: FooBar - name: example-foo - - refName: foobar2.example.com.1.18.2 - valuesFrom: - inline: - key1: sample-value1 - key2: sample-value2 - cni: - refName: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: test-cluster-tcbt - cpi: - refName: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 - valuesFrom: - providerRef: - apiGroup: cpi.tanzu.vmware.com - kind: VSphereCPIConfig - name: test-cluster-cpi - csi: - refName: vsphere-csi.community.tanzu.vmware.com.2.4.1 - valuesFrom: - providerRef: - apiGroup: csi.tanzu.vmware.com - kind: VSphereCSIConfig - name: test-cluster-csi ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrapTemplate -metadata: - name: v1.23.3 - namespace: tkg-system -spec: - kapp: - refName: kapp-controller.tanzu.vmware.com.0.30.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: test-cluster-tcbt-kapp-controller-config - additionalPackages: - - refName: foobar1.example.com.1.18.2 - valuesFrom: - secretRef: foobar1secret - - refName: foobar3.example.com.1.17.2 - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: FooBar - name: example-foo - cni: - refName: antrea.tanzu.vmware.com.1.2.3--vmware.4-tkg.2-advanced-zshippable - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: test-cluster-tcbt - cpi: - refName: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 - valuesFrom: - providerRef: - apiGroup: cpi.tanzu.vmware.com - kind: VSphereCPIConfig - name: test-cluster-cpi - csi: - refName: vsphere-csi.community.tanzu.vmware.com.2.4.1 - valuesFrom: - providerRef: - apiGroup: csi.tanzu.vmware.com - kind: VSphereCSIConfig - name: test-cluster-csi ---- -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: FooBar -metadata: - name: example-foo - namespace: tkg-system -spec: - foo: bar ---- -kind: Secret -metadata: - name: foobar1secret - namespace: tkg-system -stringData: - values.yaml: | - sample-key: sample-value ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: test-cluster-tcbt - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - calico: - config: - vethMTU: 0 ---- -apiVersion: cni.tanzu.vmware.com/v1alpha2 -kind: AntreaConfig -metadata: - name: test-cluster-tcbt - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - antrea: - config: - trafficEncapMode: encap ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: test-cluster-tcbt-kapp-controller-config - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" ---- -apiVersion: v1 -kind: Secret -metadata: - name: cpi-vsphere-credential - namespace: tkg-system -data: - username: Zm9v # foo - password: YmFy # bar ---- -apiVersion: v1 -kind: Secret -metadata: - name: csi-vsphere-credential - namespace: tkg-system -data: - username: Zm9v # foo - password: YmFy # bar ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: test-cluster-cpi - namespace: tkg-system -spec: - vsphereCPI: - mode: vsphereCPI - region: test-region - zone: test-zone - insecureFlag: true - vmInternalNetwork: internal-net - vmExternalNetwork: external-net - vmExcludeInternalNetworkSubnetCidr: 192.168.3.0/24 - vmExcludeExternalNetworkSubnetCidr: 22.22.3.0/24 - vSphereCredentialLocalObjRef: - kind: Secret - name: cpi-vsphere-credential ---- -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: VSphereCSIConfig -metadata: - name: test-cluster-csi - namespace: tkg-system -spec: - vsphereCSI: - mode: vsphereCSI - config: - tlsThumbprint: "yadayada" - namespace: default - clusterName: test-clustername - server: svr-0 - datacenter: dc0 - publicNetwork: "8.2.0.0/16" - region: test-region - zone: test-zone - insecureFlag: false - useTopologyCategories: true - provisionTimeout: 33s - attachTimeout: 77s - resizerTimeout: 99s - vSphereVersion: 8.1.2-release - httpProxy: "1.1.1.1" - httpsProxy: "2.2.2.2" - noProxy: "3.3.3.3" - deploymentReplicas: 3 - windowsSupport: true - vSphereCredentialLocalObjRef: - kind: Secret - name: csi-vsphere-credential ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar.example.com.1.17.2 - namespace: tkg-system -spec: - refName: foobar.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar3.example.com.1.17.2 - namespace: tkg-system -spec: - refName: foobar3.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar3 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar3.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar1.example.com.1.17.2 - namespace: tkg-system -spec: - refName: foobar1.example.com - version: 1.17.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar1 1.17.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar1.example.com.1.17.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar1.example.com.1.18.2 - namespace: tkg-system -spec: - refName: foobar1.example.com - version: 1.18.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar1 1.18.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar1.example.com.1.18.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: foobar2.example.com.1.18.2 - namespace: tkg-system -spec: - refName: foobar2.example.com - version: 1.18.2 - releasedAt: "2021-05-13T18:00:00Z" - releaseNotes: foobar2 1.18.2 - capacityRequirementsDescription: Varies significantly based on cluster size. This should be tuned based on observed usage. - valuesSchema: - openAPIv3: - title: foobar2.example.com.1.18.2+vmware.1-tkg.1 values schema - properties: - namespace: - type: string - description: The namespace in which to deploy fluent-bit. - default: tanzu-system-logging - licenses: - - 'VMware''s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/fluent-bit:v1.7.5_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=5m - - --kube-api-qps=20 - - --kube-api-burst=30 ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.0 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.0 - releaseNotes: kapp-controller 0.30.0 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.0_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.0+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: kapp-controller.tanzu.vmware.com.0.30.2 - namespace: tkg-system -spec: - refName: kapp-controller.tanzu.vmware.com - version: 0.30.2 - releaseNotes: kapp-controller 0.30.2 https://github.com/vmware-tanzu/carvel-kapp-controller - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/kapp-controller:v0.30.2_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: kapp-controller.tanzu.vmware.com.0.30.2+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.1 - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/calico:v3.19.1_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: calico.tanzu.vmware.com.3.19.1--vmware.1-tkg.5-zshippable - namespace: tkg-system -spec: - valuesSchema: - title: calico.tanzu.vmware.com.3.19.1+vmware.1-tkg.5-zshippable values schema - refName: calico.tanzu.vmware.com - version: 3.19.1+vmware.1-tkg.5-zshippable - releaseNotes: calico 3.19.1 https://docs.projectcalico.org/archive/v3.19/release-notes/ - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/calico:v3.19.1_vmware.1-tkg.5-zshippable - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-03-07T10:53:29Z" ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.1-tkg.1 - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:v1.2.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.2.3--vmware.4-tkg.2-advanced-zshippable - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.2.3+vmware.4-tkg.2-advanced-zshippable - releaseNotes: antrea 1.2.3 https://github.com/antrea-io/antrea/releases/tag/v1.2.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/packages/core/antrea:v1.2.3_vmware.4-tkg.2-advanced-zshippable - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2022-03-07T10:53:29Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.2.3+vmware.4-tkg.2-advanced-zshippable values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: vsphere-cpi.tanzu.vmware.com - version: 1.22.3+vmware.1-tkg.1 - releaseNotes: vsphere-cpi 1.22.3 https://github.com/kubernetes/cloud-provider-vsphere - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/vsphere-cpi:v1.22.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: vsphere-cpi.tanzu.vmware.com.1.22.3--vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: vsphere-csi.community.tanzu.vmware.com.2.4.1 - namespace: tkg-system -spec: - refName: vsphere-csi.community.tanzu.vmware.com - version: 2.4.1 - releaseNotes: "vsphere-csi 2.4.1-rc.1 https://github.com/kubernetes-sigs/vsphere-csi-driver/releases/tag/v2.4.1-rc.1" - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects.registry.vmware.com/tce/vsphere-csi@sha256:c615f4a95de0161f244f644cfb512449ef8b2c233e63541d16fa44bcd7bd28b6 - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: {} ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.0.13.3--vmware.1-tkg.1 - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 0.13.3+vmware.1-tkg.1 - releaseNotes: antrea 0.13.3 https://github.com/antrea-io/antrea/releases/tag/v0.13.3 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:0.13.3_vmware.1-tkg.1 - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.0.13.3+vmware.1-tkg.1 values schema ---- -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: antrea.tanzu.vmware.com.1.5.2--vmware.3-tkg.1-advanced-zshippable - namespace: tkg-system -spec: - refName: antrea.tanzu.vmware.com - version: 1.5.2+vmware.3-tkg.1-advanced-zshippable - releaseNotes: antrea 1.5.3 https://github.com/antrea-io/antrea/releases/tag/v1.5.2 - licenses: - - 'VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)' - template: - spec: - fetch: - - imgpkgBundle: - image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/packages/core/antrea:1.5.2+vmware.3-tkg.1-advanced-zshippable - template: - - ytt: - paths: - - config/ - ignoreUnknownComments: true - - kbld: - paths: - - '-' - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --wait-timeout=30s - - --kube-api-qps=20 - - --kube-api-burst=30 - releasedAt: "2021-12-20T10:59:32Z" - valuesSchema: - openAPIv3: - title: antrea.tanzu.vmware.com.1.5.2+vmware.3-tkg.1-advanced-zshippable values schema diff --git a/addons/controllers/testdata/test-vsphere-cpi-non-paravirtual-enqueue-cluster-event-cluster-spec.yaml b/addons/controllers/testdata/test-vsphere-cpi-non-paravirtual-enqueue-cluster-event-cluster-spec.yaml deleted file mode 100644 index cc2cb39848..0000000000 --- a/addons/controllers/testdata/test-vsphere-cpi-non-paravirtual-enqueue-cluster-event-cluster-spec.yaml +++ /dev/null @@ -1,130 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-cpi-enqueue-cluster-event - namespace: default - annotations: - tkg.tanzu.vmware.com/tkg-http-proxy: "foo.com" - tkg.tanzu.vmware.com/tkg-https-proxy: "bar.com" - tkg.tanzu.vmware.com/tkg-no-proxy: "foobar.com" - tkg.tanzu.vmware.com/tkg-ip-family: "ipv6" -spec: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereCluster - name: test-cluster-cpi-enqueue-cluster-event - namespace: default - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: test-cluster-cpi-enqueue-cluster-event-control-plane - namespace: default - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - topology: - class: test-clusterclass-tcbt - version: v1.22.3 ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-cpi-enqueue-cluster-event - namespace: default -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi-enqueue-cluster-event - name: test-cluster-cpi-enqueue-cluster-event - namespace: default -spec: - identityRef: - kind: Secret - name: test-cluster-cpi-enqueue-cluster-event - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi-enqueue-cluster-event - name: test-cluster-cpi-enqueue-cluster-event-control-plane - namespace: default -spec: - kubeadmConfigSpec: {} - replicas: 5 - version: v1.22.3 - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: test-cluster-cpi-enqueue-cluster-event-control-plane-template - namespace: default ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi-enqueue-cluster-event - name: test-cluster-cpi-enqueue-cluster-event-control-plane-template - namespace: default -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: cpi-vsphere-credential - namespace: default -data: - username: Zm9v # foo - password: YmFy # bar ---- -apiVersion: v1 -kind: Secret -metadata: - name: nsxt-credential - namespace: default -data: - password: bnN4dC1wYXNzd29yZA== # nsxt-password - username: bnN4dC1hZG1pbg== # nsxt-admin ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: test-cluster-cpi-enqueue-cluster-event-random - namespace: default -spec: - vsphereCPI: - mode: vsphereCPI - region: test-region - zone: test-zone - insecure: true - vmNetwork: - internal: internal-net - external: external-net - excludeInternalSubnetCidr: 192.168.3.0/24 - excludeExternalSubnetCidr: 22.22.3.0/24 - vSphereCredentialLocalObjRef: - kind: Secret - name: cpi-vsphere-credential - nsxt: - podRoutingEnabled: #@ data.values.NSXT_POD_ROUTING_ENABLED - credentialLocalObjRef: - kind: Secret - name: nsxt-credential - diff --git a/addons/controllers/testdata/test-vsphere-cpi-non-paravirtual-multi-tenancy.yaml b/addons/controllers/testdata/test-vsphere-cpi-non-paravirtual-multi-tenancy.yaml deleted file mode 100644 index 796bb57a1c..0000000000 --- a/addons/controllers/testdata/test-vsphere-cpi-non-paravirtual-multi-tenancy.yaml +++ /dev/null @@ -1,130 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: capv-system ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-cpi-multi-tenancy - namespace: default - annotations: - tkg.tanzu.vmware.com/tkg-http-proxy: "foo.com" - tkg.tanzu.vmware.com/tkg-https-proxy: "bar.com" - tkg.tanzu.vmware.com/tkg-no-proxy: "foobar.com" - tkg.tanzu.vmware.com/tkg-ip-family: "ipv6" -spec: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereCluster - name: test-cluster-cpi-multi-tenancy - namespace: default - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: test-cluster-cpi-multi-tenancy - namespace: default - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - topology: - class: test-clusterclass-tcbt - version: v1.22.3 ---- -apiVersion: v1 -kind: Secret -metadata: - name: multi-tenancy - namespace: capv-system -data: - username: Zm9v # foo - password: YmFy # bar ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereClusterIdentity -metadata: - name: multi-tenancy -spec: - secretName: multi-tenancy - allowedNamespaces: - selector: - matchLabels: {} ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: test-cluster-cpi-multi-tenancy - namespace: default -spec: - identityRef: - kind: VSphereClusterIdentity - name: multi-tenancy - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi-multi-tenancy - name: test-cluster-cpi-multi-tenancy - namespace: default -spec: - kubeadmConfigSpec: {} - replicas: 5 - version: v1.22.3 - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: test-cluster-cpi-multi-tenancy-control-plane - namespace: default ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: test-cluster-cpi-multi-tenancy-control-plane - namespace: default -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: nsxt-credential - namespace: default -data: - password: bnN4dC1wYXNzd29yZA== # nsxt-password - username: bnN4dC1hZG1pbg== # nsxt-admin ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: test-cluster-cpi-multi-tenancy-vsphere-cpi-package - namespace: default - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-cluster-cpi-multi-tenancy - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d -spec: - vsphereCPI: - mode: vsphereCPI - region: test-region - zone: test-zone - insecure: true - vmNetwork: - internal: internal-net - external: external-net - excludeInternalSubnetCidr: 192.168.3.0/24 - excludeExternalSubnetCidr: 22.22.3.0/24 diff --git a/addons/controllers/testdata/test-vsphere-cpi-non-paravirtual.yaml b/addons/controllers/testdata/test-vsphere-cpi-non-paravirtual.yaml deleted file mode 100644 index a2056ce43f..0000000000 --- a/addons/controllers/testdata/test-vsphere-cpi-non-paravirtual.yaml +++ /dev/null @@ -1,131 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-cpi - namespace: default - annotations: - tkg.tanzu.vmware.com/tkg-http-proxy: "foo.com" - tkg.tanzu.vmware.com/tkg-https-proxy: "bar.com" - tkg.tanzu.vmware.com/tkg-no-proxy: "foobar.com" - tkg.tanzu.vmware.com/tkg-ip-family: "ipv6" -spec: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereCluster - name: test-cluster-cpi - namespace: default - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: test-cluster-cpi-control-plane - namespace: default - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - topology: - class: test-clusterclass-tcbt - version: v1.22.3 ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-cpi - namespace: default -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi - name: test-cluster-cpi - namespace: default -spec: - identityRef: - kind: Secret - name: test-cluster-cpi - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi - name: test-cluster-cpi-control-plane - namespace: default -spec: - kubeadmConfigSpec: {} - replicas: 5 - version: v1.22.3 - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: test-cluster-cpi-control-plane-template - namespace: default ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi - name: test-cluster-cpi-control-plane-template - namespace: default -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: cpi-vsphere-credential - namespace: default -data: - username: Zm9v # foo - password: YmFy # bar ---- -apiVersion: v1 -kind: Secret -metadata: - name: nsxt-credential - namespace: default -data: - password: bnN4dC1wYXNzd29yZA== # nsxt-password - username: bnN4dC1hZG1pbg== # nsxt-admin ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: test-cluster-cpi-vsphere-cpi-package - namespace: default - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-cluster-cpi - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d -spec: - vsphereCPI: - mode: vsphereCPI - region: test-region - zone: test-zone - insecure: true - vmNetwork: - internal: internal-net - external: external-net - excludeInternalSubnetCidr: 192.168.3.0/24 - excludeExternalSubnetCidr: 22.22.3.0/24 - vSphereCredentialLocalObjRef: - kind: Secret - name: cpi-vsphere-credential diff --git a/addons/controllers/testdata/test-vsphere-cpi-paravirtual-clusters-same-name.yaml b/addons/controllers/testdata/test-vsphere-cpi-paravirtual-clusters-same-name.yaml deleted file mode 100644 index a8be1e9798..0000000000 --- a/addons/controllers/testdata/test-vsphere-cpi-paravirtual-clusters-same-name.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-cpi-paravirtual-same-name - namespace: default -spec: - infrastructureRef: - apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereCluster - name: test-cluster-cpi-paravirtual-same-name - namespace: default - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: test-cluster-cpi-paravirtual-same-name-vsphere-cpi-package - namespace: default - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-cluster-cpi-paravirtual-same-name - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d -spec: - vsphereCPI: - mode: vsphereParavirtualCPI ---- -apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi-paravirtual-same-name - topology.cluster.x-k8s.io/owned: "" - name: test-cluster-cpi-paravirtual-same-name - namespace: default -spec: - controlPlaneEndpoint: - host: 192.168.116.1 - port: 6443 ---- -apiVersion: v1 -kind: Namespace -metadata: - name: another-ns ---- -apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi-paravirtual-same-name - topology.cluster.x-k8s.io/owned: "" - name: test-cluster-cpi-paravirtual-same-name - namespace: another-ns -spec: - controlPlaneEndpoint: - host: 192.168.116.2 - port: 6443 diff --git a/addons/controllers/testdata/test-vsphere-cpi-paravirtual-with-endpoint.yaml b/addons/controllers/testdata/test-vsphere-cpi-paravirtual-with-endpoint.yaml deleted file mode 100644 index fbd12e16da..0000000000 --- a/addons/controllers/testdata/test-vsphere-cpi-paravirtual-with-endpoint.yaml +++ /dev/null @@ -1,41 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-cpi-paravirtual-with-endpoint - namespace: default -spec: - infrastructureRef: - kind: VSphereCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: test-cluster-cpi-paravirtual-with-endpoint-vsphere-cpi-package - namespace: default - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-cluster-cpi-paravirtual-with-endpoint - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d -spec: - vsphereCPI: - mode: vsphereParavirtualCPI - antreaNSXPodRoutingEnabled: true ---- -apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi-paravirtual-with-endpoint - topology.cluster.x-k8s.io/owned: "" - name: test-cluster-cpi-paravirtual-with-endpoint - namespace: default -spec: - controlPlaneEndpoint: - host: 192.168.116.1 - port: 6443 diff --git a/addons/controllers/testdata/test-vsphere-cpi-paravirtual.yaml b/addons/controllers/testdata/test-vsphere-cpi-paravirtual.yaml deleted file mode 100644 index 1a4e9c0c4c..0000000000 --- a/addons/controllers/testdata/test-vsphere-cpi-paravirtual.yaml +++ /dev/null @@ -1,41 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-cpi-paravirtual - namespace: default -spec: - infrastructureRef: - kind: VSphereCluster - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: test-cluster-cpi-paravirtual-vsphere-cpi-package - namespace: default - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-cluster-cpi-paravirtual - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d -spec: - vsphereCPI: - mode: vsphereParavirtualCPI - antreaNSXPodRoutingEnabled: true ---- -apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-cpi-paravirtual - topology.cluster.x-k8s.io/owned: "" - name: test-cluster-cpi-paravirtual-kl5tl - namespace: default -spec: - controlPlaneEndpoint: - host: 192.168.116.1 - port: 6443 diff --git a/addons/controllers/testdata/test-vsphere-cpi-template-config.yaml b/addons/controllers/testdata/test-vsphere-cpi-template-config.yaml deleted file mode 100644 index cc936049e3..0000000000 --- a/addons/controllers/testdata/test-vsphere-cpi-template-config.yaml +++ /dev/null @@ -1,11 +0,0 @@ ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: test-cluster-cpi-config-template - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - vsphereCPI: - mode: vsphereCPI diff --git a/addons/controllers/testdata/test-vsphere-csi-non-paravirtual-minimal.yaml b/addons/controllers/testdata/test-vsphere-csi-non-paravirtual-minimal.yaml deleted file mode 100644 index 6ea37b4466..0000000000 --- a/addons/controllers/testdata/test-vsphere-csi-non-paravirtual-minimal.yaml +++ /dev/null @@ -1,106 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-csi-minimal - namespace: default - annotations: - tkg.tanzu.vmware.com/tkg-http-proxy: "foo.com" - tkg.tanzu.vmware.com/tkg-https-proxy: "bar.com" - tkg.tanzu.vmware.com/tkg-no-proxy: "foobar.com" - tkg.tanzu.vmware.com/tkg-ip-family: "ipv6" -spec: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereCluster - name: test-cluster-csi-minimal - namespace: default - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: test-cluster-csi-minimal-control-plane - namespace: default - topology: - class: test-clusterclass-tcbt - version: v1.22.3 ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - name: test-cluster-csi-minimal-control-plane - namespace: default - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - kind: Cluster - name: test-cluster-csi-minimal - uid: ad834522-d9a5-4841-beac-991ff3798c00 -spec: - kubeadmConfigSpec: {} - replicas: 2 - version: v1.22.3 - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: test-cluster-csi-minimal-control-plane-template - namespace: default ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-csi-minimal - namespace: default -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-csi-minimal - name: test-cluster-csi-minimal - namespace: default -spec: - identityRef: - kind: Secret - name: test-cluster-csi-minimal - thumbprint: thumbprint-yadayada - server: vsphere-server.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-csi-minimal - name: test-cluster-csi-minimal-control-plane-template - namespace: default -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: VSphereCSIConfig -metadata: - name: test-cluster-csi-minimal-vsphere-csi-package - namespace: default - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-cluster-csi-minimal - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d -spec: - vsphereCSI: - mode: vsphereCSI - diff --git a/addons/controllers/testdata/test-vsphere-csi-non-paravirtual.yaml b/addons/controllers/testdata/test-vsphere-csi-non-paravirtual.yaml deleted file mode 100644 index 6284a6a01c..0000000000 --- a/addons/controllers/testdata/test-vsphere-csi-non-paravirtual.yaml +++ /dev/null @@ -1,138 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-csi - namespace: default - annotations: - tkg.tanzu.vmware.com/tkg-http-proxy: "foo.com" - tkg.tanzu.vmware.com/tkg-https-proxy: "bar.com" - tkg.tanzu.vmware.com/tkg-no-proxy: "foobar.com" - tkg.tanzu.vmware.com/tkg-ip-family: "ipv6" -spec: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereCluster - name: test-cluster-csi - namespace: default - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: test-cluster-csi-control-plane - namespace: default - topology: - class: test-clusterclass-tcbt - version: v1.22.3 ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - name: test-cluster-csi-control-plane - namespace: default -spec: - kubeadmConfigSpec: {} - replicas: 5 - version: v1.22.3 - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: test-cluster-csi-control-plane-template - namespace: default ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-csi - namespace: default -data: - password: QWRtaW4hMjM= # Admin!23 - username: YWRtaW5pc3RyYXRvckB2c3BoZXJlLmxvY2Fs # administrator@vsphere.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-csi - name: test-cluster-csi - namespace: default -spec: - identityRef: - kind: Secret - name: test-cluster-csi - thumbprint: test-thumbprint - server: vsphere-server.local ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-csi - name: test-cluster-csi-control-plane-template - namespace: default -spec: - template: - spec: - datacenter: dc0 - template: /dc0/vm/photon-3-kube-v1.22.3+vmware.1-tkg.2 - network: - devices: - - networkName: test-network - dhcp6: true - dhcp4: false ---- -apiVersion: v1 -kind: Secret -metadata: - name: csi-vsphere-credential - namespace: default -data: - username: Zm9v # foo - password: YmFy # bar ---- -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: VSphereCSIConfig -metadata: - name: test-cluster-csi-vsphere-csi-package - namespace: default - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-cluster-csi - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d -spec: - vsphereCSI: - mode: vsphereCSI - config: - tlsThumbprint: "yadayada" - namespace: default - clusterName: test-clustername - server: svr-0 - datacenter: dc0 - publicNetwork: "8.2.0.0/16" - region: test-region - zone: test-zone - insecureFlag: false - useTopologyCategories: true - provisionTimeout: 33s - attachTimeout: 77s - resizerTimeout: 99s - vSphereVersion: 8.1.2-release - httpProxy: "1.1.1.1" - httpsProxy: "2.2.2.2" - noProxy: "3.3.3.3" - deploymentReplicas: 3 - windowsSupport: true - vSphereCredentialLocalObjRef: - kind: Secret - name: csi-vsphere-credential - netPermissions: - A: - ips: "*" - permissions: READ_WRITE - rootsquash: false - diff --git a/addons/controllers/testdata/test-vsphere-csi-paravirtual.yaml b/addons/controllers/testdata/test-vsphere-csi-paravirtual.yaml deleted file mode 100644 index a50cf6baa4..0000000000 --- a/addons/controllers/testdata/test-vsphere-csi-paravirtual.yaml +++ /dev/null @@ -1,97 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: csi-feature-states - namespace: vmware-system-csi -data: - state1 : "value1" - state2 : "value2" - state3 : "value3" ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-pv-csi - namespace: default -spec: - infrastructureRef: - apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereCluster - name: test-cluster-pv-csi-kl5tm - namespace: default - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - topology: - class: test-clusterclass-tcbt - version: v1.22.3 ---- -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: VSphereCSIConfig -metadata: - name: test-cluster-pv-csi-vsphere-csi-package - namespace: default - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: test-cluster-pv-csi - uid: cbd29b10-c190-422e-86f1-a0321d1aab7d -spec: - vsphereCSI: - mode: vsphereParavirtualCSI ---- -apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-pv-csi - topology.cluster.x-k8s.io/owned: "" - name: test-cluster-pv-csi-kl5tm - namespace: default -spec: - controlPlaneEndpoint: - host: 192.168.116.1 - port: 6443 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: test-cluster-pv-csi - namespace: tkr-system -spec: - infrastructureRef: - apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereCluster - name: test-cluster-pv-csi-kl5tm - namespace: tkr-system - clusterNetwork: - pods: - cidrBlocks: [ "192.168.0.0/16","fd00:100:96::/48" ] - topology: - class: test-clusterclass-tcbt - version: v1.22.3 ---- -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: VSphereCSIConfig -metadata: - name: test-cluster-pv-csi - namespace: tkr-system -spec: - vsphereCSI: - mode: vsphereParavirtualCSI ---- -apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - labels: - cluster.x-k8s.io/cluster-name: test-cluster-pv-csi - topology.cluster.x-k8s.io/owned: "" - name: test-cluster-pv-csi-kl5tm - namespace: tkr-system -spec: - controlPlaneEndpoint: - host: 192.168.116.1 - port: 6443 diff --git a/addons/controllers/testdata/test-vsphere-csi-template-config.yaml b/addons/controllers/testdata/test-vsphere-csi-template-config.yaml deleted file mode 100644 index 33fa632a2f..0000000000 --- a/addons/controllers/testdata/test-vsphere-csi-template-config.yaml +++ /dev/null @@ -1,11 +0,0 @@ ---- -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: VSphereCSIConfig -metadata: - name: test-cluster-csi-template-config - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/template-config: "true" -spec: - vsphereCSI: - mode: vsphereCSI diff --git a/addons/controllers/testdata/test-webhook-manifests.yaml b/addons/controllers/testdata/test-webhook-manifests.yaml deleted file mode 100644 index 173ee22ed6..0000000000 --- a/addons/controllers/testdata/test-webhook-manifests.yaml +++ /dev/null @@ -1,108 +0,0 @@ ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - labels: - tkg.tanzu.vmware.com/addon-webhooks: "addon-webhooks" - name: mutating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: tkg-system - path: /mutate-cni-tanzu-vmware-com-v1alpha1-antreaconfig - port: 9443 - failurePolicy: Fail - name: mantreaconfig.kb.io - rules: - - apiGroups: - - cni.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - antreaconfigs - sideEffects: None - timeoutSeconds: 30 - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: tkg-system - path: /mutate-cni-tanzu-vmware-com-v1alpha1-calicoconfig - port: 9443 - failurePolicy: Fail - name: mcalicoconfig.kb.io - rules: - - apiGroups: - - cni.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - calicoconfigs - sideEffects: None - timeoutSeconds: 30 ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - labels: - tkg.tanzu.vmware.com/addon-webhooks: "addon-webhooks" - name: validating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: tkg-system - path: /validate-cni-tanzu-vmware-com-v1alpha1-antreaconfig - port: 9443 - failurePolicy: Fail - name: vantreaconfig.kb.io - rules: - - apiGroups: - - cni.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - antreaconfigs - sideEffects: None - timeoutSeconds: 30 - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: tkg-system - path: /validate-cni-tanzu-vmware-com-v1alpha1-calicoconfig - port: 9443 - failurePolicy: Fail - name: vcalicoconfig.kb.io - rules: - - apiGroups: - - cni.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - calicoconfigs - sideEffects: None - timeoutSeconds: 30 diff --git a/addons/controllers/testdata/test-workload-finalizer.yaml b/addons/controllers/testdata/test-workload-finalizer.yaml deleted file mode 100644 index fc28dacf4c..0000000000 --- a/addons/controllers/testdata/test-workload-finalizer.yaml +++ /dev/null @@ -1,288 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: TanzuKubernetesRelease -metadata: - name: workload-finalizer-tkr - namespace: tkr-system -spec: - version: workload-finalizer-tkr - kubernetesVersion: 1.20.6+vmware.test ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: workload-finalizer-cluster - namespace: workload-finalizer - labels: - tkg.tanzu.vmware.com/cluster-name: workload-finalizer-cluster - tanzuKubernetesRelease: workload-finalizer-tkr ---- -apiVersion: v1 -kind: Secret -metadata: - name: workload-finalizer-antrea - namespace: workload-finalizer - labels: - tkg.tanzu.vmware.com/addon-name: antrea - tkg.tanzu.vmware.com/cluster-name: workload-finalizer-cluster -# annotations: -# tkg.tanzu.vmware.com/remote-app: "true" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: | - serviceCidr: 100.64.0.0/13 ---- -apiVersion: v1 -kind: Secret -metadata: - name: workload-finalizer-kapp-controller - namespace: workload-finalizer - labels: - tkg.tanzu.vmware.com/addon-name: kapp-controller - tkg.tanzu.vmware.com/cluster-name: workload-finalizer-cluster - annotations: - tkg.tanzu.vmware.com/remote-app: "true" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: | - namespace: kapp-controller-ns ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: workload-finalizer-tkr - namespace: tkr-system - labels: - tanzuKubernetesRelease: workload-finalizer-tkr -data: - bomContent: | - apiVersion: run.tanzu.vmware.com/v1alpha1 - release: - version: v1.20.6+vmware.1-tkg.1 - components: - tkg-core-packages: - - version: v1.4.0+vmware.0 - images: - tanzuCorePackageRepositoryImage: - imagePath: tanzu_core_repo/core-package-repository - tag: v1.4.0+vmware.0 - antrea.vmware.com: - imagePath: tanzu_core/addons/antrea-package - tag: v1.4.0+vmware.1 - calico.vmware.com: - imagePath: tanzu_core/addons/calico-package - tag: v1.4.0+vmware.1 - kapp-controller.vmware.com: - imagePath: tanzu_core/addons/kapp-controller-package - tag: v1.4.0+vmware.1 - metrics-server.vmware.com: - imagePath: tanzu_core/addons/metrics-server-package - tag: v1.4.0+vmware.1 - pinniped.vmware.com: - imagePath: tanzu_core/addons/pinniped-package - tag: v1.4.0+vmware.1 - tanzu-addons-manager.vmware.com: - imagePath: tanzu_core/addons/tanzu-addons-manager - tag: v1.4.0+vmware.1 - vsphere-cpi.vmware.com: - imagePath: tanzu_core/addons/vsphere-cpi-package - tag: v1.4.0+vmware.1 - vsphere-csi.vmware.com: - imagePath: tanzu_core/addons/vsphere-csi-package - tag: v1.4.0+vmware.1 - antrea: - - version: v0.11.3+vmware.2 - images: - antreaImage: - imagePath: antrea/antrea-debian - tag: v0.11.3_vmware.2 - calico_all: - - version: v3.11.3+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni-plugin - tag: v3.11.3_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.11.3_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.11.3_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon - tag: v3.11.3_vmware.1 - cloud_provider_vsphere: - - version: v1.18.1+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.18.1_vmware.1 - cni_plugins: - - version: v0.8.7+vmware.6 - containerd: - - version: v1.4.3+vmware.1 - coredns: - - version: v1.7.0+vmware.8 - images: - coredns: - imagePath: coredns - tag: v1.7.0_vmware.8 - cri_tools: - - version: v1.19.0+vmware.3 - csi_attacher: - - version: v3.0.0+vmware.1 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v3.0.0_vmware.1 - csi_livenessprobe: - - version: v2.1.0+vmware.1 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v2.1.0_vmware.1 - csi_node_driver_registrar: - - version: v2.0.1+vmware.1 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v2.0.1_vmware.1 - csi_provisioner: - - version: v2.0.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v2.0.0_vmware.1 - dex: - - version: v2.27.0+vmware.1 - images: - dexImage: - imagePath: dex - tag: v2.27.0_vmware.1 - etcd: - - version: v3.4.13+vmware.7 - images: - etcd: - imagePath: etcd - tag: v3.4.13_vmware.7 - kapp-controller: - - version: v0.18.0+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.18.0_vmware.1 - kubernetes: - - version: v1.20.6+vmware.1 - images: - kubeAPIServer: - imagePath: kube-apiserver - tag: v1.20.6_vmware.1 - kubeControllerManager: - imagePath: kube-controller-manager - tag: v1.20.6_vmware.1 - kubeE2e: - imagePath: e2e-test - tag: v1.20.6_vmware.1 - kubeProxy: - imagePath: kube-proxy - tag: v1.20.6_vmware.1 - kubeScheduler: - imagePath: kube-scheduler - tag: v1.20.6_vmware.1 - pause: - imagePath: pause - tag: "3.2" - kubernetes-csi_external-resizer: - - version: v1.0.0+vmware.1 - images: - csiExternalResizer: - imagePath: kubernetes-csi_external-resizer - tag: v1.0.0_vmware.1 - kubernetes-sigs_kind: - - version: v1.20.6+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.20.6_vmware.1 - metrics-server: - - version: v0.4.0+vmware.1 - images: - metricsServerImage: - imagePath: metrics-server - tag: v0.4.0_vmware.1 - pinniped: - - version: v0.4.1+vmware.1 - images: - pinnipedImage: - imagePath: pinniped - tag: v0.4.1_vmware.1 - tanzu_core_addons: - - version: v1.3.1 - images: - tanzuAddonsManagerImage: - imagePath: tanzu_core/addons/tanzu-addons-manager - tag: v1.3.1 - tkgPinnipedPostDeployImage: - imagePath: tanzu_core/addons/tkg-pinniped-post-deploy - tag: v1.3.1 - vsphere_csi_driver: - - version: v2.1.0+vmware.1 - images: - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.1.0_vmware.1 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.1.0_vmware.1 - imageConfig: - imageRepository: projects.registry.vmware.com/tkg - addons: - antrea: - category: cni - clusterTypes: - - management - - workload - packageName: antrea.vmware.com - calico: - category: cni - clusterTypes: - - management - - workload - addonTemplatesImage: - packageName: calico.vmware.com - kapp-controller: - category: addons-management - clusterTypes: - - management - - workload - packageName: kapp-controller.vmware.com - metrics-server: - category: metrics - clusterTypes: - - management - - workload - packageName: metrics-server.vmware.com - pinniped: - category: authentication - clusterTypes: - - management - - workload - packageName: pinniped.vmware.com - tanzu-addons-manager: - category: addons-management - clusterTypes: - - management - - workload - packageName: tanzu-addons-manager.vmware.com - vsphere-cpi: - category: cpi - clusterTypes: - - management - - workload - packageName: vsphere-cpi.vmware.com - vsphere-csi: - category: csi - clusterTypes: - - management - - workload - packageName: vsphere-csi.vmware.com diff --git a/addons/controllers/testdata/vmware-csi-system-ns.yaml b/addons/controllers/testdata/vmware-csi-system-ns.yaml deleted file mode 100644 index e48cf0646d..0000000000 --- a/addons/controllers/testdata/vmware-csi-system-ns.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: vmware-system-csi diff --git a/addons/controllers/testdata/webhooks/cluster-pause-webhook-manifest-with-legacy-tkr-label.yaml b/addons/controllers/testdata/webhooks/cluster-pause-webhook-manifest-with-legacy-tkr-label.yaml deleted file mode 100644 index 5c771c6173..0000000000 --- a/addons/controllers/testdata/webhooks/cluster-pause-webhook-manifest-with-legacy-tkr-label.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: v1.20.1---vmware.1 - labels: - run.tanzu.vmware.com/legacy-tkr: "" -spec: - version: v1.20.1+vmware.1 - kubernetes: - version: v1.20.1+vmware.1 - imageRepository: foo - osImages: [ ] - bootstrapPackages: [ ] diff --git a/addons/controllers/testdata/webhooks/cluster-pause-webhook-manifest.yaml b/addons/controllers/testdata/webhooks/cluster-pause-webhook-manifest.yaml deleted file mode 100644 index a1decbb001..0000000000 --- a/addons/controllers/testdata/webhooks/cluster-pause-webhook-manifest.yaml +++ /dev/null @@ -1,44 +0,0 @@ ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - labels: - tkg.tanzu.vmware.com/addon-webhooks: "addon-webhooks" - name: cluster-pause-mutating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - #placeholder for cabundle. To be modifed by patch or programatically. - caBundle: Cg== - service: - name: tanzu-addons-manager-webhook-service - namespace: tkg-system - path: /mutate-cluster-x-k8s-io-v1beta1-cluster - port: 9443 - failurePolicy: Fail - name: cluster.pause.mutating.vmware.com - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - UPDATE - resources: - - clusters - sideEffects: None - timeoutSeconds: 10 ---- - apiVersion: run.tanzu.vmware.com/v1alpha3 - kind: TanzuKubernetesRelease - metadata: - name: v1.19.3---vmware.1 - spec: - version: v1.19.3+vmware.1 - kubernetes: - version: v1.19.3+vmware.1 - imageRepository: foo - osImages: [ ] - bootstrapPackages: [ ] diff --git a/addons/controllers/testdata/webhooks/clusterbootstrap-webhook-manifests.yaml b/addons/controllers/testdata/webhooks/clusterbootstrap-webhook-manifests.yaml deleted file mode 100644 index 8cb5f63ddc..0000000000 --- a/addons/controllers/testdata/webhooks/clusterbootstrap-webhook-manifests.yaml +++ /dev/null @@ -1,101 +0,0 @@ ---- -apiVersion: v1 -kind: Service -metadata: - name: tanzu-addons-manager-webhook-service - namespace: tkg-system -spec: - type: ExternalName - externalName: 127.0.0.1 ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - labels: - tkg.tanzu.vmware.com/addon-webhooks: "addon-webhooks" - name: clusterbootstrap-mutating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - #placeholder for cabundle. To be modifed by patch or programatically. - caBundle: Cg== - service: - name: tanzu-addons-manager-webhook-service - namespace: tkg-system - path: /mutate-run-tanzu-vmware-com-v1alpha3-clusterbootstrap - port: 9443 - failurePolicy: Fail - name: clusterbootstrap.mutating.vmware.com - rules: - - apiGroups: - - run.tanzu.vmware.com - apiVersions: - - v1alpha3 - operations: - - CREATE - - UPDATE - resources: - - clusterbootstraps - sideEffects: None - timeoutSeconds: 30 ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - creationTimestamp: null - labels: - tkg.tanzu.vmware.com/addon-webhooks: "addon-webhooks" - name: clusterbootstrap-validating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - #placeholder for cabundle. To be modifed by patch or programatically. - caBundle: Cg== - service: - name: tanzu-addons-manager-webhook-service - namespace: tkg-system - path: /validate-run-tanzu-vmware-com-v1alpha3-clusterbootstrap - port: 9443 - failurePolicy: Fail - name: clusterbootstrap.validating.vmware.com - rules: - - apiGroups: - - run.tanzu.vmware.com - apiVersions: - - v1alpha3 - operations: - - CREATE - - UPDATE - resources: - - clusterbootstraps - sideEffects: None - timeoutSeconds: 30 - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - #placeholder for cabundle. To be modifed by patch or programatically. - caBundle: Cg== - service: - name: tanzu-addons-manager-webhook-service - namespace: tkg-system - path: /validate-run-tanzu-vmware-com-v1alpha3-clusterbootstraptemplate - port: 9443 - failurePolicy: Fail - name: clusterbootstraptemplate.validating.vmware.com - rules: - - apiGroups: - - run.tanzu.vmware.com - apiVersions: - - v1alpha3 - operations: - - CREATE - - UPDATE - resources: - - clusterbootstraptemplates - sideEffects: None - timeoutSeconds: 30 diff --git a/addons/controllers/testdata/webhooks/test-antrea-calico-webhook-manifests.yaml b/addons/controllers/testdata/webhooks/test-antrea-calico-webhook-manifests.yaml deleted file mode 100644 index 00a57a6205..0000000000 --- a/addons/controllers/testdata/webhooks/test-antrea-calico-webhook-manifests.yaml +++ /dev/null @@ -1,54 +0,0 @@ ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - labels: - tkg.tanzu.vmware.com/addon-webhooks: "addon-webhooks" - name: validating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: tkg-system - path: /validate-cni-tanzu-vmware-com-v1alpha1-antreaconfig - port: 9443 - failurePolicy: Fail - name: vantreaconfig.kb.io - rules: - - apiGroups: - - cni.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - antreaconfigs - sideEffects: None - timeoutSeconds: 30 - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: tkg-system - path: /validate-cni-tanzu-vmware-com-v1alpha1-calicoconfig - port: 9443 - failurePolicy: Fail - name: vcalicoconfig.kb.io - rules: - - apiGroups: - - cni.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - calicoconfigs - sideEffects: None - timeoutSeconds: 30 diff --git a/addons/controllers/utils/suite_test.go b/addons/controllers/utils/suite_test.go deleted file mode 100644 index f46f1615d6..0000000000 --- a/addons/controllers/utils/suite_test.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "sigs.k8s.io/controller-runtime/pkg/envtest/printer" -) - -// These tests use Ginkgo (BDD-style Go testing framework). Refer to -// http://onsi.github.io/ginkgo/ to learn more about Ginkgo. - -const () - -var () - -func TestAddonControllerUtils(t *testing.T) { - RegisterFailHandler(Fail) - - RunSpecsWithDefaultAndCustomReporters(t, - "Addon Controller Utils Suite", - []Reporter{printer.NewlineReporter{}}) -} - -var _ = BeforeSuite(func(done Done) { - - close(done) -}, 60) - -var _ = AfterSuite(func() { - Expect(true).To(BeTrue()) -}) diff --git a/addons/controllers/utils/utils.go b/addons/controllers/utils/utils.go deleted file mode 100644 index 1161d15584..0000000000 --- a/addons/controllers/utils/utils.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package utils contains utility functions shared by controllers -package utils - -import ( - "context" - "fmt" - "strings" - - "github.com/pkg/errors" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/types" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capvvmwarev1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/vmware/v1beta1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - kubeadmv1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/log" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" -) - -// VSphereClusterParavirtualForCAPICluster gets the VSphereCluster CR for the cluster object in paravirtual mode -func VSphereClusterParavirtualForCAPICluster(ctx context.Context, clt client.Client, cluster *clusterapiv1beta1.Cluster) (*capvvmwarev1beta1.VSphereCluster, error) { - vSphereClusterRef := cluster.Spec.InfrastructureRef - if vSphereClusterRef == nil { - return nil, fmt.Errorf("cluster %s 's infrastructure reference is not set yet", cluster.Name) - } - if vSphereClusterRef.Kind != constants.InfrastructureRefVSphere || vSphereClusterRef.APIVersion != capvvmwarev1beta1.GroupVersion.String() { - return nil, fmt.Errorf("cluster %s 's infrastructure reference is not a paravirt vSphereCluster: %v", cluster.Name, vSphereClusterRef) - } - vsphereCluster := &capvvmwarev1beta1.VSphereCluster{} - if err := clt.Get(ctx, types.NamespacedName{Namespace: vSphereClusterRef.Namespace, Name: vSphereClusterRef.Name}, vsphereCluster); err != nil { - return nil, err - } - return vsphereCluster, nil -} - -// VSphereClusterNonParavirtualForCluster gets the VSphereCluster CR for the cluster object in non-paravirtual mode -func VSphereClusterNonParavirtualForCluster(ctx context.Context, clt client.Client, cluster *clusterapiv1beta1.Cluster) (*capvv1beta1.VSphereCluster, error) { - vSphereClusterRef := cluster.Spec.InfrastructureRef - if vSphereClusterRef == nil { - return nil, fmt.Errorf("cluster %s 's infrastructure reference is not set yet", cluster.Name) - } - vsphereCluster := &capvv1beta1.VSphereCluster{} - if vSphereClusterRef.Kind != constants.InfrastructureRefVSphere || vSphereClusterRef.APIVersion != capvv1beta1.GroupVersion.String() { - return nil, fmt.Errorf("cluster %s 's infrastructure reference is not a non-paravirt vSphereCluster: %v", cluster.Name, vSphereClusterRef) - } - if err := clt.Get(ctx, types.NamespacedName{Namespace: vSphereClusterRef.Namespace, Name: vSphereClusterRef.Name}, vsphereCluster); err != nil { - return nil, err - } - return vsphereCluster, nil -} - -// ControlPlaneVsphereMachineTemplateNonParavirtualForCluster gets the VsphereMachineTemplate CR of control plane -func ControlPlaneVsphereMachineTemplateNonParavirtualForCluster(ctx context.Context, clt client.Client, cluster *clusterapiv1beta1.Cluster) (*capvv1beta1.VSphereMachineTemplate, error) { - controlPlaneRef := cluster.Spec.ControlPlaneRef - if controlPlaneRef == nil { - return nil, fmt.Errorf("cluster %s 's controlplane reference is not set yet", cluster.Name) - } - controlPlane := &kubeadmv1beta1.KubeadmControlPlane{} - if err := clt.Get(ctx, types.NamespacedName{Namespace: controlPlaneRef.Namespace, Name: controlPlaneRef.Name}, controlPlane); err != nil { - return nil, err - } - vSphereMachineTemplateRef := controlPlane.Spec.MachineTemplate.InfrastructureRef - vSphereMachineTemplate := &capvv1beta1.VSphereMachineTemplate{} - if vSphereMachineTemplateRef.Kind != constants.InfrastructureRefVSphereMachineTemplate || vSphereMachineTemplateRef.APIVersion != capvv1beta1.GroupVersion.String() { - return nil, fmt.Errorf("cluster %s 's controlplane machinetemplate reference is not a non-paravirt vSphereMachineTemplate: %v", cluster.Name, vSphereMachineTemplateRef) - } - if err := clt.Get(ctx, types.NamespacedName{Namespace: vSphereMachineTemplateRef.Namespace, Name: vSphereMachineTemplateRef.Name}, vSphereMachineTemplate); err != nil { - return nil, err - } - return vSphereMachineTemplate, nil -} - -// ControlPlaneName returns the control plane name for a cluster name -func ControlPlaneName(clusterName string) string { - return fmt.Sprintf("%s-control-plane", clusterName) -} - -// GetSecret gets the secret object given its name and namespace -func GetSecret(ctx context.Context, clt client.Client, namespace, name string) (*v1.Secret, error) { - secret := &v1.Secret{} - if err := clt.Get(ctx, types.NamespacedName{Namespace: namespace, Name: name}, secret); err != nil { - if apierrors.IsNotFound(err) { - return nil, errors.Errorf("Secret %s/%s not found", namespace, name) - } - return nil, errors.Errorf("Secret %s/%s could not be fetched, error %v", namespace, name, err) - } - return secret, nil -} - -// GetUsernameAndPasswordFromSecret extracts a username and password from secret -func GetUsernameAndPasswordFromSecret(s *v1.Secret) (string, string, error) { - username, exists := s.Data["username"] - if !exists { - return "", "", errors.Errorf("Secret %s/%s doesn't have string data with username", s.Namespace, s.Name) - } - password, exists := s.Data["password"] - if !exists { - return "", "", errors.Errorf("Secret %s/%s doesn't have string data with password", s.Namespace, s.Name) - } - return string(username), string(password), nil -} - -// GetCCMName returns the name of cloud control manager for a cluster -func GetCCMName(cluster *clusterapiv1beta1.Cluster) string { - return fmt.Sprintf("%s-%s", cluster.Name, "ccm") -} - -// TryParseClusterVariableBool tries to parse a boolean cluster variable, -// info any error that occurs -func TryParseClusterVariableBool(ctx context.Context, cluster *clusterapiv1beta1.Cluster, - variableName string) bool { - - res, err := util.ParseClusterVariableBool(cluster, variableName) - if err != nil { - log.FromContext(ctx).Error(err, "cannot parse cluster variable", "key", variableName) - } - return res -} - -// TryParseClusterVariableString tries to parse a string cluster variable, -// info any error that occurs -func TryParseClusterVariableString(ctx context.Context, cluster *clusterapiv1beta1.Cluster, - variableName string) string { - - res, err := util.ParseClusterVariableString(cluster, variableName) - if err != nil { - log.FromContext(ctx).Error(err, "cannot parse cluster variable", "key", variableName) - } - return res -} - -// GetOwnerCluster returns cluster owner for the object. -// Returns cluster=nil and err if no cluster can be determined as owner. -// Returns cluster object with only name and namespace and err, -// if details for the cluster listed as owner reference can not be found. -func GetOwnerCluster(ctx context.Context, k8sClient client.Client, k8sObject client.Object, namespace, pkgRefName string) (*clusterapiv1beta1.Cluster, error) { - logger := log.FromContext(ctx) - cluster := &clusterapiv1beta1.Cluster{} - clusterName := "" - - for _, ownerRef := range k8sObject.GetOwnerReferences() { - if strings.EqualFold(ownerRef.Kind, constants.ClusterKind) { - clusterName = ownerRef.Name - break - } - } - if clusterName != "" { - cluster.Name = clusterName - cluster.Namespace = namespace - } else { - errorString := fmt.Sprintf("no owner cluster could be determined for %s/%s", k8sObject.GetNamespace(), k8sObject.GetName()) - logger.Info(errorString) - err := errors.New(errorString) - return nil, err - } - - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(cluster), cluster) - - return cluster, err -} - -// VerifyOwnerRef verifies that the ownerKind name ownerName is listed in the -// list of the objects owner references. -func VerifyOwnerRef(k8sObject client.Object, ownerName, ownerKind string) bool { - // check owner reference - ownerReferences := k8sObject.GetOwnerReferences() - if len(ownerReferences) == 0 { - return false - } - for _, ownerRef := range ownerReferences { - if strings.EqualFold(ownerRef.Kind, ownerKind) && ownerRef.Name == ownerName { - return true - } - } - return false -} diff --git a/addons/controllers/utils/utils_test.go b/addons/controllers/utils/utils_test.go deleted file mode 100644 index 36535aa63b..0000000000 --- a/addons/controllers/utils/utils_test.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "context" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/uuid" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" -) - -var _ = Describe("AddonsControllerUtils", func() { - - const ( - MISSINGCLUSTERNAME = "missing_cluster" - PRESENTCLUSTERNAME = "present_cluster" - NAMESPACE = "cluster_name_space" - PACKAGEREFNAME = "somepackage.tanzu.vmware.com" - ) - var ( - presentClusterUUID = uuid.NewUUID() - scheme = runtime.NewScheme() - fakeClient client.Client - objectMeta metav1.ObjectMeta - ) - BeforeEach(func() { - presentCluster := &clusterapiv1beta1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: PRESENTCLUSTERNAME, - Namespace: NAMESPACE, - UID: presentClusterUUID, - }, - } - err := clientgoscheme.AddToScheme(scheme) - Expect(err).ToNot(HaveOccurred()) - err = clusterapiv1beta1.AddToScheme(scheme) - Expect(err).ToNot(HaveOccurred()) - fakeClient = fake.NewClientBuilder().WithScheme(scheme).WithObjects(presentCluster).Build() - }) - - When("cluser is listed as owner reference", func() { - BeforeEach(func() { - objectMeta = metav1.ObjectMeta{ - Name: "randoName", - Namespace: NAMESPACE, - } - }) - It("VerifyOwnerRef should return true", func() { - - clusterOwnerRef := metav1.OwnerReference{ - Kind: constants.ClusterKind, - Name: PRESENTCLUSTERNAME, - } - objectMeta.OwnerReferences = []metav1.OwnerReference{clusterOwnerRef} - k8sObject := corev1.Secret{ - ObjectMeta: objectMeta, - } - Expect(VerifyOwnerRef(&k8sObject, PRESENTCLUSTERNAME, constants.ClusterKind)).To(BeTrue()) - - }) - Context(" cannot be fetched", func() { - It("GetOnwerCluster should return cluster with name and namespace and err", func() { - - clusterOwnerRef := metav1.OwnerReference{ - Kind: constants.ClusterKind, - Name: MISSINGCLUSTERNAME, - } - objectMeta.OwnerReferences = []metav1.OwnerReference{clusterOwnerRef} - k8sObject := corev1.Secret{ - ObjectMeta: objectMeta, - } - fakeBrokenClient := fake.NewClientBuilder().Build() - cluster, err := GetOwnerCluster(context.TODO(), fakeBrokenClient, &k8sObject, NAMESPACE, PACKAGEREFNAME) - Expect(cluster).NotTo(BeNil()) - Expect(err).To(HaveOccurred()) - Expect(apierrors.IsNotFound(err)).ToNot(BeTrue()) - Expect(cluster.Name).To(Equal(MISSINGCLUSTERNAME)) - Expect(cluster.Namespace).To(Equal(NAMESPACE)) - }) - }) - Context(" is not found ", func() { - It("GetOnwerCluster should return cluster with name and namespace and not found error", func() { - - clusterOwnerRef := metav1.OwnerReference{ - Kind: constants.ClusterKind, - Name: MISSINGCLUSTERNAME, - } - objectMeta.OwnerReferences = []metav1.OwnerReference{clusterOwnerRef} - k8sObject := corev1.Secret{ - ObjectMeta: objectMeta, - } - - cluster, err := GetOwnerCluster(context.TODO(), fakeClient, &k8sObject, NAMESPACE, PACKAGEREFNAME) - Expect(cluster).NotTo(BeNil()) - Expect(err).To(HaveOccurred()) - Expect(apierrors.IsNotFound(err)).To(BeTrue()) - Expect(cluster.Name).To(Equal(MISSINGCLUSTERNAME)) - Expect(cluster.Namespace).To(Equal(NAMESPACE)) - }) - }) - Context(" is found", func() { - It("GetOnwerCluster should return cluster with detaisl and no error", func() { - - clusterOwnerRef := metav1.OwnerReference{ - Kind: constants.ClusterKind, - Name: PRESENTCLUSTERNAME, - } - objectMeta.OwnerReferences = []metav1.OwnerReference{clusterOwnerRef} - k8sObject := corev1.Secret{ - ObjectMeta: objectMeta, - } - cluster, err := GetOwnerCluster(context.TODO(), fakeClient, &k8sObject, NAMESPACE, PACKAGEREFNAME) - Expect(err).ToNot(HaveOccurred()) - Expect(cluster.Name).To(Equal(PRESENTCLUSTERNAME)) - Expect(cluster.Namespace).To(Equal(NAMESPACE)) - Expect(cluster.UID).To(Equal(presentClusterUUID)) - }) - }) - - }) - - When(" a cluster is not listed as owner reference", func() { - It("VerifyOwnerRef should return false", func() { - - clusterOwnerRef := metav1.OwnerReference{ - Kind: constants.ClusterKind, - Name: PRESENTCLUSTERNAME, - } - objectMeta.OwnerReferences = []metav1.OwnerReference{clusterOwnerRef} - k8sObject := corev1.Secret{ - ObjectMeta: objectMeta, - } - Expect(VerifyOwnerRef(&k8sObject, MISSINGCLUSTERNAME, constants.ClusterKind)).To(BeFalse()) - - }) - It("GetOnwerCluster should return cluster=nil and error", func() { - k8sObject := corev1.Secret{} - cluster, err := GetOwnerCluster(context.TODO(), fakeClient, &k8sObject, NAMESPACE, PACKAGEREFNAME) - Expect(cluster).To(BeNil()) - Expect(err).To(HaveOccurred()) - }) - }) -}) diff --git a/addons/controllers/vspherecpiconfig_controller_test.go b/addons/controllers/vspherecpiconfig_controller_test.go deleted file mode 100644 index ebfcfa20d9..0000000000 --- a/addons/controllers/vspherecpiconfig_controller_test.go +++ /dev/null @@ -1,687 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - "os" - "regexp" - "strconv" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - v1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capvvmwarev1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/vmware/v1beta1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - "sigs.k8s.io/controller-runtime/pkg/client" - - controllers "github.com/vmware-tanzu/tanzu-framework/addons/controllers/cpi" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - cpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" -) - -const ( - defaultString = "default" - testSupervisorAPIServerVIP = "10.0.0.100" - testSupervisorAPIServerPort = 6883 -) - -func newTestSupervisorLBService() *v1.Service { - return &v1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: controllers.SupervisorLoadBalancerSvcName, - Namespace: controllers.SupervisorLoadBalancerSvcNamespace, - }, - Spec: v1.ServiceSpec{ - // Note: This will be service with no selectors. The endpoints will be manually created. - Ports: []v1.ServicePort{ - { - Name: controllers.SupervisorLoadBalancerSvcAPIServerPortName, - Port: testSupervisorAPIServerPort, - TargetPort: intstr.FromInt(testSupervisorAPIServerPort), - }, - }, - }, - } -} - -func newTestSupervisorLBServiceStatus() v1.ServiceStatus { - return v1.ServiceStatus{ - LoadBalancer: v1.LoadBalancerStatus{ - Ingress: []v1.LoadBalancerIngress{ - { - IP: testSupervisorAPIServerVIP, - Ports: []v1.PortStatus{ - { - Port: int32(testSupervisorAPIServerPort), - Protocol: v1.ProtocolTCP, - }, - }, - }, - }, - }, - } -} - -func newClusterInfoConfigMap() *v1.ConfigMap { - return &v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: controllers.ConfigMapClusterInfo, - Namespace: metav1.NamespacePublic, - }, - Data: map[string]string{ - "kubeconfig": `apiVersion: v1 -clusters: -- cluster: - certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1ETXlOVEExTkRNd01Wb1hEVE15TURNeU1qQTFORE13TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT25TClZOTlFzb043bExlekdxcmFpb01EOHJDeU9JSDFVVnJqT0x3YWp5UXZQeHRaYjdRdE9DRTJia282RytJcFJlQzYKZ3hIZi9aQi83VXNvTzVqaXpvcWpJUVpsdjZzSm9zR0I0c1Q4NG9hTGtIT21ISEU5a0w5U09Wa1FuT2J5ZWUzNApFaExnUHZWb1pKc05xMTRVWXJsS1R1dnBxNGhpY2pNU1Vua3ZpQmtiY3BCL0oxaUpBbXpIV2tnSkdlSk5HYTNnCk1lSXUxSzJVZ1I3NWp5bkpJSUsvdHFOMyt3VGl1TEcyNDhzZkVCY29pSWFYNTdoQ0E3d0hKR3RaZVJDQmlhNTAKc2JqbFFGd0hEblJldjBPZlNxeE4wZVE3ZVZwQ1NKWWFIQWtmc0t4ZXBSNXNTMnRrRFBVMlg4cHNmcEVQZGdwaApXUS9MN1JiYWdvbE91VkRzdkdVQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFCZmp0dFp6NDNwU3NUelM5ZVFzK0lkL3VjOVcKZkxWL2VCMXhOaUJWbXN6MUNsZldaZ1VIeWFsZ1RtRTlHdGtQVnhja2pSczNXQ0hlRUY4N1psOENobEFFMnFrZwpRcE5BVDMyM3RpOVk1TWk3bWZvOFl2OXdOL0ZPNzRwbnB2OElUVXpoRVlJaGxUZFYrd3RmWHUvTmNzN1Z0akNBCkNWNnExeU5lbG05eU9CVW51RElRNVo0L1AvYXFLRDFzSXNCSFJZZVU3SzVEaklSTGNpN3gvb2dlQ2F0ZVowNFoKeWExd2NXVXB3SnNpaGxIOCtHUkJkZ2h1RzZ4aC9ka1JhNmRLbHpYdVRManpsdVYyRUp6N29hZGthSUUybzM3RQpoazZ2aERBc1JHSCtCdnJtcFZJYjNsYTVGbDZHRkd2VElKMGFNT0pMTTVFa3pHNFlUeWpNRi9qK3Joaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= - server: https://172.17.0.3:6773 - name: "" -contexts: null -current-context: "" -kind: Config -preferences: {} -users: null`, - }, - } -} - -func tryCreateIfNotExists(ctx context.Context, client client.Client, object client.Object) error { - err := client.Create(ctx, object) - if apierrors.IsAlreadyExists(err) { - return nil - } - return err -} - -func getSecretDataValuesForCluster(clusterName string) (string, error) { - secret := &v1.Secret{} - secretKey := client.ObjectKey{ - Namespace: defaultString, - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.CPIAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return "", err - } - secretData := string(secret.Data["values.yaml"]) - return secretData, nil -} - -var _ = Describe("VSphereCPIConfig Reconciler", func() { - var ( - key client.ObjectKey - configKey client.ObjectKey - clusterName string - clusterResourceFilePath string - vsphereClusterName string - ) - - JustBeforeEach(func() { - By("Creating cluster and VSphereCPIConfig resources") - key = client.ObjectKey{ - Namespace: defaultString, - Name: clusterName, - } - configKey = client.ObjectKey{ - Namespace: defaultString, - Name: util.GeneratePackageSecretName(clusterName, constants.CPIDefaultRefName), - } - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - }) - - AfterEach(func() { - By("Deleting cluster and VSphereCPIConfig resources") - for _, filePath := range []string{clusterResourceFilePath} { - f, err := os.Open(filePath) - Expect(err).ToNot(HaveOccurred()) - if err = testutil.DeleteResources(f, cfg, dynamicClient, true); !apierrors.IsNotFound(err) { - // namespace has been explicitly deleted using testutil.DeleteNamespace - // ignore its NotFound error here - Expect(err).ToNot(HaveOccurred()) - } - Expect(f.Close()).ToNot(HaveOccurred()) - } - }) - - Context("reconcile VSphereCPIConfig manifests in non-paravirtual mode, no multitenancy", func() { - BeforeEach(func() { - clusterName = "test-cluster-cpi" - clusterResourceFilePath = "testdata/test-vsphere-cpi-non-paravirtual.yaml" - }) - - It("Should reconcile VSphereCPIConfig and create data values secret for VSphereCPIConfig on management cluster", func() { - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, cluster); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // the vsphere cluster and vsphere machine template should be provided - vsphereCluster := &capvv1beta1.VSphereCluster{} - cpMachineTemplate := &capvv1beta1.VSphereMachineTemplate{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, vsphereCluster); err != nil { - return false - } - if err := k8sClient.Get(ctx, client.ObjectKey{ - Namespace: defaultString, - Name: clusterName + "-control-plane-template", - }, cpMachineTemplate); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // the cpi config object should be deployed - config := &cpiv1alpha1.VSphereCPIConfig{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, configKey, config); err != nil { - return false - } - Expect(*config.Spec.VSphereCPI.Mode).Should(Equal("vsphereCPI")) - Expect(*config.Spec.VSphereCPI.Region).Should(Equal("test-region")) - Expect(*config.Spec.VSphereCPI.Zone).Should(Equal("test-zone")) - - if len(config.OwnerReferences) == 0 { - return false - } - Expect(len(config.OwnerReferences)).Should(Equal(1)) - Expect(config.OwnerReferences[0].Name).Should(Equal(clusterName)) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // the data values secret should be generated - secret := &v1.Secret{} - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: defaultString, - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.CPIAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return false - } - secretData := string(secret.Data["values.yaml"]) - Expect(len(secretData)).ShouldNot(BeZero()) - Expect(strings.Contains(secretData, "vsphereCPI:")).Should(BeTrue()) - Expect(strings.Contains(secretData, "mode: vsphereCPI")).Should(BeTrue()) - Expect(strings.Contains(secretData, "datacenter: dc0")).Should(BeTrue()) - Expect(strings.Contains(secretData, "region: test-region")).Should(BeTrue()) - Expect(strings.Contains(secretData, "zone: test-zone")).Should(BeTrue()) - Expect(strings.Contains(secretData, "insecureFlag: true")).Should(BeTrue()) - Expect(strings.Contains(secretData, "ipFamily: ipv6")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vmInternalNetwork: internal-net")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vmExternalNetwork: external-net")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vmExcludeInternalNetworkSubnetCidr: 192.168.3.0/24")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vmExcludeExternalNetworkSubnetCidr: 22.22.3.0/24")).Should(BeTrue()) - Expect(strings.Contains(secretData, "tlsThumbprint: test-thumbprint")).Should(BeTrue()) - Expect(strings.Contains(secretData, "server: vsphere-server.local")).Should(BeTrue()) - Expect(strings.Contains(secretData, "username: foo")).Should(BeTrue()) - Expect(strings.Contains(secretData, "password: bar")).Should(BeTrue()) - - Expect(strings.Contains(secretData, "http_proxy: foo.com")).Should(BeTrue()) - Expect(strings.Contains(secretData, "https_proxy: bar.com")).Should(BeTrue()) - Expect(strings.Contains(secretData, "no_proxy: foobar.com")).Should(BeTrue()) - - //assert that there are no paravirt datavalue keys - Expect(strings.Contains(secretData, "clusterAPIVersion:")).Should(BeFalse()) - Expect(strings.Contains(secretData, "clusterKind:")).Should(BeFalse()) - Expect(strings.Contains(secretData, "clusterName:")).Should(BeFalse()) - Expect(strings.Contains(secretData, "supervisorMasterEndpointIP:")).Should(BeFalse()) - Expect(strings.Contains(secretData, "supervisorMasterPort:")).Should(BeFalse()) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // eventually the secret ref to the data values should be updated - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, config); err != nil { - return false - } - Expect(config.Status.SecretRef).To(Equal(fmt.Sprintf("%s-%s-data-values", clusterName, constants.CPIAddonName))) - return true - }) - }) - }) - - Context("reconcile VSphereCPIConfig manifests in non-paravirtual mode, when clusterbootstrapController doesn't add ownerRef to VSphereCPIConfig", func() { - - BeforeEach(func() { - clusterName = "test-cluster-cpi-enqueue-cluster-event" - clusterResourceFilePath = "testdata/test-vsphere-cpi-non-paravirtual-enqueue-cluster-event-cluster-spec.yaml" - }) - - It("should not create data values secret until VSphereCPIConfig has an OwnerRef to correct cluster", func() { - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, cluster); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // the vsphere cluster and vsphere machine template should be provided - vsphereCluster := &capvv1beta1.VSphereCluster{} - cpMachineTemplate := &capvv1beta1.VSphereMachineTemplate{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, vsphereCluster); err != nil { - return false - } - if err := k8sClient.Get(ctx, client.ObjectKey{ - Namespace: defaultString, - Name: clusterName + "-control-plane-template", - }, cpMachineTemplate); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("cpi doesn't have ownerRef") - config := &cpiv1alpha1.VSphereCPIConfig{} - cpiConfigKey := client.ObjectKey{ - Namespace: defaultString, - Name: "test-cluster-cpi-enqueue-cluster-event-random", - } - Consistently(func() bool { - if err := k8sClient.Get(ctx, cpiConfigKey, config); err != nil { - return false - } - Expect(*config.Spec.VSphereCPI.Mode).Should(Equal("vsphereCPI")) - Expect(*config.Spec.VSphereCPI.Region).Should(Equal("test-region")) - Expect(*config.Spec.VSphereCPI.Zone).Should(Equal("test-zone")) - - if len(config.OwnerReferences) > 0 { - return false - } - Expect(len(config.OwnerReferences)).Should(Equal(0)) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("patching cpi with ownerRef as ClusterBootstrapController would do") - // patch the VSphereCPIConfig with ownerRef - patchedVSphereCPIConfig := config.DeepCopy() - ownerRef := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - - ownerRef.Kind = "Cluster" - patchedVSphereCPIConfig.OwnerReferences = clusterapiutil.EnsureOwnerRef(patchedVSphereCPIConfig.OwnerReferences, ownerRef) - Expect(k8sClient.Patch(ctx, patchedVSphereCPIConfig, client.MergeFrom(config))).ShouldNot(HaveOccurred()) - - // the data values secret should be generated - secret := &v1.Secret{} - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: defaultString, - Name: util.GenerateDataValueSecretName(clusterName, constants.CPIDefaultRefName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return false - } - secretData := string(secret.Data["values.yaml"]) - Expect(len(secretData)).ShouldNot(BeZero()) - Expect(strings.Contains(secretData, "vsphereCPI:")).Should(BeTrue()) - Expect(strings.Contains(secretData, "mode: vsphereCPI")).Should(BeTrue()) - Expect(strings.Contains(secretData, "datacenter: dc0")).Should(BeTrue()) - Expect(strings.Contains(secretData, "region: test-region")).Should(BeTrue()) - Expect(strings.Contains(secretData, "zone: test-zone")).Should(BeTrue()) - Expect(strings.Contains(secretData, "insecureFlag: true")).Should(BeTrue()) - Expect(strings.Contains(secretData, "ipFamily: ipv6")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vmInternalNetwork: internal-net")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vmExternalNetwork: external-net")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vmExcludeInternalNetworkSubnetCidr: 192.168.3.0/24")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vmExcludeExternalNetworkSubnetCidr: 22.22.3.0/24")).Should(BeTrue()) - Expect(strings.Contains(secretData, "tlsThumbprint: test-thumbprint")).Should(BeTrue()) - Expect(strings.Contains(secretData, "server: vsphere-server.local")).Should(BeTrue()) - Expect(strings.Contains(secretData, "username: foo")).Should(BeTrue()) - Expect(strings.Contains(secretData, "password: bar")).Should(BeTrue()) - - Expect(strings.Contains(secretData, "http_proxy: foo.com")).Should(BeTrue()) - Expect(strings.Contains(secretData, "https_proxy: bar.com")).Should(BeTrue()) - Expect(strings.Contains(secretData, "no_proxy: foobar.com")).Should(BeTrue()) - - //assert that there are no paravirt datavalue keys - Expect(strings.Contains(secretData, "clusterAPIVersion:")).Should(BeFalse()) - Expect(strings.Contains(secretData, "clusterKind:")).Should(BeFalse()) - Expect(strings.Contains(secretData, "clusterName:")).Should(BeFalse()) - Expect(strings.Contains(secretData, "supervisorMasterEndpointIP:")).Should(BeFalse()) - Expect(strings.Contains(secretData, "supervisorMasterPort:")).Should(BeFalse()) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("vsphere and nsx-t secret should have cluster ownerRef") - vsphereSecretKey := client.ObjectKey{ - Namespace: defaultString, - Name: "cpi-vsphere-credential", - } - vsecret := &v1.Secret{} - Eventually(func() error { - if err := k8sClient.Get(ctx, vsphereSecretKey, vsecret); err != nil { - return err - } - - if len(vsecret.OwnerReferences) == 0 { - return fmt.Errorf("ownerRef is 0") - } - Expect(len(vsecret.OwnerReferences)).Should(Equal(1)) - - Expect(vsecret.OwnerReferences[0].Name).Should(Equal(clusterName)) - return nil - }, waitTimeout, pollingInterval).Should(BeNil()) - - nsxtSecretKey := client.ObjectKey{ - Namespace: defaultString, - Name: "nsxt-credential", - } - - nsecret := &v1.Secret{} - Eventually(func() error { - if err := k8sClient.Get(ctx, nsxtSecretKey, nsecret); err != nil { - return err - } - - if len(nsecret.OwnerReferences) == 0 { - return fmt.Errorf("ownerRef is 0") - } - Expect(len(nsecret.OwnerReferences)).Should(Equal(1)) - - Expect(nsecret.OwnerReferences[0].Name).Should(Equal(clusterName)) - return nil - }, waitTimeout, pollingInterval).Should(BeNil()) - - // eventually the secret ref to the data values should be updated - Eventually(func() bool { - if err := k8sClient.Get(ctx, key, config); err != nil { - return false - } - Expect(config.Status.SecretRef).To(Equal(fmt.Sprintf("%s-%s-data-values", clusterName, constants.CPIAddonName))) - return true - }) - }) - }) - - Context("reconcile VSphereCPIConfig manifests in non-paravirtual mode, with multi-tenancy enabled", func() { - - identity := &capvv1beta1.VSphereClusterIdentity{} - identitySecret := &v1.Secret{} - identityNamespace := "capv-system" - - BeforeEach(func() { - clusterName = "test-cluster-cpi-multi-tenancy" - clusterResourceFilePath = "testdata/test-vsphere-cpi-non-paravirtual-multi-tenancy.yaml" - }) - - JustAfterEach(func() { - Expect(testutil.DeleteNamespace(ctx, clientSet, identityNamespace)).To(Succeed()) - }) - - It("Should reconcile VSphereCPIConfig and create data values secret for VSphereCPIConfig on management cluster", func() { - identityName := "multi-tenancy" - Expect(k8sClient.Get(ctx, client.ObjectKey{Name: identityName}, identity)).To(Succeed()) - Expect(k8sClient.Get(ctx, client.ObjectKey{Name: identityName, Namespace: identityNamespace}, identitySecret)).To(Succeed()) - - identity.Status.Ready = true - Expect(k8sClient.Status().Update(ctx, identity)).To(Succeed()) - - secret := &v1.Secret{} - Eventually(func() bool { - secretKey := client.ObjectKey{ - Namespace: defaultString, - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.CPIAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return false - } - secretData := string(secret.Data["values.yaml"]) - Expect(len(secretData)).ShouldNot(BeZero()) - Expect(strings.Contains(secretData, "username: foo")).Should(BeTrue()) - Expect(strings.Contains(secretData, "password: bar")).Should(BeTrue()) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - }) - - Context("reconcile VSphereCPIConfig manifests in paravirtual mode, with floating IP", func() { - BeforeEach(func() { - clusterName = "test-cluster-cpi-paravirtual" - clusterResourceFilePath = "testdata/test-vsphere-cpi-paravirtual.yaml" - - Expect(tryCreateIfNotExists(ctx, k8sClient, newClusterInfoConfigMap())).Should(Succeed()) - }) - It("Should reconcile VSphereCPIConfig", func() { - By("create data values secret for VSphereCPIConfig on management cluster") - // the data values secret should be generated - Eventually(func() bool { - secretData, err := getSecretDataValuesForCluster(clusterName) - // allow some time for data value secret to be generated - if err != nil { - return false - } - Expect(len(secretData)).ShouldNot(BeZero()) - Expect(strings.Contains(secretData, "vsphereCPI:")).Should(BeTrue()) - Expect(strings.Contains(secretData, "mode: vsphereParavirtualCPI")).Should(BeTrue()) - Expect(strings.Contains(secretData, "clusterAPIVersion: cluster.x-k8s.io/v1beta1")).Should(BeTrue()) - Expect(strings.Contains(secretData, "clusterKind: Cluster")).Should(BeTrue()) - Expect(strings.Contains(secretData, "clusterName: test-cluster-cpi-paravirtual")).Should(BeTrue()) - - uuidReg, err := regexp.Compile("clusterUID: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}") - Expect(err).ShouldNot(HaveOccurred()) - Expect(uuidReg.FindString(secretData)).To(Not(BeEmpty())) - - Expect(strings.Contains(secretData, "supervisorMasterEndpointIP: 172.17.0.3")).Should(BeTrue()) - Expect(strings.Contains(secretData, "supervisorMasterPort: \"6773\"")).Should(BeTrue()) - - // assert that non paravirt data values don't exist, the keys should not exist - Expect(strings.Contains(secretData, "datacenter:")).Should(BeFalse()) - Expect(strings.Contains(secretData, "server:")).Should(BeFalse()) - Expect(strings.Contains(secretData, "nsxt:")).Should(BeFalse()) - Expect(strings.Contains(secretData, "antreaNSXPodRoutingEnabled: true")).Should(BeTrue()) - - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - // eventually the secret ref to the data values should be updated - config := &cpiv1alpha1.VSphereCPIConfig{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, configKey, config); err != nil { - return false - } - Expect(config.Status.SecretRef).To(Equal(fmt.Sprintf("%s-%s-data-values", clusterName, constants.CPIAddonName))) - return true - }) - - By("create ProviderServiceAccount") - serviceAccount := &capvvmwarev1beta1.ProviderServiceAccount{} - Eventually(func() bool { - serviceAccountKey := client.ObjectKey{ - Namespace: defaultString, - Name: fmt.Sprintf("%s-ccm", vsphereClusterName), - } - if err := k8sClient.Get(ctx, serviceAccountKey, serviceAccount); err != nil { - return false - } - Expect(serviceAccount.Spec.Ref.Name).To(Equal(vsphereClusterName)) - Expect(serviceAccount.Spec.Ref.Namespace).To(Equal(key.Namespace)) - Expect(serviceAccount.Spec.Rules).To(HaveLen(4)) - Expect(serviceAccount.Spec.TargetNamespace).To(Equal("vmware-system-cloud-provider")) - Expect(serviceAccount.Spec.TargetSecretName).To(Equal("cloud-provider-creds")) - return true - }) - - By("create aggregated cluster role") - clusterRole := &rbacv1.ClusterRole{} - Eventually(func() bool { - key = client.ObjectKey{ - Name: constants.VsphereCPIProviderServiceAccountAggregatedClusterRole, - } - if err := k8sClient.Get(ctx, key, clusterRole); err != nil { - return false - } - Expect(clusterRole.Labels).To(Equal(map[string]string{ - constants.CAPVClusterRoleAggregationRuleLabelSelectorKey: constants.CAPVClusterRoleAggregationRuleLabelSelectorValue, - })) - Expect(clusterRole.Rules).To(HaveLen(4)) - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - }) - - Context("Reconcile VSphereCPIConfig used as template", func() { - - BeforeEach(func() { - clusterName = "test-cluster-cpi-template" - clusterResourceFilePath = "testdata/test-vsphere-cpi-template-config.yaml" - }) - - It("Should skip the reconciliation", func() { - - configKey.Name = "test-cluster-cpi-config-template" - configKey.Namespace = addonNamespace - config := &cpiv1alpha1.VSphereCPIConfig{} - Eventually(func() bool { - if err := k8sClient.Get(ctx, configKey, config); err != nil { - return false - } - return true - }, waitTimeout, pollingInterval).Should(BeTrue()) - - By("OwnerReferences is not set") - Expect(len(config.OwnerReferences)).Should(Equal(0)) - }) - }) -}) - -var _ = Describe("VSphereCPIConfig Reconciler with existing endpoint from LB service", func() { - var ( - clusterName string - clusterResourceFilePath string - ) - - JustBeforeEach(func() { - By("Creating cluster and VSphereCPIConfig resources") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - }) - - Context("reconcile VSphereCPIConfig manifests in paravirtual mode, with existing endpoint", func() { - var svc *v1.Service - - BeforeEach(func() { - clusterName = "test-cluster-cpi-paravirtual-with-endpoint" - clusterResourceFilePath = "testdata/test-vsphere-cpi-paravirtual-with-endpoint.yaml" - - svc = newTestSupervisorLBService() - Expect(k8sClient.Create(ctx, svc)).To(Succeed()) - svc.Status = newTestSupervisorLBServiceStatus() - Expect(k8sClient.Status().Update(ctx, svc)).To(Succeed()) - }) - - AfterEach(func() { - Expect(k8sClient.Delete(ctx, svc)).To(Succeed()) - }) - - It("uses headless service's endpoints", func() { - Eventually(func() bool { - secretData, err := getSecretDataValuesForCluster(clusterName) - // allow some time for data value secret to be generated - if err != nil { - return false - } - Expect(strings.Contains(secretData, "supervisorMasterEndpointIP: "+testSupervisorAPIServerVIP)).Should(BeTrue()) - Expect(strings.Contains(secretData, "supervisorMasterPort: \""+strconv.Itoa(testSupervisorAPIServerPort)+"\"")).Should(BeTrue()) - return true - }).Should(BeTrue()) - }) - }) - -}) - -var _ = Describe("VSphereCPIConfig Reconciler multi clusters", func() { - var ( - clusterName string - clusterResourceFilePath string - ) - - JustBeforeEach(func() { - By("Creating cluster and VSphereCPIConfig resources") - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - }) - - Context("in paravirtual mode, but two clusters have same name under different namespace", func() { - anotherClusterNamespace := "another-ns" - - // covers the issue https://github.com/vmware-tanzu/tanzu-framework/issues/2714 - // it was triggered when two clusters with the same name, but under different namespaces - BeforeEach(func() { - clusterName = "test-cluster-cpi-paravirtual-same-name" - clusterResourceFilePath = "testdata/test-vsphere-cpi-paravirtual-clusters-same-name.yaml" - - Expect(tryCreateIfNotExists(ctx, k8sClient, newClusterInfoConfigMap())).Should(Succeed()) - }) - - It("should select vSphereCluster with right namespace", func() { - Eventually(func() error { - selectedClusterKey := client.ObjectKey{ - Name: clusterName, - Namespace: defaultString, - } - notSelectedClusterKey := client.ObjectKey{ - Name: clusterName, - Namespace: anotherClusterNamespace, - } - - selectedCluster := &capvvmwarev1beta1.VSphereCluster{} - notSelectedCluster := &capvvmwarev1beta1.VSphereCluster{} - var err error - - if err = k8sClient.Get(ctx, selectedClusterKey, selectedCluster); err != nil { - return err - } - - if err = k8sClient.Get(ctx, notSelectedClusterKey, notSelectedCluster); err != nil { - return err - } - serviceAccount := &capvvmwarev1beta1.ProviderServiceAccount{} - serviceAccountKey := client.ObjectKey{ - Namespace: defaultString, - Name: fmt.Sprintf("%s-ccm", clusterName), - } - if err := k8sClient.Get(ctx, serviceAccountKey, serviceAccount); err != nil { - return err - } - Expect(serviceAccount.ObjectMeta.OwnerReferences).ToNot(BeEmpty()) - Expect(serviceAccount.ObjectMeta.OwnerReferences[0].UID).To(Equal(selectedCluster.ObjectMeta.UID)) - return nil - }).Should(Succeed()) - }) - }) -}) diff --git a/addons/controllers/vspherecsiconfig_controller_test.go b/addons/controllers/vspherecsiconfig_controller_test.go deleted file mode 100644 index 4b6dc9075a..0000000000 --- a/addons/controllers/vspherecsiconfig_controller_test.go +++ /dev/null @@ -1,446 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "fmt" - "os" - "regexp" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - v1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - capvvmwarev1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/vmware/v1beta1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - topologyv1alpha1 "github.com/vmware-tanzu/vm-operator/external/tanzu-topology/api/v1alpha1" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" -) - -var _ = Describe("VSphereCSIConfig Reconciler", func() { - const ( - clusterNamespace = "default" - ) - - var ( - clusterKey client.ObjectKey - configKey client.ObjectKey - clusterName string - clusterResourceFilePath string - enduringResourcesFilePath string - ) - - JustBeforeEach(func() { - By("Creating cluster and VSphereCSIConfig resources") - clusterKey = client.ObjectKey{ - Namespace: clusterNamespace, - Name: clusterName, - } - configKey = client.ObjectKey{ - Namespace: clusterNamespace, - Name: util.GeneratePackageSecretName(clusterName, constants.CSIDefaultRefName), - } - if enduringResourcesFilePath != "" { - fers, err := os.Open(enduringResourcesFilePath) - Expect(err).ToNot(HaveOccurred()) - defer fers.Close() - err = testutil.EnsureResources(fers, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - } - f, err := os.Open(clusterResourceFilePath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - err = testutil.CreateResources(f, cfg, dynamicClient) - Expect(err).ToNot(HaveOccurred()) - }) - - AfterEach(func() { - By("Deleting cluster and VSphereCSIConfig resources") - for _, filePath := range []string{clusterResourceFilePath} { - f, err := os.Open(filePath) - Expect(err).ToNot(HaveOccurred()) - err = testutil.DeleteResources(f, cfg, dynamicClient, true) - Expect(err).ToNot(HaveOccurred()) - Expect(f.Close()).ToNot(HaveOccurred()) - } - }) - - Context("reconcile VSphereCSIConfig manifests in non-paravirtual mode", func() { - - const ( - testClusterCsiName = "test-cluster-csi" - ) - - Context("using fully populated VSphereCSIConfig", func() { - BeforeEach(func() { - clusterName = testClusterCsiName - clusterResourceFilePath = "testdata/test-vsphere-csi-non-paravirtual.yaml" - enduringResourcesFilePath = "" - }) - - It("Should reconcile VSphereCSIConfig and create data values secret for VSphereCSIConfig on management cluster", func() { - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() error { - if err := k8sClient.Get(ctx, clusterKey, cluster); err != nil { - return fmt.Errorf("Failed to get Cluster '%v': '%v'", clusterKey, err) - } - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - - // the csi config object should be deployed - config := &csiv1alpha1.VSphereCSIConfig{} - Eventually(func() error { - if err := k8sClient.Get(ctx, configKey, config); err != nil { - return fmt.Errorf("Failed to get VSphereCSIConfig '%v': '%v'", configKey, err) - } - Expect(config.Spec.VSphereCSI.Mode).Should(Equal("vsphereCSI")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig).NotTo(BeZero()) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.TLSThumbprint).Should(Equal("yadayada")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.ClusterName).Should(Equal("test-clustername")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.Server).Should(Equal("svr-0")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.Datacenter).Should(Equal("dc0")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.PublicNetwork).Should(Equal("8.2.0.0/16")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.VSphereCredentialLocalObjRef.Name).Should(Equal("csi-vsphere-credential")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.Region).Should(Equal("test-region")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.Zone).Should(Equal("test-zone")) - Expect(*config.Spec.VSphereCSI.NonParavirtualConfig.InsecureFlag).Should(Equal(false)) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.UseTopologyCategories).NotTo(BeZero()) - Expect(*config.Spec.VSphereCSI.NonParavirtualConfig.UseTopologyCategories).Should(Equal(true)) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.ProvisionTimeout).Should(Equal("33s")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.AttachTimeout).Should(Equal("77s")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.ResizerTimeout).Should(Equal("99s")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.VSphereVersion).Should(Equal("8.1.2-release")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.HTTPProxy).Should(Equal("1.1.1.1")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.HTTPSProxy).Should(Equal("2.2.2.2")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.NoProxy).Should(Equal("3.3.3.3")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.DeploymentReplicas).NotTo(BeZero()) - Expect(*config.Spec.VSphereCSI.NonParavirtualConfig.DeploymentReplicas).Should(Equal(int32(3))) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.WindowsSupport).NotTo(BeZero()) - Expect(*config.Spec.VSphereCSI.NonParavirtualConfig.WindowsSupport).Should(Equal(true)) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.NetPermissions).NotTo(BeZero()) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.NetPermissions["A"].Ips).Should(Equal("*")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.NetPermissions["A"].Permissions).Should(Equal("READ_WRITE")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig.NetPermissions["A"].RootSquash).Should(Equal(false)) - - if len(config.OwnerReferences) == 0 { - return fmt.Errorf("OwnerReferences not yet set") - } - Expect(len(config.OwnerReferences)).Should(Equal(1)) - Expect(config.OwnerReferences[0].Name).Should(Equal(clusterName)) - - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - - // the data values secret should be generated - secret := &v1.Secret{} - Eventually(func() error { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.CSIAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return fmt.Errorf("Failed to get Secret '%v': '%v'", secretKey, err) - } - secretData := string(secret.Data["values.yaml"]) - Expect(len(secretData)).Should(Not(BeZero())) - fmt.Println(secretData) // debug dump - Expect(strings.Contains(secretData, "vsphereCSI:")).Should(BeTrue()) - Expect(strings.Contains(secretData, "tlsThumbprint: yadayada")).Should(BeTrue()) - Expect(strings.Contains(secretData, "server: svr-0")).Should(BeTrue()) - Expect(strings.Contains(secretData, "datacenter: dc0")).Should(BeTrue()) - Expect(strings.Contains(secretData, "publicNetwork: 8.2.0.0/16")).Should(BeTrue()) - Expect(strings.Contains(secretData, "username: foo")).Should(BeTrue()) - Expect(strings.Contains(secretData, "password: bar")).Should(BeTrue()) - Expect(strings.Contains(secretData, "region: test-region")).Should(BeTrue()) - Expect(strings.Contains(secretData, "zone: test-zone")).Should(BeTrue()) - Expect(strings.Contains(secretData, "insecureFlag: false")).Should(BeTrue()) - Expect(strings.Contains(secretData, "useTopologyCategories: true")).Should(BeTrue()) - Expect(strings.Contains(secretData, "provisionTimeout: 33s")).Should(BeTrue()) - Expect(strings.Contains(secretData, "attachTimeout: 77s")).Should(BeTrue()) - Expect(strings.Contains(secretData, "resizerTimeout: 99s")).Should(BeTrue()) - Expect(strings.Contains(secretData, "vSphereVersion: 8.1.2-release")).Should(BeTrue()) - Expect(strings.Contains(secretData, "http_proxy: 1.1.1.1")).Should(BeTrue()) - Expect(strings.Contains(secretData, "https_proxy: 2.2.2.2")).Should(BeTrue()) - Expect(strings.Contains(secretData, "no_proxy: 3.3.3.3")).Should(BeTrue()) - Expect(strings.Contains(secretData, "deployment_replicas: 3")).Should(BeTrue()) - Expect(strings.Contains(secretData, "windows_support: true")).Should(BeTrue()) - Expect(strings.Contains(secretData, "netpermissions:")).Should(BeTrue()) - Expect(strings.Contains(secretData, "ips: '*'")).Should(BeTrue()) - Expect(strings.Contains(secretData, "permissions: READ_WRITE")).Should(BeTrue()) - Expect(strings.Contains(secretData, "rootsquash: false")).Should(BeTrue()) - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - - // eventually the secret ref to the data values should be updated - Eventually(func() bool { - config := &csiv1alpha1.VSphereCSIConfig{} - if err := k8sClient.Get(ctx, configKey, config); err != nil { - return false - } - if config.Status.SecretRef == nil { - return false - } - if *config.Status.SecretRef == util.GenerateDataValueSecretName(clusterName, constants.CSIDefaultRefName) { - return true - } - return false - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - - }) - - Context("using minimally populated VSphereCSIConfig", func() { - BeforeEach(func() { - clusterName = "test-cluster-csi-minimal" - clusterResourceFilePath = "testdata/test-vsphere-csi-non-paravirtual-minimal.yaml" - enduringResourcesFilePath = "" - }) - - It("Should reconcile VSphereCSIConfig and create data values secret for VSphereCSIConfig", func() { - cluster := &clusterapiv1beta1.Cluster{} - Eventually(func() error { - objKey := client.ObjectKey{Namespace: "default", Name: "test-cluster-csi-minimal"} - if err := k8sClient.Get(ctx, objKey, cluster); err != nil { - return fmt.Errorf("Failed to get Cluster '%v': '%v'", objKey, err) - } - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - - // the csi config object should be deployed - config := &csiv1alpha1.VSphereCSIConfig{} - Eventually(func() error { - objKey := client.ObjectKey{Namespace: "default", Name: util.GeneratePackageSecretName(clusterName, constants.CSIDefaultRefName)} - if err := k8sClient.Get(ctx, objKey, config); err != nil { - return fmt.Errorf("Failed to get VSphereCSIConfig '%v': '%v'", objKey, err) - } - Expect(config.Spec.VSphereCSI.Mode).Should(Equal("vsphereCSI")) - Expect(config.Spec.VSphereCSI.NonParavirtualConfig).To(BeNil()) - - if len(config.OwnerReferences) == 0 { - return fmt.Errorf("Owner references not yet set") - } - Expect(len(config.OwnerReferences)).Should(Equal(1)) - Expect(config.OwnerReferences[0].Name).Should(Equal(clusterName)) - - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - - // the data values secret should be generated - secret := &v1.Secret{} - Eventually(func() error { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.CSIAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return fmt.Errorf("Failed to get secret '%v' : '%v'", secretKey, err) - } - secretData := string(secret.Data["values.yaml"]) - Expect(len(secretData)).Should(Not(BeZero())) - fmt.Println(secretData) // debug dump - Expect(strings.Contains(secretData, "vsphereCSI:")).Should(BeTrue()) - Expect(strings.Contains(secretData, "tlsThumbprint: thumbprint-yadayada")).Should(BeTrue()) - Expect(strings.Contains(secretData, "server: vsphere-server.local")).Should(BeTrue()) - Expect(strings.Contains(secretData, "datacenter: dc0")).Should(BeTrue()) - Expect(strings.Contains(secretData, "publicNetwork: test-network")).Should(BeTrue()) - Expect(strings.Contains(secretData, "username: administrator@vsphere.local")).Should(BeTrue()) - Expect(strings.Contains(secretData, "password: Admin!23")).Should(BeTrue()) - Expect(strings.Contains(secretData, "insecureFlag: true")).Should(BeTrue()) - Expect(strings.Contains(secretData, "useTopologyCategories: true")).Should(BeFalse()) - Expect(strings.Contains(secretData, "provisionTimeout: 300s")).Should(BeTrue()) - Expect(strings.Contains(secretData, "attachTimeout: 300s")).Should(BeTrue()) - Expect(strings.Contains(secretData, "resizerTimeout: 300s")).Should(BeTrue()) - Expect(strings.Contains(secretData, "http_proxy: foo.com")).Should(BeTrue()) - Expect(strings.Contains(secretData, "https_proxy: bar.com")).Should(BeTrue()) - Expect(strings.Contains(secretData, "no_proxy: foobar.com")).Should(BeTrue()) - Expect(strings.Contains(secretData, "deployment_replicas: 2")).Should(BeTrue()) - - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - - // eventually the secret ref to the data values should be updated - Eventually(func() error { - objKey := client.ObjectKey{Namespace: "default", Name: util.GeneratePackageSecretName(clusterName, constants.CSIDefaultRefName)} - if err := k8sClient.Get(ctx, objKey, config); err != nil { - return fmt.Errorf("Failed to get VSphereCSIConfig '%v' : '%v", objKey, err) - } - if config.Status.SecretRef == nil { - return fmt.Errorf("Secret status of VSphereCSIConfig is not yet updated: '%v'", objKey) - } - Expect(*config.Status.SecretRef).To(Equal(fmt.Sprintf("%s-%s-data-values", clusterName, constants.CSIAddonName))) - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - }) - - }) - - }) - - Context("reconcile VSphereCSIConfig manifests in paravirtual mode", func() { - var availabilityZone1, availabilityZone2 *topologyv1alpha1.AvailabilityZone - BeforeEach(func() { - // (deliberate decision): There is no watch on AvailabilityZone in vspherecsiconfig_controller so any change to it will not trigger reconcile - // of resources. Based on discussions with TKGS team, availability zone is created at supervisor cluster init time - // and does not really change after that. The test will only check for the presence of non legacy availability - // zone and set zone to true - availabilityZone1 = &topologyv1alpha1.AvailabilityZone{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-az", - }, - } - - availabilityZone2 = &topologyv1alpha1.AvailabilityZone{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-az-2", - }, - } - - Expect(k8sClient.Create(ctx, availabilityZone1)).Should(Succeed()) - Expect(k8sClient.Create(ctx, availabilityZone2)).Should(Succeed()) - clusterName = "test-cluster-pv-csi" - clusterResourceFilePath = "testdata/test-vsphere-csi-paravirtual.yaml" - enduringResourcesFilePath = "testdata/vmware-csi-system-ns.yaml" - }) - - AfterEach(func() { - Expect(k8sClient.Delete(ctx, availabilityZone1)).Should(Succeed()) - Expect(k8sClient.Delete(ctx, availabilityZone2)).Should(Succeed()) - }) - - It("Should reconcile VSphereCSIConfig and create data values secret for VSphereCSIConfig on management cluster", func() { - // the data values secret should be generated - secret := &v1.Secret{} - Eventually(func() error { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.PVCSIAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return fmt.Errorf("Failed to get Secret '%v': '%v'", secretKey, err) - } - secretData := string(secret.Data["values.yaml"]) - fmt.Println(secretData) // debug dump - Expect(len(secretData)).Should(Not(BeZero())) - Expect(strings.Contains(secretData, "vspherePVCSI:")).Should(BeTrue()) - Expect(strings.Contains(secretData, "cluster_name: test-cluster-pv-csi")).Should(BeTrue()) - match, _ := regexp.MatchString("cluster_uid: [a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}", secretData) - Expect(match).Should(BeTrue()) - Expect(strings.Contains(secretData, "namespace: vmware-system-csi")).Should(BeTrue()) - Expect(strings.Contains(secretData, "supervisor_master_endpoint_hostname: supervisor.default.svc")).Should(BeTrue()) - Expect(strings.Contains(secretData, "supervisor_master_port: 6443")).Should(BeTrue()) - Expect(strings.Contains(secretData, "feature_states:")).Should(BeTrue()) - Expect(strings.Contains(secretData, "state1: value1")).Should(BeTrue()) - Expect(strings.Contains(secretData, "state2: value2")).Should(BeTrue()) - Expect(strings.Contains(secretData, "state3: value3")).Should(BeTrue()) - - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - - // eventually the secret ref to the data values should be updated - config := &csiv1alpha1.VSphereCSIConfig{} - Eventually(func() error { - configKey = client.ObjectKey{ - Namespace: clusterNamespace, - Name: util.GeneratePackageSecretName(clusterName, constants.CSIDefaultRefName), - } - if err := k8sClient.Get(ctx, configKey, config); err != nil { - return fmt.Errorf("Failed to get vsphereconfig '%v': '%v'", configKey, err) - } - if config.Status.SecretRef == nil { - return fmt.Errorf("VSphereConfig status not yet updated: %v", configKey) - } - Expect(*config.Status.SecretRef).To(Equal(fmt.Sprintf("%s-%s-data-values", clusterName, constants.PVCSIAddonName))) - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - }) - - It("Should reconcile VSphereCSIConfig and return zone correctly", func() { - - secret := &v1.Secret{} - Eventually(func() error { - secretKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: fmt.Sprintf("%s-%s-data-values", clusterName, constants.PVCSIAddonName), - } - if err := k8sClient.Get(ctx, secretKey, secret); err != nil { - return fmt.Errorf("Failed to get Secret '%v': '%v'", secretKey, err) - } - secretData := string(secret.Data["values.yaml"]) - Expect(len(secretData)).Should(Not(BeZero())) - Expect(strings.Contains(secretData, "vspherePVCSI:")).Should(BeTrue()) - Expect(strings.Contains(secretData, "cluster_name: test-cluster-pv-csi")).Should(BeTrue()) - match, _ := regexp.MatchString("cluster_uid: [a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}", secretData) - Expect(match).Should(BeTrue()) - Expect(strings.Contains(secretData, "zone: true")).Should(BeTrue()) - - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - }) - - It("Should reconcile ProviderServiceAccount", func() { - vsphereClusterName := "test-cluster-pv-csi-kl5tm" - serviceAccount := &capvvmwarev1beta1.ProviderServiceAccount{} - Eventually(func() error { - serviceAccountKey := client.ObjectKey{ - Namespace: clusterNamespace, - Name: fmt.Sprintf("%s-%s", vsphereClusterName, "pvcsi"), - } - if err := k8sClient.Get(ctx, serviceAccountKey, serviceAccount); err != nil { - return fmt.Errorf("Failed to get provider service account '%v' : '%v'", serviceAccountKey, err) - } - Expect(serviceAccount.Spec.Ref.Name).To(Equal(vsphereClusterName)) - Expect(serviceAccount.Spec.Ref.Namespace).To(Equal(configKey.Namespace)) - Expect(serviceAccount.Spec.Rules).To(HaveLen(7)) - Expect(serviceAccount.Spec.TargetNamespace).To(Equal("vmware-system-csi")) - Expect(serviceAccount.Spec.TargetSecretName).To(Equal("pvcsi-provider-creds")) - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - }) - - It("Should reconcile aggregated cluster role", func() { - clusterRole := &rbacv1.ClusterRole{} - Eventually(func() error { - clusterKey = client.ObjectKey{ - Name: constants.VsphereCSIProviderServiceAccountAggregatedClusterRole, - } - if err := k8sClient.Get(ctx, clusterKey, clusterRole); err != nil { - return err - } - Expect(clusterRole.Labels).To(Equal(map[string]string{ - constants.CAPVClusterRoleAggregationRuleLabelSelectorKey: constants.CAPVClusterRoleAggregationRuleLabelSelectorValue, - })) - Expect(clusterRole.Rules).To(HaveLen(7)) - return nil - }, waitTimeout, pollingInterval).Should(Succeed()) - }) - }) - - Context("Reconcile VSphereCSIConfig used as template", func() { - - BeforeEach(func() { - clusterName = "test-cluster-csi-template" - clusterResourceFilePath = "testdata/test-vsphere-csi-template-config.yaml" - enduringResourcesFilePath = "" - }) - - It("Should skip the reconciliation", func() { - - configKey.Name = "test-cluster-csi-template-config" - configKey.Namespace = addonNamespace - config := &csiv1alpha1.VSphereCSIConfig{} - Expect(k8sClient.Get(ctx, configKey, config)).To(Succeed()) - - By("OwnerReferences is not set") - Expect(len(config.OwnerReferences)).Should(Equal(0)) - }) - }) -}) diff --git a/addons/controllers/webhooks_test.go b/addons/controllers/webhooks_test.go deleted file mode 100644 index 70d2901e10..0000000000 --- a/addons/controllers/webhooks_test.go +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - cert2 "k8s.io/client-go/util/cert" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/webhooks" -) - -const ( - oneDay = time.Hour * 24 - oneWeek = time.Hour * 24 * 7 - zeroTime = time.Second * 0 -) - -var _ = Describe("when webhook TLS is being continuously managed", func() { - - Context("if check frequency time is reached", func() { - It("tls certificates should be validated and rotated if invalid", func() { - privCtx := context.Background() - cacelCtx, cancelFn := context.WithCancel(privCtx) - rotationTime := time.Second - managementFrequency := rotationTime / 2 - webhookTLS := webhooks.WebhookTLS{ - Ctx: cacelCtx, - K8sConfig: k8sConfig, - CertPath: certPath, - KeyPath: keyPath, - Name: constants.WebhookScrtName, - ServiceName: webhookServiceName, - LabelSelector: constants.AddonWebhookLabelKey, - Logger: setupLog, - Namespace: addonNamespace, - RotationTime: rotationTime, - } - - err := webhookTLS.ManageCertificates(managementFrequency) - Expect(err).ToNot(HaveOccurred()) - time.Sleep(managementFrequency + rotationTime) // we wait longer than one rotation to allow for certificate installation - firstCert, err := cert2.CertsFromFile(webhookTLS.CertPath) - Expect(err).ToNot(HaveOccurred()) - firstCertPEM, err := cert2.EncodeCertificates(firstCert[0]) - Expect(err).ToNot(HaveOccurred()) - - time.Sleep(2 * rotationTime) // wait enough time to ensure the certificate has been rotated. - - secondCert, err := cert2.CertsFromFile(webhookTLS.CertPath) - Expect(err).ToNot(HaveOccurred()) - secondCertPEM, err := cert2.EncodeCertificates(secondCert[0]) - Expect(err).ToNot(HaveOccurred()) - - cancelFn() - - // The certificates should be different due to rotation - Expect(secondCertPEM).ToNot(Equal(firstCertPEM)) - - }) - }) - Context("if rotation time is longer than one week", func() { - It("should set rotation to one week minus required minimum grace period", func() { - rotationTime := oneWeek + oneDay - managementFrequency := rotationTime / 2 - webhookTLS := webhooks.WebhookTLS{ - Ctx: context.Background(), - K8sConfig: k8sConfig, - CertPath: certPath, - KeyPath: keyPath, - Name: constants.WebhookScrtName, - ServiceName: webhookServiceName, - LabelSelector: webhookCertDetails.LabelSelector.String(), - Logger: setupLog, - Namespace: addonNamespace, - RotationTime: rotationTime, - } - err := webhookTLS.ManageCertificates(managementFrequency) - Expect(err).ToNot(HaveOccurred()) - Expect(webhookTLS.RotationTime).To(Equal(oneWeek - webhooks.RequireMinGracePeriod)) - - }) - }) - Context("if rotation time is 0 or less than 0", func() { - It("should set rotation to one day", func() { - rotationTime := zeroTime - managementFrequency := oneDay // any value larger than 0 will work here - webhookTLS := webhooks.WebhookTLS{ - Ctx: context.Background(), - K8sConfig: k8sConfig, - CertPath: certPath, - KeyPath: keyPath, - Name: constants.WebhookScrtName, - ServiceName: webhookServiceName, - LabelSelector: constants.AddonWebhookLabelKey, - Logger: setupLog, - Namespace: addonNamespace, - RotationTime: rotationTime, - } - err := webhookTLS.ManageCertificates(managementFrequency) - Expect(err).ToNot(HaveOccurred()) - Expect(webhookTLS.RotationTime).To(Equal(oneDay)) - - }) - }) - Context("if rotation times is less than minGracePeriod", func() { - It("should set rotation to match minGracePeriod", func() { - rotationTime := oneWeek - webhooks.RequireMinGracePeriod + time.Second*1 - managementFrequency := oneDay // any value larger than 0 will work here - webhookTLS := webhooks.WebhookTLS{ - Ctx: context.Background(), - K8sConfig: k8sConfig, - CertPath: certPath, - KeyPath: keyPath, - Name: constants.WebhookScrtName, - ServiceName: webhookServiceName, - LabelSelector: constants.AddonWebhookLabelKey, - Logger: setupLog, - Namespace: addonNamespace, - RotationTime: rotationTime, - } - err := webhookTLS.ManageCertificates(managementFrequency) - Expect(err).ToNot(HaveOccurred()) - Expect(webhookTLS.RotationTime).To(Equal(oneWeek - webhooks.RequireMinGracePeriod)) - }) - }) - Context("if rotation time is one week", func() { - It("tls certificates should be validated and not rotated until one week", func() { - privCtx := context.Background() - cacelCtx, cancelFn := context.WithCancel(privCtx) - rotationTime := oneWeek - managementFrequency := time.Second / 2 // manage the certificates every 1/2 second for testing purposes - webhookTLS := webhooks.WebhookTLS{ - Ctx: cacelCtx, - K8sConfig: k8sConfig, - CertPath: certPath, - KeyPath: keyPath, - Name: constants.WebhookScrtName, - ServiceName: webhookServiceName, - LabelSelector: constants.AddonWebhookLabelKey, - Logger: setupLog, - Namespace: addonNamespace, - RotationTime: rotationTime, - } - - err := webhookTLS.ManageCertificates(managementFrequency) - Expect(err).ToNot(HaveOccurred()) - time.Sleep(managementFrequency * 3) // manage the certificates three times - firstCert, err := cert2.CertsFromFile(webhookTLS.CertPath) - Expect(err).ToNot(HaveOccurred()) - firstCertPEM, err := cert2.EncodeCertificates(firstCert[0]) - Expect(err).ToNot(HaveOccurred()) - - time.Sleep(managementFrequency * 3) // manage the certificate three times - secondCert, err := cert2.CertsFromFile(webhookTLS.CertPath) - Expect(err).ToNot(HaveOccurred()) - secondCertPEM, err := cert2.EncodeCertificates(secondCert[0]) - Expect(err).ToNot(HaveOccurred()) - - cancelFn() - - // The certificates should be the same since we did not hit one week rotation - Expect(secondCertPEM).To(Equal(firstCertPEM)) - - }) - }) - -}) diff --git a/addons/docs/images/supervisor-workload.jpg b/addons/docs/images/supervisor-workload.jpg deleted file mode 100644 index 61c51c9133..0000000000 Binary files a/addons/docs/images/supervisor-workload.jpg and /dev/null differ diff --git a/addons/fakegen/fakegen.go b/addons/fakegen/fakegen.go deleted file mode 100644 index 8dda885df2..0000000000 --- a/addons/fakegen/fakegen.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package fakegen provides a fake CtrClient for testing -package fakegen - -import ( - crtclient "sigs.k8s.io/controller-runtime/pkg/client" -) - -//go:generate counterfeiter -o ../pkg/fakeclusterclient/crtclusterclient.go --fake-name CRTClusterClient . CrtClient - -// CrtClient clientset interface -type CrtClient interface { - crtclient.Client -} diff --git a/addons/go.mod b/addons/go.mod deleted file mode 100644 index d94236ccb1..0000000000 --- a/addons/go.mod +++ /dev/null @@ -1,126 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/addons - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs => ../apis/addonconfigs - github.com/vmware-tanzu/tanzu-framework/apis/run => ../apis/run - sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.8 -) - -require ( - github.com/go-logr/logr v1.2.3 - github.com/google/gnostic v0.6.9 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.20.2 - github.com/oracle/cluster-api-provider-oci v0.6.0 - github.com/pkg/errors v0.9.1 - github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 - github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 - github.com/vmware-tanzu/carvel-vendir v0.26.0 - github.com/vmware-tanzu/nsx-operator v0.0.0-20221102072746-f7b4cc7cce41 - github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs v0.0.0-20220907220230-c1137d344dd3 - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20220907220230-c1137d344dd3 - github.com/vmware-tanzu/vm-operator-api v0.1.4-0.20211202185235-43eb44c09ecd - github.com/vmware-tanzu/vm-operator/external/tanzu-topology v0.0.0-20211209213435-0f4ab286f64f - golang.org/x/mod v0.8.0 - golang.org/x/text v0.8.0 - golang.org/x/tools v0.6.0 - gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.24.6 - k8s.io/apiextensions-apiserver v0.24.6 - k8s.io/apimachinery v0.24.6 - k8s.io/client-go v0.24.6 - k8s.io/component-base v0.24.6 - k8s.io/klog/v2 v2.70.1 - k8s.io/kube-aggregator v0.22.4 - k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 - knative.dev/pkg v0.0.0-20220302134643-d2cdc682d974 - sigs.k8s.io/cluster-api v1.2.8 - sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 - sigs.k8s.io/controller-runtime v0.12.3 - sigs.k8s.io/yaml v1.3.0 -) - -require ( - cloud.google.com/go/compute v1.7.0 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.23 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.18 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/benbjohnson/clock v1.3.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/blendle/zapdriver v1.3.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/coredns/caddy v1.1.1 // indirect - github.com/coredns/corefile-migration v1.0.18 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.0.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/hashicorp/go-version v1.3.0 // indirect - github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // 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/nxadm/tail v1.4.8 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/oracle/oci-go-sdk/v65 v65.18.0 // indirect - github.com/prometheus/client_golang v1.13.0 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/sony/gobreaker v0.5.0 // indirect - github.com/spf13/cobra v1.5.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/vmware-tanzu/net-operator-api v0.0.0-20210401185409-b0dc6c297707 // indirect - github.com/vmware-tanzu/vm-operator/external/ncp v0.0.0-20211209213435-0f4ab286f64f // indirect - github.com/vmware/govmomi v0.30.2 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - go.uber.org/zap v1.22.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/fsnotify.v1 v1.4.7 // indirect - gopkg.in/gcfg.v1 v1.2.3 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/warnings.v0 v0.1.2 // indirect - k8s.io/cluster-bootstrap v0.24.6 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.24.6 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect -) diff --git a/addons/go.sum b/addons/go.sum deleted file mode 100644 index 6b67c97aa0..0000000000 --- a/addons/go.sum +++ /dev/null @@ -1,1786 +0,0 @@ -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.23 h1:bRQWsW25/YkoxnIqXMPF94JW33qWDcrPMZ3bINaAruU= -github.com/Azure/go-autorest/autorest v0.11.23/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= -github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/ajeddeloh/go-json v0.0.0-20160803184958-73d058cf8437/go.mod h1:otnto4/Icqn88WCcM4bhIJNSgsh9VLBuspyyCfvof9c= -github.com/ajeddeloh/go-json v0.0.0-20200220154158-5ae607161559/go.mod h1:otnto4/Icqn88WCcM4bhIJNSgsh9VLBuspyyCfvof9c= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d h1:0xIrH2lJbraclvJT3pvTf3u2oCAL60cAqiv4qRpz4EI= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/aws/aws-sdk-go v1.8.39/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= -github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudfoundry/bosh-utils v0.0.0-20191216173634-505d7f919144/go.mod h1:JCrKwetZGjxbfq1U139TZuXDBfdGLtjOEAfxMWKV/QM= -github.com/cloudfoundry/config-server v0.1.20/go.mod h1:Y3b/MHqyp22CcG0X1qvEHG8lujoebxjD9IAslyS/Yk0= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coredns/caddy v1.1.0/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= -github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/corefile-migration v1.0.17/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE= -github.com/coredns/corefile-migration v1.0.18 h1:zs5PJm/VGZVje1ESRj6ZqyUuVsVfagExkbLU2QKV5mI= -github.com/coredns/corefile-migration v1.0.18/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.1.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181031085051-9002847aa142/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46/go.mod h1:esf2rsHFNlZlxsqsZDojNBcnNs5REqIvRrWRHqX0vEU= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.15.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.16.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flatcar-linux/ignition v0.36.1/go.mod h1:0jS5n4AopgOdwgi7QDo5MFgkMx/fQUDYjuxlGJC1Txg= -github.com/flatcar/container-linux-config-transpiler v0.9.4/go.mod h1:LxanhPvXkWgHG9PrkT4rX/p7YhUPdDGGsUdkNpV3L5U= -github.com/flatcar/ignition v0.36.2/go.mod h1:uk1tpzLFRXus4RrvzgMI+IqmmB8a/RGFSBlI+tMTbbA= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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 v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= -github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/godbus/dbus v0.0.0-20181025153459-66d97aec3384/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-go v0.10.2/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-go v0.12.5 h1:DmzaiSgoaqGCjtpPQWl26/gND+yRpim56H1jCVev6d8= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw= -github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 h1:wKSifC/VbCaQMqXYn6/gSFqle82OX4bE3KYALDU9FlU= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115/go.mod h1:mGrnmO5qnhJIaSiwMo05cvRL6Ww9ccYbTgNFcm6RHZQ= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -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/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -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.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= -github.com/onsi/gomega v1.20.2 h1:8uQq0zMgLEfa0vRrrBgaJF2gyW9Da9BmfGV+OyUzfkY= -github.com/onsi/gomega v1.20.2/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/oracle/cluster-api-provider-oci v0.6.0 h1:vRTVo5yBzdIfIjNihG35tKJMX3X6A/Hv/CHvHlmqVmI= -github.com/oracle/cluster-api-provider-oci v0.6.0/go.mod h1:KcBzV5g/AfPh2OQc4Lnh2R4e9uGlfHX8DvgNFB9r3uw= -github.com/oracle/oci-go-sdk/v65 v65.18.0 h1:8I8d9lh/Jk+guoVSWRIv5CmHUfNJbR1GozR+8YqREgU= -github.com/oracle/oci-go-sdk/v65 v65.18.0/go.mod h1:oyMrMa1vOzzKTmPN+kqrTR9y9kPA2tU1igN3NUSNTIE= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pin/tftp v2.1.0+incompatible/go.mod h1:xVpZOMCXTy+A5QMjEVN0Glwa1sUvaJhFXbr/aAxuxGY= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= -github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sigma/bdoor v0.0.0-20160202064022-babf2a4017b0/go.mod h1:WBu7REWbxC/s/J06jsk//d+9DOz9BbsmcIrimuGRFbs= -github.com/sigma/vmw-guestinfo v0.0.0-20160204083807-95dd4126d6e8/go.mod h1:JrRFFC0veyh0cibh0DAhriSY7/gV3kDdNaVUOmfx01U= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= -github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 h1:zgWNumjhN+0CCiq1Wo4lVTmO89eOA6HuPXgv1sVhE4k= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0/go.mod h1:Hldrv7kPAD3THS1yUYZPFIaHmPE0ENO0ljzbJrpftiE= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 h1:3mSDyzhf52Y0jdvHrhJUf4Sk97CILBOkQt/WUaD8G/8= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0/go.mod h1:UW9xzccG6vjNoq2emVderTX11epILNyxtmGxFupRsHc= -github.com/vmware-tanzu/carvel-vendir v0.26.0 h1:Q98tPnH9WUAWE2vJSAP0lsHGsfwGjfW2y+JUOEiJ/Yk= -github.com/vmware-tanzu/carvel-vendir v0.26.0/go.mod h1:JcuNNVONFbZTbm/GjtGiWUfFrt17YBQzeGT9+gY1+yY= -github.com/vmware-tanzu/net-operator-api v0.0.0-20210401185409-b0dc6c297707 h1:2onys8tWlQh7DFiOz6+68AwJdW9EBOEv6RTKzwh1x7A= -github.com/vmware-tanzu/net-operator-api v0.0.0-20210401185409-b0dc6c297707/go.mod h1:pDB0pUiFYufuP3lUkQX9fZ67PYnKvqBpDcJN3mSrw5U= -github.com/vmware-tanzu/nsx-operator v0.0.0-20221102072746-f7b4cc7cce41 h1:GM/KH7xmJQ8uPzrCQf3B1dhVbpIwYNPAmxLeWdKtcEA= -github.com/vmware-tanzu/nsx-operator v0.0.0-20221102072746-f7b4cc7cce41/go.mod h1:Exsg90TOJ0FQBFzmdYurJNVCh9PMN3IkAr/tA+rKrLQ= -github.com/vmware-tanzu/vm-operator-api v0.1.4-0.20211202185235-43eb44c09ecd h1:BXz4aAPzRAYD8x8LEhjEsmvTj9mCvesnr4ApT1Ay4YY= -github.com/vmware-tanzu/vm-operator-api v0.1.4-0.20211202185235-43eb44c09ecd/go.mod h1:mubK0QMyaA2TbeAmGsu2GVfiqDFppNUAUqoMPoKFgzM= -github.com/vmware-tanzu/vm-operator/external/ncp v0.0.0-20211209213435-0f4ab286f64f h1:RUuS5lh25citvQoXmDSfxJ1BB72LXOjD5cXvJETJ7Cc= -github.com/vmware-tanzu/vm-operator/external/ncp v0.0.0-20211209213435-0f4ab286f64f/go.mod h1:5rqRJ9zGR+KnKbkGx373WgN8xJpvAj99kHnfoDYRO5I= -github.com/vmware-tanzu/vm-operator/external/tanzu-topology v0.0.0-20211209213435-0f4ab286f64f h1:wwYUf16/g8bLywQMQJB5VHbDtuf6aOFH24Ar2/yA7+I= -github.com/vmware-tanzu/vm-operator/external/tanzu-topology v0.0.0-20211209213435-0f4ab286f64f/go.mod h1:dfYrWS8DMRN+XZfhu8M4LVHmeGvYB29Ipd7j4uIq+mU= -github.com/vmware/govmomi v0.30.2 h1:zPMmLTtAfBgOVsTgwKOzVVahQIOC4A2oyFQFSsn/0ag= -github.com/vmware/govmomi v0.30.2/go.mod h1:F7adsVewLNHsW/IIm7ziFURaXDaHEwcc+ym4r3INMdY= -github.com/vmware/vmw-guestinfo v0.0.0-20170707015358-25eff159a728/go.mod h1:x9oS4Wk2s2u4tS29nEaDLdzvuHdB19CvSGJjPgkZJNk= -github.com/vmware/vmw-ovflib v0.0.0-20170608004843-1f217b9dc714/go.mod h1:jiPk45kn7klhByRvUq5i2vo1RtHKBHj+iWGFpxbXuuI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0= -go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U= -go4.org v0.0.0-20160314031811-03efcb870d84/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= -go4.org v0.0.0-20201209231011-d4a079459e60/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= -go4.org/intern v0.0.0-20211027215823-ae77deb06f29/go.mod h1:cS2ma+47FKrLPdXFpr7CuxiTW3eyJbWew4qx0qtQWDA= -go4.org/intern v0.0.0-20220617035311-6925f38cc365 h1:t9hFvR102YlOqU0fQn1wgwhNvSbHGBbbJxX9JKfU3l0= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4= -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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20190321115727-fe223c5a2583/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc h1:Nf+EdcTLHR8qDNN/KfkQL0u0ssxt9OhbaWCl5C0ucEI= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc/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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/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= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -inet.af/netaddr v0.0.0-20220617031823-097006376321/go.mod h1:OIezDfdzOgFhuw4HuWapWq2e9l0H9tK4F1j+ETRtF3k= -inet.af/netaddr v0.0.0-20220811202034-502d2d690317 h1:U2fwK6P2EqmopP/hFLTOAjWTki0qgd4GMJn5X8wOleU= -k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= -k8s.io/api v0.17.4/go.mod h1:5qxx6vjmwUVG2nHQTKGlLts8Tbok8PzHl4vHtVFuZCA= -k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= -k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= -k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.22.4/go.mod h1:Rgs+9gIGYC5laXQSZZ9JqT5NevNgoGiOdVWi1BAB3qk= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/api v0.24.6 h1:9EZhqZv4Ct++e6XMh3f5bmP4XMxsuxf4c7WOCCjYvF8= -k8s.io/api v0.24.6/go.mod h1:eoAZTnLglpwBajOxAusPL3xfVW5tUn3Y3gQv8e1XHBA= -k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= -k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= -k8s.io/apiextensions-apiserver v0.21.1/go.mod h1:KESQFCGjqVcVsZ9g0xX5bacMjyX5emuWcS2arzdEouA= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apiextensions-apiserver v0.24.6 h1:XgOhyeTIKUiw1qupOtx3x3xyfeaGsCBQYwPR11wYFwk= -k8s.io/apiextensions-apiserver v0.24.6/go.mod h1:0DMt8ahXcD3uQuB80mQN3l8fbQ9s93iRVhoUZRp4KqA= -k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/apimachinery v0.17.4/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= -k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.22.4/go.mod h1:yU6oA6Gnax9RrxGzVvPFFJ+mpnW6PBSqp0sx0I0HHW0= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.6 h1:Sp4EHDrBtm0V1z/8poY52HhP79dAIcI9lb9DUG54XPc= -k8s.io/apimachinery v0.24.6/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= -k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= -k8s.io/apiserver v0.21.1/go.mod h1:nLLYZvMWn35glJ4/FZRhzLG/3MPxAaZTgV4FJZdr+tY= -k8s.io/apiserver v0.22.4/go.mod h1:38WmcUZiiy41A7Aty8/VorWRa8vDGqoUzDf2XYlku0E= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/apiserver v0.24.6 h1:LEVuJb3bwjbZSIA8Ltm6iNBJiFawJtEGmAP7bgMljIE= -k8s.io/apiserver v0.24.6/go.mod h1:ZmMXlYsNUhWzEOMJv01JqjL/psUzmvcIF70yDnzen/A= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/cli-runtime v0.24.6/go.mod h1:dZghAkzYOsDUDqz1pjFi1KDo+1ly1gKGrIPaX4HMHPs= -k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI= -k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= -k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= -k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.22.4/go.mod h1:Yzw4e5e7h1LNHA4uqnMVrpEpUs1hJOiuBsJKIlRCHDA= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/client-go v0.24.6 h1:q7gZYyGL0Iv9zynYOFi5DHc3NFZ2aA0P56QpWFXbEyE= -k8s.io/client-go v0.24.6/go.mod h1:qaJRTFlI24ONWGplf+j8IgTyb6ztpwS6SGfjcNCRpQ8= -k8s.io/cluster-bootstrap v0.24.0/go.mod h1:xw+IfoaUweMCAoi+VYhmqkcjii2G7gNg59dmGn7hi0g= -k8s.io/cluster-bootstrap v0.24.6 h1:U7bFTv4eSkca7nM0MytyzPMWPyyS/T4MTj0HJ7iSId8= -k8s.io/cluster-bootstrap v0.24.6/go.mod h1:xSik/M1tAJ7Q09HWcCzBtHoMB05QPygQJT7Z2I+r4Ic= -k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= -k8s.io/code-generator v0.22.4/go.mod h1:qjYl54pQ/emhkT0UxbufbREYJMWsHNNV/jSVwhYZQGw= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.6/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= -k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= -k8s.io/component-base v0.21.1/go.mod h1:NgzFZ2qu4m1juby4TnrmpR8adRk6ka62YdH5DkIIyKA= -k8s.io/component-base v0.22.4/go.mod h1:MrSaQy4a3tFVViff8TZL6JHYSewNCLshZCwHYM58v5A= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/component-base v0.24.6 h1:LqSZunOeX1l6BpsMaD+iiJJSxZYl7IlVFW6qQu52ikA= -k8s.io/component-base v0.24.6/go.mod h1:YwPBIsm9c6VONDa6vBW4WjDMyvQgrLMHNoUokOkOdzU= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/component-helpers v0.24.6/go.mod h1:M2X/q2ZwGV1IJyQkY2sIc8zbRx1DMUCtNUGHOymiTUE= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -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.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-aggregator v0.22.4 h1:2aJMJMhWyKFRtVlj2ofGHewfjODXrMkjwkNlN1jn2jU= -k8s.io/kube-aggregator v0.22.4/go.mod h1:nH2L1wiG9pMqYV7P8XIMb9RbIEZPBwxz0iJqPPrtALU= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/kubectl v0.24.6 h1:uiMSNykwwqv9le5YDRnT9vpOaMoLwWKJTNEYXlwCyYE= -k8s.io/kubectl v0.24.6/go.mod h1:IZglw2VTcFalGi+kda5Q2/mCA5mmrwfn2KTIEUV+t+8= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/metrics v0.24.6/go.mod h1:9R9FNM60iHazUHxUik4C5S6GbXabICR9TLwcnKg1ccY= -k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200821003339-5e75c0163111/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210527160623-6fdb442a123b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 h1:XmRqFcQlCy/lKRZ39j+RVpokYNroHPqV3mcBRfnhT5o= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -knative.dev/pkg v0.0.0-20220302134643-d2cdc682d974 h1:ZTnSO5Hekxr1XR/FfKbM70ZZ0PO0LWBRhWJyBG25Ng4= -knative.dev/pkg v0.0.0-20220302134643-d2cdc682d974/go.mod h1:SsH9J6Gz+CvrHmoL0TELJXmMmohqKSQ5bpJvCv+1+ZI= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 h1:D0bDtSyRIcBmuGFyW65otEh+VIz8SGioaAjYok/cK5Y= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3/go.mod h1:EIWdG6qGX1iW0U5qiMi+EDQ9gmW7pylJwKDtHOkBQ6g= -sigs.k8s.io/cluster-api/test v1.2.0/go.mod h1:JdMqpv9rEOFWQVQ8danpBduqxoQkZMiOvpIGJ7v8qjw= -sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= -sigs.k8s.io/controller-runtime v0.9.0/go.mod h1:TgkfvrhhEw3PlI0BRL/5xM+89y3/yc0ZDfdbTl84si8= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kind v0.14.0/go.mod h1:UrFRPHG+2a5j0Q7qiR4gtJ4rEyn8TuMQwuOPf+m4oHg= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/addons/hack/tools/go.mod b/addons/hack/tools/go.mod deleted file mode 100644 index bf5eebcddd..0000000000 --- a/addons/hack/tools/go.mod +++ /dev/null @@ -1,12 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/addons/hack/tools - -go 1.18 - -require github.com/maxbrunsfeld/counterfeiter/v6 v6.5.0 - -require ( - golang.org/x/mod v0.7.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/tools v0.1.12 // indirect -) diff --git a/addons/hack/tools/go.sum b/addons/hack/tools/go.sum deleted file mode 100644 index da624f2f98..0000000000 --- a/addons/hack/tools/go.sum +++ /dev/null @@ -1,14 +0,0 @@ -github.com/maxbrunsfeld/counterfeiter/v6 v6.5.0 h1:rBhB9Rls+yb8kA4x5a/cWxOufWfXt24E+kq4YlbGj3g= -github.com/maxbrunsfeld/counterfeiter/v6 v6.5.0/go.mod h1:fJ0UAZc1fx3xZhU4eSHQDJ1ApFmTVhp5VTpV9tm2ogg= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= -github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= -golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/addons/hack/tools/main.go b/addons/hack/tools/main.go deleted file mode 100644 index 602e391142..0000000000 --- a/addons/hack/tools/main.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// This file is only present to make the linter happy. - -package main - -func main() {} diff --git a/addons/hack/tools/tools.go b/addons/hack/tools/tools.go deleted file mode 100644 index dfe4276978..0000000000 --- a/addons/hack/tools/tools.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build tools - -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tools imports things required by build scripts, to force `go mod` to see them as dependencies - -package tools - -import ( - _ "github.com/maxbrunsfeld/counterfeiter/v6" -) diff --git a/addons/main.go b/addons/main.go deleted file mode 100644 index 3c9b88a686..0000000000 --- a/addons/main.go +++ /dev/null @@ -1,560 +0,0 @@ -// Copyright 2020 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "crypto/tls" - "flag" - "fmt" - "net/http" - "os" - "path" - "strings" - "time" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/kubernetes" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - _ "k8s.io/client-go/plugin/pkg/client/auth" - "k8s.io/client-go/util/workqueue" - cliflag "k8s.io/component-base/cli/flag" - "k8s.io/klog/v2" - "k8s.io/klog/v2/klogr" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capvvmwarev1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/vmware/v1beta1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - capiremote "sigs.k8s.io/cluster-api/controllers/remote" - controlplanev1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/healthz" - - nsxoperator "github.com/vmware-tanzu/nsx-operator/pkg/apis/v1alpha1" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kappdatapkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/addons/controllers" - antreacontroller "github.com/vmware-tanzu/tanzu-framework/addons/controllers/antrea" - awsebscsicontroller "github.com/vmware-tanzu/tanzu-framework/addons/controllers/awsebscsi" - azurediskcsicontroller "github.com/vmware-tanzu/tanzu-framework/addons/controllers/azurediskcsi" - azurefilecsicontroller "github.com/vmware-tanzu/tanzu-framework/addons/controllers/azurefilecsi" - calicocontroller "github.com/vmware-tanzu/tanzu-framework/addons/controllers/calico" - cpicontroller "github.com/vmware-tanzu/tanzu-framework/addons/controllers/cpi" - csicontroller "github.com/vmware-tanzu/tanzu-framework/addons/controllers/csi" - kappcontroller "github.com/vmware-tanzu/tanzu-framework/addons/controllers/kapp-controller" - kvcpicontroller "github.com/vmware-tanzu/tanzu-framework/addons/controllers/kubevipcpi" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/buildinfo" - addonconfig "github.com/vmware-tanzu/tanzu-framework/addons/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/crdwait" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/webhooks" - addonwebhooks "github.com/vmware-tanzu/tanzu-framework/addons/webhooks" - cniv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha1" - cniv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha2" - cpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" - runtanzuv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - vmoperatorv1alpha1 "github.com/vmware-tanzu/vm-operator-api/api/v1alpha1" - topologyv1alpha1 "github.com/vmware-tanzu/vm-operator/external/tanzu-topology/api/v1alpha1" -) - -var ( - scheme = runtime.NewScheme() - setupLog = ctrl.Log.WithName("setup") -) - -func init() { - klog.InitFlags(nil) - - _ = clientgoscheme.AddToScheme(scheme) - _ = kappctrl.AddToScheme(scheme) - _ = kapppkg.AddToScheme(scheme) - _ = kappdatapkg.AddToScheme(scheme) - _ = runtanzuv1alpha1.AddToScheme(scheme) - _ = clusterapiv1beta1.AddToScheme(scheme) - _ = controlplanev1beta1.AddToScheme(scheme) - _ = runtanzuv1alpha3.AddToScheme(scheme) - _ = cniv1alpha1.AddToScheme(scheme) - _ = cniv1alpha2.AddToScheme(scheme) - _ = cpiv1alpha1.AddToScheme(scheme) - _ = csiv1alpha1.AddToScheme(scheme) - _ = capvv1beta1.AddToScheme(scheme) - _ = capvvmwarev1beta1.AddToScheme(scheme) - _ = vmoperatorv1alpha1.AddToScheme(scheme) - _ = topologyv1alpha1.AddToScheme(scheme) - _ = nsxoperator.AddToScheme(scheme) - - // +kubebuilder:scaffold:scheme -} - -type addonFlags struct { - metricsAddr string - enableLeaderElection bool - leaderElectionID string - leaderElectionLeaseDuration time.Duration - leaderElectionRenewDeadline time.Duration - leaderElectionRetryPeriod time.Duration - clusterConcurrency int - syncPeriod time.Duration - appSyncPeriod time.Duration - appWaitTimeout time.Duration - clusterDeleteTimeout time.Duration - addonNamespace string - addonServiceAccount string - addonClusterRole string - addonClusterRoleBinding string - addonImagePullPolicy string - corePackageRepoName string - webhookServerPort int - healthdAddr string - ipFamilyClusterVarName string - featureGateClusterBootstrap bool - featureGatePackageInstallStatus bool - enablePprof bool - pprofBindAddress string - tlsMinVersion string - tlsCipherSuites string -} - -func parseAddonFlags(addonFlags *addonFlags) { - // controller configurations - - // Bind metrics endpoint to localhost, following the pattern in cluster-api projects where they moved away from kube-rbac-proxy for just guarding metrics endpoint. - // see https://github.com/kubernetes-sigs/cluster-api/issues/4679 and https://github.com/kubernetes-sigs/cluster-api/issues/4325 - // 18317 is an available port in Supervisor cluster - flag.StringVar(&addonFlags.metricsAddr, "metrics-bind-addr", "localhost:18317", "The address the metric endpoint binds to.") - flag.BoolVar(&addonFlags.enableLeaderElection, "leader-elect", false, - "Enable leader election for controller manager. "+ - "Enabling this will ensure there is only one active controller manager.") - flag.StringVar(&addonFlags.leaderElectionID, "leader-elect-id", constants.AddonControllerManagerLeaderElectionResourceName, - "The name of the resource that leader election will use for holding the leader lock.") - flag.DurationVar(&addonFlags.leaderElectionLeaseDuration, "leader-elect-lease-duration", 15*time.Second, - "Interval at which non-leader candidates will wait to force acquire leadership") - flag.DurationVar(&addonFlags.leaderElectionRenewDeadline, "leader-elect-renew-deadline", 10*time.Second, - "Duration that the leading controller manager will retry refreshing leadership before giving up") - flag.DurationVar(&addonFlags.leaderElectionRetryPeriod, "leader-elect-retry-period", 2*time.Second, - "Duration the LeaderElector clients should wait between tries of actions") - flag.IntVar(&addonFlags.clusterConcurrency, "cluster-concurrency", 10, - "Number of clusters to process simultaneously") - flag.DurationVar(&addonFlags.syncPeriod, "sync-period", 10*time.Minute, - "The minimum interval at which watched resources are reconciled (e.g. 10m)") - flag.DurationVar(&addonFlags.appSyncPeriod, "app-sync-period", 5*time.Minute, "Frequency of app reconciliation (e.g. 5m)") - flag.DurationVar(&addonFlags.appWaitTimeout, "app-wait-timeout", 30*time.Second, "Maximum time to wait for app to be ready (e.g. 30s)") - flag.DurationVar(&addonFlags.clusterDeleteTimeout, "cluster-delete-timeout", 10*time.Minute, "Maximum time to wait for addon resources to be deleted before allowing cluster deletion to proceed") - - // resource configurations (optional) - flag.StringVar(&addonFlags.addonNamespace, "addon-namespace", "tkg-system", "The namespace of addon resources") - flag.StringVar(&addonFlags.addonServiceAccount, "addon-service-account-name", "tkg-addons-app-sa", "The name of addon service account") - flag.StringVar(&addonFlags.addonClusterRole, "addon-cluster-role-name", "tkg-addons-app-cluster-role", "The name of addon clusterRole") - flag.StringVar(&addonFlags.addonClusterRoleBinding, "addon-cluster-role-binding-name", "tkg-addons-app-cluster-role-binding", "The name of addon clusterRoleBinding") - flag.StringVar(&addonFlags.addonImagePullPolicy, "addon-image-pull-policy", "IfNotPresent", "The addon image pull policy") - flag.StringVar(&addonFlags.corePackageRepoName, "core-package-repo-name", "tanzu-core", "The name of core package repository") - flag.StringVar(&addonFlags.healthdAddr, "health-addr", ":18316", "The address the health endpoint binds to.") - flag.IntVar(&addonFlags.webhookServerPort, "webhook-server-port", 9865, "The port that the webhook server serves at.") - flag.StringVar(&addonFlags.ipFamilyClusterVarName, "ip-family-cluster-var-name", constants.DefaultIPFamilyClusterClassVarName, "IP family setting cluster variable name") - flag.BoolVar(&addonFlags.featureGateClusterBootstrap, "feature-gate-cluster-bootstrap", false, "Feature gate to enable clusterbootstap and addonconfig controllers that rely on TKR v1alphav3") - flag.BoolVar(&addonFlags.featureGatePackageInstallStatus, "feature-gate-package-install-status", false, "Feature gate to enable packageinstallstatus controller") - flag.BoolVar(&addonFlags.enablePprof, "enable-pprof", false, "Enable pprof web server") - flag.StringVar(&addonFlags.pprofBindAddress, "pprof-bind-addr", ":18318", "Bind address of pprof web server if enabled") - flag.StringVar(&addonFlags.tlsMinVersion, "tls-min-version", "1.2", "minimum TLS version in use by the webhook server. Recommended values are \"1.2\" and \"1.3\".") - flag.StringVar(&addonFlags.tlsCipherSuites, "tls-cipher-suites", "", "Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be used.\n"+fmt.Sprintf("Possible values are %s.", strings.Join(cliflag.TLSCipherPossibleValues(), ", "))) - flag.Parse() -} - -func main() { - // parse flags - flags := &addonFlags{} - parseAddonFlags(flags) - - ctrl.SetLogger(klogr.New()) - setupLog.Info("Version", "version", buildinfo.Version, "buildDate", buildinfo.Date, "sha", buildinfo.SHA) - - ctx := ctrl.SetupSignalHandler() - - if flags.enablePprof { - go func() { - setupLog.Info("[Warn]: pprof web server enabled", "bindAddress", flags.pprofBindAddress) - if err := http.ListenAndServe(flags.pprofBindAddress, nil); err != nil { - setupLog.Error(err, "error binding to pprof-bind-addr") - os.Exit(1) - } - }() - } - - if flags.featureGateClusterBootstrap { - if err := os.MkdirAll(constants.WebhookCertDir, 0755); err != nil { - setupLog.Error(err, "unable to create directory for webhook certificates", "directory", constants.WebhookCertDir) - os.Exit(1) - } - } - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - MetricsBindAddress: flags.metricsAddr, - Port: flags.webhookServerPort, - CertDir: constants.WebhookCertDir, - LeaderElection: flags.enableLeaderElection, - LeaderElectionID: flags.leaderElectionID, - LeaseDuration: &flags.leaderElectionLeaseDuration, - RenewDeadline: &flags.leaderElectionRenewDeadline, - RetryPeriod: &flags.leaderElectionRetryPeriod, - SyncPeriod: &flags.syncPeriod, - HealthProbeBindAddress: flags.healthdAddr, - }) - - clientSet, err := kubernetes.NewForConfig(mgr.GetConfig()) - if err != nil { - setupLog.Error(err, "unable to create kubernetes clientset") - os.Exit(1) - } - - crdwaiter := crdwait.CRDWaiter{ - Ctx: ctx, - APIReader: mgr.GetAPIReader(), - ClientSet: clientSet, - Logger: setupLog, - Scheme: scheme, - PollInterval: constants.CRDWaitPollInterval, - PollTimeout: constants.CRDWaitPollTimeout, - } - - crds, _ := controllers.GetExternalCRDs() - if err := crdwaiter.WaitForCRDs(crds, - &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: os.Getenv("POD_NAME"), Namespace: os.Getenv("POD_NAMESPACE")}}, - constants.AddonControllerName, - ); err != nil { - setupLog.Error(err, "unable to wait for CRDs") - os.Exit(1) - } - - if err != nil { - setupLog.Error(err, "unable to start manager") - os.Exit(1) - } - - addonReconciler := &controllers.AddonReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("Addon"), - Scheme: mgr.GetScheme(), - Config: addonconfig.AddonControllerConfig{ - AppSyncPeriod: flags.appSyncPeriod, - AppWaitTimeout: flags.appWaitTimeout, - AddonNamespace: flags.addonNamespace, - AddonServiceAccount: flags.addonServiceAccount, - AddonClusterRole: flags.addonClusterRole, - AddonClusterRoleBinding: flags.addonClusterRoleBinding, - AddonImagePullPolicy: flags.addonImagePullPolicy, - CorePackageRepoName: flags.corePackageRepoName, - FeatureGateClusterBootstrap: flags.featureGateClusterBootstrap, - }, - } - if err = addonReconciler.SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: flags.clusterConcurrency}); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "Addon") - os.Exit(1) - } - if flags.featureGateClusterBootstrap { - enableClusterBootstrapAndConfigControllers(ctx, mgr, flags) - enableWebhooks(ctx, mgr, flags) - } - - if flags.featureGatePackageInstallStatus { - enablePackageInstallStatusController(ctx, mgr, flags) - } - - enableClusterMetadata(ctx, mgr) - setupChecks(mgr) - setupLog.Info("starting manager") - if err := mgr.Start(ctx); err != nil { - setupLog.Error(err, "problem running manager") - os.Exit(1) - } -} - -func enableClusterMetadata(ctx context.Context, mgr ctrl.Manager) { - clusterMetadataReconciler := controllers.NewClusterMetadataReconciler( - mgr.GetClient(), - ctrl.Log.WithName("ClusterMetadataReconciler"), - mgr.GetScheme(), - ) - - if err := clusterMetadataReconciler.SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "metadata") - os.Exit(1) - } -} - -func setupChecks(mgr ctrl.Manager) { - if err := mgr.AddReadyzCheck("ping", healthz.Ping); err != nil { - setupLog.Error(err, "unable to create ready check") - os.Exit(1) - } - - if err := mgr.AddHealthzCheck("ping", healthz.Ping); err != nil { - setupLog.Error(err, "unable to create health check") - os.Exit(1) - } -} - -func enableClusterBootstrapAndConfigControllers(ctx context.Context, mgr ctrl.Manager, flags *addonFlags) { - if err := (&calicocontroller.CalicoConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("CalicoConfigController"), - Scheme: mgr.GetScheme(), - Config: addonconfig.CalicoConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: flags.addonNamespace}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create CalicoConfigController", "controller", "calico") - os.Exit(1) - } - - if err := (&antreacontroller.AntreaConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("AntreaConfigController"), - Scheme: mgr.GetScheme(), - Config: addonconfig.AntreaConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: flags.addonNamespace}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create AntreaConfigController", "controller", "antrea") - os.Exit(1) - } - if err := (&kappcontroller.KappControllerConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("KappControllerConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.KappControllerConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: flags.addonNamespace}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create KappControllerConfig", "controller", "kapp") - os.Exit(1) - } - if err := (&cpicontroller.VSphereCPIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("VSphereCPIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.VSphereCPIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: flags.addonNamespace}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create CPIConfigController", "controller", "vspherecpi") - os.Exit(1) - } - if err := (&cpicontroller.OracleCPIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("OracleCPIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.OracleCPIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: flags.addonNamespace}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create CPIConfigController", "controller", "oraclecpi") - os.Exit(1) - } - - if err := (&csicontroller.VSphereCSIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("VSphereCSIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.VSphereCSIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: flags.addonNamespace}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create CSIConfigController", "controller", "vspherecsi") - os.Exit(1) - } - - if err := (&awsebscsicontroller.AwsEbsCSIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("AwsEbsCSIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.AwsEbsCSIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: flags.addonNamespace}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create AwsEbsCSIConfigController", "controller", "awsebscsi") - os.Exit(1) - } - - if err := (&azurefilecsicontroller.AzureFileCSIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("AzureFileCSIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.AzureFileCSIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: flags.addonNamespace}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create CSIConfigController", "controller", "azurefilecsi") - os.Exit(1) - } - - if err := (&kvcpicontroller.KubevipCPIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("KubevipCPIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.KubevipCPIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: flags.addonNamespace}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create KubevipCPIConfigController", "controller", "kubevipcloudprovider") - os.Exit(1) - } - - if err := (&azurediskcsicontroller.AzureDiskCSIConfigReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("AzureDiskCSIConfig"), - Scheme: mgr.GetScheme(), - Config: addonconfig.AzureDiskCSIConfigControllerConfig{ - ConfigControllerConfig: addonconfig.ConfigControllerConfig{SystemNamespace: flags.addonNamespace}}, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create CSIConfigController", "controller", "azurediskcsi") - os.Exit(1) - } - - if err := (&controllers.MachineReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("MachineController"), - Scheme: mgr.GetScheme(), - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create addons MachineController", "controller", "machine") - os.Exit(1) - } - - bootstrapReconciler := controllers.NewClusterBootstrapReconciler( - mgr.GetClient(), - ctrl.Log.WithName("ClusterBootstrapController"), - mgr.GetScheme(), - &addonconfig.ClusterBootstrapControllerConfig{ - IPFamilyClusterClassVarName: constants.DefaultIPFamilyClusterClassVarName, - SystemNamespace: flags.addonNamespace, - PkgiServiceAccount: constants.PackageInstallServiceAccount, - PkgiClusterRole: constants.PackageInstallClusterRole, - PkgiClusterRoleBinding: constants.PackageInstallClusterRoleBinding, - PkgiSyncPeriod: flags.syncPeriod, - ClusterDeleteTimeout: flags.clusterDeleteTimeout, - }, - ) - if err := bootstrapReconciler.SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "clusterbootstrap") - os.Exit(1) - } -} - -func setCipherSuiteFunc(cipherSuiteString string) (func(cfg *tls.Config), error) { - cipherSuites := strings.Split(cipherSuiteString, ",") - suites, err := cliflag.TLSCipherSuites(cipherSuites) - if err != nil { - return nil, err - } - return func(cfg *tls.Config) { - cfg.CipherSuites = suites - }, nil -} - -func enableWebhooks(ctx context.Context, mgr ctrl.Manager, flags *addonFlags) { - mgr.GetWebhookServer().TLSMinVersion = flags.tlsMinVersion - if flags.tlsCipherSuites != "" { - cipherSuitesSetFunc, err := setCipherSuiteFunc(flags.tlsCipherSuites) - if err != nil { - setupLog.Error(err, "unable to set TLS Cipher suites") - os.Exit(1) - } - mgr.GetWebhookServer().TLSOpts = append(mgr.GetWebhookServer().TLSOpts, cipherSuitesSetFunc) - } - - certPath := path.Join(constants.WebhookCertDir, "tls.crt") - keyPath := path.Join(constants.WebhookCertDir, "tls.key") - webhookTLS := webhooks.WebhookTLS{ - Ctx: ctx, - K8sConfig: mgr.GetConfig(), - CertPath: certPath, - KeyPath: keyPath, - Name: constants.WebhookScrtName, - ServiceName: constants.WebhookServiceName, - LabelSelector: constants.AddonWebhookLabelKey + "=" + constants.AddonWebhookLabelValue, - Logger: setupLog, - Namespace: flags.addonNamespace, - RotationTime: constants.WebhookCertLifeTime, - } - if err := webhookTLS.ManageCertificates(constants.WebhookCertManagementFrequency); err != nil { - setupLog.Error(err, "Unable to start webhook tls certificate management") - os.Exit(1) - } - // Set up the webhooks in the manager - if err := (&cniv1alpha1.AntreaConfig{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to set up webhooks", "webhook", "antrea") - os.Exit(1) - } - if err := (&cniv1alpha2.AntreaConfig{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to set up webhooks", "webhook", "antrea") - os.Exit(1) - } - if err := (&cniv1alpha1.CalicoConfig{}).SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to set up webhooks", "webhook", "calico") - os.Exit(1) - } - clusterbootstrapWebhook := addonwebhooks.ClusterBootstrap{ - Client: mgr.GetClient(), - SystemNamespace: flags.addonNamespace, - } - if err := clusterbootstrapWebhook.SetupWebhookWithManager(ctx, mgr); err != nil { - setupLog.Error(err, "unable to create ClusterBootstrap webhook", "webhook", "clusterbootstrap") - os.Exit(1) - } - clusterbootstrapTemplateWebhook := addonwebhooks.ClusterBootstrapTemplate{ - SystemNamespace: flags.addonNamespace, - } - if err := clusterbootstrapTemplateWebhook.SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create clusterbootstrapTemplate webhook", "webhook", "clusterbootstraptemplate") - os.Exit(1) - } - clusterPauseWebhook := addonwebhooks.ClusterPause{Client: mgr.GetClient()} - if err := clusterPauseWebhook.SetupWebhookWithManager(mgr); err != nil { - setupLog.Error(err, "unable to set up webhooks", "webhook", "clusterpause") - os.Exit(1) - } -} - -func enablePackageInstallStatusController(ctx context.Context, mgr ctrl.Manager, flags *addonFlags) { - // set up a ClusterCacheTracker to provide to PackageInstallStatus controller which requires a connection to remote clusters - // the informers/caches are created only for objects accessed through Get/List in the code. - // we only read PackageInstall resource through our cached client, by default the client excludes configmap and secret resources. - l := ctrl.Log.WithName("remote").WithName("ClusterCacheTracker") - tracker, err := capiremote.NewClusterCacheTracker(mgr, capiremote.ClusterCacheTrackerOptions{Log: &l}) - if err != nil { - setupLog.Error(err, "unable to create cluster cache tracker") - os.Exit(1) - } - - // set up CluterCacheReconciler to drops the accessor via deleteAccessor upon cluster deletion. - // after a Cluster is deleted (from the apiserver/etcd), the CluterCacheReconciler drops the accessor via deleteAccessor. - // the healthchecking inside of the ClusterCacheTracker would remove the accessor at some point but the ClusterCacheReconciler does it more cleanly directly upon Cluster delete - if err := (&capiremote.ClusterCacheReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("remote").WithName("ClusterCacheReconciler"), - Tracker: tracker, - }).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "ClusterCacheReconciler") - os.Exit(1) - } - - pkgiStatusReconciler := controllers.NewPackageInstallStatusReconciler( - mgr.GetClient(), - ctrl.Log.WithName("PackageInstallStatusController"), - mgr.GetScheme(), - &addonconfig.PackageInstallStatusControllerConfig{ - SystemNamespace: flags.addonNamespace, - }, - tracker, - ) - // Use a custom rater limiter to do bigger backoffs for failures because updating status shouldn't overwhelm resource usage - if err := pkgiStatusReconciler.SetupWithManager( - ctx, - mgr, - controller.Options{ - MaxConcurrentReconciles: 1, - RateLimiter: workqueue.NewItemExponentialFailureRateLimiter( - constants.PackageInstallStatusControllerRateLimitBaseDelay, - constants.PackageInstallStatusControllerRateLimitMaxDelay), - }); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "PackageInstallStatus") - os.Exit(1) - } -} diff --git a/addons/manifests/samples/README.md b/addons/manifests/samples/README.md deleted file mode 100644 index 61fd5ea30e..0000000000 --- a/addons/manifests/samples/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Simple-App Addon - -Simple App addon - -## Prerequisites - -* kapp-controller deployed on cluster where addon is to be installed. - -## Steps to deploy simple-app addon - -### Management Cluster - -1. Create TKr CRD - - ```shell - kubectl apply -f ../../../apis/run/config/crd/bases/run.tanzu.vmware.com_tanzukubernetesreleases.yaml - ``` - -2. Deploy Addon controller - - ```shell - kubectl apply -f ../tanzu-addons-manager.yaml - ``` - -3. Create TKr instance and BOM configmap - - ```shell - kubectl apply -f tkr.yaml - kubectl apply -f bom_configmap.yaml - ``` - -4. Create simple-app addon secret. - - Replace cluster-name (tkg.tanzu.vmware.com/cluster-name: cluster1) and - namespace (same as cluster's namespace). - - ```shell - kubectl apply -f simple-app_addon_secret.yaml - ``` - -### Workload cluster - -1. Check if app is reconciled successfully on workload cluster - - ```shell - kubectl get app simple-app -n - ``` diff --git a/addons/manifests/samples/bom_configmap.yaml b/addons/manifests/samples/bom_configmap.yaml deleted file mode 100644 index fc686cbd16..0000000000 --- a/addons/manifests/samples/bom_configmap.yaml +++ /dev/null @@ -1,104 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: v1.19.3---vmware.1 - labels: - tanzuKubernetesRelease: v1.19.3---vmware.1 - namespace: tkr-system -data: - bomContent: | - release: - version: v1.19.3+vmware.1 - components: - coredns: - - version: v1.7.0+vmware.5 - images: - coredns: - imagePath: coredns - tag: v1.7.0_vmware.5 - etcd: - - version: v3.4.13+vmware.4 - images: - etcd: - imagePath: etcd - tag: v3.4.13_vmware.4 - kubernetes: - - version: v1.19.3+vmware.2 - imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg - addons: - tanzu-addons-manager: - category: addons-management - clusterTypes: - - management - - workload - templatesImagePath: addons/tanzu-addons-manager-templates - templatesImageTag: 98adbf4 - vsphere-cpi: - category: cpi - clusterTypes: - - management - - workload - templatesImagePath: addons/vsphere-cpi-templates - templatesImageTag: 98adbf4 - kapp-controller: - category: addons-management - clusterTypes: - - management - - workload - templatesImagePath: addons/kapp-controller-templates - templatesImageTag: 98adbf4 - pinniped-addon: - category: authentication - clusterTypes: - - management - - workload - templatesImagePath: addons/pinniped-addon-templates - templatesImageTag: 98adbf4 - antrea: - category: cni - clusterTypes: - - management - - workload - templatesImagePath: addons/antrea-templates - templatesImageTag: 98adbf4 - calico: - category: cni - clusterTypes: - - management - - workload - templatesImagePath: addons/calico-templates - templatesImageTag: 98adbf4 - metrics-server-addon: - category: metrics - clusterTypes: - - management - - workload - templatesImagePath: addons/metrics-server-addon-templates - templatesImageTag: 98adbf4 - vsphere-csi: - category: csi - clusterTypes: - - management - - workload - templatesImagePath: addons/vsphere-csi-templates - templatesImageTag: 98adbf4 - ---- -apiVersion: v1 -kind: Secret -metadata: - name: test-cluster-1-antrea - namespace: default - labels: - tkg.tanzu.vmware.com/addon-name: antrea - tkg.tanzu.vmware.com/cluster-name: test-cluster-1 -# annotations: -# tkg.tanzu.vmware.com/remote-app: "true" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: | - #@data/values - #@overlay/match-child-defaults missing_ok=True - --- - serviceCidr: 100.64.0.0/13 diff --git a/addons/manifests/samples/simple-app/Dockerfile b/addons/manifests/samples/simple-app/Dockerfile deleted file mode 100644 index 9202de6e93..0000000000 --- a/addons/manifests/samples/simple-app/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Enable Buildkit -# syntax=docker/dockerfile:1.4 - -FROM scratch -COPY templates/* ./ diff --git a/addons/manifests/samples/simple-app/Makefile b/addons/manifests/samples/simple-app/Makefile deleted file mode 100644 index 8d147bf320..0000000000 --- a/addons/manifests/samples/simple-app/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -.DEFAULT_GOAL := help - -ROOT_DIR := $(dir $(shell pwd)) - -# Image URL for simple app templates image -IMG ?= simple-app-templates:latest - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -## -------------------------------------- -## Build simple app templates -## -------------------------------------- - -.PHONY: template-image -template-image: ## Build template image - docker build -t $(IMG) . diff --git a/addons/manifests/samples/simple-app/templates/config.yaml b/addons/manifests/samples/simple-app/templates/config.yaml deleted file mode 100644 index af6fc21595..0000000000 --- a/addons/manifests/samples/simple-app/templates/config.yaml +++ /dev/null @@ -1,36 +0,0 @@ -#@ load("@ytt:data", "data") - -#@ def labels(): -simple-app: "" -#@ end - ---- -apiVersion: v1 -kind: Service -metadata: - namespace: default - name: simple-app -spec: - ports: - - port: #@ data.values.svc_port - targetPort: #@ data.values.app_port - selector: #@ labels() ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - namespace: default - name: simple-app -spec: - selector: - matchLabels: #@ labels() - template: - metadata: - labels: #@ labels() - spec: - containers: - - name: simple-app - image: docker.io/dkalinin/k8s-simple-app@sha256:4c8b96d4fffdfae29258d94a22ae4ad1fe36139d47288b8960d9958d1e63a9d0 - env: - - name: HELLO_MSG - value: #@ data.values.hello_msg diff --git a/addons/manifests/samples/simple-app/templates/values.yaml b/addons/manifests/samples/simple-app/templates/values.yaml deleted file mode 100644 index 401cffcc86..0000000000 --- a/addons/manifests/samples/simple-app/templates/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -#@data/values ---- -svc_port: 80 -app_port: 80 -hello_msg: simple-app diff --git a/addons/manifests/samples/simple-app_addon_secret.yaml b/addons/manifests/samples/simple-app_addon_secret.yaml deleted file mode 100644 index a46026b4d4..0000000000 --- a/addons/manifests/samples/simple-app_addon_secret.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: cluster1-simple-app - namespace: tkg-system - labels: - tkg.tanzu.vmware.com/addon-name: simple-app - tkg.tanzu.vmware.com/cluster-name: cluster1 - annotations: {} -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: | - #@data/values - --- - hello_msg: tanzu diff --git a/addons/manifests/samples/tkr.yaml b/addons/manifests/samples/tkr.yaml deleted file mode 100644 index aa0b274ada..0000000000 --- a/addons/manifests/samples/tkr.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: TanzuKubernetesRelease -metadata: - name: v1.19.3---vmware.1 - namespace: tkr-system - labels: - v1: "" - v1.19: "" - v1.19.3: latest - v1.19.3---vmware: latest - v1.19.3---vmware.1: latest -spec: - version: 1.19.3+vmware.1 - - kubernetesVersion: 1.19.3+vmware.1 - - repository: vmware.io - - images: - - name: coredns - repository: vmware.io # optional (default: top level repository) - tag: v1.6.5_vmware.2 - - name: etcd - tag: v3.3.15_vmware.4 - - nodeImageRef: - apiVersion: vmoperator.vmware.com/v1alpha1 - kind: VirtualMachineImage - name: photon-3-k8s-v1.19.3---vmware.1 - -status: - conditions: - - type: UpdateAvailable - status: True - message: a TKR with a later version is available - - type: Compatible - status: True diff --git a/addons/packages/addons-manager/1.4.0/bundle/.imgpkg/images.yml b/addons/packages/addons-manager/1.4.0/bundle/.imgpkg/images.yml deleted file mode 100644 index d9f6ab59c3..0000000000 --- a/addons/packages/addons-manager/1.4.0/bundle/.imgpkg/images.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -apiVersion: imgpkg.carvel.dev/v1alpha1 -images: -- annotations: - kbld.carvel.dev/id: projects-stg.registry.vmware.com/tkg/sandbox/tanzu_core_addons/tanzu-addons-manager:v1.4.0_vmware.1 - image: projects-stg.registry.vmware.com/tkg/tanzu_core/addons/tanzu-addons-manager@sha256:71c2244514dc2b0df7d177d6f70d0d802a6be5ff822f8caebfdd66f135773c61 -kind: ImagesLock diff --git a/addons/packages/addons-manager/1.4.0/bundle/config/overlays/overlay-addons-manager.yaml b/addons/packages/addons-manager/1.4.0/bundle/config/overlays/overlay-addons-manager.yaml deleted file mode 100644 index 49d0a0e865..0000000000 --- a/addons/packages/addons-manager/1.4.0/bundle/config/overlays/overlay-addons-manager.yaml +++ /dev/null @@ -1,57 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@ if data.values.tanzuAddonsManager.createNamespace: ---- -apiVersion: v1 -kind: Namespace -metadata: - name: #@ data.values.tanzuAddonsManager.namespace -#@ end - -#@overlay/match by=overlay.subset({"kind":"ServiceAccount", "metadata": {"name": "tanzu-addons-manager-sa"}}) ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - namespace: #@ data.values.tanzuAddonsManager.namespace - -#@overlay/match by=overlay.subset({"kind":"ClusterRoleBinding", "metadata": {"name": "tanzu-addons-manager-clusterrolebinding"}}) ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -subjects: -#@overlay/match by=overlay.subset({"kind":"ServiceAccount", "name": "tanzu-addons-manager-sa"}) -- kind: ServiceAccount - name: tanzu-addons-manager-sa - namespace: #@ data.values.tanzuAddonsManager.namespace - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "tanzu-addons-controller-manager"}}) ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - namespace: #@ data.values.tanzuAddonsManager.namespace -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "tanzu-addons-controller"}) - - args: - #@overlay/match by=lambda index, left, right: "--health-addr=" in left, expects=1 - - #@ "--health-addr=:{}".format(data.values.tanzuAddonsManager.deployment.healthzPort) - ports: - #@overlay/match by="name" - - name: healthz - containerPort: #@ data.values.tanzuAddonsManager.deployment.healthzPort - #@ if/end data.values.tanzuAddonsManager.deployment.hostNetwork: - #@overlay/match missing_ok=True - hostNetwork: true - #@ if/end data.values.tanzuAddonsManager.deployment.priorityClassName: - #@overlay/match missing_ok=True - priorityClassName: #@ data.values.tanzuAddonsManager.deployment.priorityClassName - #@ if hasattr(data.values.tanzuAddonsManager.deployment, 'tolerations') and data.values.tanzuAddonsManager.deployment.tolerations: - #@overlay/match missing_ok=True - tolerations: #@ data.values.tanzuAddonsManager.deployment.tolerations - #@ end - diff --git a/addons/packages/addons-manager/1.4.0/bundle/config/upstream/addons-manager.yaml b/addons/packages/addons-manager/1.4.0/bundle/config/upstream/addons-manager.yaml deleted file mode 100644 index db53b31dd6..0000000000 --- a/addons/packages/addons-manager/1.4.0/bundle/config/upstream/addons-manager.yaml +++ /dev/null @@ -1,172 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: tanzu-addons-manager - name: tanzu-addons-manager-sa - namespace: tanzu-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-addons-manager-clusterrole -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - - tanzukubernetesreleases/status - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - kubeadmcontrolplanes - - kubeadmcontrolplanes/status - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch -- apiGroups: - - kappctrl.k14s.io - resources: - - apps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - packaging.carvel.dev - resources: - - packagerepositories - - packagerepositories/status - verbs: - - get - - list - - watch - - create - - update - - patch -- apiGroups: - - packaging.carvel.dev - resources: - - packageinstalls - - packageinstalls/status - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-addons-manager-clusterrolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-addons-manager-clusterrole -subjects: -- kind: ServiceAccount - name: tanzu-addons-manager-sa - namespace: tanzu-system ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: tanzu-addons-manager - name: tanzu-addons-controller-manager - namespace: tanzu-system -spec: - replicas: 1 - selector: - matchLabels: - app: tanzu-addons-manager - template: - metadata: - labels: - app: tanzu-addons-manager - spec: - containers: - - args: - - --metrics-addr=0 - - --enable-leader-election=false - - --health-addr=:18316 - image: projects-stg.registry.vmware.com/tkg/sandbox/tanzu_core_addons/tanzu-addons-manager:v1.3.1_vmware.1 - imagePullPolicy: IfNotPresent - name: tanzu-addons-controller - resources: - limits: - cpu: 100m - memory: 500Mi - requests: - cpu: 100m - memory: 40Mi - ports: - - containerPort: 18316 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - livenessProbe: - httpGet: - path: /healthz - port: healthz - startupProbe: - httpGet: - path: /healthz - port: healthz - failureThreshold: 60 - periodSeconds: 10 - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - serviceAccount: tanzu-addons-manager-sa - terminationGracePeriodSeconds: 10 diff --git a/addons/packages/addons-manager/1.4.0/bundle/config/values.yaml b/addons/packages/addons-manager/1.4.0/bundle/config/values.yaml deleted file mode 100644 index 3c07adbde5..0000000000 --- a/addons/packages/addons-manager/1.4.0/bundle/config/values.yaml +++ /dev/null @@ -1,12 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True - ---- -tanzuAddonsManager: - namespace: tanzu-system - createNamespace: true - deployment: - hostNetwork: false - priorityClassName: null - tolerations: [] - healthzPort: 18316 diff --git a/addons/packages/addons-manager/1.4.0/package.yaml b/addons/packages/addons-manager/1.4.0/package.yaml deleted file mode 100644 index c4d444ed7c..0000000000 --- a/addons/packages/addons-manager/1.4.0/package.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: addons-manager.tanzu.vmware.com.1.4.0 - namespace: addons-manager -spec: - refName: addons-manager.tanzu.vmware.com - version: 1.4.0 - releaseNotes: "addons-manager 1.4.0" - licenses: - - "UNKNOWN" - template: - spec: - fetch: - - imgpkgBundle: - image: projects.registry.vmware.com/tkg/packages/core/addons-manager@sha256:31c3f27350b693fec042ddead8906c119870ec8a876b9ee3e698a8d5d9c6d8b7 - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/addons/packages/addons-manager/metadata.yaml b/addons/packages/addons-manager/metadata.yaml deleted file mode 100644 index 312082f3f5..0000000000 --- a/addons/packages/addons-manager/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: addons-manager.tanzu.vmware.com - namespace: addons-manager -spec: - displayName: "tanzu-addons-manager" - longDescription: "This package provides TKG addons lifecycle management capabilities." - shortDescription: "This package provides TKG addons lifecycle management capabilities." - providerName: VMware - maintainers: - - name: Lucheng Bao - categories: - - "addons-lifecycle-management" diff --git a/addons/pkg/buildinfo/buildvar.go b/addons/pkg/buildinfo/buildvar.go deleted file mode 100644 index 10455904c3..0000000000 --- a/addons/pkg/buildinfo/buildvar.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package buildinfo holds global vars set at build time to provide information about the build. -// This package SHOULD NOT import other packages -- to avoid dependency cycles. -package buildinfo - -// This package provides vars that are set at build time for the addons manager binary. This has been copied from -// tanzu-framework/pkg/v1/buildinfo to avoid dependency on tanzu-framework go module - -var ( - // Date is the date the binary was built. - // Set by go build -ldflags "-X" flag - Date string - - // SHA is the git commit SHA the binary was built with. - // Set by go build -ldflags "-X" flag - SHA string - - // Version is the version the binary was built with. - // Set by go build -ldflags "-X" flag - Version string -) diff --git a/addons/pkg/config/config.go b/addons/pkg/config/config.go deleted file mode 100644 index 4f17829dcf..0000000000 --- a/addons/pkg/config/config.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package config implements configuration settings information. -package config - -import ( - "time" -) - -// AddonControllerConfig contains addons controller configuration information. -type AddonControllerConfig struct { - AppSyncPeriod time.Duration - AppWaitTimeout time.Duration - AddonNamespace string - AddonServiceAccount string - AddonClusterRole string - AddonClusterRoleBinding string - AddonImagePullPolicy string - CorePackageRepoName string - FeatureGateClusterBootstrap bool -} - -// ClusterBootstrapControllerConfig contains configuration information related to ClusterBootstrap -type ClusterBootstrapControllerConfig struct { - IPFamilyClusterClassVarName string - // The length of time to wait before kapp-controller's reconciliation - PkgiSyncPeriod time.Duration - // ServiceAccount name that will be used by kapp-controller to install underlying package contents - PkgiServiceAccount string - // The name that will be used to create ClusterRole contains all required rules for PkgiServiceAccount - PkgiClusterRole string - // The name of ClusterRoleBinding that will be used to bind PkgiClusterRole and PkgiServiceAccount - PkgiClusterRoleBinding string - // The namespace where the bootstrap objects will be created, i.e., tkg-system - SystemNamespace string - // The maximum amount of time that will be spent trying to clean resources before cluster deletion is allowed to proceed. - ClusterDeleteTimeout time.Duration -} - -// PackageInstallStatusControllerConfig contains configuration information related to PackageInstallStatus -type PackageInstallStatusControllerConfig struct { - // The namespace where the bootstrap objects will be created, i.e., tkg-system - SystemNamespace string -} - -// ConfigControllerConfig contains common configuration information of config controller -type ConfigControllerConfig struct { - // The namespace where the template config objects will be created, i.e., tkg-system - SystemNamespace string -} - -// AntreaConfigControllerConfig contains configuration information of AntreaConfig controller -type AntreaConfigControllerConfig struct { - ConfigControllerConfig -} - -// CalicoConfigControllerConfig contains configuration information of CalicoConfig controller -type CalicoConfigControllerConfig struct { - ConfigControllerConfig -} - -// KappControllerConfigControllerConfig contains configuration information of KappControllerConfig controller -type KappControllerConfigControllerConfig struct { - ConfigControllerConfig -} - -// VSphereCPIConfigControllerConfig contains configuration information of VSphereCPIConfig controller -type VSphereCPIConfigControllerConfig struct { - ConfigControllerConfig -} - -// OracleCPIConfigControllerConfig contains configuration information of OracleCPIConfig controller -type OracleCPIConfigControllerConfig struct { - ConfigControllerConfig -} - -// VSphereCSIConfigControllerConfig contains configuration information of VSphereCSIConfig controller -type VSphereCSIConfigControllerConfig struct { - ConfigControllerConfig -} - -// AzureDiskCSIConfigControllerConfig contains configuration information of AzureDiskCSIConfigControllerConfig controller -type AzureDiskCSIConfigControllerConfig struct { - ConfigControllerConfig -} - -// AwsEbsCSIConfigControllerConfig contains configuration information of VSphereCSIConfig controller -type AwsEbsCSIConfigControllerConfig struct { - ConfigControllerConfig -} - -// AzureFileCSIConfigControllerConfig contains configuration information of AzureFileCSIConfig controller -type AzureFileCSIConfigControllerConfig struct { - ConfigControllerConfig -} - -// KubevipCPIConfigControllerConfig contains configuration information of KubevipLBConfig controller -type KubevipCPIConfigControllerConfig struct { - ConfigControllerConfig -} diff --git a/addons/pkg/constants/constants.go b/addons/pkg/constants/constants.go deleted file mode 100644 index 34cc4bdf7f..0000000000 --- a/addons/pkg/constants/constants.go +++ /dev/null @@ -1,413 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package constants defines various constants used in the code. -package constants - -import ( - "reflect" - "time" - - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - - cniv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha1" - cniv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha2" - cpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -const ( - /* Addon constants section */ - - // AddonControllerManagerLeaderElectionResourceName is the name of the resource that leader election of - // addons controller manager will use for holding the leader lock. - AddonControllerManagerLeaderElectionResourceName = "tanzu-addons-manager-leader-lock" - - // CalicoAddonName is name of the Calico addon - CalicoAddonName = "calico" - - // CalicoDefaultRefName is default refname for Calico addon - CalicoDefaultRefName = CalicoAddonName + ".tanzu.vmware.com" - - // CPIAddonName is name of the cloud-provider-vsphere addon - CPIAddonName = "vsphere-cpi" - - // CPIDefaultRefName is default refname for cloud-provider-vsphere addon addon - CPIDefaultRefName = CPIAddonName + ".tanzu.vmware.com" - - // OracleCPIAddonName is name of the Oracle CPI & CSI addon - OracleCPIAddonName = "oracle-cpi" - - // OracleCPIDefaultRefName is default refname for cloud-provider-oracle addon addon - OracleCPIDefaultRefName = OracleCPIAddonName + ".tanzu.vmware.com" - - // PVCSIAddonName is name of the vsphere-pv-csi addon - PVCSIAddonName = "vsphere-pv-csi" - - // CSIAddonName is name of the vsphere-csi addon - CSIAddonName = "vsphere-csi" - - // CSIDefaultRefName is default refname for vsphere-csi addon - CSIDefaultRefName = CSIAddonName + ".tanzu.vmware.com" - - // AzureDiskCSIAddonName is name of the azure-disk-csi addon - AzureDiskCSIAddonName = "azuredisk-csi" - - // AwsEbsCSIAddonName is name of the aws-ebs-csi addon - AwsEbsCSIAddonName = "aws-ebs-csi" - // AzureFileCSIAddonName is name of the azurefile-csi addon - AzureFileCSIAddonName = "azurefile-csi" - - // KubevipCloudProvider is name of the kube-vip-cloud-provider addon - KubevipCloudProviderAddonName = "kube-vip-cloud-provider" - - // TKGBomNamespace is the TKG add on BOM namespace. - TKGBomNamespace = "tkr-system" - - // TKGBomNamespaceClassyClusters is the TKG add on BOM namespace for ClusterClass or - // ClusterClass capable management clusters. - TKGBomNamespaceClassyClusters = "tkg-system" - - // TKRLabel is the TKR label. - TKRLabel = "tanzuKubernetesRelease" - - // TKGVersionLabel is the TKG version label. - TKGVersionLabel = "tkg.tanzu.vmware.com/version" - - // TKRLabelClassyClusters is the TKR label for the clusters created using cluster-class - TKRLabelClassyClusters = "run.tanzu.vmware.com/tkr" - - // TKRLabelLegacyClusters is the TKR label for legacy clusters - TKRLabelLegacyClusters = "run.tanzu.vmware.com/legacy-tkr" - - // TKGAnnotationTemplateConfig is the TKG annotation for addon config CRs used by ClusterBootstrapTemplate - TKGAnnotationTemplateConfig = "tkg.tanzu.vmware.com/template-config" - - // TKRBomContent is the TKR BOM content. - TKRBomContent = "bomContent" - - // TKGBomContent is the TKG BOM content. - TKGBomContent = "bom.yaml" - - // ClusterMetadataNamespace is the namespace for ClusterMetadata - ClusterMetadataNamespace = "tkg-system-public" - - // TkgBomConfigMapName is the name of TkgBomConfigMap - TkgBomConfigMapName = "tkg-bom" - - // TkgMetadataConfigMapName is the name of TkgMetadataConfigMap - TkgMetadataConfigMapName = "tkg-metadata" - - // ClusterMetadataNamespaceRoleName is the role name of ClusterMetadata - ClusterMetadataNamespaceRoleName = "tkg-metadata-reader" - - // ClusterMetadataRolebindingSubjectName is the subjectName of ClusterMetadataRolebinding - ClusterMetadataRolebindingSubjectName = "system:authenticated" - - // TKGCompatibility is the TKG compatibility content. - TKGCompatibility = "compatibility" - - // TKRConfigmapName is the name of TKR config map - TKRConfigmapName = "tkr-controller-config" - - // TKRRepoKey is the key for image repository in TKR config map data. - TKRRepoKey = "imageRepository" - - // TKGPackageReconcilerKey is the log key for "name". - TKGPackageReconcilerKey = "Package" - - // TKGAppReconcilerKey is the log key for "name". - TKGAppReconcilerKey = "App" - - // TKGDataValueFormatString is required annotations for YTT data value file - TKGDataValueFormatString = "#@data/values\n#@overlay/match-child-defaults missing_ok=True\n---\n" - - // TKGDataValueFileName is the default name of YTT data value file - TKGDataValueFileName = "values.yaml" - - // TKGSDataValueFileName is the default name of YTT data value file for TKR info - TKGSDataValueFileName = "tkgs-values.yaml" - - // TKGCorePackageRepositoryComponentName is the name of component that includes the package and repository images - TKGCorePackageRepositoryComponentName = "tkg-core-packages" - - // TKGCorePackageRepositoryImageName is the name of core package repository image - TKGCorePackageRepositoryImageName = "tanzuCorePackageRepositoryImage" - - // TKGSDeploymentUpdateStrategy is the update strategy used by TKGS deployments - TKGSDeploymentUpdateStrategy = "RollingUpdate" - - // TKGSDeploymentUpdateMaxSurge is the MaxSurge used by TKGS deployments rollingUpdate - TKGSDeploymentUpdateMaxSurge = 1 - - // TKGSDeploymentUpdateMaxUnavailable is the MaxUnavailableused by TKGS deployments rollingUpdate - TKGSDeploymentUpdateMaxUnavailable = 0 - - // TKGSDaemonsetUpdateStrategy is the update strategy used by TKGS daemonsets - TKGSDaemonsetUpdateStrategy = "OnDelete" - - /* log key section */ - - // NameLogKey is the log key for "name". - NameLogKey = "name" - - // NamespaceLogKey is the log key for "namespace". - NamespaceLogKey = "namespace" - - // AddonSecretNameLogKey is the log key for "addon-secret-name". - AddonSecretNameLogKey = "addon-secret-name" - - // AddonSecretNamespaceLogKey is the log key for "addon-secret-ns" - AddonSecretNamespaceLogKey = "addon-secret-ns" // nolint:gosec - - // AddonNameLogKey is the log key for "addon-name" - AddonNameLogKey = "addon-name" - - // ImageNameLogKey is the log key for "image-name". - ImageNameLogKey = "image-name" - - // ImageURLLogKey is the log key for "image-url". - ImageURLLogKey = "image-url" - - // ComponentNameLogKey is the log key for "component-name". - ComponentNameLogKey = "component-name" - - // KCPNameLogKey is the log key for "kcp-name" - KCPNameLogKey = "kcp-name" - - // KCPNamespaceLogKey is the log key for "kcp-ns" - KCPNamespaceLogKey = "kcp-ns" - - // TKRNameLogKey is the log key for "tkr-name" - TKRNameLogKey = "tkr-name" - - // ClusterNameLogKey is the log key for "cluster-name" - ClusterNameLogKey = "cluster-name" - - // ClusterNamespaceLogKey is the log key for "cluster-ns" - ClusterNamespaceLogKey = "cluster-ns" - - // BOMNameLogKey is the log key for "bom-name" - BOMNameLogKey = "bom-name" - - // BOMNamespaceLogKey is the log key for "bom-ns" - BOMNamespaceLogKey = "bom-ns" - - // PackageRepositoryLogKey is the log key for "core-package-repository" - PackageRepositoryLogKey = "core-package-repository" - - // AddonControllerName is name of addon-controller - AddonControllerName = "addon-controller" - - // CRDWaitPollInterval is poll interval for checking server resources - CRDWaitPollInterval = time.Second * 5 - - // CRDWaitPollTimeout is poll timeout for checking server resources - CRDWaitPollTimeout = time.Minute * 10 - - // ClusterBootstrapNameLogKey is the log key for "ClusterBootstrapNameLogKey" - ClusterBootstrapNameLogKey = "clusterbootstrap-name" - - // TKGSystemNS is the TKG system namespace. - TKGSystemNS = "tkg-system" - - // TKGbomMetadataConfigmapName is the confimap of bom-metadata - TKGbomMetadataConfigmapName = "bom-metadata" - - // DiscoveryCacheInvalidateInterval is the interval for invalidating cache - DiscoveryCacheInvalidateInterval = time.Minute * 10 - - // AntreaAddonName is the name of Antrea Addon Controller - AntreaAddonName = "antrea" - - // AntreaDefaultRefName is default refname for Antrea addon - AntreaDefaultRefName = AntreaAddonName + ".tanzu.vmware.com" - - // KappControllerAddonName is the addon name of Kapp Controller - KappControllerAddonName = "kapp-controller" - - // KappControllerDefaultRefName is default refname for Kapp Controller addon - KappControllerDefaultRefName = KappControllerAddonName + ".tanzu.vmware.com" - - // SecretNameLogKey is the log key for Secrets - SecretNameLogKey = "secret-name" - - // ClusterBootstrapManagedSecret is the name for the secrets that are managed by ClusterBootstrapController - ClusterBootstrapManagedSecret = "clusterbootstrap-secret" - - // DefaultIPFamilyClusterClassVarName is the default cluster variable name for ip family - DefaultIPFamilyClusterClassVarName = "tkg.tanzu.vmware.com/tkg-ip-family" - - // PackageInstallServiceAccount is service account name used for PackageInstall - PackageInstallServiceAccount = "tanzu-cluster-bootstrap-sa" - - // PackageInstallClusterRole is cluster role name used for PackageInstall - PackageInstallClusterRole = "tanzu-cluster-bootstrap-clusterrole" - - // PackageInstallClusterRoleBinding is cluster role binding name used for PackageInstall - PackageInstallClusterRoleBinding = "tanzu-cluster-bootstrap-clusterrolebinding" - - // PackageInstallSyncPeriod is the sync period for kapp-controller to periodically reconcile a PackageInstall - PackageInstallSyncPeriod = time.Minute * 10 - - // RequeueAfterDuration determines the duration after which the Controller should requeue the reconcile key - RequeueAfterDuration = time.Second * 10 - - // WebhookCertDir is the directory where the certificate and key are stored for webhook server TLS handshake - WebhookCertDir = "/tmp/k8s-webhook-server/serving-certs" - - // WebhookCertManagementFrequency is how often the certificates for webhook server TLS are managed - WebhookCertManagementFrequency = time.Minute * 60 - - // WebhookCertLifeTime is how long the webhook server TLS certificates are good for - WebhookCertLifeTime = time.Hour * 24 * 7 - - // WebhookServiceName is the name of the k8s service that serves the admission requests - WebhookServiceName = "tanzu-addons-manager-webhook-service" - - // WebhookScrtName is the name of secret that holds certificates and key for webhook service - WebhookScrtName = "webhook-tls" - - // AddonWebhookLabelKey is the key for the label for addon admission webhooks - AddonWebhookLabelKey = "tkg.tanzu.vmware.com/addon-webhooks" - - // AddonWebhookLabelValue is the value for the label for addon admission webhooks - AddonWebhookLabelValue = "addon-webhooks" - - // LocalObjectRefSuffix is the suffix of a field within the provider's CR. This suffix indicates that the field is a - // K8S typed local object reference - LocalObjectRefSuffix = "LocalObjRef" - - // AddCBMissingFieldsAnnotationKey is the annotation key used by ClusterBootstrap webhook to implement its defaulting - // logic - AddCBMissingFieldsAnnotationKey = "tkg.tanzu.vmware.com/add-missing-fields-from-tkr" - - // UnmanagedCNI is the label for clusters that use unmanaged CNI - UnmanagedCNI = "tkg.tanzu.vmware.com/unmanaged-cni" - - // VsphereAntreaConfigProviderServiceAccountAggregatedClusterRole is the name of ClusterRole created by controllers that use ProviderServiceAccount - VsphereAntreaConfigProviderServiceAccountAggregatedClusterRole = "addons-vsphere-antreaConfig-providerserviceaccount-aggregatedrole" - - // VsphereCPIProviderServiceAccountAggregatedClusterRole is the name of ClusterRole created by controllers that use ProviderServiceAccount - VsphereCPIProviderServiceAccountAggregatedClusterRole = "addons-vsphere-cpi-providerserviceaccount-aggregatedrole" - - // VsphereCSIProviderServiceAccountAggregatedClusterRole is the name of ClusterRole created by controllers that use ProviderServiceAccount - VsphereCSIProviderServiceAccountAggregatedClusterRole = "addons-vsphere-csi-providerserviceaccount-aggregatedrole" - - // CAPVClusterRoleAggregationRuleLabelSelectorKey is the label selector key used by aggregation rule in CAPV ClusterRole - CAPVClusterRoleAggregationRuleLabelSelectorKey = "capv.infrastucture.cluster.x-k8s.io/aggregate-to-manager" - - // CAPVClusterRoleAggregationRuleLabelSelectorValue is the label selector value used by aggregation rule in CAPV ClusterRole - CAPVClusterRoleAggregationRuleLabelSelectorValue = "true" - - // PackageInstallStatusControllerRateLimitBaseDelay is the base delay for rate limiting error requeues in PackageInstallStatusController - PackageInstallStatusControllerRateLimitBaseDelay = time.Second * 10 - - // PackageInstallStatusControllerRateLimitMaxDelay is the maximum delay for rate limiting error requeues in PackageInstallStatusController - PackageInstallStatusControllerRateLimitMaxDelay = time.Minute * 30 - - // ClusterPauseLabel is the label on the Cluster Object to indicate the cluster is paused by TKG - ClusterPauseLabel = "tkg.tanzu.vmware.com/paused" - - // CustomClusterBootstrap is the annotation in the cluster object to indicate that a custom ClusterBootstrap object will be provided - CustomClusterBootstrap = "tkg.tanzu.vmware.com/custom-clusterbootstrap" - - // ManagementClusterRoleLabel is the management cluster role label - // It indicates the cluster object represents a mgmt cluster - ManagementClusterRoleLabel = "cluster-role.tkg.tanzu.vmware.com/management" - - // InfrastructureProviderVSphere is the key for vsphere infrastructure - InfrastructureProviderVSphere = "vsphere" - - // InfrastructureProviderTkgs is the key for vsphere infrastructure with supervisor - InfrastructureProviderTkgs = "tkgs" - - // InfrastructureProviderAWS is the key for aws infrastructure - InfrastructureProviderAWS = "aws" - - // InfrastructureProviderAzure is the key for azure infrastructure - InfrastructureProviderAzure = "azure" - - // InfrastructureProviderDocker is the key for docker infrastructure - InfrastructureProviderDocker = "docker" - - // InfrastructureProviderOCI is the key for Oracle Cloud Infrastructure - InfrastructureProviderOCI = "oci" - - // InfrastructureRefVSphere is the vSphere infrastructure - InfrastructureRefVSphere = "VSphereCluster" - - // InfrastructureRefVSphereMachineTemplate is the vSphere infrastructure - InfrastructureRefVSphereMachineTemplate = "VSphereMachineTemplate" - - // InfrastructureRefAWS is the AWS infrastructure - InfrastructureRefAWS = "AWSCluster" - - // InfrastructureRefAzure is the Azure infrastructure - InfrastructureRefAzure = "AzureCluster" - - // InfrastructureRefDocker is the docker infrastructure - InfrastructureRefDocker = "DockerCluster" - - // InfrastructureRefOCI is the Oracle Cloud infrastructure - InfrastructureRefOCI = "OCICluster" - - // CAPVClusterSelectorKey is the selector key used by capv - CAPVClusterSelectorKey = "capv.vmware.com/cluster.name" - - // KindTanzuKubernetesCluster is the owner name of cluster - KindTanzuKubernetesCluster = "TanzuKubernetesCluster" - - // SkipDeletePackageInstallAnnotation is the annotation that contains a list of comma separated packageInstalls to skip - // for example - // "run.tanzu.vmware.com/skip-packageinstall-deletion": "vsphere-cpi,antrea,load-balancer-and-ingress-service" - SkipDeletePackageInstallAnnotation = "run.tanzu.vmware.com/skip-packageinstall-deletion" - - // TKGPlanAnnotation is the annotation that contains the cluster plan - // for example - // "tkg/plan": "dev" - TKGPlanAnnotation = "tkg/plan" - - // TKGDevPlan is the tkg plan name, mean that that cluster is in a dev env - TKGDevPlan = "dev" - // TKGDevCCPan is the tkg plan name, mean that that cluster is in a dev env - TKGDevCCPan = "devcc" - - TKRAnnotationKey = "run.tanzu.vmware.com/tkr-spec" -) - -var ( - // ClusterKind is the Kind for cluster-api Cluster object - ClusterKind = reflect.TypeOf(clusterapiv1beta1.Cluster{}).Name() - - // AntreaConfigKind is the Kind for cni AntreaConfig object - AntreaConfigKind = reflect.TypeOf(cniv1alpha2.AntreaConfig{}).Name() - - // CalicoConfigKind is the Kind for cni CalicoConfig object - CalicoConfigKind = reflect.TypeOf(cniv1alpha1.CalicoConfig{}).Name() - - // VSphereCSIConfigKind is the Kind for csi VSphereCSIConfig object - VSphereCSIConfigKind = reflect.TypeOf(csiv1alpha1.VSphereCSIConfig{}).Name() - - // AzureFileCSIConfigKind is the Kind for csi AzureFileCSIConfig object - AzureFileCSIConfigKind = reflect.TypeOf(csiv1alpha1.AzureFileCSIConfig{}).Name() - - // VSphereCPIConfigKind is the Kind for cpi VSphereCPIConfig object - VSphereCPIConfigKind = reflect.TypeOf(cpiv1alpha1.VSphereCPIConfig{}).Name() - - // OracleCPIConfigKind is the Kind for cpi OracleCPIConfig object - OracleCPIConfigKind = reflect.TypeOf(cpiv1alpha1.OracleCPIConfig{}).Name() - - // KappControllerConfigKind is the Kind for KappControllerConfig object - KappControllerConfigKind = reflect.TypeOf(runv1alpha3.KappControllerConfig{}).Name() - - // AwsEbsCSIConfigKind is the Kind for csi AwsEbsCSIConfig object - AwsEbsCSIConfigKind = reflect.TypeOf(csiv1alpha1.AwsEbsCSIConfig{}).Name() - - // KubevipCPIConfigKind is the Kind for KubevipCPIConfigConfig object - KubevipCPIConfigKind = reflect.TypeOf(cpiv1alpha1.KubevipCPIConfig{}).Name() - - // AzureDiskCSIConfigKind is the Kind for AzureDiskCSIConfig object - AzureDiskCSIConfigKind = reflect.TypeOf(csiv1alpha1.AzureDiskCSIConfig{}).Name() -) diff --git a/addons/pkg/crdwait/crd_wait.go b/addons/pkg/crdwait/crd_wait.go deleted file mode 100644 index 6ec9efe546..0000000000 --- a/addons/pkg/crdwait/crd_wait.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package crdwait provides an API to wait for CRDs to be available in a kubernetes api-server -package crdwait - -import ( - "context" - "time" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/kubernetes" - typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1" - "k8s.io/client-go/tools/record" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// CRDWaiter waits for api-resources and emits logs and events for missing resources -type CRDWaiter struct { - Ctx context.Context - ClientSet kubernetes.Interface - APIReader client.Reader - Logger logr.Logger - Scheme *runtime.Scheme - PollInterval time.Duration - PollTimeout time.Duration - eventRecorder record.EventRecorder -} - -// WaitForCRDs checks if CRDs are available by polling for resources. -func (c *CRDWaiter) WaitForCRDs(crds map[schema.GroupVersion]*sets.String, object runtime.Object, controllerName string) error { - eventRecorder, eventBroadcaster := c.getEventRecorder(c.ClientSet, controllerName) - go func() { - <-c.Ctx.Done() - eventBroadcaster.Shutdown() - }() - - poller := func() (done bool, err error) { - // Create new clientset for every invocation to avoid caching of resources - allFound := true - for gv, resources := range crds { - // All resources found, do nothing - if resources.Len() == 0 { - delete(crds, gv) - continue - } - groupVersion := gv.String() - for _, resource := range resources.List() { - // Get the Resources for this GroupVersion - - res := gv.WithResource(resource) - crd := unstructured.Unstructured{} - crd.SetGroupVersionKind(apiextensions.SchemeGroupVersion.WithKind("CustomResourceDefinition")) - name := res.GroupResource().String() - err := c.APIReader.Get(c.Ctx, - client.ObjectKey{Name: name}, - &crd) - - if apierrors.IsNotFound(err) { - c.Logger.Info("CRD not available yet", "name", name) - eventRecorder.Eventf(object, corev1.EventTypeWarning, - "Polling for CRD", "The CRD '%s' is not available yet", name) - return false, nil - } - if err != nil { - c.Logger.Error(err, "error retrieving CRD", "name", name) - eventRecorder.Eventf(object, corev1.EventTypeWarning, - "Error retrieving CRD %s", "Error trying to read CRD '%s'. Exiting", name) - return false, err - } - resources.Delete(resource) - } - - // Still waiting on some resources in this group version - if resources.Len() != 0 { - allFound = false - c.Logger.Info("resources are not available yet", "api-resources", resources.List(), "GroupVersion", groupVersion) - eventRecorder.Eventf(object, corev1.EventTypeWarning, - "Polling for api-resources", "The api-resources '%s' in GroupVersion '%s' are not available yet", resources.List(), groupVersion) - } - } - return allFound, nil - } - return wait.PollImmediate(c.PollInterval, c.PollTimeout, poller) -} - -func (c *CRDWaiter) getEventRecorder(clientSet kubernetes.Interface, component string) (record.EventRecorder, record.EventBroadcaster) { - eventBroadcaster := record.NewBroadcaster() - eventBroadcaster.StartRecordingToSink( - &typedcorev1.EventSinkImpl{ - Interface: clientSet.CoreV1().Events(corev1.NamespaceAll)}) - - eventBroadcaster.StartEventWatcher( - func(e *corev1.Event) { - c.Logger.V(1).Info(e.Type, "object", e.InvolvedObject, "reason", e.Reason, "message", e.Message) - }) - var recorder record.EventRecorder - if c.eventRecorder == nil { - recorder = eventBroadcaster.NewRecorder( - c.Scheme, - corev1.EventSource{Component: component}) - } else { - recorder = c.eventRecorder - } - - return recorder, eventBroadcaster -} diff --git a/addons/pkg/crdwait/crd_wait_test.go b/addons/pkg/crdwait/crd_wait_test.go deleted file mode 100644 index 59b950a981..0000000000 --- a/addons/pkg/crdwait/crd_wait_test.go +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -//go:build !race - -package crdwait - -import ( - "fmt" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/kubernetes/fake" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - "k8s.io/client-go/testing" - "k8s.io/client-go/tools/record" - "k8s.io/klog/v2/klogr" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - controlplanev1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - ctrlruntimefake "sigs.k8s.io/controller-runtime/pkg/client/fake" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - runtanzuv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" -) - -var fakeClientSet *fake.Clientset -var fakeApiReader client.Reader - -var _ = Describe("WaitForCRDs", func() { - - var scheme *runtime.Scheme - var crdWaiter CRDWaiter - var fakeRecorder *record.FakeRecorder - scheme = runtime.NewScheme() - err := clientgoscheme.AddToScheme(scheme) - Expect(err).ToNot(HaveOccurred()) - err = apiextensionsv1.AddToScheme(scheme) - Expect(err).ToNot(HaveOccurred()) - pod := &corev1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - Name: "foo", - Namespace: "default", - }} - - BeforeEach(func() { - fakeClientSet = fake.NewSimpleClientset(pod) - - initObjs := []client.Object{pod.DeepCopy()} - fakeApiReader := ctrlruntimefake.NewClientBuilder().WithScheme(scheme).WithObjects(initObjs...).Build() - - crdWaiter = CRDWaiter{ - Ctx: ctx, - ClientSet: fakeClientSet, - APIReader: fakeApiReader, - Logger: klogr.New(), - Scheme: scheme, - } - fakeRecorder = record.NewFakeRecorder(50) - crdWaiter.eventRecorder = fakeRecorder - }) - - Context("when resources do not exist ", func() { - It("should fail", func() { - var crds = map[schema.GroupVersion]*sets.String{} - // cluster-api - clusterapiv1alpha3Resources := sets.NewString("clusters") - crds[clusterapiv1beta1.GroupVersion] = &clusterapiv1alpha3Resources - - // tkr - runtanzuv1alpha1Resources := sets.NewString("tanzukubernetesreleases") - crds[runtanzuv1alpha1.GroupVersion] = &runtanzuv1alpha1Resources - - crdWaiter.PollInterval = time.Second - crdWaiter.PollTimeout = time.Second - - Expect(crdWaiter.WaitForCRDs(crds, pod, "foo")).To(HaveOccurred()) - - }) - }) - - Context("when resources exist ", func() { - It("should not fail", func() { - var crds = map[schema.GroupVersion]*sets.String{} - // cluster-api - clusterapiv1alpha3Resources := sets.NewString("clusters") - crds[clusterapiv1beta1.GroupVersion] = &clusterapiv1alpha3Resources - - fakeClientSet.AddReactor("get", "resource", func(action testing.Action) (handled bool, ret runtime.Object, err error) { - return true, nil, nil - }) - - fakeClientSet.Resources = append(fakeClientSet.Resources, - &metav1.APIResourceList{GroupVersion: clusterapiv1beta1.GroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "clusters", Namespaced: true, Kind: "Cluster"}, - }, - }) - crdWaiter.PollInterval = time.Second - crdWaiter.PollTimeout = time.Second - - clusterCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "clusters.cluster.x-k8s.io"}, - Spec: apiextensionsv1.CustomResourceDefinitionSpec{Group: "cluster.x-k8s.io", Versions: []apiextensionsv1.CustomResourceDefinitionVersion{{Name: "v1beta1"}}}} - - initObjs := []client.Object{clusterCRD.DeepCopy(), pod.DeepCopy()} - crdWaiter.APIReader = ctrlruntimefake.NewClientBuilder().WithScheme(scheme).WithObjects(initObjs...).Build() - - Expect(crdWaiter.WaitForCRDs(crds, pod, "foo")).NotTo(HaveOccurred()) - }) - }) - - Context("when addon controller CRDs exist ", func() { - It("should not fail", func() { - fakeClientSet.AddReactor("get", "resource", func(action testing.Action) (handled bool, ret runtime.Object, err error) { - return true, nil, nil - }) - - fakeClientSet.Resources = append(fakeClientSet.Resources, - &metav1.APIResourceList{GroupVersion: clusterapiv1beta1.GroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "clusters", Namespaced: true, Kind: "Cluster"}, - }, - }, - &metav1.APIResourceList{GroupVersion: controlplanev1beta1.GroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "kubeadmcontrolplanes", Namespaced: true, Kind: "KubeadmControlPlane"}, - }, - }, - &metav1.APIResourceList{GroupVersion: runtanzuv1alpha1.GroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "tanzukubernetesreleases", Namespaced: true, Kind: "TanzuKubernetesRelease"}, - }, - }, - &metav1.APIResourceList{GroupVersion: kappctrl.SchemeGroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "apps", Namespaced: true, Kind: "App"}, - }, - }, - &metav1.APIResourceList{GroupVersion: kapppkg.SchemeGroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "packageinstalls", Namespaced: true, Kind: "PackageInstalls"}, - {Name: "packagerepositories", Namespaced: true, Kind: "PackageRepositories"}, - }, - }, - ) - - crdWaiter.PollInterval = time.Second - crdWaiter.PollTimeout = time.Second - - clusterCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "clusters.cluster.x-k8s.io"}, - Spec: apiextensionsv1.CustomResourceDefinitionSpec{Group: "cluster.x-k8s.io", Versions: []apiextensionsv1.CustomResourceDefinitionVersion{{Name: "v1beta1"}}}, - } - - kubeadmcontrolplaneCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "kubeadmcontrolplanes.controlplane.cluster.x-k8s.io"}, - } - - PackageInstallCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "packageinstalls.packaging.carvel.dev"}, - } - - tanzukubernetesreleaseCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "tanzukubernetesreleases.run.tanzu.vmware.com"}, - } - - packagerepositorieCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "packagerepositories.packaging.carvel.dev"}, - } - - appCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "apps.kappctrl.k14s.io"}, - } - - initObjs := []client.Object{ - clusterCRD.DeepCopy(), - kubeadmcontrolplaneCRD.DeepCopy(), - PackageInstallCRD.DeepCopy(), - tanzukubernetesreleaseCRD.DeepCopy(), - packagerepositorieCRD.DeepCopy(), - appCRD.DeepCopy(), - pod.DeepCopy(), - } - crdWaiter.APIReader = ctrlruntimefake.NewClientBuilder().WithScheme(scheme).WithObjects(initObjs...).Build() - - Expect(crdWaiter.WaitForCRDs(getCRDs(), pod, "foo")).NotTo(HaveOccurred()) - }) - }) - - Context("when resources eventually exist ", func() { - It("should not fail", func() { - var crds = map[schema.GroupVersion]*sets.String{} - // cluster-api - clusterapiv1alpha3Resources := sets.NewString("clusters") - crds[clusterapiv1beta1.GroupVersion] = &clusterapiv1alpha3Resources - - fakeClientSet.AddReactor("get", "resource", func(action testing.Action) (handled bool, ret runtime.Object, err error) { - return true, nil, nil - }) - - clusterCRD := &apiextensionsv1.CustomResourceDefinition{ - ObjectMeta: metav1.ObjectMeta{Name: "clusters.cluster.x-k8s.io"}, - Spec: apiextensionsv1.CustomResourceDefinitionSpec{Group: "cluster.x-k8s.io", Versions: []apiextensionsv1.CustomResourceDefinitionVersion{{Name: "v1beta1"}}}, - } - initObjs := []client.Object{clusterCRD.DeepCopy(), pod.DeepCopy()} - client := ctrlruntimefake.NewClientBuilder().WithScheme(scheme).WithObjects(initObjs...).Build() - err = client.Delete(ctx, clusterCRD) - Expect(err).ToNot(HaveOccurred()) - - go func() { - time.Sleep(time.Second * 3) - - fakeClientSet.Resources = append(fakeClientSet.Resources, - &metav1.APIResourceList{GroupVersion: clusterapiv1beta1.GroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "clusters", Namespaced: true, Kind: "Cluster"}, - }, - }) - - err = client.Create(ctx, clusterCRD) - Expect(err).ToNot(HaveOccurred()) - crdWaiter.APIReader = client - }() - - crdWaiter.PollInterval = time.Second - crdWaiter.PollTimeout = time.Second * 10 - - Expect(crdWaiter.WaitForCRDs(crds, pod, "foo")).NotTo(HaveOccurred()) - - }) - }) - - Context("when resources do not exist ", func() { - It("should fail and emit events for missing GroupVersion", func() { - var crds = map[schema.GroupVersion]*sets.String{} - // cluster-api - clusterapiv1alpha3Resources := sets.NewString("clusters") - crds[clusterapiv1beta1.GroupVersion] = &clusterapiv1alpha3Resources - - crdWaiter.PollInterval = time.Second - crdWaiter.PollTimeout = time.Second * 2 - - Expect(crdWaiter.WaitForCRDs(crds, pod, "foo")).To(HaveOccurred()) - Expect(<-fakeRecorder.Events).To(ContainSubstring(fmt.Sprintf("The CRD 'clusters.cluster.x-k8s.io' is not available yet"))) - - }) - }) -}) - -func getFakeClientSet() (kubernetes.Interface, error) { - return fakeClientSet, nil -} - -func getCRDs() map[schema.GroupVersion]*sets.String { - var crds = map[schema.GroupVersion]*sets.String{} - // cluster-api - clusterapiv1alpha3Resources := sets.NewString("clusters") - crds[clusterapiv1beta1.GroupVersion] = &clusterapiv1alpha3Resources - - controlplanev1alpha3Resources := sets.NewString("kubeadmcontrolplanes") - crds[controlplanev1beta1.GroupVersion] = &controlplanev1alpha3Resources - - // tkr - runtanzuv1alpha1Resources := sets.NewString("tanzukubernetesreleases") - crds[runtanzuv1alpha1.GroupVersion] = &runtanzuv1alpha1Resources - - // kapp-controller APIs - kappctrlv1alpha1Resources := sets.NewString("apps") - crds[kappctrl.SchemeGroupVersion] = &kappctrlv1alpha1Resources - - kapppkgv1alpha1Resources := sets.NewString("packageinstalls", "packagerepositories") - crds[kapppkg.SchemeGroupVersion] = &kapppkgv1alpha1Resources - - return crds -} diff --git a/addons/pkg/crdwait/suite_test.go b/addons/pkg/crdwait/suite_test.go deleted file mode 100644 index eb2844b2e4..0000000000 --- a/addons/pkg/crdwait/suite_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package crdwait - -import ( - "context" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/envtest/printer" -) - -func TestConfig(t *testing.T) { - RegisterFailHandler(Fail) - suiteName := "CRDWait Test Suite" - RunSpecsWithDefaultAndCustomReporters(t, suiteName, []Reporter{printer.NewlineReporter{}, printer.NewProwReporter(suiteName)}) -} - -var ( - ctx = ctrl.SetupSignalHandler() - - cancel context.CancelFunc -) - -var _ = BeforeSuite(func(done Done) { - ctx, cancel = context.WithCancel(ctx) - - close(done) -}, 60) - -var _ = AfterSuite(func() { - cancel() -}) diff --git a/addons/pkg/fakeclusterclient/crtclusterclient.go b/addons/pkg/fakeclusterclient/crtclusterclient.go deleted file mode 100644 index 80bda15626..0000000000 --- a/addons/pkg/fakeclusterclient/crtclusterclient.go +++ /dev/null @@ -1,786 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakeclusterclient - -import ( - "context" - "sync" - - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/fakegen" -) - -type CRTClusterClient struct { - CreateStub func(context.Context, client.Object, ...client.CreateOption) error - createMutex sync.RWMutex - createArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.CreateOption - } - createReturns struct { - result1 error - } - createReturnsOnCall map[int]struct { - result1 error - } - DeleteStub func(context.Context, client.Object, ...client.DeleteOption) error - deleteMutex sync.RWMutex - deleteArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteOption - } - deleteReturns struct { - result1 error - } - deleteReturnsOnCall map[int]struct { - result1 error - } - DeleteAllOfStub func(context.Context, client.Object, ...client.DeleteAllOfOption) error - deleteAllOfMutex sync.RWMutex - deleteAllOfArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteAllOfOption - } - deleteAllOfReturns struct { - result1 error - } - deleteAllOfReturnsOnCall map[int]struct { - result1 error - } - GetStub func(context.Context, types.NamespacedName, client.Object) error - getMutex sync.RWMutex - getArgsForCall []struct { - arg1 context.Context - arg2 types.NamespacedName - arg3 client.Object - } - getReturns struct { - result1 error - } - getReturnsOnCall map[int]struct { - result1 error - } - ListStub func(context.Context, client.ObjectList, ...client.ListOption) error - listMutex sync.RWMutex - listArgsForCall []struct { - arg1 context.Context - arg2 client.ObjectList - arg3 []client.ListOption - } - listReturns struct { - result1 error - } - listReturnsOnCall map[int]struct { - result1 error - } - PatchStub func(context.Context, client.Object, client.Patch, ...client.PatchOption) error - patchMutex sync.RWMutex - patchArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 client.Patch - arg4 []client.PatchOption - } - patchReturns struct { - result1 error - } - patchReturnsOnCall map[int]struct { - result1 error - } - RESTMapperStub func() meta.RESTMapper - rESTMapperMutex sync.RWMutex - rESTMapperArgsForCall []struct { - } - rESTMapperReturns struct { - result1 meta.RESTMapper - } - rESTMapperReturnsOnCall map[int]struct { - result1 meta.RESTMapper - } - SchemeStub func() *runtime.Scheme - schemeMutex sync.RWMutex - schemeArgsForCall []struct { - } - schemeReturns struct { - result1 *runtime.Scheme - } - schemeReturnsOnCall map[int]struct { - result1 *runtime.Scheme - } - StatusStub func() client.StatusWriter - statusMutex sync.RWMutex - statusArgsForCall []struct { - } - statusReturns struct { - result1 client.StatusWriter - } - statusReturnsOnCall map[int]struct { - result1 client.StatusWriter - } - UpdateStub func(context.Context, client.Object, ...client.UpdateOption) error - updateMutex sync.RWMutex - updateArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.UpdateOption - } - updateReturns struct { - result1 error - } - updateReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *CRTClusterClient) Create(arg1 context.Context, arg2 client.Object, arg3 ...client.CreateOption) error { - fake.createMutex.Lock() - ret, specificReturn := fake.createReturnsOnCall[len(fake.createArgsForCall)] - fake.createArgsForCall = append(fake.createArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.CreateOption - }{arg1, arg2, arg3}) - stub := fake.CreateStub - fakeReturns := fake.createReturns - fake.recordInvocation("Create", []interface{}{arg1, arg2, arg3}) - fake.createMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) CreateCallCount() int { - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - return len(fake.createArgsForCall) -} - -func (fake *CRTClusterClient) CreateCalls(stub func(context.Context, client.Object, ...client.CreateOption) error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = stub -} - -func (fake *CRTClusterClient) CreateArgsForCall(i int) (context.Context, client.Object, []client.CreateOption) { - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - argsForCall := fake.createArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) CreateReturns(result1 error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = nil - fake.createReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) CreateReturnsOnCall(i int, result1 error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = nil - if fake.createReturnsOnCall == nil { - fake.createReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.createReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) Delete(arg1 context.Context, arg2 client.Object, arg3 ...client.DeleteOption) error { - fake.deleteMutex.Lock() - ret, specificReturn := fake.deleteReturnsOnCall[len(fake.deleteArgsForCall)] - fake.deleteArgsForCall = append(fake.deleteArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteOption - }{arg1, arg2, arg3}) - stub := fake.DeleteStub - fakeReturns := fake.deleteReturns - fake.recordInvocation("Delete", []interface{}{arg1, arg2, arg3}) - fake.deleteMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) DeleteCallCount() int { - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - return len(fake.deleteArgsForCall) -} - -func (fake *CRTClusterClient) DeleteCalls(stub func(context.Context, client.Object, ...client.DeleteOption) error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = stub -} - -func (fake *CRTClusterClient) DeleteArgsForCall(i int) (context.Context, client.Object, []client.DeleteOption) { - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - argsForCall := fake.deleteArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) DeleteReturns(result1 error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = nil - fake.deleteReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) DeleteReturnsOnCall(i int, result1 error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = nil - if fake.deleteReturnsOnCall == nil { - fake.deleteReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) DeleteAllOf(arg1 context.Context, arg2 client.Object, arg3 ...client.DeleteAllOfOption) error { - fake.deleteAllOfMutex.Lock() - ret, specificReturn := fake.deleteAllOfReturnsOnCall[len(fake.deleteAllOfArgsForCall)] - fake.deleteAllOfArgsForCall = append(fake.deleteAllOfArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteAllOfOption - }{arg1, arg2, arg3}) - stub := fake.DeleteAllOfStub - fakeReturns := fake.deleteAllOfReturns - fake.recordInvocation("DeleteAllOf", []interface{}{arg1, arg2, arg3}) - fake.deleteAllOfMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) DeleteAllOfCallCount() int { - fake.deleteAllOfMutex.RLock() - defer fake.deleteAllOfMutex.RUnlock() - return len(fake.deleteAllOfArgsForCall) -} - -func (fake *CRTClusterClient) DeleteAllOfCalls(stub func(context.Context, client.Object, ...client.DeleteAllOfOption) error) { - fake.deleteAllOfMutex.Lock() - defer fake.deleteAllOfMutex.Unlock() - fake.DeleteAllOfStub = stub -} - -func (fake *CRTClusterClient) DeleteAllOfArgsForCall(i int) (context.Context, client.Object, []client.DeleteAllOfOption) { - fake.deleteAllOfMutex.RLock() - defer fake.deleteAllOfMutex.RUnlock() - argsForCall := fake.deleteAllOfArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) DeleteAllOfReturns(result1 error) { - fake.deleteAllOfMutex.Lock() - defer fake.deleteAllOfMutex.Unlock() - fake.DeleteAllOfStub = nil - fake.deleteAllOfReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) DeleteAllOfReturnsOnCall(i int, result1 error) { - fake.deleteAllOfMutex.Lock() - defer fake.deleteAllOfMutex.Unlock() - fake.DeleteAllOfStub = nil - if fake.deleteAllOfReturnsOnCall == nil { - fake.deleteAllOfReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteAllOfReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) Get(arg1 context.Context, arg2 types.NamespacedName, arg3 client.Object) error { - fake.getMutex.Lock() - ret, specificReturn := fake.getReturnsOnCall[len(fake.getArgsForCall)] - fake.getArgsForCall = append(fake.getArgsForCall, struct { - arg1 context.Context - arg2 types.NamespacedName - arg3 client.Object - }{arg1, arg2, arg3}) - stub := fake.GetStub - fakeReturns := fake.getReturns - fake.recordInvocation("Get", []interface{}{arg1, arg2, arg3}) - fake.getMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) GetCallCount() int { - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - return len(fake.getArgsForCall) -} - -func (fake *CRTClusterClient) GetCalls(stub func(context.Context, types.NamespacedName, client.Object) error) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = stub -} - -func (fake *CRTClusterClient) GetArgsForCall(i int) (context.Context, types.NamespacedName, client.Object) { - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - argsForCall := fake.getArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) GetReturns(result1 error) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = nil - fake.getReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) GetReturnsOnCall(i int, result1 error) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = nil - if fake.getReturnsOnCall == nil { - fake.getReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.getReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) List(arg1 context.Context, arg2 client.ObjectList, arg3 ...client.ListOption) error { - fake.listMutex.Lock() - ret, specificReturn := fake.listReturnsOnCall[len(fake.listArgsForCall)] - fake.listArgsForCall = append(fake.listArgsForCall, struct { - arg1 context.Context - arg2 client.ObjectList - arg3 []client.ListOption - }{arg1, arg2, arg3}) - stub := fake.ListStub - fakeReturns := fake.listReturns - fake.recordInvocation("List", []interface{}{arg1, arg2, arg3}) - fake.listMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) ListCallCount() int { - fake.listMutex.RLock() - defer fake.listMutex.RUnlock() - return len(fake.listArgsForCall) -} - -func (fake *CRTClusterClient) ListCalls(stub func(context.Context, client.ObjectList, ...client.ListOption) error) { - fake.listMutex.Lock() - defer fake.listMutex.Unlock() - fake.ListStub = stub -} - -func (fake *CRTClusterClient) ListArgsForCall(i int) (context.Context, client.ObjectList, []client.ListOption) { - fake.listMutex.RLock() - defer fake.listMutex.RUnlock() - argsForCall := fake.listArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) ListReturns(result1 error) { - fake.listMutex.Lock() - defer fake.listMutex.Unlock() - fake.ListStub = nil - fake.listReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) ListReturnsOnCall(i int, result1 error) { - fake.listMutex.Lock() - defer fake.listMutex.Unlock() - fake.ListStub = nil - if fake.listReturnsOnCall == nil { - fake.listReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.listReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) Patch(arg1 context.Context, arg2 client.Object, arg3 client.Patch, arg4 ...client.PatchOption) error { - fake.patchMutex.Lock() - ret, specificReturn := fake.patchReturnsOnCall[len(fake.patchArgsForCall)] - fake.patchArgsForCall = append(fake.patchArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 client.Patch - arg4 []client.PatchOption - }{arg1, arg2, arg3, arg4}) - stub := fake.PatchStub - fakeReturns := fake.patchReturns - fake.recordInvocation("Patch", []interface{}{arg1, arg2, arg3, arg4}) - fake.patchMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) PatchCallCount() int { - fake.patchMutex.RLock() - defer fake.patchMutex.RUnlock() - return len(fake.patchArgsForCall) -} - -func (fake *CRTClusterClient) PatchCalls(stub func(context.Context, client.Object, client.Patch, ...client.PatchOption) error) { - fake.patchMutex.Lock() - defer fake.patchMutex.Unlock() - fake.PatchStub = stub -} - -func (fake *CRTClusterClient) PatchArgsForCall(i int) (context.Context, client.Object, client.Patch, []client.PatchOption) { - fake.patchMutex.RLock() - defer fake.patchMutex.RUnlock() - argsForCall := fake.patchArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *CRTClusterClient) PatchReturns(result1 error) { - fake.patchMutex.Lock() - defer fake.patchMutex.Unlock() - fake.PatchStub = nil - fake.patchReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) PatchReturnsOnCall(i int, result1 error) { - fake.patchMutex.Lock() - defer fake.patchMutex.Unlock() - fake.PatchStub = nil - if fake.patchReturnsOnCall == nil { - fake.patchReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) RESTMapper() meta.RESTMapper { - fake.rESTMapperMutex.Lock() - ret, specificReturn := fake.rESTMapperReturnsOnCall[len(fake.rESTMapperArgsForCall)] - fake.rESTMapperArgsForCall = append(fake.rESTMapperArgsForCall, struct { - }{}) - stub := fake.RESTMapperStub - fakeReturns := fake.rESTMapperReturns - fake.recordInvocation("RESTMapper", []interface{}{}) - fake.rESTMapperMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) RESTMapperCallCount() int { - fake.rESTMapperMutex.RLock() - defer fake.rESTMapperMutex.RUnlock() - return len(fake.rESTMapperArgsForCall) -} - -func (fake *CRTClusterClient) RESTMapperCalls(stub func() meta.RESTMapper) { - fake.rESTMapperMutex.Lock() - defer fake.rESTMapperMutex.Unlock() - fake.RESTMapperStub = stub -} - -func (fake *CRTClusterClient) RESTMapperReturns(result1 meta.RESTMapper) { - fake.rESTMapperMutex.Lock() - defer fake.rESTMapperMutex.Unlock() - fake.RESTMapperStub = nil - fake.rESTMapperReturns = struct { - result1 meta.RESTMapper - }{result1} -} - -func (fake *CRTClusterClient) RESTMapperReturnsOnCall(i int, result1 meta.RESTMapper) { - fake.rESTMapperMutex.Lock() - defer fake.rESTMapperMutex.Unlock() - fake.RESTMapperStub = nil - if fake.rESTMapperReturnsOnCall == nil { - fake.rESTMapperReturnsOnCall = make(map[int]struct { - result1 meta.RESTMapper - }) - } - fake.rESTMapperReturnsOnCall[i] = struct { - result1 meta.RESTMapper - }{result1} -} - -func (fake *CRTClusterClient) Scheme() *runtime.Scheme { - fake.schemeMutex.Lock() - ret, specificReturn := fake.schemeReturnsOnCall[len(fake.schemeArgsForCall)] - fake.schemeArgsForCall = append(fake.schemeArgsForCall, struct { - }{}) - stub := fake.SchemeStub - fakeReturns := fake.schemeReturns - fake.recordInvocation("Scheme", []interface{}{}) - fake.schemeMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) SchemeCallCount() int { - fake.schemeMutex.RLock() - defer fake.schemeMutex.RUnlock() - return len(fake.schemeArgsForCall) -} - -func (fake *CRTClusterClient) SchemeCalls(stub func() *runtime.Scheme) { - fake.schemeMutex.Lock() - defer fake.schemeMutex.Unlock() - fake.SchemeStub = stub -} - -func (fake *CRTClusterClient) SchemeReturns(result1 *runtime.Scheme) { - fake.schemeMutex.Lock() - defer fake.schemeMutex.Unlock() - fake.SchemeStub = nil - fake.schemeReturns = struct { - result1 *runtime.Scheme - }{result1} -} - -func (fake *CRTClusterClient) SchemeReturnsOnCall(i int, result1 *runtime.Scheme) { - fake.schemeMutex.Lock() - defer fake.schemeMutex.Unlock() - fake.SchemeStub = nil - if fake.schemeReturnsOnCall == nil { - fake.schemeReturnsOnCall = make(map[int]struct { - result1 *runtime.Scheme - }) - } - fake.schemeReturnsOnCall[i] = struct { - result1 *runtime.Scheme - }{result1} -} - -func (fake *CRTClusterClient) Status() client.StatusWriter { - fake.statusMutex.Lock() - ret, specificReturn := fake.statusReturnsOnCall[len(fake.statusArgsForCall)] - fake.statusArgsForCall = append(fake.statusArgsForCall, struct { - }{}) - stub := fake.StatusStub - fakeReturns := fake.statusReturns - fake.recordInvocation("Status", []interface{}{}) - fake.statusMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) StatusCallCount() int { - fake.statusMutex.RLock() - defer fake.statusMutex.RUnlock() - return len(fake.statusArgsForCall) -} - -func (fake *CRTClusterClient) StatusCalls(stub func() client.StatusWriter) { - fake.statusMutex.Lock() - defer fake.statusMutex.Unlock() - fake.StatusStub = stub -} - -func (fake *CRTClusterClient) StatusReturns(result1 client.StatusWriter) { - fake.statusMutex.Lock() - defer fake.statusMutex.Unlock() - fake.StatusStub = nil - fake.statusReturns = struct { - result1 client.StatusWriter - }{result1} -} - -func (fake *CRTClusterClient) StatusReturnsOnCall(i int, result1 client.StatusWriter) { - fake.statusMutex.Lock() - defer fake.statusMutex.Unlock() - fake.StatusStub = nil - if fake.statusReturnsOnCall == nil { - fake.statusReturnsOnCall = make(map[int]struct { - result1 client.StatusWriter - }) - } - fake.statusReturnsOnCall[i] = struct { - result1 client.StatusWriter - }{result1} -} - -func (fake *CRTClusterClient) Update(arg1 context.Context, arg2 client.Object, arg3 ...client.UpdateOption) error { - fake.updateMutex.Lock() - ret, specificReturn := fake.updateReturnsOnCall[len(fake.updateArgsForCall)] - fake.updateArgsForCall = append(fake.updateArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.UpdateOption - }{arg1, arg2, arg3}) - stub := fake.UpdateStub - fakeReturns := fake.updateReturns - fake.recordInvocation("Update", []interface{}{arg1, arg2, arg3}) - fake.updateMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) UpdateCallCount() int { - fake.updateMutex.RLock() - defer fake.updateMutex.RUnlock() - return len(fake.updateArgsForCall) -} - -func (fake *CRTClusterClient) UpdateCalls(stub func(context.Context, client.Object, ...client.UpdateOption) error) { - fake.updateMutex.Lock() - defer fake.updateMutex.Unlock() - fake.UpdateStub = stub -} - -func (fake *CRTClusterClient) UpdateArgsForCall(i int) (context.Context, client.Object, []client.UpdateOption) { - fake.updateMutex.RLock() - defer fake.updateMutex.RUnlock() - argsForCall := fake.updateArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) UpdateReturns(result1 error) { - fake.updateMutex.Lock() - defer fake.updateMutex.Unlock() - fake.UpdateStub = nil - fake.updateReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) UpdateReturnsOnCall(i int, result1 error) { - fake.updateMutex.Lock() - defer fake.updateMutex.Unlock() - fake.UpdateStub = nil - if fake.updateReturnsOnCall == nil { - fake.updateReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - fake.deleteAllOfMutex.RLock() - defer fake.deleteAllOfMutex.RUnlock() - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - fake.listMutex.RLock() - defer fake.listMutex.RUnlock() - fake.patchMutex.RLock() - defer fake.patchMutex.RUnlock() - fake.rESTMapperMutex.RLock() - defer fake.rESTMapperMutex.RUnlock() - fake.schemeMutex.RLock() - defer fake.schemeMutex.RUnlock() - fake.statusMutex.RLock() - defer fake.statusMutex.RUnlock() - fake.updateMutex.RLock() - defer fake.updateMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *CRTClusterClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ fakegen.CrtClient = new(CRTClusterClient) diff --git a/addons/pkg/types/addons.go b/addons/pkg/types/addons.go deleted file mode 100644 index 9e869b3e59..0000000000 --- a/addons/pkg/types/addons.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package types defines type constants. -package types - -const ( - // AddonSecretType is the add on Secret type - AddonSecretType = "tkg.tanzu.vmware.com/addon" // nolint:gosec - - // AddonNameLabel is the label on the Secret to indicate the name of addon to be installed - AddonNameLabel = "tkg.tanzu.vmware.com/addon-name" - - // ClusterNameLabel is the label on the resource to indicate the cluster on which addon is to be installed - ClusterNameLabel = "tkg.tanzu.vmware.com/cluster-name" - - // PackageNameLabel is the label on the cloned objects namely Secrets and Providers by "TanzuClusterBootstrap" Reconciler to indicate the package name - PackageNameLabel = "tkg.tanzu.vmware.com/package-name" - - // YttMarkerAnnotation is the key for an annotation that indicates that data secret has Ytt markers - YttMarkerAnnotation = "ext.packaging.carvel.dev/ytt-data-values-overlays" - - // AddonFinalizer is the finalizer for the add on. - AddonFinalizer = "tkg.tanzu.vmware.com/addon" - - // AddonTypeAnnotation is the add on type annotation - AddonTypeAnnotation = "tkg.tanzu.vmware.com/addon-type" - - // AddonRemoteAppAnnotation is the add on remote app annotation - AddonRemoteAppAnnotation = "tkg.tanzu.vmware.com/remote-app" - - // AddonNameAnnotation is the add on name annotation - AddonNameAnnotation = AddonNameLabel - - // AddonNamespaceAnnotation is the add on's namespace annotation - AddonNamespaceAnnotation = "tkg.tanzu.vmware.com/addon-namespace" - - // AddonPausedAnnotation is the add on's "paused" annotation - AddonPausedAnnotation = "tkg.tanzu.vmware.com/addon-paused" - - // ClusterNameAnnotation is the cluster's name annotation - ClusterNameAnnotation = "tkg.tanzu.vmware.com/cluster-name" - - // ClusterNamespaceAnnotation is the cluster's namespace annotation - ClusterNamespaceAnnotation = "tkg.tanzu.vmware.com/cluster-namespace" -) - -// AddonImageInfo contains addon image info -type AddonImageInfo struct { - Info ImageInfo `yaml:"imageInfo"` -} - -// ImageInfo contains addon image repository and URLs -type ImageInfo struct { - ImageRepository string `yaml:"imageRepository"` - ImagePullPolicy string `yaml:"imagePullPolicy"` - // Each component can optionally have container images associated with it - Images map[string]Image `yaml:"images,omitempty"` -} - -// Image contains the image information -type Image struct { - ImagePath string `yaml:"imagePath"` - Tag string `yaml:"tag"` -} - -// TKGSDataValues contains the package nodeSelector and update strategy information required by TKGS clusters -type TKGSDataValues struct { - NodeSelector NodeSelector `yaml:"nodeSelector"` - Deployment DeploymentUpdateInfo `yaml:"deployment,omitempty"` - Daemonset DaemonsetUpdateInfo `yaml:"daemonset,omitempty"` -} - -// NodeSelector contains the nodeSelector information -type NodeSelector struct { - TanzuKubernetesRelease string `yaml:"run.tanzu.vmware.com/tkr"` -} - -// DeploymentUpdateInfo contains the deployment update strategy information -type DeploymentUpdateInfo struct { - UpdateStrategy string `yaml:"updateStrategy,omitempty"` - RollingUpdate *RollingUpdateInfo `yaml:"rollingUpdate,omitempty"` -} - -// RollingUpdateInfo contains the rolling update settings -type RollingUpdateInfo struct { - MaxUnavailable int `yaml:"maxUnavailable"` - MaxSurge int `yaml:"maxSurge"` -} - -// DaemonsetUpdateInfo contains the daumonset update strategy information -type DaemonsetUpdateInfo struct { - UpdateStrategy string `yaml:"updateStrategy,omitempty"` -} diff --git a/addons/pkg/types/clusterbootstrap.go b/addons/pkg/types/clusterbootstrap.go deleted file mode 100644 index f069c8968a..0000000000 --- a/addons/pkg/types/clusterbootstrap.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package types defines type constants. -package types - -const ( - // HTTPProxyConfigAnnotation is the cluster HTTP proxy annotation key - HTTPProxyConfigAnnotation = "tkg.tanzu.vmware.com/tkg-http-proxy" - - // HTTPSProxyConfigAnnotation is the cluster HTTPS proxy annotation key - HTTPSProxyConfigAnnotation = "tkg.tanzu.vmware.com/tkg-https-proxy" - - // NoProxyConfigAnnotation is the cluster no-proxy annotation key - NoProxyConfigAnnotation = "tkg.tanzu.vmware.com/tkg-no-proxy" - - // ProxyCACertConfigAnnotation is the cluster proxy CA certificate annotation key - ProxyCACertConfigAnnotation = "tkg.tanzu.vmware.com/tkg-proxy-ca-cert" - - // IPFamilyConfigAnnotation is the cluster IP family annotation key - IPFamilyConfigAnnotation = "tkg.tanzu.vmware.com/tkg-ip-family" - - // SkipTLSVeriy is the cluster skip tls verify annotation key - SkipTLSVerifyConfigAnnotation = "tkg.tanzu.vmware.com/skip-tls-verify" -) diff --git a/addons/pkg/util/addon_util.go b/addons/pkg/util/addon_util.go deleted file mode 100644 index 498f31692a..0000000000 --- a/addons/pkg/util/addon_util.go +++ /dev/null @@ -1,308 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "context" - "fmt" - "net" - "strconv" - "strings" - - "github.com/pkg/errors" - "gopkg.in/yaml.v2" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - pkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" -) - -// GetAddonSecretsForCluster gets the addon secrets belonging to the cluster -func GetAddonSecretsForCluster(ctx context.Context, c client.Client, cluster *clusterapiv1beta1.Cluster) (*corev1.SecretList, error) { - if cluster == nil { - return nil, nil - } - - addonSecrets := &corev1.SecretList{} - if err := c.List(ctx, addonSecrets, client.InNamespace(cluster.Namespace), - client.MatchingLabels{addontypes.ClusterNameLabel: cluster.Name}); err != nil { - return nil, err - } - - return addonSecrets, nil -} - -// GetAddonNameFromAddonSecret gets the addon name from addon secret -func GetAddonNameFromAddonSecret(addonSecret *corev1.Secret) string { - return addonSecret.Labels[addontypes.AddonNameLabel] -} - -// GetClusterNameFromAddonSecret gets the cluster name from addon secret -func GetClusterNameFromAddonSecret(addonSecret *corev1.Secret) string { - return addonSecret.Labels[addontypes.ClusterNameLabel] -} - -// GenerateAppNameFromAddonSecret generates app name given an addon secret -func GenerateAppNameFromAddonSecret(addonSecret *corev1.Secret) string { - addonName := GetAddonNameFromAddonSecret(addonSecret) - if addonName == "" { - return "" - } - - remoteApp := IsRemoteApp(addonSecret) - if remoteApp { - clusterName := GetClusterNameFromAddonSecret(addonSecret) - if clusterName == "" { - return "" - } - return fmt.Sprintf("%s-%s", clusterName, addonName) - } - return addonName -} - -// GeneratePackageInstallName is the util function to generate the PackageInstall CR name in a consistent manner. -// clusterName is the name of cluster within which all resources associated with this PackageInstall CR is installed. -// It does not necessarily -// mean the PackageInstall CR will be installed in that cluster. I.e., the kapp-controller PackageInstall CR is installed -// in the management cluster but is named after "-kapp-controller". It indicates that this kapp-controller -// PackageInstall is for reconciling resources in a cluster named "". -// addonName is the short name of a Tanzu addon with which the PackageInstall CR is associated. -func GeneratePackageInstallName(clusterName, addonName string) string { - return fmt.Sprintf("%s-%s", clusterName, strings.Split(addonName, ".")[0]) -} - -func GetPackageMetadata(ctx context.Context, c client.Client, carvelPkgName, carvelPkgNamespace string) (string, string, error) { - pkg := &kapppkgv1alpha1.Package{} - if err := c.Get(ctx, client.ObjectKey{Name: carvelPkgName, Namespace: carvelPkgNamespace}, pkg); err != nil { - return "", "", err - } - return pkg.Spec.RefName, pkg.Spec.Version, nil -} - -// ParseStringForLabel parse the package ref name to make it valid for K8S object labels. -// A package ref name could contain some characters that are not allowed as a label value. -// Also the label should not end with any non-alphanumeric characters. -// The regex used for validation is (([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])? -func ParseStringForLabel(s string) string { - // Replace + sign with --- - safeLabel := strings.ReplaceAll(s, "+", "---") - if len(safeLabel) <= 63 { - return strings.TrimRight(safeLabel, "_.-") - } - return strings.TrimRight(safeLabel[:63], "_.-") -} - -// GenerateAppSecretNameFromAddonSecret generates app secret name from addon secret -func GenerateAppSecretNameFromAddonSecret(addonSecret *corev1.Secret) string { - return fmt.Sprintf("%s-data-values", GenerateAppNameFromAddonSecret(addonSecret)) -} - -// GenerateDataValueSecretName generates data value secret name from the cluster and the package name -func GenerateDataValueSecretName(clusterName, carvelPkgRefName string) string { - return fmt.Sprintf("%s-%s-data-values", clusterName, packageShortName(carvelPkgRefName)) -} - -// GeneratePackageSecretName generates secret name for a package from the cluster and the package name -func GeneratePackageSecretName(clusterName, carvelPkgRefName string) string { - return fmt.Sprintf("%s-%s-package", clusterName, packageShortName(carvelPkgRefName)) -} - -func packageShortName(pkgRefName string) string { - nameTokens := strings.Split(pkgRefName, ".") - if len(nameTokens) >= 1 { - return nameTokens[0] - } - return pkgRefName -} - -// GenerateAppNamespaceFromAddonSecret generates app namespace from addons secret -func GenerateAppNamespaceFromAddonSecret(addonSecret *corev1.Secret, defaultAddonNamespace string) string { - remoteApp := IsRemoteApp(addonSecret) - if remoteApp { - return addonSecret.Namespace - } - return defaultAddonNamespace -} - -// GetClientFromAddonSecret gets appropriate cluster client given addon secret -func GetClientFromAddonSecret(addonSecret *corev1.Secret, localClient, remoteClient client.Client) client.Client { - var clusterClient client.Client - remoteApp := IsRemoteApp(addonSecret) - if remoteApp { - clusterClient = localClient - } else { - clusterClient = remoteClient - } - return clusterClient -} - -// GetImageInfo gets the image Info of an addon -func GetImageInfo(addonConfig *tkrv1.Addon, imageRepository, imagePullPolicy string, bom *tkrv1.Bom) ([]byte, error) { - componentRefs := addonConfig.AddonContainerImages - - addonImageInfo := &addontypes.AddonImageInfo{Info: addontypes.ImageInfo{ImageRepository: imageRepository, ImagePullPolicy: imagePullPolicy, Images: map[string]addontypes.Image{}}} - - // No Image will be added if componentRefs is empty - for _, componentRef := range componentRefs { - for _, imageRef := range componentRef.ImageRefs { - image, err := bom.GetImageInfo(componentRef.ComponentRef, "", imageRef) - if err != nil { - return nil, err - } - addonImageInfo.Info.Images[imageRef] = addontypes.Image{ImagePath: image.ImagePath, Tag: image.Tag} - } - } - - ImageInfoBytes, err := yaml.Marshal(addonImageInfo) - if err != nil { - return nil, err - } - - outputBytes := append([]byte(constants.TKGDataValueFormatString), ImageInfoBytes...) - return outputBytes, nil -} - -// GetApp gets the app CR from cluster -func GetApp(ctx context.Context, - localClient client.Client, - remoteClient client.Client, - addonSecret *corev1.Secret, - defaultAddonNamespace string) (*kappctrl.App, error) { - - app := &kappctrl.App{} - appObjectKey := client.ObjectKey{ - Name: GenerateAppNameFromAddonSecret(addonSecret), - Namespace: GenerateAppNamespaceFromAddonSecret(addonSecret, defaultAddonNamespace), - } - - var clusterClient client.Client - remoteApp := IsRemoteApp(addonSecret) - if remoteApp { - clusterClient = localClient - } else { - clusterClient = remoteClient - } - - if err := clusterClient.Get(ctx, appObjectKey, app); err != nil { - return nil, err - } - - return app, nil -} - -// GetPackageInstallFromAddonSecret gets the PackageInstall CR from cluster -func GetPackageInstallFromAddonSecret(ctx context.Context, - remoteClient client.Client, - addonSecret *corev1.Secret, - defaultAddonNamespace string) (*pkgiv1alpha1.PackageInstall, error) { - - pkgi := &pkgiv1alpha1.PackageInstall{} - pkgiObjectKey := client.ObjectKey{ - Name: GenerateAppNameFromAddonSecret(addonSecret), - Namespace: GenerateAppNamespaceFromAddonSecret(addonSecret, defaultAddonNamespace), - } - - if err := remoteClient.Get(ctx, pkgiObjectKey, pkgi); err != nil { - return nil, err - } - - return pkgi, nil -} - -// IsAppPresent returns true if app is present on the cluster -func IsAppPresent(ctx context.Context, - localClient client.Client, - remoteClient client.Client, - addonSecret *corev1.Secret, - defaultAddonNamespace string) (bool, error) { - - _, err := GetApp(ctx, localClient, remoteClient, addonSecret, defaultAddonNamespace) - if err != nil { - if !apierrors.IsNotFound(err) { - return false, err - } - return false, nil - } - - return true, nil -} - -// IsRemoteApp returns true if App needs to be remote instead of App being on local cluster -func IsRemoteApp(addonSecret *corev1.Secret) bool { - remoteApp := addonSecret.Annotations[addontypes.AddonRemoteAppAnnotation] - if remoteApp == "" { - return false - } - isRemoteApp, _ := strconv.ParseBool(remoteApp) - return isRemoteApp -} - -// IsAddonPaused returns true if Addon is paused -func IsAddonPaused(addonSecret *corev1.Secret) bool { - annotations := addonSecret.GetAnnotations() - if annotations == nil { - return false - } - _, ok := annotations[addontypes.AddonPausedAnnotation] - return ok -} - -// IsPackageInstallPresent returns true if PackageInstall is present on the cluster -func IsPackageInstallPresent(ctx context.Context, - localClient client.Client, - addonSecret *corev1.Secret, - defaultAddonNamespace string) (bool, error) { - - _, err := GetPackageInstallFromAddonSecret(ctx, localClient, addonSecret, defaultAddonNamespace) - if err != nil { - if !apierrors.IsNotFound(err) { - return false, err - } - return false, nil - } - - return true, nil -} - -// GetServiceCIDRs returns the Service CIDR blocks for both IPv4 and IPv6 family -// Parse Service CIDRBlocks obtained from the cluster and return the following from the function: -// -// The first two return parameters should be used only if the function returns error as nil. -// Also, note that when no error is returned, IPv4 and/or IPv6 CIDRs may still be empty depending on the cluster Service CIDR Blocks -func GetServiceCIDRs(cluster *clusterapiv1beta1.Cluster) (string, string, error) { - var serviceCIDRs []string - serviceCIDR, serviceCIDRv6 := "", "" - if cluster.Spec.ClusterNetwork != nil && cluster.Spec.ClusterNetwork.Services != nil && len(cluster.Spec.ClusterNetwork.Services.CIDRBlocks) > 0 { - serviceCIDRs = cluster.Spec.ClusterNetwork.Services.CIDRBlocks - if len(serviceCIDRs) > 2 { - return "", "", errors.New("too many CIDRs specified") - } - - for _, cidr := range serviceCIDRs { - ip, _, err := net.ParseCIDR(cidr) - if err != nil { - return "", "", errors.Errorf("could not parse CIDR: %s", err) - } - if ip.To4() != nil { - serviceCIDR = cidr - } else { - if ip.To16() == nil { - return "", "", errors.New("Unknown IP type in Service CIDR") - } - serviceCIDRv6 = cidr - } - } - } else { - return "", "", errors.New("Unable to get service CIDRBlocks from cluster") - } - - return serviceCIDR, serviceCIDRv6, nil -} diff --git a/addons/pkg/util/addon_util_test.go b/addons/pkg/util/addon_util_test.go deleted file mode 100644 index 906045ce70..0000000000 --- a/addons/pkg/util/addon_util_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("Addon util test cases", func() { - Context("ParseStringForLabel", func() { - var ( - label string - result string - ) - BeforeEach(func() { - }) - When("label be of short size and no trailing non-alphanumeric characters", func() { - BeforeEach(func() { - label = "foobar1.example.com.1.17.2" - result = ParseStringForLabel(label) - }) - It("should parse label", func() { - Expect(result).To(Equal(label)) - }) - }) - - When("label be of short size but with trailing non-alphanumeric characters", func() { - BeforeEach(func() { - label = "foobar1.example.com.1.17.2." - result = ParseStringForLabel(label) - }) - It("should parse label", func() { - Expect(result).To(Equal(label[:len(label)-1])) - }) - }) - When("label be of long size and no non-alphanumeric characters at index 63", func() { - BeforeEach(func() { - label = "foobar1.very.long.name.for.a.label.exceeding.63.characters.example.com.1.17.2" - result = ParseStringForLabel(label) - }) - It("should parse label", func() { - Expect(result).To(Equal("foobar1.very.long.name.for.a.label.exceeding.63.characters.exam")) - }) - }) - When("label be of long size and with non-alphanumeric trailing '-' characters just before index 62", func() { - BeforeEach(func() { - label = "foobar1.very.long.name.for.a.label.exceeding.63.characters.----ple.com.1.17.2" - result = ParseStringForLabel(label) - }) - It("should parse label", func() { - Expect(result).To(Equal("foobar1.very.long.name.for.a.label.exceeding.63.characters")) - }) - }) - - When("label be of long size and with non-alphanumeric trailing '.' character just before index 62", func() { - BeforeEach(func() { - label = "foobar1.very.long.name.for.a.label.exceeding.63.characters.....ple.com.1.17.2" - result = ParseStringForLabel(label) - }) - It("should parse label", func() { - Expect(result).To(Equal("foobar1.very.long.name.for.a.label.exceeding.63.characters")) - }) - }) - When("label be of long size and with non-alphanumeric trailing '_' character just before index 62", func() { - BeforeEach(func() { - label = "foobar1.very.long.name.for.a.label.exceeding.63.characters.____ple.com.1.17.2--" - result = ParseStringForLabel(label) - }) - It("should parse label", func() { - Expect(result).To(Equal("foobar1.very.long.name.for.a.label.exceeding.63.characters")) - }) - }) - }) -}) diff --git a/addons/pkg/util/bom_util.go b/addons/pkg/util/bom_util.go deleted file mode 100644 index 40860fb097..0000000000 --- a/addons/pkg/util/bom_util.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "context" - "fmt" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" -) - -// GetBOMByTKRName returns the bom associated with the TKR -func GetBOMByTKRName(ctx context.Context, c client.Client, tkrName string) (*tkrv1.Bom, error) { - configMapList := &corev1.ConfigMapList{} - var bomConfigMap *corev1.ConfigMap - if err := c.List(ctx, configMapList, client.InNamespace(constants.TKGBomNamespace), client.MatchingLabels{constants.TKRLabel: tkrName}); err != nil { - return nil, err - } - - if len(configMapList.Items) == 0 { - return nil, nil - } - - bomConfigMap = &configMapList.Items[0] - bomData, ok := bomConfigMap.BinaryData[constants.TKRBomContent] - if !ok { - bomDataString, ok := bomConfigMap.Data[constants.TKRBomContent] - if !ok { - return nil, nil - } - bomData = []byte(bomDataString) - } - - bom, err := tkrv1.NewBom(bomData) - if err != nil { - return nil, err - } - - return &bom, nil -} - -func GetTkgBomConfigMapByName(ctx context.Context, c client.Client, configmapName string) (*tkrv1.TkgBom, error) { - var bomConfigMap corev1.ConfigMap - objectKey := client.ObjectKey{Namespace: constants.ClusterMetadataNamespace, Name: configmapName} - if err := c.Get(ctx, objectKey, &bomConfigMap); err != nil { - return nil, err - } - bomData, ok := bomConfigMap.BinaryData[constants.TKGBomContent] - if !ok { - bomDataString, ok := bomConfigMap.Data[constants.TKGBomContent] - if !ok { - return nil, nil - } - bomData = []byte(bomDataString) - } - - tkgBom, err := tkrv1.NewTkgBom(bomData) - if err != nil { - return nil, err - } - return &tkgBom, nil -} - -// GetTKRNameFromBOMConfigMap returns tkr name given a bom configmap -func GetTKRNameFromBOMConfigMap(bomConfigMap *corev1.ConfigMap) string { - return bomConfigMap.Labels[constants.TKRLabel] -} - -// GetAddonImageRepository returns imageRepository from configMap `tkr-controller-config` in namespace `tkg-system`. -// If not found, try the legacy `tkr-system`, else use BOM -func GetAddonImageRepository(ctx context.Context, c client.Client, bom *tkrv1.Bom) (string, error) { - bomConfigMap := &corev1.ConfigMap{} - // Todo: temporary workaround for getting addon image repo. Because in legacy mgmt cluster - // the tkr-controller-config configmap is stored in `tkr-system`, and in clusterclass or clusterclass - // capable mgmt cluster, it is stored in `tkg-system`. - // Getting from `tkr-system` should be removed once no legacy management cluster exists. - err := c.Get(ctx, client.ObjectKey{ - Namespace: constants.TKGBomNamespaceClassyClusters, - Name: constants.TKRConfigmapName, - }, bomConfigMap) - - if err != nil && errors.IsNotFound(err) { - err = c.Get(ctx, client.ObjectKey{ - Namespace: constants.TKGBomNamespace, - Name: constants.TKRConfigmapName, - }, bomConfigMap) - } - - // if the configmap exists, try get repository from the config map - if err == nil { - if imgRepo, ok := bomConfigMap.Data[constants.TKRRepoKey]; ok && imgRepo != "" { - return imgRepo, nil - } - } else if !errors.IsNotFound(err) { - // return the error to controller if err is not IsNotFound - return "", err - } - // if the configmap doesn't exist, or there is no `imageRepository` field, get repository from BOM - return bom.GetImageRepository() -} - -// GetCorePackageRepositoryImageFromBom generates the core PackageRepository Object -func GetCorePackageRepositoryImageFromBom(bom *tkrv1.Bom) (*tkrv1.ImageInfo, error) { - repositoryImage, err := bom.GetImageInfo(constants.TKGCorePackageRepositoryComponentName, "", constants.TKGCorePackageRepositoryImageName) - if err != nil { - return nil, err - } - return &repositoryImage, nil -} - -// GetTemplateImageURLFromBom gets the image template image url of an addon -// This method first checks if packageName is present in addonConfig -// If packageName is present, it will use it to find imgpkg bundle in tkg-core-packages -// If packageName is not present, it will look for addonTemplatesImage -// addonTemplatesImage should be present in a 1.3.1 cluster, and will be used to find images in tanzu_core_addons -// If addonTemplatesImage is not present, it will fall back to using templatesImagePath and templatesImageTag to find template images -func GetTemplateImageURLFromBom(addonConfig *tkrv1.Addon, imageRepository string, bom *tkrv1.Bom) (string, error) { - /*example addon section in BOM: - kapp-controller: - category: addons-management - clusterTypes: - - management - - workload - templatesImagePath: tanzu_core/addons/kapp-controller-templates (1.3.0-) - templatesImageTag: v1.3.0 (1.3.0-) - addonTemplatesImage: (1.3.1) - - componentRef: tanzu_core_addons (1.3.1) - imageRefs: (1.3.1) - - kappControllerTemplatesImage (1.3.1) - addonContainerImages: (1.3.1) - - componentRef: kapp-controller (1.3.1) - imageRefs: (1.3.1) - - kappControllerImage (1.3.1) - packageName: addons-manager.tkg-core.tanzu.vmware (1.4.0+) - */ - var templateImagePath, templateImageTag string - if addonConfig.PackageName != "" { - addonPackageImage, err := bom.GetImageInfo(constants.TKGCorePackageRepositoryComponentName, "", addonConfig.PackageName) - if err != nil { - return "", err - } - templateImagePath = addonPackageImage.ImagePath - templateImageTag = addonPackageImage.Tag - } else if len(addonConfig.AddonTemplatesImage) < 1 || len(addonConfig.AddonTemplatesImage[0].ImageRefs) < 1 { - // if AddonTemplatesImage and AddonTemplatesImage are not present, use the older BOM format - templateImagePath = addonConfig.TemplatesImagePath - templateImageTag = addonConfig.TemplatesImageTag - } else { - templateImageComponentName := addonConfig.AddonTemplatesImage[0].ComponentRef - templateImageName := addonConfig.AddonTemplatesImage[0].ImageRefs[0] - - templateImage, err := bom.GetImageInfo(templateImageComponentName, "", templateImageName) - if err != nil { - return "", err - } - templateImagePath = templateImage.ImagePath - templateImageTag = templateImage.Tag - } - - if templateImagePath == "" || templateImageTag == "" { - err := fmt.Errorf("unable to get template image") - return "", err - } - - return fmt.Sprintf("%s/%s:%s", imageRepository, templateImagePath, templateImageTag), nil -} diff --git a/addons/pkg/util/cluster_util.go b/addons/pkg/util/cluster_util.go deleted file mode 100644 index 5d81467510..0000000000 --- a/addons/pkg/util/cluster_util.go +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "context" - "fmt" - "time" - - "github.com/go-logr/logr" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/discovery" - cacheddiscovery "k8s.io/client-go/discovery/cached/memory" - "k8s.io/client-go/dynamic" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - capiremote "sigs.k8s.io/cluster-api/controllers/remote" - clusterapiutil "sigs.k8s.io/cluster-api/util" - clusterapisecretutil "sigs.k8s.io/cluster-api/util/secret" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/apiutil" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" - runtanzuv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - vmoperatorv1alpha1 "github.com/vmware-tanzu/vm-operator-api/api/v1alpha1" -) - -const ( - defaultClientTimeout = 10 * time.Second - tkrKey = "run.tanzu.vmware.com/tkr" -) - -// GetOwnerCluster returns the Cluster object owning the current resource. -func GetOwnerCluster(ctx context.Context, c client.Client, obj *metav1.ObjectMeta) (*clusterv1beta1.Cluster, error) { - for _, ref := range obj.OwnerReferences { - if ref.Kind != "Cluster" { - continue - } - gv, err := schema.ParseGroupVersion(ref.APIVersion) - if err != nil { - return nil, errors.WithStack(err) - } - if gv.Group == clusterv1beta1.GroupVersion.Group { - return GetClusterByName(ctx, c, obj.Namespace, ref.Name) - } - } - return nil, nil -} - -// GetClusterByName finds and return a Cluster object using the specified params. -func GetClusterByName(ctx context.Context, c client.Client, namespace, name string) (*clusterv1beta1.Cluster, error) { - cluster := &clusterv1beta1.Cluster{} - key := client.ObjectKey{ - Namespace: namespace, - Name: name, - } - - if err := c.Get(ctx, key, cluster); err != nil { - return nil, err - } - - return cluster, nil -} - -// GetClustersByTKR gets the clusters using this TKR -func GetClustersByTKR(ctx context.Context, c client.Client, tkr *runtanzuv1alpha1.TanzuKubernetesRelease) ([]*clusterv1beta1.Cluster, error) { - var clusters []*clusterv1beta1.Cluster - - if c == nil || tkr == nil { - return nil, nil - } - - clustersList := &clusterv1beta1.ClusterList{} - - if err := c.List(ctx, clustersList, client.MatchingLabels{constants.TKRLabel: tkr.GetName()}); err != nil { - return nil, err - } - - for i := range clustersList.Items { - clusters = append(clusters, &clustersList.Items[i]) - } - - return clusters, nil -} - -// GetClusterClient gets cluster's client -func GetClusterClient(ctx context.Context, currentClusterClient client.Client, scheme *runtime.Scheme, cluster client.ObjectKey) (client.Client, error) { - config, err := capiremote.RESTConfig(ctx, constants.AddonControllerName, currentClusterClient, cluster) - if err != nil { - return nil, errors.Wrapf(err, "error fetching REST client config for remote cluster %q", cluster.String()) - } - config.Timeout = defaultClientTimeout - - // Create a mapper for it - mapper, err := apiutil.NewDynamicRESTMapper(config) - if err != nil { - return nil, errors.Wrapf(err, "error creating dynamic rest mapper for remote cluster %q", cluster.String()) - } - - // Create the client for the remote cluster - c, err := client.New(config, client.Options{Scheme: scheme, Mapper: mapper}) - if err != nil { - return nil, errors.Wrapf(err, "error creating client for remote cluster %q", cluster.String()) - } - - return c, nil -} - -// GetBOMForCluster gets the bom associated with the legacy-style TKGm cluster -func GetBOMForCluster(ctx context.Context, c client.Client, cluster *clusterv1beta1.Cluster) (*tkrv1.Bom, error) { - tkrName := cluster.Labels[constants.TKRLabel] - - bom, err := GetBOMByTKRName(ctx, c, tkrName) - if err != nil { - return nil, err - } - - return bom, nil -} - -func GetTkgBomForCluster(ctx context.Context, c client.Client, tkrName string) (*tkrv1.TkgBom, error) { - tkgVersion, err := getTkgVerionByTkr(ctx, tkrName, c) - if err != nil { - return nil, errors.Wrap(err, "can't get version by tkr name") - } - tkgBom, err := GetTkgBomConfigMapByName(ctx, c, fmt.Sprintf("%s-%s", constants.TkgBomConfigMapName, tkgVersion)) - if err != nil { - return nil, err - } - - return tkgBom, nil -} - -func getTkgVerionByTkr(ctx context.Context, tkrName string, c client.Client) (string, error) { - var compatibilityConfigMap corev1.ConfigMap - objectKey := client.ObjectKey{Namespace: constants.TKGSystemNS, Name: constants.TKGbomMetadataConfigmapName} - if err := c.Get(ctx, objectKey, &compatibilityConfigMap); err != nil { - return "", err - } - compatibilityData, ok := compatibilityConfigMap.BinaryData[constants.TKGCompatibility] - if !ok { - compatibilityDataDataString, ok := compatibilityConfigMap.Data[constants.TKGCompatibility] - if !ok { - return "", nil - } - compatibilityData = []byte(compatibilityDataDataString) - } - - compatibility, err := tkrv1.NewCompatibility(compatibilityData) - if err != nil { - return "", err - } - return tkrv1.FilterTkgVersionByTkr(compatibility, tkrName) -} - -// ClusterKubeconfigSecretDetails contains the cluster kubeconfig secret details. -type ClusterKubeconfigSecretDetails struct { - Name string - Namespace string - Key string -} - -// GetClusterKubeconfigSecretDetails returns the name, namespace and key of the cluster's kubeconfig secret -func GetClusterKubeconfigSecretDetails(cluster *clusterv1beta1.Cluster) *ClusterKubeconfigSecretDetails { - return &ClusterKubeconfigSecretDetails{ - Name: clusterapisecretutil.Name(cluster.Name, clusterapisecretutil.Kubeconfig), - Namespace: cluster.Namespace, - Key: clusterapisecretutil.KubeconfigDataName, - } -} - -// ClustersToRequests returns a list of Requests for clusters -func ClustersToRequests(clusters []*clusterv1beta1.Cluster, log logr.Logger) []ctrl.Request { - var requests []ctrl.Request - - for _, cluster := range clusters { - log.V(4).Info("Adding cluster for reconciliation", - constants.ClusterNamespaceLogKey, cluster.Namespace, constants.ClusterNameLogKey, cluster.Name) - - requests = append(requests, ctrl.Request{ - NamespacedName: clusterapiutil.ObjectKey(cluster), - }) - } - - return requests -} - -func GetClusterLabel(clusterLabels map[string]string, labelKey string) string { - if clusterLabels == nil { - return "" - } - - labelValue, ok := clusterLabels[labelKey] - if !ok { - return "" - } - - return labelValue -} - -// GetInfraProvider get infrastructure kind from cluster spec -func GetInfraProvider(cluster *clusterv1beta1.Cluster) (string, error) { - var infraProvider string - - if cluster.Spec.InfrastructureRef != nil { - infraProvider = cluster.Spec.InfrastructureRef.Kind - switch infraProvider { - case constants.InfrastructureRefVSphere: - return constants.InfrastructureProviderVSphere, nil - case constants.InfrastructureRefAWS: - return constants.InfrastructureProviderAWS, nil - case constants.InfrastructureRefAzure: - return constants.InfrastructureProviderAzure, nil - case constants.InfrastructureRefDocker: - return constants.InfrastructureProviderDocker, nil - case constants.InfrastructureRefOCI: - return constants.InfrastructureProviderOCI, nil - } - } - - return "", errors.New("unknown error in getting infraProvider") -} - -// IsTKGSCluster checks if the cluster is a TKGS cluster -func IsTKGSCluster(ctx context.Context, dynamicClient dynamic.Interface, discoveryClient discovery.DiscoveryInterface, cluster *clusterv1beta1.Cluster) (bool, error) { - // Verify if virtualmachine CRD resource exists in the cluster - virtualMachineGVR := schema.GroupVersionResource{ - Group: vmoperatorv1alpha1.SchemeGroupVersion.Group, - Version: vmoperatorv1alpha1.SchemeGroupVersion.Version, - Resource: "virtualmachines", - } - resources, err := discoveryClient.ServerResourcesForGroupVersion(virtualMachineGVR.GroupVersion().String()) - if err != nil { - // If Group doesn't exist, memCacheClient discovery will return "not found" instead of IsNotFound API error - if apierrors.IsNotFound(err) || err.Error() == cacheddiscovery.ErrCacheNotFound.Error() { - return false, nil - } - return false, err - } - - exists := false - if resources != nil { - for i := range resources.APIResources { - if resources.APIResources[i].Name == virtualMachineGVR.Resource { - exists = true - break - } - } - } - - if exists { - // Verify TKGS cluster by checking if virtualmachine objects exist with the cluster label - listOptions := metav1.ListOptions{ - LabelSelector: constants.CAPVClusterSelectorKey + "=" + cluster.Name, - } - virtualMachineList, err := dynamicClient.Resource(virtualMachineGVR).Namespace(cluster.Namespace).List(ctx, listOptions) - if err != nil { - if apierrors.IsNotFound(err) { - return false, nil - } - return false, err - } - return len(virtualMachineList.Items) != 0, nil - } - return false, nil -} diff --git a/addons/pkg/util/cluster_variable_util.go b/addons/pkg/util/cluster_variable_util.go deleted file mode 100644 index 0123bd311b..0000000000 --- a/addons/pkg/util/cluster_variable_util.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "strings" - - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" -) - -func ParseClusterVariableBool(cluster *clusterapiv1beta1.Cluster, variableName string) (bool, error) { - var result interface{} - result, err := parseClusterVariable(cluster, variableName) - if err != nil || result == nil { - return false, err - } - return result.(bool), err -} - -func ParseClusterVariableString(cluster *clusterapiv1beta1.Cluster, variableName string) (string, error) { - var result interface{} - result, err := parseClusterVariable(cluster, variableName) - if err != nil || result == nil { - return "", err - } - return result.(string), err -} - -func ParseClusterVariableInterface(cluster *clusterapiv1beta1.Cluster, variableName, keyName string) (string, error) { - var result interface{} - - result, err := parseClusterVariable(cluster, variableName) - if err != nil || result == nil { - return "", err - } - interfaceVars := result.(map[string]interface{}) - - if valueName, ok := interfaceVars[keyName]; ok { - if _, ok := valueName.(string); ok { - return valueName.(string), err - } - } - return "", err -} - -func ParseClusterVariableInterfaceArray(cluster *clusterapiv1beta1.Cluster, variableName, keyName string) ([]string, error) { - var result interface{} - - result, err := parseClusterVariable(cluster, variableName) - if err != nil || result == nil { - return nil, err - } - interfaceVars := result.(map[string]interface{}) - - if valueName, ok := interfaceVars[keyName]; ok { - if _, ok := valueName.([]interface{}); ok { - interfaceArr := valueName.([]interface{}) - - aString := make([]string, len(interfaceArr)) - for i, v := range interfaceArr { - aString[i] = v.(string) - } - return aString, err - } else { - return nil, fmt.Errorf("failed to parse the value %v to target type []interface{}", valueName) - } - } - return nil, err -} - -func ParseClusterVariableList(cluster *clusterapiv1beta1.Cluster, variableName string) (string, error) { - var result interface{} - - result, err := parseClusterVariable(cluster, variableName) - if err != nil || result == nil { - return "", err - } - - rec := result.([]interface{}) - tmpList := make([]string, len(rec)) - for i, v := range rec { - tmpList[i] = fmt.Sprint(v) - } - varList := strings.Join(tmpList, ", ") - return varList, err -} - -// Decode all certificate then append them in single string, then ecode them together -func ParseClusterVariableCert(cluster *clusterapiv1beta1.Cluster, variableName, keyName, data string) (string, error) { - var result interface{} - var sb strings.Builder - - result, err := parseClusterVariable(cluster, variableName) - if err != nil || result == nil { - return "", err - } - interfaceVars := result.(map[string]interface{}) - if valueList, ok := interfaceVars[keyName]; ok { - if rec, ok := valueList.([]interface{}); ok { - for _, certRaw := range rec { - if cert, ok := certRaw.(map[string]interface{}); ok { - certData := cert[data] - if _, ok := certData.(string); ok { - decoded, err := base64.StdEncoding.DecodeString(certData.(string)) - if err != nil { - return "", err - } - sb.Write(decoded) - sb.WriteString("\n") - } - } - } - } - } - return base64.StdEncoding.EncodeToString([]byte(sb.String())), err -} - -func parseClusterVariable(cluster *clusterapiv1beta1.Cluster, variableName string) (interface{}, error) { - var ( - clusterVariableValue interface{} - result interface{} - ) - - if cluster == nil { - return nil, errors.New("cluster resource is nil") - } - if cluster.Spec.Topology == nil || variableName == "" { - return nil, nil - } - clusterVariables := cluster.Spec.Topology.Variables - for _, clusterVariable := range clusterVariables { - if clusterVariable.Name == variableName { - if err := json.Unmarshal(clusterVariable.Value.Raw, &clusterVariableValue); err != nil { - return nil, fmt.Errorf("failed in json unmarshal of cluster variable value for '%s'", variableName) - } - switch t := clusterVariableValue.(type) { - case string: - result = t - case bool: - result = t - case interface{}: - result = t - default: - return nil, fmt.Errorf("invalid type for the cluster variable value for '%s'", variableName) - } - break - } - } - return result, nil -} diff --git a/addons/pkg/util/cluster_variable_util_test.go b/addons/pkg/util/cluster_variable_util_test.go deleted file mode 100644 index d96534975b..0000000000 --- a/addons/pkg/util/cluster_variable_util_test.go +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "fmt" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" -) - -const ( - testClusterAPIVersion = "cluster.x-k8s.io/v1beta1" - testClusterClass = "test-cluster-class" - testClusterKind = "Cluster" - testClusterName = "test-cluster" - testClusterVariableName = "test-variable-name" - testK8sVersion = "v1.22.3" - testNamespace = "test-ns" -) - -var _ = Describe("Parse Cluster Variable", func() { - Context("ParseClusterVariable functions", func() { - var ( - err error - result string - resultArray []string - clusterObj *clusterapiv1beta1.Cluster - ) - BeforeEach(func() { - clusterObj = &clusterapiv1beta1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: testClusterKind, APIVersion: testClusterAPIVersion}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace}, - Spec: clusterapiv1beta1.ClusterSpec{ - Topology: &clusterapiv1beta1.Topology{ - Class: testClusterClass, - Version: testK8sVersion, - }, - }, - } - }) - When("cluster variable exists and match the input variable name", func() { - BeforeEach(func() { - clusterObj.Spec.Topology.Variables = []clusterapiv1beta1.ClusterVariable{ - {Name: testClusterVariableName, Value: apiextensionsv1.JSON{Raw: []byte(`"test-variable-value"`)}}, - } - result, err = ParseClusterVariableString(clusterObj, testClusterVariableName) - }) - It("should return cluster variable value", func() { - Expect(result).To(Equal("test-variable-value")) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - When("multiple cluster variables exist and the input variable name exist among them", func() { - BeforeEach(func() { - clusterObj.Spec.Topology.Variables = []clusterapiv1beta1.ClusterVariable{ - {Name: "another-test-variable-name", Value: apiextensionsv1.JSON{Raw: []byte(`"another-test-variable-value"`)}}, - {Name: testClusterVariableName, Value: apiextensionsv1.JSON{Raw: []byte(`"test-variable-value"`)}}, - } - result, err = ParseClusterVariableString(clusterObj, testClusterVariableName) - }) - It("should return cluster variable value", func() { - Expect(result).To(Equal("test-variable-value")) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - When("cluster object be nil", func() { - BeforeEach(func() { - clusterObj = nil - result, err = ParseClusterVariableString(clusterObj, testClusterVariableName) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster resource is nil")) - Expect(result).To(Equal("")) - }) - }) - - When("cluster spec topology be nil", func() { - BeforeEach(func() { - clusterObj.Spec.Topology = nil - result, err = ParseClusterVariableString(clusterObj, testClusterVariableName) - }) - It("should return empty value", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("")) - }) - }) - - When("cluster spec variables be empty", func() { - BeforeEach(func() { - clusterObj.Spec.Topology.Variables = []clusterapiv1beta1.ClusterVariable{} - result, err = ParseClusterVariableString(clusterObj, testClusterVariableName) - }) - It("should return empty value", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("")) - }) - }) - - When("input variable name name be empty", func() { - BeforeEach(func() { - clusterObj.Spec.Topology.Variables = []clusterapiv1beta1.ClusterVariable{ - {Name: testClusterVariableName, Value: apiextensionsv1.JSON{Raw: []byte(`"test-variable-value"`)}}, - } - result, err = ParseClusterVariableString(clusterObj, "") - }) - It("should return empty value", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("")) - }) - }) - - When("input cluster variable not exists among the cluster spec variables", func() { - BeforeEach(func() { - clusterObj.Spec.Topology.Variables = []clusterapiv1beta1.ClusterVariable{ - {Name: testClusterVariableName, Value: apiextensionsv1.JSON{Raw: []byte(`"test-variable-value"`)}}, - } - result, err = ParseClusterVariableString(clusterObj, "non existing") - }) - It("should return empty value", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("")) - }) - }) - - When("cluster variable of type (bool)", func() { - var result bool - BeforeEach(func() { - clusterObj.Spec.Topology.Variables = []clusterapiv1beta1.ClusterVariable{ - {Name: testClusterVariableName, Value: apiextensionsv1.JSON{Raw: []byte(`true`)}}, - } - result, err = ParseClusterVariableBool(clusterObj, testClusterVariableName) - }) - It("should return variable value", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(BeTrue()) - }) - }) - When("cluster variable slice exists and match the input variable name", func() { - BeforeEach(func() { - clusterObj.Spec.Topology.Variables = []clusterapiv1beta1.ClusterVariable{ - {Name: testClusterVariableName, Value: apiextensionsv1.JSON{Raw: []byte(`["value1","value2"]`)}}, - } - result, err = ParseClusterVariableList(clusterObj, testClusterVariableName) - }) - It("should return cluster variable value", func() { - Expect(result).To(Equal(`value1, value2`)) - Expect(err).NotTo(HaveOccurred()) - }) - }) - When("cluster variable interface exists and match the input variable name", func() { - BeforeEach(func() { - clusterObj.Spec.Topology.Variables = []clusterapiv1beta1.ClusterVariable{ - {Name: testClusterVariableName, Value: apiextensionsv1.JSON{Raw: []byte(`{"httpProxy":"foo.com"}`)}}, - } - result, err = ParseClusterVariableInterface(clusterObj, testClusterVariableName, "httpProxy") - }) - It("should return cluster variable value", func() { - Expect(result).To(Equal("foo.com")) - Expect(err).NotTo(HaveOccurred()) - }) - }) - When("cluster variable interface array exists and match the input variable name", func() { - BeforeEach(func() { - clusterObj.Spec.Topology.Variables = []clusterapiv1beta1.ClusterVariable{ - {Name: testClusterVariableName, Value: apiextensionsv1.JSON{Raw: []byte(`{"noProxy":["10.0.0.1/24","127.0.0.1"]}`)}}, - } - resultArray, err = ParseClusterVariableInterfaceArray(clusterObj, testClusterVariableName, "noProxy") - }) - It("should return cluster variable value", func() { - Expect(resultArray).To(Equal([]string{"10.0.0.1/24", "127.0.0.1"})) - Expect(err).NotTo(HaveOccurred()) - }) - }) - When("cluster variable custom certs exists and match the input variable name", func() { - BeforeEach(func() { - clusterObj.Spec.Topology.Variables = []clusterapiv1beta1.ClusterVariable{ - {Name: testClusterVariableName, Value: apiextensionsv1.JSON{Raw: []byte(`{"additionalTrustedCAs": [{"name": "cert1", "data":"aGVsbG8="}, {"name": "cert2", "data":"bHWtcH9="}]}`)}}, - } - result, err = ParseClusterVariableCert(clusterObj, testClusterVariableName, "additionalTrustedCAs", "data") - }) - It("should return cluster variable value", func() { - Expect(result).To(Equal("aGVsbG8KbHWtcH8K")) - Expect(err).NotTo(HaveOccurred()) - }) - }) - When("failure in json unmarshal", func() { - BeforeEach(func() { - clusterObj.Spec.Topology.Variables = []clusterapiv1beta1.ClusterVariable{ - {Name: testClusterVariableName, Value: apiextensionsv1.JSON{Raw: []byte(`invalid`)}}, - } - result, err = ParseClusterVariableString(clusterObj, testClusterVariableName) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("failed in json unmarshal of cluster variable value for '%s'", testClusterVariableName))) - Expect(result).To(Equal("")) - }) - }) - }) -}) diff --git a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone.go b/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone.go deleted file mode 100644 index bc8b5d69eb..0000000000 --- a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone.go +++ /dev/null @@ -1,1081 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clusterbootstrapclone - -import ( - "context" - "fmt" - "reflect" - "strings" - - "github.com/go-logr/logr" - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/util/retry" - "k8s.io/utils/pointer" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterapiutil "sigs.k8s.io/cluster-api/util" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -type Helper struct { - Ctx context.Context - K8sClient client.Client - AggregateAPIResourcesClient client.Client - DynamicClient dynamic.Interface - GVRHelper util.GVRHelper - Logger logr.Logger -} - -// NewHelper instantiates a new helper instance -func NewHelper(ctx context.Context, k8sClient client.Client, aggregateAPIResourcesClient client.Client, - dynamicClient dynamic.Interface, - gvrHelper util.GVRHelper, - logger logr.Logger) *Helper { - - return &Helper{ - Ctx: ctx, - K8sClient: k8sClient, - AggregateAPIResourcesClient: aggregateAPIResourcesClient, - DynamicClient: dynamicClient, - GVRHelper: gvrHelper, - Logger: logger, - } -} - -// CompleteCBPackageRefNamesFromTKR goes through the ClusterBootstrapPackages and makes the RefName complete. -// For example, when the clusterBootstrapPackage.RefName passed in is "calico*", this function updates it to be -// a fully qualified name(..). The fully qualified name is fetched from TKR. -func (h *Helper) CompleteCBPackageRefNamesFromTKR(tkr *runtanzuv1alpha3.TanzuKubernetesRelease, clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap) error { - var suffix = "*" - - if clusterBootstrap.Spec == nil { - return errors.New("missing spec definition") - } - clusterBootstrapPackages := []*runtanzuv1alpha3.ClusterBootstrapPackage{ - clusterBootstrap.Spec.CNI, - clusterBootstrap.Spec.CPI, - clusterBootstrap.Spec.CSI, - clusterBootstrap.Spec.Kapp, - } - clusterBootstrapPackages = append(clusterBootstrapPackages, clusterBootstrap.Spec.AdditionalPackages...) - - for _, clusterBootstrapPackage := range clusterBootstrapPackages { - if clusterBootstrapPackage != nil && strings.HasSuffix(clusterBootstrapPackage.RefName, suffix) { - // The partial filled RefName will end with *. E.g., refName: calico* - prefixToMatch := strings.TrimSuffix(clusterBootstrapPackage.RefName, suffix) - fullyQualifiedCBPackageRefName, err := getFullyQualifiedCBPackageRefName(tkr, prefixToMatch) - if err != nil { - // Error means no match found. We do not expect this to happen. - // For atomicity, we return error immediately if there is a no match. - return err - } - clusterBootstrapPackage.RefName = fullyQualifiedCBPackageRefName - } - } - return nil -} - -func getFullyQualifiedCBPackageRefName(tkr *runtanzuv1alpha3.TanzuKubernetesRelease, prefix string) (string, error) { - var fullyQualifiedCBPackageRefName string - var found bool - for _, tkrBootstrapPackage := range tkr.Spec.BootstrapPackages { - if strings.HasPrefix(tkrBootstrapPackage.Name, prefix) { - if found { - // It is possible that current prefix matches multiple bootstrapPackages. For example, c* might match - // capabilities bootstrapPackage and calico bootstrapPackage. We would like to return error in this case - // to let caller revise the prefix in order to narrow down to exactly one match. - return fullyQualifiedCBPackageRefName, fmt.Errorf("multiple bootstrapPackage names matche the prefix %s within the TanzuKubernetesRelease %s", prefix, tkr.Name) - } - fullyQualifiedCBPackageRefName = tkrBootstrapPackage.Name - found = true - } - } - if !found { - return fullyQualifiedCBPackageRefName, fmt.Errorf("no bootstrapPackage name matches the prefix %s within the BootstrapPackages [%v] of TanzuKubernetesRelease %s", prefix, tkr.Spec.BootstrapPackages, tkr.Name) - } - return fullyQualifiedCBPackageRefName, nil -} - -// AddMissingSpecFieldsFromTemplate scans clusterBootstrap's fields. For fields which are not specified, it adds defaults from -// clusterBootstrapTemplate -func (h *Helper) AddMissingSpecFieldsFromTemplate(clusterBootstrapTemplate *runtanzuv1alpha3.ClusterBootstrapTemplate, - clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, keysToSkip map[string]interface{}) error { - - h.Logger.Info(fmt.Sprintf("adding the missing spec fields of ClusterBootstrap %s/%s from ClusterBootstrapTemplate %s/%s", - clusterBootstrap.Namespace, clusterBootstrap.Name, clusterBootstrapTemplate.Namespace, clusterBootstrapTemplate.Name)) - - converter := runtime.DefaultUnstructuredConverter - var copyFrom map[string]interface{} - var target map[string]interface{} - var err error - // DeepCopy() here is to make sure to handle the pointer fields properly. We do not want any changes in clusterBootstrapTemplate - // have side effects on the ClusterBootstrap object - if copyFrom, err = converter.ToUnstructured(clusterBootstrapTemplate.Spec.DeepCopy()); err != nil { - return err - } - if target, err = converter.ToUnstructured(clusterBootstrap.Spec.DeepCopy()); err != nil { - return err - } - if err := addMissingFields(copyFrom, target, keysToSkip); err != nil { - return err - } - updatedTemplateSpec := &runtanzuv1alpha3.ClusterBootstrapTemplateSpec{} - if err := converter.FromUnstructured(target, updatedTemplateSpec); err != nil { - return err - } - clusterBootstrap.Spec = updatedTemplateSpec - h.Logger.Info(fmt.Sprintf("added the missing spec fields of ClusterBootstrap %s/%s from ClusterBootstrapTemplate %s/%s", - clusterBootstrap.Namespace, clusterBootstrap.Name, clusterBootstrapTemplate.Namespace, clusterBootstrapTemplate.Name)) - return nil -} - -func addMissingFields(copyFrom, destination, keysToSkip map[string]interface{}) error { //nolint - for keyInFrom, valueInFrom := range copyFrom { - if keysToSkip != nil { - // There might be some keys we do not want to add to destination. - if _, exist := keysToSkip[keyInFrom]; exist { - continue - } - } - valueInTarget, exist := destination[keyInFrom] - if !exist || valueInTarget == nil { - // If keyInFrom does not exist in destination or valueInTarget is nil, we need to copy valueInFrom and add to - // destination. - if valueInFrom != nil { - valueInFromType := reflect.TypeOf(valueInFrom) - if valueInFromType.Kind() == reflect.Map { - // If the valueInFrom is a map, we copy it directly. - copiedVal, _, copyErr := unstructured.NestedFieldCopy(valueInFrom.(map[string]interface{})) - if copyErr != nil { - return copyErr - } - // unstructured.NestedFieldCopy() copies all fields, but we need to delete some fields which are meant - // to be skipped. - if removeErr := removeFields(copiedVal.(map[string]interface{}), keysToSkip); removeErr != nil { - return removeErr - } - destination[keyInFrom] = copiedVal - } else if valueInFromType.Kind() == reflect.Slice { - // If the valueInFrom is a slice, e.g., additionalPackages from a ClusterBootstrapTemplate, we iterate - // on each item of the slice and make a copy of it. - var copiedSlice []interface{} - for _, sliceItemInFrom := range valueInFrom.([]interface{}) { - if reflect.TypeOf(sliceItemInFrom).Kind() == reflect.Map { - // Instantiate an empty map and invoke addMissingFields() to add missing fields into it. Logically, - // this is doing a copy of the slice item and remove the keys which are meant to be skipped. - copiedMap := make(map[string]interface{}) - if copyErr := addMissingFields(sliceItemInFrom.(map[string]interface{}), copiedMap, keysToSkip); copyErr != nil { - return copyErr - } - copiedSlice = append(copiedSlice, copiedMap) - } else { - // TODO: The following line is doing a shallow copy, we might want to revisit in the future. - // https://github.com/vmware-tanzu/tanzu-framework/issues/2785 - copiedSlice = append(copiedSlice, sliceItemInFrom) - } - } - destination[keyInFrom] = copiedSlice - } else { - // TODO: Handle the primitive pointer, e.g., *int. Ideally we need to make a copy of the pointer - // instead of reassigning directly. It is a shallow copy with current approach, copyFrom and destination - // share the same underlying data. We are good at the moment because this function is internally - // used for handling ClusterBootstrapTemplateSpec which does not have any primitive pointers in its - // API definition. - // https://github.com/vmware-tanzu/tanzu-framework/issues/2785 - destination[keyInFrom] = valueInFrom - } - } - } else { - // If keyInFrom exists in destination, recursively look inside the nested fields. - if valueInFrom != nil && reflect.TypeOf(valueInFrom).Kind() == reflect.Map && - valueInTarget != nil && reflect.TypeOf(valueInTarget).Kind() == reflect.Map && - // ClusterBootstrapPackage.ValuesFrom.Inline is a map[string]interface{} contains the data values of a - // specific ClusterBootstrapPackage. When the key "inline" exist in the destination we should not attempt - // to invoke the addMissingFields(), otherwise the processed ClusterBootstrapPackage.ValuesFrom.Inline will - // contain a combined data value from both copyFrom and destination. - // E.g., ClusterBootstrap.Spec.CSI.ValuesFrom.Inline has {"a": "b"}, - // and ClusterBootstrapTemplate.Spec.CSI.ValuesFrom.Inline has {"foo":"bar"}. - // If we do not have the following check the final processed ClusterBootstrap will have {"a": "b", "foo": "bar"} - // which is not expected - keyInFrom != "inline" { - if err := addMissingFields(valueInFrom.(map[string]interface{}), valueInTarget.(map[string]interface{}), keysToSkip); err != nil { - return err - } - } else if valueInFrom != nil && reflect.TypeOf(valueInFrom).Kind() == reflect.Slice && - valueInTarget != nil && reflect.TypeOf(valueInTarget).Kind() == reflect.Slice && - keyInFrom == "additionalPackages" { - // The following code explicitly handles ClusterBootstrap.Spec.AdditionalPackages(Golang slice). Not all - // Golang slices need to be handled in the same way. - /* - Example of the use case: - ClusterBootstrapTemplate has the following in AdditionalPackages: - - {refName: a, valuesFrom: {...}} - - {refName: b, valuesFrom: {...}} - - {refName: c, valuesFrom: {...}} - - ClusterBootstrap has the following in AdditionalPackages: - - {refName: a} - - {refName: c, valuesFrom: {...}} - - {refName: d} - - After addMissingFields(cbTemplate, cb, nil), we expect to get the following result in ClusterBootstrap: - - {refName: a, valuesFrom: {...}} - - {refName: b, valuesFrom: {...}} - - {refName: c, valuesFrom: {...}} - - {refName: d} - */ - - sliceInFrom := valueInFrom.([]interface{}) - sliceInTarget := valueInTarget.([]interface{}) - var updatedSlice []interface{} - for _, sliceItemInFrom := range sliceInFrom { - foundMatch := false - itemMapInFrom := sliceItemInFrom.(map[string]interface{}) - for _, sliceItemInTarget := range sliceInTarget { - itemMapInTarget := sliceItemInTarget.(map[string]interface{}) - // If two slices items match(using refName to compare), we want to add missing fields from one to another. - // e.g., {refName: a, valuesFrom: {...}} and {refName: a} matches - if itemMapInFrom["refName"].(string) == itemMapInTarget["refName"].(string) { - foundMatch = true - copiedVal, _, copyErr := unstructured.NestedFieldCopy(itemMapInFrom) - if copyErr != nil { - return copyErr - } - // unstructured.NestedFieldCopy() copies all fields, but we need to delete some fields which are meant - // to be skipped. - if removeErr := removeFields(copiedVal.(map[string]interface{}), keysToSkip); removeErr != nil { - return removeErr - } - if err := addMissingFields(copiedVal.(map[string]interface{}), itemMapInTarget, keysToSkip); err != nil { - return err - } - updatedSlice = append(updatedSlice, itemMapInTarget) - break // we expect only one match - } - } - // If there is no match, we simply add the new slice item to the final slice - if !foundMatch { - copiedVal, _, copyErr := unstructured.NestedFieldCopy(itemMapInFrom) - if copyErr != nil { - return copyErr - } - // unstructured.NestedFieldCopy() copies all fields, but we need to delete some fields which are meant - // to be skipped. - if removeErr := removeFields(copiedVal.(map[string]interface{}), keysToSkip); removeErr != nil { - return removeErr - } - updatedSlice = append(updatedSlice, copiedVal) - } - } - // there might be packages thats there in CB but not in CBT. We need to add those. - // The below loop is to figure out those packages and add it as it is in CB - for _, sliceItemInTarget := range sliceInTarget { - foundMatch := false - itemMapInTarget := sliceItemInTarget.(map[string]interface{}) - for _, sliceItemInFrom := range sliceInFrom { - itemMapInFrom := sliceItemInFrom.(map[string]interface{}) - if itemMapInFrom["refName"].(string) == itemMapInTarget["refName"].(string) { - foundMatch = true - break - } - } - if !foundMatch { - copiedVal, _, copyErr := unstructured.NestedFieldCopy(itemMapInTarget) - if copyErr != nil { - return copyErr - } - updatedSlice = append(updatedSlice, copiedVal) - } - } - destination[keyInFrom] = updatedSlice - } - } - } - return nil -} - -// removeFields deletes the map entries by comparing the keys with keysToRemove -func removeFields(m, keysToRemove map[string]interface{}) error { - if len(keysToRemove) == 0 { - return nil - } - for key, value := range m { - _, exist := keysToRemove[key] - if exist { - // Delete the field and continue to scan next key - delete(m, key) - continue - } - if value != nil && reflect.TypeOf(value).Kind() == reflect.Map { - // If value is a map, recursively look into it - if err := removeFields(value.(map[string]interface{}), keysToRemove); err != nil { - return err - } - } - } - return nil -} - -// HandleExistingClusterBootstrap does the following: -// 1. Check the annotation from the existing ClusterBootstrap CR. Add missing fields to the ClusterBootstrap CR if needed -// 2. Clone the referenced object of ClusterBootstrapPackage.ValuesFrom into the cluster namespace. If the referenced -// object has embedded TypedLocalObjectReference(e.g., CPI has VSphereCPIConfig as valuesFrom, VSphereCPIConfig has -// a Secret reference under its Spec), this function clones the embedded object into the cluster namespace as well. -// 3. Add OwnerReferences and Labels to the cloned objects. -func (h *Helper) HandleExistingClusterBootstrap(clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, cluster *clusterapiv1beta1.Cluster, tkrName, systemNamespace string) (*runtanzuv1alpha3.ClusterBootstrap, error) { //nolint - packages := append([]*runtanzuv1alpha3.ClusterBootstrapPackage{ - clusterBootstrap.Spec.CNI, - clusterBootstrap.Spec.CPI, - clusterBootstrap.Spec.CSI, - clusterBootstrap.Spec.Kapp, - }, clusterBootstrap.Spec.AdditionalPackages...) - - if annotationValue, annotationExist := clusterBootstrap.Annotations[constants.AddCBMissingFieldsAnnotationKey]; annotationExist { - tkrName = annotationValue - clusterBootstrapTemplateName := annotationValue // TanzuKubernetesRelease and ClusterBootstrapTemplate share the same name - clusterBootstrapTemplate := &runtanzuv1alpha3.ClusterBootstrapTemplate{} - // Get the ClusterBootstrapTemplate mentioned in the annotation under system namespace - if err := h.K8sClient.Get(h.Ctx, client.ObjectKey{Namespace: systemNamespace, Name: clusterBootstrapTemplateName}, clusterBootstrapTemplate); err != nil { - return nil, err - } - - // Update the packages slice to make it only contains the ones we want the rest of the code to do the cloning. - // For cloning, we only care about the ClusterBootstrap packages which have no valuesFrom originally. The missing - // valuesFrom field will be added by AddMissingSpecFieldsFromTemplate() in few lines below, and we want to clone - // those packages from system namespace. - var nilValuesFromPackages []*runtanzuv1alpha3.ClusterBootstrapPackage - for _, cbPackage := range packages { - if cbPackage != nil && cbPackage.ValuesFrom == nil { - nilValuesFromPackages = append(nilValuesFromPackages, cbPackage) - } - } - - var nonEmptyInlinePackages []*runtanzuv1alpha3.ClusterBootstrapPackage - for _, cbPackage := range packages { - if cbPackage != nil && cbPackage.ValuesFrom != nil && cbPackage.ValuesFrom.Inline != nil { - nonEmptyInlinePackages = append(nonEmptyInlinePackages, cbPackage) - } - } - - if _, ok := clusterBootstrap.Annotations[constants.UnmanagedCNI]; ok { - clusterBootstrapTemplate.Spec.CNI = clusterBootstrap.Spec.CNI - } - - if err := h.AddMissingSpecFieldsFromTemplate(clusterBootstrapTemplate, clusterBootstrap, nil); err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to add missing spec fields of ClusterBootstrap %s/%s from ClusterBootstrapTemplate %s/%s", - clusterBootstrap.Namespace, clusterBootstrap.Name, clusterBootstrapTemplate.Namespace, clusterBootstrapTemplate.Name)) - return nil, err - } - - // AddMissingSpecFieldsFromTemplate() updates clusterBootstrap.Spec, it holds the updated pointers now. - // Declaring updatedCBPackages is to compare with original nilValuesFromPackages and figure out which packages - // need to be cloned. - updatedCBPackages := append([]*runtanzuv1alpha3.ClusterBootstrapPackage{ - clusterBootstrap.Spec.CNI, - clusterBootstrap.Spec.CPI, - clusterBootstrap.Spec.CSI, - clusterBootstrap.Spec.Kapp, - }, clusterBootstrap.Spec.AdditionalPackages...) - - var packagesToBeCloned []*runtanzuv1alpha3.ClusterBootstrapPackage - for _, nilValuesFromPackage := range nilValuesFromPackages { - for _, updatedCBPackage := range updatedCBPackages { - // If the nilValuesFromPackage has been filled by AddMissingSpecFieldsFromTemplate(), it is the package - // we want to record and do cloning. - if updatedCBPackage != nil && updatedCBPackage.ValuesFrom != nil && updatedCBPackage.RefName == nilValuesFromPackage.RefName { - packagesToBeCloned = append(packagesToBeCloned, updatedCBPackage) - } - } - } - h.Logger.Info("Updating packagesToBeCloned with inline packages") - packagesToBeCloned = append(packagesToBeCloned, nonEmptyInlinePackages...) - packages = packagesToBeCloned - } else { - // packages with values from inline need to be cloned for two cases: - // - // 1. When no Clusterbootstrap is given by user and clusterbootstraptemplate - // is cloned as clusterbootstrap but resolved tkr is not set - In this - // case the providers are already cloned so providers do not have to be cloned again - // - // 2. When full clusterbootstrap without tkr annotation is given by user. - // In this case we only want to handle inline packages for creating - // secret. The providers are expected to be present in the - // clusternamespace, created by user before clusterbootstrap is created. - var nonEmptyInlinePackages []*runtanzuv1alpha3.ClusterBootstrapPackage - for _, cbPackage := range packages { - if cbPackage != nil && cbPackage.ValuesFrom != nil && cbPackage.ValuesFrom.Inline != nil { - nonEmptyInlinePackages = append(nonEmptyInlinePackages, cbPackage) - } - } - var packagesToBeCloned []*runtanzuv1alpha3.ClusterBootstrapPackage - packagesToBeCloned = append(packagesToBeCloned, nonEmptyInlinePackages...) - packages = packagesToBeCloned - } - - secrets, _, err := h.CloneReferencedObjectsFromCBPackages(cluster, packages, systemNamespace) - if err != nil { - h.Logger.Error(err, "unable to clone secrets or providers") - return nil, err - } - - // We need to verify that all the listed prvoiders in the clusterbootstrap with fromRef exist - providers, err := h.verifyProvidersFromRefExist(clusterBootstrap) - if err != nil { - h.Logger.Error(err, "could not verify all providers listed with providerRef in clusterbootstrap exists") - return nil, err - } - if err := h.AddClusterOwnerRef(cluster, providers, nil, nil); err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to add cluster %s/%s as owner reference to providers", cluster.Namespace, cluster.Name)) - } - - clusterBootstrap.OwnerReferences = []metav1.OwnerReference{ - { - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - Controller: pointer.BoolPtr(true), - BlockOwnerDeletion: pointer.BoolPtr(true), - }, - } - if err := h.K8sClient.Update(h.Ctx, clusterBootstrap); err != nil { - return nil, err - } - clusterBootstrap.Status.ResolvedTKR = tkrName - if err := h.K8sClient.Status().Update(h.Ctx, clusterBootstrap); err != nil { - return nil, err - } - - // all providers have the clusterboostrap added as controller owner reference. - if err := h.EnsureOwnerRef(clusterBootstrap, secrets, providers); err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to ensure ClusterBootstrap %s/%s as a ownerRef on created secrets and providers", clusterBootstrap.Namespace, clusterBootstrap.Name)) - return nil, err - } - - return clusterBootstrap, nil -} -func (h *Helper) verifyProvidersFromRefExist(clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap) ([]*unstructured.Unstructured, error) { - - providers := []*unstructured.Unstructured{} - cbPkgs, err := h.getListOfPkgsWithProviderRefNames(clusterBootstrap) - if err != nil { - return nil, err - } - - for _, pkg := range cbPkgs { - gvr, err := h.GVRHelper.GetGVR(schema.GroupKind{Group: *pkg.ValuesFrom.ProviderRef.APIGroup, Kind: pkg.ValuesFrom.ProviderRef.Kind}) - if err != nil { - h.Logger.Error(err, "failed to getGVR") - return nil, err - } - provider, err := h.DynamicClient.Resource(*gvr).Namespace(clusterBootstrap.Namespace).Get(h.Ctx, pkg.ValuesFrom.ProviderRef.Name, metav1.GetOptions{}) - if err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to fetch provider %s/%s", clusterBootstrap.Namespace, pkg.ValuesFrom.ProviderRef.Name), "gvr", gvr) - return nil, err - } - providers = append(providers, provider) - } - return providers, nil -} - -func (h *Helper) getListOfPkgsWithProviderRefNames(clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap) ([]*runtanzuv1alpha3.ClusterBootstrapPackage, error) { - - cbPkgs := []*runtanzuv1alpha3.ClusterBootstrapPackage{} - - possiblePackages := append([]*runtanzuv1alpha3.ClusterBootstrapPackage{ - clusterBootstrap.Spec.CNI, - clusterBootstrap.Spec.CPI, - clusterBootstrap.Spec.CSI, - clusterBootstrap.Spec.Kapp, - }, clusterBootstrap.Spec.AdditionalPackages...) - for _, pkg := range possiblePackages { - if pkg == nil || pkg.ValuesFrom == nil || pkg.ValuesFrom.ProviderRef == nil { - continue - } - cbPkgs = append(cbPkgs, pkg) - } - - return cbPkgs, nil -} - -// CreateClusterBootstrapFromTemplate does the following: -// 1. Create a new ClusterBootstrap CR under the cluster namespace -// 2. Clone the referenced object of ClusterBootstrapPackage.ValuesFrom into the cluster namespace. If the referenced -// object has embedded TypedLocalObjectReference(e.g., CPI has VSphereCPIConfig as valuesFrom, VSphereCPIConfig has -// a Secret reference under its Spec), this function clones the embedded object into the cluster namespace as well. -// 3. Add OwnerReferences and Labels to the cloned objects. -func (h *Helper) CreateClusterBootstrapFromTemplate( - clusterBootstrapTemplate *runtanzuv1alpha3.ClusterBootstrapTemplate, - cluster *clusterapiv1beta1.Cluster, - tkrName string) (*runtanzuv1alpha3.ClusterBootstrap, error) { - - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - clusterBootstrap.Name = cluster.Name - clusterBootstrap.Namespace = cluster.Namespace - clusterBootstrap.Spec = clusterBootstrapTemplate.Spec.DeepCopy() - - packages := append([]*runtanzuv1alpha3.ClusterBootstrapPackage{ - clusterBootstrap.Spec.CNI, - clusterBootstrap.Spec.CPI, - clusterBootstrap.Spec.CSI, - clusterBootstrap.Spec.Kapp, - }, clusterBootstrap.Spec.AdditionalPackages...) - - secrets, providers, err := h.CloneReferencedObjectsFromCBPackages(cluster, packages, clusterBootstrapTemplate.Namespace) - if err != nil { - h.Logger.Error(err, "unable to clone secrets or providers") - return nil, err - } - - clusterBootstrap.OwnerReferences = []metav1.OwnerReference{ - { - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - Controller: pointer.BoolPtr(true), - BlockOwnerDeletion: pointer.BoolPtr(true), - }, - } - - if err := h.K8sClient.Create(h.Ctx, clusterBootstrap); err != nil { - return nil, err - } - - // ensure ownerRef of clusterBootstrap on created secrets and providers, this can only be done after - // clusterBootstrap is created - if err := h.EnsureOwnerRef(clusterBootstrap, secrets, providers); err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to ensure ClusterBootstrap %s/%s as a ownerRef on created secrets and providers", clusterBootstrap.Namespace, clusterBootstrap.Name)) - return nil, err - } - - clusterBootstrap.Status.ResolvedTKR = tkrName - if err := h.K8sClient.Status().Update(h.Ctx, clusterBootstrap); err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to update the status of ClusterBootstrap %s/%s", clusterBootstrap.Namespace, clusterBootstrap.Name)) - return nil, err - } - h.Logger.Info("created clusterBootstrap", "clusterBootstrap", clusterBootstrap) - - return clusterBootstrap, nil -} - -// CloneReferencedObjectsFromCBPackages clones all referenced objects of a list of ClusterBootstrapPackage.ValuesFrom from -// sourceNamespace into the cluster namespace. -func (h *Helper) CloneReferencedObjectsFromCBPackages( - cluster *clusterapiv1beta1.Cluster, - cbPackages []*runtanzuv1alpha3.ClusterBootstrapPackage, - sourceNamespace string) ([]*corev1.Secret, []*unstructured.Unstructured, error) { - - var createdProviders []*unstructured.Unstructured - var createdSecrets []*corev1.Secret - - for _, cbPackage := range cbPackages { - if cbPackage == nil { - continue - } - - // cbPackage.RefName is usually the same as Carvel Package.Metadata.Name which is . - // carvelPkgRefName is Carvel Package.Spec.RefName - carvelPkgRefName, _, err := util.GetPackageMetadata(h.Ctx, h.AggregateAPIResourcesClient, cbPackage.RefName, cluster.Namespace) - if carvelPkgRefName == "" || err != nil { - // Package.Spec.RefName and Package.Spec.Version are required fields for Package CR. We do not expect them to be - // empty and error should not happen when fetching them from a Package CR. - h.Logger.Error(err, fmt.Sprintf("unable to fetch Package.Spec.RefName or Package.Spec.Version from Package %s/%s", - cluster.Namespace, cbPackage.RefName)) - return nil, nil, err - } - - secret, provider, err := h.cloneReferencedObjectsFromCBPackage(cluster, cbPackage, carvelPkgRefName, sourceNamespace) - if err != nil { - return nil, nil, err - } - if secret != nil { - createdSecrets = append(createdSecrets, secret) - } - if provider != nil { - createdProviders = append(createdProviders, provider) - } - } - return createdSecrets, createdProviders, nil -} - -// cloneReferencedObjectsFromCBPackage is an internal function clones the referenced objects of a single ClusterBootstrapPackage.ValuesFrom -// from sourceNamespace into the cluster namespace. -func (h *Helper) cloneReferencedObjectsFromCBPackage( - cluster *clusterapiv1beta1.Cluster, - clusterBootstrapPkg *runtanzuv1alpha3.ClusterBootstrapPackage, - carvelPkgRefName string, - sourceNamespace string) (*corev1.Secret, *unstructured.Unstructured, error) { - - if clusterBootstrapPkg.ValuesFrom == nil { - // Nothing to be cloned - return nil, nil, nil - } - - if clusterBootstrapPkg.ValuesFrom.Inline != nil { - secret, err := h.CreateSecretFromInline(cluster, clusterBootstrapPkg, carvelPkgRefName) - if err != nil { - return nil, nil, err - } - return secret, nil, nil - } - - if clusterBootstrapPkg.ValuesFrom.SecretRef != "" { - secret, err := h.cloneSecretRef(cluster, clusterBootstrapPkg, carvelPkgRefName, sourceNamespace) - if err != nil { - return nil, nil, err - } - return secret, nil, nil - } - - if clusterBootstrapPkg.ValuesFrom.ProviderRef != nil { - provider, err := h.cloneProviderRef(cluster, clusterBootstrapPkg, carvelPkgRefName, sourceNamespace) - if err != nil { - return nil, nil, err - } - return nil, provider, nil - } - return nil, nil, nil -} - -// CreateSecretFromInline is an internal function creates a Secret resource from ClusterBootstrapPackage.ValuesFrom.Inline into the cluster namespace -func (h *Helper) CreateSecretFromInline( - cluster *clusterapiv1beta1.Cluster, - cbPkg *runtanzuv1alpha3.ClusterBootstrapPackage, - carvelPkgRefName string) (*corev1.Secret, error) { - - inlineSecret := &corev1.Secret{} - inlineSecret.Name = util.GeneratePackageSecretName(cluster.Name, carvelPkgRefName) - // The secret will be created or patched under tkg-system namespace on remote cluster - inlineSecret.Namespace = cluster.Namespace - - return h.CreateOrPatchInlineSecret(cluster, cbPkg, inlineSecret) -} - -// CreateOrPatchInlineSecret is a function that creates or patches a Secret resource from ClusterBootstrapPackage.ValuesFrom.Inline into the cluster namespace -func (h *Helper) CreateOrPatchInlineSecret( - cluster *clusterapiv1beta1.Cluster, - cbPkg *runtanzuv1alpha3.ClusterBootstrapPackage, - inlineSecret *corev1.Secret) (*corev1.Secret, error) { - - inlineSecret.Type = corev1.SecretTypeOpaque - opResult, createOrPatchErr := controllerutil.CreateOrPatch(h.Ctx, h.K8sClient, inlineSecret, func() error { - clusterOwnerRef := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - } - inlineSecret.OwnerReferences = clusterapiutil.EnsureOwnerRef(inlineSecret.OwnerReferences, clusterOwnerRef) - - if inlineSecret.StringData == nil { - inlineSecret.StringData = make(map[string]string) - } - inlineConfigYamlBytes, err := yaml.Marshal(cbPkg.ValuesFrom.Inline) - if err != nil { - h.Logger.Error(err, "unable to marshal inline ValuesFrom") - return err - } - inlineSecret.StringData[constants.TKGDataValueFileName] = string(inlineConfigYamlBytes) - - // Add cluster and package labels to cloned secrets - if inlineSecret.Labels == nil { - inlineSecret.Labels = make(map[string]string) - } - inlineSecret.Labels[addontypes.PackageNameLabel] = util.ParseStringForLabel(cbPkg.RefName) - inlineSecret.Labels[addontypes.ClusterNameLabel] = cluster.Name - // Set secret.Type to ClusterBootstrapManagedSecret to enable us to Watch these secrets - inlineSecret.Type = constants.ClusterBootstrapManagedSecret - return nil - }) - if createOrPatchErr != nil { - return nil, createOrPatchErr - } - h.Logger.Info(fmt.Sprintf("Secret %s/%s for inline ValuesFrom %s", inlineSecret.Namespace, inlineSecret.Name, opResult)) - return inlineSecret, nil -} - -// cloneSecretRef is an internal function clones the referenced objects of a single ClusterBootstrapPackage.ValuesFrom.SecretRef -// from sourceNamespace into the cluster namespace. -func (h *Helper) cloneSecretRef( - cluster *clusterapiv1beta1.Cluster, - cbPkg *runtanzuv1alpha3.ClusterBootstrapPackage, - carvelPkgRefName string, - sourceNamespace string) (*corev1.Secret, error) { - - if cbPkg.ValuesFrom.SecretRef == "" { - return nil, nil - } - - secret := &corev1.Secret{} - key := client.ObjectKey{Namespace: sourceNamespace, Name: cbPkg.ValuesFrom.SecretRef} - if err := h.K8sClient.Get(h.Ctx, key, secret); err != nil { - h.Logger.Error(err, "unable to fetch secret", "objectkey", key) - return nil, err - } - - newSecret := secret.DeepCopy() - newSecret.ObjectMeta.Reset() - newSecret.Name = util.GeneratePackageSecretName(cluster.Name, carvelPkgRefName) - newSecret.Namespace = cluster.Namespace - - opResult, createOrPatchErr := controllerutil.CreateOrPatch(h.Ctx, h.K8sClient, newSecret, func() error { - newSecret.OwnerReferences = []metav1.OwnerReference{ - { - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - }, - } - - // Add cluster and package labels to cloned secrets - if newSecret.Labels == nil { - newSecret.Labels = map[string]string{} - } - newSecret.Labels[addontypes.PackageNameLabel] = util.ParseStringForLabel(cbPkg.RefName) - newSecret.Labels[addontypes.ClusterNameLabel] = cluster.Name - // Set secret.Type to ClusterBootstrapManagedSecret to enable clusterbootstrap_controller to Watch these secrets - newSecret.Type = constants.ClusterBootstrapManagedSecret - return nil - }) - if createOrPatchErr != nil { - return nil, createOrPatchErr - } - h.Logger.Info(fmt.Sprintf("Secret %s/%s %s", newSecret.Namespace, newSecret.Name, opResult)) - cbPkg.ValuesFrom.SecretRef = newSecret.Name - - return newSecret, nil -} - -// cloneProviderRef is an internal function clones the referenced objects of a single ClusterBootstrapPackage.ValuesFrom.ProviderRef -// from sourceNamespace into the cluster namespace. -func (h *Helper) cloneProviderRef( - cluster *clusterapiv1beta1.Cluster, - cbPkg *runtanzuv1alpha3.ClusterBootstrapPackage, - carvelPkgRefName string, - sourceNamespace string) (*unstructured.Unstructured, error) { - - if cbPkg.ValuesFrom == nil { - return nil, nil - } - - var newProvider *unstructured.Unstructured - var createdOrUpdatedProvider *unstructured.Unstructured - gvr, err := h.GVRHelper.GetGVR(schema.GroupKind{Group: *cbPkg.ValuesFrom.ProviderRef.APIGroup, Kind: cbPkg.ValuesFrom.ProviderRef.Kind}) - if err != nil { - h.Logger.Error(err, "failed to getGVR") - return nil, err - } - provider, err := h.DynamicClient.Resource(*gvr).Namespace(sourceNamespace).Get(h.Ctx, cbPkg.ValuesFrom.ProviderRef.Name, metav1.GetOptions{}) - if err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to fetch provider %s/%s", sourceNamespace, cbPkg.ValuesFrom.ProviderRef.Name), "gvr", gvr) - return nil, err - } - newProvider = provider.DeepCopy() - unstructured.RemoveNestedField(newProvider.Object, "metadata") - newProvider.SetOwnerReferences([]metav1.OwnerReference{ - { - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, - Name: cluster.Name, - UID: cluster.UID, - }, - }) - // Add cluster and package labels to cloned providers - providerLabels := newProvider.GetLabels() - if providerLabels == nil { - newProvider.SetLabels(map[string]string{ - // A package refName could contain characters that K8S does not like as a label value. - // For example, kapp-controller.tanzu.vmware.com.0.30.0+vmware.1-tkg.1 is a - // valid package refName, but it contains "+" that K8S complains. We parse the refName by replacing - // + to ---. - addontypes.PackageNameLabel: util.ParseStringForLabel(cbPkg.RefName), - addontypes.ClusterNameLabel: cluster.Name, - }) - } else { - providerLabels[addontypes.PackageNameLabel] = util.ParseStringForLabel(cbPkg.RefName) - providerLabels[addontypes.ClusterNameLabel] = cluster.Name - newProvider.SetLabels(providerLabels) - } - - newProvider.SetName(util.GeneratePackageSecretName(cluster.Name, carvelPkgRefName)) - newProvider.SetNamespace(cluster.Namespace) - h.Logger.Info(fmt.Sprintf("cloning provider %s/%s to namespace %s", sourceNamespace, newProvider.GetName(), cluster.Namespace), "gvr", gvr) - createdOrUpdatedProvider, err = h.DynamicClient.Resource(*gvr).Namespace(cluster.Namespace).Create(h.Ctx, newProvider, metav1.CreateOptions{}) - if err != nil { - if apierrors.IsAlreadyExists(err) { - h.Logger.Info(fmt.Sprintf("provider %s/%s already exist, patching its Labels and OwnerReferences fields", newProvider.GetNamespace(), newProvider.GetName())) - // Instantiate an empty unstructured and only set ownerReferences and Labels for patching - patchObj := unstructured.Unstructured{} - patchObj.SetLabels(newProvider.GetLabels()) - patchObj.SetOwnerReferences(newProvider.GetOwnerReferences()) - patchData, err := patchObj.MarshalJSON() - if err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to patch provider %s/%s", newProvider.GetNamespace(), newProvider.GetName()), "gvr", gvr) - return nil, err - } - createdOrUpdatedProvider, err = h.DynamicClient.Resource(*gvr).Namespace(cluster.Namespace).Patch(h.Ctx, newProvider.GetName(), types.MergePatchType, patchData, metav1.PatchOptions{}) - if err != nil { - h.Logger.Info(fmt.Sprintf("unable to update provider %s/%s", newProvider.GetNamespace(), newProvider.GetName()), "gvr", gvr) - return nil, err - } - } else { - h.Logger.Error(err, fmt.Sprintf("unable to clone provider %s/%s", newProvider.GetNamespace(), newProvider.GetName()), "gvr", gvr) - return nil, err - } - } - - cbPkg.ValuesFrom.ProviderRef.Name = createdOrUpdatedProvider.GetName() - h.Logger.Info(fmt.Sprintf("cloned provider %s/%s to namespace %s", createdOrUpdatedProvider.GetNamespace(), createdOrUpdatedProvider.GetName(), cluster.Namespace), "gvr", gvr) - - if err := h.cloneEmbeddedLocalObjectRef(cluster, provider); err != nil { - return nil, err - } - - return createdOrUpdatedProvider, nil -} - -// cloneEmbeddedLocalObjectRef is an internal function attempts to clone the embedded local object references from provider's namespace to cluster's -// namespace. An example of embedded local object reference is the secret reference under CPIConfig. -func (h *Helper) cloneEmbeddedLocalObjectRef(cluster *clusterapiv1beta1.Cluster, provider *unstructured.Unstructured) error { - groupKindNamesMap := util.ExtractTypedLocalObjectRef(provider.UnstructuredContent(), constants.LocalObjectRefSuffix) - if len(groupKindNamesMap) == 0 { - return nil - } - - providerGVK := provider.GroupVersionKind() - h.Logger.Info(fmt.Sprintf("cloning the embedded local object references within provider: %s with name: %s from"+ - " %s namespace to %s namespace", provider.GroupVersionKind().String(), provider.GetName(), provider.GetNamespace(), cluster.Namespace)) - for groupKind, resourceNames := range groupKindNamesMap { - gvr, err := h.GVRHelper.GetGVR(groupKind) - if err != nil { - // error has been logged within getGVR() - return err - } - for _, resourceName := range resourceNames { - h.Logger.Info(fmt.Sprintf("cloning the GVR %s with name %s from %s namespace to %s namespace", - gvr.String(), resourceName, provider.GetNamespace(), cluster.Namespace)) - fetchedObj, err := h.DynamicClient.Resource(*gvr).Namespace(provider.GetNamespace()).Get(h.Ctx, resourceName, metav1.GetOptions{}) - if err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to get provider: %s with name: %s under namespace: %s", - providerGVK.String(), provider.GetName(), provider.GetNamespace())) - return err - } - - copiedObj := fetchedObj.DeepCopy() - // Remove resourceVersion to make sure dynamicClient create could work. We should not set resourceVersion on object creation - unstructured.RemoveNestedField(copiedObj.Object, "metadata", "resourceVersion") - copiedObj.SetNamespace(cluster.Namespace) - ownerReferences := copiedObj.GetOwnerReferences() - ownerReferences = clusterapiutil.EnsureOwnerRef(ownerReferences, metav1.OwnerReference{ - APIVersion: provider.GetAPIVersion(), - Kind: provider.GetKind(), - Name: provider.GetName(), - UID: provider.GetUID(), - }) - ownerReferences = clusterapiutil.EnsureOwnerRef(ownerReferences, metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: "Cluster", - Name: cluster.GetName(), - UID: cluster.GetUID(), - }) - copiedObj.SetOwnerReferences(ownerReferences) - _, err = h.DynamicClient.Resource(*gvr).Namespace(cluster.Namespace).Create(h.Ctx, copiedObj, metav1.CreateOptions{}) - if err != nil { - if apierrors.IsAlreadyExists(err) { - // Only patch the ownerReferences - patchObj := unstructured.Unstructured{} - patchObj.SetOwnerReferences(ownerReferences) - var jsonData []byte - if jsonData, err = patchObj.MarshalJSON(); err != nil { - return err - } - _, err = h.DynamicClient.Resource(*gvr).Namespace(cluster.Namespace).Patch(h.Ctx, copiedObj.GetName(), types.MergePatchType, jsonData, metav1.PatchOptions{}) - if err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to clone the GVR %s with name %s from namespace %s to"+ - " target namespace %s", gvr.String(), resourceName, provider.GetNamespace(), cluster.Namespace)) - return err - } - } else { - h.Logger.Error(err, fmt.Sprintf("unable to clone the GVR %s with name %s from namespace %s to"+ - " target namespace %s", gvr.String(), resourceName, provider.GetNamespace(), cluster.Namespace)) - return err - } - } - } - } - h.Logger.Info(fmt.Sprintf("cloned the embedded local object references within provider: %s with name: %s under"+ - " namespace: %s to target namespace %s", providerGVK.String(), provider.GetName(), provider.GetNamespace(), cluster.Namespace)) - return nil -} - -func (h *Helper) getListOfExistingProviders(clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap) ([]*unstructured.Unstructured, error) { - // returns a slice of providers listed in the clusterbootstrap and that have been verified to exist. - providers := []*unstructured.Unstructured{} - cbPkgs, err := h.getListOfPkgsWithProviderRefNames(clusterBootstrap) - if err != nil { - return nil, err - } - for _, pkg := range cbPkgs { - gvr, err := h.GVRHelper.GetGVR(schema.GroupKind{Group: *pkg.ValuesFrom.ProviderRef.APIGroup, Kind: pkg.ValuesFrom.ProviderRef.Kind}) - if err != nil { - h.Logger.Error(err, "failed to getGVR") - return nil, err - } - provider, err := h.DynamicClient.Resource(*gvr).Namespace(clusterBootstrap.Namespace).Get(h.Ctx, pkg.ValuesFrom.ProviderRef.Name, metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - continue - } - if err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to fetch provider %s/%s", clusterBootstrap.Namespace, pkg.ValuesFrom.ProviderRef.Name), "gvr", gvr) - return nil, err - } - providers = append(providers, provider) - } - return providers, nil -} - -func (h *Helper) AddClusterOwnerRefToExistingProviders(cluster *clusterapiv1beta1.Cluster, clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap) error { - - exsitingProviders, err := h.getListOfExistingProviders(clusterBootstrap) - if err != nil { - return err - } - if err = h.AddClusterOwnerRef(cluster, exsitingProviders, nil, nil); err != nil { - return err - } - return nil -} - -// AddClusterOwnerRef adds cluster as an owner reference to the children with given controller and blockownerdeletion settings -func (h *Helper) AddClusterOwnerRef(cluster *clusterapiv1beta1.Cluster, children []*unstructured.Unstructured, controller, blockownerdeletion *bool) error { - ownerRef := metav1.OwnerReference{ - APIVersion: clusterapiv1beta1.GroupVersion.String(), - Kind: cluster.Kind, // kind is empty after create - Name: cluster.Name, - UID: cluster.UID, - Controller: controller, - BlockOwnerDeletion: blockownerdeletion, - } - // check that none of the children is owned by another cluster - for _, child := range children { - differentClusterName := ownedByDifferentCluster(child, cluster) - if differentClusterName != "" { - err := fmt.Errorf("%s/%s is already owned by %s", child.GetNamespace(), child.GetName(), differentClusterName) - return err - } - } - return h.setOwnerRef(&ownerRef, children) -} - -// Returns the name of any other cluster that owns the object, besides "cluster". -func ownedByDifferentCluster(k8SObject *unstructured.Unstructured, cluster *clusterapiv1beta1.Cluster) string { - for _, reference := range k8SObject.GetOwnerReferences() { - if reference.Kind == constants.ClusterKind && reference.Name != cluster.Name { - return reference.Name - } - } - return "" -} - -func (h *Helper) setOwnerRef(ownerRef *metav1.OwnerReference, children []*unstructured.Unstructured) error { - for _, child := range children { - gvr, err := h.GVRHelper.GetGVR(child.GroupVersionKind().GroupKind()) - if err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to get GVR of %s/%s", child.GetNamespace(), child.GetName())) - return err - } - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { - // We need to get and update, otherwise there could have concurrency issue: ["the object has been modified; please - // apply your changes to the latest version and try again"] - newChild, errGetProvider := h.DynamicClient.Resource(*gvr).Namespace(child.GetNamespace()).Get(h.Ctx, child.GetName(), metav1.GetOptions{}) - if errGetProvider != nil { - h.Logger.Error(errGetProvider, fmt.Sprintf("unable to get %s %s/%s", child.GetKind(), child.GetNamespace(), child.GetName())) - return errGetProvider - } - newChild = newChild.DeepCopy() - newChild.SetOwnerReferences(clusterapiutil.EnsureOwnerRef(newChild.GetOwnerReferences(), *ownerRef)) - _, errUpdateProvider := h.DynamicClient.Resource(*gvr).Namespace(newChild.GetNamespace()).Update(h.Ctx, newChild, metav1.UpdateOptions{}) - if errUpdateProvider != nil { - h.Logger.Error(errUpdateProvider, fmt.Sprintf("unable to update %s %s/%s", child.GetKind(), child.GetNamespace(), child.GetName())) - return errUpdateProvider - } - return nil - }) - if err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to update the OwnerRefrences for %s %s/%s", child.GetKind(), child.GetNamespace(), child.GetName())) - return err - } - } - return nil -} - -// EnsureOwnerRef will ensure the provided OwnerReference onto the secrets and provider objects -func (h *Helper) EnsureOwnerRef(clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, secrets []*corev1.Secret, providers []*unstructured.Unstructured) error { - ownerRef := metav1.OwnerReference{ - APIVersion: runtanzuv1alpha3.GroupVersion.String(), - Kind: "ClusterBootstrap", // kind is empty after create - Name: clusterBootstrap.Name, - UID: clusterBootstrap.UID, - Controller: pointer.BoolPtr(true), - BlockOwnerDeletion: pointer.BoolPtr(true), - } - - for _, secret := range secrets { - ownerRefsMutateFn := func() error { - secret.OwnerReferences = clusterapiutil.EnsureOwnerRef(secret.OwnerReferences, ownerRef) - return nil - } - _, err := controllerutil.CreateOrPatch(h.Ctx, h.K8sClient, secret, ownerRefsMutateFn) - if err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to create or patch the secret %s/%s with ownerRef", secret.Namespace, secret.Name)) - return err - } - } - for _, provider := range providers { - gvr, err := h.GVRHelper.GetGVR(provider.GroupVersionKind().GroupKind()) - if err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to get GVR of provider %s/%s", provider.GetNamespace(), provider.GetName())) - return err - } - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { - // We need to get and update, otherwise there could have concurrency issue: ["the object has been modified; please - // apply your changes to the latest version and try again"] - newProvider, errGetProvider := h.DynamicClient.Resource(*gvr).Namespace(provider.GetNamespace()).Get(h.Ctx, provider.GetName(), metav1.GetOptions{}) - if errGetProvider != nil { - h.Logger.Error(errGetProvider, fmt.Sprintf("unable to get provider %s/%s", provider.GetNamespace(), provider.GetName())) - return errGetProvider - } - newProvider = newProvider.DeepCopy() - newProvider.SetOwnerReferences(clusterapiutil.EnsureOwnerRef(newProvider.GetOwnerReferences(), ownerRef)) // This change was probably a bug. It was using provider owner references. provider owner references are set outside the retryonconflict thus they are probably stale - _, errUpdateProvider := h.DynamicClient.Resource(*gvr).Namespace(newProvider.GetNamespace()).Update(h.Ctx, newProvider, metav1.UpdateOptions{}) - if errUpdateProvider != nil { - h.Logger.Error(errUpdateProvider, fmt.Sprintf("unable to update provider %s/%s", provider.GetNamespace(), provider.GetName())) - return errUpdateProvider - } - return nil - }) - if err != nil { - h.Logger.Error(err, fmt.Sprintf("unable to update the OwnerRefrences for provider %s/%s", provider.GetNamespace(), provider.GetName())) - return err - } - } - return nil -} diff --git a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone_suite_test.go b/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone_suite_test.go deleted file mode 100644 index 2e2e74b2a6..0000000000 --- a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clusterbootstrapclone - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestClusterbootstrapclone(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "ClusterbootstrapClone Suite") -} diff --git a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone_test.go b/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone_test.go deleted file mode 100644 index 69e035cade..0000000000 --- a/addons/pkg/util/clusterbootstrapclone/clusterbootstrapclone_test.go +++ /dev/null @@ -1,1093 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clusterbootstrapclone - -import ( - "context" - "fmt" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/json" - dynamicfake "k8s.io/client-go/dynamic/fake" - k8sfake "k8s.io/client-go/kubernetes/fake" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - controllreruntimefake "sigs.k8s.io/controller-runtime/pkg/client/fake" - k8syaml "sigs.k8s.io/yaml" - - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - antreaconfigv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha2" - vspherecpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -var ( - fakeAntreaCBPackageRefName = "fake-antrea-clusterbootstrarp-package" - fakeCSICBPackageRefName = "fake-vsphere-csi-clusterbootstrarp-package" - fakePinnipedCBPackageRefName = "fake-pinniped-clusterbootstrarp-package" - fakeMetricsServerCBPackageRefName = "fake-metrics-server-clusterbootstrarp-package" -) - -var _ = Describe("ClusterbootstrapClone", func() { - var ( - helper *Helper - fakeClient client.Client - fakeClientSet *k8sfake.Clientset - fakeDynamicClient *dynamicfake.FakeDynamicClient - fakeDiscovery *testutil.FakeDiscovery - scheme *runtime.Scheme - cluster *clusterapiv1beta1.Cluster - antreaClusterbootstrapPackage *v1alpha3.ClusterBootstrapPackage - fakeAntreaCarvelPkgRefName = "antrea.vmware.com" - fakeSourceNamespace = "fake-ns" - ) - - BeforeEach(func() { - scheme = runtime.NewScheme() - _ = corev1.AddToScheme(scheme) - _ = antreaconfigv1alpha2.AddToScheme(scheme) - _ = kapppkgv1alpha1.AddToScheme(scheme) - _ = v1alpha3.AddToScheme(scheme) - - fakeClient = controllreruntimefake.NewClientBuilder().WithScheme(scheme).Build() - fakeClientSet = k8sfake.NewSimpleClientset() - fakeDiscovery = &testutil.FakeDiscovery{ - FakeDiscovery: fakeClientSet.Discovery(), - Resources: []*metav1.APIResourceList{ - { - GroupVersion: corev1.SchemeGroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "secrets", Namespaced: true, Kind: "Secret"}, - }, - }, - { - GroupVersion: antreaconfigv1alpha2.GroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "antreaconfigs", Namespaced: true, Kind: "AntreaConfig"}, - }, - }, - { - GroupVersion: vspherecpiv1alpha1.GroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "vspherecpiconfigs", Namespaced: true, Kind: "VSphereCPIConfig"}, - }, - }, - }, - } - gvrHelper := &testutil.FakeGVRHelper{DiscoveryClient: fakeDiscovery} - helper = &Helper{ - Ctx: context.TODO(), - K8sClient: fakeClient, - AggregateAPIResourcesClient: fakeClient, - DynamicClient: fakeDynamicClient, - GVRHelper: gvrHelper, - Logger: ctrl.Log.WithName("clusterbootstrap_test"), - } - }) - - Context("Verify EnsureOwnerRef()", func() { - BeforeEach(func() { - fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme, constructFakeAntreaConfig()) - helper.DynamicClient = fakeDynamicClient - }) - It("should succeed to ensure owner references", func() { - clusterbootstrap := constructFakeEmptyClusterBootstrap() - secrets := []*corev1.Secret{constructFakeSecret()} - unstructuredObj := convertToUnstructured(constructFakeAntreaConfig()) - providers := []*unstructured.Unstructured{unstructuredObj} - - err := helper.EnsureOwnerRef(clusterbootstrap, secrets, providers) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("Verify AddClusterOwnerRef()", func() { - BeforeEach(func() { - fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme, constructFakeAntreaConfig(), - constructFakeAntreaConfigWithClusterOwner("same-cluster-config", "same-cluster"), - ) - helper.DynamicClient = fakeDynamicClient - }) - It("should succeed on adding cluster as owner to orphan config", func() { - fakeCluster := constructFakeCluster() - fakeConfig := constructFakeAntreaConfig() - fakeProvider := convertToUnstructured(fakeConfig) - children := []*unstructured.Unstructured{fakeProvider} - err := helper.AddClusterOwnerRef(fakeCluster, children, nil, nil) - Expect(err).ToNot(HaveOccurred()) - }) - - It("should succeed on adding cluster as owner to config which already lists same cluster as owner", func() { - fakeCluster := constructNamespacedFakeCluster("same-cluster", "fake-cluster-ns") - fakeConfig := constructFakeAntreaConfigWithClusterOwner("same-cluster-config", fakeCluster.Name) - fakeProvider := convertToUnstructured(fakeConfig) - children := []*unstructured.Unstructured{fakeProvider} - err := helper.AddClusterOwnerRef(fakeCluster, children, nil, nil) - Expect(err).ToNot(HaveOccurred()) - }) - - It("should throw error if children has different cluster owner", func() { - fakeCluster := constructNamespacedFakeCluster("same-cluster", "fake-cluster-ns") - fakeConfig := constructFakeAntreaConfigWithClusterOwner("other-other-config", "other-cluster") - fakeProvider := convertToUnstructured(fakeConfig) - children := []*unstructured.Unstructured{fakeProvider} - err := helper.AddClusterOwnerRef(fakeCluster, children, nil, nil) - Expect(err).To(HaveOccurred()) - }) - It("should throw error if any of the children has different cluster owner", func() { - fakeCluster := constructNamespacedFakeCluster("same-cluster", "fake-cluster-ns") - fakeConfig := constructFakeAntreaConfigWithClusterOwner("same-cluster-config", fakeCluster.Name) - fakeProvider := convertToUnstructured(fakeConfig) - - fakeConfig2 := constructFakeAntreaConfigWithClusterOwner("another-cluster-config", "some-other-cluster") - fakeProvider2 := convertToUnstructured(fakeConfig2) - - children := []*unstructured.Unstructured{fakeProvider, fakeProvider2} - err := helper.AddClusterOwnerRef(fakeCluster, children, nil, nil) - Expect(err).To(HaveOccurred()) - }) - }) - - Context("Verify AddclusterOwnerRefToExistingProviders()", func() { - It("should succeed on adding cluster as owner to existing orphan config", func() { - fakeCluster := constructFakeCluster() - fakeBootstrap := constructFakeClusterBootstrap() - fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme, constructFakeAntreaConfig()) - helper.DynamicClient = fakeDynamicClient - - err := helper.AddClusterOwnerRefToExistingProviders(fakeCluster, fakeBootstrap) - Expect(err).ToNot(HaveOccurred()) - }) - It("should succeed on adding cluster as owner to config which already lists same cluster as owner", func() { - fakeBootstrap := constructFakeClusterBootstrap() - fakeAntreaConfig := constructFakeAntreaConfig() - fakeCluster := constructNamespacedFakeCluster("same-cluster", "fake-ns") - fakeAntreaConfigWithOwner := constructFakeAntreaConfigWithClusterOwner(fakeAntreaConfig.Name, fakeCluster.Name) - fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme, fakeAntreaConfigWithOwner) - helper.DynamicClient = fakeDynamicClient - - err := helper.AddClusterOwnerRefToExistingProviders(fakeCluster, fakeBootstrap) - Expect(err).ToNot(HaveOccurred()) - }) - It("should throw error if config has different cluster owner", func() { - fakeBootstrap := constructFakeClusterBootstrap() - fakeAntreaConfig := constructFakeAntreaConfig() - fakeCluster := constructNamespacedFakeCluster("same-cluster", "fake-ns") - fakeAntreaConfigWithOwner := constructFakeAntreaConfigWithClusterOwner(fakeAntreaConfig.Name, "someothercluster") - fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme, fakeAntreaConfigWithOwner) - helper.DynamicClient = fakeDynamicClient - - err := helper.AddClusterOwnerRefToExistingProviders(fakeCluster, fakeBootstrap) - Expect(err).To(HaveOccurred()) - }) - It("should handle non existing config ", func() { - fakeBootstrap := constructFakeClusterBootstrap() - fakeCluster := constructNamespacedFakeCluster("same-cluster", "fake-ns") - fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme) - helper.DynamicClient = fakeDynamicClient - - err := helper.AddClusterOwnerRefToExistingProviders(fakeCluster, fakeBootstrap) - Expect(err).ToNot(HaveOccurred()) - }) - - }) - - Context("Verify cloneEmbeddedLocalObjectRef()", func() { - BeforeEach(func() { - fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme, constructFakeAntreaConfig(), constructFakeVSphereCPIConfig(), constructFakeSecret()) - helper.DynamicClient = fakeDynamicClient - }) - It("should succeed when provider does not have embedded local object reference", func() { - fakeCluster := constructFakeCluster() - fakeProvider := convertToUnstructured(constructFakeAntreaConfig()) - err := helper.cloneEmbeddedLocalObjectRef(fakeCluster, fakeProvider) - Expect(err).NotTo(HaveOccurred()) - }) - It("should succeed when provider has embedded local object reference", func() { - fakeCluster := constructFakeCluster() - fakeProvider := convertToUnstructured(constructFakeVSphereCPIConfig()) - err := helper.cloneEmbeddedLocalObjectRef(fakeCluster, fakeProvider) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("Verify cloneProviderRef()", func() { - BeforeEach(func() { - cluster = constructFakeCluster() - antreaClusterbootstrapPackage = constructFakeClusterBootstrapPackageWithAntreaProviderRef() - }) - It("should fail if provider dose not exist", func() { - // reset dynamic client - fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme) - helper.DynamicClient = fakeDynamicClient - - createdOrUpdatedProvider, err := helper.cloneProviderRef(cluster, antreaClusterbootstrapPackage, fakeAntreaCarvelPkgRefName, fakeSourceNamespace) - Expect(err).To(HaveOccurred()) - Expect(createdOrUpdatedProvider).To(BeNil()) - }) - It("should create the new provider successfully", func() { - antreaConfig := constructFakeAntreaConfig() - fakeDynamicClient = dynamicfake.NewSimpleDynamicClient(scheme, antreaConfig) - helper.DynamicClient = fakeDynamicClient - - createdOrUpdatedProvider, err := helper.cloneProviderRef(cluster, antreaClusterbootstrapPackage, fakeAntreaCarvelPkgRefName, fakeSourceNamespace) - Expect(err).NotTo(HaveOccurred()) - Expect(createdOrUpdatedProvider.GetName()).To(Equal(fmt.Sprintf("%s-%s-package", cluster.Name, "antrea"))) - Expect(createdOrUpdatedProvider.GetNamespace()).To(Equal(cluster.Namespace)) - // previous annotations should be removed after clone - Expect(antreaConfig.Annotations).Should(HaveKey(constants.TKGAnnotationTemplateConfig)) - Expect(createdOrUpdatedProvider.GetAnnotations()).ShouldNot(HaveKey(constants.TKGAnnotationTemplateConfig)) - }) - }) - - Context("Verify cloneSecretRef()", func() { - BeforeEach(func() { - cluster = constructFakeCluster() - antreaClusterbootstrapPackage = constructFakeClusterBootstrapPackageWithSecretRef() - }) - It("should fail if secret dose not exist", func() { - createdOrUpdatedProvider, err := helper.cloneSecretRef(cluster, antreaClusterbootstrapPackage, fakeAntreaCarvelPkgRefName, fakeSourceNamespace) - Expect(err).To(HaveOccurred()) - Expect(createdOrUpdatedProvider).To(BeNil()) - }) - It("should success when the referenced secret exists", func() { - // Create the fake secret - initSecret := constructFakeSecret() - err := fakeClient.Create(context.TODO(), initSecret) - Expect(err).NotTo(HaveOccurred()) - - createdOrUpdatedSecret, err := helper.cloneSecretRef(cluster, antreaClusterbootstrapPackage, fakeAntreaCarvelPkgRefName, fakeSourceNamespace) - Expect(err).NotTo(HaveOccurred()) - Expect(createdOrUpdatedSecret).NotTo(BeNil()) - Expect(createdOrUpdatedSecret.Namespace).To(Equal(cluster.Namespace)) - }) - }) - - Context("Verify createSecretFromInline()", func() { - BeforeEach(func() { - cluster = constructFakeCluster() - antreaClusterbootstrapPackage = constructFakeClusterBootstrapPackageWithInlineRef() - }) - It("", func() { - createdSecret, err := helper.CreateSecretFromInline(cluster, antreaClusterbootstrapPackage, fakeAntreaCarvelPkgRefName) - Expect(err).NotTo(HaveOccurred()) - Expect(createdSecret).NotTo(BeNil()) - Expect(createdSecret.Namespace).To(Equal(cluster.Namespace)) - Expect(len(createdSecret.OwnerReferences)).NotTo(Equal(0)) - Expect(createdSecret.Labels[addontypes.ClusterNameLabel]).To(Equal(cluster.Name)) - Expect(createdSecret.Type).To(Equal(corev1.SecretType(constants.ClusterBootstrapManagedSecret))) - }) - }) - - Context("Verify cloneReferencedObjectsFromCBPackage()", func() { - BeforeEach(func() { - cluster = constructFakeCluster() - }) - It("should return empty objects with no error when ValuesFrom is nil", func() { - bootstrapPackage := &v1alpha3.ClusterBootstrapPackage{RefName: fakeAntreaCarvelPkgRefName} - clonedSecret, clonedProvider, err := helper.cloneReferencedObjectsFromCBPackage(cluster, bootstrapPackage, fakeAntreaCarvelPkgRefName, fakeSourceNamespace) - Expect(clonedSecret).To(BeNil()) - Expect(clonedProvider).To(BeNil()) - Expect(err).NotTo(HaveOccurred()) - }) - It("should return empty objects with no error when ValuesFrom is empty", func() { - bootstrapPackage := &v1alpha3.ClusterBootstrapPackage{RefName: fakeAntreaCarvelPkgRefName, ValuesFrom: &v1alpha3.ValuesFrom{}} - clonedSecret, clonedProvider, err := helper.cloneReferencedObjectsFromCBPackage(cluster, bootstrapPackage, fakeAntreaCarvelPkgRefName, fakeSourceNamespace) - Expect(clonedSecret).To(BeNil()) - Expect(clonedProvider).To(BeNil()) - Expect(err).NotTo(HaveOccurred()) - }) - It("should success when ValuesFrom.Inline is not empty", func() { - bootstrapPackage := constructFakeClusterBootstrapPackageWithInlineRef() - clonedSecret, clonedProvider, err := helper.cloneReferencedObjectsFromCBPackage(cluster, bootstrapPackage, fakeAntreaCarvelPkgRefName, fakeSourceNamespace) - Expect(clonedSecret).NotTo(BeNil()) - Expect(clonedProvider).To(BeNil()) - Expect(err).NotTo(HaveOccurred()) - }) - It("should success when ValuesFrom.ProviderRef is not empty", func() { - bootstrapPackage := constructFakeClusterBootstrapPackageWithAntreaProviderRef() - clonedSecret, clonedProvider, err := helper.cloneReferencedObjectsFromCBPackage(cluster, bootstrapPackage, fakeAntreaCarvelPkgRefName, fakeSourceNamespace) - Expect(clonedSecret).To(BeNil()) - Expect(clonedProvider).NotTo(BeNil()) - Expect(err).NotTo(HaveOccurred()) - }) - It("should return error when ValuesFrom.SecretRef is not empty but dose not exist", func() { - bootstrapPackage := constructFakeClusterBootstrapPackageWithSecretRef() - clonedSecret, clonedProvider, err := helper.cloneReferencedObjectsFromCBPackage(cluster, bootstrapPackage, fakeAntreaCarvelPkgRefName, fakeSourceNamespace) - Expect(clonedSecret).To(BeNil()) - Expect(clonedProvider).To(BeNil()) - Expect(apierrors.IsNotFound(err)).To(BeTrue()) - }) - }) - - Context("Verify CloneReferencedObjectsFromCBPackages()", func() { - BeforeEach(func() { - cluster = constructFakeCluster() - }) - It("should return empty objects with no error when CBPackages is empty", func() { - clonedSecrets, clonedProviders, err := helper.CloneReferencedObjectsFromCBPackages(cluster, []*v1alpha3.ClusterBootstrapPackage{}, fakeSourceNamespace) - Expect(clonedSecrets).To(BeNil()) - Expect(clonedProviders).To(BeNil()) - Expect(err).NotTo(HaveOccurred()) - }) - It("should return empty objects with error when no carvel package metadata is found", func() { - clonedSecrets, clonedProviders, err := helper.CloneReferencedObjectsFromCBPackages(cluster, - []*v1alpha3.ClusterBootstrapPackage{constructFakeClusterBootstrapPackageWithAntreaProviderRef()}, - fakeSourceNamespace) - Expect(clonedSecrets).To(BeNil()) - Expect(clonedProviders).To(BeNil()) - Expect(err).To(HaveOccurred()) - }) - It("should return nil clonedSecrets and non-nil clonedProviders when carvel package metadata is found and CB"+ - " Package has providerRef", func() { - prepareCarvelPackages(fakeClient, cluster.Namespace) - clonedSecrets, clonedProviders, err := helper.CloneReferencedObjectsFromCBPackages(cluster, - []*v1alpha3.ClusterBootstrapPackage{constructFakeClusterBootstrapPackageWithAntreaProviderRef()}, - fakeSourceNamespace) - Expect(clonedSecrets).To(BeNil()) - Expect(len(clonedProviders)).To(Equal(1)) - Expect(err).NotTo(HaveOccurred()) - }) - It("should return nil clonedSecrets and non-nil clonedProviders when carvel package metadata is found and CB"+ - " Package has secretRef", func() { - // Create a fake secret - initSecret := constructFakeSecret() - err := fakeClient.Create(context.TODO(), initSecret) - Expect(err).NotTo(HaveOccurred()) - prepareCarvelPackages(fakeClient, cluster.Namespace) - - clonedSecrets, clonedProviders, err := helper.CloneReferencedObjectsFromCBPackages(cluster, - []*v1alpha3.ClusterBootstrapPackage{constructFakeClusterBootstrapPackageWithSecretRef()}, - fakeSourceNamespace) - Expect(len(clonedSecrets)).To(Equal(1)) - Expect(clonedProviders).To(BeNil()) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("Verify HandleExistingClusterBootstrap()", func() { - var ( - clusterbootstrapTemplate *v1alpha3.ClusterBootstrapTemplate - ) - BeforeEach(func() { - cluster = constructFakeCluster() - clusterbootstrapTemplate = constructFakeClusterBootstrapTemplate() - }) - It("should return clusterbootstrap without error", func() { - - clusterBootstrap := constructFakeEmptyClusterBootstrap() - clusterBootstrap.SetAnnotations(map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: clusterbootstrapTemplate.Name, - }) - clusterBootstrap.Spec = &v1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &v1alpha3.ClusterBootstrapPackage{ - RefName: clusterbootstrapTemplate.Spec.CNI.RefName, - }, - CSI: &v1alpha3.ClusterBootstrapPackage{ - RefName: clusterbootstrapTemplate.Spec.CSI.RefName, - }, - } - prepareCarvelPackages(fakeClient, cluster.Namespace) - Expect(fakeClient.Create(context.TODO(), clusterbootstrapTemplate)).To(Succeed()) - Expect(fakeClient.Create(context.TODO(), clusterBootstrap)).To(Succeed()) - - clusterBootstrap, err := helper.HandleExistingClusterBootstrap(clusterBootstrap, cluster, clusterbootstrapTemplate.Name, clusterbootstrapTemplate.Namespace) - Expect(err).NotTo(HaveOccurred()) - Expect(clusterBootstrap).NotTo(BeNil()) - - // OwnerReference is supposed to be set - Expect(clusterBootstrap.OwnerReferences).NotTo(BeEmpty()) - // ValuesFrom is supposed to be added - Expect(clusterBootstrap.Spec.CNI.ValuesFrom).NotTo(BeNil()) - Expect(clusterBootstrap.Spec.CSI.ValuesFrom).NotTo(BeNil()) - // Status.ResolvedTKR is supposed to be set - Expect(clusterBootstrap.Status.ResolvedTKR).To(Equal(clusterbootstrapTemplate.Name)) - }) - - }) - - Context("Verify CreateClusterBootstrapFromTemplate()", func() { - var ( - clusterbootstrapTemplate *v1alpha3.ClusterBootstrapTemplate - ) - BeforeEach(func() { - cluster = constructFakeCluster() - clusterbootstrapTemplate = constructFakeClusterBootstrapTemplate() - }) - It("should return clusterbootstrap without error", func() { - prepareCarvelPackages(fakeClient, cluster.Namespace) - - clusterbootstrap, err := helper.CreateClusterBootstrapFromTemplate(clusterbootstrapTemplate, cluster, "fake-tkr-name") - Expect(err).NotTo(HaveOccurred()) - Expect(clusterbootstrap).NotTo(BeNil()) - - Expect(clusterbootstrap.Spec.CNI.RefName).To(Equal(clusterbootstrapTemplate.Spec.CNI.RefName)) - Expect(clusterbootstrap.Spec.CNI.ValuesFrom).NotTo(BeNil()) - Expect(clusterbootstrap.Spec.CSI.RefName).To(Equal(clusterbootstrapTemplate.Spec.CSI.RefName)) - Expect(clusterbootstrap.Spec.CSI.ValuesFrom).NotTo(BeNil()) - - Expect(len(clusterbootstrap.OwnerReferences)).To(Equal(1)) - Expect(clusterbootstrap.Status.ResolvedTKR).To(Equal("fake-tkr-name")) - }) - - }) - - Context("Verify AddMissingSpecFieldsFromTemplate()", func() { - var fakeClusterBootstrapTemplate *v1alpha3.ClusterBootstrapTemplate - BeforeEach(func() { - fakeClusterBootstrapTemplate = constructFakeClusterBootstrapTemplate() - }) - It("should add what ClusterBootstrapTemplate has to the empty ClusterBootstrap", func() { - clusterBootstrap := &v1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-clusterbootstrap", - Namespace: "fake-cluster-ns", - UID: "uid", - }, - Spec: &v1alpha3.ClusterBootstrapTemplateSpec{}, - } - - err := helper.AddMissingSpecFieldsFromTemplate(fakeClusterBootstrapTemplate, clusterBootstrap, nil) - Expect(err).NotTo(HaveOccurred()) - updatedClusterBootstrap := clusterBootstrap - Expect(updatedClusterBootstrap.Spec).NotTo(BeNil()) - // Expect CNI to be added - Expect(updatedClusterBootstrap.Spec.CNI).NotTo(BeNil()) - Expect(updatedClusterBootstrap.Spec.CNI.RefName).To(Equal(fakeClusterBootstrapTemplate.Spec.CNI.RefName)) - Expect(updatedClusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Name).To(Equal(fakeClusterBootstrapTemplate.Spec.CNI.ValuesFrom.ProviderRef.Name)) - Expect(updatedClusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Kind).To(Equal(fakeClusterBootstrapTemplate.Spec.CNI.ValuesFrom.ProviderRef.Kind)) - // Expect CSI to be added - Expect(updatedClusterBootstrap.Spec.CSI).NotTo(BeNil()) - Expect(updatedClusterBootstrap.Spec.CSI.RefName).To(Equal(fakeClusterBootstrapTemplate.Spec.CSI.RefName)) - Expect(updatedClusterBootstrap.Spec.CSI.ValuesFrom).NotTo(BeNil()) - Expect(len(updatedClusterBootstrap.Spec.CSI.ValuesFrom.Inline)).To(Equal(len(fakeClusterBootstrapTemplate.Spec.CSI.ValuesFrom.Inline))) - // Spec.Paused is not set in fakeClusterBootstrapTemplate, it should be false - Expect(updatedClusterBootstrap.Spec.Paused).To(BeFalse()) - // The ClusterBootstrapPackage not set in fakeClusterBootstrapTemplate. They should not be copied - Expect(updatedClusterBootstrap.Spec.CPI).To(BeNil()) - Expect(updatedClusterBootstrap.Spec.Kapp).To(BeNil()) - Expect(len(updatedClusterBootstrap.Spec.AdditionalPackages)).To(Equal(len(fakeClusterBootstrapTemplate.Spec.AdditionalPackages))) - }) - - It("should not overwrite the components which already exist", func() { - antreaAPIGroup := antreaconfigv1alpha2.GroupVersion.Group - fakeCPIClusterBootstrapPackage := constructFakeClusterBootstrapPackageWithSecretRef() - fakeCSIClusterBootstrapPackage := constructFakeClusterBootstrapPackageWithInlineRef() - // Update fakeClusterBootstrapTemplate by adding a fake CPI and CSI package - fakeClusterBootstrapTemplate.Spec.CPI = fakeCPIClusterBootstrapPackage - fakeClusterBootstrapTemplate.Spec.CSI = fakeCSIClusterBootstrapPackage - - clusterBootstrap := &v1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-clusterbootstrap", - Namespace: "fake-cluster-ns", - UID: "uid", - }, - Spec: &v1alpha3.ClusterBootstrapTemplateSpec{ - // We do not expect this part to be overwritten to be what fakeClusterBootstrapTemplate has - CNI: &v1alpha3.ClusterBootstrapPackage{ - RefName: "foo-antrea-clusterbootstrarp-package", - ValuesFrom: &v1alpha3.ValuesFrom{ - ProviderRef: &corev1.TypedLocalObjectReference{ - APIGroup: &antreaAPIGroup, - Kind: "AntreaConfig", - Name: "fooAntreaConfig", - }, - }, - }, - CSI: &v1alpha3.ClusterBootstrapPackage{ - RefName: "foo-vsphere-csi-clusterbootstrarp-package", - ValuesFrom: &v1alpha3.ValuesFrom{ - Inline: map[string]interface{}{"should-not-be-updated": true}, - }, - }, - AdditionalPackages: []*v1alpha3.ClusterBootstrapPackage{ - {RefName: fakePinnipedCBPackageRefName, ValuesFrom: &v1alpha3.ValuesFrom{Inline: map[string]interface{}{"identity_management_type": "oidc"}}}, - {RefName: "kube-vip", ValuesFrom: &v1alpha3.ValuesFrom{Inline: map[string]interface{}{"vip_address": "1.2.3.4"}}}, - }, - }, - } - - err := helper.AddMissingSpecFieldsFromTemplate(fakeClusterBootstrapTemplate, clusterBootstrap, nil) - Expect(err).NotTo(HaveOccurred()) - updatedClusterBootstrap := clusterBootstrap - Expect(updatedClusterBootstrap.Spec.CNI).NotTo(BeNil()) - // We do not expect the RefName and ValuesFrom gets overwritten if they already exist - Expect(updatedClusterBootstrap.Spec.CNI.RefName).To(Equal("foo-antrea-clusterbootstrarp-package")) - Expect(updatedClusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Kind).To(Equal("AntreaConfig")) - Expect(updatedClusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef.Name).To(Equal("fooAntreaConfig")) - Expect(updatedClusterBootstrap.Spec.CSI.RefName).To(Equal("foo-vsphere-csi-clusterbootstrarp-package")) - Expect(len(updatedClusterBootstrap.Spec.CSI.ValuesFrom.Inline)).To(Equal(1)) - Expect(updatedClusterBootstrap.Spec.CSI.ValuesFrom.Inline["should-not-be-updated"]).To(BeTrue()) - // CPI should be added to updatedClusterBootstrap - Expect(updatedClusterBootstrap.Spec.CPI).NotTo(BeNil()) - Expect(updatedClusterBootstrap.Spec.CPI.ValuesFrom.SecretRef).To(Equal(fakeCPIClusterBootstrapPackage.ValuesFrom.SecretRef)) - // The ClusterBootstrapPackage not set in fakeClusterBootstrapTemplate. They should not be copied - Expect(updatedClusterBootstrap.Spec.Kapp).To(BeNil()) - // Adding +1 since we expect kube-vip package to be there eventhough it is not in CBT - Expect(len(updatedClusterBootstrap.Spec.AdditionalPackages)).To(Equal(len(fakeClusterBootstrapTemplate.Spec.AdditionalPackages) + 1)) - for idx := 0; idx < 2; idx++ { - Expect(updatedClusterBootstrap.Spec.AdditionalPackages[idx].RefName).To(Equal(fakeClusterBootstrapTemplate.Spec.AdditionalPackages[idx].RefName)) - Expect(updatedClusterBootstrap.Spec.AdditionalPackages[idx].ValuesFrom).To(Equal(fakeClusterBootstrapTemplate.Spec.AdditionalPackages[idx].ValuesFrom)) - } - Expect(updatedClusterBootstrap.Spec.AdditionalPackages[2].RefName).To(Equal("kube-vip")) - Expect(updatedClusterBootstrap.Spec.AdditionalPackages[2].ValuesFrom).To(Equal(&v1alpha3.ValuesFrom{Inline: map[string]interface{}{"vip_address": "1.2.3.4"}})) - }) - - It("should add valuesFrom back if not specified in ClusterBootstrap", func() { - fakeCSIClusterBootstrapPackage := constructFakeClusterBootstrapPackageWithInlineRef() - // Update fakeClusterBootstrapTemplate by adding a fake CSI package - fakeClusterBootstrapTemplate.Spec.CSI = fakeCSIClusterBootstrapPackage - - clusterBootstrap := &v1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-clusterbootstrap", - Namespace: "fake-cluster-ns", - UID: "uid", - }, - Spec: &v1alpha3.ClusterBootstrapTemplateSpec{ - CSI: &v1alpha3.ClusterBootstrapPackage{ - RefName: "foo-vsphere-csi-clusterbootstrarp-package", - }, - AdditionalPackages: []*v1alpha3.ClusterBootstrapPackage{ - {RefName: fakePinnipedCBPackageRefName}, - }, - }, - } - err := helper.AddMissingSpecFieldsFromTemplate(fakeClusterBootstrapTemplate, clusterBootstrap, nil) - Expect(err).NotTo(HaveOccurred()) - updatedClusterBootstrap := clusterBootstrap - - // CNI exists in fakeClusterBootstrapTemplate, it should be added back - Expect(updatedClusterBootstrap.Spec.CNI).NotTo(BeNil()) - // CSI in fakeClusterBootstrapTemplate has valuesFrom, so valuesFrom should be added back - Expect(updatedClusterBootstrap.Spec.CSI.ValuesFrom).NotTo(BeNil()) - Expect(updatedClusterBootstrap.Spec.CSI.ValuesFrom.Inline).NotTo(BeNil()) - assertTwoMapsShouldEqual(updatedClusterBootstrap.Spec.CSI.ValuesFrom.Inline, fakeClusterBootstrapTemplate.Spec.CSI.ValuesFrom.Inline) - - Expect(len(updatedClusterBootstrap.Spec.AdditionalPackages)).To(Equal(len(fakeClusterBootstrapTemplate.Spec.AdditionalPackages))) - for idx := range updatedClusterBootstrap.Spec.AdditionalPackages { - Expect(updatedClusterBootstrap.Spec.AdditionalPackages[idx].RefName).To(Equal(fakeClusterBootstrapTemplate.Spec.AdditionalPackages[idx].RefName)) - Expect(updatedClusterBootstrap.Spec.AdditionalPackages[idx].ValuesFrom).To(Equal(fakeClusterBootstrapTemplate.Spec.AdditionalPackages[idx].ValuesFrom)) - } - }) - - It("should not add the fields which are meant to be skipped", func() { - antreaAPIGroup := antreaconfigv1alpha2.GroupVersion.Group - fakeCPIClusterBootstrapPackage := constructFakeClusterBootstrapPackageWithSecretRef() - fakeCSIClusterBootstrapPackage := constructFakeClusterBootstrapPackageWithInlineRef() - // Update fakeClusterBootstrapTemplate by adding a fake CPI and CSI package - fakeClusterBootstrapTemplate.Spec.CPI = fakeCPIClusterBootstrapPackage - fakeClusterBootstrapTemplate.Spec.CSI = fakeCSIClusterBootstrapPackage - - clusterBootstrap := &v1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-clusterbootstrap", - Namespace: "fake-cluster-ns", - UID: "uid", - }, - Spec: &v1alpha3.ClusterBootstrapTemplateSpec{ - // We do not expect this part to be overwritten to be what fakeClusterBootstrapTemplate has - CNI: &v1alpha3.ClusterBootstrapPackage{ - RefName: "foo-antrea-clusterbootstrarp-package", - ValuesFrom: &v1alpha3.ValuesFrom{ - ProviderRef: &corev1.TypedLocalObjectReference{ - APIGroup: &antreaAPIGroup, - Kind: "AntreaConfig", - Name: "fooAntreaConfig", - }, - }, - }, - CSI: &v1alpha3.ClusterBootstrapPackage{ - RefName: "foo-vsphere-csi-clusterbootstrarp-package", - ValuesFrom: &v1alpha3.ValuesFrom{ - Inline: map[string]interface{}{"should-not-be-updated": true}, - }, - }, - AdditionalPackages: []*v1alpha3.ClusterBootstrapPackage{ - {RefName: fakePinnipedCBPackageRefName}, - }, - }, - } - - err := helper.AddMissingSpecFieldsFromTemplate(fakeClusterBootstrapTemplate, clusterBootstrap, map[string]interface{}{"valuesFrom": nil}) - Expect(err).NotTo(HaveOccurred()) - updatedClusterBootstrap := clusterBootstrap - // CPI should be added to updatedClusterBootstrap - Expect(updatedClusterBootstrap.Spec.CPI).NotTo(BeNil()) - // CPI's valuesFrom should be skipped - Expect(updatedClusterBootstrap.Spec.CPI.ValuesFrom).To(BeNil()) - Expect(updatedClusterBootstrap.Spec.CPI.RefName).To(Equal(fakeClusterBootstrapTemplate.Spec.CPI.RefName)) - - Expect(len(updatedClusterBootstrap.Spec.AdditionalPackages)).To(Equal(len(fakeClusterBootstrapTemplate.Spec.AdditionalPackages))) - for idx := range updatedClusterBootstrap.Spec.AdditionalPackages { - Expect(updatedClusterBootstrap.Spec.AdditionalPackages[idx].RefName).To(Equal(fakeClusterBootstrapTemplate.Spec.AdditionalPackages[idx].RefName)) - Expect(updatedClusterBootstrap.Spec.AdditionalPackages[idx].ValuesFrom).To(BeNil()) - } - }) - - It("should not add the fields which are meant to be skipped in additionalPackages", func() { - antreaAPIGroup := antreaconfigv1alpha2.GroupVersion.Group - fakeCPIClusterBootstrapPackage := constructFakeClusterBootstrapPackageWithSecretRef() - fakeCSIClusterBootstrapPackage := constructFakeClusterBootstrapPackageWithInlineRef() - // Update fakeClusterBootstrapTemplate by adding a fake CPI and CSI package - fakeClusterBootstrapTemplate.Spec.CPI = fakeCPIClusterBootstrapPackage - fakeClusterBootstrapTemplate.Spec.CSI = fakeCSIClusterBootstrapPackage - - clusterBootstrap := &v1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-clusterbootstrap", - Namespace: "fake-cluster-ns", - UID: "uid", - }, - Spec: &v1alpha3.ClusterBootstrapTemplateSpec{ - // We do not expect this part to be overwritten to be what fakeClusterBootstrapTemplate has - CNI: &v1alpha3.ClusterBootstrapPackage{ - RefName: "foo-antrea-clusterbootstrarp-package", - ValuesFrom: &v1alpha3.ValuesFrom{ - ProviderRef: &corev1.TypedLocalObjectReference{ - APIGroup: &antreaAPIGroup, - Kind: "AntreaConfig", - Name: "fooAntreaConfig", - }, - }, - }, - }, - } - - err := helper.AddMissingSpecFieldsFromTemplate(fakeClusterBootstrapTemplate, clusterBootstrap, map[string]interface{}{"valuesFrom": nil}) - Expect(err).NotTo(HaveOccurred()) - for _, additionalPackage := range clusterBootstrap.Spec.AdditionalPackages { - Expect(additionalPackage.RefName).NotTo(BeEmpty()) - Expect(additionalPackage.ValuesFrom).To(BeNil()) - } - }) - }) - - Context("Verify CompleteCBPackageRefNamesFromTKR()", func() { - It("should complete the partial filled RefName if there is a match", func() { - clusterBootstrap := constructFakeEmptyClusterBootstrap() - clusterBootstrap.Spec = &v1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &v1alpha3.ClusterBootstrapPackage{ - RefName: "calico*", - ValuesFrom: &v1alpha3.ValuesFrom{ - Inline: map[string]interface{}{"foo": "bar"}, - }, - }, - AdditionalPackages: []*v1alpha3.ClusterBootstrapPackage{ - {RefName: "pinniped*", ValuesFrom: &v1alpha3.ValuesFrom{Inline: map[string]interface{}{"identity_management_type": "oidc"}}}, - {RefName: "kube-vip-cloud-provider*", ValuesFrom: &v1alpha3.ValuesFrom{ - ProviderRef: &corev1.TypedLocalObjectReference{ - Kind: "KubevipCPIConfig", - Name: "foo", - }}}, - }, - } - tanzuKubernetesRelease := constructFakeTanzuKubernetesRelease() - err := helper.CompleteCBPackageRefNamesFromTKR(tanzuKubernetesRelease, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - Expect(clusterBootstrap.Spec.CNI.RefName).To(Equal("calico.tanzu.vmware.com.3.22.1+vmware.1-tkg.1-zshippable")) - Expect(clusterBootstrap.Spec.CNI.ValuesFrom.Inline["foo"]).To(Equal("bar")) - Expect(len(clusterBootstrap.Spec.AdditionalPackages)).To(Equal(2)) - Expect(clusterBootstrap.Spec.AdditionalPackages[0].RefName).To(Equal("pinniped.tanzu.vmware.com.0.12.1+vmware.1-tkg.1-zshippable")) - Expect(clusterBootstrap.Spec.AdditionalPackages[0].ValuesFrom.Inline["identity_management_type"]).To(Equal("oidc")) - Expect(clusterBootstrap.Spec.AdditionalPackages[1].RefName).To(Equal("kube-vip-cloud-provider.tanzu.vmware.com.0.0.4+vmware.1-tkg.1-zshippable")) - Expect(clusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.ProviderRef.Kind).To(Equal("KubevipCPIConfig")) - Expect(clusterBootstrap.Spec.AdditionalPackages[1].ValuesFrom.ProviderRef.Name).To(Equal("foo")) - }) - - It("should return error if there is a no match", func() { - clusterBootstrap := constructFakeEmptyClusterBootstrap() - clusterBootstrap.Spec = &v1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &v1alpha3.ClusterBootstrapPackage{ - RefName: "something-does-not-exist*", - ValuesFrom: &v1alpha3.ValuesFrom{ - Inline: map[string]interface{}{"foo": "bar"}, - }, - }, - } - tanzuKubernetesRelease := constructFakeTanzuKubernetesRelease() - err := helper.CompleteCBPackageRefNamesFromTKR(tanzuKubernetesRelease, clusterBootstrap) - Expect(err).To(HaveOccurred()) - // The original value should stay untouched - Expect(clusterBootstrap.Spec.CNI.RefName).To(Equal("something-does-not-exist*")) - }) - - It("should return error if there is a multiple matches", func() { - clusterBootstrap := constructFakeEmptyClusterBootstrap() - clusterBootstrap.Spec = &v1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &v1alpha3.ClusterBootstrapPackage{ - RefName: "v*", // v* matches multiple ClusterBootstrapPackage in tanzuKubernetesRelease - ValuesFrom: &v1alpha3.ValuesFrom{ - Inline: map[string]interface{}{"foo": "bar"}, - }, - }, - } - tanzuKubernetesRelease := constructFakeTanzuKubernetesRelease() - err := helper.CompleteCBPackageRefNamesFromTKR(tanzuKubernetesRelease, clusterBootstrap) - Expect(err).To(HaveOccurred()) - }) - - It("should not touch the fully filled refName", func() { - clusterBootstrap := constructFakeEmptyClusterBootstrap() - clusterBootstrap.Spec = &v1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &v1alpha3.ClusterBootstrapPackage{ - RefName: "calico*", - ValuesFrom: &v1alpha3.ValuesFrom{ - Inline: map[string]interface{}{"foo": "bar"}, - }, - }, - CPI: &v1alpha3.ClusterBootstrapPackage{ - RefName: "fake-cpi", - ValuesFrom: &v1alpha3.ValuesFrom{ - ProviderRef: &corev1.TypedLocalObjectReference{ - Name: "fake-secret", - Kind: "secret", - }, - }, - }, - AdditionalPackages: []*v1alpha3.ClusterBootstrapPackage{ - {RefName: "pinniped.tanzu.vmware.com.0.11.1", ValuesFrom: &v1alpha3.ValuesFrom{Inline: map[string]interface{}{"identity_management_type": "ldap"}}}, - }, - } - tanzuKubernetesRelease := constructFakeTanzuKubernetesRelease() - err := helper.CompleteCBPackageRefNamesFromTKR(tanzuKubernetesRelease, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - // The original value should stay untouched - Expect(clusterBootstrap.Spec.CPI.RefName).To(Equal("fake-cpi")) - Expect(clusterBootstrap.Spec.CPI.ValuesFrom.Inline).To(BeNil()) - Expect(clusterBootstrap.Spec.CPI.ValuesFrom.SecretRef).To(BeEmpty()) - Expect(clusterBootstrap.Spec.CPI.ValuesFrom.ProviderRef.Kind).To(Equal("secret")) - Expect(clusterBootstrap.Spec.CPI.ValuesFrom.ProviderRef.Name).To(Equal("fake-secret")) - Expect(len(clusterBootstrap.Spec.AdditionalPackages)).To(Equal(1)) - Expect(clusterBootstrap.Spec.AdditionalPackages[0].RefName).To(Equal("pinniped.tanzu.vmware.com.0.11.1")) - Expect(clusterBootstrap.Spec.AdditionalPackages[0].ValuesFrom.Inline["identity_management_type"]).To(Equal("ldap")) - // The partial filled refName should be updated - Expect(clusterBootstrap.Spec.CNI.RefName).To(Equal("calico.tanzu.vmware.com.3.22.1+vmware.1-tkg.1-zshippable")) - Expect(clusterBootstrap.Spec.CNI.ValuesFrom.Inline["foo"]).To(Equal("bar")) - }) - - }) -}) - -func constructFakeTanzuKubernetesRelease() *v1alpha3.TanzuKubernetesRelease { - tkrYAML := ` -kind: TanzuKubernetesRelease -apiVersion: run.tanzu.vmware.com/v1alpha3 -metadata: - name: v1.23.5---vmware.1-tkg.1-zshippable -spec: - version: v1.23.5+vmware.1-tkg.1-zshippable - kubernetes: - version: v1.23.5+vmware.1 - imageRepository: projects.registry.vmware.com/tkg - etcd: - imageTag: v3.5.2_vmware.4 - pause: - imageTag: "3.6" - coredns: - imageTag: v1.8.6_vmware.5 - osImages: - - name: v1.23.3---vmware.1-tkg.1-tkgs-ubuntu-2004 - - name: v1.23.3---vmware.1-tkg.1-tkgs-photon-3 - bootstrapPackages: - - name: antrea.tanzu.vmware.com.1.2.3+vmware.4-tkg.2-advanced-zshippable - - name: vsphere-pv-csi.tanzu.vmware.com.2.4.0+vmware.1-tkg.1-zshippable - - name: vsphere-cpi.tanzu.vmware.com.1.22.6+vmware.1-tkg.1-zshippable - - name: kapp-controller.tanzu.vmware.com.0.34.0+vmware.1-tkg.1-zshippable - - name: guest-cluster-auth-service.tanzu.vmware.com.1.0.0+tkg.1-zshippable - - name: metrics-server.tanzu.vmware.com.0.5.1+vmware.1-tkg.2-zshippable - - name: secretgen-controller.tanzu.vmware.com.0.8.0+vmware.1-tkg.1-zshippable - - name: pinniped.tanzu.vmware.com.0.12.1+vmware.1-tkg.1-zshippable - - name: capabilities.tanzu.vmware.com.0.22.0-dev-43-g2dd1adc9+vmware.1 - - name: calico.tanzu.vmware.com.3.22.1+vmware.1-tkg.1-zshippable - - name: kube-vip-cloud-provider.tanzu.vmware.com.0.0.4+vmware.1-tkg.1-zshippable -` - tkrJSONByte, err := k8syaml.YAMLToJSON([]byte(tkrYAML)) - Expect(err).NotTo(HaveOccurred()) - tkr := &v1alpha3.TanzuKubernetesRelease{} - Expect(json.Unmarshal(tkrJSONByte, tkr)).To(Succeed()) - return tkr -} - -func convertToUnstructured(obj runtime.Object) *unstructured.Unstructured { - // convert the runtime.Object to unstructured.Unstructured - unstructuredObj, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj) - Expect(err).NotTo(HaveOccurred()) - return &unstructured.Unstructured{ - Object: unstructuredObj, - } -} - -func constructFakeClusterBootstrapTemplate() *v1alpha3.ClusterBootstrapTemplate { - return &v1alpha3.ClusterBootstrapTemplate{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-clusterbootstrap-template", - Namespace: "fake-ns", - }, - Spec: &v1alpha3.ClusterBootstrapTemplateSpec{ - CNI: constructFakeClusterBootstrapPackageWithAntreaProviderRef(), - CSI: constructFakeClusterBootstrapPackageWithCSIInlineRef(), - AdditionalPackages: []*v1alpha3.ClusterBootstrapPackage{ - {RefName: fakePinnipedCBPackageRefName, ValuesFrom: &v1alpha3.ValuesFrom{Inline: map[string]interface{}{"identity_management_type": "oidc"}}}, - {RefName: fakeMetricsServerCBPackageRefName}, - }, - }, - } -} - -func constructFakeClusterBootstrap() *v1alpha3.ClusterBootstrap { - return &v1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-clusterbootstrap", - Namespace: "fake-ns", - }, - Spec: &v1alpha3.ClusterBootstrapTemplateSpec{ - CNI: constructFakeClusterBootstrapPackageWithAntreaProviderRef(), - CSI: constructFakeClusterBootstrapPackageWithCSIInlineRef(), - AdditionalPackages: []*v1alpha3.ClusterBootstrapPackage{ - {RefName: fakePinnipedCBPackageRefName, ValuesFrom: &v1alpha3.ValuesFrom{Inline: map[string]interface{}{"identity_management_type": "oidc"}}}, - {RefName: fakeMetricsServerCBPackageRefName}, - }, - }, - } -} - -func prepareCarvelPackages(client client.Client, namespace string) { - err := client.Create(context.TODO(), constructAntreaCarvelPackage(namespace)) - Expect(err).To(BeNil()) - err = client.Create(context.TODO(), constructCSICarvelPackage(namespace)) - Expect(err).To(BeNil()) - err = client.Create(context.TODO(), constructPinnipedCarvelPackage(namespace)) - Expect(err).To(BeNil()) - err = client.Create(context.TODO(), constructMetricsCarvelPackage(namespace)) - Expect(err).To(BeNil()) -} - -func constructAntreaCarvelPackage(namespace string) *kapppkgv1alpha1.Package { - return &kapppkgv1alpha1.Package{ - ObjectMeta: metav1.ObjectMeta{ - Name: fakeAntreaCBPackageRefName, - Namespace: namespace, - }, - Spec: kapppkgv1alpha1.PackageSpec{ - RefName: "antrea.vmware.com", - }, - } -} - -func constructCSICarvelPackage(namespace string) *kapppkgv1alpha1.Package { - return &kapppkgv1alpha1.Package{ - ObjectMeta: metav1.ObjectMeta{ - Name: fakeCSICBPackageRefName, - Namespace: namespace, - }, - Spec: kapppkgv1alpha1.PackageSpec{ - RefName: "vsphere-csi.vmware.com", - }, - } -} - -func constructPinnipedCarvelPackage(namespace string) *kapppkgv1alpha1.Package { - return &kapppkgv1alpha1.Package{ - ObjectMeta: metav1.ObjectMeta{ - Name: fakePinnipedCBPackageRefName, - Namespace: namespace, - }, - Spec: kapppkgv1alpha1.PackageSpec{ - RefName: "pinniped.vmware.com", - }, - } -} - -func constructMetricsCarvelPackage(namespace string) *kapppkgv1alpha1.Package { - return &kapppkgv1alpha1.Package{ - ObjectMeta: metav1.ObjectMeta{ - Name: fakeMetricsServerCBPackageRefName, - Namespace: namespace, - }, - Spec: kapppkgv1alpha1.PackageSpec{ - RefName: "metrics-server.vmware.com", - }, - } -} - -func constructFakeClusterBootstrapPackageWithSecretRef() *v1alpha3.ClusterBootstrapPackage { - return &v1alpha3.ClusterBootstrapPackage{ - RefName: fakeAntreaCBPackageRefName, - ValuesFrom: &v1alpha3.ValuesFrom{ - SecretRef: "fake-secret", - }, - } -} - -func constructFakeClusterBootstrapPackageWithInlineRef() *v1alpha3.ClusterBootstrapPackage { - return &v1alpha3.ClusterBootstrapPackage{ - RefName: fakeAntreaCBPackageRefName, - ValuesFrom: &v1alpha3.ValuesFrom{ - Inline: map[string]interface{}{"foo": "bar"}, - }, - } -} - -func constructFakeClusterBootstrapPackageWithAntreaProviderRef() *v1alpha3.ClusterBootstrapPackage { - antreaAPIGroup := antreaconfigv1alpha2.GroupVersion.Group - antreaConfig := constructFakeAntreaConfig() - return &v1alpha3.ClusterBootstrapPackage{ - RefName: fakeAntreaCBPackageRefName, - ValuesFrom: &v1alpha3.ValuesFrom{ - ProviderRef: &corev1.TypedLocalObjectReference{ - APIGroup: &antreaAPIGroup, - Kind: "AntreaConfig", - Name: antreaConfig.Name, - }, - }, - } -} - -func constructFakeClusterBootstrapPackageWithCSIInlineRef() *v1alpha3.ClusterBootstrapPackage { - return &v1alpha3.ClusterBootstrapPackage{ - RefName: fakeCSICBPackageRefName, - ValuesFrom: &v1alpha3.ValuesFrom{ - Inline: map[string]interface{}{"foo": "bar"}, - }, - } -} - -func constructFakeCluster() *clusterapiv1beta1.Cluster { - return &clusterapiv1beta1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-cluster", - Namespace: "fake-cluster-ns", - UID: "uid", - }, - Spec: clusterapiv1beta1.ClusterSpec{}, - } -} - -func constructNamespacedFakeCluster(name, namespace string) *clusterapiv1beta1.Cluster { - return &clusterapiv1beta1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - UID: "uid", - }, - Spec: clusterapiv1beta1.ClusterSpec{}, - } -} - -func constructFakeSecret() *corev1.Secret { - return &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-secret", - Namespace: "fake-ns", - }, - StringData: map[string]string{"key": "value"}, - } -} - -func constructFakeEmptyClusterBootstrap() *v1alpha3.ClusterBootstrap { - return &v1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-clusterbootstrap", - Namespace: "fake-cluster-ns", - UID: "uid", - }, - } -} - -func constructFakeVSphereCPIConfig() *vspherecpiv1alpha1.VSphereCPIConfig { - mode := "vsphereCPI" - emptyStr := "" - return &vspherecpiv1alpha1.VSphereCPIConfig{ - TypeMeta: metav1.TypeMeta{ - Kind: "VSphereCPIConfig", - APIVersion: vspherecpiv1alpha1.GroupVersion.String(), - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-vspherecpiconfig", - Namespace: "fake-ns", - }, - Spec: vspherecpiv1alpha1.VSphereCPIConfigSpec{ - VSphereCPI: vspherecpiv1alpha1.VSphereCPI{ - Mode: &mode, - NonParavirtualConfig: &vspherecpiv1alpha1.NonParavirtualConfig{ - VSphereCredentialLocalObjRef: &corev1.TypedLocalObjectReference{ - APIGroup: &emptyStr, - Kind: "Secret", - Name: "fake-secret", - }, - }, - }, - }, - } -} - -func constructFakeAntreaConfig() *antreaconfigv1alpha2.AntreaConfig { - return &antreaconfigv1alpha2.AntreaConfig{ - TypeMeta: metav1.TypeMeta{ - Kind: "AntreaConfig", - APIVersion: antreaconfigv1alpha2.GroupVersion.String(), - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-antreaconfig", - Namespace: "fake-ns", - Annotations: map[string]string{ - constants.TKGAnnotationTemplateConfig: "true", - }, - }, - Spec: antreaconfigv1alpha2.AntreaConfigSpec{ - Antrea: antreaconfigv1alpha2.Antrea{ - AntreaConfigDataValue: antreaconfigv1alpha2.AntreaConfigDataValue{TrafficEncapMode: "encap"}, - }, - }, - } -} - -func constructFakeAntreaConfigWithClusterOwner(configName, clusterName string) *antreaconfigv1alpha2.AntreaConfig { - ownerRef := metav1.OwnerReference{ - APIVersion: "", - Kind: constants.ClusterKind, - Name: clusterName, - UID: "", - } - return &antreaconfigv1alpha2.AntreaConfig{ - TypeMeta: metav1.TypeMeta{ - Kind: "AntreaConfig", - APIVersion: antreaconfigv1alpha2.GroupVersion.String(), - }, - - ObjectMeta: metav1.ObjectMeta{ - Name: configName, - Namespace: "fake-ns", - Annotations: map[string]string{ - constants.TKGAnnotationTemplateConfig: "true", - }, - OwnerReferences: []metav1.OwnerReference{ownerRef}, - }, - Spec: antreaconfigv1alpha2.AntreaConfigSpec{ - Antrea: antreaconfigv1alpha2.Antrea{ - AntreaConfigDataValue: antreaconfigv1alpha2.AntreaConfigDataValue{TrafficEncapMode: "encap"}, - }, - }, - } -} - -func assertTwoMapsShouldEqual(left, right map[string]interface{}) { - for keyFromLeft, valueFromLeft := range left { - valueFromRight, exist := right[keyFromLeft] - Expect(exist).To(BeTrue()) - Expect(valueFromLeft).To(Equal(valueFromRight)) - } -} diff --git a/addons/pkg/util/clusterbootstrapclone/doc.go b/addons/pkg/util/clusterbootstrapclone/doc.go deleted file mode 100644 index 5d0116cf17..0000000000 --- a/addons/pkg/util/clusterbootstrapclone/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package clusterbootstrapclone provides helper functions to create ClusterBootstrap CR and clones its associated objects. -package clusterbootstrapclone diff --git a/addons/pkg/util/condition_util.go b/addons/pkg/util/condition_util.go deleted file mode 100644 index 181ec93a79..0000000000 --- a/addons/pkg/util/condition_util.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "strings" - - corev1 "k8s.io/api/core/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - - "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" -) - -// SummarizeAppConditions summarizes the provided conditions slice into a single condition with the following logic: -// - If there be any 'Reconciling' condition type with status 'True', the summary condition type will be 'Reconciling' -// - Otherwise, if there be any 'ReconcileFailed' condition type with status 'True', the summary condition type will be 'ReconcileFailed' -// - Otherwise, if there be any 'ReconcileSucceeded' condition type with status 'True', the summary condition type will be 'ReconcileSucceeded' -// - Otherwise, if there be any 'Deleting' condition type with status 'True', the summary condition type will be 'Deleting' -// - Otherwise, if there be any 'DeleteFailed' condition type with status 'True', the summary condition type will be 'DeleteFailed' -// - Otherwise, the condition type is unknown and nil will be returned -// Note that ReconcileFailed|Reconciling|ReconcileSucceeded|Deleting|DeleteFailed|DeleteSucceeded are mutually exclusive -func SummarizeAppConditions(conditions []v1alpha1.AppCondition) *v1alpha1.AppCondition { - wantedCondTypes := []v1alpha1.AppConditionType{ - v1alpha1.Reconciling, - v1alpha1.ReconcileFailed, - v1alpha1.ReconcileSucceeded, - v1alpha1.Deleting, - v1alpha1.DeleteFailed, - } - for _, wantedCondType := range wantedCondTypes { - for _, cond := range conditions { - if cond.Type == wantedCondType && cond.Status == corev1.ConditionTrue { - return &cond - } - } - } - return nil -} - -// GetKappUsefulErrorMessage extracts the relevant portion from UsefulErrorMessage -func GetKappUsefulErrorMessage(s string) string { - var errString string - n := len(s) - i := strings.Index(s, "kapp: Error") - if i != -1 { - errString = s[i:n] - } - - return errString -} - -// HasSameState returns true if a ClusterBootstrap condition has the same state of another; state is defined -// by the union of following fields: Type, Status, Message, Reason (it excludes LastTransitionTime). -func HasSameState(i, j *clusterapiv1beta1.Condition) bool { - return i.Type == j.Type && - i.Status == j.Status && - i.Message == j.Message && - i.Reason == j.Reason -} diff --git a/addons/pkg/util/condition_util_test.go b/addons/pkg/util/condition_util_test.go deleted file mode 100644 index a349f1318a..0000000000 --- a/addons/pkg/util/condition_util_test.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - - "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" -) - -const ( - testReason = "some reason" - testMessage = "some message" -) - -var _ = Describe("Summarize AppConditions", func() { - Context("SummarizeAppConditions()", func() { - var ( - conditions []v1alpha1.AppCondition - summaryCondition *v1alpha1.AppCondition - ) - - When("there is any condition with 'Reconciling' type", func() { - BeforeEach(func() { - conditions = []v1alpha1.AppCondition{ - { - Type: v1alpha1.Reconciling, - Status: corev1.ConditionTrue, - Reason: testReason, - Message: testMessage, - }, - { - Type: v1alpha1.ReconcileSucceeded, - Status: corev1.ConditionTrue, - Reason: testReason, - Message: testMessage, - }, - } - summaryCondition = SummarizeAppConditions(conditions) - }) - - It("the summarized condition's type should be 'Reconciling'", func() { - Expect(summaryCondition.Type).Should(Equal(v1alpha1.Reconciling)) - Expect(summaryCondition.Status).Should(Equal(corev1.ConditionTrue)) - }) - }) - - When("there is no condition with 'Reconciling' type && there is a condition with 'ReconcileFailed' type", func() { - BeforeEach(func() { - conditions = []v1alpha1.AppCondition{ - { - Type: v1alpha1.ReconcileSucceeded, - Status: corev1.ConditionTrue, - Reason: testReason, - Message: testMessage, - }, - { - Type: v1alpha1.ReconcileFailed, - Status: corev1.ConditionTrue, - Reason: testReason, - Message: testMessage, - }, - } - summaryCondition = SummarizeAppConditions(conditions) - }) - - It("the summarized condition's type should be 'ReconcileFailed'", func() { - Expect(summaryCondition.Type).Should(Equal(v1alpha1.ReconcileFailed)) - Expect(summaryCondition.Status).Should(Equal(corev1.ConditionTrue)) - }) - }) - - When("there is no condition with 'Reconciling' or 'ReconcileFailed' types && there is a condition with 'ReconcileSucceeded' type", func() { - BeforeEach(func() { - conditions = []v1alpha1.AppCondition{ - { - Type: v1alpha1.ReconcileSucceeded, - Status: corev1.ConditionTrue, - Reason: testReason, - Message: testMessage, - }, - { - Type: "Unknown", - Status: corev1.ConditionTrue, - Reason: testReason, - Message: testMessage, - }, - } - summaryCondition = SummarizeAppConditions(conditions) - }) - - It("the summarized condition's type should be 'ReconcileSucceeded'", func() { - Expect(summaryCondition.Type).Should(Equal(v1alpha1.ReconcileSucceeded)) - Expect(summaryCondition.Status).Should(Equal(corev1.ConditionTrue)) - }) - }) - - When("there is no condition with 'Reconciling' or 'ReconcileFailed' or 'ReconcileSucceeded' types", func() { - BeforeEach(func() { - conditions = []v1alpha1.AppCondition{ - { - Type: "SomeOtherCondition", - Status: corev1.ConditionTrue, - Reason: testReason, - Message: testMessage, - }, - } - summaryCondition = SummarizeAppConditions(conditions) - }) - - It("the summarized condition should be nil", func() { - Expect(summaryCondition).Should(BeNil()) - }) - }) - }) -}) diff --git a/addons/pkg/util/doc.go b/addons/pkg/util/doc.go deleted file mode 100644 index 44083ff6ba..0000000000 --- a/addons/pkg/util/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package util implements various utility functionality for working with clusters -// TKR, BOMs, and others. -package util diff --git a/addons/pkg/util/gvr_helper.go b/addons/pkg/util/gvr_helper.go deleted file mode 100644 index 6c7a60ed82..0000000000 --- a/addons/pkg/util/gvr_helper.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "context" - "fmt" - "sync" - "time" - - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/discovery" - cacheddiscovery "k8s.io/client-go/discovery/cached/memory" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" -) - -type GVRHelper interface { - GetGVR(gk schema.GroupKind) (*schema.GroupVersionResource, error) - GetDiscoveryClient() discovery.DiscoveryInterface -} - -type gvrHelper struct { - lock sync.Mutex - - cachedDiscoveryClient discovery.CachedDiscoveryInterface - cachedLookups map[schema.GroupKind]*schema.GroupVersionResource - context context.Context -} - -func NewGVRHelper(ctx context.Context, discoveryClient discovery.DiscoveryInterface) GVRHelper { - cachedDiscoveryClient := cacheddiscovery.NewMemCacheClient(discoveryClient) - helper := &gvrHelper{ - cachedDiscoveryClient: cachedDiscoveryClient, - cachedLookups: make(map[schema.GroupKind]*schema.GroupVersionResource), - context: ctx, - } - go helper.periodicGVRCachesClean() - return helper -} - -// GetGVR returns a GroupVersionResource for a GroupKind -func (g *gvrHelper) GetGVR(gk schema.GroupKind) (*schema.GroupVersionResource, error) { - g.lock.Lock() - defer g.lock.Unlock() - - if gvr, ok := g.cachedLookups[gk]; ok { - return gvr, nil - } - gvr, err := g.gvrForGroupKind(gk) - if err != nil { - return nil, err - } - g.cachedLookups[gk] = gvr - return gvr, nil -} - -func (g *gvrHelper) GetDiscoveryClient() discovery.DiscoveryInterface { - return g.cachedDiscoveryClient -} - -// periodicGVRCachesClean invalidates caches used for GVR lookup -func (g *gvrHelper) periodicGVRCachesClean() { - ticker := time.NewTicker(constants.DiscoveryCacheInvalidateInterval) - for { - select { - case <-g.context.Done(): - ticker.Stop() - return - case <-ticker.C: - func() { - g.lock.Lock() - defer g.lock.Unlock() - - g.cachedDiscoveryClient.Invalidate() - g.cachedLookups = make(map[schema.GroupKind]*schema.GroupVersionResource) - }() - } - } -} - -func (g *gvrHelper) gvrForGroupKind(gk schema.GroupKind) (*schema.GroupVersionResource, error) { - apiResourceList, err := g.cachedDiscoveryClient.ServerPreferredResources() - if err != nil { - return nil, err - } - for _, apiResource := range apiResourceList { - gv, err := schema.ParseGroupVersion(apiResource.GroupVersion) - if err != nil { - return nil, err - } - if gv.Group == gk.Group { - for i := 0; i < len(apiResource.APIResources); i++ { - if apiResource.APIResources[i].Kind == gk.Kind { - return &schema.GroupVersionResource{Group: gv.Group, Resource: apiResource.APIResources[i].Name, Version: gv.Version}, nil - } - } - } - } - return nil, fmt.Errorf("unable to find server preferred resource %s/%s", gk.Group, gk.Kind) -} diff --git a/addons/pkg/util/gvr_helper_test.go b/addons/pkg/util/gvr_helper_test.go deleted file mode 100644 index ba2e8b37da..0000000000 --- a/addons/pkg/util/gvr_helper_test.go +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util_test - -import ( - "context" - "sync" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - k8sfake "k8s.io/client-go/kubernetes/fake" - - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - antreaconfigv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha1" - vspherecpiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cpi/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -const ( - antreaconfigs = "antreaconfigs" - cniTanzuVmwareCom = "cni.tanzu.vmware.com" - v1AlphaString = "v1alpha1" -) - -var _ = Describe("GVRHelper", func() { - - var ( - fakeClientSet *k8sfake.Clientset - - fakeDiscovery *testutil.FakeDiscovery - scheme *runtime.Scheme - gvrHelper util.GVRHelper - ) - - BeforeEach(func() { - scheme = runtime.NewScheme() - _ = corev1.AddToScheme(scheme) - _ = antreaconfigv1alpha1.AddToScheme(scheme) - _ = kapppkgv1alpha1.AddToScheme(scheme) - _ = v1alpha3.AddToScheme(scheme) - - fakeClientSet = k8sfake.NewSimpleClientset() - fakeDiscovery = &testutil.FakeDiscovery{ - FakeDiscovery: fakeClientSet.Discovery(), - Resources: []*metav1.APIResourceList{ - { - GroupVersion: corev1.SchemeGroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "secrets", Namespaced: true, Kind: "Secret"}, - }, - }, - { - GroupVersion: antreaconfigv1alpha1.GroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: antreaconfigs, Namespaced: true, Kind: "AntreaConfig"}, - }, - }, - { - GroupVersion: vspherecpiv1alpha1.GroupVersion.String(), - APIResources: []metav1.APIResource{ - {Name: "vspherecpiconfigs", Namespaced: true, Kind: "VSphereCPIConfig"}, - }, - }, - }, - APIGroups: &metav1.APIGroupList{ - Groups: []metav1.APIGroup{ - { - Name: "cni.tanzu.vmware.com", - Versions: []metav1.GroupVersionForDiscovery{ - { - GroupVersion: "cni.tanzu.vmware.com/v1alpha1", - Version: v1AlphaString, - }, - }, - PreferredVersion: metav1.GroupVersionForDiscovery{ - GroupVersion: "cni.tanzu.vmware.com/v1alpha1", - Version: v1AlphaString, - }, - }, - }, - }, - } - gvrHelper = util.NewGVRHelper(context.TODO(), fakeDiscovery) - - }) - - Context("when an existing API server resource is looked up", func() { - - It("should return a result with correct group version resource", func() { - group := cniTanzuVmwareCom - version := v1AlphaString - resource := antreaconfigs - antreaGVR := schema.GroupVersionResource{Group: group, Version: version, Resource: resource} - - found, err := gvrHelper.GetGVR(schema.GroupKind{Group: cniTanzuVmwareCom, Kind: "AntreaConfig"}) - Expect(err).ToNot(HaveOccurred()) - Expect(*found).To(Equal(antreaGVR)) - - }) - - It("should not crash in concurrent use", func() { - group := cniTanzuVmwareCom - version := v1AlphaString - resource := antreaconfigs - antreaGVR := schema.GroupVersionResource{Group: group, Version: version, Resource: resource} - - var found0, found1 *schema.GroupVersionResource - var err0, err1 error - wg := sync.WaitGroup{} - wg.Add(2) - go func() { - found0, err0 = gvrHelper.GetGVR(schema.GroupKind{Group: cniTanzuVmwareCom, Kind: "AntreaConfig"}) - wg.Done() - }() - go func() { - found1, err1 = gvrHelper.GetGVR(schema.GroupKind{Group: cniTanzuVmwareCom, Kind: "AntreaConfig"}) - wg.Done() - }() - wg.Wait() - Expect(err0).ToNot(HaveOccurred()) - Expect(*found0).To(Equal(antreaGVR)) - Expect(err1).ToNot(HaveOccurred()) - Expect(*found1).To(Equal(antreaGVR)) - }) - }) - - Context("when an API server resource that does not exist is looked up", func() { - - It("should return an error", func() { - _, err := gvrHelper.GetGVR(schema.GroupKind{Group: "foo.tanzu.vmware.com", Kind: "FooBar"}) - Expect(err).To(HaveOccurred()) - }) - }) - - Context("GetDiscoveryClient", func() { - - It("should not be nil", func() { - Expect(gvrHelper.GetDiscoveryClient()).ShouldNot(BeNil()) - }) - }) -}) diff --git a/addons/pkg/util/provider_util.go b/addons/pkg/util/provider_util.go deleted file mode 100644 index 7a01f4f471..0000000000 --- a/addons/pkg/util/provider_util.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "fmt" - "reflect" - "strings" - - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/discovery" -) - -// ExtractTypedLocalObjectRef extracts the TypedLocalObjectReference from the unstructuredContent by looking at the fields -// which has the specified fieldSuffix. -// Returns a map with groupKind as the key and object names as the value -func ExtractTypedLocalObjectRef(unstructuredContent map[string]interface{}, fieldSuffix string) map[schema.GroupKind][]string { - if unstructuredContent == nil || fieldSuffix == "" { - return nil - } - var extractedGKs = make(map[schema.GroupKind][]string) - for k, v := range unstructuredContent { - if v != nil && reflect.TypeOf(v).Kind() == reflect.Map { - if strings.HasSuffix(k, fieldSuffix) { - localObjRef := v.(map[string]interface{}) - - if !isValidLocalObjectRef(localObjRef) { - return nil - } - - apiGroup := "" - if localObjRef["apiGroup"] != nil { - apiGroup = localObjRef["apiGroup"].(string) - } - kind := localObjRef["kind"].(string) - name := localObjRef["name"].(string) - groupKind := schema.GroupKind{Group: apiGroup, Kind: kind} - extractedGKs[groupKind] = append(extractedGKs[groupKind], name) - } else { - extractedGVRsFromNested := ExtractTypedLocalObjectRef(v.(map[string]interface{}), fieldSuffix) - // Combine the result from nested fields into the extractedGKs - for k, v := range extractedGVRsFromNested { - extractedGKs[k] = append(extractedGKs[k], v...) - } - } - } - } - return extractedGKs -} - -func isValidLocalObjectRef(localObjRef map[string]interface{}) bool { - if localObjRef == nil { - return false - } - if _, exist := localObjRef["kind"]; !exist || reflect.TypeOf(localObjRef["kind"]).Kind() != reflect.String { - return false - } - if _, exist := localObjRef["name"]; !exist || reflect.TypeOf(localObjRef["name"]).Kind() != reflect.String { - return false - } - if localObjRef["apiGroup"] != nil && reflect.TypeOf(localObjRef["apiGroup"]).Kind() != reflect.String { - return false - } - return true -} - -// GetGVRForGroupKind returns a GroupVersionResource for a GroupKind -func GetGVRForGroupKind(gk schema.GroupKind, discoveryClient discovery.CachedDiscoveryInterface) (*schema.GroupVersionResource, error) { - apiResourceList, err := discoveryClient.ServerPreferredResources() - if err != nil { - return nil, err - } - for _, apiResource := range apiResourceList { - gv, err := schema.ParseGroupVersion(apiResource.GroupVersion) - if err != nil { - return nil, err - } - if gv.Group == gk.Group { - for i := 0; i < len(apiResource.APIResources); i++ { - if apiResource.APIResources[i].Kind == gk.Kind { - return &schema.GroupVersionResource{Group: gv.Group, Resource: apiResource.APIResources[i].Name, Version: gv.Version}, nil - } - } - } - } - return nil, fmt.Errorf("unable to find server preferred resource %s/%s", gk.Group, gk.Kind) -} diff --git a/addons/pkg/util/provider_util_test.go b/addons/pkg/util/provider_util_test.go deleted file mode 100644 index d3f0f4db47..0000000000 --- a/addons/pkg/util/provider_util_test.go +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - - "gopkg.in/yaml.v3" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -var validInput1 = ` -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: vspherecpiconfig-sample -spec: - vsphereCPI: - mode: vsphereCPI - tlsThumbprint: "test" - server: 10.1.1.1 - datacenter: ds-test - vSphereCredentialLocalObjRef: - kind: Secret - name: vsphere-credentials - insecureFlag: False - vmInternalNetwork: null - vmExternalNetwork: null - cloudProviderExtraArgs: - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - nsxt: - podRoutingEnabled: false - routes: - routerPath: "" - credentialLocalObjRef: - apiGroup: "" - kind: Secret - name: nsxt-credentials - nestedForTesting: - dummyLocalObjRef: - apiGroup: "" - kind: "ConfigMap" - name: "dummy-configmap" - host: "10.1.1.2" - insecureFlag: false - remoteAuth: false - vmcAccessToken: "" - vmcAuthHost: "" - clientCertKeyData: "" - clientCertData: "" - rootCAData: "" - secretName: "cloud-provider-vsphere-nsxt-credentials" - secretNamespace: "kube-system" -` - -var invalidInput1 = ` -vsphereCPI: - mode: vsphereCPI - tlsThumbprint: "test" - server: 10.1.1.1 - datacenter: ds-test - vSphereCredentialLocalObjRef: - foo: bar -` - -var invalidInput2 = ` -vsphereCPI: - mode: vsphereCPI - tlsThumbprint: "test" - server: 10.1.1.1 - datacenter: ds-test -` - -var _ = Describe("Verifying the functionality of provider_util", func() { - - var testData map[string]interface{} - JustBeforeEach(func() { - testData = make(map[string]interface{}) - }) - - Context("when the unstructuredContent passed into ExtractTypedLocalObjectRef() has valid embedded local object reference", func() { - - It("should return non-empty result", func() { - Expect(yaml.Unmarshal([]byte(validInput1), testData)).Should(Succeed()) - result := util.ExtractTypedLocalObjectRef(testData, "LocalObjRef") - Expect(len(result)).To(Equal(2)) - Expect(len(result[schema.GroupKind{Group: "", Kind: "Secret"}])).To(Equal(2)) - Expect(len(result[schema.GroupKind{Group: "", Kind: "ConfigMap"}])).To(Equal(1)) - }) - }) - - Context("when the unstructuredContent passed into ExtractTypedLocalObjectRef() has invalid embedded local object reference", func() { - It("should return empty result if the content of local object reference is invalid", func() { - Expect(yaml.Unmarshal([]byte(invalidInput1), testData)).Should(Succeed()) - result := util.ExtractTypedLocalObjectRef(testData, "LocalObjRef") - Expect(len(result)).To(Equal(0)) - }) - It("should return empty result if no embedded local object reference", func() { - Expect(yaml.Unmarshal([]byte(invalidInput2), testData)).Should(Succeed()) - result := util.ExtractTypedLocalObjectRef(testData, "LocalObjRef") - Expect(len(result)).To(Equal(0)) - }) - }) -}) diff --git a/addons/pkg/util/tkr_util.go b/addons/pkg/util/tkr_util.go deleted file mode 100644 index d1cdb24b0f..0000000000 --- a/addons/pkg/util/tkr_util.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "bytes" - "compress/gzip" - "context" - "encoding/base64" - "fmt" - "io" - "strings" - - "gopkg.in/yaml.v3" - - "github.com/pkg/errors" - apierrors "k8s.io/apimachinery/pkg/api/errors" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - runtanzuv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// GetTKRByNameV1Alpha1 gets v1Alpha1 TKR object given a TKR name -func GetTKRByNameV1Alpha1(ctx context.Context, c client.Client, tkrName string) (*runtanzuv1alpha1.TanzuKubernetesRelease, error) { - tkrV1Alpha1 := &runtanzuv1alpha1.TanzuKubernetesRelease{} - - if tkrName == "" { - return nil, nil - } - - tkrNamespaceName := client.ObjectKey{Name: tkrName} - - if err := c.Get(ctx, tkrNamespaceName, tkrV1Alpha1); err != nil { - if apierrors.IsNotFound(err) { - return nil, nil - } - return nil, err - } - return tkrV1Alpha1, nil -} - -// GetTKRByNameV1Alpha3 gets v1Alpha3 TKR object given a TKR name -func GetTKRByNameV1Alpha3(ctx context.Context, c client.Client, cluster *clusterapiv1beta1.Cluster, tkrName string) (*runtanzuv1alpha3.TanzuKubernetesRelease, error) { - tkrV1Alpha3 := &runtanzuv1alpha3.TanzuKubernetesRelease{} - - if tkrName == "" { - return nil, nil - } - - tkrNamespaceName := client.ObjectKey{Name: tkrName} - - if err := c.Get(ctx, tkrNamespaceName, tkrV1Alpha3); err != nil { - if apierrors.IsNotFound(err) { - tkrV1Alpha3, err = getTKRFromAnnotation(cluster.Annotations) - if tkrV1Alpha3 != nil { - return tkrV1Alpha3, nil - } - - return nil, nil - } - return nil, err - } - return tkrV1Alpha3, nil -} - -// GetBootstrapPackageNameFromTKR tries to find the prefix of the provided package RefName in the bootstrap packages of the TKR v1Alpha3 object associated -// with the cluster. Upon finding the corresponding bootstrap package name, it returns it as the bumped version of the package -func GetBootstrapPackageNameFromTKR(ctx context.Context, clt client.Client, pkgRefName string, cluster *clusterapiv1beta1.Cluster) (string, string, error) { - pkgNamePrefix := pkgRefName - pkgNameTokens := strings.Split(pkgRefName, ".") - if len(pkgNameTokens) >= 1 { - pkgNamePrefix = pkgNameTokens[0] - } - - // it is expected to have a label corresponding to the TKR name in the cluster object - tkrName := GetClusterLabel(cluster.Labels, constants.TKRLabelClassyClusters) - if tkrName == "" { - return "", pkgNamePrefix, fmt.Errorf("no '%s' label found in the cluster object", constants.TKRLabelClassyClusters) - } - - // get TKR object associated with the cluster - tkr, err := GetTKRByNameV1Alpha3(ctx, clt, cluster, tkrName) - if err != nil || tkr == nil { - return "", pkgNamePrefix, fmt.Errorf("unable to fetch TKR object '%s'", tkrName) - } - - tkrBootstrapPackages := tkr.Spec.BootstrapPackages - if len(tkrBootstrapPackages) == 0 { - return "", pkgNamePrefix, errors.New("unable to find any bootstrap packages in the TKR object") - } - - for _, bootstrapPackage := range tkrBootstrapPackages { - if strings.HasPrefix(bootstrapPackage.Name, pkgNamePrefix) { - return bootstrapPackage.Name, pkgNamePrefix, nil - } - } - - return "", pkgNamePrefix, fmt.Errorf("no bootstrap package prefixed with '%s' is found in the TKR object", pkgNamePrefix) -} - -func getTKRFromAnnotation(tkc map[string]string) (*runtanzuv1alpha3.TanzuKubernetesRelease, error) { - controlPlaneTKR := &runtanzuv1alpha3.TanzuKubernetesRelease{} - - tkrSpec, ok := tkc[constants.TKRAnnotationKey] - if !ok { - return nil, nil - } - - unzipOut, err := gunzipAndBase64Decode(tkrSpec) - if err != nil { - return nil, err - } - - err = yaml.Unmarshal(unzipOut, controlPlaneTKR) - if err != nil { - return nil, err - } - - return controlPlaneTKR, nil -} - -// GunzipAndBase64Decode extracts a gzip archive to a byte array -func gunzipAndBase64Decode(input string) ([]byte, error) { - decodedData, err := base64.StdEncoding.DecodeString(input) - if err != nil { - return nil, err - } - - r, err := gzip.NewReader(bytes.NewReader(decodedData)) - if err != nil { - return nil, err - } - - return io.ReadAll(r) -} diff --git a/addons/pkg/util/tkr_util_test.go b/addons/pkg/util/tkr_util_test.go deleted file mode 100644 index d713e643ed..0000000000 --- a/addons/pkg/util/tkr_util_test.go +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "bytes" - "compress/gzip" - "context" - "encoding/base64" - "fmt" - - "gopkg.in/yaml.v3" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/fakeclusterclient" - runtanzuv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -const ( - testTKR = "1.23.5" - testPkg = "antrea.tanzu.vmware.com.1.2.3" -) - -var _ = Describe("TKR utils", func() { - Context("GetTKRByNameV1Alpha1()", func() { - var ( - tkrName string - ctx context.Context - crtCtl *fakeclusterclient.CRTClusterClient - err error - tkrV1Alpha1 *runtanzuv1alpha1.TanzuKubernetesRelease - tkrV1Alpha3 *runtanzuv1alpha3.TanzuKubernetesRelease - ) - - When("tkrName is empty for the call to GetTKRByNameV1Alpha1()", func() { - BeforeEach(func() { - crtCtl = &fakeclusterclient.CRTClusterClient{} - tkrName = "" - tkrV1Alpha1, err = GetTKRByNameV1Alpha1(ctx, crtCtl, tkrName) - }) - - It("should return nil TKR", func() { - Expect(err).ShouldNot(HaveOccurred()) - Expect(tkrV1Alpha1).Should(BeNil()) - }) - }) - - When("tkrName is empty for the call to GetTKRByNameV1Alpha3()", func() { - BeforeEach(func() { - crtCtl = &fakeclusterclient.CRTClusterClient{} - tkrName = "" - cluster := &clusterapiv1beta1.Cluster{} - tkrV1Alpha3, err = GetTKRByNameV1Alpha3(ctx, crtCtl, cluster, tkrName) - }) - - It("should return nil TKR", func() { - Expect(err).ShouldNot(HaveOccurred()) - Expect(tkrV1Alpha3).Should(BeNil()) - }) - }) - - When("tkr object is not found for the call to GetTKRByNameV1Alpha1()", func() { - BeforeEach(func() { - crtCtl = &fakeclusterclient.CRTClusterClient{} - tkrName = testTKR - crtCtl.GetReturns(apierrors.NewNotFound(schema.GroupResource{Resource: "TanzuKubernetesRelease"}, testTKR)) - tkrV1Alpha1, err = GetTKRByNameV1Alpha1(ctx, crtCtl, tkrName) - }) - - It("should return nil TKR", func() { - Expect(err).ShouldNot(HaveOccurred()) - Expect(tkrV1Alpha1).Should(BeNil()) - }) - }) - - When("tkr object is not found for the call to GetTKRByNameV1Alpha3()", func() { - BeforeEach(func() { - crtCtl = &fakeclusterclient.CRTClusterClient{} - tkrName = testTKR - cluster := &clusterapiv1beta1.Cluster{} - crtCtl.GetReturns(apierrors.NewNotFound(schema.GroupResource{Resource: "TanzuKubernetesRelease"}, testTKR)) - tkrV1Alpha3, err = GetTKRByNameV1Alpha3(ctx, crtCtl, cluster, tkrName) - }) - - It("should return nil TKR", func() { - Expect(err).ShouldNot(HaveOccurred()) - Expect(tkrV1Alpha3).Should(BeNil()) - }) - }) - - When("there is some error for the call to GetTKRByNameV1Alpha1()", func() { - BeforeEach(func() { - crtCtl = &fakeclusterclient.CRTClusterClient{} - tkrName = testTKR - crtCtl.GetReturns(errors.New("some error")) - tkrV1Alpha1, err = GetTKRByNameV1Alpha1(ctx, crtCtl, tkrName) - }) - - It("should return nil TKR", func() { - Expect(err).Should(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("some error")) - Expect(tkrV1Alpha1).Should(BeNil()) - }) - }) - - When("there is some error for the call to GetTKRByNameV1Alpha3()", func() { - BeforeEach(func() { - crtCtl = &fakeclusterclient.CRTClusterClient{} - tkrName = testTKR - cluster := &clusterapiv1beta1.Cluster{} - crtCtl.GetReturns(errors.New("some error")) - tkrV1Alpha3, err = GetTKRByNameV1Alpha3(ctx, crtCtl, cluster, tkrName) - }) - - It("should return nil TKR", func() { - Expect(err).Should(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("some error")) - Expect(tkrV1Alpha3).Should(BeNil()) - }) - }) - - When("there is no error for the call to GetTKRByNameV1Alpha1()", func() { - BeforeEach(func() { - crtCtl = &fakeclusterclient.CRTClusterClient{} - tkrName = testTKR - tkrV1Alpha1, err = GetTKRByNameV1Alpha1(ctx, crtCtl, tkrName) - }) - - It("should return nil TKR", func() { - Expect(err).ShouldNot(HaveOccurred()) - Expect(tkrV1Alpha1).ShouldNot(BeNil()) - }) - }) - - When("there is no error for the call to GetTKRByNameV1Alpha3()", func() { - BeforeEach(func() { - crtCtl = &fakeclusterclient.CRTClusterClient{} - tkrName = testTKR - cluster := &clusterapiv1beta1.Cluster{} - tkrV1Alpha3, err = GetTKRByNameV1Alpha3(ctx, crtCtl, cluster, tkrName) - }) - - It("should return nil TKR", func() { - Expect(err).ShouldNot(HaveOccurred()) - Expect(tkrV1Alpha3).ShouldNot(BeNil()) - }) - }) - - When("tkr is available as annotation on cluster resource", func() { - BeforeEach(func() { - crtCtl = &fakeclusterclient.CRTClusterClient{} - tkrName = testTKR - var buf bytes.Buffer - out, _ := yaml.Marshal(tkrV1Alpha3) - w, _ := gzip.NewWriterLevel(&buf, gzip.BestCompression) - _, err = w.Write(out) - w.Close() - tkrString := base64.StdEncoding.EncodeToString(buf.Bytes()) - annotation := make(map[string]string) - annotation["run.tanzu.vmware.com/tkr-spec"] = tkrString - cluster := &clusterapiv1beta1.Cluster{ - TypeMeta: metav1.TypeMeta{ - Kind: "Cluster", - APIVersion: "v1beta1", - }, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{}, Annotations: annotation}, - } - tkrV1Alpha3, err = getTKRFromAnnotation(cluster.Annotations) - Expect(err).NotTo(HaveOccurred()) - Expect(tkrV1Alpha3).NotTo(BeNil()) - }) - - It("should return non nil TKR", func() { - Expect(err).ShouldNot(HaveOccurred()) - Expect(tkrV1Alpha3).ShouldNot(BeNil()) - }) - }) - - When("tkr is not available in cluster", func() { - BeforeEach(func() { - crtCtl = &fakeclusterclient.CRTClusterClient{} - tkrName = testTKR - var buf bytes.Buffer - out, _ := yaml.Marshal(tkrV1Alpha3) - w, _ := gzip.NewWriterLevel(&buf, gzip.BestCompression) - _, err = w.Write(out) - w.Close() - tkrString := base64.StdEncoding.EncodeToString(buf.Bytes()) - annotation := make(map[string]string) - annotation["run.tanzu.vmware.com/tkr-spec"] = tkrString - cluster := &clusterapiv1beta1.Cluster{ - TypeMeta: metav1.TypeMeta{ - Kind: "Cluster", - APIVersion: "v1beta1", - }, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{}, Annotations: annotation}, - } - tkrName = testTKR - crtCtl.GetReturns(apierrors.NewNotFound(schema.GroupResource{Resource: "TanzuKubernetesRelease"}, testTKR)) - tkrV1Alpha3, err = GetTKRByNameV1Alpha3(ctx, crtCtl, cluster, tkrName) - }) - - It("should return tkr from annotation on cluster", func() { - Expect(err).ShouldNot(HaveOccurred()) - Expect(tkrV1Alpha3).ShouldNot(BeNil()) - }) - }) - }) - - Context("GetBootstrapPackageNameFromTKR()", func() { - var ( - ctx context.Context - crtCtl *fakeclusterclient.CRTClusterClient - err error - pkgRefName string - cluster *clusterapiv1beta1.Cluster - ) - - When("cluster does not contain TKR label", func() { - BeforeEach(func() { - pkgRefName = testPkg - cluster = &clusterapiv1beta1.Cluster{ - TypeMeta: metav1.TypeMeta{ - Kind: "Cluster", - APIVersion: "v1beta1", - }, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{}}, - } - crtCtl = &fakeclusterclient.CRTClusterClient{} - _, _, err = GetBootstrapPackageNameFromTKR(ctx, crtCtl, pkgRefName, cluster) - }) - - It("should fail with no label found in the cluster object", func() { - Expect(err).Should(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring(fmt.Sprintf("no '%s' label found in the cluster object", constants.TKRLabelClassyClusters))) - }) - }) - - When("TKR object non existing", func() { - BeforeEach(func() { - pkgRefName = testPkg - cluster = &clusterapiv1beta1.Cluster{ - TypeMeta: metav1.TypeMeta{ - Kind: "Cluster", - APIVersion: "v1beta1", - }, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{constants.TKRLabelClassyClusters: testTKR}}, - } - crtCtl = &fakeclusterclient.CRTClusterClient{} - crtCtl.GetReturns(errors.New("some error")) - _, _, err = GetBootstrapPackageNameFromTKR(ctx, crtCtl, pkgRefName, cluster) - }) - - It("should fail with unable to fetch TKR object", func() { - Expect(err).Should(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("unable to fetch TKR object")) - }) - }) - - When("cluster contains TKR label and TKR object existing", func() { - BeforeEach(func() { - pkgRefName = testPkg - cluster = &clusterapiv1beta1.Cluster{ - TypeMeta: metav1.TypeMeta{ - Kind: "Cluster", - APIVersion: "v1beta1", - }, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{constants.TKRLabelClassyClusters: testTKR}}, - } - crtCtl = &fakeclusterclient.CRTClusterClient{} - _, _, err = GetBootstrapPackageNameFromTKR(ctx, crtCtl, pkgRefName, cluster) - }) - - It("should not be able to find bootstrap packages in the TKR, as none is defined", func() { - Expect(err).Should(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("unable to find any bootstrap packages")) - }) - }) - }) -}) diff --git a/addons/pkg/util/util_suite_test.go b/addons/pkg/util/util_suite_test.go deleted file mode 100644 index 0a54f3ee78..0000000000 --- a/addons/pkg/util/util_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestUtil(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Util Suite") -} diff --git a/addons/pkg/webhooks/certificates.go b/addons/pkg/webhooks/certificates.go deleted file mode 100644 index 885ccf8684..0000000000 --- a/addons/pkg/webhooks/certificates.go +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package webhooks - -import ( - "bytes" - "context" - "crypto/tls" - "crypto/x509" - "fmt" - "os" - "time" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" - certutil "k8s.io/client-go/util/cert" - "k8s.io/client-go/util/keyutil" - "k8s.io/client-go/util/retry" - "knative.dev/pkg/webhook/certificates/resources" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -func addCertsToWebhookConfigs(ctx context.Context, k8sclient kubernetes.Interface, labelSelector string, secret *corev1.Secret) error { - allValidatingWebhookConfigurations, err := k8sclient.AdmissionregistrationV1().ValidatingWebhookConfigurations().List(ctx, metav1.ListOptions{LabelSelector: labelSelector}) - if err != nil { - return err - } - for idx := range allValidatingWebhookConfigurations.Items { - configName := allValidatingWebhookConfigurations.Items[idx].Name - validatingWebhookConfiguration, err := k8sclient.AdmissionregistrationV1().ValidatingWebhookConfigurations().Get(ctx, configName, metav1.GetOptions{}) - if err != nil { - return err - } - - for idx := range validatingWebhookConfiguration.Webhooks { - validatingWebhookConfiguration.Webhooks[idx].ClientConfig.CABundle = secret.Data[resources.CACert] - } - if _, err := k8sclient.AdmissionregistrationV1().ValidatingWebhookConfigurations().Update(ctx, validatingWebhookConfiguration, metav1.UpdateOptions{}); err != nil { - return fmt.Errorf("error updating CA cert of ValidatingWebhookConfiguration %s: %v", configName, err) - } - } - - allMutatingWebhookConfigurations, err := k8sclient.AdmissionregistrationV1().MutatingWebhookConfigurations().List(ctx, metav1.ListOptions{LabelSelector: labelSelector}) - if err != nil { - return err - } - for idx := range allMutatingWebhookConfigurations.Items { - configName := allMutatingWebhookConfigurations.Items[idx].Name - mutatingWebhookConfiguration, err := k8sclient.AdmissionregistrationV1().MutatingWebhookConfigurations().Get(ctx, configName, metav1.GetOptions{}) - if err != nil { - return err - } - - for idx := range mutatingWebhookConfiguration.Webhooks { - mutatingWebhookConfiguration.Webhooks[idx].ClientConfig.CABundle = secret.Data[resources.CACert] - } - if _, err := k8sclient.AdmissionregistrationV1().MutatingWebhookConfigurations().Update(ctx, mutatingWebhookConfiguration, metav1.UpdateOptions{}); err != nil { - return fmt.Errorf("error updating CA cert of MutatingWebhookConfiguration %s: %v", configName, err) - } - } - return nil -} - -// WriteServerTLSToFileSystem writes servers certificate and key in provided secret to the filesystem paths provided. -func WriteServerTLSToFileSystem(ctx context.Context, certPath, keyPath string, secret *corev1.Secret) error { - // Only write certificates if they do not already match what's in the filesystem - fileSystemMatches, err := filesMatchSecret(certPath, keyPath, secret) - if err != nil { - return err - } - if fileSystemMatches { - return nil - } - if err := certutil.WriteCert(certPath, secret.Data[resources.ServerCert]); err != nil { - return err - } - if err := keyutil.WriteKey(keyPath, secret.Data[resources.ServerKey]); err != nil { - return err - } - return nil -} - -func filesMatchSecret(certPath, keyPath string, secret *corev1.Secret) (bool, error) { - _, err := os.Stat(certPath) - if err != nil && !os.IsNotExist(err) { - return false, err - } - if os.IsNotExist(err) { - return false, nil - } - - _, err = os.Stat(keyPath) - if err != nil && !os.IsNotExist(err) { - return false, err - } - if os.IsNotExist(err) { - return false, nil - } - - serverCertFromFile, err := os.ReadFile(certPath) - if err != nil { - return false, err - } - if !bytes.Equal(serverCertFromFile, secret.Data[resources.ServerCert]) { - return false, nil - } - - serverKeyFromFile, err := os.ReadFile(keyPath) - if err != nil { - return false, err - } - if !bytes.Equal(serverKeyFromFile, secret.Data[resources.ServerKey]) { - return false, nil - } - - return true, nil -} - -// InstallNewCertificates creates a new set of keys and certificates and saves them to the filesystem paths provided. -// Adds the CA certificate to webhook configurations matching label selector. -// Returns a secret containing the server key, sever certificate and CA certificate. -func InstallNewCertificates(ctx context.Context, k8sConfig *rest.Config, certPath, keyPath, secretName, namespace, serviceName, labelSelector string) (*corev1.Secret, error) { - if labelSelector == "" { - return nil, fmt.Errorf("label selector not provided for webhook configurations udpate") - } - secret, err := resources.MakeSecret(ctx, secretName, namespace, serviceName) - if err != nil { - return nil, err - } - - err = InstallCertificates(ctx, k8sConfig, secret, certPath, keyPath, labelSelector) - if err != nil { - return nil, err - } - return secret, nil -} - -// InstallCertificates saves server certificate and key in provided secret to the filesystem paths provided. -// Adds the CA certificate to webhook configuration matching label selector. -func InstallCertificates(ctx context.Context, k8sConfig *rest.Config, secret *corev1.Secret, certPath, keyPath, labelSelector string) error { - if err := WriteServerTLSToFileSystem(ctx, certPath, keyPath, secret); err != nil { - return err - } - k8sclient, err := client.New(k8sConfig, client.Options{}) - if err != nil { - return err - } - err = updateOrCreateTLSSecret(ctx, k8sclient, secret) - if err != nil { - return err - } - - clientSet, err := kubernetes.NewForConfig(k8sConfig) - if err != nil { - return err - } - err = addCertsToWebhookConfigs(ctx, clientSet, labelSelector, secret) - if err != nil { - return err - } - - return nil -} - -// ValidateTLSSecret checks secret has all required keys and certificates. -// Checks certificate lifetime is valid. -func ValidateTLSSecret(tlsSecret *corev1.Secret, certGracePeriod time.Duration) error { - if tlsSecret == nil { - return fmt.Errorf("webhook certificate secret is empty") - } - if _, haskey := tlsSecret.Data[resources.ServerKey]; !haskey { - return fmt.Errorf("webhook certificate secret is missing key %q", resources.ServerKey) - } - if _, haskey := tlsSecret.Data[resources.ServerCert]; !haskey { - return fmt.Errorf("webhook certificate secret is missing key %q", resources.ServerCert) - } - if _, haskey := tlsSecret.Data[resources.CACert]; !haskey { - return fmt.Errorf("webhook certificate secret is missing key %q", resources.CACert) - } - - cert, err := tls.X509KeyPair(tlsSecret.Data[resources.ServerCert], tlsSecret.Data[resources.ServerKey]) - if err != nil { - return err - } - certData, err := x509.ParseCertificate(cert.Certificate[0]) - if err != nil { - return err - } - if time.Now().Add(certGracePeriod).After(certData.NotAfter) { - return fmt.Errorf("webhook certificate expired on %q", certData.NotAfter) - } - return nil -} - -func updateOrCreateTLSSecret(ctx context.Context, k8sclient client.Client, tlsSecret *corev1.Secret) error { - if tlsSecret == nil { - return nil - } - currentSecret := &corev1.Secret{} - err := k8sclient.Get(ctx, client.ObjectKey{ - Namespace: tlsSecret.Namespace, - Name: tlsSecret.Name}, currentSecret) - if apierrors.IsNotFound(err) { - err = k8sclient.Create(ctx, tlsSecret) - if err != nil { - return err - } - return nil - } - if err != nil { - return err - } - - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { - return k8sclient.Update(ctx, tlsSecret) - }) - if err != nil { - return err - } - return nil -} diff --git a/addons/pkg/webhooks/certificates_test.go b/addons/pkg/webhooks/certificates_test.go deleted file mode 100644 index c1182dc3d3..0000000000 --- a/addons/pkg/webhooks/certificates_test.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package webhooks - -import ( - "context" - "os" - "path" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - cert2 "k8s.io/client-go/util/cert" - "k8s.io/client-go/util/keyutil" - "knative.dev/pkg/webhook/certificates/resources" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" -) - -const ( - addonNamespace = "tkg-system" - webhookServiceName = "webhook-service" -) - -var ( - ctx = context.TODO() - certPath string - keyPath string - tmpDir string -) - -var _ = BeforeSuite(func() { - var err error - tmpDir, err = os.MkdirTemp("/tmp", "webhooktest") - Expect(err).ToNot(HaveOccurred()) - certPath = path.Join(tmpDir, "tls.cert") - keyPath = path.Join(tmpDir, "tls.key") -}) - -var _ = AfterSuite(func() { - By("remove test resources") - _ = os.RemoveAll(tmpDir) // ignore errors since we check directory status next - - _, err := os.Stat(tmpDir) - Expect(os.IsNotExist(err)) - -}, 60) - -var _ = Describe("Webhook", func() { - - Context("server's certificate and key", func() { - It("should be generated and written to the webhook server CertDir", func() { - secret, err := resources.MakeSecret(ctx, constants.WebhookScrtName, addonNamespace, webhookServiceName) - Expect(err).ToNot(HaveOccurred()) - err = WriteServerTLSToFileSystem(ctx, certPath, keyPath, secret) - Expect(err).ToNot(HaveOccurred()) - Expect(secret).NotTo(BeNil()) - cert, err := cert2.CertsFromFile(certPath) - Expect(err).ToNot(HaveOccurred()) - certPEM, err := cert2.EncodeCertificates(cert[0]) - Expect(err).ToNot(HaveOccurred()) - Expect(certPEM).To(Equal(secret.Data[resources.ServerCert])) - key, err := keyutil.PrivateKeyFromFile(keyPath) - Expect(err).ToNot(HaveOccurred()) - orgKey, err := keyutil.ParsePrivateKeyPEM(secret.Data[resources.ServerKey]) - Expect(err).ToNot(HaveOccurred()) - Expect(key).To(Equal(orgKey)) - }) - It("should only be written to file system if content is different", func() { - secret, err := resources.MakeSecret(ctx, constants.WebhookScrtName, addonNamespace, webhookServiceName) - Expect(err).ToNot(HaveOccurred()) - err = WriteServerTLSToFileSystem(ctx, certPath, keyPath, secret) - Expect(err).ToNot(HaveOccurred()) - Expect(secret).NotTo(BeNil()) - certPathFile, err := os.Stat(certPath) - Expect(err).ToNot(HaveOccurred()) - firstCertPathModifiedTime := certPathFile.ModTime() - keyPathFile, err := os.Stat(keyPath) - Expect(err).ToNot(HaveOccurred()) - firstKeyPathModifiedTime := keyPathFile.ModTime() - - By("files should not be modified if content will remain unchanged") - err = WriteServerTLSToFileSystem(ctx, certPath, keyPath, secret) - Expect(err).ToNot(HaveOccurred()) - Expect(secret).NotTo(BeNil()) - certPathFile, err = os.Stat(certPath) - Expect(err).ToNot(HaveOccurred()) - secondCertPathModifiedTime := certPathFile.ModTime() - keyPathFile, err = os.Stat(keyPath) - Expect(err).ToNot(HaveOccurred()) - secondKeyPathModifiedTime := keyPathFile.ModTime() - Expect(firstCertPathModifiedTime.Equal(secondCertPathModifiedTime)) - Expect(firstKeyPathModifiedTime.Equal(secondKeyPathModifiedTime)) - }) - It("Should be rewritten to file system if content will be different", func() { - secret, err := resources.MakeSecret(ctx, constants.WebhookScrtName, addonNamespace, webhookServiceName) - Expect(err).ToNot(HaveOccurred()) - err = WriteServerTLSToFileSystem(ctx, certPath, keyPath, secret) - Expect(err).ToNot(HaveOccurred()) - Expect(secret).NotTo(BeNil()) - - time.Sleep(time.Millisecond) // lets wait just enough to make sure modtime is different enough - f, err := os.Create(certPath) - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - _, err = f.WriteString("garbled data") - Expect(err).ToNot(HaveOccurred()) - - Expect(err).ToNot(HaveOccurred()) - err = WriteServerTLSToFileSystem(ctx, certPath, keyPath, secret) - Expect(err).ToNot(HaveOccurred()) - cert, err := cert2.CertsFromFile(certPath) - Expect(err).ToNot(HaveOccurred()) - certPEM, err := cert2.EncodeCertificates(cert[0]) - Expect(err).ToNot(HaveOccurred()) - Expect(certPEM).To(Equal(secret.Data[resources.ServerCert])) - key, err := keyutil.PrivateKeyFromFile(keyPath) - Expect(err).ToNot(HaveOccurred()) - orgKey, err := keyutil.ParsePrivateKeyPEM(secret.Data[resources.ServerKey]) - Expect(err).ToNot(HaveOccurred()) - Expect(key).To(Equal(orgKey)) - - }) - It("Should be rewritten to file system if files are missing", func() { - secret, err := resources.MakeSecret(ctx, constants.WebhookScrtName, addonNamespace, webhookServiceName) - Expect(err).ToNot(HaveOccurred()) - err = WriteServerTLSToFileSystem(ctx, certPath, keyPath, secret) - Expect(err).ToNot(HaveOccurred()) - Expect(secret).NotTo(BeNil()) - - err = os.Remove(certPath) - Expect(err).ToNot(HaveOccurred()) - _, err = os.Stat(certPath) - Expect(os.IsNotExist(err)).To(BeTrue()) - time.Sleep(time.Millisecond) // wait long enough for mod time to be different - err = WriteServerTLSToFileSystem(ctx, certPath, keyPath, secret) - Expect(err).ToNot(HaveOccurred()) - - cert, err := cert2.CertsFromFile(certPath) - Expect(err).ToNot(HaveOccurred()) - certPEM, err := cert2.EncodeCertificates(cert[0]) - Expect(err).ToNot(HaveOccurred()) - Expect(certPEM).To(Equal(secret.Data[resources.ServerCert])) - key, err := keyutil.PrivateKeyFromFile(keyPath) - Expect(err).ToNot(HaveOccurred()) - orgKey, err := keyutil.ParsePrivateKeyPEM(secret.Data[resources.ServerKey]) - Expect(err).ToNot(HaveOccurred()) - Expect(key).To(Equal(orgKey)) - - }) - It("should become invalid after one week", func() { - secret, err := resources.MakeSecret(ctx, constants.WebhookScrtName, addonNamespace, webhookServiceName) - Expect(err).ToNot(HaveOccurred()) - Expect(secret).NotTo(BeNil()) - err = ValidateTLSSecret(secret, time.Hour*24) // valid cert life is one week. One day should not make it invalid - Expect(err).ShouldNot(HaveOccurred()) - err = ValidateTLSSecret(secret, 8*time.Hour*24) // in 8 days certificate should be invalid - Expect(err).Should(HaveOccurred()) - - }) - }) -}) diff --git a/addons/pkg/webhooks/doc.go b/addons/pkg/webhooks/doc.go deleted file mode 100644 index a59fa201ec..0000000000 --- a/addons/pkg/webhooks/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package webhooks implements provides utilities for managing and configuration k8s webhooks. -package webhooks diff --git a/addons/pkg/webhooks/webhooks.go b/addons/pkg/webhooks/webhooks.go deleted file mode 100644 index 239659f1dc..0000000000 --- a/addons/pkg/webhooks/webhooks.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package webhooks provides functions to manage webhook TLS certificates -package webhooks - -import ( - "context" - "strings" - "time" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/client-go/rest" - "knative.dev/pkg/webhook/certificates/resources" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -type WebhookTLS struct { - Ctx context.Context - K8sConfig *rest.Config - CertPath string - KeyPath string - Name string - ServiceName string - LabelSelector string - Logger logr.Logger - secret *corev1.Secret - Namespace string - RotationTime time.Duration -} - -const ( - oneWeek = time.Hour * 24 * 7 - oneDay = time.Hour * 24 - RequireMinGracePeriod = time.Hour * 24 -) - -func (w *WebhookTLS) UpdateOrCreate() error { - // We need to have enough time (RequireMinGracePeriod) to rotate the certificates before their end of life (one week) to avoid race conditions. - // The function we are solving for is "RotationTime + RequiredMinGracePeriod <= oneWeek && RotationTime > 0" - maxAllowedRotationTime := oneWeek - RequireMinGracePeriod // ensures gracePeriod > 0 - - if w.RotationTime > maxAllowedRotationTime { - w.Logger.Info("rotation time will be set to maximum allowed value of " + maxAllowedRotationTime.String()) - w.RotationTime = maxAllowedRotationTime - } - if w.RotationTime <= time.Second*0 { - w.Logger.Info("rotation may not be 0 or less than 0, setting rotation to one day") - w.RotationTime = oneDay - } - - gracePeriod := oneWeek - w.RotationTime // Because of check above, graceperiod will never be less than 0. - - clusterClient, err := client.New(w.K8sConfig, client.Options{}) - if err != nil { - return err - } - currentSecret := &corev1.Secret{} - err = clusterClient.Get(w.Ctx, client.ObjectKey{ - Namespace: w.Namespace, - Name: w.Name}, currentSecret) - if err == nil { // secret found. Will use if valid - w.secret = currentSecret - } else if apierrors.IsNotFound(err) { // secret not found = "Create" case. - w.secret, err = resources.MakeSecret(w.Ctx, w.Name, w.Namespace, w.ServiceName) - if err != nil { - return err - } - } else { - return err - } - - err = ValidateTLSSecret(w.secret, gracePeriod) - if err != nil { - w.Logger.Info("invalid webhook tls secret: " + err.Error()) - w.Logger.Info("installing new certificates") - w.secret, err = InstallNewCertificates(w.Ctx, w.K8sConfig, w.CertPath, w.KeyPath, w.Name, w.Namespace, w.ServiceName, w.LabelSelector) - if err != nil { - return err - } - } - err = InstallCertificates(w.Ctx, w.K8sConfig, w.secret, w.CertPath, w.KeyPath, w.LabelSelector) - if err != nil { - return err - } - return nil -} - -func (w *WebhookTLS) ServerCert() []byte { - return w.secret.Data[resources.ServerCert] -} - -func (w *WebhookTLS) ServerKey() []byte { - return w.secret.Data[resources.ServerKey] -} - -func (w *WebhookTLS) CACert() []byte { - return w.secret.Data[resources.CACert] -} - -func (w *WebhookTLS) ManageCertificates(frequency time.Duration) error { - err := w.UpdateOrCreate() - if err != nil { - return err - } - ticker := time.NewTicker(frequency) - - go w.manageTLSCertificates(ticker) - - return nil -} - -func (w *WebhookTLS) manageTLSCertificates(ticker *time.Ticker) { - for { - select { - case <-w.Ctx.Done(): - return - - case <-ticker.C: - err := w.UpdateOrCreate() - if err != nil { - errMsg := strings.Join([]string{"Failed to manage Webhook TLS:", w.Name, "in", w.Namespace, "with", w.LabelSelector}, " ") - w.Logger.Error(err, errMsg) - } - } - } -} diff --git a/addons/pkg/webhooks/webhooks_suite_test.go b/addons/pkg/webhooks/webhooks_suite_test.go deleted file mode 100644 index 84b8811e32..0000000000 --- a/addons/pkg/webhooks/webhooks_suite_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package webhooks_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "sigs.k8s.io/controller-runtime/pkg/envtest/printer" -) - -func TestWebhookCertificates(t *testing.T) { - RegisterFailHandler(Fail) - - RunSpecsWithDefaultAndCustomReporters(t, - "Webhooks Suite", - []Reporter{printer.NewlineReporter{}}) -} diff --git a/addons/predicates/addon_config.go b/addons/predicates/addon_config.go deleted file mode 100644 index 1dfcb30ad9..0000000000 --- a/addons/predicates/addon_config.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package predicates - -import ( - "github.com/go-logr/logr" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/predicate" -) - -// ConfigOfKindWithoutAnnotation checks if the config is of the given Kind and does not have the given annotation -func ConfigOfKindWithoutAnnotation(annotation, configKind, namespace string, logger logr.Logger) predicate.Funcs { - return predicate.Funcs{ - UpdateFunc: func(e event.UpdateEvent) bool { - return processIfConfigOfKindWithoutAnnotation(annotation, configKind, namespace, e.ObjectNew, logger.WithValues("predicate", "updateEvent")) - }, - CreateFunc: func(e event.CreateEvent) bool { - return processIfConfigOfKindWithoutAnnotation(annotation, configKind, namespace, e.Object, logger.WithValues("predicate", "createEvent")) - }, - DeleteFunc: func(e event.DeleteEvent) bool { - return processIfConfigOfKindWithoutAnnotation(annotation, configKind, namespace, e.Object, logger.WithValues("predicate", "deleteEvent")) - }, - GenericFunc: func(e event.GenericEvent) bool { - return processIfConfigOfKindWithoutAnnotation(annotation, configKind, namespace, e.Object, logger.WithValues("predicate", "genericEvent")) - }, - } -} - -// processIfConfigOfKindWithoutAnnotation determines if the input object is of the specified Kind in the given namespace -// without the given annotation. For input objects do not match with the specified Kind or not in the given namespace, it returns true. -func processIfConfigOfKindWithoutAnnotation(annotation, configKind, namespace string, obj client.Object, logger logr.Logger) bool { - if kind := obj.GetObjectKind().GroupVersionKind().Kind; kind != configKind { - return true - } - if obj.GetNamespace() != namespace { - return true - } - - annotations := obj.GetAnnotations() - if annotations != nil { - if _, ok := annotations[annotation]; ok { - log := logger.WithValues("kind", configKind, "namespace", obj.GetNamespace(), "name", obj.GetName()) - log.V(6).Info("resource has annotation", "annotation", annotation) - return false - } - } - return true -} diff --git a/addons/predicates/addon_config_test.go b/addons/predicates/addon_config_test.go deleted file mode 100644 index 5daa4fca5a..0000000000 --- a/addons/predicates/addon_config_test.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package predicates - -import ( - "github.com/go-logr/logr" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - ctrl "sigs.k8s.io/controller-runtime" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - cniv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/cni/v1alpha2" -) - -var _ = Describe("Addon config annotation predicate", func() { - Context("predicate: processIfConfigOfKindWithoutAnnotation()", func() { - var ( - antreaConfigObj *cniv1alpha2.AntreaConfig - configKind string - namespace string - logger logr.Logger - result bool - ) - - BeforeEach(func() { - namespace = "test-ns" - logger = ctrl.Log.WithName("processIfConfigOfKindWithoutAnnotation") - antreaConfigObj = &cniv1alpha2.AntreaConfig{ - TypeMeta: metav1.TypeMeta{Kind: constants.AntreaConfigKind}, - ObjectMeta: metav1.ObjectMeta{ - Name: "test-config-name", - Namespace: namespace, - Annotations: map[string]string{ - constants.TKGAnnotationTemplateConfig: "true", - }}, - } - configKind = constants.AntreaConfigKind - }) - - When("input config matches with specified Kind and has the annotation", func() { - BeforeEach(func() { - result = processIfConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, configKind, namespace, antreaConfigObj, logger) - }) - - It("should return false", func() { - Expect(result).To(BeFalse()) - }) - }) - - When("input config does not have the specified annotation", func() { - BeforeEach(func() { - delete(antreaConfigObj.Annotations, constants.TKGAnnotationTemplateConfig) - result = processIfConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, configKind, namespace, antreaConfigObj, logger) - }) - - It("should return true", func() { - Expect(result).To(BeTrue()) - }) - }) - - When("input config's annotations is nil", func() { - BeforeEach(func() { - antreaConfigObj.Annotations = nil - result = processIfConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, configKind, namespace, antreaConfigObj, logger) - }) - - It("should return true", func() { - Expect(result).To(BeTrue()) - }) - }) - - When("input config does not match with the given Kind", func() { - BeforeEach(func() { - configKind = constants.CalicoConfigKind - result = processIfConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, configKind, namespace, antreaConfigObj, logger) - }) - - It("should return true", func() { - Expect(result).To(BeTrue()) - }) - }) - - When("input config is not in the given namespace", func() { - BeforeEach(func() { - result = processIfConfigOfKindWithoutAnnotation(constants.TKGAnnotationTemplateConfig, configKind, "another-ns", antreaConfigObj, logger) - }) - - It("should return true", func() { - Expect(result).To(BeTrue()) - }) - }) - }) -}) diff --git a/addons/predicates/addon_secret.go b/addons/predicates/addon_secret.go deleted file mode 100644 index a2c04eec66..0000000000 --- a/addons/predicates/addon_secret.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package predicates - -import ( - "fmt" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/predicate" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - addontypes "github.com/vmware-tanzu/tanzu-framework/addons/pkg/types" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" -) - -// processAddonSecret returns true if secret should be processed. -// Secret can be processed if it is of type AddonSecretType and -// has addon related labels. -func processAddonSecret(o client.Object, log logr.Logger) bool { - var secret *corev1.Secret - switch obj := o.(type) { - case *corev1.Secret: - secret = obj - default: - // Defaults to true so we don't filter out other objects as the - // filters are global - log.Info("Expected object type of secret. Got object type", "actualType", fmt.Sprintf("%T", o)) - return true - } - - if isAddonType(secret) && hasAddonLabels(secret) && !util.IsAddonPaused(secret) { - return true - } - - log.V(7).Info("Secret is not a addon", constants.NamespaceLogKey, secret.Namespace, constants.NameLogKey, secret.Name) - - return false -} - -// isAddonType returns true if secret is of addon type -func isAddonType(secret *corev1.Secret) bool { - return secret.Type == addontypes.AddonSecretType -} - -// hasAddonLabels returns true if secret has addon-name and cluster-name labels with non-empty values -func hasAddonLabels(secret *corev1.Secret) bool { - addonName := util.GetAddonNameFromAddonSecret(secret) - clusterName := util.GetClusterNameFromAddonSecret(secret) - - if addonName != "" && clusterName != "" { - return true - } - - return false -} - -// AddonSecret returns predicate funcs for addon secret -func AddonSecret(log logr.Logger) predicate.Funcs { - return predicate.NewPredicateFuncs(func(object client.Object) bool { - return processAddonSecret(object, log) - }) -} diff --git a/addons/predicates/bom_configmap.go b/addons/predicates/bom_configmap.go deleted file mode 100644 index 977ea60c89..0000000000 --- a/addons/predicates/bom_configmap.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package predicates - -import ( - "fmt" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/predicate" - - addonconstants "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" -) - -// processBomConfigMap returns true if configmap should be processed. -// ConfigMap can be processed if it is has tkr label -func processBomConfigMap(o client.Object, log logr.Logger) bool { - var configmap *corev1.ConfigMap - switch obj := o.(type) { - case *corev1.ConfigMap: - configmap = obj - default: - // Defaults to true so we don't filter out other objects as the - // filters are global - log.Info("Expected object type of configmap. Got object type", "actualType", fmt.Sprintf("%T", o)) - return true - } - - if configmap.Namespace == addonconstants.TKGBomNamespace && isABom(configmap) { - return true - } - - log.V(7).Info("Configmap is not a BOM", "configmap-namespace", configmap.Namespace, "configmap-name", configmap.Name) - - return false -} - -// isABom returns true if configmap holds a BOM -func isABom(configMap *corev1.ConfigMap) bool { - tkrName := util.GetTKRNameFromBOMConfigMap(configMap) - return tkrName != "" -} - -// BomConfigMap returns a predicate.Predicate that filters configmap -// that holds bom -func BomConfigMap(log logr.Logger) predicate.Funcs { - return predicate.Funcs{ - CreateFunc: func(e event.CreateEvent) bool { return processBomConfigMap(e.Object, log) }, - UpdateFunc: func(e event.UpdateEvent) bool { return processBomConfigMap(e.ObjectNew, log) }, - DeleteFunc: func(e event.DeleteEvent) bool { return false }, - GenericFunc: func(e event.GenericEvent) bool { return processBomConfigMap(e.Object, log) }, - } -} diff --git a/addons/predicates/doc.go b/addons/predicates/doc.go deleted file mode 100644 index 557115b09d..0000000000 --- a/addons/predicates/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package predicates implements add predicate functionality. -package predicates diff --git a/addons/predicates/kubeadm_control_plane.go b/addons/predicates/kubeadm_control_plane.go deleted file mode 100644 index 74a3b7f738..0000000000 --- a/addons/predicates/kubeadm_control_plane.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package predicates - -import ( - "github.com/go-logr/logr" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/predicate" -) - -/* -// processKubeadmControlPlaneUpdate detects if kcp update event needs to be processed or not -// kcp event is process if there is a kcp.spec.version change detected between old and new objects -func processKubeadmControlPlaneUpdate(old runtime.Object, new runtime.Object, log logr.Logger) bool { - var ( - kcpOld *controlplanev1alpha3.KubeadmControlPlane - kcpNew *controlplanev1alpha3.KubeadmControlPlane - ) - - switch obj := old.(type) { - case *controlplanev1alpha3.KubeadmControlPlane: - kcpOld = obj - default: - // Defaults to true so we don't filter out other objects as the - // filters are global - log.Info("Expected object type of kcp. Got object type", "actualType", fmt.Sprintf("%T", obj)) - return true - } - - switch obj := new.(type) { - case *controlplanev1alpha3.KubeadmControlPlane: - kcpNew = obj - default: - // Defaults to true so we don't filter out other objects as the - // filters are global - log.Info("Expected object type of kcp. Got object type", "actualType", fmt.Sprintf("%T", obj)) - return true - } - - // If there is a version change (upgrade or downgrade) then return true for reconciling kcp - if kcpNew.Spec.Version != kcpOld.Spec.Version { - return true - } - - log.V(7).Info("KCP version change not detected", - constants.NAMESPACE_LOG_KEY, kcpNew.Namespace, constants.NAME_LOG_KEY, kcpNew.Name, - "old-version", kcpOld.Spec.Version, "new-version", kcpNew.Spec.Version) - - return false -}*/ - -// KubeadmControlPlane returns a predicate.Predicate that detects kubeadm -// control plane version changes i.e. upgrade of a cluster -func KubeadmControlPlane(log logr.Logger) predicate.Funcs { - return predicate.Funcs{ - CreateFunc: func(e event.CreateEvent) bool { return true }, - UpdateFunc: func(e event.UpdateEvent) bool { return true }, - DeleteFunc: func(e event.DeleteEvent) bool { return false }, - GenericFunc: func(e event.GenericEvent) bool { return false }, - } -} diff --git a/addons/predicates/tkr.go b/addons/predicates/tkr.go deleted file mode 100644 index 4f94ec0d73..0000000000 --- a/addons/predicates/tkr.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package predicates - -import ( - "strings" - - "github.com/go-logr/logr" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/predicate" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" -) - -// TKR returns a predicate.Predicate that filters tkr -func TKR(log logr.Logger) predicate.Funcs { - return predicate.Funcs{ - CreateFunc: func(e event.CreateEvent) bool { return true }, - UpdateFunc: func(e event.UpdateEvent) bool { return true }, - DeleteFunc: func(e event.DeleteEvent) bool { return false }, - GenericFunc: func(e event.GenericEvent) bool { return true }, - } -} - -// ClusterHasLabel checks if the cluster has the given label -func ClusterHasLabel(label string, logger logr.Logger) predicate.Funcs { - return predicate.Funcs{ - UpdateFunc: func(e event.UpdateEvent) bool { - return processIfClusterHasLabel(label, e.ObjectNew, logger.WithValues("predicate", "updateEvent")) - }, - CreateFunc: func(e event.CreateEvent) bool { - return processIfClusterHasLabel(label, e.Object, logger.WithValues("predicate", "createEvent")) - }, - DeleteFunc: func(e event.DeleteEvent) bool { - return processIfClusterHasLabel(label, e.Object, logger.WithValues("predicate", "deleteEvent")) - }, - GenericFunc: func(e event.GenericEvent) bool { - return processIfClusterHasLabel(label, e.Object, logger.WithValues("predicate", "genericEvent")) - }, - } -} - -// processIfClusterHasLabel determines if the input object is a cluster with a non-empty -// value for the specified label. For other input object types, it returns true -func processIfClusterHasLabel(label string, obj client.Object, logger logr.Logger) bool { - kind := obj.GetObjectKind().GroupVersionKind().Kind - - if kind != constants.ClusterKind { - return true - } - - labels := obj.GetLabels() - if labels != nil { - if l, ok := labels[label]; ok && l != "" { - return true - } - } - - log := logger.WithValues("namespace", obj.GetNamespace(), strings.ToLower(kind), obj.GetName()) - log.V(6).Info("Cluster resource does not have label", "label", label) - return false -} diff --git a/addons/predicates/tkr_test.go b/addons/predicates/tkr_test.go deleted file mode 100644 index e0ea4913d4..0000000000 --- a/addons/predicates/tkr_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package predicates - -import ( - "testing" - - "github.com/go-logr/logr" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" -) - -const ( - testClusterAPIVersion = "cluster.x-k8s.io/v1beta1" - testClusterKind = "Cluster" - testClusterName = "test-cluster" - testNamespace = "test-ns" - testSecretAPIVersion = "v1" - testSecretKind = "Secret" - testSecretName = "test-secret" - testTKRLabel = "v1.22.3" -) - -func TestPredicates(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "predicates unit tests") -} - -var _ = Describe("Cluster Label Check", func() { - Context("processIfClusterHasLabel()", func() { - var ( - result bool - log logr.Logger - clusterObj *clusterapiv1beta1.Cluster - secretObj *v1.Secret - ) - BeforeEach(func() { - log = ctrl.Log.WithName("processIfClusterHasLabel") - - clusterObj = &clusterapiv1beta1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: testClusterKind, APIVersion: testClusterAPIVersion}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace}, - } - - secretObj = &v1.Secret{ - TypeMeta: metav1.TypeMeta{Kind: testSecretKind, APIVersion: testSecretAPIVersion}, - ObjectMeta: metav1.ObjectMeta{Name: testSecretName, Namespace: testNamespace}, - } - }) - - When("cluster label matches the input label", func() { - BeforeEach(func() { - clusterObj.Labels = map[string]string{constants.TKRLabel: testTKRLabel} - result = processIfClusterHasLabel(constants.TKRLabel, clusterObj, log) - }) - It("should return true", func() { - Expect(result).To(BeTrue()) - }) - }) - - When("cluster label does not match the input label", func() { - BeforeEach(func() { - clusterObj.Labels = map[string]string{"otherLabel": testTKRLabel} - result = processIfClusterHasLabel(constants.TKRLabel, clusterObj, log) - }) - It("should return false", func() { - Expect(result).To(BeFalse()) - }) - }) - - When("cluster labels be empty", func() { - BeforeEach(func() { - clusterObj.Labels = map[string]string{} - result = processIfClusterHasLabel(constants.TKRLabel, clusterObj, log) - }) - It("should return false", func() { - Expect(result).To(BeFalse()) - }) - }) - - When("cluster labels be nil", func() { - BeforeEach(func() { - clusterObj.Labels = nil - result = processIfClusterHasLabel(constants.TKRLabel, clusterObj, log) - }) - It("should return false", func() { - Expect(result).To(BeFalse()) - }) - }) - - When("cluster label's value be empty", func() { - BeforeEach(func() { - clusterObj.Labels = map[string]string{"otherLabel": ""} - result = processIfClusterHasLabel(constants.TKRLabel, clusterObj, log) - }) - It("should return false", func() { - Expect(result).To(BeFalse()) - }) - }) - - When("passed object not be cluster", func() { - BeforeEach(func() { - secretObj.Labels = map[string]string{constants.TKRLabel: testTKRLabel} - result = processIfClusterHasLabel(constants.TKRLabel, secretObj, log) - }) - It("should return true", func() { - Expect(result).To(BeTrue()) - }) - }) - }) -}) diff --git a/addons/test/builder/builders.go b/addons/test/builder/builders.go deleted file mode 100644 index 17b7a66e2b..0000000000 --- a/addons/test/builder/builders.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package builder - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// ClusterBootstrapBuilder holds the variables and objects required to build a runv1alpha3.ClusterBootstrap. -type ClusterBootstrapBuilder struct { - namespace string - name string - cni *runv1alpha3.ClusterBootstrapPackage - csi *runv1alpha3.ClusterBootstrapPackage - cpi *runv1alpha3.ClusterBootstrapPackage - kapp *runv1alpha3.ClusterBootstrapPackage - additionalPackages []*runv1alpha3.ClusterBootstrapPackage -} - -// ClusterBootstrap returns a ClusterBootstrapBuilder with the given name and namespace. -func ClusterBootstrap(namespace, name string) *ClusterBootstrapBuilder { - return &ClusterBootstrapBuilder{ - namespace: namespace, - name: name, - additionalPackages: []*runv1alpha3.ClusterBootstrapPackage{}, - } -} - -func (c *ClusterBootstrapBuilder) WithCNIPackage(t *runv1alpha3.ClusterBootstrapPackage) *ClusterBootstrapBuilder { - c.cni = t - return c -} - -func (c *ClusterBootstrapBuilder) WithCSIPackage(t *runv1alpha3.ClusterBootstrapPackage) *ClusterBootstrapBuilder { - c.csi = t - return c -} - -func (c *ClusterBootstrapBuilder) WithCPIPackage(t *runv1alpha3.ClusterBootstrapPackage) *ClusterBootstrapBuilder { - c.cpi = t - return c -} - -func (c *ClusterBootstrapBuilder) WithKappPackage(t *runv1alpha3.ClusterBootstrapPackage) *ClusterBootstrapBuilder { - c.kapp = t - return c -} - -func (c *ClusterBootstrapBuilder) WithAdditionalPackage(t *runv1alpha3.ClusterBootstrapPackage) *ClusterBootstrapBuilder { - c.additionalPackages = append(c.additionalPackages, t) - return c -} - -// Build takes the objects and variables in the ClusterClass builder and uses them to create a ClusterClass object. -func (c *ClusterBootstrapBuilder) Build() *runv1alpha3.ClusterBootstrap { - obj := &runv1alpha3.ClusterBootstrap{ - TypeMeta: metav1.TypeMeta{ - Kind: "ClusterBootstrap", - APIVersion: runv1alpha3.GroupVersion.String(), - }, - ObjectMeta: metav1.ObjectMeta{ - Name: c.name, - Namespace: c.namespace, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: c.cni, - CSI: c.csi, - CPI: c.cpi, - Kapp: c.kapp, - AdditionalPackages: c.additionalPackages, - }, - } - return obj -} - -// ClusterBootstrapPackageBuilder holds the variables and objects required to build a runv1alpha3.ClusterBootstrapPackage. -type ClusterBootstrapPackageBuilder struct { - refName string - inline map[string]interface{} - secretRef string - providerRef *corev1.TypedLocalObjectReference -} - -// ClusterBootstrap returns a ClusterBootstrapBuilder with the given name and namespace. -func ClusterBootstrapPackage(refName string) *ClusterBootstrapPackageBuilder { - return &ClusterBootstrapPackageBuilder{ - refName: refName, - } -} - -func (c *ClusterBootstrapPackageBuilder) WithInline(inline map[string]interface{}) *ClusterBootstrapPackageBuilder { - c.inline = inline - return c -} - -func (c *ClusterBootstrapPackageBuilder) WithSecretRef(secretRef string) *ClusterBootstrapPackageBuilder { - c.secretRef = secretRef - return c -} - -func (c *ClusterBootstrapPackageBuilder) WithProviderRef(APIGroup, kind, name string) *ClusterBootstrapPackageBuilder { - c.providerRef = &corev1.TypedLocalObjectReference{ - APIGroup: &APIGroup, - Kind: kind, - Name: name, - } - return c -} - -// Build takes the objects and variables in the ClusterClass builder and uses them to create a ClusterClass object. -func (c *ClusterBootstrapPackageBuilder) Build() *runv1alpha3.ClusterBootstrapPackage { - obj := &runv1alpha3.ClusterBootstrapPackage{ - RefName: c.refName, - ValuesFrom: &runv1alpha3.ValuesFrom{ - Inline: c.inline, - SecretRef: c.secretRef, - ProviderRef: c.providerRef, - }, - } - return obj -} diff --git a/addons/test/builder/deepcopy.go b/addons/test/builder/deepcopy.go deleted file mode 100644 index 4fb0e70443..0000000000 --- a/addons/test/builder/deepcopy.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// This file is manually generated because interface{} is not supported by deepcopy-gen. - -package builder - -import ( - v1 "k8s.io/api/core/v1" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// DeepCopyInto is a deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterBootstrapBuilder) DeepCopyInto(out *ClusterBootstrapBuilder) { - *out = *in - if in.cni != nil { - in, out := &in.cni, &out.cni - *out = new(v1alpha3.ClusterBootstrapPackage) - (*in).DeepCopyInto(*out) - } - if in.csi != nil { - in, out := &in.csi, &out.csi - *out = new(v1alpha3.ClusterBootstrapPackage) - (*in).DeepCopyInto(*out) - } - if in.cpi != nil { - in, out := &in.cpi, &out.cpi - *out = new(v1alpha3.ClusterBootstrapPackage) - (*in).DeepCopyInto(*out) - } - if in.kapp != nil { - in, out := &in.kapp, &out.kapp - *out = new(v1alpha3.ClusterBootstrapPackage) - (*in).DeepCopyInto(*out) - } - if in.additionalPackages != nil { - in, out := &in.additionalPackages, &out.additionalPackages - *out = make([]*v1alpha3.ClusterBootstrapPackage, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(v1alpha3.ClusterBootstrapPackage) - (*in).DeepCopyInto(*out) - } - } - } -} - -// DeepCopy is a deepcopy function, copying the receiver, creating a new ClusterBootstrapBuilder. -func (in *ClusterBootstrapBuilder) DeepCopy() *ClusterBootstrapBuilder { - if in == nil { - return nil - } - out := new(ClusterBootstrapBuilder) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is a deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterBootstrapPackageBuilder) DeepCopyInto(out *ClusterBootstrapPackageBuilder) { - *out = *in - if in.inline != nil { - in, out := &in.inline, &out.inline - *out = make(map[string]interface{}, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.providerRef != nil { - in, out := &in.providerRef, &out.providerRef - *out = new(v1.TypedLocalObjectReference) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is a deepcopy function, copying the receiver, creating a new ClusterBootstrapPackageBuilder. -func (in *ClusterBootstrapPackageBuilder) DeepCopy() *ClusterBootstrapPackageBuilder { - if in == nil { - return nil - } - out := new(ClusterBootstrapPackageBuilder) - in.DeepCopyInto(out) - return out -} diff --git a/addons/test/builder/doc.go b/addons/test/builder/doc.go deleted file mode 100644 index 2e8411f86e..0000000000 --- a/addons/test/builder/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package builder implements builder and CRDs for creating API objects for testing. -// +kubebuilder:object:generate=true -package builder diff --git a/addons/test/testutil/test_fake_helpers.go b/addons/test/testutil/test_fake_helpers.go deleted file mode 100644 index ad1ee95265..0000000000 --- a/addons/test/testutil/test_fake_helpers.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package testutil - -import ( - "fmt" - - openapiv2 "github.com/google/gnostic/openapiv2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/version" - "k8s.io/client-go/discovery" - "k8s.io/client-go/openapi" - "k8s.io/client-go/rest" -) - -// FakeDiscovery customize the behavior of fake client-go FakeDiscovery.ServerPreferredResources to return -// a customized APIResourceList. -// The client-go FakeDiscovery.ServerPreferredResources is hardcoded to return nil. -// https://github.com/kubernetes/client-go/blob/master/discovery/fake/discovery.go#L85 -type FakeDiscovery struct { - FakeDiscovery discovery.DiscoveryInterface - Resources []*metav1.APIResourceList - APIGroups *metav1.APIGroupList -} - -var _ discovery.DiscoveryInterface = &FakeDiscovery{} - -func (c FakeDiscovery) RESTClient() rest.Interface { - return c.FakeDiscovery.RESTClient() -} - -func (c FakeDiscovery) ServerGroups() (*metav1.APIGroupList, error) { - return c.APIGroups, nil -} - -func (c FakeDiscovery) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) { - return c.FakeDiscovery.ServerGroupsAndResources() -} - -func (c FakeDiscovery) ServerVersion() (*version.Info, error) { - return c.FakeDiscovery.ServerVersion() -} - -func (c FakeDiscovery) OpenAPISchema() (*openapiv2.Document, error) { - return c.FakeDiscovery.OpenAPISchema() -} - -func (c FakeDiscovery) OpenAPIV3() openapi.Client { - return c.FakeDiscovery.OpenAPIV3() -} - -func (c FakeDiscovery) getFakeServerPreferredResources() []*metav1.APIResourceList { - return c.Resources -} - -func (c FakeDiscovery) ServerResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error) { - for _, res := range c.Resources { - if res.GroupVersion == groupVersion { - return res, nil - } - } - return nil, fmt.Errorf("no matching resources") -} - -func (c FakeDiscovery) ServerPreferredResources() ([]*metav1.APIResourceList, error) { - return c.getFakeServerPreferredResources(), nil -} - -func (c FakeDiscovery) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) { - return c.FakeDiscovery.ServerPreferredNamespacedResources() -} - -type FakeGVRHelper struct { - DiscoveryClient discovery.DiscoveryInterface -} - -func (f *FakeGVRHelper) GetGVR(gk schema.GroupKind) (*schema.GroupVersionResource, error) { - apiResourceList, err := f.DiscoveryClient.ServerPreferredResources() - if err != nil { - return nil, err - } - for _, apiResource := range apiResourceList { - gv, err := schema.ParseGroupVersion(apiResource.GroupVersion) - if err != nil { - return nil, err - } - if gv.Group == gk.Group { - for i := 0; i < len(apiResource.APIResources); i++ { - if apiResource.APIResources[i].Kind == gk.Kind { - return &schema.GroupVersionResource{Group: gv.Group, Resource: apiResource.APIResources[i].Name, Version: gv.Version}, nil - } - } - } - } - return nil, fmt.Errorf("unable to find server preferred resource %s/%s", gk.Group, gk.Kind) -} - -func (f *FakeGVRHelper) GetDiscoveryClient() discovery.DiscoveryInterface { - return f.DiscoveryClient -} diff --git a/addons/test/testutil/test_helpers.go b/addons/test/testutil/test_helpers.go deleted file mode 100644 index ce552fd94f..0000000000 --- a/addons/test/testutil/test_helpers.go +++ /dev/null @@ -1,369 +0,0 @@ -// Copyright 2020 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package testutil implements helper utilities used in tests. -package testutil - -import ( - "bytes" - "context" - "fmt" - "io" - "os" - "path/filepath" - "time" - - "golang.org/x/tools/go/packages" - - "github.com/onsi/ginkgo" - adminregv1 "k8s.io/api/admissionregistration/v1" - v1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/serializer/yaml" - utilerrors "k8s.io/apimachinery/pkg/util/errors" - - "k8s.io/apimachinery/pkg/util/wait" - yamlutil "k8s.io/apimachinery/pkg/util/yaml" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - "knative.dev/pkg/webhook/certificates/resources" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/secret" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/apiutil" - logf "sigs.k8s.io/controller-runtime/pkg/log" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/webhooks" -) - -// CreateResources using unstructured objects from a yaml/json file provided by decoder -func CreateResources(f *os.File, cfg *rest.Config, dynamicClient dynamic.Interface) error { - var err error - data, err := os.ReadFile(f.Name()) - if err != nil { - return err - } - decoder := yamlutil.NewYAMLOrJSONDecoder(bytes.NewReader(data), 100) - mapper, err := apiutil.NewDiscoveryRESTMapper(cfg) - if err != nil { - return err - } - for { - resource, unstructuredObj, err := getResource(decoder, mapper, dynamicClient) - if err != nil { - if err == io.EOF { - break - } else { - return err - } - } - _, err = resource.Create(context.Background(), unstructuredObj, metav1.CreateOptions{}) - if err != nil { - return err - } - } - return nil -} - -// parseObjects gets a decoder and mapper for reading unstructured objects from a yaml/json file. -func parseObjects(f *os.File, cfg *rest.Config) (*yamlutil.YAMLOrJSONDecoder, meta.RESTMapper, error) { - data, err := os.ReadFile(f.Name()) - if err != nil { - return nil, nil, err - } - - dataReader := bytes.NewReader(data) - decoder := yamlutil.NewYAMLOrJSONDecoder(dataReader, 100) - mapper, err := apiutil.NewDiscoveryRESTMapper(cfg) - - return decoder, mapper, err -} - -// deleteObject deletes an unstructured object and returns error unless there is a conflict -func deleteObject(resource dynamic.ResourceInterface, obj *unstructured.Unstructured) error { - deletionPropagation := metav1.DeletePropagationForeground - gracePeriodSeconds := int64(0) - - if err := resource.Delete(context.Background(), obj.GetName(), - metav1.DeleteOptions{GracePeriodSeconds: &gracePeriodSeconds, - PropagationPolicy: &deletionPropagation}); err != nil && !apierrors.IsConflict(err) { - return err - } - return nil -} - -// removeFinalizersFromObject removes all finalizers from an unstructured object -// returns true if object doesn't exist anymore -func removeFinalizersFromObject(resource dynamic.ResourceInterface, obj *unstructured.Unstructured) (bool, error) { - obj, err := resource.Get(context.Background(), obj.GetName(), metav1.GetOptions{}) - if err == nil { - fmt.Fprintln(ginkgo.GinkgoWriter, "remove finalizers", obj.GetFinalizers(), obj.GetName()) - obj.SetFinalizers(nil) - - if _, err = resource.Update(context.Background(), obj, metav1.UpdateOptions{}); err != nil { - fmt.Fprintf(ginkgo.GinkgoWriter, "remove finalizers fails when update with %v\n", err.Error()) - return false, err - } - fmt.Fprintf(ginkgo.GinkgoWriter, "object is %v\n", obj) - return false, nil - } - if apierrors.IsNotFound(err) { - return true, nil - } - fmt.Fprintf(ginkgo.GinkgoWriter, "remove finalizers fails with %v\n", err.Error()) - return false, err -} - -// DeleteNamespace finalizes and deletes a namespace given its name -func DeleteNamespace(ctx context.Context, clientset *kubernetes.Clientset, namespace string) error { - _, err := clientset.CoreV1().Namespaces().Finalize(ctx, &v1.Namespace{ - ObjectMeta: metav1.ObjectMeta{Name: namespace}, - }, metav1.UpdateOptions{}) - if err != nil { - return err - } - return clientset.CoreV1().Namespaces().Delete(ctx, namespace, metav1.DeleteOptions{}) -} - -// DeleteResources using unstructured objects from a yaml/json file provided by decoder. -func DeleteResources(f *os.File, cfg *rest.Config, dynamicClient dynamic.Interface, waitForDeletion bool) error { - decoder, mapper, err := parseObjects(f, cfg) - if err != nil { - return err - } - - for { - resource, unstructuredObj, err := getResource(decoder, mapper, dynamicClient) - if err != nil { - if err == io.EOF { - break - } else { - return err - } - } - if err = deleteObject(resource, unstructuredObj); err != nil { - return err - } - } - - if waitForDeletion { - // verify deleted - decoder, mapper, err := parseObjects(f, cfg) - if err != nil { - return err - } - - for { - resource, unstructuredObj, err := getResource(decoder, mapper, dynamicClient) - if err != nil { - if err == io.EOF { - break - } else { - return err - } - } - - fmt.Fprintln(ginkgo.GinkgoWriter, "wait for deletion", unstructuredObj.GetName()) - if err := wait.Poll(time.Second*5, time.Second*20, func() (done bool, err error) { - return removeFinalizersFromObject(resource, unstructuredObj) - }); err != nil { - return err - } - } - } - - return nil -} - -// EnsureResources verifies that resources exist, creating it if necessary -func EnsureResources(f *os.File, cfg *rest.Config, dynamicClient dynamic.Interface) error { - decoder, mapper, err := parseObjects(f, cfg) - if err != nil { - return err - } - - for { - resource, unstructuredObj, err := getResource(decoder, mapper, dynamicClient) - if err != nil { - if err == io.EOF { - break - } else { - return err - } - } - _, err = resource.Get(context.Background(), unstructuredObj.GetName(), metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - // create it - if _, err := resource.Create(context.Background(), unstructuredObj, metav1.CreateOptions{}); err != nil { - return err - } - } - } - return nil -} - -// CreateKubeconfigSecret create a secret with kubeconfig token for the cluster provided by client -func CreateKubeconfigSecret(cfg *rest.Config, clusterName, namespace string, crClient client.Client) error { - clusters := make(map[string]*clientcmdapi.Cluster) - clusters[clusterName] = &clientcmdapi.Cluster{ - Server: cfg.Host, - CertificateAuthorityData: cfg.CAData, - } - contexts := make(map[string]*clientcmdapi.Context) - contextName := fmt.Sprintf("%s@%s", cfg.Username, clusterName) - contexts[contextName] = &clientcmdapi.Context{ - Cluster: clusterName, - Namespace: namespace, - AuthInfo: cfg.Username, - } - authinfos := make(map[string]*clientcmdapi.AuthInfo) - authinfos[cfg.Username] = &clientcmdapi.AuthInfo{ - ClientKeyData: cfg.KeyData, - ClientCertificateData: cfg.CertData, - } - clientConfig := clientcmdapi.Config{ - Clusters: clusters, - Contexts: contexts, - CurrentContext: contextName, - AuthInfos: authinfos, - } - kubeconfig, err := clientcmd.Write(clientConfig) - if err != nil { - return err - } - kc := &v1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: secret.Name(clusterName, secret.Kubeconfig), - Namespace: namespace, - Labels: map[string]string{ - clusterapiv1beta1.ClusterLabelName: clusterName, - }, - }, - Data: map[string][]byte{ - secret.KubeconfigDataName: kubeconfig, - }, - Type: clusterapiv1beta1.ClusterSecretType, - } - - return crClient.Create(context.Background(), kc) -} - -func getResource(decoder *yamlutil.YAMLOrJSONDecoder, mapper meta.RESTMapper, dynamicClient dynamic.Interface) ( - dynamic.ResourceInterface, *unstructured.Unstructured, error) { // nolint:whitespace - var rawObj runtime.RawExtension - if err := decoder.Decode(&rawObj); err != nil { - return nil, nil, err - } - - obj, gvk, err := yaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme).Decode(rawObj.Raw, nil, nil) - if err != nil { - return nil, nil, err - } - - unstructuredMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj) - if err != nil { - return nil, nil, err - } - - unstructuredObj := &unstructured.Unstructured{Object: unstructuredMap} - - mapping, err := mapper.RESTMapping(gvk.GroupKind(), gvk.Version) - if err != nil { - return nil, nil, err - } - - var resource dynamic.ResourceInterface - if mapping.Scope.Name() == meta.RESTScopeNameNamespace { - if unstructuredObj.GetNamespace() == "" { - unstructuredObj.SetNamespace("default") - } - resource = dynamicClient.Resource(mapping.Resource).Namespace(unstructuredObj.GetNamespace()) - } else { - resource = dynamicClient.Resource(mapping.Resource) - } - return resource, unstructuredObj, nil -} - -// GetExternalCRDPaths gets paths for external CRDs by introspecting versions of the go dependencies -func GetExternalCRDPaths(externalDeps map[string][]string) ([]string, error) { - packageConfig := &packages.Config{ - Mode: packages.NeedModule, - } - var crdPaths []string - for dep, crdDirs := range externalDeps { - for _, crdDir := range crdDirs { - pkgs, err := packages.Load(packageConfig, dep) - if err != nil { - return nil, err - } - - pkg := pkgs[0] - if pkg.Errors != nil { - errs := []error{} - for _, err := range pkg.Errors { - errs = append(errs, err) - } - return nil, utilerrors.NewAggregate(errs) - } - crdPaths = append(crdPaths, filepath.Join(pkg.Module.Dir, crdDir)) - } - } - - logf.Log.Info("external CRD paths", "crdPaths", crdPaths) - return crdPaths, nil -} - -type WebhookCertificatesDetails struct { - CertPath string - KeyPath string - WebhookScrtName string - AddonNamespace string - WebhookServiceName string - LabelSelector labels.Selector -} - -func SetupWebhookCertificates(ctx context.Context, k8sClient client.Client, k8sConfig *rest.Config, certDetails *WebhookCertificatesDetails) error { - scrt, err := webhooks.InstallNewCertificates(ctx, k8sConfig, certDetails.CertPath, certDetails.KeyPath, - certDetails.WebhookScrtName, certDetails.AddonNamespace, certDetails.WebhookServiceName, certDetails.LabelSelector.String()) - if err != nil { - return err - } - vwcfgs := &adminregv1.ValidatingWebhookConfigurationList{} - err = k8sClient.List(ctx, vwcfgs, &client.ListOptions{LabelSelector: certDetails.LabelSelector}) - if err != nil { - return err - } - for i := range vwcfgs.Items { - wcfg := vwcfgs.Items[i] - for j := range wcfg.Webhooks { - whook := wcfg.Webhooks[j] - if !bytes.Equal(whook.ClientConfig.CABundle, scrt.Data[resources.CACert]) { - return fmt.Errorf("validating Webhook CA Bundlle is not updated correctly") - } - } - } - - mwcfgs := &adminregv1.MutatingWebhookConfigurationList{} - err = k8sClient.List(ctx, mwcfgs, &client.ListOptions{LabelSelector: certDetails.LabelSelector}) - if err != nil { - return err - } - for i := range mwcfgs.Items { - wcfg := mwcfgs.Items[i] - for j := range wcfg.Webhooks { - whook := wcfg.Webhooks[j] - if !bytes.Equal(whook.ClientConfig.CABundle, scrt.Data[resources.CACert]) { - return fmt.Errorf("mutating Webhook CA Bundlle is not updated correctly") - } - } - } - return nil -} diff --git a/addons/webhooks/cluster_pause_webhook.go b/addons/webhooks/cluster_pause_webhook.go deleted file mode 100644 index d2977cb657..0000000000 --- a/addons/webhooks/cluster_pause_webhook.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package webhooks - -import ( - "context" - "fmt" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -var clusterpauselog = logf.Log.WithName("cluster-pause-webhook") - -// +kubebuilder:webhook:verbs=create;update,path=/mutate-cluster-x-k8s-io-v1beta1-cluster,mutating=true,failurePolicy=fail,matchPolicy=Equivalent,groups=cluster.x-k8s.io,resources=clusters,versions=v1beta1,name=default.cluster.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 - -// ClusterPause implements a validating and defaulting webhook for Cluster. -type ClusterPause struct { - Client client.Client -} - -// SetupWebhookWithManager sets up Cluster webhooks. -func (wh *ClusterPause) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&clusterv1.Cluster{}). - WithDefaulter(wh). - Complete() -} - -var ( - _ webhook.CustomDefaulter = &ClusterPause{} -) - -// Default satisfies the defaulting webhook interface. -func (wh *ClusterPause) Default(ctx context.Context, obj runtime.Object) error { //nolint - var tkrVersion, currentTkrVersion string - var tkrLabelFound, ok bool - - cluster, ok := obj.(*clusterv1.Cluster) - if !ok { - return apierrors.NewBadRequest(fmt.Sprintf("expected a Cluster but got a %T", obj)) - } - - if cluster.Labels == nil { - return nil - } - - if tkrVersion, tkrLabelFound = cluster.Labels[runtanzuv1alpha3.LabelTKR]; !tkrLabelFound { - return nil - } - - currentCluster := &clusterv1.Cluster{} - // Try to get the current cluster CR, so we can compare the version - key := client.ObjectKey{Name: cluster.Name, Namespace: cluster.Namespace} - if err := wh.Client.Get(ctx, key, currentCluster); err != nil { - if apierrors.IsNotFound(err) { - return nil - } - return err - } - - if currentCluster.Labels != nil { - currentTkrVersion, tkrLabelFound = currentCluster.Labels[runtanzuv1alpha3.LabelTKR] - } - - // want to verify the current TKR object (before upgrade) is not a legacy one - if tkrLabelFound && currentTkrVersion != "" { - currentTKR := &runtanzuv1alpha3.TanzuKubernetesRelease{} - if err := wh.Client.Get(ctx, client.ObjectKey{Name: currentTkrVersion}, currentTKR); err != nil { - if apierrors.IsNotFound(err) { - return nil - } - clusterpauselog.Error(err, "unable to fetch TKR object", "name", currentTkrVersion) - return err - } - if currentTKR != nil && currentTKR.Labels != nil { - if _, ok := currentTKR.Labels[constants.TKRLabelLegacyClusters]; ok { - return nil - } - } - } - - // Add pause to cluster if the cluster.Labels["run.tanzu.vmware.com/tkr"] changes - // The cluster pause state will be unset by ClusterBootstrap controller after it rolls out package updates - if currentCluster.Labels == nil || !tkrLabelFound || currentTkrVersion != tkrVersion { - cluster.Spec.Paused = true - if cluster.Annotations == nil { - cluster.Annotations = map[string]string{} - } - // Use the desired TKR version as label value, ClusterBootstrap will unset - cluster.Annotations[constants.ClusterPauseLabel] = tkrVersion - clusterpauselog.Info(fmt.Sprintf("set '%s' annotation to '%s' for cluster '%s'", constants.ClusterPauseLabel, tkrVersion, cluster.Name)) - } - - return nil -} diff --git a/addons/webhooks/cluster_pause_webhook_test.go b/addons/webhooks/cluster_pause_webhook_test.go deleted file mode 100644 index ec28471017..0000000000 --- a/addons/webhooks/cluster_pause_webhook_test.go +++ /dev/null @@ -1,331 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package webhooks - -import ( - "context" - "fmt" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - apitypes "k8s.io/apimachinery/pkg/types" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/fakeclusterclient" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -const ( - testClusterName = "test-cluster" - testNamespace = "test-namespace" - testTKRName = "test-tkr" - notFound = "not-found" -) - -var currentCluster *clusterv1.Cluster -var currentTKR *v1alpha3.TanzuKubernetesRelease - -var _ = Describe("ClusterPause Webhook", func() { - Context("Default()", func() { - var ( - ctx context.Context - err error - wh *ClusterPause - input runtime.Object - crtCtl *fakeclusterclient.CRTClusterClient - ) - BeforeEach(func() { - currentCluster = &clusterv1.Cluster{} - currentTKR = &v1alpha3.TanzuKubernetesRelease{} - crtCtl = &fakeclusterclient.CRTClusterClient{} - crtCtl.GetStub = getStub - wh = &ClusterPause{Client: crtCtl} - }) - - When("the input object is not cluster", func() { - It("should fail", func() { - input = nil - err = wh.Default(ctx, input) - Expect(err).Should(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("expected a Cluster")) - }) - }) - - When("the cluster's labels are nil", func() { - It("should not pause", func() { - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace}, - } - currentCluster = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace}, - } - err = wh.Default(ctx, input) - Expect(err).ShouldNot(HaveOccurred()) - Expect(getCluster(input).GetAnnotations()).To(BeNil()) - Expect(getCluster(input).Spec.Paused).To(BeFalse()) - }) - }) - - When("the cluster's labels are empty", func() { - It("should not pause", func() { - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{}}, - } - currentCluster = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{}}, - } - err = wh.Default(ctx, input) - Expect(err).ShouldNot(HaveOccurred()) - Expect(getCluster(input).GetAnnotations()).To(BeNil()) - Expect(getCluster(input).Spec.Paused).To(BeFalse()) - }) - }) - - When("the currentCluster's labels match cluster's label", func() { - It("should not pause", func() { - currentCluster = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.23.5"}}, - } - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.23.5"}}, - } - - err = wh.Default(ctx, input) - Expect(err).ShouldNot(HaveOccurred()) - Expect(getCluster(input).GetAnnotations()).To(BeNil()) - Expect(getCluster(input).Spec.Paused).To(BeFalse()) - }) - }) - - When("the currentCluster's labels be nil", func() { - It("should pause", func() { - currentCluster = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: nil}, - } - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.21.2"}}, - } - err = wh.Default(ctx, input) - Expect(err).ShouldNot(HaveOccurred()) - Expect(getCluster(input).GetAnnotations()).To(HaveKey(constants.ClusterPauseLabel)) - Expect(getCluster(input).GetAnnotations()).To(ContainElements("1.21.2")) - Expect(getCluster(input).Spec.Paused).To(BeTrue()) - }) - }) - - When("the currentCluster's labels does not include 'run.tanzu.vmware.com/tkr'", func() { - It("should pause", func() { - - currentCluster = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{}}, - } - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.21.2"}}, - } - err = wh.Default(ctx, input) - Expect(err).ShouldNot(HaveOccurred()) - Expect(getCluster(input).GetAnnotations()).To(HaveKey(constants.ClusterPauseLabel)) - Expect(getCluster(input).GetAnnotations()).To(ContainElements("1.21.2")) - Expect(getCluster(input).Spec.Paused).To(BeTrue()) - }) - }) - - When("the currentCluster's labels include 'run.tanzu.vmware.com/tkr' but with empty value", func() { - It("should pause", func() { - currentCluster = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: ""}}, - } - currentCluster.Labels = map[string]string{v1alpha3.LabelTKR: ""} - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.21.2"}}, - } - err = wh.Default(ctx, input) - Expect(err).ShouldNot(HaveOccurred()) - Expect(getCluster(input).GetAnnotations()).To(HaveKey(constants.ClusterPauseLabel)) - Expect(getCluster(input).GetAnnotations()).To(ContainElements("1.21.2")) - Expect(getCluster(input).Spec.Paused).To(BeTrue()) - }) - }) - - When("the currentCluster's labels does match cluster's label", func() { - It("should pause", func() { - currentCluster = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.21.2"}}, - } - - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.23.5"}}, - } - err = wh.Default(ctx, input) - Expect(err).ShouldNot(HaveOccurred()) - Expect(getCluster(input).GetAnnotations()).To(HaveKey(constants.ClusterPauseLabel)) - Expect(getCluster(input).GetAnnotations()).To(ContainElements("1.23.5")) - Expect(getCluster(input).Spec.Paused).To(BeTrue()) - }) - }) - - When("the currentCluster's corresponding TKR does not have any label", func() { - It("should pause", func() { - currentCluster = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.21.2"}}, - } - - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.23.5"}}, - } - currentTKR = &v1alpha3.TanzuKubernetesRelease{ - TypeMeta: metav1.TypeMeta{Kind: "TanzuKubernetesRelease"}, - ObjectMeta: metav1.ObjectMeta{Name: testTKRName, Labels: map[string]string{}}, - } - err = wh.Default(ctx, input) - Expect(err).ShouldNot(HaveOccurred()) - Expect(getCluster(input).GetAnnotations()).To(HaveKey(constants.ClusterPauseLabel)) - Expect(getCluster(input).GetAnnotations()).To(ContainElements("1.23.5")) - Expect(getCluster(input).Spec.Paused).To(BeTrue()) - }) - }) - - When("the currentCluster's corresponding TKR does not have 'run.tanzu.vmware.com/legacy-tkr' label", func() { - It("should pause", func() { - currentCluster = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.21.2"}}, - } - - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.23.5"}}, - } - currentTKR = &v1alpha3.TanzuKubernetesRelease{ - TypeMeta: metav1.TypeMeta{Kind: "TanzuKubernetesRelease"}, - ObjectMeta: metav1.ObjectMeta{Name: testTKRName, Labels: map[string]string{"someLabel": ""}}, - } - err = wh.Default(ctx, input) - Expect(err).ShouldNot(HaveOccurred()) - Expect(getCluster(input).GetAnnotations()).To(HaveKey(constants.ClusterPauseLabel)) - Expect(getCluster(input).GetAnnotations()).To(ContainElements("1.23.5")) - Expect(getCluster(input).Spec.Paused).To(BeTrue()) - }) - }) - - When("the currentCluster's corresponding TKR has 'run.tanzu.vmware.com/legacy-tkr' label", func() { - It("should not pause", func() { - currentCluster = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.21.2"}}, - } - - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.23.5"}}, - } - currentTKR = &v1alpha3.TanzuKubernetesRelease{ - TypeMeta: metav1.TypeMeta{Kind: "TanzuKubernetesRelease"}, - ObjectMeta: metav1.ObjectMeta{Name: testTKRName, Labels: map[string]string{constants.TKRLabelLegacyClusters: ""}}, - } - err = wh.Default(ctx, input) - - Expect(err).ShouldNot(HaveOccurred()) - Expect(getCluster(input).GetAnnotations()).NotTo(HaveKey(constants.ClusterPauseLabel)) - Expect(getCluster(input).GetAnnotations()).NotTo(ContainElements("1.23.5")) - Expect(getCluster(input).Spec.Paused).To(BeFalse()) - }) - }) - - When("the currentCluster's corresponding TKR has 'run.tanzu.vmware.com/legacy-tkr' label but TKR object is not found", func() { - It("should return error", func() { - currentCluster = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.21.2"}}, - } - - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.23.5"}}, - } - currentTKR = &v1alpha3.TanzuKubernetesRelease{ - TypeMeta: metav1.TypeMeta{Kind: "TanzuKubernetesRelease"}, - ObjectMeta: metav1.ObjectMeta{Name: notFound}, - } - err = wh.Default(ctx, input) - - Expect(err).ShouldNot(HaveOccurred()) - Expect(getCluster(input).GetAnnotations()).NotTo(HaveKey(constants.ClusterPauseLabel)) - Expect(getCluster(input).GetAnnotations()).NotTo(ContainElements("1.23.5")) - Expect(getCluster(input).Spec.Paused).To(BeFalse()) - }) - }) - - When("the currentCluster's corresponding TKR has 'run.tanzu.vmware.com/legacy-tkr' label but there was an error(not 404) while any object is fetched", func() { - It("should fail", func() { - currentCluster.Labels = map[string]string{v1alpha3.LabelTKR: "1.21.2"} - input = &clusterv1.Cluster{ - TypeMeta: metav1.TypeMeta{Kind: "Cluster"}, - ObjectMeta: metav1.ObjectMeta{Name: testClusterName, Namespace: testNamespace, Labels: map[string]string{v1alpha3.LabelTKR: "1.23.5"}}, - } - currentTKR.Labels = map[string]string{constants.TKRLabelLegacyClusters: ""} - currentTKR.Name = testTKRName - crtCtl = &fakeclusterclient.CRTClusterClient{} - crtCtl.GetReturns(fmt.Errorf("some error")) - wh = &ClusterPause{Client: crtCtl} - err = wh.Default(ctx, input) - Expect(err).Should(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("some error")) - Expect(getCluster(input).GetAnnotations()).NotTo(HaveKey(constants.ClusterPauseLabel)) - Expect(getCluster(input).GetAnnotations()).NotTo(ContainElements("1.23.5")) - Expect(getCluster(input).Spec.Paused).To(BeFalse()) - }) - }) - }) -}) - -func getCluster(object runtime.Object) *clusterv1.Cluster { - cluster, ok := object.(*clusterv1.Cluster) - Expect(ok).To(BeTrue()) - return cluster -} - -func getStub(ctx context.Context, key apitypes.NamespacedName, object client.Object) error { - var resourceName string - switch v := object.(type) { - case *clusterv1.Cluster: - *v = *currentCluster - resourceName = "Cluster" - - case *v1alpha3.TanzuKubernetesRelease: - *v = *currentTKR - resourceName = "TanzuKubernetesRelease" - - default: - return fmt.Errorf("unknown object %v", object) - } - - if object.GetName() == notFound { - return apierrors.NewNotFound(schema.GroupResource{Resource: resourceName}, object.GetName()) - } - return nil -} diff --git a/addons/webhooks/clusterbootstrap_webhook.go b/addons/webhooks/clusterbootstrap_webhook.go deleted file mode 100644 index 17f5ce09b9..0000000000 --- a/addons/webhooks/clusterbootstrap_webhook.go +++ /dev/null @@ -1,571 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package webhooks - -import ( - "context" - "fmt" - "sync" - "time" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/validation/field" - "k8s.io/client-go/discovery" - cacheddiscovery "k8s.io/client-go/discovery/cached/memory" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/kubernetes" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" - - "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/versions" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/util/clusterbootstrapclone" - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// log is for logging in this package. -var clusterbootstraplog = logf.Log.WithName("clusterbootstrap-resource") - -// ClusterBootstrap implements a validating and defaulting webhook for ClusterBootstrap. -type ClusterBootstrap struct { - Client client.Reader - SystemNamespace string - // internal vars - // dynamicClient used to get resources by GVR - dynamicClient dynamic.Interface - // discovery client for looking up api-resources and preferred versions - cachedDiscoveryClient discovery.CachedDiscoveryInterface - // client for aggregated APIs like package CR - aggregatedAPIResourcesClient client.Client - // cache for resolved api-resources so that look up is fast (cleared periodically) - providerGVR map[schema.GroupKind]*schema.GroupVersionResource - // mutex for GVR lookup and clearing - lock sync.Mutex -} - -// SetupWebhookWithManager performs the setup actions for an ClusterBootstrap webhook, using the passed in mgr. -// The passed in ctx is used by the Goroutine that cleans up the GVR resource periodically -func (wh *ClusterBootstrap) SetupWebhookWithManager(ctx context.Context, mgr ctrl.Manager) error { - dynClient, err := dynamic.NewForConfig(mgr.GetConfig()) - if err != nil { - clusterbootstraplog.Error(err, "Error creating dynamic client") - return err - } - wh.dynamicClient = dynClient - wh.cachedDiscoveryClient = cacheddiscovery.NewMemCacheClient(kubernetes.NewForConfigOrDie(mgr.GetConfig()).Discovery()) - wh.aggregatedAPIResourcesClient, err = client.New(mgr.GetConfig(), client.Options{Scheme: mgr.GetScheme()}) - if err != nil { - clusterbootstraplog.Error(err, "Error creating aggregated API Resources client") - return err - } - wh.providerGVR = make(map[schema.GroupKind]*schema.GroupVersionResource) - - go wh.periodicGVRCachesClean(ctx) - - return ctrl.NewWebhookManagedBy(mgr). - For(&runv1alpha3.ClusterBootstrap{}). - WithDefaulter(wh). - WithValidator(wh). - Complete() -} - -//+kubebuilder:webhook:verbs=create;update,path=/validate-run-tanzu-vmware-com-v1alpha3-clusterbootstrap,mutating=false,failurePolicy=fail,groups=run.tanzu.vmware.com,resources=clusterbootstraps,versions=v1alpha3,name=clusterbootstrap.validating.vmware.com -//+kubebuilder:webhook:path=/mutate-run-tanzu-vmware-com-v1alpha3-clusterbootstrap,mutating=true,failurePolicy=fail,groups=run.tanzu.vmware.com,resources=clusterbootstraps,verbs=create;update,versions=v1alpha3,name=clusterbootstrap.mutating.vmware.com - -var _ webhook.CustomDefaulter = &ClusterBootstrap{} -var _ webhook.CustomValidator = &ClusterBootstrap{} - -// Default implements webhook.Defaulter so a webhook will be registered for the type -func (wh *ClusterBootstrap) Default(ctx context.Context, obj runtime.Object) error { - clusterBootstrap, ok := obj.(*runv1alpha3.ClusterBootstrap) - if !ok { - return apierrors.NewBadRequest(fmt.Sprintf("expected a ClusterBootstrap but got a %T", obj)) - } - - // If the clusterBootstrap has ownerReferences set, that means it has been reconciled by clusterbootstrap_controller - // already. We do not want to mutate the clusterBootstrap CR in this case because it might disrupt the changes clusterbootstrap_controller - // has put on clusterBootstrap. - if clusterBootstrap.OwnerReferences != nil && len(clusterBootstrap.OwnerReferences) != 0 { - return nil - } - - var tkrName string - var annotationExist bool - if clusterBootstrap.Annotations != nil { - tkrName, annotationExist = clusterBootstrap.Annotations[constants.AddCBMissingFieldsAnnotationKey] - } - if !annotationExist { - // It is a no-op if the annotation does not exist or the annotation value is empty - return nil - } - - clusterbootstraplog.Info("attempt to add defaults", "name", clusterBootstrap.Name) - if tkrName == "" { - err := fmt.Errorf("invalid value for annotation: %s. The value needs to be the name of TanzuKubernetesRelease", - constants.AddCBMissingFieldsAnnotationKey) - clusterbootstraplog.Error(err, fmt.Sprintf("unable to add defaults to the missing fields of ClusterBootstrap %s/%s", - clusterBootstrap.Namespace, clusterBootstrap.Name)) - return err - } - - // Get TanzuKubernetesRelease and return error if not found - tkr := &runv1alpha3.TanzuKubernetesRelease{} - if err := wh.Client.Get(ctx, client.ObjectKey{Name: tkrName}, tkr); err != nil { - clusterbootstraplog.Error(err, fmt.Sprintf("unable to get the TanzuKubernetesRelease %s", tkrName)) - return err - } - // Get ClusterBootstrapTemplate and return error if not found - clusterBootstrapTemplateName := tkrName // TanzuKubernetesRelease and ClusterBootstrapTemplate share the same name - clusterBootstrapTemplate := &runv1alpha3.ClusterBootstrapTemplate{} - if err := wh.Client.Get(ctx, client.ObjectKey{Namespace: wh.SystemNamespace, Name: clusterBootstrapTemplateName}, clusterBootstrapTemplate); err != nil { - clusterbootstraplog.Error(err, fmt.Sprintf("unable to add defaults to the missing fields of ClusterBootstrap %s/%s", - clusterBootstrap.Namespace, clusterBootstrap.Name)) - return err - } - - // Get the helper ready for the defaulting logic - helper := clusterbootstrapclone.Helper{Logger: clusterbootstraplog} - - _, unmanagedCNI := clusterBootstrap.Annotations[constants.UnmanagedCNI] - - // Attempt to complete the partial filled ClusterBootstrapPackage RefName - if err := helper.CompleteCBPackageRefNamesFromTKR(tkr, clusterBootstrap); err != nil { - clusterbootstraplog.Error(err, "unable to complete the RefNames for ClusterBootstrapPackages due to errors") - return err - } - // Attempt to add defaults to the missing fields of ClusterBootstrap. The valuesFrom fields will be skipped because of: - // At the time when a ClusterBootstrap CR gets created by third party(e.g. Tanzu CLI), the valuesFrom.ProviderRef - // and valuesFrom.SecretRef might not be cloned into cluster namespace yet. If we keep valuesFrom fields, validation - // webhook will complain that providerRef or secretRef is missing. The valuesFrom will be added back by the clusterbootstrap_controller. - if err := helper.AddMissingSpecFieldsFromTemplate(clusterBootstrapTemplate, clusterBootstrap, map[string]interface{}{"valuesFrom": nil}); err != nil { - clusterbootstraplog.Error(err, fmt.Sprintf("unable to add defaults to the missing fields of ClusterBootstrap %s/%s", - clusterBootstrap.Namespace, clusterBootstrap.Name)) - return err - } - - if unmanagedCNI { - clusterBootstrap.Spec.CNI = nil - } - return nil -} - -func getFieldPath(fieldName string) *field.Path { - return field.NewPath("spec").Child(fieldName) -} - -// ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (wh *ClusterBootstrap) ValidateCreate(ctx context.Context, obj runtime.Object) error { - clusterBootstrap, ok := obj.(*runv1alpha3.ClusterBootstrap) - if !ok { - return apierrors.NewBadRequest(fmt.Sprintf("expected a ClusterBootstrap but got a %T", obj)) - } - clusterbootstraplog.Info("validate create", "name", clusterBootstrap.Name) - - var allErrs field.ErrorList - // Iterating one by one because we need field info for getFieldPath, and some core packages can be nil - - // If spec.cni == nil and clusterbootstrap is annotated, it is using unmanaged CNI, and we do not need to validate CNI - _, unmanagedCNI := clusterBootstrap.Annotations[constants.UnmanagedCNI] - - if unmanagedCNI && clusterBootstrap.Spec.CNI != nil { - return apierrors.NewBadRequest("Spec.CNI should be empty if the clusterbootstrap is annotated to use unmanaged CNI.") - } - if !unmanagedCNI { - if err := wh.validateClusterBootstrapPackage(ctx, clusterBootstrap.Spec.CNI, clusterBootstrap.Namespace, getFieldPath("cni")); err != nil { - allErrs = append(allErrs, err) - } - } - - if err := wh.validateClusterBootstrapPackage(ctx, clusterBootstrap.Spec.Kapp, clusterBootstrap.Namespace, getFieldPath("kapp")); err != nil { - allErrs = append(allErrs, err) - } - - // CSI and CPI can be nil - if clusterBootstrap.Spec.CSI != nil { - if err := wh.validateClusterBootstrapPackage(ctx, clusterBootstrap.Spec.CSI, clusterBootstrap.Namespace, getFieldPath("csi")); err != nil { - allErrs = append(allErrs, err) - } - } - if clusterBootstrap.Spec.CPI != nil { - if err := wh.validateClusterBootstrapPackage(ctx, clusterBootstrap.Spec.CPI, clusterBootstrap.Namespace, getFieldPath("cpi")); err != nil { - allErrs = append(allErrs, err) - } - } - - if clusterBootstrap.Spec.AdditionalPackages != nil { - // validate additional packages - for idx, pkg := range clusterBootstrap.Spec.AdditionalPackages { - if err := wh.validateClusterBootstrapPackage(ctx, pkg, clusterBootstrap.Namespace, getFieldPath("additionalPackages").Child(string(rune(idx)))); err != nil { - allErrs = append(allErrs, err) - } - } - } - - if len(allErrs) == 0 { - return nil - } - - return apierrors.NewInvalid( - schema.GroupKind{Group: "run.tanzu.vmware.com", Kind: "ClusterBootstrap"}, - clusterBootstrap.Name, allErrs) -} - -// validateClusterBootstrapPackage validates content clusterBootstrapPackage -func (wh *ClusterBootstrap) validateClusterBootstrapPackage(ctx context.Context, pkg *runv1alpha3.ClusterBootstrapPackage, clusterBootstrapNamespace string, fldPath *field.Path) *field.Error { - if pkg == nil { - return field.Invalid(fldPath, pkg, "package can't be nil") - } - - // The package refName must be valid - _, _, err := util.GetPackageMetadata(ctx, wh.aggregatedAPIResourcesClient, pkg.RefName, wh.SystemNamespace) - if err != nil { - return field.Invalid(fldPath.Child("refName"), pkg.RefName, err.Error()) - } - - if err := wh.validateValuesFrom(ctx, pkg.ValuesFrom, clusterBootstrapNamespace, fldPath.Child("valuesFrom")); err != nil { - return err - } - - return nil -} - -// validateValuesFrom validates content of valuesFrom -func (wh *ClusterBootstrap) validateValuesFrom(ctx context.Context, valuesFrom *runv1alpha3.ValuesFrom, clusterBootstrapNamespace string, fldPath *field.Path) *field.Error { - // valuesFrom can be nil - if valuesFrom == nil { - return nil - } - - // Currently, we don't allow more than one field from valuesFrom to be present - if valuesFrom.CountFields() > 1 { - return field.Invalid(fldPath, valuesFrom, "valuesFrom can't have more than one non-null subfield") - } - - if valuesFrom.ProviderRef != nil { - if valuesFrom.ProviderRef.APIGroup == nil { - return field.Invalid(fldPath.Child("ProviderRef"), valuesFrom.ProviderRef, "APIGroup can't be nil") - } - // check if GVR and provider CR exist in cluster - gvr, err := wh.getGVR(schema.GroupKind{Group: *valuesFrom.ProviderRef.APIGroup, Kind: valuesFrom.ProviderRef.Kind}) - if err != nil { - return field.Invalid(fldPath.Child("ProviderRef"), valuesFrom.ProviderRef, err.Error()) - } - _, err = wh.dynamicClient.Resource(*gvr).Namespace(clusterBootstrapNamespace).Get(ctx, valuesFrom.ProviderRef.Name, metav1.GetOptions{}) - if err != nil { - return field.Invalid(fldPath.Child("ProviderRef"), valuesFrom.ProviderRef, err.Error()) - } - } - - if valuesFrom.SecretRef != "" { - // check if secretRef exists - valueSecret := &corev1.Secret{} - key := client.ObjectKey{ - Name: valuesFrom.SecretRef, - Namespace: clusterBootstrapNamespace, - } - err := wh.Client.Get(ctx, key, valueSecret) - if err != nil { - return field.Invalid(fldPath.Child("SecretRef"), valuesFrom.SecretRef, err.Error()) - } - } - - return nil -} - -// TODO: Consider to use provider_util.go#GetGVRForGroupKind() -// getGVR returns a GroupVersionResource for a GroupKind -func (wh *ClusterBootstrap) getGVR(gk schema.GroupKind) (*schema.GroupVersionResource, error) { - wh.lock.Lock() - defer wh.lock.Unlock() - if gvr, ok := wh.providerGVR[gk]; ok { - return gvr, nil - } - apiResourceList, err := wh.cachedDiscoveryClient.ServerPreferredResources() - // ServerPreferredResources will return a list for apiResourceList, even if err != nil. - // For example, in the case that one of the api resource is not found, it will return err != nil, - // but the list returned might not ber empty. - if _, ok := err.(*discovery.ErrGroupDiscoveryFailed); err != nil && !ok { - return nil, err - } - for _, apiResource := range apiResourceList { - gv, err := schema.ParseGroupVersion(apiResource.GroupVersion) - if err != nil { - return nil, err - } - if gv.Group == gk.Group { - for i := 0; i < len(apiResource.APIResources); i++ { - if apiResource.APIResources[i].Kind == gk.Kind { - wh.providerGVR[gk] = &schema.GroupVersionResource{Group: gv.Group, Resource: apiResource.APIResources[i].Name, Version: gv.Version} - return wh.providerGVR[gk], nil - } - } - } - } - return nil, fmt.Errorf("unable to find server preferred resource %s/%s", gk.Group, gk.Kind) -} - -// periodicGVRCachesClean invalidates caches used for GVR lookup -func (wh *ClusterBootstrap) periodicGVRCachesClean(ctx context.Context) { - ticker := time.NewTicker(constants.DiscoveryCacheInvalidateInterval) - for { - select { - case <-ctx.Done(): - ticker.Stop() - return - case <-ticker.C: - wh.lock.Lock() - wh.cachedDiscoveryClient.Invalidate() - wh.providerGVR = make(map[schema.GroupKind]*schema.GroupVersionResource) - wh.lock.Unlock() - } - } -} - -// validateMandatoryCorePackageUpdate combines new package spec validation and package upgrade validation together -func (wh *ClusterBootstrap) validateMandatoryCorePackageUpdate(ctx context.Context, oldPkg, newPkg *runv1alpha3.ClusterBootstrapPackage, namespace string, fldPath *field.Path) *field.Error { - if err := wh.validateClusterBootstrapPackage(ctx, newPkg, namespace, fldPath); err != nil { - return err - } - if err := wh.validateClusterBootstrapPackageUpdate(ctx, oldPkg, newPkg, fldPath); err != nil { - return err - } - return nil -} - -func (wh *ClusterBootstrap) validateOptionalCorePackageUpdate(ctx context.Context, oldPkg, newPkg *runv1alpha3.ClusterBootstrapPackage, namespace string, fldPath *field.Path) *field.Error { - if newPkg != nil { - if err := wh.validateClusterBootstrapPackage(ctx, newPkg, namespace, fldPath); err != nil { - return err - } - if oldPkg != nil { - if err := wh.validateClusterBootstrapPackageUpdate(ctx, oldPkg, newPkg, fldPath); err != nil { - return err - } - } - } - return nil -} - -// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (wh *ClusterBootstrap) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) error { - // Covert objs to ClusterBootstrap - newClusterBootstrap, ok := newObj.(*runv1alpha3.ClusterBootstrap) - if !ok { - return apierrors.NewBadRequest(fmt.Sprintf("expected a ClusterBootstrap but got a %T", newObj)) - } - oldClusterBootstrap, ok := oldObj.(*runv1alpha3.ClusterBootstrap) - if !ok { - return apierrors.NewBadRequest(fmt.Sprintf("expected a ClusterBootstrap but got a %T", oldObj)) - } - - // don't validate object if being deleted - if !oldClusterBootstrap.GetDeletionTimestamp().IsZero() { - clusterbootstraplog.Info("object being deleted, ignore validation", "name", oldClusterBootstrap.Name) - return nil - } - - // don't validate if the cluster associated with the clusterbootstrap is marked for deletion - cluster := &clusterv1beta1.Cluster{} - key := client.ObjectKey{ - Namespace: oldClusterBootstrap.Namespace, - Name: oldClusterBootstrap.Name, - } - - err := wh.Client.Get(ctx, key, cluster) - if err != nil && !apierrors.IsNotFound(err) { - return err - } - if !apierrors.IsNotFound(err) { - // if cluster is not found we do nothing because clusterbootstrap could exist before the cluster is created. - // else we check to see if cluster is marked for deletion - if !cluster.GetDeletionTimestamp().IsZero() { - clusterbootstraplog.Info("cluster being deleted, ignore validation", "name", cluster.Name) - return nil - } - } - - clusterbootstraplog.Info("validate update", "name", newClusterBootstrap.Name) - - var allErrs field.ErrorList - namespace := newClusterBootstrap.Namespace - - // If spec.cni == nil and clusterbootstrap is annotated, it is using unmanaged CNI, and we do not need to validate CNI - _, unmanagedCNI := newClusterBootstrap.Annotations[constants.UnmanagedCNI] - - if unmanagedCNI && newClusterBootstrap.Spec.CNI != nil { - return apierrors.NewBadRequest("Spec.CNI should be empty if the clusterbootstrap is annotated to use unmanaged CNI.") - } - if !unmanagedCNI { - if err := wh.validateMandatoryCorePackageUpdate(ctx, oldClusterBootstrap.Spec.CNI, newClusterBootstrap.Spec.CNI, namespace, getFieldPath("cni")); err != nil { - allErrs = append(allErrs, err) - } - } - - if err := wh.validateMandatoryCorePackageUpdate(ctx, oldClusterBootstrap.Spec.Kapp, newClusterBootstrap.Spec.Kapp, namespace, getFieldPath("kapp")); err != nil { - allErrs = append(allErrs, err) - } - - // CSI and CPI can be nil - if err := wh.validateOptionalCorePackageUpdate(ctx, oldClusterBootstrap.Spec.CSI, newClusterBootstrap.Spec.CSI, namespace, getFieldPath("csi")); err != nil { - allErrs = append(allErrs, err) - } - - if err := wh.validateOptionalCorePackageUpdate(ctx, oldClusterBootstrap.Spec.CPI, newClusterBootstrap.Spec.CPI, namespace, getFieldPath("cpi")); err != nil { - allErrs = append(allErrs, err) - } - - if err := wh.validateAdditionalPackagesUpdate(ctx, oldClusterBootstrap, newClusterBootstrap, namespace); err != nil { - allErrs = append(allErrs, err...) - } - - if len(allErrs) == 0 { - return nil - } - - return apierrors.NewInvalid( - schema.GroupKind{Group: "run.tanzu.vmware.com", Kind: "ClusterBootstrap"}, - newClusterBootstrap.Name, allErrs) -} - -// validateAdditionalPackagesUpdate validates the additional packages in update -func (wh *ClusterBootstrap) validateAdditionalPackagesUpdate(ctx context.Context, oldClusterBootstrap, newClusterBootstrap *runv1alpha3.ClusterBootstrap, namespace string) field.ErrorList { - var allErrs field.ErrorList - addtionalPkgFldPath := getFieldPath("additionalPackages") - newAdditionalPkgMap := map[string]*runv1alpha3.ClusterBootstrapPackage{} - - // validate new additional package specs - if newClusterBootstrap.Spec.AdditionalPackages != nil { - for idx, pkg := range newClusterBootstrap.Spec.AdditionalPackages { - // First make sure the new pkg is valid - if err := wh.validateClusterBootstrapPackage(ctx, pkg, namespace, addtionalPkgFldPath.Child(string(rune(idx)))); err != nil { - allErrs = append(allErrs, err) - continue - } - newPackageRefName, _, err := util.GetPackageMetadata(ctx, wh.aggregatedAPIResourcesClient, pkg.RefName, wh.SystemNamespace) - if err != nil { - allErrs = append(allErrs, field.Invalid(addtionalPkgFldPath.Child(string(rune(idx))).Child("refName"), pkg.RefName, err.Error())) - continue - } - // We can't have more than one additional packages share the same refName - if newAdditionalPkgMap[newPackageRefName] != nil { - allErrs = append(allErrs, field.Invalid(addtionalPkgFldPath.Child(string(rune(idx))).Child("refName"), newPackageRefName, "more than one additional packages share the same refName")) - continue - } - newAdditionalPkgMap[newPackageRefName] = pkg - } - } - - // Since we don't allow the deletion of additional packages, each old package should find it's corresponding new package - // i.e. each old package should find a new package with the same refName in package CR - if oldClusterBootstrap.Spec.AdditionalPackages != nil { - for idx, pkg := range oldClusterBootstrap.Spec.AdditionalPackages { - oldPackageRefName, _, err := util.GetPackageMetadata(ctx, wh.aggregatedAPIResourcesClient, pkg.RefName, wh.SystemNamespace) - if err != nil { - allErrs = append(allErrs, field.Invalid(addtionalPkgFldPath.Child(string(rune(idx))).Child("refName"), pkg.RefName, err.Error())) - continue - } - if newAdditionalPkgMap[oldPackageRefName] == nil { - allErrs = append(allErrs, field.Invalid(addtionalPkgFldPath.Child(string(rune(idx))).Child("refName"), pkg.RefName, "missing updated additional package")) - continue - } - if err := wh.validateClusterBootstrapPackageUpdate(ctx, pkg, newAdditionalPkgMap[oldPackageRefName], addtionalPkgFldPath.Child(string(rune(idx)))); err != nil { - allErrs = append(allErrs, err) - } - } - } - - return allErrs -} - -func (wh *ClusterBootstrap) validateClusterBootstrapPackageUpdate(ctx context.Context, oldPkg, newPkg *runv1alpha3.ClusterBootstrapPackage, fldPath *field.Path) *field.Error { - // 1. For cni, cpi, csi, kapp once created - // a. we won’t allow packageRef’s to be downgraded or change the package from something like calico to antrea - // b. We can start with disallowing change of apiGroup and Kind. In the future we can relax this - // c. Can change inline or secret to whatever - // - // 2. For Additional packages that are created - // a. no deletion of a package allowed, in the future we can consider relaxing this - // b. Can bump package version - // b. Not allowed to change apiGroup and Kind for provider - // c. Can change inline or secret to whatever - - if oldPkg == nil || newPkg == nil { - return field.Invalid(fldPath, newPkg, "package can't be nil") - } - - // Enforce version and refName check for packages. We won’t allow packageRef’s to be downgraded or change the package from something like calico to antrea - // both old and new packages should be present in the cluster - newPackageRefName, newPackageVersion, err := util.GetPackageMetadata(ctx, wh.aggregatedAPIResourcesClient, newPkg.RefName, wh.SystemNamespace) - if err != nil { - return field.Invalid(fldPath.Child("refName"), newPkg.RefName, err.Error()) - } - - oldPackageRefName, oldPackageVersion, err := util.GetPackageMetadata(ctx, wh.aggregatedAPIResourcesClient, oldPkg.RefName, wh.SystemNamespace) - if err != nil { - return field.Invalid(fldPath.Child("refName"), oldPkg.RefName, err.Error()) - } - - // RefName within the package CR should stay the same - // For core packages, an example would be user can't switch the CNI from Antrea to Calico - // For additional packages, the package can't be removed once added - if newPackageRefName != oldPackageRefName { - return field.Invalid(fldPath.Child("refName"), newPkg.RefName, "new package refName and old package refName should be the same") - } - - // The package can't be downgraded - newPkgSemver, err := versions.NewRelaxedSemver(newPackageVersion) - if err != nil { - retErr := errors.Wrap(err, "new package version is invalid") - return field.Invalid(fldPath.Child("refName"), newPkg.RefName, retErr.Error()) - } - oldPkgSemver, err := versions.NewRelaxedSemver(oldPackageVersion) - if err != nil { - retErr := errors.Wrap(err, "old package version is invalid") - return field.Invalid(fldPath.Child("refName"), oldPkg.RefName, retErr.Error()) - } - if newPkgSemver.Compare(oldPkgSemver.Version) == -1 { - // package downgrade is not allowed - return field.Invalid(fldPath.Child("refName"), newPkg.RefName, fmt.Sprintf("package downgrade is not allowed, original version: %s, updated version %s", oldPackageVersion, newPackageVersion)) - } - - if err := wh.validateValuesFromUpdate(ctx, oldPkg.ValuesFrom, newPkg.ValuesFrom, fldPath.Child("valuesFrom")); err != nil { - return err - } - - return nil -} - -// validateValuesFromUpdate validates contents of valuesFrom in upgrade -func (wh *ClusterBootstrap) validateValuesFromUpdate(_ context.Context, oldValuesFrom, newValuesFrom *runv1alpha3.ValuesFrom, fldPath *field.Path) *field.Error { - if oldValuesFrom != nil && newValuesFrom != nil { - // We don't allow changes to APIGroup and Kind - if oldValuesFrom.ProviderRef != nil && newValuesFrom.ProviderRef != nil { - if *oldValuesFrom.ProviderRef.APIGroup != *newValuesFrom.ProviderRef.APIGroup || - oldValuesFrom.ProviderRef.Kind != newValuesFrom.ProviderRef.Kind { - return field.Invalid(fldPath.Child("ProviderRef"), newValuesFrom.ProviderRef, "change to Group and Kind in ProviderRef is not allowed") - } - } - - // Users need to keep using ProviderRef to if it was originally used - if oldValuesFrom.ProviderRef != nil && newValuesFrom.ProviderRef == nil { - return field.Invalid(fldPath.Child("ProviderRef"), newValuesFrom.ProviderRef, "change from providerRef to other types of data value representation is not allowed") - } - } - return nil -} - -// ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (wh *ClusterBootstrap) ValidateDelete(ctx context.Context, obj runtime.Object) error { - // No validation required for ClusterBootstrap deletion - return nil -} diff --git a/addons/webhooks/clusterbootstrap_webhook_test.go b/addons/webhooks/clusterbootstrap_webhook_test.go deleted file mode 100644 index de9c41a124..0000000000 --- a/addons/webhooks/clusterbootstrap_webhook_test.go +++ /dev/null @@ -1,910 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package webhooks_test - -import ( - "context" - "fmt" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/uuid" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" - - kappctrlv1alph1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - packagev1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/addons/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/addons/webhooks" - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -var ( - tkrName = "v1.23.5---vmware.1-tkg.1-zshippable" - fakeAntreaCarvelPackageRefName = "antrea-carvel-package" - fakeCalicoCarvelPackageRefName = "calico-carvel-package" - fakeCSICarvelPackageRefName = "vsphere-pv-csi-carvel-package" - fakeKappCarvelPackageRefName = "kapp-controller-carvel-package" - fakePinnipedCarvelPackageRefName = "pinniped-carvel-package" - fakeMetricsServerCarvelPackageRefName = "metrics-server-carvel-package" - fakeKubevipcloudproviderCarvelPackageRefName = "kube-vip-cloud-provider" - fakeCarvelPackageVersion = "1.0.0" -) - -var _ = Describe("ClusterbootstrapWebhook", func() { - - Context("Verify the logic of clusterbootstrap webhook", func() { - var ( - clusterBootstrapTemplate *runv1alpha3.ClusterBootstrapTemplate - tanzuKubernetesRelease *runv1alpha3.TanzuKubernetesRelease - clusterBootstrapName = "fake-clusterbootstrap" - clusterBootstrapNamespace = "default" - ) - AfterEach(func() { - _ = k8sClient.Delete(ctx, &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - }, - }) - }) - - It("should success to prepare the environment", func() { - // Prepare the Carvel packages - createCarvelPackages(ctx, k8sClient) - // Prepare the ClusterBootstrapTemplate - clusterBootstrapTemplate = constructClusterBootstrapTemplate() - err := k8sClient.Create(ctx, clusterBootstrapTemplate) - Expect(err).NotTo(HaveOccurred()) - // Prepare the TanzuKubernetesRelease - tanzuKubernetesRelease = constructFakeTanzuKubernetesRelease() - err = k8sClient.Create(ctx, tanzuKubernetesRelease) - Expect(err).NotTo(HaveOccurred()) - }) - - It("should add defaults to the missing fields when the ClusterBootstrap CR has the predefined annotation", func() { - // Create a ClusterBootstrap with empty spec - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: tkrName, - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{}, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - - err = k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - Expect(clusterBootstrap.Spec).NotTo(BeNil()) - Expect(clusterBootstrap.Spec.CNI.RefName).To(Equal(clusterBootstrapTemplate.Spec.CNI.RefName)) - Expect(clusterBootstrap.Spec.Kapp.RefName).To(Equal(clusterBootstrapTemplate.Spec.Kapp.RefName)) - Expect(clusterBootstrap.Spec.CSI.RefName).To(Equal(clusterBootstrapTemplate.Spec.CSI.RefName)) - Expect(clusterBootstrap.Spec.AdditionalPackages).NotTo(BeNil()) - Expect(len(clusterBootstrap.Spec.AdditionalPackages)).To(Equal(len(clusterBootstrapTemplate.Spec.AdditionalPackages))) - Expect(clusterBootstrap.Annotations[constants.AddCBMissingFieldsAnnotationKey]).To(Equal(tkrName)) - }) - It("should add defaults ONLY to the missing fields when the ClusterBootstrap CR has the predefined annotation", func() { - // Create a ClusterBootstrap with empty spec - additionalCBPackageRefName := fmt.Sprintf("%s.%s", fakePinnipedCarvelPackageRefName, fakeCarvelPackageVersion) - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: tkrName, - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CSI: &runv1alpha3.ClusterBootstrapPackage{ - RefName: fmt.Sprintf("%s.%s", fakeCSICarvelPackageRefName, fakeCarvelPackageVersion), - ValuesFrom: &runv1alpha3.ValuesFrom{ - Inline: map[string]interface{}{ - "foo": "bar", - }, - }, - }, - AdditionalPackages: []*runv1alpha3.ClusterBootstrapPackage{ - {RefName: additionalCBPackageRefName}, - }, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - - err = k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - Expect(clusterBootstrap.Spec).NotTo(BeNil()) - Expect(clusterBootstrap.Spec.CNI.RefName).To(Equal(clusterBootstrapTemplate.Spec.CNI.RefName)) - Expect(clusterBootstrap.Spec.Kapp.RefName).To(Equal(clusterBootstrapTemplate.Spec.Kapp.RefName)) - // CSI should not be touched - Expect(clusterBootstrap.Spec.CSI.RefName).To(Equal(fmt.Sprintf("%s.%s", fakeCSICarvelPackageRefName, fakeCarvelPackageVersion))) - Expect(clusterBootstrap.Spec.CSI.ValuesFrom.Inline["foo"]).To(Equal("bar")) - // Existing additionalPackages should not be touched, the ones in ClusterBootstrapTemplate will be added - Expect(clusterBootstrap.Spec.AdditionalPackages).NotTo(BeNil()) - // One additional package from original clusterBootstrap, another one will be added from clusterBootstrapTemplate - Expect(len(clusterBootstrap.Spec.AdditionalPackages)).To(Equal(2)) - for idx := range clusterBootstrap.Spec.AdditionalPackages { - Expect(clusterBootstrap.Spec.AdditionalPackages[idx].RefName).To(Equal(clusterBootstrapTemplate.Spec.AdditionalPackages[idx].RefName)) - // IMPORTANT: With the new contract, valuesFrom fields will be removed by webhook. ClusterBootstrap Controller - // will be adding it back after the corresponding ClusterBootstrap Packages are cloned. - Expect(clusterBootstrap.Spec.AdditionalPackages[idx].ValuesFrom).To(BeNil()) - } - }) - It("should NOT add defaults to the missing fields when the ClusterBootstrap CR does not have the predefined annotation", func() { - // Create a ClusterBootstrap with empty spec - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{}, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).To(HaveOccurred()) - // Validating webhook should reject the request - Expect(apierrors.IsInvalid(err)).To(BeTrue()) - }) - It("should NOT add defaults to the missing fields when the predefined annotation has invalid value", func() { - // Create a ClusterBootstrap with empty spec - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: "fake-tkr-does-not-exist", - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{}, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).To(HaveOccurred()) - // TKR and CBTemplate not found - Expect(apierrors.IsNotFound(err)).To(BeTrue()) - }) - - It("should complete to the partial filled fields when the ClusterBootstrap CR has the predefined annotation", func() { - // Create a ClusterBootstrap with empty spec - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: tkrName, - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &runv1alpha3.ClusterBootstrapPackage{ - RefName: "antrea*", - }, - AdditionalPackages: []*runv1alpha3.ClusterBootstrapPackage{ - {RefName: "pinniped*", ValuesFrom: &runv1alpha3.ValuesFrom{Inline: map[string]interface{}{"identity_management_type": "ldap"}}}, - {RefName: "kube-vip-cloud-provider*", - ValuesFrom: &runv1alpha3.ValuesFrom{ - Inline: map[string]interface{}{ - "foo": "bar", - }, - }, - }, - }, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - - err = k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - Expect(clusterBootstrap.Spec).NotTo(BeNil()) - // clusterBootstrap.Spec.CNI.RefName should be complete by the webhook - Expect(clusterBootstrap.Spec.CNI.RefName).NotTo(Equal("antrea*")) - assertTKRBootstrapPackageNamesContain(tanzuKubernetesRelease, clusterBootstrap.Spec.CNI.RefName) - // clusterBootstrap.Spec.AdditionalPackages[x].RefName should be complete by the webhook - // extra additionalPackage not in CBT - Expect(len(clusterBootstrap.Spec.AdditionalPackages)).To(Equal(len(clusterBootstrapTemplate.Spec.AdditionalPackages) + 1)) - Expect(clusterBootstrap.Spec.AdditionalPackages[0].RefName).NotTo(Equal("pinniped*")) - assertTKRBootstrapPackageNamesContain(tanzuKubernetesRelease, clusterBootstrap.Spec.AdditionalPackages[0].RefName) - assertTKRBootstrapPackageNamesContain(tanzuKubernetesRelease, clusterBootstrap.Spec.AdditionalPackages[1].RefName) - assertFindKubeVipInClusterBootstrap(clusterBootstrap) - // the rest of fields should be added by the webhook - Expect(clusterBootstrap.Spec.Kapp.RefName).To(Equal(clusterBootstrapTemplate.Spec.Kapp.RefName)) - Expect(clusterBootstrap.Spec.CSI.RefName).To(Equal(clusterBootstrapTemplate.Spec.CSI.RefName)) - }) - - It("should complete the partial filled fields when the ClusterBootstrap CR has the predefined annotation", func() { - // Create a ClusterBootstrap with empty spec - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: tkrName, - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &runv1alpha3.ClusterBootstrapPackage{ - RefName: "antrea*", - }, - CSI: &runv1alpha3.ClusterBootstrapPackage{ - RefName: fmt.Sprintf("%s.%s", fakeCSICarvelPackageRefName, fakeCarvelPackageVersion), - ValuesFrom: &runv1alpha3.ValuesFrom{ - Inline: map[string]interface{}{"should-not-be-updated": true}, - }, - }, - AdditionalPackages: []*runv1alpha3.ClusterBootstrapPackage{ - {RefName: "pinniped*", ValuesFrom: &runv1alpha3.ValuesFrom{Inline: map[string]interface{}{"identity_management_type": "ldap"}}}, - {RefName: fmt.Sprintf("%s.%s", fakeMetricsServerCarvelPackageRefName, fakeCarvelPackageVersion)}, - }, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - - err = k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - Expect(clusterBootstrap.Spec).NotTo(BeNil()) - // clusterBootstrap.Spec.CNI.RefName should be completed by the webhook - Expect(clusterBootstrap.Spec.CNI.RefName).NotTo(Equal("antrea*")) - assertTKRBootstrapPackageNamesContain(tanzuKubernetesRelease, clusterBootstrap.Spec.CNI.RefName) - // clusterBootstrap.Spec.AdditionalPackages[0].RefName should be completed by the webhook - Expect(len(clusterBootstrap.Spec.AdditionalPackages)).To(Equal(2)) - Expect(clusterBootstrap.Spec.AdditionalPackages[0].RefName).NotTo(Equal("pinniped*")) - assertTKRBootstrapPackageNamesContain(tanzuKubernetesRelease, clusterBootstrap.Spec.AdditionalPackages[0].RefName) - // clusterBootstrap.Spec.AdditionalPackages[1].RefName should be untouched - Expect(clusterBootstrap.Spec.AdditionalPackages[1].RefName).To(Equal(fmt.Sprintf("%s.%s", fakeMetricsServerCarvelPackageRefName, fakeCarvelPackageVersion))) - // CSI should not be touched - Expect(clusterBootstrap.Spec.CSI.RefName).To(Equal(fmt.Sprintf("%s.%s", fakeCSICarvelPackageRefName, fakeCarvelPackageVersion))) - Expect(clusterBootstrap.Spec.CSI.ValuesFrom.Inline[""]).To(BeNil()) - Expect(len(clusterBootstrap.Spec.CSI.ValuesFrom.Inline)).To(Equal(1)) - Expect(clusterBootstrap.Spec.CSI.ValuesFrom.Inline["should-not-be-updated"]).To(BeTrue()) - // Kapp should be added by the webhook - Expect(clusterBootstrap.Spec.Kapp.RefName).To(Equal(clusterBootstrapTemplate.Spec.Kapp.RefName)) - - }) - It("should not fail validation if cluster is marked for deletion", func() { - timestamp := metav1.Now() - deletingCluster := &clusterapiv1beta1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - UID: uuid.NewUUID(), - DeletionTimestamp: ×tamp, - }, - } - err := clientgoscheme.AddToScheme(scheme) - Expect(err).ToNot(HaveOccurred()) - err = clusterapiv1beta1.AddToScheme(scheme) - Expect(err).ToNot(HaveOccurred()) - fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(deletingCluster).Build() - cbWebHook := webhooks.ClusterBootstrap{Client: fakeClient} - err = cbWebHook.SetupWebhookWithManager(context.TODO(), mgr) - Expect(err).ToNot(HaveOccurred()) - clusterBootstrapOld := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{}, - } - clusterBootstrapNew := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{}, - } - err = cbWebHook.ValidateUpdate(context.TODO(), clusterBootstrapOld, clusterBootstrapNew) - Expect(err).ToNot(HaveOccurred()) - - }) - }) -}) - -func assertTKRBootstrapPackageNamesContain(tkr *runv1alpha3.TanzuKubernetesRelease, name string) { - var found bool - for _, pkg := range tkr.Spec.BootstrapPackages { - if pkg.Name == name { - found = true - break - } - } - Expect(found).To(BeTrue()) -} - -func constructFakeTanzuKubernetesRelease() *runv1alpha3.TanzuKubernetesRelease { - return &runv1alpha3.TanzuKubernetesRelease{ - ObjectMeta: metav1.ObjectMeta{ - Name: tkrName, - }, - Spec: runv1alpha3.TanzuKubernetesReleaseSpec{ - BootstrapPackages: []corev1.LocalObjectReference{ - {Name: fmt.Sprintf("%s.%s", fakeAntreaCarvelPackageRefName, fakeCarvelPackageVersion)}, - {Name: fmt.Sprintf("%s.%s", fakeCalicoCarvelPackageRefName, fakeCarvelPackageVersion)}, - {Name: fmt.Sprintf("%s.%s", fakeMetricsServerCarvelPackageRefName, fakeCarvelPackageVersion)}, - {Name: fmt.Sprintf("%s.%s", fakePinnipedCarvelPackageRefName, fakeCarvelPackageVersion)}, - {Name: fmt.Sprintf("%s.%s", fakeKubevipcloudproviderCarvelPackageRefName, fakeCarvelPackageVersion)}, - }, - }, - } -} - -func constructClusterBootstrapTemplate() *runv1alpha3.ClusterBootstrapTemplate { - return &runv1alpha3.ClusterBootstrapTemplate{ - ObjectMeta: metav1.ObjectMeta{ - Name: tkrName, // CBT and TKR share the same name - Namespace: SystemNamespace, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", fakeAntreaCarvelPackageRefName, fakeCarvelPackageVersion)}, - Kapp: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", fakeKappCarvelPackageRefName, fakeCarvelPackageVersion)}, - CSI: &runv1alpha3.ClusterBootstrapPackage{ - RefName: fmt.Sprintf("%s.%s", fakeCSICarvelPackageRefName, fakeCarvelPackageVersion), - ValuesFrom: &runv1alpha3.ValuesFrom{ - Inline: map[string]interface{}{ - "fake-key": "fak-value", - }, - }, - }, - AdditionalPackages: []*runv1alpha3.ClusterBootstrapPackage{ - {RefName: fmt.Sprintf("%s.%s", fakePinnipedCarvelPackageRefName, fakeCarvelPackageVersion), ValuesFrom: &runv1alpha3.ValuesFrom{Inline: map[string]interface{}{"identity_management_type": "oidc"}}}, - {RefName: fmt.Sprintf("%s.%s", fakeMetricsServerCarvelPackageRefName, fakeCarvelPackageVersion)}, - }, - }, - } -} - -func createCarvelPackages(ctx context.Context, client client.Client) { - packageRefNames := []string{ - fakeAntreaCarvelPackageRefName, - fakeCalicoCarvelPackageRefName, - fakeCSICarvelPackageRefName, - fakeKappCarvelPackageRefName, - fakePinnipedCarvelPackageRefName, - fakeMetricsServerCarvelPackageRefName, - fakeKubevipcloudproviderCarvelPackageRefName, - } - - for _, refName := range packageRefNames { - err := client.Create(ctx, &packagev1alpha1.Package{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%s.%s", refName, fakeCarvelPackageVersion), - Namespace: SystemNamespace, - }, - Spec: packagev1alpha1.PackageSpec{ - RefName: refName, - Version: fakeCarvelPackageVersion, - Template: packagev1alpha1.AppTemplateSpec{ - Spec: &kappctrlv1alph1.AppSpec{}, - }, - }, - }) - if err != nil && !apierrors.IsAlreadyExists(err) { - Expect(err).NotTo(HaveOccurred()) - } - } -} - -func deleteCarvelPackages(ctx context.Context, client client.Client) { - packageRefNames := []string{ - fakeAntreaCarvelPackageRefName, - fakeCalicoCarvelPackageRefName, - fakeCSICarvelPackageRefName, - fakeKappCarvelPackageRefName, - fakePinnipedCarvelPackageRefName, - fakeMetricsServerCarvelPackageRefName, - fakeKubevipcloudproviderCarvelPackageRefName, - } - - for _, refName := range packageRefNames { - err := client.Delete(ctx, &packagev1alpha1.Package{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%s.%s", refName, fakeCarvelPackageVersion), - Namespace: SystemNamespace, - }, - Spec: packagev1alpha1.PackageSpec{ - RefName: refName, - Version: fakeCarvelPackageVersion, - Template: packagev1alpha1.AppTemplateSpec{ - Spec: &kappctrlv1alph1.AppSpec{}, - }, - }, - }) - Expect(err).NotTo(HaveOccurred()) - } -} - -func assertFindKubeVipInClusterBootstrap(clusterBootstrap *runv1alpha3.ClusterBootstrap) { - match := false - var kubevipPackage *runv1alpha3.ClusterBootstrapPackage - for _, p := range clusterBootstrap.Spec.AdditionalPackages { - if p.RefName == fmt.Sprintf("%s.%s", fakeKubevipcloudproviderCarvelPackageRefName, fakeCarvelPackageVersion) { - match = true - kubevipPackage = p - break - } - } - Expect(match).To(BeTrue()) - Expect(kubevipPackage.RefName).To(Equal(fmt.Sprintf("%s.%s", fakeKubevipcloudproviderCarvelPackageRefName, fakeCarvelPackageVersion))) - Expect(kubevipPackage.ValuesFrom.Inline["foo"]).To(Equal("bar")) -} - -var _ = Describe("Unmanaged CNI:", func() { - var ( - clusterBootstrapTemplate *runv1alpha3.ClusterBootstrapTemplate - tanzuKubernetesRelease *runv1alpha3.TanzuKubernetesRelease - clusterBootstrapName = "fake-clusterbootstrap" - clusterBootstrapNamespace = "default" - ) - BeforeEach(func() { - // Prepare the Carvel packages - createCarvelPackages(ctx, k8sClient) - // Prepare the ClusterBootstrapTemplate - clusterBootstrapTemplate = constructClusterBootstrapTemplate() - err := k8sClient.Create(ctx, clusterBootstrapTemplate) - if err != nil && !apierrors.IsAlreadyExists(err) { - Expect(err).NotTo(HaveOccurred()) - } - // Prepare the TanzuKubernetesRelease - tanzuKubernetesRelease = constructFakeTanzuKubernetesRelease() - err = k8sClient.Create(ctx, tanzuKubernetesRelease) - if err != nil && !apierrors.IsAlreadyExists(err) { - Expect(err).NotTo(HaveOccurred()) - } - }) - AfterEach(func() { - // Delete Carvel packages - deleteCarvelPackages(ctx, k8sClient) - - // Delete the ClusterBootstrapTemplate - clusterBootstrapTemplate = constructClusterBootstrapTemplate() - err := k8sClient.Delete(ctx, clusterBootstrapTemplate) - Expect(err).NotTo(HaveOccurred()) - - // Delete the TanzuKubernetesRelease - tanzuKubernetesRelease = constructFakeTanzuKubernetesRelease() - err = k8sClient.Delete(ctx, tanzuKubernetesRelease) - Expect(err).NotTo(HaveOccurred()) - }) - - Context("Default webhook:", func() { - AfterEach(func() { - _ = k8sClient.Delete(ctx, &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - }, - }) - }) - - When("Clusterbootstrap is NOT annotated and spec is nil", func() { - It("should return error", func() { - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: tkrName, - }, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).To(HaveOccurred()) - }) - }) - When("Clusterbootstrap is NOT annotated and CNI is NOT listed", func() { - It("should copy CNI from template ", func() { - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: tkrName, - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: nil, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - defaultedClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - err = k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, defaultedClusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - Expect(defaultedClusterBootstrap.Spec).NotTo(BeNil()) - Expect(defaultedClusterBootstrap.Spec.CNI).NotTo(BeNil()) - Expect(defaultedClusterBootstrap.Spec.CNI.RefName).To(Equal(clusterBootstrapTemplate.Spec.CNI.RefName)) - }) - }) - When("Clusterbootstrap is NOT annotated and CNI is empty", func() { - It("should use listed CNI", func() { - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: tkrName, - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", "calico-carvel-package", fakeCarvelPackageVersion)}, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - - defaultedClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - err = k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, defaultedClusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - Expect(defaultedClusterBootstrap.Spec).NotTo(BeNil()) - Expect(defaultedClusterBootstrap.Spec.CNI).NotTo(BeNil()) - Expect(defaultedClusterBootstrap.Spec.CNI.RefName).To(Equal(clusterBootstrap.Spec.CNI.RefName)) - }) - }) - - When("Clusterbootstrap is annotated and CNI is NOT listed", func() { - It("should set CNI to empty", func() { - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: tkrName, - constants.UnmanagedCNI: "", - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: nil, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - - defaultedClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - err = k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, defaultedClusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - Expect(defaultedClusterBootstrap.Spec).NotTo(BeNil()) - Expect(defaultedClusterBootstrap.Spec.CNI).To(BeNil()) - }) - }) - When("Clusterbootstrap is annotated and CNI is empty", func() { - It("should set CNI to empty", func() { - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: tkrName, - constants.UnmanagedCNI: "", - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", "calico-carvel-package", fakeCarvelPackageVersion)}, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).ToNot(HaveOccurred()) - - defaultedClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - err = k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, defaultedClusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - Expect(defaultedClusterBootstrap.Spec).NotTo(BeNil()) - Expect(defaultedClusterBootstrap.Spec.CNI).To(BeNil()) - }) - }) - }) - Context("ValidationCreate webhook:", func() { - AfterEach(func() { - _ = k8sClient.Delete(ctx, &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - }, - }) - }) - When("Clusterbootstrap is NOT annotated and CNI is NOT listed", func() { - It("should reject clusterbootstrap", func() { - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - Kapp: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", fakeKappCarvelPackageRefName, fakeCarvelPackageVersion)}, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).To(HaveOccurred()) - }) - }) - When("Clusterbootstrap is NOT annotated and CNI is empty", func() { - It("should accept clusterbootstrap", func() { - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", "calico-carvel-package", fakeCarvelPackageVersion)}, - Kapp: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", fakeKappCarvelPackageRefName, fakeCarvelPackageVersion)}, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).ToNot(HaveOccurred()) - - newClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(clusterBootstrap), newClusterBootstrap)).To(Succeed()) - Expect(newClusterBootstrap.Spec.CNI).To(Equal(clusterBootstrap.Spec.CNI)) - }) - }) - - When("Clusterbootstrap is annotated and CNI is NOT listed", func() { - It("should accept clusterbootstrap", func() { - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.UnmanagedCNI: "", - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - Kapp: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", fakeKappCarvelPackageRefName, fakeCarvelPackageVersion)}, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).ToNot(HaveOccurred()) - - newClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(clusterBootstrap), newClusterBootstrap)).To(Succeed()) - Expect(newClusterBootstrap.Spec.CNI).To(Equal(clusterBootstrap.Spec.CNI)) - }) - }) - When("Clusterbootstrap is annotated and CNI is empty", func() { - It("should reject clusterbootstrap", func() { - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.UnmanagedCNI: "", - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", "calico-carvel-package", fakeCarvelPackageVersion)}, - Kapp: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", fakeKappCarvelPackageRefName, fakeCarvelPackageVersion)}, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).To(HaveOccurred()) - }) - }) - }) - Context("ValidationUpdate webhook:", func() { - BeforeEach(func() { - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", "calico-carvel-package", fakeCarvelPackageVersion)}, - Kapp: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", fakeKappCarvelPackageRefName, fakeCarvelPackageVersion)}, - }, - } - err := k8sClient.Create(ctx, clusterBootstrap) - Expect(err).ToNot(HaveOccurred()) - }) - AfterEach(func() { - _ = k8sClient.Delete(ctx, &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - }, - }) - }) - When("New Clusterbootstrap is NOT annotated and CNI is NOT listed", func() { - It("should reject clusterbootstrap", func() { - originalClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, originalClusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - newClusterBootstrap := originalClusterBootstrap.DeepCopy() - if _, ok := newClusterBootstrap.Annotations[constants.UnmanagedCNI]; ok { - delete(newClusterBootstrap.Annotations, constants.UnmanagedCNI) - } - newClusterBootstrap.Spec = &runv1alpha3.ClusterBootstrapTemplateSpec{ - Kapp: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", fakeKappCarvelPackageRefName, fakeCarvelPackageVersion)}, - } - - err = k8sClient.Update(ctx, newClusterBootstrap) - Expect(err).To(HaveOccurred()) - }) - }) - When("Clusterbootstrap is NOT annotated and CNI is empty", func() { - It("should accept clusterbootstrap", func() { - originalClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, originalClusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - clusterBootstrap := originalClusterBootstrap.DeepCopy() - if _, ok := clusterBootstrap.Annotations[constants.UnmanagedCNI]; ok { - delete(clusterBootstrap.Annotations, constants.UnmanagedCNI) - } - clusterBootstrap.Spec = &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", "calico-carvel-package", fakeCarvelPackageVersion)}, - Kapp: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", fakeKappCarvelPackageRefName, fakeCarvelPackageVersion)}, - } - - err = k8sClient.Update(ctx, clusterBootstrap) - Expect(err).ToNot(HaveOccurred()) - - newClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(clusterBootstrap), newClusterBootstrap)).To(Succeed()) - Expect(newClusterBootstrap.Spec.CNI).To(Equal(clusterBootstrap.Spec.CNI)) - }) - }) - - When("Clusterbootstrap is annotated and CNI is NOT listed", func() { - It("should accept clusterbootstrap", func() { - originalClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, originalClusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - clusterBootstrap := originalClusterBootstrap.DeepCopy() - if _, ok := clusterBootstrap.Annotations[constants.UnmanagedCNI]; !ok { - clusterBootstrap.Annotations = map[string]string{constants.UnmanagedCNI: ""} - } - clusterBootstrap.Spec = &runv1alpha3.ClusterBootstrapTemplateSpec{ - Kapp: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", fakeKappCarvelPackageRefName, fakeCarvelPackageVersion)}, - } - - err = k8sClient.Update(ctx, clusterBootstrap) - Expect(err).ToNot(HaveOccurred()) - - newClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(clusterBootstrap), newClusterBootstrap)).To(Succeed()) - Expect(newClusterBootstrap.Spec.CNI).To(Equal(clusterBootstrap.Spec.CNI)) - }) - }) - When("Clusterbootstrap is annotated and CNI is empty", func() { - It("reject clusterbootstrap", func() { - originalClusterBootstrap := &runv1alpha3.ClusterBootstrap{} - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, originalClusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - newClusterBootstrap := originalClusterBootstrap.DeepCopy() - if _, ok := newClusterBootstrap.Annotations[constants.UnmanagedCNI]; !ok { - newClusterBootstrap.Annotations = map[string]string{constants.UnmanagedCNI: ""} - } - newClusterBootstrap.Spec = &runv1alpha3.ClusterBootstrapTemplateSpec{ - CNI: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", "calico-carvel-package", fakeCarvelPackageVersion)}, - Kapp: &runv1alpha3.ClusterBootstrapPackage{RefName: fmt.Sprintf("%s.%s", fakeKappCarvelPackageRefName, fakeCarvelPackageVersion)}, - } - err = k8sClient.Update(ctx, newClusterBootstrap) - Expect(err).To(HaveOccurred()) - }) - }) - }) -}) - -var _ = Describe("Clusterbootstrap", func() { - var ( - clusterBootstrapTemplate *runv1alpha3.ClusterBootstrapTemplate - tanzuKubernetesRelease *runv1alpha3.TanzuKubernetesRelease - clusterBootstrapName = "fake-clusterbootstrap" - clusterBootstrapNamespace = "default" - ) - BeforeEach(func() { - // Prepare the Carvel packages - createCarvelPackages(ctx, k8sClient) - // Prepare the ClusterBootstrapTemplate - clusterBootstrapTemplate = constructClusterBootstrapTemplate() - err := k8sClient.Create(ctx, clusterBootstrapTemplate) - if err != nil && !apierrors.IsAlreadyExists(err) { - Expect(err).NotTo(HaveOccurred()) - } - // Prepare the TanzuKubernetesRelease - tanzuKubernetesRelease = constructFakeTanzuKubernetesRelease() - err = k8sClient.Create(ctx, tanzuKubernetesRelease) - if err != nil && !apierrors.IsAlreadyExists(err) { - Expect(err).NotTo(HaveOccurred()) - } - }) - AfterEach(func() { - // Delete Carvel packages - deleteCarvelPackages(ctx, k8sClient) - - // Delete the ClusterBootstrapTemplate - clusterBootstrapTemplate = constructClusterBootstrapTemplate() - err := k8sClient.Delete(ctx, clusterBootstrapTemplate) - Expect(err).NotTo(HaveOccurred()) - - // Delete the TanzuKubernetesRelease - tanzuKubernetesRelease = constructFakeTanzuKubernetesRelease() - err = k8sClient.Delete(ctx, tanzuKubernetesRelease) - Expect(err).NotTo(HaveOccurred()) - }) - - Context("Create Validation", func() { - AfterEach(func() { - _ = k8sClient.Delete(ctx, &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - }, - }) - }) - It("should not deny create request when some APIServices have no endpoint running", func() { - // Create an external APIService which has no endpoints running - var port int32 = 443 - customAPIService := &apiregistrationv1.APIService{ - ObjectMeta: metav1.ObjectMeta{ - Name: "v1beta1.custom.k8s.io", - }, - Spec: apiregistrationv1.APIServiceSpec{ - Group: "custom.k8s.io", - GroupPriorityMinimum: 100, - InsecureSkipTLSVerify: true, - Service: &apiregistrationv1.ServiceReference{ - Name: "custom-server", - Namespace: "kube-system", - Port: &port, - }, - Version: "v1beta1", - VersionPriority: 100, - }, - } - err := k8sClient.Create(ctx, customAPIService) - Expect(err).NotTo(HaveOccurred()) - // Create a VSphereCSIConfig - vSphereCSIConfigName := "fake-csiconfig" - vSphereCSIConfig := &csiv1alpha1.VSphereCSIConfig{ - ObjectMeta: metav1.ObjectMeta{ - Name: vSphereCSIConfigName, - Namespace: clusterBootstrapNamespace, - }, - Spec: csiv1alpha1.VSphereCSIConfigSpec{ - VSphereCSI: csiv1alpha1.VSphereCSI{ - Mode: "vsphereParavirtualCSI", - }, - }, - } - err = k8sClient.Create(ctx, vSphereCSIConfig) - Expect(err).NotTo(HaveOccurred()) - // Create a ClusterBootstrap with empty spec - clusterBootstrap := &runv1alpha3.ClusterBootstrap{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterBootstrapName, - Namespace: clusterBootstrapNamespace, - Annotations: map[string]string{ - constants.AddCBMissingFieldsAnnotationKey: tkrName, - }, - }, - Spec: &runv1alpha3.ClusterBootstrapTemplateSpec{ - CSI: &runv1alpha3.ClusterBootstrapPackage{ - RefName: fmt.Sprintf("%s.%s", fakeCSICarvelPackageRefName, fakeCarvelPackageVersion), - ValuesFrom: &runv1alpha3.ValuesFrom{ - ProviderRef: &corev1.TypedLocalObjectReference{ - Name: vSphereCSIConfigName, - APIGroup: &csiv1alpha1.GroupVersion.Group, - Kind: "VSphereCSIConfig", - }, - }, - }, - }, - } - err = k8sClient.Create(ctx, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - - err = k8sClient.Get(ctx, client.ObjectKey{Namespace: clusterBootstrapNamespace, Name: clusterBootstrapName}, clusterBootstrap) - Expect(err).NotTo(HaveOccurred()) - }) - }) - -}) diff --git a/addons/webhooks/clusterbootstraptemplate_webhook.go b/addons/webhooks/clusterbootstraptemplate_webhook.go deleted file mode 100644 index 7d242ea725..0000000000 --- a/addons/webhooks/clusterbootstraptemplate_webhook.go +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package webhooks - -import ( - "context" - "fmt" - "reflect" - - "github.com/pkg/errors" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/validation/field" - ctrl "sigs.k8s.io/controller-runtime" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" - - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// log is for logging in this package. -var clusterbootstraptemplatelog = logf.Log.WithName("clusterbootstraptemplate-resource") - -// ClusterBootstrapTemplate implements a validating and defaulting webhook for ClusterBootstrap. -type ClusterBootstrapTemplate struct { - SystemNamespace string -} - -func (wh *ClusterBootstrapTemplate) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&runv1alpha3.ClusterBootstrapTemplate{}). - WithValidator(wh). - Complete() -} - -//+kubebuilder:webhook:verbs=create;update,path=/validate-run-tanzu-vmware-com-v1alpha3-clusterbootstraptemplate,mutating=false,failurePolicy=fail,groups=run.tanzu.vmware.com,resources=clusterbootstraptemplates,versions=v1alpha3,name=clusterbootstraptemplate.validating.vmware.com - -var _ webhook.CustomValidator = &ClusterBootstrapTemplate{} - -// ValidateCreate implements webhook.Validator so a webhook will be registered for the type -/* 1. All ClusterBootstrapTempaltes should be created within the tanzu system namespace (configurable) - 2. Kapp and CNI packages must exist -*/ -func (wh *ClusterBootstrapTemplate) ValidateCreate(ctx context.Context, obj runtime.Object) error { - clusterBootstrapTemplate, ok := obj.(*runv1alpha3.ClusterBootstrapTemplate) - if !ok { - return apierrors.NewBadRequest(fmt.Sprintf("expected a Cluster but got a %T", obj)) - } - clusterbootstraplog.Info("validate create", "name", clusterBootstrapTemplate.Name) - - var allErrs field.ErrorList - // Iterating one by one because we need field info for getFieldPath, and some core packages can be nil - - if clusterBootstrapTemplate.Namespace != wh.SystemNamespace { - nsErrMsg := fmt.Sprintf("ClusterBootstrapTemplate can only be created in the designated system namespace %s", wh.SystemNamespace) - allErrs = append(allErrs, field.Invalid(field.NewPath("namespace"), clusterBootstrapTemplate.Namespace, nsErrMsg)) - } - - if err := wh.validateClusterBootstrapPackage(clusterBootstrapTemplate.Spec.CNI, getFieldPath("cni")); err != nil { - allErrs = append(allErrs, err) - } - - if err := wh.validateClusterBootstrapPackage(clusterBootstrapTemplate.Spec.Kapp, getFieldPath("kapp")); err != nil { - allErrs = append(allErrs, err) - } - - // CSI and CPI can be nil - if clusterBootstrapTemplate.Spec.CSI != nil { - if err := wh.validateClusterBootstrapPackage(clusterBootstrapTemplate.Spec.CSI, getFieldPath("csi")); err != nil { - allErrs = append(allErrs, err) - } - } - if clusterBootstrapTemplate.Spec.CPI != nil { - if err := wh.validateClusterBootstrapPackage(clusterBootstrapTemplate.Spec.CPI, getFieldPath("cpi")); err != nil { - allErrs = append(allErrs, err) - } - } - - if clusterBootstrapTemplate.Spec.AdditionalPackages != nil { - // validate additional packages - for idx, pkg := range clusterBootstrapTemplate.Spec.AdditionalPackages { - if err := wh.validateClusterBootstrapPackage(pkg, getFieldPath("additionalPackages").Child(string(rune(idx)))); err != nil { - allErrs = append(allErrs, err) - } - } - } - - if len(allErrs) == 0 { - return nil - } - - return apierrors.NewInvalid( - schema.GroupKind{Group: "run.tanzu.vmware.com", Kind: "ClusterBootstrapTemplate"}, - clusterBootstrapTemplate.Name, allErrs) -} - -func (wh *ClusterBootstrapTemplate) validateClusterBootstrapPackage(pkg *runv1alpha3.ClusterBootstrapPackage, fldPath *field.Path) *field.Error { - if pkg == nil { - return field.Invalid(fldPath, pkg, "package can't be nil") - } - - // valuesFrom can be nil - if pkg.ValuesFrom == nil { - return nil - } - - // Currently, we don't allow more than one field from valuesFrom to be present - if pkg.ValuesFrom.CountFields() > 1 { - return field.Invalid(fldPath, pkg.ValuesFrom, "valuesFrom can't have more than one non-null subfield") - } - - // Will not check if provider config CRs, secretRefs or package CRs exist in the cluster for clusterBootstrapTemplate - // As there is no ordering guaranteed in creating TKR resources, i.e. CBT can be created before other resources - - if pkg.ValuesFrom.ProviderRef != nil && pkg.ValuesFrom.ProviderRef.APIGroup == nil { - return field.Invalid(fldPath.Child("valuesFrom").Child("ProviderRef"), pkg.ValuesFrom.ProviderRef, "APIGroup can't be nil") - } - - return nil -} - -// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (wh *ClusterBootstrapTemplate) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) error { - // Covert objs to ClusterBootstrapTemplate - newClusterBootstrapTemplate, ok := newObj.(*runv1alpha3.ClusterBootstrapTemplate) - if !ok { - return apierrors.NewBadRequest(fmt.Sprintf("expected a ClusterBootstrap but got a %T", newObj)) - } - oldClusterBootstrapTemplate, ok := oldObj.(*runv1alpha3.ClusterBootstrapTemplate) - if !ok { - return apierrors.NewBadRequest(fmt.Sprintf("expected a ClusterBootstrap but got a %T", oldObj)) - } - clusterbootstraptemplatelog.Info("validate update", "name", newClusterBootstrapTemplate.Name) - - if !reflect.DeepEqual(newClusterBootstrapTemplate.Spec, oldClusterBootstrapTemplate.Spec) { - return errors.New("ClusterBootstrapTemplate has immutable spec, update is not allowed") - } - - return nil -} - -// ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (wh *ClusterBootstrapTemplate) ValidateDelete(ctx context.Context, obj runtime.Object) error { - // No validation required for deletion - return nil -} diff --git a/addons/webhooks/doc.go b/addons/webhooks/doc.go deleted file mode 100644 index 6faa93736a..0000000000 --- a/addons/webhooks/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package webhooks contains external webhook implementations for some of our API types. -package webhooks diff --git a/addons/webhooks/testdata/README.md b/addons/webhooks/testdata/README.md deleted file mode 100644 index d30188ffec..0000000000 --- a/addons/webhooks/testdata/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Testdata - -## The crds directory - -All CRDs are available under `config/crd/bases` which are aligned with the release. However, some newly introduced features -need a newer version of CRD for testing. We copy the CRDs from `config/crd/bases` and make some modifications(e.g., storage version). - -The downside of this approach is the potential inconsistency. Before we have a better solution, we might have to periodically -sync the testdata manually. diff --git a/addons/webhooks/testdata/crds/fake-carvel-package.yaml b/addons/webhooks/testdata/crds/fake-carvel-package.yaml deleted file mode 100644 index 85776a7b4e..0000000000 --- a/addons/webhooks/testdata/crds/fake-carvel-package.yaml +++ /dev/null @@ -1,432 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: packages.data.packaging.carvel.dev -spec: - group: data.packaging.carvel.dev - names: - kind: Package - listKind: PackageList - plural: packages - singular: package - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - capacityRequirementsDescription: - type: string - licenses: - items: - type: string - type: array - refName: - type: string - releaseNotes: - type: string - releasedAt: - format: date-time - nullable: true - type: string - template: - properties: - spec: - properties: - canceled: - description: Canceled when set to true will stop all active - changes - type: boolean - cluster: - properties: - kubeconfigSecretRef: - properties: - key: - type: string - name: - type: string - type: object - namespace: - type: string - type: object - deploy: - items: - properties: - kapp: - properties: - delete: - properties: - rawOptions: - items: - type: string - type: array - type: object - inspect: - properties: - rawOptions: - items: - type: string - type: array - type: object - intoNs: - type: string - mapNs: - items: - type: string - type: array - rawOptions: - items: - type: string - type: array - type: object - type: object - type: array - fetch: - items: - properties: - git: - properties: - lfsSkipSmudge: - type: boolean - ref: - type: string - refSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - secretRef: - description: 'Secret may include one or more keys: - ssh-privatekey, ssh-knownhosts' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - subPath: - type: string - url: - type: string - type: object - helmChart: - properties: - name: - description: 'Example: stable/redis' - type: string - repository: - properties: - secretRef: - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - url: - type: string - type: object - version: - type: string - type: object - http: - properties: - secretRef: - description: 'Secret may include one or more keys: - username, password' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - sha256: - type: string - subPath: - type: string - url: - description: 'URL can point to one of following - formats: text, tgz, zip' - type: string - type: object - image: - properties: - secretRef: - description: 'Secret may include one or more keys: - username, password, token. By default anonymous - access is used for authentication. TODO support - docker config formated secret' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - subPath: - type: string - tagSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - url: - description: 'Example: username/app1-config:v0.1.0' - type: string - type: object - imgpkgBundle: - properties: - image: - type: string - secretRef: - description: 'Secret may include one or more keys: - username, password, token. By default anonymous - access is used for authentication. TODO support - docker config formated secret' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - tagSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - type: object - inline: - properties: - paths: - additionalProperties: - type: string - type: object - pathsFrom: - items: - properties: - configMapRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - type: object - type: array - type: object - type: object - type: array - noopDelete: - description: When NoopDeletion set to true, App deletion should - delete App CR but preserve App's associated resources - type: boolean - paused: - description: Paused when set to true will ignore all pending - changes, once it set back to false, pending changes will - be applied - type: boolean - serviceAccountName: - type: string - syncPeriod: - description: Controls frequency of app reconciliation - type: string - template: - items: - properties: - helmTemplate: - properties: - name: - type: string - namespace: - type: string - path: - type: string - valuesFrom: - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - jsonnet: - description: TODO implement jsonnet - type: object - kbld: - properties: - paths: - items: - type: string - type: array - type: object - kustomize: - description: TODO implement kustomize - type: object - sops: - properties: - age: - properties: - privateKeysSecretRef: - properties: - name: - type: string - type: object - type: object - paths: - items: - type: string - type: array - pgp: - properties: - privateKeysSecretRef: - properties: - name: - type: string - type: object - type: object - type: object - ytt: - properties: - fileMarks: - items: - type: string - type: array - ignoreUnknownComments: - type: boolean - inline: - properties: - paths: - additionalProperties: - type: string - type: object - pathsFrom: - items: - properties: - configMapRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - type: object - type: array - type: object - paths: - items: - type: string - type: array - strict: - type: boolean - valuesFrom: - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - type: object - type: array - type: object - required: - - spec - type: object - valuesSchema: - description: valuesSchema can be used to show template values that - can be configured by users when a Package is installed in an OpenAPI - schema format. - properties: - openAPIv3: - nullable: true - type: object - x-kubernetes-preserve-unknown-fields: true - type: object - version: - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/addons/webhooks/testdata/crds/run.tanzu.vmware.com_tanzukubernetesreleases.yaml b/addons/webhooks/testdata/crds/run.tanzu.vmware.com_tanzukubernetesreleases.yaml deleted file mode 100644 index 2dafbb73f6..0000000000 --- a/addons/webhooks/testdata/crds/run.tanzu.vmware.com_tanzukubernetesreleases.yaml +++ /dev/null @@ -1,555 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.8.0 - creationTimestamp: null - name: tanzukubernetesreleases.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: TanzuKubernetesRelease - listKind: TanzuKubernetesReleaseList - plural: tanzukubernetesreleases - shortNames: - - tkr - singular: tanzukubernetesrelease - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG, which can be used to create TanzuKubernetesCluster instances. TKRs - are immutable to end-users. They are created and managed by TKG to provide - discovery of Kubernetes releases to TKG users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - images: - description: Images is the list of (other than Kubernetes core) essential - container images shipped by this TKR (e.g. coredns, etcd). - items: - description: ContainerImage is a struct representing a single fully - qualified container image name, constructed as `{Repository}/{Name}:{Tag}`. - properties: - name: - description: Name is the container image name without the repository - prefix. It MUST be a valid URI path, MAY contain zero or more - '/', and SHOULD NOT start or end with '/'. - type: string - repository: - description: Repository is the container image repository used - by this image. It MUST be a DNS-compatible name. - type: string - tag: - description: Tag is the container image version tag. It is the - suffix coming after ':' in a fully qualified image name. - type: string - required: - - name - type: object - type: array - kubernetesVersion: - description: KubernetesVersion is the fully qualified Semantic Versioning - conformant version of Kubernetes shipped by this TKR. The same KubernetesVersion - MAY be shipped by different TKRs. - type: string - nodeImageRef: - description: NodeImageRef refers to an object representing the image - used to create TKC nodes (e.g. VirtualMachineImage). - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - repository: - description: Repository is the container image repository for Kubernetes - core images, such as kube-apiserver, kube-proxy, etc. It MUST be - a DNS-compatible name. - type: string - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - - jsonPath: .status.conditions[?(@.type=='UpdatesAvailable')].message - name: Updates Available - type: string - name: v1alpha2 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG Service, which can be used to create TanzuKubernetesCluster instances. - TKRs are immutable to end-users. They are created and managed by TKG Service - to provide discovery of Kubernetes releases to TKG Service users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - images: - description: Images is the list of (other than Kubernetes core) essential - container images shipped by this TKR (e.g. coredns, etcd). - items: - description: ContainerImage is a struct representing a single fully - qualified container image name, constructed as `{Repository}/{Name}:{Tag}`. - properties: - name: - description: Name is the container image name without the repository - prefix. It MUST be a valid URI path, MAY contain zero or more - '/', and SHOULD NOT start or end with '/'. - type: string - repository: - description: Repository is the container image repository used - by this image. It MUST be a DNS-compatible name. - type: string - tag: - description: Tag is the container image version tag. It is the - suffix coming after ':' in a fully qualified image name. - type: string - required: - - name - type: object - type: array - kubernetesVersion: - description: KubernetesVersion is the fully qualified Semantic Versioning - conformant version of Kubernetes shipped by this TKR. The same KubernetesVersion - MAY be shipped by different TKRs. - type: string - nodeImageRef: - description: NodeImageRef refers to an object representing the image - used to create TKC nodes (e.g. VirtualMachineImage). - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - repository: - description: Repository is the container image repository for Kubernetes - core images, such as kube-apiserver, kube-proxy, etc. It MUST be - a DNS-compatible name. - type: string - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - name: v1alpha3 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG, which can be used to create TanzuKubernetesCluster instances. TKRs - are immutable to end-users. They are created and managed by TKG to provide - discovery of Kubernetes releases to TKG users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - bootstrapPackages: - description: BootstrapPackages lists references to all bootstrap packages - shipped with this TKR. - items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - type: array - kubernetes: - description: Kubernetes is Kubernetes - properties: - coredns: - description: CoreDNS specifies the container image repository - and tag for coredns. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - etcd: - description: Etcd specifies the container image repository and - tag for etcd. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - imageRepository: - description: ImageRepository specifies container image registry - to pull images from. - type: string - kube-vip: - description: KubeVIP specifies the container image repository - and tag for kube-vip. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - pause: - description: Pause specifies the container image repository and - tag for pause. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - version: - description: Version is Semantic Versioning conformant version - of the Kubernetes build shipped by this TKR. The same Kubernetes - build MAY be shipped by multiple TKRs. - type: string - required: - - version - type: object - osImages: - description: OSImages lists references to all OSImage objects shipped - with this TKR. - items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - type: array - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - kubernetes - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/addons/webhooks/webhooks_suite_test.go b/addons/webhooks/webhooks_suite_test.go deleted file mode 100644 index f2b38fb032..0000000000 --- a/addons/webhooks/webhooks_suite_test.go +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package webhooks_test - -import ( - "context" - "crypto/tls" - "fmt" - "net" - "os" - "path/filepath" - "testing" - "time" - - csiv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs/csi/v1alpha1" - - apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" - - admissionv1beta1 "k8s.io/api/admission/v1beta1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/dynamic" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/envtest" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/log/zap" - "sigs.k8s.io/controller-runtime/pkg/manager" - - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/addons/test/testutil" - addonwebhooks "github.com/vmware-tanzu/tanzu-framework/addons/webhooks" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -const ( - SystemNamespace = "tkg-system" - clusterBootstrapWebhookManifestFile = "clusterbootstrap-webhook-manifests.yaml" -) - -var ( - k8sClient client.Client - testEnv *envtest.Environment - ctx = ctrl.SetupSignalHandler() - scheme = runtime.NewScheme() - mgr manager.Manager - dynamicClient dynamic.Interface - cancel context.CancelFunc -) - -func TestWebhooks(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Webhooks Suite") -} - -var _ = BeforeSuite(func(done Done) { - - logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) - - By("bootstrapping test environment") - tmpDir, err := os.MkdirTemp("/tmp", "webhooktest") - Expect(err).ToNot(HaveOccurred()) - externalDeps := map[string][]string{ - "sigs.k8s.io/cluster-api/api/v1beta1": {"config/crd/bases", - "controlplane/kubeadm/config/crd/bases"}, - } - externalCRDPaths, err := testutil.GetExternalCRDPaths(externalDeps) - Expect(err).NotTo(HaveOccurred()) - Expect(externalCRDPaths).ToNot(BeEmpty()) - - testEnv = &envtest.Environment{ - CRDInstallOptions: envtest.CRDInstallOptions{CleanUpAfterUse: true}, - ErrorIfCRDPathMissing: true, - CRDDirectoryPaths: append(externalCRDPaths, constructCRDPaths()...), - WebhookInstallOptions: envtest.WebhookInstallOptions{ - LocalServingHost: "127.0.0.1", - LocalServingPort: 9447, // 9443 has been used by clusterbootstrap_test, using 9447 to avoid conflicts - LocalServingCertDir: tmpDir, - Paths: []string{filepath.Join("..", "controllers", "testdata", "webhooks", clusterBootstrapWebhookManifestFile)}, - }, - } - - cfg, err := testEnv.Start() - Expect(err).ToNot(HaveOccurred()) - Expect(cfg).ToNot(BeNil()) - - err = csiv1alpha1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = apiregistrationv1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = admissionv1beta1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = runtanzuv1alpha3.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = kapppkgv1alpha1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - err = clientgoscheme.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - k8sClient, err = client.New(cfg, client.Options{Scheme: scheme}) - Expect(err).ToNot(HaveOccurred()) - Expect(k8sClient).ToNot(BeNil()) - - dynamicClient, err = dynamic.NewForConfig(cfg) - Expect(err).ToNot(HaveOccurred()) - Expect(dynamicClient).ToNot(BeNil()) - - err = clusterapiv1beta1.AddToScheme(scheme) - Expect(err).NotTo(HaveOccurred()) - - webhookInstallOptions := &testEnv.WebhookInstallOptions - options := manager.Options{ - Scheme: scheme, - MetricsBindAddress: "0", - Host: webhookInstallOptions.LocalServingHost, - Port: webhookInstallOptions.LocalServingPort, - CertDir: webhookInstallOptions.LocalServingCertDir, - LeaderElection: false, - } - mgr, err = ctrl.NewManager(testEnv.Config, options) - Expect(err).ToNot(HaveOccurred()) - - // pre-create namespace - ns := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "tkg-system"}} - Expect(k8sClient.Create(context.TODO(), ns)).To(Succeed()) - - // Set up the webhooks in the manager - clusterBootstrapWebhook := addonwebhooks.ClusterBootstrap{ - Client: k8sClient, - SystemNamespace: SystemNamespace, - } - ctx, cancel = context.WithCancel(ctx) - err = clusterBootstrapWebhook.SetupWebhookWithManager(ctx, mgr) - Expect(err).ToNot(HaveOccurred()) - clusterBootstrapTemplateWebhook := addonwebhooks.ClusterBootstrapTemplate{ - SystemNamespace: SystemNamespace, - } - err = clusterBootstrapTemplateWebhook.SetupWebhookWithManager(mgr) - Expect(err).ToNot(HaveOccurred()) - - go func() { - defer GinkgoRecover() - Expect(mgr.Start(ctx)).To(Succeed()) - }() - - // wait for the webhook server to get ready - dialer := &net.Dialer{Timeout: time.Second} - addrPort := fmt.Sprintf("%s:%d", webhookInstallOptions.LocalServingHost, webhookInstallOptions.LocalServingPort) - Eventually(func() error { - // It is safe to have nolint:gosec below is because this is just a test - conn, err := tls.DialWithDialer(dialer, "tcp", addrPort, &tls.Config{InsecureSkipVerify: true}) //nolint:gosec - if err != nil { - return err - } - conn.Close() - return nil - }).Should(Succeed()) - - close(done) -}, 60) - -var _ = AfterSuite(func() { - cancel() - By("tearing down the test environment") - err := testEnv.Stop() - Expect(err).NotTo(HaveOccurred()) -}) - -func constructCRDPaths() []string { - // We do not need all CRDs under config/crd/bases, only load the required ones - return []string{ - filepath.Join("..", "..", "apis", "addonconfigs", "config", "crd", "bases", "cni.tanzu.vmware.com_antreaconfigs.yaml"), - filepath.Join("..", "..", "apis", "addonconfigs", "config", "crd", "bases", "cni.tanzu.vmware.com_calicoconfigs.yaml"), - filepath.Join("..", "..", "apis", "addonconfigs", "config", "crd", "bases", "cpi.tanzu.vmware.com_vspherecpiconfigs.yaml"), - filepath.Join("..", "..", "apis", "addonconfigs", "config", "crd", "bases", "csi.tanzu.vmware.com_vspherecsiconfigs.yaml"), - filepath.Join("..", "..", "apis", "addonconfigs", "config", "crd", "bases", "cpi.tanzu.vmware.com_kubevipcpiconfigs.yaml"), - filepath.Join("..", "..", "apis", "run", "config", "crd", "bases", "run.tanzu.vmware.com_kappcontrollerconfigs.yaml"), - filepath.Join("..", "..", "apis", "run", "config", "crd", "bases", "run.tanzu.vmware.com_clusterbootstraps.yaml"), - filepath.Join("..", "..", "apis", "run", "config", "crd", "bases", "run.tanzu.vmware.com_clusterbootstraptemplates.yaml"), - filepath.Join("testdata", "crds"), - } -} diff --git a/apis/addonconfigs/Makefile b/apis/addonconfigs/Makefile deleted file mode 100644 index 3175c2cd85..0000000000 --- a/apis/addonconfigs/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../../common.mk diff --git a/apis/addonconfigs/cni/v1alpha1/antreaconfig_types.go b/apis/addonconfigs/cni/v1alpha1/antreaconfig_types.go deleted file mode 100644 index 70663f9f62..0000000000 --- a/apis/addonconfigs/cni/v1alpha1/antreaconfig_types.go +++ /dev/null @@ -1,295 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -type AntreaProxyNodePortAddress []string - -// AntreaConfigSpec defines the desired state of AntreaConfig -type AntreaConfigSpec struct { - Antrea Antrea `json:"antrea,omitempty"` -} - -type Antrea struct { - AntreaConfigDataValue AntreaConfigDataValue `json:"config,omitempty"` -} - -type AntreaEgress struct { - //+ kubebuilder:validation:Optional - EgressExceptCIDRs []string `json:"exceptCIDRs,omitempty"` -} - -type AntreaNodePortLocal struct { - //+ kubebuilder:validation:Optional - Enabled bool `json:"enabled,omitempty"` - - //+ kubebuilder:validation:Optional - PortRange string `json:"portRange,omitempty"` -} - -type AntreaProxy struct { - //+ kubebuilder:validation:Optional - ProxyAll bool `json:"proxyAll,omitempty"` - - //+ kubebuilder:validation:Optional - NodePortAddresses []string `json:"nodePortAddresses,omitempty"` - - //+ kubebuilder:validation:Optional - SkipServices []string `json:"skipServices,omitempty"` - - //+ kubebuilder:validation:Optional - ProxyLoadBalancerIPs bool `json:"proxyLoadBalancerIPs,omitempty"` -} - -type AntreaFlowExporter struct { - //+ kubebuilder:validation:Optional - CollectorAddress string `json:"collectorAddress,omitempty"` - - //+ kubebuilder:validation:Optional - PollInterval string `json:"pollInterval,omitempty"` - - //+ kubebuilder:validation:Optional - ActiveFlowTimeout string `json:"activeFlowTimeout,omitempty"` - - //+ kubebuilder:validation:Optional - IdleFlowTimeout string `json:"idleFlowTimeout,omitempty"` -} - -type AntreaWireGuard struct { - //+ kubebuilder:validation:Optional - Port int `json:"port,omitempty"` -} - -type AntreaMultiCluster struct { - //+ kubebuilder:validation:Optional - Enable bool `json:"enable,omitempty"` - //+ kubebuilder:validation:Optional - Namespace string `json:"namespace,omitempty"` -} - -type AntreaMulticast struct { - //+ kubebuilder:validation:Optional - IGMPQueryInterval string `json:"igmpQueryInterval,omitempty"` -} - -type AntreaConfigDataValue struct { - // Specifies Egress related configuration. - // +kubebuilder:validation:Optional - Egress AntreaEgress `json:"egress,omitempty"` - - // Specifies NodePortLocal related configuration. - // +kubebuilder:validation:Optional - NodePortLocal AntreaNodePortLocal `json:"nodePortLocal,omitempty"` - - // Specifies AntreaProxy related configuration. - // +kubebuilder:validation:Optional - AntreaProxy AntreaProxy `json:"antreaProxy,omitempty"` - - // Specifies FlowExporter related configuration. - // +kubebuilder:validation:Optional - AntreaFlowExporter AntreaFlowExporter `json:"flowExporter,omitempty"` - - // Provide the address of Kubernetes apiserver, to override any value provided in kubeconfig or InClusterConfig. - // +kubebuilder:validation:Optional - KubeAPIServerOverride string `json:"kubeAPIServerOverride,omitempty"` - - // Multicast related configuration. - // +kubebuilder:validation:Optional - Multicast AntreaMulticast `json:"multicast,omitempty"` - - // MultiCluster realted configuration. - // +kubebuilder:validation:Optional - MultiCluster AntreaMultiCluster `json:"multicluster,omitempty"` - - // The name of the interface on Node which is used for tunneling or routing. - // +kubebuilder:validation:Optional - TransportInterface string `json:"transportInterface,omitempty"` - - // The network CIDRs of the interface on Node which is used for tunneling or routing. - // +kubebuilder:validation:Optional - TransportInterfaceCIDRs []string `json:"transportInterfaceCIDRs,omitempty"` - - // The names of the interfaces on Nodes that are used to forward multicast traffic. - // +kubebuilder:validation:Optional - MulticastInterfaces []string `json:"multicastInterfaces,omitempty"` - - // Tunnel protocols used for encapsulating traffic across Nodes. One of the following options =:> geneve, vxlan, gre, stt - // +kubebuilder:validation:Optional - TunnelType string `json:"tunnelType,omitempty"` - - // Determines how tunnel traffic is encrypted. One of the following options =:> none, ipsec, wireguard - // +kubebuilder:validation:Optional - TrafficEncryptionMode string `json:"trafficEncryptionMode,omitempty"` - - // Enable usage reporting (telemetry) to VMware. - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - EnableUsageReporting bool `json:"enableUsageReporting,omitempty"` - - // Specifies WireGuard related configuration. - // +kubebuilder:validation:Optional - WireGuard AntreaWireGuard `json:"wireGuard,omitempty"` - - // ClusterIP CIDR range for Services. - // +kubebuilder:validation:Optional - ServiceCIDR string `json:"serviceCIDR,omitempty"` - - // The traffic encapsulation mode. One of the following options => encap, noEncap, hybrid, networkPolicyOnly - // +kubebuilder:validation:Optional - // +kubebuilder:validation:Enum="encap";"noEncap";"hybrid";"networkPolicyOnly" - // +kubebuilder:default:=encap - TrafficEncapMode string `json:"trafficEncapMode,omitempty"` - - // Flag to enable/disable SNAT for the egress traffic from a Pod to the external network - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - NoSNAT bool `json:"noSNAT,omitempty"` - - // Disable UDP tunnel offload feature on default NIC - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - DisableUDPTunnelOffload bool `json:"disableUdpTunnelOffload,omitempty"` - - // Default MTU to use for the host gateway interface and the network interface of each Pod. If omitted, antrea-agent will discover the MTU of the Node's primary interface - // +kubebuilder:validation:Optional - // +kubebuilder:default:="" - DefaultMTU string `json:"defaultMTU,omitempty"` - - // List of allowed cipher suites. If omitted, the default Go Cipher Suites will be used - // +kubebuilder:validation:Optional - // +kubebuilder:default:="TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384" - TLSCipherSuites string `json:"tlsCipherSuites,omitempty"` - - // Enable bridging mode of Pod network on Nodes - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - EnableBridgingMode bool `json:"enableBridgingMode,omitempty"` - - // Disable TX checksum offloading for container network interfaces - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - DisableTXChecksumOffload bool `json:"disableTXChecksumOffload,omitempty"` - - // Provide the address of DNS server, to override the kube-dns service - // +kubebuilder:validation:Optional - // +kubebuilder:default:="" - DNSServerOverride string `json:"dnsServerOverride,omitempty"` - - // FeatureGates is a map of feature names to flags that enable or disable experimental features - // +kubebuilder:validation:Optional - FeatureGates AntreaFeatureGates `json:"featureGates,omitempty"` -} - -type AntreaFeatureGates struct { - // Flag to enable/disable antrea proxy - // +kubebuilder:validation:Optional - // +kubebuilder:default:=true - AntreaProxy bool `json:"AntreaProxy,omitempty"` - - // Flag to enable/disable EndpointSlice support in AntreaProxy. If AntreaProxy is not enabled, this flag will not take effect - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - EndpointSlice bool `json:"EndpointSlice,omitempty"` - - // Flag to enable/disable antrea policy - // +kubebuilder:validation:Optional - // +kubebuilder:default:=true - AntreaPolicy bool `json:"AntreaPolicy,omitempty"` - - // Flag to enable/disable flow exporter - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - FlowExporter bool `json:"FlowExporter,omitempty"` - - // Flag to enable/disable SNAT IPs of Pod egress traffic - // +kubebuilder:validation:Optional - // +kubebuilder:default:=true - Egress bool `json:"Egress,omitempty"` - - // Flag to enable/disable NodePortLocal feature to make the pods reachable externally through NodePort - // +kubebuilder:validation:Optional - // +kubebuilder:default:=true - NodePortLocal bool `json:"NodePortLocal,omitempty"` - - // Flag to enable/disable antrea traceflow - // +kubebuilder:validation:Optional - // +kubebuilder:default:=true - AntreaTraceflow bool `json:"AntreaTraceflow,omitempty"` - - // Flag to enable/disable network policy stats - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - NetworkPolicyStats bool `json:"NetworkPolicyStats,omitempty"` - - // Flag to enable/disable antrea IPAM - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - AntreaIPAM bool `json:"AntreaIPAM,omitempty"` - - // Flag to enable/disable service external IP - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - ServiceExternalIP bool `json:"ServiceExternalIP,omitempty"` - - // Flag to enable/disable multicast - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - Multicast bool `json:"Multicast,omitempty"` - - // Enable Antrea Multi-cluster Gateway to support cross-cluster traffic. - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - MultiCluster bool `json:"Multicluster,omitempty"` - - // Enable support for provisioning secondary network interfaces for Pods (using Pod annotations). - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - SecondaryNetwork bool `json:"SecondaryNetwork,omitempty"` - - // Enable mirroring or redirecting the traffic Pods send or receive. - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - TrafficControl bool `json:"TrafficControl,omitempty"` -} - -// AntreaConfigStatus defines the observed state of AntreaConfig -type AntreaConfigStatus struct { - // Reference to the data value secret created by controller - // +kubebuilder:validation:Optional - SecretRef string `json:"secretRef,omitempty"` -} - -// +kubebuilder:object:root=true -// +kubebuilder:subresource:status -// +kubebuilder:resource:path=antreaconfigs,shortName=antreaconf,scope=Namespaced -// +kubebuilder:printcolumn:name="TrafficEncapMode",type="string",JSONPath=".spec.antrea.config.trafficEncapMode",description="The traffic encapsulation mode. One of the following options => encap, noEncap, hybrid, networkPolicyOnly" -// +kubebuilder:printcolumn:name="DefaultMTU",type="string",JSONPath=".spec.antrea.config.defaultMTU",description="Default MTU to use for the host gateway interface and the network interface of each Pod. If omitted, antrea-agent will discover the MTU of the Node's primary interface" -// +kubebuilder:printcolumn:name="AntreaProxy",type="string",JSONPath=".spec.antrea.config.featureGates.AntreaProxy",description="Flag to enable/disable antrea proxy" -// +kubebuilder:printcolumn:name="AntreaPolicy",type="string",JSONPath=".spec.antrea.config.featureGates.AntreaPolicy",description="Flag to enable/disable antrea policy" -// +kubebuilder:printcolumn:name="SecretRef",type="string",JSONPath=".status.secretRef",description="Name of the antrea data values secret" - -// AntreaConfig is the Schema for the antreaconfigs API -type AntreaConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec AntreaConfigSpec `json:"spec"` - Status AntreaConfigStatus `json:"status,omitempty"` -} - -// +kubebuilder:object:root=true - -// AntreaConfigList contains a list of AntreaConfig -type AntreaConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []AntreaConfig `json:"items"` -} - -func init() { - SchemeBuilder.Register(&AntreaConfig{}, &AntreaConfigList{}) -} diff --git a/apis/addonconfigs/cni/v1alpha1/antreaconfig_webhook.go b/apis/addonconfigs/cni/v1alpha1/antreaconfig_webhook.go deleted file mode 100644 index 94466ff76b..0000000000 --- a/apis/addonconfigs/cni/v1alpha1/antreaconfig_webhook.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "fmt" - "reflect" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/validation/field" - ctrl "sigs.k8s.io/controller-runtime" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" -) - -// log is for logging in this package. -var antreaconfiglog = logf.Log.WithName("antreaconfig-resource") - -func (r *AntreaConfig) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(r). - Complete() -} - -var _ webhook.Validator = &AntreaConfig{} - -// +kubebuilder:webhook:verbs=create;update,path=/validate-cni-tanzu-vmware-com-v1alpha1-antreaconfig,mutating=false,failurePolicy=fail,groups=cni.tanzu.vmware.com,resources=antreaconfigs,versions=v1alpha1,name=vantreaconfig.kb.io,admissionReviewVersions=v1,sideEffects=None - -// ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (r *AntreaConfig) ValidateCreate() error { - antreaconfiglog.Info("validate create", "name", r.Name) - - var allErrs field.ErrorList - - if !r.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaProxy && - r.Spec.Antrea.AntreaConfigDataValue.FeatureGates.EndpointSlice { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "featureGates", "EndpointSlice"), - r.Spec.Antrea.AntreaConfigDataValue.FeatureGates.EndpointSlice, - "field cannot be enabled if AntreaProxy is disabled"), - ) - } - - if r.Spec.Antrea.AntreaConfigDataValue.NoSNAT && - (r.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode == "encap" || - r.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode == "hybrid") { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "noSNAT"), - r.Spec.Antrea.AntreaConfigDataValue.NoSNAT, - "field must be disabled for encap and hybrid mode"), - ) - } - - if len(allErrs) == 0 { - return nil - } - return apierrors.NewInvalid( - schema.GroupKind{Group: "cni.tanzu.vmware.com", Kind: "AntreaConfig"}, r.Name, allErrs) -} - -// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (r *AntreaConfig) ValidateUpdate(old runtime.Object) error { - antreaconfiglog.Info("validate update", "name", r.Name) - - oldObj, ok := old.(*AntreaConfig) - if !ok { - return apierrors.NewBadRequest(fmt.Sprintf("Expected an AntreaConfig but got a %T", oldObj)) - } - - var allErrs field.ErrorList - - // Check for changes to immutable fields and return errors - if !reflect.DeepEqual(r.Spec.Antrea.AntreaConfigDataValue.NoSNAT, - oldObj.Spec.Antrea.AntreaConfigDataValue.NoSNAT) { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "noSNAT"), - r.Spec.Antrea.AntreaConfigDataValue.NoSNAT, "field is immutable"), - ) - } - if !reflect.DeepEqual(r.Spec.Antrea.AntreaConfigDataValue.DisableUDPTunnelOffload, - oldObj.Spec.Antrea.AntreaConfigDataValue.DisableUDPTunnelOffload) { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "disableUdpTunnelOffload"), - r.Spec.Antrea.AntreaConfigDataValue.DisableUDPTunnelOffload, "field is immutable"), - ) - } - if !reflect.DeepEqual(r.Spec.Antrea.AntreaConfigDataValue.TLSCipherSuites, - oldObj.Spec.Antrea.AntreaConfigDataValue.TLSCipherSuites) { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "tlsCipherSuites"), - r.Spec.Antrea.AntreaConfigDataValue.TLSCipherSuites, "field is immutable"), - ) - } - if !reflect.DeepEqual(r.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode, - oldObj.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode) { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "trafficEncapMode"), - r.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode, "field is immutable"), - ) - } - if len(allErrs) == 0 { - return nil - } - return apierrors.NewInvalid( - schema.GroupKind{Group: "cni.tanzu.vmware.com", Kind: "AntreaConfig"}, r.Name, allErrs) -} - -// ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (r *AntreaConfig) ValidateDelete() error { - // No validation required for AntreaConfig deletion - return nil -} diff --git a/apis/addonconfigs/cni/v1alpha1/calicoconfig_types.go b/apis/addonconfigs/cni/v1alpha1/calicoconfig_types.go deleted file mode 100644 index 8295693e03..0000000000 --- a/apis/addonconfigs/cni/v1alpha1/calicoconfig_types.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// CalicoConfigSpec defines the desired state of CalicoConfig. -type CalicoConfigSpec struct { - Calico Calico `json:"calico,omitempty"` -} - -// Calico stores the configurations for Calico. -type Calico struct { - Config CalicoConfigDataValue `json:"config,omitempty"` -} - -// CalicoConfigDataValue contains the specific configurations for the Calico package. -type CalicoConfigDataValue struct { - // VethMTU defines maximum transmission unit. "0" as default means MTU will be auto detected. - //+kubebuilder:validation:Optional - //+kubebuilder:validation:Minimum=0 - //+kubebuilder:default:=0 - VethMTU int64 `json:"vethMTU,omitempty"` - - // SkipCNIBinaries allows to skip the cni plugin binaries installation. - // Default to false. Set to true for providers who already installed - // cni plugin binaries in their OVAs and do not want Calico to overwrite them. - //+kubebuilder:validation:Optional - //+kubebuilder:default:=false - SkipCNIBinaries bool `json:"skipCNIBinaries,omitempty"` -} - -// CalicoConfigStatus defines the observed state of CalicoConfig. -type CalicoConfigStatus struct { - // SecretRef is the name of the data value secret created by calico controller. - //+ kubebuilder:validation:Optional - SecretRef string `json:"secretRef,omitempty"` -} - -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status -//+kubebuilder:resource:path=calicoconfigs,shortName=calicoconf,scope=Namespaced -//+kubebuilder:printcolumn:name="VethMTU",type="integer",JSONPath=".spec.calico.config.vethMTU",description="Maximum transmission unit setting. '0' as default means MTU will be auto detected" -//+kubebuilder:printcolumn:name="SecretRef",type="string",JSONPath=".status.secretRef",description="Name of the Calico data values secret" - -// CalicoConfig is the Schema for the calicoconfigs API. -type CalicoConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec CalicoConfigSpec `json:"spec"` - Status CalicoConfigStatus `json:"status,omitempty"` -} - -//+kubebuilder:object:root=true - -// CalicoConfigList contains a list of CalicoConfig. -type CalicoConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []CalicoConfig `json:"items"` -} - -func init() { - SchemeBuilder.Register(&CalicoConfig{}, &CalicoConfigList{}) -} diff --git a/apis/addonconfigs/cni/v1alpha1/calicoconfig_webhook.go b/apis/addonconfigs/cni/v1alpha1/calicoconfig_webhook.go deleted file mode 100644 index 3c8c03aa68..0000000000 --- a/apis/addonconfigs/cni/v1alpha1/calicoconfig_webhook.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/webhook" -) - -func (r *CalicoConfig) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(r). - Complete() -} - -var _ webhook.Validator = &CalicoConfig{} - -// +kubebuilder:webhook:verbs=create;update,path=/validate-cni-tanzu-vmware-com-v1alpha1-calicoconfig,mutating=false,failurePolicy=fail,groups=cni.tanzu.vmware.com,resources=calicoconfigs,versions=v1alpha1,name=vcalicoconfig.kb.io,admissionReviewVersions=v1,sideEffects=None - -// ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (r *CalicoConfig) ValidateCreate() error { - // No validation required for CalicoConfig creation - return nil -} - -// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (r *CalicoConfig) ValidateUpdate(old runtime.Object) error { - // No validation required for CalicoConfig update - return nil -} - -// ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (r *CalicoConfig) ValidateDelete() error { - // No validation required for CalicoConfig deletion - return nil -} diff --git a/apis/addonconfigs/cni/v1alpha1/groupversion_info.go b/apis/addonconfigs/cni/v1alpha1/groupversion_info.go deleted file mode 100644 index 7daae6aa62..0000000000 --- a/apis/addonconfigs/cni/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 contains API Schema definitions for the cni v1alpha1 API group -// +kubebuilder:object:generate=true -// +groupName=cni.tanzu.vmware.com -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "cni.tanzu.vmware.com", Version: "v1alpha1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/apis/addonconfigs/cni/v1alpha1/zz_generated.deepcopy.go b/apis/addonconfigs/cni/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 6b974c1067..0000000000 --- a/apis/addonconfigs/cni/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,427 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Antrea) DeepCopyInto(out *Antrea) { - *out = *in - in.AntreaConfigDataValue.DeepCopyInto(&out.AntreaConfigDataValue) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Antrea. -func (in *Antrea) DeepCopy() *Antrea { - if in == nil { - return nil - } - out := new(Antrea) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaConfig) DeepCopyInto(out *AntreaConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaConfig. -func (in *AntreaConfig) DeepCopy() *AntreaConfig { - if in == nil { - return nil - } - out := new(AntreaConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AntreaConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaConfigDataValue) DeepCopyInto(out *AntreaConfigDataValue) { - *out = *in - in.Egress.DeepCopyInto(&out.Egress) - out.NodePortLocal = in.NodePortLocal - in.AntreaProxy.DeepCopyInto(&out.AntreaProxy) - out.AntreaFlowExporter = in.AntreaFlowExporter - out.Multicast = in.Multicast - out.MultiCluster = in.MultiCluster - if in.TransportInterfaceCIDRs != nil { - in, out := &in.TransportInterfaceCIDRs, &out.TransportInterfaceCIDRs - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.MulticastInterfaces != nil { - in, out := &in.MulticastInterfaces, &out.MulticastInterfaces - *out = make([]string, len(*in)) - copy(*out, *in) - } - out.WireGuard = in.WireGuard - out.FeatureGates = in.FeatureGates -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaConfigDataValue. -func (in *AntreaConfigDataValue) DeepCopy() *AntreaConfigDataValue { - if in == nil { - return nil - } - out := new(AntreaConfigDataValue) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaConfigList) DeepCopyInto(out *AntreaConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]AntreaConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaConfigList. -func (in *AntreaConfigList) DeepCopy() *AntreaConfigList { - if in == nil { - return nil - } - out := new(AntreaConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AntreaConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaConfigSpec) DeepCopyInto(out *AntreaConfigSpec) { - *out = *in - in.Antrea.DeepCopyInto(&out.Antrea) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaConfigSpec. -func (in *AntreaConfigSpec) DeepCopy() *AntreaConfigSpec { - if in == nil { - return nil - } - out := new(AntreaConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaConfigStatus) DeepCopyInto(out *AntreaConfigStatus) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaConfigStatus. -func (in *AntreaConfigStatus) DeepCopy() *AntreaConfigStatus { - if in == nil { - return nil - } - out := new(AntreaConfigStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaEgress) DeepCopyInto(out *AntreaEgress) { - *out = *in - if in.EgressExceptCIDRs != nil { - in, out := &in.EgressExceptCIDRs, &out.EgressExceptCIDRs - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaEgress. -func (in *AntreaEgress) DeepCopy() *AntreaEgress { - if in == nil { - return nil - } - out := new(AntreaEgress) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaFeatureGates) DeepCopyInto(out *AntreaFeatureGates) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaFeatureGates. -func (in *AntreaFeatureGates) DeepCopy() *AntreaFeatureGates { - if in == nil { - return nil - } - out := new(AntreaFeatureGates) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaFlowExporter) DeepCopyInto(out *AntreaFlowExporter) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaFlowExporter. -func (in *AntreaFlowExporter) DeepCopy() *AntreaFlowExporter { - if in == nil { - return nil - } - out := new(AntreaFlowExporter) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaMultiCluster) DeepCopyInto(out *AntreaMultiCluster) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaMultiCluster. -func (in *AntreaMultiCluster) DeepCopy() *AntreaMultiCluster { - if in == nil { - return nil - } - out := new(AntreaMultiCluster) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaMulticast) DeepCopyInto(out *AntreaMulticast) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaMulticast. -func (in *AntreaMulticast) DeepCopy() *AntreaMulticast { - if in == nil { - return nil - } - out := new(AntreaMulticast) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaNodePortLocal) DeepCopyInto(out *AntreaNodePortLocal) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaNodePortLocal. -func (in *AntreaNodePortLocal) DeepCopy() *AntreaNodePortLocal { - if in == nil { - return nil - } - out := new(AntreaNodePortLocal) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaProxy) DeepCopyInto(out *AntreaProxy) { - *out = *in - if in.NodePortAddresses != nil { - in, out := &in.NodePortAddresses, &out.NodePortAddresses - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.SkipServices != nil { - in, out := &in.SkipServices, &out.SkipServices - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaProxy. -func (in *AntreaProxy) DeepCopy() *AntreaProxy { - if in == nil { - return nil - } - out := new(AntreaProxy) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in AntreaProxyNodePortAddress) DeepCopyInto(out *AntreaProxyNodePortAddress) { - { - in := &in - *out = make(AntreaProxyNodePortAddress, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaProxyNodePortAddress. -func (in AntreaProxyNodePortAddress) DeepCopy() AntreaProxyNodePortAddress { - if in == nil { - return nil - } - out := new(AntreaProxyNodePortAddress) - in.DeepCopyInto(out) - return *out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaWireGuard) DeepCopyInto(out *AntreaWireGuard) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaWireGuard. -func (in *AntreaWireGuard) DeepCopy() *AntreaWireGuard { - if in == nil { - return nil - } - out := new(AntreaWireGuard) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Calico) DeepCopyInto(out *Calico) { - *out = *in - out.Config = in.Config -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Calico. -func (in *Calico) DeepCopy() *Calico { - if in == nil { - return nil - } - out := new(Calico) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CalicoConfig) DeepCopyInto(out *CalicoConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec - out.Status = in.Status -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CalicoConfig. -func (in *CalicoConfig) DeepCopy() *CalicoConfig { - if in == nil { - return nil - } - out := new(CalicoConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *CalicoConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CalicoConfigDataValue) DeepCopyInto(out *CalicoConfigDataValue) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CalicoConfigDataValue. -func (in *CalicoConfigDataValue) DeepCopy() *CalicoConfigDataValue { - if in == nil { - return nil - } - out := new(CalicoConfigDataValue) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CalicoConfigList) DeepCopyInto(out *CalicoConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]CalicoConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CalicoConfigList. -func (in *CalicoConfigList) DeepCopy() *CalicoConfigList { - if in == nil { - return nil - } - out := new(CalicoConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *CalicoConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CalicoConfigSpec) DeepCopyInto(out *CalicoConfigSpec) { - *out = *in - out.Calico = in.Calico -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CalicoConfigSpec. -func (in *CalicoConfigSpec) DeepCopy() *CalicoConfigSpec { - if in == nil { - return nil - } - out := new(CalicoConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CalicoConfigStatus) DeepCopyInto(out *CalicoConfigStatus) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CalicoConfigStatus. -func (in *CalicoConfigStatus) DeepCopy() *CalicoConfigStatus { - if in == nil { - return nil - } - out := new(CalicoConfigStatus) - in.DeepCopyInto(out) - return out -} diff --git a/apis/addonconfigs/cni/v1alpha2/antreaconfig_types.go b/apis/addonconfigs/cni/v1alpha2/antreaconfig_types.go deleted file mode 100644 index 67dd09bcb0..0000000000 --- a/apis/addonconfigs/cni/v1alpha2/antreaconfig_types.go +++ /dev/null @@ -1,368 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha2 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -type AntreaProxyNodePortAddress []string - -// AntreaConfigSpec defines the desired state of AntreaConfig -type AntreaConfigSpec struct { - Antrea Antrea `json:"antrea,omitempty"` - // AntreaNsx defines nsxt adapter related configurations - AntreaNsx AntreaNsx `json:"antreaNsx,omitempty"` -} - -type Antrea struct { - AntreaConfigDataValue AntreaConfigDataValue `json:"config,omitempty"` -} - -type AntreaEgress struct { - //+ kubebuilder:validation:Optional - EgressExceptCIDRs []string `json:"exceptCIDRs,omitempty"` -} - -type AntreaNodePortLocal struct { - //+ kubebuilder:validation:Optional - Enabled bool `json:"enabled,omitempty"` - - //+ kubebuilder:validation:Optional - PortRange string `json:"portRange,omitempty"` -} - -type AntreaProxy struct { - //+ kubebuilder:validation:Optional - ProxyAll bool `json:"proxyAll,omitempty"` - - //+ kubebuilder:validation:Optional - NodePortAddresses []string `json:"nodePortAddresses,omitempty"` - - //+ kubebuilder:validation:Optional - SkipServices []string `json:"skipServices,omitempty"` - - //+ kubebuilder:validation:Optional - ProxyLoadBalancerIPs bool `json:"proxyLoadBalancerIPs,omitempty"` -} - -type AntreaFlowExporter struct { - //+ kubebuilder:validation:Optional - CollectorAddress string `json:"collectorAddress,omitempty"` - - //+ kubebuilder:validation:Optional - PollInterval string `json:"pollInterval,omitempty"` - - //+ kubebuilder:validation:Optional - ActiveFlowTimeout string `json:"activeFlowTimeout,omitempty"` - - //+ kubebuilder:validation:Optional - IdleFlowTimeout string `json:"idleFlowTimeout,omitempty"` -} - -type AntreaWireGuard struct { - //+ kubebuilder:validation:Optional - Port int `json:"port,omitempty"` -} - -type AntreaMultiCluster struct { - //+ kubebuilder:validation:Optional - Enable bool `json:"enable,omitempty"` - //+ kubebuilder:validation:Optional - Namespace string `json:"namespace,omitempty"` -} - -type AntreaMulticast struct { - //+ kubebuilder:validation:Optional - IGMPQueryInterval string `json:"igmpQueryInterval,omitempty"` -} - -type AntreaConfigDataValue struct { - // Specifies Egress related configuration. - // +kubebuilder:validation:Optional - Egress AntreaEgress `json:"egress,omitempty"` - - // Specifies NodePortLocal related configuration. - // +kubebuilder:validation:Optional - NodePortLocal AntreaNodePortLocal `json:"nodePortLocal,omitempty"` - - // Specifies AntreaProxy related configuration. - // +kubebuilder:validation:Optional - AntreaProxy AntreaProxy `json:"antreaProxy,omitempty"` - - // Specifies FlowExporter related configuration. - // +kubebuilder:validation:Optional - AntreaFlowExporter AntreaFlowExporter `json:"flowExporter,omitempty"` - - // Provide the address of Kubernetes apiserver, to override any value provided in kubeconfig or InClusterConfig. - // +kubebuilder:validation:Optional - KubeAPIServerOverride string `json:"kubeAPIServerOverride,omitempty"` - - // Multicast related configuration. - // +kubebuilder:validation:Optional - Multicast AntreaMulticast `json:"multicast,omitempty"` - - // MultiCluster realted configuration. - // +kubebuilder:validation:Optional - MultiCluster AntreaMultiCluster `json:"multicluster,omitempty"` - - // The name of the interface on Node which is used for tunneling or routing. - // +kubebuilder:validation:Optional - TransportInterface string `json:"transportInterface,omitempty"` - - // The network CIDRs of the interface on Node which is used for tunneling or routing. - // +kubebuilder:validation:Optional - TransportInterfaceCIDRs []string `json:"transportInterfaceCIDRs,omitempty"` - - // The names of the interfaces on Nodes that are used to forward multicast traffic. - // +kubebuilder:validation:Optional - MulticastInterfaces []string `json:"multicastInterfaces,omitempty"` - - // Tunnel protocols used for encapsulating traffic across Nodes. One of the following options =:> geneve, vxlan, gre, stt - // +kubebuilder:validation:Optional - TunnelType string `json:"tunnelType,omitempty"` - - // TunnelPort is the destination port for UDP and TCP based tunnel protocols (Geneve, VXLAN, and STT).If zero, it will use the assigned IANA port for the protocol. - // +kubebuilder:validation:Optional - // +kubebuilder:default:=0 - TunnelPort int `json:"tunnelPort,omitempty"` - - // TunnelCsum determines whether to compute UDP encapsulation header (Geneve or VXLAN) checksums on outgoing packets - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - TunnelCsum bool `json:"tunnelCsum,omitempty"` - - // Determines how tunnel traffic is encrypted. One of the following options =:> none, ipsec, wireguard - // +kubebuilder:validation:Optional - TrafficEncryptionMode string `json:"trafficEncryptionMode,omitempty"` - - // Enable usage reporting (telemetry) to VMware. - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - EnableUsageReporting bool `json:"enableUsageReporting,omitempty"` - - // Specifies WireGuard related configuration. - // +kubebuilder:validation:Optional - WireGuard AntreaWireGuard `json:"wireGuard,omitempty"` - - // ClusterIP CIDR range for Services. - // +kubebuilder:validation:Optional - ServiceCIDR string `json:"serviceCIDR,omitempty"` - - // The traffic encapsulation mode. One of the following options => encap, noEncap, hybrid, networkPolicyOnly - // +kubebuilder:validation:Optional - // +kubebuilder:validation:Enum="encap";"noEncap";"hybrid";"networkPolicyOnly" - // +kubebuilder:default:=encap - TrafficEncapMode string `json:"trafficEncapMode,omitempty"` - - // Flag to enable/disable SNAT for the egress traffic from a Pod to the external network - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - NoSNAT bool `json:"noSNAT,omitempty"` - - // Disable UDP tunnel offload feature on default NIC - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - DisableUDPTunnelOffload bool `json:"disableUdpTunnelOffload,omitempty"` - - // Default MTU to use for the host gateway interface and the network interface of each Pod. If omitted, antrea-agent will discover the MTU of the Node's primary interface - // +kubebuilder:validation:Optional - // +kubebuilder:default:="" - DefaultMTU string `json:"defaultMTU,omitempty"` - - // List of allowed cipher suites. If omitted, the default Go Cipher Suites will be used - // +kubebuilder:validation:Optional - // +kubebuilder:default:="TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384" - TLSCipherSuites string `json:"tlsCipherSuites,omitempty"` - - // Enable bridging mode of Pod network on Nodes - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - EnableBridgingMode bool `json:"enableBridgingMode,omitempty"` - - // Disable TX checksum offloading for container network interfaces - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - DisableTXChecksumOffload bool `json:"disableTXChecksumOffload,omitempty"` - - // Provide the address of DNS server, to override the kube-dns service - // +kubebuilder:validation:Optional - // +kubebuilder:default:="" - DNSServerOverride string `json:"dnsServerOverride,omitempty"` - - // FeatureGates is a map of feature names to flags that enable or disable experimental features - // +kubebuilder:validation:Optional - FeatureGates AntreaFeatureGates `json:"featureGates,omitempty"` -} - -type AntreaFeatureGates struct { - // Flag to enable/disable antrea proxy - // +kubebuilder:validation:Optional - // +kubebuilder:default:=true - AntreaProxy bool `json:"AntreaProxy,omitempty"` - - // Flag to enable/disable EndpointSlice support in AntreaProxy. If AntreaProxy is not enabled, this flag will not take effect - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - EndpointSlice bool `json:"EndpointSlice,omitempty"` - - // Flag to enable/disable antrea policy - // +kubebuilder:validation:Optional - // +kubebuilder:default:=true - AntreaPolicy bool `json:"AntreaPolicy,omitempty"` - - // Flag to enable/disable flow exporter - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - FlowExporter bool `json:"FlowExporter,omitempty"` - - // Flag to enable/disable SNAT IPs of Pod egress traffic - // +kubebuilder:validation:Optional - // +kubebuilder:default:=true - Egress bool `json:"Egress,omitempty"` - - // Flag to enable/disable NodePortLocal feature to make the pods reachable externally through NodePort - // +kubebuilder:validation:Optional - // +kubebuilder:default:=true - NodePortLocal bool `json:"NodePortLocal,omitempty"` - - // Flag to enable/disable antrea traceflow - // +kubebuilder:validation:Optional - // +kubebuilder:default:=true - AntreaTraceflow bool `json:"AntreaTraceflow,omitempty"` - - // Flag to enable/disable network policy stats - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - NetworkPolicyStats bool `json:"NetworkPolicyStats,omitempty"` - - // Flag to enable/disable antrea IPAM - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - AntreaIPAM bool `json:"AntreaIPAM,omitempty"` - - // Flag to enable/disable service external IP - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - ServiceExternalIP bool `json:"ServiceExternalIP,omitempty"` - - // Flag to enable/disable multicast - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - Multicast bool `json:"Multicast,omitempty"` - - // Enable Antrea Multi-cluster Gateway to support cross-cluster traffic. - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - MultiCluster bool `json:"Multicluster,omitempty"` - - // Enable support for provisioning secondary network interfaces for Pods (using Pod annotations). - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - SecondaryNetwork bool `json:"SecondaryNetwork,omitempty"` - - // Enable mirroring or redirecting the traffic Pods send or receive. - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - TrafficControl bool `json:"TrafficControl,omitempty"` - - // Enable TopologyAwareHints in AntreaProxy. This requires AntreaProxy and EndpointSlice to be enabled, otherwise this flag will not take effect. - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - TopologyAwareHints bool `json:"TopologyAwareHints,omitempty"` -} - -// AntreaConfigStatus defines the observed state of AntreaConfig -type AntreaConfigStatus struct { - // Message to indicate failure reason - // +kubebuilder:validation:Optional - Message string `json:"message,omitempty"` - // Reference to the data value secret created by controller - // +kubebuilder:validation:Optional - SecretRef string `json:"secretRef,omitempty"` -} - -type AntreaNsx struct { - // Enable indicates whether nsxt adapter shall be enabled in the cluster - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - Enable bool `json:"enable,omitempty"` - // BootstrapFrom either providerRef or inline configs - // +kubebuilder:validation:Optional - BootstrapFrom AntreaNsxBootstrapFrom `json:"bootstrapFrom,omitempty"` - // Config is configuration for nsxt adapter - // +kubebuilder:validation:Optional - AntreaNsxConfig AntreaNsxConfig `json:"config,omitempty"` -} - -type AntreaNsxBootstrapFrom struct { - // ProviderRef is used with uTKG, which will be filled by uTKG Addon Controller - // +kubebuilder:validation:Optional - ProviderRef *AntreaNsxProvider `json:"providerRef,omitempty"` - // Inline is used with TKGm, user need to fill in manually - // +kubebuilder:validation:Optional - Inline *AntreaNsxInline `json:"inline,omitempty"` -} - -type AntreaNsxProvider struct { - // Api version for nsxServiceAccount, its value is "nsx.vmware.com/v1alpha1" now - // +kubebuilder:validation:Optional - ApiGroup string `json:"apigroup,omitempty"` - // Kind is the kind for crd, here its value is NsxServiceAccount - // +kubebuilder:validation:Optional - Kind string `json:"kind,omitempty"` - // Name is the name for NsxServiceAccount - // +kubebuilder:validation:Optional - Name string `json:"name,omitempty"` -} - -type AntreaNsxInline struct { - // NsxManagers is the list for nsx managers, it can be either IP address or domain name - // +kubebuilder:validation:Optional - NsxManagers []string `json:"nsxManagers,omitempty"` - // ClusterName is the name for the created cluster - // +kubebuilder:validation:Optional - ClusterName string `json:"clusterName,omitempty"` - // NsxCertName is cert files to access nsx manager - // +kubebuilder:validation:Optional - NsxCertName string `json:"nsxCertName,omitempty"` -} - -type AntreaNsxConfig struct { - // InfraType is the type for infrastructure, so far it is vSphere, VMC, AWS, Azure - // +kubebuilder:validation:Optional - InfraType string `json:"infraType,omitempty"` -} - -// +kubebuilder:object:root=true -// +kubebuilder:subresource:status -// +kubebuilder:resource:path=antreaconfigs,shortName=antreaconf,scope=Namespaced -// +kubebuilder:printcolumn:name="TrafficEncapMode",type="string",JSONPath=".spec.antrea.config.trafficEncapMode",description="The traffic encapsulation mode. One of the following options => encap, noEncap, hybrid, networkPolicyOnly" -// +kubebuilder:printcolumn:name="DefaultMTU",type="string",JSONPath=".spec.antrea.config.defaultMTU",description="Default MTU to use for the host gateway interface and the network interface of each Pod. If omitted, antrea-agent will discover the MTU of the Node's primary interface" -// +kubebuilder:printcolumn:name="AntreaProxy",type="string",JSONPath=".spec.antrea.config.featureGates.AntreaProxy",description="Flag to enable/disable antrea proxy" -// +kubebuilder:printcolumn:name="AntreaPolicy",type="string",JSONPath=".spec.antrea.config.featureGates.AntreaPolicy",description="Flag to enable/disable antrea policy" -// +kubebuilder:printcolumn:name="SecretRef",type="string",JSONPath=".status.secretRef",description="Name of the antrea data values secret" -// +kubebuilder:storageversion -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// AntreaConfig is the Schema for the antreaconfigs API -type AntreaConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec AntreaConfigSpec `json:"spec"` - Status AntreaConfigStatus `json:"status,omitempty"` -} - -// +kubebuilder:object:root=true - -// AntreaConfigList contains a list of AntreaConfig -type AntreaConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []AntreaConfig `json:"items"` -} - -func init() { - SchemeBuilder.Register(&AntreaConfig{}, &AntreaConfigList{}) -} diff --git a/apis/addonconfigs/cni/v1alpha2/antreaconfig_webhook.go b/apis/addonconfigs/cni/v1alpha2/antreaconfig_webhook.go deleted file mode 100644 index 0b626f62f4..0000000000 --- a/apis/addonconfigs/cni/v1alpha2/antreaconfig_webhook.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha2 - -import ( - "fmt" - "reflect" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/validation/field" - ctrl "sigs.k8s.io/controller-runtime" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" -) - -// log is for logging in this package. -var antreaconfiglog = logf.Log.WithName("antreaconfig-resource") - -func (r *AntreaConfig) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(r). - Complete() -} - -var _ webhook.Validator = &AntreaConfig{} - -// +kubebuilder:webhook:verbs=create;update,path=/validate-cni-tanzu-vmware-com-v1alpha1-antreaconfig,mutating=false,failurePolicy=fail,groups=cni.tanzu.vmware.com,resources=antreaconfigs,versions=v1alpha1,name=vantreaconfig.kb.io,admissionReviewVersions=v1,sideEffects=None - -// ValidateCreate implements webhook.Validator so a webhook will be registered for the type -func (r *AntreaConfig) ValidateCreate() error { - antreaconfiglog.Info("validate create", "name", r.Name) - - var allErrs field.ErrorList - - if !r.Spec.Antrea.AntreaConfigDataValue.FeatureGates.AntreaProxy && - r.Spec.Antrea.AntreaConfigDataValue.FeatureGates.EndpointSlice { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "featureGates", "EndpointSlice"), - r.Spec.Antrea.AntreaConfigDataValue.FeatureGates.EndpointSlice, - "field cannot be enabled if AntreaProxy is disabled"), - ) - } - - if r.Spec.Antrea.AntreaConfigDataValue.NoSNAT && - (r.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode == "encap" || - r.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode == "hybrid") { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "noSNAT"), - r.Spec.Antrea.AntreaConfigDataValue.NoSNAT, - "field must be disabled for encap and hybrid mode"), - ) - } - - if len(allErrs) == 0 { - return nil - } - return apierrors.NewInvalid( - schema.GroupKind{Group: "cni.tanzu.vmware.com", Kind: "AntreaConfig"}, r.Name, allErrs) -} - -// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type -func (r *AntreaConfig) ValidateUpdate(old runtime.Object) error { - antreaconfiglog.Info("validate update", "name", r.Name) - - oldObj, ok := old.(*AntreaConfig) - if !ok { - return apierrors.NewBadRequest(fmt.Sprintf("Expected an AntreaConfig but got a %T", oldObj)) - } - - var allErrs field.ErrorList - - // Check for changes to immutable fields and return errors - if !reflect.DeepEqual(r.Spec.Antrea.AntreaConfigDataValue.NoSNAT, - oldObj.Spec.Antrea.AntreaConfigDataValue.NoSNAT) { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "noSNAT"), - r.Spec.Antrea.AntreaConfigDataValue.NoSNAT, "field is immutable"), - ) - } - if !reflect.DeepEqual(r.Spec.Antrea.AntreaConfigDataValue.DisableUDPTunnelOffload, - oldObj.Spec.Antrea.AntreaConfigDataValue.DisableUDPTunnelOffload) { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "disableUdpTunnelOffload"), - r.Spec.Antrea.AntreaConfigDataValue.DisableUDPTunnelOffload, "field is immutable"), - ) - } - if !reflect.DeepEqual(r.Spec.AntreaNsx.Enable, oldObj.Spec.AntreaNsx.Enable) { - allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "antreaNsx", "enable", ""), - r.Spec.AntreaNsx.Enable, "filed is immutable"), - ) - } - if !reflect.DeepEqual(r.Spec.Antrea.AntreaConfigDataValue.TLSCipherSuites, - oldObj.Spec.Antrea.AntreaConfigDataValue.TLSCipherSuites) { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "tlsCipherSuites"), - r.Spec.Antrea.AntreaConfigDataValue.TLSCipherSuites, "field is immutable"), - ) - } - if !reflect.DeepEqual(r.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode, - oldObj.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode) { - allErrs = append(allErrs, - field.Invalid(field.NewPath("spec", "antrea", "config", "trafficEncapMode"), - r.Spec.Antrea.AntreaConfigDataValue.TrafficEncapMode, "field is immutable"), - ) - } - if len(allErrs) == 0 { - return nil - } - return apierrors.NewInvalid( - schema.GroupKind{Group: "cni.tanzu.vmware.com", Kind: "AntreaConfig"}, r.Name, allErrs) -} - -// ValidateDelete implements webhook.Validator so a webhook will be registered for the type -func (r *AntreaConfig) ValidateDelete() error { - // No validation required for AntreaConfig deletion - return nil -} diff --git a/apis/addonconfigs/cni/v1alpha2/groupversion_info.go b/apis/addonconfigs/cni/v1alpha2/groupversion_info.go deleted file mode 100644 index 9980bc138a..0000000000 --- a/apis/addonconfigs/cni/v1alpha2/groupversion_info.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 contains API Schema definitions for the cni v1alpha1 API group -// +kubebuilder:object:generate=true -// +groupName=cni.tanzu.vmware.com -package v1alpha2 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "cni.tanzu.vmware.com", Version: "v1alpha2"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/apis/addonconfigs/cni/v1alpha2/zz_generated.deepcopy.go b/apis/addonconfigs/cni/v1alpha2/zz_generated.deepcopy.go deleted file mode 100644 index 23a63cc095..0000000000 --- a/apis/addonconfigs/cni/v1alpha2/zz_generated.deepcopy.go +++ /dev/null @@ -1,399 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha2 - -import ( - "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Antrea) DeepCopyInto(out *Antrea) { - *out = *in - in.AntreaConfigDataValue.DeepCopyInto(&out.AntreaConfigDataValue) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Antrea. -func (in *Antrea) DeepCopy() *Antrea { - if in == nil { - return nil - } - out := new(Antrea) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaConfig) DeepCopyInto(out *AntreaConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaConfig. -func (in *AntreaConfig) DeepCopy() *AntreaConfig { - if in == nil { - return nil - } - out := new(AntreaConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AntreaConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaConfigDataValue) DeepCopyInto(out *AntreaConfigDataValue) { - *out = *in - in.Egress.DeepCopyInto(&out.Egress) - out.NodePortLocal = in.NodePortLocal - in.AntreaProxy.DeepCopyInto(&out.AntreaProxy) - out.AntreaFlowExporter = in.AntreaFlowExporter - out.Multicast = in.Multicast - out.MultiCluster = in.MultiCluster - if in.TransportInterfaceCIDRs != nil { - in, out := &in.TransportInterfaceCIDRs, &out.TransportInterfaceCIDRs - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.MulticastInterfaces != nil { - in, out := &in.MulticastInterfaces, &out.MulticastInterfaces - *out = make([]string, len(*in)) - copy(*out, *in) - } - out.WireGuard = in.WireGuard - out.FeatureGates = in.FeatureGates -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaConfigDataValue. -func (in *AntreaConfigDataValue) DeepCopy() *AntreaConfigDataValue { - if in == nil { - return nil - } - out := new(AntreaConfigDataValue) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaConfigList) DeepCopyInto(out *AntreaConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]AntreaConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaConfigList. -func (in *AntreaConfigList) DeepCopy() *AntreaConfigList { - if in == nil { - return nil - } - out := new(AntreaConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AntreaConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaConfigSpec) DeepCopyInto(out *AntreaConfigSpec) { - *out = *in - in.Antrea.DeepCopyInto(&out.Antrea) - in.AntreaNsx.DeepCopyInto(&out.AntreaNsx) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaConfigSpec. -func (in *AntreaConfigSpec) DeepCopy() *AntreaConfigSpec { - if in == nil { - return nil - } - out := new(AntreaConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaConfigStatus) DeepCopyInto(out *AntreaConfigStatus) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaConfigStatus. -func (in *AntreaConfigStatus) DeepCopy() *AntreaConfigStatus { - if in == nil { - return nil - } - out := new(AntreaConfigStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaEgress) DeepCopyInto(out *AntreaEgress) { - *out = *in - if in.EgressExceptCIDRs != nil { - in, out := &in.EgressExceptCIDRs, &out.EgressExceptCIDRs - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaEgress. -func (in *AntreaEgress) DeepCopy() *AntreaEgress { - if in == nil { - return nil - } - out := new(AntreaEgress) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaFeatureGates) DeepCopyInto(out *AntreaFeatureGates) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaFeatureGates. -func (in *AntreaFeatureGates) DeepCopy() *AntreaFeatureGates { - if in == nil { - return nil - } - out := new(AntreaFeatureGates) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaFlowExporter) DeepCopyInto(out *AntreaFlowExporter) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaFlowExporter. -func (in *AntreaFlowExporter) DeepCopy() *AntreaFlowExporter { - if in == nil { - return nil - } - out := new(AntreaFlowExporter) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaMultiCluster) DeepCopyInto(out *AntreaMultiCluster) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaMultiCluster. -func (in *AntreaMultiCluster) DeepCopy() *AntreaMultiCluster { - if in == nil { - return nil - } - out := new(AntreaMultiCluster) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaMulticast) DeepCopyInto(out *AntreaMulticast) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaMulticast. -func (in *AntreaMulticast) DeepCopy() *AntreaMulticast { - if in == nil { - return nil - } - out := new(AntreaMulticast) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaNodePortLocal) DeepCopyInto(out *AntreaNodePortLocal) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaNodePortLocal. -func (in *AntreaNodePortLocal) DeepCopy() *AntreaNodePortLocal { - if in == nil { - return nil - } - out := new(AntreaNodePortLocal) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaNsx) DeepCopyInto(out *AntreaNsx) { - *out = *in - in.BootstrapFrom.DeepCopyInto(&out.BootstrapFrom) - out.AntreaNsxConfig = in.AntreaNsxConfig -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaNsx. -func (in *AntreaNsx) DeepCopy() *AntreaNsx { - if in == nil { - return nil - } - out := new(AntreaNsx) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaNsxBootstrapFrom) DeepCopyInto(out *AntreaNsxBootstrapFrom) { - *out = *in - if in.ProviderRef != nil { - in, out := &in.ProviderRef, &out.ProviderRef - *out = new(AntreaNsxProvider) - **out = **in - } - if in.Inline != nil { - in, out := &in.Inline, &out.Inline - *out = new(AntreaNsxInline) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaNsxBootstrapFrom. -func (in *AntreaNsxBootstrapFrom) DeepCopy() *AntreaNsxBootstrapFrom { - if in == nil { - return nil - } - out := new(AntreaNsxBootstrapFrom) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaNsxConfig) DeepCopyInto(out *AntreaNsxConfig) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaNsxConfig. -func (in *AntreaNsxConfig) DeepCopy() *AntreaNsxConfig { - if in == nil { - return nil - } - out := new(AntreaNsxConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaNsxInline) DeepCopyInto(out *AntreaNsxInline) { - *out = *in - if in.NsxManagers != nil { - in, out := &in.NsxManagers, &out.NsxManagers - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaNsxInline. -func (in *AntreaNsxInline) DeepCopy() *AntreaNsxInline { - if in == nil { - return nil - } - out := new(AntreaNsxInline) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaNsxProvider) DeepCopyInto(out *AntreaNsxProvider) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaNsxProvider. -func (in *AntreaNsxProvider) DeepCopy() *AntreaNsxProvider { - if in == nil { - return nil - } - out := new(AntreaNsxProvider) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaProxy) DeepCopyInto(out *AntreaProxy) { - *out = *in - if in.NodePortAddresses != nil { - in, out := &in.NodePortAddresses, &out.NodePortAddresses - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.SkipServices != nil { - in, out := &in.SkipServices, &out.SkipServices - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaProxy. -func (in *AntreaProxy) DeepCopy() *AntreaProxy { - if in == nil { - return nil - } - out := new(AntreaProxy) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in AntreaProxyNodePortAddress) DeepCopyInto(out *AntreaProxyNodePortAddress) { - { - in := &in - *out = make(AntreaProxyNodePortAddress, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaProxyNodePortAddress. -func (in AntreaProxyNodePortAddress) DeepCopy() AntreaProxyNodePortAddress { - if in == nil { - return nil - } - out := new(AntreaProxyNodePortAddress) - in.DeepCopyInto(out) - return *out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AntreaWireGuard) DeepCopyInto(out *AntreaWireGuard) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AntreaWireGuard. -func (in *AntreaWireGuard) DeepCopy() *AntreaWireGuard { - if in == nil { - return nil - } - out := new(AntreaWireGuard) - in.DeepCopyInto(out) - return out -} diff --git a/apis/addonconfigs/config/crd/bases/cni.tanzu.vmware.com_antreaconfigs.yaml b/apis/addonconfigs/config/crd/bases/cni.tanzu.vmware.com_antreaconfigs.yaml deleted file mode 100644 index 05820eed4f..0000000000 --- a/apis/addonconfigs/config/crd/bases/cni.tanzu.vmware.com_antreaconfigs.yaml +++ /dev/null @@ -1,632 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: antreaconfigs.cni.tanzu.vmware.com -spec: - group: cni.tanzu.vmware.com - names: - kind: AntreaConfig - listKind: AntreaConfigList - plural: antreaconfigs - shortNames: - - antreaconf - singular: antreaconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The traffic encapsulation mode. One of the following options => - encap, noEncap, hybrid, networkPolicyOnly - jsonPath: .spec.antrea.config.trafficEncapMode - name: TrafficEncapMode - type: string - - description: Default MTU to use for the host gateway interface and the network - interface of each Pod. If omitted, antrea-agent will discover the MTU of the - Node's primary interface - jsonPath: .spec.antrea.config.defaultMTU - name: DefaultMTU - type: string - - description: Flag to enable/disable antrea proxy - jsonPath: .spec.antrea.config.featureGates.AntreaProxy - name: AntreaProxy - type: string - - description: Flag to enable/disable antrea policy - jsonPath: .spec.antrea.config.featureGates.AntreaPolicy - name: AntreaPolicy - type: string - - description: Name of the antrea data values secret - jsonPath: .status.secretRef - name: SecretRef - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: AntreaConfig is the Schema for the antreaconfigs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AntreaConfigSpec defines the desired state of AntreaConfig - properties: - antrea: - properties: - config: - properties: - antreaProxy: - description: Specifies AntreaProxy related configuration. - properties: - nodePortAddresses: - items: - type: string - type: array - proxyAll: - type: boolean - proxyLoadBalancerIPs: - type: boolean - skipServices: - items: - type: string - type: array - type: object - defaultMTU: - default: "" - description: Default MTU to use for the host gateway interface - and the network interface of each Pod. If omitted, antrea-agent - will discover the MTU of the Node's primary interface - type: string - disableTXChecksumOffload: - default: false - description: Disable TX checksum offloading for container - network interfaces - type: boolean - disableUdpTunnelOffload: - default: false - description: Disable UDP tunnel offload feature on default - NIC - type: boolean - dnsServerOverride: - default: "" - description: Provide the address of DNS server, to override - the kube-dns service - type: string - egress: - description: Specifies Egress related configuration. - properties: - exceptCIDRs: - items: - type: string - type: array - type: object - enableBridgingMode: - default: false - description: Enable bridging mode of Pod network on Nodes - type: boolean - enableUsageReporting: - default: false - description: Enable usage reporting (telemetry) to VMware. - type: boolean - featureGates: - description: FeatureGates is a map of feature names to flags - that enable or disable experimental features - properties: - AntreaIPAM: - default: false - description: Flag to enable/disable antrea IPAM - type: boolean - AntreaPolicy: - default: true - description: Flag to enable/disable antrea policy - type: boolean - AntreaProxy: - default: true - description: Flag to enable/disable antrea proxy - type: boolean - AntreaTraceflow: - default: true - description: Flag to enable/disable antrea traceflow - type: boolean - Egress: - default: true - description: Flag to enable/disable SNAT IPs of Pod egress - traffic - type: boolean - EndpointSlice: - default: false - description: Flag to enable/disable EndpointSlice support - in AntreaProxy. If AntreaProxy is not enabled, this - flag will not take effect - type: boolean - FlowExporter: - default: false - description: Flag to enable/disable flow exporter - type: boolean - Multicast: - default: false - description: Flag to enable/disable multicast - type: boolean - Multicluster: - default: false - description: Enable Antrea Multi-cluster Gateway to support - cross-cluster traffic. - type: boolean - NetworkPolicyStats: - default: false - description: Flag to enable/disable network policy stats - type: boolean - NodePortLocal: - default: true - description: Flag to enable/disable NodePortLocal feature - to make the pods reachable externally through NodePort - type: boolean - SecondaryNetwork: - default: false - description: Enable support for provisioning secondary - network interfaces for Pods (using Pod annotations). - type: boolean - ServiceExternalIP: - default: false - description: Flag to enable/disable service external IP - type: boolean - TrafficControl: - default: false - description: Enable mirroring or redirecting the traffic - Pods send or receive. - type: boolean - type: object - flowExporter: - description: Specifies FlowExporter related configuration. - properties: - activeFlowTimeout: - type: string - collectorAddress: - type: string - idleFlowTimeout: - type: string - pollInterval: - type: string - type: object - kubeAPIServerOverride: - description: Provide the address of Kubernetes apiserver, - to override any value provided in kubeconfig or InClusterConfig. - type: string - multicast: - description: Multicast related configuration. - properties: - igmpQueryInterval: - type: string - type: object - multicastInterfaces: - description: The names of the interfaces on Nodes that are - used to forward multicast traffic. - items: - type: string - type: array - multicluster: - description: MultiCluster realted configuration. - properties: - enable: - type: boolean - namespace: - type: string - type: object - noSNAT: - default: false - description: Flag to enable/disable SNAT for the egress traffic - from a Pod to the external network - type: boolean - nodePortLocal: - description: Specifies NodePortLocal related configuration. - properties: - enabled: - type: boolean - portRange: - type: string - type: object - serviceCIDR: - description: ClusterIP CIDR range for Services. - type: string - tlsCipherSuites: - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - description: List of allowed cipher suites. If omitted, the - default Go Cipher Suites will be used - type: string - trafficEncapMode: - default: encap - description: The traffic encapsulation mode. One of the following - options => encap, noEncap, hybrid, networkPolicyOnly - enum: - - encap - - noEncap - - hybrid - - networkPolicyOnly - type: string - trafficEncryptionMode: - description: Determines how tunnel traffic is encrypted. One - of the following options =:> none, ipsec, wireguard - type: string - transportInterface: - description: The name of the interface on Node which is used - for tunneling or routing. - type: string - transportInterfaceCIDRs: - description: The network CIDRs of the interface on Node which - is used for tunneling or routing. - items: - type: string - type: array - tunnelType: - description: Tunnel protocols used for encapsulating traffic - across Nodes. One of the following options =:> geneve, vxlan, - gre, stt - type: string - wireGuard: - description: Specifies WireGuard related configuration. - properties: - port: - type: integer - type: object - type: object - type: object - type: object - status: - description: AntreaConfigStatus defines the observed state of AntreaConfig - properties: - secretRef: - description: Reference to the data value secret created by controller - type: string - type: object - required: - - spec - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: The traffic encapsulation mode. One of the following options => - encap, noEncap, hybrid, networkPolicyOnly - jsonPath: .spec.antrea.config.trafficEncapMode - name: TrafficEncapMode - type: string - - description: Default MTU to use for the host gateway interface and the network - interface of each Pod. If omitted, antrea-agent will discover the MTU of the - Node's primary interface - jsonPath: .spec.antrea.config.defaultMTU - name: DefaultMTU - type: string - - description: Flag to enable/disable antrea proxy - jsonPath: .spec.antrea.config.featureGates.AntreaProxy - name: AntreaProxy - type: string - - description: Flag to enable/disable antrea policy - jsonPath: .spec.antrea.config.featureGates.AntreaPolicy - name: AntreaPolicy - type: string - - description: Name of the antrea data values secret - jsonPath: .status.secretRef - name: SecretRef - type: string - name: v1alpha2 - schema: - openAPIV3Schema: - description: AntreaConfig is the Schema for the antreaconfigs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AntreaConfigSpec defines the desired state of AntreaConfig - properties: - antrea: - properties: - config: - properties: - antreaProxy: - description: Specifies AntreaProxy related configuration. - properties: - nodePortAddresses: - items: - type: string - type: array - proxyAll: - type: boolean - proxyLoadBalancerIPs: - type: boolean - skipServices: - items: - type: string - type: array - type: object - defaultMTU: - default: "" - description: Default MTU to use for the host gateway interface - and the network interface of each Pod. If omitted, antrea-agent - will discover the MTU of the Node's primary interface - type: string - disableTXChecksumOffload: - default: false - description: Disable TX checksum offloading for container - network interfaces - type: boolean - disableUdpTunnelOffload: - default: false - description: Disable UDP tunnel offload feature on default - NIC - type: boolean - dnsServerOverride: - default: "" - description: Provide the address of DNS server, to override - the kube-dns service - type: string - egress: - description: Specifies Egress related configuration. - properties: - exceptCIDRs: - items: - type: string - type: array - type: object - enableBridgingMode: - default: false - description: Enable bridging mode of Pod network on Nodes - type: boolean - enableUsageReporting: - default: false - description: Enable usage reporting (telemetry) to VMware. - type: boolean - featureGates: - description: FeatureGates is a map of feature names to flags - that enable or disable experimental features - properties: - AntreaIPAM: - default: false - description: Flag to enable/disable antrea IPAM - type: boolean - AntreaPolicy: - default: true - description: Flag to enable/disable antrea policy - type: boolean - AntreaProxy: - default: true - description: Flag to enable/disable antrea proxy - type: boolean - AntreaTraceflow: - default: true - description: Flag to enable/disable antrea traceflow - type: boolean - Egress: - default: true - description: Flag to enable/disable SNAT IPs of Pod egress - traffic - type: boolean - EndpointSlice: - default: false - description: Flag to enable/disable EndpointSlice support - in AntreaProxy. If AntreaProxy is not enabled, this - flag will not take effect - type: boolean - FlowExporter: - default: false - description: Flag to enable/disable flow exporter - type: boolean - Multicast: - default: false - description: Flag to enable/disable multicast - type: boolean - Multicluster: - default: false - description: Enable Antrea Multi-cluster Gateway to support - cross-cluster traffic. - type: boolean - NetworkPolicyStats: - default: false - description: Flag to enable/disable network policy stats - type: boolean - NodePortLocal: - default: true - description: Flag to enable/disable NodePortLocal feature - to make the pods reachable externally through NodePort - type: boolean - SecondaryNetwork: - default: false - description: Enable support for provisioning secondary - network interfaces for Pods (using Pod annotations). - type: boolean - ServiceExternalIP: - default: false - description: Flag to enable/disable service external IP - type: boolean - TrafficControl: - default: false - description: Enable mirroring or redirecting the traffic - Pods send or receive. - type: boolean - type: object - flowExporter: - description: Specifies FlowExporter related configuration. - properties: - activeFlowTimeout: - type: string - collectorAddress: - type: string - idleFlowTimeout: - type: string - pollInterval: - type: string - type: object - kubeAPIServerOverride: - description: Provide the address of Kubernetes apiserver, - to override any value provided in kubeconfig or InClusterConfig. - type: string - multicast: - description: Multicast related configuration. - properties: - igmpQueryInterval: - type: string - type: object - multicastInterfaces: - description: The names of the interfaces on Nodes that are - used to forward multicast traffic. - items: - type: string - type: array - multicluster: - description: MultiCluster realted configuration. - properties: - enable: - type: boolean - namespace: - type: string - type: object - noSNAT: - default: false - description: Flag to enable/disable SNAT for the egress traffic - from a Pod to the external network - type: boolean - nodePortLocal: - description: Specifies NodePortLocal related configuration. - properties: - enabled: - type: boolean - portRange: - type: string - type: object - serviceCIDR: - description: ClusterIP CIDR range for Services. - type: string - tlsCipherSuites: - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - description: List of allowed cipher suites. If omitted, the - default Go Cipher Suites will be used - type: string - trafficEncapMode: - default: encap - description: The traffic encapsulation mode. One of the following - options => encap, noEncap, hybrid, networkPolicyOnly - enum: - - encap - - noEncap - - hybrid - - networkPolicyOnly - type: string - trafficEncryptionMode: - description: Determines how tunnel traffic is encrypted. One - of the following options =:> none, ipsec, wireguard - type: string - transportInterface: - description: The name of the interface on Node which is used - for tunneling or routing. - type: string - transportInterfaceCIDRs: - description: The network CIDRs of the interface on Node which - is used for tunneling or routing. - items: - type: string - type: array - tunnelType: - description: Tunnel protocols used for encapsulating traffic - across Nodes. One of the following options =:> geneve, vxlan, - gre, stt - type: string - wireGuard: - description: Specifies WireGuard related configuration. - properties: - port: - type: integer - type: object - type: object - type: object - antreaNsx: - description: AntreaNsx defines nsxt adapter related configurations - properties: - bootstrapFrom: - description: BootstrapFrom either providerRef or inline configs - properties: - inline: - description: Inline is used with TKGm, user need to fill in - manually - properties: - clusterName: - description: ClusterName is the name for the created cluster - type: string - nsxCertName: - description: NsxCertName is cert files to access nsx manager - type: string - nsxManagers: - description: NsxManagers is the list for nsx managers, - it can be either IP address or domain name - items: - type: string - type: array - type: object - providerRef: - description: ProviderRef is used with uTKG, which will be - filled by uTKG Addon Controller - properties: - apigroup: - description: Api version for nsxServiceAccount, its value - is "nsx.vmware.com/v1alpha1" now - type: string - kind: - description: Kind is the kind for crd, here its value - is NsxServiceAccount - type: string - name: - description: Name is the name for NsxServiceAccount - type: string - type: object - type: object - config: - description: Config is configuration for nsxt adapter - properties: - infraType: - description: InfraType is the type for infrastructure, so - far it is vSphere, VMC, AWS, Azure - type: string - type: object - enable: - default: false - description: Enable indicates whether nsxt adapter shall be enabled - in the cluster - type: boolean - type: object - type: object - status: - description: AntreaConfigStatus defines the observed state of AntreaConfig - properties: - message: - description: Message to indicate failure reason - type: string - secretRef: - description: Reference to the data value secret created by controller - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/addonconfigs/config/crd/bases/cni.tanzu.vmware.com_calicoconfigs.yaml b/apis/addonconfigs/config/crd/bases/cni.tanzu.vmware.com_calicoconfigs.yaml deleted file mode 100644 index 57d7c1704b..0000000000 --- a/apis/addonconfigs/config/crd/bases/cni.tanzu.vmware.com_calicoconfigs.yaml +++ /dev/null @@ -1,88 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: calicoconfigs.cni.tanzu.vmware.com -spec: - group: cni.tanzu.vmware.com - names: - kind: CalicoConfig - listKind: CalicoConfigList - plural: calicoconfigs - shortNames: - - calicoconf - singular: calicoconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Maximum transmission unit setting. '0' as default means MTU will - be auto detected - jsonPath: .spec.calico.config.vethMTU - name: VethMTU - type: integer - - description: Name of the Calico data values secret - jsonPath: .status.secretRef - name: SecretRef - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: CalicoConfig is the Schema for the calicoconfigs API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: CalicoConfigSpec defines the desired state of CalicoConfig. - properties: - calico: - description: Calico stores the configurations for Calico. - properties: - config: - description: CalicoConfigDataValue contains the specific configurations - for the Calico package. - properties: - skipCNIBinaries: - default: false - description: SkipCNIBinaries allows to skip the cni plugin - binaries installation. Default to false. Set to true for - providers who already installed cni plugin binaries in their - OVAs and do not want Calico to overwrite them. - type: boolean - vethMTU: - default: 0 - description: VethMTU defines maximum transmission unit. "0" - as default means MTU will be auto detected. - format: int64 - minimum: 0 - type: integer - type: object - type: object - type: object - status: - description: CalicoConfigStatus defines the observed state of CalicoConfig. - properties: - secretRef: - description: SecretRef is the name of the data value secret created - by calico controller. - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/addonconfigs/config/crd/bases/cpi.tanzu.vmware.com_kubevipcpiconfigs.yaml b/apis/addonconfigs/config/crd/bases/cpi.tanzu.vmware.com_kubevipcpiconfigs.yaml deleted file mode 100644 index 6b0ee49d04..0000000000 --- a/apis/addonconfigs/config/crd/bases/cpi.tanzu.vmware.com_kubevipcpiconfigs.yaml +++ /dev/null @@ -1,67 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.8.0 - creationTimestamp: null - name: kubevipcpiconfigs.cpi.tanzu.vmware.com -spec: - group: cpi.tanzu.vmware.com - names: - kind: KubevipCPIConfig - listKind: KubevipCPIConfigList - plural: kubevipcpiconfigs - singular: kubevipcpiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: KubevipCPIConfig is the Schema for the kubevipcpiconfigs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubevipCPIConfigSpec defines the desired state of KubevipCPIConfig - properties: - loadbalancerCIDRs: - description: loadbalancerCIDRs is a list of comma separated - cidrs will be used to allocate IP for external load balancer. For - example 192.168.0.200/29,192.168.1.200/29 - type: string - loadbalancerIPRanges: - description: loadbalancerIPRanges is a list of comma separated IP - ranges will be used to allocate IP for external load balancer. For - example 192.168.0.10-192.168.0.11,192.168.0.10-192.168.0.13 - type: string - type: object - status: - description: KubevipCPIConfigStatus defines the observed state of KubevipCPIConfig - properties: - secretRef: - description: Name of the secret created by kubevip cloudprovider config - controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/apis/addonconfigs/config/crd/bases/cpi.tanzu.vmware.com_oraclecpiconfigs.yaml b/apis/addonconfigs/config/crd/bases/cpi.tanzu.vmware.com_oraclecpiconfigs.yaml deleted file mode 100644 index 47166a51a0..0000000000 --- a/apis/addonconfigs/config/crd/bases/cpi.tanzu.vmware.com_oraclecpiconfigs.yaml +++ /dev/null @@ -1,148 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.8.0 - creationTimestamp: null - name: oraclecpiconfigs.cpi.tanzu.vmware.com -spec: - group: cpi.tanzu.vmware.com - names: - kind: OracleCPIConfig - listKind: OracleCPIConfigList - plural: oraclecpiconfigs - shortNames: - - ocicpicfgs - singular: oraclecpiconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The name of the oraclecpiconfigs - jsonPath: .spec.namespace - name: Name - type: string - - description: Name of the kapp-controller data values secret - jsonPath: .status.secretRef - name: Secret - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: OracleCPIConfig is the Schema for the OracleCPIConfig API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OracleCPIConfigSpec defines the desired state of OracleCPIConfig - properties: - compartment: - description: Compartment configures the Oracle Cloud compartment within - which the cluster resides. - type: string - loadBalancer: - description: LoadBalancer configures the load balancer provisioning - for the Oracle CPI - properties: - securityListManagementMode: - default: All - description: 'SecurityListManagementMode configures how security - lists are managed by the CCM. If you choose to have security - lists managed by the CCM, ensure you have setup the following - additional OCI policy: Allow dynamic-group [your dynamic group - name] to manage security-lists in compartment [your compartment - name] "All" (default): Manage all required security list rules - for load balancer services. "Frontend": Manage only security - list rules for ingress to the load balancer. Requires that the - user has setup a rule that allows inbound traffic to the appropriate - ports for kube proxy health port, node port ranges, and health - check port ranges. E.g. 10.82.0.0/16 30000-32000. "None": Disables - all security list management. Requires that the user has setup - a rule that allows inbound traffic to the appropriate ports - for kube proxy health port, node port ranges, and health check - port ranges. E.g. 10.82.0.0/16 30000-32000. Additionally requires - the user to mange rules to allow inbound traffic to load balancers.' - enum: - - All - - Frontend - - None - type: string - securityListSubnetMapping: - description: SecurityListSubnetMapping controls an optional specification - of security lists to modify per subnet. This does not apply - if security list management is off. - items: - properties: - securityList: - description: SecurityList specifies the security list to - modify for the subnet. - pattern: ^ocid1\.securitylist\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - type: string - subnet: - description: Subnet specifies the subnet to which to modify - a security list for. - pattern: ^ocid1\.subnet\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - type: string - required: - - securityList - - subnet - type: object - type: array - subnet1: - pattern: ^ocid1\.subnet\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - type: string - subnet2: - pattern: ^ocid1\.subnet\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - type: string - required: - - securityListManagementMode - type: object - proxy: - description: Proxy configures the proxy settings for the Oracle CPI - properties: - http_proxy: - description: HTTP proxy setting - type: string - https_proxy: - description: HTTPS proxy setting - type: string - no_proxy: - description: No-proxy setting - type: string - type: object - vcn: - description: VCN configures the Virtual Cloud Network (VCN) within - which the cluster resides. - type: string - required: - - compartment - - vcn - type: object - status: - description: OracleCPIConfigStatus defines the observed state of OracleCPIConfig - properties: - secretRef: - description: Name of the data value secret created by Oracle CPI controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/apis/addonconfigs/config/crd/bases/cpi.tanzu.vmware.com_vspherecpiconfigs.yaml b/apis/addonconfigs/config/crd/bases/cpi.tanzu.vmware.com_vspherecpiconfigs.yaml deleted file mode 100644 index 1018d13457..0000000000 --- a/apis/addonconfigs/config/crd/bases/cpi.tanzu.vmware.com_vspherecpiconfigs.yaml +++ /dev/null @@ -1,223 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: vspherecpiconfigs.cpi.tanzu.vmware.com -spec: - group: cpi.tanzu.vmware.com - names: - kind: VSphereCPIConfig - listKind: VSphereCPIConfigList - plural: vspherecpiconfigs - shortNames: - - vcpic - singular: vspherecpiconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The name of the VSphereCPIConfig - jsonPath: .spec.namespace - name: Name - type: string - - description: Name of the kapp-controller data values secret - jsonPath: .spec.vsphereCPI.mode - name: Mode - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: VSphereCPIConfig is the Schema for the VSphereCPIConfig API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereCPIConfigSpec defines the desired state of VSphereCPIConfig - properties: - vsphereCPI: - properties: - antreaNSXPodRoutingEnabled: - default: false - description: A flag that enables pod routing by Antrea NSX for - paravirtual mode - type: boolean - datacenter: - description: The datacenter in which VMs are created/located - type: string - insecure: - description: The flag that disables TLS peer verification - type: boolean - ipFamily: - description: The IP family configuration - enum: - - ipv4 - - ipv6 - - ipv4,ipv6 - - ipv6,ipv4 - type: string - mode: - description: The vSphere mode. Either `vsphereCPI` or `vsphereParavirtualCPI`. - enum: - - vsphereCPI - - vsphereParavirtualCPI - type: string - nsxt: - properties: - apiHost: - description: The NSX-T server - type: string - clientCertData: - description: Client certificate data for NSX-T - type: string - clientCertKeyData: - description: Client certificate key for NSX-T - type: string - credentialLocalObjRef: - description: A secret reference that contains Nsx-T login - credential to access NSX-T consists of the field username - and password - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - insecure: - description: Insecure is to be set to true if NSX-T uses self-signed - cert - type: boolean - podRoutingEnabled: - default: false - description: A flag that enables pod routing - type: boolean - remoteAuth: - description: RemoteAuth is to be set to true if NSX-T uses - remote authentication (authentication done through the vIDM) - type: boolean - rootCAData: - description: The certificate authority for the server certificate - for locally signed certificates - type: string - route: - description: Route configuration for NSXT - properties: - routerPath: - description: NSX-T T0/T1 logical router path - type: string - type: object - vmcAccessToken: - description: VMCAccessToken is VMC access token for token - based authentication - type: string - vmcAuthHost: - description: VMCAuthHost is VMC verification host for token - based authentication - type: string - type: object - proxy: - properties: - http_proxy: - description: HTTP proxy setting - type: string - https_proxy: - description: HTTPS proxy setting - type: string - no_proxy: - description: No-proxy setting - type: string - type: object - region: - description: The region used by vSphere multi-AZ feature - type: string - tlsCipherSuites: - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - description: External arguments for cloud provider - type: string - tlsThumbprint: - description: The cryptographic thumbprint of the vSphere endpoint's - certificate. Default value is "". - type: string - vCenterAPIEndpoint: - description: The IP address or FQDN of the vSphere endpoint - type: string - vSphereCredentialLocalObjRef: - description: A secret reference that contains vSphere login credentials - to access a vSphere endpoint consists of the fields username - and password - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - vmNetwork: - properties: - excludeExternalSubnetCidr: - description: External VM network CIDR to be excluded - type: string - excludeInternalSubnetCidr: - description: Internal VM network CIDR to be excluded - type: string - external: - description: External VM network name - type: string - internal: - description: Internal VM network name - type: string - type: object - zone: - description: The zone used by vSphere multi-AZ feature - type: string - type: object - required: - - vsphereCPI - type: object - status: - description: VSphereCPIConfigStatus defines the observed state of VSphereCPIConfig - properties: - secretRef: - description: Name of the data value secret created by vSphere CPI - controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_awsebscsiconfigs.yaml b/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_awsebscsiconfigs.yaml deleted file mode 100644 index 7278a815a3..0000000000 --- a/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_awsebscsiconfigs.yaml +++ /dev/null @@ -1,70 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: awsebscsiconfigs.csi.tanzu.vmware.com -spec: - group: csi.tanzu.vmware.com - names: - kind: AwsEbsCSIConfig - listKind: AwsEbsCSIConfigList - plural: awsebscsiconfigs - singular: awsebscsiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AwsEbsCSIConfig is the Schema for the awsebscsiconfigs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AwsEbsCSIConfigSpec defines the desired state of AwsEbsCSIConfig - properties: - awsEBSCSIDriver: - description: AwsEbsCSI is the Schema for the awsebscsiconfigs API - properties: - deploymentReplicas: - format: int32 - type: integer - httpProxy: - type: string - httpsProxy: - type: string - namespace: - description: The namespace csi components are to be deployed in - type: string - noProxy: - type: string - required: - - namespace - type: object - required: - - awsEBSCSIDriver - type: object - status: - description: AwsEbsCSIConfigStatus defines the observed state of AwsEbsCSIConfig - properties: - secretRef: - description: Name of the secret created by csi controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_azurediskcsiconfigs.yaml b/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_azurediskcsiconfigs.yaml deleted file mode 100644 index fba84ee915..0000000000 --- a/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_azurediskcsiconfigs.yaml +++ /dev/null @@ -1,69 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: azurediskcsiconfigs.csi.tanzu.vmware.com -spec: - group: csi.tanzu.vmware.com - names: - kind: AzureDiskCSIConfig - listKind: AzureDiskCSIConfigList - plural: azurediskcsiconfigs - singular: azurediskcsiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AzureDiskCSIConfig is the Schema for the azurediskcsiconfigs - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureDiskCSIConfigSpec defines the desired state of AzureDiskCSIConfig - properties: - azureDiskCSIDriver: - description: AzureDiskCSI is the Schema for the awsebscsiconfigs API - properties: - deploymentReplicas: - format: int32 - type: integer - httpProxy: - type: string - httpsProxy: - type: string - namespace: - description: The namespace csi components are to be deployed in - type: string - noProxy: - type: string - type: object - required: - - azureDiskCSIDriver - type: object - status: - description: AzureDiskCSIConfigStatus defines the observed state of AzureDiskCSIConfig - properties: - secretRef: - description: Name of the secret created by csi controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_azurefilecsiconfigs.yaml b/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_azurefilecsiconfigs.yaml deleted file mode 100644 index c944b00f68..0000000000 --- a/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_azurefilecsiconfigs.yaml +++ /dev/null @@ -1,70 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: azurefilecsiconfigs.csi.tanzu.vmware.com -spec: - group: csi.tanzu.vmware.com - names: - kind: AzureFileCSIConfig - listKind: AzureFileCSIConfigList - plural: azurefilecsiconfigs - singular: azurefilecsiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AzureFileCSIConfig is the Schema for the azurefilecsiconfigs - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureFileCSIConfigSpec defines the desired state of AzureFileCSIConfig - properties: - azureFileCSIDriver: - description: AzureFileCSI is the Schema for the AzureFileCSIConfig - properties: - deploymentReplicas: - format: int32 - type: integer - httpProxy: - type: string - httpsProxy: - type: string - namespace: - description: The namespace csi components are to be deployed in - type: string - noProxy: - type: string - required: - - namespace - type: object - required: - - azureFileCSIDriver - type: object - status: - description: AzureFileCSIConfigStatus defines the observed state of AzureFileCSIConfig - properties: - secretRef: - description: Name of the secret created by csi controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_vspherecsiconfigs.yaml b/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_vspherecsiconfigs.yaml deleted file mode 100644 index 9792e20aaf..0000000000 --- a/apis/addonconfigs/config/crd/bases/csi.tanzu.vmware.com_vspherecsiconfigs.yaml +++ /dev/null @@ -1,149 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: vspherecsiconfigs.csi.tanzu.vmware.com -spec: - group: csi.tanzu.vmware.com - names: - kind: VSphereCSIConfig - listKind: VSphereCSIConfigList - plural: vspherecsiconfigs - singular: vspherecsiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: VSphereCSIConfig is the Schema for the vspherecsiconfigs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereCSIConfigSpec defines the desired state of VSphereCSIConfig - properties: - vsphereCSI: - properties: - config: - properties: - attachTimeout: - type: string - clusterName: - type: string - datacenter: - type: string - deploymentReplicas: - format: int32 - type: integer - httpProxy: - type: string - httpsProxy: - type: string - insecureFlag: - type: boolean - namespace: - description: The namespace csi components are to be deployed - in - type: string - netPermissions: - additionalProperties: - description: NetPermissionConfig consists of information - used to restrict the network permissions set on file share - volumes - properties: - ips: - description: 'Client IP address, IP range or IP subnet. - Example: "10.20.30.0/24"; defaults to "*" if not specified' - type: string - permissions: - description: Is it READ_ONLY, READ_WRITE or NO_ACCESS. - Defaults to "READ_WRITE" if not specified - type: string - rootsquash: - description: Disallow root access for this IP range. - Defaults to "false" if not specified - type: boolean - type: object - type: object - noProxy: - type: string - provisionTimeout: - type: string - publicNetwork: - type: string - region: - type: string - resizerTimeout: - type: string - server: - type: string - tlsThumbprint: - type: string - useTopologyCategories: - type: boolean - vSphereCredentialLocalObjRef: - description: A secret reference that contains vSphere login - credentials to access a vSphere endpoint consists of the - fields username and password - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - vSphereVersion: - type: string - windowsSupport: - type: boolean - zone: - type: string - type: object - mode: - description: The vSphere mode. Either `vsphereCSI` or `vsphereParavirtualCSI`. - enum: - - vsphereCSI - - vsphereParavirtualCSI - type: string - required: - - mode - type: object - required: - - vsphereCSI - type: object - status: - description: VSphereCSIConfigStatus defines the observed state of VSphereCSIConfig - properties: - secretRef: - description: Name of the secret created by csi controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/addonconfigs/cpi/v1alpha1/common_types.go b/apis/addonconfigs/cpi/v1alpha1/common_types.go deleted file mode 100644 index 7f34829cfd..0000000000 --- a/apis/addonconfigs/cpi/v1alpha1/common_types.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -type Proxy struct { - // HTTP proxy setting - // +kubebuilder:validation:Optional - HTTPProxy *string `json:"http_proxy,omitempty"` - - // HTTPS proxy setting - // +kubebuilder:validation:Optional - HTTPSProxy *string `json:"https_proxy,omitempty"` - - // No-proxy setting - // +kubebuilder:validation:Optional - NoProxy *string `json:"no_proxy,omitempty"` -} diff --git a/apis/addonconfigs/cpi/v1alpha1/groupversion_info.go b/apis/addonconfigs/cpi/v1alpha1/groupversion_info.go deleted file mode 100644 index 768622d35b..0000000000 --- a/apis/addonconfigs/cpi/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 contains API Schema definitions for the cpi v1alpha1 API group -// +kubebuilder:object:generate=true -// +groupName=cpi.tanzu.vmware.com -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "cpi.tanzu.vmware.com", Version: "v1alpha1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/apis/addonconfigs/cpi/v1alpha1/kubevipcpiconfig_types.go b/apis/addonconfigs/cpi/v1alpha1/kubevipcpiconfig_types.go deleted file mode 100644 index b54536c7de..0000000000 --- a/apis/addonconfigs/cpi/v1alpha1/kubevipcpiconfig_types.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright YEAR VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. - -// KubevipCPIConfigSpec defines the desired state of KubevipCPIConfig -type KubevipCPIConfigSpec struct { - // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster - // Important: Run "make" to regenerate code after modifying this file - - // loadbalancerCIDRs is a list of comma separated cidrs will - // be used to allocate IP for external load balancer. - // For example 192.168.0.200/29,192.168.1.200/29 - //+ kubebuilder:validation:Optional - LoadbalancerCIDRs *string `json:"loadbalancerCIDRs,omitempty"` - - // loadbalancerIPRanges is a list of comma separated IP ranges will - // be used to allocate IP for external load balancer. - // For example 192.168.0.10-192.168.0.11,192.168.0.10-192.168.0.13 - //+ kubebuilder:validation:Optional - LoadbalancerIPRanges *string `json:"loadbalancerIPRanges,omitempty"` -} - -// KubevipCPIConfigStatus defines the observed state of KubevipCPIConfig -type KubevipCPIConfigStatus struct { - // Name of the secret created by kubevip cloudprovider config controller - //+ kubebuilder:validation:Optional - SecretRef *string `json:"secretRef,omitempty"` -} - -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status - -// KubevipCPIConfig is the Schema for the kubevipcpiconfigs API -type KubevipCPIConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec KubevipCPIConfigSpec `json:"spec,omitempty"` - Status KubevipCPIConfigStatus `json:"status,omitempty"` -} - -//+kubebuilder:object:root=true - -// KubevipCPIConfigList contains a list of KubevipCPIConfig -type KubevipCPIConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []KubevipCPIConfig `json:"items"` -} - -func init() { - SchemeBuilder.Register(&KubevipCPIConfig{}, &KubevipCPIConfigList{}) -} diff --git a/apis/addonconfigs/cpi/v1alpha1/oraclecpiconfig_types.go b/apis/addonconfigs/cpi/v1alpha1/oraclecpiconfig_types.go deleted file mode 100644 index 812ea4855f..0000000000 --- a/apis/addonconfigs/cpi/v1alpha1/oraclecpiconfig_types.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// OracleCPIConfigSpec defines the desired state of OracleCPIConfig -type OracleCPIConfigSpec struct { - // Compartment configures the Oracle Cloud compartment within which the cluster resides. - Compartment string `json:"compartment"` - - // VCN configures the Virtual Cloud Network (VCN) within which the cluster resides. - VCN string `json:"vcn"` - - // LoadBalancer configures the load balancer provisioning for the Oracle CPI - // +kubebuilder:validation:Optional - LoadBalancer OracleLoadBalancer `json:"loadBalancer,omitempty"` - - // Proxy configures the proxy settings for the Oracle CPI - // +kubebuilder:validation:Optional - Proxy Proxy `json:"proxy,omitempty"` -} - -type OracleLoadBalancer struct { - // +kubebuilder:validation:Pattern:=^ocid1\.subnet\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - Subnet1 string `json:"subnet1,omitempty"` - // +kubebuilder:validation:Pattern:=^ocid1\.subnet\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - Subnet2 string `json:"subnet2,omitempty"` - - // SecurityListManagementMode configures how security lists are managed by the CCM. - // If you choose to have security lists managed by the CCM, ensure you have setup the following additional OCI policy: - // Allow dynamic-group [your dynamic group name] to manage security-lists in compartment [your compartment name] - // "All" (default): Manage all required security list rules for load balancer services. - // "Frontend": Manage only security list rules for ingress to the load balancer. - // Requires that the user has setup a rule that allows inbound traffic to the appropriate ports for kube proxy health - // port, node port ranges, and health check port ranges. E.g. 10.82.0.0/16 30000-32000. - // "None": Disables all security list management. Requires that the user has setup a rule that allows inbound traffic to - // the appropriate ports for kube proxy health port, node port ranges, and health check port ranges. - // E.g. 10.82.0.0/16 30000-32000. - // Additionally requires the user to mange rules to allow inbound traffic to load balancers. - // - // +kubebuilder:validation:Enum=All;Frontend;None - // +kubebuilder:default:=All - SecurityListManagementMode string `json:"securityListManagementMode"` - - // SecurityListSubnetMapping controls an optional specification of security lists to modify per subnet. - // This does not apply if security list management is off. - // - // +kubebuilder:validation:Optional - SecurityListSubnetMapping []SecurityListSubnetMapping `json:"securityListSubnetMapping,omitempty"` -} - -type SecurityListSubnetMapping struct { - // Subnet specifies the subnet to which to modify a security list for. - // - // +kubebuilder:validation:Required - // +kubebuilder:validation:Pattern:=^ocid1\.subnet\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - Subnet string `json:"subnet"` - - // SecurityList specifies the security list to modify for the subnet. - // +kubebuilder:validation:Required - // +kubebuilder:validation:Pattern:=^ocid1\.securitylist\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - SecurityList string `json:"securityList"` -} - -// OracleCPIConfigStatus defines the observed state of OracleCPIConfig -type OracleCPIConfigStatus struct { - // Name of the data value secret created by Oracle CPI controller - //+ kubebuilder:validation:Optional - SecretRef string `json:"secretRef,omitempty"` -} - -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status -//+kubebuilder:resource:path=oraclecpiconfigs,shortName=ocicpicfgs,scope=Namespaced -//+kubebuilder:printcolumn:name="Name",type="string",JSONPath=".spec.namespace",description="The name of the oraclecpiconfigs" -//+kubebuilder:printcolumn:name="Secret",type="string",JSONPath=".status.secretRef",description="Name of the kapp-controller data values secret" - -// OracleCPIConfig is the Schema for the OracleCPIConfig API -type OracleCPIConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec OracleCPIConfigSpec `json:"spec,omitempty"` - Status OracleCPIConfigStatus `json:"status,omitempty"` -} - -//+kubebuilder:object:root=true - -// OracleCPIConfigList contains a list of OracleCPIConfig -type OracleCPIConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []OracleCPIConfig `json:"items"` -} - -func init() { - SchemeBuilder.Register(&OracleCPIConfig{}, &OracleCPIConfigList{}) -} diff --git a/apis/addonconfigs/cpi/v1alpha1/vspherecpiconfig_types.go b/apis/addonconfigs/cpi/v1alpha1/vspherecpiconfig_types.go deleted file mode 100644 index 326d0be2d2..0000000000 --- a/apis/addonconfigs/cpi/v1alpha1/vspherecpiconfig_types.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// VSphereCPIConfigSpec defines the desired state of VSphereCPIConfig -type VSphereCPIConfigSpec struct { - VSphereCPI VSphereCPI `json:"vsphereCPI"` -} - -type NSXTRouteConfig struct { - // NSX-T T0/T1 logical router path - // +kubebuilder:validation:Optional - RouterPath *string `json:"routerPath,omitempty"` -} - -type VMNetwork struct { - // Internal VM network name - // +kubebuilder:validation:Optional - Internal *string `json:"internal,omitempty"` - - // External VM network name - // +kubebuilder:validation:Optional - External *string `json:"external,omitempty"` - - // Internal VM network CIDR to be excluded - // +kubebuilder:validation:Optional - ExcludeInternalSubnetCidr *string `json:"excludeInternalSubnetCidr,omitempty"` - - // External VM network CIDR to be excluded - // +kubebuilder:validation:Optional - ExcludeExternalSubnetCidr *string `json:"excludeExternalSubnetCidr,omitempty"` -} - -type NSXT struct { - // A flag that enables pod routing - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - PodRoutingEnabled *bool `json:"podRoutingEnabled,omitempty"` - - // Route configuration for NSXT - // +kubebuilder:validation:Optional - Route *NSXTRouteConfig `json:"route,omitempty"` - - // A secret reference that contains Nsx-T login credential to access NSX-T - // consists of the field username and password - // +kubebuilder:validation:Optional - CredentialLocalObjRef *v1.TypedLocalObjectReference `json:"credentialLocalObjRef,omitempty"` - - // The NSX-T server - // +kubebuilder:validation:Optional - APIHost *string `json:"apiHost,omitempty"` - - // Insecure is to be set to true if NSX-T uses self-signed cert - // +kubebuilder:validation:Optional - Insecure *bool `json:"insecure,omitempty"` - - // RemoteAuth is to be set to true if NSX-T uses remote authentication (authentication done through the vIDM) - // +kubebuilder:validation:Optional - RemoteAuth *bool `json:"remoteAuth,omitempty"` - - // VMCAccessToken is VMC access token for token based authentication - // +kubebuilder:validation:Optional - VMCAccessToken *string `json:"vmcAccessToken,omitempty"` - - // VMCAuthHost is VMC verification host for token based authentication - // +kubebuilder:validation:Optional - VMCAuthHost *string `json:"vmcAuthHost,omitempty"` - - // Client certificate key for NSX-T - // +kubebuilder:validation:Optional - ClientCertKeyData *string `json:"clientCertKeyData,omitempty"` - - // Client certificate data for NSX-T - // +kubebuilder:validation:Optional - ClientCertData *string `json:"clientCertData,omitempty"` - - // The certificate authority for the server certificate for locally signed certificates - // +kubebuilder:validation:Optional - RootCAData *string `json:"rootCAData,omitempty"` -} - -type NonParavirtualConfig struct { - - // The IP address or FQDN of the vSphere endpoint - // +kubebuilder:validation:Optional - VCenterAPIEndpoint *string `json:"vCenterAPIEndpoint,omitempty"` - - // The datacenter in which VMs are created/located - // +kubebuilder:validation:Optional - Datacenter *string `json:"datacenter,omitempty"` - - // A secret reference that contains vSphere login credentials to access a vSphere endpoint - // consists of the fields username and password - // +kubebuilder:validation:Optional - VSphereCredentialLocalObjRef *v1.TypedLocalObjectReference `json:"vSphereCredentialLocalObjRef,omitempty"` - - // The cryptographic thumbprint of the vSphere endpoint's certificate. Default value is "". - // +kubebuilder:validation:Optional - TLSThumbprint *string `json:"tlsThumbprint,omitempty"` - - // The region used by vSphere multi-AZ feature - // +kubebuilder:validation:Optional - Region *string `json:"region,omitempty"` - - // The zone used by vSphere multi-AZ feature - // +kubebuilder:validation:Optional - Zone *string `json:"zone,omitempty"` - - // The flag that disables TLS peer verification - // +kubebuilder:validation:Optional - Insecure *bool `json:"insecure,omitempty"` - - // The IP family configuration - // +kubebuilder:validation:Optional - // +kubebuilder:validation:Enum="ipv4";"ipv6";"ipv4,ipv6";"ipv6,ipv4" - IPFamily *string `json:"ipFamily,omitempty"` - - // +kubebuilder:validation:Optional - VMNetwork *VMNetwork `json:"vmNetwork,omitempty"` - - // External arguments for cloud provider - // +kubebuilder:validation:Optional - // +kubebuilder:default:="TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" - TLSCipherSuites *string `json:"tlsCipherSuites,omitempty"` - - // +kubebuilder:validation:Optional - NSXT *NSXT `json:"nsxt,omitempty"` - - // +kubebuilder:validation:Optional - Proxy *Proxy `json:"proxy,omitempty"` -} - -type ParavirtualConfig struct { - // A flag that enables pod routing by Antrea NSX for paravirtual mode - // +kubebuilder:validation:Optional - // +kubebuilder:default:=false - AntreaNSXPodRoutingEnabled *bool `json:"antreaNSXPodRoutingEnabled,omitempty"` -} - -type VSphereCPI struct { - // The vSphere mode. Either `vsphereCPI` or `vsphereParavirtualCPI`. - // +kubebuilder:validation:Optional - // +kubebuilder:validation:Enum=vsphereCPI;vsphereParavirtualCPI - Mode *string `json:"mode,omitempty"` - - *NonParavirtualConfig `json:",omitempty"` - - *ParavirtualConfig `json:",omitempty"` -} - -// VSphereCPIConfigStatus defines the observed state of VSphereCPIConfig -type VSphereCPIConfigStatus struct { - // Name of the data value secret created by vSphere CPI controller - //+ kubebuilder:validation:Optional - SecretRef string `json:"secretRef,omitempty"` -} - -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status -//+kubebuilder:resource:path=vspherecpiconfigs,shortName=vcpic,scope=Namespaced -//+kubebuilder:printcolumn:name="Name",type="string",JSONPath=".spec.namespace",description="The name of the VSphereCPIConfig" -//+kubebuilder:printcolumn:name="Mode",type="string",JSONPath=".spec.vsphereCPI.mode",description="Name of the kapp-controller data values secret" - -// VSphereCPIConfig is the Schema for the VSphereCPIConfig API -type VSphereCPIConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec VSphereCPIConfigSpec `json:"spec,omitempty"` - Status VSphereCPIConfigStatus `json:"status,omitempty"` -} - -//+kubebuilder:object:root=true - -// VSphereCPIConfigList contains a list of VSphereCPIConfig -type VSphereCPIConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []VSphereCPIConfig `json:"items"` -} - -func init() { - SchemeBuilder.Register(&VSphereCPIConfig{}, &VSphereCPIConfigList{}) -} diff --git a/apis/addonconfigs/cpi/v1alpha1/zz_generated.deepcopy.go b/apis/addonconfigs/cpi/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 34b3b7bb71..0000000000 --- a/apis/addonconfigs/cpi/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,614 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - v1 "k8s.io/api/core/v1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubevipCPIConfig) DeepCopyInto(out *KubevipCPIConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevipCPIConfig. -func (in *KubevipCPIConfig) DeepCopy() *KubevipCPIConfig { - if in == nil { - return nil - } - out := new(KubevipCPIConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *KubevipCPIConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubevipCPIConfigList) DeepCopyInto(out *KubevipCPIConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]KubevipCPIConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevipCPIConfigList. -func (in *KubevipCPIConfigList) DeepCopy() *KubevipCPIConfigList { - if in == nil { - return nil - } - out := new(KubevipCPIConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *KubevipCPIConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubevipCPIConfigSpec) DeepCopyInto(out *KubevipCPIConfigSpec) { - *out = *in - if in.LoadbalancerCIDRs != nil { - in, out := &in.LoadbalancerCIDRs, &out.LoadbalancerCIDRs - *out = new(string) - **out = **in - } - if in.LoadbalancerIPRanges != nil { - in, out := &in.LoadbalancerIPRanges, &out.LoadbalancerIPRanges - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevipCPIConfigSpec. -func (in *KubevipCPIConfigSpec) DeepCopy() *KubevipCPIConfigSpec { - if in == nil { - return nil - } - out := new(KubevipCPIConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubevipCPIConfigStatus) DeepCopyInto(out *KubevipCPIConfigStatus) { - *out = *in - if in.SecretRef != nil { - in, out := &in.SecretRef, &out.SecretRef - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubevipCPIConfigStatus. -func (in *KubevipCPIConfigStatus) DeepCopy() *KubevipCPIConfigStatus { - if in == nil { - return nil - } - out := new(KubevipCPIConfigStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NSXT) DeepCopyInto(out *NSXT) { - *out = *in - if in.PodRoutingEnabled != nil { - in, out := &in.PodRoutingEnabled, &out.PodRoutingEnabled - *out = new(bool) - **out = **in - } - if in.Route != nil { - in, out := &in.Route, &out.Route - *out = new(NSXTRouteConfig) - (*in).DeepCopyInto(*out) - } - if in.CredentialLocalObjRef != nil { - in, out := &in.CredentialLocalObjRef, &out.CredentialLocalObjRef - *out = new(v1.TypedLocalObjectReference) - (*in).DeepCopyInto(*out) - } - if in.APIHost != nil { - in, out := &in.APIHost, &out.APIHost - *out = new(string) - **out = **in - } - if in.Insecure != nil { - in, out := &in.Insecure, &out.Insecure - *out = new(bool) - **out = **in - } - if in.RemoteAuth != nil { - in, out := &in.RemoteAuth, &out.RemoteAuth - *out = new(bool) - **out = **in - } - if in.VMCAccessToken != nil { - in, out := &in.VMCAccessToken, &out.VMCAccessToken - *out = new(string) - **out = **in - } - if in.VMCAuthHost != nil { - in, out := &in.VMCAuthHost, &out.VMCAuthHost - *out = new(string) - **out = **in - } - if in.ClientCertKeyData != nil { - in, out := &in.ClientCertKeyData, &out.ClientCertKeyData - *out = new(string) - **out = **in - } - if in.ClientCertData != nil { - in, out := &in.ClientCertData, &out.ClientCertData - *out = new(string) - **out = **in - } - if in.RootCAData != nil { - in, out := &in.RootCAData, &out.RootCAData - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NSXT. -func (in *NSXT) DeepCopy() *NSXT { - if in == nil { - return nil - } - out := new(NSXT) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NSXTRouteConfig) DeepCopyInto(out *NSXTRouteConfig) { - *out = *in - if in.RouterPath != nil { - in, out := &in.RouterPath, &out.RouterPath - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NSXTRouteConfig. -func (in *NSXTRouteConfig) DeepCopy() *NSXTRouteConfig { - if in == nil { - return nil - } - out := new(NSXTRouteConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NonParavirtualConfig) DeepCopyInto(out *NonParavirtualConfig) { - *out = *in - if in.VCenterAPIEndpoint != nil { - in, out := &in.VCenterAPIEndpoint, &out.VCenterAPIEndpoint - *out = new(string) - **out = **in - } - if in.Datacenter != nil { - in, out := &in.Datacenter, &out.Datacenter - *out = new(string) - **out = **in - } - if in.VSphereCredentialLocalObjRef != nil { - in, out := &in.VSphereCredentialLocalObjRef, &out.VSphereCredentialLocalObjRef - *out = new(v1.TypedLocalObjectReference) - (*in).DeepCopyInto(*out) - } - if in.TLSThumbprint != nil { - in, out := &in.TLSThumbprint, &out.TLSThumbprint - *out = new(string) - **out = **in - } - if in.Region != nil { - in, out := &in.Region, &out.Region - *out = new(string) - **out = **in - } - if in.Zone != nil { - in, out := &in.Zone, &out.Zone - *out = new(string) - **out = **in - } - if in.Insecure != nil { - in, out := &in.Insecure, &out.Insecure - *out = new(bool) - **out = **in - } - if in.IPFamily != nil { - in, out := &in.IPFamily, &out.IPFamily - *out = new(string) - **out = **in - } - if in.VMNetwork != nil { - in, out := &in.VMNetwork, &out.VMNetwork - *out = new(VMNetwork) - (*in).DeepCopyInto(*out) - } - if in.TLSCipherSuites != nil { - in, out := &in.TLSCipherSuites, &out.TLSCipherSuites - *out = new(string) - **out = **in - } - if in.NSXT != nil { - in, out := &in.NSXT, &out.NSXT - *out = new(NSXT) - (*in).DeepCopyInto(*out) - } - if in.Proxy != nil { - in, out := &in.Proxy, &out.Proxy - *out = new(Proxy) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NonParavirtualConfig. -func (in *NonParavirtualConfig) DeepCopy() *NonParavirtualConfig { - if in == nil { - return nil - } - out := new(NonParavirtualConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OracleCPIConfig) DeepCopyInto(out *OracleCPIConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OracleCPIConfig. -func (in *OracleCPIConfig) DeepCopy() *OracleCPIConfig { - if in == nil { - return nil - } - out := new(OracleCPIConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OracleCPIConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OracleCPIConfigList) DeepCopyInto(out *OracleCPIConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]OracleCPIConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OracleCPIConfigList. -func (in *OracleCPIConfigList) DeepCopy() *OracleCPIConfigList { - if in == nil { - return nil - } - out := new(OracleCPIConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OracleCPIConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OracleCPIConfigSpec) DeepCopyInto(out *OracleCPIConfigSpec) { - *out = *in - in.LoadBalancer.DeepCopyInto(&out.LoadBalancer) - in.Proxy.DeepCopyInto(&out.Proxy) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OracleCPIConfigSpec. -func (in *OracleCPIConfigSpec) DeepCopy() *OracleCPIConfigSpec { - if in == nil { - return nil - } - out := new(OracleCPIConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OracleCPIConfigStatus) DeepCopyInto(out *OracleCPIConfigStatus) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OracleCPIConfigStatus. -func (in *OracleCPIConfigStatus) DeepCopy() *OracleCPIConfigStatus { - if in == nil { - return nil - } - out := new(OracleCPIConfigStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OracleLoadBalancer) DeepCopyInto(out *OracleLoadBalancer) { - *out = *in - if in.SecurityListSubnetMapping != nil { - in, out := &in.SecurityListSubnetMapping, &out.SecurityListSubnetMapping - *out = make([]SecurityListSubnetMapping, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OracleLoadBalancer. -func (in *OracleLoadBalancer) DeepCopy() *OracleLoadBalancer { - if in == nil { - return nil - } - out := new(OracleLoadBalancer) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ParavirtualConfig) DeepCopyInto(out *ParavirtualConfig) { - *out = *in - if in.AntreaNSXPodRoutingEnabled != nil { - in, out := &in.AntreaNSXPodRoutingEnabled, &out.AntreaNSXPodRoutingEnabled - *out = new(bool) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParavirtualConfig. -func (in *ParavirtualConfig) DeepCopy() *ParavirtualConfig { - if in == nil { - return nil - } - out := new(ParavirtualConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Proxy) DeepCopyInto(out *Proxy) { - *out = *in - if in.HTTPProxy != nil { - in, out := &in.HTTPProxy, &out.HTTPProxy - *out = new(string) - **out = **in - } - if in.HTTPSProxy != nil { - in, out := &in.HTTPSProxy, &out.HTTPSProxy - *out = new(string) - **out = **in - } - if in.NoProxy != nil { - in, out := &in.NoProxy, &out.NoProxy - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Proxy. -func (in *Proxy) DeepCopy() *Proxy { - if in == nil { - return nil - } - out := new(Proxy) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SecurityListSubnetMapping) DeepCopyInto(out *SecurityListSubnetMapping) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecurityListSubnetMapping. -func (in *SecurityListSubnetMapping) DeepCopy() *SecurityListSubnetMapping { - if in == nil { - return nil - } - out := new(SecurityListSubnetMapping) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VMNetwork) DeepCopyInto(out *VMNetwork) { - *out = *in - if in.Internal != nil { - in, out := &in.Internal, &out.Internal - *out = new(string) - **out = **in - } - if in.External != nil { - in, out := &in.External, &out.External - *out = new(string) - **out = **in - } - if in.ExcludeInternalSubnetCidr != nil { - in, out := &in.ExcludeInternalSubnetCidr, &out.ExcludeInternalSubnetCidr - *out = new(string) - **out = **in - } - if in.ExcludeExternalSubnetCidr != nil { - in, out := &in.ExcludeExternalSubnetCidr, &out.ExcludeExternalSubnetCidr - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VMNetwork. -func (in *VMNetwork) DeepCopy() *VMNetwork { - if in == nil { - return nil - } - out := new(VMNetwork) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSphereCPI) DeepCopyInto(out *VSphereCPI) { - *out = *in - if in.Mode != nil { - in, out := &in.Mode, &out.Mode - *out = new(string) - **out = **in - } - if in.NonParavirtualConfig != nil { - in, out := &in.NonParavirtualConfig, &out.NonParavirtualConfig - *out = new(NonParavirtualConfig) - (*in).DeepCopyInto(*out) - } - if in.ParavirtualConfig != nil { - in, out := &in.ParavirtualConfig, &out.ParavirtualConfig - *out = new(ParavirtualConfig) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereCPI. -func (in *VSphereCPI) DeepCopy() *VSphereCPI { - if in == nil { - return nil - } - out := new(VSphereCPI) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSphereCPIConfig) DeepCopyInto(out *VSphereCPIConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereCPIConfig. -func (in *VSphereCPIConfig) DeepCopy() *VSphereCPIConfig { - if in == nil { - return nil - } - out := new(VSphereCPIConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *VSphereCPIConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSphereCPIConfigList) DeepCopyInto(out *VSphereCPIConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]VSphereCPIConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereCPIConfigList. -func (in *VSphereCPIConfigList) DeepCopy() *VSphereCPIConfigList { - if in == nil { - return nil - } - out := new(VSphereCPIConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *VSphereCPIConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSphereCPIConfigSpec) DeepCopyInto(out *VSphereCPIConfigSpec) { - *out = *in - in.VSphereCPI.DeepCopyInto(&out.VSphereCPI) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereCPIConfigSpec. -func (in *VSphereCPIConfigSpec) DeepCopy() *VSphereCPIConfigSpec { - if in == nil { - return nil - } - out := new(VSphereCPIConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSphereCPIConfigStatus) DeepCopyInto(out *VSphereCPIConfigStatus) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereCPIConfigStatus. -func (in *VSphereCPIConfigStatus) DeepCopy() *VSphereCPIConfigStatus { - if in == nil { - return nil - } - out := new(VSphereCPIConfigStatus) - in.DeepCopyInto(out) - return out -} diff --git a/apis/addonconfigs/csi/v1alpha1/awsebscsiconfig_types.go b/apis/addonconfigs/csi/v1alpha1/awsebscsiconfig_types.go deleted file mode 100644 index a26cefce78..0000000000 --- a/apis/addonconfigs/csi/v1alpha1/awsebscsiconfig_types.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. - -// AwsEbsCSIConfigSpec defines the desired state of AwsEbsCSIConfig -type AwsEbsCSIConfigSpec struct { - AwsEbsCSI AwsEbsCSI `json:"awsEBSCSIDriver"` -} - -// AwsEbsCSIConfigStatus defines the observed state of AwsEbsCSIConfig -type AwsEbsCSIConfigStatus struct { - // Name of the secret created by csi controller - //+ kubebuilder:validation:Optional - SecretRef *string `json:"secretRef,omitempty"` -} - -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status - -// AwsEbsCSIConfig is the Schema for the awsebscsiconfigs API -type AwsEbsCSIConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec AwsEbsCSIConfigSpec `json:"spec,omitempty"` - Status AwsEbsCSIConfigStatus `json:"status,omitempty"` -} - -//+kubebuilder:object:root=true - -// AwsEbsCSIConfigList contains a list of AwsEbsCSIConfig -type AwsEbsCSIConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []AwsEbsCSIConfig `json:"items"` -} - -// AwsEbsCSI is the Schema for the awsebscsiconfigs API -type AwsEbsCSI struct { - // The namespace csi components are to be deployed in - // +kubebuilder:validation:Required - Namespace string `json:"namespace"` - - // +kubebuilder:validation:Optional - HTTPProxy string `json:"httpProxy,omitempty"` - - // +kubebuilder:validation:Optional - HTTPSProxy string `json:"httpsProxy,omitempty"` - - // +kubebuilder:validation:Optional - NoProxy string `json:"noProxy,omitempty"` - - // +kubebuilder:validation:Optional - DeploymentReplicas *int32 `json:"deploymentReplicas,omitempty"` -} - -func init() { - SchemeBuilder.Register(&AwsEbsCSIConfig{}, &AwsEbsCSIConfigList{}) -} diff --git a/apis/addonconfigs/csi/v1alpha1/azurediskcsiconfig_types.go b/apis/addonconfigs/csi/v1alpha1/azurediskcsiconfig_types.go deleted file mode 100644 index 66ab22d9b0..0000000000 --- a/apis/addonconfigs/csi/v1alpha1/azurediskcsiconfig_types.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. - -// AzureDiskCSIConfigSpec defines the desired state of AzureDiskCSIConfig -type AzureDiskCSIConfigSpec struct { - AzureDiskCSI AzureDiskCSI `json:"azureDiskCSIDriver"` -} - -// AzureDiskCSIConfigStatus defines the observed state of AzureDiskCSIConfig -type AzureDiskCSIConfigStatus struct { - // Name of the secret created by csi controller - //+ kubebuilder:validation:Optional - SecretRef *string `json:"secretRef,omitempty"` -} - -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status - -// AzureDiskCSIConfig is the Schema for the azurediskcsiconfigs API -type AzureDiskCSIConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec AzureDiskCSIConfigSpec `json:"spec,omitempty"` - Status AzureDiskCSIConfigStatus `json:"status,omitempty"` -} - -//+kubebuilder:object:root=true - -// AzureDiskCSIConfigList contains a list of AzureDiskCSIConfig -type AzureDiskCSIConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []AzureDiskCSIConfig `json:"items"` -} - -// AzureDiskCSI is the Schema for the awsebscsiconfigs API -type AzureDiskCSI struct { - // The namespace csi components are to be deployed in - // +kubebuilder:validation:Optional - Namespace string `json:"namespace"` - - // +kubebuilder:validation:Optional - HTTPProxy string `json:"httpProxy,omitempty"` - - // +kubebuilder:validation:Optional - HTTPSProxy string `json:"httpsProxy,omitempty"` - - // +kubebuilder:validation:Optional - NoProxy string `json:"noProxy,omitempty"` - - // +kubebuilder:validation:Optional - DeploymentReplicas *int32 `json:"deploymentReplicas,omitempty"` -} - -func init() { - SchemeBuilder.Register(&AzureDiskCSIConfig{}, &AzureDiskCSIConfigList{}) -} diff --git a/apis/addonconfigs/csi/v1alpha1/azurefilecsiconfig_types.go b/apis/addonconfigs/csi/v1alpha1/azurefilecsiconfig_types.go deleted file mode 100644 index 7ae5ad2e71..0000000000 --- a/apis/addonconfigs/csi/v1alpha1/azurefilecsiconfig_types.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. - -// AzureFileCSIConfigSpec defines the desired state of AzureFileCSIConfig -type AzureFileCSIConfigSpec struct { - AzureFileCSI AzureFileCSI `json:"azureFileCSIDriver"` -} - -// AzureFileCSIConfigStatus defines the observed state of AzureFileCSIConfig -type AzureFileCSIConfigStatus struct { - // Name of the secret created by csi controller - //+ kubebuilder:validation:Optional - SecretRef *string `json:"secretRef,omitempty"` -} - -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status - -// AzureFileCSIConfig is the Schema for the azurefilecsiconfigs -type AzureFileCSIConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec AzureFileCSIConfigSpec `json:"spec,omitempty"` - Status AzureFileCSIConfigStatus `json:"status,omitempty"` -} - -//+kubebuilder:object:root=true - -// AzureFileCSIConfigList contains a list of AzureFileCSIConfig -type AzureFileCSIConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []AzureFileCSIConfig `json:"items"` -} - -// AzureFileCSI is the Schema for the AzureFileCSIConfig -type AzureFileCSI struct { - // The namespace csi components are to be deployed in - // +kubebuilder:validation:Required - Namespace string `json:"namespace"` - - // +kubebuilder:validation:Optional - HTTPProxy string `json:"httpProxy,omitempty"` - - // +kubebuilder:validation:Optional - HTTPSProxy string `json:"httpsProxy,omitempty"` - - // +kubebuilder:validation:Optional - NoProxy string `json:"noProxy,omitempty"` - - // +kubebuilder:validation:Optional - DeploymentReplicas *int32 `json:"deploymentReplicas,omitempty"` -} - -func init() { - SchemeBuilder.Register(&AzureFileCSIConfig{}, &AzureFileCSIConfigList{}) -} diff --git a/apis/addonconfigs/csi/v1alpha1/groupversion_info.go b/apis/addonconfigs/csi/v1alpha1/groupversion_info.go deleted file mode 100644 index 78816ddc7b..0000000000 --- a/apis/addonconfigs/csi/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 contains API Schema definitions for the csi v1alpha1 API group -// +kubebuilder:object:generate=true -// +groupName=csi.tanzu.vmware.com -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "csi.tanzu.vmware.com", Version: "v1alpha1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/apis/addonconfigs/csi/v1alpha1/vspherecsiconfig_types.go b/apis/addonconfigs/csi/v1alpha1/vspherecsiconfig_types.go deleted file mode 100644 index 1508adcdfc..0000000000 --- a/apis/addonconfigs/csi/v1alpha1/vspherecsiconfig_types.go +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. - -// VSphereCSIConfigSpec defines the desired state of VSphereCSIConfig -type VSphereCSIConfigSpec struct { - VSphereCSI VSphereCSI `json:"vsphereCSI"` -} - -// VSphereCSIConfigStatus defines the observed state of VSphereCSIConfig -type VSphereCSIConfigStatus struct { - // Name of the secret created by csi controller - //+ kubebuilder:validation:Optional - SecretRef *string `json:"secretRef,omitempty"` -} - -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status - -// VSphereCSIConfig is the Schema for the vspherecsiconfigs API -type VSphereCSIConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec VSphereCSIConfigSpec `json:"spec,omitempty"` - Status VSphereCSIConfigStatus `json:"status,omitempty"` -} - -//+kubebuilder:object:root=true - -// VSphereCSIConfigList contains a list of VSphereCSIConfig -type VSphereCSIConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []VSphereCSIConfig `json:"items"` -} - -type VSphereCSI struct { - // The vSphere mode. Either `vsphereCSI` or `vsphereParavirtualCSI`. - // +kubebuilder:validation:Required - // +kubebuilder:validation:Enum=vsphereCSI;vsphereParavirtualCSI - Mode string `json:"mode"` - - *NonParavirtualConfig `json:"config,omitempty"` -} - -type NonParavirtualConfig struct { - // +kubebuilder:validation:Optional - TLSThumbprint string `json:"tlsThumbprint,omitempty"` - - // The namespace csi components are to be deployed in - // +kubebuilder:validation:Optional - Namespace string `json:"namespace"` - - // +kubebuilder:validation:Optional - ClusterName string `json:"clusterName"` - - // +kubebuilder:validation:Optional - Server string `json:"server"` - - // +kubebuilder:validation:Optional - Datacenter string `json:"datacenter"` - - // +kubebuilder:validation:Optional - PublicNetwork string `json:"publicNetwork"` - - // A secret reference that contains vSphere login credentials to access a vSphere endpoint - // consists of the fields username and password - // +kubebuilder:validation:Optional - VSphereCredentialLocalObjRef *v1.TypedLocalObjectReference `json:"vSphereCredentialLocalObjRef"` - - // +kubebuilder:validation:Optional - Region string `json:"region,omitempty"` - - // +kubebuilder:validation:Optional - Zone string `json:"zone,omitempty"` - - // +kubebuilder:validation:Optional - InsecureFlag *bool `json:"insecureFlag,omitempty"` - - // +kubebuilder:validation:Optional - UseTopologyCategories *bool `json:"useTopologyCategories,omitempty"` - - // +kubebuilder:validation:Optional - ProvisionTimeout string `json:"provisionTimeout,omitempty"` - - // +kubebuilder:validation:Optional - AttachTimeout string `json:"attachTimeout,omitempty"` - - // +kubebuilder:validation:Optional - ResizerTimeout string `json:"resizerTimeout,omitempty"` - - // +kubebuilder:validation:Optional - VSphereVersion string `json:"vSphereVersion,omitempty"` - - // +kubebuilder:validation:Optional - HTTPProxy string `json:"httpProxy,omitempty"` - - // +kubebuilder:validation:Optional - HTTPSProxy string `json:"httpsProxy,omitempty"` - - // +kubebuilder:validation:Optional - NoProxy string `json:"noProxy,omitempty"` - - // +kubebuilder:validation:Optional - DeploymentReplicas *int32 `json:"deploymentReplicas,omitempty"` - - // +kubebuilder:validation:Optional - WindowsSupport *bool `json:"windowsSupport,omitempty"` - - // +kubebuilder:validation:Optional - NetPermissions map[string]*NetPermissionConfig `json:"netPermissions,omitempty"` -} - -// NetPermissionConfig consists of information used to restrict the -// network permissions set on file share volumes -type NetPermissionConfig struct { - // Client IP address, IP range or IP subnet. Example: "10.20.30.0/24"; defaults to "*" if not specified - Ips string `json:"ips,omitempty"` - // Is it READ_ONLY, READ_WRITE or NO_ACCESS. Defaults to "READ_WRITE" if not specified - Permissions string `json:"permissions,omitempty"` - // Disallow root access for this IP range. Defaults to "false" if not specified - RootSquash bool `json:"rootsquash,omitempty"` -} - -func init() { - SchemeBuilder.Register(&VSphereCSIConfig{}, &VSphereCSIConfigList{}) -} diff --git a/apis/addonconfigs/csi/v1alpha1/zz_generated.deepcopy.go b/apis/addonconfigs/csi/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 1fe21cc260..0000000000 --- a/apis/addonconfigs/csi/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,544 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - v1 "k8s.io/api/core/v1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AwsEbsCSI) DeepCopyInto(out *AwsEbsCSI) { - *out = *in - if in.DeploymentReplicas != nil { - in, out := &in.DeploymentReplicas, &out.DeploymentReplicas - *out = new(int32) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AwsEbsCSI. -func (in *AwsEbsCSI) DeepCopy() *AwsEbsCSI { - if in == nil { - return nil - } - out := new(AwsEbsCSI) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AwsEbsCSIConfig) DeepCopyInto(out *AwsEbsCSIConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AwsEbsCSIConfig. -func (in *AwsEbsCSIConfig) DeepCopy() *AwsEbsCSIConfig { - if in == nil { - return nil - } - out := new(AwsEbsCSIConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AwsEbsCSIConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AwsEbsCSIConfigList) DeepCopyInto(out *AwsEbsCSIConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]AwsEbsCSIConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AwsEbsCSIConfigList. -func (in *AwsEbsCSIConfigList) DeepCopy() *AwsEbsCSIConfigList { - if in == nil { - return nil - } - out := new(AwsEbsCSIConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AwsEbsCSIConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AwsEbsCSIConfigSpec) DeepCopyInto(out *AwsEbsCSIConfigSpec) { - *out = *in - in.AwsEbsCSI.DeepCopyInto(&out.AwsEbsCSI) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AwsEbsCSIConfigSpec. -func (in *AwsEbsCSIConfigSpec) DeepCopy() *AwsEbsCSIConfigSpec { - if in == nil { - return nil - } - out := new(AwsEbsCSIConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AwsEbsCSIConfigStatus) DeepCopyInto(out *AwsEbsCSIConfigStatus) { - *out = *in - if in.SecretRef != nil { - in, out := &in.SecretRef, &out.SecretRef - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AwsEbsCSIConfigStatus. -func (in *AwsEbsCSIConfigStatus) DeepCopy() *AwsEbsCSIConfigStatus { - if in == nil { - return nil - } - out := new(AwsEbsCSIConfigStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureDiskCSI) DeepCopyInto(out *AzureDiskCSI) { - *out = *in - if in.DeploymentReplicas != nil { - in, out := &in.DeploymentReplicas, &out.DeploymentReplicas - *out = new(int32) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureDiskCSI. -func (in *AzureDiskCSI) DeepCopy() *AzureDiskCSI { - if in == nil { - return nil - } - out := new(AzureDiskCSI) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureDiskCSIConfig) DeepCopyInto(out *AzureDiskCSIConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureDiskCSIConfig. -func (in *AzureDiskCSIConfig) DeepCopy() *AzureDiskCSIConfig { - if in == nil { - return nil - } - out := new(AzureDiskCSIConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AzureDiskCSIConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureDiskCSIConfigList) DeepCopyInto(out *AzureDiskCSIConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]AzureDiskCSIConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureDiskCSIConfigList. -func (in *AzureDiskCSIConfigList) DeepCopy() *AzureDiskCSIConfigList { - if in == nil { - return nil - } - out := new(AzureDiskCSIConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AzureDiskCSIConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureDiskCSIConfigSpec) DeepCopyInto(out *AzureDiskCSIConfigSpec) { - *out = *in - in.AzureDiskCSI.DeepCopyInto(&out.AzureDiskCSI) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureDiskCSIConfigSpec. -func (in *AzureDiskCSIConfigSpec) DeepCopy() *AzureDiskCSIConfigSpec { - if in == nil { - return nil - } - out := new(AzureDiskCSIConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureDiskCSIConfigStatus) DeepCopyInto(out *AzureDiskCSIConfigStatus) { - *out = *in - if in.SecretRef != nil { - in, out := &in.SecretRef, &out.SecretRef - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureDiskCSIConfigStatus. -func (in *AzureDiskCSIConfigStatus) DeepCopy() *AzureDiskCSIConfigStatus { - if in == nil { - return nil - } - out := new(AzureDiskCSIConfigStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureFileCSI) DeepCopyInto(out *AzureFileCSI) { - *out = *in - if in.DeploymentReplicas != nil { - in, out := &in.DeploymentReplicas, &out.DeploymentReplicas - *out = new(int32) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureFileCSI. -func (in *AzureFileCSI) DeepCopy() *AzureFileCSI { - if in == nil { - return nil - } - out := new(AzureFileCSI) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureFileCSIConfig) DeepCopyInto(out *AzureFileCSIConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureFileCSIConfig. -func (in *AzureFileCSIConfig) DeepCopy() *AzureFileCSIConfig { - if in == nil { - return nil - } - out := new(AzureFileCSIConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AzureFileCSIConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureFileCSIConfigList) DeepCopyInto(out *AzureFileCSIConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]AzureFileCSIConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureFileCSIConfigList. -func (in *AzureFileCSIConfigList) DeepCopy() *AzureFileCSIConfigList { - if in == nil { - return nil - } - out := new(AzureFileCSIConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *AzureFileCSIConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureFileCSIConfigSpec) DeepCopyInto(out *AzureFileCSIConfigSpec) { - *out = *in - in.AzureFileCSI.DeepCopyInto(&out.AzureFileCSI) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureFileCSIConfigSpec. -func (in *AzureFileCSIConfigSpec) DeepCopy() *AzureFileCSIConfigSpec { - if in == nil { - return nil - } - out := new(AzureFileCSIConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AzureFileCSIConfigStatus) DeepCopyInto(out *AzureFileCSIConfigStatus) { - *out = *in - if in.SecretRef != nil { - in, out := &in.SecretRef, &out.SecretRef - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureFileCSIConfigStatus. -func (in *AzureFileCSIConfigStatus) DeepCopy() *AzureFileCSIConfigStatus { - if in == nil { - return nil - } - out := new(AzureFileCSIConfigStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetPermissionConfig) DeepCopyInto(out *NetPermissionConfig) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetPermissionConfig. -func (in *NetPermissionConfig) DeepCopy() *NetPermissionConfig { - if in == nil { - return nil - } - out := new(NetPermissionConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NonParavirtualConfig) DeepCopyInto(out *NonParavirtualConfig) { - *out = *in - if in.VSphereCredentialLocalObjRef != nil { - in, out := &in.VSphereCredentialLocalObjRef, &out.VSphereCredentialLocalObjRef - *out = new(v1.TypedLocalObjectReference) - (*in).DeepCopyInto(*out) - } - if in.InsecureFlag != nil { - in, out := &in.InsecureFlag, &out.InsecureFlag - *out = new(bool) - **out = **in - } - if in.UseTopologyCategories != nil { - in, out := &in.UseTopologyCategories, &out.UseTopologyCategories - *out = new(bool) - **out = **in - } - if in.DeploymentReplicas != nil { - in, out := &in.DeploymentReplicas, &out.DeploymentReplicas - *out = new(int32) - **out = **in - } - if in.WindowsSupport != nil { - in, out := &in.WindowsSupport, &out.WindowsSupport - *out = new(bool) - **out = **in - } - if in.NetPermissions != nil { - in, out := &in.NetPermissions, &out.NetPermissions - *out = make(map[string]*NetPermissionConfig, len(*in)) - for key, val := range *in { - var outVal *NetPermissionConfig - if val == nil { - (*out)[key] = nil - } else { - in, out := &val, &outVal - *out = new(NetPermissionConfig) - **out = **in - } - (*out)[key] = outVal - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NonParavirtualConfig. -func (in *NonParavirtualConfig) DeepCopy() *NonParavirtualConfig { - if in == nil { - return nil - } - out := new(NonParavirtualConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSphereCSI) DeepCopyInto(out *VSphereCSI) { - *out = *in - if in.NonParavirtualConfig != nil { - in, out := &in.NonParavirtualConfig, &out.NonParavirtualConfig - *out = new(NonParavirtualConfig) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereCSI. -func (in *VSphereCSI) DeepCopy() *VSphereCSI { - if in == nil { - return nil - } - out := new(VSphereCSI) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSphereCSIConfig) DeepCopyInto(out *VSphereCSIConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereCSIConfig. -func (in *VSphereCSIConfig) DeepCopy() *VSphereCSIConfig { - if in == nil { - return nil - } - out := new(VSphereCSIConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *VSphereCSIConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSphereCSIConfigList) DeepCopyInto(out *VSphereCSIConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]VSphereCSIConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereCSIConfigList. -func (in *VSphereCSIConfigList) DeepCopy() *VSphereCSIConfigList { - if in == nil { - return nil - } - out := new(VSphereCSIConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *VSphereCSIConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSphereCSIConfigSpec) DeepCopyInto(out *VSphereCSIConfigSpec) { - *out = *in - in.VSphereCSI.DeepCopyInto(&out.VSphereCSI) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereCSIConfigSpec. -func (in *VSphereCSIConfigSpec) DeepCopy() *VSphereCSIConfigSpec { - if in == nil { - return nil - } - out := new(VSphereCSIConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VSphereCSIConfigStatus) DeepCopyInto(out *VSphereCSIConfigStatus) { - *out = *in - if in.SecretRef != nil { - in, out := &in.SecretRef, &out.SecretRef - *out = new(string) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VSphereCSIConfigStatus. -func (in *VSphereCSIConfigStatus) DeepCopy() *VSphereCSIConfigStatus { - if in == nil { - return nil - } - out := new(VSphereCSIConfigStatus) - in.DeepCopyInto(out) - return out -} diff --git a/apis/addonconfigs/go.mod b/apis/addonconfigs/go.mod deleted file mode 100644 index 5642a613cb..0000000000 --- a/apis/addonconfigs/go.mod +++ /dev/null @@ -1,66 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/apis/addonconfigs - -go 1.18 - -require ( - k8s.io/api v0.24.2 - k8s.io/apimachinery v0.24.2 - sigs.k8s.io/controller-runtime v0.12.3 -) - -require ( - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/go-logr/logr v1.2.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/google/uuid v1.1.2 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // 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/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/client-go v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/apis/addonconfigs/go.sum b/apis/addonconfigs/go.sum deleted file mode 100644 index bd34bae05d..0000000000 --- a/apis/addonconfigs/go.sum +++ /dev/null @@ -1,962 +0,0 @@ -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -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= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e h1:3i3ny04XV6HbZ2N1oIBw1UBYATHAOpo4tfTF83JM3Z0= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -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= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/apis/addonconfigs/hack/boilerplate.go.txt b/apis/addonconfigs/hack/boilerplate.go.txt deleted file mode 100644 index ae7eb59485..0000000000 --- a/apis/addonconfigs/hack/boilerplate.go.txt +++ /dev/null @@ -1,2 +0,0 @@ -// Copyright YEAR VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 diff --git a/apis/cli/Makefile b/apis/cli/Makefile deleted file mode 100644 index 3175c2cd85..0000000000 --- a/apis/cli/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../../common.mk diff --git a/apis/cli/config/crd/bases/cli.tanzu.vmware.com_cliplugins.yaml b/apis/cli/config/crd/bases/cli.tanzu.vmware.com_cliplugins.yaml deleted file mode 100644 index 690087ddee..0000000000 --- a/apis/cli/config/crd/bases/cli.tanzu.vmware.com_cliplugins.yaml +++ /dev/null @@ -1,107 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: cliplugins.cli.tanzu.vmware.com -spec: - group: cli.tanzu.vmware.com - names: - kind: CLIPlugin - listKind: CLIPluginList - plural: cliplugins - singular: cliplugin - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: CLIPlugin denotes a Tanzu cli plugin. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: CLIPluginSpec defines the desired state of CLIPlugin. - properties: - artifacts: - additionalProperties: - description: ArtifactList contains an Artifact object for every - supported platform of a version. - items: - description: Artifact points to an individual plugin binary specific - to a version and platform. - properties: - arch: - description: Arch is CPU architecture of the plugin binary - in `GOARCH` format. - type: string - digest: - description: SHA256 hash of the plugin binary. - type: string - image: - description: Image is a fully qualified OCI image for the - plugin binary. - type: string - os: - description: OS of the plugin binary in `GOOS` format. - type: string - type: - description: Type of the binary artifact. Valid values are - S3, GCP, OCIImage. - type: string - uri: - description: AssetURI is a URI of the plugin binary. This - can be a fully qualified HTTP path or a local path. - type: string - required: - - arch - - os - - type - type: object - type: array - description: Artifacts contains an artifact list for every supported - version. - type: object - description: - description: Description is the plugin's description. - type: string - optional: - description: Optional specifies whether the plugin is mandatory or - optional If optional, the plugin will not get auto-downloaded as - part of `tanzu login` or `tanzu plugin sync` command To view the - list of plugin, user can use `tanzu plugin list` and to download - a specific plugin run, `tanzu plugin install ` - type: boolean - recommendedVersion: - description: Recommended version that Tanzu CLI should use if available. - The value should be a valid semantic version as defined in https://semver.org/. - E.g., 2.0.1 - type: string - target: - description: Target specifies the target of the plugin. Only needed - for standalone plugins - type: string - required: - - artifacts - - description - - optional - - recommendedVersion - type: object - required: - - metadata - - spec - type: object - served: true - storage: true diff --git a/apis/cli/go.mod b/apis/cli/go.mod deleted file mode 100644 index d176eeb452..0000000000 --- a/apis/cli/go.mod +++ /dev/null @@ -1,28 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/apis/cli - -go 1.18 - -replace github.com/vmware-tanzu/tanzu-framework/apis/config => ../../apis/config - -require ( - k8s.io/apimachinery v0.24.2 - sigs.k8s.io/controller-runtime v0.12.3 -) - -require ( - github.com/go-logr/logr v1.2.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/stretchr/testify v1.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/text v0.8.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect -) diff --git a/apis/cli/go.sum b/apis/cli/go.sum deleted file mode 100644 index d825ae21be..0000000000 --- a/apis/cli/go.sum +++ /dev/null @@ -1,254 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -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/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -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.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -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.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.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -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.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -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.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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-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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -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/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -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.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -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-20180906233101-161cd47e91fd/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-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-20190827160401-ba9fcec4b297/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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -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-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-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -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.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -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-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -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.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -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= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/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.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/apis/cli/v1alpha1/cliplugin_helper.go b/apis/cli/v1alpha1/cliplugin_helper.go deleted file mode 100644 index daf1dafe0a..0000000000 --- a/apis/cli/v1alpha1/cliplugin_helper.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -// StringToTarget converts string to Target type -func StringToTarget(target string) Target { - if target == string(targetK8s) || target == string(TargetK8s) { - return TargetK8s - } else if target == string(targetTMC) || target == string(TargetTMC) { - return TargetTMC - } else if target == string(TargetNone) { - return TargetNone - } - return TargetNone -} - -func IsValidTarget(target string) bool { - return target == string(targetK8s) || - target == string(TargetK8s) || - target == string(targetTMC) || - target == string(TargetTMC) || - target == string(TargetNone) -} diff --git a/apis/cli/v1alpha1/cliplugin_types.go b/apis/cli/v1alpha1/cliplugin_types.go deleted file mode 100644 index ff7b272f0e..0000000000 --- a/apis/cli/v1alpha1/cliplugin_types.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// Target is the namespace of the CLI to which plugin is applicable -type Target string - -const ( - // TargetK8s is a kubernetes target of the CLI - TargetK8s Target = "kubernetes" - targetK8s Target = "k8s" - - // TargetTMC is a Tanzu Mission Control target of the CLI - TargetTMC Target = "mission-control" - targetTMC Target = "tmc" - - // TargetNone is used for plugins that are not associated with any target - TargetNone Target = "" -) - -var ( - // SupportedTargets is a list of all supported Target - SupportedTargets = []Target{TargetK8s, TargetTMC} -) - -// ArtifactList contains an Artifact object for every supported platform of a version. -type ArtifactList []Artifact - -// Artifact points to an individual plugin binary specific to a version and platform. -type Artifact struct { - // Image is a fully qualified OCI image for the plugin binary. - Image string `json:"image,omitempty"` - // AssetURI is a URI of the plugin binary. This can be a fully qualified HTTP path or a local path. - URI string `json:"uri,omitempty"` - // SHA256 hash of the plugin binary. - Digest string `json:"digest,omitempty"` - // Type of the binary artifact. Valid values are S3, GCP, OCIImage. - Type string `json:"type"` - // OS of the plugin binary in `GOOS` format. - OS string `json:"os"` - // Arch is CPU architecture of the plugin binary in `GOARCH` format. - Arch string `json:"arch"` -} - -// CLIPluginSpec defines the desired state of CLIPlugin. -type CLIPluginSpec struct { - // Description is the plugin's description. - Description string `json:"description"` - // Recommended version that Tanzu CLI should use if available. - // The value should be a valid semantic version as defined in - // https://semver.org/. E.g., 2.0.1 - RecommendedVersion string `json:"recommendedVersion"` - // Artifacts contains an artifact list for every supported version. - Artifacts map[string]ArtifactList `json:"artifacts"` - // Optional specifies whether the plugin is mandatory or optional - // If optional, the plugin will not get auto-downloaded as part of - // `tanzu login` or `tanzu plugin sync` command - // To view the list of plugin, user can use `tanzu plugin list` and - // to download a specific plugin run, `tanzu plugin install ` - Optional bool `json:"optional"` - // Target specifies the target of the plugin. Only needed for standalone plugins - Target Target `json:"target,omitempty"` -} - -//+kubebuilder:object:root=true - -// CLIPlugin denotes a Tanzu cli plugin. -type CLIPlugin struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` - Spec CLIPluginSpec `json:"spec"` -} - -//+kubebuilder:object:root=true - -// CLIPluginList contains a list of CLIPlugin -type CLIPluginList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []CLIPlugin `json:"items"` -} - -func init() { - SchemeBuilder.Register(&CLIPlugin{}, &CLIPluginList{}) -} diff --git a/apis/cli/v1alpha1/groupversion_info.go b/apis/cli/v1alpha1/groupversion_info.go deleted file mode 100644 index 4cfc2a7ce0..0000000000 --- a/apis/cli/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 contains API Schema definitions for the cli v1alpha1 API group -// +kubebuilder:object:generate=true -// +groupName=cli.tanzu.vmware.com -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "cli.tanzu.vmware.com", Version: "v1alpha1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme - - // GroupVersionKindCLIPlugin has information about group, version and kind of CLIPlugin object. - GroupVersionKindCLIPlugin = GroupVersion.WithKind("CLIPlugin") -) diff --git a/apis/cli/v1alpha1/zz_generated.deepcopy.go b/apis/cli/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 9699d3c3e9..0000000000 --- a/apis/cli/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,135 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Artifact) DeepCopyInto(out *Artifact) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Artifact. -func (in *Artifact) DeepCopy() *Artifact { - if in == nil { - return nil - } - out := new(Artifact) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in ArtifactList) DeepCopyInto(out *ArtifactList) { - { - in := &in - *out = make(ArtifactList, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArtifactList. -func (in ArtifactList) DeepCopy() ArtifactList { - if in == nil { - return nil - } - out := new(ArtifactList) - in.DeepCopyInto(out) - return *out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CLIPlugin) DeepCopyInto(out *CLIPlugin) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CLIPlugin. -func (in *CLIPlugin) DeepCopy() *CLIPlugin { - if in == nil { - return nil - } - out := new(CLIPlugin) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *CLIPlugin) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CLIPluginList) DeepCopyInto(out *CLIPluginList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]CLIPlugin, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CLIPluginList. -func (in *CLIPluginList) DeepCopy() *CLIPluginList { - if in == nil { - return nil - } - out := new(CLIPluginList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *CLIPluginList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CLIPluginSpec) DeepCopyInto(out *CLIPluginSpec) { - *out = *in - if in.Artifacts != nil { - in, out := &in.Artifacts, &out.Artifacts - *out = make(map[string]ArtifactList, len(*in)) - for key, val := range *in { - var outVal []Artifact - if val == nil { - (*out)[key] = nil - } else { - in, out := &val, &outVal - *out = make(ArtifactList, len(*in)) - copy(*out, *in) - } - (*out)[key] = outVal - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CLIPluginSpec. -func (in *CLIPluginSpec) DeepCopy() *CLIPluginSpec { - if in == nil { - return nil - } - out := new(CLIPluginSpec) - in.DeepCopyInto(out) - return out -} diff --git a/apis/core/v1alpha2/featuregate_webhook.go b/apis/core/v1alpha2/featuregate_webhook.go index ba5be35d20..1f35eba82b 100644 --- a/apis/core/v1alpha2/featuregate_webhook.go +++ b/apis/core/v1alpha2/featuregate_webhook.go @@ -265,8 +265,8 @@ func computeFeaturesThatDoNotExist(spec FeatureGateSpec, features *FeatureList) } allFeaturesInCluster := sets.String{} - for _, feature := range features.Items { - allFeaturesInCluster.Insert(feature.Name) + for i := range features.Items { + allFeaturesInCluster.Insert(features.Items[i].Name) } invalidFeatures := allFeaturesInSpec.Difference(allFeaturesInCluster) return invalidFeatures.List() @@ -303,7 +303,8 @@ func computeConflictingFeatures(featureGate *FeatureGate, featureGates *FeatureG // Gather all the gated features in the cluster allGatedFeaturesInCluster := sets.String{} - for _, fg := range featureGates.Items { + for i := range featureGates.Items { + fg := featureGates.Items[i] // Skip comparing the object to itself during updates. if fg.Name == featureGate.Name { continue @@ -331,7 +332,8 @@ func getPermanentlyVoidAllSupportGuaranteesFieldForFeature(featureGate *FeatureG // getFeatureStabilityLevel returns feature stability level for a feature from a list of Features func getFeatureStabilityLevel(list *FeatureList, featureName string) (StabilityLevel, bool) { - for _, feature := range list.Items { + for i := range list.Items { + feature := list.Items[i] if featureName == feature.Name { return feature.Spec.Stability, true } diff --git a/apis/providers/v1alpha1/groupversion_info.go b/apis/providers/v1alpha1/groupversion_info.go deleted file mode 100644 index 1e844d37bb..0000000000 --- a/apis/providers/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 ... -// +kubebuilder:object:generate=true -// +groupName=providers.tanzu.vmware.com -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "providers.tanzu.vmware.com", Version: "v1alpha1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/apis/providers/v1alpha1/templatedefinition_types.go b/apis/providers/v1alpha1/templatedefinition_types.go deleted file mode 100644 index 1d7a83f2ba..0000000000 --- a/apis/providers/v1alpha1/templatedefinition_types.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// PathInfo contains path information -type PathInfo struct { - Path string `json:"path" yaml:"path"` - FileMark string `json:"filemark,omitempty" yaml:"filemark,omitempty"` -} - -// TemplateDefinitionSpec defines state of template definition file and path information -type TemplateDefinitionSpec struct { - Paths []PathInfo `json:"paths" yaml:"paths"` -} - -// +kubebuilder:object:root=true -// +kubebuilder:storageversion - -// TemplateDefinition is a schema for template definition file -type TemplateDefinition struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec TemplateDefinitionSpec `json:"spec,omitempty"` -} - -func init() { - SchemeBuilder.Register(&TemplateDefinition{}) -} diff --git a/apis/providers/v1alpha1/zz_generated.deepcopy.go b/apis/providers/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 5d579c2e4e..0000000000 --- a/apis/providers/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PathInfo) DeepCopyInto(out *PathInfo) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PathInfo. -func (in *PathInfo) DeepCopy() *PathInfo { - if in == nil { - return nil - } - out := new(PathInfo) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TemplateDefinition) DeepCopyInto(out *TemplateDefinition) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateDefinition. -func (in *TemplateDefinition) DeepCopy() *TemplateDefinition { - if in == nil { - return nil - } - out := new(TemplateDefinition) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TemplateDefinition) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TemplateDefinitionSpec) DeepCopyInto(out *TemplateDefinitionSpec) { - *out = *in - if in.Paths != nil { - in, out := &in.Paths, &out.Paths - *out = make([]PathInfo, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateDefinitionSpec. -func (in *TemplateDefinitionSpec) DeepCopy() *TemplateDefinitionSpec { - if in == nil { - return nil - } - out := new(TemplateDefinitionSpec) - in.DeepCopyInto(out) - return out -} diff --git a/apis/run/Makefile b/apis/run/Makefile deleted file mode 100644 index 93b96d6f59..0000000000 --- a/apis/run/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../../common.mk \ No newline at end of file diff --git a/apis/run/config/crd/bases/run.tanzu.vmware.com_capabilities.yaml b/apis/run/config/crd/bases/run.tanzu.vmware.com_capabilities.yaml deleted file mode 100644 index 7479f1d268..0000000000 --- a/apis/run/config/crd/bases/run.tanzu.vmware.com_capabilities.yaml +++ /dev/null @@ -1,335 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: capabilities.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: Capability - listKind: CapabilityList - plural: capabilities - singular: capability - scope: Namespaced - versions: - - deprecated: true - deprecationWarning: Capability API in run.tanzu.vmware.com is deprecated. Use - Capability API from core.tanzu.vmware.com instead - name: v1alpha1 - schema: - openAPIV3Schema: - description: Capability is the Schema for the capabilities API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec is the capability spec that has cluster queries. - properties: - queries: - description: Queries specifies set of queries that are evaluated. - items: - description: Query is a logical grouping of GVR, Object and PartialSchema - queries. - properties: - groupVersionResources: - description: GroupVersionResources evaluates a slice of GVR - queries. - items: - description: QueryGVR queries for an API group with the optional - ability to check for API versions and resource. - properties: - group: - description: Group is the API group to check for in the - cluster. - type: string - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - resource: - description: Resource is the API resource to check for - given an API group and a slice of versions. Specifying - a Resource requires at least one version to be specified - in Versions. - type: string - versions: - description: Versions is the slice of versions to check - for in the specified API group. - items: - type: string - type: array - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objects: - description: Objects evaluates a slice of Object queries. - items: - description: QueryObject represents any runtime.Object that - could exist in a cluster with the ability to check for annotations. - properties: - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objectReference: - description: ObjectReference is the ObjectReference to - check for in the cluster. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - withAnnotations: - additionalProperties: - type: string - description: WithAnnotations are the annotations whose - presence is checked in the object. The query succeeds - only if all the annotations specified exists. - type: object - withoutAnnotations: - additionalProperties: - type: string - description: WithAnnotations are the annotations whose - absence is checked in the object. The query succeeds - only if all the annotations specified do not exist. - type: object - required: - - name - - objectReference - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - partialSchemas: - description: PartialSchemas evaluates a slice of PartialSchema - queries. - items: - description: QueryPartialSchema queries for any OpenAPI schema - that may exist on a cluster. - properties: - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - partialSchema: - description: PartialSchema is the partial OpenAPI schema - that will be matched in a cluster. - minLength: 1 - type: string - required: - - name - - partialSchema - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - serviceAccountName: - description: ServiceAccountName is the name of the service account - with which requests are made to the API server for evaluating queries. - Service account should exist in the same namespace as this resource. - When this field is not specified, a default service account with - only the ability to execute GVR queries is used. - type: string - required: - - queries - type: object - status: - description: Status is the capability status that has results of cluster - queries. - properties: - results: - description: Results represents the results of all the queries specified - in the spec. - items: - description: Result represents the results of queries in Query. - properties: - groupVersionResources: - description: GroupVersionResources represents results of GVR - queries in spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objects: - description: Objects represents results of Object queries in - spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - partialSchemas: - description: PartialSchemas represents results of PartialSchema - queries in spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - results - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/run/config/crd/bases/run.tanzu.vmware.com_clusterbootstraps.yaml b/apis/run/config/crd/bases/run.tanzu.vmware.com_clusterbootstraps.yaml deleted file mode 100644 index 5478cd77ac..0000000000 --- a/apis/run/config/crd/bases/run.tanzu.vmware.com_clusterbootstraps.yaml +++ /dev/null @@ -1,328 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: clusterbootstraps.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: ClusterBootstrap - listKind: ClusterBootstrapList - plural: clusterbootstraps - shortNames: - - cb - singular: clusterbootstrap - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: CNI package name and version - jsonPath: .spec.cni.refName - name: CNI - type: string - - description: CSI package name and version - jsonPath: .spec.csi.refName - name: CSI - type: string - - description: CPI package name and version - jsonPath: .spec.cpi.refName - name: CPI - type: string - - description: Kapp package name and version - jsonPath: .spec.kapp.refName - name: Kapp - type: string - - description: Additional packages - jsonPath: .spec.additionalPackages[*].refName - name: Additional Packages - priority: 10 - type: string - - description: Resolved TKR name - jsonPath: .status.resolvedTKR - name: Resolved_TKR - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: ClusterBootstrap is the Schema for the ClusterBootstraps API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterBootstrapTemplateSpec defines the desired state of - ClusterBootstrapTemplate - properties: - additionalPackages: - items: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, the - specified Kind must be in the core API group. For - any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - type: array - cni: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - cpi: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - csi: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - kapp: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - paused: - default: false - description: Paused can be used to prevent controllers from processing - the ClusterBootstrap and all its associated objects. - type: boolean - type: object - status: - description: ClusterBootstrapStatus defines the observed state of ClusterBootstrap - properties: - conditions: - description: Conditions provide observations of the operational state - of a Cluster API resource. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - resolvedTKR: - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/run/config/crd/bases/run.tanzu.vmware.com_clusterbootstraptemplates.yaml b/apis/run/config/crd/bases/run.tanzu.vmware.com_clusterbootstraptemplates.yaml deleted file mode 100644 index 71387564df..0000000000 --- a/apis/run/config/crd/bases/run.tanzu.vmware.com_clusterbootstraptemplates.yaml +++ /dev/null @@ -1,272 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: clusterbootstraptemplates.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: ClusterBootstrapTemplate - listKind: ClusterBootstrapTemplateList - plural: clusterbootstraptemplates - shortNames: - - cbt - singular: clusterbootstraptemplate - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: CNI package name and version - jsonPath: .spec.cni.refName - name: CNI - type: string - - description: CSI package name and version - jsonPath: .spec.csi.refName - name: CSI - type: string - - description: CPI package name and version - jsonPath: .spec.cpi.refName - name: CPI - type: string - - description: Kapp package name and version - jsonPath: .spec.kapp.refName - name: Kapp - type: string - - description: Additional packages - jsonPath: .spec.additionalPackages[*].refName - name: Additional Packages - priority: 10 - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: ClusterBootstrapTemplate is the Schema for the ClusterBootstraptemplates - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterBootstrapTemplateSpec defines the desired state of - ClusterBootstrapTemplate - properties: - additionalPackages: - items: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, the - specified Kind must be in the core API group. For - any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - type: array - cni: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - cpi: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - csi: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - kapp: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - paused: - default: false - description: Paused can be used to prevent controllers from processing - the ClusterBootstrap and all its associated objects. - type: boolean - type: object - required: - - spec - type: object - served: true - storage: true - subresources: {} diff --git a/apis/run/config/crd/bases/run.tanzu.vmware.com_kappcontrollerconfigs.yaml b/apis/run/config/crd/bases/run.tanzu.vmware.com_kappcontrollerconfigs.yaml deleted file mode 100644 index f1f614a0dc..0000000000 --- a/apis/run/config/crd/bases/run.tanzu.vmware.com_kappcontrollerconfigs.yaml +++ /dev/null @@ -1,166 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: kappcontrollerconfigs.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: KappControllerConfig - listKind: KappControllerConfigList - plural: kappcontrollerconfigs - shortNames: - - kappconf - singular: kappcontrollerconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The namespace in which kapp-controller is deployed - jsonPath: .spec.namespace - name: Namespace - type: string - - description: The namespace value used for global packaging resources. Any Package - and PackageMetadata CRs within that namespace will be included in all other - namespaces on the cluster, without duplicating them - jsonPath: .spec.kappController.globalNamespace - name: GlobalNamespace - type: string - - description: Name of the kapp-controller data values secret - jsonPath: .status.secretName - name: SecretName - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: KappControllerConfig is the Schema for the kappcontrollerconfigs - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KappControllerConfigSpec defines the desired state of KappControllerConfig - properties: - kappController: - default: - deployment: - hostNetwork: true - properties: - config: - properties: - caCerts: - description: A cert chain of trusted CA certs. These will - be added to the system-wide cert pool of trusted CA's. Cluster-wide - CA Certificate setting will be used if this is not provided. - type: string - dangerousSkipTLSVerify: - description: A comma delimited list of hostnames for which - kapp-controller should skip TLS verification - type: string - httpProxy: - description: The url/ip of a proxy for kapp controller to - use when making network requests. Cluster-wide HTTP proxy - setting will be used if this is not provided. - type: string - httpsProxy: - description: The url/ip of a TLS capable proxy for kapp-controller - to use when making network requests. Cluster-wide HTTPS - proxy setting will be used if this is not provided. - type: string - noProxy: - description: A comma delimited list of domain names which - kapp-controller should bypass the proxy for when making - requests. Cluster-wide no-proxy setting will be used if - this is not provided. - type: string - type: object - createNamespace: - default: false - description: Whether to create namespace specified for kapp-controller - type: boolean - deployment: - default: - hostNetwork: true - properties: - apiPort: - default: 10100 - description: Bind port for kapp-controller API - type: integer - concurrency: - default: 4 - description: Concurrency of kapp-controller deployment - type: integer - hostNetwork: - default: true - description: Whether to enable host networking for kapp-controller - deployment - type: boolean - metricsBindAddress: - default: "0" - description: Address for metrics server - type: string - priorityClassName: - default: system-cluster-critical - description: The priority value that various system components - use to find the priority of the kapp-controller pod - type: string - tolerations: - default: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - description: kapp-controller deployment tolerations - items: - additionalProperties: - type: string - type: object - type: array - type: object - globalNamespace: - default: tkg-system - description: The namespace value used for global packaging resources. - Any Package and PackageMetadata CRs within that namespace will - be included in all other namespaces on the cluster, without - duplicating them - type: string - type: object - namespace: - default: tkg-system - description: The namespace in which kapp-controller is deployed - type: string - type: object - status: - description: KappControllerConfigStatus defines the observed state of - KappControllerConfig - properties: - secretRef: - description: Name of the data value secret created by controller - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/run/config/crd/bases/run.tanzu.vmware.com_osimages.yaml b/apis/run/config/crd/bases/run.tanzu.vmware.com_osimages.yaml deleted file mode 100644 index b4e45b7077..0000000000 --- a/apis/run/config/crd/bases/run.tanzu.vmware.com_osimages.yaml +++ /dev/null @@ -1,162 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: osimages.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: OSImage - listKind: OSImageList - plural: osimages - shortNames: - - osimg - singular: osimage - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.kubernetesVersion - name: K8S Version - type: string - - jsonPath: .spec.os.name - name: OS Name - type: string - - jsonPath: .spec.os.version - name: OS Version - type: string - - jsonPath: .spec.os.arch - name: Arch - type: string - - jsonPath: .spec.image.type - name: Type - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - name: v1alpha3 - schema: - openAPIV3Schema: - description: OSImage is the schema for the OSImages API. OSImage objects represent - OSImages shipped as parts of TKRs. OSImages are immutable to end-users. - They are created and managed by TKG to provide discovery of Kubernetes releases - to TKG users and OS image details for infrastructure Machines. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OSImageSpec defines the desired state of OSImage - properties: - image: - description: Image specifies the "Image" part of the OSImage. - properties: - ref: - description: Ref is a key-value map identifying the image within - the infrastructure provider. This is the data to be injected - into the infra-Machine objects (like AWSMachine) on creation. - type: object - x-kubernetes-preserve-unknown-fields: true - type: - description: 'Type of the OSImage, roughly corresponding to the - infrastructure provider (vSphere can serve both ova and vmop). - Some of currently known types are: "ami", "azure", "docker", - "ova", "vmop".' - type: string - required: - - ref - - type - type: object - kubernetesVersion: - description: KubernetesVersion specifies the build version of the - Kubernetes shipped with this OSImage. - type: string - os: - description: OS specifies the "OS" part of the OSImage. - properties: - arch: - type: string - name: - type: string - type: - type: string - version: - type: string - required: - - arch - - name - - type - - version - type: object - required: - - image - - kubernetesVersion - - os - type: object - status: - description: OSImageStatus defines the observed state of OSImage - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/run/config/crd/bases/run.tanzu.vmware.com_tanzukubernetesclusters.yaml b/apis/run/config/crd/bases/run.tanzu.vmware.com_tanzukubernetesclusters.yaml deleted file mode 100644 index b4d8167428..0000000000 --- a/apis/run/config/crd/bases/run.tanzu.vmware.com_tanzukubernetesclusters.yaml +++ /dev/null @@ -1,685 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: tanzukubernetesclusters.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: TanzuKubernetesCluster - listKind: TanzuKubernetesClusterList - plural: tanzukubernetesclusters - shortNames: - - tkc - singular: tanzukubernetescluster - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .spec.topology.controlPlane.replicas - name: Control Plane - type: integer - - jsonPath: .status.totalWorkerReplicas - name: Worker - type: integer - - jsonPath: .spec.topology.controlPlane.tkr.reference.name - name: TKR Name - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='TanzuKubernetesReleaseCompatible')].status - name: TKR Compatible - type: string - - jsonPath: .status.conditions[?(@.type=='UpdatesAvailable')].message - name: Updates Available - type: string - name: v1alpha2 - schema: - openAPIV3Schema: - description: TanzuKubernetesCluster is the schema for the Tanzu Kubernetes - Grid service for vSphere API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: 'TanzuKubernetesClusterSpec defines the desired state of - TanzuKubernetesCluster: its nodes, the software installed on those nodes - and the way that software should be configured.' - properties: - distribution: - description: 'Distribution specifies the distribution for the Tanzu - Kubernetes cluster: the software installed on the control plane - and worker nodes, including Kubernetes itself. DEPRECATED: use topology.controlPlane.tkr - and topology.nodePools[*].tkr instead.' - properties: - fullVersion: - description: "Version specifies the fully-qualified desired Kubernetes - distribution version of the Tanzu Kubernetes cluster. If the - cluster exists and is not of the specified version, it will - be upgraded. \n Version is a semantic version string. The version - may not be decreased. The major version may not be changed. - If the minor version is changed, it may only be incremented; - skipping minor versions is not supported. \n The current observed - version of the cluster is held by `status.version`. DEPRECATED: - use topology.controlPlane.tkr and topology.nodePools[*].tkr - instead." - type: string - version: - description: "VersionHint provides the version webhook with guidance - about the desired Kubernetes distribution version of the Tanzu - Kubernetes cluster. If a hint is provided without a full version, - the most recent distribution matching the hint will be selected. - \n The version selected based on the hint will be stored in - the spec as the full version. This ensures that the same version - is used if the cluster is scaled out in the future. \n VersionHint - is a semantic prefix of a full version number. (E.g., v1.15.1 - matches any distribution of v1.15.1, including v1.15.1+vmware.1-tkg.1 - or v1.15.1+vmware.2-tkg.1, but not v1.15.10+vmware.1-tkg.1.) - \n A hint that does not match the full version is invalid and - will be rejected. \n To upgrade a cluster to the most recent - version that still matches the hint, leave the hint alone and - remove the fullVersion from the spec. This will cause the hint - to be re-resolved. DEPRECATED: use topology.controlPlane.tkr - and topology.nodePools[*].tkr instead." - type: string - type: object - settings: - description: 'Settings specifies settings for the Tanzu Kubernetes - cluster: the way an instance of a distribution is configured, including - information about pod networking and storage.' - properties: - network: - description: Network specifies network-related settings for the - cluster. - properties: - cni: - description: "CNI is the Container Networking Interface plugin - for the Tanzu Kubernetes cluster. \n Defaults to Calico." - properties: - name: - description: "Name is the name of the CNI plugin to use. - \n Supported values: \"calico\", \"antrea\"." - type: string - required: - - name - type: object - pods: - description: "Pods specify network settings for pods. \n When - CNI is antrea, set Defaults to 192.168.0.0/16. When CNI - is antrea-nsx-routed, set Defaults to empty" - properties: - cidrBlocks: - description: "CIDRBlocks specifies one or more ranges - of IP addresses. \n Note: supplying multiple ranges - many not be supported by all CNI plugins." - items: - type: string - type: array - type: object - proxy: - description: "Proxy specifies HTTP(s) proxy configuration - for Tanzu Kubernetes cluster. \n If omitted, no proxy will - be configured in the system." - properties: - httpProxy: - description: 'HttpProxy specifies a proxy URL to use for - creating HTTP connections outside the cluster. Example: - http://:@:' - type: string - httpsProxy: - description: 'HttpsProxy specifies a proxy URL to use - for creating HTTPS connections outside the cluster. - Example: http://:@:' - type: string - noProxy: - description: 'NoProxy specifies a list of destination - domain names, domains, IP addresses or other network - CIDRs to exclude proxying. Example: [localhost, 127.0.0.1, - 10.10.10.0/24]' - items: - type: string - type: array - type: object - serviceDomain: - description: "ServiceDomain specifies service domain for Tanzu - Kubernetes cluster. \n Defaults to a cluster.local." - type: string - services: - description: "Services specify network settings for services. - \n Defaults to 10.96.0.0/12." - properties: - cidrBlocks: - description: "CIDRBlocks specifies one or more ranges - of IP addresses. \n Note: supplying multiple ranges - many not be supported by all CNI plugins." - items: - type: string - type: array - type: object - trust: - description: "Trust specifies certificate configuration for - the Tanzu Kubernetes Cluster. \n If omitted, no certificate - will be configured in the system." - properties: - additionalTrustedCAs: - description: AdditionalTrustedCAs specifies the additional - trusted certificates (which can be additional CAs or - end certificates) to add to the cluster - items: - description: TLSCertificate specifies a single additional - certificate name and contents - properties: - data: - description: 'Data specifies the contents of the - additional certificate, encoded as a base64 string. - Specifically, this is the PEM Public Certificate - data as a base64 string.. Example: LS0tLS1C...LS0tCg== - (where "..." is the middle section of the long - base64 string)' - type: string - name: - description: 'Name specifies the name of the additional - certificate, used in the filename Example: CompanyInternalCA' - type: string - required: - - data - - name - type: object - type: array - type: object - type: object - storage: - description: "Storage specifies storage-related settings for the - cluster. \n The storage used for node's disks is controlled - by TopologySettings." - properties: - classes: - description: "Classes is a list of storage classes from the - supervisor namespace to expose within a cluster. \n If omitted, - all storage classes from the supervisor namespace will be - exposed within the cluster." - items: - type: string - type: array - defaultClass: - description: DefaultClass is the valid storage class name - which is treated as the default storage class within a cluster. - If omitted, no default storage class is set - type: string - type: object - type: object - topology: - description: 'Topology specifies the topology for the Tanzu Kubernetes - cluster: the number, purpose, and organization of the nodes which - form the cluster and the resources allocated for each.' - properties: - controlPlane: - description: ControlPlane specifies the topology of the cluster's - control plane, including the number of control plane nodes and - resources allocated for each. The control plane must have an - odd number of nodes. - properties: - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The default - value is 0, meaning that the node will be drained without - any time limitations. NOTE: NodeDrainTimeout is different - from `kubectl drain --timeout`' - type: string - replicas: - description: Replicas is the number of nodes. This is a pointer - to distinguish between explicit zero and not specified, - `nil`. For control plane, defaults to 1 if `nil`. For node - pools, a value of `nil` indicates that the field will not - be reconciled, allowing external services like autoscalers - to choose the number of nodes. By default, CAPI's `MachineDeployment` - will pick 1. - format: int32 - type: integer - storageClass: - description: StorageClass is the storage class to be used - for storage of the disks which store the root filesystems - of the nodes. Run `kubectl describe ns` on your namespace - to see which storage classes are available to use. - type: string - tkr: - description: TKR points to TanzuKubernetesRelease intended - to be used by the node pool (the control plane being special - kind of a node pool). - properties: - reference: - description: Reference is a way to set the fixed link - to the target object. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - type: object - vmClass: - description: VMClass is the name of the VirtualMachineClass, - which describes the virtual hardware settings, to be used - each node in the pool. This controls the hardware available - to the node (CPU and memory) as well as the requests and - limits on those resources. Run `kubectl describe virtualmachineclasses` - to see which VM classes are available to use. - type: string - volumes: - description: Volumes is the set of PVCs to be created and - attached to each node. - items: - description: Volume defines a PVC attachment. These volumes - are tied to the node lifecycle, created and deleted when - the node is. The volumes are mounted in the node during - the bootstrap process, prior to services being started - (e.g. etcd, containerd). - properties: - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Capacity is the PVC capacity - type: object - mountPath: - description: MountPath is the directory where the volume - device is to be mounted - type: string - name: - description: 'Name is suffix used to name this PVC as: - node.Name + "-" + Name' - type: string - storageClass: - description: StorageClass is the storage class to be - used for the disks. Defaults to TopologySettings.StorageClass - type: string - required: - - capacity - - mountPath - - name - type: object - type: array - required: - - storageClass - - vmClass - type: object - nodePools: - description: NodePools specifies the topology of cluster's worker - node pools, including the number of nodes and resources allocated - for each node. - items: - description: NodePool describes a group of nodes within a cluster - that have the same configuration - properties: - labels: - additionalProperties: - type: string - description: Labels are map of string keys and values that - can be used to organize and categorize objects. User-defined - labels will be propagated to the created nodes. - type: object - name: - description: Name is the name of the NodePool. - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The - default value is 0, meaning that the node will be drained - without any time limitations. NOTE: NodeDrainTimeout is - different from `kubectl drain --timeout`' - type: string - replicas: - description: Replicas is the number of nodes. This is a - pointer to distinguish between explicit zero and not specified, - `nil`. For control plane, defaults to 1 if `nil`. For - node pools, a value of `nil` indicates that the field - will not be reconciled, allowing external services like - autoscalers to choose the number of nodes. By default, - CAPI's `MachineDeployment` will pick 1. - format: int32 - type: integer - storageClass: - description: StorageClass is the storage class to be used - for storage of the disks which store the root filesystems - of the nodes. Run `kubectl describe ns` on your namespace - to see which storage classes are available to use. - type: string - taints: - description: Taints specifies the taints the Node API object - should be registered with. User-defined taints will be - propagated to the created nodes. - items: - description: The node this Taint is attached to has the - "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on - pods that do not tolerate the taint. Valid effects - are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the - taint key. - type: string - required: - - effect - - key - type: object - type: array - tkr: - description: TKR points to TanzuKubernetesRelease intended - to be used by the node pool (the control plane being special - kind of a node pool). - properties: - reference: - description: Reference is a way to set the fixed link - to the target object. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: - "spec.containers{name}" (where "name" refers to - the name of the container that triggered the event) - or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax - is chosen only to have some well-defined way of - referencing a part of an object. TODO: this design - is not final and this field is subject to change - in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which - this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - type: object - vmClass: - description: VMClass is the name of the VirtualMachineClass, - which describes the virtual hardware settings, to be used - each node in the pool. This controls the hardware available - to the node (CPU and memory) as well as the requests and - limits on those resources. Run `kubectl describe virtualmachineclasses` - to see which VM classes are available to use. - type: string - volumes: - description: Volumes is the set of PVCs to be created and - attached to each node. - items: - description: Volume defines a PVC attachment. These volumes - are tied to the node lifecycle, created and deleted - when the node is. The volumes are mounted in the node - during the bootstrap process, prior to services being - started (e.g. etcd, containerd). - properties: - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Capacity is the PVC capacity - type: object - mountPath: - description: MountPath is the directory where the - volume device is to be mounted - type: string - name: - description: 'Name is suffix used to name this PVC - as: node.Name + "-" + Name' - type: string - storageClass: - description: StorageClass is the storage class to - be used for the disks. Defaults to TopologySettings.StorageClass - type: string - required: - - capacity - - mountPath - - name - type: object - type: array - required: - - name - - storageClass - - vmClass - type: object - type: array - required: - - controlPlane - - nodePools - type: object - required: - - topology - type: object - status: - description: TanzuKubernetesClusterStatus defines the observed state of - TanzuKubernetesCluster. - properties: - addons: - description: Addons groups the statuses of a Tanzu Kubernetes cluster's - add-ons. - items: - description: AddonStatus represents the status of an addon. - properties: - conditions: - description: Conditions defines the current conditions of the - add-on. - items: - description: Condition defines an observation of a Cluster - API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from - one status to another. This should be when the underlying - condition changed. If that is not known, then using - the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details - about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or - not this field is considered a guaranteed API. This - field may not be empty. - type: string - severity: - description: Severity provides an explicit classification - of Reason code, so the users or machines can immediately - understand the current situation and act accordingly. - The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, - Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can - be useful (see .node.status.conditions), the ability - to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - name: - description: Name of the add-on used. - type: string - type: - description: Type of the add-on used - type: string - version: - description: Version of the distribution applied - type: string - required: - - name - - type - type: object - type: array - apiEndpoints: - description: APIEndpoints represents the endpoints to communicate - with the control plane. - items: - description: APIEndpoint represents a reachable Kubernetes API endpoint. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - type: integer - required: - - host - - port - type: object - type: array - conditions: - description: Conditions defines current service state of the TanzuKubernetestCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - phase: - description: 'Phase of this TanzuKubernetesCluster. DEPRECATED: will - be removed in v1alpha3' - type: string - totalWorkerReplicas: - description: Total number of replicas in worker node pools. - format: int32 - type: integer - version: - description: Version holds the observed version of the Tanzu Kubernetes - cluster. While an upgrade is in progress this value will be the - version of the cluster when the upgrade began. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/apis/run/config/crd/bases/run.tanzu.vmware.com_tanzukubernetesreleases.yaml b/apis/run/config/crd/bases/run.tanzu.vmware.com_tanzukubernetesreleases.yaml deleted file mode 100644 index 997f387562..0000000000 --- a/apis/run/config/crd/bases/run.tanzu.vmware.com_tanzukubernetesreleases.yaml +++ /dev/null @@ -1,556 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: tanzukubernetesreleases.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: TanzuKubernetesRelease - listKind: TanzuKubernetesReleaseList - plural: tanzukubernetesreleases - shortNames: - - tkr - singular: tanzukubernetesrelease - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG, which can be used to create TanzuKubernetesCluster instances. TKRs - are immutable to end-users. They are created and managed by TKG to provide - discovery of Kubernetes releases to TKG users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - images: - description: Images is the list of (other than Kubernetes core) essential - container images shipped by this TKR (e.g. coredns, etcd). - items: - description: ContainerImage is a struct representing a single fully - qualified container image name, constructed as `{Repository}/{Name}:{Tag}`. - properties: - name: - description: Name is the container image name without the repository - prefix. It MUST be a valid URI path, MAY contain zero or more - '/', and SHOULD NOT start or end with '/'. - type: string - repository: - description: Repository is the container image repository used - by this image. It MUST be a DNS-compatible name. - type: string - tag: - description: Tag is the container image version tag. It is the - suffix coming after ':' in a fully qualified image name. - type: string - required: - - name - type: object - type: array - kubernetesVersion: - description: KubernetesVersion is the fully qualified Semantic Versioning - conformant version of Kubernetes shipped by this TKR. The same KubernetesVersion - MAY be shipped by different TKRs. - type: string - nodeImageRef: - description: NodeImageRef refers to an object representing the image - used to create TKC nodes (e.g. VirtualMachineImage). - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - repository: - description: Repository is the container image repository for Kubernetes - core images, such as kube-apiserver, kube-proxy, etc. It MUST be - a DNS-compatible name. - type: string - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - - jsonPath: .status.conditions[?(@.type=='UpdatesAvailable')].message - name: Updates Available - type: string - name: v1alpha2 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG Service, which can be used to create TanzuKubernetesCluster instances. - TKRs are immutable to end-users. They are created and managed by TKG Service - to provide discovery of Kubernetes releases to TKG Service users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - images: - description: Images is the list of (other than Kubernetes core) essential - container images shipped by this TKR (e.g. coredns, etcd). - items: - description: ContainerImage is a struct representing a single fully - qualified container image name, constructed as `{Repository}/{Name}:{Tag}`. - properties: - name: - description: Name is the container image name without the repository - prefix. It MUST be a valid URI path, MAY contain zero or more - '/', and SHOULD NOT start or end with '/'. - type: string - repository: - description: Repository is the container image repository used - by this image. It MUST be a DNS-compatible name. - type: string - tag: - description: Tag is the container image version tag. It is the - suffix coming after ':' in a fully qualified image name. - type: string - required: - - name - type: object - type: array - kubernetesVersion: - description: KubernetesVersion is the fully qualified Semantic Versioning - conformant version of Kubernetes shipped by this TKR. The same KubernetesVersion - MAY be shipped by different TKRs. - type: string - nodeImageRef: - description: NodeImageRef refers to an object representing the image - used to create TKC nodes (e.g. VirtualMachineImage). - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - repository: - description: Repository is the container image repository for Kubernetes - core images, such as kube-apiserver, kube-proxy, etc. It MUST be - a DNS-compatible name. - type: string - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - name: v1alpha3 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG, which can be used to create TanzuKubernetesCluster instances. TKRs - are immutable to end-users. They are created and managed by TKG to provide - discovery of Kubernetes releases to TKG users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - bootstrapPackages: - description: BootstrapPackages lists references to all bootstrap packages - shipped with this TKR. - items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - type: array - kubernetes: - description: Kubernetes is Kubernetes - properties: - coredns: - description: CoreDNS specifies the container image repository - and tag for coredns. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - etcd: - description: Etcd specifies the container image repository and - tag for etcd. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - imageRepository: - description: ImageRepository specifies container image registry - to pull images from. - type: string - kube-vip: - description: KubeVIP specifies the container image repository - and tag for kube-vip. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - pause: - description: Pause specifies the container image repository and - tag for pause. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - version: - description: Version is Semantic Versioning conformant version - of the Kubernetes build shipped by this TKR. The same Kubernetes - build MAY be shipped by multiple TKRs. - type: string - required: - - version - type: object - osImages: - description: OSImages lists references to all OSImage objects shipped - with this TKR. - items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - x-kubernetes-map-type: atomic - type: array - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - kubernetes - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} diff --git a/apis/run/go.mod b/apis/run/go.mod deleted file mode 100644 index ac2574c8cb..0000000000 --- a/apis/run/go.mod +++ /dev/null @@ -1,76 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/apis/run - -go 1.18 - -require ( - github.com/google/go-cmp v0.5.8 - github.com/google/gofuzz v1.2.0 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - github.com/pkg/errors v0.9.1 - github.com/stretchr/testify v1.7.1 - gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.24.2 - k8s.io/apimachinery v0.24.2 - k8s.io/kubectl v0.24.0 - sigs.k8s.io/cluster-api v1.2.8 - sigs.k8s.io/controller-runtime v0.12.3 -) - -require ( - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/logr v1.2.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/uuid v1.2.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // 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/nxadm/tail v1.4.8 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/client-go v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/apis/run/go.sum b/apis/run/go.sum deleted file mode 100644 index b10dbeba23..0000000000 --- a/apis/run/go.sum +++ /dev/null @@ -1,1057 +0,0 @@ -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e h1:GCzyKMDDjSGnlpl3clrdAK7I1AaVoaiKDOYkUzChZzg= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coredns/caddy v1.1.0 h1:ezvsPrT/tA/7pYDBZxu0cT0VmWk75AfIaf6GSYCNMf0= -github.com/coredns/corefile-migration v1.0.18 h1:zs5PJm/VGZVje1ESRj6ZqyUuVsVfagExkbLU2QKV5mI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1 h1:MQBGSZGnDwh7T/un+mzGKOMz3x+4E/GDPprWjDL+1Jg= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= -go4.org/intern v0.0.0-20211027215823-ae77deb06f29 h1:UXLjNohABv4S58tHmeuIZDO6e3mHpW2Dx33gaNt03LE= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0 h1:a06MkbcxBrEFc0w0QIZWXrH/9cCX6KJyWbBOIwAn+7A= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -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= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -inet.af/netaddr v0.0.0-20220617031823-097006376321 h1:B4dC8ySKTQXasnjDTMsoCMf1sQG4WsMej0WXaHxunmU= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/cluster-bootstrap v0.24.0 h1:MTs2x3Vfcl/PWvB5bfX7gzTFRyi4ZSbNSQgGJTCb6Sw= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -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= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/apis/run/hack/boilerplate.go.txt b/apis/run/hack/boilerplate.go.txt deleted file mode 100644 index ae7eb59485..0000000000 --- a/apis/run/hack/boilerplate.go.txt +++ /dev/null @@ -1,2 +0,0 @@ -// Copyright YEAR VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 diff --git a/apis/run/pkg/tkr/v1/bom.go b/apis/run/pkg/tkr/v1/bom.go deleted file mode 100644 index f59e6da93d..0000000000 --- a/apis/run/pkg/tkr/v1/bom.go +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1 - -import ( - "fmt" - - "github.com/pkg/errors" - "gopkg.in/yaml.v2" -) - -// Release contains the release name. -type Release struct { - Version string `yaml:"version"` -} - -// ImageConfig contains the path of the image registry -type ImageConfig struct { - ImageRepository string `yaml:"imageRepository"` -} - -// ComponentInfo contains component information -type ComponentInfo struct { - Version string `yaml:"version"` - // Each component can optionally have container images associated with it - Images map[string]ImageInfo `yaml:"images,omitempty"` - // Metadata section can be anything for the component - Metadata map[string]string `yaml:"metadata,omitempty"` -} - -// ImageInfo contains the image information -type ImageInfo struct { - ImagePath string `yaml:"imagePath"` - Tag string `yaml:"tag"` -} - -// OSInfo contains the OS information -type OSInfo struct { - Name string `yaml:"name"` - Version string `yaml:"version"` - Arch string `yaml:"arch"` -} - -// String gets a string representation of the BOM -func (os OSInfo) String() string { - return fmt.Sprintf("%s-%s-%s", os.Name, os.Version, os.Arch) -} - -// OVAInfo gets the Open Virtual Appliance (OVA) information -type OVAInfo struct { - Name string `yaml:"name"` - OSInfo - Version string `yaml:"version"` - Metadata map[string]interface{} `yaml:"metadata,omitempty"` -} - -// AMIInfo defines information about an AMI shipped -type AMIInfo struct { - ID string `yaml:"id"` - OSInfo - Metadata map[string]interface{} `yaml:"metadata,omitempty"` -} - -// AzureInfo defines information about an Azure Image shipped -type AzureInfo struct { - Sku string `yaml:"sku"` - Publisher string `yaml:"publisher"` - Offer string `yaml:"offer"` - Version string `yaml:"version"` - ThirdPartyImage bool `yaml:"thirdPartyImage,omitempty"` - Metadata map[string]interface{} `yaml:"metadata,omitempty"` - OSInfo -} - -// AzureInfos is an array of AzureInfo -type AzureInfos []AzureInfo - -// AMIInfos is a lookup of AMIInfo -type AMIInfos map[string][]AMIInfo - -// OVAInfos is an array of OVAInfo -type OVAInfos []OVAInfo - -// Addons represents map of Addons -type Addons map[string]Addon - -// ComponentReference references the images in a component -type ComponentReference struct { - ComponentRef string `yaml:"componentRef"` - ImageRefs []string `yaml:"imageRefs"` -} - -// Addon contains addon info -type Addon struct { - Category string `yaml:"category,omitempty"` - ClusterTypes []string `yaml:"clusterTypes,omitempty"` - Version string `yaml:"version,omitempty"` - TemplatesImagePath string `yaml:"templatesImagePath,omitempty"` - TemplatesImageTag string `yaml:"templatesImageTag,omitempty"` - AddonTemplatesImage []ComponentReference `yaml:"addonTemplatesImage,omitempty"` - AddonContainerImages []ComponentReference `yaml:"addonContainerImages,omitempty"` - PackageName string `yaml:"packageName,omitempty"` -} - -type ImagePathInfo struct { - ImagePath string `yaml:"imagePath"` -} - -// BomContent contains the content of a BOM file -type BomContent struct { - Release Release `yaml:"release"` - Components map[string][]ComponentInfo `yaml:"components"` - ImageConfig ImageConfig `yaml:"imageConfig"` - OVA OVAInfos `yaml:"ova"` - AMI AMIInfos `yaml:"ami,omitempty"` - Azure AzureInfos `yaml:"azure,omitempty"` - Addons Addons `yaml:"addons,omitempty"` - Compatibility ImagePathInfo `yaml:"tkr-compatibility"` -} - -// Bom represents a BOM file -type Bom struct { - bom BomContent - initialzed bool -} - -// NewBom creates a new Bom from raw data -func NewBom(content []byte) (Bom, error) { - var bc BomContent - err := yaml.Unmarshal(content, &bc) - if err != nil { - return Bom{}, errors.Wrap(err, "error parsing the BOM file content") - } - - if bc.Release.Version == "" { - return Bom{}, errors.New("bom does not contain proper release information") - } - if len(bc.Components) == 0 { - return Bom{}, errors.New("bom does not contain release component information") - } - - if bc.ImageConfig.ImageRepository == "" { - return Bom{}, errors.New("bom does not contain image repository information") - } - - return Bom{ - bom: bc, - initialzed: true, - }, nil -} - -func (b *Bom) GetCompatibility() string { - return b.bom.Compatibility.ImagePath -} - -// GetReleaseVersion gets the Tanzu release version -func (b *Bom) GetReleaseVersion() (string, error) { - if !b.initialzed { - return "", errors.New("the BOM is not initialized") - } - return b.bom.Release.Version, nil -} - -// GetComponent gets a release component -func (b *Bom) GetComponent(name string) ([]ComponentInfo, error) { - if !b.initialzed { - return []ComponentInfo{}, errors.New("the BOM is not initialized") - } - if component, ok := b.bom.Components[name]; ok { - return component, nil - } - return []ComponentInfo{}, errors.Errorf("unable to find the component %s", name) -} - -// GetImageInfo gets a image in a component of specific version. -// If version is "" or not found, get the image of the first version in the component array -func (b *Bom) GetImageInfo(componentName, componentVersion, imageName string) (ImageInfo, error) { - if !b.initialzed { - return ImageInfo{}, errors.New("the BOM is not initialized") - } - components, ok := b.bom.Components[componentName] - if !ok { - return ImageInfo{}, errors.Errorf("unable to find the component %s", componentName) - } - if len(components) < 1 { - return ImageInfo{}, errors.Errorf("Empty component list in BOM for %s", componentName) - } - - versionIndex := 0 - if componentVersion != "" { - for idx, component := range components { - if component.Version == componentVersion { - versionIndex = idx - break - } - } - } - if image, ok := components[versionIndex].Images[imageName]; ok { - return image, nil - } - return ImageInfo{}, errors.Errorf("unable to find image %s in component %s", imageName, componentName) -} - -// Components gets all release components in the BOM file -func (b *Bom) Components() (map[string][]ComponentInfo, error) { - if !b.initialzed { - return nil, errors.New("the BOM is not initialized") - } - return b.bom.Components, nil -} - -// GetImageRepository gets the image repository -func (b *Bom) GetImageRepository() (string, error) { - if !b.initialzed { - return "", errors.New("the BOM is not initialized") - } - return b.bom.ImageConfig.ImageRepository, nil -} - -// Addons gets all the addons in the BOM -func (b *Bom) Addons() (Addons, error) { - if !b.initialzed { - return nil, errors.New("the BOM is not initialized") - } - return b.bom.Addons, nil -} - -// GetAddon gets an addon info from BOM -func (b *Bom) GetAddon(name string) (Addon, error) { - if !b.initialzed { - return Addon{}, errors.New("the BOM is not initialized") - } - - if addon, ok := b.bom.Addons[name]; ok { - return addon, nil - } - - return Addon{}, errors.Errorf("unable to find the Addon %s", name) -} - -// GetAzureInfo gets azure os image info -func (b *Bom) GetAzureInfo() ([]AzureInfo, error) { - if !b.initialzed { - return nil, errors.New("the BOM is not initialized") - } - return b.bom.Azure, nil -} - -// GetAMIInfo gets ami info -func (b *Bom) GetAMIInfo() (map[string][]AMIInfo, error) { - if !b.initialzed { - return nil, errors.New("the BOM is not initialized") - } - return b.bom.AMI, nil -} - -// GetOVAInfo gets vsphere ova info -func (b *Bom) GetOVAInfo() ([]OVAInfo, error) { - if !b.initialzed { - return nil, errors.New("the BOM is not initialized") - } - return b.bom.OVA, nil -} diff --git a/apis/run/pkg/tkr/v1/bommetadata.go b/apis/run/pkg/tkr/v1/bommetadata.go deleted file mode 100644 index 47d7689b26..0000000000 --- a/apis/run/pkg/tkr/v1/bommetadata.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1 - -// ManagementClusterVersion contains kubernetes versions that are supported by the management cluster with a certain TKG version. -type ManagementClusterVersion struct { - TKGVersion string `json:"version"` - SupportedKubernetesVersions []string `json:"supportedKubernetesVersions"` -} - -// CompatibilityMetadata contains tanzu release support matrix -type CompatibilityMetadata struct { - ManagementClusterVersions []ManagementClusterVersion `json:"managementClusterVersions"` -} diff --git a/apis/run/pkg/tkr/v1/compatibility.go b/apis/run/pkg/tkr/v1/compatibility.go deleted file mode 100644 index df6c4eb114..0000000000 --- a/apis/run/pkg/tkr/v1/compatibility.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1 - -import ( - "strings" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" -) - -type Compatibility struct { - ManagementClusterVersions []ManagementClusterVersions `yaml:"managementClusterVersions"` -} - -type ManagementClusterVersions struct { - SupportedKubernetesVersions []string `yaml:"supportedKubernetesVersions"` - Version string `yaml:"version"` -} - -func NewCompatibility(data []byte) (Compatibility, error) { - var compatibility Compatibility - if err := yaml.Unmarshal(data, &compatibility); err != nil { - return Compatibility{}, errors.Wrap(err, "unable to unmarshal compatibility file data to Compatibility struct") - } - return compatibility, nil -} - -func FilterTkgVersionByTkr(compatibility Compatibility, tkrName string) (version string, err error) { - tkrVersion := strings.Replace(tkrName, "---", "+", 1) - for _, managementVersions := range compatibility.ManagementClusterVersions { - for _, supportVersion := range managementVersions.SupportedKubernetesVersions { - if supportVersion == "" { - return "", errors.New("invalid supportVersion") - } - if tkrVersion == supportVersion { - return managementVersions.Version, nil - } - } - } - return "", errors.New("there are no compatible tkg versions") -} diff --git a/apis/run/pkg/tkr/v1/doc.go b/apis/run/pkg/tkr/v1/doc.go deleted file mode 100644 index d744d12d29..0000000000 --- a/apis/run/pkg/tkr/v1/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1 defines some common types used in TKR. -package v1 diff --git a/apis/run/pkg/tkr/v1/tkgBom.go b/apis/run/pkg/tkr/v1/tkgBom.go deleted file mode 100644 index d63e47ae68..0000000000 --- a/apis/run/pkg/tkr/v1/tkgBom.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1 - -import ( - "github.com/pkg/errors" - "gopkg.in/yaml.v3" -) - -type TkgBom struct { - bom TkgBomContent - initialzed bool -} - -type imageConfig struct { - ImageRepository string `yaml:"imageRepository"` -} - -type kubeadmConfig struct { - APIVersion string `yaml:"apiVersion"` - Kind string `yaml:"kind"` - ImageRepository string `yaml:"imageRepository"` - KubernetesVersion string `yaml:"kubernetesVersion"` - Etcd etcd `yaml:"etcd"` - DNS dns `yaml:"dns"` -} - -type etcd struct { - Local *localEtcd `yaml:"local"` -} - -type localEtcd struct { - DataDir string `yaml:"dataDir"` - ImageRepository string `yaml:"imageRepository"` - ImageTag string `yaml:"imageTag"` - ExtraArgs map[string]string `yaml:"extraArgs,omitempty"` -} - -type dns struct { - Type string `yaml:"type"` - ImageRepository string `yaml:"imageRepository"` - ImageTag string `yaml:"imageTag"` -} - -type extensionInfo struct { - ClusterTypes []string `yaml:"clusterTypes"` - ManagedBy string `yaml:"managedBy"` -} - -// ReleaseInfo represents the release version information -type ReleaseInfo struct { - Version string `yaml:"version"` -} - -type defaultInfo struct { - TKRVersion string `yaml:"k8sVersion"` -} - -type tkrBOMInfo struct { - ImagePath string `yaml:"imagePath"` -} - -type tkrCompatibilityInfo struct { - ImagePath string `yaml:"imagePath"` -} - -type tkrPackageRepo struct { - AWS string `yaml:"aws"` - Azure string `yaml:"azure"` - VSphereNonparavirt string `yaml:"vsphere-nonparavirt"` -} - -type tkrPackage struct { - AWS string `yaml:"aws"` - Azure string `yaml:"azure"` - VSphereNonparavirt string `yaml:"vsphere-nonparavirt"` -} - -// TkgBomContent defines the struct to represent BOM information -type TkgBomContent struct { - Default *defaultInfo `yaml:"default"` - Release *ReleaseInfo `yaml:"release"` - Components map[string][]ComponentInfo `yaml:"components"` - KindKubeadmConfigSpec []string `yaml:"kindKubeadmConfigSpec"` - KubeadmConfigSpec *kubeadmConfig `yaml:"kubeadmConfigSpec"` - ImageConfig *imageConfig `yaml:"imageConfig"` - Extensions map[string]*extensionInfo `yaml:"extensions,omitempty"` - TKRBOM *tkrBOMInfo `yaml:"tkr-bom"` - TKRCompatibility *tkrCompatibilityInfo `yaml:"tkr-compatibility"` - TKRPackageRepo tkrPackageRepo `yaml:"tkr-package-repo"` - TKRPackage tkrPackage `yaml:"tkr-package"` -} - -// DNSAddOnType defines string identifying DNS add-on types -type DNSAddOnType string - -func NewTkgBom(data []byte) (TkgBom, error) { - var bomContent TkgBomContent - if err := yaml.Unmarshal(data, &bomContent); err != nil { - return TkgBom{}, errors.Wrap(err, "unable to unmarshal bom file data to BOMConfiguration struct") - } - - return TkgBom{ - bom: bomContent, - initialzed: true, - }, nil -} - -func (b *TkgBom) GetBomContent() (TkgBomContent, error) { - if !b.initialzed { - return TkgBomContent{}, errors.New("the tkg BOM is not initialized") - } - return b.bom, nil -} - -// nolint:revive,stylecheck -func (b *TkgBom) GetTKRPackageRepo() (tkrPackageRepo, error) { - if !b.initialzed { - return tkrPackageRepo{}, errors.New("the tkg BOM is not initialized") - } - return b.bom.TKRPackageRepo, nil -} - -// nolint:revive,stylecheck -func (b *TkgBom) GetTKRPackage() (tkrPackage, error) { - if !b.initialzed { - return tkrPackage{}, errors.New("the tkg BOM is not initialized") - } - return b.bom.TKRPackage, nil -} diff --git a/apis/run/util/clusters/clusters.go b/apis/run/util/clusters/clusters.go deleted file mode 100644 index 9d66ff8bd7..0000000000 --- a/apis/run/util/clusters/clusters.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package clusters aims to provide helper functions to be used with Cluster objects. -package clusters - -import ( - "strings" - - v1 "k8s.io/api/core/v1" - "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/conditions" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/sets" - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// AvailableUpgrades returns the available upgrade versions of the cluster -func AvailableUpgrades(cluster *v1beta1.Cluster) sets.StringSet { - updatesMsg := "" - if condition := conditions.Get(cluster, runv1.ConditionUpdatesAvailable); condition != nil && condition.Status == v1.ConditionTrue { - updatesMsg = condition.Message - } - return updatesFromConditionMessage(updatesMsg) -} - -func updatesFromConditionMessage(updatesMsg string) sets.StringSet { - if updatesMsg == "" { - return sets.Strings() - } - // Example for message - [ ]" - updates := strings.Split(strings.TrimRight(strings.TrimLeft(updatesMsg, "["), "]"), " ") - return sets.Strings(updates...) -} diff --git a/apis/run/util/conversion/README.md b/apis/run/util/conversion/README.md deleted file mode 100644 index 9285d2a543..0000000000 --- a/apis/run/util/conversion/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Conversion utilities - -The conversion utilities have been copied from cluster API and adapted, see . diff --git a/apis/run/util/conversion/conversion.go b/apis/run/util/conversion/conversion.go deleted file mode 100644 index f834f00f08..0000000000 --- a/apis/run/util/conversion/conversion.go +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package conversion implements conversion utilities. The conversion utilities have been copied from cluster API and adapted, see . -package conversion - -import ( - "encoding/json" - "math/rand" - "testing" - - "github.com/google/go-cmp/cmp" - fuzz "github.com/google/gofuzz" - "github.com/onsi/gomega" - "k8s.io/apimachinery/pkg/api/apitesting/fuzzer" - apiequality "k8s.io/apimachinery/pkg/api/equality" - metafuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/kubectl/pkg/scheme" - "sigs.k8s.io/controller-runtime/pkg/conversion" -) - -const ( - // DataAnnotation is the annotation that conversion webhooks - // use to retain the data in case of down-conversion from the hub. - DataAnnotation = "run.tanzu.vmware.com/conversion-data" -) - -// MarshalData stores the source object as json data in the destination object annotations map. -// It ignores the metadata of the source object. -func MarshalData(src, dst metav1.Object) error { - u, err := runtime.DefaultUnstructuredConverter.ToUnstructured(src) - if err != nil { - return err - } - delete(u, "metadata") - - data, err := json.Marshal(u) - if err != nil { - return err - } - annotations := dst.GetAnnotations() - if annotations == nil { - annotations = map[string]string{} - } - annotations[DataAnnotation] = string(data) - dst.SetAnnotations(annotations) - return nil -} - -// UnmarshalData tries to retrieve the data from the annotation and unmarshals it into the object passed as input. -func UnmarshalData(from metav1.Object, to interface{}) (bool, error) { - annotations := from.GetAnnotations() - data, ok := annotations[DataAnnotation] - if !ok { - return false, nil - } - if err := json.Unmarshal([]byte(data), to); err != nil { - return false, err - } - delete(annotations, DataAnnotation) - from.SetAnnotations(annotations) - return true, nil -} - -// GetFuzzer returns a new fuzzer to be used for testing. -func GetFuzzer(runtimeScheme *runtime.Scheme, funcs ...fuzzer.FuzzerFuncs) *fuzz.Fuzzer { - funcs = append([]fuzzer.FuzzerFuncs{ - metafuzzer.Funcs, - func(_ runtimeserializer.CodecFactory) []interface{} { - return []interface{}{ - // Custom fuzzer for metav1.Time pointers which weren't - // fuzzed and always resulted in `nil` values. - // This implementation is somewhat similar to the one provided - // in the metafuzzer.Funcs. - func(input *metav1.Time, c fuzz.Continue) { - if input != nil { - var sec, nsec uint32 - c.Fuzz(&sec) - c.Fuzz(&nsec) - fuzzed := metav1.Unix(int64(sec), int64(nsec)).Rfc3339Copy() - input.Time = fuzzed.Time - } - }, - } - }, - }, funcs...) - return fuzzer.FuzzerFor( - fuzzer.MergeFuzzerFuncs(funcs...), - rand.NewSource(rand.Int63()), //nolint:gosec - runtimeserializer.NewCodecFactory(runtimeScheme), - ) -} - -// FuzzTestFuncInput contains input parameters -// for the FuzzTestFunc function. -type FuzzTestFuncInput struct { - Scheme *runtime.Scheme - - Hub conversion.Hub - HubAfterMutation func(conversion.Hub) - - Spoke conversion.Convertible - SpokeAfterMutation func(convertible conversion.Convertible) - SkipSpokeAnnotationCleanup bool - - FuzzerFuncs []fuzzer.FuzzerFuncs -} - -// FuzzTestFunc returns a new testing function to be used in tests to make sure conversions between -// the Hub version of an object and an older version aren't lossy. -func FuzzTestFunc(input *FuzzTestFuncInput) func(*testing.T) { - if input.Scheme == nil { - input.Scheme = scheme.Scheme - } - - return func(t *testing.T) { - t.Helper() - t.Run("spoke-hub-spoke", func(t *testing.T) { - g := gomega.NewWithT(t) - fuzzr := GetFuzzer(input.Scheme, input.FuzzerFuncs...) - - for i := 0; i < 10000; i++ { - // Create the spoke and fuzz it - spokeBefore := input.Spoke.DeepCopyObject().(conversion.Convertible) - fuzzr.Fuzz(spokeBefore) - - // First convert spoke to hub - hubCopy := input.Hub.DeepCopyObject().(conversion.Hub) - g.Expect(spokeBefore.ConvertTo(hubCopy)).To(gomega.Succeed()) - - // Convert hub back to spoke and check if the resulting spoke is equal to the spoke before the round trip - spokeAfter := input.Spoke.DeepCopyObject().(conversion.Convertible) - g.Expect(spokeAfter.ConvertFrom(hubCopy)).To(gomega.Succeed()) - - // Remove data annotation eventually added by ConvertFrom for avoiding data loss in hub-spoke-hub round trips - // NOTE: There are use case when we want to skip this operation, e.g. if the spoke object does not have ObjectMeta (e.g. kubeadm types). - if !input.SkipSpokeAnnotationCleanup { - metaAfter := spokeAfter.(metav1.Object) - delete(metaAfter.GetAnnotations(), DataAnnotation) - } - - if input.SpokeAfterMutation != nil { - input.SpokeAfterMutation(spokeAfter) - } - - g.Expect(apiequality.Semantic.DeepEqual(spokeBefore, spokeAfter)).To(gomega.BeTrue(), cmp.Diff(spokeBefore, spokeAfter)) - } - }) - t.Run("hub-spoke-hub", func(t *testing.T) { - g := gomega.NewWithT(t) - fuzzr := GetFuzzer(input.Scheme, input.FuzzerFuncs...) - - for i := 0; i < 10000; i++ { - // Create the hub and fuzz it - hubBefore := input.Hub.DeepCopyObject().(conversion.Hub) - fuzzr.Fuzz(hubBefore) - - // First convert hub to spoke - dstCopy := input.Spoke.DeepCopyObject().(conversion.Convertible) - g.Expect(dstCopy.ConvertFrom(hubBefore)).To(gomega.Succeed()) - - // Convert spoke back to hub and check if the resulting hub is equal to the hub before the round trip - hubAfter := input.Hub.DeepCopyObject().(conversion.Hub) - g.Expect(dstCopy.ConvertTo(hubAfter)).To(gomega.Succeed()) - - if input.HubAfterMutation != nil { - input.HubAfterMutation(hubAfter) - } - - // Remove data annotation eventually added by ConvertFrom for avoiding data loss in hub-spoke-hub round trips - // NOTE: There are use case when we want to skip this operation, e.g. if the spoke object does not have ObjectMeta (e.g. kubeadm types). - if !input.SkipSpokeAnnotationCleanup { - metaAfter := hubAfter.(metav1.Object) - delete(metaAfter.GetAnnotations(), DataAnnotation) - - metaBefore := hubBefore.(metav1.Object) - if metaBefore.GetAnnotations() == nil { - metaBefore.SetAnnotations(map[string]string{}) - } - } - - g.Expect(apiequality.Semantic.DeepEqual(hubBefore, hubAfter)).To(gomega.BeTrue(), cmp.Diff(hubBefore, hubAfter)) - } - }) - } -} diff --git a/apis/run/util/conversion/conversion_test.go b/apis/run/util/conversion/conversion_test.go deleted file mode 100644 index aef2371727..0000000000 --- a/apis/run/util/conversion/conversion_test.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package conversion - -import ( - "testing" - - . "github.com/onsi/gomega" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" - - v1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -var ( - oldTanzuKubernetesReleaseGVK = schema.GroupVersionKind{ - Group: v1alpha3.GroupVersion.Group, - Version: "v1old", - Kind: "TanzuKubernetesRelease", - } -) - -func TestMarshalData(t *testing.T) { - g := NewWithT(t) - - t.Run("should write source object to destination", func(t *testing.T) { - version := "v1.22.6" - src := &v1alpha3.TanzuKubernetesRelease{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-1", - Labels: map[string]string{ - "label1": "", - }, - }, - Spec: v1alpha3.TanzuKubernetesReleaseSpec{ - Version: version, - Kubernetes: v1alpha3.KubernetesSpec{ - Version: version, - ImageRepository: "spec.kubernetes.imageRepository", - }, - }, - } - - dst := &unstructured.Unstructured{} - dst.SetGroupVersionKind(oldTanzuKubernetesReleaseGVK) - dst.SetName("test-1") - - g.Expect(MarshalData(src, dst)).To(Succeed()) - // ensure the src object is not modified - g.Expect(src.GetLabels()).ToNot(BeEmpty()) - - g.Expect(dst.GetAnnotations()[DataAnnotation]).ToNot(BeEmpty()) - g.Expect(dst.GetAnnotations()[DataAnnotation]).To(ContainSubstring("spec.kubernetes.imageRepository")) - g.Expect(dst.GetAnnotations()[DataAnnotation]).To(ContainSubstring("v1.22.6")) - - g.Expect(dst.GetAnnotations()[DataAnnotation]).ToNot(ContainSubstring("metadata")) - g.Expect(dst.GetAnnotations()[DataAnnotation]).ToNot(ContainSubstring("label1")) - }) - - t.Run("should append the annotation", func(t *testing.T) { - src := &v1alpha3.TanzuKubernetesRelease{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-1", - }, - } - dst := &unstructured.Unstructured{} - dst.SetGroupVersionKind(v1alpha3.GroupVersion.WithKind("TanzuKubernetesRelease")) - dst.SetName("test-1") - dst.SetAnnotations(map[string]string{ - "annotation": "1", - }) - - g.Expect(MarshalData(src, dst)).To(Succeed()) - g.Expect(len(dst.GetAnnotations())).To(Equal(2)) - }) -} - -func TestUnmarshalData(t *testing.T) { - g := NewWithT(t) - - t.Run("should return false without errors if annotation doesn't exist", func(t *testing.T) { - src := &v1alpha3.TanzuKubernetesRelease{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-1", - }, - } - dst := &unstructured.Unstructured{} - dst.SetGroupVersionKind(oldTanzuKubernetesReleaseGVK) - dst.SetName("test-1") - - ok, err := UnmarshalData(src, dst) - g.Expect(ok).To(BeFalse()) - g.Expect(err).To(BeNil()) - }) - - t.Run("should return true when a valid annotation with data exists", func(t *testing.T) { - src := &unstructured.Unstructured{} - src.SetGroupVersionKind(oldTanzuKubernetesReleaseGVK) - src.SetName("test-1") - src.SetAnnotations(map[string]string{ - DataAnnotation: "{\"metadata\":{\"name\":\"test-1\",\"creationTimestamp\":null,\"labels\":{\"label1\":\"\"}},\"spec\":{\"bootstrapPackages\":[{\"name\":\"BP\"}],\"kubernetes\":{\"coredns\":{\"imageRepository\":\"9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě\",\"imageTag\":\"Eĺ垦婽Ô驽伕WƇ|q`1老縜\"},\"etcd\":{\"imageRepository\":\"9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě\",\"imageTag\":\"Eĺ垦婽Ô驽伕WƇ|q`1老縜\"},\"imageRepository\":\"辑\",\"pause\":{\"imageRepository\":\"9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě\",\"imageTag\":\"Eĺ垦婽Ô驽伕WƇ|q`1老縜\"},\"version\":\"ìd/i涇u趗\\\\庰鏜\"},\"osImages\":[{\"name\":\"F\"}],\"version\":\"#ʼnƈOƕʘ賡谒湪ȥ#4\"},\"status\":{\"conditions\":[{\"lastTransitionTime\":null,\"severity\":\"=Ĩ[塻QfĈQ鸀ð猲虘\",\"status\":\"7犃蘹燡~ȥ囹烝Y秽#\",\"type\":\"ŭVɮǔ恴n-禷Ţ焆輦ƹ(4`\"}]}}", - }) - - dst := &v1alpha3.TanzuKubernetesRelease{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-1", - }, - } - - ok, err := UnmarshalData(src, dst) - g.Expect(err).To(BeNil()) - g.Expect(ok).To(BeTrue()) - - g.Expect(len(dst.GetLabels())).To(Equal(1)) - g.Expect(dst.GetName()).To(Equal("test-1")) - g.Expect(dst.GetLabels()).To(HaveKeyWithValue("label1", "")) - g.Expect(dst.GetAnnotations()).To(BeEmpty()) - }) - - t.Run("should clean the annotation on successful unmarshal", func(t *testing.T) { - src := &unstructured.Unstructured{} - src.SetGroupVersionKind(oldTanzuKubernetesReleaseGVK) - src.SetName("test-1") - src.SetAnnotations(map[string]string{ - "annotation-1": "", - DataAnnotation: "{\"metadata\":{\"name\":\"test-1\",\"creationTimestamp\":null,\"labels\":{\"label1\":\"\"}},\"spec\":{\"bootstrapPackages\":[{\"name\":\"BP\"}],\"kubernetes\":{\"coredns\":{\"imageRepository\":\"9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě\",\"imageTag\":\"Eĺ垦婽Ô驽伕WƇ|q`1老縜\"},\"etcd\":{\"imageRepository\":\"9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě\",\"imageTag\":\"Eĺ垦婽Ô驽伕WƇ|q`1老縜\"},\"imageRepository\":\"辑\",\"pause\":{\"imageRepository\":\"9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě\",\"imageTag\":\"Eĺ垦婽Ô驽伕WƇ|q`1老縜\"},\"version\":\"ìd/i涇u趗\\\\庰鏜\"},\"osImages\":[{\"name\":\"F\"}],\"version\":\"#ʼnƈOƕʘ賡谒湪ȥ#4\"},\"status\":{\"conditions\":[{\"lastTransitionTime\":null,\"severity\":\"=Ĩ[塻QfĈQ鸀ð猲虘\",\"status\":\"7犃蘹燡~ȥ囹烝Y秽#\",\"type\":\"ŭVɮǔ恴n-禷Ţ焆輦ƹ(4`\"}]}}", - }) - - dst := &v1alpha3.TanzuKubernetesRelease{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-1", - }, - } - - ok, err := UnmarshalData(src, dst) - g.Expect(err).To(BeNil()) - g.Expect(ok).To(BeTrue()) - - g.Expect(src.GetAnnotations()).ToNot(HaveKey(DataAnnotation)) - g.Expect(len(src.GetAnnotations())).To(Equal(1)) - }) -} diff --git a/apis/run/util/sets/strings.go b/apis/run/util/sets/strings.go deleted file mode 100644 index 1f6ed100e0..0000000000 --- a/apis/run/util/sets/strings.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package sets provides sets of different types, e.g. StringSet. -package sets - -type StringSet map[string]struct{} - -func Strings(ss ...string) StringSet { - r := make(StringSet, len(ss)) - return r.Add(ss...) -} - -func (set StringSet) Add(ss ...string) StringSet { - for _, s := range ss { - set[s] = struct{}{} - } - return set -} - -func (set StringSet) Remove(ss ...string) StringSet { - for _, s := range ss { - delete(set, s) - } - return set -} - -func (set StringSet) Has(s string) bool { - _, has := set[s] - return has -} - -func (set StringSet) Intersect(others ...StringSet) StringSet { - return set.Filter(func(s string) bool { - for _, other := range others { - if !other.Has(s) { - return false - } - } - return true - }) -} - -func (set StringSet) Map(f func(s string) string) StringSet { - r := make(StringSet, len(set)) - for s := range set { - r[f(s)] = struct{}{} - } - return r -} - -func (set StringSet) Filter(f func(s string) bool) StringSet { - r := make(StringSet, len(set)) - for s := range set { - if f(s) { - r[s] = struct{}{} - } - } - return r -} - -func (set StringSet) Union(sets ...StringSet) StringSet { - sets = append(sets, set) - sizeBound := 0 - for _, aSet := range sets { - sizeBound += len(aSet) - } - r := make(StringSet, sizeBound) - for _, aSet := range sets { - for s := range aSet { - r[s] = struct{}{} - } - } - return r -} - -func (set StringSet) Slice() []string { - r := make([]string, len(set)) - i := 0 - for key := range set { - r[i] = key - i++ - } - return r -} diff --git a/apis/run/util/version/compatibility.go b/apis/run/util/version/compatibility.go deleted file mode 100644 index 3d5b6583ed..0000000000 --- a/apis/run/util/version/compatibility.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package version - -import ( - "context" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/sets" -) - -type Compatibility interface { - CompatibleVersions(ctx context.Context) (sets.StringSet, error) -} diff --git a/apis/run/util/version/fuzz.go b/apis/run/util/version/fuzz.go deleted file mode 100644 index 9f92b8941a..0000000000 --- a/apis/run/util/version/fuzz.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package version - -import ( - "fmt" - "strings" - - fuzz "github.com/google/gofuzz" - "k8s.io/apimachinery/pkg/util/rand" -) - -// Fuzz fuzzes the passed version. -func Fuzz(v *Version, _ fuzz.Continue) { - major := rand.Intn(3) - minor := rand.Intn(50) - patch := rand.Intn(30) - var ss []string - bmCount := rand.Intn(3) - for i := 0; i < bmCount; i++ { - ss = append(ss, fmt.Sprintf("%s.%v", rand.String(rand.IntnRange(3, 10)), rand.IntnRange(1, 5))) - } - buildMeta := strings.Join(ss, "-") - vString := strings.TrimSuffix(fmt.Sprintf("%v.%v.%v+%s", major, minor, patch, buildMeta), "+") - vNew, _ := ParseSemantic(vString) - *v = *vNew -} diff --git a/apis/run/util/version/version.go b/apis/run/util/version/version.go deleted file mode 100644 index 1a8797f33a..0000000000 --- a/apis/run/util/version/version.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package version provides utility types and functions to work with SemVer versions. -package version - -import ( - "strconv" - "strings" - "unicode" - - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/labels" - utilversion "k8s.io/apimachinery/pkg/util/version" -) - -// Version is a structured representation of a SemVer version string (including build metadata). -type Version struct { - version *utilversion.Version - buildMetadata BuildMetadata -} - -func (v *Version) String() string { - return "v" + v.version.String() -} - -// ParseSemantic constructs a structured representation of a semantic version string including build metadata, -// producing comparable structural representation. -func ParseSemantic(s string) (*Version, error) { - version, err := utilversion.ParseSemantic(s) - if err != nil { - return nil, errors.Wrapf(err, "parsing semantic version from string '%s'", s) - } - buildMetadata := ParseBuildMetadata(version.BuildMetadata()) - - return &Version{version: version, buildMetadata: buildMetadata}, err -} - -// LessThan compares Version to other Version. Returns true if this Version represents a less recent -// version based on comparisons of both Versions' SemVer versioning components and build metadata. -func (v *Version) LessThan(other *Version) bool { - if other == nil { - return false - } - if v == nil { - return true - } - - if other.version.LessThan(v.version) { - return false - } - if v.version.LessThan(other.version) { - return true - } - - return v.buildMetadata.LessThan(other.buildMetadata) -} - -// Major returns the major release number. -func (v *Version) Major() uint { - return v.version.Major() -} - -// Minor returns the minor release number. -func (v *Version) Minor() uint { - return v.version.Minor() -} - -// BuildMetadata is a structured representation of build metadata in a SemVer version string -// (the part after '+' in "+vmware.1-..."). -type BuildMetadata []string - -// ParseBuildMetadata creates BuildMetadata from a SemVer version string representation of build metadata -// (the part after '+' in "+vmware.1-..."). -func ParseBuildMetadata(s string) BuildMetadata { - var result BuildMetadata - for s != "" { - sepIndex := strings.IndexFunc(s, func(r rune) bool { - return !unicode.IsLetter(r) && !unicode.IsDigit(r) - }) - if sepIndex == 0 { - sepIndex = 1 - } - if sepIndex == -1 { - sepIndex = len(s) - } - result = append(result, s[:sepIndex]) - s = s[sepIndex:] - } - - return result -} - -// LessThan compares BuildMetadata to other BuildMetadata. Returns true if this BuildMetadata represents a less recent -// build based on numeric (if possible) and alphanumeric comparison of build metadata components. -func (bm BuildMetadata) LessThan(other BuildMetadata) bool { - if len(other) == 0 { - return false - } - if len(bm) == 0 { - return true - } - - if bm[0] == other[0] { - return bm[1:].LessThan(other[1:]) - } - - if bm0num, err := strconv.ParseInt(bm[0], 16, 0); err == nil { - if other0num, err := strconv.ParseInt(other[0], 16, 0); err == nil { - return bm0num < other0num - } - } - - return bm[0] < other[0] -} - -// Prefixes returns the set of all possible version prefixes for a version string, including itself. -// Both label and SemVer formats are supported. -// E.g. for "v1.17.9---vmware.2" the result is: -// {"v1.17.9---vmware.2": "", "v1.17.9---vmware": "", "v1.17.9": "", "v1.17": "", "v1": ""} -func Prefixes(v string) labels.Set { - result := labels.Set{} - for ; v != ""; v = strings.TrimRightFunc(v, vSuffix()) { - result[v] = "" - } - return result -} - -func vSuffix() func(rune) bool { - inDelimiter := false - return func(r rune) bool { - if !inDelimiter { - if unicode.IsLetter(r) || unicode.IsDigit(r) { - return true - } - inDelimiter = true - return true - } - if unicode.IsLetter(r) || unicode.IsDigit(r) { - return false - } - return true - } -} - -var plusReplacer = strings.NewReplacer("+", "---") - -// Label converts version string in SemVer format to label format. -func Label(v string) string { - return "v" + plusReplacer.Replace(strings.TrimPrefix(v, "v")) -} - -var dashReplacer = strings.NewReplacer("---", "+") - -// FromLabel converts label name to version string in SemVer format. -func FromLabel(label string) string { - return "v" + dashReplacer.Replace(strings.TrimPrefix(label, "v")) -} - -// WithV makes sure 'v' is prepended to the version string. -func WithV(s string) string { - if strings.HasPrefix(s, "v") { - return s - } - return "v" + s -} diff --git a/apis/run/util/version/version_test.go b/apis/run/util/version/version_test.go deleted file mode 100644 index ed8142642a..0000000000 --- a/apis/run/util/version/version_test.go +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package version - -import ( - "fmt" - "strings" - "testing" - - fuzz "github.com/google/gofuzz" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "k8s.io/apimachinery/pkg/labels" -) - -func TestUtilVersionUnit(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "util/version Unit Tests") -} - -var _ = Describe("ParseSemantic()", func() { - When("given an invalid semver string", func() { - It("should return an error", func() { - v, err := ParseSemantic("covfefe") - Expect(err).To(HaveOccurred()) - Expect(v).To(BeNil()) - }) - }) - When("given a valid semver string", func() { - It("should parse it and return a non-nil *Version", func() { - v, err := ParseSemantic("1.16.2+vmware.1-tkg.1.cafebabe") - Expect(err).ToNot(HaveOccurred()) - Expect(v).ToNot(BeNil()) - }) - }) -}) - -var _ = Describe("Version", func() { - Context("v.LessThan(other)", func() { - var v, other *Version - BeforeEach(func() { - v, other = nil, nil - }) - - When("v is nil, other is nil", func() { - It("should return false", func() { - Expect(v.LessThan(other)).To(BeFalse()) - }) - }) - - When("v is nil, other is not nil", func() { - BeforeEach(func() { - other, _ = ParseSemantic("1.16.2+vmware.1-tkg.1.cafebabe") - Expect(other).ToNot(BeNil()) - }) - - It("should return true", func() { - Expect(v.LessThan(other)).To(BeTrue()) - }) - }) - - When("v is not nil, other is nil", func() { - BeforeEach(func() { - v, _ = ParseSemantic("1.16.2+vmware.1-tkg.1.cafebabe") - Expect(v).ToNot(BeNil()) - }) - - It("should return false", func() { - Expect(v.LessThan(nil)).To(BeFalse()) - }) - }) - - When("v is not nil, other is not nil", func() { - When("the v version part is lower", func() { - BeforeEach(func() { - v, _ = ParseSemantic("1.16.1+vmware.1-tkg.1.cafebabe") - other, _ = ParseSemantic("1.16.2+vmware.1-tkg.1.cafebabe") - Expect(v.version).ToNot(BeNil()) - Expect(other.version).ToNot(BeNil()) - Expect(v.version.LessThan(other.version)).To(BeTrue()) - }) - - It("should return true", func() { - Expect(v.LessThan(other)).To(BeTrue()) - }) - }) - - When("the v version part is higher", func() { - BeforeEach(func() { - v, _ = ParseSemantic("1.16.2+vmware.1-tkg.1.cafebabe") - other, _ = ParseSemantic("1.16.1+vmware.1-tkg.1.cafebabe") - Expect(v.version).ToNot(BeNil()) - Expect(other.version).ToNot(BeNil()) - Expect(other.version.LessThan(v.version)).To(BeTrue()) - }) - - It("should return false", func() { - Expect(v.LessThan(other)).To(BeFalse()) - }) - }) - - When("the v version part is the same", func() { - When("the v build metadata part is lower", func() { - BeforeEach(func() { - v, _ = ParseSemantic("1.16.2+vmware.1-tkg.2.ab123fed") - other, _ = ParseSemantic("1.16.2+vmware.2-tkg.2.ab123fed") - Expect(v.version).ToNot(BeNil()) - Expect(other.version).ToNot(BeNil()) - Expect(v.version.LessThan(other.version)).To(BeFalse()) - Expect(other.version.LessThan(v.version)).To(BeFalse()) - }) - - It("should return true", func() { - Expect(v.LessThan(other)).To(BeTrue()) - }) - }) - - When("the v build metadata part is lower, comparing strings", func() { - BeforeEach(func() { - v, _ = ParseSemantic("1.16.2+vmware.2-tkg.2.covfefe") - other, _ = ParseSemantic("1.16.2+vmware.2-tkg.2.covfefe1") - Expect(v.version).ToNot(BeNil()) - Expect(other.version).ToNot(BeNil()) - Expect(v.version.LessThan(other.version)).To(BeFalse()) - Expect(other.version.LessThan(v.version)).To(BeFalse()) - }) - - It("should return true", func() { - Expect(v.LessThan(other)).To(BeTrue()) - }) - }) - }) - }) - }) -}) - -var _ = Describe("BuildMetadata", func() { - bms1 := "vmware.1-tkg.2.ab123fed" - bms2 := "vmware.2-tkg.2.fed98bef" - - Context("ParseBuildMetadata()", func() { - It("should parse the string into a slice of parts and separators", func() { - Expect(ParseBuildMetadata(bms1)).To(Equal(BuildMetadata{"vmware", ".", "1", "-", "tkg", ".", "2", ".", "ab123fed"})) - Expect(ParseBuildMetadata(bms2)).To(Equal(BuildMetadata{"vmware", ".", "2", "-", "tkg", ".", "2", ".", "fed98bef"})) - }) - }) - - Context(".LessThan()", func() { - var x, y BuildMetadata - BeforeEach(func() { - x, y = nil, nil - }) - - It(fmt.Sprintf("'%s' should be less than '%s'", bms1, bms2), func() { - bm1 := ParseBuildMetadata(bms1) - bm2 := ParseBuildMetadata(bms2) - - Expect(bm1.LessThan(bm2)).To(BeTrue()) - }) - - It("x is empty, y is empty, should return false", func() { - Expect(x.LessThan(y)).To(BeFalse()) - }) - It("x is not empty, y is empty, should return false", func() { - x = BuildMetadata{"vmware", ".", "1"} - Expect(x.LessThan(y)).To(BeFalse()) - }) - It("x is empty, y is not empty, should return true", func() { - y = BuildMetadata{"vmware", ".", "1"} - Expect(x.LessThan(y)).To(BeTrue()) - }) - - It("compare - < .", func() { - Expect(strings.Compare("-", ".") < 0).To(BeTrue()) - Expect(strings.Compare("-", "123") < 0).To(BeTrue()) - Expect(strings.Compare(".", "123") < 0).To(BeTrue()) - Expect(strings.Compare("-", "abc") < 0).To(BeTrue()) - Expect(strings.Compare(".", "abc") < 0).To(BeTrue()) - Expect(strings.Compare(".", "-") < 0).To(BeFalse()) - }) - - When("x is not empty, y is not empty", func() { - When("x is a prefix of y", func() { - BeforeEach(func() { - x = BuildMetadata{"vmware", "."} - y = BuildMetadata{"vmware", ".", "1"} - }) - - It("should return true", func() { - Expect(x.LessThan(y)).To(BeTrue()) - }) - }) - }) - }) -}) - -var _ = Describe("Prefixes()", func() { - const vLabel = "v1.17.9---vmware.2-tkg.3" - - expectedPrefixLabels := labels.Set{ - "v1.17.9---vmware.2-tkg.3": "", - "v1.17.9---vmware.2-tkg": "", - "v1.17.9---vmware.2": "", - "v1.17.9---vmware": "", - "v1.17.9": "", - "v1.17": "", - "v1": "", - } - - It("should return all version prefixes of a version label", func() { - Expect(Prefixes(vLabel)).To(Equal(expectedPrefixLabels)) - }) -}) - -var _ = Describe("Label()", func() { - It("Produces a label string for a version", func() { - v := "1.22.0+vmware.1-tkg.3" - Expect(Label(v)).To(Equal("v1.22.0---vmware.1-tkg.3")) - }) -}) - -var _ = Describe("Fuzz()", func() { - fuzzer := fuzz.New().Funcs(Fuzz) - - repeat(1000, func() { - It("produces a randomized *Version", func() { - v := &Version{} - fuzzer.Fuzz(v) - vString := v.String() - Expect(v.version).ToNot(BeNil()) - Expect(vString).To(HavePrefix("v")) - }) - }) -}) - -func repeat(times int, f func()) { - for i := 0; i < times; i++ { - f() - } -} diff --git a/apis/run/v1alpha1/capability_types.go b/apis/run/v1alpha1/capability_types.go deleted file mode 100644 index d9115036b1..0000000000 --- a/apis/run/v1alpha1/capability_types.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// CapabilitySpec defines the desired state of Capability. -type CapabilitySpec struct { - // ServiceAccountName is the name of the service account with which requests - // are made to the API server for evaluating queries. - // Service account should exist in the same namespace as this resource. - // When this field is not specified, a default service account with only the - // ability to execute GVR queries is used. - // +optional - ServiceAccountName string `json:"serviceAccountName"` - // Queries specifies set of queries that are evaluated. - // +listType=map - // +listMapKey=name - Queries []Query `json:"queries"` -} - -// Query is a logical grouping of GVR, Object and PartialSchema queries. -type Query struct { - // Name is the unique name of the query. - // +kubebuilder:validation:Required - // +kubebuilder:validation:MinLength:=1 - Name string `json:"name"` - // GroupVersionResources evaluates a slice of GVR queries. - // +listType=map - // +listMapKey=name - // +optional - GroupVersionResources []QueryGVR `json:"groupVersionResources,omitempty"` - // Objects evaluates a slice of Object queries. - // +listType=map - // +listMapKey=name - // +optional - Objects []QueryObject `json:"objects,omitempty"` - // PartialSchemas evaluates a slice of PartialSchema queries. - // +listType=map - // +listMapKey=name - // +optional - PartialSchemas []QueryPartialSchema `json:"partialSchemas,omitempty"` -} - -// QueryObject represents any runtime.Object that could exist in a cluster with the ability to check for annotations. -type QueryObject struct { - // Name is the unique name of the query. - // +kubebuilder:validation:Required - // +kubebuilder:validation:MinLength:=1 - Name string `json:"name"` - // ObjectReference is the ObjectReference to check for in the cluster. - // +kubebuilder:validation:Required - ObjectReference corev1.ObjectReference `json:"objectReference"` - // WithAnnotations are the annotations whose presence is checked in the object. - // The query succeeds only if all the annotations specified exists. - // +optional - WithAnnotations map[string]string `json:"withAnnotations,omitempty"` - // WithAnnotations are the annotations whose absence is checked in the object. - // The query succeeds only if all the annotations specified do not exist. - // +optional - WithoutAnnotations map[string]string `json:"withoutAnnotations,omitempty"` -} - -// QueryGVR queries for an API group with the optional ability to check for API versions and resource. -type QueryGVR struct { - // Name is the unique name of the query. - // +kubebuilder:validation:Required - // +kubebuilder:validation:MinLength:=1 - Name string `json:"name"` - // Group is the API group to check for in the cluster. - // +optional - Group string `json:"group"` - // Versions is the slice of versions to check for in the specified API group. - // +optional - Versions []string `json:"versions,omitempty"` - // Resource is the API resource to check for given an API group and a slice of versions. - // Specifying a Resource requires at least one version to be specified in Versions. - // +optional - Resource string `json:"resource,omitempty"` -} - -// QueryPartialSchema queries for any OpenAPI schema that may exist on a cluster. -type QueryPartialSchema struct { - // Name is the unique name of the query. - // +kubebuilder:validation:Required - // +kubebuilder:validation:MinLength:=1 - Name string `json:"name"` - // PartialSchema is the partial OpenAPI schema that will be matched in a cluster. - // +kubebuilder:validation:Required - // +kubebuilder:validation:MinLength:=1 - PartialSchema string `json:"partialSchema"` -} - -// CapabilityStatus defines the observed state of Capability -type CapabilityStatus struct { - // Results represents the results of all the queries specified in the spec. - // +listType=map - // +listMapKey=name - Results []Result `json:"results"` -} - -// QueryResult represents the result of a single query. -type QueryResult struct { - // Name is the name of the query in spec whose result this struct represents. - // +kubebuilder:validation:Required - // +kubebuilder:validation:MinLength:=1 - Name string `json:"name"` - // Found is a boolean which indicates if the query condition succeeded. - // +optional - Found bool `json:"found"` - // Error indicates if an error occurred while processing the query. - // +optional - Error bool `json:"error,omitempty"` - // ErrorDetail represents the error detail, if an error occurred. - // +optional - ErrorDetail string `json:"errorDetail,omitempty"` - // NotFoundReason provides the reason if the query condition fails. - // This is non-empty when Found is false. - // +optional - NotFoundReason string `json:"notFoundReason,omitempty"` -} - -// Result represents the results of queries in Query. -type Result struct { - // Name is the unique name of the query. - // +kubebuilder:validation:Required - // +kubebuilder:validation:MinLength:=1 - Name string `json:"name"` - // GroupVersionResources represents results of GVR queries in spec. - // +listType=map - // +listMapKey=name - // +optional - GroupVersionResources []QueryResult `json:"groupVersionResources,omitempty"` - // Objects represents results of Object queries in spec. - // +listType=map - // +listMapKey=name - // +optional - Objects []QueryResult `json:"objects,omitempty"` - // PartialSchemas represents results of PartialSchema queries in spec. - // +listType=map - // +listMapKey=name - // +optional - PartialSchemas []QueryResult `json:"partialSchemas,omitempty"` -} - -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status -//+kubebuilder:deprecatedversion:warning="Capability API in run.tanzu.vmware.com is deprecated. Use Capability API from core.tanzu.vmware.com instead" - -// Capability is the Schema for the capabilities API -type Capability struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - // Spec is the capability spec that has cluster queries. - Spec CapabilitySpec `json:"spec,omitempty"` - // Status is the capability status that has results of cluster queries. - Status CapabilityStatus `json:"status,omitempty"` -} - -//+kubebuilder:object:root=true - -// CapabilityList contains a list of Capability -type CapabilityList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []Capability `json:"items"` -} - -func init() { - SchemeBuilder.Register(&Capability{}, &CapabilityList{}) -} diff --git a/apis/run/v1alpha1/conversion.go b/apis/run/v1alpha1/conversion.go deleted file mode 100644 index 66389aed0d..0000000000 --- a/apis/run/v1alpha1/conversion.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - corev1 "k8s.io/api/core/v1" - apiconversion "k8s.io/apimachinery/pkg/conversion" - "sigs.k8s.io/controller-runtime/pkg/conversion" - - utilconversion "github.com/vmware-tanzu/tanzu-framework/apis/run/util/conversion" - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/version" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -const ( - etcdContainerImageName = "etcd" - corednsContainerImageName = "coredns" - pauseContainerImageName = "pause" - kubeVipContainerImageName = "kube-vip" -) - -func (spoke *TanzuKubernetesRelease) ConvertTo(hubRaw conversion.Hub) error { - hub := hubRaw.(*v1alpha3.TanzuKubernetesRelease) - - if err := autoConvert_v1alpha1_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(spoke, hub, nil); err != nil { - return err - } - - // Some Hub types not present in spoke, and might be stored in spoke annotations. - // Restore data stored in spoke's annotations. - restoredHub := &v1alpha3.TanzuKubernetesRelease{} - if ok, err := utilconversion.UnmarshalData(spoke, restoredHub); err != nil { - return err - } else if ok { - // OK means there is data in annotations that need to be restored. - hub.Spec.BootstrapPackages = restoredHub.Spec.BootstrapPackages - hub.Spec.OSImages = restoredHub.Spec.OSImages - } - - // Store the entire spoke in Hub's annotations to prevent loss of incompatible spoke types. - if err := utilconversion.MarshalData(spoke, hub); err != nil { - return err - } - - return nil -} - -//nolint:stylecheck // Much easier to read when the receiver is named as spoke/src/dest. -func (spoke *TanzuKubernetesRelease) ConvertFrom(hubRaw conversion.Hub) error { - hub := hubRaw.(*v1alpha3.TanzuKubernetesRelease) - - if err := autoConvert_v1alpha3_TanzuKubernetesRelease_To_v1alpha1_TanzuKubernetesRelease(hub, spoke, nil); err != nil { - return err - } - - // From hub, get missing spoke fields from annotations. - restored := &TanzuKubernetesRelease{} - if ok, err := utilconversion.UnmarshalData(hub, restored); err != nil { - return err - } else if ok { - // Annotations contain data, restore the relevant ones. - spoke.Spec.Version = restored.Spec.Version - spoke.Spec.KubernetesVersion = restored.Spec.KubernetesVersion - spoke.Spec.NodeImageRef = restored.Spec.NodeImageRef - if restored.Spec.Images != nil { - spoke.Spec.Images = restored.Spec.Images - } - } - - // Store hub's missing fields in spoke's annotations. - if err := utilconversion.MarshalData(hub, spoke); err != nil { - return err - } - - return nil -} - -// Convert_v1alpha1_TanzuKubernetesReleaseSpec_To_v1alpha3_TanzuKubernetesReleaseSpec will convert the compatible types in TanzuKubernetesReleaseSpec v1alpha1 to v1alpha3 equivalent. -// nolint:revive,stylecheck // Generated conversion stubs have underscores in function names. -func Convert_v1alpha1_TanzuKubernetesReleaseSpec_To_v1alpha3_TanzuKubernetesReleaseSpec(in *TanzuKubernetesReleaseSpec, out *v1alpha3.TanzuKubernetesReleaseSpec, s apiconversion.Scope) error { - out.Version = version.WithV(in.Version) - out.Kubernetes.Version = version.WithV(in.KubernetesVersion) - out.Kubernetes.ImageRepository = in.Repository - if in.NodeImageRef != nil { - out.OSImages = []corev1.LocalObjectReference{{Name: in.NodeImageRef.Name}} - } - - // Transform the container images. - for index, image := range in.Images { - switch in.Images[index].Name { - case etcdContainerImageName: - out.Kubernetes.Etcd = &v1alpha3.ContainerImageInfo{ - ImageRepository: image.Repository, - ImageTag: image.Tag, - } - case pauseContainerImageName: - out.Kubernetes.Pause = &v1alpha3.ContainerImageInfo{ - ImageRepository: image.Repository, - ImageTag: image.Tag, - } - case corednsContainerImageName: - out.Kubernetes.CoreDNS = &v1alpha3.ContainerImageInfo{ - ImageRepository: image.Repository, - ImageTag: image.Tag, - } - case kubeVipContainerImageName: - out.Kubernetes.KubeVIP = &v1alpha3.ContainerImageInfo{ - ImageRepository: image.Repository, - ImageTag: image.Tag, - } - default: - break - } - } - - return nil -} - -// Convert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha1_TanzuKubernetesReleaseSpec will convert the compatible types in TanzuKubernetesReleaseSpec v1alpha3 to v1alpha1 equivalent. -// nolint:revive,stylecheck // Generated conversion stubs have underscores in function names. -func Convert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha1_TanzuKubernetesReleaseSpec(in *v1alpha3.TanzuKubernetesReleaseSpec, out *TanzuKubernetesReleaseSpec, s apiconversion.Scope) error { - out.KubernetesVersion = in.Kubernetes.Version - out.Repository = in.Kubernetes.ImageRepository - for _, osImageRef := range in.OSImages { - out.NodeImageRef = &corev1.ObjectReference{Name: osImageRef.Name} - break // can only convert the first osImageRef to nodeImageRef - } - - // Transform the containerimages. - // Container images are completely restored from the annotations later. - // This is to handle the scenario when there are no annotations present. - if in.Kubernetes.Etcd != nil { - out.Images = append(out.Images, ContainerImage{ - Name: etcdContainerImageName, - Repository: in.Kubernetes.Etcd.ImageRepository, - Tag: in.Kubernetes.Etcd.ImageTag, - }) - } - if in.Kubernetes.CoreDNS != nil { - out.Images = append(out.Images, ContainerImage{ - Name: corednsContainerImageName, - Repository: in.Kubernetes.CoreDNS.ImageRepository, - Tag: in.Kubernetes.CoreDNS.ImageTag, - }) - } - if in.Kubernetes.Pause != nil { - out.Images = append(out.Images, ContainerImage{ - Name: pauseContainerImageName, - Repository: in.Kubernetes.Pause.ImageRepository, - Tag: in.Kubernetes.Pause.ImageTag, - }) - } - if in.Kubernetes.KubeVIP != nil { - out.Images = append(out.Images, ContainerImage{ - Name: kubeVipContainerImageName, - Repository: in.Kubernetes.KubeVIP.ImageRepository, - Tag: in.Kubernetes.KubeVIP.ImageTag, - }) - } - return autoConvert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha1_TanzuKubernetesReleaseSpec(in, out, s) -} - -func (src *TanzuKubernetesReleaseList) ConvertTo(dstRaw conversion.Hub) error { - dst := dstRaw.(*v1alpha3.TanzuKubernetesReleaseList) - - return Convert_v1alpha1_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList(src, dst, nil) -} - -//nolint:revive,stylecheck // Much easier to read when the receiver is named as spoke/src/dest. -func (dst *TanzuKubernetesReleaseList) ConvertFrom(srcRaw conversion.Hub) error { - src := srcRaw.(*v1alpha3.TanzuKubernetesReleaseList) - - return autoConvert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha1_TanzuKubernetesReleaseList(src, dst, nil) -} diff --git a/apis/run/v1alpha1/conversion_test.go b/apis/run/v1alpha1/conversion_test.go deleted file mode 100644 index d1fccafff9..0000000000 --- a/apis/run/v1alpha1/conversion_test.go +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "testing" - - "github.com/google/go-cmp/cmp" - . "github.com/onsi/gomega" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/apitesting/fuzzer" - apiequality "k8s.io/apimachinery/pkg/api/equality" - serializer "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/kubectl/pkg/scheme" - v1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - - utilconversion "github.com/vmware-tanzu/tanzu-framework/apis/run/util/conversion" - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/version" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -func TestConversion(t *testing.T) { - t.Run("for TanzuKubernetesRelease", utilconversion.FuzzTestFunc(&utilconversion.FuzzTestFuncInput{ - Hub: &v1alpha3.TanzuKubernetesRelease{}, - Spoke: &TanzuKubernetesRelease{}, - FuzzerFuncs: []fuzzer.FuzzerFuncs{ - func(_ serializer.CodecFactory) []interface{} { - return []interface{}{v1alpha3.FuzzTKRSpec, v1alpha3.FuzzTKRSpecKubernetes, version.Fuzz} - }, - }, - })) - - // Add other types here in future -} - -func TestConvertNodeImageRef(t *testing.T) { - g := NewWithT(t) - fuzzr := utilconversion.GetFuzzer(scheme.Scheme, func(_ serializer.CodecFactory) []interface{} { - return []interface{}{FuzzTKRSpec, v1alpha3.FuzzTKRSpec, v1alpha3.FuzzTKRSpecKubernetes, version.Fuzz} - }) - - repeat(1000, func() { - tkrOrig := &TanzuKubernetesRelease{} - fuzzr.Fuzz(tkrOrig) - nodeImageRefs := ptrAsSliceForObjectReference(tkrOrig.Spec.NodeImageRef) - - tkrV1a3 := &v1alpha3.TanzuKubernetesRelease{} - g.Expect(tkrOrig.ConvertTo(tkrV1a3)).To(Succeed()) - - g.Expect(tkrV1a3.Spec.OSImages).To(HaveLen(len(nodeImageRefs))) - for i, nodeImageRef := range nodeImageRefs { - g.Expect(nodeImageRef.Name).To(Equal(tkrV1a3.Spec.OSImages[i].Name)) - } - }) - - repeat(1000, func() { - tkrV1a3 := &v1alpha3.TanzuKubernetesRelease{} - fuzzr.Fuzz(tkrV1a3) - - tkrConverted := &TanzuKubernetesRelease{} - g.Expect(tkrConverted.ConvertFrom(tkrV1a3)).To(Succeed()) - - nodeImageRefs := ptrAsSliceForObjectReference(tkrConverted.Spec.NodeImageRef) - g.Expect(len(nodeImageRefs) == 0).To(Equal(len(tkrV1a3.Spec.OSImages) == 0), - "nodeImageRef should be set iff there's at least 1 osImage") - for i, nodeImageRef := range nodeImageRefs { - g.Expect(nodeImageRef.Name).To(Equal(tkrV1a3.Spec.OSImages[i].Name)) - } - }) -} - -func repeat(times int, f func()) { - for i := 0; i < times; i++ { - f() - } -} - -func ptrAsSliceForObjectReference(ptr *v1.ObjectReference) []v1.ObjectReference { - if ptr == nil { - return nil - } - return []v1.ObjectReference{*ptr} -} - -// TestHubSpokeHub covers scenarios where all the slice fields are set, there is an off-chance that the fuzz conversion does not cover this. -func TestHubSpokeHub(t *testing.T) { - t.Run("for TanzuKubernetesRelease", func(t *testing.T) { - hub := &v1alpha3.TanzuKubernetesRelease{ - Spec: v1alpha3.TanzuKubernetesReleaseSpec{ - Version: "v#ʼnƈOƕʘ賡谒湪ȥ#4", - Kubernetes: v1alpha3.KubernetesSpec{ - Version: `vìd/i涇u趗\庰鏜`, - ImageRepository: "辑", - Etcd: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - Pause: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - CoreDNS: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - KubeVIP: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - }, - OSImages: []v1.LocalObjectReference{{ - Name: "F", - }}, - BootstrapPackages: []v1.LocalObjectReference{{ - Name: "BP", - }}, - }, - Status: v1alpha3.TanzuKubernetesReleaseStatus{Conditions: []v1beta1.Condition{{Type: "ŭVɮǔ恴n-禷Ţ焆輦ƹ(4`", Status: "7犃蘹燡~ȥ囹烝Y秽#", Severity: "=Ĩ[塻QfĈQ鸀ð猲虘"}}}} - - t.Run("hub-spoke-hub", func(t *testing.T) { - g := NewWithT(t) - hubBefore := hub - - // First convert hub to spoke - dstCopy := &TanzuKubernetesRelease{} - g.Expect(dstCopy.ConvertFrom(hubBefore)).To(Succeed()) - - // Convert spoke back to hub and check if the resulting hub is equal to the hub before the round trip - hubAfter := &v1alpha3.TanzuKubernetesRelease{} - g.Expect(dstCopy.ConvertTo(hubAfter)).To(Succeed()) - - // The hub doesn't start with annotations, so the comparison will fail. - // To avoid this, we copy over the annotations from after the round-trip into the initial hub. - hubBefore.ObjectMeta.Annotations = hubAfter.ObjectMeta.Annotations - - g.Expect(apiequality.Semantic.DeepEqual(hubBefore, hubAfter)).To(BeTrue(), cmp.Diff(hubBefore, hubAfter)) - }) - }) -} - -// TestRoundTripWithMultiplePauseImagesInSpoke covers a specific scenario where there can be multiple pause images in v1alpha1, and all of them should be preserved after a round-trip. -func TestRoundTripWithMultiplePauseImagesInSpoke(t *testing.T) { - t.Run("for TanzuKubernetesRelease", func(t *testing.T) { - spoke := &TanzuKubernetesRelease{ - Spec: TanzuKubernetesReleaseSpec{ - Version: "#ʼnƈOƕʘ賡谒湪ȥ#4", - KubernetesVersion: `ìd/i涇u趗\庰鏜`, - Repository: "辑", - Images: []ContainerImage{ - { - Name: "pause", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6-windows-amd64", - }, - { - Name: "pause", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6", - }, - { - Name: "coredns", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6-coredns", - }, - { - Name: "coredns", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6-coredns-foo", - }, - { - Name: "etcd", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6-etcd", - }, - { - Name: "etcd", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6-etcd-foo", - }, - }, - }, - } - - t.Run("spoke-hub-spoke", func(t *testing.T) { - g := NewWithT(t) - spokeBefore := spoke - - // First convert spoke to hub - hub := &v1alpha3.TanzuKubernetesRelease{} - g.Expect(spokeBefore.ConvertTo(hub)).To(Succeed()) - - // Convert hub back to spoke - spokeAfter := &TanzuKubernetesRelease{} - g.Expect(spokeAfter.ConvertFrom(hub)).To(Succeed()) - - // The spoke at the beginning doesn't start with annotations. - // For the comparison to pass, we need to either remove the annotations, or copy them into the spoke reference from before conversion. - // Here we're doing the latter. - spokeBefore.ObjectMeta.Annotations = spokeAfter.ObjectMeta.Annotations - - // check if the post-covnersion spoke is equal to the spoke before the round trip. - g.Expect(apiequality.Semantic.DeepEqual(spokeBefore, spokeAfter)).To(BeTrue(), cmp.Diff(spokeBefore, spokeAfter)) - }) - }) -} - -// TODO: Add a UT for hub - spoke with no annotations. -func TestContainerImagesConversionFromSpokeToHubWithNoAnnotations(t *testing.T) { - t.Run("for TanzuKubernetesRelease", func(t *testing.T) { - hub := &v1alpha3.TanzuKubernetesRelease{ - Spec: v1alpha3.TanzuKubernetesReleaseSpec{ - Version: "v#ʼnƈOƕʘ賡谒湪ȥ#4", - Kubernetes: v1alpha3.KubernetesSpec{ - Version: `vìd/i涇u趗\庰鏜`, - ImageRepository: "辑", - Etcd: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - Pause: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - CoreDNS: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - KubeVIP: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - }, - OSImages: []v1.LocalObjectReference{{ - Name: "F", - }}, - BootstrapPackages: []v1.LocalObjectReference{{ - Name: "BP", - }}, - }, - } - - expectedSpoke := &TanzuKubernetesRelease{ - Spec: TanzuKubernetesReleaseSpec{ - Version: "v#ʼnƈOƕʘ賡谒湪ȥ#4", // prefixed with `v` coming from v1alpha3 - KubernetesVersion: `vìd/i涇u趗\庰鏜`, // prefixed with `v` coming from v1alpha3 - Repository: "辑", - Images: []ContainerImage{ - { - Name: "etcd", - Repository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - Tag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - { - Name: "coredns", - Repository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - Tag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - { - Name: "pause", - Repository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - Tag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - { - Name: "kube-vip", - Repository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - Tag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - }, - NodeImageRef: &v1.ObjectReference{Name: "F"}, - }, - } - - t.Run("hub-spoke", func(t *testing.T) { - g := NewWithT(t) - hubBefore := hub - - // Convert from hub to spoke. - dstCopy := &TanzuKubernetesRelease{} - g.Expect(dstCopy.ConvertFrom(hubBefore)).To(Succeed()) - - // Sync annotations in expected and real. - expectedSpoke.ObjectMeta.Annotations = dstCopy.ObjectMeta.Annotations - - g.Expect(apiequality.Semantic.DeepEqual(expectedSpoke, dstCopy)).To(BeTrue(), cmp.Diff(expectedSpoke, dstCopy)) - }) - }) -} diff --git a/apis/run/v1alpha1/doc.go b/apis/run/v1alpha1/doc.go deleted file mode 100644 index 1b555aac5a..0000000000 --- a/apis/run/v1alpha1/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 contains the v1alpha1 API implementation. -// +groupName=run.tanzu.vmware.com -// +k8s:deepcopy-gen=package -// +k8s:conversion-gen=github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3 -package v1alpha1 diff --git a/apis/run/v1alpha1/fuzz.go b/apis/run/v1alpha1/fuzz.go deleted file mode 100644 index ee17172e25..0000000000 --- a/apis/run/v1alpha1/fuzz.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - fuzz "github.com/google/gofuzz" - corev1 "k8s.io/api/core/v1" -) - -func FuzzTKRSpec(tkrSpec *TanzuKubernetesReleaseSpec, c fuzz.Continue) { - c.Fuzz(&tkrSpec.Version) - c.Fuzz(&tkrSpec.KubernetesVersion) - c.Fuzz(&tkrSpec.Repository) - c.Fuzz(&tkrSpec.Images) - tkrSpec.NodeImageRef = nil - if c.RandBool() { - tkrSpec.NodeImageRef = &corev1.ObjectReference{Name: c.RandString()} - } -} diff --git a/apis/run/v1alpha1/groupversion_info.go b/apis/run/v1alpha1/groupversion_info.go deleted file mode 100644 index ea09ef2a38..0000000000 --- a/apis/run/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 contains API Schema definitions for the run v1alpha1 API group -// +kubebuilder:object:generate=true -// +groupName=run.tanzu.vmware.com -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "run.tanzu.vmware.com", Version: "v1alpha1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme - - localSchemeBuilder = SchemeBuilder.SchemeBuilder -) diff --git a/apis/run/v1alpha1/tanzukubernetesrelease_conversion_test.go b/apis/run/v1alpha1/tanzukubernetesrelease_conversion_test.go deleted file mode 100644 index 616924a31d..0000000000 --- a/apis/run/v1alpha1/tanzukubernetesrelease_conversion_test.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestConvertTo(t *testing.T) { - assert := assert.New(t) - - ci := ContainerImage{ - Repository: "repo", - Name: "nginx", - Tag: "1.2.3", - } - - assert.Equal(ci.String(), "repo/nginx:1.2.3") -} diff --git a/apis/run/v1alpha1/tanzukubernetesrelease_types.go b/apis/run/v1alpha1/tanzukubernetesrelease_types.go deleted file mode 100644 index 1941a2deec..0000000000 --- a/apis/run/v1alpha1/tanzukubernetesrelease_types.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" -) - -const ( - // ConditionCompatible indicates the condition is compatible. - ConditionCompatible = "Compatible" - - // ConditionUpdatesAvailable indicates the condition is an updates is available. - ConditionUpdatesAvailable = "UpdatesAvailable" - - // ConditionUpgradeAvailable (deprecated) indicates the condition is an updates is available. - ConditionUpgradeAvailable = "UpgradeAvailable" -) - -// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. - -// TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease -type TanzuKubernetesReleaseSpec struct { - // Version is the fully qualified Semantic Versioning conformant version of the TanzuKubernetesRelease. - // Version MUST be unique across all TanzuKubernetesRelease objects. - Version string `json:"version"` - - // KubernetesVersion is the fully qualified Semantic Versioning conformant version of Kubernetes shipped by this TKR. - // The same KubernetesVersion MAY be shipped by different TKRs. - // +optional - KubernetesVersion string `json:"kubernetesVersion,omitempty"` - - // Repository is the container image repository for Kubernetes core images, such as kube-apiserver, kube-proxy, etc. - // It MUST be a DNS-compatible name. - // +optional - Repository string `json:"repository,omitempty"` - - // Images is the list of (other than Kubernetes core) essential container images shipped by this TKR (e.g. coredns, etcd). - // +optional - Images []ContainerImage `json:"images,omitempty"` - - // NodeImageRef refers to an object representing the image used to create TKC nodes (e.g. VirtualMachineImage). - // +optional - NodeImageRef *corev1.ObjectReference `json:"nodeImageRef,omitempty"` -} - -// TanzuKubernetesReleaseStatus defines the observed state of TanzuKubernetesRelease -type TanzuKubernetesReleaseStatus struct { - Conditions []clusterv1.Condition `json:"conditions,omitempty"` -} - -// ContainerImage is a struct representing a single fully qualified container image name, constructed as -// `{Repository}/{Name}:{Tag}`. -type ContainerImage struct { - // Repository is the container image repository used by this image. It MUST be a DNS-compatible name. - // +optional - Repository string `json:"repository,omitempty"` - - // Name is the container image name without the repository prefix. - // It MUST be a valid URI path, MAY contain zero or more '/', and SHOULD NOT start or end with '/'. - Name string `json:"name"` - - // Tag is the container image version tag. It is the suffix coming after ':' in a fully qualified image name. - // +optional - Tag string `json:"tag,omitempty"` -} - -func (ci ContainerImage) String() string { - var prefix, suffix string - if ci.Repository != "" { - prefix = ci.Repository + "/" - } - if ci.Tag != "" { - suffix = ":" + ci.Tag - } - return prefix + ci.Name + suffix -} - -// +kubebuilder:object:root=true - -// TanzuKubernetesRelease is the schema for the tanzukubernetesreleases API. -// TanzuKubernetesRelease objects represent Kubernetes releases available via TKG, which can be used to create -// TanzuKubernetesCluster instances. TKRs are immutable to end-users. They are created and managed by TKG to -// provide discovery of Kubernetes releases to TKG users. -// -// +kubebuilder:object:root=true -// +kubebuilder:resource:path=tanzukubernetesreleases,scope=Cluster,shortName=tkr -// +kubebuilder:storageversion -// +kubebuilder:subresource:status -// +kubebuilder:printcolumn:name="Version",type=string,JSONPath=.spec.version -// +kubebuilder:printcolumn:name="Compatible",type=string,JSONPath=.status.conditions[?(@.type=='Compatible')].status -// +kubebuilder:printcolumn:name="Created",type="date",JSONPath=.metadata.creationTimestamp -type TanzuKubernetesRelease struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec TanzuKubernetesReleaseSpec `json:"spec,omitempty"` - Status TanzuKubernetesReleaseStatus `json:"status,omitempty"` -} - -// GetConditions implements capi conditions Getter interface -func (r *TanzuKubernetesRelease) GetConditions() clusterv1.Conditions { - return r.Status.Conditions -} - -// SetConditions implements capi conditions Setter interface -func (r *TanzuKubernetesRelease) SetConditions(conditions clusterv1.Conditions) { - r.Status.Conditions = conditions -} - -// +kubebuilder:object:root=true - -// TanzuKubernetesReleaseList contains a list of TanzuKubernetesRelease -type TanzuKubernetesReleaseList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []TanzuKubernetesRelease `json:"items"` -} - -func init() { - SchemeBuilder.Register(&TanzuKubernetesRelease{}, &TanzuKubernetesReleaseList{}) -} diff --git a/apis/run/v1alpha1/tanzukubernetesrelease_types_test.go b/apis/run/v1alpha1/tanzukubernetesrelease_types_test.go deleted file mode 100644 index 1ca70dac02..0000000000 --- a/apis/run/v1alpha1/tanzukubernetesrelease_types_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestContainerImageString(t *testing.T) { - assert := assert.New(t) - - ci := ContainerImage{ - Repository: "repo", - Name: "nginx", - Tag: "1.2.3", - } - - assert.Equal(ci.String(), "repo/nginx:1.2.3") -} - -func TestContainerImageString_Tagless(t *testing.T) { - assert := assert.New(t) - - ci := ContainerImage{ - Repository: "repo", - Name: "nginx", - } - - assert.Equal(ci.String(), "repo/nginx") -} - -func TestContainerImageString_Repoless(t *testing.T) { - assert := assert.New(t) - - ci := ContainerImage{ - Name: "nginx", - Tag: "1.2.3", - } - - assert.Equal(ci.String(), "nginx:1.2.3") -} diff --git a/apis/run/v1alpha1/upgrade/phase.go b/apis/run/v1alpha1/upgrade/phase.go deleted file mode 100644 index a188fffcca..0000000000 --- a/apis/run/v1alpha1/upgrade/phase.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package upgrade contains upgrade related api structs -package upgrade - -// Phase defines upgrade phase of a cluster -type Phase string - -// Upgrade phase constants -const ( - Init Phase = "" - ControlPlane Phase = "ControlPlane" - WorkerPlane Phase = "WorkerPlane" - Success Phase = "Success" -) diff --git a/apis/run/v1alpha1/zz_generated.conversion.go b/apis/run/v1alpha1/zz_generated.conversion.go deleted file mode 100644 index 1c0625dd81..0000000000 --- a/apis/run/v1alpha1/zz_generated.conversion.go +++ /dev/null @@ -1,180 +0,0 @@ -//go:build !ignore_autogenerated_core -// +build !ignore_autogenerated_core - -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by conversion-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - unsafe "unsafe" - - conversion "k8s.io/apimachinery/pkg/conversion" - runtime "k8s.io/apimachinery/pkg/runtime" - v1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - - v1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -func init() { - localSchemeBuilder.Register(RegisterConversions) -} - -// RegisterConversions adds conversion functions to the given scheme. -// Public to allow building arbitrary schemes. -func RegisterConversions(s *runtime.Scheme) error { - if err := s.AddGeneratedConversionFunc((*TanzuKubernetesRelease)(nil), (*v1alpha3.TanzuKubernetesRelease)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(a.(*TanzuKubernetesRelease), b.(*v1alpha3.TanzuKubernetesRelease), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.TanzuKubernetesRelease)(nil), (*TanzuKubernetesRelease)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_TanzuKubernetesRelease_To_v1alpha1_TanzuKubernetesRelease(a.(*v1alpha3.TanzuKubernetesRelease), b.(*TanzuKubernetesRelease), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*TanzuKubernetesReleaseList)(nil), (*v1alpha3.TanzuKubernetesReleaseList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList(a.(*TanzuKubernetesReleaseList), b.(*v1alpha3.TanzuKubernetesReleaseList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.TanzuKubernetesReleaseList)(nil), (*TanzuKubernetesReleaseList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha1_TanzuKubernetesReleaseList(a.(*v1alpha3.TanzuKubernetesReleaseList), b.(*TanzuKubernetesReleaseList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*TanzuKubernetesReleaseStatus)(nil), (*v1alpha3.TanzuKubernetesReleaseStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus(a.(*TanzuKubernetesReleaseStatus), b.(*v1alpha3.TanzuKubernetesReleaseStatus), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.TanzuKubernetesReleaseStatus)(nil), (*TanzuKubernetesReleaseStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha1_TanzuKubernetesReleaseStatus(a.(*v1alpha3.TanzuKubernetesReleaseStatus), b.(*TanzuKubernetesReleaseStatus), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*TanzuKubernetesReleaseSpec)(nil), (*v1alpha3.TanzuKubernetesReleaseSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_TanzuKubernetesReleaseSpec_To_v1alpha3_TanzuKubernetesReleaseSpec(a.(*TanzuKubernetesReleaseSpec), b.(*v1alpha3.TanzuKubernetesReleaseSpec), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*v1alpha3.TanzuKubernetesReleaseSpec)(nil), (*TanzuKubernetesReleaseSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha1_TanzuKubernetesReleaseSpec(a.(*v1alpha3.TanzuKubernetesReleaseSpec), b.(*TanzuKubernetesReleaseSpec), scope) - }); err != nil { - return err - } - return nil -} - -func autoConvert_v1alpha1_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(in *TanzuKubernetesRelease, out *v1alpha3.TanzuKubernetesRelease, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - if err := Convert_v1alpha1_TanzuKubernetesReleaseSpec_To_v1alpha3_TanzuKubernetesReleaseSpec(&in.Spec, &out.Spec, s); err != nil { - return err - } - if err := Convert_v1alpha1_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus(&in.Status, &out.Status, s); err != nil { - return err - } - return nil -} - -// Convert_v1alpha1_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease is an autogenerated conversion function. -func Convert_v1alpha1_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(in *TanzuKubernetesRelease, out *v1alpha3.TanzuKubernetesRelease, s conversion.Scope) error { - return autoConvert_v1alpha1_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(in, out, s) -} - -func autoConvert_v1alpha3_TanzuKubernetesRelease_To_v1alpha1_TanzuKubernetesRelease(in *v1alpha3.TanzuKubernetesRelease, out *TanzuKubernetesRelease, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - if err := Convert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha1_TanzuKubernetesReleaseSpec(&in.Spec, &out.Spec, s); err != nil { - return err - } - if err := Convert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha1_TanzuKubernetesReleaseStatus(&in.Status, &out.Status, s); err != nil { - return err - } - return nil -} - -// Convert_v1alpha3_TanzuKubernetesRelease_To_v1alpha1_TanzuKubernetesRelease is an autogenerated conversion function. -func Convert_v1alpha3_TanzuKubernetesRelease_To_v1alpha1_TanzuKubernetesRelease(in *v1alpha3.TanzuKubernetesRelease, out *TanzuKubernetesRelease, s conversion.Scope) error { - return autoConvert_v1alpha3_TanzuKubernetesRelease_To_v1alpha1_TanzuKubernetesRelease(in, out, s) -} - -func autoConvert_v1alpha1_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList(in *TanzuKubernetesReleaseList, out *v1alpha3.TanzuKubernetesReleaseList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]v1alpha3.TanzuKubernetesRelease, len(*in)) - for i := range *in { - if err := Convert_v1alpha1_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } - return nil -} - -// Convert_v1alpha1_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList is an autogenerated conversion function. -func Convert_v1alpha1_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList(in *TanzuKubernetesReleaseList, out *v1alpha3.TanzuKubernetesReleaseList, s conversion.Scope) error { - return autoConvert_v1alpha1_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList(in, out, s) -} - -func autoConvert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha1_TanzuKubernetesReleaseList(in *v1alpha3.TanzuKubernetesReleaseList, out *TanzuKubernetesReleaseList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]TanzuKubernetesRelease, len(*in)) - for i := range *in { - if err := Convert_v1alpha3_TanzuKubernetesRelease_To_v1alpha1_TanzuKubernetesRelease(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } - return nil -} - -// Convert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha1_TanzuKubernetesReleaseList is an autogenerated conversion function. -func Convert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha1_TanzuKubernetesReleaseList(in *v1alpha3.TanzuKubernetesReleaseList, out *TanzuKubernetesReleaseList, s conversion.Scope) error { - return autoConvert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha1_TanzuKubernetesReleaseList(in, out, s) -} - -func autoConvert_v1alpha1_TanzuKubernetesReleaseSpec_To_v1alpha3_TanzuKubernetesReleaseSpec(in *TanzuKubernetesReleaseSpec, out *v1alpha3.TanzuKubernetesReleaseSpec, s conversion.Scope) error { - out.Version = in.Version - // WARNING: in.KubernetesVersion requires manual conversion: does not exist in peer-type - // WARNING: in.Repository requires manual conversion: does not exist in peer-type - // WARNING: in.Images requires manual conversion: does not exist in peer-type - // WARNING: in.NodeImageRef requires manual conversion: does not exist in peer-type - return nil -} - -func autoConvert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha1_TanzuKubernetesReleaseSpec(in *v1alpha3.TanzuKubernetesReleaseSpec, out *TanzuKubernetesReleaseSpec, s conversion.Scope) error { - out.Version = in.Version - // WARNING: in.Kubernetes requires manual conversion: does not exist in peer-type - // WARNING: in.OSImages requires manual conversion: does not exist in peer-type - // WARNING: in.BootstrapPackages requires manual conversion: does not exist in peer-type - return nil -} - -func autoConvert_v1alpha1_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus(in *TanzuKubernetesReleaseStatus, out *v1alpha3.TanzuKubernetesReleaseStatus, s conversion.Scope) error { - out.Conditions = *(*[]v1beta1.Condition)(unsafe.Pointer(&in.Conditions)) - return nil -} - -// Convert_v1alpha1_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus is an autogenerated conversion function. -func Convert_v1alpha1_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus(in *TanzuKubernetesReleaseStatus, out *v1alpha3.TanzuKubernetesReleaseStatus, s conversion.Scope) error { - return autoConvert_v1alpha1_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus(in, out, s) -} - -func autoConvert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha1_TanzuKubernetesReleaseStatus(in *v1alpha3.TanzuKubernetesReleaseStatus, out *TanzuKubernetesReleaseStatus, s conversion.Scope) error { - out.Conditions = *(*[]v1beta1.Condition)(unsafe.Pointer(&in.Conditions)) - return nil -} - -// Convert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha1_TanzuKubernetesReleaseStatus is an autogenerated conversion function. -func Convert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha1_TanzuKubernetesReleaseStatus(in *v1alpha3.TanzuKubernetesReleaseStatus, out *TanzuKubernetesReleaseStatus, s conversion.Scope) error { - return autoConvert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha1_TanzuKubernetesReleaseStatus(in, out, s) -} diff --git a/apis/run/v1alpha1/zz_generated.deepcopy.go b/apis/run/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 4d0324cc8e..0000000000 --- a/apis/run/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,383 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/cluster-api/api/v1beta1" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Capability) DeepCopyInto(out *Capability) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Capability. -func (in *Capability) DeepCopy() *Capability { - if in == nil { - return nil - } - out := new(Capability) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Capability) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CapabilityList) DeepCopyInto(out *CapabilityList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Capability, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CapabilityList. -func (in *CapabilityList) DeepCopy() *CapabilityList { - if in == nil { - return nil - } - out := new(CapabilityList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *CapabilityList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CapabilitySpec) DeepCopyInto(out *CapabilitySpec) { - *out = *in - if in.Queries != nil { - in, out := &in.Queries, &out.Queries - *out = make([]Query, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CapabilitySpec. -func (in *CapabilitySpec) DeepCopy() *CapabilitySpec { - if in == nil { - return nil - } - out := new(CapabilitySpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CapabilityStatus) DeepCopyInto(out *CapabilityStatus) { - *out = *in - if in.Results != nil { - in, out := &in.Results, &out.Results - *out = make([]Result, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CapabilityStatus. -func (in *CapabilityStatus) DeepCopy() *CapabilityStatus { - if in == nil { - return nil - } - out := new(CapabilityStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ContainerImage) DeepCopyInto(out *ContainerImage) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerImage. -func (in *ContainerImage) DeepCopy() *ContainerImage { - if in == nil { - return nil - } - out := new(ContainerImage) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Query) DeepCopyInto(out *Query) { - *out = *in - if in.GroupVersionResources != nil { - in, out := &in.GroupVersionResources, &out.GroupVersionResources - *out = make([]QueryGVR, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Objects != nil { - in, out := &in.Objects, &out.Objects - *out = make([]QueryObject, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.PartialSchemas != nil { - in, out := &in.PartialSchemas, &out.PartialSchemas - *out = make([]QueryPartialSchema, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Query. -func (in *Query) DeepCopy() *Query { - if in == nil { - return nil - } - out := new(Query) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *QueryGVR) DeepCopyInto(out *QueryGVR) { - *out = *in - if in.Versions != nil { - in, out := &in.Versions, &out.Versions - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryGVR. -func (in *QueryGVR) DeepCopy() *QueryGVR { - if in == nil { - return nil - } - out := new(QueryGVR) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *QueryObject) DeepCopyInto(out *QueryObject) { - *out = *in - out.ObjectReference = in.ObjectReference - if in.WithAnnotations != nil { - in, out := &in.WithAnnotations, &out.WithAnnotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.WithoutAnnotations != nil { - in, out := &in.WithoutAnnotations, &out.WithoutAnnotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryObject. -func (in *QueryObject) DeepCopy() *QueryObject { - if in == nil { - return nil - } - out := new(QueryObject) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *QueryPartialSchema) DeepCopyInto(out *QueryPartialSchema) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryPartialSchema. -func (in *QueryPartialSchema) DeepCopy() *QueryPartialSchema { - if in == nil { - return nil - } - out := new(QueryPartialSchema) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *QueryResult) DeepCopyInto(out *QueryResult) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QueryResult. -func (in *QueryResult) DeepCopy() *QueryResult { - if in == nil { - return nil - } - out := new(QueryResult) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Result) DeepCopyInto(out *Result) { - *out = *in - if in.GroupVersionResources != nil { - in, out := &in.GroupVersionResources, &out.GroupVersionResources - *out = make([]QueryResult, len(*in)) - copy(*out, *in) - } - if in.Objects != nil { - in, out := &in.Objects, &out.Objects - *out = make([]QueryResult, len(*in)) - copy(*out, *in) - } - if in.PartialSchemas != nil { - in, out := &in.PartialSchemas, &out.PartialSchemas - *out = make([]QueryResult, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Result. -func (in *Result) DeepCopy() *Result { - if in == nil { - return nil - } - out := new(Result) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesRelease) DeepCopyInto(out *TanzuKubernetesRelease) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesRelease. -func (in *TanzuKubernetesRelease) DeepCopy() *TanzuKubernetesRelease { - if in == nil { - return nil - } - out := new(TanzuKubernetesRelease) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TanzuKubernetesRelease) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesReleaseList) DeepCopyInto(out *TanzuKubernetesReleaseList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]TanzuKubernetesRelease, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesReleaseList. -func (in *TanzuKubernetesReleaseList) DeepCopy() *TanzuKubernetesReleaseList { - if in == nil { - return nil - } - out := new(TanzuKubernetesReleaseList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TanzuKubernetesReleaseList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesReleaseSpec) DeepCopyInto(out *TanzuKubernetesReleaseSpec) { - *out = *in - if in.Images != nil { - in, out := &in.Images, &out.Images - *out = make([]ContainerImage, len(*in)) - copy(*out, *in) - } - if in.NodeImageRef != nil { - in, out := &in.NodeImageRef, &out.NodeImageRef - *out = new(v1.ObjectReference) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesReleaseSpec. -func (in *TanzuKubernetesReleaseSpec) DeepCopy() *TanzuKubernetesReleaseSpec { - if in == nil { - return nil - } - out := new(TanzuKubernetesReleaseSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesReleaseStatus) DeepCopyInto(out *TanzuKubernetesReleaseStatus) { - *out = *in - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]v1beta1.Condition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesReleaseStatus. -func (in *TanzuKubernetesReleaseStatus) DeepCopy() *TanzuKubernetesReleaseStatus { - if in == nil { - return nil - } - out := new(TanzuKubernetesReleaseStatus) - in.DeepCopyInto(out) - return out -} diff --git a/apis/run/v1alpha2/conversion.go b/apis/run/v1alpha2/conversion.go deleted file mode 100644 index e5f6c01948..0000000000 --- a/apis/run/v1alpha2/conversion.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha2 - -import ( - corev1 "k8s.io/api/core/v1" - apiconversion "k8s.io/apimachinery/pkg/conversion" - "sigs.k8s.io/controller-runtime/pkg/conversion" - - utilconversion "github.com/vmware-tanzu/tanzu-framework/apis/run/util/conversion" - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/version" - v1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -const ( - etcdContainerImageName = "etcd" - corednsContainerImageName = "coredns" - pauseContainerImageName = "pause" - kubeVipContainerImageName = "kube-vip" -) - -func (spoke *TanzuKubernetesRelease) ConvertTo(hubRaw conversion.Hub) error { - hub := hubRaw.(*v1alpha3.TanzuKubernetesRelease) - - if err := autoConvert_v1alpha2_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(spoke, hub, nil); err != nil { - return err - } - - // Some Hub types not present in spoke, and might be stored in spoke annotations. - // Restore data stored in spoke's annotations. - restoredHub := &v1alpha3.TanzuKubernetesRelease{} - if ok, err := utilconversion.UnmarshalData(spoke, restoredHub); err != nil { - return err - } else if ok { - // OK means there is data in annotations that need to be restored. - hub.Spec.BootstrapPackages = restoredHub.Spec.BootstrapPackages - hub.Spec.OSImages = restoredHub.Spec.OSImages - } - - // Store the entire spoke in Hub's annotations to prevent loss of incompatible spoke types. - if err := utilconversion.MarshalData(spoke, hub); err != nil { - return err - } - - return nil -} - -//nolint:stylecheck // Much easier to read when the receiver is named as spoke/src/dest. -func (spoke *TanzuKubernetesRelease) ConvertFrom(hubRaw conversion.Hub) error { - hub := hubRaw.(*v1alpha3.TanzuKubernetesRelease) - - if err := autoConvert_v1alpha3_TanzuKubernetesRelease_To_v1alpha2_TanzuKubernetesRelease(hub, spoke, nil); err != nil { - return err - } - - // From hub, get missing spoke fields from annotations. - restored := &TanzuKubernetesRelease{} - if ok, err := utilconversion.UnmarshalData(hub, restored); err != nil { - return err - } else if ok { - // Annotations contain data, restore the relevant ones. - spoke.Spec.Version = restored.Spec.Version - spoke.Spec.KubernetesVersion = restored.Spec.KubernetesVersion - spoke.Spec.NodeImageRef = restored.Spec.NodeImageRef - if restored.Spec.Images != nil { - spoke.Spec.Images = restored.Spec.Images - } - } - - // Store hub's missing fields in spoke's annotations. - if err := utilconversion.MarshalData(hub, spoke); err != nil { - return err - } - - return nil -} - -// Convert_v1alpha2_TanzuKubernetesReleaseSpec_To_v1alpha3_TanzuKubernetesReleaseSpec will convert the compatible types in TanzuKubernetesReleaseSpec v1alpha2 to v1alpha3 equivalent. -// nolint:revive,stylecheck // Generated conversion stubs have underscores in function names. -func Convert_v1alpha2_TanzuKubernetesReleaseSpec_To_v1alpha3_TanzuKubernetesReleaseSpec(in *TanzuKubernetesReleaseSpec, out *v1alpha3.TanzuKubernetesReleaseSpec, s apiconversion.Scope) error { - out.Version = version.WithV(in.Version) - out.Kubernetes.Version = version.WithV(in.KubernetesVersion) - out.Kubernetes.ImageRepository = in.Repository - if in.NodeImageRef != nil { - out.OSImages = []corev1.LocalObjectReference{{Name: in.NodeImageRef.Name}} - } - - // Transform the container images. - for index, image := range in.Images { - switch in.Images[index].Name { - case etcdContainerImageName: - out.Kubernetes.Etcd = &v1alpha3.ContainerImageInfo{ - ImageRepository: image.Repository, - ImageTag: image.Tag, - } - case pauseContainerImageName: - out.Kubernetes.Pause = &v1alpha3.ContainerImageInfo{ - ImageRepository: image.Repository, - ImageTag: image.Tag, - } - case corednsContainerImageName: - out.Kubernetes.CoreDNS = &v1alpha3.ContainerImageInfo{ - ImageRepository: image.Repository, - ImageTag: image.Tag, - } - case kubeVipContainerImageName: - out.Kubernetes.KubeVIP = &v1alpha3.ContainerImageInfo{ - ImageRepository: image.Repository, - ImageTag: image.Tag, - } - default: - break - } - } - - return nil -} - -// Convert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha2_TanzuKubernetesReleaseSpec will convert the compatible types in TanzuKubernetesReleaseSpec v1alpha3 to v1alpha2 equivalent. -// nolint:revive,stylecheck // Generated conversion stubs have underscores in function names. -func Convert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha2_TanzuKubernetesReleaseSpec(in *v1alpha3.TanzuKubernetesReleaseSpec, out *TanzuKubernetesReleaseSpec, s apiconversion.Scope) error { - out.KubernetesVersion = in.Kubernetes.Version - out.Repository = in.Kubernetes.ImageRepository - for _, osImageRef := range in.OSImages { - out.NodeImageRef = &corev1.ObjectReference{Name: osImageRef.Name} - break // can only convert the first osImageRef to nodeImageRef - } - - // Transform the containerimages. - // Container images are completely restored from the annotations later. - // This is to handle the scenario when there are no annotations present. - if in.Kubernetes.Etcd != nil { - out.Images = append(out.Images, ContainerImage{ - Name: etcdContainerImageName, - Repository: in.Kubernetes.Etcd.ImageRepository, - Tag: in.Kubernetes.Etcd.ImageTag, - }) - } - if in.Kubernetes.CoreDNS != nil { - out.Images = append(out.Images, ContainerImage{ - Name: corednsContainerImageName, - Repository: in.Kubernetes.CoreDNS.ImageRepository, - Tag: in.Kubernetes.CoreDNS.ImageTag, - }) - } - if in.Kubernetes.Pause != nil { - out.Images = append(out.Images, ContainerImage{ - Name: pauseContainerImageName, - Repository: in.Kubernetes.Pause.ImageRepository, - Tag: in.Kubernetes.Pause.ImageTag, - }) - } - if in.Kubernetes.KubeVIP != nil { - out.Images = append(out.Images, ContainerImage{ - Name: kubeVipContainerImageName, - Repository: in.Kubernetes.KubeVIP.ImageRepository, - Tag: in.Kubernetes.KubeVIP.ImageTag, - }) - } - return autoConvert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha2_TanzuKubernetesReleaseSpec(in, out, s) -} - -func (src *TanzuKubernetesReleaseList) ConvertTo(dstRaw conversion.Hub) error { - dst := dstRaw.(*v1alpha3.TanzuKubernetesReleaseList) - - return Convert_v1alpha2_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList(src, dst, nil) -} - -//nolint:revive,stylecheck // Much easier to read when the receiver is named as spoke/src/dest. -func (dst *TanzuKubernetesReleaseList) ConvertFrom(srcRaw conversion.Hub) error { - src := srcRaw.(*v1alpha3.TanzuKubernetesReleaseList) - - return autoConvert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha2_TanzuKubernetesReleaseList(src, dst, nil) -} diff --git a/apis/run/v1alpha2/conversion_test.go b/apis/run/v1alpha2/conversion_test.go deleted file mode 100644 index df1a88f341..0000000000 --- a/apis/run/v1alpha2/conversion_test.go +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha2 - -import ( - "testing" - - "github.com/google/go-cmp/cmp" - . "github.com/onsi/gomega" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/apitesting/fuzzer" - apiequality "k8s.io/apimachinery/pkg/api/equality" - serializer "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/kubectl/pkg/scheme" - v1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - - utilconversion "github.com/vmware-tanzu/tanzu-framework/apis/run/util/conversion" - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/version" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -func TestConversion(t *testing.T) { - t.Run("for TanzuKubernetesRelease", utilconversion.FuzzTestFunc(&utilconversion.FuzzTestFuncInput{ - Hub: &v1alpha3.TanzuKubernetesRelease{}, - Spoke: &TanzuKubernetesRelease{}, - FuzzerFuncs: []fuzzer.FuzzerFuncs{ - func(_ serializer.CodecFactory) []interface{} { - return []interface{}{v1alpha3.FuzzTKRSpec, v1alpha3.FuzzTKRSpecKubernetes, version.Fuzz} - }, - }, - })) - - // Add other types here in future -} - -func TestConvertNodeImageRef(t *testing.T) { - g := NewWithT(t) - fuzzr := utilconversion.GetFuzzer(scheme.Scheme, func(_ serializer.CodecFactory) []interface{} { - return []interface{}{FuzzTKRSpec, v1alpha3.FuzzTKRSpec, v1alpha3.FuzzTKRSpecKubernetes, version.Fuzz} - }) - - repeat(1000, func() { - tkrOrig := &TanzuKubernetesRelease{} - fuzzr.Fuzz(tkrOrig) - nodeImageRefs := ptrAsSliceForObjectReference(tkrOrig.Spec.NodeImageRef) - - tkrV1a3 := &v1alpha3.TanzuKubernetesRelease{} - g.Expect(tkrOrig.ConvertTo(tkrV1a3)).To(Succeed()) - - g.Expect(tkrV1a3.Spec.OSImages).To(HaveLen(len(nodeImageRefs))) - for i, nodeImageRef := range nodeImageRefs { - g.Expect(nodeImageRef.Name).To(Equal(tkrV1a3.Spec.OSImages[i].Name)) - } - }) - - repeat(1000, func() { - tkrV1a3 := &v1alpha3.TanzuKubernetesRelease{} - fuzzr.Fuzz(tkrV1a3) - - tkrConverted := &TanzuKubernetesRelease{} - g.Expect(tkrConverted.ConvertFrom(tkrV1a3)).To(Succeed()) - - nodeImageRefs := ptrAsSliceForObjectReference(tkrConverted.Spec.NodeImageRef) - g.Expect(len(nodeImageRefs) == 0).To(Equal(len(tkrV1a3.Spec.OSImages) == 0), - "nodeImageRef should be set iff there's at least 1 osImage") - for i, nodeImageRef := range nodeImageRefs { - g.Expect(nodeImageRef.Name).To(Equal(tkrV1a3.Spec.OSImages[i].Name)) - } - }) -} - -func repeat(times int, f func()) { - for i := 0; i < times; i++ { - f() - } -} - -func ptrAsSliceForObjectReference(ptr *v1.ObjectReference) []v1.ObjectReference { - if ptr == nil { - return nil - } - return []v1.ObjectReference{*ptr} -} - -// TestHubSpokeHub covers scenarios where all the slice fields are set, there is an off-chance that the fuzz conversion does not cover this. -func TestHubSpokeHub(t *testing.T) { - t.Run("for TanzuKubernetesRelease", func(t *testing.T) { - hub := &v1alpha3.TanzuKubernetesRelease{ - Spec: v1alpha3.TanzuKubernetesReleaseSpec{ - Version: "v#ʼnƈOƕʘ賡谒湪ȥ#4", - Kubernetes: v1alpha3.KubernetesSpec{ - Version: `vìd/i涇u趗\庰鏜`, - ImageRepository: "辑", - Etcd: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - Pause: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - CoreDNS: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - KubeVIP: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - }, - OSImages: []v1.LocalObjectReference{{ - Name: "F", - }}, - BootstrapPackages: []v1.LocalObjectReference{{ - Name: "BP", - }}, - }, - Status: v1alpha3.TanzuKubernetesReleaseStatus{Conditions: []v1beta1.Condition{{Type: "ŭVɮǔ恴n-禷Ţ焆輦ƹ(4`", Status: "7犃蘹燡~ȥ囹烝Y秽#", Severity: "=Ĩ[塻QfĈQ鸀ð猲虘"}}}} - - t.Run("hub-spoke-hub", func(t *testing.T) { - g := NewWithT(t) - hubBefore := hub - - // First convert hub to spoke - dstCopy := &TanzuKubernetesRelease{} - g.Expect(dstCopy.ConvertFrom(hubBefore)).To(Succeed()) - - // Convert spoke back to hub and check if the resulting hub is equal to the hub before the round trip - hubAfter := &v1alpha3.TanzuKubernetesRelease{} - g.Expect(dstCopy.ConvertTo(hubAfter)).To(Succeed()) - - // The hub doesn't start with annotations, so the comparison will fail. - // To avoid this, we copy over the annotations from after the round-trip into the initial hub. - hubBefore.ObjectMeta.Annotations = hubAfter.ObjectMeta.Annotations - - g.Expect(apiequality.Semantic.DeepEqual(hubBefore, hubAfter)).To(BeTrue(), cmp.Diff(hubBefore, hubAfter)) - }) - }) -} - -// TestRoundTripWithMultiplePauseImagesInSpoke covers a specific scenario where there can be multiple pause images in v1alpha1, and all of them should be preserved after a round-trip. -func TestRoundTripWithMultiplePauseImagesInSpoke(t *testing.T) { - t.Run("for TanzuKubernetesRelease", func(t *testing.T) { - spoke := &TanzuKubernetesRelease{ - Spec: TanzuKubernetesReleaseSpec{ - Version: "#ʼnƈOƕʘ賡谒湪ȥ#4", - KubernetesVersion: `ìd/i涇u趗\庰鏜`, - Repository: "辑", - Images: []ContainerImage{ - { - Name: "pause", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6-windows-amd64", - }, - { - Name: "pause", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6", - }, - { - Name: "coredns", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6-coredns", - }, - { - Name: "coredns", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6-coredns-foo", - }, - { - Name: "etcd", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6-etcd", - }, - { - Name: "etcd", - Repository: "projects-stg.registry.vmware.com/tkg", - Tag: "3.6-etcd-foo", - }, - }, - }, - } - - t.Run("spoke-hub-spoke", func(t *testing.T) { - g := NewWithT(t) - spokeBefore := spoke - - // First convert spoke to hub - hub := &v1alpha3.TanzuKubernetesRelease{} - g.Expect(spokeBefore.ConvertTo(hub)).To(Succeed()) - - // Convert hub back to spoke - spokeAfter := &TanzuKubernetesRelease{} - g.Expect(spokeAfter.ConvertFrom(hub)).To(Succeed()) - - // The spoke at the beginning doesn't start with annotations. - // For the comparison to pass, we need to either remove the annotations, or copy them into the spoke reference from before conversion. - // Here we're doing the latter. - spokeBefore.ObjectMeta.Annotations = spokeAfter.ObjectMeta.Annotations - - // check if the post-covnersion spoke is equal to the spoke before the round trip. - g.Expect(apiequality.Semantic.DeepEqual(spokeBefore, spokeAfter)).To(BeTrue(), cmp.Diff(spokeBefore, spokeAfter)) - }) - }) -} - -// TODO: Add a UT for hub - spoke with no annotations. -func TestContainerImagesConversionFromSpokeToHubWithNoAnnotations(t *testing.T) { - t.Run("for TanzuKubernetesRelease", func(t *testing.T) { - hub := &v1alpha3.TanzuKubernetesRelease{ - Spec: v1alpha3.TanzuKubernetesReleaseSpec{ - Version: "v#ʼnƈOƕʘ賡谒湪ȥ#4", - Kubernetes: v1alpha3.KubernetesSpec{ - Version: `vìd/i涇u趗\庰鏜`, - ImageRepository: "辑", - Etcd: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - Pause: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - CoreDNS: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - KubeVIP: &v1alpha3.ContainerImageInfo{ - ImageRepository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - ImageTag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - }, - OSImages: []v1.LocalObjectReference{{ - Name: "F", - }}, - BootstrapPackages: []v1.LocalObjectReference{{ - Name: "BP", - }}, - }, - } - - expectedSpoke := &TanzuKubernetesRelease{ - Spec: TanzuKubernetesReleaseSpec{ - Version: "v#ʼnƈOƕʘ賡谒湪ȥ#4", // prefixed with `v` coming from v1alpha3 - KubernetesVersion: `vìd/i涇u趗\庰鏜`, // prefixed with `v` coming from v1alpha3 - Repository: "辑", - Images: []ContainerImage{ - { - Name: "etcd", - Repository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - Tag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - { - Name: "coredns", - Repository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - Tag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - { - Name: "pause", - Repository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - Tag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - { - Name: "kube-vip", - Repository: "9ʼn劆掬ȳƤʟNʮ犓ȓ峌堲Ȥ:ě", - Tag: "Eĺ垦婽Ô驽伕WƇ|q`1老縜", - }, - }, - NodeImageRef: &v1.ObjectReference{Name: "F"}, - }, - } - - t.Run("hub-spoke", func(t *testing.T) { - g := NewWithT(t) - hubBefore := hub - - // Convert from hub to spoke. - dstCopy := &TanzuKubernetesRelease{} - g.Expect(dstCopy.ConvertFrom(hubBefore)).To(Succeed()) - - // Sync annotations in expected and real. - expectedSpoke.ObjectMeta.Annotations = dstCopy.ObjectMeta.Annotations - - g.Expect(apiequality.Semantic.DeepEqual(expectedSpoke, dstCopy)).To(BeTrue(), cmp.Diff(expectedSpoke, dstCopy)) - }) - }) -} diff --git a/apis/run/v1alpha2/doc.go b/apis/run/v1alpha2/doc.go deleted file mode 100644 index 77ec495a12..0000000000 --- a/apis/run/v1alpha2/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha2 contains API Schema definitions for the run.tanzu v1alpha2 API group. -// +groupName=run.tanzu.vmware.com -// +k8s:deepcopy-gen=package -// +k8s:conversion-gen=github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3 -package v1alpha2 diff --git a/apis/run/v1alpha2/fuzz.go b/apis/run/v1alpha2/fuzz.go deleted file mode 100644 index bdebfc716f..0000000000 --- a/apis/run/v1alpha2/fuzz.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha2 - -import ( - fuzz "github.com/google/gofuzz" - corev1 "k8s.io/api/core/v1" -) - -func FuzzTKRSpec(tkrSpec *TanzuKubernetesReleaseSpec, c fuzz.Continue) { - c.Fuzz(&tkrSpec.Version) - c.Fuzz(&tkrSpec.KubernetesVersion) - c.Fuzz(&tkrSpec.Repository) - c.Fuzz(&tkrSpec.Images) - tkrSpec.NodeImageRef = nil - if c.RandBool() { - tkrSpec.NodeImageRef = &corev1.ObjectReference{Name: c.RandString()} - } -} diff --git a/apis/run/v1alpha2/groupversion_info.go b/apis/run/v1alpha2/groupversion_info.go deleted file mode 100644 index 75064c06a8..0000000000 --- a/apis/run/v1alpha2/groupversion_info.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha2 contains API Schema definitions for the run.tanzu v1alpha2 API group -// +kubebuilder:object:generate=true -// +groupName=run.tanzu.vmware.com -package v1alpha2 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "run.tanzu.vmware.com", Version: "v1alpha2"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme - - localSchemeBuilder = SchemeBuilder.SchemeBuilder -) diff --git a/apis/run/v1alpha2/tanzukubernetescluster_types.go b/apis/run/v1alpha2/tanzukubernetescluster_types.go deleted file mode 100644 index 9e65d5c286..0000000000 --- a/apis/run/v1alpha2/tanzukubernetescluster_types.go +++ /dev/null @@ -1,467 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha2 - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" -) - -// TanzuKubernetesClusterPhase is a type for the Tanzu Kubernetes cluster's -// phase constants. -type TanzuKubernetesClusterPhase string - -const ( - // TanzuKubernetesClusterPhaseCreating means that the cluster is under creation. - TanzuKubernetesClusterPhaseCreating = TanzuKubernetesClusterPhase("creating") - - // TanzuKubernetesClusterPhaseFailed means that cluster creation failed. - // The system likely requires user intervention. - TanzuKubernetesClusterPhaseFailed = TanzuKubernetesClusterPhase("failed") - - // TanzuKubernetesClusterPhaseRunning means that the cluster control plane, - // add-ons and workers are ready. - TanzuKubernetesClusterPhaseRunning = TanzuKubernetesClusterPhase("running") - - // TanzuKubernetesClusterPhaseUnhealthy means that the cluster was up and running, - // but unhealthy now, the system likely requires user intervention. - TanzuKubernetesClusterPhaseUnhealthy = TanzuKubernetesClusterPhase("unhealthy") - - // TanzuKubernetesClusterPhaseUpdating indicates that the cluster is in the - // process of rolling update - TanzuKubernetesClusterPhaseUpdating = TanzuKubernetesClusterPhase("updating") - - // TanzuKubernetesClusterPhaseUpdateFailed indicates that the cluster's - // rolling update failed and likely requires user intervention. - TanzuKubernetesClusterPhaseUpdateFailed = TanzuKubernetesClusterPhase("updateFailed") - - // TanzuKubernetesClusterPhaseDeleting means that the cluster is being - // deleted. - TanzuKubernetesClusterPhaseDeleting = TanzuKubernetesClusterPhase("deleting") - - // TanzuKubernetesClusterPhaseEmpty is useful for the initial reconcile, - // before we even state the phase as creating. - TanzuKubernetesClusterPhaseEmpty = TanzuKubernetesClusterPhase("") -) - -// TanzuKubernetesClusterSpec defines the desired state of TanzuKubernetesCluster: its nodes, the software installed on those nodes and -// the way that software should be configured. -// -//nolint:gocritic -type TanzuKubernetesClusterSpec struct { - // Topology specifies the topology for the Tanzu Kubernetes cluster: the number, purpose, and organization of the nodes which - // form the cluster and the resources allocated for each. - Topology Topology `json:"topology"` - - // Distribution specifies the distribution for the Tanzu Kubernetes cluster: the software installed on the control plane and - // worker nodes, including Kubernetes itself. - // DEPRECATED: use topology.controlPlane.tkr and topology.nodePools[*].tkr instead. - // +optional - Distribution Distribution `json:"distribution,omitempty"` - - // Settings specifies settings for the Tanzu Kubernetes cluster: the way an instance of a distribution is configured, - // including information about pod networking and storage. - // +optional - Settings *Settings `json:"settings,omitempty"` -} - -// Volume defines a PVC attachment. -// These volumes are tied to the node lifecycle, created and deleted when the node is. -// The volumes are mounted in the node during the bootstrap process, prior to services being started (e.g. etcd, containerd). -type Volume struct { - // Name is suffix used to name this PVC as: node.Name + "-" + Name - Name string `json:"name"` - // MountPath is the directory where the volume device is to be mounted - MountPath string `json:"mountPath"` - // Capacity is the PVC capacity - Capacity corev1.ResourceList `json:"capacity"` - // StorageClass is the storage class to be used for the disks. - // Defaults to TopologySettings.StorageClass - // +optional - StorageClass string `json:"storageClass,omitempty"` -} - -// Topology describes the number, purpose, and organization of nodes and the resources allocated for each. Nodes are -// grouped into pools based on their intended purpose. Each pool is homogeneous, having the same resource allocation and -// using the same storage. -type Topology struct { - // ControlPlane specifies the topology of the cluster's control plane, including the number of control plane nodes - // and resources allocated for each. The control plane must have an odd number of nodes. - ControlPlane TopologySettings `json:"controlPlane"` - - // NodePools specifies the topology of cluster's worker node pools, including the number of nodes and resources - // allocated for each node. - NodePools []NodePool `json:"nodePools"` -} - -// NodePool describes a group of nodes within a cluster that have the same configuration -type NodePool struct { - // Name is the name of the NodePool. - Name string `json:"name"` - - // Labels are map of string keys and values that can be used to organize and categorize objects. - // User-defined labels will be propagated to the created nodes. - // +optional - Labels map[string]string `json:"labels,omitempty"` - - // Taints specifies the taints the Node API object should be registered with. - // User-defined taints will be propagated to the created nodes. - // +optional - Taints []corev1.Taint `json:"taints,omitempty"` - - TopologySettings `json:",inline"` -} - -// TKRReference is an extensible way to link a TanzuKubernetesRelease. -type TKRReference struct { - // Reference is a way to set the fixed link to the target object. - // +optional - Reference *corev1.ObjectReference `json:"reference,omitempty"` -} - -// TopologySettings describes a homogeneous pool of nodes: the number of nodes in the pool and the properties of each of -// those nodes, including resource allocation and storage. -type TopologySettings struct { - // Replicas is the number of nodes. - // This is a pointer to distinguish between explicit zero and not specified, `nil`. - // For control plane, defaults to 1 if `nil`. - // For node pools, a value of `nil` indicates that the field will not be reconciled, allowing external services like - // autoscalers to choose the number of nodes. By default, CAPI's `MachineDeployment` will pick 1. - Replicas *int32 `json:"replicas,omitempty"` - - // VMClass is the name of the VirtualMachineClass, which describes the virtual hardware settings, to be used each node - // in the pool. This controls the hardware available to the node (CPU and memory) as well as the requests and limits - // on those resources. Run `kubectl describe virtualmachineclasses` to see which VM classes are available to use. - VMClass string `json:"vmClass"` - - // StorageClass is the storage class to be used for storage of the disks which store the root filesystems of the - // nodes. Run `kubectl describe ns` on your namespace to see which storage classes are available to use. - StorageClass string `json:"storageClass"` - - // Volumes is the set of PVCs to be created and attached to each node. - // +optional - Volumes []Volume `json:"volumes,omitempty"` - - // TKR points to TanzuKubernetesRelease intended to be used by the node pool - // (the control plane being special kind of a node pool). - // +optional - TKR TKRReference `json:"tkr,omitempty"` - - // NodeDrainTimeout is the total amount of time that the controller will - // spend on draining a node. The default value is 0, meaning that the node - // will be drained without any time limitations. - // NOTE: NodeDrainTimeout is different from `kubectl drain --timeout` - // +optional - NodeDrainTimeout *metav1.Duration `json:"nodeDrainTimeout,omitempty"` -} - -// Distribution specifies the version of software which should be installed on the control plane and worker nodes. This -// version information encompasses Kubernetes and its dependencies, the base OS of the node, and add-ons. -// -//nolint:gocritic -type Distribution struct { - // Version specifies the fully-qualified desired Kubernetes distribution version of the Tanzu Kubernetes cluster. If the - // cluster exists and is not of the specified version, it will be upgraded. - // - // Version is a semantic version string. The version may not be decreased. The major version may not be changed. If - // the minor version is changed, it may only be incremented; skipping minor versions is not supported. - // - // The current observed version of the cluster is held by `status.version`. - // DEPRECATED: use topology.controlPlane.tkr and topology.nodePools[*].tkr instead. - // +optional - Version string `json:"fullVersion"` - - // VersionHint provides the version webhook with guidance about the desired Kubernetes distribution version of the - // Tanzu Kubernetes cluster. If a hint is provided without a full version, the most recent distribution matching the hint - // will be selected. - // - // The version selected based on the hint will be stored in the spec as the full version. This ensures that the same - // version is used if the cluster is scaled out in the future. - // - // VersionHint is a semantic prefix of a full version number. (E.g., v1.15.1 matches any distribution of v1.15.1, - // including v1.15.1+vmware.1-tkg.1 or v1.15.1+vmware.2-tkg.1, but not v1.15.10+vmware.1-tkg.1.) - // - // A hint that does not match the full version is invalid and will be rejected. - // - // To upgrade a cluster to the most recent version that still matches the hint, leave the hint alone and remove the - // fullVersion from the spec. This will cause the hint to be re-resolved. - // DEPRECATED: use topology.controlPlane.tkr and topology.nodePools[*].tkr instead. - // +optional - VersionHint string `json:"version"` -} - -// Settings specifies configuration information for a cluster. -type Settings struct { - // Network specifies network-related settings for the cluster. - // +optional - Network *Network `json:"network,omitempty"` - - // Storage specifies storage-related settings for the cluster. - // - // The storage used for node's disks is controlled by TopologySettings. - // +optional - Storage *Storage `json:"storage,omitempty"` -} - -// Network specifies network-related settings for a cluster. -type Network struct { - // Services specify network settings for services. - // - // Defaults to 10.96.0.0/12. - // +optional - Services *NetworkRanges `json:"services,omitempty"` - - // Pods specify network settings for pods. - // - // When CNI is antrea, set Defaults to 192.168.0.0/16. - // When CNI is antrea-nsx-routed, set Defaults to empty - // +optional - Pods *NetworkRanges `json:"pods,omitempty"` - - // ServiceDomain specifies service domain for Tanzu Kubernetes cluster. - // - // Defaults to a cluster.local. - // +optional - ServiceDomain string `json:"serviceDomain,omitempty"` - - // CNI is the Container Networking Interface plugin for the Tanzu Kubernetes cluster. - // - // Defaults to Calico. - // +optional - CNI *CNIConfiguration `json:"cni,omitempty"` - - // Proxy specifies HTTP(s) proxy configuration for Tanzu Kubernetes cluster. - // - // If omitted, no proxy will be configured in the system. - // +optional - Proxy *ProxyConfiguration `json:"proxy,omitempty"` - - // Trust specifies certificate configuration for the Tanzu Kubernetes Cluster. - // - // If omitted, no certificate will be configured in the system. - // +optional - Trust *TrustConfiguration `json:"trust,omitempty"` -} - -// NetworkRanges describes a collection of IP addresses as a list of ranges. -type NetworkRanges struct { - // CIDRBlocks specifies one or more ranges of IP addresses. - // - // Note: supplying multiple ranges many not be supported by all CNI plugins. - // +optional - CIDRBlocks []string `json:"cidrBlocks,omitempty"` -} - -// CNIConfiguration indicates which CNI should be used. -type CNIConfiguration struct { - // Name is the name of the CNI plugin to use. - // - // Supported values: "calico", "antrea". - Name string `json:"name"` -} - -// ProxyConfiguration configures the HTTP(s) proxy to be used inside the Tanzu Kubernetes cluster. -type ProxyConfiguration struct { - // HttpProxy specifies a proxy URL to use for creating HTTP connections outside the cluster. - // Example: http://:@: - // - // +optional - HttpProxy *string `json:"httpProxy,omitempty"` //nolint:revive,stylecheck - - // HttpsProxy specifies a proxy URL to use for creating HTTPS connections outside the cluster. - // Example: http://:@: - // - // +optional - HttpsProxy *string `json:"httpsProxy,omitempty"` //nolint:revive,stylecheck - - // NoProxy specifies a list of destination domain names, domains, IP addresses or other network CIDRs to exclude proxying. - // Example: [localhost, 127.0.0.1, 10.10.10.0/24] - // - // +optional - NoProxy []string `json:"noProxy,omitempty"` -} - -// TrustConfiguration configures additional trust parameters to the cluster configuration -type TrustConfiguration struct { - // AdditionalTrustedCAs specifies the additional trusted certificates (which - // can be additional CAs or end certificates) to add to the cluster - // - // +optional - AdditionalTrustedCAs []TLSCertificate `json:"additionalTrustedCAs,omitempty"` -} - -// TLSCertificate specifies a single additional certificate name and contents -type TLSCertificate struct { - // Name specifies the name of the additional certificate, used in the filename - // Example: CompanyInternalCA - Name string `json:"name"` - - // Data specifies the contents of the additional certificate, encoded as a - // base64 string. Specifically, this is the PEM Public Certificate data as - // a base64 string.. - // Example: LS0tLS1C...LS0tCg== (where "..." is the middle section of the long base64 string) - Data string `json:"data"` -} - -// Storage configures persistent storage for a cluster. -type Storage struct { - // Classes is a list of storage classes from the supervisor namespace to expose within a cluster. - // - // If omitted, all storage classes from the supervisor namespace will be exposed within the cluster. - // +optional - Classes []string `json:"classes,omitempty"` - // DefaultClass is the valid storage class name which is treated as the default storage class within a cluster. - // If omitted, no default storage class is set - // +optional - DefaultClass string `json:"defaultClass,omitempty"` -} - -// TanzuKubernetesClusterStatus defines the observed state of TanzuKubernetesCluster. -// -//nolint:gocritic -type TanzuKubernetesClusterStatus struct { - // APIEndpoints represents the endpoints to communicate with the control plane. - // +optional - APIEndpoints []APIEndpoint `json:"apiEndpoints,omitempty"` - - // Version holds the observed version of the Tanzu Kubernetes cluster. While an upgrade is in progress this value will be the - // version of the cluster when the upgrade began. - // +optional - Version string `json:"version,omitempty"` - - // Addons groups the statuses of a Tanzu Kubernetes cluster's add-ons. - // +optional - Addons []AddonStatus `json:"addons,omitempty"` - - // Phase of this TanzuKubernetesCluster. - // DEPRECATED: will be removed in v1alpha3 - // +optional - Phase TanzuKubernetesClusterPhase `json:"phase,omitempty"` - - // Conditions defines current service state of the TanzuKubernetestCluster. - // +optional - Conditions clusterv1.Conditions `json:"conditions,omitempty"` - - // Total number of replicas in worker node pools. - // +optional - TotalWorkerReplicas int32 `json:"totalWorkerReplicas,omitempty"` -} - -// GetConditions returns the list of conditions for a TanzuKubernetesCluster -// object. -func (r *TanzuKubernetesCluster) GetConditions() clusterv1.Conditions { - return r.Status.Conditions -} - -// SetConditions sets the status conditions for a TanzuKubernetesCluster object -func (r *TanzuKubernetesCluster) SetConditions(conditions clusterv1.Conditions) { - r.Status.Conditions = conditions -} - -// APIEndpoint represents a reachable Kubernetes API endpoint. -type APIEndpoint struct { - // The hostname on which the API server is serving. - Host string `json:"host"` - - // The port on which the API server is serving. - Port int `json:"port"` -} - -// AddonType type of Addon -type AddonType string - -const ( - // AuthService is the Auth service for the Tanzu Kubernetes cluster. - AuthService = AddonType("AuthService") - - // CNI is the Container Networking Interface used for the Tanzu Kubernetes cluster. - CNI = AddonType("CNI") - - // CPI is the Cloud Provider Interface for the Tanzu Kubernetes cluster. - CPI = AddonType("CPI") - - // CSI is the Container Storage Interface for the Tanzu Kubernetes cluster. - CSI = AddonType("CSI") - - // DNS is the DNS addon for the Tanzu Kubernetes cluster. - DNS = AddonType("DNS") - - // Proxy is the Proxy addon for the Tanzu Kubernetes cluster. - Proxy = AddonType("Proxy") - - // PSP is the default Pod Security Policy creation for the Tanzu Kubernetes cluster. - PSP = AddonType("PSP") - - // MetricsServer is the Metrics Server addon for the Tanzu Kubernetes cluster. - MetricsServer = AddonType("MetricsServer") -) - -// AddonStatus represents the status of an addon. -type AddonStatus struct { - // Name of the add-on used. - Name string `json:"name"` - - // Type of the add-on used - Type AddonType `json:"type"` - - // Version of the distribution applied - Version string `json:"version,omitempty"` - - // Conditions defines the current conditions of the add-on. - // +optional - Conditions clusterv1.Conditions `json:"conditions,omitempty"` -} - -// GetConditions returns the list of conditions for an add-on -func (as *AddonStatus) GetConditions() clusterv1.Conditions { - return as.Conditions -} - -// SetConditions sets the conditions for an add-on -func (as *AddonStatus) SetConditions(conditions clusterv1.Conditions) { - as.Conditions = conditions -} - -// SetStatus records the addon name and version -func (as *AddonStatus) SetStatus(addonName, version string) { - as.Name = addonName - as.Version = version -} - -// +kubebuilder:object:root=true -// +kubebuilder:resource:path=tanzukubernetesclusters,scope=Namespaced,shortName=tkc -// +kubebuilder:storageversion -// +kubebuilder:subresource:status -// +kubebuilder:printcolumn:name="Control Plane",type=integer,JSONPath=.spec.topology.controlPlane.replicas -// +kubebuilder:printcolumn:name="Worker",type=integer,JSONPath=.status.totalWorkerReplicas -// +kubebuilder:printcolumn:name="TKR Name",type=string,JSONPath=.spec.topology.controlPlane.tkr.reference.name -// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" -// +kubebuilder:printcolumn:name="Ready",type=string,JSONPath=.status.conditions[?(@.type=='Ready')].status -// +kubebuilder:printcolumn:name="TKR Compatible",type=string,JSONPath=.status.conditions[?(@.type=='TanzuKubernetesReleaseCompatible')].status -// +kubebuilder:printcolumn:name="Updates Available",type=string,JSONPath=.status.conditions[?(@.type=='UpdatesAvailable')].message - -// TanzuKubernetesCluster is the schema for the Tanzu Kubernetes Grid service for vSphere API. -// -//nolint:gocritic -type TanzuKubernetesCluster struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec TanzuKubernetesClusterSpec `json:"spec,omitempty"` - Status TanzuKubernetesClusterStatus `json:"status,omitempty"` -} - -// +kubebuilder:object:root=true - -// TanzuKubernetesClusterList contains a list of TanzuKubernetesCluster -type TanzuKubernetesClusterList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []TanzuKubernetesCluster `json:"items"` -} - -func init() { - SchemeBuilder.Register(&TanzuKubernetesCluster{}, &TanzuKubernetesClusterList{}) -} diff --git a/apis/run/v1alpha2/tanzukubernetesrelease_conversion_test.go b/apis/run/v1alpha2/tanzukubernetesrelease_conversion_test.go deleted file mode 100644 index c0049e8ae3..0000000000 --- a/apis/run/v1alpha2/tanzukubernetesrelease_conversion_test.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha2 - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestConvertTo(t *testing.T) { - assert := assert.New(t) - - ci := ContainerImage{ - Repository: "repo", - Name: "nginx", - Tag: "1.2.3", - } - - assert.Equal(ci.String(), "repo/nginx:1.2.3") -} diff --git a/apis/run/v1alpha2/tanzukubernetesrelease_types.go b/apis/run/v1alpha2/tanzukubernetesrelease_types.go deleted file mode 100644 index 0390fa15d0..0000000000 --- a/apis/run/v1alpha2/tanzukubernetesrelease_types.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha2 - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" -) - -const ( - ConditionCompatible = "Compatible" - ConditionUpdatesAvailable = "UpdatesAvailable" - - ReasonNoUpdates = "NoUpdates" - ReasonNotAvailable = "NotAvailable" - ReasonIncompatible = "Incompatible" - ReasonDeactivated = "Deactivated" - - LabelIncompatible = "incompatible" - LabelDeactivated = "deactivated" - LabelDeleted = "deleted" - - LabelOSType = "os-type" - LabelOSName = "os-name" - LabelOSVersion = "os-version" - LabelOSArch = "os-arch" - - DefaultOSType = "linux" - DefaultOSName = "photon" - DefaultOSVersion = "3.0" - DefaultOSArch = "amd64" -) - -// +kubebuilder:object:root=true -// +kubebuilder:resource:path=tanzukubernetesreleases,scope=Cluster,shortName=tkr -// +kubebuilder:subresource:status -// +kubebuilder:printcolumn:name="Version",type=string,JSONPath=.spec.version -// +kubebuilder:printcolumn:name="Ready",type=string,JSONPath=.status.conditions[?(@.type=='Ready')].status -// +kubebuilder:printcolumn:name="Compatible",type=string,JSONPath=.status.conditions[?(@.type=='Compatible')].status -// +kubebuilder:printcolumn:name="Created",type="date",JSONPath=.metadata.creationTimestamp -// +kubebuilder:printcolumn:name="Updates Available",type=string,JSONPath=.status.conditions[?(@.type=='UpdatesAvailable')].message - -// TanzuKubernetesRelease is the schema for the tanzukubernetesreleases API. -// TanzuKubernetesRelease objects represent Kubernetes releases available via TKG Service, which can be used to create -// TanzuKubernetesCluster instances. TKRs are immutable to end-users. They are created and managed by TKG Service to -// provide discovery of Kubernetes releases to TKG Service users. -type TanzuKubernetesRelease struct { // nolint:maligned - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec TanzuKubernetesReleaseSpec `json:"spec,omitempty"` - Status TanzuKubernetesReleaseStatus `json:"status,omitempty"` -} - -func (r *TanzuKubernetesRelease) GetConditions() clusterv1.Conditions { - return r.Status.Conditions -} - -func (r *TanzuKubernetesRelease) SetConditions(conditions clusterv1.Conditions) { - r.Status.Conditions = conditions -} - -// +kubebuilder:object:root=true - -// TanzuKubernetesReleaseList contains a list of TanzuKubernetesRelease objects. -type TanzuKubernetesReleaseList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []TanzuKubernetesRelease `json:"items"` -} - -// TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease -type TanzuKubernetesReleaseSpec struct { - // Version is the fully qualified Semantic Versioning conformant version of the TanzuKubernetesRelease. - // Version MUST be unique across all TanzuKubernetesRelease objects. - Version string `json:"version"` - - // KubernetesVersion is the fully qualified Semantic Versioning conformant version of Kubernetes shipped by this TKR. - // The same KubernetesVersion MAY be shipped by different TKRs. - // +optional - KubernetesVersion string `json:"kubernetesVersion,omitempty"` - - // Repository is the container image repository for Kubernetes core images, such as kube-apiserver, kube-proxy, etc. - // It MUST be a DNS-compatible name. - // +optional - Repository string `json:"repository,omitempty"` - - // Images is the list of (other than Kubernetes core) essential container images shipped by this TKR (e.g. coredns, etcd). - // +optional - Images []ContainerImage `json:"images,omitempty"` - - // NodeImageRef refers to an object representing the image used to create TKC nodes (e.g. VirtualMachineImage). - // +optional - NodeImageRef *corev1.ObjectReference `json:"nodeImageRef,omitempty"` -} - -// ContainerImage is a struct representing a single fully qualified container image name, constructed as -// `{Repository}/{Name}:{Tag}`. -type ContainerImage struct { - // Repository is the container image repository used by this image. It MUST be a DNS-compatible name. - // +optional - Repository string `json:"repository,omitempty"` - - // Name is the container image name without the repository prefix. - // It MUST be a valid URI path, MAY contain zero or more '/', and SHOULD NOT start or end with '/'. - Name string `json:"name"` - - // Tag is the container image version tag. It is the suffix coming after ':' in a fully qualified image name. - // +optional - Tag string `json:"tag,omitempty"` -} - -func (ci ContainerImage) String() string { - var prefix, suffix string - if ci.Repository != "" { - prefix = ci.Repository + "/" - } - if ci.Tag != "" { - suffix = ":" + ci.Tag - } - return prefix + ci.Name + suffix -} - -// TanzuKubernetesReleaseStatus defines the observed state of TanzuKubernetesRelease -type TanzuKubernetesReleaseStatus struct { - Conditions []clusterv1.Condition `json:"conditions,omitempty"` -} - -func init() { - SchemeBuilder.Register(&TanzuKubernetesRelease{}, &TanzuKubernetesReleaseList{}) -} diff --git a/apis/run/v1alpha2/zz_generated.conversion.go b/apis/run/v1alpha2/zz_generated.conversion.go deleted file mode 100644 index fd41f44489..0000000000 --- a/apis/run/v1alpha2/zz_generated.conversion.go +++ /dev/null @@ -1,180 +0,0 @@ -//go:build !ignore_autogenerated_core -// +build !ignore_autogenerated_core - -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by conversion-gen. DO NOT EDIT. - -package v1alpha2 - -import ( - unsafe "unsafe" - - conversion "k8s.io/apimachinery/pkg/conversion" - runtime "k8s.io/apimachinery/pkg/runtime" - v1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - - v1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -func init() { - localSchemeBuilder.Register(RegisterConversions) -} - -// RegisterConversions adds conversion functions to the given scheme. -// Public to allow building arbitrary schemes. -func RegisterConversions(s *runtime.Scheme) error { - if err := s.AddGeneratedConversionFunc((*TanzuKubernetesRelease)(nil), (*v1alpha3.TanzuKubernetesRelease)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha2_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(a.(*TanzuKubernetesRelease), b.(*v1alpha3.TanzuKubernetesRelease), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.TanzuKubernetesRelease)(nil), (*TanzuKubernetesRelease)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_TanzuKubernetesRelease_To_v1alpha2_TanzuKubernetesRelease(a.(*v1alpha3.TanzuKubernetesRelease), b.(*TanzuKubernetesRelease), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*TanzuKubernetesReleaseList)(nil), (*v1alpha3.TanzuKubernetesReleaseList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha2_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList(a.(*TanzuKubernetesReleaseList), b.(*v1alpha3.TanzuKubernetesReleaseList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.TanzuKubernetesReleaseList)(nil), (*TanzuKubernetesReleaseList)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha2_TanzuKubernetesReleaseList(a.(*v1alpha3.TanzuKubernetesReleaseList), b.(*TanzuKubernetesReleaseList), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*TanzuKubernetesReleaseStatus)(nil), (*v1alpha3.TanzuKubernetesReleaseStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha2_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus(a.(*TanzuKubernetesReleaseStatus), b.(*v1alpha3.TanzuKubernetesReleaseStatus), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1alpha3.TanzuKubernetesReleaseStatus)(nil), (*TanzuKubernetesReleaseStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha2_TanzuKubernetesReleaseStatus(a.(*v1alpha3.TanzuKubernetesReleaseStatus), b.(*TanzuKubernetesReleaseStatus), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*TanzuKubernetesReleaseSpec)(nil), (*v1alpha3.TanzuKubernetesReleaseSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha2_TanzuKubernetesReleaseSpec_To_v1alpha3_TanzuKubernetesReleaseSpec(a.(*TanzuKubernetesReleaseSpec), b.(*v1alpha3.TanzuKubernetesReleaseSpec), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*v1alpha3.TanzuKubernetesReleaseSpec)(nil), (*TanzuKubernetesReleaseSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha2_TanzuKubernetesReleaseSpec(a.(*v1alpha3.TanzuKubernetesReleaseSpec), b.(*TanzuKubernetesReleaseSpec), scope) - }); err != nil { - return err - } - return nil -} - -func autoConvert_v1alpha2_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(in *TanzuKubernetesRelease, out *v1alpha3.TanzuKubernetesRelease, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - if err := Convert_v1alpha2_TanzuKubernetesReleaseSpec_To_v1alpha3_TanzuKubernetesReleaseSpec(&in.Spec, &out.Spec, s); err != nil { - return err - } - if err := Convert_v1alpha2_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus(&in.Status, &out.Status, s); err != nil { - return err - } - return nil -} - -// Convert_v1alpha2_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease is an autogenerated conversion function. -func Convert_v1alpha2_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(in *TanzuKubernetesRelease, out *v1alpha3.TanzuKubernetesRelease, s conversion.Scope) error { - return autoConvert_v1alpha2_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(in, out, s) -} - -func autoConvert_v1alpha3_TanzuKubernetesRelease_To_v1alpha2_TanzuKubernetesRelease(in *v1alpha3.TanzuKubernetesRelease, out *TanzuKubernetesRelease, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - if err := Convert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha2_TanzuKubernetesReleaseSpec(&in.Spec, &out.Spec, s); err != nil { - return err - } - if err := Convert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha2_TanzuKubernetesReleaseStatus(&in.Status, &out.Status, s); err != nil { - return err - } - return nil -} - -// Convert_v1alpha3_TanzuKubernetesRelease_To_v1alpha2_TanzuKubernetesRelease is an autogenerated conversion function. -func Convert_v1alpha3_TanzuKubernetesRelease_To_v1alpha2_TanzuKubernetesRelease(in *v1alpha3.TanzuKubernetesRelease, out *TanzuKubernetesRelease, s conversion.Scope) error { - return autoConvert_v1alpha3_TanzuKubernetesRelease_To_v1alpha2_TanzuKubernetesRelease(in, out, s) -} - -func autoConvert_v1alpha2_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList(in *TanzuKubernetesReleaseList, out *v1alpha3.TanzuKubernetesReleaseList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]v1alpha3.TanzuKubernetesRelease, len(*in)) - for i := range *in { - if err := Convert_v1alpha2_TanzuKubernetesRelease_To_v1alpha3_TanzuKubernetesRelease(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } - return nil -} - -// Convert_v1alpha2_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList is an autogenerated conversion function. -func Convert_v1alpha2_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList(in *TanzuKubernetesReleaseList, out *v1alpha3.TanzuKubernetesReleaseList, s conversion.Scope) error { - return autoConvert_v1alpha2_TanzuKubernetesReleaseList_To_v1alpha3_TanzuKubernetesReleaseList(in, out, s) -} - -func autoConvert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha2_TanzuKubernetesReleaseList(in *v1alpha3.TanzuKubernetesReleaseList, out *TanzuKubernetesReleaseList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]TanzuKubernetesRelease, len(*in)) - for i := range *in { - if err := Convert_v1alpha3_TanzuKubernetesRelease_To_v1alpha2_TanzuKubernetesRelease(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } - return nil -} - -// Convert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha2_TanzuKubernetesReleaseList is an autogenerated conversion function. -func Convert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha2_TanzuKubernetesReleaseList(in *v1alpha3.TanzuKubernetesReleaseList, out *TanzuKubernetesReleaseList, s conversion.Scope) error { - return autoConvert_v1alpha3_TanzuKubernetesReleaseList_To_v1alpha2_TanzuKubernetesReleaseList(in, out, s) -} - -func autoConvert_v1alpha2_TanzuKubernetesReleaseSpec_To_v1alpha3_TanzuKubernetesReleaseSpec(in *TanzuKubernetesReleaseSpec, out *v1alpha3.TanzuKubernetesReleaseSpec, s conversion.Scope) error { - out.Version = in.Version - // WARNING: in.KubernetesVersion requires manual conversion: does not exist in peer-type - // WARNING: in.Repository requires manual conversion: does not exist in peer-type - // WARNING: in.Images requires manual conversion: does not exist in peer-type - // WARNING: in.NodeImageRef requires manual conversion: does not exist in peer-type - return nil -} - -func autoConvert_v1alpha3_TanzuKubernetesReleaseSpec_To_v1alpha2_TanzuKubernetesReleaseSpec(in *v1alpha3.TanzuKubernetesReleaseSpec, out *TanzuKubernetesReleaseSpec, s conversion.Scope) error { - out.Version = in.Version - // WARNING: in.Kubernetes requires manual conversion: does not exist in peer-type - // WARNING: in.OSImages requires manual conversion: does not exist in peer-type - // WARNING: in.BootstrapPackages requires manual conversion: does not exist in peer-type - return nil -} - -func autoConvert_v1alpha2_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus(in *TanzuKubernetesReleaseStatus, out *v1alpha3.TanzuKubernetesReleaseStatus, s conversion.Scope) error { - out.Conditions = *(*[]v1beta1.Condition)(unsafe.Pointer(&in.Conditions)) - return nil -} - -// Convert_v1alpha2_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus is an autogenerated conversion function. -func Convert_v1alpha2_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus(in *TanzuKubernetesReleaseStatus, out *v1alpha3.TanzuKubernetesReleaseStatus, s conversion.Scope) error { - return autoConvert_v1alpha2_TanzuKubernetesReleaseStatus_To_v1alpha3_TanzuKubernetesReleaseStatus(in, out, s) -} - -func autoConvert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha2_TanzuKubernetesReleaseStatus(in *v1alpha3.TanzuKubernetesReleaseStatus, out *TanzuKubernetesReleaseStatus, s conversion.Scope) error { - out.Conditions = *(*[]v1beta1.Condition)(unsafe.Pointer(&in.Conditions)) - return nil -} - -// Convert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha2_TanzuKubernetesReleaseStatus is an autogenerated conversion function. -func Convert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha2_TanzuKubernetesReleaseStatus(in *v1alpha3.TanzuKubernetesReleaseStatus, out *TanzuKubernetesReleaseStatus, s conversion.Scope) error { - return autoConvert_v1alpha3_TanzuKubernetesReleaseStatus_To_v1alpha2_TanzuKubernetesReleaseStatus(in, out, s) -} diff --git a/apis/run/v1alpha2/zz_generated.deepcopy.go b/apis/run/v1alpha2/zz_generated.deepcopy.go deleted file mode 100644 index 9b9a3e8666..0000000000 --- a/apis/run/v1alpha2/zz_generated.deepcopy.go +++ /dev/null @@ -1,618 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha2 - -import ( - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/cluster-api/api/v1alpha3" - "sigs.k8s.io/cluster-api/api/v1beta1" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *APIEndpoint) DeepCopyInto(out *APIEndpoint) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new APIEndpoint. -func (in *APIEndpoint) DeepCopy() *APIEndpoint { - if in == nil { - return nil - } - out := new(APIEndpoint) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AddonStatus) DeepCopyInto(out *AddonStatus) { - *out = *in - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make(v1alpha3.Conditions, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AddonStatus. -func (in *AddonStatus) DeepCopy() *AddonStatus { - if in == nil { - return nil - } - out := new(AddonStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CNIConfiguration) DeepCopyInto(out *CNIConfiguration) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CNIConfiguration. -func (in *CNIConfiguration) DeepCopy() *CNIConfiguration { - if in == nil { - return nil - } - out := new(CNIConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ContainerImage) DeepCopyInto(out *ContainerImage) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerImage. -func (in *ContainerImage) DeepCopy() *ContainerImage { - if in == nil { - return nil - } - out := new(ContainerImage) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Distribution) DeepCopyInto(out *Distribution) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Distribution. -func (in *Distribution) DeepCopy() *Distribution { - if in == nil { - return nil - } - out := new(Distribution) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Network) DeepCopyInto(out *Network) { - *out = *in - if in.Services != nil { - in, out := &in.Services, &out.Services - *out = new(NetworkRanges) - (*in).DeepCopyInto(*out) - } - if in.Pods != nil { - in, out := &in.Pods, &out.Pods - *out = new(NetworkRanges) - (*in).DeepCopyInto(*out) - } - if in.CNI != nil { - in, out := &in.CNI, &out.CNI - *out = new(CNIConfiguration) - **out = **in - } - if in.Proxy != nil { - in, out := &in.Proxy, &out.Proxy - *out = new(ProxyConfiguration) - (*in).DeepCopyInto(*out) - } - if in.Trust != nil { - in, out := &in.Trust, &out.Trust - *out = new(TrustConfiguration) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Network. -func (in *Network) DeepCopy() *Network { - if in == nil { - return nil - } - out := new(Network) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NetworkRanges) DeepCopyInto(out *NetworkRanges) { - *out = *in - if in.CIDRBlocks != nil { - in, out := &in.CIDRBlocks, &out.CIDRBlocks - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkRanges. -func (in *NetworkRanges) DeepCopy() *NetworkRanges { - if in == nil { - return nil - } - out := new(NetworkRanges) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NodePool) DeepCopyInto(out *NodePool) { - *out = *in - if in.Labels != nil { - in, out := &in.Labels, &out.Labels - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.Taints != nil { - in, out := &in.Taints, &out.Taints - *out = make([]v1.Taint, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - in.TopologySettings.DeepCopyInto(&out.TopologySettings) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodePool. -func (in *NodePool) DeepCopy() *NodePool { - if in == nil { - return nil - } - out := new(NodePool) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ProxyConfiguration) DeepCopyInto(out *ProxyConfiguration) { - *out = *in - if in.HttpProxy != nil { - in, out := &in.HttpProxy, &out.HttpProxy - *out = new(string) - **out = **in - } - if in.HttpsProxy != nil { - in, out := &in.HttpsProxy, &out.HttpsProxy - *out = new(string) - **out = **in - } - if in.NoProxy != nil { - in, out := &in.NoProxy, &out.NoProxy - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProxyConfiguration. -func (in *ProxyConfiguration) DeepCopy() *ProxyConfiguration { - if in == nil { - return nil - } - out := new(ProxyConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Settings) DeepCopyInto(out *Settings) { - *out = *in - if in.Network != nil { - in, out := &in.Network, &out.Network - *out = new(Network) - (*in).DeepCopyInto(*out) - } - if in.Storage != nil { - in, out := &in.Storage, &out.Storage - *out = new(Storage) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Settings. -func (in *Settings) DeepCopy() *Settings { - if in == nil { - return nil - } - out := new(Settings) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Storage) DeepCopyInto(out *Storage) { - *out = *in - if in.Classes != nil { - in, out := &in.Classes, &out.Classes - *out = make([]string, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Storage. -func (in *Storage) DeepCopy() *Storage { - if in == nil { - return nil - } - out := new(Storage) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TKRReference) DeepCopyInto(out *TKRReference) { - *out = *in - if in.Reference != nil { - in, out := &in.Reference, &out.Reference - *out = new(v1.ObjectReference) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TKRReference. -func (in *TKRReference) DeepCopy() *TKRReference { - if in == nil { - return nil - } - out := new(TKRReference) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TLSCertificate) DeepCopyInto(out *TLSCertificate) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TLSCertificate. -func (in *TLSCertificate) DeepCopy() *TLSCertificate { - if in == nil { - return nil - } - out := new(TLSCertificate) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesCluster) DeepCopyInto(out *TanzuKubernetesCluster) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesCluster. -func (in *TanzuKubernetesCluster) DeepCopy() *TanzuKubernetesCluster { - if in == nil { - return nil - } - out := new(TanzuKubernetesCluster) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TanzuKubernetesCluster) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesClusterList) DeepCopyInto(out *TanzuKubernetesClusterList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]TanzuKubernetesCluster, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesClusterList. -func (in *TanzuKubernetesClusterList) DeepCopy() *TanzuKubernetesClusterList { - if in == nil { - return nil - } - out := new(TanzuKubernetesClusterList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TanzuKubernetesClusterList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesClusterSpec) DeepCopyInto(out *TanzuKubernetesClusterSpec) { - *out = *in - in.Topology.DeepCopyInto(&out.Topology) - out.Distribution = in.Distribution - if in.Settings != nil { - in, out := &in.Settings, &out.Settings - *out = new(Settings) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesClusterSpec. -func (in *TanzuKubernetesClusterSpec) DeepCopy() *TanzuKubernetesClusterSpec { - if in == nil { - return nil - } - out := new(TanzuKubernetesClusterSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesClusterStatus) DeepCopyInto(out *TanzuKubernetesClusterStatus) { - *out = *in - if in.APIEndpoints != nil { - in, out := &in.APIEndpoints, &out.APIEndpoints - *out = make([]APIEndpoint, len(*in)) - copy(*out, *in) - } - if in.Addons != nil { - in, out := &in.Addons, &out.Addons - *out = make([]AddonStatus, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make(v1alpha3.Conditions, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesClusterStatus. -func (in *TanzuKubernetesClusterStatus) DeepCopy() *TanzuKubernetesClusterStatus { - if in == nil { - return nil - } - out := new(TanzuKubernetesClusterStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesRelease) DeepCopyInto(out *TanzuKubernetesRelease) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesRelease. -func (in *TanzuKubernetesRelease) DeepCopy() *TanzuKubernetesRelease { - if in == nil { - return nil - } - out := new(TanzuKubernetesRelease) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TanzuKubernetesRelease) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesReleaseList) DeepCopyInto(out *TanzuKubernetesReleaseList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]TanzuKubernetesRelease, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesReleaseList. -func (in *TanzuKubernetesReleaseList) DeepCopy() *TanzuKubernetesReleaseList { - if in == nil { - return nil - } - out := new(TanzuKubernetesReleaseList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TanzuKubernetesReleaseList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesReleaseSpec) DeepCopyInto(out *TanzuKubernetesReleaseSpec) { - *out = *in - if in.Images != nil { - in, out := &in.Images, &out.Images - *out = make([]ContainerImage, len(*in)) - copy(*out, *in) - } - if in.NodeImageRef != nil { - in, out := &in.NodeImageRef, &out.NodeImageRef - *out = new(v1.ObjectReference) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesReleaseSpec. -func (in *TanzuKubernetesReleaseSpec) DeepCopy() *TanzuKubernetesReleaseSpec { - if in == nil { - return nil - } - out := new(TanzuKubernetesReleaseSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesReleaseStatus) DeepCopyInto(out *TanzuKubernetesReleaseStatus) { - *out = *in - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]v1beta1.Condition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesReleaseStatus. -func (in *TanzuKubernetesReleaseStatus) DeepCopy() *TanzuKubernetesReleaseStatus { - if in == nil { - return nil - } - out := new(TanzuKubernetesReleaseStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Topology) DeepCopyInto(out *Topology) { - *out = *in - in.ControlPlane.DeepCopyInto(&out.ControlPlane) - if in.NodePools != nil { - in, out := &in.NodePools, &out.NodePools - *out = make([]NodePool, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Topology. -func (in *Topology) DeepCopy() *Topology { - if in == nil { - return nil - } - out := new(Topology) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TopologySettings) DeepCopyInto(out *TopologySettings) { - *out = *in - if in.Replicas != nil { - in, out := &in.Replicas, &out.Replicas - *out = new(int32) - **out = **in - } - if in.Volumes != nil { - in, out := &in.Volumes, &out.Volumes - *out = make([]Volume, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - in.TKR.DeepCopyInto(&out.TKR) - if in.NodeDrainTimeout != nil { - in, out := &in.NodeDrainTimeout, &out.NodeDrainTimeout - *out = new(metav1.Duration) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TopologySettings. -func (in *TopologySettings) DeepCopy() *TopologySettings { - if in == nil { - return nil - } - out := new(TopologySettings) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TrustConfiguration) DeepCopyInto(out *TrustConfiguration) { - *out = *in - if in.AdditionalTrustedCAs != nil { - in, out := &in.AdditionalTrustedCAs, &out.AdditionalTrustedCAs - *out = make([]TLSCertificate, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrustConfiguration. -func (in *TrustConfiguration) DeepCopy() *TrustConfiguration { - if in == nil { - return nil - } - out := new(TrustConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Volume) DeepCopyInto(out *Volume) { - *out = *in - if in.Capacity != nil { - in, out := &in.Capacity, &out.Capacity - *out = make(v1.ResourceList, len(*in)) - for key, val := range *in { - (*out)[key] = val.DeepCopy() - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Volume. -func (in *Volume) DeepCopy() *Volume { - if in == nil { - return nil - } - out := new(Volume) - in.DeepCopyInto(out) - return out -} diff --git a/apis/run/v1alpha3/clusterbootstrap_types.go b/apis/run/v1alpha3/clusterbootstrap_types.go deleted file mode 100644 index 9b0c047bc4..0000000000 --- a/apis/run/v1alpha3/clusterbootstrap_types.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" -) - -// +kubebuilder:object:root=true -// +kubebuilder:subresource:status -// +kubebuilder:resource:path=clusterbootstraps,shortName=cb,scope=Namespaced -// +kubebuilder:printcolumn:name="CNI",type="string",JSONPath=".spec.cni.refName",description="CNI package name and version" -// +kubebuilder:printcolumn:name="CSI",type="string",JSONPath=".spec.csi.refName",description="CSI package name and version" -// +kubebuilder:printcolumn:name="CPI",type="string",JSONPath=".spec.cpi.refName",description="CPI package name and version" -// +kubebuilder:printcolumn:name="Kapp",type="string",JSONPath=".spec.kapp.refName",description="Kapp package name and version" -// +kubebuilder:printcolumn:name="Additional Packages",type="string",JSONPath=".spec.additionalPackages[*].refName",description="Additional packages",priority=10 -// +kubebuilder:printcolumn:name="Resolved_TKR",type="string",JSONPath=".status.resolvedTKR",description="Resolved TKR name" - -// ClusterBootstrap is the Schema for the ClusterBootstraps API -type ClusterBootstrap struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec *ClusterBootstrapTemplateSpec `json:"spec"` - Status ClusterBootstrapStatus `json:"status,omitempty"` -} - -// ClusterBootstrapStatus defines the observed state of ClusterBootstrap -type ClusterBootstrapStatus struct { - ResolvedTKR string `json:"resolvedTKR,omitempty"` - - Conditions clusterapiv1beta1.Conditions `json:"conditions,omitempty"` -} - -// GetConditions returns the set of conditions for this object. implements Setter interface -func (c *ClusterBootstrap) GetConditions() clusterapiv1beta1.Conditions { - return c.Status.Conditions -} - -// SetConditions sets the conditions on this object. implements Setter interface -func (c *ClusterBootstrap) SetConditions(conditions clusterapiv1beta1.Conditions) { - c.Status.Conditions = conditions -} - -//+kubebuilder:object:root=true - -// ClusterBootstrapList contains a list of ClusterBootstrap -type ClusterBootstrapList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []ClusterBootstrap `json:"items"` -} - -func init() { - SchemeBuilder.Register(&ClusterBootstrap{}, &ClusterBootstrapList{}) -} diff --git a/apis/run/v1alpha3/clusterbootstraptemplate_types.go b/apis/run/v1alpha3/clusterbootstraptemplate_types.go deleted file mode 100644 index 35fee35557..0000000000 --- a/apis/run/v1alpha3/clusterbootstraptemplate_types.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - "encoding/json" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// ClusterBootstrapTemplateSpec defines the desired state of ClusterBootstrapTemplate -type ClusterBootstrapTemplateSpec struct { - // Paused can be used to prevent controllers from processing the ClusterBootstrap and all its associated objects. - // +optional - // +kubebuilder:default:=false - Paused bool `json:"paused,omitempty"` - - // +optional - CNI *ClusterBootstrapPackage `json:"cni,omitempty"` - // +optional - CSI *ClusterBootstrapPackage `json:"csi,omitempty"` - // +optional - CPI *ClusterBootstrapPackage `json:"cpi,omitempty"` - // +optional - Kapp *ClusterBootstrapPackage `json:"kapp,omitempty"` - // +optional - AdditionalPackages []*ClusterBootstrapPackage `json:"additionalPackages,omitempty"` -} - -// +kubebuilder:object:root=true -// +kubebuilder:resource:path=clusterbootstraptemplates,shortName=cbt,scope=Namespaced -// +kubebuilder:printcolumn:name="CNI",type="string",JSONPath=".spec.cni.refName",description="CNI package name and version" -// +kubebuilder:printcolumn:name="CSI",type="string",JSONPath=".spec.csi.refName",description="CSI package name and version" -// +kubebuilder:printcolumn:name="CPI",type="string",JSONPath=".spec.cpi.refName",description="CPI package name and version" -// +kubebuilder:printcolumn:name="Kapp",type="string",JSONPath=".spec.kapp.refName",description="Kapp package name and version" -// +kubebuilder:printcolumn:name="Additional Packages",type="string",JSONPath=".spec.additionalPackages[*].refName",description="Additional packages",priority=10 - -// ClusterBootstrapTemplate is the Schema for the ClusterBootstraptemplates API -type ClusterBootstrapTemplate struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec *ClusterBootstrapTemplateSpec `json:"spec"` -} - -type ClusterBootstrapPackage struct { - RefName string `json:"refName"` - // +optional - ValuesFrom *ValuesFrom `json:"valuesFrom,omitempty"` -} - -// ValuesFrom specifies how values for package install are retrieved from -// +kubebuilder:object:generate=false -type ValuesFrom struct { - // +optional - // +kubebuilder:validation:Schemaless - // +kubebuilder:validation:Type=object - // +kubebuilder:pruning:PreserveUnknownFields - Inline map[string]interface{} `json:"inline,omitempty"` - // +optional - SecretRef string `json:"secretRef,omitempty"` - // +optional - ProviderRef *corev1.TypedLocalObjectReference `json:"providerRef,omitempty"` -} - -func (in *ValuesFrom) CountFields() int { - if in == nil { - return 0 - } - counterFunc := func(flag bool) int { - if flag { - return 1 - } - return 0 - } - return counterFunc(in.Inline != nil) + counterFunc(in.SecretRef != "") + counterFunc(in.ProviderRef != nil) -} - -// +kubebuilder:object:root=true - -// DeepCopyInto is a deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ValuesFrom) DeepCopyInto(out *ValuesFrom) { - *out = *in - if in.Inline != nil { - out.Inline = make(map[string]interface{}, len(in.Inline)) - refBytes, _ := json.Marshal(in.Inline) // ignoring error: the original data is a JSON object - _ = json.Unmarshal(refBytes, &out.Inline) // ignoring error: the original data is a JSON object - } - if in.ProviderRef != nil { - in, out := &in.ProviderRef, &out.ProviderRef - *out = new(corev1.TypedLocalObjectReference) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is a deepcopy function, copying the receiver, creating a new MachineImageInfo. -func (in *ValuesFrom) DeepCopy() *ValuesFrom { - if in == nil { - return nil - } - out := new(ValuesFrom) - in.DeepCopyInto(out) - return out -} - -// +kubebuilder:object:root=true - -// ClusterBootstrapTemplateList contains a list of ClusterBootstrapTemplate -type ClusterBootstrapTemplateList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []ClusterBootstrapTemplate `json:"items"` -} - -func init() { - SchemeBuilder.Register(&ClusterBootstrapTemplate{}, &ClusterBootstrapTemplateList{}) -} diff --git a/apis/run/v1alpha3/conversion.go b/apis/run/v1alpha3/conversion.go deleted file mode 100644 index 1214e5d674..0000000000 --- a/apis/run/v1alpha3/conversion.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -func (*TanzuKubernetesRelease) Hub() {} -func (*TanzuKubernetesReleaseList) Hub() {} diff --git a/apis/run/v1alpha3/doc.go b/apis/run/v1alpha3/doc.go deleted file mode 100644 index 20383bee40..0000000000 --- a/apis/run/v1alpha3/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha3 contains the v1alpha3 API implementation. -// +groupName=run.tanzu.vmware.com -// +k8s:deepcopy-gen=package -// +k8s:conversion-gen=github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3 -package v1alpha3 diff --git a/apis/run/v1alpha3/fuzz.go b/apis/run/v1alpha3/fuzz.go deleted file mode 100644 index dfea4d461a..0000000000 --- a/apis/run/v1alpha3/fuzz.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - fuzz "github.com/google/gofuzz" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/version" -) - -// FuzzTKRSpec fuzzes the passed TanzuKubernetesReleaseSpec. -func FuzzTKRSpec(spec *TanzuKubernetesReleaseSpec, c fuzz.Continue) { - v := &version.Version{} - c.Fuzz(v) - spec.Version = v.String() - c.Fuzz(&spec.Kubernetes) - c.Fuzz(&spec.OSImages) - c.Fuzz(&spec.BootstrapPackages) -} - -// FuzzTKRSpecKubernetes fuzzes the passed TKR KubernetesSpec. -func FuzzTKRSpecKubernetes(kubernetesSpec *KubernetesSpec, c fuzz.Continue) { - v := &version.Version{} - c.Fuzz(v) - kubernetesSpec.Version = v.String() - c.Fuzz(&kubernetesSpec.ImageRepository) - c.Fuzz(kubernetesSpec.Etcd) - c.Fuzz(kubernetesSpec.Pause) - c.Fuzz(kubernetesSpec.CoreDNS) - c.Fuzz(kubernetesSpec.KubeVIP) -} diff --git a/apis/run/v1alpha3/groupversion_info.go b/apis/run/v1alpha3/groupversion_info.go deleted file mode 100644 index 597d382c5e..0000000000 --- a/apis/run/v1alpha3/groupversion_info.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha3 contains API Schema definitions for the run v1alpha3 API group -// +kubebuilder:object:generate=true -// +groupName=run.tanzu.vmware.com -package v1alpha3 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "run.tanzu.vmware.com", Version: "v1alpha3"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/apis/run/v1alpha3/kappcontrollerconfig_types.go b/apis/run/v1alpha3/kappcontrollerconfig_types.go deleted file mode 100644 index 1d4f9eb4b7..0000000000 --- a/apis/run/v1alpha3/kappcontrollerconfig_types.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. - -// KappControllerConfigSpec defines the desired state of KappControllerConfig -type KappControllerConfigSpec struct { - // The namespace in which kapp-controller is deployed - //+kubebuilder:validation:Optional - //+kubebuilder:default:=tkg-system - Namespace string `json:"namespace,omitempty"` - - //+kubebuilder:validation:Optional - //+kubebuilder:default:={deployment:{hostNetwork:true}} - KappController KappController `json:"kappController,omitempty"` // object default needs at least one param so that CRD generation is not null, issue https://github.com/kubernetes-sigs/controller-tools/issues/631 -} - -type KappController struct { - // Whether to create namespace specified for kapp-controller - //+kubebuilder:validation:Optional - //+kubebuilder:default:=false - CreateNamespace bool `json:"createNamespace,omitempty"` - - // The namespace value used for global packaging resources. Any Package and PackageMetadata CRs within that namespace will be included in all other namespaces on the cluster, without duplicating them - //+kubebuilder:validation:Optional - //+kubebuilder:default:=tkg-system - GlobalNamespace string `json:"globalNamespace,omitempty"` - - //+kubebuilder:validation:Optional - //+kubebuilder:default:={hostNetwork:true} - Deployment KappDeployment `json:"deployment,omitempty"` // object default needs at least one param so that CRD generation is not null, issue https://github.com/kubernetes-sigs/controller-tools/issues/631 - - Config KappConfig `json:"config,omitempty"` -} - -type KappDeployment struct { - // Whether to enable host networking for kapp-controller deployment - //+kubebuilder:validation:Optional - //+kubebuilder:default:=true - HostNetwork bool `json:"hostNetwork,omitempty"` - - // The priority value that various system components use to find the priority of the kapp-controller pod - //+kubebuilder:validation:Optional - //+kubebuilder:default:=system-cluster-critical - PriorityClassName string `json:"priorityClassName,omitempty"` - - // Concurrency of kapp-controller deployment - //+kubebuilder:validation:Optional - //+kubebuilder:default:=4 - Concurrency int `json:"concurrency,omitempty"` - - // kapp-controller deployment tolerations - //+kubebuilder:validation:Optional - //+kubebuilder:default:={{key: CriticalAddonsOnly, operator: Exists}, {effect: NoSchedule, key: node-role.kubernetes.io/control-plane}, {effect: NoSchedule, key: node-role.kubernetes.io/master}, {effect: NoSchedule, key: node.kubernetes.io/not-ready}, {effect: NoSchedule, key: node.cloudprovider.kubernetes.io/uninitialized, value: "true"}} - Tolerations []map[string]string `json:"tolerations,omitempty"` - - // Bind port for kapp-controller API - //+kubebuilder:validation:Optional - //+kubebuilder:default:=10100 - APIPort int `json:"apiPort,omitempty"` - - // Address for metrics server - //+kubebuilder:validation:Optional - //+kubebuilder:default:="0" - MetricsBindAddress string `json:"metricsBindAddress,omitempty"` -} - -type KappConfig struct { - // A cert chain of trusted CA certs. These will be added to the system-wide cert pool of trusted CA's. Cluster-wide CA Certificate setting will be used if this is not provided. - //+kubebuilder:validation:Optional - CaCerts string `json:"caCerts,omitempty"` - - // The url/ip of a proxy for kapp controller to use when making network requests. Cluster-wide HTTP proxy setting will be used if this is not provided. - //+kubebuilder:validation:Optional - HTTPProxy string `json:"httpProxy,omitempty"` - - // The url/ip of a TLS capable proxy for kapp-controller to use when making network requests. Cluster-wide HTTPS proxy setting will be used if this is not provided. - //+kubebuilder:validation:Optional - HTTPSProxy string `json:"httpsProxy,omitempty"` - - // A comma delimited list of domain names which kapp-controller should bypass the proxy for when making requests. Cluster-wide no-proxy setting will be used if this is not provided. - //+kubebuilder:validation:Optional - NoProxy string `json:"noProxy,omitempty"` - - // A comma delimited list of hostnames for which kapp-controller should skip TLS verification - //+kubebuilder:validation:Optional - DangerousSkipTLSVerify string `json:"dangerousSkipTLSVerify,omitempty"` -} - -// KappControllerConfigStatus defines the observed state of KappControllerConfig -type KappControllerConfigStatus struct { - // Name of the data value secret created by controller - //+kubebuilder:validation:Optional - SecretRef string `json:"secretRef,omitempty"` -} - -//+kubebuilder:object:root=true -//+kubebuilder:subresource:status -//+kubebuilder:resource:path=kappcontrollerconfigs,shortName=kappconf,scope=Namespaced -//+kubebuilder:printcolumn:name="Namespace",type="string",JSONPath=".spec.namespace",description="The namespace in which kapp-controller is deployed" -//+kubebuilder:printcolumn:name="GlobalNamespace",type="string",JSONPath=".spec.kappController.globalNamespace",description="The namespace value used for global packaging resources. Any Package and PackageMetadata CRs within that namespace will be included in all other namespaces on the cluster, without duplicating them" -//+kubebuilder:printcolumn:name="SecretName",type="string",JSONPath=".status.secretName",description="Name of the kapp-controller data values secret" - -// KappControllerConfig is the Schema for the kappcontrollerconfigs API -type KappControllerConfig struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec KappControllerConfigSpec `json:"spec"` - Status KappControllerConfigStatus `json:"status,omitempty"` -} - -//+kubebuilder:object:root=true - -// KappControllerConfigList contains a list of KappControllerConfig -type KappControllerConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []KappControllerConfig `json:"items"` -} - -func init() { - SchemeBuilder.Register(&KappControllerConfig{}, &KappControllerConfigList{}) -} diff --git a/apis/run/v1alpha3/osimage_test.go b/apis/run/v1alpha3/osimage_test.go deleted file mode 100644 index 33c533336f..0000000000 --- a/apis/run/v1alpha3/osimage_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestMachineImageInfo_DeepCopy(t *testing.T) { - imageInfo := &MachineImageInfo{ - Type: "aws", - Ref: map[string]interface{}{ - "id": "ami-0f2e5eec7ae0a1986", - "isFoo": true, - }, - } - assert.Equal(t, imageInfo, imageInfo.DeepCopy()) -} diff --git a/apis/run/v1alpha3/osimage_types.go b/apis/run/v1alpha3/osimage_types.go deleted file mode 100644 index dc830a1838..0000000000 --- a/apis/run/v1alpha3/osimage_types.go +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - "encoding/json" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" -) - -const ( - LabelImageType = "image-type" - LabelOSType = "os-type" - LabelOSName = "os-name" - LabelOSVersion = "os-version" - LabelOSArch = "os-arch" -) - -// OSInfo describes the "OS" part of the OSImage, defined by the Operating System's name, version and CPU architecture. -type OSInfo struct { - Type string `json:"type"` - Name string `json:"name"` - Version string `json:"version"` - Arch string `json:"arch"` -} - -// MachineImageInfo describes the "Image" part of the OSImage, defined by the image type. -// +kubebuilder:object:generate=false -type MachineImageInfo struct { - // Type of the OSImage, roughly corresponding to the infrastructure provider (vSphere can serve both ova and vmop). - // Some of currently known types are: "ami", "azure", "docker", "ova", "vmop". - Type string `json:"type"` - - // Ref is a key-value map identifying the image within the infrastructure provider. This is the data - // to be injected into the infra-Machine objects (like AWSMachine) on creation. - // +kubebuilder:validation:Schemaless - // +kubebuilder:validation:Type=object - // +kubebuilder:pruning:PreserveUnknownFields - Ref map[string]interface{} `json:"ref"` -} - -// DeepCopyInto is a deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *MachineImageInfo) DeepCopyInto(out *MachineImageInfo) { - *out = *in - if in.Ref != nil { - out.Ref = make(map[string]interface{}, len(in.Ref)) - refBytes, _ := json.Marshal(in.Ref) // ignoring error: the original data is a JSON object - _ = json.Unmarshal(refBytes, &out.Ref) // ignoring error: the original data is a JSON object - } -} - -// DeepCopy is a deepcopy function, copying the receiver, creating a new MachineImageInfo. -func (in *MachineImageInfo) DeepCopy() *MachineImageInfo { - if in == nil { - return nil - } - out := new(MachineImageInfo) - in.DeepCopyInto(out) - return out -} - -// OSImageSpec defines the desired state of OSImage -type OSImageSpec struct { - // KubernetesVersion specifies the build version of the Kubernetes shipped with this OSImage. - KubernetesVersion string `json:"kubernetesVersion"` - - // OS specifies the "OS" part of the OSImage. - OS OSInfo `json:"os"` - - // Image specifies the "Image" part of the OSImage. - Image MachineImageInfo `json:"image"` -} - -// OSImageStatus defines the observed state of OSImage -type OSImageStatus struct { - Conditions []clusterv1.Condition `json:"conditions,omitempty"` -} - -// +kubebuilder:object:root=true - -// OSImage is the schema for the OSImages API. -// OSImage objects represent OSImages shipped as parts of TKRs. OSImages are immutable to end-users. -// They are created and managed by TKG to provide discovery of Kubernetes releases to TKG users and OS image details -// for infrastructure Machines. -// -// +kubebuilder:object:root=true -// +kubebuilder:resource:path=osimages,scope=Cluster,shortName=osimg -// +kubebuilder:storageversion -// +kubebuilder:subresource:status -// +kubebuilder:printcolumn:name="K8S Version",type=string,JSONPath=.spec.kubernetesVersion -// +kubebuilder:printcolumn:name="OS Name",type=string,JSONPath=.spec.os.name -// +kubebuilder:printcolumn:name="OS Version",type=string,JSONPath=.spec.os.version -// +kubebuilder:printcolumn:name="Arch",type=string,JSONPath=.spec.os.arch -// +kubebuilder:printcolumn:name="Type",type=string,JSONPath=.spec.image.type -// +kubebuilder:printcolumn:name="Compatible",type=string,JSONPath=.status.conditions[?(@.type=='Compatible')].status -// +kubebuilder:printcolumn:name="Created",type="date",JSONPath=.metadata.creationTimestamp -type OSImage struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec OSImageSpec `json:"spec,omitempty"` - Status OSImageStatus `json:"status,omitempty"` -} - -// GetConditions implements capi conditions Getter interface -func (r *OSImage) GetConditions() clusterv1.Conditions { - return r.Status.Conditions -} - -// SetConditions implements capi conditions Setter interface -func (r *OSImage) SetConditions(conditions clusterv1.Conditions) { - r.Status.Conditions = conditions -} - -// +kubebuilder:object:root=true - -// OSImageList contains a list of OSImage -type OSImageList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []OSImage `json:"items"` -} - -func init() { - SchemeBuilder.Register(&OSImage{}, &OSImageList{}) -} diff --git a/apis/run/v1alpha3/tanzukubernetesrelease_types.go b/apis/run/v1alpha3/tanzukubernetesrelease_types.go deleted file mode 100644 index c600e37002..0000000000 --- a/apis/run/v1alpha3/tanzukubernetesrelease_types.go +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" -) - -const ( - ConditionCompatible = "Compatible" - ConditionValid = "Valid" - ConditionReady = "Ready" - - ConditionUpdatesAvailable = "UpdatesAvailable" - - ReasonCannotParseTKR = "CannotParseTKR" - ReasonAlreadyUpToDate = "AlreadyUpToDate" - - LabelIncompatible = "incompatible" - LabelDeactivated = "deactivated" - LabelInvalid = "invalid" - - AnnotationResolveTKR = "run.tanzu.vmware.com/resolve-tkr" - AnnotationResolveOSImage = "run.tanzu.vmware.com/resolve-os-image" - - LabelTKR = "run.tanzu.vmware.com/tkr" - LabelOSImage = "run.tanzu.vmware.com/os-image" - - LabelLegacyTKR = "run.tanzu.vmware.com/legacy-tkr" -) - -// TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease -type TanzuKubernetesReleaseSpec struct { - // Version is the fully qualified Semantic Versioning conformant version of the TanzuKubernetesRelease. - // Version MUST be unique across all TanzuKubernetesRelease objects. - Version string `json:"version"` - - // Kubernetes is Kubernetes - Kubernetes KubernetesSpec `json:"kubernetes"` - - // OSImages lists references to all OSImage objects shipped with this TKR. - OSImages []corev1.LocalObjectReference `json:"osImages,omitempty"` - - // BootstrapPackages lists references to all bootstrap packages shipped with this TKR. - BootstrapPackages []corev1.LocalObjectReference `json:"bootstrapPackages,omitempty"` -} - -// KubernetesSpec specifies the details about the Kubernetes distribution shipped by this TKR. -type KubernetesSpec struct { - // Version is Semantic Versioning conformant version of the Kubernetes build shipped by this TKR. - // The same Kubernetes build MAY be shipped by multiple TKRs. - Version string `json:"version"` - - // ImageRepository specifies container image registry to pull images from. - ImageRepository string `json:"imageRepository,omitempty"` - - // Etcd specifies the container image repository and tag for etcd. - // +optional - Etcd *ContainerImageInfo `json:"etcd"` - - // Pause specifies the container image repository and tag for pause. - // +optional - Pause *ContainerImageInfo `json:"pause"` - - // CoreDNS specifies the container image repository and tag for coredns. - // +optional - CoreDNS *ContainerImageInfo `json:"coredns"` - - // KubeVIP specifies the container image repository and tag for kube-vip. - // +optional - KubeVIP *ContainerImageInfo `json:"kube-vip"` -} - -// ContainerImageInfo allows to customize the image used for components that are not -// originated from the Kubernetes/Kubernetes release process (such as etcd and coredns). -type ContainerImageInfo struct { - // ImageRepository sets the container registry to pull images from. - // if not set, defaults to the ImageRepository defined in KubernetesSpec. - // +optional - ImageRepository string `json:"imageRepository,omitempty"` - - // ImageTag specifies a tag for the image. - ImageTag string `json:"imageTag,omitempty"` -} - -// TanzuKubernetesReleaseStatus defines the observed state of TanzuKubernetesRelease -type TanzuKubernetesReleaseStatus struct { - Conditions []clusterv1.Condition `json:"conditions,omitempty"` -} - -// +kubebuilder:object:root=true - -// TanzuKubernetesRelease is the schema for the tanzukubernetesreleases API. -// TanzuKubernetesRelease objects represent Kubernetes releases available via TKG, which can be used to create -// TanzuKubernetesCluster instances. TKRs are immutable to end-users. They are created and managed by TKG to -// provide discovery of Kubernetes releases to TKG users. -// -// +kubebuilder:object:root=true -// +kubebuilder:resource:path=tanzukubernetesreleases,scope=Cluster,shortName=tkr -// +kubebuilder:subresource:status -// +kubebuilder:printcolumn:name="Version",type=string,JSONPath=.spec.version -// +kubebuilder:printcolumn:name="Ready",type=string,JSONPath=.status.conditions[?(@.type=='Ready')].status -// +kubebuilder:printcolumn:name="Compatible",type=string,JSONPath=.status.conditions[?(@.type=='Compatible')].status -// +kubebuilder:printcolumn:name="Created",type="date",JSONPath=.metadata.creationTimestamp -type TanzuKubernetesRelease struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec TanzuKubernetesReleaseSpec `json:"spec,omitempty"` - Status TanzuKubernetesReleaseStatus `json:"status,omitempty"` -} - -// GetConditions implements capi conditions Getter interface -func (r *TanzuKubernetesRelease) GetConditions() clusterv1.Conditions { - return r.Status.Conditions -} - -// SetConditions implements capi conditions Setter interface -func (r *TanzuKubernetesRelease) SetConditions(conditions clusterv1.Conditions) { - r.Status.Conditions = conditions -} - -// +kubebuilder:object:root=true - -// TanzuKubernetesReleaseList contains a list of TanzuKubernetesRelease -type TanzuKubernetesReleaseList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []TanzuKubernetesRelease `json:"items"` -} - -func init() { - SchemeBuilder.Register(&TanzuKubernetesRelease{}, &TanzuKubernetesReleaseList{}) -} diff --git a/apis/run/v1alpha3/tanzukubernetesrelease_webhook.go b/apis/run/v1alpha3/tanzukubernetesrelease_webhook.go deleted file mode 100644 index 8fc79bff9a..0000000000 --- a/apis/run/v1alpha3/tanzukubernetesrelease_webhook.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - ctrl "sigs.k8s.io/controller-runtime" -) - -func (r *TanzuKubernetesRelease) SetupWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(r). - Complete() -} - -// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! diff --git a/apis/run/v1alpha3/zz_generated.deepcopy.go b/apis/run/v1alpha3/zz_generated.deepcopy.go deleted file mode 100644 index 42331b9fb3..0000000000 --- a/apis/run/v1alpha3/zz_generated.deepcopy.go +++ /dev/null @@ -1,647 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha3 - -import ( - v1 "k8s.io/api/core/v1" - runtime "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/cluster-api/api/v1beta1" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterBootstrap) DeepCopyInto(out *ClusterBootstrap) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.Spec != nil { - in, out := &in.Spec, &out.Spec - *out = new(ClusterBootstrapTemplateSpec) - (*in).DeepCopyInto(*out) - } - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrap. -func (in *ClusterBootstrap) DeepCopy() *ClusterBootstrap { - if in == nil { - return nil - } - out := new(ClusterBootstrap) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClusterBootstrap) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterBootstrapList) DeepCopyInto(out *ClusterBootstrapList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ClusterBootstrap, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapList. -func (in *ClusterBootstrapList) DeepCopy() *ClusterBootstrapList { - if in == nil { - return nil - } - out := new(ClusterBootstrapList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClusterBootstrapList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterBootstrapPackage) DeepCopyInto(out *ClusterBootstrapPackage) { - *out = *in - if in.ValuesFrom != nil { - in, out := &in.ValuesFrom, &out.ValuesFrom - *out = (*in).DeepCopy() - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapPackage. -func (in *ClusterBootstrapPackage) DeepCopy() *ClusterBootstrapPackage { - if in == nil { - return nil - } - out := new(ClusterBootstrapPackage) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterBootstrapStatus) DeepCopyInto(out *ClusterBootstrapStatus) { - *out = *in - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make(v1beta1.Conditions, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapStatus. -func (in *ClusterBootstrapStatus) DeepCopy() *ClusterBootstrapStatus { - if in == nil { - return nil - } - out := new(ClusterBootstrapStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterBootstrapTemplate) DeepCopyInto(out *ClusterBootstrapTemplate) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.Spec != nil { - in, out := &in.Spec, &out.Spec - *out = new(ClusterBootstrapTemplateSpec) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapTemplate. -func (in *ClusterBootstrapTemplate) DeepCopy() *ClusterBootstrapTemplate { - if in == nil { - return nil - } - out := new(ClusterBootstrapTemplate) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClusterBootstrapTemplate) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterBootstrapTemplateList) DeepCopyInto(out *ClusterBootstrapTemplateList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ClusterBootstrapTemplate, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapTemplateList. -func (in *ClusterBootstrapTemplateList) DeepCopy() *ClusterBootstrapTemplateList { - if in == nil { - return nil - } - out := new(ClusterBootstrapTemplateList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClusterBootstrapTemplateList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterBootstrapTemplateSpec) DeepCopyInto(out *ClusterBootstrapTemplateSpec) { - *out = *in - if in.CNI != nil { - in, out := &in.CNI, &out.CNI - *out = new(ClusterBootstrapPackage) - (*in).DeepCopyInto(*out) - } - if in.CSI != nil { - in, out := &in.CSI, &out.CSI - *out = new(ClusterBootstrapPackage) - (*in).DeepCopyInto(*out) - } - if in.CPI != nil { - in, out := &in.CPI, &out.CPI - *out = new(ClusterBootstrapPackage) - (*in).DeepCopyInto(*out) - } - if in.Kapp != nil { - in, out := &in.Kapp, &out.Kapp - *out = new(ClusterBootstrapPackage) - (*in).DeepCopyInto(*out) - } - if in.AdditionalPackages != nil { - in, out := &in.AdditionalPackages, &out.AdditionalPackages - *out = make([]*ClusterBootstrapPackage, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(ClusterBootstrapPackage) - (*in).DeepCopyInto(*out) - } - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterBootstrapTemplateSpec. -func (in *ClusterBootstrapTemplateSpec) DeepCopy() *ClusterBootstrapTemplateSpec { - if in == nil { - return nil - } - out := new(ClusterBootstrapTemplateSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ContainerImageInfo) DeepCopyInto(out *ContainerImageInfo) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerImageInfo. -func (in *ContainerImageInfo) DeepCopy() *ContainerImageInfo { - if in == nil { - return nil - } - out := new(ContainerImageInfo) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KappConfig) DeepCopyInto(out *KappConfig) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KappConfig. -func (in *KappConfig) DeepCopy() *KappConfig { - if in == nil { - return nil - } - out := new(KappConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KappController) DeepCopyInto(out *KappController) { - *out = *in - in.Deployment.DeepCopyInto(&out.Deployment) - out.Config = in.Config -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KappController. -func (in *KappController) DeepCopy() *KappController { - if in == nil { - return nil - } - out := new(KappController) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KappControllerConfig) DeepCopyInto(out *KappControllerConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - out.Status = in.Status -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KappControllerConfig. -func (in *KappControllerConfig) DeepCopy() *KappControllerConfig { - if in == nil { - return nil - } - out := new(KappControllerConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *KappControllerConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KappControllerConfigList) DeepCopyInto(out *KappControllerConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]KappControllerConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KappControllerConfigList. -func (in *KappControllerConfigList) DeepCopy() *KappControllerConfigList { - if in == nil { - return nil - } - out := new(KappControllerConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *KappControllerConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KappControllerConfigSpec) DeepCopyInto(out *KappControllerConfigSpec) { - *out = *in - in.KappController.DeepCopyInto(&out.KappController) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KappControllerConfigSpec. -func (in *KappControllerConfigSpec) DeepCopy() *KappControllerConfigSpec { - if in == nil { - return nil - } - out := new(KappControllerConfigSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KappControllerConfigStatus) DeepCopyInto(out *KappControllerConfigStatus) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KappControllerConfigStatus. -func (in *KappControllerConfigStatus) DeepCopy() *KappControllerConfigStatus { - if in == nil { - return nil - } - out := new(KappControllerConfigStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KappDeployment) DeepCopyInto(out *KappDeployment) { - *out = *in - if in.Tolerations != nil { - in, out := &in.Tolerations, &out.Tolerations - *out = make([]map[string]string, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KappDeployment. -func (in *KappDeployment) DeepCopy() *KappDeployment { - if in == nil { - return nil - } - out := new(KappDeployment) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubernetesSpec) DeepCopyInto(out *KubernetesSpec) { - *out = *in - if in.Etcd != nil { - in, out := &in.Etcd, &out.Etcd - *out = new(ContainerImageInfo) - **out = **in - } - if in.Pause != nil { - in, out := &in.Pause, &out.Pause - *out = new(ContainerImageInfo) - **out = **in - } - if in.CoreDNS != nil { - in, out := &in.CoreDNS, &out.CoreDNS - *out = new(ContainerImageInfo) - **out = **in - } - if in.KubeVIP != nil { - in, out := &in.KubeVIP, &out.KubeVIP - *out = new(ContainerImageInfo) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubernetesSpec. -func (in *KubernetesSpec) DeepCopy() *KubernetesSpec { - if in == nil { - return nil - } - out := new(KubernetesSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OSImage) DeepCopyInto(out *OSImage) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSImage. -func (in *OSImage) DeepCopy() *OSImage { - if in == nil { - return nil - } - out := new(OSImage) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OSImage) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OSImageList) DeepCopyInto(out *OSImageList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]OSImage, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSImageList. -func (in *OSImageList) DeepCopy() *OSImageList { - if in == nil { - return nil - } - out := new(OSImageList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *OSImageList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OSImageSpec) DeepCopyInto(out *OSImageSpec) { - *out = *in - out.OS = in.OS - in.Image.DeepCopyInto(&out.Image) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSImageSpec. -func (in *OSImageSpec) DeepCopy() *OSImageSpec { - if in == nil { - return nil - } - out := new(OSImageSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OSImageStatus) DeepCopyInto(out *OSImageStatus) { - *out = *in - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]v1beta1.Condition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSImageStatus. -func (in *OSImageStatus) DeepCopy() *OSImageStatus { - if in == nil { - return nil - } - out := new(OSImageStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OSInfo) DeepCopyInto(out *OSInfo) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSInfo. -func (in *OSInfo) DeepCopy() *OSInfo { - if in == nil { - return nil - } - out := new(OSInfo) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesRelease) DeepCopyInto(out *TanzuKubernetesRelease) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) - in.Status.DeepCopyInto(&out.Status) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesRelease. -func (in *TanzuKubernetesRelease) DeepCopy() *TanzuKubernetesRelease { - if in == nil { - return nil - } - out := new(TanzuKubernetesRelease) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TanzuKubernetesRelease) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesReleaseList) DeepCopyInto(out *TanzuKubernetesReleaseList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]TanzuKubernetesRelease, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesReleaseList. -func (in *TanzuKubernetesReleaseList) DeepCopy() *TanzuKubernetesReleaseList { - if in == nil { - return nil - } - out := new(TanzuKubernetesReleaseList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TanzuKubernetesReleaseList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesReleaseSpec) DeepCopyInto(out *TanzuKubernetesReleaseSpec) { - *out = *in - in.Kubernetes.DeepCopyInto(&out.Kubernetes) - if in.OSImages != nil { - in, out := &in.OSImages, &out.OSImages - *out = make([]v1.LocalObjectReference, len(*in)) - copy(*out, *in) - } - if in.BootstrapPackages != nil { - in, out := &in.BootstrapPackages, &out.BootstrapPackages - *out = make([]v1.LocalObjectReference, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesReleaseSpec. -func (in *TanzuKubernetesReleaseSpec) DeepCopy() *TanzuKubernetesReleaseSpec { - if in == nil { - return nil - } - out := new(TanzuKubernetesReleaseSpec) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TanzuKubernetesReleaseStatus) DeepCopyInto(out *TanzuKubernetesReleaseStatus) { - *out = *in - if in.Conditions != nil { - in, out := &in.Conditions, &out.Conditions - *out = make([]v1beta1.Condition, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TanzuKubernetesReleaseStatus. -func (in *TanzuKubernetesReleaseStatus) DeepCopy() *TanzuKubernetesReleaseStatus { - if in == nil { - return nil - } - out := new(TanzuKubernetesReleaseStatus) - in.DeepCopyInto(out) - return out -} diff --git a/build.mk b/build.mk new file mode 100644 index 0000000000..c8b6af36d3 --- /dev/null +++ b/build.mk @@ -0,0 +1,303 @@ +# Copyright 2023 VMware, Inc. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +.DEFAULT_GOAL := help + +REGISTRY_PORT := 8000 +REGISTRY_ENDPOINT := localhost:$(REGISTRY_PORT) +PACKAGE_PREFIX := $(REGISTRY_ENDPOINT) +REGISTRY_NAME := tanzu-integration-registry + +DOCKER := DOCKER_BUILDKIT=1 docker + +IMG_DEFAULT_TAG := latest +IMG_VERSION_OVERRIDE ?= $(IMG_DEFAULT_TAG) +GOPROXY ?= "https://proxy.golang.org,direct" +PLATFORM=local +# check out step 2 in this documentation on how to set the COMPONENTS variable https://github.com/vmware-tanzu/build-tooling-for-integrations/blob/main/docs/build-tooling-getting-started.md +COMPONENTS ?= capabilities/client \ +capabilities/controller.capabilities-controller-manager.capabilities \ +featuregates/client \ +featuregates/controller.featuregates-controller-manager.featuregates + +BUILD_TOOLING_CONTAINER_IMAGE ?= ghcr.io/vmware-tanzu/build-tooling +PACKAGING_CONTAINER_IMAGE ?= ghcr.io/vmware-tanzu/package-tooling +VERSION ?= v0.0.2 + +# utility functions to check for main.go in component path +find_main_go = $(shell find $(1) -name main.go) +check_main_go = $(if $(call find_main_go,$(1)),Found,NotFound) + +## +## Project Initialization Targets +## + +# Bootstraps a project by creating a copy of the Tanzu build container Dockerfile +# into the project's root directory (alongside Makefile). +# This target also installs a local registry if the build is being done in a +# non-CI environment and it makes sure that the Tanzu packaging container is up to date. +bootstrap: install-registry check-copy-build-container install-package-container + +install-registry: +ifneq ($(IS_CI),) + @echo "Running in CI mode. Skipping local registry setup." +else +ifeq ($(shell $(DOCKER) ps -q -f name=$(REGISTRY_NAME) 2> /dev/null),) + @echo "Deploying a local Docker registry for Tanzu Integrations" + $(DOCKER) run -d -p $(REGISTRY_PORT):5000 --restart=always --name $(REGISTRY_NAME) registry:2 + @echo +endif + @echo "Registry for Tanzu Integrations available at $(REGISTRY_ENDPOINT)" +endif + +check-copy-build-container: +ifneq ("$(wildcard Dockerfile)","") + $(eval COPY_BUILD_CONTAINER := $(shell bash -c 'read -p "There is already a Dockerfile in this project. Overwrite? [y/N]: " do_copy; echo $$do_copy')) +else + $(eval COPY_BUILD_CONTAINER := Y) +endif + @$(MAKE) -s COPY_BUILD_CONTAINER=$(COPY_BUILD_CONTAINER) copy-build-container + +copy-build-container: +ifneq ($(filter y Y, $(COPY_BUILD_CONTAINER)),) + @$(DOCKER) run --name tanzu-build-tooling $(BUILD_TOOLING_CONTAINER_IMAGE):$(VERSION) + @$(DOCKER) cp tanzu-build-tooling:/Dockerfile ./Dockerfile + @$(DOCKER) cp tanzu-build-tooling:/.golangci.yaml ./.golangci.yaml + @echo Added Dockerfile for containerize build to $(PWD) + @$(DOCKER) rm tanzu-build-tooling 1> /dev/null +endif + +install-package-container: + @$(DOCKER) pull $(PACKAGING_CONTAINER_IMAGE):$(VERSION) + +.PHONY: bootstrap install-registry check-copy-build-container copy-build-container install-package-container + + +.PHONY: init +# Fetch the Dockerfile and pull image needed to build packages +init: + $(DOCKER) run --rm -v ${PWD}:/workspace --entrypoint /bin/sh $(BUILD_TOOLING_CONTAINER_IMAGE):$(VERSION) -c "cp Dockerfile /workspace && cp .golangci.yaml /workspace" + $(DOCKER) pull $(PACKAGING_CONTAINER_IMAGE):$(VERSION) + +## +## Other Targets +## + +.PHONY: docker-build-all +# Run linter, tests and build images +docker-build-all: $(COMPONENTS) + +.PHONY: docker-publish-all +# Push images of all components +docker-publish-all: PUBLISH_IMAGES:=true +docker-publish-all: $(COMPONENTS) + +.PHONY: build-all +# Run linter, tests and build binaries +build-all: BUILD_BIN:=true +build-all: $(COMPONENTS) + +.PHONY: package-all +# Generate package bundles and push them to a registry +package-all: package-bundle-generate-all package-bundle-push-all + +.PHONY: $(COMPONENTS) +$(COMPONENTS): + $(eval COMPONENT_PATH = $(word 1,$(subst ., ,$@))) + $(eval IMAGE_NAME = $(word 2,$(subst ., ,$@))) + $(eval PACKAGE_PATH = $(word 3,$(subst ., ,$@))) + $(eval IMAGE = $(IMAGE_NAME):$(IMG_VERSION_OVERRIDE)) + $(eval DEFAULT_IMAGE = $(IMAGE_NAME):$(IMG_DEFAULT_TAG)) + $(eval IMAGE = $(shell if [ ! -z "$(OCI_REGISTRY)" ]; then echo $(OCI_REGISTRY)/$(IMAGE_NAME):$(IMG_VERSION_OVERRIDE); else echo $(IMAGE); fi)) + $(eval COMPONENT = $(shell if [ -z "$(COMPONENT_PATH)" ]; then echo "."; else echo $(COMPONENT_PATH); fi)) + @if [ "$(PUBLISH_IMAGES)" = "true" ]; then \ + if [ "$(call check_main_go,$(COMPONENT))" = "Found" ]; then \ + $(MAKE) validate-component IMAGE_NAME=$(IMAGE_NAME) PACKAGE_PATH=$(PACKAGE_PATH) || exit 1; \ + $(MAKE) publish IMAGE=$(IMAGE) DEFAULT_IMAGE=$(DEFAULT_IMAGE) PACKAGE_PATH=$(PACKAGE_PATH) BUILD_BIN=$(BUILD_BIN); \ + fi \ + else \ + $(MAKE) build COMPONENT=$(COMPONENT) IMAGE_NAME=$(IMAGE_NAME) IMAGE=$(IMAGE) PACKAGE_PATH=$(PACKAGE_PATH) BUILD_BIN=$(BUILD_BIN); \ + fi + +.PHONY: validate-component +validate-component: +ifeq ($(strip $(IMAGE_NAME)),) + $(error Image name of the component is not set in COMPONENTS variable, check https://github.com/vmware-tanzu/build-tooling-for-integrations/blob/main/docs/build-tooling-getting-started.md#steps-to-use-the-build-tooling for more help) +else ifeq ($(strip $(PACKAGE_PATH)),) + $(error Path to the package of the component is not set in COMPONENTS variable, check https://github.com/vmware-tanzu/build-tooling-for-integrations/blob/main/docs/build-tooling-getting-started.md#steps-to-use-the-build-tooling for more help) +endif + +.PHONY: build +build: + $(MAKE) COMPONENT=$(COMPONENT) test + @if [ "$(call check_main_go,$(COMPONENT))" = "Found" ]; then \ + if [ "$(BUILD_BIN)" = "true" ]; then \ + $(MAKE) COMPONENT=$(COMPONENT) binary-build; \ + else \ + $(MAKE) validate-component IMAGE_NAME=$(IMAGE_NAME) PACKAGE_PATH=$(PACKAGE_PATH) || exit 1; \ + $(MAKE) docker-build IMAGE=$(IMAGE) COMPONENT=$(COMPONENT); \ + fi \ + fi + +.PHONY: publish +publish: + $(MAKE) IMAGE=$(IMAGE) docker-publish + $(MAKE) KBLD_CONFIG_FILE_PATH=packages/$(PACKAGE_PATH)/kbld-config.yaml DEFAULT_IMAGE=$(DEFAULT_IMAGE) IMAGE=$(IMAGE) kbld-image-replace + +.PHONY: lint +# Run linting +lint: +ifneq ($(strip $(COMPONENT)),.) + cp .golangci.yaml $(COMPONENT) + $(DOCKER) build . -f Dockerfile --target lint --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY) + rm -rf $(COMPONENT)/.golangci.yaml +else + $(DOCKER) build . -f Dockerfile --target lint --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY) +endif + +.PHONY: fmt +# Run go fmt against code +fmt: + $(DOCKER) build . -f Dockerfile --target fmt --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY) + +.PHONY: vet +# Perform static analysis of code +vet: + $(DOCKER) build . -f Dockerfile --target vet --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY) + +.PHONY: test +# Run tests +test: fmt vet + $(DOCKER) build . -f Dockerfile --target test --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY) + @$(DOCKER) build . -f Dockerfile --target unit-test-coverage --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY) --output build/$(COMPONENT)/coverage + +.PHONY: binary-build +# Build the binary +binary-build: + $(DOCKER) build . -f Dockerfile --build-arg LD_FLAGS="$(LD_FLAGS)" --target bin --output build/$(COMPONENT)/bin --platform ${PLATFORM} --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY) + +.PHONY: docker-build +# Build docker image +docker-build: + $(DOCKER) build . -t $(IMAGE) -f Dockerfile --target image --platform linux/amd64 --build-arg LD_FLAGS="$(LD_FLAGS)" --build-arg COMPONENT=$(COMPONENT) --build-arg GOPROXY_ARG=$(GOPROXY) + +.PHONY: docker-publish +# Publish docker image +docker-publish: + $(DOCKER) push $(IMAGE) + +.PHONY: kbld-image-replace +# Add newImage in kbld-config.yaml +kbld-image-replace: + @$(DOCKER) run \ + -e OPERATIONS=kbld_replace \ + -e KBLD_CONFIG_FILE_PATH=$(KBLD_CONFIG_FILE_PATH) \ + -e DEFAULT_IMAGE=$(DEFAULT_IMAGE) \ + -e NEW_IMAGE=$(IMAGE) \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v $(PWD):/workspace \ + $(PACKAGING_CONTAINER_IMAGE):$(VERSION) + +.PHONY: package-bundle-generate +# Generate package bundle for a particular package +package-bundle-generate: + @$(DOCKER) run \ + -e OPERATIONS=package_bundle_generate \ + -e PACKAGE_NAME=$(PACKAGE_NAME) \ + -e THICK=true \ + -e OCI_REGISTRY=$(OCI_REGISTRY) \ + -e PACKAGE_VERSION=$(PACKAGE_VERSION) \ + -e PACKAGE_SUB_VERSION=$(PACKAGE_SUB_VERSION) \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v $(PWD):/workspace \ + $(PACKAGING_CONTAINER_IMAGE):$(VERSION) + +.PHONY: package-bundle-generate-all +# Generate package bundle for all packages +package-bundle-generate-all: + @$(DOCKER) run \ + -e OPERATIONS=package_bundle_all_generate \ + -e PACKAGE_REPOSITORY=$(PACKAGE_REPOSITORY) \ + -e THICK=true \ + -e OCI_REGISTRY=$(OCI_REGISTRY) \ + -e PACKAGE_VERSION=$(PACKAGE_VERSION) \ + -e PACKAGE_SUB_VERSION=$(PACKAGE_SUB_VERSION) \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v $(PWD):/workspace \ + $(PACKAGING_CONTAINER_IMAGE):$(VERSION) + +.PHONY: package-bundle-push +# Push a particular package bundle +package-bundle-push: + @$(DOCKER) run \ + -e OPERATIONS=package_bundle_push \ + -e PACKAGE_NAME=$(PACKAGE_NAME) \ + -e OCI_REGISTRY=$(OCI_REGISTRY) \ + -e PACKAGE_VERSION=$(PACKAGE_VERSION) \ + -e PACKAGE_SUB_VERSION=$(PACKAGE_SUB_VERSION) \ + -e REGISTRY_USERNAME=$(REGISTRY_USERNAME) \ + -e REGISTRY_PASSWORD=$(REGISTRY_PASSWORD) \ + -e REGISTRY_SERVER=$(REGISTRY_SERVER) \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v $(PWD):/workspace \ + $(PACKAGING_CONTAINER_IMAGE):$(VERSION) + +.PHONY: package-bundle-push-all +# Push all package bundles +package-bundle-push-all: + @$(DOCKER) run \ + -e OPERATIONS=package_bundle_all_push \ + -e PACKAGE_REPOSITORY=$(PACKAGE_REPOSITORY) \ + -e OCI_REGISTRY=$(OCI_REGISTRY) \ + -e PACKAGE_VERSION=$(PACKAGE_VERSION) \ + -e PACKAGE_SUB_VERSION=$(PACKAGE_SUB_VERSION) \ + -e REGISTRY_USERNAME=$(REGISTRY_USERNAME) \ + -e REGISTRY_PASSWORD=$(REGISTRY_PASSWORD) \ + -e REGISTRY_SERVER=$(REGISTRY_SERVER) \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v $(PWD):/workspace \ + $(PACKAGING_CONTAINER_IMAGE):$(VERSION) + +.PHONY: repo-bundle-generate +# Generate repo bundle +repo-bundle-generate: + @$(DOCKER) run \ + -e OPERATIONS=repo_bundle_generate \ + -e PACKAGE_REPOSITORY=$(PACKAGE_REPOSITORY) \ + -e OCI_REGISTRY=$(OCI_REGISTRY) \ + -e REPO_BUNDLE_VERSION=$(REPO_BUNDLE_VERSION) \ + -e REPO_BUNDLE_SUB_VERSION=$(REPO_BUNDLE_SUB_VERSION) \ + -e PACKAGE_VALUES_FILE=$(PACKAGE_VALUES_FILE) \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v $(PWD):/workspace \ + $(PACKAGING_CONTAINER_IMAGE):$(VERSION) + +.PHONY: repo-bundle-push +# Push repo bundle +repo-bundle-push: + @$(DOCKER) run \ + -e OPERATIONS=repo_bundle_push \ + -e PACKAGE_REPOSITORY=$(PACKAGE_REPOSITORY) \ + -e OCI_REGISTRY=$(OCI_REGISTRY) \ + -e REPO_BUNDLE_VERSION=$(REPO_BUNDLE_VERSION) \ + -e REPO_BUNDLE_SUB_VERSION=$(REPO_BUNDLE_SUB_VERSION) \ + -e REGISTRY_USERNAME=$(REGISTRY_USERNAME) \ + -e REGISTRY_PASSWORD=$(REGISTRY_PASSWORD) \ + -e REGISTRY_SERVER=$(REGISTRY_SERVER) \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v $(PWD):/workspace \ + $(PACKAGING_CONTAINER_IMAGE):$(VERSION) + +.PHONY: package-vendir-sync +# Performs vendir sync on each package +package-vendir-sync: + @$(DOCKER) run \ + -e OPERATIONS=vendir_sync \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v $(PWD):/workspace \ + $(PACKAGING_CONTAINER_IMAGE):$(VERSION) + +.PHONY: help +# Show help +help: + @cat $(MAKEFILE_LIST) | $(DOCKER) run --rm -i xanders/make-help diff --git a/capabilities/Makefile b/capabilities/Makefile deleted file mode 100644 index 4634478a13..0000000000 --- a/capabilities/Makefile +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../common.mk - -IMG_DEFAULT_NAME := capabilities-controller-manager -IMG_DEFAULT_TAG := latest -IMG_DEFAULT_NAME_TAG := $(IMG_DEFAULT_NAME):$(IMG_DEFAULT_TAG) - -IMG_VERSION_OVERRIDE ?= $(IMG_DEFAULT_TAG) - -ifeq ($(strip $(OCI_REGISTRY)),) - IMG ?= $(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -else - IMG ?= $(OCI_REGISTRY)/$(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -endif - -CRD_OPTIONS ?= "crd" - -all: manager - -# Run tests -test: fmt vet - cd client && go test ./... -coverprofile cover.out - cd controller && go test ./... -coverprofile cover.out - -# Build manager binary -manager: fmt vet - go build -ldflags "$(LD_FLAGS)" -o bin/manager ./controller/main.go - -# Run against the configured Kubernetes cluster in ~/.kube/config -run: fmt vet - cd controller && go run -ldflags "$(LD_FLAGS)" ./main.go - -# Run go fmt against code -fmt: - cd controller && go fmt ./... - -# Run go vet against code -vet: - cd controller && go vet ./... - -# Generate deployment manifest for the tkr manager -deployment: manifests - cd config/manager && kustomize edit set image controller=${IMG} - kustomize build config/default - -manifests: controller-gen ## Generate manifests e.g. CRD, RBAC etc. - $(CONTROLLER_GEN) \ - $(CRD_OPTIONS) \ - paths=../apis/... \ - output:crd:artifacts:config=../../../config/crd/bases - -controller-gen: ## Download controller-gen -ifeq (, $(shell which controller-gen)) - @{ \ - set -e ;\ - CONTROLLER_GEN_TMP_DIR=$$(mktemp -d) ;\ - cd $$CONTROLLER_GEN_TMP_DIR ;\ - $(GO) mod init tmp ;\ - $(GO) get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.2.5 ;\ - rm -rf $$CONTROLLER_GEN_TMP_DIR ;\ - } -CONTROLLER_GEN=$(GOBIN)/controller-gen -else -CONTROLLER_GEN=$(shell which controller-gen) -endif - -.PHONY: docker-build -docker-build: - cd .. && docker build -t $(IMG) -f capabilities/controller/Dockerfile --build-arg LD_FLAGS="$(LD_FLAGS)" --build-arg DISTROLESS_BASE_IMAGE="$(DISTROLESS_BASE_IMAGE)" --build-arg GOPROXY="$(GOPROXY)" --build-arg GOSUMDB="$(GOSUMDB)" . - -.PHONY: docker-publish -docker-publish: ## Publish docker image - docker push $(IMG) - -.PHONY: kbld-image-replace -kbld-image-replace: ## Add newImage in kbld-config.yaml - cd ../hack/packages/kbld-image-replace && \ - go run main.go -kbld-config ../../../packages/capabilities/kbld-config.yaml $(IMG_DEFAULT_NAME_TAG) $(IMG) - -.PHONY: docker-image-names -docker-image-names: - @echo $(IMG) - -.PHONY: docker-build-and-publish -docker-build-and-publish: docker-build docker-publish kbld-image-replace diff --git a/capabilities/client/go.mod b/capabilities/client/go.mod index f832aaba86..ee6df88265 100644 --- a/capabilities/client/go.mod +++ b/capabilities/client/go.mod @@ -2,11 +2,12 @@ module github.com/vmware-tanzu/tanzu-framework/capabilities/client go 1.18 -replace github.com/vmware-tanzu/tanzu-framework/apis/run => ../../apis/run +replace github.com/vmware-tanzu/tanzu-framework/apis/core => ../../apis/core require ( github.com/google/gnostic v0.5.7-v3refs - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 + github.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000 + github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68 gopkg.in/yaml.v3 v3.0.1 k8s.io/api v0.24.2 k8s.io/apimachinery v0.24.2 @@ -28,7 +29,7 @@ require ( github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/logr v1.2.2 // indirect + github.com/go-logr/logr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.19.6 // indirect github.com/go-openapi/swag v0.21.1 // indirect @@ -49,12 +50,11 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/onsi/gomega v1.19.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect + github.com/prometheus/client_golang v1.12.2 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.32.1 // indirect github.com/prometheus/procfs v0.7.3 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.8.0 // indirect go.uber.org/atomic v1.9.0 // indirect golang.org/x/net v0.8.0 // indirect golang.org/x/oauth2 v0.3.0 // indirect @@ -64,13 +64,13 @@ require ( golang.org/x/time v0.3.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/apiextensions-apiserver v0.24.2 // indirect k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.60.1 // indirect + k8s.io/klog/v2 v2.70.1 // indirect k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect k8s.io/kubectl v0.24.0 // indirect k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect diff --git a/capabilities/client/go.sum b/capabilities/client/go.sum index efa5ef5430..422d1bc037 100644 --- a/capabilities/client/go.sum +++ b/capabilities/client/go.sum @@ -177,8 +177,8 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG 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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -436,8 +436,9 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -501,19 +502,18 @@ github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68 h1:DMsg44rX3xSBDCoKYU7zfJGzs9dfPkMYmM7C5fFx7Es= +github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68/go.mod h1:e1Uef+Ux5BIHpYwqbeP2ZZmOzehBcez2vUEWXHe+xHE= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -963,8 +963,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1033,8 +1033,9 @@ k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAE k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= +k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= diff --git a/capabilities/client/pkg/discovery/cluster_test.go b/capabilities/client/pkg/discovery/cluster_test.go index 8319ee82ea..075ad94221 100644 --- a/capabilities/client/pkg/discovery/cluster_test.go +++ b/capabilities/client/pkg/discovery/cluster_test.go @@ -177,35 +177,53 @@ func TestGVRQueries(t *testing.T) { // apiResources has information similar to an actual Kubernetes cluster. apiResources := []*metav1.APIResourceList{ { - GroupVersion: "autoscaling/v1", + GroupVersion: "admissionregistration.k8s.io/v1", APIResources: []metav1.APIResource{ { - Name: "horizontalpodautoscalers", - Kind: "HorizontalPodAutoscaler", + Name: "mutatingwebhookconfigurations", + Kind: "MutatingWebhookConfiguration", Namespaced: true, - ShortNames: []string{"hpa"}, }, }, }, { - GroupVersion: "autoscaling/v2", + GroupVersion: "apps/v1", APIResources: []metav1.APIResource{ { - Name: "horizontalpodautoscalers", - Kind: "HorizontalPodAutoscaler", + Name: "deployments", + Kind: "Deployment", Namespaced: true, - ShortNames: []string{"hpa"}, + ShortNames: []string{"deploy"}, }, }, }, { - GroupVersion: "autoscaling/v2beta2", + GroupVersion: "core.tanzu.vmware.com/v1alpha1", APIResources: []metav1.APIResource{ { - Name: "horizontalpodautoscalers", - Kind: "HorizontalPodAutoscaler", + Name: "features", + Kind: "Feature", + Namespaced: false, + }, + }, + }, + { + GroupVersion: "core.tanzu.vmware.com/v1alpha2", + APIResources: []metav1.APIResource{ + { + Name: "features", + Kind: "Feature", + Namespaced: false, + }, + }, + }, + { + GroupVersion: "rbac.authorization.k8s.io/v1", + APIResources: []metav1.APIResource{ + { + Name: "roles", + Kind: "Role", Namespaced: true, - ShortNames: []string{"hpa"}, }, }, }, @@ -258,8 +276,8 @@ func TestGVRQueries(t *testing.T) { want: true, }, { - description: "existing autoscaling group is found", - query: Group("test", "autoscaling"), + description: "existing apps group is found", + query: Group("test", "apps"), want: true, }, { @@ -269,42 +287,42 @@ func TestGVRQueries(t *testing.T) { }, { description: "group not found, resource found", - query: Group("test", "hotscalers").WithResource("horizontalpodautoscalers"), + query: Group("test", "hotscalers").WithResource("deployments"), want: false, }, { description: "group found, resource not found", - query: Group("test", "autoscaling").WithResource("verticalautoscaling"), + query: Group("test", "apps").WithResource("nonexistingresource"), want: false, }, { description: "group and resource found", - query: Group("test", "autoscaling").WithResource("horizontalpodautoscalers"), + query: Group("test", "admissionregistration.k8s.io").WithResource("mutatingwebhookconfigurations"), want: true, }, { description: "group exists, but empty string resource returns error", - query: Group("test", "autoscaling").WithResource(""), + query: Group("test", "admissionregistration.k8s.io").WithResource(""), err: errInvalidWithResourceMethodArgument, }, { description: "group not found, version found", - query: Group("test", "hotscaling").WithVersions("v1"), + query: Group("test", "admissionregistration.k8s.io").WithVersions("v1alpha1"), want: false, }, { description: "group and version found", - query: Group("test", "autoscaling").WithVersions("v1"), + query: Group("test", "apps").WithVersions("v1"), want: true, }, { description: "group and versions found", - query: Group("test", "autoscaling").WithVersions("v2", "v1", "v2beta2"), + query: Group("test", "core.tanzu.vmware.com").WithVersions("v1alpha1", "v1alpha2"), want: true, }, { description: "group found, but empty string version returns error", - query: Group("test", "autoscaling").WithVersions(""), + query: Group("test", "apps").WithVersions(""), err: errInvalidWithVersionsMethodArgument, }, { @@ -319,16 +337,16 @@ func TestGVRQueries(t *testing.T) { }, { description: "group, versions, resource found", - query: Group("test", "autoscaling"). - WithVersions("v1", "v2", "v2beta2"). - WithResource("horizontalpodautoscalers"), + query: Group("test", "core.tanzu.vmware.com"). + WithVersions("v1alpha1", "v1alpha2"). + WithResource("features"), want: true, }, { description: "group, versions found, resource not found", - query: Group("test", "autoscaling"). - WithVersions("v1", "v2beta1", "v2beta2"). - WithResource("verticalscaler"), + query: Group("test", "core.tanzu.vmware.com"). + WithVersions("v1alpha1", "v1alpha2"). + WithResource("ingress"), want: false, }, { diff --git a/capabilities/client/pkg/discovery/fake.go b/capabilities/client/pkg/discovery/fake.go index a9e22810b7..c110430950 100644 --- a/capabilities/client/pkg/discovery/fake.go +++ b/capabilities/client/pkg/discovery/fake.go @@ -40,7 +40,7 @@ paths: return openapi_v2.ParseDocument([]byte(schema)) } -// NewFakeClusterQueryClient returns a fake ClusterQueryClient for use in tests. +// NewFakeClusterQueryClientWithSchema returns a fake ClusterQueryClient for use in tests. func NewFakeClusterQueryClientWithSchema(resources []*metav1.APIResourceList, scheme *runtime.Scheme, objs []runtime.Object) (*ClusterQueryClient, error) { fakeDynamicClient := dynamicFake.NewSimpleDynamicClient(scheme, objs...) diff --git a/capabilities/client/pkg/discovery/generate.go b/capabilities/client/pkg/discovery/generate.go index f04bde4239..8ca31cf62e 100644 --- a/capabilities/client/pkg/discovery/generate.go +++ b/capabilities/client/pkg/discovery/generate.go @@ -7,11 +7,16 @@ import ( "fmt" "math/rand" + corev1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2" runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" ) // QueryTargetsToCapabilityResource is a helper function to generate a // Capability v1alpha1 resource from a slice of QueryTarget. +// +// Deprecated: This API is deprecated. Use QueryTargetsToCapability instead +// +//nolint:dupl func QueryTargetsToCapabilityResource(queryTargets []QueryTarget) (*runv1alpha1.Capability, error) { var ( gvrQueries []runv1alpha1.QueryGVR @@ -63,3 +68,59 @@ func QueryTargetsToCapabilityResource(queryTargets []QueryTarget) (*runv1alpha1. return capability, nil } + +// QueryTargetsToCapability is a helper function to generate a +// Capability v1alpha1 resource from a slice of QueryTarget. +// +//nolint:dupl +func QueryTargetsToCapability(queryTargets []QueryTarget) (*corev1alpha2.Capability, error) { + var ( + gvrQueries []corev1alpha2.QueryGVR + objectQueries []corev1alpha2.QueryObject + partialSchemaQueries []corev1alpha2.QueryPartialSchema + ) + + for _, qt := range queryTargets { + switch query := qt.(type) { + case *QueryGVR: + q := corev1alpha2.QueryGVR{ + Name: fmt.Sprintf("gvr-%d", rand.Int31()), //nolint:gosec + Group: query.group, + Versions: query.versions, + Resource: query.resource.String, + } + gvrQueries = append(gvrQueries, q) + case *QueryObject: + q := corev1alpha2.QueryObject{ + Name: fmt.Sprintf("object-%d", rand.Int31()), //nolint:gosec + ObjectReference: *query.object, + WithAnnotations: query.annotationsMap(true), + WithoutAnnotations: query.annotationsMap(false), + } + objectQueries = append(objectQueries, q) + case *QueryPartialSchema: + q := corev1alpha2.QueryPartialSchema{ + Name: fmt.Sprintf("partialSchema-%d", rand.Int31()), //nolint:gosec + PartialSchema: query.schema, + } + partialSchemaQueries = append(partialSchemaQueries, q) + default: + return nil, fmt.Errorf("unknown QueryTarget type: %T", qt) + } + } + + capability := &corev1alpha2.Capability{ + Spec: corev1alpha2.CapabilitySpec{ + Queries: []corev1alpha2.Query{ + { + Name: fmt.Sprintf("query-%d", rand.Int31()), //nolint:gosec + GroupVersionResources: gvrQueries, + Objects: objectQueries, + PartialSchemas: partialSchemaQueries, + }, + }, + }, + } + + return capability, nil +} diff --git a/capabilities/client/pkg/discovery/generate_test.go b/capabilities/client/pkg/discovery/generate_test.go index d91caccc97..8ded85f5c3 100644 --- a/capabilities/client/pkg/discovery/generate_test.go +++ b/capabilities/client/pkg/discovery/generate_test.go @@ -11,6 +11,7 @@ import ( corev1 "k8s.io/api/core/v1" testapigroup "k8s.io/apimachinery/pkg/apis/testapigroup/v1" + corev1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2" runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" ) @@ -141,3 +142,117 @@ func TestQueryTargetsToCapabilityResource(t *testing.T) { }) } } + +func TestQueryTargetsToCapability(t *testing.T) { + clusterGVR := Group("pondQuery", testapigroup.SchemeGroupVersion.Group). + WithVersions(testapigroup.SchemeGroupVersion.Version). + WithResource("carps") + + koi := corev1.ObjectReference{ + Kind: "Carp", + Name: "koi", + Namespace: "koi-pond", + APIVersion: testapigroup.SchemeGroupVersion.String(), + } + annotations := map[string]string{ + "cluster.x-k8s.io/provider": "infrastructure-fake", + } + clusterObject := Object("pondQuery", &koi).WithAnnotations(annotations) + + clusterSchema := Schema("pondQuery", "partial schema") + + testCases := []struct { + description string + queryTargets []QueryTarget + want corev1alpha2.Capability + err error + }{ + { + description: "one of each query target type (gvr, object, and partial schema)", + queryTargets: []QueryTarget{clusterGVR, clusterObject, clusterSchema}, + want: corev1alpha2.Capability{ + Spec: corev1alpha2.CapabilitySpec{ + Queries: []corev1alpha2.Query{ + { + GroupVersionResources: []corev1alpha2.QueryGVR{ + { + Group: testapigroup.SchemeGroupVersion.Group, + Resource: "carps", + Versions: []string{testapigroup.SchemeGroupVersion.Version}, + }, + }, + Objects: []corev1alpha2.QueryObject{ + { + ObjectReference: koi, + WithAnnotations: annotations, + WithoutAnnotations: map[string]string{}, + }, + }, + PartialSchemas: []corev1alpha2.QueryPartialSchema{ + { + PartialSchema: "partial schema", + }, + }, + }, + }, + }, + }, + err: nil, + }, + { + description: "unknown query type", + queryTargets: []QueryTarget{unknownQueryType("shark")}, + err: fmt.Errorf("unknown QueryTarget type: %T", unknownQueryType("shark")), + }, + } + + for _, tc := range testCases { + t.Run(tc.description, func(t *testing.T) { + got, err := QueryTargetsToCapabilityResource(tc.queryTargets) + + if tc.err == nil { + // Check QueryGVR fields. + if len(got.Spec.Queries[0].GroupVersionResources[0].Name) == 0 { + t.Errorf("QueryGVR name: got: %s, but want: a non-empty string", got.Spec.Queries[0].GroupVersionResources[0].Name) + } + if got.Spec.Queries[0].GroupVersionResources[0].Group != tc.want.Spec.Queries[0].GroupVersionResources[0].Group { + t.Errorf("QueryGVR resource group: got: %s, but want: %s", got.Spec.Queries[0].GroupVersionResources[0].Group, tc.want.Spec.Queries[0].GroupVersionResources[0].Group) + } + if !reflect.DeepEqual(got.Spec.Queries[0].GroupVersionResources[0].Versions, tc.want.Spec.Queries[0].GroupVersionResources[0].Versions) { + t.Errorf("QueryGVR versions: got: %+v, but want: %+v", got.Spec.Queries[0].GroupVersionResources[0].Versions, tc.want.Spec.Queries[0].GroupVersionResources[0].Versions) + } + + // Check QueryObject fields. + if len(got.Spec.Queries[0].Objects[0].Name) == 0 { + t.Errorf("QueryObject name: got: %s, but want: a non-empty string", got.Spec.Queries[0].Objects[0].Name) + } + if got.Spec.Queries[0].Objects[0].ObjectReference != tc.want.Spec.Queries[0].Objects[0].ObjectReference { + t.Errorf("QueryObject object reference: got: %+v, but want: %+v", got.Spec.Queries[0].Objects[0].ObjectReference, tc.want.Spec.Queries[0].Objects[0].ObjectReference) + } + if !reflect.DeepEqual(got.Spec.Queries[0].Objects[0].WithAnnotations, tc.want.Spec.Queries[0].Objects[0].WithAnnotations) { + t.Errorf("QueryGVR versions: got: %+v, but want: %+v", got.Spec.Queries[0].Objects[0].WithAnnotations, tc.want.Spec.Queries[0].Objects[0].WithAnnotations) + } + if !reflect.DeepEqual(got.Spec.Queries[0].Objects[0].WithoutAnnotations, tc.want.Spec.Queries[0].Objects[0].WithoutAnnotations) { + t.Errorf("QueryGVR versions: got: %+v, but want: %+v", got.Spec.Queries[0].Objects[0].WithoutAnnotations, tc.want.Spec.Queries[0].Objects[0].WithoutAnnotations) + } + + // Check QueryPartialSchema fields. + if len(got.Spec.Queries[0].PartialSchemas[0].Name) == 0 { + t.Errorf("QueryPartialSchema name: got: %s, but want: a non-empty string", got.Spec.Queries[0].PartialSchemas[0].Name) + } + if got.Spec.Queries[0].PartialSchemas[0].PartialSchema != tc.want.Spec.Queries[0].PartialSchemas[0].PartialSchema { + t.Errorf("QueryPartialSchema partial schema: got: %s, but want: %s", got.Spec.Queries[0].PartialSchemas[0].PartialSchema, tc.want.Spec.Queries[0].PartialSchemas[0].PartialSchema) + } + } + + if tc.err != nil { + if err.Error() != tc.err.Error() { + t.Errorf("want error: %s but got: %s", tc.err, err) + } + if got != nil { + t.Errorf("expected nil Capability object, but got: %+v", got) + } + } + }) + } +} diff --git a/capabilities/client/pkg/discovery/tkg/clustermetadata.go b/capabilities/client/pkg/discovery/tkg/clustermetadata.go index bbb48f26ed..13827ea1ff 100644 --- a/capabilities/client/pkg/discovery/tkg/clustermetadata.go +++ b/capabilities/client/pkg/discovery/tkg/clustermetadata.go @@ -10,6 +10,7 @@ type ClusterMetadata struct { Cluster Cluster `json:"cluster" yaml:"cluster"` } +// Cluster stores information about the cluster. // Deprecated: This struct type will be removed in a future release. type Cluster struct { Name string `json:"name" yaml:"name"` @@ -20,6 +21,7 @@ type Cluster struct { Infrastructure Infrastructure `json:"infrastructure" yaml:"infrastructure"` } +// Infrastructure represents the cluster's infrastructure provider. // Deprecated: This struct type will be removed in a future release. type Infrastructure struct { Provider string `json:"provider" yaml:"provider"` diff --git a/capabilities/controller/Dockerfile b/capabilities/controller/Dockerfile deleted file mode 100644 index f212e47f31..0000000000 --- a/capabilities/controller/Dockerfile +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Build from publicly reachable source by default, but allow people to re-build images on -# top of their own trusted images. -ARG BUILDER_BASE_IMAGE=golang:1.18 -ARG DISTROLESS_BASE_IMAGE=gcr.io/distroless/static:nonroot - -# Build the manager binary -FROM $BUILDER_BASE_IMAGE as builder - -WORKDIR /workspace - -# Copy the go source -COPY capabilities/client capabilities/client -COPY capabilities/controller capabilities/controller -COPY apis/ apis/ -COPY cli/runtime cli/runtime - -WORKDIR capabilities/controller -# Setting default GOPROXY to https://proxy.golang.org,direct and GOSUMDB to sum.golang.org which can be override by Makefile -ARG GOSUMDB -ARG GOPROXY -ENV GOSUMDB=$GOSUMDB -ENV GOPROXY=$GOPROXY -# cache deps before building and copying source so that we don't need to re-download as much -# and so that source changes don't invalidate our downloaded layer -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod go mod download - -# Build -ARG LD_FLAGS -ENV LD_FLAGS="$LD_FLAGS "'-extldflags "-static"' -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -o manager main.go - -# Use distroless as minimal base image to package the manager binary -# Refer to https://github.com/GoogleContainerTools/distroless for more details -FROM $DISTROLESS_BASE_IMAGE -WORKDIR / -COPY --from=builder /workspace/capabilities/controller/manager . -USER nonroot:nonroot - -ENTRYPOINT ["/manager"] diff --git a/capabilities/controller/go.mod b/capabilities/controller/go.mod index 3064aa2e75..ec47a98c8f 100644 --- a/capabilities/controller/go.mod +++ b/capabilities/controller/go.mod @@ -3,25 +3,22 @@ module github.com/vmware-tanzu/tanzu-framework/capabilities/controller go 1.18 replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../apis/cli github.com/vmware-tanzu/tanzu-framework/apis/core => ../../apis/core - github.com/vmware-tanzu/tanzu-framework/apis/run => ../../apis/run github.com/vmware-tanzu/tanzu-framework/capabilities/client => ../client - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../cli/runtime + github.com/vmware-tanzu/tanzu-framework/util => ../../util sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.8 ) require ( github.com/go-logr/logr v1.2.3 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 + github.com/onsi/gomega v1.20.1 github.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 github.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - k8s.io/api v0.24.2 - k8s.io/apimachinery v0.24.2 - k8s.io/client-go v0.24.2 + github.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000 + k8s.io/api v0.25.4 + k8s.io/apimachinery v0.25.4 + k8s.io/client-go v0.25.4 sigs.k8s.io/controller-runtime v0.12.3 ) @@ -62,6 +59,7 @@ require ( github.com/prometheus/common v0.32.1 // indirect github.com/prometheus/procfs v0.7.3 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.7.0 // indirect go.uber.org/zap v1.21.0 // indirect @@ -78,14 +76,14 @@ require ( gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.70.1 // indirect + k8s.io/apiextensions-apiserver v0.25.4 // indirect + k8s.io/component-base v0.25.4 // indirect + k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 // indirect k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect + k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect sigs.k8s.io/cluster-api v1.2.8 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect + sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/capabilities/controller/go.sum b/capabilities/controller/go.sum index 9b3cb76681..0f2dc6abb9 100644 --- a/capabilities/controller/go.sum +++ b/capabilities/controller/go.sum @@ -49,7 +49,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= 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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -61,7 +60,6 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -75,14 +73,11 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= @@ -96,16 +91,8 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -114,11 +101,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs 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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -149,7 +133,6 @@ github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwV github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -185,13 +168,9 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -227,8 +206,6 @@ github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA// github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -275,10 +252,6 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -308,7 +281,6 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= 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= @@ -323,8 +295,6 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -341,7 +311,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -358,7 +327,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182aff github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= @@ -386,7 +354,6 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -394,16 +361,14 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= +github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= +github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -414,9 +379,7 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ 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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= @@ -428,22 +391,17 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -456,28 +414,19 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 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/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -491,9 +440,8 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68 h1:DMsg44rX3xSBDCoKYU7zfJGzs9dfPkMYmM7C5fFx7Es= +github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-20230419030809-7081502ebf68/go.mod h1:e1Uef+Ux5BIHpYwqbeP2ZZmOzehBcez2vUEWXHe+xHE= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -501,18 +449,9 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -521,7 +460,6 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= @@ -533,18 +471,15 @@ go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4 go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= @@ -602,7 +537,6 @@ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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= @@ -633,7 +567,6 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -641,7 +574,6 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -679,7 +611,6 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -694,7 +625,6 @@ golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -716,7 +646,6 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -736,7 +665,6 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -762,13 +690,10 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -882,7 +807,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -894,7 +818,6 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -905,7 +828,6 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -954,14 +876,9 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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= @@ -986,23 +903,21 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= +k8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs= +k8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ= +k8s.io/apiextensions-apiserver v0.25.4 h1:7hu9pF+xikxQuQZ7/30z/qxIPZc2J1lFElPtr7f+B6U= +k8s.io/apiextensions-apiserver v0.25.4/go.mod h1:bkSGki5YBoZWdn5pWtNIdGvDrrsRWlmnvl9a+tAw5vQ= k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= +k8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc= +k8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= +k8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8= +k8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw= k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= +k8s.io/component-base v0.25.4 h1:n1bjg9Yt+G1C0WnIDJmg2fo6wbEU1UGMRiQSjmj7hNQ= +k8s.io/component-base v0.25.4/go.mod h1:nnZJU8OP13PJEm6/p5V2ztgX2oyteIaAGKGMYb2L2cY= k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= @@ -1010,8 +925,8 @@ k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAE 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.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 h1:hWRbsoRWt44OEBnYUd4ceLy4ofBoh+p9vauWp/I5Gdg= +k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= @@ -1020,18 +935,19 @@ k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8= +k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= diff --git a/capabilities/controller/main.go b/capabilities/controller/main.go index 7d52f34741..c1fb7098b2 100644 --- a/capabilities/controller/main.go +++ b/capabilities/controller/main.go @@ -18,10 +18,8 @@ import ( corev1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha1" corev1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2" - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" "github.com/vmware-tanzu/tanzu-framework/capabilities/controller/pkg/capabilities/core" - "github.com/vmware-tanzu/tanzu-framework/capabilities/controller/pkg/capabilities/run" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" + "github.com/vmware-tanzu/tanzu-framework/util/buildinfo" ) var ( @@ -33,7 +31,6 @@ func init() { utilruntime.Must(corev1.AddToScheme(scheme)) utilruntime.Must(corev1alpha1.AddToScheme(scheme)) utilruntime.Must(corev1alpha2.AddToScheme(scheme)) - utilruntime.Must(runv1alpha1.AddToScheme(scheme)) //+kubebuilder:scaffold:scheme } @@ -55,16 +52,6 @@ func main() { os.Exit(1) } - if err = (&run.CapabilityReconciler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("controllers").WithName("Capability").WithValues("apigroup", "run"), - Scheme: mgr.GetScheme(), - Host: mgr.GetConfig().Host, - }).SetupWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "Capability", "apigroup", "run") - os.Exit(1) - } - if err = (&core.CapabilityReconciler{ Client: mgr.GetClient(), Log: ctrl.Log.WithName("controllers").WithName("Capability").WithValues("apigroup", "core"), diff --git a/capabilities/controller/pkg/capabilities/run/capability_controller.go b/capabilities/controller/pkg/capabilities/run/capability_controller.go deleted file mode 100644 index e508eb16b5..0000000000 --- a/capabilities/controller/pkg/capabilities/run/capability_controller.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package run - -import ( - "context" - "fmt" - - "github.com/go-logr/logr" - "k8s.io/apimachinery/pkg/runtime" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery" - "github.com/vmware-tanzu/tanzu-framework/capabilities/controller/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/capabilities/controller/pkg/constants" -) - -// CapabilityReconciler reconciles a Capability object. -type CapabilityReconciler struct { - client.Client - Log logr.Logger - Scheme *runtime.Scheme - Host string -} - -//+kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=capabilities,verbs=get;list;watch;create;update;patch;delete -//+kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=capabilities/status,verbs=get;update;patch - -// Reconcile reconciles a Capability spec by executing specified queries. -func (r *CapabilityReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - ctxCancel, cancel := context.WithTimeout(ctx, constants.ContextTimeout) - defer cancel() - - log := r.Log.WithValues("capability", req.NamespacedName) - log.Info("Starting reconcile") - - capability := &runv1alpha1.Capability{} - if err := r.Get(ctxCancel, req.NamespacedName, capability); err != nil { - return ctrl.Result{}, client.IgnoreNotFound(err) - } - - var serviceAccountName, namespaceName string - // use the default service account when the serviceAccountName is not provided as part of the spec - if len(capability.Spec.ServiceAccountName) > 0 { - serviceAccountName = capability.Spec.ServiceAccountName - namespaceName = req.Namespace - } else { - serviceAccountName = constants.ServiceAccountWithDefaultPermissions - namespaceName = constants.CapabilitiesControllerNamespace - } - cfg, err := config.GetConfigForServiceAccount(ctx, r.Client, namespaceName, serviceAccountName, r.Host) - if err != nil { - return ctrl.Result{}, fmt.Errorf("unable to get config for ClusterQueryClient creation: %w", err) - } - clusterQueryClient, err := discovery.NewClusterQueryClientForConfig(cfg) - if err != nil { - return ctrl.Result{}, fmt.Errorf("unable to create ClusterQueryClient: %w", err) - } - - capability.Status.Results = make([]runv1alpha1.Result, len(capability.Spec.Queries)) - - for i, query := range capability.Spec.Queries { - l := log.WithValues("query", query.Name) - - capability.Status.Results[i].Name = query.Name - // Query GVRs. - capability.Status.Results[i].GroupVersionResources = r.queryGVRs(l, clusterQueryClient, query.GroupVersionResources) - // Query Objects. - capability.Status.Results[i].Objects = r.queryObjects(l, clusterQueryClient, query.Objects) - // Query PartialSchemas. - capability.Status.Results[i].PartialSchemas = r.queryPartialSchemas(l, clusterQueryClient, query.PartialSchemas) - } - - log.Info("Successfully reconciled") - return ctrl.Result{}, r.Status().Update(ctxCancel, capability) -} - -// queryGVRs executes GVR queries and returns results. -func (r *CapabilityReconciler) queryGVRs(log logr.Logger, clusterQueryClient *discovery.ClusterQueryClient, queries []runv1alpha1.QueryGVR) []runv1alpha1.QueryResult { - return r.executeQueries(log.WithValues("queryType", "GVR"), clusterQueryClient, func() map[string]discovery.QueryTarget { - queryTargets := make(map[string]discovery.QueryTarget) - for i := range queries { - q := queries[i] - query := discovery.Group(q.Name, q.Group).WithVersions(q.Versions...).WithResource(q.Resource) - queryTargets[q.Name] = query - } - return queryTargets - }) -} - -// queryObjects executes Object queries and returns results. -func (r *CapabilityReconciler) queryObjects(log logr.Logger, clusterQueryClient *discovery.ClusterQueryClient, queries []runv1alpha1.QueryObject) []runv1alpha1.QueryResult { - return r.executeQueries(log.WithValues("queryType", "Object"), clusterQueryClient, func() map[string]discovery.QueryTarget { - queryTargets := make(map[string]discovery.QueryTarget) - for i := range queries { - q := queries[i] - query := discovery.Object(q.Name, &q.ObjectReference).WithAnnotations(q.WithAnnotations).WithoutAnnotations(q.WithoutAnnotations) - queryTargets[q.Name] = query - } - return queryTargets - }) -} - -// queryPartialSchemas executes PartialSchema queries and returns results. -func (r *CapabilityReconciler) queryPartialSchemas(log logr.Logger, clusterQueryClient *discovery.ClusterQueryClient, queries []runv1alpha1.QueryPartialSchema) []runv1alpha1.QueryResult { - return r.executeQueries(log.WithValues("queryType", "PartialSchema"), clusterQueryClient, func() map[string]discovery.QueryTarget { - queryTargets := make(map[string]discovery.QueryTarget) - for i := range queries { - q := queries[i] - query := discovery.Schema(q.Name, q.PartialSchema) - queryTargets[q.Name] = query - } - return queryTargets - }) -} - -// executeQueries executes queries using the discovery client and stores results. -func (r *CapabilityReconciler) executeQueries(log logr.Logger, clusterQueryClient *discovery.ClusterQueryClient, specToQueryTargetFn func() map[string]discovery.QueryTarget) []runv1alpha1.QueryResult { - var results []runv1alpha1.QueryResult - queryTargetsMap := specToQueryTargetFn() - for name, queryTarget := range queryTargetsMap { - result := runv1alpha1.QueryResult{Name: name} - c := clusterQueryClient.Query(queryTarget) - found, err := c.Execute() - if err != nil { - result.Error = true - result.ErrorDetail = err.Error() - } - result.Found = found - if !found { - if qr := c.Results().ForQuery(name); qr != nil { - result.NotFoundReason = qr.NotFoundReason - } - } - results = append(results, result) - } - log.Info("Executed queries", "num", len(queryTargetsMap)) - return results -} - -// SetupWithManager sets up the controller with the Manager. -func (r *CapabilityReconciler) SetupWithManager(mgr ctrl.Manager) error { - return ctrl.NewControllerManagedBy(mgr). - For(&runv1alpha1.Capability{}). - Complete(r) -} diff --git a/capabilities/controller/pkg/capabilities/run/doc.go b/capabilities/controller/pkg/capabilities/run/doc.go deleted file mode 100644 index 2755146ba8..0000000000 --- a/capabilities/controller/pkg/capabilities/run/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package run has the capabilities controller that reconciles on Capabilities resources in run.tanzu.vmware.com group -package run diff --git a/capabilities/controller/pkg/capabilities/suite_test.go b/capabilities/controller/pkg/capabilities/suite_test.go index d0403c6f04..c59fa2dba1 100644 --- a/capabilities/controller/pkg/capabilities/suite_test.go +++ b/capabilities/controller/pkg/capabilities/suite_test.go @@ -1,5 +1,4 @@ //go:build envtest -// +build envtest // Copyright 2021 VMware, Inc. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/cli/core/.gitignore b/cli/core/.gitignore deleted file mode 100644 index 88ddcdf4d4..0000000000 --- a/cli/core/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_output/ diff --git a/cli/core/Makefile b/cli/core/Makefile deleted file mode 100644 index 0e078e428a..0000000000 --- a/cli/core/Makefile +++ /dev/null @@ -1,234 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -ROOT_DIR := $(shell git rev-parse --show-toplevel) -MODULE_ROOT_DIR := $(ROOT_DIR)/cli/core - -# Golang specific variables -GOOS ?= $(shell go env GOOS) -GOARCH ?= $(shell go env GOARCH) -GOHOSTOS ?= $(shell go env GOHOSTOS) -GOHOSTARCH ?= $(shell go env GOHOSTARCH) -# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) -ifeq (,$(shell go env GOBIN)) -GOBIN=$(shell go env GOPATH)/bin -else -GOBIN=$(shell go env GOBIN) -endif -GO := go - -NUL = /dev/null -ifeq ($(GOHOSTOS),windows) - NUL = NUL -endif - -BUILD_SHA ?= $$(git describe --match=$(git rev-parse --short HEAD) --always --dirty) -BUILD_DATE ?= $$(date -u +"%Y-%m-%d") -BUILD_VERSION ?= $(shell git describe --tags --abbrev=0 2>$(NUL)) - -ifeq ($(strip $(BUILD_VERSION)),) -BUILD_VERSION = dev -endif - -# Directories -TOOLS_DIR := $(abspath $(MODULE_ROOT_DIR)/hack/tools) -TOOLS_BIN_DIR := $(TOOLS_DIR)/bin - -# Add tooling binaries here and in hack/tools/Makefile -GOIMPORTS := $(TOOLS_BIN_DIR)/goimports -TOOLING_BINARIES := $(GOIMPORTS) - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help (default) - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-28s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m\033[32m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -# Add supported OS-ARCHITECTURE combinations here -ENVS ?= linux-amd64 windows-amd64 darwin-amd64 - -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/buildinfo.Date=$(BUILD_DATE)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/buildinfo.SHA=$(BUILD_SHA)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/buildinfo.Version=$(BUILD_VERSION)' - -ifndef TKG_DEFAULT_IMAGE_REPOSITORY -TKG_DEFAULT_IMAGE_REPOSITORY = "projects-stg.registry.vmware.com/tkg" -endif -ifndef ENABLE_CONTEXT_AWARE_PLUGIN_DISCOVERY -ENABLE_CONTEXT_AWARE_PLUGIN_DISCOVERY = "true" -endif -ifndef DEFAULT_STANDALONE_DISCOVERY_IMAGE_PATH -DEFAULT_STANDALONE_DISCOVERY_IMAGE_PATH = "packages/standalone-plugins" -endif -ifndef DEFAULT_STANDALONE_DISCOVERY_IMAGE_TAG -DEFAULT_STANDALONE_DISCOVERY_IMAGE_TAG = "${BUILD_VERSION}" -endif -ifndef DEFAULT_STANDALONE_DISCOVERY_TYPE -DEFAULT_STANDALONE_DISCOVERY_TYPE = "local" -endif -ifndef DEFAULT_STANDALONE_DISCOVERY_LOCAL_PATH -DEFAULT_STANDALONE_DISCOVERY_LOCAL_PATH = "standalone" -endif -ifndef TANZU_PLUGINS_ALLOWED_IMAGE_REPOSITORIES -TANZU_PLUGINS_ALLOWED_IMAGE_REPOSITORIES = "projects-stg.registry.vmware.com/tkg" -endif - - -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/buildinfo.IsOfficialBuild=$(IS_OFFICIAL_BUILD)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/tkg/buildinfo.IsOfficialBuild=$(IS_OFFICIAL_BUILD)' - -ifneq ($(strip $(TANZU_CORE_BUCKET)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.CoreBucketName=$(TANZU_CORE_BUCKET)' -endif - -ifneq ($(strip $(TKG_DEFAULT_IMAGE_REPOSITORY)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryRepository=$(TKG_DEFAULT_IMAGE_REPOSITORY)' -endif -ifneq ($(strip $(TANZU_PLUGINS_ALLOWED_IMAGE_REPOSITORIES)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultAllowedPluginRepositories=$(TANZU_PLUGINS_ALLOWED_IMAGE_REPOSITORIES)' -endif - -ifneq ($(strip $(ENABLE_CONTEXT_AWARE_PLUGIN_DISCOVERY)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.IsContextAwareDiscoveryEnabled=$(ENABLE_CONTEXT_AWARE_PLUGIN_DISCOVERY)' -endif -ifneq ($(strip $(DEFAULT_STANDALONE_DISCOVERY_IMAGE_PATH)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryImagePath=$(DEFAULT_STANDALONE_DISCOVERY_IMAGE_PATH)' -endif -ifneq ($(strip $(DEFAULT_STANDALONE_DISCOVERY_IMAGE_TAG)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryImageTag=$(DEFAULT_STANDALONE_DISCOVERY_IMAGE_TAG)' -endif -ifneq ($(strip $(DEFAULT_STANDALONE_DISCOVERY_LOCAL_PATH)),) -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryLocalPath=$(DEFAULT_STANDALONE_DISCOVERY_LOCAL_PATH)' -endif - - -BUILD_TAGS ?= -ARTIFACTS_DIR ?= $(ROOT_DIR)/artifacts -RELEASE_JOBS := $(addprefix release-,${ENVS}) - -.PHONY: all -all: build-tanzu-core-cli-local install-tanzu-core-cli-local ## Build and install Tanzu Core CLI - -.PHONY: build-tanzu-core-cli-local -build-tanzu-core-cli-local: ##Build the Tanzu Core CLI image for local platform - @mkdir -p $(ARTIFACTS_DIR)/$(GOHOSTOS)/$(GOHOSTARCH)/cli/core/$(BUILD_VERSION) - @if [ "$(GOHOSTOS)" = "windows" ]; then \ - $(GO) build -tags "${BUILD_TAGS}" --ldflags "$(LD_FLAGS)" -o "$(ARTIFACTS_DIR)/$(GOHOSTOS)/$(GOHOSTARCH)/cli/core/$(BUILD_VERSION)/tanzu-core-$(GOHOSTOS)_$(GOHOSTARCH).exe" ./cmd/tanzu/main.go ;\ - else \ - $(GO) build -tags "${BUILD_TAGS}" --ldflags "$(LD_FLAGS)" -o "$(ARTIFACTS_DIR)/$(GOHOSTOS)/$(GOHOSTARCH)/cli/core/$(BUILD_VERSION)/tanzu-core-$(GOHOSTOS)_$(GOHOSTARCH)" ./cmd/tanzu/main.go ;\ - fi - -.PHONY: build-tanzu-core-cli-% -build-tanzu-core-cli-%: ##Build the Tanzu Core CLI image for a platform - $(eval ARCH = $(word 3,$(subst -, ,$*))) - $(eval OS = $(word 2,$(subst -, ,$*))) - $(eval DISCOVERY_TYPE = $(word 1,$(subst -, ,$*))) - - @if [ "$(filter $(OS)-$(ARCH),$(ENVS))" = "" ]; then\ - printf "\n\n======================================\n";\ - printf "! $(OS)-$(ARCH) is not an officially supported platform!\n";\ - printf "! Make sure to perform a full build to make sure expected plugins are available!\n";\ - printf "======================================\n\n";\ - fi - @mkdir -p $(ARTIFACTS_DIR)/$(GOHOSTOS)/$(GOHOSTARCH)/cli/core/$(BUILD_VERSION) - @if [ "$(OS)" = "windows" ]; then \ - GOOS=$(OS) GOARCH=$(ARCH) $(GO) build -tags "${BUILD_TAGS}" --ldflags "$(LD_FLAGS) -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryType=${DISCOVERY_TYPE}'" -o "$(ARTIFACTS_DIR)/$(OS)/$(ARCH)/cli/core/$(BUILD_VERSION)/tanzu-core-$(OS)_$(ARCH).exe" ./cmd/tanzu/main.go;\ - else \ - GOOS=$(OS) GOARCH=$(ARCH) $(GO) build -tags "${BUILD_TAGS}" --ldflags "$(LD_FLAGS) -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryType=${DISCOVERY_TYPE}'" -o "$(ARTIFACTS_DIR)/$(OS)/$(ARCH)/cli/core/$(BUILD_VERSION)/tanzu-core-$(OS)_$(ARCH)" ./cmd/tanzu/main.go;\ - fi - -.PHONY: install-tanzu-core-cli ## Install Tanzu Core CLI with local discovery -install-tanzu-core-cli: install-tanzu-core-cli-local ## Install Tanzu CLI with local discovery - -.PHONY: install-tanzu-core-cli-% -install-tanzu-core-cli-%: ## Install Tanzu Core CLI - $(eval DISCOVERY_TYPE = $(word 1,$(subst -, ,$*))) - $(GO) install -ldflags "$(LD_FLAGS) -X 'github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config.DefaultStandaloneDiscoveryType=${DISCOVERY_TYPE}'" ./cmd/tanzu - - -.PHONY: release -release: ${RELEASE_JOBS} ## Create release binaries - -.PHONY: release-% -release-%: ## Create release for a platform - $(eval ARCH = $(word 2,$(subst -, ,$*))) - $(eval OS = $(word 1,$(subst -, ,$*))) - - $(MAKE) build-tanzu-core-cli-oci-$(OS)-$(ARCH) - -## -------------------------------------- -## OS Packages -## -------------------------------------- -.PHONY: apt-package -apt-package: ## Build a debian package to use with APT - @if [ "$$(command -v docker)" == "" ]; then \ - echo "Docker required to build apt package" ;\ - exit 1 ;\ - fi - - @# To call this target, the VERSION variable must be set by the caller. The version must match an existing release - @# of the tanzu CLI on Github. E.g., VERSION=v0.26.0 make apt-package - docker run --rm -e VERSION=$${VERSION} -v $(ROOT_DIR):$(ROOT_DIR) ubuntu $(MODULE_ROOT_DIR)/hack/apt/build_package.sh - -.PHONY: rpm-package -rpm-package: ## Build an RPM package - @if [ "$$(command -v docker)" == "" ]; then \ - echo "Docker required to build rpm package" ;\ - exit 1 ;\ - fi - - @# To call this target, the VERSION variable must be set by the caller. The version must match an existing release - @# of the tanzu CLI on Github. E.g., VERSION=v0.26.0 make rpm-package - docker run --rm -e VERSION=$${VERSION} -v $(ROOT_DIR):$(ROOT_DIR) fedora $(MODULE_ROOT_DIR)/hack/rpm/build_package.sh - -.PHONY: choco-package -choco-package: ## Build a Chocolatey package - @if [ "$$(command -v docker)" = "" ]; then \ - echo "Docker required to build chocolatey package" ;\ - exit 1 ;\ - fi - - @# There are only AMD64 images to run chocolatey on docker - @if [ "$(GOHOSTARCH)" != "amd64" ]; then \ - echo "Can only build chocolatey package on an amd64 machine at the moment" ;\ - exit 1 ;\ - fi - - @# To call this target, the VERSION variable must be set by the caller. The version must match an existing release - @# of the tanzu CLI on Github. E.g., VERSION=v0.26.0 make choco-package - docker run --rm -e VERSION=$${VERSION} -v $(ROOT_DIR):$(ROOT_DIR) chocolatey/choco $(MODULE_ROOT_DIR)/hack/choco/build_package.sh - -## -------------------------------------- -## Testing -## -------------------------------------- - -.PHONY: test -test: fmt vet ## Run Tests - ${GO} test `go list ./... | grep -v test/e2e` -timeout 60m -race -coverprofile coverage.txt -v - -.PHONY: vet -vet: ## Vet codebase - ${GO} vet ./... - -.PHONY: fmt -fmt: $(GOIMPORTS) ## Run goimports - $(GOIMPORTS) -w -local github.com/vmware-tanzu ./ - -.PHONY: generate-fakes -generate-fakes: ## Generate fakes for writing unit tests - $(GO) generate ./... - $(MAKE) fmt - -.PHONY: test-e2e -test-e2e: fmt vet ## Run CLI Core E2E Tests - ${GO} test ./test/e2e/... -timeout 60m -race -coverprofile coverage.txt -v - -## -------------------------------------- -## Tooling Binaries -## -------------------------------------- - -tools: $(TOOLING_BINARIES) ## Build tooling binaries -.PHONY: $(TOOLING_BINARIES) -$(TOOLING_BINARIES): - make -C $(TOOLS_DIR) $(@F) diff --git a/cli/core/cmd/tanzu/doc.go b/cli/core/cmd/tanzu/doc.go deleted file mode 100644 index ab973371c7..0000000000 --- a/cli/core/cmd/tanzu/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021-22 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// The Tanzu CLI. -package main diff --git a/cli/core/cmd/tanzu/main.go b/cli/core/cmd/tanzu/main.go deleted file mode 100644 index e5f661f5ad..0000000000 --- a/cli/core/cmd/tanzu/main.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021-22 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - "os/exec" - - "github.com/aunum/log" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/command" -) - -func main() { - if err := command.Execute(); err != nil { - if errStr, ok := err.(*exec.ExitError); ok { - // If a plugin exited with an error, we don't want to print its - // exit status as a string, but want to use it as our own exit code. - os.Exit(errStr.ExitCode()) - } else { - // We got an error other than a plugin exiting with an error, let's - // print the error message. - log.Fatal(err) - } - } -} diff --git a/cli/core/docs/cli/build_stage_styleguide_checklist.md b/cli/core/docs/cli/build_stage_styleguide_checklist.md deleted file mode 100644 index 4ba4a626af..0000000000 --- a/cli/core/docs/cli/build_stage_styleguide_checklist.md +++ /dev/null @@ -1,71 +0,0 @@ -# Build-Stage Styleguide Checklist - -Follow this checklist while implementing commands to ensure consistency with the [CLI Style Guide](style_guide.md). - -Working up initial designs? Please use the [Design-Stage Checklist](design_stage_styleguide_checklist.md) instead. - -## Importance Ratings - -Each item in the checklist below has a high, medium, or low importance rating to help with prioritization. - -* **High** = must fix before release -* **Medium** = should fix before release (or commitment to fix in a fast-follow release) -* **Low** = would be nice to fix before release (or commitment to fix in a near-term release) - -## Command Structure - -* [ ] **Do the commands follow [the design pattern](style_guide.md#designing-commands) described in the CLI Style Guide?** (importance: high) - * noun - verb - resource - flags -* [ ] **Is the number of nested noun layers <= 2?** (importance: medium) -* [ ] **Is the number of required flags <= 2?** (importance: medium) -* [ ] **Is the number of optional flags <= 5?** (importance: medium) - -## UI Text / Taxonomy - -* [ ] **If new nouns (resources) must be added to the [existing taxonomy](/hack/linter/cli-wordlist.yml), have they been approved by the CLI SIG?** (importance: high) - * Please update the [existing taxonomy](/hack/linter/cli-wordlist.yml) to include the new nouns -* [ ] **If new verbs (actions) must be added to the [existing taxonomy](/hack/linter/cli-wordlist.yml), have they been approved by the CLI SIG?** (importance: high) - * Please update the [existing taxonomy](/hack/linter/cli-wordlist.yml) to include the new verbs -* [ ] **Do any commands require adding new flags to the [existing taxonomy](/hack/linter/cli-wordlist.yml)?** (importance: low) - * Please update the [existing taxonomy](/hack/linter/cli-wordlist.yml) to include the new flags - -## Design - -### Commands - -* [ ] **Does interaction deactivate when not using a tty interface?** (importance: high) -* [ ] **Is there helpful behavior if no required arg or flags are specified?** (importance: medium) - * For example: show help, show error, or provide interactive prompt - -### Execution - -* [ ] **Is each command idempotent?** (importance: high) - -### Feedback - -* [ ] **Does command feedback adhere to [color guidance](style_guide.md#color)?** (importance: high) -* [ ] **Do dangerous actions have confirmation prompts?** (importance: high) -* [ ] **Can confirmation prompts be skipped by passing in `--yes` or `--force`?** (importance: high) -* [ ] **Do all commands provide [confirmation feedback](style_guide.md#confirmation-feedback) when run?** (importance: medium) -* [ ] **Do all commands provide [completion feedback](style_guide.md#feedback-when-a-process-completes)?** (importance: medium) -* [ ] **Is verbosity configurable?** (importance: medium) - -### Outputs - -* [ ] **Is the default output format human friendly?** (importance: high) - * For example tables, key/value pairs etc... (not JSON/YAML etc...) -* [ ] **Do all [date/times](style_guide.md#time-format) follow the ISO 8601 standard?** (importance: high) - * For example: `2021-03-02T15:43:12.41-0700` -* [ ] **Do [table styles](style_guide.md#tables) align with the styledguide?** (importance: medium) -* [ ] **Does [key:value pair styling](style_guide.md#keyvalue-pairs) align with the styleguide?** (importance: medium) - -### Help text - -* [ ] **Is there help text available for every command?** (importance: high) -* [ ] **For complex commands, are there examples?** (importance: medium) -* [ ] **Does the help text include URL for docs?** (importance: low) - -### Errors / warnings - -* [ ] **If there are experimental commands, do they include a warning notice in the confirmation feedback when run?** (importance: high) -* [ ] **Are there tailored error messeges for known / common error cases?** (importance: medium) diff --git a/cli/core/docs/cli/cli-architecture.md b/cli/core/docs/cli/cli-architecture.md deleted file mode 100644 index 766e016640..0000000000 --- a/cli/core/docs/cli/cli-architecture.md +++ /dev/null @@ -1,300 +0,0 @@ -# CLI Architecture - -This document aims to provide a general overview of the Tanzu CLI architecture. - -## Definition - -_Plugin_ - The CLI consists of plugins, each being a cmd developed in Go and conforming to Cobra CLI standard. - -_Context_ - An isolated scope of relevant client-side configurations for a combination of user identity and server identity. - -_Target_ - Target is a top level entity used to make the control plane, that a user is interacting against, more explicit in command invocations. - -_DiscoverySource_ - Represents a group of plugin artifacts and their distribution details that are installable by the Tanzu CLI. - -_Catalog_ - A catalog holds the information of all currently installed plugins on a host OS. - -_Distribution_ - A distribution is a set of plugins that may exist across multiple repositories. - -_Groups_ - Plugin output is displayed within groups. Currently, Admin, Extra, Run, System, Version. - -_Builder_ - Builder scaffolds CLI plugins repositories and new plugins. Builds CLI plugins for the specified arch. - -## Plugins - -The CLI is based on a plugin architecture. This architecture enables teams to build, own, and release their own piece of functionality as well as enable external partners to integrate with the system. - -There are two category of plugins that are determined based on Plugin Discovery. Standalone Plugins and Context-Scoped Plugins - -## Plugin Discovery - -A plugin discovery points to a group of plugin artifacts that are installable by the Tanzu CLI. It uses an interface to fetch the list of available plugins, their supported versions and how to download them. - -There are two types of plugin discovery: Standalone Discovery and Context-Scoped Discovery. - -Standalone Discovery: Independent of the CLI context. E.g. OCI based plugin discovery not associated with any context - -Context-Scoped Discovery - Associated with a context (generally active context) E.g., the CLIPlugin API in a kubernetes cluster - -Standalone Plugins: Plugins that are discovered through standalone discovery source - -Context-Scoped Plugins: Plugins that are discovered through context-scoped discovery source - -The `tanzu plugin source` command is applicable to standalone plugin discovery only. - -Adding discovery sources to tanzu configuration file: - -```sh -# Add a local discovery source. If URI is relative path, -# $HOME/.config/tanzu-plugins will be considered based path -tanzu plugin source add --name standalone-local --type local --uri path/to/local/discovery - -# Add an OCI discovery source. URI should be an OCI image. -tanzu plugin source add --name standalone-oci --type oci --uri projects.registry.vmware.com/tkg/tanzu-plugins/standalone:latest -``` - -Listing available discovery sources: - -```sh -tanzu plugin source list -``` - -Update a discovery source: - -```sh -# Update a local discovery source. If URI is relative path, -# $HOME/.config/tanzu-plugins will be considered based path -tanzu plugin source update standalone-local --type local --uri new/path/to/local/discovery - -# Update an OCI discovery source. URI should be an OCI image. -tanzu plugin source update standalone-oci --type oci --uri projects.registry.vmware.com/tkg/tanzu-plugins/standalone:v1.0 -``` - -Delete a discovery source: - -```sh -tanzu plugin source delete standalone-oci -``` - -Sample tanzu configuration file after adding discovery: - -```yaml -apiVersion: config.tanzu.vmware.com/v1alpha1 -clientOptions: - cli: - discoverySources: - - local: - name: standalone-local - path: new/path/to/local/discovery - - oci: - name: standalone-oci - image: projects.registry.vmware.com/tkg/tanzu-plugins/standalone:v1.0 -``` - -To list all the available plugin that are getting discovered: - -```sh -tanzu plugin list -``` - -It will list the plugins from all the discoveries found in the local config file. - -To describe a plugin use: - -```sh -tanzu plugin describe -``` - -To see specific plugin information: - -```sh -tanzu info -``` - -To remove a plugin: - -```sh -tanzu plugin delete -``` - -## Context - -Context is an isolated scope of relevant client-side configurations for a combination of user identity and server identity. -There can be multiple contexts for the same combination of `(user, server)`. Previously, this was referred to as `Server` in the Tanzu CLI. -Going forward we shall refer to them as `Context` to be explicit. Also, the context can be managed at one place using the `tanzu context` command. -Earlier, this was distributed between the `tanzu login` command and `tanzu config server` command. - -- Each `Context` is associated with a `Target`. -- While multiple contexts can be associated with a target. -- There is at most one context that is active for each target. - -More details regarding Target is available in next section. - -Create a new context: - -```sh -# Deprecated: Login to TKG management cluster by using kubeconfig path and context for the management cluster -tanzu login --kubeconfig path/to/kubeconfig --context context-name --name mgmt-cluster - -# New Command -tanzu context create --kubeconfig path/to/kubeconfig --kubecontext context-name --name mgmt-cluster -``` - -List known contexts: - -```sh -# Deprecated -tanzu config server list - -# New Command -tanzu context list -``` - -Delete a context: - -```sh -# Deprecated -tanzu config server delete demo-cluster - -# New Command -tanzu context delete demo-cluster -``` - -Use a context: - -```sh -# Deprecated -tanzu login mgmt-cluster - -# New Command -tanzu context use mgmt-cluster -``` - -## Target - -Target is a top level entity used to make the control plane, that a user is interacting against, more explicit in command invocations. -This is done by creating a separate target specific command under root level command for Tanzu CLI. e.g. `tanzu ` - -The Tanzu CLI supports two targets: `kubernetes` (alias `k8s`), `mission-control` (alias `tmc`). To respect backwards-compatibility, when no target command is specified, the kubernetes target is used automatically. - -Target of a plugin is determined differently for Standalone Plugins and Context-Scoped plugins. - -For Standalone Plugins, the target is determined based on `target` field defined in `CLIPlugin` CR as part of the discovery API. - -For Context-scoped Plugins, the target is determined based on the `target` associated with Context itself. -E.g. all plugins discovered through the Context `test-context` will have the same target that is associated with the `test-context`. - -Using the target concept, we can differentiate between listing TKG workload clusters or TMC workload clusters. - -To list TKG workload clusters using the TKG cluster plugin which is associated with the kubernetes target: - -```sh -# Without target grouping (a TKG management cluster is set as the current active server) -tanzu cluster list - -# With target grouping -tanzu kubernetes cluster list -``` - -To list TMC workload clusters using the TMC cluster plugin which is associated with the tmc target: - -```sh -# With target grouping -tanzu mission-control cluster list -``` - -## Catalog - -A catalog holds the information of all currently installed plugins on a host OS. Plugins are currently stored in $XDG_DATA_HOME/tanzu-cli. Plugins are self-describing and every plugin automatically implements a set of default hidden commands. - -```sh -tanzu cluster info -``` - -Will output the descriptor for that plugin in json format, eg: - -```json -{"name":"cluster","description":"Kubernetes cluster operations","version":"v0.0.1","buildSHA":"7e9e562-dirty","group":"Run"} -``` - -The catalog gets built while installing or upgrading any plugins by executing the info command on the binaries. - -## Execution - -When the root `tanzu` command is executed it gathers the plugin descriptors from the catalog for all the installed plugins and builds cobra commands for each one. - -When this plugin specific commands are invoked, Core CLI simply executes the plugin binary for the associated plugins and passes along stdout/in/err and any environment variables. - -## Versioning - -By default, versioning is handled by the git tags for the repo in which the plugins are located. Versions can be overridden by setting the version field in the plugin descriptor. - -All versions for a given plugin can be found by running: - -```sh -tanzu plugin describe -``` - -When installing or updating plugins a specific version can be supplied: - -```sh -tanzu plugin install --version v1.2.3 -``` - -## Groups - -With `tanzu --help` command, Plugins are displayed within groups. This enables the user to easily identify what functionality they may be looking for as plugins proliferate. - -Currently, updating plugin groups is not available to end users as new groups must be added to Core CLI directly. This was done to improve consistency but may want to be revisited in the future. - -## Testing - -Every plugin requires a test which the compiler enforces. Plugin tests are a nested binary under the plugin which should implement the test framework. - -Plugin tests can be run by installing the admin test plugin, which provides the ability to run tests for any of the currently installed plugins. It will fetch the test binaries for each plugin from its respective repo. - -Execute the test plugin: - -```sh -tanzu test plugin -``` - -## Docs - -Every plugin requires a README.md file at the top level of its directory which is enforced by the compiler. This file should serve as a guide for how the plugin is to be used. - -In the future, we should have every plugin implement a `docs` command which outputs the generated cobra docs. - -## Builder - -The builder admin plugin is a means to build Tanzu CLI plugins. Builder provides a set of commands to bootstrap plugin repositories, add commands to them and compile them into an artifacts directory - -Initialize a plugin repo: - -```sh -tanzu builder init -``` - -Add a cli command: - -```sh -tanzu builder cli add-plugin -``` - -Compile into an artifact directory. - -```sh -tanzu builder cli compile ./cmd/plugins -``` - -## Release - -Plugins are first compiled into an artifact directory (local discovery source) using the builder plugin and then pushed up to their production discovery source. - -## Default Plugin Commands - -All plugins get several commands bundled with the plugin system, to provide a common set of commands: - -- _Lint_: Lints the cobra command structure for flag and command names and shortcuts. -- _Docs_: Every plugin gets the ability to generate its cobra command structure. -- _Describe, Info, Version_: Get the basic details about any plugin. diff --git a/cli/core/docs/cli/config-features.md b/cli/core/docs/cli/config-features.md deleted file mode 100644 index 3b33b13035..0000000000 --- a/cli/core/docs/cli/config-features.md +++ /dev/null @@ -1,50 +0,0 @@ -# Configuration of Features - -The Tanzu CLI offers the ability to configure CLI plugins based on feature flags. Some feature flags control behavior options that are part of a production-ready release, -some flags control features that are still in development. By default, the CLI will install with only shippable features. However, some beta features may be available by - updating config options. To use the feature configuration, you need to know the name of the plugin and the feature flag for the functionality you want to activate -(or deactivate). For production-ready features, you can always find the feature flag in the configuration file under the plugin that uses it. For beta features, you may need to - inquire what the feature flag is (or you may find it in the configuration file set to `false`). - We recommend you make a back-up of your original config file before using this command. - -To update, use the config command: - -```sh -tanzu config set features.. -``` - -An example might be: - -```sh -tanzu config set features.management-cluster.dual-stack true -``` - -For global options, an example might be: - -```sh -tanzu config set features.global.debug true -``` - -The options for the command are: - -* `plugin-name`: a valid plugin that uses the feature name you are setting; there is no validation. Use `global` for CLI-wide features. -* `feature-name`: the feature name you are setting; there is no validation. -* `true|false`: the code that consumes the feature config value expects a boolean for features and may throw an error if it encounters non-boolean text; there is no validation. - -For developers making use of this feature: - -* To set a default value in the tanzu config file, pass `DefaultFeatureFlags` as part of PluginDescriptor when defining the plugin -* Users can change the value by using the command above, or by manually editing their tanzu config file -* Throughout your code, you may use `cfg.IsConfigFeatureActivated()` to check the flag value (in apis/config/v1alpha1/clientconfig.go) - -If you want to make this feature available for a beta period: - -* To let users know the feature is available but still under development, use a `false` default value; when ready for production, change to `true`. This will create an entry in - their config file so they can see the flag name. -* We recommend using two flags, one for the beta period and one for production. For the beta period, simply append `-beta` to the flag name that you expect to use in production. -For example, your production flag might be `features.global.foobar` and for the beta you could use `features.global.foobar-beta`. There are two advantages to this approach: -(1) The user is clear when they are using a beta flag and when they are using a production flag, -(2) There are no transition issues between beta flag use and production. (If you use the same flag name for beta and for production, then when the production code runs the - previous "beta" setting will be taken as the production setting. This would force either the user or an installation script to activate the flag from `false` to `true` using - the `tanzu set config` command above. Using two different flag names, there is no such issue.) -NOTE: there is no code that detects `-beta`; it is simply a recommended naming convention. diff --git a/cli/core/docs/cli/deprecation.md b/cli/core/docs/cli/deprecation.md deleted file mode 100644 index ef589f88c6..0000000000 --- a/cli/core/docs/cli/deprecation.md +++ /dev/null @@ -1,30 +0,0 @@ -# Tanzu CLI deprecation policy - -Tanzu CLI is comprised of several different commands and plugins. -Sometimes, a release might remove flags or CLI commands (collectively -"CLI elements"). -This document sets out the deprecation policy for Tanzu CLI. - -CLI elements must function after their announced deprecation for no less than -one minor release. - -## How do we deprecate things? - -A **deprecation event** would coincide with a release. The rules for -deprecation are as follows: - -1. Deprecated CLI elements must display warnings when used. -1. The warning message should include a functional alternative to the - deprecated command or flag if anything. -1. The warning message should include the release for when the command/flag - will be removed. -1. The deprecation should be documented in the Release notes to make users - aware of the changes. - -**Example warning message**: - -Command "foo" is deprecated, will be removed in version "x.y.z". Use "bar" -instead. - -This [file](../../../runtime/command/deprecation.go) in the cli package has a utility -function that can be used to deprecate a command. diff --git a/cli/core/docs/cli/design_stage_styleguide_checklist.md b/cli/core/docs/cli/design_stage_styleguide_checklist.md deleted file mode 100644 index 1308a8109d..0000000000 --- a/cli/core/docs/cli/design_stage_styleguide_checklist.md +++ /dev/null @@ -1,24 +0,0 @@ -# Design-Stage Styleguide Checklist - -Follow this checklist to design commands that are consistent with the [CLI Style Guide](style_guide.md). - -Follow the [Build-Stage Checklist](build_stage_styleguide_checklist.md) when implementing in code. - -## Command Structure - -- [ ] **Do the commands follow the pattern described in the [CLI Style Guide](style_guide.md#designing-commands)?** (importance: high) - - noun - verb - resource - flags -- [ ] **Is the number of nested noun layers <= 2?** (importance: medium) -- [ ] **Is the number of required flags <= 2?** (importance: medium) -- [ ] **Is the number of optional flags <= 5?** (importance: medium) - -## UI Text / Taxonomy - -- [ ] **Do any commands require adding new nouns (resources) to the [existing taxonomy](/hack/linter/cli-wordlist.yml)?** (importance: high) - - Check in with the CLI SIG to add new top-level resources -- [ ] **Are the nouns in each command used in a manner consistent with usage in existing commands?** (importance: high) -- [ ] **Do any commands require adding new verbs (actions) to the [existing taxonomy](/hack/linter/cli-wordlist.yml)?** (importance: medium) - - Not a problem, but if there is a verb in the [existing taxonomy](/hack/linter/cli-wordlist.yml) that could be used, please use it -- [ ] **Are the verbs in each command used in a manner consistent with usage in existing commands?** (importance: medium) -- [ ] **Do any commands require adding new flags to the [existing taxonomy](/hack/linter/cli-wordlist.yml)?** (importance: low) - - Not a problem, but if there is a flag in the [existing taxonomy](/hack/linter/cli-wordlist.yml) that could be used, please use it diff --git a/cli/core/docs/cli/example-images/error-warn.png b/cli/core/docs/cli/example-images/error-warn.png deleted file mode 100644 index 6167b145c4..0000000000 Binary files a/cli/core/docs/cli/example-images/error-warn.png and /dev/null differ diff --git a/cli/core/docs/cli/example-images/feedback.png b/cli/core/docs/cli/example-images/feedback.png deleted file mode 100644 index 52d94dce7e..0000000000 Binary files a/cli/core/docs/cli/example-images/feedback.png and /dev/null differ diff --git a/cli/core/docs/cli/example-images/prompting.png b/cli/core/docs/cli/example-images/prompting.png deleted file mode 100644 index e82253a65e..0000000000 Binary files a/cli/core/docs/cli/example-images/prompting.png and /dev/null differ diff --git a/cli/core/docs/cli/example-images/success.png b/cli/core/docs/cli/example-images/success.png deleted file mode 100644 index 48e5aa1f3b..0000000000 Binary files a/cli/core/docs/cli/example-images/success.png and /dev/null differ diff --git a/cli/core/docs/cli/example-images/table-text.png b/cli/core/docs/cli/example-images/table-text.png deleted file mode 100644 index 7c00805ef7..0000000000 Binary files a/cli/core/docs/cli/example-images/table-text.png and /dev/null differ diff --git a/cli/core/docs/cli/example-images/usage-tips.png b/cli/core/docs/cli/example-images/usage-tips.png deleted file mode 100644 index 9905ba56cc..0000000000 Binary files a/cli/core/docs/cli/example-images/usage-tips.png and /dev/null differ diff --git a/cli/core/docs/cli/plugin_implementation_guide.md b/cli/core/docs/cli/plugin_implementation_guide.md deleted file mode 100644 index 1b97d2e8c1..0000000000 --- a/cli/core/docs/cli/plugin_implementation_guide.md +++ /dev/null @@ -1,309 +0,0 @@ -# Tanzu CLI Plugin Implementation Guide - -## Developing - -The Tanzu CLI was built to be extensible across teams and be cohesive across SKUs. To this end, the Tanzu CLI provides -tools to make creating and compiling new plugins straightforward. - -The [Tanzu CLI Styleguide](style_guide.md) describes the user interaction patterns to be followed, -and general guidance, for CLI contribution. - ------------------------------- - -### Plugins - -The Tanzu CLI is a modular design that consists of plugins. To bootstrap a new plugin, you can use the `builder` admin -plugin as described further below. - -This architecture enables teams to build, own, and release their own piece of functionality as well as enable external -partners to integrate with the system. - -Current implementations: - -* [Tanzu Framework plugins](https://github.com/vmware-tanzu/tanzu-framework/tree/main/cmd/cli/plugin) -* [Admin plugins](https://github.com/vmware-tanzu/tanzu-framework/tree/main/cmd/cli/plugin-admin) -* Advanced plugins - -#### Installing Admin Plugins - -With the [context-aware plugin discovery](../design/context-aware-plugin-discovery-design.md) enabled (now the default and recommended approach), Tanzu CLI admin plugins should be installed from local source as follows: - -1. Download the latest admin plugin tarball or zip file from [release](https://github.com/vmware-tanzu/tanzu-framework/releases/latest) page (`tanzu-framework-plugins-admin-linux-amd64.tar.gz` or `tanzu-framework-plugins-admin-darwin-amd64.tar.gz` or `tanzu-framework-plugins-admin-windows-amd64.zip`) and extract it (using `linux` as the example OS for next steps) -1. Run `tanzu plugin list --local /path/to/extracted/admin-plugins` to list the available admin plugins -1. Run `tanzu plugin install all --local /path/to/extracted/admin-plugins` to install all admin plugins. The user can use `_plugin-name_` instead of `all` to install a specific plugin. -1. Run `tanzu plugin list` to verify the installed plugins - -NOTE: We are working on enhancing this user experience by publishing admin artifacts as OCI image discovery source as well. More details is in [this issue](https://github.com/vmware-tanzu/tanzu-framework/issues/1376). - -### Context - -Context is an isolated scope of relevant client-side configurations for a combination of user identity and server identity. There can be multiple contexts for the same combination of `(user, server)`. Previously, this was referred to as `Server` in the Tanzu CLI. Going forward we shall refer to them as `Context` to be explicit. - -If a plugin wants to access the context it should use the [provided libraries](../../../runtime/config/context.go) for forwards compatibility. For example, to get the current active context use the below snippet: - -```go -ctx, err := config.GetCurrentContext(cliapi.Target) -``` - -**Note:** The Tanzu CLI ensures backwards compatibility between `Server` and `Context`. - -### Plugin Discovery Source - -Discovery is the interface to fetch the list of available plugins, their supported versions and how to download them either standalone or scoped to a context(server). E.g., the CLIPlugin resource in a management cluster, OCI based plugin discovery for standalone plugins, a similar REST API etc. provides the list of available plugins and details about the supported versions. Having a separate interface for discovery helps to decouple discovery (which is usually tied to a server or user identity) from distribution (which can be shared). - -Plugins can be of two different types: - - 1. Standalone plugins: independent of the CLI context and are discovered using standalone discovery source - - This type of plugins are not associated with the `tanzu login` workflow and are available to the Tanzu CLI independent of the CLI context. - - 2. Context(server) scoped plugins: scoped to one or more contexts and are discovered using kubernetes or other server associated discovery source - - This type of plugins are associated with the `tanzu login` workflow and are discovered from the management-cluster or global server endpoint. - In terms of management-clusters, this type of plugins are mostly associated with the installed packages. - - Example: - - As a developer of a `velero` package, I would like to create a Tanzu CLI plugin that can be used to configure and manage installed `velero` package configuration. - This usecase can be handled with context scoped plugins by installing `CLIPlugin` CR related to `velero` plugin on the management-cluster as part of `velero` package installation. - - ```sh - # Login to a management-cluster - $ tanzu login - - # Installs velero package to the management-cluster along with `velero` CLIPlugin resource - $ tanzu package install velero-pkg --package-name velero.tanzu.vmware.com - - # Plugin list should show a new `velero` plugin available - $ tanzu plugin list - NAME DESCRIPTION SCOPE DISCOVERY VERSION STATUS - velero Backup and restore operations Context cluster-default v0.1.0 not installed - - # Install velero plugin - $ tanzu plugin install velero - ``` - -The default standalone plugins discovery source automatically gets added to the tanzu config files and plugins from this discovery source are automatically discovered. - -```sh -$ tanzu plugin list - NAME DESCRIPTION SCOPE DISCOVERY VERSION STATUS - login Login to the platform Standalone default v0.11.0-dev not installed - management-cluster Kubernetes management-cluster operations Standalone default v0.11.0-dev not installed -``` - -To add a plugin discovery source the command `tanzu plugin source add` should be used. For example, assuming the admin plugin's manifests are released as a carvel-package at OCI image `projects.registry.vmware.com/tkg/tanzu-plugins/admin-plugins:v0.11.0-dev` then we use the following command to add that discovery source to the tanzu configuration. - -```sh - tanzu plugin source add --name admin --type oci --uri projects.registry.vmware.com/tkg/tanzu-plugins/admin-plugins:v0.11.0-dev -``` - -We can check the newly added discovery source with - -```sh -$ tanzu plugin source list - NAME TYPE SCOPE - default oci Standalone - admin oci Standalone -``` - -This will allow the tanzu CLI to discover new available plugins in the newly added discovery source. - -```sh -$ tanzu plugin list - NAME DESCRIPTION SCOPE DISCOVERY VERSION STATUS - login Login to the platform Standalone default v0.11.0-dev not installed - management-cluster Kubernetes management-cluster operations Standalone default v0.11.0-dev not installed - builder Builder plugin for CLI Standalone admin v0.11.0-dev not installed - test Test plugin for CLI Standalone admin v0.11.0-dev not installed -``` - -To install the builder plugin use `tanzu plugin install builder` - -### Repository (Legacy method) - -NOTE: This is not applicable if [context-aware plugin discovery](../design/context-aware-plugin-discovery-design.md) is enabled within Tanzu CLI. - -A plugin repository represents a group of plugin artifacts that are installable by the Tanzu CLI. A repository is -defined as an interface. - -Current interface implementations: - -* Local filesystem -* GCP bucket - -Our production plugin artifacts currently come from GCP buckets. Developers of plugins will typically use the local -filesystem repository in the creation and testing of their feature. - -#### Adding Admin Repository (Legacy method) - -NOTE: This is not applicable if [context-aware plugin discovery](../design/context-aware-plugin-discovery-design.md) is enabled within Tanzu CLI. - -The admin repository contains the Builder plugin - a plugin which helps scaffold and compile plugins. - -To add the admin repository use `tanzu plugin repo add -n admin -b tanzu-cli-admin-plugins -p artifacts-admin` - -To add the builder plugin use `tanzu plugin install builder` - -### Developing a New CLI Plugin - -The sections below describe how to develop a new Tanzu CLI plugin. - -#### Bootstrapping a Plugin - -The `builder` admin plugin can be used to develop a new plugin for the Tanzu CLI. - -The first step is to use `tanzu builder init ` to create a new plugin repository. -Then `cd && tanzu builder cli add-plugin ` which will add a `main` package for the new plugin. -You should now adjust the newly created `main` package to implement the functionality of your new plugin. - -You will notice in the generated `main.go` file, that CLI plugins have to instantiate a -[Plugin descriptor](https://github.com/vmware-tanzu/tanzu-framework/blob/main/apis/cli/v1alpha1/catalog_types.go) -for creating a new plugin, the code then allows you to add [sub-commands](https://github.com/vmware-tanzu/tanzu-framework/tree/main/cli/runtime/plugin) to your plugin. - -Plugins are pulled from registered repositories. On a merge to main, all the plugins in your new repo are built and pushed -to a public repository (see the `.github` directory or `.gitlab-ci.yaml` file). It is useful to leverage a local repo while developing. - -#### Building a Plugin - -The Tanzu CLI itself is responsible for building plugins. You can build and install your new plugin for the current host OS with the provided make targets as follows: - -1. Initialize go module. - -```shell -make init -``` - -1. Create an initial commit. - -```shell -git add -A -git commit -m "Initialize plugin repository" -``` - -1. Add your plugin name to the `PLUGINS` variable in the `Makefile`. This is the name you used with the `tanzu builder cli add-plugin ` command. - -```shell -# Add list of plugins separated by space -PLUGINS ?= "" -``` - -1. Build the plugin. - -```sh -make build-install-local -``` - -This will build plugin artifacts under `./artifacts` and generate a plugin publishing directory `${HOSTOS}-${HOSTARCH}` under `./artifacts/published`. -Using `make build-install-local` installs the plugins for the user, but it internally invokes the following command to install the plugins: - -```sh -tanzu plugin install --local ./artifacts/published/${HOSTOS}-${HOSTARCH} -``` - -Your plugin is now available for you through the Tanzu CLI. You can confirm this by running `tanzu plugin list` -which will now show your plugin. - -The next steps are to write the plugin code to implement what the plugin is meant to do. - -Plugins are installed into `$XDG_DATA_HOME`, (read more about the XDG Base Directory Specification [here.](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) - -The CLI can be updated to the latest version of all plugins using: - -```sh -tanzu update -``` - -#### Tests - -Every CLI plugin should have a nested test executable. The executable should utilize the test framework found in -`pkg/v1/test/cli`. -Tests are written to ensure the stability of the commands and are compiled alongside the plugins. Tests can be run by -the admin `test` plugin of the Tanzu CLI. - -#### Docs - -Every plugin requires a README document that explains its basic usage. - -### Distributions - -A distribution is simply a set of plugins that may exist across multiple repositories. The CLI currently contains a -default distribution which is the default set of plugins that should be installed on initialization. - -Distributions allow the CLI to be presented in accordance with different product offerings. When creating a new local -catalog, you can specify the distro you wish the catalog to enforce for the CLI. - -On boot, the CLI will check that the distro is present within the given set of plugins or it will install them. - -Initialization of the distributions can be prevented by setting the env var `TANZU_CLI_NO_INIT=true` - -### Release - -When a git tag is created on the repositories, it will version all the plugins in that repository to the current tag. -The plugin binaries built for that tag will be namespaced under the tag semver. - -All merges to main will be under the `dev` namespace in the artifacts repository. - -The release directory structure for the available plugins under the repository can be generated by running the following command: - -```sh -make release -``` - -This will generate the published artifact directories under `./artifacts/published/` (default location) with an OS-ARCH specific -directory structure generated. - ------------------------------- - -## Repositories - -Framework exists in -[https://github.com/vmware-tanzu/tanzu-framework](https://github.com/vmware-tanzu/tanzu-framework) -and any plugins that are considered open source should exist in that repository as well. - -Other repositories should follow the model seen in -(TODO:add example url) and vendor the repository. -Ideally these plugins should exist in the same area as the API definitions. - ------------------------------- - -## CLI Behavior - -### Components - -CLI commands should utilize the plugin component library in `pkg/cli/component` for interactive features like prompts -or table printing. - -### Asynchronous Requests - -Commands should be written in such a way as to return as quickly as possible. -When a request is not expected to return immediately, as is often the case with declarative commands, the command should -return immediately with an exit code indicating the server's response. - -The completion notice should include an example of the `get` command the user would need in order to poll the resource -to check the state/status of the operation. - -### Shell Completion - -Shell completion (or "command-completion" or "tab completion") is the ability for the program to automatically fill-in -partially typed commands, arguments, flags and flag values. The Tanzu CLI provides an integrated solution for shell completion -which will automatically take care of completing commands and flags for your plugin. To make the completions richer, a plugin -can add logic to also provide shell completion for its arguments and flag values; these are referred to as "custom completions". - -Please refer to the Cobra project's documentation on -[Customizing completions](https://github.com/spf13/cobra/blob/main/shell_completions.md#customizing-completions) to learn how -to make your plugin more user-friendly using shell completion. - -### Templates - -TBD - -### Config file - -`~/.config/tanzu/config.yaml` - ------------------------------- - -## CLI Design - -Please see the [Tanzu CLI Styleguide](style_guide.md) diff --git a/cli/core/docs/cli/style_guide.md b/cli/core/docs/cli/style_guide.md deleted file mode 100644 index 3a9be39457..0000000000 --- a/cli/core/docs/cli/style_guide.md +++ /dev/null @@ -1,543 +0,0 @@ -# Tanzu CLI Styleguide - -## Tanzu CLI mission statement - -The Tanzu CLI aims to provide a consistent experience for users of the Tanzu portfolio - -This document is intended to provide direction for designing Tanzu CLI plugins so -that they adhere to established patterns - ------------------------------- - -## Styleguide Checklists - -Two checklists to help contributors design and develop styleguide-consistent commands are available. - -* The [design-stage checklist](design_stage_styleguide_checklist.md) is meant to be used prior to implementation. -* The [build-stage checklist](build_stage_styleguide_checklist.md) is meant to be used during implementation. - -## Design Principles - -### Prioritize human users first - -* Default to human readable output, but support plaintext and json/yaml options -* Use straightforward, simple language and syntax -* Use machine readable output where it does not impact usability - -### Prioritize discoverability, consistency and predictability - -* Consistent language, structure, and as much as possible, behaviors across interfaces - -### Be as helpful as possible - -* Invest time in your help and error text -* Provide examples -* Command line completion should be used whenever possible -* Provide context info whenever possible (ie feedback messages, etc) - -### The Tanzu CLI should be declarative whenever possible - -* Most APIs should be made declarative, and the CLI commands should supply basic `apply` operations on those data models - -### The CLI should contain as little logic as possible - -* Avoid complex client logic, maintaining state; prefer server side logic - -### The CLI must be accessible - -* We should not exclude users by deprioritizing accessibility -* Features like search filters and output limits are useful for folks using assistive technology -* Screen-readers and automation are both served by being thoughtful with the use of non machine-readable characters (emojis, ascii spinners, etc.) - ------------------------------- - -## Designing commands - -The Tanzu CLI uses the following pattern - -```sh -tanzu [global flags] noun [sub-noun] verb RESOURCE-NAME [flags] -``` - -Example - -```sh -tanzu cluster create NAME -tanzu management-cluster kubeconfig get --admin -``` - -### Global Flags - -Global flags are maintained by the Tanzu CLI SIG and adding to the current global set should be managed through the SIG - -### Nouns - -Any nouns being added must exist in the [Shared Taxonomy document](/hack/linter/cli-wordlist.yml) - -* Introducing nouns to support the creation of new commands and/or subcommands should be reviewed by the Tanzu CLI SIG - -Compound words should be `-` delimited - -```sh -management-cluster not managementcluster nor managementCluster -``` - -Nouns should not be combined with verbs - -```txt -tanzu app get, not tanzu app-get -``` - -### Verbs - -Use the standard CRUD verbs whenever possible - -* Tanzu CLI uses create, delete, get, list, update - - If at all possible, use pre-existing verbs from the [Shared Taxonomy document](/hack/linter/cli-wordlist.yml) - -* New verbs must be reviewed by the Tanzu CLI SIG - - Opposing commands should take the form of antonyms - -Example - -```txt -‘assign quota’ and ‘unassign quota’ -``` - -### Sub-Noun - -Plugin specific sub-nouns do not need to be reviewed by the governance group. -Please review the [Shared Taxonomy document](/hack/linter/cli-wordlist.yml) when using sub-nouns, and make sure you're using the noun consistently if it's already being used. - -#### Nesting - -Commands should not nest more than two layers of sub-nouns: - -* _Yes_: `tanzu plugin-name noun sub-noun verb --flags`… -* _No_: `tanzu plugin-name noun sub-noun sub-sub-noun verb --flags`… - -### Positional Arguments - -* There should no more than 1 positional argument -* Ideally, the positional argument should be the name/subject of the thing the command refers to (not some other flaggable property) - -Example - -```sh -tanzu cluster create CLUSTER-NAME [flags] -``` - -### Flags - -* Use standard names for flags if there is one (flags used in the cli are documented [here](../../../runtime/plugin/lint/cli-wordlist.yml)) -* When using flags to specify different aspects of the same object, including the object name in the flag can be helpful. `tanzu foo list --bar --bar-uid "..."` and `tanzu foo list --bar-name --bar-uid "..."` are both in use, choose whichever pattern makes more sense for your plugin. - -* Where possible, set reasonable defaults for flag-able options that align with expected workflows -* A user should only be required to explicitly set a max of 2 flags -* Add as many flags as necessary to configure the command -* Consider supporting the use of a config file if the number of flags exceeds 5 -* Flags should be tab completed. The Tanzu CLI uses the cobra framework, which has tooling to help with this [Cobra shell completion docs](https://github.com/spf13/cobra/blob/master/shell_completions.md) - -#### Resource flags - -The Tanzu CLI follows [kubectl patterns](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-units-in-kubernetes) for specifying resource units. - -CPU units -`m (millicpu)` -Example - -```txt -# 100m, .1, 1 -$tanzu apps workload update --limit-cpu 8 -``` - -Memory units -`E, P, T, G, M, K, Ei, Pi, Ti, Gi, Mi, Ki.` - -Example - -```txt -# 128974848, 129e6, 129M , 123Mi -$tanzu apps workload update --limit-memory 16G -``` - -#### Time duration flags - -The Tanzu CLI follows [go patterns](https://pkg.go.dev/time#ParseDuration) for specifying time duration. - -Time units -`ns, us (or µs), ms, s, m, h` - -Example - -```txt -# 300ms, -1.5h or 2h45m -$ tanzu apps workload delete --wait-timeout 10m -``` - -### Prompting - -* If you are prompting for a secret, do not echo it in the terminal when the user types - * Commands should accept secrets via environment variables -* Commands should not prompt when TTY is not present - * The component library can provide this check, pending resolution of issue #330 - -### Command principles - -* Support verbosity flags -* Provide a way to deactivate interactive prompting (`--quiet`, `--force`, `--yes`) - -### Components - Command - -Available for plugins written in golang. - -CLI commands should utilize the plugin component library in [cli/runtime/component](https://github.com/vmware-tanzu/tanzu-framework/tree/main/cli/runtime/component) for interactive features like prompts or table printing. - -Available input components: - -* Prompt -* Select - ------------------------------- - -## Designing feedback - -### Feedback principles - -Useful for everyone, critical to the usability of screen-readers and automation -Support verbosity flags (`-v`, `--verbose`). - -`--format` to define preferred output - -* Useful for humans and machine users, ie table, value, json, csv, yaml, etc - -`--filter` - -* To refine the output criteria - -For list commands, consider supporting `--limit` to set a maximum number of responses. - -* `--page-size` to define the number of resources per page if using pagination -* `--sort-by` to specify what field to organize the list by - -If using color to communicate information, don't let it be the only indicator. - -### Confirmation prompting - -* To protect against unintended destructive actions, the CLI should confirm user intentions before executing commands such as ‘delete’ -* It can be helpful to describe the impact of an action if not obvious -* The default action should be to cancel if no input is provided - -Example - -```txt -$ tanzu cluster delete MY_CLUSTER - -This action impacts all apps in this cluster. Deleting the cluster will remove associated apps -Really delete the cluster MY_CLUSTER [y/N] -MY_CLUSTER has not been deleted -``` - -* To deactivate all interactive prompts when running cli commands (helpful for scripting purposes) the CLI should support a --yes or -y, option - -Example - -```txt -tanzu cluster delete MY_CLUSTER --yes -``` - -### Confirmation feedback - -When executing a command, repeat back the command and context to the user. - -Example - -```txt -$ tanzu app create NAME -Creating app NAME in namespace NAMESPACE as user USERNAME -``` - -or - -```txt -$ tanzu app create NAME -Creating app NAME using context KUBECONFIG-CONTEXT-NAME -``` - -### Progress reporting - -For long running processes, don't go for a long period without output to the user. Outputting something like ’Processing…’, or a spinner can go a long way towards reassuring the user that their command went through. - -### Warnings - -In the confirmation feedback, include a notice for experimental or beta commands. - -Example - -```txt -“Warning: This is a EXPERIMENTAL command and may change without notice.” -“Warning: This is a BETA command and may change without notice.” -``` - ------------------------------- - -## Designing outputs - -### stdout - -* Primary output for both human and machine users. - -### stderr - -* Output for messages, warnings, errors. -* Stderr output is shown to the user, but not included when piping commands together. - -### Exit codes - -* When a command succeeds without error, the process should exit with code. -* When a command fails for any reason (invalid flags, failed API request, etc.), the process should exit with code. -* When a multi-step command fails at any step, the process should exit with code. -* When an operation is meant to be idempotent (like creating a resource that already exists, or deleting a resource that’s already been deleted), the process should exit with code. - -### Feedback when a process completes - -#### For asynchronous commands - -* Exit 0 - the command was successful issued AND -* Return a line telling the user how to check status of the command - -#### For synchronous commands - -* Feedback could be an error message with exit code 1 OR -* Confirmation of completion (i.e. “OK”, “done”) with exit code 0 - -### Tables - -* Tables are the default output format for list commands -* Column headers are upper case -* Columns are separated by three spaces from the longest key/value -* If there aren’t any values for a column, the column heading should be displayed and values left empty - don’t conditionally remove or hide a column -* If there are no values for a table, the table is replaced with a message, like ‘No apps found’ - -Example - -```txt -NAME STATUS CPU MEM NAMESPACE WORKSPACE -calculator-app running 53% 18% mortgage-calc-dev -calculator-bpp running 93% 21% mortgage-calc-test -calculator-cpp running 23% 77% mortgage-calc -``` - -### Time format - -The Tanzu CLI, like kubectl uses the ISO 8601 standard for date and time - -* Compact, consistent width, app/server's timezone - -Example - -```txt -2021-03-02T15:43:12.41-0700 -``` - -### Key:value pairs - -* Key and value always lowercase -* Key followed by a colon (:) -* Values left-aligned -* Value column separated by three spaces from the longest key -* If no value for a key, key is displayed, value left empty - -Example - -```txt -name: mortgage-calculator-app -namespace: mortgage-cal-dev -workspace: mort-calc-dev -status: -url: http://myapplicationurl.com -``` - -### Color - -* Color is helpful to highlight important information or to convey status, however it should be an enhancement to the text, and not be relied on as the sole source of a given bit of information because it can be deactivated in a user's terminal or may not be accessible to automation or screenreaders. Making status text red when it says `not ready` is ok because without the red, the status can still be determined. If, for example, the name of the resource was made red when not-ready it would not be possible to know the state of the resource if color was deactivated. -* Colors can be deactivated using an environment variable (NO_COLOR=TRUE) -* Colors are always deactivated when the session is not a TTY session. This allows for the piping of CLI output into other commands (e.g. grep) or machine reading without including stray color characters (pending issue #369) -* Usage tips are always in plain text, even when referencing text that might normally be colorized - -![Example of help output demonstrating the use of plain text](example-images/usage-tips.png) - -#### Don't add color to anything outside of the following conventions to convey contex - -* Red = warning, danger - - The word 'Warning:' or 'Error:' is colorized and bold, the *message* is plain text - -![Example of warning and error notice text colorized red](example-images/error-warn.png) -![Example of warning and error text in a data table colorized red](example-images/table-text.png) - -* Green = success, informational - - Confirmation of completion when a command runs is colorized and bold. - -![Example of success output with the word OK colorized green](example-images/success.png) - -* Cyan = stability, calm, informationa - -In command feedback: resources, and user name is colorized and bold. - -Interactive prompting: user input is colorized, as is the preceding question mark. - -![Example of command feedback confirming an action with the resources colorized cyan ](example-images/feedback.png) - -![Example of interactive prompting with the user entered text colorized cyan](example-images/prompting.png) - -### Animation - -* Deactivate if stdout is not an interactive terminal - * The component library can provide this check - -### Symbols / Emojis - -* Currently no standards or guidance -* Recommendation is to discuss plans for emoji/symbol use with SIG -* Deactivate if stdout is not an interactive terminal - * The component library can provide this check - -### Components - Output - -* Available for plugins written in golang - - CLI commands should utilize the plugin component library in pkg/cli/component for interactive features like prompts or table printing. - - Available output components - - * Table - ------------------------------- - -## Designing help text - -Commands will display help if passed -h, --help, or if no options are passed and a command expects them. - -### The help text can provide a support path for feedback and issues - -* A github link or website URL in the top level help encourage user feedback - -Example - -```txt -$tanzu package -h -Tanzu package management -Additional documentation is available at https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/1.3/vmware-tanzu-kubernetes-grid-13/GUID-tanzu-cli-reference.html -... -Flags: - -h, --help help for package - --log-file string Log file path -``` - -### All commands and flags should have description text - -* If possible, the text should fit on an 80 character wide screen, to prevent word wrap that makes it harder to read. -* Description text begins with a capital letter and does not end with a period -Example - -```txt -Available command groups: - Build - apps Applications on Kubernetes - - Manage - integration Get available integrations and their information from registry - - Run - cluster Kubernetes cluster operations - kubernetes-release Kubernetes release operations - management-cluster Kubernetes management cluster operations - package Tanzu package management -``` - -### Any complex command should have examples demonstrating its functionality - -Example - -```txt -$ tanzu login -h -# Login to TKG management cluster using endpoint - tanzu login --endpoint "https://login.example.com" --name mgmt-cluster - -# Login to TKG management cluster by using kubeconfig path and context for the management cluster - tanzu login --kubeconfig path/to/kubeconfig --context path/to/context --name mgmt-cluster - -# Login to an existing server - tanzu login --server mgmt-cluster -``` - ------------------------------- - -## Designing error and warning text - -Use output warnings sparingly. When used often they can create a lot of noise and users may learn to ignore them - -Try to write clear and concise errors, which tell the user what action (if any) must be taken. Ideally users won’t have to ask for help or check documentation to recover - -Make errors informative. A great error message should contain the following - -* Error code / Error title, if applicable -* Error description - what happened -* How to fix the error -* URL to documentation for user’s specific error, if applicable - -Example - -```sh -$ myapp dump -o myfile.out -Error: EPERM - Invalid permissions on myfile.out -Cannot write to myfile.out, file does not have write permissions -Fix with: chmod +w myfile.out -https://github.com/tanzu/core/help/2323 -``` - -```sh -$ tanzu namespace get EXAMPLE -Error: Namespace EXAMPLE not found. Try 'tanzu namespace list' to see available options -``` - -Use context in error messages to ease recovery - -* If a parameter is invalid or missing, it is a chance to be helpful by telling the user exactly what they missed - - ```sh - EXAMPLE “You forgot to enter the --name, apps in this namespace include App1, App2, etc...” - ``` - -Make it easy to submit bug reports and feedback - -* Consider including a github URL, or link to a form in error or help text -* If possible pre-populate form information to make the report as useful while not burdening the user - ------------------------------- - -### Plugins - -For information about developing plugins, see the [Plugin Guide](https://github.com/vmware-tanzu/tanzu-framework/blob/main/cli/core/docs/cli/plugin_implementation_guide.md) - -### Contributions to the Style Guide - -A styleguide is never done, and should change to meet the changing needs -To propose changes please create an issue, and add it to the CLI SIG agenda to discuss - ------------------------------- - -### Precedent - -Olympus Design System -PKS styleguide -cf-cli styleguide - -### Accessibility Guidelines - -* Web Content Accessibility Guidelines [WCAG](https://www.w3.org/TR/2008/REC-WCAG20-20081211/) -* US section 508 [link](https://www.section508.gov/) diff --git a/cli/core/docs/design/README.md b/cli/core/docs/design/README.md deleted file mode 100644 index d8da8567ea..0000000000 --- a/cli/core/docs/design/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Design Proposals - -This directory is to be populated with design reviews. - -Use the [Proposal Template](../../../../docs/dev/_proposal.md) as a starting point. - -The proposal should be documented as a separated markdown in this directory via PR. - -The name should follow the name pattern `-design.md`, -e.g: `restore-hooks-design.md`. diff --git a/cli/core/docs/design/context-aware-plugin-discovery-design.md b/cli/core/docs/design/context-aware-plugin-discovery-design.md deleted file mode 100644 index dfedfff696..0000000000 --- a/cli/core/docs/design/context-aware-plugin-discovery-design.md +++ /dev/null @@ -1,589 +0,0 @@ -# Contexts, Targets and Plugin Discovery - -## Abstract - -The Tanzu CLI is an amalgamation of all the Tanzu infrastructure elements under one unified core CLI experience. The core CLI supports a plugin model where the developers of different Tanzu services (bundled or SaaS) can distribute plugins that target functionalities of the services they own. When users switch between different services via the CLI context, we want to surface only the relevant plugins for the given context for a crisp user experience. - -## Key Concepts - -- CLI - The Tanzu command line interface, built to be pluggable. -- Service - Any tanzu service, user-managed or SaaS. E.g., TKG, TCE, TMC, etc -- Server - An instance of service. E.g., A single TKG management-cluster, a specific TMC endpoint, etc. -- Context - an isolated scope of relevant client-side configurations for a combination of user identity and server identity. There can be multiple contexts for the same combination of {user, server}. This is currently referred to as `Server` in the Tanzu CLI, which can also mean an instance of a service. Hence, we shall use `Context` to avoid confusion. -- Target - a top level entity used to make the control plane, that a user is interacting against, more explicit in command invocations. -- Plugin - A scoped piece of functionality that can be used to extend the CLI. Usually refers to a single binary that is invoked by the root Tanzu CLI. -- Scope - the context association level of a plugin -- standalone - independent of the CLI context -- Context-scoped - scoped to one or more contexts -- Discovery - the interface to fetch the list of available plugins and their supported versions -- Distribution - the interface to deliver a plugin for user download -- Scheme - the specific mechanism to discover or download a plugin -- Discovery Scheme - e.g., REST API, CLIPlugin kubernetes API, manifest YAML -- Distribution Scheme - e.g., OCI image, Google Cloud Storage, S3 -- Discovery Source - the source server of a plugin metadata for discovery, e.g., a REST API server, a management cluster, a local manifest file, OCI compliant image containing manifest file -- Distribution Repository - the repository of plugin binary for distribution, e.g., an OCI compliant image registry, Google Cloud Storage, an S3 compatible object storage server -- Plugin Descriptor - the metadata about a single plugin version that is installed locally and is used by the core to construct a sub-command under `tanzu` - -## Background and Motivation - -### Version Compatibility - -When a user is working with multiple instances of a product, we want to automatically select the right set of plugins and plugin versions for use with the instance they’ve connected to. Concretely, using two versions of a product shouldn’t require multiple “installations” of the Tanzu CLI. - -### Feature Availability - -As more services start adopting the Tanzu CLI for distributing their CLI, the number of available plugins becomes large and creates clutter. We want to make it seamless for the users to understand which plugins (features) are available when they are using a given context on the Tanzu CLI. Also, for some services, some of the features can be gated behind user SKU or feature flags. - -### Name Conflicts - -The same plugin/command could be available for different control planes; TMC, TKG, TSM, and more, with different APIs and different capabilities. This creates conflicts in plugin names across control planes. Example: TCE, TKG and TMC have their own version of the cluster plugin for cluster life cycle operations but targeting different APIs and endpoints. In some cases even different versions of the same service could require different versions of the same plugin. - -## Goals - -As a plugin developer I want to, - -- Advertise plugins relevant to my Tanzu service instance (server version, features activated, etc.) and to the user identity (privilege level, organization, SKU, etc.). This needs the user to log in to a server. -- Advertise plugins that are agnostic to any server (client-only plugins or standalone plugin). These plugins can be used with/without logging in. -- Mark some plugins as required for interaction with a server by the Tanzu CLI (e.g., cluster plugin) -- Deprecate older plugins which are not supported anymore -- Advertise a recommended version (well tested and recent, but not necessarily the latest) for each plugin -- Maintain support for older plugin versions which still work with the server or alternatively deprecate older plugin versions which are not supported anymore -- Advertise plugin versions which might have a newer UX or preview/untested features, which users would need to deliberately upgrade to -- Install development plugins to a context or standalone for testing purposes -- Communicate that I expect a package to support a range of plugin versions, inclusive of new patch releases of the plugin -- Support OCI image based distribution format - -As a user I want to, - -- Install the recommended version of all required plugins for the current context during login -- Install the recommended version of any missing required plugin for the current context via a sync command -- Upgrade all installed plugins to newer versions via a sync command, if the installed versions are not supported anymore -- Be prompted or get a warning when upgrading to a plugin version that breaks the old UX -- Avoid re-downloading a plugin version if already present (e.g., if the same version of package plugin is provided by two management clusters, do not re-download it) - -## Non Goals - -As a developer I want to, - -- Specify dependencies between plugins -- Design nested plugins -- Force upgrade deprecated/unsupported plugins for all users of the system that I operate via some policy. Essentially, override the ability of users to skip upgrades. -- Mandate that only signed binaries are consumed by the users - -## Requirements - -- Generic interface in tanzu-framework to discover and download plugins either standalone or for the current context -- Sophisticated version constraints that can be enforced from the server side -- Unified plugin object schema for discovery and distribution that can be easily adopted by different services -- Local index of all installed plugins with the ability to differentiate between different versions and sources for similar plugins -- Context to plugins mapping in addition to standalone plugins set -- A plugin sync command which can both install new plugins and upgrade installed plugins based on the context - -## High-Level Design - -![design](./images/context-aware-plugin-discovery-design.png) - -## Detailed Design - -### Plugin Discovery - -Discovery is the interface to fetch the list of available plugins, their supported versions and how to download them either standalone or scoped to a server. E.g., the CLIPlugin API in a management cluster, a similar REST API in TMC, a manifest file in GCP, etc. Unsupported plugins and plugin versions are not returned by the interface. Having a separate interface for discovery helps to decouple discovery (which is usually tied to a server or user identity) from distribution (which can be shared). For MVP, the discovery interface will use the same authentication configuration as the server to fetch relevant plugins by server and user identity. In future, this can be made configurable. - -On initialization, the tanzu CLI provides a default standalone discovery source without any authentication for all client-only plugins like login, builder, and codegen. On login, every server type (management cluster or global control plane) provides a default context-scoped discovery source. In future, there can be multiple sources of discovery each with its own authentication configuration under the same context. These can be combined into one logical source via a multi-source discovery implementation similar to the current multi-repo object. - -```go -// Discovery is an interface to fetch the list of available plugins. -type Discovery interface { - // Name of the repository. - Name() string - // List available plugins. - List() ([]plugin.Discovered, error) - // Describe a plugin. - Describe(name string) (plugin.Discovered, error) - // Type returns type of discovery. - Type() string -} -``` - -### Distribution - -Distribution is the interface to download a plugin version binary for a given OS and architecture combination. E.g., a local file-system, an OCI compliant image repository, etc. In most cases plugin discovery usually happens via a Tanzu service and distribution usually happens via some third party artifact repository service. So, having the separation in the interface only feels natural. It also provides the following advantages, - -- Can distribute the same set of plugins via different mechanisms either for redundancy or for location preferences -- Ability to separate the security concerns of the discovery mechanism from that of the distribution mechanism - -The specific distribution mechanism of a plugin shall be provided by the discovery source. This allows different discovery sources to distribute their plugins as they see fit. - -```go -// Distribution is an interface to download a single plugin binary. -type Distribution interface { - // Fetch the binary for a plugin version. - Fetch(version, os, arch string) ([]byte, error) - // GetDigest returns the SHA256 hash of the binary for a plugin version. - GetDigest(version, os, arch string) (string, error) -} -``` - -### Available Plugin - -Combining all the above components together, the plugin object returned by the discovery interface is defined as below. Also, for service owners to distribute plugins that other plugins depend on for multiple use cases we add a flag to mark a plugin as required. Plugins marked required shall be downloaded by default when logging in to a server. - -```go -// Discovered defines discovered plugin resource -type Discovered struct { - // Description is the plugin's description. - Name string - - // Description is the plugin's description. - Description string - - // RecommendedVersion is the version that Tanzu CLI should use if available. - // The value should be a valid semantic version as defined in - // https://semver.org/. E.g., 2.0.1 - RecommendedVersion string - - // SupportedVersions determines the list of supported CLI plugin versions. - // The values are sorted in the semver prescribed order as defined in - // https://github.com/Masterminds/semver#sorting-semantic-versions. - SupportedVersions []string - - // Distribution is an interface to download a single plugin binary. - Distribution distribution.Distribution - - // Optional specifies whether the plugin is mandatory or optional - // If optional, the plugin will not get auto-downloaded as part of - // `tanzu login` or `tanzu plugin sync` command - // To view the list of plugin, user can use `tanzu plugin list` and - // to download a specific plugin run, `tanzu plugin install ` - Optional bool - - // Scope is the context association level of the plugin. - Scope string - - // Source is the name of the discovery source from where the plugin was - // discovered. - Source string - - // ServerName is the name of the server from where the plugin was discovered. - ServerName string - - // DiscoveryType defines the type of the discovery. Possible values are - // oci, local or kubernetes - DiscoveryType string - - // Target defines the target to which this plugin is applicable to - Target cliv1alpha1.Target - - // Status is the installed/uninstalled status of the plugin. - Status string -} -``` - -### Installation Directory Structure - -The plugin installations shall be organized similar to the structure of the Golang modules cache. -The installation path is, ${InstallationRoot}/${PluginName}/${Version}_${sha256}_${target}. This has the following advantages, - -- Local or development plugins can be handled similar to downloaded ones because the digest shall be different. -- In case a plugin image is copied to a new repository, the binary need not be re-downloaded, since the digest will be the same. -- Easy to look-up all the installed versions for a given plugin. - - A sample installation tree can be found below. - -```sh -$ tree $HOME/Library/ApplicationSupport/tanzu-cli/ - -/Users/anujc/Library/ApplicationSupport/tanzu-cli/ -├── builder -│ ├── dev_6682658a8c08dc2c6228d74cd6cca9e3e539d32c8a00a7a33ea15f6bdeb3ded2_ -│ └── v1.4.0__ -├── cluster -│ ├── v0.3.1_e9af6d713c611128dce411dd44541a95a73688592edb6eba2f4ecff7c7a7ca97_k8s -│ ├── v1.3.1_a9af6d713c611128dce411dd44541a95a73688592edb6eba2f4ecff7c7a7ca97_k8s -│ └── v1.4.0_b9af6d713c611128dce411dd44541a95a73688592edb6eba2f4ecff7c7a7ca97_tmc -├── login -│ └── v1.3.1_c9af6d713c611128dce411dd44541a95a73688592edb6eba2f4ecff7c7a7ca97_ -├── management-cluster -│ └── v0.3.2_d9af6d713c611128dce411dd44541a95a73688592edb6eba2f4ecff7c7a7ca97_k8s -└── package - ├── v1.4.0_f9af6d713c611128dce411dd44541a95a73688592edb6eba2f4ecff7c7a7ca97_k8s - └── v0.4.1-pre_g9af6d713c611128dce411dd44541a95a73688592edb6eba2f4ecff7c7a7ca97_k8s -``` - -### Installed Plugin - -The metadata (description, version, buildSHA, documentation URL, etc.) about an installed plugin version is maintained in the PluginDescriptor object. This information is needed to create a sub-command under the root tanzu command and this object is already present. To uniquely identify an installation we need the binary digest and the relative path of the plugin version under the installation root. - -```go -// PluginDescriptor describes an installed plugin binary. -type PluginDescriptor struct { - ... - // Digest is the SHA256 hash of the plugin binary. - Digest string `json:"digest"` - // Relative installation path of a plugin to uniquely identify an installation. - // E.g., management-cluster/v0.3.2@sha256:... - InstallationPath string `json:"installationPath"` - ... -} -``` - -### Context-mapping - -The plugin descriptors are stored in the catalog cache, ${HOME}/.cache/tanzu/catalog.yaml, which is looked up on invocation of every tanzu CLI command. -Catalog contains following information for the installed plugins. - -- Index the installations by path to easily look up the PluginDescriptors -- Map the set of relevant plugin installations to a specific context or to be standalone to display only available plugins for a context (in case of a name conflict between standalone and context-scoped plugins the context-scoped plugin takes precedence) - -Note: Similar to the go modules we propose to set only read and executable permissions on the installations to discourage the user from deleting an installation which can break the index. - -```go -// PluginAssociation is a set of plugin names-target and their associated installation paths. -type PluginAssociation map[string]string - -// Catalog denotes a collection of installed Tanzu CLI plugins. -type Catalog struct { - ... - // IndexByPath of PluginDescriptors for all installed plugins by installation path. - IndexByPath map[string]PluginDescriptor `json:"indexByPath,omitempty"` - // IndeByName of all plugin installation paths by name. - IndexByName map[string][]string `json:"indexByName,omitempty"` - // StandAlonePlugins is a set of standalone plugin installations. - StandAlonePlugins PluginAssociation `json:"standAlonePlugins,omitempty"` - // ServerPlugins links a server and a set of associated plugin installations. - ServerPlugins map[string]PluginAssociation `json:"serverPlugins,omitempty"` -} -``` - -### Sync Command - -The existing plugin install and plugin upgrade commands operate only on single plugins. We propose to add a new plugin sync command that combines the behavior of install and upgrade, and also handles multiple plugins within a context. For MVP, it only installs the recommended version of required plugins for the context. Also, while upgrading it only upgrades if the installed version is not supported anymore and by default picks the recommended version. In future, which plugins to install/upgrade and which target version to pick shall be configurable. - -```sh -$ tanzu plugin sync -h -Synchronize the plugins for the current context - -Usage: -tanzu plugin sync [flags] - -Flags: - -h, --help help for install - -``` - -Internally, the same logic is called from the login command implicitly. - -1. All the plugin sync scenarios (explicit and implicit) involve the following general flow. -1. List available plugins through the discovery interface -1. Select new plugins for installation based on some criteria (only required plugins for MVP) and select installed plugins for upgrade based on some criteria (only plugins with unsupported versions) -1. Select a version based on some criteria (only recommended version for MVP) -1. For upgrades, prompt the user for confirmation if any of the selected versions has a newer major version than the installed version -1. Download the selected plugin versions, if not already present, to the installation root directory in the relative path provided by the distribution interface -1. Update the plugin installation index and the context association map in the catalog cache with the new plugin descriptors - -## User workflows - -### Setup - -Download and install the Tanzu CLI - -```sh -install tanzu/cli/core/v0.8.0/tanzu-core-darwin_amd64 /usr/local/bin/tanzu -``` - -This will initialize the tanzu configuration file with the default discovery config for standalone plugins. - -```sh -$ tanzu plugin source list - NAME TYPE SCOPE - default OCI standalone -``` - -Plugin list will display plugins from the default discovery source. - -```sh -$ tanzu plugin list - NAME DESCRIPTION SCOPE DISCOVERY TARGET VERSION STATUS - login Login to the platform Standalone default v0.11.0-dev not installed - management-cluster Kubernetes management-cluster operations Standalone default k8s v0.11.0-dev not installed - package Tanzu package management Standalone default k8s v0.11.0-dev not installed - pinniped-auth Pinniped authentication operations (usually not directly invoked) Standalone default v0.11.0-dev not installed - secret Tanzu secret management Standalone default k8s v0.11.0-dev not installed -``` - -Run sync command to download the latest version of all plugins - -```sh -$ tanzu plugin sync -Checking for required plugins ... -Installing plugin 'login' ... -Installing plugin 'management-cluster' ... -Installing plugin 'package' ... -Installing plugin 'secret' ... - -✓ Done -``` - -```sh -$ tanzu plugin list - NAME DESCRIPTION SCOPE DISCOVERY TARGET VERSION STATUS - login Login to the platform Standalone default v0.11.0-dev installed - management-cluster Kubernetes management-cluster operations Standalone default k8s v0.11.0-dev installed - package Tanzu package management Standalone default k8s v0.11.0-dev installed - secret Tanzu secret management Standalone default k8s v0.11.0-dev installed -``` - -### Context Creation - -#### With new install - -Creating a new context will discover all available plugins from the context and will download them. - -```sh -tanzu login --kubeconfig path/to/kubeconfig --context context-name --name vsphere-mc-1 -# or -$ tanzu context create --kubeconfig path/to/kubeconfig --kubecontext context-name --name vsphere-mc-1 -✓ Successfully logged into the management cluster vsphere-mc-1 - -Checking for required plugins ... -Downloading plugin 'cluster' ... -Downloading plugin 'kubernetes-release' ... - -✓ Done -``` - -`tanzu plugin list` will display all standalone plugins as well as context-scoped plugins from all active contexts. -There can be one active context per target. - -Assume below configuration as part of the config file where there is one active context for both the supported targets. -`tanzu plugin list` should discover and show plugins from both the contexts. - -```yaml -currentContext: - kubernetes: vsphere-mc-1 - mission-control: tmc-unstable -``` - -```sh -$ tanzu plugin list - NAME DESCRIPTION SCOPE DISCOVERY TARGET VERSION STATUS - cluster Kubernetes cluster operations Context default-vsphere-mc-1 k8s v0.11.0-dev installed - kubernetes-release Kubernetes release operations Context default-vsphere-mc-1 k8s v0.11.0-dev installed - login Login to the platform Standalone default v0.11.0-dev installed - management-cluster Kubernetes management-cluster operations Standalone default k8s v0.11.0-dev installed - package Tanzu package management Standalone default k8s v0.11.0-dev installed - secret Tanzu secret management Standalone default k8s v0.11.0-dev installed - iam Identity management operations Context default-tmc-unstable tmc v0.1.0 installed -``` - -#### No new install - -Creating a new similar context will discover all available plugins from new context and will download them that are not already installed. - -```sh -tanzu login --kubeconfig path/to/kubeconfig --context context-name --name vsphere-mc-2 -# or -$ tanzu context create --kubeconfig path/to/kubeconfig --kubecontext context-name --name vsphere-mc-2 -✓ Successfully logged into the management cluster vsphere-mc-2 - -Checking for required plugins ... -All required plugins are already installed. - -✓ Done -``` - -### Plugin Sync - -Explicitly calling the plugin sync command will discover and download new required plugins within the context of a server. It will also upgrade installed plugin versions which are not supported anymore to newer versions. - -#### No new install or upgrade - -```sh -$ tanzu plugin sync -Checking for required plugins ... -All required plugins are already installed. - -Checking for outdated plugin versions ... -All installed plugins are up-to-date. - -✓ Done -``` - -#### With new install & upgrade - -When a new or existing plugin is marked as required it gets downloaded on sync, if not already present. When the installed version is not present in the supported versions list it gets upgraded to the recommended version. If the recommended version has a newer major version than the installed version, the user is prompted for confirmation. - -```sh -$ tanzu plugin sync -Checking for required plugins ... -Installing plugin 'login' ... - -Checking for outdated plugin versions ... -? Some of the installed plugins (cluster) need to be updated to a new version. Do you want to continue [y/N]? y -Downloading ‘cluster’ plugin ... - -✓ Done -``` - -```sh -$ tanzu plugin list - NAME DESCRIPTION SCOPE DISCOVERY TARGET VERSION STATUS - cluster Kubernetes cluster operations Context default-vsphere-mc-1 k8s v0.11.0-dev installed - kubernetes-release Kubernetes release operations Context default-vsphere-mc-1 k8s v0.11.0-dev installed - login Login to the platform Standalone default v0.11.0-dev installed - management-cluster Kubernetes management-cluster operations Standalone default k8s v0.11.0-dev installed - package Tanzu package management Standalone default k8s v0.11.0-dev installed - pinniped-auth Pinniped authentication operations (usually not directly invoked) Standalone default v0.11.0-dev installed - secret Tanzu secret management Standalone default k8s v0.11.0-dev installed - iam Identity management operations Context default-tmc-unstable tmc v0.1.0 installed -``` - -### Development Plugins - -Installing development plugins copies the plugin binary to the installation directory under the appropriate directory for local distribution. For development purpose we will be utilizing 'local' discovery and distribution interface implementation. This will allow developers to install their development plugins as a standalone plugins. If Tanzu CLI is built with default standalone discovery type as 'local', this local standalone discovery will have higher precedence than plugin discovery returned by the management cluster itself. Tanzu CLI with 'local' default standalone discovery should only be used for development purposes and not for the production usecase. - -### Installing Plugins from Local Source - -Generally we expect most of the users to install the plugins from the default OCI based discovery mechanism. However tanzu CLI handles another way of installing plugins by downloading `tar.gz` files for the plugins and using that to list and install available plugins. - -To install the plugin with local source, download the plugin `tar.gz` from the release artifacts for your distribution and untar it to a location on your local machine. You can use the directory where the `tar.gz` has been extracted with the `tanzu plugin list --local` and `tanzu plugin install --local` command as mentioned below. - -- List the plugins without `--local`: Lists all available default plugins from the default OCI registry - - ```sh - $ tanzu plugin list - NAME DESCRIPTION SCOPE DISCOVERY TARGET VERSION STATUS - login Login to the platform Standalone default v0.13.0-dev not installed - management-cluster Kubernetes management-cluster operations Standalone default k8s v0.13.0-dev not installed - package Tanzu package management Standalone default k8s v0.13.0-dev not installed - pinniped-auth Pinniped authentication operations (usually not directly invoked) Standalone default v0.13.0-dev not installed - secret Tanzu secret management Standalone default k8s v0.13.0-dev not installed - ``` - -- List the plugins with `--local` pointing to local plugin directory: Lists only available plugins from given local file path - - ```sh - $ tanzu plugin list --local /tmp/admin/tanzu-plugins/ - NAME DESCRIPTION SCOPE DISCOVERY TARGET VERSION STATUS - builder Build Tanzu components Standalone v0.13.0-dev not installed - codegen Tanzu code generation tool Standalone v0.13.0-dev not installed - test Test the CLI Standalone v0.13.0-dev not installed - ``` - -- Install plugins `--local` flag: Only installs plugins from given local file path and doesn't install plugins from default OCI registry - - ```sh - $ tanzu plugin install all --local /tmp/admin/tanzu-plugins/ - Installing plugin 'builder:v0.13.0-dev' - Installing plugin 'codegen:v0.13.0-dev' - Installing plugin 'test:v0.13.0-dev' - Successfully installed all plugins - ✔ successfully installed 'all' plugin - ``` - -- List all installed plugins: Plugins installed with `tanzu plugin install all --local /tmp/admin/tanzu-plugins/` will not display `DISCOVERY` information, but will be listed as part of `list` command output - - ```sh - $ tanzu plugin list - NAME DESCRIPTION SCOPE DISCOVERY TARGET VERSION STATUS - login Login to the platform Standalone default v0.13.0-dev not installed - management-cluster Kubernetes management-cluster operations Standalone default k8s v0.13.0-dev not installed - package Tanzu package management Standalone default k8s v0.13.0-dev not installed - pinniped-auth Pinniped authentication operations (usually not directly invoked) Standalone default v0.13.0-dev not installed - secret Tanzu secret management Standalone default k8s v0.13.0-dev not installed - builder Build Tanzu components Standalone v0.13.0-dev installed - codegen Tanzu code generation tool Standalone v0.13.0-dev installed - test Test the CLI Standalone v0.13.0-dev installed - ``` - -- List plugins with `--local` that are discovered with default discovery. Let's assume `/tmp/default-package-secret/tanzu-plugins/` contains `package` and `secret` plugins - - ```sh - $ tanzu plugin list --local /tmp/default-package-secret/tanzu-plugins/ - NAME DESCRIPTION SCOPE DISCOVERY VERSION STATUS - package Tanzu package management Standalone v0.12.0-dev not installed - secret Tanzu secret management Standalone v0.13.0-dev not installed - ``` - -- Install plugins with `--local` that are discovered with default discovery - - ```sh - $ tanzu plugin install all --local /tmp/default-package-secret/tanzu-plugins/ - Installing plugin 'package:v0.12.0-dev' - Installing plugin 'secret:v0.13.0-dev' - Successfully installed all plugins - ✔ successfully installed 'all' plugin - ``` - -- List all installed plugins: As `package` and `secret` plugins can also be discovered with default discovery it will be displayed as `installed` with discovery information mentioned. Status of `package` plugin should list `update available` as the installed version is `v0.12.0-dev` but version `v0.13.0-dev` is discovered from the default discovery. -- Note: When the plugin is installed (even if the update is available) the `VERSION` field will show installed version of the plugin. When plugin is not installed, `VERSION` field will show discovered recommended version for the plugin. - - ```sh - $ tanzu plugin list - NAME DESCRIPTION SCOPE DISCOVERY TARGET VERSION STATUS - login Login to the platform Standalone default v0.13.0-dev not installed - management-cluster Kubernetes management-cluster operations Standalone default k8s v0.13.0-dev not installed - package Tanzu package management Standalone default k8s v0.12.0-dev update available - pinniped-auth Pinniped authentication operations (usually not directly invoked) Standalone default v0.13.0-dev not installed - secret Tanzu secret management Standalone default k8s v0.13.0-dev installed - builder Build Tanzu components Standalone v0.13.0-dev installed - codegen Tanzu code generation tool Standalone v0.13.0-dev installed - test Test the CLI Standalone v0.13.0-dev installed - ``` - -- Running `tanzu plugin sync` will sync all the plugins that can be discovered with the discovery. In this case, `login`, `management-cluster`, `pinniped-auth` will get installed. `package` plugin will get updated to newly available version. `secret` plugin installation will be skipped as no new version is available. And `builder`, `codegen`, `test` plugins will not get considered with sync command as there is no `discovery` source associated with this plugins - - ```sh - $ tanzu plugin sync - Installing plugin 'login:v0.13.0-dev' - Installing plugin 'management-cluster:v0.13.0-dev' - Installing plugin 'package:v0.13.0-dev' - Installing plugin 'pinniped-auth:v0.13.0-dev' - Successfully installed all plugins - ✔ successfully installed 'all' plugin - ``` - -- Clean all installed plugins with `tanzu plugin clean` will delete all installed plugins - -- Listing plugin after deleting all plugin will not show locally installed plugins because those plugins did not had any `discovery` source associated with them - - ```sh - $ tanzu plugin list - NAME DESCRIPTION SCOPE DISCOVERY TARGET VERSION STATUS - login Login to the platform Standalone default v0.13.0-dev not installed - management-cluster Kubernetes management-cluster operations Standalone default k8s v0.13.0-dev not installed - package Tanzu package management Standalone default k8s v0.13.0-dev not installed - pinniped-auth Pinniped authentication operations (usually not directly invoked) Standalone default v0.13.0-dev not installed - secret Tanzu secret management Standalone default k8s v0.13.0-dev not installed - ``` - -### Image Repository Override for OCI distribution with K8s discovery - -- Allow registry override for installation of context-scoped plugins with `tanzu plugin install` or `tanzu plugin sync` when talking to management-cluster even if the CLIPlugin resources are pointing to different image registry. - -- This is supported for context-scoped plugins which are using OCI based distribution and are getting discovered using K8s discovery. - -- To do this type of override of image repository, admin needs to create a ConfigMap in `tanzu-cli-system` namespace with `cli.tanzu.vmware.com/cliplugin-image-repository-override: ""` label on the management cluster will following details: - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: context-plugin-repository-override - namespace: tanzu-cli-system - labels: - cli.tanzu.vmware.com/cliplugin-image-repository-override: "" -data: - imageRepoMap: |- - projects.registry.vmware.com/tkg: private.custom.repo.com/tkg -``` - -- Also make sure that all logged in users have permission to read this ConfigMap. - -- Tanzu CLI will read this ConfigMap and while downloading context-scoped plugins it can update the image repository references accordingly. - -## Open Issues - -Below mentioned issue track all work related to API-driven plugin discovery and context aware tanzu cli: - -- [API-driven discovery of CLI plugins](https://github.com/vmware-tanzu/tanzu-framework/issues/74) diff --git a/cli/core/docs/design/images/context-aware-plugin-discovery-design.png b/cli/core/docs/design/images/context-aware-plugin-discovery-design.png deleted file mode 100644 index 2d10269cdd..0000000000 Binary files a/cli/core/docs/design/images/context-aware-plugin-discovery-design.png and /dev/null differ diff --git a/cli/core/go.mod b/cli/core/go.mod deleted file mode 100644 index 8d2bd62155..0000000000 --- a/cli/core/go.mod +++ /dev/null @@ -1,156 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/cli/core - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/run => ../../apis/run - github.com/vmware-tanzu/tanzu-framework/capabilities/client => ../../capabilities/client - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../runtime - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common => ../../pinniped-components/common -) - -require ( - cloud.google.com/go/storage v1.27.0 - github.com/AlecAivazis/survey/v2 v2.3.5 - github.com/Masterminds/semver v1.5.0 - github.com/adrg/xdg v0.4.0 - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/briandowns/spinner v1.19.0 - github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f - github.com/fatih/color v1.13.0 - github.com/golang-jwt/jwt v3.2.2+incompatible - github.com/google/gnostic v0.5.7-v3refs - github.com/google/go-containerregistry v0.7.0 - github.com/gorilla/mux v1.8.0 - github.com/imdario/mergo v0.3.12 - github.com/k14s/imgpkg v0.17.0 - github.com/k14s/kbld v0.32.0 - github.com/lithammer/dedent v1.1.0 - github.com/logrusorgru/aurora v2.0.3+incompatible - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - github.com/otiai10/copy v1.4.2 - github.com/pkg/errors v0.9.1 - github.com/spf13/cobra v1.5.0 - github.com/stretchr/testify v1.8.1 - github.com/tj/assert v0.0.3 - github.com/vmware-tanzu/carvel-ytt v0.40.0 - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common v0.0.0-00010101000000-000000000000 - go.uber.org/multierr v1.6.0 - golang.org/x/mod v0.8.0 - golang.org/x/oauth2 v0.3.0 - google.golang.org/api v0.102.0 - google.golang.org/grpc v1.50.1 - gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.24.2 - k8s.io/apimachinery v0.24.2 - k8s.io/client-go v0.24.2 - sigs.k8s.io/controller-runtime v0.12.3 - -) - -require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.6.0 // indirect - github.com/BurntSushi/toml v1.1.0 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.10.0 // indirect - github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e // indirect - github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v20.10.11+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.16+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/swag v0.21.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/hashicorp/go-version v1.4.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect - github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 // indirect - github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // 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/nxadm/tail v1.4.8 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec // indirect - github.com/vmware-tanzu/carvel-imgpkg v0.23.1 // indirect - github.com/vmware-tanzu/carvel-vendir v0.26.0 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/cluster-api v1.2.8 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/cli/core/go.sum b/cli/core/go.sum deleted file mode 100644 index 69bba09b04..0000000000 --- a/cli/core/go.sum +++ /dev/null @@ -1,1714 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/iam v0.6.0 h1:nsqQC88kT5Iwlm4MeNGTpfMWddp6NB/UOLFTH6m1QfQ= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/longrunning v0.1.1 h1:y50CXG4j0+qvEukslYFBCrzaXX0qpFbBzc3PchSu/LE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.10.0 h1:glqzafvxBBAMo+x2w2sdDjUDZeTqqLJmqZPY05qehCU= -github.com/containerd/stargz-snapshotter/estargz v0.10.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e h1:4AxO89dwbgA957M8DX5AV/KsOmxDyAB1BES0INY+A/0= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= -github.com/cppforlife/go-cli-ui v0.0.0-20200506005011-4268990983cc/go.mod h1:I0qrzCmuPWYI6kAOvkllYjaW2aovclWbJ96+v+YyHb0= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f h1:yVW0v4zDXzJo1i8G9G3vtvNpyzhvtLalO34BsN/K88E= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f/go.mod h1:L18TqO77ci8i+hFtlMC4zSFz/D3O8lf84TyVU+zFF8E= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc= -github.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.16+incompatible h1:2Db6ZR/+FUR3hqPMwnogOPHFn405crbpxvWzKovETOQ= -github.com/docker/docker v20.10.16+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -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/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.7.0 h1:u0onUUOcyoCDHEiJoyR1R1gx5er1+r06V5DBhUU5ndk= -github.com/google/go-containerregistry v0.7.0/go.mod h1:2zaoelrL0d08gGbpdP3LqyUuBmhWbpD6IOe2s9nLS2k= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= -github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hpcloud/tail v1.0.1-0.20180514194441-a1dbeea552b7/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57 h1:CwBRArr+BWBopnUJhDjJw86rPL/jGbEjfHWKzTasSqE= -github.com/k14s/imgpkg v0.17.0 h1:l1HqYtjecqx7iYecJUvxQQYdo3WubCahHQ30lh0p9sU= -github.com/k14s/imgpkg v0.17.0/go.mod h1:xYZ7gQxYP3O35vGIXcYchDEHq0xA81FOheCp8Vlq5ko= -github.com/k14s/kbld v0.32.0 h1:zf3qCir0usz7rX6JRF97QxaZ25+13EniE7z+ll0xaZ8= -github.com/k14s/kbld v0.32.0/go.mod h1:N7Ij72ZhJ2B7kTUxavGTBT1YymIfmAeO6JKyNbtja1g= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 h1:wKSifC/VbCaQMqXYn6/gSFqle82OX4bE3KYALDU9FlU= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115/go.mod h1:mGrnmO5qnhJIaSiwMo05cvRL6Ww9ccYbTgNFcm6RHZQ= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 h1:4bcRTTSx+LKSxMWibIwzHnDNmaN1x52oEpvnjCy+8vk= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368/go.mod h1:lKGj1op99m4GtQISxoD2t+K+WO/q2NzEPKvfXFQfbCA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -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 v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/otiai10/copy v1.4.2 h1:RTiz2sol3eoXPLF4o+YWqEybwfUa/Q2Nkc4ZIUs3fwI= -github.com/otiai10/copy v1.4.2/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.2 h1:VYWnrP5fXmz1MXvjuUvcBrXSjGE6xjON+axB/UrpO3E= -github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -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 v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1 h1:sUHDtnvcIMMcY/Pudym6DJ0kv7+uyMCAqQby0SLnQVs= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1/go.mod h1:2XNe+P0MDgya0FPEMOVZLAXku05VZhccVdDcXChhvy8= -github.com/vmware-tanzu/carvel-vendir v0.26.0 h1:Q98tPnH9WUAWE2vJSAP0lsHGsfwGjfW2y+JUOEiJ/Yk= -github.com/vmware-tanzu/carvel-vendir v0.26.0/go.mod h1:JcuNNVONFbZTbm/GjtGiWUfFrt17YBQzeGT9+gY1+yY= -github.com/vmware-tanzu/carvel-ytt v0.40.0 h1:WUWTtwvfqV9CN9v207oDt2xfhmuWHGwc4MMaXJAqIEE= -github.com/vmware-tanzu/carvel-ytt v0.40.0/go.mod h1:crDcKbS1GM4Q34puoVxdrajWOXrxjOxvUCwtsNV5Etc= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.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-20180730214132-a0f8a16cb08c/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211111162719-482062a4217b/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cli/core/hack/apt/README.md b/cli/core/hack/apt/README.md deleted file mode 100644 index f778e9f94c..0000000000 --- a/cli/core/hack/apt/README.md +++ /dev/null @@ -1,59 +0,0 @@ -# Using APT to install the Tanzu CLI - -APT uses Debian packages for installation. This document describes how to build such packages -for the Tanzu CLI, how to push them to a public repository and how to install the CLI from that repository. - -## Building the Debian package - -Executing the `hack/apt/build_package.sh` script will build the Debian packages under `cli/core/hack/apt/_output`. -The `hack/apt/build_package.sh` script is meant to be run on a Linux machine that has `apt` installed. -This can be done in docker. To facilitate this operation, the new `apt-package` Makefile target has been added -to `cli/core/Makefile`; this Makefile target will first start a docker container and then run the `hack/apt/build_package.sh` script. - -```bash -cd tanzu-framework/cli/core -make apt-package -``` - -Note that two packages will be built, one for AMD64 and one for ARM64. -Also, a repository will be generated as a directory called `_output/apt` which will contain the two -built packages. Please see the section on publishing the repository for more details. - -## Testing the installation of the Tanzu CLI locally - -We can install the Tanzu CLI using the newly built Debian repository locally on a Linux machine with `apt` installed -or using a docker container. For example: - -```bash -$ cd tanzu-framework -$ docker run --rm -it -v $(pwd)/cli/core/hack/apt/_output/apt:/tmp/apt ubuntu -echo "deb file:///tmp/apt jessie main" | tee /etc/apt/sources.list.d/tanzu.list -apt-get update --allow-insecure-repositories -apt install -y tanzu-cli --allow-unauthenticated -tanzu -``` - -Note that the repository isn't signed at the moment, so you may see warnings during installation. - -## Publishing the package to GCloud - -We have a GCloud bucket dedicated to hosting the Tanzu CLI OS packages. That bucket can be controlled from: -`https://console.cloud.google.com/storage/browser/tanzu-cli-os-packages`. - -To publish the repository containing the new debian packages for the Tanzu CLI, we must upload the entire `apt` -directory to the root of the bucket. You can do this manually. Once uploaded, the Tanzu CLI can be installed -publicly as described in the next section. - -## Installing the Tanzu CLI - -Currently, the repo is not signed but will be in the future; you may get warnings. -To install from an insecure repo: - -```bash -$ docker run --rm -it ubuntu -apt update -apt install -y ca-certificates -echo "deb https://storage.googleapis.com/tanzu-cli-os-packages/apt jessie main" | tee /etc/apt/sources.list.d/tanzu.list -apt update --allow-insecure-repositories -apt install -y tanzu-cli --allow-unauthenticated -``` diff --git a/cli/core/hack/apt/build_package.sh b/cli/core/hack/apt/build_package.sh deleted file mode 100755 index 17c99ab8a9..0000000000 --- a/cli/core/hack/apt/build_package.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -e - -if [ $(uname) != "Linux" ] || [ -z "$(command -v apt)" ]; then - echo "This script must be run on a Linux system that uses the APT package manager" - exit 1 -fi - -# VERSION should be set when calling this script -if [ -z "${VERSION}" ]; then - echo "\$VERSION must be set before calling this script" - exit 1 -fi - -# Strip 'v' prefix as an apt package version must start with an integer -VERSION=${VERSION#v} - -BASE_DIR=$(cd $(dirname "${BASH_SOURCE[0]}"); pwd) -OUTPUT_DIR=${BASE_DIR}/_output - -# Install build dependencies -apt-get update -apt-get install -y curl reprepro - -# Clean any old packages -rm -rf ${OUTPUT_DIR} - -# Prepare repository that will be published -mkdir -p ${OUTPUT_DIR}/apt/conf -echo "Codename: jessie -Components: main -Architectures: amd64 arm64" \ - > ${OUTPUT_DIR}/apt/conf/distributions - -# Download the SRP-compliant CLI build from github and copy it to the package directory -for arch in amd64 arm64; do - echo "====================================" - echo "Building debian package for $arch..." - echo "====================================" - - mkdir -p ${OUTPUT_DIR}/tanzu-cli_${VERSION}_linux_${arch}/usr/bin - - # For now, we don't have an ARM64 build, so we get the AMD64 one and use it for ARM64. - # This is for Apple M1 machines which normally have an emulator. - # TODO: Replace all instances of "amd64" with "${arch}" - curl -sLo tanzu-cli-linux-${arch}.tar.gz https://github.com/vmware-tanzu/tanzu-framework/releases/download/v${VERSION}/tanzu-cli-linux-amd64.tar.gz - - tar xzf tanzu-cli-linux-${arch}.tar.gz --strip-components=1 v${VERSION}/tanzu-core-linux_amd64 - mv tanzu-core-linux_amd64 ${OUTPUT_DIR}/tanzu-cli_${VERSION}_linux_${arch}/usr/bin/tanzu - -# Create the control file - mkdir -p ${OUTPUT_DIR}/tanzu-cli_${VERSION}_linux_${arch}/DEBIAN - echo "Package: tanzu-cli -Version: ${VERSION} -Maintainer: Tanzu CLI project team -Architecture: ${arch} -Section: main -Priority: optional -Homepage: https://github.com/vmware-tanzu/tanzu-cli/ -Description: The tanzu CLI" \ - > ${OUTPUT_DIR}/tanzu-cli_${VERSION}_linux_${arch}/DEBIAN/control - - # Create the .deb package - dpkg-deb --build -Zgzip ${OUTPUT_DIR}/tanzu-cli_${VERSION}_linux_${arch} - - # Create repository - reprepro -b ${OUTPUT_DIR}/apt includedeb jessie ${OUTPUT_DIR}/tanzu-cli_${VERSION}_linux_${arch}.deb - - # Cleanup - rm -f tanzu-cli-linux-${arch}.tar.gz - rm -f ${OUTPUT_DIR}/tanzu-cli_${VERSION}_linux_${arch}.deb - rm -rf ${OUTPUT_DIR}/tanzu-cli_${VERSION}_linux_${arch} -done diff --git a/cli/core/hack/choco/README.md b/cli/core/hack/choco/README.md deleted file mode 100644 index 57480215e4..0000000000 --- a/cli/core/hack/choco/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# Using Chocolatey to install the Tanzu CLI - -This document describes how to build a Chocolatey package for the Tanzu CLI and how to install it. - -## Building the Chocolatey package - -Executing the `hack/choco/build_package.sh` script will build the Chocolatey package under `cli/core/hack/choco/_output/choco`. -The `hack/choco/build_package.sh` script is meant to be run on a Linux machine that has `choco` installed. -This is most easily done using docker. Note that currently, the docker images for Chocolatey only support an -`amd64` architecture. To facilitate building the package, the new `choco-package` Makefile target has been added -to `cli/core/Makefile`; this Makefile target will first start a docker container and then run the `hack/choco/build_package.sh` -script. The `VERSION` environment variable must be set when running the make target. - -```bash -cd tanzu-framework/cli/core -VERSION=v0.26.0 make choco-package -``` - -### Content of Chocolatey package - -Currently, we build a Chocolatey package without including the actual Tanzu CLI binary. Instead, when the -package is installed, Chocolatey will download the CLI binary from Github. This has to do with distribution -rights as we will probably publish the Chocolatey package in the community package repository. - -## Installing the Tanzu CLI using the built Chocolatey package - -Installing the Tanzu CLI using the newly build Chocolatey package can be done on a Windows machine with `choco` -installed. First, the Chocolatey package must be uploaded to the Windows machine. - -For example, if we upload the package to the Windows machine under `$HOME\tanzu-cli.0.26.0.nupkg`, we can then simply do: - -```bash -choco install -f "$HOME\tanzu-cli.0.26.0.nupkg" -``` - -It is also possible to configure a local repository containing the local package: - -```bash -choco source add -n=local -s="file://$HOME" -choco install tanzu-cli -``` - -## Uninstalling the Tanzu CLI - -To uninstall the Tanzu CLI after it has been install with Chocolatey: - -```bash -choco uninstall tanzu-cli -``` - -## Publishing the package - -Once the Tanzu CLI is ready for full availability, we expect to publish our Chocolatey packages to the main Chocolatey community package repository. This step remains to be properly defined. diff --git a/cli/core/hack/choco/build_package.sh b/cli/core/hack/choco/build_package.sh deleted file mode 100755 index e8e62714cf..0000000000 --- a/cli/core/hack/choco/build_package.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -e - -if [ "$(command -v choco)" = "" ]; then - echo "This script must be run on a system that has 'choco' installed" - exit 1 -fi - -# VERSION should be set when calling this script -if [ -z "${VERSION}" ]; then - echo "\$VERSION must be set before calling this script" - exit 1 -fi - -# Strip 'v' prefix to be consistent with our other package names -VERSION=${VERSION#v} - -BASE_DIR=$(cd $(dirname "${BASH_SOURCE[0]}"); pwd) -OUTPUT_DIR=${BASE_DIR}/_output/choco - -mkdir -p ${OUTPUT_DIR}/ -# Remove the nupkg file made by `choco pack` in the working dir -rm -f ${OUTPUT_DIR}/*.nupkg - -# Obtain SHA -SHA=$(curl -sL https://github.com/vmware-tanzu/tanzu-framework/releases/download/v${VERSION}/tanzu-framework-executables-checksums.txt | grep tanzu-cli-windows-amd64.zip |cut -f1 -d" ") -if [ -z "$SHA" ]; then - echo "Unable to determine SHA for package of version $VERSION" - exit 1 -fi - -# Prepare install script -sed -e s,__CLI_VERSION__,v${VERSION}, -e s,__CLI_SHA__,${SHA}, \ - ${BASE_DIR}/chocolateyInstall.ps1.tmpl > ${OUTPUT_DIR}/chocolateyInstall.ps1 -chmod a+x ${OUTPUT_DIR}/chocolateyInstall.ps1 - -# Bundle the powershell scripts and nuspec into a nupkg file -choco pack ${BASE_DIR}/tanzu-cli-release.nuspec --out ${OUTPUT_DIR} "cliVersion=${VERSION}" - -# Upload the nupkg file to the registry -# DON'T DO THIS YET -# choco push --source https://push.chocolatey.org/ --api-key ....... diff --git a/cli/core/hack/choco/chocolateyInstall.ps1.tmpl b/cli/core/hack/choco/chocolateyInstall.ps1.tmpl deleted file mode 100644 index 7762e79da9..0000000000 --- a/cli/core/hack/choco/chocolateyInstall.ps1.tmpl +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -$ErrorActionPreference = 'Stop'; -$releaseVersion = '__CLI_VERSION__' -$packageName = 'tanzu-cli' -$packagePath = "${releaseVersion}" -$scriptsDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)" -$url64 = "https://github.com/vmware-tanzu/tanzu-framework/releases/download/${releaseVersion}/tanzu-cli-windows-amd64.zip" -$checksum64 = '__CLI_SHA__' -$checksumType64 = 'sha256' - -$packageArgs = @{ - packageName = $packageName - unzipLocation = $scriptsDir - url64bit = $url64 - - softwareName = 'tanzu-cli' - - checksum64 = $checksum64 - checksumType64 = $checksumType64 -} - -function Install-TanzuEnvironment { - # Rename CLI - # Note that we use the scriptsDir path because chocolatey doesn't put - # binaries on the $PATH until _after_ the install script runs. - $tanzuExe = "${scriptsDir}\${packagePath}\tanzu.exe" - Move-Item "${scriptsDir}\${packagePath}\tanzu-core-windows_amd64.exe" "${tanzuExe}" -} - -# this is a built-in function, read https://docs.chocolatey.org/en-us/create/functions/install-chocolateyzippackage -Install-ChocolateyZipPackage @packageArgs - -Install-TanzuEnvironment diff --git a/cli/core/hack/choco/tanzu-cli-release.nuspec b/cli/core/hack/choco/tanzu-cli-release.nuspec deleted file mode 100644 index c827bc4c20..0000000000 --- a/cli/core/hack/choco/tanzu-cli-release.nuspec +++ /dev/null @@ -1,28 +0,0 @@ - - - - - tanzu-cli - $cliVersion$ - VMware - Tanzu CLI - VMware Tanzu - https://github.com/vmware-tanzu/tanzu-framework - https://github.com/vmware-tanzu/tanzu-framework/blob/main/cli/core/hack/choco - - https://github.com/vmware-tanzu/tanzu-framework/blob/main/LICENSE - false - https://github.com/vmware-tanzu/tanzu-framework - https://github.com/vmware-tanzu/tanzu-framework/blob/main/README.md - https://github.com/vmware-tanzu/tanzu-framework/issues - tanzu cli kubernetes - CLI tool to create and manage Tanzu Kubernetes clusters - The Tanzu CLI is the starting point to create and manage Tanzu Kubernetes clusters. - Release notes are available at https://github.com/vmware-tanzu/tanzu-framework/releases - - - - - diff --git a/cli/core/hack/rpm/README.md b/cli/core/hack/rpm/README.md deleted file mode 100644 index 771093ebc1..0000000000 --- a/cli/core/hack/rpm/README.md +++ /dev/null @@ -1,69 +0,0 @@ -# Using YUM/DNF to install the Tanzu CLI - -YUM and DNF (the replacement for YUM) use RPM packages for installation. This document describes how to -build such packages for the Tanzu CLI, how to push them to a public repository and how to install the CLI -from that repository. - -## Building the RPM package - -Executing the `hack/rpm/build_package.sh` script will build the RPM packages under `cli/core/hack/rpm/_output`. -The `hack/rpm/build_package.sh` script is meant to be run on a Linux machine that has `dnf` or `yum` installed. -This can be done in docker using the `fedora` image. To facilitate this operation, the new `rpm-package` -Makefile target has been added to `cli/core/Makefile`; this Makefile target will first start a docker -container and then run the `hack/rpm/build_package.sh` script. - -```bash -cd tanzu-framework/cli/core -make rpm-package -``` - -Note that two packages will be built, one for AMD64 and one for ARM64. -Also, a repository will be generated as a directory called `_output/rpm` which will contain the two -built packages as well as some metadata. Please see the section on publishing the repository for more details. - -## Testing the installation of the Tanzu CLI locally - -We can install the Tanzu CLI using the newly built RPM repository locally on a Linux machine with `yum` or `dnf` -installed or using a docker container. For example, using `yum`: - -```bash -cd tanzu-framework -docker run --rm -it -v $(pwd)/cli/core/hack/rpm/_output/rpm:/tmp/rpm fedora -cat << EOF | sudo tee /etc/yum.repos.d/tanzu-cli.repo -[tanzu-cli] -name=Tanzu CLI -baseurl=file:///tmp/rpm -enabled=1 -gpgcheck=0 -EOF -yum install -y tanzu-cli -tanzu -``` - -Note that the repository isn't signed at the moment, so you may see warnings during installation. - -## Publishing the package to GCloud - -We have a GCloud bucket dedicated to hosting the Tanzu CLI OS packages. That bucket can be controlled from: -`https://console.cloud.google.com/storage/browser/tanzu-cli-os-packages`. - -To publish the repository containing the new rpm packages for the Tanzu CLI, we must upload the entire `rpm` -directory to the root of the bucket. You can do this manually. Once uploaded, the Tanzu CLI can be installed -publicly as described in the next section. - -## Installing the Tanzu CLI - -Currently, the repo is not signed but will be in the future; you may get warnings during installation. -To install from an insecure repo: - -```bash -docker run --rm -it fedora -cat << EOF | sudo tee /etc/yum.repos.d/tanzu-cli.repo -[tanzu-cli] -name=Tanzu CLI -baseurl=https://storage.googleapis.com/tanzu-cli-os-packages/rpm -enabled=1 -gpgcheck=0 -EOF -yum install -y tanzu-cli -``` diff --git a/cli/core/hack/rpm/build_package.sh b/cli/core/hack/rpm/build_package.sh deleted file mode 100755 index 04151fac3b..0000000000 --- a/cli/core/hack/rpm/build_package.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -e - -if [ $(uname) != "Linux" ]; then - echo "This script must be run on a Linux system" - exit 1 -fi - -# Use DNF and if it is not installed fallback to YUM -DNF=$(command -v dnf || command -v yum || true) -if [ -z "$DNF" ]; then - echo "This script requires the presence of either DNF or YUM package manager" - exit 1 -fi - -# VERSION should be set when calling this script -if [ -z "${VERSION}" ]; then - echo "\$VERSION must be set before calling this script" - exit 1 -fi - -# Strip 'v' prefix as an rpm package version must start with an integer -VERSION=${VERSION#v} - -BASE_DIR=$(cd $(dirname "${BASH_SOURCE[0]}"); pwd) -OUTPUT_DIR=${BASE_DIR}/_output/rpm - -# Install build dependencies -$DNF install -y rpmdevtools rpmlint createrepo - -rpmlint ${BASE_DIR}/tanzu-cli.spec - -# We must create the sources directory ourselves in the below location -mkdir -p ${HOME}/rpmbuild/SOURCES - -# Create the .rpm packages -rm -rf ${OUTPUT_DIR} -mkdir -p ${OUTPUT_DIR} -rpmbuild --define "cli_version ${VERSION}" -bb ${BASE_DIR}/tanzu-cli.spec --target amd64 -mv ${HOME}/rpmbuild/RPMS/amd64/* ${OUTPUT_DIR}/ -rpmbuild --define "cli_version ${VERSION}" -bb ${BASE_DIR}/tanzu-cli.spec --target aarch64 -mv ${HOME}/rpmbuild/RPMS/aarch64/* ${OUTPUT_DIR}/ - -# Create the repository metadata -createrepo ${OUTPUT_DIR} diff --git a/cli/core/hack/rpm/tanzu-cli.spec b/cli/core/hack/rpm/tanzu-cli.spec deleted file mode 100644 index 64264d429b..0000000000 --- a/cli/core/hack/rpm/tanzu-cli.spec +++ /dev/null @@ -1,46 +0,0 @@ -Name: tanzu-cli -Version: %{cli_version} -Release: 1 -License: Apache 2.0 -URL: https://github.com/vmware-tanzu/tanzu-cli/ -Vendor: VMware -Summary: The Tanzu CLI -Provides: tanzu-cli -Obsoletes: tanzu-cli < %{cli_version} - -%ifarch amd64 -%define arch amd64 -%endif - -%ifarch aarch64 -# TODO For now, we use the amd64 build for arm64 -%define arch amd64 -%endif - -%undefine _disable_source_fetch -Source0: https://github.com/vmware-tanzu/tanzu-framework/releases/download/v%{version}/tanzu-cli-linux-%{arch}.tar.gz - -%description -VMware Tanzu is a modular, cloud native application platform that enables vital DevSecOps outcomes -in a multi-cloud world. The Tanzu CLI allows you to control VMware Tanzu from the command-line. - -# Go does not generate a build-id compatible with RPM, so we disable the need for a build-id -# See https://github.com/rpm-software-management/rpm/issues/367 -%global _missing_build_ids_terminate_build 0 - -# This is required to avoid some missing debug file errors -%define debug_package %nil - -%prep -%setup -q -n v%{cli_version} - -%build -# Nothing to build - -%install -rm -rf $RPM_BUILD_ROOT -mkdir -p $RPM_BUILD_ROOT/%{_bindir} -mv tanzu-core-linux_%{arch} $RPM_BUILD_ROOT/%{_bindir}/tanzu - -%files -%{_bindir}/tanzu diff --git a/cli/core/hack/tools/Makefile b/cli/core/hack/tools/Makefile deleted file mode 100644 index c6a99f1d0e..0000000000 --- a/cli/core/hack/tools/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Build tooling that is used for the main project - -# Ensure Make is run with bash shell as some syntax below is bash-specific -SHELL := /usr/bin/env bash - -.DEFAULT_GOAL := help - -# Use GOPROXY environment variable if set -GOPROXY := $(shell go env GOPROXY) -ifeq (,$(strip $(GOPROXY))) -GOPROXY := https://proxy.golang.org -endif -export GOPROXY - -# Directories. -ROOT_DIR:=$(shell git rev-parse --show-toplevel) -BIN_DIR := bin -SRCS := go.mod go.sum - -# Binaries. -GOIMPORTS := $(BIN_DIR)/goimports - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -## -------------------------------------- -## Binaries -## -------------------------------------- - -goimports: $(GOIMPORTS) $(SRCS) ## Build goimports -$(GOIMPORTS): go.mod go.sum - go build -tags=tools -o $@ golang.org/x/tools/cmd/goimports - -## -------------------------------------- -## Cleanup -## -------------------------------------- - -.PHONY: clean -clean: ## Remove all generated binaries - rm -rf bin diff --git a/cli/core/hack/tools/go.mod b/cli/core/hack/tools/go.mod deleted file mode 100644 index 2404a82626..0000000000 --- a/cli/core/hack/tools/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/vmware-tanzu/cli/core/hack/tools - -go 1.18 - -require golang.org/x/tools v0.1.12 - -require ( - golang.org/x/mod v0.7.0 // indirect - golang.org/x/sys v0.6.0 // indirect -) diff --git a/cli/core/hack/tools/go.sum b/cli/core/hack/tools/go.sum deleted file mode 100644 index 72ad2d259e..0000000000 --- a/cli/core/hack/tools/go.sum +++ /dev/null @@ -1,6 +0,0 @@ -golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/cli/core/hack/tools/main.go b/cli/core/hack/tools/main.go deleted file mode 100644 index 602e391142..0000000000 --- a/cli/core/hack/tools/main.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// This file is only present to make the linter happy. - -package main - -func main() {} diff --git a/cli/core/hack/tools/tools.go b/cli/core/hack/tools/tools.go deleted file mode 100644 index f4995013c8..0000000000 --- a/cli/core/hack/tools/tools.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build tools -// +build tools - -// Copyright 2021-22 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tools imports things required by build scripts, to force `go mod` to see them as dependencies - -package tools - -import ( - _ "golang.org/x/tools/cmd/goimports" -) diff --git a/cli/core/pkg/artifact/http.go b/cli/core/pkg/artifact/http.go deleted file mode 100644 index 911699167e..0000000000 --- a/cli/core/pkg/artifact/http.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package artifact - -import ( - "context" - "fmt" - "io" - "net/http" - "time" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/interfaces" -) - -const ( - uriSchemeHTTP = "http" - uriSchemeHTTPS = "https" - defaultTimeout = 120 * time.Second - bufferSize = 4068 - ErrorMsgHTTPArtifactDownload = "error while downloading the artifact: %s; received status code: %d instead of 200" -) - -// HTTPArtifact defines HTTP artifact location. -type HTTPArtifact struct { - URL string - HTTPClient interfaces.HTTPClient -} - -// NewHTTPArtifact creates HTTP Artifact object -func NewHTTPArtifact(url string) Artifact { - return &HTTPArtifact{ - URL: url, - HTTPClient: http.DefaultClient, - } -} - -// Fetch an artifact. -func (g *HTTPArtifact) Fetch() ([]byte, error) { - ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) - defer cancel() - - req, err := http.NewRequestWithContext(ctx, "GET", g.URL, http.NoBody) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", "application/json; charset=utf-8") - req.Header.Set("Accept", "application/json; charset=utf-8") - - res, err := g.HTTPClient.Do(req) - - if err != nil { - return nil, err - } - defer res.Body.Close() - - if res.StatusCode != http.StatusOK { - return nil, fmt.Errorf(ErrorMsgHTTPArtifactDownload, req.URL, res.StatusCode) - } - - buf := make([]byte, bufferSize) - out := []byte{} - - for { - // read a chunk of response body - n, err := res.Body.Read(buf) - if err != nil && err != io.EOF { - return nil, err - } - if n == 0 { - break - } - - // append chunk by chunk - out = append(out, buf[:n]...) - } - - return out, nil -} - -// FetchTest returns test artifact -func (g *HTTPArtifact) FetchTest() ([]byte, error) { - return nil, errors.New("fetching test plugin from HTTP source is not yet supported") -} diff --git a/cli/core/pkg/artifact/http_test.go b/cli/core/pkg/artifact/http_test.go deleted file mode 100644 index 3093caf58f..0000000000 --- a/cli/core/pkg/artifact/http_test.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package artifact - -import ( - "bytes" - "fmt" - "io" - "net/http" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/fakes" -) - -var ( - httpArtifact *HTTPArtifact - fakeHTTPClient *fakes.FakeHTTPClient - responseBody io.ReadCloser -) - -const dummyURL = "http://dummy.com" - -func initialize(url string) { - fakeHTTPClient = &fakes.FakeHTTPClient{} - httpArtifact = &HTTPArtifact{ - URL: url, - HTTPClient: fakeHTTPClient, - } - responseBody = io.NopCloser(bytes.NewReader([]byte(`{"name":"dummy name"}`))) -} - -func TestHttpArtifact_successful(t *testing.T) { - assert := assert.New(t) - - // test NewHTTPArtifact() - artifactObj := NewHTTPArtifact(dummyURL) - assert.NotNil(artifactObj) - - initialize(dummyURL) - // successful case - fakeHTTPClient.DoReturns(&http.Response{ - StatusCode: 200, - Body: responseBody, - }, nil) - - resp, err := httpArtifact.Fetch() - assert.Nil(err) - assert.NotNil(resp) -} - -func TestHttpArtifact_statusCode500(t *testing.T) { - assert := assert.New(t) - initialize(dummyURL) - // return 500 status code - fakeHTTPClient.DoReturns(&http.Response{ - StatusCode: 500, - Body: responseBody, - }, nil) - errorMsg := fmt.Sprintf(ErrorMsgHTTPArtifactDownload, dummyURL, 500) - _, err1 := httpArtifact.Fetch() - assert.Contains(err1.Error(), errorMsg) -} - -func TestHttpArtifact_errorResponse(t *testing.T) { - assert := assert.New(t) - initialize(dummyURL) - // returns error for the rest call - errorMsg := "internal server error" - fakeHTTPClient.DoReturns(&http.Response{ - StatusCode: 500, - Body: responseBody, - }, fmt.Errorf(errorMsg)) - _, err := httpArtifact.Fetch() - assert.Contains(err.Error(), errorMsg) -} diff --git a/cli/core/pkg/artifact/interface.go b/cli/core/pkg/artifact/interface.go deleted file mode 100644 index 79575e14be..0000000000 --- a/cli/core/pkg/artifact/interface.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package artifact implements interface to fetch the binary artifacts -// from different sources -package artifact - -import ( - "net/url" - "path/filepath" -) - -// Artifact is an interface to download a single plugin binary. -type Artifact interface { - // Fetch the binary for a plugin version. - Fetch() ([]byte, error) - // FetchTest the test binary for a plugin version. - FetchTest() ([]byte, error) -} - -// NewURIArtifact creates new artifacts based on the URI -func NewURIArtifact(uri string) (Artifact, error) { - u, err := url.Parse(uri) - if err != nil { - return nil, err - } - - switch u.Scheme { - case uriSchemeHTTP, uriSchemeHTTPS: - return NewHTTPArtifact(uri), nil - case uriSchemeLocal: - return NewLocalArtifact(filepath.Join(u.Host, u.Path)), nil - default: - // The URI could point to a relative path without specifying any scheme - // as prefix. Hence, defaulting to local artifact. - return NewLocalArtifact(uri), nil - } -} diff --git a/cli/core/pkg/artifact/interface_test.go b/cli/core/pkg/artifact/interface_test.go deleted file mode 100644 index 0e73faa660..0000000000 --- a/cli/core/pkg/artifact/interface_test.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package artifact - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestCliCorePkgArtifactSuite(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cli/core/pkg/artifact Suite") -} - -var _ = Describe("Unit tests for local artifact", func() { - When("url is http/https", func() { - It("should not return error", func() { - uriArtifact, err := NewURIArtifact(dummyURL) - Expect(uriArtifact).NotTo(BeNil()) - Expect(err).To(BeNil()) - }) - }) - When("url is local", func() { - It("should not return error", func() { - uriArtifact, err := NewURIArtifact("file://home/user/") - Expect(uriArtifact).NotTo(BeNil()) - Expect(err).To(BeNil()) - }) - }) - When("url is default", func() { - It("should not return error", func() { - uriArtifact, err := NewURIArtifact("/default") - Expect(uriArtifact).NotTo(BeNil()) - Expect(err).To(BeNil()) - }) - }) - When("url is not valid", func() { - It("should return error", func() { - uriArtifact, err := NewURIArtifact("sql://user:pwd/db") - Expect(uriArtifact).To(BeNil()) - Expect(err).NotTo(BeNil()) - }) - }) -}) diff --git a/cli/core/pkg/artifact/local.go b/cli/core/pkg/artifact/local.go deleted file mode 100644 index 75b73925ec..0000000000 --- a/cli/core/pkg/artifact/local.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package artifact - -import ( - "os" - "path/filepath" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" -) - -const ( - uriSchemeLocal = "file" -) - -// LocalArtifact defines local artifact path. -// Sample URI: file://home/user/workspace/tanzu-framework/artifacts/darwin/amd64/cli/login/v0.10.0-dev/tanzu-login-darwin_amd64 -type LocalArtifact struct { - // Path is path to local binary artifact - // if path is not an absolute path search under - // `xdg.ConfigHome/tanzu-plugin/localPath` directory - Path string -} - -// NewLocalArtifact creates Local Artifact object -// If path is not an absolute path -// search under `xdg.ConfigHome/tanzu-plugin/distribution` directory -func NewLocalArtifact(path string) Artifact { - if !filepath.IsAbs(path) { - path = filepath.Join(common.DefaultLocalPluginDistroDir, "distribution", path) - } - return &LocalArtifact{ - Path: path, - } -} - -// Fetch reads the local artifact from its path -func (l *LocalArtifact) Fetch() ([]byte, error) { - b, err := os.ReadFile(l.Path) - if err != nil { - return nil, errors.Wrapf(err, "error while reading artifact") - } - return b, nil -} - -// FetchTest reads test plugin artifact based on the local plugin artifact path -// To fetch the test binary from the plugin we are using plugin binary path and creating test plugin path from it -// If the plugin binary path is `artifacts/darwin/amd64/cli/cluster/v0.27.0-dev/tanzu-cluster-darwin_amd64` -// then test plugin binary will be under `artifacts/darwin/amd64/cli/cluster/v0.27.0-dev/test/` directory -func (l *LocalArtifact) FetchTest() ([]byte, error) { - // test plugin directory based on the plugin binary location - testPluginDir := filepath.Join(filepath.Dir(l.Path), "test") - dirEntries, err := os.ReadDir(testPluginDir) - if err != nil { - return nil, errors.Wrap(err, "unable to read test plugin directory") - } - if len(dirEntries) != 1 { - return nil, errors.Errorf("expected only 1 file under the '%v' directory, but found %v files", testPluginDir, len(dirEntries)) - } - - // Assuming the file under the test directory is the test plugin binary - testPluginFile := dirEntries[0] - if testPluginFile.IsDir() { - return nil, errors.Errorf("expected to find test plugin binary but found directory %q", testPluginFile.Name()) - } - - testPluginPath := filepath.Join(testPluginDir, testPluginFile.Name()) - b, err := os.ReadFile(testPluginPath) - if err != nil { - return nil, errors.Wrapf(err, "error while reading test artifact") - } - return b, nil -} diff --git a/cli/core/pkg/artifact/local_test.go b/cli/core/pkg/artifact/local_test.go deleted file mode 100644 index f64c9c5467..0000000000 --- a/cli/core/pkg/artifact/local_test.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package artifact - -import ( - "path/filepath" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/stretchr/testify/assert" -) - -// When local artifact directory exists and test directory exists -func TestLocalArtifactWhenArtifactAndTestDirExists(t *testing.T) { - assert := assert.New(t) - - testPluginPath, err := filepath.Abs(filepath.Join("test", "local", "v0.0.1", "tanzu-plugin-darwin_amd64")) - assert.NoError(err) - artifact := NewLocalArtifact(testPluginPath) - - b, err := artifact.Fetch() - assert.NoError(err) - assert.Contains(string(b), "plugin binary") - - b, err = artifact.FetchTest() - assert.NoError(err) - assert.Contains(string(b), "test plugin binary") -} - -// When local artifact doesn't exists and multiple files exists within test directory -func TestLocalArtifactWhenArtifactDoesntExistsAndMultipleFilesUnderTest(t *testing.T) { - assert := assert.New(t) - - testPluginPath, err := filepath.Abs(filepath.Join("test", "local", "v0.0.2", "plugin_binary_does_not_exists")) - assert.NoError(err) - - artifact := NewLocalArtifact(testPluginPath) - - // When local artifact doesn't exists - _, err = artifact.Fetch() - assert.Error(err) - assert.ErrorContains(err, "error while reading artifact") - - // When multiple files exists under test directory - _, err = artifact.FetchTest() - assert.Error(err) - assert.ErrorContains(err, "expected only 1 file under the") -} - -var _ = Describe("Unit tests for local artifact", func() { - Context("when input file not exists", func() { - It("should return current token", func() { - localArtifact := NewLocalArtifact("file://home/user/") - Expect(localArtifact).NotTo(BeNil()) - bytes, err1 := localArtifact.Fetch() - Expect(bytes).To(BeNil()) - Expect(err1.Error()).To(ContainSubstring("error while reading artifact")) - }) - }) -}) diff --git a/cli/core/pkg/artifact/oci.go b/cli/core/pkg/artifact/oci.go deleted file mode 100644 index b4c08595b2..0000000000 --- a/cli/core/pkg/artifact/oci.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2021-2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package artifact - -import ( - "fmt" - "strings" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/carvelhelpers" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/utils" -) - -// A file map getter takes an OCI image name and returns a map representing the -// file contents. -type fileMapGetterFn func(string) (map[string][]byte, error) - -// OCIArtifact defines OCI artifact image endpoint -type OCIArtifact struct { - Image string - getFilesMapFromImage fileMapGetterFn -} - -// NewOCIArtifact creates OCI Artifact object -func NewOCIArtifact(image string) Artifact { - return &OCIArtifact{ - Image: image, - getFilesMapFromImage: carvelhelpers.GetFilesMapFromImage, - } -} - -// Fetch an artifact. -func (g *OCIArtifact) Fetch() ([]byte, error) { - filesMap, err := g.getFilesMapFromImage(g.Image) - if err != nil { - return nil, errors.Wrap(err, "unable fetch plugin binary") - } - - var bytesData []byte - fileCount := 0 - - for path, fileData := range filesMap { - // Skip any testing related directory paths if bundled - if utils.ContainsString(strings.Split(path, "/"), "test") { - continue - } - - bytesData = fileData - fileCount++ - } - - if fileCount != 1 { - return nil, fmt.Errorf("oci artifact image for plugin is required to have only 1 file, but found %v", fileCount) - } - - return bytesData, nil -} - -// FetchTest returns test artifact -func (g *OCIArtifact) FetchTest() ([]byte, error) { - return nil, errors.New("fetching test plugin from OCI source is not yet supported") -} diff --git a/cli/core/pkg/artifact/oci_test.go b/cli/core/pkg/artifact/oci_test.go deleted file mode 100644 index 9abbdaf23d..0000000000 --- a/cli/core/pkg/artifact/oci_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package artifact - -import ( - "testing" -) - -func TestOCIArtifactWhenMultipleFilesFound(t *testing.T) { - expectedImageName := "foo" - artifact := NewOCIArtifact(expectedImageName) - o, _ := artifact.(*OCIArtifact) - o.getFilesMapFromImage = func(s string) (map[string][]byte, error) { - if s != expectedImageName { - t.Fatalf("Unexpected image in call to get files map. Expected '%s', got '%s'", expectedImageName, s) - } - - // Return a fake map with 2 files. - return map[string][]byte{ - "file1": nil, - "file2": nil, - }, nil - } - - data, err := o.Fetch() - - if len(data) != 0 { - t.Fatalf("Expected to receive a nil map, got '%+v'", data) - } - - expectedErrorMessage := "oci artifact image for plugin is required to have only 1 file, but found 2" - if err.Error() != expectedErrorMessage { - t.Fatalf("Did not receive the expected error message. Expected '%s', got '%s'", expectedErrorMessage, err.Error()) - } -} diff --git a/cli/core/pkg/artifact/test/local/v0.0.1/tanzu-plugin-darwin_amd64 b/cli/core/pkg/artifact/test/local/v0.0.1/tanzu-plugin-darwin_amd64 deleted file mode 100644 index b266d35e9e..0000000000 --- a/cli/core/pkg/artifact/test/local/v0.0.1/tanzu-plugin-darwin_amd64 +++ /dev/null @@ -1 +0,0 @@ -plugin binary diff --git a/cli/core/pkg/artifact/test/local/v0.0.1/test/tanzu-test-plugin-darwin_amd64 b/cli/core/pkg/artifact/test/local/v0.0.1/test/tanzu-test-plugin-darwin_amd64 deleted file mode 100644 index b0ad6165c3..0000000000 --- a/cli/core/pkg/artifact/test/local/v0.0.1/test/tanzu-test-plugin-darwin_amd64 +++ /dev/null @@ -1 +0,0 @@ -test plugin binary diff --git a/cli/core/pkg/artifact/test/local/v0.0.2/tanzu-plugin-darwin_amd64 b/cli/core/pkg/artifact/test/local/v0.0.2/tanzu-plugin-darwin_amd64 deleted file mode 100644 index b266d35e9e..0000000000 --- a/cli/core/pkg/artifact/test/local/v0.0.2/tanzu-plugin-darwin_amd64 +++ /dev/null @@ -1 +0,0 @@ -plugin binary diff --git a/cli/core/pkg/artifact/test/local/v0.0.2/test/extra_file b/cli/core/pkg/artifact/test/local/v0.0.2/test/extra_file deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/cli/core/pkg/artifact/test/local/v0.0.2/test/tanzu-test-plugin-darwin_amd64 b/cli/core/pkg/artifact/test/local/v0.0.2/test/tanzu-test-plugin-darwin_amd64 deleted file mode 100644 index b0ad6165c3..0000000000 --- a/cli/core/pkg/artifact/test/local/v0.0.2/test/tanzu-test-plugin-darwin_amd64 +++ /dev/null @@ -1 +0,0 @@ -test plugin binary diff --git a/cli/core/pkg/auth/csp/doc.go b/cli/core/pkg/auth/csp/doc.go deleted file mode 100644 index 71832f52a5..0000000000 --- a/cli/core/pkg/auth/csp/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package csp provides VMware Cloud Services Platform token utilities. -package csp diff --git a/cli/core/pkg/auth/csp/grpc.go b/cli/core/pkg/auth/csp/grpc.go deleted file mode 100644 index 77e518eb90..0000000000 --- a/cli/core/pkg/auth/csp/grpc.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package csp - -import ( - "context" - "fmt" - "time" - - "github.com/aunum/log" - - "golang.org/x/oauth2" - "google.golang.org/grpc" - grpc_oauth "google.golang.org/grpc/credentials/oauth" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/interfaces" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -const ( - mdKeyAuthToken = "Authorization" - authTokenPrefix = "Bearer " - mdKeyAuthIDToken = "X-User-Id" - apiToken = "api-token" -) - -var ( - configClientWrapper interfaces.ConfigClientWrapper -) - -func init() { - configClientWrapper = interfaces.NewConfigClient() -} - -// WithCredentialDiscovery returns a grpc.CallOption that adds credentials into gRPC calls. -// The credentials are loaded from the auth context found on the machine. -func WithCredentialDiscovery() (grpc.CallOption, error) { - cfg, err := config.GetClientConfig() - if err != nil { - return nil, err - } - // Wrap our TokenSource to supply id tokens - return grpc.PerRPCCredentials(&TokenSource{ - TokenSource: &configSource{cfg}, - }), nil -} - -// WithStaticCreds will wrap a static access token into a grpc.CallOption -func WithStaticCreds(accessToken string) grpc.CallOption { - return grpc.PerRPCCredentials(&grpc_oauth.TokenSource{ - TokenSource: oauth2.StaticTokenSource( - &oauth2.Token{AccessToken: accessToken}, - ), - }) -} - -type configSource struct { - *configapi.ClientConfig -} - -// Token fetches the token. -func (c *configSource) Token() (*oauth2.Token, error) { - g, err := c.GetCurrentServer() - if err != nil { - return nil, err - } - if !g.IsGlobal() { - return nil, fmt.Errorf("trying to fetch token for non global server") - } - if !IsExpired(g.GlobalOpts.Auth.Expiration.Time) { - tok := &oauth2.Token{ - AccessToken: g.GlobalOpts.Auth.AccessToken, - Expiry: g.GlobalOpts.Auth.Expiration.Time, - } - return tok.WithExtra(map[string]interface{}{ - ExtraIDToken: g.GlobalOpts.Auth.IDToken, - }), nil - } - token, err := GetAccessTokenFromAPIToken(g.GlobalOpts.Auth.RefreshToken, ProdIssuer) - if err != nil { - return nil, err - } - - g.GlobalOpts.Auth.Type = apiToken - expiration := time.Now().Local().Add(time.Second * time.Duration(token.ExpiresIn)) - g.GlobalOpts.Auth.Expiration = metav1.NewTime(expiration) - g.GlobalOpts.Auth.RefreshToken = token.RefreshToken - g.GlobalOpts.Auth.AccessToken = token.AccessToken - g.GlobalOpts.Auth.IDToken = token.IDToken - - // Acquire tanzu config lock - configClientWrapper.AcquireTanzuConfigLock() - defer configClientWrapper.ReleaseTanzuConfigLock() - - // TODO: Add Read/Write locking mechanism before updating the configuration - // Currently we are only acquiring the lock while updating the configuration - if err := configClientWrapper.StoreClientConfig(c.ClientConfig); err != nil { - return nil, err - } - - tok := &oauth2.Token{ - AccessToken: token.AccessToken, - RefreshToken: token.RefreshToken, - Expiry: expiration, - } - return tok.WithExtra(map[string]interface{}{ - ExtraIDToken: token.IDToken, - }), nil -} - -// TokenSource supplies PerRPCCredentials from an oauth2.TokenSource using CSP as the IDP. -// It will supply access token through authorization header and id_token through user-Id header -type TokenSource struct { - oauth2.TokenSource -} - -// GetRequestMetadata gets the request metadata as a map from a TokenSource. -func (ts TokenSource) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - token, err := ts.Token() - if err != nil { - return nil, err - } - - headers := map[string]string{mdKeyAuthToken: authTokenPrefix + " " + token.AccessToken} - idTok := IDTokenFromTokenSource(token) - if idTok != "" { - headers[mdKeyAuthIDToken] = idTok - } - - return headers, nil -} - -// RequireTransportSecurity indicates whether the credentials requires transport security. -func (ts TokenSource) RequireTransportSecurity() bool { - return true -} - -// GetAuthOptsOrExit returns the grpc auth options. If accessToken is not empty it uses it, else it fetches the token -// from the current auth context. If it encounters and error, it exits. -func GetAuthOptsOrExit() grpc.CallOption { - var authOpts grpc.CallOption - var err error - authOpts, err = WithCredentialDiscovery() - if err != nil { - log.Fatal("Not logged in. Please retry after logging in") - } - - return authOpts -} diff --git a/cli/core/pkg/auth/csp/grpc_test.go b/cli/core/pkg/auth/csp/grpc_test.go deleted file mode 100644 index 0d7d5f20e4..0000000000 --- a/cli/core/pkg/auth/csp/grpc_test.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package csp - -import ( - "bytes" - "io" - "net/http" - "testing" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/fakes" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -var ( - fakeHTTPClient *fakes.FakeHTTPClient -) - -const accessTokenDummy = "AccessToken_dummy" -const idTokenDummy = "IDToken_dummy" - -func Test(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cli/core/pkg/auth/csp Suite") -} - -var _ = Describe("Unit tests for grpc", func() { - var ( - confSource configSource - accessToken string - idToken string - ) - Context("when token is not expired", func() { - BeforeEach(func() { - accessToken = accessTokenDummy - idToken = idTokenDummy - expiration := time.Now().Local().Add(time.Second * time.Duration(1000)) - gsa := configapi.GlobalServerAuth{ - Expiration: metav1.NewTime(expiration), - AccessToken: accessToken, - IDToken: idToken, - } - confSource = initializeConfigSource(gsa) - - cc := &fakes.FakeConfigClientWrapper{} - configClientWrapper = cc - cc.StoreClientConfigReturns(nil) - cc.AcquireTanzuConfigLock() - }) - It("should return current token", func() { - token, err := confSource.Token() - Expect(err).NotTo(HaveOccurred()) - Expect(token.AccessToken).To(Equal(accessToken)) - et := token.WithExtra(ExtraIDToken) - Expect(et.AccessToken).To(Equal(accessToken)) - }) - }) - Context("when token is expired", func() { - BeforeEach(func() { - accessToken = accessTokenDummy - idToken = idTokenDummy - expiration := time.Now().Local().Add(time.Second * time.Duration(-1000)) - gsa := configapi.GlobalServerAuth{ - Expiration: metav1.NewTime(expiration), - AccessToken: accessToken, - IDToken: idToken, - } - confSource = initializeConfigSource(gsa) - fakeHTTPClient = &fakes.FakeHTTPClient{} - httpRestClient = fakeHTTPClient - // successful case - responseBody := io.NopCloser(bytes.NewReader([]byte(`{ - "id_token": "abc", - "token_type": "Test", - "expires_in": 86400, - "scope": "Test", - "access_token": "LetMeInGrpc1", - "refresh_token": "LetMeInAgainGrpc1"}`))) - - fakeHTTPClient.DoReturns(&http.Response{ - StatusCode: 200, - Body: responseBody, - }, nil) - - cc := &fakes.FakeConfigClientWrapper{} - configClientWrapper = cc - cc.StoreClientConfigReturns(nil) - cc.AcquireTanzuConfigLock() - }) - It("should return token from server", func() { - token, err := confSource.Token() - Expect(err).NotTo(HaveOccurred()) - Expect(token.AccessToken).To(Equal("LetMeInGrpc1")) - Expect(token.RefreshToken).To(Equal("LetMeInAgainGrpc1")) - }) - }) -}) - -func initializeConfigSource(gsa configapi.GlobalServerAuth) configSource { - gs := configapi.GlobalServer{ - Endpoint: "", - Auth: gsa, - } - globalServer := configapi.Server{ - Name: "GlobalServer", - Type: configapi.GlobalServerType, - GlobalOpts: &gs, - } - managementServer := configapi.Server{ - Name: "ManagementServer", - Type: configapi.ManagementClusterServerType, - } - clientConfigObj := configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - &globalServer, - &managementServer, - }, - CurrentServer: globalServer.Name, - KnownContexts: []*configapi.Context{ - { - Name: globalServer.Name, - Target: cliv1alpha1.TargetTMC, - }, - { - Name: managementServer.Name, - Target: cliv1alpha1.TargetK8s, - }, - }, - CurrentContext: map[cliv1alpha1.Target]string{ - cliv1alpha1.TargetTMC: globalServer.Name, - cliv1alpha1.TargetK8s: managementServer.Name, - }, - } - return configSource{ - ClientConfig: &clientConfigObj, - } -} diff --git a/cli/core/pkg/auth/csp/token.go b/cli/core/pkg/auth/csp/token.go deleted file mode 100644 index a15a70128d..0000000000 --- a/cli/core/pkg/auth/csp/token.go +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package csp - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "time" - - "github.com/aunum/log" - "github.com/golang-jwt/jwt" - "github.com/pkg/errors" - - "golang.org/x/oauth2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/interfaces" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -const ( - // AuthTokenDir is a directory where cluster access token and refresh tokens are stored. - AuthTokenDir = "tokens" - - // ExtraIDToken is the key in the Extra fields map that contains id_token. - ExtraIDToken = "id_token" - - // StgIssuer is the CSP staging issuer. - StgIssuer = "https://console-stg.cloud.vmware.com/csp/gateway/am/api" - - // ProdIssuer is the CSP issuer. - ProdIssuer = "https://console.cloud.vmware.com/csp/gateway/am/api" - - //nolint:gosec // Avoid "hardcoded credentials" false positive. - // APITokenKey is the env var for an API token override. - APITokenKey = "CSP_API_TOKEN" -) - -var ( - // KnownIssuers are known OAuth2 endpoints in each CSP environment. - KnownIssuers = map[string]oauth2.Endpoint{ - StgIssuer: { - AuthURL: "https://console-stg.cloud.vmware.com/csp/gateway/discovery", - TokenURL: "https://console-stg.cloud.vmware.com/csp/gateway/am/api/auth/authorize", - AuthStyle: oauth2.AuthStyleInHeader, - }, - ProdIssuer: { - AuthURL: "https://console.cloud.vmware.com/csp/gateway/discovery", - TokenURL: "https://console.cloud.vmware.com/csp/gateway/am/api/auth/authorize", - AuthStyle: oauth2.AuthStyleInHeader, - }, - } - httpRestClient interfaces.HTTPClient -) - -func init() { - httpRestClient = http.DefaultClient -} - -// IDTokenFromTokenSource parses out the id token from extra info in tokensource if available, or returns empty string. -func IDTokenFromTokenSource(token *oauth2.Token) (idTok string) { - extraTok := token.Extra("id_token") - if extraTok != nil { - idTok = extraTok.(string) - } - return -} - -// Token is a CSP token. -type Token struct { - // IDToken for OIDC. - IDToken string `json:"id_token"` - - // TokenType is the type of token. - TokenType string `json:"token_type"` - - // ExpiresIn is experation in seconds. - ExpiresIn int64 `json:"expires_in"` - - // Scope of the token. - Scope string `json:"scope"` - - // AccessToken from CSP. - AccessToken string `json:"access_token"` - - // RefreshToken for use with Refresh Token grant. - RefreshToken string `json:"refresh_token"` -} - -// GetAccessTokenFromAPIToken fetches CSP access token using the API-token. -func GetAccessTokenFromAPIToken(apiToken, issuer string) (*Token, error) { - api := fmt.Sprintf("%s/auth/api-tokens/authorize", issuer) - data := url.Values{} - data.Set("refresh_token", apiToken) - req, _ := http.NewRequestWithContext(context.Background(), "POST", api, bytes.NewBufferString(data.Encode())) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - - resp, err := httpRestClient.Do(req) - if err != nil { - return nil, errors.WithMessage(err, "Failed to obtain access token. Please provide valid VMware Cloud Services API-token") - } - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(resp.Body) - return nil, errors.Errorf("Failed to obtain access token. Please provide valid VMware Cloud Services API-token -- %s", string(body)) - } - - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - token := Token{} - - if err = json.Unmarshal(body, &token); err != nil { - return nil, errors.Wrap(err, "could not unmarshal auth token") - } - - return &token, nil -} - -// GetIssuer returns the appropriate CSP issuer based on the environment. -func GetIssuer(staging bool) string { - if staging { - return StgIssuer - } - return ProdIssuer -} - -// IsExpired checks for the token expiry and returns true if the token has expired else will return false -func IsExpired(tokenExpiry time.Time) bool { - // refresh at half token life - two := 2 - now := time.Now().Unix() - halfDur := -time.Duration((tokenExpiry.Unix()-now)/int64(two)) * time.Second - return tokenExpiry.Add(halfDur).Unix() < now -} - -// ParseToken parses the token. -func ParseToken(tkn *oauth2.Token) (*Claims, error) { - token, _, err := new(jwt.Parser).ParseUnverified(tkn.AccessToken, jwt.MapClaims{}) - if err != nil { - return nil, err - } - - c, ok := token.Claims.(jwt.MapClaims) - if !ok { - return nil, fmt.Errorf("could not parse claims") - } - perm := []string{} - p, ok := c["perms"].([]interface{}) - if !ok { - log.Warning("could not parse perms from token") - } - for _, i := range p { - perm = append(perm, i.(string)) - } - uname, ok := c["username"].(string) - if !ok { - return nil, fmt.Errorf("could not parse username from token") - } - orgID, ok := c["context_name"].(string) - if !ok { - return nil, fmt.Errorf("could not parse orgID from token") - } - claims := &Claims{ - Username: uname, - Permissions: perm, - OrgID: orgID, - Raw: c, - } - return claims, nil -} - -// Claims are the jwt claims. -type Claims struct { - Username string - Permissions []string - OrgID string - Raw map[string]interface{} -} - -// GetToken fetches a token for the current auth context. -func GetToken(g *configapi.GlobalServerAuth) (*oauth2.Token, error) { - if !IsExpired(g.Expiration.Time) { - tok := &oauth2.Token{ - AccessToken: g.AccessToken, - Expiry: g.Expiration.Time, - } - return tok.WithExtra(map[string]interface{}{ - "id_token": g.IDToken, - }), nil - } - - // TODO (pbarker): support more issuers. - token, err := GetAccessTokenFromAPIToken(g.RefreshToken, ProdIssuer) - if err != nil { - return nil, err - } - - g.Type = "api-token" - expiration := time.Now().Local().Add(time.Second * time.Duration(token.ExpiresIn)) - g.Expiration = metav1.NewTime(expiration) - g.RefreshToken = token.RefreshToken - g.AccessToken = token.AccessToken - g.IDToken = token.IDToken - - tok := &oauth2.Token{ - AccessToken: token.AccessToken, - RefreshToken: token.RefreshToken, - Expiry: expiration, - } - return tok.WithExtra(map[string]interface{}{ - "id_token": token.IDToken, - }), nil -} diff --git a/cli/core/pkg/auth/csp/token_test.go b/cli/core/pkg/auth/csp/token_test.go deleted file mode 100644 index 5b8843f0f3..0000000000 --- a/cli/core/pkg/auth/csp/token_test.go +++ /dev/null @@ -1,280 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package csp - -import ( - "bytes" - "crypto/hmac" - "crypto/sha256" - "encoding/base64" - "encoding/hex" - "fmt" - "io" - "net/http" - - "testing" - "time" - - "github.com/stretchr/testify/assert" - "golang.org/x/oauth2" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/fakes" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -const issuerURL = "https://auth0.com/" - -var JWTHeader = `{"alg":"HS256","typ":"JWT"}` - -func TestGetAccessTokenFromAPIToken(t *testing.T) { - assert := assert.New(t) - fakeHTTPClient = &fakes.FakeHTTPClient{} - responseBody := io.NopCloser(bytes.NewReader([]byte(`{ - "id_token": "abc", - "token_type": "Test", - "expires_in": 86400, - "scope": "Test", - "access_token": "LetMeIn", - "refresh_token": "LetMeInAgain"}`))) - fakeHTTPClient.DoReturns(&http.Response{ - StatusCode: 200, - Body: responseBody, - }, nil) - httpRestClient = fakeHTTPClient - token, err := GetAccessTokenFromAPIToken("asdas", issuerURL) - if err != nil { - fmt.Println(err) - fmt.Println("Error...................................") - } - assert.Nil(err) - assert.Equal("LetMeIn", token.AccessToken) -} - -func TestGetAccessTokenFromAPIToken_Err(t *testing.T) { - assert := assert.New(t) - - token, err := GetAccessTokenFromAPIToken("asdas", "example.com") - assert.NotNil(err) - assert.Nil(token) -} -func TestGetAccessTokenFromAPIToken_FailStatus(t *testing.T) { - assert := assert.New(t) - fakeHTTPClient := &fakes.FakeHTTPClient{} - responseBody := io.NopCloser(bytes.NewReader([]byte(``))) - fakeHTTPClient.DoReturns(&http.Response{ - StatusCode: 403, - Body: responseBody, - }, nil) - httpRestClient = fakeHTTPClient - token, err := GetAccessTokenFromAPIToken("asdas", issuerURL) - assert.NotNil(err) - assert.Contains(err.Error(), "obtain access token") - assert.Nil(token) -} - -func TestGetAccessTokenFromAPIToken_InvalidResponse(t *testing.T) { - assert := assert.New(t) - fakeHTTPClient := &fakes.FakeHTTPClient{} - responseBody := io.NopCloser(bytes.NewReader([]byte(`[{ - "id_token": "abc", - "token_type": "Test", - "expires_in": 86400, - "scope": "Test", - "access_token": "LetMeIn", - "refresh_token": "LetMeInAgain"}]`))) - fakeHTTPClient.DoReturns(&http.Response{ - StatusCode: 200, - Body: responseBody, - }, nil) - httpRestClient = fakeHTTPClient - - token, err := GetAccessTokenFromAPIToken("asdas", issuerURL) - assert.NotNil(err) - assert.Contains(err.Error(), "could not unmarshal") - assert.Nil(token) -} -func TestIsExpired(t *testing.T) { - assert := assert.New(t) - - testTime := time.Now().Add(-time.Minute) - assert.True(IsExpired(testTime)) - - testTime = time.Now().Add(time.Minute * 30) - assert.False(IsExpired(testTime)) -} - -func generateJWTToken(claims string) string { - hm := hmac.New(sha256.New, []byte("secret")) - _, _ = hm.Write([]byte(fmt.Sprintf( - "%s.%s", - base64.RawURLEncoding.EncodeToString([]byte(JWTHeader)), - base64.RawURLEncoding.EncodeToString([]byte(claims)), - ))) - sha := hex.EncodeToString(hm.Sum(nil)) - return fmt.Sprintf( - "%s.%s.%s", - base64.RawURLEncoding.EncodeToString([]byte(JWTHeader)), - base64.RawURLEncoding.EncodeToString([]byte(claims)), - sha, - ) -} - -func TestParseToken_ParseFailure(t *testing.T) { - assert := assert.New(t) - - // Pass in incorrectly formatted AccessToken - tkn := oauth2.Token{ - AccessToken: "LetMeIn", - TokenType: "Bearer", - RefreshToken: "LetMeInAgain", - Expiry: time.Now().Add(time.Minute * 30), - } - - context, err := ParseToken(&tkn) - assert.NotNil(err) - assert.Contains(err.Error(), "invalid") - assert.Nil(context) -} - -func TestIDTokenFromTokenSource_getIDToken(t *testing.T) { - assert := assert.New(t) - - // Pass in incorrectly formatted AccessToken - tkn := oauth2.Token{ - AccessToken: "LetMeIn", - TokenType: "Bearer", - RefreshToken: "LetMeInAgain", - Expiry: time.Now().Add(time.Minute * 30), - } - tknExt := tkn.WithExtra(map[string]interface{}{ - "id_token": "idtoken", - }) - idtoken := IDTokenFromTokenSource(tknExt) - assert.Contains(idtoken, "idtoken") -} - -func TestParseToken_MissingUsername(t *testing.T) { - assert := assert.New(t) - - accessToken := generateJWTToken( - `{"sub":"1234567890","name":"John Doe","iat":1516239022}`, - ) - tkn := oauth2.Token{ - AccessToken: accessToken, - TokenType: "Bearer", - RefreshToken: "LetMeInAgain", - Expiry: time.Now().Add(time.Minute * 30), - } - - context, err := ParseToken(&tkn) - assert.NotNil(err) - assert.Contains(err.Error(), "could not parse username") - assert.Nil(context) -} - -func TestParseToken_MissingContextName(t *testing.T) { - assert := assert.New(t) - - accessToken := generateJWTToken( - `{"sub":"1234567890","username":"John Doe","orgID":1516239022}`, - ) - tkn := oauth2.Token{ - AccessToken: accessToken, - TokenType: "Bearer", - RefreshToken: "LetMeInAgain", - Expiry: time.Now().Add(time.Minute * 30), - } - - context, err := ParseToken(&tkn) - assert.NotNil(err) - assert.Contains(err.Error(), "could not parse orgID") - assert.Nil(context) -} - -func TestParseToken(t *testing.T) { - assert := assert.New(t) - - accessToken := generateJWTToken( - `{"sub":"1234567890","username":"John Doe","context_name":"1516239022"}`, - ) - tkn := oauth2.Token{ - AccessToken: accessToken, - TokenType: "Bearer", - RefreshToken: "LetMeInAgain", - Expiry: time.Now().Add(time.Minute * 30), - } - - claim, err := ParseToken(&tkn) - assert.Nil(err) - assert.NotNil(claim) - - assert.Equal("John Doe", claim.Username) - assert.Equal("1516239022", claim.OrgID) - assert.Empty(claim.Permissions) -} - -func TestGetToken_Valid_NotExpired(t *testing.T) { - assert := assert.New(t) - - accessToken := generateJWTToken( - `{"sub":"1234567890","username":"joe","context_name":"1516239022"}`, - ) - expireTime := time.Now().Add(time.Minute * 30) - - serverAuth := configapi.GlobalServerAuth{ - Issuer: "https://oidc.example.com", - UserName: "jdoe", - AccessToken: accessToken, - IDToken: "xxyyzz", - RefreshToken: "sprite", - Expiration: v1.NewTime(expireTime), - Type: "client", - } - - tok, err := GetToken(&serverAuth) - assert.Nil(err) - assert.NotNil(tok) - assert.Equal(accessToken, tok.AccessToken) - assert.Equal(expireTime, tok.Expiry) -} - -func TestGetToken_Expired(t *testing.T) { - assert := assert.New(t) - - accessToken := generateJWTToken( - `{"sub":"1234567890","username":"joe","context_name":"1516239022"}`, - ) - expireTime := time.Now().Add(-time.Minute * 30) - - serverAuth := configapi.GlobalServerAuth{ - Issuer: "https://oidc.example.com", - UserName: "jdoe", - AccessToken: accessToken, - IDToken: "xxyyzz", - RefreshToken: "sprite", - Expiration: v1.NewTime(expireTime), - Type: "client", - } - - fakeHTTPClient := &fakes.FakeHTTPClient{} - responseBody := io.NopCloser(bytes.NewReader([]byte(`{ - "id_token": "abc", - "token_type": "Test", - "expires_in": 86400, - "scope": "Test", - "access_token": "LetMeIn", - "refresh_token": "LetMeInAgain"}`))) - fakeHTTPClient.DoReturns(&http.Response{ - StatusCode: 200, - Body: responseBody, - }, nil) - httpRestClient = fakeHTTPClient - - tok, err := GetToken(&serverAuth) - assert.Nil(err) - assert.NotNil(tok) - assert.Equal(tok.AccessToken, "LetMeIn") - assert.Equal(tok.RefreshToken, "LetMeInAgain") -} diff --git a/cli/core/pkg/auth/tkg/cluster_pinniped_info.go b/cli/core/pkg/auth/tkg/cluster_pinniped_info.go deleted file mode 100644 index 04ca71b8fd..0000000000 --- a/cli/core/pkg/auth/tkg/cluster_pinniped_info.go +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgauth - -import ( - "crypto/tls" - "crypto/x509" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strings" - "time" - - "github.com/pkg/errors" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - - netutil "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/auth/utils/net" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" -) - -const ( - KubePublicNamespace = "kube-public" -) - -type clusterInfoConfig struct { - Version string `json:"apiVersion"` - Data struct { - Kubeconfig string `json:"kubeconfig"` - } - Kind string `json:"kind"` -} - -// GetClusterInfoFromCluster gets the cluster Info by accessing the cluster-info configMap in kube-public namespace -func GetClusterInfoFromCluster(clusterAPIServerURL, configmapName string) (*clientcmdapi.Cluster, error) { - clusterAPIServerURL = strings.TrimSpace(clusterAPIServerURL) - if !strings.HasPrefix(clusterAPIServerURL, "https://") && !strings.HasPrefix(clusterAPIServerURL, "http://") { - clusterAPIServerURL = "https://" + clusterAPIServerURL - } - _, err := url.Parse(clusterAPIServerURL) - if err != nil { - return nil, errors.Wrap(err, "failed to parse endpoint URL") - } - - clusterAPIServerURL = strings.TrimRight(clusterAPIServerURL, " /") - clusterInfoURL := clusterAPIServerURL + fmt.Sprintf("/api/v1/namespaces/%s/configmaps/%s", KubePublicNamespace, configmapName) - req, _ := http.NewRequest("GET", clusterInfoURL, http.NoBody) - // To get the cluster ca certificate first time, we need to use skip verify the server certificate, - // all the later communications to cluster would be using CA after this call - clusterClient := &http.Client{ - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - // #nosec - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: true, - }, - }, - Timeout: time.Second * 10, - } - response, err := clusterClient.Do(req) - if err != nil { - return nil, errors.Wrap(err, "failed to get cluster-info from the end-point") - } - defer response.Body.Close() - - if response.StatusCode != http.StatusOK { - return nil, errors.New("failed to get cluster-info from the end-point") - } - - responseBody, err := io.ReadAll(response.Body) - if err != nil { - return nil, errors.Wrap(err, "failed to read the response body") - } - - var clusterIC clusterInfoConfig - err = json.Unmarshal(responseBody, &clusterIC) - if err != nil { - return nil, errors.Wrap(err, "error parsing http response body ") - } - - config, err := clientcmd.Load([]byte(clusterIC.Data.Kubeconfig)) - if err != nil { - return nil, errors.Wrap(err, "failed to load the kubeconfig") - } - - if len(config.Clusters) == 0 { - return nil, errors.New("failed to get cluster information ") - } - // since it is a map with one cluster object, get the first entry - var cluster *clientcmdapi.Cluster - for _, cluster = range config.Clusters { - break - } - - return cluster, nil -} - -// GetPinnipedInfoFromCluster gets the Pinniped Info by accessing the pinniped-info configMap in kube-public namespace -// 'discoveryPort' is used to optionally override the port used for discovery. This may be needed on setups that expose -// discovery information to unauthenticated users on a different port (for instance, to avoid the need to anonymous auth -// on the apiserver). By default, the endpoint from the cluster-info is used. -func GetPinnipedInfoFromCluster(clusterInfo *clientcmdapi.Cluster, discoveryPort *int) (*pinnipedinfo.PinnipedInfo, error) { - endpoint := strings.TrimRight(clusterInfo.Server, " /") - var err error - if discoveryPort != nil { - endpoint, err = netutil.SetPort(clusterInfo.Server, *discoveryPort) - if err != nil { - return nil, errors.Wrap(err, "failed to override discovery port") - } - } - pinnipedInfoURL := endpoint + fmt.Sprintf("/api/v1/namespaces/%s/configmaps/pinniped-info", KubePublicNamespace) - req, _ := http.NewRequest("GET", pinnipedInfoURL, http.NoBody) - pool := x509.NewCertPool() - pool.AppendCertsFromPEM(clusterInfo.CertificateAuthorityData) - clusterClient := &http.Client{ - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - TLSClientConfig: &tls.Config{ - RootCAs: pool, - MinVersion: tls.VersionTLS12, - }, - }, - Timeout: time.Second * 10, - } - - response, err := clusterClient.Do(req) - if err != nil { - return nil, errors.Wrap(err, "failed to get pinniped-info from the cluster") - } - defer response.Body.Close() - - if response.StatusCode != http.StatusOK { - if response.StatusCode == http.StatusNotFound { - return nil, nil - } - return nil, fmt.Errorf("failed to get pinniped-info from the cluster. Status code: %+v", response.StatusCode) - } - - responseBody, err := io.ReadAll(response.Body) - if err != nil { - return nil, errors.Wrap(err, "failed to read the response body") - } - - return pinnipedinfo.ByteArrayToPinnipedInfo(responseBody) -} diff --git a/cli/core/pkg/auth/tkg/cluster_pinniped_info_test.go b/cli/core/pkg/auth/tkg/cluster_pinniped_info_test.go deleted file mode 100644 index 2d052a1f21..0000000000 --- a/cli/core/pkg/auth/tkg/cluster_pinniped_info_test.go +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright 2021-2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgauth - -import ( - "crypto/x509" - "encoding/pem" - "net/http" - "net/url" - "strconv" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/ghttp" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - - fakehelper "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/fakes/helper" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" -) - -const ( - fakeIssuer = "https://fakeissuer.com" - fakeCluster = "fake-cluster" - fakeCAData = "fakeCAData" -) - -var _ = Describe("Kubeconfig Tests", func() { - var ( - err error - endpoint string - tlsserver *ghttp.Server - clustername string - issuer string - issuerCA string - servCert *x509.Certificate - ) - - Describe("Get cluster-info from the cluster", func() { - BeforeEach(func() { - tlsserver = ghttp.NewTLSServer() - servCert = tlsserver.HTTPTestServer.Certificate() - endpoint = tlsserver.URL() - }) - AfterEach(func() { - tlsserver.Close() - }) - Context("When the configMap 'cluster-info' is not present in kube-public namespace", func() { - BeforeEach(func() { - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - _, err = GetClusterInfoFromCluster(endpoint, "cluster-info") - }) - It("should return the error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("failed to get cluster-info")) - }) - }) - Context("When the configMap 'cluster-info' is present but the returned format is incorrect ", func() { - BeforeEach(func() { - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusOK, "fake-format-value"), - ), - ) - _, err = GetClusterInfoFromCluster(endpoint, "cluster-info") - }) - It("should return the error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("error parsing http response body")) - }) - }) - Context("When the configMap 'cluster-info' is present in kube-public namespace", func() { - var cluster *clientcmdapi.Cluster - BeforeEach(func() { - clusterInfo := fakehelper.GetFakeClusterInfo(endpoint, servCert) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusOK, clusterInfo), - ), - ) - cluster, err = GetClusterInfoFromCluster(endpoint, "cluster-info") - }) - It("should return the cluster information", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(cluster.Server).Should(Equal(endpoint)) - }) - }) - Context("When a different ConfigMap from the kube-public namespace is used for discovery", func() { - var cluster *clientcmdapi.Cluster - BeforeEach(func() { - clusterInfo := fakehelper.GetFakeClusterInfo(endpoint, servCert) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/vip-cluster-info"), - ghttp.RespondWith(http.StatusOK, clusterInfo), - ), - ) - cluster, err = GetClusterInfoFromCluster(endpoint, "vip-cluster-info") - }) - It("should return the cluster information", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(cluster.Server).Should(Equal(endpoint)) - }) - }) - }) - - Describe("Get pinniped-info from the cluster", func() { - BeforeEach(func() { - tlsserver = ghttp.NewTLSServer() - servCert = tlsserver.HTTPTestServer.Certificate() - endpoint = tlsserver.URL() - }) - AfterEach(func() { - tlsserver.Close() - }) - - Context("When the configMap 'pinniped-info' is not present in kube-public namespace", func() { - var cluster clientcmdapi.Cluster - var gotPinnipedInfo *pinnipedinfo.PinnipedInfo - BeforeEach(func() { - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - cluster.Server = endpoint - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - cluster.CertificateAuthorityData = certBytes - gotPinnipedInfo, err = GetPinnipedInfoFromCluster(&cluster, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotPinnipedInfo).Should(BeNil()) - }) - }) - Context("When the configMap 'pinniped-info' is present but the returned format is incorrect", func() { - var cluster clientcmdapi.Cluster - BeforeEach(func() { - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusOK, "fake-format-value"), - ), - ) - cluster.Server = endpoint - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - cluster.CertificateAuthorityData = certBytes - _, err = GetPinnipedInfoFromCluster(&cluster, nil) - }) - It("should return the pinniped-info successfully", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("error parsing http response body")) - }) - }) - Context("When the configMap 'pinniped-info' is present in kube-public namespace", func() { - var cluster clientcmdapi.Cluster - var gotPinnipedInfo *pinnipedinfo.PinnipedInfo - BeforeEach(func() { - clustername = fakeCluster - issuer = fakeIssuer - issuerCA = fakeCAData - pinnipedInfo := fakehelper.GetFakePinnipedInfo(pinnipedinfo.PinnipedInfo{ - ClusterName: clustername, - Issuer: issuer, - IssuerCABundleData: issuerCA, - }) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusOK, pinnipedInfo), - ), - ) - cluster.Server = endpoint - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - cluster.CertificateAuthorityData = certBytes - gotPinnipedInfo, err = GetPinnipedInfoFromCluster(&cluster, nil) - }) - It("should return the pinniped-info successfully", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotPinnipedInfo.ClusterName).Should(Equal(clustername)) - Expect(gotPinnipedInfo.Issuer).Should(Equal(issuer)) - Expect(gotPinnipedInfo.IssuerCABundleData).Should(Equal(issuerCA)) - }) - }) - Context("When a different port is used for discovery of 'pinniped-info'", func() { - var cluster clientcmdapi.Cluster - var gotPinnipedInfo *pinnipedinfo.PinnipedInfo - var discoveryTLSServer *ghttp.Server - BeforeEach(func() { - // The second TLS server mimics the different endpoints for - // kube-apiserver and discovery. - discoveryTLSServer = ghttp.NewTLSServer() - discoveryEndpoint := discoveryTLSServer.URL() - // URL is valid, ports are expected to fit in 16 bits, so we're - // skipping a bunch of error handling. - u, _ := url.Parse(discoveryEndpoint) - discoveryPort64, _ := strconv.ParseInt(u.Port(), 10, 64) - discoveryPort := int(discoveryPort64) - - clustername = fakeCluster - issuer = fakeIssuer - issuerCA = fakeCAData - pinnipedInfo := fakehelper.GetFakePinnipedInfo(pinnipedinfo.PinnipedInfo{ - ClusterName: clustername, - Issuer: issuer, - IssuerCABundleData: issuerCA, - }) - discoveryTLSServer.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusOK, pinnipedInfo), - ), - ) - cluster.Server = endpoint - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - cluster.CertificateAuthorityData = certBytes - gotPinnipedInfo, err = GetPinnipedInfoFromCluster(&cluster, &discoveryPort) - }) - It("should return the pinniped-info successfully", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotPinnipedInfo.ClusterName).Should(Equal(clustername)) - Expect(gotPinnipedInfo.Issuer).Should(Equal(issuer)) - Expect(gotPinnipedInfo.IssuerCABundleData).Should(Equal(issuerCA)) - }) - }) - Context("When the concierge endpoint is distinct from the cluster endpoint", func() { - var cluster clientcmdapi.Cluster - var gotPinnipedInfo *pinnipedinfo.PinnipedInfo - conciergeEndpoint := "my-favourite-concierge.com" - BeforeEach(func() { - clustername = fakeCluster - issuer = fakeIssuer - issuerCA = fakeCAData - pinnipedInfo := fakehelper.GetFakePinnipedInfo(pinnipedinfo.PinnipedInfo{ - ClusterName: clustername, - Issuer: issuer, - IssuerCABundleData: issuerCA, - ConciergeEndpoint: conciergeEndpoint, - }) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusOK, pinnipedInfo), - ), - ) - cluster.Server = endpoint - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - cluster.CertificateAuthorityData = certBytes - gotPinnipedInfo, err = GetPinnipedInfoFromCluster(&cluster, nil) - }) - It("should return the pinniped-info successfully", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotPinnipedInfo.ClusterName).Should(Equal(clustername)) - Expect(gotPinnipedInfo.Issuer).Should(Equal(issuer)) - Expect(gotPinnipedInfo.IssuerCABundleData).Should(Equal(issuerCA)) - Expect(gotPinnipedInfo.ConciergeEndpoint).Should(Equal(conciergeEndpoint)) - }) - }) - }) -}) diff --git a/cli/core/pkg/auth/tkg/doc.go b/cli/core/pkg/auth/tkg/doc.go deleted file mode 100644 index 5a515a64d3..0000000000 --- a/cli/core/pkg/auth/tkg/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tkgauth provides TKG authentication functions. -package tkgauth diff --git a/cli/core/pkg/auth/tkg/kube_config.go b/cli/core/pkg/auth/tkg/kube_config.go deleted file mode 100644 index 4ae9a6329b..0000000000 --- a/cli/core/pkg/auth/tkg/kube_config.go +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright 2021-2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgauth - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "os" - "path/filepath" - "time" - - "github.com/pkg/errors" - "k8s.io/client-go/discovery" - clientauthenticationv1beta1 "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - - kubeutils "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/auth/utils/kubeconfig" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" -) - -const ( - // ConciergeAuthenticatorType is the pinniped concierge authenticator type - ConciergeAuthenticatorType = "jwt" - - // ConciergeAuthenticatorName is the pinniped concierge authenticator object name - ConciergeAuthenticatorName = "tkg-jwt-authenticator" - - // PinnipedOIDCScopes are the scopes of pinniped oidc - PinnipedOIDCScopes = "offline_access,openid,pinniped:request-audience" - - // TanzuLocalKubeDir is the local config directory - TanzuLocalKubeDir = ".kube-tanzu" - - // TanzuKubeconfigFile is the name the of the kubeconfig file - TanzuKubeconfigFile = "config" - - // DefaultPinnipedLoginTimeout is the default login timeout - DefaultPinnipedLoginTimeout = time.Minute - - // DefaultClusterInfoConfigMap is the default ConfigMap looked up in the kube-public namespace when generating a kubeconfig. - DefaultClusterInfoConfigMap = "cluster-info" -) - -// KubeConfigOptions contains the kubeconfig options -type KubeConfigOptions struct { - MergeFilePath string -} - -// A DiscoveryStrategy contains information about how various discovery -// information should be looked up from an endpoint when setting up a -// kubeconfig. -type DiscoveryStrategy struct { - DiscoveryPort *int - ClusterInfoConfigMap string -} - -// KubeconfigWithPinnipedAuthLoginPlugin prepares the kubeconfig with tanzu pinniped-auth login as client-go exec plugin -func KubeconfigWithPinnipedAuthLoginPlugin(endpoint string, options *KubeConfigOptions, discoveryStrategy DiscoveryStrategy) (mergeFilePath, currentContext string, err error) { - clusterInfo, err := GetClusterInfoFromCluster(endpoint, discoveryStrategy.ClusterInfoConfigMap) - if err != nil { - err = errors.Wrap(err, "failed to get cluster-info") - return - } - - pinnipedInfo, err := GetPinnipedInfoFromCluster(clusterInfo, discoveryStrategy.DiscoveryPort) - if err != nil { - err = errors.Wrap(err, "failed to get pinniped-info") - return - } - - if pinnipedInfo == nil { - err = errors.New("failed to get pinniped-info from cluster") - return - } - - config, err := GetPinnipedKubeconfig(clusterInfo, pinnipedInfo, pinnipedInfo.ClusterName, pinnipedInfo.Issuer) - if err != nil { - err = errors.Wrap(err, "unable to get the kubeconfig") - return - } - - kubeconfigBytes, err := json.Marshal(config) - if err != nil { - err = errors.Wrap(err, "unable to marshall the kubeconfig") - return - } - - mergeFilePath = "" - if options != nil && options.MergeFilePath != "" { - mergeFilePath = options.MergeFilePath - } else { - mergeFilePath, err = TanzuLocalKubeConfigPath() - if err != nil { - err = errors.Wrap(err, "unable to get the Tanzu local kubeconfig path") - return - } - } - - err = kubeutils.MergeKubeConfigWithoutSwitchContext(kubeconfigBytes, mergeFilePath) - if err != nil { - err = errors.Wrap(err, "unable to merge cluster kubeconfig to the Tanzu local kubeconfig path") - return - } - currentContext = config.CurrentContext - return mergeFilePath, currentContext, err -} - -// GetServerKubernetesVersion uses the kubeconfig to get the server k8s version. -func GetServerKubernetesVersion(kubeconfigPath, context string) (string, error) { - var discoveryClient discovery.DiscoveryInterface - kubeConfigBytes, err := loadKubeconfigAndEnsureContext(kubeconfigPath, context) - if err != nil { - return "", errors.Errorf("unable to read kubeconfig") - } - - restConfig, err := clientcmd.RESTConfigFromKubeConfig(kubeConfigBytes) - if err != nil { - return "", errors.Errorf("Unable to set up rest config due to : %v", err) - } - // set the timeout to give user sufficient time to enter the login credentials - restConfig.Timeout = DefaultPinnipedLoginTimeout - - discoveryClient, err = discovery.NewDiscoveryClientForConfig(restConfig) - if err != nil { - return "", errors.Errorf("Error getting discovery client due to : %v", err) - } - - if _, err := discoveryClient.ServerVersion(); err != nil { - return "", errors.Errorf("Failed to invoke API on cluster : %v", err) - } - - return "", nil -} - -func loadKubeconfigAndEnsureContext(kubeConfigPath, context string) ([]byte, error) { - config, err := clientcmd.LoadFromFile(kubeConfigPath) - - if err != nil { - return []byte{}, err - } - if context != "" { - config.CurrentContext = context - } - - return clientcmd.Write(*config) -} - -// GetPinnipedKubeconfig generate kubeconfig given cluster-info and pinniped-info and the requested audience -func GetPinnipedKubeconfig(cluster *clientcmdapi.Cluster, pinnipedInfo *pinnipedinfo.PinnipedInfo, clustername, audience string) (*clientcmdapi.Config, error) { - execConfig := clientcmdapi.ExecConfig{ - APIVersion: clientauthenticationv1beta1.SchemeGroupVersion.String(), - Args: []string{}, - Env: []clientcmdapi.ExecEnvVar{}, - } - - execConfig.Command = "tanzu" - execConfig.Args = append([]string{"pinniped-auth", "login"}, execConfig.Args...) - - conciergeEndpoint := cluster.Server - if pinnipedInfo.ConciergeEndpoint != "" { - conciergeEndpoint = pinnipedInfo.ConciergeEndpoint - } - - // configure concierge - execConfig.Args = append(execConfig.Args, - "--enable-concierge", - "--concierge-authenticator-name="+ConciergeAuthenticatorName, - "--concierge-authenticator-type="+ConciergeAuthenticatorType, - "--concierge-endpoint="+conciergeEndpoint, - "--concierge-ca-bundle-data="+base64.StdEncoding.EncodeToString(cluster.CertificateAuthorityData), - "--issuer="+pinnipedInfo.Issuer, // configure OIDC - "--scopes="+PinnipedOIDCScopes, - "--ca-bundle-data="+pinnipedInfo.IssuerCABundleData, - "--request-audience="+audience, - ) - - if os.Getenv("TANZU_CLI_PINNIPED_AUTH_LOGIN_SKIP_BROWSER") != "" { - execConfig.Args = append(execConfig.Args, "--skip-browser") - } - - username := "tanzu-cli-" + clustername - contextName := fmt.Sprintf("%s@%s", username, clustername) - - return &clientcmdapi.Config{ - Kind: "Config", - APIVersion: clientcmdapi.SchemeGroupVersion.Version, - Clusters: map[string]*clientcmdapi.Cluster{clustername: cluster}, - AuthInfos: map[string]*clientcmdapi.AuthInfo{username: {Exec: &execConfig}}, - Contexts: map[string]*clientcmdapi.Context{contextName: {Cluster: clustername, AuthInfo: username}}, - CurrentContext: contextName, - }, nil -} - -// TanzuLocalKubeConfigPath returns the local tanzu kubeconfig path -func TanzuLocalKubeConfigPath() (path string, err error) { - home, err := os.UserHomeDir() - if err != nil { - return path, errors.Wrap(err, "could not locate local tanzu dir") - } - path = filepath.Join(home, TanzuLocalKubeDir) - // create tanzu kubeconfig directory - if _, err := os.Stat(path); os.IsNotExist(err) { - err = os.MkdirAll(path, 0755) - if err != nil { - return "", err - } - } else if err != nil { - return "", err - } - - configFilePath := filepath.Join(path, TanzuKubeconfigFile) - - return configFilePath, nil -} diff --git a/cli/core/pkg/auth/tkg/kube_config_test.go b/cli/core/pkg/auth/tkg/kube_config_test.go deleted file mode 100644 index db6b462e4f..0000000000 --- a/cli/core/pkg/auth/tkg/kube_config_test.go +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgauth_test - -import ( - "crypto/x509" - "encoding/base64" - "encoding/pem" - "fmt" - "net/http" - "os" - "path/filepath" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/onsi/gomega/ghttp" - clientauthenticationv1beta1 "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - - tkgauth "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/auth/tkg" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/fakes/helper" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" -) - -var testingDir string - -func TestTkgAuth(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cli/core/pkg/auth/tkg Suite") -} - -const kubeconfigPath = "../../fakes/config/kubeconfig_server_ver.yaml" - -var _ = Describe("Unit tests for tkg auth", func() { - var ( - err error - endpoint string - tlsserver *ghttp.Server - servCert *x509.Certificate - ) - - const ( - clustername = "fake-cluster" - issuer = "https://fakeissuer.com" - issuerCA = "fakeCAData" - ) - - Describe("Kubeconfig for Management cluster", func() { - BeforeEach(func() { - tlsserver = ghttp.NewTLSServer() - servCert = tlsserver.HTTPTestServer.Certificate() - endpoint = tlsserver.URL() - err = createTempDirectory("kubeconfig-test") - Expect(err).ToNot(HaveOccurred()) - }) - AfterEach(func() { - tlsserver.Close() - deleteTempDirectory() - }) - Context("When the configMap 'cluster-info' is not present in kube-public namespace", func() { - BeforeEach(func() { - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - _, _, err = tkgauth.KubeconfigWithPinnipedAuthLoginPlugin(endpoint, nil, tkgauth.DiscoveryStrategy{ClusterInfoConfigMap: tkgauth.DefaultClusterInfoConfigMap}) - }) - It("should return the error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("failed to get cluster-info")) - }) - }) - Context("When the configMap 'pinniped-info' is not present in kube-public namespace", func() { - BeforeEach(func() { - clusterInfo := GetFakeClusterInfo(endpoint, servCert) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusOK, clusterInfo), - ), - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - _, _, err = tkgauth.KubeconfigWithPinnipedAuthLoginPlugin(endpoint, nil, tkgauth.DiscoveryStrategy{ClusterInfoConfigMap: tkgauth.DefaultClusterInfoConfigMap}) - }) - It("should return the error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("failed to get pinniped-info")) - }) - }) - Context("When the configMap 'pinniped-info' is present in kube-public namespace", func() { - var kubeConfigPath, kubeContext, kubeconfigMergeFilePath string - BeforeEach(func() { - var clusterInfo, pinnipedInfo string - clusterInfo = GetFakeClusterInfo(endpoint, servCert) - pinnipedInfo = helper.GetFakePinnipedInfo( - pinnipedinfo.PinnipedInfo{ - ClusterName: clustername, - Issuer: issuer, - IssuerCABundleData: issuerCA, - }) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusOK, clusterInfo), - ), - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusOK, pinnipedInfo), - ), - ) - kubeconfigMergeFilePath = testingDir + "/config" - options := &tkgauth.KubeConfigOptions{ - MergeFilePath: kubeconfigMergeFilePath, - } - kubeConfigPath, kubeContext, err = tkgauth.KubeconfigWithPinnipedAuthLoginPlugin(endpoint, options, tkgauth.DiscoveryStrategy{ClusterInfoConfigMap: tkgauth.DefaultClusterInfoConfigMap}) - }) - It("should generate the kubeconfig and merge the kubeconfig to given path", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(kubeConfigPath).Should(Equal(kubeconfigMergeFilePath)) - Expect(len(kubeContext)).Should(Not(Equal(0))) - config, err := clientcmd.LoadFromFile(kubeConfigPath) - Expect(err).ToNot(HaveOccurred()) - gotClusterName := config.Contexts[kubeContext].Cluster - cluster := config.Clusters[config.Contexts[kubeContext].Cluster] - user := config.AuthInfos[config.Contexts[kubeContext].AuthInfo] - Expect(cluster.Server).To(Equal(endpoint)) - Expect(gotClusterName).To(Equal(clustername)) - expectedExecConf := getExpectedExecConfig(endpoint, issuer, issuerCA, servCert) - Expect(*user.Exec).To(Equal(*expectedExecConf)) - }) - }) - Describe("Get Tanzu local Kubeconfig path", func() { - var localPath string - Context("When TanzuLocalKubeConfigPath() is called", func() { - BeforeEach(func() { - localPath, err = tkgauth.TanzuLocalKubeConfigPath() - }) - It("should return the tanzu local kubeconfig path", func() { - Expect(err).ToNot(HaveOccurred()) - home, err := os.UserHomeDir() - Expect(err).ToNot(HaveOccurred()) - Expect(localPath).Should(Equal(filepath.Join(home, tkgauth.TanzuLocalKubeDir, tkgauth.TanzuKubeconfigFile))) - }) - }) - }) - - }) -}) - -var _ = Describe("Unit tests for tkg auth - GetServerKubernetesVersion", func() { - Context("When valid kubeconfig path and context passed, but server not defined for context", func() { - It("should return error", func() { - _, err := tkgauth.GetServerKubernetesVersion(kubeconfigPath, "horse-cluster") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("cluster has no server defined")) - }) - }) - Context("When empty kubeconfig path passed", func() { - It("should return error", func() { - _, err := tkgauth.GetServerKubernetesVersion("", "horse-cluster") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("unable to read kubeconfig")) - }) - }) -}) - -func GetFakeClusterInfo(server string, cert *x509.Certificate) string { - clusterInfoJSON := ` - { - "kind": "ConfigMap", - "apiVersion": "v1", - "data": { - "kubeconfig": "apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: %s\n server: %s\n name: \"\"\ncontexts: null\ncurrent-context: \"\"\nkind: Config\npreferences: {}\nusers: null\n" - }, - "metadata": { - "name": "cluster-info", - "namespace": "kube-public" - } - }` - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: cert.Raw}) - clusterInfoJSON = fmt.Sprintf(clusterInfoJSON, base64.StdEncoding.EncodeToString(certBytes), server) - - return clusterInfoJSON -} - -func getExpectedExecConfig(endpoint string, issuer string, issuerCA string, servCert *x509.Certificate) *clientcmdapi.ExecConfig { - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - args := []string{ - "pinniped-auth", "login", - "--enable-concierge", - "--concierge-authenticator-name=" + tkgauth.ConciergeAuthenticatorName, - "--concierge-authenticator-type=" + tkgauth.ConciergeAuthenticatorType, - "--concierge-endpoint=" + endpoint, - "--concierge-ca-bundle-data=" + base64.StdEncoding.EncodeToString(certBytes), - "--issuer=" + issuer, - "--scopes=" + tkgauth.PinnipedOIDCScopes, - "--ca-bundle-data=" + issuerCA, - "--request-audience=" + issuer, - } - - execConfig := &clientcmdapi.ExecConfig{ - APIVersion: clientauthenticationv1beta1.SchemeGroupVersion.String(), - Args: args, - Env: []clientcmdapi.ExecEnvVar{}, - Command: "tanzu", - InteractiveMode: "IfAvailable", - } - return execConfig -} - -func createTempDirectory(prefix string) error { - var err error - testingDir, err = os.MkdirTemp("", prefix) - if err != nil { - fmt.Println("Error TempDir: ", err.Error()) - return err - } - return nil -} -func deleteTempDirectory() { - os.Remove(testingDir) -} diff --git a/cli/core/pkg/auth/utils/kubeconfig/kubeconfig.go b/cli/core/pkg/auth/utils/kubeconfig/kubeconfig.go deleted file mode 100644 index 956b7a9819..0000000000 --- a/cli/core/pkg/auth/utils/kubeconfig/kubeconfig.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package kubeconfig provides kubeconfig access functions. -package kubeconfig - -import ( - "os" - - "github.com/imdario/mergo" - "github.com/pkg/errors" - "k8s.io/client-go/tools/clientcmd" -) - -func getDefaultKubeConfigFile() string { - rules := clientcmd.NewDefaultClientConfigLoadingRules() - return rules.GetDefaultFilename() -} - -// MergeKubeConfigWithoutSwitchContext merges kubeconfig without updating kubecontext -func MergeKubeConfigWithoutSwitchContext(kubeConfig []byte, mergeFile string) error { - if mergeFile == "" { - mergeFile = getDefaultKubeConfigFile() - } - newConfig, err := clientcmd.Load(kubeConfig) - if err != nil { - return errors.Wrap(err, "unable to load kubeconfig") - } - - if _, err := os.Stat(mergeFile); os.IsNotExist(err) { - return clientcmd.WriteToFile(*newConfig, mergeFile) - } - - dest, err := clientcmd.LoadFromFile(mergeFile) - if err != nil { - return errors.Wrap(err, "unable to load kube config") - } - - context := dest.CurrentContext - err = mergo.MergeWithOverwrite(dest, newConfig) - if err != nil { - return errors.Wrap(err, "failed to merge config") - } - dest.CurrentContext = context - - return clientcmd.WriteToFile(*dest, mergeFile) -} diff --git a/cli/core/pkg/auth/utils/kubeconfig/kubeconfig_test.go b/cli/core/pkg/auth/utils/kubeconfig/kubeconfig_test.go deleted file mode 100644 index b9317ff186..0000000000 --- a/cli/core/pkg/auth/utils/kubeconfig/kubeconfig_test.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package kubeconfig provides kubeconfig access functions. -package kubeconfig - -import ( - "os" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestTkgAuth(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cli/core/pkg/auth/tkg/util/kubeconfig Suite") -} - -var ( - kubeconfiFilePath string - kubeconfiFilePath2 string - kubeconfiFilePath3 string -) - -const ConfigFilePermissions = 0o600 - -var _ = Describe("Unit tests for kubeconfig use cases", func() { - - Context("when valid kubeconfig file is provided", func() { - BeforeEach(func() { - kubeconfiFilePath = "../../../fakes/config/kubeconfig1.yaml" - kubeconfiFilePath2 = "../../../fakes/config/kubeconfig2.yaml" - kubeconfiFilePath3 = "../../../fakes/config/kubeconfig3_temp_rnhwe.yaml" - deleteTempFile(kubeconfiFilePath3) - }) - It("should merge with existing kubeconf file", func() { - copyFile(kubeconfiFilePath2, kubeconfiFilePath3) - kubeconfFileContent, _ := os.ReadFile(kubeconfiFilePath) - err := MergeKubeConfigWithoutSwitchContext(kubeconfFileContent, kubeconfiFilePath3) - Expect(err).To(BeNil()) - }) - It("should merge with existing empty kubeconf file", func() { - kubeconfFileContent, _ := os.ReadFile(kubeconfiFilePath) - err := MergeKubeConfigWithoutSwitchContext(kubeconfFileContent, kubeconfiFilePath3) - Expect(err).To(BeNil()) - }) - It("should return value for default kubeconfig file", func() { - defKubeConf := getDefaultKubeConfigFile() - Expect(defKubeConf).ToNot(BeNil()) - }) - }) -}) - -func copyFile(sourceFile, destFile string) { - input, _ := os.ReadFile(sourceFile) - _ = os.WriteFile(destFile, input, ConfigFilePermissions) -} - -func deleteTempFile(filename string) { - os.Remove(filename) -} diff --git a/cli/core/pkg/auth/utils/net/set_port.go b/cli/core/pkg/auth/utils/net/set_port.go deleted file mode 100644 index 58c4311129..0000000000 --- a/cli/core/pkg/auth/utils/net/set_port.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package net provides helpers to work with network addresses. -package net - -import ( - "fmt" - "net/url" - "strings" -) - -// SetPort takes a URL and returns it with the HTTPS scheme and the -// given port. -// If the endpoint is missing an HTTP(S) scheme, assumes input of the form -// host[:port]. -// This is mainly meant to handle the typical case of a user entering either -// just a host, host:port, or http(s)://host:port -func SetPort(endpoint string, portOverride int) (string, error) { - prefix := "" - // Preprocess the string depending on whether it has a scheme or not. - if strings.HasPrefix(endpoint, "https:") || strings.HasPrefix(endpoint, "http:") { - u, err := url.Parse(endpoint) - if err != nil { - return "", err - } - prefix = u.Hostname() - } else { - // No scheme. Strip out a port if it exists. - prefix = strings.Split(endpoint, ":")[0] - } - - return fmt.Sprintf("https://%s:%d", prefix, portOverride), nil -} diff --git a/cli/core/pkg/auth/utils/net/set_port_test.go b/cli/core/pkg/auth/utils/net/set_port_test.go deleted file mode 100644 index 020082faf3..0000000000 --- a/cli/core/pkg/auth/utils/net/set_port_test.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package net_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - netutil "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/auth/utils/net" -) - -func TestNetUtil(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Net util suite") -} - -var _ = Describe("Overriding ports in an endpoint", func() { - Context("when a port is provided", func() { - It("should override the port", func() { - endpoint := "https://foo.com:1234" - result, err := netutil.SetPort(endpoint, 443) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("https://foo.com:443")) - }) - }) - Context("when no scheme is provided", func() { - It("should override the port", func() { - endpoint := "foo.com" - result, err := netutil.SetPort(endpoint, 443) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("https://foo.com:443")) - }) - }) - Context("when no scheme is provided, but a port is set", func() { - It("should override the port", func() { - endpoint := "foo.com:6443" - result, err := netutil.SetPort(endpoint, 443) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("https://foo.com:443")) - }) - }) - Context("when a port with the same value as the overridden value is in the endpoint", func() { - It("should preserve the port", func() { - endpoint := "https://foo.com:443" - result, err := netutil.SetPort(endpoint, 443) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("https://foo.com:443")) - }) - }) -}) diff --git a/cli/core/pkg/auth/wcp/discovery.go b/cli/core/pkg/auth/wcp/discovery.go deleted file mode 100644 index 6d845269ad..0000000000 --- a/cli/core/pkg/auth/wcp/discovery.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package wcp provides helpers to interact with a vSphere Supervisor. -package wcp - -import ( - "fmt" - "net/http" - - "github.com/aunum/log" -) - -const ( - SupervisorVIPConfigMapName = "vip-cluster-info" -) - -// IsVSphereSupervisor probes the given endpoint on a well known vSphere -// Supervisor 'login banner' endpoint. -// Returns true iff it was able to successfully determine that the endpoint was -// a vSphere Supervisor. -func IsVSphereSupervisor(endpoint string, httpClient *http.Client) (bool, error) { - loginBannerURL := fmt.Sprintf("%s/wcp/loginbanner", endpoint) - - req, _ := http.NewRequest("GET", loginBannerURL, http.NoBody) - - resp, err := httpClient.Do(req) - if err != nil { - log.Debug("Failed to test for vSphere supervisor: %+v", err) - return false, err - } - defer resp.Body.Close() - - if resp.StatusCode == http.StatusOK { - log.Debug("Got login banner from server") - return true, nil - } - - log.Debug("Could not get login banner from server, response code = %+v", resp.StatusCode) - return false, nil -} diff --git a/cli/core/pkg/auth/wcp/discovery_test.go b/cli/core/pkg/auth/wcp/discovery_test.go deleted file mode 100644 index 4869a3b55c..0000000000 --- a/cli/core/pkg/auth/wcp/discovery_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package wcp_test - -import ( - "crypto/tls" - "errors" - "net/http" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/ghttp" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/auth/wcp" -) - -func TestWCPAuth(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "WCP Auth Suite") -} - -type errorRoundTripper struct{} - -func (e *errorRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { - return nil, errors.New("an error occurred") -} - -var _ = Describe("Tests for vSphere Supervisor discovery", func() { - var endpoint string - var httpClient *http.Client - var tlsServer *ghttp.Server - BeforeEach(func() { - tlsServer = ghttp.NewTLSServer() - endpoint = tlsServer.URL() - httpClient = &http.Client{ - Transport: &http.Transport{ - // #nosec - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: true, - }, - }, - } - }) - Context("When the given endpoint exposes a login banner endpoint", func() { - It("returns true", func() { - tlsServer.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/wcp/loginbanner"), - ghttp.RespondWith(http.StatusOK, "Hello World! This is a login banner."), - ), - ) - result, err := wcp.IsVSphereSupervisor(endpoint, httpClient) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(BeTrue()) - }) - }) - Context("When the given endpoint does not expose a login banner endpoint", func() { - It("returns false", func() { - tlsServer.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/wcp/loginbanner"), - ghttp.RespondWith(http.StatusNotFound, "I'm a 404"), - ), - ) - result, err := wcp.IsVSphereSupervisor(endpoint, httpClient) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(BeFalse()) - }) - }) - Context("When an error occurs contacting the endpoint", func() { - It("returns an error", func() { - httpClient = &http.Client{ - Transport: &errorRoundTripper{}, - } - _, err := wcp.IsVSphereSupervisor(endpoint, httpClient) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("an error occurred")) - }) - }) -}) diff --git a/cli/core/pkg/buildinfo/buildvar.go b/cli/core/pkg/buildinfo/buildvar.go deleted file mode 100644 index 1360537945..0000000000 --- a/cli/core/pkg/buildinfo/buildvar.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package buildinfo holds global vars set at build time to provide information about the build. -// This package SHOULD NOT import other packages -- to avoid dependency cycles. -package buildinfo - -// This package - -var ( - // Date is the date the binary was built. - // Set by go build -ldflags "-X" flag - Date string - - // SHA is the git commit SHA the binary was built with. - // Set by go build -ldflags "-X" flag - SHA string - - // Version is the version the binary was built with. - // Set by go build -ldflags "-X" flag - Version string -) diff --git a/cli/core/pkg/buildinfo/metadata.go b/cli/core/pkg/buildinfo/metadata.go deleted file mode 100644 index a7fbc128fd..0000000000 --- a/cli/core/pkg/buildinfo/metadata.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package buildinfo - -// IsOfficialBuild is the flag that gets set to True if it is an official build being released. -// Set by go build -ldflags "-X" flag -var IsOfficialBuild string diff --git a/cli/core/pkg/carvelhelpers/kbld.go b/cli/core/pkg/carvelhelpers/kbld.go deleted file mode 100644 index ae9f736d50..0000000000 --- a/cli/core/pkg/carvelhelpers/kbld.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package carvelhelpers implements wrapper functions to use carvel tooling -package carvelhelpers - -import ( - "bytes" - "os" - - "github.com/cppforlife/go-cli-ui/ui" - "github.com/k14s/kbld/pkg/kbld/cmd" - "github.com/pkg/errors" -) - -// ResolveImagesInPackage resolves the images using kbld tool -// Implements similar functionality as `kbld -f -f ` -func ResolveImagesInPackage(files []string) ([]byte, error) { - var outputBuf, errorBuf bytes.Buffer - writerUI := ui.NewWriterUI(&outputBuf, &errorBuf, nil) - kbldResolveOptions := cmd.NewResolveOptions(writerUI) - kbldResolveOptions.FileFlags = cmd.FileFlags{Files: files} - kbldResolveOptions.BuildConcurrency = 1 - - // backup and reset stderr to avoid kbld to write anything to stderr - stdErr := os.Stderr - os.Stderr = nil - err := kbldResolveOptions.Run() - os.Stderr = stdErr - - if err != nil { - return nil, errors.Wrapf(err, "error while resolving images") - } - return outputBuf.Bytes(), nil -} diff --git a/cli/core/pkg/carvelhelpers/kbld_test.go b/cli/core/pkg/carvelhelpers/kbld_test.go deleted file mode 100644 index 01b78be144..0000000000 --- a/cli/core/pkg/carvelhelpers/kbld_test.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_ResolveImagesInPackage_Success(t *testing.T) { - assert := assert.New(t) - - input := `--- -apiVersion: imgpkg.carvel.dev/v1alpha1 -images: -- annotations: - kbld.carvel.dev/id: test-tanzu-cli-plugins/foo-darwin-amd64:latest - image: localhost:5000/tanzu-plugins/standalone-plugins@sha256:443df31fec8f78b55ea25ac1ba55907567fbdf05301a752e9f6adefe3c37e11d -- annotations: - kbld.carvel.dev/id: test-tanzu-cli-plugins/foo-linux-amd64:latest - image: localhost:5000/tanzu-plugins/standalone-plugins@sha256:53fb40d45e6a1267713cfdd6b561a65457cd5a575c6813fbdae06380b48e5e1f -kind: ImagesLock ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: Foo -metadata: - name: foo-test -spec: - artifacts: - - image: test-tanzu-cli-plugins/foo-darwin-amd64:latest - - image: test-tanzu-cli-plugins/foo-linux-amd64:latest - description: contains artifacts -` - - output := `--- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: Foo -metadata: - name: foo-test -spec: - artifacts: - - image: localhost:5000/tanzu-plugins/standalone-plugins@sha256:443df31fec8f78b55ea25ac1ba55907567fbdf05301a752e9f6adefe3c37e11d - - image: localhost:5000/tanzu-plugins/standalone-plugins@sha256:53fb40d45e6a1267713cfdd6b561a65457cd5a575c6813fbdae06380b48e5e1f - description: contains artifacts -` - - f, err := os.CreateTemp("", "kbld_test") - assert.Nil(err) - defer os.Remove(f.Name()) - err = os.WriteFile(f.Name(), []byte(input), 0644) - assert.Nil(err) - - bytes, err := ResolveImagesInPackage([]string{f.Name()}) - assert.Nil(err) - assert.NotNil(bytes) - assert.Equal(output, string(bytes)) -} - -func Test_ResolveImagesInPackage_When_Image_Not_Present_In_ImageLock(t *testing.T) { - assert := assert.New(t) - - input1 := `--- -apiVersion: imgpkg.carvel.dev/v1alpha1 -images: -- annotations: - kbld.carvel.dev/id: test-tanzu-cli-plugins/foo-darwin-amd64:latest - image: localhost:5000/tanzu-plugins/standalone-plugins@sha256:443df31fec8f78b55ea25ac1ba55907567fbdf05301a752e9f6adefe3c37e11d -kind: ImagesLock ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: Foo -metadata: - name: foo-test -spec: - artifacts: - - image: test-tanzu-cli-plugins/foo-darwin-amd64:latest - - image: test-tanzu-cli-plugins/foo-linux-amd64:latest - description: contains artifacts -` - - f, err := os.CreateTemp("", "kbld_test") - assert.Nil(err) - defer os.Remove(f.Name()) - err = os.WriteFile(f.Name(), []byte(input1), 0644) - assert.Nil(err) - - bytes, err := ResolveImagesInPackage([]string{f.Name()}) - assert.NotNil(err) - assert.Contains(err.Error(), "error while resolving images:") - assert.Nil(bytes) -} diff --git a/cli/core/pkg/carvelhelpers/package.go b/cli/core/pkg/carvelhelpers/package.go deleted file mode 100644 index 08fd6ea90b..0000000000 --- a/cli/core/pkg/carvelhelpers/package.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers - -import ( - "os" - "path/filepath" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/utils" -) - -// ProcessCarvelPackage processes a carvel package and returns a configuration YAML -// Downloads package to temporary directory and processes the package by -// implementing equivalent functionality as the command: `ytt -f [-f ] | kbld -f -` -func ProcessCarvelPackage(image string, valuesFiles ...string) ([]byte, error) { - pkgDir, err := DownloadImageBundleAndSaveFilesToTempDir(image) - if err != nil { - return nil, errors.Wrap(err, "failed to get resource files from discovery") - } - defer os.RemoveAll(pkgDir) - return CarvelPackageProcessor(pkgDir, image, valuesFiles...) -} - -// CarvelPackageProcessor processes a carvel package and returns a configuration YAML file -func CarvelPackageProcessor(pkgDir, image string, valuesFiles ...string) ([]byte, error) { - // Each package contains `config` and `.imgpkg` directory - // `config` directory contains ytt files - // `.imgpkg` directory contains ImageLock configuration for ImageResolution - configDir := filepath.Join(pkgDir, "config") - files := append([]string{configDir}, valuesFiles...) - bytes, err := ProcessYTTPackage(files...) - if err != nil { - return nil, errors.Wrap(err, "error while running ytt") - } - - f, err := os.CreateTemp("", "ytt-processed") - if err != nil { - return nil, errors.Wrap(err, "error while creating temp directory") - } - defer os.Remove(f.Name()) - - err = utils.SaveFile(f.Name(), bytes) - if err != nil { - return nil, errors.Wrap(err, "error while saving file") - } - - inputFilesForImageResolution := []string{f.Name()} - - // Use `.imgpkg` directory if exists for ImageResolution - imgpkgDir := filepath.Join(pkgDir, ".imgpkg") - if utils.PathExists(imgpkgDir) { - inputFilesForImageResolution = append(inputFilesForImageResolution, imgpkgDir) - } - - return ResolveImagesInPackage(inputFilesForImageResolution) -} diff --git a/cli/core/pkg/carvelhelpers/package_test.go b/cli/core/pkg/carvelhelpers/package_test.go deleted file mode 100644 index 5b48fca746..0000000000 --- a/cli/core/pkg/carvelhelpers/package_test.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers_test - -import ( - "os" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/carvelhelpers" -) - -func TestClient(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cli/core/pkg/carvelhelpers Suite") -} - -var _ = Describe("Unit tests for CarvelPackageProcessor", func() { - var ( - configBytes []byte - err error - packageDownloadDir string - image string - outputFilePath string - ) - - JustBeforeEach(func() { - configBytes, err = CarvelPackageProcessor(packageDownloadDir, image) - }) - - Context("When processing test package1 which includes .imgpkg dir", func() { - BeforeEach(func() { - packageDownloadDir = "./test/package1/input" - outputFilePath = "./test/package1/output.yaml" - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(string(configBytes)).To(Equal(readFile(outputFilePath))) - }) - }) - - Context("When processing test package2 which does not include .imgpkg dir", func() { - BeforeEach(func() { - packageDownloadDir = "./test/package2/input" - outputFilePath = "./test/package2/output.yaml" - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(string(configBytes)).To(Equal(readFile(outputFilePath))) - }) - }) -}) - -func readFile(path string) string { - data, err := os.ReadFile(path) - Expect(err).NotTo(HaveOccurred()) - return string(data) -} - -var _ = Describe("Unit tests for CarvelPackageProcessor", func() { - var ( - configBytes []byte - err error - image string - ) - - JustBeforeEach(func() { - configBytes, err = ProcessCarvelPackage(image, "") - }) - - Context("When in-correct image passed", func() { - BeforeEach(func() { - image = "image" - }) - It("should not return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to get resource files from discovery")) - Expect(configBytes).To(BeNil()) - }) - }) - -}) diff --git a/cli/core/pkg/carvelhelpers/registry.go b/cli/core/pkg/carvelhelpers/registry.go deleted file mode 100644 index 74c233fd77..0000000000 --- a/cli/core/pkg/carvelhelpers/registry.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers - -import ( - "os" - "runtime" - "strings" - - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/clientconfighelpers" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/configpaths" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/registry" -) - -// GetFilesMapFromImage returns map of files metadata -// It takes os environment variables for custom repository and proxy -// configuration into account while downloading image from repository -func GetFilesMapFromImage(imageWithTag string) (map[string][]byte, error) { - reg, err := newRegistry() - if err != nil { - return nil, errors.Wrapf(err, "unable to initialize registry") - } - return reg.GetFiles(imageWithTag) -} - -// DownloadImageBundleAndSaveFilesToTempDir reads OCI image and saves file to temp dir -// returns temp configuration dir with downloaded imgpkg bundle -func DownloadImageBundleAndSaveFilesToTempDir(imageWithTag string) (string, error) { - reg, err := newRegistry() - if err != nil { - return "", errors.Wrapf(err, "unable to initialize registry") - } - tmpDir, err := os.MkdirTemp("", "oci_image") - if err != nil { - return "", errors.Wrap(err, "error creating temporary directory") - } - err = reg.DownloadBundle(imageWithTag, tmpDir) - if err != nil { - return "", errors.Wrap(err, "error downloading bundle") - } - - return tmpDir, nil -} - -// newRegistry returns a new registry object by also -// taking into account for any custom registry or proxy -// environment variable provided by the user -func newRegistry() (registry.Registry, error) { - verifyCerts := true - skipVerifyCerts := os.Getenv(constants.ConfigVariableCustomImageRepositorySkipTLSVerify) - if strings.EqualFold(skipVerifyCerts, "true") { - verifyCerts = false - } - - registryOpts := &ctlimg.Opts{ - VerifyCerts: verifyCerts, - Anon: true, - } - - if runtime.GOOS == "windows" { - err := clientconfighelpers.AddRegistryTrustedRootCertsFileForWindows(registryOpts) - if err != nil { - return nil, err - } - } - - caCertBytes, err := clientconfighelpers.GetCustomRepositoryCaCertificateForClient() - if err == nil && len(caCertBytes) != 0 { - filePath, err := configpaths.GetRegistryCertFile() - if err != nil { - return nil, err - } - err = os.WriteFile(filePath, caCertBytes, 0o644) - if err != nil { - return nil, errors.Wrapf(err, "failed to write the custom image registry CA cert to file '%s'", filePath) - } - registryOpts.CACertPaths = append(registryOpts.CACertPaths, filePath) - } - - return registry.New(registryOpts) -} diff --git a/cli/core/pkg/carvelhelpers/test/package1/input/.imgpkg/images.yaml b/cli/core/pkg/carvelhelpers/test/package1/input/.imgpkg/images.yaml deleted file mode 100644 index 7720f421b0..0000000000 --- a/cli/core/pkg/carvelhelpers/test/package1/input/.imgpkg/images.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -apiVersion: imgpkg.carvel.dev/v1alpha1 -images: -- annotations: - kbld.carvel.dev/id: carvel-kapp-controller:latest - image: test.fake.repo/tkg/kapp-controller@sha256:d11c017b151bb08c8a9699715495589ee64158ff0d79dba08a06a121de732a75 -kind: ImagesLock diff --git a/cli/core/pkg/carvelhelpers/test/package1/output.yaml b/cli/core/pkg/carvelhelpers/test/package1/output.yaml deleted file mode 100644 index 87d1f826ed..0000000000 --- a/cli/core/pkg/carvelhelpers/test/package1/output.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: v1 -kind: Pod -metadata: - name: test - namespace: fake-namespace -spec: - containers: - - args: - - manager - image: test.fake.repo/tkg/kapp-controller@sha256:d11c017b151bb08c8a9699715495589ee64158ff0d79dba08a06a121de732a75 - name: nginx - resources: {} diff --git a/cli/core/pkg/carvelhelpers/test/package2/output.yaml b/cli/core/pkg/carvelhelpers/test/package2/output.yaml deleted file mode 100644 index 33428f5e27..0000000000 --- a/cli/core/pkg/carvelhelpers/test/package2/output.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: v1 -kind: Pod -metadata: - name: test - namespace: fake-namespace -spec: - containers: - - args: - - manager - image: test.fake.repo/tkg/kapp-controller@sha256:abcd017b151bb08c8a9699715495589ee64158ff0d79dba08a06a121de732a75 - name: nginx - resources: {} diff --git a/cli/core/pkg/carvelhelpers/ytt.go b/cli/core/pkg/carvelhelpers/ytt.go deleted file mode 100644 index 93034653e2..0000000000 --- a/cli/core/pkg/carvelhelpers/ytt.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers - -import ( - "io" - - yttui "github.com/vmware-tanzu/carvel-ytt/pkg/cmd/ui" - "github.com/vmware-tanzu/carvel-ytt/pkg/files" - "github.com/vmware-tanzu/carvel-ytt/pkg/workspace" - "github.com/vmware-tanzu/carvel-ytt/pkg/workspace/datavalues" -) - -// ProcessYTTPackage processes configuration directory with ytt tool -// Implements similar functionality as `ytt -f ` -func ProcessYTTPackage(configDirs ...string) ([]byte, error) { - yttFiles, err := files.NewSortedFilesFromPaths(configDirs, files.SymlinkAllowOpts{}) - if err != nil { - return nil, err - } - - lib := workspace.NewRootLibrary(yttFiles) - libCtx := workspace.LibraryExecutionContext{Current: lib, Root: lib} - libExecFact := workspace.NewLibraryExecutionFactory(&NoopUI{}, workspace.TemplateLoaderOpts{}) - loader := libExecFact.New(libCtx) - - valuesDoc, libraryValueDoc, err := loader.Values([]*datavalues.Envelope{}, datavalues.NewNullSchema()) - if err != nil { - return nil, err - } - result, err := loader.Eval(valuesDoc, libraryValueDoc, []*datavalues.SchemaEnvelope{}) - if err != nil { - return nil, err - } - return result.DocSet.AsBytes() -} - -// NoopUI implement noop interface for logging used with carvel tooling -type NoopUI struct{} - -var _ yttui.UI = NoopUI{} - -// Printf noop print -func (ui NoopUI) Printf(str string, args ...interface{}) {} - -// Debugf noop debug -func (ui NoopUI) Debugf(str string, args ...interface{}) {} - -// Warnf noop warn -func (ui NoopUI) Warnf(str string, args ...interface{}) {} - -// DebugWriter noop debug writer -func (ui NoopUI) DebugWriter() io.Writer { - return noopWriter{} -} - -type noopWriter struct{} - -func (n noopWriter) Write(p []byte) (int, error) { - return 0, nil -} - -var _ io.Writer = noopWriter{} diff --git a/cli/core/pkg/carvelhelpers/ytt_test.go b/cli/core/pkg/carvelhelpers/ytt_test.go deleted file mode 100644 index 44a7e3cf8c..0000000000 --- a/cli/core/pkg/carvelhelpers/ytt_test.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers - -import ( - "os" - "path/filepath" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/utils" -) - -var dataValues = `#@data/values -#@overlay/match-child-defaults missing_ok=True - ---- -FOO_NAME: bar -` - -var template = `--- -apiVersion: foo.x-k8s.io/v1alpha3 -kind: Foo -metadata: - name: "${FOO_NAME}" - labels: - tkg.tanzu.vmware.com/label: '${FOO_NAME}' -` - -var overlay = `#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") - -#@overlay/match by=overlay.subset({"kind":"Foo"}) ---- -metadata: - name: #@ data.values.FOO_NAME - labels: - tkg.tanzu.vmware.com/label: #@ data.values.FOO_NAME -` - -var expectedOutput = `apiVersion: foo.x-k8s.io/v1alpha3 -kind: Foo -metadata: - name: bar - labels: - tkg.tanzu.vmware.com/label: bar -` - -func Test_ProcessYTTPackage(t *testing.T) { - assert := assert.New(t) - - testDir := setupTestDir(dataValues, template, overlay) - defer os.RemoveAll(testDir) - - bytes, err := ProcessYTTPackage(testDir) - assert.Nil(err) - assert.NotNil(bytes) - assert.Equal(expectedOutput, string(bytes)) -} - -func Test_ProcessYTTPackage_When_Error(t *testing.T) { - assert := assert.New(t) - - overlayUpdated := strings.ReplaceAll(overlay, "FOO_NAME", "FAKE_NAME") - testDir := setupTestDir(dataValues, template, overlayUpdated) - defer os.RemoveAll(testDir) - - _, err := ProcessYTTPackage(testDir) - assert.NotNil(err) - assert.Contains(err.Error(), "struct has no .FAKE_NAME field or method ") - - _, err = ProcessYTTPackage("") - assert.NotNil(err) - assert.Contains(err.Error(), "no such file or directory") -} - -func setupTestDir(datavalues, overlay, template string) string { - tempDir, _ := os.MkdirTemp("", "ytt_test") - - _ = utils.SaveFile(filepath.Join(tempDir, "datavalues.yaml"), []byte(datavalues)) - _ = utils.SaveFile(filepath.Join(tempDir, "overlay.yaml"), []byte(overlay)) - _ = utils.SaveFile(filepath.Join(tempDir, "template.yaml"), []byte(template)) - return tempDir -} diff --git a/cli/core/pkg/catalog/catalog.go b/cli/core/pkg/catalog/catalog.go deleted file mode 100644 index 751210d8a6..0000000000 --- a/cli/core/pkg/catalog/catalog.go +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package catalog - -import ( - "bytes" - "fmt" - "os" - "path/filepath" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - - "github.com/pkg/errors" - apimachineryjson "k8s.io/apimachinery/pkg/runtime/serializer/json" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/utils" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -const ( - // catalogCacheFileName is the name of the file which holds Catalog cache - catalogCacheFileName = "catalog.yaml" -) - -var ( - // PluginRoot is the plugin root where plugins are installed - pluginRoot = common.DefaultPluginRoot -) - -// ContextCatalog denotes a local plugin catalog for a given context or -// stand-alone. -type ContextCatalog struct { - sharedCatalog *cliapi.Catalog - plugins cliapi.PluginAssociation -} - -// NewContextCatalog creates context-aware catalog -func NewContextCatalog(context string) (*ContextCatalog, error) { - sc, err := getCatalogCache() - if err != nil { - return nil, err - } - - var plugins cliapi.PluginAssociation - if context == "" { - plugins = sc.StandAlonePlugins - } else { - var ok bool - plugins, ok = sc.ServerPlugins[context] - if !ok { - plugins = make(cliapi.PluginAssociation) - sc.ServerPlugins[context] = plugins - } - } - - return &ContextCatalog{ - sharedCatalog: sc, - plugins: plugins, - }, nil -} - -// Upsert inserts/updates the given plugin. -func (c *ContextCatalog) Upsert(plugin *cliapi.PluginDescriptor) error { - pluginNameTarget := PluginNameTarget(plugin.Name, plugin.Target) - - c.plugins[pluginNameTarget] = plugin.InstallationPath - c.sharedCatalog.IndexByPath[plugin.InstallationPath] = *plugin - - if !utils.ContainsString(c.sharedCatalog.IndexByName[pluginNameTarget], plugin.InstallationPath) { - c.sharedCatalog.IndexByName[pluginNameTarget] = append(c.sharedCatalog.IndexByName[pluginNameTarget], plugin.InstallationPath) - } - - return saveCatalogCache(c.sharedCatalog) -} - -// Get looks up the descriptor of a plugin given its name. -func (c *ContextCatalog) Get(plugin string) (cliapi.PluginDescriptor, bool) { - pd := cliapi.PluginDescriptor{} - path, ok := c.plugins[plugin] - if !ok { - return pd, false - } - - pd, ok = c.sharedCatalog.IndexByPath[path] - if !ok { - return pd, false - } - - return pd, true -} - -// List returns the list of active plugins. -// Active plugin means the plugin that are available to the user -// based on the current logged-in server. -func (c *ContextCatalog) List() []cliapi.PluginDescriptor { - pds := make([]cliapi.PluginDescriptor, 0) - for _, installationPath := range c.plugins { - pd := c.sharedCatalog.IndexByPath[installationPath] - pds = append(pds, pd) - } - return pds -} - -// Delete deletes the given plugin from the catalog, but it does not delete -// the installation. -func (c *ContextCatalog) Delete(plugin string) error { - _, ok := c.plugins[plugin] - if ok { - delete(c.plugins, plugin) - } - - return saveCatalogCache(c.sharedCatalog) -} - -// getCatalogCacheDir returns the local directory in which tanzu state is stored. -func getCatalogCacheDir() (path string) { - return common.DefaultCacheDir -} - -// newSharedCatalog creates an instance of the shared catalog file. -func newSharedCatalog() (*cliapi.Catalog, error) { - c := &cliapi.Catalog{ - IndexByPath: map[string]cliapi.PluginDescriptor{}, - IndexByName: map[string][]string{}, - StandAlonePlugins: map[string]string{}, - ServerPlugins: map[string]cliapi.PluginAssociation{}, - } - - err := ensureRoot() - if err != nil { - return nil, err - } - return c, nil -} - -// getCatalogCache retrieves the catalog from from the local directory. -func getCatalogCache() (catalog *cliapi.Catalog, err error) { - b, err := os.ReadFile(getCatalogCachePath()) - if err != nil { - catalog, err = newSharedCatalog() - if err != nil { - return nil, err - } - return catalog, nil - } - scheme, err := cliapi.SchemeBuilder.Build() - if err != nil { - return nil, errors.Wrap(err, "failed to create scheme") - } - s := apimachineryjson.NewSerializerWithOptions(apimachineryjson.DefaultMetaFactory, scheme, scheme, - apimachineryjson.SerializerOptions{Yaml: true, Pretty: false, Strict: false}) - var c cliapi.Catalog - _, _, err = s.Decode(b, nil, &c) - if err != nil { - return nil, errors.Wrap(err, "could not decode catalog file") - } - - if c.IndexByPath == nil { - c.IndexByPath = map[string]cliapi.PluginDescriptor{} - } - if c.IndexByName == nil { - c.IndexByName = map[string][]string{} - } - if c.StandAlonePlugins == nil { - c.StandAlonePlugins = map[string]string{} - } - if c.ServerPlugins == nil { - c.ServerPlugins = map[string]cliapi.PluginAssociation{} - } - - return &c, nil -} - -// saveCatalogCache saves the catalog in the local directory. -func saveCatalogCache(catalog *cliapi.Catalog) error { - catalogCachePath := getCatalogCachePath() - _, err := os.Stat(catalogCachePath) - if os.IsNotExist(err) { - err = os.MkdirAll(getCatalogCacheDir(), 0755) - if err != nil { - return errors.Wrap(err, "could not make tanzu cache directory") - } - } else if err != nil { - return errors.Wrap(err, "could not create catalog cache path") - } - - scheme, err := cliapi.SchemeBuilder.Build() - if err != nil { - return errors.Wrap(err, "failed to create scheme") - } - - s := apimachineryjson.NewSerializerWithOptions(apimachineryjson.DefaultMetaFactory, scheme, scheme, - apimachineryjson.SerializerOptions{Yaml: true, Pretty: false, Strict: false}) - catalog.GetObjectKind().SetGroupVersionKind(cliapi.GroupVersionKindCatalog) - buf := new(bytes.Buffer) - if err := s.Encode(catalog, buf); err != nil { - return errors.Wrap(err, "failed to encode catalog cache file") - } - if err = os.WriteFile(catalogCachePath, buf.Bytes(), 0644); err != nil { - return errors.Wrap(err, "failed to write catalog cache file") - } - return nil -} - -// CleanCatalogCache cleans the catalog cache -func CleanCatalogCache() error { - if err := os.Remove(getCatalogCachePath()); err != nil && !errors.Is(err, os.ErrNotExist) { - return err - } - return nil -} - -// getCatalogCachePath gets the catalog cache path -func getCatalogCachePath() string { - return filepath.Join(getCatalogCacheDir(), catalogCacheFileName) -} - -// Ensure the root directory exists. -func ensureRoot() error { - _, err := os.Stat(testPath()) - if os.IsNotExist(err) { - err := os.MkdirAll(testPath(), 0755) - return errors.Wrap(err, "could not make root plugin directory") - } - return err -} - -// Returns the test path relative to the plugin root -func testPath() string { - return filepath.Join(pluginRoot, "test") -} - -// UpdateCatalogCache when updating the core CLI from v0.x.x to v1.x.x. This is -// needed to group the standalone plugins by context type. -func UpdateCatalogCache() error { - c, err := getCatalogCache() - if err != nil { - return err - } - - return saveCatalogCache(c) -} - -func PluginNameTarget(pluginName string, target cliv1alpha1.Target) string { - if target == "" { - return pluginName - } - return fmt.Sprintf("%s_%s", pluginName, target) -} diff --git a/cli/core/pkg/catalog/catalog_test.go b/cli/core/pkg/catalog/catalog_test.go deleted file mode 100644 index 7b82fd3e2a..0000000000 --- a/cli/core/pkg/catalog/catalog_test.go +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package catalog - -import ( - "os" - "path/filepath" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - cliconfig "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -func Test_ContextCatalog_With_Empty_Context(t *testing.T) { - common.DefaultCacheDir = filepath.Join(os.TempDir(), "test") - - assert := assert.New(t) - - // Create catalog without context - cc, err := NewContextCatalog("") - assert.Nil(err) - assert.NotNil(cc) - - pd1 := cliapi.PluginDescriptor{ - Name: "fakeplugin1", - InstallationPath: "/path/to/plugin/fakeplugin1", - Version: "1.0.0", - } - - err = cc.Upsert(&pd1) - assert.Nil(err) - - pd, exists := cc.Get("fakeplugin1") - assert.True(exists) - assert.Equal(pd.Name, "fakeplugin1") - assert.Equal(pd.InstallationPath, "/path/to/plugin/fakeplugin1") - assert.Equal(pd.Version, "1.0.0") - - pd2 := cliapi.PluginDescriptor{ - Name: "fakeplugin2", - InstallationPath: "/path/to/plugin/fakeplugin2", - Version: "2.0.0", - } - err = cc.Upsert(&pd2) - assert.Nil(err) - - pd, exists = cc.Get("fakeplugin2") - assert.True(exists) - assert.Equal(pd.Name, "fakeplugin2") - assert.Equal(pd.InstallationPath, "/path/to/plugin/fakeplugin2") - assert.Equal(pd.Version, "2.0.0") - - pds := cc.List() - assert.Equal(len(pds), 2) - assert.ElementsMatch([]string{pds[0].Name, pds[1].Name}, []string{"fakeplugin1", "fakeplugin2"}) - assert.ElementsMatch([]string{pds[0].InstallationPath, pds[1].InstallationPath}, []string{"/path/to/plugin/fakeplugin1", "/path/to/plugin/fakeplugin2"}) - assert.ElementsMatch([]string{pds[0].Version, pds[1].Version}, []string{"1.0.0", "2.0.0"}) - - err = cc.Delete("fakeplugin2") - assert.Nil(err) - - pd, exists = cc.Get("fakeplugin2") - assert.False(exists) - assert.NotEqual(pd.Name, "fakeplugin2") - - pds = cc.List() - assert.Equal(len(pds), 1) - - // Create another catalog without context - // The new catalog should also have the same information - cc2, err := NewContextCatalog("") - assert.Nil(err) - assert.NotNil(cc2) - - pd, exists = cc2.Get("fakeplugin1") - assert.True(exists) - assert.Equal(pd.Name, "fakeplugin1") - assert.Equal(pd.InstallationPath, "/path/to/plugin/fakeplugin1") - assert.Equal(pd.Version, "1.0.0") - - pds = cc2.List() - assert.Equal(len(pds), 1) - - os.RemoveAll(common.DefaultPluginRoot) -} - -func Test_ContextCatalog_With_Context(t *testing.T) { - common.DefaultCacheDir = filepath.Join(os.TempDir(), "test") - - assert := assert.New(t) - - cc, err := NewContextCatalog("server") - assert.Nil(err) - assert.NotNil(cc) - - pd1 := cliapi.PluginDescriptor{ - Name: "fakeplugin1", - InstallationPath: "/path/to/plugin/fakeplugin1", - Version: "1.0.0", - } - - err = cc.Upsert(&pd1) - assert.Nil(err) - - pd, exists := cc.Get("fakeplugin1") - assert.True(exists) - assert.Equal(pd.Name, "fakeplugin1") - assert.Equal(pd.InstallationPath, "/path/to/plugin/fakeplugin1") - assert.Equal(pd.Version, "1.0.0") - - pd2 := cliapi.PluginDescriptor{ - Name: "fakeplugin2", - InstallationPath: "/path/to/plugin/fakeplugin2", - Version: "2.0.0", - } - err = cc.Upsert(&pd2) - assert.Nil(err) - - pd, exists = cc.Get("fakeplugin2") - assert.True(exists) - assert.Equal(pd.Name, "fakeplugin2") - assert.Equal(pd.InstallationPath, "/path/to/plugin/fakeplugin2") - assert.Equal(pd.Version, "2.0.0") - - pds := cc.List() - assert.Equal(len(pds), 2) - assert.ElementsMatch([]string{pds[0].Name, pds[1].Name}, []string{"fakeplugin1", "fakeplugin2"}) - assert.ElementsMatch([]string{pds[0].InstallationPath, pds[1].InstallationPath}, []string{"/path/to/plugin/fakeplugin1", "/path/to/plugin/fakeplugin2"}) - assert.ElementsMatch([]string{pds[0].Version, pds[1].Version}, []string{"1.0.0", "2.0.0"}) - - err = cc.Delete("fakeplugin2") - assert.Nil(err) - - pd, exists = cc.Get("fakeplugin2") - assert.False(exists) - assert.NotEqual(pd.Name, "fakeplugin2") - - pds = cc.List() - assert.Equal(len(pds), 1) - - // Create another catalog with same context - // The new catalog should also have the same information - cc2, err := NewContextCatalog("server") - assert.Nil(err) - assert.NotNil(cc2) - - pd, exists = cc2.Get("fakeplugin1") - assert.True(exists) - assert.Equal(pd.Name, "fakeplugin1") - assert.Equal(pd.InstallationPath, "/path/to/plugin/fakeplugin1") - assert.Equal(pd.Version, "1.0.0") - - pds = cc2.List() - assert.Equal(len(pds), 1) - - // Create another catalog with different context - // The new catalog should not have the same information - cc3, err := NewContextCatalog("server2") - assert.Nil(err) - assert.NotNil(cc3) - - pd, exists = cc3.Get("fakeplugin1") - assert.False(exists) - - os.RemoveAll(common.DefaultPluginRoot) -} - -// Test_CatalogCacheFileName tests we default to catalog.yaml file when -// the featuregate is configured to true by default -func Test_CatalogCacheFileName(t *testing.T) { - assert := assert.New(t) - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - assert.Equal(catalogCacheFileName, "catalog.yaml") - } -} diff --git a/cli/core/pkg/catalog/interface.go b/cli/core/pkg/catalog/interface.go deleted file mode 100644 index dd047efb2f..0000000000 --- a/cli/core/pkg/catalog/interface.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package catalog implements catalog management functions -package catalog - -import ( - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -// Catalog is the interface that maintains an index of the installed plugins as well as the active plugins. -type Catalog interface { - // Upsert inserts/updates the given plugin. - Upsert(plugin cliapi.PluginDescriptor) - - // Get looks up the descriptor of a plugin given its name. - Get(pluginName string) (cliapi.PluginDescriptor, bool) - - // List returns the list of active plugins. - // Active plugin means the plugin that are available to the user - // based on the current logged-in server. - List() []cliapi.PluginDescriptor - - // Delete deletes the given plugin from the catalog, but it does not delete the installation. - Delete(plugin string) -} diff --git a/cli/core/pkg/cli/catalog.go b/cli/core/pkg/cli/catalog.go deleted file mode 100644 index 58b3e6cfa8..0000000000 --- a/cli/core/pkg/cli/catalog.go +++ /dev/null @@ -1,646 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "bytes" - "encoding/json" - "fmt" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - "sync" - - "github.com/aunum/log" - "github.com/pkg/errors" - "golang.org/x/mod/semver" - apimachineryjson "k8s.io/apimachinery/pkg/runtime/serializer/json" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -const ( - // catalogCacheDirName is the name of the local directory in which tanzu state is stored. - catalogCacheDirName = ".cache/tanzu" - // catalogCacheFileName is the name of the file which holds Catalog cache - catalogCacheFileName = "catalog.yaml" - // exe is an executable file extension - exe = ".exe" -) - -var ( - minConcurrent = 2 - // PluginRoot is the plugin root where plugins are installed - pluginRoot = DefaultPluginRoot - // Distro is set of plugins that should be included with the CLI. - distro = DefaultDistro -) - -// getCatalogCacheDir returns the local directory in which tanzu state is stored. -func getCatalogCacheDir() (path string, err error) { - home, err := os.UserHomeDir() - if err != nil { - return path, errors.Wrap(err, "could not locate user home directory") - } - path = filepath.Join(home, catalogCacheDirName) - return -} - -// HasPluginUpdateIn checks if the plugin has an update in any of the given repositories. -func HasPluginUpdateIn(repos *MultiRepo, p *cliapi.PluginDescriptor) (update bool, repo Repository, version string, err error) { - for _, repo := range repos.repositories { - versionSelector := repo.VersionSelector() - update, version, err := HasPluginUpdate(repo, versionSelector, p) - if err != nil { - log.Debugf("could not check for update for plugin %q in repo %q: %v", p.Name, repo.Name, err) - continue - } - if update { - return update, repo, version, err - } - } - return false, nil, "", nil -} - -// HasPluginUpdate tells whether the plugin descriptor has an update available in the given repository. -func HasPluginUpdate(repo Repository, versionSelector VersionSelector, p *cliapi.PluginDescriptor) (update bool, version string, err error) { - if versionSelector == nil { - versionSelector = repo.VersionSelector() - } - plugin, err := repo.Describe(p.Name) - if err != nil { - return update, version, err - } - valid := semver.IsValid(p.Version) - if !valid { - err = fmt.Errorf("local plugin version %q is not a valid semantic version", p.Version) - return - } - latest := plugin.FindVersion(versionSelector) - valid = semver.IsValid(latest) - if !valid { - err = fmt.Errorf("remote plugin version %q is not a valid semantic version", latest) - return - } - compared := semver.Compare(latest, p.Version) - if compared == 1 { - return true, latest, nil - } - return false, version, nil -} - -// IsDistributionSatisfied tells if a distribution is satisfied by the plugin list. -func IsDistributionSatisfied(desc []*cliapi.PluginDescriptor) bool { - for _, dist := range distro { - var contains bool - for _, plugin := range desc { - if dist == plugin.Name { - contains = true - } - } - if !contains { - return false - } - } - return true -} - -// NewCatalog creates an instance of Catalog. -func NewCatalog() (*cliapi.Catalog, error) { - c := &cliapi.Catalog{} - - err := ensureRoot() - if err != nil { - return nil, err - } - return c, nil -} - -// getCatalogCache retrieves the catalog from from the local directory. -func getCatalogCache() (catalog *cliapi.Catalog, err error) { - catalogCachePath, err := getCatalogCachePath() - if err != nil { - return nil, err - } - b, err := os.ReadFile(catalogCachePath) - if err != nil { - catalog, err = NewCatalog() - if err != nil { - return nil, err - } - return catalog, nil - } - scheme, err := cliapi.SchemeBuilder.Build() - if err != nil { - return nil, errors.Wrap(err, "failed to create scheme") - } - s := apimachineryjson.NewSerializerWithOptions(apimachineryjson.DefaultMetaFactory, scheme, scheme, - apimachineryjson.SerializerOptions{Yaml: true, Pretty: false, Strict: false}) - var c cliapi.Catalog - _, _, err = s.Decode(b, nil, &c) - if err != nil { - return nil, errors.Wrap(err, "could not decode catalog file") - } - return &c, nil -} - -// saveCatalogCache saves the catalog in the local directory. -func saveCatalogCache(catalog *cliapi.Catalog) error { - catalogCachePath, err := getCatalogCachePath() - if err != nil { - return err - } - _, err = os.Stat(catalogCachePath) - if os.IsNotExist(err) { - catalogCacheDir, err := getCatalogCacheDir() - if err != nil { - return errors.Wrap(err, "could not find tanzu cache dir for OS") - } - err = os.MkdirAll(catalogCacheDir, 0755) - if err != nil { - return errors.Wrap(err, "could not make tanzu cache directory") - } - } else if err != nil { - return errors.Wrap(err, "could not create catalog cache path") - } - - scheme, err := cliapi.SchemeBuilder.Build() - if err != nil { - return errors.Wrap(err, "failed to create scheme") - } - - s := apimachineryjson.NewSerializerWithOptions(apimachineryjson.DefaultMetaFactory, scheme, scheme, - apimachineryjson.SerializerOptions{Yaml: true, Pretty: false, Strict: false}) - catalog.GetObjectKind().SetGroupVersionKind(cliapi.GroupVersionKindCatalog) - buf := new(bytes.Buffer) - if err := s.Encode(catalog, buf); err != nil { - return errors.Wrap(err, "failed to encode catalog cache file") - } - if err = os.WriteFile(catalogCachePath, buf.Bytes(), 0644); err != nil { - return errors.Wrap(err, "failed to write catalog cache file") - } - return nil -} - -// ListPlugins returns the available plugins. -// This code will be removed as part of TKG-13912, and replaced with pluginmanager.AvailablePluginsFromLocalSource or pluginmanager.AvailablePlugins instead -func ListPlugins(exclude ...string) (list []*cliapi.PluginDescriptor, err error) { - pluginDescriptors, err := getPluginsFromCatalogCache() - if err != nil { - log.Debugf("could not get plugin descriptors %v", err) - } else { - return pluginDescriptors, nil - } - - infos, err := os.ReadDir(pluginRoot) - if err != nil { - log.Debug("no plugins currently found") - return list, nil - } - - for _, info := range infos { - if info.IsDir() { - continue - } - if inExclude(PluginNameFromBin(info.Name()), exclude) { - continue - } - descriptor, err := DescribePlugin(PluginNameFromBin(info.Name())) - if err != nil { - return list, err - } - list = append(list, descriptor) - } - - if err := savePluginsToCatalogCache(list); err != nil { - log.Debugf("Plugin descriptors could not be saved to cache", err) - } - return list, nil -} - -// savePluginsToCatalogCache saves plugins to catalog cache -func savePluginsToCatalogCache(list []*cliapi.PluginDescriptor) error { - catalog, err := getCatalogCache() - if err != nil { - catalog, err = NewCatalog() - if err != nil { - return err - } - } - catalog.PluginDescriptors = list - if err := saveCatalogCache(catalog); err != nil { - return err - } - return nil -} - -// getPluginsFromCatalogCache gets plugins from catalog cache -func getPluginsFromCatalogCache() (list []*cliapi.PluginDescriptor, err error) { - catalog, err := getCatalogCache() - if err != nil { - return nil, err - } - if len(catalog.PluginDescriptors) == 0 { - return nil, errors.New("could not retrieve plugin descriptors from catalog cache") - } - return catalog.PluginDescriptors, nil -} - -// upsertPluginCacheEntry inserts or updates a plugin entry in catalog cache -func upsertPluginCacheEntry(name string) error { - list, err := getPluginsFromCatalogCache() - if err != nil { - return err - } - list = remove(list, name) - descriptor, err := DescribePlugin(PluginNameFromBin(name)) - if err != nil { - return err - } - list = append(list, descriptor) - if err := savePluginsToCatalogCache(list); err != nil { - return err - } - return nil -} - -// deletePluginCacheEntry deletes plugin entry in catalog cache -func deletePluginCacheEntry(name string) error { - list, err := getPluginsFromCatalogCache() - if err != nil { - return err - } - list = remove(list, name) - if err := savePluginsToCatalogCache(list); err != nil { - return err - } - return nil -} - -// CleanCatalogCache cleans the catalog cache -func CleanCatalogCache() error { - catalogCachePath, err := getCatalogCachePath() - if err != nil { - return err - } - if err := os.Remove(catalogCachePath); err != nil { - return err - } - return nil -} - -// getCatalogCachePath gets the catalog cache path -func getCatalogCachePath() (string, error) { - catalogCacheDir, err := getCatalogCacheDir() - if err != nil { - return "", errors.Wrap(err, "could not locate catalog cache directory") - } - return filepath.Join(catalogCacheDir, catalogCacheFileName), nil -} - -func remove(list []*cliapi.PluginDescriptor, name string) []*cliapi.PluginDescriptor { - i := 0 - for _, v := range list { - if v != nil && v.Name != name { - list[i] = v - i++ - } - } - list = list[:i] - return list -} - -func inExclude(name string, exclude []string) bool { - for _, e := range exclude { - if name == e { - return true - } - } - return false -} - -// ListTestPlugins returns the available test plugins. -func ListTestPlugins() (list []*cliapi.PluginDescriptor, err error) { - infos, err := os.ReadDir(testPath()) - if err != nil { - log.Debug("no plugins currently found") - return list, nil - } - - for _, info := range infos { - if info.IsDir() { - continue - } - descriptor, err := DescribeTestPlugin(PluginNameFromTestBin(info.Name())) - if err != nil { - return list, err - } - list = append(list, descriptor) - } - - return list, nil -} - -// DescribePlugin describes a plugin. -func DescribePlugin(name string) (desc *cliapi.PluginDescriptor, err error) { - pluginPath := pluginPath(name) - - b, err := exec.Command(pluginPath, "info").Output() - if err != nil { - err = fmt.Errorf("could not describe plugin %q", name) - return - } - - var descriptor cliapi.PluginDescriptor - err = json.Unmarshal(b, &descriptor) - if err != nil { - err = fmt.Errorf("could not unmarshal plugin %q description", name) - } - return &descriptor, err -} - -// DescribeTestPlugin describes a test plugin. -func DescribeTestPlugin(pluginName string) (desc *cliapi.PluginDescriptor, err error) { - pluginPath := testPluginPath(pluginName) - b, err := exec.Command(pluginPath, "info").Output() - if err != nil { - err = fmt.Errorf("could not describe test plugin %q", pluginName) - return - } - - var descriptor cliapi.PluginDescriptor - err = json.Unmarshal(b, &descriptor) - if err != nil { - err = fmt.Errorf("could not unmarshal plugin %q description", pluginName) - } - return &descriptor, err -} - -// InitializePlugin initializes the plugin configuration -func InitializePlugin(name string) error { - pluginPath := pluginPath(name) - - b, err := exec.Command(pluginPath, "post-install").CombinedOutput() - - // Note: If user is installing old version of plugin than it is possible that - // the plugin does not implement post-install command. Ignoring the - // errors if the command does not exist for a particular plugin. - if err != nil && !strings.Contains(string(b), "unknown command") { - log.Warningf("Warning: Failed to initialize plugin '%q' after installation. %v", name, string(b)) - } - - return nil -} - -// InstallPlugin installs a plugin from the given repository. -func InstallPlugin(name, version string, repo Repository) error { - return installOrUpgradePlugin(name, version, repo) -} - -// UpgradePlugin upgrades a plugin from the given repository. -func UpgradePlugin(name, version string, repo Repository) error { - return installOrUpgradePlugin(name, version, repo) -} - -func installOrUpgradePlugin(name, version string, repo Repository) error { - if name == CoreName { - return fmt.Errorf("cannot install core as a plugin") - } - b, err := repo.Fetch(name, version, BuildArch()) - if err != nil { - return err - } - - pluginPath := pluginPath(name) - - if BuildArch().IsWindows() { - pluginPath += exe - } - - err = os.WriteFile(pluginPath, b, 0755) - if err != nil { - return errors.Wrap(err, "could not write file") - } - err = upsertPluginCacheEntry(name) - if err != nil { - log.Debug("Plugin descriptor could not be updated in cache") - } - err = InitializePlugin(name) - if err != nil { - log.Infof("could not initialize plugin after installing: %v", err.Error()) - } - return nil -} - -// InstallAllPlugins plugins with the given version finder. -func InstallAllPlugins(repo Repository) error { - versionSelector := repo.VersionSelector() - plugins, err := repo.List() - if err != nil { - return err - } - for _, plugin := range plugins { - // TODO (pbarker): there is likely a better way of doing this - if plugin.Name == CoreName { - continue - } - err := InstallPlugin(plugin.Name, plugin.FindVersion(versionSelector), repo) - if err != nil { - return err - } - } - return nil -} - -// InstallAllMulti installs all the plugins at the latest version in all the given repositories. -func InstallAllMulti(repos *MultiRepo) error { - pluginMap, err := repos.ListPlugins() - if err != nil { - return err - } - for repoName, descs := range pluginMap { - repo, err := repos.GetRepository(repoName) - if err != nil { - return err - } - versionSelector := repo.VersionSelector() - for _, plugin := range descs { - if plugin.Name == CoreName { - continue - } - err := InstallPlugin(plugin.Name, plugin.FindVersion(versionSelector), repo) - if err != nil { - return err - } - } - } - return nil -} - -// DeletePlugin deletes a plugin. -func DeletePlugin(name string) error { - err := deletePluginCacheEntry(name) - if err != nil { - log.Debugf("Plugin descriptor could not be deleted from cache %v", err) - } - return os.Remove(pluginPath(name)) -} - -// Clean deletes all plugins and tests. -func Clean() error { - if err := CleanCatalogCache(); err != nil { - log.Debugf("Failed to clean the catalog cache %v", err) - } - return os.RemoveAll(pluginRoot) -} - -// EnsureDistro ensures that all the distro plugins are installed. -func EnsureDistro(repos *MultiRepo) error { - fatalErrors := make(chan error, len(distro)) - - // Limit the number of concurrent operations we perform so we don't - // overwhelm the system. - maxConcurrent := runtime.NumCPU() / 2 - if maxConcurrent < minConcurrent { - maxConcurrent = 2 - } - guard := make(chan struct{}, maxConcurrent) - - // capture list of already installed plugins - installedPlugins, err := ListPlugins() - if err != nil { - return err - } - - var wg sync.WaitGroup - for _, pluginName := range distro { - // if plugin exists on user's system, do not (re)install - if isPluginInstalled(installedPlugins, pluginName) { - continue - } - wg.Add(1) - guard <- struct{}{} - go func(pluginName string) { - repo, err := repos.Find(pluginName) - if err != nil { - fatalErrors <- err - } else { - err = InstallPlugin(pluginName, VersionLatest, repo) - if err != nil { - fatalErrors <- err - } - log.Debugf("done installing: %s", pluginName) - } - wg.Done() - <-guard - }(pluginName) - } - - wg.Wait() - - select { - case err := <-fatalErrors: - close(fatalErrors) - return err - default: - break - } - return nil -} - -// InstallTest installs the test for the given plugin name -func InstallTest(pluginName, version string, repo Repository) error { - b, err := repo.FetchTest(pluginName, version, BuildArch()) - if err != nil { - return err - } - - pluginPath := testPluginPath(pluginName) - - if BuildArch().IsWindows() { - pluginPath += exe - } - - err = os.WriteFile(pluginPath, b, 0755) - if err != nil { - return errors.Wrap(err, "could not write file") - } - return nil -} - -// EnsureTest ensures the right version of the test is present for the plugin. -func EnsureTest(plugin *cliapi.PluginDescriptor, repos *MultiRepo) error { - testDesc, err := DescribeTestPlugin(plugin.Name) - if err == nil { - if testDesc.BuildSHA == plugin.BuildSHA { - return nil - } - } - repo, err := repos.Find(plugin.Name) - if err != nil { - return err - } - log.Infof("installing test for plugin %q", plugin.Name) - err = InstallTest(plugin.Name, plugin.Version, repo) - if err != nil { - log.Debugf("could not install test for plugin %q", plugin.Name) - } - return nil -} - -// EnsureTests ensures the plugin tests are installed. -func EnsureTests(repos *MultiRepo, exclude ...string) error { - descs, err := ListPlugins(exclude...) - if err != nil { - return err - } - for _, desc := range descs { - err = EnsureTest(desc, repos) - if err != nil { - return err - } - } - return nil -} - -// Returns the local path for a plugin. -func pluginPath(name string) string { - binName := BinFromPluginName(name) - return filepath.Join(pluginRoot, binName) -} - -// Returns the local path for a plugin. -func testPluginPath(name string) string { - binName := BinTestFromPluginName(name) - return filepath.Join(pluginRoot, "test", binName) -} - -// Returns the test path relative to the plugin root -func testPath() string { - return filepath.Join(pluginRoot, "test") -} - -// Ensure the root directory exists. -func ensureRoot() error { - _, err := os.Stat(testPath()) - if os.IsNotExist(err) { - err := os.MkdirAll(testPath(), 0755) - return errors.Wrap(err, "could not make root plugin directory") - } - return err -} - -// isPluginInstalled takes a list of PluginDescriptors representing installed plugins. -// When the pluginName entered matches a plugin in the descriptor list, true is returned -// A list of installed plugins can be captured by calling Catalog's List method. -func isPluginInstalled(installedPlugin []*cliapi.PluginDescriptor, pluginName string) bool { - for _, p := range installedPlugin { - if p.Name == pluginName { - return true - } - } - return false -} diff --git a/cli/core/pkg/cli/catalog_test.go b/cli/core/pkg/cli/catalog_test.go deleted file mode 100644 index 1505d1099b..0000000000 --- a/cli/core/pkg/cli/catalog_test.go +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//nolint:deadcode,unused -package cli - -// TODO: This is legacy code tests and will be removed soon as part of TKG-13912 -import ( - "os" - "path/filepath" - "runtime" - "testing" - - "github.com/adrg/xdg" - "github.com/pkg/errors" - "github.com/stretchr/testify/require" -) - -var ( - _, b, _, _ = runtime.Caller(0) - basepath = filepath.Dir(b) - mockPluginList = []string{"foo", "bar", "baz"} -) - -func newTestRepo(t *testing.T, name string) Repository { - path, err := filepath.Abs(filepath.Join(basepath, "../../../test/cli/mock/", name)) - require.NoError(t, err) - return NewLocalRepository(name, path) -} - -func newTestCatalog(t *testing.T) { - distro = mockPluginList - pluginRoot = filepath.Join(xdg.DataHome, "tanzu-cli-test") - os.RemoveAll(pluginRoot) - _, err := NewCatalog() - require.NoError(t, err) -} - -func setupCatalogCache() error { - catalogCachePath, err := getCatalogCachePath() - if err != nil { - return errors.Wrap(err, "could not get plugin descriptor path") - } - _, err = os.Stat(catalogCachePath) - if os.IsNotExist(err) { - localDir, err := getCatalogCacheDir() - if err != nil { - return errors.Wrap(err, "could not find local tanzu dir for OS") - } - err = os.MkdirAll(localDir, 0755) - if err != nil { - return errors.Wrap(err, "could not make local tanzu directory") - } - } else if err != nil { - return errors.Wrap(err, "could not create plugin descriptors path") - } else { - if err := CleanCatalogCache(); err != nil { - return errors.Wrap(err, "could not clean plugin descriptors cache") - } - } - return nil -} - -func testMultiRepo(t *testing.T, multi *MultiRepo) { - err := InstallAllMulti(multi) - require.NoError(t, err) - - err = EnsureTests(multi) - require.NoError(t, err) - - err = EnsureDistro(multi) - require.NoError(t, err) -} - -func testByDownGrading(t *testing.T) int { - plugins, err := ListPlugins() - require.NoError(t, err) - - numPluginsDowngraded := 1 - repoOld := newTestRepo(t, "artifacts-old") - // downgrades from v0.0.4 to v0.0.3 - err = InstallPlugin("baz", "v0.0.3", repoOld) - require.NoError(t, err) - pluginsAfterDowngrade, err := ListPlugins() - require.NoError(t, err) - require.NotEqual(t, plugins, pluginsAfterDowngrade) - return numPluginsDowngraded -} - -func testHasUpdate(t *testing.T, multi *MultiRepo, numPluginsDowngraded int) { - plugins, err := ListPlugins() - require.NoError(t, err) - - numPluginsRequiringUpdate := 0 - for _, p := range plugins { - hasUpdate, repo, version, err := HasPluginUpdateIn(multi, p) - require.NoError(t, err) - - if hasUpdate { - numPluginsRequiringUpdate++ - - hasUpdate2, version2, err2 := HasPluginUpdate(repo, nil, p) - require.NoError(t, err2) - - require.Equal(t, hasUpdate, hasUpdate2) - require.Equal(t, version, version2) - } - } - require.Equal(t, numPluginsRequiringUpdate, numPluginsDowngraded) -} - -// TODO: This is legacy code tests and will be removed soon. This test and implementation file would be removed soon -//func TestCatalog(t *testing.T) { -// newTestCatalog(t) -// -// //setup cache -// err := setupCatalogCache() -// require.NoError(t, err) -// -// // clean cache -// defer func() { -// err := CleanCatalogCache() -// require.NoError(t, err) -// }() -// -// repo := newTestRepo(t, "artifacts-new") -// -// err = InstallAllPlugins(repo) -// require.NoError(t, err) -// -// err = InstallPlugin("foo", "v0.0.3", repo) -// require.NoError(t, err) -// -// err = InstallPlugin("foo", "v0.0.0-missingversion", repo) -// require.Error(t, err) -// -// err = UpgradePlugin("foo", "v0.0.4", repo) -// require.Error(t, err) -// -// plugins, _ := ListPlugins() -// require.Len(t, plugins, 3) -// -// err = InstallPlugin("notpresent", "v0.0.0", repo) -// require.Error(t, err) -// -// plugins, err = ListPlugins() -// require.NoError(t, err) -// require.Len(t, plugins, 3) -// -// pluginsInCatalogCache, err := getPluginsFromCatalogCache() -// require.NoError(t, err) -// require.Len(t, pluginsInCatalogCache, 3) -// -// err = DeletePlugin("foo") -// require.NoError(t, err) -// -// plugins, err = ListPlugins() -// require.NoError(t, err) -// -// require.Len(t, plugins, 2) -// -// pluginsInCatalogCache, err = getPluginsFromCatalogCache() -// require.NoError(t, err) -// require.Len(t, pluginsInCatalogCache, 2) -// -// _, err = DescribePlugin("bar") -// require.NoError(t, err) -// -// altRepo := newTestRepo(t, "artifacts-alt") -// -// multi := NewMultiRepo(repo, altRepo) -// -// testMultiRepo(t, multi) -// -// numPluginsDowngraded := testByDownGrading(t) -// -// testHasUpdate(t, multi, numPluginsDowngraded) -// -// err = EnsureDistro(multi) -// require.NoError(t, err) -// pluginsAfterReensure, err := ListPlugins() -// require.NoError(t, err) -// // ensure does not update/upgrade the plugin to v0.0.4 -// // thus the plugins installed in the catalog and the plugins -// // on the user's file system do not match -// require.NotEqual(t, plugins, pluginsAfterReensure) -// -// invalidPluginList := append(mockPluginList, "notpresent") -// distro = invalidPluginList -// err = EnsureDistro(multi) -// require.Error(t, err) -// -// // clean test plugin root -// err = os.RemoveAll(pluginRoot) -// require.NoError(t, err) -//} diff --git a/cli/core/pkg/cli/cmd.go b/cli/core/pkg/cli/cmd.go deleted file mode 100644 index 69b3fc69eb..0000000000 --- a/cli/core/pkg/cli/cmd.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "context" - "os" - "strconv" - "strings" - - "github.com/aunum/log" - "github.com/spf13/cobra" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -// GetCmd returns a cobra command for the plugin. -func GetCmd(p *cliapi.PluginDescriptor) *cobra.Command { - cmd := &cobra.Command{ - Use: p.Name, - Short: p.Description, - RunE: func(cmd *cobra.Command, args []string) error { - runner := NewRunner(p.Name, p.InstallationPath, args) - ctx := context.Background() - return runner.Run(ctx) - }, - DisableFlagParsing: true, - Annotations: map[string]string{ - "group": string(p.Group), - "scope": p.Scope, - }, - Hidden: p.Hidden, - Aliases: p.Aliases, - } - - // Handle command line completion types. - if p.CompletionType == cliapi.NativePluginCompletion { - cmd.ValidArgsFunction = func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - // Parses the completion info provided by cobra.Command. This should be formatted similar to: - // help Help about any command - // :4 - // Completion ended with directive: ShellCompDirectiveNoFileComp - completion := []string{"__complete"} - completion = append(completion, args...) - completion = append(completion, toComplete) - - runner := NewRunner(p.Name, p.InstallationPath, completion) - ctx := context.Background() - output, _, err := runner.RunOutput(ctx) - if err != nil { - return nil, cobra.ShellCompDirectiveError - } - - lines := strings.Split(strings.Trim(output, "\n"), "\n") - var results []string - for _, line := range lines { - if strings.HasPrefix(line, ":") { - // Special marker in output to indicate the end - directive, err := strconv.Atoi(line[1:]) - if err != nil { - return results, cobra.ShellCompDirectiveError - } - return results, cobra.ShellCompDirective(directive) - } - results = append(results, line) - } - - return []string{}, cobra.ShellCompDirectiveError - } - } else if p.CompletionType == cliapi.StaticPluginCompletion { - cmd.ValidArgs = p.CompletionArgs - } else if p.CompletionType == cliapi.DynamicPluginCompletion { - cmd.ValidArgsFunction = func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - // Pass along the full completion information. Trivial plugins may not support - // completion depth, but we can provide the information in case they do. - completion := []string{p.CompletionCommand} - completion = append(completion, args...) - completion = append(completion, toComplete) - - runner := NewRunner(p.Name, p.InstallationPath, completion) - ctx := context.Background() - output, stderr, err := runner.RunOutput(ctx) - if err != nil || stderr != "" { - return nil, cobra.ShellCompDirectiveError - } - - // Expectation is that plugins will return a list of nouns, one per line. Can be either just - // the noun, or "noun[tab]Description". - return strings.Split(strings.Trim(output, "\n"), "\n"), cobra.ShellCompDirectiveNoFileComp - } - } - - cmd.SetHelpFunc(func(c *cobra.Command, args []string) { - // Plugin commands don't provide full details to the default "help" cmd. - // To get around this, we need to intercept and send the help request - // out to the plugin. - // Cobra also doesn't pass along any additional args since it has parsed - // the command structure, and as far as it knows, there are no subcommands - // below the top level plugin command. To get around this to support help - // calls such as "tanzu help cluster list", we need to do some argument - // parsing ourselves and modify what gets passed along to the plugin. - helpArgs := getHelpArguments() - - // Pass this new command in to our plugin to have it handle help output - runner := NewRunner(p.Name, p.InstallationPath, helpArgs) - ctx := context.Background() - err := runner.Run(ctx) - if err != nil { - log.Error("Help output for '%s' is not available.", c.Name()) - } - }) - return cmd -} - -// getHelpArguments extracts the command line to pass along to help calls. -// The help function is only ever called for help commands in the format of -// "tanzu help cmd", so we can assume anything two after "help" should get -// passed along (this also accounts for aliases). -func getHelpArguments() []string { - cliArgs := os.Args - helpArgs := []string{} - for i := range cliArgs { - if cliArgs[i] == "help" { - // Found the "help" argument, now capture anything after the plugin name/alias - argLen := len(cliArgs) - if (i + 1) < argLen { - helpArgs = cliArgs[i+2:] - } - break - } - } - - // Then add the -h flag for whatever we found - return append(helpArgs, "-h") -} - -// TestCmd returns a cobra command for the plugin. -func TestCmd(p *cliapi.PluginDescriptor) *cobra.Command { - cmd := &cobra.Command{ - Use: p.Name, - Short: p.Description, - RunE: func(cmd *cobra.Command, args []string) error { - runner := NewRunner(p.Name, p.InstallationPath, args) - ctx := context.Background() - return runner.RunTest(ctx) - }, - DisableFlagParsing: true, - } - return cmd -} diff --git a/cli/core/pkg/cli/conversion.go b/cli/core/pkg/cli/conversion.go deleted file mode 100644 index a18eaf7b00..0000000000 --- a/cli/core/pkg/cli/conversion.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "fmt" - "strings" -) - -const ( - // BinNamePrefix is the prefix for tanzu plugin binary names. - BinNamePrefix = "tanzu-plugin-" - - // TestBinNamePrefix is the prefix for tanzu plugin binary names. - TestBinNamePrefix = "tanzu-plugin-test-" - - // ArtifactNamePrefix is the prefix for tanzu artifact names. - ArtifactNamePrefix = "tanzu" -) - -// PluginNameFromBin returns a plugin name from the binary name. -func PluginNameFromBin(binName string) string { - if BuildArch().IsWindows() { - binName = strings.TrimSuffix(binName, ".exe") - } - return strings.TrimPrefix(binName, BinNamePrefix) -} - -// BinFromPluginName return a plugin binary name from its name. -func BinFromPluginName(name string) string { - return BinNamePrefix + name -} - -// PluginNameFromTestBin returns a plugin name from the test binary name. -func PluginNameFromTestBin(binName string) string { - return strings.TrimPrefix(binName, TestBinNamePrefix) -} - -// BinTestFromPluginName return a plugin binary name from its name. -func BinTestFromPluginName(name string) string { - return TestBinNamePrefix + name -} - -// MakeArtifactName returns an artifact name for a plugin name. -func MakeArtifactName(pluginName string, arch Arch) string { - if arch.IsWindows() { - return fmt.Sprintf("%s-%s-%s.exe", ArtifactNamePrefix, pluginName, arch) - } - return fmt.Sprintf("%s-%s-%s", ArtifactNamePrefix, pluginName, arch) -} - -// MakeTestArtifactName returns a test artifact name for a plugin name. -func MakeTestArtifactName(pluginName string, arch Arch) string { - if arch.IsWindows() { - return fmt.Sprintf("%s-%s-test-%s.exe", ArtifactNamePrefix, pluginName, arch) - } - return fmt.Sprintf("%s-%s-test-%s", ArtifactNamePrefix, pluginName, arch) -} diff --git a/cli/core/pkg/cli/conversion_test.go b/cli/core/pkg/cli/conversion_test.go deleted file mode 100644 index 59e690ba61..0000000000 --- a/cli/core/pkg/cli/conversion_test.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestPluginNameFromBin(t *testing.T) { - for _, test := range []struct { - binName string - pluginName string - }{ - { - binName: fmt.Sprintf("%stest", BinNamePrefix), - pluginName: "test", - }, - { - binName: fmt.Sprintf("%stest-charlie_1", BinNamePrefix), - pluginName: "test-charlie_1", - }, - } { - t.Run(fmt.Sprintf("%s name", test.binName), func(t *testing.T) { - p := PluginNameFromBin(test.binName) - require.Equal(t, test.pluginName, p) - }) - } -} - -func TestBinFromPluginName(t *testing.T) { - for _, test := range []struct { - binName string - pluginName string - }{ - { - binName: fmt.Sprintf("%stest", BinNamePrefix), - pluginName: "test", - }, - { - binName: fmt.Sprintf("%stest-charlie_1", BinNamePrefix), - pluginName: "test-charlie_1", - }, - } { - t.Run(fmt.Sprintf("%s name", test.pluginName), func(t *testing.T) { - b := BinFromPluginName(test.pluginName) - require.Equal(t, test.binName, b) - }) - } -} - -func TestMakeArtifactName(t *testing.T) { - for _, test := range []struct { - arch Arch - pluginName string - artifactName string - }{ - { - arch: LinuxAMD64, - pluginName: "test", - artifactName: fmt.Sprintf("%s-test-%s", ArtifactNamePrefix, LinuxAMD64), - }, - { - arch: WinAMD64, - pluginName: "test-charlie_1", - artifactName: fmt.Sprintf("%s-test-charlie_1-%s.exe", ArtifactNamePrefix, WinAMD64), - }, - } { - t.Run(fmt.Sprintf("%s test", test.arch), func(t *testing.T) { - b := MakeArtifactName(test.pluginName, test.arch) - require.Equal(t, test.artifactName, b) - }) - } -} diff --git a/cli/core/pkg/cli/core.go b/cli/core/pkg/cli/core.go deleted file mode 100644 index 6cb9fb1976..0000000000 --- a/cli/core/pkg/cli/core.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "bytes" - "io" - "os" - "path/filepath" - - "github.com/pkg/errors" - "golang.org/x/mod/semver" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/buildinfo" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -// CoreName is the name of the core binary. -const CoreName = "core" - -const coreDescription = "The core Tanzu CLI" - -// CoreDescriptor is the core descriptor. -var CoreDescriptor = cliapi.PluginDescriptor{ - Name: CoreName, - Description: coreDescription, - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, -} - -// CorePlugin is the core plugin. -var CorePlugin = Plugin{ - Name: CoreName, - Description: coreDescription, -} - -// HasUpdate tells whether the core plugin has an update. -func HasUpdate(repo Repository) (update bool, version string, err error) { - plugin, err := repo.Describe(CoreName) - if err != nil { - return false, version, err - } - versionSelector := repo.VersionSelector() - - version = plugin.FindVersion(versionSelector) - compared := semver.Compare(version, buildinfo.Version) - if compared == 1 { - return true, version, nil - } - return false, version, nil -} - -// Update the core CLI. -func Update(repo Repository) error { - var executable string - update, version, err := HasUpdate(repo) - if err != nil { - return err - } - if !update { - return nil - } - b, err := repo.Fetch(CoreName, version, BuildArch()) - if err != nil { - return err - } - - dir, err := filepath.Abs(filepath.Dir(os.Args[0])) - if err != nil { - return errors.Wrap(err, "could not locate filepath of running binary") - } - - newCliFile := filepath.Join(dir, "tanzu_new") - outFile, err := os.OpenFile(newCliFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755) - if err != nil { - return errors.Wrap(err, "could not create new binary file") - } - defer outFile.Close() - - _, err = io.Copy(outFile, bytes.NewReader(b)) - if err != nil { - return errors.Wrap(err, "could not copy new binary file") - } - outFile.Close() - - if BuildArch().IsWindows() { - executable = outFile.Name() + ".exe" - err = os.Rename(outFile.Name(), executable) - if err != nil { - return errors.Wrap(err, "could not rename binary file") - } - } else { - executable, err = os.Executable() - if err != nil { - return errors.Wrap(err, "could not locate current executable") - } - err = os.Rename(outFile.Name(), executable) - if err != nil { - return errors.Wrap(err, "could not rename binary file") - } - } - return nil -} diff --git a/cli/core/pkg/cli/defaults.go b/cli/core/pkg/cli/defaults.go deleted file mode 100644 index 28abaf7947..0000000000 --- a/cli/core/pkg/cli/defaults.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -// DefaultDistro is the core set of plugins that should be included with the CLI. -var DefaultDistro = []string{"login", "pinniped-auth", "cluster", "management-cluster", "kubernetes-release", "package", "secret"} diff --git a/cli/core/pkg/cli/doc.go b/cli/core/pkg/cli/doc.go deleted file mode 100644 index acfdf16b43..0000000000 --- a/cli/core/pkg/cli/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package cli provides libraries for building CLI commands and plugins. -package cli diff --git a/cli/core/pkg/cli/metadata.go b/cli/core/pkg/cli/metadata.go deleted file mode 100644 index cf438aa394..0000000000 --- a/cli/core/pkg/cli/metadata.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "context" - - "google.golang.org/grpc/metadata" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" -) - -const ( - // Name of the CLI. - Name = "tanzu" - - // ClientName of the CLI. - ClientName = "tanzu-cli" -) - -// AppendClientMetadata adds client metadata. -func AppendClientMetadata(ctx context.Context) context.Context { - _, ok := metadata.FromOutgoingContext(ctx) - if !ok { - return metadata.NewOutgoingContext(ctx, map[string][]string{ - config.NameHeader: {ClientName}, - config.VersionHeader: {buildinfo.Version}, - }) - } - // Append to outgoing metadata if context has existing metadata - return metadata.AppendToOutgoingContext(ctx, - config.NameHeader, ClientName, - config.VersionHeader, buildinfo.Version, - ) -} - -// WithClientMetadata is an option to append CLI client metadata. -func WithClientMetadata() func(ctx context.Context) context.Context { - return AppendClientMetadata -} diff --git a/cli/core/pkg/cli/multirepo.go b/cli/core/pkg/cli/multirepo.go deleted file mode 100644 index 0fbce4f603..0000000000 --- a/cli/core/pkg/cli/multirepo.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import "fmt" - -// MultiRepo is a multiple -type MultiRepo struct { - repositories []Repository -} - -// NewMultiRepo returns a new multirepo. -func NewMultiRepo(repositories ...Repository) *MultiRepo { - return &MultiRepo{ - repositories: repositories, - } -} - -// AddRepository to known. -func (m *MultiRepo) AddRepository(repo Repository) { - m.repositories = append(m.repositories, repo) -} - -// RemoveRepository removes a repo. -func (m *MultiRepo) RemoveRepository(name string) { - newRepos := []Repository{} - for _, repo := range m.repositories { - if name != repo.Name() { - newRepos = append(newRepos, repo) - } - } - m.repositories = newRepos -} - -// GetRepository returns a repository. -func (m *MultiRepo) GetRepository(name string) (Repository, error) { - for _, repo := range m.repositories { - if name == repo.Name() { - return repo, nil - } - } - return nil, fmt.Errorf("could not find repository %q", name) -} - -// ListPlugins across the repositories. -func (m *MultiRepo) ListPlugins() (mp map[string][]Plugin, err error) { - mp = map[string][]Plugin{} - for _, repo := range m.repositories { - plugins, err := repo.List() - if err != nil { - return mp, err - } - mp[repo.Name()] = plugins - } - return -} - -// Find a repository for the given plugin name. -func (m *MultiRepo) Find(name string) (r Repository, err error) { - matches := []Repository{} - for _, repo := range m.repositories { - plugins, err := repo.List() - if err != nil { - return r, err - } - for _, p := range plugins { - if p.Name == name { - matches = append(matches, repo) - } else if fmt.Sprintf("%s.%s", repo.Name(), p.Name) == name { - matches = append(matches, repo) - } - } - } - - switch i := len(matches); i { - case 0: - return nil, fmt.Errorf("could not find plugin %q in any known repositories", name) - case 1: - return matches[0], nil - default: - return nil, fmt.Errorf("found plugin %q in %#v repositories, use the fully qualified . to select", name, matches) - } -} diff --git a/cli/core/pkg/cli/multirepo_test.go b/cli/core/pkg/cli/multirepo_test.go deleted file mode 100644 index 8eb4463b38..0000000000 --- a/cli/core/pkg/cli/multirepo_test.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "context" -) - -type FakeRepository struct { - Repository -} - -func (f *FakeRepository) List() ([]Plugin, error) { - return []Plugin{}, context.DeadlineExceeded -} - -// TODO: This is legacy code tests and will be removed soon. This test and implementation file would be removed soon -//func TestMultiRepo(t *testing.T) { -// repoNew := newTestRepo(t, "artifacts-new") -// repoAlt := newTestRepo(t, "artifacts-alt") -// -// m := NewMultiRepo(repoNew) -// m.AddRepository(repoAlt) -// -// r, err := m.Find("foo") -// require.NoError(t, err) -// -// require.Equal(t, r.Name(), "artifacts-new") -// -// r, err = m.Find("qux") -// require.NoError(t, err) -// -// require.Equal(t, r.Name(), "artifacts-alt") -// -// _, err = m.GetRepository("artifacts-new") -// require.NoError(t, err) -// -// mp, err := m.ListPlugins() -// require.NoError(t, err) -// require.Len(t, mp, 2) -// -// m.RemoveRepository("artifacts-alt") -// mp, err = m.ListPlugins() -// require.NoError(t, err) -// require.Len(t, mp, 1) -// -// // test duplicates -// repoOld := newTestRepo(t, "artifacts-old") -// m.AddRepository(repoOld) -// -// _, err = m.Find("foo") -// require.Error(t, err) -// -// _, err = m.Find("artifacts-new.foo") -// require.NoError(t, err) -//} -// -//func TestMultiRepoWithUnreachableRepos(t *testing.T) { -// repoNew := newTestRepo(t, "artifacts-new") -// repoAlt := newTestRepo(t, "artifacts-alt") -// repoFake := &FakeRepository{} -// m := NewMultiRepo(repoNew) -// m.AddRepository(repoFake) -// m.AddRepository(repoAlt) -// -// mp, err := m.ListPlugins() -// require.Error(t, err) -// require.Len(t, mp, 1) -//} diff --git a/cli/core/pkg/cli/options.go b/cli/core/pkg/cli/options.go deleted file mode 100644 index acf7f0635f..0000000000 --- a/cli/core/pkg/cli/options.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "path/filepath" - - "github.com/adrg/xdg" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -// optionsConfig is where the options are configured. -type optionsConfig struct { - // pluginRoot is the directory that contains the plugins. - pluginRoot string - - // gcpBucket is the bucket name for the gcp artifact repository. - gcpBucket string - - // gcpRootPath is the root bucket path for the gcp artifact repository. - gcpRootPath string - - // repoName is the repository name. - repoName string - - // distro is the plugin distro to install with the CLI. - distro cliapi.Distro - - // VersionSelector is the means to find versions of plugins in a repository. - versionSelector VersionSelector -} - -var ( - // DefaultPluginRoot is the default plugin root. - DefaultPluginRoot = filepath.Join(xdg.DataHome, "tanzu-cli") -) - -// makeDefaultOptions creates the default options for this namespace. -func makeDefaultOptions(list ...Option) optionsConfig { - opts := optionsConfig{ - // by default, the plugin root is at $XDG_DATA_HOME/tanzu-cli - pluginRoot: DefaultPluginRoot, - gcpRootPath: DefaultArtifactsDirectory, - distro: DefaultDistro, - versionSelector: DefaultVersionSelector, - } - - for _, o := range list { - o(&opts) - } - - return opts -} - -// Option is a filesystem store option. -type Option func(o *optionsConfig) - -// WithPluginRoot sets the root which directory plugins live in. -func WithPluginRoot(root string) Option { - return func(o *optionsConfig) { - o.pluginRoot = root - } -} - -// WithGCPBucket sets the gcp bucket to use for the artifact repository. -func WithGCPBucket(name string) Option { - return func(o *optionsConfig) { - o.gcpBucket = name - } -} - -// WithGCPRootPath sets the gcp bucket root path to use for the artifact repository. -func WithGCPRootPath(path string) Option { - return func(o *optionsConfig) { - o.gcpRootPath = path - } -} - -// WithDistro sets the distro that should be installed with the CLI -func WithDistro(distro cliapi.Distro) Option { - return func(o *optionsConfig) { - o.distro = distro - } -} - -// WithName sets the name -func WithName(name string) Option { - return func(o *optionsConfig) { - o.repoName = name - } -} - -// WithVersionSelector sets the version finder. -func WithVersionSelector(finder VersionSelector) Option { - return func(o *optionsConfig) { - o.versionSelector = finder - } -} diff --git a/cli/core/pkg/cli/repository.go b/cli/core/pkg/cli/repository.go deleted file mode 100644 index f551e36e5d..0000000000 --- a/cli/core/pkg/cli/repository.go +++ /dev/null @@ -1,547 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "context" - "fmt" - "io" - "os" - "path" - "path/filepath" - "runtime" - "strings" - "time" - - "cloud.google.com/go/storage" - "github.com/pkg/errors" - "google.golang.org/api/iterator" - "google.golang.org/api/option" - "gopkg.in/yaml.v2" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -// Repository is a remote repository containing plugin artifacts. -type Repository interface { - // List available plugins. - List() ([]Plugin, error) - - // Describe a plugin. - Describe(name string) (Plugin, error) - - // Fetch an artifact. - Fetch(name, version string, arch Arch) ([]byte, error) - - // Fetch an artifact test. - FetchTest(pluginName, version string, arch Arch) ([]byte, error) - - // Name of the repository. - Name() string - - // Manifest retrieves the manifest for the repo. - Manifest() (Manifest, error) - - // VersionSelector returns the version finder. - VersionSelector() VersionSelector -} - -// NewDefaultRepository returns the default repository. -func NewDefaultRepository() Repository { - return NewGCPBucketRepository() -} - -// Manifest is stored in the repository which gives an inventory of the artifacts. -type Manifest struct { - // Created is the time the manifest was created. - CreatedTime time.Time `json:"created" yaml:"created"` - - // Plugins is a list of plugin artifacts available. - Plugins []Plugin `json:"plugins" yaml:"plugins"` - - // Deprecated: Version of the root CLI. - Version string `json:"version" yaml:"version"` - - // CoreVersion of the root CLI. - CoreVersion string `json:"coreVersion" yaml:"coreVersion"` -} - -// GetCoreVersion returns the core version in a backwards compatible manner. -func (m *Manifest) GetCoreVersion() string { - if m.Version != "" { - return m.Version - } - return m.CoreVersion -} - -// Plugin is an installable CLI plugin. -type Plugin struct { - // Name is the name of the plugin. - Name string `json:"name" yaml:"name"` - - // Description is the plugin's description. - Description string `json:"description" yaml:"description"` - - // Versions available for plugin. - Versions []string `json:"versions" yaml:"versions"` -} - -// FindVersion finds the version using the version selector. -func (p *Plugin) FindVersion(selector VersionSelector) string { - if selector == nil { - selector = DefaultVersionSelector - } - return selector(p.Versions) -} - -// Arch represents a system architecture. -type Arch string - -// BuildArch returns compile time build arch or locates it. -func BuildArch() Arch { - return Arch(fmt.Sprintf("%s_%s", runtime.GOOS, runtime.GOARCH)) -} - -// IsWindows tells if an arch is windows. -func (a Arch) IsWindows() bool { - if a == Win386 || a == WinAMD64 { - return true - } - return false -} - -const ( - // Linux386 arch. - Linux386 Arch = "linux_386" - // LinuxAMD64 arch. - LinuxAMD64 Arch = "linux_amd64" - // LinuxARM64 arch. - LinuxARM64 Arch = "linux_arm64" - // DarwinAMD64 arch. - DarwinAMD64 Arch = "darwin_amd64" - // DarwinARM64 arch. - DarwinARM64 Arch = "darwin_arm64" - // Win386 arch. - Win386 Arch = "windows_386" - // WinAMD64 arch. - WinAMD64 Arch = "windows_amd64" - - // ManifestFileName is the file name for the manifest. - ManifestFileName = "manifest.yaml" - // PluginFileName is the file name for the plugin descriptor. - PluginFileName = "plugin.yaml" - // DefaultArtifactsDirectory is the root artifacts directory - DefaultArtifactsDirectory = "artifacts" - - // AllPlugins is the keyword for all plugins. - AllPlugins = "all" - - // DefaultManifestQueryTimeout is max time to wait for querying for a plugin manifest - DefaultManifestQueryTimeout = 5 * time.Second -) - -// GCPBucketRepository is a artifact repository utilizing a GCP bucket. -type GCPBucketRepository struct { - bucketName string - rootPath string - name string - versionSelector VersionSelector -} - -// LoadRepositories loads the repositories from the config file along with the known repositories. -func LoadRepositories(c *configapi.ClientConfig) []Repository { - repos := []Repository{} - if c.ClientOptions == nil { - c.ClientOptions = &configapi.ClientOptions{} - } - if c.ClientOptions.CLI == nil { - c.ClientOptions.CLI = &configapi.CLIOptions{} - } - - vs := LoadVersionSelector(c.ClientOptions.CLI.UnstableVersionSelector) - for _, repo := range c.ClientOptions.CLI.Repositories { - if repo.GCPPluginRepository == nil { - continue - } - repos = append(repos, loadRepository(repo, vs)) - } - return repos -} - -func loadRepository(repo configapi.PluginRepository, versionSelector VersionSelector) Repository { - opts := []Option{ - WithGCPBucket(repo.GCPPluginRepository.BucketName), - WithName(repo.GCPPluginRepository.Name), - WithVersionSelector(versionSelector), - } - if repo.GCPPluginRepository.RootPath != "" { - opts = append(opts, WithGCPRootPath(repo.GCPPluginRepository.RootPath)) - } - return NewGCPBucketRepository(opts...) -} - -// LoadVersionSelector will return the correct VersionSelector for a VersionSelectorLevel -func LoadVersionSelector(selectorType configapi.VersionSelectorLevel) (versionSelector VersionSelector) { - switch selectorType { - case configapi.AllUnstableVersions: - versionSelector = SelectVersionAny - case configapi.AlphaUnstableVersions: - versionSelector = SelectVersionAlpha - case configapi.ExperimentalUnstableVersions: - versionSelector = SelectVersionExperimental - case configapi.NoUnstableVersions: - versionSelector = DefaultVersionSelector - default: - versionSelector = DefaultVersionSelector - } - return -} - -// NewGCPBucketRepository returns a new GCP bucket repository. -func NewGCPBucketRepository(options ...Option) Repository { - opts := makeDefaultOptions(options...) - - return &GCPBucketRepository{ - bucketName: opts.gcpBucket, - rootPath: opts.gcpRootPath, - name: opts.repoName, - versionSelector: opts.versionSelector, - } -} - -// List available plugins. -func (g *GCPBucketRepository) List() (plugins []Plugin, err error) { - manifest, err := g.Manifest() - if err != nil { - return plugins, err - } - for _, plugin := range manifest.Plugins { - p, err := g.Describe(plugin.Name) - if err != nil { - return plugins, err - } - plugins = append(plugins, p) - } - return -} - -// Describe a plugin. -func (g *GCPBucketRepository) Describe(name string) (plugin Plugin, err error) { - ctx := context.Background() - - bkt, err := g.getBucket(ctx) - if err != nil { - return plugin, err - } - - pluginPath := path.Join(g.rootPath, name, PluginFileName) - - obj := bkt.Object(pluginPath) - if obj == nil { - return plugin, fmt.Errorf("artifact %q not found", name) - } - - r, err := obj.NewReader(ctx) - if err != nil { - return plugin, errors.Wrap(err, fmt.Sprintf("could not fetch artifact %q from repository", name)) - } - defer r.Close() - - d := yaml.NewDecoder(r) - - err = d.Decode(&plugin) - if err != nil { - return plugin, errors.Wrap(err, fmt.Sprintf("could not decode plugin %q decriptor", name)) - } - - pluginPath = path.Join(g.rootPath, name) - query := &storage.Query{Prefix: pluginPath} - - versionMap := map[string]string{} - it := bkt.Objects(ctx, query) - for { - attrs, err := it.Next() - if err == iterator.Done { - break - } - if err != nil { - return plugin, errors.Wrap(err, fmt.Sprintf("could not list versions for plugin %q", name)) - } - - // As of today the gcloud Go sdk doesn't allow for an effiecient means of listing by available - // prefixes or "directories" - pre := strings.TrimPrefix(attrs.Name, pluginPath) - split := strings.Split(pre, "/") - if len(split) < 1 { - return plugin, fmt.Errorf("could not retrieve version from bucket") - } - version := split[1] - - if version != PluginFileName { - versionMap[version] = "" - } - } - versions := []string{} - for version := range versionMap { - versions = append(versions, version) - } - plugin.Versions = versions - return plugin, err -} - -// Fetch an artifact. -func (g *GCPBucketRepository) Fetch(name, version string, arch Arch) ([]byte, error) { - ctx := context.Background() - - bkt, err := g.getBucket(ctx) - if err != nil { - return nil, err - } - - if version == VersionLatest { - plugin, err := g.Describe(name) - if err != nil { - return nil, err - } - version = plugin.FindVersion(g.versionSelector) - if version == "" { - return nil, fmt.Errorf("could not find a suitable version for plugin %q from versions %v", name, plugin.Versions) - } - } - - artifactPath := path.Join(g.rootPath, name, version, MakeArtifactName(name, arch)) - - return g.fetch(ctx, artifactPath, bkt) -} - -// FetchTest fetches a test artifact. -func (g *GCPBucketRepository) FetchTest(name, version string, arch Arch) ([]byte, error) { - ctx := context.Background() - - bkt, err := g.getBucket(ctx) - if err != nil { - return nil, err - } - - if version == VersionLatest { - plugin, err := g.Describe(name) - if err != nil { - return nil, err - } - version = plugin.FindVersion(g.versionSelector) - if version == "" { - return nil, fmt.Errorf("could not find a suitable version for test plugin %q from versions %v", name, plugin.Versions) - } - } - - artifactPath := path.Join(g.rootPath, name, version, "test", MakeTestArtifactName(name, arch)) - return g.fetch(ctx, artifactPath, bkt) -} - -func (g *GCPBucketRepository) fetch(ctx context.Context, artifactPath string, bkt *storage.BucketHandle) ([]byte, error) { - obj := bkt.Object(artifactPath) - if obj == nil { - return nil, fmt.Errorf("artifact %q not found", artifactPath) - } - - r, err := obj.NewReader(ctx) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("could not read artifact %q", artifactPath)) - } - defer r.Close() - - b, err := io.ReadAll(r) - if err != nil { - return nil, errors.Wrap(err, "could not fetch artifact") - } - return b, nil -} - -// Name of the repository. -func (g *GCPBucketRepository) Name() string { - return g.name -} - -// Manifest retrieves the manifest for a repository. -func (g *GCPBucketRepository) Manifest() (manifest Manifest, err error) { - ctx, cancel := context.WithTimeout(context.Background(), DefaultManifestQueryTimeout) - defer cancel() - - bkt, err := g.getBucket(ctx) - if err != nil { - return manifest, err - } - - manifestPath := path.Join(g.rootPath, ManifestFileName) - - obj := bkt.Object(manifestPath) - if obj == nil { - return manifest, fmt.Errorf("could not fetch manifest from repository %q", g.Name()) - } - - r, err := obj.NewReader(ctx) - if err != nil { - return manifest, errors.Wrap(err, fmt.Sprintf("could not fetch manifest from repository %q", g.Name())) - } - defer r.Close() - - d := yaml.NewDecoder(r) - - err = d.Decode(&manifest) - if err != nil { - return manifest, errors.Wrap(err, "could not decode plugin decriptor") - } - return manifest, nil -} - -func (g *GCPBucketRepository) getBucket(ctx context.Context) (*storage.BucketHandle, error) { - client, err := storage.NewClient(ctx, option.WithoutAuthentication()) - if err != nil { - return nil, errors.Wrap(err, "could not connect to repository") - } - bkt := client.Bucket(g.bucketName) - if bkt == nil { - return nil, fmt.Errorf("could not connect to repository") - } - return bkt, nil -} - -// VersionSelector returns the current default version finder. -func (g *GCPBucketRepository) VersionSelector() VersionSelector { - return g.versionSelector -} - -// LocalRepository is a artifact repository utilizing a local host os. -type LocalRepository struct { - path string - name string - versionSelector VersionSelector -} - -// DefaultLocalRepository is the default local repository. -var DefaultLocalRepository = &LocalRepository{ - path: fmt.Sprintf("./%s", DefaultArtifactsDirectory), -} - -// NewLocalRepository returns a new local repository. -func NewLocalRepository(name, localPath string, options ...Option) Repository { - opts := makeDefaultOptions(options...) - return &LocalRepository{ - path: localPath, - name: name, - versionSelector: opts.versionSelector, - } -} - -// List available plugins. -func (l *LocalRepository) List() (plugins []Plugin, err error) { - manifest, err := l.Manifest() - if err != nil { - return plugins, err - } - for _, plugin := range manifest.Plugins { - p, err := l.Describe(plugin.Name) - if err != nil { - return plugins, err - } - plugins = append(plugins, p) - } - return -} - -// Describe a plugin. -func (l *LocalRepository) Describe(name string) (plugin Plugin, err error) { - b, err := os.ReadFile(filepath.Join(l.path, name, PluginFileName)) - if err != nil { - err = fmt.Errorf("could not find plugin.yaml file for plugin %q: %v", name, err) - return - } - - err = yaml.Unmarshal(b, &plugin) - if err != nil { - return plugin, fmt.Errorf("could not unmarshal manifest.yaml: %v", err) - } - infos, err := os.ReadDir(filepath.Join(l.path, name)) - if err != nil { - return plugin, err - } - - versions := []string{} - for _, info := range infos { - if info.IsDir() { - versions = append(versions, info.Name()) - } - } - plugin.Versions = versions - return -} - -// Fetch an artifact. -func (l *LocalRepository) Fetch(name, version string, arch Arch) ([]byte, error) { - if version == "" { - return nil, fmt.Errorf("version cannot be empty for plugin %q", name) - } - if version == VersionLatest { - plugin, err := l.Describe(name) - if err != nil { - return nil, err - } - version = plugin.FindVersion(l.versionSelector) - if version == "" { - return nil, fmt.Errorf("could not find a suitable version for plugin %q from versions %v", name, plugin.Versions) - } - } - b, err := os.ReadFile(filepath.Join(l.path, name, version, MakeArtifactName(name, arch))) - if err != nil { - return nil, errors.Wrap(err, "could not find artifact at given path") - } - return b, nil -} - -// FetchTest fetches an artifact test. -func (l *LocalRepository) FetchTest(name, version string, arch Arch) ([]byte, error) { - if version == "" { - return nil, fmt.Errorf("version cannot be empty for plugin %q", name) - } - if version == VersionLatest { - plugin, err := l.Describe(name) - if err != nil { - return nil, err - } - version = plugin.FindVersion(l.versionSelector) - if version == "" { - return nil, fmt.Errorf("could not find a suitable version for test plugin %q from versions %v", name, plugin.Versions) - } - } - b, err := os.ReadFile(filepath.Join(l.path, name, version, "test", MakeTestArtifactName(name, arch))) - if err != nil { - return nil, errors.Wrap(err, "could not find artifact at given path") - } - return b, nil -} - -// Name of the repository. -func (l *LocalRepository) Name() string { - return l.name -} - -// Manifest returns the manifest for a local repository. -func (l *LocalRepository) Manifest() (manifest Manifest, err error) { - b, err := os.ReadFile(filepath.Join(l.path, ManifestFileName)) - if err != nil { - err = fmt.Errorf("could not find manifest.yaml file: %v", err) - return - } - - err = yaml.Unmarshal(b, &manifest) - if err != nil { - err = fmt.Errorf("could not unmarshal manifest.yaml: %v", err) - } - return -} - -// VersionSelector returns the current default version finder. -func (l *LocalRepository) VersionSelector() VersionSelector { - return l.versionSelector -} diff --git a/cli/core/pkg/cli/repository_test.go b/cli/core/pkg/cli/repository_test.go deleted file mode 100644 index 959f190ea9..0000000000 --- a/cli/core/pkg/cli/repository_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestGCPRepository(t *testing.T) { - modes := []configapi.VersionSelectorLevel{ - configapi.AllUnstableVersions, - configapi.AlphaUnstableVersions, - configapi.ExperimentalUnstableVersions, - configapi.NoUnstableVersions} - - for _, v := range modes { - testRepository(t, v) - } -} - -func testRepository(t *testing.T, versionSelectorName configapi.VersionSelectorLevel) { - vs := LoadVersionSelector(versionSelectorName) - - r := configapi.PluginRepository{GCPPluginRepository: &config.CoreGCPBucketRepository} - repo := loadRepository(r, vs) - list, err := repo.List() - require.NoError(t, err) - - require.GreaterOrEqual(t, len(list), 2) - - _, err = repo.Describe("cluster") - require.NoError(t, err) - - bin, err := repo.Fetch("cluster", VersionLatest, LinuxAMD64) - require.NoError(t, err) - - require.GreaterOrEqual(t, len(bin), 10) -} diff --git a/cli/core/pkg/cli/runner.go b/cli/core/pkg/cli/runner.go deleted file mode 100644 index 58e5aaaa36..0000000000 --- a/cli/core/pkg/cli/runner.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/aunum/log" -) - -// Runner is a plugin runner. -type Runner struct { - name string - args []string - pluginRoot string - pluginAbsPath string -} - -// NewRunner creates an instance of Runner. -func NewRunner(name, pluginAbsPath string, args []string, options ...Option) *Runner { - opts := makeDefaultOptions(options...) - - r := &Runner{ - name: name, - args: args, - pluginRoot: opts.pluginRoot, - pluginAbsPath: pluginAbsPath, - } - return r -} - -// Run runs a plugin. -func (r *Runner) Run(ctx context.Context) error { - return r.runStdOutput(ctx, r.pluginPath()) -} - -// RunTest runs a plugin test. -func (r *Runner) RunTest(ctx context.Context) error { - return r.runStdOutput(ctx, r.testPluginPath()) -} - -// runStdOutput runs a plugin and writes any output to the standard os.Stdout and os.Stderr. -func (r *Runner) runStdOutput(ctx context.Context, pluginPath string) error { - err := r.run(ctx, pluginPath, nil, nil) - if err != nil { - return err - } - return nil -} - -// RunOutput runs a plugin and returns the output. -func (r *Runner) RunOutput(ctx context.Context) (string, string, error) { - var stdout bytes.Buffer - var stderr bytes.Buffer - err := r.run(ctx, r.pluginPath(), &stdout, &stderr) - return stdout.String(), stderr.String(), err -} - -// run executes a command at pluginPath. If stdout and stderr are nil, any ouptut from command -// execution is emitted to os.Stdout and os.Stderr respectively. Otherwise any command output -// is captured in the bytes.Buffer. -func (r *Runner) run(ctx context.Context, pluginPath string, stdout, stderr *bytes.Buffer) error { - if BuildArch().IsWindows() && !strings.HasSuffix(pluginPath, ".exe") { - pluginPath += ".exe" - } - - info, err := os.Stat(pluginPath) - if err != nil { - // TODO (pbarker): should check if the plugin exists in the repository using fuzzy search and display how to install. - return fmt.Errorf("plugin %q does not exist, try using `tanzu plugin install %s` to install or `tanzu plugin list` to find plugins", r.name, r.name) - } - - if info.IsDir() { - return fmt.Errorf("%q is a directory", pluginPath) - } - - stateFile, err := os.CreateTemp("", "tanzu-cli-state") - if err != nil { - return fmt.Errorf("create state file: %w", err) - } - - defer func() { - if rErr := os.Remove(stateFile.Name()); rErr != nil { - log.Errorf("unable to remove plugin state file: %v", err) - } - }() - - state := &PluginState{ - Auth: "auth", - } - - if err := json.NewEncoder(stateFile).Encode(state); err != nil { - return fmt.Errorf("encode state: %w", err) - } - - if err := stateFile.Close(); err != nil { - return fmt.Errorf("close state file: %w", err) - } - - env := append(os.Environ(), fmt.Sprintf("%s=%s", EnvPluginStateKey, stateFile.Name())) - - log.Debugf("running command path %s args: %+v", pluginPath, r.args) - cmd := exec.CommandContext(ctx, pluginPath, r.args...) //nolint:gosec - - cmd.Env = env - cmd.Stdin = os.Stdin - // Check if the execution output should be captured - if stderr != nil { - cmd.Stderr = stderr - } else { - cmd.Stderr = os.Stderr - } - if stdout != nil { - cmd.Stdout = stdout - } else { - cmd.Stdout = os.Stdout - } - - err = cmd.Run() - return err -} - -func (r *Runner) pluginName() string { - return BinFromPluginName(r.name) -} - -func (r *Runner) pluginPath() string { - if r.pluginAbsPath != "" { - return r.pluginAbsPath - } - return filepath.Join(r.pluginRoot, r.pluginName()) -} - -func (r *Runner) testPluginPath() string { - return TestPluginPathFromPluginPath(r.pluginAbsPath) -} - -func TestPluginPathFromPluginPath(pluginPath string) string { - testPluginFilename := "test-" + filepath.Base(pluginPath) - return filepath.Join(filepath.Dir(pluginPath), testPluginFilename) -} diff --git a/cli/core/pkg/cli/state.go b/cli/core/pkg/cli/state.go deleted file mode 100644 index 7cedbd1e85..0000000000 --- a/cli/core/pkg/cli/state.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "encoding/json" - "fmt" - "os" -) - -const ( - // EnvPluginStateKey is the environment key that contains the path to the - // plugin state file. - EnvPluginStateKey = "TANZU_STATE" -) - -// PluginState is state that will be passed to plugins. -type PluginState struct { - Auth string `json:"auth" yaml:"auth"` -} - -// ReadPluginStateFromPath read states from a path on disk. -func ReadPluginStateFromPath(p string) (*PluginState, error) { - b, err := os.ReadFile(p) - if err != nil { - return nil, fmt.Errorf("read state: %w", err) - } - - s := &PluginState{} - if err := json.Unmarshal(b, s); err != nil { - return nil, fmt.Errorf("decode state: %w", err) - } - - return s, nil -} diff --git a/cli/core/pkg/cli/usage.go b/cli/core/pkg/cli/usage.go deleted file mode 100644 index 338889fbbf..0000000000 --- a/cli/core/pkg/cli/usage.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "fmt" - "io" - "os" - "text/template" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -// CmdMap is the map of command groups to plugins -type CmdMap map[string][]*cobra.Command - -// MainUsage create the main usage display for tanzu cli. -type MainUsage struct{} - -// NewMainUsage creates an instance of Usage. -func NewMainUsage() *MainUsage { - return &MainUsage{} -} - -// Func generates a usage func for cobra. -func (u *MainUsage) Func() func(*cobra.Command) error { - return func(c *cobra.Command) error { - return u.GenerateDescriptor(c, os.Stdout) - } -} - -// GenerateDescriptor generates a descriptor -func (u *MainUsage) GenerateDescriptor(c *cobra.Command, w io.Writer) error { - cmdMap := CmdMap{} - for _, cmd := range c.Commands() { - if cmd.Hidden { - continue - } - group := cmd.Annotations["group"] - if group == "" { - continue - } - g, ok := cmdMap[group] - if !ok { - g = []*cobra.Command{} - } - g = append(g, cmd) - cmdMap[group] = g - } - - var serverString string - - s, err := config.GetCurrentServer() - if err != nil { - serverString = "Not logged in" - } else { - serverString = fmt.Sprintf("Logged in to %s", component.Underline(s.Name)) - } - d := struct { - *cobra.Command - CmdMap CmdMap - ServerString string - }{ - c, - cmdMap, - serverString, - } - - t := template.Must(template.New("usage").Funcs(TemplateFuncs).Parse(u.Template())) - err = t.Execute(w, d) - if err != nil { - return err - } - return nil -} - -// Template returns the template for the main usage. -func (u *MainUsage) Template() string { - return `{{ bold "Usage:" }} - {{.Command.CommandPath}} [command]{{if .HasExample}} - -{{ bold "Examples:" }} - {{.Example}}{{end}} - -{{ bold "Available command groups:" }} -{{ range $group, $cmds := .CmdMap}} - {{ bold $group }}{{ range $cmd := $cmds }} - {{rpad $cmd.Name 24}}{{$cmd.Short}} {{end}} - {{end}} - -{{ bold "Flags:" }} -{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}} - -Use "{{.CommandPath}} [command] --help" for more information about a command. {{ if ne .ServerString "" }} - -{{ .ServerString }}{{end}} -` -} - -// SubCmdUsageFunc is the usage func for a plugin. -var SubCmdUsageFunc = func(c *cobra.Command) error { - t, err := template.New("usage").Funcs(TemplateFuncs).Parse(SubCmdTemplate) - if err != nil { - return err - } - return t.Execute(os.Stdout, c) -} - -// SubCmdTemplate is the template for plugin commands. -const SubCmdTemplate = `{{ bold "Usage:" }}{{if .Runnable}} -{{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} - {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}} - -{{ bold "Aliases:" }} - {{.NameAndAliases}}{{end}}{{if .HasExample}} - -{{ bold "Examples:" }} - {{.Example}}{{end}}{{if .HasAvailableSubCommands}} - -{{ bold "Available Commands:" }}{{range .Commands}}{{if .IsAvailableCommand }} - {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} - -{{ bold "Flags:" }} -{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} - -{{ bold "Global Flags:" }} -{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}} - -{{ bold "Additional help topics:" }}{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} - {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} - -Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} -` - -// TemplateFuncs are the template usage funcs. -var TemplateFuncs = template.FuncMap{ - "rpad": component.Rpad, - "bold": component.Bold, - "underline": component.Underline, - "trimTrailingWhitespaces": component.TrimRightSpace, - "beginsWith": component.BeginsWith, -} diff --git a/cli/core/pkg/cli/usage_test.go b/cli/core/pkg/cli/usage_test.go deleted file mode 100644 index 90ce20cba9..0000000000 --- a/cli/core/pkg/cli/usage_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "testing" - - "github.com/logrusorgru/aurora" - "github.com/spf13/cobra" - "github.com/stretchr/testify/require" -) - -func TestGenerateDescriptor(t *testing.T) { - m := MainUsage{} - - f := m.Func() - - c := &cobra.Command{ - Use: "tanzu", - Short: aurora.Bold(`Tanzu CLI`).String(), - } - - err := f(c) - require.NoError(t, err) -} diff --git a/cli/core/pkg/cli/version.go b/cli/core/pkg/cli/version.go deleted file mode 100644 index 3b101eee40..0000000000 --- a/cli/core/pkg/cli/version.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "strings" - - "golang.org/x/mod/semver" -) - -// VersionLatest is the latest version. -var VersionLatest = "latest" - -// VersionSelector returns a version from a set of versions. -type VersionSelector func(versions []string) string - -// DefaultVersionSelector is the default version selector. -var DefaultVersionSelector = SelectVersionStable - -// FilterVersions returns the list of valid versions depending on whether -// unstable versions are requested or not. -func FilterVersions(versions []string) (results []string) { - for _, version := range versions { - if !semver.IsValid(version) { - continue - } - results = append(results, version) - } - return -} - -// SelectVersionStable returns the latest stable version from a list of -// versions. If there are no stable versions it will return an empty string. -func SelectVersionStable(versions []string) (v string) { - for _, version := range FilterVersions(versions) { - // Both build and pre should be blank for stable versions - build := semver.Build(version) - if build != "" { - continue - } - - pre := semver.Prerelease(version) - if pre != "" { - continue - } - - c := semver.Compare(v, version) - if c == -1 { - v = version - } - } - return -} - -// SelectVersionAny returns the latest version from a list of versions including prereleases. -func SelectVersionAny(versions []string) (v string) { - for _, version := range FilterVersions(versions) { - c := semver.Compare(v, version) - if c == -1 { - v = version - } - } - return -} - -// SelectVersionAlpha specifically returns only -alpha tagged releases -func SelectVersionAlpha(versions []string) (v string) { - for _, version := range FilterVersions(versions) { - build := semver.Build(version) - if build != "" { - continue - } - - pre := semver.Prerelease(version) - if pre != "" && !strings.Contains(pre, "alpha") { - continue - } - - c := semver.Compare(v, version) - if c == -1 { - v = version - } - } - return -} - -// SelectVersionExperimental includes all prerelease tagged plugin versions, minus +build versions -func SelectVersionExperimental(versions []string) (v string) { - for _, version := range FilterVersions(versions) { - // All build releases are excluded from experimental - build := semver.Build(version) - if build != "" { - continue - } - - c := semver.Compare(v, version) - if c == -1 { - v = version - } - } - return -} diff --git a/cli/core/pkg/cli/version_test.go b/cli/core/pkg/cli/version_test.go deleted file mode 100644 index 4ee9101285..0000000000 --- a/cli/core/pkg/cli/version_test.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cli - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestSelectVersionStable(t *testing.T) { - for _, test := range []struct { - name string - versions []string - max string - }{ - { - name: "basic patch", - versions: []string{"v0.0.1", "v0.0.2"}, - max: "v0.0.2", - }, - { - name: "release candidates", - versions: []string{"v0.0.1", "v1.3.0-rc.1", "v1.3.0-pre-alpha-1"}, - max: "v0.0.1", - }, - { - name: "release candidates same", - versions: []string{"v0.0.1", "v1.3.0", "v1.3.0-rc.1", "v1.3.0-pre-alpha-1"}, - max: "v1.3.0", - }, - } { - t.Run(test.name, func(t *testing.T) { - p := Plugin{ - Name: "foo", - Versions: test.versions, - } - v := p.FindVersion(SelectVersionStable) - require.Equal(t, test.max, v) - }) - } -} - -func TestSelectVersionAny(t *testing.T) { - for _, test := range []struct { - name string - versions []string - max string - }{ - { - name: "basic patch", - versions: []string{"v0.0.1", "v0.0.2"}, - max: "v0.0.2", - }, - { - name: "release candidates", - versions: []string{"v0.0.1", "v1.3.0-rc.1", "v1.3.0-pre-alpha-1"}, - max: "v1.3.0-rc.1", - }, - { - name: "release candidates same", - versions: []string{"v0.0.1", "v1.3.0", "v1.3.0-rc.1", "v1.3.0-pre-alpha-1"}, - max: "v1.3.0", - }, - } { - t.Run(test.name, func(t *testing.T) { - p := Plugin{ - Name: "foo", - Versions: test.versions, - } - v := p.FindVersion(SelectVersionAny) - require.Equal(t, test.max, v) - }) - } -} - -func TestSelectVersionAlpha(t *testing.T) { - for _, test := range []struct { - name string - versions []string - max string - }{ - { - name: "basic patch", - versions: []string{"v0.0.1", "v0.0.2"}, - max: "v0.0.2", - }, - { - name: "alpha prerelease mixed with release candidate", - versions: []string{"v0.0.1", "v1.3.0-rc.1", "v1.4.0-alpha", "v1.5.0-alpha+meta1234"}, - max: "v1.4.0-alpha", - }, - { - name: "release candidates same", - versions: []string{"v0.0.1", "v1.3.0", "v1.3.0-rc.1", "v1.3.0-alpha"}, - max: "v1.3.0", - }, - } { - t.Run(test.name, func(t *testing.T) { - p := Plugin{ - Name: "foo", - Versions: test.versions, - } - v := p.FindVersion(SelectVersionAlpha) - require.Equal(t, test.max, v) - }) - } -} - -func TestSelectVersionExperimental(t *testing.T) { - for _, test := range []struct { - name string - versions []string - max string - }{ - { - name: "basic patch", - versions: []string{"v0.0.1", "v0.0.2"}, - max: "v0.0.2", - }, - { - name: "experimental builds and prereleases", - versions: []string{"v0.0.1", "v1.3.0-rc.1", "v1.4.0-random-nonalpha", "v1.4.1-rc.1+build546"}, - max: "v1.4.0-random-nonalpha", - }, - { - name: "stable release candidates", - versions: []string{"v0.0.1", "v1.3.0", "v1.3.0-rc.1", "v1.3.0-pre-alpha-1", "v1.3.0-rc.1+build546"}, - max: "v1.3.0", - }, - } { - t.Run(test.name, func(t *testing.T) { - p := Plugin{ - Name: "foo", - Versions: test.versions, - } - v := p.FindVersion(SelectVersionExperimental) - require.Equal(t, test.max, v) - }) - } -} - -func TestFilterVersions(t *testing.T) { - for _, test := range []struct { - name string - includeUnstable bool - versions []string - results []string - }{ - { - name: "ignore bad versions", - versions: []string{"v0.0.1", "dev", "bad.version.not.semver", "v0.0.2"}, - results: []string{"v0.0.1", "v0.0.2"}, - }, - { - name: "ignore bad versions including unstable", - versions: []string{"v0.0.1", "v1.3.0-rc.1", "v1.3.0-pre-alpha-1", "carrot"}, - results: []string{"v0.0.1", "v1.3.0-rc.1", "v1.3.0-pre-alpha-1"}, - }, - } { - t.Run(test.name, func(t *testing.T) { - v := FilterVersions(test.versions) - require.Equal(t, test.results, v) - }) - } -} diff --git a/cli/core/pkg/clientconfighelpers/helpers.go b/cli/core/pkg/clientconfighelpers/helpers.go deleted file mode 100644 index 0e40e9965a..0000000000 --- a/cli/core/pkg/clientconfighelpers/helpers.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package clientconfighelpers implements helper function -// related to client configurations -package clientconfighelpers - -import ( - "encoding/base64" - "os" - - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/configpaths" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/constants" -) - -// GetCustomRepositoryCaCertificateForClient returns CA certificate to use with cli client -// This function reads the CA certificate from following variables in decreasing order of precedence: -// 1. PROXY_CA_CERT -// 2. TKG_PROXY_CA_CERT -// 3. TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE -func GetCustomRepositoryCaCertificateForClient() ([]byte, error) { - caCert := "" - var errProxyCACert, errTkgProxyCACertValue, errCustomImageRepoCACert error - var proxyCACertValue, tkgProxyCACertValue, customImageRepoCACert string - - // Get the proxy configuration from os environment variable - proxyCACertValue = os.Getenv(constants.ProxyCACert) - tkgProxyCACertValue = os.Getenv(constants.TKGProxyCACert) - customImageRepoCACert = os.Getenv(constants.ConfigVariableCustomImageRepositoryCaCertificate) - - if errProxyCACert == nil && proxyCACertValue != "" { - caCert = proxyCACertValue - } else if errTkgProxyCACertValue == nil && tkgProxyCACertValue != "" { - caCert = tkgProxyCACertValue - } else if errCustomImageRepoCACert == nil && customImageRepoCACert != "" { - caCert = customImageRepoCACert - } else { - // return empty content when none is specified - return []byte{}, nil - } - - decoded, err := base64.StdEncoding.DecodeString(caCert) - if err != nil { - return nil, errors.Wrap(err, "unable to decode the base64-encoded custom registry CA certificate string") - } - return decoded, nil -} - -// AddRegistryTrustedRootCertsFileForWindows adds CA certificate to registry options for windows environments -func AddRegistryTrustedRootCertsFileForWindows(registryOpts *ctlimg.Opts) error { - filePath, err := configpaths.GetRegistryTrustedCACertFileForWindows() - if err != nil { - return err - } - err = os.WriteFile(filePath, projectsRegistryCA, constants.ConfigFilePermissions) - if err != nil { - return errors.Wrapf(err, "failed to write the registry trusted CA cert to file '%s'", filePath) - } - registryOpts.CACertPaths = append(registryOpts.CACertPaths, filePath) - return nil -} diff --git a/cli/core/pkg/clientconfighelpers/windows_trusted_ca.go b/cli/core/pkg/clientconfighelpers/windows_trusted_ca.go deleted file mode 100644 index 75e2f6f321..0000000000 --- a/cli/core/pkg/clientconfighelpers/windows_trusted_ca.go +++ /dev/null @@ -1,3553 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clientconfighelpers - -// The embedded CA bundle is fetched from https://wiki.mozilla.org/CA/Included_Certificates -// The exact URL from where the bundle is downloaded from - https://ccadb-public.secure.force.com/mozilla/IncludedRootsPEMTxt?TrustBitsInclude=Websites -// TODO: This bundle has to be updated periodically -var projectsRegistryCA = []byte(` ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw -gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL -Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg -MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw -BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 -MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 -c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ -bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ -2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E -T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j -5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM -C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T -DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX -wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A -2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm -nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 -dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl -N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj -c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS -5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS -Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr -hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ -B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI -AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw -H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ -b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk -2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol -IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk -5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY -n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD -VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU -ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH -MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO -MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv -Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz -f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO -8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq -d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM -tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt -Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB -o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x -PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM -wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d -GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH -6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby -RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG -EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo -bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ -TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s -b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 -WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS -fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB -zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq -hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB -CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD -+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG -A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg -SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v -dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ -BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ -HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH -3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH -GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c -xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 -aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq -TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 -/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 -kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG -YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT -+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo -WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG -EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx -IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND -IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci -MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti -sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O -BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB -Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c -3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J -0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV -BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g -Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ -BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ -R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF -dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw -vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ -uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp -n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs -cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW -xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P -rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF -DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx -DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy -LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C -eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ -d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq -kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC -b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl -qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 -OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c -NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk -ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO -pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj -03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk -PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE -1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX -QRBdJ3NghVdJIgc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 -MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc -tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd -IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j -b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC -AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw -ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m -iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF -Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ -hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P -Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE -EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV -1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t -CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR -5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw -f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 -ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK -GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG -SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN -FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w -DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw -CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh -DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw -CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x -ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 -c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx -OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI -SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI -b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn -swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu -7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 -1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW -80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP -JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l -RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw -hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 -coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc -BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n -twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud -DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W -0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe -uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q -lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB -aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE -sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT -MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe -qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh -VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 -h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 -EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK -yeC2nOnOcXHebD8WpHk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB -BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ -j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF -1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G -A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 -AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC -MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu -Sw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw -CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw -FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S -Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 -MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL -DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS -QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH -sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK -Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu -SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC -MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy -v+c= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL -BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x -FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx -MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s -THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc -IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU -AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ -GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 -8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH -flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt -J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim -0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN -pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ -UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW -OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB -AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet -8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd -nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j -bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM -Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv -TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS -S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr -I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 -b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB -UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P -Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven -sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw -RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY -BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz -MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u -LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 -v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd -e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw -V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA -AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG -GJTO ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa -Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 -YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw -qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv -Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 -lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz -Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ -KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK -FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj -HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr -y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ -/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM -a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 -fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG -SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi -7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc -SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza -ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc -XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg -iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho -L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF -Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr -kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ -vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU -YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV -BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk -LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv -b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ -BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg -THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v -IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv -xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H -Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB -eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo -jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ -+efcMQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG -A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw -FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx -MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u -aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b -RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z -YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 -QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw -yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ -BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ -SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH -r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 -4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me -dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw -q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 -nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu -H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA -VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC -XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd -6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf -+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi -kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 -wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB -TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C -MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn -4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I -aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy -qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB -8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy -dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 -YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 -dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh -IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD -LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG -EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g -KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD -ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu -bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg -ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R -85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm -4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV -HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd -QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t -lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB -o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 -opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo -dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW -ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN -AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y -/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k -SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy -Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS -Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl -nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA -MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD -VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy -MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt -c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ -OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG -vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud -316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo -0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE -y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF -zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE -+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN -I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs -x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa -ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC -4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 -7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg -JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti -2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk -pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF -FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt -rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk -ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 -u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP -4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 -N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 -vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx -CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD -ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw -MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex -HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq -R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd -yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ -7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 -+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNV -BAUTCUc2MzI4NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlk -YWQgZGUgQ2VydGlmaWNhY2lvbjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNV -BAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3QgQ0EwHhcNMTkwOTA0MTAwMDM4WhcN -MzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEwMQswCQYDVQQGEwJF -UzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQwEgYD -VQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9v -dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCj -cqQZAZ2cC4Ffc0m6p6zzBE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9q -yGFOtibBTI3/TO80sh9l2Ll49a2pcbnvT1gdpd50IJeh7WhM3pIXS7yr/2WanvtH -2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcvB2VSAKduyK9o7PQUlrZX -H1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXsezx76W0OL -zc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyR -p1RMVwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQz -W7i1o0TJrH93PB0j7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/ -SiOL9V8BY9KHcyi1Swr1+KuCLH5zJTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJn -LNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe8TZBAQIvfXOn3kLMTOmJDVb3 -n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVOHj1tyRRM4y5B -u8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj -o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AgEATh65isagmD9uw2nAalxJUqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L -9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzxj6ptBZNscsdW699QIyjlRRA96Gej -rw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDtdD+4E5UGUcjohybK -pFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM5gf0 -vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjq -OknkJjCb5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ -/zo1PqVUSlJZS2Db7v54EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ9 -2zg/LFis6ELhDtjTO0wugumDLmsx2d1Hhk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI -+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGyg77FGr8H6lnco4g175x2 -MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3r5+qPeoo -tt7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL -BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg -Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv -b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG -EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u -IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ -n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd -2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF -VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ -GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF -li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU -r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 -eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb -MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg -jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB -7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW -5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE -ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 -90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z -xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu -QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 -FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH -22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP -xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn -dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 -Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b -nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ -CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH -u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj -d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 -NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC -/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD -wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 -OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA -y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb -gfM0agPnIjhQW+0ZT0MW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs -MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg -Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL -MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl -YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv -b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l -mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE -4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv -a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M -pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw -Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b -LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY -AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB -AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq -E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr -W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ -CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU -X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 -f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja -H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP -JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P -zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt -jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 -/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT -BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 -aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW -xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU -63ZTGI0RmLo= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw -CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh -cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v -dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG -A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj -aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg -Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 -KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y -STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD -AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw -SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN -nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw -CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg -R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 -MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT -ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW -+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 -ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI -zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW -tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 -/q4AaOeMSQ+2b1tbFfLn ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw -CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw -JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT -EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 -WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT -LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX -BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE -KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm -Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 -EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J -UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn -nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6 -MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu -MScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNV -BAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwHhcNMTgwMzE2MTIxMDEzWhcNNDMw -MzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEg -U3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZ -n0EGze2jusDbCSzBfN8pfktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/q -p1x4EaTByIVcJdPTsuclzxFUl6s1wB52HO8AU5853BSlLCIls3Jy/I2z5T4IHhQq -NwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2fJmItdUDmj0VDT06qKhF -8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGtg/BKEiJ3 -HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGa -mqi4NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi -7VdNIuJGmj8PkTQkfVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSF -ytKAQd8FqKPVhJBPC/PgP5sZ0jeJP/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0P -qafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSYnjYJdmZm/Bo/6khUHL4wvYBQ -v3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHKHRzQ+8S1h9E6 -Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 -vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQAD -ggIBAEii1QALLtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4 -WxmB82M+w85bj/UvXgF2Ez8sALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvo -zMrnadyHncI013nR03e4qllY/p0m+jiGPp2Kh2RX5Rc64vmNueMzeMGQ2Ljdt4NR -5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8CYyqOhNf6DR5UMEQ -GfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA4kZf -5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq -0Uc9NneoWWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7D -P78v3DSk+yshzWePS/Tj6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTM -qJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmTOPQD8rv7gmsHINFSH5pkAnuYZttcTVoP -0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZckbxJF0WddCajJFdr60qZf -E2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx -CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE -AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 -NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ -MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq -AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 -vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 -lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD -n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT -7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o -6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC -TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 -WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R -DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI -pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj -YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy -rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ -8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi -0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM -A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS -SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K -TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF -6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er -3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt -Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT -VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW -ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA -rBPuUBQemMc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL -BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ -SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n -a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5 -NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT -CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u -Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO -dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI -VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV -9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY -2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY -vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt -bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb -x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+ -l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK -TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj -Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e -i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw -DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG -7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk -MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr -gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk -GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS -3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm -Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+ -l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c -JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP -L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa -LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG -mpv0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM -BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG -T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx -CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD -b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA -iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH -38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE -HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz -kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP -szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq -vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf -nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG -YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo -0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a -CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K -AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I -36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN -qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj -cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm -+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL -hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe -lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 -p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 -piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR -LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX -5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO -dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul -9XXeifdy ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi -QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR -HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D -9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 -p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo -27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w -Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw -TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl -qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH -szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 -Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk -MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 -wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p -aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN -VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb -C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe -QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy -h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 -7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J -ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef -MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ -Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT -6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ -0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm -2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb -bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt -nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY -6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu -MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k -RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg -f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV -+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo -dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW -Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa -G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq -gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H -vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 -0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC -B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u -NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg -yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev -HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 -xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR -TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg -JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV -7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl -6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G -jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 -4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 -VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm -ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD -VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw -MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g -UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT -BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx -uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV -HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ -+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 -bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD -VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw -MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV -UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy -b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR -ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb -hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 -FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV -L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB -iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl -MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw -NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG -EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N -aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ -Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 -ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 -HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm -gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ -jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc -aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG -YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 -W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K -UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH -+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q -W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC -LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC -gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 -tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh -SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 -TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 -pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR -xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp -GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 -dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN -AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB -RA+GsCyRxj3qrg+E ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 -NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS -zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 -QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ -VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW -wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV -dWNbFJWcHwHP2NVypw87 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu -hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l -xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 -CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx -sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM -f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX -mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 -zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P -fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc -vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 -Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp -zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO -Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW -k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ -DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF -lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW -Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z -XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR -gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 -d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv -J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg -DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM -+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy -F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 -SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws -E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv -CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg -GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu -XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd -re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu -PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 -mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K -8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj -x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR -nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 -kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok -twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp -8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT -vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT -z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA -pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb -pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB -R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R -RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk -0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC -5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF -izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn -yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout -736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A -DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk -fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA -njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- -`) diff --git a/cli/core/pkg/cluster/client.go b/cli/core/pkg/cluster/client.go deleted file mode 100644 index 405c10ac90..0000000000 --- a/cli/core/pkg/cluster/client.go +++ /dev/null @@ -1,322 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package cluster provides functions to manipulate the package -package cluster - -import ( - "context" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/selection" - "k8s.io/apimachinery/pkg/version" - "k8s.io/client-go/discovery" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/apiutil" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - capdiscovery "github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/constants" -) - -var ( - scheme = runtime.NewScheme() -) - -func init() { - _ = corev1.AddToScheme(scheme) - _ = appsv1.AddToScheme(scheme) - _ = cliv1alpha1.AddToScheme(scheme) -} - -// Client provides various aspects of interaction with a Kubernetes cluster provisioned by TKG -// -//go:generate counterfeiter -o ../fakes/clusterclient_fake.go --fake-name ClusterClient . Client -type Client interface { - // ListCLIPluginResources lists CLIPlugin resources across all namespaces - ListCLIPluginResources() ([]cliv1alpha1.CLIPlugin, error) - // VerifyCLIPluginCRD returns true if CRD exists else return false - VerifyCLIPluginCRD() (bool, error) - // GetCLIPluginImageRepositoryOverride returns map of image repository override - GetCLIPluginImageRepositoryOverride() (map[string]string, error) - - // BuildClusterQuery builds ClusterQuery with Dynamic client and Discovery client - BuildClusterQuery() (*capdiscovery.ClusterQuery, error) -} - -//go:generate counterfeiter -o ../fakes/CrtClient_fake.go --fake-name CrtClientFake . CrtClient -//go:generate counterfeiter -o ../fakes/discoveryclusterclient_fake.go --fake-name DiscoveryClient . DiscoveryClient - -// CrtClient clientset interface -type CrtClient interface { - NewClient(config *rest.Config, options crtclient.Options) (crtclient.Client, error) - ListObjects(ctx context.Context, cliPlugins crtclient.ObjectList, listOptions *crtclient.ListOptions) error -} -type CrtClientImpl struct { - crtClient crtclient.Client -} - -func (c *CrtClientImpl) NewClient(config *rest.Config, options crtclient.Options) (crtclient.Client, error) { - crtClient, err := crtclient.New(config, options) - c.crtClient = crtClient - return crtClient, err -} -func (c *CrtClientImpl) ListObjects(ctx context.Context, cliPlugins crtclient.ObjectList, listOptions *crtclient.ListOptions) error { - return c.crtClient.List(ctx, cliPlugins, listOptions) -} - -// DiscoveryClient discovery client interface -type DiscoveryClient interface { - discovery.DiscoveryInterface -} - -type DynamicClient interface { - dynamic.Interface -} - -type client struct { - CrtClient CrtClient - DiscoveryClient DiscoveryClient - DynamicClient DynamicClient - kubeConfigPath string - currentContext string -} - -// NewClient creates new clusterclient from kubeconfig file and poller -// if kubeconfig path is empty it gets default path -// if options.poller is nil it creates default poller. You should only pass custom poller for unit testing -// if options.crtClientFactory is nil it creates default CrtClientFactory -func NewClient(kubeConfigPath, contextStr string, options Options) (Client, error) { - var err error - var rules *clientcmd.ClientConfigLoadingRules - if kubeConfigPath == "" { - rules = clientcmd.NewDefaultClientConfigLoadingRules() - kubeConfigPath = rules.GetDefaultFilename() - } - InitializeOptions(&options) - client := &client{ - kubeConfigPath: kubeConfigPath, - currentContext: contextStr, - } - - err = client.getK8sClients(options.CrtClient, options.DiscoveryClientFactory, options.DynamicClientFactory) - if err != nil { - return nil, err - } - return client, nil -} - -// InitializeOptions initializes the options -func InitializeOptions(options *Options) { - if options.CrtClient == nil { - options.CrtClient = &CrtClientImpl{} - } - if options.DiscoveryClientFactory == nil { - options.DiscoveryClientFactory = &discoveryClientFactory{} - } - - if options.DynamicClientFactory == nil { - options.DynamicClientFactory = &dynamicClientFactory{} - } -} - -// VerifyCLIPluginCRD returns true if CRD exists else return false -func (c *client) VerifyCLIPluginCRD() (bool, error) { - // Since we're looking up API types via discovery, we don't need the dynamic client. - cqc, err := c.BuildClusterQuery() - if err != nil { - return false, err - } - - // Execute returns combined result of all queries. - return cqc.Execute() // return (found, err) response -} - -func (c *client) BuildClusterQuery() (*capdiscovery.ClusterQuery, error) { - clusterQueryClient, err := capdiscovery.NewClusterQueryClient(c.DynamicClient, c.DiscoveryClient) - if err != nil { - return nil, err - } - - var queryObject = capdiscovery.Group("cliPlugins", cliv1alpha1.GroupVersionKindCLIPlugin.Group).WithResource("cliplugins") - - // Build query client. - return clusterQueryClient.Query(queryObject), nil -} - -// ListCLIPluginResources lists CLIPlugin resources across all namespaces -func (c *client) ListCLIPluginResources() ([]cliv1alpha1.CLIPlugin, error) { - var cliPlugins cliv1alpha1.CLIPluginList - err := c.CrtClient.ListObjects(context.TODO(), &cliPlugins, &crtclient.ListOptions{Namespace: ""}) - if err != nil { - return nil, err - } - return cliPlugins.Items, nil -} - -// GetCLIPluginImageRepositoryOverride returns map of image repository override -func (c *client) GetCLIPluginImageRepositoryOverride() (map[string]string, error) { - cmList := &corev1.ConfigMapList{} - - labelMatch, _ := labels.NewRequirement(constants.CLIPluginImageRepositoryOverrideLabel, selection.Exists, []string{}) - labelSelector := labels.NewSelector() - labelSelector = labelSelector.Add(*labelMatch) - - err := c.CrtClient.ListObjects(context.TODO(), cmList, &crtclient.ListOptions{Namespace: constants.TanzuCLISystemNamespace, LabelSelector: labelSelector}) - if err != nil { - return nil, err - } - return ConsolidateImageRepoMaps(cmList) -} - -func ConsolidateImageRepoMaps(cmList *corev1.ConfigMapList) (map[string]string, error) { - imageRepoMap := make(map[string]string) - - for i := range cmList.Items { - mapString, ok := cmList.Items[i].Data["imageRepoMap"] - if !ok { - continue - } - irm := make(map[string]string) - - _ = yaml.Unmarshal([]byte(mapString), &irm) - for k, v := range irm { - if _, exists := imageRepoMap[k]; exists { - return nil, errors.Errorf("multiple references of image repository %q found while doing image repository override", k) - } - imageRepoMap[k] = v - } - } - return imageRepoMap, nil -} - -func (c *client) getK8sClients(crtClient CrtClient, discoveryClientFactory DiscoveryClientFactory, dynamicClientFactory DynamicClientFactory) error { - var discoveryClient discovery.DiscoveryInterface - config, err := clientcmd.LoadFromFile(c.kubeConfigPath) - if err != nil { - return errors.Errorf("Failed to load Kubeconfig file from %q", c.kubeConfigPath) - } - configOverrides := &clientcmd.ConfigOverrides{} - if c.currentContext != "" { - configOverrides.CurrentContext = c.currentContext - } - - restConfig, err := clientcmd.NewDefaultClientConfig(*config, configOverrides).ClientConfig() - if err != nil { - return errors.Errorf("Unable to set up rest config due to : %v", err) - } - // As there are many registered resources in the cluster, set the values for the maximum number of - // queries per second and the maximum burst for throttle to a high value to avoid throttling of messages - restConfig.QPS = constants.DefaultQPS - restConfig.Burst = constants.DefaultBurst - mapper, err := apiutil.NewDynamicRESTMapper(restConfig, apiutil.WithLazyDiscovery) - if err != nil { - return errors.Errorf("Unable to set up rest mapper due to : %v", err) - } - - _, err = crtClient.NewClient(restConfig, crtclient.Options{Scheme: scheme, Mapper: mapper}) - if err != nil { - // TODO catch real errors that doesn't warrant retrying and abort - return errors.Errorf("Error getting controller client due to : %v", err) - } - - discoveryClient, err = discoveryClientFactory.NewDiscoveryClientForConfig(restConfig) - if err != nil { - return errors.Errorf("Error getting discovery client due to : %v", err) - } - - if _, err := discoveryClientFactory.ServerVersion(discoveryClient); err != nil { - return errors.Errorf("Failed to invoke API on cluster : %v", err) - } - - dynamicClient, err := dynamicClientFactory.NewDynamicClientForConfig(restConfig) - if err != nil { - return errors.Errorf("Error getting dynamic client due to : %v", err) - } - c.CrtClient = crtClient - c.DiscoveryClient = discoveryClient - c.DynamicClient = dynamicClient - - return nil -} - -//go:generate counterfeiter -o ../fakes/discoveryclientfactory_fake.go --fake-name DiscoveryClientFactory . DiscoveryClientFactory - -// DiscoveryClientFactory is a interface to create discovery client -type DiscoveryClientFactory interface { - NewDiscoveryClientForConfig(config *rest.Config) (discovery.DiscoveryInterface, error) - ServerVersion(discoveryClient discovery.DiscoveryInterface) (*version.Info, error) -} - -type discoveryClientFactory struct { -} - -func NewDiscoveryClientFactory() DiscoveryClientFactory { - return &discoveryClientFactory{} -} - -// NewDiscoveryClientForConfig creates new discovery client factory -func (c *discoveryClientFactory) NewDiscoveryClientForConfig(config *rest.Config) (discovery.DiscoveryInterface, error) { - return discovery.NewDiscoveryClientForConfig(config) -} - -func (c *discoveryClientFactory) ServerVersion(discoveryClient discovery.DiscoveryInterface) (*version.Info, error) { - return discoveryClient.ServerVersion() -} - -//go:generate counterfeiter -o ../fakes/dynamicclientfactory_fake.go --fake-name DynamicClientFactory . DynamicClientFactory - -// DynamicClientFactory is a interface to create adynamic client -type DynamicClientFactory interface { - NewDynamicClientForConfig(config *rest.Config) (dynamic.Interface, error) -} - -type dynamicClientFactory struct{} - -// NewDynamicClientForConfig creates a new discovery client factory -func (c *dynamicClientFactory) NewDynamicClientForConfig(restConfig *rest.Config) (dynamic.Interface, error) { - return dynamic.NewForConfig(restConfig) -} - -// Options provides way to customize creation of clusterClient -type Options struct { - CrtClient CrtClient - DiscoveryClientFactory DiscoveryClientFactory - DynamicClientFactory DynamicClientFactory -} - -// NewOptions returns new options -func NewOptions(crtClient CrtClient, discoveryClientFactory DiscoveryClientFactory, dynamicClientFactory DynamicClientFactory) Options { - return Options{ - CrtClient: crtClient, - DiscoveryClientFactory: discoveryClientFactory, - DynamicClientFactory: dynamicClientFactory, - } -} - -//go:generate counterfeiter -o ../fakes/clusterclientfactory_fake.go --fake-name ClusterClientFactory . ClusterClientFactory - -// ClusterClientFactory a factory for creating cluster clients -type ClusterClientFactory interface { - NewClient(kubeConfigPath, context string, options Options) (Client, error) -} - -type clusterClientFactory struct{} - -// NewClient creates new clusterclient -func (c *clusterClientFactory) NewClient(kubeConfigPath, contextStr string, options Options) (Client, error) { - return NewClient(kubeConfigPath, contextStr, options) -} - -// NewClusterClientFactory creates new clusterclient factory -func NewClusterClientFactory() ClusterClientFactory { - return &clusterClientFactory{} -} diff --git a/cli/core/pkg/cluster/client_test.go b/cli/core/pkg/cluster/client_test.go deleted file mode 100644 index af9d33a649..0000000000 --- a/cli/core/pkg/cluster/client_test.go +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package cluster_test provides unit test cases for cluster package -package cluster_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "k8s.io/client-go/discovery" - - cluster "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cluster" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/fakes" -) - -var ( - crtClientFake *fakes.CrtClientFake - discoveryClientFactoryFake *fakes.DiscoveryClientFactory - dynamicClientFactoryFake *fakes.DynamicClientFactory - options cluster.Options - optionsTest cluster.Options - kubeconfiFile string - clusterClient cluster.Client -) - -func TestCliCorePkgClusterSuite(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cli/core/pkg/cluster Suite") -} - -var _ = Describe("New Cluster Client Tests", func() { - BeforeEach(func() { - crtClientFake = &fakes.CrtClientFake{} - discoveryClientFactoryFake = &fakes.DiscoveryClientFactory{} - dynamicClientFactoryFake = &fakes.DynamicClientFactory{} - options = cluster.NewOptions(crtClientFake, discoveryClientFactoryFake, dynamicClientFactoryFake) - kubeconfiFile = "../fakes/config/kubeconfig1.yaml" - }) - When("kubeconfig and context is valid ", func() { - BeforeEach(func() { - discoveryClientFactoryFake.NewDiscoveryClientForConfigReturns(&discovery.DiscoveryClient{}, nil) - discoveryClientFactoryFake.ServerVersionReturns(nil, nil) - }) - It("return cluster client", func() { - client, err := cluster.NewClient(kubeconfiFile, "federal-context", options) - Expect(client).NotTo(BeNil()) - Expect(err).To(BeNil()) - }) - It("initialize options with default values", func() { - cluster.InitializeOptions(&optionsTest) - Expect(optionsTest.CrtClient).NotTo(BeNil()) - Expect(optionsTest.DiscoveryClientFactory).NotTo(BeNil()) - Expect(optionsTest.DynamicClientFactory).NotTo(BeNil()) - }) - Context("when list plugin's don't return any plugins ", func() { - BeforeEach(func() { - discoveryClientFactoryFake.NewDiscoveryClientForConfigReturns(&discovery.DiscoveryClient{}, nil) - discoveryClientFactoryFake.ServerVersionReturns(nil, nil) - clusterClient, _ = cluster.NewClient(kubeconfiFile, "federal-context", options) - crtClientFake.ListObjectsReturns(nil) - }) - It("return empty plugins and no error", func() { - plugins, err := clusterClient.ListCLIPluginResources() - Expect(plugins).To(BeNil()) - Expect(err).To(BeNil()) - }) - }) - Context("when BuildClusterQuery() called", func() { - BeforeEach(func() { - discoveryClientFactoryFake.NewDiscoveryClientForConfigReturns(&discovery.DiscoveryClient{}, nil) - discoveryClientFactoryFake.ServerVersionReturns(nil, nil) - clusterClient, _ = cluster.NewClient(kubeconfiFile, "federal-context", options) - crtClientFake.ListObjectsReturns(nil) - }) - It("return clusterQuery object and no errors", func() { - isExecuted, err := clusterClient.BuildClusterQuery() - Expect(isExecuted).NotTo(BeNil()) - Expect(err).To(BeNil()) - }) - }) - Context("when GetCLIPluginImageRepositoryOverride() called", func() { - BeforeEach(func() { - discoveryClientFactoryFake.NewDiscoveryClientForConfigReturns(&discovery.DiscoveryClient{}, nil) - discoveryClientFactoryFake.ServerVersionReturns(nil, nil) - clusterClient, _ = cluster.NewClient(kubeconfiFile, "federal-context", options) - crtClientFake.ListObjectsReturns(nil) - }) - It("return empty map and no error", func() { - mapObj, err := clusterClient.GetCLIPluginImageRepositoryOverride() - Expect(len(mapObj)).To(Equal(0)) - Expect(err).To(BeNil()) - }) - }) - }) - - When("kubeconfig is not valid ", func() { - BeforeEach(func() { - discoveryClientFactoryFake.NewDiscoveryClientForConfigReturns(&discovery.DiscoveryClient{}, nil) - discoveryClientFactoryFake.ServerVersionReturns(nil, nil) - kubeconfiFile = "invalidkubeconfigfile.yaml" - }) - It("should return error for NewClient()", func() { - client, err := cluster.NewClient(kubeconfiFile, "federal-context", options) - Expect(client).To(BeNil()) - Expect(err.Error()).To(ContainSubstring("Failed to load Kubeconfig file from \"invalidkubeconfigfile.yaml\"")) - }) - }) - - Context("Create ClusterClientFactory", func() { - It("return object for clusterClientFactory", func() { - ccf := cluster.NewClusterClientFactory() - Expect(ccf).NotTo(BeNil()) - }) - }) - - Context("Create DiscoveryClientFactory", func() { - It("return object for discoveryClientFactory", func() { - dcf := cluster.NewDiscoveryClientFactory() - Expect(dcf).NotTo(BeNil()) - }) - }) - - Context("test ConsolidateImageRepoMaps() helper", func() { - It("should consolidate imageRepoMaps", func() { - cmList := &corev1.ConfigMapList{} - cmList.Items = append(cmList.Items, ConfigMapObject()) - - irm, err := cluster.ConsolidateImageRepoMaps(cmList) - Expect(irm).NotTo(BeNil()) - Expect(len(irm)).To(Equal(2)) - Expect(err).To(BeNil()) - }) - }) -}) - -func ConfigMapObject() corev1.ConfigMap { - imageRepoMapString := `staging.repo.com: stage.custom.repo.com -prod.repo.com: prod.custom.repo.com` - configMap := corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "image-repository-override", - Namespace: "tanzu-cli-system", - Labels: map[string]string{ - "cli.tanzu.vmware.com/cliplugin-image-repository-override": "", - }, - }, - Data: map[string]string{ - "imageRepoMap": imageRepoMapString, - }, - } - return configMap -} - -/* -var _ = Context("New Cluster Client Tests", func() { - BeforeEach(func() { - discoveryClientFactoryFake.NewDiscoveryClientForConfigReturns(&discovery.DiscoveryClient{}, nil) - discoveryClientFactoryFake.ServerVersionReturns(nil, nil) - }) - It("return cluster client", func() { - plugins, err := ListCLIPluginResources() - Expect(plugins).NotTo(BeNil()) - Expect(err).To(BeNil()) - }) -}) -*/ diff --git a/cli/core/pkg/command/completion.go b/cli/core/pkg/command/completion.go deleted file mode 100644 index e25207198b..0000000000 --- a/cli/core/pkg/command/completion.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "errors" - "fmt" - "io" - "os" - "strings" - - "github.com/lithammer/dedent" - "github.com/spf13/cobra" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -var ( - completionShells = []string{ - "bash", - "zsh", - "fish", - "powershell", - } - - completionLongDesc = dedent.Dedent(` - Output shell completion code for the specified shell %v. - - The shell completion code must be evaluated to provide completion. See Examples - for how to perform this for your given shell. - - Note for bash users: make sure the bash-completions package has been installed.`) - - completionExamples = dedent.Dedent(` - # Bash instructions: - - ## Load only for current session: - source <(tanzu completion bash) - - ## Load for all new sessions: - tanzu completion bash > $HOME/.config/tanzu/completion.bash.inc - printf "\n# Tanzu shell completion\nsource '$HOME/.config/tanzu/completion.bash.inc'\n" >> $HOME/.bash_profile - - ## NOTE: the bash-completion package must be installed. - - # Zsh instructions: - - ## Load only for current session: - autoload -U compinit; compinit - source <(tanzu completion zsh) - compdef _tanzu tanzu - - ## Load for all new sessions: - echo "autoload -U compinit; compinit" >> ~/.zshrc - tanzu completion zsh > "${fpath[1]}/_tanzu" - - # Fish instructions: - - ## Load only for current session: - tanzu completion fish | source - - ## Load for all new sessions: - tanzu completion fish > ~/.config/fish/completions/tanzu.fish - - # Powershell instructions: - - ## Load only for current session: - tanzu completion powershell | Out-String | Invoke-Expression - - ## Load for all new sessions: - Add the output of the above command to your powershell profile.`) -) - -// completionCmd represents the completion command -var completionCmd = &cobra.Command{ - Use: fmt.Sprintf("completion %v", completionShells), - Short: "Output shell completion code", - Long: fmt.Sprintf(completionLongDesc, completionShells), - Example: completionExamples, - DisableFlagsInUseLine: true, - ValidArgs: completionShells, - RunE: func(cmd *cobra.Command, args []string) error { - return runCompletion(os.Stdout, cmd, args) - }, - Annotations: map[string]string{ - "group": string(cliapi.SystemCmdGroup), - }, -} - -func runCompletion(out io.Writer, cmd *cobra.Command, args []string) error { - if length := len(args); length == 0 { - return fmt.Errorf("shell not specified, choose one of: %v", completionShells) - } else if length > 1 { - return errors.New("too many arguments, expected only the shell type") - } - - switch strings.ToLower(args[0]) { - case "bash": - return cmd.Root().GenBashCompletionV2(out, true) - case "zsh": - return cmd.Root().GenZshCompletion(out) - case "fish": - return cmd.Root().GenFishCompletion(out, true) - case "powershell", "pwsh": - return cmd.Root().GenPowerShellCompletionWithDesc(out) - default: - return errors.New("unrecognized shell type specified") - } -} diff --git a/cli/core/pkg/command/completion_test.go b/cli/core/pkg/command/completion_test.go deleted file mode 100644 index 9b60b998f2..0000000000 --- a/cli/core/pkg/command/completion_test.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "bytes" - "strings" - "testing" -) - -// Test_runCompletion_MissingArg validates functionality when shell name is not provided. -func Test_runCompletion_MissingArg(t *testing.T) { - var out bytes.Buffer - var args []string - err := runCompletion(&out, completionCmd, args) - if err == nil { - t.Error("Missing shell argument should have resulted in an error") - } - - if !strings.Contains(err.Error(), "not specified") { - t.Errorf("Unexpected error returned for missing argument: %s", err.Error()) - } - - if out.String() != "" { - t.Errorf("Unexpected output received: %s", out.String()) - } -} - -// Test_runCompletion_InvalidArg validates functionality when shell name is invalid. -func Test_runCompletion_InvalidArg(t *testing.T) { - var out bytes.Buffer - args := []string{"cmd.exe"} - err := runCompletion(&out, completionCmd, args) - if err == nil { - t.Error("Invalid shell argument should have resulted in an error") - } - - if !strings.Contains(err.Error(), "unrecognized") { - t.Errorf("Unexpected error returned for invalid shell argument: %s", err.Error()) - } - - if out.String() != "" { - t.Errorf("Unexpected output received: %s", out.String()) - } -} - -// Test_runCompletion_WrongArgs validates functionality with too many arguments. -func Test_runCompletion_WrongArgs(t *testing.T) { - var out bytes.Buffer - args := []string{"bash", "zsh"} - err := runCompletion(&out, completionCmd, args) - if err == nil { - t.Error("Invalid shell argument should have resulted in an error") - } - - if !strings.Contains(err.Error(), "too many arguments") { - t.Errorf("Unexpected error returned for invalid shell argument: %s", err.Error()) - } - - if out.String() != "" { - t.Errorf("Unexpected output received: %s", out.String()) - } -} - -// Test_runCompletion_Bash validates functionality for bash shell completion. -func Test_runCompletion_Bash(t *testing.T) { - var out bytes.Buffer - args := []string{"bash"} - err := runCompletion(&out, completionCmd, args) - if err != nil { - t.Errorf("Unexpected error for valid shell: %v", err) - } - - // Check for a snippet of the bash completion output - // TODO make this test less brittle - if !strings.Contains(out.String(), "# bash completion V2 for completion") { - t.Errorf("Unexpected output for the bash shell script: %s", out.String()) - } -} - -// Test_runCompletion_Zsh validates functionality for zsh shell completion. -func Test_runCompletion_Zsh(t *testing.T) { - var out bytes.Buffer - args := []string{"zsh"} - err := runCompletion(&out, completionCmd, args) - if err != nil { - t.Errorf("Unexpected error for valid shell: %v", err) - } - - // Check for a snippet of the zsh completion output - if !strings.Contains(out.String(), "# For zsh, when completing a flag with an = (e.g., completion -n=)") { - t.Errorf("Unexpected output for the zsh shell script: %s", out.String()) - } -} - -// Test_runCompletion_Fish validates functionality for fish shell completion. -func Test_runCompletion_Fish(t *testing.T) { - var out bytes.Buffer - args := []string{"fish"} - err := runCompletion(&out, completionCmd, args) - if err != nil { - t.Errorf("Unexpected error for valid shell: %v", err) - } - - // Check for a snippet of the fish completion output - if !strings.Contains(out.String(), "# For Fish, when completing a flag with an = (e.g., -n=)") { - t.Errorf("Unexpected output for the fish shell script: %s", out.String()) - } -} - -// Test_runCompletion_Pwsh validates functionality for powershell completion. -func Test_runCompletion_Pwsh(t *testing.T) { - var out bytes.Buffer - args := []string{"powershell"} - err := runCompletion(&out, completionCmd, args) - if err != nil { - t.Errorf("Unexpected error for valid shell: %v", err) - } - - // Check for a snippet of the powershell completion output - if !strings.Contains(out.String(), "# PowerShell supports three different completion modes") { - t.Errorf("Unexpected output for the powershell script: %s", out.String()) - } -} diff --git a/cli/core/pkg/command/config.go b/cli/core/pkg/command/config.go deleted file mode 100644 index e53c222904..0000000000 --- a/cli/core/pkg/command/config.go +++ /dev/null @@ -1,368 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "fmt" - "strings" - - "github.com/aunum/log" - "github.com/pkg/errors" - "github.com/spf13/cobra" - "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - configlib "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -// ConfigLiterals used with set/unset commands -const ( - ConfigLiteralFeatures = "features" - ConfigLiteralEnv = "env" -) - -func init() { - configCmd.SetUsageFunc(cli.SubCmdUsageFunc) - configCmd.AddCommand( - getConfigCmd, - initConfigCmd, - setConfigCmd, - unsetConfigCmd, - serversCmd, - ) - serversCmd.AddCommand(listServersCmd) - addDeleteServersCmd() -} - -var unattended bool - -func addDeleteServersCmd() { - listServersCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table)") - deleteServersCmd.Flags().BoolVarP(&unattended, "yes", "y", false, "Delete the server entry without confirmation") - serversCmd.AddCommand(deleteServersCmd) -} - -var configCmd = &cobra.Command{ - Use: "config", - Short: "Configuration for the CLI", - Annotations: map[string]string{ - "group": string(cliapi.SystemCmdGroup), - }, -} - -var getConfigCmd = &cobra.Command{ - Use: "get", - Short: "Get the current configuration", - RunE: func(cmd *cobra.Command, args []string) error { - cfg, err := configlib.GetClientConfig() - if err != nil { - return err - } - - b, err := yaml.Marshal(&cfg) - if err != nil { - return err - } - fmt.Println(string(b)) - return nil - }, -} - -var setConfigCmd = &cobra.Command{ - Use: "set ", - Short: "Set config values at the given path", - Long: "Set config values at the given path. path values: [unstable-versions, cli.edition, features.global., features.., env.]", - RunE: func(cmd *cobra.Command, args []string) error { - if len(args) < 2 { - return errors.Errorf("both path and value are required") - } - if len(args) > 2 { - return errors.Errorf("only path and value are allowed") - } - - // Acquire tanzu config lock - configlib.AcquireTanzuConfigLock() - defer configlib.ReleaseTanzuConfigLock() - - cfg, err := configlib.GetClientConfigNoLock() - if err != nil { - return err - } - - err = setConfiguration(cfg, args[0], args[1]) - if err != nil { - return err - } - - return configlib.StoreClientConfig(cfg) - }, -} - -// setConfiguration sets the key-value pair for the given path -func setConfiguration(cfg *configapi.ClientConfig, pathParam, value string) error { - // special cases: - // backward compatibility - if pathParam == "unstable-versions" || pathParam == "cli.unstable-versions" { - return setUnstableVersions(cfg, value) - } - - if pathParam == "cli.edition" { - return setEdition(cfg, value) - } - - // parse the param - paramArray := strings.Split(pathParam, ".") - if len(paramArray) < 2 { - return errors.New("unable to parse config path parameter into parts [" + pathParam + "] (was expecting 'features..' or 'env.')") - } - - configLiteral := paramArray[0] - - switch configLiteral { - case ConfigLiteralFeatures: - return setFeatures(cfg, paramArray, value) - case ConfigLiteralEnv: - return setEnvs(cfg, paramArray, value) - default: - return errors.New("unsupported config path parameter [" + configLiteral + "] (was expecting 'features..' or 'env.')") - } -} - -func setFeatures(cfg *configapi.ClientConfig, paramArray []string, value string) error { - if len(paramArray) != 3 { - return errors.New("unable to parse config path parameter into three parts [" + strings.Join(paramArray, ".") + "] (was expecting 'features..'") - } - plugin := paramArray[1] - featureName := paramArray[2] - - if cfg.ClientOptions == nil { - cfg.ClientOptions = &configapi.ClientOptions{} - } - if cfg.ClientOptions.Features == nil { - cfg.ClientOptions.Features = make(map[string]configapi.FeatureMap) - } - if cfg.ClientOptions.Features[plugin] == nil { - cfg.ClientOptions.Features[plugin] = configapi.FeatureMap{} - } - cfg.ClientOptions.Features[plugin][featureName] = value - return nil -} - -func setEnvs(cfg *configapi.ClientConfig, paramArray []string, value string) error { - if len(paramArray) != 2 { - return errors.New("unable to parse config path parameter into two parts [" + strings.Join(paramArray, ".") + "] (was expecting 'env.'") - } - envVariable := paramArray[1] - - if cfg.ClientOptions == nil { - cfg.ClientOptions = &configapi.ClientOptions{} - } - if cfg.ClientOptions.Env == nil { - cfg.ClientOptions.Env = make(map[string]string) - } - - cfg.ClientOptions.Env[envVariable] = value - return nil -} - -func setUnstableVersions(cfg *configapi.ClientConfig, value string) error { - optionKey := configapi.VersionSelectorLevel(value) - - switch optionKey { - case configapi.AllUnstableVersions, - configapi.AlphaUnstableVersions, - configapi.ExperimentalUnstableVersions, - configapi.NoUnstableVersions: - cfg.SetUnstableVersionSelector(optionKey) - default: - return fmt.Errorf("unknown unstable-versions setting: %s; should be one of [all, none, alpha, experimental]", optionKey) - } - return nil -} - -func setEdition(cfg *configapi.ClientConfig, edition string) error { - editionOption := configapi.EditionSelector(edition) - - switch editionOption { - case configapi.EditionCommunity, configapi.EditionStandard: - cfg.SetEditionSelector(editionOption) - default: - return fmt.Errorf("unknown edition: %s; should be one of [%s, %s]", editionOption, configapi.EditionStandard, configapi.EditionCommunity) - } - return nil -} - -var initConfigCmd = &cobra.Command{ - Use: "init", - Short: "Initialize config with defaults", - Long: "Initialize config with defaults including plugin specific defaults for all active and installed plugins", - RunE: func(cmd *cobra.Command, args []string) error { - // Acquire tanzu config lock - configlib.AcquireTanzuConfigLock() - defer configlib.ReleaseTanzuConfigLock() - - cfg, err := configlib.GetClientConfigNoLock() - if err != nil { - return err - } - if cfg.ClientOptions == nil { - cfg.ClientOptions = &configapi.ClientOptions{} - } - if cfg.ClientOptions.CLI == nil { - cfg.ClientOptions.CLI = &configapi.CLIOptions{} - } - - serverPluginDescriptors, standalonePluginDescriptors, err := pluginmanager.InstalledPlugins() - if err != nil { - return err - } - - // Add the default featureflags for active plugins based on the currentContext - // Plugins that are installed but are not active plugin will not be processed here - // and defaultFeatureFlags will not be configured for those plugins - for _, desc := range append(serverPluginDescriptors, standalonePluginDescriptors...) { - config.AddDefaultFeatureFlagsIfMissing(cfg, desc.DefaultFeatureFlags) - } - - err = configlib.StoreClientConfig(cfg) - if err != nil { - return err - } - - log.Success("successfully initialized the config") - return nil - }, -} - -// Note: Shall be deprecated in a future version. Superseded by 'tanzu context' command. -var serversCmd = &cobra.Command{ - Use: "server", - Short: "Configured servers", -} - -// Note: Shall be deprecated in a future version. Superseded by 'tanzu context list' command. -var listServersCmd = &cobra.Command{ - Use: "list", - Short: "List servers", - RunE: func(cmd *cobra.Command, args []string) error { - cfg, err := configlib.GetClientConfig() - if err != nil { - return err - } - - output := component.NewOutputWriter(cmd.OutOrStdout(), outputFormat, "Name", "Type", "Endpoint", "Path", "Context") - for _, server := range cfg.KnownServers { - var endpoint, path, context string - if server.IsGlobal() { - endpoint = server.GlobalOpts.Endpoint - } else { - endpoint = server.ManagementClusterOpts.Endpoint - path = server.ManagementClusterOpts.Path - context = server.ManagementClusterOpts.Context - } - output.AddRow(server.Name, server.Type, endpoint, path, context) - } - output.Render() - return nil - }, -} - -// Note: Shall be deprecated in a future version. Superseded by 'tanzu context delete' command. -var deleteServersCmd = &cobra.Command{ - Use: "delete SERVER_NAME", - Short: "Delete a server from the config", - - RunE: func(cmd *cobra.Command, args []string) error { - if len(args) == 0 { - return errors.Errorf("Server name required. Usage: tanzu config server delete server_name") - } - - var isAborted error - if !unattended { - isAborted = component.AskForConfirmation("Deleting the server entry from the config will remove it from the list of tracked servers. " + - "You will need to use tanzu login to track this server again. Are you sure you want to continue?") - } - - if isAborted == nil { - log.Infof("Deleting entry for cluster %s", args[0]) - serverExists, err := configlib.ServerExists(args[0]) - if err != nil { - return err - } - - if serverExists { - err := configlib.RemoveServer(args[0]) - if err != nil { - return err - } - } else { - return fmt.Errorf("server %s not found in list of known servers", args[0]) - } - } - - return nil - }, -} - -var unsetConfigCmd = &cobra.Command{ - Use: "unset ", - Short: "Unset config values at the given path", - Long: "Unset config values at the given path. path values: [features.global., features.., env.global., env..]", - RunE: func(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return errors.Errorf("path is required") - } - if len(args) > 1 { - return errors.Errorf("only path is allowed") - } - - return unsetConfiguration(args[0]) - - }, -} - -// unsetConfiguration unsets the key-value pair for the given path and removes it -func unsetConfiguration(pathParam string) error { - // parse the param - paramArray := strings.Split(pathParam, ".") - if len(paramArray) < 2 { - return errors.New("unable to parse config path parameter into parts [" + pathParam + "] (was expecting 'features..' or 'env.')") - } - - configLiteral := paramArray[0] - - switch configLiteral { - case ConfigLiteralFeatures: - return unsetFeatures(paramArray) - case ConfigLiteralEnv: - return unsetEnvs(paramArray) - default: - return errors.New("unsupported config path parameter [" + configLiteral + "] (was expecting 'features..' or 'env.')") - } -} - -func unsetFeatures(paramArray []string) error { - if len(paramArray) != 3 { - return errors.New("unable to parse config path parameter into three parts [" + strings.Join(paramArray, ".") + "] (was expecting 'features..'") - } - plugin := paramArray[1] - featureName := paramArray[2] - - return configlib.DeleteFeature(plugin, featureName) -} - -func unsetEnvs(paramArray []string) error { - if len(paramArray) != 2 { - return errors.New("unable to parse config path parameter into two parts [" + strings.Join(paramArray, ".") + "] (was expecting 'env.'") - } - - envVariable := paramArray[1] - return configlib.DeleteEnv(envVariable) -} diff --git a/cli/core/pkg/command/config_test.go b/cli/core/pkg/command/config_test.go deleted file mode 100644 index 19ab6b7e6a..0000000000 --- a/cli/core/pkg/command/config_test.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "strings" - "testing" - - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -// Test_config_MalformedPathArg validates functionality when an invalid argument is provided. -func TestConfigMalformedPathArg(t *testing.T) { - err := setConfiguration(nil, "invalid-arg", "") - if err == nil { - t.Error("Malformed path argument should have resulted in an error") - } - - if !strings.Contains(err.Error(), "unable to parse config path parameter") { - t.Errorf("Unexpected error message returned for malformed path argument: %s", err.Error()) - } -} - -// Test_config_InvalidPathArg validates functionality when an invalid argument is provided. -func TestConfigInvalidPathArg(t *testing.T) { - err := setConfiguration(nil, "shouldbefeatures.plugin.feature", "") - if err == nil { - t.Error("Invalid path argument should have resulted in an error") - } - - if !strings.Contains(err.Error(), "unsupported config path parameter") { - t.Errorf("Unexpected error message returned for invalid path argument: %s", err.Error()) - } -} - -// TestConfigUnstableVersions validates functionality when path argument unstable-versions is provided. -func TestConfigUnstableVersions(t *testing.T) { - cfg := &configapi.ClientConfig{} - const path = "unstable-versions" - const value = "experimental" - err := setConfiguration(cfg, path, value) - if err != nil { - t.Errorf("Unexpected error returned for %s path argument: %s", path, err.Error()) - } - - if cfg.ClientOptions.CLI.UnstableVersionSelector != value { - t.Error("Unstable version was not set correctly for valid value") - } -} - -// TestConfigUnstableVersions validates functionality when path argument cli.unstable-versions is provided. -func TestConfigCliUnstableVersions(t *testing.T) { - cfg := &configapi.ClientConfig{} - const path = "cli.unstable-versions" - const value = "all" - err := setConfiguration(cfg, path, value) - if err != nil { - t.Errorf("Unexpected error returned for %s path argument: %s", path, err.Error()) - } - - if cfg.ClientOptions.CLI.UnstableVersionSelector != value { - t.Error("Unstable version was not set correctly for valid value") - } -} - -// TestConfigInvalidUnstableVersions validates functionality when invalid unstable-versions is provided. -func TestConfigInvalidUnstableVersions(t *testing.T) { - cfg := &configapi.ClientConfig{} - err := setConfiguration(cfg, "unstable-versions", "invalid-unstable-versions-value") - if err == nil { - t.Error("Invalid unstable-versions should have resulted in error") - } - - if !strings.Contains(err.Error(), "unknown unstable-versions setting") { - t.Errorf("Unexpected error message returned for invalid unstable-versions value: %s", err.Error()) - } -} - -// TestConfigGlobalFeature validates functionality when global feature path argument is provided. -func TestConfigGlobalFeature(t *testing.T) { - cfg := &configapi.ClientConfig{} - value := "bar" - err := setConfiguration(cfg, "features.global.foo", value) - if err != nil { - t.Errorf("Unexpected error returned for global features path argument: %s", err.Error()) - } - - if cfg.ClientOptions.Features["global"]["foo"] != value { - t.Error("cfg.ClientOptions.Features[\"global\"][\"foo\"] was not assigned the value \"" + value + "\"") - } -} - -// TestConfigFeature validates functionality when normal feature path argument is provided. -func TestConfigFeature(t *testing.T) { - cfg := &configapi.ClientConfig{} - value := "barr" - err := setConfiguration(cfg, "features.any-plugin.foo", value) - if err != nil { - t.Errorf("Unexpected error returned for any-plugin features path argument: %s", err.Error()) - } - - if cfg.ClientOptions.Features["any-plugin"]["foo"] != value { - t.Error("cfg.ClientOptions.Features[\"any-plugin\"][\"foo\"] was not assigned the value \"" + value + "\"") - } -} - -// TestConfigSetUnsetEnv validates set and unset functionality when env config path argument is provided. -func TestConfigSetUnsetEnv(t *testing.T) { - cfg := &configapi.ClientConfig{} - value := "baar" - err := setConfiguration(cfg, "env.foo", value) - assert.Nil(t, err) - assert.Equal(t, value, cfg.ClientOptions.Env["foo"]) - - err = unsetConfiguration("env.foo") - assert.Nil(t, err) - - cfg, err = config.GetClientConfigNoLock() - assert.NoError(t, err) - assert.Equal(t, cfg.ClientOptions.Env["foo"], "") -} - -// TestConfigIncorrectConfigLiteral validates incorrect config literal -func TestConfigIncorrectConfigLiteral(t *testing.T) { - cfg := &configapi.ClientConfig{} - value := "b" - err := setConfiguration(cfg, "fake.any-plugin.foo", value) - assert.NotNil(t, err) - assert.Contains(t, err.Error(), "unsupported config path parameter [fake] (was expecting 'features..' or 'env.')") -} - -// TestConfigEnv validates functionality when normal env path argument is provided. -func TestConfigEnv(t *testing.T) { - cfg := &configapi.ClientConfig{} - value := "baarr" - err := setConfiguration(cfg, "env.any-plugin", value) - if err != nil { - t.Errorf("Unexpected error returned for any-plugin env path argument: %s", err.Error()) - } - if cfg.ClientOptions.Env["any-plugin"] != value { - t.Error("cfg.ClientOptions.Features[\"any-plugin\"][\"foo\"] was not assigned the value \"" + value + "\"") - } -} - -func TestConfigEditionCommunity(t *testing.T) { - cfg := &configapi.ClientConfig{} - value := configapi.EditionCommunity - err := setConfiguration(cfg, "cli.edition", value) - if err != nil { - t.Errorf("Unexpected error returned for cli.edition argument: %s", err.Error()) - } - - if cfg.ClientOptions.CLI.Edition != configapi.EditionCommunity { //nolint:staticcheck - t.Error("cfg.ClientOptions.CLI.Edition was not assigned the value \"" + value + "\"") - } -} - -func TestConfigEditionStandard(t *testing.T) { - cfg := &configapi.ClientConfig{} - value := configapi.EditionStandard - err := setConfiguration(cfg, "cli.edition", value) - if err != nil { - t.Errorf("Unexpected error returned for cli.edition argument: %s", err.Error()) - } - - if cfg.ClientOptions.CLI.Edition != configapi.EditionStandard { //nolint:staticcheck - t.Error("cfg.ClientOptions.CLI.Edition was not assigned the value \"" + value + "\"") - } -} - -func TestConfigEditionInvalid(t *testing.T) { - cfg := &configapi.ClientConfig{} - value := "invalidEdition" - err := setConfiguration(cfg, "cli.edition", value) - if err == nil { - t.Errorf("Expected error returned for cli.edition argument: %s", value) - } -} diff --git a/cli/core/pkg/command/context.go b/cli/core/pkg/command/context.go deleted file mode 100644 index 26443b15b4..0000000000 --- a/cli/core/pkg/command/context.go +++ /dev/null @@ -1,706 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "crypto/tls" - "errors" - "fmt" - "io" - "net/http" - "net/url" - "os" - "sort" - "strings" - "time" - - "github.com/aunum/log" - "github.com/fatih/color" - "github.com/spf13/cobra" - "golang.org/x/oauth2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/clientcmd" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/auth/csp" - tkgauth "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/auth/tkg" - wcpauth "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/auth/wcp" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - cliconfig "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -var ( - stderrOnly, forceCSP, staging, onlyCurrent bool - ctxName, endpoint, apiToken, kubeConfig, kubeContext, getOutputFmt string -) - -const ( - knownGlobalHost = "cloud.vmware.com" -) - -var contextCmd = &cobra.Command{ - Use: "context", - Short: "Configure and manage contexts for the Tanzu CLI", - Aliases: []string{"ctx", "contexts"}, - Annotations: map[string]string{ - "group": string(cliapi.SystemCmdGroup), - }, -} - -func init() { - contextCmd.SetUsageFunc(cli.SubCmdUsageFunc) - contextCmd.AddCommand( - createCtxCmd, - listCtxCmd, - getCtxCmd, - deleteCtxCmd, - useCtxCmd, - ) - - initCreateCtxCmd() - - listCtxCmd.Flags().StringVarP(&targetStr, "target", "t", "", "list only contexts associated with the specified target (kubernetes[k8s]|mission-control[tmc])") - listCtxCmd.Flags().BoolVar(&onlyCurrent, "current", false, "list only current active contexts") - listCtxCmd.Flags().StringVarP(&outputFormat, "output", "o", "table", "output format: table|yaml|json") - - getCtxCmd.Flags().StringVarP(&getOutputFmt, "output", "o", "yaml", "output format: yaml|json") - - deleteCtxCmd.Flags().BoolVarP(&unattended, "yes", "y", false, "delete the context entry without confirmation") -} - -var createCtxCmd = &cobra.Command{ - Use: "create", - Short: "Create a Tanzu CLI context", - RunE: createCtx, - Example: ` - # Create a TKG management cluster context using endpoint - tanzu context create --endpoint "https://k8s.example.com" --name mgmt-cluster - - # Create a TKG management cluster context using kubeconfig path and context - tanzu context create --kubeconfig path/to/kubeconfig --kubecontext kubecontext --name mgmt-cluster - - # Create a TKG management cluster context using default kubeconfig path and a kubeconfig context - tanzu context create --kubecontext kubecontext --name mgmt-cluster - - [*] : User has two options to create a kubernetes cluster context. User can choose the control - plane option by providing 'endpoint', or use the kubeconfig for the cluster by providing - 'kubeconfig' and 'context'. If only '--context' is set and '--kubeconfig' is not set - $KUBECONFIG env variable would be used and, if $KUBECONFIG env is also not set default - kubeconfig($HOME/.kube/config) would be used. - `, -} - -func initCreateCtxCmd() { - createCtxCmd.Flags().StringVar(&ctxName, "name", "", "name of the context") - createCtxCmd.Flags().StringVar(&endpoint, "endpoint", "", "endpoint to create a context for") - createCtxCmd.Flags().StringVar(&apiToken, "api-token", "", "API token for the SaaS context") - createCtxCmd.Flags().StringVar(&kubeConfig, "kubeconfig", "", "path to the kubeconfig file; valid only if user doesn't choose 'endpoint' option.(See [*])") - createCtxCmd.Flags().StringVar(&kubeContext, "kubecontext", "", "the context in the kubeconfig to use; valid only if user doesn't choose 'endpoint' option.(See [*]) ") - createCtxCmd.Flags().BoolVar(&stderrOnly, "stderr-only", false, "send all output to stderr rather than stdout") - createCtxCmd.Flags().BoolVar(&forceCSP, "force-csp", false, "force the context to use CSP auth") - createCtxCmd.Flags().BoolVar(&staging, "staging", false, "use CSP staging issuer") - _ = createCtxCmd.Flags().MarkHidden("api-token") - _ = createCtxCmd.Flags().MarkHidden("stderr-only") - _ = createCtxCmd.Flags().MarkHidden("force-csp") - _ = createCtxCmd.Flags().MarkHidden("staging") -} - -func createCtx(_ *cobra.Command, _ []string) (err error) { - ctx, err := createNewContext() - if err != nil { - return err - } - if ctx.Target == cliv1alpha1.TargetK8s { - err = k8sLogin(ctx) - } else { - err = globalLogin(ctx) - } - - if err != nil { - return err - } - - // Sync all required plugins if the "features.global.context-aware-cli-for-plugins" feature is enabled - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - if err = pluginmanager.SyncPlugins(); err != nil { - log.Warning("unable to automatically sync the plugins from target context. Please run 'tanzu plugin sync' command to sync plugins manually") - } - } - - return nil -} - -func isGlobalContext(endpoint string) bool { - if strings.Contains(endpoint, knownGlobalHost) { - return true - } - if forceCSP { - return true - } - return false -} - -func getPromptOpts() []component.PromptOpt { - var promptOpts []component.PromptOpt - if stderrOnly { - // This uses stderr because it needs to work inside the kubectl exec plugin flow where stdout is reserved. - promptOpts = append(promptOpts, component.WithStdio(os.Stdin, os.Stderr, os.Stderr)) - } - return promptOpts -} - -func createNewContext() (context *configapi.Context, err error) { - // user provided command line options to create a context using kubeconfig[optional] and context - if kubeContext != "" { - return createContextWithKubeconfig() - } - // user provided command line options to create a context using endpoint - if endpoint != "" { - return createContextWithEndpoint() - } - promptOpts := getPromptOpts() - - var ctxCreationType string - - err = component.Prompt( - &component.PromptConfig{ - Message: "Select context creation type", - Options: []string{"Control plane endpoint", "Local kubeconfig"}, - Default: "Control plane endpoint", - }, - &ctxCreationType, - promptOpts..., - ) - if err != nil { - return context, err - } - - if ctxCreationType == "Control plane endpoint" { - return createContextWithEndpoint() - } - - return createContextWithKubeconfig() -} - -func createContextWithKubeconfig() (context *configapi.Context, err error) { - promptOpts := getPromptOpts() - if kubeConfig == "" && kubeContext == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: "Enter path to kubeconfig (if any)", - }, - &kubeConfig, - promptOpts..., - ) - if err != nil { - return - } - } else if kubeConfig == "" { - kubeConfig = getDefaultKubeconfigPath() - } - kubeConfig = strings.TrimSpace(kubeConfig) - - if kubeConfig != "" && kubeContext == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: "Enter kube context to use", - }, - &kubeContext, - promptOpts..., - ) - if err != nil { - return - } - } - kubeContext = strings.TrimSpace(kubeContext) - - if ctxName == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: "Give the context a name", - }, - &ctxName, - promptOpts..., - ) - if err != nil { - return - } - } - ctxName = strings.TrimSpace(ctxName) - exists, err := config.ContextExists(ctxName) - if err != nil { - return context, err - } - if exists { - err = fmt.Errorf("context %q already exists", ctxName) - return - } - - context = &configapi.Context{ - Name: ctxName, - Target: cliv1alpha1.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Path: kubeConfig, - Context: kubeContext, - Endpoint: endpoint, - IsManagementCluster: true, - }, - } - return context, err -} - -func createContextWithEndpoint() (context *configapi.Context, err error) { - promptOpts := getPromptOpts() - if endpoint == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: "Enter control plane endpoint", - }, - &endpoint, - promptOpts..., - ) - if err != nil { - return - } - } - endpoint = strings.TrimSpace(endpoint) - if ctxName == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: "Give the context a name", - }, - &ctxName, - promptOpts..., - ) - if err != nil { - return - } - } - ctxName = strings.TrimSpace(ctxName) - exists, err := config.ContextExists(ctxName) - if err != nil { - return context, err - } - if exists { - err = fmt.Errorf("context %q already exists", ctxName) - return - } - - if isGlobalContext(endpoint) { - context = &configapi.Context{ - Name: ctxName, - Target: cliv1alpha1.TargetTMC, - GlobalOpts: &configapi.GlobalServer{Endpoint: sanitizeEndpoint(endpoint)}, - } - } else { - // While this would add an extra HTTP round trip, it avoids the need to - // add extra provider specific login flags. - isVSphereSupervisor, err := wcpauth.IsVSphereSupervisor(endpoint, getDiscoveryHTTPClient()) - // Fall back to assuming non vSphere supervisor. - if err != nil { - log.Fatalf("Error creating kubeconfig with tanzu pinniped-auth login plugin: %v", err) - return nil, err - } - if isVSphereSupervisor { - log.Info("Detected a vSphere Supervisor being used") - kubeConfig, kubeContext, err = vSphereSupervisorLogin(endpoint) - if err != nil { - log.Fatalf("Error logging in to vSphere Supervisor: %v", err) - return nil, err - } - } else { - kubeConfig, kubeContext, err = tkgauth.KubeconfigWithPinnipedAuthLoginPlugin(endpoint, nil, tkgauth.DiscoveryStrategy{ClusterInfoConfigMap: tkgauth.DefaultClusterInfoConfigMap}) - if err != nil { - log.Fatalf("Error creating kubeconfig with tanzu pinniped-auth login plugin: %v", err) - return nil, err - } - } - - context = &configapi.Context{ - Name: ctxName, - Target: cliv1alpha1.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Path: kubeConfig, - Context: kubeContext, - Endpoint: endpoint, - IsManagementCluster: true, - }, - } - } - return context, err -} - -func globalLogin(c *configapi.Context) (err error) { - apiToken, apiTokenExists := os.LookupEnv(config.EnvAPITokenKey) - - issuer := csp.ProdIssuer - if staging { - issuer = csp.StgIssuer - } - if apiTokenExists { - log.Debug("API token env var is set") - } else { - apiToken, err = promptAPIToken() - if err != nil { - return err - } - } - token, err := csp.GetAccessTokenFromAPIToken(apiToken, issuer) - if err != nil { - return err - } - claims, err := csp.ParseToken(&oauth2.Token{AccessToken: token.AccessToken}) - if err != nil { - return err - } - - a := configapi.GlobalServerAuth{} - a.Issuer = issuer - a.UserName = claims.Username - a.Permissions = claims.Permissions - a.AccessToken = token.AccessToken - a.IDToken = token.IDToken - a.RefreshToken = apiToken - a.Type = "api-token" - expiresAt := time.Now().Local().Add(time.Second * time.Duration(token.ExpiresIn)) - a.Expiration = metav1.NewTime(expiresAt) - c.GlobalOpts.Auth = a - - err = config.AddContext(c, true) - if err != nil { - return err - } - - // format - fmt.Println() - log.Success("successfully created a TMC context") - return nil -} - -// Interactive way to create a TMC context. User will be prompted for CSP API token. -func promptAPIToken() (apiToken string, err error) { - consoleURL := url.URL{ - Scheme: "https", - Host: "console.cloud.vmware.com", - Path: "/csp/gateway/portal/", - Fragment: "/user/tokens", - } - - // format - fmt.Println() - log.Infof( - "If you don't have an API token, visit the VMware Cloud Services console, select your organization, and create an API token with the TMC service roles:\n %s\n", - consoleURL.String(), - ) - promptOpts := getPromptOpts() - - // format - fmt.Println() - err = component.Prompt( - &component.PromptConfig{ - Message: "API Token", - Sensitive: true, - }, - &apiToken, - promptOpts..., - ) - apiToken = strings.TrimSpace(apiToken) - return -} - -func k8sLogin(c *configapi.Context) error { - if c.ClusterOpts.Path != "" && c.ClusterOpts.Context != "" { - _, err := tkgauth.GetServerKubernetesVersion(c.ClusterOpts.Path, c.ClusterOpts.Context) - if err != nil { - log.Fatalf("failed to create context %q for a kubernetes cluster, %v", c.Name, err) - return err - } - err = config.AddContext(c, true) - if err != nil { - return err - } - log.Successf("successfully created a kubernetes context using the kubeconfig %s", c.ClusterOpts.Path) - return nil - } - - return fmt.Errorf("not yet implemented") -} - -func sanitizeEndpoint(endpoint string) string { - if len(strings.Split(endpoint, ":")) == 1 { - return fmt.Sprintf("%s:443", endpoint) - } - return endpoint -} - -func getDefaultKubeconfigPath() string { - kubeConfigPath := os.Getenv(clientcmd.RecommendedConfigPathEnvVar) - // fallback to default kubeconfig file location if no env variable set - if kubeConfigPath == "" { - kubeConfigPath = clientcmd.RecommendedHomeFile - } - return kubeConfigPath -} - -func getDiscoveryHTTPClient() *http.Client { - // XXX: Insecure, but follows the existing tanzu login discovery patterns. If - // there's something tracking not TOFUing, it might be good to follow that - // eventually. - tr := &http.Transport{ - // #nosec - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - Proxy: http.ProxyFromEnvironment, - TLSHandshakeTimeout: 5 * time.Second, - } - return &http.Client{Transport: tr} -} - -func vSphereSupervisorLogin(endpoint string) (mergeFilePath, currentContext string, err error) { - port := 443 - kubeConfig, kubecontext, err := tkgauth.KubeconfigWithPinnipedAuthLoginPlugin(endpoint, nil, tkgauth.DiscoveryStrategy{DiscoveryPort: &port, ClusterInfoConfigMap: wcpauth.SupervisorVIPConfigMapName}) - if err != nil { - log.Fatalf("Error creating kubeconfig with tanzu pinniped-auth login plugin: %v", err) - return "", "", err - } - return kubeConfig, kubecontext, err -} - -var listCtxCmd = &cobra.Command{ - Use: "list", - Short: "List contexts", - RunE: listCtx, -} - -func listCtx(cmd *cobra.Command, _ []string) error { - cfg, err := config.GetClientConfig() - if err != nil { - return err - } - - if !cliv1alpha1.IsValidTarget(targetStr) { - return errors.New("invalid target specified. Please specify correct value of `--target` or `-t` flag from 'kubernetes/k8s/mission-control/tmc'") - } - - if outputFormat == "" || outputFormat == string(component.TableOutputType) { - displayContextListOutputSplitViewTarget(cfg, cmd.OutOrStdout()) - } else { - displayContextListOutputListView(cfg, cmd.OutOrStdout()) - } - - return nil -} - -var getCtxCmd = &cobra.Command{ - Use: "get CONTEXT_NAME", - Short: "Display a context from the config", - RunE: getCtx, -} - -func getCtx(cmd *cobra.Command, args []string) error { - var ctx *configapi.Context - var err error - if len(args) == 0 { - ctx, err = promptCtx() - if err != nil { - return err - } - } else { - ctx, err = config.GetContext(args[0]) - if err != nil { - return err - } - } - - op := component.NewObjectWriter(cmd.OutOrStdout(), getOutputFmt, ctx) - op.Render() - return nil -} - -func promptCtx() (*configapi.Context, error) { - cfg, err := config.GetClientConfig() - if err != nil { - return nil, err - } - if len(cfg.KnownContexts) == 0 { - return nil, errors.New("no contexts found") - } - - promptOpts := getPromptOpts() - contexts := make(map[string]*configapi.Context) - for _, ctx := range cfg.KnownContexts { - info, err := config.EndpointFromContext(ctx) - if err != nil { - return nil, err - } - if info == "" && ctx.Target == cliv1alpha1.TargetK8s { - info = fmt.Sprintf("%s:%s", ctx.ClusterOpts.Path, ctx.ClusterOpts.Context) - } - - ctxKey := rpad(ctx.Name, 20) - ctxKey = fmt.Sprintf("%s(%s)", ctxKey, info) - contexts[ctxKey] = ctx - } - - ctxKeys := getKeys(contexts) - ctxKey := ctxKeys[0] - err = component.Prompt( - &component.PromptConfig{ - Message: "Select a context", - Options: ctxKeys, - Default: ctxKey, - }, - &ctxKey, - promptOpts..., - ) - if err != nil { - return nil, err - } - return contexts[ctxKey], nil -} - -func rpad(s string, padding int) string { - template := fmt.Sprintf("%%-%ds", padding) - return fmt.Sprintf(template, s) -} - -func getKeys(m map[string]*configapi.Context) []string { - keys := make([]string, 0, len(m)) - for k := range m { - keys = append(keys, k) - } - sort.Strings(keys) - return keys -} - -var deleteCtxCmd = &cobra.Command{ - Use: "delete CONTEXT_NAME", - Short: "Delete a context from the config", - RunE: deleteCtx, -} - -func deleteCtx(_ *cobra.Command, args []string) error { - var name string - if len(args) == 0 { - ctx, err := promptCtx() - if err != nil { - return err - } - name = ctx.Name - } else { - name = args[0] - } - - if !unattended { - isAborted := component.AskForConfirmation("Deleting the context entry from the config will remove it from the list of tracked contexts. " + - "You will need to use `tanzu context create` to re-create this context. Are you sure you want to continue?") - if isAborted != nil { - return nil - } - } - - log.Infof("Deleting entry for cluster %s", name) - err := config.RemoveContext(name) - if err != nil { - return err - } - - return nil -} - -var useCtxCmd = &cobra.Command{ - Use: "use CONTEXT_NAME", - Short: "Set the context to be used by default", - RunE: useCtx, -} - -func useCtx(_ *cobra.Command, args []string) error { - var name string - if len(args) == 0 { - ctx, err := promptCtx() - if err != nil { - return err - } - name = ctx.Name - } else { - name = args[0] - } - - err := config.SetCurrentContext(name) - if err != nil { - return err - } - return nil -} - -func displayContextListOutputListView(cfg *configapi.ClientConfig, writer io.Writer) { - target := getTarget() - - op := component.NewOutputWriter(writer, outputFormat, "Name", "Type", "IsManagementCluster", "IsCurrent", "Endpoint", "KubeConfigPath", "KubeContext") - for _, ctx := range cfg.KnownContexts { - if target != cliv1alpha1.TargetNone && ctx.Target != target { - continue - } - isMgmtCluster := ctx.IsManagementCluster() - isCurrent := ctx.Name == cfg.CurrentContext[ctx.Target] - if onlyCurrent && !isCurrent { - continue - } - - var endpoint, path, context string - switch ctx.Target { - case cliv1alpha1.TargetTMC: - endpoint = ctx.GlobalOpts.Endpoint - default: - endpoint = ctx.ClusterOpts.Endpoint - path = ctx.ClusterOpts.Path - context = ctx.ClusterOpts.Context - } - op.AddRow(ctx.Name, ctx.Target, isMgmtCluster, isCurrent, endpoint, path, context) - } - op.Render() -} - -func displayContextListOutputSplitViewTarget(cfg *configapi.ClientConfig, writer io.Writer) { - target := getTarget() - - outputWriterK8sTarget := component.NewOutputWriter(writer, outputFormat, "Name", "IsActive", "Endpoint", "KubeConfigPath", "KubeContext") - outputWriterTMCTarget := component.NewOutputWriter(writer, outputFormat, "Name", "IsActive", "Endpoint") - for _, ctx := range cfg.KnownContexts { - if target != cliv1alpha1.TargetNone && ctx.Target != target { - continue - } - isCurrent := ctx.Name == cfg.CurrentContext[ctx.Target] - if onlyCurrent && !isCurrent { - continue - } - - var endpoint, path, context string - switch ctx.Target { - case cliv1alpha1.TargetTMC: - endpoint = ctx.GlobalOpts.Endpoint - outputWriterTMCTarget.AddRow(ctx.Name, isCurrent, endpoint) - default: - endpoint = ctx.ClusterOpts.Endpoint - path = ctx.ClusterOpts.Path - context = ctx.ClusterOpts.Context - outputWriterK8sTarget.AddRow(ctx.Name, isCurrent, endpoint, path, context) - } - } - - cyanBold := color.New(color.FgCyan).Add(color.Bold) - cyanBoldItalic := color.New(color.FgCyan).Add(color.Bold, color.Italic) - if target == cliv1alpha1.TargetNone || target == cliv1alpha1.TargetK8s { - _, _ = cyanBold.Println("Target: ", cyanBoldItalic.Sprintf("%s", cliv1alpha1.TargetK8s)) - outputWriterK8sTarget.Render() - } - if target == cliv1alpha1.TargetNone || target == cliv1alpha1.TargetTMC { - _, _ = cyanBold.Println("Target: ", cyanBoldItalic.Sprintf("%s", cliv1alpha1.TargetTMC)) - outputWriterTMCTarget.Render() - } -} diff --git a/cli/core/pkg/command/discovery_source.go b/cli/core/pkg/command/discovery_source.go deleted file mode 100644 index 19a0766273..0000000000 --- a/cli/core/pkg/command/discovery_source.go +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "fmt" - "strings" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - - "github.com/aunum/log" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/discovery" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - configlib "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -var ( - discoverySourceType, discoverySourceName, uri string -) - -var discoverySourceCmd = &cobra.Command{ - Use: "source", - Short: "Manage plugin discovery sources", - Long: "Manage plugin discovery sources. Discovery source provides metadata about the list of available plugins, their supported versions and how to download them.", -} - -func init() { - discoverySourceCmd.SetUsageFunc(cli.SubCmdUsageFunc) - discoverySourceCmd.AddCommand( - listDiscoverySourceCmd, - addDiscoverySourceCmd, - updateDiscoverySourceCmd, - deleteDiscoverySourceCmd, - ) - addDiscoverySourceCmd.Flags().StringVarP(&discoverySourceName, "name", "n", "", "name of discovery source") - addDiscoverySourceCmd.Flags().StringVarP(&discoverySourceType, "type", "t", "", "type of discovery source") - addDiscoverySourceCmd.Flags().StringVarP(&uri, "uri", "u", "", "URI for discovery source. URI format might be different based on the type of discovery source") - - // Not handling errors below because cobra handles the error when flag user doesn't provide these required flags - _ = cobra.MarkFlagRequired(addDiscoverySourceCmd.Flags(), "name") - _ = cobra.MarkFlagRequired(addDiscoverySourceCmd.Flags(), "type") - _ = cobra.MarkFlagRequired(addDiscoverySourceCmd.Flags(), "uri") - - updateDiscoverySourceCmd.Flags().StringVarP(&discoverySourceType, "type", "t", "", "type of discovery source") - updateDiscoverySourceCmd.Flags().StringVarP(&uri, "uri", "u", "", "URI for discovery source. URI format might be different based on the type of discovery source") - - listDiscoverySourceCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table)") -} - -var listDiscoverySourceCmd = &cobra.Command{ - Use: "list", - Short: "List available discovery sources", - RunE: func(cmd *cobra.Command, args []string) error { - cfg, err := configlib.GetClientConfig() - if err != nil { - return err - } - - output := component.NewOutputWriter(cmd.OutOrStdout(), outputFormat, "name", "type", "scope") - - // Get standalone scoped discoveries - if cfg.ClientOptions != nil && cfg.ClientOptions.CLI != nil && cfg.ClientOptions.CLI.DiscoverySources != nil { - outputFromDiscoverySources(cfg.ClientOptions.CLI.DiscoverySources, common.PluginScopeStandalone, output) - } - - // If context-target feature is activated, get discovery sources from all active context - // else get discovery sources from current server - if configlib.IsFeatureActivated(config.FeatureContextCommand) { - mapContexts, err := configlib.GetAllCurrentContextsMap() - if err == nil { - for _, context := range mapContexts { - outputFromDiscoverySources(context.DiscoverySources, common.PluginScopeContext, output) - } - } - } else { - server, err := configlib.GetCurrentServer() - if err == nil && server != nil { - outputFromDiscoverySources(server.DiscoverySources, common.PluginScopeContext, output) - } - } - - output.Render() - - return nil - }, -} - -func outputFromDiscoverySources(discoverySources []configapi.PluginDiscovery, scope string, output component.OutputWriter) { - for _, ds := range discoverySources { - dsName, dsType := discoverySourceNameAndType(ds) - output.AddRow(dsName, dsType, scope) - } -} - -var addDiscoverySourceCmd = &cobra.Command{ - Use: "add", - Short: "Add a discovery source", - Long: "Add a discovery source. Supported discovery types are: oci, local", - Example: ` - # Add a local discovery source. If URI is relative path, - # $HOME/.config/tanzu-plugins will be considered based path - tanzu plugin source add --name standalone-local --type local --uri path/to/local/discovery - - # Add an OCI discovery source. URI should be an OCI image. - tanzu plugin source add --name standalone-oci --type oci --uri projects.registry.vmware.com/tkg/tanzu-plugins/standalone:latest`, - - RunE: func(cmd *cobra.Command, args []string) error { - // Acquire tanzu config lock - configlib.AcquireTanzuConfigLock() - defer configlib.ReleaseTanzuConfigLock() - - cfg, err := configlib.GetClientConfigNoLock() - if err != nil { - return err - } - if cfg.ClientOptions == nil { - cfg.ClientOptions = &configapi.ClientOptions{} - } - if cfg.ClientOptions.CLI == nil { - cfg.ClientOptions.CLI = &configapi.CLIOptions{} - } - - discoverySources, err := addDiscoverySource(cfg.ClientOptions.CLI.DiscoverySources, discoverySourceName, discoverySourceType, uri) - if err != nil { - return err - } - - cfg.ClientOptions.CLI.DiscoverySources = discoverySources - err = configlib.StoreClientConfig(cfg) - if err != nil { - return err - } - log.Successf("successfully added discovery source %s", discoverySourceName) - return nil - }, -} - -var updateDiscoverySourceCmd = &cobra.Command{ - Use: "update [name]", - Short: "Update a discovery source configuration", - Args: cobra.ExactArgs(1), - Example: ` - # Update a local discovery source. If URI is relative path, - # $HOME/.config/tanzu-plugins will be considered base path - tanzu plugin source update standalone-local --type local --uri new/path/to/local/discovery - - # Update an OCI discovery source. URI should be an OCI image. - tanzu plugin source update standalone-oci --type oci --uri projects.registry.vmware.com/tkg/tanzu-plugins/standalone:v1.0`, - - RunE: func(cmd *cobra.Command, args []string) error { - discoveryName := args[0] - - // Acquire tanzu config lock - configlib.AcquireTanzuConfigLock() - defer configlib.ReleaseTanzuConfigLock() - - cfg, err := configlib.GetClientConfigNoLock() - if err != nil { - return err - } - - discoveryNoExistError := fmt.Errorf("discovery %q does not exist", discoveryName) - if cfg.ClientOptions == nil { - return discoveryNoExistError - } - if cfg.ClientOptions.CLI == nil { - return discoveryNoExistError - } - - newDiscoverySources, err := updateDiscoverySources(cfg.ClientOptions.CLI.DiscoverySources, discoveryName, discoverySourceType, uri) - if err != nil { - return err - } - - cfg.ClientOptions.CLI.DiscoverySources = newDiscoverySources - err = configlib.StoreClientConfig(cfg) - if err != nil { - return err - } - log.Successf("updated discovery source %s", discoveryName) - return nil - }, -} - -var deleteDiscoverySourceCmd = &cobra.Command{ - Use: "delete [name]", - Short: "Delete a discovery source", - Args: cobra.ExactArgs(1), - Example: ` - # Delete a discovery source - tanzu plugin discovery delete standalone-oci`, - RunE: func(cmd *cobra.Command, args []string) (err error) { - discoveryName := args[0] - - err = configlib.DeleteCLIDiscoverySource(discoveryName) - if err != nil { - return err - } - log.Successf("deleted discovery source %s", discoveryName) - return nil - }, -} - -func createDiscoverySource(dsType, dsName, uri string) (configapi.PluginDiscovery, error) { - pluginDiscoverySource := configapi.PluginDiscovery{} - if dsType == "" { - return pluginDiscoverySource, errors.New("discovery source type cannot be empty") - } - if dsName == "" { - return pluginDiscoverySource, errors.New("discovery source name cannot be empty") - } - - switch strings.ToLower(dsType) { - case common.DiscoveryTypeLocal: - pluginDiscoverySource.Local = createLocalDiscoverySource(dsName, uri) - case common.DiscoveryTypeOCI: - pluginDiscoverySource.OCI = createOCIDiscoverySource(dsName, uri) - case common.DiscoveryTypeREST: - pluginDiscoverySource.REST = createRESTDiscoverySource(dsName, uri) - case common.DiscoveryTypeGCP, common.DiscoveryTypeKubernetes: - return pluginDiscoverySource, errors.Errorf("discovery source type '%s' is not yet supported", dsType) - default: - return pluginDiscoverySource, errors.Errorf("unknown discovery source type '%s'", dsType) - } - return pluginDiscoverySource, nil -} - -func createLocalDiscoverySource(discoveryName, uri string) *configapi.LocalDiscovery { - return &configapi.LocalDiscovery{ - Name: discoveryName, - Path: uri, - } -} - -func createOCIDiscoverySource(discoveryName, uri string) *configapi.OCIDiscovery { - return &configapi.OCIDiscovery{ - Name: discoveryName, - Image: uri, - } -} - -func createRESTDiscoverySource(discoveryName, uri string) *configapi.GenericRESTDiscovery { - return &configapi.GenericRESTDiscovery{ - Name: discoveryName, - Endpoint: uri, - } -} - -func discoverySourceNameAndType(ds configapi.PluginDiscovery) (string, string) { - switch { - case ds.GCP != nil: - return ds.GCP.Name, common.DiscoveryTypeGCP - case ds.Kubernetes != nil: - return ds.Kubernetes.Name, common.DiscoveryTypeKubernetes - case ds.Local != nil: - return ds.Local.Name, common.DiscoveryTypeLocal - case ds.OCI != nil: - return ds.OCI.Name, common.DiscoveryTypeOCI - case ds.REST != nil: - return ds.REST.Name, common.DiscoveryTypeREST - default: - return "-", "Unknown" // Unknown discovery source found - } -} - -func addDiscoverySource(discoverySources []configapi.PluginDiscovery, dsName, dsType, uri string) ([]configapi.PluginDiscovery, error) { - for _, ds := range discoverySources { - if discovery.CheckDiscoveryName(ds, dsName) { - return nil, fmt.Errorf("discovery name %q already exists", dsName) - } - } - - pluginDiscoverySource, err := createDiscoverySource(dsType, dsName, uri) - if err != nil { - return nil, err - } - - discoverySources = append(discoverySources, pluginDiscoverySource) - return discoverySources, nil -} - -func deleteDiscoverySource(discoverySources []configapi.PluginDiscovery, discoveryName string) ([]configapi.PluginDiscovery, error) { - newDiscoverySources := []configapi.PluginDiscovery{} - found := false - for _, ds := range discoverySources { - if discovery.CheckDiscoveryName(ds, discoveryName) { - found = true - continue - } - newDiscoverySources = append(newDiscoverySources, ds) - } - if !found { - return nil, fmt.Errorf("discovery source %q does not exist", discoveryName) - } - return newDiscoverySources, nil -} - -func updateDiscoverySources(discoverySources []configapi.PluginDiscovery, dsName, dsType, uri string) ([]configapi.PluginDiscovery, error) { - var newDiscoverySources []configapi.PluginDiscovery - var err error - - found := false - for _, ds := range discoverySources { - if discovery.CheckDiscoveryName(ds, dsName) { - found = true - ds, err = createDiscoverySource(dsType, dsName, uri) - if err != nil { - return nil, err - } - } - newDiscoverySources = append(newDiscoverySources, ds) - } - if !found { - return nil, fmt.Errorf("discovery source %q does not exist", dsName) - } - return newDiscoverySources, nil -} diff --git a/cli/core/pkg/command/discovery_source_test.go b/cli/core/pkg/command/discovery_source_test.go deleted file mode 100644 index f15ca3f0af..0000000000 --- a/cli/core/pkg/command/discovery_source_test.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func Test_createDiscoverySource(t *testing.T) { - assert := assert.New(t) - - // When discovery source name is empty - _, err := createDiscoverySource("LOCAL", "", "fake/path") - assert.NotNil(err) - assert.Equal(err.Error(), "discovery source name cannot be empty") - - // When discovery source type is empty - _, err = createDiscoverySource("", "fake-discovery-name", "fake/path") - assert.NotNil(err) - assert.Contains(err.Error(), "discovery source type cannot be empty") - - // When discovery source is `local` and data is provided correctly - pd, err := createDiscoverySource("local", "fake-discovery-name", "fake/path") - assert.Nil(err) - assert.NotNil(pd.Local) - assert.Equal(pd.Local.Name, "fake-discovery-name") - assert.Equal(pd.Local.Path, "fake/path") - - // When discovery source is `LOCAL` - pd, err = createDiscoverySource("LOCAL", "fake-discovery-name", "fake/path") - assert.Nil(err) - assert.NotNil(pd.Local) - assert.Equal(pd.Local.Name, "fake-discovery-name") - assert.Equal(pd.Local.Path, "fake/path") - - // When discovery source is `oci` - pd, err = createDiscoverySource("oci", "fake-oci-discovery-name", "test.registry.com/test-image:v1.0.0") - assert.Nil(err) - assert.NotNil(pd.OCI) - assert.Equal(pd.OCI.Name, "fake-oci-discovery-name") - assert.Equal(pd.OCI.Image, "test.registry.com/test-image:v1.0.0") - - // When discovery source is gcp - _, err = createDiscoverySource("gcp", "fake-discovery-name", "fake/path") - assert.NotNil(err) - assert.Contains(err.Error(), "not yet supported") - - // When discovery source is kubernetes - _, err = createDiscoverySource("kubernetes", "fake-discovery-name", "fake/path") - assert.NotNil(err) - assert.Contains(err.Error(), "not yet supported") - - // When discovery source is rest - pd, err = createDiscoverySource("rest", "fake-discovery-name", "fake/path") - assert.Nil(err) - assert.NotNil(pd.REST) - assert.Equal(pd.REST.Name, "fake-discovery-name") - assert.Equal(pd.REST.Endpoint, "fake/path") - - // When discovery source is an unknown value - _, err = createDiscoverySource("unexpectedValue", "fake-discovery-name", "fake/path") - assert.NotNil(err) - assert.Contains(err.Error(), "unknown discovery source type 'unexpectedValue'") -} - -func Test_addDiscoverySource(t *testing.T) { - assert := assert.New(t) - - discoverySources := []configapi.PluginDiscovery{ - configapi.PluginDiscovery{ - Local: &configapi.LocalDiscovery{ - Name: "source1", - Path: "fakepath1", - }, - }, - } - - // When discovery source already exists - _, err := addDiscoverySource(discoverySources, "source1", "local", "fakepath2") - assert.NotNil(err) - assert.Contains(err.Error(), "discovery name \"source1\" already exists") - - // When new discovery source gets added - updatedDiscoverySources, err := addDiscoverySource(discoverySources, "source2", "local", "fakepath2") - assert.Nil(err) - assert.Equal(2, len(updatedDiscoverySources)) - assert.NotNil(updatedDiscoverySources[1].Local) - assert.Equal("source2", updatedDiscoverySources[1].Local.Name) - assert.Equal("fakepath2", updatedDiscoverySources[1].Local.Path) -} - -func Test_updateDiscoverySources(t *testing.T) { - assert := assert.New(t) - - discoverySources := []configapi.PluginDiscovery{ - configapi.PluginDiscovery{ - Local: &configapi.LocalDiscovery{ - Name: "source1", - Path: "fakepath1", - }, - }, - } - - // When discovery source already exists - updatedDiscoverySources, err := updateDiscoverySources(discoverySources, "source1", "local", "fakepath2") - assert.Nil(err) - assert.Equal(1, len(updatedDiscoverySources)) - assert.NotNil(updatedDiscoverySources[0].Local) - assert.Equal("source1", updatedDiscoverySources[0].Local.Name) - assert.Equal("fakepath2", updatedDiscoverySources[0].Local.Path) - - // When discovery source does not exist - _, err = updateDiscoverySources(discoverySources, "source2", "local", "fakepath2") - assert.NotNil(err) - assert.Contains(err.Error(), "discovery source \"source2\" does not exist") -} - -func Test_deleteDiscoverySource(t *testing.T) { - assert := assert.New(t) - - discoverySources := []configapi.PluginDiscovery{ - configapi.PluginDiscovery{ - Local: &configapi.LocalDiscovery{ - Name: "source1", - Path: "fakepath1", - }, - }, - configapi.PluginDiscovery{ - OCI: &configapi.OCIDiscovery{ - Name: "source2", - Image: "test.registry.com/test-image:v1.0.0", - }, - }, - } - - // When discovery source does not exist - _, err := deleteDiscoverySource(discoverySources, "source-does-not-exists") - assert.NotNil(err) - assert.Contains(err.Error(), "discovery source \"source-does-not-exists\" does not exist") - - // When deleting existing discovery source - updatedDiscoverySources, err := deleteDiscoverySource(discoverySources, "source1") - assert.Nil(err) - assert.Equal(1, len(updatedDiscoverySources)) - assert.Nil(updatedDiscoverySources[0].Local) - assert.NotNil(updatedDiscoverySources[0].OCI) - assert.Equal("source2", updatedDiscoverySources[0].OCI.Name) - assert.Equal("test.registry.com/test-image:v1.0.0", updatedDiscoverySources[0].OCI.Image) - - // When deleting last discovery source - updatedDiscoverySources, err = deleteDiscoverySource(updatedDiscoverySources, "source2") - assert.Nil(err) - assert.Equal(0, len(updatedDiscoverySources)) -} diff --git a/cli/core/pkg/command/doc.go b/cli/core/pkg/command/doc.go deleted file mode 100644 index 71214ba79e..0000000000 --- a/cli/core/pkg/command/doc.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package command creates and initializes the tanzu CLI. -package command - -import ( - "context" - "fmt" - "os" - "text/template" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - "github.com/spf13/cobra/doc" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - coreTemplates "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/command/templates" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -// DefaultDocsDir is the base docs directory -const DefaultDocsDir = "docs/cli/commands" -const ErrorDocsOutputFolderNotExists = "error reading docs output directory '%v', make sure directory exists or provide docs output directory as input value to '--docs-dir' flag" - -var ( - docsDir string -) - -func init() { - genAllDocsCmd.Flags().StringVarP(&docsDir, "docs-dir", "d", DefaultDocsDir, "destination for docs output") -} - -var genAllDocsCmd = &cobra.Command{ - Use: "generate-all-docs", - Short: "Generate Cobra CLI docs for all plugins installed", - Hidden: true, - RunE: func(cmd *cobra.Command, args []string) error { - - if docsDir == "" { - docsDir = DefaultDocsDir - } - if dir, err := os.Stat(docsDir); err != nil || !dir.IsDir() { - return errors.Wrap(err, fmt.Sprintf(ErrorDocsOutputFolderNotExists, docsDir)) - } - // Generate standard tanzu.md command file - if err := genCoreCMD(cmd); err != nil { - return fmt.Errorf("error generate core tanzu cmd markdown %q", err) - } - - var pluginDescriptions []*cliapi.PluginDescriptor - var err error - - serverPlugins, standalonePlugins, err := pluginmanager.InstalledPlugins() - if err != nil { - return fmt.Errorf("error while getting installed plugins descriptors: %q", err) - } - - combinedPds := append(serverPlugins, standalonePlugins...) - for i := range combinedPds { - pluginDescriptions = append(pluginDescriptions, &combinedPds[i]) - } - - if err := genREADME(pluginDescriptions); err != nil { - return fmt.Errorf("error generate core tanzu README markdown %q", err) - } - - if err := genMarkdownTreePlugins(pluginDescriptions); err != nil { - return fmt.Errorf("error generating plugin docs %q", err) - } - - return nil - }, -} - -func genCoreCMD(cmd *cobra.Command) error { - tanzuMD := fmt.Sprintf("%s/%s", docsDir, "tanzu.md") - t, err := os.OpenFile(tanzuMD, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { - return fmt.Errorf("error opening tanzu.md %q", err) - } - defer t.Close() - if err := doc.GenMarkdown(cmd.Root(), t); err != nil { - return fmt.Errorf("error generating markdown %q", err) - } - return nil -} - -func genREADME(plugins []*cliapi.PluginDescriptor) error { - readmeFilename := fmt.Sprintf("%s/%s", docsDir, "README.md") - readme, err := os.OpenFile(readmeFilename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { - return fmt.Errorf("error opening readme %q", err) - } - defer readme.Close() - - tmpl := template.Must(template.New("readme").Parse(coreTemplates.CoreREADME)) - err = tmpl.Execute(readme, plugins) - if err != nil { - return err - } - return nil -} - -func genMarkdownTreePlugins(plugins []*cliapi.PluginDescriptor) error { - args := []string{"generate-docs", "--docs-dir", docsDir} - for _, p := range plugins { - runner := cli.NewRunner(p.Name, p.InstallationPath, args) - ctx := context.Background() - if err := runner.Run(ctx); err != nil { - return err - } - } - return nil -} diff --git a/cli/core/pkg/command/init.go b/cli/core/pkg/command/init.go deleted file mode 100644 index 69d5e2690e..0000000000 --- a/cli/core/pkg/command/init.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "fmt" - "time" - - "github.com/aunum/log" - "github.com/briandowns/spinner" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/catalog" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - cliconfig "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -var ( - outputFormat string -) - -func init() { - initCmd.SetUsageFunc(cli.SubCmdUsageFunc) -} - -var initCmd = &cobra.Command{ - Use: "init", - Short: "Initialize the CLI", - Annotations: map[string]string{ - "group": string(cliapi.SystemCmdGroup), - }, - SilenceErrors: true, - RunE: func(cmd *cobra.Command, args []string) error { - var err error - - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - err = initPluginsWithContextAwareCLI() - if err != nil { - return err - } - log.Success("successfully initialized CLI") - return nil - } - - s := spinner.New(spinner.CharSets[9], 100*time.Millisecond) - if err := s.Color("bgBlack", "bold", "fgWhite"); err != nil { - return err - } - s.Suffix = fmt.Sprintf(" %s", "initializing") - s.Start() - - cfg, err := config.GetClientConfig() - if err != nil { - return err - } - repos := cli.NewMultiRepo(cli.LoadRepositories(cfg)...) - err = cli.EnsureDistro(repos) - if err != nil { - return err - } - s.Stop() - log.Success("successfully initialized CLI") - return nil - }, -} - -func initPluginsWithContextAwareCLI() error { - if err := catalog.UpdateCatalogCache(); err != nil { - return err - } - return pluginmanager.SyncPlugins() -} diff --git a/cli/core/pkg/command/plugin_manager.go b/cli/core/pkg/command/plugin_manager.go deleted file mode 100644 index 36de7b7b33..0000000000 --- a/cli/core/pkg/command/plugin_manager.go +++ /dev/null @@ -1,475 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "fmt" - "io" - "path/filepath" - "sort" - "strings" - - "github.com/fatih/color" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - - "github.com/aunum/log" - "github.com/pkg/errors" - "gopkg.in/yaml.v2" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - cliconfig "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/command" - component "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -var ( - local string - version string - forceDelete bool - targetStr string -) - -func init() { - pluginCmd.SetUsageFunc(cli.SubCmdUsageFunc) - pluginCmd.AddCommand( - listPluginCmd, - installPluginCmd, - upgradePluginCmd, - describePluginCmd, - deletePluginCmd, - repoCmd, - cleanPluginCmd, - syncPluginCmd, - discoverySourceCmd, - ) - listPluginCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table)") - listPluginCmd.Flags().StringVarP(&local, "local", "l", "", "path to local discovery/distribution source") - installPluginCmd.Flags().StringVarP(&local, "local", "l", "", "path to local discovery/distribution source") - installPluginCmd.Flags().StringVarP(&version, "version", "v", cli.VersionLatest, "version of the plugin") - deletePluginCmd.Flags().BoolVarP(&forceDelete, "yes", "y", false, "delete the plugin without asking for confirmation") - - if config.IsFeatureActivated(cliconfig.FeatureContextCommand) { - installPluginCmd.Flags().StringVarP(&targetStr, "target", "t", "", "target of the plugin (kubernetes[k8s]/mission-control[tmc])") - upgradePluginCmd.Flags().StringVarP(&targetStr, "target", "t", "", "target of the plugin (kubernetes[k8s]/mission-control[tmc])") - deletePluginCmd.Flags().StringVarP(&targetStr, "target", "t", "", "target of the plugin (kubernetes[k8s]/mission-control[tmc])") - describePluginCmd.Flags().StringVarP(&targetStr, "target", "t", "", "target of the plugin (kubernetes[k8s]/mission-control[tmc])") - } - - command.DeprecateCommand(repoCmd, "") -} - -var pluginCmd = &cobra.Command{ - Use: "plugin", - Short: "Manage CLI plugins", - Annotations: map[string]string{ - "group": string(cliapi.SystemCmdGroup), - }, -} - -var listPluginCmd = &cobra.Command{ - Use: "list", - Short: "List available plugins", - RunE: func(cmd *cobra.Command, args []string) error { - var err error - var availablePlugins []plugin.Discovered - if local != "" { - // get absolute local path - local, err = filepath.Abs(local) - if err != nil { - return err - } - availablePlugins, err = pluginmanager.AvailablePluginsFromLocalSource(local) - } else { - availablePlugins, err = pluginmanager.AvailablePlugins() - } - sort.Sort(plugin.DiscoveredSorter(availablePlugins)) - - if err != nil { - return err - } - - if config.IsFeatureActivated(cliconfig.FeatureContextCommand) && (outputFormat == "" || outputFormat == string(component.TableOutputType)) { - displayPluginListOutputSplitViewContext(availablePlugins, cmd.OutOrStdout()) - } else { - displayPluginListOutputListView(availablePlugins, cmd.OutOrStdout()) - } - - return nil - - }, -} - -var describePluginCmd = &cobra.Command{ - Use: "describe [name]", - Short: "Describe a plugin", - RunE: func(cmd *cobra.Command, args []string) (err error) { - if len(args) != 1 { - return fmt.Errorf("must provide plugin name as positional argument") - } - pluginName := args[0] - - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - if !cliv1alpha1.IsValidTarget(targetStr) { - return errors.New("invalid target specified. Please specify correct value of `--target` or `-t` flag from 'kubernetes/k8s/mission-control/tmc'") - } - - pd, err := pluginmanager.DescribePlugin(pluginName, getTarget()) - if err != nil { - return err - } - - b, err := yaml.Marshal(pd) - if err != nil { - return errors.Wrap(err, "could not marshal plugin") - } - fmt.Println(string(b)) - - return nil - } - - repos := getRepositories() - - repo, err := repos.Find(pluginName) - if err != nil { - return err - } - - plugin, err := repo.Describe(pluginName) - if err != nil { - return err - } - - b, err := yaml.Marshal(plugin) - if err != nil { - return errors.Wrap(err, "could not marshal plugin") - } - fmt.Println(string(b)) - return - }, -} - -var installPluginCmd = &cobra.Command{ - Use: "install [name]", - Short: "Install a plugin", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - var err error - - pluginName := args[0] - - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - - if !cliv1alpha1.IsValidTarget(targetStr) { - return errors.New("invalid target specified. Please specify correct value of `--target` or `-t` flag from 'kubernetes/k8s/mission-control/tmc'") - } - - // Invoke install plugin from local source if local files are provided - if local != "" { - // get absolute local path - local, err = filepath.Abs(local) - if err != nil { - return err - } - err = pluginmanager.InstallPluginsFromLocalSource(pluginName, version, getTarget(), local, false) - if err != nil { - return err - } - if pluginName == cli.AllPlugins { - log.Successf("successfully installed all plugins") - } else { - log.Successf("successfully installed '%s' plugin", pluginName) - } - return nil - } - - // Invoke plugin sync if install all plugins is mentioned - if pluginName == cli.AllPlugins { - err = pluginmanager.SyncPlugins() - if err != nil { - return err - } - log.Successf("successfully installed all plugins") - return nil - } - - pluginVersion := version - if pluginVersion == cli.VersionLatest { - pluginVersion, err = pluginmanager.GetRecommendedVersionOfPlugin(pluginName, getTarget()) - if err != nil { - return err - } - } - - err = pluginmanager.InstallPlugin(pluginName, pluginVersion, getTarget()) - if err != nil { - return err - } - log.Successf("successfully installed '%s' plugin", pluginName) - return nil - } - - repos := getRepositories() - - if pluginName == cli.AllPlugins { - return cli.InstallAllMulti(repos) - } - repo, err := repos.Find(pluginName) - if err != nil { - return err - } - - plugin, err := repo.Describe(pluginName) - if err != nil { - return err - } - if version == cli.VersionLatest { - version = plugin.FindVersion(repo.VersionSelector()) - } - err = cli.InstallPlugin(pluginName, version, repo) - if err != nil { - return err - } - log.Successf("successfully installed %s", pluginName) - return nil - }, -} - -var upgradePluginCmd = &cobra.Command{ - Use: "upgrade [name]", - Short: "Upgrade a plugin", - RunE: func(cmd *cobra.Command, args []string) (err error) { - if len(args) != 1 { - return fmt.Errorf("must provide plugin name as positional argument") - } - pluginName := args[0] - - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - if !cliv1alpha1.IsValidTarget(targetStr) { - return errors.New("invalid target specified. Please specify correct value of `--target` or `-t` flag from 'kubernetes/k8s/mission-control/tmc'") - } - - pluginVersion, err := pluginmanager.GetRecommendedVersionOfPlugin(pluginName, getTarget()) - if err != nil { - return err - } - - err = pluginmanager.UpgradePlugin(pluginName, pluginVersion, getTarget()) - if err != nil { - return err - } - log.Successf("successfully upgraded plugin '%s' to version '%s'", pluginName, pluginVersion) - return nil - } - - repos := getRepositories() - repo, err := repos.Find(pluginName) - if err != nil { - return err - } - - plugin, err := repo.Describe(pluginName) - if err != nil { - return err - } - - versionSelector := repo.VersionSelector() - err = cli.UpgradePlugin(pluginName, plugin.FindVersion(versionSelector), repo) - if err != nil { - return err - } - log.Successf("successfully upgraded plugin %s", pluginName) - return nil - }, -} - -var deletePluginCmd = &cobra.Command{ - Use: "delete [name]", - Short: "Delete a plugin", - RunE: func(cmd *cobra.Command, args []string) (err error) { - if len(args) != 1 { - return fmt.Errorf("must provide plugin name as positional argument") - } - pluginName := args[0] - - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - if !cliv1alpha1.IsValidTarget(targetStr) { - return errors.New("invalid target specified. Please specify correct value of `--target` or `-t` flag from 'kubernetes/k8s/mission-control/tmc'") - } - - deletePluginOptions := pluginmanager.DeletePluginOptions{ - PluginName: pluginName, - Target: getTarget(), - ForceDelete: forceDelete, - } - - err = pluginmanager.DeletePlugin(deletePluginOptions) - if err != nil { - return err - } - - log.Successf("successfully deleted plugin '%s'", pluginName) - return nil - } - - err = cli.DeletePlugin(pluginName) - if err != nil { - return err - } - log.Successf("successfully deleted plugin %s", pluginName) - return nil - }, -} - -var cleanPluginCmd = &cobra.Command{ - Use: "clean", - Short: "Clean the plugins", - RunE: func(cmd *cobra.Command, args []string) (err error) { - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - err = pluginmanager.Clean() - if err != nil { - return err - } - log.Success("successfully cleaned up all plugins") - return nil - } - - err = cli.Clean() - if err != nil { - return err - } - log.Success("successfully cleaned up all plugins") - return nil - }, -} - -var syncPluginCmd = &cobra.Command{ - Use: "sync", - Short: "Sync the plugins", - RunE: func(cmd *cobra.Command, args []string) (err error) { - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - err = pluginmanager.SyncPlugins() - if err != nil { - return err - } - log.Success("Done") - return nil - } - return errors.Errorf("command is only applicable if `%s` feature is enabled", cliconfig.FeatureContextAwareCLIForPlugins) - }, -} - -func getRepositories() *cli.MultiRepo { - cfg, err := config.GetClientConfig() - if err != nil { - log.Fatal(err) - } - - if local != "" { - vs := cli.LoadVersionSelector(cfg.ClientOptions.CLI.UnstableVersionSelector) - - opts := []cli.Option{ - cli.WithVersionSelector(vs), - } - - m := cli.NewMultiRepo() - n := filepath.Base(local) - r := cli.NewLocalRepository(n, local, opts...) - m.AddRepository(r) - return m - } - - return cli.NewMultiRepo(cli.LoadRepositories(cfg)...) -} - -// getInstalledElseAvailablePluginVersion return installed plugin version if plugin is installed -// if not installed it returns available recommanded plugin version -func getInstalledElseAvailablePluginVersion(p *plugin.Discovered) string { - installedOrAvailableVersion := p.InstalledVersion - if installedOrAvailableVersion == "" { - installedOrAvailableVersion = p.RecommendedVersion - } - return installedOrAvailableVersion -} - -func displayPluginListOutputListView(availablePlugins []plugin.Discovered, writer io.Writer) { - var data [][]string - var output component.OutputWriter - - for index := range availablePlugins { - data = append(data, []string{availablePlugins[index].Name, availablePlugins[index].Description, availablePlugins[index].Scope, - availablePlugins[index].Source, getInstalledElseAvailablePluginVersion(&availablePlugins[index]), availablePlugins[index].Status}) - } - output = component.NewOutputWriter(writer, outputFormat, "Name", "Description", "Scope", "Discovery", "Version", "Status") - - for _, row := range data { - vals := make([]interface{}, len(row)) - for i, val := range row { - vals[i] = val - } - output.AddRow(vals...) - } - output.Render() -} - -func displayPluginListOutputSplitViewContext(availablePlugins []plugin.Discovered, writer io.Writer) { - var dataStandalone [][]string - var outputStandalone component.OutputWriter - dataContext := make(map[string][][]string) - outputContext := make(map[string]component.OutputWriter) - - outputStandalone = component.NewOutputWriter(writer, outputFormat, "Name", "Description", "Target", "Discovery", "Version", "Status") - - for index := range availablePlugins { - if availablePlugins[index].Scope == common.PluginScopeStandalone { - newRow := []string{availablePlugins[index].Name, availablePlugins[index].Description, string(availablePlugins[index].Target), - availablePlugins[index].Source, getInstalledElseAvailablePluginVersion(&availablePlugins[index]), availablePlugins[index].Status} - dataStandalone = append(dataStandalone, newRow) - } else { - newRow := []string{availablePlugins[index].Name, availablePlugins[index].Description, string(availablePlugins[index].Target), - getInstalledElseAvailablePluginVersion(&availablePlugins[index]), availablePlugins[index].Status} - outputContext[availablePlugins[index].ContextName] = component.NewOutputWriter(writer, outputFormat, "Name", "Description", "Target", "Version", "Status") - data := dataContext[availablePlugins[index].ContextName] - data = append(data, newRow) - dataContext[availablePlugins[index].ContextName] = data - } - } - - addDataToOutputWriter := func(output component.OutputWriter, data [][]string) { - for _, row := range data { - vals := make([]interface{}, len(row)) - for i, val := range row { - vals[i] = val - } - output.AddRow(vals...) - } - } - - cyanBold := color.New(color.FgCyan).Add(color.Bold) - cyanBoldItalic := color.New(color.FgCyan).Add(color.Bold, color.Italic) - - _, _ = cyanBold.Println("Standalone Plugins") - addDataToOutputWriter(outputStandalone, dataStandalone) - outputStandalone.Render() - - for context, writer := range outputContext { - fmt.Println("") - _, _ = cyanBold.Println("Plugins from Context: ", cyanBoldItalic.Sprintf(context)) - data := dataContext[context] - addDataToOutputWriter(writer, data) - writer.Render() - } -} - -func getTarget() cliv1alpha1.Target { - return cliv1alpha1.StringToTarget(strings.ToLower(targetStr)) -} diff --git a/cli/core/pkg/command/plugin_manager_test.go b/cli/core/pkg/command/plugin_manager_test.go deleted file mode 100644 index bdaf635e5e..0000000000 --- a/cli/core/pkg/command/plugin_manager_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" -) - -func Test_getInstalledElseAvailablePluginVersion(t *testing.T) { - assert := assert.New(t) - - p := plugin.Discovered{ - InstalledVersion: "v1.0.0", - RecommendedVersion: "v2.0.0", - } - - version := getInstalledElseAvailablePluginVersion(&p) - assert.Equal(version, p.InstalledVersion) - - p.InstalledVersion = "" - version = getInstalledElseAvailablePluginVersion(&p) - assert.Equal(version, p.RecommendedVersion) -} diff --git a/cli/core/pkg/command/repo.go b/cli/core/pkg/command/repo.go deleted file mode 100644 index 66271550a3..0000000000 --- a/cli/core/pkg/command/repo.go +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "fmt" - - "github.com/aunum/log" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -var ( - gcpBucketName, gcpRootPath, name string -) - -var repoCmd = &cobra.Command{ - Use: "repo", - Short: "Manage plugin repositories", -} - -func init() { - repoCmd.SetUsageFunc(cli.SubCmdUsageFunc) - repoCmd.AddCommand( - listRepoCmd, - addRepoCmd, - updateRepoCmd, - deleteRepoCmd, - ) - addRepoCmd.Flags().StringVarP(&name, "name", "n", "", "name of repository") - addRepoCmd.Flags().StringVarP(&gcpBucketName, "gcp-bucket-name", "b", "", "name of gcp bucket") - addRepoCmd.Flags().StringVarP(&gcpRootPath, "gcp-root-path", "p", "", "root path in gcp bucket") - cobra.MarkFlagRequired(addRepoCmd.Flags(), "name") //nolint - cobra.MarkFlagRequired(addRepoCmd.Flags(), "gcp-bucket-name") //nolint - cobra.MarkFlagRequired(addRepoCmd.Flags(), "gcp-root-path") //nolint - - updateRepoCmd.Flags().StringVarP(&gcpBucketName, "gcp-bucket-name", "b", "", "name of gcp bucket") - updateRepoCmd.Flags().StringVarP(&gcpRootPath, "gcp-root-path", "p", "", "root path in gcp bucket") - - listRepoCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table)") -} - -var listRepoCmd = &cobra.Command{ - Use: "list", - Short: "List available repositories", - RunE: func(cmd *cobra.Command, args []string) error { - cfg, err := config.GetClientConfig() - if err != nil { - return err - } - - repos := cli.LoadRepositories(cfg) - output := component.NewOutputWriter(cmd.OutOrStdout(), outputFormat, "name") - for index := range repos { - output.AddRow(repos[index].Name()) - } - output.Render() - - return nil - }, -} - -var addRepoCmd = &cobra.Command{ - Use: "add", - Short: "Add a repository", - RunE: func(cmd *cobra.Command, args []string) error { - // Acquire tanzu config lock - config.AcquireTanzuConfigLock() - defer config.ReleaseTanzuConfigLock() - - cfg, err := config.GetClientConfigNoLock() - if err != nil { - return err - } - if cfg.ClientOptions == nil { - cfg.ClientOptions = &configapi.ClientOptions{} - } - if cfg.ClientOptions.CLI == nil { - cfg.ClientOptions.CLI = &configapi.CLIOptions{} - } - repos := cfg.ClientOptions.CLI.Repositories - gcpRepo := &configapi.GCPPluginRepository{ - Name: name, - BucketName: gcpBucketName, - RootPath: gcpRootPath, - } - pluginRepo := configapi.PluginRepository{ - GCPPluginRepository: gcpRepo, - } - for _, repo := range repos { - if repo.GCPPluginRepository != nil { - if repo.GCPPluginRepository.Name == name { - return fmt.Errorf("repo name %q already exists", name) - } - } - } - repos = append(repos, pluginRepo) - cfg.ClientOptions.CLI.Repositories = repos - err = config.StoreClientConfig(cfg) - if err != nil { - return err - } - log.Successf("successfully added repository %s", pluginRepo.GCPPluginRepository.Name) - return nil - }, -} - -var updateRepoCmd = &cobra.Command{ - Use: "update [name]", - Short: "Update a repository configuration", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - repoName := args[0] - - // Acquire tanzu config lock - config.AcquireTanzuConfigLock() - defer config.ReleaseTanzuConfigLock() - - cfg, err := config.GetClientConfigNoLock() - if err != nil { - return err - } - - repoNoExistError := fmt.Errorf("repo %q does not exist", repoName) - if cfg.ClientOptions == nil { - return repoNoExistError - } - if cfg.ClientOptions.CLI == nil { - return repoNoExistError - } - repos := cfg.ClientOptions.CLI.Repositories - - newRepos := []configapi.PluginRepository{} - for _, repo := range repos { - if repo.GCPPluginRepository != nil { - if repo.GCPPluginRepository.Name == repoName { - if gcpBucketName != "" { - repo.GCPPluginRepository.BucketName = gcpBucketName - } - if gcpRootPath != "" { - repo.GCPPluginRepository.RootPath = gcpRootPath - } - } - newRepos = append(newRepos, repo) - } - } - cfg.ClientOptions.CLI.Repositories = newRepos - err = config.StoreClientConfig(cfg) - if err != nil { - return err - } - log.Successf("successfully updated repository configuration for %s", repoName) - return nil - }, -} - -var deleteRepoCmd = &cobra.Command{ - Use: "delete [name]", - Short: "Delete a repository", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) (err error) { - repoName := args[0] - - // Acquire tanzu config lock - config.AcquireTanzuConfigLock() - defer config.ReleaseTanzuConfigLock() - - cfg, err := config.GetClientConfigNoLock() - if err != nil { - return err - } - if cfg.ClientOptions == nil || cfg.ClientOptions.CLI == nil { - return fmt.Errorf("repository %q unknown", repoName) - } - - r := cfg.ClientOptions.CLI.Repositories - newRepos := []configapi.PluginRepository{} - for _, repo := range r { - if repo.GCPPluginRepository == nil { - continue - } - if repo.GCPPluginRepository.Name == repoName { - continue - } - newRepos = append(newRepos, repo) - } - cfg.ClientOptions.CLI.Repositories = newRepos - err = config.StoreClientConfig(cfg) - if err != nil { - return err - } - log.Successf("successfully deleted repository %s", repoName) - return nil - }, -} diff --git a/cli/core/pkg/command/root.go b/cli/core/pkg/command/root.go deleted file mode 100644 index 9d0cd15884..0000000000 --- a/cli/core/pkg/command/root.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package command provides commands -package command - -import ( - "fmt" - "os" - "strings" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - cliconfig "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -// RootCmd is the core root Tanzu command -var RootCmd = &cobra.Command{ - Use: "tanzu", - // Don't have Cobra print the error message, the CLI will - // print it itself in a nicer format. - SilenceErrors: true, -} - -// NewRootCmd creates a root command. -func NewRootCmd() (*cobra.Command, error) { - uFunc := cli.NewMainUsage().Func() - RootCmd.SetUsageFunc(uFunc) - k8sCmd.SetUsageFunc(uFunc) - tmcCmd.SetUsageFunc(uFunc) - - // configure defined environment variables under tanzu config file - cliconfig.ConfigureEnvVariables() - - RootCmd.Short = component.Bold(`Tanzu CLI`) - - // TODO (pbarker): silencing usage for now as we are getting double usage from plugins on errors - RootCmd.SilenceUsage = true - - RootCmd.AddCommand( - pluginCmd, - initCmd, - updateCmd, - versionCmd, - completionCmd, - configCmd, - genAllDocsCmd, - ) - - // If the context and target feature is enabled, add the corresponding commands under root. - if config.IsFeatureActivated(cliconfig.FeatureContextCommand) { - RootCmd.AddCommand( - contextCmd, - k8sCmd, - tmcCmd, - ) - mapTargetToCmd := map[cliv1alpha1.Target]*cobra.Command{ - cliv1alpha1.TargetK8s: k8sCmd, - cliv1alpha1.TargetTMC: tmcCmd, - } - if err := addPluginsToTarget(mapTargetToCmd); err != nil { - return nil, err - } - } - - serverPlugins, standalonePlugins, err := pluginmanager.InstalledPlugins() - if err != nil { - return nil, err - } - - plugins := serverPlugins - plugins = append(plugins, standalonePlugins...) - - if err = config.CopyLegacyConfigDir(); err != nil { - return nil, fmt.Errorf("failed to copy legacy configuration directory to new location: %w", err) - } - - var maskedPlugins []string - - for i := range plugins { - // Only add plugins that should be available as root level command - if isPluginRootCmdTargeted(&plugins[i]) { - cmd := cli.GetCmd(&plugins[i]) - // check and find if same command already exists as part of root command - matchedCmd := findSubCommand(RootCmd, cmd) - if matchedCmd == nil { // If the subcommand for the plugin doesn't exist add the command - RootCmd.AddCommand(cmd) - } else if plugins[i].Scope == common.PluginScopeContext && isStandalonePluginCommand(matchedCmd) { - // If the subcommand already exists but plugin is `Context-Scoped` plugin - // then context-scoped plugin gets higher precedence, so, replace the existing command - // to point to new command by removing and adding new command. - maskedPlugins = append(maskedPlugins, matchedCmd.Name()) - RootCmd.RemoveCommand(matchedCmd) - RootCmd.AddCommand(cmd) - } else { - maskedPlugins = append(maskedPlugins, plugins[i].Name) - } - } - } - - if len(maskedPlugins) > 0 { - fmt.Fprintf(os.Stderr, "Warning, Masking commands for plugins %q because a core command or other plugin with that name already exists. \n", strings.Join(maskedPlugins, ", ")) - } - - duplicateAliasWarning() - - // Flag parsing must be deactivated because the root plugin won't know about all flags. - RootCmd.DisableFlagParsing = true - - return RootCmd, nil -} - -var k8sCmd = &cobra.Command{ - Use: "kubernetes", - Short: "Tanzu CLI plugins that target a Kubernetes cluster", - Aliases: []string{"k8s"}, - Annotations: map[string]string{ - "group": string(cliapi.TargetCmdGroup), - }, -} - -var tmcCmd = &cobra.Command{ - Use: "mission-control", - Short: "Tanzu CLI plugins that target a Tanzu Mission Control endpoint", - Aliases: []string{"tmc"}, - Annotations: map[string]string{ - "group": string(cliapi.TargetCmdGroup), - }, -} - -func addPluginsToTarget(mapTargetToCmd map[cliv1alpha1.Target]*cobra.Command) error { - installedPlugins, standalonePlugins, err := pluginmanager.InstalledPlugins() - if err != nil { - return fmt.Errorf("unable to find installed plugins: %w", err) - } - - installedPlugins = append(installedPlugins, standalonePlugins...) - - for i := range installedPlugins { - if cmd, exists := mapTargetToCmd[installedPlugins[i].Target]; exists { - cmd.AddCommand(cli.GetCmd(&installedPlugins[i])) - } - } - return nil -} - -func duplicateAliasWarning() { - var aliasMap = make(map[string][]string) - for _, command := range RootCmd.Commands() { - for _, alias := range command.Aliases { - aliases, ok := aliasMap[alias] - if !ok { - aliasMap[alias] = []string{command.Name()} - } else { - aliasMap[alias] = append(aliases, command.Name()) - } - } - } - - for alias, plugins := range aliasMap { - if len(plugins) > 1 { - fmt.Fprintf(os.Stderr, "Warning, the alias %s is duplicated across plugins: %s\n\n", alias, strings.Join(plugins, ", ")) - } - } -} - -// Execute executes the CLI. -func Execute() error { - root, err := NewRootCmd() - if err != nil { - return err - } - return root.Execute() -} - -func findSubCommand(rootCmd, subCmd *cobra.Command) *cobra.Command { - arrSubCmd := rootCmd.Commands() - for i := range arrSubCmd { - if arrSubCmd[i].Name() == subCmd.Name() { - return arrSubCmd[i] - } - } - return nil -} - -func isPluginRootCmdTargeted(plugin *cliapi.PluginDescriptor) bool { - // Only '' targeted and `k8s` targeted plugins are considered root cmd targeted plugins - return plugin != nil && (plugin.Target == cliv1alpha1.TargetNone || plugin.Target == cliv1alpha1.TargetK8s) -} - -func isStandalonePluginCommand(cmd *cobra.Command) bool { - scope, exists := cmd.Annotations["scope"] - return exists && scope == common.PluginScopeStandalone -} diff --git a/cli/core/pkg/command/templates/README.md.tmpl b/cli/core/pkg/command/templates/README.md.tmpl deleted file mode 100644 index 1f1319515c..0000000000 --- a/cli/core/pkg/command/templates/README.md.tmpl +++ /dev/null @@ -1,12 +0,0 @@ -# CLI Command Docs - -The provided documentation is autogenerated from the CLI and the core plugins. - -## Core Command - -The [root command](tanzu.md) is a good place to begin discovering the CLI command structure. - -## Core Plugins - -{{range .}} -- [{{.Name}}](tanzu_{{.Name}}.md){{end}} diff --git a/cli/core/pkg/command/templates/core.go b/cli/core/pkg/command/templates/core.go deleted file mode 100644 index 37dc61407a..0000000000 --- a/cli/core/pkg/command/templates/core.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package plugintemplates provides templates for CLI doc generation -package plugintemplates - -import _ "embed" // Import files for plugin templates - -// CoreREADME contains the cobra cli docs readme template -// -//go:embed README.md.tmpl -var CoreREADME string diff --git a/cli/core/pkg/command/update.go b/cli/core/pkg/command/update.go deleted file mode 100644 index c21549ebc2..0000000000 --- a/cli/core/pkg/command/update.go +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "errors" - "fmt" - "strings" - - "github.com/AlecAivazis/survey/v2" - "github.com/aunum/log" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - cliconfig "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -var yesUpdate bool - -func init() { - updateCmd.SetUsageFunc(cli.SubCmdUsageFunc) - updateCmd.Flags().BoolVarP(&yesUpdate, "yes", "y", false, "force update; skip prompt") - updateCmd.Flags().StringVarP(&local, "local", "l", "", "path to local repository") -} - -var updateCmd = &cobra.Command{ - Use: "update", - Short: "Update the CLI", - Annotations: map[string]string{ - "group": string(cliapi.SystemCmdGroup), - }, - RunE: func(cmd *cobra.Command, args []string) error { - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - return errors.New("CLI self-update is currently not supported. For updating plugins please use the `tanzu plugin sync` command") - } - - // clean the catalog cache when updating the cli - if err := cli.CleanCatalogCache(); err != nil { - log.Debugf("Failed to clean the Plugin descriptors cache %v", err) - } - // TODO: cli.ListPlugins is deprecated: Use pluginmanager.AvailablePluginsFromLocalSource or pluginmanager.AvailablePlugins instead - plugins, err := cli.ListPlugins() - if err != nil { - return err - } - - repos := getRepositories() - coreRepo, err := repos.Find(cli.CoreName) - if err != nil { - return err - } - - type updateInfo struct { - version string - repo cli.Repository - } - - updateMap := map[*cliapi.PluginDescriptor]updateInfo{} - for _, plugin := range plugins { - if plugin.Name == cli.CoreName { - continue - } - update, repo, version, err := cli.HasPluginUpdateIn(repos, plugin) - if err != nil { - log.Warningf("could not find local plugin %q in any remote repositories", plugin.Name) - continue - } - if update { - updateMap[plugin] = updateInfo{version, repo} - } - } - - coreUpdate, coreVersion, err := cli.HasUpdate(coreRepo) - if err != nil { - return err - } - - if len(updateMap) == 0 && !coreUpdate { - log.Info("everything up to date") - return nil - } - - log.Info("the following updates will take place:") - if coreUpdate { - fmt.Printf(" %s %s → %s\n", cli.CoreName, buildinfo.Version, coreVersion) - } - for plugin, version := range updateMap { - fmt.Printf(" %s %s → %s\n", plugin.Name, plugin.Version, version) - } - // formatting - fmt.Println() - - if !yesUpdate { - input := &survey.Input{Message: "would you like to continue? [y/n]"} - var resp string - err := survey.AskOne(input, &resp) - if err != nil { - return err - } - update := strings.ToLower(resp) - if update != "y" && update != "yes" { - log.Info("aborting update") - return nil - } - } - for plugin, info := range updateMap { - err := cli.InstallPlugin(plugin.Name, info.version, info.repo) - if err != nil { - return err - } - } - - // update core - err = cli.Update(coreRepo) - if err != nil { - return err - } - - // formatting - fmt.Println() - log.Success("successfully updated CLI") - return nil - }, -} diff --git a/cli/core/pkg/command/version.go b/cli/core/pkg/command/version.go deleted file mode 100644 index e1c90dee41..0000000000 --- a/cli/core/pkg/command/version.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -func init() { - versionCmd.SetUsageFunc(cli.SubCmdUsageFunc) -} - -var versionCmd = &cobra.Command{ - Use: "version", - Short: "Version information", - Annotations: map[string]string{ - "group": string(cliapi.SystemCmdGroup), - }, - RunE: func(cmd *cobra.Command, args []string) error { - fmt.Printf("version: %s\nbuildDate: %s\nsha: %s\n", buildinfo.Version, buildinfo.Date, buildinfo.SHA) - return nil - }, -} diff --git a/cli/core/pkg/command/version_test.go b/cli/core/pkg/command/version_test.go deleted file mode 100644 index 6e43eea48e..0000000000 --- a/cli/core/pkg/command/version_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "io" - "os" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/buildinfo" -) - -func readOutput(t *testing.T, r io.Reader, c chan<- []byte) { - data, err := io.ReadAll(r) - if err != nil { - t.Error(err) - } - c <- data -} - -func TestVersion(t *testing.T) { - assert := assert.New(t) - - r, w, err := os.Pipe() - if err != nil { - t.Error(err) - } - c := make(chan []byte) - go readOutput(t, r, c) - - // Set up for our test - stdout := os.Stdout - stderr := os.Stderr - defer func() { - os.Stdout = stdout - os.Stderr = stderr - }() - os.Stdout = w - os.Stderr = w - - buildinfo.Version = "1.2.3" - buildinfo.Date = "today" - buildinfo.SHA = "cafecafe" - defer func() { - buildinfo.Version = "" - buildinfo.Date = "" - buildinfo.SHA = "" - }() - - err = versionCmd.Execute() - assert.Nil(err) - w.Close() - - got := <-c - expected := "version: 1.2.3\nbuildDate: today\nsha: cafecafe\n" - assert.Equal(expected, string(got)) -} diff --git a/cli/core/pkg/common/arch.go b/cli/core/pkg/common/arch.go deleted file mode 100644 index 16d3cb312f..0000000000 --- a/cli/core/pkg/common/arch.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package common - -import ( - "fmt" - "runtime" -) - -const ( - // DefaultOSArch defines default OS/ARCH - DefaultOSArch = "darwin-amd64 linux-amd64 windows-amd64" -) - -// Arch represents a system architecture. -type Arch string - -// BuildArch returns compile time build arch or locates it. -func BuildArch() Arch { - return Arch(fmt.Sprintf("%s_%s", runtime.GOOS, runtime.GOARCH)) -} - -// IsWindows tells if an arch is windows. -func (a Arch) IsWindows() bool { - if a == Win386 || a == WinAMD64 { - return true - } - return false -} - -const ( - // Linux386 arch. - Linux386 Arch = "linux_386" - // LinuxAMD64 arch. - LinuxAMD64 Arch = "linux_amd64" - // LinuxARM64 arch. - LinuxARM64 Arch = "linux_arm64" - // DarwinAMD64 arch. - DarwinAMD64 Arch = "darwin_amd64" - // DarwinARM64 arch. - DarwinARM64 Arch = "darwin_arm64" - // Win386 arch. - Win386 Arch = "windows_386" - // WinAMD64 arch. - WinAMD64 Arch = "windows_amd64" -) diff --git a/cli/core/pkg/common/constants.go b/cli/core/pkg/common/constants.go deleted file mode 100644 index 7be067552d..0000000000 --- a/cli/core/pkg/common/constants.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package common defines generic constants and structs -package common - -// Plugin status and scope constants -const ( - PluginStatusInstalled = "installed" - PluginStatusNotInstalled = "not installed" - PluginStatusUpdateAvailable = "update available" - PluginScopeStandalone = "Standalone" - PluginScopeContext = "Context" -) - -// DiscoveryType constants -const ( - DiscoveryTypeOCI = "oci" - DiscoveryTypeLocal = "local" - DiscoveryTypeGCP = "gcp" - DiscoveryTypeKubernetes = "kubernetes" - DiscoveryTypeREST = "rest" -) - -// DistributionType constants -const ( - DistributionTypeOCI = "oci" - DistributionTypeLocal = "local" -) diff --git a/cli/core/pkg/common/defaults.go b/cli/core/pkg/common/defaults.go deleted file mode 100644 index a661c929f3..0000000000 --- a/cli/core/pkg/common/defaults.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package common defines generic constants and structs -package common - -import ( - "path/filepath" - - "github.com/adrg/xdg" -) - -var ( - // DefaultCacheDir is the default cache directory - DefaultCacheDir = filepath.Join(xdg.Home, ".cache", "tanzu") - - // DefaultPluginRoot is the default plugin root. - DefaultPluginRoot = filepath.Join(xdg.DataHome, "tanzu-cli") - - // DefaultLocalPluginDistroDir is the default Local plugin distribution root directory - // This directory will be used for local discovery and local distribute of plugins - DefaultLocalPluginDistroDir = filepath.Join(xdg.Home, ".config", "tanzu-plugins") -) diff --git a/cli/core/pkg/common/gcp.go b/cli/core/pkg/common/gcp.go deleted file mode 100644 index 71fc1687fa..0000000000 --- a/cli/core/pkg/common/gcp.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package common - -import ( - "context" - "fmt" - - "cloud.google.com/go/storage" - "github.com/pkg/errors" - "google.golang.org/api/option" -) - -// GetGCPBucket returns gcp storage bucket handle -func GetGCPBucket(ctx context.Context, bucketName string) (*storage.BucketHandle, error) { - client, err := storage.NewClient(ctx, option.WithoutAuthentication()) - if err != nil { - return nil, errors.Wrap(err, "could not connect to repository") - } - bkt := client.Bucket(bucketName) - if bkt == nil { - return nil, fmt.Errorf("could not connect to repository") - } - return bkt, nil -} diff --git a/cli/core/pkg/config/bom.go b/cli/core/pkg/config/bom.go deleted file mode 100644 index 3e1a7a9b74..0000000000 --- a/cli/core/pkg/config/bom.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - -// Deprecated: This configuration variables are defined to support older plugins that are relying on -// this configuration to be set in the tanzu configuration file. -// This is pointing to the production registry to make sure existing plugins continue to work with -// newer version of the Tanzu CLI -const ( - tkgDefaultImageRepo = "projects.registry.vmware.com/tkg" - tkgDefaultCompatibilityImagePath = "tkg-compatibility" -) - -func addCompatibilityFile(c *configapi.ClientConfig, compatibilityFilePath string) { - if c.ClientOptions == nil { - c.ClientOptions = &configapi.ClientOptions{} - } - if c.ClientOptions.CLI == nil { - c.ClientOptions.CLI = &configapi.CLIOptions{} - } - // CompatibilityFilePath has been deprecated and will be removed from future version - c.ClientOptions.CLI.CompatibilityFilePath = compatibilityFilePath //nolint:staticcheck -} - -func addBomRepo(c *configapi.ClientConfig, repo string) { - if c.ClientOptions == nil { - c.ClientOptions = &configapi.ClientOptions{} - } - if c.ClientOptions.CLI == nil { - c.ClientOptions.CLI = &configapi.CLIOptions{} - } - // BOMRepo has been deprecated and will be removed from future version - c.ClientOptions.CLI.BOMRepo = repo //nolint:staticcheck -} - -// AddCompatibilityFileIfMissing adds the compatibility file to the client configuration to ensure it can be downloaded -func AddCompatibilityFileIfMissing(config *configapi.ClientConfig) bool { - // CompatibilityFilePath has been deprecated and will be removed from future version - if config.ClientOptions == nil || config.ClientOptions.CLI == nil || config.ClientOptions.CLI.CompatibilityFilePath == "" { //nolint:staticcheck - addCompatibilityFile(config, tkgDefaultCompatibilityImagePath) - return true - } - return false -} - -// AddBomRepoIfMissing adds the bomRepository to the client configuration if it is not already present -func AddBomRepoIfMissing(config *configapi.ClientConfig) bool { - // BOMRepo has been deprecated and will be removed from future version - if config.ClientOptions == nil || config.ClientOptions.CLI == nil || config.ClientOptions.CLI.BOMRepo == "" { //nolint:staticcheck - addBomRepo(config, tkgDefaultImageRepo) - return true - } - return false -} diff --git a/cli/core/pkg/config/bom_test.go b/cli/core/pkg/config/bom_test.go deleted file mode 100644 index e68b47105a..0000000000 --- a/cli/core/pkg/config/bom_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestCliCorePkgConfigSuite(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "cli/core/pkg/config Suite") -} - -var ( - configFile configapi.ClientConfig -) -var _ = Describe("config bom test cases", func() { - Context("when config file is empty", func() { - BeforeEach(func() { - configFile = configapi.ClientConfig{} - }) - It("should initialize ClientOptions", func() { - addCompatibilityFile(&configFile, "tkg-compatibility") - Expect(configFile.ClientOptions).NotTo(BeNil()) - Expect(configFile.ClientOptions.CLI).NotTo(BeNil()) - isMissing := AddCompatibilityFileIfMissing(&configFile) - Expect(isMissing).To(BeFalse()) - }) - It("should initialize bom repo", func() { - addBomRepo(&configFile, "projects.registry.vmware.com/tkg") - Expect(configFile.ClientOptions.CLI).NotTo(BeNil()) - }) - It("should return true", func() { - isMissing := AddBomRepoIfMissing(&configFile) - Expect(isMissing).To(BeTrue()) - }) - }) -}) diff --git a/cli/core/pkg/config/config.go b/cli/core/pkg/config/config.go deleted file mode 100644 index 9cc2b4b18c..0000000000 --- a/cli/core/pkg/config/config.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package config provides functions for the tanzu cli configuration -package config - -import ( - "os" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/interfaces" -) - -var ( - configClient interfaces.ConfigClientWrapper -) - -func init() { - configClient = interfaces.NewConfigClient() -} - -// ConfigureEnvVariables reads and configures provided environment variables -// as part of tanzu configuration file -func ConfigureEnvVariables() { - envMap := configClient.GetEnvConfigurations() - if envMap == nil { - return - } - for variable, value := range envMap { - // If environment variable is not already set - // set the environment variable - if os.Getenv(variable) == "" { - os.Setenv(variable, value) - } - } -} diff --git a/cli/core/pkg/config/config_test.go b/cli/core/pkg/config/config_test.go deleted file mode 100644 index 7cde5a5549..0000000000 --- a/cli/core/pkg/config/config_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/fakes" -) - -var ( - prevValue string -) - -const envVar = "test-conf-env" - -var _ = Describe("config env variables", func() { - Context("get env from config", func() { - BeforeEach(func() { - cc := &fakes.FakeConfigClientWrapper{} - configClient = cc - prevValue = os.Getenv(envVar) - confEnvMap := map[string]string{envVar: envVar} - cc.GetEnvConfigurationsReturns(confEnvMap) - }) - It("env variable should be set with config env", func() { - ConfigureEnvVariables() - Expect(os.Getenv(envVar)).To(Equal(envVar)) - os.Setenv(envVar, prevValue) - }) - }) - Context("config return nil map", func() { - BeforeEach(func() { - cc := &fakes.FakeConfigClientWrapper{} - configClient = cc - cc.GetEnvConfigurationsReturns(nil) - }) - It("execute without error", func() { - ConfigureEnvVariables() - }) - }) -}) diff --git a/cli/core/pkg/config/defaults.go b/cli/core/pkg/config/defaults.go deleted file mode 100644 index e1295cf5f2..0000000000 --- a/cli/core/pkg/config/defaults.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "fmt" - "os" - "strings" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/constants" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -// Default Standalone Discovery configuration -// Value of this variables gets assigned during build time -var ( - // DefaultAllowedPluginRepositories this can be comma separated list of allowed registries - DefaultAllowedPluginRepositories = "" - DefaultStandaloneDiscoveryRepository = "" - DefaultStandaloneDiscoveryImagePath = "" - DefaultStandaloneDiscoveryImageTag = "" - DefaultStandaloneDiscoveryName = "default" - // DefaultStandaloneDiscoveryNameLocal Used for local discovery of sources. - // Changing the default-local discovery source label to default and default will be used as a local discovery source - // default and default-local will co-exist in the config.yaml i.e. If local discovery source is used and is now assigned the default name, the discovery source named default-local will still exist. - // And recommend that it be manually removed from the config file. - DefaultStandaloneDiscoveryNameLocal = "default" - DefaultStandaloneDiscoveryType = common.DistributionTypeOCI - DefaultStandaloneDiscoveryLocalPath = "" -) - -// CoreRepositoryName is the core repository name. -const CoreRepositoryName = "core" - -// CoreBucketName is the name of the core plugin repository bucket to use. -var CoreBucketName = "tanzu-cli-framework" - -// DefaultVersionSelector is to only use stable versions of plugins -const DefaultVersionSelector = configapi.NoUnstableVersions - -// DefaultEdition is the edition assumed when there is no value in the local config file -const DefaultEdition = "tkg" - -// CoreGCPBucketRepository is the default GCP bucket repository. -var CoreGCPBucketRepository = configapi.GCPPluginRepository{ - BucketName: CoreBucketName, - Name: CoreRepositoryName, -} - -// AdvancedRepositoryName is the advanced repository name. -const AdvancedRepositoryName = "advanced" - -// AdvancedGCPBucketRepository is the GCP bucket repository for advanced plugins. -var AdvancedGCPBucketRepository = configapi.GCPPluginRepository{ - BucketName: "tanzu-cli-advanced-plugins", - Name: AdvancedRepositoryName, -} - -// DefaultTMCPluginsArtifactRepository is the S3 bucket repository for TMC plugins. -const DefaultTMCPluginsArtifactRepository = "https://tmc-cli.s3-us-west-2.amazonaws.com/plugins/artifacts" - -// DefaultRepositories are the default repositories for the CLI. -var DefaultRepositories = []configapi.PluginRepository{ - { - GCPPluginRepository: &CoreGCPBucketRepository, - }, -} - -// GetDefaultStandaloneDiscoveryImage returns the default Standalone Discovery image -// from the configured build time variables -func GetDefaultStandaloneDiscoveryImage() string { - defaultStandaloneDiscoveryRepository := DefaultStandaloneDiscoveryRepository - defaultStandaloneDiscoveryImagePath := DefaultStandaloneDiscoveryImagePath - defaultStandaloneDiscoveryImageTag := DefaultStandaloneDiscoveryImageTag - - // Run-time overrides of the configuration - if customImageRepo := os.Getenv(constants.ConfigVariableCustomImageRepository); customImageRepo != "" { - defaultStandaloneDiscoveryRepository = customImageRepo - } - if imagePath := os.Getenv(constants.ConfigVariableDefaultStandaloneDiscoveryImagePath); imagePath != "" { - defaultStandaloneDiscoveryImagePath = imagePath - } - if imageTag := os.Getenv(constants.ConfigVariableDefaultStandaloneDiscoveryImageTag); imageTag != "" { - defaultStandaloneDiscoveryImageTag = imageTag - } - - return strings.Trim(defaultStandaloneDiscoveryRepository, "/") + "/" + strings.Trim(defaultStandaloneDiscoveryImagePath, "/") + ":" + defaultStandaloneDiscoveryImageTag -} - -// GetDefaultStandaloneDiscoveryType returns the default standalone discovery type -func GetDefaultStandaloneDiscoveryType() string { - // Run-time overrides of the configuration - if dType := os.Getenv(constants.ConfigVariableDefaultStandaloneDiscoveryType); dType != "" { - return dType - } - return DefaultStandaloneDiscoveryType -} - -// GetDefaultStandaloneDiscoveryLocalPath returns default standalone discovery local path -func GetDefaultStandaloneDiscoveryLocalPath() string { - // Run-time overrides of the configuration - if localPath := os.Getenv(constants.ConfigVariableDefaultStandaloneDiscoveryLocalPath); localPath != "" { - return localPath - } - return DefaultStandaloneDiscoveryLocalPath -} - -// GetTrustedRegistries returns the list of trusted registries that can be used for -// downloading the CLIPlugins -func GetTrustedRegistries() []string { - var trustedRegistries []string - - // Add default allowed registries to trusted registries - if DefaultAllowedPluginRepositories != "" { - for _, r := range strings.Split(DefaultAllowedPluginRepositories, ",") { - trustedRegistries = append(trustedRegistries, strings.TrimSpace(r)) - } - } - - // If custom image repository is defined add it to the list of trusted registries - if customImageRepo := os.Getenv(constants.ConfigVariableCustomImageRepository); customImageRepo != "" { - trustedRegistries = append(trustedRegistries, customImageRepo) - } - - // If ALLOWED_REGISTRY environment variable is specified, allow those registries as well - if allowedRegistry := os.Getenv(constants.AllowedRegistries); allowedRegistry != "" { - for _, r := range strings.Split(allowedRegistry, ",") { - trustedRegistries = append(trustedRegistries, strings.TrimSpace(r)) - } - } - - return trustedRegistries -} - -func getHTTPURIForGCPPluginRepository(repo configapi.GCPPluginRepository) string { - return fmt.Sprintf("https://storage.googleapis.com/%s/", repo.BucketName) -} - -// GetTrustedArtifactLocations returns the list of trusted URI prefixes that can -// be trusted for downloading the CLIPlugins. Currently, this includes only the -// "tanzu-cli-advanced-plugins" GCP bucket where TMC plugins are stored. Other -// exceptions can be added as and when necessary. -func GetTrustedArtifactLocations() []string { - trustedLocations := []string{ - getHTTPURIForGCPPluginRepository(AdvancedGCPBucketRepository), - DefaultTMCPluginsArtifactRepository, - } - - return trustedLocations -} diff --git a/cli/core/pkg/config/defaults_test.go b/cli/core/pkg/config/defaults_test.go deleted file mode 100644 index d35266e655..0000000000 --- a/cli/core/pkg/config/defaults_test.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("defaults test cases", func() { - Context("default locations and repositories", func() { - It("should initialize ClientOptions", func() { - artLocations := GetTrustedArtifactLocations() - Expect(artLocations).NotTo(BeNil()) - }) - It("trusted registries should return value", func() { - DefaultAllowedPluginRepositories = "https://storage.googleapis.com" - trustedRegis := GetTrustedRegistries() - Expect(trustedRegis).NotTo(BeNil()) - DefaultAllowedPluginRepositories = "" - }) - }) -}) diff --git a/cli/core/pkg/config/descovery_test.go b/cli/core/pkg/config/descovery_test.go deleted file mode 100644 index 7a4d72f8ac..0000000000 --- a/cli/core/pkg/config/descovery_test.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "testing" - - "github.com/tj/assert" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/constants" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestConfigPopulateDefaultStandaloneDiscovery(t *testing.T) { - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - DiscoverySources: []configapi.PluginDiscovery{}, - }, - }, - } - configureTestDefaultStandaloneDiscoveryOCI() - - assert := assert.New(t) - - added := populateDefaultStandaloneDiscovery(cfg) - assert.Equal(true, added) - assert.Equal(len(cfg.ClientOptions.CLI.DiscoverySources), 1) - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[0].OCI.Name, DefaultStandaloneDiscoveryName) - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[0].OCI.Image, "fake.image.repo/package/standalone-plugins:v1.0.0") -} - -func TestConfigPopulateDefaultStandaloneDiscoveryWhenDefaultDiscoveryExistsAndIsSame(t *testing.T) { - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - DiscoverySources: []configapi.PluginDiscovery{ - configapi.PluginDiscovery{ - OCI: &configapi.OCIDiscovery{ - Name: DefaultStandaloneDiscoveryName, - Image: "fake.image.repo/package/standalone-plugins:v1.0.0", - }, - }, - }, - }, - }, - } - configureTestDefaultStandaloneDiscoveryOCI() - - assert := assert.New(t) - - added := populateDefaultStandaloneDiscovery(cfg) - assert.Equal(false, added) - assert.Equal(len(cfg.ClientOptions.CLI.DiscoverySources), 1) - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[0].OCI.Name, DefaultStandaloneDiscoveryName) - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[0].OCI.Image, "fake.image.repo/package/standalone-plugins:v1.0.0") -} - -func TestConfigPopulateDefaultStandaloneDiscoveryWhenDefaultDiscoveryExistsAndIsNotSame(t *testing.T) { - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - DiscoverySources: []configapi.PluginDiscovery{ - configapi.PluginDiscovery{ - OCI: &configapi.OCIDiscovery{ - Name: DefaultStandaloneDiscoveryName, - Image: "fake.image/path:v2.0.0", - }, - }, - configapi.PluginDiscovery{ - OCI: &configapi.OCIDiscovery{ - Name: "additional-discovery", - Image: "additional-discovery/path:v1.0.0", - }, - }, - }, - }, - }, - } - configureTestDefaultStandaloneDiscoveryOCI() - - assert := assert.New(t) - - added := populateDefaultStandaloneDiscovery(cfg) - assert.Equal(true, added) - assert.Equal(len(cfg.ClientOptions.CLI.DiscoverySources), 2) - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[0].OCI.Name, DefaultStandaloneDiscoveryName) - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[0].OCI.Image, "fake.image.repo/package/standalone-plugins:v1.0.0") - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[1].OCI.Name, "additional-discovery") - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[1].OCI.Image, "additional-discovery/path:v1.0.0") -} - -func TestConfigPopulateDefaultStandaloneDiscoveryLocal(t *testing.T) { - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - DiscoverySources: []configapi.PluginDiscovery{}, - }, - }, - } - - configureTestDefaultStandaloneDiscoveryLocal() - - assert := assert.New(t) - - added := populateDefaultStandaloneDiscovery(cfg) - assert.Equal(true, added) - assert.Equal(len(cfg.ClientOptions.CLI.DiscoverySources), 1) - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[0].Local.Name, DefaultStandaloneDiscoveryNameLocal) - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[0].Local.Path, "local/path") -} - -func TestConfigPopulateDefaultStandaloneDiscoveryEnvVariables(t *testing.T) { - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - DiscoverySources: []configapi.PluginDiscovery{}, - }, - }, - } - - configureTestDefaultStandaloneDiscoveryOCI() - - os.Setenv(constants.ConfigVariableCustomImageRepository, "env.fake.image.repo") - os.Setenv(constants.ConfigVariableDefaultStandaloneDiscoveryImagePath, "package/env/standalone-plugins") - os.Setenv(constants.ConfigVariableDefaultStandaloneDiscoveryImageTag, "v2.0.0") - - assert := assert.New(t) - - added := populateDefaultStandaloneDiscovery(cfg) - assert.Equal(true, added) - assert.Equal(len(cfg.ClientOptions.CLI.DiscoverySources), 1) - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[0].OCI.Name, DefaultStandaloneDiscoveryName) - assert.Equal(cfg.ClientOptions.CLI.DiscoverySources[0].OCI.Image, "env.fake.image.repo/package/env/standalone-plugins:v2.0.0") -} - -func configureTestDefaultStandaloneDiscoveryOCI() { - DefaultStandaloneDiscoveryType = "oci" - DefaultStandaloneDiscoveryRepository = "fake.image.repo" - DefaultStandaloneDiscoveryImagePath = "package/standalone-plugins" - DefaultStandaloneDiscoveryImageTag = "v1.0.0" -} - -func configureTestDefaultStandaloneDiscoveryLocal() { - DefaultStandaloneDiscoveryType = "local" - DefaultStandaloneDiscoveryLocalPath = "local/path" -} diff --git a/cli/core/pkg/config/discovery.go b/cli/core/pkg/config/discovery.go deleted file mode 100644 index 3e8cd907b8..0000000000 --- a/cli/core/pkg/config/discovery.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "github.com/aunum/log" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/discovery" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func populateDefaultStandaloneDiscovery(c *configapi.ClientConfig) bool { - if c.ClientOptions == nil { - c.ClientOptions = &configapi.ClientOptions{} - } - if c.ClientOptions.CLI == nil { - c.ClientOptions.CLI = &configapi.CLIOptions{} - } - if c.ClientOptions.CLI.DiscoverySources == nil { - c.ClientOptions.CLI.DiscoverySources = make([]configapi.PluginDiscovery, 0) - } - - defaultDiscovery := getDefaultStandaloneDiscoverySource(GetDefaultStandaloneDiscoveryType()) - if defaultDiscovery == nil { - return false - } - - matchIdx := findDiscoverySourceIndex(c.ClientOptions.CLI.DiscoverySources, func(pd configapi.PluginDiscovery) bool { - return discovery.CheckDiscoveryName(pd, DefaultStandaloneDiscoveryName) || - discovery.CheckDiscoveryName(pd, DefaultStandaloneDiscoveryNameLocal) - }) - - if matchIdx >= 0 { - if discovery.CompareDiscoverySource(c.ClientOptions.CLI.DiscoverySources[matchIdx], *defaultDiscovery, GetDefaultStandaloneDiscoveryType()) { - return false - } - c.ClientOptions.CLI.DiscoverySources[matchIdx] = *defaultDiscovery - return true - } - - // Prepend default discovery to available discovery sources - c.ClientOptions.CLI.DiscoverySources = append([]configapi.PluginDiscovery{*defaultDiscovery}, c.ClientOptions.CLI.DiscoverySources...) - return true -} - -func findDiscoverySourceIndex(discoverySources []configapi.PluginDiscovery, matcherFunc func(pd configapi.PluginDiscovery) bool) int { - for i := range discoverySources { - if matcherFunc(discoverySources[i]) { - return i - } - } - return -1 // haven't found a match -} - -func getDefaultStandaloneDiscoverySource(dsType string) *configapi.PluginDiscovery { - switch dsType { - case common.DiscoveryTypeLocal: - return getDefaultStandaloneDiscoverySourceLocal() - case common.DiscoveryTypeOCI: - return getDefaultStandaloneDiscoverySourceOCI() - } - log.Warning("unsupported default standalone discovery configuration") - return nil -} - -func getDefaultStandaloneDiscoverySourceOCI() *configapi.PluginDiscovery { - return &configapi.PluginDiscovery{ - OCI: &configapi.OCIDiscovery{ - Name: DefaultStandaloneDiscoveryName, - Image: GetDefaultStandaloneDiscoveryImage(), - }, - } -} - -func getDefaultStandaloneDiscoverySourceLocal() *configapi.PluginDiscovery { - return &configapi.PluginDiscovery{ - Local: &configapi.LocalDiscovery{ - Name: DefaultStandaloneDiscoveryNameLocal, - Path: GetDefaultStandaloneDiscoveryLocalPath(), - }, - } -} diff --git a/cli/core/pkg/config/edition.go b/cli/core/pkg/config/edition.go deleted file mode 100644 index 53e28fce49..0000000000 --- a/cli/core/pkg/config/edition.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func addEdition(c *configapi.ClientConfig, edition configapi.EditionSelector) { - if c.ClientOptions == nil { - c.ClientOptions = &configapi.ClientOptions{} - } - if c.ClientOptions.CLI == nil { - c.ClientOptions.CLI = &configapi.CLIOptions{} - } - c.ClientOptions.CLI.Edition = edition //nolint:staticcheck -} - -// addDefaultEditionIfMissing returns true if the default edition was added to the configuration (because there was no edition) -func addDefaultEditionIfMissing(config *configapi.ClientConfig) bool { - if config.ClientOptions == nil || config.ClientOptions.CLI == nil || config.ClientOptions.CLI.Edition == "" { //nolint:staticcheck - addEdition(config, DefaultEdition) - return true - } - return false -} diff --git a/cli/core/pkg/config/edition_test.go b/cli/core/pkg/config/edition_test.go deleted file mode 100644 index b589156462..0000000000 --- a/cli/core/pkg/config/edition_test.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - "github.com/stretchr/testify/require" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestConfigFeaturesDefaultEditionAdded(t *testing.T) { - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: DefaultRepositories, - UnstableVersionSelector: DefaultVersionSelector, - }, - }, - } - - added := addDefaultEditionIfMissing(cfg) - require.True(t, added, "addDefaultEditionIfMissing should have returned true (having added missing default edition value)") - errMsg := "addDefaultEditionIfMissing should have added default edition (" + configapi.EditionStandard + ") instead of " + cfg.ClientOptions.CLI.Edition //nolint:staticcheck - require.Equal(t, cfg.ClientOptions.CLI.Edition, configapi.EditionSelector(configapi.EditionStandard), errMsg) //nolint:staticcheck -} - -func TestConfigFeaturesDefaultEditionNotAdded(t *testing.T) { - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: DefaultRepositories, - UnstableVersionSelector: DefaultVersionSelector, - Edition: "tce", - }, - }, - } - - added := addDefaultEditionIfMissing(cfg) - require.False(t, added, "addDefaultEditionIfMissing should have returned false (without adding default edition value)") - errMsg := "addDefaultEditionIfMissing should have left existing edition value intact instead of replacing with [" + cfg.ClientOptions.CLI.Edition + "]" //nolint:staticcheck - require.Equal(t, cfg.ClientOptions.CLI.Edition, configapi.EditionSelector(configapi.EditionCommunity), errMsg) //nolint:staticcheck -} diff --git a/cli/core/pkg/config/featureflags.go b/cli/core/pkg/config/featureflags.go deleted file mode 100644 index 2c35305507..0000000000 --- a/cli/core/pkg/config/featureflags.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "strings" -) - -var ( - // IsContextAwareDiscoveryEnabled defines default to use when the user has not configured a value - // This variable is configured at the build time of the CLI - IsContextAwareDiscoveryEnabled = "" -) - -// This block is for global feature constants, to allow them to be used more broadly -const ( - // FeatureContextAwareCLIForPlugins determines whether to use legacy way of discovering plugins or - // to use the new context-aware Plugin API based plugin discovery mechanism - // Users can should not update this featureflag. This featureflag will be removed in the future version - // and the feature will be always enabled - FeatureContextAwareCLIForPlugins = "features.global.context-aware-cli-for-plugins" - // FeatureContextCommand determines whether to surface the context command. This is disabled by default. - FeatureContextCommand = "features.global.context-target-v2" -) - -// This block is used to set the default value for management-cluster and workload-cluster -const ( - // PackageBasedCC feature flag determines whether to use package based lifecycle management of management component - // or legacy way of managing management components. This is also used for clusterclass based management cluster provisioning - FeatureFlagPackageBasedCC = "features.management-cluster.package-based-cc" - // FeatureFlagAllowLegacyCluster is used to decide the workload cluster is clusterclass based or legayc based. - // By default, it's false. If it's true, then workload cluster is legacy based. - FeatureFlagAllowLegacyCluster = "features.cluster.allow-legacy-cluster" -) - -// DefaultCliFeatureFlags is used to populate an initially empty config file with default values for feature flags. -// The keys MUST be in the format "features.global." or initialization will fail -// -// If a developer expects that their feature will be ready to release, they should create an entry here with a true -// value. -// If a developer has a beta feature they want to expose, but leave turned off by default, they should create -// an entry here with a false value. WE HIGHLY RECOMMEND the use of a SEPARATE flag for beta use; one that ends in "-beta". -// Thus, if you plan to eventually release a feature with a flag named "features.global.foo-bar", you should consider -// releasing the beta version with "features.global.foo-bar-beta". This will make it much easier when it comes time for -// mainstreaming the feature (with a default true value) under the flag name "features.global.foo-bar", as there will be -// no conflict with previous installs (that have a false value for the entry "features.global.foo-bar-beta"). -var ( - DefaultCliFeatureFlags = map[string]bool{ - FeatureContextAwareCLIForPlugins: contextAwareDiscoveryEnabled(), - FeatureContextCommand: true, - FeatureFlagPackageBasedCC: true, - FeatureFlagAllowLegacyCluster: false, - } -) - -// contextAwareDiscoveryEnabled returns true if the IsContextAwareDiscoveryEnabled -// is set to true during build time -func contextAwareDiscoveryEnabled() bool { - return strings.EqualFold(IsContextAwareDiscoveryEnabled, "true") -} diff --git a/cli/core/pkg/config/features.go b/cli/core/pkg/config/features.go deleted file mode 100644 index 504f052672..0000000000 --- a/cli/core/pkg/config/features.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "strconv" - - "github.com/pkg/errors" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - configlib "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -// ConfigureDefaultFeatureFlagsIfMissing configures default feature-flags to ClientConfig if missing -func ConfigureDefaultFeatureFlagsIfMissing(defaultFeatureFlags map[string]bool) error { - // Acquire tanzu config lock - configlib.AcquireTanzuConfigLock() - defer configlib.ReleaseTanzuConfigLock() - - c, err := configlib.GetClientConfigNoLock() - if err != nil { - return errors.Wrap(err, "error while getting client config") - } - - configUpdated := AddDefaultFeatureFlagsIfMissing(c, defaultFeatureFlags) - if !configUpdated { - return nil - } - - err = configlib.StoreClientConfig(c) - if err != nil { - return errors.Wrap(err, "error while storing client config") - } - return nil -} - -func populateDefaultCliFeatureValues(c *configapi.ClientConfig, defaultCliFeatureFlags map[string]bool) error { - for featureName, flagValue := range defaultCliFeatureFlags { - plugin, flag, err := c.SplitFeaturePath(featureName) - if err != nil { - return err - } - addFeatureFlag(c, plugin, flag, flagValue) - } - return nil -} - -func addFeatureFlag(c *configapi.ClientConfig, plugin, flag string, flagValue bool) { - if c.ClientOptions == nil { - c.ClientOptions = &configapi.ClientOptions{} - } - if c.ClientOptions.Features == nil { - c.ClientOptions.Features = make(map[string]configapi.FeatureMap) - } - if c.ClientOptions.Features[plugin] == nil { - c.ClientOptions.Features[plugin] = make(map[string]string) - } - c.ClientOptions.Features[plugin][flag] = strconv.FormatBool(flagValue) -} - -// AddDefaultFeatureFlagsIfMissing augments the given configuration object with any default feature flags that do not already have a value -// and returns TRUE if any were added (so the config can be written out to disk, if the caller wants to) -func AddDefaultFeatureFlagsIfMissing(config *configapi.ClientConfig, defaultFeatureFlags map[string]bool) bool { - added := false - - for featurePath, activated := range defaultFeatureFlags { - plugin, feature, err := config.SplitFeaturePath(featurePath) - if err == nil && !containsFeatureFlag(config, plugin, feature) { - addFeatureFlag(config, plugin, feature, activated) - added = true - } - } - - return added -} - -// containsFeatureFlag returns true if the features section in the configuration object contains any value for the plugin.feature combination -func containsFeatureFlag(config *configapi.ClientConfig, plugin, feature string) bool { - return config.ClientOptions != nil && config.ClientOptions.Features != nil && config.ClientOptions.Features[plugin] != nil && - config.ClientOptions.Features[plugin][feature] != "" -} diff --git a/cli/core/pkg/config/features_test.go b/cli/core/pkg/config/features_test.go deleted file mode 100644 index 3e074417dc..0000000000 --- a/cli/core/pkg/config/features_test.go +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - "github.com/stretchr/testify/require" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestConfigFeatures(t *testing.T) { - const pluginName = "management-cluster" - const featureName = "foo" - const featurePath = "features." + pluginName + "." + featureName - cliFeatureFlags := configapi.FeatureMap{ - featureName: "true", - } - cliFeatureMap := make(map[string]configapi.FeatureMap) - cliFeatureMap[pluginName] = cliFeatureFlags - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: DefaultRepositories, - UnstableVersionSelector: DefaultVersionSelector, - }, - Features: cliFeatureMap, - }, - } - activated, err := cfg.IsConfigFeatureActivated(featurePath) - require.True(t, activated, "IsConfigFeatureActivated should report true for feature "+featurePath) - require.NoError(t, err) -} - -func TestConfigFeaturesDefault(t *testing.T) { - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: DefaultRepositories, - UnstableVersionSelector: DefaultVersionSelector, - }, - }, - } - const featureFoo = "features.management-cluster.foo" - activated, err := cfg.IsConfigFeatureActivated(featureFoo) - require.False(t, activated, "feature reported true before defaults are set") - require.NoError(t, err) - - cliFeatureFlags := map[string]bool{ - featureFoo: true, - } - err = populateDefaultCliFeatureValues(cfg, cliFeatureFlags) - - require.NoError(t, err) - activated, err = cfg.IsConfigFeatureActivated(featureFoo) - require.True(t, activated, "feature "+featureFoo+" should report true after defaults are set") - require.NoError(t, err) - - const featureBar = "features.management-cluster.bar" - activated, err = cfg.IsConfigFeatureActivated(featureBar) - require.False(t, activated, "feature "+featureBar+" should report false after defaults are set") - require.NoError(t, err) -} - -func TestConfigFeaturesDefaultInvalid(t *testing.T) { - const featureFoo = "invalid.foo" - cliFeatureFlags := map[string]bool{ - featureFoo: true, - } - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: DefaultRepositories, - UnstableVersionSelector: DefaultVersionSelector, - }, - }, - } - err := populateDefaultCliFeatureValues(cfg, cliFeatureFlags) - require.Error(t, err, "invalid default feature should generate error") -} - -func TestConfigFeaturesInvalidName(t *testing.T) { - const featureFoo = "invalid.foo" - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: DefaultRepositories, - UnstableVersionSelector: DefaultVersionSelector, - }, - }, - } - result, err := cfg.IsConfigFeatureActivated(featureFoo) - require.False(t, result, "invalid feature name '"+featureFoo+"' should generate false return value") - require.Error(t, err, "invalid feature name '"+featureFoo+"' should generate error") -} - -func TestConfigFeaturesInvalidValue(t *testing.T) { - const featureFoo = "features.management-cluster.foo" - cliFeatureFlags := configapi.FeatureMap{ - "foo": "INVALID", - } - cliFeatureMap := make(map[string]configapi.FeatureMap) - cliFeatureMap["management-cluster"] = cliFeatureFlags - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: DefaultRepositories, - UnstableVersionSelector: DefaultVersionSelector, - }, - Features: cliFeatureMap, - }, - } - activated, err := cfg.IsConfigFeatureActivated(featureFoo) - require.False(t, activated, "IsConfigFeatureActivated should report false given invalid value") - require.Error(t, err, "IsConfigFeatureActivated should return error given invalid value") -} - -func TestConfigFeaturesSplitName(t *testing.T) { - const featureValid = "features.valid-plugin.foo" - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: DefaultRepositories, - UnstableVersionSelector: DefaultVersionSelector, - }, - }, - } - pluginName, featureName, err := cfg.SplitFeaturePath(featureValid) - require.Equal(t, pluginName, "valid-plugin", "failed to parse '"+featureValid+"' correctly") - require.Equal(t, featureName, "foo", "failed to parse '"+featureValid+"' correctly") - require.NoError(t, err, "valid feature name '"+featureValid+"' should not generate error") -} - -func TestConfigFeaturesSplitNameInvalid(t *testing.T) { - const featureInvalid = "invalid.foo" - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: DefaultRepositories, - UnstableVersionSelector: DefaultVersionSelector, - }, - }, - } - _, _, err := cfg.SplitFeaturePath(featureInvalid) - require.Error(t, err, "invalid feature name '"+featureInvalid+"' should generate error") -} - -func TestConfigFeaturesDefaultsAdded(t *testing.T) { - defaultFeatureFlags := map[string]bool{ - "features.global.truthy": true, - "features.global.falsey": false, - "features.existing.truthy": true, - "features.existing.falsey": false, - } - // NOTE: the existing values are OPPOSITE of the default and should stay that way: - cliFeatureFlags := configapi.FeatureMap{ - "truthy": "false", - "falsey": "true", - } - cliFeatureMap := make(map[string]configapi.FeatureMap) - cliFeatureMap["existing"] = cliFeatureFlags - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: DefaultRepositories, - UnstableVersionSelector: DefaultVersionSelector, - }, - Features: cliFeatureMap, - }, - } - - added := AddDefaultFeatureFlagsIfMissing(cfg, defaultFeatureFlags) - require.True(t, added, "AddDefaultFeatureFlagsIfMissing should have added missing default values") - require.Equal(t, cfg.ClientOptions.Features["existing"]["truthy"], "false", "AddDefaultFeatureFlagsIfMissing should have left existing FALSE value for truthy") - require.Equal(t, cfg.ClientOptions.Features["existing"]["falsey"], "true", "AddDefaultFeatureFlagsIfMissing should have left existing TRUE value for falsey") - require.Equal(t, cfg.ClientOptions.Features["global"]["truthy"], "true", "AddDefaultFeatureFlagsIfMissing should have added global TRUE value for truthy") - require.Equal(t, cfg.ClientOptions.Features["global"]["falsey"], "false", "AddDefaultFeatureFlagsIfMissing should have added global FALSE value for falsey") -} - -func TestConfigFeaturesDefaultsNoneAdded(t *testing.T) { - defaultFeatureFlags := map[string]bool{ - "features.existing.truthy": true, - "features.existing.falsey": false, - } - // NOTE: the existing values are OPPOSITE of the default and should stay that way: - cliFeatureFlags := configapi.FeatureMap{ - "truthy": "false", - "falsey": "true", - } - cliFeatureMap := make(map[string]configapi.FeatureMap) - cliFeatureMap["existing"] = cliFeatureFlags - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: DefaultRepositories, - UnstableVersionSelector: DefaultVersionSelector, - }, - Features: cliFeatureMap, - }, - } - - added := AddDefaultFeatureFlagsIfMissing(cfg, defaultFeatureFlags) - require.False(t, added, "AddDefaultFeatureFlagsIfMissing should NOT have added any default values") - require.Equal(t, cfg.ClientOptions.Features["existing"]["truthy"], "false", "AddDefaultFeatureFlagsIfMissing should have left existing FALSE value for truthy") - require.Equal(t, cfg.ClientOptions.Features["existing"]["falsey"], "true", "AddDefaultFeatureFlagsIfMissing should have left existing TRUE value for falsey") -} diff --git a/cli/core/pkg/config/init.go b/cli/core/pkg/config/init.go deleted file mode 100644 index 5b3c4041fb..0000000000 --- a/cli/core/pkg/config/init.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package config contains useful functionality for config updates -package config - -import ( - "github.com/aunum/log" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -func init() { - // Acquire tanzu config lock - config.AcquireTanzuConfigLock() - defer config.ReleaseTanzuConfigLock() - - c, err := config.GetClientConfigNoLock() - if err != nil { - log.Warningf("unable to get client config: %v", err) - } - - addedDefaultDiscovery := populateDefaultStandaloneDiscovery(c) - addedFeatureFlags := AddDefaultFeatureFlagsIfMissing(c, DefaultCliFeatureFlags) - addedEdition := addDefaultEditionIfMissing(c) - addedBomRepo := AddBomRepoIfMissing(c) - addedCompatabilityFile := AddCompatibilityFileIfMissing(c) - // contexts could be lost when older plugins edit the config, so populate them from servers - addedContexts := config.PopulateContexts(c) - - if addedFeatureFlags || addedDefaultDiscovery || addedEdition || addedCompatabilityFile || addedBomRepo || addedContexts { - _ = config.StoreClientConfig(c) - } -} diff --git a/cli/core/pkg/config/metadata.go b/cli/core/pkg/config/metadata.go deleted file mode 100644 index 9698e6ea52..0000000000 --- a/cli/core/pkg/config/metadata.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -const ( - // NameHeader used by every client making an API call - NameHeader = "x-client-name" - - // VersionHeader is the client version header. - VersionHeader = "x-client-version" -) diff --git a/cli/core/pkg/configpaths/filepaths.go b/cli/core/pkg/configpaths/filepaths.go deleted file mode 100644 index 34ce697dd0..0000000000 --- a/cli/core/pkg/configpaths/filepaths.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package configpaths provides functions to handle config files -package configpaths - -import ( - "os" - "path" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/constants" -) - -// GetRegistryCertFile returns the registry cert file path -func GetRegistryCertFile() (string, error) { - home, err := os.UserHomeDir() - if err != nil { - return "", errors.Wrap(err, "could not locate user home dir") - } - return path.Join(home, constants.TKGRegistryCertFile), nil -} - -// GetRegistryTrustedCACertFileForWindows returns the registry trusted root ca cert filepath for windows -func GetRegistryTrustedCACertFileForWindows() (string, error) { - home, err := os.UserHomeDir() - if err != nil { - return "", errors.Wrap(err, "could not locate user home dir") - } - return path.Join(home, constants.TKGRegistryTrustedRootCAFileForWindows), nil -} diff --git a/cli/core/pkg/constants/config_variables.go b/cli/core/pkg/constants/config_variables.go deleted file mode 100644 index 37fbc0d9df..0000000000 --- a/cli/core/pkg/constants/config_variables.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package constants provides tanzu cli constants. -package constants - -// Configuration variable name constants -const ( - TKGProxyCACert = "TKG_PROXY_CA_CERT" - ConfigVariableCustomImageRepository = "TKG_CUSTOM_IMAGE_REPOSITORY" - ConfigVariableCustomImageRepositoryCaCertificate = "TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE" - ConfigVariableCustomImageRepositorySkipTLSVerify = "TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY" - ConfigVariableDefaultStandaloneDiscoveryImagePath = "TKG_DEFAULT_STANDALONE_DISCOVERY_IMAGE_PATH" - ConfigVariableDefaultStandaloneDiscoveryImageTag = "TKG_DEFAULT_STANDALONE_DISCOVERY_IMAGE_TAG" - ConfigVariableDefaultStandaloneDiscoveryType = "TKG_DEFAULT_STANDALONE_DISCOVERY_TYPE" - ConfigVariableDefaultStandaloneDiscoveryLocalPath = "TKG_DEFAULT_STANDALONE_DISCOVERY_LOCAL_PATH" -) diff --git a/cli/core/pkg/constants/defaults.go b/cli/core/pkg/constants/defaults.go deleted file mode 100644 index 4c81f8cc10..0000000000 --- a/cli/core/pkg/constants/defaults.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -const ( - // TanzuCLISystemNamespace is the namespace for tanzu cli resources - TanzuCLISystemNamespace = "tanzu-cli-system" - - // CLIPluginImageRepositoryOverrideLabel is the label on the configmap which specifies CLIPlugin image repository override - CLIPluginImageRepositoryOverrideLabel = "cli.tanzu.vmware.com/cliplugin-image-repository-override" - - // DefaultQPS is the default maximum query per second for the rest config - DefaultQPS = 200 - - // DefaultBurst is the default maximum burst for throttle for the rest config - DefaultBurst = 200 -) diff --git a/cli/core/pkg/constants/env_variables.go b/cli/core/pkg/constants/env_variables.go deleted file mode 100644 index 38ebb5afea..0000000000 --- a/cli/core/pkg/constants/env_variables.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -// environment variables for http proxy -const ( - NoProxy = "NO_PROXY" - HTTPProxy = "HTTP_PROXY" - HTTPSProxy = "HTTPS_PROXY" - ProxyCACert = "PROXY_CA_CERT" -) - -const ( - AllowedRegistries = "ALLOWED_REGISTRY" -) diff --git a/cli/core/pkg/constants/files.go b/cli/core/pkg/constants/files.go deleted file mode 100644 index 6eeabf9f61..0000000000 --- a/cli/core/pkg/constants/files.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -// ConfigFilePermissions defines the permissions of the config file -const ( - ConfigFilePermissions = 0o600 - DefaultDirectoryPermissions = 0o700 -) - -// File name related constants -const ( - TKGRegistryCertFile = "registry_certs" - TKGRegistryTrustedRootCAFileForWindows = ".registry_trusted_root_certs_win" -) diff --git a/cli/core/pkg/discovery/gcp.go b/cli/core/pkg/discovery/gcp.go deleted file mode 100644 index 313732d289..0000000000 --- a/cli/core/pkg/discovery/gcp.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" -) - -// GCPDiscovery is an artifact discovery endpoint utilizing a GCP bucket. -type GCPDiscovery struct { - bucketName string - manifestPath string - name string -} - -// NewGCPDiscovery returns a new GCP bucket repository. -func NewGCPDiscovery(bucket, manifestPath, name string) Discovery { - return &GCPDiscovery{ - bucketName: bucket, - manifestPath: manifestPath, - name: name, - } -} - -// List available plugins. -func (g *GCPDiscovery) List() (plugins []plugin.Discovered, err error) { - // TODO: implement GCP discovery plugin list - return -} - -// Describe a plugin. -func (g *GCPDiscovery) Describe(name string) (p plugin.Discovered, err error) { - // TODO: implement GCP discovery plugin describe - return p, err -} - -// Name of the repository. -func (g *GCPDiscovery) Name() string { - return g.name -} - -// Type of the discovery. -func (g *GCPDiscovery) Type() string { - return common.DiscoveryTypeGCP -} diff --git a/cli/core/pkg/discovery/gcp_test.go b/cli/core/pkg/discovery/gcp_test.go deleted file mode 100644 index 75c8ecaffb..0000000000 --- a/cli/core/pkg/discovery/gcp_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("Unit tests for gcp", func() { - discover := &GCPDiscovery{ - bucketName: "foo", - manifestPath: "bar", - name: "gcp-name", - } - It("test getting gcp name", func() { - name := discover.Name() - Expect(name).To(Equal(discover.name)) - }) - - It("test getting gcp type", func() { - name := discover.Type() - Expect(name).To(Equal("gcp")) - }) -}) diff --git a/cli/core/pkg/discovery/interface.go b/cli/core/pkg/discovery/interface.go deleted file mode 100644 index bd5c51722b..0000000000 --- a/cli/core/pkg/discovery/interface.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package discovery is implements discovery interface for plugin discovery -// Discovery is the interface to fetch the list of available plugins, their -// supported versions and how to download them either stand-alone or scoped to a server. -// A separate interface for discovery helps to decouple discovery (which is usually -// tied to a server or user identity) from distribution (which can be shared). -package discovery - -import ( - "errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -// Discovery is the interface to fetch the list of available plugins -type Discovery interface { - // Name of the repository. - Name() string - - // List available plugins. - List() ([]plugin.Discovered, error) - - // Describe a plugin. - Describe(name string) (plugin.Discovered, error) - - // Type returns type of discovery. - Type() string -} - -// CreateDiscoveryFromV1alpha1 creates discovery interface from v1alpha1 API -func CreateDiscoveryFromV1alpha1(pd configapi.PluginDiscovery) (Discovery, error) { - switch { - case pd.GCP != nil: - return NewGCPDiscovery(pd.GCP.Bucket, pd.GCP.ManifestPath, pd.GCP.Name), nil - case pd.OCI != nil: - return NewOCIDiscovery(pd.OCI.Name, pd.OCI.Image), nil - case pd.Local != nil: - return NewLocalDiscovery(pd.Local.Name, pd.Local.Path), nil - case pd.Kubernetes != nil: - return NewKubernetesDiscovery(pd.Kubernetes.Name, pd.Kubernetes.Path, pd.Kubernetes.Context), nil - case pd.REST != nil: - return NewRESTDiscovery(pd.REST.Name, pd.REST.Endpoint, pd.REST.BasePath), nil - } - return nil, errors.New("unknown plugin discovery source") -} diff --git a/cli/core/pkg/discovery/interface_test.go b/cli/core/pkg/discovery/interface_test.go deleted file mode 100644 index 0f0ddc4069..0000000000 --- a/cli/core/pkg/discovery/interface_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func Test_CreateDiscoveryFromV1alpha1(t *testing.T) { - assert := assert.New(t) - - // When no discovery type is provided, it should throw error - pd := configapi.PluginDiscovery{} - _, err := CreateDiscoveryFromV1alpha1(pd) - assert.NotNil(err) - assert.Contains(err.Error(), "unknown plugin discovery source") - - // When OCI discovery is provided - pd = configapi.PluginDiscovery{ - OCI: &configapi.OCIDiscovery{Name: "fake-oci", Image: "fake.repo.com/test:v1.0.0"}, - } - discovery, err := CreateDiscoveryFromV1alpha1(pd) - assert.Nil(err) - assert.Equal(common.DiscoveryTypeOCI, discovery.Type()) - assert.Equal("fake-oci", discovery.Name()) - - // When Local discovery is provided - pd = configapi.PluginDiscovery{ - Local: &configapi.LocalDiscovery{Name: "fake-local", Path: "test/path"}, - } - discovery, err = CreateDiscoveryFromV1alpha1(pd) - assert.Nil(err) - assert.Equal(common.DiscoveryTypeLocal, discovery.Type()) - assert.Equal("fake-local", discovery.Name()) - - // When GCP discovery is provided - pd = configapi.PluginDiscovery{ - GCP: &configapi.GCPDiscovery{Name: "fake-gcp"}, - } - discovery, err = CreateDiscoveryFromV1alpha1(pd) - assert.Nil(err) - assert.Equal(common.DiscoveryTypeGCP, discovery.Type()) - assert.Equal("fake-gcp", discovery.Name()) - - // When K8s discovery is provided - pd = configapi.PluginDiscovery{ - Kubernetes: &configapi.KubernetesDiscovery{Name: "fake-k8s"}, - } - discovery, err = CreateDiscoveryFromV1alpha1(pd) - assert.Nil(err) - assert.Equal(common.DiscoveryTypeKubernetes, discovery.Type()) - assert.Equal("fake-k8s", discovery.Name()) - - // When REST discovery is provided - pd = configapi.PluginDiscovery{ - REST: &configapi.GenericRESTDiscovery{Name: "fake-rest"}, - } - discovery, err = CreateDiscoveryFromV1alpha1(pd) - assert.Nil(err) - assert.Equal(common.DiscoveryTypeREST, discovery.Type()) - assert.Equal("fake-rest", discovery.Name()) -} diff --git a/cli/core/pkg/discovery/kubernetes.go b/cli/core/pkg/discovery/kubernetes.go deleted file mode 100644 index 689f337f9b..0000000000 --- a/cli/core/pkg/discovery/kubernetes.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - "strings" - - "github.com/aunum/log" - "github.com/pkg/errors" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cluster" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/distribution" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" -) - -// KubernetesDiscovery is an artifact discovery utilizing CLIPlugin API in kubernetes cluster -type KubernetesDiscovery struct { - name string - kubeconfigPath string - kubecontext string -} - -// NewKubernetesDiscovery returns a new kubernetes repository -func NewKubernetesDiscovery(name, kubeconfigPath, kubecontext string) Discovery { - return &KubernetesDiscovery{ - name: name, - kubeconfigPath: kubeconfigPath, - kubecontext: kubecontext, - } -} - -// List available plugins. -func (k *KubernetesDiscovery) List() ([]plugin.Discovered, error) { - return k.Manifest() -} - -// Describe a plugin. -func (k *KubernetesDiscovery) Describe(name string) (p plugin.Discovered, err error) { - plugins, err := k.Manifest() - if err != nil { - return - } - - for i := range plugins { - if plugins[i].Name == name { - p = plugins[i] - return - } - } - err = errors.Errorf("cannot find plugin with name '%v'", name) - return -} - -// Name of the repository. -func (k *KubernetesDiscovery) Name() string { - return k.name -} - -// Manifest returns the manifest for a kubernetes repository. -func (k *KubernetesDiscovery) Manifest() ([]plugin.Discovered, error) { - // Create cluster client - clusterClient, err := cluster.NewClient(k.kubeconfigPath, k.kubecontext, cluster.Options{}) - if err != nil { - return nil, err - } - - return k.GetDiscoveredPlugins(clusterClient) -} - -// GetDiscoveredPlugins returns the list of discovered plugin from a kubernetes cluster -func (k *KubernetesDiscovery) GetDiscoveredPlugins(clusterClient cluster.Client) ([]plugin.Discovered, error) { - plugins := make([]plugin.Discovered, 0) - - exists, err := clusterClient.VerifyCLIPluginCRD() - if !exists || err != nil { - logMsg := "Skipping context-aware plugin discovery because CLIPlugin CRD not present on the logged in cluster. " - if err != nil { - logMsg += err.Error() - } - log.Debug(logMsg) - return nil, nil - } - - // get all cliplugins resources available on the cluster - cliplugins, err := clusterClient.ListCLIPluginResources() - if err != nil { - return nil, err - } - - imageRepositoryOverride, err := clusterClient.GetCLIPluginImageRepositoryOverride() - if err != nil { - log.Debugf("unable to get image repository override information for some of the plugins. Error: %v", err) - } - - // Convert all CLIPlugin resources to Discovered object - for i := range cliplugins { - dp, err := DiscoveredFromK8sV1alpha1WithImageRepositoryOverride(&cliplugins[i], imageRepositoryOverride) - if err != nil { - return nil, err - } - dp.Source = k.name - dp.DiscoveryType = k.Type() - - plugins = append(plugins, dp) - } - - return plugins, nil -} - -// Type of the repository. -func (k *KubernetesDiscovery) Type() string { - return common.DiscoveryTypeKubernetes -} - -// DiscoveredFromK8sV1alpha1WithImageRepositoryOverride returns discovered plugin object from k8sV1alpha1 -func DiscoveredFromK8sV1alpha1WithImageRepositoryOverride(p *cliv1alpha1.CLIPlugin, imageRepoOverride map[string]string) (plugin.Discovered, error) { - // Update artifacts based on image repository override if applicable - UpdateArtifactsBasedOnImageRepositoryOverride(p, imageRepoOverride) - - dp := plugin.Discovered{ - Name: p.Name, - Description: p.Spec.Description, - RecommendedVersion: p.Spec.RecommendedVersion, - Optional: p.Spec.Optional, - Target: cliv1alpha1.StringToTarget(string(p.Spec.Target)), - } - dp.SupportedVersions = make([]string, 0) - for v := range p.Spec.Artifacts { - dp.SupportedVersions = append(dp.SupportedVersions, v) - } - if err := SortVersions(dp.SupportedVersions); err != nil { - return dp, errors.Wrapf(err, "error parsing supported versions for plugin %s", p.Name) - } - - dp.Distribution = distribution.ArtifactsFromK8sV1alpha1(p.Spec.Artifacts) - return dp, nil -} - -// UpdateArtifactsBasedOnImageRepositoryOverride updates artifacts based on image repository override -func UpdateArtifactsBasedOnImageRepositoryOverride(p *cliv1alpha1.CLIPlugin, imageRepoOverride map[string]string) { - replaceImageRepository := func(a *cliv1alpha1.Artifact) { - if a.Image != "" { - for originalRepo, overrideRepo := range imageRepoOverride { - if strings.HasPrefix(a.Image, originalRepo) { - a.Image = strings.Replace(a.Image, originalRepo, overrideRepo, 1) - } - } - } - } - for i := range p.Spec.Artifacts { - for j := range p.Spec.Artifacts[i] { - replaceImageRepository(&p.Spec.Artifacts[i][j]) - } - } -} diff --git a/cli/core/pkg/discovery/kubernetes_test.go b/cli/core/pkg/discovery/kubernetes_test.go deleted file mode 100644 index 56efd24da0..0000000000 --- a/cli/core/pkg/discovery/kubernetes_test.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery_test - -import ( - "errors" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/discovery" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/fakes" - fakehelper "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/fakes/helper" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" -) - -func TestClient(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Discovery Suite") -} - -var _ = Describe("Unit tests for kubernetes discovery", func() { - var ( - err error - currentClusterClient *fakes.ClusterClient - kd *discovery.KubernetesDiscovery - plugins []plugin.Discovered - cliplugins []v1alpha1.CLIPlugin - ) - - Describe("When Getting Discovered plugins from k8s cluster", func() { - BeforeEach(func() { - currentClusterClient = &fakes.ClusterClient{} - kd = &discovery.KubernetesDiscovery{} - }) - - JustBeforeEach(func() { - plugins, err = kd.GetDiscoveredPlugins(currentClusterClient) - }) - - Context("When CLIPlugin CRD verification throws error", func() { - BeforeEach(func() { - currentClusterClient.VerifyCLIPluginCRDReturns(false, errors.New("fake error")) - }) - It("should return empty plugin list without an error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(plugins)).To(Equal(0)) - }) - }) - Context("When CLIPlugin CRD verification returns false and no error", func() { - BeforeEach(func() { - currentClusterClient.VerifyCLIPluginCRDReturns(false, nil) - }) - It("should return empty plugin list without an error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(plugins)).To(Equal(0)) - }) - }) - Context("When CLIPlugin CRD verification returns true with error", func() { - BeforeEach(func() { - currentClusterClient.VerifyCLIPluginCRDReturns(true, errors.New("fake error")) - }) - It("should return empty plugin list without an error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(plugins)).To(Equal(0)) - }) - }) - - Context("When ListCLIPluginResources returns error", func() { - BeforeEach(func() { - currentClusterClient.VerifyCLIPluginCRDReturns(true, nil) - currentClusterClient.ListCLIPluginResourcesReturns(nil, errors.New("fake error")) - }) - It("should return empty plugin list with an error", func() { - Expect(err).To(HaveOccurred()) - Expect(len(plugins)).To(Equal(0)) - }) - }) - Context("When ListCLIPluginResources list of CLIPlugin resources", func() { - BeforeEach(func() { - cliplugin1 := fakehelper.NewCLIPlugin(fakehelper.TestCLIPluginOption{Name: "plugin1", Description: "plugin1 desc", RecommendedVersion: "v0.0.1"}) - cliplugin2 := fakehelper.NewCLIPlugin(fakehelper.TestCLIPluginOption{Name: "plugin2", Description: "plugin2 desc", RecommendedVersion: "v0.0.2"}) - cliplugins = []v1alpha1.CLIPlugin{} - cliplugins = append(cliplugins, cliplugin1, cliplugin2) - currentClusterClient.VerifyCLIPluginCRDReturns(true, nil) - currentClusterClient.ListCLIPluginResourcesReturns(cliplugins, nil) - currentClusterClient.GetCLIPluginImageRepositoryOverrideReturns(map[string]string{}, nil) - }) - It("should return ordered list of plugins without error", func() { - Expect(len(plugins)).To(Equal(2)) - Expect(plugins[0].Name).To(Equal("plugin1")) - Expect(plugins[0].RecommendedVersion).To(Equal("v0.0.1")) - Expect(plugins[1].Name).To(Equal("plugin2")) - Expect(plugins[1].RecommendedVersion).To(Equal("v0.0.2")) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("When ListCLIPluginResources list of CLIPlugin resources but GetCLIPluginImageRepositoryOverrideReturns return error", func() { - BeforeEach(func() { - cliplugin1 := fakehelper.NewCLIPlugin(fakehelper.TestCLIPluginOption{Name: "plugin1", Description: "plugin1 desc", RecommendedVersion: "v0.0.1"}) - cliplugin2 := fakehelper.NewCLIPlugin(fakehelper.TestCLIPluginOption{Name: "plugin2", Description: "plugin2 desc", RecommendedVersion: "v0.0.2"}) - cliplugins = []v1alpha1.CLIPlugin{} - cliplugins = append(cliplugins, cliplugin1, cliplugin2) - currentClusterClient.VerifyCLIPluginCRDReturns(true, nil) - currentClusterClient.ListCLIPluginResourcesReturns(cliplugins, nil) - currentClusterClient.GetCLIPluginImageRepositoryOverrideReturns(map[string]string{}, errors.New("fake-error-image-repo-override")) - }) - It("should return ordered list of plugins without error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(plugins[0].Name).To(Equal("plugin1")) - Expect(plugins[0].RecommendedVersion).To(Equal("v0.0.1")) - Expect(plugins[1].Name).To(Equal("plugin2")) - Expect(plugins[1].RecommendedVersion).To(Equal("v0.0.2")) - artifact, errArtifact := plugins[0].Distribution.DescribeArtifact("v1.0.0", "darwin", "amd64") - Expect(errArtifact).NotTo(HaveOccurred()) - Expect(artifact.Image).To(Equal("fake.image.repo.com/tkg/plugin/test-darwin-plugin:v1.4.0")) - }) - }) - - Context("When ListCLIPluginResources list of CLIPlugin resources and GetCLIPluginImageRepositoryOverrideReturns imageRepoOverride map ", func() { - BeforeEach(func() { - cliplugin1 := fakehelper.NewCLIPlugin(fakehelper.TestCLIPluginOption{Name: "plugin1", Description: "plugin1 desc", RecommendedVersion: "v0.0.1"}) - cliplugin2 := fakehelper.NewCLIPlugin(fakehelper.TestCLIPluginOption{Name: "plugin2", Description: "plugin2 desc", RecommendedVersion: "v0.0.2"}) - cliplugins = []v1alpha1.CLIPlugin{} - cliplugins = append(cliplugins, cliplugin1, cliplugin2) - imageOverrideMap := map[string]string{ - "fake.image.repo.com": "custom.repo.com", - } - currentClusterClient.VerifyCLIPluginCRDReturns(true, nil) - currentClusterClient.ListCLIPluginResourcesReturns(cliplugins, nil) - currentClusterClient.GetCLIPluginImageRepositoryOverrideReturns(imageOverrideMap, nil) - }) - It("should return ordered list of plugins and image override should be done in the artifact", func() { - Expect(len(plugins)).To(Equal(2)) - Expect(plugins[0].Name).To(Equal("plugin1")) - Expect(plugins[0].RecommendedVersion).To(Equal("v0.0.1")) - Expect(plugins[1].Name).To(Equal("plugin2")) - Expect(plugins[1].RecommendedVersion).To(Equal("v0.0.2")) - Expect(err).NotTo(HaveOccurred()) - artifact, errArtifact := plugins[0].Distribution.DescribeArtifact("v1.0.0", "darwin", "amd64") - Expect(errArtifact).NotTo(HaveOccurred()) - Expect(artifact.Image).To(Equal("custom.repo.com/tkg/plugin/test-darwin-plugin:v1.4.0")) - artifact, errArtifact = plugins[0].Distribution.DescribeArtifact("v1.0.0", "windows", "amd64") - Expect(errArtifact).NotTo(HaveOccurred()) - Expect(artifact.Image).To(Equal("custom.repo.com/tkg/plugin/test-windows-plugin:v1.4.0")) - artifact, errArtifact = plugins[0].Distribution.DescribeArtifact("v1.0.0", "linux", "amd64") - Expect(errArtifact).NotTo(HaveOccurred()) - Expect(artifact.Image).To(Equal("custom.repo.com/tkg/plugin/test-linux-plugin:v1.4.0")) - }) - }) - }) -}) diff --git a/cli/core/pkg/discovery/local.go b/cli/core/pkg/discovery/local.go deleted file mode 100644 index 76381da715..0000000000 --- a/cli/core/pkg/discovery/local.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - "os" - "path/filepath" - - "github.com/pkg/errors" - apimachineryjson "k8s.io/apimachinery/pkg/runtime/serializer/json" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/distribution" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" -) - -// LocalDiscovery is an artifact discovery endpoint utilizing a local host os. -type LocalDiscovery struct { - path string - name string -} - -// NewLocalDiscovery returns a new local repository. -// If provided localPath is not an absolute path -// search under `xdg.ConfigHome/tanzu-plugin/discovery` directory -func NewLocalDiscovery(name, localPath string) Discovery { - if !filepath.IsAbs(localPath) { - localPath = filepath.Join(common.DefaultLocalPluginDistroDir, "discovery", localPath) - } - return &LocalDiscovery{ - path: localPath, - name: name, - } -} - -// List available plugins. -func (l *LocalDiscovery) List() ([]plugin.Discovered, error) { - return l.Manifest() -} - -// Describe a plugin. -func (l *LocalDiscovery) Describe(name string) (p plugin.Discovered, err error) { - plugins, err := l.Manifest() - if err != nil { - return - } - - for i := range plugins { - if plugins[i].Name == name { - p = plugins[i] - return - } - } - err = errors.Errorf("cannot find plugin with name '%v'", name) - return -} - -// Name of the repository. -func (l *LocalDiscovery) Name() string { - return l.name -} - -// Manifest returns the manifest for a local repository. -func (l *LocalDiscovery) Manifest() ([]plugin.Discovered, error) { - plugins := make([]plugin.Discovered, 0) - - items, err := os.ReadDir(l.path) - if err != nil { - return nil, errors.Wrapf(err, "error while reading local plugin manifest directory") - } - for _, item := range items { - if item.IsDir() { - continue - } - path := filepath.Join(l.path, item.Name()) - - // ignore non yaml files - if filepath.Ext(path) != ".yaml" && filepath.Ext(path) != ".yml" { - continue - } - - b, err := os.ReadFile(path) - if err != nil { - return nil, errors.Wrapf(err, "error while reading manifest file") - } - - scheme, err := cliv1alpha1.SchemeBuilder.Build() - if err != nil { - return nil, errors.Wrap(err, "failed to create scheme") - } - s := apimachineryjson.NewSerializerWithOptions(apimachineryjson.DefaultMetaFactory, scheme, scheme, - apimachineryjson.SerializerOptions{Yaml: true, Pretty: false, Strict: false}) - var p cliv1alpha1.CLIPlugin - _, _, err = s.Decode(b, nil, &p) - if err != nil { - return nil, errors.Wrap(err, "could not decode catalog file") - } - - dp, err := DiscoveredFromK8sV1alpha1(&p) - if err != nil { - return nil, err - } - if dp.Name == "" { - continue - } - dp.Source = l.name - dp.DiscoveryType = l.Type() - plugins = append(plugins, dp) - } - return plugins, nil -} - -// Type of the repository. -func (l *LocalDiscovery) Type() string { - return common.DiscoveryTypeLocal -} - -// DiscoveredFromK8sV1alpha1 returns discovered plugin object from k8sV1alpha1 -func DiscoveredFromK8sV1alpha1(p *cliv1alpha1.CLIPlugin) (plugin.Discovered, error) { - dp := plugin.Discovered{ - Name: p.Name, - Description: p.Spec.Description, - RecommendedVersion: p.Spec.RecommendedVersion, - Optional: p.Spec.Optional, - Target: cliv1alpha1.StringToTarget(string(p.Spec.Target)), - } - dp.SupportedVersions = make([]string, 0) - for v := range p.Spec.Artifacts { - dp.SupportedVersions = append(dp.SupportedVersions, v) - } - if err := SortVersions(dp.SupportedVersions); err != nil { - return dp, errors.Wrapf(err, "error parsing supported versions for plugin %s", p.Name) - } - dp.Distribution = distribution.ArtifactsFromK8sV1alpha1(p.Spec.Artifacts) - return dp, nil -} diff --git a/cli/core/pkg/discovery/local_test.go b/cli/core/pkg/discovery/local_test.go deleted file mode 100644 index 79f748de00..0000000000 --- a/cli/core/pkg/discovery/local_test.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -const ( - pluginPath = "/tmp/test-discovery-plugin" -) - -var _ = Describe("Unit tests for local discovery", func() { - discovery := &LocalDiscovery{ - path: pluginPath, - name: "local", - } - - It("test get local discovery name", func() { - name := discovery.Name() - Expect(name).To(Equal(discovery.name)) - }) - - It("test get local discovery type", func() { - localType := discovery.Type() - Expect(localType).To(Equal("local")) - }) - - It("test manifest deserialization", func() { - createTestLocalPluginFile() - expectedPlugin := &Plugin{ - Name: "test-plugin", - Description: "test-plugin", - RecommendedVersion: "1.0.0", - Optional: true, - } - plugins, err := discovery.Manifest() - Expect(err).ToNot(HaveOccurred()) - - deleteLocalPluginFile() - Expect(plugins).ToNot(BeNil()) - Expect(len(plugins)).ToNot(Equal(0)) - Expect(plugins[0].Name).To(Equal(expectedPlugin.Name)) - Expect(plugins[0].Description).To(Equal(expectedPlugin.Description)) - Expect(plugins[0].RecommendedVersion).To(Equal(expectedPlugin.RecommendedVersion)) - Expect(plugins[0].Optional).To(Equal(expectedPlugin.Optional)) - }) -}) - -func createTestLocalPluginFile() { - contents := ` -inline: -metadata: - name: test-plugin -spec: - description: test-plugin - recommendedVersion: 1.0.0 - optional: true` - _, err := os.Stat(pluginPath) - if err != nil && os.IsNotExist(err) { - err := os.Mkdir(pluginPath, 0777) - Expect(err).ToNot(HaveOccurred()) - } - - err = os.WriteFile(pluginPath+"/test-plugin.yaml", []byte(contents), 0600) - Expect(err).ToNot(HaveOccurred()) -} - -func deleteLocalPluginFile() { - err := os.Remove(pluginPath + "/test-plugin.yaml") - Expect(err).ToNot(HaveOccurred()) - err = os.Remove(pluginPath) - Expect(err).ToNot(HaveOccurred()) -} diff --git a/cli/core/pkg/discovery/oci.go b/cli/core/pkg/discovery/oci.go deleted file mode 100644 index 9e60376e1a..0000000000 --- a/cli/core/pkg/discovery/oci.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - "strings" - - "github.com/pkg/errors" - apimachineryjson "k8s.io/apimachinery/pkg/runtime/serializer/json" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/carvelhelpers" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" -) - -// OCIDiscovery is an artifact discovery endpoint utilizing OCI image -type OCIDiscovery struct { - // name is a name of the discovery - name string - // image is an OCI compliant image. Which include DNS-compatible registry name, - // a valid URI path(MAY contain zero or more ‘/’) and a valid tag - // E.g., harbor.my-domain.local/tanzu-cli/plugins-manifest:latest - // Contains a directory containing YAML files, each of which contains single - // CLIPlugin API resource. - image string -} - -// NewOCIDiscovery returns a new local repository. -func NewOCIDiscovery(name, image string) Discovery { - return &OCIDiscovery{ - name: name, - image: image, - } -} - -// List available plugins. -func (od *OCIDiscovery) List() (plugins []plugin.Discovered, err error) { - return od.Manifest() -} - -// Describe a plugin. -func (od *OCIDiscovery) Describe(name string) (p plugin.Discovered, err error) { - plugins, err := od.Manifest() - if err != nil { - return - } - - for i := range plugins { - if plugins[i].Name == name { - p = plugins[i] - return - } - } - err = errors.Errorf("cannot find plugin with name '%v'", name) - return -} - -// Name of the repository. -func (od *OCIDiscovery) Name() string { - return od.name -} - -// Type of the discovery. -func (od *OCIDiscovery) Type() string { - return common.DiscoveryTypeOCI -} - -// Manifest returns the manifest for a local repository. -func (od *OCIDiscovery) Manifest() ([]plugin.Discovered, error) { - outputData, err := carvelhelpers.ProcessCarvelPackage(od.image) - if err != nil { - return nil, errors.Wrap(err, "error while processing package") - } - - return processDiscoveryManifestData(outputData, od.name) -} - -func processDiscoveryManifestData(data []byte, discoveryName string) ([]plugin.Discovered, error) { - plugins := make([]plugin.Discovered, 0) - - for _, resourceYAML := range strings.Split(string(data), "---") { - scheme, err := cliv1alpha1.SchemeBuilder.Build() - if err != nil { - return nil, errors.Wrap(err, "failed to create scheme") - } - s := apimachineryjson.NewSerializerWithOptions(apimachineryjson.DefaultMetaFactory, scheme, scheme, - apimachineryjson.SerializerOptions{Yaml: true, Pretty: false, Strict: false}) - var p cliv1alpha1.CLIPlugin - _, _, err = s.Decode([]byte(resourceYAML), nil, &p) - if err != nil { - return nil, errors.Wrap(err, "could not decode discovery manifests") - } - - dp, err := DiscoveredFromK8sV1alpha1(&p) - if err != nil { - return nil, err - } - dp.Source = discoveryName - dp.DiscoveryType = common.DiscoveryTypeOCI - if dp.Name != "" { - plugins = append(plugins, dp) - } - } - return plugins, nil -} diff --git a/cli/core/pkg/discovery/oci_test.go b/cli/core/pkg/discovery/oci_test.go deleted file mode 100644 index 8ffc2c1974..0000000000 --- a/cli/core/pkg/discovery/oci_test.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -var testData1 = `--- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - name: foo -spec: - artifacts: - v0.0.1: - - arch: amd64 - image: tanzu-cli-plugins/foo-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/foo-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/foo-windows-amd64:latest - os: windows - type: foo - description: Foo description - optional: false - recommendedVersion: v0.0.1 -` - -var testData2 = `--- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - name: foo -spec: - artifacts: - v0.0.1: - - arch: amd64 - image: tanzu-cli-plugins/foo-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/foo-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/foo-windows-amd64:latest - os: windows - type: oci - description: Foo description - optional: false - recommendedVersion: v0.0.1 ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - name: bar -spec: - artifacts: - v0.0.1: - - arch: amd64 - image: tanzu-cli-plugins/foo-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/foo-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/foo-windows-amd64:latest - os: windows - type: oci - v0.0.2: - - arch: amd64 - image: tanzu-cli-plugins/foo-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/foo-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/foo-windows-amd64:latest - os: windows - type: oci - description: Bar description - optional: false - recommendedVersion: v0.0.2 -` - -func Test_ProcessOCIPluginManifest(t *testing.T) { - assert := assert.New(t) - - plugins, err := processDiscoveryManifestData([]byte(testData1), "test-discovery") - assert.Nil(err) - assert.NotNil(plugins) - assert.Equal(1, len(plugins)) - assert.Equal("foo", plugins[0].Name) - assert.Equal("v0.0.1", plugins[0].RecommendedVersion) - assert.Equal("Foo description", plugins[0].Description) - assert.Equal("test-discovery", plugins[0].Source) - assert.EqualValues([]string{"v0.0.1"}, plugins[0].SupportedVersions) - - plugins, err = processDiscoveryManifestData([]byte(testData2), "test-discovery") - assert.Nil(err) - assert.NotNil(plugins) - assert.Equal(2, len(plugins)) - - assert.Equal("foo", plugins[0].Name) - assert.Equal("v0.0.1", plugins[0].RecommendedVersion) - assert.Equal("Foo description", plugins[0].Description) - assert.Equal("test-discovery", plugins[0].Source) - assert.Equal(1, len(plugins[0].SupportedVersions)) - assert.EqualValues([]string{"v0.0.1"}, plugins[0].SupportedVersions) - - assert.Equal("bar", plugins[1].Name) - assert.Equal("v0.0.2", plugins[1].RecommendedVersion) - assert.Equal("Bar description", plugins[1].Description) - assert.Equal("test-discovery", plugins[1].Source) - assert.Equal(2, len(plugins[1].SupportedVersions)) - assert.Contains(plugins[1].SupportedVersions, "v0.0.1") - assert.Contains(plugins[1].SupportedVersions, "v0.0.2") -} diff --git a/cli/core/pkg/discovery/rest.go b/cli/core/pkg/discovery/rest.go deleted file mode 100644 index e1ed3a3aa4..0000000000 --- a/cli/core/pkg/discovery/rest.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "time" - - "github.com/pkg/errors" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/distribution" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" -) - -var defaultTimeout = 5 * time.Second - -// Plugin contains information about a Tanzu CLI plugin discovered via a REST API. -type Plugin struct { - // Name of the plugin. - Name string `json:"name"` - - // Description is the plugin's description. - Description string `json:"description"` - - // Recommended version that Tanzu CLI should use if available. - // The value should be a valid semantic version as defined in - // https://semver.org/. E.g., 2.0.1 - RecommendedVersion string `json:"recommendedVersion"` - - // Artifacts contains an artifact list for every supported version. - Artifacts map[string]cliv1alpha1.ArtifactList `json:"artifacts"` - - // Optional specifies whether the plugin is mandatory or optional - // If optional, the plugin will not get auto-downloaded as part of - // `tanzu login` or `tanzu plugin sync` command - // To view the list of plugin, user can use `tanzu plugin list` and - // to download a specific plugin run, `tanzu plugin install ` - Optional bool `json:"optional"` - - // Target the target of the plugin - Target cliv1alpha1.Target `json:"target"` -} - -// DescribePluginResponse defines the response from Describe Plugin API. -type DescribePluginResponse struct { - Plugin Plugin `json:"plugin"` -} - -// ListPluginsResponse defines the response from List Plugins API. -type ListPluginsResponse struct { - Plugins []Plugin `json:"plugins"` -} - -// RESTDiscovery is an artifact discovery utilizing CLIPlugin API in kubernetes cluster -type RESTDiscovery struct { - // name of the discovery. - name string - // endpoint is the REST API server endpoint. - // E.g., api.my-domain.local - endpoint string - // basePath is the base URL path of the plugin discovery API. - // E.g., /v1alpha1/cli/plugins - basePath string - // client is the HTTP client used to make the REST API call. - client *http.Client -} - -// NewRESTDiscovery returns a new kubernetes repository -func NewRESTDiscovery(name, endpoint, basePath string) Discovery { - return &RESTDiscovery{ - name: name, - endpoint: endpoint, - basePath: basePath, - client: http.DefaultClient, - } -} -func (d *RESTDiscovery) doRequest(req *http.Request, v interface{}) error { - req.Header.Set("Content-Type", "application/json; charset=utf-8") - req.Header.Set("Accept", "application/json; charset=utf-8") - - res, err := d.client.Do(req) - if err != nil { - return err - } - - defer res.Body.Close() - - if res.StatusCode < http.StatusOK || res.StatusCode >= http.StatusBadRequest { - return fmt.Errorf("API error, status code: %d", res.StatusCode) - } - - if err := json.NewDecoder(res.Body).Decode(v); err != nil { - return err - } - - return nil -} - -// List available plugins. -func (d *RESTDiscovery) List() ([]plugin.Discovered, error) { - ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) - defer cancel() - - req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/%s", d.endpoint, d.basePath), http.NoBody) - if err != nil { - return nil, err - } - - var res ListPluginsResponse - if err := d.doRequest(req, &res); err != nil { - return nil, err - } - - // Convert all CLIPlugin resources to Discovered object - plugins := make([]plugin.Discovered, 0) - for i := range res.Plugins { - dp, err := DiscoveredFromREST(&res.Plugins[i]) - if err != nil { - return nil, err - } - dp.Source = d.name - plugins = append(plugins, dp) - } - - return plugins, nil -} - -// Describe a plugin. -func (d *RESTDiscovery) Describe(name string) (p plugin.Discovered, err error) { - ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) - defer cancel() - - req, err := http.NewRequestWithContext(ctx, "GET", fmt.Sprintf("%s/%s/%s", d.endpoint, d.basePath, name), http.NoBody) - if err != nil { - return p, err - } - - var res DescribePluginResponse - if err := d.doRequest(req, &res); err != nil { - return p, err - } - - // Convert the CLIPlugin resource to Discovered object - p, err = DiscoveredFromREST(&res.Plugin) - if err != nil { - return p, err - } - p.Source = d.name - - return p, nil -} - -// Name of the repository. -func (d *RESTDiscovery) Name() string { - return d.name -} - -// Type of the repository. -func (d *RESTDiscovery) Type() string { - return common.DiscoveryTypeREST -} - -// DiscoveredFromREST returns discovered plugin object from a REST API. -func DiscoveredFromREST(p *Plugin) (plugin.Discovered, error) { - dp := plugin.Discovered{ - Name: p.Name, - Description: p.Description, - RecommendedVersion: p.RecommendedVersion, - Optional: p.Optional, - Target: cliv1alpha1.StringToTarget(string(p.Target)), - } - dp.SupportedVersions = make([]string, 0) - for v := range p.Artifacts { - dp.SupportedVersions = append(dp.SupportedVersions, v) - } - if err := SortVersions(dp.SupportedVersions); err != nil { - return dp, errors.Wrapf(err, "error parsing supported versions for plugin %s", p.Name) - } - dp.Distribution = distribution.ArtifactsFromK8sV1alpha1(p.Artifacts) - return dp, nil -} diff --git a/cli/core/pkg/discovery/rest_test.go b/cli/core/pkg/discovery/rest_test.go deleted file mode 100644 index 99556f8f52..0000000000 --- a/cli/core/pkg/discovery/rest_test.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - "encoding/json" - "fmt" - "net/http" - "net/http/httptest" - "testing" - - "github.com/gorilla/mux" - "github.com/stretchr/testify/assert" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - plugin2 "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" -) - -const ( - basePath = "/v1alpha1/cli/plugins" -) - -var ( - pluginFoo = Plugin{ - Name: "foo", - Description: "A plugin for Foo", - RecommendedVersion: "1.0.0", - Artifacts: map[string]cliv1alpha1.ArtifactList{ - "0.0.1": { - { - URI: "https://storage.googleapis.com/storage/v1/b/tanzu-plugins/o/foo-0.0.1-darwin-amd64", - Digest: "test digest", - OS: "darwin", - Arch: "amd64", - }, - { - URI: "https://storage.googleapis.com/storage/v1/b/tanzu-plugins/o/foo-0.0.1-linux-amd64", - Digest: "test digest", - OS: "linux", - Arch: "amd64", - }, - { - URI: "https://storage.googleapis.com/storage/v1/b/tanzu-plugins/o/foo-0.0.1-windows-amd64.exe", - Digest: "test digest", - OS: "windows", - Arch: "amd64", - }, - }, - "1.0.0": { - { - URI: "https://storage.googleapis.com/storage/v1/b/tanzu-plugins/o/foo-1.0.0-darwin-amd64", - Digest: "test digest", - OS: "darwin", - Arch: "amd64", - }, - { - URI: "https://storage.googleapis.com/storage/v1/b/tanzu-plugins/o/foo-1.0.0-linux-amd64", - Digest: "test digest", - OS: "linux", - Arch: "amd64", - }, - { - URI: "https://storage.googleapis.com/storage/v1/b/tanzu-plugins/o/foo-1.0.0-windows-amd64.exe", - Digest: "test digest", - OS: "windows", - Arch: "amd64", - }, - }, - }, - Optional: false, - } - pluginBar = Plugin{ - Name: "bar", - Description: "A plugin for Bar", - RecommendedVersion: "0.0.1", - Artifacts: map[string]cliv1alpha1.ArtifactList{ - "0.0.1": { - { - URI: "https://storage.googleapis.com/storage/v1/b/tanzu-plugins/o/bar-0.0.1-darwin-amd64", - Digest: "test digest", - OS: "darwin", - Arch: "amd64", - }, - { - URI: "https://storage.googleapis.com/storage/v1/b/tanzu-plugins/o/bar-0.0.1-linux-amd64", - Digest: "test digest", - OS: "linux", - Arch: "amd64", - }, - { - URI: "https://storage.googleapis.com/storage/v1/b/tanzu-plugins/o/bar-0.0.1-windows-amd64.exe", - Digest: "test digest", - OS: "windows", - Arch: "amd64", - }, - }, - }, - Optional: true, - } - plugins = []Plugin{pluginFoo, pluginBar} -) - -func createTestServer() *httptest.Server { - m := mux.NewRouter() - m.HandleFunc(basePath, func(w http.ResponseWriter, _ *http.Request) { - res := ListPluginsResponse{plugins} - b, err := json.Marshal(res) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } - - _, err = w.Write(b) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } - }) - m.HandleFunc(fmt.Sprintf("%s/%s", basePath, "{plugin}"), func(w http.ResponseWriter, req *http.Request) { - v := mux.Vars(req) - name := v["plugin"] - var plugin Plugin - for _, p := range plugins { - if p.Name == name { - plugin = p - break - } - } - res := DescribePluginResponse{plugin} - b, err := json.Marshal(res) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } - - _, err = w.Write(b) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - } - }) - return httptest.NewServer(m) -} - -func TestRESTDiscovery(t *testing.T) { - s := createTestServer() - defer s.Close() - - d := NewRESTDiscovery("test", s.URL, basePath) - - expList := make([]plugin2.Discovered, len(plugins)) - for i := range plugins { - p, err := DiscoveredFromREST(&plugins[i]) - assert.NoError(t, err) - p.Source = "test" - expList[i] = p - } - actList, err := d.List() - assert.NoError(t, err) - assert.Equal(t, expList, actList) - - plugin, err := d.Describe("foo") - assert.NoError(t, err) - assert.Equal(t, expList[0], plugin) - - plugin, err = d.Describe("bar") - assert.NoError(t, err) - assert.Equal(t, expList[1], plugin) -} diff --git a/cli/core/pkg/discovery/utils.go b/cli/core/pkg/discovery/utils.go deleted file mode 100644 index da9cb2fa6b..0000000000 --- a/cli/core/pkg/discovery/utils.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - "sort" - - "github.com/Masterminds/semver" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -// CheckDiscoveryName returns true if discovery name exists else return false -func CheckDiscoveryName(ds configapi.PluginDiscovery, dn string) bool { - return (ds.GCP != nil && ds.GCP.Name == dn) || - (ds.Kubernetes != nil && ds.Kubernetes.Name == dn) || - (ds.Local != nil && ds.Local.Name == dn) || - (ds.REST != nil && ds.REST.Name == dn) || - (ds.OCI != nil && ds.OCI.Name == dn) -} - -// CompareDiscoverySource returns true if both discovery source are same for the given type -func CompareDiscoverySource(ds1, ds2 configapi.PluginDiscovery, dsType string) bool { - switch dsType { - case common.DiscoveryTypeLocal: - return compareLocalDiscoverySources(ds1, ds2) - - case common.DiscoveryTypeOCI: - return compareOCIDiscoverySources(ds1, ds2) - - case common.DiscoveryTypeKubernetes: - return compareK8sDiscoverySources(ds1, ds2) - - case common.DiscoveryTypeGCP: - return compareGCPDiscoverySources(ds1, ds2) - - case common.DiscoveryTypeREST: - return compareRESTDiscoverySources(ds1, ds2) - } - return false -} - -func compareGCPDiscoverySources(ds1, ds2 configapi.PluginDiscovery) bool { - return ds1.GCP != nil && ds2.GCP != nil && - ds1.GCP.Name == ds2.GCP.Name && - ds1.GCP.Bucket == ds2.GCP.Bucket && - ds1.GCP.ManifestPath == ds2.GCP.ManifestPath -} - -func compareLocalDiscoverySources(ds1, ds2 configapi.PluginDiscovery) bool { - return ds1.Local != nil && ds2.Local != nil && - ds1.Local.Name == ds2.Local.Name && - ds1.Local.Path == ds2.Local.Path -} - -func compareOCIDiscoverySources(ds1, ds2 configapi.PluginDiscovery) bool { - return ds1.OCI != nil && ds2.OCI != nil && - ds1.OCI.Name == ds2.OCI.Name && - ds1.OCI.Image == ds2.OCI.Image -} - -func compareK8sDiscoverySources(ds1, ds2 configapi.PluginDiscovery) bool { - return ds1.Kubernetes != nil && ds2.Kubernetes != nil && - ds1.Kubernetes.Name == ds2.Kubernetes.Name && - ds1.Kubernetes.Path == ds2.Kubernetes.Path && - ds1.Kubernetes.Context == ds2.Kubernetes.Context -} - -func compareRESTDiscoverySources(ds1, ds2 configapi.PluginDiscovery) bool { - return ds1.REST != nil && ds2.REST != nil && - ds1.REST.Name == ds2.REST.Name && - ds1.REST.BasePath == ds2.REST.BasePath && - ds1.REST.Endpoint == ds2.REST.Endpoint -} - -// SortVersions sorts the supported version strings in semver 2.0 order. -func SortVersions(vStrArr []string) error { - vArr := make([]*semver.Version, len(vStrArr)) - for i, vStr := range vStrArr { - v, err := semver.NewVersion(vStr) - if err != nil { - return err - } - vArr[i] = v - } - sort.Sort(semver.Collection(vArr)) - for i, v := range vArr { - vStrArr[i] = v.Original() - } - return nil -} diff --git a/cli/core/pkg/discovery/utils_test.go b/cli/core/pkg/discovery/utils_test.go deleted file mode 100644 index 56caada75a..0000000000 --- a/cli/core/pkg/discovery/utils_test.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package discovery - -import ( - "testing" - - "github.com/Masterminds/semver" - "github.com/stretchr/testify/assert" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func Test_CheckDiscoveryName(t *testing.T) { - assert := assert.New(t) - - gcpDiscovery := configapi.PluginDiscovery{GCP: &configapi.GCPDiscovery{Name: "gcp-test"}} - result := CheckDiscoveryName(gcpDiscovery, "gcp-test") - assert.True(result) - result = CheckDiscoveryName(gcpDiscovery, "test") - assert.False(result) - - ociDiscovery := configapi.PluginDiscovery{OCI: &configapi.OCIDiscovery{Name: "oci-test"}} - result = CheckDiscoveryName(ociDiscovery, "oci-test") - assert.True(result) - result = CheckDiscoveryName(ociDiscovery, "test") - assert.False(result) - - k8sDiscovery := configapi.PluginDiscovery{Kubernetes: &configapi.KubernetesDiscovery{Name: "k8s-test"}} - result = CheckDiscoveryName(k8sDiscovery, "k8s-test") - assert.True(result) - result = CheckDiscoveryName(k8sDiscovery, "test") - assert.False(result) - - localDiscovery := configapi.PluginDiscovery{Local: &configapi.LocalDiscovery{Name: "local-test"}} - result = CheckDiscoveryName(localDiscovery, "local-test") - assert.True(result) - result = CheckDiscoveryName(localDiscovery, "test") - assert.False(result) - - restDiscovery := configapi.PluginDiscovery{REST: &configapi.GenericRESTDiscovery{Name: "rest-test"}} - result = CheckDiscoveryName(restDiscovery, "rest-test") - assert.True(result) - result = CheckDiscoveryName(restDiscovery, "test") - assert.False(result) -} - -func Test_CompareDiscoverySource(t *testing.T) { - assert := assert.New(t) - - ds1 := configapi.PluginDiscovery{GCP: &configapi.GCPDiscovery{Name: "gcp-test", Bucket: "bucket1", ManifestPath: "manifest1"}} - ds2 := configapi.PluginDiscovery{GCP: &configapi.GCPDiscovery{Name: "gcp-test", Bucket: "bucket1", ManifestPath: "manifest1"}} - result := CompareDiscoverySource(ds1, ds2, common.DiscoveryTypeGCP) - assert.True(result) - ds2 = configapi.PluginDiscovery{GCP: &configapi.GCPDiscovery{Name: "gcp-test", Bucket: "bucket2", ManifestPath: "manifest1"}} - result = CompareDiscoverySource(ds1, ds2, common.DiscoveryTypeGCP) - assert.False(result) - - ds1 = configapi.PluginDiscovery{Local: &configapi.LocalDiscovery{Name: "gcp-test", Path: "path1"}} - ds2 = configapi.PluginDiscovery{Local: &configapi.LocalDiscovery{Name: "gcp-test", Path: "path1"}} - result = CompareDiscoverySource(ds1, ds2, common.DiscoveryTypeLocal) - assert.True(result) - ds2 = configapi.PluginDiscovery{Local: &configapi.LocalDiscovery{Name: "gcp-test", Path: "path2"}} - result = CompareDiscoverySource(ds1, ds2, common.DiscoveryTypeLocal) - assert.False(result) - - ds1 = configapi.PluginDiscovery{OCI: &configapi.OCIDiscovery{Name: "gcp-test", Image: "image1"}} - ds2 = configapi.PluginDiscovery{OCI: &configapi.OCIDiscovery{Name: "gcp-test", Image: "image1"}} - result = CompareDiscoverySource(ds1, ds2, common.DiscoveryTypeOCI) - assert.True(result) - ds2 = configapi.PluginDiscovery{OCI: &configapi.OCIDiscovery{Name: "gcp-test", Image: "image2"}} - result = CompareDiscoverySource(ds1, ds2, common.DiscoveryTypeOCI) - assert.False(result) - - ds1 = configapi.PluginDiscovery{OCI: &configapi.OCIDiscovery{Name: "gcp-test", Image: "image1"}} - ds2 = configapi.PluginDiscovery{Local: &configapi.LocalDiscovery{Name: "gcp-test", Path: "path1"}} - result = CompareDiscoverySource(ds1, ds2, common.DiscoveryTypeOCI) - assert.False(result) - result = CompareDiscoverySource(ds1, ds2, common.DiscoveryTypeLocal) - assert.False(result) - result = CompareDiscoverySource(ds1, ds2, common.DiscoveryTypeREST) - assert.False(result) -} - -func TestSortVersion(t *testing.T) { - tcs := []struct { - name string - act []string - exp []string - err error - }{ - { - name: "Success", - act: []string{"v1.0.0", "v0.0.1", "0.0.1-dev"}, - exp: []string{"0.0.1-dev", "v0.0.1", "v1.0.0"}, - }, - { - name: "Success", - act: []string{"1.0.0", "0.0.a"}, - exp: []string{"1.0.0", "0.0.a"}, - err: semver.ErrInvalidSemVer, - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - err := SortVersions(tc.act) - assert.Equal(t, tc.err, err) - assert.Equal(t, tc.exp, tc.act) - }) - } -} diff --git a/cli/core/pkg/distribution/artifact.go b/cli/core/pkg/distribution/artifact.go deleted file mode 100644 index 12f97e0754..0000000000 --- a/cli/core/pkg/distribution/artifact.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package distribution - -import ( - "github.com/pkg/errors" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/artifact" -) - -// Artifact points to an individual plugin binary specific to a version and -// platform. -type Artifact struct { - // Image is a fully qualified OCI image for the plugin binary. - Image string - - // AssetURI is a URI of the plugin binary. - URI string - - // SHA256 hash of the plugin binary. - Digest string - - // OS of the plugin binary in `GOOS` format. - OS string - - // Arch of the plugin binary in `GOARCH` format. - Arch string -} - -// ArtifactList contains an Artifact object for every supported platform of a -// version. -type ArtifactList []Artifact - -// Artifacts contains an artifact list for every supported version. -type Artifacts map[string]ArtifactList - -// GetArtifact returns Artifact object -func (aMap Artifacts) GetArtifact(version, os, arch string) (Artifact, error) { - err := errors.Errorf( - "could not find the artifact for version:%s, os:%s, arch:%s", - version, os, arch) - if aMap == nil { - return Artifact{}, err - } - - aList, ok := aMap[version] - if !ok || aList == nil { - return Artifact{}, err - } - - for _, a := range aList { - if a.OS == os && a.Arch == arch { - return a, nil - } - } - return Artifact{}, err -} - -// Fetch the binary for a plugin version. -func (aMap Artifacts) Fetch(version, os, arch string) ([]byte, error) { - a, err := aMap.GetArtifact(version, os, arch) - if err != nil { - return nil, err - } - - if a.Image != "" { - return artifact.NewOCIArtifact(a.Image).Fetch() - } - if a.URI != "" { - u, err := artifact.NewURIArtifact(a.URI) - if err != nil { - return nil, err - } - return u.Fetch() - } - - return nil, errors.Errorf("invalid artifact for version:%s, os:%s, "+ - "arch:%s", version, os, arch) -} - -// FetchTest the test binary for a plugin version. -func (aMap Artifacts) FetchTest(version, os, arch string) ([]byte, error) { - a, err := aMap.GetArtifact(version, os, arch) - if err != nil { - return nil, err - } - - if a.Image != "" { - return artifact.NewOCIArtifact(a.Image).FetchTest() - } - if a.URI != "" { - u, err := artifact.NewURIArtifact(a.URI) - if err != nil { - return nil, err - } - return u.FetchTest() - } - - return nil, errors.Errorf("invalid artifact for version:%s, os:%s, arch:%s", version, os, arch) -} - -// GetDigest returns the SHA256 hash of the binary for a plugin version. -func (aMap Artifacts) GetDigest(version, os, arch string) (string, error) { - a, err := aMap.GetArtifact(version, os, arch) - if err != nil { - return "", err - } - - return a.Digest, nil -} - -// DescribeArtifact returns the artifact resource based plugin metadata -func (aMap Artifacts) DescribeArtifact(version, os, arch string) (Artifact, error) { - return aMap.GetArtifact(version, os, arch) -} - -// ArtifactFromK8sV1alpha1 returns Artifact from k8sV1alpha1 -func ArtifactFromK8sV1alpha1(a cliv1alpha1.Artifact) Artifact { //nolint:gocritic - return Artifact{ - Image: a.Image, - URI: a.URI, - Digest: a.Digest, - OS: a.OS, - Arch: a.Arch, - } -} - -// ArtifactListFromK8sV1alpha1 returns ArtifactList from k8sV1alpha1 -func ArtifactListFromK8sV1alpha1(l cliv1alpha1.ArtifactList) ArtifactList { - aList := make(ArtifactList, len(l)) - for _, a := range l { - aList = append(aList, ArtifactFromK8sV1alpha1(a)) - } - return aList -} - -// ArtifactsFromK8sV1alpha1 returns Artifacts from k8sV1alpha1 -func ArtifactsFromK8sV1alpha1(m map[string]cliv1alpha1.ArtifactList) Artifacts { - aMap := make(Artifacts, len(m)) - for v, l := range m { - aMap[v] = ArtifactListFromK8sV1alpha1(l) - } - return aMap -} diff --git a/cli/core/pkg/distribution/artifact_test.go b/cli/core/pkg/distribution/artifact_test.go deleted file mode 100644 index bc240936c0..0000000000 --- a/cli/core/pkg/distribution/artifact_test.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package distribution - -import ( - "os" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestArtifact(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Distribution Suite") -} - -var _ = Describe("Unit tests for distribution", func() { - sampleArtifacts := Artifacts{} - artifact1 := Artifact{ - Image: "image1", - URI: "uri1", - Digest: "digest1", - OS: "ubuntu", - Arch: "amd64", - } - - artifact2 := Artifact{ - Image: "image2", - URI: "uri2", - Digest: "digest2", - OS: "ubuntu", - Arch: "amd64", - } - - artifact3 := Artifact{ - Image: "", - URI: "", - Digest: "", - OS: "windows", - Arch: "amd64", - } - - emptyImageArtifact := Artifact{ - Image: "", - URI: "/tmp/tmp-local-artifact", - Digest: "", - OS: "windows", - Arch: "amd64", - } - - artifactList := ArtifactList{artifact1, artifact2, artifact3} - testFetchArtifactList := ArtifactList{emptyImageArtifact} - sampleArtifacts["1.0.0"] = artifactList - sampleArtifacts["2.0.0"] = testFetchArtifactList - - var _ = Context("tests for the GetArtifact function", func() { - var _ = It("test happy path", func() { - artifact, err := sampleArtifacts.GetArtifact("1.0.0", "ubuntu", "amd64") - expectedArtifact := artifact1 - - Expect(err).ToNot(HaveOccurred()) - Expect(artifact).To(Equal(expectedArtifact)) - Expect(artifact.Image).To(Equal(expectedArtifact.Image)) - Expect(artifact.URI).To(Equal(expectedArtifact.URI)) - }) - - var _ = It("when version does not exist in artifact keys", func() { - artifact, err := sampleArtifacts.GetArtifact("2.0.0", "", "") - expectedArtifact := Artifact{} - Expect(err).To(HaveOccurred()) - Expect(artifact).To(Equal(expectedArtifact)) - }) - - var _ = It("when artifactMap is nil", func() { - var nilArtifactMap Artifacts - expectedArtifact := Artifact{} - - artifact, err := nilArtifactMap.GetArtifact("1.0.0", "ubuntu", "amd64") - Expect(err).To(HaveOccurred()) - Expect(artifact).To(Equal(expectedArtifact)) - }) - - }) - - var _ = Context("Unit tests for the Fetch function", func() { - var tmpFileName string - BeforeEach(func() { - file, err := os.CreateTemp("/tmp", "local-artifact") - Expect(err).ToNot(HaveOccurred()) - tmpFileName = file.Name() - }) - - AfterEach(func() { - err := os.Remove(tmpFileName) - Expect(err).ToNot(HaveOccurred()) - }) - - It("Image and URI are nil", func() { - _, err := sampleArtifacts.Fetch("1.0.0", "windows", "amd64") - Expect(err).To(HaveOccurred()) - }) - - It("Image is nil", func() { - testFetchArtifactList[0].URI = tmpFileName - artifact, err := sampleArtifacts.Fetch("2.0.0", "windows", "amd64") - Expect(err).ToNot(HaveOccurred()) - Expect(artifact).ToNot(BeNil()) - }) - }) - - var _ = Context("Unit tests for getting the digest", func() { - var _ = It("test happy path", func() { - digest, err := sampleArtifacts.GetDigest("1.0.0", "ubuntu", "amd64") - expectedDigest := artifact1.Digest - Expect(err).ToNot(HaveOccurred()) - Expect(digest).To(Equal(expectedDigest)) - }) - - var _ = It("test error in getting artifact", func() { - _, err := sampleArtifacts.GetDigest("1.0.0", "linux", "amd64") - Expect(err).To(HaveOccurred()) - }) - }) - - Context("Unit tests for Describe Artifact", func() { - It("Test Happy Path", func() { - artifact, err := sampleArtifacts.DescribeArtifact("1.0.0", "ubuntu", "amd64") - Expect(err).ToNot(HaveOccurred()) - Expect(artifact).To(Equal(artifact1)) - }) - - It("Test with nil artifactMap", func() { - var nilArtifactMap Artifacts - expectedArtifact := Artifact{} - - artifact, err := nilArtifactMap.DescribeArtifact("1.0.0", "ubuntu", "amd64") - Expect(err).To(HaveOccurred()) - Expect(artifact).To(Equal(expectedArtifact)) - }) - }) -}) diff --git a/cli/core/pkg/distribution/interface.go b/cli/core/pkg/distribution/interface.go deleted file mode 100644 index fe23a8310e..0000000000 --- a/cli/core/pkg/distribution/interface.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package distribution implements plugin distribution interface -// Distribution is the interface to download a plugin version binary -// for a given OS and architecture combination. -// E.g., a GCP object location, an OCI compliant image repository, etc. -package distribution - -// Distribution is an interface to download a single plugin binary. -type Distribution interface { - // Fetch the binary for a plugin version. - Fetch(version, os, arch string) ([]byte, error) - - // FetchTest the test binary for a plugin version. - FetchTest(version, os, arch string) ([]byte, error) - - // GetDigest returns the SHA256 hash of the binary for a plugin version. - GetDigest(version, os, arch string) (string, error) - - // DescribeArtifact returns the artifact resource based plugin metadata - DescribeArtifact(version, os, arch string) (Artifact, error) -} diff --git a/cli/core/pkg/fakes/CrtClient_fake.go b/cli/core/pkg/fakes/CrtClient_fake.go deleted file mode 100644 index d86ef96090..0000000000 --- a/cli/core/pkg/fakes/CrtClient_fake.go +++ /dev/null @@ -1,200 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "context" - "sync" - - "k8s.io/client-go/rest" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cluster" -) - -type CrtClientFake struct { - ListObjectsStub func(context.Context, client.ObjectList, *client.ListOptions) error - listObjectsMutex sync.RWMutex - listObjectsArgsForCall []struct { - arg1 context.Context - arg2 client.ObjectList - arg3 *client.ListOptions - } - listObjectsReturns struct { - result1 error - } - listObjectsReturnsOnCall map[int]struct { - result1 error - } - NewClientStub func(*rest.Config, client.Options) (client.Client, error) - newClientMutex sync.RWMutex - newClientArgsForCall []struct { - arg1 *rest.Config - arg2 client.Options - } - newClientReturns struct { - result1 client.Client - result2 error - } - newClientReturnsOnCall map[int]struct { - result1 client.Client - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *CrtClientFake) ListObjects(arg1 context.Context, arg2 client.ObjectList, arg3 *client.ListOptions) error { - fake.listObjectsMutex.Lock() - ret, specificReturn := fake.listObjectsReturnsOnCall[len(fake.listObjectsArgsForCall)] - fake.listObjectsArgsForCall = append(fake.listObjectsArgsForCall, struct { - arg1 context.Context - arg2 client.ObjectList - arg3 *client.ListOptions - }{arg1, arg2, arg3}) - stub := fake.ListObjectsStub - fakeReturns := fake.listObjectsReturns - fake.recordInvocation("ListObjects", []interface{}{arg1, arg2, arg3}) - fake.listObjectsMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CrtClientFake) ListObjectsCallCount() int { - fake.listObjectsMutex.RLock() - defer fake.listObjectsMutex.RUnlock() - return len(fake.listObjectsArgsForCall) -} - -func (fake *CrtClientFake) ListObjectsCalls(stub func(context.Context, client.ObjectList, *client.ListOptions) error) { - fake.listObjectsMutex.Lock() - defer fake.listObjectsMutex.Unlock() - fake.ListObjectsStub = stub -} - -func (fake *CrtClientFake) ListObjectsArgsForCall(i int) (context.Context, client.ObjectList, *client.ListOptions) { - fake.listObjectsMutex.RLock() - defer fake.listObjectsMutex.RUnlock() - argsForCall := fake.listObjectsArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CrtClientFake) ListObjectsReturns(result1 error) { - fake.listObjectsMutex.Lock() - defer fake.listObjectsMutex.Unlock() - fake.ListObjectsStub = nil - fake.listObjectsReturns = struct { - result1 error - }{result1} -} - -func (fake *CrtClientFake) ListObjectsReturnsOnCall(i int, result1 error) { - fake.listObjectsMutex.Lock() - defer fake.listObjectsMutex.Unlock() - fake.ListObjectsStub = nil - if fake.listObjectsReturnsOnCall == nil { - fake.listObjectsReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.listObjectsReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CrtClientFake) NewClient(arg1 *rest.Config, arg2 client.Options) (client.Client, error) { - fake.newClientMutex.Lock() - ret, specificReturn := fake.newClientReturnsOnCall[len(fake.newClientArgsForCall)] - fake.newClientArgsForCall = append(fake.newClientArgsForCall, struct { - arg1 *rest.Config - arg2 client.Options - }{arg1, arg2}) - stub := fake.NewClientStub - fakeReturns := fake.newClientReturns - fake.recordInvocation("NewClient", []interface{}{arg1, arg2}) - fake.newClientMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *CrtClientFake) NewClientCallCount() int { - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - return len(fake.newClientArgsForCall) -} - -func (fake *CrtClientFake) NewClientCalls(stub func(*rest.Config, client.Options) (client.Client, error)) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = stub -} - -func (fake *CrtClientFake) NewClientArgsForCall(i int) (*rest.Config, client.Options) { - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - argsForCall := fake.newClientArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *CrtClientFake) NewClientReturns(result1 client.Client, result2 error) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = nil - fake.newClientReturns = struct { - result1 client.Client - result2 error - }{result1, result2} -} - -func (fake *CrtClientFake) NewClientReturnsOnCall(i int, result1 client.Client, result2 error) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = nil - if fake.newClientReturnsOnCall == nil { - fake.newClientReturnsOnCall = make(map[int]struct { - result1 client.Client - result2 error - }) - } - fake.newClientReturnsOnCall[i] = struct { - result1 client.Client - result2 error - }{result1, result2} -} - -func (fake *CrtClientFake) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.listObjectsMutex.RLock() - defer fake.listObjectsMutex.RUnlock() - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *CrtClientFake) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ cluster.CrtClient = new(CrtClientFake) diff --git a/cli/core/pkg/fakes/clusterclient_fake.go b/cli/core/pkg/fakes/clusterclient_fake.go deleted file mode 100644 index feb7ce1541..0000000000 --- a/cli/core/pkg/fakes/clusterclient_fake.go +++ /dev/null @@ -1,319 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cluster" -) - -type ClusterClient struct { - BuildClusterQueryStub func() (*discovery.ClusterQuery, error) - buildClusterQueryMutex sync.RWMutex - buildClusterQueryArgsForCall []struct { - } - buildClusterQueryReturns struct { - result1 *discovery.ClusterQuery - result2 error - } - buildClusterQueryReturnsOnCall map[int]struct { - result1 *discovery.ClusterQuery - result2 error - } - GetCLIPluginImageRepositoryOverrideStub func() (map[string]string, error) - getCLIPluginImageRepositoryOverrideMutex sync.RWMutex - getCLIPluginImageRepositoryOverrideArgsForCall []struct { - } - getCLIPluginImageRepositoryOverrideReturns struct { - result1 map[string]string - result2 error - } - getCLIPluginImageRepositoryOverrideReturnsOnCall map[int]struct { - result1 map[string]string - result2 error - } - ListCLIPluginResourcesStub func() ([]v1alpha1.CLIPlugin, error) - listCLIPluginResourcesMutex sync.RWMutex - listCLIPluginResourcesArgsForCall []struct { - } - listCLIPluginResourcesReturns struct { - result1 []v1alpha1.CLIPlugin - result2 error - } - listCLIPluginResourcesReturnsOnCall map[int]struct { - result1 []v1alpha1.CLIPlugin - result2 error - } - VerifyCLIPluginCRDStub func() (bool, error) - verifyCLIPluginCRDMutex sync.RWMutex - verifyCLIPluginCRDArgsForCall []struct { - } - verifyCLIPluginCRDReturns struct { - result1 bool - result2 error - } - verifyCLIPluginCRDReturnsOnCall map[int]struct { - result1 bool - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *ClusterClient) BuildClusterQuery() (*discovery.ClusterQuery, error) { - fake.buildClusterQueryMutex.Lock() - ret, specificReturn := fake.buildClusterQueryReturnsOnCall[len(fake.buildClusterQueryArgsForCall)] - fake.buildClusterQueryArgsForCall = append(fake.buildClusterQueryArgsForCall, struct { - }{}) - stub := fake.BuildClusterQueryStub - fakeReturns := fake.buildClusterQueryReturns - fake.recordInvocation("BuildClusterQuery", []interface{}{}) - fake.buildClusterQueryMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) BuildClusterQueryCallCount() int { - fake.buildClusterQueryMutex.RLock() - defer fake.buildClusterQueryMutex.RUnlock() - return len(fake.buildClusterQueryArgsForCall) -} - -func (fake *ClusterClient) BuildClusterQueryCalls(stub func() (*discovery.ClusterQuery, error)) { - fake.buildClusterQueryMutex.Lock() - defer fake.buildClusterQueryMutex.Unlock() - fake.BuildClusterQueryStub = stub -} - -func (fake *ClusterClient) BuildClusterQueryReturns(result1 *discovery.ClusterQuery, result2 error) { - fake.buildClusterQueryMutex.Lock() - defer fake.buildClusterQueryMutex.Unlock() - fake.BuildClusterQueryStub = nil - fake.buildClusterQueryReturns = struct { - result1 *discovery.ClusterQuery - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) BuildClusterQueryReturnsOnCall(i int, result1 *discovery.ClusterQuery, result2 error) { - fake.buildClusterQueryMutex.Lock() - defer fake.buildClusterQueryMutex.Unlock() - fake.BuildClusterQueryStub = nil - if fake.buildClusterQueryReturnsOnCall == nil { - fake.buildClusterQueryReturnsOnCall = make(map[int]struct { - result1 *discovery.ClusterQuery - result2 error - }) - } - fake.buildClusterQueryReturnsOnCall[i] = struct { - result1 *discovery.ClusterQuery - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetCLIPluginImageRepositoryOverride() (map[string]string, error) { - fake.getCLIPluginImageRepositoryOverrideMutex.Lock() - ret, specificReturn := fake.getCLIPluginImageRepositoryOverrideReturnsOnCall[len(fake.getCLIPluginImageRepositoryOverrideArgsForCall)] - fake.getCLIPluginImageRepositoryOverrideArgsForCall = append(fake.getCLIPluginImageRepositoryOverrideArgsForCall, struct { - }{}) - stub := fake.GetCLIPluginImageRepositoryOverrideStub - fakeReturns := fake.getCLIPluginImageRepositoryOverrideReturns - fake.recordInvocation("GetCLIPluginImageRepositoryOverride", []interface{}{}) - fake.getCLIPluginImageRepositoryOverrideMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetCLIPluginImageRepositoryOverrideCallCount() int { - fake.getCLIPluginImageRepositoryOverrideMutex.RLock() - defer fake.getCLIPluginImageRepositoryOverrideMutex.RUnlock() - return len(fake.getCLIPluginImageRepositoryOverrideArgsForCall) -} - -func (fake *ClusterClient) GetCLIPluginImageRepositoryOverrideCalls(stub func() (map[string]string, error)) { - fake.getCLIPluginImageRepositoryOverrideMutex.Lock() - defer fake.getCLIPluginImageRepositoryOverrideMutex.Unlock() - fake.GetCLIPluginImageRepositoryOverrideStub = stub -} - -func (fake *ClusterClient) GetCLIPluginImageRepositoryOverrideReturns(result1 map[string]string, result2 error) { - fake.getCLIPluginImageRepositoryOverrideMutex.Lock() - defer fake.getCLIPluginImageRepositoryOverrideMutex.Unlock() - fake.GetCLIPluginImageRepositoryOverrideStub = nil - fake.getCLIPluginImageRepositoryOverrideReturns = struct { - result1 map[string]string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetCLIPluginImageRepositoryOverrideReturnsOnCall(i int, result1 map[string]string, result2 error) { - fake.getCLIPluginImageRepositoryOverrideMutex.Lock() - defer fake.getCLIPluginImageRepositoryOverrideMutex.Unlock() - fake.GetCLIPluginImageRepositoryOverrideStub = nil - if fake.getCLIPluginImageRepositoryOverrideReturnsOnCall == nil { - fake.getCLIPluginImageRepositoryOverrideReturnsOnCall = make(map[int]struct { - result1 map[string]string - result2 error - }) - } - fake.getCLIPluginImageRepositoryOverrideReturnsOnCall[i] = struct { - result1 map[string]string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) ListCLIPluginResources() ([]v1alpha1.CLIPlugin, error) { - fake.listCLIPluginResourcesMutex.Lock() - ret, specificReturn := fake.listCLIPluginResourcesReturnsOnCall[len(fake.listCLIPluginResourcesArgsForCall)] - fake.listCLIPluginResourcesArgsForCall = append(fake.listCLIPluginResourcesArgsForCall, struct { - }{}) - stub := fake.ListCLIPluginResourcesStub - fakeReturns := fake.listCLIPluginResourcesReturns - fake.recordInvocation("ListCLIPluginResources", []interface{}{}) - fake.listCLIPluginResourcesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) ListCLIPluginResourcesCallCount() int { - fake.listCLIPluginResourcesMutex.RLock() - defer fake.listCLIPluginResourcesMutex.RUnlock() - return len(fake.listCLIPluginResourcesArgsForCall) -} - -func (fake *ClusterClient) ListCLIPluginResourcesCalls(stub func() ([]v1alpha1.CLIPlugin, error)) { - fake.listCLIPluginResourcesMutex.Lock() - defer fake.listCLIPluginResourcesMutex.Unlock() - fake.ListCLIPluginResourcesStub = stub -} - -func (fake *ClusterClient) ListCLIPluginResourcesReturns(result1 []v1alpha1.CLIPlugin, result2 error) { - fake.listCLIPluginResourcesMutex.Lock() - defer fake.listCLIPluginResourcesMutex.Unlock() - fake.ListCLIPluginResourcesStub = nil - fake.listCLIPluginResourcesReturns = struct { - result1 []v1alpha1.CLIPlugin - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) ListCLIPluginResourcesReturnsOnCall(i int, result1 []v1alpha1.CLIPlugin, result2 error) { - fake.listCLIPluginResourcesMutex.Lock() - defer fake.listCLIPluginResourcesMutex.Unlock() - fake.ListCLIPluginResourcesStub = nil - if fake.listCLIPluginResourcesReturnsOnCall == nil { - fake.listCLIPluginResourcesReturnsOnCall = make(map[int]struct { - result1 []v1alpha1.CLIPlugin - result2 error - }) - } - fake.listCLIPluginResourcesReturnsOnCall[i] = struct { - result1 []v1alpha1.CLIPlugin - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) VerifyCLIPluginCRD() (bool, error) { - fake.verifyCLIPluginCRDMutex.Lock() - ret, specificReturn := fake.verifyCLIPluginCRDReturnsOnCall[len(fake.verifyCLIPluginCRDArgsForCall)] - fake.verifyCLIPluginCRDArgsForCall = append(fake.verifyCLIPluginCRDArgsForCall, struct { - }{}) - stub := fake.VerifyCLIPluginCRDStub - fakeReturns := fake.verifyCLIPluginCRDReturns - fake.recordInvocation("VerifyCLIPluginCRD", []interface{}{}) - fake.verifyCLIPluginCRDMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) VerifyCLIPluginCRDCallCount() int { - fake.verifyCLIPluginCRDMutex.RLock() - defer fake.verifyCLIPluginCRDMutex.RUnlock() - return len(fake.verifyCLIPluginCRDArgsForCall) -} - -func (fake *ClusterClient) VerifyCLIPluginCRDCalls(stub func() (bool, error)) { - fake.verifyCLIPluginCRDMutex.Lock() - defer fake.verifyCLIPluginCRDMutex.Unlock() - fake.VerifyCLIPluginCRDStub = stub -} - -func (fake *ClusterClient) VerifyCLIPluginCRDReturns(result1 bool, result2 error) { - fake.verifyCLIPluginCRDMutex.Lock() - defer fake.verifyCLIPluginCRDMutex.Unlock() - fake.VerifyCLIPluginCRDStub = nil - fake.verifyCLIPluginCRDReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) VerifyCLIPluginCRDReturnsOnCall(i int, result1 bool, result2 error) { - fake.verifyCLIPluginCRDMutex.Lock() - defer fake.verifyCLIPluginCRDMutex.Unlock() - fake.VerifyCLIPluginCRDStub = nil - if fake.verifyCLIPluginCRDReturnsOnCall == nil { - fake.verifyCLIPluginCRDReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.verifyCLIPluginCRDReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.buildClusterQueryMutex.RLock() - defer fake.buildClusterQueryMutex.RUnlock() - fake.getCLIPluginImageRepositoryOverrideMutex.RLock() - defer fake.getCLIPluginImageRepositoryOverrideMutex.RUnlock() - fake.listCLIPluginResourcesMutex.RLock() - defer fake.listCLIPluginResourcesMutex.RUnlock() - fake.verifyCLIPluginCRDMutex.RLock() - defer fake.verifyCLIPluginCRDMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *ClusterClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ cluster.Client = new(ClusterClient) diff --git a/cli/core/pkg/fakes/clusterclientfactory_fake.go b/cli/core/pkg/fakes/clusterclientfactory_fake.go deleted file mode 100644 index e5e88f4ff7..0000000000 --- a/cli/core/pkg/fakes/clusterclientfactory_fake.go +++ /dev/null @@ -1,120 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cluster" -) - -type ClusterClientFactory struct { - NewClientStub func(string, string, cluster.Options) (cluster.Client, error) - newClientMutex sync.RWMutex - newClientArgsForCall []struct { - arg1 string - arg2 string - arg3 cluster.Options - } - newClientReturns struct { - result1 cluster.Client - result2 error - } - newClientReturnsOnCall map[int]struct { - result1 cluster.Client - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *ClusterClientFactory) NewClient(arg1 string, arg2 string, arg3 cluster.Options) (cluster.Client, error) { - fake.newClientMutex.Lock() - ret, specificReturn := fake.newClientReturnsOnCall[len(fake.newClientArgsForCall)] - fake.newClientArgsForCall = append(fake.newClientArgsForCall, struct { - arg1 string - arg2 string - arg3 cluster.Options - }{arg1, arg2, arg3}) - stub := fake.NewClientStub - fakeReturns := fake.newClientReturns - fake.recordInvocation("NewClient", []interface{}{arg1, arg2, arg3}) - fake.newClientMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClientFactory) NewClientCallCount() int { - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - return len(fake.newClientArgsForCall) -} - -func (fake *ClusterClientFactory) NewClientCalls(stub func(string, string, cluster.Options) (cluster.Client, error)) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = stub -} - -func (fake *ClusterClientFactory) NewClientArgsForCall(i int) (string, string, cluster.Options) { - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - argsForCall := fake.newClientArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClientFactory) NewClientReturns(result1 cluster.Client, result2 error) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = nil - fake.newClientReturns = struct { - result1 cluster.Client - result2 error - }{result1, result2} -} - -func (fake *ClusterClientFactory) NewClientReturnsOnCall(i int, result1 cluster.Client, result2 error) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = nil - if fake.newClientReturnsOnCall == nil { - fake.newClientReturnsOnCall = make(map[int]struct { - result1 cluster.Client - result2 error - }) - } - fake.newClientReturnsOnCall[i] = struct { - result1 cluster.Client - result2 error - }{result1, result2} -} - -func (fake *ClusterClientFactory) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *ClusterClientFactory) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ cluster.ClusterClientFactory = new(ClusterClientFactory) diff --git a/cli/core/pkg/fakes/config/kubeconfig1.yaml b/cli/core/pkg/fakes/config/kubeconfig1.yaml deleted file mode 100644 index 4aeee73359..0000000000 --- a/cli/core/pkg/fakes/config/kubeconfig1.yaml +++ /dev/null @@ -1,37 +0,0 @@ -current-context: federal-context -apiVersion: v1 -clusters: - - cluster: - api-version: v1 - server: http://cow.org:8080 - name: cow-cluster - - cluster: - insecure-skip-tls-verify: true - server: https://horse.org:4443 - name: horse-cluster - - cluster: - insecure-skip-tls-verify: true - server: https://pig.org:443 - name: pig-cluster -contexts: - - context: - cluster: horse-cluster - namespace: chisel-ns - user: green-user - name: federal-context - - context: - cluster: pig-cluster - namespace: saw-ns - user: black-user - name: queen-anne-context -kind: Config -preferences: - colors: true -users: - - name: blue-user - user: - token: blue-token - - name: green-user - user: - client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJQ24vUDZ1S1pWWTR3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TURBeE1qVXdPRFV4TVRCYUZ3MHlNVEF4TWpRd09EVXhNVEphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJuUmc4dklXQlBWQUJWTFUKNGNFckd4bE5XZVJHR2x0OW0wVElsUStNUytSZU9GNUhROW5pQlRSQWMwVWpsUk1EdzR3aEREVXV3Y2NsazFCNApoa3l2YUx5elZyeW9jOWV5NHU0SVZ0MFR4ZU85VUI5bXZHMkF6TlVnY0FkRkp4cWdKbSt2OXo0RzMyU0EwUEc1CjhxZWtBRzVLYU1RQlJEVm5pNXZBajJ5c0hpdHhkbGdJdEZkc1dzNUgwM3FIUjVNQU5jT01nYlZLSnRtbE9MUngKYWFmRHhxSWRaS0pERENxeDFoaWFlMk5WdWp1TzI3OE9DV3NaN3FUWVR4UzNpVVJBUXNpYWk5Y2Q5T2FITnJSTAozWWtUdTl0b1c5RTNFdVB0b0h3S2N6RlZsNk01dWtaWW5wZDEwL213Y2wzUzA1ZFd2SExhNGVMakZ3Z2RQc05XCkZ4NThTd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNaThWVXZ0RWo0d3g3Z1hZSXhxZU95L1UyY0psQVp3S0Zmdwp3eEJYQjg3V1JYblhZaEt1aWhPeUpCSnM2RVpSOUZWcWUwNm1yZFNOMVRPQW5JdmovZVlEejB5SlZFQlVNMHJ1CmlXWkN2djRxZXBRYUpWSzZBRDBjcjBtZEIvbmFrd3lyS203eTRXdjRSMkhVcWxZdTZXcVRsdTY3V3Ezb1g5VFIKSUFZRUozWXJmSy9QUXV3WHZyUlNDWGg2NVpHT21aL3M0di9vbWlvajdocHp4Zm9OOUkxQ0hoYUV2clFGcW9UcwpiSWJWMDFDa3Nzak9DdUhrQlIzRGxLcENyQ29iMEVYd2E0c2pkNjlVWnJzRElCeUtmZmxqV0pscllYdWdOQ0pPCi9OeUhVS2dMTDk3c0lOR043NElJRmJhNXV2cWRkQm9jTUxGMkFrRHV6UndweC9mVWNrUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= - client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBcm5SZzh2SVdCUFZBQlZMVTRjRXJHeGxOV2VSR0dsdDltMFRJbFErTVMrUmVPRjVIClE5bmlCVFJBYzBVamxSTUR3NHdoRERVdXdjY2xrMUI0aGt5dmFMeXpWcnlvYzlleTR1NElWdDBUeGVPOVVCOW0KdkcyQXpOVWdjQWRGSnhxZ0ptK3Y5ejRHMzJTQTBQRzU4cWVrQUc1S2FNUUJSRFZuaTV2QWoyeXNIaXR4ZGxnSQp0RmRzV3M1SDAzcUhSNU1BTmNPTWdiVktKdG1sT0xSeGFhZkR4cUlkWktKRERDcXgxaGlhZTJOVnVqdU8yNzhPCkNXc1o3cVRZVHhTM2lVUkFRc2lhaTljZDlPYUhOclJMM1lrVHU5dG9XOUUzRXVQdG9Id0tjekZWbDZNNXVrWlkKbnBkMTAvbXdjbDNTMDVkV3ZITGE0ZUxqRndnZFBzTldGeDU4U3dJREFRQUJBb0lCQUNMUloyZ1ZtUDkwVTBxOAp0WEE1TlhrN0c0ME5XbEI0WWlGVElSVmUvUWxJa3VWOUs0d0hPRzBCZUx1STJRa3Z1bGlVNXlPZ21heGpLc1MwCkV0bjdCQ2RMUWgvVmwybEhhNVNQSFdyNHhMR0NPbzU3TmUzMWpQZFVzaHlwMXN0dkxQZCs0d2ZkZ1ZHa3BYRU8KVGFaNGZ1cjNHRExBcStBSktKbGNoSm9iZmw2bXlLc2tKV2NrUmNYY3FWOW5adFRtbGh5aFljZ2tuYkg0dFJmOAp0YzNsR1B5cHF0SmhiWmEyaUMxUGkxMlltYjBwNThFWVVFdVRXdWVjaHBXNHY0cU02V2ZYMXJSeGRSU3RwQkF5Cm50WUF5b3pYYUQ5cDlYbnI5OFNOekFMMW83azF0V29FanRBSXhNVTNlQ1VFTWx5Q01VVVFrUjNGN0JOUk9GWS8KcnNGVVlVRUNnWUVBMHorZ0QwNithSlpsSWkyeUtOYnJNMm1DTjFjQ2hkdVFCSmdvc0VMTS9IN0p1cnY4SFJsQQpvYkxwekJSWXQ3aW82WHBaQndsRnIrM0dabWdTWkkwY3U0L0tIMXRVWU1DRS9pVnVYa0tXVnYva0laUnd0ckpkCmNEU0htNkVxbnRwY2h3aTBQbFltNmx3Vm5lbEpvN282T2dycHFvVXA0cjNvRGNHUzREdU1vTThDZ1lFQTAybGEKelMycTdMVjlEQXZhdVFOQ2wvZ2JLTk9FZG9FR0tYWEVBaFJTYkc3SHpHeVkveDJVSUFocCtuUytFS21wdVF6WQp4UUdqOU5QSlY3WGJqQkg4MmtDcmhtRUx0bG9QOGdQVlhxUGhXTHFzemNUOE1xUFRCYUcxS21IaTRrb3FZb2hhCldJS0pnTFErOEFCTjBOUEJYUTl4NVJVSHVPejhJaUcveVBxcXM4VUNnWUE3WFVqc3BGTkw3dCt5MENhZDVXK3AKUGdBeTd3ZXRlRHNybjFybjFZM25jdlhidlJJblZ6NWJjbnpUTmZDTWlKOG5KWk81TDNqZTdMSHhlMU9YNERQdgozWU9PZGtycStZOG1JSHk0am52VExRditCOG40L1h6V21GeDNkcjRVY0FiS2g3Nm5PZXlydFg3NXBtSmtXV1FkCmhZMk90dWREYWR5NWFPbU9qQTJEN3dLQmdGQ1UwN3RwTU1GUTIvei9kN3NWZHdpZDFSeFdveUxZUXhVQ2dsZVkKajJJdFI1S3Z3aEZib040azF1QlVKeTRLdlZwL2Z4QjRjNW9hTDZCeS9PQUM2ekgxZkd1WUNmTFRtVWhTRmI0aApFUC9WQjVEWENKbjB2N1poMEwvNjE1UVJXTjU5d3BJQ0Q0OHpKTm91QTNzWmU1YVJFSVNVNDRDbE0rVituNjluCmZERlJBb0dBUDZ1NGxrSjg0amRjTVROVTdYeW16ZkMwSkd5aFRNcWQ2YnV4NG9FQlViSFhoOW1DaVRMSmFaV1YKN0F5NkxTV21lRGIrWEFrS0tQL2UwQVMrWElKV2p6MDI5SFdDaXM0T3NZV3VqeksrVjVaVUVkQlJNUEN0QUo4ZApCaDBvRTliSUdIOVB0RTFIdTh6NGpGaG5WUmVqdmdhMzRQdG9QV3JNL01sZnQzLy9Lazg9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== diff --git a/cli/core/pkg/fakes/config/kubeconfig2.yaml b/cli/core/pkg/fakes/config/kubeconfig2.yaml deleted file mode 100644 index 3228e6d34c..0000000000 --- a/cli/core/pkg/fakes/config/kubeconfig2.yaml +++ /dev/null @@ -1,20 +0,0 @@ -current-context: federal-context-1 -apiVersion: v1 -clusters: - - cluster: - insecure-skip-tls-verify: true - server: https://horse.org:4443 - name: horse-cluster-1 -contexts: - - context: - cluster: horse-cluster-1 - namespace: chisel-ns - user: green-user - name: federal-context-1 -kind: Config -preferences: - colors: true -users: - - name: blue-user-1 - user: - token: blue-token-1 diff --git a/cli/core/pkg/fakes/config/kubeconfig_server_ver.yaml b/cli/core/pkg/fakes/config/kubeconfig_server_ver.yaml deleted file mode 100644 index 4aeee73359..0000000000 --- a/cli/core/pkg/fakes/config/kubeconfig_server_ver.yaml +++ /dev/null @@ -1,37 +0,0 @@ -current-context: federal-context -apiVersion: v1 -clusters: - - cluster: - api-version: v1 - server: http://cow.org:8080 - name: cow-cluster - - cluster: - insecure-skip-tls-verify: true - server: https://horse.org:4443 - name: horse-cluster - - cluster: - insecure-skip-tls-verify: true - server: https://pig.org:443 - name: pig-cluster -contexts: - - context: - cluster: horse-cluster - namespace: chisel-ns - user: green-user - name: federal-context - - context: - cluster: pig-cluster - namespace: saw-ns - user: black-user - name: queen-anne-context -kind: Config -preferences: - colors: true -users: - - name: blue-user - user: - token: blue-token - - name: green-user - user: - client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJQ24vUDZ1S1pWWTR3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TURBeE1qVXdPRFV4TVRCYUZ3MHlNVEF4TWpRd09EVXhNVEphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJuUmc4dklXQlBWQUJWTFUKNGNFckd4bE5XZVJHR2x0OW0wVElsUStNUytSZU9GNUhROW5pQlRSQWMwVWpsUk1EdzR3aEREVXV3Y2NsazFCNApoa3l2YUx5elZyeW9jOWV5NHU0SVZ0MFR4ZU85VUI5bXZHMkF6TlVnY0FkRkp4cWdKbSt2OXo0RzMyU0EwUEc1CjhxZWtBRzVLYU1RQlJEVm5pNXZBajJ5c0hpdHhkbGdJdEZkc1dzNUgwM3FIUjVNQU5jT01nYlZLSnRtbE9MUngKYWFmRHhxSWRaS0pERENxeDFoaWFlMk5WdWp1TzI3OE9DV3NaN3FUWVR4UzNpVVJBUXNpYWk5Y2Q5T2FITnJSTAozWWtUdTl0b1c5RTNFdVB0b0h3S2N6RlZsNk01dWtaWW5wZDEwL213Y2wzUzA1ZFd2SExhNGVMakZ3Z2RQc05XCkZ4NThTd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNaThWVXZ0RWo0d3g3Z1hZSXhxZU95L1UyY0psQVp3S0Zmdwp3eEJYQjg3V1JYblhZaEt1aWhPeUpCSnM2RVpSOUZWcWUwNm1yZFNOMVRPQW5JdmovZVlEejB5SlZFQlVNMHJ1CmlXWkN2djRxZXBRYUpWSzZBRDBjcjBtZEIvbmFrd3lyS203eTRXdjRSMkhVcWxZdTZXcVRsdTY3V3Ezb1g5VFIKSUFZRUozWXJmSy9QUXV3WHZyUlNDWGg2NVpHT21aL3M0di9vbWlvajdocHp4Zm9OOUkxQ0hoYUV2clFGcW9UcwpiSWJWMDFDa3Nzak9DdUhrQlIzRGxLcENyQ29iMEVYd2E0c2pkNjlVWnJzRElCeUtmZmxqV0pscllYdWdOQ0pPCi9OeUhVS2dMTDk3c0lOR043NElJRmJhNXV2cWRkQm9jTUxGMkFrRHV6UndweC9mVWNrUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= - client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBcm5SZzh2SVdCUFZBQlZMVTRjRXJHeGxOV2VSR0dsdDltMFRJbFErTVMrUmVPRjVIClE5bmlCVFJBYzBVamxSTUR3NHdoRERVdXdjY2xrMUI0aGt5dmFMeXpWcnlvYzlleTR1NElWdDBUeGVPOVVCOW0KdkcyQXpOVWdjQWRGSnhxZ0ptK3Y5ejRHMzJTQTBQRzU4cWVrQUc1S2FNUUJSRFZuaTV2QWoyeXNIaXR4ZGxnSQp0RmRzV3M1SDAzcUhSNU1BTmNPTWdiVktKdG1sT0xSeGFhZkR4cUlkWktKRERDcXgxaGlhZTJOVnVqdU8yNzhPCkNXc1o3cVRZVHhTM2lVUkFRc2lhaTljZDlPYUhOclJMM1lrVHU5dG9XOUUzRXVQdG9Id0tjekZWbDZNNXVrWlkKbnBkMTAvbXdjbDNTMDVkV3ZITGE0ZUxqRndnZFBzTldGeDU4U3dJREFRQUJBb0lCQUNMUloyZ1ZtUDkwVTBxOAp0WEE1TlhrN0c0ME5XbEI0WWlGVElSVmUvUWxJa3VWOUs0d0hPRzBCZUx1STJRa3Z1bGlVNXlPZ21heGpLc1MwCkV0bjdCQ2RMUWgvVmwybEhhNVNQSFdyNHhMR0NPbzU3TmUzMWpQZFVzaHlwMXN0dkxQZCs0d2ZkZ1ZHa3BYRU8KVGFaNGZ1cjNHRExBcStBSktKbGNoSm9iZmw2bXlLc2tKV2NrUmNYY3FWOW5adFRtbGh5aFljZ2tuYkg0dFJmOAp0YzNsR1B5cHF0SmhiWmEyaUMxUGkxMlltYjBwNThFWVVFdVRXdWVjaHBXNHY0cU02V2ZYMXJSeGRSU3RwQkF5Cm50WUF5b3pYYUQ5cDlYbnI5OFNOekFMMW83azF0V29FanRBSXhNVTNlQ1VFTWx5Q01VVVFrUjNGN0JOUk9GWS8KcnNGVVlVRUNnWUVBMHorZ0QwNithSlpsSWkyeUtOYnJNMm1DTjFjQ2hkdVFCSmdvc0VMTS9IN0p1cnY4SFJsQQpvYkxwekJSWXQ3aW82WHBaQndsRnIrM0dabWdTWkkwY3U0L0tIMXRVWU1DRS9pVnVYa0tXVnYva0laUnd0ckpkCmNEU0htNkVxbnRwY2h3aTBQbFltNmx3Vm5lbEpvN282T2dycHFvVXA0cjNvRGNHUzREdU1vTThDZ1lFQTAybGEKelMycTdMVjlEQXZhdVFOQ2wvZ2JLTk9FZG9FR0tYWEVBaFJTYkc3SHpHeVkveDJVSUFocCtuUytFS21wdVF6WQp4UUdqOU5QSlY3WGJqQkg4MmtDcmhtRUx0bG9QOGdQVlhxUGhXTHFzemNUOE1xUFRCYUcxS21IaTRrb3FZb2hhCldJS0pnTFErOEFCTjBOUEJYUTl4NVJVSHVPejhJaUcveVBxcXM4VUNnWUE3WFVqc3BGTkw3dCt5MENhZDVXK3AKUGdBeTd3ZXRlRHNybjFybjFZM25jdlhidlJJblZ6NWJjbnpUTmZDTWlKOG5KWk81TDNqZTdMSHhlMU9YNERQdgozWU9PZGtycStZOG1JSHk0am52VExRditCOG40L1h6V21GeDNkcjRVY0FiS2g3Nm5PZXlydFg3NXBtSmtXV1FkCmhZMk90dWREYWR5NWFPbU9qQTJEN3dLQmdGQ1UwN3RwTU1GUTIvei9kN3NWZHdpZDFSeFdveUxZUXhVQ2dsZVkKajJJdFI1S3Z3aEZib040azF1QlVKeTRLdlZwL2Z4QjRjNW9hTDZCeS9PQUM2ekgxZkd1WUNmTFRtVWhTRmI0aApFUC9WQjVEWENKbjB2N1poMEwvNjE1UVJXTjU5d3BJQ0Q0OHpKTm91QTNzWmU1YVJFSVNVNDRDbE0rVituNjluCmZERlJBb0dBUDZ1NGxrSjg0amRjTVROVTdYeW16ZkMwSkd5aFRNcWQ2YnV4NG9FQlViSFhoOW1DaVRMSmFaV1YKN0F5NkxTV21lRGIrWEFrS0tQL2UwQVMrWElKV2p6MDI5SFdDaXM0T3NZV3VqeksrVjVaVUVkQlJNUEN0QUo4ZApCaDBvRTliSUdIOVB0RTFIdTh6NGpGaG5WUmVqdmdhMzRQdG9QV3JNL01sZnQzLy9Lazg9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== diff --git a/cli/core/pkg/fakes/discoveryclientfactory_fake.go b/cli/core/pkg/fakes/discoveryclientfactory_fake.go deleted file mode 100644 index 11c8d3f7d1..0000000000 --- a/cli/core/pkg/fakes/discoveryclientfactory_fake.go +++ /dev/null @@ -1,199 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "k8s.io/apimachinery/pkg/version" - "k8s.io/client-go/discovery" - "k8s.io/client-go/rest" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cluster" -) - -type DiscoveryClientFactory struct { - NewDiscoveryClientForConfigStub func(*rest.Config) (discovery.DiscoveryInterface, error) - newDiscoveryClientForConfigMutex sync.RWMutex - newDiscoveryClientForConfigArgsForCall []struct { - arg1 *rest.Config - } - newDiscoveryClientForConfigReturns struct { - result1 discovery.DiscoveryInterface - result2 error - } - newDiscoveryClientForConfigReturnsOnCall map[int]struct { - result1 discovery.DiscoveryInterface - result2 error - } - ServerVersionStub func(discovery.DiscoveryInterface) (*version.Info, error) - serverVersionMutex sync.RWMutex - serverVersionArgsForCall []struct { - arg1 discovery.DiscoveryInterface - } - serverVersionReturns struct { - result1 *version.Info - result2 error - } - serverVersionReturnsOnCall map[int]struct { - result1 *version.Info - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfig(arg1 *rest.Config) (discovery.DiscoveryInterface, error) { - fake.newDiscoveryClientForConfigMutex.Lock() - ret, specificReturn := fake.newDiscoveryClientForConfigReturnsOnCall[len(fake.newDiscoveryClientForConfigArgsForCall)] - fake.newDiscoveryClientForConfigArgsForCall = append(fake.newDiscoveryClientForConfigArgsForCall, struct { - arg1 *rest.Config - }{arg1}) - stub := fake.NewDiscoveryClientForConfigStub - fakeReturns := fake.newDiscoveryClientForConfigReturns - fake.recordInvocation("NewDiscoveryClientForConfig", []interface{}{arg1}) - fake.newDiscoveryClientForConfigMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfigCallCount() int { - fake.newDiscoveryClientForConfigMutex.RLock() - defer fake.newDiscoveryClientForConfigMutex.RUnlock() - return len(fake.newDiscoveryClientForConfigArgsForCall) -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfigCalls(stub func(*rest.Config) (discovery.DiscoveryInterface, error)) { - fake.newDiscoveryClientForConfigMutex.Lock() - defer fake.newDiscoveryClientForConfigMutex.Unlock() - fake.NewDiscoveryClientForConfigStub = stub -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfigArgsForCall(i int) *rest.Config { - fake.newDiscoveryClientForConfigMutex.RLock() - defer fake.newDiscoveryClientForConfigMutex.RUnlock() - argsForCall := fake.newDiscoveryClientForConfigArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfigReturns(result1 discovery.DiscoveryInterface, result2 error) { - fake.newDiscoveryClientForConfigMutex.Lock() - defer fake.newDiscoveryClientForConfigMutex.Unlock() - fake.NewDiscoveryClientForConfigStub = nil - fake.newDiscoveryClientForConfigReturns = struct { - result1 discovery.DiscoveryInterface - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfigReturnsOnCall(i int, result1 discovery.DiscoveryInterface, result2 error) { - fake.newDiscoveryClientForConfigMutex.Lock() - defer fake.newDiscoveryClientForConfigMutex.Unlock() - fake.NewDiscoveryClientForConfigStub = nil - if fake.newDiscoveryClientForConfigReturnsOnCall == nil { - fake.newDiscoveryClientForConfigReturnsOnCall = make(map[int]struct { - result1 discovery.DiscoveryInterface - result2 error - }) - } - fake.newDiscoveryClientForConfigReturnsOnCall[i] = struct { - result1 discovery.DiscoveryInterface - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClientFactory) ServerVersion(arg1 discovery.DiscoveryInterface) (*version.Info, error) { - fake.serverVersionMutex.Lock() - ret, specificReturn := fake.serverVersionReturnsOnCall[len(fake.serverVersionArgsForCall)] - fake.serverVersionArgsForCall = append(fake.serverVersionArgsForCall, struct { - arg1 discovery.DiscoveryInterface - }{arg1}) - stub := fake.ServerVersionStub - fakeReturns := fake.serverVersionReturns - fake.recordInvocation("ServerVersion", []interface{}{arg1}) - fake.serverVersionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClientFactory) ServerVersionCallCount() int { - fake.serverVersionMutex.RLock() - defer fake.serverVersionMutex.RUnlock() - return len(fake.serverVersionArgsForCall) -} - -func (fake *DiscoveryClientFactory) ServerVersionCalls(stub func(discovery.DiscoveryInterface) (*version.Info, error)) { - fake.serverVersionMutex.Lock() - defer fake.serverVersionMutex.Unlock() - fake.ServerVersionStub = stub -} - -func (fake *DiscoveryClientFactory) ServerVersionArgsForCall(i int) discovery.DiscoveryInterface { - fake.serverVersionMutex.RLock() - defer fake.serverVersionMutex.RUnlock() - argsForCall := fake.serverVersionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *DiscoveryClientFactory) ServerVersionReturns(result1 *version.Info, result2 error) { - fake.serverVersionMutex.Lock() - defer fake.serverVersionMutex.Unlock() - fake.ServerVersionStub = nil - fake.serverVersionReturns = struct { - result1 *version.Info - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClientFactory) ServerVersionReturnsOnCall(i int, result1 *version.Info, result2 error) { - fake.serverVersionMutex.Lock() - defer fake.serverVersionMutex.Unlock() - fake.ServerVersionStub = nil - if fake.serverVersionReturnsOnCall == nil { - fake.serverVersionReturnsOnCall = make(map[int]struct { - result1 *version.Info - result2 error - }) - } - fake.serverVersionReturnsOnCall[i] = struct { - result1 *version.Info - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClientFactory) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.newDiscoveryClientForConfigMutex.RLock() - defer fake.newDiscoveryClientForConfigMutex.RUnlock() - fake.serverVersionMutex.RLock() - defer fake.serverVersionMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *DiscoveryClientFactory) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ cluster.DiscoveryClientFactory = new(DiscoveryClientFactory) diff --git a/cli/core/pkg/fakes/discoveryclusterclient_fake.go b/cli/core/pkg/fakes/discoveryclusterclient_fake.go deleted file mode 100644 index 9068282800..0000000000 --- a/cli/core/pkg/fakes/discoveryclusterclient_fake.go +++ /dev/null @@ -1,677 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - openapi_v2 "github.com/google/gnostic/openapiv2" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/version" - "k8s.io/client-go/openapi" - "k8s.io/client-go/rest" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cluster" -) - -type DiscoveryClient struct { - OpenAPISchemaStub func() (*openapi_v2.Document, error) - openAPISchemaMutex sync.RWMutex - openAPISchemaArgsForCall []struct { - } - openAPISchemaReturns struct { - result1 *openapi_v2.Document - result2 error - } - openAPISchemaReturnsOnCall map[int]struct { - result1 *openapi_v2.Document - result2 error - } - OpenAPIV3Stub func() openapi.Client - openAPIV3Mutex sync.RWMutex - openAPIV3ArgsForCall []struct { - } - openAPIV3Returns struct { - result1 openapi.Client - } - openAPIV3ReturnsOnCall map[int]struct { - result1 openapi.Client - } - RESTClientStub func() rest.Interface - rESTClientMutex sync.RWMutex - rESTClientArgsForCall []struct { - } - rESTClientReturns struct { - result1 rest.Interface - } - rESTClientReturnsOnCall map[int]struct { - result1 rest.Interface - } - ServerGroupsStub func() (*v1.APIGroupList, error) - serverGroupsMutex sync.RWMutex - serverGroupsArgsForCall []struct { - } - serverGroupsReturns struct { - result1 *v1.APIGroupList - result2 error - } - serverGroupsReturnsOnCall map[int]struct { - result1 *v1.APIGroupList - result2 error - } - ServerGroupsAndResourcesStub func() ([]*v1.APIGroup, []*v1.APIResourceList, error) - serverGroupsAndResourcesMutex sync.RWMutex - serverGroupsAndResourcesArgsForCall []struct { - } - serverGroupsAndResourcesReturns struct { - result1 []*v1.APIGroup - result2 []*v1.APIResourceList - result3 error - } - serverGroupsAndResourcesReturnsOnCall map[int]struct { - result1 []*v1.APIGroup - result2 []*v1.APIResourceList - result3 error - } - ServerPreferredNamespacedResourcesStub func() ([]*v1.APIResourceList, error) - serverPreferredNamespacedResourcesMutex sync.RWMutex - serverPreferredNamespacedResourcesArgsForCall []struct { - } - serverPreferredNamespacedResourcesReturns struct { - result1 []*v1.APIResourceList - result2 error - } - serverPreferredNamespacedResourcesReturnsOnCall map[int]struct { - result1 []*v1.APIResourceList - result2 error - } - ServerPreferredResourcesStub func() ([]*v1.APIResourceList, error) - serverPreferredResourcesMutex sync.RWMutex - serverPreferredResourcesArgsForCall []struct { - } - serverPreferredResourcesReturns struct { - result1 []*v1.APIResourceList - result2 error - } - serverPreferredResourcesReturnsOnCall map[int]struct { - result1 []*v1.APIResourceList - result2 error - } - ServerResourcesForGroupVersionStub func(string) (*v1.APIResourceList, error) - serverResourcesForGroupVersionMutex sync.RWMutex - serverResourcesForGroupVersionArgsForCall []struct { - arg1 string - } - serverResourcesForGroupVersionReturns struct { - result1 *v1.APIResourceList - result2 error - } - serverResourcesForGroupVersionReturnsOnCall map[int]struct { - result1 *v1.APIResourceList - result2 error - } - ServerVersionStub func() (*version.Info, error) - serverVersionMutex sync.RWMutex - serverVersionArgsForCall []struct { - } - serverVersionReturns struct { - result1 *version.Info - result2 error - } - serverVersionReturnsOnCall map[int]struct { - result1 *version.Info - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *DiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) { - fake.openAPISchemaMutex.Lock() - ret, specificReturn := fake.openAPISchemaReturnsOnCall[len(fake.openAPISchemaArgsForCall)] - fake.openAPISchemaArgsForCall = append(fake.openAPISchemaArgsForCall, struct { - }{}) - stub := fake.OpenAPISchemaStub - fakeReturns := fake.openAPISchemaReturns - fake.recordInvocation("OpenAPISchema", []interface{}{}) - fake.openAPISchemaMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) OpenAPISchemaCallCount() int { - fake.openAPISchemaMutex.RLock() - defer fake.openAPISchemaMutex.RUnlock() - return len(fake.openAPISchemaArgsForCall) -} - -func (fake *DiscoveryClient) OpenAPISchemaCalls(stub func() (*openapi_v2.Document, error)) { - fake.openAPISchemaMutex.Lock() - defer fake.openAPISchemaMutex.Unlock() - fake.OpenAPISchemaStub = stub -} - -func (fake *DiscoveryClient) OpenAPISchemaReturns(result1 *openapi_v2.Document, result2 error) { - fake.openAPISchemaMutex.Lock() - defer fake.openAPISchemaMutex.Unlock() - fake.OpenAPISchemaStub = nil - fake.openAPISchemaReturns = struct { - result1 *openapi_v2.Document - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) OpenAPISchemaReturnsOnCall(i int, result1 *openapi_v2.Document, result2 error) { - fake.openAPISchemaMutex.Lock() - defer fake.openAPISchemaMutex.Unlock() - fake.OpenAPISchemaStub = nil - if fake.openAPISchemaReturnsOnCall == nil { - fake.openAPISchemaReturnsOnCall = make(map[int]struct { - result1 *openapi_v2.Document - result2 error - }) - } - fake.openAPISchemaReturnsOnCall[i] = struct { - result1 *openapi_v2.Document - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) OpenAPIV3() openapi.Client { - fake.openAPIV3Mutex.Lock() - ret, specificReturn := fake.openAPIV3ReturnsOnCall[len(fake.openAPIV3ArgsForCall)] - fake.openAPIV3ArgsForCall = append(fake.openAPIV3ArgsForCall, struct { - }{}) - stub := fake.OpenAPIV3Stub - fakeReturns := fake.openAPIV3Returns - fake.recordInvocation("OpenAPIV3", []interface{}{}) - fake.openAPIV3Mutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *DiscoveryClient) OpenAPIV3CallCount() int { - fake.openAPIV3Mutex.RLock() - defer fake.openAPIV3Mutex.RUnlock() - return len(fake.openAPIV3ArgsForCall) -} - -func (fake *DiscoveryClient) OpenAPIV3Calls(stub func() openapi.Client) { - fake.openAPIV3Mutex.Lock() - defer fake.openAPIV3Mutex.Unlock() - fake.OpenAPIV3Stub = stub -} - -func (fake *DiscoveryClient) OpenAPIV3Returns(result1 openapi.Client) { - fake.openAPIV3Mutex.Lock() - defer fake.openAPIV3Mutex.Unlock() - fake.OpenAPIV3Stub = nil - fake.openAPIV3Returns = struct { - result1 openapi.Client - }{result1} -} - -func (fake *DiscoveryClient) OpenAPIV3ReturnsOnCall(i int, result1 openapi.Client) { - fake.openAPIV3Mutex.Lock() - defer fake.openAPIV3Mutex.Unlock() - fake.OpenAPIV3Stub = nil - if fake.openAPIV3ReturnsOnCall == nil { - fake.openAPIV3ReturnsOnCall = make(map[int]struct { - result1 openapi.Client - }) - } - fake.openAPIV3ReturnsOnCall[i] = struct { - result1 openapi.Client - }{result1} -} - -func (fake *DiscoveryClient) RESTClient() rest.Interface { - fake.rESTClientMutex.Lock() - ret, specificReturn := fake.rESTClientReturnsOnCall[len(fake.rESTClientArgsForCall)] - fake.rESTClientArgsForCall = append(fake.rESTClientArgsForCall, struct { - }{}) - stub := fake.RESTClientStub - fakeReturns := fake.rESTClientReturns - fake.recordInvocation("RESTClient", []interface{}{}) - fake.rESTClientMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *DiscoveryClient) RESTClientCallCount() int { - fake.rESTClientMutex.RLock() - defer fake.rESTClientMutex.RUnlock() - return len(fake.rESTClientArgsForCall) -} - -func (fake *DiscoveryClient) RESTClientCalls(stub func() rest.Interface) { - fake.rESTClientMutex.Lock() - defer fake.rESTClientMutex.Unlock() - fake.RESTClientStub = stub -} - -func (fake *DiscoveryClient) RESTClientReturns(result1 rest.Interface) { - fake.rESTClientMutex.Lock() - defer fake.rESTClientMutex.Unlock() - fake.RESTClientStub = nil - fake.rESTClientReturns = struct { - result1 rest.Interface - }{result1} -} - -func (fake *DiscoveryClient) RESTClientReturnsOnCall(i int, result1 rest.Interface) { - fake.rESTClientMutex.Lock() - defer fake.rESTClientMutex.Unlock() - fake.RESTClientStub = nil - if fake.rESTClientReturnsOnCall == nil { - fake.rESTClientReturnsOnCall = make(map[int]struct { - result1 rest.Interface - }) - } - fake.rESTClientReturnsOnCall[i] = struct { - result1 rest.Interface - }{result1} -} - -func (fake *DiscoveryClient) ServerGroups() (*v1.APIGroupList, error) { - fake.serverGroupsMutex.Lock() - ret, specificReturn := fake.serverGroupsReturnsOnCall[len(fake.serverGroupsArgsForCall)] - fake.serverGroupsArgsForCall = append(fake.serverGroupsArgsForCall, struct { - }{}) - stub := fake.ServerGroupsStub - fakeReturns := fake.serverGroupsReturns - fake.recordInvocation("ServerGroups", []interface{}{}) - fake.serverGroupsMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) ServerGroupsCallCount() int { - fake.serverGroupsMutex.RLock() - defer fake.serverGroupsMutex.RUnlock() - return len(fake.serverGroupsArgsForCall) -} - -func (fake *DiscoveryClient) ServerGroupsCalls(stub func() (*v1.APIGroupList, error)) { - fake.serverGroupsMutex.Lock() - defer fake.serverGroupsMutex.Unlock() - fake.ServerGroupsStub = stub -} - -func (fake *DiscoveryClient) ServerGroupsReturns(result1 *v1.APIGroupList, result2 error) { - fake.serverGroupsMutex.Lock() - defer fake.serverGroupsMutex.Unlock() - fake.ServerGroupsStub = nil - fake.serverGroupsReturns = struct { - result1 *v1.APIGroupList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerGroupsReturnsOnCall(i int, result1 *v1.APIGroupList, result2 error) { - fake.serverGroupsMutex.Lock() - defer fake.serverGroupsMutex.Unlock() - fake.ServerGroupsStub = nil - if fake.serverGroupsReturnsOnCall == nil { - fake.serverGroupsReturnsOnCall = make(map[int]struct { - result1 *v1.APIGroupList - result2 error - }) - } - fake.serverGroupsReturnsOnCall[i] = struct { - result1 *v1.APIGroupList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerGroupsAndResources() ([]*v1.APIGroup, []*v1.APIResourceList, error) { - fake.serverGroupsAndResourcesMutex.Lock() - ret, specificReturn := fake.serverGroupsAndResourcesReturnsOnCall[len(fake.serverGroupsAndResourcesArgsForCall)] - fake.serverGroupsAndResourcesArgsForCall = append(fake.serverGroupsAndResourcesArgsForCall, struct { - }{}) - stub := fake.ServerGroupsAndResourcesStub - fakeReturns := fake.serverGroupsAndResourcesReturns - fake.recordInvocation("ServerGroupsAndResources", []interface{}{}) - fake.serverGroupsAndResourcesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *DiscoveryClient) ServerGroupsAndResourcesCallCount() int { - fake.serverGroupsAndResourcesMutex.RLock() - defer fake.serverGroupsAndResourcesMutex.RUnlock() - return len(fake.serverGroupsAndResourcesArgsForCall) -} - -func (fake *DiscoveryClient) ServerGroupsAndResourcesCalls(stub func() ([]*v1.APIGroup, []*v1.APIResourceList, error)) { - fake.serverGroupsAndResourcesMutex.Lock() - defer fake.serverGroupsAndResourcesMutex.Unlock() - fake.ServerGroupsAndResourcesStub = stub -} - -func (fake *DiscoveryClient) ServerGroupsAndResourcesReturns(result1 []*v1.APIGroup, result2 []*v1.APIResourceList, result3 error) { - fake.serverGroupsAndResourcesMutex.Lock() - defer fake.serverGroupsAndResourcesMutex.Unlock() - fake.ServerGroupsAndResourcesStub = nil - fake.serverGroupsAndResourcesReturns = struct { - result1 []*v1.APIGroup - result2 []*v1.APIResourceList - result3 error - }{result1, result2, result3} -} - -func (fake *DiscoveryClient) ServerGroupsAndResourcesReturnsOnCall(i int, result1 []*v1.APIGroup, result2 []*v1.APIResourceList, result3 error) { - fake.serverGroupsAndResourcesMutex.Lock() - defer fake.serverGroupsAndResourcesMutex.Unlock() - fake.ServerGroupsAndResourcesStub = nil - if fake.serverGroupsAndResourcesReturnsOnCall == nil { - fake.serverGroupsAndResourcesReturnsOnCall = make(map[int]struct { - result1 []*v1.APIGroup - result2 []*v1.APIResourceList - result3 error - }) - } - fake.serverGroupsAndResourcesReturnsOnCall[i] = struct { - result1 []*v1.APIGroup - result2 []*v1.APIResourceList - result3 error - }{result1, result2, result3} -} - -func (fake *DiscoveryClient) ServerPreferredNamespacedResources() ([]*v1.APIResourceList, error) { - fake.serverPreferredNamespacedResourcesMutex.Lock() - ret, specificReturn := fake.serverPreferredNamespacedResourcesReturnsOnCall[len(fake.serverPreferredNamespacedResourcesArgsForCall)] - fake.serverPreferredNamespacedResourcesArgsForCall = append(fake.serverPreferredNamespacedResourcesArgsForCall, struct { - }{}) - stub := fake.ServerPreferredNamespacedResourcesStub - fakeReturns := fake.serverPreferredNamespacedResourcesReturns - fake.recordInvocation("ServerPreferredNamespacedResources", []interface{}{}) - fake.serverPreferredNamespacedResourcesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) ServerPreferredNamespacedResourcesCallCount() int { - fake.serverPreferredNamespacedResourcesMutex.RLock() - defer fake.serverPreferredNamespacedResourcesMutex.RUnlock() - return len(fake.serverPreferredNamespacedResourcesArgsForCall) -} - -func (fake *DiscoveryClient) ServerPreferredNamespacedResourcesCalls(stub func() ([]*v1.APIResourceList, error)) { - fake.serverPreferredNamespacedResourcesMutex.Lock() - defer fake.serverPreferredNamespacedResourcesMutex.Unlock() - fake.ServerPreferredNamespacedResourcesStub = stub -} - -func (fake *DiscoveryClient) ServerPreferredNamespacedResourcesReturns(result1 []*v1.APIResourceList, result2 error) { - fake.serverPreferredNamespacedResourcesMutex.Lock() - defer fake.serverPreferredNamespacedResourcesMutex.Unlock() - fake.ServerPreferredNamespacedResourcesStub = nil - fake.serverPreferredNamespacedResourcesReturns = struct { - result1 []*v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerPreferredNamespacedResourcesReturnsOnCall(i int, result1 []*v1.APIResourceList, result2 error) { - fake.serverPreferredNamespacedResourcesMutex.Lock() - defer fake.serverPreferredNamespacedResourcesMutex.Unlock() - fake.ServerPreferredNamespacedResourcesStub = nil - if fake.serverPreferredNamespacedResourcesReturnsOnCall == nil { - fake.serverPreferredNamespacedResourcesReturnsOnCall = make(map[int]struct { - result1 []*v1.APIResourceList - result2 error - }) - } - fake.serverPreferredNamespacedResourcesReturnsOnCall[i] = struct { - result1 []*v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerPreferredResources() ([]*v1.APIResourceList, error) { - fake.serverPreferredResourcesMutex.Lock() - ret, specificReturn := fake.serverPreferredResourcesReturnsOnCall[len(fake.serverPreferredResourcesArgsForCall)] - fake.serverPreferredResourcesArgsForCall = append(fake.serverPreferredResourcesArgsForCall, struct { - }{}) - stub := fake.ServerPreferredResourcesStub - fakeReturns := fake.serverPreferredResourcesReturns - fake.recordInvocation("ServerPreferredResources", []interface{}{}) - fake.serverPreferredResourcesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) ServerPreferredResourcesCallCount() int { - fake.serverPreferredResourcesMutex.RLock() - defer fake.serverPreferredResourcesMutex.RUnlock() - return len(fake.serverPreferredResourcesArgsForCall) -} - -func (fake *DiscoveryClient) ServerPreferredResourcesCalls(stub func() ([]*v1.APIResourceList, error)) { - fake.serverPreferredResourcesMutex.Lock() - defer fake.serverPreferredResourcesMutex.Unlock() - fake.ServerPreferredResourcesStub = stub -} - -func (fake *DiscoveryClient) ServerPreferredResourcesReturns(result1 []*v1.APIResourceList, result2 error) { - fake.serverPreferredResourcesMutex.Lock() - defer fake.serverPreferredResourcesMutex.Unlock() - fake.ServerPreferredResourcesStub = nil - fake.serverPreferredResourcesReturns = struct { - result1 []*v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerPreferredResourcesReturnsOnCall(i int, result1 []*v1.APIResourceList, result2 error) { - fake.serverPreferredResourcesMutex.Lock() - defer fake.serverPreferredResourcesMutex.Unlock() - fake.ServerPreferredResourcesStub = nil - if fake.serverPreferredResourcesReturnsOnCall == nil { - fake.serverPreferredResourcesReturnsOnCall = make(map[int]struct { - result1 []*v1.APIResourceList - result2 error - }) - } - fake.serverPreferredResourcesReturnsOnCall[i] = struct { - result1 []*v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersion(arg1 string) (*v1.APIResourceList, error) { - fake.serverResourcesForGroupVersionMutex.Lock() - ret, specificReturn := fake.serverResourcesForGroupVersionReturnsOnCall[len(fake.serverResourcesForGroupVersionArgsForCall)] - fake.serverResourcesForGroupVersionArgsForCall = append(fake.serverResourcesForGroupVersionArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ServerResourcesForGroupVersionStub - fakeReturns := fake.serverResourcesForGroupVersionReturns - fake.recordInvocation("ServerResourcesForGroupVersion", []interface{}{arg1}) - fake.serverResourcesForGroupVersionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersionCallCount() int { - fake.serverResourcesForGroupVersionMutex.RLock() - defer fake.serverResourcesForGroupVersionMutex.RUnlock() - return len(fake.serverResourcesForGroupVersionArgsForCall) -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersionCalls(stub func(string) (*v1.APIResourceList, error)) { - fake.serverResourcesForGroupVersionMutex.Lock() - defer fake.serverResourcesForGroupVersionMutex.Unlock() - fake.ServerResourcesForGroupVersionStub = stub -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersionArgsForCall(i int) string { - fake.serverResourcesForGroupVersionMutex.RLock() - defer fake.serverResourcesForGroupVersionMutex.RUnlock() - argsForCall := fake.serverResourcesForGroupVersionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersionReturns(result1 *v1.APIResourceList, result2 error) { - fake.serverResourcesForGroupVersionMutex.Lock() - defer fake.serverResourcesForGroupVersionMutex.Unlock() - fake.ServerResourcesForGroupVersionStub = nil - fake.serverResourcesForGroupVersionReturns = struct { - result1 *v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersionReturnsOnCall(i int, result1 *v1.APIResourceList, result2 error) { - fake.serverResourcesForGroupVersionMutex.Lock() - defer fake.serverResourcesForGroupVersionMutex.Unlock() - fake.ServerResourcesForGroupVersionStub = nil - if fake.serverResourcesForGroupVersionReturnsOnCall == nil { - fake.serverResourcesForGroupVersionReturnsOnCall = make(map[int]struct { - result1 *v1.APIResourceList - result2 error - }) - } - fake.serverResourcesForGroupVersionReturnsOnCall[i] = struct { - result1 *v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerVersion() (*version.Info, error) { - fake.serverVersionMutex.Lock() - ret, specificReturn := fake.serverVersionReturnsOnCall[len(fake.serverVersionArgsForCall)] - fake.serverVersionArgsForCall = append(fake.serverVersionArgsForCall, struct { - }{}) - stub := fake.ServerVersionStub - fakeReturns := fake.serverVersionReturns - fake.recordInvocation("ServerVersion", []interface{}{}) - fake.serverVersionMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) ServerVersionCallCount() int { - fake.serverVersionMutex.RLock() - defer fake.serverVersionMutex.RUnlock() - return len(fake.serverVersionArgsForCall) -} - -func (fake *DiscoveryClient) ServerVersionCalls(stub func() (*version.Info, error)) { - fake.serverVersionMutex.Lock() - defer fake.serverVersionMutex.Unlock() - fake.ServerVersionStub = stub -} - -func (fake *DiscoveryClient) ServerVersionReturns(result1 *version.Info, result2 error) { - fake.serverVersionMutex.Lock() - defer fake.serverVersionMutex.Unlock() - fake.ServerVersionStub = nil - fake.serverVersionReturns = struct { - result1 *version.Info - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerVersionReturnsOnCall(i int, result1 *version.Info, result2 error) { - fake.serverVersionMutex.Lock() - defer fake.serverVersionMutex.Unlock() - fake.ServerVersionStub = nil - if fake.serverVersionReturnsOnCall == nil { - fake.serverVersionReturnsOnCall = make(map[int]struct { - result1 *version.Info - result2 error - }) - } - fake.serverVersionReturnsOnCall[i] = struct { - result1 *version.Info - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.openAPISchemaMutex.RLock() - defer fake.openAPISchemaMutex.RUnlock() - fake.openAPIV3Mutex.RLock() - defer fake.openAPIV3Mutex.RUnlock() - fake.rESTClientMutex.RLock() - defer fake.rESTClientMutex.RUnlock() - fake.serverGroupsMutex.RLock() - defer fake.serverGroupsMutex.RUnlock() - fake.serverGroupsAndResourcesMutex.RLock() - defer fake.serverGroupsAndResourcesMutex.RUnlock() - fake.serverPreferredNamespacedResourcesMutex.RLock() - defer fake.serverPreferredNamespacedResourcesMutex.RUnlock() - fake.serverPreferredResourcesMutex.RLock() - defer fake.serverPreferredResourcesMutex.RUnlock() - fake.serverResourcesForGroupVersionMutex.RLock() - defer fake.serverResourcesForGroupVersionMutex.RUnlock() - fake.serverVersionMutex.RLock() - defer fake.serverVersionMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *DiscoveryClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ cluster.DiscoveryClient = new(DiscoveryClient) diff --git a/cli/core/pkg/fakes/dynamicclientfactory_fake.go b/cli/core/pkg/fakes/dynamicclientfactory_fake.go deleted file mode 100644 index 3698999dc9..0000000000 --- a/cli/core/pkg/fakes/dynamicclientfactory_fake.go +++ /dev/null @@ -1,119 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "k8s.io/client-go/dynamic" - "k8s.io/client-go/rest" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cluster" -) - -type DynamicClientFactory struct { - NewDynamicClientForConfigStub func(*rest.Config) (dynamic.Interface, error) - newDynamicClientForConfigMutex sync.RWMutex - newDynamicClientForConfigArgsForCall []struct { - arg1 *rest.Config - } - newDynamicClientForConfigReturns struct { - result1 dynamic.Interface - result2 error - } - newDynamicClientForConfigReturnsOnCall map[int]struct { - result1 dynamic.Interface - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfig(arg1 *rest.Config) (dynamic.Interface, error) { - fake.newDynamicClientForConfigMutex.Lock() - ret, specificReturn := fake.newDynamicClientForConfigReturnsOnCall[len(fake.newDynamicClientForConfigArgsForCall)] - fake.newDynamicClientForConfigArgsForCall = append(fake.newDynamicClientForConfigArgsForCall, struct { - arg1 *rest.Config - }{arg1}) - stub := fake.NewDynamicClientForConfigStub - fakeReturns := fake.newDynamicClientForConfigReturns - fake.recordInvocation("NewDynamicClientForConfig", []interface{}{arg1}) - fake.newDynamicClientForConfigMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfigCallCount() int { - fake.newDynamicClientForConfigMutex.RLock() - defer fake.newDynamicClientForConfigMutex.RUnlock() - return len(fake.newDynamicClientForConfigArgsForCall) -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfigCalls(stub func(*rest.Config) (dynamic.Interface, error)) { - fake.newDynamicClientForConfigMutex.Lock() - defer fake.newDynamicClientForConfigMutex.Unlock() - fake.NewDynamicClientForConfigStub = stub -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfigArgsForCall(i int) *rest.Config { - fake.newDynamicClientForConfigMutex.RLock() - defer fake.newDynamicClientForConfigMutex.RUnlock() - argsForCall := fake.newDynamicClientForConfigArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfigReturns(result1 dynamic.Interface, result2 error) { - fake.newDynamicClientForConfigMutex.Lock() - defer fake.newDynamicClientForConfigMutex.Unlock() - fake.NewDynamicClientForConfigStub = nil - fake.newDynamicClientForConfigReturns = struct { - result1 dynamic.Interface - result2 error - }{result1, result2} -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfigReturnsOnCall(i int, result1 dynamic.Interface, result2 error) { - fake.newDynamicClientForConfigMutex.Lock() - defer fake.newDynamicClientForConfigMutex.Unlock() - fake.NewDynamicClientForConfigStub = nil - if fake.newDynamicClientForConfigReturnsOnCall == nil { - fake.newDynamicClientForConfigReturnsOnCall = make(map[int]struct { - result1 dynamic.Interface - result2 error - }) - } - fake.newDynamicClientForConfigReturnsOnCall[i] = struct { - result1 dynamic.Interface - result2 error - }{result1, result2} -} - -func (fake *DynamicClientFactory) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.newDynamicClientForConfigMutex.RLock() - defer fake.newDynamicClientForConfigMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *DynamicClientFactory) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ cluster.DynamicClientFactory = new(DynamicClientFactory) diff --git a/cli/core/pkg/fakes/fake_config_client_wrapper.go b/cli/core/pkg/fakes/fake_config_client_wrapper.go deleted file mode 100644 index f8243fd2d9..0000000000 --- a/cli/core/pkg/fakes/fake_config_client_wrapper.go +++ /dev/null @@ -1,237 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/interfaces" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -type FakeConfigClientWrapper struct { - AcquireTanzuConfigLockStub func() - acquireTanzuConfigLockMutex sync.RWMutex - acquireTanzuConfigLockArgsForCall []struct { - } - GetEnvConfigurationsStub func() map[string]string - getEnvConfigurationsMutex sync.RWMutex - getEnvConfigurationsArgsForCall []struct { - } - getEnvConfigurationsReturns struct { - result1 map[string]string - } - getEnvConfigurationsReturnsOnCall map[int]struct { - result1 map[string]string - } - ReleaseTanzuConfigLockStub func() - releaseTanzuConfigLockMutex sync.RWMutex - releaseTanzuConfigLockArgsForCall []struct { - } - StoreClientConfigStub func(*v1alpha1.ClientConfig) error - storeClientConfigMutex sync.RWMutex - storeClientConfigArgsForCall []struct { - arg1 *v1alpha1.ClientConfig - } - storeClientConfigReturns struct { - result1 error - } - storeClientConfigReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *FakeConfigClientWrapper) AcquireTanzuConfigLock() { - fake.acquireTanzuConfigLockMutex.Lock() - fake.acquireTanzuConfigLockArgsForCall = append(fake.acquireTanzuConfigLockArgsForCall, struct { - }{}) - stub := fake.AcquireTanzuConfigLockStub - fake.recordInvocation("AcquireTanzuConfigLock", []interface{}{}) - fake.acquireTanzuConfigLockMutex.Unlock() - if stub != nil { - fake.AcquireTanzuConfigLockStub() - } -} - -func (fake *FakeConfigClientWrapper) AcquireTanzuConfigLockCallCount() int { - fake.acquireTanzuConfigLockMutex.RLock() - defer fake.acquireTanzuConfigLockMutex.RUnlock() - return len(fake.acquireTanzuConfigLockArgsForCall) -} - -func (fake *FakeConfigClientWrapper) AcquireTanzuConfigLockCalls(stub func()) { - fake.acquireTanzuConfigLockMutex.Lock() - defer fake.acquireTanzuConfigLockMutex.Unlock() - fake.AcquireTanzuConfigLockStub = stub -} - -func (fake *FakeConfigClientWrapper) GetEnvConfigurations() map[string]string { - fake.getEnvConfigurationsMutex.Lock() - ret, specificReturn := fake.getEnvConfigurationsReturnsOnCall[len(fake.getEnvConfigurationsArgsForCall)] - fake.getEnvConfigurationsArgsForCall = append(fake.getEnvConfigurationsArgsForCall, struct { - }{}) - stub := fake.GetEnvConfigurationsStub - fakeReturns := fake.getEnvConfigurationsReturns - fake.recordInvocation("GetEnvConfigurations", []interface{}{}) - fake.getEnvConfigurationsMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *FakeConfigClientWrapper) GetEnvConfigurationsCallCount() int { - fake.getEnvConfigurationsMutex.RLock() - defer fake.getEnvConfigurationsMutex.RUnlock() - return len(fake.getEnvConfigurationsArgsForCall) -} - -func (fake *FakeConfigClientWrapper) GetEnvConfigurationsCalls(stub func() map[string]string) { - fake.getEnvConfigurationsMutex.Lock() - defer fake.getEnvConfigurationsMutex.Unlock() - fake.GetEnvConfigurationsStub = stub -} - -func (fake *FakeConfigClientWrapper) GetEnvConfigurationsReturns(result1 map[string]string) { - fake.getEnvConfigurationsMutex.Lock() - defer fake.getEnvConfigurationsMutex.Unlock() - fake.GetEnvConfigurationsStub = nil - fake.getEnvConfigurationsReturns = struct { - result1 map[string]string - }{result1} -} - -func (fake *FakeConfigClientWrapper) GetEnvConfigurationsReturnsOnCall(i int, result1 map[string]string) { - fake.getEnvConfigurationsMutex.Lock() - defer fake.getEnvConfigurationsMutex.Unlock() - fake.GetEnvConfigurationsStub = nil - if fake.getEnvConfigurationsReturnsOnCall == nil { - fake.getEnvConfigurationsReturnsOnCall = make(map[int]struct { - result1 map[string]string - }) - } - fake.getEnvConfigurationsReturnsOnCall[i] = struct { - result1 map[string]string - }{result1} -} - -func (fake *FakeConfigClientWrapper) ReleaseTanzuConfigLock() { - fake.releaseTanzuConfigLockMutex.Lock() - fake.releaseTanzuConfigLockArgsForCall = append(fake.releaseTanzuConfigLockArgsForCall, struct { - }{}) - stub := fake.ReleaseTanzuConfigLockStub - fake.recordInvocation("ReleaseTanzuConfigLock", []interface{}{}) - fake.releaseTanzuConfigLockMutex.Unlock() - if stub != nil { - fake.ReleaseTanzuConfigLockStub() - } -} - -func (fake *FakeConfigClientWrapper) ReleaseTanzuConfigLockCallCount() int { - fake.releaseTanzuConfigLockMutex.RLock() - defer fake.releaseTanzuConfigLockMutex.RUnlock() - return len(fake.releaseTanzuConfigLockArgsForCall) -} - -func (fake *FakeConfigClientWrapper) ReleaseTanzuConfigLockCalls(stub func()) { - fake.releaseTanzuConfigLockMutex.Lock() - defer fake.releaseTanzuConfigLockMutex.Unlock() - fake.ReleaseTanzuConfigLockStub = stub -} - -func (fake *FakeConfigClientWrapper) StoreClientConfig(arg1 *v1alpha1.ClientConfig) error { - fake.storeClientConfigMutex.Lock() - ret, specificReturn := fake.storeClientConfigReturnsOnCall[len(fake.storeClientConfigArgsForCall)] - fake.storeClientConfigArgsForCall = append(fake.storeClientConfigArgsForCall, struct { - arg1 *v1alpha1.ClientConfig - }{arg1}) - stub := fake.StoreClientConfigStub - fakeReturns := fake.storeClientConfigReturns - fake.recordInvocation("StoreClientConfig", []interface{}{arg1}) - fake.storeClientConfigMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *FakeConfigClientWrapper) StoreClientConfigCallCount() int { - fake.storeClientConfigMutex.RLock() - defer fake.storeClientConfigMutex.RUnlock() - return len(fake.storeClientConfigArgsForCall) -} - -func (fake *FakeConfigClientWrapper) StoreClientConfigCalls(stub func(*v1alpha1.ClientConfig) error) { - fake.storeClientConfigMutex.Lock() - defer fake.storeClientConfigMutex.Unlock() - fake.StoreClientConfigStub = stub -} - -func (fake *FakeConfigClientWrapper) StoreClientConfigArgsForCall(i int) *v1alpha1.ClientConfig { - fake.storeClientConfigMutex.RLock() - defer fake.storeClientConfigMutex.RUnlock() - argsForCall := fake.storeClientConfigArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *FakeConfigClientWrapper) StoreClientConfigReturns(result1 error) { - fake.storeClientConfigMutex.Lock() - defer fake.storeClientConfigMutex.Unlock() - fake.StoreClientConfigStub = nil - fake.storeClientConfigReturns = struct { - result1 error - }{result1} -} - -func (fake *FakeConfigClientWrapper) StoreClientConfigReturnsOnCall(i int, result1 error) { - fake.storeClientConfigMutex.Lock() - defer fake.storeClientConfigMutex.Unlock() - fake.StoreClientConfigStub = nil - if fake.storeClientConfigReturnsOnCall == nil { - fake.storeClientConfigReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.storeClientConfigReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *FakeConfigClientWrapper) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.acquireTanzuConfigLockMutex.RLock() - defer fake.acquireTanzuConfigLockMutex.RUnlock() - fake.getEnvConfigurationsMutex.RLock() - defer fake.getEnvConfigurationsMutex.RUnlock() - fake.releaseTanzuConfigLockMutex.RLock() - defer fake.releaseTanzuConfigLockMutex.RUnlock() - fake.storeClientConfigMutex.RLock() - defer fake.storeClientConfigMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *FakeConfigClientWrapper) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ interfaces.ConfigClientWrapper = new(FakeConfigClientWrapper) diff --git a/cli/core/pkg/fakes/helper/common.go b/cli/core/pkg/fakes/helper/common.go deleted file mode 100644 index dd68fd30d0..0000000000 --- a/cli/core/pkg/fakes/helper/common.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package helper - -import ( - "fmt" - "os" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/constants" -) - -// GetFakeKubeConfigFilePath returns fake kubeconfig file path -func GetFakeKubeConfigFilePath(testingDir, filePath string) string { - f, err := os.CreateTemp(testingDir, "kube") - if err != nil { - fmt.Println("Error creating TempFile: ", err.Error()) - } - copyFile(filePath, f.Name()) - return f.Name() -} - -func copyFile(sourceFile, destFile string) { - input, err := os.ReadFile(sourceFile) - if err != nil { - fmt.Println("Error ReadFile TempFile: ", err.Error()) - } - _ = os.WriteFile(destFile, input, constants.ConfigFilePermissions) - if err != nil { - fmt.Println("Error WriteFile TempFile: ", err.Error()) - } -} - -// CreateTempTestingDirectory create temporary directory for testing -func CreateTempTestingDirectory() string { - testingDir, _ := os.MkdirTemp("", "testing") - return testingDir -} - -// DeleteTempTestingDirectory deletes temporary directory -func DeleteTempTestingDirectory(testingDir string) { - os.Remove(testingDir) -} diff --git a/cli/core/pkg/fakes/helper/fakeobjectcreater.go b/cli/core/pkg/fakes/helper/fakeobjectcreater.go deleted file mode 100644 index 716d83d108..0000000000 --- a/cli/core/pkg/fakes/helper/fakeobjectcreater.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package helper implements helper functions used for unit tests -package helper - -import ( - "crypto/x509" - "encoding/base64" - "encoding/json" - "encoding/pem" - "fmt" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" -) - -// ###################### Fake CAPI objects creation helper ###################### - -// GetFakeClusterInfo returns the cluster-info configmap -func GetFakeClusterInfo(server string, cert *x509.Certificate) string { - clusterInfoJSON := ` - { - "kind": "ConfigMap", - "apiVersion": "v1", - "data": { - "kubeconfig": "apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: %s\n server: %s\n name: \"\"\ncontexts: null\ncurrent-context: \"\"\nkind: Config\npreferences: {}\nusers: null\n" - }, - "metadata": { - "name": "cluster-info", - "namespace": "kube-public" - } - }` - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: cert.Raw}) - clusterInfoJSON = fmt.Sprintf(clusterInfoJSON, base64.StdEncoding.EncodeToString(certBytes), server) - - return clusterInfoJSON -} - -// GetFakePinnipedInfo returns the pinniped-info configmap -func GetFakePinnipedInfo(pinnipedInfo pinnipedinfo.PinnipedInfo) string { - data, err := json.Marshal(pinnipedInfo) - if err != nil { - err = fmt.Errorf("could not marshal Pinniped info into JSON: %w", err) - } - - pinnipedInfoJSON := ` - { - "kind": "ConfigMap", - "apiVersion": "v1", - "metadata": { - "name": "pinniped-info", - "namespace": "kube-public" - }, - "data": %s - }` - pinnipedInfoJSON = fmt.Sprintf(pinnipedInfoJSON, string(data)) - return pinnipedInfoJSON -} - -// NewCLIPlugin returns new NewCLIPlugin object -func NewCLIPlugin(options TestCLIPluginOption) v1alpha1.CLIPlugin { - artifacts := []v1alpha1.Artifact{ - { - Image: "fake.image.repo.com/tkg/plugin/test-darwin-plugin:v1.4.0", - OS: "darwin", - Arch: "amd64", - }, - { - Image: "fake.image.repo.com/tkg/plugin/test-linux-plugin:v1.4.0", - OS: "linux", - Arch: "amd64", - }, - { - Image: "fake.image.repo.com/tkg/plugin/test-windows-plugin:v1.4.0", - OS: "windows", - Arch: "amd64", - }, - } - cliplugin := v1alpha1.CLIPlugin{ - ObjectMeta: metav1.ObjectMeta{ - Name: options.Name, - }, - Spec: v1alpha1.CLIPluginSpec{ - Description: options.Description, - RecommendedVersion: options.RecommendedVersion, - Artifacts: map[string]v1alpha1.ArtifactList{ - "v1.0.0": artifacts, - }, - }, - } - return cliplugin -} diff --git a/cli/core/pkg/fakes/helper/types.go b/cli/core/pkg/fakes/helper/types.go deleted file mode 100644 index ab1c0fd06a..0000000000 --- a/cli/core/pkg/fakes/helper/types.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package helper - -// TestCLIPluginOption describes options for CLIPlugin -type TestCLIPluginOption struct { - Name string - Description string - RecommendedVersion string -} diff --git a/cli/core/pkg/fakes/http_client_fake.go b/cli/core/pkg/fakes/http_client_fake.go deleted file mode 100644 index b113d98b0c..0000000000 --- a/cli/core/pkg/fakes/http_client_fake.go +++ /dev/null @@ -1,117 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "net/http" - "sync" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/interfaces" -) - -type FakeHTTPClient struct { - DoStub func(*http.Request) (*http.Response, error) - doMutex sync.RWMutex - doArgsForCall []struct { - arg1 *http.Request - } - doReturns struct { - result1 *http.Response - result2 error - } - doReturnsOnCall map[int]struct { - result1 *http.Response - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *FakeHTTPClient) Do(arg1 *http.Request) (*http.Response, error) { - fake.doMutex.Lock() - ret, specificReturn := fake.doReturnsOnCall[len(fake.doArgsForCall)] - fake.doArgsForCall = append(fake.doArgsForCall, struct { - arg1 *http.Request - }{arg1}) - stub := fake.DoStub - fakeReturns := fake.doReturns - fake.recordInvocation("Do", []interface{}{arg1}) - fake.doMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FakeHTTPClient) DoCallCount() int { - fake.doMutex.RLock() - defer fake.doMutex.RUnlock() - return len(fake.doArgsForCall) -} - -func (fake *FakeHTTPClient) DoCalls(stub func(*http.Request) (*http.Response, error)) { - fake.doMutex.Lock() - defer fake.doMutex.Unlock() - fake.DoStub = stub -} - -func (fake *FakeHTTPClient) DoArgsForCall(i int) *http.Request { - fake.doMutex.RLock() - defer fake.doMutex.RUnlock() - argsForCall := fake.doArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *FakeHTTPClient) DoReturns(result1 *http.Response, result2 error) { - fake.doMutex.Lock() - defer fake.doMutex.Unlock() - fake.DoStub = nil - fake.doReturns = struct { - result1 *http.Response - result2 error - }{result1, result2} -} - -func (fake *FakeHTTPClient) DoReturnsOnCall(i int, result1 *http.Response, result2 error) { - fake.doMutex.Lock() - defer fake.doMutex.Unlock() - fake.DoStub = nil - if fake.doReturnsOnCall == nil { - fake.doReturnsOnCall = make(map[int]struct { - result1 *http.Response - result2 error - }) - } - fake.doReturnsOnCall[i] = struct { - result1 *http.Response - result2 error - }{result1, result2} -} - -func (fake *FakeHTTPClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.doMutex.RLock() - defer fake.doMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *FakeHTTPClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ interfaces.HTTPClient = new(FakeHTTPClient) diff --git a/cli/core/pkg/fakes/registy.go b/cli/core/pkg/fakes/registy.go deleted file mode 100644 index c3a7d003c9..0000000000 --- a/cli/core/pkg/fakes/registy.go +++ /dev/null @@ -1,352 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/registry" -) - -type Registry struct { - DownloadBundleStub func(string, string) error - downloadBundleMutex sync.RWMutex - downloadBundleArgsForCall []struct { - arg1 string - arg2 string - } - downloadBundleReturns struct { - result1 error - } - downloadBundleReturnsOnCall map[int]struct { - result1 error - } - GetFileStub func(string, string) ([]byte, error) - getFileMutex sync.RWMutex - getFileArgsForCall []struct { - arg1 string - arg2 string - } - getFileReturns struct { - result1 []byte - result2 error - } - getFileReturnsOnCall map[int]struct { - result1 []byte - result2 error - } - GetFilesStub func(string) (map[string][]byte, error) - getFilesMutex sync.RWMutex - getFilesArgsForCall []struct { - arg1 string - } - getFilesReturns struct { - result1 map[string][]byte - result2 error - } - getFilesReturnsOnCall map[int]struct { - result1 map[string][]byte - result2 error - } - ListImageTagsStub func(string) ([]string, error) - listImageTagsMutex sync.RWMutex - listImageTagsArgsForCall []struct { - arg1 string - } - listImageTagsReturns struct { - result1 []string - result2 error - } - listImageTagsReturnsOnCall map[int]struct { - result1 []string - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *Registry) DownloadBundle(arg1 string, arg2 string) error { - fake.downloadBundleMutex.Lock() - ret, specificReturn := fake.downloadBundleReturnsOnCall[len(fake.downloadBundleArgsForCall)] - fake.downloadBundleArgsForCall = append(fake.downloadBundleArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.DownloadBundleStub - fakeReturns := fake.downloadBundleReturns - fake.recordInvocation("DownloadBundle", []interface{}{arg1, arg2}) - fake.downloadBundleMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Registry) DownloadBundleCallCount() int { - fake.downloadBundleMutex.RLock() - defer fake.downloadBundleMutex.RUnlock() - return len(fake.downloadBundleArgsForCall) -} - -func (fake *Registry) DownloadBundleCalls(stub func(string, string) error) { - fake.downloadBundleMutex.Lock() - defer fake.downloadBundleMutex.Unlock() - fake.DownloadBundleStub = stub -} - -func (fake *Registry) DownloadBundleArgsForCall(i int) (string, string) { - fake.downloadBundleMutex.RLock() - defer fake.downloadBundleMutex.RUnlock() - argsForCall := fake.downloadBundleArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Registry) DownloadBundleReturns(result1 error) { - fake.downloadBundleMutex.Lock() - defer fake.downloadBundleMutex.Unlock() - fake.DownloadBundleStub = nil - fake.downloadBundleReturns = struct { - result1 error - }{result1} -} - -func (fake *Registry) DownloadBundleReturnsOnCall(i int, result1 error) { - fake.downloadBundleMutex.Lock() - defer fake.downloadBundleMutex.Unlock() - fake.DownloadBundleStub = nil - if fake.downloadBundleReturnsOnCall == nil { - fake.downloadBundleReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.downloadBundleReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Registry) GetFile(arg1 string, arg2 string) ([]byte, error) { - fake.getFileMutex.Lock() - ret, specificReturn := fake.getFileReturnsOnCall[len(fake.getFileArgsForCall)] - fake.getFileArgsForCall = append(fake.getFileArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetFileStub - fakeReturns := fake.getFileReturns - fake.recordInvocation("GetFile", []interface{}{arg1, arg2}) - fake.getFileMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Registry) GetFileCallCount() int { - fake.getFileMutex.RLock() - defer fake.getFileMutex.RUnlock() - return len(fake.getFileArgsForCall) -} - -func (fake *Registry) GetFileCalls(stub func(string, string) ([]byte, error)) { - fake.getFileMutex.Lock() - defer fake.getFileMutex.Unlock() - fake.GetFileStub = stub -} - -func (fake *Registry) GetFileArgsForCall(i int) (string, string) { - fake.getFileMutex.RLock() - defer fake.getFileMutex.RUnlock() - argsForCall := fake.getFileArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Registry) GetFileReturns(result1 []byte, result2 error) { - fake.getFileMutex.Lock() - defer fake.getFileMutex.Unlock() - fake.GetFileStub = nil - fake.getFileReturns = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *Registry) GetFileReturnsOnCall(i int, result1 []byte, result2 error) { - fake.getFileMutex.Lock() - defer fake.getFileMutex.Unlock() - fake.GetFileStub = nil - if fake.getFileReturnsOnCall == nil { - fake.getFileReturnsOnCall = make(map[int]struct { - result1 []byte - result2 error - }) - } - fake.getFileReturnsOnCall[i] = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *Registry) GetFiles(arg1 string) (map[string][]byte, error) { - fake.getFilesMutex.Lock() - ret, specificReturn := fake.getFilesReturnsOnCall[len(fake.getFilesArgsForCall)] - fake.getFilesArgsForCall = append(fake.getFilesArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetFilesStub - fakeReturns := fake.getFilesReturns - fake.recordInvocation("GetFiles", []interface{}{arg1}) - fake.getFilesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Registry) GetFilesCallCount() int { - fake.getFilesMutex.RLock() - defer fake.getFilesMutex.RUnlock() - return len(fake.getFilesArgsForCall) -} - -func (fake *Registry) GetFilesCalls(stub func(string) (map[string][]byte, error)) { - fake.getFilesMutex.Lock() - defer fake.getFilesMutex.Unlock() - fake.GetFilesStub = stub -} - -func (fake *Registry) GetFilesArgsForCall(i int) string { - fake.getFilesMutex.RLock() - defer fake.getFilesMutex.RUnlock() - argsForCall := fake.getFilesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Registry) GetFilesReturns(result1 map[string][]byte, result2 error) { - fake.getFilesMutex.Lock() - defer fake.getFilesMutex.Unlock() - fake.GetFilesStub = nil - fake.getFilesReturns = struct { - result1 map[string][]byte - result2 error - }{result1, result2} -} - -func (fake *Registry) GetFilesReturnsOnCall(i int, result1 map[string][]byte, result2 error) { - fake.getFilesMutex.Lock() - defer fake.getFilesMutex.Unlock() - fake.GetFilesStub = nil - if fake.getFilesReturnsOnCall == nil { - fake.getFilesReturnsOnCall = make(map[int]struct { - result1 map[string][]byte - result2 error - }) - } - fake.getFilesReturnsOnCall[i] = struct { - result1 map[string][]byte - result2 error - }{result1, result2} -} - -func (fake *Registry) ListImageTags(arg1 string) ([]string, error) { - fake.listImageTagsMutex.Lock() - ret, specificReturn := fake.listImageTagsReturnsOnCall[len(fake.listImageTagsArgsForCall)] - fake.listImageTagsArgsForCall = append(fake.listImageTagsArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ListImageTagsStub - fakeReturns := fake.listImageTagsReturns - fake.recordInvocation("ListImageTags", []interface{}{arg1}) - fake.listImageTagsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Registry) ListImageTagsCallCount() int { - fake.listImageTagsMutex.RLock() - defer fake.listImageTagsMutex.RUnlock() - return len(fake.listImageTagsArgsForCall) -} - -func (fake *Registry) ListImageTagsCalls(stub func(string) ([]string, error)) { - fake.listImageTagsMutex.Lock() - defer fake.listImageTagsMutex.Unlock() - fake.ListImageTagsStub = stub -} - -func (fake *Registry) ListImageTagsArgsForCall(i int) string { - fake.listImageTagsMutex.RLock() - defer fake.listImageTagsMutex.RUnlock() - argsForCall := fake.listImageTagsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Registry) ListImageTagsReturns(result1 []string, result2 error) { - fake.listImageTagsMutex.Lock() - defer fake.listImageTagsMutex.Unlock() - fake.ListImageTagsStub = nil - fake.listImageTagsReturns = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *Registry) ListImageTagsReturnsOnCall(i int, result1 []string, result2 error) { - fake.listImageTagsMutex.Lock() - defer fake.listImageTagsMutex.Unlock() - fake.ListImageTagsStub = nil - if fake.listImageTagsReturnsOnCall == nil { - fake.listImageTagsReturnsOnCall = make(map[int]struct { - result1 []string - result2 error - }) - } - fake.listImageTagsReturnsOnCall[i] = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *Registry) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.downloadBundleMutex.RLock() - defer fake.downloadBundleMutex.RUnlock() - fake.getFileMutex.RLock() - defer fake.getFileMutex.RUnlock() - fake.getFilesMutex.RLock() - defer fake.getFilesMutex.RUnlock() - fake.listImageTagsMutex.RLock() - defer fake.listImageTagsMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *Registry) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ registry.Registry = new(Registry) diff --git a/cli/core/pkg/interfaces/config_client_interface.go b/cli/core/pkg/interfaces/config_client_interface.go deleted file mode 100644 index f67ccfc134..0000000000 --- a/cli/core/pkg/interfaces/config_client_interface.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package interfaces is collection of generic interfaces -package interfaces - -import ( - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -//go:generate counterfeiter -o ../fakes/config_client_fake.go . ConfigClient -type ConfigClientWrapper interface { - GetEnvConfigurations() map[string]string - StoreClientConfig(clientConfig *configapi.ClientConfig) error - AcquireTanzuConfigLock() - ReleaseTanzuConfigLock() -} - -type configClientWrapperImpl struct{} - -func NewConfigClient() ConfigClientWrapper { - return &configClientWrapperImpl{} -} - -func (cc *configClientWrapperImpl) GetEnvConfigurations() map[string]string { - return config.GetEnvConfigurations() -} - -func (cc *configClientWrapperImpl) AcquireTanzuConfigLock() { - config.AcquireTanzuConfigLock() -} - -func (cc *configClientWrapperImpl) ReleaseTanzuConfigLock() { - config.ReleaseTanzuConfigLock() -} - -func (cc *configClientWrapperImpl) StoreClientConfig(clientConfig *configapi.ClientConfig) error { - return config.StoreClientConfig(clientConfig) -} diff --git a/cli/core/pkg/interfaces/http_client_interface.go b/cli/core/pkg/interfaces/http_client_interface.go deleted file mode 100644 index d5fab5e976..0000000000 --- a/cli/core/pkg/interfaces/http_client_interface.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package interfaces - -import "net/http" - -//go:generate counterfeiter -o ../fakes/http_client_fake.go . HTTPClient -type HTTPClient interface { - Do(req *http.Request) (*http.Response, error) -} diff --git a/cli/core/pkg/plugin/types.go b/cli/core/pkg/plugin/types.go deleted file mode 100644 index 4fcc9527e3..0000000000 --- a/cli/core/pkg/plugin/types.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package plugin ... -package plugin - -import ( - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/distribution" -) - -// Discovered defines discovered plugin resource -type Discovered struct { - // Description is the plugin's description. - Name string - - // Description is the plugin's description. - Description string - - // RecommendedVersion is the version that Tanzu CLI should use if available. - // The value should be a valid semantic version as defined in - // https://semver.org/. E.g., 2.0.1 - RecommendedVersion string - - // InstalledVersion is the version that Tanzu CLI should use if available. - // The value should be a valid semantic version as defined in - // https://semver.org/. E.g., 2.0.1 - InstalledVersion string - - // SupportedVersions determines the list of supported CLI plugin versions. - // The values are sorted in the semver prescribed order as defined in - // https://github.com/Masterminds/semver#sorting-semantic-versions. - SupportedVersions []string - - // Distribution is an interface to download a single plugin binary. - Distribution distribution.Distribution - - // Optional specifies whether the plugin is mandatory or optional - // If optional, the plugin will not get auto-downloaded as part of - // `tanzu login` or `tanzu plugin sync` command - // To view the list of plugin, user can use `tanzu plugin list` and - // to download a specific plugin run, `tanzu plugin install ` - Optional bool - - // Scope is the context association level of the plugin. - Scope string - - // Source is the name of the discovery source from where the plugin was - // discovered. - Source string - - // ContextName is the name of the context from where the plugin was discovered. - ContextName string - - // DiscoveryType defines the type of the discovery. Possible values are - // oci, local or kubernetes - DiscoveryType string - - // Target defines the target to which this plugin is applicable to - Target cliv1alpha1.Target - - // Status is the installed/uninstalled status of the plugin. - Status string -} - -// DiscoveredSorter sorts discovered objects. -type DiscoveredSorter []Discovered - -func (d DiscoveredSorter) Len() int { return len(d) } -func (d DiscoveredSorter) Swap(i, j int) { d[i], d[j] = d[j], d[i] } -func (d DiscoveredSorter) Less(i, j int) bool { - if d[i].Target != d[j].Target { - return d[i].Target < d[j].Target - } - return d[i].Name < d[j].Name -} diff --git a/cli/core/pkg/pluginmanager/default_discoveries.go b/cli/core/pkg/pluginmanager/default_discoveries.go deleted file mode 100644 index d075ee9482..0000000000 --- a/cli/core/pkg/pluginmanager/default_discoveries.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package pluginmanager - -import ( - "fmt" - "strings" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func defaultDiscoverySourceBasedOnServer(server *configapi.Server) []configapi.PluginDiscovery { - var defaultDiscoveries []configapi.PluginDiscovery - // If current server type is management-cluster, then add - // the default kubernetes discovery endpoint pointing to the - // management-cluster kubeconfig - if server.Type == configapi.ManagementClusterServerType && server.ManagementClusterOpts != nil { - defaultDiscoveries = append(defaultDiscoveries, defaultDiscoverySourceForK8sTargetedContext(server.Name, server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context)) - } - return defaultDiscoveries -} - -func defaultDiscoverySourceBasedOnContext(context *configapi.Context) []configapi.PluginDiscovery { - var defaultDiscoveries []configapi.PluginDiscovery - - // If current context is of type k8s, then add the default - // kubernetes discovery endpoint pointing to the cluster kubeconfig - // If the current context is of type tmc, then add the default REST endpoint - // for the tmc discovery service - if context.Target == cliv1alpha1.TargetK8s && context.ClusterOpts != nil { - defaultDiscoveries = append(defaultDiscoveries, defaultDiscoverySourceForK8sTargetedContext(context.Name, context.ClusterOpts.Path, context.ClusterOpts.Context)) - } else if context.Target == cliv1alpha1.TargetTMC && context.GlobalOpts != nil { - defaultDiscoveries = append(defaultDiscoveries, defaultDiscoverySourceForTMCTargetedContext(context)) - } - return defaultDiscoveries -} - -func defaultDiscoverySourceForK8sTargetedContext(name, kubeconfig, context string) configapi.PluginDiscovery { - return configapi.PluginDiscovery{ - Kubernetes: &configapi.KubernetesDiscovery{ - Name: fmt.Sprintf("default-%s", name), - Path: kubeconfig, - Context: context, - }, - } -} - -func defaultDiscoverySourceForTMCTargetedContext(context *configapi.Context) configapi.PluginDiscovery { - return configapi.PluginDiscovery{ - REST: &configapi.GenericRESTDiscovery{ - Name: fmt.Sprintf("default-%s", context.Name), - Endpoint: appendURLScheme(context.GlobalOpts.Endpoint), - BasePath: "v1alpha1/system/binaries/plugins", - }, - } -} - -func appendURLScheme(endpoint string) string { - e := strings.Split(endpoint, ":")[0] - if !strings.Contains(e, "https") { - return fmt.Sprintf("https://%s", e) - } - return e -} diff --git a/cli/core/pkg/pluginmanager/default_discoveries_test.go b/cli/core/pkg/pluginmanager/default_discoveries_test.go deleted file mode 100644 index 44349090cf..0000000000 --- a/cli/core/pkg/pluginmanager/default_discoveries_test.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package pluginmanager - -import ( - "os" - "testing" - - configlib "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/stretchr/testify/assert" -) - -func Test_defaultDiscoverySourceBasedOnServer(t *testing.T) { - tanzuConfigBytes := `apiVersion: config.tanzu.vmware.com/v1alpha1 -clientOptions: - cli: - useContextAwareDiscovery: true -current: mgmt -kind: ClientConfig -metadata: - creationTimestamp: null -servers: -- managementClusterOpts: - context: mgmt-admin@mgmt - path: config - name: mgmt - type: managementcluster -` - f, err := os.CreateTemp("", "tanzu_config") - assert.Nil(t, err) - err = os.WriteFile(f.Name(), []byte(tanzuConfigBytes), 0644) - assert.Nil(t, err) - defer func(name string) { - err = os.Remove(name) - assert.NoError(t, err) - }(f.Name()) - err = os.Setenv("TANZU_CONFIG", f.Name()) - assert.NoError(t, err) - - f2, err := os.CreateTemp("", "tanzu_config") - assert.Nil(t, err) - err = os.WriteFile(f2.Name(), []byte(""), 0644) - assert.Nil(t, err) - defer func(name string) { - err = os.Remove(name) - assert.NoError(t, err) - }(f2.Name()) - err = os.Setenv("TANZU_CONFIG_NEXT_GEN", f2.Name()) - assert.NoError(t, err) - - server, err := configlib.GetServer("mgmt") - assert.Nil(t, err) - pds := append(server.DiscoverySources, defaultDiscoverySourceBasedOnServer(server)...) - assert.Equal(t, 1, len(pds)) - assert.Equal(t, pds[0].Kubernetes.Name, "default-mgmt") - assert.Equal(t, pds[0].Kubernetes.Path, "config") - assert.Equal(t, pds[0].Kubernetes.Context, "mgmt-admin@mgmt") -} - -func Test_defaultDiscoverySourceBasedOnContext(t *testing.T) { - // Test tmc global server - tanzuConfigBytes := `apiVersion: config.tanzu.vmware.com/v1alpha1 -clientOptions: - cli: - useContextAwareDiscovery: true -current: tmc-test -kind: ClientConfig -metadata: - creationTimestamp: null -` - nextGenCfgBytes := `contexts: -- globalOpts: - endpoint: test.cloud.vmware.com:443 - name: tmc-test - target: mission-control -- clusterOpts: - context: mgmt-admin@mgmt - path: config - name: mgmt - target: kubernetes` - tf, err := os.CreateTemp("", "tanzu_tmc_config") - assert.Nil(t, err) - err = os.WriteFile(tf.Name(), []byte(tanzuConfigBytes), 0644) - assert.Nil(t, err) - defer func(name string) { - err = os.Remove(name) - assert.NoError(t, err) - }(tf.Name()) - err = os.Setenv("TANZU_CONFIG", tf.Name()) - assert.Nil(t, err) - - f2, err := os.CreateTemp("", "tanzu_config") - assert.Nil(t, err) - err = os.WriteFile(f2.Name(), []byte(nextGenCfgBytes), 0644) - assert.Nil(t, err) - defer func(name string) { - err = os.Remove(name) - assert.NoError(t, err) - }(f2.Name()) - err = os.Setenv("TANZU_CONFIG_NEXT_GEN", f2.Name()) - assert.NoError(t, err) - - context, err := configlib.GetContext("tmc-test") - assert.Nil(t, err) - pdsTMC := append(context.DiscoverySources, defaultDiscoverySourceBasedOnContext(context)...) - assert.Equal(t, 1, len(pdsTMC)) - assert.Equal(t, pdsTMC[0].REST.Endpoint, "https://test.cloud.vmware.com") - assert.Equal(t, pdsTMC[0].REST.BasePath, "v1alpha1/system/binaries/plugins") - assert.Equal(t, pdsTMC[0].REST.Name, "default-tmc-test") - - context, err = configlib.GetContext("mgmt") - assert.Nil(t, err) - pdsK8s := append(context.DiscoverySources, defaultDiscoverySourceBasedOnContext(context)...) - assert.Equal(t, 1, len(pdsK8s)) - assert.Equal(t, pdsK8s[0].Kubernetes.Name, "default-mgmt") - assert.Equal(t, pdsK8s[0].Kubernetes.Path, "config") - assert.Equal(t, pdsK8s[0].Kubernetes.Context, "mgmt-admin@mgmt") -} diff --git a/cli/core/pkg/pluginmanager/manager.go b/cli/core/pkg/pluginmanager/manager.go deleted file mode 100644 index 5efd57e890..0000000000 --- a/cli/core/pkg/pluginmanager/manager.go +++ /dev/null @@ -1,1061 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package pluginmanager is responsible for plugin discovery and installation -package pluginmanager - -import ( - "crypto/sha256" - "encoding/json" - "fmt" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - - "github.com/aunum/log" - "github.com/pkg/errors" - "go.uber.org/multierr" - "golang.org/x/mod/semver" - "gopkg.in/yaml.v2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - kerrors "k8s.io/apimachinery/pkg/util/errors" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/artifact" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/catalog" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/discovery" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - configlib "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -const ( - // exe is an executable file extension - exe = ".exe" - // ManifestFileName is the file name for the manifest. - ManifestFileName = "manifest.yaml" - // PluginFileName is the file name for the plugin descriptor. - PluginFileName = "plugin.yaml" -) - -var execCommand = exec.Command - -type DeletePluginOptions struct { - Target cliv1alpha1.Target - PluginName string - ForceDelete bool -} - -// ValidatePlugin validates the plugin descriptor. -func ValidatePlugin(p *cliapi.PluginDescriptor) (err error) { - // skip builder plugin for bootstrapping - if p.Name == "builder" { - return nil - } - if p.Name == "" { - err = multierr.Append(err, errors.New("plugin name cannot be empty")) - } - if p.Version == "" { - err = multierr.Append(err, fmt.Errorf("plugin %q version cannot be empty", p.Name)) - } - if !semver.IsValid(p.Version) && p.Version != "dev" { - err = multierr.Append(err, fmt.Errorf("version %q %q is not a valid semantic version", p.Name, p.Version)) - } - if p.Description == "" { - err = multierr.Append(err, fmt.Errorf("plugin %q description cannot be empty", p.Name)) - } - if p.Group == "" { - err = multierr.Append(err, fmt.Errorf("plugin %q group cannot be empty", p.Name)) - } - return -} - -func discoverPlugins(pd []configapi.PluginDiscovery) ([]plugin.Discovered, error) { - allPlugins := make([]plugin.Discovered, 0) - for _, d := range pd { - discObject, err := discovery.CreateDiscoveryFromV1alpha1(d) - if err != nil { - return nil, errors.Wrapf(err, "unable to create discovery") - } - - plugins, err := discObject.List() - if err != nil { - log.Warningf("unable to list plugin from discovery '%v': %v", discObject.Name(), err.Error()) - continue - } - - allPlugins = append(allPlugins, plugins...) - } - return allPlugins, nil -} - -// DiscoverStandalonePlugins returns the available standalone plugins -func DiscoverStandalonePlugins() (plugins []plugin.Discovered, err error) { - cfg, e := configlib.GetClientConfig() - if e != nil { - err = errors.Wrapf(e, "unable to get client configuration") - return - } - - if cfg == nil || cfg.ClientOptions == nil || cfg.ClientOptions.CLI == nil { - plugins = []plugin.Discovered{} - return - } - - plugins, err = discoverPlugins(cfg.ClientOptions.CLI.DiscoverySources) - if err != nil { - return - } - - for i := range plugins { - plugins[i].Scope = common.PluginScopeStandalone - plugins[i].Status = common.PluginStatusNotInstalled - } - return -} - -// DiscoverServerPlugins returns the available plugins associated all the active contexts -func DiscoverServerPlugins() ([]plugin.Discovered, error) { - // If the context and target feature is enabled, discover plugins from all currentContexts - // Else discover plugin based on current Server - if configlib.IsFeatureActivated(config.FeatureContextCommand) { - return discoverServerPluginsBasedOnAllCurrentContexts() - } - return discoverServerPluginsBasedOnCurrentServer() -} - -func discoverServerPluginsBasedOnAllCurrentContexts() ([]plugin.Discovered, error) { - var plugins []plugin.Discovered - var errList []error - - currentContextMap, err := configlib.GetAllCurrentContextsMap() - if err != nil { - return nil, err - } - if len(currentContextMap) == 0 { - return plugins, nil - } - - for _, context := range currentContextMap { - var discoverySources []configapi.PluginDiscovery - discoverySources = append(discoverySources, context.DiscoverySources...) - discoverySources = append(discoverySources, defaultDiscoverySourceBasedOnContext(context)...) - discoveredPlugins, err := discoverPlugins(discoverySources) - if err != nil { - errList = append(errList, err) - continue - } - for i := range discoveredPlugins { - discoveredPlugins[i].Scope = common.PluginScopeContext - discoveredPlugins[i].Status = common.PluginStatusNotInstalled - discoveredPlugins[i].ContextName = context.Name - - // Associate Target of the plugin based on the Context Type of the Context - switch context.Target { - case cliv1alpha1.TargetTMC: - discoveredPlugins[i].Target = cliv1alpha1.TargetTMC - case cliv1alpha1.TargetK8s: - discoveredPlugins[i].Target = cliv1alpha1.TargetK8s - } - } - plugins = append(plugins, discoveredPlugins...) - } - return plugins, kerrors.NewAggregate(errList) -} - -// discoverServerPluginsBasedOnCurrentServer returns the available plugins associated with the given server -func discoverServerPluginsBasedOnCurrentServer() ([]plugin.Discovered, error) { - var plugins []plugin.Discovered - - server, err := configlib.GetCurrentServer() - if err != nil || server == nil { - // If servername is not specified than returning empty list - // as there are no server plugins that can be discovered - return plugins, nil - } - var discoverySources []configapi.PluginDiscovery - discoverySources = append(discoverySources, server.DiscoverySources...) - discoverySources = append(discoverySources, defaultDiscoverySourceBasedOnServer(server)...) - - plugins, err = discoverPlugins(discoverySources) - if err != nil { - return plugins, err - } - for i := range plugins { - plugins[i].Scope = common.PluginScopeContext - plugins[i].Status = common.PluginStatusNotInstalled - } - return plugins, nil -} - -// DiscoverPlugins returns all the discovered plugins including standalone and context-scoped plugins -// Context scoped plugin discovery happens for all active contexts -func DiscoverPlugins() ([]plugin.Discovered, []plugin.Discovered) { - serverPlugins, err := DiscoverServerPlugins() - if err != nil { - log.Warningf("unable to discover server plugins, %v", err.Error()) - } - - standalonePlugins, err := DiscoverStandalonePlugins() - if err != nil { - log.Warningf("unable to discover standalone plugins, %v", err.Error()) - } - - // TODO(anuj): Remove duplicate plugins with server plugins getting higher priority - return serverPlugins, standalonePlugins -} - -// AvailablePlugins returns the list of available plugins including discovered and installed plugins. -// Plugin discovery happens for all active contexts -func AvailablePlugins() ([]plugin.Discovered, error) { - discoveredServerPlugins, discoveredStandalonePlugins := DiscoverPlugins() - return availablePlugins(discoveredServerPlugins, discoveredStandalonePlugins) -} - -// AvailablePluginsFromLocalSource returns the list of available plugins from local source -func AvailablePluginsFromLocalSource(localPath string) ([]plugin.Discovered, error) { - localStandalonePlugins, err := DiscoverPluginsFromLocalSource(localPath) - if err != nil { - log.Warningf("Unable to discover standalone plugins from local source, %v", err.Error()) - } - return availablePlugins([]plugin.Discovered{}, localStandalonePlugins) -} - -func availablePlugins(discoveredServerPlugins, discoveredStandalonePlugins []plugin.Discovered) ([]plugin.Discovered, error) { - installedServerPluginDesc, installedStandalonePluginDesc, err := InstalledPlugins() - if err != nil { - return nil, err - } - - availablePlugins := availablePluginsFromStandaloneAndServerPlugins(discoveredServerPlugins, discoveredStandalonePlugins) - - setAvailablePluginsStatus(availablePlugins, installedServerPluginDesc) - setAvailablePluginsStatus(availablePlugins, installedStandalonePluginDesc) - - installedButNotDiscoveredPlugins := getInstalledButNotDiscoveredStandalonePlugins(availablePlugins, installedStandalonePluginDesc) - availablePlugins = append(availablePlugins, installedButNotDiscoveredPlugins...) - - availablePlugins = combineDuplicatePlugins(availablePlugins) - - return availablePlugins, nil -} - -// combineDuplicatePlugins combines same plugins to eliminate duplicates -// When there is a plugin name conflicts and target of both the plugins are same, remove duplicate one. -// In addition to above, plugin with same name having `k8s` and `none` target are also considered same for -// backward compatibility reasons. Considering, we are adding `k8s` targeted plugins as root level commands. -// -// E.g. A plugin 'foo' getting discovered/installed with `` target and a plugin `foo` getting discovered -// with `k8s` discovery (having `k8s` target) should be treated as same plugin. -// This function takes this case into consideration and removes `` targeted plugin for above the mentioned scenario. -func combineDuplicatePlugins(availablePlugins []plugin.Discovered) []plugin.Discovered { - mapOfSelectedPlugins := make(map[string]plugin.Discovered) - - // TODO: If there are multiple discovered (but not installed) plugins of the same name then we will - // always end up keeping one deterministically (due to the sequence of sources/plugins that we process), - // but we should merge the result and show the combined result for duplicate plugins - combinePluginInstallationStatus := func(plugin1, plugin2 plugin.Discovered) plugin.Discovered { - // Combine the installation status and installedVersion result when combining plugins - if plugin2.Status == common.PluginStatusInstalled { - plugin1.Status = common.PluginStatusInstalled - } - if plugin2.InstalledVersion != "" { - plugin1.InstalledVersion = plugin2.InstalledVersion - } - return plugin1 - } - - for i := range availablePlugins { - if availablePlugins[i].Target == cliv1alpha1.TargetNone { - // As we are considering None targeted and k8s target plugin to be treated as same plugins - // in the case of plugin name conflicts, using `k8s` target to determine the plugin already - // exists or not. - // If plugin already exists in the map then combining the installation status for both the plugins - key := fmt.Sprintf("%s_%s", availablePlugins[i].Name, cliv1alpha1.TargetK8s) - dp, exists := mapOfSelectedPlugins[key] - if !exists { - mapOfSelectedPlugins[key] = availablePlugins[i] - } else { - mapOfSelectedPlugins[key] = combinePluginInstallationStatus(dp, availablePlugins[i]) - } - } else { - // If plugin doesn't exist in the map then add the plugin to the map - // else combine the installation status for both the plugins - key := fmt.Sprintf("%s_%s", availablePlugins[i].Name, availablePlugins[i].Target) - dp, exists := mapOfSelectedPlugins[key] - if !exists { - mapOfSelectedPlugins[key] = availablePlugins[i] - } else if availablePlugins[i].Target == cliv1alpha1.TargetK8s || availablePlugins[i].Scope == common.PluginScopeContext { - mapOfSelectedPlugins[key] = combinePluginInstallationStatus(availablePlugins[i], dp) - } - } - } - - var selectedPlugins []plugin.Discovered - for key := range mapOfSelectedPlugins { - selectedPlugins = append(selectedPlugins, mapOfSelectedPlugins[key]) - } - - return selectedPlugins -} - -func getInstalledButNotDiscoveredStandalonePlugins(availablePlugins []plugin.Discovered, installedPluginDesc []cliapi.PluginDescriptor) []plugin.Discovered { - var newPlugins []plugin.Discovered - for i := range installedPluginDesc { - found := false - for j := range availablePlugins { - if installedPluginDesc[i].Name == availablePlugins[j].Name && installedPluginDesc[i].Target == availablePlugins[j].Target { - found = true - // If plugin is installed but marked as not installed as part of availablePlugins list - // mark the plugin as installed - // This is possible if user has used --local mode to install the plugin which is also - // getting discovered from the configured discovery sources - if availablePlugins[j].Status == common.PluginStatusNotInstalled { - availablePlugins[j].Status = common.PluginStatusInstalled - } - } - } - if !found { - p := DiscoveredFromPluginDescriptor(&installedPluginDesc[i]) - p.Scope = common.PluginScopeStandalone - p.Status = common.PluginStatusInstalled - p.InstalledVersion = installedPluginDesc[i].Version - newPlugins = append(newPlugins, p) - } - } - return newPlugins -} - -// DiscoveredFromPluginDescriptor returns discovered plugin object from k8sV1alpha1 -func DiscoveredFromPluginDescriptor(p *cliapi.PluginDescriptor) plugin.Discovered { - dp := plugin.Discovered{ - Name: p.Name, - Description: p.Description, - RecommendedVersion: p.Version, - Source: p.Discovery, - SupportedVersions: []string{p.Version}, - } - return dp -} - -func setAvailablePluginsStatus(availablePlugins []plugin.Discovered, installedPluginDesc []cliapi.PluginDescriptor) { - for i := range installedPluginDesc { - for j := range availablePlugins { - if installedPluginDesc[i].Name == availablePlugins[j].Name && installedPluginDesc[i].Target == availablePlugins[j].Target { - // Match found, Check for update available and update status - if installedPluginDesc[i].DiscoveredRecommendedVersion == availablePlugins[j].RecommendedVersion { - availablePlugins[j].Status = common.PluginStatusInstalled - } else { - availablePlugins[j].Status = common.PluginStatusUpdateAvailable - } - availablePlugins[j].InstalledVersion = installedPluginDesc[i].Version - } - } - } -} - -func availablePluginsFromStandaloneAndServerPlugins(discoveredServerPlugins, discoveredStandalonePlugins []plugin.Discovered) []plugin.Discovered { - availablePlugins := discoveredServerPlugins - - // Check whether the default standalone discovery type is local or not - isLocalStandaloneDiscovery := config.GetDefaultStandaloneDiscoveryType() == common.DiscoveryTypeLocal - - for i := range discoveredStandalonePlugins { - matchIndex := pluginIndexForName(availablePlugins, &discoveredStandalonePlugins[i]) - - // Add the standalone plugin to available plugins if it doesn't exist in the serverPlugins list - // OR - // Current standalone discovery or plugin discovered is of type 'local' - // We are overriding the discovered plugins that we got from server in case of 'local' discovery type - // to allow developers to use the plugins that are built locally and not returned from the server - // This local discovery is only used for development purpose and should not be used for production - if matchIndex < 0 { - availablePlugins = append(availablePlugins, discoveredStandalonePlugins[i]) - continue - } - if isLocalStandaloneDiscovery || discoveredStandalonePlugins[i].DiscoveryType == common.DiscoveryTypeLocal { // matchIndex >= 0 is guaranteed here - availablePlugins[matchIndex] = discoveredStandalonePlugins[i] - } - } - return availablePlugins -} - -func pluginIndexForName(availablePlugins []plugin.Discovered, p *plugin.Discovered) int { - for j := range availablePlugins { - if p != nil && p.Name == availablePlugins[j].Name && p.Target == availablePlugins[j].Target { - return j - } - } - return -1 // haven't found a match -} - -// InstalledPlugins returns the list of installed context-scoped and standalone plugins. -func InstalledPlugins() (serverPlugins, standalonePlugins []cliapi.PluginDescriptor, err error) { - serverPlugins, err = InstalledServerPlugins() - if err != nil { - return nil, nil, err - } - standalonePlugins, err = InstalledStandalonePlugins() - if err != nil { - return nil, nil, err - } - return -} - -// InstalledStandalonePlugins returns the installed standalone plugins. -func InstalledStandalonePlugins() ([]cliapi.PluginDescriptor, error) { - standAloneCatalog, err := catalog.NewContextCatalog("") - if err != nil { - return nil, err - } - standalonePlugins := standAloneCatalog.List() - return standalonePlugins, nil -} - -// InstalledServerPlugins returns the installed server plugins. -func InstalledServerPlugins() ([]cliapi.PluginDescriptor, error) { - serverNames, err := configlib.GetAllCurrentContextsList() - if err != nil { - return nil, err - } - - var serverPlugins []cliapi.PluginDescriptor - for _, serverName := range serverNames { - if serverName != "" { - serverCatalog, err := catalog.NewContextCatalog(serverName) - if err != nil { - return nil, err - } - serverPlugins = append(serverPlugins, serverCatalog.List()...) - } - } - - return serverPlugins, nil -} - -// DescribePlugin describes a plugin. -func DescribePlugin(pluginName string, target cliv1alpha1.Target) (desc *cliapi.PluginDescriptor, err error) { - serverPlugins, standalonePlugins, err := InstalledPlugins() - if err != nil { - return nil, err - } - var matchedPlugins []cliapi.PluginDescriptor - - pds := serverPlugins - pds = append(pds, standalonePlugins...) - for i := range pds { - if pds[i].Name == pluginName { - matchedPlugins = append(matchedPlugins, pds[i]) - } - } - - if len(matchedPlugins) == 0 { - return nil, errors.Errorf("unable to find plugin '%v'", pluginName) - } - if len(matchedPlugins) == 1 { - return &matchedPlugins[0], nil - } - - for i := range matchedPlugins { - if matchedPlugins[i].Target == target { - return &matchedPlugins[i], nil - } - } - - return nil, errors.Errorf("unable to uniquely identify plugin '%v'. Please specify correct Target(kubernetes[k8s]/mission-control[tmc]) of the plugin with `--target` flag", pluginName) -} - -// InitializePlugin initializes the plugin configuration -func InitializePlugin(descriptor *cliapi.PluginDescriptor) error { - if descriptor == nil { - return fmt.Errorf("could not get plugin information") - } - - b, err := execCommand(descriptor.InstallationPath, "post-install").CombinedOutput() - - // Note: If user is installing old version of plugin than it is possible that - // the plugin does not implement post-install command. Ignoring the - // errors if the command does not exist for a particular plugin. - if err != nil && !strings.Contains(string(b), "unknown command") { - log.Warningf("Warning: Failed to initialize plugin '%q' after installation. %v", descriptor.Name, string(b)) - } - - return nil -} - -// InstallPlugin installs a plugin from the given repository. -func InstallPlugin(pluginName, version string, target cliv1alpha1.Target) error { - availablePlugins, err := AvailablePlugins() - if err != nil { - return err - } - - var matchedPlugins []plugin.Discovered - for i := range availablePlugins { - if availablePlugins[i].Name == pluginName { - matchedPlugins = append(matchedPlugins, availablePlugins[i]) - } - } - if len(matchedPlugins) == 0 { - return errors.Errorf("unable to find plugin '%v'", pluginName) - } - - if len(matchedPlugins) == 1 { - return installOrUpgradePlugin(&matchedPlugins[0], version, false) - } - - for i := range matchedPlugins { - if matchedPlugins[i].Target == target { - return installOrUpgradePlugin(&matchedPlugins[i], version, false) - } - } - - return errors.Errorf("unable to uniquely identify plugin '%v'. Please specify correct Target(kubernetes[k8s]/mission-control[tmc]) of the plugin with `--target` flag", pluginName) -} - -// UpgradePlugin upgrades a plugin from the given repository. -func UpgradePlugin(pluginName, version string, target cliv1alpha1.Target) error { - return InstallPlugin(pluginName, version, target) -} - -// GetRecommendedVersionOfPlugin returns recommended version of the plugin -func GetRecommendedVersionOfPlugin(pluginName string, target cliv1alpha1.Target) (string, error) { - availablePlugins, err := AvailablePlugins() - if err != nil { - return "", err - } - - var matchedPlugins []plugin.Discovered - for i := range availablePlugins { - if availablePlugins[i].Name == pluginName { - matchedPlugins = append(matchedPlugins, availablePlugins[i]) - } - } - if len(matchedPlugins) == 0 { - return "", errors.Errorf("unable to find plugin '%v'", pluginName) - } - - if len(matchedPlugins) == 1 { - return matchedPlugins[0].RecommendedVersion, nil - } - - for i := range matchedPlugins { - if matchedPlugins[i].Target == target { - return matchedPlugins[i].RecommendedVersion, nil - } - } - return "", errors.Errorf("unable to uniquely identify plugin '%v'. Please specify correct Target(kubernetes[k8s]/mission-control[tmc]) of the plugin with `--target` flag", pluginName) -} - -func installOrUpgradePlugin(p *plugin.Discovered, version string, installTestPlugin bool) error { - if p.Target == cliv1alpha1.TargetNone { - log.Infof("Installing plugin '%v:%v'", p.Name, version) - } else { - log.Infof("Installing plugin '%v:%v' with target '%v'", p.Name, version, p.Target) - } - - binary, err := fetchAndVerifyPlugin(p, version) - if err != nil { - return err - } - - descriptor, err := installAndDescribePlugin(p, version, binary) - if err != nil { - return err - } - - if installTestPlugin { - if err := doInstallTestPlugin(p, version); err != nil { - return err - } - } - - return updateDescriptorAndInitializePlugin(p, descriptor) -} - -func fetchAndVerifyPlugin(p *plugin.Discovered, version string) ([]byte, error) { - // verify plugin before download - err := verifyPluginPreDownload(p) - if err != nil { - return nil, errors.Wrapf(err, "%q plugin pre-download verification failed", p.Name) - } - - b, err := p.Distribution.Fetch(version, runtime.GOOS, runtime.GOARCH) - if err != nil { - return nil, errors.Wrapf(err, "unable to fetch the plugin metadata for plugin %q", p.Name) - } - - // verify plugin after download but before installation - d, err := p.Distribution.GetDigest(version, runtime.GOOS, runtime.GOARCH) - if err != nil { - return nil, err - } - err = verifyPluginPostDownload(p, d, b) - if err != nil { - return nil, errors.Wrapf(err, "%q plugin post-download verification failed", p.Name) - } - return b, nil -} - -func installAndDescribePlugin(p *plugin.Discovered, version string, binary []byte) (*cliapi.PluginDescriptor, error) { - pluginFileName := fmt.Sprintf("%s_%x_%s", version, sha256.Sum256(binary), p.Target) - pluginPath := filepath.Join(common.DefaultPluginRoot, p.Name, pluginFileName) - - if err := os.MkdirAll(filepath.Dir(pluginPath), os.ModePerm); err != nil { - return nil, err - } - - if common.BuildArch().IsWindows() { - pluginPath += exe - } - - if err := os.WriteFile(pluginPath, binary, 0755); err != nil { - return nil, errors.Wrap(err, "could not write file") - } - bytesInfo, err := execCommand(pluginPath, "info").Output() - if err != nil { - return nil, errors.Wrapf(err, "could not describe plugin %q", p.Name) - } - - var descriptor cliapi.PluginDescriptor - if err = json.Unmarshal(bytesInfo, &descriptor); err != nil { - return nil, errors.Wrapf(err, "could not unmarshal plugin %q description", p.Name) - } - descriptor.InstallationPath = pluginPath - descriptor.Discovery = p.Source - descriptor.DiscoveredRecommendedVersion = p.RecommendedVersion - descriptor.Target = p.Target - - return &descriptor, nil -} - -func doInstallTestPlugin(p *plugin.Discovered, version string) error { - log.Infof("Installing test plugin for '%v:%v'", p.Name, version) - binary, err := p.Distribution.FetchTest(version, runtime.GOOS, runtime.GOARCH) - if err != nil { - return errors.Wrapf(err, "unable to install test plugin for '%v:%v'", p.Name, version) - } - testpluginPath := filepath.Join(common.DefaultPluginRoot, p.Name, fmt.Sprintf("test-%s", version)) - err = os.WriteFile(testpluginPath, binary, 0755) - if err != nil { - return errors.Wrap(err, "error while saving test plugin binary") - } - return nil -} - -func updateDescriptorAndInitializePlugin(p *plugin.Discovered, descriptor *cliapi.PluginDescriptor) error { - c, err := catalog.NewContextCatalog(p.ContextName) - if err != nil { - return err - } - if err := c.Upsert(descriptor); err != nil { - log.Info("Plugin descriptor could not be updated in cache") - } - if err := InitializePlugin(descriptor); err != nil { - log.Infof("could not initialize plugin after installing: %v", err.Error()) - } - if err := config.ConfigureDefaultFeatureFlagsIfMissing(descriptor.DefaultFeatureFlags); err != nil { - log.Infof("could not configure default featureflags for the plugin: %v", err.Error()) - } - return nil -} - -// DeletePlugin deletes a plugin. -func DeletePlugin(options DeletePluginOptions) error { - serverNames, err := configlib.GetAllCurrentContextsList() - if err != nil { - return err - } - - var matchedPluginDescriptor cliapi.PluginDescriptor - var matchedPluginCatalog *catalog.ContextCatalog - matchedPluginCount := 0 - - // Add empty serverName for standalone plugins - serverNames = append(serverNames, "") - - for _, serverName := range serverNames { - c, err := catalog.NewContextCatalog(serverName) - if err != nil { - continue - } - - pds := c.List() - for i := range pds { - if pds[i].Name == options.PluginName && (options.Target == "" || options.Target == pds[i].Target) { - matchedPluginDescriptor = pds[i] - matchedPluginCatalog = c - matchedPluginCount++ - } - } - } - - if matchedPluginCount == 0 { - return errors.Errorf("unable to find plugin '%v'", options.PluginName) - } - if matchedPluginCount > 1 { - return errors.Errorf("unable to uniquely identify plugin '%v'. Please specify correct Target(kubernetes[k8s]/mission-control[tmc]) of the plugin with `--target` flag", options.PluginName) - } - - if !options.ForceDelete { - if err := component.AskForConfirmation(fmt.Sprintf("Deleting Plugin '%s'. Are you sure?", options.PluginName)); err != nil { - return err - } - } - err = matchedPluginCatalog.Delete(catalog.PluginNameTarget(matchedPluginDescriptor.Name, matchedPluginDescriptor.Target)) - if err != nil { - return fmt.Errorf("plugin %q could not be deleted from cache", options.PluginName) - } - - // TODO: delete the plugin binary if it is not used by any server - - return nil -} - -// SyncPlugins automatically downloads all available plugins to users machine -func SyncPlugins() error { - log.Info("Checking for required plugins...") - plugins, err := AvailablePlugins() - if err != nil { - return err - } - - installed := false - - errList := make([]error, 0) - for idx := range plugins { - if plugins[idx].Status != common.PluginStatusInstalled { - installed = true - err = InstallPlugin(plugins[idx].Name, plugins[idx].RecommendedVersion, plugins[idx].Target) - if err != nil { - errList = append(errList, err) - } - } - } - err = kerrors.NewAggregate(errList) - if err != nil { - return err - } - - if !installed { - log.Info("All required plugins are already installed and up-to-date") - } else { - log.Info("Successfully installed all required plugins") - } - return nil -} - -// InstallPluginsFromLocalSource installs plugin from local source directory -func InstallPluginsFromLocalSource(pluginName, version string, target cliv1alpha1.Target, localPath string, installTestPlugin bool) error { - // Set default local plugin distro to local-path as while installing the plugin - // from local source we should take t - common.DefaultLocalPluginDistroDir = localPath - - availablePlugins, err := DiscoverPluginsFromLocalSource(localPath) - if err != nil { - return errors.Wrap(err, "unable to discover plugins") - } - - var errList []error - - var matchedPlugins []plugin.Discovered - for i := range availablePlugins { - if pluginName == cli.AllPlugins || availablePlugins[i].Name == pluginName { - matchedPlugins = append(matchedPlugins, availablePlugins[i]) - } - } - if len(matchedPlugins) == 0 { - return errors.Errorf("unable to find plugin '%v'", pluginName) - } - - if len(matchedPlugins) == 1 { - return installOrUpgradePlugin(&matchedPlugins[0], FindVersion(matchedPlugins[0].RecommendedVersion, version), installTestPlugin) - } - - for i := range matchedPlugins { - // Install all plugins otherwise include all matching plugins - if pluginName == cli.AllPlugins || matchedPlugins[i].Target == target { - err = installOrUpgradePlugin(&matchedPlugins[i], FindVersion(matchedPlugins[i].RecommendedVersion, version), installTestPlugin) - if err != nil { - errList = append(errList, err) - } - } - } - - err = kerrors.NewAggregate(errList) - if err != nil { - return err - } - - return nil -} - -// DiscoverPluginsFromLocalSource returns the available plugins that are discovered from the provided local path -func DiscoverPluginsFromLocalSource(localPath string) ([]plugin.Discovered, error) { - if localPath == "" { - return nil, nil - } - - plugins, err := discoverPluginsFromLocalSource(localPath) - // If no error then return the discovered plugins - if err == nil { - return plugins, nil - } - - // Check if the manifest.yaml file exists to see if the directory is legacy structure or not - if _, err2 := os.Stat(filepath.Join(localPath, ManifestFileName)); errors.Is(err2, os.ErrNotExist) { - return nil, err - } - - // As manifest.yaml file exists it assumes in this case the directory is in - // the legacy structure, and attempt to process it as such - return discoverPluginsFromLocalSourceWithLegacyDirectoryStructure(localPath) -} - -func discoverPluginsFromLocalSource(localPath string) ([]plugin.Discovered, error) { - // Set default local plugin distro to localpath while installing the plugin - // from local source. This is done to allow CLI to know the basepath incase the - // relative path is provided as part of CLIPlugin definition for local discovery - common.DefaultLocalPluginDistroDir = localPath - - var pds []configapi.PluginDiscovery - - items, err := os.ReadDir(filepath.Join(localPath, "discovery")) - if err != nil { - return nil, errors.Wrapf(err, "error while reading local plugin manifest directory") - } - for _, item := range items { - if item.IsDir() { - pd := configapi.PluginDiscovery{ - Local: &configapi.LocalDiscovery{ - Name: "", - Path: filepath.Join(localPath, "discovery", item.Name()), - }, - } - pds = append(pds, pd) - } - } - - plugins, err := discoverPlugins(pds) - if err != nil { - return nil, err - } - - for i := range plugins { - plugins[i].Scope = common.PluginScopeStandalone - plugins[i].Status = common.PluginStatusNotInstalled - plugins[i].DiscoveryType = common.DiscoveryTypeLocal - } - return plugins, nil -} - -// Clean deletes all plugins and tests. -func Clean() error { - if err := catalog.CleanCatalogCache(); err != nil { - return errors.Errorf("Failed to clean the catalog cache %v", err) - } - return os.RemoveAll(common.DefaultPluginRoot) -} - -// getCLIPluginResourceWithLocalDistroFromPluginDescriptor return cliv1alpha1.CLIPlugin resource from the plugin descriptor -// Note: This function generates cliv1alpha1.CLIPlugin which contains only single local distribution type artifact for -// OS-ARCH where user is running the cli -// This function is only used to create CLIPlugin resource for local plugin installation with legacy directory structure -func getCLIPluginResourceWithLocalDistroFromPluginDescriptor(pd *cliapi.PluginDescriptor, pluginBinaryPath string) cliv1alpha1.CLIPlugin { - return cliv1alpha1.CLIPlugin{ - ObjectMeta: metav1.ObjectMeta{ - Name: pd.Name, - }, - Spec: cliv1alpha1.CLIPluginSpec{ - Description: pd.Description, - RecommendedVersion: pd.Version, - Artifacts: map[string]cliv1alpha1.ArtifactList{ - pd.Version: []cliv1alpha1.Artifact{ - { - URI: pluginBinaryPath, - Type: common.DistributionTypeLocal, - OS: runtime.GOOS, - Arch: runtime.GOARCH, - }, - }, - }, - }, - } -} - -// discoverPluginsFromLocalSourceWithLegacyDirectoryStructure returns the available plugins -// that are discovered from the provided local path -func discoverPluginsFromLocalSourceWithLegacyDirectoryStructure(localPath string) ([]plugin.Discovered, error) { - if localPath == "" { - return nil, nil - } - - // Get the plugin manifest object from manifest.yaml file - manifest, err := getPluginManifestResource(filepath.Join(localPath, ManifestFileName)) - if err != nil { - return nil, err - } - - var discoveredPlugins []plugin.Discovered - - // Create plugin.Discovered object for all locally available plugin - for _, p := range manifest.Plugins { - if p.Name == cli.CoreName { - continue - } - - // Get the plugin descriptor from the plugin.yaml file - pd, err := getPluginDescriptorResource(filepath.Join(localPath, p.Name, PluginFileName)) - if err != nil { - return nil, fmt.Errorf("could not unmarshal plugin.yaml: %v", err) - } - - absLocalPath, err := filepath.Abs(localPath) - if err != nil { - return nil, err - } - // With legacy configuration directory structure creating the pluginBinary path from plugin descriptor - // Sample path: cli///tanzu--_ - // cli/login/v0.14.0/tanzu-login-darwin_amd64 - // As mentioned above, we expect the binary for user's OS-ARCH is present and hence creating path accordingly - pluginBinaryPath := filepath.Join(absLocalPath, p.Name, pd.Version, fmt.Sprintf("tanzu-%s-%s_%s", p.Name, runtime.GOOS, runtime.GOARCH)) - if common.BuildArch().IsWindows() { - pluginBinaryPath += exe - } - // Check if the pluginBinary file exists or not - if _, err := os.Stat(pluginBinaryPath); errors.Is(err, os.ErrNotExist) { - return nil, errors.Wrapf(err, "unable to find plugin binary for %q", p.Name) - } - - p := getCLIPluginResourceWithLocalDistroFromPluginDescriptor(pd, pluginBinaryPath) - - // Create plugin.Discovered resource from CLIPlugin resource - dp, err := discovery.DiscoveredFromK8sV1alpha1(&p) - if err != nil { - return nil, err - } - dp.DiscoveryType = common.DiscoveryTypeLocal - dp.Scope = common.PluginScopeStandalone - dp.Status = common.PluginStatusNotInstalled - - discoveredPlugins = append(discoveredPlugins, dp) - } - - return discoveredPlugins, nil -} - -// getPluginManifestResource returns cli.Manifest resource by reading manifest file -func getPluginManifestResource(manifestFilePath string) (*cli.Manifest, error) { - b, err := os.ReadFile(manifestFilePath) - if err != nil { - return nil, fmt.Errorf("could not find %s file: %v", filepath.Base(manifestFilePath), err) - } - - var manifest cli.Manifest - err = yaml.Unmarshal(b, &manifest) - if err != nil { - return nil, fmt.Errorf("could not unmarshal %s: %v", filepath.Base(manifestFilePath), err) - } - return &manifest, nil -} - -// getPluginDescriptorResource returns cliapi.PluginDescriptor resource by reading plugin file -func getPluginDescriptorResource(pluginFilePath string) (*cliapi.PluginDescriptor, error) { - b, err := os.ReadFile(pluginFilePath) - if err != nil { - return nil, fmt.Errorf("could not find %s file: %v", filepath.Base(pluginFilePath), err) - } - - var pd cliapi.PluginDescriptor - err = yaml.Unmarshal(b, &pd) - if err != nil { - return nil, fmt.Errorf("could not unmarshal %s: %v", filepath.Base(pluginFilePath), err) - } - return &pd, nil -} - -// verifyPluginPreDownload verifies that the plugin distribution repo is trusted -// and returns error if the verification fails. -func verifyPluginPreDownload(p *plugin.Discovered) error { - artifactInfo, err := p.Distribution.DescribeArtifact(p.RecommendedVersion, runtime.GOOS, runtime.GOARCH) - if err != nil { - return err - } - if artifactInfo.Image != "" { - return verifyRegistry(artifactInfo.Image) - } - if artifactInfo.URI != "" { - return verifyArtifactLocation(artifactInfo.URI) - } - return errors.Errorf("no download information available for artifact \"%s:%s:%s:%s\"", p.Name, p.RecommendedVersion, runtime.GOOS, runtime.GOARCH) -} - -// verifyRegistry verifies the authenticity of the registry from where cli is -// trying to download the plugins by comparing it with the list of trusted registries -func verifyRegistry(image string) error { - trustedRegistries := config.GetTrustedRegistries() - for _, tr := range trustedRegistries { - // Verify fullname of the registry has trusted registry fullname as the prefix - if tr != "" && strings.HasPrefix(image, tr) { - return nil - } - } - return errors.Errorf("untrusted registry detected with image %q. Allowed registries are %v", image, trustedRegistries) -} - -// verifyArtifactLocation verifies the artifact location from where the cli is -// trying to download the plugins by comparing it with the list of trusted locations -func verifyArtifactLocation(uri string) error { - art, err := artifact.NewURIArtifact(uri) - if err != nil { - return err - } - - switch art.(type) { - case *artifact.LocalArtifact: - // trust local artifacts implicitly - return nil - - default: - trustedLocations := config.GetTrustedArtifactLocations() - for _, tl := range trustedLocations { - // Verify that the URI has a trusted location as the prefix - if tl != "" && strings.HasPrefix(uri, tl) { - return nil - } - } - return errors.Errorf("untrusted artifact location detected with URI %q. Allowed locations are %v", uri, trustedLocations) - } -} - -// verifyPluginPostDownload compares the source digest of the plugin against the -// SHA256 hash of the downloaded binary to ensure that the binary was not altered -// during transit. -func verifyPluginPostDownload(p *plugin.Discovered, srcDigest string, b []byte) error { - if srcDigest == "" { - // Skip if the Distribution repo does not have the source digest. - return nil - } - - d := sha256.Sum256(b) - actDigest := fmt.Sprintf("%x", d) - if actDigest != srcDigest { - return errors.Errorf("plugin %q has been corrupted during download. source digest: %s, actual digest: %s", p.Name, srcDigest, actDigest) - } - - return nil -} - -func FindVersion(recommendedPluginVersion, requestedVersion string) string { - if requestedVersion == "" || requestedVersion == cli.VersionLatest { - return recommendedPluginVersion - } - return requestedVersion -} diff --git a/cli/core/pkg/pluginmanager/manager_helper_test.go b/cli/core/pkg/pluginmanager/manager_helper_test.go deleted file mode 100644 index e30567ddb7..0000000000 --- a/cli/core/pkg/pluginmanager/manager_helper_test.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package pluginmanager - -import ( - "os" - "os/exec" - "path/filepath" - - configlib "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - - "github.com/aunum/log" - "github.com/otiai10/copy" - "github.com/stretchr/testify/assert" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -func findDiscoveredPlugin(discovered []plugin.Discovered, pluginName string, target cliv1alpha1.Target) *plugin.Discovered { - for i := range discovered { - if pluginName == discovered[i].Name && target == discovered[i].Target { - return &discovered[i] - } - } - return nil -} - -func findPluginDescriptors(pd []v1alpha1.PluginDescriptor, pluginName string, target cliv1alpha1.Target) *v1alpha1.PluginDescriptor { - for i := range pd { - if pluginName == pd[i].Name && target == pd[i].Target { - return &pd[i] - } - } - return nil -} - -func setupLocalDistoForTesting() func() { - tmpDir, err := os.MkdirTemp(os.TempDir(), "") - if err != nil { - log.Fatal(err, "unable to create temporary directory") - } - - tmpHomeDir, err := os.MkdirTemp(os.TempDir(), "home") - if err != nil { - log.Fatal(err, "unable to create temporary home directory") - } - - config.DefaultStandaloneDiscoveryType = "local" - config.DefaultStandaloneDiscoveryLocalPath = "default" - - common.DefaultPluginRoot = filepath.Join(tmpDir, "plugin-root") - common.DefaultLocalPluginDistroDir = filepath.Join(tmpDir, "distro") - common.DefaultCacheDir = filepath.Join(tmpDir, "cache") - - tkgConfigFile := filepath.Join(tmpDir, "tanzu_config.yaml") - tkgConfigNextGenFile := filepath.Join(tmpDir, "tanzu_config_ng.yaml") - os.Setenv("TANZU_CONFIG", tkgConfigFile) - os.Setenv("TANZU_CONFIG_NEXT_GEN", tkgConfigNextGenFile) - os.Setenv("HOME", tmpHomeDir) - - err = copy.Copy(filepath.Join("test", "local"), common.DefaultLocalPluginDistroDir) - if err != nil { - log.Fatal(err, "Error while setting local distro for testing") - } - - err = copy.Copy(filepath.Join("test", "config.yaml"), tkgConfigFile) - if err != nil { - log.Fatal(err, "Error while coping tanzu config file for testing") - } - - err = copy.Copy(filepath.Join("test", "config-ng.yaml"), tkgConfigNextGenFile) - if err != nil { - log.Fatal(err, "Error while coping tanzu config next gen file for testing") - } - - err = configlib.SetFeature("global", "context-target-v2", "true") - if err != nil { - log.Fatal(err, "Error while coping tanzu config file for testing") - } - - return func() { - os.RemoveAll(tmpDir) - } -} - -func mockInstallPlugin(assert *assert.Assertions, name, version string, target cliv1alpha1.Target) { - execCommand = fakeInfoExecCommand - defer func() { execCommand = exec.Command }() - - err := InstallPlugin(name, version, target) - assert.Nil(err) -} - -// Reference: https://jamiethompson.me/posts/Unit-Testing-Exec-Command-In-Golang/ -func fakeInfoExecCommand(command string, args ...string) *exec.Cmd { - cs := []string{"-test.run=TestHelperProcess", "--", command} - cs = append(cs, args...) - cmd := exec.Command(os.Args[0], cs...) //nolint:gosec - tc := "FILE_PATH=" + command - home := "HOME=" + os.Getenv("HOME") - cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1", tc, home} - return cmd -} diff --git a/cli/core/pkg/pluginmanager/manager_test.go b/cli/core/pkg/pluginmanager/manager_test.go deleted file mode 100644 index 91b58df082..0000000000 --- a/cli/core/pkg/pluginmanager/manager_test.go +++ /dev/null @@ -1,1082 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package pluginmanager - -import ( - "fmt" - "os" - "os/exec" - "path/filepath" - "testing" - - "github.com/aunum/log" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - - configlib "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/stretchr/testify/assert" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/plugin" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" -) - -var expectedDiscoveredContextPlugins = []plugin.Discovered{ - { - Name: "cluster", - RecommendedVersion: "v1.6.0", - Scope: common.PluginScopeContext, - ContextName: "mgmt", - Target: cliv1alpha1.TargetK8s, - }, - { - Name: "cluster", - RecommendedVersion: "v0.2.0", - Scope: common.PluginScopeContext, - ContextName: "tmc-fake", - Target: cliv1alpha1.TargetTMC, - }, - { - Name: "management-cluster", - RecommendedVersion: "v0.2.0", - Scope: common.PluginScopeContext, - ContextName: "tmc-fake", - Target: cliv1alpha1.TargetTMC, - }, -} -var expectedDiscoveredStandalonePlugins = []plugin.Discovered{ - { - Name: "login", - RecommendedVersion: "v0.2.0", - Scope: common.PluginScopeStandalone, - ContextName: "", - Target: cliv1alpha1.TargetNone, - }, - { - Name: "management-cluster", - RecommendedVersion: "v1.6.0", - Scope: common.PluginScopeStandalone, - ContextName: "", - Target: cliv1alpha1.TargetK8s, - }, -} - -func Test_DiscoverPlugins(t *testing.T) { - assertions := assert.New(t) - - defer setupLocalDistoForTesting()() - - serverPlugins, standalonePlugins := DiscoverPlugins() - assertions.Equal(len(expectedDiscoveredContextPlugins), len(serverPlugins)) - assertions.Equal(len(expectedDiscoveredStandalonePlugins), len(standalonePlugins)) - - discoveredPlugins := append(serverPlugins, standalonePlugins...) - expectedDiscoveredPlugins := append(expectedDiscoveredContextPlugins, expectedDiscoveredStandalonePlugins...) - - for i := 0; i < len(expectedDiscoveredPlugins); i++ { - p := findDiscoveredPlugin(discoveredPlugins, expectedDiscoveredPlugins[i].Name, expectedDiscoveredPlugins[i].Target) - assertions.NotNil(p) - assertions.Equal(expectedDiscoveredPlugins[i].Name, p.Name) - assertions.Equal(expectedDiscoveredPlugins[i].RecommendedVersion, p.RecommendedVersion) - assertions.Equal(expectedDiscoveredPlugins[i].Target, p.Target) - } - - err := configlib.SetFeature("global", "context-target-v2", "false") - assertions.Nil(err) - - serverPlugins, standalonePlugins = DiscoverPlugins() - assertions.Equal(1, len(serverPlugins)) - assertions.Equal(len(expectedDiscoveredStandalonePlugins), len(standalonePlugins)) -} - -func Test_InstallPlugin_InstalledPlugins(t *testing.T) { - assertions := assert.New(t) - - defer setupLocalDistoForTesting()() - execCommand = fakeInfoExecCommand - defer func() { execCommand = exec.Command }() - - // Try installing nonexistent plugin - err := InstallPlugin("not-exists", "v0.2.0", cliv1alpha1.TargetNone) - assertions.NotNil(err) - assertions.Contains(err.Error(), "unable to find plugin 'not-exists'") - - // Install login (standalone) plugin - err = InstallPlugin("login", "v0.2.0", cliv1alpha1.TargetNone) - assertions.Nil(err) - // Verify installed plugin - installedServerPlugins, installedStandalonePlugins, err := InstalledPlugins() - assertions.Nil(err) - assertions.Equal(0, len(installedServerPlugins)) - assertions.Equal(1, len(installedStandalonePlugins)) - assertions.Equal("login", installedStandalonePlugins[0].Name) - - // Try installing cluster plugin with no context-type - err = InstallPlugin("cluster", "v0.2.0", cliv1alpha1.TargetNone) - assertions.NotNil(err) - assertions.Contains(err.Error(), "unable to uniquely identify plugin 'cluster'. Please specify correct Target(kubernetes[k8s]/mission-control[tmc]) of the plugin with `--target` flag") - - // Try installing cluster plugin with context-type=tmc - err = InstallPlugin("cluster", "v0.2.0", cliv1alpha1.TargetTMC) - assertions.Nil(err) - - // Try installing cluster plugin through context-type=k8s with incorrect version - err = InstallPlugin("cluster", "v1.0.0", cliv1alpha1.TargetK8s) - assertions.NotNil(err) - assertions.Contains(err.Error(), "unable to fetch the plugin metadata") - - // Try installing cluster plugin through context-type=k8s - err = InstallPlugin("cluster", "v1.6.0", cliv1alpha1.TargetK8s) - assertions.Nil(err) - - // Try installing management-cluster plugin from standalone discovery without context-type - err = InstallPlugin("management-cluster", "v1.6.0", cliv1alpha1.TargetNone) - assertions.NotNil(err) - assertions.Contains(err.Error(), "unable to uniquely identify plugin 'management-cluster'. Please specify correct Target(kubernetes[k8s]/mission-control[tmc]) of the plugin with `--target` flag") - - // Try installing management-cluster plugin from standalone discovery - err = InstallPlugin("management-cluster", "v1.6.0", cliv1alpha1.TargetK8s) - assertions.Nil(err) - - // Verify installed plugins - installedServerPlugins, installedStandalonePlugins, err = InstalledPlugins() - assertions.Nil(err) - assertions.Equal(2, len(installedStandalonePlugins)) - assertions.Equal(2, len(installedServerPlugins)) - - expectedInstalledServerPlugins := []cliapi.PluginDescriptor{ - { - Name: "cluster", - Version: "v1.6.0", - Scope: common.PluginScopeContext, - Target: cliv1alpha1.TargetK8s, - }, - { - Name: "cluster", - Version: "v0.2.0", - Scope: common.PluginScopeContext, - Target: cliv1alpha1.TargetTMC, - }, - } - expectedInstalledStandalonePlugins := []cliapi.PluginDescriptor{ - { - Name: "login", - Version: "v0.2.0", - Scope: common.PluginScopeStandalone, - Target: cliv1alpha1.TargetNone, - }, - { - Name: "management-cluster", - Version: "v1.6.0", - Scope: common.PluginScopeStandalone, - Target: cliv1alpha1.TargetK8s, - }, - } - - for i := 0; i < len(expectedInstalledServerPlugins); i++ { - pd := findPluginDescriptors(installedServerPlugins, expectedInstalledServerPlugins[i].Name, expectedInstalledServerPlugins[i].Target) - assertions.NotNil(pd) - assertions.Equal(expectedInstalledServerPlugins[i].Version, pd.Version) - } - for i := 0; i < len(expectedInstalledStandalonePlugins); i++ { - pd := findPluginDescriptors(installedStandalonePlugins, expectedInstalledStandalonePlugins[i].Name, expectedInstalledStandalonePlugins[i].Target) - assertions.NotNil(pd) - assertions.Equal(expectedInstalledStandalonePlugins[i].Version, pd.Version) - } -} - -func Test_AvailablePlugins(t *testing.T) { - assertions := assert.New(t) - - defer setupLocalDistoForTesting()() - - expectedDiscoveredPlugins := append(expectedDiscoveredContextPlugins, expectedDiscoveredStandalonePlugins...) - discoveredPlugins, err := AvailablePlugins() - assertions.Nil(err) - assertions.Equal(len(expectedDiscoveredPlugins), len(discoveredPlugins)) - - for i := 0; i < len(expectedDiscoveredPlugins); i++ { - pd := findDiscoveredPlugin(discoveredPlugins, expectedDiscoveredPlugins[i].Name, expectedDiscoveredPlugins[i].Target) - assertions.NotNil(pd) - assertions.Equal(expectedDiscoveredPlugins[i].Name, pd.Name) - assertions.Equal(expectedDiscoveredPlugins[i].RecommendedVersion, pd.RecommendedVersion) - assertions.Equal(expectedDiscoveredPlugins[i].Target, pd.Target) - assertions.Equal(expectedDiscoveredPlugins[i].Scope, pd.Scope) - assertions.Equal(common.PluginStatusNotInstalled, pd.Status) - } - - // Install login, cluster plugins - mockInstallPlugin(assertions, "login", "v0.2.0", cliv1alpha1.TargetNone) - mockInstallPlugin(assertions, "cluster", "v0.2.0", cliv1alpha1.TargetTMC) - - expectedInstallationStatusOfPlugins := []plugin.Discovered{ - { - Name: "cluster", - Target: cliv1alpha1.TargetTMC, - InstalledVersion: "v0.2.0", - Status: common.PluginStatusInstalled, - }, - { - Name: "cluster", - Target: cliv1alpha1.TargetK8s, - InstalledVersion: "", - Status: common.PluginStatusNotInstalled, - }, - { - Name: "login", - Target: cliv1alpha1.TargetNone, - InstalledVersion: "v0.2.0", - Status: common.PluginStatusInstalled, - }, - } - - // Get available plugin after install and verify installation status - discoveredPlugins, err = AvailablePlugins() - assertions.Nil(err) - assertions.Equal(len(expectedDiscoveredPlugins), len(discoveredPlugins)) - - for _, eisp := range expectedInstallationStatusOfPlugins { - p := findDiscoveredPlugin(discoveredPlugins, eisp.Name, eisp.Target) - assertions.NotNil(p) - assertions.Equal(eisp.Status, p.Status) - assertions.Equal(eisp.InstalledVersion, p.InstalledVersion) - } - - // Install management-cluster, cluster plugins - mockInstallPlugin(assertions, "management-cluster", "v0.2.0", cliv1alpha1.TargetTMC) - mockInstallPlugin(assertions, "cluster", "v1.6.0", cliv1alpha1.TargetK8s) - - expectedInstallationStatusOfPlugins = []plugin.Discovered{ - { - Name: "management-cluster", - Target: cliv1alpha1.TargetTMC, - InstalledVersion: "v0.2.0", - Status: common.PluginStatusInstalled, - }, - { - Name: "cluster", - Target: cliv1alpha1.TargetK8s, - InstalledVersion: "v1.6.0", - Status: common.PluginStatusInstalled, - }, - { - Name: "management-cluster", - Target: cliv1alpha1.TargetK8s, - InstalledVersion: "", - Status: common.PluginStatusNotInstalled, - }, - { - Name: "login", - Target: cliv1alpha1.TargetNone, - InstalledVersion: "v0.2.0", - Status: common.PluginStatusInstalled, - }, - } - - // Get available plugin after install and verify installation status - discoveredPlugins, err = AvailablePlugins() - assertions.Nil(err) - assertions.Equal(len(expectedDiscoveredPlugins), len(discoveredPlugins)) - - for _, eisp := range expectedInstallationStatusOfPlugins { - p := findDiscoveredPlugin(discoveredPlugins, eisp.Name, eisp.Target) - assertions.NotNil(p) - assertions.Equal(eisp.Status, p.Status, eisp.Name) - assertions.Equal(eisp.InstalledVersion, p.InstalledVersion, eisp.Name) - } -} - -func Test_AvailablePlugins_With_K8s_None_Target_Plugin_Name_Conflict_With_One_Installed_Getting_Discovered(t *testing.T) { - assertions := assert.New(t) - - defer setupLocalDistoForTesting()() - - expectedDiscoveredPlugins := append(expectedDiscoveredContextPlugins, expectedDiscoveredStandalonePlugins...) - discoveredPlugins, err := AvailablePlugins() - assertions.Nil(err) - assertions.Equal(len(expectedDiscoveredPlugins), len(discoveredPlugins)) - - // Install login, cluster plugins - mockInstallPlugin(assertions, "login", "v0.2.0", cliv1alpha1.TargetNone) - - // Considering `login` plugin with `` target is already installed and - // getting discovered through some discoveries source - // - // if the same `login` plugin is now getting discovered with `k8s` target - // verify the result of AvailablePlugins - - discoverySource := configapi.PluginDiscovery{ - Local: &configapi.LocalDiscovery{ - Name: "fake-with-k8s-target", - Path: "standalone-k8s-target", - }, - } - err = configlib.SetCLIDiscoverySource(discoverySource) - assertions.Nil(err) - - discoveredPlugins, err = AvailablePlugins() - assertions.Nil(err) - assertions.Equal(len(expectedDiscoveredPlugins), len(discoveredPlugins)) - - expectedInstallationStatusOfPlugins := []plugin.Discovered{ - { - Name: "login", - Target: cliv1alpha1.TargetK8s, - InstalledVersion: "v0.2.0", - Status: common.PluginStatusInstalled, - }, - } - - for i := range discoveredPlugins { - log.Infof("Discovered: %v, %v, %v, %v", discoveredPlugins[i].Name, discoveredPlugins[i].Target, discoveredPlugins[i].Status, discoveredPlugins[i].InstalledVersion) - } - - for _, eisp := range expectedInstallationStatusOfPlugins { - p := findDiscoveredPlugin(discoveredPlugins, eisp.Name, eisp.Target) - assertions.NotNil(p) - assertions.Equal(eisp.Status, p.Status, eisp.Name) - assertions.Equal(eisp.InstalledVersion, p.InstalledVersion, eisp.Name) - } -} - -func Test_AvailablePlugins_With_K8s_None_Target_Plugin_Name_Conflict_With_Plugin_Installed_But_Not_Getting_Discovered(t *testing.T) { - assertions := assert.New(t) - - defer setupLocalDistoForTesting()() - - expectedDiscoveredPlugins := append(expectedDiscoveredContextPlugins, expectedDiscoveredStandalonePlugins...) - discoveredPlugins, err := AvailablePlugins() - assertions.Nil(err) - assertions.Equal(len(expectedDiscoveredPlugins), len(discoveredPlugins)) - - // Install login, cluster plugins - mockInstallPlugin(assertions, "login", "v0.2.0", cliv1alpha1.TargetNone) - - // Considering `login` plugin with `` target is already installed and - // getting discovered through some discoveries source - // - // if the same `login` plugin is now getting discovered with `k8s` target - // verify the result of AvailablePlugins - - // Replace old discovery source to point to new standalone discovery where the same plugin is getting - // discovered through k8s target - discoverySource := configapi.PluginDiscovery{ - Local: &configapi.LocalDiscovery{ - Name: "fake", - Path: "standalone-k8s-target", - }, - } - err = configlib.SetCLIDiscoverySource(discoverySource) - assertions.Nil(err) - - discoveredPlugins, err = AvailablePlugins() - assertions.Nil(err) - assertions.Equal(len(expectedDiscoveredPlugins), len(discoveredPlugins)) - - expectedInstallationStatusOfPlugins := []plugin.Discovered{ - { - Name: "login", - Target: cliv1alpha1.TargetK8s, - InstalledVersion: "v0.2.0", - Status: common.PluginStatusInstalled, - }, - } - - for _, eisp := range expectedInstallationStatusOfPlugins { - p := findDiscoveredPlugin(discoveredPlugins, eisp.Name, eisp.Target) - assertions.NotNil(p) - assertions.Equal(eisp.Status, p.Status, eisp.Name) - assertions.Equal(eisp.InstalledVersion, p.InstalledVersion, eisp.Name) - } -} - -func Test_AvailablePlugins_From_LocalSource(t *testing.T) { - assertions := assert.New(t) - - defer setupLocalDistoForTesting()() - - currentDirAbsPath, _ := filepath.Abs(".") - discoveredPlugins, err := AvailablePluginsFromLocalSource(filepath.Join(currentDirAbsPath, "test", "local")) - assertions.Nil(err) - - expectedInstallationStatusOfPlugins := []plugin.Discovered{ - { - Name: "cluster", - Scope: common.PluginScopeStandalone, - Target: cliv1alpha1.TargetK8s, - Status: common.PluginStatusNotInstalled, - }, - { - Name: "management-cluster", - Scope: common.PluginScopeStandalone, - Target: cliv1alpha1.TargetK8s, - Status: common.PluginStatusNotInstalled, - }, - { - Name: "management-cluster", - Scope: common.PluginScopeStandalone, - Target: cliv1alpha1.TargetTMC, - Status: common.PluginStatusNotInstalled, - }, - { - Name: "login", - Scope: common.PluginScopeStandalone, - Target: cliv1alpha1.TargetK8s, - Status: common.PluginStatusNotInstalled, - }, - { - Name: "cluster", - Scope: common.PluginScopeStandalone, - Target: cliv1alpha1.TargetTMC, - Status: common.PluginStatusNotInstalled, - }, - } - - assertions.Equal(len(expectedInstallationStatusOfPlugins), len(discoveredPlugins)) - - for _, eisp := range expectedInstallationStatusOfPlugins { - p := findDiscoveredPlugin(discoveredPlugins, eisp.Name, eisp.Target) - assertions.NotNil(p, "plugin %q with target %q not found", eisp.Name, eisp.Target) - assertions.Equal(eisp.Status, p.Status, "status mismatch for plugin %q with target %q", eisp.Name, eisp.Target) - assertions.Equal(eisp.Scope, p.Scope, "scope mismatch for plugin %q with target %q", eisp.Name, eisp.Target) - } -} - -func Test_InstallPlugin_InstalledPlugins_From_LocalSource(t *testing.T) { - assertions := assert.New(t) - - defer setupLocalDistoForTesting()() - - execCommand = fakeInfoExecCommand - defer func() { execCommand = exec.Command }() - - currentDirAbsPath, _ := filepath.Abs(".") - localPluginSourceDir := filepath.Join(currentDirAbsPath, "test", "local") - - // Try installing nonexistent plugin - err := InstallPluginsFromLocalSource("not-exists", "v0.2.0", cliv1alpha1.TargetNone, localPluginSourceDir, false) - assertions.NotNil(err) - assertions.Contains(err.Error(), "unable to find plugin 'not-exists'") - - // Install login from local source directory - err = InstallPluginsFromLocalSource("login", "v0.2.0", cliv1alpha1.TargetNone, localPluginSourceDir, false) - assertions.Nil(err) - // Verify installed plugin - installedServerPlugins, installedStandalonePlugins, err := InstalledPlugins() - assertions.Nil(err) - assertions.Equal(0, len(installedServerPlugins)) - assertions.Equal(1, len(installedStandalonePlugins)) - assertions.Equal("login", installedStandalonePlugins[0].Name) - - // Try installing cluster plugin from local source directory - err = InstallPluginsFromLocalSource("cluster", "v0.2.0", cliv1alpha1.TargetTMC, localPluginSourceDir, false) - assertions.Nil(err) - installedServerPlugins, installedStandalonePlugins, err = InstalledPlugins() - assertions.Nil(err) - assertions.Equal(0, len(installedServerPlugins)) - assertions.Equal(2, len(installedStandalonePlugins)) - - // Try installing a plugin from incorrect local path - err = InstallPluginsFromLocalSource("cluster", "v0.2.0", cliv1alpha1.TargetTMC, "fakepath", false) - assertions.NotNil(err) - assertions.Contains(err.Error(), "no such file or directory") -} - -func Test_DescribePlugin(t *testing.T) { - assertions := assert.New(t) - - defer setupLocalDistoForTesting()() - - // Try to describe plugin when plugin is not installed - _, err := DescribePlugin("login", cliv1alpha1.TargetNone) - assertions.NotNil(err) - assertions.Contains(err.Error(), "unable to find plugin 'login'") - - // Install login (standalone) package - mockInstallPlugin(assertions, "login", "v0.2.0", cliv1alpha1.TargetNone) - - // Try to describe plugin when plugin after installing plugin - pd, err := DescribePlugin("login", cliv1alpha1.TargetNone) - assertions.Nil(err) - assertions.Equal("login", pd.Name) - assertions.Equal("v0.2.0", pd.Version) - - // Try to describe plugin when plugin is not installed - _, err = DescribePlugin("cluster", cliv1alpha1.TargetTMC) - assertions.NotNil(err) - assertions.Contains(err.Error(), "unable to find plugin 'cluster'") - - // Install cluster (context) package - mockInstallPlugin(assertions, "cluster", "v0.2.0", cliv1alpha1.TargetTMC) - - // Try to describe plugin when plugin after installing plugin - pd, err = DescribePlugin("cluster", cliv1alpha1.TargetTMC) - assertions.Nil(err) - assertions.Equal("cluster", pd.Name) - assertions.Equal("v0.2.0", pd.Version) -} - -func Test_DeletePlugin(t *testing.T) { - assertions := assert.New(t) - - defer setupLocalDistoForTesting()() - - // Try to delete plugin when plugin is not installed - err := DeletePlugin(DeletePluginOptions{PluginName: "login", Target: cliv1alpha1.TargetNone, ForceDelete: true}) - assertions.NotNil(err) - assertions.Contains(err.Error(), "unable to find plugin 'login'") - - // Install login (standalone) package - mockInstallPlugin(assertions, "login", "v0.2.0", cliv1alpha1.TargetNone) - - // Try to delete plugin when plugin is installed - err = DeletePlugin(DeletePluginOptions{PluginName: "cluster", Target: cliv1alpha1.TargetTMC, ForceDelete: true}) - assertions.NotNil(err) - assertions.Contains(err.Error(), "unable to find plugin 'cluster'") - - // Install cluster (context) package from TMC target - mockInstallPlugin(assertions, "cluster", "v0.2.0", cliv1alpha1.TargetTMC) - - // Try to Delete plugin after installing plugin - err = DeletePlugin(DeletePluginOptions{PluginName: "cluster", Target: cliv1alpha1.TargetTMC, ForceDelete: true}) - assertions.Nil(err) - - // Install cluster (context) package from TMC target - mockInstallPlugin(assertions, "cluster", "v0.2.0", cliv1alpha1.TargetTMC) - - // Try to Delete plugin after installing plugin - err = DeletePlugin(DeletePluginOptions{PluginName: "cluster", Target: "", ForceDelete: true}) - assertions.Nil(err) - - // Install cluster (context) package from TMC target - mockInstallPlugin(assertions, "cluster", "v0.2.0", cliv1alpha1.TargetTMC) - // Install cluster (context) package from k8s target - mockInstallPlugin(assertions, "cluster", "v1.6.0", cliv1alpha1.TargetK8s) - // Try to Delete plugin without passing target after installing plugin with different targets - err = DeletePlugin(DeletePluginOptions{PluginName: "cluster", Target: "", ForceDelete: true}) - assertions.Contains(err.Error(), "unable to uniquely identify plugin 'cluster'. Please specify correct Target(kubernetes[k8s]/mission-control[tmc]) of the plugin with `--target` flag") -} - -func Test_ValidatePlugin(t *testing.T) { - assertions := assert.New(t) - - pd := cliapi.PluginDescriptor{} - err := ValidatePlugin(&pd) - assertions.Contains(err.Error(), "plugin name cannot be empty") - - pd.Name = "fake-plugin" - err = ValidatePlugin(&pd) - assertions.NotContains(err.Error(), "plugin name cannot be empty") - assertions.Contains(err.Error(), "plugin \"fake-plugin\" version cannot be empty") - assertions.Contains(err.Error(), "plugin \"fake-plugin\" group cannot be empty") -} - -func Test_SyncPlugins_All_Plugins(t *testing.T) { - assertions := assert.New(t) - - defer setupLocalDistoForTesting()() - execCommand = fakeInfoExecCommand - defer func() { execCommand = exec.Command }() - - expectedDiscoveredPlugins := append(expectedDiscoveredContextPlugins, expectedDiscoveredStandalonePlugins...) - - // Get all available plugins(standalone+context-aware) and verify the status is `not installed` - discovered, err := AvailablePlugins() - assertions.Nil(err) - assertions.Equal(len(expectedDiscoveredPlugins), len(discovered)) - - for _, edp := range expectedDiscoveredPlugins { - p := findDiscoveredPlugin(discovered, edp.Name, edp.Target) - assertions.NotNil(p) - assertions.Equal(common.PluginStatusNotInstalled, p.Status) - } - - // Sync all available plugins - err = SyncPlugins() - assertions.Nil(err) - - // Get all available plugins(standalone+context-aware) and verify the status is updated to `installed` - discovered, err = AvailablePlugins() - assertions.Nil(err) - assertions.Equal(len(expectedDiscoveredPlugins), len(discovered)) - - for _, edp := range expectedDiscoveredPlugins { - p := findDiscoveredPlugin(discovered, edp.Name, edp.Target) - assertions.NotNil(p) - assertions.Equal(common.PluginStatusInstalled, p.Status) - assertions.Equal(edp.RecommendedVersion, p.InstalledVersion) - } -} - -func Test_getInstalledButNotDiscoveredStandalonePlugins(t *testing.T) { - assertions := assert.New(t) - - availablePlugins := []plugin.Discovered{{Name: "fake1", DiscoveryType: "oci", RecommendedVersion: "v1.0.0", Status: common.PluginStatusInstalled}} - installedPluginDesc := []cliapi.PluginDescriptor{{Name: "fake2", Version: "v2.0.0", Discovery: "local"}} - - // If installed plugin is not part of available(discovered) plugins - plugins := getInstalledButNotDiscoveredStandalonePlugins(availablePlugins, installedPluginDesc) - assertions.Equal(len(plugins), 1) - assertions.Equal("fake2", plugins[0].Name) - assertions.Equal("v2.0.0", plugins[0].RecommendedVersion) - assertions.Equal(common.PluginStatusInstalled, plugins[0].Status) - - // If installed plugin is part of available(discovered) plugins and provided available plugin is already marked as `installed` - installedPluginDesc = append(installedPluginDesc, cliapi.PluginDescriptor{Name: "fake1", Version: "v1.0.0", Discovery: "local"}) - plugins = getInstalledButNotDiscoveredStandalonePlugins(availablePlugins, installedPluginDesc) - assertions.Equal(len(plugins), 1) - assertions.Equal("fake2", plugins[0].Name) - assertions.Equal("v2.0.0", plugins[0].RecommendedVersion) - assertions.Equal(common.PluginStatusInstalled, plugins[0].Status) - - // If installed plugin is part of available(discovered) plugins and provided available plugin is already marked as `not installed` - // then test the availablePlugin status gets updated to `installed` - availablePlugins[0].Status = common.PluginStatusNotInstalled - plugins = getInstalledButNotDiscoveredStandalonePlugins(availablePlugins, installedPluginDesc) - assertions.Equal(len(plugins), 1) - assertions.Equal("fake2", plugins[0].Name) - assertions.Equal("v2.0.0", plugins[0].RecommendedVersion) - assertions.Equal(common.PluginStatusInstalled, plugins[0].Status) - assertions.Equal(common.PluginStatusInstalled, availablePlugins[0].Status) - - // If installed plugin is part of available(discovered) plugins and versions installed is different than discovered version - availablePlugins[0].Status = common.PluginStatusNotInstalled - availablePlugins[0].RecommendedVersion = "v4.0.0" - plugins = getInstalledButNotDiscoveredStandalonePlugins(availablePlugins, installedPluginDesc) - assertions.Equal(len(plugins), 1) - assertions.Equal("fake2", plugins[0].Name) - assertions.Equal("v2.0.0", plugins[0].RecommendedVersion) - assertions.Equal(common.PluginStatusInstalled, plugins[0].Status) - assertions.Equal(common.PluginStatusInstalled, availablePlugins[0].Status) -} - -func Test_setAvailablePluginsStatus(t *testing.T) { - assertions := assert.New(t) - - availablePlugins := []plugin.Discovered{{Name: "fake1", DiscoveryType: "oci", RecommendedVersion: "v1.0.0", Status: common.PluginStatusNotInstalled, Target: cliv1alpha1.TargetK8s}} - installedPluginDesc := []cliapi.PluginDescriptor{{Name: "fake2", Version: "v2.0.0", Discovery: "local", DiscoveredRecommendedVersion: "v2.0.0", Target: cliv1alpha1.TargetNone}} - - // If installed plugin is not part of available(discovered) plugins then - // installed version == "" - // status == not installed - setAvailablePluginsStatus(availablePlugins, installedPluginDesc) - assertions.Equal(len(availablePlugins), 1) - assertions.Equal("fake1", availablePlugins[0].Name) - assertions.Equal("v1.0.0", availablePlugins[0].RecommendedVersion) - assertions.Equal("", availablePlugins[0].InstalledVersion) - assertions.Equal(common.PluginStatusNotInstalled, availablePlugins[0].Status) - - // If installed plugin is not part of available(discovered) plugins because of the Target mismatch - installedPluginDesc = []cliapi.PluginDescriptor{{Name: "fake1", Version: "v1.0.0", Discovery: "local", DiscoveredRecommendedVersion: "v1.0.0", Target: cliv1alpha1.TargetNone}} - setAvailablePluginsStatus(availablePlugins, installedPluginDesc) - assertions.Equal(len(availablePlugins), 1) - assertions.Equal("fake1", availablePlugins[0].Name) - assertions.Equal("v1.0.0", availablePlugins[0].RecommendedVersion) - assertions.Equal("", availablePlugins[0].InstalledVersion) - assertions.Equal(common.PluginStatusNotInstalled, availablePlugins[0].Status) - - // If installed plugin is part of available(discovered) plugins and provided available plugin is already installed - installedPluginDesc = []cliapi.PluginDescriptor{{Name: "fake1", Version: "v1.0.0", Discovery: "local", DiscoveredRecommendedVersion: "v1.0.0", Target: cliv1alpha1.TargetK8s}} - setAvailablePluginsStatus(availablePlugins, installedPluginDesc) - assertions.Equal(len(availablePlugins), 1) - assertions.Equal("fake1", availablePlugins[0].Name) - assertions.Equal("v1.0.0", availablePlugins[0].RecommendedVersion) - assertions.Equal("v1.0.0", availablePlugins[0].InstalledVersion) - assertions.Equal(common.PluginStatusInstalled, availablePlugins[0].Status) - - // If installed plugin is part of available(discovered) plugins but recommended discovered version is different than the one installed - // then available plugin status should show 'update available' - availablePlugins = []plugin.Discovered{{Name: "fake1", DiscoveryType: "oci", RecommendedVersion: "v8.0.0-latest", Status: common.PluginStatusNotInstalled}} - installedPluginDesc = []cliapi.PluginDescriptor{{Name: "fake1", Version: "v1.0.0", Discovery: "local", DiscoveredRecommendedVersion: "v1.0.0"}} - setAvailablePluginsStatus(availablePlugins, installedPluginDesc) - assertions.Equal(len(availablePlugins), 1) - assertions.Equal("fake1", availablePlugins[0].Name) - assertions.Equal("v8.0.0-latest", availablePlugins[0].RecommendedVersion) - assertions.Equal("v1.0.0", availablePlugins[0].InstalledVersion) - assertions.Equal(common.PluginStatusUpdateAvailable, availablePlugins[0].Status) - - // If installed plugin is part of available(discovered) plugins but recommended discovered version is same as the recommended discovered version - // for the installed plugin(stored as part of catalog cache) then available plugin status should show 'installed' - availablePlugins = []plugin.Discovered{{Name: "fake1", DiscoveryType: "oci", RecommendedVersion: "v8.0.0-latest", Status: common.PluginStatusNotInstalled}} - installedPluginDesc = []cliapi.PluginDescriptor{{Name: "fake1", Version: "v1.0.0", Discovery: "local", DiscoveredRecommendedVersion: "v8.0.0-latest"}} - setAvailablePluginsStatus(availablePlugins, installedPluginDesc) - assertions.Equal(len(availablePlugins), 1) - assertions.Equal("fake1", availablePlugins[0].Name) - assertions.Equal("v8.0.0-latest", availablePlugins[0].RecommendedVersion) - assertions.Equal("v1.0.0", availablePlugins[0].InstalledVersion) - assertions.Equal(common.PluginStatusInstalled, availablePlugins[0].Status) - - // If installed plugin is part of available(discovered) plugins and versions installed is different from discovered version - // it should be reflected in RecommendedVersion as well as InstalledVersion and status should be `update available` - availablePlugins[0].Status = common.PluginStatusNotInstalled - availablePlugins[0].RecommendedVersion = "v3.0.0" - setAvailablePluginsStatus(availablePlugins, installedPluginDesc) - assertions.Equal(len(availablePlugins), 1) - assertions.Equal("fake1", availablePlugins[0].Name) - assertions.Equal("v3.0.0", availablePlugins[0].RecommendedVersion) - assertions.Equal("v1.0.0", availablePlugins[0].InstalledVersion) - assertions.Equal(common.PluginStatusUpdateAvailable, availablePlugins[0].Status) -} - -func Test_DiscoverPluginsFromLocalSourceWithLegacyDirectoryStructure(t *testing.T) { - assertions := assert.New(t) - - // When passing directory structure where manifest.yaml file is missing - _, err := discoverPluginsFromLocalSourceWithLegacyDirectoryStructure(filepath.Join("test", "local")) - assertions.NotNil(err) - assertions.Contains(err.Error(), "could not find manifest.yaml file") - - // When passing legacy directory structure which contains manifest.yaml file - discoveredPlugins, err := discoverPluginsFromLocalSourceWithLegacyDirectoryStructure(filepath.Join("test", "legacy")) - assertions.Nil(err) - assertions.Equal(2, len(discoveredPlugins)) - - assertions.Equal("foo", discoveredPlugins[0].Name) - assertions.Equal("Foo plugin", discoveredPlugins[0].Description) - assertions.Equal("v0.12.0", discoveredPlugins[0].RecommendedVersion) - assertions.Equal(common.PluginScopeStandalone, discoveredPlugins[0].Scope) - assertions.Equal(cliv1alpha1.TargetNone, discoveredPlugins[0].Target) - - assertions.Equal("bar", discoveredPlugins[1].Name) - assertions.Equal("Bar plugin", discoveredPlugins[1].Description) - assertions.Equal("v0.10.0", discoveredPlugins[1].RecommendedVersion) - assertions.Equal(common.PluginScopeStandalone, discoveredPlugins[1].Scope) - assertions.Equal(cliv1alpha1.TargetNone, discoveredPlugins[1].Target) -} - -func Test_InstallPluginsFromLocalSourceWithLegacyDirectoryStructure(t *testing.T) { - assertions := assert.New(t) - - execCommand = fakeInfoExecCommand - defer func() { execCommand = exec.Command }() - - // Using generic InstallPluginsFromLocalSource to test the legacy directory install - // When passing legacy directory structure which contains manifest.yaml file - err := InstallPluginsFromLocalSource("all", "", cliv1alpha1.TargetNone, filepath.Join("test", "legacy"), false) - assertions.Nil(err) - - // Verify installed plugin - installedServerPlugins, installedStandalonePlugins, err := InstalledPlugins() - assertions.Nil(err) - assertions.Equal(0, len(installedServerPlugins)) - assertions.Equal(2, len(installedStandalonePlugins)) - assertions.ElementsMatch([]string{"bar", "foo"}, []string{installedStandalonePlugins[0].Name, installedStandalonePlugins[1].Name}) -} - -func Test_VerifyRegistry(t *testing.T) { - assertions := assert.New(t) - - var err error - - testImage := "fake.repo.com/image:v1.0.0" - err = configureAndTestVerifyRegistry(testImage, "", "", "") - assertions.NotNil(err) - - err = configureAndTestVerifyRegistry(testImage, "fake.repo.com", "", "") - assertions.Nil(err) - err = configureAndTestVerifyRegistry(testImage, "fake.repo.com/image", "", "") - assertions.Nil(err) - err = configureAndTestVerifyRegistry(testImage, "fake.repo.com/foo", "", "") - assertions.NotNil(err) - - err = configureAndTestVerifyRegistry(testImage, "", "fake.repo.com", "") - assertions.Nil(err) - err = configureAndTestVerifyRegistry(testImage, "", "fake.repo.com/image", "") - assertions.Nil(err) - err = configureAndTestVerifyRegistry(testImage, "", "fake.repo.com/foo", "") - assertions.NotNil(err) - - err = configureAndTestVerifyRegistry(testImage, "", "", "fake.repo.com") - assertions.Nil(err) - err = configureAndTestVerifyRegistry(testImage, "", "", "fake.repo.com/image") - assertions.Nil(err) - err = configureAndTestVerifyRegistry(testImage, "", "", "fake.repo.com/foo") - assertions.NotNil(err) - - err = configureAndTestVerifyRegistry(testImage, "fake.repo.com", "", "fake.repo.com/foo") - assertions.Nil(err) - err = configureAndTestVerifyRegistry(testImage, "", "fake.repo.com", "fake.repo.com/foo") - assertions.Nil(err) - err = configureAndTestVerifyRegistry(testImage, "fake.repo.com", "fake.repo.com", "fake.repo.com/foo") - assertions.Nil(err) - - err = configureAndTestVerifyRegistry(testImage, "fake.repo.com.private.com", "", "") - assertions.NotNil(err) - err = configureAndTestVerifyRegistry(testImage, "private.fake.repo.com", "", "") - assertions.NotNil(err) - err = configureAndTestVerifyRegistry(testImage, "fake.repo.com/image/foo", "", "") - assertions.NotNil(err) - - err = configureAndTestVerifyRegistry(testImage, "", "", "fake.repo.com.private.com,private.fake.repo.com") - assertions.NotNil(err) - err = configureAndTestVerifyRegistry(testImage, "", "", "fake.repo.com,private.fake.repo.com") - assertions.Nil(err) - err = configureAndTestVerifyRegistry(testImage, "", "", "private.fake.repo.com,fake.repo.com") - assertions.Nil(err) - err = configureAndTestVerifyRegistry(testImage, "", "", "fake.repo.com/image,fake.repo.com") - assertions.Nil(err) - - testImage = "fake1.repo.com/image:v1.0.0" - err = configureAndTestVerifyRegistry(testImage, "fake.repo.com/image", "", "") - assertions.NotNil(err) - err = configureAndTestVerifyRegistry(testImage, "fake.repo.com/image,fake1.repo.com/image", "", "") - assertions.Nil(err) - err = configureAndTestVerifyRegistry(testImage, "fake1.repo.com/image", "", "") - assertions.Nil(err) -} - -func configureAndTestVerifyRegistry(testImage, defaultRegistry, customImageRepository, allowedRegistries string) error { - config.DefaultAllowedPluginRepositories = defaultRegistry - os.Setenv(constants.ConfigVariableCustomImageRepository, customImageRepository) - os.Setenv(constants.AllowedRegistries, allowedRegistries) - - err := verifyRegistry(testImage) - - config.DefaultAllowedPluginRepositories = "" - os.Setenv(constants.ConfigVariableCustomImageRepository, "") - os.Setenv(constants.AllowedRegistries, "") - return err -} - -func TestVerifyArtifactLocation(t *testing.T) { - tcs := []struct { - name string - uri string - errStr string - }{ - { - name: "trusted location", - uri: "https://storage.googleapis.com/tanzu-cli-advanced-plugins/artifacts/latest/tanzu-foo-darwin-amd64", - }, - { - name: "untrusted location", - uri: "https://storage.googleapis.com/tanzu-cli-advanced-plugins-artifacts/latest/tanzu-foo-darwin-amd64", - errStr: "untrusted artifact location detected with URI \"https://storage.googleapis.com/tanzu-cli-advanced-plugins-artifacts/latest/tanzu-foo-darwin-amd64\". Allowed locations are [https://storage.googleapis.com/tanzu-cli-advanced-plugins/ https://tmc-cli.s3-us-west-2.amazonaws.com/plugins/artifacts]", - }, - { - name: "trusted location", - uri: "https://tmc-cli.s3-us-west-2.amazonaws.com/plugins/artifacts", - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - err := verifyArtifactLocation(tc.uri) - if tc.errStr != "" { - assert.EqualError(t, err, tc.errStr) - } else { - assert.NoError(t, err) - } - }) - } -} - -func TestVerifyPluginPostDownload(t *testing.T) { - tcs := []struct { - name string - p *plugin.Discovered - d string - path string - err string - }{ - { - name: "success - no source digest", - p: &plugin.Discovered{Name: "login"}, - path: "test/local/distribution/v0.2.0/tanzu-login", - }, - { - name: "success - with source digest", - p: &plugin.Discovered{Name: "login"}, - d: "e109197e3e4ed9f13065596367f1fd0992df43717c7098324da4a00cb8b81c36", - path: "test/local/distribution/v0.2.0/tanzu-login", - }, - { - name: "failure - digest mismatch", - p: &plugin.Discovered{Name: "login"}, - d: "f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - path: "test/local/distribution/v0.2.0/tanzu-login", - err: "plugin \"login\" has been corrupted during download. source digest: f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, actual digest: e109197e3e4ed9f13065596367f1fd0992df43717c7098324da4a00cb8b81c36", - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - b, err := os.ReadFile(tc.path) - assert.NoError(t, err) - - err = verifyPluginPostDownload(tc.p, tc.d, b) - if tc.err != "" { - assert.EqualError(t, err, tc.err) - } else { - assert.NoError(t, err) - } - }) - } -} - -func Test_removeDuplicates(t *testing.T) { - assertions := assert.New(t) - - tcs := []struct { - name string - inputPlugins []plugin.Discovered - expectedResult []plugin.Discovered - }{ - { - name: "when plugin name-target conflict happens with '' and 'k8s' targeted plugins ", - inputPlugins: []plugin.Discovered{ - { - Name: "foo", - Target: cliv1alpha1.TargetNone, - Scope: common.PluginScopeStandalone, - }, - { - Name: "foo", - Target: cliv1alpha1.TargetK8s, - Scope: common.PluginScopeStandalone, - }, - { - Name: "bar", - Target: cliv1alpha1.TargetK8s, - Scope: common.PluginScopeStandalone, - }, - }, - expectedResult: []plugin.Discovered{ - { - Name: "foo", - Target: cliv1alpha1.TargetK8s, - Scope: common.PluginScopeStandalone, - }, - { - Name: "bar", - Target: cliv1alpha1.TargetK8s, - Scope: common.PluginScopeStandalone, - }, - }, - }, - { - name: "when same plugin exists for '', 'k8s' and 'tmc' target as standalone plugin", - inputPlugins: []plugin.Discovered{ - { - Name: "foo", - Target: cliv1alpha1.TargetNone, - Scope: common.PluginScopeStandalone, - }, - { - Name: "foo", - Target: cliv1alpha1.TargetK8s, - Scope: common.PluginScopeStandalone, - }, - { - Name: "foo", - Target: cliv1alpha1.TargetTMC, - Scope: common.PluginScopeStandalone, - }, - }, - expectedResult: []plugin.Discovered{ - { - Name: "foo", - Target: cliv1alpha1.TargetK8s, - Scope: common.PluginScopeStandalone, - }, - { - Name: "foo", - Target: cliv1alpha1.TargetTMC, - Scope: common.PluginScopeStandalone, - }, - }, - }, - { - name: "when foo standalone plugin is available with `k8s` and `` target and also available as context-scoped plugin with `k8s` target", - inputPlugins: []plugin.Discovered{ - { - Name: "foo", - Target: cliv1alpha1.TargetNone, - Scope: common.PluginScopeStandalone, - }, - { - Name: "foo", - Target: cliv1alpha1.TargetK8s, - Scope: common.PluginScopeStandalone, - }, - { - Name: "foo", - Target: cliv1alpha1.TargetK8s, - Scope: common.PluginScopeContext, - }, - }, - expectedResult: []plugin.Discovered{ - { - Name: "foo", - Target: cliv1alpha1.TargetK8s, - Scope: common.PluginScopeContext, - }, - }, - }, - { - name: "when tmc targeted plugin exists as standalone as well as context-scope", - inputPlugins: []plugin.Discovered{ - { - Name: "foo", - Target: cliv1alpha1.TargetTMC, - Scope: common.PluginScopeStandalone, - }, - { - Name: "foo", - Target: cliv1alpha1.TargetTMC, - Scope: common.PluginScopeContext, - }, - }, - expectedResult: []plugin.Discovered{ - { - Name: "foo", - Target: cliv1alpha1.TargetTMC, - Scope: common.PluginScopeContext, - }, - }, - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - result := combineDuplicatePlugins(tc.inputPlugins) - assertions.Equal(len(result), len(tc.expectedResult)) - for i := range tc.expectedResult { - p := findDiscoveredPlugin(result, tc.expectedResult[i].Name, tc.expectedResult[i].Target) - assertions.Equal(p.Scope, tc.expectedResult[i].Scope) - } - }) - } -} - -func TestHelperProcess(t *testing.T) { - if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" { - return - } - defer os.Exit(0) - args := os.Args - for len(args) > 0 { - if args[0] == "--" { - args = args[1:] - break - } - args = args[1:] - } - if len(args) == 0 { - fmt.Fprintf(os.Stderr, "No command\n") - os.Exit(2) - } - filePath := os.Getenv("FILE_PATH") - bytes, err := os.ReadFile(filePath) - if err != nil { - fmt.Fprintf(os.Stderr, "Unable to read plugin\n") - os.Exit(2) - } - fmt.Fprint(os.Stdout, string(bytes)) -} diff --git a/cli/core/pkg/pluginmanager/test/config-ng.yaml b/cli/core/pkg/pluginmanager/test/config-ng.yaml deleted file mode 100644 index 8a588836fd..0000000000 --- a/cli/core/pkg/pluginmanager/test/config-ng.yaml +++ /dev/null @@ -1,21 +0,0 @@ -currentContext: - kubernetes: mgmt - mission-control: tmc-fake -contexts: - - clusterOpts: - context: mgmt-admin@mgmt - path: config - isManagementCluster: true - name: mgmt - target: kubernetes - discoverySources: - - local: - name: fake-mgmt - path: context-mgmt - - globalOpts: - name: tmc-fake - target: mission-control - discoverySources: - - local: - name: fake-tmc - path: context-tmc diff --git a/cli/core/pkg/pluginmanager/test/config.yaml b/cli/core/pkg/pluginmanager/test/config.yaml deleted file mode 100644 index 34bd9b7185..0000000000 --- a/cli/core/pkg/pluginmanager/test/config.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: config.tanzu.vmware.com/v1alpha1 -clientOptions: - cli: - discoverySources: - - local: - name: default-local - path: default - - local: - name: fake - path: standalone - useContextAwareDiscovery: true -current: mgmt -currentContext: - kubernetes: mgmt - mission-control: tmc-fake -kind: ClientConfig -metadata: - creationTimestamp: null -servers: -- managementClusterOpts: - context: mgmt-admin@mgmt - path: config - name: mgmt - type: global - discoverySources: - - local: - name: fake-mgmt - path: context-mgmt -contexts: -- clusterOpts: - context: mgmt-admin@mgmt - path: config - isManagementCluster: true - name: mgmt - target: kubernetes - discoverySources: - - local: - name: fake-mgmt - path: context-mgmt -- globalOpts: - name: tmc-fake - target: mission-control - discoverySources: - - local: - name: fake-tmc - path: context-tmc diff --git a/cli/core/pkg/pluginmanager/test/legacy/bar/plugin.yaml b/cli/core/pkg/pluginmanager/test/legacy/bar/plugin.yaml deleted file mode 100644 index c62773be8e..0000000000 --- a/cli/core/pkg/pluginmanager/test/legacy/bar/plugin.yaml +++ /dev/null @@ -1,4 +0,0 @@ -name: bar -description: Bar plugin -version: v0.10.0 -buildSHA: dummysha diff --git a/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-darwin_amd64 b/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-darwin_amd64 deleted file mode 100644 index 875bcf2346..0000000000 --- a/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-darwin_amd64 +++ /dev/null @@ -1 +0,0 @@ -{"name":"bar","description":"Bar plugin operations","version":"v0.10.0","buildSHA":"c2dbd15","digest":"","group":"Run","docURL":"","completionType":0,"aliases":[],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-darwin_arm64 b/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-darwin_arm64 deleted file mode 100644 index 875bcf2346..0000000000 --- a/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-darwin_arm64 +++ /dev/null @@ -1 +0,0 @@ -{"name":"bar","description":"Bar plugin operations","version":"v0.10.0","buildSHA":"c2dbd15","digest":"","group":"Run","docURL":"","completionType":0,"aliases":[],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-linux_amd64 b/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-linux_amd64 deleted file mode 100644 index 875bcf2346..0000000000 --- a/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-linux_amd64 +++ /dev/null @@ -1 +0,0 @@ -{"name":"bar","description":"Bar plugin operations","version":"v0.10.0","buildSHA":"c2dbd15","digest":"","group":"Run","docURL":"","completionType":0,"aliases":[],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-windows_amd64 b/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-windows_amd64 deleted file mode 100644 index 875bcf2346..0000000000 --- a/cli/core/pkg/pluginmanager/test/legacy/bar/v0.10.0/tanzu-bar-windows_amd64 +++ /dev/null @@ -1 +0,0 @@ -{"name":"bar","description":"Bar plugin operations","version":"v0.10.0","buildSHA":"c2dbd15","digest":"","group":"Run","docURL":"","completionType":0,"aliases":[],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/legacy/foo/plugin.yaml b/cli/core/pkg/pluginmanager/test/legacy/foo/plugin.yaml deleted file mode 100644 index 24bc09e447..0000000000 --- a/cli/core/pkg/pluginmanager/test/legacy/foo/plugin.yaml +++ /dev/null @@ -1,4 +0,0 @@ -name: foo -description: Foo plugin -version: v0.12.0 -buildSHA: dummysha diff --git a/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-darwin_amd64 b/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-darwin_amd64 deleted file mode 100644 index 525d01fd7d..0000000000 --- a/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-darwin_amd64 +++ /dev/null @@ -1 +0,0 @@ -{"name":"foo","description":"Foo plugin operations","version":"v0.12.0","buildSHA":"c2dbd15","digest":"","group":"Run","docURL":"","completionType":0,"aliases":[],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-darwin_arm64 b/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-darwin_arm64 deleted file mode 100644 index 525d01fd7d..0000000000 --- a/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-darwin_arm64 +++ /dev/null @@ -1 +0,0 @@ -{"name":"foo","description":"Foo plugin operations","version":"v0.12.0","buildSHA":"c2dbd15","digest":"","group":"Run","docURL":"","completionType":0,"aliases":[],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-linux_amd64 b/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-linux_amd64 deleted file mode 100644 index 525d01fd7d..0000000000 --- a/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-linux_amd64 +++ /dev/null @@ -1 +0,0 @@ -{"name":"foo","description":"Foo plugin operations","version":"v0.12.0","buildSHA":"c2dbd15","digest":"","group":"Run","docURL":"","completionType":0,"aliases":[],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-windows_amd64 b/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-windows_amd64 deleted file mode 100644 index 525d01fd7d..0000000000 --- a/cli/core/pkg/pluginmanager/test/legacy/foo/v0.12.0/tanzu-foo-windows_amd64 +++ /dev/null @@ -1 +0,0 @@ -{"name":"foo","description":"Foo plugin operations","version":"v0.12.0","buildSHA":"c2dbd15","digest":"","group":"Run","docURL":"","completionType":0,"aliases":[],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/legacy/manifest.yaml b/cli/core/pkg/pluginmanager/test/legacy/manifest.yaml deleted file mode 100644 index 231237e6de..0000000000 --- a/cli/core/pkg/pluginmanager/test/legacy/manifest.yaml +++ /dev/null @@ -1,10 +0,0 @@ -plugins: -- name: core - description: The core Tanzu CLI - versions: [] -- name: foo - description: Foo plugin - versions: [] -- name: bar - description: Bar plugin - versions: [] diff --git a/cli/core/pkg/pluginmanager/test/local/discovery/context-mgmt/cluster.yaml b/cli/core/pkg/pluginmanager/test/local/discovery/context-mgmt/cluster.yaml deleted file mode 100644 index 353639929c..0000000000 --- a/cli/core/pkg/pluginmanager/test/local/discovery/context-mgmt/cluster.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - name: cluster -spec: - description: Cluster operation for the Kubernetes Cluster - artifacts: - v1.6.0: - - uri: v1.6.0/tanzu-cluster - os: darwin - arch: amd64 - type: local - - uri: v1.6.0/tanzu-cluster - os: linux - arch: amd64 - type: local - - uri: v1.6.0/tanzu-cluster - os: windows - arch: amd64 - type: local - - uri: v1.6.0/tanzu-cluster - os: darwin - arch: arm64 - type: local - recommendedVersion: v1.6.0 - target: k8s diff --git a/cli/core/pkg/pluginmanager/test/local/discovery/context-tmc/cluster.yaml b/cli/core/pkg/pluginmanager/test/local/discovery/context-tmc/cluster.yaml deleted file mode 100644 index 029f753d70..0000000000 --- a/cli/core/pkg/pluginmanager/test/local/discovery/context-tmc/cluster.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - name: cluster -spec: - description: Cluster operation for the Kubernetes Cluster - artifacts: - v0.2.0: - - uri: v0.2.0/tanzu-cluster - os: darwin - arch: amd64 - type: local - - uri: v0.2.0/tanzu-cluster - os: linux - arch: amd64 - type: local - - uri: v0.2.0/tanzu-cluster - os: windows - arch: amd64 - type: local - - uri: v0.2.0/tanzu-cluster - os: darwin - arch: arm64 - type: local - recommendedVersion: v0.2.0 - target: tmc diff --git a/cli/core/pkg/pluginmanager/test/local/discovery/context-tmc/management-cluster.yaml b/cli/core/pkg/pluginmanager/test/local/discovery/context-tmc/management-cluster.yaml deleted file mode 100644 index d7a1e1bc74..0000000000 --- a/cli/core/pkg/pluginmanager/test/local/discovery/context-tmc/management-cluster.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - name: management-cluster -spec: - description: Management Cluster Operations - artifacts: - v0.2.0: - - uri: v0.2.0/tanzu-management-cluster - os: darwin - arch: amd64 - type: local - - uri: v0.2.0/tanzu-management-cluster - os: linux - arch: amd64 - type: local - - uri: v0.2.0/tanzu-management-cluster - os: windows - arch: amd64 - type: local - - uri: v0.2.0/tanzu-management-cluster - os: darwin - arch: arm64 - type: local - recommendedVersion: v0.2.0 - target: tmc diff --git a/cli/core/pkg/pluginmanager/test/local/discovery/default/management-cluster.yaml b/cli/core/pkg/pluginmanager/test/local/discovery/default/management-cluster.yaml deleted file mode 100644 index f6734377c7..0000000000 --- a/cli/core/pkg/pluginmanager/test/local/discovery/default/management-cluster.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - name: management-cluster -spec: - description: Management Cluster Operations - artifacts: - v1.6.0: - - uri: v1.6.0/tanzu-management-cluster - os: darwin - arch: amd64 - type: local - - uri: v1.6.0/tanzu-management-cluster - os: linux - arch: amd64 - type: local - - uri: v1.6.0/tanzu-management-cluster - os: windows - arch: amd64 - type: local - - uri: v1.6.0/tanzu-management-cluster - os: darwin - arch: arm64 - type: local - recommendedVersion: v1.6.0 - target: k8s diff --git a/cli/core/pkg/pluginmanager/test/local/discovery/standalone-k8s-target/login.yaml b/cli/core/pkg/pluginmanager/test/local/discovery/standalone-k8s-target/login.yaml deleted file mode 100644 index b134a022c4..0000000000 --- a/cli/core/pkg/pluginmanager/test/local/discovery/standalone-k8s-target/login.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - name: login -spec: - description: Login to clusters - artifacts: - v0.2.0: - - uri: v0.2.0/tanzu-login - os: darwin - arch: amd64 - type: local - - uri: v0.2.0/tanzu-login - os: linux - arch: amd64 - type: local - - uri: v0.2.0/tanzu-login - os: windows - arch: amd64 - type: local - - uri: v0.2.0/tanzu-login - os: darwin - arch: arm64 - type: local - recommendedVersion: v0.2.0 - target: k8s diff --git a/cli/core/pkg/pluginmanager/test/local/discovery/standalone/login.yaml b/cli/core/pkg/pluginmanager/test/local/discovery/standalone/login.yaml deleted file mode 100644 index 831c100ec6..0000000000 --- a/cli/core/pkg/pluginmanager/test/local/discovery/standalone/login.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - name: login -spec: - description: Login to clusters - artifacts: - v0.2.0: - - uri: v0.2.0/tanzu-login - os: darwin - arch: amd64 - type: local - - uri: v0.2.0/tanzu-login - os: linux - arch: amd64 - type: local - - uri: v0.2.0/tanzu-login - os: windows - arch: amd64 - type: local - - uri: v0.2.0/tanzu-login - os: darwin - arch: arm64 - type: local - recommendedVersion: v0.2.0 diff --git a/cli/core/pkg/pluginmanager/test/local/distribution/v0.2.0/tanzu-cluster b/cli/core/pkg/pluginmanager/test/local/distribution/v0.2.0/tanzu-cluster deleted file mode 100644 index f3561e4bbc..0000000000 --- a/cli/core/pkg/pluginmanager/test/local/distribution/v0.2.0/tanzu-cluster +++ /dev/null @@ -1 +0,0 @@ -{"name":"cluster","description":"Kubernetes cluster operations","version":"v0.2.0","buildSHA":"c2dbd15","digest":"","group":"Run","docURL":"","completionType":0,"aliases":["cl","clusters"],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/local/distribution/v0.2.0/tanzu-login b/cli/core/pkg/pluginmanager/test/local/distribution/v0.2.0/tanzu-login deleted file mode 100644 index e1e353a908..0000000000 --- a/cli/core/pkg/pluginmanager/test/local/distribution/v0.2.0/tanzu-login +++ /dev/null @@ -1 +0,0 @@ -{"name":"login","description":"Login to the platform","version":"v0.2.0","buildSHA":"c2dbd15","digest":"","group":"System","docURL":"","completionType":0,"aliases":["lo","logins"],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/local/distribution/v0.2.0/tanzu-management-cluster b/cli/core/pkg/pluginmanager/test/local/distribution/v0.2.0/tanzu-management-cluster deleted file mode 100644 index 2981b0278f..0000000000 --- a/cli/core/pkg/pluginmanager/test/local/distribution/v0.2.0/tanzu-management-cluster +++ /dev/null @@ -1 +0,0 @@ -{"name":"management-cluster","description":"Management cluster operations","version":"v0.2.0","buildSHA":"c2dbd15","digest":"","group":"System","docURL":"","completionType":0,"aliases":[],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/local/distribution/v1.6.0/tanzu-cluster b/cli/core/pkg/pluginmanager/test/local/distribution/v1.6.0/tanzu-cluster deleted file mode 100644 index d00b60314c..0000000000 --- a/cli/core/pkg/pluginmanager/test/local/distribution/v1.6.0/tanzu-cluster +++ /dev/null @@ -1 +0,0 @@ -{"name":"cluster","description":"Kubernetes cluster operations","version":"v1.6.0","buildSHA":"c2dbd15","digest":"","group":"Run","docURL":"","completionType":0,"aliases":["cl","clusters"],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/pluginmanager/test/local/distribution/v1.6.0/tanzu-management-cluster b/cli/core/pkg/pluginmanager/test/local/distribution/v1.6.0/tanzu-management-cluster deleted file mode 100644 index 5f807ef174..0000000000 --- a/cli/core/pkg/pluginmanager/test/local/distribution/v1.6.0/tanzu-management-cluster +++ /dev/null @@ -1 +0,0 @@ -{"name":"management-cluster","description":"Management cluster operations","version":"v1.6.0","buildSHA":"c2dbd15","digest":"","group":"System","docURL":"","completionType":0,"aliases":[],"installationPath":"","discovery":"","scope":"","status":""} diff --git a/cli/core/pkg/registry/client.go b/cli/core/pkg/registry/client.go deleted file mode 100644 index e72188d4ba..0000000000 --- a/cli/core/pkg/registry/client.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package registry - -import ( - "archive/tar" - "bytes" - "io" - - "github.com/cppforlife/go-cli-ui/ui" - regname "github.com/google/go-containerregistry/pkg/name" - regv1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/k14s/imgpkg/pkg/imgpkg/cmd" - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - "github.com/pkg/errors" -) - -type registry struct { - opts *ctlimg.Opts - registry ctlimg.Registry -} - -// New instantiates a new Registry -func New(opts *ctlimg.Opts) (Registry, error) { - reg, err := ctlimg.NewRegistry(*opts) - if err != nil { - return nil, errors.Wrap(err, "failed to initialze registry client") - } - - return ®istry{ - opts: opts, - registry: reg, - }, nil -} - -// ListImageTags lists all tags of the given image. -func (r *registry) ListImageTags(imageName string) ([]string, error) { - ref, err := regname.ParseReference(imageName, regname.WeakValidation) - if err != nil { - return []string{}, err - } - - return r.registry.ListTags(ref.Context()) -} - -// GetFile gets the file content bundled in the given image:tag. -// If filename is empty, it will get the first file. -func (r *registry) GetFile(imageWithTag, filename string) ([]byte, error) { - ref, err := regname.ParseReference(imageWithTag, regname.WeakValidation) - if err != nil { - return nil, err - } - d, err := r.registry.Get(ref) - if err != nil { - return nil, errors.Wrap(err, "Collecting images") - } - - img, err := d.Image() - if err != nil { - return nil, err - } - - return getFileContentFromImage(img, filename) -} - -func getFileContentFromImage(image regv1.Image, filename string) ([]byte, error) { - layers, err := image.Layers() - - if err != nil { - return nil, err - } - - for _, imgLayer := range layers { - files, err := getFilesFromLayer(imgLayer) - if err != nil { - return nil, err - } - for k, v := range files { - if filename == "" || k == filename { - return v, nil - } - } - } - return nil, errors.New("cannot find file from the image") -} - -func getFilesFromLayer(imgLayer regv1.Layer) (map[string][]byte, error) { - layerStream, err := imgLayer.Uncompressed() - if err != nil { - return nil, err - } - defer layerStream.Close() - - files := make(map[string][]byte) - tarReader := tar.NewReader(layerStream) - for { - hdr, err := tarReader.Next() - if err != nil { - if err == io.EOF { - break - } - return files, err - } - if hdr.Typeflag == tar.TypeReg || hdr.Typeflag == tar.TypeRegA { - buf, err := io.ReadAll(tarReader) - if err != nil { - return files, err - } - files[hdr.Name] = buf - } - } - return files, nil -} - -// GetFiles get all the files content bundled in the given image:tag. -func (r *registry) GetFiles(imageWithTag string) (map[string][]byte, error) { - ref, err := regname.ParseReference(imageWithTag, regname.WeakValidation) - if err != nil { - return nil, err - } - d, err := r.registry.Get(ref) - if err != nil { - return nil, errors.Wrap(err, "Collecting images") - } - img, err := d.Image() - if err != nil { - return nil, err - } - - return getAllFilesContentFromImage(img) -} - -func getAllFilesContentFromImage(image regv1.Image) (map[string][]byte, error) { - layers, err := image.Layers() - - if err != nil { - return nil, err - } - - var files map[string][]byte - for _, imgLayer := range layers { - files, err = getFilesFromLayer(imgLayer) - if err != nil { - return nil, err - } - } - if len(files) != 0 { - return files, nil - } - return nil, errors.New("cannot find file from the image") -} - -// DownloadBundle downloads OCI bundle similar to `imgpkg pull -b` command -// It is recommended to use this function when downloading imgpkg bundle because -// - During the air-gapped script, these plugin discovery packages are copied to a -// private registry with the `imgpkg copy` command -// - Downloading files directly from OCI image similar to `GetFiles` doesn't work -// because it doesn't update the `ImageLock` file when we download the package from -// different registry. And returns original ImageLock file. and as ImageLock file -// is pointing to original registry instead of private registry, image references -// does not point to the correct location - -func (r *registry) DownloadBundle(imageName, outputDir string) error { - // Creating a dummy writer to capture the logs - // currently this logs are not displayed or used directly - var outputBuf, errorBuf bytes.Buffer - writerUI := ui.NewWriterUI(&outputBuf, &errorBuf, nil) - - pullOptions := cmd.NewPullOptions(writerUI) - pullOptions.OutputPath = outputDir - pullOptions.BundleFlags = cmd.BundleFlags{Bundle: imageName} - - if r.opts != nil { - pullOptions.RegistryFlags = cmd.RegistryFlags{ - CACertPaths: r.opts.CACertPaths, - VerifyCerts: r.opts.VerifyCerts, - Insecure: r.opts.Insecure, - Anon: r.opts.Anon, - } - } - - return pullOptions.Run() -} diff --git a/cli/core/pkg/registry/doc.go b/cli/core/pkg/registry/doc.go deleted file mode 100644 index bdcd61d8a2..0000000000 --- a/cli/core/pkg/registry/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package registry defines a Registry interface and client for working for imkpkg images. -package registry diff --git a/cli/core/pkg/registry/interface.go b/cli/core/pkg/registry/interface.go deleted file mode 100644 index 44a0434072..0000000000 --- a/cli/core/pkg/registry/interface.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package registry - -//go:generate counterfeiter -o ../fakes/registy.go --fake-name Registry . Registry - -// Registry defines the Registry interface -type Registry interface { - // ListImageTags lists all tags of the given image. - ListImageTags(imageName string) ([]string, error) - // GetFile gets the file content bundled in the given image:tag. - // If filename is empty, it will get the first file. - GetFile(imageWithTag string, filename string) ([]byte, error) - // GetFiles get all the files content bundled in the given image:tag. - GetFiles(imageWithTag string) (map[string][]byte, error) - // DownloadBundle downloads OCI bundle similar to `imgpkg pull -b` command - // It is recommended to use this function when downloading imgpkg bundle - DownloadBundle(imageName, outputDir string) error -} diff --git a/cli/core/pkg/utils/common.go b/cli/core/pkg/utils/common.go deleted file mode 100644 index a51a44ce97..0000000000 --- a/cli/core/pkg/utils/common.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package utils contains utility functions -package utils - -// ContainsString checks the string contains in string array -func ContainsString(arr []string, str string) bool { - for _, a := range arr { - if a == str { - return true - } - } - return false -} diff --git a/cli/core/pkg/utils/common_test.go b/cli/core/pkg/utils/common_test.go deleted file mode 100644 index 6984c4eb23..0000000000 --- a/cli/core/pkg/utils/common_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestUtils(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Utils Suite") -} - -var _ = Describe("Unit tests for the common utils", func() { - testStrings := []string{"foo", "bar", "baz"} - - It("String present in input array", func() { - present := ContainsString(testStrings, "bar") - Expect(present).To(BeTrue()) - }) - - It("String not present in input array", func() { - present := ContainsString(testStrings, "foobar") - Expect(present).To(BeFalse()) - }) -}) diff --git a/cli/core/pkg/utils/files.go b/cli/core/pkg/utils/files.go deleted file mode 100644 index dae34eeef8..0000000000 --- a/cli/core/pkg/utils/files.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "os" - "path/filepath" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/constants" -) - -// SaveFile saves the file to the provided path -// Also creates missing directories if any -func SaveFile(filePath string, data []byte) error { - dirName := filepath.Dir(filePath) - if _, serr := os.Stat(dirName); serr != nil { - merr := os.MkdirAll(dirName, os.ModePerm) - if merr != nil { - return merr - } - } - - err := os.WriteFile(filePath, data, constants.ConfigFilePermissions) - if err != nil { - return errors.Wrapf(err, "unable to save file '%s'", filePath) - } - - return nil -} - -// PathExists returns true if file/directory exists otherwise returns false -func PathExists(dir string) bool { - _, err := os.Stat(dir) - if err != nil && os.IsNotExist(err) { - return false - } - return true -} diff --git a/cli/core/pkg/utils/files_test.go b/cli/core/pkg/utils/files_test.go deleted file mode 100644 index d45dc278fd..0000000000 --- a/cli/core/pkg/utils/files_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("Unit tests for the files utils", func() { - Context("Unit tests for path exists", func() { - It("File does not exist", func() { - exists := PathExists("/tmp/foo.txt") - Expect(exists).To(BeFalse()) - }) - - It("File exists", func() { - path, err := os.CreateTemp("/tmp", "bar.txt") - Expect(err).To(BeNil()) - exists := PathExists(path.Name()) - Expect(exists).To(BeTrue()) - err = os.Remove(path.Name()) - Expect(err).To(BeNil()) - }) - }) - - Context("Unit tests for saving a file", func() { - It("test happy path", func() { - filePath := "/tmp/testfile" - fileContent := []byte("Test Content") - - err := SaveFile(filePath, fileContent) - Expect(err).To(BeNil()) - - err = os.Remove(filePath) - Expect(err).To(BeNil()) - }) - }) -}) diff --git a/cli/core/test/e2e/cli_lifecycle/init_version_cmds.go b/cli/core/test/e2e/cli_lifecycle/init_version_cmds.go deleted file mode 100644 index 912e517e57..0000000000 --- a/cli/core/test/e2e/cli_lifecycle/init_version_cmds.go +++ /dev/null @@ -1,33 +0,0 @@ -// Package config_e2e_test provides config command specific E2E test cases -package cli_e2e_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/test/e2e/framework" -) - -var _ = framework.CLICoreDescribe("[Tests:E2E][Feature:Command-init-version]", func() { - var ( - tf *framework.Framework - ) - BeforeEach(func() { - tf = framework.NewFramework() - }) - Context("tests for tanzu init and version commands", func() { - When("init command executed", func() { - It("should initialize cli successfully", func() { - err := tf.CliInit() - Expect(err).To(BeNil()) - }) - }) - When("version command executed", func() { - It("should return version info", func() { - version, err := tf.CliVersion() - Expect(version).NotTo(BeNil()) - Expect(err).To(BeNil()) - }) - }) - }) -}) diff --git a/cli/core/test/e2e/config/config_suite_test.go b/cli/core/test/e2e/config/config_suite_test.go deleted file mode 100644 index e3a5dc7d0e..0000000000 --- a/cli/core/test/e2e/config/config_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package config_e2e_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestConfig(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Config Suite") -} diff --git a/cli/core/test/e2e/config/config_test.go b/cli/core/test/e2e/config/config_test.go deleted file mode 100644 index 3ce5c082f4..0000000000 --- a/cli/core/test/e2e/config/config_test.go +++ /dev/null @@ -1,75 +0,0 @@ -// Package config_e2e_test provides config command specific E2E test cases -package config_e2e_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/test/e2e/framework" -) - -var _ = framework.CLICoreDescribe("[Tests:E2E][Feature:Command-Config]", func() { - var ( - tf *framework.Framework - ) - BeforeEach(func() { - tf = framework.NewFramework() - }) - Context("config feature flag operations", func() { - When("new config flag set with value", func() { - It("should set flag and unset flag successfully", func() { - randomFlagName := "e2e-test-" + framework.RandomString(4) - randomFeatureFlagPath := "features.global." + randomFlagName - flagVal := "true" - err := tf.ConfigSetFeatureFlag(randomFeatureFlagPath, flagVal) - Expect(err).To(BeNil()) - - val, err := tf.ConfigGetFeatureFlag(randomFeatureFlagPath) - Expect(err).To(BeNil()) - Expect(val).Should(Equal("true")) - - err = tf.ConfigUnsetFeature(randomFeatureFlagPath) - Expect(err).To(BeNil()) - - val, err = tf.ConfigGetFeatureFlag(randomFeatureFlagPath) - Expect(err).To(BeNil()) - Expect(val).Should(Equal("")) - }) - }) - When("config init called when config files not exists", func() { - It("should initialize configuration successfully", func() { - // delete config files - err := tf.DeleteCLIConfigurationFiles() - Expect(err).To(BeNil()) - // call init - err = tf.ConfigInit() - Expect(err).To(BeNil()) - // should create config files - Expect(tf.IsCLIConfigurationFilesExists()).To(BeTrue()) - - // set feature flag - randomFlagName := "e2e-test-" + framework.RandomString(4) - randomFeatureFlagPath := "features.global." + randomFlagName - flagVal := "true" - err = tf.ConfigSetFeatureFlag(randomFeatureFlagPath, flagVal) - Expect(err).To(BeNil()) - - val, err := tf.ConfigGetFeatureFlag(randomFeatureFlagPath) - Expect(err).To(BeNil()) - Expect(val).Should(Equal("true")) - - // call init - err = tf.ConfigInit() - Expect(err).To(BeNil()) - // second run of init should not remove the existing feature flag - val, err = tf.ConfigGetFeatureFlag(randomFeatureFlagPath) - Expect(err).To(BeNil()) - Expect(val).Should(Equal("true")) - - // unset the feature flag - err = tf.ConfigUnsetFeature(randomFeatureFlagPath) - Expect(err).To(BeNil()) - }) - }) - }) -}) diff --git a/cli/core/test/e2e/framework/cli_lifecycle_operations.go b/cli/core/test/e2e/framework/cli_lifecycle_operations.go deleted file mode 100644 index ad6d9e2a5d..0000000000 --- a/cli/core/test/e2e/framework/cli_lifecycle_operations.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package framework - -// CliOps performs basic cli operations -type CliOps interface { - CliInit() error - CliVersion() (string, error) - InstallCLI(version string) error - UninstallCLI(version string) error -} - -type cliOps struct { - CmdOps -} - -func NewCliOps() CliOps { - return &cliOps{ - CmdOps: NewCmdOps(), - } -} - -// Init() initializes the CLI -func (co *cliOps) CliInit() error { - _, _, err := co.Exec(TanzuInit) - return err -} - -// Version returns the CLI version info -func (co *cliOps) CliVersion() (string, error) { - stdOut, _, err := co.Exec(TanzuVersion) - return string(stdOut.Bytes()), err -} - -// InstallCLI installs specific CLI version -func (co *cliOps) InstallCLI(version string) (err error) { - return nil -} - -// UninstallCLI uninstalls specific CLI version -func (co *cliOps) UninstallCLI(version string) (err error) { - return nil -} diff --git a/cli/core/test/e2e/framework/cluster_container_runtime.go b/cli/core/test/e2e/framework/cluster_container_runtime.go deleted file mode 100644 index 2192e531d5..0000000000 --- a/cli/core/test/e2e/framework/cluster_container_runtime.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package framework - -import "fmt" - -// ContainerRuntime has operations to perform on container runtime -type ContainerRuntime interface { - StartContainerRuntime() (output string, err error) - ContainerRuntimeStatus() (status string, err error) - StopContainerRuntime() (output string, err error) -} - -// Docker is the container runtime of type docker -type Docker interface { - ContainerRuntime -} - -// Docker is the implementation of ContainerRuntime for docker specific -type docker struct { - CmdOps -} - -func NewDocker() Docker { - return &docker{ - CmdOps: NewCmdOps(), - } -} - -// StartContainerRuntime starts docker daemon if not already running -func (dc *docker) StartContainerRuntime() (output string, err error) { - // TODO: need to implement - return "", nil -} - -// ContainerRuntimeStatus returns docker daemon daemon status -func (dc *docker) ContainerRuntimeStatus() (status string, err error) { - stdOut, stdErr, err := dc.Exec(DockerInfo) - if err != nil { - return stdOut.String(), fmt.Errorf(stdErr.String(), err) - } - return stdOut.String(), err -} - -// StopContainerRuntime returns docker daemon daemon status -func (dc *docker) StopContainerRuntime() (output string, err error) { - // TODO: need to implement - return "", nil -} diff --git a/cli/core/test/e2e/framework/cluster_interface.go b/cli/core/test/e2e/framework/cluster_interface.go deleted file mode 100644 index f13764d66e..0000000000 --- a/cli/core/test/e2e/framework/cluster_interface.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package framework - -// ClusterOps has helper operations to perform on cluster -type ClusterOps interface { - CreateCluster(name string, args []string) (output string, err error) - DeleteCluster(name string, args []string) (output string, err error) - ClusterStatus(name string, args []string) (output string, err error) -} diff --git a/cli/core/test/e2e/framework/cluster_kind.go b/cli/core/test/e2e/framework/cluster_kind.go deleted file mode 100644 index 879da57b02..0000000000 --- a/cli/core/test/e2e/framework/cluster_kind.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package framework - -import ( - "fmt" - "strings" -) - -// KindCluster performs k8s KIND cluster operations -type KindCluster interface { - ClusterOps -} - -// kindCluster implements ClusterOps interface -type kindCluster struct { - CmdOps - ContainerRuntime -} - -func NewKindCluster(runtime ContainerRuntime) KindCluster { - return &kindCluster{ - CmdOps: NewCmdOps(), - ContainerRuntime: runtime, - } -} - -// CreateCluster creates kind cluster with given name and returns stdout info -// if container runtime not running or any error then returns stdout and error info -func (kc *kindCluster) CreateCluster(name string, args []string) (output string, err error) { - stdOut, err := kc.ContainerRuntimeStatus() - if err != nil { - return stdOut, err - } - stdOutBuffer, stdErrBuffer, err := kc.Exec(KindCreateCluster + " " + name + " " + strings.Join(args, " ")) - if err != nil { - return stdOutBuffer.String(), fmt.Errorf(stdErrBuffer.String(), err) - } - return stdOutBuffer.String(), err -} - -// DeleteCluster creates kind cluster with given name and returns stdout info -// if container runtime not running or any error then returns stdout and error info -func (kc *kindCluster) DeleteCluster(name string, args []string) (output string, err error) { - stdOut, err := kc.ContainerRuntimeStatus() - if err != nil { - return stdOut, err - } - stdOutBuffer, stdErrBuffer, err := kc.Exec(KindCreateCluster + " " + name + " " + strings.Join(args, " ")) - if err != nil { - return stdOutBuffer.String(), fmt.Errorf(stdErrBuffer.String(), err) - } - return stdOutBuffer.String(), err -} - -// ClusterStatus checks given kind cluster status and returns stdout info -// if container runtime not running or any error then returns stdout and error info -func (kc *kindCluster) ClusterStatus(name string, args []string) (output string, err error) { - stdOut, err := kc.ContainerRuntimeStatus() - if err != nil { - return stdOut, err - } - stdOutBuffer, stdErrBuffer, err := kc.Exec(KindCreateCluster + " " + name + " " + strings.Join(args, " ")) - if err != nil { - return stdOutBuffer.String(), fmt.Errorf(stdErrBuffer.String(), err) - } - return stdOutBuffer.String(), err -} diff --git a/cli/core/test/e2e/framework/cmd_exec_operations.go b/cli/core/test/e2e/framework/cmd_exec_operations.go deleted file mode 100644 index 93f21b3e6a..0000000000 --- a/cli/core/test/e2e/framework/cmd_exec_operations.go +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package framework - -import ( - "bytes" - "fmt" - "os/exec" - "strings" - - runtimeTest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -// CmdOps performs the Command line exec operations -type CmdOps interface { - Exec(command string) (stdOut, stdErr *bytes.Buffer, err error) - ExecContainsString(command, contains string) error - ExecContainsAnyString(command string, contains []string) error - ExecContainsErrorString(command, contains string) error - ExecNotContainsStdErrorString(command, contains string) error - ExecNotContainsString(command, contains string) error -} - -// cmdOps is the implementation of CmdOps -type cmdOps struct { - CmdOps -} - -func NewCmdOps() CmdOps { - return &cmdOps{} -} - -// Exec the command, exit on error -func (co *cmdOps) Exec(command string) (stdOut, stdErr *bytes.Buffer, err error) { - cmdInput := strings.Split(command, " ") - cmdName := cmdInput[0] - cmdArgs := cmdInput[1:] - cmd := exec.Command(cmdName, cmdArgs...) - var stdout, stderr bytes.Buffer - cmd.Stdout = &stdout - cmd.Stderr = &stderr - err = cmd.Run() - if err != nil { - return nil, nil, fmt.Errorf(fmt.Sprintf("error while running %s", command), err) - } - return &stdout, &stderr, nil -} - -// ExecContainsString checks that the given command output contains the string. -func (co *cmdOps) ExecContainsString(command, contains string) error { - stdOut, _, err := co.Exec(command) - if err != nil { - return err - } - return ContainsString(stdOut, contains) -} - -// ExecContainsAnyString checks that the given command output contains any of the given set of strings. -func (co *cmdOps) ExecContainsAnyString(command string, contains []string) error { - stdOut, _, err := co.Exec(command) - if err != nil { - return err - } - return ContainsAnyString(stdOut, contains) -} - -// ExecContainsErrorString checks that the given command stdErr output contains the string -func (co *cmdOps) ExecContainsErrorString(command, contains string) error { - _, stdErr, err := co.Exec(command) - if err != nil { - return err - } - return ContainsString(stdErr, contains) -} - -// ExecNotContainsStdErrorString checks that the given command stdErr output contains the string -func (co *cmdOps) ExecNotContainsStdErrorString(command, contains string) error { - _, stdErr, err := co.Exec(command) - if err != nil && stdErr == nil { - return err - } - return NotContainsString(stdErr, contains) -} - -// NotContainsString checks that the given buffer not contains the string if contains then throws error. -func NotContainsString(stdOut *bytes.Buffer, contains string) error { - so := stdOut.String() - if strings.Contains(so, contains) { - return fmt.Errorf("stdOut %q contains %q", so, contains) - } - return nil -} - -// ContainsString checks that the given buffer contains the string. -func ContainsString(stdOut *bytes.Buffer, contains string) error { - so := stdOut.String() - if !strings.Contains(so, contains) { - return fmt.Errorf("stdOut %q did not contain %q", so, contains) - } - return nil -} - -// ContainsAnyString checks that the given buffer contains any of the given set of strings. -func ContainsAnyString(stdOut *bytes.Buffer, contains []string) error { - var containsAny bool - so := stdOut.String() - - for _, str := range contains { - containsAny = containsAny || strings.Contains(so, str) - } - - if !containsAny { - return fmt.Errorf("stdOut %q did not contain of the following %q", so, contains) - } - return nil -} - -// ExecNotContainsString checks that the given command output not contains the string. -func (co *cmdOps) ExecNotContainsString(command, contains string) error { - stdOut, _, err := runtimeTest.Exec(command) - if err != nil { - return err - } - return co.NotContainsString(stdOut, contains) -} - -// NotContainsString checks that the given buffer not contains the string. -func (co *cmdOps) NotContainsString(stdOut *bytes.Buffer, contains string) error { - so := stdOut.String() - if strings.Contains(so, contains) { - return fmt.Errorf("stdOut %q does contain %q", so, contains) - } - return nil -} diff --git a/cli/core/test/e2e/framework/config_operations.go b/cli/core/test/e2e/framework/config_operations.go deleted file mode 100644 index 92aca8d12a..0000000000 --- a/cli/core/test/e2e/framework/config_operations.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package framework - -import ( - "os" - "path/filepath" - "strings" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -const ( - ConfigFileName = "config.yaml" - ConfigNGFileName = "config-ng.yaml" - ConfigFileDir = ".config/tanzu/" -) - -// ConfigOps performs "tanzu config" command operations -type ConfigOps interface { - ConfigSetFeatureFlag(path, value string) error - ConfigGetFeatureFlag(path string) (string, error) - ConfigUnsetFeature(path string) error - ConfigInit() error - ConfigServerList() error - ConfigServerDelete(serverName string) error - DeleteCLIConfigurationFiles() error - IsCLIConfigurationFilesExists() bool -} - -// configOps is the implementation of ConfOps interface -type configOps struct { - CmdOps -} - -func NewConfOps() ConfigOps { - return &configOps{ - CmdOps: NewCmdOps(), - } -} - -// ConfigSetFeature sets the tanzu config feature flag -func (co *configOps) ConfigSetFeatureFlag(path, value string) (err error) { - confSetCmd := ConfigSet + path + " " + value - _, _, err = co.Exec(confSetCmd) - return err -} - -// ConfigSetFeature sets the tanzu config feature flag -func (co *configOps) ConfigGetFeatureFlag(path string) (string, error) { - out, _, err := co.Exec(ConfigGet) - if err != nil { - return "", err - } - - var cnf *configapi.ClientConfig - err = yaml.Unmarshal(out.Bytes(), &cnf) - if err != nil { - return "", errors.Wrap(err, "failed to construct yaml node from config get output") - } - featureName := strings.Split(path, ".")[len(strings.Split(path, "."))-1] - pluginName := strings.Split(path, ".")[len(strings.Split(path, "."))-2] - if cnf != nil && cnf.ClientOptions.Features[pluginName] != nil { - return cnf.ClientOptions.Features[pluginName][featureName], nil - } - return "", err -} - -// ConfigUnsetFeature un-sets the tanzu config feature flag -func (co *configOps) ConfigUnsetFeature(path string) (err error) { - unsetFeatureCmd := ConfigUnset + path - _, _, err = co.Exec(unsetFeatureCmd) - return -} - -// ConfigInit performs "tanzu config init" -func (co *configOps) ConfigInit() (err error) { - _, _, err = co.Exec(ConfigInit) - return -} - -// ConfigServerList returns the server list -// TODO: should return the servers info in proper format -func (co *configOps) ConfigServerList() (err error) { - _, _, err = co.Exec(ConfigServerList) - return -} - -// ConfigServerDelete deletes a server from tanzu config -func (co *configOps) ConfigServerDelete(serverName string) error { - _, _, err := co.Exec(ConfigServerDelete + serverName) - return err -} - -// DeleteCLIConfigurationFiles deletes cli configuration files -func (co *configOps) DeleteCLIConfigurationFiles() error { - homeDir, _ := os.UserHomeDir() - configFile := filepath.Join(homeDir, ConfigFileDir, ConfigFileName) - _, err := os.Stat(configFile) - if err == nil { - if ferr := os.Remove(configFile); ferr != nil { - return ferr - } - } - configNGFile := filepath.Join(homeDir, ConfigFileDir, ConfigNGFileName) - if _, err := os.Stat(configNGFile); err == nil { - if ferr := os.Remove(configNGFile); ferr != nil { - return ferr - } - } - return nil -} - -// IsCLIConfigurationFilesExists checks the existence of cli configuration files -func (co *configOps) IsCLIConfigurationFilesExists() bool { - homeDir, _ := os.UserHomeDir() - configFilePath := filepath.Join(homeDir, ConfigFileDir, ConfigFileName) - configNGFilePath := filepath.Join(homeDir, ConfigFileDir, ConfigNGFileName) - _, err1 := os.Stat(configFilePath) - _, err2 := os.Stat(configNGFilePath) - if err1 == nil && err2 == nil { - return true - } - return false -} diff --git a/cli/core/test/e2e/framework/framework.go b/cli/core/test/e2e/framework/framework.go deleted file mode 100644 index 7119122b3a..0000000000 --- a/cli/core/test/e2e/framework/framework.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package test defines the integration and end-to-end test case for cli core -package framework - -import ( - "os" - "path/filepath" - - "github.com/onsi/ginkgo" -) - -const ( - CliCore = "[CLI-Core]" - - TanzuInit = "tanzu init" - TanzuVersion = "tanzu version" - - ConfigSet = "tanzu config set " - ConfigGet = "tanzu config get " - ConfigUnset = "tanzu config unset " - ConfigInit = "tanzu config init" - ConfigServerList = "tanzu config server list" - ConfigServerDelete = "tanzu config server delete " - - KindCreateCluster = "kind create cluster --name " - DockerInfo = "docker info" - TestDir = ".tanzu-cli-e2e" -) - -// CLICoreDescribe annotates the test with the CLICore label. -func CLICoreDescribe(text string, body func()) bool { - return ginkgo.Describe(CliCore+text, body) -} - -// Framework has all helper functions to write CLI e2e test cases -type Framework struct { - CliOps - ConfigOps - ClusterOps -} - -func NewFramework() *Framework { - return &Framework{ - CliOps: NewCliOps(), - ConfigOps: NewConfOps(), - ClusterOps: NewKindCluster(NewDocker()), - } -} - -func init() { - homeDir, _ := os.UserHomeDir() - testDirPath := filepath.Join(homeDir, TestDir) - os.Setenv("HOME", testDirPath) -} diff --git a/cli/core/test/e2e/framework/util.go b/cli/core/test/e2e/framework/util.go deleted file mode 100644 index 2e85aa4b2b..0000000000 --- a/cli/core/test/e2e/framework/util.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package framework - -import ( - "math/rand" - "time" -) - -// RandomString generates random string of given length -func RandomString(length int) string { - var seededRand *rand.Rand = rand.New( - rand.NewSource(time.Now().UnixNano())) - charset := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW1234567890" - b := make([]byte, length) - for i := range b { - b[i] = charset[seededRand.Intn(len(charset))] - } - return string(b) -} diff --git a/cli/runtime/Makefile b/cli/runtime/Makefile deleted file mode 100644 index 003aa93ea7..0000000000 --- a/cli/runtime/Makefile +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -ROOT_DIR := $(shell git rev-parse --show-toplevel) -MODULE_ROOT_DIR := $(ROOT_DIR)/cli/runtime - -# Golang specific variables -GOOS ?= $(shell go env GOOS) -GOARCH ?= $(shell go env GOARCH) -GOHOSTOS ?= $(shell go env GOHOSTOS) -GOHOSTARCH ?= $(shell go env GOHOSTARCH) -# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) -ifeq (,$(shell go env GOBIN)) -GOBIN=$(shell go env GOPATH)/bin -else -GOBIN=$(shell go env GOBIN) -endif -GO := go - -NUL = /dev/null -ifeq ($(GOHOSTOS),windows) - NUL = NUL -endif - -BUILD_SHA ?= $$(git describe --match=$(git rev-parse --short HEAD) --always --dirty) -BUILD_DATE ?= $$(date -u +"%Y-%m-%d") -BUILD_VERSION ?= $(shell git describe --tags --abbrev=0 2>$(NUL)) - -ifeq ($(strip $(BUILD_VERSION)),) -BUILD_VERSION = dev -endif - - -# Directories -TOOLS_DIR := $(abspath $(MODULE_ROOT_DIR)/hack/tools) -TOOLS_BIN_DIR := $(TOOLS_DIR)/bin - -# Add tooling binaries here and in hack/tools/Makefile -GOIMPORTS := $(TOOLS_BIN_DIR)/goimports -CONTROLLER_GEN := $(TOOLS_BIN_DIR)/controller-gen -TOOLING_BINARIES := $(GOIMPORTS) $(CONTROLLER_GEN) - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help (default) - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-28s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m\033[32m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -## -------------------------------------- -## All -## -------------------------------------- - -.PHONY: all -all: test ## Tests the library - - -.PHONY: configure-version -configure-version: ## Configure plugin runtime version - # Update plugin runtime version variable in version pkg - sed "s+TANZU_PLUGIN_RUNTIME_VERSION+${BUILD_VERSION}+g" hack/update-bundled-plugin-runtime-version/update-bundled-plugin-runtime-version.txt > version/zz_generated_plugin_runtime_version.go - -## -------------------------------------- -## Testing -## -------------------------------------- - -.PHONY: test -test: fmt vet ## Run Tests - ${GO} test ./... -timeout 60m -race -coverprofile coverage.txt -v - -.PHONY: vet -vet: ## Vet codebase - ${GO} vet ./... - -fmt: $(GOIMPORTS) ## Run goimports - $(GOIMPORTS) -w -local github.com/vmware-tanzu ./ - -## -------------------------------------- -## Tooling Binaries -## -------------------------------------- - -tools: $(TOOLING_BINARIES) ## Build tooling binaries -.PHONY: $(TOOLING_BINARIES) -$(TOOLING_BINARIES): - make -C $(TOOLS_DIR) $(@F) - -## -------------------------------------- -## Generators -## -------------------------------------- - -CONTROLLER_GEN_SRC ?= "./..." - -generate-controller-code: $(CONTROLLER_GEN) $(GOIMPORTS) ## Generate code via controller-gen - $(CONTROLLER_GEN) $(GENERATOR) object:headerFile="$(MODULE_ROOT_DIR)/hack/boilerplate.go.txt",year=$(shell date +%Y) paths="$(CONTROLLER_GEN_SRC)" $(OPTIONS) - $(MAKE) fmt - -generate-manifests: - $(MAKE) generate-controller-code GENERATOR=crd OPTIONS="output:crd:artifacts:config=$(MODULE_ROOT_DIR)/generated/crd/bases" CONTROLLER_GEN_SRC=$(CONTROLLER_GEN_SRC) diff --git a/cli/runtime/README.md b/cli/runtime/README.md deleted file mode 100644 index 94dc67c79e..0000000000 --- a/cli/runtime/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Tanzu CLI Integration Library - -[![Go Reference](https://pkg.go.dev/badge/github.com/vmware-tanzu/tanzu-framework.svg)](https://pkg.go.dev/github.com/vmware-tanzu/tanzu-framework/cli/runtime) - -## Overview - -The Tanzu CLI is based on a plugin architecture. This architecture enables teams to build, own, and release their own piece of functionality as well as enable external partners to integrate with the system. The Tanzu CLI Integration Library provides functionality and helper methods to develop Tanzu CLI plugins. - -Developers can use the `Builder` admin plugin to bootstrap a new plugin which can then use tooling and functionality available within the integration library to implement its own features. - -## Documentation - -The [documentation](docs) provides a getting-started guide and details on how to consume the integration library for plugin development. diff --git a/cli/runtime/apis/cli/v1alpha1/catalog_types.go b/cli/runtime/apis/cli/v1alpha1/catalog_types.go deleted file mode 100644 index a761e08bb1..0000000000 --- a/cli/runtime/apis/cli/v1alpha1/catalog_types.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" -) - -// Distro is the Schema for the catalogs API -type Distro []string - -// CmdGroup is a group of CLI commands. -type CmdGroup string - -// PluginCompletionType is the mechanism used for determining command line completion options. -type PluginCompletionType int - -// PluginAssociation is a set of plugin names and their associated installation paths. -type PluginAssociation map[string]string - -// Add adds plugin entry to the map -func (pa PluginAssociation) Add(pluginName, installationPath string) { - if pa == nil { - pa = map[string]string{} - } - pa[pluginName] = installationPath -} - -// Remove deletes plugin entry from the map -func (pa PluginAssociation) Remove(pluginName string) { - delete(pa, pluginName) -} - -// Get returns installation path for the plugin -// If plugin doesn't exists in map it will return empty string -func (pa PluginAssociation) Get(pluginName string) string { - return pa[pluginName] -} - -// Map returns associated list of plugins as a map -func (pa PluginAssociation) Map() map[string]string { - return pa -} - -// +kubebuilder:object:generate=false - -// Hook is the mechanism used to define function for plugin hooks -type Hook func() error - -// DeepCopyInto is an deepcopy function implementation of Hook -// currently there is nothing that we need to copy hence keeping this empty -func (in *Hook) DeepCopyInto(out *Hook) { -} - -const ( - // NativePluginCompletion indicates command line completion is determined using the built in - // cobra.Command __complete mechanism. - NativePluginCompletion PluginCompletionType = iota - // StaticPluginCompletion indicates command line completion will be done by using a statically - // defined list of options. - StaticPluginCompletion - // DynamicPluginCompletion indicates command line completion will be retrieved from the plugin - // at runtime. - DynamicPluginCompletion - - // RunCmdGroup are commands associated with Tanzu Run. - RunCmdGroup CmdGroup = "Run" - - // ManageCmdGroup are commands associated with Tanzu Manage. - ManageCmdGroup CmdGroup = "Manage" - - // BuildCmdGroup are commands associated with Tanzu Build. - BuildCmdGroup CmdGroup = "Build" - - // ObserveCmdGroup are commands associated with Tanzu Observe. - ObserveCmdGroup CmdGroup = "Observe" - - // SystemCmdGroup are system commands. - SystemCmdGroup CmdGroup = "System" - - // TargetCmdGroup are various target commands. - TargetCmdGroup CmdGroup = "Target" - - // VersionCmdGroup are version commands. - VersionCmdGroup CmdGroup = "Version" - - // AdminCmdGroup are admin commands. - AdminCmdGroup CmdGroup = "Admin" - - // TestCmdGroup is the test command group. - TestCmdGroup CmdGroup = "Test" - - // ExtraCmdGroup is the extra command group. - ExtraCmdGroup CmdGroup = "Extra" -) - -// PluginDescriptor describes a plugin binary. -type PluginDescriptor struct { - // Name is the name of the plugin. - Name string `json:"name" yaml:"name"` - - // Description is the plugin's description. - Description string `json:"description" yaml:"description"` - - // Version of the plugin. Must be a valid semantic version https://semver.org/ - Version string `json:"version" yaml:"version"` - - // BuildSHA is the git commit hash the plugin was built with. - BuildSHA string `json:"buildSHA" yaml:"buildSHA"` - - // Digest is the SHA256 hash of the plugin binary. - Digest string `json:"digest" yaml:"digest"` - - // Command group for the plugin. - Group CmdGroup `json:"group" yaml:"group"` - - // DocURL for the plugin. - DocURL string `json:"docURL" yaml:"docURL"` - - // Hidden tells whether the plugin should be hidden from the help command. - Hidden bool `json:"hidden,omitempty" yaml:"hidden,omitempty"` - - // CompletionType determines how command line completion will be determined. - CompletionType PluginCompletionType `json:"completionType" yaml:"completionType"` - - // CompletionArgs contains the valid command line completion values if `CompletionType` - // is set to `StaticPluginCompletion`. - CompletionArgs []string `json:"completionArgs,omitempty" yaml:"completionArgs,omitempty"` - - // CompletionCommand is the command to call from the plugin to retrieve a list of - // valid completion nouns when `CompletionType` is set to `DynamicPluginCompletion`. - CompletionCommand string `json:"completionCmd,omitempty" yaml:"completionCmd,omitempty"` - - // Aliases are other text strings used to call this command - Aliases []string `json:"aliases,omitempty" yaml:"aliases,omitempty"` - - // InstallationPath is a relative installation path for a plugin binary. - // E.g., cluster/v0.3.2@sha256:... - InstallationPath string `json:"installationPath"` - - // Discovery is the name of the discovery from where - // this plugin is discovered. - Discovery string `json:"discovery"` - - // Scope is the scope of the plugin. Stand-Alone or Context - Scope string `json:"scope"` - - // Status is the current plugin installation status - Status string `json:"status"` - - // DiscoveredRecommendedVersion specifies the recommended version of the plugin that was discovered - DiscoveredRecommendedVersion string `json:"discoveredRecommendedVersion"` - - // Target specifies the target of the plugin - Target cliv1alpha1.Target `json:"target"` - - // PostInstallHook is function to be run post install of a plugin. - PostInstallHook Hook `json:"-" yaml:"-"` - - // DefaultFeatureFlags is default featureflags to be configured if missing when invoking plugin - DefaultFeatureFlags map[string]bool `json:"defaultFeatureFlags"` -} - -// +kubebuilder:object:root=true - -// Catalog is the Schema for the catalogs API -type Catalog struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - // PluginDescriptors is a list of PluginDescriptor - PluginDescriptors []*PluginDescriptor `json:"pluginDescriptors,omitempty" yaml:"pluginDescriptors"` - - // IndexByPath of PluginDescriptors for all installed plugins by installation path. - IndexByPath map[string]PluginDescriptor `json:"indexByPath,omitempty"` - // IndeByName of all plugin installation paths by name. - IndexByName map[string][]string `json:"indexByName,omitempty"` - // StandAlonePlugins is a set of stand-alone plugin installations aggregated across all context types. - // Note: Shall be reduced to only those stand-alone plugins that are common to all context types. - StandAlonePlugins PluginAssociation `json:"standAlonePlugins,omitempty"` - // ServerPlugins links a server and a set of associated plugin installations. - ServerPlugins map[string]PluginAssociation `json:"serverPlugins,omitempty"` -} - -// +kubebuilder:object:root=true - -// CatalogList contains a list of Catalog -type CatalogList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []Catalog `json:"items"` -} - -func init() { - SchemeBuilder.Register(&Catalog{}, &CatalogList{}) -} diff --git a/cli/runtime/apis/cli/v1alpha1/groupversion_info.go b/cli/runtime/apis/cli/v1alpha1/groupversion_info.go deleted file mode 100644 index 0e3f38583a..0000000000 --- a/cli/runtime/apis/cli/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 contains API Schema definitions for the cli v1alpha1 API group -// +kubebuilder:object:generate=true -// +groupName=cli.tanzu.vmware.com -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "cli.tanzu.vmware.com", Version: "v1alpha1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme - - // GroupVersionKindCatalog has information about group, version and kind of Catalog object. - GroupVersionKindCatalog = GroupVersion.WithKind("Catalog") -) diff --git a/cli/runtime/apis/cli/v1alpha1/zz_generated.deepcopy.go b/cli/runtime/apis/cli/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 1fcb438a90..0000000000 --- a/cli/runtime/apis/cli/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,200 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Catalog) DeepCopyInto(out *Catalog) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.PluginDescriptors != nil { - in, out := &in.PluginDescriptors, &out.PluginDescriptors - *out = make([]*PluginDescriptor, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(PluginDescriptor) - (*in).DeepCopyInto(*out) - } - } - } - if in.IndexByPath != nil { - in, out := &in.IndexByPath, &out.IndexByPath - *out = make(map[string]PluginDescriptor, len(*in)) - for key, val := range *in { - (*out)[key] = *val.DeepCopy() - } - } - if in.IndexByName != nil { - in, out := &in.IndexByName, &out.IndexByName - *out = make(map[string][]string, len(*in)) - for key, val := range *in { - var outVal []string - if val == nil { - (*out)[key] = nil - } else { - in, out := &val, &outVal - *out = make([]string, len(*in)) - copy(*out, *in) - } - (*out)[key] = outVal - } - } - if in.StandAlonePlugins != nil { - in, out := &in.StandAlonePlugins, &out.StandAlonePlugins - *out = make(PluginAssociation, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.ServerPlugins != nil { - in, out := &in.ServerPlugins, &out.ServerPlugins - *out = make(map[string]PluginAssociation, len(*in)) - for key, val := range *in { - var outVal map[string]string - if val == nil { - (*out)[key] = nil - } else { - in, out := &val, &outVal - *out = make(PluginAssociation, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - (*out)[key] = outVal - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Catalog. -func (in *Catalog) DeepCopy() *Catalog { - if in == nil { - return nil - } - out := new(Catalog) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Catalog) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CatalogList) DeepCopyInto(out *CatalogList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Catalog, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CatalogList. -func (in *CatalogList) DeepCopy() *CatalogList { - if in == nil { - return nil - } - out := new(CatalogList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *CatalogList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in Distro) DeepCopyInto(out *Distro) { - { - in := &in - *out = make(Distro, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Distro. -func (in Distro) DeepCopy() Distro { - if in == nil { - return nil - } - out := new(Distro) - in.DeepCopyInto(out) - return *out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in PluginAssociation) DeepCopyInto(out *PluginAssociation) { - { - in := &in - *out = make(PluginAssociation, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PluginAssociation. -func (in PluginAssociation) DeepCopy() PluginAssociation { - if in == nil { - return nil - } - out := new(PluginAssociation) - in.DeepCopyInto(out) - return *out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PluginDescriptor) DeepCopyInto(out *PluginDescriptor) { - *out = *in - if in.CompletionArgs != nil { - in, out := &in.CompletionArgs, &out.CompletionArgs - *out = make([]string, len(*in)) - copy(*out, *in) - } - if in.Aliases != nil { - in, out := &in.Aliases, &out.Aliases - *out = make([]string, len(*in)) - copy(*out, *in) - } - in.PostInstallHook.DeepCopyInto(&out.PostInstallHook) - if in.DefaultFeatureFlags != nil { - in, out := &in.DefaultFeatureFlags, &out.DefaultFeatureFlags - *out = make(map[string]bool, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PluginDescriptor. -func (in *PluginDescriptor) DeepCopy() *PluginDescriptor { - if in == nil { - return nil - } - out := new(PluginDescriptor) - in.DeepCopyInto(out) - return out -} diff --git a/cli/runtime/apis/config/v1alpha1/clientconfig.go b/cli/runtime/apis/config/v1alpha1/clientconfig.go deleted file mode 100644 index 5bde30a41e..0000000000 --- a/cli/runtime/apis/config/v1alpha1/clientconfig.go +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "errors" - "fmt" - "strconv" - "strings" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" -) - -const ( - // AllUnstableVersions allows all plugin versions - AllUnstableVersions VersionSelectorLevel = "all" - // AlphaUnstableVersions allows all alpha tagged versions - AlphaUnstableVersions VersionSelectorLevel = "alpha" - // ExperimentalUnstableVersions includes all pre-releases, minus +build tags - ExperimentalUnstableVersions VersionSelectorLevel = "experimental" - // NoUnstableVersions allows no unstable plugin versions, format major.minor.patch only - NoUnstableVersions VersionSelectorLevel = "none" -) - -const ( - // FeatureCli allows a feature to be set at the CLI level (globally) rather than for a single plugin - FeatureCli string = "cli" - // EditionStandard Edition value (in config) affects branding and cluster creation - EditionStandard = "tkg" - EditionCommunity = "tce" -) - -// EditionSelector allows selecting edition versions based on config file -type EditionSelector string - -// VersionSelectorLevel allows selecting plugin versions based on semver properties -type VersionSelectorLevel string - -// IsGlobal tells if the server is global. -// Deprecation targeted for a future version. Use Context.Target instead. -func (s *Server) IsGlobal() bool { - return s.Type == GlobalServerType -} - -// IsManagementCluster tells if the server is a management cluster. -// Deprecation targeted for a future version. Use Context.Target instead. -func (s *Server) IsManagementCluster() bool { - return s.Type == ManagementClusterServerType -} - -// GetCurrentServer returns the current server. -// Deprecation targeted for a future version. Use GetCurrentContext() instead. -func (c *ClientConfig) GetCurrentServer() (*Server, error) { - for _, server := range c.KnownServers { - if server.Name == c.CurrentServer { - return server, nil - } - } - return nil, fmt.Errorf("current server %q not found", c.CurrentServer) -} - -// HasServer tells whether the Server by the given name exists. -func (c *ClientConfig) HasServer(name string) bool { - for _, s := range c.KnownServers { - if s.Name == name { - return true - } - } - return false -} - -// GetContext by name. -func (c *ClientConfig) GetContext(name string) (*Context, error) { - for _, ctx := range c.KnownContexts { - if ctx.Name == name { - return ctx, nil - } - } - return nil, fmt.Errorf("could not find context %q", name) -} - -// HasContext tells whether the Context by the given name exists. -func (c *ClientConfig) HasContext(name string) bool { - _, err := c.GetContext(name) - return err == nil -} - -// GetCurrentContext returns the current context for the given type. -func (c *ClientConfig) GetCurrentContext(target cliapi.Target) (*Context, error) { - ctxName := c.CurrentContext[target] - if ctxName == "" { - return nil, fmt.Errorf("no current context set for target %q", target) - } - ctx, err := c.GetContext(ctxName) - if err != nil { - return nil, fmt.Errorf("unable to get current context: %s", err.Error()) - } - return ctx, nil -} - -// GetAllCurrentContextsMap returns all current context per Target -func (c *ClientConfig) GetAllCurrentContextsMap() (map[cliapi.Target]*Context, error) { - currentContexts := make(map[cliapi.Target]*Context) - for _, target := range cliapi.SupportedTargets { - context, err := c.GetCurrentContext(target) - if err == nil && context != nil { - currentContexts[target] = context - } - } - return currentContexts, nil -} - -// GetAllCurrentContextsList returns all current context names as list -func (c *ClientConfig) GetAllCurrentContextsList() ([]string, error) { - var serverNames []string - currentContextsMap, err := c.GetAllCurrentContextsMap() - if err != nil { - return nil, err - } - - for _, context := range currentContextsMap { - serverNames = append(serverNames, context.Name) - } - return serverNames, nil -} - -// SetCurrentContext sets the current context for the given target. -func (c *ClientConfig) SetCurrentContext(target cliapi.Target, ctxName string) error { - if c.CurrentContext == nil { - c.CurrentContext = make(map[cliapi.Target]string) - } - c.CurrentContext[target] = ctxName - ctx, err := c.GetContext(ctxName) - if err != nil { - return err - } - if ctx.IsManagementCluster() || ctx.Target == cliapi.TargetTMC { - c.CurrentServer = ctxName - } - return nil -} - -// IsManagementCluster tells if the context is for a management cluster. -func (c *Context) IsManagementCluster() bool { - return c != nil && c.Target == cliapi.TargetK8s && c.ClusterOpts != nil && c.ClusterOpts.IsManagementCluster -} - -// SetUnstableVersionSelector will help determine the unstable versions supported -// In order of restrictiveness: -// "all" -> "alpha" -> "experimental" -> "none" -// none: return stable versions only. the default for both the config and the old flag. -// alpha: only versions tagged with -alpha -// experimental: all pre-release versions without +build semver data -// all: return all unstable versions. -func (c *ClientConfig) SetUnstableVersionSelector(f VersionSelectorLevel) { - if c.ClientOptions == nil { - c.ClientOptions = &ClientOptions{} - } - if c.ClientOptions.CLI == nil { - c.ClientOptions.CLI = &CLIOptions{} - } - switch f { - case AllUnstableVersions, AlphaUnstableVersions, ExperimentalUnstableVersions, NoUnstableVersions: - c.ClientOptions.CLI.UnstableVersionSelector = f - return - } - c.ClientOptions.CLI.UnstableVersionSelector = AllUnstableVersions -} - -// IsConfigFeatureActivated return true if the feature is activated, false if not. An error if the featurePath is malformed -func (c *ClientConfig) IsConfigFeatureActivated(featurePath string) (bool, error) { - plugin, flag, err := c.SplitFeaturePath(featurePath) - if err != nil { - return false, err - } - - if c.ClientOptions == nil || c.ClientOptions.Features == nil || - c.ClientOptions.Features[plugin] == nil || c.ClientOptions.Features[plugin][flag] == "" { - return false, nil - } - - booleanValue, err := strconv.ParseBool(c.ClientOptions.Features[plugin][flag]) - if err != nil { - errMsg := "error converting " + featurePath + " entry '" + c.ClientOptions.Features[plugin][flag] + "' to boolean value: " + err.Error() - return false, errors.New(errMsg) - } - return booleanValue, nil -} - -// GetEnvConfigurations returns a map of environment variables to values -// it returns nil if configuration is not yet defined -func (c *ClientConfig) GetEnvConfigurations() map[string]string { - if c.ClientOptions == nil || c.ClientOptions.Env == nil { - return nil - } - return c.ClientOptions.Env -} - -// SplitFeaturePath splits a features path into the pluginName and the featureName -// For example "features.management-cluster.dual-stack" returns "management-cluster", "dual-stack" -// An error results from a malformed path, including any path that does not start with "features." -func (c *ClientConfig) SplitFeaturePath(featurePath string) (string, string, error) { - // parse the param - paramArray := strings.Split(featurePath, ".") - if len(paramArray) != 3 { - return "", "", errors.New("unable to parse feature name config parameter into three parts [" + featurePath + "] (was expecting features..)") - } - - featuresLiteral := paramArray[0] - plugin := paramArray[1] - flag := paramArray[2] - - if featuresLiteral != "features" { - return "", "", errors.New("unsupported feature config path parameter [" + featuresLiteral + "] (was expecting 'features..')") - } - return plugin, flag, nil -} - -// SetEditionSelector indicates the edition of tanzu to be run -// EditionStandard is the default, EditionCommunity is also available. -// These values affect branding and cluster creation -func (c *ClientConfig) SetEditionSelector(edition EditionSelector) { - if c.ClientOptions == nil { - c.ClientOptions = &ClientOptions{} - } - if c.ClientOptions.CLI == nil { - c.ClientOptions.CLI = &CLIOptions{} - } - switch edition { - case EditionCommunity, EditionStandard: - c.ClientOptions.CLI.Edition = edition - return - } - c.ClientOptions.CLI.UnstableVersionSelector = EditionStandard -} diff --git a/cli/runtime/apis/config/v1alpha1/clientconfig_test.go b/cli/runtime/apis/config/v1alpha1/clientconfig_test.go deleted file mode 100644 index 806ec597ba..0000000000 --- a/cli/runtime/apis/config/v1alpha1/clientconfig_test.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "testing" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - - "github.com/stretchr/testify/suite" -) - -// ClientTestSuite is the set of tests to run for the v1alpha1 Client. -type ClientTestSuite struct { - suite.Suite - ClientConfig ClientConfig - GlobalServer Server - ManagementServer Server -} - -// SetupTest performs setup for each test. -func (suite *ClientTestSuite) SetupTest() { - suite.GlobalServer = Server{ - Name: "GlobalServer", - Type: GlobalServerType, - } - suite.ManagementServer = Server{ - Name: "ManagementServer", - Type: ManagementClusterServerType, - } - suite.ClientConfig = ClientConfig{ - KnownServers: []*Server{ - &suite.GlobalServer, - &suite.ManagementServer, - }, - CurrentServer: suite.GlobalServer.Name, - KnownContexts: []*Context{ - { - Name: suite.GlobalServer.Name, - Target: cliapi.TargetTMC, - }, - { - Name: suite.ManagementServer.Name, - Target: cliapi.TargetK8s, - }, - }, - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetTMC: suite.GlobalServer.Name, - cliapi.TargetK8s: suite.ManagementServer.Name, - }, - } -} - -func (suite *ClientTestSuite) TestGetCurrentServer() { - server, err := suite.ClientConfig.GetCurrentServer() - suite.Nil(err) - suite.Equal(server.Name, "GlobalServer") -} - -func (suite *ClientTestSuite) TestGetCurrentServer_NotFound() { - suite.ClientConfig.CurrentServer = "InvalidServer" - _, err := suite.ClientConfig.GetCurrentServer() - suite.Error(err) - suite.Contains(err.Error(), "not found") -} - -func (suite *ClientTestSuite) TestHasServer_GlobalServer() { - ok := suite.ClientConfig.HasServer("GlobalServer") - suite.True(ok) -} - -func (suite *ClientTestSuite) TestHasServer_ManagementServer() { - ok := suite.ClientConfig.HasServer("ManagementServer") - suite.True(ok) -} - -func (suite *ClientTestSuite) TestHasServer_NotFound() { - ok := suite.ClientConfig.HasServer("TestServer") - suite.False(ok) -} - -func (suite *ClientTestSuite) TestGetContext_TMC() { - c, err := suite.ClientConfig.GetContext(suite.GlobalServer.Name) - suite.Nil(err) - suite.Equal(c.Name, suite.GlobalServer.Name) -} - -func (suite *ClientTestSuite) TestGetContext_K8s() { - c, err := suite.ClientConfig.GetContext(suite.ManagementServer.Name) - suite.Nil(err) - suite.Equal(c.Name, suite.ManagementServer.Name) -} - -func (suite *ClientTestSuite) TestGetContext_NotFound() { - _, err := suite.ClientConfig.GetContext("TestServer") - suite.Error(err) - suite.Contains(err.Error(), "could not find context") -} - -func (suite *ClientTestSuite) TestHasContext_GlobalServer() { - ok := suite.ClientConfig.HasContext("GlobalServer") - suite.True(ok) -} - -func (suite *ClientTestSuite) TestHasContext_ManagementServer() { - ok := suite.ClientConfig.HasContext("ManagementServer") - suite.True(ok) -} - -func (suite *ClientTestSuite) TestHasContext_NotFound() { - ok := suite.ClientConfig.HasContext("TestServer") - suite.False(ok) -} - -func (suite *ClientTestSuite) TestGetCurrentContext_TMC() { - c, err := suite.ClientConfig.GetCurrentContext(cliapi.TargetTMC) - suite.Nil(err) - suite.Equal(c.Name, suite.GlobalServer.Name) -} - -func (suite *ClientTestSuite) TestGetCurrentContext_K8s() { - c, err := suite.ClientConfig.GetCurrentContext(cliapi.TargetK8s) - suite.Nil(err) - suite.Equal(c.Name, suite.ManagementServer.Name) -} - -func (suite *ClientTestSuite) TestGetCurrentContext_NotFound() { - _, err := suite.ClientConfig.GetCurrentContext("test") - suite.Error(err) - suite.EqualError(err, "no current context set for target \"test\"") -} - -func (suite *ClientTestSuite) TestSetCurrentContext_TMC() { - delete(suite.ClientConfig.CurrentContext, cliapi.TargetTMC) - err := suite.ClientConfig.SetCurrentContext(cliapi.TargetTMC, suite.GlobalServer.Name) - suite.NoError(err) - suite.Equal(suite.GlobalServer.Name, suite.ClientConfig.CurrentContext[cliapi.TargetTMC]) -} - -func (suite *ClientTestSuite) TestSetCurrentContext_K8s() { - delete(suite.ClientConfig.CurrentContext, cliapi.TargetK8s) - err := suite.ClientConfig.SetCurrentContext(cliapi.TargetK8s, suite.ManagementServer.Name) - suite.NoError(err) - suite.Equal(suite.ManagementServer.Name, suite.ClientConfig.CurrentContext[cliapi.TargetK8s]) -} - -func (suite *ClientTestSuite) TestIsGlobal_True() { - suite.True(suite.GlobalServer.IsGlobal()) -} - -func (suite *ClientTestSuite) TestIsGlobal_False() { - suite.False(suite.ManagementServer.IsGlobal()) -} - -func (suite *ClientTestSuite) TestIsManagementCluster_True() { - suite.True(suite.ManagementServer.IsManagementCluster()) -} - -func (suite *ClientTestSuite) TestIsManagementCluster_False() { - suite.False(suite.GlobalServer.IsManagementCluster()) -} - -func TestConfig(t *testing.T) { - suite.Run(t, new(ClientTestSuite)) -} diff --git a/cli/runtime/apis/config/v1alpha1/clientconfig_types.go b/cli/runtime/apis/config/v1alpha1/clientconfig_types.go deleted file mode 100644 index 168b5a0604..0000000000 --- a/cli/runtime/apis/config/v1alpha1/clientconfig_types.go +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" -) - -// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! -// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. - -// ServerType is the type of server. -// Deprecation targeted for a future version. Superseded by cliapi.Target. -type ServerType string - -const ( - // ManagementClusterServerType is a management cluster server. - // Deprecation targeted for a future version. Superseded by cliapi.TargetK8s. - ManagementClusterServerType ServerType = "managementcluster" - - // GlobalServerType is a global control plane server. - // Deprecation targeted for a future version. Superseded by cliapi.TargetTMC. - GlobalServerType ServerType = "global" -) - -// Server connection. -// Deprecation targeted for a future version. Superseded by Context. -type Server struct { - // Name of the server. - Name string `json:"name,omitempty" yaml:"name,omitempty"` - - // Type of the endpoint. - Type ServerType `json:"type,omitempty" yaml:"type,omitempty"` - - // GlobalOpts if the server is global. - GlobalOpts *GlobalServer `json:"globalOpts,omitempty" yaml:"globalOpts,omitempty"` - - // ManagementClusterOpts if the server is a management cluster. - ManagementClusterOpts *ManagementClusterServer `json:"managementClusterOpts,omitempty" yaml:"managementClusterOpts,omitempty"` - - // DiscoverySources determines from where to discover plugins - // associated with this server - DiscoverySources []PluginDiscovery `json:"discoverySources,omitempty" yaml:"discoverySources,omitempty"` -} - -// Context configuration for a control plane. This can one of the following, -// 1. Kubernetes Cluster -// 2. Tanzu Mission Control endpoint -type Context struct { - // Name of the context. - Name string `json:"name,omitempty" yaml:"name,omitempty"` - - // Target of the context. - Target cliapi.Target `json:"target,omitempty" yaml:"target,omitempty"` - - // GlobalOpts if the context is a global control plane (e.g., TMC). - GlobalOpts *GlobalServer `json:"globalOpts,omitempty" yaml:"globalOpts,omitempty"` - - // ClusterOpts if the context is a kubernetes cluster. - ClusterOpts *ClusterServer `json:"clusterOpts,omitempty" yaml:"clusterOpts,omitempty"` - - // DiscoverySources determines from where to discover plugins - // associated with this context. - DiscoverySources []PluginDiscovery `json:"discoverySources,omitempty" yaml:"discoverySources,omitempty"` -} - -// ManagementClusterServer is the configuration for a management cluster kubeconfig. -// Deprecation targeted for a a future version. Superseded by ClusterServer. -type ManagementClusterServer struct { - // Endpoint for the login. - Endpoint string `json:"endpoint,omitempty" yaml:"endpoint,omitempty"` - - // Path to the kubeconfig. - Path string `json:"path,omitempty" yaml:"path,omitempty"` - - // The context to use (if required), defaults to current. - Context string `json:"context,omitempty" yaml:"context,omitempty"` -} - -// ClusterServer contains the configuration for a kubernetes cluster (kubeconfig). -type ClusterServer struct { - // Endpoint for the login. - Endpoint string `json:"endpoint,omitempty" yaml:"endpoint,omitempty"` - - // Path to the kubeconfig. - Path string `json:"path,omitempty" yaml:"path,omitempty"` - - // The kubernetes context to use (if required), defaults to current. - Context string `json:"context,omitempty" yaml:"context,omitempty"` - - // Denotes whether this server is a management cluster or not (workload cluster). - IsManagementCluster bool `json:"isManagementCluster,omitempty" yaml:"isManagementCluster,omitempty"` -} - -// GlobalServer is the configuration for a global server. -type GlobalServer struct { - // Endpoint for the server. - Endpoint string `json:"endpoint,omitempty" yaml:"endpoint,omitempty"` - - // Auth for the global server. - Auth GlobalServerAuth `json:"auth,omitempty" yaml:"auth,omitempty"` -} - -// GlobalServerAuth is authentication for a global server. -type GlobalServerAuth struct { - // Issuer url for IDP, compliant with OIDC Metadata Discovery. - Issuer string `json:"issuer,omitempty" yaml:"issuer,omitempty"` - - // UserName is the authorized user the token is assigned to. - UserName string `json:"userName,omitempty" yaml:"userName,omitempty"` - - // Permissions are roles assigned to the user. - Permissions []string `json:"permissions,omitempty" yaml:"permissions,omitempty"` - - // AccessToken is the current access token based on the context. - AccessToken string `json:"accessToken,omitempty" yaml:"accessToken,omitempty"` - - // IDToken is the current id token based on the context scoped to the CLI. - IDToken string `json:"IDToken,omitempty" yaml:"IDToken,omitempty"` - - // RefreshToken will be stored only in case of api-token login flow. - RefreshToken string `json:"refresh_token,omitempty" yaml:"refresh_token,omitempty"` - - // Expiration times of the token. - Expiration metav1.Time `json:"expiration,omitempty" yaml:"expiration,omitempty"` - - // Type of the token (user or client). - Type string `json:"type" yaml:"type,omitempty"` -} - -// ClientOptions are the client specific options. -type ClientOptions struct { - // CLI options specific to the CLI. - CLI *CLIOptions `json:"cli,omitempty" yaml:"cli,omitempty"` - Features map[string]FeatureMap `json:"features,omitempty" yaml:"features,omitempty"` - Env map[string]string `json:"env,omitempty" yaml:"env,omitempty"` -} - -// FeatureMap is simply a hash table, but needs an explicit type to be an object in another hash map (cf ClientOptions.Features) -type FeatureMap map[string]string - -// EnvMap is simply a hash table, but needs an explicit type to be an object in another hash map (cf ClientOptions.Env) -type EnvMap map[string]string - -// CLIOptions are options for the CLI. -type CLIOptions struct { - // Repositories are the plugin repositories. - Repositories []PluginRepository `json:"repositories,omitempty" yaml:"repositories,omitempty"` - // DiscoverySources determines from where to discover stand-alone plugins - DiscoverySources []PluginDiscovery `json:"discoverySources,omitempty" yaml:"discoverySources,omitempty"` - // UnstableVersionSelector determined which version tags are allowed - UnstableVersionSelector VersionSelectorLevel `json:"unstableVersionSelector,omitempty" yaml:"unstableVersionSelector,omitempty"` - // Deprecated: Edition has been deprecated and will be removed from future version - // Edition - Edition EditionSelector `json:"edition,omitempty" yaml:"edition,omitempty"` - // Deprecated: BOMRepo has been deprecated and will be removed from future version - // BOMRepo is the root repository URL used to resolve the compatibiilty file - // and bill of materials. An example URL is projects.registry.vmware.com/tkg. - BOMRepo string `json:"bomRepo,omitempty" yaml:"bomRepo,omitempty"` - // Deprecated: CompatibilityFilePath has been deprecated and will be removed from future version - // CompatibilityFilePath is the path, from the BOM repo, to download and access the compatibility file. - // the compatibility file is used for resolving the bill of materials for creating clusters. - CompatibilityFilePath string `json:"compatibilityFilePath,omitempty" yaml:"compatibilityFilePath,omitempty"` -} - -// PluginDiscovery contains a specific distribution mechanism. Only one of the -// configs must be set. -type PluginDiscovery struct { - // GCPStorage is set if the plugins are to be discovered via Google Cloud Storage. - GCP *GCPDiscovery `json:"gcp,omitempty" yaml:"gcp,omitempty"` - // OCIDiscovery is set if the plugins are to be discovered via an OCI Image Registry. - OCI *OCIDiscovery `json:"oci,omitempty" yaml:"oci,omitempty"` - // GenericRESTDiscovery is set if the plugins are to be discovered via a REST API endpoint. - REST *GenericRESTDiscovery `json:"rest,omitempty" yaml:"rest,omitempty"` - // KubernetesDiscovery is set if the plugins are to be discovered via the Kubernetes API server. - Kubernetes *KubernetesDiscovery `json:"k8s,omitempty" yaml:"k8s,omitempty"` - // LocalDiscovery is set if the plugins are to be discovered via Local Manifest fast. - Local *LocalDiscovery `json:"local,omitempty" yaml:"local,omitempty"` -} - -// GCPDiscovery provides a plugin discovery mechanism via a Google Cloud Storage -// bucket with a manifest.yaml file. -type GCPDiscovery struct { - // Name is a name of the discovery - Name string `json:"name,omitempty" yaml:"name,omitempty"` - // Bucket is a Google Cloud Storage bucket. - // E.g., tanzu-cli - Bucket string `json:"bucket,omitempty" yaml:"bucket,omitempty"` - // BasePath is a URI path that is prefixed to the object name/path. - // E.g., plugins/cluster - ManifestPath string `json:"manifestPath,omitempty" yaml:"manifestPath,omitempty"` -} - -// OCIDiscovery provides a plugin discovery mechanism via a OCI Image Registry -type OCIDiscovery struct { - // Name is a name of the discovery - Name string `json:"name,omitempty" yaml:"name,omitempty"` - // Image is an OCI compliant image. Which include DNS-compatible registry name, - // a valid URI path(MAY contain zero or more ‘/’) and a valid tag. - // E.g., harbor.my-domain.local/tanzu-cli/plugins-manifest:latest - // Contains a directory containing YAML files, each of which contains single - // CLIPlugin API resource. - Image string `json:"image,omitempty" yaml:"image,omitempty"` -} - -// GenericRESTDiscovery provides a plugin discovery mechanism via any REST API -// endpoint. The fully qualified list URL is constructed as -// `https://{Endpoint}/{BasePath}` and the get plugin URL is constructed as . -// `https://{Endpoint}/{BasePath}/{Plugin}`. -type GenericRESTDiscovery struct { - // Name is a name of the discovery - Name string `json:"name,omitempty" yaml:"name,omitempty"` - // Endpoint is the REST API server endpoint. - // E.g., api.my-domain.local - Endpoint string `json:"endpoint,omitempty" yaml:"endpoint,omitempty"` - // BasePath is the base URL path of the plugin discovery API. - // E.g., /v1alpha1/cli/plugins - BasePath string `json:"basePath,omitempty" yaml:"basePath,omitempty"` -} - -// KubernetesDiscovery provides a plugin discovery mechanism via the Kubernetes API server. -type KubernetesDiscovery struct { - // Name is a name of the discovery - Name string `json:"name,omitempty" yaml:"name,omitempty"` - // Path to the kubeconfig. - Path string `json:"path,omitempty" yaml:"path,omitempty"` - // The context to use (if required), defaults to current. - Context string `json:"context,omitempty" yaml:"context,omitempty"` - // Version of the CLIPlugins API to query. - // E.g., v1alpha1 - Version string `json:"version,omitempty" yaml:"version,omitempty"` -} - -// LocalDiscovery is a artifact discovery endpoint utilizing a local host OS. -type LocalDiscovery struct { - // Name is a name of the discovery - Name string `json:"name,omitempty" yaml:"name,omitempty"` - // Path is a local path pointing to directory - // containing YAML files, each of which contains single - // CLIPlugin API resource. - Path string `json:"path,omitempty" yaml:"path,omitempty"` -} - -// PluginRepository is a CLI plugin repository -type PluginRepository struct { - // GCPPluginRepository is a plugin repository that utilizes GCP cloud storage. - GCPPluginRepository *GCPPluginRepository `json:"gcpPluginRepository,omitempty" yaml:"gcpPluginRepository,omitempty"` -} - -// GCPPluginRepository is a plugin repository that utilizes GCP cloud storage. -type GCPPluginRepository struct { - // Name of the repository. - Name string `json:"name,omitempty" yaml:"name,omitempty"` - - // BucketName is the name of the bucket. - BucketName string `json:"bucketName,omitempty" yaml:"bucketName,omitempty"` - - // RootPath within the bucket. - RootPath string `json:"rootPath,omitempty" yaml:"rootPath,omitempty"` -} - -// +kubebuilder:object:root=true - -// ClientConfig is the Schema for the configs API -type ClientConfig struct { - metav1.TypeMeta `json:",omitempty" yaml:",omitempty"` - metav1.ObjectMeta `json:",omitempty" yaml:",omitempty"` - // KnownServers available. - // Deprecation targeted for a future version. Superseded by KnownContexts. - KnownServers []*Server `json:"servers,omitempty" yaml:"servers,omitempty"` - - // CurrentServer in use. - // Deprecation targeted for a future version. Superseded by CurrentContext. - CurrentServer string `json:"current,omitempty" yaml:"current,omitempty"` - - // KnownContexts available. - KnownContexts []*Context `json:"contexts,omitempty" yaml:"contexts,omitempty"` - - // CurrentContext for every type. - CurrentContext map[cliapi.Target]string `json:"currentContext,omitempty" yaml:"currentContext,omitempty"` - - // ClientOptions are client specific options like feature flags, environment variables, repositories, discoverySources, etc. - ClientOptions *ClientOptions `json:"clientOptions,omitempty" yaml:"clientOptions,omitempty"` -} - -// +kubebuilder:object:root=true - -// ClientConfigList contains a list of ClientConfig -type ClientConfigList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []ClientConfig `json:"items"` -} - -func init() { - SchemeBuilder.Register(&ClientConfig{}, &ClientConfigList{}) -} diff --git a/cli/runtime/apis/config/v1alpha1/groupversion_info.go b/cli/runtime/apis/config/v1alpha1/groupversion_info.go deleted file mode 100644 index 2454811354..0000000000 --- a/cli/runtime/apis/config/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 contains API Schema definitions for the client v1alpha1 API group -// +kubebuilder:object:generate=true -// +groupName=config.tanzu.vmware.com -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "config.tanzu.vmware.com", Version: "v1alpha1"} - - // GroupVersionKind has information about group, version and kind of this object. - GroupVersionKind = GroupVersion.WithKind("ClientConfig") - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/cli/runtime/apis/config/v1alpha1/metadata_clientconfig_types.go b/cli/runtime/apis/config/v1alpha1/metadata_clientconfig_types.go deleted file mode 100644 index 31b5c903bd..0000000000 --- a/cli/runtime/apis/config/v1alpha1/metadata_clientconfig_types.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -// Metadata struct type to store config related metadata -type Metadata struct { - // ConfigMetadata to store any config related metadata or settings - ConfigMetadata *ConfigMetadata `json:"configMetadata,omitempty" yaml:"configMetadata,omitempty" mapstructure:"configMetadata,omitempty"` -} - -// ConfigMetadata to store any config related metadata or settings -type ConfigMetadata struct { - // PatchStrategy patch strategy to determine merge of nodes in config file. Two ways of patch strategies are merge and replace - PatchStrategy map[string]string `json:"patchStrategy,omitempty" yaml:"patchStrategy,omitempty" mapstructure:"patchStrategy,omitempty"` - // Settings related to config - Settings map[string]string `json:"settings,omitempty" yaml:"settings,omitempty" mapstructure:"settings,omitempty"` -} diff --git a/cli/runtime/apis/config/v1alpha1/zz_generated.deepcopy.go b/cli/runtime/apis/config/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 8b64424595..0000000000 --- a/cli/runtime/apis/config/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,551 +0,0 @@ -//go:build !ignore_autogenerated -// +build !ignore_autogenerated - -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CLIOptions) DeepCopyInto(out *CLIOptions) { - *out = *in - if in.Repositories != nil { - in, out := &in.Repositories, &out.Repositories - *out = make([]PluginRepository, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.DiscoverySources != nil { - in, out := &in.DiscoverySources, &out.DiscoverySources - *out = make([]PluginDiscovery, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CLIOptions. -func (in *CLIOptions) DeepCopy() *CLIOptions { - if in == nil { - return nil - } - out := new(CLIOptions) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClientConfig) DeepCopyInto(out *ClientConfig) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.KnownServers != nil { - in, out := &in.KnownServers, &out.KnownServers - *out = make([]*Server, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(Server) - (*in).DeepCopyInto(*out) - } - } - } - if in.KnownContexts != nil { - in, out := &in.KnownContexts, &out.KnownContexts - *out = make([]*Context, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(Context) - (*in).DeepCopyInto(*out) - } - } - } - if in.CurrentContext != nil { - in, out := &in.CurrentContext, &out.CurrentContext - *out = make(map[cliv1alpha1.Target]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.ClientOptions != nil { - in, out := &in.ClientOptions, &out.ClientOptions - *out = new(ClientOptions) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClientConfig. -func (in *ClientConfig) DeepCopy() *ClientConfig { - if in == nil { - return nil - } - out := new(ClientConfig) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClientConfig) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClientConfigList) DeepCopyInto(out *ClientConfigList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]ClientConfig, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClientConfigList. -func (in *ClientConfigList) DeepCopy() *ClientConfigList { - if in == nil { - return nil - } - out := new(ClientConfigList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ClientConfigList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClientOptions) DeepCopyInto(out *ClientOptions) { - *out = *in - if in.CLI != nil { - in, out := &in.CLI, &out.CLI - *out = new(CLIOptions) - (*in).DeepCopyInto(*out) - } - if in.Features != nil { - in, out := &in.Features, &out.Features - *out = make(map[string]FeatureMap, len(*in)) - for key, val := range *in { - var outVal map[string]string - if val == nil { - (*out)[key] = nil - } else { - in, out := &val, &outVal - *out = make(FeatureMap, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - (*out)[key] = outVal - } - } - if in.Env != nil { - in, out := &in.Env, &out.Env - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClientOptions. -func (in *ClientOptions) DeepCopy() *ClientOptions { - if in == nil { - return nil - } - out := new(ClientOptions) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClusterServer) DeepCopyInto(out *ClusterServer) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterServer. -func (in *ClusterServer) DeepCopy() *ClusterServer { - if in == nil { - return nil - } - out := new(ClusterServer) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ConfigMetadata) DeepCopyInto(out *ConfigMetadata) { - *out = *in - if in.PatchStrategy != nil { - in, out := &in.PatchStrategy, &out.PatchStrategy - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.Settings != nil { - in, out := &in.Settings, &out.Settings - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMetadata. -func (in *ConfigMetadata) DeepCopy() *ConfigMetadata { - if in == nil { - return nil - } - out := new(ConfigMetadata) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Context) DeepCopyInto(out *Context) { - *out = *in - if in.GlobalOpts != nil { - in, out := &in.GlobalOpts, &out.GlobalOpts - *out = new(GlobalServer) - (*in).DeepCopyInto(*out) - } - if in.ClusterOpts != nil { - in, out := &in.ClusterOpts, &out.ClusterOpts - *out = new(ClusterServer) - **out = **in - } - if in.DiscoverySources != nil { - in, out := &in.DiscoverySources, &out.DiscoverySources - *out = make([]PluginDiscovery, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Context. -func (in *Context) DeepCopy() *Context { - if in == nil { - return nil - } - out := new(Context) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in EnvMap) DeepCopyInto(out *EnvMap) { - { - in := &in - *out = make(EnvMap, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvMap. -func (in EnvMap) DeepCopy() EnvMap { - if in == nil { - return nil - } - out := new(EnvMap) - in.DeepCopyInto(out) - return *out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in FeatureMap) DeepCopyInto(out *FeatureMap) { - { - in := &in - *out = make(FeatureMap, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureMap. -func (in FeatureMap) DeepCopy() FeatureMap { - if in == nil { - return nil - } - out := new(FeatureMap) - in.DeepCopyInto(out) - return *out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GCPDiscovery) DeepCopyInto(out *GCPDiscovery) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPDiscovery. -func (in *GCPDiscovery) DeepCopy() *GCPDiscovery { - if in == nil { - return nil - } - out := new(GCPDiscovery) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GCPPluginRepository) DeepCopyInto(out *GCPPluginRepository) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GCPPluginRepository. -func (in *GCPPluginRepository) DeepCopy() *GCPPluginRepository { - if in == nil { - return nil - } - out := new(GCPPluginRepository) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GenericRESTDiscovery) DeepCopyInto(out *GenericRESTDiscovery) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GenericRESTDiscovery. -func (in *GenericRESTDiscovery) DeepCopy() *GenericRESTDiscovery { - if in == nil { - return nil - } - out := new(GenericRESTDiscovery) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GlobalServer) DeepCopyInto(out *GlobalServer) { - *out = *in - in.Auth.DeepCopyInto(&out.Auth) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GlobalServer. -func (in *GlobalServer) DeepCopy() *GlobalServer { - if in == nil { - return nil - } - out := new(GlobalServer) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GlobalServerAuth) DeepCopyInto(out *GlobalServerAuth) { - *out = *in - if in.Permissions != nil { - in, out := &in.Permissions, &out.Permissions - *out = make([]string, len(*in)) - copy(*out, *in) - } - in.Expiration.DeepCopyInto(&out.Expiration) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GlobalServerAuth. -func (in *GlobalServerAuth) DeepCopy() *GlobalServerAuth { - if in == nil { - return nil - } - out := new(GlobalServerAuth) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubernetesDiscovery) DeepCopyInto(out *KubernetesDiscovery) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubernetesDiscovery. -func (in *KubernetesDiscovery) DeepCopy() *KubernetesDiscovery { - if in == nil { - return nil - } - out := new(KubernetesDiscovery) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *LocalDiscovery) DeepCopyInto(out *LocalDiscovery) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LocalDiscovery. -func (in *LocalDiscovery) DeepCopy() *LocalDiscovery { - if in == nil { - return nil - } - out := new(LocalDiscovery) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ManagementClusterServer) DeepCopyInto(out *ManagementClusterServer) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ManagementClusterServer. -func (in *ManagementClusterServer) DeepCopy() *ManagementClusterServer { - if in == nil { - return nil - } - out := new(ManagementClusterServer) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Metadata) DeepCopyInto(out *Metadata) { - *out = *in - if in.ConfigMetadata != nil { - in, out := &in.ConfigMetadata, &out.ConfigMetadata - *out = new(ConfigMetadata) - (*in).DeepCopyInto(*out) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata. -func (in *Metadata) DeepCopy() *Metadata { - if in == nil { - return nil - } - out := new(Metadata) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *OCIDiscovery) DeepCopyInto(out *OCIDiscovery) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OCIDiscovery. -func (in *OCIDiscovery) DeepCopy() *OCIDiscovery { - if in == nil { - return nil - } - out := new(OCIDiscovery) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PluginDiscovery) DeepCopyInto(out *PluginDiscovery) { - *out = *in - if in.GCP != nil { - in, out := &in.GCP, &out.GCP - *out = new(GCPDiscovery) - **out = **in - } - if in.OCI != nil { - in, out := &in.OCI, &out.OCI - *out = new(OCIDiscovery) - **out = **in - } - if in.REST != nil { - in, out := &in.REST, &out.REST - *out = new(GenericRESTDiscovery) - **out = **in - } - if in.Kubernetes != nil { - in, out := &in.Kubernetes, &out.Kubernetes - *out = new(KubernetesDiscovery) - **out = **in - } - if in.Local != nil { - in, out := &in.Local, &out.Local - *out = new(LocalDiscovery) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PluginDiscovery. -func (in *PluginDiscovery) DeepCopy() *PluginDiscovery { - if in == nil { - return nil - } - out := new(PluginDiscovery) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PluginRepository) DeepCopyInto(out *PluginRepository) { - *out = *in - if in.GCPPluginRepository != nil { - in, out := &in.GCPPluginRepository, &out.GCPPluginRepository - *out = new(GCPPluginRepository) - **out = **in - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PluginRepository. -func (in *PluginRepository) DeepCopy() *PluginRepository { - if in == nil { - return nil - } - out := new(PluginRepository) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Server) DeepCopyInto(out *Server) { - *out = *in - if in.GlobalOpts != nil { - in, out := &in.GlobalOpts, &out.GlobalOpts - *out = new(GlobalServer) - (*in).DeepCopyInto(*out) - } - if in.ManagementClusterOpts != nil { - in, out := &in.ManagementClusterOpts, &out.ManagementClusterOpts - *out = new(ManagementClusterServer) - **out = **in - } - if in.DiscoverySources != nil { - in, out := &in.DiscoverySources, &out.DiscoverySources - *out = make([]PluginDiscovery, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Server. -func (in *Server) DeepCopy() *Server { - if in == nil { - return nil - } - out := new(Server) - in.DeepCopyInto(out) - return out -} diff --git a/cli/runtime/buildinfo/buildinfo.go b/cli/runtime/buildinfo/buildinfo.go deleted file mode 100644 index ddd4a215cb..0000000000 --- a/cli/runtime/buildinfo/buildinfo.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package buildinfo holds global variables set at build time to provide information about the plugin build. -package buildinfo - -var ( - // Date is the date the plugin binary was built. - // It should be set using: - // go build --ldflags "-X 'github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo.Date=...'" - Date string - - // SHA is the git commit SHA the plugin binary was built with. - // Is should be set using: - // go build --ldflags "-X 'github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo.SHA=...'" - SHA string - - // Version is the version of the plugin built. - // It should be set using: - // go build --ldflags "-X 'github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo.Version=...'" - Version string -) diff --git a/cli/runtime/command/deprecate_test.go b/cli/runtime/command/deprecate_test.go deleted file mode 100644 index 489d8a3777..0000000000 --- a/cli/runtime/command/deprecate_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "fmt" - "testing" - - "github.com/spf13/cobra" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestCommand(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Command Suite") -} - -var _ = Describe("Test suite for the deprecation module", func() { - var testCmd = &cobra.Command{ - Use: "test", - Short: "test", - SilenceUsage: true, - } - - flag := "foo" - removalVersion := "2.0.0" - alternative := "bar" - - var cmdVariable string - testCmd.Flags().StringVarP(&cmdVariable, flag, "", "", "") - - Context("Test flag deprecation", func() { - It("test flag deprecation without alternative", func() { - DeprecateFlag(testCmd, flag, removalVersion) - Expect(testCmd.Flag(flag).Deprecated).To(Equal(fmt.Sprintf("will be removed in version %q.", removalVersion))) - Expect(testCmd.Flag(flag).Hidden).To(BeTrue()) - }) - - It("test flag deprecation with alternative", func() { - DeprecateFlagWithAlternative(testCmd, flag, removalVersion, alternative) - Expect(testCmd.Flag(flag).Deprecated).To(Equal(fmt.Sprintf("will be removed in version %q. Use %q instead.", removalVersion, alternative))) - Expect(testCmd.Flag(flag).Hidden).To(BeTrue()) - }) - }) - - Context("Test command deprecation", func() { - It("Test command deprecation without alternative", func() { - DeprecateCommand(testCmd, removalVersion) - Expect(testCmd.Deprecated).To(Equal(fmt.Sprintf("will be removed in version %q.", removalVersion))) - }) - - It("Test command deprecation with alternative", func() { - DeprecateCommandWithAlternative(testCmd, removalVersion, alternative) - Expect(testCmd.Deprecated).To(Equal(fmt.Sprintf("will be removed in version %q. Use %q instead.", removalVersion, alternative))) - }) - }) -}) diff --git a/cli/runtime/command/deprecation.go b/cli/runtime/command/deprecation.go deleted file mode 100644 index 7f73d6b5db..0000000000 --- a/cli/runtime/command/deprecation.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package command provides functions to manipulate tanzu cli commands -package command - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -// DeprecateCommand marks the command as deprecated and adds deprecation message. -func DeprecateCommand(cmd *cobra.Command, removalVersion string) { - msg := fmt.Sprintf("will be removed in version %q.", removalVersion) - cmd.Deprecated = msg -} - -// DeprecateCommandWithAlternative marks the commands as deprecated and adds deprecation message with an alternative. -func DeprecateCommandWithAlternative(cmd *cobra.Command, removalVersion, alternative string) { - msg := fmt.Sprintf("will be removed in version %q. Use %q instead.", removalVersion, alternative) - cmd.Deprecated = msg -} - -// DeprecateFlag marks the flag as deprecated and hidden with a deprecation message. -func DeprecateFlag(cmd *cobra.Command, flag, removalVersion string) { - f := cmd.Flags().Lookup(flag) - if f != nil { - msg := fmt.Sprintf("will be removed in version %q.", removalVersion) - f.Deprecated = msg - f.Hidden = true - } -} - -// DeprecateFlagWithAlternative marks the flag as deprecated and hidden with deprecation message recommending an -// alternative flag to use. -func DeprecateFlagWithAlternative(cmd *cobra.Command, flag, removalVersion, alternative string) { - f := cmd.Flags().Lookup(flag) - if f != nil { - msg := fmt.Sprintf("will be removed in version %q. Use %q instead.", removalVersion, alternative) - f.Deprecated = msg - f.Hidden = true - } -} diff --git a/cli/runtime/component/ask_for_confirmation.go b/cli/runtime/component/ask_for_confirmation.go deleted file mode 100644 index 0c0236c4ad..0000000000 --- a/cli/runtime/component/ask_for_confirmation.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "fmt" - - "github.com/pkg/errors" -) - -var ( - okResponsesMap = map[string]struct{}{ - "y": {}, - "Y": {}, - } -) - -// AskForConfirmation is used to prompt the user to confirm or deny a choice -func AskForConfirmation(message string) error { - var response string - msg := message + " [y/N]: " - fmt.Print(msg) - _, err := fmt.Scanln(&response) - if err != nil { - return errors.New("aborted") - } - if _, exit := okResponsesMap[response]; !exit { - return errors.New("aborted") - } - return nil -} diff --git a/cli/runtime/component/colorable-tty.go b/cli/runtime/component/colorable-tty.go deleted file mode 100644 index a7700a7cbf..0000000000 --- a/cli/runtime/component/colorable-tty.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "fmt" - "os" - "strings" - "unicode" - - auroraPackage "github.com/logrusorgru/aurora" - "github.com/mattn/go-isatty" -) - -var aurora auroraPackage.Aurora - -func init() { - NewAurora() -} - -func NewAurora() auroraPackage.Aurora { - if aurora == nil { - aurora = auroraPackage.NewAurora(IsTTYEnabled()) - } - return aurora -} - -func IsTTYEnabled() bool { - ttyEnabled := true - if os.Getenv("TANZU_CLI_NO_COLOR") != "" || os.Getenv("NO_COLOR") != "" || strings.EqualFold(os.Getenv("TERM"), "DUMB") || !isatty.IsTerminal(os.Stdout.Fd()) { - ttyEnabled = false - } - return ttyEnabled -} - -// Rpad adds padding to the right of a string. -// from https://github.com/spf13/cobra/blob/993cc5372a05240dfd59e3ba952748b36b2cd117/cobra.go#L29 -func Rpad(s string, padding int) string { - tmpl := fmt.Sprintf("%%-%ds", padding) - return fmt.Sprintf(tmpl, s) -} - -func Underline(s string) string { - return aurora.Underline(s).String() -} - -func Bold(s string) string { - return aurora.Bold(s).String() -} - -func TrimRightSpace(s string) string { - return strings.TrimRightFunc(s, unicode.IsSpace) -} - -func BeginsWith(s, prefix string) bool { - return strings.HasPrefix(s, prefix) -} diff --git a/cli/runtime/component/colorable-tty_test.go b/cli/runtime/component/colorable-tty_test.go deleted file mode 100644 index 6bc9bde54b..0000000000 --- a/cli/runtime/component/colorable-tty_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "fmt" - "os" - "testing" -) - -func TestIsTTYEnabled(t *testing.T) { - envTests := []struct { - key, val string - want bool - }{ - {"TANZU_CLI_NO_COLOR", "1", false}, - {"NO_COLOR", "1", false}, - {"TERM", "dumb", false}, - {"TERM", "duMb", false}, - } - - for _, tt := range envTests { - testName := fmt.Sprintf("(%v,%v):%v", tt.key, tt.val, tt.want) - t.Run(testName, func(t *testing.T) { - err := os.Setenv(tt.key, tt.val) - if err != nil { - return - } - ans := IsTTYEnabled() - if ans != tt.want { - t.Errorf("got %v : want %v", ans, tt.want) - } - }) - } -} diff --git a/cli/runtime/component/doc.go b/cli/runtime/component/doc.go deleted file mode 100644 index 44ac36eb2b..0000000000 --- a/cli/runtime/component/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package component defines components that can be made use of in plugins. -package component diff --git a/cli/runtime/component/output.go b/cli/runtime/component/output.go deleted file mode 100644 index 955ff44b92..0000000000 --- a/cli/runtime/component/output.go +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "encoding/json" - "fmt" - "io" - "strconv" - "strings" - - "github.com/olekukonko/tablewriter" - "gopkg.in/yaml.v2" -) - -const ( - colWidth = 80 - indentation = ` ` -) - -// OutputWriter is an interface for something that can write output. -type OutputWriter interface { - SetKeys(headerKeys ...string) - AddRow(items ...interface{}) - Render() -} - -// OutputType defines the format of the output desired. -type OutputType string - -const ( - // TableOutputType specifies output should be in table format. - TableOutputType OutputType = "table" - // YAMLOutputType specifies output should be in yaml format. - YAMLOutputType OutputType = "yaml" - // JSONOutputType specifies output should be in json format. - JSONOutputType OutputType = "json" - // ListTableOutputType specified output should be in a list table format. - ListTableOutputType OutputType = "listtable" -) - -// outputwriter is our internal implementation. -type outputwriter struct { - out io.Writer - keys []string - values [][]string - outputFormat OutputType -} - -// NewOutputWriter gets a new instance of our output writer. -func NewOutputWriter(output io.Writer, outputFormat string, headers ...string) OutputWriter { - // Initialize the output writer that we use under the covers - ow := &outputwriter{} - ow.out = output - ow.outputFormat = OutputType(outputFormat) - ow.keys = headers - - return ow -} - -// SetKeys sets the values to use as the keys for the output values. -func (ow *outputwriter) SetKeys(headerKeys ...string) { - // Overwrite whatever was used in initialization - ow.keys = headerKeys -} - -// AddRow appends a new row to our table. -func (ow *outputwriter) AddRow(items ...interface{}) { - row := []string{} - - // Make sure all values are ultimately strings - for _, item := range items { - row = append(row, fmt.Sprintf("%v", item)) - } - ow.values = append(ow.values, row) -} - -// Render emits the generated table to the output once ready -func (ow *outputwriter) Render() { - switch ow.outputFormat { - case JSONOutputType: - renderJSON(ow.out, ow.dataStruct()) - case YAMLOutputType: - renderYAML(ow.out, ow.dataStruct()) - case ListTableOutputType: - renderListTable(ow) - default: - renderTable(ow) - } -} - -func (ow *outputwriter) dataStruct() []map[string]string { - data := []map[string]string{} - keys := ow.keys - for i, k := range keys { - keys[i] = strings.ToLower(strings.ReplaceAll(k, " ", "_")) - } - - for _, itemValues := range ow.values { - item := map[string]string{} - for i, value := range itemValues { - if i == len(keys) { - continue - } - item[keys[i]] = value - } - data = append(data, item) - } - - return data -} - -// objectwriter is our internal implementation. -type objectwriter struct { - out io.Writer - data interface{} - outputFormat OutputType -} - -// NewObjectWriter gets a new instance of our output writer. -func NewObjectWriter(output io.Writer, outputFormat string, data interface{}) OutputWriter { - // Initialize the output writer that we use under the covers - obw := &objectwriter{} - obw.out = output - obw.data = data - obw.outputFormat = OutputType(outputFormat) - - return obw -} - -// SetKeys sets the values to use as the keys for the output values. -func (obw *objectwriter) SetKeys(headerKeys ...string) { - // Object writer does not have the concept of keys - fmt.Fprintln(obw.out, "Programming error, attempt to add headers to object output") -} - -// AddRow appends a new row to our table. -func (obw *objectwriter) AddRow(items ...interface{}) { - // Object writer does not have the concept of keys - fmt.Fprintln(obw.out, "Programming error, attempt to add rows to object output") -} - -// Render emits the generated table to the output once ready -func (obw *objectwriter) Render() { - switch obw.outputFormat { - case JSONOutputType: - renderJSON(obw.out, obw.data) - case YAMLOutputType: - renderYAML(obw.out, obw.data) - default: - fmt.Fprintf(obw.out, "Invalid output format: %v\n", obw.outputFormat) - } -} - -// renderJSON prints output as json -func renderJSON(out io.Writer, data interface{}) { - bytesJSON, err := json.MarshalIndent(data, "", indentation) - if err != nil { - fmt.Fprint(out, err) - return - } - - fmt.Fprintf(out, "%v", string(bytesJSON)) -} - -// renderYAML prints output as yaml -func renderYAML(out io.Writer, data interface{}) { - yamlInBytes, err := yaml.Marshal(data) - if err != nil { - fmt.Fprint(out, err) - return - } - - fmt.Fprintf(out, "%s", yamlInBytes) -} - -// renderListTable prints output as a list table. -func renderListTable(ow *outputwriter) { - headerLength := 10 - for _, header := range ow.keys { - length := len(header) + 2 - if length > headerLength { - headerLength = length - } - } - - for i, header := range ow.keys { - row := []string{} - for _, data := range ow.values { - if i >= len(data) { - // There are more headers than values, leave it blank - continue - } - row = append(row, data[i]) - } - headerLabel := strings.ToUpper(header) + ":" - values := strings.Join(row, ", ") - fmt.Fprintf(ow.out, "%-"+strconv.Itoa(headerLength)+"s %s\n", headerLabel, values) - } -} - -// renderTable prints output as a table -func renderTable(ow *outputwriter) { - // Drop values if there aren't as many as the headers - headerLength := len(ow.keys) - for i, values := range ow.values { - if len(values) <= headerLength { - continue - } - - ow.values[i] = values[:headerLength] - } - table := tablewriter.NewWriter(ow.out) - table.SetBorder(false) - table.SetCenterSeparator("") - table.SetColumnSeparator("") - table.SetRowSeparator("") - table.SetHeaderAlignment(tablewriter.ALIGN_LEFT) - table.SetAlignment(tablewriter.ALIGN_LEFT) - table.SetHeaderLine(false) - table.SetColWidth(colWidth) - table.SetTablePadding("\t\t") - table.SetHeader(ow.keys) - table.AppendBulk(ow.values) - table.Render() -} diff --git a/cli/runtime/component/output_spinner.go b/cli/runtime/component/output_spinner.go deleted file mode 100644 index 6230939143..0000000000 --- a/cli/runtime/component/output_spinner.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "fmt" - "io" - "os" - "time" - - "github.com/briandowns/spinner" - "github.com/mattn/go-isatty" -) - -// OutputWriterSpinner is OutputWriter augmented with a spinner. -type OutputWriterSpinner interface { - OutputWriter - RenderWithSpinner() - StopSpinner() -} - -// outputwriterspinner is our internal implementation. -type outputwriterspinner struct { - outputwriter - spinnerText string - spinner *spinner.Spinner -} - -// NewOutputWriterWithSpinner returns implementation of OutputWriterSpinner. -func NewOutputWriterWithSpinner(output io.Writer, outputFormat, spinnerText string, startSpinner bool, headers ...string) (OutputWriterSpinner, error) { - ows := &outputwriterspinner{} - ows.out = output - ows.outputFormat = OutputType(outputFormat) - ows.keys = headers - if ows.outputFormat != JSONOutputType && ows.outputFormat != YAMLOutputType { - ows.spinnerText = spinnerText - ows.spinner = spinner.New(spinner.CharSets[9], 100*time.Millisecond) - if err := ows.spinner.Color("bgBlack", "bold", "fgWhite"); err != nil { - return nil, err - } - ows.spinner.Suffix = fmt.Sprintf(" %s", spinnerText) - - // Start the spinner only if attached to terminal - attachedToTerminal := isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) - if startSpinner && attachedToTerminal { - ows.spinner.Start() - } - } - return ows, nil -} - -// RenderWithSpinner will stop spinner and render the output -func (ows *outputwriterspinner) RenderWithSpinner() { - if ows.spinner != nil && ows.spinner.Active() { - ows.spinner.Stop() - fmt.Fprintln(ows.out) - } - ows.Render() -} - -// stop spinner -func (ows *outputwriterspinner) StopSpinner() { - if ows.spinner != nil && ows.spinner.Active() { - ows.spinner.Stop() - fmt.Fprintln(ows.out) - } -} diff --git a/cli/runtime/component/output_test.go b/cli/runtime/component/output_test.go deleted file mode 100644 index 7f0c682087..0000000000 --- a/cli/runtime/component/output_test.go +++ /dev/null @@ -1,319 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "bytes" - "strings" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestNewOutputWriterTable(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(TableOutputType), "a", "b", "c") - require.NotNil(t, tab) - tab.AddRow("1", "2", "3") - tab.Render() - - validateTableOutput(t, b.String()) -} - -func TestNewOutputWriterNewHeaders(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(TableOutputType), "a", "b", "c") - require.NotNil(t, tab) - tab.AddRow("1", "2", "3") - tab.SetKeys("d", "e", "f") - tab.Render() - - output := b.String() - require.NotNil(t, output) - - lines := strings.Split(output, "\n") - // Output should contain header row, data row, and a blank line - require.Equal(t, 3, len(lines), "%v", lines) - require.Contains(t, lines[0], "D") - require.Contains(t, lines[0], "E") - require.Contains(t, lines[0], "F") -} - -func TestNewOutputWriterUnspecified(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, "", "a", "b", "c") - require.NotNil(t, tab) - tab.AddRow("1", "2", "3") - tab.Render() - - validateTableOutput(t, b.String()) -} - -// TestNewOutputWriterInvalid verifies an invalid output type string will fallback -// to rendering in the table format. -func TestNewOutputWriterInvalid(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, "cowsay", "a", "b", "c") - require.NotNil(t, tab) - tab.AddRow("1", "2", "3") - tab.Render() - - validateTableOutput(t, b.String()) -} - -func TestTableTooManyValues(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(TableOutputType), "a", "b") - require.NotNil(t, tab) - tab.AddRow("1", "2", "3") - tab.Render() - - output := b.String() - require.NotNil(t, output) - lines := strings.Split(output, "\n") - - // Output should contain header row, data row, and a blank line - require.Equal(t, 3, len(lines), "%v", lines) - require.Contains(t, lines[0], "A") - require.Contains(t, lines[0], "B") - require.Equal(t, lines[1], " 1 2 ") -} - -func TestTableTooFewValues(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(TableOutputType), "a", "b", "c") - require.NotNil(t, tab) - tab.AddRow("1", "2") - tab.Render() - - output := b.String() - require.NotNil(t, output) - lines := strings.Split(output, "\n") - - // Output should contain header row, data row, and a blank line - require.Equal(t, 3, len(lines), "%v", lines) - require.Contains(t, lines[0], "A") - require.Contains(t, lines[0], "B") - require.Equal(t, lines[1], " 1 2 ") -} - -func validateTableOutput(t *testing.T, output string) { - require.NotNil(t, output) - lines := strings.Split(output, "\n") - - // Output should contain header row, data row, and a blank line - require.Equal(t, 3, len(lines), "%v", lines) - require.Contains(t, lines[0], "A") - require.Contains(t, lines[0], "B") - require.Contains(t, lines[0], "C") - require.Equal(t, lines[1], " 1 2 3 ") -} - -func TestNewOutputWriterListTable(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(ListTableOutputType), "a", "b", "c") - require.NotNil(t, tab) - tab.AddRow("1", "2", "3") - tab.AddRow("4", "5", "6") - tab.Render() - - output := b.String() - require.NotNil(t, output) - lines := strings.Split(output, "\n") - - // Output should contain row per header and a blank line - require.Equal(t, 4, len(lines), "%v", lines) - require.Contains(t, lines[0], "A:") - require.Contains(t, lines[0], "1, 4") - require.Contains(t, lines[1], "B:") - require.Contains(t, lines[1], "2, 5") - require.Contains(t, lines[2], "C:") - require.Contains(t, lines[2], "3, 6") -} - -func TestListTableTooManyValues(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(ListTableOutputType), "a", "b") - require.NotNil(t, tab) - tab.AddRow("1", "2", "3") - tab.Render() - - output := b.String() - require.NotNil(t, output) - lines := strings.Split(output, "\n") - - // Output should contain header row, data row, and a blank line - require.Equal(t, 3, len(lines), "%v", lines) - require.Contains(t, lines[0], "A:") - require.Contains(t, lines[0], " 1") - require.Contains(t, lines[1], "B:") - require.Contains(t, lines[1], " 2") -} - -func TestListTableTooFewValues(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(ListTableOutputType), "a", "b", "c") - require.NotNil(t, tab) - tab.AddRow("1", "2") - tab.Render() - - output := b.String() - require.NotNil(t, output) - lines := strings.Split(output, "\n") - - // Output should contain header row, data row, and a blank line - require.Equal(t, 4, len(lines), "%v", lines) - require.Contains(t, lines[0], "A:") - require.Contains(t, lines[0], " 1") - require.Contains(t, lines[1], "B:") - require.Contains(t, lines[1], " 2") - require.Contains(t, lines[2], "C:") -} - -func TestNewOutputWriterYAML(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(YAMLOutputType), "a", "b", "c") - require.NotNil(t, tab) - tab.AddRow("1", "2", "3") - tab.AddRow("4", "5", "6") - tab.Render() - - output := b.String() - require.NotNil(t, output) - - lines := strings.Split(output, "\n") - // Output should contain our two objects of three values and a blank line - require.Equal(t, 7, len(lines), "%v", lines) - require.Contains(t, lines[0], "- a: \"1\"") - require.Contains(t, lines[1], " b: \"2\"") - require.Contains(t, lines[2], " c: \"3\"") - require.Contains(t, lines[3], "- a: \"4\"") - require.Contains(t, lines[4], " b: \"5\"") - require.Contains(t, lines[5], " c: \"6\"") -} - -func TestYAMLWriterTooManyValues(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(YAMLOutputType), "a", "b") - require.NotNil(t, tab) - tab.AddRow("1", "2", "3") - tab.AddRow("4", "5", "6") - tab.Render() - - output := b.String() - require.NotNil(t, output) - - lines := strings.Split(output, "\n") - // Output should contain our two objects of three values and a blank line - require.Equal(t, 5, len(lines), "%v", lines) - require.Contains(t, lines[0], "- a: \"1\"") - require.Contains(t, lines[1], " b: \"2\"") - require.Contains(t, lines[2], "- a: \"4\"") - require.Contains(t, lines[3], " b: \"5\"") -} - -func TestYAMLTooFewValues(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(YAMLOutputType), "a", "b", "c") - require.NotNil(t, tab) - tab.AddRow("1", "2") - tab.AddRow("4", "5") - tab.Render() - - output := b.String() - require.NotNil(t, output) - - lines := strings.Split(output, "\n") - // Output should contain our two objects of three values and a blank line - require.Equal(t, 5, len(lines), "%v", lines) - require.Contains(t, lines[0], "- a: \"1\"") - require.Contains(t, lines[1], " b: \"2\"") - require.Contains(t, lines[2], "- a: \"4\"") - require.Contains(t, lines[3], " b: \"5\"") -} - -func TestNewOutputWriterJSON(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(JSONOutputType), "a", "b", "c") - require.NotNil(t, tab) - tab.AddRow("1", "2", "3") - tab.AddRow("4", "5", "6") - tab.Render() - - output := b.String() - require.NotNil(t, output) - - lines := strings.Split(output, "\n") - // Output should contain an array of two objects with three values each - require.Equal(t, 12, len(lines), "%v", lines) - require.Contains(t, lines[0], "[") - require.Contains(t, lines[1], "{") - require.Contains(t, lines[2], "\"a\": \"1\",") - require.Contains(t, lines[3], "\"b\": \"2\",") - require.Contains(t, lines[4], "\"c\": \"3\"") - require.Contains(t, lines[5], "},") - require.Contains(t, lines[6], "{") - require.Contains(t, lines[7], "\"a\": \"4\",") - require.Contains(t, lines[8], "\"b\": \"5\",") - require.Contains(t, lines[9], "\"c\": \"6\"") - require.Contains(t, lines[10], "}") - require.Contains(t, lines[11], "]") -} - -func TestOutputWriterCharactersInKeys(t *testing.T) { - var b bytes.Buffer - tab := NewOutputWriter(&b, string(JSONOutputType), "a key with spaces", "one/two", "zip:zap") - require.NotNil(t, tab) - tab.AddRow("1", "2", "3") - tab.Render() - - output := b.String() - require.NotNil(t, output) - - lines := strings.Split(output, "\n") - // Output should contain an array of an object with three values, keys adjusted - require.Equal(t, 7, len(lines), "%v", lines) - require.Contains(t, lines[0], "[") - require.Contains(t, lines[1], "{") - require.Contains(t, lines[2], "\"a_key_with_spaces\": \"1\",") - require.Contains(t, lines[3], "\"one/two\": \"2\",") - require.Contains(t, lines[4], "\"zip:zap\": \"3\"") - require.Contains(t, lines[5], "}") - require.Contains(t, lines[6], "]") -} - -func TestObjectWriterJSON(t *testing.T) { - var b bytes.Buffer - out := NewObjectWriter(&b, string(JSONOutputType), &testStruct{Name: "hal", Namespace: "Jupiter"}) - out.Render() - - output := b.String() - require.NotNil(t, output) - - lines := strings.Split(output, "\n") - require.Equal(t, 4, len(lines), "%v", lines) - require.Contains(t, lines[0], "{") - require.Contains(t, lines[1], "\"name\": \"hal\",") - require.Contains(t, lines[2], "\"spacename\": \"Jupiter\"") - require.Contains(t, lines[3], "}") -} - -func TestObjectWriterYAML(t *testing.T) { - var b bytes.Buffer - out := NewObjectWriter(&b, string(YAMLOutputType), &testStruct{Name: "hal", Namespace: "Jupiter"}) - out.Render() - - output := b.String() - require.NotNil(t, output) - - lines := strings.Split(output, "\n") - require.Equal(t, 3, len(lines), "%v", lines) - require.Contains(t, lines[0], "name: hal") - require.Contains(t, lines[1], "spacename: Jupiter") -} - -type testStruct struct { - Name string `json:"name,omitempty" yaml:"name,omitempty"` - Namespace string `json:"spacename,omitempty" yaml:"spacename,omitempty"` -} diff --git a/cli/runtime/component/prompt.go b/cli/runtime/component/prompt.go deleted file mode 100644 index e8c141aace..0000000000 --- a/cli/runtime/component/prompt.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "io" - "os" - - "github.com/AlecAivazis/survey/v2" - "github.com/AlecAivazis/survey/v2/terminal" -) - -// PromptConfig is the configuration for a prompt. -type PromptConfig struct { - // Message to display to user. - Message string - - // Options for user to choose from - Options []string - - // Default option. - Default string - - // Sensitive information. - Sensitive bool - - // Help for the prompt. - Help string -} - -// Run the prompt. -func (p *PromptConfig) Run(response interface{}, opts ...PromptOpt) error { - return Prompt(p, response, opts...) -} - -// Prompt for input, reads input value, without trimming any characters (may include leading/tailing spaces) -func Prompt(p *PromptConfig, response interface{}, opts ...PromptOpt) error { - prompt := translatePromptConfig(p) - options := defaultPromptOptions() - for _, opt := range opts { - err := opt(options) - if err != nil { - return err - } - } - - surveyOpts := translatePromptOpts(options) - return survey.AskOne(prompt, response, surveyOpts...) -} - -func translatePromptConfig(p *PromptConfig) survey.Prompt { - if p.Sensitive { - return &survey.Password{ - Message: p.Message, - Help: p.Help, - } - } - if len(p.Options) != 0 { - return &survey.Select{ - Message: p.Message, - Options: p.Options, - Default: p.Default, - Help: p.Help, - } - } - return &survey.Input{ - Message: p.Message, - Default: p.Default, - Help: p.Help, - } -} - -func defaultPromptOptions() *PromptOptions { - return &PromptOptions{ - Stdio: terminal.Stdio{ - In: os.Stdin, - Out: os.Stdout, - Err: os.Stderr, - }, - Icons: survey.IconSet{ - Error: survey.Icon{ - Text: "X", - Format: "red", - }, - Help: survey.Icon{ - Text: "?", - Format: "cyan", - }, - Question: survey.Icon{ - Text: "?", - Format: "cyan+b", - }, - MarkedOption: survey.Icon{ - Text: "[x]", - Format: "green", - }, - UnmarkedOption: survey.Icon{ - Text: "[ ]", - Format: "default+hb", - }, - SelectFocus: survey.Icon{ - Text: ">", - Format: "cyan+b", - }, - }, - } -} - -// PromptOptions are options for prompting. -type PromptOptions struct { - // Standard in/out/error - Stdio terminal.Stdio - Icons survey.IconSet -} - -// PromptOpt is an option for prompts -type PromptOpt func(*PromptOptions) error - -func translatePromptOpts(options *PromptOptions) (surveyOpts []survey.AskOpt) { - surveyOpts = append(surveyOpts, survey.WithStdio(options.Stdio.In, options.Stdio.Out, options.Stdio.Err), survey.WithIcons(func(icons *survey.IconSet) { - icons.Error = options.Icons.Error - icons.Question = options.Icons.Question - icons.Help = options.Icons.Help - icons.MarkedOption = options.Icons.MarkedOption - icons.UnmarkedOption = options.Icons.UnmarkedOption - icons.SelectFocus = options.Icons.SelectFocus - })) - - return -} - -// WithStdio specifies the standard input, output and error. By default, these are os.Stdin, -// os.Stdout, and os.Stderr. -func WithStdio(in terminal.FileReader, out terminal.FileWriter, err io.Writer) PromptOpt { - return func(options *PromptOptions) error { - options.Stdio.In = in - options.Stdio.Out = out - options.Stdio.Err = err - return nil - } -} diff --git a/cli/runtime/component/prompt_test.go b/cli/runtime/component/prompt_test.go deleted file mode 100644 index 1bd1723987..0000000000 --- a/cli/runtime/component/prompt_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "testing" - - "github.com/AlecAivazis/survey/v2" - "github.com/stretchr/testify/assert" -) - -func Test_translatePromptConfig_Sensitive(t *testing.T) { - assert := assert.New(t) - - promptConfig := PromptConfig{ - Message: "Pick a card, any card", - Options: []string{"one", "two", "three"}, - Default: "one", - Sensitive: true, - Help: "Help will be given to those who need it", - } - - prompt := translatePromptConfig(&promptConfig) - assert.NotNil(prompt) - - // Secure should return a password prompt - _, ok := prompt.(*survey.Password) - assert.True(ok) -} - -func Test_translatePromptConfig_OptionsSelect(t *testing.T) { - assert := assert.New(t) - - promptConfig := PromptConfig{ - Message: "Pick a card, any card", - Options: []string{"one", "two", "three"}, - Default: "one", - Sensitive: false, - Help: "Help will be given to those who need it", - } - - prompt := translatePromptConfig(&promptConfig) - assert.NotNil(prompt) - - // Prompt with options should return a select prompt - selectPrompt, ok := prompt.(*survey.Select) - assert.True(ok) - assert.Equal(len(promptConfig.Options), len(selectPrompt.Options)) -} - -func Test_translatePromptConfig_Input(t *testing.T) { - assert := assert.New(t) - - promptConfig := PromptConfig{ - Message: "Pick a card, any card", - Default: "one", - Sensitive: false, - Help: "Help will be given to those who need it", - } - - prompt := translatePromptConfig(&promptConfig) - assert.NotNil(prompt) - - // Prompt without options should return an input prompt - _, ok := prompt.(*survey.Input) - assert.True(ok) -} - -func Test_PromptOptions(t *testing.T) { - assert := assert.New(t) - - options := defaultPromptOptions() - opts := translatePromptOpts(options) - - assert.NotNil(options) - assert.NotNil(opts) - assert.Equal("?", options.Icons.Question.Text) - assert.Equal("cyan+b", options.Icons.Question.Format) - assert.Equal(2, len(opts)) -} diff --git a/cli/runtime/component/question.go b/cli/runtime/component/question.go deleted file mode 100644 index c0b23bd34a..0000000000 --- a/cli/runtime/component/question.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "github.com/AlecAivazis/survey/v2" -) - -// QuestionConfig stores config for prompting a CLI question. -type QuestionConfig struct { - Message string -} - -// Run asks a question. -func (q *QuestionConfig) Run(response interface{}) error { - return Ask(q, response) -} - -// Ask asks a questions and lets the user select an option. -func Ask(q *QuestionConfig, response interface{}) error { - return survey.AskOne(&survey.Input{Message: q.Message}, response) -} diff --git a/cli/runtime/component/reader.go b/cli/runtime/component/reader.go deleted file mode 100644 index 4803fab048..0000000000 --- a/cli/runtime/component/reader.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "bytes" - "fmt" - "io" - "os" - - "github.com/aunum/log" - "github.com/pkg/errors" -) - -const ( - stdInIdentifier = "-" -) - -// ReadInput reads from file or std input and return a byte array. -func ReadInput(filePath string) ([]byte, error) { - if filePath == stdInIdentifier { - return readFromStdInput() - } - return readFromFile(filePath) -} - -// readFromFile opens the file at path and reads the file into a byte array. -func readFromFile(filePath string) ([]byte, error) { - inputFile, err := os.Open(filePath) - if err != nil { - return nil, errors.WithMessage(err, fmt.Sprintf("Error opening the input file %s.", filePath)) - } - defer func() { - if err = inputFile.Close(); err != nil { - log.Fatal(err) - } - }() - - buf := bytes.NewBuffer(nil) - _, err = io.Copy(buf, inputFile) - if err != nil { - return nil, errors.WithMessage(err, fmt.Sprintf("error reading from input file %s", filePath)) - } - log.Debugf("read object --> \n---\n%s\n---\n", buf.String()) - return buf.Bytes(), nil -} - -// readFromStdInput reads the incoming stream of bytes from console and return a byte array. -func readFromStdInput() ([]byte, error) { - inBytes, err := io.ReadAll(os.Stdin) - if err != nil { - return nil, errors.WithMessage(err, "error reading from stdin") - } - return inBytes, nil -} diff --git a/cli/runtime/component/reader_test.go b/cli/runtime/component/reader_test.go deleted file mode 100644 index 83beb1ebbb..0000000000 --- a/cli/runtime/component/reader_test.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "os" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestComponent(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Component Suite") -} - -var _ = Describe("Unit testing the reader", func() { - Context("Test reading from file", func() { - It("test happy path", func() { - file, err := os.CreateTemp("/tmp", "foo") - Expect(err).ToNot(HaveOccurred()) - - testContent := "Test content" - _, err = file.WriteString(testContent) - Expect(err).ToNot(HaveOccurred()) - - contents, err := ReadInput(file.Name()) - Expect(err).ToNot(HaveOccurred()) - - Expect(string(contents)).To(Equal(testContent)) - - err = os.Remove(file.Name()) - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) diff --git a/cli/runtime/component/select.go b/cli/runtime/component/select.go deleted file mode 100644 index dcdbb76b97..0000000000 --- a/cli/runtime/component/select.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package component - -import ( - "github.com/AlecAivazis/survey/v2" -) - -// SelectConfig is the configuration for a selection. -type SelectConfig struct { - // Message to display to user. - Message string - - // Default option. - Default interface{} - - // Options to select frorm. - Options []string - - // Sensitive information. - Sensitive bool - - // Help for the prompt. - Help string - - // PageSize defines how many options per page. - PageSize int -} - -// Run the selection. -func (p *SelectConfig) Run(response interface{}) error { - return Select(p, response) -} - -// Select an option. -func Select(p *SelectConfig, response interface{}) error { - prompt := translateSelectConfig(p) - return survey.AskOne(prompt, response) -} - -func translateSelectConfig(p *SelectConfig) survey.Prompt { - return &survey.Select{ - Message: p.Message, - Options: p.Options, - Default: p.Default, - Help: p.Help, - PageSize: p.PageSize, - } -} diff --git a/cli/runtime/config/cli_discovery_sources.go b/cli/runtime/config/cli_discovery_sources.go deleted file mode 100644 index 24c0eade1e..0000000000 --- a/cli/runtime/config/cli_discovery_sources.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "fmt" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" -) - -// GetCLIDiscoverySources retrieves cli discovery sources -func GetCLIDiscoverySources() ([]configapi.PluginDiscovery, error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return nil, err - } - - return getCLIDiscoverySources(node) -} - -// GetCLIDiscoverySource retrieves cli discovery source by name assuming that there should only be one source with the name, returns the first match -func GetCLIDiscoverySource(name string) (*configapi.PluginDiscovery, error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return nil, err - } - - return getCLIDiscoverySource(node, name) -} - -// SetCLIDiscoverySources Add/Update array of cli discovery sources to the yaml node -func SetCLIDiscoverySources(discoverySources []configapi.PluginDiscovery) (err error) { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - - // Loop through each discovery source and add or update existing node - for _, discoverySource := range discoverySources { - persist, err := setCLIDiscoverySource(node, discoverySource) - if err != nil { - return err - } - // Persist the config node to the file - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - } - return nil -} - -// SetCLIDiscoverySource add or update a cli discoverySource -func SetCLIDiscoverySource(discoverySource configapi.PluginDiscovery) (err error) { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - - // Add/Update cli discovery source in the yaml node - persist, err := setCLIDiscoverySource(node, discoverySource) - if err != nil { - return err - } - - // Persist the config node to the file - if persist { - return persistConfig(node) - } - - return err -} - -// DeleteCLIDiscoverySource delete cli discoverySource by name -func DeleteCLIDiscoverySource(name string) error { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - - // Delete the matching cli discovery source from the yaml node - err = deleteCLIDiscoverySource(node, name) - if err != nil { - return err - } - - // Persist the config node to the file - return persistConfig(node) -} - -func getCLIDiscoverySources(node *yaml.Node) ([]configapi.PluginDiscovery, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - if cfg.ClientOptions != nil && cfg.ClientOptions.CLI != nil && cfg.ClientOptions.CLI.DiscoverySources != nil { - return cfg.ClientOptions.CLI.DiscoverySources, nil - } - return nil, errors.New("cli discovery sources not found") -} - -func getCLIDiscoverySource(node *yaml.Node, name string) (*configapi.PluginDiscovery, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - if cfg.ClientOptions != nil && cfg.ClientOptions.CLI != nil && cfg.ClientOptions.CLI.DiscoverySources != nil { - for _, discoverySource := range cfg.ClientOptions.CLI.DiscoverySources { - _, discoverySourceName := getDiscoverySourceTypeAndName(discoverySource) - if discoverySourceName == name { - return &discoverySource, nil - } - } - } - return nil, errors.New("cli discovery source not found") -} - -// setCLIDiscoverySources Add/Update array of cli discovery sources to the yaml node -func setCLIDiscoverySources(node *yaml.Node, discoverySources []configapi.PluginDiscovery) (err error) { - for _, discoverySource := range discoverySources { - _, err = setCLIDiscoverySource(node, discoverySource) - if err != nil { - return err - } - } - return err -} - -// setCLIDiscoverySource Add/Update cli discovery source in the yaml node -func setCLIDiscoverySource(node *yaml.Node, discoverySource configapi.PluginDiscovery) (persist bool, err error) { - // Retrieve the patch strategies from config metadata - patchStrategies, err := GetConfigMetadataPatchStrategy() - if err != nil { - patchStrategies = make(map[string]string) - } - - // Find the cli discovery sources node - keys := []nodeutils.Key{ - {Name: KeyClientOptions, Type: yaml.MappingNode}, - {Name: KeyCLI, Type: yaml.MappingNode}, - {Name: KeyDiscoverySources, Type: yaml.SequenceNode}, - } - discoverySourcesNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if discoverySourcesNode == nil { - return persist, nodeutils.ErrNodeNotFound - } - - // Add or Update cli discovery source to discovery sources node based on patch strategy - key := fmt.Sprintf("%v.%v.%v", KeyClientOptions, KeyCLI, KeyDiscoverySources) - return setDiscoverySource(discoverySourcesNode, discoverySource, nodeutils.WithPatchStrategyKey(key), nodeutils.WithPatchStrategies(patchStrategies)) -} - -func deleteCLIDiscoverySource(node *yaml.Node, name string) error { - // Find cli discovery sources node in the yaml node - keys := []nodeutils.Key{ - {Name: KeyClientOptions}, - {Name: KeyCLI}, - {Name: KeyDiscoverySources}, - } - cliDiscoverySourcesNode := nodeutils.FindNode(node.Content[0], nodeutils.WithKeys(keys)) - if cliDiscoverySourcesNode == nil { - return nil - } - - // Get matching cli discovery source from the yaml node - discoverySource, err := getCLIDiscoverySource(node, name) - if err != nil { - return err - } - discoverySourceType, discoverySourceName := getDiscoverySourceTypeAndName(*discoverySource) - var result []*yaml.Node - for _, discoverySourceNode := range cliDiscoverySourcesNode.Content { - // Find discovery source matched by discoverySourceType - if discoverySourceIndex := nodeutils.GetNodeIndex(discoverySourceNode.Content, discoverySourceType); discoverySourceIndex != -1 { - // Find matching discovery source - if discoverySourceFieldIndex := nodeutils.GetNodeIndex(discoverySourceNode.Content[discoverySourceIndex].Content, "name"); discoverySourceFieldIndex != -1 && discoverySourceNode.Content[discoverySourceIndex].Content[discoverySourceFieldIndex].Value == discoverySourceName { - continue - } - } - result = append(result, discoverySourceNode) - } - cliDiscoverySourcesNode.Style = 0 - cliDiscoverySourcesNode.Content = result - return nil -} diff --git a/cli/runtime/config/cli_discovery_sources_it_test.go b/cli/runtime/config/cli_discovery_sources_it_test.go deleted file mode 100644 index 7c47cd6062..0000000000 --- a/cli/runtime/config/cli_discovery_sources_it_test.go +++ /dev/null @@ -1,334 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func setupData() (string, string, string, string) { - CFG := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "/:" - unknown: cli-unknown - contextType: k8s - - local: - name: admin-local - path: admin -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: test-endpoint - path: test-path - context: test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc -current: test-mc -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -` - - CFG2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -` - - expectedCFG := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "default-image" - unknown: cli-unknown - contextType: k8s - - local: - name: admin-local - path: admin - - oci: - name: new-default - image: new-default-image -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: test-endpoint - path: test-path - context: test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc -current: test-mc -` - //nolint:goconst - expectedCFG2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -` - - return CFG, expectedCFG, CFG2, expectedCFG2 -} - -func TestCLIDiscoverySourceIntegration(t *testing.T) { - // Setup config data - cfg, expectedCfg, cfg2, expectedCfg2 := setupData() - cfgFiles, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2}) - - defer func() { - cleanUp() - }() - - // Get CLI DiscoverySources - sources, err := GetCLIDiscoverySources() - assert.Nil(t, err) - assert.Equal(t, 2, len(sources)) - - // Add new OCI CLI DiscoverySource - ds := &configapi.PluginDiscovery{ - OCI: &configapi.OCIDiscovery{ - Name: "new-default", - Image: "new-default-image", - }, - } - err = SetCLIDiscoverySource(*ds) - assert.NoError(t, err) - sources, err = GetCLIDiscoverySources() - assert.Nil(t, err) - assert.Equal(t, 3, len(sources)) - // Should not persist on Adding same OCI CLI DiscoverySource - err = SetCLIDiscoverySource(*ds) - assert.NoError(t, err) - sources, err = GetCLIDiscoverySources() - assert.Nil(t, err) - assert.Equal(t, 3, len(sources)) - - // Update existing OCI CLI DiscoverySource - ds = &configapi.PluginDiscovery{ - OCI: &configapi.OCIDiscovery{ - Name: "default", - Image: "default-image", - }, - } - err = SetCLIDiscoverySource(*ds) - assert.NoError(t, err) - source, err := GetCLIDiscoverySource("default") - assert.Nil(t, err) - assert.NotNil(t, source) - assert.Equal(t, ds.OCI, source.OCI) - - file, err := os.ReadFile(cfgFiles[0].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg, string(file)) - - file, err = os.ReadFile(cfgFiles[1].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg2, string(file)) - - // Delete existing DiscoverySource - err = DeleteCLIDiscoverySource("new-default") - assert.NoError(t, err) - sources, err = GetCLIDiscoverySources() - assert.Nil(t, err) - assert.Equal(t, 2, len(sources)) -} - -func setupDataWithPatchStrategy() (string, string, string, string) { - cfg := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "/:" - unknown: cli-unknown - annotation: new-annotation - contextType: k8s - - local: - name: admin-local - path: admin -` - expectedCfg := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "update-default-image" - unknown: cli-unknown - contextType: k8s - - local: - name: admin-local - path: admin - - oci: - name: new-default - image: new-default-image -` - - expectedCfg2 := `{} -` - - return cfg, expectedCfg, "", expectedCfg2 -} - -func TestCLIDiscoverySourceIntegrationWithPatchStrategy(t *testing.T) { - // Setup config data - cfg, expectedCfg, cfg2, expectedCfg2 := setupDataWithPatchStrategy() - metadata := `configMetadata: - patchStrategy: - clientOptions.cli.discoverySources.oci.annotation: replace` - cfgFiles, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2, cfgMetadata: metadata}) - - defer func() { - cleanUp() - }() - - // Get CLI DiscoverySources - sources, err := GetCLIDiscoverySources() - assert.Nil(t, err) - assert.Equal(t, 2, len(sources)) - // Add new OCI CLI DiscoverySource - ds := &configapi.PluginDiscovery{ - OCI: &configapi.OCIDiscovery{ - Name: "new-default", - Image: "new-default-image", - }, - } - err = SetCLIDiscoverySource(*ds) - assert.NoError(t, err) - sources, err = GetCLIDiscoverySources() - assert.Nil(t, err) - assert.Equal(t, 3, len(sources)) - - // Should not persist on Adding same OCI CLI DiscoverySource - err = SetCLIDiscoverySource(*ds) - assert.NoError(t, err) - sources, err = GetCLIDiscoverySources() - assert.Nil(t, err) - assert.Equal(t, 3, len(sources)) - - // Update existing OCI CLI DiscoverySource - ds = &configapi.PluginDiscovery{ - OCI: &configapi.OCIDiscovery{ - Name: "default", - Image: "update-default-image", - }, - } - err = SetCLIDiscoverySource(*ds) - assert.NoError(t, err) - source, err := GetCLIDiscoverySource("default") - assert.Nil(t, err) - assert.NotNil(t, source) - assert.Equal(t, ds.OCI, source.OCI) - - file, err := os.ReadFile(cfgFiles[0].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg, string(file)) - - file, err = os.ReadFile(cfgFiles[1].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg2, string(file)) -} diff --git a/cli/runtime/config/cli_discovery_sources_test.go b/cli/runtime/config/cli_discovery_sources_test.go deleted file mode 100644 index df325a3e3a..0000000000 --- a/cli/runtime/config/cli_discovery_sources_test.go +++ /dev/null @@ -1,733 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestGetCLIDiscoverySources(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - in *configapi.ClientConfig - out []configapi.PluginDiscovery - errStr string - }{ - { - name: "success get all", - in: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - }, - out: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - err := StoreClientConfig(spec.in) - assert.NoError(t, err) - c, err := GetCLIDiscoverySources() - assert.Equal(t, spec.out, c) - assert.NoError(t, err) - }) - } -} - -func TestGetCLIDiscoverySource(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - in *configapi.ClientConfig - out *configapi.PluginDiscovery - }{ - { - name: "success get", - in: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - }, - out: &configapi.PluginDiscovery{ - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - err := StoreClientConfig(spec.in) - assert.NoError(t, err) - c, err := GetCLIDiscoverySource("test") - assert.Equal(t, spec.out, c) - assert.NoError(t, err) - }) - } -} - -func TestSetCLIDiscoverySources(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - input []configapi.PluginDiscovery - total int - }{ - { - name: "success add test", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "default", - Path: "standalone", - }, - }, - }, - total: 2, - }, - { - name: "success add test", - input: []configapi.PluginDiscovery{ - { - Local: &configapi.LocalDiscovery{ - Name: "admin-local", - Path: "admin", - }, - }, - }, - total: 3, - }, - { - name: "success add test", - input: []configapi.PluginDiscovery{ - { - OCI: &configapi.OCIDiscovery{ - Name: "default", - Image: "test-image", - }, - }, - }, - total: 3, - }, - { - name: "success update test", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-updated-bucket", - ManifestPath: "test-updated-manifest-path", - }, - }, - }, - total: 3, - }, - { - name: "should not persist same test", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-updated-bucket", - ManifestPath: "test-updated-manifest-path", - }, - }, - }, - total: 3, - }, - { - name: "success add default gcp", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "default", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - total: 3, - }, - { - name: "success add default-local gcp", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "default-local", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - total: 4, - }, - { - name: "success add default-local local", - input: []configapi.PluginDiscovery{ - { - Local: &configapi.LocalDiscovery{ - Name: "default-local", - Path: "test-path", - }, - }, - }, - total: 4, - }, - { - name: "success add default-local local", - input: []configapi.PluginDiscovery{ - { - Local: &configapi.LocalDiscovery{ - Name: "default-local", - Path: "test-path", - }, - }, - }, - total: 4, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - err := SetCLIDiscoverySources(spec.input) - assert.NoError(t, err) - sources, err := GetCLIDiscoverySources() - assert.NoError(t, err) - assert.Equal(t, spec.total, len(sources)) - }) - } -} - -func TestDeleteCLIDiscoverySource(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - src *configapi.ClientConfig - input string - count int - errStr string - }{{ - name: "should return err on deleting non existing source", - src: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - }, - input: "test-notfound", - count: 1, - errStr: "cli discovery source not found", - }, - { - name: "should delete existing test source", - src: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - }, - input: "test", - count: 0, - }, - { - name: "should delete test2 source", - src: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test2", - Bucket: "test-bucket2", - ManifestPath: "test-manifest-path2", - }, - }, - }, - }, - }, - }, - count: 1, - input: "test2", - }, - { - name: "should delete local default source", - src: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "default", - Path: "standalone", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "admin-local", - Path: "admin", - }, - }, - }, - }, - }, - }, - count: 2, - input: "default", - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - err := StoreClientConfig(spec.src) - assert.NoError(t, err) - err = DeleteCLIDiscoverySource(spec.input) - if spec.errStr != "" { - assert.Equal(t, err.Error(), spec.errStr) - } else { - assert.NoError(t, err) - } - sources, err := GetCLIDiscoverySources() - assert.NoError(t, err) - assert.Equal(t, spec.count, len(sources)) - }) - } -} - -func TestIntegrationSetGetDeleteCLIDiscoverySource(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - sources := []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "default", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - } - - // Get from the empty config - ds, err := GetCLIDiscoverySource("test") - assert.Equal(t, "cli discovery source not found", err.Error()) - assert.Nil(t, ds) - - // Add source to empty config - err = SetCLIDiscoverySources(sources) - assert.NoError(t, err) - - ds, err = GetCLIDiscoverySource("default") - assert.Nil(t, err) - assert.Equal(t, sources[0], *ds) - - // Delete existing source - err = DeleteCLIDiscoverySource("default") - assert.NoError(t, err) - - ds, err = GetCLIDiscoverySource("default") - assert.Equal(t, "cli discovery source not found", err.Error()) - assert.Nil(t, ds) - - err = DeleteCLIDiscoverySource("default-local") - assert.Equal(t, "cli discovery source not found", err.Error()) - - ds, err = GetCLIDiscoverySource("default-local") - assert.Equal(t, "cli discovery source not found", err.Error()) - assert.Nil(t, ds) - - ds, err = GetCLIDiscoverySource("default") - assert.Equal(t, "cli discovery source not found", err.Error()) - assert.Nil(t, ds) -} - -func TestSetCLIDiscoverySourceLocalMulti(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - src := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{}, - }, - } - input := configapi.PluginDiscovery{ - Local: &configapi.LocalDiscovery{ - Name: "admin-local", - Path: "admin", - }, - } - input2 := configapi.PluginDiscovery{ - Local: &configapi.LocalDiscovery{ - Name: "default-local", - Path: "standalone", - }, - } - updateInput2 := configapi.PluginDiscovery{ - Local: &configapi.LocalDiscovery{ - Name: "default-local", - Path: "standalone-updated", - }, - } - - // Actions - err := StoreClientConfig(src) - assert.NoError(t, err) - err = SetCLIDiscoverySource(input) - assert.NoError(t, err) - c, err := GetCLIDiscoverySource("admin-local") - assert.Equal(t, input.Local, c.Local) - assert.NoError(t, err) - err = SetCLIDiscoverySource(input2) - assert.NoError(t, err) - c, err = GetCLIDiscoverySource("default-local") - assert.Equal(t, input2.Local, c.Local) - assert.NoError(t, err) - // Update Input2 - err = SetCLIDiscoverySource(updateInput2) - assert.NoError(t, err) - c, err = GetCLIDiscoverySource("default-local") - assert.Equal(t, updateInput2.Local, c.Local) - assert.NoError(t, err) -} - -func TestSetCLIDiscoverySourceWithDefaultAndDefaultLocal(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - input []configapi.PluginDiscovery - totalSources int - }{ - { - name: "success add default-test source", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "default-test", - Bucket: "default-test-bucket", - ManifestPath: "default-test-manifest-path", - }, - }, - }, - totalSources: 1, - }, - { - name: "success add default source", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "default", - Bucket: "default-test-bucket", - ManifestPath: "default-test-manifest-path", - }, - }, - }, - totalSources: 2, - }, - { - name: "success add default-local source", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "default-local", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - - totalSources: 3, - }, - { - name: "success update default", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "default", - Bucket: "default-test-bucket-updated", - ManifestPath: "default-test-manifest-path-updated", - }, - }, - }, - - totalSources: 3, - }, - { - name: "success update default-local", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "default-local", - Bucket: "default-test-bucket-updated", - ManifestPath: "default-test-manifest-path-updated", - }, - }, - }, - - totalSources: 3, - }, - { - name: "success add default", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "default", - Bucket: "default-test-bucket-updated", - ManifestPath: "default-test-manifest-path-updated", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "test-local", - Path: "test-local-path", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "default", - Path: "default-local-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "default", - Bucket: "default-test-bucket-updated2", - ManifestPath: "default-test-manifest-path-updated2", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test-gcp1", - Bucket: "test-bucket-updated", - ManifestPath: "test-manifest-path-updated", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "default-local", - Path: "default-local-path", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "test-gcp1", - Path: "default-local-path", - }, - }, - }, - totalSources: 5, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - for _, ds := range spec.input { - err := SetCLIDiscoverySource(ds) - assert.NoError(t, err) - } - - if spec.totalSources != 0 { - sources, err := GetCLIDiscoverySources() - assert.NoError(t, err) - assert.Equal(t, spec.totalSources, len(sources)) - } - }) - } -} - -func TestSetCLIDiscoverySourceMultiTypes(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - input []configapi.PluginDiscovery - totalSources int - }{ - - { - name: "success add multiple discovery source types", - input: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "default", - Bucket: "default-test-bucket-updated", - ManifestPath: "default-test-manifest-path-updated", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "test-local", - Path: "test-local-path", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "default", - Path: "default-local-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "default", - Bucket: "default-test-bucket-updated2", - ManifestPath: "default-test-manifest-path-updated2", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test-gcp1", - Bucket: "test-bucket-updated", - ManifestPath: "test-manifest-path-updated", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "default-local", - Path: "default-local-path", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "test-gcp1", - Path: "default-local-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test-gcp2", - Bucket: "test-bucket-updated", - ManifestPath: "test-manifest-path-updated", - }, - }, - }, - totalSources: 5, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - for _, ds := range spec.input { - err := SetCLIDiscoverySource(ds) - assert.NoError(t, err) - } - - if spec.totalSources != 0 { - sources, err := GetCLIDiscoverySources() - assert.NoError(t, err) - assert.Equal(t, spec.totalSources, len(sources)) - } - }) - } -} diff --git a/cli/runtime/config/cli_options.go b/cli/runtime/config/cli_options.go deleted file mode 100644 index 3f4f2fc309..0000000000 --- a/cli/runtime/config/cli_options.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" -) - -// GetEdition retrieves ClientOptions Edition -func GetEdition() (string, error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return "", err - } - return getEdition(node) -} - -// SetEdition adds or updates edition value -func SetEdition(val string) (err error) { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - - // Add or Update edition in the yaml node - persist := setEdition(node, val) - - // Persist the config node to the file - if persist { - return persistConfig(node) - } - return err -} - -func setEdition(node *yaml.Node, val string) (persist bool) { - editionNode := getCLIOptionsChildNode(KeyEdition, node) - if editionNode != nil && editionNode.Value != val { - editionNode.Value = val - persist = true - } - return persist -} - -func getEdition(node *yaml.Node) (string, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return "", err - } - if cfg != nil && cfg.ClientOptions != nil && cfg.ClientOptions.CLI != nil { - //nolint:staticcheck - return string(cfg.ClientOptions.CLI.Edition), nil - } - return "", errors.New("edition not found") -} - -func setUnstableVersionSelector(node *yaml.Node, name string) (persist bool) { - unstableVersionSelectorNode := getCLIOptionsChildNode(KeyUnstableVersionSelector, node) - if unstableVersionSelectorNode != nil && unstableVersionSelectorNode.Value != name { - unstableVersionSelectorNode.Value = name - persist = true - } - return persist -} - -func setBomRepo(node *yaml.Node, repo string) (persist bool) { - bomRepoNode := getCLIOptionsChildNode(KeyBomRepo, node) - if bomRepoNode != nil && bomRepoNode.Value != repo { - bomRepoNode.Value = repo - persist = true - } - return persist -} - -func setCompatibilityFilePath(node *yaml.Node, filepath string) (persist bool) { - compatibilityFilePathNode := getCLIOptionsChildNode(KeyCompatibilityFilePath, node) - if compatibilityFilePathNode.Value != filepath { - compatibilityFilePathNode.Value = filepath - persist = true - } - return persist -} - -// getCLIOptionsChildNode parses the yaml node and returns the matched node based on configOptions -func getCLIOptionsChildNode(key string, node *yaml.Node) *yaml.Node { - configOptions := func(c *nodeutils.CfgNode) { - c.ForceCreate = true - c.Keys = []nodeutils.Key{ - {Name: KeyClientOptions, Type: yaml.MappingNode}, - {Name: KeyCLI, Type: yaml.MappingNode}, - {Name: key, Type: yaml.ScalarNode, Value: ""}, - } - } - keyNode := nodeutils.FindNode(node.Content[0], configOptions) - return keyNode -} diff --git a/cli/runtime/config/cli_options_test.go b/cli/runtime/config/cli_options_test.go deleted file mode 100644 index 2beeea67c2..0000000000 --- a/cli/runtime/config/cli_options_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestGetEdition(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - in *configapi.ClientConfig - out string - errStr string - }{ - { - name: "success k8s", - in: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - Env: map[string]string{ - "test": "test", - }, - }, - }, - out: "test", - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - err := StoreClientConfig(spec.in) - assert.NoError(t, err) - c, err := GetEnv("test") - assert.NoError(t, err) - assert.Equal(t, spec.out, c) - assert.NoError(t, err) - }) - } -} - -func TestSetEdition(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - value string - }{ - { - name: "should persist tanzu when empty client config", - value: "tanzu", - }, - { - name: "should update and persist update-tanzu", - value: "update-tanzu", - }, - { - name: "should not persist same value update-tanzu", - value: "update-tanzu", - }, - } - - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - err := SetEdition(spec.value) - assert.NoError(t, err) - c, err := GetEdition() - assert.Equal(t, spec.value, c) - assert.NoError(t, err) - }) - } -} diff --git a/cli/runtime/config/cli_repositories.go b/cli/runtime/config/cli_repositories.go deleted file mode 100644 index 8623229895..0000000000 --- a/cli/runtime/config/cli_repositories.go +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "fmt" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" -) - -// GetCLIRepositories retrieves cli repositories -func GetCLIRepositories() ([]configapi.PluginRepository, error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return nil, err - } - - return getCLIRepositories(node) -} - -// GetCLIRepository retrieves cli repository by name -func GetCLIRepository(name string) (*configapi.PluginRepository, error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return nil, err - } - - return getCLIRepository(node, name) -} - -// SetCLIRepository add or update a repository -func SetCLIRepository(repository configapi.PluginRepository) (err error) { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - - // Add or update cli repository in the yaml node - persist, err := setCLIRepository(node, repository) - if err != nil { - return err - } - - // Persist the config node to the file - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - - return err -} - -// DeleteCLIRepository delete a cli repository by name -func DeleteCLIRepository(name string) error { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - - // Delete the matching cli repository from the yaml node - err = deleteCLIRepository(node, name) - if err != nil { - return err - } - - // Persist the config node to the file - return persistConfig(node) -} - -func getCLIRepositories(node *yaml.Node) ([]configapi.PluginRepository, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - if cfg.ClientOptions != nil && cfg.ClientOptions.CLI != nil && cfg.ClientOptions.CLI.Repositories != nil { - return cfg.ClientOptions.CLI.Repositories, nil - } - return nil, errors.New("cli repositories not found") -} - -func getCLIRepository(node *yaml.Node, name string) (*configapi.PluginRepository, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - if cfg.ClientOptions != nil && cfg.ClientOptions.CLI != nil && cfg.ClientOptions.CLI.Repositories != nil { - for _, repository := range cfg.ClientOptions.CLI.Repositories { - _, repositoryName := getRepositoryTypeAndName(repository) - if repositoryName == name { - return &repository, nil - } - } - } - return nil, errors.New("cli repository not found") -} - -func setCLIRepositories(node *yaml.Node, repos []configapi.PluginRepository) (err error) { - for _, repository := range repos { - _, err = setCLIRepository(node, repository) - if err != nil { - return err - } - } - return err -} - -func setCLIRepository(node *yaml.Node, repository configapi.PluginRepository) (persist bool, err error) { - // Retrieve the patch strategies from config metadata - patchStrategies, err := GetConfigMetadataPatchStrategy() - if err != nil { - patchStrategies = make(map[string]string) - } - - // Find the cli repositories node in the yaml node - keys := []nodeutils.Key{ - {Name: KeyClientOptions, Type: yaml.MappingNode}, - {Name: KeyCLI, Type: yaml.MappingNode}, - {Name: KeyRepositories, Type: yaml.SequenceNode}, - } - cliRepositoriesNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if cliRepositoriesNode == nil { - return persist, err - } - - // Add or Update cli repository to cli repositories node based on patch strategy - return setRepository(cliRepositoriesNode, repository, nodeutils.WithPatchStrategies(patchStrategies), nodeutils.WithPatchStrategyKey(fmt.Sprintf("%v.%v.%v", KeyClientOptions, KeyCLI, KeyRepositories))) -} - -func deleteCLIRepository(node *yaml.Node, name string) error { - // Find the cli repositories node in the yaml node - keys := []nodeutils.Key{ - {Name: KeyClientOptions, Type: yaml.MappingNode}, - {Name: KeyCLI, Type: yaml.MappingNode}, - {Name: KeyRepositories, Type: yaml.SequenceNode}, - } - cliRepositoriesNode := nodeutils.FindNode(node.Content[0], nodeutils.WithKeys(keys)) - if cliRepositoriesNode == nil { - return nil - } - - repository, err := getCLIRepository(node, name) - if err != nil { - return err - } - - repositoryType, repositoryName := getRepositoryTypeAndName(*repository) - - var result []*yaml.Node - for _, repositoryNode := range cliRepositoriesNode.Content { - if repositoryIndex := nodeutils.GetNodeIndex(repositoryNode.Content, repositoryType); repositoryIndex != -1 { - if repositoryFieldIndex := nodeutils.GetNodeIndex(repositoryNode.Content[repositoryIndex].Content, "name"); repositoryFieldIndex != -1 && repositoryNode.Content[repositoryIndex].Content[repositoryFieldIndex].Value == repositoryName { - continue - } - } - result = append(result, repositoryNode) - } - cliRepositoriesNode.Style = 0 - cliRepositoriesNode.Content = result - return nil -} - -func setRepository(repositoriesNode *yaml.Node, repository configapi.PluginRepository, patchStrategyOpts ...nodeutils.PatchStrategyOpts) (persist bool, err error) { - newNode, err := convertPluginRepositoryToNode(&repository) - if err != nil { - return persist, err - } - - exists := false - var result []*yaml.Node - - repositoryType, repositoryName := getRepositoryTypeAndName(repository) - if repositoryType == "" || repositoryName == "" { - return persist, errors.New("not found") - } - - // loop through the repositories seqence node - for _, repositoryNode := range repositoriesNode.Content { - // find the repository matching by repository type - if repositoryIndex := nodeutils.GetNodeIndex(repositoryNode.Content, repositoryType); repositoryIndex != -1 { - // find the repository matching by name - if repositoryFieldIndex := nodeutils.GetNodeIndex(repositoryNode.Content[repositoryIndex].Content, "name"); repositoryFieldIndex != -1 && - repositoryNode.Content[repositoryIndex].Content[repositoryFieldIndex].Value == repositoryName { - exists = true - // delete nodes specified in the patch strategy - _, err = nodeutils.DeleteNodes(newNode.Content[0], repositoryNode, patchStrategyOpts...) - if err != nil { - return false, err - } - // merge the new node into repository node - persist, err = nodeutils.MergeNodes(newNode.Content[0], repositoryNode) - if err != nil { - return false, err - } - result = append(result, repositoryNode) - continue - } - } - result = append(result, repositoryNode) - } - if !exists { - result = append(result, newNode.Content[0]) - persist = true - } - repositoriesNode.Style = 0 - repositoriesNode.Content = result - return persist, err -} - -func getRepositoryTypeAndName(repository configapi.PluginRepository) (string, string) { - if repository.GCPPluginRepository != nil && repository.GCPPluginRepository.Name != "" { - return "gcpPluginRepository", repository.GCPPluginRepository.Name - } - return "", "" -} diff --git a/cli/runtime/config/cli_repositories_it_test.go b/cli/runtime/config/cli_repositories_it_test.go deleted file mode 100644 index aab9f6354e..0000000000 --- a/cli/runtime/config/cli_repositories_it_test.go +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "testing" - - "github.com/pkg/errors" - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func setUpRepositoriesData() (string, string, string, string) { - cfg := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "update-default-image" - unknown: cli-unknown - contextType: k8s - - local: - name: default-local - contextType: k8s - - local: - name: admin-local - path: admin - - oci: - name: new-default - image: new-default-image - repositories: - - gcpPluginRepository: - bucketName: tanzu-cli-framework - name: core - unknown: cli-unknown -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: updated-test-endpoint - path: updated-test-path - context: updated-test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: one - required: true - contextType: tmc -current: test-mc -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: updated-test-endpoint - path: updated-test-path - context: updated-test-context - discoverySources: - - gcp: - name: test - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -` - expectedCfg := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "update-default-image" - unknown: cli-unknown - contextType: k8s - - local: - name: default-local - contextType: k8s - - local: - name: admin-local - path: admin - - oci: - name: new-default - image: new-default-image - repositories: - - gcpPluginRepository: - bucketName: update-bucket - name: core - unknown: cli-unknown - rootPath: new-root-path - - gcpPluginRepository: - name: new-repo - bucketName: new-bucket - rootPath: new-root-path -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: updated-test-endpoint - path: updated-test-path - context: updated-test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: one - required: true - contextType: tmc -current: test-mc -` - - cfg2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: updated-test-endpoint - path: updated-test-path - context: updated-test-context - discoverySources: - - gcp: - name: test - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -` - expectedCfg2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: updated-test-endpoint - path: updated-test-path - context: updated-test-context - discoverySources: - - gcp: - name: test - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -` - - return cfg, expectedCfg, cfg2, expectedCfg2 -} - -func TestCLIRepositoriesIntegration(t *testing.T) { - // Setup config data - cfg, expectedCfg, cfg2, expectedCfg2 := setUpRepositoriesData() - cfgFiles, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2}) - - defer func() { - cleanUp() - }() - - // Get CLI Repositories - repos, err := GetCLIRepositories() - assert.Nil(t, err) - assert.Equal(t, 1, len(repos)) - // Add new CLI Repository - newRepo := &configapi.PluginRepository{ - GCPPluginRepository: &configapi.GCPPluginRepository{ - Name: "new-repo", - BucketName: "new-bucket", - RootPath: "new-root-path", - }, - } - err = SetCLIRepository(*newRepo) - assert.NoError(t, err) - repos, err = GetCLIRepositories() - assert.Nil(t, err) - assert.Equal(t, 2, len(repos)) - // Should not persist on adding same CLI Repository - err = SetCLIRepository(*newRepo) - assert.NoError(t, err) - repos, err = GetCLIRepositories() - assert.Nil(t, err) - assert.Equal(t, 2, len(repos)) - // Update existing CLI Repository - existingRepo := &configapi.PluginRepository{ - GCPPluginRepository: &configapi.GCPPluginRepository{ - Name: "core", - BucketName: "update-bucket", - RootPath: "new-root-path", - }, - } - err = SetCLIRepository(*existingRepo) - assert.NoError(t, err) - repo, err := GetCLIRepository("core") - assert.Nil(t, err) - assert.NotNil(t, repo) - assert.Equal(t, existingRepo.GCPPluginRepository, repo.GCPPluginRepository) - - file, err := os.ReadFile(cfgFiles[0].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg, string(file)) - - file, err = os.ReadFile(cfgFiles[1].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg2, string(file)) - - // Delete CLI Repository - err = DeleteCLIRepository("core") - assert.NoError(t, err) - repos, err = GetCLIRepositories() - assert.Nil(t, err) - assert.Equal(t, 1, len(repos)) - repo, err = GetCLIRepository("core") - assert.Equal(t, errors.New("cli repository not found").Error(), err.Error()) - assert.Nil(t, repo) -} diff --git a/cli/runtime/config/cli_repositories_test.go b/cli/runtime/config/cli_repositories_test.go deleted file mode 100644 index 8e2bff2fae..0000000000 --- a/cli/runtime/config/cli_repositories_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestSetGetRepository(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - cfg *configapi.ClientConfig - in configapi.PluginRepository - out configapi.PluginRepository - }{ - { - name: "should persist repository", - cfg: &configapi.ClientConfig{}, - in: configapi.PluginRepository{ - GCPPluginRepository: &configapi.GCPPluginRepository{ - Name: "test", - BucketName: "bucket", - RootPath: "root-path", - }, - }, - out: configapi.PluginRepository{ - GCPPluginRepository: &configapi.GCPPluginRepository{ - Name: "test", - BucketName: "bucket", - RootPath: "root-path", - }, - }, - }, - { - name: "should not persist same repo", - cfg: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: []configapi.PluginRepository{ - { - GCPPluginRepository: &configapi.GCPPluginRepository{ - Name: "test", - BucketName: "bucket", - RootPath: "root-path", - }, - }, - }, - }, - }, - }, - in: configapi.PluginRepository{ - GCPPluginRepository: &configapi.GCPPluginRepository{ - Name: "test", - BucketName: "bucket", - RootPath: "root-path", - }, - }, - out: configapi.PluginRepository{ - GCPPluginRepository: &configapi.GCPPluginRepository{ - Name: "test", - BucketName: "bucket", - RootPath: "root-path", - }, - }, - }, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - err := StoreClientConfig(tc.cfg) - assert.NoError(t, err) - err = SetCLIRepository(tc.in) - assert.NoError(t, err) - r, err := GetCLIRepository(tc.out.GCPPluginRepository.Name) - assert.NoError(t, err) - assert.Equal(t, tc.out.GCPPluginRepository.Name, r.GCPPluginRepository.Name) - }) - } -} diff --git a/cli/runtime/config/clientconfig_factory.go b/cli/runtime/config/clientconfig_factory.go deleted file mode 100644 index 5ed74fa32d..0000000000 --- a/cli/runtime/config/clientconfig_factory.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Skip duplicate that matching with metadata config file - -// Package config Provide API methods to Read/Write specific stanza of config file -// -//nolint:dupl -package config - -import ( - "os" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -// getClientConfigNode retrieves the multi config from the local directory with file lock -func getClientConfigNode() (*yaml.Node, error) { - useUnifiedConfig, err := UseUnifiedConfig() - if err != nil { - useUnifiedConfig = false - } - - if useUnifiedConfig { - return getClientConfigNextGenNode() - } - return getMultiConfig() -} - -// getClientConfigNodeNoLock retrieves the multi config from the local directory without acquiring the lock -func getClientConfigNodeNoLock() (*yaml.Node, error) { - // Check config migration feature flag - useUnifiedConfig, err := UseUnifiedConfig() - if err != nil { - useUnifiedConfig = false - } - - if useUnifiedConfig { - return getClientConfigNextGenNodeNoLock() - } - return getMultiConfigNoLock() -} - -// getClientConfig retrieves the config from the local directory with file lock -func getClientConfig() (*yaml.Node, error) { - // Acquire tanzu config lock - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - return getClientConfigNoLock() -} - -// getClientConfigNoLock retrieves the config from the local directory without acquiring the lock -func getClientConfigNoLock() (*yaml.Node, error) { - cfgPath, err := ClientConfigPath() - if err != nil { - return nil, errors.Wrap(err, "getClientConfigNodeNoLock: failed getting client config path") - } - bytes, err := os.ReadFile(cfgPath) - if err != nil || len(bytes) == 0 { - node, err := newClientConfigNode() - if err != nil { - return nil, errors.Wrap(err, "failed to create new client config") - } - return node, nil - } - var node yaml.Node - err = yaml.Unmarshal(bytes, &node) - if err != nil { - return nil, errors.Wrap(err, "getClientConfigNodeNoLock: failed to construct struct from config data") - } - node.Content[0].Style = 0 - return &node, nil -} - -// newClientConfigNode create and return new client config node -func newClientConfigNode() (*yaml.Node, error) { - c := &configapi.ClientConfig{} - node, err := convertClientConfigToNode(c) - node.Content[0].Style = 0 - if err != nil { - return nil, err - } - return node, nil -} - -// persistClientConfig write to config.yaml -func persistClientConfig(node *yaml.Node) error { - path, err := ClientConfigPath() - if err != nil { - return errors.Wrap(err, "could not find config path") - } - return persistNode(node, WithCfgPath(path)) -} diff --git a/cli/runtime/config/clientconfig_factory_test.go b/cli/runtime/config/clientconfig_factory_test.go deleted file mode 100644 index 0bc77d7339..0000000000 --- a/cli/runtime/config/clientconfig_factory_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "context" - "fmt" - "testing" - - "github.com/stretchr/testify/assert" - - "golang.org/x/sync/errgroup" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestClientConfigNodeUpdateInParallel(t *testing.T) { - addServer := func(mcName string) error { - _, err := getClientConfigNode() - if err != nil { - return err - } - - s := &configapi.Server{ - Name: mcName, - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Context: "fake-context", - Path: "fake-path", - }, - } - err = SetServer(s, true) - if err != nil { - return err - } - _, err = getClientConfigNode() - return err - } - // Run the parallel tests of reading and updating the configuration file - // multiple times to make sure all the attempts are successful - for testCounter := 1; testCounter <= 5; testCounter++ { - func() { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - // run addServer in parallel - parallelExecutionCounter := 100 - group, _ := errgroup.WithContext(context.Background()) - for i := 1; i <= parallelExecutionCounter; i++ { - id := i - group.Go(func() error { - return addServer(fmt.Sprintf("mc-%v", id)) - }) - } - _ = group.Wait() - // Make sure that the configuration file is not corrupted - node, err := getClientConfigNode() - assert.Nil(t, err) - // Make sure all expected servers are added to the knownServers list - assert.Equal(t, parallelExecutionCounter, len(node.Content[0].Content[5].Content)) - }() - } -} diff --git a/cli/runtime/config/clientconfig_filesystem.go b/cli/runtime/config/clientconfig_filesystem.go deleted file mode 100644 index beaa3e415d..0000000000 --- a/cli/runtime/config/clientconfig_filesystem.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "path/filepath" -) - -const ( - // EnvConfigKey is the environment variable that points to a tanzu config. - EnvConfigKey = "TANZU_CONFIG" - - // ConfigName is the name of the config - ConfigName = "config.yaml" -) - -// ClientConfigPath returns the tanzu config path, checking for environment overrides. -func ClientConfigPath() (path string, err error) { - return configPath(LocalDir) -} - -// configPath constructs the full config path, checking for environment overrides. -func configPath(localDirGetter func() (string, error)) (path string, err error) { - localDir, err := localDirGetter() - if err != nil { - return path, err - } - var ok bool - path, ok = os.LookupEnv(EnvConfigKey) - if !ok { - path = filepath.Join(localDir, ConfigName) - return - } - return -} diff --git a/cli/runtime/config/clientconfig_test.go b/cli/runtime/config/clientconfig_test.go deleted file mode 100644 index 463080a154..0000000000 --- a/cli/runtime/config/clientconfig_test.go +++ /dev/null @@ -1,371 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "context" - "fmt" - "os" - "testing" - - "github.com/google/go-cmp/cmp" - "github.com/google/uuid" - "github.com/stretchr/testify/require" - "github.com/tj/assert" - "golang.org/x/sync/errgroup" - - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func cleanupDir(dir string) { - p, _ := localDirPath(dir) - _ = os.RemoveAll(p) -} - -func randString() string { - return uuid.NewString()[:5] -} - -func TestClientConfig(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - server0 := &configapi.Server{ - Name: "test", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Path: "test", - }, - } - testCtx := &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - server0, - }, - CurrentServer: "test", - } - AcquireTanzuConfigLock() - err := StoreClientConfig(testCtx) - require.NoError(t, err) - ReleaseTanzuConfigLock() - _, err = GetClientConfig() - require.NoError(t, err) - s, err := GetServer("test") - require.NoError(t, err) - require.Equal(t, s, server0) - e, err := ServerExists("test") - require.NoError(t, err) - require.True(t, e) - server1 := &configapi.Server{ - Name: "test1", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Path: "test1", - }, - } - err = SetServer(server1, true) - require.NoError(t, err) - c, err := GetClientConfig() - require.NoError(t, err) - require.Len(t, c.KnownServers, 2) - require.Equal(t, c.CurrentServer, "test1") - err = SetCurrentServer("test") - require.NoError(t, err) - c, err = GetClientConfig() - require.NoError(t, err) - require.Len(t, c.KnownServers, 2) - require.Equal(t, "test", c.CurrentServer) - err = RemoveServer("test") - require.NoError(t, err) - c, err = GetClientConfig() - require.NoError(t, err) - require.Len(t, c.KnownServers, 1) - require.Equal(t, "", c.CurrentServer) - err = SetServer(server1, true) - require.NoError(t, err) - c, err = GetClientConfig() - require.NoError(t, err) - require.Len(t, c.KnownServers, 1) - err = RemoveServer("test1") - require.NoError(t, err) - c, err = GetClientConfig() - require.NoError(t, err) - require.Len(t, c.KnownServers, 0) - require.Equal(t, c.CurrentServer, "") -} - -func TestConfigLegacyDirWithEnvConfigKey(t *testing.T) { - r := randString() - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - // Setup legacy config dir. - legacyLocalDirName = fmt.Sprintf(".tanzu-test-legacy-%s", r) - legacyLocalDir, err := legacyLocalDir() - require.NoError(t, err) - err = os.MkdirAll(legacyLocalDir, 0755) - require.NoError(t, err) - legacyCfgPath, err := legacyConfigPath() - require.NoError(t, err) - defer cleanupDir(legacyLocalDirName) - - //Setup data - testCfg := &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - { - Name: "test", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Path: "test", - }, - }, - }, - CurrentServer: "test", - } - - AcquireTanzuConfigLock() - err = StoreClientConfig(testCfg) - ReleaseTanzuConfigLock() - require.NoError(t, err) - require.FileExists(t, legacyCfgPath) - - _, err = GetClientConfig() - require.NoError(t, err) - server1 := &configapi.Server{ - Name: "test1", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Path: "test1", - }, - } - - err = SetServer(server1, true) - require.NoError(t, err) - - c, err := GetClientConfig() - require.NoError(t, err) - require.Len(t, c.KnownServers, 2) - require.Equal(t, c.CurrentServer, "test1") - - err = RemoveServer("test") - require.NoError(t, err) - - c, err = GetClientConfig() - require.NoError(t, err) - require.Len(t, c.KnownServers, 1) - - tmp := LocalDirName - LocalDirName = legacyLocalDirName - configCopy, err := GetClientConfig() - require.NoError(t, err) - if diff := cmp.Diff(c, configCopy); diff != "" { - t.Errorf("ClientConfig object mismatch between legacy and new config location (-want +got): \n%s", diff) - } - LocalDirName = tmp -} - -func TestConfigLegacyDirWithoutEnvConfigKey(t *testing.T) { - r := randString() - - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - func() { - LocalDirName = TestLocalDirName - }() - defer func() { - cleanupDir(LocalDirName) - }() - - // Setup legacy config dir. - legacyLocalDirName = fmt.Sprintf(".tanzu-test-legacy-%s", r) - legacyLocalDir, err := legacyLocalDir() - require.NoError(t, err) - err = os.MkdirAll(legacyLocalDir, 0755) - require.NoError(t, err) - legacyCfgPath, err := legacyConfigPath() - require.NoError(t, err) - defer cleanupDir(legacyLocalDirName) - - //Setup data - testCfg := &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - { - Name: "test", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Path: "test", - }, - }, - }, - CurrentServer: "test", - } - - AcquireTanzuConfigLock() - err = StoreClientConfig(testCfg) - ReleaseTanzuConfigLock() - require.NoError(t, err) - require.FileExists(t, legacyCfgPath) - - _, err = GetClientConfig() - require.NoError(t, err) - server1 := &configapi.Server{ - Name: "test1", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Path: "test1", - }, - } - - err = SetServer(server1, true) - require.NoError(t, err) - - c, err := GetClientConfig() - require.NoError(t, err) - require.Len(t, c.KnownServers, 2) - require.Equal(t, c.CurrentServer, "test1") - - err = RemoveServer("test") - require.NoError(t, err) - - c, err = GetClientConfig() - require.NoError(t, err) - require.Len(t, c.KnownServers, 1) - - tmp := LocalDirName - LocalDirName = legacyLocalDirName - configCopy, err := GetClientConfig() - require.NoError(t, err) - if diff := cmp.Diff(c, configCopy); diff != "" { - t.Errorf("ClientConfig object mismatch between legacy and new config location (-want +got): \n%s", diff) - } - LocalDirName = tmp -} - -func TestClientConfigUpdateInParallel(t *testing.T) { - addServer := func(mcName string) error { - _, err := GetClientConfig() - if err != nil { - return err - } - s := &configapi.Server{ - Name: mcName, - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Context: "fake-context", - Path: "fake-path", - }, - } - err = SetServer(s, true) - if err != nil { - return err - } - _, err = GetClientConfig() - return err - } - // Creates temp configuration file and runs addServer in parallel - runTestInParallel := func() { - // Setup config test data - cfgTestFiles, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - // run addServer in parallel - parallelExecutionCounter := 100 - group, _ := errgroup.WithContext(context.Background()) - for i := 1; i <= parallelExecutionCounter; i++ { - id := i - group.Go(func() error { - return addServer(fmt.Sprintf("mc-%v", id)) - }) - } - err := group.Wait() - rawContents, readErr := os.ReadFile(cfgTestFiles[0].Name()) - assert.Nil(t, readErr, "Error reading config: %s", readErr) - assert.Nil(t, err, "Config file contents: \n%s", rawContents) - // Make sure that the configuration file is not corrupted - clientconfig, err := GetClientConfig() - assert.Nil(t, err) - // Make sure all expected servers are added to the knownServers list - assert.Equal(t, parallelExecutionCounter, len(clientconfig.KnownServers)) - } - // Run the parallel tests of reading and updating the configuration file - // multiple times to make sure all the attempts are successful - for testCounter := 1; testCounter <= 5; testCounter++ { - runTestInParallel() - } -} - -func TestEndpointFromContext(t *testing.T) { - tcs := []struct { - name string - ctx *configapi.Context - endpoint string - errStr string - }{ - { - name: "success k8s", - ctx: &configapi.Context{ - Name: "test-mc", - Target: cliv1alpha1.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - }, - { - name: "success tmc current", - ctx: &configapi.Context{ - Name: "test-tmc", - Target: cliv1alpha1.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - { - name: "failure", - ctx: &configapi.Context{ - Name: "test-dummy", - Target: "dummy", - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - errStr: "unknown server type \"dummy\"", - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - endpoint, err := EndpointFromContext(tc.ctx) - if tc.errStr == "" { - assert.NoError(t, err) - assert.Equal(t, "test-endpoint", endpoint) - } else { - assert.EqualError(t, err, tc.errStr) - } - }) - } -} diff --git a/cli/runtime/config/clientconfig_typemeta.go b/cli/runtime/config/clientconfig_typemeta.go deleted file mode 100644 index c15ef6516f..0000000000 --- a/cli/runtime/config/clientconfig_typemeta.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" - - "gopkg.in/yaml.v3" -) - -func setKind(node *yaml.Node, kind string) (persist bool, err error) { - return setScalarNode(node, KeyKind, kind) -} - -func setAPIVersion(node *yaml.Node, apiVersion string) (persist bool, err error) { - return setScalarNode(node, KeyAPIVersion, apiVersion) -} - -// setScalarNode adds or updated scalar node value in yaml node -func setScalarNode(node *yaml.Node, key, value string) (persist bool, err error) { - keys := []nodeutils.Key{ - {Name: key, Type: yaml.ScalarNode, Value: ""}, - } - targetNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if targetNode == nil { - return persist, nodeutils.ErrNodeNotFound - } - if targetNode.Value != value { - targetNode.Value = value - persist = true - } - return persist, err -} diff --git a/cli/runtime/config/clientconfignextgen_factory.go b/cli/runtime/config/clientconfignextgen_factory.go deleted file mode 100644 index e895dcae01..0000000000 --- a/cli/runtime/config/clientconfignextgen_factory.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Skip duplicate that matching with metadata config file - -// Package config Provide API methods to Read/Write specific stanza of config file -// -//nolint:dupl -package config - -import ( - "os" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" -) - -// getClientConfigNextGenNode retrieves the config from the local directory with file lock -func getClientConfigNextGenNode() (*yaml.Node, error) { - // Acquire tanzu config v2 lock - AcquireTanzuConfigNextGenLock() - defer ReleaseTanzuConfigNextGenLock() - return getClientConfigNextGenNodeNoLock() -} - -// getClientConfigNextGenNodeNoLock retrieves the config from the local directory without acquiring the lock -func getClientConfigNextGenNodeNoLock() (*yaml.Node, error) { - cfgPath, err := ClientConfigNextGenPath() - if err != nil { - return nil, errors.Wrap(err, "failed getting client config path") - } - bytes, err := os.ReadFile(cfgPath) - if err != nil || len(bytes) == 0 { - node, err := newClientConfigNode() - if err != nil { - return nil, errors.Wrap(err, "failed to create new client config ng") - } - return node, nil - } - var node yaml.Node - err = yaml.Unmarshal(bytes, &node) - if err != nil { - return nil, errors.Wrap(err, "failed to construct struct from config ng data") - } - node.Content[0].Style = 0 - return &node, nil -} - -func persistClientConfigNextGen(node *yaml.Node) error { - path, err := ClientConfigNextGenPath() - if err != nil { - return errors.Wrap(err, "could not find config ng path") - } - return persistNode(node, WithCfgPath(path)) -} diff --git a/cli/runtime/config/clientconfignextgen_factory_test.go b/cli/runtime/config/clientconfignextgen_factory_test.go deleted file mode 100644 index a06e27715d..0000000000 --- a/cli/runtime/config/clientconfignextgen_factory_test.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "context" - "fmt" - "testing" - - "github.com/stretchr/testify/assert" - "golang.org/x/sync/errgroup" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestGetClientConfigNextGenNode(t *testing.T) { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - //Action - node, err := getClientConfigNextGenNode() - - //Assertions - assert.NoError(t, err) - c := &configapi.ClientConfig{} - expectedNode, err := convertClientConfigToNode(c) - expectedNode.Content[0].Style = 0 - assert.NoError(t, err) - assert.Equal(t, expectedNode, node) -} - -func TestClientConfigNextGenNodeUpdateInParallel(t *testing.T) { - addContext := func(mcName string) error { - _, err := getClientConfigNextGenNode() - if err != nil { - return err - } - - ctx := &configapi.Context{ - Name: mcName, - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - err = SetContext(ctx, true) - if err != nil { - return err - } - _, err = getClientConfigNextGenNode() - return err - } - // Run the parallel tests of reading and updating the configuration file - // multiple times to make sure all the attempts are successful - for testCounter := 1; testCounter <= 1; testCounter++ { - func() { - // Setup config test data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - // run addContext in parallel - parallelExecutionCounter := 100 - group, _ := errgroup.WithContext(context.Background()) - for i := 1; i <= parallelExecutionCounter; i++ { - id := i - group.Go(func() error { - return addContext(fmt.Sprintf("mc-%v", id)) - }) - } - _ = group.Wait() - // Make sure that the configuration file is not corrupted - node, err := getClientConfigNextGenNode() - assert.Nil(t, err) - // Make sure all expected servers are added to the knownServers list - assert.Equal(t, parallelExecutionCounter, len(node.Content[0].Content[1].Content)) - }() - } -} diff --git a/cli/runtime/config/clientconfignextgen_filesystem.go b/cli/runtime/config/clientconfignextgen_filesystem.go deleted file mode 100644 index d2b4c99cab..0000000000 --- a/cli/runtime/config/clientconfignextgen_filesystem.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "path/filepath" -) - -const ( - // EnvConfigNextGenKey is the environment variable that points to a tanzu config. - EnvConfigNextGenKey = "TANZU_CONFIG_NEXT_GEN" - - // CfgNextGenName is the name of the config metadata - CfgNextGenName = "config-ng.yaml" -) - -// clientConfigNextGenPath constructs the full config path, checking for environment overrides. -func clientConfigNextGenPath(localDirGetter func() (string, error)) (path string, err error) { - localDir, err := localDirGetter() - if err != nil { - return path, err - } - var ok bool - path, ok = os.LookupEnv(EnvConfigNextGenKey) - if !ok { - path = filepath.Join(localDir, CfgNextGenName) - return - } - return -} - -// ClientConfigNextGenPath retrieved config-alt file path -func ClientConfigNextGenPath() (path string, err error) { - return clientConfigNextGenPath(LocalDir) -} diff --git a/cli/runtime/config/clientconfignextgen_lock.go b/cli/runtime/config/clientconfignextgen_lock.go deleted file mode 100644 index e9eb6ddf63..0000000000 --- a/cli/runtime/config/clientconfignextgen_lock.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//nolint:dupl -package config - -import ( - "fmt" - "path/filepath" - "sync" - "time" - - "github.com/juju/fslock" -) - -const ( - LocalTanzuConfigNextGenFileLock = ".tanzu-config-ng.lock" - // DefaultConfigNextGenLockTimeout is the default time waiting on the filelock - DefaultConfigNextGenLockTimeout = 10 * time.Minute -) - -var cfgNextGenLockFile string - -// cfgNextGenLock used as a static lock variable that stores fslock -// This is used for interprocess locking of the config file -var cfgNextGenLock *fslock.Lock - -// cfgNextGenMutex is used to handle the locking behavior between concurrent calls -// within the existing process trying to acquire the lock -var cfgNextGenMutex sync.Mutex - -// AcquireTanzuConfigNextGenLock tries to acquire lock to update tanzu config file with timeout -func AcquireTanzuConfigNextGenLock() { - var err error - - if cfgNextGenLockFile == "" { - path, err := ClientConfigNextGenPath() - if err != nil { - panic(fmt.Sprintf("cannot get config path while acquiring lock on tanzu config file, reason: %v", err)) - } - cfgNextGenLockFile = filepath.Join(filepath.Dir(path), LocalTanzuConfigNextGenFileLock) - } - - // using fslock to handle interprocess locking - lock, err := getFileLockWithTimeOut(cfgNextGenLockFile, DefaultConfigNextGenLockTimeout) - if err != nil { - panic(fmt.Sprintf("cannot acquire lock for tanzu config file, reason: %v", err)) - } - - // Lock the mutex to prevent concurrent calls to acquire and configure the tanzuConfigLock - cfgNextGenMutex.Lock() - cfgNextGenLock = lock -} - -// ReleaseTanzuConfigNextGenLock releases the lock if the tanzuConfigLock was acquired -func ReleaseTanzuConfigNextGenLock() { - if cfgNextGenLock == nil { - return - } - if errUnlock := cfgNextGenLock.Unlock(); errUnlock != nil { - panic(fmt.Sprintf("cannot release lock for tanzu config file, reason: %v", errUnlock)) - } - - cfgNextGenLock = nil - // Unlock the mutex to allow other concurrent calls to acquire and configure the tanzuConfigLock - cfgNextGenMutex.Unlock() -} diff --git a/cli/runtime/config/collectionutils/arrayutils.go b/cli/runtime/config/collectionutils/arrayutils.go deleted file mode 100644 index a60a9af921..0000000000 --- a/cli/runtime/config/collectionutils/arrayutils.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package collectionutils provide helper functions to operate on collections like array, map -package collectionutils - -// SomeBool method tests whether at least one element in the array passes the test implemented by the provided function. It returns true if, in the array, it finds an element for which the provided function returns true; otherwise it returns false. It doesn't modify the array. -func SomeBool(arr []bool, condition func(t bool) bool) bool { - for _, val := range arr { - if condition(val) { - return true - } - } - return false -} - -// Contains checks if a string is present in a slice -func Contains(s []string, str string) bool { - for _, v := range s { - if v == str { - return true - } - } - - return false -} diff --git a/cli/runtime/config/collectionutils/arrayutils_test.go b/cli/runtime/config/collectionutils/arrayutils_test.go deleted file mode 100644 index dbc1c82f9a..0000000000 --- a/cli/runtime/config/collectionutils/arrayutils_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package collectionutils - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestSomeWithBoolType(t *testing.T) { - boolTests := []struct { - name string - input []bool - condition func(b bool) bool - out bool - }{ - { - name: "should return true", - input: []bool{true, false, false, false}, - condition: func(b bool) bool { - return b - }, - out: true, - }, - { - name: "should return true", - input: []bool{false, false, false, false}, - condition: func(b bool) bool { - return b - }, - out: false, - }, - } - - for _, tc := range boolTests { - t.Run(tc.name, func(t *testing.T) { - ans := SomeBool(tc.input, tc.condition) - assert.Equal(t, ans, tc.out) - }) - } -} diff --git a/cli/runtime/config/config_factory.go b/cli/runtime/config/config_factory.go deleted file mode 100644 index 83ef9ffc6b..0000000000 --- a/cli/runtime/config/config_factory.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package config Provide API methods to Read/Write specific stanza of config file -package config - -import ( - "os" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/collectionutils" - - "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" -) - -// LegacyConfigNodeKeys config nodes that goes to config.yaml -var LegacyConfigNodeKeys = []string{ - KeyAPIVersion, - KeyKind, - KeyMetadata, - KeyClientOptions, - KeyServers, - KeyCurrentServer, -} - -var DiscardedConfigNodeKeys = []string{ - KeyContexts, - KeyCurrentContext, -} - -// getMultiConfig retrieves combined config.yaml and config-ng.yaml -func getMultiConfig() (*yaml.Node, error) { - cfgNode, err := getClientConfig() - if err != nil { - return cfgNode, err - } - - cfgNextGenNode, err := getClientConfigNextGenNode() - if err != nil { - return cfgNextGenNode, err - } - - return makeMultiFileCfg(cfgNode, cfgNextGenNode) -} - -// getMultiConfigNoLock retrieves combined config.yaml and config-ng.yaml -func getMultiConfigNoLock() (*yaml.Node, error) { - cfgNode, err := getClientConfigNoLock() - if err != nil { - return cfgNode, err - } - - cfgNextGenNode, err := getClientConfigNextGenNodeNoLock() - if err != nil { - return cfgNextGenNode, err - } - - return makeMultiFileCfg(cfgNode, cfgNextGenNode) -} - -// Construct multi file node from config.yaml and config-ng.yaml nodes -func makeMultiFileCfg(cfgNode, cfgNextGenNode *yaml.Node) (*yaml.Node, error) { - // Create a root config document node - rootCfgNode, err := newClientConfigNode() - if err != nil { - return nil, errors.Wrap(err, "failed to create new client config node") - } - - // Loop through each config items and construct the root config node - for _, cfgItem := range LegacyConfigNodeKeys { - // Find the cfg item node from the config.yaml - cfgNodeIndex := nodeutils.GetNodeIndex(cfgNode.Content[0].Content, cfgItem) - if cfgNodeIndex == -1 { - continue - } - // Add matching key node and value node from config.yaml to root cfg node - rootCfgNode.Content[0].Content = append(rootCfgNode.Content[0].Content, cfgNode.Content[0].Content[cfgNodeIndex-1:cfgNodeIndex+1]...) - } - - // Append the config-ng.yaml nodes to root config node - rootCfgNode.Content[0].Content = append(rootCfgNode.Content[0].Content, cfgNextGenNode.Content[0].Content...) - - // return the construct root node that contains both config.yaml with cfgItems and all of config-ng.yaml - return rootCfgNode, nil -} - -// persistConfig write the updated node data to config.yaml and config-ng.yaml based on cfgItems -func persistConfig(node *yaml.Node) error { - // check to persist multi file or to config-ng yaml - useUnifiedConfig, err := UseUnifiedConfig() - if err != nil { - useUnifiedConfig = false - } - - // If useUnifiedConfig is set to true write to config-ng.yaml - if useUnifiedConfig { - return persistClientConfigNextGen(node) - } - - // config node from config.yaml - cfgNode, err := getClientConfigNoLock() - if err != nil { - return err - } - - // config next gen node from config-ng.yaml - cfgNextGenNode, err := getClientConfigNextGenNodeNoLock() - if err != nil { - return err - } - - // for each of the change node update the respective node in cfg and cfg-ng - for index, changeNode := range node.Content[0].Content { - if index%2 == 0 { - // If contains then add or update the config.yaml - if collectionutils.Contains(LegacyConfigNodeKeys, changeNode.Value) { - // update in config-yaml - currentChangeNodeIndex := nodeutils.GetNodeIndex(cfgNode.Content[0].Content, changeNode.Value) - if currentChangeNodeIndex != -1 { - // update the existing node value - updated := node.Content[0].Content[index+1] - cfgNode.Content[0].Content[currentChangeNodeIndex] = updated - } else { - // append the new node key and value - cfgNode.Content[0].Content = append(cfgNode.Content[0].Content, node.Content[0].Content[index:index+2]...) - } - // If it doesn't contain then add or update the config-ng.yaml - } else { - // update in config-ng yaml - currentChangeNextGenNodeIndex := nodeutils.GetNodeIndex(cfgNextGenNode.Content[0].Content, changeNode.Value) - if currentChangeNextGenNodeIndex != -1 { - // update the existing vaalue - updated := node.Content[0].Content[index+1] - cfgNextGenNode.Content[0].Content[currentChangeNextGenNodeIndex] = updated - } else { - // append the new node key and value - cfgNextGenNode.Content[0].Content = append(cfgNextGenNode.Content[0].Content, node.Content[0].Content[index:index+2]...) - } - } - } - } - - // Discard nodes from config.yaml - for _, discardedCfgNodeKey := range DiscardedConfigNodeKeys { - // Discard node from config.yaml - legacyDiscardedContextsNodeIndex := nodeutils.GetNodeIndex(cfgNode.Content[0].Content, discardedCfgNodeKey) - if legacyDiscardedContextsNodeIndex != -1 { - // remove discarded node - cfgNode.Content[0].Content = append(cfgNode.Content[0].Content[:legacyDiscardedContextsNodeIndex-1], cfgNode.Content[0].Content[legacyDiscardedContextsNodeIndex+1:]...) - } - } - - // Store the non nextGenItem config data to config.yaml - err = persistClientConfig(cfgNode) - if err != nil { - return err - } - - // Store the nextGenItem config data to config-ng.yaml - err = persistClientConfigNextGen(cfgNextGenNode) - if err != nil { - return err - } - - // Store the config data to legacy client config file/location - err = persistLegacyClientConfig(cfgNode) - if err != nil { - return err - } - - return nil -} - -// persistNode stores/writes the yaml node to config path specified in CfgOpts -func persistNode(node *yaml.Node, opts ...CfgOpts) error { - configurations := &CfgOptions{} - for _, opt := range opts { - opt(configurations) - } - cfgPathExists, err := fileExists(configurations.CfgPath) - if err != nil { - return errors.Wrap(err, "failed to check config path existence") - } - if !cfgPathExists { - localDir, err := LocalDir() - if err != nil { - return errors.Wrap(err, "could not find local tanzu dir for OS") - } - if err := os.MkdirAll(localDir, 0755); err != nil { - return errors.Wrap(err, "could not make local tanzu directory") - } - } - data, err := yaml.Marshal(node) - if err != nil { - return errors.Wrap(err, "failed to marshal nodeutils") - } - err = os.WriteFile(configurations.CfgPath, data, 0644) - if err != nil { - return errors.Wrap(err, "failed to write the config to file") - } - return nil -} diff --git a/cli/runtime/config/config_factory_test.go b/cli/runtime/config/config_factory_test.go deleted file mode 100644 index 1ef6d257eb..0000000000 --- a/cli/runtime/config/config_factory_test.go +++ /dev/null @@ -1,1221 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func setupCfgAndCfgNextGenData() (string, string, string, string) { - cfg := `apiVersion: config.tanzu.vmware.com/v1alpha1 -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -kind: ClientConfig -metadata: - creationTimestamp: null -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: test-endpoint - path: test-path - context: test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc -current: test-mc -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -#extraneous fields/comments are preserved on file update -extrafield: - extrasubfiled: 1 -` - expectedCfg := `apiVersion: config.tanzu.vmware.com/v1alpha1 -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -kind: ClientConfig -metadata: - creationTimestamp: null -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: test-endpoint - path: test-path - context: test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc -current: test-mc -#extraneous fields/comments are preserved on file update -extrafield: - extrasubfiled: 1 -` - - cfgNextGen := ` -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -` - expectedCfgNextGen := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -` - - return cfg, cfgNextGen, expectedCfg, expectedCfgNextGen -} - -func TestGetClientConfigWithLockAndWithoutLock(t *testing.T) { - // Setup config test data - cfg, cfgNextGen, _, _ := setupCfgAndCfgNextGenData() - _, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfgNextGen}) - - defer func() { - cleanUp() - }() - - //Actions - nodeWithLock, err := getClientConfigNode() - assert.NoError(t, err) - //Actions - nodeWithoutLocK, err := getClientConfigNodeNoLock() - assert.NoError(t, err) - - nodes := []*yaml.Node{nodeWithLock, nodeWithoutLocK} - for _, node := range nodes { - // Assertions - assert.NotNil(t, node) - assert.NoError(t, err) - - expectedCtx := &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test-two", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - ctx, err := getContext(node, "test-mc") - assert.NoError(t, err) - assert.Equal(t, expectedCtx, ctx) - - expectedServer := &configapi.Server{ - Name: "test-mc", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - server, err := getServer(node, "test-mc") - assert.NoError(t, err) - assert.Equal(t, expectedServer, server) - } -} - -func TestGetClientConfigWithLockAndMigratedToNewConfig(t *testing.T) { - // Setup config test data - cfg, cfgNextGen, _, _ := setupCfgAndCfgNextGenData() - _, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfgNextGen, cfgMetadata: setupConfigMetadataWithMigrateToNewConfig()}) - - defer func() { - cleanUp() - }() - - //Actions - node, err := getClientConfigNode() - - // Assertions - assert.NotNil(t, node) - assert.NoError(t, err) - - expectedCtx := &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test-two", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - // Migrated To new config hence servers are not in the config-ng.yaml yet. - ctx, err := getContext(node, "test-mc") - assert.NoError(t, err) - assert.Equal(t, expectedCtx, ctx) - - _, err = getServer(node, "test-mc") - assert.Equal(t, "could not find server \"test-mc\"", err.Error()) -} - -func TestGetClientConfigWithoutLockAndMigratedToNewConfig(t *testing.T) { - // Setup config test data - cfg, cfgNextGen, _, _ := setupCfgAndCfgNextGenData() - _, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfgNextGen, cfgMetadata: setupConfigMetadataWithMigrateToNewConfig()}) - - defer func() { - cleanUp() - }() - - //Actions - AcquireTanzuConfigNextGenLock() - node, err := getClientConfigNodeNoLock() - ReleaseTanzuConfigNextGenLock() - - // Assertions - assert.NotNil(t, node) - assert.NoError(t, err) - - expectedCtx := &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test-two", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - // Migrated To new config hence servers are not in the config-ng.yaml yet. - ctx, err := getContext(node, "test-mc") - assert.NoError(t, err) - assert.Equal(t, expectedCtx, ctx) - - _, err = getServer(node, "test-mc") - assert.Equal(t, "could not find server \"test-mc\"", err.Error()) -} - -func TestPersistConfig(t *testing.T) { - // Setup config test data - cfg, cfgNextGen, expectedCfg, expectedCfgNextGen := setupCfgAndCfgNextGenData() - cfgTestFiles, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfgNextGen}) - - defer func() { - cleanUp() - }() - - // Actions - node, err := getClientConfigNode() - assert.NotNil(t, node) - assert.NoError(t, err) - - err = persistConfig(node) - assert.NoError(t, err) - - cfgFileData, err := os.ReadFile(cfgTestFiles[0].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg, string(cfgFileData)) - - cfgNextGenFileData, err := os.ReadFile(cfgTestFiles[1].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfgNextGen, string(cfgNextGenFileData)) -} - -func TestPersistConfigWithMigrateToNewConfig(t *testing.T) { - // Setup data - cfg, cfgNextGen, _, _ := setupCfgAndCfgNextGenData() - expected := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -` - - cfgTestFiles, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfgNextGen, cfgMetadata: setupConfigMetadataWithMigrateToNewConfig()}) - - defer func() { - cleanUp() - }() - - // Actions - node, err := getClientConfigNode() - assert.NotNil(t, node) - assert.NoError(t, err) - - err = persistConfig(node) - assert.NoError(t, err) - - cfgFileData, err := os.ReadFile(cfgTestFiles[0].Name()) - assert.NoError(t, err) - assert.Equal(t, cfg, string(cfgFileData)) - - cfgNextGenFileData, err := os.ReadFile(cfgTestFiles[1].Name()) - assert.NoError(t, err) - assert.Equal(t, expected, string(cfgNextGenFileData)) -} - -func TestMultiConfig(t *testing.T) { - tests := []struct { - name string - cfg string - cfg2 string - output string - }{ - { - name: "success concat src into empty dst node", - cfg: `apiVersion: config.tanzu.vmware.com/v1alpha1 -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: cfg-test-endpoint - path: cfg-test-path - context: cfg-test-context - discoverySources: - - gcp: - name: test - bucket: cfg-test-bucket - manifestPath: cfg-test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: cfg-test-bucket - manifestPath: cfg-test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -kind: ClientConfig -metadata: - creationTimestamp: null`, - cfg2: ``, - output: `apiVersion: config.tanzu.vmware.com/v1alpha1 -kind: ClientConfig -metadata: - creationTimestamp: null -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -`, - }, - { - name: "success concat src into dst node if contexts and currentContexts already present in cfg2 no override", - cfg: `apiVersion: config.tanzu.vmware.com/v1alpha1 -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: cfg-test-endpoint - path: cfg-test-path - context: cfg-test-context - discoverySources: - - gcp: - name: test - bucket: cfg-test-bucket - manifestPath: cfg-test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: cfg-test-bucket - manifestPath: cfg-test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -kind: ClientConfig -metadata: - creationTimestamp: null`, - cfg2: ` -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: cfg2-test-endpoint - path: cfg2-test-path - context: cfg2-test-context - discoverySources: - - gcp: - name: test - bucket: cfg2-test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc`, - output: `apiVersion: config.tanzu.vmware.com/v1alpha1 -kind: ClientConfig -metadata: - creationTimestamp: null -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: cfg2-test-endpoint - path: cfg2-test-path - context: cfg2-test-context - discoverySources: - - gcp: - name: test - bucket: cfg2-test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -`, - }, - { - name: "success concat src into dst node with difference currentContext", - cfg: `apiVersion: config.tanzu.vmware.com/v1alpha1 -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: cfg-test-endpoint - path: cfg-test-path - context: cfg-test-context - discoverySources: - - gcp: - name: test - bucket: cfg-test-bucket - manifestPath: cfg-test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: cfg-test-bucket - manifestPath: cfg-test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -kind: ClientConfig -metadata: - creationTimestamp: null`, - cfg2: ` -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: cfg2-test-endpoint - path: cfg2-test-path - context: cfg2-test-context - discoverySources: - - gcp: - name: test - bucket: cfg2-test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - mission-control: test-tmc`, - output: `apiVersion: config.tanzu.vmware.com/v1alpha1 -kind: ClientConfig -metadata: - creationTimestamp: null -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: cfg2-test-endpoint - path: cfg2-test-path - context: cfg2-test-context - discoverySources: - - gcp: - name: test - bucket: cfg2-test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - mission-control: test-tmc -`, - }, - { - name: "success concat src into dst node with empty contexts and currentContexts", - cfg: `apiVersion: config.tanzu.vmware.com/v1alpha1 -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: cfg-test-endpoint - path: cfg-test-path - context: cfg-test-context - discoverySources: - - gcp: - name: test - bucket: cfg-test-bucket - manifestPath: cfg-test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: cfg-test-bucket - manifestPath: cfg-test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -kind: ClientConfig -metadata: - creationTimestamp: null`, - cfg2: ` -contexts: [] -currentContext: {}`, - output: `apiVersion: config.tanzu.vmware.com/v1alpha1 -kind: ClientConfig -metadata: - creationTimestamp: null -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -contexts: [] -currentContext: {} -`, - }, - { - name: "success concat scalar nodes with no entry in cfg2", - cfg: `current: test-server -`, - cfg2: ` -contexts: [] -currentContext: {}`, - output: `current: test-server -contexts: [] -currentContext: {} -`, - }, - { - name: "success concat scalar nodes with empty entry in cfg2", - cfg: `currentContext: test-ctx -`, - cfg2: `contexts: [] -currentContext: {} -`, - output: `contexts: [] -currentContext: {} -`, - }, - { - name: "success concat scalar nodes with empty entry in cfg2", - cfg: `apiVersion: config.tanzu.vmware.com/v1alpha1 -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: cfg-test-endpoint - path: cfg-test-path - context: cfg-test-context - discoverySources: - - gcp: - name: test - bucket: cfg-test-bucket - manifestPath: cfg-test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: cfg-test-bucket - manifestPath: cfg-test-manifest-path - annotation: two - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -kind: ClientConfig -metadata: - creationTimestamp: null`, - cfg2: `contexts: [] -currentContext: {} -current: -`, - output: `apiVersion: config.tanzu.vmware.com/v1alpha1 -kind: ClientConfig -metadata: - creationTimestamp: null -clientOptions: - cli: - bomRepo: projects.registry.vmware.com/tkg - compatibilityFilePath: tkg-compatibility - discoverySources: - - contextType: k8s - local: - name: default-local - path: standalone - - local: - name: admin-local - path: admin - edition: tkg - features: - cluster: - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - global: - context-aware-cli-for-plugins: 'true' - context-target: 'false' - tkr-version-v1alpha3-beta: 'false' - management-cluster: - aws-instance-types-exclude-arm: 'true' - custom-nameservers: 'false' - dual-stack-ipv4-primary: 'false' - dual-stack-ipv6-primary: 'false' - export-from-confirm: 'true' - import: 'false' - standalone-cluster-mode: 'false' - package: - kctrl-command-tree: 'true' -contexts: [] -currentContext: {} -current: -`, - }, - { - name: "success empty data", - cfg: ``, - cfg2: ``, - output: `{} -`, - }, - } - - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - _, cleanUp := setupTestConfig(t, &CfgTestData{cfg: spec.cfg, cfgNextGen: spec.cfg2}) - - defer func() { - cleanUp() - }() - - multiNode, err := getMultiConfig() - assert.NoError(t, err) - - multiBytes, err := yaml.Marshal(multiNode) - assert.NoError(t, err) - - assert.Equal(t, spec.output, string(multiBytes)) - }) - } -} diff --git a/cli/runtime/config/config_filesystem.go b/cli/runtime/config/config_filesystem.go deleted file mode 100644 index 13566c1e46..0000000000 --- a/cli/runtime/config/config_filesystem.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "path/filepath" - - "github.com/pkg/errors" -) - -const ( - - // EnvEndpointKey is the environment variable that overrides the tanzu endpoint. - EnvEndpointKey = "TANZU_ENDPOINT" - - //nolint:gosec // Avoid "hardcoded credentials" false positive. - // EnvAPITokenKey is the environment variable that overrides the tanzu API token for global auth. - EnvAPITokenKey = "TANZU_API_TOKEN" -) - -var ( - // LocalDirName is the name of the local directory in which tanzu state is stored. - LocalDirName = ".config/tanzu" - // TestLocalDirName is the name of the local directory in which tanzu state is stored for testing. - TestLocalDirName = ".tanzu-test" -) - -// LocalDir returns the local directory in which tanzu state is stored. -func LocalDir() (path string, err error) { - return localDirPath(LocalDirName) -} - -// localDirPath returns the full path of the directory name in which tanzu state is stored. -func localDirPath(dirname string) (path string, err error) { - home, err := os.UserHomeDir() - if err != nil { - return path, errors.Wrap(err, "could not locate local tanzu dir") - } - path = filepath.Join(home, dirname) - return -} diff --git a/cli/runtime/config/config_keys.go b/cli/runtime/config/config_keys.go deleted file mode 100644 index a8cfd4757c..0000000000 --- a/cli/runtime/config/config_keys.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -// Keys used to parse the yaml node to retrieve specific stanza of the config file -const ( - KeyServers = "servers" - KeyContexts = "contexts" - KeyCurrentServer = "current" - KeyCurrentContext = "currentContext" - KeyClientOptions = "clientOptions" - KeyCLI = "cli" - KeyFeatures = "features" - KeyEnv = "env" - KeyDiscoverySources = "discoverySources" - KeyRepositories = "repositories" - KeyUnstableVersionSelector = "unstableVersionSelector" - KeyEdition = "edition" - KeyKind = "kind" - KeyMetadata = "metadata" - KeyAPIVersion = "apiVersion" - KeyBomRepo = "bomRepo" - KeyCompatibilityFilePath = "compatibilityFilePath" -) diff --git a/cli/runtime/config/config_types.go b/cli/runtime/config/config_types.go deleted file mode 100644 index a65316e916..0000000000 --- a/cli/runtime/config/config_types.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package config Provide API methods to Read/Write specific stanza of config file -package config - -type CfgOptions struct { - CfgPath string // file path to the config file -} - -type CfgOpts func(config *CfgOptions) - -func WithCfgPath(path string) CfgOpts { - return func(config *CfgOptions) { - config.CfgPath = path - } -} diff --git a/cli/runtime/config/contexts.go b/cli/runtime/config/contexts.go deleted file mode 100644 index 1d868636b3..0000000000 --- a/cli/runtime/config/contexts.go +++ /dev/null @@ -1,414 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "fmt" - - "gopkg.in/yaml.v3" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" -) - -// GetContext retrieves the context by name -func GetContext(name string) (*configapi.Context, error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return nil, err - } - return getContext(node, name) -} - -// AddContext add or update context and currentContext -func AddContext(c *configapi.Context, setCurrent bool) error { - return SetContext(c, setCurrent) -} - -// SetContext add or update context and currentContext -// -//nolint:gocyclo -func SetContext(c *configapi.Context, setCurrent bool) error { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - // Add or update the context - persist, err := setContext(node, c) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - // Set current context - if setCurrent { - persist, err = setCurrentContext(node, c) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - } - - // Back-fill servers based on contexts - s := convertContextToServer(c) - - // Add or update server - persist, err = setServer(node, s) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - - // Set current server - if setCurrent && s.Type == configapi.ManagementClusterServerType { - persist, err = setCurrentServer(node, s.Name) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - } - return err -} - -// DeleteContext delete a context by name -func DeleteContext(name string) error { - return RemoveContext(name) -} - -// RemoveContext delete a context by name -func RemoveContext(name string) error { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - ctx, err := getContext(node, name) - if err != nil { - return err - } - err = removeCurrentContext(node, ctx) - if err != nil { - return err - } - err = removeContext(node, name) - if err != nil { - return err - } - err = removeServer(node, name) - if err != nil { - return err - } - err = removeCurrentServer(node, name) - if err != nil { - return err - } - return persistConfig(node) -} - -// ContextExists checks if context by name already exists -func ContextExists(name string) (bool, error) { - exists, _ := GetContext(name) - return exists != nil, nil -} - -// GetCurrentContext retrieves the current context for the specified target -func GetCurrentContext(target cliapi.Target) (c *configapi.Context, err error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return nil, err - } - return getCurrentContext(node, target) -} - -// GetAllCurrentContextsMap returns all current context per Target -func GetAllCurrentContextsMap() (map[cliapi.Target]*configapi.Context, error) { - node, err := getClientConfigNodeNoLock() - if err != nil { - return nil, err - } - return getAllCurrentContextsMap(node) -} - -// GetAllCurrentContextsList returns all current context names as list -func GetAllCurrentContextsList() ([]string, error) { - currentContextsMap, err := GetAllCurrentContextsMap() - if err != nil { - return nil, err - } - var serverNames []string - for _, context := range currentContextsMap { - serverNames = append(serverNames, context.Name) - } - return serverNames, nil -} - -// SetCurrentContext sets the current context to the specified name if context is present -func SetCurrentContext(name string) error { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - - ctx, err := getContext(node, name) - if err != nil { - return err - } - persist, err := setCurrentContext(node, ctx) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - if ctx.Target == cliapi.TargetK8s { - persist, err = setCurrentServer(node, name) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - } - return err -} - -// RemoveCurrentContext removed the current context of specified context type -func RemoveCurrentContext(target cliapi.Target) error { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - c, err := getCurrentContext(node, target) - if err != nil { - return err - } - err = removeCurrentContext(node, &configapi.Context{Target: target}) - if err != nil { - return err - } - err = removeCurrentServer(node, c.Name) - if err != nil { - return err - } - return persistConfig(node) -} - -// EndpointFromContext retrieved the endpoint from the specified context -func EndpointFromContext(s *configapi.Context) (endpoint string, err error) { - switch s.Target { - case cliapi.TargetK8s: - return s.ClusterOpts.Endpoint, nil - case cliapi.TargetTMC: - return s.GlobalOpts.Endpoint, nil - default: - return endpoint, fmt.Errorf("unknown server type %q", s.Target) - } -} - -func getContext(node *yaml.Node, name string) (*configapi.Context, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - for _, ctx := range cfg.KnownContexts { - if ctx.Name == name { - return ctx, nil - } - } - return nil, fmt.Errorf("context %v not found", name) -} - -func getCurrentContext(node *yaml.Node, target cliapi.Target) (*configapi.Context, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - return cfg.GetCurrentContext(target) -} - -func getAllCurrentContextsMap(node *yaml.Node) (map[cliapi.Target]*configapi.Context, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - return cfg.GetAllCurrentContextsMap() -} - -func setContexts(node *yaml.Node, contexts []*configapi.Context) (err error) { - for _, c := range contexts { - _, err = setContext(node, c) - if err != nil { - return err - } - } - return err -} - -func setContext(node *yaml.Node, ctx *configapi.Context) (persist bool, err error) { - // Get Patch Strategies from config metadata - patchStrategies, err := GetConfigMetadataPatchStrategy() - if err != nil { - patchStrategies = make(map[string]string) - } - - var persistDiscoverySources bool - - // Convert context to node - newContextNode, err := convertContextToNode(ctx) - if err != nil { - return persist, err - } - - // Find the contexts node from the root node - keys := []nodeutils.Key{ - {Name: KeyContexts, Type: yaml.SequenceNode}, - } - contextsNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if contextsNode == nil { - return persist, err - } - - exists := false - var result []*yaml.Node - // Skip duplicate for context and server similar logic - //nolint:dupl - for _, contextNode := range contextsNode.Content { - if index := nodeutils.GetNodeIndex(contextNode.Content, "name"); index != -1 && - contextNode.Content[index].Value == ctx.Name { - exists = true - // replace the nodes as per patch strategy - _, err = nodeutils.DeleteNodes(newContextNode.Content[0], contextNode, nodeutils.WithPatchStrategyKey(KeyContexts), nodeutils.WithPatchStrategies(patchStrategies)) - if err != nil { - return false, err - } - persist, err = nodeutils.MergeNodes(newContextNode.Content[0], contextNode) - if err != nil { - return false, err - } - persistDiscoverySources, err = setDiscoverySources(contextNode, ctx.DiscoverySources, nodeutils.WithPatchStrategyKey(fmt.Sprintf("%v.%v", KeyContexts, KeyDiscoverySources)), nodeutils.WithPatchStrategies(patchStrategies)) - if err != nil { - return false, err - } - // merge the discovery sources to context - if persistDiscoverySources { - _, err = nodeutils.MergeNodes(newContextNode.Content[0], contextNode) - if err != nil { - return false, err - } - } - result = append(result, contextNode) - continue - } - result = append(result, contextNode) - } - if !exists { - result = append(result, newContextNode.Content[0]) - persist = true - } - contextsNode.Content = result - return persistDiscoverySources || persist, err -} - -func setCurrentContext(node *yaml.Node, ctx *configapi.Context) (persist bool, err error) { - // Find current context node in the yaml node - keys := []nodeutils.Key{ - {Name: KeyCurrentContext, Type: yaml.MappingNode}, - } - currentContextNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if currentContextNode == nil { - return persist, nodeutils.ErrNodeNotFound - } - if index := nodeutils.GetNodeIndex(currentContextNode.Content, string(ctx.Target)); index != -1 { - if currentContextNode.Content[index].Value != ctx.Name { - currentContextNode.Content[index].Value = ctx.Name - currentContextNode.Content[index].Style = 0 - persist = true - } - } else { - currentContextNode.Content = append(currentContextNode.Content, nodeutils.CreateScalarNode(string(ctx.Target), ctx.Name)...) - persist = true - } - return persist, err -} - -func removeCurrentContext(node *yaml.Node, ctx *configapi.Context) error { - // Find current context node in the yaml node - keys := []nodeutils.Key{ - {Name: KeyCurrentContext}, - } - - currentContextNode := nodeutils.FindNode(node.Content[0], nodeutils.WithKeys(keys)) - if currentContextNode == nil { - return nil - } - targetNodeIndex := nodeutils.GetNodeIndex(currentContextNode.Content, string(ctx.Target)) - if targetNodeIndex == -1 { - return nil - } - if currentContextNode.Content[targetNodeIndex].Value == ctx.Name || ctx.Name == "" { - targetNodeIndex-- - currentContextNode.Content = append(currentContextNode.Content[:targetNodeIndex], currentContextNode.Content[targetNodeIndex+2:]...) - } - return nil -} - -//nolint:dupl -func removeContext(node *yaml.Node, name string) error { - // Find the contexts node in the yaml node - keys := []nodeutils.Key{ - {Name: KeyContexts}, - } - contextsNode := nodeutils.FindNode(node.Content[0], nodeutils.WithKeys(keys)) - if contextsNode == nil { - return nil - } - var contexts []*yaml.Node - for _, contextNode := range contextsNode.Content { - if index := nodeutils.GetNodeIndex(contextNode.Content, "name"); index != -1 && contextNode.Content[index].Value == name { - continue - } - contexts = append(contexts, contextNode) - } - contextsNode.Content = contexts - return nil -} diff --git a/cli/runtime/config/contexts_it_test.go b/cli/runtime/config/contexts_it_test.go deleted file mode 100644 index 836f507a65..0000000000 --- a/cli/runtime/config/contexts_it_test.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func setupContextsData() (string, string, string, string) { - cfg := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "/:" - unknown: cli-unknown - - local: - name: default-local - - local: - name: admin-local - path: admin -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: updated-test-endpoint - path: updated-test-path - context: updated-test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: one - required: true -current: test-mc -` - expectedCfg := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "/:" - unknown: cli-unknown - - local: - name: default-local - - local: - name: admin-local - path: admin -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: updated-test-endpoint - path: updated-test-path - context: updated-test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: one - required: true - - name: test-mc2 - type: managementcluster - managementClusterOpts: - path: test-path-updated - context: test-context-updated - discoverySources: - - gcp: - name: test - bucket: test-bucket-updated - manifestPath: test-manifest-path-updated -current: test-mc2 -` - cfg2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true -currentContext: - kubernetes: test-mc -` - expectedCfg2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - - name: test-mc2 - target: kubernetes - clusterOpts: - path: test-path-updated - context: test-context-updated - isManagementCluster: true - discoverySources: - - gcp: - name: test - bucket: test-bucket-updated - manifestPath: test-manifest-path-updated -currentContext: - kubernetes: test-mc2 -` - - return cfg, expectedCfg, cfg2, expectedCfg2 -} -func TestContextsIntegration(t *testing.T) { - // Setup config data - cfg, expectedCfg, cfg2, expectedCfg2 := setupContextsData() - cfgTestFiles, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2}) - - defer func() { - cleanUp() - }() - - // Get Context - context, err := GetContext("test-mc") - expected := &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - assert.Nil(t, err) - assert.Equal(t, expected, context) - // Add new Context - newCtx := &configapi.Context{ - Name: "test-mc2", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - err = SetContext(newCtx, true) - assert.NoError(t, err) - ctx, err := GetContext("test-mc2") - assert.Nil(t, err) - assert.Equal(t, newCtx, ctx) - // Update existing Context - updatedCtx := &configapi.Context{ - Name: "test-mc2", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Path: "test-path-updated", - Context: "test-context-updated", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket-updated", - ManifestPath: "test-manifest-path-updated", - }, - }, - }, - } - err = SetContext(updatedCtx, true) - assert.NoError(t, err) - ctx, err = GetContext("test-mc2") - assert.Nil(t, err) - assert.Equal(t, updatedCtx, ctx) - - file, err := os.ReadFile(cfgTestFiles[0].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg, string(file)) - - file, err = os.ReadFile(cfgTestFiles[1].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg2, string(file)) - - // Delete context - err = DeleteContext("test-mc2") - assert.NoError(t, err) - ctx, err = GetContext("test-mc2") - assert.Equal(t, "context test-mc2 not found", err.Error()) - assert.Nil(t, ctx) -} diff --git a/cli/runtime/config/contexts_test.go b/cli/runtime/config/contexts_test.go deleted file mode 100644 index 9b6083feb3..0000000000 --- a/cli/runtime/config/contexts_test.go +++ /dev/null @@ -1,1139 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "gopkg.in/yaml.v3" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestSetGetDeleteContext(t *testing.T) { - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - ctx1 := &configapi.Context{ - Name: "test1", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - ctx2 := &configapi.Context{ - Name: "test2", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - ctx, err := GetContext("test1") - assert.Equal(t, "context test1 not found", err.Error()) - assert.Nil(t, ctx) - - err = SetContext(ctx1, true) - assert.NoError(t, err) - - ctx, err = GetContext("test1") - assert.Nil(t, err) - assert.Equal(t, ctx1, ctx) - - ctx, err = GetCurrentContext(cliapi.TargetK8s) - assert.Nil(t, err) - assert.Equal(t, ctx1, ctx) - - err = SetContext(ctx2, false) - assert.NoError(t, err) - - ctx, err = GetContext("test2") - assert.Nil(t, err) - assert.Equal(t, ctx2, ctx) - - ctx, err = GetCurrentContext(cliapi.TargetK8s) - assert.Nil(t, err) - assert.Equal(t, ctx1, ctx) - - err = DeleteContext("test") - assert.Equal(t, "context test not found", err.Error()) - - err = DeleteContext("test1") - assert.Nil(t, err) - - ctx, err = GetContext("test1") - assert.Nil(t, ctx) - assert.Equal(t, "context test1 not found", err.Error()) -} - -func TestSetContextWithOldVersion(t *testing.T) { - tanzuConfigBytes := ` -currentContext: - kubernetes: test-mc -contexts: - - name: test-mc - ctx-field: new-ctx-field - optional: true - target: kubernetes - clusterOpts: - isManagementCluster: true - endpoint: old-test-endpoint - annotation: one - required: true - annotationStruct: - one: one - discoverySources: - - gcp: - name: test - bucket: test-ctx-bucket - manifestPath: test-ctx-manifest-path - annotation: one - required: true - - gcp: - name: test2 - bucket: test2-bucket - manifestPath: test2-manifest-path - annotation: one - required: true -` - - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{cfgNextGen: tanzuConfigBytes}) - - defer func() { - cleanUp() - }() - - ctx := &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - err := SetContext(ctx, false) - assert.NoError(t, err) - - c, err := GetContext(ctx.Name) - assert.NoError(t, err) - assert.Equal(t, c.Name, ctx.Name) - assert.Equal(t, c.ClusterOpts.Endpoint, "old-test-endpoint") - assert.Equal(t, c.ClusterOpts.Path, ctx.ClusterOpts.Path) - assert.Equal(t, c.ClusterOpts.Context, ctx.ClusterOpts.Context) -} - -func TestSetContextWithDiscoverySourceWithNewFields(t *testing.T) { - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - src *configapi.ClientConfig - ctx *configapi.Context - current bool - errStr string - }{ - { - name: "should add new context with new discovery sources to empty client config", - src: &configapi.ClientConfig{}, - ctx: &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - current: true, - }, - { - name: "should update existing context", - src: &configapi.ClientConfig{ - KnownContexts: []*configapi.Context{ - { - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - KnownServers: []*configapi.Server{ - { - Name: "test-mc", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - CurrentServer: "test-mc", - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetK8s: "test-mc", - }, - }, - ctx: &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "updated-test-endpoint", - Path: "updated-test-path", - Context: "updated-test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "updated-test-manifest-path", - }, - }, - }, - }, - current: true, - }, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - err := SetContext(tc.ctx, tc.current) - if tc.errStr == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - - ok, err := ContextExists(tc.ctx.Name) - assert.True(t, ok) - assert.NoError(t, err) - }) - } -} - -func TestSetContextWithDiscoverySource(t *testing.T) { - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - src *configapi.ClientConfig - ctx *configapi.Context - current bool - errStr string - }{ - { - name: "should add new context with new discovery sources to empty client config", - src: &configapi.ClientConfig{}, - ctx: &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - current: true, - }, - { - name: "should update existing context", - src: &configapi.ClientConfig{ - KnownContexts: []*configapi.Context{ - { - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - KnownServers: []*configapi.Server{ - { - Name: "test-mc", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - CurrentServer: "test-mc", - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetK8s: "test-mc", - }, - }, - ctx: &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "updated-test-endpoint", - Path: "updated-test-path", - Context: "updated-test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "updated-test-manifest-path", - }, - }, - }, - }, - current: true, - }, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - err := SetContext(tc.ctx, tc.current) - if tc.errStr == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - - ok, err := ContextExists(tc.ctx.Name) - assert.True(t, ok) - assert.NoError(t, err) - }) - } -} - -func setupForGetContext(t *testing.T) { - // setup - cfg := &configapi.ClientConfig{ - KnownContexts: []*configapi.Context{ - { - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - { - Name: "test-mc-2", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint-2", - Path: "test-path-2", - Context: "test-context-2", - IsManagementCluster: true, - }, - }, - { - Name: "test-tmc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetK8s: "test-mc-2", - cliapi.TargetTMC: "test-tmc", - }, - } - func() { - LocalDirName = TestLocalDirName - err := StoreClientConfig(cfg) - assert.NoError(t, err) - }() -} - -func TestGetContext(t *testing.T) { - setupForGetContext(t) - - defer func() { - cleanupDir(LocalDirName) - }() - - tcs := []struct { - name string - ctxName string - errStr string - }{ - { - name: "success k8s", - ctxName: "test-mc", - }, - { - name: "success tmc", - ctxName: "test-tmc", - }, - { - name: "failure", - ctxName: "test", - errStr: "context test not found", - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - c, err := GetContext(tc.ctxName) - if tc.errStr == "" { - assert.Equal(t, tc.ctxName, c.Name) - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - }) - } -} - -func TestContextExists(t *testing.T) { - setupForGetContext(t) - - defer func() { - cleanupDir(LocalDirName) - }() - - tcs := []struct { - name string - ctxName string - ok bool - }{ - { - name: "success k8s", - ctxName: "test-mc", - ok: true, - }, - { - name: "success tmc", - ctxName: "test-tmc", - ok: true, - }, - { - name: "failure", - ctxName: "test", - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - ok, err := ContextExists(tc.ctxName) - assert.Equal(t, tc.ok, ok) - assert.NoError(t, err) - }) - } -} - -func TestSetContext(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - // setup data - node := &yaml.Node{ - Kind: yaml.DocumentNode, - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{}, - }, - }, - } - err := persistConfig(node) - assert.NoError(t, err) - }() - defer func() { - cleanupDir(LocalDirName) - }() - tcs := []struct { - name string - ctx *configapi.Context - current bool - errStr string - }{ - { - name: "should add new context and set current on empty config", - ctx: &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - current: true, - }, - - { - name: "should add new context but not current", - ctx: &configapi.Context{ - Name: "test-mc2", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - }, - { - name: "success tmc current", - ctx: &configapi.Context{ - Name: "test-tmc1", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - current: true, - }, - { - name: "success tmc not_current", - ctx: &configapi.Context{ - Name: "test-tmc2", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - { - name: "success update test-mc", - ctx: &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "good-test-endpoint", - Path: "updated-test-path", - Context: "updated-test-context", - IsManagementCluster: true, - }, - }, - }, - { - name: "success update tmc", - ctx: &configapi.Context{ - Name: "test-tmc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "updated-test-endpoint", - }, - }, - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - // perform test - err := SetContext(tc.ctx, tc.current) - if tc.errStr == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - ctx, err := GetContext(tc.ctx.Name) - assert.NoError(t, err) - assert.Equal(t, tc.ctx.Name, ctx.Name) - s, err := GetServer(tc.ctx.Name) - assert.NoError(t, err) - assert.Equal(t, tc.ctx.Name, s.Name) - }) - } -} - -func TestRemoveContext(t *testing.T) { - // setup - setupForGetContext(t) - defer func() { - cleanupDir(LocalDirName) - }() - tcs := []struct { - name string - ctxName string - target cliapi.Target - errStr string - }{ - { - name: "success k8s", - ctxName: "test-mc", - target: cliapi.TargetK8s, - }, - { - name: "success tmc", - ctxName: "test-tmc", - target: cliapi.TargetTMC, - }, - { - name: "failure", - ctxName: "test", - errStr: "context test not found", - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - if tc.errStr == "" { - ok, err := ContextExists(tc.ctxName) - require.True(t, ok) - require.NoError(t, err) - } - err := RemoveContext(tc.ctxName) - if tc.errStr == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - ok, err := ContextExists(tc.ctxName) - assert.False(t, ok) - assert.NoError(t, err) - ok, err = ServerExists(tc.ctxName) - assert.Nil(t, err) - assert.False(t, ok) - }) - } -} - -func TestSetCurrentContext(t *testing.T) { - // setup - setupForGetContext(t) - defer func() { - cleanupDir(LocalDirName) - }() - tcs := []struct { - name string - target cliapi.Target - ctxName string - currServer string - errStr string - }{ - { - name: "success tmc", - ctxName: "test-tmc", - target: cliapi.TargetTMC, - }, - { - name: "success k8s", - ctxName: "test-mc", - target: cliapi.TargetK8s, - currServer: "test-mc", - }, - { - name: "success tmc after setting k8s", - ctxName: "test-tmc", - target: cliapi.TargetTMC, - }, - { - name: "failure", - ctxName: "test", - errStr: "context test not found", - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - prevSrv, _ := GetCurrentServer() - - err := SetCurrentContext(tc.ctxName) - if tc.errStr == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - currCtx, err := GetCurrentContext(tc.target) - if tc.errStr == "" { - assert.NoError(t, err) - assert.Equal(t, tc.ctxName, currCtx.Name) - } else { - assert.Error(t, err) - } - currSrv, err := GetCurrentServer() - assert.NoError(t, err) - if tc.errStr == "" { - if tc.currServer == "" { - assert.Equal(t, prevSrv.Name, currSrv.Name) - } else { - assert.Equal(t, tc.currServer, currSrv.Name) - } - } - }) - } - - currentContextMap, err := GetAllCurrentContextsMap() - assert.NoError(t, err) - assert.Equal(t, "test-mc", currentContextMap[cliapi.TargetK8s].Name) - assert.Equal(t, "test-tmc", currentContextMap[cliapi.TargetTMC].Name) - - currentContextsList, err := GetAllCurrentContextsList() - assert.NoError(t, err) - assert.Contains(t, currentContextsList, "test-mc") - assert.Contains(t, currentContextsList, "test-tmc") -} - -func TestRemoveCurrentContext(t *testing.T) { - // setup - setupForGetContext(t) - defer func() { - cleanupDir(LocalDirName) - }() - - err := RemoveCurrentContext(cliapi.TargetK8s) - assert.NoError(t, err) - - currCtx, err := GetCurrentContext(cliapi.TargetK8s) - assert.Equal(t, "no current context set for target \"kubernetes\"", err.Error()) - assert.Nil(t, currCtx) - - currSrv, err := GetCurrentServer() - assert.Equal(t, "current server \"\" not found in tanzu config", err.Error()) - assert.Nil(t, currSrv) - - currCtx, err = GetCurrentContext(cliapi.TargetTMC) - assert.NoError(t, err) - assert.Equal(t, currCtx.Name, "test-tmc") -} - -func TestSetSingleContext(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - defer func() { - cleanupDir(LocalDirName) - }() - tcs := []struct { - name string - ctx *configapi.Context - current bool - errStr string - }{ - { - name: "success k8s current", - ctx: &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - err := SetContext(tc.ctx, tc.current) - if tc.errStr == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - ok, err := ContextExists(tc.ctx.Name) - assert.True(t, ok) - assert.NoError(t, err) - ok, err = ServerExists(tc.ctx.Name) - assert.True(t, ok) - assert.NoError(t, err) - }) - } -} - -func TestSetContextMultiFile(t *testing.T) { - configBytes, configNextGenBytes := setupMultiCfgData() - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{cfg: configBytes, cfgNextGen: configNextGenBytes}) - - defer func() { - cleanUp() - }() - - ctx := &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - IsManagementCluster: true, - Endpoint: "test-endpoint", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test2", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - ctx2 := &configapi.Context{ - Name: "test-mc2", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "updated-test-endpoint", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test2", - }, - }, - }, - } - - expectedCtx2 := &configapi.Context{ - Name: "test-mc2", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - IsManagementCluster: true, - Endpoint: "updated-test-endpoint", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test2", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - c, err := GetCurrentContext(cliapi.TargetK8s) - assert.NoError(t, err) - assert.Equal(t, ctx, c) - - c, err = GetContext("test-mc") - assert.NoError(t, err) - assert.Equal(t, ctx, c) - - err = SetContext(ctx2, true) - assert.NoError(t, err) - - c, err = GetContext(ctx2.Name) - assert.NoError(t, err) - assert.Equal(t, expectedCtx2, c) -} - -func TestSetContextMultiFileAndMigrateToNewConfig(t *testing.T) { - configBytes, configNextGenBytes := setupMultiCfgData() - - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{cfg: configBytes, cfgNextGen: configNextGenBytes, cfgMetadata: setupConfigMetadataWithMigrateToNewConfig()}) - - defer func() { - cleanUp() - }() - - ctx := &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - IsManagementCluster: true, - Endpoint: "test-endpoint", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test2", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - ctx2 := &configapi.Context{ - Name: "test-mc2", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "updated-test-endpoint", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test2", - }, - }, - }, - } - - expectedCtx2 := &configapi.Context{ - Name: "test-mc2", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - IsManagementCluster: true, - Endpoint: "updated-test-endpoint", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test2", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - c, err := GetCurrentContext(cliapi.TargetK8s) - assert.NoError(t, err) - assert.Equal(t, ctx, c) - - c, err = GetContext("test-mc") - assert.NoError(t, err) - assert.Equal(t, ctx, c) - - err = SetContext(ctx2, true) - assert.NoError(t, err) - - c, err = GetContext(ctx2.Name) - assert.NoError(t, err) - assert.Equal(t, expectedCtx2, c) -} - -func TestSetContextWithUniquePermissions(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - - defer func() { - cleanupDir(LocalDirName) - }() - - ctx := &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - Auth: configapi.GlobalServerAuth{ - IDToken: "", - Issuer: "https://console-stg.cloud.vmware.com/csp/gateway/am/api", - Permissions: []string{ - "external/25834195-19aa-4ffd-8933-f5f20094ab24/service:member", - "csp:org_owner", - "external/f52d39b0-c298-4adf-9c6f-0a4a07351cd7/service:admin", - "csp:org_member", - "external/f52d39b0-c298-4adf-9c6f-0a4a07351cd7/service:member", - }, - RefreshToken: "XXX", - Type: "api-token", - UserName: "tanzu-core", - }, - }, - } - - ctx2 := &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint-updated", - Auth: configapi.GlobalServerAuth{ - IDToken: "", - Issuer: "https://console-stg.cloud.vmware.com/csp/gateway/am/api", - Permissions: []string{ - "csp:org_member2", - "external/f52d39b0-c298-4adf-9c6f-0a4a07351cd7/service:member", - }, - RefreshToken: "XXX", - Type: "api-token", - UserName: "tanzu-core", - }, - }, - } - - ctx3 := &configapi.Context{ - Name: "test-mc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint-updated3", - Auth: configapi.GlobalServerAuth{ - IDToken: "", - Issuer: "https://console-stg.cloud.vmware.com/csp/gateway/am/api", - Permissions: []string{ - "external/25834195-19aa-4ffd-8933-f5f20094ab24/service:member", - "csp:org_owner3", - }, - RefreshToken: "XXX", - Type: "api-token", - UserName: "tanzu-core", - }, - }, - } - - for i := 1; i <= 100; i++ { - err := SetContext(ctx, true) - assert.NoError(t, err) - err = SetContext(ctx2, true) - assert.NoError(t, err) - err = SetContext(ctx3, true) - assert.NoError(t, err) - err = SetContext(ctx, true) - assert.NoError(t, err) - } - - c, err := GetContext("test-mc") - assert.NoError(t, err) - assert.Equal(t, 7, len(c.GlobalOpts.Auth.Permissions)) - - s, err := GetServer("test-mc") - assert.NoError(t, err) - assert.Equal(t, 7, len(s.GlobalOpts.Auth.Permissions)) -} diff --git a/cli/runtime/config/conversion.go b/cli/runtime/config/conversion.go deleted file mode 100644 index 0aefecb732..0000000000 --- a/cli/runtime/config/conversion.go +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "github.com/aunum/log" - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -// PopulateContexts converts the known servers that are missing in contexts. -// This is needed when reading the config file persisted by an older core or plugin, -// so that it is forwards compatible with a new core plugin. -// Returns true if there was any delta. -func PopulateContexts(cfg *configapi.ClientConfig) bool { - if cfg == nil || len(cfg.KnownServers) == 0 { - return false - } - - var delta bool - if len(cfg.KnownContexts) == 0 { - cfg.KnownContexts = make([]*configapi.Context, 0, len(cfg.KnownServers)) - } - for _, s := range cfg.KnownServers { - if cfg.HasContext(s.Name) { - // server already present in known contexts; skip - continue - } - - delta = true - // convert and append the server to the list of known contexts - c := convertServerToContext(s) - cfg.KnownContexts = append(cfg.KnownContexts, c) - - if s.Name == cfg.CurrentServer { - err := cfg.SetCurrentContext(c.Target, c.Name) - if err != nil { - log.Warningf(err.Error()) - } - } - } - - return delta -} - -func convertServerToContext(s *configapi.Server) *configapi.Context { - if s == nil { - return nil - } - - return &configapi.Context{ - Name: s.Name, - Target: convertServerTypeToTarget(s.Type), - GlobalOpts: s.GlobalOpts, - ClusterOpts: convertMgmtClusterOptsToClusterOpts(s.ManagementClusterOpts), - DiscoverySources: s.DiscoverySources, - } -} - -func convertServerTypeToTarget(t configapi.ServerType) cliapi.Target { - switch t { - case configapi.ManagementClusterServerType: - return cliapi.TargetK8s - case configapi.GlobalServerType: - return cliapi.TargetTMC - } - // no other server type is supported in v0 - return cliapi.Target(t) -} - -func convertMgmtClusterOptsToClusterOpts(s *configapi.ManagementClusterServer) *configapi.ClusterServer { - if s == nil { - return nil - } - - return &configapi.ClusterServer{ - Endpoint: s.Endpoint, - Path: s.Path, - Context: s.Context, - IsManagementCluster: true, - } -} - -// populateServers converts the known contexts that are missing in servers. -// This is needed when writing the config file from the newer core or plugin, -// so that it is backwards compatible with an older core or plugin. -func populateServers(cfg *configapi.ClientConfig) { - if cfg == nil { - return - } - - if len(cfg.KnownServers) == 0 { - cfg.KnownServers = make([]*configapi.Server, 0, len(cfg.KnownContexts)) - } - for _, c := range cfg.KnownContexts { - if cfg.HasServer(c.Name) { - // context already present in known servers; skip - continue - } - - // convert and append the context to the list of known servers - s := convertContextToServer(c) - cfg.KnownServers = append(cfg.KnownServers, s) - - if cfg.CurrentServer == "" && (c.IsManagementCluster() || c.Target == cliapi.TargetTMC) && c.Name == cfg.CurrentContext[c.Target] { - // This is lossy because only one server can be active at a time in the older CLI. - // Using the K8s context for a management cluster or TMC, since these are the two - // available publicly at the time of deprecation. - cfg.CurrentServer = cfg.CurrentContext[cliapi.TargetK8s] - } - } -} - -func convertContextToServer(c *configapi.Context) *configapi.Server { - if c == nil { - return nil - } - - return &configapi.Server{ - Name: c.Name, - Type: convertTargetToServerType(c.Target), - GlobalOpts: c.GlobalOpts, - ManagementClusterOpts: convertClusterOptsToMgmtClusterOpts(c.ClusterOpts), - DiscoverySources: c.DiscoverySources, - } -} - -func convertTargetToServerType(t cliapi.Target) configapi.ServerType { - switch t { - case cliapi.TargetK8s: - // This is lossy because only management cluster servers are supported by the older CLI. - return configapi.ManagementClusterServerType - case cliapi.TargetTMC: - return configapi.GlobalServerType - } - // no other context type is supported in v1 yet - return configapi.ServerType(t) -} - -func convertClusterOptsToMgmtClusterOpts(o *configapi.ClusterServer) *configapi.ManagementClusterServer { - if o == nil || !o.IsManagementCluster { - return nil - } - - return &configapi.ManagementClusterServer{ - Endpoint: o.Endpoint, - Path: o.Path, - Context: o.Context, - } -} - -// convertNodeToClientConfig converts yaml node to client config type -func convertNodeToClientConfig(node *yaml.Node) (obj *configapi.ClientConfig, err error) { - err = node.Decode(&obj) - if err != nil { - return nil, errors.Wrap(err, "failed to convert node to ClientConfig") - } - if obj == nil { - return &configapi.ClientConfig{}, err - } - return obj, err -} - -// convertNodeToMetadata converts yaml node to client config type -func convertNodeToMetadata(node *yaml.Node) (obj *configapi.Metadata, err error) { - err = node.Decode(&obj) - if err != nil { - return nil, errors.Wrap(err, "failed to convert node to Metadata") - } - return obj, err -} - -// convertClientConfigToNode converts client config type to yaml node -func convertClientConfigToNode(obj *configapi.ClientConfig) (*yaml.Node, error) { - bytes, err := yaml.Marshal(obj) - if err != nil { - return nil, errors.Wrap(err, "failed to convert obj to node") - } - var node yaml.Node - err = yaml.Unmarshal(bytes, &node) - if err != nil { - return nil, errors.Wrap(err, "failed to unmarshal bytes to node") - } - return &node, nil -} - -// convertMetadataToNode converts client config type to yaml node -func convertMetadataToNode(metadata *configapi.Metadata) (*yaml.Node, error) { - bytes, err := yaml.Marshal(metadata) - if err != nil { - return nil, errors.Wrap(err, "failed to convert metadata obj to node") - } - var node yaml.Node - err = yaml.Unmarshal(bytes, &node) - if err != nil { - return nil, errors.Wrap(err, "failed to unmarshal bytes to node") - } - return &node, nil -} - -// convertServerToNode converts server to yaml node -func convertServerToNode(obj *configapi.Server) (*yaml.Node, error) { - bytes, err := yaml.Marshal(obj) - if err != nil { - return nil, errors.Wrap(err, "failed to convert obj to node") - } - var node yaml.Node - err = yaml.Unmarshal(bytes, &node) - if err != nil { - return nil, errors.Wrap(err, "failed to unmarshal bytes to node") - } - return &node, nil -} - -// convertPluginRepositoryToNode converts PluginRepository to yaml node -func convertPluginRepositoryToNode(obj *configapi.PluginRepository) (*yaml.Node, error) { - bytes, err := yaml.Marshal(obj) - if err != nil { - return nil, errors.Wrap(err, "failed to convert obj to node") - } - var node yaml.Node - err = yaml.Unmarshal(bytes, &node) - if err != nil { - return nil, errors.Wrap(err, "failed to unmarshal bytes to node") - } - return &node, nil -} - -// convertContextToNode converts context to yaml node -func convertContextToNode(obj *configapi.Context) (*yaml.Node, error) { - bytes, err := yaml.Marshal(obj) - if err != nil { - return nil, errors.Wrap(err, "failed to convert obj to node") - } - var node yaml.Node - err = yaml.Unmarshal(bytes, &node) - if err != nil { - return nil, errors.Wrap(err, "failed to unmarshal bytes to node") - } - return &node, nil -} - -// convertPluginDiscoveryToNode converts PluginDiscovery to yaml node -func convertPluginDiscoveryToNode(obj *configapi.PluginDiscovery) (*yaml.Node, error) { - bytes, err := yaml.Marshal(obj) - if err != nil { - return nil, errors.Wrap(err, "failed to convert obj to node") - } - var node yaml.Node - err = yaml.Unmarshal(bytes, &node) - if err != nil { - return nil, errors.Wrap(err, "failed to unmarshal bytes to node") - } - return &node, nil -} diff --git a/cli/runtime/config/conversion_test.go b/cli/runtime/config/conversion_test.go deleted file mode 100644 index c6ed694f4d..0000000000 --- a/cli/runtime/config/conversion_test.go +++ /dev/null @@ -1,414 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestPopulateContexts(t *testing.T) { - tcs := []struct { - name string - ip *configapi.ClientConfig - op *configapi.ClientConfig - delta bool - }{ - { - name: "empty", - ip: &configapi.ClientConfig{}, - op: &configapi.ClientConfig{}, - delta: false, - }, - { - name: "no delta", - ip: &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - { - Name: "test-mc", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - }, - { - Name: "test-tmc", - Type: configapi.GlobalServerType, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentServer: "test-mc", - KnownContexts: []*configapi.Context{ - { - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - { - Name: "test-tmc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetK8s: "test-mc", - cliapi.TargetTMC: "test-tmc", - }, - }, - op: &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - { - Name: "test-mc", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - }, - { - Name: "test-tmc", - Type: configapi.GlobalServerType, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentServer: "test-mc", - KnownContexts: []*configapi.Context{ - { - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - { - Name: "test-tmc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetK8s: "test-mc", - cliapi.TargetTMC: "test-tmc", - }, - }, - delta: false, - }, - { - name: "w/ delta", - ip: &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - { - Name: "test-mc", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - }, - { - Name: "test-tmc", - Type: configapi.GlobalServerType, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentServer: "test-mc", - KnownContexts: []*configapi.Context{ - { - Name: "test-tmc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetTMC: "test-tmc", - }, - }, - op: &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - { - Name: "test-mc", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - }, - { - Name: "test-tmc", - Type: configapi.GlobalServerType, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentServer: "test-mc", - KnownContexts: []*configapi.Context{ - { - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - { - Name: "test-tmc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetK8s: "test-mc", - cliapi.TargetTMC: "test-tmc", - }, - }, - delta: true, - }, - } - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - delta := PopulateContexts(tc.ip) - assert.Equal(t, tc.delta, delta) - // ensure that the servers are not lost - assert.Equal(t, len(tc.op.KnownServers), len(tc.ip.KnownServers)) - assert.Equal(t, tc.op.CurrentServer, tc.ip.CurrentServer) - // ensure that the missing contexts are added - assert.Equal(t, len(tc.op.KnownContexts), len(tc.ip.KnownContexts)) - assert.Equal(t, tc.op.CurrentContext, tc.ip.CurrentContext) - }) - } -} - -func TestPopulateServers(t *testing.T) { - tcs := []struct { - name string - ip *configapi.ClientConfig - op *configapi.ClientConfig - }{ - { - name: "empty", - ip: &configapi.ClientConfig{}, - op: &configapi.ClientConfig{}, - }, - { - name: "no delta", - ip: &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - { - Name: "test-mc", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - }, - { - Name: "test-tmc", - Type: configapi.GlobalServerType, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentServer: "test-mc", - KnownContexts: []*configapi.Context{ - { - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - { - Name: "test-tmc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetK8s: "test-mc", - cliapi.TargetTMC: "test-tmc", - }, - }, - op: &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - { - Name: "test-mc", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - }, - { - Name: "test-tmc", - Type: configapi.GlobalServerType, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentServer: "test-mc", - KnownContexts: []*configapi.Context{ - { - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - { - Name: "test-tmc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetK8s: "test-mc", - cliapi.TargetTMC: "test-tmc", - }, - }, - }, - { - name: "w/ delta", - ip: &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - { - Name: "test-mc", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - }, - }, - CurrentServer: "test-mc", - KnownContexts: []*configapi.Context{ - { - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - { - Name: "test-tmc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetK8s: "test-mc", - cliapi.TargetTMC: "test-tmc", - }, - }, - op: &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - { - Name: "test-mc", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - }, - { - Name: "test-tmc", - Type: configapi.GlobalServerType, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentServer: "test-mc", - KnownContexts: []*configapi.Context{ - { - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - IsManagementCluster: true, - }, - }, - { - Name: "test-tmc", - Target: cliapi.TargetTMC, - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetK8s: "test-mc", - cliapi.TargetTMC: "test-tmc", - }, - }, - }, - } - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - populateServers(tc.ip) - // ensure that the contexts are not lost - assert.Equal(t, len(tc.op.KnownContexts), len(tc.ip.KnownContexts)) - assert.Equal(t, tc.op.CurrentContext, tc.ip.CurrentContext) - // ensure that the missing servers are added - assert.Equal(t, len(tc.op.KnownServers), len(tc.ip.KnownServers)) - assert.Equal(t, tc.op.CurrentServer, tc.ip.CurrentServer) - }) - } -} diff --git a/cli/runtime/config/discovery_sources_node.go b/cli/runtime/config/discovery_sources_node.go deleted file mode 100644 index 0fe5fcc676..0000000000 --- a/cli/runtime/config/discovery_sources_node.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "fmt" - - "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/collectionutils" - - "github.com/pkg/errors" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" -) - -// DiscoveryType constants -const ( - DiscoveryTypeOCI = "oci" - DiscoveryTypeLocal = "local" - DiscoveryTypeGCP = "gcp" - DiscoveryTypeKubernetes = "kubernetes" - DiscoveryTypeREST = "rest" -) - -const ( - Default = "default" -) - -// setDiscoverySources adds or updates the node discoverySources -func setDiscoverySources(node *yaml.Node, discoverySources []configapi.PluginDiscovery, patchStrategyOpts ...nodeutils.PatchStrategyOpts) (persist bool, err error) { - var anyPersists []bool - isTrue := func(item bool) bool { return item } - // Find the discovery sources node in the specific yaml node - keys := []nodeutils.Key{ - {Name: KeyDiscoverySources, Type: yaml.SequenceNode}, - } - discoverySourcesNode := nodeutils.FindNode(node, nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if discoverySourcesNode == nil { - return persist, err - } - // Add or update discovery sources in the discovery sources node - for _, discoverySource := range discoverySources { - persist, err = setDiscoverySource(discoverySourcesNode, discoverySource, patchStrategyOpts...) - anyPersists = append(anyPersists, persist) - if err != nil { - return persist, err - } - } - persist = collectionutils.SomeBool(anyPersists, isTrue) - return persist, err -} - -//nolint:gocyclo -func setDiscoverySource(discoverySourcesNode *yaml.Node, discoverySource configapi.PluginDiscovery, patchStrategyOpts ...nodeutils.PatchStrategyOpts) (persist bool, err error) { - // Convert discoverySource change obj to yaml node - newNode, err := convertPluginDiscoveryToNode(&discoverySource) - if err != nil { - return persist, err - } - - exists := false - var result []*yaml.Node - - // Get discovery source type and name - newOrUpdatedDiscoverySourceType, newOrUpdatedDiscoverySourceName := getDiscoverySourceTypeAndName(discoverySource) - if newOrUpdatedDiscoverySourceType == "" || newOrUpdatedDiscoverySourceName == "" { - return persist, errors.New("not found") - } - - // Loop through each discovery source node - for _, discoverySourceNode := range discoverySourcesNode.Content { - // Find discovery source by weak match - discoverySourceTypeOfAnyType, discoverySourceIndexOfAnyType := findDiscoverySourceTypeAndIndexByWeakMatch(discoverySourceNode.Content) - - // Find discovery source by exact match - discoverySourceIndexOfExactType := nodeutils.GetNodeIndex(discoverySourceNode.Content, newOrUpdatedDiscoverySourceType) - - // check if same name already exists - nameIdx := nodeutils.GetNodeIndex(discoverySourceNode.Content[discoverySourceIndexOfAnyType].Content, "name") - isSameNameAlreadyExists := discoverySourceNode.Content[discoverySourceIndexOfAnyType].Content[nameIdx].Value == newOrUpdatedDiscoverySourceName - - // If it's an exact match i.e. change discovery source type and current discovery source type is of same type proceed with regular merge - if discoverySourceIndexOfAnyType != -1 && discoverySourceIndexOfExactType != -1 { - if isSameNameAlreadyExists { - // match found proceed with regular merge - exists = true - // Delete nodes as per patch strategy defined in config-metadata.yaml - _, err = nodeutils.DeleteNodes(newNode.Content[0], discoverySourceNode, patchStrategyOpts...) - if err != nil { - return false, err - } - // Merge the new node into discovery source node - persist, err = nodeutils.MergeNodes(newNode.Content[0], discoverySourceNode) - if err != nil { - return false, err - } - } - // If not an exact match i.e. change discovery source type is of different current discovery type - } else if discoverySourceIndexOfAnyType != -1 || discoverySourceIndexOfExactType != -1 { - if isSameNameAlreadyExists { - exists = true - // Since merging discovery sources of different discovery source types we need to replace the nodes of different discovery type - options := &nodeutils.PatchStrategyOptions{} - for _, opt := range patchStrategyOpts { - opt(options) - } - replaceDiscoverySourceTypeKey := fmt.Sprintf("%v.%v", options.Key, discoverySourceTypeOfAnyType) - replaceDiscoverySourceContextTypeKey := fmt.Sprintf("%v.%v", options.Key, "contextType") - options.PatchStrategies[replaceDiscoverySourceTypeKey] = nodeutils.PatchStrategyReplace - options.PatchStrategies[replaceDiscoverySourceContextTypeKey] = nodeutils.PatchStrategyReplace - - // Delete nodes as per patch strategy defined in config-metadata.yaml - _, err = nodeutils.DeleteNodes(newNode.Content[0], discoverySourceNode, patchStrategyOpts...) - if err != nil { - return false, err - } - // Merge the new node into discovery source node - persist, err = nodeutils.MergeNodes(newNode.Content[0], discoverySourceNode) - if err != nil { - return false, err - } - } - } - result = append(result, discoverySourceNode) - } - if !exists { - result = append(result, newNode.Content[0]) - persist = true - } - discoverySourcesNode.Style = 0 - discoverySourcesNode.Content = result - return persist, err -} - -func getDiscoverySourceTypeAndName(discoverySource configapi.PluginDiscovery) (string, string) { - if discoverySource.GCP != nil && discoverySource.GCP.Name != "" { - return DiscoveryTypeGCP, discoverySource.GCP.Name - } else if discoverySource.OCI != nil && discoverySource.OCI.Name != "" { - return DiscoveryTypeOCI, discoverySource.OCI.Name - } else if discoverySource.Local != nil && discoverySource.Local.Name != "" { - return DiscoveryTypeLocal, discoverySource.Local.Name - } else if discoverySource.Kubernetes != nil && discoverySource.Kubernetes.Name != "" { - return DiscoveryTypeKubernetes, discoverySource.Kubernetes.Name - } else if discoverySource.REST != nil && discoverySource.REST.Name != "" { - return DiscoveryTypeREST, discoverySource.REST.Name - } - return "", "" -} - -// Find the matching discovery source type and index from accepted discovery sources -func findDiscoverySourceTypeAndIndexByWeakMatch(discoverySourceContentNodes []*yaml.Node) (string, int) { - acceptedDiscoverySources := []string{DiscoveryTypeOCI, DiscoveryTypeLocal, DiscoveryTypeGCP, DiscoveryTypeKubernetes, DiscoveryTypeREST} - for _, discoverySourceType := range acceptedDiscoverySources { - idx := nodeutils.GetNodeIndex(discoverySourceContentNodes, discoverySourceType) - if idx != -1 { - return discoverySourceType, idx - } - } - return "", -1 -} diff --git a/cli/runtime/config/discovery_sources_node_test.go b/cli/runtime/config/discovery_sources_node_test.go deleted file mode 100644 index d65de825bc..0000000000 --- a/cli/runtime/config/discovery_sources_node_test.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestSetDiscoverySource(t *testing.T) { - func() { - LocalDirName = TestLocalDirName - }() - defer func() { - cleanupDir(LocalDirName) - }() - tests := []struct { - name string - discoverySource configapi.PluginDiscovery - contextNode *yaml.Node - errStr string - }{ - { - name: "success k8s", - discoverySource: configapi.PluginDiscovery{ - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - - contextNode: &yaml.Node{}, - }, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - _, err := setDiscoverySource(tc.contextNode, tc.discoverySource, nil) - if tc.errStr == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - }) - } -} diff --git a/cli/runtime/config/envs.go b/cli/runtime/config/envs.go deleted file mode 100644 index 28562f7962..0000000000 --- a/cli/runtime/config/envs.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" - - "gopkg.in/yaml.v3" -) - -// GetAllEnvs retrieves all env values from config -func GetAllEnvs() (map[string]string, error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return nil, err - } - return getAllEnvs(node) -} - -func getAllEnvs(node *yaml.Node) (map[string]string, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - if cfg.ClientOptions != nil && cfg.ClientOptions.Env != nil { - return cfg.ClientOptions.Env, nil - } - return nil, errors.New("not found") -} - -// GetEnv retrieves env value by key -func GetEnv(key string) (string, error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return "", err - } - return getEnv(node, key) -} - -func getEnv(node *yaml.Node, key string) (string, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return "", err - } - if cfg.ClientOptions == nil && cfg.ClientOptions.Env == nil { - return "", errors.New("not found") - } - if val, ok := cfg.ClientOptions.Env[key]; ok { - return val, nil - } - return "", errors.New("not found") -} - -// DeleteEnv delete the env entry of specified key -func DeleteEnv(key string) error { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - err = deleteEnv(node, key) - if err != nil { - return err - } - return persistConfig(node) -} - -func deleteEnv(node *yaml.Node, key string) (err error) { - // find env node - keys := []nodeutils.Key{ - {Name: KeyClientOptions}, - {Name: KeyEnv}, - } - envsNode := nodeutils.FindNode(node.Content[0], nodeutils.WithKeys(keys)) - if envsNode == nil { - return err - } - - // convert env nodes to map - envs, err := nodeutils.ConvertNodeToMap(envsNode) - if err != nil { - return err - } - - // delete the specified entry in the map - delete(envs, key) - - // convert updated map to env node - newEnvsNode, err := nodeutils.ConvertMapToNode(envs) - if err != nil { - return err - } - envsNode.Content = newEnvsNode.Content[0].Content - return nil -} - -// SetEnv add or update a env key and value -func SetEnv(key, value string) (err error) { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - - // add or update env map - persist, err := setEnv(node, key, value) - if err != nil { - return err - } - if persist { - return persistConfig(node) - } - return err -} - -//nolint:dupl -func setEnv(node *yaml.Node, key, value string) (persist bool, err error) { - // find env node - keys := []nodeutils.Key{ - {Name: KeyClientOptions, Type: yaml.MappingNode}, - {Name: KeyEnv, Type: yaml.MappingNode}, - } - envsNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if envsNode == nil { - return persist, err - } - - // convert env node to map - envs, err := nodeutils.ConvertNodeToMap(envsNode) - if err != nil { - return persist, err - } - - // add or update the envs map per specified key value pair - if len(envs) == 0 || envs[key] != value { - envs[key] = value - persist = true - } - - // convert map to yaml node - newEnvsNode, err := nodeutils.ConvertMapToNode(envs) - if err != nil { - return false, err - } - - envsNode.Content = newEnvsNode.Content[0].Content - return persist, err -} - -// GetEnvConfigurations returns a map of configured environment variables -// to values as part of tanzu configuration file -// it returns nil if configuration is not yet defined -func GetEnvConfigurations() map[string]string { - envs, err := GetAllEnvs() - if err != nil { - return make(map[string]string) - } - return envs -} diff --git a/cli/runtime/config/envs_test.go b/cli/runtime/config/envs_test.go deleted file mode 100644 index c4159cca07..0000000000 --- a/cli/runtime/config/envs_test.go +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestGetAllEnvs(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - defer func() { - cleanupDir(LocalDirName) - }() - tests := []struct { - name string - in *configapi.ClientConfig - out map[string]string - errStr string - }{ - { - name: "success k8s", - in: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - Env: map[string]string{ - "test": "test", - }, - }, - }, - out: map[string]string{ - "test": "test", - }, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - err := StoreClientConfig(spec.in) - assert.NoError(t, err) - c, err := GetAllEnvs() - assert.NoError(t, err) - assert.Equal(t, spec.out, c) - assert.NoError(t, err) - }) - } -} - -func TestGetEnv(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - defer func() { - cleanupDir(LocalDirName) - }() - tests := []struct { - name string - in *configapi.ClientConfig - out string - errStr string - }{ - { - name: "success k8s", - in: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - Env: map[string]string{ - "test": "test", - }, - }, - }, - out: "test", - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - err := StoreClientConfig(spec.in) - assert.NoError(t, err) - c, err := GetEnv("test") - assert.NoError(t, err) - assert.Equal(t, spec.out, c) - assert.NoError(t, err) - }) - } -} - -func TestSetEnv(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - defer func() { - cleanupDir(LocalDirName) - }() - tests := []struct { - name string - key string - val string - persist bool - }{ - { - name: "should add new env to empty envs", - key: "test", - val: "test-test", - }, - { - name: "should add new env to existing envs", - key: "test2", - val: "test2", - }, - { - name: "should update existing env", - key: "test", - val: "updated-test", - }, - { - name: "should not update same env", - key: "test2", - val: "test2", - }, - } - - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - err := SetEnv(spec.key, spec.val) - assert.NoError(t, err) - val, err := GetEnv(spec.key) - assert.Equal(t, spec.val, val) - assert.NoError(t, err) - }) - } -} -func TestDeleteEnv(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - Env: map[string]string{ - "test": "test", - "test2": "test2", - "test4": "test2", - }, - }, - } - err := StoreClientConfig(cfg) - assert.NoError(t, err) - }() - defer func() { - cleanupDir(LocalDirName) - }() - tests := []struct { - name string - in string - out bool - }{ - { - name: "success delete test", - in: "test", - out: true, - }, - { - name: "success delete test2", - in: "test2", - out: true, - }, - - { - name: "success delete test3", - in: "test3", - out: true, - }, - } - - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - err := DeleteEnv(spec.in) - assert.NoError(t, err) - c, err := GetEnv(spec.in) - assert.Equal(t, "not found", err.Error()) - assert.Equal(t, spec.out, c == "") - }) - } -} diff --git a/cli/runtime/config/features.go b/cli/runtime/config/features.go deleted file mode 100644 index 25d5378dca..0000000000 --- a/cli/runtime/config/features.go +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "strconv" - "strings" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" - - "gopkg.in/yaml.v3" -) - -// IsFeatureEnabled checks and returns whether specific plugin and key is true -func IsFeatureEnabled(plugin, key string) (bool, error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return false, err - } - val, err := getFeature(node, plugin, key) - if err != nil { - return false, err - } - if strings.EqualFold(val, "true") { - return true, nil - } - return false, nil -} - -func getFeature(node *yaml.Node, plugin, key string) (string, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return "", err - } - if cfg.ClientOptions == nil || cfg.ClientOptions.Features == nil || cfg.ClientOptions.Features[plugin] == nil { - return "", errors.New("not found") - } - if val, ok := cfg.ClientOptions.Features[plugin][key]; ok { - return val, nil - } - return "", errors.New("not found") -} - -// DeleteFeature deletes the specified plugin key -func DeleteFeature(plugin, key string) error { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - err = deleteFeature(node, plugin, key) - if err != nil { - return err - } - return persistConfig(node) -} - -func deleteFeature(node *yaml.Node, plugin, key string) error { - // Find plugin node - keys := []nodeutils.Key{ - {Name: KeyClientOptions}, - {Name: KeyFeatures}, - {Name: plugin}, - } - pluginNode := nodeutils.FindNode(node.Content[0], nodeutils.WithKeys(keys)) - if pluginNode == nil { - return nil - } - plugins, err := nodeutils.ConvertNodeToMap(pluginNode) - if err != nil { - return err - } - delete(plugins, key) - newPluginsNode, err := nodeutils.ConvertMapToNode(plugins) - if err != nil { - return err - } - pluginNode.Content = newPluginsNode.Content[0].Content - return nil -} - -// SetFeature add or update plugin key value -func SetFeature(plugin, key, value string) (err error) { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - // Add or Update Feature plugin - persist, err := setFeature(node, plugin, key, value) - if err != nil { - return err - } - if persist { - return persistConfig(node) - } - return err -} - -func setFeature(node *yaml.Node, plugin, key, value string) (persist bool, err error) { - // find plugin node - keys := []nodeutils.Key{ - {Name: KeyClientOptions, Type: yaml.MappingNode}, - {Name: KeyFeatures, Type: yaml.MappingNode}, - {Name: plugin, Type: yaml.MappingNode}, - } - pluginNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if pluginNode == nil { - return persist, nodeutils.ErrNodeNotFound - } - if index := nodeutils.GetNodeIndex(pluginNode.Content, key); index != -1 { - if pluginNode.Content[index].Value != value { - pluginNode.Content[index].Tag = "!!str" - pluginNode.Content[index].Value = value - persist = true - } - } else { - pluginNode.Content = append(pluginNode.Content, nodeutils.CreateScalarNode(key, value)...) - persist = true - } - return persist, err -} - -// ConfigureDefaultFeatureFlagsIfMissing add or update plugin features based on specified default feature flags -func ConfigureDefaultFeatureFlagsIfMissing(plugin string, defaultFeatureFlags map[string]bool) error { - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - // find plugin node - keys := []nodeutils.Key{ - {Name: KeyClientOptions, Type: yaml.MappingNode}, - {Name: KeyFeatures, Type: yaml.MappingNode}, - {Name: plugin, Type: yaml.MappingNode}, - } - pluginNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if pluginNode == nil { - return nodeutils.ErrNodeNotFound - } - for key, value := range defaultFeatureFlags { - val := strconv.FormatBool(value) - if index := nodeutils.GetNodeIndex(pluginNode.Content, key); index != -1 { - pluginNode.Content[index].Value = val - } else { - pluginNode.Content = append(pluginNode.Content, nodeutils.CreateScalarNode(key, val)...) - } - } - return nil -} - -// IsFeatureActivated returns true if the given feature is activated -// User can set this CLI feature flag using `tanzu config set features.global. true` -func IsFeatureActivated(feature string) bool { - cfg, err := GetClientConfig() - if err != nil { - return false - } - status, err := cfg.IsConfigFeatureActivated(feature) - if err != nil { - return false - } - return status -} diff --git a/cli/runtime/config/features_test.go b/cli/runtime/config/features_test.go deleted file mode 100644 index be19a86bd7..0000000000 --- a/cli/runtime/config/features_test.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "strconv" - "testing" - - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestIsFeatureEnabled(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - defer func() { - cleanupDir(LocalDirName) - }() - tests := []struct { - name string - feature map[string]configapi.FeatureMap - plugin string - key string - }{ - { - name: "success context-aware-cli-for-plugins", - feature: map[string]configapi.FeatureMap{ - "global": { - "context-aware-cli-for-plugins": "true", - }, - }, - plugin: "global", - key: "context-aware-cli-for-plugins", - }, - } - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - Features: tc.feature, - }, - } - err := StoreClientConfig(cfg) - assert.NoError(t, err) - ok, err := IsFeatureEnabled(tc.plugin, tc.key) - assert.NoError(t, err) - assert.Equal(t, ok, true) - }) - } -} - -func TestSetAndDeleteFeature(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - defer func() { - cleanupDir(LocalDirName) - }() - tests := []struct { - name string - feature map[string]configapi.FeatureMap - plugin string - key string - value bool - persist bool - }{ - { - name: "success context-aware-cli-for-plugins", - feature: map[string]configapi.FeatureMap{ - "global": { - "sample": "true", - "context-aware-cli-for-plugins": "true", - }, - }, - plugin: "global", - key: "context-aware-cli-for-plugins", - value: false, - persist: true, - }, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - cfg := &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - Features: tc.feature, - }, - } - err := StoreClientConfig(cfg) - assert.NoError(t, err) - err = SetFeature(tc.plugin, tc.key, strconv.FormatBool(tc.value)) - assert.NoError(t, err) - ok, err := IsFeatureEnabled(tc.plugin, tc.key) - assert.NoError(t, err) - assert.Equal(t, ok, tc.value) - err = DeleteFeature(tc.plugin, tc.key) - assert.NoError(t, err) - ok, err = IsFeatureEnabled(tc.plugin, tc.key) - assert.Equal(t, err.Error(), "not found") - assert.Equal(t, ok, tc.value) - err = SetFeature(tc.plugin, tc.key, strconv.FormatBool(tc.value)) - assert.NoError(t, err) - }) - } -} - -func TestSetFeature(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - defer func() { - cleanupDir(LocalDirName) - }() - tests := []struct { - name string - cfg *configapi.ClientConfig - plugin string - key string - value bool - }{ - { - name: "success context-aware-cli-for-plugins", - cfg: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - Features: map[string]configapi.FeatureMap{ - "global": { - "context-aware-cli-for-plugins": "true", - }, - }, - }, - }, - plugin: "global", - key: "context-aware-cli-for-plugins", - value: false, - }, - { - name: "success context-aware-cli-for-plugins", - cfg: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - Features: map[string]configapi.FeatureMap{ - "global": { - "context-aware-cli-for-plugins": "true", - }, - }, - }, - }, - plugin: "global", - key: "context-aware-cli-for-plugins", - value: false, - }, - { - name: "should not update the same feature value", - cfg: &configapi.ClientConfig{ - ClientOptions: &configapi.ClientOptions{ - Features: map[string]configapi.FeatureMap{ - "global": { - "context-aware-cli-for-plugins": "true", - }, - }, - }, - }, - plugin: "global", - key: "context-aware-cli-for-plugins", - value: true, - }, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - err := StoreClientConfig(tc.cfg) - assert.NoError(t, err) - err = SetFeature(tc.plugin, tc.key, strconv.FormatBool(tc.value)) - assert.NoError(t, err) - ok, err := IsFeatureEnabled(tc.plugin, tc.key) - assert.NoError(t, err) - assert.Equal(t, ok, tc.value) - }) - } -} diff --git a/cli/runtime/config/fileutil.go b/cli/runtime/config/fileutil.go deleted file mode 100644 index c41bd9e506..0000000000 --- a/cli/runtime/config/fileutil.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "fmt" - "io" - "os" - "path/filepath" -) - -// copyFile copies a file from source to destination while preserving permissions. If the destination file does not -// exist, the file will be created. If the file exists, its contents will be *overwritten*. -func copyFile(src, dst string) error { - in, err := os.Open(src) - if err != nil { - return err - } - defer in.Close() - - out, err := os.Create(dst) - if err != nil { - return err - } - defer out.Close() - - if _, err := io.Copy(out, in); err != nil { - return err - } - - if err := out.Sync(); err != nil { - return err - } - - sf, err := os.Stat(src) - if err != nil { - return err - } - if err := os.Chmod(dst, sf.Mode()); err != nil { - return err - } - return nil -} - -// copyDir copies a directory tree recursively. Source directory must exist and destination directory must *not* -// exist. This function ignores symlinks. -func copyDir(src, dst string) error { - src = filepath.Clean(src) - dst = filepath.Clean(dst) - - sf, err := os.Stat(src) - if err != nil { - return err - } - if !sf.IsDir() { - return fmt.Errorf("source is not a directory") - } - - _, err = os.Stat(dst) - if err != nil && !os.IsNotExist(err) { - return fmt.Errorf("destination already exists") - } - - if err := os.MkdirAll(dst, sf.Mode()); err != nil { - return err - } - - entries, err := os.ReadDir(src) - if err != nil { - return err - } - for _, entry := range entries { - srcPath := filepath.Join(src, entry.Name()) - dstPath := filepath.Join(dst, entry.Name()) - - if entry.IsDir() { - if err := copyDir(srcPath, dstPath); err != nil { - return err - } - } else { - // Skip symlinks. - if entry.Type()&os.ModeSymlink != 0 { - continue - } - if err := copyFile(srcPath, dstPath); err != nil { - return err - } - } - } - return nil -} - -// fileExists checks if a file, directory or symlink exists. This function follows symlinks and verifies that -// the target of symlink exists. -func fileExists(filename string) (bool, error) { - _, err := os.Stat(filename) - if os.IsNotExist(err) { - return false, nil - } - if err != nil { - return false, err - } - return true, nil -} diff --git a/cli/runtime/config/helpers_test.go b/cli/runtime/config/helpers_test.go deleted file mode 100644 index 0170a1f423..0000000000 --- a/cli/runtime/config/helpers_test.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -type CfgTestData struct { - cfg string - cfgNextGen string - cfgMetadata string -} - -func setupTestConfig(t *testing.T, data *CfgTestData) (files []*os.File, cleanup func()) { - // Setup config data - cfgFile, err := os.CreateTemp("", "tanzu_config") - assert.Nil(t, err) - err = os.WriteFile(cfgFile.Name(), []byte(data.cfg), 0644) - assert.Nil(t, err) - - err = os.Setenv(EnvConfigKey, cfgFile.Name()) - assert.NoError(t, err) - - cfgNextGenFile, err := os.CreateTemp("", "tanzu_config_ng") - assert.Nil(t, err) - err = os.WriteFile(cfgNextGenFile.Name(), []byte(data.cfgNextGen), 0644) - assert.Nil(t, err) - - err = os.Setenv(EnvConfigNextGenKey, cfgNextGenFile.Name()) - assert.NoError(t, err) - - cfgMetadataFile, err := os.CreateTemp("", "tanzu_config_metadata") - assert.Nil(t, err) - err = os.WriteFile(cfgMetadataFile.Name(), []byte(data.cfgMetadata), 0644) - assert.Nil(t, err) - - err = os.Setenv(EnvConfigMetadataKey, cfgMetadataFile.Name()) - assert.NoError(t, err) - - cleanup = func() { - err = os.Remove(cfgFile.Name()) - assert.NoError(t, err) - - err = os.Remove(cfgNextGenFile.Name()) - assert.NoError(t, err) - - err = os.Remove(cfgMetadataFile.Name()) - assert.NoError(t, err) - } - - return []*os.File{cfgFile, cfgNextGenFile, cfgMetadataFile}, cleanup -} - -func setupConfigMetadataWithMigrateToNewConfig() string { - metadata := `configMetadata: - settings: - useUnifiedConfig: true` - - return metadata -} - -func setupMultiCfgData() (string, string) { - cfg := `servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: test-ctx-endpoint - path: test-ctx-path - context: test-ctx-context - discoverySources: - - gcp: - name: test - bucket: test-ctx-bucket - manifestPath: test-ctx-manifest-path - contextType: tmc - - name: test-mc2 - type: managementcluster - managementClusterOpts: - endpoint: test-ctx-endpoint - path: test-ctx-path - context: test-ctx-context - discoverySources: - - gcp: - name: test - bucket: test-ctx-bucket - manifestPath: test-ctx-manifest-path - contextType: tmc - - gcp: - name: test2 - bucket: test-ctx-bucket - manifestPath: test-ctx-manifest-path - contextType: tmc - - name: test-mc3 - type: managementcluster - managementClusterOpts: - endpoint: test-ctx-endpoint - path: test-ctx-path - context: test-ctx-context - discoverySources: - - gcp: - name: test - bucket: test-ctx-bucket - manifestPath: test-ctx-manifest-path - contextType: tmc -current: test-mc -` - cfg2 := `currentContext: - kubernetes: test-mc -contexts: - - name: test-mc - ctx-field: new-ctx-field - optional: true - target: kubernetes - clusterOpts: - isManagementCluster: true - endpoint: test-endpoint - annotation: one - required: true - annotationStruct: - one: one - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test2 - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - name: test-mc2 - ctx-field: new-ctx-field - optional: true - target: kubernetes - clusterOpts: - isManagementCluster: true - endpoint: test-endpoint - annotation: one - required: true - annotationStruct: - one: one - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test2 - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - name: test-mc3 - ctx-field: new-ctx-field - optional: true - target: kubernetes - clusterOpts: - isManagementCluster: true - endpoint: test-endpoint - annotation: one - required: true - annotationStruct: - one: one - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test2 - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc -` - return cfg, cfg2 -} diff --git a/cli/runtime/config/legacy_clientconfig.go b/cli/runtime/config/legacy_clientconfig.go deleted file mode 100644 index f9dc805e72..0000000000 --- a/cli/runtime/config/legacy_clientconfig.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - - "github.com/aunum/log" - "github.com/pkg/errors" - "gopkg.in/yaml.v3" -) - -// CopyLegacyConfigDir copies configuration files from legacy config dir to the new location. This is a no-op if the legacy dir -// does not exist or if the new config dir already exists. -func CopyLegacyConfigDir() error { - legacyPath, err := legacyLocalDir() - if err != nil { - return err - } - legacyPathExists, err := fileExists(legacyPath) - if err != nil { - return err - } - newPath, err := LocalDir() - if err != nil { - return err - } - newPathExists, err := fileExists(newPath) - if err != nil { - return err - } - if legacyPathExists && !newPathExists { - if err := copyDir(legacyPath, newPath); err != nil { - return nil - } - log.Warningf("Configuration is now stored in %s. Legacy configuration directory %s is deprecated and will be removed in a future release.", newPath, legacyPath) - log.Warningf("To complete migration, please remove legacy configuration directory %s and adjust your script(s), if any, to point to the new location.", legacyPath) - } - return nil -} - -// storeConfigToLegacyDir stores configuration to legacy dir and logs warning in case of errors. -func storeConfigToLegacyDir(data []byte) { - var ( - err error - legacyDir, legacyCfgPath string - legacyDirExists bool - ) - - defer func() { - if err != nil { - log.Warningf("Failed to write config to legacy location for backward compatibility: %v", err) - log.Warningf("To stop writing config to legacy location, please point your script(s), "+ - "if any, to the new config directory and remove legacy config directory %s", legacyDir) - } - }() - - legacyDir, err = legacyLocalDir() - if err != nil { - return - } - legacyDirExists, err = fileExists(legacyDir) - if err != nil || !legacyDirExists { - // Assume user has migrated and ignore writing to legacy location if that dir does not exist. - return - } - legacyCfgPath, err = legacyConfigPath() - if err != nil { - return - } - err = os.WriteFile(legacyCfgPath, data, 0644) -} - -// persistLegacyClientConfig write to config.yaml -func persistLegacyClientConfig(node *yaml.Node) error { - data, err := yaml.Marshal(node) - if err != nil { - return errors.Wrap(err, "failed to marshal nodeutils") - } - storeConfigToLegacyDir(data) - return nil -} diff --git a/cli/runtime/config/legacy_clientconfig_factory.go b/cli/runtime/config/legacy_clientconfig_factory.go deleted file mode 100644 index 9d5806d0de..0000000000 --- a/cli/runtime/config/legacy_clientconfig_factory.go +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -// GetClientConfig retrieves the config from the local directory with file lock -func GetClientConfig() (cfg *configapi.ClientConfig, err error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return nil, err - } - - cfg, err = convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - - return cfg, nil -} - -// GetClientConfigNoLock retrieves the config from the local directory without acquiring the lock -func GetClientConfigNoLock() (cfg *configapi.ClientConfig, err error) { - node, err := getClientConfigNodeNoLock() - if err != nil { - return nil, err - } - - cfg, err = convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - return cfg, nil -} - -// StoreClientConfig stores the config in the local directory. -// Make sure to Acquire and Release tanzu lock when reading/writing to the -// tanzu client configuration -// Deprecated: StoreClientConfig is deprecated. Avoid using this method for Delete operations. Use New Config API methods. -func StoreClientConfig(cfg *configapi.ClientConfig) error { - // new plugins would be setting only contexts, so populate servers for backwards compatibility - populateServers(cfg) - // old plugins would be setting only servers, so populate contexts for forwards compatibility - PopulateContexts(cfg) - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - if cfg.Kind != "" { - _, err = setKind(node, cfg.Kind) - if err != nil { - return err - } - } - if cfg.APIVersion != "" { - _, err = setAPIVersion(node, cfg.APIVersion) - if err != nil { - return err - } - } - err = setServers(node, cfg.KnownServers) - if err != nil { - return err - } - if cfg.CurrentServer != "" { - _, err = setCurrentServer(node, cfg.CurrentServer) - if err != nil { - return err - } - } - err = setContexts(node, cfg.KnownContexts) - if err != nil { - return err - } - err = clientConfigSetCurrentContext(cfg, node) - if err != nil { - return err - } - err = clientConfigSetClientOptions(cfg, node) - if err != nil { - return err - } - return persistConfig(node) -} - -func clientConfigSetClientOptions(cfg *configapi.ClientConfig, node *yaml.Node) error { - if cfg.ClientOptions != nil { - err := clientConfigSetFeatures(cfg, node) - if err != nil { - return err - } - err = clientConfigSetEnvs(cfg, node) - if err != nil { - return err - } - err = clientConfigSetCLI(cfg, node) - if err != nil { - return err - } - } - return nil -} - -func clientConfigSetCLI(cfg *configapi.ClientConfig, node *yaml.Node) (err error) { - if cfg.ClientOptions.CLI != nil { - err = clientConfigSetCLIRepositories(cfg, node) - if err != nil { - return err - } - err = clientConfigSetCLIDiscoverySources(cfg, node) - if err != nil { - return err - } - if cfg.ClientOptions.CLI.UnstableVersionSelector != "" { - setUnstableVersionSelector(node, string(cfg.ClientOptions.CLI.UnstableVersionSelector)) - } - //nolint:staticcheck - // Disable deprecated lint warning - if cfg.ClientOptions.CLI.Edition != "" { - setEdition(node, string(cfg.ClientOptions.CLI.Edition)) - } - //nolint:staticcheck - // Disable deprecated lint warning - if cfg.ClientOptions.CLI.BOMRepo != "" { - setBomRepo(node, cfg.ClientOptions.CLI.BOMRepo) - } - //nolint:staticcheck - // Disable deprecated lint warning - if cfg.ClientOptions.CLI.CompatibilityFilePath != "" { - setCompatibilityFilePath(node, cfg.ClientOptions.CLI.CompatibilityFilePath) - } - } - return nil -} - -func clientConfigSetCLIDiscoverySources(cfg *configapi.ClientConfig, node *yaml.Node) error { - if cfg.ClientOptions.CLI.DiscoverySources != nil && len(cfg.ClientOptions.CLI.DiscoverySources) != 0 { - err := setCLIDiscoverySources(node, cfg.ClientOptions.CLI.DiscoverySources) - if err != nil { - return err - } - } - return nil -} - -func clientConfigSetCLIRepositories(cfg *configapi.ClientConfig, node *yaml.Node) error { - if cfg.ClientOptions.CLI.Repositories != nil && len(cfg.ClientOptions.CLI.Repositories) != 0 { - err := setCLIRepositories(node, cfg.ClientOptions.CLI.Repositories) - if err != nil { - return err - } - } - return nil -} - -func clientConfigSetEnvs(cfg *configapi.ClientConfig, node *yaml.Node) error { - if cfg.ClientOptions.Env != nil { - for key, value := range cfg.ClientOptions.Env { - _, err := setEnv(node, key, value) - if err != nil { - return err - } - } - } - return nil -} - -func clientConfigSetFeatures(cfg *configapi.ClientConfig, node *yaml.Node) error { - if cfg.ClientOptions.Features != nil { - for plugin := range cfg.ClientOptions.Features { - for key, value := range cfg.ClientOptions.Features[plugin] { - _, err := setFeature(node, plugin, key, value) - if err != nil { - return err - } - } - } - } - return nil -} - -func clientConfigSetCurrentContext(cfg *configapi.ClientConfig, node *yaml.Node) error { - if cfg.CurrentContext != nil { - for _, contextName := range cfg.CurrentContext { - ctx, contextErr := cfg.GetContext(contextName) - if contextErr != nil { - return contextErr - } - _, err := setCurrentContext(node, ctx) - if err != nil { - return err - } - } - } - return nil -} - -// DeleteClientConfig deletes the config yaml from the local directory. -func DeleteClientConfig() error { - cfgPath, err := ClientConfigPath() - if err != nil { - return err - } - err = os.Remove(cfgPath) - if err != nil { - return errors.Wrap(err, "could not remove config") - } - return nil -} - -// DeleteClientConfigNextGen deletes the config-ng yaml from the local directory. -func DeleteClientConfigNextGen() error { - cfgPath, err := ClientConfigNextGenPath() - if err != nil { - return err - } - err = os.Remove(cfgPath) - if err != nil { - return errors.Wrap(err, "could not remove config-ng") - } - return nil -} diff --git a/cli/runtime/config/legacy_clientconfig_factory_test.go b/cli/runtime/config/legacy_clientconfig_factory_test.go deleted file mode 100644 index 5e2a10543a..0000000000 --- a/cli/runtime/config/legacy_clientconfig_factory_test.go +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestStoreClientConfig(t *testing.T) { - cfg, expectedCfg, cfg2, expectedCfg2, c := setupStoreClientConfigData() - - // Setup config data - cfgTestFiles, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2}) - - defer func() { - cleanUp() - }() - - // Action - err := StoreClientConfig(c) - assert.NoError(t, err) - - file, err := os.ReadFile(cfgTestFiles[0].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg, string(file)) - - file, err = os.ReadFile(cfgTestFiles[1].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg2, string(file)) -} - -func setupStoreClientConfigData() (string, string, string, string, *configapi.ClientConfig) { - cfg := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "/:" - unknown: cli-unknown - contextType: k8s - - local: - name: default-local - contextType: k8s - - local: - name: admin-local - path: admin -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: updated-test-endpoint - path: updated-test-path - context: updated-test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: one - required: true - contextType: tmc -current: test-mc -` - - cfg2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -` - expectedCfg := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "/:" - unknown: cli-unknown - contextType: k8s - - local: - name: default-local - contextType: k8s - - local: - name: admin-local - path: admin - - gcp: - name: test - bucket: ctx-test-bucket - manifestPath: ctx-test-manifest-path - repositories: - - gcpPluginRepository: - name: test - bucketName: bucket - rootPath: root-path - unstableVersionSelector: unstable-version - edition: test=tkg - bomRepo: test-bomrepo - compatibilityFilePath: test-compatibility-file-path -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: test-endpoint - path: test-path - context: test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc -current: test-mc -` - - expectedCfg2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-context-endpoint - path: test-context-path - context: test-context - discoverySources: - - local: - name: test - path: test-local-path - - gcp: - name: test2 - bucket: ctx-test-bucket - manifestPath: ctx-test-manifest-path -currentContext: - kubernetes: test-mc -` - - c := &configapi.ClientConfig{ - KnownServers: []*configapi.Server{ - { - Name: "test-mc", - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Context: "test-context", - Path: "test-path", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - CurrentServer: "test-mc", - KnownContexts: []*configapi.Context{ - { - Name: "test-mc", - Target: cliapi.TargetK8s, - ClusterOpts: &configapi.ClusterServer{ - Endpoint: "test-context-endpoint", - Path: "test-context-path", - Context: "test-context", - IsManagementCluster: true, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test2", - Bucket: "ctx-test-bucket", - ManifestPath: "ctx-test-manifest-path", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "test", - Path: "test-local-path", - }, - }, - }, - }, - }, - CurrentContext: map[cliapi.Target]string{ - cliapi.TargetK8s: "test-mc", - }, - ClientOptions: &configapi.ClientOptions{ - CLI: &configapi.CLIOptions{ - Repositories: []configapi.PluginRepository{ - { - GCPPluginRepository: &configapi.GCPPluginRepository{ - Name: "test", - BucketName: "bucket", - RootPath: "root-path", - }, - }, - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "ctx-test-bucket", - ManifestPath: "ctx-test-manifest-path", - }, - }, - }, - UnstableVersionSelector: configapi.VersionSelectorLevel("unstable-version"), - Edition: configapi.EditionSelector("test=tkg"), - BOMRepo: "test-bomrepo", - CompatibilityFilePath: "test-compatibility-file-path", - }, - }, - } - return cfg, expectedCfg, cfg2, expectedCfg2, c -} diff --git a/cli/runtime/config/legacy_clientconfig_filesystem.go b/cli/runtime/config/legacy_clientconfig_filesystem.go deleted file mode 100644 index 0f7b4c8365..0000000000 --- a/cli/runtime/config/legacy_clientconfig_filesystem.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "path/filepath" -) - -var ( - // legacyLocalDirName is the name of the old local directory in which to look for tanzu state. This will be - // removed in the future in favor of LocalDirName. - legacyLocalDirName = ".tanzu" -) - -func legacyLocalDir() (path string, err error) { - return localDirPath(legacyLocalDirName) -} - -// legacyConfigPath returns the legacy tanzu config path, checking for environment overrides. -func legacyConfigPath() (path string, err error) { - return legacyCfgPath(legacyLocalDir) -} - -// legacyCfgPath constructs the full config path -func legacyCfgPath(localDirGetter func() (string, error)) (path string, err error) { - localDir, err := localDirGetter() - if err != nil { - return path, err - } - path = filepath.Join(localDir, ConfigName) - return path, nil -} diff --git a/cli/runtime/config/lock.go b/cli/runtime/config/lock.go deleted file mode 100644 index 9f0bc741bb..0000000000 --- a/cli/runtime/config/lock.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "fmt" - "os" - "path/filepath" - "sync" - "time" - - "github.com/juju/fslock" - "github.com/pkg/errors" -) - -const ( - LocalTanzuFileLock = ".tanzu.lock" - // DefaultLockTimeout is the default time waiting on the filelock - DefaultLockTimeout = 10 * time.Minute -) - -var tanzuConfigLockFile string - -// tanzuConfigLock used as a static lock variable that stores fslock -// This is used for interprocess locking of the config file -var tanzuConfigLock *fslock.Lock - -// mutex is used to handle the locking behavior between concurrent calls -// within the existing process trying to acquire the lock -var mutex sync.Mutex - -// AcquireTanzuConfigLock tries to acquire lock to update tanzu config file with timeout -func AcquireTanzuConfigLock() { - var err error - - if tanzuConfigLockFile == "" { - path, err := ClientConfigPath() - if err != nil { - panic(fmt.Sprintf("cannot get config path while acquiring lock on tanzu config file, reason: %v", err)) - } - tanzuConfigLockFile = filepath.Join(filepath.Dir(path), LocalTanzuFileLock) - } - - // using fslock to handle interprocess locking - lock, err := getFileLockWithTimeOut(tanzuConfigLockFile, DefaultLockTimeout) - if err != nil { - panic(fmt.Sprintf("cannot acquire lock for tanzu config file, reason: %v", err)) - } - - // Lock the mutex to prevent concurrent calls to acquire and configure the tanzuConfigLock - mutex.Lock() - tanzuConfigLock = lock - - // Get lock on config-ng.yaml - AcquireTanzuConfigNextGenLock() -} - -// ReleaseTanzuConfigLock releases the lock if the tanzuConfigLock was acquired -func ReleaseTanzuConfigLock() { - if tanzuConfigLock == nil { - return - } - if errUnlock := tanzuConfigLock.Unlock(); errUnlock != nil { - panic(fmt.Sprintf("cannot release lock for tanzu config file, reason: %v", errUnlock)) - } - - tanzuConfigLock = nil - // Unlock the mutex to allow other concurrent calls to acquire and configure the tanzuConfigLock - mutex.Unlock() - - // Release lock on config-ng.yaml - ReleaseTanzuConfigNextGenLock() -} - -// getFileLockWithTimeOut returns a file lock with timeout -func getFileLockWithTimeOut(lockPath string, lockDuration time.Duration) (*fslock.Lock, error) { - dir := filepath.Dir(lockPath) - - if _, err := os.Stat(dir); os.IsNotExist(err) { - if err := os.MkdirAll(dir, 0o700); err != nil { - return nil, err - } - } - - lock := fslock.New(lockPath) - - if err := lock.LockWithTimeout(lockDuration); err != nil { - return nil, errors.Wrap(err, "failed to acquire a lock with timeout") - } - return lock, nil -} diff --git a/cli/runtime/config/metadata_api.go b/cli/runtime/config/metadata_api.go deleted file mode 100644 index a99d357966..0000000000 --- a/cli/runtime/config/metadata_api.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "strings" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" - - "gopkg.in/yaml.v3" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -// GetMetadata retrieves Metadata -func GetMetadata() (*configapi.Metadata, error) { - // Retrieve config metadata node - node, err := getMetadataNode() - if err != nil { - return nil, err - } - return getMetadata(node) -} - -// GetConfigMetadata retrieves configMetadata -func GetConfigMetadata() (*configapi.ConfigMetadata, error) { - // Retrieve config metadata node - node, err := getMetadataNode() - if err != nil { - return nil, err - } - return getConfigMetadata(node) -} - -// GetConfigMetadataPatchStrategy retrieves patch strategies -func GetConfigMetadataPatchStrategy() (map[string]string, error) { - // Retrieve config metadata node - AcquireTanzuMetadataLock() - defer ReleaseTanzuMetadataLock() - node, err := getMetadataNodeNoLock() - if err != nil { - return nil, err - } - return getConfigMetadataPatchStrategy(node) -} - -// SetConfigMetadataPatchStrategy add or update patch strategy specified by key-value pair -func SetConfigMetadataPatchStrategy(key, value string) error { - // Retrieve config metadata node - AcquireTanzuMetadataLock() - defer ReleaseTanzuMetadataLock() - node, err := getMetadataNodeNoLock() - if err != nil { - return err - } - - // Add or update patch strategy - err = setConfigMetadataPatchStrategy(node, key, value) - if err != nil { - return err - } - return persistConfigMetadata(node) -} - -// SetConfigMetadataPatchStrategies add or update map of patch strategies -func SetConfigMetadataPatchStrategies(patchStrategies map[string]string) error { - // Retrieve config metadata node - AcquireTanzuMetadataLock() - defer ReleaseTanzuMetadataLock() - node, err := getMetadataNodeNoLock() - if err != nil { - return err - } - - // Add or update patch strategies - err = setConfigMetadataPatchStrategies(node, patchStrategies) - if err != nil { - return err - } - return persistConfigMetadata(node) -} - -func getConfigMetadata(node *yaml.Node) (*configapi.ConfigMetadata, error) { - metadata, err := convertNodeToMetadata(node) - if err != nil { - return nil, err - } - - if metadata != nil && metadata.ConfigMetadata != nil { - return metadata.ConfigMetadata, nil - } - - return nil, errors.New("config metadata not found") -} - -func getMetadata(node *yaml.Node) (*configapi.Metadata, error) { - metadata, err := convertNodeToMetadata(node) - if err != nil { - return nil, err - } - return metadata, nil -} - -func getConfigMetadataPatchStrategy(node *yaml.Node) (map[string]string, error) { - metadata, err := convertNodeToMetadata(node) - if err != nil { - return nil, err - } - if metadata != nil && metadata.ConfigMetadata != nil && - metadata.ConfigMetadata.PatchStrategy != nil { - return metadata.ConfigMetadata.PatchStrategy, nil - } - return nil, errors.New("config metadata patch strategy not found") -} - -func setConfigMetadataPatchStrategies(node *yaml.Node, patchStrategies map[string]string) error { - for key, value := range patchStrategies { - err := setConfigMetadataPatchStrategy(node, key, value) - if err != nil { - return err - } - } - return nil -} - -func setConfigMetadataPatchStrategy(node *yaml.Node, key, value string) error { - if !strings.EqualFold(value, "replace") && !strings.EqualFold(value, "merge") { - return errors.New("allowed values are replace or merge") - } - - // find patch strategy node - keys := []nodeutils.Key{ - {Name: KeyConfigMetadata, Type: yaml.MappingNode}, - {Name: KeyPatchStrategy, Type: yaml.MappingNode}, - } - patchStrategyNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if patchStrategyNode == nil { - return nodeutils.ErrNodeNotFound - } - if index := nodeutils.GetNodeIndex(patchStrategyNode.Content, key); index != -1 { - patchStrategyNode.Content[index].Tag = nodeutils.NodeTagStr - patchStrategyNode.Content[index].Value = value - } else { - patchStrategyNode.Content = append(patchStrategyNode.Content, nodeutils.CreateScalarNode(key, value)...) - } - return nil -} diff --git a/cli/runtime/config/metadata_api_test.go b/cli/runtime/config/metadata_api_test.go deleted file mode 100644 index bd24aa85a9..0000000000 --- a/cli/runtime/config/metadata_api_test.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestGetMetadata(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - - defer func() { - cleanupDir(LocalDirName) - }() - - tests := []struct { - name string - in string - out *configapi.Metadata - errStr string - }{ - { - name: "success empty metadata", - in: ``, - out: &configapi.Metadata{}, - }, - { - name: "success with patch strategies", - in: `configMetadata: - patchStrategy: - contexts.group: replace - contexts.clusterOpts.annotation: replace - contexts.discoverySources.gcp.annotation: replace`, - out: &configapi.Metadata{ - ConfigMetadata: &configapi.ConfigMetadata{ - PatchStrategy: map[string]string{ - "contexts.group": "replace", - "contexts.discoverySources.gcp.annotation": "replace", - "contexts.clusterOpts.annotation": "replace", - }, - }, - }, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{cfgMetadata: spec.in}) - - defer func() { - cleanUp() - }() - - //Test case - c, err := GetMetadata() - assert.Equal(t, c, spec.out) - assert.NoError(t, err) - }) - } -} - -func TestGetConfigMetadata(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - - defer func() { - cleanupDir(LocalDirName) - }() - - tests := []struct { - name string - in string - out *configapi.ConfigMetadata - errStr string - }{ - { - name: "success empty metadata", - in: ``, - out: &configapi.ConfigMetadata{}, - errStr: "config metadata not found", - }, - { - name: "success with patch strategies", - in: `configMetadata: - patchStrategy: - contexts.group: replace - contexts.clusterOpts.annotation: replace - contexts.discoverySources.gcp.annotation: replace`, - out: &configapi.ConfigMetadata{ - PatchStrategy: map[string]string{ - "contexts.group": "replace", - "contexts.discoverySources.gcp.annotation": "replace", - "contexts.clusterOpts.annotation": "replace", - }, - }, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{cfgMetadata: spec.in}) - - defer func() { - cleanUp() - }() - - //Test case - c, err := GetConfigMetadata() - if spec.errStr != "" { - assert.Equal(t, spec.errStr, err.Error()) - } else { - assert.Equal(t, c, spec.out) - assert.NoError(t, err) - } - }) - } -} - -func TestSetConfigMetadataPatchStrategy(t *testing.T) { - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tests := []struct { - name string - key string - value string - errStr string - }{ - { - name: "success add new patch strategy", - key: "contexts.group", - value: "replace", - }, - { - name: "success update existing patch strategy", - key: "contexts.group", - value: "merge", - }, - { - name: "success add existing patch strategy", - key: "contexts.group2", - value: "replace", - }, - { - name: "failed add new patch strategy invalid value", - key: "contexts.clusterOpts.annotation", - value: "add", - errStr: "allowed values are replace or merge", - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - err := SetConfigMetadataPatchStrategy(spec.key, spec.value) - if spec.errStr != "" { - assert.Equal(t, err.Error(), spec.errStr) - c, err := GetConfigMetadataPatchStrategy() - assert.NoError(t, err) - assert.Equal(t, "", c[spec.key]) - } else { - assert.NoError(t, err) - c, err := GetConfigMetadataPatchStrategy() - assert.NoError(t, err) - assert.Equal(t, c[spec.key], spec.value) - } - }) - } -} diff --git a/cli/runtime/config/metadata_factory.go b/cli/runtime/config/metadata_factory.go deleted file mode 100644 index 77218db629..0000000000 --- a/cli/runtime/config/metadata_factory.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Skip duplicate that matching with metadata config file - -//nolint:dupl -package config - -import ( - "os" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -// getMetadataNode retrieves the config from the local directory with lock -func getMetadataNode() (*yaml.Node, error) { - // Retrieve config metadata node - AcquireTanzuMetadataLock() - defer ReleaseTanzuMetadataLock() - return getMetadataNodeNoLock() -} - -// getMetadataNodeNoLock retrieves the config from the local directory without acquiring the lock -func getMetadataNodeNoLock() (*yaml.Node, error) { - cfgPath, err := CfgMetadataFilePath() - if err != nil { - return nil, errors.Wrap(err, "failed getting config metadata path") - } - - bytes, err := os.ReadFile(cfgPath) - if err != nil || len(bytes) == 0 { - node, err := newMetadataNode() - if err != nil { - return nil, errors.Wrap(err, "failed to create new config metadata") - } - return node, nil - } - var node yaml.Node - - err = yaml.Unmarshal(bytes, &node) - if err != nil { - return nil, errors.Wrap(err, "failed to construct struct from config metadata data") - } - node.Content[0].Style = 0 - - return &node, nil -} - -func newMetadataNode() (*yaml.Node, error) { - c := &configapi.Metadata{} - node, err := convertMetadataToNode(c) - node.Content[0].Style = 0 - if err != nil { - return nil, err - } - return node, nil -} - -func persistConfigMetadata(node *yaml.Node) error { - path, err := CfgMetadataFilePath() - if err != nil { - return errors.Wrap(err, "could not find config metadata path") - } - return persistNode(node, WithCfgPath(path)) -} diff --git a/cli/runtime/config/metadata_factory_test.go b/cli/runtime/config/metadata_factory_test.go deleted file mode 100644 index 41efee254e..0000000000 --- a/cli/runtime/config/metadata_factory_test.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "context" - "fmt" - "testing" - - "github.com/stretchr/testify/assert" - - "golang.org/x/sync/errgroup" -) - -func TestConfigMetadataNodeUpdateInParallel(t *testing.T) { - addPatchStrategy := func(key, value string) error { - // Get config metadata node - _, err := getMetadataNode() - if err != nil { - return err - } - - // Set patch strategy - err = SetConfigMetadataPatchStrategy(key, value) - if err != nil { - return err - } - - // Get config metadata node - _, err = getMetadataNode() - return err - } - - // Run the parallel tests of reading and updating the configuration file - // multiple times to make sure all the attempts are successful - for testCounter := 1; testCounter <= 5; testCounter++ { - func() { - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - // run addPatchStrategy in parallel - parallelExecutionCounter := 100 - group, _ := errgroup.WithContext(context.Background()) - for i := 1; i <= parallelExecutionCounter; i++ { - id := i - group.Go(func() error { - return addPatchStrategy(fmt.Sprintf("p%v", id), "replace") - }) - } - _ = group.Wait() - - // Make sure that the configuration file is not corrupted - node, err := getMetadataNode() - assert.Nil(t, err) - // Make sure all expected patch strategies are added to the patchStrategy list - assert.Equal(t, parallelExecutionCounter, len(node.Content[0].Content[1].Content[1].Content)/2) - }() - } -} diff --git a/cli/runtime/config/metadata_filesystem.go b/cli/runtime/config/metadata_filesystem.go deleted file mode 100644 index 197e10e545..0000000000 --- a/cli/runtime/config/metadata_filesystem.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "path/filepath" -) - -const ( - // EnvConfigMetadataKey is the environment variable that points to a tanzu config. - EnvConfigMetadataKey = "TANZU_CONFIG_METADATA" - - // CfgMetadataName is the name of the config metadata hidden file - CfgMetadataName = ".config-metadata.yaml" -) - -// metadataPath constructs the full config path, checking for environment overrides. -func metadataPath(localDirGetter func() (string, error)) (path string, err error) { - localDir, err := localDirGetter() - if err != nil { - return path, err - } - var ok bool - path, ok = os.LookupEnv(EnvConfigMetadataKey) - if !ok { - path = filepath.Join(localDir, CfgMetadataName) - return - } - return -} - -func CfgMetadataFilePath() (path string, err error) { - return metadataPath(LocalDir) -} diff --git a/cli/runtime/config/metadata_keys.go b/cli/runtime/config/metadata_keys.go deleted file mode 100644 index f1b58ebd4b..0000000000 --- a/cli/runtime/config/metadata_keys.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -// Keys used to parse the yaml node to retrieve specific stanza of the config file -const ( - KeyConfigMetadata = "configMetadata" - KeyPatchStrategy = "patchStrategy" - KeySettings = "settings" -) diff --git a/cli/runtime/config/metadata_lock.go b/cli/runtime/config/metadata_lock.go deleted file mode 100644 index 21d8dbed0b..0000000000 --- a/cli/runtime/config/metadata_lock.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//nolint:dupl -package config - -import ( - "fmt" - "path/filepath" - "sync" - "time" - - "github.com/juju/fslock" -) - -const ( - LocalTanzuMetadataFileLock = ".tanzu-metadata.lock" - // DefaultMetadataLockTimeout is the default time waiting on the filelock - DefaultMetadataLockTimeout = 10 * time.Minute -) - -var tanzuMetadataLockFile string - -// tanzuMetadataLock used as a static lock variable that stores fslock -// This is used for interprocess locking of the config file -var tanzuMetadataLock *fslock.Lock - -// mutexMetadata is used to handle the locking behavior between concurrent calls -// within the existing process trying to acquire the lock -var mutexMetadata sync.Mutex - -// AcquireTanzuMetadataLock tries to acquire lock to update tanzu config metadata file with timeout -func AcquireTanzuMetadataLock() { - var err error - - if tanzuMetadataLockFile == "" { - path, err := CfgMetadataFilePath() - if err != nil { - panic(fmt.Sprintf("cannot get config path while acquiring lock on tanzu config metadata file, reason: %v", err)) - } - tanzuMetadataLockFile = filepath.Join(filepath.Dir(path), LocalTanzuMetadataFileLock) - } - - // using fslock to handle interprocess locking - lock, err := getFileLockWithTimeOut(tanzuMetadataLockFile, DefaultMetadataLockTimeout) - if err != nil { - panic(fmt.Sprintf("cannot acquire lock for tanzu config metadata file, reason: %v", err)) - } - - // Lock the mutex to prevent concurrent calls to acquire and configure the tanzuMetadataLock - mutexMetadata.Lock() - tanzuMetadataLock = lock -} - -// ReleaseTanzuMetadataLock releases the lock if the tanzuMetadataLock was acquired -func ReleaseTanzuMetadataLock() { - if tanzuMetadataLock == nil { - return - } - if errUnlock := tanzuMetadataLock.Unlock(); errUnlock != nil { - panic(fmt.Sprintf("cannot release lock for tanzu config metadata file, reason: %v", errUnlock)) - } - - tanzuMetadataLock = nil - // Unlock the mutex to allow other concurrent calls to acquire and configure the tanzuMetadataLock - mutexMetadata.Unlock() -} diff --git a/cli/runtime/config/metadata_settings_api.go b/cli/runtime/config/metadata_settings_api.go deleted file mode 100644 index 711969495a..0000000000 --- a/cli/runtime/config/metadata_settings_api.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "strings" - - "github.com/pkg/errors" - - "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" -) - -const ( - SettingUseUnifiedConfig = "useUnifiedConfig" -) - -// GetConfigMetadataSettings retrieves feature flags -func GetConfigMetadataSettings() (map[string]string, error) { - // Retrieve Metadata config node - node, err := getMetadataNode() - if err != nil { - return nil, err - } - - return getSettings(node) -} - -func GetConfigMetadataSetting(key string) (string, error) { - // Retrieve Metadata config node - node, err := getMetadataNode() - if err != nil { - return "", err - } - - return getSetting(node, key) -} - -// IsConfigMetadataSettingsEnabled checks and returns whether specific plugin and key is true -func IsConfigMetadataSettingsEnabled(key string) (bool, error) { - node, err := getMetadataNode() - if err != nil { - return false, err - } - val, err := getSetting(node, key) - if err != nil { - return false, err - } - return strings.EqualFold(val, "true"), nil -} - -// UseUnifiedConfig checks useUnifiedConfig feature flag -func UseUnifiedConfig() (bool, error) { - return IsConfigMetadataSettingsEnabled(SettingUseUnifiedConfig) -} - -// DeleteConfigMetadataSetting delete the env entry of specified key -func DeleteConfigMetadataSetting(key string) error { - // Retrieve config metadata node - AcquireTanzuMetadataLock() - defer ReleaseTanzuMetadataLock() - node, err := getMetadataNodeNoLock() - if err != nil { - return err - } - - err = deleteSetting(node, key) - if err != nil { - return err - } - - return persistConfigMetadata(node) -} - -// SetConfigMetadataSetting add or update a env key and value -func SetConfigMetadataSetting(key, value string) (err error) { - // Retrieve config metadata node - AcquireTanzuMetadataLock() - defer ReleaseTanzuMetadataLock() - node, err := getMetadataNodeNoLock() - if err != nil { - return err - } - - persist, err := setSetting(node, key, value) - - if persist { - return persistConfigMetadata(node) - } - - return err -} - -func getSettings(node *yaml.Node) (map[string]string, error) { - cfgMetadata, err := convertNodeToMetadata(node) - if err != nil { - return nil, err - } - if cfgMetadata != nil && cfgMetadata.ConfigMetadata != nil && - cfgMetadata.ConfigMetadata.Settings != nil { - return cfgMetadata.ConfigMetadata.Settings, nil - } - return nil, nil -} - -func getSetting(node *yaml.Node, key string) (string, error) { - cfgMetadata, err := convertNodeToMetadata(node) - if err != nil { - return "", err - } - - if cfgMetadata == nil || cfgMetadata.ConfigMetadata == nil || - cfgMetadata.ConfigMetadata.Settings == nil { - return "", errors.New("not found") - } - - if val, ok := cfgMetadata.ConfigMetadata.Settings[key]; ok { - return val, nil - } - return "", errors.New("not found") -} - -func deleteSetting(node *yaml.Node, key string) (err error) { - // find settings node - keys := []nodeutils.Key{ - {Name: KeyConfigMetadata, Type: yaml.MappingNode}, - {Name: KeySettings, Type: yaml.MappingNode}, - } - settingsNode := nodeutils.FindNode(node.Content[0], nodeutils.WithKeys(keys)) - if settingsNode == nil { - return err - } - - // convert settings nodes to map - settings, err := nodeutils.ConvertNodeToMap(settingsNode) - if err != nil { - return err - } - - // delete the specified entry in the map - delete(settings, key) - - // convert updated map to settings node - newSettingNode, err := nodeutils.ConvertMapToNode(settings) - if err != nil { - return err - } - settingsNode.Content = newSettingNode.Content[0].Content - return nil -} - -//nolint:dupl -func setSetting(node *yaml.Node, key, value string) (persist bool, err error) { - // find settings node - keys := []nodeutils.Key{ - {Name: KeyConfigMetadata, Type: yaml.MappingNode}, - {Name: KeySettings, Type: yaml.MappingNode}, - } - settingsNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if settingsNode == nil { - return persist, err - } - // convert settings node to map - settings, err := nodeutils.ConvertNodeToMap(settingsNode) - if err != nil { - return persist, err - } - // add or update the settings map per specified key value pair - if len(settings) == 0 || settings[key] != value { - settings[key] = value - persist = true - } - // convert map to settings node - newSettingNode, err := nodeutils.ConvertMapToNode(settings) - if err != nil { - return persist, err - } - settingsNode.Content = newSettingNode.Content[0].Content - return persist, err -} diff --git a/cli/runtime/config/metadata_settings_api_test.go b/cli/runtime/config/metadata_settings_api_test.go deleted file mode 100644 index 11c14caabf..0000000000 --- a/cli/runtime/config/metadata_settings_api_test.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "strconv" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestSetAndDeleteConfigMetadataSettings(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - defer func() { - cleanupDir(LocalDirName) - }() - tests := []struct { - name string - key string - value bool - }{ - { - name: "success context-aware-cli-for-plugins", - key: SettingUseUnifiedConfig, - value: false, - }, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - err := SetConfigMetadataSetting(tc.key, strconv.FormatBool(tc.value)) - assert.NoError(t, err) - - useUnifiedConfig, err := UseUnifiedConfig() - assert.NoError(t, err) - assert.Equal(t, tc.value, useUnifiedConfig) - - err = DeleteConfigMetadataSetting(tc.key) - assert.NoError(t, err) - - useUnifiedConfig, err = UseUnifiedConfig() - assert.Equal(t, "not found", err.Error()) - assert.Equal(t, tc.value, useUnifiedConfig) - - err = SetConfigMetadataSetting(tc.key, strconv.FormatBool(!tc.value)) - assert.NoError(t, err) - - useUnifiedConfig, err = UseUnifiedConfig() - assert.NoError(t, err) - assert.Equal(t, !tc.value, useUnifiedConfig) - }) - } -} - -func TestSetConfigMetadataSetting(t *testing.T) { - // setup - func() { - LocalDirName = TestLocalDirName - }() - defer func() { - cleanupDir(LocalDirName) - }() - tests := []struct { - name string - key string - value string - }{ - { - name: "success disable useUnifiedConfig", - key: SettingUseUnifiedConfig, - value: "false", - }, - { - name: "success enable useUnifiedConfig", - key: SettingUseUnifiedConfig, - value: "true", - }, - { - name: "success disable useUnifiedConfig", - key: SettingUseUnifiedConfig, - value: "false", - }, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - err := SetConfigMetadataSetting(tc.key, tc.value) - assert.NoError(t, err) - - useUnifiedConfig, err := UseUnifiedConfig() - assert.NoError(t, err) - expected, err := strconv.ParseBool(tc.value) - assert.NoError(t, err) - assert.Equal(t, expected, useUnifiedConfig) - }) - } -} diff --git a/cli/runtime/config/nodeutils/compare_nodes.go b/cli/runtime/config/nodeutils/compare_nodes.go deleted file mode 100644 index 2f3c8bdab0..0000000000 --- a/cli/runtime/config/nodeutils/compare_nodes.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "reflect" - - "gopkg.in/yaml.v3" -) - -// Equal checks whether the passed two nodes are equal -func Equal(node1, node2 *yaml.Node) (bool, error) { - m1, err := ConvertNodeToMapInterface(node1) - if err != nil { - return false, err - } - m2, err := ConvertNodeToMapInterface(node2) - if err != nil { - return false, err - } - return reflect.DeepEqual(m1, m2), nil -} - -// NotEqual checks whether the passed two nodes are not deep equal -func NotEqual(node1, node2 *yaml.Node) (bool, error) { - equal, err := Equal(node1, node2) - if err != nil { - return false, err - } - return !equal, nil -} diff --git a/cli/runtime/config/nodeutils/compare_nodes_test.go b/cli/runtime/config/nodeutils/compare_nodes_test.go deleted file mode 100644 index 428ac53959..0000000000 --- a/cli/runtime/config/nodeutils/compare_nodes_test.go +++ /dev/null @@ -1,882 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" -) - -func TestCompareNodes(t *testing.T) { - tests := []struct { - name string - node1 *yaml.Node - node2 *yaml.Node - out bool - }{ - { - name: "should return false when Equal method is called", - node1: &yaml.Node{ - Kind: yaml.DocumentNode, - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "currentContext", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: string(cliapi.TargetK8s), - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc-merge", - }, - }, - }, - - { - Kind: yaml.ScalarNode, - Value: "contexts", - }, - { - Kind: yaml.SequenceNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "name", - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc", - }, - { - Kind: yaml.ScalarNode, - Value: "target", - }, - { - Kind: yaml.ScalarNode, - Value: string(cliapi.TargetK8s), - }, - { - Kind: yaml.ScalarNode, - Value: "clusterOpts", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "isManagementCluster", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - { - Kind: yaml.ScalarNode, - Value: "annotation", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "required", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - { - Kind: yaml.ScalarNode, - Value: "annotationStruct", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "endpoint", - }, - { - Kind: yaml.ScalarNode, - Value: "test-endpoint", - }, - { - Kind: yaml.ScalarNode, - Value: "path", - }, - { - Kind: yaml.ScalarNode, - Value: "test-path", - }, - { - Kind: yaml.ScalarNode, - Value: "context", - }, - { - Kind: yaml.ScalarNode, - Value: "test-context", - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "discoverySources", - }, - { - Kind: yaml.SequenceNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "gcp", - }, - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - - { - Kind: yaml.ScalarNode, - Value: "name", - }, - { - Kind: yaml.ScalarNode, - Value: "test", - }, - { - Kind: yaml.ScalarNode, - Value: "bucket", - }, - { - Kind: yaml.ScalarNode, - Value: "test-bucket", - }, - { - Kind: yaml.ScalarNode, - Value: "manifestPath", - }, - { - Kind: yaml.ScalarNode, - Value: "test-manifest-path", - }, - { - Kind: yaml.ScalarNode, - Value: "annotation", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "required", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - }}, - { - Value: "contextType", - Kind: yaml.ScalarNode, - }, - { - Value: "tmc", - Kind: yaml.ScalarNode, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - node2: &yaml.Node{ - Kind: yaml.DocumentNode, - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "currentContext", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: string(cliapi.TargetK8s), - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc-merge", - }, - }, - }, - - { - Kind: yaml.ScalarNode, - Value: "contexts", - }, - { - Kind: yaml.SequenceNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "name", - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc", - }, - { - Kind: yaml.ScalarNode, - Value: "target", - }, - { - Kind: yaml.ScalarNode, - Value: string(cliapi.TargetK8s), - }, - { - Kind: yaml.ScalarNode, - Value: "clusterOpts", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "isManagementCluster", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - { - Kind: yaml.ScalarNode, - Value: "annotation", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "required", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - { - Kind: yaml.ScalarNode, - Value: "annotationStruct", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "endpoint", - }, - { - Kind: yaml.ScalarNode, - Value: "test-endpoint", - }, - { - Kind: yaml.ScalarNode, - Value: "path", - }, - { - Kind: yaml.ScalarNode, - Value: "test-path", - }, - { - Kind: yaml.ScalarNode, - Value: "context", - }, - { - Kind: yaml.ScalarNode, - Value: "test-context", - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "discoverySources", - }, - { - Kind: yaml.SequenceNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "gcp", - }, - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - - { - Kind: yaml.ScalarNode, - Value: "name", - }, - { - Kind: yaml.ScalarNode, - Value: "test", - }, - { - Kind: yaml.ScalarNode, - Value: "bucket", - }, - { - Kind: yaml.ScalarNode, - Value: "test-bucket", - }, - { - Kind: yaml.ScalarNode, - Value: "manifestPath", - }, - { - Kind: yaml.ScalarNode, - Value: "test-manifest-path", - }, - { - Kind: yaml.ScalarNode, - Value: "annotation", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "required", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - }}, - { - Value: "contextType", - Kind: yaml.ScalarNode, - }, - { - Value: "tmc", - Kind: yaml.ScalarNode, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - out: false, - }, - { - name: "should return true when NotEqual method is called", - node1: &yaml.Node{ - Kind: yaml.DocumentNode, - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "currentContext", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: string(cliapi.TargetK8s), - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc-merge", - }, - }, - }, - - { - Kind: yaml.ScalarNode, - Value: "contexts", - }, - { - Kind: yaml.SequenceNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "name", - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc", - }, - { - Kind: yaml.ScalarNode, - Value: "target", - }, - { - Kind: yaml.ScalarNode, - Value: string(cliapi.TargetK8s), - }, - { - Kind: yaml.ScalarNode, - Value: "clusterOpts", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "isManagementCluster", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - { - Kind: yaml.ScalarNode, - Value: "annotation", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "required", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - { - Kind: yaml.ScalarNode, - Value: "annotationStruct", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "endpoint", - }, - { - Kind: yaml.ScalarNode, - Value: "test-endpoint", - }, - { - Kind: yaml.ScalarNode, - Value: "path", - }, - { - Kind: yaml.ScalarNode, - Value: "test-path", - }, - { - Kind: yaml.ScalarNode, - Value: "context", - }, - { - Kind: yaml.ScalarNode, - Value: "test-context", - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "discoverySources", - }, - { - Kind: yaml.SequenceNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "gcp", - }, - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - - { - Kind: yaml.ScalarNode, - Value: "name", - }, - { - Kind: yaml.ScalarNode, - Value: "test", - }, - { - Kind: yaml.ScalarNode, - Value: "bucket", - }, - { - Kind: yaml.ScalarNode, - Value: "test-bucket", - }, - { - Kind: yaml.ScalarNode, - Value: "manifestPath", - }, - { - Kind: yaml.ScalarNode, - Value: "test-manifest-path", - }, - { - Kind: yaml.ScalarNode, - Value: "annotation", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "required", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - }}, - { - Value: "contextType", - Kind: yaml.ScalarNode, - }, - { - Value: "tmc", - Kind: yaml.ScalarNode, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - node2: &yaml.Node{ - Kind: yaml.DocumentNode, - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "currentContext", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: string(cliapi.TargetK8s), - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc", - }, - }, - }, - - { - Kind: yaml.ScalarNode, - Value: "contexts", - }, - { - Kind: yaml.SequenceNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "name", - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc", - }, - { - Kind: yaml.ScalarNode, - Value: "target", - }, - { - Kind: yaml.ScalarNode, - Value: string(cliapi.TargetK8s), - }, - { - Kind: yaml.ScalarNode, - Value: "clusterOpts", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "isManagementCluster", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - { - Kind: yaml.ScalarNode, - Value: "annotation", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "required", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - { - Kind: yaml.ScalarNode, - Value: "annotationStruct", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "endpoint", - }, - { - Kind: yaml.ScalarNode, - Value: "test-endpoint", - }, - { - Kind: yaml.ScalarNode, - Value: "path", - }, - { - Kind: yaml.ScalarNode, - Value: "test-path", - }, - { - Kind: yaml.ScalarNode, - Value: "context", - }, - { - Kind: yaml.ScalarNode, - Value: "test-context", - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "discoverySources", - }, - { - Kind: yaml.SequenceNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "gcp", - }, - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - - { - Kind: yaml.ScalarNode, - Value: "name", - }, - { - Kind: yaml.ScalarNode, - Value: "test", - }, - { - Kind: yaml.ScalarNode, - Value: "bucket", - }, - { - Kind: yaml.ScalarNode, - Value: "test-bucket", - }, - { - Kind: yaml.ScalarNode, - Value: "manifestPath", - }, - { - Kind: yaml.ScalarNode, - Value: "test-manifest-path", - }, - { - Kind: yaml.ScalarNode, - Value: "annotation", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "required", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - }}, - { - Value: "contextType", - Kind: yaml.ScalarNode, - }, - { - Value: "tmc", - Kind: yaml.ScalarNode, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - out: true, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - ok, err := NotEqual(spec.node1, spec.node2) - assert.NoError(t, err) - assert.Equal(t, ok, spec.out) - }) - } -} diff --git a/cli/runtime/config/nodeutils/converters.go b/cli/runtime/config/nodeutils/converters.go deleted file mode 100644 index 765a9f46e3..0000000000 --- a/cli/runtime/config/nodeutils/converters.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "github.com/pkg/errors" - - "gopkg.in/yaml.v3" -) - -// ConvertNodeToMap converts yaml node to map[string]string -func ConvertNodeToMap(node *yaml.Node) (envs map[string]string, err error) { - err = node.Decode(&envs) - if err != nil { - return nil, errors.Wrap(err, "failed to convert node to map") - } - return envs, err -} - -// ConvertMapToNode converts map[string]string to yaml node -func ConvertMapToNode(envs map[string]string) (*yaml.Node, error) { - bytes, err := yaml.Marshal(envs) - if err != nil { - return nil, errors.Wrap(err, "failed to marshal map") - } - var node yaml.Node - err = yaml.Unmarshal(bytes, &node) - if err != nil { - return nil, errors.Wrap(err, "failed to unmarshal bytes to node") - } - node.Style = 0 - node.Content[0].Style = 0 - return &node, nil -} - -// ConvertNodeToMapInterface converts yaml node to map[string]interface -func ConvertNodeToMapInterface(node *yaml.Node) (envs map[string]interface{}, err error) { - err = node.Decode(&envs) - if err != nil { - return nil, errors.Wrap(err, "failed to convert node to map interface") - } - return envs, err -} diff --git a/cli/runtime/config/nodeutils/create_node.go b/cli/runtime/config/nodeutils/create_node.go deleted file mode 100644 index 4e6026ff53..0000000000 --- a/cli/runtime/config/nodeutils/create_node.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "gopkg.in/yaml.v3" -) - -// CreateNode creates yaml node based on node key Type -func CreateNode(nodeKey Key) []*yaml.Node { - switch nodeKey.Type { - case yaml.MappingNode: - return CreateMappingNode(nodeKey.Name) - case yaml.SequenceNode: - return CreateSequenceNode(nodeKey.Name) - case yaml.ScalarNode: - return CreateScalarNode(nodeKey.Name, nodeKey.Value) - } - return nil -} - -// CreateSequenceNode creates yaml node based on node key -func CreateSequenceNode(key string) []*yaml.Node { - keyNode := &yaml.Node{ - Kind: yaml.ScalarNode, - Style: 0, - Value: key, - } - valueNode := &yaml.Node{ - Kind: yaml.SequenceNode, - Style: 0, - } - return []*yaml.Node{keyNode, valueNode} -} - -// CreateScalarNode creates yaml node based on node key and value -func CreateScalarNode(key, value string) []*yaml.Node { - keyNode := &yaml.Node{ - Kind: yaml.ScalarNode, - Value: key, - Style: 0, - Tag: "!!str", - } - valueNode := &yaml.Node{ - Kind: yaml.ScalarNode, - Value: value, - Style: 0, - Tag: "!!str", - } - return []*yaml.Node{keyNode, valueNode} -} - -// CreateMappingNode creates yaml node based on node key -func CreateMappingNode(key string) []*yaml.Node { - keyNode := &yaml.Node{ - Kind: yaml.ScalarNode, - Value: key, - Style: 0, - } - valueNode := &yaml.Node{ - Kind: yaml.MappingNode, - Style: 0, - } - return []*yaml.Node{keyNode, valueNode} -} diff --git a/cli/runtime/config/nodeutils/create_node_test.go b/cli/runtime/config/nodeutils/create_node_test.go deleted file mode 100644 index 8119689d49..0000000000 --- a/cli/runtime/config/nodeutils/create_node_test.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" -) - -func TestCreateNode(t *testing.T) { - tests := []struct { - name string - key Key - dst []*yaml.Node - }{ - { - name: "success create scalar node", - key: Key{ - Name: "test", - Type: yaml.ScalarNode, - Value: "", - }, - dst: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "test", - Style: 0, - Tag: "!!str", - }, - { - Kind: yaml.ScalarNode, - Value: "", - Style: 0, - Tag: "!!str", - }, - }, - }, - { - name: "success create sequence node", - key: Key{ - Name: "test", - Type: yaml.SequenceNode, - }, - dst: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "test", - Style: 0, - }, - { - Kind: yaml.SequenceNode, - Style: 0, - }, - }, - }, - { - name: "success create mapping node", - key: Key{ - Name: "test", - Type: yaml.MappingNode, - }, - dst: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "test", - Style: 0, - }, - { - Kind: yaml.MappingNode, - Style: 0, - }, - }, - }, - { - name: "should return nil for not supported node type", - key: Key{ - Name: "test", - Type: yaml.DocumentNode, - }, - dst: nil, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - node := CreateNode(spec.key) - assert.Equal(t, node, spec.dst) - }) - } -} diff --git a/cli/runtime/config/nodeutils/delete_nodes.go b/cli/runtime/config/nodeutils/delete_nodes.go deleted file mode 100644 index e5cceedf44..0000000000 --- a/cli/runtime/config/nodeutils/delete_nodes.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "fmt" - "strings" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" -) - -// DeleteNodes delete nodes in dst as per patchStrategy prior performing merge -func DeleteNodes(src, dst *yaml.Node, opts ...PatchStrategyOpts) (bool, error) { - // only replace if the change is not equal to existing - replaceUnequalObjects, err := NotEqual(src, dst) - if err != nil { - return false, err - } - if !replaceUnequalObjects { - return replaceUnequalObjects, nil - } - - options := &PatchStrategyOptions{} - for _, opt := range opts { - opt(options) - } - return replaceUnequalObjects, deleteNodes(src, dst, options.Key, options.PatchStrategies) -} - -func deleteNodes(src, dst *yaml.Node, patchStrategyKey string, patchStrategies map[string]string) error { - err := checkErrors(src, dst) - if err != nil { - return err - } - switch dst.Kind { - case yaml.MappingNode: - for i := 0; i < len(dst.Content); i += 2 { - found := false - key := patchStrategyKey - for j := 0; j < len(src.Content); j += 2 { - // If there is a match and equal continue noop - if ok, _ := equalScalars(dst.Content[i], src.Content[j]); !ok { - continue - } - - found = true - - // check for patch strategy before performing deep replace - key = fmt.Sprintf("%v.%v", key, dst.Content[i].Value) - if strings.EqualFold(patchStrategies[key], "replace") { - dst.Content = append(dst.Content[:i], dst.Content[i+2:]...) - i -= 2 - break - } - - if err := deleteNodes(src.Content[j+1], dst.Content[i+1], key, patchStrategies); err != nil { - return errors.Wrap(err, " delete at key "+src.Content[i].Value) - } - key = patchStrategyKey - break - } - // if match not found remove the node if it is found in patch strategy - if !found { - key = fmt.Sprintf("%v.%v", key, dst.Content[i].Value) - if strings.EqualFold(patchStrategies[key], "replace") { - dst.Content = append(dst.Content[:i], dst.Content[i+2:]...) - i -= 2 - } - } - } - case yaml.ScalarNode: - case yaml.SequenceNode: - case yaml.DocumentNode: - err := deleteNodes(src.Content[0], dst.Content[0], patchStrategyKey, patchStrategies) - if err != nil { - return errors.Wrap(err, "delete at key "+src.Content[0].Value) - } - default: - return errors.New("unknown node type: can only replace known node types") - } - return nil -} diff --git a/cli/runtime/config/nodeutils/delete_nodes_test.go b/cli/runtime/config/nodeutils/delete_nodes_test.go deleted file mode 100644 index 4cd48a75ab..0000000000 --- a/cli/runtime/config/nodeutils/delete_nodes_test.go +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" -) - -func TestDeleteNodes(t *testing.T) { - tests := []struct { - name string - dst string - src string - metadata map[string]string - output string - }{ - { - name: "success delete nodes with patch strategy", - metadata: map[string]string{ - "contexts.group": "replace", - }, - dst: `name: test-mc -target: kubernetes -group: one -clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context -discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc`, - src: `name: test-mc -target: kubernetes -clusterOpts: - isManagementCluster: true - endpoint: test-endpoint - context: test-context -discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-pat - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - contextType: tmc`, - output: `name: test-mc -target: kubernetes -clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context -discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc`, - }, - - { - name: "success delete nodes with patch strategies", - metadata: map[string]string{ - "contexts.group": "replace", - "contexts.clusterOpts.annotation": "replace", - "contexts.clusterOpts.annotationStruct": "replace", - "contexts.clusterOpts.optional": "replace", - }, - dst: `name: test-mc -target: kubernetes -group: one -clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - optional: - - one - - two - endpoint: test-endpoint - path: test-path - context: test-context -discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc`, - src: `name: test-mc -target: kubernetes -clusterOpts: - isManagementCluster: true - endpoint: test-endpoint - context: test-context -discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-pat - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - contextType: tmc`, - output: `name: test-mc -target: kubernetes -clusterOpts: - isManagementCluster: true - required: true - endpoint: test-endpoint - path: test-path - context: test-context -discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - gcp: - name: test-two - bucket: test-bucket - manifestPath: test-manifest-path - annotation: two - required: true - contextType: tmc`, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - // Setup data - var src yaml.Node - var dst yaml.Node - var output yaml.Node - var err error - err = yaml.Unmarshal([]byte(spec.src), &src) - assert.NoError(t, err) - err = yaml.Unmarshal([]byte(spec.dst), &dst) - assert.NoError(t, err) - err = yaml.Unmarshal([]byte(spec.output), &output) - assert.NoError(t, err) - - // Perform action - _, err = DeleteNodes(&src, &dst, WithPatchStrategyKey("contexts"), WithPatchStrategies(spec.metadata)) - assert.NoError(t, err) - - // Assert outcome - dstBytes, err := yaml.Marshal(&dst) - assert.NoError(t, err) - outputBytes, err := yaml.Marshal(&output) - assert.NoError(t, err) - assert.Equal(t, string(dstBytes), string(outputBytes)) - }) - } -} diff --git a/cli/runtime/config/nodeutils/find_node.go b/cli/runtime/config/nodeutils/find_node.go deleted file mode 100644 index 540bd07457..0000000000 --- a/cli/runtime/config/nodeutils/find_node.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "gopkg.in/yaml.v3" -) - -// FindNode parse the yaml node and return the matched node based on Config Options passed -func FindNode(node *yaml.Node, opts ...Options) *yaml.Node { - nodeConfig := &CfgNode{} - for _, opt := range opts { - opt(nodeConfig) - } - parent := node - for _, nodeKey := range nodeConfig.Keys { - child := getNode(parent, nodeKey.Name) - if child == nil { - if nodeConfig.ForceCreate { - parent.Content = append(parent.Content, CreateNode(nodeKey)...) - child = getNode(parent, nodeKey.Name) - } else { - return nil - } - } - parent = child - parent.Style = 0 - } - return parent -} - -// getNode parse the yaml node and return the node matched by key -func getNode(node *yaml.Node, key string) *yaml.Node { - if node.Content == nil || len(node.Content) == 0 { - return nil - } - nodeIndex := GetNodeIndex(node.Content, key) - if nodeIndex == -1 { - return nil - } - foundNode := node.Content[nodeIndex] - return foundNode -} - -// GetNodeIndex retrieves node index of specific node object value; yaml nodes are stored in arrays for all value types. -// Ex: refer https://pkg.go.dev/gopkg.in/yaml.v3#pkg-overview -func GetNodeIndex(node []*yaml.Node, key string) int { - appIdx := -1 - for i, k := range node { - if i%2 == 0 && k.Value == key { - appIdx = i + 1 - break - } - } - return appIdx -} diff --git a/cli/runtime/config/nodeutils/find_node_test.go b/cli/runtime/config/nodeutils/find_node_test.go deleted file mode 100644 index e8d85ceafb..0000000000 --- a/cli/runtime/config/nodeutils/find_node_test.go +++ /dev/null @@ -1,284 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" -) - -func TestFindNode(t *testing.T) { - tests := []struct { - name string - in *yaml.Node - opts Options - out *yaml.Node - nullValue bool - }{ - { - name: "should return node from the already existing yaml node tree", - in: &yaml.Node{ - Content: []*yaml.Node{ - { - Value: "clientOptions", - }, - { - Content: []*yaml.Node{ - { - Value: "cli", - }, - { - Content: []*yaml.Node{ - {Value: "discoverySources"}, - { - Content: []*yaml.Node{ - { - Content: []*yaml.Node{ - {Value: "gcp", Kind: yaml.ScalarNode}, - {Content: []*yaml.Node{ - {Value: "name"}, - {Value: "test"}, - {Value: "bucket"}, - {Value: "test-bucket"}, - {Value: "manifestPath"}, - {Value: "test-manifestPath"}, - }}, - {Value: "contextType", Kind: yaml.ScalarNode}, - {Value: "tmc", Kind: yaml.ScalarNode}, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - out: &yaml.Node{ - Content: []*yaml.Node{ - { - Content: []*yaml.Node{ - {Value: "gcp", Kind: yaml.ScalarNode}, - {Content: []*yaml.Node{ - {Value: "name"}, - {Value: "test"}, - {Value: "bucket"}, - {Value: "test-bucket"}, - {Value: "manifestPath"}, - {Value: "test-manifestPath"}, - }}, - {Value: "contextType", Kind: yaml.ScalarNode}, - {Value: "tmc", Kind: yaml.ScalarNode}, - }, - }, - }, - }, - opts: func(config *CfgNode) { - config.ForceCreate = true - config.Keys = - []Key{ - {Name: "clientOptions", Type: yaml.MappingNode}, - {Name: "cli", Type: yaml.MappingNode}, - {Name: "discoverySources", Type: yaml.SequenceNode}, - } - }, - }, - { - name: "should return node by force creating the node tree", - in: &yaml.Node{}, - out: &yaml.Node{ - Content: nil, - }, - opts: func(config *CfgNode) { - config.ForceCreate = true - config.Keys = - []Key{ - {Name: "clientOptions", Type: yaml.MappingNode}, - {Name: "cli", Type: yaml.MappingNode}, - {Name: "discoverySources", Type: yaml.SequenceNode}, - } - }, - }, - { - name: "should return nil when force create is false", - in: &yaml.Node{}, - out: nil, - nullValue: true, - opts: func(config *CfgNode) { - config.ForceCreate = false - config.Keys = - []Key{ - {Name: "clientOptions", Type: yaml.MappingNode}, - {Name: "cli", Type: yaml.MappingNode}, - {Name: "discoverySources", Type: yaml.SequenceNode}, - } - }, - }, - { - name: "should return level one node from existing node tree", - in: &yaml.Node{ - Content: []*yaml.Node{ - { - Value: "clientOptions", - }, - { - Content: []*yaml.Node{ - { - Value: "cli", - }, - { - Content: []*yaml.Node{ - {Value: "discoverySources"}, - { - Content: []*yaml.Node{ - { - Content: []*yaml.Node{ - {Value: "gcp", Kind: yaml.ScalarNode}, - {Content: []*yaml.Node{ - {Value: "name"}, - {Value: "test"}, - {Value: "bucket"}, - {Value: "test-bucket"}, - {Value: "manifestPath"}, - {Value: "test-manifestPath"}, - }}, - {Value: "contextType", Kind: yaml.ScalarNode}, - {Value: "tmc", Kind: yaml.ScalarNode}, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - out: &yaml.Node{ - Content: []*yaml.Node{ - { - Value: "cli", - }, - { - Content: []*yaml.Node{ - {Value: "discoverySources"}, - { - Content: []*yaml.Node{ - { - Content: []*yaml.Node{ - {Value: "gcp", Kind: yaml.ScalarNode}, - {Content: []*yaml.Node{ - {Value: "name"}, - {Value: "test"}, - {Value: "bucket"}, - {Value: "test-bucket"}, - {Value: "manifestPath"}, - {Value: "test-manifestPath"}, - }}, - {Value: "contextType", Kind: yaml.ScalarNode}, - {Value: "tmc", Kind: yaml.ScalarNode}, - }, - }, - }, - }, - }, - }, - }, - }, - opts: func(config *CfgNode) { - config.ForceCreate = true - config.Keys = - []Key{ - {Name: "clientOptions", Type: yaml.MappingNode}, - } - }, - }, - { - name: "should return level two node from existing node tree", - in: &yaml.Node{ - Content: []*yaml.Node{ - { - Value: "clientOptions", - }, - { - Content: []*yaml.Node{ - { - Value: "cli", - }, - { - Content: []*yaml.Node{ - {Value: "discoverySources"}, - { - Content: []*yaml.Node{ - { - Content: []*yaml.Node{ - {Value: "gcp", Kind: yaml.ScalarNode}, - {Content: []*yaml.Node{ - {Value: "name"}, - {Value: "test"}, - {Value: "bucket"}, - {Value: "test-bucket"}, - {Value: "manifestPath"}, - {Value: "test-manifestPath"}, - }}, - {Value: "contextType", Kind: yaml.ScalarNode}, - {Value: "tmc", Kind: yaml.ScalarNode}, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - out: &yaml.Node{ - Content: []*yaml.Node{ - {Value: "discoverySources"}, - { - Content: []*yaml.Node{ - { - Content: []*yaml.Node{ - {Value: "gcp", Kind: yaml.ScalarNode}, - {Content: []*yaml.Node{ - {Value: "name"}, - {Value: "test"}, - {Value: "bucket"}, - {Value: "test-bucket"}, - {Value: "manifestPath"}, - {Value: "test-manifestPath"}, - }}, - {Value: "contextType", Kind: yaml.ScalarNode}, - {Value: "tmc", Kind: yaml.ScalarNode}, - }, - }, - }, - }, - }, - }, - opts: func(config *CfgNode) { - config.ForceCreate = true - config.Keys = - []Key{ - {Name: "clientOptions", Type: yaml.MappingNode}, - {Name: "cli", Type: yaml.MappingNode}, - } - }, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - n := FindNode(spec.in, spec.opts) - if spec.nullValue { - assert.Nil(t, n) - } else { - assert.Equal(t, spec.out.Content, n.Content) - } - }) - } -} diff --git a/cli/runtime/config/nodeutils/helpers.go b/cli/runtime/config/nodeutils/helpers.go deleted file mode 100644 index b711a64700..0000000000 --- a/cli/runtime/config/nodeutils/helpers.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "github.com/pkg/errors" - "gopkg.in/yaml.v3" -) - -func UniqNodes(nodes []*yaml.Node) []*yaml.Node { - uniq := make([]*yaml.Node, 0, len(nodes)) - mapper := make(map[string]bool) - - for _, node := range nodes { - if _, ok := mapper[node.Value]; !ok { - mapper[node.Value] = true - uniq = append(uniq, node) - } - } - - return uniq -} - -// equalScalars returns true if two scalar nodes has same value -func equalScalars(left, right *yaml.Node) (bool, error) { - if left.Kind == yaml.ScalarNode && right.Kind == yaml.ScalarNode { - return left.Value == right.Value, nil - } - return false, errors.New("equals on non-scalars not implemented") -} - -func checkErrors(src, dst *yaml.Node) error { - if src.Kind != dst.Kind { - return ErrDifferentArgumentsTypes - } - return nil -} diff --git a/cli/runtime/config/nodeutils/helpers_test.go b/cli/runtime/config/nodeutils/helpers_test.go deleted file mode 100644 index 2a9445f905..0000000000 --- a/cli/runtime/config/nodeutils/helpers_test.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" -) - -func TestUniqNode(t *testing.T) { - tests := []struct { - name string - nodes []*yaml.Node - count int - }{ - { - name: "success 2 uniq nodes", - count: 2, - nodes: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "test", - Style: 0, - Tag: "!!str", - }, - { - Kind: yaml.ScalarNode, - Value: "", - Style: 0, - Tag: "!!str", - }, - }, - }, - { - name: "success 1 uniq nodes", - count: 1, - nodes: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "test", - Style: 0, - Tag: "!!str", - }, - { - Kind: yaml.ScalarNode, - Value: "test", - Style: 0, - Tag: "!!str", - }, - }, - }, - } - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - nodes := UniqNodes(spec.nodes) - assert.Equal(t, spec.count, len(nodes)) - }) - } -} diff --git a/cli/runtime/config/nodeutils/merge_nodes.go b/cli/runtime/config/nodeutils/merge_nodes.go deleted file mode 100644 index 1bfea7cd67..0000000000 --- a/cli/runtime/config/nodeutils/merge_nodes.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "github.com/pkg/errors" - "gopkg.in/yaml.v3" -) - -var ( - ErrDifferentArgumentsTypes = errors.New("src and dst must be of same type") - ErrNonPointerArgument = errors.New("dst must be a pointer") -) - -// MergeNodes to merge two yaml nodes src(source) to dst(destination) node -func MergeNodes(src, dst *yaml.Node) (bool, error) { - // only replace if the change is not equal to existing - mergeUnequalObjects, err := NotEqual(src, dst) - if err != nil { - return false, err - } - if !mergeUnequalObjects { - return mergeUnequalObjects, nil - } - return mergeUnequalObjects, mergeNodes(src, dst) -} - -func mergeNodes(src, dst *yaml.Node) error { - err := checkErrors(src, dst) - if err != nil { - return err - } - switch src.Kind { - case yaml.MappingNode: - for i := 0; i < len(src.Content); i += 2 { - found := false - for j := 0; j < len(dst.Content); j += 2 { - if ok, _ := equalScalars(src.Content[i], dst.Content[j]); ok { - found = true - if err := mergeNodes(src.Content[i+1], dst.Content[j+1]); err != nil { - return errors.Wrap(err, "merge at key "+src.Content[i].Value) - } - break - } - } - if !found { - dst.Content = append(dst.Content, src.Content[i:i+2]...) - } - } - case yaml.SequenceNode: - setSeqNode(src, dst) - case yaml.DocumentNode: - err := mergeNodes(src.Content[0], dst.Content[0]) - if err != nil { - return errors.Wrap(err, "merge at key "+src.Content[0].Value) - } - case yaml.ScalarNode: - if dst.Value != src.Value { - dst.Value = src.Value - } - default: - return errors.New("can only merge mapping and sequence nodes") - } - return nil -} - -// Construct unique sequence nodes for scalar value type -func setSeqNode(src, dst *yaml.Node) { - if dst.Content[0].Kind == yaml.ScalarNode && src.Content[0].Kind == yaml.ScalarNode { - dst.Content = append(dst.Content, src.Content...) - dst.Content = UniqNodes(dst.Content) - } -} diff --git a/cli/runtime/config/nodeutils/merge_nodes_test.go b/cli/runtime/config/nodeutils/merge_nodes_test.go deleted file mode 100644 index 82620478a3..0000000000 --- a/cli/runtime/config/nodeutils/merge_nodes_test.go +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package nodeutils - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" - - cliapi "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" -) - -func TestMergeNode(t *testing.T) { - tests := []struct { - name string - src *yaml.Node - dst *yaml.Node - opts Options - }{ - { - name: "success merge src into empty dst node", - src: &yaml.Node{ - Kind: yaml.DocumentNode, - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "currentContext", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: string(cliapi.TargetK8s), - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc-merge", - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "current", - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc", - }, - { - Kind: yaml.ScalarNode, - Value: "servers", - }, - { - Kind: yaml.SequenceNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "name", - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc", - }, - { - Kind: yaml.ScalarNode, - Value: "type", - }, - { - Kind: yaml.ScalarNode, - Value: "managementcluster", - }, - }, - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "contexts", - }, - { - Kind: yaml.SequenceNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "name", - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc", - }, - { - Kind: yaml.ScalarNode, - Value: "target", - }, - { - Kind: yaml.ScalarNode, - Value: string(cliapi.TargetK8s), - }, - { - Kind: yaml.ScalarNode, - Value: "clusterOpts", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "isManagementCluster", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - { - Kind: yaml.ScalarNode, - Value: "annotation", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "required", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - { - Kind: yaml.ScalarNode, - Value: "annotationStruct", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "endpoint", - }, - { - Kind: yaml.ScalarNode, - Value: "test-endpoint", - }, - { - Kind: yaml.ScalarNode, - Value: "path", - }, - { - Kind: yaml.ScalarNode, - Value: "test-path", - }, - { - Kind: yaml.ScalarNode, - Value: "context", - }, - { - Kind: yaml.ScalarNode, - Value: "test-context", - }, - }, - }, - { - Kind: yaml.ScalarNode, - Value: "discoverySources", - }, - { - Kind: yaml.SequenceNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "gcp", - }, - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - - { - Kind: yaml.ScalarNode, - Value: "name", - }, - { - Kind: yaml.ScalarNode, - Value: "test", - }, - { - Kind: yaml.ScalarNode, - Value: "bucket", - }, - { - Kind: yaml.ScalarNode, - Value: "test-bucket", - }, - { - Kind: yaml.ScalarNode, - Value: "manifestPath", - }, - { - Kind: yaml.ScalarNode, - Value: "test-manifest-path", - }, - { - Kind: yaml.ScalarNode, - Value: "annotation", - }, - { - Kind: yaml.ScalarNode, - Value: "one", - }, - { - Kind: yaml.ScalarNode, - Value: "required", - }, - { - Kind: yaml.ScalarNode, - Tag: "!!bool", - Value: "true", - }, - }}, - { - Value: "contextType", - Kind: yaml.ScalarNode, - }, - { - Value: "tmc", - Kind: yaml.ScalarNode, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - dst: &yaml.Node{ - Kind: yaml.DocumentNode, - Content: []*yaml.Node{ - { - Kind: yaml.MappingNode, - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: "currentContext", - }, - { - Kind: yaml.MappingNode, - Value: "", - Content: []*yaml.Node{ - { - Kind: yaml.ScalarNode, - Value: string(cliapi.TargetK8s), - }, - { - Kind: yaml.ScalarNode, - Value: "test-mc", - }, - }, - }, - }, - }, - }, - }, - opts: func(config *CfgNode) { - config.ForceCreate = true - config.Keys = - []Key{ - {Name: "currentContext", Type: yaml.MappingNode}, - } - }, - }, - } - - for _, spec := range tests { - t.Run(spec.name, func(t *testing.T) { - _, err := MergeNodes(spec.src, spec.dst) - assert.NoError(t, err) - node := FindNode(spec.dst.Content[0], spec.opts) - assert.NotNil(t, node) - assert.Equal(t, node, spec.dst.Content[0].Content[1]) - }) - } -} diff --git a/cli/runtime/config/nodeutils/node_types.go b/cli/runtime/config/nodeutils/node_types.go deleted file mode 100644 index 44674d66dc..0000000000 --- a/cli/runtime/config/nodeutils/node_types.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package nodeutils provides utility methods to perform operations on yaml node -package nodeutils - -import ( - "github.com/pkg/errors" - "gopkg.in/yaml.v3" -) - -var ( - ErrNodeNotFound = errors.New("node not found") -) - -// CfgNode options to be used to find specific node based on arrays of Keys passed in hierarchical order -type CfgNode struct { - ForceCreate bool // Set to True to create nodes of missing keys. Ex: True for Add/Update operations on yaml node, False for Get/Delete operations on yaml node - Keys []Key // keys of config nodes passed in hierarchical order. Ex: [ClientOptions, CLI, DiscoverySources] to get the DiscoverySources node from ClientOptions yaml node -} - -type Key struct { - Name string - Value string - Type yaml.Kind -} - -type Options func(config *CfgNode) - -func WithForceCreate() Options { - return func(config *CfgNode) { - config.ForceCreate = true - } -} - -func WithKeys(keys []Key) Options { - return func(config *CfgNode) { - config.Keys = keys - } -} - -type PatchStrategyOptions struct { - Key string - PatchStrategies map[string]string -} - -type PatchStrategyOpts func(options *PatchStrategyOptions) - -func WithPatchStrategyKey(key string) PatchStrategyOpts { - return func(options *PatchStrategyOptions) { - options.Key = key - } -} -func WithPatchStrategies(patchStrategies map[string]string) PatchStrategyOpts { - return func(options *PatchStrategyOptions) { - options.PatchStrategies = patchStrategies - } -} - -const ( - NodeTagStr = "!!str" -) - -const ( - PatchStrategyReplace = "replace" - PatchStrategyMerge = "merge" -) diff --git a/cli/runtime/config/patchstrategy_it_test.go b/cli/runtime/config/patchstrategy_it_test.go deleted file mode 100644 index 13798cf448..0000000000 --- a/cli/runtime/config/patchstrategy_it_test.go +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func setupConfigData() (string, string, string, string) { - cfg := `clientOptions: - cli: - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - - gcp: - name: test2 - bucket: test-bucket2 - manifestPath: test-manifest-path2 - annotation: one - required: true - - local: - name: test-local - bucket: test-bucket2 - manifestPath: test-manifest-path2 - annotation: one - required: true -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: test-endpoint - path: test-path - context: test-context - annotation: one - required: true -current: test-mc -contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context -currentContext: - kubernetes: test-mc -` - expectedCfg := `clientOptions: - cli: - discoverySources: - - gcp: - name: test - bucket: updated-test-bucket - manifestPath: updated-test-manifest-path - annotation: one - - gcp: - name: test2 - bucket: test-bucket2 - manifestPath: test-manifest-path2 - annotation: one - required: true - - oci: - name: test-local - image: test-local-image-path -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: test-endpoint - path: test-path - context: test-context - annotation: one - required: true -current: test-mc -` - - cfg2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context -currentContext: - kubernetes: test-mc -` - expectedCfg2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context -currentContext: - kubernetes: test-mc -` - - return cfg, expectedCfg, cfg2, expectedCfg2 -} -func setupConfigMetadata() string { - metadata := `configMetadata: - patchStrategy: - contexts.group: replace - contexts.clusterOpts.endpoint: replace - contexts.clusterOpts.annotation: replace - clientOptions.cli.discoverySources.gcp.required: replace -` - return metadata -} - -func TestIntegrationWithReplacePatchStrategy(t *testing.T) { - // Setup config data - cfg, expectedCfg, cfg2, expectedCfg2 := setupConfigData() - cfgTestFiles, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2, cfgMetadata: setupConfigMetadata()}) - - defer func() { - cleanUp() - }() - - // Actions - - // Get CLI discovery sources - expectedSources := []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - { - GCP: &configapi.GCPDiscovery{ - Name: "test2", - Bucket: "test-bucket2", - ManifestPath: "test-manifest-path2", - }, - }, - { - Local: &configapi.LocalDiscovery{ - Name: "test-local", - }, - }, - } - - sources, err := GetCLIDiscoverySources() - assert.NoError(t, err) - assert.Equal(t, expectedSources, sources) - - // Get CLI Discovery Source - expectedSource := &configapi.PluginDiscovery{ - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - } - - source, err := GetCLIDiscoverySource("test") - assert.NoError(t, err) - assert.Equal(t, expectedSource, source) - - // Update CLI discovery sources - updatedSources := []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "updated-test-bucket", - ManifestPath: "updated-test-manifest-path", - }, - }, - { - OCI: &configapi.OCIDiscovery{ - Name: "test-local", - Image: "test-local-image-path", - }, - }, - } - - err = SetCLIDiscoverySources(updatedSources) - assert.NoError(t, err) - - // Expectations on file content - file, err := os.ReadFile(cfgTestFiles[0].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg, string(file)) - - file, err = os.ReadFile(cfgTestFiles[1].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg2, string(file)) -} diff --git a/cli/runtime/config/servers.go b/cli/runtime/config/servers.go deleted file mode 100644 index cdcbfcf649..0000000000 --- a/cli/runtime/config/servers.go +++ /dev/null @@ -1,398 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "fmt" - - "github.com/pkg/errors" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config/nodeutils" - - "gopkg.in/yaml.v3" -) - -// GetServer retrieves server by name -func GetServer(name string) (*configapi.Server, error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return nil, err - } - return getServer(node, name) -} - -// ServerExists checks if server by specified name is present in config -func ServerExists(name string) (bool, error) { - exists, _ := GetServer(name) - return exists != nil, nil -} - -// GetCurrentServer retrieves the current server -func GetCurrentServer() (*configapi.Server, error) { - // Retrieve client config node - node, err := getClientConfigNode() - if err != nil { - return nil, err - } - return getCurrentServer(node) -} - -// SetCurrentServer add or update current server -func SetCurrentServer(name string) error { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - s, err := getServer(node, name) - if err != nil { - return err - } - persist, err := setCurrentServer(node, name) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - // Front fill CurrentContext - c := convertServerToContext(s) - persist, err = setCurrentContext(node, c) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - return nil -} - -// RemoveCurrentServer removes the current server if server exists by specified name -func RemoveCurrentServer(name string) error { - // Retrieve client config node - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - _, err = getServer(node, name) - if err != nil { - return err - } - err = removeCurrentServer(node, name) - if err != nil { - return err - } - - // Front fill Context and CurrentContext - c, err := getContext(node, name) - if err != nil { - return err - } - err = removeCurrentContext(node, c) - if err != nil { - return err - } - return persistConfig(node) -} - -// PutServer add or update server and currentServer -func PutServer(s *configapi.Server, setCurrent bool) error { - return SetServer(s, setCurrent) -} - -// AddServer add or update server and currentServer -func AddServer(s *configapi.Server, setCurrent bool) error { - return SetServer(s, setCurrent) -} - -// SetServer add or update server and currentServer -func SetServer(s *configapi.Server, setCurrent bool) error { - // Acquire tanzu config lock - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - persist, err := setServer(node, s) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - if setCurrent && s.Type == configapi.ManagementClusterServerType { - persist, err = setCurrentServer(node, s.Name) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - } - - err = frontFillContexts(s, setCurrent, node) - if err != nil { - return err - } - - return nil -} - -func frontFillContexts(s *configapi.Server, setCurrent bool, node *yaml.Node) error { - // Front fill Context and CurrentContext - c := convertServerToContext(s) - persist, err := setContext(node, c) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - if setCurrent { - persist, err = setCurrentContext(node, c) - if err != nil { - return err - } - if persist { - err = persistConfig(node) - if err != nil { - return err - } - } - } - return nil -} - -// DeleteServer deletes the server specified by name -func DeleteServer(name string) error { - return RemoveServer(name) -} - -// RemoveServer removed the server by name -func RemoveServer(name string) error { - AcquireTanzuConfigLock() - defer ReleaseTanzuConfigLock() - node, err := getClientConfigNodeNoLock() - if err != nil { - return err - } - _, err = getServer(node, name) - if err != nil { - return err - } - err = removeCurrentServer(node, name) - if err != nil { - return err - } - err = removeServer(node, name) - if err != nil { - return err - } - // Front fill Context and CurrentContext - c, err := getContext(node, name) - if err != nil { - return err - } - err = removeCurrentContext(node, c) - if err != nil { - return err - } - err = removeContext(node, name) - if err != nil { - return err - } - return persistConfig(node) -} - -func setCurrentServer(node *yaml.Node, name string) (persist bool, err error) { - s, err := getServer(node, name) - if err != nil { - return false, err - } - - if s.Type != configapi.ManagementClusterServerType { - return false, errors.Errorf("cannot set non management-cluster server as current server") - } - - // find current server node - keys := []nodeutils.Key{ - {Name: KeyCurrentServer, Type: yaml.ScalarNode, Value: ""}, - } - currentServerNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if currentServerNode == nil { - return persist, nodeutils.ErrNodeNotFound - } - if currentServerNode.Value != name { - currentServerNode.Value = name - persist = true - } - return persist, err -} - -func getServer(node *yaml.Node, name string) (*configapi.Server, error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - for _, server := range cfg.KnownServers { - if server.Name == name { - return server, nil - } - } - return nil, fmt.Errorf("could not find server %q", name) -} - -func getCurrentServer(node *yaml.Node) (s *configapi.Server, err error) { - cfg, err := convertNodeToClientConfig(node) - if err != nil { - return nil, err - } - for _, server := range cfg.KnownServers { - if server.Name == cfg.CurrentServer { - return server, nil - } - } - return s, fmt.Errorf("current server %q not found in tanzu config", cfg.CurrentServer) -} - -func removeCurrentServer(node *yaml.Node, name string) error { - // find current server node - keys := []nodeutils.Key{ - {Name: KeyCurrentServer}, - } - currentServerNode := nodeutils.FindNode(node.Content[0], nodeutils.WithKeys(keys)) - if currentServerNode == nil { - return nil - } - if currentServerNode.Value == name { - currentServerNode.Value = "" - } - return nil -} - -//nolint:dupl -func removeServer(node *yaml.Node, name string) error { - // find servers node - keys := []nodeutils.Key{ - {Name: KeyServers}, - } - serversNode := nodeutils.FindNode(node.Content[0], nodeutils.WithKeys(keys)) - if serversNode == nil { - return nil - } - var servers []*yaml.Node - for _, serverNode := range serversNode.Content { - if index := nodeutils.GetNodeIndex(serverNode.Content, "name"); index != -1 && serverNode.Content[index].Value == name { - continue - } - servers = append(servers, serverNode) - } - serversNode.Content = servers - return nil -} - -func setServers(node *yaml.Node, servers []*configapi.Server) error { - for _, server := range servers { - _, err := setServer(node, server) - if err != nil { - return err - } - } - return nil -} - -func setServer(node *yaml.Node, s *configapi.Server) (persist bool, err error) { - // Get Patch Strategies - patchStrategies, err := GetConfigMetadataPatchStrategy() - if err != nil { - patchStrategies = make(map[string]string) - } - var persistDiscoverySources bool - - // convert server to node - newServerNode, err := convertServerToNode(s) - if err != nil { - return persist, err - } - - // find servers node - keys := []nodeutils.Key{ - {Name: KeyServers, Type: yaml.SequenceNode}, - } - serversNode := nodeutils.FindNode(node.Content[0], nodeutils.WithForceCreate(), nodeutils.WithKeys(keys)) - if serversNode == nil { - return persist, nodeutils.ErrNodeNotFound - } - exists := false - var result []*yaml.Node - //nolint: dupl - for _, serverNode := range serversNode.Content { - if index := nodeutils.GetNodeIndex(serverNode.Content, "name"); index != -1 && - serverNode.Content[index].Value == s.Name { - exists = true - _, err = nodeutils.DeleteNodes(newServerNode.Content[0], serverNode, nodeutils.WithPatchStrategyKey(KeyServers), nodeutils.WithPatchStrategies(patchStrategies)) - if err != nil { - return false, err - } - persist, err = nodeutils.MergeNodes(newServerNode.Content[0], serverNode) - if err != nil { - return false, err - } - // add or update discovery sources of server - persistDiscoverySources, err = setDiscoverySources(serverNode, s.DiscoverySources, nodeutils.WithPatchStrategyKey(fmt.Sprintf("%v.%v", KeyServers, KeyDiscoverySources)), nodeutils.WithPatchStrategies(patchStrategies)) - if err != nil { - return false, err - } - if persistDiscoverySources { - _, err = nodeutils.MergeNodes(newServerNode.Content[0], serverNode) - if err != nil { - return false, err - } - } - result = append(result, serverNode) - continue - } - result = append(result, serverNode) - } - if !exists { - result = append(result, newServerNode.Content[0]) - persist = true - } - serversNode.Content = result - return persistDiscoverySources || persist, err -} - -// EndpointFromServer returns the endpoint from server. -func EndpointFromServer(s *configapi.Server) (endpoint string, err error) { - switch s.Type { - case configapi.ManagementClusterServerType: - return s.ManagementClusterOpts.Endpoint, nil - case configapi.GlobalServerType: - return s.GlobalOpts.Endpoint, nil - default: - return endpoint, fmt.Errorf("unknown server type %q", s.Type) - } -} diff --git a/cli/runtime/config/servers_it_test.go b/cli/runtime/config/servers_it_test.go deleted file mode 100644 index ec380b4d00..0000000000 --- a/cli/runtime/config/servers_it_test.go +++ /dev/null @@ -1,375 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func setupServersTestData() (string, string, string, string) { - cfg := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "/:" - unknown: cli-unknown - contextType: k8s - - local: - name: default-local - contextType: k8s - - local: - name: admin-local - path: admin -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: test-endpoint - path: test-path - context: test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc -current: test-mc -` - expectedCfg := `clientOptions: - cli: - discoverySources: - - oci: - name: default - image: "/:" - unknown: cli-unknown - contextType: k8s - - local: - name: default-local - contextType: k8s - - local: - name: admin-local - path: admin -servers: - - name: test-mc - type: managementcluster - managementClusterOpts: - endpoint: test-endpoint - path: test-path - context: test-context - annotation: one - required: true - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - name: test-mc2 - type: managementcluster - managementClusterOpts: - endpoint: test-endpoint-updated - path: test-path - discoverySources: - - gcp: - name: test - bucket: test-bucket-updated - manifestPath: test-manifest-path -current: test-mc2 -` - - cfg2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc -currentContext: - kubernetes: test-mc -` - expectedCfg2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - name: test-mc2 - target: kubernetes - clusterOpts: - endpoint: test-endpoint-updated - path: test-path - isManagementCluster: true - discoverySources: - - gcp: - name: test - bucket: test-bucket-updated - manifestPath: test-manifest-path -currentContext: - kubernetes: test-mc2 -` - - return cfg, expectedCfg, cfg2, expectedCfg2 -} - -func TestServersIntegration(t *testing.T) { - // Setup config data - cfg, expectedCfg, cfg2, expectedCfg2 := setupServersTestData() - cfgTestFiles, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2}) - - defer func() { - cleanUp() - }() - - // Get Server - server, err := GetServer("test-mc") - expected := &configapi.Server{ - Name: "test-mc", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-context", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - assert.Nil(t, err) - assert.Equal(t, expected, server) - // Add new Server - newServer := &configapi.Server{ - Name: "test-mc2", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - err = SetServer(newServer, true) - assert.NoError(t, err) - s, err := GetServer("test-mc2") - assert.Nil(t, err) - assert.Equal(t, newServer, s) - // Update existing Server - updatedServer := &configapi.Server{ - Name: "test-mc2", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint-updated", - Path: "test-path", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket-updated", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - err = SetServer(updatedServer, true) - assert.NoError(t, err) - s, err = GetServer("test-mc2") - assert.Nil(t, err) - assert.Equal(t, updatedServer, s) - - file, err := os.ReadFile(cfgTestFiles[0].Name()) - assert.NoError(t, err) - content := string(file) - assert.Equal(t, expectedCfg, content) - - file, err = os.ReadFile(cfgTestFiles[1].Name()) - assert.NoError(t, err) - content = string(file) - assert.Equal(t, expectedCfg2, content) - - // Delete server - err = DeleteServer("test-mc2") - assert.NoError(t, err) - s, err = GetServer("test-mc2") - assert.Equal(t, err.Error(), "could not find server \"test-mc2\"") - assert.Nil(t, s) -} - -func TestServersIntegrationAndMigratedToNewConfig(t *testing.T) { - // Setup config data - cfg, _, cfg2, _ := setupServersTestData() - expectedCfg2 := `contexts: - - name: test-mc - target: kubernetes - group: one - clusterOpts: - isManagementCluster: true - annotation: one - required: true - annotationStruct: - one: one - endpoint: test-endpoint - path: test-path - context: test-context - discoverySources: - - gcp: - name: test - bucket: test-bucket - manifestPath: test-manifest-path - annotation: one - required: true - contextType: tmc - - name: test-mc2 - target: kubernetes - clusterOpts: - endpoint: test-endpoint-updated - path: test-path - isManagementCluster: true - discoverySources: - - gcp: - name: test - bucket: test-bucket-updated - manifestPath: test-manifest-path -currentContext: - kubernetes: test-mc2 -servers: - - name: test-mc2 - type: managementcluster - managementClusterOpts: - endpoint: test-endpoint-updated - path: test-path - discoverySources: - - gcp: - name: test - bucket: test-bucket-updated - manifestPath: test-manifest-path -current: test-mc2 -` - // Setup config data - cfgTestFiles, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2, cfgMetadata: setupConfigMetadataWithMigrateToNewConfig()}) - - defer func() { - cleanUp() - }() - - _, err := GetServer("test-mc") - assert.Equal(t, "could not find server \"test-mc\"", err.Error()) - - // Add new Server - newServer := &configapi.Server{ - Name: "test-mc2", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - err = SetServer(newServer, true) - assert.NoError(t, err) - - s, err := GetServer("test-mc2") - assert.Nil(t, err) - assert.Equal(t, newServer, s) - - // Update existing Server - updatedServer := &configapi.Server{ - Name: "test-mc2", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint-updated", - Path: "test-path", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket-updated", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - err = SetServer(updatedServer, true) - assert.NoError(t, err) - s, err = GetServer("test-mc2") - assert.Nil(t, err) - assert.Equal(t, updatedServer, s) - - file, err := os.ReadFile(cfgTestFiles[0].Name()) - assert.NoError(t, err) - assert.Equal(t, cfg, string(file)) - - file, err = os.ReadFile(cfgTestFiles[1].Name()) - assert.NoError(t, err) - assert.Equal(t, expectedCfg2, string(file)) - - // Delete server - err = DeleteServer("test-mc2") - assert.NoError(t, err) - s, err = GetServer("test-mc2") - assert.Equal(t, err.Error(), "could not find server \"test-mc2\"") - assert.Nil(t, s) -} diff --git a/cli/runtime/config/servers_test.go b/cli/runtime/config/servers_test.go deleted file mode 100644 index a3218077f2..0000000000 --- a/cli/runtime/config/servers_test.go +++ /dev/null @@ -1,514 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package config - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -func TestSetGetDeleteServer(t *testing.T) { - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - server1 := &configapi.Server{ - Name: "test1", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-server", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - server2 := &configapi.Server{ - Name: "test2", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-server", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - } - - s, err := GetServer("test1") - assert.Equal(t, "could not find server \"test1\"", err.Error()) - assert.Nil(t, s) - - err = SetServer(server1, true) - assert.NoError(t, err) - - s, err = GetServer("test1") - assert.Nil(t, err) - assert.Equal(t, server1, s) - - s, err = GetCurrentServer() - assert.Nil(t, err) - assert.Equal(t, server1, s) - - err = SetServer(server2, false) - assert.NoError(t, err) - - s, err = GetServer("test2") - assert.Nil(t, err) - assert.Equal(t, server2, s) - - server, err := GetCurrentServer() - assert.Nil(t, err) - assert.Equal(t, server1, server) - - err = DeleteServer("test1") - assert.Nil(t, err) - - err = DeleteServer("test2") - assert.Nil(t, err) - - server, err = GetServer("test2") - assert.Nil(t, server) - assert.Equal(t, "could not find server \"test2\"", err.Error()) -} - -func TestGetServer(t *testing.T) { - // Setup config data - cfg, cfg2 := setupMultiCfgData() - _, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2}) - - defer func() { - cleanUp() - }() - - tcs := []struct { - name string - serverName string - errStr string - }{ - { - name: "success test-mc", - serverName: "test-mc", - }, - { - name: "success test-mc2", - serverName: "test-mc2", - }, - { - name: "failure", - serverName: "test", - errStr: "could not find server \"test\"", - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - c, err := GetServer(tc.serverName) - if tc.errStr == "" { - assert.Equal(t, tc.serverName, c.Name) - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - }) - } -} - -func TestServerExists(t *testing.T) { - // Setup config data - cfg, cfg2 := setupMultiCfgData() - _, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2}) - - defer func() { - cleanUp() - }() - - tcs := []struct { - name string - serverName string - ok bool - }{ - { - name: "success test-mc", - serverName: "test-mc", - ok: true, - }, - { - name: "success test-mc2", - serverName: "test-mc2", - ok: true, - }, - { - name: "failure", - serverName: "test", - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - ok, err := ServerExists(tc.serverName) - assert.Equal(t, tc.ok, ok) - assert.NoError(t, err) - }) - } -} - -func TestSetServer(t *testing.T) { - // Setup config data - cfg, cfg2 := setupMultiCfgData() - _, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2}) - - defer func() { - cleanUp() - }() - - tcs := []struct { - name string - server *configapi.Server - current bool - errStr string - }{ - { - name: "should add new server and set current on empty config", - server: &configapi.Server{ - Name: "test", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-server", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - current: true, - }, - { - name: "should add new server but not current", - server: &configapi.Server{ - Name: "test2", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-server", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - { - name: "success tmc current", - server: &configapi.Server{ - Name: "test-tmc1", - Type: "tmc", - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - current: true, - }, - { - name: "success tmc not_current", - server: &configapi.Server{ - Name: "test-tmc2", - Type: "tmc", - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "test-endpoint", - }, - }, - }, - { - name: "success update test-mc", - server: &configapi.Server{ - Name: "test", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-server", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - { - name: "success update tmc", - server: &configapi.Server{ - Name: "test-tmc", - Type: "tmc", - GlobalOpts: &configapi.GlobalServer{ - Endpoint: "updated-test-endpoint", - }, - }, - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - // perform test - err := SetServer(tc.server, tc.current) - if tc.errStr == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - server, err := GetServer(tc.server.Name) - assert.NoError(t, err) - assert.Equal(t, tc.server.Name, server.Name) - s, err := GetServer(tc.server.Name) - assert.NoError(t, err) - assert.Equal(t, tc.server.Name, s.Name) - }) - } -} - -func TestRemoveServer(t *testing.T) { - // Setup config data - cfg, cfg2 := setupMultiCfgData() - _, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2}) - - defer func() { - cleanUp() - }() - - tcs := []struct { - name string - serverName string - errStr string - }{ - { - name: "success test-mc", - serverName: "test-mc", - }, - { - name: "success test-mc2", - serverName: "test-mc2", - }, - { - name: "failure", - serverName: "test", - errStr: "could not find server \"test\"", - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - if tc.errStr == "" { - ok, err := ServerExists(tc.serverName) - require.True(t, ok) - require.NoError(t, err) - } - err := RemoveServer(tc.serverName) - if tc.errStr == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - ok, err := ServerExists(tc.serverName) - assert.False(t, ok) - assert.NoError(t, err) - ok, err = ServerExists(tc.serverName) - assert.Nil(t, err) - assert.False(t, ok) - }) - } -} - -func TestSetCurrentServer(t *testing.T) { - // Setup config data - cfg, cfg2 := setupMultiCfgData() - _, cleanUp := setupTestConfig(t, &CfgTestData{cfg: cfg, cfgNextGen: cfg2}) - - defer func() { - cleanUp() - }() - - tcs := []struct { - name string - serverName string - errStr string - }{ - { - name: "success mc", - serverName: "test-mc", - }, - { - name: "failure", - serverName: "test", - errStr: "could not find server \"test\"", - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - err := SetCurrentServer(tc.serverName) - if tc.errStr != "" { - assert.Equal(t, "could not find server \"test\"", err.Error()) - } else { - assert.NoError(t, err) - currCtx, err := GetCurrentServer() - if tc.errStr != "" { - assert.Equal(t, "", err.Error()) - } else { - assert.Equal(t, tc.serverName, currCtx.Name) - assert.NoError(t, err) - } - } - }) - } -} - -func TestSetSingleServer(t *testing.T) { - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{}) - - defer func() { - cleanUp() - }() - - tcs := []struct { - name string - server *configapi.Server - current bool - errStr string - }{ - { - name: "success k8s current", - server: &configapi.Server{ - Name: "test", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-server", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - err := SetServer(tc.server, tc.current) - if tc.errStr == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - ok, err := ServerExists(tc.server.Name) - assert.True(t, ok) - assert.NoError(t, err) - ok, err = ServerExists(tc.server.Name) - assert.True(t, ok) - assert.NoError(t, err) - }) - } -} - -func TestSetSingleServerWithMigrateToNewConfig(t *testing.T) { - // Setup config data - _, cleanUp := setupTestConfig(t, &CfgTestData{cfgMetadata: setupConfigMetadataWithMigrateToNewConfig()}) - - defer func() { - cleanUp() - }() - - tcs := []struct { - name string - server *configapi.Server - current bool - errStr string - }{ - { - name: "success k8s current", - server: &configapi.Server{ - Name: "test", - Type: "managementcluster", - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Endpoint: "test-endpoint", - Path: "test-path", - Context: "test-server", - }, - DiscoverySources: []configapi.PluginDiscovery{ - { - GCP: &configapi.GCPDiscovery{ - Name: "test", - Bucket: "test-bucket", - ManifestPath: "test-manifest-path", - }, - }, - }, - }, - }, - } - - for _, tc := range tcs { - t.Run(tc.name, func(t *testing.T) { - err := SetServer(tc.server, tc.current) - if tc.errStr == "" { - assert.NoError(t, err) - } else { - assert.EqualError(t, err, tc.errStr) - } - ok, err := ServerExists(tc.server.Name) - assert.True(t, ok) - assert.NoError(t, err) - ok, err = ServerExists(tc.server.Name) - assert.True(t, ok) - assert.NoError(t, err) - }) - } -} diff --git a/cli/runtime/docs/README.md b/cli/runtime/docs/README.md deleted file mode 100644 index 68aba3e880..0000000000 --- a/cli/runtime/docs/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Tanzu CLI Integration Library - -This library provides functionality useful in the development of Tanzu CLI plugins. It includes: - -1. Component library -1. Config library -1. Plugin helpers -1. Command helpers -1. Test helpers - -## Component Library - -This package implements reusable CLI user interface components, including: - -- output writers (table, listtable, json, yaml, spinner) -- prompt -- selector -- question - -## Config Library - -This package implements helper functions to read, write and update the tanzu configuration file (`~/.config/tanzu/config.yaml`). - -## Plugin Helpers - -This package implements helper functions for new plugin creation. This is one of the main packages that each and every plugin will need to import to integrate with the Tanzu CLI. - -## Command Helpers - -This package implements command specific helper functions like command deprecation, etc. - -## Test Helpers - -This package implements helper functions to develop test plugins. diff --git a/cli/runtime/generated/crd/bases/cli.tanzu.vmware.com_catalogs.yaml b/cli/runtime/generated/crd/bases/cli.tanzu.vmware.com_catalogs.yaml deleted file mode 100644 index c3948e5134..0000000000 --- a/cli/runtime/generated/crd/bases/cli.tanzu.vmware.com_catalogs.yaml +++ /dev/null @@ -1,256 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: catalogs.cli.tanzu.vmware.com -spec: - group: cli.tanzu.vmware.com - names: - kind: Catalog - listKind: CatalogList - plural: catalogs - singular: catalog - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: Catalog is the Schema for the catalogs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - indexByName: - additionalProperties: - items: - type: string - type: array - description: IndeByName of all plugin installation paths by name. - type: object - indexByPath: - additionalProperties: - description: PluginDescriptor describes a plugin binary. - properties: - aliases: - description: Aliases are other text strings used to call this command - items: - type: string - type: array - buildSHA: - description: BuildSHA is the git commit hash the plugin was built - with. - type: string - completionArgs: - description: CompletionArgs contains the valid command line completion - values if `CompletionType` is set to `StaticPluginCompletion`. - items: - type: string - type: array - completionCmd: - description: CompletionCommand is the command to call from the plugin - to retrieve a list of valid completion nouns when `CompletionType` - is set to `DynamicPluginCompletion`. - type: string - completionType: - description: CompletionType determines how command line completion - will be determined. - type: integer - defaultFeatureFlags: - additionalProperties: - type: boolean - description: DefaultFeatureFlags is default featureflags to be configured - if missing when invoking plugin - type: object - description: - description: Description is the plugin's description. - type: string - digest: - description: Digest is the SHA256 hash of the plugin binary. - type: string - discoveredRecommendedVersion: - description: DiscoveredRecommendedVersion specifies the recommended - version of the plugin that was discovered - type: string - discovery: - description: Discovery is the name of the discovery from where this - plugin is discovered. - type: string - docURL: - description: DocURL for the plugin. - type: string - group: - description: Command group for the plugin. - type: string - hidden: - description: Hidden tells whether the plugin should be hidden from - the help command. - type: boolean - installationPath: - description: InstallationPath is a relative installation path for - a plugin binary. E.g., cluster/v0.3.2@sha256:... - type: string - name: - description: Name is the name of the plugin. - type: string - scope: - description: Scope is the scope of the plugin. Stand-Alone or Context - type: string - status: - description: Status is the current plugin installation status - type: string - target: - description: Target specifies the target of the plugin - type: string - version: - description: Version of the plugin. Must be a valid semantic version - https://semver.org/ - type: string - required: - - buildSHA - - completionType - - defaultFeatureFlags - - description - - digest - - discoveredRecommendedVersion - - discovery - - docURL - - group - - installationPath - - name - - scope - - status - - target - - version - type: object - description: IndexByPath of PluginDescriptors for all installed plugins - by installation path. - type: object - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - pluginDescriptors: - description: PluginDescriptors is a list of PluginDescriptor - items: - description: PluginDescriptor describes a plugin binary. - properties: - aliases: - description: Aliases are other text strings used to call this command - items: - type: string - type: array - buildSHA: - description: BuildSHA is the git commit hash the plugin was built - with. - type: string - completionArgs: - description: CompletionArgs contains the valid command line completion - values if `CompletionType` is set to `StaticPluginCompletion`. - items: - type: string - type: array - completionCmd: - description: CompletionCommand is the command to call from the plugin - to retrieve a list of valid completion nouns when `CompletionType` - is set to `DynamicPluginCompletion`. - type: string - completionType: - description: CompletionType determines how command line completion - will be determined. - type: integer - defaultFeatureFlags: - additionalProperties: - type: boolean - description: DefaultFeatureFlags is default featureflags to be configured - if missing when invoking plugin - type: object - description: - description: Description is the plugin's description. - type: string - digest: - description: Digest is the SHA256 hash of the plugin binary. - type: string - discoveredRecommendedVersion: - description: DiscoveredRecommendedVersion specifies the recommended - version of the plugin that was discovered - type: string - discovery: - description: Discovery is the name of the discovery from where this - plugin is discovered. - type: string - docURL: - description: DocURL for the plugin. - type: string - group: - description: Command group for the plugin. - type: string - hidden: - description: Hidden tells whether the plugin should be hidden from - the help command. - type: boolean - installationPath: - description: InstallationPath is a relative installation path for - a plugin binary. E.g., cluster/v0.3.2@sha256:... - type: string - name: - description: Name is the name of the plugin. - type: string - scope: - description: Scope is the scope of the plugin. Stand-Alone or Context - type: string - status: - description: Status is the current plugin installation status - type: string - target: - description: Target specifies the target of the plugin - type: string - version: - description: Version of the plugin. Must be a valid semantic version - https://semver.org/ - type: string - required: - - buildSHA - - completionType - - defaultFeatureFlags - - description - - digest - - discoveredRecommendedVersion - - discovery - - docURL - - group - - installationPath - - name - - scope - - status - - target - - version - type: object - type: array - serverPlugins: - additionalProperties: - additionalProperties: - type: string - description: PluginAssociation is a set of plugin names and their associated - installation paths. - type: object - description: ServerPlugins links a server and a set of associated plugin - installations. - type: object - standAlonePlugins: - additionalProperties: - type: string - description: 'StandAlonePlugins is a set of stand-alone plugin installations - aggregated across all context types. Note: Shall be reduced to only - those stand-alone plugins that are common to all context types.' - type: object - type: object - served: true - storage: true diff --git a/cli/runtime/generated/crd/bases/config.tanzu.vmware.com_clientconfigs.yaml b/cli/runtime/generated/crd/bases/config.tanzu.vmware.com_clientconfigs.yaml deleted file mode 100644 index 91d3c7bb20..0000000000 --- a/cli/runtime/generated/crd/bases/config.tanzu.vmware.com_clientconfigs.yaml +++ /dev/null @@ -1,524 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: clientconfigs.config.tanzu.vmware.com -spec: - group: config.tanzu.vmware.com - names: - kind: ClientConfig - listKind: ClientConfigList - plural: clientconfigs - singular: clientconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: ClientConfig is the Schema for the configs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - clientOptions: - description: ClientOptions are client specific options like feature flags, - environment variables, repositories, discoverySources, etc. - properties: - cli: - description: CLI options specific to the CLI. - properties: - bomRepo: - description: 'Deprecated: BOMRepo has been deprecated and will - be removed from future version BOMRepo is the root repository - URL used to resolve the compatibiilty file and bill of materials. - An example URL is projects.registry.vmware.com/tkg.' - type: string - compatibilityFilePath: - description: 'Deprecated: CompatibilityFilePath has been deprecated - and will be removed from future version CompatibilityFilePath - is the path, from the BOM repo, to download and access the compatibility - file. the compatibility file is used for resolving the bill - of materials for creating clusters.' - type: string - discoverySources: - description: DiscoverySources determines from where to discover - stand-alone plugins - items: - description: PluginDiscovery contains a specific distribution - mechanism. Only one of the configs must be set. - properties: - gcp: - description: GCPStorage is set if the plugins are to be - discovered via Google Cloud Storage. - properties: - bucket: - description: Bucket is a Google Cloud Storage bucket. - E.g., tanzu-cli - type: string - manifestPath: - description: BasePath is a URI path that is prefixed - to the object name/path. E.g., plugins/cluster - type: string - name: - description: Name is a name of the discovery - type: string - type: object - k8s: - description: KubernetesDiscovery is set if the plugins are - to be discovered via the Kubernetes API server. - properties: - context: - description: The context to use (if required), defaults - to current. - type: string - name: - description: Name is a name of the discovery - type: string - path: - description: Path to the kubeconfig. - type: string - version: - description: Version of the CLIPlugins API to query. - E.g., v1alpha1 - type: string - type: object - local: - description: LocalDiscovery is set if the plugins are to - be discovered via Local Manifest fast. - properties: - name: - description: Name is a name of the discovery - type: string - path: - description: Path is a local path pointing to directory - containing YAML files, each of which contains single - CLIPlugin API resource. - type: string - type: object - oci: - description: OCIDiscovery is set if the plugins are to be - discovered via an OCI Image Registry. - properties: - image: - description: Image is an OCI compliant image. Which - include DNS-compatible registry name, a valid URI - path(MAY contain zero or more ‘/’) and a valid tag. - E.g., harbor.my-domain.local/tanzu-cli/plugins-manifest:latest - Contains a directory containing YAML files, each of - which contains single CLIPlugin API resource. - type: string - name: - description: Name is a name of the discovery - type: string - type: object - rest: - description: GenericRESTDiscovery is set if the plugins - are to be discovered via a REST API endpoint. - properties: - basePath: - description: BasePath is the base URL path of the plugin - discovery API. E.g., /v1alpha1/cli/plugins - type: string - endpoint: - description: Endpoint is the REST API server endpoint. - E.g., api.my-domain.local - type: string - name: - description: Name is a name of the discovery - type: string - type: object - type: object - type: array - edition: - description: 'Deprecated: Edition has been deprecated and will - be removed from future version Edition' - type: string - repositories: - description: Repositories are the plugin repositories. - items: - description: PluginRepository is a CLI plugin repository - properties: - gcpPluginRepository: - description: GCPPluginRepository is a plugin repository - that utilizes GCP cloud storage. - properties: - bucketName: - description: BucketName is the name of the bucket. - type: string - name: - description: Name of the repository. - type: string - rootPath: - description: RootPath within the bucket. - type: string - type: object - type: object - type: array - unstableVersionSelector: - description: UnstableVersionSelector determined which version - tags are allowed - type: string - type: object - env: - additionalProperties: - type: string - type: object - features: - additionalProperties: - additionalProperties: - type: string - description: FeatureMap is simply a hash table, but needs an explicit - type to be an object in another hash map (cf ClientOptions.Features) - type: object - type: object - type: object - contexts: - description: KnownContexts available. - items: - description: Context configuration for a control plane. This can one - of the following, 1. Kubernetes Cluster 2. Tanzu Mission Control endpoint - properties: - clusterOpts: - description: ClusterOpts if the context is a kubernetes cluster. - properties: - context: - description: The kubernetes context to use (if required), defaults - to current. - type: string - endpoint: - description: Endpoint for the login. - type: string - isManagementCluster: - description: Denotes whether this server is a management cluster - or not (workload cluster). - type: boolean - path: - description: Path to the kubeconfig. - type: string - type: object - discoverySources: - description: DiscoverySources determines from where to discover - plugins associated with this context. - items: - description: PluginDiscovery contains a specific distribution - mechanism. Only one of the configs must be set. - properties: - gcp: - description: GCPStorage is set if the plugins are to be discovered - via Google Cloud Storage. - properties: - bucket: - description: Bucket is a Google Cloud Storage bucket. - E.g., tanzu-cli - type: string - manifestPath: - description: BasePath is a URI path that is prefixed to - the object name/path. E.g., plugins/cluster - type: string - name: - description: Name is a name of the discovery - type: string - type: object - k8s: - description: KubernetesDiscovery is set if the plugins are - to be discovered via the Kubernetes API server. - properties: - context: - description: The context to use (if required), defaults - to current. - type: string - name: - description: Name is a name of the discovery - type: string - path: - description: Path to the kubeconfig. - type: string - version: - description: Version of the CLIPlugins API to query. E.g., - v1alpha1 - type: string - type: object - local: - description: LocalDiscovery is set if the plugins are to be - discovered via Local Manifest fast. - properties: - name: - description: Name is a name of the discovery - type: string - path: - description: Path is a local path pointing to directory - containing YAML files, each of which contains single - CLIPlugin API resource. - type: string - type: object - oci: - description: OCIDiscovery is set if the plugins are to be - discovered via an OCI Image Registry. - properties: - image: - description: Image is an OCI compliant image. Which include - DNS-compatible registry name, a valid URI path(MAY contain - zero or more ‘/’) and a valid tag. E.g., harbor.my-domain.local/tanzu-cli/plugins-manifest:latest - Contains a directory containing YAML files, each of - which contains single CLIPlugin API resource. - type: string - name: - description: Name is a name of the discovery - type: string - type: object - rest: - description: GenericRESTDiscovery is set if the plugins are - to be discovered via a REST API endpoint. - properties: - basePath: - description: BasePath is the base URL path of the plugin - discovery API. E.g., /v1alpha1/cli/plugins - type: string - endpoint: - description: Endpoint is the REST API server endpoint. - E.g., api.my-domain.local - type: string - name: - description: Name is a name of the discovery - type: string - type: object - type: object - type: array - globalOpts: - description: GlobalOpts if the context is a global control plane - (e.g., TMC). - properties: - auth: - description: Auth for the global server. - properties: - IDToken: - description: IDToken is the current id token based on the - context scoped to the CLI. - type: string - accessToken: - description: AccessToken is the current access token based - on the context. - type: string - expiration: - description: Expiration times of the token. - format: date-time - type: string - issuer: - description: Issuer url for IDP, compliant with OIDC Metadata - Discovery. - type: string - permissions: - description: Permissions are roles assigned to the user. - items: - type: string - type: array - refresh_token: - description: RefreshToken will be stored only in case of - api-token login flow. - type: string - type: - description: Type of the token (user or client). - type: string - userName: - description: UserName is the authorized user the token is - assigned to. - type: string - required: - - type - type: object - endpoint: - description: Endpoint for the server. - type: string - type: object - name: - description: Name of the context. - type: string - target: - description: Target of the context. - type: string - type: object - type: array - current: - description: CurrentServer in use. Deprecation targeted for a future version. - Superseded by CurrentContext. - type: string - currentContext: - additionalProperties: - type: string - description: CurrentContext for every type. - type: object - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - servers: - description: KnownServers available. Deprecation targeted for a future - version. Superseded by KnownContexts. - items: - description: Server connection. Deprecation targeted for a future version. - Superseded by Context. - properties: - discoverySources: - description: DiscoverySources determines from where to discover - plugins associated with this server - items: - description: PluginDiscovery contains a specific distribution - mechanism. Only one of the configs must be set. - properties: - gcp: - description: GCPStorage is set if the plugins are to be discovered - via Google Cloud Storage. - properties: - bucket: - description: Bucket is a Google Cloud Storage bucket. - E.g., tanzu-cli - type: string - manifestPath: - description: BasePath is a URI path that is prefixed to - the object name/path. E.g., plugins/cluster - type: string - name: - description: Name is a name of the discovery - type: string - type: object - k8s: - description: KubernetesDiscovery is set if the plugins are - to be discovered via the Kubernetes API server. - properties: - context: - description: The context to use (if required), defaults - to current. - type: string - name: - description: Name is a name of the discovery - type: string - path: - description: Path to the kubeconfig. - type: string - version: - description: Version of the CLIPlugins API to query. E.g., - v1alpha1 - type: string - type: object - local: - description: LocalDiscovery is set if the plugins are to be - discovered via Local Manifest fast. - properties: - name: - description: Name is a name of the discovery - type: string - path: - description: Path is a local path pointing to directory - containing YAML files, each of which contains single - CLIPlugin API resource. - type: string - type: object - oci: - description: OCIDiscovery is set if the plugins are to be - discovered via an OCI Image Registry. - properties: - image: - description: Image is an OCI compliant image. Which include - DNS-compatible registry name, a valid URI path(MAY contain - zero or more ‘/’) and a valid tag. E.g., harbor.my-domain.local/tanzu-cli/plugins-manifest:latest - Contains a directory containing YAML files, each of - which contains single CLIPlugin API resource. - type: string - name: - description: Name is a name of the discovery - type: string - type: object - rest: - description: GenericRESTDiscovery is set if the plugins are - to be discovered via a REST API endpoint. - properties: - basePath: - description: BasePath is the base URL path of the plugin - discovery API. E.g., /v1alpha1/cli/plugins - type: string - endpoint: - description: Endpoint is the REST API server endpoint. - E.g., api.my-domain.local - type: string - name: - description: Name is a name of the discovery - type: string - type: object - type: object - type: array - globalOpts: - description: GlobalOpts if the server is global. - properties: - auth: - description: Auth for the global server. - properties: - IDToken: - description: IDToken is the current id token based on the - context scoped to the CLI. - type: string - accessToken: - description: AccessToken is the current access token based - on the context. - type: string - expiration: - description: Expiration times of the token. - format: date-time - type: string - issuer: - description: Issuer url for IDP, compliant with OIDC Metadata - Discovery. - type: string - permissions: - description: Permissions are roles assigned to the user. - items: - type: string - type: array - refresh_token: - description: RefreshToken will be stored only in case of - api-token login flow. - type: string - type: - description: Type of the token (user or client). - type: string - userName: - description: UserName is the authorized user the token is - assigned to. - type: string - required: - - type - type: object - endpoint: - description: Endpoint for the server. - type: string - type: object - managementClusterOpts: - description: ManagementClusterOpts if the server is a management - cluster. - properties: - context: - description: The context to use (if required), defaults to current. - type: string - endpoint: - description: Endpoint for the login. - type: string - path: - description: Path to the kubeconfig. - type: string - type: object - name: - description: Name of the server. - type: string - type: - description: Type of the endpoint. - type: string - type: object - type: array - type: object - served: true - storage: true diff --git a/cli/runtime/go.mod b/cli/runtime/go.mod deleted file mode 100644 index 848e037799..0000000000 --- a/cli/runtime/go.mod +++ /dev/null @@ -1,70 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/cli/runtime - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/config => ../../apis/config -) - -require ( - github.com/AlecAivazis/survey/v2 v2.3.5 - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/briandowns/spinner v1.19.0 - github.com/google/go-cmp v0.5.8 - github.com/google/uuid v1.3.0 - github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b - github.com/logrusorgru/aurora v2.0.3+incompatible - github.com/mattn/go-isatty v0.0.16 - github.com/olekukonko/tablewriter v0.0.5 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.18.1 - github.com/pkg/errors v0.9.1 - github.com/spf13/cobra v1.5.0 - github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.0 - github.com/tj/assert v0.0.3 - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 - go.uber.org/multierr v1.6.0 - golang.org/x/mod v0.8.0 - golang.org/x/sync v0.1.0 - gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.1 - k8s.io/apimachinery v0.24.2 - sigs.k8s.io/controller-runtime v0.12.3 -) - -require ( - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fatih/color v1.9.0 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/mattn/go-colorable v0.1.4 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - google.golang.org/protobuf v1.27.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect -) diff --git a/cli/runtime/go.sum b/cli/runtime/go.sum deleted file mode 100644 index ab2ccfb2f4..0000000000 --- a/cli/runtime/go.sum +++ /dev/null @@ -1,344 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -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.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -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.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.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -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/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -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.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -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.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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-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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -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 v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.0.0 h1:CcuG/HvWNkkaqCUpJifQY8z7qEMBJya6aLPx6ftGyjQ= -github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -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/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -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/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -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.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.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-20180906233101-161cd47e91fd/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-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-20190827160401-ba9fcec4b297/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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -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-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-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20200519105757-fe76b779f299/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-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -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.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-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -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.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -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= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/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.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/cli/runtime/hack/boilerplate.go.txt b/cli/runtime/hack/boilerplate.go.txt deleted file mode 100644 index ae7eb59485..0000000000 --- a/cli/runtime/hack/boilerplate.go.txt +++ /dev/null @@ -1,2 +0,0 @@ -// Copyright YEAR VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 diff --git a/cli/runtime/hack/tools/Makefile b/cli/runtime/hack/tools/Makefile deleted file mode 100644 index ecced7571a..0000000000 --- a/cli/runtime/hack/tools/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Build tooling that is used for the main project - -# Ensure Make is run with bash shell as some syntax below is bash-specific -SHELL := /usr/bin/env bash - -.DEFAULT_GOAL := help - -# Use GOPROXY environment variable if set -GOPROXY := $(shell go env GOPROXY) -ifeq (,$(strip $(GOPROXY))) -GOPROXY := https://proxy.golang.org -endif -export GOPROXY - -# Directories. -ROOT_DIR:=$(shell git rev-parse --show-toplevel) -BIN_DIR := bin -SRCS := go.mod go.sum - -# Binaries. -GOIMPORTS := $(BIN_DIR)/goimports -CONTROLLER_GEN := $(BIN_DIR)/controller-gen - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -## -------------------------------------- -## Binaries -## -------------------------------------- - -goimports: $(GOIMPORTS) $(SRCS) ## Build goimports -$(GOIMPORTS): go.mod go.sum - go build -tags=tools -o $@ golang.org/x/tools/cmd/goimports - - -controller-gen: $(CONTROLLER_GEN) -$(CONTROLLER_GEN): go.mod go.sum - go build -tags=tools -o $@ sigs.k8s.io/controller-tools/cmd/controller-gen - -## -------------------------------------- -## Cleanup -## -------------------------------------- - -.PHONY: clean -clean: ## Remove all generated binaries - rm -rf bin diff --git a/cli/runtime/hack/tools/go.mod b/cli/runtime/hack/tools/go.mod deleted file mode 100644 index 49937a4c14..0000000000 --- a/cli/runtime/hack/tools/go.mod +++ /dev/null @@ -1,39 +0,0 @@ -module github.com/vmware-tanzu/cli/runtime/hack/tools - -go 1.18 - -require ( - golang.org/x/tools v0.6.0 - sigs.k8s.io/controller-tools v0.9.2 -) - -require ( - github.com/fatih/color v1.12.0 // indirect - github.com/go-logr/logr v1.2.0 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/mattn/go-colorable v0.1.8 // indirect - github.com/mattn/go-isatty v0.0.12 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/spf13/cobra v1.4.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e // indirect - k8s.io/api v0.24.0 // indirect - k8s.io/apiextensions-apiserver v0.24.0 // indirect - k8s.io/apimachinery v0.24.0 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/cli/runtime/hack/tools/go.sum b/cli/runtime/hack/tools/go.sum deleted file mode 100644 index 701f5577a3..0000000000 --- a/cli/runtime/hack/tools/go.sum +++ /dev/null @@ -1,927 +0,0 @@ -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e h1:3i3ny04XV6HbZ2N1oIBw1UBYATHAOpo4tfTF83JM3Z0= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.0 h1:J0hann2hfxWr1hinZIDefw7Q96wmCBx6SSB8IY0MdDg= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/apiextensions-apiserver v0.24.0 h1:JfgFqbA8gKJ/uDT++feAqk9jBIwNnL9YGdQvaI9DLtY= -k8s.io/apiextensions-apiserver v0.24.0/go.mod h1:iuVe4aEpe6827lvO6yWQVxiPSpPoSKVjkq+MIdg84cM= -k8s.io/apimachinery v0.24.0 h1:ydFCyC/DjCvFCHK5OPMKBlxayQytB8pxy8YQInd5UyQ= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.0/go.mod h1:WFx2yiOMawnogNToVvUYT9nn1jaIkMKj41ZYCVycsBA= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/controller-tools v0.9.2 h1:AkTE3QAdz9LS4iD3EJvHyYxBkg/g9fTbgiYsrcsFCcM= -sigs.k8s.io/controller-tools v0.9.2/go.mod h1:NUkn8FTV3Sad3wWpSK7dt/145qfuQ8CKJV6j4jHC5rM= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cli/runtime/hack/tools/main.go b/cli/runtime/hack/tools/main.go deleted file mode 100644 index 602e391142..0000000000 --- a/cli/runtime/hack/tools/main.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// This file is only present to make the linter happy. - -package main - -func main() {} diff --git a/cli/runtime/hack/tools/tools.go b/cli/runtime/hack/tools/tools.go deleted file mode 100644 index 0e9ba04382..0000000000 --- a/cli/runtime/hack/tools/tools.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build tools -// +build tools - -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tools imports things required by build scripts, to force `go mod` to see them as dependencies - -package tools - -import ( - _ "golang.org/x/tools/cmd/goimports" - _ "sigs.k8s.io/controller-tools/cmd/controller-gen" -) diff --git a/cli/runtime/hack/update-bundled-plugin-runtime-version/update-bundled-plugin-runtime-version.txt b/cli/runtime/hack/update-bundled-plugin-runtime-version/update-bundled-plugin-runtime-version.txt deleted file mode 100644 index 851c4ebf6e..0000000000 --- a/cli/runtime/hack/update-bundled-plugin-runtime-version/update-bundled-plugin-runtime-version.txt +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package version provides version information about the plugin runtime library -package version - -// IMPORTANT: Please !!DO NOT!!! change the content of this file manually -// This file is auto-generated based on the version details provided during build time -// and the values mentioned here are used to store the library version - -// All the variables are set during build time -// Note: Please !!DO NOT!!! change the name or remove this variable -var ( - Version string = "TANZU_PLUGIN_RUNTIME_VERSION" -) diff --git a/cli/runtime/plugin/describe.go b/cli/runtime/plugin/describe.go deleted file mode 100644 index abe89468d3..0000000000 --- a/cli/runtime/plugin/describe.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -func newDescribeCmd(description string) *cobra.Command { - cmd := &cobra.Command{ - Use: "describe", - Short: "Describes the plugin", - Hidden: true, - RunE: func(cmd *cobra.Command, args []string) error { - fmt.Println(description) - return nil - }, - } - - return cmd -} diff --git a/cli/runtime/plugin/describe_test.go b/cli/runtime/plugin/describe_test.go deleted file mode 100644 index d49edd57c1..0000000000 --- a/cli/runtime/plugin/describe_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "fmt" - "io" - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -func readOutput(t *testing.T, r io.Reader, c chan<- []byte) { - data, err := io.ReadAll(r) - if err != nil { - t.Error(err) - } - c <- data -} - -func TestDescribe(t *testing.T) { - assert := assert.New(t) - - r, w, err := os.Pipe() - if err != nil { - t.Error(err) - } - c := make(chan []byte) - go readOutput(t, r, c) - - // Set up for our test - stdout := os.Stdout - stderr := os.Stderr - defer func() { - os.Stdout = stdout - os.Stderr = stderr - }() - os.Stdout = w - os.Stderr = w - - expected := "Example plugin description" - describeCmd := newDescribeCmd(expected) - err = describeCmd.Execute() - assert.Nil(err) - w.Close() - - got := <-c - assert.Equal(fmt.Sprintf("%s\n", expected), string(got)) -} diff --git a/cli/runtime/plugin/doc.go b/cli/runtime/plugin/doc.go deleted file mode 100644 index c2c3d56290..0000000000 --- a/cli/runtime/plugin/doc.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package plugin provides functions to create new CLI plugins. -package plugin - -import ( - "fmt" - "os" - "strings" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - "github.com/spf13/cobra/doc" -) - -// DefaultDocsDir is the base docs directory -const DefaultDocsDir = "docs/cli/commands" -const ErrorDocsOutputFolderNotExists = "error reading docs output directory '%v', make sure directory exists or provide docs output directory as input value to '--docs-dir' flag" - -var ( - docsDir string -) - -func init() { - genDocsCmd.Flags().StringVarP(&docsDir, "docs-dir", "d", DefaultDocsDir, "destination for docs output") -} - -var genDocsCmd = &cobra.Command{ - Use: "generate-docs", - Short: "Generate Cobra CLI docs for all subcommands", - Hidden: true, - RunE: func(cmd *cobra.Command, args []string) error { - if docsDir == "" { - docsDir = DefaultDocsDir - } - if dir, err := os.Stat(docsDir); err != nil || !dir.IsDir() { - return errors.Wrap(err, fmt.Sprintf(ErrorDocsOutputFolderNotExists, docsDir)) - } - identity := func(s string) string { - if !strings.HasPrefix(s, "tanzu") { - return fmt.Sprintf("tanzu_%s", s) - } - return s - } - emptyStr := func(s string) string { return "" } - - tanzuCmd := cobra.Command{ - Use: "tanzu", - } - // Necessary to generate correct output - tanzuCmd.AddCommand(cmd.Parent()) - if err := doc.GenMarkdownTreeCustom(cmd.Parent(), docsDir, emptyStr, identity); err != nil { - return fmt.Errorf("error generating docs %q", err) - } - - return nil - }, -} diff --git a/cli/runtime/plugin/info.go b/cli/runtime/plugin/info.go deleted file mode 100644 index c8bdda54e3..0000000000 --- a/cli/runtime/plugin/info.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "encoding/json" - "fmt" - - "github.com/spf13/cobra" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - rtversion "github.com/vmware-tanzu/tanzu-framework/cli/runtime/version" -) - -// pluginInfo describes a plugin information. This is a super set of PluginDescriptor -// It includes some additional metadata that plugin runtime configures -type pluginInfo struct { - // PluginDescriptor describes a plugin binary. - cliapi.PluginDescriptor `json:",inline" yaml:",inline"` - - // PluginRuntimeVersion of the plugin. Must be a valid semantic version https://semver.org/ - // This version specifies the version of Plugin Runtime that was used to build the plugin - PluginRuntimeVersion string `json:"pluginRuntimeVersion" yaml:"pluginRuntimeVersion"` -} - -func newInfoCmd(desc *cliapi.PluginDescriptor) *cobra.Command { - cmd := &cobra.Command{ - Use: "info", - Short: "Plugin info", - Hidden: true, - RunE: func(cmd *cobra.Command, args []string) error { - pi := pluginInfo{ - PluginDescriptor: *desc, - PluginRuntimeVersion: rtversion.Version, - } - b, err := json.Marshal(pi) - if err != nil { - return err - } - fmt.Println(string(b)) - return nil - }, - } - - return cmd -} diff --git a/cli/runtime/plugin/info_test.go b/cli/runtime/plugin/info_test.go deleted file mode 100644 index d7c9d52da4..0000000000 --- a/cli/runtime/plugin/info_test.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "encoding/json" - "os" - "testing" - - "github.com/stretchr/testify/assert" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -func TestInfo(t *testing.T) { - assert := assert.New(t) - - r, w, err := os.Pipe() - if err != nil { - t.Error(err) - } - c := make(chan []byte) - go readOutput(t, r, c) - - // Set up for our test - stdout := os.Stdout - stderr := os.Stderr - defer func() { - os.Stdout = stdout - os.Stderr = stderr - }() - os.Stdout = w - os.Stderr = w - - descriptor := cliapi.PluginDescriptor{ - Name: "Test Plugin", - Description: "Description of the plugin", - Version: "1.2.3", - BuildSHA: "cafecafe", - Group: "TestGroup", - DocURL: "https://docs.example.com", - Hidden: false, - } - - infoCmd := newInfoCmd(&descriptor) - err = infoCmd.Execute() - w.Close() - assert.Nil(err) - - got := <-c - - expectedInfo := pluginInfo{ - PluginDescriptor: descriptor, - } - - gotInfo := &pluginInfo{} - err = json.Unmarshal(got, gotInfo) - if err != nil { - t.Error(err) - } - - assert.Equal(expectedInfo.Name, gotInfo.Name) - assert.Equal(expectedInfo.Description, gotInfo.Description) - assert.Equal(expectedInfo.Version, gotInfo.Version) - assert.Equal(expectedInfo.BuildSHA, gotInfo.BuildSHA) - assert.Equal(expectedInfo.DocURL, gotInfo.DocURL) - assert.Equal(expectedInfo.Hidden, gotInfo.Hidden) - assert.NotEmpty(gotInfo.PluginRuntimeVersion) -} diff --git a/cli/runtime/plugin/lint.go b/cli/runtime/plugin/lint.go deleted file mode 100644 index d015f9c69d..0000000000 --- a/cli/runtime/plugin/lint.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "errors" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin/lint" -) - -// LintCmd inspects the Cobra command tree to ensure all commands meet the linting standards -// todo: checks for duplicate commands and duplicate aliases -var lintCmd = &cobra.Command{ - Use: "lint", - Short: "Lint on cobra command structure", - Long: "Lint this command's full flag and cmd tree. The cmd or flag will be skipped when annotated with 'no-lint'", - Hidden: true, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - linter, err := lint.NewCobraLinter(cmd) - if err != nil { - return err - } - - if !linter.Run() { - linter.Output() - return errors.New("cobra command linting failed") - } - - return nil - }, -} diff --git a/cli/runtime/plugin/lint/cli-wordlist.yml b/cli/runtime/plugin/lint/cli-wordlist.yml deleted file mode 100644 index 6c77e3c2fc..0000000000 --- a/cli/runtime/plugin/lint/cli-wordlist.yml +++ /dev/null @@ -1,147 +0,0 @@ ---- -nouns: - - account - - admin-kubeconfig - - alpha - - app - - available - - available-upgrades - - aws - - ceip-participation - - cluster - - clustergroup - - component - - credentials - - data-protection - - insight - - installed - - kubeconfig - - kubernetes-release - - login - - machinehealthcheck - - management-cluster - - os - - package - - permissions - - pinniped-auth - - plugin - - policy - - provisioner - - repo - - repository - - source - - wordlist - - workspace -verbs: - - add - - clean - - completion - - create - - delete - - describe - - get - - import - - info - - init - - install - - list - - register - - scale - - show - - update - - upgrade - - version -global-flags: - - help - - log-file - - v - - verbose -command-flags: - - all-namespaces - - apiToken - - app - - bind - - browser - - ca-bundle - - ca-bundle-data - - ceip-participation - - client-id - - cni - - concierge-authenticator-name - - concierge-authenticator-type - - concierge-ca-bundle-data - - concierge-endpoint - - concierge-namespace - - context - - controlplane-machine-count - - controlplane-size - - create - - create-namespace - - debug - - debug-session-cache - - deploy-tkg-on-vSphere7 - - disable-grouping - - disable-no-echo - - dry-run - - enable-cluster-options - - enable-concierge - - enable-tkgs-on-vSphere7 - - endpoint - - env - - feature-flags - - file - - force - - force-csp - - gcp-bucket-name - - gcp-root-path - - git-branch - - git-commit - - git-repo - - git-tag - - include-management-cluster - - infrastructure - - issuer - - kubeconfig - - limit-cpu - - limit-memory - - listen-port - - name - - namespace - - offset - - os-arch - - os-name - - os-version - - output - - package-name - - plan - - poll-interval - - poll-timeout - - request-audience - - scopes - - server - - service-account-name - - session-cache - - show-all-conditions - - show-details - - show-group-members - - size - - skip-browser - - staging - - stderr-only - - target-namespace - - timeout - - tkr - - ui - - uri - - url - - use-existing-bootstrap-cluster - - use-existing-cleanup-cluster - - values-file - - values-schema - - version - - vsphere-controlplane-endpoint - - vsphere-vm-template-name - - wait - - worker-machine-count - - worker-size - - yes diff --git a/cli/runtime/plugin/lint/doc.go b/cli/runtime/plugin/lint/doc.go deleted file mode 100644 index e6b22d40c6..0000000000 --- a/cli/runtime/plugin/lint/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package lint provides linters to run against CLI plugins. -package lint diff --git a/cli/runtime/plugin/lint/lint.go b/cli/runtime/plugin/lint/lint.go deleted file mode 100644 index bc75bc7e90..0000000000 --- a/cli/runtime/plugin/lint/lint.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package lint - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" -) - -var cobraLints = []cobraLint{ - &TKGTerms{}, - &TKGFlags{}, -} - -// NewCobraLinter returns an instance of CobraLintRunner. -func NewCobraLinter(cmd *cobra.Command) (*CobraLintRunner, error) { - terms, err := loadPluginWords(cmd) - if err != nil { - return nil, err - } - - r := make(Results) - - cfg := &cobraLintConfig{ - cliTerms: terms, - cmd: cmd, - } - return &CobraLintRunner{ - results: &r, - config: cfg, - }, nil -} - -// Results is a map of commands and lint errors associated with them. -type Results map[string][]string - -type cobraLint interface { - Init(*cobraLintConfig) - Execute() *Results -} - -// CobraLintRunner lints cobra commands and reports results. -type CobraLintRunner struct { - results *Results - config *cobraLintConfig -} - -type cobraLintConfig struct { - cliTerms *tanzuTerms - cmd *cobra.Command -} - -// Run runs the linter and reports success or failure. -func (c *CobraLintRunner) Run() bool { - success := true - for _, l := range cobraLints { - l.Init(c.config) - for key, value := range *l.Execute() { - if success { - success = false - } - (*c.results)[key] = append((*c.results)[key], value...) - } - } - return success -} - -// Output writes the results of linting in a table form. -func (c *CobraLintRunner) Output() { - t := component.NewOutputWriter(c.config.cmd.OutOrStdout(), "table", "command", "lint") - for k, vs := range *c.results { - for _, v := range vs { - t.AddRow(k, v) - } - } - t.Render() - fmt.Println("---") -} diff --git a/cli/runtime/plugin/lint/lint_test.go b/cli/runtime/plugin/lint/lint_test.go deleted file mode 100644 index d00298f02c..0000000000 --- a/cli/runtime/plugin/lint/lint_test.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package lint - -import ( - "testing" - - "github.com/spf13/cobra" - "github.com/stretchr/testify/require" -) - -func TestTKGTerms(t *testing.T) { - type test struct { - cmd *cobra.Command - subcmd *cobra.Command - terms *tanzuTerms - expectedOutput string - expectedLints int - } - - tests := []test{ - { - cmd: &cobra.Command{ - Use: "RANDOM", - }, - terms: &tanzuTerms{ - Nouns: []string{"noun"}, - }, - expectedOutput: "unknown top-level term RANDOM, expected standard noun", - expectedLints: 1, - }, - { - cmd: &cobra.Command{ - Use: "noun", - }, - subcmd: &cobra.Command{ - Use: "RANDOM", - }, - terms: &tanzuTerms{ - Nouns: []string{"noun"}, - Verbs: []string{"verbin"}, - }, - expectedOutput: "unknown subcommand term RANDOM, expected standard term", - expectedLints: 1, - }, - { - cmd: &cobra.Command{ - Use: "realcmd", - }, - subcmd: &cobra.Command{ - Use: "realsubcmd", - }, - terms: &tanzuTerms{ - Nouns: []string{"realcmd"}, - Verbs: []string{"realsubcmd"}, - }, - expectedLints: 0, - }, - } - - for _, tt := range tests { - if tt.subcmd != nil { - tt.cmd.AddCommand(tt.subcmd) - } - l := TKGTerms{ - cmd: tt.cmd, - nouns: tt.terms.Nouns, - verbs: tt.terms.Verbs, - } - res := l.Execute() - require.Equal(t, tt.expectedLints, len(*res)) - if tt.expectedLints == 0 { - continue - } - require.Contains(t, (*res)[tt.cmd.Use], tt.expectedOutput) - } -} - -func TestTKGFlags(t *testing.T) { - type testFlag struct { - value string - short string - } - - var bogus string - type test struct { - cmd *cobra.Command - flag *testFlag - terms *tanzuTerms - expectedOutput string - expectedLints int - } - - tests := []test{ - { - cmd: &cobra.Command{ - Use: "RANDOM", - }, - flag: &testFlag{ - value: "invalid", - short: "i", - }, - terms: &tanzuTerms{ - CmdFlags: []string{"valid"}, - }, - expectedOutput: "unexpected flag invalid, expected standard flag", - expectedLints: 1, - }, { - cmd: &cobra.Command{ - Use: "RANDOM", - }, - flag: &testFlag{ - value: "valid", - short: "v", - }, - terms: &tanzuTerms{ - CmdFlags: []string{"valid"}, - }, - expectedLints: 0, - }, - } - - for _, tt := range tests { - if tt.flag != nil { - tt.cmd.Flags().StringVarP(&bogus, tt.flag.value, "", tt.flag.short, "") - } - r := make(Results) - l := TKGFlags{ - cmd: tt.cmd, - cmdFlags: tt.terms.CmdFlags, - results: &r, - } - res := l.Execute() - require.Equal(t, tt.expectedLints, len(*res)) - if tt.expectedLints == 0 { - continue - } - require.Contains(t, (*res)[tt.cmd.Use], tt.expectedOutput) - } -} diff --git a/cli/runtime/plugin/lint/terms.go b/cli/runtime/plugin/lint/terms.go deleted file mode 100644 index c5854c2459..0000000000 --- a/cli/runtime/plugin/lint/terms.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package lint - -import ( - _ "embed" // required to embed file - "fmt" - "strings" - - "github.com/spf13/cobra" - flag "github.com/spf13/pflag" - "gopkg.in/yaml.v2" -) - -const ( - noLint = "no-lint" - lintName = "lint" - help = "help" -) - -//go:embed cli-wordlist.yml -var wordList []byte - -type tanzuTerms struct { - Nouns []string `yaml:"nouns"` - Verbs []string `yaml:"verbs"` - GlobalFlags []string `yaml:"global-flags"` - CmdFlags []string `yaml:"command-flags"` -} - -// TKGTerms analyzes plugin command nouns and verbs -type TKGTerms struct { - cmd *cobra.Command - nouns []string - verbs []string -} - -// Init initializes TKGTerms using a config. -func (l *TKGTerms) Init(c *cobraLintConfig) { - l.cmd = c.cmd.Parent() - l.nouns = c.cliTerms.Nouns - l.verbs = c.cliTerms.Verbs -} - -// Execute runs the analysis and reports results. -func (l *TKGTerms) Execute() *Results { - results := make(Results) - - if l.cmd != nil { - if _, ok := l.cmd.Annotations[noLint]; ok { - return nil - } - } - // Top level plugin nouns - if !contains(l.nouns, rawUse(l.cmd.Use)) { - results[l.cmd.Use] = append(results[l.cmd.Use], - fmt.Sprintf("unknown top-level term %s, expected standard noun", - rawUse(l.cmd.Use))) - } - - // Subcommands can be either a valid noun or verb, depending on the commands format - if l.cmd.HasSubCommands() { - for _, subCmd := range l.cmd.Commands() { - if rawUse(subCmd.Use) == lintName || rawUse(subCmd.Use) == help { - continue - } - if contains(l.nouns, rawUse(subCmd.Use)) || contains(l.verbs, rawUse(subCmd.Use)) { - continue - } - results[l.cmd.Use] = append(results[l.cmd.Use], - fmt.Sprintf("unknown subcommand term %s, expected standard term", - rawUse(subCmd.Use))) - } - } - return &results -} - -// TKGFlags analyzes local and persistent commands. -type TKGFlags struct { - cmd *cobra.Command - cmdFlags []string - globalFlags []string - results *Results -} - -// Init initializes TKGFlags analyzer. -func (l *TKGFlags) Init(c *cobraLintConfig) { - l.cmd = c.cmd.Parent() - l.cmdFlags = c.cliTerms.CmdFlags - l.globalFlags = c.cliTerms.GlobalFlags - r := make(Results) - l.results = &r -} - -// Execute runs the analysis and reports results. -func (l *TKGFlags) Execute() *Results { - l.lint(l.cmd) - - return l.results -} - -// lint recursively process subcommand tree flags -func (l *TKGFlags) lint(cmd *cobra.Command) { - if cmd.Use == lintName { - return - } - - cmd.Flags().VisitAll(func(f *flag.Flag) { - if cmd.PersistentFlags().Lookup(f.Name) != nil { - return - } - if _, ok := f.Annotations[noLint]; ok { - return - } - if !contains(l.cmdFlags, f.Name) { - (*l.results)[cmd.Use] = append((*l.results)[cmd.Use], - fmt.Sprintf("unexpected flag %s, expected standard flag", f.Name)) - } - }) - - if cmd.HasPersistentFlags() { - cmd.PersistentFlags().VisitAll(func(f *flag.Flag) { - if !contains(l.globalFlags, f.Name) { - (*l.results)[cmd.Use] = append((*l.results)[cmd.Use], - fmt.Sprintf("unexpected global flag %s, expected standard flag", f.Name)) - } - }) - } - - for _, subCmd := range cmd.Commands() { - if subCmd.HasFlags() { - subCmd.Flags().VisitAll(func(f *flag.Flag) { - l.lint(subCmd) - }) - } - if subCmd.HasPersistentFlags() { - subCmd.PersistentFlags().VisitAll(func(f *flag.Flag) { - l.lint(subCmd) - }) - } - } -} - -func loadPluginWords(cmd *cobra.Command) (*tanzuTerms, error) { - t := new(tanzuTerms) - err := yaml.Unmarshal(wordList, t) - if err != nil { - cmd.Printf("Unmarshal: %v", err) - return nil, err - } - return t, nil -} - -func contains(s []string, e string) bool { - for _, a := range s { - if a == e { - return true - } - } - return false -} - -func rawUse(s string) string { - return strings.Fields(s)[0] -} diff --git a/cli/runtime/plugin/lint/zz_generated_terms.bindata.go b/cli/runtime/plugin/lint/zz_generated_terms.bindata.go deleted file mode 100644 index b5e5a76ae3..0000000000 --- a/cli/runtime/plugin/lint/zz_generated_terms.bindata.go +++ /dev/null @@ -1,262 +0,0 @@ -// Code generated by go-bindata. DO NOT EDIT. -// sources: -// hack/linter/cli-wordlist.yml - -package lint - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info fileInfoEx -} - -type fileInfoEx interface { - os.FileInfo - MD5Checksum() string -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time - md5checksum string -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) MD5Checksum() string { - return fi.md5checksum -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _bindataHackLinterCliwordlistYml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x54\x51\xb2\x83\x36\x0c\xfc\xcf\x29\xb8\x80\xbe\x3b\xd3\x6b\xb4\x17\x30\x46\x18\x4d\x8c\xe4\x91\x64\xf2\xd2\xd3\x77\xb0\x1d\x92\xbc\x4e\xbf\x58\x2d\x92\xb2\x5e\x2f\x01\x80\xdb\xc4\x52\xd9\xfe\xbc\x4d\x13\x4c\x21\x46\xa9\xec\x1d\x2f\x3b\x31\xdc\xeb\x8c\x51\x78\xa5\xd4\xc9\x52\xfa\xf3\x61\xed\x19\x91\x0a\x94\xa0\x4e\x91\x4a\x70\x12\xee\x74\xae\xe6\xa8\x9f\x38\xa9\xd4\x3e\x1b\x65\x2f\xc2\x38\x7e\x26\x2a\x2e\xc8\x4e\x21\xf7\x8d\x4b\xf0\x00\x45\xc5\x31\x5e\xeb\x88\x8d\xd2\xd6\xfb\x7f\x09\x3a\x4b\x65\x74\x34\x50\xcc\x18\x0c\x1b\x9d\x25\x51\x9f\xdd\x43\xdc\x88\x71\xc3\x90\x7d\x8b\x1b\xc6\xfb\xa0\x39\x24\xdc\x91\x1d\x3e\xc5\x16\xd4\x9d\xcc\x48\xb8\xab\x29\xb9\xbe\x16\x15\xc9\x14\x9f\x1d\xaa\x1c\x74\x36\x8d\x29\xc5\x22\x0d\x3c\x44\xef\x56\x42\xc4\xdb\x74\xa0\xce\x2f\x57\x8f\x40\x39\xcc\x19\xa1\x96\xa4\x61\xc1\xe1\x5d\xc6\xc0\x97\x23\x19\xdf\xee\x29\x06\xef\xe7\x58\x30\xe3\x05\x2d\x2a\xcd\xbd\x48\xd8\xdd\xa0\xbd\x88\x0e\xc8\xab\x0c\x40\x2f\xc6\x3c\xe4\xdc\x0d\x21\xeb\xa4\xd8\x90\x9c\xe8\x3a\xb5\xc5\x90\xfb\x5e\xdb\xe4\xd1\x40\x2d\xcb\x4b\xc3\x10\xdd\xf0\x81\x6a\x4d\x66\xca\x32\x87\x0c\x6b\x0e\xa9\x9d\x72\x82\x69\xc3\x5c\x3a\xca\x92\x60\xa5\xb6\xf2\x9c\x19\x0f\xd4\x59\xce\xeb\x89\xb2\xef\x81\x97\xaf\xd9\x50\xe8\x6f\xb9\x23\xf7\x6a\x26\x5e\x06\x52\x79\x58\x53\xf9\x7f\x61\x3b\x79\xa6\x01\x84\x1d\x7f\xfc\x5d\xa8\xe4\x92\x03\x23\x18\xfd\x33\xd4\x2c\x58\xb2\x3c\xc1\xef\x09\x84\xe1\xf8\xab\x6c\xa8\xf8\xc7\x78\x47\xd6\xae\xa9\x65\x95\x38\x7d\xb3\x2c\x80\x71\x93\x4e\x22\x37\xce\xef\xc9\xfe\xbb\x07\x79\x29\x42\x3c\x84\xac\x18\xbc\x2a\xf6\xf3\x0e\xea\x32\x67\x15\x8d\x9f\x10\xa2\x0d\x13\x53\x2c\x30\xd7\x78\x47\x07\x0e\x3b\xbe\x49\x15\x71\x28\xc1\xb7\x4e\x11\xc7\x5c\x17\x84\x96\xe8\x5f\x81\xee\xb1\xd0\x60\xae\x35\x9e\x22\x3a\xf7\xf5\x0d\x4d\x30\xbd\xf7\x9f\x68\x04\xb8\x85\x65\x5d\x0d\xc7\x31\xc4\x20\x68\xdc\xae\xe2\x3d\x24\x06\x57\x2e\x5a\x5d\xbd\xd4\x31\x75\xda\xdf\x91\xa1\x1e\x2f\x51\x67\xcc\x20\xe4\x0c\x51\x78\x21\x1f\x9f\xdb\xf9\xe2\xba\x27\xf3\x90\xae\x2b\x30\x5f\x50\x15\x84\xf3\xb3\x13\x1e\x34\x0d\x63\x3e\xe4\x3a\xed\x28\xaf\x5f\xf6\x3d\x42\x4f\xb9\xb6\xac\x40\xd5\xdc\xdf\xd4\x11\x97\x6a\x08\xf8\x43\xe6\xc4\x09\x66\x11\x3f\x5b\xcb\xb7\x7d\x5f\x3d\xed\x8b\xad\xbf\x3a\x0e\x6b\x57\x0f\x5f\x79\xfb\x4e\xc0\xab\xe5\xd8\xc1\x71\x2f\x39\x38\x7e\xd8\x77\xfe\x69\xa0\x7e\x44\xf4\x89\x76\xfb\x37\x00\x00\xff\xff\x89\xa5\x48\x5c\x9a\x05\x00\x00") - -func bindataHackLinterCliwordlistYmlBytes() ([]byte, error) { - return bindataRead( - _bindataHackLinterCliwordlistYml, - "hack/linter/cli-wordlist.yml", - ) -} - -func bindataHackLinterCliwordlistYml() (*asset, error) { - bytes, err := bindataHackLinterCliwordlistYmlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "hack/linter/cli-wordlist.yml", - size: 1434, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, &os.PathError{Op: "open", Path: name, Err: os.ErrNotExist} -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -// nolint: deadcode -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, &os.PathError{Op: "open", Path: name, Err: os.ErrNotExist} -} - -// AssetNames returns the names of the assets. -// nolint: deadcode -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "hack/linter/cli-wordlist.yml": bindataHackLinterCliwordlistYml, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// -// data/ -// foo.txt -// img/ -// a.png -// b.png -// -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, &os.PathError{ - Op: "open", - Path: name, - Err: os.ErrNotExist, - } - } - } - } - if node.Func != nil { - return nil, &os.PathError{ - Op: "open", - Path: name, - Err: os.ErrNotExist, - } - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{Func: nil, Children: map[string]*bintree{ - "hack": {Func: nil, Children: map[string]*bintree{ - "linter": {Func: nil, Children: map[string]*bintree{ - "cli-wordlist.yml": {Func: bindataHackLinterCliwordlistYml, Children: map[string]*bintree{}}, - }}, - }}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} diff --git a/cli/runtime/plugin/plugin.go b/cli/runtime/plugin/plugin.go deleted file mode 100644 index e58c319b11..0000000000 --- a/cli/runtime/plugin/plugin.go +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "encoding/json" - "fmt" - "os" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - "go.uber.org/multierr" - "golang.org/x/mod/semver" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -// Plugin is a Tanzu CLI plugin. -type Plugin struct { - Cmd *cobra.Command -} - -// NewPlugin creates an instance of Plugin. -func NewPlugin(descriptor *cliapi.PluginDescriptor) (*Plugin, error) { - ApplyDefaultConfig(descriptor) - err := ValidatePlugin(descriptor) - if err != nil { - return nil, err - } - p := &Plugin{ - Cmd: newRootCmd(descriptor), - } - p.Cmd.AddCommand(lintCmd) - p.Cmd.AddCommand(genDocsCmd) - p.Cmd.AddCommand(newPostInstallCmd(descriptor)) - return p, nil -} - -// NewPluginFromFile create a new instance of Plugin from a file descriptor. -func NewPluginFromFile(path string) (*Plugin, error) { - descriptor, err := parsePluginDescriptor(path) - if err != nil { - return nil, err - } - plugin, err := NewPlugin(&descriptor) - if err != nil { - return nil, err - } - return plugin, nil -} - -// AddCommands adds commands to the plugin. -func (p *Plugin) AddCommands(commands ...*cobra.Command) { - p.Cmd.AddCommand(commands...) -} - -// Execute executes the plugin. -func (p *Plugin) Execute() error { - return p.Cmd.Execute() -} - -// parsePluginDescriptor parses a plugin descriptor in yaml. -func parsePluginDescriptor(path string) (desc cliapi.PluginDescriptor, err error) { - b, err := os.ReadFile(path) - if err != nil { - return desc, errors.Wrap(err, "could not read plugin descriptor") - } - - err = json.Unmarshal(b, &desc) - if err != nil { - return desc, errors.Wrap(err, "could not unmarshal plugin descriptor") - } - return -} - -// ApplyDefaultConfig applies default configurations to plugin descriptor. -func ApplyDefaultConfig(p *cliapi.PluginDescriptor) { - if p.PostInstallHook == nil { - p.PostInstallHook = func() error { - return nil - } - } -} - -// ValidatePlugin validates the plugin descriptor. -func ValidatePlugin(p *cliapi.PluginDescriptor) (err error) { - // skip builder plugin for bootstrapping - if p.Name == "builder" { - return nil - } - if p.Name == "" { - err = multierr.Append(err, fmt.Errorf("plugin %q name cannot be empty", p.Name)) - } - if p.Version == "" { - err = multierr.Append(err, fmt.Errorf("plugin %q version cannot be empty", p.Name)) - } - if !semver.IsValid(p.Version) && p.Version != "dev" { - err = multierr.Append(err, fmt.Errorf("version %q %q is not a valid semantic version", p.Name, p.Version)) - } - if p.Description == "" { - err = multierr.Append(err, fmt.Errorf("plugin %q description cannot be empty", p.Name)) - } - if p.Group == "" { - err = multierr.Append(err, fmt.Errorf("plugin %q group cannot be empty", p.Name)) - } - return -} diff --git a/cli/runtime/plugin/plugin_test.go b/cli/runtime/plugin/plugin_test.go deleted file mode 100644 index 5cedd34e48..0000000000 --- a/cli/runtime/plugin/plugin_test.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "encoding/json" - "os" - "testing" - - "github.com/spf13/cobra" - "github.com/stretchr/testify/assert" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -func TestNewPlugin(t *testing.T) { - assert := assert.New(t) - - descriptor := cliapi.PluginDescriptor{ - Name: "Test Plugin", - Description: "Description of the plugin", - Version: "v1.2.3", - BuildSHA: "cafecafe", - Group: "TestGroup", - DocURL: "https://docs.example.com", - Hidden: false, - } - - cmd, err := NewPlugin(&descriptor) - if err != nil { - t.Error(err) - } - assert.Equal("Test Plugin", cmd.Cmd.Use) - assert.Equal(("Description of the plugin"), cmd.Cmd.Short) -} - -func TestNewPluginFromFile(t *testing.T) { - assert := assert.New(t) - - tmpFile, err := os.CreateTemp("", "plugin-test-*.json") - if err != nil { - t.Error(err) - } - pluginFile := tmpFile.Name() - defer os.Remove(pluginFile) - - descriptor := cliapi.PluginDescriptor{ - Name: "Test Plugin", - Description: "Description of the plugin", - Version: "v1.2.3", - BuildSHA: "cafecafe", - Group: "TestGroup", - DocURL: "https://docs.example.com", - Hidden: false, - } - pluginJSON, err := json.Marshal(descriptor) - if err != nil { - t.Error(err) - } - err = os.WriteFile(pluginFile, pluginJSON, 0644) - if err != nil { - t.Error(err) - } - - cmd, err := NewPluginFromFile(pluginFile) - if err != nil { - t.Error(err) - } - assert.Equal("Test Plugin", cmd.Cmd.Use) - assert.Equal(("Description of the plugin"), cmd.Cmd.Short) -} - -func TestNewPluginFromFile_Invalid(t *testing.T) { - assert := assert.New(t) - - cmd, err := NewPluginFromFile("/tmp/does/not/exist.json") - assert.NotNil(err) - assert.Nil(cmd) - assert.Contains(err.Error(), "could not read") -} - -func TestAddCommands(t *testing.T) { - assert := assert.New(t) - - descriptor := cliapi.PluginDescriptor{ - Name: "Test Plugin", - Description: "Description of the plugin", - Version: "v1.2.3", - BuildSHA: "cafecafe", - Group: "TestGroup", - DocURL: "https://docs.example.com", - Hidden: false, - } - - cmd, err := NewPlugin(&descriptor) - if err != nil { - t.Error(err) - } - - subCmd := &cobra.Command{ - Use: "Sub1", - Short: "Sub1 description", - } - cmd.AddCommands(subCmd) - - // Plugin gets 6 commands by default (describe, info, version, lint, init, generate-docs), ours should make 7. - assert.Equal(7, len(cmd.Cmd.Commands())) -} - -func TestExecute(t *testing.T) { - assert := assert.New(t) - - descriptor := cliapi.PluginDescriptor{ - Name: "Test Plugin", - Description: "Description of the plugin", - Version: "v1.2.3", - BuildSHA: "cafecafe", - Group: "TestGroup", - DocURL: "https://docs.example.com", - Hidden: false, - } - - cmd, err := NewPlugin(&descriptor) - if err != nil { - t.Error(err) - } - - assert.Nil(cmd.Execute()) -} diff --git a/cli/runtime/plugin/post-install.go b/cli/runtime/plugin/post-install.go deleted file mode 100644 index 1f30ba3ed6..0000000000 --- a/cli/runtime/plugin/post-install.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "github.com/spf13/cobra" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -func newPostInstallCmd(desc *cliapi.PluginDescriptor) *cobra.Command { - cmd := &cobra.Command{ - Use: "post-install", - Short: "Run post install configuration for a plugin", - Long: "Run post install configuration for a plugin", - Hidden: true, - SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - // invoke postInstall for the plugin - return desc.PostInstallHook() - }, - } - - return cmd -} diff --git a/cli/runtime/plugin/root.go b/cli/runtime/plugin/root.go deleted file mode 100644 index d941f4869b..0000000000 --- a/cli/runtime/plugin/root.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "github.com/spf13/cobra" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -func newRootCmd(descriptor *cliapi.PluginDescriptor) *cobra.Command { - cmd := &cobra.Command{ - Use: descriptor.Name, - Short: descriptor.Description, - Aliases: descriptor.Aliases, - // Hide the default completion command of the plugin. - // Shell completion is enabled using the Tanzu CLI's `completion` command so a plugin - // does not need its own `completion` command. Having such a command is just - // confusing for users. However, we don't disable it completely for two reasons: - // 1. backwards-compatibility, as the command used to be available for some plugins - // 2. to allow shell completion when using the plugin as a native program (mostly for testing) - // Note that a plugin can completely disable this command itself using: - // plugin.Cmd.CompletionOptions.DisableDefaultCmd = true - CompletionOptions: cobra.CompletionOptions{ - HiddenDefaultCmd: true, - }, - } - cobra.AddTemplateFuncs(TemplateFuncs) - cmd.SetUsageTemplate(CmdTemplate) - - cmd.AddCommand( - newDescribeCmd(descriptor.Description), - newVersionCmd(descriptor.Version), - newInfoCmd(descriptor), - ) - - return cmd -} diff --git a/cli/runtime/plugin/root_test.go b/cli/runtime/plugin/root_test.go deleted file mode 100644 index dfafafafae..0000000000 --- a/cli/runtime/plugin/root_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -func Test_newRootCmd(t *testing.T) { - assert := assert.New(t) - - descriptor := cliapi.PluginDescriptor{ - Name: "Test Plugin", - Description: "Description of the plugin", - Version: "1.2.3", - BuildSHA: "cafecafe", - Group: "TestGroup", - DocURL: "https://docs.example.com", - Hidden: false, - } - - cmd := newRootCmd(&descriptor) - assert.Equal("Test Plugin", cmd.Use) - assert.Equal(("Description of the plugin"), cmd.Short) -} diff --git a/cli/runtime/plugin/usage.go b/cli/runtime/plugin/usage.go deleted file mode 100644 index df09a89fcd..0000000000 --- a/cli/runtime/plugin/usage.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "os" - "text/template" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" -) - -// UsageFunc is the usage func for a plugin. -var UsageFunc = func(c *cobra.Command) error { - t, err := template.New("usage").Funcs(TemplateFuncs).Parse(CmdTemplate) - if err != nil { - return err - } - return t.Execute(os.Stdout, c) -} - -// CmdTemplate is the template for plugin commands. -const CmdTemplate = `{{ bold "Usage:" }}{{if .Runnable}} - tanzu {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} - tanzu {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}} - -{{ bold "Aliases:" }} - {{.NameAndAliases}}{{end}}{{if .HasExample}} - -{{ bold "Examples:" }} - {{.Example}}{{end}}{{if .HasAvailableSubCommands}} - -{{ bold "Available Commands:" }}{{range .Commands}}{{if .IsAvailableCommand }} - {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} - -{{ bold "Flags:" }} -{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} - -{{ bold "Global Flags:" }} -{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}} - -{{ bold "Additional help topics:" }}{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} - {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} - -Use "{{if beginsWith .CommandPath "tanzu "}}{{.CommandPath}}{{else}}tanzu {{.CommandPath}}{{end}} [command] --help" for more information about a command.{{end}} -` - -// TemplateFuncs are the template usage funcs. -var TemplateFuncs = template.FuncMap{ - "rpad": component.Rpad, - "bold": component.Bold, - "underline": component.Underline, - "trimTrailingWhitespaces": component.TrimRightSpace, - "beginsWith": component.BeginsWith, -} diff --git a/cli/runtime/plugin/usage_test.go b/cli/runtime/plugin/usage_test.go deleted file mode 100644 index 36c9573cc6..0000000000 --- a/cli/runtime/plugin/usage_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "os" - "testing" - - "github.com/spf13/cobra" - "github.com/stretchr/testify/assert" -) - -func TestUsageFunc(t *testing.T) { - assert := assert.New(t) - - r, w, err := os.Pipe() - if err != nil { - t.Error(err) - } - c := make(chan []byte) - go readOutput(t, r, c) - - // Set up for our test - stdout := os.Stdout - stderr := os.Stderr - defer func() { - os.Stdout = stdout - os.Stderr = stderr - }() - os.Stdout = w - os.Stderr = w - - cmd := &cobra.Command{ - Use: "Sub1", - Short: "Sub1 description", - } - err = UsageFunc(cmd) - w.Close() - assert.Nil(err) - - got := <-c - assert.Contains(string(got), "Usage:") -} diff --git a/cli/runtime/plugin/version.go b/cli/runtime/plugin/version.go deleted file mode 100644 index 1f16183f51..0000000000 --- a/cli/runtime/plugin/version.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -func newVersionCmd(version string) *cobra.Command { - cmd := &cobra.Command{ - Use: "version", - Short: "Version the plugin", - Hidden: true, - RunE: func(cmd *cobra.Command, args []string) error { - fmt.Println(version) - return nil - }, - } - - return cmd -} diff --git a/cli/runtime/plugin/version_test.go b/cli/runtime/plugin/version_test.go deleted file mode 100644 index aced23959d..0000000000 --- a/cli/runtime/plugin/version_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugin - -import ( - "fmt" - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_newVersionCmd(t *testing.T) { - assert := assert.New(t) - - r, w, err := os.Pipe() - if err != nil { - t.Error(err) - } - c := make(chan []byte) - go readOutput(t, r, c) - - // Set up for our test - stdout := os.Stdout - stderr := os.Stderr - defer func() { - os.Stdout = stdout - os.Stderr = stderr - }() - os.Stdout = w - os.Stderr = w - - versionStr := "v1.2.3" - cmd := newVersionCmd(versionStr) - err = cmd.Execute() - w.Close() - assert.Nil(err) - - got := <-c - assert.Equal(fmt.Sprintf("%s\n", versionStr), string(got)) -} diff --git a/cli/runtime/test/framework.go b/cli/runtime/test/framework.go deleted file mode 100644 index 428c425648..0000000000 --- a/cli/runtime/test/framework.go +++ /dev/null @@ -1,528 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package test provides a tanzu cli test framework -package test - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "os" - "os/exec" - "strings" - "sync" - "time" - - "github.com/aunum/log" - "github.com/google/uuid" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "gopkg.in/yaml.v2" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -const ( - CLIName = "tanzu" -) - -// NewTestFor creates a plugin descriptor for a test plugin. -func NewTestFor(pluginName string) *cliapi.PluginDescriptor { - return &cliapi.PluginDescriptor{ - Name: fmt.Sprintf("%s-test", pluginName), - Description: fmt.Sprintf("test for %s", pluginName), - Version: "v0.0.1", - BuildSHA: "", - Group: cliapi.TestCmdGroup, - Aliases: []string{fmt.Sprintf("%s-alias", pluginName)}, - } -} - -// Main holds state for multiple command tests. -type Main struct { - // Name of the main test. - Name string - // Tests in this main. - Tests []*Test - // Report holds the report for the test. - Report *Report - // Cleanup function. - Cleanup CleanupFunc - // Whether a report should be printed. - printReport bool - // Whether to defer the resource deletion. - DeferDelete bool -} - -// CleanupFunc is executed at the end of the test. -type CleanupFunc func() error - -// NoCleanupFunc is cleanup function that just returns nil. -var NoCleanupFunc = func() error { return nil } - -const deferDelete = "defer-delete" -const printReportFlagName = "print-report" - -// NewMain returns a new CLI test. -func NewMain(name string, c *cobra.Command, cleanup CleanupFunc) *Main { - b, _ := c.Flags().GetBool(printReportFlagName) - d, _ := c.Flags().GetBool(deferDelete) - if d { - cleanup = NoCleanupFunc - } - - m := &Main{ - Name: name, - Report: &Report{ - TestName: name, - TimeStart: time.Now(), - }, - Cleanup: cleanup, - printReport: b, - DeferDelete: d, - } - m.PrintStart() - return m -} - -// Report is the report generated from running a CLI test. -type Report struct { - // Name of the report. - TestName string `json:"testName"` - // TimeStart at which the test was started. - TimeStart time.Time `json:"timeStart"` - // TimeEnd at which the test was started. - TimeEnd time.Time `json:"timeEnd"` - // Pass tells whether all the tests passed. - Pass bool `json:"pass"` - // Results of the test. - Results []*Result `json:"results"` -} - -// Result is the result of an individual CLI test. -type Result struct { - // Command executed. - Command string `json:"command"` - // Pass tells if command passed execution. - Pass bool `json:"pass"` - // Err holds any error produced. - Err error `json:"err"` -} - -// Error fails a result and reports the error. -func (r *Result) Error(err error) { - r.Pass = false - r.Err = err -} - -// Success passes a result. -func (r *Result) Success() { - r.Pass = true -} - -// PrintStart prints a main test start message. -func (m *Main) PrintStart() { - fmt.Println("---") - log.Infof("testing %s", m.Name) - fmt.Println("") -} - -// PrintSuccess prints a successful main test message. -func (m *Main) PrintSuccess() { - fmt.Println("") - log.Successf("ok: successfully tested %s", m.Name) - fmt.Println("") -} - -// PrintFailure prints a main test failure message. -func (m *Main) PrintFailure() { - fmt.Println("") - log.Errorf("FAIL: %s", m.Name) - fmt.Println("") -} - -// ReportResult adds a result to the report. -func (m *Main) ReportResult(res *Result) { - m.Report.Results = append(m.Report.Results, res) -} - -// ReportError adds an error result to the report. -func (m *Main) ReportError(cmd string, err error) { - res := &Result{Command: cmd, Pass: false, Err: err} - m.Report.Results = append(m.Report.Results, res) -} - -// ReportSuccess adds an error result to the report. -func (m *Main) ReportSuccess(cmd string) { - res := &Result{Command: cmd, Pass: true} - m.Report.Results = append(m.Report.Results, res) -} - -// ReportTestResult adds an error result to the report. -func (m *Main) ReportTestResult(t *Test) { - m.Report.Results = append(m.Report.Results, t.Result) - if t.Result.Pass { - log.Successf("PASS: %q", t.Name) - } else { - log.Errorf("FAIL: %q", t.Name) - } -} - -// AddTest adds a test to the main. -func (m *Main) AddTest(t *Test) { - m.Tests = append(m.Tests, t) -} - -// BuildReport will build the report with the current commands. -func (m *Main) BuildReport() { - pass := true - for _, t := range m.Tests { - if !t.Result.Pass { - pass = false - break - } - } - m.Report.Pass = pass - for _, t := range m.Tests { - m.ReportResult(t.Result) - } -} - -// PrintReport prints the report in json|yaml. -func (m *Main) PrintReport(format string) error { - switch format { - case "json": - b, err := json.Marshal(m.Report) - if err != nil { - return err - } - fmt.Println(string(b)) - case "yaml": - b, err := yaml.Marshal(m.Report) - if err != nil { - return err - } - fmt.Println(string(b)) - default: - return fmt.Errorf("unknown format %q, can be json|yaml", format) - } - return nil -} - -// Finish test. -func (m *Main) Finish() { - m.BuildReport() - m.Report.TimeEnd = time.Now() - fmt.Println("") - log.Info("cleaning up") - if err := m.Cleanup(); err != nil { - log.Infof("error cleaning up %s", err) - } - - if m.printReport { - if err := m.PrintReport("yaml"); err != nil { - log.Infof("PrintReport failed %s", err) - } - } - if m.Report.Pass { - m.PrintSuccess() - } else { - m.PrintFailure() - } -} - -// FlagSet returns the default flagset values for cli tests. -func FlagSet() *pflag.FlagSet { - fs := pflag.NewFlagSet("cli-test-flags", pflag.ContinueOnError) - fs.BoolP(printReportFlagName, "p", false, "print report") - fs.BoolP(deferDelete, "d", false, "defer resource deletion") - return fs -} - -// NamePrefix is the prefix used in generated names. -const NamePrefix = "cli-test" - -// GenerateName returns a name for a cli test. -func GenerateName() string { - testName := fmt.Sprintf("%s-%s", NamePrefix, uuid.NewString()[:8]) - return testName -} - -// Test is a cli test to run. -type Test struct { - // Name of the test. - Name string - // Command to test. - Command string - // Run function to wrap any logic exectution. - run func(t *Test) error - // Result of command test. - Result *Result - - stdOut *bytes.Buffer - stdErr *bytes.Buffer -} - -// NewTest returns a new command -func NewTest(name, command string, run func(t *Test) error) *Test { - log.Info(name) - return &Test{ - Name: name, - Command: command, - Result: &Result{ - Command: command, - }, - run: run, - } -} - -// NewTest creates a new Test and adds it to the main. -func (m *Main) NewTest(name, command string, run func(t *Test) error) *Test { - t := NewTest(name, command, run) - m.AddTest(t) - return t -} - -// RunTest will create a test and run it. -func (m *Main) RunTest(name, command string, run func(t *Test) error) error { - t := m.NewTest(name, command, run) - return t.Run() -} - -// PrintSuccess will print a success message. -func (t *Test) PrintSuccess() { - log.Successf("ok: %s", t.Name) -} - -// Run the 'run' function within the context of the test updating the result accordingly. -func (t *Test) Run() error { - return t.Wrap(t.run) -} - -// Wrap will wrap the execution of the given function in the context of the test and update the -// results accordingly. -func (t *Test) Wrap(f func(t *Test) error) error { - err := f(t) - if err != nil { - t.Result.Error(err) - return err - } - t.Result.Success() - t.PrintSuccess() - return nil -} - -// Exec will execute the test command. -func (t *Test) Exec() (err error) { - s, e, err := Exec(t.Command) - if err != nil { - t.Result.Error(err) - return err - } - t.stdOut = s - t.stdErr = e - t.Result.Success() - return nil -} - -// StdOut from executing the test command. -func (t *Test) StdOut() *bytes.Buffer { - return t.stdOut -} - -// StdErr from executing the test command. -func (t *Test) StdErr() *bytes.Buffer { - return t.stdErr -} - -// Exec the command, exit on error -func Exec(command string) (stdOut, stdErr *bytes.Buffer, err error) { - c := cleanCommand(command) - cmd := exec.Command(CLIName, c...) - - var stdOutBytes, stdErrBytes []byte - var errStdout, errStderr error - stdOutIn, err := cmd.StdoutPipe() - if err != nil { - return nil, nil, err - } - stdErrIn, err := cmd.StderrPipe() - if err != nil { - return nil, nil, err - } - - fmt.Printf("$ %s \n", strings.Join(cmd.Args, " ")) - err = cmd.Start() - if err != nil { - return nil, nil, err - } - - var wg sync.WaitGroup - wg.Add(1) - go func() { - stdOutBytes, errStdout = copyAndCapture(os.Stdout, stdOutIn) - wg.Done() - }() - stdErrBytes, errStderr = copyAndCapture(os.Stderr, stdErrIn) - wg.Wait() - err = cmd.Wait() - if err != nil { - fmt.Println(stdOut.String()) - fmt.Println(stdErr.String()) - } - if errStdout != nil { - return nil, nil, fmt.Errorf("failed to capture stdout: %w", errStdout) - } - if errStderr != nil { - return nil, nil, fmt.Errorf("failed to capture stderr: %w", errStderr) - } - return bytes.NewBuffer(stdOutBytes), bytes.NewBuffer(stdErrBytes), err -} - -func copyAndCapture(w io.Writer, r io.Reader) ([]byte, error) { - var out []byte - buf := make([]byte, 1024) - for { - //nolint:gocritic - n, err := r.Read(buf[:]) - if n > 0 { - d := buf[:n] - out = append(out, d...) - _, err := w.Write(d) - if err != nil { - return out, err - } - } - if err != nil { - // Read returns io.EOF at the end of file, which is not an error for us - if err == io.EOF { - err = nil - } - return out, err - } - } -} - -// cleanCommand will remove the CLIName from the command if exists as first argument. -func cleanCommand(command string) []string { - c := strings.Split(command, " ") - if c[0] == CLIName { - c = c[1:] - } - return c -} - -// ExecContainsString executes the command and checks if the output contains the given string. -func (t *Test) ExecContainsString(contains string) error { - err := ExecContainsString(t.Command, contains) - if err != nil { - t.Result.Error(err) - return err - } - t.Result.Success() - return nil -} - -// ExecContainsAnyString executes the command and checks if the output contains any of the given set of strings. -func (t *Test) ExecContainsAnyString(contains ...string) error { - err := ExecContainsAnyString(t.Command, contains) - if err != nil { - t.Result.Error(err) - return err - } - t.Result.Success() - return nil -} - -// ExecContainsString checks that the given command output contains the string. -func ExecContainsString(command, contains string) error { - stdOut, _, err := Exec(command) - if err != nil { - return err - } - return ContainsString(stdOut, contains) -} - -// ExecContainsAnyString checks that the given command output contains any of the given set of strings. -func ExecContainsAnyString(command string, contains []string) error { - stdOut, _, err := Exec(command) - if err != nil { - return err - } - return ContainsAnyString(stdOut, contains) -} - -// ExecContainsErrorString executes the command and checks if the output contains the given string. -func (t *Test) ExecContainsErrorString(contains string) error { - err := ExecContainsErrorString(t.Command, contains) - if err != nil { - t.Result.Error(err) - return err - } - t.Result.Success() - return nil -} - -// ExecNotContainsStdErrorString executes the command and checks if the StdError contains the given string. -func (t *Test) ExecNotContainsStdErrorString(contains string) error { - err := ExecNotContainsStdErrorString(t.Command, contains) - if err != nil { - t.Result.Error(err) - return err - } - t.Result.Success() - return nil -} - -// ExecContainsErrorString checks that the given command stdErr output contains the string -func ExecContainsErrorString(command, contains string) error { - _, stdErr, err := Exec(command) - if err != nil { - return err - } - return ContainsString(stdErr, contains) -} - -// ExecNotContainsStdErrorString checks that the given command stdErr output contains the string -func ExecNotContainsStdErrorString(command, contains string) error { - _, stdErr, err := Exec(command) - if err != nil && stdErr == nil { - return err - } - return NotContainsString(stdErr, contains) -} - -// NotContainsString checks that the given buffer not contains the string if contains then throws error. -func NotContainsString(stdOut *bytes.Buffer, contains string) error { - so := stdOut.String() - if strings.Contains(so, contains) { - return fmt.Errorf("stdOut %q contains %q", so, contains) - } - return nil -} - -// ContainsString checks that the given buffer contains the string. -func ContainsString(stdOut *bytes.Buffer, contains string) error { - so := stdOut.String() - if !strings.Contains(so, contains) { - return fmt.Errorf("stdOut %q did not contain %q", so, contains) - } - return nil -} - -// ContainsAnyString checks that the given buffer contains any of the given set of strings. -func ContainsAnyString(stdOut *bytes.Buffer, contains []string) error { - var containsAny bool - so := stdOut.String() - - for _, str := range contains { - containsAny = containsAny || strings.Contains(so, str) - } - - if !containsAny { - return fmt.Errorf("stdOut %q did not contain of the following %q", so, contains) - } - return nil -} diff --git a/cli/runtime/test/framework_test.go b/cli/runtime/test/framework_test.go deleted file mode 100644 index 2bab69a814..0000000000 --- a/cli/runtime/test/framework_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package test - -import ( - "bytes" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestCleanCommand(t *testing.T) { - for _, test := range []struct { - name string - command string - res []string - }{ - { - name: "cli name exists", - command: "tanzu cluster create", - res: []string{"cluster", "create"}, - }, - { - name: "cli name does not exist", - command: "cluster create", - res: []string{"cluster", "create"}, - }, - } { - t.Run(test.name, func(t *testing.T) { - r := cleanCommand(test.command) - require.EqualValues(t, test.res, r) - }) - } -} - -func TestContainsString(t *testing.T) { - for _, test := range []struct { - name string - stdOut []byte - contains string - shouldErr bool - }{ - { - name: "basic", - stdOut: []byte(`\x1b[2mℹ\x1b[0m using template \"default\"\n\x1b[32m✔\x1b[0m cluster \"test-1571609912\" created successfully \n`), - contains: "created successfully", - shouldErr: false, - }, - { - name: "basic should fail", - stdOut: []byte(`a foo bar`), - contains: "baz", - shouldErr: true, - }, - } { - t.Run(test.name, func(t *testing.T) { - var b bytes.Buffer - b.Write(test.stdOut) - err := ContainsString(&b, test.contains) - if test.shouldErr { - require.NotNil(t, err, "error should not be nil") - } else { - require.Nil(t, err, "error should be nil") - } - }) - } -} diff --git a/cli/runtime/version/zz_generated_plugin_runtime_version.go b/cli/runtime/version/zz_generated_plugin_runtime_version.go deleted file mode 100644 index a2503a8fc9..0000000000 --- a/cli/runtime/version/zz_generated_plugin_runtime_version.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package version provides version information about the plugin runtime library -package version - -// IMPORTANT: Please !!DO NOT!!! change the content of this file manually -// This file is auto-generated based on the version details provided during build time -// and the values mentioned here are used to store the library version - -// All the variables are set during build time -// Note: Please !!DO NOT!!! change the name or remove this variable -var ( - Version string = "v0.28.0-dev" -) diff --git a/cliplugins/Dockerfile.templates b/cliplugins/Dockerfile.templates deleted file mode 100644 index aa202a3410..0000000000 --- a/cliplugins/Dockerfile.templates +++ /dev/null @@ -1,6 +0,0 @@ -FROM scratch - -################################################################################ -## COPY FILES ## -################################################################################ -COPY . ./ \ No newline at end of file diff --git a/cliplugins/Makefile b/cliplugins/Makefile deleted file mode 100644 index 1db05647fa..0000000000 --- a/cliplugins/Makefile +++ /dev/null @@ -1,99 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../common.mk - -ROOT_DIR := $(shell git rev-parse --show-toplevel) -ARTIFACTS_DIR ?= $(ROOT_DIR)/artifacts -CLI_PLUGINS_DIR ?= $(ROOT_DIR)/cliplugins - -IMG_BASEPATH := tanzu-cli-plugins -IMG_DEFAULT_TAG := latest - -IMG_VERSION_OVERRIDE ?= $(IMG_DEFAULT_TAG) - -ifeq ($(strip $(OCI_REGISTRY)),) - IMG_REPOSITORY ?= $(IMG_BASEPATH) -else - IMG_REPOSITORY ?= $(OCI_REGISTRY)/$(IMG_BASEPATH) -endif - -.PHONY: docker-build-% -docker-build-%: - $(eval PLUGIN_NAME = $(word 1,$(subst _, ,$*))) - $(eval OSARCH = $(word 2,$(subst _, ,$*))) - $(eval OS = $(word 1,$(subst -, ,$(OSARCH)))) - $(eval ARCH = $(word 2,$(subst -, ,$(OSARCH)))) - - cd $(ARTIFACTS_DIR)/$(OS)/$(ARCH)/cli/$(PLUGIN_NAME)/$(BUILD_VERSION) && docker build -t $(IMG_REPOSITORY)/$(PLUGIN_NAME)-$(OS)-$(ARCH):$(IMG_VERSION_OVERRIDE) -f $(CLI_PLUGINS_DIR)/Dockerfile.templates . - -.PHONY: docker-publish-% -docker-publish-%: - $(eval PLUGIN_NAME = $(word 1,$(subst _, ,$*))) - $(eval OSARCH = $(word 2,$(subst _, ,$*))) - $(eval OS = $(word 1,$(subst -, ,$(OSARCH)))) - $(eval ARCH = $(word 2,$(subst -, ,$(OSARCH)))) - - docker push $(IMG_REPOSITORY)/$(PLUGIN_NAME)-$(OS)-$(ARCH):$(IMG_VERSION_OVERRIDE) - -.PHONY: kbld-image-replace-% -kbld-image-replace-%: ## Add newImage in kbld-config.yaml - $(eval PLUGIN_NAME = $(word 1,$(subst _, ,$*))) - $(eval OSARCH = $(word 2,$(subst _, ,$*))) - $(eval OS = $(word 1,$(subst -, ,$(OSARCH)))) - $(eval ARCH = $(word 2,$(subst -, ,$(OSARCH)))) - $(eval PACKAGE_NAME = $(word 3,$(subst _, ,$*))) - - cd ../hack/packages/kbld-image-replace && \ - go run main.go -kbld-config ../../../packages/$(PACKAGE_NAME)/kbld-config.yaml \ - $(IMG_BASEPATH)/$(PLUGIN_NAME)-$(OS)-$(ARCH):$(IMG_DEFAULT_TAG) \ - $(IMG_REPOSITORY)/$(PLUGIN_NAME)-$(OS)-$(ARCH):$(IMG_VERSION_OVERRIDE) - -.PHONY: docker-image-name-% -docker-image-name-%: - $(eval PLUGIN_NAME = $(word 1,$(subst _, ,$*))) - $(eval OSARCH = $(word 2,$(subst _, ,$*))) - $(eval OS = $(word 1,$(subst -, ,$(OSARCH)))) - $(eval ARCH = $(word 2,$(subst -, ,$(OSARCH)))) - - @echo $(IMG_REPOSITORY)/$(PLUGIN_NAME)-$(OS)-$(ARCH):$(IMG_VERSION_OVERRIDE) - -.PHONY: docker-build -docker-build: ## Build docker image - @ for plugin in $(PLUGINS_WITHOUT_TARGET) ; do \ - for env in $(ENVS) ; do \ - $(MAKE) docker-build-$$plugin"_"$$env --no-print-directory ; \ - done \ - done - -.PHONY: docker-publish -docker-publish: ## Publish docker image - @ for plugin in $(PLUGINS_WITHOUT_TARGET) ; do \ - for env in $(ENVS) ; do \ - $(MAKE) docker-publish-$$plugin"_"$$env --no-print-directory ; \ - done \ - done - -.PHONY: kbld-image-replace -kbld-image-replace: ## Add newImage in kbld-config.yaml - @ for plugin in $(STANDALONE_PLUGINS_WITHOUT_TARGET) ; do \ - for env in $(ENVS) ; do \ - $(MAKE) kbld-image-replace-$$plugin"_"$$env"_"standalone-plugins --no-print-directory ; \ - done \ - done - @ for plugin in $(CONTEXTAWARE_PLUGINS_WITHOUT_TARGET) ; do \ - for env in $(ENVS) ; do \ - $(MAKE) kbld-image-replace-$$plugin"_"$$env"_"core-management-plugins --no-print-directory ; \ - done \ - done - -.PHONY: docker-image-names -docker-image-names: ## Return newline-separated names of all docker containers built in this package - @ for plugin in $(PLUGINS_WITHOUT_TARGET) ; do \ - for env in $(ENVS) ; do \ - $(MAKE) docker-image-name-$$plugin"_"$$env --no-print-directory ; \ - done \ - done - -.PHONY: docker-build-and-publish -docker-build-and-publish: docker-build docker-publish kbld-image-replace diff --git a/cluster-essentials/go.mod b/cluster-essentials/go.mod new file mode 100644 index 0000000000..500187e97d --- /dev/null +++ b/cluster-essentials/go.mod @@ -0,0 +1,102 @@ +module github.com/vmware-tanzu/tanzu-framework/cluster-essentials + +go 1.18 + +require ( + github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f + github.com/k14s/kbld v0.32.0 + github.com/otiai10/copy v1.0.2 + github.com/stretchr/testify v1.8.0 + github.com/vmware-tanzu/carvel-imgpkg v0.23.1 + github.com/vmware-tanzu/carvel-ytt v0.40.0 + k8s.io/api v0.26.1 + k8s.io/apimachinery v0.26.1 + k8s.io/client-go v0.26.1 + k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 + sigs.k8s.io/controller-runtime v0.14.6 +) + +require ( + github.com/Azure/azure-sdk-for-go v43.0.0+incompatible // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest v0.11.12 // indirect + github.com/Azure/go-autorest/autorest/adal v0.9.5 // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/autorest/to v0.3.0 // indirect + github.com/Azure/go-autorest/autorest/validation v0.1.0 // indirect + github.com/Azure/go-autorest/logger v0.2.0 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/BurntSushi/toml v1.0.0 // indirect + github.com/aws/aws-sdk-go v1.35.24 // indirect + github.com/cheggaaa/pb v1.0.29 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.10.0 // indirect + github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72 // indirect + github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/docker/cli v20.10.10+incompatible // indirect + github.com/docker/distribution v2.7.1+incompatible // indirect + github.com/docker/docker v20.10.10+incompatible // indirect + github.com/docker/docker-credential-helpers v0.6.4 // indirect + github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/evanphx/json-patch v4.12.0+incompatible // indirect + github.com/evanphx/json-patch/v5 v5.6.0 // indirect + github.com/form3tech-oss/jwt-go v3.2.2+incompatible // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/swag v0.19.14 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-containerregistry v0.7.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // 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/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 // indirect + github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 // indirect + github.com/klauspost/compress v1.13.6 // indirect + github.com/mailru/easyjson v0.7.6 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.12 // 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/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/spf13/cobra v1.6.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/vbatts/tar-split v0.11.2 // indirect + github.com/vdemeester/k8s-pkg-credentialprovider v1.21.0-1 // indirect + github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec // indirect + github.com/vmware-tanzu/carvel-vendir v0.24.0 // indirect + golang.org/x/crypto v0.4.0 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/term v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect + golang.org/x/time v0.3.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.28.1 // 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/cloud-provider v0.21.0 // indirect + k8s.io/component-base v0.26.1 // indirect + k8s.io/klog/v2 v2.80.1 // indirect + k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect + k8s.io/legacy-cloud-providers v0.21.0 // indirect + sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect +) diff --git a/hack/packages/kbld-image-replace/go.sum b/cluster-essentials/go.sum similarity index 85% rename from hack/packages/kbld-image-replace/go.sum rename to cluster-essentials/go.sum index 0ed497fa15..38f19286ba 100644 --- a/hack/packages/kbld-image-replace/go.sum +++ b/cluster-essentials/go.sum @@ -7,6 +7,7 @@ cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxK cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= @@ -46,19 +47,44 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v43.0.0+incompatible h1:/wSNCu0e6EsHFR4Qa3vBEBbicaprEHMyyga9g8RTULI= +github.com/Azure/azure-sdk-for-go v43.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.12 h1:gI8ytXbxMfI+IVbI9mP2JGCTXIuhHLgRlvQ9X4PsnHE= +github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5 h1:Y3bBUV4rTuxenJJs41HU3qmqsb+auo+a3Lz+PlJPpL0= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.1.0 h1:ISSNzGUh+ZSzizJWOWzs8bwpXIePbGLW4z/AmUFGH5A= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU= +github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20200415212048-7901bc822317/go.mod h1:DF8FZRxMHMGv/vP2lQP6h+dYzzjpuRn24VeRiYn3qjQ= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -79,6 +105,7 @@ github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwT github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= 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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= @@ -95,13 +122,17 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.35.24 h1:U3GNTg8+7xSM6OAJ8zksiSM4bRqxBWmVwwehvOSNG3A= +github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= @@ -112,10 +143,14 @@ github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8n github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= +github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= +github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -194,6 +229,7 @@ github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJ github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter/estargz v0.10.0 h1:glqzafvxBBAMo+x2w2sdDjUDZeTqqLJmqZPY05qehCU= github.com/containerd/stargz-snapshotter/estargz v0.10.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= @@ -219,6 +255,7 @@ github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgU github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= @@ -232,11 +269,20 @@ github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72 h1:rPWcUBgMb1ox2eCohCuZ8gsZVe0aB5qBbYaBpdoxfCE= +github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= +github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= +github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= +github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f h1:yVW0v4zDXzJo1i8G9G3vtvNpyzhvtLalO34BsN/K88E= +github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f/go.mod h1:L18TqO77ci8i+hFtlMC4zSFz/D3O8lf84TyVU+zFF8E= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= @@ -251,11 +297,15 @@ github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v20.10.10+incompatible h1:kcbwdgWbrBOH8QwQzaJmyriHwF7XIl4HT1qh0HTRys4= github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v20.10.10+incompatible h1:GKkP0T7U4ks6X3lmmHKC2QDprnpRJor2Z5a8m62R9ZM= github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= @@ -271,6 +321,8 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= +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= @@ -281,15 +333,21 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -302,16 +360,25 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 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.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= +github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= @@ -358,10 +425,13 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= 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= @@ -373,13 +443,15 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.7.0 h1:u0onUUOcyoCDHEiJoyR1R1gx5er1+r06V5DBhUU5ndk= github.com/google/go-containerregistry v0.7.0/go.mod h1:2zaoelrL0d08gGbpdP3LqyUuBmhWbpD6IOe2s9nLS2k= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -402,13 +474,13 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -437,8 +509,8 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw= -github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -448,18 +520,29 @@ github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0m github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hpcloud/tail v1.0.1-0.20180514194441-a1dbeea552b7/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +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/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +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.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -470,14 +553,20 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57 h1:CwBRArr+BWBopnUJhDjJw86rPL/jGbEjfHWKzTasSqE= github.com/k14s/kbld v0.32.0 h1:zf3qCir0usz7rX6JRF97QxaZ25+13EniE7z+ll0xaZ8= github.com/k14s/kbld v0.32.0/go.mod h1:N7Ij72ZhJ2B7kTUxavGTBT1YymIfmAeO6JKyNbtja1g= +github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 h1:wKSifC/VbCaQMqXYn6/gSFqle82OX4bE3KYALDU9FlU= +github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115/go.mod h1:mGrnmO5qnhJIaSiwMo05cvRL6Ww9ccYbTgNFcm6RHZQ= +github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 h1:4bcRTTSx+LKSxMWibIwzHnDNmaN1x52oEpvnjCy+8vk= +github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368/go.mod h1:lKGj1op99m4GtQISxoD2t+K+WO/q2NzEPKvfXFQfbCA= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -490,22 +579,38 @@ github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= 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/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= @@ -525,6 +630,7 @@ github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2J github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= 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= @@ -535,11 +641,13 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -549,21 +657,25 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo/v2 v2.6.0 h1:9t9b9vRUbFq3C4qKFCGkVuq/fIHji802N1nrtkh1mNc= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7 h1:axgApq2XShTLwQii2zAnIkMPlhGVHbAXHUcHezu5G/k= github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= @@ -581,6 +693,11 @@ github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mo github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/otiai10/copy v1.0.2 h1:DDNipYy6RkIkjMwy+AWzgKiNTyj2RUI9yEMeETEpVyc= +github.com/otiai10/copy v1.0.2/go.mod h1:c7RpqBkwMom4bYTSkLSym4VSJz/XtncWRAj/J4PEIMY= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/mint v1.3.0 h1:Ady6MKVezQwHBkGzLFbrsywyp09Ah7rkmfjV3Bcr5uc= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= @@ -589,6 +706,7 @@ github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -601,17 +719,20 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -623,10 +744,15 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -642,6 +768,7 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= @@ -656,7 +783,10 @@ github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -666,6 +796,7 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn 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/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -673,14 +804,17 @@ github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -694,17 +828,25 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vdemeester/k8s-pkg-credentialprovider v1.21.0-1 h1:7Ajl3rjeYoB5V47jPknnLbyxYlhMXTTJiQsye5aT7f0= +github.com/vdemeester/k8s-pkg-credentialprovider v1.21.0-1/go.mod h1:l4LxiP0cmEcc5q4BTDE8tZSyIiyXe0T28x37yHpMzoM= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= +github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= github.com/vmware-tanzu/carvel-imgpkg v0.23.1 h1:sUHDtnvcIMMcY/Pudym6DJ0kv7+uyMCAqQby0SLnQVs= github.com/vmware-tanzu/carvel-imgpkg v0.23.1/go.mod h1:2XNe+P0MDgya0FPEMOVZLAXku05VZhccVdDcXChhvy8= github.com/vmware-tanzu/carvel-vendir v0.24.0 h1:vEkhtfuI1ZQp8mndJJwUT0P8FyOaPrPaxSLxH89C8pI= github.com/vmware-tanzu/carvel-vendir v0.24.0/go.mod h1:Ls3P88J5x+i6ruw/gXgo3brIOGyfGqyzUCAofOuXRFc= +github.com/vmware-tanzu/carvel-ytt v0.40.0 h1:WUWTtwvfqV9CN9v207oDt2xfhmuWHGwc4MMaXJAqIEE= +github.com/vmware-tanzu/carvel-ytt v0.40.0/go.mod h1:crDcKbS1GM4Q34puoVxdrajWOXrxjOxvUCwtsNV5Etc= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -738,15 +880,20 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -757,7 +904,10 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= +golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -794,6 +944,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180730214132-a0f8a16cb08c/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -827,7 +978,6 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -839,12 +989,13 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -859,11 +1010,14 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 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= @@ -874,6 +1028,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -882,7 +1037,9 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -902,6 +1059,7 @@ golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -912,6 +1070,7 @@ golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -925,13 +1084,13 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -946,6 +1105,7 @@ golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -957,14 +1117,23 @@ golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -981,6 +1150,9 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1021,7 +1193,6 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -1044,8 +1215,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1054,6 +1225,7 @@ google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEn google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.1-0.20200106000736-b8fc810ca6b5/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= @@ -1082,6 +1254,7 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -1188,6 +1361,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1200,16 +1375,22 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1222,10 +1403,13 @@ 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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1237,49 +1421,70 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/api v0.21.0/go.mod h1:+YbrhBBGgsxbF6o6Kj4KJPJnBmAKuXDeS3E18bgHNVU= +k8s.io/api v0.26.1 h1:f+SWYiPd/GsiWwVRz+NbFyCgvv75Pk9NK6dlkZgpCRQ= +k8s.io/api v0.26.1/go.mod h1:xd/GBNgR0f707+ATNyPmQ1oyKSgndzXij81FzWGsejg= +k8s.io/apiextensions-apiserver v0.26.1 h1:cB8h1SRk6e/+i3NOrQgSFij1B2S0Y0wDoNl66bn8RMI= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.23.0 h1:mIfWRMjBuMdolAWJ3Fd+aPTMv3X9z+waiARMpvvb0HQ= -k8s.io/apimachinery v0.23.0/go.mod h1:fFCTTBKvKcwTPFzjlcxp91uPFZr+JA0FubU4fLzzFYc= +k8s.io/apimachinery v0.21.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= +k8s.io/apimachinery v0.26.1 h1:8EZ/eGJL+hY/MYCNwhmDzVqq2lPl3N3Bo8rvweJwXUQ= +k8s.io/apimachinery v0.26.1/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/apiserver v0.21.0/go.mod h1:w2YSn4/WIwYuxG5zJmcqtRdtqgW/J2JRgFAqps3bBpg= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/client-go v0.21.0/go.mod h1:nNBytTF9qPFDEhoqgEPaarobC8QPae13bElIVHzIglA= +k8s.io/client-go v0.26.1 h1:87CXzYJnAMGaa/IDDfRdhTzxk/wzGZ+/HUQpqgVSZXU= +k8s.io/client-go v0.26.1/go.mod h1:IWNSglg+rQ3OcvDkhY6+QLeasV4OYHDjdqeWkDQZwGE= +k8s.io/cloud-provider v0.21.0 h1:NSTS+czpv6LQAaIpY/VUghsT4oj62hYmQPErkDKTzKU= +k8s.io/cloud-provider v0.21.0/go.mod h1:z17TQgu3JgUFjcgby8sj5X86YdVK5Pbt+jm/eYMZU9M= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/component-base v0.21.0/go.mod h1:qvtjz6X0USWXbgmbfXR+Agik4RZ3jv2Bgr5QnZzdPYw= +k8s.io/component-base v0.26.1 h1:4ahudpeQXHZL5kko+iDHqLj/FSGAEUnSVO0EBbgDd+4= +k8s.io/component-base v0.26.1/go.mod h1:VHrLR0b58oC035w6YQiBSbtsf0ThuSwXP+p5dD/kAWU= +k8s.io/controller-manager v0.21.0/go.mod h1:Ohy0GRNRKPVjB8C8G+dV+4aPn26m8HYUI6ejloUBvUA= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/csi-translation-lib v0.21.0/go.mod h1:edq+UMpgqEx3roTuGF/03uIuSOsI986jtu65+ytLlkA= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/legacy-cloud-providers v0.21.0 h1:iWf5xaX9yvYT5mkz8UB96UtISQ5IkrWeuMPMhRp01ZY= +k8s.io/legacy-cloud-providers v0.21.0/go.mod h1:bNxo7gDg+PGkBmT/MFZswLTWdSWK9kAlS1s8DJca5q4= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b h1:wxEMGetGMur3J1xuGLQY7GEQYg9bZxKn3tKo5k/eYcs= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y= +k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= +sigs.k8s.io/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA= +sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/cluster-essentials/pkg/client/README.md b/cluster-essentials/pkg/client/README.md new file mode 100644 index 0000000000..6f7a53b241 --- /dev/null +++ b/cluster-essentials/pkg/client/README.md @@ -0,0 +1,37 @@ +# Tanzu Cluster Essentials + +Cluster essentials contains the basic set of components that are required to set up the Tanzu Runtime Core. The Tanzu Cluster Essentials include the following: + +1. Kapp-controller +2. secret-gen controller. + +## APIs + +Install(ctx context.Context, config *rest.Config, imgpkgBundlePath string, timeout time.Duration, bundleDestDir string) error + +Install install the cluster essentials packages +It takes kubernetes rest config of cluster (config), cluster essentials bundler path (imgpkgBundlePath) +timeout for blocking call (if zero is given, it will use default timeout of 15 min), +bundleDestDir to use as temporary dir to download bundles(if empty, it will use \tmp as default path) +It return any error encountered + +## Usage Example + +```go +import ( + "github.com/vmware-tanzu/tanzu-framework/cluster-essentials/pkg/client" + "k8s.io/client-go/tools/clientcmd" + "time" + "context" +) +... + clusterEssentialRepo := "public.ecr.aws/f1l6q4s3/cluster-essentials" + clusterEssentialVersion := "v0.0.1" + clusterKubeconfigPath := "" //kube config file with absolute path + config, err := clientcmd.LoadFromFile(clusterKubeconfigPath) + rawConfig, err := clientcmd.Write(*config) + restConfig, err := clientcmd.RESTConfigFromKubeConfig(rawConfig) + timeout := time.Duration(0) + ctx := context.Background() + err = client.Install(ctx, restConfig, clusterEssentialRepo, clusterEssentialVersion, timeout) +``` diff --git a/cluster-essentials/pkg/client/helpers.go b/cluster-essentials/pkg/client/helpers.go new file mode 100644 index 0000000000..2804efcaab --- /dev/null +++ b/cluster-essentials/pkg/client/helpers.go @@ -0,0 +1,281 @@ +// Copyright 2023 VMware, Inc. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package client + +import ( + "bytes" + "context" + "fmt" + "io" + "os" + + "path/filepath" + + yttui "github.com/vmware-tanzu/carvel-ytt/pkg/cmd/ui" + "github.com/vmware-tanzu/carvel-ytt/pkg/files" + "github.com/vmware-tanzu/carvel-ytt/pkg/workspace" + "github.com/vmware-tanzu/carvel-ytt/pkg/workspace/datavalues" + + "github.com/cppforlife/go-cli-ui/ui" + "github.com/k14s/kbld/pkg/kbld/cmd" + + "github.com/vmware-tanzu/carvel-imgpkg/pkg/imgpkg/bundle" + imgpkgcmd "github.com/vmware-tanzu/carvel-imgpkg/pkg/imgpkg/cmd" + "github.com/vmware-tanzu/carvel-imgpkg/pkg/imgpkg/registry" + + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer/yaml" + utilversion "k8s.io/apimachinery/pkg/util/version" + yamlutil "k8s.io/apimachinery/pkg/util/yaml" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/client/apiutil" +) + +const ConfigFilePermissions = 0o600 + +func downloadBundle(clusterEssentialRepo, clusterEssentialVersion, outputDir string) error { + var outputBuf, errorBuf bytes.Buffer + writerUI := ui.NewWriterUI(&outputBuf, &errorBuf, nil) + pullOptions := imgpkgcmd.NewPullOptions(writerUI) + reg, err := registry.NewSimpleRegistry(registry.Opts{}) + if err != nil { + return err + } + bundlePath := clusterEssentialRepo + ":" + clusterEssentialVersion + newBundle := bundle.NewBundle(bundlePath, reg) + isBundle, _ := newBundle.IsBundle() + if isBundle { + pullOptions.BundleFlags = imgpkgcmd.BundleFlags{Bundle: bundlePath} + } else { + pullOptions.ImageFlags = imgpkgcmd.ImageFlags{Image: bundlePath} + } + + pullOptions.OutputPath = outputDir + return pullOptions.Run() +} + +func applyResourcesFromManifest(ctx context.Context, manifestBytes []byte, cfg *rest.Config) error { + if cfg == nil { + return fmt.Errorf("failed to load kubeconfig") + } + + dynamicClient, err := dynamic.NewForConfig(cfg) + if err != nil { + return err + } + + decoder := yamlutil.NewYAMLOrJSONDecoder(bytes.NewReader(manifestBytes), 100) + mapper, err := apiutil.NewDiscoveryRESTMapper(cfg) + if err != nil { + return err + } + for { + resource, unstructuredObj, err := getResource(decoder, mapper, dynamicClient) + if err != nil { + if err == io.EOF { + break + } else { + return err + } + } + accessor, err := meta.Accessor(unstructuredObj) + name := accessor.GetName() + if err != nil { + return err + } + _, err = resource.Apply(ctx, name, unstructuredObj, metav1.ApplyOptions{FieldManager: name}) + if err != nil { + return err + } + } + return nil +} + +func getResource(decoder *yamlutil.YAMLOrJSONDecoder, mapper meta.RESTMapper, dynamicClient dynamic.Interface) ( + dynamic.ResourceInterface, *unstructured.Unstructured, error) { // nolint:whitespace + var rawObj runtime.RawExtension + if err := decoder.Decode(&rawObj); err != nil { + return nil, nil, err + } + + obj, gvk, err := yaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme).Decode(rawObj.Raw, nil, nil) + if err != nil { + return nil, nil, err + } + + unstructuredMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj) + if err != nil { + return nil, nil, err + } + + unstructuredObj := &unstructured.Unstructured{Object: unstructuredMap} + + mapping, err := mapper.RESTMapping(gvk.GroupKind(), gvk.Version) + if err != nil { + return nil, nil, err + } + + var resource dynamic.ResourceInterface + if mapping.Scope.Name() == meta.RESTScopeNameNamespace { + if unstructuredObj.GetNamespace() == "" { + unstructuredObj.SetNamespace("default") + } + resource = dynamicClient.Resource(mapping.Resource).Namespace(unstructuredObj.GetNamespace()) + } else { + resource = dynamicClient.Resource(mapping.Resource) + } + return resource, unstructuredObj, nil +} + +// processYTTPackage processes configuration directory with ytt tool +// Implements similar functionality as `ytt -f ` +func processYTTPackage(configDirs ...string) ([]byte, error) { + yttFiles, err := files.NewSortedFilesFromPaths(configDirs, files.SymlinkAllowOpts{}) + if err != nil { + return nil, err + } + + lib := workspace.NewRootLibrary(yttFiles) + libCtx := workspace.LibraryExecutionContext{Current: lib, Root: lib} + libExecFact := workspace.NewLibraryExecutionFactory(&NoopUI{}, workspace.TemplateLoaderOpts{}) + loader := libExecFact.New(libCtx) + + valuesDoc, libraryValueDoc, err := loader.Values([]*datavalues.Envelope{}, datavalues.NewNullSchema()) + if err != nil { + return nil, err + } + result, err := loader.Eval(valuesDoc, libraryValueDoc, []*datavalues.SchemaEnvelope{}) + if err != nil { + return nil, err + } + return result.DocSet.AsBytes() +} + +// carvelPackageProcessor processes a carvel package and returns a configuration YAML file +// It processes the package by implementing equivalent functionality as the command: `ytt -f [-f ] | kbld -f -` +// and return single YAML file in bytes +func carvelPackageProcessor(pkgDir string) ([]byte, error) { + // Each package contains `config` and `.imgpkg` directory + // `config` directory contains ytt files + // `.imgpkg` directory contains ImageLock configuration for ImageResolution + configDir := filepath.Join(pkgDir, "config") + configFiles := []string{configDir} + pkgBytes, err := processYTTPackage(configFiles...) + if err != nil { + return nil, fmt.Errorf("could not process the package bundle with ytt, error: %w", err) + } + + file, err := os.CreateTemp("", "ytt-processed") + if err != nil { + return nil, fmt.Errorf("error while creating temp directory %w", err) + } + defer os.Remove(file.Name()) + err = saveFile(file.Name(), pkgBytes) + if err != nil { + return nil, fmt.Errorf("error while saving file %w", err) + } + + inputFilesForImageResolution := []string{file.Name()} + + // Use `.imgpkg` directory if exists for ImageResolution + imgpkgDir := filepath.Join(pkgDir, ".imgpkg") + if pathExists(imgpkgDir) { + inputFilesForImageResolution = append(inputFilesForImageResolution, imgpkgDir) + } + return resolveImagesInPackage(inputFilesForImageResolution) +} + +// saveFile saves the file to the provided path +// Also creates missing directories if any +func saveFile(filePath string, data []byte) error { + dirName := filepath.Dir(filePath) + if _, serr := os.Stat(dirName); serr != nil { + merr := os.MkdirAll(dirName, os.ModePerm) + if merr != nil { + return merr + } + } + + err := os.WriteFile(filePath, data, ConfigFilePermissions) + if err != nil { + return fmt.Errorf("unable to save file '%s', error %w", filePath, err) + } + + return nil +} + +// pathExists returns true if file/directory exists otherwise returns false +func pathExists(dir string) bool { + _, err := os.Stat(dir) + if err != nil && os.IsNotExist(err) { + return false + } + return true +} + +// resolveImagesInPackage resolves the images using kbld tool +// Implements similar functionality as `kbld -f -f ` +func resolveImagesInPackage(file []string) ([]byte, error) { + var outputBuf, errorBuf bytes.Buffer + writerUI := ui.NewWriterUI(&outputBuf, &errorBuf, nil) + kbldResolveOptions := cmd.NewResolveOptions(writerUI) + kbldResolveOptions.FileFlags = cmd.FileFlags{Files: file} + kbldResolveOptions.BuildConcurrency = 1 + + // backup and reset stderr to avoid kbld to write anything to stderr + stdErr := os.Stderr + os.Stderr = nil + err := kbldResolveOptions.Run() + os.Stderr = stdErr + if err != nil { + return nil, fmt.Errorf("error while resolving images: %w", err) + } + return outputBuf.Bytes(), nil +} + +func checkUpgradeCompatibility(fromVersion, toVersion string) bool { + v1Versions, err := utilversion.ParseSemantic(fromVersion) + if err != nil { + return false + } + v2Versions, err := utilversion.ParseSemantic(toVersion) + if err != nil { + return false + } + if v2Versions.LessThan(v1Versions) { + return false + } + return true +} + +// NoopUI implement noop interface for logging used with carvel tooling +type NoopUI struct{} + +var _ yttui.UI = NoopUI{} + +// Printf noop print +func (u NoopUI) Printf(str string, args ...interface{}) {} + +// Debugf noop debug +func (u NoopUI) Debugf(str string, args ...interface{}) {} + +// Warnf noop warn +func (u NoopUI) Warnf(str string, args ...interface{}) {} + +// DebugWriter noop debug writer +func (u NoopUI) DebugWriter() io.Writer { + return noopWriter{} +} + +type noopWriter struct{} + +func (n noopWriter) Write(p []byte) (int, error) { + return 0, nil +} + +var _ io.Writer = noopWriter{} diff --git a/cluster-essentials/pkg/client/install.go b/cluster-essentials/pkg/client/install.go new file mode 100644 index 0000000000..785ae553c4 --- /dev/null +++ b/cluster-essentials/pkg/client/install.go @@ -0,0 +1,151 @@ +// Copyright 2023 VMware, Inc. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// Package client has APIs for bootstrapping tanzu cluster-essentials on a kubernetes cluster. +package client + +import ( + "context" + "fmt" + "os" + "strings" + "time" + + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/rest" + + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +var downloadBundles = downloadBundle +var applyResourcesFromManifests = applyResourcesFromManifest +var createClientConfig = createClientconfig + +const defaultBundleDir = "/tmp" +const defaultTimeout = 15 * time.Minute +const packageNameAnnotation = "runtime.tanzu.vmware.com/package-name" +const versionAnnotation = "runtime.tanzu.vmware.com/cluster-essential-vesion" + +var clusterEssentialPackages = []string{"kapp-controller", "secretgen-controller"} + +func createClientconfig(restConfig *rest.Config) (c client.Client, err error) { + clientConfig, err := client.New(restConfig, client.Options{}) + if err != nil { + return nil, err + } + return clientConfig, nil +} + +func validatePreInstall(ctx context.Context, clientset client.Client, upgradeVersion string) error { + nsList := &corev1.NamespaceList{} + err := clientset.List(ctx, nsList) + if err != nil { + return err + } + // loop through all the namespace to find deployment/crd + for n := range nsList.Items { + for _, packageName := range clusterEssentialPackages { + var deployment appsv1.Deployment + key := client.ObjectKey{Namespace: nsList.Items[n].Name, Name: packageName} + getErr := clientset.Get(ctx, key, &deployment) + if getErr != nil { + if !strings.Contains(getErr.Error(), "not found") { + return getErr + } + continue + // TODO check for CRD if deployment is not present + // if deployment and CRD is not present, continue the loop to check in other namespace + } + // If deployment is present, check for annotation + _, ok := deployment.Annotations[packageNameAnnotation] + // If annotation is not present then return error + if !ok { + return fmt.Errorf("pre validation check failed for package %s, package is not a part of cluster essential", packageName) + } + // Get the existing cluster essential version + lastUpdateVersion, ok := deployment.Annotations[versionAnnotation] + if !ok { + return fmt.Errorf("pre validation check failed, cluster essential vesion annotation is not present") + } + if !checkUpgradeCompatibility(lastUpdateVersion, upgradeVersion) { + return fmt.Errorf("pre validation check failed for package %s, idowngrade is not supported", packageName) + } + } + } + return nil +} + +func validatePostInstall(ctx context.Context, clientset client.Client, timeout time.Duration) error { + for _, packageName := range clusterEssentialPackages { + pods := &corev1.PodList{} + err := clientset.List(ctx, pods, client.InNamespace(packageName), client.MatchingLabels{"app": packageName}) + if err != nil { + return err + } + if len(pods.Items) == 0 { + return fmt.Errorf("%s pod not found", packageName) + } + // TODO : currently its waiting for first pod in pods list, make it parallelly wait for all the pods found in pods list + if err := wait.Poll(time.Second*5, timeout, func() (done bool, err error) { + pod := &corev1.Pod{} + err = clientset.Get(ctx, client.ObjectKey{ + Namespace: packageName, + Name: pods.Items[0].Name, + }, pod) + if err != nil { + return false, err + } + if pod.Status.Phase != corev1.PodRunning { + return false, nil + } + return true, nil + }); err != nil { + return err + } + } + // Next: Get all the resource from manifest and check if resource is present or not + return nil +} + +// Install installs Cluster Essentials packages. +// This function attempts to install packages from the given imgpkg bundle path +// and waits until install is complete or the given timeout is reached, whichever +// occurs first. +func Install(ctx context.Context, config *rest.Config, clusterEssentialRepo, clusterEssentialVersion string, timeout time.Duration) error { + if timeout == time.Duration(0) { + timeout = defaultTimeout + } + bundleDir, err := os.MkdirTemp(defaultBundleDir, "cluster-essential") + defer os.RemoveAll(bundleDir) + if err != nil { + return err + } + err = downloadBundles(clusterEssentialRepo, clusterEssentialVersion, bundleDir) + if err != nil { + return fmt.Errorf("unable to download cluster essential manifest: %w", err) + } + + clientSet, err := createClientConfig(config) + if err != nil { + return err + } + err = validatePreInstall(ctx, clientSet, clusterEssentialVersion) + if err != nil { + return fmt.Errorf("pre install validation is failed with error: %w", err) + } + generatedManifestByte, err := carvelPackageProcessor(bundleDir) + if err != nil { + return fmt.Errorf("unable to process carvel package, error: %w", err) + } + err = applyResourcesFromManifests(ctx, generatedManifestByte, config) + if err != nil { + return fmt.Errorf("unable to install cluster essentials : %w", err) + } + err = validatePostInstall(ctx, clientSet, timeout) + if err != nil { + return fmt.Errorf("post install validation is failed with error: %w", err) + } + return nil +} diff --git a/cluster-essentials/pkg/client/install_test.go b/cluster-essentials/pkg/client/install_test.go new file mode 100644 index 0000000000..0a55cd733e --- /dev/null +++ b/cluster-essentials/pkg/client/install_test.go @@ -0,0 +1,180 @@ +// Copyright 2023 VMware, Inc. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +// Package test +package client + +import ( + "context" + "fmt" + "os" + "testing" + + cp "github.com/otiai10/copy" + "github.com/stretchr/testify/require" + appsv1 "k8s.io/api/apps/v1" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/rest" + "k8s.io/utils/pointer" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" +) + +var clusterEssentialRepo = "test.image" +var clusterEssentialVersion = "v1.0" +var bundleDir = "tmp" +var config *rest.Config +var ctx = context.Background() + +func downloadBundleSuccess(clusterEssentialRepo, clusterEssentialVersion, outputDir string) error { + _ = cp.Copy("../testdata/package2", outputDir) + return nil +} + +func downloadCorruptedBundleSuccess(clusterEssentialRepo, clusterEssentialVersion, outputDir string) error { + _ = cp.Copy("../testdata/package1", outputDir) + return nil +} + +func downloadBundleFail(clusterEssentialRepo, clusterEssentialVersion, outputDir string) error { + return fmt.Errorf("image not found") +} + +//nolint:staticcheck +func createMockClientSet(restConfig *rest.Config) (c client.Client, err error) { + pod1 := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kapp-controller", + Namespace: "kapp-controller", + Labels: map[string]string{ + "app": "kapp-controller", + }, + }, + Status: v1.PodStatus{ + Phase: v1.PodRunning, + }, + } + pod2 := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "secretgen-controller", + Namespace: "secretgen-controller", + Labels: map[string]string{ + "app": "secretgen-controller", + }, + }, + Status: v1.PodStatus{ + Phase: v1.PodRunning, + }, + } + client := fake.NewFakeClient() + _ = client.Create(context.TODO(), &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "kapp-controller"}}) + _ = client.Create(context.TODO(), &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "secretgen-controller"}}) + + _ = client.Create(context.TODO(), pod1) + _ = client.Create(context.TODO(), pod2) + + return client, nil +} + +func applyResourcesFromManifestSuccess(ctx context.Context, manifestBytes []byte, cfg *rest.Config) error { + return nil +} + +func int32Ptr(i int32) *int32 { return &i } + +func Test_Install(t *testing.T) { + _ = os.MkdirAll(bundleDir, os.ModePerm) + defer os.RemoveAll(bundleDir) + t.Run("fails when unable to download cluster essential bundle ", func(t *testing.T) { + downloadBundles = downloadBundleFail + err := Install(ctx, config, clusterEssentialRepo, clusterEssentialVersion, 0) + require.Error(t, err) + require.ErrorContains(t, err, "unable to download cluster essential manifest") + }) + t.Run("fails when unable to process downloaded cluster essential bundle ", func(t *testing.T) { + downloadBundles = downloadCorruptedBundleSuccess + createClientConfig = createMockClientSet + err := Install(ctx, config, clusterEssentialRepo, clusterEssentialVersion, 0) + require.Error(t, err) + require.ErrorContains(t, err, "unable to process carvel package") + }) + t.Run("fails when unable to load kubeconfig ", func(t *testing.T) { + downloadBundles = downloadBundleSuccess + createClientConfig = createMockClientSet + err := Install(ctx, config, clusterEssentialRepo, clusterEssentialVersion, 0) + require.Error(t, err) + require.ErrorContains(t, err, "failed to load kubeconfig") + }) + t.Run("succeeds when API successfully able to install cluster essential packages", func(t *testing.T) { + downloadBundles = downloadBundleSuccess + applyResourcesFromManifests = applyResourcesFromManifestSuccess + createClientConfig = createMockClientSet + err := Install(ctx, config, clusterEssentialRepo, clusterEssentialVersion, 0) + require.NoError(t, err) + }) +} + +//nolint:staticcheck +func Test_validatePreInstall(t *testing.T) { + t.Run("succeeds when cluster essential packages are not installed", func(t *testing.T) { + client := fake.NewFakeClient() + err := validatePreInstall(ctx, client, clusterEssentialVersion) + require.NoError(t, err) + }) + + t.Run("fail when cluster essential packages (does not belong to cluster essential) present", func(t *testing.T) { + dep := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "kapp-controller", + Name: "kapp-controller", + }, + Spec: appsv1.DeploymentSpec{ + Replicas: pointer.Int32(5), + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": "kapp-controller", + }, + }, + }, + } + client := fake.NewFakeClient(dep) + _ = client.Create(context.TODO(), &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "kapp-controller"}}) + err := validatePreInstall(ctx, client, clusterEssentialVersion) + require.Error(t, err) + require.ErrorContains(t, err, "pre validation check failed for package") + }) + t.Run("pass when cluster essential packages present", func(t *testing.T) { + client := fake.NewFakeClient() + _ = client.Create(context.TODO(), &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "kapp-controller"}}) + deployment := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "kapp-controller", + Annotations: map[string]string{ + "runtime.tanzu.vmware.com/package-name": "kapp-controller", + }, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: int32Ptr(2), + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": "kapp-controller", + }, + }, + Template: v1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "app": "kapp-controller", + }, + Annotations: map[string]string{ + "runtime.tanzu.vmware.com/package-name": "kapp-controller", + }, + }, + }, + }, + } + _ = client.Create(context.TODO(), deployment) + err := validatePreInstall(ctx, client, clusterEssentialVersion) + require.NoError(t, err) + }) +} diff --git a/cli/core/pkg/carvelhelpers/test/package1/input/config/overlay.yaml b/cluster-essentials/pkg/testdata/package1/config/overlay.yaml similarity index 100% rename from cli/core/pkg/carvelhelpers/test/package1/input/config/overlay.yaml rename to cluster-essentials/pkg/testdata/package1/config/overlay.yaml diff --git a/cli/core/pkg/carvelhelpers/test/package1/input/config/pod.yaml b/cluster-essentials/pkg/testdata/package1/config/pod.yaml similarity index 100% rename from cli/core/pkg/carvelhelpers/test/package1/input/config/pod.yaml rename to cluster-essentials/pkg/testdata/package1/config/pod.yaml diff --git a/cli/core/pkg/carvelhelpers/test/package1/input/config/values.yaml b/cluster-essentials/pkg/testdata/package1/config/values.yaml similarity index 100% rename from cli/core/pkg/carvelhelpers/test/package1/input/config/values.yaml rename to cluster-essentials/pkg/testdata/package1/config/values.yaml diff --git a/cluster-essentials/pkg/testdata/package2/.imgpkg/images.yml b/cluster-essentials/pkg/testdata/package2/.imgpkg/images.yml new file mode 100644 index 0000000000..132f79a91e --- /dev/null +++ b/cluster-essentials/pkg/testdata/package2/.imgpkg/images.yml @@ -0,0 +1,7 @@ +--- +apiVersion: imgpkg.carvel.dev/v1alpha1 +images: +- annotations: + kbld.carvel.dev/id: test.fake.repo/tkg/kapp-controller@sha256:abcd017b151bb08c8a9699715495589ee64158ff0d79dba08a06a121de732a75 + image: test.fake.repo/tkg/kapp-controller@sha256:abcd017b151bb08c8a9699715495589ee64158ff0d79dba08a06a121de732a75 +kind: ImagesLock diff --git a/cli/core/pkg/carvelhelpers/test/package2/input/config/overlay.yaml b/cluster-essentials/pkg/testdata/package2/config/overlay.yaml similarity index 100% rename from cli/core/pkg/carvelhelpers/test/package2/input/config/overlay.yaml rename to cluster-essentials/pkg/testdata/package2/config/overlay.yaml diff --git a/cli/core/pkg/carvelhelpers/test/package2/input/config/pod.yaml b/cluster-essentials/pkg/testdata/package2/config/pod.yaml similarity index 100% rename from cli/core/pkg/carvelhelpers/test/package2/input/config/pod.yaml rename to cluster-essentials/pkg/testdata/package2/config/pod.yaml diff --git a/cli/core/pkg/carvelhelpers/test/package2/input/config/values.yaml b/cluster-essentials/pkg/testdata/package2/config/values.yaml similarity index 100% rename from cli/core/pkg/carvelhelpers/test/package2/input/config/values.yaml rename to cluster-essentials/pkg/testdata/package2/config/values.yaml diff --git a/cmd/cli/README.md b/cmd/cli/README.md deleted file mode 100644 index 9ca1219134..0000000000 --- a/cmd/cli/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Tanzu CLI - -## Summary - -Our objective is to support building CLI experiences built on a shared framework to enable a consistent, unified product -experience for our users. We have designed the CLI around a pluggable model to support a broader set of products as they -are ready to adopt it. - -## Documentation - -* [Getting Started with Tanzu CLI](../../docs/cli/getting-started.md) -* [Tanzu CLI Architecture](../../docs/cli/cli-architecture.md) -* [Plugin Implementation Guide](../../docs/cli/plugin_implementation_guide.md) diff --git a/cmd/cli/plugin-admin/builder/README.md b/cmd/cli/plugin-admin/builder/README.md deleted file mode 100644 index e784b1ad51..0000000000 --- a/cmd/cli/plugin-admin/builder/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# Builder - -Scaffolds and builds Tanzu plugin repositories - -## Usage - -### Init - -`tanzu builder init ` will initialize a new plugin repository with scaffolding for: - -* Tanzu Framework CLI integration -* GolangCI linting config -* GitHub or GitLab CI config -* A Makefile - -For more details, this command supports a `--dry-run` flag which will show everything created: - -```sh -tanzu builder init --dry-run -``` - -### Add-plugin - -`tanzu builder cli add-plugin ` adds a new plugin to your repository. The plugins command will live in the `./cmd/plugin/` directory. - -### Compile - -`tanzu builder cli compile` will compile a repository and create the artifacts to be used with tanzu cli. - -The artifact output directory structure will be created to match the expected layout. This will include some plugin -metadata used in the publishing and installation of plugins in a `manifest.yaml` file and a `plugin.yaml` file for -each included plugin. - -Plugins will find that their `make build` command will suffice for most compile cases, but there are many flags at your disposal as well: - -```txt ---artifacts string path to output artifacts (default "artifacts") ---corepath string path for core binary ---ldflags string ldflags to set on build ---match string match a plugin name to build, supports globbing (default "*") ---path string path of the plugins directory (default "./cmd/cli/plugin") ---target string only compile for a specific target, use 'local' to compile for host os (default "all") ---version string version of the root cli (required) -``` - -### Publish - -`tanzu builder publish` is used to publish the compiled plugin to a target output. The two supported targets for -publishing are "local" for the legacy local filesystem output, or "oci" for the recommended OCI image bundle. - -Arguments to the `publish` command are: - -```txt ---input-artifact-dir string artifact directory which is a output of 'tanzu builder cli compile' command ---local-output-discovery-dir string local output directory where CLIPlugin resource yamls for discovery will be placed. Applicable to 'local' type ---local-output-distribution-dir string local output directory where plugin binaries will be placed. Applicable to 'local' type ---oci-discovery-image string image path to publish oci image with CLIPlugin resource yamls. Applicable to 'oci' type ---oci-distribution-image-repository string image path prefix to publish oci image for plugin binaries. Applicable to 'oci' type ---os-arch string list of os-arch (default "darwin-amd64 linux-amd64 windows-amd64") ---plugins string list of plugin names. Example: 'login management-cluster cluster' ---type string type of discovery and distribution for publishing plugins. Supported: local ---version string recommended version of the plugins -``` diff --git a/cmd/cli/plugin-admin/builder/cli.go b/cmd/cli/plugin-admin/builder/cli.go deleted file mode 100644 index 2c65d613cf..0000000000 --- a/cmd/cli/plugin-admin/builder/cli.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/plugin/builder/command" -) - -var ( - dryRun bool - description string -) - -var compileArgs = &command.PluginCompileArgs{ - Match: "*", - TargetArch: []string{"all"}, - SourcePath: "./cmd/cli/plugin", - ArtifactsDir: cli.DefaultArtifactsDirectory, -} - -// NewCLICmd creates the CLI builder commands. -func NewCLICmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "cli", - Short: "Build CLIs", - } - - cmd.AddCommand(newCompileCmd()) - cmd.AddCommand(newAddPluginCmd()) - return cmd -} - -// newCompileCmd compiles CLI plugins. -func newCompileCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "compile", - Short: "Compile a repository", - RunE: func(cmd *cobra.Command, args []string) error { - return command.Compile(compileArgs) - }, - } - - cmd.Flags().StringVar(&compileArgs.Version, "version", "", "Version of the core tanzu cli") - cmd.Flags().StringVar(&compileArgs.LDFlags, "ldflags", "", "ldflags to set on build") - cmd.Flags().StringVar(&compileArgs.Tags, "tags", "", "Tags to set on build") - cmd.Flags().StringVar(&compileArgs.Match, "match", compileArgs.Match, "Match a plugin name to build, supports globbing") - cmd.Flags().StringArrayVar(&compileArgs.TargetArch, "target", compileArgs.TargetArch, "Only compile for specific target(s), use 'local' to compile for host os") - cmd.Flags().StringVar(&compileArgs.SourcePath, "path", compileArgs.SourcePath, "Path of the plugins source directory") - cmd.Flags().StringVar(&compileArgs.ArtifactsDir, "artifacts", compileArgs.ArtifactsDir, "Path to output artifacts") - cmd.Flags().StringVar(&compileArgs.CorePath, "corepath", "", "Path for core binary") - cmd.Flags().StringVar(&compileArgs.GoPrivate, "goprivate", "", "Comma-separated list of glob patterns of module path prefixes to set as GOPRIVATE on build") - - return cmd -} - -// newAddPluginCmd adds a cli plugin to the repository. -func newAddPluginCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "add-plugin NAME", - Short: "Add a plugin to a repository", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - var err error - - name := args[0] - if description == "" { - description, err = askDescription() - if err != nil { - return err - } - } - - return command.AddPlugin(name, description, dryRun) - }, - } - - cmd.Flags().BoolVar(&dryRun, "dry-run", false, "Print generated files to stdout") - cmd.Flags().StringVar(&description, "description", "", "Required plugin description") - - return cmd -} - -func askDescription() (answer string, err error) { - questioncfg := &component.QuestionConfig{ - Message: "provide a description", - } - err = component.Ask(questioncfg, &answer) - if err != nil { - return - } - return -} diff --git a/cmd/cli/plugin-admin/builder/command/cli_add.go b/cmd/cli/plugin-admin/builder/command/cli_add.go deleted file mode 100644 index 0f6a8ea5d5..0000000000 --- a/cmd/cli/plugin-admin/builder/command/cli_add.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package command provides handling to generate new scaffolding, compile, and -// publish CLI plugins. -package command - -import ( - "errors" - "os" - - "github.com/aunum/log" - - "github.com/vmware-tanzu/tanzu-framework/plugin/builder/template" -) - -// looksLikeARepo tries to verify we are running from the root of a repo or -// submodule. It looks for the presence of a go.mod and Makefile. If either is -// not found, returns an error to indicate it does not look like we are running -// from the repo root. -func looksLikeARepo() error { - if _, err := os.Stat("go.mod"); errors.Is(err, os.ErrNotExist) { - return errors.New("command should be run from the root of the repo, go.mod not found") - } - if _, err := os.Stat("Makefile"); errors.Is(err, os.ErrNotExist) { - return errors.New("command should be run from the root of the repo, Makefile not found") - } - return nil -} - -// AddPlugin generates the skeleton for a new plugin. -func AddPlugin(name, description string, dryRun bool) error { - // Try to ensure we are in the root of the repo. - if err := looksLikeARepo(); err != nil { - return err - } - - if description == "" { - return errors.New("plugin description is required") - } - - data := struct { - PluginName string - Description string - }{ - PluginName: name, - Description: description, - } - targets := template.DefaultPluginTargets - for _, target := range targets { - err := target.Run("", data, dryRun) - if err != nil { - return err - } - } - log.Success("successfully created plugin") - - return nil -} diff --git a/cmd/cli/plugin-admin/builder/command/cli_compile.go b/cmd/cli/plugin-admin/builder/command/cli_compile.go deleted file mode 100644 index 644d10261f..0000000000 --- a/cmd/cli/plugin-admin/builder/command/cli_compile.go +++ /dev/null @@ -1,527 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package command provides handling to generate new scaffolding, compile, and -// publish CLI plugins. -package command - -import ( - "encoding/json" - "fmt" - "math/rand" - "os" - "os/exec" - "path/filepath" - "runtime" - "sync" - "time" - - "github.com/aunum/log" - "github.com/gobwas/glob" - "gopkg.in/yaml.v2" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -func init() { - // TODO, aunum is an old logging library, need to replace w/ klog, but we want timestamps immediately for build optimizations, so one time hack. - log.Timestamps = true -} - -var ( - version, artifactsDir, ldflags string - tags, goprivate string - targetArch []string -) - -type plugin struct { - cliapi.PluginDescriptor - path string - testPath string - docPath string - modPath string - arch cli.Arch - buildID string -} - -// PluginCompileArgs contains the values to use for compiling plugins. -type PluginCompileArgs struct { - Version string - SourcePath string - ArtifactsDir string - LDFlags string - Tags string - CorePath string - Match string - Description string - GoPrivate string - TargetArch []string -} - -const local = "local" - -var minConcurrent = 2 -var identifiers = []string{ - string('\U0001F435'), - string('\U0001F43C'), - string('\U0001F436'), - string('\U0001F430'), - string('\U0001F98A'), - string('\U0001F431'), - string('\U0001F981'), - string('\U0001F42F'), - string('\U0001F42E'), - string('\U0001F437'), - string('\U0001F42D'), - string('\U0001F428'), -} - -func getID(i int) string { - index := i - if i >= len(identifiers) { - // Well aren't you lucky - index = i % len(identifiers) - } - return identifiers[index] -} - -func getBuildArch(targetArch []string) cli.Arch { - if targetArch[0] == local { - return cli.BuildArch() - } - return cli.Arch(targetArch[0]) -} - -func getMaxParallelism() int { - maxConcurrent := runtime.NumCPU() - 2 - if maxConcurrent < minConcurrent { - maxConcurrent = minConcurrent - } - return maxConcurrent -} - -// compileCore builds the core plugin for the plugin at the given corePath and arch. -func compileCore(corePath string, arch cli.Arch) cli.Plugin { - log.Break() - log.Info("building core binary") - err := buildTargets(corePath, filepath.Join(artifactsDir, cli.CoreName, version), cli.CoreName, arch, "", "") - if err != nil { - log.Errorf("error: %v", err) - os.Exit(1) - } - - b, err := yaml.Marshal(cli.CoreDescriptor) - if err != nil { - log.Errorf("error: %v", err) - os.Exit(1) - } - - configPath := filepath.Join(artifactsDir, cli.CoreDescriptor.Name, cli.PluginFileName) - err = os.WriteFile(configPath, b, 0644) - if err != nil { - log.Errorf("error: %v", err) - os.Exit(1) - } - - return cli.CorePlugin -} - -type errInfo struct { - Err error - Path string - ID string -} - -// setGlobals initializes a set of global variables used throughout the compile -// process, based on the arguments passed in. -func setGlobals(compileArgs *PluginCompileArgs) { - version = compileArgs.Version - artifactsDir = compileArgs.ArtifactsDir - ldflags = compileArgs.LDFlags - tags = compileArgs.Tags - goprivate = compileArgs.GoPrivate - targetArch = compileArgs.TargetArch -} - -func Compile(compileArgs *PluginCompileArgs) error { - // Set our global values based on the passed args - setGlobals(compileArgs) - - log.Infof("building local repository at %s", compileArgs.ArtifactsDir) - - manifest := cli.Manifest{ - CreatedTime: time.Now(), - CoreVersion: compileArgs.Version, - Plugins: []cli.Plugin{}, - } - arch := getBuildArch(compileArgs.TargetArch) - - if compileArgs.CorePath != "" { - corePlugin := compileCore(compileArgs.CorePath, arch) - manifest.Plugins = append(manifest.Plugins, corePlugin) - } - - files, err := os.ReadDir(compileArgs.SourcePath) - if err != nil { - return err - } - - // Limit the number of concurrent operations we perform so we don't - // overwhelm the system. - maxConcurrent := getMaxParallelism() - guard := make(chan struct{}, maxConcurrent) - - // Mix up IDs so we don't always get the same set. - randSkew := rand.Intn(len(identifiers)) // nolint:gosec - var wg sync.WaitGroup - plugins := make(chan cli.Plugin, len(files)) - fatalErrors := make(chan errInfo, len(files)) - g := glob.MustCompile(compileArgs.Match) - for i, f := range files { - if f.IsDir() { - if g.Match(f.Name()) { - wg.Add(1) - guard <- struct{}{} - go func(fullPath, id string) { - defer wg.Done() - p, err := buildPlugin(fullPath, arch, id) - if err != nil { - fatalErrors <- errInfo{Err: err, Path: fullPath, ID: id} - } else { - plug := cli.Plugin{ - Name: p.Name, - Description: p.Description, - } - plugins <- plug - } - <-guard - }(filepath.Join(compileArgs.SourcePath, f.Name()), getID(i+randSkew)) - } - } - } - - wg.Wait() - close(plugins) - close(fatalErrors) - - log.BreakHard() - hasFailed := false - for err := range fatalErrors { - hasFailed = true - log.Errorf("%s - building plugin %q failed - %v", err.ID, err.Path, err.Err) - } - - if hasFailed { - os.Exit(1) - } - - for plug := range plugins { - manifest.Plugins = append(manifest.Plugins, plug) - } - - b, err := yaml.Marshal(manifest) - if err != nil { - return err - } - - manifestPath := filepath.Join(compileArgs.ArtifactsDir, cli.ManifestFileName) - err = os.WriteFile(manifestPath, b, 0644) - if err != nil { - return err - } - - log.Success("successfully built local repository") - return nil -} - -func buildPlugin(path string, arch cli.Arch, id string) (plugin, error) { - log.Infof("%s - building plugin at path %q", id, path) - - var modPath string - - cmd := goCommand("run", "-ldflags", ldflags, "-tags", tags) - - if isLocalGoModFileExists(path) { - modPath = path - cmd.Dir = modPath - cmd.Args = append(cmd.Args, "./.") - err := runDownloadGoDep(path, id) - if err != nil { - log.Errorf("%s - cannot download go dependencies in path: %s - error: %v", id, path, err) - return plugin{}, err - } - } else { - modPath = "" - cmd.Args = append(cmd.Args, fmt.Sprintf("./%s", path)) - } - - cmd.Args = append(cmd.Args, "info") - b, err := cmd.Output() - - if err != nil { - log.Errorf("%s - error: %v", id, err) - log.Errorf("%s - output: %v", id, string(b)) - return plugin{}, err - } - - var desc cliapi.PluginDescriptor - err = json.Unmarshal(b, &desc) - if err != nil { - log.Errorf("%s - error unmarshalling plugin descriptor: %v", id, err) - return plugin{}, err - } - - testPath := filepath.Join(path, "test") - _, err = os.Stat(testPath) - if err != nil { - log.Errorf("%s - plugin %q must implement test", id, desc.Name) - return plugin{}, err - } - docPath := filepath.Join(path, "README.md") - _, err = os.Stat(docPath) - if err != nil { - log.Errorf("%s - plugin %q requires a README.md file", id, desc.Name) - return plugin{}, err - } - - p := plugin{ - PluginDescriptor: desc, - arch: arch, - docPath: docPath, - buildID: id, - } - - if modPath != "" { - p.path = "." - p.testPath = "test" - p.modPath = modPath - } else { - p.path = path - p.testPath = testPath - p.modPath = "" - } - - log.Debugy("plugin", p) - - err = p.compile() - if err != nil { - log.Errorf("%s - error compiling plugin %s", id, desc.Name) - return plugin{}, err - } - - return p, nil -} - -type target struct { - env []string - args []string -} - -func (t target) build(targetPath, prefix, modPath, ldflags, tags string) error { - cmd := goCommand("build") - - var commonArgs = []string{ - "-ldflags", ldflags, - "-tags", tags, - } - - cmd.Args = append(cmd.Args, t.args...) - cmd.Args = append(cmd.Args, commonArgs...) - - cmd.Env = append(cmd.Env, os.Environ()...) - cmd.Env = append(cmd.Env, t.env...) - - if modPath != "" { - cmd.Dir = modPath - } - - cmd.Args = append(cmd.Args, fmt.Sprintf("./%s", targetPath)) - - log.Infof("%s$ %s", prefix, cmd.String()) - output, err := cmd.CombinedOutput() - if err != nil { - log.Errorf("%serror: %v", prefix, err) - log.Errorf("%soutput: %v", prefix, string(output)) - return err - } - return nil -} - -// AllTargets are all the known targets. -const AllTargets cli.Arch = "all" - -type targetBuilder func(pluginName, outPath string) target - -var archMap = map[cli.Arch]targetBuilder{ - cli.Linux386: func(pluginName, outPath string) target { - return target{ - env: []string{ - "CGO_ENABLED=0", - "GOARCH=386", - "GOOS=linux", - }, - args: []string{ - "-o", filepath.Join(outPath, cli.MakeArtifactName(pluginName, cli.Linux386)), - }, - } - }, - cli.LinuxAMD64: func(pluginName, outPath string) target { - return target{ - env: []string{ - "CGO_ENABLED=0", - "GOARCH=amd64", - "GOOS=linux", - }, - args: []string{ - "-o", filepath.Join(outPath, cli.MakeArtifactName(pluginName, cli.LinuxAMD64)), - }, - } - }, - cli.LinuxARM64: func(pluginName, outPath string) target { - return target{ - env: []string{ - "CGO_ENABLED=0", - "GOARCH=arm64", - "GOOS=linux", - }, - args: []string{ - "-o", filepath.Join(outPath, cli.MakeArtifactName(pluginName, cli.LinuxARM64)), - }, - } - }, - cli.DarwinAMD64: func(pluginName, outPath string) target { - return target{ - env: []string{ - "GOARCH=amd64", - "GOOS=darwin", - }, - args: []string{ - "-o", filepath.Join(outPath, cli.MakeArtifactName(pluginName, cli.DarwinAMD64)), - }, - } - }, - cli.DarwinARM64: func(pluginName, outPath string) target { - return target{ - env: []string{ - "GOARCH=arm64", - "GOOS=darwin", - }, - args: []string{ - "-o", filepath.Join(outPath, cli.MakeArtifactName(pluginName, cli.DarwinARM64)), - }, - } - }, - cli.Win386: func(pluginName, outPath string) target { - return target{ - env: []string{ - "GOARCH=386", - "GOOS=windows", - }, - args: []string{ - "-o", filepath.Join(outPath, cli.MakeArtifactName(pluginName, cli.Win386)), - }, - } - }, - cli.WinAMD64: func(pluginName, outPath string) target { - return target{ - env: []string{ - "GOARCH=amd64", - "GOOS=windows", - }, - args: []string{ - "-o", filepath.Join(outPath, cli.MakeArtifactName(pluginName, cli.WinAMD64)), - }, - } - }, -} - -func (p *plugin) compile() error { - absArtifactsDir, err := filepath.Abs(artifactsDir) - if err != nil { - return err - } - - outPath := filepath.Join(absArtifactsDir, p.Name, p.Version) - err = buildTargets(p.path, outPath, p.Name, p.arch, p.buildID, p.modPath) - if err != nil { - return err - } - - testOutPath := filepath.Join(absArtifactsDir, p.Name, p.Version, "test") - err = buildTargets(p.testPath, testOutPath, fmt.Sprintf("%s-test", p.Name), p.arch, p.buildID, p.modPath) - if err != nil { - return err - } - - b, err := yaml.Marshal(p.PluginDescriptor) - if err != nil { - return err - } - - configPath := filepath.Join(absArtifactsDir, p.Name, cli.PluginFileName) - err = os.WriteFile(configPath, b, 0644) - if err != nil { - return err - } - return nil -} - -func buildTargets(targetPath, outPath, pluginName string, arch cli.Arch, id, modPath string) error { - if id != "" { - id = fmt.Sprintf("%s - ", id) - } - - targets := map[cli.Arch]targetBuilder{} - for _, buildArch := range targetArch { - if buildArch == string(AllTargets) { - targets = archMap - } else if buildArch == local { - targets[arch] = archMap[arch] - } else { - bArch := cli.Arch(buildArch) - if val, ok := archMap[bArch]; !ok { - log.Errorf("%q build architecture is not supported", buildArch) - } else { - targets[cli.Arch(buildArch)] = val - } - } - } - - for _, targetBuilder := range targets { - tgt := targetBuilder(pluginName, outPath) - err := tgt.build(targetPath, id, modPath, ldflags, tags) - if err != nil { - return err - } - } - return nil -} - -func runDownloadGoDep(targetPath, prefix string) error { - cmdgomoddownload := goCommand("mod", "download") - cmdgomoddownload.Dir = targetPath - - log.Infof("%s$ %s", prefix, cmdgomoddownload.String()) - output, err := cmdgomoddownload.CombinedOutput() - if err != nil { - log.Errorf("%serror: %v", prefix, err) - log.Errorf("%soutput: %v", prefix, string(output)) - return err - } - return nil -} - -func isLocalGoModFileExists(path string) bool { - _, err := os.Stat(filepath.Join(path, "go.mod")) - return err == nil -} - -func goCommand(arg ...string) *exec.Cmd { - cmd := exec.Command("go", arg...) - if goprivate != "" { - cmd.Env = os.Environ() - cmd.Env = append(cmd.Env, fmt.Sprintf("GOPRIVATE=%s", goprivate)) - } - return cmd -} diff --git a/cmd/cli/plugin-admin/builder/command/init.go b/cmd/cli/plugin-admin/builder/command/init.go deleted file mode 100644 index 6af66e5ae2..0000000000 --- a/cmd/cli/plugin-admin/builder/command/init.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "fmt" - "os/exec" - "strings" - - "github.com/aunum/log" - - "github.com/vmware-tanzu/tanzu-framework/plugin/builder/template" -) - -const ( - github = "github" -) - -func Initialize(name, repoType string, dryRun bool) error { - data := struct { - RepositoryName string - }{ - RepositoryName: name, - } - targets := template.DefaultInitTargets - if strings.EqualFold(repoType, github) { - targets = append(targets, template.GitHubCI) - } else { - targets = append(targets, template.GitLabCI) - } - for _, target := range targets { - err := target.Run(name, data, dryRun) - if err != nil { - return err - } - } - - if dryRun { - return nil - } - - c := exec.Command("git", "init", name) - b, err := c.CombinedOutput() - if err != nil { - return fmt.Errorf("%s -- %s", err, string(b)) - } - log.Success("successfully created repository") - return nil -} diff --git a/cmd/cli/plugin-admin/builder/command/publish.go b/cmd/cli/plugin-admin/builder/command/publish.go deleted file mode 100644 index c9d967de6f..0000000000 --- a/cmd/cli/plugin-admin/builder/command/publish.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package command - -import ( - "path/filepath" - "strings" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/plugin/builder/command/publish" -) - -type PublishArgs struct { - DistroType string - PluginsString string - OSArch string - InputArtifactDir string - LocalOutputDiscoveryDir string - LocalOutputDistribtionDir string - OCIDiscoverImage string - OCIDistributionImageRepository string - RecommendedVersion string -} - -func PublishPlugins(publishArgs *PublishArgs) error { - plugins := strings.Split(publishArgs.PluginsString, " ") - osArch := strings.Split(publishArgs.OSArch, " ") - - if publishArgs.LocalOutputDiscoveryDir == "" { - publishArgs.LocalOutputDiscoveryDir = filepath.Join(common.DefaultLocalPluginDistroDir, "discovery", "oci") - } - - var publisherInterface publish.Publisher - var err error - - switch strings.ToLower(publishArgs.DistroType) { - case "local": - publisherInterface, err = publish.NewLocalPublisher(publishArgs.LocalOutputDistribtionDir) - case "oci": - publisherInterface, err = publish.NewOCIPublisher(publishArgs.OCIDiscoverImage, publishArgs.OCIDistributionImageRepository, publishArgs.LocalOutputDiscoveryDir) - default: - return errors.Errorf("publish plugins with type %s is not yet supported", publishArgs.DistroType) - } - if err != nil { - return err - } - - publishMetadata := publish.Metadata{ - Plugins: plugins, - OSArch: osArch, - RecommendedVersion: publishArgs.RecommendedVersion, - InputArtifactDir: publishArgs.InputArtifactDir, - LocalDiscoveryPath: publishArgs.LocalOutputDiscoveryDir, - PublisherInterface: publisherInterface, - } - - return publish.PublishPlugins(&publishMetadata) -} diff --git a/cmd/cli/plugin-admin/builder/command/publish/helper.go b/cmd/cli/plugin-admin/builder/command/publish/helper.go deleted file mode 100644 index c4c64a76ab..0000000000 --- a/cmd/cli/plugin-admin/builder/command/publish/helper.go +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package publish - -import ( - "crypto/sha256" - "encoding/hex" - "io" - "os" - "path/filepath" - "strings" - - "github.com/pkg/errors" - "github.com/spf13/afero" - "gopkg.in/yaml.v2" - - apimachineryjson "k8s.io/apimachinery/pkg/runtime/serializer/json" - - "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" -) - -const ( - osTypeWindows = "windows" - fileExtensionWindows = ".exe" -) - -type osArch struct { - os string - arch string -} - -type pluginInfo struct { - recommendedVersion string - description string - versions map[string][]osArch - target string -} - -var fs = afero.NewOsFs() - -func detectAvailablePluginInfo(artifactDir string, plugins, arrOSArch []string, recommandedVersion string) (map[string]*pluginInfo, error) { - mapPluginInfo := make(map[string]*pluginInfo) - - // For all plugins - for _, pluginTarget := range plugins { - plugin, target := getPluginNameAndTarget(pluginTarget) - // For all supported OS - for _, osArch := range arrOSArch { - o, a, err := splitOSArch(osArch) - if err != nil { - return nil, err - } - - // get all directory under plugin directory - pluginDir := filepath.Join(artifactDir, o, a, "cli", plugin) - files, err := afero.ReadDir(fs, pluginDir) - if err != nil { - return nil, errors.Errorf("unable to find plugin artifact directory for plugin:'%s' os:'%s', arch:'%s' [directory: '%s']", plugin, o, a, pluginDir) - } - - // Each directory under the plugin directory is considered version directory - for _, file := range files { - if file.IsDir() { - updatePluginInfoMapWithVersionOSArch(mapPluginInfo, plugin, file.Name(), o, a) - } - } - - description := getDescriptionFromPluginYaml(filepath.Join(artifactDir, o, a, "cli", plugin, "plugin.yaml")) - // Update recommended version, Description and Target - updatePluginInfoMapWithRecommandedVersionDescriptionTarget(mapPluginInfo, plugin, recommandedVersion, description, target) - } - } - - return mapPluginInfo, nil -} - -func updatePluginInfoMapWithRecommandedVersionDescriptionTarget(mapPluginInfo map[string]*pluginInfo, plugin, recommendedVersion, description, target string) { - if mapPluginInfo[plugin] == nil { - mapPluginInfo[plugin] = &pluginInfo{} - mapPluginInfo[plugin].versions = make(map[string][]osArch) - } - mapPluginInfo[plugin].recommendedVersion = recommendedVersion - mapPluginInfo[plugin].description = description - mapPluginInfo[plugin].target = target -} - -func updatePluginInfoMapWithVersionOSArch(mapPluginInfo map[string]*pluginInfo, plugin, version, osType, arch string) { - if mapPluginInfo[plugin] == nil { - mapPluginInfo[plugin] = &pluginInfo{} - mapPluginInfo[plugin].versions = make(map[string][]osArch) - } - - if mapPluginInfo[plugin].versions[version] == nil { - mapPluginInfo[plugin].versions[version] = make([]osArch, 0) - } - - oa := mapPluginInfo[plugin].versions[version] - oa = append(oa, osArch{os: osType, arch: arch}) - - mapPluginInfo[plugin].versions[version] = oa -} - -func getDescriptionFromPluginYaml(pluginYaml string) string { - b, err := afero.ReadFile(fs, pluginYaml) - if err == nil { - pd := &cliapi.PluginDescriptor{} - err := yaml.Unmarshal(b, pd) - if err == nil { - return pd.Description - } - } - return "" -} - -func newCLIPluginResource(plugin, target, description, version string, artifacts map[string]v1alpha1.ArtifactList) v1alpha1.CLIPlugin { - cliPlugin := v1alpha1.CLIPlugin{} - cliPlugin.SetGroupVersionKind(v1alpha1.GroupVersionKindCLIPlugin) - cliPlugin.SetName(plugin) - cliPlugin.Spec.Description = description - cliPlugin.Spec.RecommendedVersion = version - cliPlugin.Spec.Artifacts = artifacts - cliPlugin.Spec.Target = v1alpha1.Target(target) - return cliPlugin -} - -func newArtifactObject(osType, arch, artifactType, digest, uri string) v1alpha1.Artifact { - artifact := v1alpha1.Artifact{ - Type: artifactType, - OS: osType, - Arch: arch, - Digest: digest, - } - - if artifactType == common.DistributionTypeOCI { - artifact.Image = uri - } else { - artifact.URI = uri - } - return artifact -} - -// getSHA256FromFile returns SHA256 sum of a file -func getSHA256FromFile(filePath string) (string, error) { - f, err := os.Open(filePath) - if err != nil { - return "", err - } - defer f.Close() - - h := sha256.New() - if _, err := io.Copy(h, f); err != nil { - return "", err - } - b := h.Sum(nil) - - return hex.EncodeToString(b), nil -} - -func getPluginPathAndDigestFromMetadata(artifactDir, plugin, version, osType, arch string) (string, string, error) { - sourcePath := filepath.Join(artifactDir, osType, arch, "cli", plugin, version, "tanzu-"+plugin+"-"+osType+"_"+arch) - if osType == osTypeWindows { - sourcePath += fileExtensionWindows - } - digest, err := getSHA256FromFile(sourcePath) - if err != nil { - return "", "", errors.Wrap(err, "error while calculating sha256") - } - return sourcePath, digest, nil -} - -func saveCLIPluginResource(cliPlugin *v1alpha1.CLIPlugin, discoveryResourceFile string) error { - discoveryResourceDir := filepath.Dir(discoveryResourceFile) - - err := fs.MkdirAll(discoveryResourceDir, 0755) - if err != nil { - return errors.Wrap(err, "could not create dir") - } - - fo, err := fs.Create(discoveryResourceFile) - if err != nil { - return errors.Wrap(err, "could not create resource file") - } - defer fo.Close() - - scheme, err := v1alpha1.SchemeBuilder.Build() - if err != nil { - return errors.Wrap(err, "failed to create scheme") - } - e := apimachineryjson.NewSerializerWithOptions(apimachineryjson.DefaultMetaFactory, scheme, scheme, - apimachineryjson.SerializerOptions{Yaml: true, Pretty: false, Strict: false}) - - err = e.Encode(cliPlugin, fo) - if err != nil { - return errors.Wrap(err, "could not write to CLIPlugin resource file") - } - return nil -} - -func ensureResourceDir(resourceDir string, cleanDir bool) error { - if cleanDir { - _ = fs.RemoveAll(resourceDir) - } - if err := fs.MkdirAll(resourceDir, 0755); err != nil { - return errors.Wrapf(err, "unable to create resource directory '%v'", resourceDir) - } - return nil -} - -func splitOSArch(osArch string) (string, string, error) { - arr := strings.Split(osArch, "-") - if len(arr) < 2 { - return "", "", errors.Errorf("provided os-arch '%s' is invalid", osArch) - } - return arr[0], arr[1], nil -} diff --git a/cmd/cli/plugin-admin/builder/command/publish/helper_test.go b/cmd/cli/plugin-admin/builder/command/publish/helper_test.go deleted file mode 100644 index 1f3836db36..0000000000 --- a/cmd/cli/plugin-admin/builder/command/publish/helper_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package publish - -import ( - "fmt" - "path/filepath" - "testing" - - "github.com/aunum/log" - "github.com/spf13/afero" - "github.com/tj/assert" -) - -func Test_DetectAvailablePluginInfo(t *testing.T) { - assert := assert.New(t) - artifactDir := "artifacts" - // Set `fs` as in memory file system for testing - fs = afero.NewMemMapFs() - - // Setup artifacts directory for testing - createDummyArtifactDir(filepath.Join(artifactDir, "windows", "amd64", "cli"), "fake-plugin-foo", "v1.1.0", "fake description", []string{"v1.0.0"}) - createDummyArtifactDir(filepath.Join(artifactDir, "windows", "arm32", "cli"), "fake-plugin-foo", "v1.1.0", "fake description", []string{"v1.0.0"}) - createDummyArtifactDir(filepath.Join(artifactDir, "darwin", "amd64", "cli"), "fake-plugin-foo", "v1.1.0", "fake description", []string{"v1.0.0", "v1.1.0"}) - createDummyArtifactDir(filepath.Join(artifactDir, "darwin", "arm32", "cli"), "fake-plugin-foo", "v1.1.0", "fake description", []string{"v1.0.0", "v1.1.0"}) - - plugins := []string{"fake-plugin-foo"} - osArch := []string{"darwin-amd64", "darwin-arm32", "windows-amd64", "windows-arm32"} - pluginInfo, err := detectAvailablePluginInfo(artifactDir, plugins, osArch, "v1.1.0") - assert.Nil(err) - assert.NotNil(pluginInfo["fake-plugin-foo"]) - - // should include 2 versions. "v1.0.0" and "v1.1.0" and no other versions - assert.Equal(2, len(pluginInfo["fake-plugin-foo"].versions)) - assert.NotNil(pluginInfo["fake-plugin-foo"].versions["v1.0.0"]) - assert.NotNil(pluginInfo["fake-plugin-foo"].versions["v1.1.0"]) - assert.Nil(pluginInfo["fake-plugin-foo"].versions["v1.2.0"]) - - // should include 4 os-arch for version v1.0.0. "darwin-amd64", "darwin-arm32", "windows-amd64", "windows-arm32" - assert.Equal(4, len(pluginInfo["fake-plugin-foo"].versions["v1.0.0"])) - arrOsArch := convertVersionToStringArray(pluginInfo["fake-plugin-foo"].versions["v1.0.0"]) - assert.Contains(arrOsArch, "darwin-amd64") - assert.Contains(arrOsArch, "darwin-arm32") - assert.Contains(arrOsArch, "windows-amd64") - assert.Contains(arrOsArch, "windows-arm32") - - // should include 2 os-arch for version v1.1.0. "darwin-amd64", "darwin-amd64" - assert.Equal(2, len(pluginInfo["fake-plugin-foo"].versions["v1.1.0"])) - arrOsArch = convertVersionToStringArray(pluginInfo["fake-plugin-foo"].versions["v1.1.0"]) - assert.Contains(arrOsArch, "darwin-amd64") - assert.Contains(arrOsArch, "darwin-arm32") - assert.NotContains(arrOsArch, "windows-amd64") - assert.NotContains(arrOsArch, "windows-arm32") - - assert.Equal("v1.1.0", pluginInfo["fake-plugin-foo"].recommendedVersion) - assert.Equal("fake description", pluginInfo["fake-plugin-foo"].description) -} - -func convertVersionToStringArray(arrOsArchInfo []osArch) []string { - oa := []string{} - for idx := range arrOsArchInfo { - oa = append(oa, arrOsArchInfo[idx].os+"-"+arrOsArchInfo[idx].arch) - } - return oa -} - -func createDummyArtifactDir(directoryBasePath, pluginName, recommendedVersion, description string, versions []string) { //nolint:unparam // `pluginName` always receives `"fake-plugin-foo" - var err error - - for _, v := range versions { - err = fs.MkdirAll(filepath.Join(directoryBasePath, pluginName, v), 0755) - if err != nil { - log.Fatal(err) - } - } - - data := `name: %s -description: %s -version: %s` - - err = afero.WriteFile(fs, filepath.Join(directoryBasePath, pluginName, "plugin.yaml"), []byte(fmt.Sprintf(data, pluginName, description, recommendedVersion)), 0644) - if err != nil { - log.Fatal(err) - } -} diff --git a/cmd/cli/plugin-admin/builder/command/publish/local.go b/cmd/cli/plugin-admin/builder/command/publish/local.go deleted file mode 100644 index dec7eb662c..0000000000 --- a/cmd/cli/plugin-admin/builder/command/publish/local.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package publish - -import ( - "path/filepath" - - "github.com/otiai10/copy" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" -) - -// LocalPublisher defines local publisher configuration -type LocalPublisher struct { - LocalDistributionPath string -} - -// NewLocalPublisher create new local publisher -func NewLocalPublisher(localDistributionPath string) (Publisher, error) { - if localDistributionPath == "" { - return nil, errors.New("local distribution path cannot be empty") - } - return &LocalPublisher{ - LocalDistributionPath: localDistributionPath, - }, nil -} - -// PublishPlugin publishes plugin binaries to local distribution directory -func (l *LocalPublisher) PublishPlugin(sourcePath, version, os, arch, plugin string) (string, error) { - relativePath := filepath.Join(os, arch, "cli", plugin, version, "tanzu-"+plugin+"-"+os+"_"+arch) - if os == osTypeWindows { - relativePath += fileExtensionWindows - } - - destPath := filepath.Join(l.LocalDistributionPath, relativePath) - - _ = ensureResourceDir(filepath.Dir(destPath), false) - err := copy.Copy(sourcePath, destPath) - if err != nil { - return "", err - } - return relativePath, nil -} - -// PublishDiscovery publishes the CLIPlugin resources YAML to a local discovery directory -func (l *LocalPublisher) PublishDiscovery() error { - return nil -} - -// Type returns type of publisher -func (l *LocalPublisher) Type() string { - return common.DistributionTypeLocal -} diff --git a/cmd/cli/plugin-admin/builder/command/publish/oci.go b/cmd/cli/plugin-admin/builder/command/publish/oci.go deleted file mode 100644 index 3fce90a62c..0000000000 --- a/cmd/cli/plugin-admin/builder/command/publish/oci.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package publish - -import ( - "fmt" - "os/exec" - "path/filepath" - "strings" - - "github.com/aunum/log" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" -) - -// OCIPublisher defines OCI publisher configuration -type OCIPublisher struct { - OCIDiscoveryImage string - OCIDistributionImageRepository string - - LocalDiscoveryPath string -} - -// NewOCIPublisher create new OCI based publisher -func NewOCIPublisher( - ociDiscoveryImage, - ociDistributionImageRepository, - localDiscoveryPath string) (Publisher, error) { - - if ociDistributionImageRepository == "" { - return nil, errors.New("OCI distribution image repository cannot be empty") - } - if ociDiscoveryImage == "" { - return nil, errors.New("OCI discovery image cannot be empty") - } - if localDiscoveryPath == "" { - return nil, errors.New("local discovery path cannot be empty") - } - // TODO: Add more validation for image repository and image format - - return &OCIPublisher{ - OCIDiscoveryImage: ociDiscoveryImage, - OCIDistributionImageRepository: ociDistributionImageRepository, - LocalDiscoveryPath: localDiscoveryPath, - }, nil -} - -// PublishPlugin publishes plugin binaries to OCI based distribution directory -func (o *OCIPublisher) PublishPlugin(sourcePath, version, os, arch, plugin string) (string, error) { - // Create artifactImage with format: `image.registry.com/tanzu-cli-plugins/plugin-os-arch:version` - artifactImage := fmt.Sprintf("%s/%s-%s-%s:%s", strings.Trim(o.OCIDistributionImageRepository, "/"), plugin, os, arch, version) - log.Info("Publishing plugin:", plugin, "to", artifactImage) - // TODO: Use imgpkg library directly instead of directly using CLI - out, err := exec.Command("imgpkg", "push", "-i", artifactImage, "-f", filepath.Dir(sourcePath), "--file-exclusion", "test").CombinedOutput() - if err != nil { - return "", errors.Wrapf(err, "%v", string(out)) - } - log.Success("Successfully published plugin:", plugin) - return artifactImage, nil -} - -// PublishDiscovery publishes the CLIPlugin resources YAML to a OCI based discovery container image -func (o *OCIPublisher) PublishDiscovery() error { - log.Info("Publishing discovery image to:", o.OCIDiscoveryImage) - // TODO: Use imgpkg library directly instead of directly using CLI - out, err := exec.Command("imgpkg", "push", "-i", o.OCIDiscoveryImage, "-f", o.LocalDiscoveryPath).CombinedOutput() //nolint:gosec - if err != nil { - return errors.Wrapf(err, "%v", string(out)) - } - log.Success("Successfully published CLIPlugin resources to discovery image:", o.OCIDiscoveryImage) - return nil -} - -// Type returns type of publisher -func (o *OCIPublisher) Type() string { - return common.DistributionTypeOCI -} diff --git a/cmd/cli/plugin-admin/builder/command/publish/publisher.go b/cmd/cli/plugin-admin/builder/command/publish/publisher.go deleted file mode 100644 index 537d0bd513..0000000000 --- a/cmd/cli/plugin-admin/builder/command/publish/publisher.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package publish implements plugin and plugin api publishing related function -package publish - -import ( - "path/filepath" - "strings" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" -) - -// Publisher is an interface to publish plugin and CLIPlugin resource files to discovery -type Publisher interface { - // PublishPlugin publishes plugin binaries to distribution - PublishPlugin(version, os, arch, plugin, sourcePath string) (string, error) - // PublishDiscovery publishes the CLIPlugin resources YAML to a discovery - PublishDiscovery() error - // Type returns type of publisher (local, oci) - Type() string -} - -// Metadata defines metadata required for plugins publishing -type Metadata struct { - Plugins []string - InputArtifactDir string - OSArch []string - RecommendedVersion string - LocalDiscoveryPath string - PublisherInterface Publisher -} - -// PublishPlugins publishes the plugin based on provided metadata -// This function is responsible for auto-detecting the available plugin versions -// as well as os-arch and publishing artifacts to correct discovery and distribution -// based on the publisher type -func PublishPlugins(pm *Metadata) error { - _ = ensureResourceDir(pm.LocalDiscoveryPath, true) - - availablePluginInfo, err := detectAvailablePluginInfo(pm.InputArtifactDir, pm.Plugins, pm.OSArch, pm.RecommendedVersion) - if err != nil { - return err - } - - for plugin, pluginInfo := range availablePluginInfo { - - mapVersionArtifactList := make(map[string]v1alpha1.ArtifactList) - - // Create version based artifact list - for version, arrOSArch := range pluginInfo.versions { - artifacts := make([]v1alpha1.Artifact, 0) - for _, oa := range arrOSArch { - sourcePath, digest, err := getPluginPathAndDigestFromMetadata(pm.InputArtifactDir, plugin, version, oa.os, oa.arch) - if err != nil { - return err - } - - destPath, err := pm.PublisherInterface.PublishPlugin(sourcePath, version, oa.os, oa.arch, plugin) - if err != nil { - return err - } - - artifacts = append(artifacts, newArtifactObject(oa.os, oa.arch, pm.PublisherInterface.Type(), digest, destPath)) - } - mapVersionArtifactList[version] = artifacts - } - - // Create new CLIPlugin resource based on plugin and artifact info - cliPlugin := newCLIPluginResource(plugin, pluginInfo.target, pluginInfo.description, pluginInfo.recommendedVersion, mapVersionArtifactList) - - err := saveCLIPluginResource(&cliPlugin, filepath.Join(pm.LocalDiscoveryPath, plugin+".yaml")) - if err != nil { - return errors.Wrap(err, "could not write CLIPlugin to file") - } - } - - return pm.PublisherInterface.PublishDiscovery() -} - -func getPluginNameAndTarget(pluginTarget string) (string, string) { - arr := strings.Split(pluginTarget, ":") - plugin := arr[0] - target := "" - if len(arr) > 1 { - target = arr[1] - } - return plugin, target -} diff --git a/cmd/cli/plugin-admin/builder/command_test.go b/cmd/cli/plugin-admin/builder/command_test.go deleted file mode 100644 index b8ede18953..0000000000 --- a/cmd/cli/plugin-admin/builder/command_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "bytes" - "os" - "path/filepath" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_BuilderInitAndAddPlugin(t *testing.T) { - assert := assert.New(t) - - dir, err := os.MkdirTemp("", "core") - if err != nil { - t.Error(err) - } - defer os.RemoveAll(dir) - err = os.Chdir(dir) - assert.Nil(err) - - var stdout, stderr bytes.Buffer - - // Assert dry-run does not create a repo - args := []string{"testrepo", "--dry-run", "--repo-type", "github"} - cmd := NewInitCmd() - cmd.SetArgs(args) - cmd.SetOut(&stdout) - cmd.SetErr(&stderr) - err = cmd.Execute() - assert.Nil(err) - - // Assert repo creation - args = []string{"testrepo", "--repo-type", "github"} - cmd = NewInitCmd() - cmd.SetArgs(args) - cmd.SetOut(&stdout) - cmd.SetErr(&stderr) - err = cmd.Execute() - assert.Nil(err) - - err = os.Chdir(filepath.Join(dir, "testrepo")) - assert.Nil(err) - - // Assert plugin creation - stdout = bytes.Buffer{} - stderr = bytes.Buffer{} - cmd = newAddPluginCmd() - args = []string{"testplugin", "--description", "something"} - cmd.SetArgs(args) - cmd.SetOut(&stdout) - cmd.SetErr(&stderr) - err = cmd.Execute() - assert.Nil(err) -} diff --git a/cmd/cli/plugin-admin/builder/go.mod b/cmd/cli/plugin-admin/builder/go.mod deleted file mode 100644 index 7de5181ec7..0000000000 --- a/cmd/cli/plugin-admin/builder/go.mod +++ /dev/null @@ -1,152 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/plugin/builder - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/run => ../../../../apis/run - github.com/vmware-tanzu/tanzu-framework/capabilities/client => ../../../../capabilities/client - github.com/vmware-tanzu/tanzu-framework/cli/core => ../../../../cli/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../../../cli/runtime - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common => ../../../../pinniped-components/common -) - -require ( - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/gobwas/glob v0.2.3 - github.com/otiai10/copy v1.7.0 - github.com/pkg/errors v0.9.1 - github.com/spf13/afero v1.9.2 - github.com/spf13/cobra v1.5.0 - github.com/stretchr/testify v1.8.1 - github.com/tj/assert v0.0.3 - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/core v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - gopkg.in/yaml.v2 v2.4.0 - k8s.io/apimachinery v0.24.2 -) - -require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.6.0 // indirect - cloud.google.com/go/storage v1.27.0 // indirect - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/BurntSushi/toml v1.1.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/adrg/xdg v0.4.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.10.0 // indirect - github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e // indirect - github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect - github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v20.10.11+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.16+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/swag v0.21.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/go-containerregistry v0.7.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/hashicorp/go-version v1.4.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect - github.com/k14s/imgpkg v0.17.0 // indirect - github.com/k14s/kbld v0.32.0 // indirect - github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 // indirect - github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // 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/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/gomega v1.19.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec // indirect - github.com/vmware-tanzu/carvel-imgpkg v0.23.1 // indirect - github.com/vmware-tanzu/carvel-vendir v0.26.0 // indirect - github.com/vmware-tanzu/carvel-ytt v0.40.0 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.102.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect - google.golang.org/grpc v1.50.1 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.24.2 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/client-go v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/cluster-api v1.2.8 // indirect - sigs.k8s.io/controller-runtime v0.12.3 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/cmd/cli/plugin-admin/builder/go.sum b/cmd/cli/plugin-admin/builder/go.sum deleted file mode 100644 index ed340b96e9..0000000000 --- a/cmd/cli/plugin-admin/builder/go.sum +++ /dev/null @@ -1,1723 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/iam v0.6.0 h1:nsqQC88kT5Iwlm4MeNGTpfMWddp6NB/UOLFTH6m1QfQ= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/longrunning v0.1.1 h1:y50CXG4j0+qvEukslYFBCrzaXX0qpFbBzc3PchSu/LE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.10.0 h1:glqzafvxBBAMo+x2w2sdDjUDZeTqqLJmqZPY05qehCU= -github.com/containerd/stargz-snapshotter/estargz v0.10.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e h1:4AxO89dwbgA957M8DX5AV/KsOmxDyAB1BES0INY+A/0= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= -github.com/cppforlife/go-cli-ui v0.0.0-20200506005011-4268990983cc/go.mod h1:I0qrzCmuPWYI6kAOvkllYjaW2aovclWbJ96+v+YyHb0= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f h1:yVW0v4zDXzJo1i8G9G3vtvNpyzhvtLalO34BsN/K88E= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f/go.mod h1:L18TqO77ci8i+hFtlMC4zSFz/D3O8lf84TyVU+zFF8E= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc= -github.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.16+incompatible h1:2Db6ZR/+FUR3hqPMwnogOPHFn405crbpxvWzKovETOQ= -github.com/docker/docker v20.10.16+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -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/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.7.0 h1:u0onUUOcyoCDHEiJoyR1R1gx5er1+r06V5DBhUU5ndk= -github.com/google/go-containerregistry v0.7.0/go.mod h1:2zaoelrL0d08gGbpdP3LqyUuBmhWbpD6IOe2s9nLS2k= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= -github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hpcloud/tail v1.0.1-0.20180514194441-a1dbeea552b7/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57 h1:CwBRArr+BWBopnUJhDjJw86rPL/jGbEjfHWKzTasSqE= -github.com/k14s/imgpkg v0.17.0 h1:l1HqYtjecqx7iYecJUvxQQYdo3WubCahHQ30lh0p9sU= -github.com/k14s/imgpkg v0.17.0/go.mod h1:xYZ7gQxYP3O35vGIXcYchDEHq0xA81FOheCp8Vlq5ko= -github.com/k14s/kbld v0.32.0 h1:zf3qCir0usz7rX6JRF97QxaZ25+13EniE7z+ll0xaZ8= -github.com/k14s/kbld v0.32.0/go.mod h1:N7Ij72ZhJ2B7kTUxavGTBT1YymIfmAeO6JKyNbtja1g= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 h1:wKSifC/VbCaQMqXYn6/gSFqle82OX4bE3KYALDU9FlU= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115/go.mod h1:mGrnmO5qnhJIaSiwMo05cvRL6Ww9ccYbTgNFcm6RHZQ= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 h1:4bcRTTSx+LKSxMWibIwzHnDNmaN1x52oEpvnjCy+8vk= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368/go.mod h1:lKGj1op99m4GtQISxoD2t+K+WO/q2NzEPKvfXFQfbCA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -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 v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= -github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.3 h1:7JgpsBaN0uMkyju4tbYHu0mnM55hNKVYLsXmwr15NQI= -github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -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 v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1 h1:sUHDtnvcIMMcY/Pudym6DJ0kv7+uyMCAqQby0SLnQVs= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1/go.mod h1:2XNe+P0MDgya0FPEMOVZLAXku05VZhccVdDcXChhvy8= -github.com/vmware-tanzu/carvel-vendir v0.26.0 h1:Q98tPnH9WUAWE2vJSAP0lsHGsfwGjfW2y+JUOEiJ/Yk= -github.com/vmware-tanzu/carvel-vendir v0.26.0/go.mod h1:JcuNNVONFbZTbm/GjtGiWUfFrt17YBQzeGT9+gY1+yY= -github.com/vmware-tanzu/carvel-ytt v0.40.0 h1:WUWTtwvfqV9CN9v207oDt2xfhmuWHGwc4MMaXJAqIEE= -github.com/vmware-tanzu/carvel-ytt v0.40.0/go.mod h1:crDcKbS1GM4Q34puoVxdrajWOXrxjOxvUCwtsNV5Etc= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.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-20180730214132-a0f8a16cb08c/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211111162719-482062a4217b/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cmd/cli/plugin-admin/builder/init.go b/cmd/cli/plugin-admin/builder/init.go deleted file mode 100644 index 6a0c371b9f..0000000000 --- a/cmd/cli/plugin-admin/builder/init.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/plugin/builder/command" -) - -const desc = `Initialize a new plugin repository with scaffolding for: - -* Tanzu Framework CLI integration -* GolangCI linting config -* GitHub or GitLab CI config -* A Makefile` - -var ( - repoType string -) - -// NewInitCmd initializes a repository. -func NewInitCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "init PLUGIN_NAME", - Short: "Initialize a new plugin repository", - Long: desc, - RunE: func(cmd *cobra.Command, args []string) error { - var err error - if repoType == "" { - repoType, err = selectCIProvider() - if err != nil { - return err - } - } - return command.Initialize(args[0], repoType, dryRun) - }, - Args: cobra.ExactArgs(1), - } - - cmd.Flags().BoolVar(&dryRun, "dry-run", false, "Print generated files to stdout") - cmd.Flags().StringVar(&repoType, "repo-type", "", "Type of repository: github or gitlab") - - return cmd -} - -func selectCIProvider() (selection string, err error) { - cfg := &component.SelectConfig{ - Message: "choose a repository type", - Options: []string{ - "GitHub", - "GitLab", - }, - } - err = component.Select(cfg, &selection) - if err != nil { - return - } - return -} diff --git a/cmd/cli/plugin-admin/builder/main.go b/cmd/cli/plugin-admin/builder/main.go deleted file mode 100644 index 02d26b2805..0000000000 --- a/cmd/cli/plugin-admin/builder/main.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "builder", - Description: "Build Tanzu components", - Group: cliapi.AdminCmdGroup, - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - - p.AddCommands( - NewCLICmd(), - NewInitCmd(), - NewPublishCmd(), - ) - - if err := p.Execute(); err != nil { - log.Fatal(err) - } -} diff --git a/cmd/cli/plugin-admin/builder/publish.go b/cmd/cli/plugin-admin/builder/publish.go deleted file mode 100644 index e2397860ac..0000000000 --- a/cmd/cli/plugin-admin/builder/publish.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/common" - "github.com/vmware-tanzu/tanzu-framework/plugin/builder/command" -) - -var publishArgs = &command.PublishArgs{ - OSArch: common.DefaultOSArch, -} - -// NewPublishCmd creates a new command for plugin publishing. -func NewPublishCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "publish", - Short: "Publish operations", - RunE: func(cmd *cobra.Command, args []string) error { - return command.PublishPlugins(publishArgs) - }, - } - - cmd.Flags().StringVar(&publishArgs.DistroType, "type", "", "Type of discovery and distribution for publishing plugins. Supported: local, oci") - cmd.Flags().StringVar(&publishArgs.PluginsString, "plugins", "", "List of plugin names. Example: 'login management-cluster cluster'") - cmd.Flags().StringVar(&publishArgs.InputArtifactDir, "input-artifact-dir", "", "Artifact directory which is a output of 'tanzu builder cli compile' command.") - - cmd.Flags().StringVar(&publishArgs.OSArch, "os-arch", publishArgs.OSArch, "List of OS architectures.") - cmd.Flags().StringVar(&publishArgs.RecommendedVersion, "version", "", "Recommended version of the plugins.") - - cmd.Flags().StringVar(&publishArgs.LocalOutputDiscoveryDir, "local-output-discovery-dir", "", "Local output directory where CLIPlugin resource yamls for discovery will be placed. Applicable to 'local' type.") - cmd.Flags().StringVar(&publishArgs.LocalOutputDistribtionDir, "local-output-distribution-dir", "", "Local output directory where plugin binaries will be placed. Applicable to 'local' type.") - - cmd.Flags().StringVar(&publishArgs.OCIDiscoverImage, "oci-discovery-image", "", "Image path to publish oci image with CLIPlugin resource yamls. Applicable to 'oci' type.") - cmd.Flags().StringVar(&publishArgs.OCIDistributionImageRepository, "oci-distribution-image-repository", "", "Image path prefix to publish oci image for plugin binaries. Applicable to 'oci' type.") - - _ = cmd.MarkFlagRequired("type") - _ = cmd.MarkFlagRequired("version") - _ = cmd.MarkFlagRequired("plugins") - _ = cmd.MarkFlagRequired("input-artifact-dir") - - return cmd -} diff --git a/cmd/cli/plugin-admin/builder/template/doc.go b/cmd/cli/plugin-admin/builder/template/doc.go deleted file mode 100644 index 9d6e0d43ad..0000000000 --- a/cmd/cli/plugin-admin/builder/template/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package template provides template for creating new plugins. -package template diff --git a/cmd/cli/plugin-admin/builder/template/plugin.go b/cmd/cli/plugin-admin/builder/template/plugin.go deleted file mode 100644 index 5726b4f000..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugin.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package template - -import "github.com/vmware-tanzu/tanzu-framework/plugin/builder/template/plugintemplates" - -// PluginReadMe target -var PluginReadMe = Target{ - Filepath: "cmd/plugin/{{ .PluginName }}/README.md", - Template: plugintemplates.CommandReadme, -} - -// PluginMain target -// TODO (pbarker): proper logging -var PluginMain = Target{ - Filepath: "cmd/plugin/{{ .PluginName | ToLower }}/main.go", - Template: plugintemplates.MainGo, -} - -// PluginTest target -var PluginTest = Target{ - Filepath: "cmd/plugin/{{ .PluginName }}/test/main.go", - Template: plugintemplates.MainTestGo, -} diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/Makefile.tmpl b/cmd/cli/plugin-admin/builder/template/plugintemplates/Makefile.tmpl deleted file mode 100644 index 27ff720b75..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/Makefile.tmpl +++ /dev/null @@ -1,93 +0,0 @@ -ROOT_DIR_RELATIVE := . - -include $(ROOT_DIR_RELATIVE)/common.mk - -BUILD_VERSION ?= $(shell cat BUILD_VERSION) -BUILD_SHA ?= $(shell git rev-parse --short HEAD) -BUILD_DATE ?= $(shell date -u +"%Y-%m-%d") - -GOOS ?= $(shell go env GOOS) -GOARCH ?= $(shell go env GOARCH) -GOHOSTOS ?= $(shell go env GOHOSTOS) -GOHOSTARCH ?= $(shell go env GOHOSTARCH) - -LD_FLAGS = -X 'github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo.Date=$(BUILD_DATE)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo.SHA=$(BUILD_SHA)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo.Version=$(BUILD_VERSION)' - -TOOLS_DIR := tools -TOOLS_BIN_DIR := $(TOOLS_DIR)/bin -GOLANGCI_LINT := $(TOOLS_BIN_DIR)/golangci-lint -GOLANGCI_LINT_VERSION := 1.49.0 - -GO_SRCS := $(call rwildcard,.,*.go) - -ARTIFACTS_DIR ?= ./artifacts -TANZU_PLUGIN_PUBLISH_PATH ?= $(ARTIFACTS_DIR)/published - -# Add list of plugins separated by space -PLUGINS ?= "" - -# Add supported OS-ARCHITECTURE combinations here -ENVS ?= linux-amd64 windows-amd64 darwin-amd64 - -BUILD_JOBS := $(addprefix build-,${ENVS}) -PUBLISH_JOBS := $(addprefix publish-,${ENVS}) - -go.mod go.sum: $(GO_SRCS) - go mod download - go mod tidy - -.PHONY: build-local -build-local: ## Build the plugin - tanzu builder cli compile --version $(BUILD_VERSION) --ldflags "$(LD_FLAGS)" --path ./cmd/plugin --target local --artifacts artifacts/${GOHOSTOS}/${GOHOSTARCH}/cli - -.PHONY: build -build: $(BUILD_JOBS) $(PUBLISH_JOBS) ## Build the plugin - -.PHONY: build-% -build-%: - $(eval ARCH = $(word 2,$(subst -, ,$*))) - $(eval OS = $(word 1,$(subst -, ,$*))) - tanzu builder cli compile --version $(BUILD_VERSION) --ldflags "$(LD_FLAGS)" --path ./cmd/plugin --artifacts artifacts/${OS}/${ARCH}/cli --target ${OS}_${ARCH} - -publish-local: ## Publish the plugin to generate discovery and distribution directory for local OS_ARCH - tanzu builder publish --type local --plugins "$(PLUGINS)" --version $(BUILD_VERSION) --os-arch "${GOHOSTOS}-${GOHOSTARCH}" --local-output-discovery-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/${GOHOSTOS}-${GOHOSTARCH}/discovery/standalone" --local-output-distribution-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/${GOHOSTOS}-${GOHOSTARCH}/distribution" --input-artifact-dir $(ARTIFACTS_DIR) - -.PHONY: publish -publish: $(PUBLISH_JOBS) ## Publish the plugin to generate discovery and distribution directory - -.PHONY: publish-% -publish-%: - $(eval ARCH = $(word 2,$(subst -, ,$*))) - $(eval OS = $(word 1,$(subst -, ,$*))) - tanzu builder publish --type local --plugins "$(PLUGINS)" --version $(BUILD_VERSION) --os-arch "${OS}-${ARCH}" --local-output-discovery-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/${OS}-${ARCH}/discovery/standalone" --local-output-distribution-dir "$(TANZU_PLUGIN_PUBLISH_PATH)/${OS}-${ARCH}/distribution" --input-artifact-dir $(ARTIFACTS_DIR) - -.PHONY: install-local -install-local: ## Install the locally built plugins - tanzu plugin install all --local $(TANZU_PLUGIN_PUBLISH_PATH)/${GOHOSTOS}-${GOHOSTARCH} - -.PHONY: build-install-local -build-install-local: build-local publish-local ## Build and Install plugin for local OS-ARCH - tanzu plugin install all --local $(TANZU_PLUGIN_PUBLISH_PATH)/${GOHOSTOS}-${GOHOSTARCH} - -.PHONY: release -release: $(BUILD_JOBS) $(PUBLISH_JOBS) # Generates release directory structure for all plugins under `./artifacts/published` (default) - -.PHONY: lint -lint: $(GOLANGCI_LINT) ## Lint the plugin - $(GOLANGCI_LINT) run -v - -.PHONY: init -init:go.mod go.sum ## Initialise the plugin - -.PHONY: test -test: $(GO_SRCS) go.sum - go test ./... - -$(TOOLS_BIN_DIR): - -mkdir -p $@ - -$(GOLANGCI_LINT): $(TOOLS_BIN_DIR) ## Install golangci-lint - curl -L https://github.com/golangci/golangci-lint/releases/download/v$(GOLANGCI_LINT_VERSION)/golangci-lint-$(GOLANGCI_LINT_VERSION)-$(GOHOSTOS)-$(GOHOSTARCH).tar.gz | tar -xz -C /tmp/ - mv /tmp/golangci-lint-$(GOLANGCI_LINT_VERSION)-$(GOHOSTOS)-$(GOHOSTARCH)/golangci-lint $(@) diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/command_readme.md.tmpl b/cmd/cli/plugin-admin/builder/template/plugintemplates/command_readme.md.tmpl deleted file mode 100644 index b2ef464001..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/command_readme.md.tmpl +++ /dev/null @@ -1,37 +0,0 @@ -# {{ .PluginName }} - -## Summary - -[provide a high-level summary of the feature functionality supported by the plugin] - -## Overview - -[outline how the plugin works - boxes and lines diagrams are helpful here] - -## Installation - -[describe any unique or nuanced installation requirements for the plugin] - -## Usage - -[at minimum, provide the output from --help - providing example command output and/or more detailed explanations of commands may also be valuable] - -## Documentation - -[include, or provide links to, additional resources that users or contributors may find useful here] - -## Versioning - -[describe how this plugin follows, or the degree to which it follows or doesn't follow semver] - -## Contribution - -[describe whether/how/where issues/PR's should be submitted] - -## Development - -[describe steps to clone, test, build/install locally, etc..] - -## License - -[name and link to the project this plugin is licensed under] diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/common.mk.tmpl b/cmd/cli/plugin-admin/builder/template/plugintemplates/common.mk.tmpl deleted file mode 100644 index ad2cceb8cf..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/common.mk.tmpl +++ /dev/null @@ -1,36 +0,0 @@ -# Ensure Make is run with bash shell as some syntax below is bash-specific -SHELL:=bash -.ONESHELL: -.EXPORT_ALL_VARIABLES: -.SHELLFLAGS := -eu -o pipefail -c -.DELETE_ON_ERROR: -MAKEFLAGS += --no-builtin-rules - -UID := $(shell id -u) -GID := $(shell id -g) - -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -# Hosts running SELinux need :z added to volume mounts -SELINUX_ENABLED := $(shell cat /sys/fs/selinux/enforce 2> /dev/null || echo 0) - -ifeq ($(SELINUX_ENABLED),1) - DOCKER_VOL_OPTS?=:z -endif - -.DEFAULT_GOAL:=help - -# Use GOPROXY environment variable if set -GOPROXY := $(shell go env GOPROXY) -ifeq ($(GOPROXY),) -GOPROXY := https://proxy.golang.org -endif -export GOPROXY - - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/doc.go b/cmd/cli/plugin-admin/builder/template/plugintemplates/doc.go deleted file mode 100644 index 2abde499cb..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package plugintemplates provides templates for bootstrapping plugins. -package plugintemplates diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/dotgolangci.txt.tmpl b/cmd/cli/plugin-admin/builder/template/plugintemplates/dotgolangci.txt.tmpl deleted file mode 100644 index b0b8ecda7f..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/dotgolangci.txt.tmpl +++ /dev/null @@ -1,93 +0,0 @@ -linters-settings: - goconst: - min-len: 2 - min-occurrences: 2 - gocritic: - enabled-tags: - - diagnostic - - experimental - - opinionated - - performance - - style - disabled-checks: - - dupImport - - ifElseChain - - octalLiteral - - whyNoLint - - wrapperFunc - gocyclo: - min-complexity: 15 - gomnd: - settings: - mnd: - checks: argument,case,condition,return - govet: - check-shadowing: true - settings: - printf: - funcs: - - (github.com/aunum/log").Infof - - (github.com/aunum/log").Warnf - - (github.com/aunum/log").Errorf - - (github.com/aunum/log").Fatalf - misspell: - locale: US - nolintlint: - allow-leading-space: true # don't require machine-readable nolint directives (i.e. with no leading space) - allow-unused: false # report any unused nolint directives - require-explanation: false # don't require an explanation for nolint directives - require-specific: false # don't require nolint directives to be specific about which linter is being skipped - -linters: - disable-all: true - enable: - - bodyclose - - deadcode - - depguard - - dupl - - errcheck - - goconst - - gocritic - - gocyclo - - goheader - - gomnd - - goprintffuncname - - gosec - - gosimple - - govet - - ineffassign - - misspell - - nakedret - - noctx - - nolintlint - - rowserrcheck - - staticcheck - - structcheck - - stylecheck - - typecheck - - unconvert - - unparam - - unused - - varcheck - - whitespace - - # don't enable: - # - asciicheck - # - exhaustive - # - gochecknoinits - # - gochecknoglobals - # - gocognit - # - godot - # - godox - # - goerr113 - # - interfacer - # - lll - # - nestif - # - prealloc - # - testpackage - # - scopelint - # - wsl - -# https://github.com/golangci/golangci/wiki/Configuration -service: - golangci-lint-version: 1.38.0 # use the fixed version to not introduce new linters unexpectedly diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/github_workflow_release.yaml.tmpl b/cmd/cli/plugin-admin/builder/template/plugintemplates/github_workflow_release.yaml.tmpl deleted file mode 100644 index 7c94814d4b..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/github_workflow_release.yaml.tmpl +++ /dev/null @@ -1,50 +0,0 @@ -name: Release - -on: - push: - tags: - - v* - branches: [ master ] - -jobs: - - build: - name: Release - runs-on: ubuntu-latest - steps: - - - name: Set up Go 1.x - uses: actions/setup-go@v2 - with: - go-version: ^1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v2 - - - name: Get dependencies - run: | - go get -v -t -d ./... - curl -o tanzu https://storage.googleapis.com/tanzu-cli/artifacts/core/latest/tanzu-core-linux_amd64 && \ - mv tanzu /usr/local/bin/tanzu && \ - chmod +x /usr/local/bin/tanzu - tanzu plugin repo add -b tanzu-cli-admin-plugins -n admin - - - name: init - run: make init - - - name: Build - run: make build - - - name: Test - run: make test - - - name: Test - run: make lint - - - id: upload-cli-artifacts - uses: GoogleCloudPlatform/github-actions/upload-cloud-storage@master - with: - path: ./artifacts - destination: {{ .RepositoryName }} - credentials: {{"${{ secrets.GCP_BUCKET_SA }}"}} diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/gitlab-ci.yaml.tmpl b/cmd/cli/plugin-admin/builder/template/plugintemplates/gitlab-ci.yaml.tmpl deleted file mode 100644 index ad2fbaec35..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/gitlab-ci.yaml.tmpl +++ /dev/null @@ -1,20 +0,0 @@ -buildpush: - only: - - master -stage: deploy -image: golang:1.18 -script: - # Note: this is all one step because the artifacts were too large to copy over. - - make - - # Download and install Google Cloud SDK - - wget https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz - - tar zxvf google-cloud-sdk.tar.gz && ./google-cloud-sdk/install.sh --usage-reporting=false --path-update=true - - PATH="google-cloud-sdk/bin:${PATH}" - - gcloud --quiet components update - - - echo $GCP_BUCKET_SA > ${HOME}/gcloud-service-key.json - - gcloud auth activate-service-account --key-file ${HOME}/gcloud-service-key.json - - gcloud config set project $GCP_PROJECT_ID - - - gsutil -m cp -R artifacts gs://{{ .RepositoryName }} diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/gomod.tmpl b/cmd/cli/plugin-admin/builder/template/plugintemplates/gomod.tmpl deleted file mode 100644 index 6458d7ee8e..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/gomod.tmpl +++ /dev/null @@ -1,8 +0,0 @@ -module {{ .RepositoryName }} - -go 1.18 - -require ( - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/spf13/cobra v1.5.0 -) diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/main.go.tmpl b/cmd/cli/plugin-admin/builder/template/plugintemplates/main.go.tmpl deleted file mode 100644 index bde7362687..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/main.go.tmpl +++ /dev/null @@ -1,32 +0,0 @@ -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "{{ .PluginName | ToLower }}", - Description: "{{ .Description | ToLower }}", - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, - Group: cliapi.ManageCmdGroup, // set group -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - p.AddCommands( - // Add commands - ) - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/main_test.go.tmpl b/cmd/cli/plugin-admin/builder/template/plugintemplates/main_test.go.tmpl deleted file mode 100644 index 727dc985a9..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/main_test.go.tmpl +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var pluginName = "{{ .PluginName | ToLower }}" - -var descriptor = clitest.NewTestFor(pluginName) - -func main() { - retcode := 0 - - defer func() { os.Exit(retcode) }() - defer func() { _ = Cleanup() }() - - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Println(err) - retcode = 1 - return - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - retcode = 1 - return - } -} - -//nolint:gocritic -func test(c *cobra.Command, _ []string) error { - m := clitest.NewMain(pluginName, c, Cleanup) - defer m.Finish() - - // example test - - // testName := clitest.GenerateName() - // - // err := m.RunTest( - // "create a {{ .PluginName | ToLower }}", - // fmt.Sprintf("{{ .PluginName | ToLower }} create -n %s", testName), - // func(t *clitest.Test) error { - // err := t.ExecContainsString("created") - // if err != nil { - // return err - // } - // return nil - // }, - // ) - // if err != nil { - // return err - // } - return nil -} - -// Cleanup the test. -func Cleanup() error { - return nil -} diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/plugin_readme.md.tmpl b/cmd/cli/plugin-admin/builder/template/plugintemplates/plugin_readme.md.tmpl deleted file mode 100644 index a3af279b45..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/plugin_readme.md.tmpl +++ /dev/null @@ -1,24 +0,0 @@ -# {{ .RepositoryName }} - -Welcome, lets get started with your new Tanzu plugin repository. - -## Getting Started - -First, run `make init` to ensure your plugins go.sum is generated. - -## Generate a plugin - -Add a plugin with the tanzu cli: `tanzu builder cli add-plugin myplugin` - -## Directory Structure - -artifacts/: Where you plugins build output will be located - -cmd/plugin/: Path where you plugins main directory will live - -cmd/plugin//test: Plugins are required to have a test command defined - -## Commands - -`make build`: builds your plugin artifacts -`make lint`: run the golangci linter on your plugin code diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/templates.go b/cmd/cli/plugin-admin/builder/template/plugintemplates/templates.go deleted file mode 100644 index ddfa060200..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/templates.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package plugintemplates - -import _ "embed" // Import files for plugin templates - -// CommandReadme contains the stock readme template -// -//go:embed command_readme.md.tmpl -var CommandReadme string - -// PluginReadme contains the stock readme template -// -//go:embed plugin_readme.md.tmpl -var PluginReadme string - -// GolangCIConfig contains the stock golangci configuration -// -//go:embed dotgolangci.txt.tmpl -var GolangCIConfig string - -// Gomod contains the stock Gomod file for the scaffolding -// -//go:embed gomod.tmpl -var Gomod string - -// Makefile contains the stock Makefile -// -//go:embed Makefile.tmpl -var Makefile string - -// CommonMK contains the stock Common.mk -// -//go:embed common.mk.tmpl -var CommonMK string - -// MainGo contains the plugin main.go template -// -//go:embed main.go.tmpl -var MainGo string - -// MainTestGo contains the plugin main test template -// -//go:embed main_test.go.tmpl -var MainTestGo string - -// ToolsGo contains the plugin tools.go template -// -//go:embed tools.go.tmpl -var ToolsGo string - -// GithubWorkflowRelease contains the Github release workflow template -// -//go:embed github_workflow_release.yaml.tmpl -var GithubWorkflowRelease string - -// GitlabCI contains the Gitlab CI template -// -//go:embed gitlab-ci.yaml.tmpl -var GitlabCI string diff --git a/cmd/cli/plugin-admin/builder/template/plugintemplates/tools.go.tmpl b/cmd/cli/plugin-admin/builder/template/plugintemplates/tools.go.tmpl deleted file mode 100644 index fa567e7296..0000000000 --- a/cmd/cli/plugin-admin/builder/template/plugintemplates/tools.go.tmpl +++ /dev/null @@ -1,7 +0,0 @@ -// +build tools - -package tools - -import ( - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" -) diff --git a/cmd/cli/plugin-admin/builder/template/root.go b/cmd/cli/plugin-admin/builder/template/root.go deleted file mode 100644 index cde5324bdb..0000000000 --- a/cmd/cli/plugin-admin/builder/template/root.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package template - -import "github.com/vmware-tanzu/tanzu-framework/plugin/builder/template/plugintemplates" - -const gitignore = `artifacts -tools/bin` - -// GoMod target -var GoMod = Target{ - Filepath: "go.mod", - Template: plugintemplates.Gomod, -} - -// BuildVersion target -var BuildVersion = Target{ - Filepath: "BUILD_VERSION", - Template: `v0.0.1`, -} - -// GitIgnore target -var GitIgnore = Target{ - Filepath: ".gitignore", - Template: gitignore, -} - -// GitLabCI target -var GitLabCI = Target{ - Filepath: ".gitlab-ci.yaml", - Template: plugintemplates.GitlabCI, -} - -// GitHubCI target -// TODO (pbarker): should we push everything to a single repository, or at least make that possible? -// TODO (pbarker): should report stats -var GitHubCI = Target{ - Filepath: ".github/workflows/release.yaml", - Template: plugintemplates.GithubWorkflowRelease, -} - -// CommonMK MK4 target -var CommonMK = Target{ - Filepath: "common.mk", - Template: plugintemplates.CommonMK, -} - -// Makefile target -var Makefile = Target{ - Filepath: "Makefile", - Template: plugintemplates.Makefile, -} - -// Codeowners target -// TODO (pbarker): replace with the CLI reviewers group -var Codeowners = Target{ - Filepath: "CODEOWNERS", - Template: `* @vuil`, -} - -// Tools target. -var Tools = Target{ - Filepath: "tools/tools.go", - Template: plugintemplates.ToolsGo, -} - -// MainReadMe target -var MainReadMe = Target{ - Filepath: "README.md", - Template: plugintemplates.PluginReadme, -} - -// GolangCIConfig target. -var GolangCIConfig = Target{ - Filepath: ".golangci.yaml", - Template: plugintemplates.GolangCIConfig, -} diff --git a/cmd/cli/plugin-admin/builder/template/target.go b/cmd/cli/plugin-admin/builder/template/target.go deleted file mode 100644 index 0ac4faa63c..0000000000 --- a/cmd/cli/plugin-admin/builder/template/target.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package template - -import ( - "bytes" - "fmt" - "os" - "path/filepath" - "strings" - "text/template" -) - -// Target to template files. -type Target struct { - // Path of the file. - Filepath string - - // Template to use. - Template string -} - -// Run the target. -func (t Target) Run(rootDir string, data interface{}, dryRun bool) error { - funcMap := template.FuncMap{ - "ToUpper": strings.ToUpper, - "ToLower": strings.ToLower, - } - tmplFp := template.Must(template.New("target-fp").Funcs(funcMap).Parse(t.Filepath)) - bufFp := &bytes.Buffer{} - err := tmplFp.Execute(bufFp, data) - if err != nil { - return err - } - fp := filepath.Join(rootDir, bufFp.String()) - - buf := &bytes.Buffer{} - tmpl := template.Must(template.New("target").Funcs(funcMap).Parse(t.Template)) - if err := tmpl.Execute(buf, data); err != nil { - return err - } - if dryRun { - fmt.Printf("-- file: %s --\n\n%s", t.Filepath, buf.String()) - return nil - } - dir := filepath.Dir(fp) - if err := os.MkdirAll(dir, os.ModePerm); err != nil { - return err - } - err = os.WriteFile(fp, buf.Bytes(), 0644) - if err != nil { - return err - } - return nil -} - -// DefaultInitTargets are the default initialization targets. -var DefaultInitTargets = []Target{ - GoMod, - BuildVersion, - GitIgnore, - Makefile, - Codeowners, - MainReadMe, - GolangCIConfig, - Tools, - CommonMK, -} - -// DefaultPluginTargets are the default plugin targets. -var DefaultPluginTargets = []Target{ - PluginReadMe, - PluginMain, - PluginTest, -} diff --git a/cmd/cli/plugin-admin/builder/test/main.go b/cmd/cli/plugin-admin/builder/test/main.go deleted file mode 100644 index 107e712da7..0000000000 --- a/cmd/cli/plugin-admin/builder/test/main.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("builder") - -func main() { - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - m := clitest.NewMain("cluster", c, Cleanup) - defer m.Finish() - - // TODO (pbarker): use virtual filesystem - err := m.RunTest( - "create a repo", - "builder init myrepo --dry-run", - func(t *clitest.Test) error { - err := t.ExecContainsString("myrepo") - if err != nil { - return err - } - return nil - }, - ) - if err != nil { - return err - } - return nil -} - -// Cleanup the test. -func Cleanup() error { - return nil -} diff --git a/cmd/cli/plugin-admin/test/README.md b/cmd/cli/plugin-admin/test/README.md deleted file mode 100644 index cacf00c98e..0000000000 --- a/cmd/cli/plugin-admin/test/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Test - -Test the CLI plugins. Every CLI plugin is required to have a test. - -## Usage - -`tanzu test fetch` will fetch all the tests for the currently installed plugins. - -`tanzu test ` will test a specific plugin. diff --git a/cmd/cli/plugin-admin/test/go.mod b/cmd/cli/plugin-admin/test/go.mod deleted file mode 100644 index e4b9e1f353..0000000000 --- a/cmd/cli/plugin-admin/test/go.mod +++ /dev/null @@ -1,146 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/plugin/test - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/run => ../../../../apis/run - github.com/vmware-tanzu/tanzu-framework/capabilities/client => ../../../../capabilities/client - github.com/vmware-tanzu/tanzu-framework/cli/core => ../../../../cli/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../../../cli/runtime - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common => ../../../../pinniped-components/common -) - -require ( - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/spf13/cobra v1.5.0 - github.com/vmware-tanzu/tanzu-framework/cli/core v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 -) - -require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.6.0 // indirect - cloud.google.com/go/storage v1.27.0 // indirect - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/BurntSushi/toml v1.1.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/adrg/xdg v0.4.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.10.0 // indirect - github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e // indirect - github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect - github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v20.10.11+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.16+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/swag v0.21.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/go-containerregistry v0.7.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/hashicorp/go-version v1.4.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect - github.com/k14s/imgpkg v0.17.0 // indirect - github.com/k14s/kbld v0.32.0 // indirect - github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 // indirect - github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // 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/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/gomega v1.19.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec // indirect - github.com/vmware-tanzu/carvel-imgpkg v0.23.1 // indirect - github.com/vmware-tanzu/carvel-vendir v0.26.0 // indirect - github.com/vmware-tanzu/carvel-ytt v0.40.0 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.102.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect - google.golang.org/grpc v1.50.1 // indirect - google.golang.org/protobuf v1.28.1 // 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.24.2 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/apimachinery v0.24.2 // indirect - k8s.io/client-go v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/cluster-api v1.2.8 // indirect - sigs.k8s.io/controller-runtime v0.12.3 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/cmd/cli/plugin-admin/test/go.sum b/cmd/cli/plugin-admin/test/go.sum deleted file mode 100644 index 6f4e451c8b..0000000000 --- a/cmd/cli/plugin-admin/test/go.sum +++ /dev/null @@ -1,1698 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/iam v0.6.0 h1:nsqQC88kT5Iwlm4MeNGTpfMWddp6NB/UOLFTH6m1QfQ= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/longrunning v0.1.1 h1:y50CXG4j0+qvEukslYFBCrzaXX0qpFbBzc3PchSu/LE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.10.0 h1:glqzafvxBBAMo+x2w2sdDjUDZeTqqLJmqZPY05qehCU= -github.com/containerd/stargz-snapshotter/estargz v0.10.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e h1:4AxO89dwbgA957M8DX5AV/KsOmxDyAB1BES0INY+A/0= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= -github.com/cppforlife/go-cli-ui v0.0.0-20200506005011-4268990983cc/go.mod h1:I0qrzCmuPWYI6kAOvkllYjaW2aovclWbJ96+v+YyHb0= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f h1:yVW0v4zDXzJo1i8G9G3vtvNpyzhvtLalO34BsN/K88E= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f/go.mod h1:L18TqO77ci8i+hFtlMC4zSFz/D3O8lf84TyVU+zFF8E= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc= -github.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.16+incompatible h1:2Db6ZR/+FUR3hqPMwnogOPHFn405crbpxvWzKovETOQ= -github.com/docker/docker v20.10.16+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -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/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.7.0 h1:u0onUUOcyoCDHEiJoyR1R1gx5er1+r06V5DBhUU5ndk= -github.com/google/go-containerregistry v0.7.0/go.mod h1:2zaoelrL0d08gGbpdP3LqyUuBmhWbpD6IOe2s9nLS2k= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= -github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hpcloud/tail v1.0.1-0.20180514194441-a1dbeea552b7/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57 h1:CwBRArr+BWBopnUJhDjJw86rPL/jGbEjfHWKzTasSqE= -github.com/k14s/imgpkg v0.17.0 h1:l1HqYtjecqx7iYecJUvxQQYdo3WubCahHQ30lh0p9sU= -github.com/k14s/imgpkg v0.17.0/go.mod h1:xYZ7gQxYP3O35vGIXcYchDEHq0xA81FOheCp8Vlq5ko= -github.com/k14s/kbld v0.32.0 h1:zf3qCir0usz7rX6JRF97QxaZ25+13EniE7z+ll0xaZ8= -github.com/k14s/kbld v0.32.0/go.mod h1:N7Ij72ZhJ2B7kTUxavGTBT1YymIfmAeO6JKyNbtja1g= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 h1:wKSifC/VbCaQMqXYn6/gSFqle82OX4bE3KYALDU9FlU= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115/go.mod h1:mGrnmO5qnhJIaSiwMo05cvRL6Ww9ccYbTgNFcm6RHZQ= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 h1:4bcRTTSx+LKSxMWibIwzHnDNmaN1x52oEpvnjCy+8vk= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368/go.mod h1:lKGj1op99m4GtQISxoD2t+K+WO/q2NzEPKvfXFQfbCA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -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 v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/otiai10/copy v1.4.2 h1:RTiz2sol3eoXPLF4o+YWqEybwfUa/Q2Nkc4ZIUs3fwI= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -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 v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1 h1:sUHDtnvcIMMcY/Pudym6DJ0kv7+uyMCAqQby0SLnQVs= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1/go.mod h1:2XNe+P0MDgya0FPEMOVZLAXku05VZhccVdDcXChhvy8= -github.com/vmware-tanzu/carvel-vendir v0.26.0 h1:Q98tPnH9WUAWE2vJSAP0lsHGsfwGjfW2y+JUOEiJ/Yk= -github.com/vmware-tanzu/carvel-vendir v0.26.0/go.mod h1:JcuNNVONFbZTbm/GjtGiWUfFrt17YBQzeGT9+gY1+yY= -github.com/vmware-tanzu/carvel-ytt v0.40.0 h1:WUWTtwvfqV9CN9v207oDt2xfhmuWHGwc4MMaXJAqIEE= -github.com/vmware-tanzu/carvel-ytt v0.40.0/go.mod h1:crDcKbS1GM4Q34puoVxdrajWOXrxjOxvUCwtsNV5Etc= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.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-20180730214132-a0f8a16cb08c/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211111162719-482062a4217b/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cmd/cli/plugin-admin/test/main.go b/cmd/cli/plugin-admin/test/main.go deleted file mode 100644 index fc74fec65b..0000000000 --- a/cmd/cli/plugin-admin/test/main.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/cli" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "test", - Description: "Test the CLI", - Group: cliapi.AdminCmdGroup, - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, -} - -var local string - -func init() { - fetchCmd.Flags().StringVarP(&local, "local", "l", "", "path to local repository") - _ = fetchCmd.MarkFlagRequired("local") -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - - p.AddCommands( - fetchCmd, - pluginsCmd, - ) - - _, standalonePlugins, err := pluginmanager.InstalledPlugins() - if err != nil { - log.Fatal(err) - } - - for i := range standalonePlugins { - // Check if test plugin binary installed. If available add a plugin command - _, err := os.Stat(cli.TestPluginPathFromPluginPath(standalonePlugins[i].InstallationPath)) - if err != nil { - continue - } - pluginsCmd.AddCommand(cli.TestCmd(standalonePlugins[i].DeepCopy())) - } - - if err := p.Execute(); err != nil { - log.Fatal(err) - } -} - -var pluginsCmd = &cobra.Command{ - Use: "plugin", - Short: "Plugin tests", -} - -var fetchCmd = &cobra.Command{ - Use: "fetch", - Short: "Fetch the plugin tests", - RunE: func(cmd *cobra.Command, args []string) error { - return pluginmanager.InstallPluginsFromLocalSource("all", "", "", local, true) - }, -} diff --git a/cmd/cli/plugin-admin/test/test/main.go b/cmd/cli/plugin-admin/test/test/main.go deleted file mode 100644 index 9c5d410843..0000000000 --- a/cmd/cli/plugin-admin/test/test/main.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("test") - -func main() { - defer Cleanup() - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) //nolint:gocritic - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} - -// Cleanup the test. -func Cleanup() {} diff --git a/cmd/cli/plugin/cluster/Makefile b/cmd/cli/plugin/cluster/Makefile deleted file mode 100644 index 2efbf3e3c6..0000000000 --- a/cmd/cli/plugin/cluster/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -ROOT_DIR := $(shell git rev-parse --show-toplevel) -MODULE_ROOT_DIR := $(ROOT_DIR)/tkg - -# Golang specific variables -GOOS ?= $(shell go env GOOS) -GOARCH ?= $(shell go env GOARCH) -GOHOSTOS ?= $(shell go env GOHOSTOS) -GOHOSTARCH ?= $(shell go env GOHOSTARCH) -# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) -ifeq (,$(shell go env GOBIN)) -GOBIN=$(shell go env GOPATH)/bin -else -GOBIN=$(shell go env GOBIN) -endif -GO := go - -# Directories -TOOLS_DIR := $(abspath $(MODULE_ROOT_DIR)/hack/tools) -TOOLS_BIN_DIR := $(TOOLS_DIR)/bin - -# Add tooling binaries here and in hack/tools/Makefile -GOIMPORTS := $(TOOLS_BIN_DIR)/goimports -TOOLING_BINARIES := $(GOIMPORTS) - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help (default) - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-28s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m\033[32m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -## -------------------------------------- -## All -## -------------------------------------- - -.PHONY: all -all: test ## Tests the library - -## -------------------------------------- -## Testing -## -------------------------------------- - -.PHONY: test -test: fmt vet ## Run Tests - ${GO} test -timeout 60m -coverprofile coverage.txt -v `go list ./...` - -.PHONY: vet -vet: ## Vet codebase - ${GO} vet ./... - -fmt: $(GOIMPORTS) ## Run goimports - $(GOIMPORTS) -w -local github.com/vmware-tanzu ./ - -## -------------------------------------- -## Tooling Binaries -## -------------------------------------- - -tools: $(TOOLING_BINARIES) ## Build tooling binaries -.PHONY: $(TOOLING_BINARIES) -$(TOOLING_BINARIES): - make -C $(TOOLS_DIR) $(@F) - diff --git a/cmd/cli/plugin/cluster/README.md b/cmd/cli/plugin/cluster/README.md deleted file mode 100644 index d7c37b49c7..0000000000 --- a/cmd/cli/plugin/cluster/README.md +++ /dev/null @@ -1,198 +0,0 @@ -# Cluster - -Manage cluster lifecycle operations. - -## Usage - -```sh ->>> tanzu cluster create --help -Create a cluster - -Usage: - tanzu cluster create CLUSTER_NAME [flags] - -Flags: - -d, --dry-run Does not create cluster but show the deployment YAML instead - -f, --file string Cluster configuration file from which to create a Cluster - -h, --help help for create - --tkr string TanzuKubernetesRelease(TKr) to be used for creating the workload cluster -``` - -```sh ->>> tanzu cluster list --help -List clusters - -Usage: - tanzu cluster list [flags] - -Flags: - -h, --help help for list - --include-management-cluster Show active management cluster information as well - -n, --namespace string The namespace from which to list workload clusters. If not provided clusters from all namespaces will be returned - -o, --output string Output format. Supported formats: json|yaml -``` - -```sh ->>> tanzu cluster delete --help -Delete a cluster - -Usage: - tanzu cluster delete CLUSTER_NAME [flags] - -Flags: - -h, --help help for delete - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified. - -y, --yes Delete workload cluster without asking for confirmation -``` - -```sh ->>> tanzu cluster scale --help -Scale a cluster - -Usage: - tanzu cluster scale CLUSTER_NAME [flags] - -Flags: - -c, --controlplane-machine-count int32 The number of control plane nodes to scale to. Assumes unchanged if not specified - -h, --help help for scale - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified. - -w, --worker-machine-count int32 The number of worker nodes to scale to. Assumes unchanged if not specified -``` - -```sh ->>> tanzu cluster upgrade --help -Upgrade a cluster - -Usage: - tanzu cluster upgrade CLUSTER_NAME [flags] - -Flags: - -h, --help help for upgrade - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - --tkr string TanzuKubernetesRelease(TKr) to upgrade to - -y, --yes Upgrade workload cluster without asking for confirmation -``` - -```sh ->>> tanzu cluster machinehealthcheck --help -Get,set, or delete a MachineHealthCheck object for a Tanzu Kubernetes cluster - -Usage: - tanzu cluster machinehealthcheck [command] - -Available Commands: - delete Delete machinehealthcheck of a cluster - get Get MachineHealthCheck object - set Create or update a MachineHealthCheck for a cluster -``` - -```sh ->>> tanzu cluster machinehealthcheck get --help -Get a MachineHealthCheck object for the given cluster - -Usage: - tanzu cluster machinehealthcheck get CLUSTER_NAME [flags] - -Flags: - -h, --help help for get - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string The namespace where the MachineHealthCheck object was created. -``` - -```sh ->>> tanzu cluster machinehealthcheck set --help -Create or update a MachineHealthCheck object for a cluster - -Usage: - tanzu cluster machinehealthcheck set CLUSTER_NAME [flags] - -Flags: - -h, --help help for set - --match-labels string Label selector to match machines whose health will be exercised - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string Namespace of the cluster - --node-startup-timeout string Any machine being created that takes longer than this duration to join the cluster is considered to have failed and will be remediated - --unhealthy-conditions string A list of the conditions that determine whether a node is considered unhealthy. Available condition types: [Ready, MemoryPressure,DiskPressure,PIDPressure, NetworkUnavailable], Available condition status: [True, False, Unknown]heck object was created. -``` - -```sh ->>> tanzu cluster machinehealthcheck delete --help -Delete a MachineHealthCheck object for the given cluster - -Usage: - tanzu cluster machinehealthcheck delete CLUSTER_NAME [flags] - -Flags: - -h, --help help for delete - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string The namespace where the MachineHealthCheck object was created, default to the cluster's namespace - -y, --yes Delete the MachineHealthCheck object without asking for confirmation -``` - -```sh ->>> tanzu cluster credentials -Update credentials for a cluster - -Usage: - tanzu cluster credentials [command] - -Available Commands: - update Update credentials for a cluster - -Flags: - -h, --help help for credentials - -Use "cluster credentials [command] --help" for more information about a command. -``` - -```sh ->>> tanzu cluster credentials update --help -Update credentials for a cluster - -Usage: - tanzu cluster credentials update CLUSTER_NAME [flags] - -Flags: - -h, --help help for update - -n, --namespace string The namespace of cluster whose credentials have to be updated - --vsphere-password string Password for vSphere provider - --vsphere-user string Username for vSphere provider -``` - -```sh ->>> tanzu cluster get --help -Getting clusters details - -Usage: - tanzu cluster get CLUSTER_NAME [flags] - -Flags: - -h, --help help for get - -n, --namespace string The namespace from which to get workload clusters. If not provided clusters from all namespaces will be returned - --show-all-conditions string List of comma separated kind or kind/name for which we should show all the object's conditions (all to show conditions for all the objects) - --show-details Show details of MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object - --show-group-members Expand machine groups whose ready condition has the same Status, Severity and Reason -``` - -```sh ->>> tanzu cluster kubeconfig get --help -Get kubeconfig of a cluster and merge the context into the default kubeconfig file - -Usage: - tanzu cluster kubeconfig get CLUSTER_NAME [flags] - -Examples: - - # Get workload cluster kubeconfig - tanzu cluster kubeconfig get CLUSTER_NAME - - # Get workload cluster admin kubeconfig - tanzu cluster kubeconfig get CLUSTER_NAME --admin - -Flags: - --admin Get admin kubeconfig of the workload cluster - --export-file string File path to export a standalone kubeconfig for workload cluster - -h, --help help for get - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified. -``` diff --git a/cmd/cli/plugin/cluster/available_upgrade.go b/cmd/cli/plugin/cluster/available_upgrade.go deleted file mode 100644 index e5d89dc6da..0000000000 --- a/cmd/cli/plugin/cluster/available_upgrade.go +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - "io" - "time" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - capiv1 "sigs.k8s.io/cluster-api/api/v1beta1" - capiconditions "sigs.k8s.io/cluster-api/util/conditions" - - utilclusters "github.com/vmware-tanzu/tanzu-framework/apis/run/util/clusters" - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - tkrutils "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -var availableUpgradesCmd = &cobra.Command{ - Use: "available-upgrades", - Short: "Get upgrade information for a cluster", - Long: `Get upgrade information for a cluster`, - Aliases: []string{"avup"}, - SilenceUsage: true, -} - -var getAvailableUpgradesCmd = &cobra.Command{ - Use: "get CLUSTER_NAME", - Short: "Get all available upgrades for a cluster", - Long: `Get all available upgrades for a cluster`, - Args: cobra.ExactArgs(1), - RunE: availableUpgrades, - SilenceUsage: true, -} - -type availableUpgradeOptions struct { - namespace string -} - -var au = &availableUpgradeOptions{} - -func init() { - getAvailableUpgradesCmd.Flags().StringVarP(&au.namespace, "namespace", "n", "default", "The namespace where the workload cluster was created. Assumes 'default' if not specified") - availableUpgradesCmd.AddCommand(getAvailableUpgradesCmd) -} - -func availableUpgrades(cmd *cobra.Command, args []string) error { //nolint:gocyclo - server, err := config.GetCurrentServer() - if err != nil { - return err - } - if server.IsGlobal() { - return errors.New("getting available upgrades with a global server is not implemented yet") - } - clusterClientOptions := clusterclient.Options{GetClientInterval: 2 * time.Second, GetClientTimeout: 5 * time.Second} - clusterClient, err := clusterclient.NewClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context, clusterClientOptions) - if err != nil { - return err - } - - clusterName := args[0] - tkrs, err := clusterClient.GetTanzuKubernetesReleases("") - if err != nil { - return err - } - - // TODO: update this condition after CLI fully support the package based cc. - // Since CLI should support the pre package-based-cc where the updatesAvailable condition was part of - // TKRs, code checking the TKRs for available upgrade should remain. - cluster, err := getClusterResource(clusterClient, clusterName, au.namespace) - if err == nil && capiconditions.Has(cluster, runv1.ConditionUpdatesAvailable) { - return availableUpgradesFromCluster(cluster, tkrs, cmd.OutOrStdout()) - } - - clusterTKRName, err := getClusterTKRName(server, clusterName, au.namespace) - if err != nil { - return err - } - - var upgradeTKrs []string - for i := range tkrs { - if tkrs[i].Name == clusterTKRName { - upgradeTKrs, err = tkrutils.GetAvailableUpgrades(clusterName, au.namespace, &tkrs[i]) - if err != nil { - if _, ok := err.(tkrutils.UpgradesNotAvailableError); ok { - fmt.Printf("%v\n", err) - return nil - } - return err - } - } - } - - candidates := make(map[string]bool) - for _, name := range upgradeTKrs { - candidates[name] = true - } - - t := component.NewOutputWriter(cmd.OutOrStdout(), "table", "NAME", "VERSION", "COMPATIBLE") - for i := range tkrs { - if _, ok := candidates[tkrs[i].Name]; !ok { - continue - } - if !tkrutils.IsTkrActive(&tkrs[i]) { - continue - } - compatible := "False" - if tkrutils.IsTkrCompatible(&tkrs[i]) { - compatible = "True" - } - t.AddRow(tkrs[i].Name, tkrs[i].Spec.Version, compatible) - } - t.Render() - - return nil -} - -func getClusterTKRNameFromClusterInfo(clusterName string, clustersInfo []client.ClusterInfo) (string, error) { - for idx := range clustersInfo { - if clustersInfo[idx].Name == clusterName && clustersInfo[idx].Labels != nil { - clusterTKr, err := getClusterTKRNameFromClusterLabels(clustersInfo[idx].Labels) - if err != nil { - return "", errors.Wrap(err, "failed to get cluster's current TKr name") - } - return clusterTKr, nil - } - } - return "", errors.New("failed to get cluster's current TKr name") -} - -func getClusterTKRName(server *configapi.Server, clusterName, namespace string) (string, error) { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return "", errors.Wrap(err, "failed to create TKG client") - } - - ccOptions := tkgctl.ListTKGClustersOptions{ - ClusterName: "", - Namespace: namespace, - IncludeMC: false, - } - clustersInfo, err := tkgctlClient.GetClusters(ccOptions) - if err != nil { - return "", errors.Wrap(err, "failed to get clusters Information") - } - clusterTkrVersion, err := getClusterTKRNameFromClusterInfo(clusterName, clustersInfo) - if err != nil { - return "", errors.Wrap(err, "failed to get cluster TKr name from clusters Information") - } - return clusterTkrVersion, nil -} - -func availableUpgradesFromCluster(cluster *capiv1.Cluster, tkrs []runv1alpha1.TanzuKubernetesRelease, cmdOut io.Writer) error { - updates := utilclusters.AvailableUpgrades(cluster) - if len(updates) == 0 { - fmt.Printf("no available upgrades for cluster '%s', namespace '%s'", cluster.Name, cluster.Namespace) - return nil - } - - t := component.NewOutputWriter(cmdOut, "table", "NAME", "VERSION", "COMPATIBLE") - for i := range tkrs { - if _, ok := updates[tkrs[i].Spec.Version]; !ok { - continue - } - t.AddRow(tkrs[i].Name, tkrs[i].Spec.Version, "True") - } - t.Render() - return nil -} diff --git a/cmd/cli/plugin/cluster/available_upgrade_test.go b/cmd/cli/plugin/cluster/available_upgrade_test.go deleted file mode 100644 index 40d8cae328..0000000000 --- a/cmd/cli/plugin/cluster/available_upgrade_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "bytes" - "fmt" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" -) - -var _ = Describe("availableUpgradesFromCluster", func() { - var ( - tkrs []runv1alpha1.TanzuKubernetesRelease - cluster *clusterv1.Cluster - err error - writer bytes.Buffer - ) - JustBeforeEach(func() { - err = availableUpgradesFromCluster(cluster, tkrs, &writer) - }) - - Context("When cluster doesn't have available upgrades", func() { - BeforeEach(func() { - //availableUpdates := fmt.Sprintf("[%s %s %s]", "v1.18.18+vmware.1-tkg.2", "v1.18.8+vmware.1-tkg.1", "v1.18.14+vmware.1-tkg.1-rc.1") - cluster = getFakeCluster("fake-cluster", "") - - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(writer.String()).To(BeEmpty()) - }) - }) - Context("When cluster have available upgrades", func() { - BeforeEach(func() { - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18+vmware.1", corev1.ConditionTrue, "") - tkr2 := getFakeTKR("v1.18.8---vmware.1-tkg.1", "v1.18.8+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.17---vmware.2-tkg.1", "v1.18.17+vmware.2", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.14+vmware.1", corev1.ConditionTrue, "") - tkr5 := getFakeTKR("v1.18.18---vmware.1-tkg.2", "v1.18.18+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - - availableUpdates := fmt.Sprintf("[%s %s %s]", "v1.18.18+vmware.1-tkg.2", "v1.18.17+vmware.2-tkg.1", "v1.18.14+vmware.1-tkg.1-rc.1") - cluster = getFakeCluster("fake-cluster", availableUpdates) - - }) - It("should show the TKRs versions that are part of 'updatesAvailable' condition message value list ", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(writer.String()).To(ContainSubstring("v1.18.18+vmware.1-tkg.2")) - Expect(writer.String()).To(ContainSubstring("1.18.17+vmware.2-tkg.1")) - Expect(writer.String()).To(ContainSubstring("v1.18.14+vmware.1-tkg.1-rc.1")) - Expect(writer.String()).ToNot(ContainSubstring("v1.18.8+vmware.1-tkg.1")) - - }) - }) - -}) diff --git a/cmd/cli/plugin/cluster/create.go b/cmd/cli/plugin/cluster/create.go deleted file mode 100644 index 15e30c9b60..0000000000 --- a/cmd/cli/plugin/cluster/create.go +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - "reflect" - "sort" - "time" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - tkr "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/controllers/source" - tkrutils "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -// Note: We can remove all this additional options at the time when -// we decide we really want to use `--file` option to create cluster -// and we don't have to support all these flags with create cluster command -type createClusterOptions struct { - plan string - infrastructureProvider string - namespace string - size string - controlPlaneSize string - workerSize string - cniType string - enableClusterOptions string - vsphereControlPlaneEndpoint string - clusterConfigFile string - tkrName string - controlPlaneMachineCount int - workerMachineCount int - timeout time.Duration - generateOnly bool - unattended bool -} - -var cc = &createClusterOptions{} - -var createClusterCmd = &cobra.Command{ - Use: "create CLUSTER_NAME", - Short: "Create a cluster", - RunE: create, - SilenceUsage: true, -} - -func init() { - createClusterCmd.Flags().StringVarP(&cc.clusterConfigFile, "file", "f", "", "Configuration file or Cluster objects from which to create a cluster") - createClusterCmd.Flags().StringVarP(&cc.tkrName, "tkr", "", "", "TanzuKubernetesRelease(TKr) to be used for creating the workload cluster. If TKr name prefix is provided, the latest compatible TKr matching the TKr name prefix would be used") - - createClusterCmd.Flags().StringVarP(&cc.plan, "plan", "p", "", "The plan to be used for creating the workload cluster") - createClusterCmd.Flags().IntVarP(&cc.controlPlaneMachineCount, "controlplane-machine-count", "c", 0, "The number of control plane machines to be added to the workload cluster (default 1 or 3 depending on dev or prod plan)") - createClusterCmd.Flags().IntVarP(&cc.workerMachineCount, "worker-machine-count", "w", 0, "The number of worker machines to be added to the workload cluster (default 1 or 3 depending on dev or prod plan)") - createClusterCmd.Flags().BoolVarP(&cc.generateOnly, "dry-run", "d", false, "Does not create cluster, but show the deployment YAML instead") - createClusterCmd.Flags().StringVarP(&cc.namespace, "namespace", "n", "", "The namespace where the cluster should be deployed. Assumes 'default' if not specified") - createClusterCmd.Flags().StringVarP(&cc.vsphereControlPlaneEndpoint, "vsphere-controlplane-endpoint", "", "", "Virtual IP address or FQDN for the cluster's control plane nodes") - createClusterCmd.Flags().DurationVarP(&cc.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") - createClusterCmd.Flags().StringVarP(&cc.cniType, "cni", "", "", "Specify the CNI provider the workload cluster should use ['antrea' (default), 'calico', 'none'].") - createClusterCmd.Flags().StringVarP(&cc.size, "size", "", "", "Specify size for all nodes including control plane and worker nodes. It can be overridden by --controlplane-size and --worker-size options. (See [+])") - createClusterCmd.Flags().StringVarP(&cc.controlPlaneSize, "controlplane-size", "", "", "Specify size for the control plane node. (See [+])") - createClusterCmd.Flags().StringVarP(&cc.workerSize, "worker-size", "", "", "Specify size of the worker node. (See [+])") - createClusterCmd.Flags().BoolVarP(&cc.unattended, "yes", "y", false, "Create workload cluster without asking for confirmation") - createClusterCmd.Flags().StringVarP(&cc.enableClusterOptions, "enable-cluster-options", "", "", "List of comma separated cluster options to be enabled") - createClusterCmd.Flags().StringVarP(&cc.infrastructureProvider, "infrastructure", "i", "", "The target infrastructure on which to deploy the workload cluster.") - - // Hide some of the variables not relevant to tanzu cli at the moment - createClusterCmd.Flags().MarkHidden("plan") //nolint - createClusterCmd.Flags().MarkHidden("controlplane-machine-count") //nolint - createClusterCmd.Flags().MarkHidden("worker-machine-count") //nolint - createClusterCmd.Flags().MarkHidden("namespace") //nolint - createClusterCmd.Flags().MarkHidden("vsphere-controlplane-endpoint") //nolint - createClusterCmd.Flags().MarkHidden("timeout") //nolint - createClusterCmd.Flags().MarkHidden("cni") //nolint - createClusterCmd.Flags().MarkHidden("size") //nolint - createClusterCmd.Flags().MarkHidden("controlplane-size") //nolint - createClusterCmd.Flags().MarkHidden("worker-size") //nolint - createClusterCmd.Flags().MarkHidden("yes") //nolint - createClusterCmd.Flags().MarkHidden("enable-cluster-options") //nolint - createClusterCmd.Flags().MarkHidden("infrastructure") //nolint // Usually not needed as they are implied from configuration of the management cluster. - - createClusterCmd.Flags().SetNormalizeFunc(aliasNormalizeFunc) -} - -func aliasNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName { - if name == "vsphere-controlplane-endpoint-ip" { - name = "vsphere-controlplane-endpoint" - } - return pflag.NormalizedName(name) -} - -func create(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - // if current server does not exist and user is using generate only - // option then allow user to proceed by providing dummy management server - // information. - // Note: This is only used for testing purpose when management cluster - // does not exist and we want to test cluster template generation - if cc.generateOnly { - server = &configapi.Server{ - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{}, - } - } else { - return err - } - } - clusterName := "" - if len(args) > 0 { - clusterName = args[0] - } - - if server.IsGlobal() { - return errors.New("creating cluster with a global server is not implemented yet") - } - return createCluster(clusterName, server) -} - -func createCluster(clusterName string, server *configapi.Server) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - tkrVersion := "" - if cc.tkrName != "" { - clusterClientOptions := clusterclient.Options{GetClientInterval: 2 * time.Second, GetClientTimeout: 5 * time.Second} - clusterClient, err := clusterclient.NewClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context, clusterClientOptions) - if err != nil { - return err - } - - tkrVersion, err = getTkrVersionForMatchingTkr(clusterClient, cc.tkrName) - if err != nil { - return err - } - } - - edition, err := config.GetEdition() - if err != nil { - return err - } - - ccOptions := tkgctl.CreateClusterOptions{ - ClusterConfigFile: cc.clusterConfigFile, - TkrVersion: tkrVersion, - ClusterName: clusterName, - Namespace: cc.namespace, - Plan: cc.plan, - InfrastructureProvider: cc.infrastructureProvider, - ControlPlaneMachineCount: cc.controlPlaneMachineCount, - WorkerMachineCount: cc.workerMachineCount, - GenerateOnly: cc.generateOnly, - Size: cc.size, - ControlPlaneSize: cc.controlPlaneSize, - WorkerSize: cc.workerSize, - CniType: cc.cniType, - EnableClusterOptions: cc.enableClusterOptions, - VsphereControlPlaneEndpoint: cc.vsphereControlPlaneEndpoint, - SkipPrompt: cc.unattended, - Timeout: cc.timeout, - Edition: edition, - } - - return tkgctlClient.CreateCluster(ccOptions) -} - -func getTkrVersionForMatchingTkr(clusterClient clusterclient.Client, tkrName string) (string, error) { - // get all the TKRs with tkrName prefix matching - tkrs, err := clusterClient.GetTanzuKubernetesReleases(tkrName) - if err != nil { - return "", err - } - - if len(tkrs) == 0 { - return "", errors.Errorf("could not find a matching Tanzu Kubernetes release for name %q", tkrName) - } - - tkrForCreate, err := getMatchingTkrForTkrName(tkrs, tkrName) - // If the complete TKR name is provided, use it - if err == nil { - if !tkrutils.IsTkrActive(&tkrForCreate) { - return "", errors.Errorf("the Tanzu Kubernetes release %q is deactivated and cannot be used", tkrName) - } - if !tkrutils.IsTkrCompatible(&tkrForCreate) { - fmt.Printf("WARNING: Tanzu Kubernetes release %q is not compatible on the management cluster\n", tkrForCreate.Name) - } - if tkrForCreate.Spec.Version == "" { - return "", errors.Errorf("could not find a matching Tanzu Kubernetes release for name %q", tkrName) - } - return tkrForCreate.Spec.Version, nil - } - - return getLatestTKRVersionMatchingTKRPrefix(tkrName, tkrs) -} - -// getLatestTKRVersionMatchingTKRPrefix returns the latest compatible TKR from the prefix name matched TKRs -func getLatestTKRVersionMatchingTKRPrefix(tkrName string, tkrsWithPrefixMatch []runv1alpha1.TanzuKubernetesRelease) (string, error) { - compatibleTKRs := []runv1alpha1.TanzuKubernetesRelease{} - for idx := range tkrsWithPrefixMatch { - if !tkrutils.IsTkrCompatible(&tkrsWithPrefixMatch[idx]) || !tkrutils.IsTkrActive(&tkrsWithPrefixMatch[idx]) { - continue - } - compatibleTKRs = append(compatibleTKRs, tkrsWithPrefixMatch[idx]) - } - - if len(compatibleTKRs) == 0 { - return "", errors.Errorf("could not find a matching compatible Tanzu Kubernetes release for name %q", tkrName) - } - - return getLatestTkrVersion(compatibleTKRs) -} - -// getLatestTkrVersion returns the latest TKR version from the TKRs list -func getLatestTkrVersion(tkrs []runv1alpha1.TanzuKubernetesRelease) (string, error) { - sort.SliceStable(tkrs, func(i, j int) bool { - tkri, err := tkr.NewTKRVersion(tkrs[i].Name) - if err != nil { - return true - } - tkrj, err := tkr.NewTKRVersion(tkrs[j].Name) - if err != nil { - return true - } - if tkri.Major != tkrj.Major { - return tkri.Major < tkrj.Major - } - if tkri.Minor != tkrj.Minor { - return tkri.Minor < tkrj.Minor - } - if tkri.Patch != tkrj.Patch { - return tkri.Patch < tkrj.Patch - } - if tkri.VMware != tkrj.VMware { - return tkri.VMware < tkrj.VMware - } - return tkri.TKG < tkrj.TKG - }) - - latestTKRs := []runv1alpha1.TanzuKubernetesRelease{} - latestTKRsNames := []string{} - - latestTKRs = append(latestTKRs, tkrs[len(tkrs)-1]) - latestTKRVersion, _ := tkr.NewTKRVersion(latestTKRs[0].Name) - latestTKRsNames = append(latestTKRsNames, latestTKRs[0].Name) - - for i := len(tkrs) - 2; i >= 0; i-- { - currentTKRVerison, _ := tkr.NewTKRVersion(tkrs[i].Name) - if reflect.DeepEqual(latestTKRVersion, currentTKRVerison) { - latestTKRs = append(latestTKRs, tkrs[i]) - latestTKRsNames = append(latestTKRsNames, tkrs[i].Name) - } - } - - if len(latestTKRs) > 1 { - return "", errors.Errorf("found multiple TKrs %v matching the criteria, please specify the TKr name you want to use", latestTKRsNames) - } - - log.V(4).Infof("Using the TKr version '%s' from TKr name '%s' ", latestTKRs[0].Spec.Version, latestTKRs[0].Name) - return latestTKRs[0].Spec.Version, nil -} diff --git a/cmd/cli/plugin/cluster/create_test.go b/cmd/cli/plugin/cluster/create_test.go deleted file mode 100644 index 8f77cecfcb..0000000000 --- a/cmd/cli/plugin/cluster/create_test.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "strings" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" -) - -func TestAPIs(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "create cluster test") -} - -var _ = Describe("getLatestTKRVersionMatchingTKRPrefix", func() { - var ( - tkrsWithPrefixMatch []runv1alpha1.TanzuKubernetesRelease - tkrNamePrefix string - latestTKRVersion string - err error - ) - const ( - TkrVersionPrefix_v1_17 = "v1.17" //nolint - ) - - JustBeforeEach(func() { - latestTKRVersion, err = getLatestTKRVersionMatchingTKRPrefix(tkrNamePrefix, tkrsWithPrefixMatch) - }) - - Context("When the list of prefix matched TKRs has highest version TKR as incompatible", func() { - BeforeEach(func() { - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18+vmware.1", corev1.ConditionFalse, "") - tkr2 := getFakeTKR("v1.17.8---vmware.1-tkg.1", "v1.17.8+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.17.17---vmware.2-tkg.1", "v1.17.17---vmware.2", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.17.14---vmware.1-tkg.1-rc.1", "v1.17.14---vmware.1", corev1.ConditionTrue, "") - tkr5 := getFakeTKR("v1.17.17---vmware.1-tkg.2", "v1.17.17---vmware.1", corev1.ConditionTrue, "") - - tkrsWithPrefixMatch = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - tkrNamePrefix = TkrVersionPrefix_v1_17 - }) - It("should return the next latest TKR version that is compatible", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal("v1.17.17+vmware.2-tkg.1")) - }) - }) - Context("When the list of prefix matched TKRs has multiple latest TKRs", func() { - BeforeEach(func() { - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18---vmware.1", corev1.ConditionTrue, "") - tkr2 := getFakeTKR("v1.17.18---vmware.2-tkg.1-rc.1", "v1.17.18---vmware.2-tkg.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.17.15---vmware.1-tkg.1", "v1.17.15---vmware.1", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.17.18---vmware.2-tkg.1-zlatest1", "1.17.18---vmware.2-tkg.1", corev1.ConditionTrue, "") - tkrsWithPrefixMatch = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr2, tkr3, tkr4} - tkrNamePrefix = TkrVersionPrefix_v1_17 - }) - It("should return error ", func() { - Expect(err).To(HaveOccurred()) - errString := "found multiple TKrs [v1.17.18---vmware.2-tkg.1-zlatest1 v1.17.18---vmware.2-tkg.1-rc.1] matching the criteria" - Expect(err.Error()).To(ContainSubstring(errString)) - }) - }) - Context("When the list of prefix matched TKRs has no compatible TKRs", func() { - BeforeEach(func() { - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18---vmware.1", corev1.ConditionFalse, "") - tkr2 := getFakeTKR("v1.17.8---vmware.1-tkg.1", "v1.17.8---vmware.1", corev1.ConditionFalse, "") - tkr3 := getFakeTKR("v1.17.17---vmware.2-tkg.1", "v1.17.17---vmware.2", corev1.ConditionFalse, "") - tkrsWithPrefixMatch = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr3, tkr2} - tkrNamePrefix = TkrVersionPrefix_v1_17 - }) - It("should return error as there is no single compatible TKR", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("could not find a matching compatible Tanzu Kubernetes release for name \"v1.17\"")) - }) - }) -}) - -func getFakeTKR(tkrName, k8sversion string, compatibleStatus corev1.ConditionStatus, updatesAvailableMsg string) runv1alpha1.TanzuKubernetesRelease { - tkr := runv1alpha1.TanzuKubernetesRelease{} - tkr.Name = tkrName - tkr.Spec.Version = strings.ReplaceAll(tkrName, "---", "+") - tkr.Spec.KubernetesVersion = k8sversion - tkr.Status.Conditions = []clusterv1.Condition{ - { - Type: clusterv1.ConditionType(runv1alpha1.ConditionCompatible), - Status: compatibleStatus, - }, - { - Type: clusterv1.ConditionType(runv1alpha1.ConditionUpgradeAvailable), - Status: corev1.ConditionTrue, - Message: updatesAvailableMsg, - }, - } - return tkr -} diff --git a/cmd/cli/plugin/cluster/credentials.go b/cmd/cli/plugin/cluster/credentials.go deleted file mode 100644 index 70362c6566..0000000000 --- a/cmd/cli/plugin/cluster/credentials.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import "github.com/spf13/cobra" - -var credentialsCmd = &cobra.Command{ - Use: "credentials", - Short: "Cluster credentials operations", - SilenceUsage: true, -} diff --git a/cmd/cli/plugin/cluster/credentials_update.go b/cmd/cli/plugin/cluster/credentials_update.go deleted file mode 100644 index f37c31e151..0000000000 --- a/cmd/cli/plugin/cluster/credentials_update.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "errors" - "fmt" - - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type updateCredentialsOptions struct { - namespace string - vSphereUser string - vSpherePassword string - azureTenantID string - azureClientID string - azureClientSecret string -} - -var updateCredentialsOpts = updateCredentialsOptions{} - -var credentialsUpdateCmd = &cobra.Command{ - Use: "update CLUSTER_NAME", - Short: "Update credentials for a cluster", - Args: cobra.ExactArgs(1), - RunE: updateCredentials, - SilenceUsage: true, -} - -const ( - vsphereProvider = "vsphere" - azureProvider = "azure" -) - -func init() { - credentialsUpdateCmd.Flags().StringVarP(&updateCredentialsOpts.namespace, "namespace", "n", "", "The namespace of the cluster to be updated") - credentialsUpdateCmd.Flags().StringVarP(&updateCredentialsOpts.vSphereUser, "vsphere-user", "", "", "Username for vSphere provider") - credentialsUpdateCmd.Flags().StringVarP(&updateCredentialsOpts.vSpherePassword, "vsphere-password", "", "", "Password for vSphere provider") - credentialsUpdateCmd.Flags().StringVarP(&updateCredentialsOpts.azureTenantID, "azure-tenant-id", "", "", "ID for Azure Active Directory in which the app for Tanzu Kubernetes Grid is created") - credentialsUpdateCmd.Flags().StringVarP(&updateCredentialsOpts.azureClientID, "azure-client-id", "", "", "Client ID of the app for Tanzu Kubernetes Grid that you registered with Azure") - credentialsUpdateCmd.Flags().StringVarP(&updateCredentialsOpts.azureClientSecret, "azure-client-secret", "", "", "Client Secret of the app for Tanzu Kubernetes Grid that you registered with Azure") - - credentialsCmd.AddCommand(credentialsUpdateCmd) -} - -func updateCredentials(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("creating cluster with a global server is not implemented yet") - } - return updateClusterCredentials(args[0], server) -} - -func updateClusterCredentials(clusterName string, server *configapi.Server) error { - var promptOpts []component.PromptOpt - - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - if updateCredentialsOpts.namespace == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: "Enter namespace of the cluster", - Default: "default", - }, - &updateCredentialsOpts.namespace, - promptOpts..., - ) - if err != nil { - return err - } - } - - provider := "" - - if updateCredentialsOpts.vSphereUser != "" { - provider = vsphereProvider - } else if updateCredentialsOpts.azureClientID != "" { - provider = azureProvider - } else { - err := component.Prompt( - &component.PromptConfig{ - Message: fmt.Sprintf("Specify provider %q or %q", vsphereProvider, azureProvider), - Default: "vsphere", - }, - &provider, - promptOpts..., - ) - if err != nil { - return err - } - } - - if provider == vsphereProvider { - vsphereVariables := [2]*string{&updateCredentialsOpts.vSphereUser, &updateCredentialsOpts.vSpherePassword} - vsphereMessages := [2]string{"Enter vSphere username", "Enter vSphere password"} - vsphereSensitive := [2]bool{false, true} - for i := 0; i < 2; i++ { - if *vsphereVariables[i] == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: vsphereMessages[i], - Sensitive: vsphereSensitive[i], - }, - vsphereVariables[i], - promptOpts..., - ) - if err != nil { - return err - } - } - } - } else if provider == azureProvider { - azureVariables := [3]*string{&updateCredentialsOpts.azureTenantID, &updateCredentialsOpts.azureClientID, &updateCredentialsOpts.azureClientSecret} - azureMessages := [3]string{"Enter azure tenant id", "Enter azure client id", "Enter azure client secret"} - isSensitive := [3]bool{false, false, true} - for i := 0; i < 3; i++ { - if *azureVariables[i] == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: azureMessages[i], - Sensitive: isSensitive[i], - }, - azureVariables[i], - promptOpts..., - ) - if err != nil { - return err - } - } - } - } else { - return errors.New("please specify supported provider name: vsphere or azure") - } - - uccOptions := tkgctl.UpdateCredentialsClusterOptions{ - ClusterName: clusterName, - Namespace: updateCredentialsOpts.namespace, - VSphereUsername: updateCredentialsOpts.vSphereUser, - VSpherePassword: updateCredentialsOpts.vSpherePassword, - AzureTenantID: updateCredentialsOpts.azureTenantID, - AzureClientID: updateCredentialsOpts.azureClientID, - AzureClientSecret: updateCredentialsOpts.azureClientSecret, - } - - return tkgctlClient.UpdateCredentialsCluster(uccOptions) -} diff --git a/cmd/cli/plugin/cluster/delete.go b/cmd/cli/plugin/cluster/delete.go deleted file mode 100644 index c5b6c4e6a0..0000000000 --- a/cmd/cli/plugin/cluster/delete.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "errors" - - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type deleteClustersOptions struct { - namespace string - unattended bool -} - -var dc = &deleteClustersOptions{} - -var deleteClusterCmd = &cobra.Command{ - Use: "delete CLUSTER_NAME", - Short: "Delete a cluster", - Args: cobra.ExactArgs(1), - RunE: deleteCmd, - SilenceUsage: true, -} - -func init() { - deleteClusterCmd.Flags().StringVarP(&dc.namespace, "namespace", "n", "", "The namespace where the workload cluster was created. Assumes 'default' if not specified.") - deleteClusterCmd.Flags().BoolVarP(&dc.unattended, "yes", "y", false, "Delete workload cluster without asking for confirmation") -} - -func deleteCmd(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("deleting cluster with a global server is not implemented yet") - } - return deleteCluster(server, args[0]) -} - -func deleteCluster(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - deleteClusterOptions := tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: dc.namespace, - SkipPrompt: dc.unattended, - } - - return tkgctlClient.DeleteCluster(deleteClusterOptions) -} diff --git a/cmd/cli/plugin/cluster/delete_machinehealthcheck.go b/cmd/cli/plugin/cluster/delete_machinehealthcheck.go deleted file mode 100644 index 93c34ba33f..0000000000 --- a/cmd/cli/plugin/cluster/delete_machinehealthcheck.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/pkg/errors" - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type deleteMachineHealthCheckOptions struct { - machinehealthCheckName string - namespace string - unattended bool -} - -var deleteMHC = &deleteMachineHealthCheckOptions{} - -var deleteMachineHealthCheckCmd = &cobra.Command{ - Use: "delete CLUSTER_NAME", - Short: "Delete a MachineHealthCheck object of a cluster", - Long: "Delete a MachineHealthCheck object of a cluster", - Args: cobra.ExactArgs(1), - RunE: deleteMachineHealthCheck, - SilenceUsage: true, -} - -func init() { - deleteMachineHealthCheckCmd.Flags().BoolVarP(&deleteMHC.unattended, "yes", "y", false, "Delete the MachineHealthCheck object without asking for confirmation") - deleteMachineHealthCheckCmd.Flags().StringVarP(&deleteMHC.machinehealthCheckName, "mhc-name", "m", "", "Name of the MachineHealthCheck object") - deleteMachineHealthCheckCmd.Flags().StringVarP(&deleteMHC.namespace, "namespace", "n", "", "The namespace where the MachineHealthCheck object was created, default to the cluster's namespace") - machineHealthCheckCmd.AddCommand(deleteMachineHealthCheckCmd) -} - -func deleteMachineHealthCheck(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("deleting machine healthcheck with a global server is not implemented yet") - } - return runDeleteMachineHealthCheck(server, args[0]) -} - -func runDeleteMachineHealthCheck(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - options := tkgctl.DeleteMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: deleteMHC.namespace, - MachinehealthCheckName: deleteMHC.machinehealthCheckName, - SkipPrompt: deleteMHC.unattended, - } - return tkgctlClient.DeleteMachineHealthCheck(options) -} diff --git a/cmd/cli/plugin/cluster/delete_machinehealthcheck_control_plane.go b/cmd/cli/plugin/cluster/delete_machinehealthcheck_control_plane.go deleted file mode 100644 index 735e1390be..0000000000 --- a/cmd/cli/plugin/cluster/delete_machinehealthcheck_control_plane.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main // nolint:dupl - -import ( - "github.com/pkg/errors" - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type deleteMachineHealthCheckCPOptions struct { - machinehealthCheckName string - namespace string - unattended bool - matchLabel string -} - -var deleteMHCCP = &deleteMachineHealthCheckCPOptions{} - -var deleteMachineHealthCheckCPCmd = &cobra.Command{ - Use: "delete CLUSTER_NAME", - Short: "Delete a MachineHealthCheck object", - Long: "Delete a MachineHealthCheck object of the control plane of a cluster", - Args: cobra.ExactArgs(1), - RunE: deleteMachineHealthCheckCP, - SilenceUsage: true, -} - -func init() { - deleteMachineHealthCheckCPCmd.Flags().BoolVarP(&deleteMHCCP.unattended, "yes", "y", false, "Delete the MachineHealthCheck object without asking for confirmation") - deleteMachineHealthCheckCPCmd.Flags().StringVarP(&deleteMHCCP.machinehealthCheckName, "mhc-name", "m", "", "Name of the MachineHealthCheck object") - deleteMachineHealthCheckCPCmd.Flags().StringVarP(&deleteMHCCP.namespace, "namespace", "n", "", "The namespace where the MachineHealthCheck object was created, default to the cluster's namespace") - machineHealthCheckControlPlaneCmd.AddCommand(deleteMachineHealthCheckCPCmd) -} - -func deleteMachineHealthCheckCP(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("deleting machine healthcheck with a global server is not implemented yet") - } - return runDeleteMachineHealthCheckCP(server, args[0]) -} - -func runDeleteMachineHealthCheckCP(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - if deleteMHCCP.matchLabel == "" { - deleteMHCCP.matchLabel = controlPlaneLabel - } - - options := tkgctl.DeleteMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: deleteMHCCP.namespace, - MachinehealthCheckName: deleteMHCCP.machinehealthCheckName, - SkipPrompt: deleteMHCCP.unattended, - MatchLabel: deleteMHCCP.matchLabel, - } - return tkgctlClient.DeleteMachineHealthCheck(options) -} diff --git a/cmd/cli/plugin/cluster/delete_machinehealthcheck_node.go b/cmd/cli/plugin/cluster/delete_machinehealthcheck_node.go deleted file mode 100644 index b4499c534e..0000000000 --- a/cmd/cli/plugin/cluster/delete_machinehealthcheck_node.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main // nolint:dupl - -import ( - "github.com/pkg/errors" - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type deleteMachineHealthCheckNodeOptions struct { - machinehealthCheckName string - namespace string - unattended bool - matchLabel string -} - -var deleteMHCNode = &deleteMachineHealthCheckNodeOptions{} - -var deleteMachineHealthCheckNodeCmd = &cobra.Command{ - Use: "delete CLUSTER_NAME", - Short: "Delete a MachineHealthCheck object", - Long: "Delete a MachineHealthCheck object of the nodes of a cluster", - Args: cobra.ExactArgs(1), - RunE: deleteMachineHealthCheckNode, - SilenceUsage: true, -} - -func init() { - deleteMachineHealthCheckNodeCmd.Flags().BoolVarP(&deleteMHCNode.unattended, "yes", "y", false, "Delete the MachineHealthCheck object without asking for confirmation") - deleteMachineHealthCheckNodeCmd.Flags().StringVarP(&deleteMHCNode.machinehealthCheckName, "mhc-name", "m", "", "Name of the MachineHealthCheck object") - deleteMachineHealthCheckNodeCmd.Flags().StringVarP(&deleteMHCNode.namespace, "namespace", "n", "", "The namespace where the MachineHealthCheck object was created, default to the cluster's namespace") - machineHealthCheckNodeCmd.AddCommand(deleteMachineHealthCheckNodeCmd) -} - -func deleteMachineHealthCheckNode(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("deleting machine healthcheck with a global server is not implemented yet") - } - return runDeleteMachineHealthCheckNode(server, args[0]) -} - -func runDeleteMachineHealthCheckNode(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - if deleteMHCNode.matchLabel == "" { - deleteMHCNode.matchLabel = nodePoolLabel - } - - options := tkgctl.DeleteMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: deleteMHCNode.namespace, - MachinehealthCheckName: deleteMHCNode.machinehealthCheckName, - SkipPrompt: deleteMHCNode.unattended, - MatchLabel: deleteMHCNode.matchLabel, - } - return tkgctlClient.DeleteMachineHealthCheck(options) -} diff --git a/cmd/cli/plugin/cluster/delete_node_pool.go b/cmd/cli/plugin/cluster/delete_node_pool.go deleted file mode 100644 index e580ac2cef..0000000000 --- a/cmd/cli/plugin/cluster/delete_node_pool.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/pkg/errors" - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -type deleteNodePoolOptions struct { - nodePoolName string - namespace string -} - -var deleteNP = &deleteNodePoolOptions{} - -var deleteNodePoolCmd = &cobra.Command{ - Use: "delete CLUSTER_NAME", - Short: "Delete a NodePool object of a cluster", - Long: "Delete a NodePool object of a cluster", - Args: cobra.ExactArgs(1), - RunE: deleteNodePool, - SilenceUsage: true, -} - -func init() { - deleteNodePoolCmd.Flags().StringVarP(&deleteNP.nodePoolName, "name", "n", "", "Name of the NodePool object") - _ = deleteNodePoolCmd.MarkFlagRequired("name") - deleteNodePoolCmd.Flags().StringVar(&deleteNP.namespace, "namespace", "", "The namespace where the NodePool object was created, default to the cluster's namespace") - clusterNodePoolCmd.AddCommand(deleteNodePoolCmd) -} - -func deleteNodePool(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("deleting node pools with a global server is not implemented yet") - } - return runDeleteNodePool(server, args[0]) -} - -func runDeleteNodePool(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - options := client.DeleteMachineDeploymentOptions{ - ClusterName: clusterName, - Namespace: deleteNP.namespace, - Name: deleteNP.nodePoolName, - } - - err = tkgctlClient.DeleteMachineDeployment(options) - if err == nil { - log.Infof("Node pool '%s' is being deleted", options.Name) - } - - return err -} diff --git a/cmd/cli/plugin/cluster/doc.go b/cmd/cli/plugin/cluster/doc.go deleted file mode 100644 index e227377ca7..0000000000 --- a/cmd/cli/plugin/cluster/doc.go +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -Manage cluster lifecycle operations. - -# Create a cluster - -Usage: - - tanzu cluster create CLUSTER_NAME [flags] - -Flags: - - -d, --dry-run Does not create cluster but show the deployment YAML instead - -f, --file string Cluster configuration file from which to create a Cluster - -h, --help help for create - --tkr string TanzuKubernetesRelease(TKr) to be used for creating the workload cluster - -# List clusters - -Usage: - - tanzu cluster list [flags] - -Flags: - - -h, --help help for list - --include-management-cluster Show active management cluster information as well - -n, --namespace string The namespace from which to list workload clusters. If not provided clusters from all namespaces will be returned - -o, --output string Output format. Supported formats: json|yaml - -# Delete a cluster - -Usage: - - tanzu cluster delete CLUSTER_NAME [flags] - -Flags: - - -h, --help help for delete - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified. - -y, --yes Delete workload cluster without asking for confirmation - -# Scale a cluster - -Usage: - - tanzu cluster scale CLUSTER_NAME [flags] - -Flags: - - -c, --controlplane-machine-count int32 The number of control plane nodes to scale to. Assumes unchanged if not specified - -h, --help help for scale - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified. - -w, --worker-machine-count int32 The number of worker nodes to scale to. Assumes unchanged if not specified - -# Upgrade a cluster - -Usage: - - tanzu cluster upgrade CLUSTER_NAME [flags] - -Flags: - - -h, --help help for upgrade - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - --tkr string TanzuKubernetesRelease(TKr) to upgrade to - -y, --yes Upgrade workload cluster without asking for confirmation - -# Get,set, or delete a MachineHealthCheck object for a Tanzu Kubernetes cluster - -Usage: - - tanzu cluster machinehealthcheck [command] - -Available Commands: - - delete Delete a MachineHealthCheck object of a cluster - get Get a MachineHealthCheck object of a cluster - set Create or update a MachineHealthCheck for a cluster - -Flags: - - -h, --help help for machinehealthcheck - -Global Flags: - - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -# Get a MachineHealthCheck object for the given cluster - -Usage: - - tanzu cluster machinehealthcheck get CLUSTER_NAME [flags] - -Flags: - - -h, --help help for get - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string The namespace where the MachineHealthCheck object was created. - -# Create or update a MachineHealthCheck object for a cluster - -Usage: - - tanzu cluster machinehealthcheck set CLUSTER_NAME [flags] - -Flags: - - -h, --help help for set - --match-labels string Label selector to match machines whose health will be exercised - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string Namespace of the cluster - --node-startup-timeout string Any machine being created that takes longer than this duration to join the cluster is considered to have failed and will be remediated - --unhealthy-conditions string A list of the conditions that determine whether a node is considered unhealthy. Available condition types: [Ready, MemoryPressure,DiskPressure,PIDPressure, NetworkUnavailable], Available condition status: [True, False, Unknown]heck object was created. - -# Delete a MachineHealthCheck object for the given cluster - -Usage: - - tanzu cluster machinehealthcheck delete CLUSTER_NAME [flags] - -Flags: - - -h, --help help for delete - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string The namespace where the MachineHealthCheck object was created, default to the cluster's namespace - -y, --yes Delete the MachineHealthCheck object without asking for confirmation - -# Update credentials for a cluster - -Usage: - - tanzu cluster credentials [command] - -Available Commands: - - update Update credentials for a cluster - -Flags: - - -h, --help help for credentials - -Use "cluster credentials [command] --help" for more information about a command. - -# Update credentials for a cluster - -Usage: - - tanzu cluster credentials update CLUSTER_NAME [flags] - -Flags: - - -h, --help help for update - -n, --namespace string The namespace of cluster whose credentials have to be updated - --vsphere-password string Password for vSphere provider - --vsphere-user string Username for vSphere provider - -# Getting clusters details - -Usage: - - tanzu cluster get CLUSTER_NAME [flags] - -Flags: - - -h, --help help for get - -n, --namespace string The namespace from which to get workload clusters. If not provided clusters from all namespaces will be returned - --show-all-conditions string List of comma separated kind or kind/name for which we should show all the object's conditions (all to show conditions for all the objects) - --show-details Show details of MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object - --show-group-members Expand machine groups whose ready condition has the same Status, Severity and Reason - -# Get kubeconfig of a cluster and merge the context into the default kubeconfig file - -Usage: - - tanzu cluster kubeconfig get CLUSTER_NAME [flags] - -Examples: - - # Get workload cluster kubeconfig - tanzu cluster kubeconfig get CLUSTER_NAME - - # Get workload cluster admin kubeconfig - tanzu cluster kubeconfig get CLUSTER_NAME --admin - -Flags: - - --admin Get admin kubeconfig of the workload cluster - --export-file string File path to export a standalone kubeconfig for workload cluster - -h, --help help for get - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified. -*/ -package main diff --git a/cmd/cli/plugin/cluster/featureflags.go b/cmd/cli/plugin/cluster/featureflags.go deleted file mode 100644 index 3eb0f0c0aa..0000000000 --- a/cmd/cli/plugin/cluster/featureflags.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -// DefaultFeatureFlagsForClusterPlugin is used to populate default feature-flags for the cluster plugin -var ( - DefaultFeatureFlagsForClusterPlugin = map[string]bool{ - constants.FeatureFlagClusterDualStackIPv4Primary: false, - constants.FeatureFlagClusterDualStackIPv6Primary: false, - constants.FeatureFlagClusterCustomNameservers: false, - constants.FeatureFlagAllowLegacyCluster: false, - constants.FeatureFlagPackageBasedCC: true, - } -) diff --git a/cmd/cli/plugin/cluster/get.go b/cmd/cli/plugin/cluster/get.go deleted file mode 100644 index 7c16588450..0000000000 --- a/cmd/cli/plugin/cluster/get.go +++ /dev/null @@ -1,349 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "errors" - "fmt" - "io" - "sort" - "strings" - "time" - - "github.com/fatih/color" - "github.com/gosuri/uitable" - "github.com/spf13/cobra" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/duration" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctltree "sigs.k8s.io/cluster-api/cmd/clusterctl/client/tree" - "sigs.k8s.io/controller-runtime/pkg/client" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/command" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -const noneTag = "" - -type getClustersOptions struct { - namespace string - showOtherConditions string - // Deprecated: Use showDetails instead. - disableNoEcho bool - // Deprecated: Use showGroupMembers instead. - disableGroupObjects bool - showDetails bool - showGroupMembers bool -} - -var cd = &getClustersOptions{} -var cmdOutput io.Writer - -var getClustersCmd = &cobra.Command{ - Use: "get CLUSTER_NAME", - Short: "Get details from a cluster", - Args: cobra.ExactArgs(1), - RunE: get, - SilenceUsage: true, -} - -func init() { - cmdOutput = getClustersCmd.OutOrStdout() - - getClustersCmd.Flags().StringVarP(&cd.namespace, "namespace", "n", "", "The namespace from which to get workload clusters. If not provided clusters from all namespaces will be returned") - - getClustersCmd.Flags().StringVar(&cd.showOtherConditions, "show-all-conditions", "", "List of comma separated kind or kind/name for which we should show all the object's conditions (all to show conditions for all the objects)") - - getClustersCmd.Flags().BoolVar(&cd.disableNoEcho, "disable-no-echo", false, "Disable hiding of a MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object") - command.DeprecateFlagWithAlternative(getClustersCmd, "disable-no-echo", "1.6.0", "--show-details") - getClustersCmd.Flags().BoolVar(&cd.showDetails, "show-details", false, "Show details of MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object") - - getClustersCmd.Flags().BoolVar(&cd.disableGroupObjects, "disable-grouping", false, "Disable grouping machines when ready condition has the same Status, Severity and Reason") - command.DeprecateFlagWithAlternative(getClustersCmd, "disable-grouping", "1.6.0", "--show-group-members") - getClustersCmd.Flags().BoolVar(&cd.showGroupMembers, "show-group-members", false, "Expand machine groups whose ready condition has the same Status, Severity and Reason") -} - -func get(cmd *cobra.Command, args []string) error { - f1 := cmd.Flags().Lookup("disable-no-echo") - f1Changed := false - if f1 != nil && f1.Changed { - f1Changed = true - cd.showDetails = cd.disableNoEcho - } - f2 := cmd.Flags().Lookup("show-details") - f2Changed := false - if f2 != nil && f2.Changed { - f2Changed = true - } - if f1Changed && f2Changed { - return fmt.Errorf("only one of --show-details or --disable-no-echo should be set") - } - - f1 = cmd.Flags().Lookup("disable-grouping") - f1Changed = false - if f1 != nil && f1.Changed { - f1Changed = true - cd.showGroupMembers = cd.disableGroupObjects - } - f2 = cmd.Flags().Lookup("show-group-members") - f2Changed = false - if f2 != nil && f2.Changed { - f2Changed = true - } - if f1Changed && f2Changed { - return fmt.Errorf("only one of --show-group-members or --disable-grouping should be set") - } - - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("getting cluster details with a global server is not implemented yet") - } - return getCluster(server, args[0]) -} - -//nolint:whitespace,gocritic -func getCluster(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - // Output the Status - describeClusterOptions := tkgctl.DescribeTKGClustersOptions{ - ClusterName: clusterName, - Namespace: cd.namespace, - ShowOtherConditions: cd.showOtherConditions, - ShowDetails: cd.showDetails, - ShowGroupMembers: cd.showGroupMembers, - } - - results, err := tkgctlClient.DescribeCluster(describeClusterOptions) - if err != nil { - return err - } - - t := component.NewOutputWriter(cmdOutput, "table", "NAME", "NAMESPACE", "STATUS", "CONTROLPLANE", "WORKERS", "KUBERNETES", "ROLES", "TKR") - - cl := results.ClusterInfo - clusterRoles := noneTag - if len(cl.Roles) != 0 { - clusterRoles = strings.Join(cl.Roles, ",") - } - if cl.Name != "" { - t.AddRow(cl.Name, cl.Namespace, cl.Status, cl.ControlPlaneCount, cl.WorkerCount, cl.K8sVersion, clusterRoles, cl.TKR) - } - - t.Render() - - if results.Objs != nil && results.Cluster != nil { - log.Infof("\n\nDetails:\n\n") - treeView(results.Objs, results.Cluster) - } else { - // printing the below at log level 1, so that if users want to know why the tree view is not available(for TKGS) it could provide insights - log.V(1).Infof("\n\n Warning! Unable to get cluster ObjectTree/cluster objects, so detailed(tree) view of cluster resources is not available!!\n\n") - } - - // If it is a Management Cluster, output the providers - if results.InstalledProviders != nil { - log.Infof("\n\nProviders:\n\n") - p := component.NewOutputWriter(cmdOutput, "table", "NAMESPACE", "NAME", "TYPE", "PROVIDERNAME", "VERSION", "WATCHNAMESPACE") - for _, installedProvider := range results.InstalledProviders.Items { - p.AddRow(installedProvider.Namespace, installedProvider.Name, installedProvider.Type, installedProvider.ProviderName, installedProvider.Version, installedProvider.WatchedNamespace) - } - p.Render() - } - - return nil - -} - -const ( - firstElemPrefix = `├─` - lastElemPrefix = `└─` - pipe = `│ ` - doubleSpace = " " -) - -var ( - gray = color.New(color.FgHiBlack) - red = color.New(color.FgRed) - green = color.New(color.FgGreen) - yellow = color.New(color.FgYellow) - white = color.New(color.FgWhite) - cyan = color.New(color.FgCyan) -) - -// treeView prints object hierarchy to out stream. -func treeView(objs *clusterctltree.ObjectTree, obj client.Object) { - tbl := uitable.New() - tbl.Separator = " " - tbl.AddRow("NAME", "READY", "SEVERITY", "REASON", "SINCE", "MESSAGE") - treeViewInner("", tbl, objs, obj) - fmt.Fprintln(color.Output, tbl) -} - -type conditions struct { - readyColor *color.Color - age string - status string - severity string - reason string - message string -} - -func getCond(c *clusterv1.Condition) conditions { - maxMessage := 100 - v := conditions{} - if c == nil { - return v - } - - switch c.Status { - case corev1.ConditionTrue: - v.readyColor = green - case corev1.ConditionFalse, corev1.ConditionUnknown: - switch c.Severity { - case clusterv1.ConditionSeverityError: - v.readyColor = red - case clusterv1.ConditionSeverityWarning: - v.readyColor = yellow - default: - v.readyColor = white - } - default: - v.readyColor = gray - } - - v.status = string(c.Status) - v.severity = string(c.Severity) - v.reason = c.Reason - v.message = c.Message - if len(v.message) > maxMessage { - v.message = fmt.Sprintf("%s ...", v.message[:100]) - } - v.age = duration.HumanDuration(time.Since(c.LastTransitionTime.Time)) - - return v -} - -func treeViewInner(prefix string, tbl *uitable.Table, objs *clusterctltree.ObjectTree, obj client.Object) { - v := conditions{} - v.readyColor = gray - minDelim := 2 - - ready := clusterctltree.GetReadyCondition(obj) - name := getName(obj) - if ready != nil { - v = getCond(ready) - } - - if clusterctltree.IsGroupObject(obj) { - name = white.Add(color.Bold).Sprintf(name) - items := strings.Split(clusterctltree.GetGroupItems(obj), clusterctltree.GroupItemsSeparator) - if len(items) <= minDelim { - v.message = gray.Sprintf("See %s", strings.Join(items, clusterctltree.GroupItemsSeparator)) - } else { - v.message = gray.Sprintf("See %s, ...", strings.Join(items[:2], clusterctltree.GroupItemsSeparator)) - } - } - if !obj.GetDeletionTimestamp().IsZero() { - name = fmt.Sprintf("%s %s", red.Sprintf("!! DELETED !!"), name) - } - - tbl.AddRow( - fmt.Sprintf("%s%s", gray.Sprint(printPrefix(prefix)), name), - v.readyColor.Sprint(v.status), - v.readyColor.Sprint(v.severity), - v.readyColor.Sprint(v.reason), - v.age, - v.message) - - chs := objs.GetObjectsByParent(obj.GetUID()) - - if clusterctltree.IsShowConditionsObject(obj) { - otherConditions := clusterctltree.GetOtherConditions(obj) - for i := range otherConditions { - cond := otherConditions[i] - - p := "" - filler := strings.Repeat(" ", 10) - siblingsPipe := doubleSpace - if len(chs) > 0 { - siblingsPipe = pipe - } - switch i { - case len(otherConditions) - 1: - p = prefix + siblingsPipe + filler + lastElemPrefix - default: - p = prefix + siblingsPipe + filler + firstElemPrefix - } - - v = getCond(cond) - tbl.AddRow( - fmt.Sprintf("%s%s", gray.Sprint(printPrefix(p)), cyan.Sprint(cond.Type)), - v.readyColor.Sprint(v.status), - v.readyColor.Sprint(v.severity), - v.readyColor.Sprint(v.reason), - v.age, - v.message) - } - } - - sort.Slice(chs, func(i, j int) bool { - return getName(chs[i]) < getName(chs[j]) - }) - - for i, child := range chs { - switch i { - case len(chs) - 1: - treeViewInner(prefix+lastElemPrefix, tbl, objs, child) - default: - treeViewInner(prefix+firstElemPrefix, tbl, objs, child) - } - } -} - -func getName(obj client.Object) string { - if clusterctltree.IsGroupObject(obj) { - items := strings.Split(clusterctltree.GetGroupItems(obj), clusterctltree.GroupItemsSeparator) - return fmt.Sprintf("%d Machines...", len(items)) - } - - if clusterctltree.IsVirtualObject(obj) { - return obj.GetName() - } - - objName := fmt.Sprintf("%s/%s", - obj.GetObjectKind().GroupVersionKind().Kind, - color.New(color.Bold).Sprint(obj.GetName())) - - name := objName - if objectPrefix := clusterctltree.GetMetaName(obj); objectPrefix != "" { - name = fmt.Sprintf("%s - %s", objectPrefix, gray.Sprintf(name)) - } - return name -} - -func printPrefix(p string) string { - if strings.HasSuffix(p, firstElemPrefix) { - p = strings.Replace(p, firstElemPrefix, pipe, strings.Count(p, firstElemPrefix)-1) - } else { - p = strings.ReplaceAll(p, firstElemPrefix, pipe) - } - - if strings.HasSuffix(p, lastElemPrefix) { - p = strings.Replace(p, lastElemPrefix, strings.Repeat(" ", len([]rune(lastElemPrefix))), strings.Count(p, lastElemPrefix)-1) - } else { - p = strings.ReplaceAll(p, lastElemPrefix, strings.Repeat(" ", len([]rune(lastElemPrefix)))) - } - return p -} diff --git a/cmd/cli/plugin/cluster/get_machinehealthcheck.go b/cmd/cli/plugin/cluster/get_machinehealthcheck.go deleted file mode 100644 index 6717507266..0000000000 --- a/cmd/cli/plugin/cluster/get_machinehealthcheck.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "encoding/json" - "fmt" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type getMachineHealthCheckOptions struct { - machinehealthCheckName string - namespace string -} - -var getMHC = &getMachineHealthCheckOptions{} - -var getMachineHealthCheckCmd = &cobra.Command{ - Use: "get CLUSTER_NAME", - Short: "Get a MachineHealthCheck object of a cluster", - Long: "Get a MachineHealthCheck object for the given cluster", - Args: cobra.ExactArgs(1), - RunE: getMachineHealthCheck, - SilenceUsage: true, -} - -func init() { - getMachineHealthCheckCmd.Flags().StringVarP(&getMHC.machinehealthCheckName, "mhc-name", "m", "", "Name of the MachineHealthCheck object") - getMachineHealthCheckCmd.Flags().StringVarP(&getMHC.namespace, "namespace", "n", "", "The namespace where the MachineHealthCheck object was created.") - machineHealthCheckCmd.AddCommand(getMachineHealthCheckCmd) -} - -func getMachineHealthCheck(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("getting machine healthcheck with a global server is not implemented yet") - } - return runGetMachineHealthCheck(server, args[0]) -} - -func runGetMachineHealthCheck(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - options := tkgctl.GetMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: getMHC.namespace, - MachineHealthCheckName: getMHC.machinehealthCheckName, - } - - mhcList, err := tkgctlClient.GetMachineHealthCheck(options) - if err != nil { - return err - } - - bytes, err := json.MarshalIndent(mhcList, "", " ") - if err != nil { - return errors.Wrap(err, "error marshaling the list of MachineHealthCheck objects") - } - - fmt.Println(string(bytes)) - - return nil -} diff --git a/cmd/cli/plugin/cluster/get_machinehealthcheck_control_plane.go b/cmd/cli/plugin/cluster/get_machinehealthcheck_control_plane.go deleted file mode 100644 index 218c1be7bf..0000000000 --- a/cmd/cli/plugin/cluster/get_machinehealthcheck_control_plane.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "encoding/json" - "fmt" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type getMachineHealthCheckCPOptions struct { - machinehealthCheckName string - namespace string -} - -var getMHCCP = &getMachineHealthCheckCPOptions{} - -var getMachineHealthCheckCPCmd = &cobra.Command{ - Use: "get CLUSTER_NAME", - Short: "Get a MachineHealthCheck object", - Long: "Get a MachineHealthCheck object of the control plane for the given cluster", - Args: cobra.ExactArgs(1), - RunE: getMachineHealthCheckCP, - SilenceUsage: true, -} - -func init() { - getMachineHealthCheckCPCmd.Flags().StringVarP(&getMHCCP.machinehealthCheckName, "mhc-name", "m", "", "Name of the MachineHealthCheck object") - getMachineHealthCheckCPCmd.Flags().StringVarP(&getMHCCP.namespace, "namespace", "n", "", "The namespace where the MachineHealthCheck object was created.") - machineHealthCheckControlPlaneCmd.AddCommand(getMachineHealthCheckCPCmd) -} - -func getMachineHealthCheckCP(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("getting machine healthcheck with a global server is not implemented yet") - } - return runGetMachineHealthCheckCP(server, args[0]) -} - -func runGetMachineHealthCheckCP(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - options := tkgctl.GetMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: getMHCCP.namespace, - MachineHealthCheckName: getMHCCP.machinehealthCheckName, - MatchLabel: controlPlaneLabel, - } - - mhcList, err := tkgctlClient.GetMachineHealthCheck(options) - if err != nil { - return err - } - - bytes, err := json.MarshalIndent(mhcList, "", " ") - if err != nil { - return errors.Wrap(err, "error marshaling the list of MachineHealthCheck objects") - } - - fmt.Println(string(bytes)) - - return nil -} diff --git a/cmd/cli/plugin/cluster/get_machinehealthcheck_node.go b/cmd/cli/plugin/cluster/get_machinehealthcheck_node.go deleted file mode 100644 index 6514fd691e..0000000000 --- a/cmd/cli/plugin/cluster/get_machinehealthcheck_node.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "encoding/json" - "fmt" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type getMachineHealthCheckNodeOptions struct { - machinehealthCheckName string - namespace string -} - -var getMHCNode = &getMachineHealthCheckNodeOptions{} - -var getMachineHealthCheckNodeCmd = &cobra.Command{ - Use: "get CLUSTER_NAME", - Short: "Get a MachineHealthCheck object of the nodes of a cluster", - Long: "Get a MachineHealthCheck object of the nodes for the given cluster", - Args: cobra.ExactArgs(1), - RunE: getMachineHealthCheckNode, - SilenceUsage: true, -} - -func init() { - getMachineHealthCheckNodeCmd.Flags().StringVarP(&getMHCNode.machinehealthCheckName, "mhc-name", "m", "", "Name of the MachineHealthCheck object") - getMachineHealthCheckNodeCmd.Flags().StringVarP(&getMHCNode.namespace, "namespace", "n", "", "The namespace where the MachineHealthCheck object was created.") - machineHealthCheckNodeCmd.AddCommand(getMachineHealthCheckNodeCmd) -} - -func getMachineHealthCheckNode(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("getting machine healthcheck with a global server is not implemented yet") - } - return runGetMachineHealthCheckNode(server, args[0]) -} - -func runGetMachineHealthCheckNode(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - options := tkgctl.GetMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: getMHCNode.namespace, - MachineHealthCheckName: getMHCNode.machinehealthCheckName, - MatchLabel: "", - } - - mhcList, err := tkgctlClient.GetMachineHealthCheck(options) - if err != nil { - return err - } - - var filtered []client.MachineHealthCheck - for i := range mhcList { - if _, ok := mhcList[i].Spec.Selector.MatchLabels[nodePoolLabel]; ok { - filtered = append(filtered, mhcList[i]) - } else if _, ok := mhcList[i].Spec.Selector.MatchLabels[machineDeploymentLabel]; ok { - filtered = append(filtered, mhcList[i]) - } - } - - bytes, err := json.MarshalIndent(filtered, "", " ") - if err != nil { - return errors.Wrap(err, "error marshaling the list of MachineHealthCheck objects") - } - - fmt.Println(string(bytes)) - - return nil -} diff --git a/cmd/cli/plugin/cluster/get_node_pools.go b/cmd/cli/plugin/cluster/get_node_pools.go deleted file mode 100644 index d704daa4ec..0000000000 --- a/cmd/cli/plugin/cluster/get_node_pools.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/pkg/errors" - - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" -) - -type listNodePoolOptions struct { - namespace string - outputFormat string -} - -var lnp = &listNodePoolOptions{} - -var listNodePoolsCmd = &cobra.Command{ - Use: "list [CLUSTER_NAME]", - Short: "List node pools", - Args: cobra.ExactArgs(1), - RunE: listNodePools, - SilenceUsage: true, -} - -func init() { - listNodePoolsCmd.Flags().StringVarP(&lnp.namespace, "namespace", "n", "default", "The namespace from which to list workload clusters.") - listNodePoolsCmd.Flags().StringVarP(&lnp.outputFormat, "output", "o", "", "Output format (yaml|json|table)") - clusterNodePoolCmd.AddCommand(listNodePoolsCmd) -} - -func listNodePools(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("listing node pools with a global server is not implemented yet") - } - return listNodePoolsInternal(cmd, server, args[0]) -} - -//nolint:gocritic -func listNodePoolsInternal(cmd *cobra.Command, server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - mdOptions := client.GetMachineDeploymentOptions{ - ClusterName: clusterName, - Namespace: lnp.namespace, - } - - machineDeployments, err := tkgctlClient.GetMachineDeployments(mdOptions) - if err != nil { - return err - } - - var t component.OutputWriter - if lnp.outputFormat == string(component.JSONOutputType) || lnp.outputFormat == string(component.YAMLOutputType) { - t = component.NewObjectWriter(cmd.OutOrStdout(), lnp.outputFormat, machineDeployments) - } else { - t = component.NewOutputWriter(cmd.OutOrStdout(), lnp.outputFormat, "NAME", "NAMESPACE", "PHASE", "REPLICAS", "READY", "UPDATED", "UNAVAILABLE") - for _, md := range machineDeployments { - t.AddRow(md.Name, md.Namespace, md.Status.Phase, md.Status.Replicas, md.Status.ReadyReplicas, md.Status.UpdatedReplicas, md.Status.UnavailableReplicas) - } - } - t.Render() - - return nil -} diff --git a/cmd/cli/plugin/cluster/go.mod b/cmd/cli/plugin/cluster/go.mod deleted file mode 100644 index 1fb61c2dd0..0000000000 --- a/cmd/cli/plugin/cluster/go.mod +++ /dev/null @@ -1,250 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/plugin/cluster - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework => ../../../../ - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/config => ../../../../apis/config - github.com/vmware-tanzu/tanzu-framework/apis/run => ../../../../apis/run - github.com/vmware-tanzu/tanzu-framework/capabilities/client => ../../../../capabilities/client - github.com/vmware-tanzu/tanzu-framework/cli/core => ../../../../cli/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../../../cli/runtime - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common => ../../../../pinniped-components/common - github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr => ../../../../pkg/v1/tkr - github.com/vmware-tanzu/tanzu-framework/tkg => ../../../../tkg - github.com/vmware-tanzu/tanzu-framework/tkr => ../../../../tkr - github.com/vmware-tanzu/tanzu-framework/util => ../../../../util - sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.8 -) - -require ( - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/fatih/color v1.13.0 - github.com/gosuri/uitable v0.0.4 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.24.1 - github.com/pkg/errors v0.9.1 - github.com/spf13/cobra v1.6.1 - github.com/spf13/pflag v1.0.5 - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/tkg v0.0.0-00010101000000-000000000000 - gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.24.4 - k8s.io/apimachinery v0.24.4 - sigs.k8s.io/cluster-api v1.2.8 - sigs.k8s.io/controller-runtime v0.12.3 - sigs.k8s.io/yaml v1.3.0 -) - -require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.6.0 // indirect - cloud.google.com/go/storage v1.27.0 // indirect - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/Azure/azure-sdk-for-go v66.0.0+incompatible // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.23 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.18 // indirect - github.com/Azure/go-autorest/autorest/azure/auth v0.5.10 // indirect - github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect - github.com/BurntSushi/toml v1.1.0 // indirect - github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/semver/v3 v3.2.0 // indirect - github.com/Masterminds/sprig/v3 v3.2.3 // indirect - github.com/Microsoft/go-winio v0.5.2 // indirect - github.com/adrg/xdg v0.4.0 // indirect - github.com/alessio/shellescape v1.4.1 // indirect - github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d // indirect - github.com/apparentlymart/go-cidr v1.1.0 // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect - github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7 // indirect - github.com/aws/amazon-vpc-cni-k8s v1.12.0 // indirect - github.com/aws/aws-sdk-go v1.44.107 // indirect - github.com/awslabs/goformation/v4 v4.19.5 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.11.4 // indirect - github.com/coredns/caddy v1.1.1 // indirect - github.com/coredns/corefile-migration v1.0.18 // indirect - github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e // indirect - github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect - github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/docker/cli v20.10.16+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.17+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.4.0 // indirect - github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 // indirect - github.com/elazarl/go-bindata-assetfs v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/getkin/kin-openapi v0.94.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-asn1-ber/asn1-ber v1.5.1 // indirect - github.com/go-ldap/ldap/v3 v3.3.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-openapi/analysis v0.19.5 // indirect - github.com/go-openapi/errors v0.19.2 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/loads v0.19.4 // indirect - github.com/go-openapi/runtime v0.19.4 // indirect - github.com/go-openapi/spec v0.19.5 // indirect - github.com/go-openapi/strfmt v0.19.5 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-openapi/validate v0.19.8 // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.0.0 // indirect - github.com/golang/glog v1.0.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/cel-go v0.12.5 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/go-containerregistry v0.10.0 // indirect - github.com/google/go-github/v45 v45.2.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/hashicorp/go-version v1.4.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/huandu/xstrings v1.3.3 // indirect - github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/jessevdk/go-flags v1.4.0 // indirect - github.com/jinzhu/copier v0.3.5 // 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/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect - github.com/k14s/imgpkg v0.17.0 // indirect - github.com/k14s/kbld v0.32.0 // indirect - github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 // indirect - github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.15.4 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // 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/nxadm/tail v1.4.8 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rs/xid v1.4.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b // indirect - github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522 // indirect - github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect - github.com/spf13/afero v1.9.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/stoewer/go-strcase v1.2.0 // indirect - github.com/subosito/gotenv v1.3.0 // indirect - github.com/valyala/fastjson v1.6.3 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec // indirect - github.com/vmware-tanzu/carvel-imgpkg v0.23.1 // indirect - github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 // indirect - github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 // indirect - github.com/vmware-tanzu/carvel-vendir v0.30.0 // indirect - github.com/vmware-tanzu/carvel-ytt v0.40.0 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/config v0.0.0-20220824221239-af5a644ffef7 // indirect - github.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/cli/core v0.0.0-20220914003300-5b2ed024556a // indirect - github.com/vmware-tanzu/tanzu-framework/packageclients v0.0.0-20220908202723-7a1ddb97efab // indirect - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/tkr v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware/govmomi v0.30.2 // indirect - github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect - go.mongodb.org/mongo-driver v1.5.1 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.102.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect - google.golang.org/grpc v1.50.1 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.66.4 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiextensions-apiserver v0.24.4 // indirect - k8s.io/apiserver v0.24.4 // indirect - k8s.io/client-go v0.24.4 // indirect - k8s.io/cluster-bootstrap v0.24.4 // indirect - k8s.io/component-base v0.24.4 // indirect - k8s.io/klog/v2 v2.80.0 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 // indirect - sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2 // indirect - sigs.k8s.io/cluster-api-provider-azure v1.6.1 // indirect - sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 // indirect - sigs.k8s.io/cluster-api/test v1.2.8 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/kind v0.15.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect -) diff --git a/cmd/cli/plugin/cluster/go.sum b/cmd/cli/plugin/cluster/go.sum deleted file mode 100644 index b8c5541ec4..0000000000 --- a/cmd/cli/plugin/cluster/go.sum +++ /dev/null @@ -1,2130 +0,0 @@ -4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= -cloud.google.com/go/iam v0.6.0 h1:nsqQC88kT5Iwlm4MeNGTpfMWddp6NB/UOLFTH6m1QfQ= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/longrunning v0.1.1 h1:y50CXG4j0+qvEukslYFBCrzaXX0qpFbBzc3PchSu/LE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= -cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCqWCLp6Cifo= -github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible h1:bmmC38SlE8/E81nNADlgmVGurPWMHDX2YNXVQMrBpEE= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.23 h1:bRQWsW25/YkoxnIqXMPF94JW33qWDcrPMZ3bINaAruU= -github.com/Azure/go-autorest/autorest v0.11.23/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.10 h1:F9A3Z++TtAoFysBsNOIJILoHuYBaYvhVGsMGEqPtIS8= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.10/go.mod h1:zQXYYNX9kXzRMrJNVXWUfNy38oPMF5/2TeZ4Wylc9fE= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 h1:dMOmEJfkLKW/7JsokJqkyoYSgmR08hi9KrhjZb+JALY= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28= -github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= -github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d h1:0xIrH2lJbraclvJT3pvTf3u2oCAL60cAqiv4qRpz4EI= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU= -github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7 h1:UpBQmQ1gKLi+i+/Dohoqk7FfuxlYQYveajqs1pk/CvA= -github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7/go.mod h1:BcllDeAFx8PtaMrPxvvuCUo7NRS2x6w+3W17WFDu0sk= -github.com/aws/amazon-vpc-cni-k8s v1.12.0 h1:WP8wHJ+UjViYkpMi2Uu5hHiPTYH3/jPC9pG3PrTmoWY= -github.com/aws/amazon-vpc-cni-k8s v1.12.0/go.mod h1:vZdHLUZf7Kj4mpqzG+szRxvCe/XMS/EAcxwMklI6NOQ= -github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= -github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.107 h1:VP7Rq3wzsOV7wrfHqjAAKRksD4We58PaoVSDPKhm8nw= -github.com/aws/aws-sdk-go v1.44.107/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/awslabs/goformation/v4 v4.19.5 h1:Y+Tzh01tWg8gf//AgGKUamaja7Wx9NPiJf1FpZu4/iU= -github.com/awslabs/goformation/v4 v4.19.5/go.mod h1:JoNpnVCBOUtEz9bFxc9sjy8uBUCLF5c4D1L7RhRTVM8= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/blizzy78/varnamelen v0.3.0/go.mod h1:hbwRdBvoBqxk34XyQ6HA0UH3G0/1TKuv5AC4eaBT0Ec= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/breml/bidichk v0.1.1/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudfoundry/bosh-utils v0.0.0-20191216173634-505d7f919144/go.mod h1:JCrKwetZGjxbfq1U139TZuXDBfdGLtjOEAfxMWKV/QM= -github.com/cloudfoundry/config-server v0.1.20/go.mod h1:Y3b/MHqyp22CcG0X1qvEHG8lujoebxjD9IAslyS/Yk0= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.11.4 h1:LjrYUZpyOhiSaU7hHrdR82/RBoxfGWSaC0VeSSMXqnk= -github.com/containerd/stargz-snapshotter/estargz v0.11.4/go.mod h1:7vRJIcImfY8bpifnMjt+HTJoQxASq7T28MYbP15/Nf0= -github.com/coredns/caddy v1.1.0/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= -github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/corefile-migration v1.0.18 h1:zs5PJm/VGZVje1ESRj6ZqyUuVsVfagExkbLU2QKV5mI= -github.com/coredns/corefile-migration v1.0.18/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e h1:4AxO89dwbgA957M8DX5AV/KsOmxDyAB1BES0INY+A/0= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= -github.com/cppforlife/go-cli-ui v0.0.0-20200506005011-4268990983cc/go.mod h1:I0qrzCmuPWYI6kAOvkllYjaW2aovclWbJ96+v+YyHb0= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f h1:yVW0v4zDXzJo1i8G9G3vtvNpyzhvtLalO34BsN/K88E= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f/go.mod h1:L18TqO77ci8i+hFtlMC4zSFz/D3O8lf84TyVU+zFF8E= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/daixiang0/gci v0.2.9/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.16+incompatible h1:aLQ8XowgKpR3/IysPj8qZQJBVQ+Qws61icFuZl6iKYs= -github.com/docker/cli v20.10.16+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 h1:7QPwrLT79GlD5sizHf27aoY2RTvw62mO6x7mxkScNk0= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46/go.mod h1:esf2rsHFNlZlxsqsZDojNBcnNs5REqIvRrWRHqX0vEU= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw= -github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getkin/kin-openapi v0.94.0 h1:bAxg2vxgnHHHoeefVdmGbR+oxtJlcv5HsJJa3qmAHuo= -github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= -github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-critic/go-critic v0.6.1/go.mod h1:SdNCfU0yF3UBjtaZGw6586/WocupMOJuiqgom5DsQxM= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-ldap/ldap/v3 v3.3.0 h1:lwx+SJpgOHd8tG6SumBQZXCmNX51zM8B1cfxJ5gv4tQ= -github.com/go-ldap/ldap/v3 v3.3.0/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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 v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4 h1:5I4CCSqoWzT+82bBkNIvmLc0UOsoKKQ4Fz+3VxOB7SY= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= -github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-openapi/validate v0.19.8 h1:YFzsdWIDfVuLvIOF+ZmKjVg1MbPJ1QgY9PihMwei1ys= -github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.43.0/go.mod h1:VIFlUqidx5ggxDfQagdvd9E67UjMXtTHBkBQ7sHoC5Q= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-go v0.12.5 h1:DmzaiSgoaqGCjtpPQWl26/gND+yRpim56H1jCVev6d8= -github.com/google/cel-go v0.12.5/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.10.0 h1:qd/fv2nQajGZJenaNcdaghlwSPjQ0NphN9hzArr2WWg= -github.com/google/go-containerregistry v0.10.0/go.mod h1:C7uwbB1QUAtvnknyd3ethxJRd4gtEjU/9WLXzckfI1Y= -github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= -github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= -github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= -github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= -github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= -github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= -github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hpcloud/tail v1.0.1-0.20180514194441-a1dbeea552b7/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= -github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= -github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -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/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57 h1:CwBRArr+BWBopnUJhDjJw86rPL/jGbEjfHWKzTasSqE= -github.com/k14s/imgpkg v0.17.0 h1:l1HqYtjecqx7iYecJUvxQQYdo3WubCahHQ30lh0p9sU= -github.com/k14s/imgpkg v0.17.0/go.mod h1:xYZ7gQxYP3O35vGIXcYchDEHq0xA81FOheCp8Vlq5ko= -github.com/k14s/kbld v0.32.0 h1:zf3qCir0usz7rX6JRF97QxaZ25+13EniE7z+ll0xaZ8= -github.com/k14s/kbld v0.32.0/go.mod h1:N7Ij72ZhJ2B7kTUxavGTBT1YymIfmAeO6JKyNbtja1g= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 h1:wKSifC/VbCaQMqXYn6/gSFqle82OX4bE3KYALDU9FlU= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115/go.mod h1:mGrnmO5qnhJIaSiwMo05cvRL6Ww9ccYbTgNFcm6RHZQ= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 h1:4bcRTTSx+LKSxMWibIwzHnDNmaN1x52oEpvnjCy+8vk= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368/go.mod h1:lKGj1op99m4GtQISxoD2t+K+WO/q2NzEPKvfXFQfbCA= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.4 h1:1kn4/7MepF/CHmYub99/nNX8az0IJjfSOU/jbnTVfqQ= -github.com/klauspost/compress v1.15.4/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= -github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= -github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.1.2/go.mod h1:bnXsMr+ZTH09V5rssEI+jHAZ4z+ZdyhgO/zsy3EhK+0= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= -github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc= -github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= -github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -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 v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.5.0 h1:TRtrvv2vdQqzkwrQ1ke6vtXf7IK34RBUJafIy1wMwls= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= -github.com/onsi/gomega v1.12.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= -github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 h1:+czc/J8SlhPKLOtVLMQc+xDCFBT73ZStMsRhSsUhsSg= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -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/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.13/go.mod h1:Ul8wwdqR6kBVOCt2dipDBkE+T6vAV/iixkrKuRTN1oQ= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.10/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20210428214800-545e0d2e0bf7/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= -github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b h1:jUK33OXuZP/l6babJtnLo1qsGvq6G9so9KMflGAm4YA= -github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b/go.mod h1:8458kAagoME2+LN5//WxE71ysZ3B7r22fdgb7qVmXSY= -github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522 h1:fOCp11H0yuyAt2wqlbJtbyPzSgaxHTv8uN1pMpkG1t8= -github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522/go.mod h1:tQTYKOQgxoH3v6dEmdHiz4JG+nbxWwM5fgPQUpSZqVQ= -github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securego/gosec/v2 v2.9.1/go.mod h1:oDcDLcatOJxkCGaCaq8lua1jTnYf6Sou4wdiJ1n4iHc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil/v3 v3.21.10/go.mod h1:t75NhzCZ/dYyPQjyQmrAYP6c8+LCdFANeBMdLPCNnew= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -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 v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY= -github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= -github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1 h1:sUHDtnvcIMMcY/Pudym6DJ0kv7+uyMCAqQby0SLnQVs= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1/go.mod h1:2XNe+P0MDgya0FPEMOVZLAXku05VZhccVdDcXChhvy8= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 h1:zgWNumjhN+0CCiq1Wo4lVTmO89eOA6HuPXgv1sVhE4k= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0/go.mod h1:Hldrv7kPAD3THS1yUYZPFIaHmPE0ENO0ljzbJrpftiE= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 h1:3mSDyzhf52Y0jdvHrhJUf4Sk97CILBOkQt/WUaD8G/8= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0/go.mod h1:UW9xzccG6vjNoq2emVderTX11epILNyxtmGxFupRsHc= -github.com/vmware-tanzu/carvel-vendir v0.30.0 h1:JqElRFpSsYJQmI5Hrxl1Fx9wJZ2xeDk+TVnnSrFLFVU= -github.com/vmware-tanzu/carvel-vendir v0.30.0/go.mod h1:qFV2/3Cu584fhG2wXodoIm8KhX1wKHRFavBiRjK/Ly0= -github.com/vmware-tanzu/carvel-ytt v0.40.0 h1:WUWTtwvfqV9CN9v207oDt2xfhmuWHGwc4MMaXJAqIEE= -github.com/vmware-tanzu/carvel-ytt v0.40.0/go.mod h1:crDcKbS1GM4Q34puoVxdrajWOXrxjOxvUCwtsNV5Etc= -github.com/vmware-tanzu/tanzu-framework/packageclients v0.0.0-20220908202723-7a1ddb97efab h1:fhqTglwKorq5z6jfw4E8oeluECUe2hATwaB1MXyq27Y= -github.com/vmware-tanzu/tanzu-framework/packageclients v0.0.0-20220908202723-7a1ddb97efab/go.mod h1:If9r7cMkkw8E+HsOJe9PvZqykCgy1IuVZZpXeEldh7E= -github.com/vmware/govmomi v0.30.2 h1:zPMmLTtAfBgOVsTgwKOzVVahQIOC4A2oyFQFSsn/0ag= -github.com/vmware/govmomi v0.30.2/go.mod h1:F7adsVewLNHsW/IIm7ziFURaXDaHEwcc+ym4r3INMdY= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.5.1 h1:9nOVLGDfOaZ9R0tBumx/BcuqkbFpyTCU2r/Po7A2azI= -go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= -go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0= -go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= -go4.org/intern v0.0.0-20220617035311-6925f38cc365 h1:t9hFvR102YlOqU0fQn1wgwhNvSbHGBbbJxX9JKfU3l0= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180730214132-a0f8a16cb08c/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/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-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/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= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= -inet.af/netaddr v0.0.0-20220811202034-502d2d690317 h1:U2fwK6P2EqmopP/hFLTOAjWTki0qgd4GMJn5X8wOleU= -k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= -k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.4 h1:I5Y645gJ8zWKawyr78lVfDQkZrAViSbeRXsPZWTxmXk= -k8s.io/api v0.24.4/go.mod h1:42pVfA0NRxrtJhZQOvRSyZcJihzAdU59WBtTjYcB0/M= -k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= -k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= -k8s.io/apiextensions-apiserver v0.24.4 h1:w53Pm4zu8fCt9WfiRgS2YI6LE6I4NJ5aUi78GElD3K8= -k8s.io/apiextensions-apiserver v0.24.4/go.mod h1:iDK+Xb4jsPNnRGj5jU/WqqjLvt8363M7cKixKe1C9+U= -k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.4 h1:S0Ur3J/PbivTcL43EdSdPhqCqKla2NIuneNwZcTDeGQ= -k8s.io/apimachinery v0.24.4/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= -k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= -k8s.io/apiserver v0.24.4 h1:ei+OunC83pVEiagBeZhTnRZvkclHgpzs/rrm7aSBDYs= -k8s.io/apiserver v0.24.4/go.mod h1:mAuC3pZVc0IDXLx7lUHoisBOtBa1SobfLW/CI3klXQE= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= -k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.4 h1:hIAIJZIPyaw46AkxwyR0FRfM/pRxpUNTd3ysYu9vyRg= -k8s.io/client-go v0.24.4/go.mod h1:+AxlPWw/H6f+EJhRSjIeALaJT4tbeB/8g9BNvXGPd0Y= -k8s.io/cluster-bootstrap v0.24.4 h1:ZryK73DHK4dv5yAr5081yO03rrEK2Dz9jUtymqEle9Q= -k8s.io/cluster-bootstrap v0.24.4/go.mod h1:D9SYcEo302eah8yxFoPciGy8dRnReZr7fG+waTAvj14= -k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.4/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= -k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.4 h1:WEGRp06GBYVwxp5JdiRaJ1zkdOhrqucxRv/8IrABLG0= -k8s.io/component-base v0.24.4/go.mod h1:sWxkgcMfbYHadw0OJ0N+vIscd14/nqSIM2veCdg843o= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= -k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 h1:XmRqFcQlCy/lKRZ39j+RVpokYNroHPqV3mcBRfnhT5o= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2 h1:WjTt0uyUG+FJBodnrSzb1L3mHfkIgtgMnNQQ+NJMuT8= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2/go.mod h1:ZKM3W39Pl7uPuuB6mT/dWakgy1O8OcivGRCAZqSP+Hs= -sigs.k8s.io/cluster-api-provider-azure v1.6.1 h1:GpY9YLiUqovz4gwIEg2PRYOhJ5e/AG7sTHtoxzt6K4w= -sigs.k8s.io/cluster-api-provider-azure v1.6.1/go.mod h1:wM/V5BBRq+m5KCE9h5YVtMQ3qcIOsGBb7UDD/tXufko= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 h1:D0bDtSyRIcBmuGFyW65otEh+VIz8SGioaAjYok/cK5Y= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3/go.mod h1:EIWdG6qGX1iW0U5qiMi+EDQ9gmW7pylJwKDtHOkBQ6g= -sigs.k8s.io/cluster-api/test v1.2.8 h1:kYziHLSV+KqBoQXg7STGU4ZQpClayqIyw+BTYGx71uE= -sigs.k8s.io/cluster-api/test v1.2.8/go.mod h1:55r564Dm7/eO7LH76SRE8whfg4yUnsLz5akqqej4Q+8= -sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kind v0.15.0 h1:Fskj234L4hjQlsScCgeYvCBIRt06cjLzc7+kbr1u8Tg= -sigs.k8s.io/kind v0.15.0/go.mod h1:cKTqagdRyUQmihhBOd+7p43DpOPRn9rHsUC08K1Jbsk= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cmd/cli/plugin/cluster/kubeconfig.go b/cmd/cli/plugin/cluster/kubeconfig.go deleted file mode 100644 index 3da4d19716..0000000000 --- a/cmd/cli/plugin/cluster/kubeconfig.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" -) - -var clusterKubeconfigCmd = &cobra.Command{ - Use: "kubeconfig", - Short: "Cluster kubeconfig operations", - SilenceUsage: true, -} diff --git a/cmd/cli/plugin/cluster/kubeconfig_get.go b/cmd/cli/plugin/cluster/kubeconfig_get.go deleted file mode 100644 index 29d93e7159..0000000000 --- a/cmd/cli/plugin/cluster/kubeconfig_get.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "encoding/json" - - "github.com/aunum/log" - "github.com/pkg/errors" - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - tkgauth "github.com/vmware-tanzu/tanzu-framework/tkg/auth" - - tkgclient "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type getClusterKubeconfigOptions struct { - namespace string - exportFile string - adminKubeconfig bool -} - -var getKCOptions = &getClusterKubeconfigOptions{} - -var getClusterKubeconfigCmd = &cobra.Command{ - Use: "get CLUSTER_NAME", - Short: "Get kubeconfig of a cluster", - Long: `Get kubeconfig of a cluster and merge the context into the default kubeconfig file`, - Example: ` - # Get workload cluster kubeconfig - tanzu cluster kubeconfig get CLUSTER_NAME - - # Get workload cluster admin kubeconfig - tanzu cluster kubeconfig get CLUSTER_NAME --admin`, - Args: cobra.ExactArgs(1), - RunE: getKubeconfig, - SilenceUsage: true, -} - -func init() { - getClusterKubeconfigCmd.Flags().BoolVarP(&getKCOptions.adminKubeconfig, "admin", "", false, "Get admin kubeconfig of the workload cluster") - getClusterKubeconfigCmd.Flags().StringVarP(&getKCOptions.namespace, "namespace", "n", "", "The namespace where the workload cluster was created. Assumes 'default' if not specified.") - getClusterKubeconfigCmd.Flags().StringVarP(&getKCOptions.exportFile, "export-file", "", "", "File path to export a standalone kubeconfig for workload cluster") - - clusterKubeconfigCmd.AddCommand(getClusterKubeconfigCmd) -} - -func getKubeconfig(cmd *cobra.Command, args []string) error { - workloadClusterName := args[0] - - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("get cluster kubeconfig with a global server is not implemented yet") - } - return getClusterKubeconfig(server, workloadClusterName) -} - -func getClusterKubeconfig(server *configapi.Server, workloadClusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - if getKCOptions.adminKubeconfig { - return getAdminKubeconfig(tkgctlClient, workloadClusterName) - } - return getPinnipedKubeconfig(tkgctlClient, workloadClusterName) -} - -func getAdminKubeconfig(tkgctlClient tkgctl.TKGClient, workloadClusterName string) error { - getClusterCredentialsOptions := tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: workloadClusterName, - Namespace: getKCOptions.namespace, - ExportFile: getKCOptions.exportFile, - } - return tkgctlClient.GetCredentials(getClusterCredentialsOptions) -} - -func getPinnipedKubeconfig(tkgctlClient tkgctl.TKGClient, workloadClusterName string) error { - getClusterPinnipedInfoOptions := tkgctl.GetClusterPinnipedInfoOptions{ - ClusterName: workloadClusterName, - Namespace: getKCOptions.namespace, - IsManagementCluster: false, - } - - clusterPinnipedInfo, err := tkgctlClient.GetClusterPinnipedInfo(getClusterPinnipedInfoOptions) - if err != nil { - return err - } - - // For (legacy) workload clusters, the audience is just - audience := clusterPinnipedInfo.ClusterName - if clusterPinnipedInfo.ClusterAudience != nil { - audience = *clusterPinnipedInfo.ClusterAudience - } - - kubeconfig, err := tkgauth.GetPinnipedKubeconfig(clusterPinnipedInfo.ClusterInfo, clusterPinnipedInfo.PinnipedInfo, - clusterPinnipedInfo.ClusterName, audience) - - if err != nil { - return errors.Wrap(err, "unable to get kubeconfig") - } - - kubeconfigbytes, err := json.Marshal(kubeconfig) - if err != nil { - return errors.Wrap(err, "unable to marshall the kubeconfig") - } - err = tkgclient.MergeKubeConfigWithoutSwitchContext(kubeconfigbytes, getKCOptions.exportFile) - if err != nil { - return errors.Wrap(err, "unable to merge cluster kubeconfig into the current kubeconfig path") - } - - if getKCOptions.exportFile != "" { - log.Infof("You can now access the cluster by specifying '--kubeconfig %s' flag when using `kubectl` command \n", getKCOptions.exportFile) - } else { - log.Infof("You can now access the cluster by running 'kubectl config use-context %s'\n", kubeconfig.CurrentContext) - } - return nil -} diff --git a/cmd/cli/plugin/cluster/list.go b/cmd/cli/plugin/cluster/list.go deleted file mode 100644 index d4cd5db3ca..0000000000 --- a/cmd/cli/plugin/cluster/list.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "errors" - "strings" - - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type listClusterOptions struct { - namespace string - includeMC bool - outputFormat string - allNamespaces bool -} - -var lc = &listClusterOptions{} - -var listClustersCmd = &cobra.Command{ - Use: "list", - Short: "List clusters", - RunE: list, - SilenceUsage: true, -} - -func init() { - listClustersCmd.Flags().StringVarP(&lc.namespace, "namespace", "n", "default", "The namespace from which to list workload clusters. If not provided clusters from default namespace will be returned") - listClustersCmd.Flags().BoolVarP(&lc.allNamespaces, "all-namespaces", "A", false, "If present, list the cluster(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace.") - listClustersCmd.Flags().BoolVarP(&lc.includeMC, "include-management-cluster", "", false, "Show active management cluster information as well") - listClustersCmd.Flags().StringVarP(&lc.outputFormat, "output", "o", "", "Output format (yaml|json|table)") -} - -func list(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("listing cluster with a global server is not implemented yet") - } - return listClusters(cmd, server) -} - -//nolint:gocritic -func listClusters(cmd *cobra.Command, server *configapi.Server) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - ccOptions := tkgctl.ListTKGClustersOptions{ - ClusterName: "", - Namespace: lc.namespace, - IncludeMC: lc.includeMC, - AllNamespaces: lc.allNamespaces, - } - - clusters, err := tkgctlClient.GetClusters(ccOptions) - if err != nil { - return err - } - - var t component.OutputWriter - if lc.outputFormat == string(component.JSONOutputType) || lc.outputFormat == string(component.YAMLOutputType) { - t = component.NewObjectWriter(cmd.OutOrStdout(), lc.outputFormat, clusters) - } else { - t = component.NewOutputWriter(cmd.OutOrStdout(), lc.outputFormat, "NAME", "NAMESPACE", "STATUS", "CONTROLPLANE", "WORKERS", "KUBERNETES", "ROLES", "PLAN", "TKR") - for _, cl := range clusters { - clusterRoles := "" - if len(cl.Roles) != 0 { - clusterRoles = strings.Join(cl.Roles, ",") - } - t.AddRow(cl.Name, cl.Namespace, cl.Status, cl.ControlPlaneCount, cl.WorkerCount, cl.K8sVersion, clusterRoles, cl.Plan, cl.TKR) - } - } - t.Render() - - return nil -} diff --git a/cmd/cli/plugin/cluster/machinehealthcheck.go b/cmd/cli/plugin/cluster/machinehealthcheck.go deleted file mode 100644 index 3a8806537c..0000000000 --- a/cmd/cli/plugin/cluster/machinehealthcheck.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/command" -) - -const ( - controlPlaneLabel = "cluster.x-k8s.io/control-plane" - nodePoolLabel = "node-pool" - machineDeploymentLabel = "topology.cluster.x-k8s.io/deployment-name" -) - -var machineHealthCheckCmd = &cobra.Command{ - Use: "machinehealthcheck", - Short: "MachineHealthCheck operations for a cluster", - Long: `Get, set, or delete a MachineHealthCheck object for a Tanzu Kubernetes cluster`, - Aliases: []string{"mhc"}, - SilenceUsage: true, -} - -func init() { - machineHealthCheckCmd.AddCommand(machineHealthCheckControlPlaneCmd) - machineHealthCheckCmd.AddCommand(machineHealthCheckNodeCmd) - - command.DeprecateCommandWithAlternative(deleteMachineHealthCheckCmd, "1.5.0", "tanzu cluster machinehealthcheck node delete or tanzu cluster machinehealthcheck control-plane delete") - command.DeprecateCommandWithAlternative(getMachineHealthCheckCmd, "1.5.0", "tanzu cluster machinehealthcheck node get or tanzu cluster machinehealthcheck control-plane get") - command.DeprecateCommandWithAlternative(setMachineHealthCheckCmd, "1.5.0", "tanzu cluster machinehealthcheck node set or tanzu cluster machinehealthcheck control-plane set") -} diff --git a/cmd/cli/plugin/cluster/machinehealthcheck_control_plane.go b/cmd/cli/plugin/cluster/machinehealthcheck_control_plane.go deleted file mode 100644 index 53c14e5c47..0000000000 --- a/cmd/cli/plugin/cluster/machinehealthcheck_control_plane.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" -) - -var machineHealthCheckControlPlaneCmd = &cobra.Command{ - Use: "control-plane", - Short: "MachineHealthCheck operations for the control plane a cluster", - Long: `Get, set, or delete a MachineHealthCheck object for the control plane of a Tanzu Kubernetes cluster`, - SilenceUsage: true, -} diff --git a/cmd/cli/plugin/cluster/machinehealthcheck_node.go b/cmd/cli/plugin/cluster/machinehealthcheck_node.go deleted file mode 100644 index a0978b8877..0000000000 --- a/cmd/cli/plugin/cluster/machinehealthcheck_node.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" -) - -var machineHealthCheckNodeCmd = &cobra.Command{ - Use: "node", - Short: "MachineHealthCheck operations for the nodes of a cluster", - Long: `Get, set, or delete a MachineHealthCheck object for the nodes of a Tanzu Kubernetes cluster`, - SilenceUsage: true, -} diff --git a/cmd/cli/plugin/cluster/main.go b/cmd/cli/plugin/cluster/main.go deleted file mode 100644 index 3bc2d3ef94..0000000000 --- a/cmd/cli/plugin/cluster/main.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - "path/filepath" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "cluster", - Description: "Kubernetes cluster operations", - Group: cliapi.RunCmdGroup, - Aliases: []string{"cl", "clusters"}, - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, - DefaultFeatureFlags: DefaultFeatureFlagsForClusterPlugin, -} - -var logLevel int32 -var logFile string - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - - p.Cmd.PersistentFlags().Int32VarP(&logLevel, "verbose", "v", 0, "Number for the log level verbosity(0-9)") - p.Cmd.PersistentFlags().StringVar(&logFile, "log-file", "", "Log file path") - p.Cmd.SilenceUsage = true - p.AddCommands( - createClusterCmd, - listClustersCmd, - deleteClusterCmd, - upgradeClusterCmd, - scaleClusterCmd, - machineHealthCheckCmd, - credentialsCmd, - clusterKubeconfigCmd, - getClustersCmd, - availableUpgradesCmd, - clusterNodePoolCmd, - ) - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func getConfigDir() (string, error) { - tanzuConfigDir, err := config.LocalDir() - if err != nil { - return "", err - } - return filepath.Join(tanzuConfigDir, "tkg"), nil -} - -func createTKGClient(kubeconfig, kubecontext string) (tkgctl.TKGClient, error) { - configDir, err := getConfigDir() - if err != nil { - return nil, err - } - return tkgctl.New(tkgctl.Options{ - ConfigDir: configDir, - KubeConfig: kubeconfig, - KubeContext: kubecontext, - LogOptions: tkgctl.LoggingOptions{Verbosity: logLevel, File: logFile}, - }) -} diff --git a/cmd/cli/plugin/cluster/node_pool.go b/cmd/cli/plugin/cluster/node_pool.go deleted file mode 100644 index d34aa8c7da..0000000000 --- a/cmd/cli/plugin/cluster/node_pool.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" -) - -var clusterNodePoolCmd = &cobra.Command{ - Use: "node-pool", - Short: "Cluster node-pool operations", - SilenceUsage: true, -} diff --git a/cmd/cli/plugin/cluster/scale.go b/cmd/cli/plugin/cluster/scale.go deleted file mode 100644 index 3f513b098a..0000000000 --- a/cmd/cli/plugin/cluster/scale.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "errors" - - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type scaleClustersOptions struct { - namespace string - nodePoolName string - workerCount int32 - controlPlaneCount int32 -} - -var sc = &scaleClustersOptions{} - -var scaleClusterCmd = &cobra.Command{ - Use: "scale CLUSTER_NAME", - Short: "Scale a cluster", - Args: cobra.ExactArgs(1), - RunE: scale, - SilenceUsage: true, -} - -func init() { - scaleClusterCmd.Flags().Int32VarP(&sc.workerCount, "worker-machine-count", "w", 0, "The number of worker nodes to scale to. Assumes unchanged if not specified") - scaleClusterCmd.Flags().Int32VarP(&sc.controlPlaneCount, "controlplane-machine-count", "c", 0, "The number of control plane nodes to scale to. Assumes unchanged if not specified") - scaleClusterCmd.Flags().StringVarP(&sc.nodePoolName, "node-pool-name", "p", "", "The name of the node-pool to scale") - scaleClusterCmd.Flags().StringVarP(&sc.namespace, "namespace", "n", "", "The namespace where the workload cluster was created. Assumes 'default' if not specified.") -} - -func scale(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("scaling cluster with a global server is not implemented yet") - } - return scaleCluster(server, args[0]) -} - -func scaleCluster(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - scaleClusterOptions := tkgctl.ScaleClusterOptions{ - ClusterName: clusterName, - ControlPlaneCount: sc.controlPlaneCount, - WorkerCount: sc.workerCount, - Namespace: sc.namespace, - NodePoolName: sc.nodePoolName, - } - - return tkgctlClient.ScaleCluster(scaleClusterOptions) -} diff --git a/cmd/cli/plugin/cluster/set_machinehealthcheck.go b/cmd/cli/plugin/cluster/set_machinehealthcheck.go deleted file mode 100644 index ab9f489230..0000000000 --- a/cmd/cli/plugin/cluster/set_machinehealthcheck.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main // nolint:dupl - -import ( - "errors" - - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type setMachineHealthCheckOptions struct { - machineHealthCheckName string - namespace string - matchLabels string - unhealthyConditions string - nodeStartupTimeout string -} - -var setMHC = &setMachineHealthCheckOptions{} - -var setMachineHealthCheckCmd = &cobra.Command{ - Use: "set CLUSTER_NAME", - Short: "Create or update a MachineHealthCheck for a cluster", - Long: "Create or update a MachineHealthCheck for a cluster", - Args: cobra.ExactArgs(1), - RunE: setMachineHealthCheck, - SilenceUsage: true, -} - -func init() { - setMachineHealthCheckCmd.Flags().StringVarP(&setMHC.machineHealthCheckName, "mhc-name", "m", "", "Name of the MachineHealthCheck object") - setMachineHealthCheckCmd.Flags().StringVarP(&setMHC.namespace, "namespace", "n", "", "Namespace of the cluster") - setMachineHealthCheckCmd.Flags().StringVar(&setMHC.nodeStartupTimeout, "node-startup-timeout", "", "Any machine being created that takes longer than this duration to join the cluster is considered to have failed and will be remediated") - setMachineHealthCheckCmd.Flags().StringVar(&setMHC.matchLabels, "match-labels", "", "Label selector to match machines whose health will be exercised") - setMachineHealthCheckCmd.Flags().StringVar(&setMHC.unhealthyConditions, "unhealthy-conditions", "", "A list of the conditions that determine whether a node is considered unhealthy. Available condition types: [Ready, MemoryPressure,DiskPressure,PIDPressure, NetworkUnavailable], Available condition status: [True, False, Unknown]") - machineHealthCheckCmd.AddCommand(setMachineHealthCheckCmd) -} - -func setMachineHealthCheck(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("setting machine healthcheck with a global server is not implemented yet") - } - return runCreateMachineHealthCheck(server, args[0]) -} - -func runCreateMachineHealthCheck(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - options := tkgctl.SetMachineHealthCheckOptions{ - ClusterName: clusterName, - MachineHealthCheckName: setMHC.machineHealthCheckName, - Namespace: setMHC.namespace, - MatchLabels: setMHC.matchLabels, - UnhealthyConditions: setMHC.unhealthyConditions, - NodeStartupTimeout: setMHC.nodeStartupTimeout, - } - return tkgctlClient.SetMachineHealthCheck(options) -} diff --git a/cmd/cli/plugin/cluster/set_machinehealthcheck_control_plane.go b/cmd/cli/plugin/cluster/set_machinehealthcheck_control_plane.go deleted file mode 100644 index 2212c122e6..0000000000 --- a/cmd/cli/plugin/cluster/set_machinehealthcheck_control_plane.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "errors" - - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type setMachineHealthCheckCPOptions struct { - machineHealthCheckName string - namespace string - matchLabels string - unhealthyConditions string - nodeStartupTimeout string -} - -var setMHCCP = &setMachineHealthCheckCPOptions{} - -var setMachineHealthCheckCPCmd = &cobra.Command{ - Use: "set CLUSTER_NAME", - Short: "Create or update a MachineHealthCheck for a cluster", - Long: "Create or update a MachineHealthCheck for a cluster", - Args: cobra.ExactArgs(1), - RunE: setMachineHealthCheckCP, - SilenceUsage: true, -} - -func init() { - setMachineHealthCheckCPCmd.Flags().StringVarP(&setMHCCP.machineHealthCheckName, "mhc-name", "m", "", "Name of the MachineHealthCheck object") - setMachineHealthCheckCPCmd.Flags().StringVarP(&setMHCCP.namespace, "namespace", "n", "", "Namespace of the cluster") - setMachineHealthCheckCPCmd.Flags().StringVar(&setMHCCP.nodeStartupTimeout, "node-startup-timeout", "", "Any machine being created that takes longer than this duration to join the cluster is considered to have failed and will be remediated") - setMachineHealthCheckCPCmd.Flags().StringVar(&setMHCCP.matchLabels, "match-labels", "", "Label selector to match machines whose health will be exercised") - setMachineHealthCheckCPCmd.Flags().StringVar(&setMHCCP.unhealthyConditions, "unhealthy-conditions", "", "A list of the conditions that determine whether a node is considered unhealthy. Available condition types: [Ready, MemoryPressure,DiskPressure,PIDPressure, NetworkUnavailable], Available condition status: [True, False, Unknown]") - machineHealthCheckControlPlaneCmd.AddCommand(setMachineHealthCheckCPCmd) -} - -func setMachineHealthCheckCP(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("setting machine healthcheck with a global server is not implemented yet") - } - return runCreateMachineHealthCheckCP(server, args[0]) -} - -func runCreateMachineHealthCheckCP(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - if setMHCCP.matchLabels == "" { - setMHCCP.matchLabels = controlPlaneLabel + ": " - } - - options := tkgctl.SetMachineHealthCheckOptions{ - ClusterName: clusterName, - MachineHealthCheckName: setMHCCP.machineHealthCheckName, - Namespace: setMHCCP.namespace, - MatchLabels: setMHCCP.matchLabels, - UnhealthyConditions: setMHCCP.unhealthyConditions, - NodeStartupTimeout: setMHCCP.nodeStartupTimeout, - } - return tkgctlClient.SetMachineHealthCheck(options) -} diff --git a/cmd/cli/plugin/cluster/set_machinehealthcheck_node.go b/cmd/cli/plugin/cluster/set_machinehealthcheck_node.go deleted file mode 100644 index 2b77a36cd9..0000000000 --- a/cmd/cli/plugin/cluster/set_machinehealthcheck_node.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main // nolint:dupl - -import ( - "errors" - - "github.com/spf13/cobra" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type setMachineHealthCheckNodeOptions struct { - machineHealthCheckName string - namespace string - matchLabels string - unhealthyConditions string - nodeStartupTimeout string -} - -var setMHCNode = &setMachineHealthCheckNodeOptions{} - -var setMachineHealthCheckNodeCmd = &cobra.Command{ - Use: "set CLUSTER_NAME", - Short: "Create or update a MachineHealthCheck for a cluster", - Long: "Create or update a MachineHealthCheck for a cluster", - Args: cobra.ExactArgs(1), - RunE: setMachineHealthCheckNode, - SilenceUsage: true, -} - -func init() { - setMachineHealthCheckNodeCmd.Flags().StringVarP(&setMHCNode.machineHealthCheckName, "mhc-name", "m", "", "Name of the MachineHealthCheck object") - setMachineHealthCheckNodeCmd.Flags().StringVarP(&setMHCNode.namespace, "namespace", "n", "", "Namespace of the cluster") - setMachineHealthCheckNodeCmd.Flags().StringVar(&setMHCNode.nodeStartupTimeout, "node-startup-timeout", "", "Any machine being created that takes longer than this duration to join the cluster is considered to have failed and will be remediated") - setMachineHealthCheckNodeCmd.Flags().StringVar(&setMHCNode.matchLabels, "match-labels", "", "Label selector to match machines whose health will be exercised") - setMachineHealthCheckNodeCmd.Flags().StringVar(&setMHCNode.unhealthyConditions, "unhealthy-conditions", "", "A list of the conditions that determine whether a node is considered unhealthy. Available condition types: [Ready, MemoryPressure,DiskPressure,PIDPressure, NetworkUnavailable], Available condition status: [True, False, Unknown]") - machineHealthCheckNodeCmd.AddCommand(setMachineHealthCheckNodeCmd) -} - -func setMachineHealthCheckNode(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("setting machine healthcheck with a global server is not implemented yet") - } - return runCreateMachineHealthCheckNode(server, args[0]) -} - -func runCreateMachineHealthCheckNode(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - options := tkgctl.SetMachineHealthCheckOptions{ - ClusterName: clusterName, - MachineHealthCheckName: setMHCNode.machineHealthCheckName, - Namespace: setMHCNode.namespace, - MatchLabels: setMHCNode.matchLabels, - UnhealthyConditions: setMHCNode.unhealthyConditions, - NodeStartupTimeout: setMHCNode.nodeStartupTimeout, - } - return tkgctlClient.SetMachineHealthCheck(options) -} diff --git a/cmd/cli/plugin/cluster/set_node_pool.go b/cmd/cli/plugin/cluster/set_node_pool.go deleted file mode 100644 index 7f770e7e5b..0000000000 --- a/cmd/cli/plugin/cluster/set_node_pool.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - "os" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - "gopkg.in/yaml.v3" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -type clusterSetNodePoolCmdOptions struct { - FilePath string - Namespace string - BaseMachineDeployment string -} - -var setNodePoolOptions clusterSetNodePoolCmdOptions - -var clusterSetNodePoolCmd = &cobra.Command{ - Use: "set CLUSTER_NAME", - Short: "Set node pool for cluster", - Args: cobra.ExactArgs(1), - RunE: runSetNodePool, - SilenceUsage: true, -} - -func init() { - clusterSetNodePoolCmd.Flags().StringVarP(&setNodePoolOptions.FilePath, "file", "f", "", "The file describing the node pool (required)") - clusterSetNodePoolCmd.Flags().StringVar(&setNodePoolOptions.Namespace, "namespace", "default", "The namespace the cluster is found in.") - clusterSetNodePoolCmd.Flags().StringVar(&setNodePoolOptions.BaseMachineDeployment, "base-machine-deployment", "", "The machine deployment to use as a base for creating a new node pool (ignored for TKGs)") - _ = clusterSetNodePoolCmd.MarkFlagRequired("file") - clusterNodePoolCmd.AddCommand(clusterSetNodePoolCmd) -} - -func runSetNodePool(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("setting node pool with a global server is not implemented yet") - } - return SetNodePool(server, args[0]) -} - -// SetNodePool creates or updates a node pool -func SetNodePool(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - var nodePool client.NodePool - var fileContent []byte - if fileContent, err = os.ReadFile(setNodePoolOptions.FilePath); err != nil { - return fmt.Errorf("unable to read file %s", setNodePoolOptions.FilePath) - } - - if err = yaml.Unmarshal(fileContent, &nodePool); err != nil { - return errors.Wrap(err, "Could not parse file contents") - } - nodePool.BaseMachineDeployment = setNodePoolOptions.BaseMachineDeployment - - options := client.SetMachineDeploymentOptions{ - ClusterName: clusterName, - Namespace: setNodePoolOptions.Namespace, - NodePool: nodePool, - } - - err = tkgctlClient.SetMachineDeployment(&options) - if err == nil { - log.Infof("Cluster update for node pool '%s' completed successfully", options.Name) - } - return err -} diff --git a/cmd/cli/plugin/cluster/test/available_upgrades.go b/cmd/cli/plugin/cluster/test/available_upgrades.go deleted file mode 100644 index 96c1ab2ec1..0000000000 --- a/cmd/cli/plugin/cluster/test/available_upgrades.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - "strings" - - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var availableUpgradesTest *clitest.Test - -func initAvailableUpgrades() { - clusterAvailableUpgradesCommand := fmt.Sprintf("cluster available-upgrades get %s", clusterName) - - availableUpgradesTest = clitest.NewTest("available-upgrades for cluster", clusterAvailableUpgradesCommand, func(t *clitest.Test) error { - fmt.Printf("available upgrade test : clustername: %s\n", clusterName) - fmt.Printf("available upgrade test : command : %s\n", t.Command) - if err := t.Exec(); err != nil { - return err - } - stdOut := t.StdOut() - so := stdOut.String() - // TODO: update the test to deterministically expects the available upgrades - // If there are no available upgrades return success else check if the required columns are present - if strings.Contains(so, "no available upgrades for cluster") { - return nil - } - if !strings.Contains(so, "NAME") { - return fmt.Errorf("available upgrade list doesn't contain NAME column, got : %v", so) - } - if !strings.Contains(so, "VERSION") { - return fmt.Errorf("available upgrade list doesn't contain VERSION column, got: %v", so) - } - if !strings.Contains(so, "COMPATIBLE") { - return fmt.Errorf("available upgrade list doesn't contain COMPATIBLE column, got: %v", so) - } - return nil - }) -} diff --git a/cmd/cli/plugin/cluster/test/cluster_silentmode.go b/cmd/cli/plugin/cluster/test/cluster_silentmode.go deleted file mode 100644 index 187c26be51..0000000000 --- a/cmd/cli/plugin/cluster/test/cluster_silentmode.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var ( - createClusterNegTestSilentMode *clitest.Test - deleteClusterNegTestSilentMode *clitest.Test - availableUpgradesGetNegTestSilentMode *clitest.Test - credUpdateNegTestSilentMode *clitest.Test - clusterGetTestSilentMode *clitest.Test - clusterKubeconfGetSilentMode *clitest.Test - clusterMHGet *clitest.Test - clusterNodePoolSetSilentMode *clitest.Test - clusterNodePoolListSilentMode *clitest.Test - clusterNodePoolDeleteSilentMode *clitest.Test - clusterScaleSilentMode *clitest.Test - clusterUpgradeSilentMode *clitest.Test -) - -var FuncToExecAndValidateStdError = func(t *clitest.Test) error { - if err := t.ExecNotContainsStdErrorString(usage); err != nil { - return err - } - return nil -} - -// initClusterSilentModeUsecases has test definitions to test silentUsage use cases for the command 'cluster' and its sub-commands. -// all test cases in this function, tests that the commands out put should not print "Usage:" info as "silentUSage" set true for command 'cluster' and its sub-commands. -func initClusterSilentModeUsecases() { - createClusterNegTestSilentMode = clitest.NewTest("create cluster", "cluster create", FuncToExecAndValidateStdError) - deleteClusterNegTestSilentMode = clitest.NewTest("delete cluster", "cluster delete", FuncToExecAndValidateStdError) - availableUpgradesGetNegTestSilentMode = clitest.NewTest("cluster available-upgrades get", "cluster available-upgrades get", FuncToExecAndValidateStdError) - clusterGetTestSilentMode = clitest.NewTest("cluster get", "cluster get", FuncToExecAndValidateStdError) - credUpdateNegTestSilentMode = clitest.NewTest("cluster credentials update", "cluster credentials update", FuncToExecAndValidateStdError) - clusterKubeconfGetSilentMode = clitest.NewTest("cluster kubeconfig get", "cluster kubeconfig get", FuncToExecAndValidateStdError) - clusterMHGet = clitest.NewTest("cluster machinehealthcheck node get", "cluster machinehealthcheck node get", FuncToExecAndValidateStdError) - clusterNodePoolSetSilentMode = clitest.NewTest("cluster node-pool set", "cluster node-pool set", FuncToExecAndValidateStdError) - clusterNodePoolListSilentMode = clitest.NewTest("cluster node-pool list", "cluster node-pool list", FuncToExecAndValidateStdError) - clusterNodePoolDeleteSilentMode = clitest.NewTest("cluster node-pool delete", "cluster node-pool delete", FuncToExecAndValidateStdError) - clusterScaleSilentMode = clitest.NewTest("cluster scale", "cluster scale", FuncToExecAndValidateStdError) - clusterUpgradeSilentMode = clitest.NewTest("cluster upgrade", "cluster upgrade", FuncToExecAndValidateStdError) -} diff --git a/cmd/cli/plugin/cluster/test/create.go b/cmd/cli/plugin/cluster/test/create.go deleted file mode 100644 index ef70417b84..0000000000 --- a/cmd/cli/plugin/cluster/test/create.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - "log" - "os" - - "sigs.k8s.io/yaml" - - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -var ( - createClusterCommand string - clusterName string - plan string - createClusterTest *clitest.Test -) - -const ( - devPlanName = "dev" -) - -func initClusterCreate() { - clusterName = tconf.ClusterPrefix + clitest.GenerateName() - plan = devPlanName - - configFile, err := os.CreateTemp("", clusterName) - if err != nil { - log.Fatal(err) - } - - createClusterCommand = fmt.Sprintf("cluster create -v3 -f %s", configFile.Name()) - createClusterTest = clitest.NewTest("create cluster", createClusterCommand, func(t *clitest.Test) error { - defer os.Remove(configFile.Name()) - - configVars := make(map[string]string) - configVars[constants.ConfigVariableClusterName] = clusterName - configVars[constants.ConfigVariableClusterPlan] = plan - out, err := yaml.Marshal(configVars) - if err != nil { - return err - } - - err = os.WriteFile(configFile.Name(), out, 0644) - if err != nil { - return err - } - - err = t.ExecContainsErrorString(fmt.Sprintf("Workload cluster '%s' created", clusterName)) - if err != nil { - return err - } - - return nil - }) -} diff --git a/cmd/cli/plugin/cluster/test/delete.go b/cmd/cli/plugin/cluster/test/delete.go deleted file mode 100644 index 8b9338a607..0000000000 --- a/cmd/cli/plugin/cluster/test/delete.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var ( - deleteClusterTest *clitest.Test -) - -func initClusterDelete() { - deleteClusterCommand := fmt.Sprintf("cluster delete %s -y", clusterName) - deleteClusterTest = clitest.NewTest("delete cluster", deleteClusterCommand, func(t *clitest.Test) error { - if err := t.ExecContainsErrorString(fmt.Sprintf("Workload cluster '%s' is being deleted ", clusterName)); err != nil { - return err - } - - return nil - }) -} diff --git a/cmd/cli/plugin/cluster/test/list.go b/cmd/cli/plugin/cluster/test/list.go deleted file mode 100644 index e364ec85f2..0000000000 --- a/cmd/cli/plugin/cluster/test/list.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "encoding/json" - "fmt" - - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var listClusterTest = clitest.NewTest("list clusters", "cluster list -o json", func(t *clitest.Test) error { - if err := t.Exec(); err != nil { - return err - } - - var clusters []map[string]interface{} - stdOut := t.StdOut() - if err := json.Unmarshal(stdOut.Bytes(), &clusters); err != nil { - return err - } - - for _, cluster := range clusters { - name := cluster["name"].(string) - if name == clusterName { - return nil - } - } - - return fmt.Errorf("unable to get cluster %s", clusterName) -}) diff --git a/cmd/cli/plugin/cluster/test/main.go b/cmd/cli/plugin/cluster/test/main.go deleted file mode 100644 index c0027a98b3..0000000000 --- a/cmd/cli/plugin/cluster/test/main.go +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - "sigs.k8s.io/yaml" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -const ( - defaultClusterPrefix = "tanzu-cli-cluster-" - defaultInfrastructureProvider = "docker" -) - -type testConfig struct { - InfrastructureName string `json:"infrastructure_name,omitempty"` - UseExistingCluster bool `json:"use_existing_cluster,omitempty"` - ManagementClusterName string `json:"management_cluster_name,omitempty"` - ClusterPrefix string `json:"cluster_prefix,omitempty"` -} - -var tconf *testConfig -var descriptor = clitest.NewTestFor("cluster") - -var _ = func() error { - tconf = &testConfig{} - var testConfigData []byte - var err error - - if testConfigPath, ok := os.LookupEnv("CLUSTER_TEST_CONFIG"); ok { - log.Printf("Reading test config from file %s\n", testConfigPath) - - if testConfigData, err = os.ReadFile(testConfigPath); err != nil { - log.Fatal(err) - } - - if err = yaml.Unmarshal(testConfigData, tconf); err != nil { - log.Fatal(err) - } - } - - tconf.defaults() - - return err -}() - -func (c *testConfig) defaults() { - if c.ClusterPrefix == "" { - c.ClusterPrefix = defaultClusterPrefix - } - - if c.InfrastructureName == "" { - c.InfrastructureName = defaultInfrastructureProvider - } - - if c.ManagementClusterName == "" { - c.ManagementClusterName = c.ClusterPrefix + "mc" - } -} - -func init() { - // Init the tests as per the dependency - initManagementClusterSilentUsage() - initManagementCluster() - initClusterSilentModeUsecases() - initClusterCreate() - initAvailableUpgrades() - initClusterDelete() -} - -func main() { - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - m := clitest.NewMain("cluster", c, Cleanup) - defer m.Finish() - - err := silenceUsageMCTestCases(m) - if err != nil { - return err - } - err = silenceUsageClusterTestCases(m) - if err != nil { - return err - } - // create management-cluster - if !tconf.UseExistingCluster { - m.AddTest(createManagementClusterTest) - if err := createManagementClusterTest.Run(); err != nil { - return err - } - } - - // create workload cluster - m.AddTest(createClusterTest) - if err := createClusterTest.Run(); err != nil { - return err - } - - // list workload clusters - m.AddTest(listClusterTest) - if err := listClusterTest.Run(); err != nil { - return err - } - - // get the available upgrades for cluster - m.AddTest(availableUpgradesTest) - if err := availableUpgradesTest.Run(); err != nil { - return err - } - - // delete workload cluster - if err := deleteClusterTest.Run(); err != nil { - return err - } - - // delete management cluster - if !tconf.UseExistingCluster { - if err := deleteManagementCusterTest.Run(); err != nil { - return err - } - } - - return nil -} - -func silenceUsageMCTestCases(m *clitest.Main) error { - // Test use case# management-cluster : SilenceUsage: true : should not print Usage info - m.AddTest(mcUnAvailCmdSilentUsage) - if err := mcUnAvailCmdSilentUsage.Run(); err != nil { - return err - } - - // Test use case# management-cluster ceip-participation set : SilenceUsage: true : should not print Usage: information - m.AddTest(mcCeipSetSilentUsage) - if err := mcCeipSetSilentUsage.Run(); err != nil { - return err - } - - // Test use case# management-cluster create -nonExistsFlag : SilenceUsage: true : should not print Usage: information - m.AddTest(mcCreateNonExistsFlagSilentUsage) - if err := mcCreateNonExistsFlagSilentUsage.Run(); err != nil { - return err - } - - // Test use case# management-cluster create : SilenceUsage: true : should not print Usage: information - m.AddTest(mcCreateSilentUage) - if err := mcCreateSilentUage.Run(); err != nil { - return err - } - return nil -} - -func silenceUsageClusterTestCases(m *clitest.Main) error { - // Test use case# cluster create : SilenceUsage: true : should not print Usage info - m.AddTest(createClusterNegTestSilentMode) - if err := createClusterNegTestSilentMode.Run(); err != nil { - return err - } - - // Test use case# cluster delete : SilenceUsage: true : should not print Usage info - m.AddTest(deleteClusterNegTestSilentMode) - if err := deleteClusterNegTestSilentMode.Run(); err != nil { - return err - } - - // Test use case# cluster available-upgrades get : SilenceUsage: true : should not print Usage info - m.AddTest(availableUpgradesGetNegTestSilentMode) - if err := availableUpgradesGetNegTestSilentMode.Run(); err != nil { - return err - } - - // Test use case# cluster available-upgrades get : SilenceUsage: true : should not print Usage info - m.AddTest(credUpdateNegTestSilentMode) - if err := credUpdateNegTestSilentMode.Run(); err != nil { - return err - } - // Test use case: cluster get : SilenceUsage : true : should not print Usage info - m.AddTest(clusterGetTestSilentMode) - if err := clusterGetTestSilentMode.Run(); err != nil { - return err - } - // Test use case: cluster kubeconfig get : SilenceUsage : true : should not print Usage info - m.AddTest(clusterKubeconfGetSilentMode) - if err := clusterKubeconfGetSilentMode.Run(); err != nil { - return err - } - - // Test use case: cluster machinehealthcheck node get : SilenceUsage : true : should not print Usage info - m.AddTest(clusterMHGet) - if err := clusterMHGet.Run(); err != nil { - return err - } - - // Test use case: cluster node-pool set : SilenceUsage : true : should not print Usage info - m.AddTest(clusterNodePoolSetSilentMode) - if err := clusterNodePoolSetSilentMode.Run(); err != nil { - return err - } - - // Test use case: cluster node-pool list : SilenceUsage : true : should not print Usage info - m.AddTest(clusterNodePoolListSilentMode) - if err := clusterNodePoolListSilentMode.Run(); err != nil { - return err - } - - // Test use case: cluster node-pool delete : SilenceUsage : true : should not print Usage info - m.AddTest(clusterNodePoolDeleteSilentMode) - if err := clusterNodePoolDeleteSilentMode.Run(); err != nil { - return err - } - - // Test use case: cluster scale : SilenceUsage : true : should not print Usage info - m.AddTest(clusterScaleSilentMode) - if err := clusterScaleSilentMode.Run(); err != nil { - return err - } - - // Test use case: cluster upgrade : SilenceUsage : true : should not print Usage info - m.AddTest(clusterUpgradeSilentMode) - if err := clusterUpgradeSilentMode.Run(); err != nil { - return err - } - return nil -} - -// Cleanup the test. -func Cleanup() error { - return nil -} diff --git a/cmd/cli/plugin/cluster/test/management_cluster.go b/cmd/cli/plugin/cluster/test/management_cluster.go deleted file mode 100644 index 52c98ed04c..0000000000 --- a/cmd/cli/plugin/cluster/test/management_cluster.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - "log" - "os" - - "sigs.k8s.io/yaml" - - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -var ( - createManagementClusterTest *clitest.Test - deleteManagementCusterTest *clitest.Test - mcUnAvailCmdSilentUsage *clitest.Test - mcCeipSetSilentUsage *clitest.Test - mcCreateNonExistsFlagSilentUsage *clitest.Test - mcCreateSilentUage *clitest.Test -) - -const ( - usage = "Usage:" -) - -func initManagementCluster() { - mcConfigFile, err := os.CreateTemp("", tconf.ManagementClusterName) - if err != nil { - log.Fatal(err) - } - - createMcCommand := fmt.Sprintf("management-cluster create -v3 -f %s", mcConfigFile.Name()) - createManagementClusterTest = clitest.NewTest("create management-cluster", createMcCommand, func(t *clitest.Test) error { - defer os.Remove(mcConfigFile.Name()) - - configVars := make(map[string]string) - configVars[constants.ConfigVariableClusterName] = tconf.ManagementClusterName - configVars[constants.ConfigVariableClusterPlan] = "dev" - configVars[constants.ConfigVariableInfraProvider] = tconf.InfrastructureName - configVars[constants.ConfigVariableCNI] = "calico" - - out, err := yaml.Marshal(configVars) - if err != nil { - return err - } - if err := os.WriteFile(mcConfigFile.Name(), out, 0644); err != nil { - return err - } - if err := t.ExecContainsErrorString("Management cluster created!"); err != nil { - return err - } - return nil - }) - - deleteManagementCusterTest = clitest.NewTest("delete management-cluster", "management-cluster delete -v3 -y --force", func(t *clitest.Test) error { - if err := t.Exec(); err != nil { - return err - } - return nil - }) -} - -// initManagementClusterSilentUsage has test definitions to test silentUsage use cases for the command 'management-cluster' and its sub-commands. -// all test cases in this function, tests that the commands out put should not print "Usage:" info as "silentUSage" set true for command 'management-cluster' and its sub-commands. -func initManagementClusterSilentUsage() { - mcUnAvailCmdSilentUsage = clitest.NewTest("create management-cluster", "management-cluster UnAvailableSubCommand", FuncToExecAndValidateStdError) - mcCeipSetSilentUsage = clitest.NewTest("management-cluster ceip-participation set", "management-cluster ceip-participation set", FuncToExecAndValidateStdError) - mcCreateNonExistsFlagSilentUsage = clitest.NewTest("management-cluster create -nonExistsFlag", "management-cluster create -nonExistsFlag", FuncToExecAndValidateStdError) - mcCreateSilentUage = clitest.NewTest("management-cluster create", "management-cluster create", FuncToExecAndValidateStdError) -} diff --git a/cmd/cli/plugin/cluster/testdata/kubeconfig1.yaml b/cmd/cli/plugin/cluster/testdata/kubeconfig1.yaml deleted file mode 100644 index 3f5b74c65d..0000000000 --- a/cmd/cli/plugin/cluster/testdata/kubeconfig1.yaml +++ /dev/null @@ -1,35 +0,0 @@ -apiVersion: v1 -clusters: -- cluster: - server: http://cow.org:8080 - name: cow-cluster -- cluster: - insecure-skip-tls-verify: true - server: https://horse.org:4443 - name: horse-cluster -- cluster: - insecure-skip-tls-verify: true - server: https://pig.org:443 - name: pig-cluster -contexts: -- context: - cluster: horse-cluster - user: green-user - name: federal-context -- context: - cluster: pig-cluster - namespace: saw-ns - user: black-user - name: queen-anne-context -current-context: federal-context -kind: Config -preferences: - colors: true -users: -- name: blue-user - user: - token: blue-token -- name: green-user - user: - client-certificate-data: ZmFrZS1jbGllbnQtY2VydGlmaWNhdGUtZGF0YS12YWx1ZQ== # fake-client-certificate-data-value - client-key-data: ZmFrZS1jbGllbnQta2V5LWRhdGEtdmFsdWU= # fake-client-key-data-value diff --git a/cmd/cli/plugin/cluster/testdata/tanzuconfig/config1.yaml b/cmd/cli/plugin/cluster/testdata/tanzuconfig/config1.yaml deleted file mode 100644 index 656bd2b355..0000000000 --- a/cmd/cli/plugin/cluster/testdata/tanzuconfig/config1.yaml +++ /dev/null @@ -1,11 +0,0 @@ -clientOptions: - cli: - repositories: - - gcpPluginRepository: - bucketName: tanzu-cli - name: core - - gcpPluginRepository: - bucketName: tanzu-cli-advanced-plugins - name: advanced -metadata: - creationTimestamp: null diff --git a/cmd/cli/plugin/cluster/testdata/tanzuconfig/config2.yaml b/cmd/cli/plugin/cluster/testdata/tanzuconfig/config2.yaml deleted file mode 100644 index 471b0077b8..0000000000 --- a/cmd/cli/plugin/cluster/testdata/tanzuconfig/config2.yaml +++ /dev/null @@ -1,15 +0,0 @@ -clientOptions: - cli: - repositories: - - gcpPluginRepository: - bucketName: tanzu-cli - name: core -current: vsphere-mc-1 -metadata: - creationTimestamp: null -servers: -- managementClusterOpts: - context: "" - path: "" - name: vsphere-mc-1 - type: managementcluster diff --git a/cmd/cli/plugin/cluster/upgrade.go b/cmd/cli/plugin/cluster/upgrade.go deleted file mode 100644 index cd73de9b2f..0000000000 --- a/cmd/cli/plugin/cluster/upgrade.go +++ /dev/null @@ -1,408 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - "sort" - "strings" - "time" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - capiv1 "sigs.k8s.io/cluster-api/api/v1beta1" - capiconditions "sigs.k8s.io/cluster-api/util/conditions" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/clusters" - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/version" - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - tkrutils "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -type upgradeClustersOptions struct { - namespace string - tkrName string - timeout time.Duration - unattended bool - osName string - osVersion string - osArch string - vSphereTemplateName string -} - -const ( - LegacyClusterTKRLabel = "tanzuKubernetesRelease" -) - -var uc = &upgradeClustersOptions{} - -var upgradeClusterCmd = &cobra.Command{ - Use: "upgrade CLUSTER_NAME", - Short: "Upgrade a cluster", - Args: cobra.ExactArgs(1), - Example: ` - # Upgrade a workload cluster - tanzu cluster upgrade wc-1 - - # Upgrade a workload cluster with specific tkr v1.20.1---vmware.1-tkg.2 - tanzu cluster upgrade wc-1 --tkr v1.20.1---vmware.1-tkg.2 - - # Upgrade a workload cluster with tkr prefix v1.20.1 - tanzu cluster upgrade wc-1 --tkr v1.20.1 - - # Upgrade a workload cluster using specific os name (vsphere) - tanzu cluster upgrade wc-1 --os-name photon - - # Upgrade a workload cluster using specific os name and version - tanzu cluster upgrade wc-1 --os-name ubuntu --os-version 20.04 - - # Upgrade a workload cluster using specific os name, version and arch - tanzu cluster upgrade wc-1 --os-name ubuntu --os-version 20.04 --os-arch amd64 - - [+] : Options available for: os-name, os-version, os-arch are as follows: - vSphere: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name photon --os-version 3 --os-arch amd64 - aws: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name amazon --os-version 2 --os-arch amd64 - azure: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name ubuntu --os-version 18.04 --os-arch amd64 -`, - RunE: upgrade, - SilenceUsage: true, -} - -func init() { - upgradeClusterCmd.Flags().StringVarP(&uc.tkrName, "tkr", "", "", "TanzuKubernetesRelease(TKr) to upgrade to. If TKr name prefix is provided, the latest compatible TKr matching the TKr name prefix would be used") - upgradeClusterCmd.Flags().StringVarP(&uc.namespace, "namespace", "n", "", "The namespace where the workload cluster was created. Assumes 'default' if not specified") - upgradeClusterCmd.Flags().DurationVarP(&uc.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") - upgradeClusterCmd.Flags().BoolVarP(&uc.unattended, "yes", "y", false, "Upgrade workload cluster without asking for confirmation") - - upgradeClusterCmd.Flags().StringVar(&uc.osName, "os-name", "", "OS name to use during cluster upgrade. Discovered automatically if not provided (See [+])") - upgradeClusterCmd.Flags().StringVar(&uc.osVersion, "os-version", "", "OS version to use during cluster upgrade. Discovered automatically if not provided (See [+])") - upgradeClusterCmd.Flags().StringVar(&uc.osArch, "os-arch", "", "OS arch to use during cluster upgrade. Discovered automatically if not provided (See [+])") - - upgradeClusterCmd.Flags().StringVarP(&uc.vSphereTemplateName, "vsphere-vm-template-name", "", "", "The vSphere VM template to be used with upgraded kubernetes version. Discovered automatically if not provided") - upgradeClusterCmd.Flags().MarkHidden("vsphere-vm-template-name") // nolint -} - -func upgrade(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("upgrading cluster with a global server is not implemented yet") - } - return upgradeCluster(server, args[0]) -} - -func upgradeCluster(server *configapi.Server, clusterName string) error { - tkgctlClient, err := createTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context) - if err != nil { - return err - } - - clusterClientOptions := clusterclient.Options{GetClientInterval: 2 * time.Second, GetClientTimeout: 5 * time.Second} - clusterClient, err := clusterclient.NewClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context, clusterClientOptions) - if err != nil { - return err - } - - tkrVersion, err := getValidTkrVersionFromTkrForUpgrade(tkgctlClient, clusterClient, clusterName) - if err != nil { - return err - } - - edition, err := config.GetEdition() - if err != nil { - return err - } - - upgradeClusterOptions := tkgctl.UpgradeClusterOptions{ - ClusterName: clusterName, - Namespace: uc.namespace, - TkrVersion: tkrVersion, - SkipPrompt: uc.unattended, - Timeout: uc.timeout, - OSName: uc.osName, - OSVersion: uc.osVersion, - OSArch: uc.osArch, - VSphereTemplateName: uc.vSphereTemplateName, - Edition: edition, - } - - return tkgctlClient.UpgradeCluster(upgradeClusterOptions) -} - -func getValidTkrVersionFromTkrForUpgrade(tkgctlClient tkgctl.TKGClient, clusterClient clusterclient.Client, clusterName string) (string, error) { - result, err := tkgctlClient.DescribeCluster(tkgctl.DescribeTKGClustersOptions{ - ClusterName: clusterName, - Namespace: uc.namespace, - }) - if err != nil { - return "", err - } - - tkrs, err := clusterClient.GetTanzuKubernetesReleases("") - if err != nil { - return "", err - } - - // TODO: update this condition after CLI fully support the package based cc. - // Since CLI should support the pre package-based-cc where the updatesAvailable condition was part of - // TKRs, code checking the TKRs for available upgrade should remain. - cluster, err := getClusterResource(clusterClient, clusterName, uc.namespace) - if err == nil && capiconditions.Has(cluster, runv1.ConditionUpdatesAvailable) { - return getValidTKRVersionFromClusterForUpgrade(cluster, uc.tkrName) - } - - tkrForUpgrade, err := getMatchingTkrForTkrName(tkrs, uc.tkrName) - // If the complete TKR name is provided, use it - if err == nil { - return getValidTKRVersionForUpgradeGivenFullTKRName(clusterName, uc.namespace, result.ClusterInfo.Labels, &tkrForUpgrade, tkrs) - } - return getValidTKRVersionForUpgradeGivenTKRNamePrefix(clusterName, uc.namespace, uc.tkrName, result.ClusterInfo.K8sVersion, result.ClusterInfo.Labels, tkrs) -} - -func getValidTKRVersionForUpgradeGivenFullTKRName(clusterName, namespace string, clusterLabels map[string]string, - tkrForUpgrade *runv1alpha1.TanzuKubernetesRelease, tkrs []runv1alpha1.TanzuKubernetesRelease) (string, error) { - - var userWarningMsg string - - if !tkrutils.IsTkrActive(tkrForUpgrade) { - return "", errors.Errorf("Tanzu Kubernetes release %q is deactivated and cannot be used", tkrForUpgrade.Name) - } - if !tkrutils.IsTkrCompatible(tkrForUpgrade) { - userWarningMsg = fmt.Sprintf("WARNING: Tanzu Kubernetes release %q is not compatible on the management cluster", tkrForUpgrade.Name) - } - - tkrName, err := getClusterTKRNameFromClusterLabels(clusterLabels) - if err != nil { // old clusters with no TKR label - if userWarningMsg != "" { - fmt.Println(userWarningMsg) - } - return tkrForUpgrade.Spec.Version, nil - } - - // If existing TKR on the cluster and the one requested are same - // continue the upgrade using the given TKR - if tkrName == tkrForUpgrade.GetName() { - return tkrForUpgrade.Spec.Version, nil - } - - // get the TKR associated with the cluster - tkr, err := getMatchingTkrForTkrName(tkrs, tkrName) - if err != nil { - return "", err - } - // get available upgrades from the TKR associated with the cluster currently - tkrAvailableUpgrades, err := tkrutils.GetAvailableUpgrades(clusterName, namespace, &tkr) - if err != nil { - return "", err - } - - for _, availableUpgrade := range tkrAvailableUpgrades { - if availableUpgrade == tkrForUpgrade.Name { - if userWarningMsg != "" { - fmt.Println(userWarningMsg) - } - return tkrForUpgrade.Spec.Version, nil - } - } - // custom TKRs may not follow the Tanzu naming conventions, so they may not be appear in available upgrade list - if userWarningMsg == "" { - userWarningMsg = fmt.Sprintf("WARNING: Tanzu Kubernetes release %q is not a recommended upgrade version for cluster %q, namespace %q", tkrForUpgrade.Name, clusterName, namespace) - } else { - userWarningMsg = fmt.Sprintf("%s, and not a recommended upgrade version for cluster %q, namespace %q", userWarningMsg, clusterName, namespace) - } - fmt.Println(userWarningMsg) - return tkrForUpgrade.Spec.Version, nil -} - -func getValidTKRVersionForUpgradeGivenTKRNamePrefix(clusterName, namespace, tkrNamePrefix, clusterK8sVersion string, - clusterLabels map[string]string, tkrs []runv1alpha1.TanzuKubernetesRelease) (string, error) { - - var err error - var upgradeEligibleTKRs []runv1alpha1.TanzuKubernetesRelease - - tkrName, err := getClusterTKRNameFromClusterLabels(clusterLabels) - if err != nil { // old clusters with no TKR label - upgradeEligibleTKRs, err = getUpgradableTKRsCompatibleWithClusterK8sVersion(clusterK8sVersion, tkrs) - if err != nil { - return "", errors.Wrap(err, "failed to get upgrade eligible TKrs") - } - } else { - upgradeEligibleTKRs, err = getUpgradableTKRsCompatibleWithClusterTKR(clusterName, namespace, tkrName, tkrs) - if err != nil { - return "", errors.Wrap(err, "failed to get upgrade eligible TKrs") - } - } - if len(upgradeEligibleTKRs) == 0 { - return "", errors.New("cluster cannot be upgraded as there are no available upgrades") - } - - upgradeEligiblePrefixMatchedTKRs := []runv1alpha1.TanzuKubernetesRelease{} - // filter the eligible tkrs matching prefix - for idx := range upgradeEligibleTKRs { - if strings.HasPrefix(upgradeEligibleTKRs[idx].Name, tkrNamePrefix) { - upgradeEligiblePrefixMatchedTKRs = append(upgradeEligiblePrefixMatchedTKRs, upgradeEligibleTKRs[idx]) - } - } - - if len(upgradeEligiblePrefixMatchedTKRs) == 0 { - return "", errors.Errorf("cluster cannot be upgraded, no compatible upgrades found matching the TKr prefix '%s', available compatible upgrades %v", tkrNamePrefix, getTKRNamesFromTKRs(upgradeEligibleTKRs)) - } - - return getLatestTkrVersion(upgradeEligiblePrefixMatchedTKRs) -} - -func getUpgradableTKRsCompatibleWithClusterK8sVersion(clusterk8sVersion string, tkrs []runv1alpha1.TanzuKubernetesRelease) ([]runv1alpha1.TanzuKubernetesRelease, error) { - upgradeEligibleTKRs := []runv1alpha1.TanzuKubernetesRelease{} - for idx := range tkrs { - if !tkrutils.IsTkrCompatible(&tkrs[idx]) { - continue - } - compareResult, err := utils.CompareVMwareVersionStrings(clusterk8sVersion, tkrs[idx].Spec.KubernetesVersion) - if err != nil { - return nil, errors.Wrapf(err, "error while comparing kubernetes versions %s,%s", clusterk8sVersion, tkrs[idx].Spec.KubernetesVersion) - } - - if compareResult > 0 { - continue - } - - if !utils.CheckKubernetesUpgradeCompatibility(clusterk8sVersion, tkrs[idx].Spec.KubernetesVersion) { - continue - } - upgradeEligibleTKRs = append(upgradeEligibleTKRs, tkrs[idx]) - } - return upgradeEligibleTKRs, nil -} -func getUpgradableTKRsCompatibleWithClusterTKR(clusterName, namespace, clusterTKRName string, - tkrs []runv1alpha1.TanzuKubernetesRelease) ([]runv1alpha1.TanzuKubernetesRelease, error) { - - tkr, err := getMatchingTkrForTkrName(tkrs, clusterTKRName) - if err != nil { - return nil, err - } - tkrAvailableUpgrades, err := tkrutils.GetAvailableUpgrades(clusterName, namespace, &tkr) - if err != nil { - return nil, err - } - - upgradeEligibleTKRs := []runv1alpha1.TanzuKubernetesRelease{} - for _, tkrName := range tkrAvailableUpgrades { - for idx := range tkrs { - if !tkrutils.IsTkrCompatible(&tkrs[idx]) || !tkrutils.IsTkrActive(&tkrs[idx]) { - continue - } - if tkrName == tkrs[idx].Name { - upgradeEligibleTKRs = append(upgradeEligibleTKRs, tkrs[idx]) - } - } - } - return upgradeEligibleTKRs, nil -} - -func getMatchingTkrForTkrName(tkrs []runv1alpha1.TanzuKubernetesRelease, tkrName string) (runv1alpha1.TanzuKubernetesRelease, error) { - for i := range tkrs { - if tkrs[i].Name == tkrName { - return tkrs[i], nil - } - } - - return runv1alpha1.TanzuKubernetesRelease{}, errors.Errorf("could not find a matching Tanzu Kubernetes release for name %q", tkrName) -} - -func getTKRNamesFromTKRs(tkrs []runv1alpha1.TanzuKubernetesRelease) []string { - tkrNames := []string{} - for idx := range tkrs { - tkrNames = append(tkrNames, tkrs[idx].Name) - } - return tkrNames -} - -func getClusterTKRNameFromClusterLabels(clusterLabels map[string]string) (string, error) { - tkrLabelExists := false - tkrName := "" - tkrName, tkrLabelExists = clusterLabels[runv1.LabelTKR] - if !tkrLabelExists { - tkrName, tkrLabelExists = clusterLabels[LegacyClusterTKRLabel] // legacy TKGm - } - if !tkrLabelExists { - return "", errors.New("failed to get cluster TKr name from cluster labels") - } - return tkrName, nil -} - -func getValidTKRVersionFromClusterForUpgrade(cluster *capiv1.Cluster, tkrName string) (string, error) { - // if tkrname is not specified, return the latest available version - if tkrName == "" { - updates := clusters.AvailableUpgrades(cluster) - if len(updates) == 0 { - return "", errors.Errorf("no available upgrades for cluster '%s', namespace '%s'", cluster.Name, cluster.Namespace) - } - return latestTkrVersion(updates.Slice()), nil - } - - tkrVersion := strings.ReplaceAll(tkrName, "---", "+") - // If the existing TKR on the cluster and the one requested are same - // continue the upgrade using the given TKR - if clusterTKR, err := getClusterTKRNameFromClusterLabels(cluster.Labels); err == nil && clusterTKR == tkrName { - return tkrVersion, nil - } - - updates := clusters.AvailableUpgrades(cluster) - if len(updates) == 0 { - return "", errors.Errorf("no available upgrades for cluster '%s', namespace '%s'", cluster.Name, cluster.Namespace) - } - - matchingUpdates := updates.Filter(func(tv string) bool { - return version.Prefixes(tv).Has(tkrVersion) - }) - if len(matchingUpdates) == 0 { - updateNames := updates.Map(func(tv string) string { - return strings.ReplaceAll(tv, "+", "---") - }) - return "", errors.Errorf("cluster cannot be upgraded, no compatible upgrades found matching the TKR name/prefix '%s', available compatible upgrades %s", tkrName, updateNames.Slice()) - } - return latestTkrVersion(matchingUpdates.Slice()), nil -} - -func getClusterResource(clusterClient clusterclient.Client, clusterName, clusterNamespace string) (*capiv1.Cluster, error) { - if clusterNamespace == "" { - clusterNamespace = constants.DefaultNamespace - } - cluster := &capiv1.Cluster{} - err := clusterClient.GetResource(cluster, clusterName, clusterNamespace, nil, nil) - if err != nil { - return nil, errors.Wrapf(err, "unable to get cluster %q from namespace %q", clusterName, clusterNamespace) - } - return cluster, nil -} - -// latestTkrVersion returns the latest version -// pre-req versions should not be empty and versions are valid semantic versions -func latestTkrVersion(versions []string) string { - sort.Slice(versions, func(i, j int) bool { - vi, _ := version.ParseSemantic(versions[i]) - vj, _ := version.ParseSemantic(versions[j]) - return vi.LessThan(vj) - }) - - log.V(4).Infof("Using the TKr version '%s' ", versions[len(versions)-1]) - return versions[len(versions)-1] -} diff --git a/cmd/cli/plugin/cluster/upgrade_test.go b/cmd/cli/plugin/cluster/upgrade_test.go deleted file mode 100644 index 2e0d28362d..0000000000 --- a/cmd/cli/plugin/cluster/upgrade_test.go +++ /dev/null @@ -1,480 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - - corev1 "k8s.io/api/core/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -const ( - FakeNamespace = "fake-namespace" -) - -var _ = Describe("getValidTKRVersionForUpgradeGivenTKRNamePrefix", func() { - var ( - tkrs []runv1alpha1.TanzuKubernetesRelease - clusterName string - clusterK8sVersion string - clusterLabels map[string]string - tkrNamePrefix string - namespace string - latestTKRVersion string - err error - ) - const ( - TkrVersionPrefix_v1_17 = "v1.17" //nolint - TkrVersionPrefix_v1_18 = "v1.18" //nolint - TkrVersionPrefix_v1_18_20 = "v1.18.20" //nolint - ) - - JustBeforeEach(func() { - latestTKRVersion, err = getValidTKRVersionForUpgradeGivenTKRNamePrefix(clusterName, namespace, tkrNamePrefix, - clusterK8sVersion, clusterLabels, tkrs) - }) - - Context("When user provides TKR name prefix and cluster had TKR version label", func() { - BeforeEach(func() { - clusterName = "fake-cluster-name" - namespace = FakeNamespace - clusterLabels = map[string]string{ - "tanzuKubernetesRelease": "v1.17.18---vmware.1-tkg.2", - } - }) - - Context("when TKR name prefix matches with more than one TKR version supported by cluster's TKR version for upgrade", func() { - - BeforeEach(func() { - tkrNamePrefix = TkrVersionPrefix_v1_18 - - availableUpgrades := fmt.Sprintf("TKR(s) with later version is available: %s,%s,%s,%s", "v1.18.8---vmware.1-tkg.1", "v1.18.17---vmware.2-tkg.1", "v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.17---vmware.1-tkg.2") - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18+vmware.1", corev1.ConditionTrue, availableUpgrades) - tkr2 := getFakeTKR("v1.18.8---vmware.1-tkg.1", "v1.18.8+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.17---vmware.2-tkg.1", "v1.18.17+vmware.2", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.14+vmware.1", corev1.ConditionTrue, "") - tkr5 := getFakeTKR("v1.18.17---vmware.1-tkg.2", "v1.18.17+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - - }) - It("should return the latest TKR version matching the prefix and upgrade supported by cluster's TKR version", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal("v1.18.17+vmware.2-tkg.1")) - }) - }) - - Context("when TKR name prefix doesn't matches with any TKR version supported by cluster's TKR version for upgrade", func() { - - BeforeEach(func() { - tkrNamePrefix = TkrVersionPrefix_v1_18_20 - availableUpgrades := fmt.Sprintf("TKR(s) with later version is available: %s,%s,%s,%s", "v1.18.8---vmware.1-tkg.1", "v1.18.17---vmware.2-tkg.1", "v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.17---vmware.1-tkg.2") - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18+vmware.1", corev1.ConditionTrue, availableUpgrades) - tkr2 := getFakeTKR("v1.18.8---vmware.1-tkg.1", "v1.18.8+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.17---vmware.2-tkg.1", "v1.18.17+vmware.2", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.14+vmware.1", corev1.ConditionTrue, "") - tkr5 := getFakeTKR("v1.18.17---vmware.1-tkg.2", "v1.18.17+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster cannot be upgraded, no compatible upgrades found matching the TKr prefix 'v1.18.20'")) - }) - }) - Context("when there no available upgrades supported by cluster's TKR version for upgrade", func() { - - BeforeEach(func() { - tkrNamePrefix = TkrVersionPrefix_v1_18_20 - availableUpgrades := "" - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18+vmware.1", corev1.ConditionTrue, availableUpgrades) - tkr2 := getFakeTKR("v1.18.8---vmware.1-tkg.1", "v1.18.8+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.17---vmware.2-tkg.1", "v1.18.17+vmware.2", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.14+vmware.1", corev1.ConditionTrue, "") - tkr5 := getFakeTKR("v1.18.17---vmware.1-tkg.2", "v1.18.17+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to get upgrade eligible TKrs")) - }) - }) - }) - - Context("When user provides TKR name prefix and cluster doesn't have TKR version label", func() { - BeforeEach(func() { - clusterLabels = map[string]string{} - }) - - Context("when TKR name prefix matches with more than one TKR version eligible for upgrade from cluster's current kubernetes version", func() { - - BeforeEach(func() { - tkrNamePrefix = TkrVersionPrefix_v1_18 - clusterK8sVersion = "v1.17.16+vmware.1" - availableUpgrades := "" - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18+vmware.1", corev1.ConditionTrue, availableUpgrades) - tkr2 := getFakeTKR("v1.18.8---vmware.1-tkg.1", "v1.18.8+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.17---vmware.2-tkg.1-rc.3", "v1.18.17+vmware.2", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.14+vmware.1", corev1.ConditionTrue, "") - tkr5 := getFakeTKR("v1.18.17---vmware.1-tkg.2", "v1.18.17+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - - }) - It("should return the latest TKR version matching the prefix and upgrade supported by cluster's kubernetes version", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal("v1.18.17+vmware.2-tkg.1-rc.3")) - }) - }) - - Context("when there are no latest TKRs available for upgrade from cluster's current kubernetes version", func() { - - BeforeEach(func() { - tkrNamePrefix = TkrVersionPrefix_v1_18 - clusterK8sVersion = "v1.17.16+vmware.2" - availableUpgrades := "" - tkr1 := getFakeTKR("v1.17.15---vmware.1-tkg.2", "v1.17.15+vmware.1", corev1.ConditionTrue, availableUpgrades) - tkr2 := getFakeTKR("v1.17.16---vmware.1-tkg.1", "v1.17.16+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.17.16---vmware.1-tkg.2-rc.3", "v1.17.16+vmware.1", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.19.14---vmware.1-tkg.1-rc.1", "v1.19.14+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2} - - }) - It("should return the latest TKR version matching the prefix and upgrade supported by cluster's kubernetes version", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster cannot be upgraded as there are no available upgrades")) - }) - }) - Context("when there multiple TKRs with same latest version available for upgrade from cluster's current kubernetes version", func() { - - BeforeEach(func() { - tkrNamePrefix = TkrVersionPrefix_v1_17 - clusterK8sVersion = "v1.17.15+vmware.2" - availableUpgrades := "" - tkr1 := getFakeTKR("v1.17.15---vmware.1-tkg.2", "v1.17.15+vmware.1", corev1.ConditionTrue, availableUpgrades) - tkr2 := getFakeTKR("v1.17.16---vmware.1-tkg.1", "v1.17.16+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.17.16---vmware.1-tkg.1-rc.3", "v1.17.16+vmware.1", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.19.14---vmware.1-tkg.1-rc.1", "v1.19.14+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr2, tkr3, tkr4} - - }) - It("should return the latest TKR version matching the prefix and upgrade supported by cluster's kubernetes version", func() { - Expect(err).To(HaveOccurred()) - errString := "found multiple TKrs [v1.17.16---vmware.1-tkg.1-rc.3 v1.17.16---vmware.1-tkg.1] matching the criteria" - Expect(err.Error()).To(ContainSubstring(errString)) - }) - }) - - }) - -}) - -var _ = Describe("getValidTKRVersionForUpgradeGivenFullTKRName", func() { - var ( - tkrs []runv1alpha1.TanzuKubernetesRelease - clusterName string - clusterNamespace string - clusterLabels map[string]string - tkrForUpgrade runv1alpha1.TanzuKubernetesRelease - latestTKRVersion string - err error - ) - - JustBeforeEach(func() { - latestTKRVersion, err = getValidTKRVersionForUpgradeGivenFullTKRName(clusterName, clusterNamespace, clusterLabels, &tkrForUpgrade, tkrs) - }) - - Context("When cluster had TKR version label", func() { - BeforeEach(func() { - clusterNamespace = "fake-namespace1" - clusterLabels = map[string]string{ - "tanzuKubernetesRelease": "v1.17.18---vmware.1-tkg.2", - } - }) - - Context("when TKR associated with user provided TKR name is in the list of TKRs supported by cluster's TKR version for upgrade", func() { - - BeforeEach(func() { - availableUpgrades := fmt.Sprintf("TKR(s) with later version is available: %s,%s,%s,%s", "v1.18.8---vmware.1-tkg.1", "v1.18.17---vmware.2-tkg.1", "v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.17---vmware.1-tkg.2") - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18+vmware.1", corev1.ConditionTrue, availableUpgrades) - tkr2 := getFakeTKR("v1.18.8---vmware.1-tkg.1", "v1.18.8+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.17---vmware.2-tkg.1", "v1.18.17+vmware.2", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.14+vmware.1", corev1.ConditionTrue, "") - tkr5 := getFakeTKR("v1.18.17---vmware.1-tkg.2", "v1.18.17+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - - tkrForUpgrade = tkr5 - }) - It("should return the version of TKR whose name matches with the user provided TKR name", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal("v1.18.17+vmware.1-tkg.2")) - }) - }) - - Context("when TKR associated with user provided TKR name is not in the list of TKRs supported by cluster's TKR version for upgrade", func() { - - BeforeEach(func() { - availableUpgrades := fmt.Sprintf("TKR(s) with later version is available: %s,%s,%s", "v1.18.8---vmware.1-tkg.1", "v1.18.17---vmware.2-tkg.1", "v1.18.14---vmware.1-tkg.1-rc.1") - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18+vmware.1", corev1.ConditionTrue, availableUpgrades) - tkr2 := getFakeTKR("v1.18.8---vmware.1-tkg.1", "v1.18.8+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.17---vmware.2-tkg.1", "v1.18.17+vmware.2", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.14+vmware.1", corev1.ConditionTrue, "") - tkr5 := getFakeTKR("v1.18.17---vmware.1-tkg.2", "v1.18.17+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - - tkrForUpgrade = tkr5 - }) - It("should return not return error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal("v1.18.17+vmware.1-tkg.2")) - }) - }) - - Context("when existing TKR associated with cluster and user provided TKR is same and no new upgrades are available for the given TKR during upgrade, it should return provided TKR", func() { - - BeforeEach(func() { - availableUpgrades := fmt.Sprintf("TKR(s) with later version is available: %s,%s,%s", "v1.18.8---vmware.1-tkg.1", "v1.18.17---vmware.2-tkg.1", "v1.18.14---vmware.1-tkg.1-rc.1") - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18+vmware.1", corev1.ConditionTrue, availableUpgrades) - tkr2 := getFakeTKR("v1.18.8---vmware.1-tkg.1", "v1.18.8+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.17---vmware.2-tkg.1", "v1.18.17+vmware.2", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.14+vmware.1", corev1.ConditionTrue, "") - tkr5 := getFakeTKR("v1.18.17---vmware.1-tkg.2", "v1.18.17+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - - tkrForUpgrade = tkr5 - - clusterLabels = map[string]string{ - "tanzuKubernetesRelease": "v1.18.17---vmware.1-tkg.2", - } - }) - It("should return not return error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal("v1.18.17+vmware.1-tkg.2")) - }) - }) - - }) - - Context("When cluster doesn't have TKR version label", func() { - BeforeEach(func() { - clusterLabels = map[string]string{} - }) - - Context("when TKR associated with user provided TKR name is in the list of TKRs supported by cluster's TKR version for upgrade", func() { - - BeforeEach(func() { - availableUpgrades := fmt.Sprintf("TKR(s) with later version is available: %s,%s,%s,%s", "v1.18.8---vmware.1-tkg.1", "v1.18.17---vmware.2-tkg.1", "v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.17---vmware.1-tkg.2") - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18+vmware.1", corev1.ConditionTrue, availableUpgrades) - tkr2 := getFakeTKR("v1.18.8---vmware.1-tkg.1", "v1.18.8+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.17---vmware.2-tkg.1", "v1.18.17+vmware.2", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.14+vmware.1", corev1.ConditionTrue, "") - tkr5 := getFakeTKR("v1.18.17---vmware.1-tkg.2", "v1.18.17+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - - tkrForUpgrade = tkr5 - }) - It("should return the version of TKR whose name matches with the user provided TKR name", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal("v1.18.17+vmware.1-tkg.2")) - }) - }) - Context("when TKR associated with user provided TKR name is not in the list of TKRs supported by cluster's TKR version for upgrade", func() { - - BeforeEach(func() { - availableUpgrades := fmt.Sprintf("TKR(s) with later version is available: %s,%s,%s", "v1.18.8---vmware.1-tkg.1", "v1.18.17---vmware.2-tkg.1", "v1.18.14---vmware.1-tkg.1-rc.1") - tkr1 := getFakeTKR("v1.17.18---vmware.1-tkg.2", "v1.17.18+vmware.1", corev1.ConditionTrue, availableUpgrades) - tkr2 := getFakeTKR("v1.18.8---vmware.1-tkg.1", "v1.18.8+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.17---vmware.2-tkg.1", "v1.18.17+vmware.2", corev1.ConditionTrue, "") - tkr4 := getFakeTKR("v1.18.14---vmware.1-tkg.1-rc.1", "v1.18.14+vmware.1", corev1.ConditionTrue, "") - tkr5 := getFakeTKR("v1.18.17---vmware.1-tkg.2", "v1.18.17+vmware.1", corev1.ConditionTrue, "") - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - - tkrForUpgrade = tkr5 - }) - It("should still return the version of TKR whose name matches with the user provided TKR name", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal("v1.18.17+vmware.1-tkg.2")) - }) - }) - }) - -}) - -var _ = Describe("getValidTKRVersionFromClusterForUpgrade", func() { - var ( - latestTKRVersion string - err error - cluster *clusterv1.Cluster - tkrNamePrefix string - ) - const ( - TkrVersionPrefix_v1_18 = "v1.18" //nolint - TkrVersionPrefix_v1_18_20 = "v1.18.20" //nolint - ) - JustBeforeEach(func() { - latestTKRVersion, err = getValidTKRVersionFromClusterForUpgrade(cluster, tkrNamePrefix) - }) - - Context("when TKR associated with user provided TKR prefix name is not in the list of TKRs supported by cluster for upgrade", func() { - - BeforeEach(func() { - availableUpdates := fmt.Sprintf("[%s %s %s]", "v1.18.18+vmware.1-tkg.2", "v1.18.8+vmware.1-tkg.1", "v1.18.14+vmware.1-tkg.1-rc.1") - cluster = getFakeCluster("fake-cluster", availableUpdates) - tkrNamePrefix = TkrVersionPrefix_v1_18_20 - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("no compatible upgrades found matching the TKR name/prefix '%s'", tkrNamePrefix))) - }) - }) - - Context("when existing TKR associated with cluster and user provided TKR is same and though no new upgrades are available for cluster to upgrade, it should return provided TKR", func() { - - BeforeEach(func() { - clusterLabels := map[string]string{ - runv1alpha3.LabelTKR: "v1.18.17---vmware.1-tkg.2", - } - cluster = getFakeCluster("fake-cluster", "") - cluster.Labels = clusterLabels - tkrNamePrefix = "v1.18.17---vmware.1-tkg.2" - }) - It("should return TKR name provided by user", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal(strings.ReplaceAll(tkrNamePrefix, "---", "+"))) - }) - }) - - Context("when TKR associated with user provided TKR prefix name is in the list of TKRs supported by cluster for upgrade", func() { - - BeforeEach(func() { - availableUpdates := fmt.Sprintf("[%s %s %s]", "v1.18.18+vmware.1-tkg.2", "v1.18.8+vmware.1-tkg.1", "v1.18.14+vmware.1-tkg.1-rc.1") - cluster = getFakeCluster("fake-cluster", availableUpdates) - tkrNamePrefix = TkrVersionPrefix_v1_18 - }) - It("should return the latest version of TKR whose name prefix matches with the user provided TKR prefix name", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal("v1.18.18+vmware.1-tkg.2")) - }) - }) - Context("when TKR associated with user provided TKR name is in the list of TKRs supported by cluster for upgrade", func() { - - BeforeEach(func() { - availableUpdates := fmt.Sprintf("[%s %s %s]", "v1.18.18+vmware.1-tkg.2", "v1.18.8+vmware.1-tkg.1", "v1.18.14+vmware.1-tkg.1-rc.1") - cluster = getFakeCluster("fake-cluster", availableUpdates) - tkrNamePrefix = "v1.18.14---vmware.1-tkg.1-rc.1" - }) - It("should return the version of user provided TKR name", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal("v1.18.14+vmware.1-tkg.1-rc.1")) - }) - }) - Context("when user provided TKR prefix name but the cluster doesn't have any updates available", func() { - - BeforeEach(func() { - cluster = getFakeCluster("fake-cluster", "") - cluster.Namespace = FakeNamespace - tkrNamePrefix = TkrVersionPrefix_v1_18 - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("no available upgrades for cluster '%s', namespace '%s'", cluster.Name, cluster.Namespace))) - }) - }) - - Context("when user provided TKR prefix name is empty", func() { - - BeforeEach(func() { - availableUpdates := fmt.Sprintf("[%s %s %s]", "v1.18.18+vmware.1-tkg.2", "v1.18.8+vmware.1-tkg.1", "v1.18.14+vmware.1-tkg.1-rc.1") - cluster = getFakeCluster("fake-cluster", availableUpdates) - tkrNamePrefix = "" - }) - It("should return the highest available version", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(latestTKRVersion).To(Equal("v1.18.18+vmware.1-tkg.2")) - }) - }) -}) - -var _ = Describe("getClusterResource", func() { - var ( - err error - clusterName string - namespace string - clusterClient *fakes.ClusterClient - cluster *clusterv1.Cluster - ) - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - clusterName = "fake-cluster" - namespace = FakeNamespace - }) - - JustBeforeEach(func() { - cluster, err = getClusterResource(clusterClient, clusterName, namespace) - }) - - Context("when resource is not found ", func() { - - BeforeEach(func() { - namespace = "" - clusterClient.GetResourceReturns(errors.New("fake list resource error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("unable to get cluster %q from namespace %q", clusterName, constants.DefaultNamespace))) - Expect(cluster).To(BeNil()) - }) - }) - Context("when resource is found ", func() { - - BeforeEach(func() { - namespace = FakeNamespace - clusterClient.GetResourceCalls(func(c interface{}, name, namespace string, pv clusterclient.PostVerifyrFunc, opt *clusterclient.PollOptions) error { - cc := c.(*clusterv1.Cluster) - fc := getFakeCluster(clusterName, "") - *cc = *fc - return nil - }) - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(cluster).ToNot(BeNil()) - }) - }) -}) - -func getFakeCluster(name, updatesAvailablesMsg string) *clusterv1.Cluster { - cluster := &clusterv1.Cluster{} - cluster.Name = name - if len(updatesAvailablesMsg) == 0 { - cluster.Status.Conditions = []clusterv1.Condition{ - { - Type: clusterv1.ConditionType(runv1alpha3.ConditionUpdatesAvailable), - Status: corev1.ConditionFalse, - Reason: "AlreadyUptoDate", - }, - } - } else { - cluster.Status.Conditions = []clusterv1.Condition{ - { - Type: clusterv1.ConditionType(runv1alpha3.ConditionUpdatesAvailable), - Status: corev1.ConditionTrue, - Message: updatesAvailablesMsg, - }, - } - } - return cluster -} diff --git a/cmd/cli/plugin/feature/go.sum b/cmd/cli/plugin/feature/go.sum deleted file mode 100644 index 0c5b240da7..0000000000 --- a/cmd/cli/plugin/feature/go.sum +++ /dev/null @@ -1,1047 +0,0 @@ -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -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/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -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.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -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 v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.20.2 h1:8uQq0zMgLEfa0vRrrBgaJF2gyW9Da9BmfGV+OyUzfkY= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -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= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/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= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.4 h1:I5Y645gJ8zWKawyr78lVfDQkZrAViSbeRXsPZWTxmXk= -k8s.io/api v0.24.4/go.mod h1:42pVfA0NRxrtJhZQOvRSyZcJihzAdU59WBtTjYcB0/M= -k8s.io/apiextensions-apiserver v0.24.4 h1:w53Pm4zu8fCt9WfiRgS2YI6LE6I4NJ5aUi78GElD3K8= -k8s.io/apiextensions-apiserver v0.24.4/go.mod h1:iDK+Xb4jsPNnRGj5jU/WqqjLvt8363M7cKixKe1C9+U= -k8s.io/apimachinery v0.24.4 h1:S0Ur3J/PbivTcL43EdSdPhqCqKla2NIuneNwZcTDeGQ= -k8s.io/apimachinery v0.24.4/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.4/go.mod h1:mAuC3pZVc0IDXLx7lUHoisBOtBa1SobfLW/CI3klXQE= -k8s.io/client-go v0.24.4 h1:hIAIJZIPyaw46AkxwyR0FRfM/pRxpUNTd3ysYu9vyRg= -k8s.io/client-go v0.24.4/go.mod h1:+AxlPWw/H6f+EJhRSjIeALaJT4tbeB/8g9BNvXGPd0Y= -k8s.io/code-generator v0.24.4/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.4 h1:WEGRp06GBYVwxp5JdiRaJ1zkdOhrqucxRv/8IrABLG0= -k8s.io/component-base v0.24.4/go.mod h1:sWxkgcMfbYHadw0OJ0N+vIscd14/nqSIM2veCdg843o= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= -k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 h1:XmRqFcQlCy/lKRZ39j+RVpokYNroHPqV3mcBRfnhT5o= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -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= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cmd/cli/plugin/isolated-cluster/Makefile b/cmd/cli/plugin/isolated-cluster/Makefile deleted file mode 100644 index cf215cdf0f..0000000000 --- a/cmd/cli/plugin/isolated-cluster/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -ROOT_DIR := $(shell git rev-parse --show-toplevel) -MODULE_ROOT_DIR := $(ROOT_DIR)/tkg - -# Golang specific variables -GOOS ?= $(shell go env GOOS) -GOARCH ?= $(shell go env GOARCH) -GOHOSTOS ?= $(shell go env GOHOSTOS) -GOHOSTARCH ?= $(shell go env GOHOSTARCH) -# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) -ifeq (,$(shell go env GOBIN)) -GOBIN=$(shell go env GOPATH)/bin -else -GOBIN=$(shell go env GOBIN) -endif -GO := go - -# Directories -TOOLS_DIR := $(abspath $(MODULE_ROOT_DIR)/hack/tools) -TOOLS_BIN_DIR := $(TOOLS_DIR)/bin - -# Add tooling binaries here and in hack/tools/Makefile -GOIMPORTS := $(TOOLS_BIN_DIR)/goimports -TOOLING_BINARIES := $(GOIMPORTS) - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help (default) - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-28s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m\033[32m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -## -------------------------------------- -## All -## -------------------------------------- - -.PHONY: all -all: test ## Tests the library - -## -------------------------------------- -## Testing -## -------------------------------------- - -.PHONY: test -test: fmt vet ## Run Tests - ${GO} test -timeout 60m -coverprofile coverage.txt -coverpkg ./... -v `go list ./...` - -.PHONY: vet -vet: ## Vet codebase - ${GO} vet ./... - -fmt: $(GOIMPORTS) ## Run goimports - $(GOIMPORTS) -w -local github.com/vmware-tanzu ./ - -## -------------------------------------- -## Tooling Binaries -## -------------------------------------- - -tools: $(TOOLING_BINARIES) ## Build tooling binaries -.PHONY: $(TOOLING_BINARIES) -$(TOOLING_BINARIES): - make -C $(TOOLS_DIR) $(@F) - diff --git a/cmd/cli/plugin/isolated-cluster/README.md b/cmd/cli/plugin/isolated-cluster/README.md deleted file mode 100644 index 7136604ea1..0000000000 --- a/cmd/cli/plugin/isolated-cluster/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# isolated-cluster - -## Summary - -Enable Tanzu CLI users to copy TKG images from one registry to another that does not have access to the internet. -This is done by following the next steps -1.Copy all associated TKG images to tars on a local disk using this plugin -2.Copy these tar files to the air-gapped network (using a USB drive or other mechanism) -3.Upload all the tar files to the air-gapped registry using this plugin - -## Usage - -### download-bundle - -#### help output - -```shell -$ tanzu isolated-cluster download-bundle --help -Download images/bundle into local disk as TAR - -Usage: - tanzu isolated-cluster download-bundle [flags] - -Examples: - # copy image from projects.registry.vmware.com/tkg to /tmp folder - tanzu isolated-cluster download-bundle --source-repo mirror-registry.test/tkg --tkg-version v2.1.0 - - -Flags: - ----source-repo OCI repo where TKG bundles or images are hosted (required) - --tkg-version TKG version (required) - --insecure Trusts the server certificate without validating it - --ca-certificate The private repository’s CA certificate - -h, --help help for image pull -``` - -### upload-bundle - -#### help output - -```shell -$ tanzu isolated-cluster upload-bundle --help -Upload images to private repository - -Usage: - tanzu isolated-cluster upload-bundle [flags] - -Examples: - # push images from tar file to private repository - tanzu isolated-cluster upload-bundle --source-directory /tmp --ca-certificate cacert - -Flags: - --source-directory Path to the directory that contains the TAR file (required) - --ca-certificate The private repository’s CA certificate (optional) - --destination-repo Private OCI repository where the images should be hosted in air-gapped (required) - --insecure Trusts the server certificate without validating it (optional) - -h, --help help for image push -``` diff --git a/cmd/cli/plugin/isolated-cluster/fakes/client_imgpkg_fake.go b/cmd/cli/plugin/isolated-cluster/fakes/client_imgpkg_fake.go deleted file mode 100644 index e8c8ec352a..0000000000 --- a/cmd/cli/plugin/isolated-cluster/fakes/client_imgpkg_fake.go +++ /dev/null @@ -1,347 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/isolated-cluster/imgpkginterface" -) - -type ImgpkgClientFake struct { - CopyImageFromTarStub func(string, string, string, bool) error - copyImageFromTarMutex sync.RWMutex - copyImageFromTarArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 bool - } - copyImageFromTarReturns struct { - result1 error - } - copyImageFromTarReturnsOnCall map[int]struct { - result1 error - } - CopyImageToTarStub func(string, string, string, bool) error - copyImageToTarMutex sync.RWMutex - copyImageToTarArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 bool - } - copyImageToTarReturns struct { - result1 error - } - copyImageToTarReturnsOnCall map[int]struct { - result1 error - } - GetImageTagListStub func(string) []string - getImageTagListMutex sync.RWMutex - getImageTagListArgsForCall []struct { - arg1 string - } - getImageTagListReturns struct { - result1 []string - } - getImageTagListReturnsOnCall map[int]struct { - result1 []string - } - PullImageStub func(string, string) error - pullImageMutex sync.RWMutex - pullImageArgsForCall []struct { - arg1 string - arg2 string - } - pullImageReturns struct { - result1 error - } - pullImageReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *ImgpkgClientFake) CopyImageFromTar(arg1 string, arg2 string, arg3 string, arg4 bool) error { - fake.copyImageFromTarMutex.Lock() - ret, specificReturn := fake.copyImageFromTarReturnsOnCall[len(fake.copyImageFromTarArgsForCall)] - fake.copyImageFromTarArgsForCall = append(fake.copyImageFromTarArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 bool - }{arg1, arg2, arg3, arg4}) - stub := fake.CopyImageFromTarStub - fakeReturns := fake.copyImageFromTarReturns - fake.recordInvocation("CopyImageFromTar", []interface{}{arg1, arg2, arg3, arg4}) - fake.copyImageFromTarMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ImgpkgClientFake) CopyImageFromTarCallCount() int { - fake.copyImageFromTarMutex.RLock() - defer fake.copyImageFromTarMutex.RUnlock() - return len(fake.copyImageFromTarArgsForCall) -} - -func (fake *ImgpkgClientFake) CopyImageFromTarCalls(stub func(string, string, string, bool) error) { - fake.copyImageFromTarMutex.Lock() - defer fake.copyImageFromTarMutex.Unlock() - fake.CopyImageFromTarStub = stub -} - -func (fake *ImgpkgClientFake) CopyImageFromTarArgsForCall(i int) (string, string, string, bool) { - fake.copyImageFromTarMutex.RLock() - defer fake.copyImageFromTarMutex.RUnlock() - argsForCall := fake.copyImageFromTarArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ImgpkgClientFake) CopyImageFromTarReturns(result1 error) { - fake.copyImageFromTarMutex.Lock() - defer fake.copyImageFromTarMutex.Unlock() - fake.CopyImageFromTarStub = nil - fake.copyImageFromTarReturns = struct { - result1 error - }{result1} -} - -func (fake *ImgpkgClientFake) CopyImageFromTarReturnsOnCall(i int, result1 error) { - fake.copyImageFromTarMutex.Lock() - defer fake.copyImageFromTarMutex.Unlock() - fake.CopyImageFromTarStub = nil - if fake.copyImageFromTarReturnsOnCall == nil { - fake.copyImageFromTarReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.copyImageFromTarReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ImgpkgClientFake) CopyImageToTar(arg1 string, arg2 string, arg3 string, arg4 bool) error { - fake.copyImageToTarMutex.Lock() - ret, specificReturn := fake.copyImageToTarReturnsOnCall[len(fake.copyImageToTarArgsForCall)] - fake.copyImageToTarArgsForCall = append(fake.copyImageToTarArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 bool - }{arg1, arg2, arg3, arg4}) - stub := fake.CopyImageToTarStub - fakeReturns := fake.copyImageToTarReturns - fake.recordInvocation("CopyImageToTar", []interface{}{arg1, arg2, arg3, arg4}) - fake.copyImageToTarMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ImgpkgClientFake) CopyImageToTarCallCount() int { - fake.copyImageToTarMutex.RLock() - defer fake.copyImageToTarMutex.RUnlock() - return len(fake.copyImageToTarArgsForCall) -} - -func (fake *ImgpkgClientFake) CopyImageToTarCalls(stub func(string, string, string, bool) error) { - fake.copyImageToTarMutex.Lock() - defer fake.copyImageToTarMutex.Unlock() - fake.CopyImageToTarStub = stub -} - -func (fake *ImgpkgClientFake) CopyImageToTarArgsForCall(i int) (string, string, string, bool) { - fake.copyImageToTarMutex.RLock() - defer fake.copyImageToTarMutex.RUnlock() - argsForCall := fake.copyImageToTarArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ImgpkgClientFake) CopyImageToTarReturns(result1 error) { - fake.copyImageToTarMutex.Lock() - defer fake.copyImageToTarMutex.Unlock() - fake.CopyImageToTarStub = nil - fake.copyImageToTarReturns = struct { - result1 error - }{result1} -} - -func (fake *ImgpkgClientFake) CopyImageToTarReturnsOnCall(i int, result1 error) { - fake.copyImageToTarMutex.Lock() - defer fake.copyImageToTarMutex.Unlock() - fake.CopyImageToTarStub = nil - if fake.copyImageToTarReturnsOnCall == nil { - fake.copyImageToTarReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.copyImageToTarReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ImgpkgClientFake) GetImageTagList(arg1 string) []string { - fake.getImageTagListMutex.Lock() - ret, specificReturn := fake.getImageTagListReturnsOnCall[len(fake.getImageTagListArgsForCall)] - fake.getImageTagListArgsForCall = append(fake.getImageTagListArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetImageTagListStub - fakeReturns := fake.getImageTagListReturns - fake.recordInvocation("GetImageTagList", []interface{}{arg1}) - fake.getImageTagListMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ImgpkgClientFake) GetImageTagListCallCount() int { - fake.getImageTagListMutex.RLock() - defer fake.getImageTagListMutex.RUnlock() - return len(fake.getImageTagListArgsForCall) -} - -func (fake *ImgpkgClientFake) GetImageTagListCalls(stub func(string) []string) { - fake.getImageTagListMutex.Lock() - defer fake.getImageTagListMutex.Unlock() - fake.GetImageTagListStub = stub -} - -func (fake *ImgpkgClientFake) GetImageTagListArgsForCall(i int) string { - fake.getImageTagListMutex.RLock() - defer fake.getImageTagListMutex.RUnlock() - argsForCall := fake.getImageTagListArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ImgpkgClientFake) GetImageTagListReturns(result1 []string) { - fake.getImageTagListMutex.Lock() - defer fake.getImageTagListMutex.Unlock() - fake.GetImageTagListStub = nil - fake.getImageTagListReturns = struct { - result1 []string - }{result1} -} - -func (fake *ImgpkgClientFake) GetImageTagListReturnsOnCall(i int, result1 []string) { - fake.getImageTagListMutex.Lock() - defer fake.getImageTagListMutex.Unlock() - fake.GetImageTagListStub = nil - if fake.getImageTagListReturnsOnCall == nil { - fake.getImageTagListReturnsOnCall = make(map[int]struct { - result1 []string - }) - } - fake.getImageTagListReturnsOnCall[i] = struct { - result1 []string - }{result1} -} - -func (fake *ImgpkgClientFake) PullImage(arg1 string, arg2 string) error { - fake.pullImageMutex.Lock() - ret, specificReturn := fake.pullImageReturnsOnCall[len(fake.pullImageArgsForCall)] - fake.pullImageArgsForCall = append(fake.pullImageArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.PullImageStub - fakeReturns := fake.pullImageReturns - fake.recordInvocation("PullImage", []interface{}{arg1, arg2}) - fake.pullImageMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ImgpkgClientFake) PullImageCallCount() int { - fake.pullImageMutex.RLock() - defer fake.pullImageMutex.RUnlock() - return len(fake.pullImageArgsForCall) -} - -func (fake *ImgpkgClientFake) PullImageCalls(stub func(string, string) error) { - fake.pullImageMutex.Lock() - defer fake.pullImageMutex.Unlock() - fake.PullImageStub = stub -} - -func (fake *ImgpkgClientFake) PullImageArgsForCall(i int) (string, string) { - fake.pullImageMutex.RLock() - defer fake.pullImageMutex.RUnlock() - argsForCall := fake.pullImageArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ImgpkgClientFake) PullImageReturns(result1 error) { - fake.pullImageMutex.Lock() - defer fake.pullImageMutex.Unlock() - fake.PullImageStub = nil - fake.pullImageReturns = struct { - result1 error - }{result1} -} - -func (fake *ImgpkgClientFake) PullImageReturnsOnCall(i int, result1 error) { - fake.pullImageMutex.Lock() - defer fake.pullImageMutex.Unlock() - fake.PullImageStub = nil - if fake.pullImageReturnsOnCall == nil { - fake.pullImageReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.pullImageReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ImgpkgClientFake) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.copyImageFromTarMutex.RLock() - defer fake.copyImageFromTarMutex.RUnlock() - fake.copyImageToTarMutex.RLock() - defer fake.copyImageToTarMutex.RUnlock() - fake.getImageTagListMutex.RLock() - defer fake.getImageTagListMutex.RUnlock() - fake.pullImageMutex.RLock() - defer fake.pullImageMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *ImgpkgClientFake) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ imgpkginterface.ImgpkgClient = new(ImgpkgClientFake) diff --git a/cmd/cli/plugin/isolated-cluster/go.mod b/cmd/cli/plugin/isolated-cluster/go.mod deleted file mode 100644 index 120465550a..0000000000 --- a/cmd/cli/plugin/isolated-cluster/go.mod +++ /dev/null @@ -1,184 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/isolated-cluster - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework => ../../../../ - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/config => ../../../../apis/config - github.com/vmware-tanzu/tanzu-framework/apis/run => ../../../../apis/run - github.com/vmware-tanzu/tanzu-framework/capabilities/client => ../../../../capabilities/client - github.com/vmware-tanzu/tanzu-framework/cli/core => ../../../../cli/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../../../cli/runtime - github.com/vmware-tanzu/tanzu-framework/packageclients => ../../../../packageclients - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common => ../../../../pinniped-components/common - github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr => ../../../../pkg/v1/tkr - github.com/vmware-tanzu/tanzu-framework/tkg => ../../../../tkg - github.com/vmware-tanzu/tanzu-framework/tkr => ../../../../tkr - github.com/vmware-tanzu/tanzu-framework/util => ../../../../util - sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.8 -) - -require ( - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/cppforlife/go-cli-ui v0.0.0-20220425131040-94f26b16bc14 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.24.1 - github.com/pkg/errors v0.9.1 - github.com/spf13/cobra v1.6.1 - github.com/vmware-tanzu/carvel-imgpkg v0.33.2 - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/tkg v0.0.0-00010101000000-000000000000 - golang.org/x/exp v0.0.0-20221215174704-0915cd710c24 - golang.org/x/sync v0.1.0 - sigs.k8s.io/yaml v1.3.0 -) - -require ( - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/Azure/azure-sdk-for-go v66.0.0+incompatible // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.28 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.21 // indirect - github.com/Azure/go-autorest/autorest/azure/auth v0.5.11 // indirect - github.com/Azure/go-autorest/autorest/azure/cli v0.4.5 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Microsoft/go-winio v0.6.0 // indirect - github.com/VividCortex/ewma v1.1.1 // indirect - github.com/apparentlymart/go-cidr v1.1.0 // indirect - github.com/aws/aws-sdk-go-v2 v1.16.16 // indirect - github.com/aws/aws-sdk-go-v2/config v1.17.8 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.12.21 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24 // indirect - github.com/aws/aws-sdk-go-v2/service/ecr v1.17.18 // indirect - github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.4.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.11.23 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.16.19 // indirect - github.com/aws/smithy-go v1.13.3 // indirect - github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20220517224237-e6f29200ae04 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cheggaaa/pb/v3 v3.1.0 // indirect - github.com/chrismellard/docker-credential-acr-env v0.0.0-20220327082430-c57b701bfc08 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.12.1 // indirect - github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e // indirect - github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/docker/cli v20.10.20+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.20+incompatible // indirect - github.com/docker/docker-credential-helpers v0.7.0 // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.5.0 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-openapi/analysis v0.21.4 // indirect - github.com/go-openapi/errors v0.20.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/loads v0.21.2 // indirect - github.com/go-openapi/spec v0.20.7 // indirect - github.com/go-openapi/strfmt v0.21.3 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-openapi/validate v0.22.0 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.2.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/go-containerregistry v0.12.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // 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/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.15.11 // indirect - github.com/kr/pretty v0.3.0 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/mitchellh/go-homedir v1.1.0 // 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/nxadm/tail v1.4.8 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc2 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rogpeppe/go-internal v1.6.2 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.13.0 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/vito/go-interact v1.0.1 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common v0.0.0-00010101000000-000000000000 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - go.uber.org/zap v1.23.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.6.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.2.0 // indirect - k8s.io/api v0.25.3 // indirect - k8s.io/apiextensions-apiserver v0.25.0 // indirect - k8s.io/apimachinery v0.25.3 // indirect - k8s.io/client-go v0.25.3 // indirect - k8s.io/component-base v0.25.3 // indirect - k8s.io/klog/v2 v2.80.0 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.25.3 // indirect - k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 // indirect - sigs.k8s.io/cluster-api v1.2.8 // indirect - sigs.k8s.io/controller-runtime v0.12.3 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect -) diff --git a/cmd/cli/plugin/isolated-cluster/imagepullop/publishimagestotar.go b/cmd/cli/plugin/isolated-cluster/imagepullop/publishimagestotar.go deleted file mode 100644 index cb32ba7290..0000000000 --- a/cmd/cli/plugin/isolated-cluster/imagepullop/publishimagestotar.go +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package imagepullop define imgpkg pull command -package imagepullop - -import ( - "context" - "fmt" - "os" - "path" - "path/filepath" - "reflect" - "strings" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - "golang.org/x/exp/maps" - "golang.org/x/sync/errgroup" - "sigs.k8s.io/yaml" - - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" - imgpkginterface "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/isolated-cluster/imgpkginterface" -) - -const outputDir = "tmp" - -type PublishImagesToTarOptions struct { - TkgImageRepo string - TkgVersion string - PkgClient imgpkginterface.ImgpkgClient - ImageDetails map[string]string - CaCertificate string - Insecure bool -} - -var pullImage = &PublishImagesToTarOptions{} - -var PublishImagestotarCmd = &cobra.Command{ - Use: "download-bundle", - Short: "Download images/bundle from source repo into local disk (at current directory) as TAR files", - Example: ` - # download images/bundle for TKG version v2.1.0 into local disk from repo projects.registry.vmware.com and authenticate source repo with default system CA certificate - tanzu isolated-cluster download-bundle --source-repo mirror-registry.test/tkg --tkg-version v2.1.0 - - # download images/bundle for TKG version v2.1.0 into local disk from an internal registry without validating the certificate - tanzu isolated-cluster download-bundle --source-repo mirror-registry.test/tkg --tkg-version v2.1.0 --insecure - - # download images/bundle for TKG version v2.1.0 into local disk from an internal mirror using a self-signed certificate - tanzu isolated-cluster download-bundle --source-repo mirror-registry.test/tkg --tkg-version v2.1.0 --ca-certificate registry.crt -`, - - RunE: downloadImagesToTar, - SilenceUsage: true, -} - -func init() { - PublishImagestotarCmd.Flags().StringVarP(&pullImage.TkgImageRepo, "source-repo", "", "projects.registry.vmware.com/tkg", "OCI repo where TKG bundles or images are hosted") - PublishImagestotarCmd.Flags().StringVarP(&pullImage.TkgVersion, "tkg-version", "", "", "TKG version (required)") - _ = PublishImagestotarCmd.MarkFlagRequired("tkg-version") - PublishImagestotarCmd.Flags().BoolVarP(&pullImage.Insecure, "insecure", "", false, "Trusts the server certificate without validating it (optional)") - PublishImagestotarCmd.Flags().StringVarP(&pullImage.CaCertificate, "ca-certificate", "", "", "The private repository’s CA certificate (optional)") - pullImage.ImageDetails = map[string]string{} -} - -func (p *PublishImagesToTarOptions) DownloadTkgCompatibilityImage() error { - if p.TkgVersion == "" { - return errors.New("TKG Version is empty") - } - - tkgCompatibilityRelativeImagePath := "tkg-compatibility" - - if !imgpkginterface.IsTKGRTMVersion(p.TkgVersion) { - tkgCompatibilityRelativeImagePath = path.Join(p.TkgVersion, tkgCompatibilityRelativeImagePath) - } - tkgCompatibilityImagePath := path.Join(p.TkgImageRepo, tkgCompatibilityRelativeImagePath) - imageTags := p.PkgClient.GetImageTagList(tkgCompatibilityImagePath) - if len(imageTags) == 0 { - return errors.New("image doesn't have any tags") - } - sourceImageName := tkgCompatibilityImagePath + ":" + imageTags[len(imageTags)-1] - tarFilename := "tkg-compatibility" + "-" + imageTags[len(imageTags)-1] + ".tar" - err := p.PkgClient.CopyImageToTar(sourceImageName, tarFilename, p.CaCertificate, p.Insecure) - if err != nil { - return err - } - p.ImageDetails[tarFilename] = tkgCompatibilityRelativeImagePath - return nil -} - -func (p *PublishImagesToTarOptions) DownloadTkgBomAndComponentImages() (string, error) { - if p.TkgImageRepo == "" || p.TkgVersion == "" { - return "", errors.New("input parameter TkgImageRepo or TkgVersion is empty") - } - tkgBomImagePath := path.Join(p.TkgImageRepo, "tkg-bom") - - sourceImageName := tkgBomImagePath + ":" + p.TkgVersion - tarnames := "tkg-bom" + "-" + p.TkgVersion + ".tar" - err := p.PkgClient.CopyImageToTar(sourceImageName, tarnames, p.CaCertificate, p.Insecure) - if err != nil { - return "", errors.New("error while downloading tkg-bom") - } - p.ImageDetails[tarnames] = tkgBomImagePath - err = p.PkgClient.PullImage(sourceImageName, outputDir) - if err != nil { - return "", err - } - // read the tkg-bom file - tkgBomFilePath := filepath.Join(outputDir, fmt.Sprintf("tkg-bom-%s.yaml", p.TkgVersion)) - b, err := os.ReadFile(tkgBomFilePath) - - // read the tkg-bom file - if err != nil { - return "", errors.Wrapf(err, "read tkg-bom file from %s faild", tkgBomFilePath) - } - tkgBom, _ := tkrv1.NewBom(b) - tempImageDetails := map[string]string{} - - // imgpkg copy each component's artifacts - components, _ := tkgBom.Components() - group, _ := errgroup.WithContext(context.Background()) - group.SetLimit(30) - for _, compInfos := range components { - for _, compInfo := range compInfos { - for _, imageInfo := range compInfo.Images { - sourceImageName = path.Join(p.TkgImageRepo, imageInfo.ImagePath) + ":" + imageInfo.Tag - tarname := imgpkginterface.ReplaceSlash(imageInfo.ImagePath) + "-" + imageInfo.Tag + ".tar" - tempImageDetails[tarname] = imageInfo.ImagePath - i := sourceImageName - j := tarname - group.Go(func() error { - return p.PkgClient.CopyImageToTar(i, j, p.CaCertificate, p.Insecure) - }) - } - } - } - err = group.Wait() - if err != nil { - return "", errors.Wrap(err, "error while downloading images") - } - maps.Copy(p.ImageDetails, tempImageDetails) - return tkgBom.GetCompatibility(), nil -} - -func (p *PublishImagesToTarOptions) DownloadTkrCompatibilityImage(tkrCompatibilityRelativeImagePath string) (tkgVersion []string, err error) { - if p.TkgImageRepo == "" || p.TkgVersion == "" { - return nil, errors.New("input parameter source image repo or TKG Version is empty") - } - - // get the latest tag of tkr-compatibility image - tkrCompatibilityImagePath := path.Join(p.TkgImageRepo, tkrCompatibilityRelativeImagePath) - imageTags := p.PkgClient.GetImageTagList(tkrCompatibilityImagePath) - if len(imageTags) == 0 { - return nil, errors.New("image doesn't have any tags") - } - // inspect the tkr-compatibility image to get the list of compatible tkrs - tkrCompatibilityImageURL := tkrCompatibilityImagePath + ":" + imageTags[len(imageTags)-1] - - sourceImageName := tkrCompatibilityImageURL - err1 := p.PkgClient.PullImage(sourceImageName, outputDir) - if err1 != nil { - return nil, err1 - } - files, err := os.ReadDir(outputDir) - if err != nil { - return nil, errors.Wrapf(err, "read directory tmp failed") - } - if len(files) != 1 || files[0].IsDir() { - return nil, fmt.Errorf("tkr-compatibility image should only have exactly one file inside") - } - tkrCompatibilityFilePath := filepath.Join(outputDir, files[0].Name()) - b, err := os.ReadFile(tkrCompatibilityFilePath) - if err != nil { - return nil, errors.Wrapf(err, "read tkr-compatibility file from %s failed", tkrCompatibilityFilePath) - } - tkrCompatibility := &tkrv1.CompatibilityMetadata{} - if err := yaml.Unmarshal(b, tkrCompatibility); err != nil { - return nil, errors.Wrapf(err, "Unmarshal tkr-compatibility file %s failed", tkrCompatibilityFilePath) - } - // find the corresponding tkg-bom entry - var tkrVersions []string - var found = false - for _, compatibilityInfo := range tkrCompatibility.ManagementClusterVersions { - if compatibilityInfo.TKGVersion == p.TkgVersion { - found = true - tkrVersions = compatibilityInfo.SupportedKubernetesVersions - break - } - } - if !found { - return nil, fmt.Errorf("couldn't find the corresponding tkg-bom version in the tkr-compatibility file") - } - // imgpkg copy the tkr-compatibility image - sourceImageName = tkrCompatibilityImageURL - tarFilename := "tkr-compatibility" + "-" + imageTags[len(imageTags)-1] + ".tar" - err = p.PkgClient.CopyImageToTar(sourceImageName, tarFilename, p.CaCertificate, p.Insecure) - if err != nil { - return nil, err - } - p.ImageDetails[tarFilename] = tkrCompatibilityRelativeImagePath - return tkrVersions, nil -} - -func (p *PublishImagesToTarOptions) DownloadTkrBomAndComponentImages(tkrVersion string) error { - if p.TkgImageRepo == "" { - return errors.New("Source Repo is empty") - } - tkrTag := imgpkginterface.UnderscoredPlus(tkrVersion) - tkrBomImagePath := path.Join(p.TkgImageRepo, "tkr-bom") - sourceImageName := tkrBomImagePath + ":" + tkrTag - tarFilename := "tkr-bom" + "-" + tkrTag + ".tar" - err := p.PkgClient.CopyImageToTar(sourceImageName, tarFilename, p.CaCertificate, p.Insecure) - if err != nil { - return err - } - p.ImageDetails[tarFilename] = "tkr-bom" - sourceImageName = tkrBomImagePath + ":" + tkrTag - err = p.PkgClient.PullImage(sourceImageName, outputDir) - if err != nil { - return err - } - // read the tkr-bom file - tkrBomFilePath := path.Join(outputDir, fmt.Sprintf("tkr-bom-%s.yaml", tkrVersion)) - b, err := os.ReadFile(tkrBomFilePath) - if err != nil { - return errors.Wrapf(err, "read tkr-bom file from %s failed", tkrBomFilePath) - } - tkgBom, _ := tkrv1.NewBom(b) - // imgpkg copy each component's artifacts - components, _ := tkgBom.Components() - tempImageDetails := map[string]string{} - group, _ := errgroup.WithContext(context.Background()) - group.SetLimit(30) - for _, compInfos := range components { - for _, compInfo := range compInfos { - for _, imageInfo := range compInfo.Images { - sourceImageName = filepath.Join(p.TkgImageRepo, imageInfo.ImagePath) + ":" + imageInfo.Tag - tarname := imgpkginterface.ReplaceSlash(imageInfo.ImagePath) + "-" + imageInfo.Tag + ".tar" - tempImageDetails[tarname] = imageInfo.ImagePath - i := sourceImageName - j := tarname - group.Go(func() error { - return p.PkgClient.CopyImageToTar(i, j, p.CaCertificate, p.Insecure) - }) - } - } - } - err = group.Wait() - if err != nil { - return errors.Wrap(err, "error while downloading images") - } - maps.Copy(p.ImageDetails, tempImageDetails) - return nil -} - -func (p *PublishImagesToTarOptions) DownloadTkgPackagesImages(tkrVersions []string) error { - tkgBomImagePath := path.Join(p.TkgImageRepo, "tkg-bom") - sourceImageName := tkgBomImagePath + ":" + p.TkgVersion - err := p.PkgClient.PullImage(sourceImageName, outputDir) - if err != nil { - return err - } - tkgBomFilePath := filepath.Join(outputDir, fmt.Sprintf("tkg-bom-%s.yaml", p.TkgVersion)) - b, err := os.ReadFile(tkgBomFilePath) - - // read the tkg-bom file - if err != nil { - return errors.Wrapf(err, "read tkg-bom file from %s faild", tkgBomFilePath) - } - - tkgBom, _ := tkrv1.NewTkgBom(b) - - tkgPackageRepo, err := tkgBom.GetTKRPackageRepo() - if err != nil { - return err - } - tkgPackageRepoStruct := reflect.ValueOf(tkgPackageRepo) - - tkgPackage, err := tkgBom.GetTKRPackage() - if err != nil { - return err - } - tkgPackageStruct := reflect.ValueOf(tkgPackage) - tempImageDetails := map[string]string{} - group, _ := errgroup.WithContext(context.Background()) - group.SetLimit(30) - for _, tkrVersion := range tkrVersions { - tkrVersion = imgpkginterface.UnderscoredPlus(tkrVersion) - for i := 0; i < tkgPackageRepoStruct.NumField(); i++ { - imageName := tkgPackageRepoStruct.Field(i).Interface().(string) - sourceImageName := filepath.Join(p.TkgImageRepo, imageName) + ":" + tkrVersion - tarname := imageName + "-" + tkrVersion + ".tar" - tempImageDetails[tarname] = imageName - i := sourceImageName - j := tarname - group.Go(func() error { - return p.PkgClient.CopyImageToTar(i, j, p.CaCertificate, p.Insecure) - }) - } - for i := 0; i < tkgPackageStruct.NumField(); i++ { - imageName := tkgPackageStruct.Field(i).Interface().(string) - sourceImageName := filepath.Join(p.TkgImageRepo, imageName) + ":" + tkrVersion - tarname := imageName + "-" + tkrVersion + ".tar" - tempImageDetails[tarname] = imageName - i := sourceImageName - j := tarname - group.Go(func() error { - return p.PkgClient.CopyImageToTar(i, j, p.CaCertificate, p.Insecure) - }) - } - } - err = group.Wait() - if err != nil { - return errors.Wrap(err, "error while downloading images") - } - maps.Copy(p.ImageDetails, tempImageDetails) - return nil -} - -func downloadImagesToTar(cmd *cobra.Command, args []string) error { - pullImage.PkgClient = &imgpkginterface.Imgpkg{} - if !strings.HasPrefix(pullImage.TkgVersion, "v") { - return fmt.Errorf("invalid TKG Tag %s", pullImage.TkgVersion) - } - err := pullImage.DownloadTkgCompatibilityImage() - if err != nil { - return err - } - tkrCompatibilityRelativeImagePath, err := pullImage.DownloadTkgBomAndComponentImages() - - if err != nil { - return err - } - tkrVersions, err := pullImage.DownloadTkrCompatibilityImage(tkrCompatibilityRelativeImagePath) - if err != nil { - return errors.Wrapf(err, "Error while retrieving tkrVersions") - } - - err = pullImage.DownloadTkgPackagesImages(tkrVersions) - if err != nil { - fmt.Printf("TkgPackagesImages Not found %s", err) - } - - for _, tkrVersion := range tkrVersions { - err = pullImage.DownloadTkrBomAndComponentImages(tkrVersion) - if err != nil { - return err - } - } - data, _ := yaml.Marshal(&pullImage.ImageDetails) - err2 := os.WriteFile("publish-images-fromtar.yaml", data, 0666) - if err2 != nil { - return errors.Wrapf(err2, "Error while writing publish-images-fromtar.yaml file") - } - return nil -} diff --git a/cmd/cli/plugin/isolated-cluster/imagepushop/publishimagesfromtar.go b/cmd/cli/plugin/isolated-cluster/imagepushop/publishimagesfromtar.go deleted file mode 100644 index af65d6ad60..0000000000 --- a/cmd/cli/plugin/isolated-cluster/imagepushop/publishimagesfromtar.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package imagepushop define imgpkg push command -package imagepushop - -import ( - "os" - "path" - "path/filepath" - - "context" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - "golang.org/x/sync/errgroup" - "sigs.k8s.io/yaml" - - imgpkginterface "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/isolated-cluster/imgpkginterface" -) - -type PublishImagesFromTarOptions struct { - TkgTarFilePath string - CustomImageRepoCertificate string - PkgClient imgpkginterface.ImgpkgClient - DestinationRepository string - Insecure bool -} - -var pushImage = &PublishImagesFromTarOptions{} - -var PublishImagesfromtarCmd = &cobra.Command{ - Use: "upload-bundle", - Short: "upload images/bundle to private repository from tar files that are stored in local disk.", - Example: ` - # upload images/bundle from tar files that are stored in the relative directory ./tkg-images to a /tkg repository on a internal-registry.test mirror - tanzu isolated-cluster upload-bundle --destination-repo internal-registry.test/tkg --source-directory ./tkg-images - - # upload images/bundle from tar files that are stored in the relative directory ./tkg-images to a /tkg repository on a internal-registry.test mirror without any TLS validation of the certificate - tanzu isolated-cluster upload-bundle --destination-repo internal-registry.test/tkg --source-directory ./tkg-images --insecure - - # upload images/bundle from tar files that are stored in the relative directory ./tkg-images to a /tkg repository on a internal-registry.test mirror with a self-signed or internally approved CA Certificate. - tanzu isolated-cluster upload-bundle --destination-repo internal-registry.test/tkg --source-directory ./tkg-images --ca-certificate registry.crt -`, - - RunE: publishImagesFromTar, - SilenceUsage: false, -} - -func init() { - PublishImagesfromtarCmd.Flags().StringVarP(&pushImage.TkgTarFilePath, "source-directory", "", "", "Path to the directory that contains the TAR file (required)") - _ = PublishImagesfromtarCmd.MarkFlagRequired("source-directory") - PublishImagesfromtarCmd.Flags().StringVarP(&pushImage.DestinationRepository, "destination-repo", "", "", "Private OCI repository where the images should be hosted in air-gapped (required)") - _ = PublishImagesfromtarCmd.MarkFlagRequired("destination-repo") - PublishImagesfromtarCmd.Flags().StringVarP(&pushImage.CustomImageRepoCertificate, "ca-certificate", "", "", "The private repository’s CA certificate (optional)") - PublishImagesfromtarCmd.Flags().BoolVarP(&pushImage.Insecure, "insecure", "", false, "Trusts the private repository’s certificate without validating it (optional)") -} - -func (p *PublishImagesFromTarOptions) PushImageToRepo() error { - yamlFile := path.Join(p.TkgTarFilePath, "publish-images-fromtar.yaml") - yfile, err := os.ReadFile(yamlFile) - if err != nil { - return errors.Wrapf(err, "Error while reading %s file", yamlFile) - } - - data := make(map[string]string) - err = yaml.Unmarshal(yfile, &data) - - if err != nil { - return errors.Wrapf(err, "Error while parsing publish-images-fromtar.yaml file") - } - group, _ := errgroup.WithContext(context.Background()) - for tarfile, path := range data { - fileName := filepath.Join(p.TkgTarFilePath, tarfile) - destPath := filepath.Join(p.DestinationRepository, path) - i := fileName - j := destPath - group.Go(func() error { - return p.PkgClient.CopyImageFromTar(i, j, p.CustomImageRepoCertificate, p.Insecure) - }) - } - err = group.Wait() - if err != nil { - return errors.Wrap(err, "error while uploading the images") - } - - return nil -} - -func publishImagesFromTar(cmd *cobra.Command, args []string) error { - pushImage.PkgClient = &imgpkginterface.Imgpkg{} - - err := pushImage.PushImageToRepo() - if err != nil { - return err - } - return nil -} diff --git a/cmd/cli/plugin/isolated-cluster/imgpkginterface/client_imgpkg.go b/cmd/cli/plugin/isolated-cluster/imgpkginterface/client_imgpkg.go deleted file mode 100644 index a7e3e51c76..0000000000 --- a/cmd/cli/plugin/isolated-cluster/imgpkginterface/client_imgpkg.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package imgpkginterface ImgPkgClient defines functions to pull/push/List images -package imgpkginterface - -import ( - "bytes" - "sort" - "strconv" - "strings" - - "github.com/cppforlife/go-cli-ui/ui" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/carvel-imgpkg/pkg/imgpkg/bundle" - "github.com/vmware-tanzu/carvel-imgpkg/pkg/imgpkg/cmd" - "github.com/vmware-tanzu/carvel-imgpkg/pkg/imgpkg/registry" - - v1 "github.com/vmware-tanzu/carvel-imgpkg/pkg/imgpkg/v1" -) - -type Imgpkg struct { -} - -func (c *Imgpkg) CopyImageFromTar(sourceImageName, destImageRepo, customImageRepoCertificate string, insecureconnection bool) error { - confUI := ui.NewConfUI(ui.NewNoopLogger()) - copyOptions := cmd.NewCopyOptions(confUI) - copyOptions.Concurrency = 1 - copyOptions.TarFlags.TarSrc = sourceImageName - copyOptions.RepoDst = destImageRepo - copyOptions.RegistryFlags.Insecure = insecureconnection - if customImageRepoCertificate != "" { - copyOptions.RegistryFlags.CACertPaths = []string{customImageRepoCertificate} - } - err := copyOptions.Run() - if err != nil { - return err - } - return nil -} - -func (c *Imgpkg) CopyImageToTar(sourceImageName, destImageRepo, customImageRepoCertificate string, insecureconnection bool) error { - confUI := ui.NewConfUI(ui.NewNoopLogger()) // TODO: this parameter should be given by the caller instead of being hardcoded - copyOptions := cmd.NewCopyOptions(confUI) - copyOptions.TarFlags.Resume = true - copyOptions.IncludeNonDistributable = true - copyOptions.Concurrency = 3 - copyOptions.RegistryFlags.Insecure = insecureconnection - reg, err := registry.NewSimpleRegistry(registry.Opts{}) - if err != nil { - return err - } - newBundle := bundle.NewBundle(sourceImageName, reg) - isBundle, _ := newBundle.IsBundle() - if isBundle { - copyOptions.BundleFlags = cmd.BundleFlags{Bundle: sourceImageName} - } else { - copyOptions.ImageFlags = cmd.ImageFlags{Image: sourceImageName} - } - copyOptions.TarFlags.TarDst = destImageRepo - if customImageRepoCertificate != "" { - copyOptions.RegistryFlags.CACertPaths = []string{customImageRepoCertificate} - } - err = copyOptions.Run() - if err != nil { - return err - } - return nil -} - -func (c *Imgpkg) PullImage(sourceImageName, destDir string) error { - var outputBuf, errorBuf bytes.Buffer - writerUI := ui.NewWriterUI(&outputBuf, &errorBuf, nil) // TODO: this parameter should be given by the caller instead of being hardcoded - pullOptions := cmd.NewPullOptions(writerUI) - pullOptions.OutputPath = destDir - pullOptions.ImageFlags = cmd.ImageFlags{Image: sourceImageName} - err := pullOptions.Run() - if err != nil { - return err - } - return nil -} - -func (c *Imgpkg) GetImageTagList(sourceImageName string) []string { - tagInfo, _ := v1.TagList(sourceImageName, false, registry.Opts{}) - var imageTags []string - for _, tag := range tagInfo.Tags { - imageTags = append(imageTags, tag.Tag) - } - sort.SliceStable(imageTags, func(i, j int) bool { - vi, err := strconv.Atoi(strings.TrimPrefix(imageTags[i], "v")) - if err != nil { - PrintErrorAndExit(errors.Wrapf(err, "parse tkg-compatibility image tag %s failed", imageTags[i])) - } - vj, err := strconv.Atoi(strings.TrimPrefix(imageTags[j], "v")) - if err != nil { - PrintErrorAndExit(errors.Wrapf(err, "parse tkg-compatibility image tag %s failed", imageTags[j])) - } - return vi < vj - }) - return imageTags -} diff --git a/cmd/cli/plugin/isolated-cluster/imgpkginterface/interface.go b/cmd/cli/plugin/isolated-cluster/imgpkginterface/interface.go deleted file mode 100644 index 2dec13c9ff..0000000000 --- a/cmd/cli/plugin/isolated-cluster/imgpkginterface/interface.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package imgpkginterface ImgPkgClient defines functions to pull/push/List images -package imgpkginterface - -type ImgpkgClient interface { - CopyImageFromTar(sourceImageName string, destImageRepo string, customImageRepoCertificate string, insecureconnection bool) error - CopyImageToTar(sourceImageName string, destImageRepo string, customImageRepoCertificate string, insecureconnection bool) error - PullImage(sourceImageName string, destDir string) error - GetImageTagList(sourceImageName string) []string -} diff --git a/cmd/cli/plugin/isolated-cluster/imgpkginterface/util.go b/cmd/cli/plugin/isolated-cluster/imgpkginterface/util.go deleted file mode 100644 index 2fb8902e05..0000000000 --- a/cmd/cli/plugin/isolated-cluster/imgpkginterface/util.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package imgpkginterface - -import ( - "fmt" - "os" - "strconv" - "strings" -) - -func PrintErrorAndExit(err error) { - fmt.Printf("failed with error %s\n", err.Error()) - os.Exit(1) -} - -func IsTKGRTMVersion(tag string) bool { - tag = strings.TrimPrefix(tag, "v") - versions := strings.Split(tag, ".") - if len(versions) != 3 { - return false - } - for _, version := range versions { - if _, err := strconv.Atoi(version); err != nil { - return false - } - } - return true -} - -func UnderscoredPlus(s string) string { - return strings.Replace(s, "+", "_", -1) -} - -func ReplaceSlash(s string) string { - return strings.Replace(s, "/", "-", -1) -} diff --git a/cmd/cli/plugin/isolated-cluster/main.go b/cmd/cli/plugin/isolated-cluster/main.go deleted file mode 100644 index e7de6d53ff..0000000000 --- a/cmd/cli/plugin/isolated-cluster/main.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/isolated-cluster/imagepullop" - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/isolated-cluster/imagepushop" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "isolated-cluster", - Description: "Prepopulating images/bundle for internet-restricted environments", - Group: cliapi.RunCmdGroup, - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, -} - -var logLevel int32 -var logFile string - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - - p.Cmd.PersistentFlags().Int32VarP(&logLevel, "verbose", "v", 0, "Number for the log level verbosity(0-9)") - p.Cmd.PersistentFlags().StringVar(&logFile, "log-file", "", "Log file path") - p.Cmd.SilenceUsage = true - p.AddCommands( - imagepullop.PublishImagestotarCmd, - imagepushop.PublishImagesfromtarCmd, - ) - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/cmd/cli/plugin/isolated-cluster/test/main.go b/cmd/cli/plugin/isolated-cluster/test/main.go deleted file mode 100644 index 8eeec424f9..0000000000 --- a/cmd/cli/plugin/isolated-cluster/test/main.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint: deadcode,unused,stylecheck -package test - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -func main() { - pluginName := "isolated-cluster" - descriptor := clitest.NewTestFor(pluginName) - - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - if err := Cleanup(); err != nil { - return err - } - return nil -} - -// Cleanup the test. -func Cleanup() error { - return nil -} diff --git a/cmd/cli/plugin/isolated-cluster/test/publishimagesfromtar_test.go b/cmd/cli/plugin/isolated-cluster/test/publishimagesfromtar_test.go deleted file mode 100644 index 356cde4a77..0000000000 --- a/cmd/cli/plugin/isolated-cluster/test/publishimagesfromtar_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/isolated-cluster/fakes" - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/isolated-cluster/imagepushop" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -func TestAPIs(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Publish image from tar file") -} - -var _ = Describe("pushImageToRepo()", func() { - pushImage := &imagepushop.PublishImagesFromTarOptions{} - - BeforeEach(func() { - pushImage.PkgClient = &fakes.ImgpkgClientFake{} - pushImage.TkgTarFilePath = "./testdata" - - }) - - When("publish-images-fromtar.yaml, which contain tar file name and destination repo path, doesn't existed", func() { - It("should return err", func() { - err := pushImage.PushImageToRepo() - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("Error while reading testdata/publish-images-fromtar.yaml file")) - }) - }) - When("publish-images-fromtar.yaml, which contain tar file name and destination repo path, has wrong format", func() { - It("should return err", func() { - err := utils.CopyFile("./testdata/publish-images-fromtar_with_error", "./testdata/publish-images-fromtar.yaml") - Expect(err).ToNot(HaveOccurred()) - err = pushImage.PushImageToRepo() - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("Error while parsing publish-images-fromtar.yaml file")) - err = utils.DeleteFile("./testdata/publish-images-fromtar.yaml") - Expect(err).ToNot(HaveOccurred()) - }) - }) - When("PushImageToRepo successful", func() { - It("should return nil", func() { - err := utils.CopyFile("./testdata/publish-images-fromtar", "./testdata/publish-images-fromtar.yaml") - Expect(err).ToNot(HaveOccurred()) - err = pushImage.PushImageToRepo() - Expect(err).ToNot(HaveOccurred()) - err = utils.DeleteFile("./testdata/publish-images-fromtar.yaml") - Expect(err).ToNot(HaveOccurred()) - }) - }) - -}) diff --git a/cmd/cli/plugin/isolated-cluster/test/publishimagestotar_test.go b/cmd/cli/plugin/isolated-cluster/test/publishimagestotar_test.go deleted file mode 100644 index dfd79c92d0..0000000000 --- a/cmd/cli/plugin/isolated-cluster/test/publishimagestotar_test.go +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package test - -import ( - "errors" - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/isolated-cluster/fakes" - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/isolated-cluster/imagepullop" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -const tkgversion = "v1.3.0" -const tkgImageRepo = "projects.registry.vmware.com/tkg" - -var _ = Describe("DownloadTkgCompatibilityImage()", func() { - var ( - fake = &fakes.ImgpkgClientFake{} - ) - - pullImage := &imagepullop.PublishImagesToTarOptions{} - - JustBeforeEach(func() { - pullImage.ImageDetails = map[string]string{} - pullImage.TkgVersion = tkgversion - - }) - - When("tkg-compatibility image is not present in VMware registry", func() { - It("should return err", func() { - pullImage.PkgClient = fake - err := pullImage.DownloadTkgCompatibilityImage() - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("image doesn't have any tags")) - }) - }) - When("DownloadTkgCompatibilityImage successful", func() { - It("should return nil", func() { - tags := []string{"v1", "v3", "v2"} - fake.GetImageTagListReturns(tags) - pullImage.PkgClient = fake - err := pullImage.DownloadTkgCompatibilityImage() - Expect(err).ToNot(HaveOccurred()) - images := len(pullImage.ImageDetails) - Expect(images).To(Equal(1)) - }) - }) -}) - -var _ = Describe("DownloadTkgBomAndComponentImages()", func() { - var ( - fake = &fakes.ImgpkgClientFake{} - ) - pullImage := &imagepullop.PublishImagesToTarOptions{} - JustBeforeEach(func() { - pullImage.ImageDetails = map[string]string{} - pullImage.TkgImageRepo = tkgImageRepo - pullImage.TkgVersion = tkgversion - }) - - When("Error while downloading tkg-bom", func() { - It("should return err", func() { - fake.CopyImageToTarReturns(errors.New("")) - pullImage.PkgClient = fake - tkgCompatibilityRelativeImagePath, err := pullImage.DownloadTkgBomAndComponentImages() - Expect(err).To(HaveOccurred()) - Expect(tkgCompatibilityRelativeImagePath).To(ContainSubstring("")) - Expect(err.Error()).To(ContainSubstring("error while downloading tkg-bom")) - }) - }) - When("DownloadTkgBomAndComponentImages successful", func() { - It("should return nil", func() { - err := os.MkdirAll("./tmp", os.ModePerm) - Expect(err).ToNot(HaveOccurred()) - fake.CopyImageToTarReturns(nil) - Expect(err).ToNot(HaveOccurred()) - pullImage.PkgClient = fake - err = utils.CopyFile("./testdata/tkg-bom-v1.3.0.yaml", "./tmp/tkg-bom-v1.3.0.yaml") - Expect(err).ToNot(HaveOccurred()) - tkgCompatibilityRelativeImagePath, err := pullImage.DownloadTkgBomAndComponentImages() - Expect(err).ToNot(HaveOccurred()) - Expect(tkgCompatibilityRelativeImagePath).To(Equal("tkr-compatibility")) - images := len(pullImage.ImageDetails) - Expect(images).To(Equal(37)) - err = utils.DeleteFile("./tmp/tkg-bom-v1.3.0.yaml") - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) - -var _ = Describe("DownloadTkrCompatibilityImage()", func() { - var ( - fake = &fakes.ImgpkgClientFake{} - ) - pullImage := &imagepullop.PublishImagesToTarOptions{} - - JustBeforeEach(func() { - pullImage.ImageDetails = map[string]string{} - pullImage.TkgImageRepo = tkgImageRepo - pullImage.TkgVersion = tkgversion - - }) - - When("tkr-compatibility image is not present in VMware registry", func() { - It("should return err", func() { - pullImage.PkgClient = fake - list, err := pullImage.DownloadTkrCompatibilityImage("tkr-compatibility") - _ = list - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("image doesn't have any tags")) - }) - }) - When("DownloadTkrCompatibilityImage successful", func() { - It("should return nil", func() { - tags := []string{"v19"} - err := os.MkdirAll("./tmp", os.ModePerm) - Expect(err).ToNot(HaveOccurred()) - fake.GetImageTagListReturns(tags) - pullImage.PkgClient = fake - err = utils.CopyFile("./testdata/tkr-compatibility.yaml", "./tmp/tkr-compatibility.yaml") - Expect(err).ToNot(HaveOccurred()) - list, err := pullImage.DownloadTkrCompatibilityImage("tkr-compatibility") - _ = list - Expect(err).ToNot(HaveOccurred()) - images := len(pullImage.ImageDetails) - Expect(images).To(Equal(1)) - err = utils.DeleteFile("./tmp/tkr-compatibility.yaml") - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) - -var _ = Describe("DownloadTkrBomAndComponentImages()", func() { - var ( - fake = &fakes.ImgpkgClientFake{} - ) - pullImage := &imagepullop.PublishImagesToTarOptions{} - - JustBeforeEach(func() { - pullImage.ImageDetails = map[string]string{} - pullImage.TkgImageRepo = tkgImageRepo - pullImage.TkgVersion = tkgversion - - }) - When("Error while downloading tkr bom", func() { - It("should return err", func() { - fake.CopyImageToTarReturns(errors.New("error while downloading tkr bom")) - pullImage.PkgClient = fake - err := pullImage.DownloadTkrBomAndComponentImages("v1.20.4+vmware.1-tkg.1") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error while downloading tkr bom")) - }) - }) - When("DownloadTkrBomAndComponentImages successful", func() { - It("should return nil", func() { - err := os.MkdirAll("./tmp", os.ModePerm) - Expect(err).ToNot(HaveOccurred()) - fake.CopyImageToTarReturns(nil) - pullImage.PkgClient = fake - err = utils.CopyFile("./testdata/tkr-bom-v1.17.16+vmware.2-tkg.1.yaml", "./tmp/tkr-bom-v1.17.16+vmware.2-tkg.1.yaml") - Expect(err).ToNot(HaveOccurred()) - err = pullImage.DownloadTkrBomAndComponentImages("v1.17.16+vmware.2-tkg.1") - Expect(err).ToNot(HaveOccurred()) - images := len(pullImage.ImageDetails) - Expect(images).To(Equal(10)) - err = utils.DeleteFile("./tmp/tkr-bom-v1.17.16+vmware.2-tkg.1.yaml") - Expect(err).ToNot(HaveOccurred()) - }) - }) - -}) - -var _ = Describe("DownloadTkgPackagesImages()", func() { - var ( - fake = &fakes.ImgpkgClientFake{} - ) - pullImage := &imagepullop.PublishImagesToTarOptions{} - tkrVersions := []string{"v1.24.6+vmware.1-tkg.1-fc.1", "v1.22.11+vmware.2-tkg.2-fc.1", "v1.23.13+vmware.1-tkg.1-fc.1"} - - JustBeforeEach(func() { - pullImage.ImageDetails = map[string]string{} - pullImage.TkgImageRepo = tkgImageRepo - pullImage.TkgVersion = tkgversion - - }) - When("Error while downloading tkr bom", func() { - It("should return err", func() { - fake.CopyImageToTarReturns(errors.New("error while downloading tkr bom")) - pullImage.PkgClient = fake - err := pullImage.DownloadTkgPackagesImages(tkrVersions) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("no such file or directory")) - }) - }) - When("DownloadTkgPackagesImages successful", func() { - It("should return nil", func() { - err := os.MkdirAll("./tmp", os.ModePerm) - Expect(err).ToNot(HaveOccurred()) - fake.CopyImageToTarReturns(nil) - pullImage.PkgClient = fake - err = utils.CopyFile("./testdata/tkg-bom-v1.3.0.yaml", "./tmp/tkg-bom-v1.3.0.yaml") - Expect(err).ToNot(HaveOccurred()) - err = pullImage.DownloadTkgPackagesImages(tkrVersions) - Expect(err).ToNot(HaveOccurred()) - images := len(pullImage.ImageDetails) - Expect(images).To(Equal(18)) - err = utils.DeleteFile("./tmp/tkg-bom-v1.3.0.yaml") - Expect(err).ToNot(HaveOccurred()) - }) - }) - -}) diff --git a/cmd/cli/plugin/isolated-cluster/test/testdata/publish-images-fromtar b/cmd/cli/plugin/isolated-cluster/test/testdata/publish-images-fromtar deleted file mode 100644 index 4ceb01592f..0000000000 --- a/cmd/cli/plugin/isolated-cluster/test/testdata/publish-images-fromtar +++ /dev/null @@ -1,2 +0,0 @@ -ako-operator-v1.6.0_vmware.16.tar: testing.io/ako-operator - diff --git a/cmd/cli/plugin/isolated-cluster/test/testdata/publish-images-fromtar_with_error b/cmd/cli/plugin/isolated-cluster/test/testdata/publish-images-fromtar_with_error deleted file mode 100644 index 4c109c8e65..0000000000 --- a/cmd/cli/plugin/isolated-cluster/test/testdata/publish-images-fromtar_with_error +++ /dev/null @@ -1,3 +0,0 @@ -ako-operator-v1.6.0_vmware.16.tar: testing.io/ako-operator - antrea-advanced-debian-v1.5.3.tar: testing.io/antrea-advanced-debian - diff --git a/cmd/cli/plugin/isolated-cluster/test/testdata/tkg-bom-v1.3.0.yaml b/cmd/cli/plugin/isolated-cluster/test/testdata/tkg-bom-v1.3.0.yaml deleted file mode 100644 index 071626087c..0000000000 --- a/cmd/cli/plugin/isolated-cluster/test/testdata/tkg-bom-v1.3.0.yaml +++ /dev/null @@ -1,306 +0,0 @@ -default: - k8sVersion: v1.19.3+vmware.1-tkg.1 -release: - version: 1.2.1-rc.1 -components: - kubernetes_autoscaler: - - version: v1.19.1+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.19.1_vmware.1 - metadata: - k8sVersion: v1.19.1+vmware.1 - - version: v1.18.3+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.18.3_vmware.1 - metadata: - k8sVersion: v1.18.3+vmware.1 - - version: v1.17.4+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.17.4_vmware.1 - metadata: - k8sVersion: v1.17.4+vmware.1 - calico_all: - - version: v3.11.3+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni-plugin - tag: v3.11.3_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.11.3_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.11.3_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon - tag: v3.11.3_vmware.1 - metadata: - ANY_NAME: ANY_INTERFACE - alertmanager: - - version: v0.20.0+vmware.1 - images: - alertmanagerImage: - imagePath: prometheus/alertmanager - tag: v0.11.1_vmware.5 - antrea: - - version: v0.11.1+vmware.5 - images: - antreaImage: - imagePath: antrea/antrea-debian - tag: v0.11.1_vmware.5 - cadvisorImage: - - version: v0.36.0+vmware.1 - images: - cadvisorImage: - imagePath: prometheus/cadvisor - tag: v0.36.0_vmware.1 - ccm_controller: - - version: v0.36.0+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.2.1_vmware.1 - cloud-provider-azure: - - version: v0.5.1+vmware.2 - cloud_provider_vsphere: - - version: v1.2.1+vmware.1 - cluster-api-provider-azure: - - version: v0.4.8-47-gfbb2d55b+vmware.1 - images: - capzControllerImage: - imagePath: cluster-api/cluster-api-azure-controller - tag: v0.4.8-47-gfbb2d55b_vmware.1 - cluster_api: - - version: v0.3.11-13-ga74685ee9+vmware.1 - images: - capiControllerImage: - imagePath: cluster-api/cluster-api-controller - tag: v0.3.11-13-ga74685ee9_vmware.1 - cluster_api_aws: - - version: v0.6.3+vmware.1 - images: - capaControllerImage: - imagePath: cluster-api/cluster-api-aws-controller - tag: v0.6.3_vmware.1 - cluster_api_vsphere: - - version: v0.7.1+vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/cluster-api-vsphere-controller - tag: v0.7.1_vmware.1 - cluster_api_docker: - - version: v0.3.11-13-ga74685ee9_vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/capd-manager - tag: v0.3.11-13-ga74685ee9_vmware.1 - cni_plugins: - - version: v0.8.7+vmware.3 - configmap-reload: - - version: v0.3.0+vmware.1 - images: - configmapReloadImage: - imagePath: prometheus/configmap-reload - tag: v0.3.0_vmware.1 - containerd: - - version: v1.4.1+vmware.1 - contour: - - version: v1.8.1+vmware.1 - crash-diagnostics: - - version: v0.3.2+vmware.1 - cri_tools: - - version: v1.18.0+vmware.3 - csi_attacher: - - version: v2.0.0+vmware.2 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v2.0.0_vmware.2 - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.0.1_vmware.1 - csi_livenessprobe: - - version: v1.1.0+vmware.8 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v1.1.0_vmware.8 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.0.1_vmware.1 - csi_node_driver_registrar: - - version: v1.2.0+vmware.2 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v1.2.0_vmware.2 - csi_provisioner: - - version: v2.0.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v2.0.0_vmware.1 - dex: - - version: v2.27.0+vmware.1 - envoy: - - version: v1.15.0+vmware.1 - fluent-bit: - - version: v1.6.9+vmware.1 - gangway: - - version: v3.2.0+vmware.2 - grafana: - - version: v7.0.3+vmware.1 - harbor: - - version: v2.0.2+vmware.1 - jetstack_cert-manager: - - version: v0.16.1+vmware.1 - images: - certMgrControllerImage: - imagePath: cert-manager/cert-manager-controller - tag: v0.16.1_vmware.1 - certMgrInjectorImage: - imagePath: cert-manager/cert-manager-cainjector - tag: v0.16.1_vmware.1 - certMgrWebhookImage: - imagePath: cert-manager/cert-manager-webhook - tag: v0.16.1_vmware.1 - k8s-sidecar: - - version: v0.1.144+vmware.1 - images: - k8sSidecarImage: - imagePath: grafana/k8s-sidecar - tag: v0.1.144_vmware.1 - kapp_controller: - - version: v0.9.0+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.9.0_vmware.1 - kube-state-metrics: - - version: v1.9.5+vmware.1 - images: - kubeStateMetricsImage: - imagePath: prometheus/kube-state-metrics - tag: v1.9.5_vmware.1 - kube_vip: - - version: v0.2.0+vmware.1 - images: - kubeVipImage: - imagePath: kube-vip - tag: v0.2.0_vmware.1 - kube_rbac_proxy: - - version: v0.4.1+vmware.2 - images: - kubeProxy: - imagePath: kube-proxy - tag: v1.19.3_vmware.1 - kubeRbacProxyControllerImage: - imagePath: cluster-api/kube-rbac-proxy - tag: v0.4.1_vmware.2 - kubernetes-sigs_kind: - - version: v0.8.1-1.19.3+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.19.3_vmware.1 - prometheus: - - version: v2.18.1+vmware.1 - prometheus_node_exporter: - - version: v0.18.1+vmware.1 - pushgateway: - - version: v1.2.0+vmware.1 - metrics-server: - - version: v0.4.0+vmware.1 - sonobuoy: - - version: v0.19.0+vmware.1 - tanzu_core: - - version: v1.4.0-pre-alpha-1-296-gb098dcc - images: - providerTemplateImage: - imagePath: sandbox/tanzu_core/provider/provider-templates - tag: v1.4.0-pre-alpha-1-296-gb098dcc - tkrImage: - imagePath: sandbox/tanzu_core/tkr/tkr-controller-manager - tag: v1.4.0-pre-alpha-1-296-gb098dcc - tkg_extensions: - - version: v1.2.0+vmware.1 - tkg_telemetry: - - version: v1.2.0+vmware.1 - images: - tkgTelemetryImage: - imagePath: tkg-telemetry - tag: v1.2.0_vmware.1 - velero: - - version: v1.4.3+vmware.1 - velero-plugin-for-aws: - - version: v1.1.0+vmware.1 - velero-plugin-for-microsoft-azure: - - version: v1.1.0+vmware.1 - velero-plugin-for-vsphere: - - version: v1.0.2+vmware.1 - vsphere_csi_driver: - - version: v2.0.1+vmware.1 - -kindKubeadmConfigSpec: -- "kind: Cluster" -- "apiVersion: kind.x-k8s.io/v1alpha4" -- "kubeadmConfigPatches:" -- "- |" -- " apiVersion: kubeadm.k8s.io/v1beta2" -- " kind: ClusterConfiguration" -- " imageRepository: registry.tkg.vmware.run" -- " etcd:" -- " local:" -- " imageRepository: registry.tkg.vmware.run" -- " imageTag: v3.4.13_vmware.4" -- " dns:" -- " type: CoreDNS" -- " imageRepository: registry.tkg.vmware.run" -- " imageTag: v1.7.0_vmware.5" -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -extensions: - contour: - clusterTypes: - - workload - managedBy: user - dex: - clusterTypes: - - management - managedBy: user - fluent-bit: - clusterTypes: - - workload - managedBy: user - gangway: - clusterTypes: - - workload - managedBy: user - grafana: - clusterTypes: - - workload - managedBy: user - harbor: - clusterTypes: - - workload - managedBy: user - prometheus: - clusterTypes: - - workload - managedBy: user -tkr-compatibility: - imagePath: tkr-compatibility -tkr-package-repo: - aws: tkr-repository-aws - azure: tkr-repository-azure - vsphere-nonparavirt: tkr-repository-vsphere-nonparavirt -tkr-package: - aws: tkr-aws - azure: tkr-azure - vsphere-nonparavirt: tkr-vsphere-nonparavirt diff --git a/cmd/cli/plugin/isolated-cluster/test/testdata/tkr-bom-v1.17.16+vmware.2-tkg.1.yaml b/cmd/cli/plugin/isolated-cluster/test/testdata/tkr-bom-v1.17.16+vmware.2-tkg.1.yaml deleted file mode 100644 index 2da8870d66..0000000000 --- a/cmd/cli/plugin/isolated-cluster/test/testdata/tkr-bom-v1.17.16+vmware.2-tkg.1.yaml +++ /dev/null @@ -1,319 +0,0 @@ -release: - version: v1.17.16+vmware.2-tkg.1 -components: - cni_plugins: - - version: v0.8.7+vmware.3 - containerd: - - version: v1.4.3+vmware.1 - coredns: - - version: v1.6.5+vmware.12 - images: - coredns: - imagePath: coredns - tag: v1.6.5_vmware.12 - cri_tools: - - version: v1.16.1+vmware.8 - etcd: - - version: v3.4.3+vmware.13 - images: - etcd: - imagePath: etcd - tag: v3.4.3_vmware.13 - kubernetes: - - version: v1.17.16+vmware.2 - images: - kubeAPIServer: - imagePath: kube-apiserver - tag: v1.17.16_vmware.2 - kubeControllerManager: - imagePath: kube-controller-manager - tag: v1.17.16_vmware.2 - kubeE2e: - imagePath: e2e-test - tag: v1.17.16_vmware.2 - kubeProxy: - imagePath: kube-proxy - tag: v1.17.16_vmware.2 - kubeScheduler: - imagePath: kube-scheduler - tag: v1.17.16_vmware.2 - pause: - imagePath: pause - tag: "3.1" - kubernetes-sigs_kind: - - version: v1.17.16+vmware.2 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.17.16_vmware.2 -kubeadmConfigSpec: - apiVersion: kubeadm.k8s.io/v1beta2 - kind: ClusterConfiguration - imageRepository: projects.registry.vmware.com/tkg - kubernetesVersion: v1.17.16+vmware.2 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: projects.registry.vmware.com/tkg - imageTag: v3.4.3_vmware.13 - dns: - type: CoreDNS - imageRepository: projects.registry.vmware.com/tkg - imageTag: v1.6.5_vmware.12 -ova: -- name: ova-photon-3 - osinfo: - name: photon - version: "3" - arch: amd64 - version: v1.17.16+vmware.2-tkg.0-2766760546902094721 -- name: ova-ubuntu-2004 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - version: v1.17.16+vmware.2-tkg.0-13075399354022698785 -ami: - ap-northeast-1: - - id: ami-032a2d2cdf21d9139 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-090c458c948de81ef - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-northeast-2: - - id: ami-07dac6b3666dc315b - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-072a4ba3721b871ab - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-south-1: - - id: ami-0843d5e12be31fb42 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-027f96a97bf988650 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-southeast-1: - - id: ami-02d10b0eeec69ea0c - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-04374dd1026007ba8 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-southeast-2: - - id: ami-0d30cc1b6153a3449 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0c21e03370e795b96 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-central-1: - - id: ami-0976bdfce6335951b - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0df032dbe4045efe3 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-1: - - id: ami-0b330d8f3f31f25ec - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-06475e20858380900 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-2: - - id: ami-0da7ddfeb8f9dc648 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0e5342de151677946 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-3: - - id: ami-0b7c24a138a28ffce - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0965c29370e65e3ac - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - sa-east-1: - - id: ami-026c868b3f4e6a515 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0671995af75903399 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-east-1: - - id: ami-0f290dd9d2f2ff64e - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0115cda1bf19d5a44 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-east-2: - - id: ami-07b560e16e1229dfe - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0402ff75999c84fe4 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-gov-east-1: - - id: ami-01716a2c45a18346f - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-02108521714e2acb6 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-gov-west-1: - - id: ami-0d614b5a4be9a2626 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-042da29c63230c8fe - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-west-2: - - id: ami-0901176432dfb9a47 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-05eb3a8ae76a55283 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 -azure: -- sku: k8s-1dot17dot16-ubuntu-1804 - publisher: vmware-inc - offer: tkg-capi - version: 2021.02.24 - thirdPartyImage: true - osinfo: - name: ubuntu - version: "18.04" - arch: amd64 -- sku: k8s-1dot17dot16-ubuntu-2004 - publisher: vmware-inc - offer: tkg-capi - version: 2021.03.05 - thirdPartyImage: true - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 -imageConfig: - imageRepository: projects.registry.vmware.com/tkg -addons: - antrea: - category: cni - clusterTypes: - - management - - worload - templatesImagePath: tanzu_core/addons/antrea-templates - templatesImageTag: v1.3.0 - calico: - category: cni - clusterTypes: - - management - - worload - templatesImagePath: tanzu_core/addons/calico-templates - templatesImageTag: v1.3.0 - kapp-controller: - category: addons-management - clusterTypes: - - management - - workload - templatesImagePath: tanzu_core/addons/kapp-controller-templates - templatesImageTag: v1.3.0 - metrics-server: - category: metrics - clusterTypes: - - management - - workload - templatesImagePath: tanzu_core/addons/metrics-server-templates - templatesImageTag: v1.3.0 - pinniped: - category: authentication - clusterTypes: - - management - - workload - templatesImagePath: tanzu_core/addons/pinniped-templates - templatesImageTag: v1.3.0 - tanzu-addons-manager: - category: addons-management - clusterTypes: - - management - - worload - templatesImagePath: tanzu_core/addons/tanzu-addons-manager-templates - templatesImageTag: v1.3.0 - vsphere-cpi: - category: cpi - clusterTypes: - - management - - workload - templatesImagePath: tanzu_core/addons/vsphere-cpi-templates - templatesImageTag: v1.3.0 - vsphere-csi: - category: csi - clusterTypes: - - management - - workload - templatesImagePath: tanzu_core/addons/vsphere-csi-templates - templatesImageTag: v1.3.0 diff --git a/cmd/cli/plugin/isolated-cluster/test/testdata/tkr-compatibility.yaml b/cmd/cli/plugin/isolated-cluster/test/testdata/tkr-compatibility.yaml deleted file mode 100644 index 83de298197..0000000000 --- a/cmd/cli/plugin/isolated-cluster/test/testdata/tkr-compatibility.yaml +++ /dev/null @@ -1,98 +0,0 @@ -version: v19 -managementClusterVersions: -- version: v1.3.0 - supportedKubernetesVersions: - - v1.20.4+vmware.1-tkg.1 - - v1.19.8+vmware.1-tkg.1 - - v1.18.16+vmware.1-tkg.1 - - v1.17.16+vmware.2-tkg.1 -- version: v1.3.1 - supportedKubernetesVersions: - - v1.19.8+vmware.3-tkg.1 - - v1.20.5+vmware.2-tkg.1 - - v1.18.17+vmware.2-tkg.1 - - v1.20.4+vmware.3-tkg.1 - - v1.19.9+vmware.2-tkg.1 - - v1.18.16+vmware.3-tkg.1 - - v1.17.16+vmware.3-tkg.1 -- version: v1.3.1-fips.1 - supportedKubernetesVersions: - - v1.20.5+vmware.2-fips.1-tkg.1 -- version: v1.3.1-patch1 - supportedKubernetesVersions: - - v1.19.8+vmware.3-tkg.1 - - v1.20.5+vmware.2-tkg.1 - - v1.18.17+vmware.2-tkg.1 - - v1.20.4+vmware.3-tkg.1 - - v1.19.9+vmware.2-tkg.1 - - v1.18.16+vmware.3-tkg.1 - - v1.17.16+vmware.3-tkg.1 -- version: v1.4.0 - supportedKubernetesVersions: - - v1.19.12+vmware.1-tkg.1 - - v1.21.2+vmware.1-tkg.1 - - v1.20.8+vmware.1-tkg.2 -- version: v1.4.0-fips.1 - supportedKubernetesVersions: - - v1.21.2+vmware.1-fips.1-tkg.1 - - v1.20.8+vmware.1-fips.1-tkg.2 -- version: v1.4.1 - supportedKubernetesVersions: - - v1.21.2+vmware.1-tkg.2 - - v1.20.8+vmware.1-tkg.3 - - v1.19.12+vmware.1-tkg.2 -- version: v1.4.2 - supportedKubernetesVersions: - - v1.21.8+vmware.1-tkg.2 - - v1.19.16+vmware.1-tkg.1 - - v1.20.14+vmware.1-tkg.2 -- version: v1.4.3 - supportedKubernetesVersions: - - v1.20.14+vmware.1-tkg.7 - - v1.19.16+vmware.1-tkg.2 - - v1.21.8+vmware.1-tkg.7 -- version: v1.5.0 - supportedKubernetesVersions: - - v1.22.5+vmware.1-tkg.1 - - v1.21.8+vmware.1-tkg.1 - - v1.20.14+vmware.1-tkg.1 -- version: v1.5.1 - supportedKubernetesVersions: - - v1.22.5+vmware.1-tkg.3 - - v1.21.8+vmware.1-tkg.4 - - v1.20.14+vmware.1-tkg.4 -- version: v1.5.2 - supportedKubernetesVersions: - - v1.22.5+vmware.1-tkg.4 - - v1.20.14+vmware.1-tkg.5 - - v1.21.8+vmware.1-tkg.5 -- version: v1.5.3 - supportedKubernetesVersions: - - v1.20.15+vmware.1-tkg.1 - - v1.22.8+vmware.1-tkg.1 - - v1.21.11+vmware.1-tkg.1 -- version: v1.5.3-fips.1 - supportedKubernetesVersions: - - v1.20.15+vmware.1-fips.1-tkg.1 - - v1.22.8+vmware.1-fips.1-tkg.1 - - v1.21.11+vmware.1-fips.1-tkg.1 -- version: v1.5.4 - supportedKubernetesVersions: - - v1.20.15+vmware.1-tkg.2 - - v1.22.9+vmware.1-tkg.1 - - v1.21.11+vmware.1-tkg.3 -- version: v1.5.4-fips.1 - supportedKubernetesVersions: - - v1.20.15+vmware.2-fips-tkg.1 - - v1.21.11+vmware.2-fips-tkg.1 - - v1.22.9+vmware.1-fips-tkg.1 -- version: v1.6.0 - supportedKubernetesVersions: - - v1.23.8+vmware.2-tkg.1 - - v1.21.14+vmware.2-tkg.1 - - v1.22.11+vmware.2-tkg.1 -- version: v1.6.0-fips.1 - supportedKubernetesVersions: - - v1.23.8+vmware.2-fips.1-tkg.1 - - v1.22.11+vmware.2-fips.1-tkg.1 - - v1.21.14+vmware.2-fips.1-tkg.1 diff --git a/cmd/cli/plugin/login/README.md b/cmd/cli/plugin/login/README.md deleted file mode 100644 index 9c664b2db7..0000000000 --- a/cmd/cli/plugin/login/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Login - -Run `tanzu login` to login to the platform. - -To login to Mission Control, enter a valid mission control endpoint and give the server a name e.g. my-mission-control. Then follow the instructions to provide an API token. - -To login to TKG Management cluster, enter server endpoint which would be pinniped endpoint, and path to the cluster-info file. Providing these details is a temporary workaround till further details of cluster discovery process are figured out. - -***Sample cluster-info file***: - -```yaml -apiVersion: v1 -clusters: -- cluster: - certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5ekNDQWJPZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01URXdOREl6TWprME9Wb1hEVE13TVRFd01qSXpNelEwT1Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS1QrCnlXTW1kOENYRldSbU54RkdlbW9ZV201MSsySTZEZWdtT1d2WVllOFJSYjRqd0k1SzJQbDR6QjNXTkJLU2J3OGwKVzRKWFpaNWFBQ255Zk1hNjhtbk9nMGZvd01nZXptS2ZGdWpMc3ZNaS9rNEZkUGlHcDVSYWxHODZWZEZPUU1jaAo2Y3k5UTZuVmlWeVAzT05Sdnp3aWMvcGVqQ0hleGd3em5lNGZGbHAzdVdXOUJMam9pWjRGZjhmVUJZQTJERDUvCjVsbDl3Tmt2Z0hQNlc4OEZwZitzNmZRRWNEUWZwWHp0UTRDdWFJeFRyKzFETzVGV3l1aHd5b3o0aDlYc1NhTmMKT1dlSG1uN1JEVHFiUzlrMnFHNmkvVnR0Qys0Rzg0TDk5MkdrSkxLc0lZRFAwVDVKdzMwQ2JoQ1hPNEtsWTBOcQpGci9FVkZ6RU5nc3NiT2hUa0hzQ0F3RUFBYU1tTUNRd0RnWURWUjBQQVFIL0JBUURBZ0trTUJJR0ExVWRFd0VCCi93UUlNQVlCQWY4Q0FRQXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBR21ITzIxRVo1akJxQ3hvbDZlanNTTlYKeHFZMEdZc2Voc3ZtZWwwU2RoVEU4SGNMMk5nSWlzcnlmem91Q1QxT1c3ZzlpQ1dFQktvTzBmT2FMcU1tRHovOQpyTkZEWmk5Uk9CMVYvZmhaL05nUm1VV2tlakp2WEltREdqM1pHbDNOY3ZpQzBHV1U3aFc3NkoyU0s1OUYvZytPCmxTRDdZRExJSUJQWGNQeHgvUlp0MWwwMVV2Z1Uwb1dwYzFCNlNuSndCcXowMUViZFA3MEEvL3V2VGR4dWRhdUYKT0tVYkIxK0xTSGpVQTdtbWprTklKQ3VhZHVEZXpocjE4YjB2R3Nla0Y5dFo5OWtiM0QwUmM1SzQ1akh5QkgvOQpqTENJYldpRVg4SXV1U2o3NlA5OFBmcklEVDBMVkJOanAwY000eUFvMVpQYjR4Q3BsN2dsSzVTQUhzamRESm89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K - server: https://tkg-test-mc-apiserver-1734810883.us-west-2.elb.amazonaws.com:6443 - name: tkg-test-mc -``` diff --git a/cmd/cli/plugin/login/doc.go b/cmd/cli/plugin/login/doc.go deleted file mode 100644 index c92630231b..0000000000 --- a/cmd/cli/plugin/login/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -Login to the platform. - -To login to Mission Control, enter a valid mission control endpoint and give the server a name e.g. my-mission-control. Then follow the instructions to provide an API token. - -To login to TKG Management cluster, enter server endpoint which would be pinniped endpoint, and path to the cluster-info file. Providing these details is a temporary workaround till further details of cluster discovery process are figured out. - -Sample cluster-info file: - - apiVersion: v1 - clusters: - - cluster: - certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5ekNDQWJPZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01URXdOREl6TWprME9Wb1hEVE13TVRFd01qSXpNelEwT1Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS1QrCnlXTW1kOENYRldSbU54RkdlbW9ZV201MSsySTZEZWdtT1d2WVllOFJSYjRqd0k1SzJQbDR6QjNXTkJLU2J3OGwKVzRKWFpaNWFBQ255Zk1hNjhtbk9nMGZvd01nZXptS2ZGdWpMc3ZNaS9rNEZkUGlHcDVSYWxHODZWZEZPUU1jaAo2Y3k5UTZuVmlWeVAzT05Sdnp3aWMvcGVqQ0hleGd3em5lNGZGbHAzdVdXOUJMam9pWjRGZjhmVUJZQTJERDUvCjVsbDl3Tmt2Z0hQNlc4OEZwZitzNmZRRWNEUWZwWHp0UTRDdWFJeFRyKzFETzVGV3l1aHd5b3o0aDlYc1NhTmMKT1dlSG1uN1JEVHFiUzlrMnFHNmkvVnR0Qys0Rzg0TDk5MkdrSkxLc0lZRFAwVDVKdzMwQ2JoQ1hPNEtsWTBOcQpGci9FVkZ6RU5nc3NiT2hUa0hzQ0F3RUFBYU1tTUNRd0RnWURWUjBQQVFIL0JBUURBZ0trTUJJR0ExVWRFd0VCCi93UUlNQVlCQWY4Q0FRQXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBR21ITzIxRVo1akJxQ3hvbDZlanNTTlYKeHFZMEdZc2Voc3ZtZWwwU2RoVEU4SGNMMk5nSWlzcnlmem91Q1QxT1c3ZzlpQ1dFQktvTzBmT2FMcU1tRHovOQpyTkZEWmk5Uk9CMVYvZmhaL05nUm1VV2tlakp2WEltREdqM1pHbDNOY3ZpQzBHV1U3aFc3NkoyU0s1OUYvZytPCmxTRDdZRExJSUJQWGNQeHgvUlp0MWwwMVV2Z1Uwb1dwYzFCNlNuSndCcXowMUViZFA3MEEvL3V2VGR4dWRhdUYKT0tVYkIxK0xTSGpVQTdtbWprTklKQ3VhZHVEZXpocjE4YjB2R3Nla0Y5dFo5OWtiM0QwUmM1SzQ1akh5QkgvOQpqTENJYldpRVg4SXV1U2o3NlA5OFBmcklEVDBMVkJOanAwY000eUFvMVpQYjR4Q3BsN2dsSzVTQUhzamRESm89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K - server: https://tkg-test-mc-apiserver-1734810883.us-west-2.elb.amazonaws.com:6443 - name: tkg-test-mc -*/ -package main diff --git a/cmd/cli/plugin/login/go.mod b/cmd/cli/plugin/login/go.mod deleted file mode 100644 index 78183ffe95..0000000000 --- a/cmd/cli/plugin/login/go.mod +++ /dev/null @@ -1,148 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/plugin/login - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/run => ../../../../apis/run - github.com/vmware-tanzu/tanzu-framework/capabilities/client => ../../../../capabilities/client - github.com/vmware-tanzu/tanzu-framework/cli/core => ../../../../cli/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../../../cli/runtime - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common => ../../../../pinniped-components/common -) - -require ( - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/spf13/cobra v1.5.0 - github.com/vmware-tanzu/tanzu-framework/cli/core v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - golang.org/x/oauth2 v0.3.0 - k8s.io/apimachinery v0.24.2 - k8s.io/client-go v0.24.2 -) - -require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.6.0 // indirect - cloud.google.com/go/storage v1.27.0 // indirect - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/BurntSushi/toml v1.1.0 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/adrg/xdg v0.4.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.10.0 // indirect - github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e // indirect - github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect - github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v20.10.11+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.16+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/swag v0.21.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/go-containerregistry v0.7.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/hashicorp/go-version v1.4.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect - github.com/k14s/imgpkg v0.17.0 // indirect - github.com/k14s/kbld v0.32.0 // indirect - github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 // indirect - github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // 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/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/gomega v1.19.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec // indirect - github.com/vmware-tanzu/carvel-imgpkg v0.23.1 // indirect - github.com/vmware-tanzu/carvel-vendir v0.26.0 // indirect - github.com/vmware-tanzu/carvel-ytt v0.40.0 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common v0.0.0-00010101000000-000000000000 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.102.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect - google.golang.org/grpc v1.50.1 // indirect - google.golang.org/protobuf v1.28.1 // 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.24.2 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/cluster-api v1.2.8 // indirect - sigs.k8s.io/controller-runtime v0.12.3 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/cmd/cli/plugin/login/go.sum b/cmd/cli/plugin/login/go.sum deleted file mode 100644 index 14a26f6a58..0000000000 --- a/cmd/cli/plugin/login/go.sum +++ /dev/null @@ -1,1700 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/iam v0.6.0 h1:nsqQC88kT5Iwlm4MeNGTpfMWddp6NB/UOLFTH6m1QfQ= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/longrunning v0.1.1 h1:y50CXG4j0+qvEukslYFBCrzaXX0qpFbBzc3PchSu/LE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.10.0 h1:glqzafvxBBAMo+x2w2sdDjUDZeTqqLJmqZPY05qehCU= -github.com/containerd/stargz-snapshotter/estargz v0.10.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e h1:4AxO89dwbgA957M8DX5AV/KsOmxDyAB1BES0INY+A/0= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= -github.com/cppforlife/go-cli-ui v0.0.0-20200506005011-4268990983cc/go.mod h1:I0qrzCmuPWYI6kAOvkllYjaW2aovclWbJ96+v+YyHb0= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f h1:yVW0v4zDXzJo1i8G9G3vtvNpyzhvtLalO34BsN/K88E= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f/go.mod h1:L18TqO77ci8i+hFtlMC4zSFz/D3O8lf84TyVU+zFF8E= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc= -github.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.16+incompatible h1:2Db6ZR/+FUR3hqPMwnogOPHFn405crbpxvWzKovETOQ= -github.com/docker/docker v20.10.16+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -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/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.7.0 h1:u0onUUOcyoCDHEiJoyR1R1gx5er1+r06V5DBhUU5ndk= -github.com/google/go-containerregistry v0.7.0/go.mod h1:2zaoelrL0d08gGbpdP3LqyUuBmhWbpD6IOe2s9nLS2k= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= -github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hpcloud/tail v1.0.1-0.20180514194441-a1dbeea552b7/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57 h1:CwBRArr+BWBopnUJhDjJw86rPL/jGbEjfHWKzTasSqE= -github.com/k14s/imgpkg v0.17.0 h1:l1HqYtjecqx7iYecJUvxQQYdo3WubCahHQ30lh0p9sU= -github.com/k14s/imgpkg v0.17.0/go.mod h1:xYZ7gQxYP3O35vGIXcYchDEHq0xA81FOheCp8Vlq5ko= -github.com/k14s/kbld v0.32.0 h1:zf3qCir0usz7rX6JRF97QxaZ25+13EniE7z+ll0xaZ8= -github.com/k14s/kbld v0.32.0/go.mod h1:N7Ij72ZhJ2B7kTUxavGTBT1YymIfmAeO6JKyNbtja1g= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 h1:wKSifC/VbCaQMqXYn6/gSFqle82OX4bE3KYALDU9FlU= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115/go.mod h1:mGrnmO5qnhJIaSiwMo05cvRL6Ww9ccYbTgNFcm6RHZQ= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 h1:4bcRTTSx+LKSxMWibIwzHnDNmaN1x52oEpvnjCy+8vk= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368/go.mod h1:lKGj1op99m4GtQISxoD2t+K+WO/q2NzEPKvfXFQfbCA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -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 v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/otiai10/copy v1.4.2 h1:RTiz2sol3eoXPLF4o+YWqEybwfUa/Q2Nkc4ZIUs3fwI= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -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 v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1 h1:sUHDtnvcIMMcY/Pudym6DJ0kv7+uyMCAqQby0SLnQVs= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1/go.mod h1:2XNe+P0MDgya0FPEMOVZLAXku05VZhccVdDcXChhvy8= -github.com/vmware-tanzu/carvel-vendir v0.26.0 h1:Q98tPnH9WUAWE2vJSAP0lsHGsfwGjfW2y+JUOEiJ/Yk= -github.com/vmware-tanzu/carvel-vendir v0.26.0/go.mod h1:JcuNNVONFbZTbm/GjtGiWUfFrt17YBQzeGT9+gY1+yY= -github.com/vmware-tanzu/carvel-ytt v0.40.0 h1:WUWTtwvfqV9CN9v207oDt2xfhmuWHGwc4MMaXJAqIEE= -github.com/vmware-tanzu/carvel-ytt v0.40.0/go.mod h1:crDcKbS1GM4Q34puoVxdrajWOXrxjOxvUCwtsNV5Etc= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.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-20180730214132-a0f8a16cb08c/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211111162719-482062a4217b/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cmd/cli/plugin/login/main.go b/cmd/cli/plugin/login/main.go deleted file mode 100644 index d0ae3891d2..0000000000 --- a/cmd/cli/plugin/login/main.go +++ /dev/null @@ -1,537 +0,0 @@ -// Copyright 2021-2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "crypto/tls" - "fmt" - "net/http" - "net/url" - "os" - "sort" - "strings" - "time" - - "github.com/aunum/log" - "github.com/spf13/cobra" - "golang.org/x/oauth2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/tools/clientcmd" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/auth/csp" - tkgauth "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/auth/tkg" - wcpauth "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/auth/wcp" - cliconfig "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -// nolint: gocritic -// Note: Shall be deprecated in a future version. Superseded by 'tanzu context' command. -var descriptor = cliapi.PluginDescriptor{ - Name: "login", - Description: "Login to the platform", - Group: cliapi.SystemCmdGroup, - Aliases: []string{"lo", "logins"}, - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, -} - -var ( - stderrOnly, forceCSP, staging bool - endpoint, name, apiToken, server, kubeConfig, kubecontext string -) - -const ( - knownGlobalHost = "cloud.vmware.com" -) - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.Flags().StringVar(&endpoint, "endpoint", "", "endpoint to login to") - p.Cmd.Flags().StringVar(&name, "name", "", "name of the server") - p.Cmd.Flags().StringVar(&apiToken, "apiToken", "", "API token for global login") - p.Cmd.Flags().StringVar(&server, "server", "", "login to the given server") - p.Cmd.Flags().StringVar(&kubeConfig, "kubeconfig", "", "path to kubeconfig management cluster. Valid only if user doesn't choose 'endpoint' option.(See [*])") - p.Cmd.Flags().StringVar(&kubecontext, "context", "", "the context in the kubeconfig to use for management cluster. Valid only if user doesn't choose 'endpoint' option.(See [*]) ") - p.Cmd.Flags().BoolVar(&stderrOnly, "stderr-only", false, "send all output to stderr rather than stdout") - p.Cmd.Flags().BoolVar(&forceCSP, "force-csp", false, "force the endpoint to be logged in as a csp server") - p.Cmd.Flags().BoolVar(&staging, "staging", false, "use CSP staging issuer") - p.Cmd.Flags().MarkHidden("stderr-only") // nolint - p.Cmd.Flags().MarkHidden("force-csp") // nolint - p.Cmd.Flags().MarkHidden("staging") // nolint - p.Cmd.RunE = login - p.Cmd.Example = ` - # Login to TKG management cluster using endpoint - tanzu login --endpoint "https://login.example.com" --name mgmt-cluster - - # Login to TKG management cluster by using kubeconfig path and context for the management cluster - tanzu login --kubeconfig path/to/kubeconfig --context path/to/context --name mgmt-cluster - - # Login to TKG management cluster by using default kubeconfig path and context for the management cluster - tanzu login --context path/to/context --name mgmt-cluster - - # Login to an existing server - tanzu login --server mgmt-cluster - - [*] : User has two options to login to TKG. User can choose the login endpoint option - by providing 'endpoint', or user can choose to use the kubeconfig for the management cluster by - providing 'kubeconfig' and 'context'. If only '--context' is set and '--kubeconfig' is unset - $KUBECONFIG env variable would be used and, if $KUBECONFIG env is also unset default - kubeconfig($HOME/.kube/config) would be used - ` - - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func login(cmd *cobra.Command, args []string) (err error) { - cfg, err := config.GetClientConfig() - if err != nil { - return err - } - - newServerSelector := "+ new server" - var serverTarget *configapi.Server - if name != "" { - serverTarget, err = createNewServer() - if err != nil { - return err - } - } else if server == "" { - serverTarget, err = getServerTarget(cfg, newServerSelector) - if err != nil { - return err - } - } else { - serverTarget, err = config.GetServer(server) - if err != nil { - return err - } - } - - if server == newServerSelector { - serverTarget, err = createNewServer() - if err != nil { - return err - } - } - - if serverTarget.Type == configapi.GlobalServerType { - err = globalLogin(serverTarget) - } else { - err = managementClusterLogin(serverTarget) - } - - if err != nil { - return err - } - - // Sync all required plugins if the "features.global.context-aware-cli-for-plugins" feature is enabled - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - if err = pluginmanager.SyncPlugins(); err != nil { - log.Warning("unable to automatically sync the plugins from target server. Please run 'tanzu plugin sync' command to sync plugins manually") - } - } - - return nil -} - -func getServerTarget(cfg *configapi.ClientConfig, newServerSelector string) (*configapi.Server, error) { - promptOpts := getPromptOpts() - servers := map[string]*configapi.Server{} - for _, server := range cfg.KnownServers { - ep, err := config.EndpointFromServer(server) - if err != nil { - return nil, err - } - - s := rpad(server.Name, 20) - s = fmt.Sprintf("%s(%s)", s, ep) - servers[s] = server - } - if endpoint == "" { - endpoint, _ = os.LookupEnv(config.EnvEndpointKey) - } - // If there are no existing servers - if len(servers) == 0 { - return createNewServer() - } - serverKeys := getKeys(servers) - serverKeys = append(serverKeys, newServerSelector) - servers[newServerSelector] = &configapi.Server{} - err := component.Prompt( - &component.PromptConfig{ - Message: "Select a server", - Options: serverKeys, - Default: serverKeys[0], - }, - &server, - promptOpts..., - ) - if err != nil { - return nil, err - } - return servers[server], nil -} - -func getKeys(m map[string]*configapi.Server) []string { - keys := make([]string, 0, len(m)) - for key := range m { - keys = append(keys, key) - } - sort.Strings(keys) - return keys -} - -func isGlobalServer(endpoint string) bool { - if strings.Contains(endpoint, knownGlobalHost) { - return true - } - if forceCSP { - return true - } - return false -} - -func rpad(s string, padding int) string { - template := fmt.Sprintf("%%-%ds", padding) - return fmt.Sprintf(template, s) -} - -func getPromptOpts() []component.PromptOpt { - var promptOpts []component.PromptOpt - if stderrOnly { - // This uses stderr because it needs to work inside the kubectl exec plugin flow where stdout is reserved. - promptOpts = append(promptOpts, component.WithStdio(os.Stdin, os.Stderr, os.Stderr)) - } - return promptOpts -} - -func createNewServer() (server *configapi.Server, err error) { - // user provided command line options to create a server using kubeconfig[optional] and context - if kubecontext != "" { - return createServerWithKubeconfig() - } - // user provided command line options to create a server using endpoint - if endpoint != "" { - return createServerWithEndpoint() - } - promptOpts := getPromptOpts() - - var loginType string - - err = component.Prompt( - &component.PromptConfig{ - Message: "Select login type", - Options: []string{"Server endpoint", "Local kubeconfig"}, - Default: "Server endpoint", - }, - &loginType, - promptOpts..., - ) - if err != nil { - return server, err - } - - if loginType == "Server endpoint" { - return createServerWithEndpoint() - } - - return createServerWithKubeconfig() -} - -func createServerWithKubeconfig() (server *configapi.Server, err error) { - promptOpts := getPromptOpts() - if kubeConfig == "" && kubecontext == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: "Enter path to kubeconfig (if any)", - }, - &kubeConfig, - promptOpts..., - ) - if err != nil { - return - } - } - kubeConfig = strings.TrimSpace(kubeConfig) - if kubeConfig == "" { - kubeConfig = getDefaultKubeconfigPath() - } - - if kubeConfig != "" && kubecontext == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: "Enter kube context to use", - }, - &kubecontext, - promptOpts..., - ) - if err != nil { - return - } - } - kubecontext = strings.TrimSpace(kubecontext) - if name == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: "Give the server a name", - }, - &name, - promptOpts..., - ) - if err != nil { - return - } - } - name = strings.TrimSpace(name) - nameExists, err := config.ServerExists(name) - if err != nil { - return server, err - } - if nameExists { - err = fmt.Errorf("server %q already exists", name) - return - } - - endpointType := configapi.ManagementClusterServerType - - server = &configapi.Server{ - Name: name, - Type: endpointType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Path: kubeConfig, - Context: kubecontext, - Endpoint: endpoint}, - } - return server, err -} - -func createServerWithEndpoint() (server *configapi.Server, err error) { - promptOpts := getPromptOpts() - if endpoint == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: "Enter server endpoint", - }, - &endpoint, - promptOpts..., - ) - if err != nil { - return - } - } - endpoint = strings.TrimSpace(endpoint) - if name == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: "Give the server a name", - }, - &name, - promptOpts..., - ) - if err != nil { - return - } - } - name = strings.TrimSpace(name) - nameExists, err := config.ServerExists(name) - if err != nil { - return server, err - } - if nameExists { - err = fmt.Errorf("server %q already exists", name) - return - } - if isGlobalServer(endpoint) { - server = &configapi.Server{ - Name: name, - Type: configapi.GlobalServerType, - GlobalOpts: &configapi.GlobalServer{Endpoint: sanitizeEndpoint(endpoint)}, - } - } else { - // While this would add an extra HTTP round trip, it avoids the need to - // add extra provider specific login flags. - isVSphereSupervisor, err := wcpauth.IsVSphereSupervisor(endpoint, getDiscoveryHTTPClient()) - // Fall back to assuming non vSphere supervisor. - if err != nil { - log.Fatalf("Error creating kubeconfig with tanzu pinniped-auth login plugin: %v", err) - return nil, err - } - if isVSphereSupervisor { - log.Info("Detected a vSphere Supervisor being used") - kubeConfig, kubecontext, err = vSphereSupervisorLogin(endpoint) - if err != nil { - log.Fatalf("Error logging in to vSphere Supervisor: %v", err) - return nil, err - } - } else { - kubeConfig, kubecontext, err = tkgauth.KubeconfigWithPinnipedAuthLoginPlugin(endpoint, nil, tkgauth.DiscoveryStrategy{ClusterInfoConfigMap: tkgauth.DefaultClusterInfoConfigMap}) - if err != nil { - log.Fatalf("Error creating kubeconfig with tanzu pinniped-auth login plugin: %v", err) - return nil, err - } - } - - server = &configapi.Server{ - Name: name, - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Path: kubeConfig, - Context: kubecontext, - Endpoint: endpoint}, - } - } - return server, err -} - -func globalLogin(s *configapi.Server) (err error) { - a := configapi.GlobalServerAuth{} - apiToken, apiTokenExists := os.LookupEnv(config.EnvAPITokenKey) - - issuer := csp.ProdIssuer - if staging { - issuer = csp.StgIssuer - } - if apiTokenExists { - log.Debug("API token env var is set") - } else { - apiToken, err = promptAPIToken() - if err != nil { - return err - } - } - token, err := csp.GetAccessTokenFromAPIToken(apiToken, issuer) - if err != nil { - return err - } - claims, err := csp.ParseToken(&oauth2.Token{AccessToken: token.AccessToken}) - if err != nil { - return err - } - - a.Issuer = issuer - - a.UserName = claims.Username - a.Permissions = claims.Permissions - a.AccessToken = token.AccessToken - a.IDToken = token.IDToken - a.RefreshToken = apiToken - a.Type = "api-token" - - expiresAt := time.Now().Local().Add(time.Second * time.Duration(token.ExpiresIn)) - a.Expiration = metav1.NewTime(expiresAt) - - s.GlobalOpts.Auth = a - - err = config.PutServer(s, true) - if err != nil { - return err - } - - // format - fmt.Println() - log.Success("successfully logged into global control plane") - return nil -} - -// Interactive way to login to TMC. User will be prompted for token and context name. -func promptAPIToken() (apiToken string, err error) { - consoleURL := url.URL{ - Scheme: "https", - Host: "console.cloud.vmware.com", - Path: "/csp/gateway/portal/", - Fragment: "/user/tokens", - } - - // format - fmt.Println() - log.Infof( - "If you don't have an API token, visit the VMware Cloud Services console, select your organization, and create an API token with the TMC service roles:\n %s\n", - consoleURL.String(), - ) - - promptOpts := getPromptOpts() - - // format - fmt.Println() - err = component.Prompt( - &component.PromptConfig{ - Message: "API Token", - Sensitive: true, - }, - &apiToken, - promptOpts..., - ) - apiToken = strings.TrimSpace(apiToken) - return -} - -func managementClusterLogin(s *configapi.Server) error { - if s.ManagementClusterOpts.Path != "" && s.ManagementClusterOpts.Context != "" { - _, err := tkgauth.GetServerKubernetesVersion(s.ManagementClusterOpts.Path, s.ManagementClusterOpts.Context) - if err != nil { - log.Fatalf("failed to login to the management cluster %s, %v", s.Name, err) - return err - } - err = config.PutServer(s, true) - if err != nil { - return err - } - // XXX s.Name isn't necessarily a kubeconfig? - log.Successf("successfully logged in to management cluster using the kubeconfig %s", s.Name) - return nil - } - - return fmt.Errorf("not yet implemented") -} - -func sanitizeEndpoint(endpoint string) string { - if len(strings.Split(endpoint, ":")) == 1 { - return fmt.Sprintf("%s:443", endpoint) - } - return endpoint -} - -func getDefaultKubeconfigPath() string { - kubeConfigFilename := os.Getenv(clientcmd.RecommendedConfigPathEnvVar) - // fallback to default kubeconfig file location if no env variable set - if kubeConfigFilename == "" { - kubeConfigFilename = clientcmd.RecommendedHomeFile - } - return kubeConfigFilename -} - -func getDiscoveryHTTPClient() *http.Client { - // XXX: Insecure, but follows the existing tanzu login discovery patterns. If - // there's something tracking not TOFUing, it might be good to follow that - // eventually. - tr := &http.Transport{ - // #nosec - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - Proxy: http.ProxyFromEnvironment, - TLSHandshakeTimeout: 5 * time.Second, - } - return &http.Client{Transport: tr} -} - -func vSphereSupervisorLogin(endpoint string) (mergeFilePath, currentContext string, err error) { - port := 443 - kubeConfig, kubecontext, err := tkgauth.KubeconfigWithPinnipedAuthLoginPlugin(endpoint, nil, tkgauth.DiscoveryStrategy{DiscoveryPort: &port, ClusterInfoConfigMap: wcpauth.SupervisorVIPConfigMapName}) - if err != nil { - log.Fatalf("Error creating kubeconfig with tanzu pinniped-auth login plugin: %v", err) - return "", "", err - } - return kubeConfig, kubecontext, err -} diff --git a/cmd/cli/plugin/login/test/main.go b/cmd/cli/plugin/login/test/main.go deleted file mode 100644 index 3d6cc311cc..0000000000 --- a/cmd/cli/plugin/login/test/main.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("login") - -func main() { - retcode := 0 - - defer func() { os.Exit(retcode) }() - defer Cleanup() - - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Println(err) - retcode = 1 - return - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - retcode = 1 - return - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} - -// Cleanup the test. -func Cleanup() {} diff --git a/cmd/cli/plugin/managementcluster/Makefile b/cmd/cli/plugin/managementcluster/Makefile deleted file mode 100644 index 2efbf3e3c6..0000000000 --- a/cmd/cli/plugin/managementcluster/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -ROOT_DIR := $(shell git rev-parse --show-toplevel) -MODULE_ROOT_DIR := $(ROOT_DIR)/tkg - -# Golang specific variables -GOOS ?= $(shell go env GOOS) -GOARCH ?= $(shell go env GOARCH) -GOHOSTOS ?= $(shell go env GOHOSTOS) -GOHOSTARCH ?= $(shell go env GOHOSTARCH) -# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) -ifeq (,$(shell go env GOBIN)) -GOBIN=$(shell go env GOPATH)/bin -else -GOBIN=$(shell go env GOBIN) -endif -GO := go - -# Directories -TOOLS_DIR := $(abspath $(MODULE_ROOT_DIR)/hack/tools) -TOOLS_BIN_DIR := $(TOOLS_DIR)/bin - -# Add tooling binaries here and in hack/tools/Makefile -GOIMPORTS := $(TOOLS_BIN_DIR)/goimports -TOOLING_BINARIES := $(GOIMPORTS) - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help (default) - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-28s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m\033[32m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -## -------------------------------------- -## All -## -------------------------------------- - -.PHONY: all -all: test ## Tests the library - -## -------------------------------------- -## Testing -## -------------------------------------- - -.PHONY: test -test: fmt vet ## Run Tests - ${GO} test -timeout 60m -coverprofile coverage.txt -v `go list ./...` - -.PHONY: vet -vet: ## Vet codebase - ${GO} vet ./... - -fmt: $(GOIMPORTS) ## Run goimports - $(GOIMPORTS) -w -local github.com/vmware-tanzu ./ - -## -------------------------------------- -## Tooling Binaries -## -------------------------------------- - -tools: $(TOOLING_BINARIES) ## Build tooling binaries -.PHONY: $(TOOLING_BINARIES) -$(TOOLING_BINARIES): - make -C $(TOOLS_DIR) $(@F) - diff --git a/cmd/cli/plugin/managementcluster/README.md b/cmd/cli/plugin/managementcluster/README.md deleted file mode 100644 index 6d698f5ea7..0000000000 --- a/cmd/cli/plugin/managementcluster/README.md +++ /dev/null @@ -1,230 +0,0 @@ -# Management Cluster - -Kubernetes management cluster operations. - -## Usage - -```shell ->>> tanzu management-cluster ceip-participation --help - -Get or set ceip participation - -Usage: - tanzu management-cluster ceip-participation [command] - -Available Commands: - get Get the current CEIP opt-in status of the current management cluster - set Set the opt-in preference for CEIP of the current management cluster - -Flags: - -h, --help help for ceip-participation - -Global Flags: - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -Use "management-cluster ceip-participation [command] --help" for more information about a command. -``` - -```shell ->>> tanzu management-cluster create --help - -Create a Tanzu Kubernetes Grid management cluster including initializing it with Cluster API components appropriate for the target infrastructure. - -Usage: - tanzu management-cluster create [flags] - -Examples: - - # Create a management cluster on AWS infrastructure, initializing it with - # components required to create workload clusters through it on the same infrastructure - # by bootstrapping through a self-provisioned bootstrap cluster. - tanzu management-cluster create --file ~/clusterconfigs/aws-mc-1.yaml - # Launch an interactive UI to configure the settings necessary to create a - # management cluster - tanzu management-cluster create --ui - # Create a management cluster on vSphere infrastructure by using an existing - # bootstrapper cluster. The current kube context should point to that - # of the existing bootstrap cluster. - tanzu management-cluster create --use-existing-bootstrap-cluster --file vsphere-mc-1.yaml - -Flags: - -b, --bind string Specify the IP and port to bind the Kickstart UI against (e.g. 127.0.0.1:8080). (default "127.0.0.1:8080") - --browser string Specify the browser to open the Kickstart UI on. Use 'none' for no browser. Defaults to OS default browser. Supported: ['chrome', 'firefox', 'safari', 'ie', 'edge', 'none'] - -f, --file string Configuration file from which to create a management cluster - -h, --help help for create - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - -u, --ui Launch interactive management cluster provisioning UI - -e, --use-existing-bootstrap-cluster Use an existing bootstrap cluster to deploy the management cluster - -y, --yes Create management cluster without asking for confirmation - -Global Flags: - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -```shell ->>> tanzu management-cluster credentials --help - -Update Credentials for Management Cluster - -Usage: - tanzu management-cluster credentials [command] - -Available Commands: - update Update credentials for management cluster - -Flags: - -h, --help help for credentials - -Global Flags: - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -Use "management-cluster credentials [command] --help" for more information about a command. -``` - -```shell ->>> tanzu management-cluster delete --help - -Delete a management cluster and tears down the underlying infrastructure - -Usage: - tanzu management-cluster delete [flags] - -Examples: - - # Deletes the management cluster of the current server - tanzu management-cluster delete - -Flags: - --force Force deletion of the management cluster even if it is managing active Tanzu Kubernetes clusters - -h, --help help for delete - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - -e, --use-existing-cleanup-cluster Use an existing cleanup cluster to delete the management cluster - -y, --yes Delete management cluster without asking for confirmation - -Global Flags: - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -```shell ->>> tanzu management-cluster get --help - -Retrieves details about the current management cluster. Requires the current server to be a management cluster - -Usage: - tanzu management-cluster get [flags] - -Flags: - -h, --help help for get - --show-all-conditions string List of comma separated kind or kind/name for which we should show all the object's conditions (all to show conditions for all the objects) - --show-details Show details of MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object - --show-group-members Expand machine groups whose ready condition has the same Status, Severity and Reason - -Global Flags: - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -```shell ->>> tanzu management-cluster import --help - -Import Tanzu Kubernetes Grid management cluster from TKG settings file - -Usage: - tanzu management-cluster import [flags] - -Examples: - - # Import management cluster config from default config file - tanzu management-cluster import - - # Import management cluster config from custom config file - tanzu management-cluster import -f path/to/configfile.yaml - -Flags: - -f, --file string TKG settings file (default '$HOME/.tkg/config.yaml') - -h, --help help for import - -Global Flags: - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -```shell ->>> tanzu management-cluster kubeconfig --help - -Kubeconfig of management cluster - -Usage: - tanzu management-cluster kubeconfig [command] - -Available Commands: - get Get Kubeconfig of a management cluster - -Flags: - -h, --help help for kubeconfig - -Global Flags: - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -Use "management-cluster kubeconfig [command] --help" for more information about a command. -``` - -```shell ->>> tanzu management-cluster permissions --help - -Configure permissions on cloud providers - -Usage: - tanzu management-cluster permissions [command] - -Available Commands: - aws Configure permissions on AWS - -Flags: - -h, --help help for permissions - -Global Flags: - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -Use "management-cluster permissions [command] --help" for more information about a command. -``` - -```shell ->>> tanzu management-cluster upgrade --help - -Upgrades the management cluster - -Usage: - tanzu management-cluster upgrade [flags] - -Flags: - -h, --help help for upgrade - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - --vsphere-vm-template-name string The vSphere VM template to be used with upgraded kubernetes version. Discovered automatically if not provided - -y, --yes Upgrade management cluster without asking for confirmation - -Global Flags: - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -```shell ->>> tanzu management-cluster osimage oracle populate --help - -Usage: -import your own Kubernetes node image to specific cloud infrastructure, and patched TKR -to consume the imported image. For example: - - -tanzu management-cluster osimage oracle populate \ - --tkr-path gcr.io/my-project-1527816345739/tkg/tkr/tkr-oci:latest \ - --compartment ocid1.compartment.oc1..aaaaaaaawgxbth6afwfzkxxxxxxxxxxxxxxmrf2ouxqa6ifrfa - --output-directory {additional manifest directory} - -``` diff --git a/cmd/cli/plugin/managementcluster/ceip.go b/cmd/cli/plugin/managementcluster/ceip.go deleted file mode 100644 index 1e76c7b5c1..0000000000 --- a/cmd/cli/plugin/managementcluster/ceip.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import "github.com/spf13/cobra" - -var ceipCmd = &cobra.Command{ - Use: "ceip-participation", - Short: "Get or set ceip participation", - Long: `Get or set ceip participation`, - SilenceUsage: true, -} diff --git a/cmd/cli/plugin/managementcluster/common.go b/cmd/cli/plugin/managementcluster/common.go deleted file mode 100644 index ad2bbf185c..0000000000 --- a/cmd/cli/plugin/managementcluster/common.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "path/filepath" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -func newTKGCtlClient(forceUpdateTKGCompatibilityImage bool) (tkgctl.TKGClient, error) { - tkgConfigDir, err := getTKGConfigDir() - if err != nil { - return nil, errors.Wrap(err, "unable to get default TKG config directory") - } - - return tkgctl.New(tkgctl.Options{ - ConfigDir: tkgConfigDir, - CustomizerOptions: types.CustomizerOptions{ - RegionManagerFactory: NewFactory(), - }, - - LogOptions: tkgctl.LoggingOptions{Verbosity: logLevel, File: logFile}, - ForceUpdateTKGCompatibilityImage: forceUpdateTKGCompatibilityImage, - }) -} - -func getTKGConfigDir() (string, error) { - tanzuConfigDir, err := config.LocalDir() - if err != nil { - return "", errors.Wrap(err, "unable to get home directory") - } - return filepath.Join(tanzuConfigDir, "tkg"), nil -} - -func runForCurrentMC(fn func(currServ *configapi.Server) error) error { - currServ, err := config.GetCurrentServer() - if err != nil { - return err - } - - if !currServ.IsManagementCluster() { - return errors.Errorf("Current server [%s] is not a management cluster", currServ.Name) - } - - return fn(currServ) -} diff --git a/cmd/cli/plugin/managementcluster/create.go b/cmd/cli/plugin/managementcluster/create.go deleted file mode 100644 index f63f295d34..0000000000 --- a/cmd/cli/plugin/managementcluster/create.go +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "time" - - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "sigs.k8s.io/cluster-api/cmd/clusterctl/cmd" - - cliconfig "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type initRegionOptions struct { - ui bool - useExistingCluster bool - enableTKGSOnVsphere7 bool - deployTKGonVsphere7 bool - unattended bool - dryRun bool - forceConfigUpdate bool - clusterConfigFile string - additionalTKGManifests string - plan string - clusterName string - coreProvider string - bootstrapProvider string - infrastructureProvider string - controlPlaneProvider string - targetNamespace string - watchingNamespace string - timeout time.Duration - size string - controlPlaneSize string - workerSize string - ceipOptIn string - cniType string - featureFlags map[string]string - bind string - browser string - vsphereControlPlaneEndpoint string -} - -var iro = &initRegionOptions{} - -var createCmd = &cobra.Command{ - Use: "create", - Short: "Create a Tanzu Kubernetes Grid management cluster", - Long: cmd.LongDesc(` - Create a Tanzu Kubernetes Grid management cluster including initializing it with Cluster API components appropriate for the target infrastructure. - `), - - Example: ` - # Create a management cluster on AWS infrastructure, initializing it with - # components required to create workload clusters through it on the same infrastructure - # by bootstrapping through a self-provisioned bootstrap cluster. - tanzu management-cluster create --file ~/clusterconfigs/aws-mc-1.yaml - # Launch an interactive UI to configure the settings necessary to create a - # management cluster - tanzu management-cluster create --ui - # Create a management cluster on vSphere infrastructure by using an existing - # bootstrapper cluster. The current kube context should point to that - # of the existing bootstrap cluster. - tanzu management-cluster create --use-existing-bootstrap-cluster --file vsphere-mc-1.yaml`, - - RunE: func(cmd *cobra.Command, args []string) error { - return runInit() - }, - SilenceUsage: true, -} - -func init() { - createCmd.Flags().StringVarP(&iro.clusterConfigFile, "file", "f", "", "Configuration file from which to create a management cluster") - - createCmd.Flags().BoolVarP(&iro.ui, "ui", "u", false, "Launch interactive management cluster provisioning UI") - createCmd.Flags().StringVarP(&iro.bind, "bind", "b", "127.0.0.1:8080", "Specify the IP and port to bind the Kickstart UI against (e.g. 127.0.0.1:8080).") - createCmd.Flags().StringVarP(&iro.browser, "browser", "", "", "Specify the browser to open the Kickstart UI on. Use 'none' for no browser. Defaults to OS default browser. Supported: ['chrome', 'firefox', 'safari', 'ie', 'edge', 'none']") - - createCmd.Flags().BoolVarP(&iro.unattended, "yes", "y", false, "Create management cluster without asking for confirmation") - - createCmd.Flags().BoolVarP(&iro.useExistingCluster, "use-existing-bootstrap-cluster", "e", false, "Use an existing bootstrap cluster to deploy the management cluster") - - createCmd.Flags().DurationVarP(&iro.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") - - createCmd.Flags().StringVarP(&iro.infrastructureProvider, "infrastructure", "i", "", "Infrastructure to deploy the management cluster on ['aws', 'vsphere', 'azure']") - createCmd.Flags().MarkHidden("infrastructure") //nolint - - createCmd.Flags().StringVarP(&iro.plan, "plan", "p", "", "Cluster plan to use to deploy the management cluster") - createCmd.Flags().MarkHidden("plan") //nolint - - createCmd.Flags().StringVarP(&iro.clusterName, "name", "", "", "Name of the management cluster. One will be generated if not provided") - createCmd.Flags().MarkHidden("name") //nolint - - createCmd.Flags().StringVarP(&iro.size, "size", "", "", "Specify size for all nodes including control plane and worker nodes. It can be overridden by --controlplane-size and --worker-size options. (See [+])") - createCmd.Flags().MarkHidden("size") //nolint - - createCmd.Flags().StringVarP(&iro.controlPlaneSize, "controlplane-size", "", "", "Specify size for the control plane node. (See [+])") - createCmd.Flags().MarkHidden("controlplane-size") //nolint - - createCmd.Flags().StringVarP(&iro.workerSize, "worker-size", "", "", "Specify size of the worker node. (See [+])") - createCmd.Flags().MarkHidden("worker-size") //nolint - - // commercial Tanzu editions turn CEIP on by default. - // community edition turns it off - - createCmd.Flags().StringVarP(&iro.ceipOptIn, "ceip-participation", "", "", "Specify if this management cluster should participate in VMware CEIP. (See [*])") - createCmd.Flags().MarkHidden("ceip-participation") //nolint - - createCmd.Flags().BoolVarP(&iro.deployTKGonVsphere7, "deploy-tkg-on-vSphere7", "", false, "Deploy TKG Management cluster on vSphere 7.0 without prompt") - createCmd.Flags().MarkHidden("deploy-tkg-on-vSphere7") //nolint - - createCmd.Flags().BoolVarP(&iro.enableTKGSOnVsphere7, "enable-tkgs-on-vSphere7", "", false, "Enable TKGS on vSphere 7.0 without prompt") - createCmd.Flags().MarkHidden("enable-tkgs-on-vSphere7") //nolint - - createCmd.Flags().StringVarP(&iro.vsphereControlPlaneEndpoint, "vsphere-controlplane-endpoint", "", "", "Virtual IP address or FQDN for the cluster's control plane nodes") - createCmd.Flags().MarkHidden("vsphere-controlplane-endpoint") //nolint - - createCmd.Flags().BoolVar(&iro.dryRun, "dry-run", false, "Generates the management cluster manifest and writes the output to stdout without applying it") - - // Hidden flags, mostly for development and testing - - createCmd.Flags().StringVarP(&iro.targetNamespace, "target-namespace", "", "", "The target namespace where the providers should be deployed. If not specified, each provider will be installed in a provider's default namespace") - createCmd.Flags().MarkHidden("target-namespace") //nolint - - createCmd.Flags().StringVarP(&iro.cniType, "cni", "", "", "Specify the CNI provider the management cluster should use ['antrea' (default), 'calico', 'none'].") - createCmd.Flags().MarkHidden("cni") //nolint - - createCmd.Flags().StringToStringVarP(&iro.featureFlags, "feature-flags", "", nil, "Activate and deactivate hidden features in the form 'feature1=true,feature2=false'") - createCmd.Flags().MarkHidden("feature-flags") //nolint - - createCmd.Flags().BoolVar(&iro.forceConfigUpdate, "force-config-update", false, "Force an update of all configuration files in ${HOME}/.config/tanzu/tkg/bom and ${HOME}/.tanzu/tkg/compatibility") - - createCmd.Flags().SetNormalizeFunc(aliasNormalizeFunc) - - createCmd.Flags().StringVarP(&iro.additionalTKGManifests, "additional-tkg-system-manifests", "", "", "Additional manifests to be applied to the bootstrap cluster in the tkg-system namespace") -} - -func aliasNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName { - if name == "vsphere-controlplane-endpoint-ip" { - name = "vsphere-controlplane-endpoint" - } - return pflag.NormalizedName(name) -} - -func runInit() error { - forceUpdateTKGCompatibilityImage := iro.forceConfigUpdate - tkgClient, err := newTKGCtlClient(forceUpdateTKGCompatibilityImage) - if err != nil { - return err - } - - edition, err := config.GetEdition() - if err != nil { - return err - } - - options := tkgctl.InitRegionOptions{ - ClusterConfigFile: iro.clusterConfigFile, - Plan: iro.plan, - UI: iro.ui, - ClusterName: iro.clusterName, - UseExistingCluster: iro.useExistingCluster, - CoreProvider: iro.coreProvider, - BootstrapProvider: iro.bootstrapProvider, - InfrastructureProvider: iro.infrastructureProvider, - ControlPlaneProvider: iro.controlPlaneProvider, - Namespace: iro.targetNamespace, - WatchingNamespace: iro.watchingNamespace, - Size: iro.size, - ControlPlaneSize: iro.controlPlaneSize, - WorkerSize: iro.workerSize, - CeipOptIn: iro.ceipOptIn, - CniType: iro.cniType, - FeatureFlags: iro.featureFlags, - EnableTKGSOnVsphere7: iro.enableTKGSOnVsphere7, - DeployTKGonVsphere7: iro.deployTKGonVsphere7, - Bind: iro.bind, - Browser: iro.browser, - VsphereControlPlaneEndpoint: iro.vsphereControlPlaneEndpoint, - SkipPrompt: iro.unattended, - Timeout: iro.timeout, - Edition: edition, - GenerateOnly: iro.dryRun, - AdditionalTKGManifests: iro.additionalTKGManifests, - } - - err = tkgClient.Init(options) - if err != nil { - return err - } - - // Sync plugins if management-cluster creation is successful and --dry-run was not set - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) && !iro.dryRun { - err = pluginmanager.SyncPlugins() - if err != nil { - log.Warningf("unable to sync plugins after management cluster create. Please run `tanzu plugin sync` command manually to install/update plugins") - } - } - - return nil -} diff --git a/cmd/cli/plugin/managementcluster/credentials.go b/cmd/cli/plugin/managementcluster/credentials.go deleted file mode 100644 index 21f106d5f8..0000000000 --- a/cmd/cli/plugin/managementcluster/credentials.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import "github.com/spf13/cobra" - -var credentialsCmd = &cobra.Command{ - Use: "credentials", - Short: "Update Credentials for Management Cluster", - SilenceUsage: true, -} diff --git a/cmd/cli/plugin/managementcluster/credentials_update.go b/cmd/cli/plugin/managementcluster/credentials_update.go deleted file mode 100644 index 476384a603..0000000000 --- a/cmd/cli/plugin/managementcluster/credentials_update.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "errors" - "fmt" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type updateCredentialsOptions struct { - vSphereUser string - vSpherePassword string - azureTenantID string - azureClientID string - azureClientSecret string - isCascading bool -} - -var updateCredentialsOpts = updateCredentialsOptions{} - -var credentialsUpdateCmd = &cobra.Command{ - Use: "update CLUSTER_NAME", - Short: "Update credentials for management cluster", - Args: cobra.MaximumNArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - var clusterName string - if len(args) == 0 { - clusterName = "" - } else { - clusterName = args[0] - } - - return updateClusterCredentials(clusterName) - }, - SilenceUsage: true, -} - -const ( - vsphereProvider = "vsphere" - azureProvider = "azure" -) - -func init() { - credentialsUpdateCmd.Flags().StringVarP(&updateCredentialsOpts.vSphereUser, "vsphere-user", "", "", "Username for vSphere provider") - credentialsUpdateCmd.Flags().StringVarP(&updateCredentialsOpts.vSpherePassword, "vsphere-password", "", "", "Password for vSphere provider") - credentialsUpdateCmd.Flags().StringVarP(&updateCredentialsOpts.azureTenantID, "azure-tenant-id", "", "", "ID for Azure Active Directory in which the app for Tanzu Kubernetes Grid is created") - credentialsUpdateCmd.Flags().StringVarP(&updateCredentialsOpts.azureClientID, "azure-client-id", "", "", "Client ID of the app for Tanzu Kubernetes Grid that you registered with Azure") - credentialsUpdateCmd.Flags().StringVarP(&updateCredentialsOpts.azureClientSecret, "azure-client-secret", "", "", "Client Secret of the app for Tanzu Kubernetes Grid that you registered with Azure") - credentialsUpdateCmd.Flags().BoolVarP(&updateCredentialsOpts.isCascading, "cascading", "", false, "Update credentials for all workload clusters under the management cluster") - - credentialsCmd.AddCommand(credentialsUpdateCmd) -} - -func updateClusterCredentials(clusterName string) error { - if clusterName == "" { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - clusterName = server.Name - } - - var promptOpts []component.PromptOpt - - forceUpdateTKGCompatibilityImage := false - tkgctlClient, err := newTKGCtlClient(forceUpdateTKGCompatibilityImage) - if err != nil { - return err - } - - provider := "" - - if updateCredentialsOpts.vSphereUser != "" { - provider = vsphereProvider - } else if updateCredentialsOpts.azureClientID != "" { - provider = azureProvider - } else { - err := component.Prompt( - &component.PromptConfig{ - Message: fmt.Sprintf("Specify provider %q or %q", vsphereProvider, azureProvider), - Default: "vsphere", - }, - &provider, - promptOpts..., - ) - if err != nil { - return err - } - } - - if provider == vsphereProvider { - vsphereVariables := [2]*string{&updateCredentialsOpts.vSphereUser, &updateCredentialsOpts.vSpherePassword} - vsphereMessages := [2]string{"Enter vSphere username", "Enter vSphere password"} - vsphereSensitive := [2]bool{false, true} - for i := 0; i < 2; i++ { - if *vsphereVariables[i] == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: vsphereMessages[i], - Sensitive: vsphereSensitive[i], - }, - vsphereVariables[i], - promptOpts..., - ) - if err != nil { - return err - } - } - } - } else if provider == azureProvider { - azureVariables := [3]*string{&updateCredentialsOpts.azureTenantID, &updateCredentialsOpts.azureClientID, &updateCredentialsOpts.azureClientSecret} - azureMessages := [3]string{"Enter azure tenant id", "Enter azure client id", "Enter azure client secret"} - azureSensitive := [3]bool{false, false, true} - for i := 0; i < 3; i++ { - if *azureVariables[i] == "" { - err = component.Prompt( - &component.PromptConfig{ - Message: azureMessages[i], - Sensitive: azureSensitive[i], - }, - azureVariables[i], - promptOpts..., - ) - if err != nil { - return err - } - } - } - } else { - return errors.New("please specify supported provider name: vsphere or azure") - } - - options := tkgctl.UpdateCredentialsRegionOptions{ - ClusterName: clusterName, - VSphereUsername: updateCredentialsOpts.vSphereUser, - VSpherePassword: updateCredentialsOpts.vSpherePassword, - AzureTenantID: updateCredentialsOpts.azureTenantID, - AzureClientID: updateCredentialsOpts.azureClientID, - AzureClientSecret: updateCredentialsOpts.azureClientSecret, - IsCascading: updateCredentialsOpts.isCascading, - } - - return tkgctlClient.UpdateCredentialsRegion(options) -} diff --git a/cmd/cli/plugin/managementcluster/delete.go b/cmd/cli/plugin/managementcluster/delete.go deleted file mode 100644 index 45adaa271a..0000000000 --- a/cmd/cli/plugin/managementcluster/delete.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "time" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -type deleteRegionOptions struct { - force bool - useExistingCluster bool - unattended bool - timeout time.Duration -} - -var dr = &deleteRegionOptions{} - -var deleteRegionCmd = &cobra.Command{ - Use: "delete", - Short: "Delete a management cluster", - Long: `Delete a management cluster and tears down the underlying infrastructure`, - Example: ` - # Deletes the management cluster of the current server - tanzu management-cluster delete`, - Args: cobra.MaximumNArgs(1), // TODO: deprecate version of command that takes args - RunE: func(cmd *cobra.Command, args []string) error { - return runForCurrentMC(runDeleteRegion) - }, - SilenceUsage: true, -} - -func init() { - deleteRegionCmd.Flags().BoolVar(&dr.force, "force", false, "Force deletion of the management cluster even if it is managing active Tanzu Kubernetes clusters") - deleteRegionCmd.Flags().BoolVarP(&dr.useExistingCluster, "use-existing-cleanup-cluster", "e", false, "Use an existing cleanup cluster to delete the management cluster") - deleteRegionCmd.Flags().BoolVarP(&dr.unattended, "yes", "y", false, "Delete management cluster without asking for confirmation") - deleteRegionCmd.Flags().DurationVarP(&dr.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") -} - -func runDeleteRegion(server *configapi.Server) error { - forceUpdateTKGCompatibilityImage := false - tkgClient, err := newTKGCtlClient(forceUpdateTKGCompatibilityImage) - if err != nil { - return err - } - - options := tkgctl.DeleteRegionOptions{ - ClusterName: server.Name, - Force: dr.force, - UseExistingCluster: dr.useExistingCluster, - SkipPrompt: dr.unattended, - Timeout: dr.timeout, - } - return tkgClient.DeleteRegion(options) -} diff --git a/cmd/cli/plugin/managementcluster/doc.go b/cmd/cli/plugin/managementcluster/doc.go deleted file mode 100644 index 7b771b1a27..0000000000 --- a/cmd/cli/plugin/managementcluster/doc.go +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -/* -Kubernetes management cluster operations. - -# Get or set ceip participation - -Usage: - - tanzu management-cluster ceip-participation [command] - -Available Commands: - - get Get the current CEIP opt-in status of the current management cluster - set Set the opt-in preference for CEIP of the current management cluster - -Flags: - - -h, --help help for ceip-participation - -Global Flags: - - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -Use "management-cluster ceip-participation [command] --help" for more information about a command. - -# Create a Tanzu Kubernetes Grid management cluster - -Includes initializing it with Cluster API components appropriate for the target infrastructure. - -Usage: - - tanzu management-cluster create [flags] - -Examples: - - # Create a management cluster on AWS infrastructure, initializing it with - # components required to create workload clusters through it on the same infrastructure - # by bootstrapping through a self-provisioned bootstrap cluster. - tanzu management-cluster create --file ~/clusterconfigs/aws-mc-1.yaml - # Launch an interactive UI to configure the settings necessary to create a - # management cluster - tanzu management-cluster create --ui - # Create a management cluster on vSphere infrastructure by using an existing - # bootstrapper cluster. The current kube context should point to that - # of the existing bootstrap cluster. - tanzu management-cluster create --use-existing-bootstrap-cluster --file vsphere-mc-1.yaml - -Flags: - - -b, --bind string Specify the IP and port to bind the Kickstart UI against (e.g. 127.0.0.1:8080). (default "127.0.0.1:8080") - --browser string Specify the browser to open the Kickstart UI on. Use 'none' for no browser. Defaults to OS default browser. Supported: ['chrome', 'firefox', 'safari', 'ie', 'edge', 'none'] - -f, --file string Configuration file from which to create a management cluster - -h, --help help for create - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - -u, --ui Launch interactive management cluster provisioning UI - -e, --use-existing-bootstrap-cluster Use an existing bootstrap cluster to deploy the management cluster - -y, --yes Create management cluster without asking for confirmation - -Global Flags: - - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -# Update Credentials for Management Cluster - -Usage: - - tanzu management-cluster credentials [command] - -Available Commands: - - update Update credentials for management cluster - -Flags: - - -h, --help help for credentials - -Global Flags: - - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -Use "management-cluster credentials [command] --help" for more information about a command. - -# Delete a management cluster and tears down the underlying infrastructure - -Usage: - - tanzu management-cluster delete [flags] - -Examples: - - # Deletes the management cluster of the current server - tanzu management-cluster delete - -Flags: - - --force Force deletion of the management cluster even if it is managing active Tanzu Kubernetes clusters - -h, --help help for delete - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - -e, --use-existing-cleanup-cluster Use an existing cleanup cluster to delete the management cluster - -y, --yes Delete management cluster without asking for confirmation - -Global Flags: - - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -Retrieves details about the current management cluster. Requires the current server to be a management cluster - -Usage: - - tanzu management-cluster get [flags] - -Flags: - - -h, --help help for get - --show-all-conditions string List of comma separated kind or kind/name for which we should show all the object's conditions (all to show conditions for all the objects) - --show-details Show details of MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object - --show-group-members Expand machine groups whose ready condition has the same Status, Severity and Reason - -Global Flags: - - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -# Import Tanzu Kubernetes Grid management cluster from TKG settings file - -Usage: - - tanzu management-cluster import [flags] - -Examples: - - # Import management cluster config from default config file - tanzu management-cluster import - - # Import management cluster config from custom config file - tanzu management-cluster import -f path/to/configfile.yaml - -Flags: - - -f, --file string TKG settings file (default '$HOME/.tkg/config.yaml') - -h, --help help for import - -Global Flags: - - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -# Kubeconfig of management cluster - -Usage: - - tanzu management-cluster kubeconfig [command] - -Available Commands: - - get Get Kubeconfig of a management cluster - -Flags: - - -h, --help help for kubeconfig - -Global Flags: - - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -Use "management-cluster kubeconfig [command] --help" for more information about a command. - -# Configure permissions on cloud providers - -Usage: - - tanzu management-cluster permissions [command] - -Available Commands: - - aws Configure permissions on AWS - -Flags: - - -h, --help help for permissions - -Global Flags: - - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -Use "management-cluster permissions [command] --help" for more information about a command. - -# Upgrades the management cluster - -Usage: - - tanzu management-cluster upgrade [flags] - -Flags: - - -h, --help help for upgrade - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - --vsphere-vm-template-name string The vSphere VM template to be used with upgraded kubernetes version. Discovered automatically if not provided - -y, --yes Upgrade management cluster without asking for confirmation - -Global Flags: - - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -*/ -package main diff --git a/cmd/cli/plugin/managementcluster/featureflags.go b/cmd/cli/plugin/managementcluster/featureflags.go deleted file mode 100644 index 99c04e8230..0000000000 --- a/cmd/cli/plugin/managementcluster/featureflags.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -// DefaultFeatureFlagsForManagementClusterPlugin is used to populate default feature-flags for the management-cluster plugin -var ( - DefaultFeatureFlagsForManagementClusterPlugin = map[string]bool{ - "features.management-cluster.import": false, - "features.management-cluster.export-from-confirm": true, - "features.management-cluster.standalone-cluster-mode": false, - constants.FeatureFlagManagementClusterDualStackIPv4Primary: false, - constants.FeatureFlagManagementClusterDualStackIPv6Primary: false, - constants.FeatureFlagManagementClusterCustomNameservers: false, - constants.FeatureFlagAwsInstanceTypesExcludeArm: true, - constants.FeatureFlagManagementClusterDeployInClusterIPAMProvider: true, - } -) diff --git a/cmd/cli/plugin/managementcluster/get.go b/cmd/cli/plugin/managementcluster/get.go deleted file mode 100644 index 42041680a1..0000000000 --- a/cmd/cli/plugin/managementcluster/get.go +++ /dev/null @@ -1,339 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "errors" - "fmt" - "io" - "sort" - "strings" - "time" - - "github.com/fatih/color" - "github.com/gosuri/uitable" - "github.com/spf13/cobra" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/duration" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctltree "sigs.k8s.io/cluster-api/cmd/clusterctl/client/tree" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/command" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" -) - -type getClusterOptions struct { - showOtherConditions string - // Deprecated: Use showDetails instead. - disableNoEcho bool - // Deprecated: Use showGroupMembers instead. - disableGroupObjects bool - showDetails bool - showGroupMembers bool -} - -const ( - // TKGSystemNamespace the name of the TKG system namespace - TKGSystemNamespace = "tkg-system" -) - -var maxMsgLength = 100 -var maxItemLength = 2 -var separator = " " - -var cd = &getClusterOptions{} -var cmdOutput io.Writer - -var getClusterCmd = &cobra.Command{ - Use: "get", - Short: "Get details about the current management cluster", - Long: "Retrieves details about the current management cluster. Requires the current server to be a management cluster", - Args: cobra.MaximumNArgs(1), // TODO: deprecate the single arg version in the future - RunE: func(cmd *cobra.Command, args []string) error { - f1 := cmd.Flags().Lookup("disable-no-echo") - f1Changed := false - if f1 != nil && f1.Changed { - f1Changed = true - cd.showDetails = cd.disableNoEcho - } - f2 := cmd.Flags().Lookup("show-details") - f2Changed := false - if f2 != nil && f2.Changed { - f2Changed = true - } - if f1Changed && f2Changed { - return fmt.Errorf("only one of --show-details or --disable-no-echo should be set") - } - - f1 = cmd.Flags().Lookup("disable-grouping") - f1Changed = false - if f1 != nil && f1.Changed { - f1Changed = true - cd.showGroupMembers = cd.disableGroupObjects - } - f2 = cmd.Flags().Lookup("show-group-members") - f2Changed = false - if f2 != nil && f2.Changed { - f2Changed = true - } - if f1Changed && f2Changed { - return fmt.Errorf("only one of --show-group-members or --disable-grouping should be set") - } - return runForCurrentMC(getClusterDetails) - }, - SilenceUsage: true, -} - -func init() { - cmdOutput = getClusterCmd.OutOrStdout() - getClusterCmd.Flags().StringVar(&cd.showOtherConditions, "show-all-conditions", "", "List of comma separated kind or kind/name for which we should show all the object's conditions (all to show conditions for all the objects)") - - getClusterCmd.Flags().BoolVar(&cd.disableNoEcho, "disable-no-echo", false, "Disable hiding of a MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object") - command.DeprecateFlagWithAlternative(getClusterCmd, "disable-no-echo", "1.6.0", "--show-details") - getClusterCmd.Flags().BoolVar(&cd.showDetails, "show-details", false, "Show details of MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object") - - getClusterCmd.Flags().BoolVar(&cd.disableGroupObjects, "disable-grouping", false, "Disable grouping machines when ready condition has the same Status, Severity and Reason") - command.DeprecateFlagWithAlternative(getClusterCmd, "disable-grouping", "1.6.0", "--show-group-members") - getClusterCmd.Flags().BoolVar(&cd.showGroupMembers, "show-group-members", false, "Expand machine groups whose ready condition has the same Status, Severity and Reason") -} - -func getClusterDetails(currServ *configapi.Server) error { - forceUpdateTKGCompatibilityImage := false - tkgClient, err := newTKGCtlClient(forceUpdateTKGCompatibilityImage) - if err != nil { - return err - } - - isPacific, err := tkgClient.IsPacificRegionalCluster() - if err != nil { - return errors.New("error determining 'Tanzu Kubernetes Cluster service for vSphere' management cluster") - } - - if isPacific { - return errors.New("detected 'Tanzu Kubernetes service for vSphere'. Currently this operation is not supported for 'Tanzu Kubernetes service for vSphere'") - } - - // Output the Status - describeClusterOptions := tkgctl.DescribeTKGClustersOptions{ - ClusterName: currServ.Name, - Namespace: TKGSystemNamespace, - ShowOtherConditions: cd.showOtherConditions, - ShowDetails: cd.showDetails, - ShowGroupMembers: cd.showGroupMembers, - } - - results, err := tkgClient.DescribeCluster(describeClusterOptions) - if err != nil { - return err - } - - t := component.NewOutputWriter(cmdOutput, "table", "NAME", "NAMESPACE", "STATUS", "CONTROLPLANE", "WORKERS", "KUBERNETES", "ROLES", "PLAN", "TKR") - cl := results.ClusterInfo - clusterRoles := "" - if len(cl.Roles) != 0 { - clusterRoles = strings.Join(cl.Roles, ",") - } - t.AddRow(cl.Name, cl.Namespace, cl.Status, cl.ControlPlaneCount, cl.WorkerCount, cl.K8sVersion, clusterRoles, cl.Plan, cl.TKR) - - t.Render() - log.Infof("\n\nDetails:\n\n") - treeView(results.Objs, results.Cluster) - - // If it is a Management Cluster, output the providers - if results.InstalledProviders != nil { - log.Infof("\n\nProviders:\n\n") - p := component.NewOutputWriter(cmdOutput, "table", "NAMESPACE", "NAME", "TYPE", "PROVIDERNAME", "VERSION", "WATCHNAMESPACE") - for i := range results.InstalledProviders.Items { - installedProvider := results.InstalledProviders.Items[i] - p.AddRow(installedProvider.Namespace, installedProvider.Name, installedProvider.Type, installedProvider.ProviderName, installedProvider.Version, installedProvider.WatchedNamespace) - } - p.Render() - } - - return nil -} - -const ( - firstElemPrefix = `├─` - lastElemPrefix = `└─` - pipe = `│ ` -) - -var ( - gray = color.New(color.FgHiBlack) - red = color.New(color.FgRed) - green = color.New(color.FgGreen) - yellow = color.New(color.FgYellow) - white = color.New(color.FgWhite) - cyan = color.New(color.FgCyan) -) - -// treeView prints object hierarchy to out stream. -func treeView(objs *clusterctltree.ObjectTree, obj client.Object) { - tbl := uitable.New() - tbl.Separator = separator - tbl.AddRow("NAME", "READY", "SEVERITY", "REASON", "SINCE", "MESSAGE") - treeViewInner("", tbl, objs, obj) - fmt.Fprintln(color.Output, tbl) -} - -type conditions struct { - readyColor *color.Color - age string - status string - severity string - reason string - message string -} - -func getCond(c *clusterv1.Condition) conditions { - v := conditions{} - if c == nil { - return v - } - - switch c.Status { - case corev1.ConditionTrue: - v.readyColor = green - case corev1.ConditionFalse, corev1.ConditionUnknown: - switch c.Severity { - case clusterv1.ConditionSeverityError: - v.readyColor = red - case clusterv1.ConditionSeverityWarning: - v.readyColor = yellow - default: - v.readyColor = white - } - default: - v.readyColor = gray - } - - v.status = string(c.Status) - v.severity = string(c.Severity) - v.reason = c.Reason - v.message = c.Message - if len(v.message) > maxMsgLength { - v.message = fmt.Sprintf("%s ...", v.message[:maxMsgLength]) - } - v.age = duration.HumanDuration(time.Since(c.LastTransitionTime.Time)) - - return v -} - -func treeViewInner(prefix string, tbl *uitable.Table, objs *clusterctltree.ObjectTree, obj client.Object) { - v := conditions{} - v.readyColor = gray - - ready := clusterctltree.GetReadyCondition(obj) - name := getName(obj) - if ready != nil { - v = getCond(ready) - } - - if clusterctltree.IsGroupObject(obj) { - name = white.Add(color.Bold).Sprintf(name) - items := strings.Split(clusterctltree.GetGroupItems(obj), clusterctltree.GroupItemsSeparator) - if len(items) <= maxItemLength { - v.message = gray.Sprintf("See %s", strings.Join(items, clusterctltree.GroupItemsSeparator)) - } else { - v.message = gray.Sprintf("See %s, ...", strings.Join(items[:2], clusterctltree.GroupItemsSeparator)) - } - } - if !obj.GetDeletionTimestamp().IsZero() { - name = fmt.Sprintf("%s %s", red.Sprintf("!! DELETED !!"), name) - } - - tbl.AddRow( - fmt.Sprintf("%s%s", gray.Sprint(printPrefix(prefix)), name), - v.readyColor.Sprint(v.status), - v.readyColor.Sprint(v.severity), - v.readyColor.Sprint(v.reason), - v.age, - v.message) - - chs := objs.GetObjectsByParent(obj.GetUID()) - - if clusterctltree.IsShowConditionsObject(obj) { - otherConditions := clusterctltree.GetOtherConditions(obj) - for i := range otherConditions { - cond := otherConditions[i] - - p := "" - filler := strings.Repeat(" ", 10) - siblingsPipe := separator - if len(chs) > 0 { - siblingsPipe = pipe - } - switch i { - case len(otherConditions) - 1: - p = prefix + siblingsPipe + filler + lastElemPrefix - default: - p = prefix + siblingsPipe + filler + firstElemPrefix - } - - v = getCond(cond) - tbl.AddRow( - fmt.Sprintf("%s%s", gray.Sprint(printPrefix(p)), cyan.Sprint(cond.Type)), - v.readyColor.Sprint(v.status), - v.readyColor.Sprint(v.severity), - v.readyColor.Sprint(v.reason), - v.age, - v.message) - } - } - - sort.Slice(chs, func(i, j int) bool { - return getName(chs[i]) < getName(chs[j]) - }) - - for i, child := range chs { - switch i { - case len(chs) - 1: - treeViewInner(prefix+lastElemPrefix, tbl, objs, child) - default: - treeViewInner(prefix+firstElemPrefix, tbl, objs, child) - } - } -} - -func getName(obj client.Object) string { - if clusterctltree.IsGroupObject(obj) { - items := strings.Split(clusterctltree.GetGroupItems(obj), clusterctltree.GroupItemsSeparator) - return fmt.Sprintf("%d Machines...", len(items)) - } - - if clusterctltree.IsVirtualObject(obj) { - return obj.GetName() - } - - objName := fmt.Sprintf("%s/%s", - obj.GetObjectKind().GroupVersionKind().Kind, - color.New(color.Bold).Sprint(obj.GetName())) - - name := objName - if objectPrefix := clusterctltree.GetMetaName(obj); objectPrefix != "" { - name = fmt.Sprintf("%s - %s", objectPrefix, gray.Sprintf(name)) - } - return name -} - -func printPrefix(p string) string { - if strings.HasSuffix(p, firstElemPrefix) { - p = strings.Replace(p, firstElemPrefix, pipe, strings.Count(p, firstElemPrefix)-1) - } else { - p = strings.ReplaceAll(p, firstElemPrefix, pipe) - } - - if strings.HasSuffix(p, lastElemPrefix) { - p = strings.Replace(p, lastElemPrefix, strings.Repeat(" ", len([]rune(lastElemPrefix))), strings.Count(p, lastElemPrefix)-1) - } else { - p = strings.ReplaceAll(p, lastElemPrefix, strings.Repeat(" ", len([]rune(lastElemPrefix)))) - } - return p -} diff --git a/cmd/cli/plugin/managementcluster/get_ceip.go b/cmd/cli/plugin/managementcluster/get_ceip.go deleted file mode 100644 index dd3d63bd6d..0000000000 --- a/cmd/cli/plugin/managementcluster/get_ceip.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" -) - -var getCeipCmd = &cobra.Command{ - Use: "get", - Aliases: []string{"ceip", "ceip-participations"}, - Short: "Get the current CEIP opt-in status", - Long: "Get the current CEIP opt-in status of the current management cluster", - RunE: func(cmd *cobra.Command, args []string) error { - return runGetCEIP(cmd) - }, - SilenceUsage: true, -} - -func init() { - getCeipCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table)") - - ceipCmd.AddCommand(getCeipCmd) -} - -func runGetCEIP(cmd *cobra.Command) error { - forceUpdateTKGCompatibilityImage := false - tkgClient, err := newTKGCtlClient(forceUpdateTKGCompatibilityImage) - if err != nil { - return err - } - - ceipStatus, err := tkgClient.GetCEIP() - if err != nil { - return err - } - - t := component.NewOutputWriter(cmd.OutOrStdout(), outputFormat, "Management-Cluster-Name", "CEIP-Status") - t.AddRow(ceipStatus.ClusterName, ceipStatus.CeipStatus) - t.Render() - - return nil -} diff --git a/cmd/cli/plugin/managementcluster/go.mod b/cmd/cli/plugin/managementcluster/go.mod deleted file mode 100644 index f316ee84c6..0000000000 --- a/cmd/cli/plugin/managementcluster/go.mod +++ /dev/null @@ -1,251 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/plugin/managementcluster - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/config => ../../../../apis/config - github.com/vmware-tanzu/tanzu-framework/apis/run => ../../../../apis/run - github.com/vmware-tanzu/tanzu-framework/capabilities/client => ../../../../capabilities/client - github.com/vmware-tanzu/tanzu-framework/cli/core => ../../../../cli/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../../../cli/runtime - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common => ../../../../pinniped-components/common - github.com/vmware-tanzu/tanzu-framework/tkg => ../../../../tkg - github.com/vmware-tanzu/tanzu-framework/tkr => ../../../../tkr - github.com/vmware-tanzu/tanzu-framework/util => ../../../../util - sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.8 -) - -require ( - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/fatih/color v1.13.0 - github.com/gosuri/uitable v0.0.4 - github.com/pkg/errors v0.9.1 - github.com/spf13/cobra v1.6.1 - github.com/spf13/pflag v1.0.5 - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/core v0.0.0-20220914003300-5b2ed024556a - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/tkg v0.0.0-00010101000000-000000000000 - golang.org/x/sync v0.1.0 - k8s.io/api v0.24.4 - k8s.io/apimachinery v0.24.4 - sigs.k8s.io/cluster-api v1.2.8 - sigs.k8s.io/controller-runtime v0.12.3 -) - -require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.6.0 // indirect - cloud.google.com/go/storage v1.27.0 // indirect - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/Azure/azure-sdk-for-go v66.0.0+incompatible // indirect - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.23 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.18 // indirect - github.com/Azure/go-autorest/autorest/azure/auth v0.5.10 // indirect - github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect - github.com/BurntSushi/toml v1.1.0 // indirect - github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/semver/v3 v3.2.0 // indirect - github.com/Masterminds/sprig/v3 v3.2.3 // indirect - github.com/Microsoft/go-winio v0.5.2 // indirect - github.com/adrg/xdg v0.4.0 // indirect - github.com/alessio/shellescape v1.4.1 // indirect - github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d // indirect - github.com/apparentlymart/go-cidr v1.1.0 // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect - github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7 // indirect - github.com/aws/amazon-vpc-cni-k8s v1.12.0 // indirect - github.com/aws/aws-sdk-go v1.44.107 // indirect - github.com/awslabs/goformation/v4 v4.19.5 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.11.4 // indirect - github.com/coredns/caddy v1.1.1 // indirect - github.com/coredns/corefile-migration v1.0.18 // indirect - github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e // indirect - github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect - github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/docker/cli v20.10.16+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.17+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.4.0 // indirect - github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 // indirect - github.com/elazarl/go-bindata-assetfs v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/getkin/kin-openapi v0.94.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-asn1-ber/asn1-ber v1.5.1 // indirect - github.com/go-ldap/ldap/v3 v3.3.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-openapi/analysis v0.19.5 // indirect - github.com/go-openapi/errors v0.19.2 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/loads v0.19.4 // indirect - github.com/go-openapi/runtime v0.19.4 // indirect - github.com/go-openapi/spec v0.19.5 // indirect - github.com/go-openapi/strfmt v0.19.5 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-openapi/validate v0.19.8 // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.0.0 // indirect - github.com/golang/glog v1.0.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/cel-go v0.12.5 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/go-containerregistry v0.10.0 // indirect - github.com/google/go-github/v45 v45.2.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/hashicorp/go-version v1.4.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/huandu/xstrings v1.3.3 // indirect - github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/jessevdk/go-flags v1.4.0 // indirect - github.com/jinzhu/copier v0.3.5 // 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/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect - github.com/k14s/imgpkg v0.17.0 // indirect - github.com/k14s/kbld v0.32.0 // indirect - github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 // indirect - github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.15.4 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moby/spdystream v0.2.0 // indirect - github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae // 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/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/gomega v1.24.1 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 // indirect - github.com/oracle/oci-go-sdk/v49 v49.2.0 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rs/xid v1.4.0 // indirect - github.com/russross/blackfriday v1.6.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b // indirect - github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522 // indirect - github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect - github.com/sony/gobreaker v0.4.2-0.20210216022020-dd874f9dd33b // indirect - github.com/spf13/afero v1.9.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/stoewer/go-strcase v1.2.0 // indirect - github.com/subosito/gotenv v1.3.0 // indirect - github.com/valyala/fastjson v1.6.3 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec // indirect - github.com/vmware-tanzu/carvel-imgpkg v0.23.1 // indirect - github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 // indirect - github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 // indirect - github.com/vmware-tanzu/carvel-vendir v0.30.0 // indirect - github.com/vmware-tanzu/carvel-ytt v0.40.0 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/config v0.0.0-20220824221239-af5a644ffef7 // indirect - github.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/packageclients v0.0.0-20220908202723-7a1ddb97efab // indirect - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/tkr v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware/govmomi v0.30.2 // indirect - github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect - go.mongodb.org/mongo-driver v1.5.1 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.102.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect - google.golang.org/grpc v1.50.1 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.66.4 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.24.4 // indirect - k8s.io/apiserver v0.24.4 // indirect - k8s.io/client-go v0.24.4 // indirect - k8s.io/cluster-bootstrap v0.24.4 // indirect - k8s.io/component-base v0.24.4 // indirect - k8s.io/klog/v2 v2.80.0 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 // indirect - sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2 // indirect - sigs.k8s.io/cluster-api-provider-azure v1.6.1 // indirect - sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 // indirect - sigs.k8s.io/cluster-api/test v1.2.8 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/kind v0.15.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/cmd/cli/plugin/managementcluster/go.sum b/cmd/cli/plugin/managementcluster/go.sum deleted file mode 100644 index 01d8bec7ae..0000000000 --- a/cmd/cli/plugin/managementcluster/go.sum +++ /dev/null @@ -1,2141 +0,0 @@ -4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= -cloud.google.com/go/iam v0.6.0 h1:nsqQC88kT5Iwlm4MeNGTpfMWddp6NB/UOLFTH6m1QfQ= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/longrunning v0.1.1 h1:y50CXG4j0+qvEukslYFBCrzaXX0qpFbBzc3PchSu/LE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= -cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCqWCLp6Cifo= -github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible h1:bmmC38SlE8/E81nNADlgmVGurPWMHDX2YNXVQMrBpEE= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.23 h1:bRQWsW25/YkoxnIqXMPF94JW33qWDcrPMZ3bINaAruU= -github.com/Azure/go-autorest/autorest v0.11.23/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.10 h1:F9A3Z++TtAoFysBsNOIJILoHuYBaYvhVGsMGEqPtIS8= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.10/go.mod h1:zQXYYNX9kXzRMrJNVXWUfNy38oPMF5/2TeZ4Wylc9fE= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 h1:dMOmEJfkLKW/7JsokJqkyoYSgmR08hi9KrhjZb+JALY= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28= -github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= -github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d h1:0xIrH2lJbraclvJT3pvTf3u2oCAL60cAqiv4qRpz4EI= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU= -github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -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/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7 h1:UpBQmQ1gKLi+i+/Dohoqk7FfuxlYQYveajqs1pk/CvA= -github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7/go.mod h1:BcllDeAFx8PtaMrPxvvuCUo7NRS2x6w+3W17WFDu0sk= -github.com/aws/amazon-vpc-cni-k8s v1.12.0 h1:WP8wHJ+UjViYkpMi2Uu5hHiPTYH3/jPC9pG3PrTmoWY= -github.com/aws/amazon-vpc-cni-k8s v1.12.0/go.mod h1:vZdHLUZf7Kj4mpqzG+szRxvCe/XMS/EAcxwMklI6NOQ= -github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= -github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.107 h1:VP7Rq3wzsOV7wrfHqjAAKRksD4We58PaoVSDPKhm8nw= -github.com/aws/aws-sdk-go v1.44.107/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/awslabs/goformation/v4 v4.19.5 h1:Y+Tzh01tWg8gf//AgGKUamaja7Wx9NPiJf1FpZu4/iU= -github.com/awslabs/goformation/v4 v4.19.5/go.mod h1:JoNpnVCBOUtEz9bFxc9sjy8uBUCLF5c4D1L7RhRTVM8= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/blizzy78/varnamelen v0.3.0/go.mod h1:hbwRdBvoBqxk34XyQ6HA0UH3G0/1TKuv5AC4eaBT0Ec= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/breml/bidichk v0.1.1/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudfoundry/bosh-utils v0.0.0-20191216173634-505d7f919144/go.mod h1:JCrKwetZGjxbfq1U139TZuXDBfdGLtjOEAfxMWKV/QM= -github.com/cloudfoundry/config-server v0.1.20/go.mod h1:Y3b/MHqyp22CcG0X1qvEHG8lujoebxjD9IAslyS/Yk0= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.11.4 h1:LjrYUZpyOhiSaU7hHrdR82/RBoxfGWSaC0VeSSMXqnk= -github.com/containerd/stargz-snapshotter/estargz v0.11.4/go.mod h1:7vRJIcImfY8bpifnMjt+HTJoQxASq7T28MYbP15/Nf0= -github.com/coredns/caddy v1.1.0/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= -github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/corefile-migration v1.0.18 h1:zs5PJm/VGZVje1ESRj6ZqyUuVsVfagExkbLU2QKV5mI= -github.com/coredns/corefile-migration v1.0.18/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e h1:4AxO89dwbgA957M8DX5AV/KsOmxDyAB1BES0INY+A/0= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= -github.com/cppforlife/go-cli-ui v0.0.0-20200506005011-4268990983cc/go.mod h1:I0qrzCmuPWYI6kAOvkllYjaW2aovclWbJ96+v+YyHb0= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f h1:yVW0v4zDXzJo1i8G9G3vtvNpyzhvtLalO34BsN/K88E= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f/go.mod h1:L18TqO77ci8i+hFtlMC4zSFz/D3O8lf84TyVU+zFF8E= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/daixiang0/gci v0.2.9/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.16+incompatible h1:aLQ8XowgKpR3/IysPj8qZQJBVQ+Qws61icFuZl6iKYs= -github.com/docker/cli v20.10.16+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 h1:7QPwrLT79GlD5sizHf27aoY2RTvw62mO6x7mxkScNk0= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46/go.mod h1:esf2rsHFNlZlxsqsZDojNBcnNs5REqIvRrWRHqX0vEU= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw= -github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getkin/kin-openapi v0.94.0 h1:bAxg2vxgnHHHoeefVdmGbR+oxtJlcv5HsJJa3qmAHuo= -github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= -github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-critic/go-critic v0.6.1/go.mod h1:SdNCfU0yF3UBjtaZGw6586/WocupMOJuiqgom5DsQxM= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-ldap/ldap/v3 v3.3.0 h1:lwx+SJpgOHd8tG6SumBQZXCmNX51zM8B1cfxJ5gv4tQ= -github.com/go-ldap/ldap/v3 v3.3.0/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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 v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4 h1:5I4CCSqoWzT+82bBkNIvmLc0UOsoKKQ4Fz+3VxOB7SY= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= -github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-openapi/validate v0.19.8 h1:YFzsdWIDfVuLvIOF+ZmKjVg1MbPJ1QgY9PihMwei1ys= -github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.43.0/go.mod h1:VIFlUqidx5ggxDfQagdvd9E67UjMXtTHBkBQ7sHoC5Q= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-go v0.12.5 h1:DmzaiSgoaqGCjtpPQWl26/gND+yRpim56H1jCVev6d8= -github.com/google/cel-go v0.12.5/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.10.0 h1:qd/fv2nQajGZJenaNcdaghlwSPjQ0NphN9hzArr2WWg= -github.com/google/go-containerregistry v0.10.0/go.mod h1:C7uwbB1QUAtvnknyd3ethxJRd4gtEjU/9WLXzckfI1Y= -github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= -github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= -github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= -github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= -github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= -github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= -github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hpcloud/tail v1.0.1-0.20180514194441-a1dbeea552b7/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= -github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= -github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -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/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57 h1:CwBRArr+BWBopnUJhDjJw86rPL/jGbEjfHWKzTasSqE= -github.com/k14s/imgpkg v0.17.0 h1:l1HqYtjecqx7iYecJUvxQQYdo3WubCahHQ30lh0p9sU= -github.com/k14s/imgpkg v0.17.0/go.mod h1:xYZ7gQxYP3O35vGIXcYchDEHq0xA81FOheCp8Vlq5ko= -github.com/k14s/kbld v0.32.0 h1:zf3qCir0usz7rX6JRF97QxaZ25+13EniE7z+ll0xaZ8= -github.com/k14s/kbld v0.32.0/go.mod h1:N7Ij72ZhJ2B7kTUxavGTBT1YymIfmAeO6JKyNbtja1g= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 h1:wKSifC/VbCaQMqXYn6/gSFqle82OX4bE3KYALDU9FlU= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115/go.mod h1:mGrnmO5qnhJIaSiwMo05cvRL6Ww9ccYbTgNFcm6RHZQ= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 h1:4bcRTTSx+LKSxMWibIwzHnDNmaN1x52oEpvnjCy+8vk= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368/go.mod h1:lKGj1op99m4GtQISxoD2t+K+WO/q2NzEPKvfXFQfbCA= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.4 h1:1kn4/7MepF/CHmYub99/nNX8az0IJjfSOU/jbnTVfqQ= -github.com/klauspost/compress v1.15.4/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= -github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= -github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.1.2/go.mod h1:bnXsMr+ZTH09V5rssEI+jHAZ4z+ZdyhgO/zsy3EhK+0= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -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/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -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/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= -github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc= -github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= -github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -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 v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.5.0 h1:TRtrvv2vdQqzkwrQ1ke6vtXf7IK34RBUJafIy1wMwls= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= -github.com/onsi/gomega v1.12.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= -github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 h1:+czc/J8SlhPKLOtVLMQc+xDCFBT73ZStMsRhSsUhsSg= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/oracle/oci-go-sdk/v49 v49.2.0 h1:l4PUk81EKdTDD4mDg5wrELpdWFqYeE9KYejfNgtsyUI= -github.com/oracle/oci-go-sdk/v49 v49.2.0/go.mod h1:E8q2DXmXnSozLdXHUFF+o3L2gzcWbiFIPFYOYWdqOfc= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -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/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.13/go.mod h1:Ul8wwdqR6kBVOCt2dipDBkE+T6vAV/iixkrKuRTN1oQ= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.10/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20210428214800-545e0d2e0bf7/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= -github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b h1:jUK33OXuZP/l6babJtnLo1qsGvq6G9so9KMflGAm4YA= -github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b/go.mod h1:8458kAagoME2+LN5//WxE71ysZ3B7r22fdgb7qVmXSY= -github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522 h1:fOCp11H0yuyAt2wqlbJtbyPzSgaxHTv8uN1pMpkG1t8= -github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522/go.mod h1:tQTYKOQgxoH3v6dEmdHiz4JG+nbxWwM5fgPQUpSZqVQ= -github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securego/gosec/v2 v2.9.1/go.mod h1:oDcDLcatOJxkCGaCaq8lua1jTnYf6Sou4wdiJ1n4iHc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil/v3 v3.21.10/go.mod h1:t75NhzCZ/dYyPQjyQmrAYP6c8+LCdFANeBMdLPCNnew= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= -github.com/sony/gobreaker v0.4.2-0.20210216022020-dd874f9dd33b h1:br+bPNZsJWKicw/5rALEo67QHs5weyD5tf8WST+4sJ0= -github.com/sony/gobreaker v0.4.2-0.20210216022020-dd874f9dd33b/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY= -github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= -github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1 h1:sUHDtnvcIMMcY/Pudym6DJ0kv7+uyMCAqQby0SLnQVs= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1/go.mod h1:2XNe+P0MDgya0FPEMOVZLAXku05VZhccVdDcXChhvy8= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 h1:zgWNumjhN+0CCiq1Wo4lVTmO89eOA6HuPXgv1sVhE4k= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0/go.mod h1:Hldrv7kPAD3THS1yUYZPFIaHmPE0ENO0ljzbJrpftiE= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 h1:3mSDyzhf52Y0jdvHrhJUf4Sk97CILBOkQt/WUaD8G/8= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0/go.mod h1:UW9xzccG6vjNoq2emVderTX11epILNyxtmGxFupRsHc= -github.com/vmware-tanzu/carvel-vendir v0.30.0 h1:JqElRFpSsYJQmI5Hrxl1Fx9wJZ2xeDk+TVnnSrFLFVU= -github.com/vmware-tanzu/carvel-vendir v0.30.0/go.mod h1:qFV2/3Cu584fhG2wXodoIm8KhX1wKHRFavBiRjK/Ly0= -github.com/vmware-tanzu/carvel-ytt v0.40.0 h1:WUWTtwvfqV9CN9v207oDt2xfhmuWHGwc4MMaXJAqIEE= -github.com/vmware-tanzu/carvel-ytt v0.40.0/go.mod h1:crDcKbS1GM4Q34puoVxdrajWOXrxjOxvUCwtsNV5Etc= -github.com/vmware-tanzu/tanzu-framework/packageclients v0.0.0-20220908202723-7a1ddb97efab h1:fhqTglwKorq5z6jfw4E8oeluECUe2hATwaB1MXyq27Y= -github.com/vmware-tanzu/tanzu-framework/packageclients v0.0.0-20220908202723-7a1ddb97efab/go.mod h1:If9r7cMkkw8E+HsOJe9PvZqykCgy1IuVZZpXeEldh7E= -github.com/vmware/govmomi v0.30.2 h1:zPMmLTtAfBgOVsTgwKOzVVahQIOC4A2oyFQFSsn/0ag= -github.com/vmware/govmomi v0.30.2/go.mod h1:F7adsVewLNHsW/IIm7ziFURaXDaHEwcc+ym4r3INMdY= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.5.1 h1:9nOVLGDfOaZ9R0tBumx/BcuqkbFpyTCU2r/Po7A2azI= -go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= -go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0= -go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= -go4.org/intern v0.0.0-20220617035311-6925f38cc365 h1:t9hFvR102YlOqU0fQn1wgwhNvSbHGBbbJxX9JKfU3l0= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180730214132-a0f8a16cb08c/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/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-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/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= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= -inet.af/netaddr v0.0.0-20220811202034-502d2d690317 h1:U2fwK6P2EqmopP/hFLTOAjWTki0qgd4GMJn5X8wOleU= -k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= -k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.4 h1:I5Y645gJ8zWKawyr78lVfDQkZrAViSbeRXsPZWTxmXk= -k8s.io/api v0.24.4/go.mod h1:42pVfA0NRxrtJhZQOvRSyZcJihzAdU59WBtTjYcB0/M= -k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= -k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= -k8s.io/apiextensions-apiserver v0.24.4 h1:w53Pm4zu8fCt9WfiRgS2YI6LE6I4NJ5aUi78GElD3K8= -k8s.io/apiextensions-apiserver v0.24.4/go.mod h1:iDK+Xb4jsPNnRGj5jU/WqqjLvt8363M7cKixKe1C9+U= -k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.4 h1:S0Ur3J/PbivTcL43EdSdPhqCqKla2NIuneNwZcTDeGQ= -k8s.io/apimachinery v0.24.4/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= -k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= -k8s.io/apiserver v0.24.4 h1:ei+OunC83pVEiagBeZhTnRZvkclHgpzs/rrm7aSBDYs= -k8s.io/apiserver v0.24.4/go.mod h1:mAuC3pZVc0IDXLx7lUHoisBOtBa1SobfLW/CI3klXQE= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= -k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.4 h1:hIAIJZIPyaw46AkxwyR0FRfM/pRxpUNTd3ysYu9vyRg= -k8s.io/client-go v0.24.4/go.mod h1:+AxlPWw/H6f+EJhRSjIeALaJT4tbeB/8g9BNvXGPd0Y= -k8s.io/cluster-bootstrap v0.24.4 h1:ZryK73DHK4dv5yAr5081yO03rrEK2Dz9jUtymqEle9Q= -k8s.io/cluster-bootstrap v0.24.4/go.mod h1:D9SYcEo302eah8yxFoPciGy8dRnReZr7fG+waTAvj14= -k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.4/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= -k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.4 h1:WEGRp06GBYVwxp5JdiRaJ1zkdOhrqucxRv/8IrABLG0= -k8s.io/component-base v0.24.4/go.mod h1:sWxkgcMfbYHadw0OJ0N+vIscd14/nqSIM2veCdg843o= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= -k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 h1:XmRqFcQlCy/lKRZ39j+RVpokYNroHPqV3mcBRfnhT5o= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2 h1:WjTt0uyUG+FJBodnrSzb1L3mHfkIgtgMnNQQ+NJMuT8= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2/go.mod h1:ZKM3W39Pl7uPuuB6mT/dWakgy1O8OcivGRCAZqSP+Hs= -sigs.k8s.io/cluster-api-provider-azure v1.6.1 h1:GpY9YLiUqovz4gwIEg2PRYOhJ5e/AG7sTHtoxzt6K4w= -sigs.k8s.io/cluster-api-provider-azure v1.6.1/go.mod h1:wM/V5BBRq+m5KCE9h5YVtMQ3qcIOsGBb7UDD/tXufko= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 h1:D0bDtSyRIcBmuGFyW65otEh+VIz8SGioaAjYok/cK5Y= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3/go.mod h1:EIWdG6qGX1iW0U5qiMi+EDQ9gmW7pylJwKDtHOkBQ6g= -sigs.k8s.io/cluster-api/test v1.2.8 h1:kYziHLSV+KqBoQXg7STGU4ZQpClayqIyw+BTYGx71uE= -sigs.k8s.io/cluster-api/test v1.2.8/go.mod h1:55r564Dm7/eO7LH76SRE8whfg4yUnsLz5akqqej4Q+8= -sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kind v0.15.0 h1:Fskj234L4hjQlsScCgeYvCBIRt06cjLzc7+kbr1u8Tg= -sigs.k8s.io/kind v0.15.0/go.mod h1:cKTqagdRyUQmihhBOd+7p43DpOPRn9rHsUC08K1Jbsk= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cmd/cli/plugin/managementcluster/import.go b/cmd/cli/plugin/managementcluster/import.go deleted file mode 100644 index 31d9f1af68..0000000000 --- a/cmd/cli/plugin/managementcluster/import.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - kerrors "k8s.io/apimachinery/pkg/util/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/command" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type importOptions struct { - file string -} - -var importOption = &importOptions{} - -// TODO: add integration tests -var importCmd = &cobra.Command{ - Use: "import", - Short: "Import Tanzu Kubernetes Grid management clusters", - Long: "Import Tanzu Kubernetes Grid management cluster from TKG settings file", - - Example: ` - # Import management cluster config from default config file - tanzu management-cluster import - - # Import management cluster config from custom config file - tanzu management-cluster import -f path/to/configfile.yaml`, - - RunE: func(cmd *cobra.Command, args []string) error { - return runImport(importOption.file) - }, - SilenceUsage: true, -} - -func init() { - importCmd.Flags().StringVarP(&importOption.file, "file", "f", "", "TKG settings file (default '$HOME/.tkg/config.yaml')") - - command.DeprecateCommand(importCmd, "1.5.0") -} - -func getOldTKGConfigDir() (string, error) { - homeDir, err := os.UserHomeDir() - if err != nil { - return "", errors.Wrap(err, "unable to get home directory") - } - return filepath.Join(homeDir, ".tkg"), nil -} - -func runImport(importFile string) error { - tkgConfigDir, err := getOldTKGConfigDir() - if err != nil { - return errors.Wrap(err, "unable to get default TKG config directory") - } - - tkgClient, err := tkgctl.New(tkgctl.Options{ - ConfigDir: tkgConfigDir, - SettingsFile: importFile, - LogOptions: tkgctl.LoggingOptions{Verbosity: logLevel, File: logFile}, - }) - if err != nil { - return errors.Wrap(err, "unable to create tkgctl client") - } - - regionManager, err := NewFactory().CreateManager("") - if err != nil { - return errors.Wrap(err, "unable to create region manager") - } - - return importRegions(tkgClient, regionManager) -} - -func importRegions(tkgClient tkgctl.TKGClient, regionManager region.Manager) error { - regions, err := tkgClient.GetRegions("") - if err != nil { - return errors.Wrap(err, "unable to get management cluster settings") - } - - if len(regions) == 0 { - fmt.Printf("No management cluster configurations detected, nothing to import\n") - return nil - } - - errList := []error{} - for _, region := range regions { - err := regionManager.SaveRegionContext(region) - if err != nil { - errList = append(errList, err) - } else { - fmt.Printf("successfully imported server: %v\n", region.ClusterName) - } - } - - err = kerrors.NewAggregate(errList) - if err != nil { - return errors.Wrap(err, "failed to import some servers") - } - - fmt.Printf("\nManagement cluster configuration imported successfully\n") - return nil -} diff --git a/cmd/cli/plugin/managementcluster/kubeconfig.go b/cmd/cli/plugin/managementcluster/kubeconfig.go deleted file mode 100644 index b5c848d965..0000000000 --- a/cmd/cli/plugin/managementcluster/kubeconfig.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" -) - -var clusterKubeconfigCmd = &cobra.Command{ - Use: "kubeconfig", - Short: "Kubeconfig of management cluster", - SilenceUsage: true, -} diff --git a/cmd/cli/plugin/managementcluster/kubeconfig_get.go b/cmd/cli/plugin/managementcluster/kubeconfig_get.go deleted file mode 100644 index 60fe21ed2e..0000000000 --- a/cmd/cli/plugin/managementcluster/kubeconfig_get.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "encoding/json" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - tkgclient "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - tkgutils "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - tkgauth "github.com/vmware-tanzu/tanzu-framework/tkg/auth" -) - -type getClusterKubeconfigOptions struct { - adminKubeconfig bool - exportFile string -} - -var getKCOptions = &getClusterKubeconfigOptions{} - -var getClusterKubeconfigCmd = &cobra.Command{ - Use: "get", - Short: "Get Kubeconfig of a management cluster", - Long: `Get Kubeconfig of a management cluster and merge the context into the default kubeconfig file`, - Example: ` - # Get management cluster kubeconfig - tanzu management-cluster kubeconfig get - - # Get management cluster admin kubeconfig - tanzu management-cluster kubeconfig get --admin`, - RunE: getKubeconfig, - SilenceUsage: true, -} - -func init() { - getClusterKubeconfigCmd.Flags().BoolVarP(&getKCOptions.adminKubeconfig, "admin", "", false, "Get admin kubeconfig of the management cluster") - getClusterKubeconfigCmd.Flags().StringVarP(&getKCOptions.exportFile, "export-file", "", "", "File path to export a standalone kubeconfig for management cluster") - - clusterKubeconfigCmd.AddCommand(getClusterKubeconfigCmd) -} - -func getKubeconfig(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("get management cluster kubeconfig with a global server is not implemented yet") - } - return getClusterKubeconfig(server) -} - -func getClusterKubeconfig(server *configapi.Server) error { - forceUpdateTKGCompatibilityImage := false - tkgctlClient, err := newTKGCtlClient(forceUpdateTKGCompatibilityImage) - if err != nil { - return err - } - - mcClustername, err := tkgutils.GetClusterNameFromKubeconfigAndContext(server.ManagementClusterOpts.Path, - server.ManagementClusterOpts.Context) - if err != nil { - return errors.Wrap(err, "failed to get management cluster name from kubeconfig") - } - - if getKCOptions.adminKubeconfig { - return getAdminKubeconfig(tkgctlClient, mcClustername) - } - return getPinnipedKubeconfig(tkgctlClient, mcClustername) -} - -func getAdminKubeconfig(tkgctlClient tkgctl.TKGClient, mcClustername string) error { - getClusterCredentialsOptions := tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: mcClustername, - Namespace: TKGSystemNamespace, - ExportFile: getKCOptions.exportFile, - } - return tkgctlClient.GetCredentials(getClusterCredentialsOptions) -} - -func getPinnipedKubeconfig(tkgctlClient tkgctl.TKGClient, mcClustername string) error { - getClusterPinnipedInfoOptions := tkgctl.GetClusterPinnipedInfoOptions{ - ClusterName: mcClustername, - Namespace: TKGSystemNamespace, - IsManagementCluster: true, - } - - clusterPinnipedInfo, err := tkgctlClient.GetClusterPinnipedInfo(getClusterPinnipedInfoOptions) - if err != nil { - return err - } - - // for management cluster the audience would be set to IssuerURL - audience := clusterPinnipedInfo.PinnipedInfo.Issuer - - kubeconfig, _ := tkgauth.GetPinnipedKubeconfig(clusterPinnipedInfo.ClusterInfo, clusterPinnipedInfo.PinnipedInfo, - clusterPinnipedInfo.ClusterName, audience) - - kubeconfigbytes, err := json.Marshal(kubeconfig) - if err != nil { - return errors.Wrap(err, "unable to marshall the kubeconfig") - } - err = tkgclient.MergeKubeConfigWithoutSwitchContext(kubeconfigbytes, getKCOptions.exportFile) - if err != nil { - return errors.Wrap(err, "unable to merge cluster kubeconfig into the current kubeconfig path") - } - - if getKCOptions.exportFile != "" { - log.Infof("You can now access the cluster by specifying '--kubeconfig %s' flag when using `kubectl` command \n", getKCOptions.exportFile) - } else { - log.Infof("You can now access the cluster by running 'kubectl config use-context %s'\n", kubeconfig.CurrentContext) - } - return nil -} diff --git a/cmd/cli/plugin/managementcluster/main.go b/cmd/cli/plugin/managementcluster/main.go deleted file mode 100644 index 31483f60e3..0000000000 --- a/cmd/cli/plugin/managementcluster/main.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "management-cluster", - Description: "Kubernetes management cluster operations", - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, - Group: cliapi.RunCmdGroup, - Aliases: []string{"mc", "management-clusters"}, - DefaultFeatureFlags: DefaultFeatureFlagsForManagementClusterPlugin, - PostInstallHook: postInstallHook, -} - -var ( - logLevel int32 - logFile string - outputFormat string -) - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - - p.Cmd.PersistentFlags().Int32VarP(&logLevel, "verbose", "v", 0, "Number for the log level verbosity(0-9)") - p.Cmd.PersistentFlags().StringVar(&logFile, "log-file", "", "Log file path") - - p.AddCommands( - createCmd, - deleteRegionCmd, - upgradeRegionCmd, - credentialsCmd, - ceipCmd, - getClusterCmd, - permissionsCmd, - importCmd, - clusterKubeconfigCmd, - osImageCmd, - ) - - if err = p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/cmd/cli/plugin/managementcluster/osimage.go b/cmd/cli/plugin/managementcluster/osimage.go deleted file mode 100644 index d9bfd485e1..0000000000 --- a/cmd/cli/plugin/managementcluster/osimage.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" -) - -var osImageCmd = &cobra.Command{ - Use: "osimage", - Short: "Tanzu TKR image operations for Kubernetes nodes.", - Long: "Tanzu TKR image operations for Kubernetes nodes. This command serves as a temporary workaround" + - "for the Bring-Your-Own-Image feature. It imports the image from a public url, into the specified infrastructure" + - "account / compartment. It also alters the TKR and adds OSImage that represented the imported image.", -} - -var ( - // the input tkr package image path - // with tag, for example projects-stg.registry.vmware.com/tkg/tkr-oci:v1.23.5 - tkrRegistryPath string - // the output tkr path - outputDirectory string -) - -func init() { - osImageCmd.PersistentFlags().StringVar(&tkrRegistryPath, "tkr-path", "", "The input tkr package image path") - osImageCmd.PersistentFlags().StringVarP(&outputDirectory, "output-directory", "d", "", "The output TKR path") - osImageCmd.AddCommand(oracleCmd) -} diff --git a/cmd/cli/plugin/managementcluster/osimage_oracle.go b/cmd/cli/plugin/managementcluster/osimage_oracle.go deleted file mode 100644 index c69f93edcb..0000000000 --- a/cmd/cli/plugin/managementcluster/osimage_oracle.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "fmt" - "os" - "path" - "path/filepath" - - "github.com/aunum/log" - "github.com/spf13/cobra" - "golang.org/x/sync/errgroup" - "k8s.io/apimachinery/pkg/runtime" - k8sjson "k8s.io/apimachinery/pkg/runtime/serializer/json" - utilyaml "k8s.io/apimachinery/pkg/util/yaml" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/carvelhelpers" - "github.com/vmware-tanzu/tanzu-framework/tkg/oracle" -) - -var oracleCmd = &cobra.Command{ - Use: "oracle", - Short: "TKR OS image operations for Oracle Cloud Infrastructure", -} - -var ( - // OCID of the destination OCI compartment to import the public image into - compartmentID string -) - -var oraclePopulate = &cobra.Command{ - Use: "populate", - Short: "populate public OS Image specified in TKR to private OCI compartment and region", - Example: ` - # Import a public image to the specified OCI compartment and region - tanzu management-cluster osimage oracle populate --tkr-path projects-stg.registry.vmware.com/tkg/tkr-oci:v1.23.5 \ - --compartment --output-directory `, - Run: ociPopulateCmdInitRun, -} - -func init() { - oraclePopulate.PersistentFlags().StringVar(&compartmentID, "compartment", "", "The destination OCI compartment to import the public image into") - - oracleCmd.AddCommand(oraclePopulate) -} - -// writeToFile writes a Kubernetes runtime.Object to the file, given its paths -func writeToFile(object runtime.Object, osImagePath string) error { - serializer := k8sjson.NewSerializerWithOptions( - k8sjson.DefaultMetaFactory, nil, nil, - k8sjson.SerializerOptions{ - Yaml: true, - Pretty: true, - Strict: true, - }, - ) - file, err := os.OpenFile(osImagePath, os.O_CREATE|os.O_WRONLY, os.ModePerm) - if err != nil { - return err - } - defer file.Close() - if err := serializer.Encode(object, file); err != nil { - return err - } - return nil -} - -// getTKRFromManifest reads the TanzuKubernetesRelease from its yaml manifest given path -func getTKRFromManifest(tkrPath string) (*v1alpha3.TanzuKubernetesRelease, error) { - var tkr v1alpha3.TanzuKubernetesRelease - tkrFile, err := os.Open(tkrPath) - if err != nil { - return nil, err - } - defer tkrFile.Close() - if err := utilyaml.NewYAMLOrJSONDecoder(tkrFile, 100).Decode(&tkr); err != nil { - return nil, err - } - return &tkr, nil -} - -// getOSImageFromManifest reads the OSImage from its yaml manifest given path -func getOSImageFromManifest(osImageFilePath string) (*v1alpha3.OSImage, error) { - var osImage v1alpha3.OSImage - osImageFile, err := os.Open(osImageFilePath) - if err != nil { - return nil, err - } - defer osImageFile.Close() - if err := utilyaml.NewYAMLOrJSONDecoder(osImageFile, 100).Decode(&osImage); err != nil { - return nil, err - } - return &osImage, nil -} - -// validateOSImage checks if the os image is a valid oracle os image -func validateOSImage(osImage *v1alpha3.OSImage) (string, bool) { - if osImage.Spec.Image.Type != "oci" { - log.Infof("skip patching image %s, image type is %s, not 'oci'", osImage.Spec.Image.Type) - return "", false - } - mapRef := osImage.Spec.Image.Ref - imageURL, exists := mapRef["imageURL"] - if !exists { - log.Infof("skip patching image %s, image ref does not contains key 'imageURL'") - return "", false - } - imageURLStr, ok := imageURL.(string) - if !ok { - log.Infof("skip patching image %s, image ref value of key 'imageURL' is not a string") - return "", false - } - return imageURLStr, true -} - -// TKRPath returns the absolute path for the TKR manifest -func TKRPath() string { - // default TKR manifest file name in the bundle - tkrFileName := "TanzuKubernetesRelease.yml" - return filepath.Join(outputDirectory, "config", tkrFileName) -} - -// OSImagePath returns the absolute path for the OSImage manifest to create, provided its name -func OSImagePath(name string) string { - return filepath.Join(outputDirectory, "config", fmt.Sprintf("OSImage-%s.yml", name)) -} - -func ociPopulateCmdInitRun(_ *cobra.Command, _ []string) { - var err error - - // download TKR bundle and load the TKR resource - if outputDirectory == "" { - outputDirectory, err = os.MkdirTemp("", "oci_image") - if err != nil { - log.Fatalf("unable to create a temporary directory: %v", err) - } - } - if err = carvelhelpers.DownloadImageBundleAndSaveFilesToDir(tkrRegistryPath, outputDirectory); err != nil { - log.Fatalf("unable to fetch TKR package image from %s: %v", tkrRegistryPath, err.Error()) - } - log.Infof("downloaded TKR from %s to %s", tkrRegistryPath, outputDirectory) - - if err := os.RemoveAll(path.Join(outputDirectory, ".imgpkg")); err != nil { - log.Fatalf("unable to remove .imgpkg folder from %s: %v", outputDirectory, err.Error()) - } - log.Infof("removed .imgpkg folder from %s if exists", outputDirectory) - - tkr, err := getTKRFromManifest(TKRPath()) - if err != nil { - log.Fatalf("unable to read TKR package image from %s: %v", TKRPath(), err.Error()) - } - - // import the BYOI image from the public endpoint to user's compartment - oracleClient, err := oracle.New() - if err != nil { - log.Fatalf("unable to get Oracle client: %v", err) - } - region, err := oracleClient.Region() - if err != nil { - log.Fatal("unable to determine region from OCI config provider") - } - ctx := context.Background() - _, err = oracleClient.EnsureCompartmentExists(ctx, compartmentID) - if err != nil { - log.Fatalf("unable to get compartment %s or not exists: %v", compartmentID, err.Error()) - } - log.Infof("destination compartment %s exists", compartmentID) - - var waitGroup errgroup.Group - for _, osImageRef := range tkr.Spec.OSImages { - name := osImageRef.Name - waitGroup.Go(func() error { - osImage, err := getOSImageFromManifest(OSImagePath(name)) - if err != nil { - return err - } - imageURLStr, valid := validateOSImage(osImage) - if !valid { - return nil - } - image, err := oracleClient.ImportImageSync(ctx, name, compartmentID, imageURLStr) - if err != nil { - return err - } - log.Infof("finish importing image %s, ocid is %s", name, *image.Id) - - newOSImage := osImage.DeepCopy() - newOSImage.Spec.Image.Ref["compartment"] = compartmentID - newOSImage.Spec.Image.Ref["id"] = *image.Id - newOSImage.Spec.Image.Ref["region"] = region - if err := writeToFile(newOSImage, OSImagePath(name)); err != nil { - log.Infof("failed to patch OSImage %s: %v", name, err) - return err - } - return nil - }) - } - if err := waitGroup.Wait(); err != nil { - log.Fatal(err) - } - log.Infof("TKR has been patched! To consume, \n\t\t tanzu management-cluster create -f .yaml --additional-tkg-system-manifests %s", outputDirectory) -} diff --git a/cmd/cli/plugin/managementcluster/permissions.go b/cmd/cli/plugin/managementcluster/permissions.go deleted file mode 100644 index 9a4da4b158..0000000000 --- a/cmd/cli/plugin/managementcluster/permissions.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import "github.com/spf13/cobra" - -var permissionsCmd = &cobra.Command{ - Use: "permissions", - Short: "Configure permissions on cloud providers", - SilenceUsage: true, -} - -var awsPermissionsCmd = &cobra.Command{ - Use: "aws", - Short: "Configure permissions on AWS", - SilenceUsage: true, -} - -func init() { - permissionsCmd.AddCommand(awsPermissionsCmd) -} diff --git a/cmd/cli/plugin/managementcluster/permissions_aws_generate.go b/cmd/cli/plugin/managementcluster/permissions_aws_generate.go deleted file mode 100644 index 0ff6048654..0000000000 --- a/cmd/cli/plugin/managementcluster/permissions_aws_generate.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -var generateAWSCloudFormationTemplateCmd = &cobra.Command{ - Use: "generate-cloudformation-template", - Short: "Generate AWS CloudFormation Template", - Long: `Generate AWS CloudFormation Template`, - RunE: generateCloudFormationTemplate, - SilenceUsage: true, -} - -func init() { - generateAWSCloudFormationTemplateCmd.Flags().StringVarP(&setAWSPermissionsOps.clusterConfigFile, "file", "f", "", "Optional, configuration file from which to read the aws credentials. Falls back to using the default AWS credentials chain if not provided.") - awsPermissionsCmd.AddCommand(generateAWSCloudFormationTemplateCmd) -} - -func generateCloudFormationTemplate(cmd *cobra.Command, args []string) error { - forceUpdateTKGCompatibilityImage := false - tkgctlClient, err := newTKGCtlClient(forceUpdateTKGCompatibilityImage) - if err != nil { - return err - } - template, err := tkgctlClient.GenerateAWSCloudFormationTemplate(setAWSPermissionsOps.clusterConfigFile) - if err != nil { - return err - } - fmt.Println(template) - return nil -} diff --git a/cmd/cli/plugin/managementcluster/permissions_aws_set.go b/cmd/cli/plugin/managementcluster/permissions_aws_set.go deleted file mode 100644 index 0021726a78..0000000000 --- a/cmd/cli/plugin/managementcluster/permissions_aws_set.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" -) - -var setAWSPermissionsCmd = &cobra.Command{ - Use: "set", - Short: "Configure permissions on AWS", - Long: `Configure permissions on AWS`, - RunE: setAWSPermissions, - SilenceUsage: true, -} - -type awsPermissionsOptions struct { - clusterConfigFile string -} - -var setAWSPermissionsOps awsPermissionsOptions - -func init() { - setAWSPermissionsCmd.Flags().StringVarP(&setAWSPermissionsOps.clusterConfigFile, "file", "f", "", "Optional, configuration file from which to read the aws credentials. Falls back to using the default AWS credentials chain if not provided.") - awsPermissionsCmd.AddCommand(setAWSPermissionsCmd) -} - -func setAWSPermissions(cmd *cobra.Command, args []string) error { - forceUpdateTKGCompatibilityImage := false - tkgctlClient, err := newTKGCtlClient(forceUpdateTKGCompatibilityImage) - if err != nil { - return err - } - return tkgctlClient.CreateAWSCloudFormationStack(setAWSPermissionsOps.clusterConfigFile) -} diff --git a/cmd/cli/plugin/managementcluster/post_install_hook.go b/cmd/cli/plugin/managementcluster/post_install_hook.go deleted file mode 100644 index 7b3112c399..0000000000 --- a/cmd/cli/plugin/managementcluster/post_install_hook.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -func postInstallHook() error { - // Creating a tkgctl client in turn initializes the TKG configuration in the tanzu config directory. - forceUpdateTKGCompatibilityImage := true - _, err := newTKGCtlClient(forceUpdateTKGCompatibilityImage) - return err -} diff --git a/cmd/cli/plugin/managementcluster/region_manager.go b/cmd/cli/plugin/managementcluster/region_manager.go deleted file mode 100644 index cfcefb7966..0000000000 --- a/cmd/cli/plugin/managementcluster/region_manager.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -type tanzuRegionManager struct { -} - -type tanzuRegionManagerFactory struct { -} - -// NewFactory creates a new tanzuRegionManagerFactory which implements -// region.ManagerFactory -func NewFactory() region.ManagerFactory { - return &tanzuRegionManagerFactory{} -} - -func (trm *tanzuRegionManager) ListRegionContexts() ([]region.RegionContext, error) { - tanzuConfig, err := config.GetClientConfig() - if err != nil { - return []region.RegionContext{}, err - } - - var regionClusters []region.RegionContext - for _, server := range tanzuConfig.KnownServers { - if server.Type == configapi.ManagementClusterServerType { - regionContext := convertServerToRegionContextFull(server, - server.Name == tanzuConfig.CurrentServer) - - regionClusters = append(regionClusters, regionContext) - } - } - - return regionClusters, nil -} - -func (trm *tanzuRegionManager) SaveRegionContext(regionCtxt region.RegionContext) error { - return config.AddServer(convertRegionContextToServer(regionCtxt), false) -} - -func (trm *tanzuRegionManager) UpsertRegionContext(regionCtxt region.RegionContext) error { - return config.PutServer(convertRegionContextToServer(regionCtxt), false) -} - -func (trm *tanzuRegionManager) DeleteRegionContext(clusterName string) error { - currentServer, err := config.GetCurrentServer() - if err != nil { - return err - } - - if clusterName != "" && clusterName != currentServer.Name { - return fmt.Errorf("cannot delete cluster %s, it is not the current cluster", clusterName) - } - - if err := config.RemoveServer(currentServer.Name); err != nil { - return err - } - - return nil -} - -func (trm *tanzuRegionManager) SetCurrentContext(clusterName, contextName string) error { - return config.SetCurrentServer(clusterName) -} - -func (trm *tanzuRegionManager) GetCurrentContext() (region.RegionContext, error) { - currentServer, err := config.GetCurrentServer() - if err != nil { - return region.RegionContext{}, err - } - - if !currentServer.IsManagementCluster() { - return region.RegionContext{}, errors.Errorf("The current server is not a management cluster") - } - - return convertServerToRegionContext(currentServer), nil -} - -func (trmf *tanzuRegionManagerFactory) CreateManager(configFile string) (region.Manager, error) { - return &tanzuRegionManager{}, nil -} - -func convertServerToRegionContext(server *configapi.Server) region.RegionContext { - return convertServerToRegionContextFull(server, false) -} - -func convertServerToRegionContextFull(server *configapi.Server, isCurrentContext bool) region.RegionContext { - return region.RegionContext{ - ClusterName: server.Name, - ContextName: server.ManagementClusterOpts.Context, - SourceFilePath: server.ManagementClusterOpts.Path, - IsCurrentContext: isCurrentContext, - } -} - -func convertRegionContextToServer(regionContext region.RegionContext) *configapi.Server { - return &configapi.Server{ - Name: regionContext.ClusterName, - Type: configapi.ManagementClusterServerType, - ManagementClusterOpts: &configapi.ManagementClusterServer{ - Path: regionContext.SourceFilePath, - Context: regionContext.ContextName, - }, - } -} diff --git a/cmd/cli/plugin/managementcluster/set_ceip.go b/cmd/cli/plugin/managementcluster/set_ceip.go deleted file mode 100644 index dbc568cc34..0000000000 --- a/cmd/cli/plugin/managementcluster/set_ceip.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" -) - -var isProd string -var labels string - -var setCeipCmd = &cobra.Command{ - Use: "set OPT_IN_BOOL", - Short: "Set the opt-in preference for CEIP", - Long: "Set the opt-in preference for CEIP of the current management cluster", - Args: cobra.ExactArgs(1), - RunE: runSetCeip, - SilenceUsage: true, -} - -func init() { - setCeipCmd.Flags().StringVarP(&isProd, "isProd", "", "", "use --isProd false to write telemetry data to the staging datastore") - setCeipCmd.Flags().MarkHidden("isProd") //nolint - setCeipCmd.Flags().StringVarP(&labels, "labels", "", "", "use --labels=entitlement-account-number=\"num1\",env-type=\"env\" to self-identify the customer's account number and environment") - ceipCmd.AddCommand(setCeipCmd) -} - -func runSetCeip(cmd *cobra.Command, args []string) error { - forceUpdateTKGCompatibilityImage := false - tkgClient, err := newTKGCtlClient(forceUpdateTKGCompatibilityImage) - if err != nil { - return err - } - - return tkgClient.SetCeip(args[0], isProd, labels) -} diff --git a/cmd/cli/plugin/managementcluster/test/main.go b/cmd/cli/plugin/managementcluster/test/main.go deleted file mode 100644 index 0245f4bea4..0000000000 --- a/cmd/cli/plugin/managementcluster/test/main.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("management-cluster") - -func main() { - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - if err := Cleanup(); err != nil { - return err - } - return nil -} - -// Cleanup the test. -func Cleanup() error { - return nil -} diff --git a/cmd/cli/plugin/managementcluster/upgrade.go b/cmd/cli/plugin/managementcluster/upgrade.go deleted file mode 100644 index 1f40ab71cd..0000000000 --- a/cmd/cli/plugin/managementcluster/upgrade.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "time" - - "github.com/spf13/cobra" - - cliconfig "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/config" - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -// upgradeRegionCmd represents the upgrade command -var upgradeRegionCmd = &cobra.Command{ - Use: "upgrade", - Short: "Upgrades the management cluster", - Args: cobra.MaximumNArgs(1), // TODO: deprecate version of command that takes args - Example: ` - # Upgrade a management cluster - tanzu management-cluster upgrade - - # Upgrade a management cluster using specific os name (vsphere) - tanzu management-cluster upgrade mc-1 --os-name photon - - # Upgrade a management cluster using specific os name and version - tanzu management-cluster upgrade mc-1 --os-name ubuntu --os-version 20.04 - - # Upgrade a management cluster using specific os name, version and arch - tanzu management-cluster upgrade mc-1 --os-name ubuntu --os-version 20.04 --os-arch amd64 - - [+] : Options available for: os-name, os-version, os-arch are as follows: - vSphere: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name photon --os-version 3 --os-arch amd64 - aws: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name amazon --os-version 2 --os-arch amd64 - azure: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name ubuntu --os-version 18.04 --os-arch amd64 -`, - RunE: func(cmd *cobra.Command, args []string) error { - return runForCurrentMC(runUpgradeRegion) - }, - SilenceUsage: true, -} - -type upgradeRegionOptions struct { - vSphereTemplateName string - timeout time.Duration - unattended bool - osName string - osVersion string - osArch string -} - -var ur = &upgradeRegionOptions{} - -func init() { - upgradeRegionCmd.Flags().StringVarP(&ur.vSphereTemplateName, "vsphere-vm-template-name", "", "", "The vSphere VM template to be used with upgraded kubernetes version. Discovered automatically if not provided") - upgradeRegionCmd.Flags().MarkHidden("vsphere-vm-template-name") //nolint - - upgradeRegionCmd.Flags().DurationVarP(&ur.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") - upgradeRegionCmd.Flags().BoolVarP(&ur.unattended, "yes", "y", false, "Upgrade management cluster without asking for confirmation") - upgradeRegionCmd.Flags().StringVar(&ur.osName, "os-name", "", "OS name to use during management cluster upgrade. Discovered automatically if not provided (See [+])") - upgradeRegionCmd.Flags().StringVar(&ur.osVersion, "os-version", "", "OS version to use during management cluster upgrade. Discovered automatically if not provided (See [+])") - upgradeRegionCmd.Flags().StringVar(&ur.osArch, "os-arch", "", "OS arch to use during management cluster upgrade. Discovered automatically if not provided (See [+])") -} - -func runUpgradeRegion(server *configapi.Server) error { - forceUpdateTKGCompatibilityImage := false - tkgClient, err := newTKGCtlClient(forceUpdateTKGCompatibilityImage) - if err != nil { - return err - } - - edition, err := config.GetEdition() - if err != nil { - return err - } - - options := tkgctl.UpgradeRegionOptions{ - ClusterName: server.Name, - VSphereTemplateName: ur.vSphereTemplateName, - SkipPrompt: ur.unattended, - Timeout: ur.timeout, - OSName: ur.osName, - OSVersion: ur.osVersion, - OSArch: ur.osArch, - Edition: edition, - } - - err = tkgClient.UpgradeRegion(options) - if err != nil { - return err - } - - // Sync plugins if management-cluster upgrade is successful - if config.IsFeatureActivated(cliconfig.FeatureContextAwareCLIForPlugins) { - err = pluginmanager.SyncPlugins() - if err != nil { - log.Warningf("unable to sync plugins after management cluster upgrade. Please run `tanzu plugin sync` command manually to install/update plugins") - } - } - - return nil -} diff --git a/cmd/cli/plugin/package/README.md b/cmd/cli/plugin/package/README.md deleted file mode 100644 index e2a4a72298..0000000000 --- a/cmd/cli/plugin/package/README.md +++ /dev/null @@ -1,396 +0,0 @@ -# Package - -Manage package lifecycle operations. - -## Usage - -Package and Repository Operations ( Subject to Change ): - -```sh ->>> tanzu package --help -Tanzu package management - -Usage: - tanzu package [command] - -Available Commands: - available Manage available packages - install Install a package - installed Manage installed packages - repository Manage registered package repositories - - -Flags: - -h, --help help for package - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -Use "tanzu package [command] --help" for more information about a command. -``` - -```sh ->>> tanzu package repository --help -Add, list, get or delete a repository for tanzu packages - -Usage: - tanzu package repository [command] - -Available Commands: - add Add a repository - delete Delete a repository - get Get repository status - list List repository - update Update a repository - -Flags: - -h, --help help for repository - -Global Flags: - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) - -Use "tanzu package repository [command] --help" for more information about a command. -``` - -## Test - -1. Create a management cluster using latest tanzu cli - -2. Use package commands to: - * add a repository - * list a repository - * get a repository status - * list packages - * get a package information - * get an installed package information - * update a package - * delete a repository - - Use the following image package bundles for testing: - - | S.no | Repository URL | - | :----| :------------------------------------------------------------------------| - | 1. | projects-stg.registry.vmware.com/tkg/test-packages/test-repo:v1.0.0 | - | 2. | projects-stg.registry.vmware.com/tkg/test-packages/standard-repo:v1.0.0 | - - Here is an example workflow - -3. Add a repository - - ```sh - >>> tanzu package repository add standard-repo --url projects-stg.registry.vmware.com/tkg/test-packages/standard-repo:v1.0.0 -n test-ns --create-namespace - Added package repository 'standard-repo' - ``` - -4. Get repository status - - ```sh - >>> tanzu package repository get standard-repo -n test-ns - NAME: standard-repo - VERSION: 88984 - REPOSITORY: projects-stg.registry.vmware.com/tkg/test-packages/standard-repo:v1.0.0 - STATUS: Reconcile succeeded - REASON: - ``` - -5. Update a repository - - ```sh - >>> tanzu package repository update standard-repo --url projects-stg.registry.vmware.com/tkg/test-packages/standard-repo:v1.0.0 -n test-ns - Updated package repository 'standard-repo' in namespace 'test-ns' - ``` - -6. List the repository - - ```sh - >>> tanzu package repository list -A - NAME REPOSITORY STATUS DETAILS NAMESPACE - standard-repo projects-stg.registry.vmware.com/tkg/test-packages/standard-repo:v1.0.0 Reconcile succeeded test-ns - repo projects-stg.registry.vmware.com/tkg/test-packages/test-repo:v1.0.0 Reconcile succeeded test-ns - ``` - -7. Get information of a package - - Example 1: Get detailed information of a package - - ```sh - >>> tanzu package available get contour.tanzu.vmware.com/1.15.1+vmware.1-tkg.1 --namespace test-ns - / Retrieving package details for contour.tanzu.vmware.com/1.15.1+vmware.1-tkg.1... - NAME: contour.tanzu.vmware.com - VERSION: 1.15.1+vmware.1-tkg.1 - RELEASED-AT: - DISPLAY-NAME: contour - SHORT-DESCRIPTION: This package provides ingress functionality. - PACKAGE-PROVIDER: - MINIMUM-CAPACITY-REQUIREMENTS: - LONG-DESCRIPTION: This package provides ingress functionality. - MAINTAINERS: [] - RELEASE-NOTES: - LICENSE: [] - ``` - - Example 2: Get openAPI schema of a package - - ```sh - >>> tanzu package available get external-dns.tanzu.vmware.com/0.8.0+vmware.1-tkg.1 -n external-dns --values-schema - KEY DEFAULT TYPE DESCRIPTION - deployment.args array List of arguments passed via command-line to external-dns. - For more guidance on configuration options for your - desired DNS provider, consult the ExternalDNS docs at - https://github.com/kubernetes-sigs/external-dns#running-externaldns - - deployment.env array List of environment variables to set in the external-dns container. - deployment.securityContext SecurityContext defines the security options the external-dns container should be run with. More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ - deployment.volumeMounts array Pod volumes to mount into the external-dns container's filesystem. - deployment.volumes array List of volumes that can be mounted by containers belonging to the external-dns pod. More info: https://kubernetes.io/docs/concepts/storage/volumes - namespace external-dns string The namespace in which to deploy ExternalDNS. - ``` - - Example 3: Generate default values.yaml for a package - - ```sh - >>> tanzu package available get contour.tanzu.vmware.com/1.18.2+vmware.1-tkg.1-rc.1 --generate-default-values-file - NAME: contour.tanzu.vmware.com - VERSION: 1.18.2+vmware.1-tkg.1-rc.1 - RELEASED-AT: 2021-10-04 17:00:00 -0700 PDT - DISPLAY-NAME: contour - SHORT-DESCRIPTION: An ingress controller - PACKAGE-PROVIDER: VMware - MINIMUM-CAPACITY-REQUIREMENTS: Varies significantly based on number of Services, Ingresses/HTTPProxies, etc. A starting point is 128MB RAM and 0.5 CPU for each Contour and Envoy pod, but this can and should be tuned based on observed usage. - LONG-DESCRIPTION: An Envoy-based ingress controller that supports dynamic configuration updates and multi-team ingress delegation. See https://projectcontour.io for more information. - MAINTAINERS: [{Steve Kriss} {Steve Sloka} {Nick Young} {Sunjay Bhatia} {Nicholas Seemiller}] - RELEASE-NOTES: contour 1.18.2 https://github.com/projectcontour/contour/releases/tag/v1.18.2 - LICENSE: [VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)] - SUPPORT: Support provided by VMware for deployment on TKG 1.4+ clusters. Best-effort support for deployment on any conformant Kubernetes cluster. Contact support by opening a support request via VMware Cloud Services or my.vmware.com. - CATEGORY: [ingress] - - Created default values file at /home/contour-default-values.yaml - ``` - - contour-default-values.yaml - - ```yaml - certificates: - duration: 8760h - renewBefore: 360h - contour: - logLevel: info - replicas: 2 - useProxyProtocol: false - envoy: - hostNetwork: false - hostPorts: - enable: true - http: 80 - https: 443 - logLevel: info - service: - aws: - LBType: classic - externalTrafficPolicy: Cluster - terminationGracePeriodSeconds: 300 - namespace: tanzu-system-ingress - ``` - -8. Install a package - - Example 1: Install the specified version for package name "fluent-bit.tkg-standard.tanzu.vmware", while providing the values.yaml file and without waiting for package reconciliation to complete - - ```sh - - >>> tanzu package install fluentbit --package-name fluent-bit.tanzu.vmware.com --namespace test-ns --create-namespace --version 1.7.5+vmware.1-tkg.1 --values-file values.yaml --wait=false - \ Installing package 'fluent-bit.tanzu.vmware.com' - | Getting package metadata for fluent-bit.tanzu.vmware.com - / Creating service account 'fluentbit-test-ns-sa' - - - Creating cluster role binding 'fluentbit-test-ns-cluster-rolebinding' - - Added installed package 'fluentbit' in namespace 'test-ns' - ``` - - An example values.yaml is as follows: - - ```yaml - fluent_bit: - config: - outputs: | - [OUTPUT] - Name stdout - Match * - ``` - - Example 2: Install the latest version for package name "contour.tanzu.vmware.com". If the namespace does not exist beforehand, it gets created. - - ```sh - >>> tanzu package install contour-pkg --package-name contour.tanzu.vmware.com --namespace test-ns --version 1.15.1+vmware.1-tkg.1 - \ Installing package 'contour.tanzu.vmware.com' - / Getting package metadata for contour.tanzu.vmware.com - - - Creating cluster admin role 'contour-pkg-test-ns-cluster-role' - - / Creating package resource - / Package install status: Reconciling - - Added installed package 'contour-pkg' in namespace 'test-ns' - ``` - -9. Get information of an installed package - - Example 1: Get information of an installed package - - ```sh - >>> tanzu package installed get contour-pkg --namespace test-ns - NAME: contour.tanzu.vmware.com - PACKAGE-NAME: contour-pkg - PACKAGE-VERSION: 1.15.1+vmware.1-tkg.1 - STATUS: Reconcile succeeded - CONDITIONS: - USEFUL-ERROR-MESSAGE: - ``` - - Example 2: Get data value secret of an installed package and save it to file (example: config.yaml) - - ```sh - >>> tanzu package installed get fluent-bit --namespace test-ns --values-file config.yaml - / Retrieving installation details for myfb... - - cat config.yaml - fluent_bit: - config: - outputs: | - [OUTPUT] - Name stdout - Match * - ``` - -10. Update a package - - Example 1: Update a package with different version - - ```sh - >>> tanzu package installed update mypkg --version 3.0.0-rc.1 --namespace test-ns - | Updating package 'mypkg' - / Getting package install for 'mypkg' - - Getting package metadata for 'pkg.test.carvel.dev' - - Updated package install 'mypkg' in namespace 'test-ns' - ``` - - Example 2: Update a package which is not installed - - ```sh - >>> tanzu package installed update fluent-bit --package-name fluent-bit.tanzu.vmware.com --version 1.7.5+vmware.1-tkg.1 --namespace test-ns --install - / Getting package install for 'fluent-bit' - - - Getting package metadata for fluent-bit.tanzu.vmware.com - \ Creating service account 'fluent-bit-test-ns-sa' - - | Creating cluster role binding 'fluent-bit-test-ns-cluster-rolebinding' - - Creating package resource - \ Package install status: Reconciling - - Updated package install 'fluent-bit' in namespace 'test-ns' - ``` - - Example 3: Update an installed package with providing values.yaml file - - ```sh - >>> tanzu package installed update fluent-bit --version 1.7.5+vmware.1-tkg.1 --namespace test-ns --values-file values.yaml - | Updating package 'fluent-bit' - | Getting package install for 'fluent-bit' - / Updating secret 'fluent-bit-test-ns-values' - - Updated package install 'fluent-bit' in namespace 'test-ns' - ``` - - An example values.yaml is as follows: - - ```yaml - fluent_bit: - config: - outputs: | - [OUTPUT] - Name stdout - Match / - ``` - -11. Uninstall a package - - ```sh - >>> tanzu package installed delete contour-pkg --namespace test-ns - | Uninstalling package 'contour-pkg' from namespace 'test-ns' - - Getting package install for 'contour-pkg' - - Deleting package install 'contour-pkg' from namespace 'test-ns' - | Package uninstall status: Deleting - / Deleting service account 'contour-pkg-test-ns-sa' - - - Uninstalled package 'contour-pkg' from namespace 'test-ns' - ``` - -12. List the packages - - ```sh - #List installed packages in the default namespace - >>> tanzu package installed list - NAME DISPLAY-NAME SHORT-DESCRIPTION - - #List installed packages across all namespaces - >>> tanzu package installed list -A - - Retrieving installed packages... - NAME PACKAGE-NAME PACKAGE-VERSION STATUS NAMESPACE - contour-pkg contour.tanzu.vmware.com 1.15.1+vmware.1-tkg.1 Reconcile succeeded test-ns - mypkg pkg.test.carvel.dev 2.0.0 Reconcile succeeded test-ns - - - #List installed packages in user provided namespace - >>> tanzu package installed list --namespace test-ns - / Retrieving installed packages... - NAME PACKAGE-NAME PACKAGE-VERSION STATUS - contour-pkg contour.tanzu.vmware.com 1.15.1+vmware.1-tkg.1 Reconcile succeeded - mypkg pkg.test.carvel.dev 2.0.0 Reconcile succeeded - - #List all available package CRs in default namespace - >>> tanzu package available list - / Retrieving available packages... - NAME DISPLAY-NAME SHORT-DESCRIPTION - - #List all available package CRs across all namespace - >>> tanzu package available list -A - | Retrieving available packages... - NAME DISPLAY-NAME SHORT-DESCRIPTION NAMESPACE - harbor.tanzu.vmware.com harbor This package provides cloud native container registry service. test-ns - pkg.test.carvel.dev Test Package in repo Package used for testing test-ns - prometheus.tanzu.vmware.com prometheus This package provides an open-source systems monitoring and alerting toolkit test-ns - external-dns.tanzu.vmware.com external-dns This package provides DNS synchronization functionality. test-ns - fluent-bit.tanzu.vmware.com fluent-bit This package provides log shipping functionality. test-ns - grafana.tanzu.vmware.com grafana This package allows you to visualize and analyze metrics data test-ns - multus-cni.tanzu.vmware.com multus-cni This package provides ability for attaching multiple network interfaces to the pod. test-ns - cert-manager.tanzu.vmware.com cert-manager This package provides certificate management functionality. test-ns - contour.tanzu.vmware.com contour This package provides ingress functionality. test-ns - - #List all available packages for package name - >>> tanzu package available list contour.tanzu.vmware.com -A - / Retrieving package versions for contour.tanzu.vmware.com... - NAME VERSION RELEASED-AT NAMESPACE - contour.tanzu.vmware.com 1.15.1+vmware.1-tkg.1 test-ns - ``` - -13. Delete the repository - - ```sh - >>> tanzu package repository delete standard-repo --namespace test-ns - Deleted package repository 'standard-repo' in namespace 'test-ns'' - ``` - -All the above commands are equipped with --kubeconfig flag to perform the package and repository operations on the desired cluster. - -Example: - -```sh ->>> tanzu package installed list -A --kubeconfig wc-kc-alpha8 - - Retrieving installed packages... - NAME PACKAGE-NAME PACKAGE-VERSION STATUS NAMESPACE - contour-pkg contour.tanzu.vmware.com 1.15.1+vmware.1-tkg.1 Reconcile succeeded test-ns - mypkg pkg.test.carvel.dev 2.0.0 Reconcile succeeded test-ns -``` diff --git a/cmd/cli/plugin/package/featureflags.go b/cmd/cli/plugin/package/featureflags.go deleted file mode 100644 index e3a24387cf..0000000000 --- a/cmd/cli/plugin/package/featureflags.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -const ( - // Package Plugin Kctrl Command Tree determines whether to use the command tree from kctrl. Setting feature flag to - // true will allow to use the package command tree from kctrl for package plugin - FeatureFlagPackagePluginKctrlCommandTree = "features.package.kctrl-command-tree" -) - -// DefaultFeatureFlagsForPackagePlugin is used to populate default feature-flags for the package plugin -var ( - DefaultFeatureFlagsForPackagePlugin = map[string]bool{ - FeatureFlagPackagePluginKctrlCommandTree: true, - } -) diff --git a/cmd/cli/plugin/package/go.mod b/cmd/cli/plugin/package/go.mod deleted file mode 100644 index f74b6160ee..0000000000 --- a/cmd/cli/plugin/package/go.mod +++ /dev/null @@ -1,260 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/package - -go 1.18 - -replace ( - github.com/spf13/cobra => github.com/spf13/cobra v1.5.0 - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/config => ../../../../apis/config - github.com/vmware-tanzu/tanzu-framework/apis/run => ../../../../apis/run - github.com/vmware-tanzu/tanzu-framework/capabilities/client => ../../../../capabilities/client - github.com/vmware-tanzu/tanzu-framework/cli/core => ../../../../cli/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../../../cli/runtime - github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/secret => ../../../../cmd/cli/plugin/secret - github.com/vmware-tanzu/tanzu-framework/packageclients => ../../../../packageclients - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common => ../../../../pinniped-components/common - github.com/vmware-tanzu/tanzu-framework/tkg => ../../../../tkg - github.com/vmware-tanzu/tanzu-framework/tkr => ../../../../tkr - github.com/vmware-tanzu/tanzu-framework/util => ../../../../util - sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.8 - sigs.k8s.io/controller-runtime => sigs.k8s.io/controller-runtime v0.12.3 -) - -require ( - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/cppforlife/go-cli-ui v0.0.0-20220520125801-e45d9169a663 - github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.24.1 - github.com/pkg/errors v0.9.1 - github.com/spf13/cobra v1.6.1 - github.com/stretchr/testify v1.8.1 - github.com/vmware-tanzu/carvel-kapp-controller v0.39.0 - github.com/vmware-tanzu/carvel-kapp-controller/cli v0.0.0-20230106043644-ad24bdc3e412 - github.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/secret v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/packageclients v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/tkg v0.0.0-00010101000000-000000000000 - go.uber.org/multierr v1.8.0 - gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.25.0 - k8s.io/apiextensions-apiserver v0.25.0 - k8s.io/apimachinery v0.25.0 - k8s.io/client-go v0.25.0 - sigs.k8s.io/yaml v1.3.0 -) - -require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.6.0 // indirect - cloud.google.com/go/storage v1.27.0 // indirect - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/Azure/azure-sdk-for-go v66.0.0+incompatible // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.27 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect - github.com/Azure/go-autorest/autorest/azure/auth v0.5.10 // indirect - github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect - github.com/BurntSushi/toml v1.1.0 // indirect - github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/semver/v3 v3.2.0 // indirect - github.com/Masterminds/sprig/v3 v3.2.3 // indirect - github.com/Microsoft/go-winio v0.5.2 // indirect - github.com/adrg/xdg v0.4.0 // indirect - github.com/alessio/shellescape v1.4.1 // indirect - github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d // indirect - github.com/apparentlymart/go-cidr v1.1.0 // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect - github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7 // indirect - github.com/aws/amazon-vpc-cni-k8s v1.12.0 // indirect - github.com/aws/aws-sdk-go v1.44.107 // indirect - github.com/awslabs/goformation/v4 v4.19.5 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/blang/semver/v4 v4.0.0 // indirect - github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.11.4 // indirect - github.com/coredns/caddy v1.1.1 // indirect - github.com/coredns/corefile-migration v1.0.18 // indirect - github.com/cppforlife/cobrautil v0.0.0-20221130162803-acdfead391ef // indirect - github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/docker/cli v20.10.16+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.17+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.4.0 // indirect - github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 // indirect - github.com/elazarl/go-bindata-assetfs v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/getkin/kin-openapi v0.94.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-asn1-ber/asn1-ber v1.5.1 // indirect - github.com/go-ldap/ldap/v3 v3.3.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/analysis v0.19.5 // indirect - github.com/go-openapi/errors v0.19.2 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/loads v0.19.4 // indirect - github.com/go-openapi/runtime v0.19.4 // indirect - github.com/go-openapi/spec v0.19.5 // indirect - github.com/go-openapi/strfmt v0.19.5 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-openapi/validate v0.19.8 // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.2.0 // indirect - github.com/golang/glog v1.0.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/cel-go v0.12.5 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/go-containerregistry v0.10.0 // indirect - github.com/google/go-github/v45 v45.2.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/hashicorp/go-version v1.4.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/huandu/xstrings v1.3.3 // indirect - github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/jessevdk/go-flags v1.4.0 // indirect - github.com/jinzhu/copier v0.3.5 // 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/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect - github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57 // indirect - github.com/k14s/imgpkg v0.17.0 // indirect - github.com/k14s/kbld v0.32.0 // indirect - github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.15.4 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // 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/nxadm/tail v1.4.8 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 // indirect - github.com/otiai10/copy v1.7.0 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rs/xid v1.4.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b // indirect - github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522 // indirect - github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect - github.com/spf13/afero v1.9.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/stoewer/go-strcase v1.2.0 // indirect - github.com/subosito/gotenv v1.3.0 // indirect - github.com/valyala/fastjson v1.6.3 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/vito/go-interact v1.0.1 // indirect - github.com/vmware-tanzu/carvel-imgpkg v0.23.1 // indirect - github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 // indirect - github.com/vmware-tanzu/carvel-vendir v0.30.0 // indirect - github.com/vmware-tanzu/carvel-ytt v0.40.0 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/config v0.0.0-20220824221239-af5a644ffef7 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/cli/core v0.0.0-20220914003300-5b2ed024556a // indirect - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/tkr v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware/govmomi v0.30.2 // indirect - github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect - go.mongodb.org/mongo-driver v1.5.1 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/zap v1.22.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.102.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect - google.golang.org/grpc v1.50.1 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.66.4 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiserver v0.25.0 // indirect - k8s.io/cluster-bootstrap v0.24.4 // indirect - k8s.io/component-base v0.25.0 // indirect - k8s.io/klog/v2 v2.80.0 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 // indirect - sigs.k8s.io/cluster-api v1.2.8 // indirect - sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2 // indirect - sigs.k8s.io/cluster-api-provider-azure v1.6.1 // indirect - sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 // indirect - sigs.k8s.io/cluster-api/test v1.2.8 // indirect - sigs.k8s.io/controller-runtime v0.13.0 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/kind v0.15.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect -) diff --git a/cmd/cli/plugin/package/go.sum b/cmd/cli/plugin/package/go.sum deleted file mode 100644 index 5fd197ec80..0000000000 --- a/cmd/cli/plugin/package/go.sum +++ /dev/null @@ -1,2073 +0,0 @@ -4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= -cloud.google.com/go/iam v0.6.0 h1:nsqQC88kT5Iwlm4MeNGTpfMWddp6NB/UOLFTH6m1QfQ= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/longrunning v0.1.1 h1:y50CXG4j0+qvEukslYFBCrzaXX0qpFbBzc3PchSu/LE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= -cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCqWCLp6Cifo= -github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible h1:bmmC38SlE8/E81nNADlgmVGurPWMHDX2YNXVQMrBpEE= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A= -github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg= -github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.10 h1:F9A3Z++TtAoFysBsNOIJILoHuYBaYvhVGsMGEqPtIS8= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.10/go.mod h1:zQXYYNX9kXzRMrJNVXWUfNy38oPMF5/2TeZ4Wylc9fE= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 h1:dMOmEJfkLKW/7JsokJqkyoYSgmR08hi9KrhjZb+JALY= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28= -github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= -github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d h1:0xIrH2lJbraclvJT3pvTf3u2oCAL60cAqiv4qRpz4EI= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU= -github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7 h1:UpBQmQ1gKLi+i+/Dohoqk7FfuxlYQYveajqs1pk/CvA= -github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7/go.mod h1:BcllDeAFx8PtaMrPxvvuCUo7NRS2x6w+3W17WFDu0sk= -github.com/aws/amazon-vpc-cni-k8s v1.12.0 h1:WP8wHJ+UjViYkpMi2Uu5hHiPTYH3/jPC9pG3PrTmoWY= -github.com/aws/amazon-vpc-cni-k8s v1.12.0/go.mod h1:vZdHLUZf7Kj4mpqzG+szRxvCe/XMS/EAcxwMklI6NOQ= -github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= -github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.107 h1:VP7Rq3wzsOV7wrfHqjAAKRksD4We58PaoVSDPKhm8nw= -github.com/aws/aws-sdk-go v1.44.107/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/awslabs/goformation/v4 v4.19.5 h1:Y+Tzh01tWg8gf//AgGKUamaja7Wx9NPiJf1FpZu4/iU= -github.com/awslabs/goformation/v4 v4.19.5/go.mod h1:JoNpnVCBOUtEz9bFxc9sjy8uBUCLF5c4D1L7RhRTVM8= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/blizzy78/varnamelen v0.3.0/go.mod h1:hbwRdBvoBqxk34XyQ6HA0UH3G0/1TKuv5AC4eaBT0Ec= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/breml/bidichk v0.1.1/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudfoundry/bosh-utils v0.0.0-20191216173634-505d7f919144/go.mod h1:JCrKwetZGjxbfq1U139TZuXDBfdGLtjOEAfxMWKV/QM= -github.com/cloudfoundry/config-server v0.1.20/go.mod h1:Y3b/MHqyp22CcG0X1qvEHG8lujoebxjD9IAslyS/Yk0= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.11.4 h1:LjrYUZpyOhiSaU7hHrdR82/RBoxfGWSaC0VeSSMXqnk= -github.com/containerd/stargz-snapshotter/estargz v0.11.4/go.mod h1:7vRJIcImfY8bpifnMjt+HTJoQxASq7T28MYbP15/Nf0= -github.com/coredns/caddy v1.1.0/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= -github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/corefile-migration v1.0.18 h1:zs5PJm/VGZVje1ESRj6ZqyUuVsVfagExkbLU2QKV5mI= -github.com/coredns/corefile-migration v1.0.18/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/cobrautil v0.0.0-20221130162803-acdfead391ef h1:de10GNLe45JTMghl2qf9WH17H/BjGShK41X3vKAsPJA= -github.com/cppforlife/cobrautil v0.0.0-20221130162803-acdfead391ef/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= -github.com/cppforlife/go-cli-ui v0.0.0-20200506005011-4268990983cc/go.mod h1:I0qrzCmuPWYI6kAOvkllYjaW2aovclWbJ96+v+YyHb0= -github.com/cppforlife/go-cli-ui v0.0.0-20220520125801-e45d9169a663 h1://VPFw0OpzPIN9JFDftt5iValhLF1SEtLq5IbQiLOOY= -github.com/cppforlife/go-cli-ui v0.0.0-20220520125801-e45d9169a663/go.mod h1:SYJ98tNNvI/6pSCbovi32IFglhBXDkc27I8nqq9nGK8= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/daixiang0/gci v0.2.9/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.16+incompatible h1:aLQ8XowgKpR3/IysPj8qZQJBVQ+Qws61icFuZl6iKYs= -github.com/docker/cli v20.10.16+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 h1:7QPwrLT79GlD5sizHf27aoY2RTvw62mO6x7mxkScNk0= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46/go.mod h1:esf2rsHFNlZlxsqsZDojNBcnNs5REqIvRrWRHqX0vEU= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw= -github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getkin/kin-openapi v0.94.0 h1:bAxg2vxgnHHHoeefVdmGbR+oxtJlcv5HsJJa3qmAHuo= -github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= -github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-critic/go-critic v0.6.1/go.mod h1:SdNCfU0yF3UBjtaZGw6586/WocupMOJuiqgom5DsQxM= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-ldap/ldap/v3 v3.3.0 h1:lwx+SJpgOHd8tG6SumBQZXCmNX51zM8B1cfxJ5gv4tQ= -github.com/go-ldap/ldap/v3 v3.3.0/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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 v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4 h1:5I4CCSqoWzT+82bBkNIvmLc0UOsoKKQ4Fz+3VxOB7SY= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= -github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-openapi/validate v0.19.8 h1:YFzsdWIDfVuLvIOF+ZmKjVg1MbPJ1QgY9PihMwei1ys= -github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.43.0/go.mod h1:VIFlUqidx5ggxDfQagdvd9E67UjMXtTHBkBQ7sHoC5Q= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-go v0.12.5 h1:DmzaiSgoaqGCjtpPQWl26/gND+yRpim56H1jCVev6d8= -github.com/google/cel-go v0.12.5/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.10.0 h1:qd/fv2nQajGZJenaNcdaghlwSPjQ0NphN9hzArr2WWg= -github.com/google/go-containerregistry v0.10.0/go.mod h1:C7uwbB1QUAtvnknyd3ethxJRd4gtEjU/9WLXzckfI1Y= -github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= -github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= -github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= -github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= -github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hpcloud/tail v1.0.1-0.20180514194441-a1dbeea552b7/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= -github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= -github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -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/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57 h1:CwBRArr+BWBopnUJhDjJw86rPL/jGbEjfHWKzTasSqE= -github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57/go.mod h1:B0xN2MiNBGWOWi9CcfAo9LBI8IU4J1utlbOIJCsmKr4= -github.com/k14s/imgpkg v0.17.0 h1:l1HqYtjecqx7iYecJUvxQQYdo3WubCahHQ30lh0p9sU= -github.com/k14s/imgpkg v0.17.0/go.mod h1:xYZ7gQxYP3O35vGIXcYchDEHq0xA81FOheCp8Vlq5ko= -github.com/k14s/kbld v0.32.0 h1:zf3qCir0usz7rX6JRF97QxaZ25+13EniE7z+ll0xaZ8= -github.com/k14s/kbld v0.32.0/go.mod h1:N7Ij72ZhJ2B7kTUxavGTBT1YymIfmAeO6JKyNbtja1g= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 h1:wKSifC/VbCaQMqXYn6/gSFqle82OX4bE3KYALDU9FlU= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115/go.mod h1:mGrnmO5qnhJIaSiwMo05cvRL6Ww9ccYbTgNFcm6RHZQ= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 h1:4bcRTTSx+LKSxMWibIwzHnDNmaN1x52oEpvnjCy+8vk= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368/go.mod h1:lKGj1op99m4GtQISxoD2t+K+WO/q2NzEPKvfXFQfbCA= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.4 h1:1kn4/7MepF/CHmYub99/nNX8az0IJjfSOU/jbnTVfqQ= -github.com/klauspost/compress v1.15.4/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= -github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= -github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.1.2/go.mod h1:bnXsMr+ZTH09V5rssEI+jHAZ4z+ZdyhgO/zsy3EhK+0= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -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/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= -github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc= -github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= -github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -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 v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.5.0 h1:TRtrvv2vdQqzkwrQ1ke6vtXf7IK34RBUJafIy1wMwls= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= -github.com/onsi/gomega v1.12.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= -github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= -github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 h1:+czc/J8SlhPKLOtVLMQc+xDCFBT73ZStMsRhSsUhsSg= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= -github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/otiai10/mint v1.3.3 h1:7JgpsBaN0uMkyju4tbYHu0mnM55hNKVYLsXmwr15NQI= -github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -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/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.13/go.mod h1:Ul8wwdqR6kBVOCt2dipDBkE+T6vAV/iixkrKuRTN1oQ= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.10/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20210428214800-545e0d2e0bf7/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= -github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b h1:jUK33OXuZP/l6babJtnLo1qsGvq6G9so9KMflGAm4YA= -github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b/go.mod h1:8458kAagoME2+LN5//WxE71ysZ3B7r22fdgb7qVmXSY= -github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522 h1:fOCp11H0yuyAt2wqlbJtbyPzSgaxHTv8uN1pMpkG1t8= -github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522/go.mod h1:tQTYKOQgxoH3v6dEmdHiz4JG+nbxWwM5fgPQUpSZqVQ= -github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securego/gosec/v2 v2.9.1/go.mod h1:oDcDLcatOJxkCGaCaq8lua1jTnYf6Sou4wdiJ1n4iHc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil/v3 v3.21.10/go.mod h1:t75NhzCZ/dYyPQjyQmrAYP6c8+LCdFANeBMdLPCNnew= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -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 v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY= -github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= -github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= -github.com/vito/go-interact v1.0.1 h1:O8xi8c93bRUv2Tb/v6HdiuGc+WnWt+AQzF74MOOdlBs= -github.com/vito/go-interact v1.0.1/go.mod h1:HrdHSJXD2yn1MhlTwSIMeFgQ5WftiIorszVGd3S/DAA= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1 h1:sUHDtnvcIMMcY/Pudym6DJ0kv7+uyMCAqQby0SLnQVs= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1/go.mod h1:2XNe+P0MDgya0FPEMOVZLAXku05VZhccVdDcXChhvy8= -github.com/vmware-tanzu/carvel-kapp-controller v0.39.0 h1:g8UH1/sxIUzJ757D89A+2c24paGYClE86GCjlti9N2A= -github.com/vmware-tanzu/carvel-kapp-controller v0.39.0/go.mod h1:OYNEmLHrw6laaTOG3awjeUb/ugZjPGNEgbr8pJJl4QM= -github.com/vmware-tanzu/carvel-kapp-controller/cli v0.0.0-20230106043644-ad24bdc3e412 h1:gEELjd6oitqnqPNhoSmQIr9PSuOOuWqrOtoPdPgihX4= -github.com/vmware-tanzu/carvel-kapp-controller/cli v0.0.0-20230106043644-ad24bdc3e412/go.mod h1:2F1h3Ez3+OEHNWCSqDwdX7rikb6X0ICX+8ykWeHv0zk= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 h1:3mSDyzhf52Y0jdvHrhJUf4Sk97CILBOkQt/WUaD8G/8= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0/go.mod h1:UW9xzccG6vjNoq2emVderTX11epILNyxtmGxFupRsHc= -github.com/vmware-tanzu/carvel-vendir v0.30.0 h1:JqElRFpSsYJQmI5Hrxl1Fx9wJZ2xeDk+TVnnSrFLFVU= -github.com/vmware-tanzu/carvel-vendir v0.30.0/go.mod h1:qFV2/3Cu584fhG2wXodoIm8KhX1wKHRFavBiRjK/Ly0= -github.com/vmware-tanzu/carvel-ytt v0.40.0 h1:WUWTtwvfqV9CN9v207oDt2xfhmuWHGwc4MMaXJAqIEE= -github.com/vmware-tanzu/carvel-ytt v0.40.0/go.mod h1:crDcKbS1GM4Q34puoVxdrajWOXrxjOxvUCwtsNV5Etc= -github.com/vmware/govmomi v0.30.2 h1:zPMmLTtAfBgOVsTgwKOzVVahQIOC4A2oyFQFSsn/0ag= -github.com/vmware/govmomi v0.30.2/go.mod h1:F7adsVewLNHsW/IIm7ziFURaXDaHEwcc+ym4r3INMdY= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.5.1 h1:9nOVLGDfOaZ9R0tBumx/BcuqkbFpyTCU2r/Po7A2azI= -go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= -go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0= -go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U= -go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= -go4.org/intern v0.0.0-20220617035311-6925f38cc365 h1:t9hFvR102YlOqU0fQn1wgwhNvSbHGBbbJxX9JKfU3l0= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180730214132-a0f8a16cb08c/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/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-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/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= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= -inet.af/netaddr v0.0.0-20220811202034-502d2d690317 h1:U2fwK6P2EqmopP/hFLTOAjWTki0qgd4GMJn5X8wOleU= -k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= -k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/api v0.24.4/go.mod h1:42pVfA0NRxrtJhZQOvRSyZcJihzAdU59WBtTjYcB0/M= -k8s.io/api v0.25.0 h1:H+Q4ma2U/ww0iGB78ijZx6DRByPz6/733jIuFpX70e0= -k8s.io/api v0.25.0/go.mod h1:ttceV1GyV1i1rnmvzT3BST08N6nGt+dudGrquzVQWPk= -k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apiextensions-apiserver v0.25.0 h1:CJ9zlyXAbq0FIW8CD7HHyozCMBpDSiH7EdrSTCZcZFY= -k8s.io/apiextensions-apiserver v0.25.0/go.mod h1:3pAjZiN4zw7R8aZC5gR0y3/vCkGlAjCazcg1me8iB/E= -k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.4/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.25.0 h1:MlP0r6+3XbkUG2itd6vp3oxbtdQLQI94fD5gCS+gnoU= -k8s.io/apimachinery v0.25.0/go.mod h1:qMx9eAk0sZQGsXGu86fab8tZdffHbwUfsvzqKn4mfB0= -k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/apiserver v0.25.0 h1:8kl2ifbNffD440MyvHtPaIz1mw4mGKVgWqM0nL+oyu4= -k8s.io/apiserver v0.25.0/go.mod h1:BKwsE+PTC+aZK+6OJQDPr0v6uS91/HWxX7evElAH6xo= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= -k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/client-go v0.25.0 h1:CVWIaCETLMBNiTUta3d5nzRbXvY5Hy9Dpl+VvREpu5E= -k8s.io/client-go v0.25.0/go.mod h1:lxykvypVfKilxhTklov0wz1FoaUZ8X4EwbhS6rpRfN8= -k8s.io/cluster-bootstrap v0.24.4 h1:ZryK73DHK4dv5yAr5081yO03rrEK2Dz9jUtymqEle9Q= -k8s.io/cluster-bootstrap v0.24.4/go.mod h1:D9SYcEo302eah8yxFoPciGy8dRnReZr7fG+waTAvj14= -k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/component-base v0.25.0 h1:haVKlLkPCFZhkcqB6WCvpVxftrg6+FK5x1ZuaIDaQ5Y= -k8s.io/component-base v0.25.0/go.mod h1:F2Sumv9CnbBlqrpdf7rKZTmmd2meJq0HizeyY/yAFxk= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= -k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 h1:XmRqFcQlCy/lKRZ39j+RVpokYNroHPqV3mcBRfnhT5o= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2 h1:WjTt0uyUG+FJBodnrSzb1L3mHfkIgtgMnNQQ+NJMuT8= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2/go.mod h1:ZKM3W39Pl7uPuuB6mT/dWakgy1O8OcivGRCAZqSP+Hs= -sigs.k8s.io/cluster-api-provider-azure v1.6.1 h1:GpY9YLiUqovz4gwIEg2PRYOhJ5e/AG7sTHtoxzt6K4w= -sigs.k8s.io/cluster-api-provider-azure v1.6.1/go.mod h1:wM/V5BBRq+m5KCE9h5YVtMQ3qcIOsGBb7UDD/tXufko= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 h1:D0bDtSyRIcBmuGFyW65otEh+VIz8SGioaAjYok/cK5Y= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3/go.mod h1:EIWdG6qGX1iW0U5qiMi+EDQ9gmW7pylJwKDtHOkBQ6g= -sigs.k8s.io/cluster-api/test v1.2.8 h1:kYziHLSV+KqBoQXg7STGU4ZQpClayqIyw+BTYGx71uE= -sigs.k8s.io/cluster-api/test v1.2.8/go.mod h1:55r564Dm7/eO7LH76SRE8whfg4yUnsLz5akqqej4Q+8= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kind v0.15.0 h1:Fskj234L4hjQlsScCgeYvCBIRt06cjLzc7+kbr1u8Tg= -sigs.k8s.io/kind v0.15.0/go.mod h1:cKTqagdRyUQmihhBOd+7p43DpOPRn9rHsUC08K1Jbsk= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cmd/cli/plugin/package/kctrl/README.md b/cmd/cli/plugin/package/kctrl/README.md deleted file mode 100644 index 87cd2b708d..0000000000 --- a/cmd/cli/plugin/package/kctrl/README.md +++ /dev/null @@ -1,669 +0,0 @@ -# Package - -Manage package lifecycle operations. - -## Usage - -Package and Repository Operations ( Subject to Change ): - -```sh ->>> tanzu package --help -Tanzu package management (available, init, install, installed, release, repository) - -Usage: - tanzu package [flags] - tanzu package [command] - -Available Commands: - available Manage available packages (get, list) - completion Generate the autocompletion script for the specified shell - init Initialize Package (experimental) - install Install package - installed Manage installed packages (create, delete, get, kick, list, pause, status, update) - release Release package (experimental) - repository Manage package repositories (add, delete, get, kick, list, release, update) - -Flags: - --column strings Filter to show only given columns - --debug Include debug output - -h, --help help for package - --kube-api-burst int Set Kubernetes API client burst limit (default 1000) - --kube-api-qps float32 Set Kubernetes API client QPS limit (default 1000) - --kubeconfig string Path to the kubeconfig file ($TANZU_KUBECONFIG) - --kubeconfig-context string Kubeconfig context override ($TANZU_KUBECONFIG_CONTEXT) - --kubeconfig-yaml string Kubeconfig contents as YAML ($TANZU_KUBECONFIG_YAML) - -y, --yes Assume yes for any prompt - -Use "tanzu package [command] --help" for more information about a command. -``` - -```sh ->>> tanzu package repository --help -Manage package repositories (add, delete, get, kick, list, release, update) - -Usage: - package repository [flags] - package repository [command] - -Aliases: - repository, repo, r - -Package Management Commands: - add Add a package repository - delete Delete a package repository - get Get details for a package repository - kick Trigger reconciliation for repository - list List package repositories in a namespace - update Update a package repository - -Package Authoring Commands: - release Build and create a package repository (experimental) - -Flags: - -h, --help help for repository - -Global Flags: - --column strings Filter to show only given columns - --debug Include debug output - --kube-api-burst int Set Kubernetes API client burst limit (default 1000) - --kube-api-qps float32 Set Kubernetes API client QPS limit (default 1000) - --kubeconfig string Path to the kubeconfig file ($TANZU_KUBECONFIG) - --kubeconfig-context string Kubeconfig context override ($TANZU_KUBECONFIG_CONTEXT) - --kubeconfig-yaml string Kubeconfig contents as YAML ($TANZU_KUBECONFIG_YAML) - -y, --yes Assume yes for any prompt - -Use "package repository [command] --help" for more information about a command. -``` - -## Test - -1. Create a management cluster using latest tanzu cli - -2. Use package commands to: - * add a repository - * list a repository - * get a repository status - * list packages - * get a package information - * get an installed package information - * update a package - * delete a repository - - Use the following image package bundles for testing: - - | S.no | Repository URL | - | :----| :------------------------------------------------------------------------| - | 1. | projects-stg.registry.vmware.com/tkg/test-packages/test-repo:v1.0.0 | - | 2. | projects-stg.registry.vmware.com/tkg/test-packages/standard-repo:v1.0.0 | - - Here is an example workflow - -3. Add a repository - - ```sh - >>> tanzu package repository add standard-repo --url projects-stg.registry.vmware.com/tkg/test-packages/standard-repo:v1.0.0 -n test-ns - Waiting for package repository to be added - 2:26:44PM: Waiting for package repository reconciliation for 'standard-repo' - 2:26:44PM: Fetch started (7s ago) - 2:26:51PM: Fetching - | apiVersion: vendir.k14s.io/v1alpha1 - | directories: - | - contents: - - ...snip... - - | 2:26:52PM: ---- applying complete [16/16 done] ---- - | 2:26:52PM: ---- waiting complete [16/16 done] ---- - | Succeeded - 2:26:52PM: Deploy succeeded - ``` - -4. Get repository status - - ```sh - >>> tanzu package repository get standard-repo -n test-ns - NAMESPACE: test-ns - NAME: standard-repo - SOURCE: (imgpkg) projects-stg.registry.vmware.com/tkg/test-packages/standard-repo:v1.0.0 - STATUS: Reconcile succeeded - CONDITIONS: - type: ReconcileSucceeded - status: "True" - reason: "" - message: "" - ``` - -5. Update a repository - - ```sh - >>> tanzu package repository update standard-repo --url projects-stg.registry.vmware.com/tkg/test-packages/standard-repo:v1.0.0 -n test-ns - Waiting for package repository to be updated - 2:36:11PM: Waiting for package repository reconciliation for 'standard-repo' - 2:36:11PM: Fetching - | apiVersion: vendir.k14s.io/v1alpha1 - | directories: - | - contents: - | - imgpkgBundle: - - ...snip... - - | Wait to: 0 reconcile, 0 delete, 0 noop - | Succeeded - 2:36:59PM: Deploy succeeded - ``` - -6. List the repository - - ```sh - >>> tanzu package repository list -A - NAMESPACE NAME SOURCE STATUS - test-ns repo (imgpkg) projects-stg.registry.vmware.com/tkg/test-packages/test-repo:v1.0.0 Reconcile succeeded - test-ns standard-repo (imgpkg) projects-stg.registry.vmware.com/tkg/test-packages/standard-repo:v1.0.0 Reconcile succeeded - ``` - -7. Get information of a package - - Example 1: Get detailed information of a package - - ```sh - >>> tanzu package available get contour.tanzu.vmware.com/1.15.1+vmware.1-tkg.1 --namespace test-ns - NAME: contour.tanzu.vmware.com - DISPLAY-NAME: contour - CATEGORIES: - ingress - SHORT-DESCRIPTION: This package provides ingress functionality. - LONG-DESCRIPTION: This package provides ingress functionality. - PROVIDER: - MAINTAINERS: - SUPPORT-DESCRIPTION: - VERSION: 1.15.1+vmware.1-tkg.1 - RELEASED-AT: 0001-01-01 00:00:00 +0000 UTC - MIN-CAPACITY-REQUIREMENTS: - RELEASE-NOTES: - LICENSES: - ``` - - Example 2: Get openAPI schema of a package - - ```sh - >>> tanzu package available get external-dns.tanzu.vmware.com/0.8.0+vmware.1-tkg.1 -n external-dns --values-schema - KEY DEFAULT TYPE DESCRIPTION - deployment.args array List of arguments passed via command-line to external-dns. - For more guidance on configuration options for your - desired DNS provider, consult the ExternalDNS docs at - https://github.com/kubernetes-sigs/external-dns#running-externaldns - - deployment.env array List of environment variables to set in the external-dns container. - deployment.securityContext SecurityContext defines the security options the - external-dns container should be run with. More info: - https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ - deployment.volumeMounts array Pod volumes to mount into the external-dns container's filesystem. - deployment.volumes array List of volumes that can be mounted by containers belonging to the external-dns - pod. More info: https://kubernetes.io/docs/concepts/storage/volumes - namespace tanzu-system-service-discovery string The namespace in which to deploy ExternalDNS. - ``` - - Example 3: Generate default values.yaml for a package - - ```sh - >>> tanzu package available get contour.tanzu.vmware.com/1.18.2+vmware.1-tkg.1 --default-values-file-output contour-default-values.yaml - Created default values file at contour-default-values.yaml - NAME: contour.tanzu.vmware.com - DISPLAY-NAME: contour - CATEGORIES: - ingress - SHORT-DESCRIPTION: An ingress controller - LONG-DESCRIPTION: An Envoy-based ingress controller that supports dynamic configuration updates - and multi-team ingress delegation. See https://projectcontour.io for more - information. - PROVIDER: VMware - MAINTAINERS: - name: Steve Kriss - - name: Steve Sloka - - name: Nick Young - - name: Sunjay Bhatia - - name: Nicholas Seemiller - SUPPORT-DESCRIPTION: Support provided by VMware for deployment on TKG 1.4+ clusters. Best-effort - support for deployment on any conformant Kubernetes cluster. Contact support by - opening a support request via VMware Cloud Services or my.vmware.com. - VERSION: 1.18.2+vmware.1-tkg.1 - RELEASED-AT: 2021-10-05 05:30:00 +0530 IST - MIN-CAPACITY-REQUIREMENTS: Varies significantly based on number of Services, Ingresses/HTTPProxies, etc. A - starting point is 128MB RAM and 0.5 CPU for each Contour and Envoy pod, but this - can and should be tuned based on observed usage. - RELEASE-NOTES: contour 1.18.2 https://github.com/projectcontour/contour/releases/tag/v1.18.2 - LICENSES: VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0) - ``` - - contour-default-values.yaml - - ```yaml - # certificates: - # duration: 8760h - # renewBefore: 360h - # contour: - # logLevel: info - # replicas: 2 - # useProxyProtocol: false - # envoy: - # hostNetwork: false - # hostPorts: - # enable: true - # http: 80 - # https: 443 - # logLevel: info - # service: - # aws: - # LBType: classic - # externalTrafficPolicy: Cluster - # terminationGracePeriodSeconds: 300 - # namespace: tanzu-system-ingress - ``` - -8. Install a package - - Example 1: Install the specified version for package name "fluent-bit.tkg-standard.tanzu.vmware", while providing the values.yaml file and without waiting for package reconciliation to complete - - ```sh - - >>> tanzu package install fluentbit --package fluent-bit.tanzu.vmware.com --namespace test-ns --version 1.7.5+vmware.1-tkg.1 --values-file values.yaml --wait=false - Creating service account 'fluentbit-test-ns-sa' - Creating cluster admin role 'fluentbit-test-ns-cluster-role' - Creating cluster role binding 'fluentbit-test-ns-cluster-rolebinding' - Creating secret 'fluentbit-test-ns-values' - Creating package install resource - ``` - - An example values.yaml is as follows: - - ```yaml - fluent_bit: - config: - outputs: | - [OUTPUT] - Name stdout - Match * - ``` - - Example 2: Install the latest version for package name "contour.tanzu.vmware.com". - - ```sh - >>> tanzu package install contour-pkg --package contour.tanzu.vmware.com --namespace test-ns --version 1.15.1+vmware.1-tkg.1 - 11:02:01AM: Creating service account 'contour-pkg-test-ns-sa' - 11:02:01AM: Creating cluster admin role 'contour-pkg-test-ns-cluster-role' - 11:02:01AM: Creating cluster role binding 'contour-pkg-test-ns-cluster-rolebinding' - 11:02:01AM: Creating package install resource - 11:02:01AM: Waiting for PackageInstall reconciliation for 'contour-pkg' - 11:02:02AM: Fetch started (2s ago) - 11:02:04AM: Fetching - | apiVersion: vendir.k14s.io/v1alpha1 - | directories: - | - contents: - | - imgpkgBundle: - | image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/contour@sha256:d9be6b196fc35e354f7405cef5edc342858869e39b2f96c1f621721ef7020833 - | path: . - | path: "0" - | kind: LockConfig - | - 11:02:04AM: Fetch succeeded - 11:02:05AM: Template succeeded - 11:02:05AM: Deploy started (2s ago) - 11:02:07AM: Deploying - | Target cluster 'https://10.96.0.1:443' (nodes: minikube) - | Changes - | Namespace Name Kind Conds. Age Op Op st. Wait to Rs Ri - - ... - - 11:04:14AM: App reconciled - ``` - -9. Get information of an installed package - - Example 1: Get information of an installed package - - ```sh - >>> tanzu package installed get contour-pkg --namespace test-ns - NAMESPACE: test-ns - NAME: contour-pkg - PACKAGE-NAME: contour.tanzu.vmware.com - PACKAGE-VERSION: 1.15.1+vmware.1-tkg.1 - STATUS: Reconcile succeeded - CONDITIONS: - type: ReconcileSucceeded - status: "True" - reason: "" - message: "" - ``` - - Example 2: Get data value secret of an installed package and save it to file (example: config.yaml) - - ```sh - >>> tanzu package installed get fluent-bit --namespace test-ns --values-file-output config.yaml - - cat config.yaml - fluent_bit: - config: - outputs: | - [OUTPUT] - Name stdout - Match * - ``` - -10. Pause and kick a package - - Example 1: Pause a package - - ```sh - >>> tanzu package installed pause contour-pkg --namespace test-ns - Pausing reconciliation for package install 'contour-pkg' in namespace 'test-ns' - Continue? [yN]: y - - >>> tanzu package installed get contour-pkg --namespace test-ns - NAMESPACE: test-ns - NAME: contour-pkg - PACKAGE-NAME: contour.tanzu.vmware.com - PACKAGE-VERSION: 1.15.1+vmware.1-tkg.1 - STATUS: Paused - CONDITIONS: - type: ReconcileSucceeded - status: "True" - reason: "" - message: "" - ``` - - Example 2: Kick a package - - ```sh - >>> tanzu package installed kick contour-pkg --namespace test-ns - Triggering reconciliation for package install 'contour-pkg' in namespace 'test-ns' - Continue? [yN]: y - 2:40:55PM: Waiting for PackageInstall reconciliation for 'contour-pkg' - 2:40:55PM: Waiting for generation 3 to be observed - 2:41:00PM: Fetching - | apiVersion: vendir.k14s.io/v1alpha1 - | directories: - | - contents: - | - imgpkgBundle: - | image: projects-stg.registry.vmware.com/tkg/tkgextensions-dev/contour@sha256:d9be6b196fc35e354f7405cef5edc342858869e39b2f96c1f621721ef7020833 - | path: . - | path: "0" - | kind: LockConfig - | - 2:41:00PM: Fetch succeeded - 2:41:00PM: Template succeeded - 2:41:00PM: Deploy started (2s ago) - 2:41:02PM: Deploying - | Target cluster 'https://10.96.0.1:443' (nodes: minikube) - | Changes - | Namespace Name Kind Conds. Age Op Op st. Wait to Rs Ri - | Op: 0 create, 0 delete, 0 update, 0 noop, 0 exists - | Wait to: 0 reconcile, 0 delete, 0 noop - | Succeeded - 2:41:03PM: App reconciled - - >>> tanzu package installed get contour-pkg --namespace test-ns - NAMESPACE: test-ns - NAME: contour-pkg - PACKAGE-NAME: contour.tanzu.vmware.com - PACKAGE-VERSION: 1.15.1+vmware.1-tkg.1 - STATUS: Reconcile succeeded - CONDITIONS: - type: ReconcileSucceeded - status: "True" - reason: "" - message: "" - ``` - -11. Update a package - - Example 1: Update a package with different version - - ```sh - >>> tanzu package installed update carvel-test-pkg --version 2.0.0 --namespace test-ns - 2:50:58PM: Updating package install for 'test' in namespace 'default' - 2:50:58PM: Waiting for PackageInstall reconciliation for 'test' - 2:50:58PM: Waiting for generation 6 to be observed - 2:50:59PM: Fetching - | apiVersion: vendir.k14s.io/v1alpha1 - | directories: - | - contents: - | - imgpkgBundle: - | image: index.docker.io/k8slt/kctrl-example-pkg@sha256:73713d922b5f561c0db2a7ea5f4f6384f7d2d6289886f8400a8aaf5e8fdf134a - | path: . - | path: "0" - | kind: LockConfig - | - 2:50:59PM: Fetch succeeded - 2:50:59PM: Template succeeded - 2:50:59PM: Deploy started (2s ago) - 2:51:01PM: Deploying - | Target cluster 'https://10.96.0.1:443' (nodes: minikube) - | Changes - - ... - - | Succeeded - 2:51:03PM: App reconciled - ``` - - Example 2: Update an installed package with providing values.yaml file - - ```sh - >>> tanzu package installed update fluent-bit --version 1.7.5+vmware.1-tkg.1 --namespace test-ns --values-file values.yaml - Getting package install for 'fluent-bit' - Creating secret 'fluent-bit-test-ns-values' - Updating package install for 'fluent-bit' - Waiting for PackageInstall reconciliation for 'fluent-bit' - 11:02:02AM: Fetch started (2s ago) - 11:02:04AM: Fetching - - ... - - 11:03:04AM: App reconciled - ``` - - An example values.yaml is as follows: - - ```yaml - fluent_bit: - config: - outputs: | - [OUTPUT] - Name stdout - Match / - ``` - -12. Uninstall a package - - ```sh - >>> tanzu package installed delete contour-pkg --namespace test-ns - Delete package install 'contour-pkg' from namespace 'test-ns' - Continue? [yN]: y - 2:53:15PM: Deleting package install 'contour-pkg' from namespace 'test-ns' - 2:53:15PM: Waiting for deletion of package install 'contour-pkg' from namespace 'test-ns' - 2:53:15PM: Waiting for generation 4 to be observed - 2:53:15PM: Delete started (2s ago) - 2:53:17PM: Deleting - | Target cluster 'https://10.96.0.1:443' (nodes: minikube) - | Changes - | Namespace Name Kind Conds. Age Op Op st. Wait to Rs Ri - | (cluster) - - ... - - 2:55:16PM: App 'contour-pkg' in namespace 'test-ns' deleted - 2:55:16PM: packageinstall/contour-pkg (packaging.carvel.dev/v1alpha1) namespace: test-ns: DeletionSucceeded - 2:55:16PM: Deleting 'ClusterRoleBinding': contour-pkg-test-ns-cluster-rolebinding - 2:55:16PM: Deleting 'ServiceAccount': contour-pkg-test-ns-sa - 2:55:16PM: Deleting 'ClusterRole': contour-pkg-test-ns-cluster-role - ``` - -13. List the packages - - ```sh - #List installed packages in the default namespace - >>> tanzu package installed list - NAME PACKAGE-NAME PACKAGE-VERSION STATUS - test pkg.test.carvel.dev 2.0.0 Reconcile succeeded - - #List installed packages across all namespaces - >>> tanzu package installed list -A - NAMESPACE NAME PACKAGE-NAME PACKAGE-VERSION STATUS - default test pkg.test.carvel.dev 2.0.0 Reconcile succeeded - test-ns cert-mng cert-manager.tanzu.vmware.com 1.5.3+vmware.2-tkg.1 Reconcile succeeded - test-ns fluent-bit fluent-bit.tanzu.vmware.com 1.7.5+vmware.1-tkg.1 Reconcile succeeded - - - #List installed packages in user provided namespace - >>> tanzu package installed list --namespace test-ns - NAMESPACE NAME PACKAGE-NAME PACKAGE-VERSION STATUS - test-ns cert-mng cert-manager.tanzu.vmware.com 1.5.3+vmware.2-tkg.1 Reconcile succeeded - test-ns fluent-bit fluent-bit.tanzu.vmware.com 1.7.5+vmware.1-tkg.1 Reconcile succeeded - - #List all available package CRs in default namespace - >>> tanzu package available list - NAME DISPLAY-NAME - pkg.test.carvel.dev Carvel Test Package - - #List all available package CRs across all namespace - >>> tanzu package available list -A - NAMESPACE NAME DISPLAY-NAME - default pkg.test.carvel.dev Carvel Test Package - test-ns cert-manager.tanzu.vmware.com cert-manager - test-ns contour.tanzu.vmware.com contour - test-ns external-dns.tanzu.vmware.com external-dns - test-ns fluent-bit.tanzu.vmware.com fluent-bit - test-ns grafana.tanzu.vmware.com grafana - test-ns harbor.tanzu.vmware.com harbor - test-ns multus-cni.tanzu.vmware.com multus-cni - test-ns prometheus.tanzu.vmware.com prometheus - - #List all available packages for package name - >>> tanzu package available list contour.tanzu.vmware.com -A - NAMESPACE NAME VERSION RELEASED-AT - test-ns contour.tanzu.vmware.com 1.15.1+vmware.1-tkg.1 0001-01-01 00:00:00 +0000 UTC - ``` - -14. Delete the repository - - ```sh - >>> tanzu package repository delete standard-repo --namespace test-ns - Deleting package repository 'standard-repo' in namespace 'test-ns' - Continue? [yN]: y - Waiting for deletion to be completed... - 11:47:25PM: packagerepository/standard-repo (packaging.carvel.dev/v1alpha1) namespace: test-ns: Deleting - 11:47:38PM: packagerepository/standard-repo (packaging.carvel.dev/v1alpha1) namespace: test-ns: DeletionSucceeded - ``` - -15. Create a package - - ```sh - >>> tanzu package init - - Welcome! Before we start, do install the latest Carvel suite of tools, - specifically ytt, imgpkg, vendir and kbld. - - Basic Information - A package reference name must be at least three '.' separated segments,e.g. - samplepackage.corp.com - > Enter the package reference name (samplepackage.corp.com): certmanager.carvel.dev - - Content - Please provide the location from where your Kubernetes manifests or Helm chart - can be fetched. This will be bundled as a part of the package. - 1: Local Directory - 2: Github Release - 3: Helm Chart from Helm Repository - 4: Git Repository - 5: Helm Chart from Git Repository - > Enter source (1): 2 - - Repository details - Slug format is org/repo e.g. vmware-tanzu/simple-app - > Enter slug for repository (): cert-manager/cert-manager - > Enter the release tag to be used (latest): v1.9.0 - - We need to know which files contain Kubernetes manifests. Multiple files can be - included using a comma separator. To include all the files, enter * - > Enter the paths which contain Kubernetes manifests (*): cert-manager.yaml - - We will use vendir to fetch the data from the source to the local directory. - Vendir allows us to declaratively state what should be in a directory and sync - data sources into it. - All the information entered above has been persisted into a vendir.yml file. - Printing vendir.yml - | apiVersion: vendir.k14s.io/v1alpha1 - | directories: - | - contents: - | - githubRelease: - | disableAutoChecksumValidation: true - | slug: cert-manager/cert-manager - | tag: v1.9.0 - | includePaths: - | - cert-manager.yaml - | path: . - | path: upstream - | kind: Config - | minimumRequiredVersion: "" - - Next step is to run 'vendir sync' to fetch the data from the source to the local - directory. - Vendir will sync the data into the upstream folder. - Running vendir sync - | $ vendir sync -f vendir.yml - - Output - Successfully updated package-build.yml - Successfully updated package-resources.yml - - Next steps - Created files can be consumed in following ways: - 1. `package release` command to release the package. - 2. `package release --repo-output repo` to release the package and add it to the - package repository directory. - ``` - -16. Release a package - - ```sh - >>> tanzu package release --version 1.0.0 - - Prerequisites - 1. Host is authorized to push images to a registry (can be set up by running - `docker login`) - 2. `package init` ran successfully. - - The bundle created needs to be pushed to an OCI registry. (format: - ) e.g. index.docker.io/k8slt/sample-bundle - > Enter the registry URL (): index.docker.io/prewar/sample-bundle - - kbld builds images when necessary and ensures that all image references are - resolved to an immutable reference - Building images and resolving references - | $ ytt -f /tmp/kapp-controller-fetch-template-deploy1725259937/0/upstream - | $ kbld -f - --imgpkg-lock-output=.imgpkg/images.yml - - An imgpkg bundle consists of all required manifests bundled into an OCI image. - This image is pushed to a registry and consumed by the package. - Pushing imgpkg bundle - | $ imgpkg push -b index.docker.io/k8slt/sample-bundle:build-1666806420 -f ./bundle-index.docker.io-prewar-sample-bundle:build-1666806420-3630282961 --tty=true - | dir: . - | dir: .imgpkg - | file: .imgpkg/images.yml - | dir: upstream - | file: upstream/cert-manager.yaml - | Pushed 'index.docker.io/prewar/sample-bundle@sha256:93a4e6d0577a0c56b69f7d7b24621d98bd205f69846a683a4dc5bcdd53879da5' - | Succeeded - Artifact created: carvel-artifacts/packages/certmanager.carvel.dev/metadata.yml - Artifact created: carvel-artifacts/packages/certmanager.carvel.dev/package.yml - - Next steps - 1. The artifacts generated by the `--repo-output` flag can be bundled into a - PackageRepository by using the `package repository release` command. - 2. Generated Package and PackageMetadata manifests can be applied to the cluster - directly. - ``` - -All the above commands are equipped with --kubeconfig flag to perform the package and repository operations on the desired cluster. - -Example: - -```sh ->>> tanzu package installed list -A --kubeconfig wc-kc-alpha8 - NAMESPACE NAME PACKAGE-NAME PACKAGE-VERSION STATUS - test-ns cert-mng cert-manager.tanzu.vmware.com 1.5.3+vmware.2-tkg.1 Reconcile succeeded - test-ns fluent-bit fluent-bit.tanzu.vmware.com 1.7.5+vmware.1-tkg.1 Reconcile succeeded diff --git a/cmd/cli/plugin/package/kctrl/kctrl.go b/cmd/cli/plugin/package/kctrl/kctrl.go deleted file mode 100644 index 2a41d7298c..0000000000 --- a/cmd/cli/plugin/package/kctrl/kctrl.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package kctrl provides function to add package command tree from kctrl -package kctrl - -import ( - "github.com/cppforlife/go-cli-ui/ui" - - kctrlcmd "github.com/vmware-tanzu/carvel-kapp-controller/cli/pkg/kctrl/cmd" - kctrlcmdcore "github.com/vmware-tanzu/carvel-kapp-controller/cli/pkg/kctrl/cmd/core" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -func Invoke(p *plugin.Plugin) { - writerUI := ui.NewWriterUI(p.Cmd.OutOrStdout(), p.Cmd.ErrOrStderr(), ui.NewNoopLogger()) - adapterUI := &AdapterUI{WriterUI: *writerUI, outWriter: p.Cmd.OutOrStdout()} - confUI := ui.NewWrappingConfUI(ui.NewPaddingUI(adapterUI), ui.NewNoopLogger()) - defer confUI.Flush() - - kctrlcmd.AttachKctrlPackageCommandTree(p.Cmd, confUI, kctrlcmdcore.PackageCommandTreeOpts{BinaryName: "tanzu", PositionalArgs: true, - Color: false, JSON: false}) - setOutputFormatFlag(p.Cmd, adapterUI) -} diff --git a/cmd/cli/plugin/package/kctrl/kctrl_test.go b/cmd/cli/plugin/package/kctrl/kctrl_test.go deleted file mode 100644 index efbb1e112d..0000000000 --- a/cmd/cli/plugin/package/kctrl/kctrl_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package kctrl - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -func TestKctrlInvoke(t *testing.T) { - t.Run("Invoke", func(t *testing.T) { - t.Run("add package commands from kctrl", func(t *testing.T) { - testPlugin, err := plugin.NewPlugin(&cliapi.PluginDescriptor{ - Name: "test", - Description: "test", - Version: "v1.0.0", - Group: "test", - }) - assert.NoError(t, err) - assert.Equal(t, false, testPlugin.Cmd.HasAvailableSubCommands()) - - Invoke(testPlugin) - - assert.Equal(t, true, testPlugin.Cmd.HasAvailableSubCommands()) - assert.Contains(t, testPlugin.Cmd.UsageString(), "available Manage available packages") - assert.Contains(t, testPlugin.Cmd.UsageString(), "installed Manage installed packages") - assert.Contains(t, testPlugin.Cmd.UsageString(), "repository Manage package repositories") - }) - }) -} diff --git a/cmd/cli/plugin/package/kctrl/ui.go b/cmd/cli/plugin/package/kctrl/ui.go deleted file mode 100644 index 6f70fc6ad7..0000000000 --- a/cmd/cli/plugin/package/kctrl/ui.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package kctrl - -import ( - "fmt" - "io" - "strings" - - "github.com/aunum/log" - "github.com/cppforlife/go-cli-ui/ui" - uitable "github.com/cppforlife/go-cli-ui/ui/table" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" -) - -type AdapterUI struct { - ui.WriterUI - outWriter io.Writer - - outputFormat string - tableCount int -} - -// PrintLinef overrides go-cli-ui/ui.PrintLinef -// It is used to print lines, but excludes certain lines based on the pattern -func (adapterUI *AdapterUI) PrintLinef(pattern string, args ...interface{}) { - if strings.Contains(pattern, "Target cluster") { - return - } - message := fmt.Sprintf(pattern, args...) - _, err := fmt.Fprintln(adapterUI.outWriter, message) - if err != nil { - log.Error(err, "UI.PrintLinef failed (message='%s')", message) - } -} - -func (adapterUI *AdapterUI) SetOutputFormat(outputFormat string) { - adapterUI.outputFormat = outputFormat -} - -// PrintTable overrides go-cli-ui/ui.PrintTable -// It accepts a table and renders it based on the output format -// -//nolint:gocritic // Cannot change the function signature as it is defined in go-cli-ui -func (adapterUI *AdapterUI) PrintTable(table uitable.Table) { - outputFormat := adapterUI.outputFormat // copy outputFormat so that it doesn't get overwritten in next steps in cases of multiple tables - keys := []string{} - - adapterUI.tableCount++ - - // For json output, we want to print only 1 table to make sure that it doesn't become an invalid json - if adapterUI.tableCount > 1 && outputFormat == string(component.JSONOutputType) { - return - } - - for _, h := range table.Header { - if !h.Hidden { - keys = append(keys, strings.ToUpper(strings.ReplaceAll(h.Title, " ", "-"))) - } - } - - if table.Transpose { - if outputFormat != string(component.JSONOutputType) && outputFormat != string(component.YAMLOutputType) { - // For table output, we want to force the list table format for this part - outputFormat = string(component.ListTableOutputType) - } - } - - t := component.NewOutputWriter(adapterUI.outWriter, outputFormat, keys...) - - for _, row := range table.Rows { - var tRow []interface{} - for i, cell := range row { - if !table.Header[i].Hidden { - tRow = append(tRow, cell.Value()) - } - } - t.AddRow(tRow...) - } - - t.Render() -} - -func setOutputFormatFlag(cmd *cobra.Command, adapterUI *AdapterUI) { - for _, c := range cmd.Commands() { - if len(c.Commands()) > 1 { - setOutputFormatFlag(c, adapterUI) - } - var output string - if _, ok := c.Annotations["table"]; ok { - c.Flags().StringVarP(&output, "output", "o", "", "Output format (yaml|json|table), optional") - c.PreRun = func(_ *cobra.Command, args []string) { adapterUI.SetOutputFormat(output) } - } - } -} diff --git a/cmd/cli/plugin/package/kctrl/ui_test.go b/cmd/cli/plugin/package/kctrl/ui_test.go deleted file mode 100644 index 05a6ce059f..0000000000 --- a/cmd/cli/plugin/package/kctrl/ui_test.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package kctrl - -import ( - "bytes" - "testing" - - "github.com/cppforlife/go-cli-ui/ui" - uitable "github.com/cppforlife/go-cli-ui/ui/table" - "github.com/stretchr/testify/assert" -) - -func TestUI(t *testing.T) { - t.Run("PrintLinef", func(t *testing.T) { - t.Run("prints to outWriter with a trailing newline", func(t *testing.T) { - uiOutBuffer := bytes.NewBufferString("") - uiErrBuffer := bytes.NewBufferString("") - ui := ui.NewWriterUI(uiOutBuffer, uiErrBuffer, ui.NewNoopLogger()) - adapterUI := AdapterUI{WriterUI: *ui, outWriter: uiOutBuffer} - - adapterUI.PrintLinef("fake-line") - assert.Contains(t, "fake-line\n", uiOutBuffer.String()) - assert.Equal(t, "", uiErrBuffer.String()) - }) - - t.Run("doesn't print target cluster information", func(t *testing.T) { - uiOutBuffer := bytes.NewBufferString("") - uiErrBuffer := bytes.NewBufferString("") - ui := ui.NewWriterUI(uiOutBuffer, uiErrBuffer, ui.NewNoopLogger()) - adapterUI := AdapterUI{WriterUI: *ui, outWriter: uiOutBuffer} - - adapterUI.PrintLinef("Target cluster 127.0.0.1") - assert.Equal(t, "", uiOutBuffer.String()) - assert.Equal(t, "", uiErrBuffer.String()) - }) - }) - - t.Run("PrintTable", func(t *testing.T) { - t.Run("prints table", func(t *testing.T) { - uiOutBuffer := bytes.NewBufferString("") - uiErrBuffer := bytes.NewBufferString("") - ui := ui.NewWriterUI(uiOutBuffer, uiErrBuffer, ui.NewNoopLogger()) - adapterUI := AdapterUI{WriterUI: *ui, outWriter: uiOutBuffer} - - table := uitable.Table{ - Header: []uitable.Header{uitable.NewHeader("Header1"), uitable.NewHeader("Header2")}, - - Rows: [][]uitable.Value{ - {uitable.ValueString{S: "r1c1"}, uitable.ValueString{S: "r1c2"}}, - {uitable.ValueString{S: "r2c1"}, uitable.ValueString{S: "r2c2"}}, - }, - } - adapterUI.PrintTable(table) - - expected := ` - HEADER1 HEADER2 - r1c1 r1c2 - r2c1 r2c2 -` - - assert.Equal(t, expected, "\n"+uiOutBuffer.String()) - }) - - t.Run("prints table in yaml format", func(t *testing.T) { - uiOutBuffer := bytes.NewBufferString("") - uiErrBuffer := bytes.NewBufferString("") - ui := ui.NewWriterUI(uiOutBuffer, uiErrBuffer, ui.NewNoopLogger()) - adapterUI := AdapterUI{WriterUI: *ui, outWriter: uiOutBuffer} - - adapterUI.SetOutputFormat("yaml") - - table := uitable.Table{ - Header: []uitable.Header{uitable.NewHeader("Header1"), uitable.NewHeader("Header2")}, - - Rows: [][]uitable.Value{ - {uitable.ValueString{S: "r1c1"}, uitable.ValueString{S: "r1c2"}}, - {uitable.ValueString{S: "r2c1"}, uitable.ValueString{S: "r2c2"}}, - }, - } - adapterUI.PrintTable(table) - - expected := ` -- header1: r1c1 - header2: r1c2 -- header1: r2c1 - header2: r2c2 -` - - assert.Equal(t, expected, "\n"+uiOutBuffer.String()) - }) - }) -} diff --git a/cmd/cli/plugin/package/main.go b/cmd/cli/plugin/package/main.go deleted file mode 100644 index a9c4860f87..0000000000 --- a/cmd/cli/plugin/package/main.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - _ "k8s.io/client-go/plugin/pkg/client/auth" - - capdiscovery "github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/package/kctrl" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/kappclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "package", - Description: "Tanzu package management", - Group: cliapi.RunCmdGroup, - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, - DefaultFeatureFlags: DefaultFeatureFlagsForPackagePlugin, -} - -var logLevel int32 -var outputFormat string -var kubeConfig string - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - - if config.IsFeatureActivated(FeatureFlagPackagePluginKctrlCommandTree) { - kctrl.Invoke(p) - if err := p.Execute(); err != nil { - os.Exit(1) - } - return - } - - p.Cmd.PersistentFlags().Int32VarP(&logLevel, "verbose", "", 0, "Number for the log level verbosity(0-9)") - p.Cmd.PersistentFlags().StringVarP(&kubeConfig, "kubeconfig", "", "", "The path to the kubeconfig file, optional") - - p.AddCommands( - repositoryCmd, - packageInstallCmd, - packageAvailableCmd, - packageInstalledCmd, - ) - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -// getOutputFormat gets the desired output format for package commands that need the ListTable format -// for its output. -func getOutputFormat() string { - format := outputFormat - if format != string(component.JSONOutputType) && format != string(component.YAMLOutputType) { - // For table output, we want to force the list table format for this part - format = string(component.ListTableOutputType) - } - return format -} - -func isPackagingAPIAvailable(kubeCfgPath string) (bool, error) { - cfg, err := kappclient.GetKubeConfig(kubeCfgPath) - if err != nil { - return false, err - } - clusterQueryClient, err := capdiscovery.NewClusterQueryClientForConfig(cfg) - if err != nil { - log.Error(err, "failed to create a new instance of the cluster query builder") - return false, err - } - - apiGroup1 := capdiscovery.Group("packageMetadateAPIQuery", packagedatamodel.DataPackagingAPIName).WithVersions(packagedatamodel.PackagingAPIVersion).WithResource("packagemetadatas") - apiGroup2 := capdiscovery.Group("packageAPIQuery", packagedatamodel.DataPackagingAPIName).WithVersions(packagedatamodel.PackagingAPIVersion).WithResource("packages") - apiGroup3 := capdiscovery.Group("packageRepositoryAPIQuery", packagedatamodel.PackagingAPIName).WithVersions(packagedatamodel.PackagingAPIVersion).WithResource("packagerepositories") - apiGroup4 := capdiscovery.Group("packageInstallAPIQuery", packagedatamodel.PackagingAPIName).WithVersions(packagedatamodel.PackagingAPIVersion).WithResource("packageinstalls") - - return clusterQueryClient.Query(apiGroup1, apiGroup2, apiGroup3, apiGroup4).Execute() -} diff --git a/cmd/cli/plugin/package/openapischema/schema_default.go b/cmd/cli/plugin/package/openapischema/schema_default.go deleted file mode 100644 index 5836c307e4..0000000000 --- a/cmd/cli/plugin/package/openapischema/schema_default.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package openapischema provides utilities for working with openapi schema -package openapischema - -import ( - "bytes" - "reflect" - - "gopkg.in/yaml.v3" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" - structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" - "k8s.io/apimachinery/pkg/runtime" -) - -const Object = "object" - -// SchemaDefault returns a yaml byte array with values populated according to schema -func SchemaDefault(schema []byte) ([]byte, error) { - jsonSchemaProps := &apiextensions.JSONSchemaProps{} - - if err := yaml.Unmarshal(schema, jsonSchemaProps); err != nil { - return nil, err - } - s, err := structuralschema.NewStructural(jsonSchemaProps) - if err != nil { - return nil, err - } - unstructured := make(map[string]interface{}) - - schemaDefault(unstructured, s) - var b bytes.Buffer - yamlEncoder := yaml.NewEncoder(&b) - yamlEncoder.SetIndent(2) - if err := yamlEncoder.Encode(unstructured); err != nil { - return nil, err - } - if err := yamlEncoder.Close(); err != nil { - return nil, err - } - - return b.Bytes(), nil -} - -// schemaDefault does defaulting of x depending on default values in s. -// This is adopted from k8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting with 2 changes -// 1. Prevent deep copy of int as it panics -// 2. For type object depth first search to see if there is any property with default -// -//gocyclo:ignore -func schemaDefault(x interface{}, s *structuralschema.Structural) { - if s == nil { - return - } - - switch x := x.(type) { - case map[string]interface{}: - for k, prop := range s.Properties { //nolint - if prop.Default.Object == nil { - shouldCreateDefault := false - var b []bool - b = createDefault(&prop, b) //nolint:gosec - for _, x := range b { - if x { - shouldCreateDefault = x - break - } - } - if shouldCreateDefault { - prop.Default.Object = make(map[string]interface{}) - } else { - continue - } - } - if _, found := x[k]; !found || isNonNullableNull(x[k], &prop) { //nolint:gosec - if isKindInt(prop.Default.Object) { - x[k] = prop.Default.Object - } else { - x[k] = runtime.DeepCopyJSONValue(prop.Default.Object) - } - } - } - for k := range x { - if prop, found := s.Properties[k]; found { - schemaDefault(x[k], &prop) - } else if s.AdditionalProperties != nil { - if isNonNullableNull(x[k], s.AdditionalProperties.Structural) { - if isKindInt(s.AdditionalProperties.Structural.Default.Object) { - x[k] = s.AdditionalProperties.Structural.Default.Object - } else { - x[k] = runtime.DeepCopyJSONValue(s.AdditionalProperties.Structural.Default.Object) - } - } - schemaDefault(x[k], s.AdditionalProperties.Structural) - } - } - case []interface{}: - for i := range x { - if isNonNullableNull(x[i], s.Items) { - if isKindInt(s.Items.Default.Object) { - x[i] = s.Items.Default.Object - } else { - x[i] = runtime.DeepCopyJSONValue(s.Items.Default.Object) - } - } - schemaDefault(x[i], s.Items) - } - default: - // scalars, do nothing - } -} - -func isNonNullableNull(x interface{}, s *structuralschema.Structural) bool { - return x == nil && s != nil && !s.Generic.Nullable -} - -func isKindInt(src interface{}) bool { - if src != nil && reflect.TypeOf(src).Kind() == reflect.Int { - return true - } - return false -} - -func createDefault(structural *structuralschema.Structural, b []bool) []bool { - for _, v := range structural.Properties { //nolint:gocritic - // return true if there is a non-nested(not object) with a default value - if v.Type != Object && v.Default.Object != nil { - b = append(b, true) - return b - } - if v.Type == Object && v.Default.Object == nil && v.Properties != nil { - b = append(b, createDefault(&v, b)...) //nolint:gosec - } - } - b = append(b, false) - return b -} diff --git a/cmd/cli/plugin/package/openapischema/schema_default_test.go b/cmd/cli/plugin/package/openapischema/schema_default_test.go deleted file mode 100644 index 5945223c38..0000000000 --- a/cmd/cli/plugin/package/openapischema/schema_default_test.go +++ /dev/null @@ -1,358 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package openapischema - -import ( - "bytes" - "fmt" - "os" - "reflect" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/extensions/table" - . "github.com/onsi/gomega" - - "gopkg.in/yaml.v3" - structuralschema "k8s.io/apiextensions-apiserver/pkg/apiserver/schema" - "k8s.io/apimachinery/pkg/util/json" -) - -var _ = Describe("SchemaDefault", func() { - Context("When default openapi schema for contour is specified", func() { - It("SchemaDefault() should return a map object with defaults populated", func() { - contourSchema, err := os.Open("testdata/contourschema.yaml") - Expect(err).ToNot(HaveOccurred()) - defer contourSchema.Close() - - contourschema, err := os.ReadFile(contourSchema.Name()) - Expect(err).ToNot(HaveOccurred()) - - defaultValues, err := os.Open("testdata/contour-data-values.yaml") - Expect(err).ToNot(HaveOccurred()) - defer defaultValues.Close() - - expectedDefault, err := os.ReadFile(defaultValues.Name()) - Expect(err).ToNot(HaveOccurred()) - - schemadefaulted, err := SchemaDefault(contourschema) - Expect(err).ToNot(HaveOccurred()) - - gotMap := make(map[string]interface{}) - - err = yaml.Unmarshal(schemadefaulted, gotMap) - Expect(err).ToNot(HaveOccurred()) - - expectedMap := make(map[string]interface{}) - err = yaml.Unmarshal(expectedDefault, expectedMap) - Expect(err).ToNot(HaveOccurred()) - - if !reflect.DeepEqual(expectedMap, gotMap) { - Fail(fmt.Sprintf("Expected: \n %s \n\n Got: \n %s", expectedDefault, schemadefaulted)) - } - - }) - - }) - Context("When default openapi schema for grafana is specified", func() { - It("SchemaDefault() should return a map object with defaults populated", func() { - contourSchema, err := os.Open("testdata/grafanaschema.yaml") - Expect(err).ToNot(HaveOccurred()) - defer contourSchema.Close() - - contourschema, err := os.ReadFile(contourSchema.Name()) - Expect(err).ToNot(HaveOccurred()) - - defaultValues, err := os.Open("testdata/grafana-data-values.yaml") - Expect(err).ToNot(HaveOccurred()) - defer defaultValues.Close() - - expectedDefault, err := os.ReadFile(defaultValues.Name()) - Expect(err).ToNot(HaveOccurred()) - - schemadefaulted, err := SchemaDefault(contourschema) - Expect(err).ToNot(HaveOccurred()) - - gotMap := make(map[string]interface{}) - - err = yaml.Unmarshal(schemadefaulted, gotMap) - Expect(err).ToNot(HaveOccurred()) - - expectedMap := make(map[string]interface{}) - err = yaml.Unmarshal(expectedDefault, expectedMap) - Expect(err).ToNot(HaveOccurred()) - - if !reflect.DeepEqual(expectedMap, gotMap) { - Fail(fmt.Sprintf("Expected: \n %s \n\n Got: \n %s", expectedDefault, schemadefaulted)) - } - - }) - - }) - -}) - -// schemaDefault tests adopted from k8s.io/apiextensions-apiserver/pkg/apiserver/schema with modifications -var _ = Describe("schemaDefault", func() { - - type TestCase struct { - JSON string - Schema *structuralschema.Structural - Expected string - } - - DescribeTable("with", - func(t TestCase) { - var in interface{} - err := json.Unmarshal([]byte(t.JSON), &in) - Expect(err).ToNot(HaveOccurred()) - - var expected interface{} - err = json.Unmarshal([]byte(t.Expected), &expected) - Expect(err).ToNot(HaveOccurred()) - - schemaDefault(in, t.Schema) - if !reflect.DeepEqual(in, expected) { - var buf bytes.Buffer - enc := json.NewEncoder(&buf) - enc.SetIndent("", " ") - err := enc.Encode(in) - Expect(err).ToNot(HaveOccurred(), fmt.Sprintf("unexpected result mashalling error: %v", err)) - Fail(fmt.Sprintf("expected: %s\ngot: %s", t.Expected, buf.String())) - } - }, - - Entry("empty schema and null object returns null", TestCase{ - JSON: "null", - Schema: nil, - Expected: "null", - }), - Entry("unrelated schema for a scalar returns it back", TestCase{ - JSON: "4", - Expected: "4", - Schema: &structuralschema.Structural{ - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "foo"}, - }, - }, - }), - Entry("unrelated schema for a scalar array returns it back", TestCase{ - JSON: "[1,2]", - Expected: "[1,2]", - Schema: &structuralschema.Structural{ - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "foo"}, - }, - }, - }), - Entry("schema for object array returns array with missing defaults populated", TestCase{ - JSON: `[{"a":1},{"b":1},{"c":1}]`, - Expected: `[{"a":1,"b":"B","c":"C"},{"a":"A","b":1,"c":"C"},{"a":"A","b":"B","c":1}]`, - Schema: &structuralschema.Structural{ - Items: &structuralschema.Structural{ - Properties: map[string]structuralschema.Structural{ - "a": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "A"}, - }, - }, - "b": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "B"}, - }, - }, - "c": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "C"}, - }, - }, - }, - }, - }, - }), - Entry("schema for object, array, object and additional properties returns object with missing defaults populated", TestCase{ - JSON: `{"array":[{"a":1},{"b":2}],"object":{"a":1},"additionalProperties":{"x":{"a":1},"y":{"b":2}}}`, - Expected: `{"array":[{"a":1,"b":"B"},{"a":"A","b":2}],"object":{"a":1,"b":"O"},"additionalProperties":{"x":{"a":1,"b":"beta"},"y":{"a":"alpha","b":2}},"foo":"bar"}`, - Schema: &structuralschema.Structural{ - Properties: map[string]structuralschema.Structural{ - "array": { - Items: &structuralschema.Structural{ - Properties: map[string]structuralschema.Structural{ - "a": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "A"}, - }, - }, - "b": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "B"}, - }, - }, - }, - }, - }, - "object": { - Properties: map[string]structuralschema.Structural{ - "a": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "N"}, - }, - }, - "b": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "O"}, - }, - }, - }, - }, - "additionalProperties": { - Generic: structuralschema.Generic{ - AdditionalProperties: &structuralschema.StructuralOrBool{ - Structural: &structuralschema.Structural{ - Properties: map[string]structuralschema.Structural{ - "a": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "alpha"}, - }, - }, - "b": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "beta"}, - }, - }, - }, - }, - }, - }, - }, - "foo": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "bar"}, - }, - }, - }, - }, - }), - Entry("schema with empty and null array returns array with missing defaults populated", TestCase{ - JSON: `[{},{"a":1},{"a":0},{"a":0.0},{"a":""},{"a":null},{"a":[]},{"a":{}}]`, - Expected: `[{"a":"A"},{"a":1},{"a":0},{"a":0.0},{"a":""},{"a":"A"},{"a":[]},{"a":{}}]`, - Schema: &structuralschema.Structural{ - Items: &structuralschema.Structural{ - Properties: map[string]structuralschema.Structural{ - "a": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "A"}, - }, - }, - }, - }, - }, - }), - Entry("schema with null in a nullable list returns null", TestCase{ - JSON: `[null]`, - Expected: `[null]`, - Schema: &structuralschema.Structural{ - Generic: structuralschema.Generic{ - Nullable: true, - }, - Items: &structuralschema.Structural{ - Properties: map[string]structuralschema.Structural{ - "a": { - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "A"}, - }, - }, - }, - }, - }, - }), - Entry("schema with null in a non-nullable list returns list with default", TestCase{ - JSON: `[null]`, - Expected: `["A"]`, - Schema: &structuralschema.Structural{ - Generic: structuralschema.Generic{ - Nullable: false, - }, - Items: &structuralschema.Structural{ - Generic: structuralschema.Generic{ - Default: structuralschema.JSON{Object: "A"}, - }, - }, - }, - }), - Entry("schema with null in a nullable object returns it as is", TestCase{ - JSON: `{"a": null}`, - Expected: `{"a": null}`, - Schema: &structuralschema.Structural{ - Generic: structuralschema.Generic{}, - Properties: map[string]structuralschema.Structural{ - "a": { - Generic: structuralschema.Generic{ - Nullable: true, - Default: structuralschema.JSON{Object: "A"}, - }, - }, - }, - }, - }), - Entry("schema with null in a non-nullable object returns it with default populated", TestCase{ - JSON: `{"a": null}`, - Expected: `{"a": "A"}`, - Schema: &structuralschema.Structural{ - Generic: structuralschema.Generic{}, - Properties: map[string]structuralschema.Structural{ - "a": { - Generic: structuralschema.Generic{ - Nullable: false, - Default: structuralschema.JSON{Object: "A"}, - }, - }, - }, - }, - }), - Entry("schema with nullable object and additionalProperties returns it as is", TestCase{ - JSON: `{"a": null}`, - Expected: `{"a": null}`, - Schema: &structuralschema.Structural{ - Generic: structuralschema.Generic{ - AdditionalProperties: &structuralschema.StructuralOrBool{ - Structural: &structuralschema.Structural{ - Generic: structuralschema.Generic{ - Nullable: true, - Default: structuralschema.JSON{Object: "A"}, - }, - }, - }, - }, - }, - }), - Entry("schema with non-nullable object and additionalProperties returns it with default populated", TestCase{ - JSON: `{"a": null}`, - Expected: `{"a": "A"}`, - Schema: &structuralschema.Structural{ - Generic: structuralschema.Generic{ - AdditionalProperties: &structuralschema.StructuralOrBool{ - Structural: &structuralschema.Structural{ - Generic: structuralschema.Generic{ - Nullable: false, - Default: structuralschema.JSON{Object: "A"}, - }, - }, - }, - }, - }, - }), - Entry("schema with null and additionalProperties with unknown field returns it as is", TestCase{ - JSON: `{"a": null}`, - Expected: `{"a": null}`, - Schema: &structuralschema.Structural{ - Generic: structuralschema.Generic{ - AdditionalProperties: &structuralschema.StructuralOrBool{ - Bool: true, - }, - }, - }, - }), - ) - -}) diff --git a/cmd/cli/plugin/package/openapischema/suite_test.go b/cmd/cli/plugin/package/openapischema/suite_test.go deleted file mode 100644 index d9ac407495..0000000000 --- a/cmd/cli/plugin/package/openapischema/suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package openapischema - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestOpenapi(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Openapi Suite") -} diff --git a/cmd/cli/plugin/package/openapischema/testdata/contour-data-values.yaml b/cmd/cli/plugin/package/openapischema/testdata/contour-data-values.yaml deleted file mode 100644 index 569389c28f..0000000000 --- a/cmd/cli/plugin/package/openapischema/testdata/contour-data-values.yaml +++ /dev/null @@ -1,20 +0,0 @@ -certificates: - duration: 8760h - renewBefore: 360h - useCertManager: false -contour: - logLevel: info - replicas: 2 - useProxyProtocol: false -envoy: - hostNetwork: false - hostPorts: - enable: false - http: 80 - https: 443 - logLevel: info - service: - externalTrafficPolicy: Local - type: LoadBalancer - terminationGracePeriodSeconds: 300 -namespace: projectcontour diff --git a/cmd/cli/plugin/package/openapischema/testdata/contourschema.yaml b/cmd/cli/plugin/package/openapischema/testdata/contourschema.yaml deleted file mode 100644 index 78da60bc4c..0000000000 --- a/cmd/cli/plugin/package/openapischema/testdata/contourschema.yaml +++ /dev/null @@ -1,102 +0,0 @@ -type: object -additionalProperties: false -title: contour.community.tanzu.vmware.com.1.19.1 values schema -properties: - namespace: - type: string - description: The namespace in which to deploy Contour and Envoy. - default: projectcontour - contour: - type: object - description: Settings for the Contour component. - properties: - configFileContents: - type: object - additionalProperties: true - description: The YAML contents of the Contour config file. See https://projectcontour.io/docs/v1.19.1/configuration/#configuration-file for more information. - replicas: - type: integer - description: How many Contour pod replicas to have. - default: 2 - useProxyProtocol: - type: boolean - description: Whether to enable PROXY protocol for all Envoy listeners. - default: false - logLevel: - type: string - description: The Contour log level. Valid options are info and debug. - default: info - envoy: - type: object - description: Settings for the Envoy component. - properties: - service: - type: object - description: Envoy service settings. - properties: - type: - type: string - description: The type of Kubernetes service to provision for Envoy. - default: LoadBalancer - externalTrafficPolicy: - type: string - description: The external traffic policy for the Envoy service. - default: Local - annotations: - type: object - additionalProperties: string - description: Annotations to set on the Envoy service. - nodePorts: - type: object - description: NodePort settings for the Envoy service. If type is not NodePort, these settings are ignored. - properties: - http: - type: integer - description: If type == NodePort, the node port number to expose Envoy's HTTP listener on. If not specified, a node port will be auto-assigned by Kubernetes. - https: - type: integer - description: If type == NodePort, the node port number to expose Envoy's HTTPS listener on. If not specified, a node port will be auto-assigned by Kubernetes. - hostPorts: - type: object - description: Host port settings for the Envoy pods. - properties: - enable: - type: boolean - description: Whether to enable host ports. If false, http and https are ignored. - default: false - http: - type: integer - description: If enable == true, the host port number to expose Envoy's HTTP listener on. - default: 80 - https: - type: integer - description: If enable == true, the host port number to expose Envoy's HTTPS listener on. - default: 443 - hostNetwork: - type: boolean - description: Whether to enable host networking for the Envoy pods. - default: false - terminationGracePeriodSeconds: - type: integer - description: The termination grace period, in seconds, for the Envoy pods. - default: 300 - logLevel: - type: string - description: The Envoy log level. - default: info - certificates: - type: object - description: Settings for the TLS certificates for securing communication between Contour and Envoy. - properties: - useCertManager: - type: boolean - description: Whether to use cert-manager to provision TLS certificates for securing communication between Contour and Envoy. If false, the upstream Contour certgen job will be used to provision certificates. If true, the cert-manager addon must be installed in the cluster. - default: false - duration: - type: string - description: If using cert-manager, how long the certificates should be valid for. If useCertManager is false, this field is ignored. - default: 8760h - renewBefore: - type: string - description: If using cert-manager, how long before expiration the certificates should be renewed. If useCertManager is false, this field is ignored. - default: 360h diff --git a/cmd/cli/plugin/package/openapischema/testdata/grafana-data-values.yaml b/cmd/cli/plugin/package/openapischema/testdata/grafana-data-values.yaml deleted file mode 100644 index 2842a33d50..0000000000 --- a/cmd/cli/plugin/package/openapischema/testdata/grafana-data-values.yaml +++ /dev/null @@ -1,21 +0,0 @@ -namespace: grafana -grafana: - deployment: - replicas: 1 - service: - type: LoadBalancer - port: 80 - targetPort: 3000 - pvc: - accessMode: ReadWriteOnce - storage: "2Gi" - secret: - type: "Opaque" - admin_user: "admin" - admin_password: "admin" - -ingress: - enabled: true - virtual_host_fqdn: "grafana.system.tanzu" - prefix: "/" - servicePort: 80 diff --git a/cmd/cli/plugin/package/openapischema/testdata/grafanaschema.yaml b/cmd/cli/plugin/package/openapischema/testdata/grafanaschema.yaml deleted file mode 100644 index 054d31120e..0000000000 --- a/cmd/cli/plugin/package/openapischema/testdata/grafanaschema.yaml +++ /dev/null @@ -1,157 +0,0 @@ -title: grafana.community.tanzu.vmware.com.7.5.7 values schema -properties: - namespace: - type: string - description: The namespace in which to deploy Grafana. - default: grafana - grafana: - type: object - description: Grafana Kubernetes configuration. - properties: - deployment: - type: object - description: Grafana Deployment related configuration - properties: - replicas: - type: integer - description: Number of grafana replicas. - default: 1 - containers: - type: object - description: Grafana container configuration. - properties: - resources: - type: object - description: Grafana containers resource requirements (See Kubernetes OpenAPI Specification io.k8s.api.core.v1.ResourceRequirements) - additionalProperties: true - podAnnotations: - type: object - description: Grafana deployments pod annotations - additionalProperties: string - podLabels: - type: object - description: Grafana deployments pod labels - additionalProperties: string - k8sSidecar: - type: object - description: k8s-sidecar related configuration. - containers: - type: object - description: k8s-sidecar container configuration. - properties: - resources: - type: object - description: k8s-sidecar containers resource requirements (io.k8s.api.core.v1.ResourceRequirements) - additionalProperties: true - service: - type: object - description: Grafana service configuration. - properties: - type: - type: string - description: The type of Kubernetes service to provision for Grafana. (For vSphere set this to NodePort, For others set this to LoadBalancer) - default: LoadBalancer - port: - type: integer - description: The ports that are exposed by Grafana service. - default: 80 - targetPort: - type: integer - description: Target Port to access on the Grafana pods. - default: 3000 - annotations: - type: object - description: Grafana service annotations - additionalProperties: string - labels: - type: object - description: Grafana service pod labels - additionalProperties: string - config: - type: object - description: Grafana configuration. - properties: - grafana_ini: - type: object - description: The contents of the Grafana config file. See https://grafana.com/docs/grafana/latest/administration/configuration/ for more information. - default: "See default values file" - datasource_yaml: - type: object - description: The YAML contents of the Grafana datasource config file. See https://grafana.com/docs/grafana/latest/administration/provisioning/#example-data-source-config-file for more information. - default: "Includes default prometheus package as datasource." - dashboardProvider_yaml: - type: object - description: The YAML contents of the Grafana dashboard provider file. See https://grafana.com/docs/grafana/latest/administration/provisioning/#dashboards for more information. - default: "See default values file" - pvc: - type: object - description: Grafana's PVC configuration - properties: - annotations: - type: object - description: Grafana's persistent volume claim annotations - additionalProperties: string - storageClassName: - type: string - description: The name of the StorageClass to use for persistent volume claim. By default this is null and default provisioner is used - default: null - accessMode: - type: string - description: The name of the AccessModes to use for persistent volume claim. By default this is null and default provisioner is used - default: ReadWriteOnce - storage: - type: string - description: The storage size for persistent volume claim. - default: "2Gi" - secret: - type: object - description: Grafana user access related configuration. - properties: - type: - type: string - description: The Secret Type (io.k8s.api.core.v1.Secret.type) - default: "Opaque" - admin_user: - type: string - description: Username to access Grafana. - default: admin - admin_password: - type: string - description: Password to access Grafana. By default is null and grafana defaults this to "admin" - default: admin - ingress: - type: object - description: Grafana Ingress configuration. - properties: - enabled: - type: boolean - description: Whether to enable Grafana Ingress. Note that this requires contour. - default: true - virtual_host_fqdn: - type: string - description: Hostname for accessing grafana. - default: "grafana.system.tanzu" - prefix: - type: string - description: Path prefix for Grafana. - default: "/" - servicePort: - type: integer - description: Grafana service port to proxy traffic to. - default: 80 - tlsCertificate: - type: object - description: Grafana Ingress TLS certificate configuration. If skipped, a cert-manager cert will be issued and the cert-manager package must be installed on your cluster. - properties: - tls.crt: - type: string - description: Optional cert for ingress if you want to use your own TLS cert. A self signed cert is generated by default. Note that tls.crt is a key and not nested. - default: null - tls.key: - type: string - description: Optional cert private key for ingress if you want to use your own TLS cert. Note that tls.key is a key and not nested. - default: null - ca.crt: - type: string - description: Optional CA certificate. Note that ca.crt is a key and not nested. - default: null diff --git a/cmd/cli/plugin/package/package_available.go b/cmd/cli/plugin/package/package_available.go deleted file mode 100644 index d3116ff9ed..0000000000 --- a/cmd/cli/plugin/package/package_available.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var packageAvailableOp = packagedatamodel.NewPackageAvailableOptions() - -var packageAvailableCmd = &cobra.Command{ - Use: "available", - ValidArgs: []string{"list", "get"}, - Short: "Manage available packages", - Args: cobra.RangeArgs(1, 2), - PersistentPreRunE: packagingAvailabilityCheck, -} - -func init() { - packageAvailableCmd.PersistentFlags().StringVarP(&packageAvailableOp.Namespace, "namespace", "n", "default", "Namespace of packages, optional") - packageAvailableCmd.PersistentFlags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table), optional") -} - -func packagingAvailabilityCheck(_ *cobra.Command, _ []string) error { - found, err := isPackagingAPIAvailable(kubeConfig) - if err != nil { - return errors.Wrap(err, fmt.Sprintf("failed to check for the availability of '%s' API", packagedatamodel.PackagingAPIName)) - } - if !found { - return fmt.Errorf(packagedatamodel.PackagingAPINotAvailable, packagedatamodel.PackagingAPIName, packagedatamodel.PackagingAPIVersion) - } - - return nil -} diff --git a/cmd/cli/plugin/package/package_available_get.go b/cmd/cli/plugin/package/package_available_get.go deleted file mode 100644 index 5eba7af3d4..0000000000 --- a/cmd/cli/plugin/package/package_available_get.go +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - "io" - "os" - "path/filepath" - "strings" - - "github.com/aunum/log" - "github.com/pkg/errors" - "github.com/spf13/cobra" - apierrors "k8s.io/apimachinery/pkg/api/errors" - - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/package/openapischema" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/kappclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" -) - -var packageAvailableGetCmd = &cobra.Command{ - Use: "get PACKAGE_NAME or PACKAGE_NAME/VERSION", - Short: "Get details for an available package", - Long: "Get details for an available package or the openAPI schema of a package with a specific version", - Args: cobra.ExactArgs(1), - Example: ` - # Get package details for a package without specifying the version - tanzu package available get contour.tanzu.vmware.com --namespace test-ns - - # Get package details for a package with specified version - tanzu package available get contour.tanzu.vmware.com/1.15.1-tkg.1-vmware1 --namespace test-ns - - # Get openAPI schema of a package with specified version - tanzu package available get contour.tanzu.vmware.com/1.15.1-tkg.1-vmware1 --namespace test-ns --values-schema - - # Create default values.yaml for a package with specified version based on its openAPI schema - tanzu package available get contour.tanzu.vmware.com/1.15.1-tkg.1-vmware1 --namespace test-ns --generate-default-values-file`, - RunE: packageAvailableGet, - PreRunE: validatePackage, - SilenceUsage: true, -} - -func init() { - packageAvailableGetCmd.Flags().BoolVarP(&packageAvailableOp.ValuesSchema, "values-schema", "", false, "Values schema of the package, optional") - packageAvailableGetCmd.Flags().BoolVarP(&packageAvailableOp.GenerateDefaultValuesFile, "generate-default-values-file", "", false, "Generate default values from schema of the package, optional") - packageAvailableCmd.AddCommand(packageAvailableGetCmd) -} - -var pkgName string -var pkgVersion string - -func validatePackage(cmd *cobra.Command, args []string) error { - pkgNameVersion := strings.Split(args[0], "/") - if len(pkgNameVersion) == 2 { - pkgName = pkgNameVersion[0] - pkgVersion = pkgNameVersion[1] - } else if len(pkgNameVersion) == 1 { - pkgName = pkgNameVersion[0] - } else { - return fmt.Errorf("package should be of the format name or name/version") - } - return nil -} - -func packageAvailableGet(cmd *cobra.Command, args []string) error { - kc, kcErr := kappclient.NewKappClient(kubeConfig) - if kcErr != nil { - return kcErr - } - if packageAvailableOp.AllNamespaces { - packageAvailableOp.Namespace = "" - } - - if packageAvailableOp.GenerateDefaultValuesFile || packageAvailableOp.ValuesSchema { - if pkgVersion == "" { - return errors.New("version is required when --generate-default-values-file or --values-schema flag is true. Please specify /") - } - } - if packageAvailableOp.ValuesSchema { - if err := getValuesSchemaForPackage(packageAvailableOp.Namespace, pkgName, pkgVersion, kc, cmd.OutOrStdout()); err != nil { - return err - } - return nil - } - t, err := component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), getOutputFormat(), - fmt.Sprintf("Retrieving package details for %s...", args[0]), true) - if err != nil { - return err - } - - pkgMetadata, err := kc.GetPackageMetadataByName(pkgName, packageAvailableOp.Namespace) - if err != nil { - t.StopSpinner() - if apierrors.IsNotFound(err) { - log.Warningf("package '%s' does not exist in the '%s' namespace", pkgName, packageAvailableOp.Namespace) - return nil - } - return err - } - var pkg *kapppkg.Package - - if pkgVersion != "" { - pkg, err = kc.GetPackage(fmt.Sprintf("%s.%s", pkgName, pkgVersion), packageAvailableOp.Namespace) - if err != nil { - if apierrors.IsNotFound(err) { - return errors.Errorf("package '%s/%s' does not exist in the '%s' namespace", pkgName, pkgVersion, packageAvailableOp.Namespace) - } - return err - } - t.SetKeys("name", "version", "released-at", "display-name", "short-description", "package-provider", "minimum-capacity-requirements", - "long-description", "maintainers", "release-notes", "license", "support", "category") - t.AddRow(pkg.Spec.RefName, pkg.Spec.Version, pkg.Spec.ReleasedAt, pkgMetadata.Spec.DisplayName, pkgMetadata.Spec.ShortDescription, - pkgMetadata.Spec.ProviderName, pkg.Spec.CapactiyRequirementsDescription, pkgMetadata.Spec.LongDescription, pkgMetadata.Spec.Maintainers, - pkg.Spec.ReleaseNotes, pkg.Spec.Licenses, pkgMetadata.Spec.SupportDescription, pkgMetadata.Spec.Categories) - - t.RenderWithSpinner() - } else { - t.SetKeys("name", "display-name", "short-description", "package-provider", "long-description", "maintainers", "support", "category") - t.AddRow(pkgMetadata.Name, pkgMetadata.Spec.DisplayName, pkgMetadata.Spec.ShortDescription, - pkgMetadata.Spec.ProviderName, pkgMetadata.Spec.LongDescription, pkgMetadata.Spec.Maintainers, pkgMetadata.Spec.SupportDescription, pkgMetadata.Spec.Categories) - - t.RenderWithSpinner() - } - - if packageAvailableOp.GenerateDefaultValuesFile { - return generateDefaultValuesForPackage(pkg) - } - return nil -} - -func getValuesSchemaForPackage(namespace, name, version string, kc kappclient.Client, writer io.Writer) error { - pkg, pkgGetErr := kc.GetPackage(fmt.Sprintf("%s.%s", name, version), namespace) - if pkgGetErr != nil { - if apierrors.IsNotFound(pkgGetErr) { - return errors.Errorf("package '%s/%s' does not exist in the '%s' namespace", name, version, namespace) - } - return pkgGetErr - } - - t, err := component.NewOutputWriterWithSpinner(writer, outputFormat, - fmt.Sprintf("Retrieving package details for %s/%s...", name, version), true) - if err != nil { - return err - } - - var parseErr error - if len(pkg.Spec.ValuesSchema.OpenAPIv3.Raw) == 0 { - t.StopSpinner() - log.Warningf("package '%s/%s' does not have any user configurable values in the '%s' namespace", pkgName, pkgVersion, packageAvailableOp.Namespace) - return nil - } - dataValuesSchemaParser, parseErr := packageclient.NewValuesSchemaParser(pkg.Spec.ValuesSchema) - if parseErr != nil { - return parseErr - } - parsedProperties, parseErr := dataValuesSchemaParser.ParseProperties() - if parseErr != nil { - return parseErr - } - - t.SetKeys("KEY", "DEFAULT", "TYPE", "DESCRIPTION") - for _, v := range parsedProperties { - t.AddRow(v.Key, v.Default, v.Type, v.Description) - } - t.RenderWithSpinner() - - return nil -} - -func generateDefaultValuesForPackage(pkg *kapppkg.Package, valuesFile ...*os.File) error { - if pkg == nil { - // should not happen - return errors.New("pkg is nil") - } - - if len(pkg.Spec.ValuesSchema.OpenAPIv3.Raw) == 0 { - log.Warningf("package '%s/%s' does not have any user configurable values in the '%s' namespace", pkgName, pkgVersion, packageAvailableOp.Namespace) - return nil - } - - fileNamePrefix := "" - pkgNameTokens := strings.Split(pkgName, ".") - if len(pkgNameTokens) >= 1 { - fileNamePrefix = fmt.Sprintf("%s-", pkgNameTokens[0]) - } - valuesFileName := fmt.Sprintf("%sdefault-values.yaml", fileNamePrefix) - var valuesFileToUse *os.File - - if len(valuesFile) > 0 && valuesFile[0] != nil { - // caller is responsible for closing file - valuesFileToUse = valuesFile[0] - } else { - cwd, err := os.Getwd() - if err != nil { - return err - } - valuesFileToUse, err = os.Create(filepath.Join(cwd, valuesFileName)) - if err != nil { - return err - } - defer valuesFileToUse.Close() - } - - defaultValues, err := openapischema.SchemaDefault(pkg.Spec.ValuesSchema.OpenAPIv3.Raw) - - if err != nil { - return err - } - _, err = valuesFileToUse.Write(defaultValues) - if err != nil { - return err - } - log.Infof("\nCreated default values file at %s", valuesFileToUse.Name()) - return nil -} diff --git a/cmd/cli/plugin/package/package_available_get_test.go b/cmd/cli/plugin/package/package_available_get_test.go deleted file mode 100644 index d9f5b95826..0000000000 --- a/cmd/cli/plugin/package/package_available_get_test.go +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "bytes" - "fmt" - "os" - "reflect" - - "gopkg.in/yaml.v3" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" -) - -// This is a dummy package schema copied from external-dns -var rawValidDummyPackageSchema = ` -additionalProperties: false -properties: - accelerator: - additionalProperties: true - description: Accelerator configuration - properties: {} - type: object - api_portal: - additionalProperties: true - description: API Portal configuration - properties: {} - type: object - appliveview: - additionalProperties: true - description: App Live View configuration - properties: {} - type: object - buildservice: - description: Build Service configuration - properties: - ca_cert_data: - description: tbs registry ca certificate (used for self signed registry) - type: string - kp_default_repository: - description: docker repository (required) - examples: - - registry.io/build-service - type: string - kp_default_repository_password: - description: registry password (required) - examples: - - password - type: string - kp_default_repository_username: - description: registry username (required) - examples: - - janedoe@vmware.com - type: string - tanzunet_password: - description: tanzunet registry password (required for dependency updater - feature) - examples: - - password - type: string - tanzunet_username: - description: tanzunet registry username (required for dependency updater - feature) - examples: - - janedoe@vmware.com - type: string - type: object - cnrs: - additionalProperties: true - description: Cloud Native Runtimes configuration - properties: {} - type: object - image_policy_webhook: - additionalProperties: true - description: Image Policy Webhook configuration - properties: {} - type: object - install_cert_manager: - default: true - description: Install cert-manager - type: boolean - install_flux: - default: true - description: Install FluxCD source-controller - type: boolean - install_tekton: - default: true - description: Install Tekton - type: boolean - learningcenter: - additionalProperties: true - description: Learning Center configuration - properties: {} - type: object - ootb_supply_chain_basic: - additionalProperties: true - description: OOTB Supply Chain Basic configuration - properties: {} - type: object - ootb_supply_chain_testing: - additionalProperties: true - description: OOTB Supply Chain Testing configuration - properties: {} - type: object - ootb_supply_chain_testing_scanning: - additionalProperties: true - description: OOTB Supply Chain Testing Scanning configuration - type: object - properties: - dummyProperty-1: - default: dummyDefault - description: this is for testing purposes - type: string - dummyProperty-2: - description: this is for testing purposes - type: object - properties: {} - profile: - default: full - description: 'Profile to install. Valid values: full, dev-light' - type: string - tap_gui: - additionalProperties: true - description: TAP GUI configuration - type: object -type: object -` - -var _ = Describe("PackageAvailableGet", func() { - var ( - kappClient *fakes.KappClient - pkgNamespace = "default" - pkgName = "external-dns.tanzu.vmware.com" - pkgVersion = "1.2.1+vmware.1-tkg.2-zshippable" - ) - - Context("getValuesSchemaForPackage()", func() { - BeforeEach(func() { - kappClient = &fakes.KappClient{} - }) - - It("should return error if package does not exist", func() { - kappClient.GetPackageReturns(nil, - apierrors.NewNotFound(kapppkg.Resource("package"), "dummyPackage")) - - var buf bytes.Buffer - err := getValuesSchemaForPackage(pkgNamespace, pkgName, pkgVersion, kappClient, &buf) - Expect(err).To(HaveOccurred()) - }) - - It("should not return error if schema is empty", func() { - kappClient.GetPackageReturns(&kapppkg.Package{ - ObjectMeta: metav1.ObjectMeta{ - Name: pkgName, - Namespace: pkgNamespace, - }, - Spec: kapppkg.PackageSpec{ - RefName: pkgName, - Version: pkgVersion, - ValuesSchema: kapppkg.ValuesSchema{ - OpenAPIv3: runtime.RawExtension{ - Raw: []byte{}, - }, - }, - }, - }, nil) - - var buf bytes.Buffer - err := getValuesSchemaForPackage(pkgNamespace, pkgName, pkgVersion, kappClient, &buf) - Expect(err).To(BeNil()) - }) - - It("should return the values schema without any errors", func() { - kappClient.GetPackageReturns(&kapppkg.Package{ - ObjectMeta: metav1.ObjectMeta{ - Name: pkgName, - Namespace: pkgNamespace, - }, - Spec: kapppkg.PackageSpec{ - RefName: pkgName, - Version: pkgVersion, - ValuesSchema: kapppkg.ValuesSchema{ - OpenAPIv3: runtime.RawExtension{ - Raw: []byte(rawValidDummyPackageSchema), - }, - }, - }, - }, nil) - - var buf bytes.Buffer - err := getValuesSchemaForPackage(pkgNamespace, pkgName, pkgVersion, kappClient, &buf) - Expect(err).NotTo(HaveOccurred()) - fmt.Println(buf.String()) // Print out the output in terminal to help debugging if nothing printed out - Expect(buf.String()).NotTo(BeEmpty()) - }) - }) - - Describe("generateDefaultValuesForPackage", func() { - It("should generate default values", func() { - pkg := &kapppkg.Package{ - ObjectMeta: metav1.ObjectMeta{ - Name: pkgName, - Namespace: pkgNamespace, - }, - Spec: kapppkg.PackageSpec{ - RefName: pkgName, - Version: pkgVersion, - ValuesSchema: kapppkg.ValuesSchema{ - OpenAPIv3: runtime.RawExtension{ - Raw: []byte(rawValidDummyPackageSchema), - }, - }, - }, - } - defaultValues, err := os.Open("testdata/test-default-values.yaml") - Expect(err).ToNot(HaveOccurred()) - defer defaultValues.Close() - - expectedValue, err := os.ReadFile(defaultValues.Name()) - Expect(err).ToNot(HaveOccurred()) - - f, err := os.CreateTemp("", "default-values.yaml") - Expect(err).ToNot(HaveOccurred()) - defer f.Close() - - err = generateDefaultValuesForPackage(pkg, f) - Expect(err).ToNot(HaveOccurred()) - gotValues := make(map[string]interface{}) - - values, err := os.ReadFile(f.Name()) - Expect(err).ToNot(HaveOccurred()) - - err = yaml.Unmarshal(values, gotValues) - Expect(err).ToNot(HaveOccurred()) - - expectedMap := make(map[string]interface{}) - err = yaml.Unmarshal(expectedValue, expectedMap) - Expect(err).ToNot(HaveOccurred()) - - Expect(reflect.DeepEqual(expectedMap, gotValues)).To(BeTrue()) - }) - }) -}) diff --git a/cmd/cli/plugin/package/package_available_list.go b/cmd/cli/plugin/package/package_available_list.go deleted file mode 100644 index 655c2b2061..0000000000 --- a/cmd/cli/plugin/package/package_available_list.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - "github.com/aunum/log" - "github.com/k14s/semver/v4" - "github.com/spf13/cobra" - "go.uber.org/multierr" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/kappclient" -) - -var packageAvailableListCmd = &cobra.Command{ - Use: "list or list PACKAGE_NAME", - Short: "List available packages", - Args: cobra.MaximumNArgs(1), - Example: ` - # List available packages across all namespaces - tanzu package available list -A - - # List all versions for available package from specified namespace - tanzu package available list contour.tanzu.vmware.com --namespace test-ns`, - RunE: packageAvailableList, - SilenceUsage: true, -} - -func init() { - packageAvailableListCmd.Flags().BoolVarP(&packageAvailableOp.AllNamespaces, "all-namespaces", "A", false, "If present, list packages across all namespaces, optional") - packageAvailableCmd.AddCommand(packageAvailableListCmd) -} - -func packageAvailableList(cmd *cobra.Command, args []string) error { - kc, err := kappclient.NewKappClient(kubeConfig) - if err != nil { - return err - } - if packageAvailableOp.AllNamespaces { - packageAvailableOp.Namespace = "" - } - - if len(args) == 0 { - t, err := component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat, - "Retrieving available packages...", true) - if err != nil { - return err - } - packageMetadataList, err := kc.ListPackageMetadata(packageAvailableOp.Namespace) - if err != nil { - return err - } - if packageAvailableOp.AllNamespaces { - t.SetKeys("NAME", "DISPLAY-NAME", "SHORT-DESCRIPTION", "LATEST-VERSION", "NAMESPACE") - } else { - t.SetKeys("NAME", "DISPLAY-NAME", "SHORT-DESCRIPTION", "LATEST-VERSION") - } - var multiGetVerErr error - for i := range packageMetadataList.Items { - pkg := packageMetadataList.Items[i] - latestVersion, getVerErr := getPackageLatestVersion(pkg.Name, pkg.Namespace, kc) - // It is safe to use multierr.Append() even when getVerErr is nil. The API handles that case. - multiGetVerErr = multierr.Append(multiGetVerErr, getVerErr) - if packageAvailableOp.AllNamespaces { - t.AddRow(pkg.Name, pkg.Spec.DisplayName, pkg.Spec.ShortDescription, latestVersion, pkg.Namespace) - } else { - t.AddRow(pkg.Name, pkg.Spec.DisplayName, pkg.Spec.ShortDescription, latestVersion) - } - } - t.RenderWithSpinner() - - // If there are any errors when getting the latest package version, we do not want to error out the command and - // block user from moving forward. When an error occurs, the latest version will be empty. What we want is to - // show a warning message to explain what the empty latest version means. - if multiGetVerErr != nil { - log.Warning("\nUnable to get the latest version for all packages, some packages' latest version fields" + - " are empty. Please try again or use `tanzu package available list ` to get the version.") - } - return nil - } - t, err := component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat, - fmt.Sprintf("Retrieving package versions for %s...", args[0]), true) - if err != nil { - return err - } - packageAvailableOp.PackageName = args[0] - pkgs, err := kc.ListPackages(packageAvailableOp.PackageName, packageAvailableOp.Namespace) - if err != nil { - return err - } - if packageAvailableOp.AllNamespaces { - t.SetKeys("NAME", "VERSION", "RELEASED-AT", "NAMESPACE") - } else { - t.SetKeys("NAME", "VERSION", "RELEASED-AT") - } - for i := range pkgs.Items { - pkg := pkgs.Items[i] - if packageAvailableOp.AllNamespaces { - t.AddRow(pkg.Spec.RefName, pkg.Spec.Version, pkg.Spec.ReleasedAt, pkg.Namespace) - } else { - t.AddRow(pkg.Spec.RefName, pkg.Spec.Version, pkg.Spec.ReleasedAt) - } - } - t.RenderWithSpinner() - return nil -} - -// getPackageLatestVersion returns the latest version of a particular package under a namespace -func getPackageLatestVersion(packageName, namespace string, kc kappclient.Client) (string, error) { - pkgs, listErr := kc.ListPackages(packageName, namespace) - if listErr != nil { - return "", listErr - } - var latest *semver.Version - var parseErr error - for i := range pkgs.Items { - pkg := pkgs.Items[i] - current, err := semver.Make(pkg.Spec.Version) - if err != nil { - // If we are not able to parse the version of current package, record the error and continue - parseErr = multierr.Append(parseErr, err) - continue - } - if latest == nil { - latest = ¤t - } else if latest.LT(current) { - latest = ¤t - } - } - - // If we are not able to get and compare versions from all packages, latest is nil - if latest == nil { - return "", parseErr - } - return latest.String(), nil -} diff --git a/cmd/cli/plugin/package/package_available_list_test.go b/cmd/cli/plugin/package/package_available_list_test.go deleted file mode 100644 index e2b56641b8..0000000000 --- a/cmd/cli/plugin/package/package_available_list_test.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package main - -import ( - "fmt" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" -) - -var _ = Describe("PackageAvailableList", func() { - var ( - kappClient *fakes.KappClient - ) - - Context("getPackageLatestVersion()", func() { - var ( - incorrectVersion = "incorrect-version-format" - pkgName = "cert-manager.tanzu.vmware.com" - pkgNamespace = "default" - ) - - BeforeEach(func() { - kappClient = &fakes.KappClient{} - }) - - It("should return the latest package version if no errors", func() { - // tanzu package version does not include leading `v` - pkgV1 := "1.1.0+vmware.1-tkg.2-zshippable" - pkgV2 := "1.1.0+vmware.2-tkg.2-zshippable" - pkgV3 := "1.1.0+vmware.2-tkg.3-zshippable" - pkgV4 := "1.1.1+vmware.1-tkg.2-zshippable" - pkgV5 := "1.1.2+vmware.1-tkg.2-zshippable" - pkgV6 := "1.2.0+vmware.1-tkg.2-zshippable" - - objMeta := metav1.ObjectMeta{ - Name: pkgName, - Namespace: pkgNamespace, - } - - kappClient.ListPackagesReturns(&v1alpha1.PackageList{ - Items: []v1alpha1.Package{ - { - ObjectMeta: objMeta, - Spec: v1alpha1.PackageSpec{ - RefName: pkgName, - Version: pkgV1, - }, - }, - { - ObjectMeta: objMeta, - Spec: v1alpha1.PackageSpec{ - RefName: pkgName, - Version: pkgV2, - }, - }, - { - ObjectMeta: objMeta, - Spec: v1alpha1.PackageSpec{ - RefName: pkgName, - Version: pkgV3, - }, - }, - { - ObjectMeta: objMeta, - Spec: v1alpha1.PackageSpec{ - RefName: pkgName, - Version: pkgV4, - }, - }, - { - ObjectMeta: objMeta, - Spec: v1alpha1.PackageSpec{ - RefName: pkgName, - Version: pkgV5, - }, - }, - { - ObjectMeta: objMeta, - Spec: v1alpha1.PackageSpec{ - RefName: pkgName, - Version: pkgV6, - }, - }, - }, - }, nil) - - latestVersion, err := getPackageLatestVersion(pkgName, pkgNamespace, kappClient) - Expect(err).NotTo(HaveOccurred()) - Expect(latestVersion).To(Equal(pkgV6)) - }) - - It("should still return the latest package version even if there is one package version which does not"+ - " follow the semver standard", func() { - // tanzu package version does not include leading `v` - pkgV1 := "1.2.1+vmware.1-tkg.2-zshippable" - pkgV3 := "1.3.0+vmware.1-tkg.2-zshippable" - - objMeta := metav1.ObjectMeta{ - Name: pkgName, - Namespace: pkgNamespace, - } - - kappClient.ListPackagesReturns(&v1alpha1.PackageList{ - Items: []v1alpha1.Package{ - { - ObjectMeta: objMeta, - Spec: v1alpha1.PackageSpec{ - RefName: pkgName, - Version: pkgV1, - }, - }, - { - ObjectMeta: objMeta, - Spec: v1alpha1.PackageSpec{ - RefName: pkgName, - Version: incorrectVersion, - }, - }, - { - ObjectMeta: objMeta, - Spec: v1alpha1.PackageSpec{ - RefName: pkgName, - Version: pkgV3, - }, - }, - }, - }, nil) - - latestVersion, err := getPackageLatestVersion(pkgName, pkgNamespace, kappClient) - Expect(err).NotTo(HaveOccurred()) - Expect(latestVersion).To(Equal(pkgV3)) - }) - - It("should still return empty version if there errors to parse all package versions", func() { - objMeta := metav1.ObjectMeta{ - Name: pkgName, - Namespace: pkgNamespace, - } - - kappClient.ListPackagesReturns(&v1alpha1.PackageList{ - Items: []v1alpha1.Package{ - { - ObjectMeta: objMeta, - Spec: v1alpha1.PackageSpec{ - RefName: pkgName, - Version: incorrectVersion, - }, - }, - { - ObjectMeta: objMeta, - Spec: v1alpha1.PackageSpec{ - RefName: pkgName, - Version: incorrectVersion, - }, - }, - }, - }, nil) - - latestVersion, err := getPackageLatestVersion(pkgName, pkgNamespace, kappClient) - Expect(err).To(HaveOccurred()) - Expect(latestVersion).To(BeEmpty()) - }) - - It("should return empty version if there is an error to list packages", func() { - kappClient.ListPackagesReturns(&v1alpha1.PackageList{ - Items: []v1alpha1.Package{}, - }, fmt.Errorf("dummy error to list packages")) - - latestVersion, err := getPackageLatestVersion(pkgName, pkgNamespace, kappClient) - Expect(err).To(HaveOccurred()) - Expect(latestVersion).To(BeEmpty()) - }) - }) -}) diff --git a/cmd/cli/plugin/package/package_install.go b/cmd/cli/plugin/package/package_install.go deleted file mode 100644 index f8041c9569..0000000000 --- a/cmd/cli/plugin/package/package_install.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var packageInstallOp = packagedatamodel.NewPackageOptions() - -var packageInstallCmd = &cobra.Command{ - Use: "install INSTALLED_PACKAGE_NAME --package-name PACKAGE_NAME --version VERSION", - Short: "Install a package", - Args: cobra.ExactArgs(1), - Example: ` - # Install package contour with installed package name as 'contour-pkg' with specified version and without waiting for package reconciliation to complete - tanzu package install contour-pkg --package-name contour.tanzu.vmware.com --namespace test-ns --version 1.15.1-tkg.1-vmware1 --wait=false - - # Install package contour with kubeconfig flag and waiting for package reconciliation to complete - tanzu package install contour-pkg --package-name contour.tanzu.vmware.com --namespace test-ns --version 1.15.1-tkg.1-vmware1 --kubeconfig path/to/kubeconfig`, - RunE: packageInstall, - SilenceUsage: true, - PersistentPreRunE: packagingAvailabilityCheck, -} - -func init() { - packageInstallCmd.Flags().StringVarP(&packageInstallOp.PackageName, "package-name", "p", "", "Name of the package to be installed") - packageInstallCmd.Flags().StringVarP(&packageInstallOp.Version, "version", "v", "", "Version of the package to be installed") - packageInstallCmd.Flags().BoolVarP(&packageInstallOp.CreateNamespace, "create-namespace", "", false, "Create namespace if the target namespace does not exist, optional") - packageInstallCmd.Flags().StringVarP(&packageInstallOp.Namespace, "namespace", "n", "default", "Namespace indicates the location of the repository from which the package is retrieved") - packageInstallCmd.Flags().StringVarP(&packageInstallOp.ServiceAccountName, "service-account-name", "", "", "Name of an existing service account used to install underlying package contents, optional") - packageInstallCmd.Flags().StringVarP(&packageInstallOp.ValuesFile, "values-file", "f", "", "The path to the configuration values file, optional") - packageInstallCmd.Flags().BoolVarP(&packageInstallOp.Wait, "wait", "", true, "Wait for the package reconciliation to complete, optional. To disable wait, specify --wait=false") - packageInstallCmd.Flags().DurationVarP(&packageInstallOp.PollInterval, "poll-interval", "", packagedatamodel.DefaultPollInterval, "Time interval between subsequent polls of package reconciliation status, optional") - packageInstallCmd.Flags().DurationVarP(&packageInstallOp.PollTimeout, "poll-timeout", "", packagedatamodel.DefaultPollTimeout, "Timeout value for polls of package reconciliation status, optional") - packageInstallCmd.MarkFlagRequired("package-name") //nolint - packageInstallCmd.MarkFlagRequired("version") //nolint -} - -func packageInstall(cmd *cobra.Command, args []string) error { - packageInstallOp.PkgInstallName = args[0] - - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - - return pkgClient.InstallPackageSync(packageInstallOp, packagedatamodel.OperationTypeInstall) -} diff --git a/cmd/cli/plugin/package/package_installed.go b/cmd/cli/plugin/package/package_installed.go deleted file mode 100644 index 909e451df1..0000000000 --- a/cmd/cli/plugin/package/package_installed.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var packageInstalledOp = packagedatamodel.NewPackageOptions() - -var packageInstalledCmd = &cobra.Command{ - Use: "installed", - ValidArgs: []string{"list", "create", "delete", "update", "get"}, - Short: "Manage installed packages", - Args: cobra.RangeArgs(1, 2), - PersistentPreRunE: packagingAvailabilityCheck, -} diff --git a/cmd/cli/plugin/package/package_installed_create.go b/cmd/cli/plugin/package/package_installed_create.go deleted file mode 100644 index 34d0102d41..0000000000 --- a/cmd/cli/plugin/package/package_installed_create.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var packageInstalledCreateCmd = &cobra.Command{ - Use: "create INSTALLED_PACKAGE_NAME --package-name PACKAGE_NAME --version VERSION", - Short: "Install a package", - Args: cobra.ExactArgs(1), - RunE: packageInstall, - SilenceUsage: true, -} - -func init() { - packageInstalledCreateCmd.Flags().StringVarP(&packageInstallOp.PackageName, "package-name", "p", "", "Name of the package to be installed") - packageInstalledCreateCmd.Flags().StringVarP(&packageInstallOp.Version, "version", "v", "", "Version of the package to be installed") - packageInstalledCreateCmd.Flags().BoolVarP(&packageInstallOp.CreateNamespace, "create-namespace", "", false, "Create namespace if the target namespace does not exist, optional") - packageInstalledCreateCmd.Flags().StringVarP(&packageInstallOp.Namespace, "namespace", "n", "default", "Target namespace to install the package, optional") - packageInstalledCreateCmd.Flags().StringVarP(&packageInstallOp.ServiceAccountName, "service-account-name", "", "", "Name of an existing service account used to install underlying package contents, optional") - packageInstalledCreateCmd.Flags().StringVarP(&packageInstallOp.ValuesFile, "values-file", "f", "", "The path to the configuration values file, optional") - packageInstalledCreateCmd.Flags().BoolVarP(&packageInstallOp.Wait, "wait", "", true, "Wait for the package reconciliation to complete, optional") - packageInstalledCreateCmd.Flags().DurationVarP(&packageInstallOp.PollInterval, "poll-interval", "", packagedatamodel.DefaultPollInterval, "Time interval between subsequent polls of package reconciliation status, optional") - packageInstalledCreateCmd.Flags().DurationVarP(&packageInstallOp.PollTimeout, "poll-timeout", "", packagedatamodel.DefaultPollTimeout, "Timeout value for polls of package reconciliation status, optional") - packageInstalledCreateCmd.MarkFlagRequired("package-name") //nolint - packageInstalledCreateCmd.MarkFlagRequired("version") //nolint - packageInstalledCmd.AddCommand(packageInstalledCreateCmd) -} diff --git a/cmd/cli/plugin/package/package_installed_delete.go b/cmd/cli/plugin/package/package_installed_delete.go deleted file mode 100644 index 7e56ad0eb7..0000000000 --- a/cmd/cli/plugin/package/package_installed_delete.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var packageInstalledDeleteCmd = &cobra.Command{ - Use: "delete INSTALLED_PACKAGE_NAME", - Short: "Delete an installed package", - Long: "Remove the installed package and almost all resources installed as part of installation of the package from the cluster. Namespaces created during installation of the package, do not automatically get deleted at the time of package uninstallation.", - Args: cobra.ExactArgs(1), - Example: ` - # Delete installed package with name 'contour-pkg' from specified namespace - tanzu package installed delete contour-pkg -n test-ns`, - RunE: packageUninstall, - SilenceUsage: true, -} - -func init() { - packageInstalledDeleteCmd.Flags().StringVarP(&packageInstalledOp.Namespace, "namespace", "n", "default", "Target namespace from which the package should be deleted, optional") - packageInstalledDeleteCmd.Flags().DurationVarP(&packageInstalledOp.PollInterval, "poll-interval", "", packagedatamodel.DefaultPollInterval, "Time interval between subsequent polls of package deletion status, optional") - packageInstalledDeleteCmd.Flags().DurationVarP(&packageInstalledOp.PollTimeout, "poll-timeout", "", packagedatamodel.DefaultPollTimeout, "Timeout value for polls of package deletion status, optional") - packageInstalledDeleteCmd.Flags().BoolVarP(&packageInstalledOp.SkipPrompt, "yes", "y", false, "Delete installed package without asking for confirmation, optional") - packageInstalledCmd.AddCommand(packageInstalledDeleteCmd) -} - -func packageUninstall(cmd *cobra.Command, args []string) error { - packageInstalledOp.PkgInstallName = args[0] - - if !packageInstalledOp.SkipPrompt { - if err := component.AskForConfirmation(fmt.Sprintf("Deleting installed package '%s' in namespace '%s'. Are you sure?", - packageInstalledOp.PkgInstallName, packageInstalledOp.Namespace)); err != nil { - return err - } - } - - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - - return pkgClient.UninstallPackageSync(packageInstalledOp) -} diff --git a/cmd/cli/plugin/package/package_installed_get.go b/cmd/cli/plugin/package/package_installed_get.go deleted file mode 100644 index 6f0fb77560..0000000000 --- a/cmd/cli/plugin/package/package_installed_get.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "bufio" - "fmt" - "os" - - "github.com/aunum/log" - "github.com/spf13/cobra" - apierrors "k8s.io/apimachinery/pkg/api/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/kappclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var packageInstalledGetCmd = &cobra.Command{ - Use: "get INSTALLED_PACKAGE_NAME", - Short: "Get details for an installed package", - Args: cobra.ExactArgs(1), - Example: ` - # Get package details for installed package with name 'contour-pkg' in specified namespace - tanzu package installed get contour-pkg --namespace test-ns`, - RunE: packageInstalledGet, - SilenceUsage: true, -} - -func init() { - packageInstalledGetCmd.Flags().StringVarP(&packageInstalledOp.Namespace, "namespace", "n", "default", "Namespace for installed package CR, optional") - packageInstalledGetCmd.Flags().StringVarP(&packageInstalledOp.ValuesFile, "values-file", "f", "", "The path to the configuration values file, optional") - packageInstalledGetCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table), optional") - packageInstalledCmd.AddCommand(packageInstalledGetCmd) -} - -func packageInstalledGet(cmd *cobra.Command, args []string) error { - kc, err := kappclient.NewKappClient(kubeConfig) - if err != nil { - return err - } - - pkgName = args[0] - packageInstalledOp.PkgInstallName = pkgName - t, err := component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), getOutputFormat(), - fmt.Sprintf("Retrieving installation details for %s...", pkgName), true) - if err != nil { - return err - } - - pkg, err := kc.GetPackageInstall(packageInstalledOp.PkgInstallName, packageInstalledOp.Namespace) - if err != nil { - t.StopSpinner() - if apierrors.IsNotFound(err) { - log.Warningf("installed package '%s' does not exist in namespace '%s'", pkgName, packageInstalledOp.Namespace) - return nil - } - return err - } - - if packageInstalledOp.ValuesFile != "" { - packageInstalledOp.SecretName = fmt.Sprintf(packagedatamodel.SecretName, packageInstalledOp.PkgInstallName, packageInstalledOp.Namespace) - f, err := os.Create(packageInstalledOp.ValuesFile) - if err != nil { - return err - } - defer f.Close() - w := bufio.NewWriter(f) - - dataValue := "" - for _, value := range pkg.Spec.Values { - if value.SecretRef == nil { - continue - } - s, err := kc.GetSecretValue(value.SecretRef.Name, packageInstalledOp.Namespace) - if err != nil { - return err - } - - stringValue := string(s) - if len(stringValue) < 3 { - dataValue += packagedatamodel.YamlSeparator - dataValue += "\n" - } - if len(stringValue) >= 3 && stringValue[:3] != packagedatamodel.YamlSeparator { - dataValue += packagedatamodel.YamlSeparator - dataValue += "\n" - } - dataValue += string(s) - } - if _, err = fmt.Fprintf(w, "%s", dataValue); err != nil { - return err - } - w.Flush() - return nil - } - - t.SetKeys("name", "package-name", "package-version", "status", "conditions", "useful-error-message") - t.AddRow(pkg.Name, pkg.Spec.PackageRef.RefName, pkg.Status.Version, - pkg.Status.FriendlyDescription, pkg.Status.Conditions, pkg.Status.UsefulErrorMessage) - - t.RenderWithSpinner() - - return nil -} diff --git a/cmd/cli/plugin/package/package_installed_list.go b/cmd/cli/plugin/package/package_installed_list.go deleted file mode 100644 index c07d526bb2..0000000000 --- a/cmd/cli/plugin/package/package_installed_list.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/kappclient" -) - -var packageInstalledListCmd = &cobra.Command{ - Use: "list", - Short: "List installed packages", - Args: cobra.NoArgs, - Example: ` - # List installed packages across all namespaces - tanzu package installed list -A - - # List installed packages from specified namespace - tanzu package installed list --namespace test-ns`, - RunE: packageInstalledList, - SilenceUsage: true, -} - -func init() { - packageInstalledListCmd.Flags().BoolVarP(&packageInstalledOp.AllNamespaces, "all-namespaces", "A", false, "If present, list packages across all namespaces, optional") - packageInstalledListCmd.Flags().StringVarP(&packageInstalledOp.Namespace, "namespace", "n", "default", "Namespace for installed package CR, optional") - packageInstalledListCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table), optional") - packageInstalledCmd.AddCommand(packageInstalledListCmd) -} - -func packageInstalledList(cmd *cobra.Command, args []string) error { - kc, err := kappclient.NewKappClient(kubeConfig) - if err != nil { - return err - } - if packageInstalledOp.AllNamespaces { - packageInstalledOp.Namespace = "" - } - t, err := component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat, - "Retrieving installed packages...", true) - if err != nil { - return err - } - - pkgInstalledList, err := kc.ListPackageInstalls(packageInstalledOp.Namespace) - if err != nil { - return err - } - - if packageInstalledOp.AllNamespaces { - t.SetKeys("NAME", "PACKAGE-NAME", "PACKAGE-VERSION", "STATUS", "NAMESPACE") - } else { - t.SetKeys("NAME", "PACKAGE-NAME", "PACKAGE-VERSION", "STATUS") - } - for i := range pkgInstalledList.Items { - pkg := pkgInstalledList.Items[i] - if packageInstalledOp.AllNamespaces { - t.AddRow(pkg.Name, pkg.Spec.PackageRef.RefName, pkg.Status.Version, - pkg.Status.FriendlyDescription, pkg.Namespace) - } else { - t.AddRow(pkg.Name, pkg.Spec.PackageRef.RefName, pkg.Status.Version, - pkg.Status.FriendlyDescription) - } - } - t.RenderWithSpinner() - return nil -} diff --git a/cmd/cli/plugin/package/package_installed_update.go b/cmd/cli/plugin/package/package_installed_update.go deleted file mode 100644 index c9397c259b..0000000000 --- a/cmd/cli/plugin/package/package_installed_update.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var packageInstalledUpdateCmd = &cobra.Command{ - Use: "update INSTALLED_PACKAGE_NAME", - Short: "Update an installed package", - Args: cobra.ExactArgs(1), - Example: ` - # Update installed package with name 'mypkg' with some version to version '3.0.0-rc.1' in specified namespace - tanzu package installed update mypkg --version 3.0.0-rc.1 --namespace test-ns`, - RunE: packageUpdate, - SilenceUsage: true, -} - -func init() { - packageInstalledUpdateCmd.Flags().StringVarP(&packageInstalledOp.Version, "version", "v", "", "The version which installed package needs to be updated to, optional") - packageInstalledUpdateCmd.Flags().StringVarP(&packageInstalledOp.ValuesFile, "values-file", "f", "", "The path to the configuration values file, optional") - packageInstalledUpdateCmd.Flags().BoolVarP(&packageInstalledOp.Install, "install", "", false, "Install package if the installed package does not exist, optional") - packageInstalledUpdateCmd.Flags().StringVarP(&packageInstalledOp.PackageName, "package-name", "p", "", "The public name for the package, optional") - packageInstalledUpdateCmd.Flags().StringVarP(&packageInstalledOp.Namespace, "namespace", "n", "default", "The namespace to locate the installed package which needs to be updated") - packageInstalledUpdateCmd.Flags().BoolVarP(&packageInstalledOp.Wait, "wait", "", true, "Wait for the package reconciliation to complete, optional. To disable wait, specify --wait=false") - packageInstalledUpdateCmd.Flags().DurationVarP(&packageInstalledOp.PollInterval, "poll-interval", "", packagedatamodel.DefaultPollInterval, "Time interval between subsequent polls of package reconciliation status, optional") - packageInstalledUpdateCmd.Flags().DurationVarP(&packageInstalledOp.PollTimeout, "poll-timeout", "", packagedatamodel.DefaultPollTimeout, "Timeout value for polls of package reconciliation status, optional") - packageInstalledCmd.AddCommand(packageInstalledUpdateCmd) -} - -func packageUpdate(cmd *cobra.Command, args []string) error { - packageInstalledOp.PkgInstallName = args[0] - - if packageInstalledOp.Version == "" && packageInstalledOp.ValuesFile == "" { - return errors.New("please provide --version and/or --values-file for updating the installed package") - } - - if packageInstalledOp.Install { - if packageInstalledOp.PackageName == "" { - return errors.New("--package-name is required when --install flag is declared") - } - if packageInstalledOp.Version == "" { - return errors.New("--version is required when --install flag is declared") - } - } - - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - - return pkgClient.UpdatePackageSync(packageInstalledOp, packagedatamodel.OperationTypeUpdate) -} diff --git a/cmd/cli/plugin/package/package_suite_test.go b/cmd/cli/plugin/package/package_suite_test.go deleted file mode 100644 index 97af9b367e..0000000000 --- a/cmd/cli/plugin/package/package_suite_test.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package main - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestPackage(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Package Suite") -} diff --git a/cmd/cli/plugin/package/repository.go b/cmd/cli/plugin/package/repository.go deleted file mode 100644 index 207512e505..0000000000 --- a/cmd/cli/plugin/package/repository.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var repoOp = packagedatamodel.NewRepositoryOptions() - -var repositoryCmd = &cobra.Command{ - Use: "repository", - Short: "Repository operations", - ValidArgs: []string{"add", "list", "get", "delete", "update"}, - Args: cobra.RangeArgs(1, 3), - Long: `Add, list, get or delete a package repository for Tanzu packages. A package repository is a collection of packages that are grouped together into an imgpkg bundle.`, - PersistentPreRunE: packagingAvailabilityCheck, -} - -func init() { - repositoryCmd.PersistentFlags().StringVarP(&repoOp.Namespace, "namespace", "n", "default", "Namespace for repository command, optional") -} diff --git a/cmd/cli/plugin/package/repository_add.go b/cmd/cli/plugin/package/repository_add.go deleted file mode 100644 index 1eb12b7a79..0000000000 --- a/cmd/cli/plugin/package/repository_add.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var repositoryAddCmd = &cobra.Command{ - Use: "add REPOSITORY_NAME --url REPOSITORY_URL", - Short: "Add a package repository", - Args: cobra.ExactArgs(1), - Example: ` - # Add a repository in specified namespace which does not exist - tanzu package repository add repo --url projects-stg.registry.vmware.com/tkg/standard-repo:v1.0.0 --namespace test-ns --create-namespace`, - RunE: repositoryAdd, - SilenceUsage: true, -} - -func init() { - repositoryAddCmd.Flags().StringVarP(&repoOp.RepositoryURL, "url", "", "", "OCI registry url for package repository bundle") - repositoryAddCmd.Flags().BoolVarP(&repoOp.CreateNamespace, "create-namespace", "", false, "Create namespace if the target namespace does not exist, optional") - repositoryAddCmd.Flags().BoolVarP(&repoOp.Wait, "wait", "", true, "Wait for the package repository reconciliation to complete, optional. To disable wait, specify --wait=false") - repositoryAddCmd.Flags().DurationVarP(&repoOp.PollInterval, "poll-interval", "", packagedatamodel.DefaultPollInterval, "Time interval between subsequent polls of package repository reconciliation status, optional") - repositoryAddCmd.Flags().DurationVarP(&repoOp.PollTimeout, "poll-timeout", "", packagedatamodel.DefaultPollTimeout, "Timeout value for polls of package repository reconciliation status, optional") - repositoryAddCmd.MarkFlagRequired("url") //nolint - repositoryCmd.AddCommand(repositoryAddCmd) -} - -func repositoryAdd(_ *cobra.Command, args []string) error { - repoOp.RepositoryName = args[0] - - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - - return pkgClient.AddRepositorySync(repoOp, packagedatamodel.OperationTypeInstall) -} diff --git a/cmd/cli/plugin/package/repository_delete.go b/cmd/cli/plugin/package/repository_delete.go deleted file mode 100644 index 621279759d..0000000000 --- a/cmd/cli/plugin/package/repository_delete.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var repositoryDeleteCmd = &cobra.Command{ - Use: "delete REPOSITORY_NAME", - Short: "Delete a package repository", - Args: cobra.ExactArgs(1), - Example: ` - # Delete a repository in specified namespace - tanzu package repository delete repo --namespace test-ns`, - RunE: repositoryDelete, - SilenceUsage: true, -} - -func init() { - repositoryDeleteCmd.Flags().BoolVarP(&repoOp.IsForceDelete, "force", "f", false, "Force deletion of the package repository, optional") - repositoryDeleteCmd.Flags().BoolVarP(&repoOp.Wait, "wait", "", true, "Wait for the package repository reconciliation to complete, optional. To disable wait, specify --wait=false") - repositoryDeleteCmd.Flags().DurationVarP(&repoOp.PollInterval, "poll-interval", "", packagedatamodel.DefaultPollInterval, "Time interval between subsequent polls of package repository reconciliation status, optional") - repositoryDeleteCmd.Flags().DurationVarP(&repoOp.PollTimeout, "poll-timeout", "", packagedatamodel.DefaultPollTimeout, "Timeout value for polls of package repository reconciliation status, optional") - repositoryDeleteCmd.Flags().BoolVarP(&repoOp.SkipPrompt, "yes", "y", false, "Delete package repository without asking for confirmation, optional") - repositoryCmd.AddCommand(repositoryDeleteCmd) -} - -func repositoryDelete(cmd *cobra.Command, args []string) error { - if len(args) == 1 { - repoOp.RepositoryName = args[0] - } else { - return errors.New("incorrect number of input parameters. Usage: tanzu package repository delete REPO_NAME [FLAGS]") - } - - if !repoOp.SkipPrompt { - if err := component.AskForConfirmation(fmt.Sprintf("Deleting package repository '%s' in namespace '%s'. Are you sure?", - repoOp.RepositoryName, repoOp.Namespace)); err != nil { - return err - } - } - - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - - return pkgClient.DeleteRepositorySync(repoOp) -} diff --git a/cmd/cli/plugin/package/repository_get.go b/cmd/cli/plugin/package/repository_get.go deleted file mode 100644 index 50f810ca5b..0000000000 --- a/cmd/cli/plugin/package/repository_get.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" -) - -var repositoryGetCmd = &cobra.Command{ - Use: "get REPOSITORY_NAME", - Short: "Get details for a package repository", - Args: cobra.ExactArgs(1), - Example: ` - # Get details for a repository in specified namespace - tanzu package repository get repo --namespace test-ns`, - RunE: repositoryGet, - SilenceUsage: true, -} - -func init() { - repositoryGetCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table), optional") - repositoryCmd.AddCommand(repositoryGetCmd) -} - -func repositoryGet(cmd *cobra.Command, args []string) error { - if len(args) == 1 { - repoOp.RepositoryName = args[0] - } else { - return errors.New("incorrect number of input parameters. Usage: tanzu package repository get REPOSITORY_NAME [FLAGS]") - } - - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - t, err := component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), getOutputFormat(), - fmt.Sprintf("Retrieving repository %s...", repoOp.RepositoryName), true) - if err != nil { - return err - } - - packageRepository, err := pkgClient.GetRepository(repoOp) - if err != nil || packageRepository == nil { - t.StopSpinner() - return err - } - - repository, tag, err := packageclient.GetCurrentRepositoryAndTagInUse(packageRepository) - if err != nil { - t.StopSpinner() - return err - } - - t.SetKeys("name", "version", "repository", "tag", "status", "reason") - t.AddRow(packageRepository.Name, packageRepository.ResourceVersion, repository, tag, - packageRepository.Status.FriendlyDescription, packageRepository.Status.UsefulErrorMessage) - - t.RenderWithSpinner() - return nil -} diff --git a/cmd/cli/plugin/package/repository_list.go b/cmd/cli/plugin/package/repository_list.go deleted file mode 100644 index 46f1fc9225..0000000000 --- a/cmd/cli/plugin/package/repository_list.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var repositoryListCmd = &cobra.Command{ - Use: "list", - Short: "List package repositories", - Args: cobra.NoArgs, - Example: ` - # List repositories across all namespaces - tanzu package repository list -A - - # List installed packages from default namespace - tanzu package repository list`, - RunE: repositoryList, - SilenceUsage: true, -} - -func init() { - repositoryListCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table), optional") - repositoryListCmd.Flags().BoolVarP(&repoOp.AllNamespaces, "all-namespaces", "A", false, "If present, list the package repositories across all namespaces, optional") - repositoryCmd.AddCommand(repositoryListCmd) -} - -func repositoryList(cmd *cobra.Command, _ []string) error { - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - - if repoOp.AllNamespaces { - repoOp.Namespace = "" - } - - var t component.OutputWriterSpinner - - if repoOp.AllNamespaces { - t, err = component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat, - "Retrieving repositories...", true, "NAME", "REPOSITORY", "TAG", "STATUS", "DETAILS", "NAMESPACE") - } else { - t, err = component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat, "Retrieving repositories...", true, - "NAME", "REPOSITORY", "TAG", "STATUS", "DETAILS") - } - if err != nil { - return err - } - - packageRepositoryList, err := pkgClient.ListRepositories(repoOp) - if err != nil { - t.StopSpinner() - return err - } - for i := range packageRepositoryList.Items { - packageRepository := packageRepositoryList.Items[i] - status := packageRepository.Status.FriendlyDescription - details := packageRepository.Status.UsefulErrorMessage - imageRepository, tag, _ := packageclient.GetCurrentRepositoryAndTagInUse(&packageRepository) - if len(status) > packagedatamodel.ShortDescriptionMaxLength { - status = fmt.Sprintf("%s...", status[:packagedatamodel.ShortDescriptionMaxLength]) - } - if len(details) > packagedatamodel.ShortDescriptionMaxLength { - details = fmt.Sprintf("%s...", details[:packagedatamodel.ShortDescriptionMaxLength]) - } - - if repoOp.AllNamespaces { - t.AddRow( - packageRepository.Name, - imageRepository, - tag, - status, - details, - packageRepository.Namespace) - } else { - t.AddRow( - packageRepository.Name, - imageRepository, - tag, - status, - details) - } - } - t.RenderWithSpinner() - - return nil -} diff --git a/cmd/cli/plugin/package/repository_update.go b/cmd/cli/plugin/package/repository_update.go deleted file mode 100644 index 289e456536..0000000000 --- a/cmd/cli/plugin/package/repository_update.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var repositoryUpdateCmd = &cobra.Command{ - Use: "update REPOSITORY_NAME --url REPOSITORY_URL", - Short: "Update a package repository", - Args: cobra.ExactArgs(1), - Example: ` - # Update repository in default namespace - tanzu package repository update repo --url projects-stg.registry.vmware.com/tkg/standard-repo:v1.0.1 --namespace test-ns`, - RunE: repositoryUpdate, - SilenceUsage: true, -} - -func init() { - repositoryUpdateCmd.Flags().StringVarP(&repoOp.RepositoryURL, "url", "", "", "OCI registry url for package repository bundle") - repositoryUpdateCmd.Flags().BoolVarP(&repoOp.CreateRepository, "create", "", false, "Creates the package repository if it does not exist, optional") - repositoryUpdateCmd.Flags().BoolVarP(&repoOp.CreateNamespace, "create-namespace", "", false, "Create namespace if the target namespace does not exist, optional") - repositoryUpdateCmd.Flags().BoolVarP(&repoOp.Wait, "wait", "", true, "Wait for the package repository reconciliation to complete, optional. To disable wait, specify --wait=false") - repositoryUpdateCmd.Flags().DurationVarP(&repoOp.PollInterval, "poll-interval", "", packagedatamodel.DefaultPollInterval, "Time interval between subsequent polls of package repository reconciliation status, optional") - repositoryUpdateCmd.Flags().DurationVarP(&repoOp.PollTimeout, "poll-timeout", "", packagedatamodel.DefaultPollTimeout, "Timeout value for polls of package repository reconciliation status, optional") - repositoryUpdateCmd.MarkFlagRequired("url") //nolint - repositoryCmd.AddCommand(repositoryUpdateCmd) -} - -func repositoryUpdate(_ *cobra.Command, args []string) error { - repoOp.RepositoryName = args[0] - - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - - return pkgClient.UpdateRepositorySync(repoOp, packagedatamodel.OperationTypeUpdate) -} diff --git a/cmd/cli/plugin/package/test/config/assets/certs-for-skip-tls.yml b/cmd/cli/plugin/package/test/config/assets/certs-for-skip-tls.yml deleted file mode 100644 index f079645776..0000000000 --- a/cmd/cli/plugin/package/test/config/assets/certs-for-skip-tls.yml +++ /dev/null @@ -1,121 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: registry-certs - namespace: registry -type: Opaque -stringData: - # Certs and key in this secret generated for `registry-svc.registry.svc.cluster.local` using the bosh cli. - # The second cert in the `registry-server.crt` cert chain must NOT match the ca cert in config-test/config-map.yml. - # This is done to test that we are skipping TLS verification - - # Bosh cli config used: - # - # --- - # variables: - # - name: ca_cert - # type: certificate - # options: - # is_ca: true - # common_name: alt-generated-ca - # - name: server_certs - # type: certificate - # options: - # ca: ca_cert - # common_name: registry-svc.registry.svc.cluster.local - - registry.crt: | - -----BEGIN CERTIFICATE----- - MIIEnDCCAwSgAwIBAgIQcqEu0783kvj4xpCv7/nN1jANBgkqhkiG9w0BAQsFADBB - MQwwCgYDVQQGEwNVU0ExFjAUBgNVBAoTDUNsb3VkIEZvdW5kcnkxGTAXBgNVBAMT - EGFsdC1nZW5lcmF0ZWQtY2EwHhcNMjEwMzE4MTgxMzAzWhcNMjIwMzE4MTgxMzAz - WjAmMQwwCgYDVQQGEwNVU0ExFjAUBgNVBAoTDUNsb3VkIEZvdW5kcnkwggGiMA0G - CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC6blUPHsV7ZXNfNwZE7qWe+DXn6epT - keHECMsmIcO+JWJLQGxQv+fLz0AeSolQ3Ek11hBCPabtQiINvO+JVZMQkaqIgHHY - 16z7iOXw7X/Hju14j5f5BX0B6ezIPcr6495HyEWUO/g+WN35vRtUGiCw0gtFyNDI - ZF5oQBY7srF/SNi+70/kfH4e61dL+osoUjBp2L+EGA0lKwOQb/p1G1v6+T6g8IoG - +gvbpYT4Y/K/9bEBTo7KzvxpO4sbfIm1mh7WpzELazz96E2+X181ZHGyMFF5qzCK - oowfYgUVsdVJR0Nf3SR5p6gkt9VFCerZlILR+1ktg6kZj+qiKEnc8axyuZp5qdUA - fwopF9AzGjbCLBEHM8Kg7s05+4OhdV6iDHBFEnPe2nKMvFZqS44CN7UTDGsT+1Xu - TYgxAIZQ3B7MwlvyKkUnO/63NBPH1y4g+oKHE4pbhdqjrC6Yn9kCG7y5H/3NPMi0 - XUV/I9cUkUiO9l91zf96Uu5DpTi1FtA4+oMCAwEAAaOBqjCBpzAOBgNVHQ8BAf8E - BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4E - FgQU0OP/6bjld/fUVCMTSZOXRy3ooF4wHwYDVR0jBBgwFoAUt8UJIL/r23duTzYy - Gji8dRJqzUQwMgYDVR0RBCswKYIncmVnaXN0cnktc3ZjLnJlZ2lzdHJ5LnN2Yy5j - bHVzdGVyLmxvY2FsMA0GCSqGSIb3DQEBCwUAA4IBgQCSG87wg+pk3pXigtM9tML7 - Ay4Sro8ZsXwL/3/zjAjSbLATM3FHDy/DBoiLBn00kCDfXIIuNeEb4tFABDJ/7LUF - VDKHiZO6FZP14iDbbg74+l2GyzhvKeRrwAOjHkwbmH9TMYGUaN19C/a0x0UQCzpB - WQlbaEv1S8PO7+HT71aDC27vwz59X96gikPumP/3/FuZbi11MO0PQ5OxOmT9PYvr - ShQAx873rLm25EaHrUbsBkooHwQaHXzDXHRcPX2L0Nhnvlh+29suHaR/rl1sRPfU - Qy31xBTsZVPPBFDx+540fgRCDc04qnrLfCnWusIAwsbLfujqeUhht5eyDeOOt4Vo - 3asFrbWYeDKXpq4YYjKpoig7NuZLp3Al7R0qJ1ndhB8kxF3ciqAL1rfy/6a7rwG4 - BgbueATAWDVQebaUDLQ/KsPFI9ZgF8rSHi7vmh9x8H9iW1kseL6xuQXvQeeTLjo5 - F9kOQ3F1x8ux8zU8L7PCwoNw5SjyUaIKIy56cAijTZ8= - -----END CERTIFICATE----- - -----BEGIN CERTIFICATE----- - MIIEbzCCAtegAwIBAgIQV0K0Bs50Mpoa65OZi8JTZjANBgkqhkiG9w0BAQsFADBB - MQwwCgYDVQQGEwNVU0ExFjAUBgNVBAoTDUNsb3VkIEZvdW5kcnkxGTAXBgNVBAMT - EGFsdC1nZW5lcmF0ZWQtY2EwHhcNMjEwMzE4MTcxMDI4WhcNMjIwMzE4MTcxMDI4 - WjBBMQwwCgYDVQQGEwNVU0ExFjAUBgNVBAoTDUNsb3VkIEZvdW5kcnkxGTAXBgNV - BAMTEGFsdC1nZW5lcmF0ZWQtY2EwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGK - AoIBgQC+Jlr6kSSsNYVqzBIdgeOXVWrEVpIz3RuR/nposJb3E8L+wOtvT0v8YAu7 - 9BlJNVQ7aYlNeRYmE08LkClg50v5E5kBizAfRBH8o2UpooZlJ8T6esyqHQEJsaRU - 3PYqWBP1qscqLgxvEFdr2Mlhfh3OCpg+XypSgDYEorJ2nNKMBnjA9xKVFN5+z132 - YFcW4xhLCoz5maRPhyLCF7WcI8Xyt3BfShD444azJlL7L18V2BXSSq+o2QK9zKBx - 0gERNn8fKd6cLo9jwOWomXgPZTCr7I01L/k8XjjlB1cIQ6eQtPukNWWDD1ztWmxl - nxXf9H/KeHhm9RGlt+ZKAUQu8Ahu7D2hF0uJ2z1+hPyJ5PTHcghwyNWvZCFle43m - S5f1ktzbJEfsQc9tOyKfBeU3xEF6ga8o7/w3GMphgomdqY1ws5Pdw2yvH0+k9wQm - 6OUJmFRbHnOAXAE/3jLDKV4yuKc70cm83ExA/YEYk8MmRofS1so7/+rjU6c1IJ64 - oF8Js+kCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w - HQYDVR0OBBYEFLfFCSC/69t3bk82Mho4vHUSas1EMB8GA1UdIwQYMBaAFLfFCSC/ - 69t3bk82Mho4vHUSas1EMA0GCSqGSIb3DQEBCwUAA4IBgQBlg/M09dSBdYh1iNeQ - NQGUI92TvKvbIPaF0xs9E3wqtj0C3kWOQtBLVTc8Ns7YkN9OgXEtndjKkwLfj4Bt - InEJMPrAq1ssdUTC4vSqGbFTp92lmg2VAd1/UElGu/RyK4aHIzmOfptmCNpV66IJ - zhxdx6/dm//yTZxSTC7jgYJCKBpTVkAXAzQ3unO4o8et6gDQPhEsM80lKDMLgqB7 - D1Y/y1NwTkG5ZR87srNNgiWwAwJE3a0u5+5/UEOzVzBHuREZY90v+LZ/XYWOYP7h - OFzyO80euoMDimz1L8iMNuAkbXBEhQNVv8vJVnYcyaOQeFCg6jD+/AFBQx05ZE84 - K/J+XWpLZ8dbzQBsXRhwF2QQk/6slioSFJsps8d0hakSHRBI/x+qEyctIxKhiP7d - Q+RgXJUoW+/GxzB0F/1HKTFwVmKxjKgwJYOa3uSPj12PO3yh/EaIDhbLvVy096qg - kQ0XINjn/bG3Xj64FDYtkgEBLtsWLNYeduHbrTETRdJTVSo= - -----END CERTIFICATE----- - registry.key: | - -----BEGIN RSA PRIVATE KEY----- - MIIG5AIBAAKCAYEAum5VDx7Fe2VzXzcGRO6lnvg15+nqU5HhxAjLJiHDviViS0Bs - UL/ny89AHkqJUNxJNdYQQj2m7UIiDbzviVWTEJGqiIBx2Nes+4jl8O1/x47teI+X - +QV9AensyD3K+uPeR8hFlDv4Pljd+b0bVBogsNILRcjQyGReaEAWO7Kxf0jYvu9P - 5Hx+HutXS/qLKFIwadi/hBgNJSsDkG/6dRtb+vk+oPCKBvoL26WE+GPyv/WxAU6O - ys78aTuLG3yJtZoe1qcxC2s8/ehNvl9fNWRxsjBReaswiqKMH2IFFbHVSUdDX90k - eaeoJLfVRQnq2ZSC0ftZLYOpGY/qoihJ3PGscrmaeanVAH8KKRfQMxo2wiwRBzPC - oO7NOfuDoXVeogxwRRJz3tpyjLxWakuOAje1EwxrE/tV7k2IMQCGUNwezMJb8ipF - Jzv+tzQTx9cuIPqChxOKW4Xao6wumJ/ZAhu8uR/9zTzItF1FfyPXFJFIjvZfdc3/ - elLuQ6U4tRbQOPqDAgMBAAECggGAFBpvq6i6zNqcvUi2sVo2m9TSI0bzEL3rZXM5 - TMxZSjjHx6uTwoVfHngjxuBsvD502oxRxoLVbEI0X9zey6VhrWi3xe5r2GExcxJJ - EVja7Y75BoYdcinoV/t8n/8h0zodLwpmjlyFIVv9279Loh8LJWYQ9x53fRRtpbo7 - a4aSY1JcpQIzUEUoaHciO7wxo1BxjghkZn8dc8OWp82baWNg4Mhdu4cUqznta2sG - 0q4ccByzUJvDBBWb3FEiZ/1e8ClFOORv4EetqrOccdLfo65U0GEAo9Bxf+HG6GqN - 2BJfp++ITyY8O82FzgAP+vgxOopSnaaJa/jq0nZM8mMz70AD4Ehbhiudic0RLBbT - rm30YVj8VoswLoC6rWZmMmNMPhwW3bI4BKqw0siIvnA9Js5rIng06gMoeWdpmm7d - ZV71bx0j+tS5Nqf2aPXlt5d/83DilrvYuU0Rs7yjw+Rnfdy/xX5YoGJwVWp4gFDd - lRbGhej7IcVbrRl1R0CoOwHsbS+ZAoHBAOLAPA34mODIhbLYdNWKPQwQvWG6TgAu - B2QLry7YfhgksmCsktDdnDftNN8mjD6tm4NRARcoGMZ+jfJAJJwRTo9YIhsWhBtu - k8A2bf24LdcoC23j87IdOetfPaA3GxHecNkzmTlG4iHzy/WwshB2qiC1BTP9cQsQ - uggjSz5aaaFZxSKsKQhH+4dawq1tFXu5X2HtIcEWI2xRhajrmk6WyVAMKCKAzy4C - kAbUR/tRFDtCDT2oT+XH9TOJs8UnAzHJnwKBwQDSeqdMXIJ7xOywTTqg1y5bN6GK - HkNbkgNUg8nDDRRPVvA+PLoDJHpIX1RlvKykjdJC/tqM32SWZ7T6YR/W68Xg6LQ6 - 0Q2u0GHKy7rExgWcUog+AaU2lUE3muAThM6K6kInsUszeqj11kmBbdjBQ8elK5/m - JblAs4y1CW5boao6IZXVXyweVLrim0/RThxzhhupEIxslVphG91DA8fNVr3KArIt - LVT/WhiWp18Q+oWprv6fJwvT96toWmyR9tlXLJ0CgcA9ts5hixCo1Uq2Q32BBQ/a - cc/pglhqahyu2RND775Z+drmvvFykW5MNm5Wcdpn0L5rvidK0ynzFEyz60tLgtZb - 40PdFYK9KJpkDSxgirlHPunlbc5M4vF5o0FVksn2UhFqvEVutmEjloQjiYTdQD7L - ihkxbkBPH61SO7Dl9pubQ6CI8Ex2qYjG7SfhJbhcJTbVo0G1mL3pZEK5l+42h4mh - FL3zrhU1U5M5mJtCxm14N2D9MAsW4hZVgZwBA7411ccCgcEAj+O/6Wk43uoyMRiq - 4vgYPc3bRnQH8lrwod9ymEChyNeTZ8jWFX3jhwR8ywxgLiKyQpC90h6KQnRleeHa - BXCrl2UeiTMPmpnksOH0Lb9+aG7XqyQu0RDaQ+xCEbXyCW+6iC4hTfEl/uJe3/e7 - fewbWSRorMrPSZc1szHeWxA7MoBxUSw+GgIsvOwWde1jb+qXkE264iR8Y/TLn5u/ - BPauyqJrMo1SFTt/ocaMLCxIIkd61Ey6Pk+Lw8xFesf5rynVAoHBAMyTvZ2LB61G - PF/+DI3Sq/PUemqV7VSfDAiMOVsJLkLjqJrgCnQS4PQ4iRmBLxAe0ehYnoSpVcyd - AJheQxnAUtuGQ8Ov0g3O15Et4bQjZ2b4MFLDkaDGUIzuFKmlEFz3uQU77GGTASVx - yb+ucrj/Qf4PcVAc1i6+4OETuZsgMFcMILyv5+Afd47zLOn84G9wsUDtmxQLllLF - Oru/yUgCmwbZl3dRwMLUMn8pqRajeY8BjsR5gfajM8n1KhE/0T3qHA== - -----END RSA PRIVATE KEY----- diff --git a/cmd/cli/plugin/package/test/config/assets/htpasswd-auth.yml b/cmd/cli/plugin/package/test/config/assets/htpasswd-auth.yml deleted file mode 100644 index ecbd4793b8..0000000000 --- a/cmd/cli/plugin/package/test/config/assets/htpasswd-auth.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: htpasswd-auth - namespace: registry -type: Opaque -stringData: - auth: | - testuser:$2y$05$9NKN9qnhgkssozP/vf3U.uAVKTw5d6I2bsljULWZrDOMV2djl9vCC - diff --git a/cmd/cli/plugin/package/test/config/assets/instructions-for-one-time-setup.txt b/cmd/cli/plugin/package/test/config/assets/instructions-for-one-time-setup.txt deleted file mode 100644 index cd0e928546..0000000000 --- a/cmd/cli/plugin/package/test/config/assets/instructions-for-one-time-setup.txt +++ /dev/null @@ -1,18 +0,0 @@ -# start the docker registry -docker run -d -p 5000:5000 --restart=always -v /tmp/registry:/var/lib/registry --name registry registry:2 - -# push the nearly empty bundle to the local registry -imgpkg push -b localhost:5000/secret-test/test-bundle -f ./one-time-setup-for-secretgen-registry -imgpkg push -b localhost:5000/secret-test/test-repo -f ./package-repository-setup - -# grab the files from the mountpoint we made and stored them in a configmap -## tar them -tar -cf tmp-registry -P /tmp/registry -## make the configmap -kubectl create configmap registry-contents --from-file=./tmp-registry -kubectl get configmap registry-contents -o yaml > registry-contents.yml -## clean up temporary artifacts -rm tmp-registry -kubectl delete configmap registry-contents - -## clean up the yaml, deleting the uid and version, and changing the namespace to be in the "tkg-system" ns, not default diff --git a/cmd/cli/plugin/package/test/config/assets/one-time-setup-for-secretgen-registry/.imgpkg/images.yml b/cmd/cli/plugin/package/test/config/assets/one-time-setup-for-secretgen-registry/.imgpkg/images.yml deleted file mode 100644 index f76698eb0c..0000000000 --- a/cmd/cli/plugin/package/test/config/assets/one-time-setup-for-secretgen-registry/.imgpkg/images.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: imgpkg.carvel.dev/v1alpha1 -kind: ImagesLock -images: [] diff --git a/cmd/cli/plugin/package/test/config/assets/one-time-setup-for-secretgen-registry/myconfigmap.yml b/cmd/cli/plugin/package/test/config/assets/one-time-setup-for-secretgen-registry/myconfigmap.yml deleted file mode 100644 index 520fcb3b57..0000000000 --- a/cmd/cli/plugin/package/test/config/assets/one-time-setup-for-secretgen-registry/myconfigmap.yml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: e2e-test-map -data: - is-this-just-a-test: "yes" - diff --git a/cmd/cli/plugin/package/test/config/assets/package-repository-setup/.imgpkg/images.yml b/cmd/cli/plugin/package/test/config/assets/package-repository-setup/.imgpkg/images.yml deleted file mode 100644 index 37fcb3c520..0000000000 --- a/cmd/cli/plugin/package/test/config/assets/package-repository-setup/.imgpkg/images.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -apiVersion: imgpkg.carvel.dev/v1alpha1 -images: -- annotations: - kbld.carvel.dev/id: registry-svc.registry.svc.cluster.local:443/secret-test/test-bundle - image: registry-svc.registry.svc.cluster.local:443/secret-test/test-bundle@sha256:85bce2a964b9d5f0379d4437496982270890de54b8b11889b674b9faa2aae33f -kind: ImagesLock diff --git a/cmd/cli/plugin/package/test/config/assets/package-repository-setup/packages/package.yml b/cmd/cli/plugin/package/test/config/assets/package-repository-setup/packages/package.yml deleted file mode 100644 index 0d776029c0..0000000000 --- a/cmd/cli/plugin/package/test/config/assets/package-repository-setup/packages/package.yml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: pkg.test.carvel.dev.1.0.0 -spec: - refName: pkg.test.carvel.dev - version: 1.0.0 - template: - spec: - fetch: - - imgpkgBundle: - image: registry-svc.registry.svc.cluster.local:443/secret-test/test-bundle - template: - - ytt: {} - - kbld: - paths: - - "-" - - ".imgpkg/images.yml" - deploy: - - kapp: {} diff --git a/cmd/cli/plugin/package/test/config/assets/registry-contents.yml b/cmd/cli/plugin/package/test/config/assets/registry-contents.yml deleted file mode 100644 index 2ba67dbe4a..0000000000 --- a/cmd/cli/plugin/package/test/config/assets/registry-contents.yml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -binaryData: - tmp-registry: L3RtcC9yZWdpc3RyeS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc1NzM0IDAxNDU1MQAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzU3MzQgMDE2MDIwACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NTczNCAwMTc2NzAAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc1NzM0IDAyMDIxNwAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzU3MzQgMDIyNzQ2ACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL2Jsb2JzLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NTczNCAwMjEzMjAAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvYmxvYnMvc2hhMjU2LwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc2MDA0IDAyMjMxNwAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9ibG9icy9zaGEyNTYvMTcvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzU3MzQgMDIyNTU3ACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL2Jsb2JzL3NoYTI1Ni84OC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NjAwNCAwMjI1NTYAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvYmxvYnMvc2hhMjU2L2UwLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc2MDA0IDAyMjYyMwAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9ibG9icy9zaGEyNTYvMmQvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzU3MzQgMDIyNjM1ACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL2Jsb2JzL3NoYTI1Ni84NS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NTczNCAwMjI1NjQAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvYmxvYnMvc2hhMjU2LzdhLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc2MDA0IDAyMjYyNgAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkb2NrZXIvcmVnaXN0cnkvdjIvYmxvYnMvc2hhMjU2LzdhLzdhNTgzNzY4OTI4YzRiMGYxYzczOWFiNzI0MDc2ZjUxZWNmZWQ5YmVmNGJhZGMzMjU4YzcxYjRjODdkMmM3MDgvMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzYwMDQgMDMzNTM1ACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAvdG1wL3JlZ2lzdHJ5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJlZ2lzdHJ5L3YyL2Jsb2JzL3NoYTI1Ni83YS83YTU4Mzc2ODkyOGM0YjBmMWM3MzlhYjcyNDA3NmY1MWVjZmVkOWJlZjRiYWRjMzI1OGM3MWI0Yzg3ZDJjNzA4L2RhdGEAAAAwMDA2NDQgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMTA0NCAxNDE2NTE3NjAwNCAwMzQzNzAAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkvZG9ja2VyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4sIAAAAAAAE/+yWTY/aMBCGc86vGHG3mSTO56nqrVJV9dT7JDEQ5cuKDRKq+t8rJwRot11ttYDabp4DwZbHHhjP+4Y79wcRMUYcn/j0if5lzuIgxn4YOBDePzXH2WtDg4P42rNs5tc/7h+BV+1W1du7Zmv/l+fq7wlb8zMOeijCcKn/IzjVf121tJWaH9vm9qfaykaXHh/HV62CIYp5zuKg54c+OvDqnnwJb7z/GWMuqeqLHHTVdxlMcsALGg6y4aU8rA8eNWpHnjtdkcxlQF3XGzJV3+nMBQCo86a8jqnKDAa5rbQZjkwfCj4PuB0UzV4bOfCmL6jJhAjWWhaDNMxIbdb2g+X7rmykCzAeepPN3ukd+WGUJWFeSJ/SSORpGW4wiNNSiCAWaZQmvh9jkmIpQ5EnueclSZpHscjTDZFPJINg49ZVV2bwYWyYj31Ruy+5Zn8rioradv4987NN/Yf6H8Xxov+PYK7/+vTlHg5g6/+c/sf+2RMsDnoBxov+P4Rr7S/JEJ/uQdX92gPqUfs+T6LhttKQDbIm0FErM1D1llsBvzID7nHk6GolC7tukJtPv1vqAhxmI5qiAIxsVUNG2liAeRfLRppiN01b2Mm73o/WcZm33M5FRrv7OSsLg6MxGXz9dloBwEZb/DERRWZ38swLDFZsdQ6bYLB6+mo2LyqlavrjZWcGNSk1Hv6QS7OwsPBf8D0AAP//kN38FwASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRvY2tlci9yZWdpc3RyeS92Mi9ibG9icy9zaGEyNTYvODUvODViY2UyYTk2NGI5ZDVmMDM3OWQ0NDM3NDk2OTgyMjcwODkwZGU1NGI4YjExODg5YjY3NGI5ZmFhMmFhZTMzZi8wMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NTczNCAwMzMyMTAAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcmVnaXN0cnkvdjIvYmxvYnMvc2hhMjU2Lzg1Lzg1YmNlMmE5NjRiOWQ1ZjAzNzlkNDQzNzQ5Njk4MjI3MDg5MGRlNTRiOGIxMTg4OWI2NzRiOWZhYTJhYWUzM2YvZGF0YQAAADAwMDY0NCAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwNjQ3IDE0MTY1MTc1NzM0IDAzNDA1MwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAL3RtcC9yZWdpc3RyeS9kb2NrZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7InNjaGVtYVZlcnNpb24iOjIsIm1lZGlhVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5kb2NrZXIuZGlzdHJpYnV0aW9uLm1hbmlmZXN0LnYyK2pzb24iLCJjb25maWciOnsibWVkaWFUeXBlIjoiYXBwbGljYXRpb24vdm5kLmRvY2tlci5jb250YWluZXIuaW1hZ2UudjEranNvbiIsInNpemUiOjMxNywiZGlnZXN0Ijoic2hhMjU2OjJkMGJlOTc2MjVkZDkyNGM0OTIwZjZhMmIxMTEyZmIzYzAxYWUyYzY4MmNlNGQ3Y2YwZmEyNzVlZmNhYmU3OTQifSwibGF5ZXJzIjpbeyJtZWRpYVR5cGUiOiJhcHBsaWNhdGlvbi92bmQuZG9ja2VyLmltYWdlLnJvb3Rmcy5kaWZmLnRhci5nemlwIiwic2l6ZSI6MzE0LCJkaWdlc3QiOiJzaGEyNTY6MTcxNWZlODdiNzU4NGYyZTkzMTczMWVlMWVkYTAxMmJmY2UyZGQxOTEwMTJhMmI0ZmNkNTQ1YWU3NmNiZGI3YSJ9XX0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRvY2tlci9yZWdpc3RyeS92Mi9ibG9icy9zaGEyNTYvMmQvMmQwYmU5NzYyNWRkOTI0YzQ5MjBmNmEyYjExMTJmYjNjMDFhZTJjNjgyY2U0ZDdjZjBmYTI3NWVmY2FiZTc5NC8wMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NTczNCAwMzM3MTcAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcmVnaXN0cnkvdjIvYmxvYnMvc2hhMjU2LzJkLzJkMGJlOTc2MjVkZDkyNGM0OTIwZjZhMmIxMTEyZmIzYzAxYWUyYzY4MmNlNGQ3Y2YwZmEyNzVlZmNhYmU3OTQvZGF0YQAAADAwMDY0NCAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwNDc1IDE0MTY1MTc1NzM0IDAzNDU2MQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAL3RtcC9yZWdpc3RyeS9kb2NrZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7ImFyY2hpdGVjdHVyZSI6IiIsImNyZWF0ZWQiOiIwMDAxLTAxLTAxVDAwOjAwOjAwWiIsImhpc3RvcnkiOlt7ImF1dGhvciI6ImltZ3BrZyIsImNyZWF0ZWQiOiIwMDAxLTAxLTAxVDAwOjAwOjAwWiIsImNyZWF0ZWRfYnkiOiJpbWdwa2cifV0sIm9zIjoiIiwicm9vdGZzIjp7InR5cGUiOiJsYXllcnMiLCJkaWZmX2lkcyI6WyJzaGEyNTY6MTJhNDNjY2RmMTFjMjliYTA3ZTI1MmUzZTc5YjRmZDJmODg2NzNjMWJmMTA0OTdjNjIyYWZiM2JiMDgyYjFiMSJdfSwiY29uZmlnIjp7IkxhYmVscyI6eyJkZXYuY2FydmVsLmltZ3BrZy5idW5kbGUiOiJ0cnVlIn19fQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRvY2tlci9yZWdpc3RyeS92Mi9ibG9icy9zaGEyNTYvZTAvZTA3NDgzZTIxNDBmYTQyN2Q5ODc1YWVlOTA1NWQ3MmVmYzQ5YTczMmYzYTNmYjJjOTY1MWQ5ZjM5MTU5MzE1YS8wMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NjAwNCAwMzMyMzEAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcmVnaXN0cnkvdjIvYmxvYnMvc2hhMjU2L2UwL2UwNzQ4M2UyMTQwZmE0MjdkOTg3NWFlZTkwNTVkNzJlZmM0OWE3MzJmM2EzZmIyYzk2NTFkOWYzOTE1OTMxNWEvZGF0YQAAADAwMDY0NCAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwNjQ3IDE0MTY1MTc2MDA0IDAzNDA3NAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAL3RtcC9yZWdpc3RyeS9kb2NrZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7InNjaGVtYVZlcnNpb24iOjIsIm1lZGlhVHlwZSI6ImFwcGxpY2F0aW9uL3ZuZC5kb2NrZXIuZGlzdHJpYnV0aW9uLm1hbmlmZXN0LnYyK2pzb24iLCJjb25maWciOnsibWVkaWFUeXBlIjoiYXBwbGljYXRpb24vdm5kLmRvY2tlci5jb250YWluZXIuaW1hZ2UudjEranNvbiIsInNpemUiOjMxNywiZGlnZXN0Ijoic2hhMjU2Ojg4Y2VkM2YyNGNhZTNhNjljNzZlMTI5NTU3ZDYwZDI4NDZhNzcxMjgzYjZiYTE4ZmE2NGE0OGM2NDM3Yzg3MzMifSwibGF5ZXJzIjpbeyJtZWRpYVR5cGUiOiJhcHBsaWNhdGlvbi92bmQuZG9ja2VyLmltYWdlLnJvb3Rmcy5kaWZmLnRhci5nemlwIiwic2l6ZSI6NTQ4LCJkaWdlc3QiOiJzaGEyNTY6N2E1ODM3Njg5MjhjNGIwZjFjNzM5YWI3MjQwNzZmNTFlY2ZlZDliZWY0YmFkYzMyNThjNzFiNGM4N2QyYzcwOCJ9XX0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRvY2tlci9yZWdpc3RyeS92Mi9ibG9icy9zaGEyNTYvODgvODhjZWQzZjI0Y2FlM2E2OWM3NmUxMjk1NTdkNjBkMjg0NmE3NzEyODNiNmJhMThmYTY0YTQ4YzY0MzdjODczMy8wMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NjAwNCAwMzMxNjcAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcmVnaXN0cnkvdjIvYmxvYnMvc2hhMjU2Lzg4Lzg4Y2VkM2YyNGNhZTNhNjljNzZlMTI5NTU3ZDYwZDI4NDZhNzcxMjgzYjZiYTE4ZmE2NGE0OGM2NDM3Yzg3MzMvZGF0YQAAADAwMDY0NCAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwNDc1IDE0MTY1MTc2MDA0IDAzNDAzMQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAL3RtcC9yZWdpc3RyeS9kb2NrZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7ImFyY2hpdGVjdHVyZSI6IiIsImNyZWF0ZWQiOiIwMDAxLTAxLTAxVDAwOjAwOjAwWiIsImhpc3RvcnkiOlt7ImF1dGhvciI6ImltZ3BrZyIsImNyZWF0ZWQiOiIwMDAxLTAxLTAxVDAwOjAwOjAwWiIsImNyZWF0ZWRfYnkiOiJpbWdwa2cifV0sIm9zIjoiIiwicm9vdGZzIjp7InR5cGUiOiJsYXllcnMiLCJkaWZmX2lkcyI6WyJzaGEyNTY6YThmYmU0ZDNiMTVlZGRiNWYzMTZlMDE3ODQ1YmMyMWJkM2E5NGRkZDU4Njg4NGU3ZGI5NjBmODY0ZWNmN2E2ZCJdfSwiY29uZmlnIjp7IkxhYmVscyI6eyJkZXYuY2FydmVsLmltZ3BrZy5idW5kbGUiOiJ0cnVlIn19fQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRvY2tlci9yZWdpc3RyeS92Mi9ibG9icy9zaGEyNTYvMTcvMTcxNWZlODdiNzU4NGYyZTkzMTczMWVlMWVkYTAxMmJmY2UyZGQxOTEwMTJhMmI0ZmNkNTQ1YWU3NmNiZGI3YS8wMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NTczNCAwMzM2NDAAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcmVnaXN0cnkvdjIvYmxvYnMvc2hhMjU2LzE3LzE3MTVmZTg3Yjc1ODRmMmU5MzE3MzFlZTFlZGEwMTJiZmNlMmRkMTkxMDEyYTJiNGZjZDU0NWFlNzZjYmRiN2EvZGF0YQAAADAwMDY0NCAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwNDcyIDE0MTY1MTc1NzM0IDAzNDQ3NwAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAL3RtcC9yZWdpc3RyeS9kb2NrZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfiwgAAAAAAAT/7JTBa/sgFMc9+1dI70mftmnB6+/0g+26y9jh0brUNSYSbSD//dA2a2BQCl1Kx/xcJBrw6fd9zMn0AACsAeII30cQ57kAAViLYkFYMX1phBycx5YA3LpXqHx8uF9Crk1p9+Wk1YZ7uZQ/X4bMvyDAYVkUKf97cMp/rg2WyuW9qX5+15Ds6ux4/B6pAhwWw1yAABcFXxB2s5PX8Mf9R6tfVOt0U0t2fAryDbadqvKt6uYdx8rukNO9rreS/Y9N8tRs9vTYL5K9vtFrbjnxoJh+09TvujRop5GfkOj2Rf+XIv5zIvgvxCr5fw/G/neD5/9iSzyjpUZ53KJHSRmr0SjJlFCZV85nBi0dlrTL/E677OPgfIZxXbJZr9yMpuchkUgkHpLPAAAA//92Xi6hABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NjAwMyAwMjUxNzYAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtcmVwby8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc2MDA0IDAyNzEyMQAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QvdGVzdC1idW5kbGUvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzU3MzQgMDI3NDM2ACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC90ZXN0LWJ1bmRsZS9fbWFuaWZlc3RzLwAAAAAAAAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NTczNCAwMzE1NjYAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtYnVuZGxlL191cGxvYWRzLwAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc1NzM0IDAzMTI0NAAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QvdGVzdC1idW5kbGUvX2xheWVycy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzU3MzQgMDMxMDc0ACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC90ZXN0LWJ1bmRsZS9fbGF5ZXJzL3NoYTI1Ni8AAAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NTczNCAwMzIxMDQAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdGVzdC1idW5kbGUvX2xheWVycy9zaGEyNTYvMTcxNWZlODdiNzU4NGYyZTkzMTczMWVlMWVkYTAxMmJmY2UyZGQxOTEwMTJhMmI0ZmNkNTQ1YWU3NmNiZGI3YS8AAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc1NzM0IDA0MzE2NQAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXN0LWJ1bmRsZS9fbGF5ZXJzL3NoYTI1Ni8yZDBiZTk3NjI1ZGQ5MjRjNDkyMGY2YTJiMTExMmZiM2MwMWFlMmM2ODJjZTRkN2NmMGZhMjc1ZWZjYWJlNzk0LwAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzU3MzQgMDQzMTY2ACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRlc3QtYnVuZGxlL19sYXllcnMvc2hhMjU2LzJkMGJlOTc2MjVkZDkyNGM0OTIwZjZhMmIxMTEyZmIzYzAxYWUyYzY4MmNlNGQ3Y2YwZmEyNzVlZmNhYmU3OTQvbGluawAAAAAwMDA2NDQgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDEwNyAxNDE2NTE3NTczNCAwNDQwNDQAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2hhMjU2OjJkMGJlOTc2MjVkZDkyNGM0OTIwZjZhMmIxMTEyZmIzYzAxYWUyYzY4MmNlNGQ3Y2YwZmEyNzVlZmNhYmU3OTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXN0LWJ1bmRsZS9fbGF5ZXJzL3NoYTI1Ni8xNzE1ZmU4N2I3NTg0ZjJlOTMxNzMxZWUxZWRhMDEyYmZjZTJkZDE5MTAxMmEyYjRmY2Q1NDVhZTc2Y2JkYjdhL2xpbmsAAAAAMDAwNjQ0IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAxMDcgMTQxNjUxNzU3MzQgMDQ0MDQzACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNoYTI1NjoxNzE1ZmU4N2I3NTg0ZjJlOTMxNzMxZWUxZWRhMDEyYmZjZTJkZDE5MTAxMmEyYjRmY2Q1NDVhZTc2Y2JkYjdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtYnVuZGxlL19tYW5pZmVzdHMvdGFncy8AAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc1NzM0IDAzMjUyNAAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QvdGVzdC1idW5kbGUvX21hbmlmZXN0cy9yZXZpc2lvbnMvAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzU3MzQgMDMzNjA3ACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC90ZXN0LWJ1bmRsZS9fbWFuaWZlc3RzL3JldmlzaW9ucy9zaGEyNTYvAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NTczNCAwMzQ2MTcAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX21hbmlmZXN0cy9yZXZpc2lvbnMvc2hhMjU2Lzg1YmNlMmE5NjRiOWQ1ZjAzNzlkNDQzNzQ5Njk4MjI3MDg5MGRlNTRiOGIxMTg4OWI2NzRiOWZhYTJhYWUzM2YvAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc1NzM0IDA0NTI0MwAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtYnVuZGxlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfbWFuaWZlc3RzL3JldmlzaW9ucy9zaGEyNTYvODViY2UyYTk2NGI5ZDVmMDM3OWQ0NDM3NDk2OTgyMjcwODkwZGU1NGI4YjExODg5YjY3NGI5ZmFhMmFhZTMzZi9saW5rAAAAMDAwNjQ0IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAxMDcgMTQxNjUxNzU3MzQgMDQ2MTIxACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QvdGVzdC1idW5kbGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNoYTI1Njo4NWJjZTJhOTY0YjlkNWYwMzc5ZDQ0Mzc0OTY5ODIyNzA4OTBkZTU0YjhiMTE4ODliNjc0YjlmYWEyYWFlMzNmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtYnVuZGxlL19tYW5pZmVzdHMvdGFncy9sYXRlc3QvAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc1NzM0IDAzNDAyMAAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtYnVuZGxlL19tYW5pZmVzdHMvdGFncy9sYXRlc3QvY3VycmVudC8AAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzU3MzQgMDM1NDIzACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAvdG1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC90ZXN0LWJ1bmRsZS9fbWFuaWZlc3RzL3RhZ3MvbGF0ZXN0L2luZGV4LwAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NTczNCAwMzUxMjcAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC90ZXN0LWJ1bmRsZS9fbWFuaWZlc3RzL3RhZ3MvbGF0ZXN0L2luZGV4L3NoYTI1Ni8AAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc1NzM0IDAzNjA2MAAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAL3RtcC9yZWdpc3RyeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0YWdzL2xhdGVzdC9pbmRleC9zaGEyNTYvODViY2UyYTk2NGI5ZDVmMDM3OWQ0NDM3NDk2OTgyMjcwODkwZGU1NGI4YjExODg5YjY3NGI5ZmFhMmFhZTMzZi8AAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzU3MzQgMDQ2NTYzACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QvdGVzdC1idW5kbGUvX21hbmlmZXN0cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRhZ3MvbGF0ZXN0L2luZGV4L3NoYTI1Ni84NWJjZTJhOTY0YjlkNWYwMzc5ZDQ0Mzc0OTY5ODIyNzA4OTBkZTU0YjhiMTE4ODliNjc0YjlmYWEyYWFlMzNmL2xpbmsAAAAAAAAwMDA2NDQgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDEwNyAxNDE2NTE3NTczNCAwNDc0NDEAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC90ZXN0LWJ1bmRsZS9fbWFuaWZlc3RzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2hhMjU2Ojg1YmNlMmE5NjRiOWQ1ZjAzNzlkNDQzNzQ5Njk4MjI3MDg5MGRlNTRiOGIxMTg4OWI2NzRiOWZhYTJhYWUzM2YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtYnVuZGxlL19tYW5pZmVzdHMvdGFncy9sYXRlc3QvY3VycmVudC9saW5rMDAwNjQ0IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAxMDcgMTQxNjUxNzU3MzQgMDM2MzAxACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAvdG1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNoYTI1Njo4NWJjZTJhOTY0YjlkNWYwMzc5ZDQ0Mzc0OTY5ODIyNzA4OTBkZTU0YjhiMTE4ODliNjc0YjlmYWEyYWFlMzNmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtcmVwby9fbWFuaWZlc3RzLwAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc2MDA0IDAzMTI1MQAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QvdGVzdC1yZXBvL191cGxvYWRzLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzYwMDQgMDMwNzI3ACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC90ZXN0LXJlcG8vX2xheWVycy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NjAwNCAwMzA1NTcAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtcmVwby9fbGF5ZXJzL3NoYTI1Ni8AAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc2MDA0IDAzMTU2NwAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ZXN0LXJlcG8vX2xheWVycy9zaGEyNTYvODhjZWQzZjI0Y2FlM2E2OWM3NmUxMjk1NTdkNjBkMjg0NmE3NzEyODNiNmJhMThmYTY0YTQ4YzY0MzdjODczMy8AAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzYwMDQgMDQyMjAwACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRlc3QtcmVwby9fbGF5ZXJzL3NoYTI1Ni83YTU4Mzc2ODkyOGM0YjBmMWM3MzlhYjcyNDA3NmY1MWVjZmVkOWJlZjRiYWRjMzI1OGM3MWI0Yzg3ZDJjNzA4LwAAAAAAAAAAAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NjAwNCAwNDI0NzYAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdGVzdC1yZXBvL19sYXllcnMvc2hhMjU2LzdhNTgzNzY4OTI4YzRiMGYxYzczOWFiNzI0MDc2ZjUxZWNmZWQ5YmVmNGJhZGMzMjU4YzcxYjRjODdkMmM3MDgvbGluawAAAAAAADAwMDY0NCAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMTA3IDE0MTY1MTc2MDA0IDA0MzM1NAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzaGEyNTY6N2E1ODM3Njg5MjhjNGIwZjFjNzM5YWI3MjQwNzZmNTFlY2ZlZDliZWY0YmFkYzMyNThjNzFiNGM4N2QyYzcwOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRlc3QtcmVwby9fbGF5ZXJzL3NoYTI1Ni84OGNlZDNmMjRjYWUzYTY5Yzc2ZTEyOTU1N2Q2MGQyODQ2YTc3MTI4M2I2YmExOGZhNjRhNDhjNjQzN2M4NzMzL2xpbmsAAAAAAAAwMDA2NDQgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDEwNyAxNDE2NTE3NjAwNCAwNDMwNTYAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2hhMjU2Ojg4Y2VkM2YyNGNhZTNhNjljNzZlMTI5NTU3ZDYwZDI4NDZhNzcxMjgzYjZiYTE4ZmE2NGE0OGM2NDM3Yzg3MzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QvdGVzdC1yZXBvL19tYW5pZmVzdHMvdGFncy8AAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzYwMDQgMDMyMjA3ACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC90ZXN0LXJlcG8vX21hbmlmZXN0cy9yZXZpc2lvbnMvAAAAAAAAAAAAAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NjAwNCAwMzMyNzIAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtcmVwby9fbWFuaWZlc3RzL3JldmlzaW9ucy9zaGEyNTYvAAAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc2MDA0IDAzNDMwMgAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfbWFuaWZlc3RzL3JldmlzaW9ucy9zaGEyNTYvZTA3NDgzZTIxNDBmYTQyN2Q5ODc1YWVlOTA1NWQ3MmVmYzQ5YTczMmYzYTNmYjJjOTY1MWQ5ZjM5MTU5MzE1YS8AAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzYwMDQgMDQ0NzEwACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QvdGVzdC1yZXBvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF9tYW5pZmVzdHMvcmV2aXNpb25zL3NoYTI1Ni9lMDc0ODNlMjE0MGZhNDI3ZDk4NzVhZWU5MDU1ZDcyZWZjNDlhNzMyZjNhM2ZiMmM5NjUxZDlmMzkxNTkzMTVhL2xpbmsAAAAwMDA2NDQgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDEwNyAxNDE2NTE3NjAwNCAwNDU1NjYAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC90ZXN0LXJlcG8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2hhMjU2OmUwNzQ4M2UyMTQwZmE0MjdkOTg3NWFlZTkwNTVkNzJlZmM0OWE3MzJmM2EzZmIyYzk2NTFkOWYzOTE1OTMxNWEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvdG1wL3JlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QvdGVzdC1yZXBvL19tYW5pZmVzdHMvdGFncy9sYXRlc3QvAAAAAAAAAAAAMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzYwMDQgMDMzNTAzACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC90ZXN0LXJlcG8vX21hbmlmZXN0cy90YWdzL2xhdGVzdC9jdXJyZW50LwAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NjAwNCAwMzUxNjUAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtcmVwby9fbWFuaWZlc3RzL3RhZ3MvbGF0ZXN0L2luZGV4LwAAADAwMDc1NSAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMDAwIDE0MTY1MTc2MDA0IDAzNDYxMgAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtcmVwby9fbWFuaWZlc3RzL3RhZ3MvbGF0ZXN0L2luZGV4L3NoYTI1Ni8AMDAwNzU1IAAwMDA3NjcgADAwMDAwMCAAMDAwMDAwMDAwMDAgMTQxNjUxNzYwMDQgMDM1NTQzACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwbHVjaGVuZ2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3aGVlbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAvdG1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRhZ3MvbGF0ZXN0L2luZGV4L3NoYTI1Ni9lMDc0ODNlMjE0MGZhNDI3ZDk4NzVhZWU5MDU1ZDcyZWZjNDlhNzMyZjNhM2ZiMmM5NjUxZDlmMzkxNTkzMTVhLwAAAAAAAAAAAAAwMDA3NTUgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDAwMCAxNDE2NTE3NjAwNCAwNDYyMzAAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAvcmVnaXN0cnkvZG9ja2VyL3JlZ2lzdHJ5L3YyL3JlcG9zaXRvcmllcy9zZWNyZXQtdGVzdC90ZXN0LXJlcG8vX21hbmlmZXN0cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdGFncy9sYXRlc3QvaW5kZXgvc2hhMjU2L2UwNzQ4M2UyMTQwZmE0MjdkOTg3NWFlZTkwNTVkNzJlZmM0OWE3MzJmM2EzZmIyYzk2NTFkOWYzOTE1OTMxNWEvbGluawAAAAAAADAwMDY0NCAAMDAwNzY3IAAwMDAwMDAgADAwMDAwMDAwMTA3IDE0MTY1MTc2MDA0IDA0NzEwNgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMGx1Y2hlbmdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAL3RtcC9yZWdpc3RyeS9kb2NrZXIvcmVnaXN0cnkvdjIvcmVwb3NpdG9yaWVzL3NlY3JldC10ZXN0L3Rlc3QtcmVwby9fbWFuaWZlc3RzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzaGEyNTY6ZTA3NDgzZTIxNDBmYTQyN2Q5ODc1YWVlOTA1NWQ3MmVmYzQ5YTczMmYzYTNmYjJjOTY1MWQ5ZjM5MTU5MzE1YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJlZ2lzdHJ5L2RvY2tlci9yZWdpc3RyeS92Mi9yZXBvc2l0b3JpZXMvc2VjcmV0LXRlc3QvdGVzdC1yZXBvL19tYW5pZmVzdHMvdGFncy9sYXRlc3QvY3VycmVudC9saW5rAAAwMDA2NDQgADAwMDc2NyAAMDAwMDAwIAAwMDAwMDAwMDEwNyAxNDE2NTE3NjAwNCAwMzU3NjQAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBsdWNoZW5nYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAC90bXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2hhMjU2OmUwNzQ4M2UyMTQwZmE0MjdkOTg3NWFlZTkwNTVkNzJlZmM0OWE3MzJmM2EzZmIyYzk2NTFkOWYzOTE1OTMxNWEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -metadata: - name: registry-contents - namespace: registry diff --git a/cmd/cli/plugin/package/test/config/assets/registry-namespace.yml b/cmd/cli/plugin/package/test/config/assets/registry-namespace.yml deleted file mode 100644 index 6e0d66403b..0000000000 --- a/cmd/cli/plugin/package/test/config/assets/registry-namespace.yml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: registry diff --git a/cmd/cli/plugin/package/test/config/assets/registry.yml b/cmd/cli/plugin/package/test/config/assets/registry.yml deleted file mode 100644 index aa8f737c25..0000000000 --- a/cmd/cli/plugin/package/test/config/assets/registry.yml +++ /dev/null @@ -1,76 +0,0 @@ ---- -apiVersion: v1 -kind: Service -metadata: - namespace: registry - name: registry-svc -spec: - selector: - app: self-signed-registry - ports: - - port: 443 - targetPort: 443 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: self-signed-registry - namespace: registry -spec: - replicas: 1 - selector: - matchLabels: - app: self-signed-registry - template: - metadata: - labels: - app: self-signed-registry - spec: - containers: - - name: self-signed-registry - image: projects-stg.registry.vmware.com/tkg/addons/registry - env: - - name: REGISTRY_HTTP_ADDR - value: 0.0.0.0:443 - - name: REGISTRY_HTTP_TLS_CERTIFICATE - value: /etc/ssl/registry.crt - - name: REGISTRY_HTTP_TLS_KEY - value: /etc/ssl/registry.key - - name: REGISTRY_AUTH_HTPASSWD_PATH - value: /etc/htpasswd/auth - - name: REGISTRY_AUTH_HTPASSWD_REALM - value: registry-realm - - name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY - value: /var/lib/tmp/registry - ports: - - containerPort: 443 - volumeMounts: - - mountPath: /etc/ssl - readOnly: true - name: registry-certs - - mountPath: /etc/htpasswd - readOnly: true - name: htpasswd-auth - - mountPath: /var/lib - name: registry-sync - initContainers: - - name: registry-contents-populator - image: projects-stg.registry.vmware.com/tkg/addons/registry - command: ["/bin/sh","-c", "tar -xf /tmp/tmp-registry -C /var/lib"] - volumeMounts: - - mountPath: /tmp - name: registry-contents - - mountPath: /var/lib - name: registry-sync - volumes: - - name: registry-certs - secret: - secretName: registry-certs - - name: htpasswd-auth - secret: - secretName: htpasswd-auth - - name: registry-contents - configMap: - name: registry-contents - - name: registry-sync - emptyDir: {} diff --git a/cmd/cli/plugin/package/test/config/package_plugin_config.yaml b/cmd/cli/plugin/package/test/config/package_plugin_config.yaml deleted file mode 100644 index e69d3704d0..0000000000 --- a/cmd/cli/plugin/package/test/config/package_plugin_config.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -use-existing-cluster: false -mc-cluster-name: "" -wlc-cluster-name: "" -wlc-cluster-namespace: default -mc-kubeconfig-Path: "" -wlc-kubeconfig-Path: "" -namespace: "test-ns" -private-registry-server: "registry-svc.registry.svc.cluster.local:443" -private-registry-username: "testuser" -private-registry-password: "testpassword" -repository-name: "carvel-test" -repository-url: "projects-stg.registry.vmware.com/tkg/test-packages/test-repo:v1.0.0" -repository-url-no-tag: "projects-stg.registry.vmware.com/tkg/test-packages/test-repo" -repository-url-private: "registry-svc.registry.svc.cluster.local:443/secret-test/test-repo@sha256:e07483e2140fa427d9875aee9055d72efc49a732f3a3fb2c9651d9f39159315a" -repository-url-private-no-tag: "registry-svc.registry.svc.cluster.local:443/secret-test/test-repo" -repository-original-tag: "v1.0.0" -repository-latest-tag: "v1.1.0" -repository-private-tag: "sha256:e07483e2140fa427d9875aee9055d72efc49a732f3a3fb2c9651d9f39159315a" -package-name: "pkg.test.carvel.dev" -package-version: "2.0.0" -package-version-update: "3.0.0-rc.1" -with-value-file: true diff --git a/cmd/cli/plugin/package/test/config/values.yaml b/cmd/cli/plugin/package/test/config/values.yaml deleted file mode 100644 index 6e36352abf..0000000000 --- a/cmd/cli/plugin/package/test/config/values.yaml +++ /dev/null @@ -1 +0,0 @@ -key1: value1 diff --git a/cmd/cli/plugin/package/test/config/values_update.yaml b/cmd/cli/plugin/package/test/config/values_update.yaml deleted file mode 100644 index 4b7d08f221..0000000000 --- a/cmd/cli/plugin/package/test/config/values_update.yaml +++ /dev/null @@ -1 +0,0 @@ -key2: value2 diff --git a/cmd/cli/plugin/package/test/lib/package_plugin.go b/cmd/cli/plugin/package/test/lib/package_plugin.go deleted file mode 100644 index 819738e0c6..0000000000 --- a/cmd/cli/plugin/package/test/lib/package_plugin.go +++ /dev/null @@ -1,545 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package lib - -import ( - "bytes" - "fmt" - "strings" - "time" - - "k8s.io/apimachinery/pkg/util/wait" - - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -type PackagePluginBase interface { - AddRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult - GetRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult - UpdateRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult - DeleteRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult - ListRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult - - GetAvailablePackage(packageName string, o *packagedatamodel.PackageAvailableOptions) PackagePluginResult - ListAvailablePackage(packageName string, o *packagedatamodel.PackageAvailableOptions) PackagePluginResult - - CreateInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult - GetInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult - UpdateInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult - DeleteInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult - ListInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult -} - -type PackagePluginHelpers interface { - AddOrUpdateRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult - CheckRepositoryAvailable(o *packagedatamodel.RepositoryOptions) PackagePluginResult - CheckAndDeleteRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult - CheckRepositoryDeleted(o *packagedatamodel.RepositoryOptions) PackagePluginResult - CheckPackageAvailable(packageName string, o *packagedatamodel.PackageAvailableOptions) PackagePluginResult - CheckAndInstallPackage(o *packagedatamodel.PackageOptions) PackagePluginResult - CheckPackageInstalled(o *packagedatamodel.PackageOptions) PackagePluginResult - CheckAndUninstallPackage(o *packagedatamodel.PackageOptions) PackagePluginResult - CheckPackageDeleted(o *packagedatamodel.PackageOptions) PackagePluginResult -} - -type PackagePlugin interface { - // Base commands are implemented by the below interface - PackagePluginBase - // Extra helper commands will be implemented by other interface - PackagePluginHelpers -} - -type PackagePluginResult struct { - Pass bool - Stdout *bytes.Buffer - Stderr *bytes.Buffer - Error error -} - -type packagePlugin struct { - kubeconfigPath string - interval time.Duration - timeout time.Duration - outputFormat string - logFile string - verbose int32 -} - -func NewPackagePlugin(kubeconfigPath string, - interval time.Duration, - timeout time.Duration, - outputFormat string, - logFile string, - verbose int32) PackagePlugin { - return &packagePlugin{ - kubeconfigPath: kubeconfigPath, - interval: interval, - timeout: timeout, - outputFormat: outputFormat, - logFile: logFile, - verbose: verbose, - } -} - -func (p *packagePlugin) addKubeconfig(cmd string) string { - if cmd != "" && p.kubeconfigPath != "" { - cmd += fmt.Sprintf(" --kubeconfig %s", p.kubeconfigPath) - } - return cmd -} - -func (p *packagePlugin) addOutputFormat(cmd string) string { - if cmd != "" && p.outputFormat != "" { - cmd += fmt.Sprintf(" --output %s", p.outputFormat) - } - return cmd -} - -func (p *packagePlugin) addLogFile(cmd string) string { - if cmd != "" && p.logFile != "" { - cmd += fmt.Sprintf(" --log-file %s", p.logFile) - } - return cmd -} - -func (p *packagePlugin) addVerbose(cmd string) string { - if cmd != "" && p.verbose != 0 { - cmd += fmt.Sprintf(" --verbose %d", p.verbose) - } - return cmd -} - -func (p *packagePlugin) addGlobalOptions(cmd string) string { - cmd = p.addLogFile(cmd) - cmd = p.addVerbose(cmd) - return cmd -} - -func (p *packagePlugin) AddRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package repository add %s --url %s", o.RepositoryName, o.RepositoryURL) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.CreateNamespace { - cmd += fmt.Sprintf(" --create-namespace") - } - if o.Wait { - cmd += fmt.Sprintf(" --wait=true") - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --poll-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --poll-timeout %s", o.PollTimeout) - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) GetRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package repository get %s", o.RepositoryName) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) UpdateRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package repository update %s --url %s", o.RepositoryName, o.RepositoryURL) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.CreateNamespace { - cmd += fmt.Sprintf(" --create-namespace") - } - if o.CreateRepository { - cmd += fmt.Sprintf(" --create") - } - if o.Wait { - cmd += fmt.Sprintf(" --wait=true") - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --poll-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --poll-timeout %s", o.PollTimeout) - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) DeleteRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package repository delete %s", o.RepositoryName) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.IsForceDelete { - cmd += fmt.Sprintf(" --force") - } - if o.Wait { - cmd += fmt.Sprintf(" --wait=true") - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --poll-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --poll-timeout %s", o.PollTimeout) - } - if o.SkipPrompt { - cmd += fmt.Sprintf(" -y") - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) ListRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package repository list") - if o.AllNamespaces { - cmd += fmt.Sprintf(" --all-namespaces") - } - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) GetAvailablePackage(packageName string, o *packagedatamodel.PackageAvailableOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package available get %s", packageName) - - if o.ValuesSchema { - cmd += fmt.Sprintf(" --values-schema") - } - if o.AllNamespaces { - cmd += fmt.Sprintf(" --all-namespaces") - } - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) ListAvailablePackage(packageName string, o *packagedatamodel.PackageAvailableOptions) PackagePluginResult { - var ( - cmd string - result PackagePluginResult - ) - if packageName == "" { - cmd = fmt.Sprintf("tanzu package available list") - } else { - cmd = fmt.Sprintf("tanzu package available list %s", packageName) - } - if o.AllNamespaces { - cmd += fmt.Sprintf(" --all-namespaces") - } - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) CreateInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package installed create %s --package-name %s", o.PkgInstallName, o.PackageName) - if o.Version != "" { - cmd += fmt.Sprintf(" --version %s", o.Version) - } - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.CreateNamespace { - cmd += fmt.Sprintf(" --create-namespace") - } - if o.ValuesFile != "" { - cmd += fmt.Sprintf(" --values-file %s", o.ValuesFile) - } - if o.ServiceAccountName != "" { - cmd += fmt.Sprintf(" --service-account-name %s", o.ServiceAccountName) - } - if o.Wait { - cmd += fmt.Sprintf(" --wait=true") - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --poll-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --poll-timeout %s", o.PollTimeout) - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) GetInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package installed get %s", o.PkgInstallName) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) UpdateInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package installed update %s --package-name %s", o.PkgInstallName, o.PackageName) - if o.Version != "" { - cmd += fmt.Sprintf(" --version %s", o.Version) - } - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.Install { - cmd += fmt.Sprintf(" --install") - } - if o.ValuesFile != "" { - cmd += fmt.Sprintf(" --values-file %s", o.ValuesFile) - } - if o.Wait { - cmd += fmt.Sprintf(" --wait=true") - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --poll-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --poll-timeout %s", o.PollTimeout) - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) DeleteInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package installed delete %s", o.PkgInstallName) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --poll-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --poll-timeout %s", o.PollTimeout) - } - if o.SkipPrompt { - cmd += fmt.Sprintf(" -y") - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) ListInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package installed list") - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.AllNamespaces { - cmd += fmt.Sprintf(" -A") - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePlugin) AddOrUpdateRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - getResult := p.GetRepository(&packagedatamodel.RepositoryOptions{ - RepositoryName: o.RepositoryName, - Namespace: o.Namespace, - }) - if getResult.Error != nil { - return p.AddRepository(o) - } else { - if !strings.Contains(getResult.Stdout.String(), o.RepositoryURL) { - return p.UpdateRepository(o) - } - } - return result -} - -func (p *packagePlugin) CheckRepositoryAvailable(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - if err := wait.PollImmediate(p.interval, p.timeout, func() (done bool, err error) { - result := p.GetRepository(&packagedatamodel.RepositoryOptions{ - RepositoryName: o.RepositoryName, - Namespace: o.Namespace, - }) - if result.Error != nil { - return false, result.Error - } - if result.Stdout != nil && strings.Contains(result.Stdout.String(), "Reconcile succeeded") { - return true, nil - } - return false, nil - }); err != nil { - if result.Error == nil { - result.Error = err - } - return result - } - return result -} - -func (p *packagePlugin) CheckAndDeleteRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - getResult := p.GetRepository(&packagedatamodel.RepositoryOptions{ - RepositoryName: o.RepositoryName, - Namespace: o.Namespace, - }) - if getResult.Error == nil { - return p.DeleteRepository(o) - } - return result -} - -func (p *packagePlugin) CheckRepositoryDeleted(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - if err := wait.PollImmediate(p.interval, p.timeout, func() (done bool, err error) { - result := p.GetRepository(&packagedatamodel.RepositoryOptions{ - RepositoryName: o.RepositoryName, - Namespace: o.Namespace, - }) - if result.Stderr != nil && strings.Contains(result.Stderr.String(), "does not exist") || - result.Stdout != nil && strings.Contains(result.Stdout.String(), "does not exist") { - if result.Error != nil { - // Setting result error to nil since there will be error on get after repository is deleted - result.Error = nil - } - return true, nil - } - return false, result.Error - }); err != nil { - if result.Error == nil { - result.Error = err - } - return result - } - return result -} - -func (p *packagePlugin) CheckPackageAvailable(packageName string, o *packagedatamodel.PackageAvailableOptions) PackagePluginResult { - var result PackagePluginResult - if err := wait.PollImmediate(p.interval, p.timeout, func() (done bool, err error) { - result = p.GetAvailablePackage(packageName, o) - if result.Error == nil { - return true, nil - } - return false, nil - }); err != nil { - if result.Error == nil { - result.Error = err - } - return result - } - return result -} - -func (p *packagePlugin) CheckAndInstallPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - getResult := p.GetInstalledPackage(&packagedatamodel.PackageOptions{ - PkgInstallName: o.PkgInstallName, - Namespace: o.Namespace, - }) - if getResult.Error != nil { - return p.CreateInstalledPackage(o) - } - return result -} - -func (p *packagePlugin) CheckPackageInstalled(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - if err := wait.PollImmediate(p.interval, p.timeout, func() (done bool, err error) { - result = p.GetInstalledPackage(&packagedatamodel.PackageOptions{ - PkgInstallName: o.PkgInstallName, - Namespace: o.Namespace, - }) - if result.Error != nil { - return false, result.Error - } - if result.Stdout != nil && strings.Contains(result.Stdout.String(), "Reconcile succeeded") { - return true, nil - } - return false, nil - }); err != nil { - if result.Error == nil { - result.Error = err - } - return result - } - return result -} - -func (p *packagePlugin) CheckAndUninstallPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - getResult := p.GetInstalledPackage(&packagedatamodel.PackageOptions{ - PkgInstallName: o.PkgInstallName, - Namespace: o.Namespace, - }) - if getResult.Error == nil { - return p.DeleteInstalledPackage(o) - } - return result -} - -func (p *packagePlugin) CheckPackageDeleted(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - if err := wait.PollImmediate(p.interval, p.timeout, func() (done bool, err error) { - result = p.GetInstalledPackage(&packagedatamodel.PackageOptions{ - PkgInstallName: o.PkgInstallName, - Namespace: o.Namespace, - }) - if result.Stderr != nil && strings.Contains(result.Stderr.String(), "does not exist") { - if result.Error != nil { - // Setting result error to nil since there will be error on get after package is deleted - result.Error = nil - } - return true, nil - } - return false, result.Error - }); err != nil { - if result.Error == nil { - result.Error = err - } - return result - } - return result -} diff --git a/cmd/cli/plugin/package/test/lib/package_plugin_kctrl.go b/cmd/cli/plugin/package/test/lib/package_plugin_kctrl.go deleted file mode 100644 index c883b29be7..0000000000 --- a/cmd/cli/plugin/package/test/lib/package_plugin_kctrl.go +++ /dev/null @@ -1,485 +0,0 @@ -package lib - -import ( - "fmt" - "strings" - "time" - - "k8s.io/apimachinery/pkg/util/wait" - - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -type packagePluginKctrl struct { - kubeconfigPath string - interval time.Duration - timeout time.Duration - outputFormat string - logFile string - verbose int32 -} - -func NewPackagePluginKctrl(kubeconfigPath string, - interval time.Duration, - timeout time.Duration, - outputFormat string, - logFile string, - verbose int32) PackagePlugin { - return &packagePluginKctrl{ - kubeconfigPath: kubeconfigPath, - interval: interval, - timeout: timeout, - outputFormat: outputFormat, - logFile: logFile, - verbose: verbose, - } -} - -func (p *packagePluginKctrl) addKubeconfig(cmd string) string { - if cmd != "" && p.kubeconfigPath != "" { - cmd += fmt.Sprintf(" --kubeconfig %s", p.kubeconfigPath) - } - return cmd -} - -func (p *packagePluginKctrl) addOutputFormat(cmd string) string { - if cmd != "" && p.outputFormat != "" { - cmd += fmt.Sprintf(" --output %s", p.outputFormat) - } - return cmd -} - -func (p *packagePluginKctrl) addLogFile(cmd string) string { - if cmd != "" && p.logFile != "" { - cmd += fmt.Sprintf(" --log-file %s", p.logFile) - } - return cmd -} - -func (p *packagePluginKctrl) addVerbose(cmd string) string { - if cmd != "" && p.verbose != 0 { - cmd += fmt.Sprintf(" --verbose %d", p.verbose) - } - return cmd -} - -func (p *packagePluginKctrl) addGlobalOptions(cmd string) string { - cmd = p.addLogFile(cmd) - cmd = p.addVerbose(cmd) - return cmd -} - -func (p *packagePluginKctrl) AddRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package repository add %s --url %s", o.RepositoryName, o.RepositoryURL) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.Wait { - cmd += fmt.Sprintf(" --wait=true") - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --wait-check-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --wait-timeout %s", o.PollTimeout) - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) GetRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package repository get %s", o.RepositoryName) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) UpdateRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package repository update %s --url %s", o.RepositoryName, o.RepositoryURL) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.Wait { - cmd += fmt.Sprintf(" --wait=true") - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --wait-check-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --wait-timeout %s", o.PollTimeout) - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) DeleteRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package repository delete %s", o.RepositoryName) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.IsForceDelete { - cmd += fmt.Sprintf(" --force") - } - if o.Wait { - cmd += fmt.Sprintf(" --wait=true") - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --wait-check-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --wait-timeout %s", o.PollTimeout) - } - if o.SkipPrompt { - cmd += fmt.Sprintf(" -y") - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) ListRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package repository list") - if o.AllNamespaces { - cmd += fmt.Sprintf(" --all-namespaces") - } - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) GetAvailablePackage(packageName string, o *packagedatamodel.PackageAvailableOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package available get %s", packageName) - - if o.ValuesSchema { - cmd += fmt.Sprintf(" --values-schema") - } - if o.AllNamespaces { - cmd += fmt.Sprintf(" --all-namespaces") - } - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) ListAvailablePackage(packageName string, o *packagedatamodel.PackageAvailableOptions) PackagePluginResult { - var ( - cmd string - result PackagePluginResult - ) - if packageName == "" { - cmd = fmt.Sprintf("tanzu package available list") - } else { - cmd = fmt.Sprintf("tanzu package available list %s", packageName) - } - if o.AllNamespaces { - cmd += fmt.Sprintf(" --all-namespaces") - } - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) CreateInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package installed create %s --package %s", o.PkgInstallName, o.PackageName) - if o.Version != "" { - cmd += fmt.Sprintf(" --version %s", o.Version) - } - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.ValuesFile != "" { - cmd += fmt.Sprintf(" --values-file %s", o.ValuesFile) - } - if o.ServiceAccountName != "" { - cmd += fmt.Sprintf(" --service-account-name %s", o.ServiceAccountName) - } - if o.Wait { - cmd += fmt.Sprintf(" --wait=true") - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --wait-check-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --wait-timeout %s", o.PollTimeout) - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) GetInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package installed get %s", o.PkgInstallName) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) UpdateInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package installed update %s --package %s", o.PkgInstallName, o.PackageName) - if o.Version != "" { - cmd += fmt.Sprintf(" --version %s", o.Version) - } - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.Install { - cmd += fmt.Sprintf(" --install") - } - if o.ValuesFile != "" { - cmd += fmt.Sprintf(" --values-file %s", o.ValuesFile) - } - if o.Wait { - cmd += fmt.Sprintf(" --wait=true") - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --wait-check-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --wait-timeout %s", o.PollTimeout) - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) DeleteInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package installed delete %s", o.PkgInstallName) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.PollInterval != 0 { - cmd += fmt.Sprintf(" --wait-check-interval %s", o.PollInterval) - } - if o.PollTimeout != 0 { - cmd += fmt.Sprintf(" --wait-timeout %s", o.PollTimeout) - } - if o.SkipPrompt { - cmd += fmt.Sprintf(" -y") - } - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) ListInstalledPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - cmd := fmt.Sprintf("tanzu package installed list") - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.AllNamespaces { - cmd += fmt.Sprintf(" -A") - } - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeconfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *packagePluginKctrl) AddOrUpdateRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - getResult := p.GetRepository(&packagedatamodel.RepositoryOptions{ - RepositoryName: o.RepositoryName, - Namespace: o.Namespace, - }) - if getResult.Error != nil { - return p.AddRepository(o) - } else { - if !strings.Contains(getResult.Stdout.String(), o.RepositoryURL) { - return p.UpdateRepository(o) - } - } - return result -} - -func (p *packagePluginKctrl) CheckRepositoryAvailable(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - if err := wait.PollImmediate(p.interval, p.timeout, func() (done bool, err error) { - result := p.GetRepository(&packagedatamodel.RepositoryOptions{ - RepositoryName: o.RepositoryName, - Namespace: o.Namespace, - }) - if result.Error != nil { - return false, result.Error - } - if result.Stdout != nil && strings.Contains(result.Stdout.String(), "Reconcile succeeded") { - return true, nil - } - return false, nil - }); err != nil { - if result.Error == nil { - result.Error = err - } - return result - } - return result -} - -func (p *packagePluginKctrl) CheckAndDeleteRepository(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - getResult := p.GetRepository(&packagedatamodel.RepositoryOptions{ - RepositoryName: o.RepositoryName, - Namespace: o.Namespace, - }) - if getResult.Error == nil { - return p.DeleteRepository(o) - } - return result -} - -func (p *packagePluginKctrl) CheckRepositoryDeleted(o *packagedatamodel.RepositoryOptions) PackagePluginResult { - var result PackagePluginResult - if err := wait.PollImmediate(p.interval, p.timeout, func() (done bool, err error) { - result := p.GetRepository(&packagedatamodel.RepositoryOptions{ - RepositoryName: o.RepositoryName, - Namespace: o.Namespace, - }) - if result.Stderr != nil && strings.Contains(result.Stderr.String(), "does not exist") { - if result.Error != nil { - // Setting result error to nil since there will be error on get after repository is deleted - result.Error = nil - } - return true, nil - } - return false, result.Error - }); err != nil { - if result.Error == nil { - result.Error = err - } - return result - } - return result -} - -func (p *packagePluginKctrl) CheckPackageAvailable(packageName string, o *packagedatamodel.PackageAvailableOptions) PackagePluginResult { - var result PackagePluginResult - if err := wait.PollImmediate(p.interval, p.timeout, func() (done bool, err error) { - result = p.GetAvailablePackage(packageName, o) - if result.Error == nil { - return true, nil - } - return false, nil - }); err != nil { - if result.Error == nil { - result.Error = err - } - return result - } - return result -} - -func (p *packagePluginKctrl) CheckAndInstallPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - getResult := p.GetInstalledPackage(&packagedatamodel.PackageOptions{ - PkgInstallName: o.PkgInstallName, - Namespace: o.Namespace, - }) - if getResult.Error != nil { - return p.CreateInstalledPackage(o) - } - return result -} - -func (p *packagePluginKctrl) CheckPackageInstalled(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - if err := wait.PollImmediate(p.interval, p.timeout, func() (done bool, err error) { - result = p.GetInstalledPackage(&packagedatamodel.PackageOptions{ - PkgInstallName: o.PkgInstallName, - Namespace: o.Namespace, - }) - if result.Error != nil { - return false, result.Error - } - if result.Stdout != nil && strings.Contains(result.Stdout.String(), "Reconcile succeeded") { - return true, nil - } - return false, nil - }); err != nil { - if result.Error == nil { - result.Error = err - } - return result - } - return result -} - -func (p *packagePluginKctrl) CheckAndUninstallPackage(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - getResult := p.GetInstalledPackage(&packagedatamodel.PackageOptions{ - PkgInstallName: o.PkgInstallName, - Namespace: o.Namespace, - }) - if getResult.Error == nil { - return p.DeleteInstalledPackage(o) - } - return result -} - -func (p *packagePluginKctrl) CheckPackageDeleted(o *packagedatamodel.PackageOptions) PackagePluginResult { - var result PackagePluginResult - if err := wait.PollImmediate(p.interval, p.timeout, func() (done bool, err error) { - result = p.GetInstalledPackage(&packagedatamodel.PackageOptions{ - PkgInstallName: o.PkgInstallName, - Namespace: o.Namespace, - }) - if result.Stderr != nil && strings.Contains(result.Stderr.String(), "does not exist") { - if result.Error != nil { - // Setting result error to nil since there will be error on get after package is deleted - result.Error = nil - } - return true, nil - } - return false, result.Error - }); err != nil { - if result.Error == nil { - result.Error = err - } - return result - } - return result -} diff --git a/cmd/cli/plugin/package/test/main.go b/cmd/cli/plugin/package/test/main.go deleted file mode 100644 index f143b2a5be..0000000000 --- a/cmd/cli/plugin/package/test/main.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("package") - -func main() { - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} diff --git a/cmd/cli/plugin/package/test/package_plugin_integration_test.go b/cmd/cli/plugin/package/test/package_plugin_integration_test.go deleted file mode 100644 index 3dc9e932f9..0000000000 --- a/cmd/cli/plugin/package/test/package_plugin_integration_test.go +++ /dev/null @@ -1,1056 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "encoding/json" - "flag" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/aunum/log" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/util/retry" - "sigs.k8s.io/yaml" - - packagelib "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/package/test/lib" - secretlib "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/secret/test/lib" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type PackagePluginConfig struct { - UseExistingCluster bool `json:"use-existing-cluster"` - Namespace string `json:"namespace"` - PackageName string `json:"package-name"` - PackageVersion string `json:"package-version"` - PackageVersionUpdate string `json:"package-version-update"` - PrivateRegistryServer string `json:"private-registry-server"` - PrivateRegistryUsername string `json:"private-registry-username"` - PrivateRegistryPassword string `json:"private-registry-password"` - RepositoryName string `json:"repository-name"` - RepositoryURL string `json:"repository-url"` - RepositoryURLNoTag string `json:"repository-url-no-tag"` - RepositoryURLPrivate string `json:"repository-url-private"` - RepositoryURLPrivateNoTag string `json:"repository-url-private-no-tag"` - RepositoryOriginalTag string `json:"repository-original-tag"` - RepositoryLatestTag string `json:"repository-latest-tag"` - RepositoryPrivateTag string `json:"repository-private-tag"` - ClusterNameMC string `json:"mc-cluster-name"` - ClusterNameWLC string `json:"wlc-cluster-name"` - ClusterNamespaceWLC string `json:"wlc-cluster-namespace"` - KubeConfigPathMC string `json:"mc-kubeconfig-Path"` - KubeConfigPathWLC string `json:"wlc-kubeconfig-Path"` - WithValueFile bool `json:"with-value-file"` -} - -type registrySecretOutput struct { - Name string `json:"name"` - Registry string `json:"registry"` - Exported string `json:"exported"` - Age string `json:"age"` - Namespace string `json:"namespace"` -} - -type repositoryOutputKctrlDisabled struct { - Name string `json:"name"` - Repository string `json:"repository"` - Tag string `json:"tag"` - Status string `json:"status"` - Namespace string `json:"namespace"` -} - -type repositoryOutput struct { - Name string `json:"name"` - Source string `json:"source"` - Status string `json:"status"` - Namespace string `json:"namespace"` -} - -type packageInstalledOutput struct { - Name string `json:"name"` - PackageName string `json:"package-name"` - PackageVersion string `json:"package-version"` - Status string `json:"status"` -} - -type packageAvailableOutput struct { - Name string `json:"name"` -} - -var ( - config = &PackagePluginConfig{} - configPath string - tkgCfgDir string - err error - packagePlugin packagelib.PackagePlugin - secretPlugin secretlib.SecretPlugin - result packagelib.PackagePluginResult - resultImgPullSecret secretlib.SecretPluginResult - clusterCreationTimeout = 30 * time.Minute - pollInterval = 20 * time.Second - pollTimeout = 10 * time.Minute - testImgPullSecretName = "test-secret" - testNamespace = "test-ns" - privateTestRegistry = "registry-svc.registry.svc.cluster.local:443" - privateTestRegistryUsername = "testuser" - privateTestRegistryPassword = "testpassword" - testRepoName = "carvel-test" - testRepoURL = "projects-stg.registry.vmware.com/tkg/test-packages/test-repo:v1.0.0" - testRepoURLNoTag = "projects-stg.registry.vmware.com/tkg/test-packages/test-repo" - testRepoURLPrivate = "registry-svc.registry.svc.cluster.local:443/secret-test/test-repo@sha256:e07483e2140fa427d9875aee9055d72efc49a732f3a3fb2c9651d9f39159315a" - testRepoURLPrivateNoTag = "registry-svc.registry.svc.cluster.local:443/secret-test/test-repo" - testRepoOriginalTag = "v1.0.0" - testRepoLatestTag = "v1.1.0" - testRepoPrivateTag = "sha256:e07483e2140fa427d9875aee9055d72efc49a732f3a3fb2c9651d9f39159315a" - testPkgInstallName = "test-pkg" - testPkgName = "pkg.test.carvel.dev" - testPkgVersion = "2.0.0" - testPkgVersionUpdate = "3.0.0-rc.1" - imgPullSecretOptions packagedatamodel.RegistrySecretOptions - pkgAvailableOptions packagedatamodel.PackageAvailableOptions - pkgOptions packagedatamodel.PackageOptions - repoOptions packagedatamodel.RepositoryOptions - expectedPkgOutput packageInstalledOutput - expectedPkgOutputUpdate packageInstalledOutput - expectedRepoOutput repositoryOutput - expectedRepoOutputNoTag repositoryOutput - expectedRepoOutputPrivate repositoryOutput - expectedRepoOutputOld repositoryOutputKctrlDisabled - expectedRepoOutputLatestTagOld repositoryOutputKctrlDisabled - expectedRepoOutputPrivateOld repositoryOutputKctrlDisabled - imgPullSecretOutput []registrySecretOutput - pkgOutput []packageInstalledOutput - pkgAvailableOutput []packageAvailableOutput - repoOutput []repositoryOutput - repoOutputOld []repositoryOutputKctrlDisabled -) - -var _ = Describe("Package plugin integration test", func() { - var ( - homeDir string - clusterConfigFile string - ) - - BeforeSuite(func() { - flag.StringVar(&configPath, "package-plugin-config", "config/package_plugin_config.yaml", "path to the package plugin config file") - - configData, err := os.ReadFile(configPath) - Expect(err).NotTo(HaveOccurred()) - err = yaml.Unmarshal(configData, config) - Expect(err).NotTo(HaveOccurred()) - Expect(config).NotTo(BeNil()) - - homeDir, err = os.UserHomeDir() - Expect(err).NotTo(HaveOccurred()) - tkgCfgDir = filepath.Join(homeDir, ".tkg") - err = os.MkdirAll(tkgCfgDir, os.ModePerm) - Expect(err).NotTo(HaveOccurred()) - - if config.ClusterNameMC == "" { - config.ClusterNameMC = fmt.Sprintf(packagedatamodel.DefaultClusterPrefix + "mc-test-pkg-plugin") - } - - if config.ClusterNameWLC == "" { - config.ClusterNameWLC = fmt.Sprintf(packagedatamodel.DefaultClusterPrefix + "wlc-test-pkg-plugin") - } - - if config.ClusterNamespaceWLC == "" { - config.ClusterNamespaceWLC = "default" - } - - if config.KubeConfigPathMC == "" { - config.KubeConfigPathMC = filepath.Join(homeDir, ".kube-tkg/config") - } - - if config.KubeConfigPathWLC == "" { - config.KubeConfigPathWLC = filepath.Join(tkgCfgDir, config.ClusterNameWLC+".kubeconfig") - } - - if !config.UseExistingCluster { - By(fmt.Sprintf("Creating management cluster %q", config.ClusterNameMC)) - - // CAPD cluster creation on classy clusters doesnt work. So need to create legacy cluster. - // Below hack enables legacy cluster creation. - hackCmd := exec.NewCommand( - exec.WithCommand("./scripts/legacy_hack.sh"), - exec.WithStdout(GinkgoWriter), - ) - - fmt.Println("Executing the legacy hack script") - _, _, err := hackCmd.Run(context.Background()) - Expect(err).To(BeNil()) - - os.Setenv("_ALLOW_CALICO_ON_MANAGEMENT_CLUSTER", "true") - - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: tkgCfgDir, - LogOptions: tkgctl.LoggingOptions{ - Verbosity: packagedatamodel.DefaultLogLevel, - }, - }) - Expect(err).NotTo(HaveOccurred()) - - err = cli.Init(tkgctl.InitRegionOptions{ - ClusterConfigFile: filepath.Join(tkgCfgDir, "cluster-config.yaml"), - Plan: "dev", - ClusterName: config.ClusterNameMC, - InfrastructureProvider: "docker", - Timeout: clusterCreationTimeout, - CniType: "calico", - Edition: "tkg", - }) - Expect(err).NotTo(HaveOccurred()) - - os.Unsetenv("_ALLOW_CALICO_ON_MANAGEMENT_CLUSTER") - - By(fmt.Sprintf("Creating workload cluster %q", config.ClusterNameWLC)) - tkgCtlClient, err := tkgctl.New(tkgctl.Options{ - ConfigDir: tkgCfgDir, - LogOptions: tkgctl.LoggingOptions{ - Verbosity: packagedatamodel.DefaultLogLevel, - }, - }) - Expect(err).ToNot(HaveOccurred()) - - options := framework.CreateClusterOptions{ - ClusterName: config.ClusterNameWLC, - Namespace: packagedatamodel.DefaultNamespace, - Plan: "dev", - CniType: "calico", - } - clusterConfigFile, err = framework.GetTempClusterConfigFile("", &options) - Expect(err).To(BeNil()) - defer os.Remove(clusterConfigFile) - - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - err = tkgCtlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: config.ClusterNameWLC, - Namespace: packagedatamodel.DefaultNamespace, - ExportFile: config.KubeConfigPathWLC, - }) - Expect(err).NotTo(HaveOccurred()) - - log.Info("Finished creating management and workload clusters") - } - - if config.Namespace == "" { - config.Namespace = testNamespace - } - - if config.PrivateRegistryServer == "" { - config.PrivateRegistryServer = privateTestRegistry - } - - if config.PrivateRegistryUsername == "" { - config.PrivateRegistryUsername = privateTestRegistryUsername - } - - if config.PrivateRegistryPassword == "" { - config.PrivateRegistryPassword = privateTestRegistryPassword - } - - if config.RepositoryName == "" { - config.RepositoryName = testRepoName - } - - if config.RepositoryURL == "" { - config.RepositoryURL = testRepoURL - } - - if config.RepositoryURLNoTag == "" { - config.RepositoryURLNoTag = testRepoURLNoTag - } - - if config.RepositoryURLPrivate == "" { - config.RepositoryURLPrivate = testRepoURLPrivate - } - - if config.RepositoryURLPrivateNoTag == "" { - config.RepositoryURLPrivate = testRepoURLPrivateNoTag - } - - if config.RepositoryOriginalTag == "" { - config.RepositoryOriginalTag = testRepoOriginalTag - } - - if config.RepositoryLatestTag == "" { - config.RepositoryLatestTag = testRepoLatestTag - } - - if config.RepositoryPrivateTag == "" { - config.RepositoryPrivateTag = testRepoPrivateTag - } - - if config.PackageName == "" { - config.PackageName = testPkgName - } - - if config.PackageVersion == "" { - config.PackageVersion = testPkgVersion - } - - if config.PackageVersionUpdate == "" { - config.PackageVersionUpdate = testPkgVersionUpdate - } - - pkgAvailableOptions = packagedatamodel.PackageAvailableOptions{ - Namespace: config.Namespace, - } - - imgPullSecretOptions = packagedatamodel.RegistrySecretOptions{ - SecretName: testImgPullSecretName, - Namespace: packagedatamodel.DefaultNamespace, - SkipPrompt: true, - } - pkgOptions = packagedatamodel.PackageOptions{ - CreateNamespace: true, - Namespace: config.Namespace, - PackageName: config.PackageName, - PkgInstallName: testPkgInstallName, - Version: config.PackageVersion, - SkipPrompt: true, - Wait: true, - PollInterval: pollInterval, - PollTimeout: pollTimeout, - } - repoOptions = packagedatamodel.RepositoryOptions{ - CreateNamespace: true, - Namespace: config.Namespace, - RepositoryName: config.RepositoryName, - SkipPrompt: true, - Wait: true, - PollInterval: pollInterval, - PollTimeout: pollTimeout, - } - - expectedRepoOutput = repositoryOutput{ - Name: config.RepositoryName, - Source: fmt.Sprintf("(imgpkg) %s:%s", config.RepositoryURLNoTag, config.RepositoryOriginalTag), - Status: "Reconcile succeeded", - Namespace: config.Namespace, - } - - expectedRepoOutputNoTag = repositoryOutput{ - Name: config.RepositoryName, - Source: fmt.Sprintf("(imgpkg) %s", config.RepositoryURLNoTag), - Status: "Reconcile succeeded", - Namespace: config.Namespace, - } - - expectedRepoOutputPrivate = repositoryOutput{ - Name: config.RepositoryName, - Source: fmt.Sprintf("(imgpkg) %s@%s", config.RepositoryURLPrivateNoTag, config.RepositoryPrivateTag), - Status: "Reconcile succeeded", - Namespace: config.Namespace, - } - - expectedRepoOutputOld = repositoryOutputKctrlDisabled{ - Name: config.RepositoryName, - Repository: config.RepositoryURLNoTag, - Tag: config.RepositoryOriginalTag, - Status: "Reconcile succeeded", - Namespace: config.Namespace, - } - - expectedRepoOutputLatestTagOld = repositoryOutputKctrlDisabled{ - Name: config.RepositoryName, - Repository: config.RepositoryURLNoTag, - Tag: "(>0.0.0)", - Status: "Reconcile succeeded", - Namespace: config.Namespace, - } - - expectedRepoOutputPrivateOld = repositoryOutputKctrlDisabled{ - Name: config.RepositoryName, - Repository: config.RepositoryURLPrivateNoTag, - Tag: config.RepositoryPrivateTag, - Status: "Reconcile succeeded", - Namespace: config.Namespace, - } - - expectedPkgOutput = packageInstalledOutput{ - Name: testPkgInstallName, - PackageName: config.PackageName, - PackageVersion: config.PackageVersion, - Status: "Reconcile succeeded", - } - - expectedPkgOutputUpdate = packageInstalledOutput{ - Name: testPkgInstallName, - PackageName: config.PackageName, - PackageVersion: config.PackageVersionUpdate, - Status: "Reconcile succeeded", - } - }) - - Context("testing package plugin on management cluster", func() { - BeforeEach(func() { - packagePlugin = packagelib.NewPackagePluginKctrl(config.KubeConfigPathMC, pollInterval, pollTimeout, "json", "", 0) - secretPlugin = secretlib.NewSecretPlugin(config.KubeConfigPathMC, pollInterval, pollTimeout, "json", 0) - }) - It("should pass all checks on management cluster", func() { - cleanup() - setUpPrivateRegistry(config.KubeConfigPathMC, config.ClusterNameMC) - createTestNamespace(config.KubeConfigPathMC, config.ClusterNameMC, config.Namespace) - testHelper() - log.Info("Successfully finished package plugin integration tests on management cluster") - }) - }) - - Context("testing package plugin on workload cluster", func() { - BeforeEach(func() { - packagePlugin = packagelib.NewPackagePluginKctrl(config.KubeConfigPathWLC, pollInterval, pollTimeout, "json", "", 0) - secretPlugin = secretlib.NewSecretPlugin(config.KubeConfigPathWLC, pollInterval, pollTimeout, "json", 0) - }) - AfterEach(func() { - paused := false - pauseKappControllerPackage(config.ClusterNameWLC, config.ClusterNamespaceWLC, config.KubeConfigPathMC, config.ClusterNameMC, paused) - }) - It("should pass all checks on workload cluster", func() { - cleanup() - paused := true - pauseKappControllerPackage(config.ClusterNameWLC, config.ClusterNamespaceWLC, config.KubeConfigPathMC, config.ClusterNameMC, paused) - setUpPrivateRegistry(config.KubeConfigPathWLC, config.ClusterNameWLC) - createTestNamespace(config.KubeConfigPathWLC, config.ClusterNameWLC, config.Namespace) - testHelper() - log.Info("Successfully finished package plugin integration tests on workload cluster") - }) - }) - - Context("testing package plugin on management cluster with kctrl disabled", func() { - BeforeEach(func() { - packagePlugin = packagelib.NewPackagePlugin(config.KubeConfigPathMC, pollInterval, pollTimeout, "json", "", 0) - secretPlugin = secretlib.NewSecretPlugin(config.KubeConfigPathMC, pollInterval, pollTimeout, "json", 0) - }) - It("should pass all checks on management cluster", func() { - disableKctrlCommandTree() - cleanup() - setUpPrivateRegistry(config.KubeConfigPathMC, config.ClusterNameMC) - testHelperKctrlDisabled() - log.Info("Successfully finished package plugin integration tests on management cluster") - }) - }) - - Context("testing package plugin on workload cluster with kctrl disabled", func() { - BeforeEach(func() { - packagePlugin = packagelib.NewPackagePlugin(config.KubeConfigPathWLC, pollInterval, pollTimeout, "json", "", 0) - secretPlugin = secretlib.NewSecretPlugin(config.KubeConfigPathWLC, pollInterval, pollTimeout, "json", 0) - }) - AfterEach(func() { - paused := false - pauseKappControllerPackage(config.ClusterNameWLC, config.ClusterNamespaceWLC, config.KubeConfigPathMC, config.ClusterNameMC, paused) - }) - It("should pass all checks on workload cluster", func() { - disableKctrlCommandTree() - cleanup() - paused := true - pauseKappControllerPackage(config.ClusterNameWLC, config.ClusterNamespaceWLC, config.KubeConfigPathMC, config.ClusterNameMC, paused) - setUpPrivateRegistry(config.KubeConfigPathWLC, config.ClusterNameWLC) - testHelperKctrlDisabled() - log.Info("Successfully finished package plugin integration tests on workload cluster") - }) - }) -}) - -func cleanup() { - By("cleanup previous package installation") - result = packagePlugin.DeleteInstalledPackage(&pkgOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("cleanup previous package repository installation") - result = packagePlugin.CheckAndDeleteRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("cleanup previous secret installation") - resultImgPullSecret = secretPlugin.DeleteRegistrySecret(&imgPullSecretOptions) - if resultImgPullSecret.Stderr != nil { - Expect(resultImgPullSecret.Stderr.String()).ShouldNot(ContainSubstring(fmt.Sprintf(packagedatamodel.SecretGenAPINotAvailable, packagedatamodel.SecretGenAPIName, packagedatamodel.SecretGenAPIVersion))) - } - Expect(resultImgPullSecret.Error).ToNot(HaveOccurred()) -} - -func setUpPrivateRegistry(kubeconfigPath, clusterName string) { - By("set up private registry in cluster") - kubeCtx := clusterName + "-admin@" + clusterName - registryNamespace := "registry" - - command := exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("patch", "configmap", "kapp-controller-config", "-n", "tkg-system", "--type", "merge", "-p", fmt.Sprintf("{\"data\":{\"dangerousSkipTLSVerify\":\"registry-svc.%s.svc.cluster.local\"}}", registryNamespace), "--context", kubeCtx, "--kubeconfig", kubeconfigPath), - exec.WithStdout(GinkgoWriter), - ) - err := command.RunAndRedirectOutput(context.Background()) - Expect(err).ToNot(HaveOccurred()) - - command = exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("apply", "-f", "config/assets/registry-namespace.yml", "--context", kubeCtx, "--kubeconfig", kubeconfigPath), - exec.WithStdout(GinkgoWriter), - ) - err = command.RunAndRedirectOutput(context.Background()) - Expect(err).ToNot(HaveOccurred()) - - backOff := wait.Backoff{ - Steps: 10, - Duration: 15 * time.Second, - Factor: 1.0, - Jitter: 0.1, - } - - err = retry.OnError( - backOff, - func(err error) bool { - return err != nil - }, - func() error { - command = exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("apply", "-f", "config/assets/registry-contents.yml", "--context", kubeCtx, "--kubeconfig", kubeconfigPath), - exec.WithStdout(GinkgoWriter), - ) - return command.RunAndRedirectOutput(context.Background()) - }) - Expect(err).ToNot(HaveOccurred()) - - command = exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("apply", "-f", "config/assets/htpasswd-auth.yml", "--context", kubeCtx, "--kubeconfig", kubeconfigPath), - exec.WithStdout(GinkgoWriter), - ) - err = command.RunAndRedirectOutput(context.Background()) - Expect(err).ToNot(HaveOccurred()) - - command = exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("apply", "-f", "config/assets/certs-for-skip-tls.yml", "--context", kubeCtx, "--kubeconfig", kubeconfigPath), - exec.WithStdout(GinkgoWriter), - ) - err = command.RunAndRedirectOutput(context.Background()) - Expect(err).ToNot(HaveOccurred()) - - command = exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("apply", "-f", "config/assets/registry.yml", "--context", kubeCtx, "--kubeconfig", kubeconfigPath), - exec.WithStdout(GinkgoWriter), - ) - err = command.RunAndRedirectOutput(context.Background()) - Expect(err).ToNot(HaveOccurred()) - - By("restart kapp-controller pod to pick up configmap changes") - proxy := framework.NewClusterProxy(clusterName, kubeconfigPath, kubeCtx) - clientSet := proxy.GetClientSet() - - var podList *corev1.PodList - kappNamespace := "tkg-system" - podList, err = clientSet.CoreV1().Pods(kappNamespace).List(context.Background(), metav1.ListOptions{}) - Expect(err).ToNot(HaveOccurred()) - - for i := range podList.Items { - pod := &podList.Items[i] - if strings.Contains(pod.Name, "kapp-controller") { - err = clientSet.CoreV1().Pods(pod.Namespace).Delete(context.Background(), pod.Name, metav1.DeleteOptions{}) - Expect(err).ToNot(HaveOccurred()) - } - } - - By("make sure registry pod is running") - err = retry.OnError( - backOff, - func(err error) bool { - return err != nil - }, - func() error { - podList, err := clientSet.CoreV1().Pods(registryNamespace).List(context.Background(), metav1.ListOptions{}) - if err != nil { - return err - } - - for _, pod := range podList.Items { - if pod.Status.Phase != corev1.PodRunning { - return errors.New("registry pod is not running") - } - } - return nil - }) - Expect(err).ToNot(HaveOccurred()) - - By("make sure package API is available after kapp-controller restart") - err = retry.OnError( - backOff, - func(err error) bool { - return err != nil - }, - func() error { - result = packagePlugin.ListRepository(&repoOptions) - if result.Error != nil { - return result.Error - } - return nil - }) - Expect(err).ToNot(HaveOccurred()) -} - -func createTestNamespace(kubeconfigPath, clusterName, testNamespace string) { - By("create test namespace in cluster") - kubeCtx := clusterName + "-admin@" + clusterName - - command := exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("create", "ns", testNamespace, "--context", kubeCtx, "--kubeconfig", kubeconfigPath), - exec.WithStdout(GinkgoWriter), - ) - err = command.RunAndRedirectOutput(context.Background()) - Expect(err).ToNot(HaveOccurred()) -} - -func pauseKappControllerPackage(clusterName, clusterNamespace, mgmtClusterKubeconfigPath, mgmtClusterName string, pause bool) { - By("pausing kapp controller app") - mgmtClusterKubeCtx := mgmtClusterName + "-admin@" + mgmtClusterName - - var ( - carvelKind string - packageInstallFound bool - appStatus string - ) - - command := exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("get", "packageinstall", fmt.Sprintf("%s-kapp-controller", clusterName), "-n", clusterNamespace, "--context", mgmtClusterKubeCtx, "--kubeconfig", mgmtClusterKubeconfigPath), - exec.WithStdout(GinkgoWriter), - ) - err := command.RunAndRedirectOutput(context.Background()) - if err == nil { - packageInstallFound = true - } - - if packageInstallFound { - carvelKind = "packageinstall" - } else { - carvelKind = "app" - } - - command = exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("patch", carvelKind, fmt.Sprintf("%s-kapp-controller", clusterName), "-n", clusterNamespace, "--type", "merge", "-p", fmt.Sprintf("{\"spec\":{\"paused\":%t}}", pause), "--context", mgmtClusterKubeCtx, "--kubeconfig", mgmtClusterKubeconfigPath), - exec.WithStdout(GinkgoWriter), - ) - err = command.RunAndRedirectOutput(context.Background()) - Expect(err).ToNot(HaveOccurred()) - - backOff := wait.Backoff{ - Steps: 10, - Duration: 15 * time.Second, - Factor: 1.0, - Jitter: 0.1, - } - - if pause { - appStatus = "Canceled/paused" - } else { - appStatus = "Reconcile succeeded" - } - - err = retry.OnError( - backOff, - func(err error) bool { - return err != nil - }, - func() error { - command = exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("get", "app", fmt.Sprintf("%s-kapp-controller", clusterName), "-n", clusterNamespace, "--context", mgmtClusterKubeCtx, "--kubeconfig", mgmtClusterKubeconfigPath), - exec.WithStdout(GinkgoWriter), - ) - output, errout, err := command.Run(context.Background()) - if string(errout) != "" { - return errors.New(string(errout)) - } - if !strings.Contains(string(output), appStatus) { - return errors.New("App status not reached") - } - return err - }) - Expect(err).ToNot(HaveOccurred()) -} - -func disableKctrlCommandTree() { - By("disable kctrl command tree") - command := exec.NewCommand( - exec.WithCommand("tanzu"), - exec.WithArgs("config", "set", "features.package.kctrl-command-tree", "false"), - exec.WithStdout(GinkgoWriter), - ) - err = command.RunAndRedirectOutput(context.Background()) - Expect(err).ToNot(HaveOccurred()) -} - -func testHelper() { - By("trying to create package repository with a private URL") - repoOptions.RepositoryURL = config.RepositoryURLPrivate - repoOptions.PollTimeout = 30 * time.Second - result = packagePlugin.AddRepository(&repoOptions) - Expect(result.Error).To(HaveOccurred()) - - By("add registry secret") - imgPullSecretOptions.Username = privateTestRegistryUsername - imgPullSecretOptions.PasswordInput = privateTestRegistryPassword - imgPullSecretOptions.Server = privateTestRegistry - resultImgPullSecret = secretPlugin.AddRegistrySecret(&imgPullSecretOptions) - Expect(resultImgPullSecret.Error).ToNot(HaveOccurred()) - - By("update registry secret to export the secret from default namespace to all namespaces") - t := true - imgPullSecretOptions.Export = packagedatamodel.TypeBoolPtr{ExportToAllNamespaces: &t} - resultImgPullSecret = secretPlugin.UpdateRegistrySecret(&imgPullSecretOptions) - Expect(resultImgPullSecret.Error).ToNot(HaveOccurred()) - - By("list registry secret") - resultImgPullSecret = secretPlugin.ListRegistrySecret(&imgPullSecretOptions) - Expect(resultImgPullSecret.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(resultImgPullSecret.Stdout.Bytes(), &imgPullSecretOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(imgPullSecretOutput)).To(BeNumerically(">=", 1)) - - By("wait for the private package repository reconciliation") - repoOptions.RepositoryURL = config.RepositoryURLPrivate - repoOptions.PollInterval = pollInterval - repoOptions.PollTimeout = pollTimeout - result = packagePlugin.CheckRepositoryAvailable(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("list package repository") - repoOptions.AllNamespaces = true - result = packagePlugin.ListRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &repoOutput) - Expect(err).ToNot(HaveOccurred()) - - By("get package repository") - repoOutput = []repositoryOutput{{Namespace: testNamespace}} - result = packagePlugin.GetRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &repoOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(repoOutput)).To(BeNumerically("==", 1)) - Expect(repoOutput[0]).To(Equal(expectedRepoOutputPrivate)) - - By("update package repository with a new URL without tag") - repoOptions.RepositoryURL = config.RepositoryURLNoTag - repoOptions.PollInterval = pollInterval - repoOptions.PollTimeout = pollTimeout - result = packagePlugin.UpdateRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("get package repository") - repoOutput = []repositoryOutput{{Namespace: testNamespace}} - result = packagePlugin.GetRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &repoOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(repoOutput)).To(BeNumerically("==", 1)) - Expect(repoOutput[0]).To(Equal(expectedRepoOutputNoTag)) - - By("update package repository with a new URL") - repoOptions.RepositoryURL = config.RepositoryURL - result = packagePlugin.UpdateRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("get package repository") - repoOutput = []repositoryOutput{{Namespace: testNamespace}} - result = packagePlugin.GetRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &repoOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(repoOutput)).To(BeNumerically("==", 1)) - Expect(repoOutput[0]).To(Equal(expectedRepoOutput)) - - By("list package available without packagename argument") - pkgAvailableOptions.AllNamespaces = true - result = packagePlugin.ListAvailablePackage("", &pkgAvailableOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgAvailableOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgAvailableOutput)).To(BeNumerically(">=", 1)) - Expect(pkgAvailableOutput).To(ContainElement(packageAvailableOutput{Name: config.PackageName})) - - By("list package available with packagename argument") - pkgAvailableOptions.AllNamespaces = true - result = packagePlugin.ListAvailablePackage(config.PackageName, &pkgAvailableOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgAvailableOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(pkgAvailableOutput).To(ContainElement(packageAvailableOutput{Name: config.PackageName})) - - By("get package available packagename format") - pkgAvailableOptions.AllNamespaces = false - result = packagePlugin.GetAvailablePackage(config.PackageName, &pkgAvailableOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgAvailableOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgAvailableOutput)).To(BeNumerically("==", 1)) - Expect(pkgAvailableOutput[0].Name).To(Equal(config.PackageName)) - - By("get package available packagename/packageversion format") - result = packagePlugin.GetAvailablePackage(config.PackageName+"/"+config.PackageVersion, &pkgAvailableOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgAvailableOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgAvailableOutput)).To(BeNumerically("==", 1)) - Expect(pkgAvailableOutput[0].Name).To(Equal(config.PackageName)) - - By("create package install") - pkgOptions.PollInterval = pollInterval - pkgOptions.PollTimeout = pollTimeout - pkgOptions.Version = config.PackageVersion - if config.WithValueFile { - pkgOptions.ValuesFile = "config/values.yaml" - } - result = packagePlugin.CreateInstalledPackage(&pkgOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("list package install") - pkgOptions.AllNamespaces = true - result = packagePlugin.ListInstalledPackage(&pkgOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgOutput)).To(BeNumerically(">=", 1)) - Expect(pkgOutput).To(ContainElement(expectedPkgOutput)) - - By("update package install") - pkgOptions.Version = config.PackageVersionUpdate - if config.WithValueFile { - pkgOptions.ValuesFile = "config/values_update.yaml" - } - result = packagePlugin.UpdateInstalledPackage(&pkgOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("get package install") - result = packagePlugin.GetInstalledPackage(&pkgOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgOutput)).To(BeNumerically("==", 1)) - Expect(pkgOutput[0]).To(Equal(expectedPkgOutputUpdate)) - - By("delete package install") - result = packagePlugin.DeleteInstalledPackage(&pkgOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("delete package repository") - repoOptions.PollInterval = pollInterval - result = packagePlugin.DeleteRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("check package repository deletion") - result = packagePlugin.GetRepository(&repoOptions) - Expect(result.Error).To(HaveOccurred()) - - By("delete registry secret") - resultImgPullSecret = secretPlugin.DeleteRegistrySecret(&imgPullSecretOptions) - Expect(resultImgPullSecret.Error).ToNot(HaveOccurred()) -} - -func testHelperKctrlDisabled() { - By("trying to update package repository with a private URL") - repoOptions.RepositoryURL = config.RepositoryURLPrivate - repoOptions.CreateRepository = true - repoOptions.PollTimeout = 30 * time.Second - result = packagePlugin.UpdateRepository(&repoOptions) - Expect(result.Error).To(HaveOccurred()) - - By("add registry secret") - imgPullSecretOptions.Username = privateTestRegistryUsername - imgPullSecretOptions.PasswordInput = privateTestRegistryPassword - imgPullSecretOptions.Server = privateTestRegistry - resultImgPullSecret = secretPlugin.AddRegistrySecret(&imgPullSecretOptions) - Expect(resultImgPullSecret.Error).ToNot(HaveOccurred()) - - By("update registry secret to export the secret from default namespace to all namespaces") - t := true - imgPullSecretOptions.Export = packagedatamodel.TypeBoolPtr{ExportToAllNamespaces: &t} - resultImgPullSecret = secretPlugin.UpdateRegistrySecret(&imgPullSecretOptions) - Expect(resultImgPullSecret.Error).ToNot(HaveOccurred()) - - By("list registry secret") - resultImgPullSecret = secretPlugin.ListRegistrySecret(&imgPullSecretOptions) - Expect(resultImgPullSecret.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(resultImgPullSecret.Stdout.Bytes(), &imgPullSecretOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(imgPullSecretOutput)).To(BeNumerically(">=", 1)) - - By("wait for the private package repository reconciliation") - repoOptions.RepositoryURL = config.RepositoryURLPrivate - repoOptions.CreateRepository = true - repoOptions.PollInterval = pollInterval - repoOptions.PollTimeout = pollTimeout - result = packagePlugin.CheckRepositoryAvailable(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("list package repository") - repoOptions.AllNamespaces = true - result = packagePlugin.ListRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &repoOutputOld) - Expect(err).ToNot(HaveOccurred()) - - By("get package repository") - repoOutputOld = []repositoryOutputKctrlDisabled{{Namespace: testNamespace}} - result = packagePlugin.GetRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &repoOutputOld) - Expect(err).ToNot(HaveOccurred()) - Expect(len(repoOutputOld)).To(BeNumerically("==", 1)) - Expect(repoOutputOld[0]).To(Equal(expectedRepoOutputPrivateOld)) - - By("update package repository with a new URL without tag") - repoOptions.RepositoryURL = config.RepositoryURLNoTag - repoOptions.CreateRepository = true - repoOptions.CreateNamespace = true - repoOptions.PollInterval = pollInterval - repoOptions.PollTimeout = pollTimeout - result = packagePlugin.UpdateRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("wait for package repository reconciliation") - result = packagePlugin.CheckRepositoryAvailable(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("get package repository") - repoOutputOld = []repositoryOutputKctrlDisabled{{Namespace: testNamespace}} - result = packagePlugin.GetRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &repoOutputOld) - Expect(err).ToNot(HaveOccurred()) - Expect(len(repoOutputOld)).To(BeNumerically("==", 1)) - Expect(repoOutputOld[0]).To(Equal(expectedRepoOutputLatestTagOld)) - - By("update package repository with a new URL") - repoOptions.RepositoryURL = config.RepositoryURL - result = packagePlugin.UpdateRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("wait for package repository reconciliation") - result = packagePlugin.CheckRepositoryAvailable(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("get package repository") - repoOutputOld = []repositoryOutputKctrlDisabled{{Namespace: testNamespace}} - result = packagePlugin.GetRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &repoOutputOld) - Expect(err).ToNot(HaveOccurred()) - Expect(len(repoOutputOld)).To(BeNumerically("==", 1)) - Expect(repoOutputOld[0]).To(Equal(expectedRepoOutputOld)) - - By("list package available without packagename argument") - pkgAvailableOptions.AllNamespaces = true - result = packagePlugin.ListAvailablePackage("", &pkgAvailableOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgAvailableOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgAvailableOutput)).To(BeNumerically(">=", 1)) - Expect(pkgAvailableOutput).To(ContainElement(packageAvailableOutput{Name: config.PackageName})) - - By("list package available with packagename argument") - pkgAvailableOptions.AllNamespaces = true - result = packagePlugin.ListAvailablePackage(config.PackageName, &pkgAvailableOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgAvailableOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(pkgAvailableOutput).To(ContainElement(packageAvailableOutput{Name: config.PackageName})) - - By("get package available packagename format") - pkgAvailableOptions.AllNamespaces = false - result = packagePlugin.GetAvailablePackage(config.PackageName, &pkgAvailableOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgAvailableOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgAvailableOutput)).To(BeNumerically("==", 1)) - Expect(pkgAvailableOutput[0].Name).To(Equal(config.PackageName)) - - By("get package available packagename/packageversion format") - result = packagePlugin.GetAvailablePackage(config.PackageName+"/"+config.PackageVersion, &pkgAvailableOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgAvailableOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgAvailableOutput)).To(BeNumerically("==", 1)) - Expect(pkgAvailableOutput[0].Name).To(Equal(config.PackageName)) - - By("create package install") - pkgOptions.PollInterval = pollInterval - pkgOptions.PollTimeout = pollTimeout - pkgOptions.Version = config.PackageVersion - if config.WithValueFile { - pkgOptions.ValuesFile = "config/values.yaml" - } - result = packagePlugin.CreateInstalledPackage(&pkgOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("list package install") - pkgOptions.AllNamespaces = true - result = packagePlugin.ListInstalledPackage(&pkgOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgOutput)).To(BeNumerically(">=", 1)) - Expect(pkgOutput).To(ContainElement(expectedPkgOutput)) - - By("update package install") - pkgOptions.Version = config.PackageVersionUpdate - if config.WithValueFile { - pkgOptions.ValuesFile = "config/values_update.yaml" - } - result = packagePlugin.UpdateInstalledPackage(&pkgOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("get package install") - result = packagePlugin.GetInstalledPackage(&pkgOptions) - Expect(result.Error).ToNot(HaveOccurred()) - err = json.Unmarshal(result.Stdout.Bytes(), &pkgOutput) - Expect(err).ToNot(HaveOccurred()) - Expect(len(pkgOutput)).To(BeNumerically("==", 1)) - Expect(pkgOutput[0]).To(Equal(expectedPkgOutputUpdate)) - - By("delete package install") - result = packagePlugin.DeleteInstalledPackage(&pkgOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("delete package repository") - repoOptions.PollInterval = pollInterval - result = packagePlugin.DeleteRepository(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("wait for package repository deletion") - result = packagePlugin.CheckRepositoryDeleted(&repoOptions) - Expect(result.Error).ToNot(HaveOccurred()) - - By("delete registry secret") - resultImgPullSecret = secretPlugin.DeleteRegistrySecret(&imgPullSecretOptions) - Expect(resultImgPullSecret.Error).ToNot(HaveOccurred()) -} - -func TestE2EPackageClient(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "E2E PackageClient Suite") -} diff --git a/cmd/cli/plugin/package/test/scripts/legacy_hack.sh b/cmd/cli/plugin/package/test/scripts/legacy_hack.sh deleted file mode 100755 index 6d9c034dfe..0000000000 --- a/cmd/cli/plugin/package/test/scripts/legacy_hack.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -tanzu config set features.management-cluster.package-based-cc false -tanzu config set features.cluster.allow-legacy-cluster true -tanzu config get diff --git a/cmd/cli/plugin/package/testdata/test-default-values.yaml b/cmd/cli/plugin/package/testdata/test-default-values.yaml deleted file mode 100644 index 32847fe60e..0000000000 --- a/cmd/cli/plugin/package/testdata/test-default-values.yaml +++ /dev/null @@ -1,6 +0,0 @@ -install_cert_manager: true -install_flux: true -install_tekton: true -ootb_supply_chain_testing_scanning: - dummyProperty-1: dummyDefault -profile: full diff --git a/cmd/cli/plugin/pinniped-auth/README.md b/cmd/cli/plugin/pinniped-auth/README.md deleted file mode 100644 index c4b54f1292..0000000000 --- a/cmd/cli/plugin/pinniped-auth/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# pinniped-auth - -Wrapper plugin provided for pinniped login - -## Usage diff --git a/cmd/cli/plugin/pinniped-auth/asset/README.md b/cmd/cli/plugin/pinniped-auth/asset/README.md deleted file mode 100644 index 359ad3aa4d..0000000000 --- a/cmd/cli/plugin/pinniped-auth/asset/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# What is going on here? - -* Yes, these files are empty. -* We check them into the repo so that the `go:embed` directives in - `cmd/cli/plugin/pinniped-auth/login.go` don't cause compilation to fail. -* The `hack/embed-pinniped-binary.sh` script will create "real" versions of these files that are - actual binaries that are embedded into the `pinniped-auth` plugin. diff --git a/cmd/cli/plugin/pinniped-auth/asset/pinniped-v0.12.1 b/cmd/cli/plugin/pinniped-auth/asset/pinniped-v0.12.1 deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/cmd/cli/plugin/pinniped-auth/doc.go b/cmd/cli/plugin/pinniped-auth/doc.go deleted file mode 100644 index 2dde6176c7..0000000000 --- a/cmd/cli/plugin/pinniped-auth/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Wrapper plugin provided for pinniped login. -package main diff --git a/cmd/cli/plugin/pinniped-auth/go.mod b/cmd/cli/plugin/pinniped-auth/go.mod deleted file mode 100644 index e9997340f5..0000000000 --- a/cmd/cli/plugin/pinniped-auth/go.mod +++ /dev/null @@ -1,67 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/plugin/pinniped-auth - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../../../apis/cli - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../../../cli/runtime -) - -require ( - github.com/MakeNowJust/heredoc v1.0.0 - github.com/adrg/xdg v0.4.0 - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/pkg/errors v0.9.1 - github.com/spf13/cobra v1.5.0 - github.com/stretchr/testify v1.8.0 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 -) - -require ( - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/briandowns/spinner v1.19.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.2 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/gomega v1.19.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - google.golang.org/protobuf v1.27.1 // 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/apimachinery v0.24.2 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/controller-runtime v0.12.3 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect -) diff --git a/cmd/cli/plugin/pinniped-auth/go.sum b/cmd/cli/plugin/pinniped-auth/go.sum deleted file mode 100644 index fbdd870a17..0000000000 --- a/cmd/cli/plugin/pinniped-auth/go.sum +++ /dev/null @@ -1,340 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -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.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.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -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/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -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.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -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.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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-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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -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 v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -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/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -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/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -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.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.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-20180906233101-161cd47e91fd/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-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-20190827160401-ba9fcec4b297/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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -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-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-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -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.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -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.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-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -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.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -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= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/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.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/cmd/cli/plugin/pinniped-auth/login.go b/cmd/cli/plugin/pinniped-auth/login.go deleted file mode 100644 index e45c64a95a..0000000000 --- a/cmd/cli/plugin/pinniped-auth/login.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - _ "embed" - "fmt" - "os" - "os/exec" - "path/filepath" - "runtime" - "strconv" - "strings" - - "github.com/adrg/xdg" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -var ( - // DefaultPluginRoot is the default plugin root. - DefaultPluginRoot = filepath.Join(xdg.DataHome, "tanzu-cli") -) - -type loginOIDCOptions struct { - scopes []string - caBundlePaths []string - caBundleData []string - issuer string - clientID string - sessionCachePath string - requestAudience string - conciergeAuthenticatorType string - conciergeAuthenticatorName string - conciergeEndpoint string - conciergeCABundle string - credentialCachePath string - listenPort uint16 - skipBrowser bool - debugSessionCache bool - conciergeEnabled bool -} - -// We currently embed only the 0.12.1 CLI -var ( - //go:embed asset/pinniped-v0.12.1 - pinnipedv0121Binary []byte -) - -var loginOptions = &loginOIDCOptions{} - -var loginCommand = &cobra.Command{ - Use: "login", - Short: "Login using an OpenID Connect provider", - SilenceUsage: true, - Example: ` - # pinniped-auth login using OpenID Connect provider - tanzu pinniped-auth login --issuer https://issuer.example.com --client-id tanzu-cli - - # pinniped-auth login using OpenID Connect provider with TCP port for local host listener (authorization code flow only) - tanzu pinniped-auth login --issuer https://issuer.example.com --client-id tanzu-cli --listen-port=48095`, -} - -func init() { - setLoginCommandFlags() -} - -func loginOIDCCommand( - getPinnipedCLICmdFunc func( - args []string, - pluginRoot, buildVersion, buildSHA string, - ) (*exec.Cmd, error), -) *cobra.Command { - - loginCommand.RunE = func(cmd *cobra.Command, args []string) error { - oidcLoginArgs := []string{ - "login", "oidc", - fmt.Sprintf("--issuer=%s", loginOptions.issuer), - fmt.Sprintf("--client-id=%s", loginOptions.clientID), - fmt.Sprintf("--listen-port=%d", loginOptions.listenPort), - fmt.Sprintf("--skip-browser=%s", strconv.FormatBool(loginOptions.skipBrowser)), - fmt.Sprintf("--session-cache=%s", loginOptions.sessionCachePath), - fmt.Sprintf("--debug-session-cache=%s", strconv.FormatBool(loginOptions.debugSessionCache)), - fmt.Sprintf("--scopes=%s", strings.Join(loginOptions.scopes, ",")), - fmt.Sprintf("--ca-bundle=%s", strings.Join(loginOptions.caBundlePaths, ",")), - fmt.Sprintf("--ca-bundle-data=%s", strings.Join(loginOptions.caBundleData, ",")), - fmt.Sprintf("--request-audience=%s", loginOptions.requestAudience), - fmt.Sprintf("--enable-concierge=%s", strconv.FormatBool(loginOptions.conciergeEnabled)), - fmt.Sprintf("--concierge-authenticator-type=%s", loginOptions.conciergeAuthenticatorType), - fmt.Sprintf("--concierge-authenticator-name=%s", loginOptions.conciergeAuthenticatorName), - fmt.Sprintf("--concierge-endpoint=%s", loginOptions.conciergeEndpoint), - fmt.Sprintf("--concierge-ca-bundle-data=%s", loginOptions.conciergeCABundle), - fmt.Sprintf("--credential-cache=%s", loginOptions.credentialCachePath), - } - - pinnipedCliCmd, err := getPinnipedCLICmdFunc(oidcLoginArgs, DefaultPluginRoot, buildinfo.Version, buildinfo.SHA) - if err != nil { - return fmt.Errorf("cannot construct pinniped cli command: %w", err) - } - if err := pinnipedCliCmd.Run(); err != nil { - return fmt.Errorf("pinniped-auth login failed: %w", err) - } - return nil - } - return loginCommand -} - -func getPinnipedCLICmd(args []string, pluginRoot, buildVersion, buildSHA string) (*exec.Cmd, error) { - pinnipedBinary := pinnipedv0121Binary - pinnipedVersion := "v0.12.1" - - buildSHA = strings.ReplaceAll(buildSHA, "-dirty", "") - pinnipedCLIBinFile := fmt.Sprintf("tanzu-pinniped-%s-client-%s-%s", pinnipedVersion, buildVersion, buildSHA) - if runtime.GOOS == "windows" { - pinnipedCLIBinFile += ".exe" - } - - pinnipedGoClientRoot := filepath.Join(pluginRoot, "tanzu-pinniped-go-client") - if err := ensurePinnipedGoClientRoot(pinnipedGoClientRoot); err != nil { - return nil, err - } - - pinnipedCLIBinFilePath := filepath.Join(pinnipedGoClientRoot, pinnipedCLIBinFile) - if err := ensurePinnipedCLIBinFile(pinnipedCLIBinFilePath, pinnipedBinary); err != nil { - return nil, err - } - - cmd := exec.Command(pinnipedCLIBinFilePath, args...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Stdin = os.Stdin - - return cmd, nil -} - -func setLoginCommandFlags() { - loginCommand.Flags().StringVar(&loginOptions.issuer, "issuer", "", "OpenID Connect issuer URL.") - loginCommand.Flags().StringVar(&loginOptions.clientID, "client-id", "pinniped-cli", "OpenID Connect client ID.") - loginCommand.Flags().Uint16Var(&loginOptions.listenPort, "listen-port", 0, "TCP port for localhost listener (authorization code flow only).") - loginCommand.Flags().StringSliceVar(&loginOptions.scopes, "scopes", []string{"offline_access, openid, pinniped:request-audience"}, "OIDC scopes to request during login.") - loginCommand.Flags().BoolVar(&loginOptions.skipBrowser, "skip-browser", false, "Skip opening the browser (just print the URL).") - loginCommand.Flags().StringVar(&loginOptions.sessionCachePath, "session-cache", filepath.Join(mustGetConfigDir(), "sessions.yaml"), "Path to session cache file.") - loginCommand.Flags().StringSliceVar(&loginOptions.caBundlePaths, "ca-bundle", nil, "Path to TLS certificate authority bundle (PEM format, optional, can be repeated).") - loginCommand.Flags().StringSliceVar(&loginOptions.caBundleData, "ca-bundle-data", nil, "Base64 endcoded TLS certificate authority bundle (base64 encoded PEM format, optional, can be repeated)") - loginCommand.Flags().BoolVar(&loginOptions.debugSessionCache, "debug-session-cache", false, "Print debug logs related to the session cache.") - loginCommand.Flags().StringVar(&loginOptions.requestAudience, "request-audience", "", "Request a token with an alternate audience using RFC8693 token exchange") - loginCommand.Flags().BoolVar(&loginOptions.conciergeEnabled, "enable-concierge", false, "Exchange the OIDC ID token with the Pinniped concierge during login") - loginCommand.Flags().StringVar(&loginOptions.conciergeAuthenticatorType, "concierge-authenticator-type", "", "Concierge authenticator type (e.g., 'webhook', 'jwt')") - loginCommand.Flags().StringVar(&loginOptions.conciergeAuthenticatorName, "concierge-authenticator-name", "", "Concierge authenticator name") - loginCommand.Flags().StringVar(&loginOptions.conciergeEndpoint, "concierge-endpoint", "", "API base for the Pinniped concierge endpoint") - loginCommand.Flags().StringVar(&loginOptions.conciergeCABundle, "concierge-ca-bundle-data", "", "CA bundle to use when connecting to the concierge") - loginCommand.Flags().StringVar(&loginOptions.credentialCachePath, "credential-cache", filepath.Join(mustGetConfigDir(), "credentials.yaml"), "Path to cluster-specific credentials cache (\"\" disables the cache)") - loginCommand.Flags().MarkHidden("debug-session-cache") //nolint - loginCommand.MarkFlagRequired("issuer") //nolint -} - -// mustGetConfigDir returns the pinniped config directory -func mustGetConfigDir() string { - const pinnipedConfigDir = "pinniped" - - tanzuLocalDir, err := config.LocalDir() - if err != nil { - panic(err) - } - return filepath.Join(tanzuLocalDir, pinnipedConfigDir) -} - -// Ensure the pinniped go client directory exists. -func ensurePinnipedGoClientRoot(pinnipedGoClientRoot string) error { - _, err := os.Stat(pinnipedGoClientRoot) - if os.IsNotExist(err) { - err := os.MkdirAll(pinnipedGoClientRoot, 0755) - return errors.Wrap(err, "could not make pinniped go client directory") - } - return err -} - -// Ensure the pinniped cli binary file exists. -func ensurePinnipedCLIBinFile(pinnipedCLIBinFilePath string, pinnipedBinary []byte) error { - _, err := os.Stat(pinnipedCLIBinFilePath) - if os.IsNotExist(err) { - err = os.WriteFile(pinnipedCLIBinFilePath, pinnipedBinary, 0755) - if err != nil { - return errors.Wrap(err, "could not write pinniped binary to file") - } - } - return nil -} diff --git a/cmd/cli/plugin/pinniped-auth/login_test.go b/cmd/cli/plugin/pinniped-auth/login_test.go deleted file mode 100644 index cd931d8d5d..0000000000 --- a/cmd/cli/plugin/pinniped-auth/login_test.go +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "bytes" - "crypto/sha256" - "encoding/hex" - "errors" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - "testing" - - "github.com/MakeNowJust/heredoc" - "github.com/stretchr/testify/require" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" -) - -const ( - tanzuCLIBuildVersion = "1.2.3" - tanzuCLIBuildSHA = "abc123" -) - -func TestLoginOIDCCommand(t *testing.T) { - sessionsCacheFilePath := filepath.Join(mustGetConfigDir(), "sessions.yaml") - credentialCacheFilePath := filepath.Join(mustGetConfigDir(), "credentials.yaml") - tests := []struct { - name string - args []string - getPinnipedCLICmdErr error - execReturnExitCode int - wantError bool - wantStdout string - wantStderr string - wantArgs []string - }{ - { - name: "missing required flags", - args: []string{}, - wantError: true, - wantStderr: Doc(` - Error: required flag(s) "issuer" not set - `), - }, - { - name: "getting pinniped cli cmd fails", - args: []string{ - "--issuer", "test-issuer", - }, - getPinnipedCLICmdErr: errors.New("some construction error"), - wantError: true, - wantStderr: Doc(` - Error: cannot construct pinniped cli command: some construction error - `), - wantArgs: []string{ - "login", - "oidc", - "--issuer=test-issuer", - "--client-id=pinniped-cli", - "--listen-port=0", - "--skip-browser=false", - fmt.Sprintf("--session-cache=%s", sessionsCacheFilePath), - "--debug-session-cache=false", - "--scopes=offline_access, openid, pinniped:request-audience", - "--ca-bundle=", - "--ca-bundle-data=", - "--request-audience=", - "--enable-concierge=false", - "--concierge-authenticator-type=", - "--concierge-authenticator-name=", - "--concierge-endpoint=", - "--concierge-ca-bundle-data=", - fmt.Sprintf("--credential-cache=%s", credentialCacheFilePath), - }, - }, - { - name: "cli exec returns error from login", - args: []string{ - "--issuer", "test-issuer", - }, - execReturnExitCode: 88, - wantError: true, - wantStderr: Doc(` - Error: pinniped-auth login failed: exit status 88 - `), - wantArgs: []string{ - "login", - "oidc", - "--issuer=test-issuer", - "--client-id=pinniped-cli", - "--listen-port=0", - "--skip-browser=false", - fmt.Sprintf("--session-cache=%s", sessionsCacheFilePath), - "--debug-session-cache=false", - "--scopes=offline_access, openid, pinniped:request-audience", - "--ca-bundle=", - "--ca-bundle-data=", - "--request-audience=", - "--enable-concierge=false", - "--concierge-authenticator-type=", - "--concierge-authenticator-name=", - "--concierge-endpoint=", - "--concierge-ca-bundle-data=", - fmt.Sprintf("--credential-cache=%s", credentialCacheFilePath), - }, - }, - { - name: "test options allow multiple values", - args: []string{ - "--issuer", "test-issuer", - "--scopes", "offline_access, openid", - "--ca-bundle", "/some/path, /another/path", - "--ca-bundle-data", "somebase64encodeddata, morebase64encodeddata", - }, - wantArgs: []string{ - "login", - "oidc", - "--issuer=test-issuer", - "--client-id=pinniped-cli", - "--listen-port=0", - "--skip-browser=false", - fmt.Sprintf("--session-cache=%s", sessionsCacheFilePath), - "--debug-session-cache=false", - "--scopes=offline_access, openid", - "--ca-bundle=/some/path, /another/path", - "--ca-bundle-data=somebase64encodeddata, morebase64encodeddata", - "--request-audience=", - "--enable-concierge=false", - "--concierge-authenticator-type=", - "--concierge-authenticator-name=", - "--concierge-endpoint=", - "--concierge-ca-bundle-data=", - fmt.Sprintf("--credential-cache=%s", credentialCacheFilePath), - }, - }, - { - name: "test options are populated correctly with defaults", - args: []string{ - "--issuer", "test-issuer", - }, - wantArgs: []string{ - "login", - "oidc", - "--issuer=test-issuer", - "--client-id=pinniped-cli", - "--listen-port=0", - "--skip-browser=false", - fmt.Sprintf("--session-cache=%s", sessionsCacheFilePath), - "--debug-session-cache=false", - "--scopes=offline_access, openid, pinniped:request-audience", - "--ca-bundle=", - "--ca-bundle-data=", - "--request-audience=", - "--enable-concierge=false", - "--concierge-authenticator-type=", - "--concierge-authenticator-name=", - "--concierge-endpoint=", - "--concierge-ca-bundle-data=", - fmt.Sprintf("--credential-cache=%s", credentialCacheFilePath), - }, - }, - { - name: "test options are populated correctly with given user values", - args: []string{ - "--issuer", "different-issuer", - "--client-id", "test-client", - "--listen-port", "3737", - "--skip-browser", "true", - "--debug-session-cache", "true", - "--scopes", "openid", - "--session-cache", "/path/to/session", - "--credential-cache", "/path/to/cred", - "--ca-bundle", "/some/path", - "--ca-bundle-data", "somebase64encodeddata", - "--request-audience", "alternateaudience", - "--enable-concierge", "true", - "--concierge-authenticator-type", "webhook", - "--concierge-authenticator-name", "concierge-authenticator", - "--concierge-endpoint", "test-endpoint", - "--concierge-ca-bundle-data", "test-bundle", - }, - wantArgs: []string{ - "login", - "oidc", - "--issuer=different-issuer", - "--client-id=test-client", - "--listen-port=3737", - "--skip-browser=true", - "--session-cache=/path/to/session", - "--debug-session-cache=true", - "--scopes=openid", - "--ca-bundle=/some/path", - "--ca-bundle-data=somebase64encodeddata", - "--request-audience=alternateaudience", - "--enable-concierge=true", - "--concierge-authenticator-type=webhook", - "--concierge-authenticator-name=concierge-authenticator", - "--concierge-endpoint=test-endpoint", - "--concierge-ca-bundle-data=test-bundle", - "--credential-cache=/path/to/cred", - }, - }, - } - - for _, test := range tests { - test := test - // Resetting and setting the flags again is necessary in these tests to ensure new - // flags get picked up - loginCommand.ResetFlags() - setLoginCommandFlags() - t.Run(test.name, func(t *testing.T) { - var ( - gotArgs []string - ) - cmd := loginOIDCCommand(func(args []string, pluginRoot, buildVersion, buildSHA string) (*exec.Cmd, error) { - gotArgs = args - - require.Equal(t, DefaultPluginRoot, pluginRoot) - require.Equal(t, buildinfo.Version, buildVersion) - require.Equal(t, buildinfo.SHA, buildSHA) - - cmd := exec.Command("./testdata/fake-pinniped-cli.sh") - cmd.Env = []string{fmt.Sprintf("FAKE_PINNIPED_CLI_EXIT_CODE=%d", test.execReturnExitCode)} - return cmd, test.getPinnipedCLICmdErr - }) - require.NotNil(t, cmd) - - var stdout, stderr bytes.Buffer - cmd.SetOut(&stdout) - cmd.SetErr(&stderr) - cmd.SetArgs(test.args) - err := cmd.Execute() - if test.wantError { - require.Error(t, err) - } else { - require.NoError(t, err) - } - require.Equal(t, test.wantStdout, stdout.String(), "unexpected stdout") - require.Equal(t, test.wantStderr, stderr.String(), "unexpected stderr") - require.Equal(t, test.wantArgs, gotArgs, "Given CLI arguments did not match actual CLI arguments") - }) - } -} - -func TestGetPinnipedCLICmd(t *testing.T) { - tests := []struct { - name string - isBuildSHADirty bool - wantError string - wantPinnipedVersion string - wantBinary []byte - }{ - { - name: "0.12.1 cli", - wantPinnipedVersion: "v0.12.1", - wantBinary: pinnipedv0121Binary, - }, - { - name: "0.12.1 cli with dirty build sha", - isBuildSHADirty: true, - wantPinnipedVersion: "v0.12.1", - wantBinary: pinnipedv0121Binary, - }, - } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - pluginRoot, err := os.MkdirTemp("", "pinniped-auth-get-pinniped-cli-cmd-test-*") - require.NoError(t, err) - defer require.NoError(t, os.RemoveAll(pluginRoot)) - - buildSHA := tanzuCLIBuildSHA - wantBuildSHA := tanzuCLIBuildSHA - if test.isBuildSHADirty { - buildSHA = buildSHA + "-dirty" - } - - wantPathBasename := fmt.Sprintf("tanzu-pinniped-%s-client-%s-%s", test.wantPinnipedVersion, tanzuCLIBuildVersion, wantBuildSHA) - wantPath := filepath.Join(pluginRoot, "tanzu-pinniped-go-client", wantPathBasename) - wantArgs := []string{"some", "args", "here"} - - cmd, err := getPinnipedCLICmd(wantArgs, pluginRoot, tanzuCLIBuildVersion, buildSHA) - if test.wantError != "" { - require.EqualError(t, err, test.wantError) - return - } - require.NoError(t, err) - - require.Equal(t, wantPath, cmd.Path) - require.FileExists(t, cmd.Path) - requireFileContents(t, cmd.Path, test.wantBinary) - require.Equal(t, append([]string{cmd.Path}, wantArgs...), cmd.Args) - require.Equal(t, os.Stdout, cmd.Stdout) - require.Equal(t, os.Stderr, cmd.Stderr) - require.Equal(t, os.Stdin, cmd.Stdin) - require.Empty(t, cmd.Env) - require.Empty(t, cmd.Dir) - }) - } -} - -// TestGetPinnipedCLICmdMultipleUsage validates that the pinniped CLI binary logic works when used -// multiple times with the same plugin root. -func TestGetPinnipedCLICmdMultipleUsage(t *testing.T) { - pluginRoot, err := os.MkdirTemp("", "pinniped-auth-get-pinniped-cli-cmd-test-*") - require.NoError(t, err) - defer require.NoError(t, os.RemoveAll(pluginRoot)) - - steps := []struct { - wantPinnipedVersion string - wantBinary []byte - }{ - { - wantPinnipedVersion: "v0.12.1", - wantBinary: pinnipedv0121Binary, - }, - } - for _, step := range steps { - wantPathBasename := fmt.Sprintf("tanzu-pinniped-%s-client-%s-%s", step.wantPinnipedVersion, tanzuCLIBuildVersion, tanzuCLIBuildSHA) - wantPath := filepath.Join(pluginRoot, "tanzu-pinniped-go-client", wantPathBasename) - - cmd, err := getPinnipedCLICmd([]string{}, pluginRoot, tanzuCLIBuildVersion, tanzuCLIBuildSHA) - require.NoError(t, err) - require.Equal(t, wantPath, cmd.Path) - require.FileExists(t, cmd.Path) - requireFileContents(t, cmd.Path, step.wantBinary) - } -} - -func Doc(s string) string { - const ( - tab = "\t" - twoSpaces = " " - ) - return strings.ReplaceAll(heredoc.Doc(s), tab, twoSpaces) -} - -func requireFileContents(t *testing.T, path string, wantContents []byte) { - t.Helper() - - gotContents, err := os.ReadFile(path) - require.NoError(t, err) - - // These binary files can be really large (~50M), so comparing them via digest will speed up the - // tests considerably. - hash := sha256.New() - - hash.Reset() - hash.Write(wantContents) - wantDigest := hash.Sum(nil) - - hash.Reset() - hash.Write(gotContents) - gotDigest := hash.Sum(nil) - - require.Equalf(t, hex.EncodeToString(wantDigest[:]), hex.EncodeToString(gotDigest[:]), "path %q does not have expected contents", path) -} diff --git a/cmd/cli/plugin/pinniped-auth/main.go b/cmd/cli/plugin/pinniped-auth/main.go deleted file mode 100644 index 4d0b3701b6..0000000000 --- a/cmd/cli/plugin/pinniped-auth/main.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "pinniped-auth", - Description: "Pinniped authentication operations (usually not directly invoked)", - Group: cliapi.RunCmdGroup, - Hidden: true, - Aliases: []string{"pa", "pinniped-auths"}, - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - p.AddCommands( - loginOIDCCommand(getPinnipedCLICmd), - ) - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/cmd/cli/plugin/pinniped-auth/test/main.go b/cmd/cli/plugin/pinniped-auth/test/main.go deleted file mode 100644 index 4575fc9964..0000000000 --- a/cmd/cli/plugin/pinniped-auth/test/main.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("pinniped-auth") - -func main() { - retcode := 0 - - defer func() { os.Exit(retcode) }() - defer Cleanup() - - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Println(err) - retcode = 1 - return - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - retcode = 1 - return - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} - -// Cleanup the test. -func Cleanup() {} diff --git a/cmd/cli/plugin/pinniped-auth/testdata/fake-pinniped-cli.sh b/cmd/cli/plugin/pinniped-auth/testdata/fake-pinniped-cli.sh deleted file mode 100755 index ad80f89adf..0000000000 --- a/cmd/cli/plugin/pinniped-auth/testdata/fake-pinniped-cli.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -o errexit -set -o nounset -set -o pipefail - -exit "$FAKE_PINNIPED_CLI_EXIT_CODE" diff --git a/cmd/cli/plugin/secret/README.md b/cmd/cli/plugin/secret/README.md deleted file mode 100644 index 96b38c055d..0000000000 --- a/cmd/cli/plugin/secret/README.md +++ /dev/null @@ -1,293 +0,0 @@ -# secret - -Manage secret operations. - -## secret registry - -Manage registry secret operations. Registry secrets enable the package and package repository consumers to authenticate to and pull images from private registries. - -### Usage - -tanzu secret registry [command] - -```sh ->>> tanzu secret registry --help -Manage registry secret operations. Registry secrets enable the package and package repository consumers to authenticate to and pull images from private registries. - -Usage: - tanzu secret registry [command] - -Available Commands: - add Creates a v1/Secret resource of type kubernetes.io/dockerconfigjson - delete Deletes v1/Secret resource of type kubernetes.io/dockerconfigjson and the associated SecretExport from the cluster - list Lists all v1/Secret of type kubernetes.io/dockerconfigjson and checks for the associated SecretExport with the same name - -Flags: - -h, --help help for registry secret - --log-file string Log file path - --verbose int32 Number for the log level verbosity(0-9) - -Use "tanzu secret registry [command] --help" for more information about a command. -``` - -### Supported commands - -the "secret registry" can be used to: - -* add a registry secret -* list registry secrets -* delete a registry secret -* update a registry secret - -#### Add a registry secret - - The "add" command creates a v1/Secret of type kubernetes.io/dockerconfigjson. - In case of specifying the --export-to-all-namespaces flag, a SecretExport resource with the same name will be created, which makes the secret available across all namespaces in the cluster. - - ```sh - >>> tanzu secret registry add tanzu-net -n test-ns --server registry.pivotal.io --username test-user --password-file pass-file --export-to-all-namespaces - / Adding registry secret 'test-secret'... - Added registry secret 'test-secret' into namespace 'test-ns' - ``` - -#### List registry secrets - - The "list" command lists a v1/Secret of type kubernetes.io/dockerconfigjson for a specified namespace. If namespace flag is not specified, it lists the secrets from `default` namespace. - It also supports -A flag to list the secrets across all namespaces. - In case a SecretExport resource exists with the same name as the Secret, it will check if it is exported `to all namespaces` or `to some namespaces` and display that in EXPORTED column. If not, it will display `not exported` in the EXPORTED column. - -##### List registry secrets from specified namespace - - ```sh - >>> tanzu secret registry list -n test-ns - / Retrieving registry secrets... - NAME REGISTRY EXPORTED AGE - pkg-dev-reg registry.pivotal.io to all namespaces 15d - ``` - -##### List registry secrets across all namespaces - - ```sh - >>> tanzu secret registry list -A - \ Retrieving registry secrets... - NAME REGISTRY EXPORTED AGE NAMESPACE - pkg-dev-reg registry.pivotal.io to all namespaces 15d test-ns - tanzu-standard-fetch-0 registry.pivotal.io not exported 15d tanzu-package-repo-global - private-repo-fetch-0 registry.pivotal.io not exported 15d test-ns - antrea-fetch-0 registry.pivotal.io not exported 15d tkg-system - metrics-server-fetch-0 registry.pivotal.io not exported 15d tkg-system - tanzu-addons-manager-fetch-0 registry.pivotal.io not exported 15d tkg-system - tanzu-core-fetch-0 registry.pivotal.io not exported 15d tkg-system - ``` - -##### List registry secrets in json output format - - ```sh - >>> tanzu secret registry list -n kapp-controller-packaging-global -o json - [ - { - "age": "15d", - "exported": "to all namespaces", - "name": "pkg-dev-reg", - "registry": "us-east4-docker.pkg.dev" - } - ] - ``` - -##### List registry secrets in yaml output format - - ```sh - >>> tanzu secret registry list -n kapp-controller-packaging-global -o yaml - - age: 15d - exported: to all namespaces - name: pkg-dev-reg - registry: us-east4-docker.pkg.dev - ``` - -##### List registry secrets in table output format - - ```sh - >>> tanzu secret registry list -n kapp-controller-packaging-global -o table - / Retrieving registry secrets... - NAME REGISTRY EXPORTED AGE - pkg-dev-reg us-east4-docker.pkg.dev to all namespaces 15d - ``` - -#### Delete a registry secret - - The "delete" command deletes a v1/Secret of type kubernetes.io/dockerconfigjson from the specified namespace. If no namespace is specified, the secret will be deleted from the default namespace (if existing). - In case a SecretExport resource with the same name exists, it will be deleted from the namespace as well. - - ```sh - >>> tanzu secret registry delete test-secret -n test-ns - Deleting registry secret 'test-secret' from namespace 'test-ns'. Are you sure? [y/N]: y - \ Deleting registry secret 'test-secret'... - Deleted registry secret 'test-secret' from namespace 'test-ns' - ``` - -#### Update a registry secret - - The "update" command updates the v1/Secret of type kubernetes.io/dockerconfigjson. - In case of specifying the --export-to-all-namespaces flag, the SecretExport resource will also get updated. Otherwise, there will be no changes in the SecretExport resource. - -##### Update a registry secret. There will be no changes in the associated SecretExport resource - - ```sh - >>> tanzu secret registry update test-secret --username test-user -n test-ns --password-env-var PASSENV - \ Updating registry secret 'test-secret'... - Updated registry secret 'test-secret' in namespace 'test-ns' - ``` - -##### Update a registry secret with 'export-to-all-namespaces' flag being set - - ```sh - >>> tanzu secret registry update test-secret--username test-user -n test-ns --password-env-var PASSENV --export-to-all-namespaces=true - Warning: By specifying --export-to-all-namespaces as true, given secret contents will be available to ALL users in ALL namespaces. Please ensure that included registry credentials allow only read-only access to the registry with minimal necessary scope. - Are you sure you want to proceed? [y/N]: y - - \ Updating registry secret 'test-secret'... - Updated registry secret 'test-secret' in namespace 'test-ns' - Exported registry secret 'test-secret' to all namespaces - ``` - - ```sh - >>> tanzu secret registry update test-secret --username test-user -n test-ns --password-env-var PASSENV --export-to-all-namespaces - Warning: By specifying --export-to-all-namespaces as true, given secret contents will be available to ALL users in ALL namespaces. Please ensure that included registry credentials allow only read-only access to the registry with minimal necessary scope. - Are you sure you want to proceed? [y/N]: y - - \ Updating registry secret 'test-secret'... - Updated registry secret 'test-secret' in namespace 'test-ns' - Exported registry secret 'test-secret' to all namespaces - ``` - -##### Update a registry secret with 'export-to-all-namespaces' flag being clear. In this case, the associated SecretExport resource will get deleted - - ```sh - >>> tanzu secret registry update test-secret --username test-user -n test-ns --password-env-var PASSENV --export-to-all-namespaces=false - Warning: By specifying --export-to-all-namespaces as false, the secret contents will get unexported from ALL namespaces in which it was previously available to. - Are you sure you want to proceed? [y/N]: y - - \ Updating registry secret 'test-secret'... - Updated registry secret 'test-secret' in namespace 'test-ns' - Unexported registry secret 'test-secret' from all namespaces - ``` - -## Workflow for adding a private package repository and installation of a private package - -You can add a private package repository and install a private package using the following procedure: - -1. First, create the namespace in which the secret is getting added to: - - ```sh - kubectl create namespace - ``` - -2. Before adding a private package repository, registry secret should be added to the cluster. If you are planning to add the private repository in the same namespace as the registry secret, it suffices to run the following command. Otherwise, please use step '3.a'. - - ```sh - tanzu secret registry add --server --username --namespace --password - ``` - - The output would be as follows: - - ```sh - - Adding registry secret ''... - Added registry secret '' into namespace '' - ``` - -3. In case you want to add the private repository in a different namespace than the namespace in which the secret was added to, you need to export the secret to all other namespaces. Please be aware that by doing so, the given secret contents will be available to ALL users in ALL namespaces. Please ensure that included registry credentials allow only read-only access to the registry with minimal necessary scope. You can export the secret to other namespaces using one of the following options: - - a. You can export the secret to all other namespaces at the time of adding the secret: - - ```sh - tanzu secret registry add --server --username --namespace --password --export-to-all-namespaces=true -y - ``` - - The output would be as follows: - - ```sh - - Adding registry secret ''... - Added registry secret '' into namespace '' - Exported registry secret '' to all namespaces - ``` - - b. Alternatively, you can update an existing secret to export it to all other namespaces: - - ```sh - tanzu secret registry update --namespace --export-to-all-namespaces=true -y - ``` - - The output would be as follows: - - ```sh - \ Updating registry secret ''... - Updated registry secret '' in namespace '' - Exported registry secret '' to all namespaces - ``` - -4. Add the private package repository to the target namespace in which you want to install the private package by running: - - ```sh - tanzu package repository add --url --namespace --create-namespace - ``` - - The output of the command would be as follows: - - ```sh - - Adding package repository '' - | Validating provided settings for the package repository - \ Creating namespace '' - | Creating package repository resource - \ Waiting for 'PackageRepository' reconciliation for '' - / 'PackageRepository' resource install status: Reconciling - - Added package repository '' in namespace '' - ``` - -5. Verify that the private package repository has been successfully added to the target namespace by running. You should ensure that the status field be 'Reconcile succeeded': - - ```sh - tanzu package repository get --namespace - ``` - -6. List the available packages by running: - - ```sh - tanzu package available list --namespace - ``` - -7. List version information for the package by running: - - ```sh - tanzu package available list --namespace - ``` - -8. Install the private package with a specific version: - - ```sh - tanzu package installed create --package-name --version --namespace - ``` - - Please follow the specific installation instructions for the package in case additional configuration parameters are needed - - The output of the command would be as follows: - - ```sh - - Installing package '' - | Getting package metadata for '' - | Creating namespace '' - | Creating service account '--sa' - | Creating cluster admin role '--cluster-role' - | Creating cluster role binding '--cluster-rolebinding' - | Creating package resource - - Waiting for 'PackageInstall' reconciliation for '' - - 'PackageInstall' resource install status: Reconciling - - Added installed package '' - ``` - -9. Verify the successful package installation by running: - - ```sh - tanzu package installed get --namespace - ``` diff --git a/cmd/cli/plugin/secret/go.mod b/cmd/cli/plugin/secret/go.mod deleted file mode 100644 index 441c54ad30..0000000000 --- a/cmd/cli/plugin/secret/go.mod +++ /dev/null @@ -1,121 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/secret - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/config => ../../../../apis/config - github.com/vmware-tanzu/tanzu-framework/apis/run => ../../../../apis/run - github.com/vmware-tanzu/tanzu-framework/capabilities/client => ../../../../capabilities/client - github.com/vmware-tanzu/tanzu-framework/cli/core => ../../../../cli/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../../../cli/runtime - github.com/vmware-tanzu/tanzu-framework/packageclients => ../../../../packageclients - github.com/vmware-tanzu/tanzu-framework/tkg => ../../../../tkg -) - -require ( - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/pkg/errors v0.9.1 - github.com/spf13/cobra v1.5.0 - github.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/packageclients v0.0.0-00010101000000-000000000000 - golang.org/x/term v0.6.0 - k8s.io/api v0.24.4 - k8s.io/apimachinery v0.24.4 - k8s.io/client-go v0.24.4 - sigs.k8s.io/controller-runtime v0.12.3 -) - -require ( - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.23 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.18 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/getkin/kin-openapi v0.94.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/swag v0.21.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.0.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.9 // indirect - github.com/google/go-containerregistry v0.7.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // 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/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/gomega v1.20.2 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 // indirect - github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 // indirect - github.com/vmware-tanzu/carvel-vendir v0.26.0 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.1 // 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/apiextensions-apiserver v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/cluster-api v1.2.8 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/cmd/cli/plugin/secret/go.sum b/cmd/cli/plugin/secret/go.sum deleted file mode 100644 index 876e3a8f4d..0000000000 --- a/cmd/cli/plugin/secret/go.sum +++ /dev/null @@ -1,1738 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.23 h1:bRQWsW25/YkoxnIqXMPF94JW33qWDcrPMZ3bINaAruU= -github.com/Azure/go-autorest/autorest v0.11.23/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudfoundry/bosh-utils v0.0.0-20191216173634-505d7f919144/go.mod h1:JCrKwetZGjxbfq1U139TZuXDBfdGLtjOEAfxMWKV/QM= -github.com/cloudfoundry/config-server v0.1.20/go.mod h1:Y3b/MHqyp22CcG0X1qvEHG8lujoebxjD9IAslyS/Yk0= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.10.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -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/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getkin/kin-openapi v0.94.0 h1:bAxg2vxgnHHHoeefVdmGbR+oxtJlcv5HsJJa3qmAHuo= -github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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 v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.7.0 h1:u0onUUOcyoCDHEiJoyR1R1gx5er1+r06V5DBhUU5ndk= -github.com/google/go-containerregistry v0.7.0/go.mod h1:2zaoelrL0d08gGbpdP3LqyUuBmhWbpD6IOe2s9nLS2k= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -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/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -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 v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.20.2 h1:8uQq0zMgLEfa0vRrrBgaJF2gyW9Da9BmfGV+OyUzfkY= -github.com/onsi/gomega v1.20.2/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 h1:zgWNumjhN+0CCiq1Wo4lVTmO89eOA6HuPXgv1sVhE4k= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0/go.mod h1:Hldrv7kPAD3THS1yUYZPFIaHmPE0ENO0ljzbJrpftiE= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 h1:3mSDyzhf52Y0jdvHrhJUf4Sk97CILBOkQt/WUaD8G/8= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0/go.mod h1:UW9xzccG6vjNoq2emVderTX11epILNyxtmGxFupRsHc= -github.com/vmware-tanzu/carvel-vendir v0.26.0 h1:Q98tPnH9WUAWE2vJSAP0lsHGsfwGjfW2y+JUOEiJ/Yk= -github.com/vmware-tanzu/carvel-vendir v0.26.0/go.mod h1:JcuNNVONFbZTbm/GjtGiWUfFrt17YBQzeGT9+gY1+yY= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -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= -gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211111162719-482062a4217b/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= -k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/api v0.24.4 h1:I5Y645gJ8zWKawyr78lVfDQkZrAViSbeRXsPZWTxmXk= -k8s.io/api v0.24.4/go.mod h1:42pVfA0NRxrtJhZQOvRSyZcJihzAdU59WBtTjYcB0/M= -k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= -k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.4 h1:S0Ur3J/PbivTcL43EdSdPhqCqKla2NIuneNwZcTDeGQ= -k8s.io/apimachinery v0.24.4/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= -k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= -k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/client-go v0.24.4 h1:hIAIJZIPyaw46AkxwyR0FRfM/pRxpUNTd3ysYu9vyRg= -k8s.io/client-go v0.24.4/go.mod h1:+AxlPWw/H6f+EJhRSjIeALaJT4tbeB/8g9BNvXGPd0Y= -k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= -k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/cmd/cli/plugin/secret/main.go b/cmd/cli/plugin/secret/main.go deleted file mode 100644 index 0aa9e155b1..0000000000 --- a/cmd/cli/plugin/secret/main.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - _ "k8s.io/client-go/plugin/pkg/client/auth" - - capdiscovery "github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/kappclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "secret", - Description: "Tanzu secret management", - Group: cliapi.RunCmdGroup, - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, -} - -var ( - logLevel int32 - outputFormat string - kubeConfig string -) - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err, "failed to create a new instance of the plugin") - } - - p.Cmd.PersistentFlags().Int32VarP(&logLevel, "verbose", "", 0, "Number for the log level verbosity(0-9)") - p.Cmd.PersistentFlags().StringVarP(&kubeConfig, "kubeconfig", "", "", "The path to the kubeconfig file, optional") - - p.AddCommands( - registrySecretCmd, - ) - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func isSecretGenAPIAvailable(kubeCfgPath string) (bool, error) { - cfg, err := kappclient.GetKubeConfig(kubeCfgPath) - if err != nil { - return false, err - } - clusterQueryClient, err := capdiscovery.NewClusterQueryClientForConfig(cfg) - if err != nil { - log.Error(err, "failed to create a new instance of the cluster query builder") - return false, err - } - - apiGroup := capdiscovery.Group("secretGenAPIQuery", packagedatamodel.SecretGenAPIName).WithVersions(packagedatamodel.SecretGenAPIVersion).WithResource("secretexports") - return clusterQueryClient.Query(apiGroup).Execute() -} diff --git a/cmd/cli/plugin/secret/registry.go b/cmd/cli/plugin/secret/registry.go deleted file mode 100644 index 3ffaf8ff56..0000000000 --- a/cmd/cli/plugin/secret/registry.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var registrySecretOp = packagedatamodel.NewRegistrySecretOptions() - -var registrySecretCmd = &cobra.Command{ - Use: "registry", - Short: "Registry secret operations", - ValidArgs: []string{"add", "list", "delete", "update"}, - Args: cobra.RangeArgs(1, 3), - Long: `Add, list, delete or update a registry secret. Registry secrets enable the package and package repository consumers to authenticate to and pull images from private registries.`, - PersistentPreRunE: secretGenAvailabilityCheck, -} - -func init() { - registrySecretCmd.PersistentFlags().StringVarP(®istrySecretOp.Namespace, "namespace", "n", "default", "Target namespace for the registry secret, optional") -} - -func secretGenAvailabilityCheck(_ *cobra.Command, _ []string) error { - found, err := isSecretGenAPIAvailable(kubeConfig) - if err != nil { - return errors.Wrap(err, fmt.Sprintf("failed to check for the availability of '%s' API", packagedatamodel.SecretGenAPIName)) - } - if !found { - return fmt.Errorf(packagedatamodel.SecretGenAPINotAvailable, packagedatamodel.SecretGenAPIName, packagedatamodel.SecretGenAPIVersion) - } - - return nil -} diff --git a/cmd/cli/plugin/secret/registry_secret_add.go b/cmd/cli/plugin/secret/registry_secret_add.go deleted file mode 100644 index 928caf6b9d..0000000000 --- a/cmd/cli/plugin/secret/registry_secret_add.go +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "fmt" - "os" - - "github.com/aunum/log" - "github.com/pkg/errors" - "github.com/spf13/cobra" - "golang.org/x/term" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/kappclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -const errInvalidPasswordFlags = "exactly one of --password, --password-file, --password-env-var flags should be provided" -const errEmptyValue = "the value for %s flag should not be empty" - -var registrySecretAddCmd = &cobra.Command{ - Use: "add SECRET_NAME --server REGISTRY_SERVER --username USERNAME --password PASSWORD", - Short: "Creates a v1/Secret resource", - Long: "Creates a v1/Secret resource of type kubernetes.io/dockerconfigjson. In case of specifying the --export-to-all-namespaces flag, a SecretExport resource will also get created.", - Example: ` - # Add a registry secret - tanzu secret registry add test-secret --server projects-stg.registry.vmware.com --username test-user --password-file test-file - - # Add a registry secret with 'export-to-all-namespaces' flag being set - tanzu secret registry add test-secret --server projects-stg.registry.vmware.com --username test-user --password test-pass --export-to-all-namespaces`, - RunE: registrySecretAdd, - SilenceUsage: true, -} - -func init() { - registrySecretAddCmd.Flags().StringVarP(®istrySecretOp.Server, "server", "", "", "Private registry server FQDN") - registrySecretAddCmd.Flags().StringVarP(®istrySecretOp.Username, "username", "", "", "Username for authenticating to the private registry") - registrySecretAddCmd.Flags().StringVarP(®istrySecretOp.PasswordInput, "password", "", "", "Password for authenticating to the private registry") - registrySecretAddCmd.Flags().StringVarP(®istrySecretOp.PasswordFile, "password-file", "", "", "File containing the password for authenticating to the private registry") - registrySecretAddCmd.Flags().StringVarP(®istrySecretOp.PasswordEnvVar, "password-env-var", "", "", "Environment variable containing the password for authenticating to the private registry") - registrySecretAddCmd.Flags().BoolVarP(®istrySecretOp.PasswordStdin, "password-stdin", "", false, "When provided, password for authenticating to the private registry would be taken from the standard input") - registrySecretAddCmd.Flags().BoolVarP(®istrySecretOp.ExportToAllNamespaces, "export-to-all-namespaces", "", false, "Make the registry secret available across all namespaces (i.e. create SecretExport with toNamespace=*), optional") - registrySecretAddCmd.Flags().BoolVarP(®istrySecretOp.SkipPrompt, "yes", "y", false, "In case the --export-to-all-namespaces flag was set, export the secret to all namespaces without asking for confirmation, optional") - registrySecretCmd.AddCommand(registrySecretAddCmd) - registrySecretAddCmd.Args = cobra.ExactArgs(1) - registrySecretAddCmd.MarkFlagRequired("server") //nolint - registrySecretAddCmd.MarkFlagRequired("username") //nolint -} - -func registrySecretAdd(cmd *cobra.Command, args []string) error { - registrySecretOp.SecretName = args[0] - - if err := fetchAndValidateSecretCredentials(); err != nil { - return err - } - - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - - kc, err := kappclient.NewKappClient(kubeConfig) - if err != nil { - return err - } - - if registrySecretOp.ExportToAllNamespaces { - // Creating a SecretExport resource X that conflicts with a previously defined SecretExport Y that was exported to all namespaces could result in privilege escalation if the user does not access to other namespaces. This check prevents it by trying to list the namespaces - if err := checkNamespaceList(kc); err != nil { - return err - } - msg := "Warning: By choosing --export-to-all-namespaces, given secret contents will be available to ALL users in ALL namespaces. Please ensure that included registry credentials allow only read-only access to the registry with minimal necessary scope.\n\n" - err := issueWarningAndPromptUser(msg) - if err != nil { - return err - } - } else if err := checkSecretExportExists(pkgClient, kc); err != nil { - return err - } - - // as the secret might already exist, first check for its existence in order to have an idempotent "add" operation - notFound, err := checkSecretExists(kc) - if err != nil { - return err - } - - // If the secret doesn't exist, create it - if notFound { - if _, err := component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat, fmt.Sprintf("Adding registry secret '%s'...", registrySecretOp.SecretName), true); err != nil { - return err - } - - if err := pkgClient.AddRegistrySecret(registrySecretOp); err != nil { - return err - } - - log.Infof("\n Added registry secret '%s' into namespace '%s'", registrySecretOp.SecretName, registrySecretOp.Namespace) - if registrySecretOp.ExportToAllNamespaces { - log.Infof(" Exported registry secret '%s' to all namespaces", registrySecretOp.SecretName) - } - return nil - } - - // If the secret already exists, just update it - if err := updateSecret(cmd, pkgClient); err != nil { - return err - } - return nil -} - -func updateSecret(cmd *cobra.Command, pkgClient packageclient.PackageClient) error { - if registrySecretOp.ExportToAllNamespaces { - t := true - registrySecretOp.Export = packagedatamodel.TypeBoolPtr{ExportToAllNamespaces: &t} - } - - if _, err := component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat, fmt.Sprintf("Updating registry secret '%s'...", registrySecretOp.SecretName), true); err != nil { - return err - } - - if err := pkgClient.UpdateRegistrySecret(registrySecretOp); err != nil { - return err - } - - log.Infof("\n Updated registry secret '%s' in namespace '%s'", registrySecretOp.SecretName, registrySecretOp.Namespace) - if registrySecretOp.ExportToAllNamespaces { - log.Infof(" Exported registry secret '%s' to all namespaces", registrySecretOp.SecretName) - } - - return nil -} - -func fetchAndValidateSecretCredentials() error { - if registrySecretOp.Server == "" { - return fmt.Errorf(errEmptyValue, "--server") - } - - if registrySecretOp.Username == "" { - return fmt.Errorf(errEmptyValue, "--username") - } - - password, err := extractPassword() - if err != nil { - return err - } - if password == "" { - return errors.New(errInvalidPasswordFlags) - } - registrySecretOp.Password = password - - return nil -} - -// extractPassword extracts the password from one of the corresponding flags -func extractPassword() (string, error) { - var ( - isPasswordSet bool - password string - ) - - if registrySecretOp.PasswordInput != "" { - password = registrySecretOp.PasswordInput - isPasswordSet = true - } - if registrySecretOp.PasswordStdin { - if isPasswordSet { - return "", errors.New(errInvalidPasswordFlags) - } - isPasswordSet = true - log.Info("Password:") - b, err := term.ReadPassword(0) - if err != nil { - return "", errors.Wrap(err, "failed to read the password from standard input") - } - password = string(b) - } - if registrySecretOp.PasswordFile != "" { - if isPasswordSet { - return "", errors.New(errInvalidPasswordFlags) - } - isPasswordSet = true - b, err := os.ReadFile(registrySecretOp.PasswordFile) - if err != nil { - return "", errors.Wrap(err, fmt.Sprintf("failed to read from the password file '%s'", registrySecretOp.PasswordFile)) - } - password = string(b) - } - if registrySecretOp.PasswordEnvVar != "" { - if isPasswordSet { - return "", errors.New(errInvalidPasswordFlags) - } - password = os.Getenv(registrySecretOp.PasswordEnvVar) - } - - return password, nil -} - -func checkNamespaceList(kc kappclient.Client) error { - ns := &corev1.NamespaceList{} - - err := kc.GetClient().List(context.Background(), ns) - if err != nil { - return err - } - return nil -} - -func checkSecretExportExists(pkgClient packageclient.PackageClient, kc kappclient.Client) error { - export := "" - secretExport, err := pkgClient.GetSecretExport(registrySecretOp) - - if err != nil { - if apierrors.IsNotFound(err) { - return nil - } - return err - } - - // No error means we found a matching SecretExport - - // Creating a SecretExport resource X that conflicts with a previously defined SecretExport Y that was exported to all namespaces could result in privilege escalation if the user does not access to other namespaces. This check prevents it by trying to list the namespaces - if err := checkNamespaceList(kc); err != nil { - return err - } - - if findInList(secretExport.Spec.ToNamespaces, "*") || secretExport.Spec.ToNamespace == "*" { - export = "all namespaces" - } else { - export = "some namespaces" - } - - // Ask user consent when SecretExport has been created by kubectl and user tries to add secret of the same name as SecretExport without using --export-to-all-namespaces flag - msg := "Warning: SecretExport with the same name exists already, given secret contents will be available to %s. If you decide not to proceed, you can either delete the SecretExport or specify a different secret name.\n\n" - msg = fmt.Sprintf(msg, export) - err = issueWarningAndPromptUser(msg) - if err != nil { - return err - } - - return nil -} - -func checkSecretExists(kc kappclient.Client) (bool, error) { - var notFound bool - err := kc.GetClient().Get(context.Background(), crtclient.ObjectKey{Name: registrySecretOp.SecretName, Namespace: registrySecretOp.Namespace}, &corev1.Secret{}) - if err != nil { - notFound = apierrors.IsNotFound(err) - if !notFound { - return notFound, err - } - } - return notFound, nil -} - -func issueWarningAndPromptUser(msg string) error { - log.Warning(msg) - if !registrySecretOp.SkipPrompt { - if err := component.AskForConfirmation("Are you sure you want to proceed?"); err != nil { - return errors.New("creation of the secret got aborted") - } - } - log.Info("\n") - return nil -} diff --git a/cmd/cli/plugin/secret/registry_secret_delete.go b/cmd/cli/plugin/secret/registry_secret_delete.go deleted file mode 100644 index 90f325464e..0000000000 --- a/cmd/cli/plugin/secret/registry_secret_delete.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - "github.com/aunum/log" - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" -) - -var registrySecretDeleteCmd = &cobra.Command{ - Use: "delete SECRET_NAME", - Short: "Deletes a v1/Secret resource", - Long: "Deletes a v1/Secret resource of type kubernetes.io/dockerconfigjson and the associated SecretExport from the cluster", - Example: ` - # Delete a registry secret - tanzu registry secret delete test-secret`, - RunE: registrySecretDelete, - SilenceUsage: true, -} - -func init() { - registrySecretDeleteCmd.Flags().BoolVarP(®istrySecretOp.SkipPrompt, "yes", "y", false, "Delete the registry secret without asking for confirmation, optional") - registrySecretCmd.AddCommand(registrySecretDeleteCmd) - registrySecretDeleteCmd.Args = cobra.ExactArgs(1) -} - -func registrySecretDelete(cmd *cobra.Command, args []string) error { - registrySecretOp.SecretName = args[0] - - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - - if !registrySecretOp.SkipPrompt { - if err := component.AskForConfirmation(fmt.Sprintf("Deleting registry secret '%s' from namespace '%s'. Are you sure?", - registrySecretOp.SecretName, registrySecretOp.Namespace)); err != nil { - return errors.New("deletion of the secret got aborted") - } - } - - if _, err = component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat, - fmt.Sprintf("Deleting registry secret '%s'...", registrySecretOp.SecretName), true); err != nil { - return err - } - - found, err := pkgClient.DeleteRegistrySecret(registrySecretOp) - if !found { - log.Warningf("\n registry secret '%s' does not exist in namespace '%s'", registrySecretOp.SecretName, registrySecretOp.Namespace) - return nil - } - if err != nil { - return err - } - - log.Infof("\n Deleted registry secret '%s' from namespace '%s'", registrySecretOp.SecretName, registrySecretOp.Namespace) - return nil -} diff --git a/cmd/cli/plugin/secret/registry_secret_list.go b/cmd/cli/plugin/secret/registry_secret_list.go deleted file mode 100644 index 83a524e6c1..0000000000 --- a/cmd/cli/plugin/secret/registry_secret_list.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "encoding/json" - "strconv" - "time" - - "github.com/spf13/cobra" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/duration" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" -) - -var registrySecretListCmd = &cobra.Command{ - Use: "list", - Short: "Lists all v1/Secrets", - Long: "Lists all v1/Secret of type kubernetes.io/dockerconfigjson and checks for the associated SecretExport with the same name", - Args: cobra.NoArgs, - Example: ` - # List registry secrets across all namespaces - tanzu registry secret list -A - - # List registry secrets from specified namespace - tanzu registry secret list -n test-ns - - # List registry secrets in json output format - tanzu registry secret list -n test-ns -o json`, - RunE: registrySecretList, - SilenceUsage: true, -} - -func init() { - registrySecretListCmd.Flags().BoolVarP(®istrySecretOp.AllNamespaces, "all-namespaces", "A", false, "If present, list registry secrets across all namespaces, optional") - registrySecretListCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table), optional") - registrySecretCmd.AddCommand(registrySecretListCmd) -} - -func registrySecretList(cmd *cobra.Command, _ []string) error { - var t component.OutputWriterSpinner - var exported string - var registry string - - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - - if registrySecretOp.AllNamespaces { - registrySecretOp.Namespace = "" - } - - if registrySecretOp.AllNamespaces { - t, err = component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat, - "Retrieving registry secrets...", true, "NAME", "REGISTRY", "EXPORTED", "AGE", "NAMESPACE") - } else { - t, err = component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat, "Retrieving registry secrets...", true, - "NAME", "REGISTRY", "EXPORTED", "AGE") - } - if err != nil { - return err - } - - registrySecretList, err := pkgClient.ListRegistrySecrets(registrySecretOp) - if err != nil { - t.StopSpinner() - return err - } - - secretExportList, err := pkgClient.ListSecretExports(registrySecretOp) - if err != nil { - return err - } - - for i := range registrySecretList.Items { - exported = "not exported" - registrySecret := registrySecretList.Items[i] - for j := range secretExportList.Items { - secretExport := secretExportList.Items[j] - if secretExport.Name == registrySecret.Name { - if findInList(secretExport.Spec.ToNamespaces, "*") || secretExport.Spec.ToNamespace == "*" { - exported = "to all namespaces" - } else { - exported = "to some namespaces" - } - } - } - - registry, err = getRegistryValue(®istrySecret) - if err != nil { - return err - } - - age := duration.HumanDuration(time.Since(registrySecret.CreationTimestamp.UTC())) - - if registrySecretOp.AllNamespaces { - t.AddRow( - registrySecret.Name, - registry, - exported, - age, - registrySecret.Namespace) - } else { - t.AddRow( - registrySecret.Name, - registry, - exported, - age) - } - } - t.RenderWithSpinner() - - return nil -} - -func findInList(slice []string, val string) bool { - for _, item := range slice { - if item == val { - return true - } - } - return false -} - -func getRegistryValue(secret *corev1.Secret) (string, error) { - registry := "" - - var dataMap packageclient.DockerConfigJSON - if err := json.Unmarshal(secret.Data[corev1.DockerConfigJsonKey], &dataMap); err != nil { - return registry, err - } - - /* If there is no auths field, then there is no associated registry. In that case, registry field will be displayed empty in cli */ - regCount := 0 - for reg := range dataMap.Auths { - if registry == "" { - registry = reg - } - regCount++ - } - if regCount > 1 { - registry = registry + ", +" + strconv.Itoa(regCount-1) - } - - return registry, nil -} diff --git a/cmd/cli/plugin/secret/registry_secret_update.go b/cmd/cli/plugin/secret/registry_secret_update.go deleted file mode 100644 index 90a760c403..0000000000 --- a/cmd/cli/plugin/secret/registry_secret_update.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "fmt" - - "github.com/aunum/log" - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" -) - -var registrySecretUpdateCmd = &cobra.Command{ - Use: "update SECRET_NAME --username USERNAME --password PASSWORD", - Short: "Updates the v1/Secret resource", - Long: "Updates the v1/Secret resource of type kubernetes.io/dockerconfigjson. In case of specifying the --export-to-all-namespaces flag, the SecretExport resource will also get updated. Otherwise, there will be no changes in the SecretExport resource.", - Example: ` - # Update a registry secret. There will be no changes in the associated SecretExport resource - tanzu registry secret update test-secret --username test-user --password-file test-file - - # Update a registry secret with 'export-to-all-namespaces' flag being set - tanzu registry secret update test-secret --username test-user --password test-pass --export-to-all-namespaces - - # Update a registry secret with 'export-to-all-namespaces' flag being clear. In this case, the associated SecretExport resource will get deleted - tanzu registry secret update test-secret --username test-user --password test-pass --export-to-all-namespaces=false`, - RunE: registrySecretUpdate, - SilenceUsage: true, -} - -func init() { - registrySecretUpdateCmd.Flags().StringVarP(®istrySecretOp.Username, "username", "", "", "Username for authenticating to the private registry") - registrySecretUpdateCmd.Flags().StringVarP(®istrySecretOp.PasswordInput, "password", "", "", "Password for authenticating to the private registry") - registrySecretUpdateCmd.Flags().StringVarP(®istrySecretOp.PasswordFile, "password-file", "", "", "File containing the password for authenticating to the private registry") - registrySecretUpdateCmd.Flags().StringVarP(®istrySecretOp.PasswordEnvVar, "password-env-var", "", "", "Environment variable containing the password for authenticating to the private registry") - registrySecretUpdateCmd.Flags().BoolVarP(®istrySecretOp.PasswordStdin, "password-stdin", "", false, "When provided, password for authenticating to the private registry would be taken from the standard input") - registrySecretUpdateCmd.Flags().BoolVarP(®istrySecretOp.SkipPrompt, "yes", "y", false, "In case the --export-to-all-namespaces flag was provided, export/un-export of the secret will be performed without asking for confirmation, optional") - registrySecretUpdateCmd.Flags().VarPF(®istrySecretOp.Export, "export-to-all-namespaces", "", "If set to true, the secret gets available across all namespaces. If set to false, the secret will get unexported from ALL namespaces in which it was previously exported to. In case of not specifying this flag, no changes will be made in the existing SecretExport resource. optional").NoOptDefVal = "true" - registrySecretCmd.AddCommand(registrySecretUpdateCmd) - registrySecretUpdateCmd.Args = cobra.ExactArgs(1) -} - -func registrySecretUpdate(cmd *cobra.Command, args []string) error { - registrySecretOp.SecretName = args[0] - - password, err := extractPassword() - if err != nil { - return err - } - registrySecretOp.Password = password - - if registrySecretOp.Username == "" && registrySecretOp.Password == "" && registrySecretOp.Export.ExportToAllNamespaces == nil { - return errors.New("no changes made in the registry secret, as neither of username, password or export-to-all-namespaces flag options were provided") - } - - if registrySecretOp.Export.ExportToAllNamespaces != nil { - if *registrySecretOp.Export.ExportToAllNamespaces { - log.Warning("Warning: By specifying --export-to-all-namespaces as true, given secret contents will be available to ALL users in ALL namespaces. Please ensure that included registry credentials allow only read-only access to the registry with minimal necessary scope.\n") - } else { - log.Warning("Warning: By specifying --export-to-all-namespaces as false, the secret contents will get unexported from ALL namespaces in which it was previously available to.\n") - } - if !registrySecretOp.SkipPrompt { - if err := component.AskForConfirmation("Are you sure you want to proceed?"); err != nil { - return errors.New("update of the secret got aborted") - } - } - log.Info("\n") - } - - pkgClient, err := packageclient.NewPackageClient(kubeConfig) - if err != nil { - return err - } - - if _, err := component.NewOutputWriterWithSpinner(cmd.OutOrStdout(), outputFormat, - fmt.Sprintf("Updating registry secret '%s'...", registrySecretOp.SecretName), true); err != nil { - return err - } - - if err := pkgClient.UpdateRegistrySecret(registrySecretOp); err != nil { - return err - } - - log.Infof("\n Updated registry secret '%s' in namespace '%s'", registrySecretOp.SecretName, registrySecretOp.Namespace) - if registrySecretOp.Export.ExportToAllNamespaces != nil { - if *registrySecretOp.Export.ExportToAllNamespaces { - log.Infof(" Exported registry secret '%s' to all namespaces", registrySecretOp.SecretName) - } else { - log.Infof(" Unexported registry secret '%s' from all namespaces", registrySecretOp.SecretName) - } - } - return nil -} diff --git a/cmd/cli/plugin/secret/test/lib/secret_plugin.go b/cmd/cli/plugin/secret/test/lib/secret_plugin.go deleted file mode 100644 index 8338c18c76..0000000000 --- a/cmd/cli/plugin/secret/test/lib/secret_plugin.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package lib - -import ( - "bytes" - "fmt" - "time" - - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -type SecretPluginBase interface { - AddRegistrySecret(o *packagedatamodel.RegistrySecretOptions) SecretPluginResult - UpdateRegistrySecret(o *packagedatamodel.RegistrySecretOptions) SecretPluginResult - DeleteRegistrySecret(o *packagedatamodel.RegistrySecretOptions) SecretPluginResult - ListRegistrySecret(o *packagedatamodel.RegistrySecretOptions) SecretPluginResult -} - -type SecretPlugin interface { - // Base commands are implemented by the below interface - SecretPluginBase -} - -type SecretPluginResult struct { - Pass bool - Stdout *bytes.Buffer - Stderr *bytes.Buffer - Error error -} - -type secretPlugin struct { - kubeConfigPath string - interval time.Duration - timeout time.Duration - outputFormat string - logFile string - verbose int32 -} - -func NewSecretPlugin(kubeConfigPath string, - interval time.Duration, - timeout time.Duration, - outputFormat string, - verbose int32) SecretPlugin { - return &secretPlugin{ - kubeConfigPath: kubeConfigPath, - interval: interval, - timeout: timeout, - outputFormat: outputFormat, - verbose: verbose, - } -} - -func (p *secretPlugin) addKubeConfig(cmd string) string { - if cmd != "" && p.kubeConfigPath != "" { - cmd += fmt.Sprintf(" --kubeconfig %s", p.kubeConfigPath) - } - return cmd -} - -func (p *secretPlugin) addOutputFormat(cmd string) string { - if cmd != "" && p.outputFormat != "" { - cmd += fmt.Sprintf(" --output %s", p.outputFormat) - } - return cmd -} - -func (p *secretPlugin) addGlobalOptions(cmd string) string { - cmd = p.addVerbose(cmd) - return cmd -} - -func (p *secretPlugin) addVerbose(cmd string) string { - if cmd != "" && p.verbose != 0 { - cmd += fmt.Sprintf(" --verbose %d", p.verbose) - } - return cmd -} - -func (p *secretPlugin) AddRegistrySecret(o *packagedatamodel.RegistrySecretOptions) SecretPluginResult { - var result SecretPluginResult - cmd := fmt.Sprintf("tanzu secret registry add %s --server %s --username %s", o.SecretName, o.Server, o.Username) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.PasswordInput != "" { - cmd += fmt.Sprintf(" --password %s", o.PasswordInput) - } - if o.PasswordFile != "" { - cmd += fmt.Sprintf(" --password-file %s", o.PasswordFile) - } - if o.PasswordEnvVar != "" { - cmd += fmt.Sprintf(" --password-env-var %s", o.PasswordEnvVar) - } - if o.ExportToAllNamespaces { - cmd += fmt.Sprintf(" --export-to-all-namespaces") - } - if o.SkipPrompt { - cmd += fmt.Sprintf(" -y") - } - - cmd = p.addKubeConfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *secretPlugin) DeleteRegistrySecret(o *packagedatamodel.RegistrySecretOptions) SecretPluginResult { - var result SecretPluginResult - cmd := fmt.Sprintf("tanzu secret registry delete %s", o.SecretName) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.SkipPrompt { - cmd += fmt.Sprintf(" -y") - } - - cmd = p.addKubeConfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *secretPlugin) ListRegistrySecret(o *packagedatamodel.RegistrySecretOptions) SecretPluginResult { - var result SecretPluginResult - cmd := fmt.Sprintf("tanzu secret registry list") - if o.AllNamespaces { - cmd += fmt.Sprintf(" --all-namespaces") - } - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - - cmd = p.addOutputFormat(cmd) - cmd = p.addKubeConfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} - -func (p *secretPlugin) UpdateRegistrySecret(o *packagedatamodel.RegistrySecretOptions) SecretPluginResult { - var result SecretPluginResult - cmd := fmt.Sprintf("tanzu secret registry update %s", o.SecretName) - if o.Namespace != "" { - cmd += fmt.Sprintf(" --namespace %s", o.Namespace) - } - if o.Username != "" { - cmd += fmt.Sprintf(" --username %s", o.Username) - } - if o.PasswordInput != "" { - cmd += fmt.Sprintf(" --password %s", o.PasswordInput) - } - if o.PasswordFile != "" { - cmd += fmt.Sprintf(" --password-file %s", o.PasswordFile) - } - if o.PasswordEnvVar != "" { - cmd += fmt.Sprintf(" --password-env-var %s", o.PasswordEnvVar) - } - if o.Export.ExportToAllNamespaces != nil { - if *o.Export.ExportToAllNamespaces == true { - cmd += fmt.Sprintf(" --export-to-all-namespaces=true") - } else { - cmd += fmt.Sprintf(" --export-to-all-namespaces=false") - } - } - if o.SkipPrompt { - cmd += fmt.Sprintf(" -y") - } - - cmd = p.addKubeConfig(cmd) - cmd = p.addGlobalOptions(cmd) - result.Stdout, result.Stderr, result.Error = clitest.Exec(cmd) - return result -} diff --git a/cmd/cli/plugin/secret/test/main.go b/cmd/cli/plugin/secret/test/main.go deleted file mode 100644 index efd473e2b5..0000000000 --- a/cmd/cli/plugin/secret/test/main.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("secret") - -func main() { - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err, "failed to create a new instance of the plugin") - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} diff --git a/cmd/cli/plugin/telemetry/README.md b/cmd/cli/plugin/telemetry/README.md deleted file mode 100644 index 835148cd92..0000000000 --- a/cmd/cli/plugin/telemetry/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# telemetry - -## Summary - -Plugin for configuring cluster-wide telemetry settings. These settings are applicable to any generic kubernetes cluster. -Settings are respected by any Tanzu product exercising the telemetry SDK. - -## Usage - -### status - -#### help output - -```shell -$ tanzu telemetry status --help -Status of tanzu telemetry settings - -Usage: - tanzu telemetry status [flags] - -Examples: - - # get status - tanzu telemetry status - -Flags: - -h, --help help for status -``` - -#### printing status of cluster - -```shell -$ tanzu telemetry status -- ceip: | - level: disabled - shared_identifiers: | - customer_csp_org_id: some-org - customer_entitlement_account_number: ABCD - env_is_prod: "true" -``` - -### update - -#### help output - -```shell -$ tanzu telemetry update --help -Update tanzu telemetry settings - -Usage: - tanzu telemetry update [flags] - -Examples: - - # opt into ceip - tanzu telemetry update --CEIP-opt-in - # opt out of ceip - tanzu telemetry update --CEIP-opt-out - # update shared configuration settings - tanzu telemetry update --env-is-prod "true" --entitlement-account-number "1234" --csp-org-id "XXXX" - - -Flags: - --CEIP-opt-in opt into VMware's CEIP program - --CEIP-opt-out opt out of VMware's CEIP program - --csp-org-id string Accepts a string and sets a cluster-wide CSP - org ID. Empty string is equivalent to - unsetting this value. - --entitlement-account-number string Accepts a string and sets a cluster-wide - entitlement account number. Empty string is - equivalent to unsetting this value - --env-is-prod string Accepts a boolean and sets a cluster-wide - value denoting whether the target is a - production cluster or not. - -h, --help help for update -``` - -#### opt in/out of telemetry - -```shell -$ tanzu telemetry update --CEIP-opt-in -*no output* - -$ tanzu telemetry update --CEIP-opt-out -*no output* - -``` - -#### update shared identifiers - -```shell -$ tanzu telemetry update --csp-org-id "test-org" --entitlement-account-number "XXXX" --env-is-prod false -found existing identifiers config map -Updating config map .... -``` diff --git a/cmd/cli/plugin/telemetry/cmd/constant.go b/cmd/cli/plugin/telemetry/cmd/constant.go deleted file mode 100644 index a448120a40..0000000000 --- a/cmd/cli/plugin/telemetry/cmd/constant.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package cmd contains the cobra command code for each subcommand of the telemetry plugin -package cmd - -// Update Command Flags -const ( - UpdateCeipOptInFlag = "CEIP-opt-in" - UpdateCeipOptOutFlag = "CEIP-opt-out" - UpdateEanFlag = "entitlement-account-number" - UpdateCspOrgFlag = "csp-org-id" - UpdateEnvIsProdFlag = "env-is-prod" -) diff --git a/cmd/cli/plugin/telemetry/cmd/fakes/fake_output_writer.go b/cmd/cli/plugin/telemetry/cmd/fakes/fake_output_writer.go deleted file mode 100644 index 5cbeede646..0000000000 --- a/cmd/cli/plugin/telemetry/cmd/fakes/fake_output_writer.go +++ /dev/null @@ -1,145 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" -) - -type FakeOutputWriter struct { - AddRowStub func(...interface{}) - addRowMutex sync.RWMutex - addRowArgsForCall []struct { - arg1 []interface{} - } - RenderStub func() - renderMutex sync.RWMutex - renderArgsForCall []struct { - } - SetKeysStub func(...string) - setKeysMutex sync.RWMutex - setKeysArgsForCall []struct { - arg1 []string - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *FakeOutputWriter) AddRow(arg1 ...interface{}) { - fake.addRowMutex.Lock() - fake.addRowArgsForCall = append(fake.addRowArgsForCall, struct { - arg1 []interface{} - }{arg1}) - stub := fake.AddRowStub - fake.recordInvocation("AddRow", []interface{}{arg1}) - fake.addRowMutex.Unlock() - if stub != nil { - fake.AddRowStub(arg1...) - } -} - -func (fake *FakeOutputWriter) AddRowCallCount() int { - fake.addRowMutex.RLock() - defer fake.addRowMutex.RUnlock() - return len(fake.addRowArgsForCall) -} - -func (fake *FakeOutputWriter) AddRowCalls(stub func(...interface{})) { - fake.addRowMutex.Lock() - defer fake.addRowMutex.Unlock() - fake.AddRowStub = stub -} - -func (fake *FakeOutputWriter) AddRowArgsForCall(i int) []interface{} { - fake.addRowMutex.RLock() - defer fake.addRowMutex.RUnlock() - argsForCall := fake.addRowArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *FakeOutputWriter) Render() { - fake.renderMutex.Lock() - fake.renderArgsForCall = append(fake.renderArgsForCall, struct { - }{}) - stub := fake.RenderStub - fake.recordInvocation("Render", []interface{}{}) - fake.renderMutex.Unlock() - if stub != nil { - fake.RenderStub() - } -} - -func (fake *FakeOutputWriter) RenderCallCount() int { - fake.renderMutex.RLock() - defer fake.renderMutex.RUnlock() - return len(fake.renderArgsForCall) -} - -func (fake *FakeOutputWriter) RenderCalls(stub func()) { - fake.renderMutex.Lock() - defer fake.renderMutex.Unlock() - fake.RenderStub = stub -} - -func (fake *FakeOutputWriter) SetKeys(arg1 ...string) { - fake.setKeysMutex.Lock() - fake.setKeysArgsForCall = append(fake.setKeysArgsForCall, struct { - arg1 []string - }{arg1}) - stub := fake.SetKeysStub - fake.recordInvocation("SetKeys", []interface{}{arg1}) - fake.setKeysMutex.Unlock() - if stub != nil { - fake.SetKeysStub(arg1...) - } -} - -func (fake *FakeOutputWriter) SetKeysCallCount() int { - fake.setKeysMutex.RLock() - defer fake.setKeysMutex.RUnlock() - return len(fake.setKeysArgsForCall) -} - -func (fake *FakeOutputWriter) SetKeysCalls(stub func(...string)) { - fake.setKeysMutex.Lock() - defer fake.setKeysMutex.Unlock() - fake.SetKeysStub = stub -} - -func (fake *FakeOutputWriter) SetKeysArgsForCall(i int) []string { - fake.setKeysMutex.RLock() - defer fake.setKeysMutex.RUnlock() - argsForCall := fake.setKeysArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *FakeOutputWriter) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.addRowMutex.RLock() - defer fake.addRowMutex.RUnlock() - fake.renderMutex.RLock() - defer fake.renderMutex.RUnlock() - fake.setKeysMutex.RLock() - defer fake.setKeysMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *FakeOutputWriter) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ component.OutputWriter = new(FakeOutputWriter) diff --git a/cmd/cli/plugin/telemetry/cmd/status.go b/cmd/cli/plugin/telemetry/cmd/status.go deleted file mode 100644 index 2aa8cf2a36..0000000000 --- a/cmd/cli/plugin/telemetry/cmd/status.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/telemetry/status" - - "github.com/spf13/cobra" - "k8s.io/client-go/dynamic" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" -) - -type StatusCmd struct { - Cmd *cobra.Command - ClientGetter func() (dynamic.Interface, error) - out component.OutputWriter -} - -// NewStatusCmd creates a status cmd and injects a function for retrieving a k8s client -// Allows us to unit test by injecting a fake client -func NewStatusCmd(clientGetter func() (dynamic.Interface, error), out component.OutputWriter) *StatusCmd { - out.SetKeys("CEIP", "SHARED IDENTIFIERS") - - sc := StatusCmd{ - ClientGetter: clientGetter, - out: out, - } - sc.Cmd = &cobra.Command{ - Use: "status", - Short: "Status of tanzu telemetry settings", - Example: ` - # get status - tanzu telemetry status`, - RunE: sc.Status, - } - - return &sc -} - -// Status prints the status of telemetry settings on the cluster -func (sc *StatusCmd) Status(_ *cobra.Command, _ []string) error { - client, err := sc.ClientGetter() - if err != nil { - return err - } - - printer := status.Printer{ - Client: client, - Out: sc.out, - } - err = printer.PrintStatus() - if err != nil { - return err - } - - return nil -} diff --git a/cmd/cli/plugin/telemetry/cmd/update.go b/cmd/cli/plugin/telemetry/cmd/update.go deleted file mode 100644 index 705e6ac8c5..0000000000 --- a/cmd/cli/plugin/telemetry/cmd/update.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "context" - "errors" - "strings" - - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/telemetry/update" - - "github.com/spf13/pflag" - - "github.com/spf13/cobra" - "k8s.io/client-go/dynamic" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" -) - -var ( - ean, cspOrgID, envIsProd string - ceipOptIn, ceipOptOut bool -) - -var identifierFlagMapping = map[string]string{ - UpdateEanFlag: "customer_entitlement_account_number", - UpdateCspOrgFlag: "customer_csp_org_id", - UpdateEnvIsProdFlag: "env_is_prod", -} - -type UpdateCmd struct { - Cmd *cobra.Command - ClientGetter func() (dynamic.Interface, error) - out component.OutputWriter -} - -// NewUpdateCmd creates an update cmd and injects a function for retrieving a k8s client -// Allows us to unit test by injecting a fake client -func NewUpdateCmd(clientGetter func() (dynamic.Interface, error), out component.OutputWriter) *UpdateCmd { - out.SetKeys("CEIP", "SHARED IDENTIFIERS") - - uc := UpdateCmd{ - ClientGetter: clientGetter, - out: out, - } - uc.Cmd = &cobra.Command{ - Use: "update", - Short: "Update tanzu telemetry settings", - Example: ` - # opt into CEIP - tanzu telemetry update --CEIP-opt-in - # opt out of CEIP - tanzu telemetry update --CEIP-opt-out - # update shared configuration settings - tanzu telemetry update --env-is-prod "true" --entitlement-account-number "1234" --csp-org-id "XXXX" -`, - RunE: uc.Update, - } - - uc.Cmd.Flags().BoolVar(&ceipOptIn, UpdateCeipOptInFlag, false, "opt into VMware's CEIP program") - uc.Cmd.Flags().BoolVar(&ceipOptOut, UpdateCeipOptOutFlag, false, "opt out of VMware's CEIP program") - uc.Cmd.Flags().StringVar(&ean, UpdateEanFlag, "", `Accepts a string and sets a cluster-wide - entitlement account number. Empty string is - equivalent to unsetting this value`) - uc.Cmd.Flags().StringVar(&cspOrgID, UpdateCspOrgFlag, "", `Accepts a string and sets a cluster-wide CSP - org ID. Empty string is equivalent to - unsetting this value.`) - uc.Cmd.Flags().StringVar(&envIsProd, UpdateEnvIsProdFlag, "", `Accepts a boolean and sets a cluster-wide - value denoting whether the target is a - production cluster or not.`) - - return &uc -} - -// Update configures telemetry settings on the targeted cluster -func (uc *UpdateCmd) Update(_ *cobra.Command, _ []string) error { - ctx := context.Background() - - anyFlagSet := false - uc.Cmd.Flags().Visit(func(f *pflag.Flag) { - anyFlagSet = true - }) - if !anyFlagSet { - return errors.New("must set at least one flag") - } - - if uc.Cmd.Flags().Changed(UpdateCeipOptInFlag) && uc.Cmd.Flags().Changed(UpdateCeipOptOutFlag) { - return errors.New("cannot set both CEIP-opt-in and CEIP-opt-out flags") - } - - dynamicClient, err := uc.ClientGetter() - if err != nil { - return err - } - - updater := update.Updater{Client: dynamicClient} - - if uc.Cmd.Flags().Changed(UpdateCeipOptInFlag) || uc.Cmd.Flags().Changed(UpdateCeipOptOutFlag) { - var optInVal bool - if ceipOptIn { - optInVal = true - } else if ceipOptOut { - optInVal = false - } - err := updater.UpdateCeip(ctx, optInVal) - if err != nil { - return err - } - } - - if uc.Cmd.Flags().Changed(UpdateEanFlag) || uc.Cmd.Flags().Changed(UpdateCspOrgFlag) || uc.Cmd.Flags().Changed(UpdateEnvIsProdFlag) { - valsToUpdate, err := uc.buildValsToUpdate() - if err != nil { - return err - } - err = updater.UpdateIdentifiers(ctx, valsToUpdate) - if err != nil { - return err - } - } - - return nil -} - -func (uc *UpdateCmd) buildValsToUpdate() ([]update.UpdateVal, error) { - var valsToUpdate []update.UpdateVal - - for idFlag, keyName := range identifierFlagMapping { - val, err := uc.Cmd.Flags().GetString(idFlag) - if err != nil { - return nil, err - } - if idFlag == UpdateEnvIsProdFlag { - val = strings.ToLower(val) - } - uVal := update.UpdateVal{ - Changed: uc.Cmd.Flags().Changed(idFlag), - Key: keyName, - Value: val, - } - - valsToUpdate = append(valsToUpdate, uVal) - } - - return valsToUpdate, nil -} diff --git a/cmd/cli/plugin/telemetry/kubernetes/client.go b/cmd/cli/plugin/telemetry/kubernetes/client.go deleted file mode 100644 index 594e9cee1a..0000000000 --- a/cmd/cli/plugin/telemetry/kubernetes/client.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package kubernetes - -import ( - "errors" - "os" - - "k8s.io/client-go/dynamic" - "k8s.io/client-go/tools/clientcmd" -) - -// GetDynamicClient gets a dynamic client for the targeted cluster -// We expect a KUBECONFIG env var to be set for cluster targeting -func GetDynamicClient() (dynamic.Interface, error) { - path := os.Getenv("KUBECONFIG") - if path == "" { - return nil, errors.New("KUBECONFIG must be set for the telemetry command") - } - - clientConfig, err := clientcmd.BuildConfigFromFlags("", path) - if err != nil { - return nil, err - } - - dynamicClient, err := dynamic.NewForConfig(clientConfig) - if err != nil { - return nil, err - } - - return dynamicClient, nil -} diff --git a/cmd/cli/plugin/telemetry/kubernetes/constant.go b/cmd/cli/plugin/telemetry/kubernetes/constant.go deleted file mode 100644 index 2ad4447ca5..0000000000 --- a/cmd/cli/plugin/telemetry/kubernetes/constant.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package kubernetes contains utilities for interacting with kubernetes clusters and unit testing code that -// deals with clusters -package kubernetes - -const ( - NamespacesURI = "/api/v1/namespaces" - ConfigMapsURI = "/api/v1/namespaces/vmware-system-telemetry/configmaps" - - TelemetryNamespace = "vmware-system-telemetry" - TelemetryNamespaceURI = "/api/v1/namespaces/vmware-system-telemetry" - - CeipConfigMapName = "vmware-telemetry-cluster-ceip" - CeipConfigMapURI = "/api/v1/namespaces/vmware-system-telemetry/configmaps/vmware-telemetry-cluster-ceip" - - SharedIdsConfigMapName = "vmware-telemetry-identifiers" - SharedIdsConfigMapURI = "/api/v1/namespaces/vmware-system-telemetry/configmaps/vmware-telemetry-identifiers" -) diff --git a/cmd/cli/plugin/telemetry/kubernetes/util.go b/cmd/cli/plugin/telemetry/kubernetes/util.go deleted file mode 100644 index 38900746d0..0000000000 --- a/cmd/cli/plugin/telemetry/kubernetes/util.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package kubernetes - -import ( - "net/http" - "net/http/httptest" - - "k8s.io/client-go/dynamic" - "k8s.io/client-go/rest" -) - -// GetKubernetesClientServer creates an httptest.Server that allows k8s based code to be tested locally. -func GetKubernetesClientServer(h func(http.ResponseWriter, *http.Request)) (func() (dynamic.Interface, error), *httptest.Server, error) { - cfgget, srv, err := GetConfigAndServer(h) - if err != nil { - return nil, nil, err - } - - cfg, err := cfgget() - if err != nil { - srv.Close() - return nil, nil, err - } - - cl, err := dynamic.NewForConfig(cfg) - if err != nil { - srv.Close() - return nil, nil, err - } - - return func() (dynamic.Interface, error) { return cl, nil }, srv, nil -} - -// GetConfigAndServer creates an httptest.Server that allows k8s based code to be tested locally -// Returns a function to acquire a rest.Config, leaving k8s client creation up to the caller -func GetConfigAndServer(h func(http.ResponseWriter, *http.Request)) (func() (*rest.Config, error), *httptest.Server, error) { - srv := httptest.NewServer(http.HandlerFunc(h)) - c := &rest.Config{ - Host: srv.URL, - } - - return func() (*rest.Config, error) { return c, nil }, srv, nil -} diff --git a/cmd/cli/plugin/telemetry/main.go b/cmd/cli/plugin/telemetry/main.go deleted file mode 100644 index cdf098db0f..0000000000 --- a/cmd/cli/plugin/telemetry/main.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/telemetry/cmd" - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/telemetry/kubernetes" - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/buildinfo" - - "github.com/aunum/log" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "telemetry", - Description: "configure cluster-wide settings for vmware tanzu telemetry", - Group: cliapi.RunCmdGroup, - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - - out := component.NewOutputWriter(os.Stdout, string(component.YAMLOutputType)) - - sc := cmd.NewStatusCmd(kubernetes.GetDynamicClient, out) - uc := cmd.NewUpdateCmd(kubernetes.GetDynamicClient, out) - - p.AddCommands( - sc.Cmd, - uc.Cmd, - ) - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/cmd/cli/plugin/telemetry/status/printer.go b/cmd/cli/plugin/telemetry/status/printer.go deleted file mode 100644 index d7568e1456..0000000000 --- a/cmd/cli/plugin/telemetry/status/printer.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package status contains logic for the status subcommand -package status - -import ( - "context" - "fmt" - - "gopkg.in/yaml.v2" - v1core "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - runtimeschema "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/dynamic" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/telemetry/kubernetes" -) - -type Printer struct { - Client dynamic.Interface - Out component.OutputWriter -} - -func (s Printer) PrintStatus() error { - ceipMsg, err := s.getStatus(kubernetes.TelemetryNamespace, kubernetes.CeipConfigMapName) - if err != nil { - return err - } - idsMsg, err := s.getStatus(kubernetes.TelemetryNamespace, kubernetes.SharedIdsConfigMapName) - if err != nil { - return err - } - s.Out.AddRow(ceipMsg, idsMsg) - s.Out.Render() - - return nil -} - -func (s Printer) getStatus(namespace, configMapName string) (string, error) { - ctx := context.Background() - - configMapUnstructured, err := s.Client. - Resource(runtimeschema.GroupVersionResource{Version: "v1", Resource: "configmaps"}). - Namespace(namespace). - Get(ctx, configMapName, metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - return fmt.Sprintf("%s/%s configmap resource not found", namespace, configMapName), nil - } else if err != nil { - return "", err - } else { - var configMap v1core.ConfigMap - err = runtime.DefaultUnstructuredConverter.FromUnstructured(configMapUnstructured.UnstructuredContent(), &configMap) - if err != nil { - return "", err - } - - yamlData, err := yaml.Marshal(configMap.Data) - if err != nil { - return "", err - } - - return string(yamlData), nil - } -} diff --git a/cmd/cli/plugin/telemetry/status/printer_test.go b/cmd/cli/plugin/telemetry/status/printer_test.go deleted file mode 100644 index 44912ab8ca..0000000000 --- a/cmd/cli/plugin/telemetry/status/printer_test.go +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package status_test - -import ( - "net/http" - "strings" - "testing" - - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/telemetry/cmd/fakes" - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/telemetry/kubernetes" - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/telemetry/status" - - "github.com/stretchr/testify/assert" - "k8s.io/apimachinery/pkg/runtime" -) - -func TestStatus(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - - configMap := strings.Split(r.URL.Path, "/api/v1/namespaces/vmware-system-telemetry/configmaps/")[1] - switch configMap { - case kubernetes.SharedIdsConfigMapName: - _, err := w.Write([]byte(`{ - "kind": "ConfigMap", - "apiVersion": "v1", - "metadata": { - "name": "vmware-telemetry-identifiers", - "namespace": "vmware-system-telemetry", - "uid": "11gg33aa-ffff-zzzz-1234-123412341234", - "resourceVersion": "99988866" - }, - "data": { - "customer_csp_org_id": "XXXX", - "customer_entitlement_account_number": "XXXX", - "env_is_prod": "true" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.CeipConfigMapName: - _, err := w.Write([]byte(`{ - "kind": "ConfigMap", - "apiVersion": "v1", - "metadata": { - "name": "vmware-telemetry-cluster-ceip", - "namespace": "vmware-system-telemetry", - "uid": "11gg33aa-ffff-zzzz-1234-123412341234", - "resourceVersion": "99988866" - }, - "data": { - "level": "standard" - } - }`)) - if err != nil { - t.Fail() - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - out := &fakes.FakeOutputWriter{} - client, _ := clf() - - subject := &status.Printer{Client: client, Out: out} - err = subject.PrintStatus() - - assert.NoError(t, err) - assert.Equal(t, 1, out.AddRowCallCount()) - assert.Equal(t, 1, out.RenderCallCount()) - - ceipMap, ok := out.AddRowArgsForCall(0)[0].(string) - assert.True(t, ok) - idsMap, ok := out.AddRowArgsForCall(0)[1].(string) - assert.True(t, ok) - - assert.Contains(t, ceipMap, "level: standard") - - assert.Contains(t, idsMap, `customer_csp_org_id: XXXX`) - assert.Contains(t, idsMap, `customer_entitlement_account_number: XXXX`) - assert.Contains(t, idsMap, `env_is_prod: "true"`) -} - -func TestStatus_IgnoreNotFoundErrors(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - - configMap := strings.Split(r.URL.Path, "/api/v1/namespaces/vmware-system-telemetry/configmaps/")[1] - switch configMap { - case kubernetes.CeipConfigMapName: - w.WriteHeader(http.StatusNotFound) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "ceip configmap not found", - "reason": "NotFound", - "details": { - "name": "vmware-telemetry-cluster-ceip", - "group": "", - "kind": "configmap" - }, - "code": 404}`)) - if err != nil { - t.Fail() - } - case kubernetes.SharedIdsConfigMapName: - w.WriteHeader(http.StatusNotFound) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "ids configmap not found", - "reason": "NotFound", - "details": { - "name": "vmware-telemetry-identifiers", - "group": "", - "kind": "configmap" - }, - "code": 404}`)) - if err != nil { - t.Fail() - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - out := &fakes.FakeOutputWriter{} - client, _ := clf() - - subject := &status.Printer{Client: client, Out: out} - err = subject.PrintStatus() - - assert.NoError(t, err) - assert.Equal(t, 1, out.AddRowCallCount()) - assert.Equal(t, 1, out.RenderCallCount()) - - ceipErrMsg, ok := out.AddRowArgsForCall(0)[0].(string) - assert.True(t, ok) - idsErrMsg, ok := out.AddRowArgsForCall(0)[1].(string) - assert.True(t, ok) - - assert.Contains(t, ceipErrMsg, "vmware-system-telemetry/vmware-telemetry-cluster-ceip configmap resource not found") - assert.Contains(t, idsErrMsg, "vmware-system-telemetry/vmware-telemetry-identifiers configmap resource not found") -} - -func TestStatus_CeipConfigMapError(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - - configMap := strings.Split(r.URL.Path, "/api/v1/namespaces/vmware-system-telemetry/configmaps/")[1] - switch configMap { - case kubernetes.CeipConfigMapName: - w.WriteHeader(http.StatusForbidden) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "ceip configmap forbidden", - "reason": "Forbidden", - "details": { - "name": "vmware-telemetry-cluster-ceip", - "group": "", - "kind": "configmap" - }, - "code": 403}`)) - if err != nil { - t.Fail() - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - out := &fakes.FakeOutputWriter{} - client, _ := clf() - - subject := &status.Printer{Client: client, Out: out} - err = subject.PrintStatus() - if err == nil { - t.Logf("err is not nil") - t.FailNow() - } - assert.Contains(t, err.Error(), "forbidden") - assert.Equal(t, 0, out.AddRowCallCount()) - assert.Equal(t, 0, out.RenderCallCount()) -} - -func TestStatus_IdsConfigMapError(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - - configMap := strings.Split(r.URL.Path, "/api/v1/namespaces/vmware-system-telemetry/configmaps/")[1] - switch configMap { - case kubernetes.CeipConfigMapName: - w.WriteHeader(http.StatusNotFound) - _, err := w.Write([]byte(`{ "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "ceip configmap not found", - "reason": "NotFound", - "details": { - "name": "vmware-telemetry-cluster-ceip", - "group": "", - "kind": "configmap" - }, - "code": 404}`)) - if err != nil { - t.Fail() - } - - case kubernetes.SharedIdsConfigMapName: - w.WriteHeader(http.StatusForbidden) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "ids configmap forbidden", - "reason": "Forbidden", - "details": { - "name": "vmware-telemetry-identifiers", - "group": "", - "kind": "configmap" - }, - "code": 403}`)) - if err != nil { - t.Fail() - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - out := &fakes.FakeOutputWriter{} - client, _ := clf() - - subject := &status.Printer{Client: client, Out: out} - err = subject.PrintStatus() - - assert.Error(t, err) - if err == nil { - t.Logf("err is not nil") - t.FailNow() - } - assert.Contains(t, err.Error(), "forbidden") - assert.Equal(t, 0, out.AddRowCallCount()) - assert.Equal(t, 0, out.RenderCallCount()) -} diff --git a/cmd/cli/plugin/telemetry/test/main.go b/cmd/cli/plugin/telemetry/test/main.go deleted file mode 100644 index f094f7a6a0..0000000000 --- a/cmd/cli/plugin/telemetry/test/main.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var pluginName = "telemetry" - -var descriptor = clitest.NewTestFor(pluginName) - -func main() { - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - if err := Cleanup(); err != nil { - return err - } - return nil -} - -// Cleanup the test. -func Cleanup() error { - return nil -} diff --git a/cmd/cli/plugin/telemetry/update/updater.go b/cmd/cli/plugin/telemetry/update/updater.go deleted file mode 100644 index 2da6f26242..0000000000 --- a/cmd/cli/plugin/telemetry/update/updater.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package update contains logic for the update subcommand -package update - -import ( - "context" - "fmt" - - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/telemetry/kubernetes" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - runtimeschema "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/dynamic" -) - -type Updater struct { - Client dynamic.Interface -} - -type UpdateVal struct { - Changed bool - Value string - Key string -} - -func (u *Updater) UpdateCeip(ctx context.Context, userOptIn bool) error { - err := u.findOrCreateNamespace(ctx) - if err != nil { - return err - } - - var ceipVal string - if userOptIn { - ceipVal = "standard" - } else { - ceipVal = "disabled" - } - - ceipConfigMap := &unstructured.Unstructured{ - Object: map[string]interface{}{ - "metadata": map[string]interface{}{ - "name": kubernetes.CeipConfigMapName, - }, - "data": map[string]interface{}{ - "level": ceipVal, - }, - }, - } - - _, err = u.Client. - Resource(runtimeschema.GroupVersionResource{Version: "v1", Resource: "configmaps"}). - Namespace(kubernetes.TelemetryNamespace). - Get(ctx, kubernetes.CeipConfigMapName, metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - _, err = u.Client. - Resource(runtimeschema.GroupVersionResource{Version: "v1", Resource: "configmaps"}). - Namespace(kubernetes.TelemetryNamespace). - Create(ctx, ceipConfigMap, metav1.CreateOptions{}) - if err != nil { - return err - } - } else if err != nil { - return err - } else { - _, err = u.Client. - Resource(runtimeschema.GroupVersionResource{Version: "v1", Resource: "configmaps"}). - Namespace(kubernetes.TelemetryNamespace). - Update(ctx, ceipConfigMap, metav1.UpdateOptions{}) - if err != nil { - return err - } - } - return nil -} - -func (u *Updater) UpdateIdentifiers(ctx context.Context, identifierVals []UpdateVal) error { - err := u.findOrCreateNamespace(ctx) - if err != nil { - return err - } - - sharedIdsData := make(map[string]interface{}) - - existingConfigMap, err := u.Client. - Resource(runtimeschema.GroupVersionResource{Version: "v1", Resource: "configmaps"}). - Namespace(kubernetes.TelemetryNamespace). - Get(ctx, kubernetes.SharedIdsConfigMapName, metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - fmt.Println("did not find existing identifiers config map") - sharedIdsConfigMap := &unstructured.Unstructured{ - Object: map[string]interface{}{ - "metadata": map[string]interface{}{ - "name": kubernetes.SharedIdsConfigMapName, - }, - "data": map[string]interface{}{}, - }, - } - - _, err = u.Client. - Resource(runtimeschema.GroupVersionResource{Version: "v1", Resource: "configmaps"}). - Namespace(kubernetes.TelemetryNamespace). - Create(ctx, sharedIdsConfigMap, metav1.CreateOptions{}) - if err != nil { - return err - } - } else if err != nil { - return err - } else { - fmt.Println("found existing identifiers config map") - if existingConfigMap.Object["data"] != nil { - sharedIdsData = existingConfigMap.Object["data"].(map[string]interface{}) - } - } - - for _, val := range identifierVals { - if val.Changed { - sharedIdsData[val.Key] = val.Value - } - } - - newIdsMap := &unstructured.Unstructured{ - Object: map[string]interface{}{ - "metadata": map[string]interface{}{ - "name": kubernetes.SharedIdsConfigMapName, - }, - "data": sharedIdsData, - }, - } - - fmt.Println("Updating config map ....") - _, err = u.Client. - Resource(runtimeschema.GroupVersionResource{Version: "v1", Resource: "configmaps"}). - Namespace(kubernetes.TelemetryNamespace). - Update(ctx, newIdsMap, metav1.UpdateOptions{}) - if err != nil { - return err - } - - return nil -} - -func (u *Updater) findOrCreateNamespace(ctx context.Context) error { - _, err := u.Client. - Resource(runtimeschema.GroupVersionResource{Version: "v1", Resource: "namespaces"}). - Get(ctx, kubernetes.TelemetryNamespace, metav1.GetOptions{}) - if apierrors.IsNotFound(err) { - fmt.Println("did not find namespace, creating namespace") - nsObj := &unstructured.Unstructured{ - Object: map[string]interface{}{ - "metadata": map[string]interface{}{ - "name": kubernetes.TelemetryNamespace, - }, - }, - } - - _, err = u.Client. - Resource(runtimeschema.GroupVersionResource{Version: "v1", Resource: "namespaces"}). - Create(ctx, nsObj, metav1.CreateOptions{}) - if err != nil { - return err - } - } else { - return err - } - return nil -} diff --git a/cmd/cli/plugin/telemetry/update/updater_test.go b/cmd/cli/plugin/telemetry/update/updater_test.go deleted file mode 100644 index 5736b798cb..0000000000 --- a/cmd/cli/plugin/telemetry/update/updater_test.go +++ /dev/null @@ -1,906 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package update_test - -import ( - "context" - "io" - "net/http" - "testing" - - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/telemetry/update" - - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/telemetry/kubernetes" - - "github.com/stretchr/testify/assert" - "k8s.io/apimachinery/pkg/runtime" -) - -func TestUpdateCeip_NoPreviousConfiguration(t *testing.T) { - var namespaceCreated, ceipUpdated bool - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - switch r.URL.Path { - case kubernetes.TelemetryNamespaceURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusNotFound) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "namespace not found", - "reason": "NotFound", - "details": { - "name": "vmware-system-telemetry", - "group": "", - "kind": "namespace" - }, - "code": 404}`)) - if err != nil { - t.Fail() - } - case kubernetes.NamespacesURI: - assert.Equal(t, r.Method, http.MethodPost) - namespaceCreated = true - buf, err := io.ReadAll(r.Body) - assert.NoError(t, err) - assert.Contains(t, string(buf), `"name":"vmware-system-telemetry"`) - w.WriteHeader(http.StatusCreated) - _, err = w.Write([]byte(`{ - "kind": "Namespace", - "apiVersion": "v1", - "metadata": { - "name": "vmware-system-telemetry" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.CeipConfigMapURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusNotFound) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "configmap not found", - "reason": "NotFound", - "details": { - "name": "vmware-telemetry-cluster-ceip", - "group": "", - "kind": "configmap" - }, - "code": 404}`)) - if err != nil { - t.Fail() - } - case kubernetes.ConfigMapsURI: - assert.Equal(t, r.Method, http.MethodPost) - buf, err := io.ReadAll(r.Body) - assert.NoError(t, err) - assert.Contains(t, string(buf), `"level":"standard"`) - ceipUpdated = true - w.WriteHeader(http.StatusCreated) - _, err = w.Write([]byte(`{ - "kind": "ConfigMap", - "apiVersion": "v1", - "metadata": { - "name": "vmware-telemetry-cluster-ceip" - } - }`)) - if err != nil { - t.Fail() - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - err = subject.UpdateCeip(context.Background(), true) - assert.NoError(t, err) - assert.True(t, namespaceCreated) - assert.True(t, ceipUpdated) -} - -func TestUpdateCeip_CreateConfigMapError(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - switch r.URL.Path { - case kubernetes.TelemetryNamespaceURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "kind": "Namespace", - "apiVersion": "v1", - "metadata": { - "name": "vmware-system-telemetry" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.CeipConfigMapURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusNotFound) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "configmap not found", - "reason": "NotFound", - "details": { - "name": "vmware-telemetry-cluster-ceip", - "group": "", - "kind": "configmap" - }, - "code": 404}`)) - if err != nil { - t.Fail() - } - case kubernetes.ConfigMapsURI: - assert.Equal(t, r.Method, http.MethodPost) - w.WriteHeader(http.StatusForbidden) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "access to configmap forbidden", - "reason": "Forbidden", - "details": { - "name": "vmware-system-telemetry-ceip", - "kind": "configmap" - }, - "code": 403 - }`)) - if err != nil { - t.Fail() - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - err = subject.UpdateCeip(context.Background(), true) - assert.Error(t, err) - if err == nil { - t.Logf("err is not nil") - t.FailNow() - } - assert.Contains(t, err.Error(), "forbidden") -} - -func TestUpdateCeip_GetConfigMapError(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - - switch r.URL.Path { - case kubernetes.TelemetryNamespaceURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "kind": "Namespace", - "apiVersion": "v1", - "metadata": { - "name": "vmware-system-telemetry" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.CeipConfigMapURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusForbidden) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "access to configmap forbidden", - "reason": "Forbidden", - "details": { - "name": "vmware-telemetry-cluster-ceip", - "group": "", - "kind": "configmap" - }, - "code": 403}`)) - if err != nil { - t.Fail() - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - err = subject.UpdateCeip(context.Background(), true) - assert.Error(t, err) - if err == nil { - t.Logf("err is not nil") - t.FailNow() - } - assert.Contains(t, err.Error(), "forbidden") -} - -func TestUpdateCeip_UpdateConfigMapError(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - switch r.URL.Path { - case kubernetes.TelemetryNamespaceURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "kind": "Namespace", - "apiVersion": "v1", - "metadata": { - "name": "vmware-system-telemetry" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.CeipConfigMapURI: - switch r.Method { - case http.MethodGet: - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "apiVersion": "v1", - "data": { - "level": "disabled" - }, - "kind": "ConfigMap", - "metadata": { - "name": "vmware-telemetry-cluster-ceip", - "namespace": "vmware-system-telemetry", - "uid": "464177f9-4e0a-4c83-b1cc-a8197788de24"} - }`)) - if err != nil { - t.Fail() - } - - case http.MethodPut: - w.WriteHeader(http.StatusForbidden) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "access to configmap forbidden", - "reason": "Forbidden", - "details": { - "name": "vmware-system-telemetry-ceip", - "kind": "configmap" - }, - "code": 403 - }`)) - if err != nil { - t.Fail() - } - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - err = subject.UpdateCeip(context.Background(), true) - assert.Error(t, err) - if err == nil { - t.Logf("err is not nil") - t.FailNow() - } - assert.Contains(t, err.Error(), "forbidden") -} - -func TestUpdateCeip_PreviousConfigurationExists(t *testing.T) { - var ceipUpdated bool - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - - switch r.URL.Path { - case kubernetes.TelemetryNamespaceURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "kind": "Namespace", - "apiVersion": "v1", - "metadata": { - "name": "vmware-system-telemetry" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.NamespacesURI: - assert.Equal(t, r.Method, http.MethodPost) - buf, err := io.ReadAll(r.Body) - assert.NoError(t, err) - assert.Contains(t, string(buf), `"name":"vmware-system-telemetry"`) - w.WriteHeader(http.StatusCreated) - _, err = w.Write([]byte(`{ - "kind": "Namespace", - "apiVersion": "v1", - "metadata": { - "name": "vmware-system-telemetry" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.CeipConfigMapURI: - switch r.Method { - case http.MethodGet: - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "apiVersion": "v1", - "data": { - "level": "disabled" - }, - "kind": "ConfigMap", - "metadata": { - "name": "vmware-telemetry-cluster-ceip", - "namespace": "vmware-system-telemetry", - "uid": "464177f9-4e0a-4c83-b1cc-a8197788de24"} - }`)) - if err != nil { - t.Fail() - } - - case http.MethodPut: - w.WriteHeader(http.StatusOK) - buf, err := io.ReadAll(r.Body) - assert.NoError(t, err) - assert.Contains(t, string(buf), `"level":"standard"`) - ceipUpdated = true - _, err = w.Write([]byte(`{ - "apiVersion": "v1", - "data": { - "level": "standard" - }, - "kind": "ConfigMap", - "metadata": { - "name": "vmware-telemetry-cluster-ceip", - "namespace": "vmware-system-telemetry", - "uid": "464177f9-4e0a-4c83-b1cc-a8197788de24"} - }`)) - if err != nil { - t.Fail() - } - } - - case kubernetes.ConfigMapsURI: - assert.Equal(t, r.Method, http.MethodPost) - buf, err := io.ReadAll(r.Body) - assert.NoError(t, err) - assert.Contains(t, string(buf), `"level":"standard"`) - ceipUpdated = true - w.WriteHeader(http.StatusCreated) - _, err = w.Write([]byte(`{ - "kind": "ConfigMap", - "apiVersion": "v1", - "metadata": { - "name": "vmware-telemetry-cluster-ceip" - } - }`)) - if err != nil { - t.Fail() - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - err = subject.UpdateCeip(context.Background(), true) - assert.NoError(t, err) - assert.True(t, ceipUpdated) -} - -func TestUpdateCeip_FailToFindNamespace(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - if r.URL.Path == kubernetes.TelemetryNamespaceURI { - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusForbidden) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": { - - }, - "status": "Failure", - "message": "namespaces \"vmware-system-telemetry\" is forbidden: User \"system:anonymous\" cannot get resource \"namespaces\" in API group \"\" in the namespace \"vmware-system-telemetry\"", - "reason": "Forbidden", - "details": { - "name": "vmware-system-telemetry", - "kind": "namespaces" - }, - "code": 403 - }`)) - if err != nil { - t.Fail() - } - } - }) - - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - err = subject.UpdateCeip(context.Background(), true) - assert.Error(t, err) - if err == nil { - t.Logf("err is not nil") - t.FailNow() - } - assert.Contains(t, err.Error(), "forbidden") - assert.Contains(t, err.Error(), "vmware-system-telemetry") -} - -func TestUpdateIdentifiers_NoPreviousConfiguration(t *testing.T) { - var namespaceCreated, identifiersCreated, identifiersUpdated bool - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - switch r.URL.Path { - case kubernetes.TelemetryNamespaceURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusNotFound) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "namespace not found", - "reason": "NotFound", - "details": { - "name": "vmware-system-telemetry", - "group": "", - "kind": "namespace" - }, - "code": 404}`)) - if err != nil { - t.Fail() - } - case kubernetes.NamespacesURI: - assert.Equal(t, r.Method, http.MethodPost) - namespaceCreated = true - buf, err := io.ReadAll(r.Body) - assert.NoError(t, err) - assert.Contains(t, string(buf), `"name":"vmware-system-telemetry"`) - w.WriteHeader(http.StatusCreated) - _, err = w.Write([]byte(`{ - "kind": "Namespace", - "apiVersion": "v1", - "metadata": { - "name": "vmware-system-telemetry" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.SharedIdsConfigMapURI: - if r.Method == http.MethodPut { - buf, err := io.ReadAll(r.Body) - assert.NoError(t, err) - assert.Contains(t, string(buf), `"data":{"key-1":"val-1","key-2":"val-2"`) - identifiersUpdated = true - w.WriteHeader(http.StatusOK) - _, err = w.Write([]byte(`{ - "kind": "ConfigMap", - "apiVersion": "v1", - "metadata": { - "name": "vmware-telemetry-identifiers" - } - }`)) - if err != nil { - t.Fail() - } - } else if r.Method == http.MethodGet { - w.WriteHeader(http.StatusNotFound) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "configmap not found", - "reason": "NotFound", - "details": { - "name": "vmware-telemetry-identifiers", - "group": "", - "kind": "configmap" - }, - "code": 404}`)) - if err != nil { - t.Fail() - } - } - case kubernetes.ConfigMapsURI: - assert.Equal(t, r.Method, http.MethodPost) - buf, err := io.ReadAll(r.Body) - assert.NoError(t, err) - assert.Contains(t, string(buf), `"name":"vmware-telemetry-identifiers"`) - identifiersCreated = true - w.WriteHeader(http.StatusCreated) - _, err = w.Write([]byte(`{ - "kind": "ConfigMap", - "apiVersion": "v1", - "metadata": { - "name": "vmware-telemetry-identifiers" - } - }`)) - if err != nil { - t.Fail() - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - vals := []update.UpdateVal{ - {Changed: true, Key: "key-1", Value: "val-1"}, - {Changed: true, Key: "key-2", Value: "val-2"}, - } - err = subject.UpdateIdentifiers(context.Background(), vals) - assert.NoError(t, err) - assert.True(t, namespaceCreated) - assert.True(t, identifiersCreated) - assert.True(t, identifiersUpdated) -} - -func TestUpdateIdentifiers_UpdateOnlyChangedIdentifiers(t *testing.T) { - var identifiersUpdated bool - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - switch r.URL.Path { - case kubernetes.TelemetryNamespaceURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "kind": "Namespace", - "apiVersion": "v1", - "metadata": { - "name": "vmware-system-telemetry" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.SharedIdsConfigMapURI: - if r.Method == http.MethodPut { - buf, err := io.ReadAll(r.Body) - assert.NoError(t, err) - assert.Contains(t, string(buf), `"data":{"key-1":"val-1","key-2":"val-2","key-3":"val-3"`) - identifiersUpdated = true - w.WriteHeader(http.StatusOK) - _, err = w.Write([]byte(`{ - "kind": "ConfigMap", - "apiVersion": "v1", - "metadata": { - "name": "vmware-telemetry-identifiers" - } - }`)) - if err != nil { - t.Fail() - } - } else if r.Method == http.MethodGet { - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "apiVersion": "v1", - "data": { - "key-1": "val-1", - "key-2": "no val" - }, - "kind": "ConfigMap", - "metadata": { - "name": "vmware-telemetry-identifiers", - "namespace": "vmware-system-telemetry", - "uid": "464177f9-4e0a-4c83-b1cc-a8197788de24" - } - }`)) - if err != nil { - t.Fail() - } - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - vals := []update.UpdateVal{ - {Changed: false, Key: "key-1", Value: "default"}, - {Changed: true, Key: "key-2", Value: "val-2"}, - {Changed: true, Key: "key-3", Value: "val-3"}, - } - err = subject.UpdateIdentifiers(context.Background(), vals) - assert.NoError(t, err) - assert.True(t, identifiersUpdated) -} - -func TestUpdateIdentifiers_CreateConfigMapError(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - switch r.URL.Path { - case kubernetes.TelemetryNamespaceURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "kind": "Namespace", - "apiVersion": "v1", - "metadata": { - "name": "vmware-system-telemetry" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.SharedIdsConfigMapURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusNotFound) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "configmap not found", - "reason": "NotFound", - "details": { - "name": "vmware-telemetry-cluster-identifiers", - "group": "", - "kind": "configmap" - }, - "code": 404}`)) - if err != nil { - t.Fail() - } - case kubernetes.ConfigMapsURI: - assert.Equal(t, r.Method, http.MethodPost) - w.WriteHeader(http.StatusForbidden) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "access to configmap forbidden", - "reason": "Forbidden", - "details": { - "name": "vmware-system-telemetry-identifiers", - "kind": "configmap" - }, - "code": 403 - }`)) - if err != nil { - t.Fail() - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - err = subject.UpdateIdentifiers(context.Background(), nil) - assert.Error(t, err) - if err == nil { - t.Logf("err is not nil") - t.FailNow() - } - assert.Contains(t, err.Error(), "forbidden") -} - -func TestUpdateIdentifiers_GetConfigMapError(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - - switch r.URL.Path { - case kubernetes.TelemetryNamespaceURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "kind": "Namespace", - "apiVersion": "v1", - "metadata": { - "name": "vmware-system-telemetry" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.SharedIdsConfigMapURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusForbidden) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "access to configmap forbidden", - "reason": "Forbidden", - "details": { - "name": "vmware-telemetry-cluster-identifiers", - "group": "", - "kind": "configmap" - }, - "code": 403}`)) - if err != nil { - t.Fail() - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - err = subject.UpdateIdentifiers(context.Background(), nil) - assert.Error(t, err) - if err == nil { - t.Logf("err is not nil") - t.FailNow() - } - assert.Contains(t, err.Error(), "forbidden") -} - -func TestUpdateIdentifiers_UpdateConfigMapError(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - switch r.URL.Path { - case kubernetes.TelemetryNamespaceURI: - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "kind": "Namespace", - "apiVersion": "v1", - "metadata": { - "name": "vmware-system-telemetry" - } - }`)) - if err != nil { - t.Fail() - } - case kubernetes.SharedIdsConfigMapURI: - switch r.Method { - case http.MethodGet: - w.WriteHeader(http.StatusOK) - _, err := w.Write([]byte(`{ - "apiVersion": "v1", - "data": { - "key-1": "val-1" - }, - "kind": "ConfigMap", - "metadata": { - "name": "vmware-telemetry-identifiers", - "namespace": "vmware-system-telemetry", - "uid": "464177f9-4e0a-4c83-b1cc-a8197788de24"} - }`)) - if err != nil { - t.Fail() - } - - case http.MethodPut: - w.WriteHeader(http.StatusForbidden) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": {}, - "status": "Failure", - "message": "access to configmap forbidden", - "reason": "Forbidden", - "details": { - "name": "vmware-telemetry-identifiers", - "kind": "configmap" - }, - "code": 403 - }`)) - if err != nil { - t.Fail() - } - } - } - }) - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - err = subject.UpdateIdentifiers(context.Background(), nil) - assert.Error(t, err) - if err == nil { - t.Logf("err is not nil") - t.FailNow() - } - assert.Contains(t, err.Error(), "forbidden") -} - -func TestUpdateIdentifiers_FailToFindNamespace(t *testing.T) { - clf, srv, err := kubernetes.GetKubernetesClientServer(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", runtime.ContentTypeJSON) - if r.URL.Path == kubernetes.TelemetryNamespaceURI { - assert.Equal(t, r.Method, http.MethodGet) - w.WriteHeader(http.StatusForbidden) - _, err := w.Write([]byte(`{ - "kind": "Status", - "apiVersion": "v1", - "metadata": { - - }, - "status": "Failure", - "message": "namespaces \"vmware-system-telemetry\" is forbidden: User \"system:anonymous\" cannot get resource \"namespaces\" in API group \"\" in the namespace \"vmware-system-telemetry\"", - "reason": "Forbidden", - "details": { - "name": "vmware-system-telemetry", - "kind": "namespaces" - }, - "code": 403 - }`)) - if err != nil { - t.Fail() - } - } - }) - - assert.NoError(t, err) - defer srv.Close() - - client, _ := clf() - subject := &update.Updater{ - Client: client, - } - - err = subject.UpdateIdentifiers(context.Background(), nil) - assert.Error(t, err) - if err == nil { - t.Logf("err is not nil") - t.FailNow() - } - assert.Contains(t, err.Error(), "forbidden") - assert.Contains(t, err.Error(), "vmware-system-telemetry") -} diff --git a/cmd/cli/plugin/tkr/README.md b/cmd/cli/plugin/tkr/README.md deleted file mode 100644 index 908ea024c7..0000000000 --- a/cmd/cli/plugin/tkr/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# Get Available TKr - -## Get available Tanzu Kubernetes releases - -```sh -tanzu kubernetes-release get -h -Usage: - tanzu kubernetes-release get TKR_NAME [flags] - -Flags: - -h, --help help for get -``` - -### Sample command and output - -```sh -tanzu kubernetes-release get - NAME VERSION COMPATIBLE UPGRADEAVAILABLE - v1.16.3---vmware.2 v1.16.3+vmware.2-tkg.1 False True - v1.17.13---vmware.1 v1.17.13+vmware.1-tkg.1 True True - v1.18.2---vmware.1 v1.18.2+vmware.1-tkg.1 True True - v1.18.6---vmware.1 v1.18.6+vmware.1-tkg.1 True True - v1.19.3---vmware.1 v1.19.3+vmware.1-tkg.1 True True - v1.19.3---vmware.2 v1.19.3+vmware.2-tkg.1 True False -``` - -## Get available upgrades for a Tanzu Kubernetes release - -```sh -tanzu kubernetes-release available-upgrades get -h -Usage: - tanzu kubernetes-release available-upgrades get TKR_NAME [flags] - -Flags: - -h, --help help for get -``` - -### Sample command and output - -```sh -tanzu kubernetes-release available-upgrades get v1.18.6---vmware.1 - NAME VERSION - v1.19.3---vmware.1 v1.19.3+vmware.1-tkg.1 - v1.19.3---vmware.2 v1.19.3+vmware.2-tkg.1 -``` - -## Get supported OS info of a Tanzu Kubernetes release - -```sh -tanzu kubernetes-release os get -h -Usage: -tanzu kubernetes-release os get TKR_NAME [flags] - -Flags: --h, --help help for get ---region string The AWS region where AMIs are available -``` - -### Sample command and output - -```sh -tanzu kubernetes-release os get v1.18.6---vmware.1 -NAME VERSION ARCH -photonos 1.1 amd64 -``` diff --git a/cmd/cli/plugin/tkr/featureflags.go b/cmd/cli/plugin/tkr/featureflags.go deleted file mode 100644 index 07096e5375..0000000000 --- a/cmd/cli/plugin/tkr/featureflags.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -const ( - // TKR version v1alpha3 feature flag determines whether to use Tanzu Kubernetes Release API version v1alpha3. Setting - // feature flag to true will allow to use the TKR version v1alpha3; false allows to use legacy TKR version v1alpha1 - FeatureFlagTKRVersionV1Alpha3 = "features.global.tkr-version-v1alpha3-beta" -) - -// DefaultFeatureFlagsForTKRPlugin is used to populate default feature-flags for the tkr plugin -var ( - DefaultFeatureFlagsForTKRPlugin = map[string]bool{ - FeatureFlagTKRVersionV1Alpha3: false, - } -) diff --git a/cmd/cli/plugin/tkr/main.go b/cmd/cli/plugin/tkr/main.go deleted file mode 100644 index 3393d1d0a0..0000000000 --- a/cmd/cli/plugin/tkr/main.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "os" - "time" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - tkrv1alpha1 "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/tkr/v1alpha1" - tkrv1alpha3 "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/tkr/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "kubernetes-release", - Description: "Kubernetes release operations", - Group: cliapi.RunCmdGroup, - Aliases: []string{"kr", "kubernetes-releases"}, - Version: buildinfo.Version, - BuildSHA: buildinfo.SHA, - DefaultFeatureFlags: DefaultFeatureFlagsForTKRPlugin, -} - -var ( - logLevel int32 - logFile string - - v1alpha1CmdsList = []*cobra.Command{ - tkrv1alpha1.GetTanzuKubernetesRleasesCmd, - tkrv1alpha1.OsCmd, - tkrv1alpha1.AvailableUpgradesCmd, - tkrv1alpha1.ActivateCmd, - tkrv1alpha1.DeactivateCmd, - } - - v1alpha3CmdsList = []*cobra.Command{ - tkrv1alpha3.GetTanzuKubernetesRleasesCmd, - tkrv1alpha3.OsCmd, - tkrv1alpha3.ActivateCmd, - tkrv1alpha3.DeactivateCmd, - } -) - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.PersistentFlags().Int32VarP(&logLevel, "verbose", "v", 0, "Number for the log level verbosity(0-9)") - p.Cmd.PersistentFlags().StringVar(&logFile, "log-file", "", "Log file path") - - // Add the right set of commands based on the TKR API version - if isTKRAPIVersionV1Alpha3() { - tkrv1alpha3.LogFile = logFile - tkrv1alpha3.LogLevel = logLevel - p.AddCommands(v1alpha3CmdsList...) - } else { - tkrv1alpha1.LogFile = logFile - tkrv1alpha1.LogLevel = logLevel - p.AddCommands(v1alpha1CmdsList...) - } - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -// isTKRAPIVersionV1Alpha3 determines the TKR API version based on the management-cluster feature-gate -func isTKRAPIVersionV1Alpha3() bool { - // If feature-flag is activated return true - if config.IsFeatureActivated(FeatureFlagTKRVersionV1Alpha3) { - return true - } - - // else check the feature-gate on the management-cluster to determine the TKR API version - // if clusterclass feature-gate is enabled on the cluster, we can assume that TKR API v1alpha3 is available - server, err := config.GetCurrentServer() - if err != nil || server.IsGlobal() { - return false - } - - clusterClientOptions := clusterclient.Options{GetClientInterval: 2 * time.Second, GetClientTimeout: 5 * time.Second} - fgHelper := tkgctl.NewFeatureGateHelper(&clusterClientOptions, server.ManagementClusterOpts.Context, server.ManagementClusterOpts.Path) - activated, _ := fgHelper.FeatureActivatedInNamespace(context.Background(), constants.ClusterClassFeature, constants.TKGSClusterClassNamespace) - return activated -} diff --git a/cmd/cli/plugin/tkr/test/main.go b/cmd/cli/plugin/tkr/test/main.go deleted file mode 100644 index 820a965253..0000000000 --- a/cmd/cli/plugin/tkr/test/main.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("kubernetes-release") - -func main() { - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - m := clitest.NewMain("kubernetes-release", c, Cleanup) - // TODO: Add tests for the kubernetes-release plugin - defer m.Finish() - - return nil -} - -// Cleanup the test. -func Cleanup() error { - return nil -} diff --git a/cmd/cli/plugin/tkr/utils/helpers.go b/cmd/cli/plugin/tkr/utils/helpers.go deleted file mode 100644 index 6874490d33..0000000000 --- a/cmd/cli/plugin/tkr/utils/helpers.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package utils provides common utility functions -package utils - -import ( - "path/filepath" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -func getConfigDir() (string, error) { - tanzuConfigDir, err := config.LocalDir() - if err != nil { - return "", err - } - return filepath.Join(tanzuConfigDir, "tkg"), nil -} - -func CreateTKGClient(kubeconfig, kubecontext, logFile string, logLevel int32) (tkgctl.TKGClient, error) { - configDir, err := getConfigDir() - if err != nil { - return nil, err - } - return tkgctl.New(tkgctl.Options{ - ConfigDir: configDir, - KubeConfig: kubeconfig, - KubeContext: kubecontext, - LogOptions: tkgctl.LoggingOptions{Verbosity: logLevel, File: logFile}, - }) -} diff --git a/cmd/cli/plugin/tkr/v1alpha1/activate_deactivate.go b/cmd/cli/plugin/tkr/v1alpha1/activate_deactivate.go deleted file mode 100644 index d8d3f261ae..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha1/activate_deactivate.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 provides the command definitions for TKR API v1alpha1 -package v1alpha1 - -import ( - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/tkr/utils" -) - -var ActivateCmd = &cobra.Command{ - Use: "activate TKR_NAME", - Short: "Activate Tanzu Kubernetes Releases", - Long: "Activate Tanzu Kubernetes Releases", - Args: cobra.ExactArgs(1), - RunE: activateKubernetesReleasesCmd, -} - -var DeactivateCmd = &cobra.Command{ - Use: "deactivate TKR_NAME", - Short: "Deactivate Tanzu Kubernetes Releases", - Long: "Deactivate Tanzu Kubernetes Releases", - Args: cobra.ExactArgs(1), - RunE: deactivateKubernetesReleasesCmd, -} - -func activateKubernetesReleasesCmd(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("activating TanzuKubernetesRelease with a global server is not implemented yet") - } - - tkgctlClient, err := utils.CreateTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context, LogFile, LogLevel) - if err != nil { - return err - } - - err = tkgctlClient.ActivateTanzuKubernetesReleases(args[0]) - if err != nil { - return err - } - - return nil -} - -func deactivateKubernetesReleasesCmd(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("deactivating TanzuKubernetesRelease with a global server is not implemented yet") - } - - tkgctlClient, err := utils.CreateTKGClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context, LogFile, LogLevel) - if err != nil { - return err - } - - err = tkgctlClient.DeactivateTanzuKubernetesReleases(args[0]) - if err != nil { - return err - } - - return nil -} diff --git a/cmd/cli/plugin/tkr/v1alpha1/available_upgrade.go b/cmd/cli/plugin/tkr/v1alpha1/available_upgrade.go deleted file mode 100644 index ab9fb2a960..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha1/available_upgrade.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "fmt" - "strings" - "time" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - corev1 "k8s.io/api/core/v1" - "sigs.k8s.io/cluster-api/util/conditions" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -const lenMsg = 2 - -var AvailableUpgradesCmd = &cobra.Command{ - Use: "available-upgrades", - Short: "Get upgrade information for a Tanzu Kubernetes Release", - Long: `Get upgrade information for a Tanzu Kubernetes Release`, - Aliases: []string{"avup"}, -} - -var getAvailableUpgradesCmd = &cobra.Command{ - Use: "get TKR_NAME", - Short: "Get all available upgrades for a specific Tanzu Kubernetes Release", - Long: `Get all available upgrades for a specific Tanzu Kubernetes Release`, - Args: cobra.ExactArgs(1), - RunE: getAvailableUpgrades, -} - -func init() { - AvailableUpgradesCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table)") - AvailableUpgradesCmd.AddCommand(getAvailableUpgradesCmd) -} - -func getAvailableUpgrades(cmd *cobra.Command, args []string) error { - clusterClient, err := getClusterClient() - if err != nil { - return err - } - - tkrs, err := clusterClient.GetTanzuKubernetesReleases("") - if err != nil { - return err - } - - results := availableUpdatesInTKRs(tkrs, args[0]) - if len(results) == 0 { - fmt.Println("There are no available upgrades for this TanzuKubernetesRelease") - return nil - } - - t := component.NewOutputWriter(AvailableUpgradesCmd.OutOrStdout(), outputFormat, "NAME", "VERSION") - for i := range results { - t.AddRow(results[i].Name, results[i].Spec.Version) - } - t.Render() - - return nil -} - -func getClusterClient() (clusterclient.Client, error) { - server, err := config.GetCurrentServer() - if err != nil { - return nil, err - } - - if server.IsGlobal() { - return nil, errors.New("getting TanzuKubernetesRelease with a global server is not implemented yet") - } - - clusterClientOptions := clusterclient.Options{GetClientInterval: 2 * time.Second, GetClientTimeout: 5 * time.Second} - clusterClient, err := clusterclient.NewClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context, clusterClientOptions) - if err != nil { - return nil, err - } - return clusterClient, nil -} - -func availableUpdatesInTKRs(tkrs []runv1alpha1.TanzuKubernetesRelease, tkrName string) []runv1alpha1.TanzuKubernetesRelease { - tkr := tkrByName(tkrs, tkrName) - if tkr == nil { - return nil - } - - candidates := namesFromUpdatesAvailable(tkr) - if len(candidates) == 0 { - candidates = namesFromUpgradeAvailable(tkr) // fall back to UpgradeAvailable condition - } - - results := filterTKRs(tkrs, func(tkr *runv1alpha1.TanzuKubernetesRelease) bool { - if !conditions.IsTrue(tkr, runv1alpha1.ConditionCompatible) { - return false - } - _, exists := candidates[tkr.Name] - return exists - }) - return results -} - -type stringSet map[string]struct{} - -func (set stringSet) Add(ss ...string) stringSet { - for _, s := range ss { - set[s] = struct{}{} - } - return set -} - -func namesFromUpdatesAvailable(tkr *runv1alpha1.TanzuKubernetesRelease) stringSet { - conditionUpdatesAvailable := conditions.Get(tkr, runv1alpha1.ConditionUpdatesAvailable) - if conditionUpdatesAvailable == nil || conditionUpdatesAvailable.Status != corev1.ConditionTrue { - return stringSet{} - } - - message := strings.Trim(conditionUpdatesAvailable.Message, "[]") - message = strings.ReplaceAll(message, ",", " ") - - versions := strings.Fields(message) - - names := mapStrings(versions, tkrNameFromVersion) - candidates := stringSet{}.Add(names...) - return candidates -} - -func namesFromUpgradeAvailable(tkr *runv1alpha1.TanzuKubernetesRelease) stringSet { - conditionUpgradeAvailable := conditions.Get(tkr, runv1alpha1.ConditionUpgradeAvailable) - if conditionUpgradeAvailable == nil || conditionUpgradeAvailable.Status != corev1.ConditionTrue { - return stringSet{} - } - - strs := strings.Split(conditionUpgradeAvailable.Message, ": ") - if len(strs) != lenMsg { - return stringSet{} - } - - versions := strings.Split(strs[1], ",") - - names := mapStrings(versions, tkrNameFromVersion) - candidates := stringSet{}.Add(names...) - return candidates -} - -func tkrNameFromVersion(version string) string { - return strings.ReplaceAll(version, "+", "---") -} - -type stringMapper func(s string) string - -func mapStrings(ss []string, m stringMapper) []string { - result := make([]string, len(ss)) - for i, s := range ss { - result[i] = m(s) - } - return result -} - -type tkrPredicate func(release *runv1alpha1.TanzuKubernetesRelease) bool - -func filterTKRs(tkrs []runv1alpha1.TanzuKubernetesRelease, p tkrPredicate) []runv1alpha1.TanzuKubernetesRelease { - result := make([]runv1alpha1.TanzuKubernetesRelease, 0, len(tkrs)) - for i := range tkrs { - if p(&tkrs[i]) { - result = append(result, tkrs[i]) - } - } - return result -} - -func tkrByName(tkrs []runv1alpha1.TanzuKubernetesRelease, name string) *runv1alpha1.TanzuKubernetesRelease { - for i := range tkrs { - if tkrs[i].Name == name { - return &tkrs[i] - } - } - return nil -} diff --git a/cmd/cli/plugin/tkr/v1alpha1/available_upgrade_test.go b/cmd/cli/plugin/tkr/v1alpha1/available_upgrade_test.go deleted file mode 100644 index ae4a3752de..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha1/available_upgrade_test.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/conditions" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" -) - -var _ = Describe("availableUpdatesInTKRs()", func() { - var tkrs []runv1alpha1.TanzuKubernetesRelease - - tkr1 := getFakeTKR("v1.17.17---vmware.1-tkg.2", "v1.17.17+vmware.1", corev1.ConditionFalse, "[v1.17.18+vmware.1-tkg.1 v1.18.2+vmware.1-tkg.1]") - tkr2 := getFakeTKR("v1.17.18---vmware.1-tkg.1", "v1.17.18+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.1---vmware.1-tkg.2", "v1.18.1+vmware.1", corev1.ConditionFalse, "") - tkr4 := getFakeTKR("v1.18.2---vmware.1-tkg.1", "v1.18.2+vmware.1", corev1.ConditionTrue, "") - - BeforeEach(func() { - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr2, tkr3, tkr4} - }) - - When("given a non-existent tkrName", func() { - It("should return nil / empty list", func() { - Expect(availableUpdatesInTKRs(tkrs, "blah")).To(BeEmpty()) - }) - }) - - When("given a TKR with condition UpdatesAvailable=True", func() { - It("should return only TKRs that are mentioned in the condition message", func() { - Expect(availableUpdatesInTKRs(tkrs, "v1.17.17---vmware.1-tkg.2")).To(ContainElements(tkr2, tkr4)) - Expect(availableUpdatesInTKRs(tkrs, "v1.17.17---vmware.1-tkg.2")).ToNot(ContainElements(tkr3)) - }) - }) - - When("given a TKR without condition UpdatesAvailable", func() { - BeforeEach(func() { - conditions.Delete(&tkrs[0], runv1alpha1.ConditionUpdatesAvailable) - }) - - When("the TKR does not have condition UpgradeAvailable=True", func() { - It("should return only TKRs that are mentioned in the condition message", func() { - Expect(availableUpdatesInTKRs(tkrs, "v1.17.17---vmware.1-tkg.2")).To(BeEmpty()) - }) - }) - - When("the TKR has condition UpgradeAvailable=True", func() { - BeforeEach(func() { - conditions.Set(&tkrs[0], &clusterv1.Condition{ - Type: runv1alpha1.ConditionUpgradeAvailable, - Status: corev1.ConditionTrue, - Message: "Deprecated, TKR(s) with later version is available: v1.17.18---vmware.1-tkg.1,v1.18.2---vmware.1-tkg.1", - }) - }) - - It("should return only TKRs that are mentioned in the condition message", func() { - Expect(availableUpdatesInTKRs(tkrs, "v1.17.17---vmware.1-tkg.2")).To(ContainElements(tkr2, tkr4)) - Expect(availableUpdatesInTKRs(tkrs, "v1.17.17---vmware.1-tkg.2")).ToNot(ContainElements(tkr3)) - }) - }) - }) -}) - -var _ = Describe("filterTKRs()", func() { - tkr1 := getFakeTKR("v1.17.17---vmware.1-tkg.2", "v1.17.17+vmware.1", corev1.ConditionFalse, "") - tkr2 := getFakeTKR("v1.17.18---vmware.1-tkg.1", "v1.17.18+vmware.1", corev1.ConditionTrue, "") - tkr3 := getFakeTKR("v1.18.1---vmware.1-tkg.2", "v1.18.1+vmware.1", corev1.ConditionFalse, "") - tkr4 := getFakeTKR("v1.18.2---vmware.1-tkg.1", "v1.18.2+vmware.1", corev1.ConditionFalse, "") - tkrs := []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr2, tkr3, tkr4} - - It("should list only and all TKRs satisfying the predicate", func() { - nameBeginsWith117 := func(tkr *runv1alpha1.TanzuKubernetesRelease) bool { - return strings.HasPrefix(tkr.Name, "v1.17") - } - nameBeginsWith118 := func(tkr *runv1alpha1.TanzuKubernetesRelease) bool { - return strings.HasPrefix(tkr.Name, "v1.18") - } - Expect(filterTKRs(tkrs, nameBeginsWith117)).To(ContainElements(tkr1, tkr2)) // all beginning with v1.17 - Expect(filterTKRs(tkrs, nameBeginsWith118)).To(ContainElements(tkr3, tkr4)) // all beginning with v1.18 - Expect(filterTKRs(tkrs, nameBeginsWith117)).ToNot(ContainElement(tkr3)) // begins with v1.18 - Expect(filterTKRs(tkrs, nameBeginsWith118)).ToNot(ContainElements(tkr1)) // begins with v1.17 - }) -}) diff --git a/cmd/cli/plugin/tkr/v1alpha1/doc.go b/cmd/cli/plugin/tkr/v1alpha1/doc.go deleted file mode 100644 index 3d09568b35..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha1/doc.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -/* -Kubernetes release operations. - - -Get available Tanzu Kubernetes Releases - -Usage: - tanzu kubernetes-release get TKR_NAME [flags] - -Flags: - -h, --help help for get - -Sample command and output: - - tanzu kubernetes-release get - NAME VERSION COMPATIBLE UPGRADEAVAILABLE - v1.16.3---vmware.2 v1.16.3+vmware.2-tkg.1 False True - v1.17.13---vmware.1 v1.17.13+vmware.1-tkg.1 True True - v1.18.2---vmware.1 v1.18.2+vmware.1-tkg.1 True True - v1.18.6---vmware.1 v1.18.6+vmware.1-tkg.1 True True - v1.19.3---vmware.1 v1.19.3+vmware.1-tkg.1 True True - v1.19.3---vmware.2 v1.19.3+vmware.2-tkg.1 True False - - -Get available upgrades for a Tanzu Kubernetes Release - -Usage: - tanzu kubernetes-release available-upgrades get TKR_NAME [flags] - -Flags: - -h, --help help for get - - -Sample command and output: - - tanzu kubernetes-release available-upgrades get v1.18.6---vmware.1 - NAME VERSION - v1.19.3---vmware.1 v1.19.3+vmware.1-tkg.1 - v1.19.3---vmware.2 v1.19.3+vmware.2-tkg.1 - - -Get supported OS info of a Tanzu Kubernetes Release - -Usage: - tanzu kubernetes-release os get TKR_NAME [flags] - -Flags: - -h, --help help for get - --region string The AWS region where AMIs are available - -Sample command and output: - - tanzu kubernetes-release os get v1.18.6---vmware.1 - NAME VERSION ARCH - photonos 1.1 amd64 -*/ diff --git a/cmd/cli/plugin/tkr/v1alpha1/get_tkr.go b/cmd/cli/plugin/tkr/v1alpha1/get_tkr.go deleted file mode 100644 index 7e1fcf3cac..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha1/get_tkr.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "io" - "time" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -var ( - LogLevel int32 - LogFile string - outputFormat string -) - -type getTKROptions struct { - listAll bool - output io.Writer -} - -var gtkr = &getTKROptions{} - -var GetTanzuKubernetesRleasesCmd = &cobra.Command{ - Use: "get TKR_NAME", - Short: "Get available Tanzu Kubernetes releases", - Long: "Get available Tanzu Kubernetes releases", - RunE: getKubernetesReleases, -} - -func init() { - GetTanzuKubernetesRleasesCmd.Flags().BoolVarP(>kr.listAll, "all", "a", false, "List all the available Tanzu Kubernetes releases including Incompatible and deactivated") - GetTanzuKubernetesRleasesCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table)") -} - -func getKubernetesReleases(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("getting Tanzu Kubernetes release with a global server is not implemented yet") - } - - clusterClientOptions := clusterclient.Options{GetClientInterval: 2 * time.Second, GetClientTimeout: 5 * time.Second} - clusterClient, err := clusterclient.NewClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context, clusterClientOptions) - if err != nil { - return err - } - tkrName := "" - if len(args) != 0 { - tkrName = args[0] - } - gtkr.output = cmd.OutOrStdout() - return runGetKubernetesReleases(clusterClient, tkrName) -} - -func runGetKubernetesReleases(clusterClient clusterclient.Client, tkrName string) error { - tkrs, err := clusterClient.GetTanzuKubernetesReleases(tkrName) - if err != nil { - return err - } - - t := component.NewOutputWriter(gtkr.output, outputFormat, "NAME", "VERSION", "COMPATIBLE", "ACTIVE", "UPDATES AVAILABLE") - for i := range tkrs { - compatible := "" - upgradeAvailable := "" - for _, condition := range tkrs[i].Status.Conditions { - if condition.Type == runv1alpha1.ConditionCompatible { - compatible = string(condition.Status) - } - // ConditionUpgradeAvailable is deprecated, but check here for backward compatibility - if condition.Type == runv1alpha1.ConditionUpdatesAvailable || condition.Type == runv1alpha1.ConditionUpgradeAvailable { - upgradeAvailable = string(condition.Status) - } - } - labels := tkrs[i].Labels - activeStatus := "True" - if labels != nil { - if _, exists := labels[constants.TanzuKubernetesReleaseInactiveLabel]; exists { - activeStatus = "False" - } - } - - if !gtkr.listAll && (!utils.IsTkrCompatible(&tkrs[i]) || !utils.IsTkrActive(&tkrs[i])) { - continue - } - t.AddRow(tkrs[i].Name, tkrs[i].Spec.Version, compatible, activeStatus, upgradeAvailable) - } - t.Render() - return nil -} diff --git a/cmd/cli/plugin/tkr/v1alpha1/get_tkr_test.go b/cmd/cli/plugin/tkr/v1alpha1/get_tkr_test.go deleted file mode 100644 index bd31aebf62..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha1/get_tkr_test.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "bytes" - "io" - "os" - "strings" - "sync" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -func TestAPIs(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "TKR test") -} - -var _ = Describe("runGetKubernetesReleases", func() { - var ( - tkrName string - err error - clusterClient *fakes.ClusterClient - tkrs []runv1alpha1.TanzuKubernetesRelease - stdOutput string - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - tkrName = "" - }) - - JustBeforeEach(func() { - reader, writer, perr := os.Pipe() - if perr != nil { - panic(perr) - } - stdout := os.Stdout - stderr := os.Stderr - defer func() { - os.Stdout = stdout - os.Stderr = stderr - }() - os.Stdout = writer - os.Stderr = writer - gtkr.output = writer - out := make(chan string) - wg := new(sync.WaitGroup) - wg.Add(1) - go func() { - var buf bytes.Buffer - wg.Done() - _, copyErr := io.Copy(&buf, reader) - Expect(copyErr).ToNot(HaveOccurred()) - out <- buf.String() - }() - wg.Wait() - err = runGetKubernetesReleases(clusterClient, tkrName) - writer.Close() - stdOutput = <-out - - }) - - Context("When the GetTanzuKubernetesReleases return error", func() { - BeforeEach(func() { - clusterClient.GetTanzuKubernetesReleasesReturns(tkrs, errors.New("fake TKR error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("When the GetTanzuKubernetesReleases returns the TKRs successfully", func() { - BeforeEach(func() { - tkr1 := getFakeTKR("v1.17.17---vmware.1-tkg.2", "v1.17.17+vmware.1", corev1.ConditionFalse, "") - tkr2 := getFakeTKR("v1.17.18---vmware.1-tkg.1", "v1.17.18+vmware.1", corev1.ConditionTrue, "") - - tkrs = []runv1alpha1.TanzuKubernetesRelease{tkr1, tkr2} - clusterClient.GetTanzuKubernetesReleasesReturns(tkrs, nil) - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(stdOutput).To(ContainSubstring("v1.17.18---vmware.1-tkg.1")) - Expect(stdOutput).ToNot(ContainSubstring("v1.17.17---vmware.1-tkg.2")) - }) - }) - -}) - -func getFakeTKR(tkrName, k8sversion string, compatibleStatus corev1.ConditionStatus, updatesAvailableMsg string) runv1alpha1.TanzuKubernetesRelease { - tkr := runv1alpha1.TanzuKubernetesRelease{} - tkr.Name = tkrName - tkr.Spec.Version = strings.ReplaceAll(tkrName, "---", "+") - tkr.Spec.KubernetesVersion = k8sversion - tkr.Status.Conditions = []clusterv1.Condition{ - { - Type: runv1alpha1.ConditionCompatible, - Status: compatibleStatus, - }, - { - Type: runv1alpha1.ConditionUpdatesAvailable, - Status: corev1.ConditionTrue, - Message: updatesAvailableMsg, - }, - } - return tkr -} diff --git a/cmd/cli/plugin/tkr/v1alpha1/os.go b/cmd/cli/plugin/tkr/v1alpha1/os.go deleted file mode 100644 index e9c717d425..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha1/os.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - "time" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - tkrconstants "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -var OsCmd = &cobra.Command{ - Use: "os", - Short: "Get the OS information for a Tanzu Kubernetes Release", - Long: `Get the OS information for a Tanzu Kubernetes Release`, -} - -type getOSOptions struct { - region string -} - -var goo = &getOSOptions{} - -var getOSCmd = &cobra.Command{ - Use: "get TKR_NAME", - Short: "Get the OSes that are available for a Tanzu Kubernetes Release", - Long: `Get the OSes that are available for a Tanzu Kubernetes Release`, - Args: cobra.ExactArgs(1), - RunE: getOS, -} - -func init() { - getOSCmd.Flags().StringVarP(&goo.region, "region", "", "", "The AWS region where AMIs are available") - getOSCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table)") - OsCmd.AddCommand(getOSCmd) -} - -//nolint:gocyclo,funlen -func getOS(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("getting TanzuKubernetesRelease with a global server is not implemented yet") - } - - clusterClientOptions := clusterclient.Options{GetClientInterval: 2 * time.Second, GetClientTimeout: 5 * time.Second} - clusterClient, err := clusterclient.NewClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context, clusterClientOptions) - if err != nil { - return err - } - - bomConfigMap, err := clusterClient.GetBomConfigMap(args[0]) - if err != nil { - return err - } - - bomByte, ok := bomConfigMap.BinaryData[tkrconstants.BomConfigMapContentKey] - if !ok { - return errors.Wrapf(err, "the ConfigMap %s does not contain BOM content", bomConfigMap.Name) - } - bom, err := tkrv1.NewBom(bomByte) - if err != nil { - return errors.Wrap(err, "failed to parse the BOM content") - } - - infra, err := clusterClient.GetClusterInfrastructure() - if err != nil { - return errors.Wrap(err, "failed to get current management cluster infrastructure") - } - - osMap := make(map[string]tkrv1.OSInfo) - - switch infra { - case constants.InfrastructureRefVSphere: - ovas, err := bom.GetOVAInfo() - if err != nil { - return errors.Wrap(err, "failed to get vSphere OVA info from the BOM file") - } - for _, ova := range ovas { - osMap[ova.OSInfo.String()] = ova.OSInfo - } - - case constants.InfrastructureRefAWS: - amiMap, err := bom.GetAMIInfo() - if err != nil { - return errors.Wrap(err, "failed to get AWS AMI info from the BOM file") - } - - if goo.region == "" { - return errors.New("you are currently on an AWS management cluster. Please specify a region") - } - - amis, ok := amiMap[goo.region] - if !ok { - return errors.Errorf("failed to find os info in region %s", goo.region) - } - - for _, ami := range amis { - osMap[ami.OSInfo.String()] = ami.OSInfo - } - - case constants.InfrastructureRefAzure: - azureImages, err := bom.GetAzureInfo() - if err != nil { - return errors.Wrap(err, "failed to get Azure image info from the BOM file") - } - for i := range azureImages { - osMap[azureImages[i].OSInfo.String()] = azureImages[i].OSInfo - } - } - - t := component.NewOutputWriter(cmd.OutOrStdout(), outputFormat, "NAME", "VERSION", "ARCH") - for _, os := range osMap { - t.AddRow(os.Name, os.Version, os.Arch) - } - t.Render() - - return nil -} diff --git a/cmd/cli/plugin/tkr/v1alpha3/activate_deactivate.go b/cmd/cli/plugin/tkr/v1alpha3/activate_deactivate.go deleted file mode 100644 index 72948cad7b..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha3/activate_deactivate.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha3 provides the command definitions for TKR API v1alpha3 -package v1alpha3 - -import ( - "fmt" - "time" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - "k8s.io/apimachinery/pkg/types" - - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -var ActivateCmd = &cobra.Command{ - Use: "activate TKR_NAME", - Short: "Activate Tanzu Kubernetes Releases", - Long: "Activate Tanzu Kubernetes Releases", - Args: cobra.ExactArgs(1), - RunE: activateKubernetesReleasesCmd, -} - -var DeactivateCmd = &cobra.Command{ - Use: "deactivate TKR_NAME", - Short: "Deactivate Tanzu Kubernetes Releases", - Long: "Deactivate Tanzu Kubernetes Releases", - Args: cobra.ExactArgs(1), - RunE: deactivateKubernetesReleasesCmd, -} - -func activateKubernetesReleasesCmd(cmd *cobra.Command, args []string) error { - clusterClient, err := getClusterClient() - if err != nil { - return err - } - - err = activateKubernetesReleases(clusterClient, args[0]) - if err != nil { - return err - } - - return nil -} - -func deactivateKubernetesReleasesCmd(cmd *cobra.Command, args []string) error { - clusterClient, err := getClusterClient() - if err != nil { - return err - } - - err = deactivateKubernetesReleases(clusterClient, args[0]) - if err != nil { - return err - } - - return nil -} - -func activateKubernetesReleases(clusterClient clusterclient.Client, tkrName string) error { - var tkr runv1alpha3.TanzuKubernetesRelease - patchFormat := ` - { - "metadata": { - "labels": { - %q: null - } - } - }` - activateTKRTimeout := 10 * time.Second - checkResourceInterval := 5 * time.Second - patchStr := fmt.Sprintf(patchFormat, runv1alpha3.LabelDeactivated) - pollOptions := &clusterclient.PollOptions{Interval: checkResourceInterval, Timeout: activateTKRTimeout} - err := clusterClient.PatchResource(&tkr, tkrName, "", patchStr, types.MergePatchType, pollOptions) - if err != nil { - return errors.Wrap(err, "unable to patch the TKr object to remove the inactive label") - } - - return nil -} -func deactivateKubernetesReleases(clusterClient clusterclient.Client, tkrName string) error { - var tkr runv1alpha3.TanzuKubernetesRelease - patchFormat := ` - { - "metadata": { - "labels": { - %q: "" - } - } - }` - deactivateTKRTimeout := 10 * time.Second - checkResourceInterval := 5 * time.Second - patchStr := fmt.Sprintf(patchFormat, runv1alpha3.LabelDeactivated) - pollOptions := &clusterclient.PollOptions{Interval: checkResourceInterval, Timeout: deactivateTKRTimeout} - err := clusterClient.PatchResource(&tkr, tkrName, "", patchStr, types.MergePatchType, pollOptions) - if err != nil { - return errors.Wrap(err, "unable to patch the TKr object with inactive label") - } - - return nil -} diff --git a/cmd/cli/plugin/tkr/v1alpha3/activate_deactivate_test.go b/cmd/cli/plugin/tkr/v1alpha3/activate_deactivate_test.go deleted file mode 100644 index acf012d51c..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha3/activate_deactivate_test.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/types" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("deactivate/activate TKR", func() { - var ( - tkrName string - err error - clusterClient *fakes.ClusterClient - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - tkrName = "fakeTKRName" - }) - - Context("deactivating TKR", func() { - JustBeforeEach(func() { - err = deactivateKubernetesReleases(clusterClient, tkrName) - }) - Context("When the patching TKR return error", func() { - BeforeEach(func() { - clusterClient.PatchResourceReturns(errors.New("fake TKR patch error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake TKR patch error")) - }) - }) - Context("When the patching TKR return success", func() { - BeforeEach(func() { - clusterClient.PatchResourceReturns(nil) - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - _, getTKRName, _, gotPatch, gotPatchType, _ := clusterClient.PatchResourceArgsForCall(0) - Expect(getTKRName).To(Equal("fakeTKRName")) - Expect(gotPatchType).To(Equal(types.MergePatchType)) - expectedPatchLabel := `"deactivated": ""` - Expect(gotPatch).To(ContainSubstring(expectedPatchLabel)) - }) - }) - }) - - Context("activating TKR", func() { - JustBeforeEach(func() { - err = activateKubernetesReleases(clusterClient, tkrName) - }) - Context("When the patching TKR return error", func() { - BeforeEach(func() { - clusterClient.PatchResourceReturns(errors.New("fake TKR patch error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake TKR patch error")) - }) - }) - Context("When the patching TKR return success", func() { - BeforeEach(func() { - clusterClient.PatchResourceReturns(nil) - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - _, getTKRName, _, gotPatch, gotPatchType, _ := clusterClient.PatchResourceArgsForCall(0) - Expect(getTKRName).To(Equal("fakeTKRName")) - Expect(gotPatchType).To(Equal(types.MergePatchType)) - expectedPatchLabel := `"deactivated": null` - Expect(gotPatch).To(ContainSubstring(expectedPatchLabel)) - }) - }) - }) - -}) diff --git a/cmd/cli/plugin/tkr/v1alpha3/doc.go b/cmd/cli/plugin/tkr/v1alpha3/doc.go deleted file mode 100644 index 682ebd3f30..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha3/doc.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -/* -Kubernetes release operations. - - -Get available Tanzu Kubernetes Releases - -Usage: - tanzu kubernetes-release get TKR_NAME [flags] - -Flags: - -h, --help help for get - -Sample command and output: - - tanzu kubernetes-release get - NAME VERSION COMPATIBLE Active - v1.16.3---vmware.2 v1.16.3+vmware.2-tkg.1 False True - v1.17.13---vmware.1 v1.17.13+vmware.1-tkg.1 True True - v1.18.2---vmware.1 v1.18.2+vmware.1-tkg.1 True True - v1.18.6---vmware.1 v1.18.6+vmware.1-tkg.1 True True - v1.19.3---vmware.1 v1.19.3+vmware.1-tkg.1 True True - v1.19.3---vmware.2 v1.19.3+vmware.2-tkg.1 True False - - - -Get supported OS info of a Tanzu Kubernetes Release - -Usage: - tanzu kubernetes-release os get TKR_NAME [flags] - -Flags: - -h, --help help for get - --region string The AWS region where AMIs are available - -Sample command and output: - - tanzu kubernetes-release os get v1.18.6---vmware.1 - NAME VERSION ARCH - photonos 1.1 amd64 -*/ diff --git a/cmd/cli/plugin/tkr/v1alpha3/get_tkr.go b/cmd/cli/plugin/tkr/v1alpha3/get_tkr.go deleted file mode 100644 index 14e4df940a..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha3/get_tkr.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - "io" - "strings" - "time" - - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -var ( - LogLevel int32 - LogFile string - outputFormat string -) - -type getTKROptions struct { - listAll bool - output io.Writer -} - -var gtkr = &getTKROptions{} - -var GetTanzuKubernetesRleasesCmd = &cobra.Command{ - Use: "get TKR_NAME", - Short: "Get available Tanzu Kubernetes releases", - Long: "Get available Tanzu Kubernetes releases", - RunE: getKubernetesReleases, -} - -func init() { - GetTanzuKubernetesRleasesCmd.Flags().BoolVarP(>kr.listAll, "all", "a", false, "List all the available Tanzu Kubernetes releases including Incompatible and deactivated") - GetTanzuKubernetesRleasesCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table)") -} - -func getKubernetesReleases(cmd *cobra.Command, args []string) error { - server, err := config.GetCurrentServer() - if err != nil { - return err - } - - if server.IsGlobal() { - return errors.New("getting Tanzu Kubernetes release with a global server is not implemented yet") - } - - clusterClientOptions := clusterclient.Options{GetClientInterval: 2 * time.Second, GetClientTimeout: 5 * time.Second} - clusterClient, err := clusterclient.NewClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context, clusterClientOptions) - if err != nil { - return err - } - tkrName := "" - if len(args) != 0 { - tkrName = args[0] - } - gtkr.output = cmd.OutOrStdout() - return runGetKubernetesReleases(clusterClient, tkrName) -} - -func runGetKubernetesReleases(clusterClient clusterclient.Client, tkrName string) error { - tkrs, err := getTKRs(clusterClient, tkrName) - if err != nil { - return err - } - - t := component.NewOutputWriter(gtkr.output, outputFormat, "NAME", "VERSION", "COMPATIBLE", "ACTIVE") - for i := range tkrs { - compatible := "" - for _, condition := range tkrs[i].Status.Conditions { - if condition.Type == runv1alpha3.ConditionCompatible { - compatible = string(condition.Status) - } - } - labels := tkrs[i].Labels - activeStatus := "True" - if labels != nil { - if _, exists := labels[runv1alpha3.LabelDeactivated]; exists { - activeStatus = "False" - } - } - - if !gtkr.listAll && (!strings.EqualFold(compatible, "true") || !strings.EqualFold(activeStatus, "true")) { - continue - } - t.AddRow(tkrs[i].Name, tkrs[i].Spec.Version, compatible, activeStatus) - } - t.Render() - return nil -} - -func getTKRs(clusterClient clusterclient.Client, tkrName string) ([]runv1alpha3.TanzuKubernetesRelease, error) { - var tkrList runv1alpha3.TanzuKubernetesReleaseList - - err := clusterClient.ListResources(&tkrList) - if err != nil { - return nil, errors.Wrap(err, "failed to list TKr's") - } - if tkrName == "" { - return tkrList.Items, nil - } - - result := []runv1alpha3.TanzuKubernetesRelease{} - for i := range tkrList.Items { - if strings.HasPrefix(tkrList.Items[i].Name, tkrName) { - result = append(result, tkrList.Items[i]) - } - } - return result, nil -} diff --git a/cmd/cli/plugin/tkr/v1alpha3/get_tkr_test.go b/cmd/cli/plugin/tkr/v1alpha3/get_tkr_test.go deleted file mode 100644 index fd1fd8b7e1..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha3/get_tkr_test.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - "bytes" - "io" - "os" - "strings" - "sync" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -const tkr1_17 = "v1.17" - -func TestAPIs(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "TKR test") -} - -var _ = Describe("runGetKubernetesReleases", func() { - var ( - tkrName string - err error - clusterClient *fakes.ClusterClient - tkrs []runv1alpha3.TanzuKubernetesRelease - stdOutput string - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - tkrName = "" - }) - - JustBeforeEach(func() { - reader, writer, perr := os.Pipe() - if perr != nil { - panic(perr) - } - stdout := os.Stdout - stderr := os.Stderr - defer func() { - os.Stdout = stdout - os.Stderr = stderr - }() - os.Stdout = writer - os.Stderr = writer - gtkr.output = writer - out := make(chan string) - wg := new(sync.WaitGroup) - wg.Add(1) - go func() { - var buf bytes.Buffer - wg.Done() - _, copyErr := io.Copy(&buf, reader) - Expect(copyErr).ToNot(HaveOccurred()) - out <- buf.String() - }() - wg.Wait() - err = runGetKubernetesReleases(clusterClient, tkrName) - writer.Close() - stdOutput = <-out - - }) - - Context("When the GetTanzuKubernetesReleases return error", func() { - BeforeEach(func() { - clusterClient.ListResourcesReturns(errors.New("fake TKR error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("When the GetTanzuKubernetesReleases returns the TKRs successfully", func() { - BeforeEach(func() { - tkr1 := getFakeTKR("v1.17.17---vmware.1-tkg.2", "v1.17.17+vmware.1", corev1.ConditionFalse) - tkr2 := getFakeTKR("v1.17.18---vmware.1-tkg.1", "v1.17.18+vmware.1", corev1.ConditionTrue) - - tkrs = []runv1alpha3.TanzuKubernetesRelease{tkr1, tkr2} - clusterClient.ListResourcesCalls(func(tkrl interface{}, option ...crtclient.ListOption) error { - tkrList := tkrl.(*runv1alpha3.TanzuKubernetesReleaseList) - tkrList.Items = append(tkrList.Items, tkrs...) - return nil - }) - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(stdOutput).To(ContainSubstring("v1.17.18---vmware.1-tkg.1")) - Expect(stdOutput).ToNot(ContainSubstring("v1.17.17---vmware.1-tkg.2")) - }) - }) - Context("When the TKR name prefix is given and listing TKRs returns the TKRs successfully", func() { - BeforeEach(func() { - tkrName = tkr1_17 - tkr1 := getFakeTKR("v1.17.17---vmware.1-tkg.2", "v1.17.17+vmware.1", corev1.ConditionFalse) - tkr2 := getFakeTKR("v1.17.18---vmware.1-tkg.1", "v1.17.18+vmware.1", corev1.ConditionTrue) - - tkrs = []runv1alpha3.TanzuKubernetesRelease{tkr1, tkr2} - clusterClient.ListResourcesCalls(func(tkrl interface{}, option ...crtclient.ListOption) error { - tkrList := tkrl.(*runv1alpha3.TanzuKubernetesReleaseList) - tkrList.Items = append(tkrList.Items, tkrs...) - return nil - }) - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(stdOutput).To(ContainSubstring("v1.17.18---vmware.1-tkg.1")) - Expect(stdOutput).ToNot(ContainSubstring("v1.17.17---vmware.1-tkg.2")) - }) - }) - Context("When the TKRs are deactivated", func() { - BeforeEach(func() { - tkrName = tkr1_17 - tkr1 := getFakeTKR("v1.17.17---vmware.1-tkg.2", "v1.17.17+vmware.1", corev1.ConditionFalse) - tkr2 := getFakeTKR("v1.17.18---vmware.1-tkg.1", "v1.17.18+vmware.1", corev1.ConditionTrue) - tkr1.Labels[runv1alpha3.LabelDeactivated] = "" - tkr2.Labels[runv1alpha3.LabelDeactivated] = "" - tkrs = []runv1alpha3.TanzuKubernetesRelease{tkr1, tkr2} - clusterClient.ListResourcesCalls(func(tkrl interface{}, option ...crtclient.ListOption) error { - tkrList := tkrl.(*runv1alpha3.TanzuKubernetesReleaseList) - tkrList.Items = append(tkrList.Items, tkrs...) - return nil - }) - }) - It("should not return error and the output should not show any TKR", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(stdOutput).ToNot(ContainSubstring("v1.17.18---vmware.1-tkg.1")) - Expect(stdOutput).ToNot(ContainSubstring("v1.17.17---vmware.1-tkg.2")) - }) - }) - -}) - -func getFakeTKR(tkrName, k8sversion string, compatibleStatus corev1.ConditionStatus) runv1alpha3.TanzuKubernetesRelease { - tkr := runv1alpha3.TanzuKubernetesRelease{} - tkr.Name = tkrName - tkr.Labels = make(map[string]string) - tkr.Spec.Version = strings.ReplaceAll(tkrName, "---", "+") - tkr.Spec.Kubernetes.Version = k8sversion - tkr.Status.Conditions = []clusterv1.Condition{ - { - Type: runv1alpha3.ConditionCompatible, - Status: compatibleStatus, - }, - } - return tkr -} diff --git a/cmd/cli/plugin/tkr/v1alpha3/os.go b/cmd/cli/plugin/tkr/v1alpha3/os.go deleted file mode 100644 index f486ba7301..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha3/os.go +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - "fmt" - "time" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -var OsCmd = &cobra.Command{ - Use: "os", - Short: "Get the OS information for a Tanzu Kubernetes Release", - Long: `Get the OS information for a Tanzu Kubernetes Release`, -} - -type getOSOptions struct { - region string -} - -var goo = &getOSOptions{} - -var getOSCmd = &cobra.Command{ - Use: "get TKR_NAME", - Short: "Get the OSes that are available for a Tanzu Kubernetes Release", - Long: `Get the OSes that are available for a Tanzu Kubernetes Release`, - Args: cobra.ExactArgs(1), - RunE: getOS, -} -var awsOsImageRefRegionKey = "region" - -func init() { - getOSCmd.Flags().StringVarP(&goo.region, "region", "", "", "The AWS region where AMIs are available") - getOSCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format (yaml|json|table)") - OsCmd.AddCommand(getOSCmd) -} - -func getOS(cmd *cobra.Command, args []string) error { - clusterClient, err := getClusterClient() - if err != nil { - return err - } - - tkrName := args[0] - osInfoMap, err := osInfoByTKR(clusterClient, tkrName, goo) - if err != nil { - return nil - } - t := component.NewOutputWriter(cmd.OutOrStdout(), outputFormat, "NAME", "VERSION", "ARCH") - for _, os := range osInfoMap { - t.AddRow(os.Name, os.Version, os.Arch) - } - t.Render() - return nil -} - -func osInfoByTKR(clusterClient clusterclient.Client, tkrName string, options *getOSOptions) (map[string]runv1alpha3.OSInfo, error) { - osImages, err := osImagesByTKR(clusterClient, tkrName) - if err != nil { - return nil, err - } - resultOSImages, err := filterOSImagesWithInfraSpecificOptions(clusterClient, options, osImages) - if err != nil { - return nil, err - } - return osInfoOfImages(resultOSImages), nil -} - -type stringSet map[string]struct{} - -func (set stringSet) Add(ss ...string) stringSet { - for _, s := range ss { - set[s] = struct{}{} - } - return set -} - -func (set stringSet) Has(s string) bool { - _, exists := set[s] - return exists -} - -func osImagesByTKR(clusterClient clusterclient.Client, tkrName string) ([]runv1alpha3.OSImage, error) { - osImages, err := getOSImages(clusterClient) - if err != nil { - return nil, err - } - osImageNamesInTKR, err := getOSImageNamesInTKR(clusterClient, tkrName) - if err != nil { - return nil, err - } - candidates := stringSet{}.Add(osImageNamesInTKR...) - result := filterOsImages(osImages, func(image *runv1alpha3.OSImage) bool { - return candidates.Has(image.Name) - }) - return result, nil -} - -func osInfoOfImages(osImages []runv1alpha3.OSImage) map[string]runv1alpha3.OSInfo { - results := map[string]runv1alpha3.OSInfo{} - for i := range osImages { - osInfo := osImages[i].Spec.OS - results[OsInfoString(osInfo)] = osInfo - } - return results -} -func filterOSImagesWithInfraSpecificOptions(clusterClient clusterclient.Client, - options *getOSOptions, osImages []runv1alpha3.OSImage) ([]runv1alpha3.OSImage, error) { - - infra, err := clusterClient.GetClusterInfrastructure() - if err != nil { - return nil, errors.Wrap(err, "failed to get current management cluster infrastructure") - } - if infra == constants.InfrastructureRefAWS && options.region != "" { - osImages = filterOsImages(osImages, func(osImage *runv1alpha3.OSImage) bool { - if regionName, exists := osImage.Spec.Image.Ref[awsOsImageRefRegionKey]; exists && regionName == options.region { - return true - } - return false - }) - } - return osImages, nil -} -func getOSImages(clusterClient clusterclient.Client) ([]runv1alpha3.OSImage, error) { - var osImageList runv1alpha3.OSImageList - err := clusterClient.ListResources(&osImageList) - if err != nil { - return nil, err - } - var osImages []runv1alpha3.OSImage - for i := range osImageList.Items { - osImages = append(osImages, osImageList.Items[i]) - } - return osImages, nil -} - -func getOSImageNamesInTKR(clusterClient clusterclient.Client, tkrName string) ([]string, error) { - var tkr runv1alpha3.TanzuKubernetesRelease - err := clusterClient.GetResource(&tkr, tkrName, "", nil, nil) - if err != nil { - return nil, errors.Wrap(err, "failed to get TKR ") - } - - osImageNamesInTKR := make([]string, len(tkr.Spec.OSImages)) - for i := range tkr.Spec.OSImages { - osImageNamesInTKR[i] = tkr.Spec.OSImages[i].Name - } - return osImageNamesInTKR, nil -} - -type osImagePredicate func(osImage *runv1alpha3.OSImage) bool - -func filterOsImages(osImages []runv1alpha3.OSImage, p osImagePredicate) []runv1alpha3.OSImage { - result := make([]runv1alpha3.OSImage, 0, len(osImages)) - for i := range osImages { - if p(&osImages[i]) { - result = append(result, osImages[i]) - } - } - return result -} - -func OsInfoString(os runv1alpha3.OSInfo) string { - return fmt.Sprintf("%s-%s-%s", os.Name, os.Version, os.Arch) -} - -func getClusterClient() (clusterclient.Client, error) { - server, err := config.GetCurrentServer() - if err != nil { - return nil, err - } - - if server.IsGlobal() { - return nil, errors.New("getting TanzuKubernetesRelease with a global server is not implemented yet") - } - - clusterClientOptions := clusterclient.Options{GetClientInterval: 2 * time.Second, GetClientTimeout: 5 * time.Second} - clusterClient, err := clusterclient.NewClient(server.ManagementClusterOpts.Path, server.ManagementClusterOpts.Context, clusterClientOptions) - if err != nil { - return nil, err - } - return clusterClient, nil -} diff --git a/cmd/cli/plugin/tkr/v1alpha3/os_test.go b/cmd/cli/plugin/tkr/v1alpha3/os_test.go deleted file mode 100644 index 204f606472..0000000000 --- a/cmd/cli/plugin/tkr/v1alpha3/os_test.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha3 - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - "sigs.k8s.io/controller-runtime/pkg/client" - - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkr/resolver/data" - "github.com/vmware-tanzu/tanzu-framework/tkr/util/testdata" -) - -const ( - k8s1_20_1 = "v1.20.1+vmware.1" - k8s1_20_2 = "v1.20.2+vmware.1" - k8s1_21_1 = "v1.21.1+vmware.1" - k8s1_21_3 = "v1.21.3+vmware.1" - k8s1_22_0 = "v1.22.0+vmware.1" -) - -var k8sVersions = []string{k8s1_20_1, k8s1_20_2, k8s1_21_1, k8s1_21_3, k8s1_22_0} - -var _ = Describe("os get", func() { - var ( - tkrName string - err error - clusterClient *fakes.ClusterClient - tkr *runv1alpha3.TanzuKubernetesRelease - osImages data.OSImages - tkrs data.TKRs - cmdOptions *getOSOptions - gotOSInfoMap map[string]runv1alpha3.OSInfo - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - tkrName = "" - cmdOptions = &getOSOptions{} - osImages = testdata.GenOSImages(k8sVersions, 3) - tkrs = testdata.GenTKRs(2, testdata.SortOSImagesByK8sVersion(osImages)) - tkr = testdata.ChooseTKR(tkrs) - }) - - JustBeforeEach(func() { - gotOSInfoMap, err = osInfoByTKR(clusterClient, tkrName, cmdOptions) - }) - - Context("When the get OSImages return error", func() { - BeforeEach(func() { - clusterClient.ListResourcesReturns(errors.New("fake get OSImages error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake get OSImages error")) - Expect(gotOSInfoMap).To(BeNil()) - }) - }) - Context("When the get TKR return error", func() { - BeforeEach(func() { - clusterClient.ListResourcesCalls(func(o interface{}, option ...client.ListOption) error { - imgl := o.(*runv1alpha3.OSImageList) - imgl.Items = append(imgl.Items, getOSImagesList(osImages)...) - return nil - }) - clusterClient.GetResourceReturns(errors.New("fake get TKR error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake get TKR error")) - Expect(gotOSInfoMap).To(BeNil()) - }) - }) - Context("When the OSImages and TKR are available", func() { - BeforeEach(func() { - clusterClient.ListResourcesCalls(func(o interface{}, option ...client.ListOption) error { - osImagelist := o.(*runv1alpha3.OSImageList) - osImagelist.Items = append(osImagelist.Items, getOSImagesList(osImages)...) - return nil - }) - clusterClient.GetResourceCalls(func(o interface{}, tkrName, ns string, pv clusterclient.PostVerifyrFunc, poll *clusterclient.PollOptions) error { - *o.(*runv1alpha3.TanzuKubernetesRelease) = *tkr - return nil - }) - - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotOSInfoMap).ToNot(BeNil()) - Expect(len(gotOSInfoMap)).ToNot(BeZero()) - Expect(validateOSInfoResults(gotOSInfoMap, tkr, osImages, "")).To(BeNil()) - }) - }) - Context("When the OSImages and TKR are available and get cluster infrastructure returns error", func() { - BeforeEach(func() { - clusterClient.ListResourcesCalls(func(o interface{}, option ...client.ListOption) error { - osImagelist := o.(*runv1alpha3.OSImageList) - osImagelist.Items = append(osImagelist.Items, getOSImagesList(osImages)...) - return nil - }) - clusterClient.GetResourceCalls(func(o interface{}, tkrName, ns string, pv clusterclient.PostVerifyrFunc, poll *clusterclient.PollOptions) error { - *o.(*runv1alpha3.TanzuKubernetesRelease) = *tkr - return nil - }) - clusterClient.GetClusterInfrastructureReturns("", errors.New("fake getclusterInfrastructure error")) - - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake getclusterInfrastructure error")) - Expect(gotOSInfoMap).To(BeNil()) - }) - }) - Context("When user provides region and the OSImages and TKR are available and get cluster infrastructure returns success", func() { - BeforeEach(func() { - clusterClient.ListResourcesCalls(func(o interface{}, option ...client.ListOption) error { - osImagelist := o.(*runv1alpha3.OSImageList) - osImagelist.Items = append(osImagelist.Items, getOSImagesList(osImages)...) - return nil - }) - clusterClient.GetResourceCalls(func(o interface{}, tkrName, ns string, pv clusterclient.PostVerifyrFunc, poll *clusterclient.PollOptions) error { - *o.(*runv1alpha3.TanzuKubernetesRelease) = *tkr - return nil - }) - cmdOptions = &getOSOptions{region: chooseRegionFromTKR(tkr, osImages)} - clusterClient.GetClusterInfrastructureReturns(constants.InfrastructureRefAWS, nil) - - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotOSInfoMap).ToNot(BeNil()) - Expect(validateOSInfoResults(gotOSInfoMap, tkr, osImages, cmdOptions.region)).To(BeNil()) - }) - }) -}) - -func getOSImagesList(osImages data.OSImages) []runv1alpha3.OSImage { - var result []runv1alpha3.OSImage - for _, image := range osImages { - result = append(result, *image) - } - return result -} - -func chooseRegionFromTKR(tkr *runv1alpha3.TanzuKubernetesRelease, osImages data.OSImages) string { - osImageName := tkr.Spec.OSImages[0].Name - return osImages[osImageName].Spec.Image.Ref["region"].(string) -} - -func validateOSInfoResults(gotOSInfoMap map[string]runv1alpha3.OSInfo, - tkr *runv1alpha3.TanzuKubernetesRelease, osImages data.OSImages, region string) error { - - osImageNamesInTKR := []string{} - for _, o := range tkr.Spec.OSImages { - osImageNamesInTKR = append(osImageNamesInTKR, o.Name) - } - for _, name := range osImageNamesInTKR { - osImage, exists := osImages[name] - if !exists { - return errors.Errorf("unable to find the TKR's osImage '%s' in the given osImages", name) - } - if region != "" && osImage.Spec.Image.Ref["region"] != region { - continue - } - osInfo := osImage.Spec.OS - osInfoInString := OsInfoString(osInfo) - oi, exists := gotOSInfoMap[osInfoInString] - if !exists { - return errors.Errorf("unable to find the osInfo of OsImage '%s'", name) - } - if oi != osInfo { - return errors.Errorf("osInfo of OsImage '%s' doesn't match with osInfo returned ", name) - } - } - - return nil -} diff --git a/cmd/cli/tkg/main.go b/cmd/cli/tkg/main.go deleted file mode 100644 index 594094c1e8..0000000000 --- a/cmd/cli/tkg/main.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// This file allows building tkg-cli -// Note: This is added as some tests still relies on tkg cli. -// This will be removed once that dependency is removed -package main - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/cmd" -) - -func main() { - cmd.Execute() -} diff --git a/cmd/cli/plugin-admin/codegen/README.md b/cmd/plugin/codegen/README.md similarity index 100% rename from cmd/cli/plugin-admin/codegen/README.md rename to cmd/plugin/codegen/README.md diff --git a/cmd/cli/plugin-admin/codegen/generate.go b/cmd/plugin/codegen/generate.go similarity index 97% rename from cmd/cli/plugin-admin/codegen/generate.go rename to cmd/plugin/codegen/generate.go index a8365ecf73..e332af3522 100644 --- a/cmd/cli/plugin-admin/codegen/generate.go +++ b/cmd/plugin/codegen/generate.go @@ -10,7 +10,7 @@ import ( "sigs.k8s.io/controller-tools/pkg/genall" "sigs.k8s.io/controller-tools/pkg/markers" - "github.com/vmware-tanzu/tanzu-framework/codegen/plugin/generators/feature" + "github.com/vmware-tanzu/tanzu-framework/cmd/plugin/codegen/generators/feature" ) var ( diff --git a/cmd/cli/plugin-admin/codegen/generators/feature/doc.go b/cmd/plugin/codegen/generators/feature/doc.go similarity index 100% rename from cmd/cli/plugin-admin/codegen/generators/feature/doc.go rename to cmd/plugin/codegen/generators/feature/doc.go diff --git a/cmd/cli/plugin-admin/codegen/generators/feature/fakeData/bar.yaml b/cmd/plugin/codegen/generators/feature/fakeData/bar.yaml similarity index 100% rename from cmd/cli/plugin-admin/codegen/generators/feature/fakeData/bar.yaml rename to cmd/plugin/codegen/generators/feature/fakeData/bar.yaml diff --git a/cmd/cli/plugin-admin/codegen/generators/feature/fakeData/baz.yaml b/cmd/plugin/codegen/generators/feature/fakeData/baz.yaml similarity index 100% rename from cmd/cli/plugin-admin/codegen/generators/feature/fakeData/baz.yaml rename to cmd/plugin/codegen/generators/feature/fakeData/baz.yaml diff --git a/cmd/cli/plugin-admin/codegen/generators/feature/fakeData/cronjob_types.go b/cmd/plugin/codegen/generators/feature/fakeData/cronjob_types.go similarity index 100% rename from cmd/cli/plugin-admin/codegen/generators/feature/fakeData/cronjob_types.go rename to cmd/plugin/codegen/generators/feature/fakeData/cronjob_types.go diff --git a/cmd/cli/plugin-admin/codegen/generators/feature/fakeData/doc.go b/cmd/plugin/codegen/generators/feature/fakeData/doc.go similarity index 100% rename from cmd/cli/plugin-admin/codegen/generators/feature/fakeData/doc.go rename to cmd/plugin/codegen/generators/feature/fakeData/doc.go diff --git a/cmd/cli/plugin-admin/codegen/generators/feature/fakeData/foo.yaml b/cmd/plugin/codegen/generators/feature/fakeData/foo.yaml similarity index 100% rename from cmd/cli/plugin-admin/codegen/generators/feature/fakeData/foo.yaml rename to cmd/plugin/codegen/generators/feature/fakeData/foo.yaml diff --git a/cmd/cli/plugin-admin/codegen/generators/feature/fakeData/memcached_types.go b/cmd/plugin/codegen/generators/feature/fakeData/memcached_types.go similarity index 100% rename from cmd/cli/plugin-admin/codegen/generators/feature/fakeData/memcached_types.go rename to cmd/plugin/codegen/generators/feature/fakeData/memcached_types.go diff --git a/cmd/cli/plugin-admin/codegen/generators/feature/fakeData/mykind_types.go b/cmd/plugin/codegen/generators/feature/fakeData/mykind_types.go similarity index 100% rename from cmd/cli/plugin-admin/codegen/generators/feature/fakeData/mykind_types.go rename to cmd/plugin/codegen/generators/feature/fakeData/mykind_types.go diff --git a/cmd/cli/plugin-admin/codegen/generators/feature/feature_suite_test.go b/cmd/plugin/codegen/generators/feature/feature_suite_test.go similarity index 100% rename from cmd/cli/plugin-admin/codegen/generators/feature/feature_suite_test.go rename to cmd/plugin/codegen/generators/feature/feature_suite_test.go diff --git a/cmd/cli/plugin-admin/codegen/generators/feature/gen.go b/cmd/plugin/codegen/generators/feature/gen.go similarity index 100% rename from cmd/cli/plugin-admin/codegen/generators/feature/gen.go rename to cmd/plugin/codegen/generators/feature/gen.go diff --git a/cmd/cli/plugin-admin/codegen/generators/feature/gen_integration_test.go b/cmd/plugin/codegen/generators/feature/gen_integration_test.go similarity index 100% rename from cmd/cli/plugin-admin/codegen/generators/feature/gen_integration_test.go rename to cmd/plugin/codegen/generators/feature/gen_integration_test.go diff --git a/cmd/cli/plugin-admin/codegen/go.mod b/cmd/plugin/codegen/go.mod similarity index 50% rename from cmd/cli/plugin-admin/codegen/go.mod rename to cmd/plugin/codegen/go.mod index 96815bbf48..016494c7ac 100644 --- a/cmd/cli/plugin-admin/codegen/go.mod +++ b/cmd/plugin/codegen/go.mod @@ -1,61 +1,56 @@ -module github.com/vmware-tanzu/tanzu-framework/codegen/plugin +module github.com/vmware-tanzu/tanzu-framework/cmd/plugin/codegen go 1.18 -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/core => ../../../../apis/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../../../cli/runtime -) +replace github.com/vmware-tanzu/tanzu-framework/apis/core => ./../../../apis/core require ( github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.20.2 - github.com/spf13/cobra v1.5.0 + github.com/onsi/gomega v1.27.2 + github.com/spf13/cobra v1.6.1 + github.com/vmware-tanzu/tanzu-cli v0.89.1 github.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - k8s.io/apimachinery v0.24.2 + github.com/vmware-tanzu/tanzu-plugin-runtime v0.89.0 + k8s.io/apimachinery v0.25.4 sigs.k8s.io/controller-tools v0.7.0 sigs.k8s.io/yaml v1.3.0 ) require ( - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/AlecAivazis/survey/v2 v2.3.6 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fatih/color v1.12.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/evanphx/json-patch/v5 v5.6.0 // indirect + github.com/fatih/color v1.13.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-logr/logr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/swag v0.21.1 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.1 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.8 // indirect + github.com/google/gnostic v0.6.9 // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.3.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/imdario/mergo v0.3.13 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.8 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -63,18 +58,18 @@ require ( github.com/nxadm/tail v1.4.8 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.12.2 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect + github.com/rivo/uniseg v0.2.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.8.0 // indirect golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect + golang.org/x/oauth2 v0.5.0 // indirect golang.org/x/sys v0.6.0 // indirect golang.org/x/term v0.6.0 // indirect golang.org/x/text v0.8.0 // indirect @@ -87,14 +82,14 @@ require ( gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.24.2 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/client-go v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.70.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/controller-runtime v0.12.3 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect + k8s.io/api v0.25.4 // indirect + k8s.io/apiextensions-apiserver v0.25.2 // indirect + k8s.io/client-go v0.25.4 // indirect + k8s.io/component-base v0.25.2 // indirect + k8s.io/klog/v2 v2.80.1 // indirect + k8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190 // indirect + k8s.io/utils v0.0.0-20230115233650-391b47cb4029 // indirect + sigs.k8s.io/controller-runtime v0.13.1 // indirect + sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect ) diff --git a/cmd/cli/plugin-admin/codegen/go.sum b/cmd/plugin/codegen/go.sum similarity index 90% rename from cmd/cli/plugin-admin/codegen/go.sum rename to cmd/plugin/codegen/go.sum index 96e8e3813c..0f3259560b 100644 --- a/cmd/cli/plugin-admin/codegen/go.sum +++ b/cmd/plugin/codegen/go.sum @@ -37,8 +37,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= +github.com/AlecAivazis/survey/v2 v2.3.6 h1:NvTuVHISgTHEHeBFqt6BHOe4Ny/NwGZr7w+F8S9ziyw= +github.com/AlecAivazis/survey/v2 v2.3.6/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -55,9 +55,7 @@ github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMo github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -65,16 +63,13 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -83,16 +78,17 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -112,7 +108,6 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -141,21 +136,22 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -165,29 +161,32 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 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 v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= +github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -197,7 +196,6 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -233,10 +231,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= +github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= 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= @@ -249,8 +245,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -269,6 +265,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -279,7 +276,6 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -313,10 +309,11 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= @@ -345,6 +342,8 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 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= @@ -361,19 +360,24 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +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.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= +github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -388,7 +392,6 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= 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= @@ -402,7 +405,6 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -417,13 +419,13 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= +github.com/onsi/ginkgo/v2 v2.8.4 h1:gf5mIQ8cLFieruNLAdgijHF1PYfLphKm2dxxcUtcqK0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= -github.com/onsi/gomega v1.20.2 h1:8uQq0zMgLEfa0vRrrBgaJF2gyW9Da9BmfGV+OyUzfkY= -github.com/onsi/gomega v1.20.2/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.27.2 h1:SKU0CXeKE/WVgIV1T61kSa3+IRE8Ekrv9rdXDwwTqnY= +github.com/onsi/gomega v1.27.2/go.mod h1:5mR3phAHpkAVIDkHEUBY6HGVsU+cpcEscrGPB4oPlZI= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -444,28 +446,33 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -492,9 +499,8 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -506,32 +512,40 @@ github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +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.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/vmware-tanzu/tanzu-cli v0.89.1 h1:wKnq9EWzGxhiyetqnsPS7r03ROocUbyszNvUca8an6s= +github.com/vmware-tanzu/tanzu-cli v0.89.1/go.mod h1:+/ZPsTAQ1z5po0hO1SMZjfda1KHRinSlz6yu2v2Mt8Y= +github.com/vmware-tanzu/tanzu-plugin-runtime v0.89.0 h1:DsQgQ+Qa6DiuwZihprPZ62oe7H8eFNh4iAvUjhMzzQk= +github.com/vmware-tanzu/tanzu-plugin-runtime v0.89.0/go.mod h1:y70TLdev7MX8K6CkAA7h92qVUDyjbX8y9/J5q4UmhRs= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= @@ -555,17 +569,18 @@ go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4 go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= +go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -576,8 +591,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -613,7 +626,6 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -659,14 +671,12 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -682,9 +692,9 @@ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= 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= @@ -755,20 +765,17 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -794,7 +801,6 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -855,7 +861,6 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -927,7 +932,6 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -938,7 +942,6 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -981,8 +984,9 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= @@ -1008,6 +1012,7 @@ 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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/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= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= @@ -1020,56 +1025,47 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.22.2/go.mod h1:y3ydYpLJAaDI+BbSe2xmGcqxiWHmWjkEeIbiwHvnPR8= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= +k8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs= +k8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ= k8s.io/apiextensions-apiserver v0.22.2/go.mod h1:2E0Ve/isxNl7tWLSUDgi6+cmwHi5fQRdwGVCxbC+KFA= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= +k8s.io/apiextensions-apiserver v0.25.2 h1:8uOQX17RE7XL02ngtnh3TgifY7EhekpK+/piwzQNnBo= +k8s.io/apiextensions-apiserver v0.25.2/go.mod h1:iRwwRDlWPfaHhuBfQ0WMa5skdQfrE18QXJaJvIDLvE8= k8s.io/apimachinery v0.22.2/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc= +k8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= k8s.io/apiserver v0.22.2/go.mod h1:vrpMmbyjWrgdyOvZTSpsusQq5iigKNWv9o9KlDAbBHI= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= k8s.io/client-go v0.22.2/go.mod h1:sAlhrkVDf50ZHx6z4K0S40wISNTarf1r800F+RlCF6U= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= +k8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8= +k8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw= k8s.io/code-generator v0.22.2/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= k8s.io/component-base v0.22.2/go.mod h1:5Br2QhI9OTe79p+TzPe9JKNQYvEKbq9rTJDWllunGug= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= +k8s.io/component-base v0.25.2 h1:Nve/ZyHLUBHz1rqwkjXm/Re6IniNa5k7KgzxZpTfSQY= +k8s.io/component-base v0.25.2/go.mod h1:90W21YMr+Yjg7MX+DohmZLzjsBtaxQDDwaX4YxDkl60= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190 h1:5MAqxJfshQZ9NdSNGAn7CJ9vuBxAiTaqn3B4pfqD+PE= +k8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190/go.mod h1:/BYxry62FuDzmI+i9B+X2pqfySRmSOW2ARmj5Zbqhj0= k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20230115233650-391b47cb4029 h1:L8zDtT4jrxj+TaQYD0k8KNlr556WaVQylDXswKmX+dE= +k8s.io/utils v0.0.0-20230115233650-391b47cb4029/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= +sigs.k8s.io/controller-runtime v0.13.1 h1:tUsRCSJVM1QQOOeViGeX3GMT3dQF1eePPw6sEE3xSlg= +sigs.k8s.io/controller-runtime v0.13.1/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= sigs.k8s.io/controller-tools v0.7.0 h1:iZIz1vEcavyEfxjcTLs1WH/MPf4vhPCtTKhoHqV8/G0= sigs.k8s.io/controller-tools v0.7.0/go.mod h1:bpBAo0VcSDDLuWt47evLhMLPxRPxMDInTEH/YbdeMK0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= 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/cmd/cli/plugin-admin/codegen/main.go b/cmd/plugin/codegen/main.go similarity index 60% rename from cmd/cli/plugin-admin/codegen/main.go rename to cmd/plugin/codegen/main.go index aa4efc0643..b9cca6ce86 100644 --- a/cmd/cli/plugin-admin/codegen/main.go +++ b/cmd/plugin/codegen/main.go @@ -6,15 +6,16 @@ package main import ( "github.com/aunum/log" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" + "github.com/vmware-tanzu/tanzu-cli/pkg/buildinfo" + plugintypes "github.com/vmware-tanzu/tanzu-plugin-runtime/config/types" + "github.com/vmware-tanzu/tanzu-plugin-runtime/plugin" ) -var descriptor = cliapi.PluginDescriptor{ +var descriptor = plugin.PluginDescriptor{ Name: "codegen", Description: "Tanzu code generation tool", - Group: cliapi.AdminCmdGroup, + Target: plugintypes.TargetGlobal, + Group: plugin.AdminCmdGroup, Version: buildinfo.Version, BuildSHA: buildinfo.SHA, } diff --git a/cmd/cli/plugin-admin/codegen/test/fakeData/mykind_types.go b/cmd/plugin/codegen/test/fakeData/mykind_types.go similarity index 100% rename from cmd/cli/plugin-admin/codegen/test/fakeData/mykind_types.go rename to cmd/plugin/codegen/test/fakeData/mykind_types.go diff --git a/cmd/cli/plugin-admin/codegen/test/main.go b/cmd/plugin/codegen/test/main.go similarity index 87% rename from cmd/cli/plugin-admin/codegen/test/main.go rename to cmd/plugin/codegen/test/main.go index 39476a5338..0c81ec6c21 100644 --- a/cmd/cli/plugin-admin/codegen/test/main.go +++ b/cmd/plugin/codegen/test/main.go @@ -13,8 +13,8 @@ import ( "sigs.k8s.io/yaml" corev1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" + "github.com/vmware-tanzu/tanzu-plugin-runtime/plugin" + clitest "github.com/vmware-tanzu/tanzu-plugin-runtime/test/framework" ) var descriptor = clitest.NewTestFor("codegen") @@ -38,7 +38,7 @@ func initialize() error { if err != nil { return err } - featureGenerationCommand := fmt.Sprintf("codegen generate paths=./cmd/cli/plugin-admin/codegen/test/fakeData/... feature output:feature:artifacts:config=%s", tempDir) + featureGenerationCommand := fmt.Sprintf("codegen generate paths=./cmd/cli/plugin/codegen/test/fakeData/... feature output:feature:artifacts:config=%s", tempDir) featureGenerationTest = clitest.NewTest("feature generation", featureGenerationCommand, func(t *clitest.Test) error { defer os.Remove(tempDir) if err := t.Exec(); err != nil { diff --git a/cmd/cli/plugin/feature/README.md b/cmd/plugin/feature/README.md similarity index 100% rename from cmd/cli/plugin/feature/README.md rename to cmd/plugin/feature/README.md diff --git a/cmd/cli/plugin/feature/activate.go b/cmd/plugin/feature/activate.go similarity index 100% rename from cmd/cli/plugin/feature/activate.go rename to cmd/plugin/feature/activate.go diff --git a/cmd/cli/plugin/feature/activate_test.go b/cmd/plugin/feature/activate_test.go similarity index 100% rename from cmd/cli/plugin/feature/activate_test.go rename to cmd/plugin/feature/activate_test.go diff --git a/cmd/cli/plugin/feature/deactivate.go b/cmd/plugin/feature/deactivate.go similarity index 100% rename from cmd/cli/plugin/feature/deactivate.go rename to cmd/plugin/feature/deactivate.go diff --git a/cmd/cli/plugin/feature/deactivate_test.go b/cmd/plugin/feature/deactivate_test.go similarity index 100% rename from cmd/cli/plugin/feature/deactivate_test.go rename to cmd/plugin/feature/deactivate_test.go diff --git a/cmd/cli/plugin/feature/go.mod b/cmd/plugin/feature/go.mod similarity index 64% rename from cmd/cli/plugin/feature/go.mod rename to cmd/plugin/feature/go.mod index 8ba1545b14..e19ac44698 100644 --- a/cmd/cli/plugin/feature/go.mod +++ b/cmd/plugin/feature/go.mod @@ -1,42 +1,44 @@ -module github.com/vmware-tanzu/tanzu-framework/cmd/cli/plugin/feature +module github.com/vmware-tanzu/tanzu-framework/cmd/plugin/feature go 1.18 replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../../../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/config => ../../../../apis/config - github.com/vmware-tanzu/tanzu-framework/apis/core => ../../../../apis/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../../../cli/runtime - github.com/vmware-tanzu/tanzu-framework/featuregates/client => ../../../../featuregates/client - github.com/vmware-tanzu/tanzu-framework/util => ../../../../util + github.com/vmware-tanzu/tanzu-framework/apis/config => ./../../../apis/config + github.com/vmware-tanzu/tanzu-framework/apis/core => ./../../../apis/core + github.com/vmware-tanzu/tanzu-framework/featuregates/client => ./../../../featuregates/client + github.com/vmware-tanzu/tanzu-framework/util => ./../../../util ) require ( github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/spf13/cobra v1.5.0 + github.com/spf13/cobra v1.6.1 + github.com/vmware-tanzu/tanzu-cli v0.89.1 github.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 github.com/vmware-tanzu/tanzu-framework/featuregates/client v0.0.0-00010101000000-000000000000 - k8s.io/client-go v0.24.4 - sigs.k8s.io/controller-runtime v0.12.3 + github.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0 + k8s.io/client-go v0.25.4 + sigs.k8s.io/controller-runtime v0.13.1 ) require ( - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect + github.com/AlecAivazis/survey/v2 v2.3.6 // indirect + github.com/Masterminds/goutils v1.1.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect + github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-logr/logr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.1 // indirect github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-task/slim-sprig v2.20.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect @@ -44,18 +46,19 @@ require ( github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.3.0 // indirect + github.com/huandu/xstrings v1.4.0 // indirect github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.16 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -69,12 +72,11 @@ require ( github.com/rivo/uniseg v0.2.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.6.0 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.8.0 // indirect golang.org/x/mod v0.8.0 // indirect golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect + golang.org/x/oauth2 v0.5.0 // indirect golang.org/x/sys v0.6.0 // indirect golang.org/x/term v0.6.0 // indirect golang.org/x/text v0.8.0 // indirect @@ -85,13 +87,13 @@ require ( 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.24.4 // indirect - k8s.io/apiextensions-apiserver v0.24.4 // indirect - k8s.io/apimachinery v0.24.4 // indirect - k8s.io/component-base v0.24.4 // indirect - k8s.io/klog/v2 v2.80.0 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 // indirect + k8s.io/api v0.25.4 // indirect + k8s.io/apiextensions-apiserver v0.25.4 // indirect + k8s.io/apimachinery v0.25.4 // indirect + k8s.io/component-base v0.25.4 // indirect + k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 // indirect + k8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190 // indirect + k8s.io/utils v0.0.0-20230115233650-391b47cb4029 // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/cmd/cli/plugin/isolated-cluster/go.sum b/cmd/plugin/feature/go.sum similarity index 63% rename from cmd/cli/plugin/isolated-cluster/go.sum rename to cmd/plugin/feature/go.sum index 497e4f507c..b0c7db92e5 100644 --- a/cmd/cli/plugin/isolated-cluster/go.sum +++ b/cmd/plugin/feature/go.sum @@ -19,10 +19,6 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -35,124 +31,37 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible h1:bmmC38SlE8/E81nNADlgmVGurPWMHDX2YNXVQMrBpEE= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.24/go.mod h1:G6kyRlFnTuSbEYkQGawPfsCswgme4iYf6rfSKUDzbCc= -github.com/Azure/go-autorest/autorest v0.11.28 h1:ndAExarwr5Y+GaHE6VCaY1kyS/HwwGGyuimVhWsHOEM= -github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.21 h1:jjQnVFXPfekaqb8vIsv2G1lxshoW+oGv4MDlhRtnYZk= -github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.11 h1:P6bYXFoao05z5uhOQzbC3Qd8JqF3jUoocoTeIxkp2cA= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.11/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.5 h1:0W/yGmFdTIT77fvdlGZ0LMISoLHFJ7Tx4U0yeB+uFs4= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.5/go.mod h1:ADQAXrkgm7acgWVUNamOgh8YNrv4p27l3Wc55oVfpzg= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= -github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AlecAivazis/survey/v2 v2.3.6 h1:NvTuVHISgTHEHeBFqt6BHOe4Ny/NwGZr7w+F8S9ziyw= +github.com/AlecAivazis/survey/v2 v2.3.6/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= -github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d h1:0xIrH2lJbraclvJT3pvTf3u2oCAL60cAqiv4qRpz4EI= -github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU= -github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= -github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/aws/aws-sdk-go-v2 v1.7.1/go.mod h1:L5LuPC1ZgDr2xQS7AmIec/Jlc7O/Y1u2KxJyNVab250= -github.com/aws/aws-sdk-go-v2 v1.16.16 h1:M1fj4FE2lB4NzRb9Y0xdWsn2P0+2UHVxwKyOa4YJNjk= -github.com/aws/aws-sdk-go-v2 v1.16.16/go.mod h1:SwiyXi/1zTUZ6KIAmLK5V5ll8SiURNUYOqTerZPaF9k= -github.com/aws/aws-sdk-go-v2/config v1.5.0/go.mod h1:RWlPOAW3E3tbtNAqTwvSW54Of/yP3oiZXMI0xfUdjyA= -github.com/aws/aws-sdk-go-v2/config v1.17.8 h1:b9LGqNnOdg9vR4Q43tBTVWk4J6F+W774MSchvKJsqnE= -github.com/aws/aws-sdk-go-v2/config v1.17.8/go.mod h1:UkCI3kb0sCdvtjiXYiU4Zx5h07BOpgBTtkPu/49r+kA= -github.com/aws/aws-sdk-go-v2/credentials v1.3.1/go.mod h1:r0n73xwsIVagq8RsxmZbGSRQFj9As3je72C2WzUIToc= -github.com/aws/aws-sdk-go-v2/credentials v1.12.21 h1:4tjlyCD0hRGNQivh5dN8hbP30qQhMLBE/FgQR1vHHWM= -github.com/aws/aws-sdk-go-v2/credentials v1.12.21/go.mod h1:O+4XyAt4e+oBAoIwNUYkRg3CVMscaIJdmZBOcPgJ8D8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.3.0/go.mod h1:2LAuqPx1I6jNfaGDucWfA2zqQCYCOMCDHiCOciALyNw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17 h1:r08j4sbZu/RVi+BNxkBJwPMUYY3P8mgSDuKkZ/ZN1lE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17/go.mod h1:yIkQcCDYNsZfXpd5UX2Cy+sWA1jPgIhGTw9cOBzfVnQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23 h1:s4g/wnzMf+qepSNgTvaQQHNxyMLKSawNhKCPNy++2xY= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23/go.mod h1:2DFxAQ9pfIRy0imBCJv+vZ2X6RKxves6fbnEuSry6b4= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17 h1:/K482T5A3623WJgWT8w1yRAFK4RzGzEl7y39yhtn9eA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17/go.mod h1:pRwaTYCJemADaqCbUAxltMoHKata7hmB5PjEXeu0kfg= -github.com/aws/aws-sdk-go-v2/internal/ini v1.1.1/go.mod h1:Zy8smImhTdOETZqfyn01iNOe0CNggVbPjCajyaz6Gvg= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24 h1:wj5Rwc05hvUSvKuOF29IYb9QrCLjU+rHAy/x/o0DK2c= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24/go.mod h1:jULHjqqjDlbyTa7pfM7WICATnOv+iOhjletM3N0Xbu8= -github.com/aws/aws-sdk-go-v2/service/ecr v1.4.1/go.mod h1:FglZcyeiBqcbvyinl+n14aT/EWC7S1MIH+Gan2iizt0= -github.com/aws/aws-sdk-go-v2/service/ecr v1.17.18 h1:uiF/RI+Up8H2xdgT2GWa20YzxiKEalHieqNjm6HC3Xk= -github.com/aws/aws-sdk-go-v2/service/ecr v1.17.18/go.mod h1:DQtDYmexqR+z+B6HBCvY7zK/tuXKv6Zy/IwOXOK3eow= -github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.4.1 h1:zoktIoJ+S7mJpABtSYzcVCFosRK1zehO78Lc86AbOQk= -github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.4.1/go.mod h1:eD5Eo4drVP2FLTw0G+SMIPWNWvQRGGTtIZR2XeAagoA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.1/go.mod h1:zceowr5Z1Nh2WVP8bf/3ikB41IZW59E4yIYbg+pC6mw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17 h1:Jrd/oMh0PKQc6+BowB+pLEwLIgaQF29eYbe7E1Av9Ug= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17/go.mod h1:4nYOrY41Lrbk2170/BGkcJKBhws9Pfn8MG3aGqjjeFI= -github.com/aws/aws-sdk-go-v2/service/sso v1.3.1/go.mod h1:J3A3RGUvuCZjvSuZEcOpHDnzZP/sKbhDWV2T1EOzFIM= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.23 h1:pwvCchFUEnlceKIgPUouBJwK81aCkQ8UDMORfeFtW10= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.23/go.mod h1:/w0eg9IhFGjGyyncHIQrXtU8wvNsTJOP0R6PPj0wf80= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.6 h1:OwhhKc1P9ElfWbMKPIbMMZBV6hzJlL2JKD76wNNVzgQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.6/go.mod h1:csZuQY65DAdFBt1oIjO5hhBR49kQqop4+lcuCjf2arA= -github.com/aws/aws-sdk-go-v2/service/sts v1.6.0/go.mod h1:q7o0j7d7HrJk/vr9uUt3BVRASvcU7gYZB9PUgPiByXg= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.19 h1:9pPi0PsFNAGILFfPCk8Y0iyEBGc6lu6OQ97U7hmdesg= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.19/go.mod h1:h4J3oPZQbxLhzGnk+j9dfYHi5qIOVJ5kczZd658/ydM= -github.com/aws/smithy-go v1.6.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/aws/smithy-go v1.13.3 h1:l7LYxGuzK6/K+NzJ2mC+VvLUbae0sL3bXU//04MkmnA= -github.com/aws/smithy-go v1.13.3/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20220517224237-e6f29200ae04 h1:p2I85zYI9z5/c/3Q0LiO3RtNXcmXHTtJfml/hV16zNg= -github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20220517224237-e6f29200ae04/go.mod h1:Z+bXnIbhKJYSvxNwsNnwde7pDKxuqlEZCbUBoTwAqf0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb/v3 v3.1.0 h1:3uouEsl32RL7gTiQsuaXD4Bzbfl5tGztXGUvXbs4O04= -github.com/cheggaaa/pb/v3 v3.1.0/go.mod h1:YjrevcBqadFDaGQKRdmZxTY42pXEqda48Ea3lt0K/BE= -github.com/chrismellard/docker-credential-acr-env v0.0.0-20220327082430-c57b701bfc08 h1:9Qh4lJ/KMr5iS1zfZ8I97+3MDpiKjl+0lZVUNBhdvRs= -github.com/chrismellard/docker-credential-acr-env v0.0.0-20220327082430-c57b701bfc08/go.mod h1:MAuu1uDJNOS3T3ui0qmKdPUwm59+bO19BbTph2wZafE= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -160,43 +69,15 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk 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/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/containerd/stargz-snapshotter/estargz v0.12.1 h1:+7nYmHJb0tEkcRaAW+MHqoKaJYZmkikupxCqVtmPuY0= -github.com/containerd/stargz-snapshotter/estargz v0.12.1/go.mod h1:12VUuCq3qPq4y8yUW+l5w3+oXV3cx2Po3KSe/SmPGqw= -github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= -github.com/coredns/corefile-migration v1.0.18 h1:zs5PJm/VGZVje1ESRj6ZqyUuVsVfagExkbLU2QKV5mI= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e h1:4AxO89dwbgA957M8DX5AV/KsOmxDyAB1BES0INY+A/0= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= -github.com/cppforlife/go-cli-ui v0.0.0-20220425131040-94f26b16bc14 h1:MjRdR01xh0sfkeS3OOBv+MYkYsrbHuTDc4rfBnVdFaI= -github.com/cppforlife/go-cli-ui v0.0.0-20220425131040-94f26b16bc14/go.mod h1:AlgTssDlstr4mf92TR4DPITLfl5+7wEY4cKStCmeeto= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= 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/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/docker/cli v20.10.20+incompatible h1:lWQbHSHUFs7KraSN2jOJK7zbMS2jNCHI4mt4xUFUVQ4= -github.com/docker/cli v20.10.20+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v20.10.20+incompatible h1:kH9tx6XO+359d+iAkumyKDc5Q1kOwPuAUaeri48nD6E= -github.com/docker/docker v20.10.20+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= -github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 h1:7QPwrLT79GlD5sizHf27aoY2RTvw62mO6x7mxkScNk0= github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= 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= @@ -209,16 +90,14 @@ github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMi github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -232,77 +111,22 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= -github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc= -github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= -github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/errors v0.20.3 h1:rz6kiC84sqNQoqrtulzaL/VERgkoCyB6WdEkc2ujzUc= -github.com/go-openapi/errors v0.20.3/go.mod h1:Z3FlZ4I8jEGxjUK+bugx3on2mIAk4txuAOhlsB1FSgk= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= -github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro= -github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= -github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= -github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/spec v0.20.7 h1:1Rlu/ZrOCCob0n+JKKJAWhNWMPW8bOZRg8FJaY+0SKI= -github.com/go-openapi/spec v0.20.7/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= -github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= -github.com/go-openapi/strfmt v0.21.3 h1:xwhj5X6CjXEZZHMWy1zKJxvW9AfHC9pkyUjLvHtKG7o= -github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/validate v0.22.0 h1:b0QecH6VslW/TxtpKgzpO1SNG7GU2FsaqKdP1E2T50Y= -github.com/go-openapi/validate v0.22.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/go-task/slim-sprig v2.20.0+incompatible h1:4Xh3bDzO29j4TWNOI+24ubc0vbVFMg2PMnXKxK54/CA= +github.com/go-task/slim-sprig v2.20.0+incompatible/go.mod h1:N/mhXZITr/EQAOErEHciKvO1bFei2Lld2Ym6h96pdy0= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -333,10 +157,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/cel-go v0.12.5 h1:DmzaiSgoaqGCjtpPQWl26/gND+yRpim56H1jCVev6d8= github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -346,17 +168,10 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.12.0 h1:nidOEtFYlgPCRqxCKj/4c/js940HVWplCWc5ftdfdUA= -github.com/google/go-containerregistry v0.12.0/go.mod h1:sdIK+oHQO7B93xI8UweYdl887YhuIwg9vz8BSLH3+8k= -github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= 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= @@ -368,9 +183,9 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 h1:Ak8CrdlwwXwAZxzS66vgPt4U8yUZX7JwLvVR58FN5jM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -379,23 +194,16 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= +github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= +github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -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/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= 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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -410,46 +218,30 @@ github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuy github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k14s/imgpkg v0.17.0 h1:l1HqYtjecqx7iYecJUvxQQYdo3WubCahHQ30lh0p9sU= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= 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/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +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.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -457,22 +249,13 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= +github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= 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= @@ -480,37 +263,16 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= 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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= 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 v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.5.0 h1:TRtrvv2vdQqzkwrQ1ke6vtXf7IK34RBUJafIy1wMwls= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= -github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= -github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/onsi/ginkgo/v2 v2.8.4 h1:gf5mIQ8cLFieruNLAdgijHF1PYfLphKm2dxxcUtcqK0= +github.com/onsi/gomega v1.27.2 h1:SKU0CXeKE/WVgIV1T61kSa3+IRE8Ekrv9rdXDwwTqnY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -543,48 +305,25 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 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/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= -github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -593,38 +332,20 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vito/go-interact v1.0.1 h1:O8xi8c93bRUv2Tb/v6HdiuGc+WnWt+AQzF74MOOdlBs= -github.com/vito/go-interact v1.0.1/go.mod h1:HrdHSJXD2yn1MhlTwSIMeFgQ5WftiIorszVGd3S/DAA= -github.com/vmware-tanzu/carvel-imgpkg v0.33.2 h1:w0k/3YRUVyKIRU9593SHoH055P2pJNSiaJ3Iz8Yr4Zs= -github.com/vmware-tanzu/carvel-imgpkg v0.33.2/go.mod h1:TAKw71gyKosIH6vSB8nszLN7AAu5edwix8B5Yt/Q2xk= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 h1:zgWNumjhN+0CCiq1Wo4lVTmO89eOA6HuPXgv1sVhE4k= -github.com/vmware-tanzu/carvel-vendir v0.30.0 h1:JqElRFpSsYJQmI5Hrxl1Fx9wJZ2xeDk+TVnnSrFLFVU= -github.com/vmware/govmomi v0.30.2 h1:zPMmLTtAfBgOVsTgwKOzVVahQIOC4A2oyFQFSsn/0ag= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= +github.com/vmware-tanzu/tanzu-cli v0.89.1 h1:wKnq9EWzGxhiyetqnsPS7r03ROocUbyszNvUca8an6s= +github.com/vmware-tanzu/tanzu-cli v0.89.1/go.mod h1:+/ZPsTAQ1z5po0hO1SMZjfda1KHRinSlz6yu2v2Mt8Y= +github.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0 h1:lUoMXSpa/oH37UJnMY8WFEzjAOQHjcVlwsbxUbEcowg= +github.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0/go.mod h1:y70TLdev7MX8K6CkAA7h92qVUDyjbX8y9/J5q4UmhRs= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= -go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= -go.mongodb.org/mongo-driver v1.10.0 h1:UtV6N5k14upNp4LTduX0QCufG124fSu25Wz9tu94GLg= -go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -638,24 +359,13 @@ go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= -go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= -go4.org/intern v0.0.0-20211027215823-ae77deb06f29 h1:UXLjNohABv4S58tHmeuIZDO6e3mHpW2Dx33gaNt03LE= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -666,8 +376,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20221215174704-0915cd710c24 h1:6w3iSY8IIkp5OQtbYj8NeuKG1jS9d+kYaubXqsoOiQ8= -golang.org/x/exp v0.0.0-20221215174704-0915cd710c24/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -692,7 +400,6 @@ golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/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= @@ -715,18 +422,14 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= @@ -738,44 +441,34 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= +golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= 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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -791,37 +484,29 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/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-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.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-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -845,13 +530,9 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -884,11 +565,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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= @@ -950,7 +628,6 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -985,15 +662,12 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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= @@ -1005,14 +679,11 @@ gopkg.in/yaml.v2 v2.3.0/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.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/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= -gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= -gotest.tools/v3 v3.2.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1020,39 +691,27 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -inet.af/netaddr v0.0.0-20220617031823-097006376321 h1:B4dC8ySKTQXasnjDTMsoCMf1sQG4WsMej0WXaHxunmU= -k8s.io/api v0.25.3 h1:Q1v5UFfYe87vi5H7NU0p4RXC26PPMT8KOpr1TLQbCMQ= -k8s.io/api v0.25.3/go.mod h1:o42gKscFrEVjHdQnyRenACrMtbuJsVdP+WVjqejfzmI= -k8s.io/apiextensions-apiserver v0.25.0 h1:CJ9zlyXAbq0FIW8CD7HHyozCMBpDSiH7EdrSTCZcZFY= -k8s.io/apiextensions-apiserver v0.25.0/go.mod h1:3pAjZiN4zw7R8aZC5gR0y3/vCkGlAjCazcg1me8iB/E= -k8s.io/apimachinery v0.25.3 h1:7o9ium4uyUOM76t6aunP0nZuex7gDf8VGwkR5RcJnQc= -k8s.io/apimachinery v0.25.3/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= -k8s.io/apiserver v0.25.0 h1:8kl2ifbNffD440MyvHtPaIz1mw4mGKVgWqM0nL+oyu4= -k8s.io/client-go v0.25.3 h1:oB4Dyl8d6UbfDHD8Bv8evKylzs3BXzzufLiO27xuPs0= -k8s.io/client-go v0.25.3/go.mod h1:t39LPczAIMwycjcXkVc+CB+PZV69jQuNx4um5ORDjQA= -k8s.io/cluster-bootstrap v0.24.4 h1:ZryK73DHK4dv5yAr5081yO03rrEK2Dz9jUtymqEle9Q= -k8s.io/component-base v0.25.3 h1:UrsxciGdrCY03ULT1h/S/gXFCOPnLhUVwSyx+hM/zq4= -k8s.io/component-base v0.25.3/go.mod h1:WYoS8L+IlTZgU7rhAl5Ctpw0WdMxDfCC5dkxcEFa/TI= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= -k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.25.3 h1:HnWJziEtmsm4JaJiKT33kG0kadx68MXxUE8UEbXnN4U= -k8s.io/kubectl v0.25.3/go.mod h1:glU7PiVj/R6Ud4A9FJdTcJjyzOtCJyc0eO7Mrbh3jlI= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 h1:XmRqFcQlCy/lKRZ39j+RVpokYNroHPqV3mcBRfnhT5o= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs= +k8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ= +k8s.io/apiextensions-apiserver v0.25.4 h1:7hu9pF+xikxQuQZ7/30z/qxIPZc2J1lFElPtr7f+B6U= +k8s.io/apiextensions-apiserver v0.25.4/go.mod h1:bkSGki5YBoZWdn5pWtNIdGvDrrsRWlmnvl9a+tAw5vQ= +k8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc= +k8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= +k8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8= +k8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw= +k8s.io/component-base v0.25.4 h1:n1bjg9Yt+G1C0WnIDJmg2fo6wbEU1UGMRiQSjmj7hNQ= +k8s.io/component-base v0.25.4/go.mod h1:nnZJU8OP13PJEm6/p5V2ztgX2oyteIaAGKGMYb2L2cY= +k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 h1:hWRbsoRWt44OEBnYUd4ceLy4ofBoh+p9vauWp/I5Gdg= +k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190 h1:5MAqxJfshQZ9NdSNGAn7CJ9vuBxAiTaqn3B4pfqD+PE= +k8s.io/kube-openapi v0.0.0-20230118215034-64b6bb138190/go.mod h1:/BYxry62FuDzmI+i9B+X2pqfySRmSOW2ARmj5Zbqhj0= +k8s.io/utils v0.0.0-20230115233650-391b47cb4029 h1:L8zDtT4jrxj+TaQYD0k8KNlr556WaVQylDXswKmX+dE= +k8s.io/utils v0.0.0-20230115233650-391b47cb4029/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2 h1:WjTt0uyUG+FJBodnrSzb1L3mHfkIgtgMnNQQ+NJMuT8= -sigs.k8s.io/cluster-api-provider-azure v1.6.1 h1:GpY9YLiUqovz4gwIEg2PRYOhJ5e/AG7sTHtoxzt6K4w= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 h1:D0bDtSyRIcBmuGFyW65otEh+VIz8SGioaAjYok/cK5Y= -sigs.k8s.io/cluster-api/test v1.2.8 h1:kYziHLSV+KqBoQXg7STGU4ZQpClayqIyw+BTYGx71uE= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= +sigs.k8s.io/controller-runtime v0.13.1 h1:tUsRCSJVM1QQOOeViGeX3GMT3dQF1eePPw6sEE3xSlg= +sigs.k8s.io/controller-runtime v0.13.1/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= diff --git a/cmd/cli/plugin/feature/list.go b/cmd/plugin/feature/list.go similarity index 99% rename from cmd/cli/plugin/feature/list.go rename to cmd/plugin/feature/list.go index c902e91306..d12ac280b8 100644 --- a/cmd/cli/plugin/feature/list.go +++ b/cmd/plugin/feature/list.go @@ -10,8 +10,8 @@ import ( "github.com/spf13/cobra" corev1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" "github.com/vmware-tanzu/tanzu-framework/featuregates/client/pkg/featuregateclient" + "github.com/vmware-tanzu/tanzu-plugin-runtime/component" ) var ( diff --git a/cmd/cli/plugin/feature/list_test.go b/cmd/plugin/feature/list_test.go similarity index 100% rename from cmd/cli/plugin/feature/list_test.go rename to cmd/plugin/feature/list_test.go diff --git a/cmd/cli/plugin/feature/main.go b/cmd/plugin/feature/main.go similarity index 66% rename from cmd/cli/plugin/feature/main.go rename to cmd/plugin/feature/main.go index 6c31f3262f..bde699125b 100644 --- a/cmd/cli/plugin/feature/main.go +++ b/cmd/plugin/feature/main.go @@ -9,16 +9,17 @@ import ( "github.com/aunum/log" - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" + "github.com/vmware-tanzu/tanzu-cli/pkg/buildinfo" + plugintypes "github.com/vmware-tanzu/tanzu-plugin-runtime/config/types" + "github.com/vmware-tanzu/tanzu-plugin-runtime/plugin" ) -var descriptor = cliapi.PluginDescriptor{ +var descriptor = plugin.PluginDescriptor{ Name: "feature", Description: "Operate on features and featuregates", + Target: plugintypes.TargetK8s, Version: buildinfo.Version, - Group: cliapi.RunCmdGroup, + Group: plugin.RunCmdGroup, BuildSHA: buildinfo.SHA, } diff --git a/cmd/cli/plugin/feature/test/main.go b/cmd/plugin/feature/test/main.go similarity index 76% rename from cmd/cli/plugin/feature/test/main.go rename to cmd/plugin/feature/test/main.go index cdd1edf506..596f07cc18 100644 --- a/cmd/cli/plugin/feature/test/main.go +++ b/cmd/plugin/feature/test/main.go @@ -9,8 +9,8 @@ import ( "github.com/spf13/cobra" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" + "github.com/vmware-tanzu/tanzu-plugin-runtime/plugin" + clitest "github.com/vmware-tanzu/tanzu-plugin-runtime/test/framework" ) var descriptor = clitest.NewTestFor("feature") diff --git a/cmd/cli/plugin/feature/testdata/k8s_config.kube b/cmd/plugin/feature/testdata/k8s_config.kube similarity index 100% rename from cmd/cli/plugin/feature/testdata/k8s_config.kube rename to cmd/plugin/feature/testdata/k8s_config.kube diff --git a/common.mk b/common.mk index 383a449d12..888613f68f 100644 --- a/common.mk +++ b/common.mk @@ -37,12 +37,6 @@ ifeq ($(strip $(BUILD_VERSION)),) BUILD_VERSION = dev endif -# BUILD_EDITION is the Tanzu Edition, the plugin should be built for. -# Valid values for BUILD_EDITION are 'tce' and 'tkg'. Default value of BUILD_EDITION is 'tkg'. -ifneq ($(BUILD_EDITION), tce) -BUILD_EDITION = tkg -endif - ifdef DEBUG LD_FLAGS = -s GC_FLAGS = all=-N -l @@ -51,17 +45,7 @@ LD_FLAGS = -s -w GC_FLAGS = endif -# Remove old package path for buildinfo vars when it's no longer in use by plugin binaries. -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/pkg/v1/buildinfo.Date=$(BUILD_DATE)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/pkg/v1/buildinfo.SHA=$(BUILD_SHA)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/pkg/v1/buildinfo.Version=$(BUILD_VERSION)' - -# Set buildinfo for plugins -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo.Date=$(BUILD_DATE)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo.SHA=$(BUILD_SHA)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo.Version=$(BUILD_VERSION)' - -# Set buildinfo for tkr, object-propagation and (potentially) other modules +# Set buildinfo for modules LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/util/buildinfo.Date=$(BUILD_DATE)' LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/util/buildinfo.SHA=$(BUILD_SHA)' LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/util/buildinfo.Version=$(BUILD_VERSION)' @@ -69,15 +53,6 @@ LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/util/buildinfo.Version=$ # Add supported OS-ARCHITECTURE combinations here ENVS ?= linux-amd64 windows-amd64 darwin-amd64 -STANDALONE_PLUGINS ?= login management-cluster:k8s package:k8s pinniped-auth secret:k8s telemetry:k8s isolated-cluster -CONTEXTAWARE_PLUGINS ?= cluster:k8s kubernetes-release:k8s feature:k8s -ADMIN_PLUGINS ?= builder codegen test -PLUGINS ?= $(STANDALONE_PLUGINS) $(CONTEXTAWARE_PLUGINS) - -STANDALONE_PLUGINS_WITHOUT_TARGET ?= $(shell echo $(STANDALONE_PLUGINS) | sed 's/:k8s//g' | sed 's/:tmc//g') -CONTEXTAWARE_PLUGINS_WITHOUT_TARGET ?= $(shell echo $(CONTEXTAWARE_PLUGINS) | sed 's/:k8s//g' | sed 's/:tmc//g') -PLUGINS_WITHOUT_TARGET ?= $(STANDALONE_PLUGINS_WITHOUT_TARGET) $(CONTEXTAWARE_PLUGINS_WITHOUT_TARGET) - # Hosts running SELinux need :z added to volume mounts SELINUX_ENABLED := $(shell cat /sys/fs/selinux/enforce 2> /dev/null || echo 0) @@ -114,29 +89,24 @@ CONVERSION_GEN := $(TOOLS_BIN_DIR)/conversion-gen COUNTERFEITER := $(TOOLS_BIN_DIR)/counterfeiter TOOLING_BINARIES := $(CONTROLLER_GEN) $(GOLANGCI_LINT) $(YTT) $(KBLD) $(VENDIR) $(IMGPKG) $(KAPP) $(KUSTOMIZE) $(GOIMPORTS) $(GOBINDATA) $(GINKGO) $(VALE) $(YQ) $(CONVERSION_GEN) $(COUNTERFEITER) -## -------------------------------------- -##@ API/controller building and generation -## -------------------------------------- - -help: ## Display this help (default) - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-28s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m\033[32m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - - ## -------------------------------------- ##@ Tooling Binaries ## -------------------------------------- +.PHONY: tools tools: $(TOOLING_BINARIES) ## Build tooling binaries .PHONY: $(TOOLING_BINARIES) $(TOOLING_BINARIES): make -C $(TOOLS_DIR) $(@F) +## -------------------------------------- +##@ API/controller building and generation +## -------------------------------------- + +.PHONY: generate-controller-code generate-controller-code: $(CONTROLLER_GEN) $(GOIMPORTS) ## Generate code via controller-gen $(CONTROLLER_GEN) $(GENERATOR) object:headerFile="$(ROOT_DIR)/hack/boilerplate.go.txt",year=$(shell date +%Y) paths="$(CONTROLLER_GEN_SRC)" $(OPTIONS) - $(MAKE) fmt +.PHONY: generate-manifests generate-manifests: $(MAKE) generate-controller-code GENERATOR=crd OPTIONS="output:crd:artifacts:config=$(RELATIVE_ROOT)/config/crd/bases" CONTROLLER_GEN_SRC=$(CONTROLLER_GEN_SRC) - -fmt: $(GOIMPORTS) ## Run goimports - $(GOIMPORTS) -w -local github.com/vmware-tanzu ./ diff --git a/config/crd/bases/.gitignore b/config/crd/bases/.gitignore deleted file mode 100644 index 848b22ab38..0000000000 --- a/config/crd/bases/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -# Workaround for change in behaviour introduced by https://github.com/kubernetes-sigs/controller-tools/pull/663 - -_.yaml -cli.*.yaml -cni.*.yaml -config.*.yaml -cpi.*.yaml -csi.*.yaml -run.*.yaml -core.*.yaml diff --git a/config/crd/bases/config.tanzu.vmware.com_azurefilecsiconfigs.yaml b/config/crd/bases/config.tanzu.vmware.com_azurefilecsiconfigs.yaml deleted file mode 100644 index b47f61978d..0000000000 --- a/config/crd/bases/config.tanzu.vmware.com_azurefilecsiconfigs.yaml +++ /dev/null @@ -1,74 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.8.0 - creationTimestamp: null - name: azurefilecsiconfigs.csi.tanzu.vmware.com -spec: - group: csi.tanzu.vmware.com - names: - kind: AzureFileCSIConfig - listKind: AzureFileCSIConfigList - plural: azurefilecsiconfigs - singular: azurefilecsiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AzureFileCSIConfig is the Schema for the azurefilecsiconfigs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureFileCSIConfigSpec defines the desired state of AzureFileCSIConfig - properties: - azureFileCSIDriver: - description: AzureFileCSI is the Schema for the azurefilecsiconfigs API - properties: - deploymentReplicas: - format: int32 - type: integer - httpProxy: - type: string - httpsProxy: - type: string - namespace: - description: The namespace csi components are to be deployed in - type: string - noProxy: - type: string - type: object - required: - - azureFileCSIDriver - type: object - status: - description: AzureFileCSIConfigStatus defines the observed state of AzureFileCSIConfig - properties: - secretRef: - description: Name of the secret created by csi controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/config/crd/bases/csi.tanzu.vmware.com_azurediskcsiconfigs.yaml b/config/crd/bases/csi.tanzu.vmware.com_azurediskcsiconfigs.yaml deleted file mode 100644 index fba84ee915..0000000000 --- a/config/crd/bases/csi.tanzu.vmware.com_azurediskcsiconfigs.yaml +++ /dev/null @@ -1,69 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: azurediskcsiconfigs.csi.tanzu.vmware.com -spec: - group: csi.tanzu.vmware.com - names: - kind: AzureDiskCSIConfig - listKind: AzureDiskCSIConfigList - plural: azurediskcsiconfigs - singular: azurediskcsiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AzureDiskCSIConfig is the Schema for the azurediskcsiconfigs - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureDiskCSIConfigSpec defines the desired state of AzureDiskCSIConfig - properties: - azureDiskCSIDriver: - description: AzureDiskCSI is the Schema for the awsebscsiconfigs API - properties: - deploymentReplicas: - format: int32 - type: integer - httpProxy: - type: string - httpsProxy: - type: string - namespace: - description: The namespace csi components are to be deployed in - type: string - noProxy: - type: string - type: object - required: - - azureDiskCSIDriver - type: object - status: - description: AzureDiskCSIConfigStatus defines the observed state of AzureDiskCSIConfig - properties: - secretRef: - description: Name of the secret created by csi controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/config/crd/bases/csi.tanzu.vmware.com_azurefilecsiconfigs.yaml b/config/crd/bases/csi.tanzu.vmware.com_azurefilecsiconfigs.yaml deleted file mode 100644 index c944b00f68..0000000000 --- a/config/crd/bases/csi.tanzu.vmware.com_azurefilecsiconfigs.yaml +++ /dev/null @@ -1,70 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: azurefilecsiconfigs.csi.tanzu.vmware.com -spec: - group: csi.tanzu.vmware.com - names: - kind: AzureFileCSIConfig - listKind: AzureFileCSIConfigList - plural: azurefilecsiconfigs - singular: azurefilecsiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AzureFileCSIConfig is the Schema for the azurefilecsiconfigs - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureFileCSIConfigSpec defines the desired state of AzureFileCSIConfig - properties: - azureFileCSIDriver: - description: AzureFileCSI is the Schema for the AzureFileCSIConfig - properties: - deploymentReplicas: - format: int32 - type: integer - httpProxy: - type: string - httpsProxy: - type: string - namespace: - description: The namespace csi components are to be deployed in - type: string - noProxy: - type: string - required: - - namespace - type: object - required: - - azureFileCSIDriver - type: object - status: - description: AzureFileCSIConfigStatus defines the observed state of AzureFileCSIConfig - properties: - secretRef: - description: Name of the secret created by csi controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/config/crd/bases/providers.tanzu.vmware.com_templatedefinitions.yaml b/config/crd/bases/providers.tanzu.vmware.com_templatedefinitions.yaml deleted file mode 100644 index a4e714470a..0000000000 --- a/config/crd/bases/providers.tanzu.vmware.com_templatedefinitions.yaml +++ /dev/null @@ -1,95 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: templatedefinitions.providers.tanzu.vmware.com -spec: - group: providers.tanzu.vmware.com - names: - kind: TemplateDefinition - listKind: TemplateDefinitionList - plural: templatedefinitions - singular: templatedefinition - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: TemplateDefinition is a schema for template definition file - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TemplateDefinitionSpec defines state of template definition - file and path information - properties: - paths: - items: - description: PathInfo contains path information - properties: - filemark: - type: string - path: - type: string - required: - - path - type: object - type: array - required: - - paths - type: object - type: object - served: true - storage: true - - name: v1alpha1 - schema: - openAPIV3Schema: - description: TemplateDefinition is a schema for template definition file - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TemplateDefinitionSpec defines state of template definition - file and path information - properties: - paths: - items: - description: PathInfo contains path information - properties: - filemark: - type: string - path: - type: string - required: - - path - type: object - type: array - required: - - paths - type: object - type: object - served: true - storage: false diff --git a/config/crd/kustomization.yaml b/config/crd/kustomization.yaml deleted file mode 100644 index 29df4e4799..0000000000 --- a/config/crd/kustomization.yaml +++ /dev/null @@ -1,59 +0,0 @@ -# This kustomization.yaml is not intended to be run by itself, -# since it depends on service name and namespace that are out of this kustomize package. -# It should be run by config/default -resources: -- bases/cli.tanzu.vmware.com_catalogs.yaml -- bases/config.tanzu.vmware.com_features.yaml -- bases/config.tanzu.vmware.com_featuregates.yaml -- bases/cni.tanzu.vmware.com_calicoconfigs.yaml -- bases/cni.tanzu.vmware.com_antreaconfigs.yaml -- bases/cpi.tanzu.vmware.com_vspherecpiconfigs.yaml -- bases/csi.tanzu.vmware.com_vspherecsiconfigs.yaml -- bases/csi.tanzu.vmware.com_azurediskcsiconfigs.yaml -- bases/csi.tanzu.vmware.com_awsebscsiconfigs.yaml -- bases/csi.tanzu.vmware.com_azurefilecsiconfigs.yaml -- bases/cpi.tanzu.vmware.com_kubevipcpiconfigs.yaml -- bases/core.tanzu.vmware.com_featuregates.yaml -- bases/core.tanzu.vmware.com_features.yaml -# +kubebuilder:scaffold:crdkustomizeresource - -patchesStrategicMerge: -# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix. -# patches here are for enabling the conversion webhook for each CRD -#- patches/webhook_in_tanzukubernetesreleases.yaml -#- patches/webhook_in_capabilities.yaml -#- patches/webhook_in_calicoconfigs.yaml -#- patches/webhook_in_antreaconfigs.yaml -#- patches/webhook_in_kappcontrollerconfigs.yaml -#- patches/webhook_in_cpiconfigs.yaml -#- patches/webhook_in_clusterbootstraps.yaml -#- patches/webhook_in_clusterbootstraptemplates.yaml -#- patches/webhook_in_awsebscsiconfigs.yaml -#- patches/webhook_in_azurefilecsiconfigs.yaml -#- patches/webhook_in_azurediskcsiconfigs.yaml -#- patches/webhook_in_kubevipcpiconfigs.yaml -#- patches/webhook_in_featuregates.yaml -#- patches/webhook_in_features.yaml -# +kubebuilder:scaffold:crdkustomizewebhookpatch - -# [CERTMANAGER] To enable webhook, uncomment all the sections with [CERTMANAGER] prefix. -# patches here are for enabling the CA injection for each CRD -#- patches/cainjection_in_tanzukubernetesreleases.yaml -#- patches/cainjection_in_capabilities.yaml -#- patches/cainjection_in_calicoconfigs.yaml -#- patches/cainjection_in_antreaconfigs.yaml -#- patches/cainjection_in_kappcontrollerconfigs.yaml -#- patches/cainjection_in_cpiconfigs.yaml -#- patches/cainjection_in_clusterbootstraps.yaml -#- patches/cainjection_in_clusterbootstraptemplates.yaml -#- patches/cainjection_in_azurediskcsiconfigs.yaml -#- patches/cainjection_in_awsebscsiconfigs.yaml -#- patches/cainjection_in_azurefilecsiconfigs.yaml -#- patches/cainjection_in_kubevipcpiconfigs.yaml -#- patches/cainjection_in_featuregates.yaml -#- patches/cainjection_in_features.yaml -# +kubebuilder:scaffold:crdkustomizecainjectionpatch - -# the following config is for teaching kustomize how to do kustomization for CRDs. -configurations: -- kustomizeconfig.yaml diff --git a/config/crd/kustomizeconfig.yaml b/config/crd/kustomizeconfig.yaml deleted file mode 100644 index 6f83d9a94b..0000000000 --- a/config/crd/kustomizeconfig.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# This file is for teaching kustomize how to substitute name and namespace reference in CRD -nameReference: -- kind: Service - version: v1 - fieldSpecs: - - kind: CustomResourceDefinition - group: apiextensions.k8s.io - path: spec/conversion/webhookClientConfig/service/name - -namespace: -- kind: CustomResourceDefinition - group: apiextensions.k8s.io - path: spec/conversion/webhookClientConfig/service/namespace - create: false - -varReference: -- path: metadata/annotations diff --git a/config/crd/patches/cainjection_in_awsebscsiconfigs.yaml b/config/crd/patches/cainjection_in_awsebscsiconfigs.yaml deleted file mode 100644 index beccebae83..0000000000 --- a/config/crd/patches/cainjection_in_awsebscsiconfigs.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# The following patch adds a directive for certmanager to inject CA into the CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) - name: awsebscsiconfigs.csi.tanzu.vmware.com diff --git a/config/crd/patches/cainjection_in_azurediskcsiconfigs.yaml b/config/crd/patches/cainjection_in_azurediskcsiconfigs.yaml deleted file mode 100644 index d62b33cb6d..0000000000 --- a/config/crd/patches/cainjection_in_azurediskcsiconfigs.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# The following patch adds a directive for certmanager to inject CA into the CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) - name: azurediskcsiconfigs.csi.tanzu.vmware.com diff --git a/config/crd/patches/cainjection_in_azurefilecsiconfigs.yaml b/config/crd/patches/cainjection_in_azurefilecsiconfigs.yaml deleted file mode 100644 index 1d0b4e3c25..0000000000 --- a/config/crd/patches/cainjection_in_azurefilecsiconfigs.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# The following patch adds a directive for certmanager to inject CA into the CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) - name: azurefilecsiconfigs.csi.tanzu.vmware.com diff --git a/config/crd/patches/cainjection_in_capabilities.yaml b/config/crd/patches/cainjection_in_capabilities.yaml deleted file mode 100644 index 490b4a108b..0000000000 --- a/config/crd/patches/cainjection_in_capabilities.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# The following patch adds a directive for certmanager to inject CA into the CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) - name: capabilities.core.tanzu.vmware.com diff --git a/config/crd/patches/cainjection_in_featuregates.yaml b/config/crd/patches/cainjection_in_featuregates.yaml deleted file mode 100644 index bae71470b3..0000000000 --- a/config/crd/patches/cainjection_in_featuregates.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# The following patch adds a directive for certmanager to inject CA into the CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) - name: featuregates.config.tanzu.vmware.com diff --git a/config/crd/patches/cainjection_in_features.yaml b/config/crd/patches/cainjection_in_features.yaml deleted file mode 100644 index bb0fb1fcd1..0000000000 --- a/config/crd/patches/cainjection_in_features.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# The following patch adds a directive for certmanager to inject CA into the CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) - name: features.core.tanzu.vmware.com diff --git a/config/crd/patches/cainjection_in_kubevipcpiconfigs.yaml b/config/crd/patches/cainjection_in_kubevipcpiconfigs.yaml deleted file mode 100644 index 714e410335..0000000000 --- a/config/crd/patches/cainjection_in_kubevipcpiconfigs.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# The following patch adds a directive for certmanager to inject CA into the CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) - name: kubevipcpiconfigs.cpi.tanzu.vmware.com diff --git a/config/crd/patches/cainjection_in_tanzukubernetesreleases.yaml b/config/crd/patches/cainjection_in_tanzukubernetesreleases.yaml deleted file mode 100644 index d81f151398..0000000000 --- a/config/crd/patches/cainjection_in_tanzukubernetesreleases.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# The following patch adds a directive for certmanager to inject CA into the CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: $(CERTIFICATE_NAMESPACE)/$(CERTIFICATE_NAME) - name: tanzukubernetesreleases.run.tanzu.vmware.com diff --git a/config/crd/patches/webhook_in_awsebscsiconfigs.yaml b/config/crd/patches/webhook_in_awsebscsiconfigs.yaml deleted file mode 100644 index f306ad5c55..0000000000 --- a/config/crd/patches/webhook_in_awsebscsiconfigs.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# The following patch enables conversion webhook for CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: awsebscsiconfigs.csi.tanzu.vmware.com -spec: - conversion: - strategy: Webhook - webhookClientConfig: - # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, - # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) - caBundle: Cg== - service: - namespace: system - name: webhook-service - path: /convert diff --git a/config/crd/patches/webhook_in_azurediskcsiconfigs.yaml b/config/crd/patches/webhook_in_azurediskcsiconfigs.yaml deleted file mode 100644 index 6bddb43bc1..0000000000 --- a/config/crd/patches/webhook_in_azurediskcsiconfigs.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# The following patch enables conversion webhook for CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: azurediskcsiconfigs.csi.tanzu.vmware.com -spec: - conversion: - strategy: Webhook - webhookClientConfig: - # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, - # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) - caBundle: Cg== - service: - namespace: system - name: webhook-service - path: /convert diff --git a/config/crd/patches/webhook_in_azurefilecsiconfigs.yaml b/config/crd/patches/webhook_in_azurefilecsiconfigs.yaml deleted file mode 100644 index 625f1a9747..0000000000 --- a/config/crd/patches/webhook_in_azurefilecsiconfigs.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# The following patch enables conversion webhook for CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: azurefilecsiconfigs.csi.tanzu.vmware.com -spec: - conversion: - strategy: Webhook - webhookClientConfig: - # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, - # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) - caBundle: Cg== - service: - namespace: system - name: webhook-service - path: /convert diff --git a/config/crd/patches/webhook_in_capabilities.yaml b/config/crd/patches/webhook_in_capabilities.yaml deleted file mode 100644 index d461172017..0000000000 --- a/config/crd/patches/webhook_in_capabilities.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# The following patch enables conversion webhook for CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: capabilities.core.tanzu.vmware.com -spec: - conversion: - strategy: Webhook - webhookClientConfig: - # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, - # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) - caBundle: Cg== - service: - namespace: system - name: webhook-service - path: /convert diff --git a/config/crd/patches/webhook_in_featuregates.yaml b/config/crd/patches/webhook_in_featuregates.yaml deleted file mode 100644 index 9a5177afca..0000000000 --- a/config/crd/patches/webhook_in_featuregates.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# The following patch enables conversion webhook for CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: featuregates.config.tanzu.vmware.com -spec: - conversion: - strategy: Webhook - webhookClientConfig: - # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, - # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) - caBundle: Cg== - service: - namespace: system - name: webhook-service - path: /convert diff --git a/config/crd/patches/webhook_in_features.yaml b/config/crd/patches/webhook_in_features.yaml deleted file mode 100644 index 09a2279660..0000000000 --- a/config/crd/patches/webhook_in_features.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# The following patch enables conversion webhook for CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: features.core.tanzu.vmware.com -spec: - conversion: - strategy: Webhook - webhookClientConfig: - # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, - # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) - caBundle: Cg== - service: - namespace: system - name: webhook-service - path: /convert diff --git a/config/crd/patches/webhook_in_kubevipcpiconfigs.yaml b/config/crd/patches/webhook_in_kubevipcpiconfigs.yaml deleted file mode 100644 index 36fbcb312c..0000000000 --- a/config/crd/patches/webhook_in_kubevipcpiconfigs.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# The following patch enables conversion webhook for CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: kubevipcpiconfigs.cpi.tanzu.vmware.com -spec: - conversion: - strategy: Webhook - webhookClientConfig: - # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, - # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) - caBundle: Cg== - service: - namespace: system - name: webhook-service - path: /convert diff --git a/config/crd/patches/webhook_in_tanzukubernetesreleases.yaml b/config/crd/patches/webhook_in_tanzukubernetesreleases.yaml deleted file mode 100644 index 00e96005d5..0000000000 --- a/config/crd/patches/webhook_in_tanzukubernetesreleases.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# The following patch enables conversion webhook for CRD -# CRD conversion requires k8s 1.13 or later. -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: tanzukubernetesreleases.run.tanzu.vmware.com -spec: - conversion: - strategy: Webhook - webhookClientConfig: - # this is "\n" used as a placeholder, otherwise it will be rejected by the apiserver for being blank, - # but we're going to set it later using the cert-manager (or potentially a patch if not using cert-manager) - caBundle: Cg== - service: - namespace: system - name: webhook-service - path: /convert diff --git a/config/rbac/antreaconfig_editor_role.yaml b/config/rbac/antreaconfig_editor_role.yaml deleted file mode 100644 index 55d44dc75e..0000000000 --- a/config/rbac/antreaconfig_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit antreaconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: antreaconfig-editor-role -rules: -- apiGroups: - - addons.tanzu.vmware.com - resources: - - antreaconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - addons.tanzu.vmware.com - resources: - - antreaconfigs/status - verbs: - - get diff --git a/config/rbac/antreaconfig_viewer_role.yaml b/config/rbac/antreaconfig_viewer_role.yaml deleted file mode 100644 index b6238dc150..0000000000 --- a/config/rbac/antreaconfig_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view antreaconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: antreaconfig-viewer-role -rules: -- apiGroups: - - addons.tanzu.vmware.com - resources: - - antreaconfigs - verbs: - - get - - list - - watch -- apiGroups: - - addons.tanzu.vmware.com - resources: - - antreaconfigs/status - verbs: - - get diff --git a/config/rbac/awsebscsiconfig_editor_role.yaml b/config/rbac/awsebscsiconfig_editor_role.yaml deleted file mode 100644 index c5324088cd..0000000000 --- a/config/rbac/awsebscsiconfig_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit awsebscsiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: awsebscsiconfig-editor-role -rules: -- apiGroups: - - csi.tanzu.vmware.com - resources: - - awsebscsiconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - csi.tanzu.vmware.com - resources: - - awsebscsiconfigs/status - verbs: - - get diff --git a/config/rbac/awsebscsiconfig_viewer_role.yaml b/config/rbac/awsebscsiconfig_viewer_role.yaml deleted file mode 100644 index 2fd6bf7b3a..0000000000 --- a/config/rbac/awsebscsiconfig_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view awsebscsiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: awsebscsiconfig-viewer-role -rules: -- apiGroups: - - csi.tanzu.vmware.com - resources: - - awsebscsiconfigs - verbs: - - get - - list - - watch -- apiGroups: - - csi.tanzu.vmware.com - resources: - - awsebscsiconfigs/status - verbs: - - get diff --git a/config/rbac/azurediskcsiconfig_editor_role.yaml b/config/rbac/azurediskcsiconfig_editor_role.yaml deleted file mode 100644 index 332cd8883a..0000000000 --- a/config/rbac/azurediskcsiconfig_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit azurediskcsiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: azurediskcsiconfig-editor-role -rules: -- apiGroups: - - csi.tanzu.vmware.com - resources: - - azurediskcsiconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - csi.tanzu.vmware.com - resources: - - azurediskcsiconfigs/status - verbs: - - get diff --git a/config/rbac/azurediskcsiconfig_viewer_role.yaml b/config/rbac/azurediskcsiconfig_viewer_role.yaml deleted file mode 100644 index 2bc3f8e925..0000000000 --- a/config/rbac/azurediskcsiconfig_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view azurediskcsiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: azurediskcsiconfig-viewer-role -rules: -- apiGroups: - - csi.tanzu.vmware.com - resources: - - azurediskcsiconfigs - verbs: - - get - - list - - watch -- apiGroups: - - csi.tanzu.vmware.com - resources: - - azurediskcsiconfigs/status - verbs: - - get diff --git a/config/rbac/azurefilecsiconfig_editor_role.yaml b/config/rbac/azurefilecsiconfig_editor_role.yaml deleted file mode 100644 index 07342c1e5a..0000000000 --- a/config/rbac/azurefilecsiconfig_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit azurefilecsiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: azurefilecsiconfig-editor-role -rules: -- apiGroups: - - csi.tanzu.vmware.com - resources: - - azurefilecsiconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - csi.tanzu.vmware.com - resources: - - azurefilecsiconfigs/status - verbs: - - get diff --git a/config/rbac/azurefilecsiconfig_viewer_role.yaml b/config/rbac/azurefilecsiconfig_viewer_role.yaml deleted file mode 100644 index a8d9165a5f..0000000000 --- a/config/rbac/azurefilecsiconfig_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view azurefilecsiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: azurefilecsiconfig-viewer-role -rules: -- apiGroups: - - csi.tanzu.vmware.com - resources: - - azurefilecsiconfigs - verbs: - - get - - list - - watch -- apiGroups: - - csi.tanzu.vmware.com - resources: - - azurefilecsiconfigs/status - verbs: - - get diff --git a/config/rbac/calicoconfig_editor_role.yaml b/config/rbac/calicoconfig_editor_role.yaml deleted file mode 100644 index 3aee07e161..0000000000 --- a/config/rbac/calicoconfig_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit calicoconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: calicoconfig-editor-role -rules: -- apiGroups: - - cni.tanzu.vmware.com - resources: - - calicoconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cni.tanzu.vmware.com - resources: - - calicoconfigs/status - verbs: - - get diff --git a/config/rbac/calicoconfig_viewer_role.yaml b/config/rbac/calicoconfig_viewer_role.yaml deleted file mode 100644 index e8c26b2bfd..0000000000 --- a/config/rbac/calicoconfig_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view calicoconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: calicoconfig-viewer-role -rules: -- apiGroups: - - cni.tanzu.vmware.com - resources: - - calicoconfigs - verbs: - - get - - list - - watch -- apiGroups: - - cni.tanzu.vmware.com - resources: - - calicoconfigs/status - verbs: - - get diff --git a/config/rbac/capabilities_editor_role.yaml b/config/rbac/capabilities_editor_role.yaml deleted file mode 100644 index fe3e70a77f..0000000000 --- a/config/rbac/capabilities_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit capabilities. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: capabilities-editor-role -rules: -- apiGroups: - - core.tanzu.vmware.com - resources: - - capabilities - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - core.tanzu.vmware.com - resources: - - capabilities/status - verbs: - - get diff --git a/config/rbac/capabilities_viewer_role.yaml b/config/rbac/capabilities_viewer_role.yaml deleted file mode 100644 index 8332cf6b9f..0000000000 --- a/config/rbac/capabilities_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view capabilities. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: capabilities-viewer-role -rules: -- apiGroups: - - core.tanzu.vmware.com - resources: - - capabilities - verbs: - - get - - list - - watch -- apiGroups: - - core.tanzu.vmware.com - resources: - - capabilities/status - verbs: - - get diff --git a/config/rbac/capability_editor_role.yaml b/config/rbac/capability_editor_role.yaml deleted file mode 100644 index 6bd469c12b..0000000000 --- a/config/rbac/capability_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit capabilities. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: capability-editor-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - capabilities - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - capabilities/status - verbs: - - get diff --git a/config/rbac/capability_viewer_role.yaml b/config/rbac/capability_viewer_role.yaml deleted file mode 100644 index bbcb81ccf8..0000000000 --- a/config/rbac/capability_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view capabilities. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: capability-viewer-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - capabilities - verbs: - - get - - list - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - capabilities/status - verbs: - - get diff --git a/config/rbac/clusterbootstrap_editor_role.yaml b/config/rbac/clusterbootstrap_editor_role.yaml deleted file mode 100644 index 10e3167ace..0000000000 --- a/config/rbac/clusterbootstrap_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit clusterbootstraps. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: clusterbootstrap-editor-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - clusterbootstraps - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - clusterbootstraps/status - verbs: - - get diff --git a/config/rbac/clusterbootstrap_viewer_role.yaml b/config/rbac/clusterbootstrap_viewer_role.yaml deleted file mode 100644 index 47cb3ed739..0000000000 --- a/config/rbac/clusterbootstrap_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view clusterbootstraps. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: clusterbootstrap-viewer-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - clusterbootstraps - verbs: - - get - - list - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - clusterbootstraps/status - verbs: - - get diff --git a/config/rbac/clusterbootstraptemplate_editor_role.yaml b/config/rbac/clusterbootstraptemplate_editor_role.yaml deleted file mode 100644 index 66678a7a16..0000000000 --- a/config/rbac/clusterbootstraptemplate_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit clusterbootstraptemplates. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: clusterbootstraptemplate-editor-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - clusterbootstraptemplates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - clusterbootstraptemplates/status - verbs: - - get diff --git a/config/rbac/clusterbootstraptemplate_viewer_role.yaml b/config/rbac/clusterbootstraptemplate_viewer_role.yaml deleted file mode 100644 index 643a9f9f6d..0000000000 --- a/config/rbac/clusterbootstraptemplate_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view clusterbootstraptemplates. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: clusterbootstraptemplate-viewer-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - clusterbootstraptemplates - verbs: - - get - - list - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - clusterbootstraptemplates/status - verbs: - - get diff --git a/config/rbac/feature_editor_role.yaml b/config/rbac/feature_editor_role.yaml deleted file mode 100644 index 38d734471b..0000000000 --- a/config/rbac/feature_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit features. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: feature-editor-role -rules: -- apiGroups: - - core.tanzu.vmware.com - resources: - - features - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - core.tanzu.vmware.com - resources: - - features/status - verbs: - - get diff --git a/config/rbac/feature_viewer_role.yaml b/config/rbac/feature_viewer_role.yaml deleted file mode 100644 index 3f6d87eb18..0000000000 --- a/config/rbac/feature_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view features. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: feature-viewer-role -rules: -- apiGroups: - - core.tanzu.vmware.com - resources: - - features - verbs: - - get - - list - - watch -- apiGroups: - - core.tanzu.vmware.com - resources: - - features/status - verbs: - - get diff --git a/config/rbac/featuregate_editor_role.yaml b/config/rbac/featuregate_editor_role.yaml deleted file mode 100644 index f81185fdcf..0000000000 --- a/config/rbac/featuregate_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit featuregates. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: featuregate-editor-role -rules: -- apiGroups: - - config.tanzu.vmware.com - resources: - - featuregates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - config.tanzu.vmware.com - resources: - - featuregates/status - verbs: - - get diff --git a/config/rbac/featuregate_viewer_role.yaml b/config/rbac/featuregate_viewer_role.yaml deleted file mode 100644 index 16ce2c693a..0000000000 --- a/config/rbac/featuregate_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view featuregates. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: featuregate-viewer-role -rules: -- apiGroups: - - config.tanzu.vmware.com - resources: - - featuregates - verbs: - - get - - list - - watch -- apiGroups: - - config.tanzu.vmware.com - resources: - - featuregates/status - verbs: - - get diff --git a/config/rbac/kappcontrollerconfig_editor_role.yaml b/config/rbac/kappcontrollerconfig_editor_role.yaml deleted file mode 100644 index 16e3e22f41..0000000000 --- a/config/rbac/kappcontrollerconfig_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit kappcontrollerconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: kappcontrollerconfig-editor-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - kappcontrollerconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - kappcontrollerconfigs/status - verbs: - - get diff --git a/config/rbac/kappcontrollerconfig_viewer_role.yaml b/config/rbac/kappcontrollerconfig_viewer_role.yaml deleted file mode 100644 index 3046fb66e1..0000000000 --- a/config/rbac/kappcontrollerconfig_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view kappcontrollerconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: kappcontrollerconfig-viewer-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - kappcontrollerconfigs - verbs: - - get - - list - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - kappcontrollerconfigs/status - verbs: - - get diff --git a/config/rbac/kubevipcpiconfig_editor_role.yaml b/config/rbac/kubevipcpiconfig_editor_role.yaml deleted file mode 100644 index c60b5a5207..0000000000 --- a/config/rbac/kubevipcpiconfig_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit kubevipcpiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: kubevipcpiconfig-editor-role -rules: -- apiGroups: - - cpi.tanzu.vmware.com - resources: - - kubevipcpiconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cpi.tanzu.vmware.com - resources: - - kubevipcpiconfigs/status - verbs: - - get diff --git a/config/rbac/kubevipcpiconfig_viewer_role.yaml b/config/rbac/kubevipcpiconfig_viewer_role.yaml deleted file mode 100644 index 7b6dcf39e2..0000000000 --- a/config/rbac/kubevipcpiconfig_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view kubevipcpiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: kubevipcpiconfig-viewer-role -rules: -- apiGroups: - - cpi.tanzu.vmware.com - resources: - - kubevipcpiconfigs - verbs: - - get - - list - - watch -- apiGroups: - - cpi.tanzu.vmware.com - resources: - - kubevipcpiconfigs/status - verbs: - - get diff --git a/config/rbac/tanzukubernetesrelease_editor_role.yaml b/config/rbac/tanzukubernetesrelease_editor_role.yaml deleted file mode 100644 index 792e5f4114..0000000000 --- a/config/rbac/tanzukubernetesrelease_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit tanzukubernetesreleases. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzukubernetesrelease-editor-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases/status - verbs: - - get diff --git a/config/rbac/tanzukubernetesrelease_viewer_role.yaml b/config/rbac/tanzukubernetesrelease_viewer_role.yaml deleted file mode 100644 index 6fa67881ed..0000000000 --- a/config/rbac/tanzukubernetesrelease_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view tanzukubernetesreleases. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzukubernetesrelease-viewer-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - verbs: - - get - - list - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases/status - verbs: - - get diff --git a/config/rbac/vspherecpiconfig_editor_role.yaml b/config/rbac/vspherecpiconfig_editor_role.yaml deleted file mode 100644 index a7b70391d1..0000000000 --- a/config/rbac/vspherecpiconfig_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit cpiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: vspherecpiconfig-editor-role -rules: -- apiGroups: - - cpi.tanzu.vmware.com - resources: - - vspherecpiconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cpi.tanzu.vmware.com - resources: - - vspherecpiconfigs/status - verbs: - - get diff --git a/config/rbac/vspherecpiconfig_viewer_role.yaml b/config/rbac/vspherecpiconfig_viewer_role.yaml deleted file mode 100644 index c0219bb22f..0000000000 --- a/config/rbac/vspherecpiconfig_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view cpiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: vspherecpiconfig-viewer-role -rules: -- apiGroups: - - cpi.tanzu.vmware.com - resources: - - vspherecpiconfigs - verbs: - - get - - list - - watch -- apiGroups: - - cpi.tanzu.vmware.com - resources: - - vspherecpiconfigs/status - verbs: - - get diff --git a/config/rbac/vspherecsiconfig_editor_role.yaml b/config/rbac/vspherecsiconfig_editor_role.yaml deleted file mode 100644 index cfd61e9102..0000000000 --- a/config/rbac/vspherecsiconfig_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit vspherecsiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: vspherecsiconfig-editor-role -rules: -- apiGroups: - - csi.tanzu.vmware.com - resources: - - vspherecsiconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - csi.tanzu.vmware.com - resources: - - vspherecsiconfigs/status - verbs: - - get diff --git a/config/rbac/vspherecsiconfig_viewer_role.yaml b/config/rbac/vspherecsiconfig_viewer_role.yaml deleted file mode 100644 index 0f5d8b178a..0000000000 --- a/config/rbac/vspherecsiconfig_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view csiconfigs. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: vspherecsiconfig-viewer-role -rules: -- apiGroups: - - csi.tanzu.vmware.com - resources: - - vspherecsiconfigs - verbs: - - get - - list - - watch -- apiGroups: - - csi.tanzu.vmware.com - resources: - - vspherecsiconfigs/status - verbs: - - get diff --git a/config/samples/cni_v1alpha1_antreaconfig.yaml b/config/samples/cni_v1alpha1_antreaconfig.yaml deleted file mode 100644 index a2c443fb9f..0000000000 --- a/config/samples/cni_v1alpha1_antreaconfig.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: antreaconfig-sample -spec: - antrea: - config: - trafficEncapMode: encap - noSNAT: false - disableUdpTunnelOffload: false - defaultMTU: "" - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - featureGates: - AntreaProxy: true - EndpointSlice: false - AntreaPolicy: true - FlowExporter: false - Egress: false - NodePortLocal: false - AntreaTraceflow: true - NetworkPolicyStats: false diff --git a/config/samples/cni_v1alpha1_calicoconfig.yaml b/config/samples/cni_v1alpha1_calicoconfig.yaml deleted file mode 100644 index 9938ae0e9b..0000000000 --- a/config/samples/cni_v1alpha1_calicoconfig.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: calicoconfig-sample -spec: - namespace: "kube-system" - calico: - config: - vethMTU: 0 diff --git a/config/samples/config.tanzu.vmware.com_v1alpha1_feature.yaml b/config/samples/config.tanzu.vmware.com_v1alpha1_feature.yaml deleted file mode 100644 index 8fd6d69d6c..0000000000 --- a/config/samples/config.tanzu.vmware.com_v1alpha1_feature.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: config.tanzu.vmware.com/v1alpha1 -kind: Feature -metadata: - name: feature-sample -spec: - description: "A sample Feature" - immutable: false - discoverable: true - maturity: "dev" - activated: false diff --git a/config/samples/config_v1alpha1_featuregate.yaml b/config/samples/config_v1alpha1_featuregate.yaml deleted file mode 100644 index b59bed1c0b..0000000000 --- a/config/samples/config_v1alpha1_featuregate.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: config.tanzu.vmware.com/v1alpha1 -kind: FeatureGate -metadata: - name: featuregate-sample -spec: - namespaceSelector: - matchExpressions: - - key: kubernetes.io/metadata.name - operator: In - values: - - tkg-system - - default - features: - - name: "foo" - activate: true - - name: "bar" - activate: false diff --git a/config/samples/core_v1alpha1_capabilities.yaml b/config/samples/core_v1alpha1_capabilities.yaml deleted file mode 100644 index ae5bffb976..0000000000 --- a/config/samples/core_v1alpha1_capabilities.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: core.tanzu.vmware.com/v1alpha1 -kind: Capabilities -metadata: - name: capabilities-sample -spec: - # Add fields here - foo: bar diff --git a/config/samples/core_v1alpha2_feature.yaml b/config/samples/core_v1alpha2_feature.yaml deleted file mode 100644 index 049fbc6d1e..0000000000 --- a/config/samples/core_v1alpha2_feature.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: core.tanzu.vmware.com/v1alpha2 -kind: Feature -metadata: - name: feature-sample -spec: - # Add fields here - foo: bar diff --git a/config/samples/core_v1alpha2_featuregate.yaml b/config/samples/core_v1alpha2_featuregate.yaml deleted file mode 100644 index 65f7dab99f..0000000000 --- a/config/samples/core_v1alpha2_featuregate.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: core.tanzu.vmware.com/v1alpha2 -kind: FeatureGate -metadata: - name: featuregate-sample -spec: - # Add fields here - foo: bar diff --git a/config/samples/cpi_v1alpha1_kubevipcpiconfig.yaml b/config/samples/cpi_v1alpha1_kubevipcpiconfig.yaml deleted file mode 100644 index 4db0830eae..0000000000 --- a/config/samples/cpi_v1alpha1_kubevipcpiconfig.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: KubevipCPIConfig -metadata: - name: kubevipcpiconfig-sample -spec: - loadbalancerCIDRs: 10.0.0.2/24 - loadbalancerIPRanges: 10.0.0.1-10.0.0.2 diff --git a/config/samples/cpi_v1alpha1_oraclecpiconfig.yaml b/config/samples/cpi_v1alpha1_oraclecpiconfig.yaml deleted file mode 100644 index 8346d22243..0000000000 --- a/config/samples/cpi_v1alpha1_oraclecpiconfig.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: OracleCPIConfig -metadata: - name: oraclecpiconfig-sample -spec: - compartment: test-compartment - vcn: test-vcn - loadBalancer: - subnet1: ocid1.subnet.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - subnet2: ocid1.subnet.oc1.phx.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - securityListManagementMode: Frontend diff --git a/config/samples/cpi_v1alpha1_vspherecpiconfig.yaml b/config/samples/cpi_v1alpha1_vspherecpiconfig.yaml deleted file mode 100644 index c8aed5c6b6..0000000000 --- a/config/samples/cpi_v1alpha1_vspherecpiconfig.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: vspherecpiconfig-sample -spec: - vsphereCPI: - mode: vsphereCPI - tlsThumbprint: "test" - server: 10.1.1.1 - datacenter: ds-test - vSphereCredentialLocalObjRef: - apiGroup: "" - kind: Secret - name: vsphere-credentials - insecureFlag: False - vmInternalNetwork: null - vmExternalNetwork: null - cloudProviderExtraArgs: - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - nsxt: - podRoutingEnabled: false - routes: - routerPath: "" - credentialLocalObjRef: - apiGroup: "" - kind: Secret - name: nsxt-credentials - host: "10.1.1.2" - insecureFlag: false - remoteAuth: false - vmcAccessToken: "" - vmcAuthHost: "" - clientCertKeyData: "" - clientCertData: "" - rootCAData: "" - secretName: "cloud-provider-vsphere-nsxt-credentials" - secretNamespace: "kube-system" diff --git a/config/samples/csi_v1alpha1_awsebscsiconfig.yaml b/config/samples/csi_v1alpha1_awsebscsiconfig.yaml deleted file mode 100644 index 30feb026c1..0000000000 --- a/config/samples/csi_v1alpha1_awsebscsiconfig.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AwsEbsCSIConfig -metadata: - name: awsebscsiconfig-sample -spec: - # TODO(user): Add fields here diff --git a/config/samples/csi_v1alpha1_azurediskcsiconfig.yaml b/config/samples/csi_v1alpha1_azurediskcsiconfig.yaml deleted file mode 100644 index e073b76125..0000000000 --- a/config/samples/csi_v1alpha1_azurediskcsiconfig.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AzureDiskCSIConfig -metadata: - name: azurediskcsiconfig-sample -spec: - # TODO(user): Add fields here diff --git a/config/samples/csi_v1alpha1_azurefilecsiconfig.yaml b/config/samples/csi_v1alpha1_azurefilecsiconfig.yaml deleted file mode 100644 index 53aef8be66..0000000000 --- a/config/samples/csi_v1alpha1_azurefilecsiconfig.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AzureFileCSIConfig -metadata: - name: azurefilecsiconfig-sample -spec: - # TODO(user): Add fields here diff --git a/config/samples/run_v1alpha1_capability.yaml b/config/samples/run_v1alpha1_capability.yaml deleted file mode 100644 index 76d27a2535..0000000000 --- a/config/samples/run_v1alpha1_capability.yaml +++ /dev/null @@ -1,40 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: Capability -metadata: - name: capability-sample -spec: - queries: - - name: "q1" - groupVersionResources: - - name: "fooGVR" - group: "run.tanzu.vmware.com" - versions: - - v1alpha1 - resource: "tanzukubernetesreleases" - - name: "barGVR" - group: "run.tanzu.vmware.com" - versions: - - v1alpha1 - resource: "tanzukubernetesclusters" - objects: - - name: "fooObject" - objectReference: - kind: "Namespace" - name: "vmware-system-nsx" - apiVersion: "v1" - partialSchemas: - - name: "fooPartialSchema" - partialSchema: "{}" - - name: "q2" - groupVersionResources: - - name: "bazGVR" - group: "run.tanzu.vmware.com" - versions: - - v1alpha1 - resource: "tanzukubernetesreleases" - objects: - - name: "bazObject" - objectReference: - kind: "Namespace" - name: "tkg-system" - apiVersion: "v1" diff --git a/config/samples/run_v1alpha1_tanzukubernetesrelease.yaml b/config/samples/run_v1alpha1_tanzukubernetesrelease.yaml deleted file mode 100644 index d098c85aea..0000000000 --- a/config/samples/run_v1alpha1_tanzukubernetesrelease.yaml +++ /dev/null @@ -1,40 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha1 -kind: TanzuKubernetesRelease -metadata: - name: v1.16.8---vmware.1-tkg.3.60d2ffd - labels: - v1: "" - v1.16: "" - v1.16.8: latest - v1.16.8---vmware: latest - v1.16.8---vmware.1: latest - v1.16.8---vmware.1-tkg: latest - v1.16.8---vmware.1-tkg.3: latest - v1.16.8---vmware.1-tkg.3.60d2ffd: latest - -spec: - version: 1.16.8+vmware.1-tkg.3.60d2ffd - - kubernetesVersion: 1.16.8+vmware.1 - - repository: vmware.io - - images: - - name: coredns - repository: vmware.io # optional (default: top level repository) - tag: v1.6.5_vmware.2 - - name: etcd - tag: v3.3.15_vmware.4 - - nodeImageRef: - apiVersion: vmoperator.vmware.com/v1alpha1 - kind: VirtualMachineImage - name: photon-3-k8s-v1.16.8---vmware.1-tkg.3.60d2ffd - -status: - conditions: - - type: UpdateAvailable # TODO GCM-3187 - status: True - message: a TKR with a later version is available - - type: Compatible - status: True diff --git a/config/samples/run_v1alpha3_kappcontrollerconfig.yaml b/config/samples/run_v1alpha3_kappcontrollerconfig.yaml deleted file mode 100644 index 3832687b6a..0000000000 --- a/config/samples/run_v1alpha3_kappcontrollerconfig.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: KappControllerConfig -metadata: - name: kappcontrollerconfig-sample -spec: - namespace: test-ns - kappController: - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - concurrency: 4 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" diff --git a/config/samples/run_v1alpha3_tanzukubernetesrelease.yaml b/config/samples/run_v1alpha3_tanzukubernetesrelease.yaml deleted file mode 100644 index 994e40246b..0000000000 --- a/config/samples/run_v1alpha3_tanzukubernetesrelease.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: TanzuKubernetesRelease -metadata: - name: tanzukubernetesrelease-sample -spec: - # TODO(user): Add fields here diff --git a/docs/README.md b/docs/README.md index a5076b5d03..2ff5015571 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,9 +5,7 @@ writing or editing documents. ## Table of Contents -* [API Machinery](api-machinery/README.md) -* [CLI](cli/README.md) +* [API Machinery](runtime-core/README.md) * [Dev](dev/README.md) * [Documentation Style Guide](style-guide.md) * [Release](release/README.md) -* [Use Cases](framework-use-cases.md) diff --git a/docs/cli/README.md b/docs/cli/README.md deleted file mode 100644 index 200c806c80..0000000000 --- a/docs/cli/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# CLI - -Documentation for the Tanzu CLI. - -## Table of Contents - -* [CLI Architecture](../../cli/core/docs/cli/cli-architecture.md) -* [Commands and Flags Deprecation Policy](../../cli/core/docs/cli/deprecation.md) -* [Getting Started with Tanzu CLI](getting-started.md) -* [Plugin Implementation Guide](../../cli/core/docs/cli/plugin_implementation_guide.md) -* [Style Guide](../../cli/core/docs/cli/style_guide.md) -* [TKG Library](tkgctl/README.md) -* [Unstable Plugin Versions](unstable-versions.md) diff --git a/docs/cli/clusterclass/README.md b/docs/cli/clusterclass/README.md deleted file mode 100644 index 73c0a0f8ee..0000000000 --- a/docs/cli/clusterclass/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# ClusterClass Support - -This is a collection of documents related to ClusterClass-based Cluster Lifecycle Management - -## Table of Contents - -* [Overview](cluster-class-support.md) -* [Mapping legacy configuration values to ClusterClass fields/variables](legacy-to-cc-variable-mapping.md) -* [ClusterClass based management cluster creation](../tkgctl/management-cluster-using-clusterclass.md) -* [ClusterClass Developer Tips](cluster-class-dev.md) diff --git a/docs/cli/clusterclass/cluster-class-dev.md b/docs/cli/clusterclass/cluster-class-dev.md deleted file mode 100644 index d3a8a58976..0000000000 --- a/docs/cli/clusterclass/cluster-class-dev.md +++ /dev/null @@ -1,26 +0,0 @@ -# Tips when developing ClusterClassc for the Tanzu CLI - -## Deploying new CC/templates - -Any new set of ClusterClass definition, along with their associated templates can -be directly applied to the management cluster. - -## Updating existing CC/templates - -Any CC (and templates associated with it) is immutable if it is being -referenced by an existing Cluster object. To make modifications to them, said -reference has to be removed (e.g. by deleting the Cluster) - -## When debugging/modifying CCs deployed via Carvel packages - -Further complications arise for CC/templates deployed through a package, as -any modifications successfully done to them can subsequently be undone when -packages reconciles the CC/templates back to its 'expected' state. -To prevent that from happening, ensure that the "paused: true" field is set on -the .spec of the appropriate PackageInstall resources. For instance, in the -case of the AWS infra provider, this means updating the following -PackageInstall resources: tkg, tkg-clusterclass, tkg-clusterclass-aws - -## Others - -(more to be added) diff --git a/docs/cli/clusterclass/cluster-class-support.md b/docs/cli/clusterclass/cluster-class-support.md deleted file mode 100644 index fd877d53f1..0000000000 --- a/docs/cli/clusterclass/cluster-class-support.md +++ /dev/null @@ -1,73 +0,0 @@ -# Support for ClusterClass-based Cluster Lifecycle Management - -## Introduction - -The ClusterClass functionality in Cluster API supports the server-side -management CAPI cluster topologies. By leveraging this functionality -not only will we be able to encapsulate common cluster configuration -scenarios at the server end in a reusable fashion, we will also be able -eliminate a significant fraction of client-side processing required to create a -workload cluster today. - -Readers interested in finding out more about Cluster API ClusterClass -are welcomed to check out the Cluster API Book [section](https://cluster-api.sigs.k8s.io/tasks/experimental-features/cluster-class/index.html) -as well as additional documentation on [writing a clusterclass](https://cluster-api.sigs.k8s.io/tasks/experimental-features/cluster-class/write-clusterclass.html) - -## Status - -ClusterClass-based Cluster Lifecycle Management is not enable by default, but -gated by a CLI-side feature flag `global.package-based-lcm-beta`. The work to -enable it by default is being tracked in issue [2772](https://github.com/vmware-tanzu/tanzu-framework/issues/2772). - -## Approach - -To introduce ClusterClass in a backward-compatible fashion, the CLI will -continue to accept the legacy cluster configuratiion file (based on flat -key-value pairs) as well as a CAPI ClusterClass-based Cluster resource as -appropriate for the target infrastructure. The latter is sometimes referred to -as the 'CCluster.yaml' - -Where possible, legacy configuration will be translated into a CCluster.yaml, -and users will be urged to use the new format where possible in the future. -See [this document](legacy-to-cc-variable-mapping.md) for more details on how -the legacy configuration values are being translated. - -All the existing ytt-based client-side templates are retained for situations -where they still need to be used to generate the cluster configuration -entirely at the CLI end. - -Since existing ytt overlays are retained verbatim, new files to support -ClusterClass are introduced in a non-overlapping fashion as separate -directories (name 'yttcc' and 'cconly') across all supported target -infrastructures. - -*yttcc/* : contains overlays required to translate legacy config values into -CCluster.yaml. They will be included in an upcoming version of the CLI which -supports ClusterClass-based cluster creation. - -*cconly/* : contains overlays required configure the ClusterClass and associated -templates themselves. They are included for development purposes for now, but -are not expected to be installed on the CLI host. The reason for this is that -ClusterClass's and their associate templates are being assembled as Carvel -packages and deployed to the bootstrap cluster and management cluster through -these packages (to enable ClusterClass-based creation of the management cluster -and workload clusters respectively). One can assume that there will always be a -default set of ClusterClass and templates on each Management Cluster deployed. - -Note: To enable the deployment of Carvel packageson the bootstrap cluster, -[kapp-controller](https://carvel.dev/kapp-controller/) is now installed into -the bootstrap cluster as well. - -See [here](../../packages/README.md) for more information regarding defining -new packages in this repository. - -## ClusterClass Based Management Cluster Creation - -Just like workload cluster creation, management cluster creation has also been -updated to leverage ClusterClass. To enable this, the bootstrap cluster -will be deployed with the default clusterclass appropriate for the target -infrastructure, and updated to support Carvel package installation (so as to be -able to install the clusterclass package in the first place). - -More details on the updated manage cluster creation workflow is available -[here](../tkgctl/management-cluster-using-clusterclass.md). diff --git a/docs/cli/clusterclass/legacy-to-cc-variable-mapping.md b/docs/cli/clusterclass/legacy-to-cc-variable-mapping.md deleted file mode 100644 index 6383165754..0000000000 --- a/docs/cli/clusterclass/legacy-to-cc-variable-mapping.md +++ /dev/null @@ -1,587 +0,0 @@ -# Mapping legacy configuration values to cluster class fields/variables - -## Introduction - -The configuration variable space used for configuring Tanzu Clusters in the -Tanzu CLI has roots in CAPI/ClusterCtl, has persisted since the its -introduction in the TKG CLI (Tanzu CLI’s predecessor) and still to this day -employs a flat key-value style. - -As part of the backwards compatibility handling to support the use of legacy -configuration files based on the above, these legacy variables are being mapped -to ClusterClass fields and variables. We will levarage the flexibility afforded by -OpenAPI v3 schema types to better organize and name the variables. - -## Scope - -General efforts are being made to consolidate the variables and provide some -consistency in the naming and casing style of the variables. - -Below are sample representations of the variables section in the default cluster -classes provided for each the CAPA/CAPZ/CAPV infrastructure providers supported -in this repository and the corresponding legacy configuration values they correspond to. - - - - -### AWS Provider - - - - - - - - - - - -
ClusterClass Variables Legacy Cluster Config Values
- -```yaml -variables: -- name: proxy - value: - httpProxy: http://10.0.0.1 - httpsProxy: https://10.0.0.1 - noProxy: - - .svc.cluster.local - - 192.168.1.1 - - … -- name: imageRepository - value: - host: stg-project.vmware.com - tlsCertificateValidation: - enabled: true -- name: trust - value: - - name: proxy - data: LS0tLS1… - - name: imageRepository - data: LS0tLS1… -- name: plan - value: prodcc -- name: region - value: us-west-2 -- name: vpc - value: - cidr: 10.0.0.0/16 - id: "" -- name: identityRef - value: - kind: AWSClusterRoleIdentity - name: "" -- name: loadBalancerSchemeInternal - value: false -- name: bastionHost - value: - enabled: true -- name: securityGroup - value: - controlPlane: sg-12345 - apiServerLB: sg-12345 - bastion: sg-12345 - lb: sg-12345 - node: sg-12345 -- name: subnets - value: - - private: - cidr: 10.0.0.0/24 - id: "" - public: - cidr: 10.0.1.0/24 - id: "" - az: us-west-2a - - private: - cidr: 10.0.2.0/24 - id: "" - public: - cidr: 10.0.3.0/24 - id: "" - az: us-west-2b - - private: - cidr: 10.0.4.0/24 - id: "" - public: - cidr: 10.0.5.0/24 - id: "" - az: us-west-2c -- name: worker - value: - instanceType: m5.xlarge - rootVolume: - sizeGiB: 80 -- name: controlPlane - value: - instanceType: t3.medium - rootVolume: - sizeGiB: 80 - -workers: (see +++) - machineDeployments: - - class: tkg-worker - name: md-0 - replicas: 2 - failureDomain: us-west-2a - variables: - overrides: - - name: worker - value: - instanceType: m5.small - rootVolume: - sizeGiB: 80 - - class: tkg-worker - name: md-1 - replicas: 2 - failureDomain: us-west-2b - variables: - overrides: - - name: worker - value: - instanceType: t3.small - rootVolume: - sizeGiB: 40 - - class: tkg-worker - name: md-2 - replicas: 2 - failureDomain: us-west-2c - variables: - overrides: - - name: worker - value: - instanceType: t3.xlarge - rootVolume: - sizeGiB: 120 -``` - - - -```yaml - -TKG_HTTP_PROXY_ENABLED: true - -TKG_HTTP_PROXY: http://10.0.0.1 -TKG_HTTPS_PROXY: https://10.0.0.1 -TKG_NO_PROXY: 192.168.1.1 - - - - - -TKG_CUSTOM_IMAGE_REPOSITORY: stg-project.vmware.com -TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: false - - -TKG_PROXY_CA_CERT: LS0tLS1… - -TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: LS0tLS1… - -CLUSTER_PLAN: prod - -AWS_REGION: us-west-2 - - - -AWS_VPC_CIDR: 10.0.0.0/16 -AWS_VPC_ID: “” - - -AWS_IDENTITY_REF_KIND: AWSClusterRoleIdentity -AWS_IDENTITY_REF_NAME: -AWS_LOAD_BALANCER_SCHEME_INTERNAL: false - -BASTION_HOST_ENABLED: true - - - -AWS_SECURITY_GROUP_CONTROLPLANE: sg-12345 -AWS_SECURITY_GROUP_APISERVER_LB: sg-12345 -AWS_SECURITY_GROUP_BASTION: sg-12345 -AWS_SECURITY_GROUP_LB: sg-12345 -AWS_SECURITY_GROUP_NODE: sg-12345 - - - -AWS_PRIVATE_NODE_CIDR: 10.0.0.0/24 -AWS_PRIVATE_NODE_ID: - -AWS_PUBLIC_NODE_CIDR: 10.0.1.0/24 -AWS_PUBLIC_NODE_ID: -AWS_NODE_AZ: us-west-2a - -AWS_PRIVATE_NODE_CIDR_1: 10.0.2.0/24 -AWS_PRIVATE_NODE_ID_1: - -AWS_PUBLIC_NODE_CIDR_1: 10.0.3.0/24 -AWS_PUBLIC_NODE_ID_1: -AWS_NODE_AZ_1: us-west-2b - -AWS_PRIVATE_NODE_CIDR_2: 10.0.4.0/24 -AWS_PRIVATE_NODE_ID_2: - -AWS_PUBLIC_NODE_CIDR_2: 10.0.5.0/24 -AWS_PUBLIC_NODE_ID_2: -AWS_NODE_AZ_2: us-west-2c - - -NODE_MACHINE_TYPE: m5.xlarge - -AWS_NODE_OS_DISK_SIZE_GIB: 80 - - -CONTROL_PLANE_MACHINE_TYPE: t3.medium - -AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB: 80 - - - - - -WORKER_MACHINE_COUNT: 2 -AWS_NODE_AZ: us-west-2a - - - - -NODE_MACHINE_TYPE: m5.small - -AWS_NODE_OS_DISK_SIZE_GIB: 80 - - -WORKER_MACHINE_COUNT_1: 2 -AWS_NODE_AZ_1: us-west-2b - - - - -NODE_MACHINE_TYPE_1: t3.small - -Not Present This value is inherited from AWS_NODE_OS_DISK_SIZE_GIB in current clusters - -WORKER_MACHINE_COUNT_2: 2 -AWS_NODE_AZ_2: us-west-2c -``` - -
- - -_+++_: Providing the machineDeployments section as an example of how multi -node-pool deployments can be customized. It is omitted in Azure and vSphere, -but they will both behave in the same way. - - -### Azure Provider - - - - - - - - - - - -
ClusterClass Variables Legacy Cluster Config Values
- -```yaml -variables: -- name: proxy - value: - httpProxy: http://10.0.0.1 - httpsProxy: https://10.0.0.1 - noProxy: - - .svc.cluster.local - - 192.168.1.1 - - … -- name: imageRepository - value: - host: stg-project.vmware.com - tlsCertifcateValidation: - enabled: false -- name: trust - value: - - name: proxy - data: LS0tLS1… - - name: imageRepository - data: LS0tLS1… -- name: location - value: westus -- name: resourceGroup - value: "" -- name: subscriptionID - value: 6c2a2ce1-649f-9d9k-a19c-c729h3cf6126 -- name: environment - value: AzurePublicCloud -- name: sshPublicKey - value: c3NoLXJzYSBB -- name: acceleratedNetworking - value: - enabled: true -- name: enablePrivateCluster - value: false -- name: frontendPrivateIP - value: 22.22.22.22 -- name: vnet - value: - cidr: 10.0.0.0/8 - name: azure-vnet-name - resourceGroup: azure-vnet-resource-group -- name: identity - value: - name: test-identity1 - namespace: test-ns1 -- name: controlPlane - value: - dataDisks: - - sizeGiB: 256 - machineType: i3.xlarge - osDisk: - sizeGiB: 128 - storageAccountType: Premi - outboundLB: - enabled: true - frontendIPCount: 3 - subnet: - cidr: 10.0.0.0/24 - securityGroup: SecurityGro -- name: worker - value: - machineType: Standard_Dv2s - osDisk: - sizeGiB: 128 - storageAccountType: Premium_LRS - dataDisks: - - sizeGiB: 256 - outboundLB: - enabled: true - frontendIPCount: 1 - idleTimeoutInMinutes: 8 - subnet: - cidr: 10.1.0.0/16 - securityGroup: SecurityGroup -``` - - - -```yaml - -TKG_HTTP_PROXY_ENABLED: true - -TKG_HTTP_PROXY: http://10.0.0.1 -TKG_HTTPS_PROXY: https://10.0.0.1 -TKG_NO_PROXY: 192.168.1.1 - - - - - -TKG_CUSTOM_IMAGE_REPOSITORY: stg-project.vmware.com -TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: true - - - -TKG_PROXY_CA_CERT: LS0tLS1… -TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: LS0tLS1 - -AZURE_LOCATION: westus - -AZURE_RESOURCE_GROUP: - -AZURE_SUBSCRIPTION_ID: 6c2a2ce1-649f-9d9k-a19c - -AZURE_ENVIRONMENT: AzurePublicCloud - -AZURE_SSH_PUBLIC_KEY_B64: c3NoLXJzYSBB - -AZURE_ENABLE_ACCELERATED_NETWORKING: true - -AZURE_ENABLE_PRIVATE_CLUSTER: false - -AZURE_FRONTEND_PRIVATE_IP: 22.22.22.22 - - - -AZURE_VNET_CIDR: 10.0.0.0/8 -AZURE_VNET_NAME: azure-vnet-name -AZURE_VNET_RESOURCE_GROUP: azure-vnet-resource-group - - -AZURE_IDENTITY_NAME: test-identity1 -AZURE_IDENTITY_NAMESPACE: test-ns1 - - - -AZURE_CONTROL_PLANE_DATA_DISK_SIZE: 512 -AZURE_CONTROL_PLANE_MACHINE_TYPE: Standard_B2s - -AZURE_CONTROL_PLANE_OS_DISK_SIZE: 256 -AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE: Premi - -AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB: true -AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT: 3 - -AZURE_CONTROL_PLANE_SUBNET_CIDR: 10.1.0.0/16 -AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP: SecurityGro - - -AZURE_NODE_MACHINE_TYPE: Standard_Dv2s - -AZURE_NODE_OS_DISK_SIZE: 256 -AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE: Premium_LRS -AZURE_ENABLE_NODE_DATA_DISK: true -AZURE_NODE_DATA_DISK_SIZE_GIB: - -AZURE_ENABLE_NODE_OUTBOUND_LB: true -AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT: 1 -AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES: 8 - -AZURE_NODE_SUBNET_CIDR: 10.1.0.0/16 -AZURE_NODE_SUBNET_SECURITY_GROUP: SecurityGroup -``` - -
- -### Management Cluster Based vSphere Provider - - - - - - - - - - -
ClusterClass Variables Legacy Cluster Config Values
- -```yaml -variables: -- name: proxy - value: - httpProxy: http://10.0.0.1 - httpsProxy: https://10.0.0.1 - noProxy: - - .svc.cluster.local - - 192.168.1.1 - - … -- name: imageRepository - value: - host: stg-project.vmware.com - tlsCertificateValidation: - enabled: false -- name: trust - value: - - name: proxy - data: LS0tLS1… - - name: imageRepository - data: LS0tLS1… -- name: apiServerEndpoint - value: 10.10.10.10 -- name: aipServerPort - value: 443 -- name: vipNetworkInterface - value: eth0 -- name: aviControlPlaneHAProvider - value: false -- name: auditLogging - value: - enabled: true -- name: vcenter - value: - cloneMode: fullClone - datacenter: /dc0 - datastore: ds1 - folder: vm0 - network: TESTNETWORK - resourcePool: rp0 - server: somehostname - storagePolicyID: "" - template: photon-3-v1.19.3+vmware.1 - tlsThumbprint: dummythumbprint -- name: controlPlane - value: - count: 5 - machine: - diskGiB: 40 - memoryMiB: 8192 - numCPUs: 2 -- name: worker - value: - count: 3 - machine: - diskGiB: 20 - memoryMiB: 4096 - numCPUs: 2 -- name: user - value: - sshAuthorizedKey: ssh-rsa A -``` - - - -```yaml - -TKG_HTTP_PROXY_ENABLED: true - -TKG_HTTP_PROXY: http://10.0.0.1 -TKG_HTTPS_PROXY: https://10.0.0.1 -TKG_NO_PROXY: 192.168.1.1 - - - - - -TKG_CUSTOM_IMAGE_REPOSITORY: stg-project.vmware.com -TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: true - - - -TKG_PROXY_CA_CERT: LS0tLS1… - -TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: LS0tLS1… - -VSPHERE_CONTROL_PLANE_ENDPOINT: 10.10.10.10 - -CLUSTER_API_SERVER_PORT: 443 - -VIP_NETWORK_INTERFACE: eth0 - -AVI_CONTROL_PLANE_HA_PROVIDER: false - -ENABLE_AUDIT_LOGGING:true - - - - -VSPHERE_CLONE_MODE: fullClone -VSPHERE_DATACENTER: /dc0 -VSPHERE_DATASTORE: ds1 -VSPHERE_FOLDER: vm0 -VSPHERE_NETWORK: TESTNETWORK -VSPHERE_RESOURCE_POOL: rp0 -VSPHERE_SERVER: somehostname -VSPHERE_STORAGE_POLICY_ID: -VSPHERE_TEMPLATE: photon-3-v1.19.3+vmware.1 -VSPHERE_TLS_THUMBPRINT: dummythumbprint - - -CONTROL_PLANE_MACHINE_COUNT: 5 - - - - - - -WORKER_MACHINE_COUNT: 3 - - - - - - -VSPHERE_SSH_AUTHORIZED_KEY: ssh-rsa A -``` - -
- diff --git a/docs/cli/commands/README.md b/docs/cli/commands/README.md deleted file mode 100644 index 6bd24fee3f..0000000000 --- a/docs/cli/commands/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# CLI Command Docs - -The provided documentation is autogenerated from the CLI and the core plugins. - -## Core Command - -The [root command](tanzu.md) is a good place to begin discovering the CLI command structure. - -## Core Plugins - - -- [feature](tanzu_feature.md) -- [management-cluster](tanzu_management-cluster.md) -- [package](tanzu_package.md) -- [pinniped-auth](tanzu_pinniped-auth.md) -- [secret](tanzu_secret.md) -- [telemetry](tanzu_telemetry.md) -- [builder](tanzu_builder.md) -- [cluster](tanzu_cluster.md) -- [codegen](tanzu_codegen.md) -- [kubernetes-release](tanzu_kubernetes-release.md) -- [login](tanzu_login.md) -- [test](tanzu_test.md) diff --git a/docs/cli/commands/tanzu.md b/docs/cli/commands/tanzu.md deleted file mode 100644 index b661b3edd6..0000000000 --- a/docs/cli/commands/tanzu.md +++ /dev/null @@ -1,31 +0,0 @@ -## tanzu - -Tanzu CLI - -### Options - -``` - -h, --help help for tanzu -``` - -### SEE ALSO - -* [tanzu builder](tanzu_builder.md) - Build Tanzu components -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations -* [tanzu codegen](tanzu_codegen.md) - Tanzu code generation tool -* [tanzu completion](tanzu_completion.md) - Output shell completion code -* [tanzu config](tanzu_config.md) - Configuration for the CLI -* [tanzu feature](tanzu_feature.md) - Operate on features and featuregates -* [tanzu init](tanzu_init.md) - Initialize the CLI -* [tanzu kubernetes-release](tanzu_kubernetes-release.md) - Kubernetes release operations -* [tanzu login](tanzu_login.md) - Login to the platform -* [tanzu management-cluster](tanzu_management-cluster.md) - Kubernetes management cluster operations -* [tanzu package](tanzu_package.md) - Tanzu package management -* [tanzu plugin](tanzu_plugin.md) - Manage CLI plugins -* [tanzu secret](tanzu_secret.md) - Tanzu secret management -* [tanzu telemetry](tanzu_telemetry.md) - configure cluster-wide settings for vmware tanzu telemetry -* [tanzu test](tanzu_test.md) - Test the CLI -* [tanzu update](tanzu_update.md) - Update the CLI -* [tanzu version](tanzu_version.md) - Version information - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_alpha.md b/docs/cli/commands/tanzu_alpha.md deleted file mode 100644 index 63174108e0..0000000000 --- a/docs/cli/commands/tanzu_alpha.md +++ /dev/null @@ -1,15 +0,0 @@ -## tanzu alpha - -Alpha CLI commands - -### Options - -``` - -h, --help help for alpha -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - - -###### Auto generated by spf13/cobra on 10-May-2021 diff --git a/docs/cli/commands/tanzu_builder.md b/docs/cli/commands/tanzu_builder.md deleted file mode 100644 index ca352ab5d7..0000000000 --- a/docs/cli/commands/tanzu_builder.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu builder - -Build Tanzu components - -### Options - -``` - -h, --help help for builder -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu builder cli](tanzu_builder_cli.md) - Build CLIs -* [tanzu builder completion](tanzu_builder_completion.md) - Generate the autocompletion script for the specified shell -* [tanzu builder init](tanzu_builder_init.md) - Initialize a new plugin repository -* [tanzu builder publish](tanzu_builder_publish.md) - Publish operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_builder_cli.md b/docs/cli/commands/tanzu_builder_cli.md deleted file mode 100644 index e1a36deffc..0000000000 --- a/docs/cli/commands/tanzu_builder_cli.md +++ /dev/null @@ -1,17 +0,0 @@ -## tanzu builder cli - -Build CLIs - -### Options - -``` - -h, --help help for cli -``` - -### SEE ALSO - -* [tanzu builder](tanzu_builder.md) - Build Tanzu components -* [tanzu builder cli add-plugin](tanzu_builder_cli_add-plugin.md) - Add a plugin to a repository -* [tanzu builder cli compile](tanzu_builder_cli_compile.md) - Compile a repository - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_builder_cli_add-plugin.md b/docs/cli/commands/tanzu_builder_cli_add-plugin.md deleted file mode 100644 index b5028eabc4..0000000000 --- a/docs/cli/commands/tanzu_builder_cli_add-plugin.md +++ /dev/null @@ -1,21 +0,0 @@ -## tanzu builder cli add-plugin - -Add a plugin to a repository - -``` -tanzu builder cli add-plugin NAME [flags] -``` - -### Options - -``` - --description string Required plugin description - --dry-run Print generated files to stdout - -h, --help help for add-plugin -``` - -### SEE ALSO - -* [tanzu builder cli](tanzu_builder_cli.md) - Build CLIs - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_builder_cli_compile.md b/docs/cli/commands/tanzu_builder_cli_compile.md deleted file mode 100644 index 4ed5b0ff5e..0000000000 --- a/docs/cli/commands/tanzu_builder_cli_compile.md +++ /dev/null @@ -1,28 +0,0 @@ -## tanzu builder cli compile - -Compile a repository - -``` -tanzu builder cli compile [flags] -``` - -### Options - -``` - --artifacts string Path to output artifacts (default "artifacts") - --corepath string Path for core binary - --goprivate string Comma-separated list of glob patterns of module path prefixes to set as GOPRIVATE on build - -h, --help help for compile - --ldflags string ldflags to set on build - --match string Match a plugin name to build, supports globbing (default "*") - --path string Path of the plugins source directory (default "./cmd/cli/plugin") - --tags string Tags to set on build - --target stringArray Only compile for specific target(s), use 'local' to compile for host os (default [all]) - --version string Version of the root cli (required) -``` - -### SEE ALSO - -* [tanzu builder cli](tanzu_builder_cli.md) - Build CLIs - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_builder_completion.md b/docs/cli/commands/tanzu_builder_completion.md deleted file mode 100644 index a730eb6420..0000000000 --- a/docs/cli/commands/tanzu_builder_completion.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu builder completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for builder for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### SEE ALSO - -* [tanzu builder](tanzu_builder.md) - Build Tanzu components -* [tanzu builder completion bash](tanzu_builder_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu builder completion fish](tanzu_builder_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu builder completion powershell](tanzu_builder_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu builder completion zsh](tanzu_builder_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_builder_completion_bash.md b/docs/cli/commands/tanzu_builder_completion_bash.md deleted file mode 100644 index bbf2e233cb..0000000000 --- a/docs/cli/commands/tanzu_builder_completion_bash.md +++ /dev/null @@ -1,44 +0,0 @@ -## tanzu builder completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(builder completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - builder completion bash > /etc/bash_completion.d/builder - -#### macOS: - - builder completion bash > $(brew --prefix)/etc/bash_completion.d/builder - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu builder completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu builder completion](tanzu_builder_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_builder_completion_fish.md b/docs/cli/commands/tanzu_builder_completion_fish.md deleted file mode 100644 index 35ac41858a..0000000000 --- a/docs/cli/commands/tanzu_builder_completion_fish.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu builder completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - builder completion fish | source - -To load completions for every new session, execute once: - - builder completion fish > ~/.config/fish/completions/builder.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu builder completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu builder completion](tanzu_builder_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_builder_completion_powershell.md b/docs/cli/commands/tanzu_builder_completion_powershell.md deleted file mode 100644 index 09db004c8a..0000000000 --- a/docs/cli/commands/tanzu_builder_completion_powershell.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu builder completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - builder completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu builder completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu builder completion](tanzu_builder_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_builder_completion_zsh.md b/docs/cli/commands/tanzu_builder_completion_zsh.md deleted file mode 100644 index b5a66cb2b2..0000000000 --- a/docs/cli/commands/tanzu_builder_completion_zsh.md +++ /dev/null @@ -1,46 +0,0 @@ -## tanzu builder completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(builder completion zsh); compdef _builder builder - -To load completions for every new session, execute once: - -#### Linux: - - builder completion zsh > "${fpath[1]}/_builder" - -#### macOS: - - builder completion zsh > $(brew --prefix)/share/zsh/site-functions/_builder - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu builder completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu builder completion](tanzu_builder_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_builder_init.md b/docs/cli/commands/tanzu_builder_init.md deleted file mode 100644 index e31d759ebd..0000000000 --- a/docs/cli/commands/tanzu_builder_init.md +++ /dev/null @@ -1,30 +0,0 @@ -## tanzu builder init - -Initialize a new plugin repository - -### Synopsis - -Initialize a new plugin repository with scaffolding for: - -* Tanzu Framework CLI integration -* GolangCI linting config -* GitHub or GitLab CI config -* A Makefile - -``` -tanzu builder init PLUGIN_NAME [flags] -``` - -### Options - -``` - --dry-run Print generated files to stdout - -h, --help help for init - --repo-type string Type of repository: github or gitlab -``` - -### SEE ALSO - -* [tanzu builder](tanzu_builder.md) - Build Tanzu components - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_builder_publish.md b/docs/cli/commands/tanzu_builder_publish.md deleted file mode 100644 index 8288754414..0000000000 --- a/docs/cli/commands/tanzu_builder_publish.md +++ /dev/null @@ -1,28 +0,0 @@ -## tanzu builder publish - -Publish operations - -``` -tanzu builder publish [flags] -``` - -### Options - -``` - -h, --help help for publish - --input-artifact-dir string Artifact directory which is a output of 'tanzu builder cli compile' command. - --local-output-discovery-dir string Local output directory where CLIPlugin resource yamls for discovery will be placed. Applicable to 'local' type. - --local-output-distribution-dir string Local output directory where plugin binaries will be placed. Applicable to 'local' type. - --oci-discovery-image string Image path to publish oci image with CLIPlugin resource yamls. Applicable to 'oci' type. - --oci-distribution-image-repository string Image path prefix to publish oci image for plugin binaries. Applicable to 'oci' type. - --os-arch string List of OS architectures. (default "darwin-amd64 linux-amd64 windows-amd64") - --plugins string List of plugin names. Example: 'login management-cluster cluster' - --type string Type of discovery and distribution for publishing plugins. Supported: local, oci - --version string Recommended version of the plugins. -``` - -### SEE ALSO - -* [tanzu builder](tanzu_builder.md) - Build Tanzu components - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster.md b/docs/cli/commands/tanzu_cluster.md deleted file mode 100644 index a85e0d0421..0000000000 --- a/docs/cli/commands/tanzu_cluster.md +++ /dev/null @@ -1,29 +0,0 @@ -## tanzu cluster - -Kubernetes cluster operations - -### Options - -``` - -h, --help help for cluster - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu cluster available-upgrades](tanzu_cluster_available-upgrades.md) - Get upgrade information for a cluster -* [tanzu cluster completion](tanzu_cluster_completion.md) - Generate the autocompletion script for the specified shell -* [tanzu cluster create](tanzu_cluster_create.md) - Create a cluster -* [tanzu cluster credentials](tanzu_cluster_credentials.md) - Cluster credentials operations -* [tanzu cluster delete](tanzu_cluster_delete.md) - Delete a cluster -* [tanzu cluster get](tanzu_cluster_get.md) - Get details from a cluster -* [tanzu cluster kubeconfig](tanzu_cluster_kubeconfig.md) - Cluster kubeconfig operations -* [tanzu cluster list](tanzu_cluster_list.md) - List clusters -* [tanzu cluster machinehealthcheck](tanzu_cluster_machinehealthcheck.md) - MachineHealthCheck operations for a cluster -* [tanzu cluster node-pool](tanzu_cluster_node-pool.md) - Cluster node-pool operations -* [tanzu cluster scale](tanzu_cluster_scale.md) - Scale a cluster -* [tanzu cluster upgrade](tanzu_cluster_upgrade.md) - Upgrade a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_available-upgrades.md b/docs/cli/commands/tanzu_cluster_available-upgrades.md deleted file mode 100644 index 73fe99f726..0000000000 --- a/docs/cli/commands/tanzu_cluster_available-upgrades.md +++ /dev/null @@ -1,27 +0,0 @@ -## tanzu cluster available-upgrades - -Get upgrade information for a cluster - -### Synopsis - -Get upgrade information for a cluster - -### Options - -``` - -h, --help help for available-upgrades -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations -* [tanzu cluster available-upgrades get](tanzu_cluster_available-upgrades_get.md) - Get all available upgrades for a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_available-upgrades_get.md b/docs/cli/commands/tanzu_cluster_available-upgrades_get.md deleted file mode 100644 index 61b666fec3..0000000000 --- a/docs/cli/commands/tanzu_cluster_available-upgrades_get.md +++ /dev/null @@ -1,31 +0,0 @@ -## tanzu cluster available-upgrades get - -Get all available upgrades for a cluster - -### Synopsis - -Get all available upgrades for a cluster - -``` -tanzu cluster available-upgrades get CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for get - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified (default "default") -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster available-upgrades](tanzu_cluster_available-upgrades.md) - Get upgrade information for a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_completion.md b/docs/cli/commands/tanzu_cluster_completion.md deleted file mode 100644 index d2b22c00b7..0000000000 --- a/docs/cli/commands/tanzu_cluster_completion.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu cluster completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for cluster for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations -* [tanzu cluster completion bash](tanzu_cluster_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu cluster completion fish](tanzu_cluster_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu cluster completion powershell](tanzu_cluster_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu cluster completion zsh](tanzu_cluster_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_completion_bash.md b/docs/cli/commands/tanzu_cluster_completion_bash.md deleted file mode 100644 index c9281936db..0000000000 --- a/docs/cli/commands/tanzu_cluster_completion_bash.md +++ /dev/null @@ -1,51 +0,0 @@ -## tanzu cluster completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(cluster completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - cluster completion bash > /etc/bash_completion.d/cluster - -#### macOS: - - cluster completion bash > $(brew --prefix)/etc/bash_completion.d/cluster - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu cluster completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster completion](tanzu_cluster_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_completion_fish.md b/docs/cli/commands/tanzu_cluster_completion_fish.md deleted file mode 100644 index 73a8a7dee5..0000000000 --- a/docs/cli/commands/tanzu_cluster_completion_fish.md +++ /dev/null @@ -1,42 +0,0 @@ -## tanzu cluster completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - cluster completion fish | source - -To load completions for every new session, execute once: - - cluster completion fish > ~/.config/fish/completions/cluster.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu cluster completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster completion](tanzu_cluster_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_completion_powershell.md b/docs/cli/commands/tanzu_cluster_completion_powershell.md deleted file mode 100644 index ed2d1529bd..0000000000 --- a/docs/cli/commands/tanzu_cluster_completion_powershell.md +++ /dev/null @@ -1,39 +0,0 @@ -## tanzu cluster completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - cluster completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu cluster completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster completion](tanzu_cluster_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_completion_zsh.md b/docs/cli/commands/tanzu_cluster_completion_zsh.md deleted file mode 100644 index cbda70d517..0000000000 --- a/docs/cli/commands/tanzu_cluster_completion_zsh.md +++ /dev/null @@ -1,53 +0,0 @@ -## tanzu cluster completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(cluster completion zsh); compdef _cluster cluster - -To load completions for every new session, execute once: - -#### Linux: - - cluster completion zsh > "${fpath[1]}/_cluster" - -#### macOS: - - cluster completion zsh > $(brew --prefix)/share/zsh/site-functions/_cluster - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu cluster completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster completion](tanzu_cluster_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_create.md b/docs/cli/commands/tanzu_cluster_create.md deleted file mode 100644 index 06866854c2..0000000000 --- a/docs/cli/commands/tanzu_cluster_create.md +++ /dev/null @@ -1,29 +0,0 @@ -## tanzu cluster create - -Create a cluster - -``` -tanzu cluster create CLUSTER_NAME [flags] -``` - -### Options - -``` - -d, --dry-run Does not create cluster, but show the deployment YAML instead - -f, --file string Configuration file or Cluster objects from which to create a cluster - -h, --help help for create - --tkr string TanzuKubernetesRelease(TKr) to be used for creating the workload cluster. If TKr name prefix is provided, the latest compatible TKr matching the TKr name prefix would be used -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_credentials.md b/docs/cli/commands/tanzu_cluster_credentials.md deleted file mode 100644 index 419f0c3b69..0000000000 --- a/docs/cli/commands/tanzu_cluster_credentials.md +++ /dev/null @@ -1,23 +0,0 @@ -## tanzu cluster credentials - -Cluster credentials operations - -### Options - -``` - -h, --help help for credentials -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations -* [tanzu cluster credentials update](tanzu_cluster_credentials_update.md) - Update credentials for a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_credentials_update.md b/docs/cli/commands/tanzu_cluster_credentials_update.md deleted file mode 100644 index 2f3149f057..0000000000 --- a/docs/cli/commands/tanzu_cluster_credentials_update.md +++ /dev/null @@ -1,29 +0,0 @@ -## tanzu cluster credentials update - -Update credentials for a cluster - -``` -tanzu cluster credentials update CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for update - -n, --namespace string The namespace of the cluster to be updated - --vsphere-password string Password for vSphere provider - --vsphere-user string Username for vSphere provider -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster credentials](tanzu_cluster_credentials.md) - Cluster credentials operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_delete.md b/docs/cli/commands/tanzu_cluster_delete.md deleted file mode 100644 index 4d93b94124..0000000000 --- a/docs/cli/commands/tanzu_cluster_delete.md +++ /dev/null @@ -1,28 +0,0 @@ -## tanzu cluster delete - -Delete a cluster - -``` -tanzu cluster delete CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for delete - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified. - -y, --yes Delete workload cluster without asking for confirmation -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_get.md b/docs/cli/commands/tanzu_cluster_get.md deleted file mode 100644 index df55d0bf0a..0000000000 --- a/docs/cli/commands/tanzu_cluster_get.md +++ /dev/null @@ -1,30 +0,0 @@ -## tanzu cluster get - -Get details from a cluster - -``` -tanzu cluster get CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for get - -n, --namespace string The namespace from which to get workload clusters. If not provided clusters from all namespaces will be returned - --show-all-conditions string List of comma separated kind or kind/name for which we should show all the object's conditions (all to show conditions for all the objects) - --show-details Show details of MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object - --show-group-members Expand machine groups whose ready condition has the same Status, Severity and Reason -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_kubeconfig.md b/docs/cli/commands/tanzu_cluster_kubeconfig.md deleted file mode 100644 index c0c929fd9e..0000000000 --- a/docs/cli/commands/tanzu_cluster_kubeconfig.md +++ /dev/null @@ -1,23 +0,0 @@ -## tanzu cluster kubeconfig - -Cluster kubeconfig operations - -### Options - -``` - -h, --help help for kubeconfig -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations -* [tanzu cluster kubeconfig get](tanzu_cluster_kubeconfig_get.md) - Get kubeconfig of a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_kubeconfig_get.md b/docs/cli/commands/tanzu_cluster_kubeconfig_get.md deleted file mode 100644 index d6850adf40..0000000000 --- a/docs/cli/commands/tanzu_cluster_kubeconfig_get.md +++ /dev/null @@ -1,44 +0,0 @@ -## tanzu cluster kubeconfig get - -Get kubeconfig of a cluster - -### Synopsis - -Get kubeconfig of a cluster and merge the context into the default kubeconfig file - -``` -tanzu cluster kubeconfig get CLUSTER_NAME [flags] -``` - -### Examples - -``` - - # Get workload cluster kubeconfig - tanzu cluster kubeconfig get CLUSTER_NAME - - # Get workload cluster admin kubeconfig - tanzu cluster kubeconfig get CLUSTER_NAME --admin -``` - -### Options - -``` - --admin Get admin kubeconfig of the workload cluster - --export-file string File path to export a standalone kubeconfig for workload cluster - -h, --help help for get - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified. -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster kubeconfig](tanzu_cluster_kubeconfig.md) - Cluster kubeconfig operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_list.md b/docs/cli/commands/tanzu_cluster_list.md deleted file mode 100644 index 3782c9d41d..0000000000 --- a/docs/cli/commands/tanzu_cluster_list.md +++ /dev/null @@ -1,29 +0,0 @@ -## tanzu cluster list - -List clusters - -``` -tanzu cluster list [flags] -``` - -### Options - -``` - -h, --help help for list - --include-management-cluster Show active management cluster information as well - -n, --namespace string The namespace from which to list workload clusters. If not provided clusters from all namespaces will be returned - -o, --output string Output format (yaml|json|table) -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck.md deleted file mode 100644 index a36a414138..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck.md +++ /dev/null @@ -1,28 +0,0 @@ -## tanzu cluster machinehealthcheck - -MachineHealthCheck operations for a cluster - -### Synopsis - -Get, set, or delete a MachineHealthCheck object for a Tanzu Kubernetes cluster - -### Options - -``` - -h, --help help for machinehealthcheck -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations -* [tanzu cluster machinehealthcheck control-plane](tanzu_cluster_machinehealthcheck_control-plane.md) - MachineHealthCheck operations for the control plane a cluster -* [tanzu cluster machinehealthcheck node](tanzu_cluster_machinehealthcheck_node.md) - MachineHealthCheck operations for the nodes of a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane.md deleted file mode 100644 index 3c375d8055..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane.md +++ /dev/null @@ -1,29 +0,0 @@ -## tanzu cluster machinehealthcheck control-plane - -MachineHealthCheck operations for the control plane a cluster - -### Synopsis - -Get, set, or delete a MachineHealthCheck object for the control plane of a Tanzu Kubernetes cluster - -### Options - -``` - -h, --help help for control-plane -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster machinehealthcheck](tanzu_cluster_machinehealthcheck.md) - MachineHealthCheck operations for a cluster -* [tanzu cluster machinehealthcheck control-plane delete](tanzu_cluster_machinehealthcheck_control-plane_delete.md) - Delete a MachineHealthCheck object -* [tanzu cluster machinehealthcheck control-plane get](tanzu_cluster_machinehealthcheck_control-plane_get.md) - Get a MachineHealthCheck object -* [tanzu cluster machinehealthcheck control-plane set](tanzu_cluster_machinehealthcheck_control-plane_set.md) - Create or update a MachineHealthCheck for a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane_delete.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane_delete.md deleted file mode 100644 index dc9c65ddc6..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane_delete.md +++ /dev/null @@ -1,33 +0,0 @@ -## tanzu cluster machinehealthcheck control-plane delete - -Delete a MachineHealthCheck object - -### Synopsis - -Delete a MachineHealthCheck object of the control plane of a cluster - -``` -tanzu cluster machinehealthcheck control-plane delete CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for delete - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string The namespace where the MachineHealthCheck object was created, default to the cluster's namespace - -y, --yes Delete the MachineHealthCheck object without asking for confirmation -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster machinehealthcheck control-plane](tanzu_cluster_machinehealthcheck_control-plane.md) - MachineHealthCheck operations for the control plane a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane_get.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane_get.md deleted file mode 100644 index 9afd6b083d..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane_get.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu cluster machinehealthcheck control-plane get - -Get a MachineHealthCheck object - -### Synopsis - -Get a MachineHealthCheck object of the control plane for the given cluster - -``` -tanzu cluster machinehealthcheck control-plane get CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for get - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string The namespace where the MachineHealthCheck object was created. -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster machinehealthcheck control-plane](tanzu_cluster_machinehealthcheck_control-plane.md) - MachineHealthCheck operations for the control plane a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane_set.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane_set.md deleted file mode 100644 index 414da19b8f..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck_control-plane_set.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu cluster machinehealthcheck control-plane set - -Create or update a MachineHealthCheck for a cluster - -### Synopsis - -Create or update a MachineHealthCheck for a cluster - -``` -tanzu cluster machinehealthcheck control-plane set CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for set - --match-labels string Label selector to match machines whose health will be exercised - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string Namespace of the cluster - --node-startup-timeout string Any machine being created that takes longer than this duration to join the cluster is considered to have failed and will be remediated - --unhealthy-conditions string A list of the conditions that determine whether a node is considered unhealthy. Available condition types: [Ready, MemoryPressure,DiskPressure,PIDPressure, NetworkUnavailable], Available condition status: [True, False, Unknown] -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster machinehealthcheck control-plane](tanzu_cluster_machinehealthcheck_control-plane.md) - MachineHealthCheck operations for the control plane a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck_delete.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck_delete.md deleted file mode 100644 index 10df015849..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck_delete.md +++ /dev/null @@ -1,33 +0,0 @@ -## tanzu cluster machinehealthcheck delete - -Delete a MachineHealthCheck object of a cluster - -### Synopsis - -Delete a MachineHealthCheck object of a cluster - -``` -tanzu cluster machinehealthcheck delete CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for delete - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string The namespace where the MachineHealthCheck object was created, default to the cluster's namespace - -y, --yes Delete the MachineHealthCheck object without asking for confirmation -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster machinehealthcheck](tanzu_cluster_machinehealthcheck.md) - MachineHealthCheck operations for a cluster - -###### Auto generated by spf13/cobra on 15-Jul-2021 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck_get.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck_get.md deleted file mode 100644 index 29001804b5..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck_get.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu cluster machinehealthcheck get - -Get a MachineHealthCheck object of a cluster - -### Synopsis - -Get a MachineHealthCheck object for the given cluster - -``` -tanzu cluster machinehealthcheck get CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for get - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string The namespace where the MachineHealthCheck object was created. -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster machinehealthcheck](tanzu_cluster_machinehealthcheck.md) - MachineHealthCheck operations for a cluster - -###### Auto generated by spf13/cobra on 15-Jul-2021 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck_node.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck_node.md deleted file mode 100644 index 5652085087..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck_node.md +++ /dev/null @@ -1,29 +0,0 @@ -## tanzu cluster machinehealthcheck node - -MachineHealthCheck operations for the nodes of a cluster - -### Synopsis - -Get, set, or delete a MachineHealthCheck object for the nodes of a Tanzu Kubernetes cluster - -### Options - -``` - -h, --help help for node -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster machinehealthcheck](tanzu_cluster_machinehealthcheck.md) - MachineHealthCheck operations for a cluster -* [tanzu cluster machinehealthcheck node delete](tanzu_cluster_machinehealthcheck_node_delete.md) - Delete a MachineHealthCheck object -* [tanzu cluster machinehealthcheck node get](tanzu_cluster_machinehealthcheck_node_get.md) - Get a MachineHealthCheck object of the nodes of a cluster -* [tanzu cluster machinehealthcheck node set](tanzu_cluster_machinehealthcheck_node_set.md) - Create or update a MachineHealthCheck for a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck_node_delete.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck_node_delete.md deleted file mode 100644 index 86a32f9a98..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck_node_delete.md +++ /dev/null @@ -1,33 +0,0 @@ -## tanzu cluster machinehealthcheck node delete - -Delete a MachineHealthCheck object - -### Synopsis - -Delete a MachineHealthCheck object of the nodes of a cluster - -``` -tanzu cluster machinehealthcheck node delete CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for delete - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string The namespace where the MachineHealthCheck object was created, default to the cluster's namespace - -y, --yes Delete the MachineHealthCheck object without asking for confirmation -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster machinehealthcheck node](tanzu_cluster_machinehealthcheck_node.md) - MachineHealthCheck operations for the nodes of a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck_node_get.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck_node_get.md deleted file mode 100644 index 574646c673..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck_node_get.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu cluster machinehealthcheck node get - -Get a MachineHealthCheck object of the nodes of a cluster - -### Synopsis - -Get a MachineHealthCheck object of the nodes for the given cluster - -``` -tanzu cluster machinehealthcheck node get CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for get - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string The namespace where the MachineHealthCheck object was created. -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster machinehealthcheck node](tanzu_cluster_machinehealthcheck_node.md) - MachineHealthCheck operations for the nodes of a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck_node_set.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck_node_set.md deleted file mode 100644 index b3dd62bf66..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck_node_set.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu cluster machinehealthcheck node set - -Create or update a MachineHealthCheck for a cluster - -### Synopsis - -Create or update a MachineHealthCheck for a cluster - -``` -tanzu cluster machinehealthcheck node set CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for set - --match-labels string Label selector to match machines whose health will be exercised - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string Namespace of the cluster - --node-startup-timeout string Any machine being created that takes longer than this duration to join the cluster is considered to have failed and will be remediated - --unhealthy-conditions string A list of the conditions that determine whether a node is considered unhealthy. Available condition types: [Ready, MemoryPressure,DiskPressure,PIDPressure, NetworkUnavailable], Available condition status: [True, False, Unknown] -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster machinehealthcheck node](tanzu_cluster_machinehealthcheck_node.md) - MachineHealthCheck operations for the nodes of a cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_machinehealthcheck_set.md b/docs/cli/commands/tanzu_cluster_machinehealthcheck_set.md deleted file mode 100644 index 337ed649e3..0000000000 --- a/docs/cli/commands/tanzu_cluster_machinehealthcheck_set.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu cluster machinehealthcheck set - -Create or update a MachineHealthCheck for a cluster - -### Synopsis - -Create or update a MachineHealthCheck for a cluster - -``` -tanzu cluster machinehealthcheck set CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for set - --match-labels string Label selector to match machines whose health will be exercised - -m, --mhc-name string Name of the MachineHealthCheck object - -n, --namespace string Namespace of the cluster - --node-startup-timeout string Any machine being created that takes longer than this duration to join the cluster is considered to have failed and will be remediated - --unhealthy-conditions string A list of the conditions that determine whether a node is considered unhealthy. Available condition types: [Ready, MemoryPressure,DiskPressure,PIDPressure, NetworkUnavailable], Available condition status: [True, False, Unknown] -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster machinehealthcheck](tanzu_cluster_machinehealthcheck.md) - MachineHealthCheck operations for a cluster - -###### Auto generated by spf13/cobra on 15-Jul-2021 diff --git a/docs/cli/commands/tanzu_cluster_node-pool.md b/docs/cli/commands/tanzu_cluster_node-pool.md deleted file mode 100644 index 98695589b2..0000000000 --- a/docs/cli/commands/tanzu_cluster_node-pool.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu cluster node-pool - -Cluster node-pool operations - -### Options - -``` - -h, --help help for node-pool -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations -* [tanzu cluster node-pool delete](tanzu_cluster_node-pool_delete.md) - Delete a NodePool object of a cluster -* [tanzu cluster node-pool list](tanzu_cluster_node-pool_list.md) - List node pools -* [tanzu cluster node-pool set](tanzu_cluster_node-pool_set.md) - Set node pool for cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_node-pool_delete.md b/docs/cli/commands/tanzu_cluster_node-pool_delete.md deleted file mode 100644 index 9f9d50a57a..0000000000 --- a/docs/cli/commands/tanzu_cluster_node-pool_delete.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu cluster node-pool delete - -Delete a NodePool object of a cluster - -### Synopsis - -Delete a NodePool object of a cluster - -``` -tanzu cluster node-pool delete CLUSTER_NAME [flags] -``` - -### Options - -``` - -h, --help help for delete - -n, --name string Name of the NodePool object - --namespace string The namespace where the NodePool object was created, default to the cluster's namespace -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster node-pool](tanzu_cluster_node-pool.md) - Cluster node-pool operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_node-pool_list.md b/docs/cli/commands/tanzu_cluster_node-pool_list.md deleted file mode 100644 index 43aefa1d8e..0000000000 --- a/docs/cli/commands/tanzu_cluster_node-pool_list.md +++ /dev/null @@ -1,28 +0,0 @@ -## tanzu cluster node-pool list - -List node pools - -``` -tanzu cluster node-pool list [CLUSTER_NAME] [flags] -``` - -### Options - -``` - -h, --help help for list - -n, --namespace string The namespace from which to list workload clusters. (default "default") - -o, --output string Output format (yaml|json|table) -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster node-pool](tanzu_cluster_node-pool.md) - Cluster node-pool operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_node-pool_set.md b/docs/cli/commands/tanzu_cluster_node-pool_set.md deleted file mode 100644 index 8817731ce3..0000000000 --- a/docs/cli/commands/tanzu_cluster_node-pool_set.md +++ /dev/null @@ -1,29 +0,0 @@ -## tanzu cluster node-pool set - -Set node pool for cluster - -``` -tanzu cluster node-pool set CLUSTER_NAME [flags] -``` - -### Options - -``` - --base-machine-deployment string The machine deployment to use as a base for creating a new node pool (ignored for TKGs) - -f, --file string The file describing the node pool (required) - -h, --help help for set - --namespace string The namespace the cluster is found in. (default "default") -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster node-pool](tanzu_cluster_node-pool.md) - Cluster node-pool operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_scale.md b/docs/cli/commands/tanzu_cluster_scale.md deleted file mode 100644 index 0e3f01879d..0000000000 --- a/docs/cli/commands/tanzu_cluster_scale.md +++ /dev/null @@ -1,30 +0,0 @@ -## tanzu cluster scale - -Scale a cluster - -``` -tanzu cluster scale CLUSTER_NAME [flags] -``` - -### Options - -``` - -c, --controlplane-machine-count int32 The number of control plane nodes to scale to. Assumes unchanged if not specified - -h, --help help for scale - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified. - -p, --node-pool-name string The name of the node-pool to scale - -w, --worker-machine-count int32 The number of worker nodes to scale to. Assumes unchanged if not specified -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_cluster_upgrade.md b/docs/cli/commands/tanzu_cluster_upgrade.md deleted file mode 100644 index dbd6bd9dcd..0000000000 --- a/docs/cli/commands/tanzu_cluster_upgrade.md +++ /dev/null @@ -1,68 +0,0 @@ -## tanzu cluster upgrade - -Upgrade a cluster - -``` -tanzu cluster upgrade CLUSTER_NAME [flags] -``` - -### Examples - -``` - - # Upgrade a workload cluster - tanzu cluster upgrade wc-1 - - # Upgrade a workload cluster with specific tkr v1.20.1---vmware.1-tkg.2 - tanzu cluster upgrade wc-1 --tkr v1.20.1---vmware.1-tkg.2 - - # Upgrade a workload cluster with tkr prefix v1.20.1 - tanzu cluster upgrade wc-1 --tkr v1.20.1 - - # Upgrade a workload cluster using specific os name (vsphere) - tanzu cluster upgrade wc-1 --os-name photon - - # Upgrade a workload cluster using specific os name and version - tanzu cluster upgrade wc-1 --os-name ubuntu --os-version 20.04 - - # Upgrade a workload cluster using specific os name, version and arch - tanzu cluster upgrade wc-1 --os-name ubuntu --os-version 20.04 --os-arch amd64 - - [+] : Options available for: os-name, os-version, os-arch are as follows: - vSphere: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name photon --os-version 3 --os-arch amd64 - aws: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name amazon --os-version 2 --os-arch amd64 - azure: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name ubuntu --os-version 18.04 --os-arch amd64 - -``` - -### Options - -``` - -h, --help help for upgrade - -n, --namespace string The namespace where the workload cluster was created. Assumes 'default' if not specified - --os-arch string OS arch to use during cluster upgrade. Discovered automatically if not provided (See [+]) - --os-name string OS name to use during cluster upgrade. Discovered automatically if not provided (See [+]) - --os-version string OS version to use during cluster upgrade. Discovered automatically if not provided (See [+]) - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - --tkr string TanzuKubernetesRelease(TKr) to upgrade to. If TKr name prefix is provided, the latest compatible TKr matching the TKr name prefix would be used - -y, --yes Upgrade workload cluster without asking for confirmation -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu cluster](tanzu_cluster.md) - Kubernetes cluster operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_codegen.md b/docs/cli/commands/tanzu_codegen.md deleted file mode 100644 index 8da4b1077d..0000000000 --- a/docs/cli/commands/tanzu_codegen.md +++ /dev/null @@ -1,17 +0,0 @@ -## tanzu codegen - -Tanzu code generation tool - -### Options - -``` - -h, --help help for codegen -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu codegen completion](tanzu_codegen_completion.md) - Generate the autocompletion script for the specified shell -* [tanzu codegen generate](tanzu_codegen_generate.md) - Generate Tanzu API extension resources and code. - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_codegen_completion.md b/docs/cli/commands/tanzu_codegen_completion.md deleted file mode 100644 index 021ba21e06..0000000000 --- a/docs/cli/commands/tanzu_codegen_completion.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu codegen completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for codegen for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### SEE ALSO - -* [tanzu codegen](tanzu_codegen.md) - Tanzu code generation tool -* [tanzu codegen completion bash](tanzu_codegen_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu codegen completion fish](tanzu_codegen_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu codegen completion powershell](tanzu_codegen_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu codegen completion zsh](tanzu_codegen_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_codegen_completion_bash.md b/docs/cli/commands/tanzu_codegen_completion_bash.md deleted file mode 100644 index 4f9c087d22..0000000000 --- a/docs/cli/commands/tanzu_codegen_completion_bash.md +++ /dev/null @@ -1,44 +0,0 @@ -## tanzu codegen completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(codegen completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - codegen completion bash > /etc/bash_completion.d/codegen - -#### macOS: - - codegen completion bash > $(brew --prefix)/etc/bash_completion.d/codegen - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu codegen completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu codegen completion](tanzu_codegen_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_codegen_completion_fish.md b/docs/cli/commands/tanzu_codegen_completion_fish.md deleted file mode 100644 index 3e1935ef0e..0000000000 --- a/docs/cli/commands/tanzu_codegen_completion_fish.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu codegen completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - codegen completion fish | source - -To load completions for every new session, execute once: - - codegen completion fish > ~/.config/fish/completions/codegen.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu codegen completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu codegen completion](tanzu_codegen_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_codegen_completion_powershell.md b/docs/cli/commands/tanzu_codegen_completion_powershell.md deleted file mode 100644 index 0669328278..0000000000 --- a/docs/cli/commands/tanzu_codegen_completion_powershell.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu codegen completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - codegen completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu codegen completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu codegen completion](tanzu_codegen_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_codegen_completion_zsh.md b/docs/cli/commands/tanzu_codegen_completion_zsh.md deleted file mode 100644 index 165b24eccb..0000000000 --- a/docs/cli/commands/tanzu_codegen_completion_zsh.md +++ /dev/null @@ -1,46 +0,0 @@ -## tanzu codegen completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(codegen completion zsh); compdef _codegen codegen - -To load completions for every new session, execute once: - -#### Linux: - - codegen completion zsh > "${fpath[1]}/_codegen" - -#### macOS: - - codegen completion zsh > $(brew --prefix)/share/zsh/site-functions/_codegen - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu codegen completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu codegen completion](tanzu_codegen_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_codegen_generate.md b/docs/cli/commands/tanzu_codegen_generate.md deleted file mode 100644 index ca151ced90..0000000000 --- a/docs/cli/commands/tanzu_codegen_generate.md +++ /dev/null @@ -1,23 +0,0 @@ -## tanzu codegen generate - -Generate Tanzu API extension resources and code. - -### Synopsis - -Generate Tanzu API extension resources and code. - -``` -tanzu codegen generate [flags] -``` - -### Options - -``` - -h, --help help for generate -``` - -### SEE ALSO - -* [tanzu codegen](tanzu_codegen.md) - Tanzu code generation tool - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_completion.md b/docs/cli/commands/tanzu_completion.md deleted file mode 100644 index 6da21ef368..0000000000 --- a/docs/cli/commands/tanzu_completion.md +++ /dev/null @@ -1,52 +0,0 @@ -## tanzu completion - -Output shell completion code - -### Synopsis - - -Output shell completion code for the specified shell [bash zsh]. - -The shell completion code must be evaluated to provide completion. See Examples -for how to perform this for your given shell. - -Note for bash users: make sure the bash-completions package has been installed. -Note for zsh users: zsh >= 5.2 is required for command completion. - -``` -tanzu completion [bash zsh] -``` - -### Examples - -``` - -# Bash instructions: - - ## Load only for current session: - source <(tanzu completion bash) - - ## Load for all new sessions: - tanzu completion bash > $HOME/.config/tanzu/completion.bash.inc - printf "\n# Tanzu shell completion\nsource '$HOME/.config/tanzu/completion.bash.inc'\n" >> $HOME/.bash_profile - - ## NOTE: the bash-completion package must be installed. - -# Zsh instructions: - - ## Load for all new sessions: - echo "autoload -U compinit; compinit" >> ~/.zshrc - tanzu completion zsh > "${fpath[1]}/_tanzu" -``` - -### Options - -``` - -h, --help help for completion -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - Tanzu CLI - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_config.md b/docs/cli/commands/tanzu_config.md deleted file mode 100644 index d3a95426dc..0000000000 --- a/docs/cli/commands/tanzu_config.md +++ /dev/null @@ -1,18 +0,0 @@ -## tanzu config - -Configuration for the CLI - -### Options - -``` - -h, --help help for config -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - Tanzu CLI -* [tanzu config init](tanzu_config_init.md) - Initialize config with defaults -* [tanzu config server](tanzu_config_server.md) - Configured servers -* [tanzu config show](tanzu_config_show.md) - Show the current configuration - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_config_init.md b/docs/cli/commands/tanzu_config_init.md deleted file mode 100644 index d9eb84f447..0000000000 --- a/docs/cli/commands/tanzu_config_init.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu config init - -Initialize config with defaults - -``` -tanzu config init [flags] -``` - -### Options - -``` - -h, --help help for init -``` - -### SEE ALSO - -* [tanzu config](tanzu_config.md) - Configuration for the CLI - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_config_server.md b/docs/cli/commands/tanzu_config_server.md deleted file mode 100644 index 6f05dc9425..0000000000 --- a/docs/cli/commands/tanzu_config_server.md +++ /dev/null @@ -1,17 +0,0 @@ -## tanzu config server - -Configured servers - -### Options - -``` - -h, --help help for server -``` - -### SEE ALSO - -* [tanzu config](tanzu_config.md) - Configuration for the CLI -* [tanzu config server delete](tanzu_config_server_delete.md) - delete a server from the config -* [tanzu config server list](tanzu_config_server_list.md) - List servers - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_config_server_delete.md b/docs/cli/commands/tanzu_config_server_delete.md deleted file mode 100644 index ffd35ed307..0000000000 --- a/docs/cli/commands/tanzu_config_server_delete.md +++ /dev/null @@ -1,20 +0,0 @@ -## tanzu config server delete - -delete a server from the config - -``` -tanzu config server delete SERVER_NAME [flags] -``` - -### Options - -``` - -h, --help help for delete - -y, --yes Delete the server entry without confirmation -``` - -### SEE ALSO - -* [tanzu config server](tanzu_config_server.md) - Configured servers - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_config_server_list.md b/docs/cli/commands/tanzu_config_server_list.md deleted file mode 100644 index 3b97bcaa20..0000000000 --- a/docs/cli/commands/tanzu_config_server_list.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu config server list - -List servers - -``` -tanzu config server list [flags] -``` - -### Options - -``` - -h, --help help for list -``` - -### SEE ALSO - -* [tanzu config server](tanzu_config_server.md) - Configured servers - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_config_show.md b/docs/cli/commands/tanzu_config_show.md deleted file mode 100644 index d6d5664a85..0000000000 --- a/docs/cli/commands/tanzu_config_show.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu config show - -Show the current configuration - -``` -tanzu config show [flags] -``` - -### Options - -``` - -h, --help help for show -``` - -### SEE ALSO - -* [tanzu config](tanzu_config.md) - Configuration for the CLI - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_feature.md b/docs/cli/commands/tanzu_feature.md deleted file mode 100644 index 27888a94e8..0000000000 --- a/docs/cli/commands/tanzu_feature.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu feature - -Operate on features and featuregates - -### Options - -``` - -h, --help help for feature -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu feature activate](tanzu_feature_activate.md) - Activate Features -* [tanzu feature completion](tanzu_feature_completion.md) - Generate the autocompletion script for the specified shell -* [tanzu feature deactivate](tanzu_feature_deactivate.md) - Deactivate Features -* [tanzu feature list](tanzu_feature_list.md) - List Features - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_feature_activate.md b/docs/cli/commands/tanzu_feature_activate.md deleted file mode 100644 index 5329c6e63e..0000000000 --- a/docs/cli/commands/tanzu_feature_activate.md +++ /dev/null @@ -1,28 +0,0 @@ -## tanzu feature activate - -Activate Features - -``` -tanzu feature activate [flags] -``` - -### Examples - -``` - - # Activate a cluster Feature - tanzu feature activate myfeature -``` - -### Options - -``` - -f, --featuregate string Activate a Feature gated by a particular FeatureGate (default "tkg-system") - -h, --help help for activate -``` - -### SEE ALSO - -* [tanzu feature](tanzu_feature.md) - Operate on features and featuregates - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_feature_completion.md b/docs/cli/commands/tanzu_feature_completion.md deleted file mode 100644 index 6a0b5550a2..0000000000 --- a/docs/cli/commands/tanzu_feature_completion.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu feature completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for feature for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### SEE ALSO - -* [tanzu feature](tanzu_feature.md) - Operate on features and featuregates -* [tanzu feature completion bash](tanzu_feature_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu feature completion fish](tanzu_feature_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu feature completion powershell](tanzu_feature_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu feature completion zsh](tanzu_feature_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_feature_completion_bash.md b/docs/cli/commands/tanzu_feature_completion_bash.md deleted file mode 100644 index c62a9dc6ce..0000000000 --- a/docs/cli/commands/tanzu_feature_completion_bash.md +++ /dev/null @@ -1,44 +0,0 @@ -## tanzu feature completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(feature completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - feature completion bash > /etc/bash_completion.d/feature - -#### macOS: - - feature completion bash > $(brew --prefix)/etc/bash_completion.d/feature - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu feature completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu feature completion](tanzu_feature_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_feature_completion_fish.md b/docs/cli/commands/tanzu_feature_completion_fish.md deleted file mode 100644 index 4c8ac5d0b1..0000000000 --- a/docs/cli/commands/tanzu_feature_completion_fish.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu feature completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - feature completion fish | source - -To load completions for every new session, execute once: - - feature completion fish > ~/.config/fish/completions/feature.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu feature completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu feature completion](tanzu_feature_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_feature_completion_powershell.md b/docs/cli/commands/tanzu_feature_completion_powershell.md deleted file mode 100644 index 07b5ff31ed..0000000000 --- a/docs/cli/commands/tanzu_feature_completion_powershell.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu feature completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - feature completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu feature completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu feature completion](tanzu_feature_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_feature_completion_zsh.md b/docs/cli/commands/tanzu_feature_completion_zsh.md deleted file mode 100644 index b841c27b15..0000000000 --- a/docs/cli/commands/tanzu_feature_completion_zsh.md +++ /dev/null @@ -1,46 +0,0 @@ -## tanzu feature completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(feature completion zsh); compdef _feature feature - -To load completions for every new session, execute once: - -#### Linux: - - feature completion zsh > "${fpath[1]}/_feature" - -#### macOS: - - feature completion zsh > $(brew --prefix)/share/zsh/site-functions/_feature - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu feature completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu feature completion](tanzu_feature_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_feature_deactivate.md b/docs/cli/commands/tanzu_feature_deactivate.md deleted file mode 100644 index fa3a446cd2..0000000000 --- a/docs/cli/commands/tanzu_feature_deactivate.md +++ /dev/null @@ -1,28 +0,0 @@ -## tanzu feature deactivate - -Deactivate Features - -``` -tanzu feature deactivate [flags] -``` - -### Examples - -``` - - # Deactivate a cluster Feature - tanzu feature deactivate myfeature -``` - -### Options - -``` - -f, --featuregate string Deactivate Feature gated by a particular FeatureGate (default "tkg-system") - -h, --help help for deactivate -``` - -### SEE ALSO - -* [tanzu feature](tanzu_feature.md) - Operate on features and featuregates - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_feature_list.md b/docs/cli/commands/tanzu_feature_list.md deleted file mode 100644 index dc09ee5ad4..0000000000 --- a/docs/cli/commands/tanzu_feature_list.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu feature list - -List Features - -``` -tanzu feature list [flags] -``` - -### Examples - -``` - - # List a clusters Features - tanzu feature list --activated - tanzu feature list --unavailable - tanzu feature list --deactivated -``` - -### Options - -``` - -a, --activated List only activated Features - -d, --deactivated List only deactivated Features - -e, --extended Include extended output. Higher latency as it requires more API calls. - -f, --featuregate string List Features gated by a particular FeatureGate (default "tkg-system") - -h, --help help for list - -o, --output string Output format (yaml|json|table) - -u, --unavailable List only Features specified in the gate but missing from cluster -``` - -### SEE ALSO - -* [tanzu feature](tanzu_feature.md) - Operate on features and featuregates - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_init.md b/docs/cli/commands/tanzu_init.md deleted file mode 100644 index 084ab138f2..0000000000 --- a/docs/cli/commands/tanzu_init.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu init - -Initialize the CLI - -``` -tanzu init [flags] -``` - -### Options - -``` - -h, --help help for init -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - Tanzu CLI - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_kubernetes-release.md b/docs/cli/commands/tanzu_kubernetes-release.md deleted file mode 100644 index 89a30a9e8b..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release.md +++ /dev/null @@ -1,23 +0,0 @@ -## tanzu kubernetes-release - -Kubernetes release operations - -### Options - -``` - -h, --help help for kubernetes-release - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu kubernetes-release activate](tanzu_kubernetes-release_activate.md) - Activate Tanzu Kubernetes Releases -* [tanzu kubernetes-release available-upgrades](tanzu_kubernetes-release_available-upgrades.md) - Get upgrade information for a Tanzu Kubernetes Release -* [tanzu kubernetes-release completion](tanzu_kubernetes-release_completion.md) - Generate the autocompletion script for the specified shell -* [tanzu kubernetes-release deactivate](tanzu_kubernetes-release_deactivate.md) - Deactivate Tanzu Kubernetes Releases -* [tanzu kubernetes-release get](tanzu_kubernetes-release_get.md) - Get available Tanzu Kubernetes releases -* [tanzu kubernetes-release os](tanzu_kubernetes-release_os.md) - Get the OS information for a Tanzu Kubernetes Release - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_activate.md b/docs/cli/commands/tanzu_kubernetes-release_activate.md deleted file mode 100644 index 6273cc8313..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_activate.md +++ /dev/null @@ -1,30 +0,0 @@ -## tanzu kubernetes-release activate - -Activate Tanzu Kubernetes Releases - -### Synopsis - -Activate Tanzu Kubernetes Releases - -``` -tanzu kubernetes-release activate TKR_NAME [flags] -``` - -### Options - -``` - -h, --help help for activate -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release](tanzu_kubernetes-release.md) - Kubernetes release operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_available-upgrades.md b/docs/cli/commands/tanzu_kubernetes-release_available-upgrades.md deleted file mode 100644 index 8f9474a158..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_available-upgrades.md +++ /dev/null @@ -1,28 +0,0 @@ -## tanzu kubernetes-release available-upgrades - -Get upgrade information for a Tanzu Kubernetes Release - -### Synopsis - -Get upgrade information for a Tanzu Kubernetes Release - -### Options - -``` - -h, --help help for available-upgrades - -o, --output string Output format (yaml|json|table) -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release](tanzu_kubernetes-release.md) - Kubernetes release operations -* [tanzu kubernetes-release available-upgrades get](tanzu_kubernetes-release_available-upgrades_get.md) - Get all available upgrades for a specific Tanzu Kubernetes Release - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_available-upgrades_get.md b/docs/cli/commands/tanzu_kubernetes-release_available-upgrades_get.md deleted file mode 100644 index 04e2d8a511..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_available-upgrades_get.md +++ /dev/null @@ -1,30 +0,0 @@ -## tanzu kubernetes-release available-upgrades get - -Get all available upgrades for a specific Tanzu Kubernetes Release - -### Synopsis - -Get all available upgrades for a specific Tanzu Kubernetes Release - -``` -tanzu kubernetes-release available-upgrades get TKR_NAME [flags] -``` - -### Options - -``` - -h, --help help for get -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release available-upgrades](tanzu_kubernetes-release_available-upgrades.md) - Get upgrade information for a Tanzu Kubernetes Release - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_completion.md b/docs/cli/commands/tanzu_kubernetes-release_completion.md deleted file mode 100644 index 1fabb650ee..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_completion.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu kubernetes-release completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for kubernetes-release for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release](tanzu_kubernetes-release.md) - Kubernetes release operations -* [tanzu kubernetes-release completion bash](tanzu_kubernetes-release_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu kubernetes-release completion fish](tanzu_kubernetes-release_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu kubernetes-release completion powershell](tanzu_kubernetes-release_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu kubernetes-release completion zsh](tanzu_kubernetes-release_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_completion_bash.md b/docs/cli/commands/tanzu_kubernetes-release_completion_bash.md deleted file mode 100644 index 89a86e3fa2..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_completion_bash.md +++ /dev/null @@ -1,51 +0,0 @@ -## tanzu kubernetes-release completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(kubernetes-release completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - kubernetes-release completion bash > /etc/bash_completion.d/kubernetes-release - -#### macOS: - - kubernetes-release completion bash > $(brew --prefix)/etc/bash_completion.d/kubernetes-release - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu kubernetes-release completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release completion](tanzu_kubernetes-release_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_completion_fish.md b/docs/cli/commands/tanzu_kubernetes-release_completion_fish.md deleted file mode 100644 index 3de4bde58c..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_completion_fish.md +++ /dev/null @@ -1,42 +0,0 @@ -## tanzu kubernetes-release completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - kubernetes-release completion fish | source - -To load completions for every new session, execute once: - - kubernetes-release completion fish > ~/.config/fish/completions/kubernetes-release.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu kubernetes-release completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release completion](tanzu_kubernetes-release_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_completion_powershell.md b/docs/cli/commands/tanzu_kubernetes-release_completion_powershell.md deleted file mode 100644 index 5bbe32662d..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_completion_powershell.md +++ /dev/null @@ -1,39 +0,0 @@ -## tanzu kubernetes-release completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - kubernetes-release completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu kubernetes-release completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release completion](tanzu_kubernetes-release_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_completion_zsh.md b/docs/cli/commands/tanzu_kubernetes-release_completion_zsh.md deleted file mode 100644 index 093da03a34..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_completion_zsh.md +++ /dev/null @@ -1,53 +0,0 @@ -## tanzu kubernetes-release completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(kubernetes-release completion zsh); compdef _kubernetes-release kubernetes-release - -To load completions for every new session, execute once: - -#### Linux: - - kubernetes-release completion zsh > "${fpath[1]}/_kubernetes-release" - -#### macOS: - - kubernetes-release completion zsh > $(brew --prefix)/share/zsh/site-functions/_kubernetes-release - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu kubernetes-release completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release completion](tanzu_kubernetes-release_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_deactivate.md b/docs/cli/commands/tanzu_kubernetes-release_deactivate.md deleted file mode 100644 index c813f717a2..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_deactivate.md +++ /dev/null @@ -1,30 +0,0 @@ -## tanzu kubernetes-release deactivate - -Deactivate Tanzu Kubernetes Releases - -### Synopsis - -Deactivate Tanzu Kubernetes Releases - -``` -tanzu kubernetes-release deactivate TKR_NAME [flags] -``` - -### Options - -``` - -h, --help help for deactivate -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release](tanzu_kubernetes-release.md) - Kubernetes release operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_get.md b/docs/cli/commands/tanzu_kubernetes-release_get.md deleted file mode 100644 index 01c6b9dcfd..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_get.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu kubernetes-release get - -Get available Tanzu Kubernetes releases - -### Synopsis - -Get available Tanzu Kubernetes releases - -``` -tanzu kubernetes-release get TKR_NAME [flags] -``` - -### Options - -``` - -a, --all List all the available Tanzu Kubernetes releases including Incompatible and deactivated - -h, --help help for get - -o, --output string Output format (yaml|json|table) -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release](tanzu_kubernetes-release.md) - Kubernetes release operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_os.md b/docs/cli/commands/tanzu_kubernetes-release_os.md deleted file mode 100644 index ffb5cd63a7..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_os.md +++ /dev/null @@ -1,27 +0,0 @@ -## tanzu kubernetes-release os - -Get the OS information for a Tanzu Kubernetes Release - -### Synopsis - -Get the OS information for a Tanzu Kubernetes Release - -### Options - -``` - -h, --help help for os -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release](tanzu_kubernetes-release.md) - Kubernetes release operations -* [tanzu kubernetes-release os get](tanzu_kubernetes-release_os_get.md) - Get the OSes that are available for a Tanzu Kubernetes Release - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_kubernetes-release_os_get.md b/docs/cli/commands/tanzu_kubernetes-release_os_get.md deleted file mode 100644 index e617717565..0000000000 --- a/docs/cli/commands/tanzu_kubernetes-release_os_get.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu kubernetes-release os get - -Get the OSes that are available for a Tanzu Kubernetes Release - -### Synopsis - -Get the OSes that are available for a Tanzu Kubernetes Release - -``` -tanzu kubernetes-release os get TKR_NAME [flags] -``` - -### Options - -``` - -h, --help help for get - -o, --output string Output format (yaml|json|table) - --region string The AWS region where AMIs are available -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu kubernetes-release os](tanzu_kubernetes-release_os.md) - Get the OS information for a Tanzu Kubernetes Release - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_login.md b/docs/cli/commands/tanzu_login.md deleted file mode 100644 index 6d7ae82975..0000000000 --- a/docs/cli/commands/tanzu_login.md +++ /dev/null @@ -1,50 +0,0 @@ -## tanzu login - -Login to the platform - -``` -tanzu login [flags] -``` - -### Examples - -``` - - # Login to TKG management cluster using endpoint - tanzu login --endpoint "https://login.example.com" --name mgmt-cluster - - # Login to TKG management cluster by using kubeconfig path and context for the management cluster - tanzu login --kubeconfig path/to/kubeconfig --context path/to/context --name mgmt-cluster - - # Login to TKG management cluster by using default kubeconfig path and context for the management cluster - tanzu login --context path/to/context --name mgmt-cluster - - # Login to an existing server - tanzu login --server mgmt-cluster - - [*] : User has two options to login to TKG. User can choose the login endpoint option - by providing 'endpoint', or user can choose to use the kubeconfig for the management cluster by - providing 'kubeconfig' and 'context'. If only '--context' is set and '--kubeconfig' is unset - $KUBECONFIG env variable would be used and, if $KUBECONFIG env is also unset default - kubeconfig($HOME/.kube/config) would be used - -``` - -### Options - -``` - --apiToken string API token for global login - --context string the context in the kubeconfig to use for management cluster. Valid only if user doesn't choose 'endpoint' option.(See [*]) - --endpoint string endpoint to login to - -h, --help help for login - --kubeconfig string path to kubeconfig management cluster. Valid only if user doesn't choose 'endpoint' option.(See [*]) - --name string name of the server - --server string login to the given server -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu login completion](tanzu_login_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_login_completion.md b/docs/cli/commands/tanzu_login_completion.md deleted file mode 100644 index c70b8e4d65..0000000000 --- a/docs/cli/commands/tanzu_login_completion.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu login completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for login for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### SEE ALSO - -* [tanzu login](tanzu_login.md) - Login to the platform -* [tanzu login completion bash](tanzu_login_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu login completion fish](tanzu_login_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu login completion powershell](tanzu_login_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu login completion zsh](tanzu_login_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_login_completion_bash.md b/docs/cli/commands/tanzu_login_completion_bash.md deleted file mode 100644 index c1d73c4d4f..0000000000 --- a/docs/cli/commands/tanzu_login_completion_bash.md +++ /dev/null @@ -1,44 +0,0 @@ -## tanzu login completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(login completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - login completion bash > /etc/bash_completion.d/login - -#### macOS: - - login completion bash > $(brew --prefix)/etc/bash_completion.d/login - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu login completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu login completion](tanzu_login_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_login_completion_fish.md b/docs/cli/commands/tanzu_login_completion_fish.md deleted file mode 100644 index dde42d75b6..0000000000 --- a/docs/cli/commands/tanzu_login_completion_fish.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu login completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - login completion fish | source - -To load completions for every new session, execute once: - - login completion fish > ~/.config/fish/completions/login.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu login completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu login completion](tanzu_login_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_login_completion_powershell.md b/docs/cli/commands/tanzu_login_completion_powershell.md deleted file mode 100644 index 29b47f59eb..0000000000 --- a/docs/cli/commands/tanzu_login_completion_powershell.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu login completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - login completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu login completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu login completion](tanzu_login_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_login_completion_zsh.md b/docs/cli/commands/tanzu_login_completion_zsh.md deleted file mode 100644 index 3f8c07f954..0000000000 --- a/docs/cli/commands/tanzu_login_completion_zsh.md +++ /dev/null @@ -1,46 +0,0 @@ -## tanzu login completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(login completion zsh); compdef _login login - -To load completions for every new session, execute once: - -#### Linux: - - login completion zsh > "${fpath[1]}/_login" - -#### macOS: - - login completion zsh > $(brew --prefix)/share/zsh/site-functions/_login - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu login completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu login completion](tanzu_login_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster.md b/docs/cli/commands/tanzu_management-cluster.md deleted file mode 100644 index c44bdf2ae7..0000000000 --- a/docs/cli/commands/tanzu_management-cluster.md +++ /dev/null @@ -1,26 +0,0 @@ -## tanzu management-cluster - -Kubernetes management cluster operations - -### Options - -``` - -h, --help help for management-cluster - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu management-cluster ceip-participation](tanzu_management-cluster_ceip-participation.md) - Get or set ceip participation -* [tanzu management-cluster completion](tanzu_management-cluster_completion.md) - Generate the autocompletion script for the specified shell -* [tanzu management-cluster create](tanzu_management-cluster_create.md) - Create a Tanzu Kubernetes Grid management cluster -* [tanzu management-cluster credentials](tanzu_management-cluster_credentials.md) - Update Credentials for Management Cluster -* [tanzu management-cluster delete](tanzu_management-cluster_delete.md) - Delete a management cluster -* [tanzu management-cluster get](tanzu_management-cluster_get.md) - Get details about the current management cluster -* [tanzu management-cluster kubeconfig](tanzu_management-cluster_kubeconfig.md) - Kubeconfig of management cluster -* [tanzu management-cluster permissions](tanzu_management-cluster_permissions.md) - Configure permissions on cloud providers -* [tanzu management-cluster upgrade](tanzu_management-cluster_upgrade.md) - Upgrades the management cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_ceip-participation.md b/docs/cli/commands/tanzu_management-cluster_ceip-participation.md deleted file mode 100644 index fbd528b50c..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_ceip-participation.md +++ /dev/null @@ -1,28 +0,0 @@ -## tanzu management-cluster ceip-participation - -Get or set ceip participation - -### Synopsis - -Get or set ceip participation - -### Options - -``` - -h, --help help for ceip-participation -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster](tanzu_management-cluster.md) - Kubernetes management cluster operations -* [tanzu management-cluster ceip-participation get](tanzu_management-cluster_ceip-participation_get.md) - Get the current CEIP opt-in status -* [tanzu management-cluster ceip-participation set](tanzu_management-cluster_ceip-participation_set.md) - Set the opt-in preference for CEIP - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_ceip-participation_get.md b/docs/cli/commands/tanzu_management-cluster_ceip-participation_get.md deleted file mode 100644 index a0c25f01cc..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_ceip-participation_get.md +++ /dev/null @@ -1,31 +0,0 @@ -## tanzu management-cluster ceip-participation get - -Get the current CEIP opt-in status - -### Synopsis - -Get the current CEIP opt-in status of the current management cluster - -``` -tanzu management-cluster ceip-participation get [flags] -``` - -### Options - -``` - -h, --help help for get - -o, --output string Output format (yaml|json|table) -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster ceip-participation](tanzu_management-cluster_ceip-participation.md) - Get or set ceip participation - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_ceip-participation_set.md b/docs/cli/commands/tanzu_management-cluster_ceip-participation_set.md deleted file mode 100644 index 1d7d235555..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_ceip-participation_set.md +++ /dev/null @@ -1,31 +0,0 @@ -## tanzu management-cluster ceip-participation set - -Set the opt-in preference for CEIP - -### Synopsis - -Set the opt-in preference for CEIP of the current management cluster - -``` -tanzu management-cluster ceip-participation set OPT_IN_BOOL [flags] -``` - -### Options - -``` - -h, --help help for set - --labels string use --labels=entitlement-account-number="num1",env-type="env" to self-identify the customer's account number and environment -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster ceip-participation](tanzu_management-cluster_ceip-participation.md) - Get or set ceip participation - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_completion.md b/docs/cli/commands/tanzu_management-cluster_completion.md deleted file mode 100644 index be4c2c3343..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_completion.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu management-cluster completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for management-cluster for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster](tanzu_management-cluster.md) - Kubernetes management cluster operations -* [tanzu management-cluster completion bash](tanzu_management-cluster_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu management-cluster completion fish](tanzu_management-cluster_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu management-cluster completion powershell](tanzu_management-cluster_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu management-cluster completion zsh](tanzu_management-cluster_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_completion_bash.md b/docs/cli/commands/tanzu_management-cluster_completion_bash.md deleted file mode 100644 index a01bfcf680..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_completion_bash.md +++ /dev/null @@ -1,51 +0,0 @@ -## tanzu management-cluster completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(management-cluster completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - management-cluster completion bash > /etc/bash_completion.d/management-cluster - -#### macOS: - - management-cluster completion bash > $(brew --prefix)/etc/bash_completion.d/management-cluster - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu management-cluster completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster completion](tanzu_management-cluster_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_completion_fish.md b/docs/cli/commands/tanzu_management-cluster_completion_fish.md deleted file mode 100644 index f706576b60..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_completion_fish.md +++ /dev/null @@ -1,42 +0,0 @@ -## tanzu management-cluster completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - management-cluster completion fish | source - -To load completions for every new session, execute once: - - management-cluster completion fish > ~/.config/fish/completions/management-cluster.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu management-cluster completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster completion](tanzu_management-cluster_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_completion_powershell.md b/docs/cli/commands/tanzu_management-cluster_completion_powershell.md deleted file mode 100644 index a8d9684006..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_completion_powershell.md +++ /dev/null @@ -1,39 +0,0 @@ -## tanzu management-cluster completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - management-cluster completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu management-cluster completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster completion](tanzu_management-cluster_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_completion_zsh.md b/docs/cli/commands/tanzu_management-cluster_completion_zsh.md deleted file mode 100644 index e9acf81db0..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_completion_zsh.md +++ /dev/null @@ -1,53 +0,0 @@ -## tanzu management-cluster completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(management-cluster completion zsh); compdef _management-cluster management-cluster - -To load completions for every new session, execute once: - -#### Linux: - - management-cluster completion zsh > "${fpath[1]}/_management-cluster" - -#### macOS: - - management-cluster completion zsh > $(brew --prefix)/share/zsh/site-functions/_management-cluster - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu management-cluster completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster completion](tanzu_management-cluster_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_create.md b/docs/cli/commands/tanzu_management-cluster_create.md deleted file mode 100644 index 629091a8d1..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_create.md +++ /dev/null @@ -1,56 +0,0 @@ -## tanzu management-cluster create - -Create a Tanzu Kubernetes Grid management cluster - -### Synopsis - -Create a Tanzu Kubernetes Grid management cluster including initializing it with Cluster API components appropriate for the target infrastructure. - -``` -tanzu management-cluster create [flags] -``` - -### Examples - -``` - - # Create a management cluster on AWS infrastructure, initializing it with - # components required to create workload clusters through it on the same infrastructure - # by bootstrapping through a self-provisioned bootstrap cluster. - tanzu management-cluster create --file ~/clusterconfigs/aws-mc-1.yaml - # Launch an interactive UI to configure the settings necessary to create a - # management cluster - tanzu management-cluster create --ui - # Create a management cluster on vSphere infrastructure by using an existing - # bootstrapper cluster. The current kube context should point to that - # of the existing bootstrap cluster. - tanzu management-cluster create --use-existing-bootstrap-cluster --file vsphere-mc-1.yaml -``` - -### Options - -``` - -b, --bind string Specify the IP and port to bind the Kickstart UI against (e.g. 127.0.0.1:8080). (default "127.0.0.1:8080") - --browser string Specify the browser to open the Kickstart UI on. Use 'none' for no browser. Defaults to OS default browser. Supported: ['chrome', 'firefox', 'safari', 'ie', 'edge', 'none'] - --dry-run Generates the management cluster manifest and writes the output to stdout without applying it - -f, --file string Configuration file from which to create a management cluster - --force-config-update Force an update of all configuration files in ${HOME}/.config/tanzu/tkg/bom and ${HOME}/.tanzu/tkg/compatibility - -h, --help help for create - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - -u, --ui Launch interactive management cluster provisioning UI - -e, --use-existing-bootstrap-cluster Use an existing bootstrap cluster to deploy the management cluster - -y, --yes Create management cluster without asking for confirmation -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster](tanzu_management-cluster.md) - Kubernetes management cluster operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_credentials.md b/docs/cli/commands/tanzu_management-cluster_credentials.md deleted file mode 100644 index c2b680b276..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_credentials.md +++ /dev/null @@ -1,23 +0,0 @@ -## tanzu management-cluster credentials - -Update Credentials for Management Cluster - -### Options - -``` - -h, --help help for credentials -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster](tanzu_management-cluster.md) - Kubernetes management cluster operations -* [tanzu management-cluster credentials update](tanzu_management-cluster_credentials_update.md) - Update credentials for management cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_credentials_update.md b/docs/cli/commands/tanzu_management-cluster_credentials_update.md deleted file mode 100644 index ca33230b7e..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_credentials_update.md +++ /dev/null @@ -1,29 +0,0 @@ -## tanzu management-cluster credentials update - -Update credentials for management cluster - -``` -tanzu management-cluster credentials update CLUSTER_NAME [flags] -``` - -### Options - -``` - --cascading Update credentials for all workload clusters under the management cluster - -h, --help help for update - --vsphere-password string Password for vSphere provider - --vsphere-user string Username for vSphere provider -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster credentials](tanzu_management-cluster_credentials.md) - Update Credentials for Management Cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_delete.md b/docs/cli/commands/tanzu_management-cluster_delete.md deleted file mode 100644 index e5047252bb..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_delete.md +++ /dev/null @@ -1,42 +0,0 @@ -## tanzu management-cluster delete - -Delete a management cluster - -### Synopsis - -Delete a management cluster and tears down the underlying infrastructure - -``` -tanzu management-cluster delete [flags] -``` - -### Examples - -``` - - # Deletes the management cluster of the current server - tanzu management-cluster delete -``` - -### Options - -``` - --force Force deletion of the management cluster even if it is managing active Tanzu Kubernetes clusters - -h, --help help for delete - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - -e, --use-existing-cleanup-cluster Use an existing cleanup cluster to delete the management cluster - -y, --yes Delete management cluster without asking for confirmation -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster](tanzu_management-cluster.md) - Kubernetes management cluster operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_get.md b/docs/cli/commands/tanzu_management-cluster_get.md deleted file mode 100644 index e34c89219b..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_get.md +++ /dev/null @@ -1,33 +0,0 @@ -## tanzu management-cluster get - -Get details about the current management cluster - -### Synopsis - -Retrieves details about the current management cluster. Requires the current server to be a management cluster - -``` -tanzu management-cluster get [flags] -``` - -### Options - -``` - -h, --help help for get - --show-all-conditions string List of comma separated kind or kind/name for which we should show all the object's conditions (all to show conditions for all the objects) - --show-details Show details of MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object - --show-group-members Expand machine groups whose ready condition has the same Status, Severity and Reason -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster](tanzu_management-cluster.md) - Kubernetes management cluster operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_import.md b/docs/cli/commands/tanzu_management-cluster_import.md deleted file mode 100644 index 1b184eaffb..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_import.md +++ /dev/null @@ -1,42 +0,0 @@ -## tanzu management-cluster import - -Import Tanzu Kubernetes Grid management clusters from TKG settings file - -### Synopsis - -Import Tanzu Kubernetes Grid management cluster from TKG settings file - -``` -tanzu management-cluster import [flags] -``` - -### Examples - -``` - - # Import management cluster config from default config file - tanzu management-cluster import - - # Import management cluster config from custom config file - tanzu management-cluster import -f path/to/configfile.yaml -``` - -### Options - -``` - -f, --file string TKG settings file (default '$HOME/.tkg/config.yaml') - -h, --help help for import -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster](tanzu_management-cluster.md) - Kubernetes management cluster operations - -###### Auto generated by spf13/cobra on 15-Jul-2021 diff --git a/docs/cli/commands/tanzu_management-cluster_kubeconfig.md b/docs/cli/commands/tanzu_management-cluster_kubeconfig.md deleted file mode 100644 index 520c12a747..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_kubeconfig.md +++ /dev/null @@ -1,23 +0,0 @@ -## tanzu management-cluster kubeconfig - -Kubeconfig of management cluster - -### Options - -``` - -h, --help help for kubeconfig -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster](tanzu_management-cluster.md) - Kubernetes management cluster operations -* [tanzu management-cluster kubeconfig get](tanzu_management-cluster_kubeconfig_get.md) - Get Kubeconfig of a management cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_kubeconfig_get.md b/docs/cli/commands/tanzu_management-cluster_kubeconfig_get.md deleted file mode 100644 index ed9d3713a3..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_kubeconfig_get.md +++ /dev/null @@ -1,43 +0,0 @@ -## tanzu management-cluster kubeconfig get - -Get Kubeconfig of a management cluster - -### Synopsis - -Get Kubeconfig of a management cluster and merge the context into the default kubeconfig file - -``` -tanzu management-cluster kubeconfig get [flags] -``` - -### Examples - -``` - - # Get management cluster kubeconfig - tanzu management-cluster kubeconfig get - - # Get management cluster admin kubeconfig - tanzu management-cluster kubeconfig get --admin -``` - -### Options - -``` - --admin Get admin kubeconfig of the management cluster - --export-file string File path to export a standalone kubeconfig for management cluster - -h, --help help for get -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster kubeconfig](tanzu_management-cluster_kubeconfig.md) - Kubeconfig of management cluster - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_permissions.md b/docs/cli/commands/tanzu_management-cluster_permissions.md deleted file mode 100644 index 197f86e957..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_permissions.md +++ /dev/null @@ -1,23 +0,0 @@ -## tanzu management-cluster permissions - -Configure permissions on cloud providers - -### Options - -``` - -h, --help help for permissions -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster](tanzu_management-cluster.md) - Kubernetes management cluster operations -* [tanzu management-cluster permissions aws](tanzu_management-cluster_permissions_aws.md) - Configure permissions on AWS - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_permissions_aws.md b/docs/cli/commands/tanzu_management-cluster_permissions_aws.md deleted file mode 100644 index 93cc3f688e..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_permissions_aws.md +++ /dev/null @@ -1,24 +0,0 @@ -## tanzu management-cluster permissions aws - -Configure permissions on AWS - -### Options - -``` - -h, --help help for aws -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster permissions](tanzu_management-cluster_permissions.md) - Configure permissions on cloud providers -* [tanzu management-cluster permissions aws generate-cloudformation-template](tanzu_management-cluster_permissions_aws_generate-cloudformation-template.md) - Generate AWS CloudFormation Template -* [tanzu management-cluster permissions aws set](tanzu_management-cluster_permissions_aws_set.md) - Configure permissions on AWS - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_permissions_aws_generate-cloudformation-template.md b/docs/cli/commands/tanzu_management-cluster_permissions_aws_generate-cloudformation-template.md deleted file mode 100644 index 64f5cdd868..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_permissions_aws_generate-cloudformation-template.md +++ /dev/null @@ -1,31 +0,0 @@ -## tanzu management-cluster permissions aws generate-cloudformation-template - -Generate AWS CloudFormation Template - -### Synopsis - -Generate AWS CloudFormation Template - -``` -tanzu management-cluster permissions aws generate-cloudformation-template [flags] -``` - -### Options - -``` - -f, --file string Optional, configuration file from which to read the aws credentials. Falls back to using the default AWS credentials chain if not provided. - -h, --help help for generate-cloudformation-template -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster permissions aws](tanzu_management-cluster_permissions_aws.md) - Configure permissions on AWS - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_permissions_aws_set.md b/docs/cli/commands/tanzu_management-cluster_permissions_aws_set.md deleted file mode 100644 index a71a044abc..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_permissions_aws_set.md +++ /dev/null @@ -1,31 +0,0 @@ -## tanzu management-cluster permissions aws set - -Configure permissions on AWS - -### Synopsis - -Configure permissions on AWS - -``` -tanzu management-cluster permissions aws set [flags] -``` - -### Options - -``` - -f, --file string Optional, configuration file from which to read the aws credentials. Falls back to using the default AWS credentials chain if not provided. - -h, --help help for set -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster permissions aws](tanzu_management-cluster_permissions_aws.md) - Configure permissions on AWS - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_management-cluster_upgrade.md b/docs/cli/commands/tanzu_management-cluster_upgrade.md deleted file mode 100644 index d64be21fa9..0000000000 --- a/docs/cli/commands/tanzu_management-cluster_upgrade.md +++ /dev/null @@ -1,60 +0,0 @@ -## tanzu management-cluster upgrade - -Upgrades the management cluster - -``` -tanzu management-cluster upgrade [flags] -``` - -### Examples - -``` - - # Upgrade a management cluster - tanzu management-cluster upgrade - - # Upgrade a management cluster using specific os name (vsphere) - tanzu management-cluster upgrade mc-1 --os-name photon - - # Upgrade a management cluster using specific os name and version - tanzu management-cluster upgrade mc-1 --os-name ubuntu --os-version 20.04 - - # Upgrade a management cluster using specific os name, version and arch - tanzu management-cluster upgrade mc-1 --os-name ubuntu --os-version 20.04 --os-arch amd64 - - [+] : Options available for: os-name, os-version, os-arch are as follows: - vSphere: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name photon --os-version 3 --os-arch amd64 - aws: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name amazon --os-version 2 --os-arch amd64 - azure: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name ubuntu --os-version 18.04 --os-arch amd64 - -``` - -### Options - -``` - -h, --help help for upgrade - --os-arch string OS arch to use during management cluster upgrade. Discovered automatically if not provided (See [+]) - --os-name string OS name to use during management cluster upgrade. Discovered automatically if not provided (See [+]) - --os-version string OS version to use during management cluster upgrade. Discovered automatically if not provided (See [+]) - -t, --timeout duration Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s) (default 30m0s) - -y, --yes Upgrade management cluster without asking for confirmation -``` - -### Options inherited from parent commands - -``` - --log-file string Log file path - -v, --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu management-cluster](tanzu_management-cluster.md) - Kubernetes management cluster operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package.md b/docs/cli/commands/tanzu_package.md deleted file mode 100644 index 38dd8d4fdd..0000000000 --- a/docs/cli/commands/tanzu_package.md +++ /dev/null @@ -1,22 +0,0 @@ -## tanzu package - -Tanzu package management - -### Options - -``` - -h, --help help for package - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu package available](tanzu_package_available.md) - Manage available packages -* [tanzu package completion](tanzu_package_completion.md) - Generate the autocompletion script for the specified shell -* [tanzu package install](tanzu_package_install.md) - Install a package -* [tanzu package installed](tanzu_package_installed.md) - Manage installed packages -* [tanzu package repository](tanzu_package_repository.md) - Repository operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_available.md b/docs/cli/commands/tanzu_package_available.md deleted file mode 100644 index 0ec000d036..0000000000 --- a/docs/cli/commands/tanzu_package_available.md +++ /dev/null @@ -1,26 +0,0 @@ -## tanzu package available - -Manage available packages - -### Options - -``` - -h, --help help for available - -n, --namespace string Namespace of packages, optional (default "default") - -o, --output string Output format (yaml|json|table), optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package](tanzu_package.md) - Tanzu package management -* [tanzu package available get](tanzu_package_available_get.md) - Get details for an available package -* [tanzu package available list](tanzu_package_available_list.md) - List available packages - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_available_get.md b/docs/cli/commands/tanzu_package_available_get.md deleted file mode 100644 index 6c6b45ddef..0000000000 --- a/docs/cli/commands/tanzu_package_available_get.md +++ /dev/null @@ -1,51 +0,0 @@ -## tanzu package available get - -Get details for an available package - -### Synopsis - -Get details for an available package or the openAPI schema of a package with a specific version - -``` -tanzu package available get PACKAGE_NAME or PACKAGE_NAME/VERSION [flags] -``` - -### Examples - -``` - - # Get package details for a package without specifying the version - tanzu package available get contour.tanzu.vmware.com --namespace test-ns - - # Get package details for a package with specified version - tanzu package available get contour.tanzu.vmware.com/1.15.1-tkg.1-vmware1 --namespace test-ns - - # Get openAPI schema of a package with specified version - tanzu package available get contour.tanzu.vmware.com/1.15.1-tkg.1-vmware1 --namespace test-ns --values-schema - - # Create default values.yaml for a package with specified version based on its openAPI schema - tanzu package available get contour.tanzu.vmware.com/1.15.1-tkg.1-vmware1 --namespace test-ns --generate-default-values-file -``` - -### Options - -``` - --generate-default-values-file Generate default values from schema of the package, optional - -h, --help help for get - --values-schema Values schema of the package, optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - -n, --namespace string Namespace of packages, optional (default "default") - -o, --output string Output format (yaml|json|table), optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package available](tanzu_package_available.md) - Manage available packages - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_available_list.md b/docs/cli/commands/tanzu_package_available_list.md deleted file mode 100644 index 8baee46965..0000000000 --- a/docs/cli/commands/tanzu_package_available_list.md +++ /dev/null @@ -1,40 +0,0 @@ -## tanzu package available list - -List available packages - -``` -tanzu package available list or list PACKAGE_NAME [flags] -``` - -### Examples - -``` - - # List available packages across all namespaces - tanzu package available list -A - - # List all versions for available package from specified namespace - tanzu package available list contour.tanzu.vmware.com --namespace test-ns -``` - -### Options - -``` - -A, --all-namespaces If present, list packages across all namespaces, optional - -h, --help help for list -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - -n, --namespace string Namespace of packages, optional (default "default") - -o, --output string Output format (yaml|json|table), optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package available](tanzu_package_available.md) - Manage available packages - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_completion.md b/docs/cli/commands/tanzu_package_completion.md deleted file mode 100644 index bfce53e1ea..0000000000 --- a/docs/cli/commands/tanzu_package_completion.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu package completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for package for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package](tanzu_package.md) - Tanzu package management -* [tanzu package completion bash](tanzu_package_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu package completion fish](tanzu_package_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu package completion powershell](tanzu_package_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu package completion zsh](tanzu_package_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_completion_bash.md b/docs/cli/commands/tanzu_package_completion_bash.md deleted file mode 100644 index e15f653eaf..0000000000 --- a/docs/cli/commands/tanzu_package_completion_bash.md +++ /dev/null @@ -1,51 +0,0 @@ -## tanzu package completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(package completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - package completion bash > /etc/bash_completion.d/package - -#### macOS: - - package completion bash > $(brew --prefix)/etc/bash_completion.d/package - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu package completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package completion](tanzu_package_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_completion_fish.md b/docs/cli/commands/tanzu_package_completion_fish.md deleted file mode 100644 index 6a8189b026..0000000000 --- a/docs/cli/commands/tanzu_package_completion_fish.md +++ /dev/null @@ -1,42 +0,0 @@ -## tanzu package completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - package completion fish | source - -To load completions for every new session, execute once: - - package completion fish > ~/.config/fish/completions/package.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu package completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package completion](tanzu_package_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_completion_powershell.md b/docs/cli/commands/tanzu_package_completion_powershell.md deleted file mode 100644 index 68f019e188..0000000000 --- a/docs/cli/commands/tanzu_package_completion_powershell.md +++ /dev/null @@ -1,39 +0,0 @@ -## tanzu package completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - package completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu package completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package completion](tanzu_package_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_completion_zsh.md b/docs/cli/commands/tanzu_package_completion_zsh.md deleted file mode 100644 index d6b69c7094..0000000000 --- a/docs/cli/commands/tanzu_package_completion_zsh.md +++ /dev/null @@ -1,53 +0,0 @@ -## tanzu package completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(package completion zsh); compdef _package package - -To load completions for every new session, execute once: - -#### Linux: - - package completion zsh > "${fpath[1]}/_package" - -#### macOS: - - package completion zsh > $(brew --prefix)/share/zsh/site-functions/_package - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu package completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package completion](tanzu_package_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_install.md b/docs/cli/commands/tanzu_package_install.md deleted file mode 100644 index c5ba7d9f65..0000000000 --- a/docs/cli/commands/tanzu_package_install.md +++ /dev/null @@ -1,46 +0,0 @@ -## tanzu package install - -Install a package - -``` -tanzu package install INSTALLED_PACKAGE_NAME --package-name PACKAGE_NAME --version VERSION [flags] -``` - -### Examples - -``` - - # Install package contour with installed package name as 'contour-pkg' with specified version and without waiting for package reconciliation to complete - tanzu package install contour-pkg --package-name contour.tanzu.vmware.com --namespace test-ns --version 1.15.1-tkg.1-vmware1 --wait=false - - # Install package contour with kubeconfig flag and waiting for package reconciliation to complete - tanzu package install contour-pkg --package-name contour.tanzu.vmware.com --namespace test-ns --version 1.15.1-tkg.1-vmware1 --kubeconfig path/to/kubeconfig -``` - -### Options - -``` - --create-namespace Create namespace if the target namespace does not exist, optional - -h, --help help for install - -n, --namespace string Namespace indicates the location of the repository from which the package is retrieved (default "default") - -p, --package-name string Name of the package to be installed - --poll-interval duration Time interval between subsequent polls of package reconciliation status, optional (default 1s) - --poll-timeout duration Timeout value for polls of package reconciliation status, optional (default 15m0s) - --service-account-name string Name of an existing service account used to install underlying package contents, optional - -f, --values-file string The path to the configuration values file, optional - -v, --version string Version of the package to be installed - --wait Wait for the package reconciliation to complete, optional. To disable wait, specify --wait=false (default true) -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package](tanzu_package.md) - Tanzu package management - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_installed.md b/docs/cli/commands/tanzu_package_installed.md deleted file mode 100644 index fc90a4a209..0000000000 --- a/docs/cli/commands/tanzu_package_installed.md +++ /dev/null @@ -1,27 +0,0 @@ -## tanzu package installed - -Manage installed packages - -### Options - -``` - -h, --help help for installed -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package](tanzu_package.md) - Tanzu package management -* [tanzu package installed create](tanzu_package_installed_create.md) - Install a package -* [tanzu package installed delete](tanzu_package_installed_delete.md) - Delete an installed package -* [tanzu package installed get](tanzu_package_installed_get.md) - Get details for an installed package -* [tanzu package installed list](tanzu_package_installed_list.md) - List installed packages -* [tanzu package installed update](tanzu_package_installed_update.md) - Update an installed package - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_installed_create.md b/docs/cli/commands/tanzu_package_installed_create.md deleted file mode 100644 index 7361861041..0000000000 --- a/docs/cli/commands/tanzu_package_installed_create.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu package installed create - -Install a package - -``` -tanzu package installed create INSTALLED_PACKAGE_NAME --package-name PACKAGE_NAME --version VERSION [flags] -``` - -### Options - -``` - --create-namespace Create namespace if the target namespace does not exist, optional - -h, --help help for create - -n, --namespace string Target namespace to install the package, optional (default "default") - -p, --package-name string Name of the package to be installed - --poll-interval duration Time interval between subsequent polls of package reconciliation status, optional (default 1s) - --poll-timeout duration Timeout value for polls of package reconciliation status, optional (default 15m0s) - --service-account-name string Name of an existing service account used to install underlying package contents, optional - -f, --values-file string The path to the configuration values file, optional - -v, --version string Version of the package to be installed - --wait Wait for the package reconciliation to complete, optional (default true) -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package installed](tanzu_package_installed.md) - Manage installed packages - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_installed_delete.md b/docs/cli/commands/tanzu_package_installed_delete.md deleted file mode 100644 index 149b7cfa2b..0000000000 --- a/docs/cli/commands/tanzu_package_installed_delete.md +++ /dev/null @@ -1,42 +0,0 @@ -## tanzu package installed delete - -Delete an installed package - -### Synopsis - -Remove the installed package and almost all resources installed as part of installation of the package from the cluster. Namespaces created during installation of the package, do not automatically get deleted at the time of package uninstallation. - -``` -tanzu package installed delete INSTALLED_PACKAGE_NAME [flags] -``` - -### Examples - -``` - - # Delete installed package with name 'contour-pkg' from specified namespace - tanzu package installed delete contour-pkg -n test-ns -``` - -### Options - -``` - -h, --help help for delete - -n, --namespace string Target namespace from which the package should be deleted, optional (default "default") - --poll-interval duration Time interval between subsequent polls of package deletion status, optional (default 1s) - --poll-timeout duration Timeout value for polls of package deletion status, optional (default 15m0s) - -y, --yes Delete installed package without asking for confirmation, optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package installed](tanzu_package_installed.md) - Manage installed packages - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_installed_get.md b/docs/cli/commands/tanzu_package_installed_get.md deleted file mode 100644 index ed78dd02f3..0000000000 --- a/docs/cli/commands/tanzu_package_installed_get.md +++ /dev/null @@ -1,37 +0,0 @@ -## tanzu package installed get - -Get details for an installed package - -``` -tanzu package installed get INSTALLED_PACKAGE_NAME [flags] -``` - -### Examples - -``` - - # Get package details for installed package with name 'contour-pkg' in specified namespace - tanzu package installed get contour-pkg --namespace test-ns -``` - -### Options - -``` - -h, --help help for get - -n, --namespace string Namespace for installed package CR, optional (default "default") - -o, --output string Output format (yaml|json|table), optional - -f, --values-file string The path to the configuration values file, optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package installed](tanzu_package_installed.md) - Manage installed packages - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_installed_list.md b/docs/cli/commands/tanzu_package_installed_list.md deleted file mode 100644 index 51b9f88ae6..0000000000 --- a/docs/cli/commands/tanzu_package_installed_list.md +++ /dev/null @@ -1,40 +0,0 @@ -## tanzu package installed list - -List installed packages - -``` -tanzu package installed list [flags] -``` - -### Examples - -``` - - # List installed packages across all namespaces - tanzu package installed list -A - - # List installed packages from specified namespace - tanzu package installed list --namespace test-ns -``` - -### Options - -``` - -A, --all-namespaces If present, list packages across all namespaces, optional - -h, --help help for list - -n, --namespace string Namespace for installed package CR, optional (default "default") - -o, --output string Output format (yaml|json|table), optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package installed](tanzu_package_installed.md) - Manage installed packages - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_installed_update.md b/docs/cli/commands/tanzu_package_installed_update.md deleted file mode 100644 index d3a47186e3..0000000000 --- a/docs/cli/commands/tanzu_package_installed_update.md +++ /dev/null @@ -1,42 +0,0 @@ -## tanzu package installed update - -Update an installed package - -``` -tanzu package installed update INSTALLED_PACKAGE_NAME [flags] -``` - -### Examples - -``` - - # Update installed package with name 'mypkg' with some version to version '3.0.0-rc.1' in specified namespace - tanzu package installed update mypkg --version 3.0.0-rc.1 --namespace test-ns -``` - -### Options - -``` - -h, --help help for update - --install Install package if the installed package does not exist, optional - -n, --namespace string The namespace to locate the installed package which needs to be updated (default "default") - -p, --package-name string The public name for the package, optional - --poll-interval duration Time interval between subsequent polls of package reconciliation status, optional (default 1s) - --poll-timeout duration Timeout value for polls of package reconciliation status, optional (default 15m0s) - -f, --values-file string The path to the configuration values file, optional - -v, --version string The version which installed package needs to be updated to, optional - --wait Wait for the package reconciliation to complete, optional. To disable wait, specify --wait=false (default true) -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package installed](tanzu_package_installed.md) - Manage installed packages - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_repository.md b/docs/cli/commands/tanzu_package_repository.md deleted file mode 100644 index df0cdb0ab6..0000000000 --- a/docs/cli/commands/tanzu_package_repository.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu package repository - -Repository operations - -### Synopsis - -Add, list, get or delete a package repository for Tanzu packages. A package repository is a collection of packages that are grouped together into an imgpkg bundle. - -### Options - -``` - -h, --help help for repository - -n, --namespace string Namespace for repository command, optional (default "default") -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package](tanzu_package.md) - Tanzu package management -* [tanzu package repository add](tanzu_package_repository_add.md) - Add a package repository -* [tanzu package repository delete](tanzu_package_repository_delete.md) - Delete a package repository -* [tanzu package repository get](tanzu_package_repository_get.md) - Get details for a package repository -* [tanzu package repository list](tanzu_package_repository_list.md) - List package repositories -* [tanzu package repository update](tanzu_package_repository_update.md) - Update a package repository - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_repository_add.md b/docs/cli/commands/tanzu_package_repository_add.md deleted file mode 100644 index d73cff3c74..0000000000 --- a/docs/cli/commands/tanzu_package_repository_add.md +++ /dev/null @@ -1,40 +0,0 @@ -## tanzu package repository add - -Add a package repository - -``` -tanzu package repository add REPOSITORY_NAME --url REPOSITORY_URL [flags] -``` - -### Examples - -``` - - # Add a repository in specified namespace which does not exist - tanzu package repository add repo --url projects-stg.registry.vmware.com/tkg/standard-repo:v1.0.0 --namespace test-ns --create-namespace -``` - -### Options - -``` - --create-namespace Create namespace if the target namespace does not exist, optional - -h, --help help for add - --poll-interval duration Time interval between subsequent polls of package repository reconciliation status, optional (default 1s) - --poll-timeout duration Timeout value for polls of package repository reconciliation status, optional (default 15m0s) - --url string OCI registry url for package repository bundle - --wait Wait for the package repository reconciliation to complete, optional. To disable wait, specify --wait=false (default true) -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - -n, --namespace string Namespace for repository command, optional (default "default") - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package repository](tanzu_package_repository.md) - Repository operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_repository_delete.md b/docs/cli/commands/tanzu_package_repository_delete.md deleted file mode 100644 index 1ad249a625..0000000000 --- a/docs/cli/commands/tanzu_package_repository_delete.md +++ /dev/null @@ -1,40 +0,0 @@ -## tanzu package repository delete - -Delete a package repository - -``` -tanzu package repository delete REPOSITORY_NAME [flags] -``` - -### Examples - -``` - - # Delete a repository in specified namespace - tanzu package repository delete repo --namespace test-ns -``` - -### Options - -``` - -f, --force Force deletion of the package repository, optional - -h, --help help for delete - --poll-interval duration Time interval between subsequent polls of package repository reconciliation status, optional (default 1s) - --poll-timeout duration Timeout value for polls of package repository reconciliation status, optional (default 15m0s) - --wait Wait for the package repository reconciliation to complete, optional. To disable wait, specify --wait=false (default true) - -y, --yes Delete package repository without asking for confirmation, optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - -n, --namespace string Namespace for repository command, optional (default "default") - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package repository](tanzu_package_repository.md) - Repository operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_repository_get.md b/docs/cli/commands/tanzu_package_repository_get.md deleted file mode 100644 index e29a2ebdb7..0000000000 --- a/docs/cli/commands/tanzu_package_repository_get.md +++ /dev/null @@ -1,36 +0,0 @@ -## tanzu package repository get - -Get details for a package repository - -``` -tanzu package repository get REPOSITORY_NAME [flags] -``` - -### Examples - -``` - - # Get details for a repository in specified namespace - tanzu package repository get repo --namespace test-ns -``` - -### Options - -``` - -h, --help help for get - -o, --output string Output format (yaml|json|table), optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - -n, --namespace string Namespace for repository command, optional (default "default") - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package repository](tanzu_package_repository.md) - Repository operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_repository_list.md b/docs/cli/commands/tanzu_package_repository_list.md deleted file mode 100644 index c3c7c01b46..0000000000 --- a/docs/cli/commands/tanzu_package_repository_list.md +++ /dev/null @@ -1,40 +0,0 @@ -## tanzu package repository list - -List package repositories - -``` -tanzu package repository list [flags] -``` - -### Examples - -``` - - # List repositories across all namespaces - tanzu package repository list -A - - # List installed packages from default namespace - tanzu package repository list -``` - -### Options - -``` - -A, --all-namespaces If present, list the package repositories across all namespaces, optional - -h, --help help for list - -o, --output string Output format (yaml|json|table), optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - -n, --namespace string Namespace for repository command, optional (default "default") - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package repository](tanzu_package_repository.md) - Repository operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_package_repository_update.md b/docs/cli/commands/tanzu_package_repository_update.md deleted file mode 100644 index a4d0da5697..0000000000 --- a/docs/cli/commands/tanzu_package_repository_update.md +++ /dev/null @@ -1,41 +0,0 @@ -## tanzu package repository update - -Update a package repository - -``` -tanzu package repository update REPOSITORY_NAME --url REPOSITORY_URL [flags] -``` - -### Examples - -``` - - # Update repository in default namespace - tanzu package repository update repo --url projects-stg.registry.vmware.com/tkg/standard-repo:v1.0.1 --namespace test-ns -``` - -### Options - -``` - --create Creates the package repository if it does not exist, optional - --create-namespace Create namespace if the target namespace does not exist, optional - -h, --help help for update - --poll-interval duration Time interval between subsequent polls of package repository reconciliation status, optional (default 1s) - --poll-timeout duration Timeout value for polls of package repository reconciliation status, optional (default 15m0s) - --url string OCI registry url for package repository bundle - --wait Wait for the package repository reconciliation to complete, optional. To disable wait, specify --wait=false (default true) -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - -n, --namespace string Namespace for repository command, optional (default "default") - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu package repository](tanzu_package_repository.md) - Repository operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_pinniped-auth.md b/docs/cli/commands/tanzu_pinniped-auth.md deleted file mode 100644 index 07dff2a377..0000000000 --- a/docs/cli/commands/tanzu_pinniped-auth.md +++ /dev/null @@ -1,17 +0,0 @@ -## tanzu pinniped-auth - -Pinniped authentication operations (usually not directly invoked) - -### Options - -``` - -h, --help help for pinniped-auth -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu pinniped-auth completion](tanzu_pinniped-auth_completion.md) - Generate the autocompletion script for the specified shell -* [tanzu pinniped-auth login](tanzu_pinniped-auth_login.md) - Login using an OpenID Connect provider - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_pinniped-auth_completion.md b/docs/cli/commands/tanzu_pinniped-auth_completion.md deleted file mode 100644 index 78f4fd4251..0000000000 --- a/docs/cli/commands/tanzu_pinniped-auth_completion.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu pinniped-auth completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for pinniped-auth for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### SEE ALSO - -* [tanzu pinniped-auth](tanzu_pinniped-auth.md) - Pinniped authentication operations (usually not directly invoked) -* [tanzu pinniped-auth completion bash](tanzu_pinniped-auth_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu pinniped-auth completion fish](tanzu_pinniped-auth_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu pinniped-auth completion powershell](tanzu_pinniped-auth_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu pinniped-auth completion zsh](tanzu_pinniped-auth_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_pinniped-auth_completion_bash.md b/docs/cli/commands/tanzu_pinniped-auth_completion_bash.md deleted file mode 100644 index 2e8688ecb0..0000000000 --- a/docs/cli/commands/tanzu_pinniped-auth_completion_bash.md +++ /dev/null @@ -1,44 +0,0 @@ -## tanzu pinniped-auth completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(pinniped-auth completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - pinniped-auth completion bash > /etc/bash_completion.d/pinniped-auth - -#### macOS: - - pinniped-auth completion bash > $(brew --prefix)/etc/bash_completion.d/pinniped-auth - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu pinniped-auth completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu pinniped-auth completion](tanzu_pinniped-auth_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_pinniped-auth_completion_fish.md b/docs/cli/commands/tanzu_pinniped-auth_completion_fish.md deleted file mode 100644 index 3caf28576e..0000000000 --- a/docs/cli/commands/tanzu_pinniped-auth_completion_fish.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu pinniped-auth completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - pinniped-auth completion fish | source - -To load completions for every new session, execute once: - - pinniped-auth completion fish > ~/.config/fish/completions/pinniped-auth.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu pinniped-auth completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu pinniped-auth completion](tanzu_pinniped-auth_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_pinniped-auth_completion_powershell.md b/docs/cli/commands/tanzu_pinniped-auth_completion_powershell.md deleted file mode 100644 index b54c05760c..0000000000 --- a/docs/cli/commands/tanzu_pinniped-auth_completion_powershell.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu pinniped-auth completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - pinniped-auth completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu pinniped-auth completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu pinniped-auth completion](tanzu_pinniped-auth_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_pinniped-auth_completion_zsh.md b/docs/cli/commands/tanzu_pinniped-auth_completion_zsh.md deleted file mode 100644 index fa5788799e..0000000000 --- a/docs/cli/commands/tanzu_pinniped-auth_completion_zsh.md +++ /dev/null @@ -1,46 +0,0 @@ -## tanzu pinniped-auth completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(pinniped-auth completion zsh); compdef _pinniped-auth pinniped-auth - -To load completions for every new session, execute once: - -#### Linux: - - pinniped-auth completion zsh > "${fpath[1]}/_pinniped-auth" - -#### macOS: - - pinniped-auth completion zsh > $(brew --prefix)/share/zsh/site-functions/_pinniped-auth - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu pinniped-auth completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu pinniped-auth completion](tanzu_pinniped-auth_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_pinniped-auth_login.md b/docs/cli/commands/tanzu_pinniped-auth_login.md deleted file mode 100644 index ef95472946..0000000000 --- a/docs/cli/commands/tanzu_pinniped-auth_login.md +++ /dev/null @@ -1,45 +0,0 @@ -## tanzu pinniped-auth login - -Login using an OpenID Connect provider - -``` -tanzu pinniped-auth login [flags] -``` - -### Examples - -``` - - # pinniped-auth login using OpenID Connect provider - tanzu pinniped-auth login --issuer https://issuer.example.com --client-id tanzu-cli - - # pinniped-auth login using OpenID Connect provider with TCP port for local host listener (authorization code flow only) - tanzu pinniped-auth login --issuer https://issuer.example.com --client-id tanzu-cli --listen-port=48095 -``` - -### Options - -``` - --ca-bundle strings Path to TLS certificate authority bundle (PEM format, optional, can be repeated). - --ca-bundle-data strings Base64 endcoded TLS certificate authority bundle (base64 encoded PEM format, optional, can be repeated) - --client-id string OpenID Connect client ID. (default "pinniped-cli") - --concierge-authenticator-name string Concierge authenticator name - --concierge-authenticator-type string Concierge authenticator type (e.g., 'webhook', 'jwt') - --concierge-ca-bundle-data string CA bundle to use when connecting to the concierge - --concierge-endpoint string API base for the Pinniped concierge endpoint - --credential-cache string Path to cluster-specific credentials cache ("" disables the cache) (default "/Users/pkalle/.config/tanzu/pinniped/credentials.yaml") - --enable-concierge Exchange the OIDC ID token with the Pinniped concierge during login - -h, --help help for login - --issuer string OpenID Connect issuer URL. - --listen-port uint16 TCP port for localhost listener (authorization code flow only). - --request-audience string Request a token with an alternate audience using RFC8693 token exchange - --scopes strings OIDC scopes to request during login. (default ["offline_access, openid, pinniped:request-audience"]) - --session-cache string Path to session cache file. (default "~/.config/tanzu/pinniped/sessions.yaml") - --skip-browser Skip opening the browser (just print the URL). -``` - -### SEE ALSO - -* [tanzu pinniped-auth](tanzu_pinniped-auth.md) - Pinniped authentication operations (usually not directly invoked) - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_plugin.md b/docs/cli/commands/tanzu_plugin.md deleted file mode 100644 index fff7e32dfa..0000000000 --- a/docs/cli/commands/tanzu_plugin.md +++ /dev/null @@ -1,23 +0,0 @@ -## tanzu plugin - -Manage CLI plugins - -### Options - -``` - -h, --help help for plugin - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - Tanzu CLI -* [tanzu plugin clean](tanzu_plugin_clean.md) - Clean the plugins -* [tanzu plugin delete](tanzu_plugin_delete.md) - Delete a plugin -* [tanzu plugin describe](tanzu_plugin_describe.md) - Describe a plugin -* [tanzu plugin install](tanzu_plugin_install.md) - Install a plugin -* [tanzu plugin list](tanzu_plugin_list.md) - List available plugins -* [tanzu plugin repo](tanzu_plugin_repo.md) - Manage plugin repositories -* [tanzu plugin upgrade](tanzu_plugin_upgrade.md) - Upgrade a plugin - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_plugin_clean.md b/docs/cli/commands/tanzu_plugin_clean.md deleted file mode 100644 index 7693b7f13a..0000000000 --- a/docs/cli/commands/tanzu_plugin_clean.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu plugin clean - -Clean the plugins - -``` -tanzu plugin clean [flags] -``` - -### Options - -``` - -h, --help help for clean -``` - -### Options inherited from parent commands - -``` - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu plugin](tanzu_plugin.md) - Manage CLI plugins - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_plugin_delete.md b/docs/cli/commands/tanzu_plugin_delete.md deleted file mode 100644 index 5b17d3cfa4..0000000000 --- a/docs/cli/commands/tanzu_plugin_delete.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu plugin delete - -Delete a plugin - -``` -tanzu plugin delete [name] [flags] -``` - -### Options - -``` - -h, --help help for delete -``` - -### Options inherited from parent commands - -``` - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu plugin](tanzu_plugin.md) - Manage CLI plugins - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_plugin_describe.md b/docs/cli/commands/tanzu_plugin_describe.md deleted file mode 100644 index 7c68b19ea0..0000000000 --- a/docs/cli/commands/tanzu_plugin_describe.md +++ /dev/null @@ -1,26 +0,0 @@ -## tanzu plugin describe - -Describe a plugin - -``` -tanzu plugin describe [name] [flags] -``` - -### Options - -``` - -h, --help help for describe - -u, --include-unstable include unstable versions of the plugins -``` - -### Options inherited from parent commands - -``` - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu plugin](tanzu_plugin.md) - Manage CLI plugins - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_plugin_install.md b/docs/cli/commands/tanzu_plugin_install.md deleted file mode 100644 index a219ae2766..0000000000 --- a/docs/cli/commands/tanzu_plugin_install.md +++ /dev/null @@ -1,27 +0,0 @@ -## tanzu plugin install - -Install a plugin - -``` -tanzu plugin install [name] [flags] -``` - -### Options - -``` - -h, --help help for install - -u, --include-unstable include unstable versions of the plugins - -v, --version string version of the plugin (default "latest") -``` - -### Options inherited from parent commands - -``` - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu plugin](tanzu_plugin.md) - Manage CLI plugins - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_plugin_list.md b/docs/cli/commands/tanzu_plugin_list.md deleted file mode 100644 index 45e1153c96..0000000000 --- a/docs/cli/commands/tanzu_plugin_list.md +++ /dev/null @@ -1,26 +0,0 @@ -## tanzu plugin list - -List available plugins - -``` -tanzu plugin list [flags] -``` - -### Options - -``` - -h, --help help for list - -u, --include-unstable include unstable versions of the plugins -``` - -### Options inherited from parent commands - -``` - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu plugin](tanzu_plugin.md) - Manage CLI plugins - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_plugin_repo.md b/docs/cli/commands/tanzu_plugin_repo.md deleted file mode 100644 index 7342b0d0c3..0000000000 --- a/docs/cli/commands/tanzu_plugin_repo.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu plugin repo - -Manage plugin repositories - -### Options - -``` - -h, --help help for repo -``` - -### Options inherited from parent commands - -``` - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu plugin](tanzu_plugin.md) - Manage CLI plugins -* [tanzu plugin repo add](tanzu_plugin_repo_add.md) - Add a repository -* [tanzu plugin repo delete](tanzu_plugin_repo_delete.md) - Delete a repository -* [tanzu plugin repo list](tanzu_plugin_repo_list.md) - List available repositories -* [tanzu plugin repo update](tanzu_plugin_repo_update.md) - Update a repository configuration - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_plugin_repo_add.md b/docs/cli/commands/tanzu_plugin_repo_add.md deleted file mode 100644 index 158a58c74f..0000000000 --- a/docs/cli/commands/tanzu_plugin_repo_add.md +++ /dev/null @@ -1,28 +0,0 @@ -## tanzu plugin repo add - -Add a repository - -``` -tanzu plugin repo add [flags] -``` - -### Options - -``` - -b, --gcp-bucket-name string name of gcp bucket - -p, --gcp-root-path string root path in gcp bucket - -h, --help help for add - -n, --name string name of repository -``` - -### Options inherited from parent commands - -``` - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu plugin repo](tanzu_plugin_repo.md) - Manage plugin repositories - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_plugin_repo_delete.md b/docs/cli/commands/tanzu_plugin_repo_delete.md deleted file mode 100644 index 64f537b03a..0000000000 --- a/docs/cli/commands/tanzu_plugin_repo_delete.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu plugin repo delete - -Delete a repository - -``` -tanzu plugin repo delete [name] [flags] -``` - -### Options - -``` - -h, --help help for delete -``` - -### Options inherited from parent commands - -``` - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu plugin repo](tanzu_plugin_repo.md) - Manage plugin repositories - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_plugin_repo_list.md b/docs/cli/commands/tanzu_plugin_repo_list.md deleted file mode 100644 index e1b6985868..0000000000 --- a/docs/cli/commands/tanzu_plugin_repo_list.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu plugin repo list - -List available repositories - -``` -tanzu plugin repo list [flags] -``` - -### Options - -``` - -h, --help help for list -``` - -### Options inherited from parent commands - -``` - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu plugin repo](tanzu_plugin_repo.md) - Manage plugin repositories - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_plugin_repo_update.md b/docs/cli/commands/tanzu_plugin_repo_update.md deleted file mode 100644 index eaaf6fa31c..0000000000 --- a/docs/cli/commands/tanzu_plugin_repo_update.md +++ /dev/null @@ -1,27 +0,0 @@ -## tanzu plugin repo update - -Update a repository configuration - -``` -tanzu plugin repo update [name] [flags] -``` - -### Options - -``` - -b, --gcp-bucket-name string name of gcp bucket - -p, --gcp-root-path string root path in gcp bucket - -h, --help help for update -``` - -### Options inherited from parent commands - -``` - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu plugin repo](tanzu_plugin_repo.md) - Manage plugin repositories - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_plugin_upgrade.md b/docs/cli/commands/tanzu_plugin_upgrade.md deleted file mode 100644 index a92c79b99a..0000000000 --- a/docs/cli/commands/tanzu_plugin_upgrade.md +++ /dev/null @@ -1,26 +0,0 @@ -## tanzu plugin upgrade - -Upgrade a plugin - -``` -tanzu plugin upgrade [name] [flags] -``` - -### Options - -``` - -h, --help help for upgrade - -u, --include-unstable include unstable versions of the plugins -``` - -### Options inherited from parent commands - -``` - -l, --local strings path to local repository -``` - -### SEE ALSO - -* [tanzu plugin](tanzu_plugin.md) - Manage CLI plugins - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_secret.md b/docs/cli/commands/tanzu_secret.md deleted file mode 100644 index 2de08764dd..0000000000 --- a/docs/cli/commands/tanzu_secret.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu secret - -Tanzu secret management - -### Options - -``` - -h, --help help for secret - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu secret completion](tanzu_secret_completion.md) - Generate the autocompletion script for the specified shell -* [tanzu secret registry](tanzu_secret_registry.md) - Registry secret operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_secret_completion.md b/docs/cli/commands/tanzu_secret_completion.md deleted file mode 100644 index acd2f57ccd..0000000000 --- a/docs/cli/commands/tanzu_secret_completion.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu secret completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for secret for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu secret](tanzu_secret.md) - Tanzu secret management -* [tanzu secret completion bash](tanzu_secret_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu secret completion fish](tanzu_secret_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu secret completion powershell](tanzu_secret_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu secret completion zsh](tanzu_secret_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_secret_completion_bash.md b/docs/cli/commands/tanzu_secret_completion_bash.md deleted file mode 100644 index e4a784ff3e..0000000000 --- a/docs/cli/commands/tanzu_secret_completion_bash.md +++ /dev/null @@ -1,51 +0,0 @@ -## tanzu secret completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(secret completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - secret completion bash > /etc/bash_completion.d/secret - -#### macOS: - - secret completion bash > $(brew --prefix)/etc/bash_completion.d/secret - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu secret completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu secret completion](tanzu_secret_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_secret_completion_fish.md b/docs/cli/commands/tanzu_secret_completion_fish.md deleted file mode 100644 index 607e95b280..0000000000 --- a/docs/cli/commands/tanzu_secret_completion_fish.md +++ /dev/null @@ -1,42 +0,0 @@ -## tanzu secret completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - secret completion fish | source - -To load completions for every new session, execute once: - - secret completion fish > ~/.config/fish/completions/secret.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu secret completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu secret completion](tanzu_secret_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_secret_completion_powershell.md b/docs/cli/commands/tanzu_secret_completion_powershell.md deleted file mode 100644 index 9624cd9024..0000000000 --- a/docs/cli/commands/tanzu_secret_completion_powershell.md +++ /dev/null @@ -1,39 +0,0 @@ -## tanzu secret completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - secret completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu secret completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu secret completion](tanzu_secret_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_secret_completion_zsh.md b/docs/cli/commands/tanzu_secret_completion_zsh.md deleted file mode 100644 index 9a76feef8d..0000000000 --- a/docs/cli/commands/tanzu_secret_completion_zsh.md +++ /dev/null @@ -1,53 +0,0 @@ -## tanzu secret completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(secret completion zsh); compdef _secret secret - -To load completions for every new session, execute once: - -#### Linux: - - secret completion zsh > "${fpath[1]}/_secret" - -#### macOS: - - secret completion zsh > $(brew --prefix)/share/zsh/site-functions/_secret - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu secret completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu secret completion](tanzu_secret_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_secret_registry.md b/docs/cli/commands/tanzu_secret_registry.md deleted file mode 100644 index fd83bcd053..0000000000 --- a/docs/cli/commands/tanzu_secret_registry.md +++ /dev/null @@ -1,31 +0,0 @@ -## tanzu secret registry - -Registry secret operations - -### Synopsis - -Add, list, delete or update a registry secret. Registry secrets enable the package and package repository consumers to authenticate to and pull images from private registries. - -### Options - -``` - -h, --help help for registry - -n, --namespace string Target namespace for the registry secret, optional (default "default") -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu secret](tanzu_secret.md) - Tanzu secret management -* [tanzu secret registry add](tanzu_secret_registry_add.md) - Creates a v1/Secret resource -* [tanzu secret registry delete](tanzu_secret_registry_delete.md) - Deletes a v1/Secret resource -* [tanzu secret registry list](tanzu_secret_registry_list.md) - Lists all v1/Secrets -* [tanzu secret registry update](tanzu_secret_registry_update.md) - Updates the v1/Secret resource - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_secret_registry_add.md b/docs/cli/commands/tanzu_secret_registry_add.md deleted file mode 100644 index 68502704bf..0000000000 --- a/docs/cli/commands/tanzu_secret_registry_add.md +++ /dev/null @@ -1,50 +0,0 @@ -## tanzu secret registry add - -Creates a v1/Secret resource - -### Synopsis - -Creates a v1/Secret resource of type kubernetes.io/dockerconfigjson. In case of specifying the --export-to-all-namespaces flag, a SecretExport resource will also get created. - -``` -tanzu secret registry add SECRET_NAME --server REGISTRY_SERVER --username USERNAME --password PASSWORD [flags] -``` - -### Examples - -``` - - # Add a registry secret - tanzu secret registry add test-secret --server projects-stg.registry.vmware.com --username test-user --password-file test-file - - # Add a registry secret with 'export-to-all-namespaces' flag being set - tanzu secret registry add test-secret --server projects-stg.registry.vmware.com --username test-user --password test-pass --export-to-all-namespaces -``` - -### Options - -``` - --export-to-all-namespaces Make the registry secret available across all namespaces (i.e. create SecretExport with toNamespace=*), optional - -h, --help help for add - --password string Password for authenticating to the private registry - --password-env-var string Environment variable containing the password for authenticating to the private registry - --password-file string File containing the password for authenticating to the private registry - --password-stdin When provided, password for authenticating to the private registry would be taken from the standard input - --server string Private registry server FQDN - --username string Username for authenticating to the private registry - -y, --yes In case the --export-to-all-namespaces flag was set, export the secret to all namespaces without asking for confirmation, optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - -n, --namespace string Target namespace for the registry secret, optional (default "default") - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu secret registry](tanzu_secret_registry.md) - Registry secret operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_secret_registry_delete.md b/docs/cli/commands/tanzu_secret_registry_delete.md deleted file mode 100644 index 8e0d8c4eed..0000000000 --- a/docs/cli/commands/tanzu_secret_registry_delete.md +++ /dev/null @@ -1,40 +0,0 @@ -## tanzu secret registry delete - -Deletes a v1/Secret resource - -### Synopsis - -Deletes a v1/Secret resource of type kubernetes.io/dockerconfigjson and the associated SecretExport from the cluster - -``` -tanzu secret registry delete SECRET_NAME [flags] -``` - -### Examples - -``` - - # Delete a registry secret - tanzu registry secret delete test-secret -``` - -### Options - -``` - -h, --help help for delete - -y, --yes Delete the registry secret without asking for confirmation, optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - -n, --namespace string Target namespace for the registry secret, optional (default "default") - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu secret registry](tanzu_secret_registry.md) - Registry secret operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_secret_registry_list.md b/docs/cli/commands/tanzu_secret_registry_list.md deleted file mode 100644 index bcf10dbe04..0000000000 --- a/docs/cli/commands/tanzu_secret_registry_list.md +++ /dev/null @@ -1,47 +0,0 @@ -## tanzu secret registry list - -Lists all v1/Secrets - -### Synopsis - -Lists all v1/Secret of type kubernetes.io/dockerconfigjson and checks for the associated SecretExport with the same name - -``` -tanzu secret registry list [flags] -``` - -### Examples - -``` - - # List registry secrets across all namespaces - tanzu registry secret list -A - - # List registry secrets from specified namespace - tanzu registry secret list -n test-ns - - # List registry secrets in json output format - tanzu registry secret list -n test-ns -o json -``` - -### Options - -``` - -A, --all-namespaces If present, list registry secrets across all namespaces, optional - -h, --help help for list - -o, --output string Output format (yaml|json|table), optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - -n, --namespace string Target namespace for the registry secret, optional (default "default") - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu secret registry](tanzu_secret_registry.md) - Registry secret operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_secret_registry_update.md b/docs/cli/commands/tanzu_secret_registry_update.md deleted file mode 100644 index 38cbe8c9a7..0000000000 --- a/docs/cli/commands/tanzu_secret_registry_update.md +++ /dev/null @@ -1,52 +0,0 @@ -## tanzu secret registry update - -Updates the v1/Secret resource - -### Synopsis - -Updates the v1/Secret resource of type kubernetes.io/dockerconfigjson. In case of specifying the --export-to-all-namespaces flag, the SecretExport resource will also get updated. Otherwise, there will be no changes in the SecretExport resource. - -``` -tanzu secret registry update SECRET_NAME --username USERNAME --password PASSWORD [flags] -``` - -### Examples - -``` - - # Update a registry secret. There will be no changes in the associated SecretExport resource - tanzu registry secret update test-secret --username test-user --password-file test-file - - # Update a registry secret with 'export-to-all-namespaces' flag being set - tanzu registry secret update test-secret --username test-user --password test-pass --export-to-all-namespaces - - # Update a registry secret with 'export-to-all-namespaces' flag being clear. In this case, the associated SecretExport resource will get deleted - tanzu registry secret update test-secret --username test-user --password test-pass --export-to-all-namespaces=false -``` - -### Options - -``` - --export-to-all-namespaces[=true] If set to true, the secret gets available across all namespaces. If set to false, the secret will get unexported from ALL namespaces in which it was previously exported to. In case of not specifying this flag, no changes will be made in the existing SecretExport resource. optional - -h, --help help for update - --password string Password for authenticating to the private registry - --password-env-var string Environment variable containing the password for authenticating to the private registry - --password-file string File containing the password for authenticating to the private registry - --password-stdin When provided, password for authenticating to the private registry would be taken from the standard input - --username string Username for authenticating to the private registry - -y, --yes In case the --export-to-all-namespaces flag was provided, export/un-export of the secret will be performed without asking for confirmation, optional -``` - -### Options inherited from parent commands - -``` - --kubeconfig string The path to the kubeconfig file, optional - -n, --namespace string Target namespace for the registry secret, optional (default "default") - --verbose int32 Number for the log level verbosity(0-9) -``` - -### SEE ALSO - -* [tanzu secret registry](tanzu_secret_registry.md) - Registry secret operations - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_telemetry.md b/docs/cli/commands/tanzu_telemetry.md deleted file mode 100644 index a6f0e7f32b..0000000000 --- a/docs/cli/commands/tanzu_telemetry.md +++ /dev/null @@ -1,18 +0,0 @@ -## tanzu telemetry - -configure cluster-wide settings for vmware tanzu telemetry - -### Options - -``` - -h, --help help for telemetry -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu telemetry completion](tanzu_telemetry_completion.md) - Generate the autocompletion script for the specified shell -* [tanzu telemetry status](tanzu_telemetry_status.md) - Status of tanzu telemetry settings -* [tanzu telemetry update](tanzu_telemetry_update.md) - Update tanzu telemetry settings - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_telemetry_completion.md b/docs/cli/commands/tanzu_telemetry_completion.md deleted file mode 100644 index df0022f5bb..0000000000 --- a/docs/cli/commands/tanzu_telemetry_completion.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu telemetry completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for telemetry for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### SEE ALSO - -* [tanzu telemetry](tanzu_telemetry.md) - configure cluster-wide settings for vmware tanzu telemetry -* [tanzu telemetry completion bash](tanzu_telemetry_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu telemetry completion fish](tanzu_telemetry_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu telemetry completion powershell](tanzu_telemetry_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu telemetry completion zsh](tanzu_telemetry_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_telemetry_completion_bash.md b/docs/cli/commands/tanzu_telemetry_completion_bash.md deleted file mode 100644 index 4be5120dd2..0000000000 --- a/docs/cli/commands/tanzu_telemetry_completion_bash.md +++ /dev/null @@ -1,44 +0,0 @@ -## tanzu telemetry completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(telemetry completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - telemetry completion bash > /etc/bash_completion.d/telemetry - -#### macOS: - - telemetry completion bash > $(brew --prefix)/etc/bash_completion.d/telemetry - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu telemetry completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu telemetry completion](tanzu_telemetry_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_telemetry_completion_fish.md b/docs/cli/commands/tanzu_telemetry_completion_fish.md deleted file mode 100644 index 6e5d8ded07..0000000000 --- a/docs/cli/commands/tanzu_telemetry_completion_fish.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu telemetry completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - telemetry completion fish | source - -To load completions for every new session, execute once: - - telemetry completion fish > ~/.config/fish/completions/telemetry.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu telemetry completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu telemetry completion](tanzu_telemetry_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_telemetry_completion_powershell.md b/docs/cli/commands/tanzu_telemetry_completion_powershell.md deleted file mode 100644 index 0b2f3486ca..0000000000 --- a/docs/cli/commands/tanzu_telemetry_completion_powershell.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu telemetry completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - telemetry completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu telemetry completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu telemetry completion](tanzu_telemetry_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_telemetry_completion_zsh.md b/docs/cli/commands/tanzu_telemetry_completion_zsh.md deleted file mode 100644 index ff6fb3d1b6..0000000000 --- a/docs/cli/commands/tanzu_telemetry_completion_zsh.md +++ /dev/null @@ -1,46 +0,0 @@ -## tanzu telemetry completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(telemetry completion zsh); compdef _telemetry telemetry - -To load completions for every new session, execute once: - -#### Linux: - - telemetry completion zsh > "${fpath[1]}/_telemetry" - -#### macOS: - - telemetry completion zsh > $(brew --prefix)/share/zsh/site-functions/_telemetry - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu telemetry completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu telemetry completion](tanzu_telemetry_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_telemetry_status.md b/docs/cli/commands/tanzu_telemetry_status.md deleted file mode 100644 index 07462ee205..0000000000 --- a/docs/cli/commands/tanzu_telemetry_status.md +++ /dev/null @@ -1,27 +0,0 @@ -## tanzu telemetry status - -Status of tanzu telemetry settings - -``` -tanzu telemetry status [flags] -``` - -### Examples - -``` - - # get status - tanzu telemetry status -``` - -### Options - -``` - -h, --help help for status -``` - -### SEE ALSO - -* [tanzu telemetry](tanzu_telemetry.md) - configure cluster-wide settings for vmware tanzu telemetry - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_telemetry_update.md b/docs/cli/commands/tanzu_telemetry_update.md deleted file mode 100644 index e586071ad8..0000000000 --- a/docs/cli/commands/tanzu_telemetry_update.md +++ /dev/null @@ -1,43 +0,0 @@ -## tanzu telemetry update - -Update tanzu telemetry settings - -``` -tanzu telemetry update [flags] -``` - -### Examples - -``` - - # opt into CEIP - tanzu telemetry update --CEIP-opt-in - # opt out of CEIP - tanzu telemetry update --CEIP-opt-out - # update shared configuration settings - tanzu telemetry update --env-is-prod "true" --entitlement-account-number "1234" --csp-org-id "XXXX" - -``` - -### Options - -``` - --CEIP-opt-in opt into VMware's CEIP program - --CEIP-opt-out opt out of VMware's CEIP program - --csp-org-id string Accepts a string and sets a cluster-wide CSP - org ID. Empty string is equivalent to - unsetting this value. - --entitlement-account-number string Accepts a string and sets a cluster-wide - entitlement account number. Empty string is - equivalent to unsetting this value - --env-is-prod string Accepts a boolean and sets a cluster-wide - value denoting whether the target is a - production cluster or not. - -h, --help help for update -``` - -### SEE ALSO - -* [tanzu telemetry](tanzu_telemetry.md) - configure cluster-wide settings for vmware tanzu telemetry - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_test.md b/docs/cli/commands/tanzu_test.md deleted file mode 100644 index 5bcdeeda4b..0000000000 --- a/docs/cli/commands/tanzu_test.md +++ /dev/null @@ -1,17 +0,0 @@ -## tanzu test - -Test the CLI - -### Options - -``` - -h, --help help for test -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - -* [tanzu test completion](tanzu_test_completion.md) - Generate the autocompletion script for the specified shell -* [tanzu test fetch](tanzu_test_fetch.md) - Fetch the plugin tests - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_test_completion.md b/docs/cli/commands/tanzu_test_completion.md deleted file mode 100644 index 5e32ea34cf..0000000000 --- a/docs/cli/commands/tanzu_test_completion.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu test completion - -Generate the autocompletion script for the specified shell - -### Synopsis - -Generate the autocompletion script for test for the specified shell. -See each sub-command's help for details on how to use the generated script. - - -### Options - -``` - -h, --help help for completion -``` - -### SEE ALSO - -* [tanzu test](tanzu_test.md) - Test the CLI -* [tanzu test completion bash](tanzu_test_completion_bash.md) - Generate the autocompletion script for bash -* [tanzu test completion fish](tanzu_test_completion_fish.md) - Generate the autocompletion script for fish -* [tanzu test completion powershell](tanzu_test_completion_powershell.md) - Generate the autocompletion script for powershell -* [tanzu test completion zsh](tanzu_test_completion_zsh.md) - Generate the autocompletion script for zsh - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_test_completion_bash.md b/docs/cli/commands/tanzu_test_completion_bash.md deleted file mode 100644 index 5c710c4770..0000000000 --- a/docs/cli/commands/tanzu_test_completion_bash.md +++ /dev/null @@ -1,44 +0,0 @@ -## tanzu test completion bash - -Generate the autocompletion script for bash - -### Synopsis - -Generate the autocompletion script for the bash shell. - -This script depends on the 'bash-completion' package. -If it is not installed already, you can install it via your OS's package manager. - -To load completions in your current shell session: - - source <(test completion bash) - -To load completions for every new session, execute once: - -#### Linux: - - test completion bash > /etc/bash_completion.d/test - -#### macOS: - - test completion bash > $(brew --prefix)/etc/bash_completion.d/test - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu test completion bash -``` - -### Options - -``` - -h, --help help for bash - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu test completion](tanzu_test_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_test_completion_fish.md b/docs/cli/commands/tanzu_test_completion_fish.md deleted file mode 100644 index 1387be17f2..0000000000 --- a/docs/cli/commands/tanzu_test_completion_fish.md +++ /dev/null @@ -1,35 +0,0 @@ -## tanzu test completion fish - -Generate the autocompletion script for fish - -### Synopsis - -Generate the autocompletion script for the fish shell. - -To load completions in your current shell session: - - test completion fish | source - -To load completions for every new session, execute once: - - test completion fish > ~/.config/fish/completions/test.fish - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu test completion fish [flags] -``` - -### Options - -``` - -h, --help help for fish - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu test completion](tanzu_test_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_test_completion_powershell.md b/docs/cli/commands/tanzu_test_completion_powershell.md deleted file mode 100644 index 5183bc2fb3..0000000000 --- a/docs/cli/commands/tanzu_test_completion_powershell.md +++ /dev/null @@ -1,32 +0,0 @@ -## tanzu test completion powershell - -Generate the autocompletion script for powershell - -### Synopsis - -Generate the autocompletion script for powershell. - -To load completions in your current shell session: - - test completion powershell | Out-String | Invoke-Expression - -To load completions for every new session, add the output of the above command -to your powershell profile. - - -``` -tanzu test completion powershell [flags] -``` - -### Options - -``` - -h, --help help for powershell - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu test completion](tanzu_test_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_test_completion_zsh.md b/docs/cli/commands/tanzu_test_completion_zsh.md deleted file mode 100644 index 3e375b2674..0000000000 --- a/docs/cli/commands/tanzu_test_completion_zsh.md +++ /dev/null @@ -1,46 +0,0 @@ -## tanzu test completion zsh - -Generate the autocompletion script for zsh - -### Synopsis - -Generate the autocompletion script for the zsh shell. - -If shell completion is not already enabled in your environment you will need -to enable it. You can execute the following once: - - echo "autoload -U compinit; compinit" >> ~/.zshrc - -To load completions in your current shell session: - - source <(test completion zsh); compdef _test test - -To load completions for every new session, execute once: - -#### Linux: - - test completion zsh > "${fpath[1]}/_test" - -#### macOS: - - test completion zsh > $(brew --prefix)/share/zsh/site-functions/_test - -You will need to start a new shell for this setup to take effect. - - -``` -tanzu test completion zsh [flags] -``` - -### Options - -``` - -h, --help help for zsh - --no-descriptions disable completion descriptions -``` - -### SEE ALSO - -* [tanzu test completion](tanzu_test_completion.md) - Generate the autocompletion script for the specified shell - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_test_fetch.md b/docs/cli/commands/tanzu_test_fetch.md deleted file mode 100644 index 595843a191..0000000000 --- a/docs/cli/commands/tanzu_test_fetch.md +++ /dev/null @@ -1,20 +0,0 @@ -## tanzu test fetch - -Fetch the plugin tests - -``` -tanzu test fetch [flags] -``` - -### Options - -``` - -h, --help help for fetch - -l, --local strings paths to local repository -``` - -### SEE ALSO - -* [tanzu test](tanzu_test.md) - Test the CLI - -###### Auto generated by spf13/cobra on 14-Sep-2022 diff --git a/docs/cli/commands/tanzu_test_plugin.md b/docs/cli/commands/tanzu_test_plugin.md deleted file mode 100644 index b5a1cf1889..0000000000 --- a/docs/cli/commands/tanzu_test_plugin.md +++ /dev/null @@ -1,25 +0,0 @@ -## tanzu test plugin - -Plugin tests - -### Options - -``` - -h, --help help for plugin -``` - -### SEE ALSO - -* [tanzu test](tanzu_test.md) - Test the CLI -* [tanzu test plugin builder](tanzu_test_plugin_builder.md) - Build Tanzu components -* [tanzu test plugin cluster](tanzu_test_plugin_cluster.md) - Kubernetes cluster operations -* [tanzu test plugin codegen](tanzu_test_plugin_codegen.md) - Tanzu code generation tool -* [tanzu test plugin kubernetes-release](tanzu_test_plugin_kubernetes-release.md) - Kubernetes release operations -* [tanzu test plugin login](tanzu_test_plugin_login.md) - Login to the platform -* [tanzu test plugin management-cluster](tanzu_test_plugin_management-cluster.md) - Kubernetes management cluster operations -* [tanzu test plugin package](tanzu_test_plugin_package.md) - Tanzu package management -* [tanzu test plugin pinniped-auth](tanzu_test_plugin_pinniped-auth.md) - Pinniped authentication operations (usually not directly invoked) -* [tanzu test plugin secret](tanzu_test_plugin_secret.md) - Tanzu secret management -* [tanzu test plugin test](tanzu_test_plugin_test.md) - Test the CLI - -###### Auto generated by spf13/cobra on 5-Nov-2021 diff --git a/docs/cli/commands/tanzu_test_plugin_alpha.md b/docs/cli/commands/tanzu_test_plugin_alpha.md deleted file mode 100644 index cdcf86ecff..0000000000 --- a/docs/cli/commands/tanzu_test_plugin_alpha.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu test plugin alpha - -Alpha CLI commands - -``` -tanzu test plugin alpha [flags] -``` - -### Options - -``` - -h, --help help for alpha -``` - -### SEE ALSO - -* [tanzu test plugin](tanzu_test_plugin.md) - Plugin tests - -###### Auto generated by spf13/cobra on 10-May-2021 diff --git a/docs/cli/commands/tanzu_test_plugin_builder.md b/docs/cli/commands/tanzu_test_plugin_builder.md deleted file mode 100644 index 1fe9fb0fd1..0000000000 --- a/docs/cli/commands/tanzu_test_plugin_builder.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu test plugin builder - -Build Tanzu components - -``` -tanzu test plugin builder [flags] -``` - -### Options - -``` - -h, --help help for builder -``` - -### SEE ALSO - -* [tanzu test plugin](tanzu_test_plugin.md) - Plugin tests - -###### Auto generated by spf13/cobra on 5-Nov-2021 diff --git a/docs/cli/commands/tanzu_test_plugin_cluster.md b/docs/cli/commands/tanzu_test_plugin_cluster.md deleted file mode 100644 index ff6bbb7024..0000000000 --- a/docs/cli/commands/tanzu_test_plugin_cluster.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu test plugin cluster - -Kubernetes cluster operations - -``` -tanzu test plugin cluster [flags] -``` - -### Options - -``` - -h, --help help for cluster -``` - -### SEE ALSO - -* [tanzu test plugin](tanzu_test_plugin.md) - Plugin tests - -###### Auto generated by spf13/cobra on 5-Nov-2021 diff --git a/docs/cli/commands/tanzu_test_plugin_codegen.md b/docs/cli/commands/tanzu_test_plugin_codegen.md deleted file mode 100644 index cb8d14c246..0000000000 --- a/docs/cli/commands/tanzu_test_plugin_codegen.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu test plugin codegen - -Tanzu code generation tool - -``` -tanzu test plugin codegen [flags] -``` - -### Options - -``` - -h, --help help for codegen -``` - -### SEE ALSO - -* [tanzu test plugin](tanzu_test_plugin.md) - Plugin tests - -###### Auto generated by spf13/cobra on 5-Nov-2021 diff --git a/docs/cli/commands/tanzu_test_plugin_kubernetes-release.md b/docs/cli/commands/tanzu_test_plugin_kubernetes-release.md deleted file mode 100644 index fba53e86ac..0000000000 --- a/docs/cli/commands/tanzu_test_plugin_kubernetes-release.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu test plugin kubernetes-release - -Kubernetes release operations - -``` -tanzu test plugin kubernetes-release [flags] -``` - -### Options - -``` - -h, --help help for kubernetes-release -``` - -### SEE ALSO - -* [tanzu test plugin](tanzu_test_plugin.md) - Plugin tests - -###### Auto generated by spf13/cobra on 5-Nov-2021 diff --git a/docs/cli/commands/tanzu_test_plugin_login.md b/docs/cli/commands/tanzu_test_plugin_login.md deleted file mode 100644 index e9c0c5958c..0000000000 --- a/docs/cli/commands/tanzu_test_plugin_login.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu test plugin login - -Login to the platform - -``` -tanzu test plugin login [flags] -``` - -### Options - -``` - -h, --help help for login -``` - -### SEE ALSO - -* [tanzu test plugin](tanzu_test_plugin.md) - Plugin tests - -###### Auto generated by spf13/cobra on 5-Nov-2021 diff --git a/docs/cli/commands/tanzu_test_plugin_management-cluster.md b/docs/cli/commands/tanzu_test_plugin_management-cluster.md deleted file mode 100644 index 284b201603..0000000000 --- a/docs/cli/commands/tanzu_test_plugin_management-cluster.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu test plugin management-cluster - -Kubernetes management cluster operations - -``` -tanzu test plugin management-cluster [flags] -``` - -### Options - -``` - -h, --help help for management-cluster -``` - -### SEE ALSO - -* [tanzu test plugin](tanzu_test_plugin.md) - Plugin tests - -###### Auto generated by spf13/cobra on 5-Nov-2021 diff --git a/docs/cli/commands/tanzu_test_plugin_package.md b/docs/cli/commands/tanzu_test_plugin_package.md deleted file mode 100644 index 0167df527a..0000000000 --- a/docs/cli/commands/tanzu_test_plugin_package.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu test plugin package - -Tanzu package management - -``` -tanzu test plugin package [flags] -``` - -### Options - -``` - -h, --help help for package -``` - -### SEE ALSO - -* [tanzu test plugin](tanzu_test_plugin.md) - Plugin tests - -###### Auto generated by spf13/cobra on 5-Nov-2021 diff --git a/docs/cli/commands/tanzu_test_plugin_pinniped-auth.md b/docs/cli/commands/tanzu_test_plugin_pinniped-auth.md deleted file mode 100644 index c94f4b5a75..0000000000 --- a/docs/cli/commands/tanzu_test_plugin_pinniped-auth.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu test plugin pinniped-auth - -Pinniped authentication operations (usually not directly invoked) - -``` -tanzu test plugin pinniped-auth [flags] -``` - -### Options - -``` - -h, --help help for pinniped-auth -``` - -### SEE ALSO - -* [tanzu test plugin](tanzu_test_plugin.md) - Plugin tests - -###### Auto generated by spf13/cobra on 5-Nov-2021 diff --git a/docs/cli/commands/tanzu_test_plugin_secret.md b/docs/cli/commands/tanzu_test_plugin_secret.md deleted file mode 100644 index efbe41dd6f..0000000000 --- a/docs/cli/commands/tanzu_test_plugin_secret.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu test plugin secret - -Tanzu secret management - -``` -tanzu test plugin secret [flags] -``` - -### Options - -``` - -h, --help help for secret -``` - -### SEE ALSO - -* [tanzu test plugin](tanzu_test_plugin.md) - Plugin tests - -###### Auto generated by spf13/cobra on 5-Nov-2021 diff --git a/docs/cli/commands/tanzu_test_plugin_test.md b/docs/cli/commands/tanzu_test_plugin_test.md deleted file mode 100644 index 49d169d0fc..0000000000 --- a/docs/cli/commands/tanzu_test_plugin_test.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu test plugin test - -Test the CLI - -``` -tanzu test plugin test [flags] -``` - -### Options - -``` - -h, --help help for test -``` - -### SEE ALSO - -* [tanzu test plugin](tanzu_test_plugin.md) - Plugin tests - -###### Auto generated by spf13/cobra on 5-Nov-2021 diff --git a/docs/cli/commands/tanzu_update.md b/docs/cli/commands/tanzu_update.md deleted file mode 100644 index eed1c496a9..0000000000 --- a/docs/cli/commands/tanzu_update.md +++ /dev/null @@ -1,22 +0,0 @@ -## tanzu update - -Update the CLI - -``` -tanzu update [flags] -``` - -### Options - -``` - -h, --help help for update - -u, --include-unstable include unstable versions of the plugins - -l, --local strings path to local repository - -y, --yes force update; skip prompt -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - Tanzu CLI - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/commands/tanzu_version.md b/docs/cli/commands/tanzu_version.md deleted file mode 100644 index 8a8bdab778..0000000000 --- a/docs/cli/commands/tanzu_version.md +++ /dev/null @@ -1,19 +0,0 @@ -## tanzu version - -Version information - -``` -tanzu version [flags] -``` - -### Options - -``` - -h, --help help for version -``` - -### SEE ALSO - -* [tanzu](tanzu.md) - Tanzu CLI - -###### Auto generated by spf13/cobra on 4-May-2021 diff --git a/docs/cli/example-images/error-warn.png b/docs/cli/example-images/error-warn.png deleted file mode 100644 index 6167b145c4..0000000000 Binary files a/docs/cli/example-images/error-warn.png and /dev/null differ diff --git a/docs/cli/example-images/feedback.png b/docs/cli/example-images/feedback.png deleted file mode 100644 index 52d94dce7e..0000000000 Binary files a/docs/cli/example-images/feedback.png and /dev/null differ diff --git a/docs/cli/example-images/prompting.png b/docs/cli/example-images/prompting.png deleted file mode 100644 index e82253a65e..0000000000 Binary files a/docs/cli/example-images/prompting.png and /dev/null differ diff --git a/docs/cli/example-images/success.png b/docs/cli/example-images/success.png deleted file mode 100644 index 48e5aa1f3b..0000000000 Binary files a/docs/cli/example-images/success.png and /dev/null differ diff --git a/docs/cli/example-images/table-text.png b/docs/cli/example-images/table-text.png deleted file mode 100644 index 7c00805ef7..0000000000 Binary files a/docs/cli/example-images/table-text.png and /dev/null differ diff --git a/docs/cli/example-images/usage-tips.png b/docs/cli/example-images/usage-tips.png deleted file mode 100644 index 9905ba56cc..0000000000 Binary files a/docs/cli/example-images/usage-tips.png and /dev/null differ diff --git a/docs/cli/getting-started.md b/docs/cli/getting-started.md deleted file mode 100644 index 94c38034e9..0000000000 --- a/docs/cli/getting-started.md +++ /dev/null @@ -1,349 +0,0 @@ -# Tanzu Command Line Interface (CLI) Getting Started - -A simple set of instructions to set up and use the `tanzu` CLI and plugins. - -## CLI binary and plugins installation - -### Supported Platforms - -Following are the combinations supported for CLI - -| OS | Architecture | -| :-----: | :----------: | -| Linux | amd64 | -| macOS | amd64 | -| Windows | amd64 | - -### Install the latest release of Tanzu CLI - -#### Recommended method to install plugins (with API-driven plugin discovery activated) - -With [v0.14.0](https://github.com/vmware-tanzu/tanzu-framework/releases/tag/v0.14.0) release, the artifacts are better categorized and published to allow users to download and configure per recommended and alternate methods. - -The API driven plugin discovery feature is enabled as default method to install the plugins. So, most users will just need to install the Tanzu CLI binary. The plugins can be installed and configured with `tanzu plugin sync` command. Learn more about this feature in the [design docs](../design/context-aware-plugin-discovery-design.md). - -##### macOS/Linux - -###### Option 1: Manual download CLI binary from GitHub Releases - -- Download the latest tanzu-cli tarball from [release](https://github.com/vmware-tanzu/tanzu-framework/releases/latest) page (`tanzu-cli-darwin-amd64.tar.gz` or `tanzu-cli-linux-amd64.tar.gz`) - -- Extract the downloaded tar file - - - for macOS: - - ```sh - mkdir tanzu && tar -zxvf tanzu-cli-darwin-amd64.tar.gz -C tanzu - ``` - - - for Linux: - - ```sh - mkdir tanzu && tar -zxvf tanzu-cli-linux-amd64.tar.gz -C tanzu - ``` - -- Install the `tanzu` CLI - - Note: Replace `v0.14.0` with the version you've downloaded. - - - for macOS: - - ```sh - install tanzu/v0.14.0/tanzu-core-darwin_amd64 /usr/local/bin/tanzu - ``` - - - for Linux: - - ```sh - sudo install tanzu/v0.14.0/tanzu-core-linux_amd64 /usr/local/bin/tanzu - ``` - -- Install the available plugins - - ```sh - tanzu plugin sync - ``` - -- Verify installed plugins - - ```sh - tanzu plugin list - ``` - -###### Option 2: Using install script - -You may download and install a release using the provided remote script piped into bash. - -```shell -curl -H "Accept: application/vnd.github.v3.raw" \ - -L https://api.github.com/repos/vmware-tanzu/tanzu-framework/contents/hack/fetch-install-tf.sh | \ - bash -s -``` - -- This script requires `curl`,`grep`,`tr` and `jq` in order to work. -- The release will be downloaded to a temporary directory and then installation will proceed using the downloaded `tanzu` CLI binary. -- _Note_: A GitHub personal access token may be provided to the script as the `GITHUB_TOKEN` environment variable. This bypasses GitHub API rate limiting but is not required. Follow the [GitHub documentation](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token) to acquire and use a personal access token. - -##### Windows - -- Download the latest `tanzu-cli-windows-amd64.zip` from [release](https://github.com/vmware-tanzu/tanzu-framework/releases/latest) page - -- Open PowerShell as an administrator, change to the download directory and run: - - ```sh - Expand-Archive tanzu-cli-windows-amd64.zip -DestinationPath tanzu - cd .\tanzu\ - ``` - -- Save following in `install.bat` in current directory and run `install.bat` - - Note: Replace `v0.11.0` (line number 3) with the version you've downloaded. - - ```sh - SET TANZU_CLI_DIR=%ProgramFiles%\tanzu - mkdir "%TANZU_CLI_DIR%" - copy /B /Y v0.11.0\tanzu-core-windows_amd64.exe "%TANZU_CLI_DIR%\tanzu.exe" - set PATH=%PATH%;%TANZU_CLI_DIR% - SET PLUGIN_DIR=%LocalAppData%\tanzu-cli - mkdir %PLUGIN_DIR% - SET TANZU_CACHE_DIR=%LocalAppData%\.cache\tanzu - rmdir /Q /S %TANZU_CACHE_DIR% - tanzu plugin sync - tanzu plugin list - ``` - -- Add `Program Files\tanzu` to your PATH. - -#### Legacy method to install plugins (with API-driven plugin discovery deactivated) - -Users can still install the plugins using the legacy method by deactivating the `context-aware-cli-for-plugins` feature. - -
Installation steps - -#### macOS/Linux - -- Deactivate API-driven plugin discovery - - ```sh - tanzu config set features.global.context-aware-cli-for-plugins false - ``` - -- If you have a previous version of tanzu CLI already installed and the config file ~/.config/tanzu/config.yaml is present, run this command to make sure the default plugin repo points to the right path. - - ```sh - tanzu plugin repo update -b tanzu-cli-framework core - ``` - -- Install the downloaded plugins - - ```sh - tanzu plugin install --local tanzu/cli all - ``` - -- Verify the installed plugins - - ```sh - tanzu plugin list - ``` - -#### Windows - -- Save following in `install.bat` in current directory and run `install.bat` - - Note: Replace `v0.14.0` (line number 3) with the version you've downloaded. - - ```sh - SET TANZU_CLI_DIR=%ProgramFiles%\tanzu - mkdir "%TANZU_CLI_DIR%" - copy /B /Y cli\core\v0.14.0\tanzu-core-windows_amd64.exe "%TANZU_CLI_DIR%\tanzu.exe" - set PATH=%PATH%;%TANZU_CLI_DIR% - SET PLUGIN_DIR=%LocalAppData%\tanzu-cli - mkdir %PLUGIN_DIR% - SET TANZU_CACHE_DIR=%LocalAppData%\.cache\tanzu - rmdir /Q /S %TANZU_CACHE_DIR% - - tanzu config set features.global.context-aware-cli-for-plugins false - tanzu plugin repo update -b tanzu-cli-framework core - tanzu plugin install --local cli all - - tanzu plugin list - ``` - -- Add `Program Files\tanzu` to your PATH. - -
- -## Delete a selected plugin - -If you want to delete a given plugin (one use case is when a plugin has become obsolete), you can run the following command: - -```sh -tanzu plugin delete -``` - -With `v0.11.0` release, the plugin `imagepullsecret` is deprecated and renamed `secret`. The new plugin `secret` will be installed following -the instructions listed above. Remove the installed deprecated plugin if it exists using: - -```sh -tanzu plugin delete imagepullsecret -``` - -## Build the CLI and plugins from source - -If you want the very latest, you can also build and install tanzu CLI, and its plugins, from source. - -### Prerequisites - -- [go](https://golang.org/dl/) version 1.17 - -- Clone Tanzu Framework and run the below command to build and install CLI and - plugins locally for your platform. - - ```sh - make build-install-cli-local - ``` - -- When the build is done, the tanzu CLI binary and the plugins will be produced locally in the `artifacts` directory. - The CLI binary will be in a directory similar to the following: - - ```bash - ./artifacts///cli/core//tanzu-core- - ``` - -- For instance, the following is a build for MacOS: - - ```bash - ./artifacts/darwin/amd64/cli/core/latest/tanzu-core-darwin_amd64 - ``` - -- If you additionally want to build and install CLI and plugins for all platforms, run: - - ```sh - make build-install-cli-all - ``` - -The CLI has 2 different types of plugins. - - 1. Standalone plugins: independent of the CLI context - 2. Context(server) scoped plugins: scoped to one or more contexts - -When building the CLI locally and installing plugins with `make build-install-cli-local` or `make build-install-cli-all`, the `local` file-system based standalone plugin discovery and distribution is used. While building locally all plugins are treated as standalone plugins. The type of discovery which gets used is determined by `DISCOVERY_TYPE` variable that configures `pkg/v1/config.DefaultStandaloneDiscoveryType` variable while building the Tanzu CLI. Please check `build-cli-%` target under the [Makefile](./Makefile) - -However, for official release, which uses OCI image based plugin discovery and distribution, `cluster` and `kubernetes-release` are context scoped plugins whereas `login`, `management-cluster`, `package` and `secret` are considered standalone plugins. Users can run `tanzu plugin list` command to check the plugin's scope and discovery information. -All admin plugins like `builder`, `test` etc. are also considered standalone plugins. - -More details about this can be found in [context-aware plugin discovery](docs/design/context-aware-plugin-discovery-design.md) design document. - -## Usage - -```sh -Usage: - tanzu [command] - -Available command groups: - - Admin - builder Build Tanzu components - test Test the CLI - - Run - cluster Kubernetes cluster operations - kubernetes-release Kubernetes release operations - management-cluster Kubernetes management cluster operations - - System - completion Output shell completion code - config Configuration for the CLI - init Initialize the CLI - login Login to the platform - plugin Manage CLI plugins - update Update the CLI - version Version information - - Version - alpha Alpha CLI commands - - -Flags: - -h, --help help for tanzu - -Use "tanzu [command] --help" for more information about a command. -``` - -## Creating clusters - -Tanzu CLI allows you to create clusters on a variety of infrastructure platforms -such as vSphere, Azure, AWS and on Docker. - -1. Initialize the Tanzu kickstart UI by running the below command to create the -management cluster. - - ```sh - tanzu management-cluster create --ui - ``` - - The above would open a management cluster provisioning UI and you can select the - deployment infrastructure and create the cluster. - -1. To validate the creation of the management cluster - - ```sh - tanzu management-cluster get - ``` - -1. Get the management cluster's kubeconfig - - ```sh - tanzu management-cluster kubeconfig get ${MGMT_CLUSTER_NAME} --admin - ``` - -1. Set kubectl context - - ```sh - kubectl config use-context ${MGMT_CLUSTER_NAME}-admin@${MGMT_CLUSTER_NAME} - ``` - -1. Next create the workload cluster - - 1. Create a new workload clusterconfig file by copying the management cluster config file - `~/.config/tanzu/tkg/clusterconfigs/` and changing the `CLUSTER_NAME` parameter - to the workload cluster name, you can also edit other parameters as required. - 1. Create workload cluster - - ```sh - tanzu cluster create ${WORKLOAD_CLUSTER_NAME} --file ~/.config/tanzu/tkg/clusterconfigs/workload.yaml - ``` - - 1. Validate workload cluster creation - - ```sh - tanzu cluster list - ``` - -1. Do cool things with the provisioned clusters. -1. Clean up - - 1. To delete workload cluster - - ```sh - tanzu cluster delete ${WORKLOAD_CLUSTER_NAME} - ``` - - Management cluster can only be deleted after deleting all the workload clusters. - - 1. To delete management cluster - - ```sh - tanzu management-cluster delete ${MGMT_CLUSTER_NAME} - ``` - -## What's next - -Tanzu CLI is built to be extensible, if you wish to extend Tanzu CLI, you can do -that by writing your CLI plugins. - -### Create your own plugin - -To bootstrap a new plugin, follow the `builder` plugin documentation [here](../../cmd/cli/plugin-admin/builder/README.md). - -Check out the [plugin implementation guide](../../cli/core/docs/cli/plugin_implementation_guide.md) for more details. diff --git a/docs/cli/tkgctl/README.md b/docs/cli/tkgctl/README.md deleted file mode 100644 index cd11b898f3..0000000000 --- a/docs/cli/tkgctl/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# TKG Library - -Documentation for the tkgctl library. More details about the library and components are described under [Library Components](components.md) section. - -## Table of Contents - -* [Airgapped Deployment](airgapped-deployment.md) -* [Autoscaler](autoscaler.md) -* [Library Components](components.md) -* [Logging](logging.md) -* [Spreading of AWS Nodes across AZ](spreading-aws-nodes.md) -* [Upgrade](upgrade.md) diff --git a/docs/cli/tkgctl/airgapped-deployment.md b/docs/cli/tkgctl/airgapped-deployment.md deleted file mode 100644 index dc98bf6200..0000000000 --- a/docs/cli/tkgctl/airgapped-deployment.md +++ /dev/null @@ -1,29 +0,0 @@ -# How to deploy management and workload cluster in air-gapped environment? - -tkgctl library has a config variable `TKG_CUSTOM_IMAGE_REPOSITORY` which can be set as config value in config file or as an environment variable. - -Setting up `TKG_CUSTOM_IMAGE_REPOSITORY` variable to point to internal docker registry which uses the CA signed certificate is sufficient while creating management and workload cluster with some assumption that all image are available in the provided custom repository. - -Library also supports config variables `TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE` and `TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY` for using private docker registry which uses a self signed CA certificate. Library configures containerd service in kind cluster node and management cluster nodes to use the base64-encoded CA certificate specified via `TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE` to verify the private docker registry, or skip TLS verification if `TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY` is set to true. - -## Publishing all images to custom image repository - -1. Install [yq](https://github.com/mikefarah/yq) and [jq](https://stedolan.github.io/jq/) -1. Use script [gen-publish-images.sh](/hack/gen-publish-images.sh) to generate script which can publish images to custom image repository. - - ```sh - # setup variable - export TKG_CUSTOM_IMAGE_REPOSITORY="custom-image-repository.io" - - # Generate file for airgapped image publish - ./gen-publish-images.sh > publish-images.sh - - # verify generated script - cat publish-images.sh - - # make it executable - chmod +x publish-images.sh - - # run the script to pull, retag and publish images to custom repository - ./publish-images.sh - ``` diff --git a/docs/cli/tkgctl/autoscaler.md b/docs/cli/tkgctl/autoscaler.md deleted file mode 100644 index 736e5f0e6a..0000000000 --- a/docs/cli/tkgctl/autoscaler.md +++ /dev/null @@ -1,24 +0,0 @@ -# Autoscaler support using the TKG CLI - -**Goal:** Users should be able to deploy Autoscaler automatically for a workload cluster if they want their worker nodes to be scaled up/down automatically. - -Autoscaler is deactivated by default when creating workload clusters. Users can enable autoscaler using the `ENABLE_AUTOSCALER: true` config variable. - -There are multiple configuration options for users to be able to configure the autoscaler deployment. And they can be configured using the TKG config file or via env variables. - -| Config Variable | Default | Description | -| --- | --- | --- | -| AUTOSCALER_MAX_NODES_TOTAL | 0 | Maximum number of nodes in all node groups or machine deployments. Cluster autoscaler will not grow the cluster beyond this number. If it is defaulted to 0, this configuration is not respected anymore and autoscaler will then only respect min/max values for each Machine deployment | -| AUTOSCALER_SCALE_DOWN_DELAY_AFTER_ADD | 10m | How long after scale up that scale down evaluation resumes | -| AUTOSCALER_SCALE_DOWN_DELAY_AFTER_DELETE | 10s | How long after node deletion that scale down evaluation resumes | -| AUTOSCALER_SCALE_DOWN_DELAY_AFTER_FAILURE | 3m | How long after scale down failure that scale down evaluation resumes | -| AUTOSCALER_SCALE_DOWN_UNNEEDED_TIME | 10m | How long a node should be unneeded before it is eligible for scale down | -| AUTOSCALER_MAX_NODE_PROVISION_TIME | 15m | Maximum time autoscaler waits for node to be provisioned | -| AUTOSCALER_MIN_SIZE_0 | Defaults to the value of WORKER_MACHINE_COUNT_0 if not set | Minimum number of nodes the autoscaler will scale down workers in the first AZ to | -| AUTOSCALER_MAX_SIZE_0 | Defaults to the value of WORKER_MACHINE_COUNT_0 if not set | Maximum number of nodes the autoscaler will scale up workers in the first AZ to | -| AUTOSCALER_MIN_SIZE_1 | Defaults to the value of WORKER_MACHINE_COUNT_1 if not set | Minimum number of nodes the autoscaler will scale down workers in the second AZ to (incase of multiple machine deployments) | -| AUTOSCALER_MAX_SIZE_1 | Defaults to the value of WORKER_MACHINE_COUNT_1 if not set | Maximum number of nodes the autoscaler will scale up workers in the second AZ to (incase of multiple machine deployments) | -| AUTOSCALER_MIN_SIZE_2 | Defaults to the value of WORKER_MACHINE_COUNT_2 if not set | Minimum number of nodes the autoscaler will scale down workers in the third AZ to (incase of multiple machine deployments) | -| AUTOSCALER_MAX_SIZE_2 | Defaults to the value of WORKER_MACHINE_COUNT_2 if not set | Maximum number of nodes the autoscaler will scale up workers in the third AZ to (incase of multiple machine deployments) | - -More details about autoscaler and defaults here - [https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md) diff --git a/docs/cli/tkgctl/bom.md b/docs/cli/tkgctl/bom.md deleted file mode 100644 index 92fc38b68e..0000000000 --- a/docs/cli/tkgctl/bom.md +++ /dev/null @@ -1,130 +0,0 @@ -# Details on BoM usage in the TKG library - -BoM stands for Bill of Materials. It's basically a file with a collection of dependent components required for the lifecycle management of Tanzu clusters. - -## Introduction - -Tanzu has 2 types of BoM files: - -* a TKG BoM file (1 file per TKG release) -* TKR BoM files (multiple files per TKG release) - -### TKG BoM file - -* This file contains information about TKG related components which are mainly required during the creation of management clusters. - * It specifies the TKG version under the `release.version` key and the default TKR version under the `default.k8sVersion` key. - * It also specifies cluster-api provider components, pinniped components, image repo information, and many more. - -[A sample TKG BoM file is available here.](example-boms/tkg-bom.yaml) - -### TKR BoM files - -* These files contain information related to: - * the specific k8s version, - * node images to use with the kubernetes provider (vsphere, aws, azure) for the matching k8s version, - * add-ons specific components. - -[A sample TKR BoM file is available here.](example-boms/tkr-bom.yaml) - -## Bundling BoM files into the TKG library - -* The TKG BoM file (and TKR BoM files) are decoupled from the Tanzu CLI and the TKG library (`tkgctl`). -* Instead, the Tanzu CLI is compiled with a TKG Compatibility Image path (which is a build-time constant). At runtime, the CLI downloads this compatibility file and uses it to determine the location of the appropriate TKG/TKR BoM files (choosing the version that matches the version of the management-cluster plugin currently installed). The CLI then downloads the correct BoM files to the user's machine. [Reference.](../../../tkg/tkgconfigupdater/ensure.go) - -### Why do we need a TKG Compatibility Image? - -If the BoM files were bundled with the CLI, and if, at a later time, there were a CVE fix for any images/components that are part of the TKG/TKR BoM files for an existing release, this would require a new CLI release. -By using a TKG Compatibility Image, a new CLI release can be avoided in such a case. The release team can publish a new Compatibility Image (using a new git tag) with updated TKG BoM paths for a given version of the management-cluster plugin. The CLI would then download the new Compatibility Image (using the latest Image tag) and thereby be able to download and use the updated TKG/TKR BoM files while creating a new management cluster. - -A sample compatibility file is shown below: - -```yaml -version: v2 -managementClusterPluginVersions: -- version: v1.5.1 - supportedTKGBomVersions: - - imagePath: tkg-bom - tag: v1.5.1 -- version: v1.5.0 - supportedTKGBomVersions: - - imagePath: tkg-bom - tag: v1.5.0 -``` - -Below is a new sample compatibility file after updating the BoM version (new BoM which has images/components with CVE fixes for v1.5.0). The new Compatibility Image would be pushed to an image repository along with an updated tag (e.g., **tkg/tkg-compatibility:v3**) - -```yaml -version: v3 -managementClusterPluginVersions: - - version: v1.5.1 - supportedTKGBomVersions: - - imagePath: tkg-bom - tag: v1.5.1 - - version: v1.5.0 - supportedTKGBomVersions: - - imagePath: tkg-bom - tag: v1.5.0-patch -``` - -Notes: - -* Once a management cluster is created, it runs the TKR controller which reconciles all the supported TKR BoM images and the TKR compatibility image from the Image registry and later creates configmaps and TKR resources in the management cluster using these images. -* For workload cluster creation, the CLI can download the necessary TKR BoM files to the user's local machine directly from the management cluster (using an existing ConfigMap on the management cluster). - -### Why do we need to download the TKR BoM files locally? - -* This is required because the cluster template creation logic is still running locally with the TKG library which internally uses YTT -* To generate cluster templates using YTT overlays easily we are downloading the TKR BoM files locally before generating the cluster templates -* This allows users to read and understand the content of the TKR BoM files for debugging purpose - -## Updating the TKG Compatibility Image Path into the TKG library - -If maintainers would like to permanently change the TKG Compatibility Image path, please follow the instructions below: - -1. Update the `TKG_DEFAULT_IMAGE_REPOSITORY` and `TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH` variables inside [Makefile](../../../Makefile) -2. Run `make configure-bom` which will update the build-time constants for downloading the TKG compatibility file. -3. Commit the `Makefile` changes alongside the changes generated to the constants file. - -## How are the BoM files getting used in the CLI and the cluster template creation with ytt - -### How are the BoM files getting used in the Tanzu CLI? - -* TKG Compatibility file metadata is bundled into the TKG library as build-time constants -* When the `tkgctl` client gets created, as part of ensuring prerequisites, the tkg-compatibility file and BoM files are extracted to the BoM file location. For the tanzu CLI this location will be, `$HOME/.config/tanzu/tkg/compatibility` and `$HOME/.config/tanzu/tkg/bom` respectively. If there is a compatibility file already present in the user's local file system, the new compatibility file will not be downloaded. Users can choose to delete the existing compatibility file so that the tanzu CLI will download the latest compatibility file (alternatively, users can run `tanzu config init` or `tanzu management-cluster create --force-config-update -f `). -* The TKG Library implements the [tkgconfigbom](../../../tkg/tkgconfigbom/client.go) package which provides functions to read TKG and TKR BoM files. -* The CLI reads in these BoM files from the user's local filesystem and uses their content for various purposes, of which a few are listed below: - * Uses the TKG BoM file to determine which image repository to use for provider installation and updates the images section under the TKG settings file `$HOME/.config/tanzu/tkg/config.yaml` - * Reads the TKR BoM file to select the correct AMI or Azure image to use. Uses the same information for the purpose of vSphere VM template verification - * Uses information in the TKR BoM to set configuration variables like `KUBERNETES_VERSION`, `AMI_ID`, `AZURE_IMAGE_*`, etc. -* Another use of BoM files is for cluster template generation. In that case, the ytt library is used to directly read the BoM files as text files. This is described in next section. - -### How the cluster template creation with ytt uses BoM files? - -* When creating a cluster template with ytt we read files mentioned in `cluster-template-definition-.yaml` which includes BoM files with file-mark `text-plain`. This means BoM files will be read in as plain-text files instead of as a base-template or overlay files. -* Once the BoM files are read into the ytt engine during the cluster template generation process, the code mentioned in `config_default.yaml` converts them to `data_values` as part of the ytt `boms` map. This shown below: - -```yaml -#! --------------------------------------------------------------------- -#! BoM file processing, internal use only -#! --------------------------------------------------------------------- - -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -#@ files = data.list() -boms: - #@ for/end file in [ f for f in files if f.startswith("tkg-bom") or f.startswith("tkr-bom") or f.startswith("bom")]: - - bom_name: #@ file - bom_data: #@ yaml.decode(data.read(file)) -``` - -* This will store all BoM files present under `$HOME/.config/tanzu/tkg/bom` into the `boms` array -* The TKG library sets the `TKG_DEFAULT_BOM` configuration variable before generating the cluster template which gets used to determine the default BoM file with helper functions -* ytt overlays have some getter helper functions which gets used during overlays: `get_default_tkr_bom_data`, `get_bom_data_for_tkr_name`, `get_default_tkg_bom_data` -* Using the functions mentioned above, ytt overlays are written in a way that reads the correct BoM file based on the given TKR and files in the correct image name and image tag. - -## How the TKG library determines if the BoM files in the user's file system are outdated and need to be replaced? - -* As part of [ensurePrerequisite](../../../tkg/tkgctl/client.go) whenever we create the `tkgctl` client, the [EnsureBOMFiles](../../../tkg/tkgconfigupdater/ensure.go) function is invoked -* This function checks the default TKG BoM file name (determined from the `tkg-compatibility` file) and compares it with the BoM file present in the user's local filesystem -* If the default TKG BoM filename does not exist, TKG will back up the old BoM directory and extract the bundled BoM file into the user's BoM directory diff --git a/docs/cli/tkgctl/components.md b/docs/cli/tkgctl/components.md deleted file mode 100644 index df6dccd438..0000000000 --- a/docs/cli/tkgctl/components.md +++ /dev/null @@ -1,96 +0,0 @@ -# Library components in tkgctl - - This library includes coresponding [providers](/providers) to provide the templates and ytt overlays required to generate cluster configuration YAML documents. - -## [tkgctl library](/tkg/tkgctl) - -This library provides an interface that can be used to invoke TKG related functionalities. This interface is currently used by the cluster and management-cluster plugin in tanzu cli to perform TKG related operations. TMC also consumes this library interface to do lifecycle operations on TKG clusters. - -For more details about the client and interface: [/tkg/tkgctl/client.go](/tkg/tkgctl/client.go) - -## clusterctl library - -Library uses clusterctl library to perform many core tasks like - -* installing cluster-api providers and cert-manager during management cluster creation (tanzu management-cluster create) -* moving cluster-api objects from bootstrap cluster to management cluster during management cluster creation (tanzu management-cluster create) -* for cluster template creation using YAML processor (tanzu management-cluster create and tanzu cluster create) -* moving cluster-api objects from management cluster to cleanup cluster during management cluster deletion (tanzu management-cluster delete) -* upgrading cluster-api providers and cert-manager during management cluster upgrade (tanzu management-cluster upgrade) - -reference: -[https://pkg.go.dev/sigs.k8s.io/cluster-api/cmd/clusterctl/](https://pkg.go.dev/sigs.k8s.io/cluster-api/cmd/clusterctl/) - -## [ytt processor](/tkg/yamlprocessor) - -* Library has this YTT processor package -* Implements YAML processor interface that is used with clusterctl when creation cluster templates. [https://pkg.go.dev/sigs.k8s.io/cluster-api/cmd/clusterctl/client/yamlprocessor#Processor](https://pkg.go.dev/sigs.k8s.io/cluster-api/cmd/clusterctl/client/yamlprocessor#Processor) -* The responsibility of this package is to use the ytt library and implement functionality that returns cluster template bytes when requested by the clusterctl library when generating cluster templates. - * reads ytt overlay files based on the template-definition-file provided and processes the overlay using the provided config variable generating cluster templates. - * [https://github.com/vmware-tanzu/tkg-cli/tree/master/pkg/yamlprocessor](https://github.com/vmware-tanzu/tkg-cli/tree/master/pkg/yamlprocessor) - -## [tkgconfigreaderwriter](/tkg/tkgconfigreaderwriter) - -* This is also a very core package under the tkg library -* It is responsible for reading user inputs for config variables from different sources (descending order of precedence) - * environment variables - * cluster-config file (file provided with `tanzu management-cluster create` and `tanzu cluster create` commands) - * tkg settings file (`$HOME/.config/tanzu/tkg/config.yaml`) -* It internally uses viper implementation to read this configuration -* This client is passed to many other clients that need to rely on tkg settings or user-provided configuration - -## [tkgconfigupdater](/tkg/tkgconfigupdater) - -* The main responsibility of this package is to ensure all the necessary configurations are present on the user's local file system or not, which includes - * extracting and/or updating providers bundle to `$HOME/.config/tanzu/tkg/providers` - * extracting and/or updating BoM files to `$HOME/.config/tanzu/tkg/bom` - * creating and/or updating TKG settings file at `$HOME/.config/tanzu/tkg/config.yaml` - * adding/updating provider map based on user's file system path - * adding/updating images map based on BoM file's image repository or based on `TKG_CUSTOM_IMAGE_REPOSITORY` config variable - * creating default(empty) cluster-config.yaml if it does not exist at `$HOME/.config/tanzu/tkg/cluster-config.yaml` - -## [tkgconfigpaths](/tkg/tkgconfigpaths) - -* Implemented functions to get different file and directory paths for TKG library - -## [tkgconfigproviders](/tkg/tkgconfigproviders) - -* Implements methods that convert UI provided configuration to config variables that can be saved to cluster-config files -* Also implements image getter functions for all providers - -## [tkgconfigbom](/tkg/tkgconfigbom) - -* Implements TKG and TKR BoM file loader methods -* Also implements methods to get default or specific TKR BoM file based on the TKR version - -## AWS cloud-formation library - -* tkgctl interface implements functions that use CAPA's cloud-formation library to create a cloud-formation stack on AWS - -## [kind](/tkg/kind) - -* Implements methods to create and delete kind clusters that get used to create and delete management cluster - -## [aws](/tkg/aws) - -* Implements AWS specific API using AWS SDK that can be used for some verification purpose as well as serves as resource retriever for the kick-start UI - -## [azure](/tkg/azure) - -* Implements Azure specific API using Azure SDK that can be used for some verification purpose as well as serves as resource retriever for the kick-start UI - -## [vc](/tkg/vc) - -* Implements vCenter specific API using govmomi library that can be used for some verification purpose as well as serves as resource retriever for the kick-start UI - -## [Web UI and Server](/tkg/web) - -* It implements web server which serves kick-start UI for management cluster creation purpose. (tanzu management-cluster create --ui) -* This uses bundled go-bindata file which contains kick-start UI bits -* API is developed using swagger specification which gets used by UI as well as backend - -## [Providers](/providers) - -* This package maintains a set of CAPI provider CRDs, cluster templates, and ytt overlays required by the library. -* This allows cluster configuration generation to be customizable potentially without modifying a single line of golang code. -* More information regarding providers are [here](/providers) diff --git a/docs/cli/tkgctl/example-boms/tkg-bom.yaml b/docs/cli/tkgctl/example-boms/tkg-bom.yaml deleted file mode 100644 index 5d86233b36..0000000000 --- a/docs/cli/tkgctl/example-boms/tkg-bom.yaml +++ /dev/null @@ -1,553 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha2 -default: - k8sVersion: v1.23.8+vmware.2-tkg.1 -release: - version: v1.6.0 -components: - aad-pod-identity: - - version: v1.8.0+vmware.1 - images: - micImage: - imagePath: cluster-api/mic - tag: v1.8.0_vmware.1 - nmiImage: - imagePath: cluster-api/nmi - tag: v1.8.0_vmware.1 - alertmanager: - - version: v0.24.0+vmware.1 - images: - alertmanagerImage: - imagePath: prometheus/alertmanager - tag: v0.24.0_vmware.1 - cloud-provider-azure: - - version: v0.7.4+vmware.1 - images: - ccmAzureControllerImage: - imagePath: azure-cloud-controller-manager - tag: v0.7.4_vmware.1 - ccmAzureNodeImage: - imagePath: azure-cloud-node-manager - tag: v0.7.4_vmware.1 - cluster-api-provider-azure: - - version: v1.4.0+vmware.1 - images: - capzControllerImage: - imagePath: cluster-api/cluster-api-azure-controller - tag: v1.4.0_vmware.1 - cluster-api-provider-bringyourownhost: - - version: v0.2.0+vmware.4 - images: - byohControllerImage: - imagePath: cluster-api/cluster-api-byoh-controller - tag: v0.2.0_vmware.4 - cluster-api-provider-oci: - - version: v0.4.0+vmware.1 - images: - capociControllerImage: - imagePath: cluster-api/cluster-api-oci-controller - tag: v0.4.0_vmware.1 - cluster_api: - - version: v1.1.5+vmware.1 - images: - cabpkControllerImage: - imagePath: cluster-api/kubeadm-bootstrap-controller - tag: v1.1.5_vmware.1 - capdManagerImage: - imagePath: cluster-api/capd-manager - tag: v1.1.5_vmware.1 - capiControllerImage: - imagePath: cluster-api/cluster-api-controller - tag: v1.1.5_vmware.1 - kcpControllerImage: - imagePath: cluster-api/kubeadm-control-plane-controller - tag: v1.1.5_vmware.1 - cluster_api_aws: - - version: v1.2.0+vmware.1 - images: - capaControllerImage: - imagePath: cluster-api/cluster-api-aws-controller - tag: v1.2.0_vmware.1 - cluster_api_vsphere: - - version: v1.3.1+vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/cluster-api-vsphere-controller - tag: v1.3.1_vmware.1 - configmap-reload: - - version: v0.7.1+vmware.1 - images: - configmapReloadImage: - imagePath: prometheus/configmap-reload - tag: v0.7.1_vmware.1 - contour: - - version: v1.17.2+vmware.1 - images: - contourImage: - imagePath: contour - tag: v1.17.2_vmware.1 - - version: v1.18.2+vmware.1 - images: - contourImage: - imagePath: contour - tag: v1.18.2_vmware.1 - - version: v1.20.2+vmware.1 - images: - contourImage: - imagePath: contour - tag: v1.20.2_vmware.1 - crash-diagnostics: - - version: v0.3.7+vmware.5 - envoy: - - version: v1.18.4+vmware.1 - images: - envoyImage: - imagePath: envoy - tag: v1.18.4_vmware.1 - - version: v1.19.1+vmware.1 - images: - envoyImage: - imagePath: envoy - tag: v1.19.1_vmware.1 - - version: v1.21.3+vmware.1 - images: - envoyImage: - imagePath: envoy - tag: v1.21.3_vmware.1 - external-dns: - - version: v0.11.0+vmware.1 - images: - externalDNSImage: - imagePath: external-dns - tag: v0.11.0_vmware.1 - fluent-bit: - - version: v1.8.15+vmware.1 - images: - fluentBitImage: - imagePath: fluent-bit - tag: v1.8.15_vmware.1 - grafana: - - version: v7.5.16+vmware.1 - images: - grafanaImage: - imagePath: grafana/grafana - tag: v7.5.16_vmware.1 - harbor: - - version: v2.5.3+vmware.1 - images: - harborChartMuseumImage: - imagePath: harbor/chartmuseum-photon - tag: v2.5.3_vmware.1 - harborCoreImage: - imagePath: harbor/harbor-core - tag: v2.5.3_vmware.1 - harborDatabaseImage: - imagePath: harbor/harbor-db - tag: v2.5.3_vmware.1 - harborExporterImage: - imagePath: harbor/harbor-exporter - tag: v2.5.3_vmware.1 - harborJobServiceImage: - imagePath: harbor/harbor-jobservice - tag: v2.5.3_vmware.1 - harborLogImage: - imagePath: harbor/harbor-log - tag: v2.5.3_vmware.1 - harborNginxImage: - imagePath: harbor/nginx-photon - tag: v2.5.3_vmware.1 - harborNotaryServerImage: - imagePath: harbor/notary-server-photon - tag: v2.5.3_vmware.1 - harborNotarySignerImage: - imagePath: harbor/notary-signer-photon - tag: v2.5.3_vmware.1 - harborPortalImage: - imagePath: harbor/harbor-portal - tag: v2.5.3_vmware.1 - harborPrepareImage: - imagePath: harbor/prepare - tag: v2.5.3_vmware.1 - harborRedisImage: - imagePath: harbor/redis-photon - tag: v2.5.3_vmware.1 - harborRegistryCtlImage: - imagePath: harbor/harbor-registryctl - tag: v2.5.3_vmware.1 - harborRegistryImage: - imagePath: harbor/registry-photon - tag: v2.5.3_vmware.1 - harborTrivyAdapterImage: - imagePath: harbor/trivy-adapter-photon - tag: v2.5.3_vmware.1 - image-builder: - - version: v0.1.12+vmware.1 - images: - imagebuilder-tar: - imagePath: image-builder - tag: v0.1.12_vmware.1 - imgpkg: - - version: v0.29.0+vmware.1 - jetstack_cert-manager: - - version: v1.5.3+vmware.4 - images: - certMgrControllerImage: - imagePath: cert-manager-controller - tag: v1.5.3_vmware.4 - certMgrInjectorImage: - imagePath: cert-manager-cainjector - tag: v1.5.3_vmware.4 - certMgrWebhookImage: - imagePath: cert-manager-webhook - tag: v1.5.3_vmware.4 - - version: v1.7.2+vmware.1 - images: - certMgrControllerImage: - imagePath: cert-manager-controller - tag: v1.7.2_vmware.1 - certMgrInjectorImage: - imagePath: cert-manager-cainjector - tag: v1.7.2_vmware.1 - certMgrWebhookImage: - imagePath: cert-manager-webhook - tag: v1.7.2_vmware.1 - k8s-sidecar: - - version: v1.12.1+vmware.2 - images: - k8sSidecarImage: - imagePath: grafana/k8s-sidecar - tag: v1.12.1_vmware.2 - - version: v1.15.6+vmware.1 - images: - k8sSidecarImage: - imagePath: grafana/k8s-sidecar - tag: v1.15.6_vmware.1 - k14s_kapp: - - version: v0.49.0+vmware.1 - k14s_ytt: - - version: v0.41.1+vmware.1 - kbld: - - version: v0.34.0+vmware.1 - kube-state-metrics: - - version: v2.5.0+vmware.1 - images: - kubeStateMetricsImage: - imagePath: prometheus/kube-state-metrics - tag: v2.5.0_vmware.1 - kube-vip: - - version: v0.4.2+vmware.1 - images: - kubeVipImage: - imagePath: kube-vip - tag: v0.4.2_vmware.1 - kube_rbac_proxy: - - version: v0.11.0+vmware.2 - images: - kubeRbacProxyControllerImage: - imagePath: kube-rbac-proxy - tag: v0.11.0_vmware.2 - kubeRbacProxyControllerImageCapi: - imagePath: cluster-api/kube-rbac-proxy - tag: v0.11.0_vmware.2 - kubernetes-sigs_kind: - - version: v1.23.8+vmware.2-tkg.1_v0.11.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.23.8_vmware.2-tkg.1_v0.11.1 - kubernetes_autoscaler: - - version: v1.23.0+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.23.0_vmware.1 - metadata: - k8sversion: v1.23.3+vmware.1 - - version: v1.22.0+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.22.0_vmware.1 - metadata: - k8sversion: v1.22.3+vmware.1 - - version: v1.21.0+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.21.0_vmware.1 - metadata: - k8sversion: v1.21.1+vmware.1 - multus-cni: - - version: v3.8.0+vmware.1 - images: - multusCniImage: - imagePath: multus-cni - tag: v3.8.0_vmware.1 - prometheus: - - version: v2.36.2+vmware.1 - images: - prometheusImage: - imagePath: prometheus/prometheus - tag: v2.36.2_vmware.1 - prometheus_node_exporter: - - version: v1.3.1+vmware.1 - images: - prometheusNodeExporterImage: - imagePath: prometheus/prometheus_node_exporter - tag: v1.3.1_vmware.1 - pushgateway: - - version: v1.4.3+vmware.1 - images: - pushgatewayImage: - imagePath: prometheus/pushgateway - tag: v1.4.3_vmware.1 - sonobuoy: - - version: v0.56.6+vmware.1 - images: - sonobuoyImage: - imagePath: sonobuoy - tag: v0.56.6_vmware.1 - standalone-plugins-package: - - version: v0.25.0-6-g69f03af9-standalone-plugins - images: - standalone-plugins.tanzu.vmware.com: - imagePath: packages/standalone-plugins - tag: v0.25.0-6-g69f03af9_vmware.1 - tanzu-framework: - - version: v0.25.0-6-g69f03af9 - images: - capabilitiesImage: - imagePath: tanzu_core/capabilities/capabilities-controller-manager-tf - tag: v0.25.0-6-g69f03af9 - clipluginsClusterDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsClusterDarwinAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsClusterLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsClusterLinuxAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsClusterWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-windows-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsClusterWindowsAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/cluster-windows-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsFeatureDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/feature-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsFeatureDarwinAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/feature-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsFeatureLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/feature-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsFeatureLinuxAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/feature-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsFeatureWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/feature-windows-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsFeatureWindowsAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/feature-windows-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsKubernetesReleaseDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsKubernetesReleaseDarwinAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsKubernetesReleaseLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsKubernetesReleaseLinuxAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsKubernetesReleaseWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-windows-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsKubernetesReleaseWindowsAmd64StaticImage: - imagePath: tanzu_core/tanzu-cli-plugins/kubernetes-release-windows-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsLoginDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/login-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsLoginLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/login-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsLoginWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/login-windows-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsManagementClusterDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/management-cluster-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsManagementClusterLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/management-cluster-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsManagementClusterWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/management-cluster-windows-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsPackageDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/package-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsPackageLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/package-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsPackageWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/package-windows-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsPinnipedAuthDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/pinniped-auth-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsPinnipedAuthLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/pinniped-auth-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsPinnipedAuthWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/pinniped-auth-windows-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsSecretDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/secret-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsSecretLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/secret-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsSecretWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/secret-windows-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsTelemetryDarwinAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/telemetry-darwin-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsTelemetryLinuxAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/telemetry-linux-amd64 - tag: v0.25.0-6-g69f03af9 - clipluginsTelemetryWindowsAmd64Image: - imagePath: tanzu_core/tanzu-cli-plugins/telemetry-windows-amd64 - tag: v0.25.0-6-g69f03af9 - featuregatesImage: - imagePath: tanzu_core/featuregates/featuregates-controller-manager - tag: v0.25.0-6-g69f03af9 - objectPropagationControllerImage: - imagePath: tanzu_core/objectpropogation/object-propagation-controller - tag: v0.25.0-6-g69f03af9 - providerTemplateImage: - imagePath: tanzu_core/provider/provider-templates - tag: v0.25.0-6-g69f03af9 - tkrConversionWebhookImage: - imagePath: tanzu_core/tkr/tkr-conversion-webhook - tag: v0.25.0-6-g69f03af9 - tkrImage: - imagePath: tanzu_core/tkr/tkr-controller-manager - tag: v0.25.0-6-g69f03af9 - tkrInfraMachineImage: - imagePath: tanzu_core/tkr/tkr-infra-machine-webhook - tag: v0.25.0-6-g69f03af9 - tkrResolverImage: - imagePath: tanzu_core/tkr/tkr-resolver-cluster-webhook - tag: v0.25.0-6-g69f03af9 - tkrSourceControllerImage: - imagePath: tanzu_core/tkr/tkr-source-controller - tag: v0.25.0-6-g69f03af9 - tkrStatusControllerImage: - imagePath: tanzu_core/tkr/tkr-status-controller - tag: v0.25.0-6-g69f03af9 - tanzu-framework-management-packages: - - version: v0.25.0-6-g69f03af9 - images: - tanzuFrameworkManagementPackageRepositoryImage: - imagePath: packages/management/repo - tag: v0.25.0-6-g69f03af9 - tanzuFrameworkManagementPackageRepositoryImageUTKG: - imagePath: packages/management/repo - tag: v0.25.0-6-g69f03af9-utkg - tkg-bom: - - version: v1.6.0 - images: - tkgBomImage: - imagePath: tkg-bom - tag: v1.6.0 - tkg-standard-packages: - - version: v1.6.0 - images: - tanzuStandardPackageRepositoryImage: - imagePath: packages/standard/repo - tag: v1.6.0 - tkg_telemetry: - - version: v1.6.0+vmware.1 - images: - tkgTelemetryImage: - imagePath: tkg-telemetry - tag: v1.6.0_vmware.1 - velero: - - version: v1.8.1+vmware.1 - images: - veleroImage: - imagePath: velero/velero - tag: v1.8.1_vmware.1 - veleroResticRestoreHelperImage: - imagePath: velero/velero-restic-restore-helper - tag: v1.8.1_vmware.1 - velero-plugin-for-aws: - - version: v1.4.1+vmware.1 - images: - veleroPluginForAwsImage: - imagePath: velero/velero-plugin-for-aws - tag: v1.4.1_vmware.1 - velero-plugin-for-microsoft-azure: - - version: v1.4.1+vmware.1 - images: - veleroPluginForMicrosoftAzureImage: - imagePath: velero/velero-plugin-for-microsoft-azure - tag: v1.4.1_vmware.1 - velero-plugin-for-vsphere: - - version: v1.3.1+vmware.1 - images: - veleroBackupDriverImage: - imagePath: velero/backup-driver - tag: v1.3.1_vmware.1 - veleroDataManagerForPluginImage: - imagePath: velero/data-manager-for-plugin - tag: v1.3.1_vmware.1 - veleroPluginForVsphereImage: - imagePath: velero/velero-plugin-for-vsphere - tag: v1.3.1_vmware.1 - vendir: - - version: v0.27.0+vmware.1 - whereabouts: - - version: v0.5.1+vmware.2 - images: - whereaboutsImage: - imagePath: whereabouts - tag: v0.5.1_vmware.2 -kindKubeadmConfigSpec: - - 'kind: Cluster' - - 'apiVersion: kind.x-k8s.io/v1alpha4' - - 'kubeadmConfigPatches:' - - '- |' - - ' apiVersion: kubeadm.k8s.io/v1beta2' - - ' kind: ClusterConfiguration' - - ' imageRepository: projects.registry.vmware.com/tkg' - - ' etcd:' - - ' local:' - - ' imageRepository: projects.registry.vmware.com/tkg' - - ' imageTag: v3.5.4_vmware.6' - - ' dns:' - - ' type: CoreDNS' - - ' imageRepository: projects.registry.vmware.com/tkg' - - ' imageTag: v1.8.6_vmware.7' -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -tkr-bom: - imagePath: tkr-bom -tkr-compatibility: - imagePath: v18-v1.6.0/tkr-compatibility -tkr-package-repo: - aws: tkr-repository-aws - azure: tkr-repository-azure - vsphere-nonparavirt: tkr-repository-vsphere-nonparavirt -tkr-package: - aws: tkr-aws - azure: tkr-azure - vsphere-nonparavirt: tkr-vsphere-nonparavirt diff --git a/docs/cli/tkgctl/example-boms/tkr-bom.yaml b/docs/cli/tkgctl/example-boms/tkr-bom.yaml deleted file mode 100644 index 01bbbe24bb..0000000000 --- a/docs/cli/tkgctl/example-boms/tkr-bom.yaml +++ /dev/null @@ -1,640 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha2 -release: - version: v1.23.8+vmware.2-tkg.1 -components: - ako-operator: - - version: v1.6.0+vmware.13 - images: - akoOperatorImage: - imagePath: ako-operator - tag: v1.6.0_vmware.13 - antrea: - - version: v1.5.3-advanced - images: - antreaImage: - imagePath: antrea-advanced-debian - tag: v1.5.3 - aws-ebs-csi-driver: - - version: v1.8.0+vmware.1 - images: - awsEbsCsiDriverImage: - imagePath: csi/aws-ebs-csi-driver - tag: v1.8.0_vmware.1 - azuredisk-csi-driver: - - version: v1.19.0+vmware.1 - images: - azurediskCsiDriverImage: - imagePath: cluster-api/azuredisk-csi-driver - tag: v1.19.0_vmware.1 - byoh-k8s-ubuntu-2004: - - version: v1.23.8+vmware.2-tkg.1 - images: - byohImgpkgBundle: - imagePath: cluster-api/byoh-bundle-ubuntu_20.04.1_x86-64_k8s - tag: v1.23.8_vmware.2-tkg.1 - calico_all: - - version: v3.22.1+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni - tag: v3.22.1_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.22.1_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.22.1_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon-flexvol - tag: v3.22.1_vmware.1 - capabilities-package: - - version: v0.25.0-6-g69f03af9-capabilities - images: - capabilities.tanzu.vmware.com: - imagePath: packages/capabilities - tag: v0.25.0-6-g69f03af9_vmware.1 - carvel-secretgen-controller: - - version: v0.9.1+vmware.1 - images: - secretgenControllerImage: - imagePath: secretgen-controller - tag: v0.9.1_vmware.1 - cloud_provider_vsphere: - - version: v1.23.1+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.23.1_vmware.1 - cni_plugins: - - version: v1.1.1+vmware.6 - containerd: - - version: v1.6.6+vmware.2 - coredns: - - version: v1.8.6+vmware.7 - images: - coredns: - imagePath: coredns - tag: v1.8.6_vmware.7 - cri_tools: - - version: v1.22.0+vmware.8 - csi_attacher: - - version: v3.3.0+vmware.1 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v3.3.0_vmware.1 - - version: v3.4.0+vmware.1 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v3.4.0_vmware.1 - csi_livenessprobe: - - version: v2.4.0+vmware.1 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v2.4.0_vmware.1 - - version: v2.5.0+vmware.1 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v2.5.0_vmware.1 - - version: v2.6.0+vmware.1 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v2.6.0_vmware.1 - csi_node_driver_registrar: - - version: v2.3.0+vmware.1 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v2.3.0_vmware.1 - - version: v2.5.0+vmware.1 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v2.5.0_vmware.1 - - version: v2.5.1+vmware.1 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v2.5.1_vmware.1 - csi_provisioner: - - version: v3.0.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v3.0.0_vmware.1 - - version: v3.1.0+vmware.2 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v3.1.0_vmware.2 - dex: - - version: v2.30.2+vmware.1 - images: - dexImage: - imagePath: dex - tag: v2.30.2_vmware.1 - etcd: - - version: v3.5.4+vmware.6 - images: - etcd: - imagePath: etcd - tag: v3.5.4_vmware.6 - external-snapshotter: - - version: v6.0.1+vmware.1 - images: - csiSnapshotControllerImage: - imagePath: csi/snapshot-controller - tag: v6.0.1_vmware.1 - csiSnapshotterImage: - imagePath: csi/csi-snapshotter - tag: v6.0.1_vmware.1 - - version: v5.0.1+vmware.1 - images: - csiSnapshotControllerImage: - imagePath: csi/snapshot-controller - tag: v5.0.1_vmware.1 - csiSnapshotterImage: - imagePath: csi/csi-snapshotter - tag: v5.0.1_vmware.1 - guest-cluster-auth-service: - - version: v1.0.0 - images: - guestClusterAuthServiceImage: - imagePath: guest-cluster-auth-service/guest-cluster-auth-service - tag: v1.0.0 - image-builder-resource-bundle: - - version: v1.23.8+vmware.2-tkg.1 - images: - linuxResourceBundleImage: - imagePath: linux-resource-bundle - tag: v1.23.8_vmware.2-tkg.1 - windowsResourceBundleImage: - imagePath: windows-resource-bundle - tag: v1.23.8_vmware.2-tkg.1 - kapp-controller: - - version: v0.38.4+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.38.4_vmware.1 - kube-vip: - - version: v0.4.2+vmware.1 - images: - kubeVipImage: - imagePath: kube-vip - tag: v0.4.2_vmware.1 - kubernetes: - - version: v1.23.8+vmware.2 - images: - kubeAPIServer: - imagePath: kube-apiserver - tag: v1.23.8_vmware.2 - kubeControllerManager: - imagePath: kube-controller-manager - tag: v1.23.8_vmware.2 - kubeProxy: - imagePath: kube-proxy - tag: v1.23.8_vmware.2 - kubeScheduler: - imagePath: kube-scheduler - tag: v1.23.8_vmware.2 - pause: - imagePath: pause - tag: "3.6" - pause_windows_1809: - imagePath: pause - tag: 3.6-windows-amd64 - pause_windows_1903: - imagePath: pause - tag: 3.6-windows-amd64-1903 - pause_windows_1909: - imagePath: pause - tag: 3.6-windows-amd64-1909 - pause_windows_2004: - imagePath: pause - tag: 3.6-windows-amd64-2004 - kubernetes-csi_external-resizer: - - version: v1.3.0+vmware.1 - images: - csiExternalResizer: - imagePath: kubernetes-csi_external-resizer - tag: v1.3.0_vmware.1 - - version: v1.4.0+vmware.1 - images: - csiExternalResizer: - imagePath: kubernetes-csi_external-resizer - tag: v1.4.0_vmware.1 - kubernetes-sigs_kind: - - version: v1.23.8+vmware.2-tkg.1_v0.11.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.23.8_vmware.2-tkg.1_v0.11.1 - load-balancer-and-ingress-service: - - version: v1.7.2+vmware.1 - images: - loadBalancerAndIngressServiceImage: - imagePath: ako - tag: v1.7.2_vmware.1 - metrics-server: - - version: v0.6.1+vmware.1 - images: - metricsServerImage: - imagePath: metrics-server - tag: v0.6.1_vmware.1 - pinniped: - - version: v0.12.1+vmware.1 - images: - pinnipedImage: - imagePath: pinniped - tag: v0.12.1_vmware.1 - pinniped-post-deploy: - - version: v0.12.1+vmware.1-tkg.1 - images: - tkgPinnipedPostDeployImage: - imagePath: tanzu_core/addons/tkg-pinniped-post-deploy - tag: v0.12.1_vmware.1-tkg.1 - tanzu-framework-addons: - - version: v0.25.0-6-g69f03af9 - images: - tanzuAddonsManagerImage: - imagePath: tanzu_core/addons/tanzu-addons-manager - tag: v0.25.0-6-g69f03af9 - tkgPinnipedPostDeployImage: - imagePath: tanzu_core/addons/tkg-pinniped-post-deploy - tag: v0.25.0-6-g69f03af9 - tkg-core-packages: - - version: v1.23.8+vmware.2-tkg.1 - images: - addons-manager.tanzu.vmware.com: - imagePath: packages/core/addons-manager - tag: v1.6.0_vmware.1-tkg.1 - ako-operator.tanzu.vmware.com: - imagePath: packages/core/ako-operator - tag: v1.6.0_vmware.13-tkg.1 - antrea.tanzu.vmware.com: - imagePath: packages/core/antrea - tag: v1.5.3_tkg.1-advanced - aws-ebs-csi-driver.tanzu.vmware.com: - imagePath: packages/core/aws-ebs-csi-driver - tag: v1.8.0_vmware.1-tkg.1 - azuredisk-csi-driver.tanzu.vmware.com: - imagePath: packages/core/azuredisk-csi-driver - tag: v1.19.0_vmware.1-tkg.1 - calico.tanzu.vmware.com: - imagePath: packages/core/calico - tag: v3.22.1_vmware.1-tkg.1 - guest-cluster-auth-service.tanzu.vmware.com: - imagePath: packages/core/guest-cluster-auth-service - tag: v1.0.0_tkg.1 - kapp-controller.tanzu.vmware.com: - imagePath: packages/core/kapp-controller - tag: v0.38.4_vmware.1-tkg.1 - load-balancer-and-ingress-service.tanzu.vmware.com: - imagePath: packages/core/load-balancer-and-ingress-service - tag: v1.7.2_vmware.1-tkg.1 - metrics-server.tanzu.vmware.com: - imagePath: packages/core/metrics-server - tag: v0.6.1_vmware.1-tkg.1 - pinniped.tanzu.vmware.com: - imagePath: packages/core/pinniped - tag: v0.12.1_vmware.1-tkg.1 - secretgen-controller.tanzu.vmware.com: - imagePath: packages/core/secretgen-controller - tag: v0.9.1_vmware.1-tkg.1 - tanzuCorePackageRepositoryImage: - imagePath: packages/core/repo - tag: v1.23.8_vmware.2-tkg.1 - vsphere-cpi.tanzu.vmware.com: - imagePath: packages/core/vsphere-cpi - tag: v1.23.1_vmware.1-tkg.1 - vsphere-csi.tanzu.vmware.com: - imagePath: packages/core/vsphere-csi - tag: v2.5.2_vmware.1-tkg.1 - vsphere-pv-csi.tanzu.vmware.com: - imagePath: packages/core/vsphere-pv-csi - tag: v2.4.2_vmware.1-tkg.1 - tkg-storageclass-package: - - version: v0.25.0-6-g69f03af9-tkg-storageclass - images: - tkg-storageclass.tanzu.vmware.com: - imagePath: packages/tkg-storageclass - tag: v0.25.0-6-g69f03af9_vmware.1 - vsphere_csi_driver: - - version: v2.5.2+vmware.1 - images: - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.5.2_vmware.1 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.5.2_vmware.1 -kubeadmConfigSpec: - apiVersion: kubeadm.k8s.io/v1beta2 - kind: ClusterConfiguration - imageRepository: projects.registry.vmware.com/tkg - kubernetesVersion: v1.23.8+vmware.2 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: projects.registry.vmware.com/tkg - imageTag: v3.5.4_vmware.6 - extraArgs: - experimental-initial-corrupt-check: true - dns: - type: CoreDNS - imageRepository: projects.registry.vmware.com/tkg - imageTag: v1.8.6_vmware.7 -ova: - - name: ova-photon-3 - osinfo: - name: photon - version: "3" - arch: amd64 - version: v1.23.8+vmware.2-tkg.2-81d1a7892ad39f017fbaf59f9907cbe7 - - name: ova-ubuntu-2004 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - version: v1.23.8+vmware.2-tkg.1-85a434f93857371fccb566a414462981 - - name: ova-rhel-7 - osinfo: - name: rhel - version: "7" - arch: amd64 - version: v1.23.8+vmware.2-tkg.1-3e6b7a84930e5368c38aa867f998ced0 -ami: - ap-northeast-1: - - id: ami-00de3c99b5f6aa845 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-07b4ff8dd9ac8b4f9 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-northeast-2: - - id: ami-08ec11674ac938a50 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0bc0e088c2cd24c20 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-south-1: - - id: ami-06e6c8199c40d1f86 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0fe86def5eb445708 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-southeast-1: - - id: ami-01a070ba79fa300aa - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-086537d0c9a9d9555 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-southeast-2: - - id: ami-09206231dd71aef5a - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-03dda89229fcdd1f9 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-central-1: - - id: ami-03a092f0fe126e445 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-01627dfff297cc2b6 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-1: - - id: ami-0208d21e582220686 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-05d2825cd728e936a - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-2: - - id: ami-0313f47247d7238dd - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-05bb2960acba4832f - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-3: - - id: ami-0b8ddf113392fb803 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-085e642ec714e1c4c - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - sa-east-1: - - id: ami-0e90b9fc046036ad5 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0d9e14d3797822b6f - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-east-1: - - id: ami-0a58354917a041381 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-000cbc52dde372526 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-east-2: - - id: ami-008ea656349c50404 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-010edf5fc7bb6f7a3 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-gov-east-1: - - id: ami-015baa87e63d7d155 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0aada87d9af28faf9 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-gov-west-1: - - id: ami-07a66224a83340a05 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0f930554c0c4e9766 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-west-2: - - id: ami-066f5f6857508e927 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-07ff4a7a61bb23f2d - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 -azure: - - osinfo: - name: ubuntu - version: "18.04" - arch: amd64 - version: 2207.1922.1851 - resourceGroup: image-building-vpn-default - name: ubuntu-1804 - subscriptionID: 0668300f-64d7-45e7-aa97-246205360f1b - gallery: TKG_Gallery - - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - version: 2207.1923.3319 - resourceGroup: image-building-vpn-default - name: ubuntu-2004 - subscriptionID: 0668300f-64d7-45e7-aa97-246205360f1b - gallery: TKG_Gallery -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -addons: - ako-operator: - category: networking - clusterTypes: - - management - packageName: ako-operator.tanzu.vmware.com - antrea: - category: cni - clusterTypes: - - management - - workload - packageName: antrea.tanzu.vmware.com - aws-ebs-csi-driver: - category: csi - clusterTypes: - - management - - workload - packageName: aws-ebs-csi-driver.tanzu.vmware.com - azuredisk-csi-driver: - category: csi - clusterTypes: - - management - - workload - packageName: azuredisk-csi-driver.tanzu.vmware.com - calico: - category: cni - clusterTypes: - - management - - workload - packageName: calico.tanzu.vmware.com - kapp-controller: - category: addons-management - clusterTypes: - - management - - workload - packageName: kapp-controller.tanzu.vmware.com - load-balancer-and-ingress-service: - category: networking - clusterTypes: - - management - - workload - packageName: load-balancer-and-ingress-service.tanzu.vmware.com - metrics-server: - category: metrics - clusterTypes: - - management - - workload - packageName: metrics-server.tanzu.vmware.com - pinniped: - category: authentication - clusterTypes: - - management - - workload - packageName: pinniped.tanzu.vmware.com - secretgen-controller: - category: secret-generation-and-sharing - clusterTypes: - - management - - workload - packageName: secretgen-controller.tanzu.vmware.com - tanzu-addons-manager: - category: addons-management - clusterTypes: - - management - - workload - packageName: addons-manager.tanzu.vmware.com - vsphere-cpi: - category: cpi - clusterTypes: - - management - - workload - packageName: vsphere-cpi.tanzu.vmware.com - vsphere-csi: - category: csi - clusterTypes: - - management - - workload - packageName: vsphere-csi.tanzu.vmware.com - vsphere-pv-csi: - category: csi - clusterTypes: - - workload - packageName: vsphere-pv-csi.tanzu.vmware.com diff --git a/docs/cli/tkgctl/logging.md b/docs/cli/tkgctl/logging.md deleted file mode 100644 index e01477743d..0000000000 --- a/docs/cli/tkgctl/logging.md +++ /dev/null @@ -1,34 +0,0 @@ -# Logging - -This section describes how the logging is implemented in tkgctl library. - -tkgctl library has implemented custom `logr.Logger`. This custom logger is super set of `logr.Logger` which includes header formatting and verbosity level management and passes all the information about the logs with verbosity levels to writer. The actual write to stdout/stderr is done through this writer implementation which is logger itself. - -Logger can be configured with the following options when creating tkgctl client: - -```go -// LoggingOptions options to configure logging with tkgctl client -type LoggingOptions struct { - // File log file name where you want logs to be written - File string - // Quietly if set logs will not be written to stdout/stderr - Quietly bool - // Verbosity number for the log level verbosity - Verbosity int32 - // LogChannel if channel is set, writer will forward log messages to this log channel - // The result of this will be in the format of 'LogData' struct mentioned in `pkg/log/type.go` - LogChannel chan<- []byte -} -``` - -## writer - -This writer is implemented to do 3 things when log arrives. - -* Write log message to log-file if the log file is given -* Send the log message through the channel if channel is set (This is used to send the logs to the UI through websockets) -* Print the log to stdout/stderr if the quiet mode is not set. If quiet flag is passed skip printing to stdout/stderr - -## Clusterctl logger - -To retrive logs from the clusterctl library which is used as part of tkgctl client, the library implements and passes the subset of custom logger as `logr.Logger`. diff --git a/docs/cli/tkgctl/management-cluster-using-clusterclass.md b/docs/cli/tkgctl/management-cluster-using-clusterclass.md deleted file mode 100644 index c9adea2759..0000000000 --- a/docs/cli/tkgctl/management-cluster-using-clusterclass.md +++ /dev/null @@ -1,46 +0,0 @@ -# Management Cluster Deployment using ClusterClass - -Below is the sequence of steps involved in creating a management cluster using ClusterClass. - -1. Deploy a bootstrap Kind cluster -1. Deploy `kapp-controller` on bootstrap cluster -1. Deploy CAPI provider and CAPx infra provider on bootstrap cluster -1. Deploy `tkg composite package` to bootstrap cluster - 1. As part of this package installation we will be creating configmap with label `run.tanzu.vmware.com/additional-compatible-tkrs` to make default TKR compatible. - 1. As part of this package, a set of sub packages will also be installed, among which is a package containing the cluster class and templates appropriate for the target CAPI infrastructure provider -1. Wait for packages to get deployed on management-cluster -1. Apply `CCluster.yaml` to create management-cluster using default clusterclass -1. Wait for CAPx controllers to reconcile the CCluster and deploy a management-cluster on specified infra -1. Deploy `kapp-controller` on the management-cluster -1. Addon-controller running on bootstrap cluster will deploy addons-components like CNI, CPI, CSI etc on the management-cluster -1. Deploy CAPI provider and CAPx infra provider on management-cluster -1. Deploy `tkg composite package` to management-cluster - * Note: Use `_ADDITIONAL_MANAGEMENT_COMPONENT_CONFIGURATION_FILE` env var to specify any additional YAML that should be deployed. This should be used for development and testing only. -1. Wait for packages to get deployed on management-cluster -1. Move cluster-api resources from the bootstrap-cluster to management-cluster -1. Deploy `telemetry` job if telemetry is enabled - -(See [here](../../packages/README.md) for more information regarding defining -packages) - -## framework package - -The [framework](../../../packages/framework) package is a meta package that -provides PackageInstall CRs and Service Accounts needed for installing the -following packages: - -1. Featuregates -2. Addons-manager -3. TKR Service -4. Tanzu Auth Service -5. CLI Plugins - -## tkg composite package - -The [tkg](../../../packages/tkg) package is a composite package that installs -the following components via sub-packages: - -1. The above-mentioned framework package -2. Core management plugins specific to the management cluster being deployed -3. TKR controllers -4. ClusterClass and associated templates diff --git a/docs/cli/tkgctl/spreading-aws-nodes.md b/docs/cli/tkgctl/spreading-aws-nodes.md deleted file mode 100644 index 17bc42ab02..0000000000 --- a/docs/cli/tkgctl/spreading-aws-nodes.md +++ /dev/null @@ -1,314 +0,0 @@ -# AWS Spreading of Nodes on a Prod Cluster - -tkgctl library supports spreading nodes of a prod cluster across AZs. This is supported when using an existing VPC or by having library create a VPC on your behalf. - -## Functionality Changes - -For `dev` and `prod` clusters, in the kickstart UI you no longer need to provide the CIDRs for the subnet(s) if you are choosing to create a new VPC. Library divides the subnet CIDRs for you based on the VPC CIDR you provide. - -For `prod` clusters, TKG now requires that you provide a unique AZ for each of the 3 control plane nodes. There is no option to create a prod cluster in one or two AZs. This means that you must create a prod management cluster in a region that has at least 3 AZs. In addition, it is required that you specify which AZs you would like to place the nodes in. - -## Prod Cluster Template Changes - -The prod cluster plan now expects additional AZ and subnet configurations variables to support this feature. These variables can be populated in two different ways depending on if you are using an existing VPC or would like to create a new one as shown in the following examples: - -### Configuration Variables for Existing VPC - -```yaml -AWS_VPC_ID: "vpc_id" -AWS_PRIVATE_SUBNET_ID: "private_subnet0_id" -AWS_PRIVATE_SUBNET_ID_1: "private_subnet1_id" -AWS_PRIVATE_SUBNET_ID_2: "private_subnet2_id" -AWS_PUBLIC_SUBNET_ID: "public_subnet0_id" -AWS_PUBLIC_SUBNET_ID_1: "public_subnet1_id" -AWS_PUBLIC_SUBNET_ID_2: "public_subnet2_id" -AWS_NODE_AZ: "az0" -AWS_NODE_AZ_1: "az1" -AWS_NODE_AZ_2: "az2" -``` - -### Configuration Variables for New VPC - -```yaml -AWS_VPC_CIDR: 10.0.0.0/16 -AWS_NODE_AZ: "az0" -AWS_PUBLIC_NODE_CIDR: 10.0.0.0/24 -AWS_PRIVATE_NODE_CIDR: 10.0.1.0/24 -AWS_NODE_AZ_1: "az1" -AWS_PUBLIC_NODE_CIDR_1: 10.0.2.0/24 -AWS_PRIVATE_NODE_CIDR_1: 10.0.3.0/24 -AWS_NODE_AZ_2: "az2" -AWS_PUBLIC_NODE_CIDR_2: 10.0.4.0/24 -AWS_PRIVATE_NODE_CIDR_2: 10.0.5.0/24 -``` - -## Dev Cluster Template Changes - -The configuration variables expected by dev cluster plan remain unchanged, as shown in the following examples to use for an existing VPC and new VPC: - -### Configuration Variables for Existing VPC - -```yaml -AWS_VPC_ID: "vpc_id" -AWS_PRIVATE_SUBNET_ID: "private_subnet0_id" -AWS_PUBLIC_SUBNET_ID: "public_subnet0_id" -AWS_NODE_AZ: "az0" -``` - -### Configuration Variables for New VPC - -```yaml -AWS_VPC_CIDR: 10.0.0.0/16 -AWS_NODE_AZ: "az0" -AWS_PUBLIC_NODE_CIDR: 10.0.0.0/24 -AWS_PRIVATE_NODE_CIDR: 10.0.1.0/24 -``` - -## Spreading Machine Deployments for Workload Clusters in AWS - -**Goal:** Spread worker nodes / machine deployments of prod workload clusters across AZs - -Spreading AWSMachines across multiple AZs within a MachineDeployment is not yet supported by CAPA natively. However, there is an issue open regarding it: -[https://github.com/kubernetes-sigs/cluster-api/issues/3358](https://github.com/kubernetes-sigs/cluster-api/issues/3358) - -Currently, until CAPA supports this natively, the recommended pattern to achieve this is to create multiple MachineDeployments, each deploying AWSMachines to a different AZ. - -So if a user specified a `--worker-node-count` of 9 for a prod workload cluster, TKG would create 3 MachineDeployments each with a `replica` of 3 and each with a unique `failureDomain` value (3 AZs are required since this is a prod cluster). - -Workload clusters on plan DEV are unaffected by this change. - -### Template changes required - -- Set `failureDomain` property of `Machine` spec -- Conditionally add 2 additional MachineDeployments, AWSMachineTemplates, and KubeadmConfigTemplates if the plan is PROD -- Set the replica count for each `MachineDeployment` accordingly -- Update the default `MachineDeployment`, `AWSMachineTemplate`, and `KubeadmConfigTemplate` so the YTT matchers to include `metdata.name` - -### CLI changes required - -- Add three new config variables, `WORKER_MACHINE_COUNT_0`, `WORKER_MACHINE_COUNT_1`, and `WORKER_MACHINE_COUNT_2` -- Add logic to `validate.go` to divide the number of worker machines evenly across the 3 MachineDeployments if the plan is PROD and `WORKER_MACHINE_COUNT_0`, `WORKER_MACHINE_COUNT_1` and `WORKER_MACHINE_COUNT_2` are not provided. -- Update `client/scale.go` to distribute the new number of workers evenly in `ScaleCluster()` using the same logic in `validate.go` -- Handle the situation where PROD management clusters only have 1 worker node by distributing the 1 worker replica value across the 3 MDs like 1,0,0. - -#### Distribute Nodes Logic - -```python -num_workers_per_az = floor(worker-node-count / 3) -remainder = worker-node-count % 3 -azs[0] = num_workers_per_az -azs[1] = num_workers_per_az -azs[2] = num_workers_per_az -for a in azs: - if remainder > 0: - a += 1 - remainder -= 1 -``` - -## Template Changes - -`providers/infrastructure-aws/ytt/aws-overlay.yaml`: - -```yaml -#@ if data.values.CLUSTER_PLAN == "prod": ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSMachineTemplate -metadata: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - instanceType: #@ data.values.NODE_MACHINE_TYPE - iamInstanceProfile: "nodes.cluster-api-provider-aws.sigs.k8s.io" - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - ami: - id: #@ getattr(bomData.ami, data.values.AWS_REGION).id ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSMachineTemplate -metadata: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - instanceType: #@ data.values.NODE_MACHINE_TYPE - iamInstanceProfile: "nodes.cluster-api-provider-aws.sigs.k8s.io" - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - ami: - id: #@ getattr(bomData.ami, data.values.AWS_REGION).id ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - joinConfiguration: - nodeRegistration: - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineDeployment -metadata: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT_1 - selector: - matchLabels: null - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - clusterName: #@ data.values.CLUSTER_NAME - version: #@ data.values.KUBERNETES_VERSION - bootstrap: - configRef: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) - apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 - kind: KubeadmConfigTemplate - infrastructureRef: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSMachineTemplate - failureDomain: #@ data.values.AWS_NODE_AZ_1 ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineDeployment -metadata: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT_2 - selector: - matchLabels: null - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - clusterName: #@ data.values.CLUSTER_NAME - version: #@ data.values.KUBERNETES_VERSION - bootstrap: - configRef: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) - apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 - kind: KubeadmConfigTemplate - infrastructureRef: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSMachineTemplate - failureDomain: #@ data.values.AWS_NODE_AZ_2 ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - joinConfiguration: - nodeRegistration: - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws -#@end -``` - -`provider/infrastructure-aws/v0.5.5/ytt/overlay.yaml`: - -```yaml -#@overlay/match by=overlay.subset({"kind": "AWSMachineTemplate", "metadata":{"name": "${CLUSTER_NAME}-md-0"}}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSMachineTemplate -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - instanceType: #@ data.values.NODE_MACHINE_TYPE - iamInstanceProfile: "nodes.cluster-api-provider-aws.sigs.k8s.io" - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - ami: - id: #@ getattr(bomData.ami, data.values.AWS_REGION).id -#@overlay/match by=overlay.subset({"kind":"MachineDeployment", "metadata":{"name": "${CLUSTER_NAME}-md-0"}}) ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineDeployment -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT_0 - selector: - matchLabels: null - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - clusterName: #@ data.values.CLUSTER_NAME - version: #@ data.values.KUBERNETES_VERSION - bootstrap: - configRef: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) - apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 - kind: KubeadmConfigTemplate - infrastructureRef: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSMachineTemplate - failureDomain: #@ data.values.AWS_NODE_AZ -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate", "metadata":{"name": "${CLUSTER_NAME}-md-0"}}) ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - joinConfiguration: - nodeRegistration: - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws -``` - -`provider/infrastructure-aws/v0.5.5/ytt/base-template.yaml`: - -```yaml ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineDeployment -metadata: - name: "${CLUSTER_NAME}-md-0" -spec: - clusterName: "${CLUSTER_NAME}" - replicas: ${WORKER_MACHINE_COUNT} - selector: - matchLabels: - template: - metadata: - labels: - node-pool: "${CLUSTER_NAME}-worker-pool" - spec: - clusterName: "${CLUSTER_NAME}" - version: "${KUBERNETES_VERSION}" - bootstrap: - configRef: - name: "${CLUSTER_NAME}-md-0" - apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 - kind: KubeadmConfigTemplate - infrastructureRef: - name: "${CLUSTER_NAME}-md-0" - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSMachineTemplate - failureDomain: "${AWS_NODE_AZ}" -``` diff --git a/docs/cli/tkgctl/upgrade.md b/docs/cli/tkgctl/upgrade.md deleted file mode 100644 index 6754a649a1..0000000000 --- a/docs/cli/tkgctl/upgrade.md +++ /dev/null @@ -1,249 +0,0 @@ -# Upgrades using tkgctl library - -Upgrade includes mainly 2 parts. Kubernetes version upgrade and provider upgrade. This documents discusses about both the type of upgrade. - -Note: Provider upgrade only applies to management cluster. - -## Upgrading kubernetes for TKG cluster - -To upgrade kubernetes version user can use below command for workload cluster: - -```sh -tanzu cluster upgrade --tkr -``` - -For management cluster: - -```sh -tanzu management-cluster upgrade // upgrades management cluster and associated management component to latest versions -``` - -What validation does library performs? - -* Makes sure this is not a downgrade and kubernetes minor version is not skipped during upgrade - -Upgrade Steps: - -* Read TKR BOM file to get the global `imageRepository`, `imageTag` and `imageRepository` information for `CoreDNS` and `Etcd` -* Create InfrastructureMachineTemplates(`VSphereMachineTemplate`, `AWSMachineTemplate`, `AzureMachineTemplate) required for upgrade (See below on how the templates are created) -* Patch KCP object to upgrade control-plane nodes with below configuration - -```json - { - "spec": { - "version": "%s", - "infrastructureTemplate": { - "name": "%s", - "namespace": "%s" - }, - "kubeadmConfigSpec": { - "clusterConfiguration": { - "imageRepository": "%s", - "dns": { - "imageRepository": "%s", - "imageTag": "%s" - }, - "etcd": { - "local": { - "imageRepository": "%s", - "imageTag": "%s" - } - } - } - } - } -} -``` - -* Wait for kubernetes version to be updated for the cluster. For more details read [Detecting Upgrade Status](#detecting-upgrade-status) -* Patch MachineDeployment object to upgrade worker nodes with below configuration - -```json -{ - "spec": { - "template": { - "spec": { - "version": "%s", - "infrastructureRef": { - "name": "%s", - "namespace": "%s" - } - } - } - } -} -``` - -* Wait for kubernetes version to be updated for all worker nodes. For more details read [Detecting Upgrade Status](#detecting-upgrade-status) - -### How InfrastructureMachineTemplates(VSphereMachineTemplate, AWSMachineTemplate) are created for upgrade - -To do upgrade one important part is updating the InfrastructureMachineTemplate reference in KubeadmControlPlane and MachineDeployment object. -Note: Updating `VSphereMachineTemplate.Spec.Template.Spec.Template` or `AWSMachineTemplate.Spec.Template.Spec.AMI.ID` or `AzureMachineTemplate.Spec.Template.Spec.image` information in existing template does not help as CAPI uses it as reference and controllers does not get reconciled unless the name of the InfrastructureMachineTemplate is changed under `KCP.Spec.InfrastructureTemplate` and `MD.Spec.Template.Spec.infrastructureRef` - -#### Steps to create new `InfrastructureMachineTemplate` - -* copy the existing `InfrastructureMachineTemplate` -* update the template name (new template names: {CLUSTER_NAME}-{KUBERNETES_VERSION}, replace ./+ with – in kubernetes version) -* update the relevant image information in the new `InfrastructureMachineTemplate`. -* create new `InfrastructureMachineTemplate` by applying the template the the cluster - -#### For VSphereMachineTemplate - -For vSphere only thing that needs to change in the existing VSphereMachineTemplate is to update the VM_TEMPLATE (`VSphereMachineTemplate.Spec.Template.Spec.Template`) to use for newer version of kubernetes. - -Steps to get the VM_TEMPLATE: - -* Get the `vSphereUserName` and `vSpherePassword` from management cluster's secret `capv-manager-bootstrap-credentials` and use `VSphereCluster` object to get the `VCUrl`. And create VC client. -* To find the VM_TEMPLATE associated with kubernetes version, vSphere inventory is scanned to find the matching OVA Template using comparing `vAppConfig` property of OVA Template. -* Confirm or filter the OVA templates by matching the ova version with `ova` section under TKR BOM file and select the matching OVA template - -#### For AWSMachineTemplate - -For AWS only thing that needs to change in the existing AWSMachineTemplate is to update the AWS_AMI_ID (`AWSMachineTemplate.Spec.Template.Spec.AMI.ID`) - -Steps to get the AWS_AMI_ID: - -* Get the `AWS_REGION` information from AWSCluster object(`AWSCluster.Spec.Region`) -* Use this region information and map from TKR BOM file to get the correct AWS_AMI_ID - -### Detecting Upgrade Status - -As right now there is no easy way to tell the upgrade is successful or not from cluster-api, tkg-cli uses following ways to detect the upgrade status and failure. - -#### Control-plane nodes upgrade status detection - -* Success: - * Verify KCP with Spec.Replicas == Status.Replicas == Status.UpdatedReplicas == Status.ReadyReplicas - * Verify kubectl version (server version with discovery client returns updated kubernetes version) - * If both above conditions are true, it’s a success. -* Failure: - * Actual wait-time: 15 minutes - * Monitor KCP status Status.Replicas, Status.UpdatedReplicas, Status.ReadyReplicas. - Monitor All control-plane Machine object’s Phase (running, provisioning) - If any update happens in any of the above state, update the wait-time again to 15 minutes. - * If none of the above information is updated for next 15 minutes. Mark upgrade as failure. - -#### Worker nodes upgrade status detection - -* Success: - * Verify MD with Spec.Replicas == Status.Replicas == Status.UpdatedReplicas == Status.ReadyReplicas - * Verify all worker node Machine objects are upgraded to newer kubernetes version - Machine.Spec.Version and in Phase==Running - * If both above conditions are true, it’s a success. -* Failure: - * Actual wait-time: 15 minutes - * Monitor MD status Status.Replicas, Status.UpdatedReplicas, Status.ReadyReplicas. - Monitor All worker Machine object’s Phase (running, provisioning) - * If none of the above information is updated for next 15 minutes. Mark upgrade as failure. - -## Upgrading providers for management cluster - -Providers would be upgraded as part of management cluster upgrade. During management cluster upgrade process, providers would be upgraded first followed by the kubernetes version upgrade. - -Providers Upgrade Steps: - -* Read the providers upgrade versions from the TKG BOM file -* List the current providers in Management cluster and for each provider installed in the management cluster, get the latest version from the TKG BoM file -* Generate the ManagementGroup name by parsing the CoreProvider’s InstanceName(eg: capi-system/cluster-api). -* Call the upstream clusterctl ApplyUpgrade API to upgrade the providers to the latest version -* Wait for the providers to be up and running - -## Upgrading addons for TKG cluster - -As TKG v1.3 introduces new components and controllers running on the cluster itself which were not present in TKG v1.2, these controllers get deployed to the clusters during cluster upgrade from v1.2 to v1.3. - -Below are the things deployed additionally during cluster upgrade: - -* "addons-management/kapp-controller" (management-cluster, workload-cluster) -* "addons-management/tanzu-addons-manager" (management-cluster only) -* "tkr/tkr-controller" (management-cluster only) - -Note: Below are the things that DOES NOT get upgraded during TKG cluster upgrade command. - -* CNI (antrea, calico) -* vSphere CPI -* vSphere CSI - -Follow the instructions in the below section to manually upgrade the addons. - -### Manually upgrading addons for TKG cluster - -After TKG cluster is upgraded from v1.2 to v1.3 using TKG cluster upgrade command the following -steps can be followed to manually upgrade the addons - -1. Set the following variables - - ```shell - # CLUSTER_NAME, CLUSTER_NAMESPACE need to be given as inputs - CLUSTER_NAME="" - CLUSTER_NAMESPACE="" - CLUSTER_CIDR=$(kubectl get cluster "${CLUSTER_NAME}" -n "${CLUSTER_NAMESPACE}" -o jsonpath='{.spec.clusterNetwork.pods.cidrBlocks[0]}') - SERVICE_CIDR=$(kubectl get cluster "${CLUSTER_NAME}" -n "${CLUSTER_NAMESPACE}" -o jsonpath='{.spec.clusterNetwork.services.cidrBlocks[0]}') - - - # Applicable only for vsphere infra provider - # VSPHERE_INSECURE, VSPHERE_USERNAME, VSPHERE_PASSWORD need to be given as inputs - VSPHERE_SERVER=$(kubectl get VsphereCluster "${CLUSTER_NAME}" -n "${CLUSTER_NAMESPACE}" -o jsonpath='{.spec.server}') - VSPHERE_DATACENTER=$(kubectl get VsphereMachineTemplate "${CLUSTER_NAME}-control-plane" -n "${CLUSTER_NAMESPACE}" -o jsonpath='{.spec.template.spec.datacenter}') - VSPHERE_RESOURCE_POOL=$(kubectl get VsphereMachineTemplate "${CLUSTER_NAME}-control-plane" -n "${CLUSTER_NAMESPACE}" -o jsonpath='{.spec.template.spec.resourcePool}') - VSPHERE_DATASTORE=$(kubectl get VsphereMachineTemplate "${CLUSTER_NAME}-control-plane" -n "${CLUSTER_NAMESPACE}" -o jsonpath='{.spec.template.spec.datastore}') - VSPHERE_FOLDER=$(kubectl get VsphereMachineTemplate "${CLUSTER_NAME}-control-plane" -n "${CLUSTER_NAMESPACE}" -o jsonpath='{.spec.template.spec.folder}') - VSPHERE_NETWORK=$(kubectl get VsphereMachineTemplate "${CLUSTER_NAME}-control-plane" -n "${CLUSTER_NAMESPACE}" -o jsonpath='{.spec.template.spec.network.devices[0].networkName}') - VSPHERE_SSH_AUTHORIZED_KEY=$(kubectl get KubeadmControlPlane "${CLUSTER_NAME}-control-plane" -n "${CLUSTER_NAMESPACE}" -o jsonpath='{.spec.kubeadmConfigSpec.users[0].sshAuthorizedKeys[0]}') - VSPHERE_TLS_THUMBPRINT=$(kubectl get VsphereCluster "${CLUSTER_NAME}" -n "${CLUSTER_NAMESPACE}" -o jsonpath='{.spec.thumbprint}') - VSPHERE_INSECURE= - VSPHERE_USERNAME='' - VSPHERE_PASSWORD='' - ``` - -1. Create a config.yaml file with the above configurations - - ```shell - rm -rf config.yaml - echo "CLUSTER_CIDR: ${CLUSTER_CIDR}" >> config.yaml - echo "SERVICE_CIDR: ${SERVICE_CIDR}" >> config.yaml - echo "NAMESPACE: ${CLUSTER_NAMESPACE}" >> config.yaml - - # Applicable only for vsphere - echo "VSPHERE_SERVER: ${VSPHERE_SERVER}" >> config.yaml - echo "VSPHERE_DATACENTER: ${VSPHERE_DATACENTER}" >> config.yaml - echo "VSPHERE_RESOURCE_POOL: ${VSPHERE_RESOURCE_POOL}" >> config.yaml - echo "VSPHERE_DATASTORE: ${VSPHERE_DATASTORE}" >> config.yaml - echo "VSPHERE_FOLDER: ${VSPHERE_FOLDER}" >> config.yaml - echo "VSPHERE_NETWORK: ${VSPHERE_NETWORK}" >> config.yaml - echo "VSPHERE_SSH_AUTHORIZED_KEY: ${VSPHERE_SSH_AUTHORIZED_KEY}" >> config.yaml - echo "VSPHERE_TLS_THUMBPRINT: ${VSPHERE_TLS_THUMBPRINT}" >> config.yaml - echo "VSPHERE_INSECURE: ${VSPHERE_INSECURE}" >> config.yaml - echo "VSPHERE_USERNAME: '${VSPHERE_USERNAME}'" >> config.yaml - echo "VSPHERE_PASSWORD: '${VSPHERE_PASSWORD}'" >> config.yaml - ``` - -1. Create a cluster with dry-run option to only get the addons manifest - - ```shell - export _TKG_CLUSTER_FORCE_ROLE= - # Set the addons for which addons manifest needs to be generated. Remove other addons from the the below list. - export FILTER_BY_ADDON_TYPE="cni/antrea,cloud-provider/vsphere-cpi,csi/vsphere-csi" - export REMOVE_CRS_FOR_ADDON_TYPE="cni/antrea,cloud-provider/vsphere-cpi,csi/vsphere-csi" - - # Note: vsphere-control-plane-endpoint 10.10.10.10 in the below command is dummy and any IP can be used - tanzu cluster create ${CLUSTER_NAME} --dry-run --plan dev --vsphere-controlplane-endpoint 10.10.10.10 -f config.yaml > ${CLUSTER_NAME}-addons-manifest.yaml - ``` - - **Addon types** - - ```yaml - calico: cni/calico - antrea: cni/antrea - vsphere CPI: cloud-provider/vsphere-cpi - vsphere CSI: cloud-provider/vsphere-csi - metrics server: metrics/metrics-server - pinniped: authentication/pinniped - ``` - -1. Check the generate addons manifest and apply it on cluster - - ```shell - kubectl apply -f ${CLUSTER_NAME}-addons-manifest.yaml - ``` diff --git a/docs/cli/unstable-versions.md b/docs/cli/unstable-versions.md deleted file mode 100644 index 8385d4f6dd..0000000000 --- a/docs/cli/unstable-versions.md +++ /dev/null @@ -1,14 +0,0 @@ -# Unstable Versions - -The Tanzu CLI offers the ability to filter CLI plugins based on the Semantic Version of the plugin. By default, the CLI will filter any non-stable versions of plugins from being used but this behavior can be updated by config options. To update, use the config command: - -```sh -tanzu config set unstable-versions all -``` - -The options for the command are: - -* `none`: Allows only stable plugin versions. Default. -* `alpha`: All stable plugins and plugins with a prerelease tag matching "alpha" are allowed. -* `experimental`: All stable, alpha and all prerelease versions are allowed, minus any build tagged versions. -* `all`: Allows all plugin versions, regardless of prerelease or build tags. diff --git a/docs/design/README.md b/docs/design/README.md deleted file mode 100644 index 7207440084..0000000000 --- a/docs/design/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Design Proposals - -This directory is to be populated with design reviews. - -Use the [Proposal Template](docs/dev/_proposal.md) as a starting point. - -The proposal should be documented as a separated markdown in this directory via PR. - -The name should follow the name pattern `-design.md`, -e.g: `restore-hooks-design.md`. diff --git a/docs/design/bringyourownhost-design.md b/docs/design/bringyourownhost-design.md deleted file mode 100644 index adc179306a..0000000000 --- a/docs/design/bringyourownhost-design.md +++ /dev/null @@ -1,148 +0,0 @@ -# Bring-Your-Own-Host Design - -## Abstract - -The Bring Your Own Host aka BYOH aims at enabling Kubernetes cluster life cycle management on user provided hosts (bare metal hosts in most cases). - -Currently some infrastructure providers are supported in tanzu-framework(e.g. vSphere, AWS, Azure). This is to enhance current tanzu-framework to support BYOH as infrastructure provider, so that users can use tanzu CLI to create BYOH workload cluster. - -## Background - -Consider the multiple provider work covers multiple components in Tanzu product family and from BYOH team's point of view we are searching to enable customer to be able to create BYOH workload cluster with Tanzu CLI as a start point. We shape the project into 3 phases and firstly we intend to implement the "crawl phase": - -Crawl Phase - -1. Document on patch the existing Management cluster with BYOH provider - -2.Enhance the ```tanzu cluster create``` CLI so customer can use it to create BYOH cluster. - -Walk Phase - -1. Implement the tanzu management-cluster provider CLI so customer can use it to patch management cluster with new provider - -2. Support patching BYOH provider - -3. Support install BYOH provider when create management cluster with ```tanzu management-cluster create``` CLI. - -Run Phase - -1. Support lifecycle management of AWS/Azure/Any other provider with ```tanzu management-cluster provider``` CLI - -2. Support create workload cluster with selected provider with multiple providers installed management cluster. - -3. Support creates management cluster directly on BYOH hosts. - -## Goals - -* Define the configurations used for BYOH to create BYOH workload cluster. -* Use the existing ```tanzu cluster create``` command to create BYOH workload cluster using the configuration file. -* Use the existing ```tanzu cluster list/delete/scale``` command to list/delete/update BYOH workload cluster. - -## High-Level Design - -This is to describe what will be targeted for the first phase. - -### Management cluster - -To deploy a management cluster with BYOH integrated, firstly you create a command vSphere management cluster. -Then you patch the management cluster to have the 'byoh' provider included. - -1. Using the ```tanzu management-cluster create``` command to create a common management cluster. - -2. Install the "clusterctl" binary and use it to patch the management cluster created by step 1. - clusterctl, which can be downloaded from the latest [release][releases] of Cluster API (CAPI) on GitHub. - To learn more about cluster API in more depth, check out the the [Cluster API book][cluster-api-book]. - -3. Configuring and installing BringYourOwnHost provider in a management cluster - To initialize Cluster API Provider BringYourOwnHost, clusterctl requires the following settings, which should be set in `~/.cluster-api/clusterctl.yaml` as the following: - -``` yaml -providers: - - name: byoh - url: https://github.com/vmware-tanzu/cluster-api-provider-bringyourownhost/releases/latest/infrastructure-components.yaml - type: InfrastructureProvider -``` - -running `clusterctl config repositories`. - -You should be able to see the new BYOH provider there. - -```shell -clusterctl config repositories -NAME TYPE URL FILE -cluster-api CoreProvider https://github.com/kubernetes-sigs/cluster-api/releases/latest/ core-components.yaml -... -byoh InfrastructureProvider https://github.com/vmware-tanzu/cluster-api-provider-bringyourownhost/releases/latest/ infrastructure-components.yaml -... -vsphere InfrastructureProvider https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/releases/latest/ infrastructure-components.yaml -``` - -Install the BYOH provider - -```shell -clusterctl init --infrastructure byoh -``` - -### Workload cluster - -To deploy a Kubernetes workload cluster, you create a configuration file that specifies the different options with which to deploy the cluster. You then run the tanzu cluster create command, specifying the configuration file in the ```--file``` option. -When you deploy a Kubernetes cluster, most of the configuration for the cluster is the same as the configuration of the management cluster that you use to deploy it. - -1. Specify the type of infrastructure provider to "BringYourOwnHost" with ```INFRASTRUCTURE_PROVIDER``` variable. - ```INFRASTRUCTURE_PROVIDER: byoh``` - -2. Set a name for the cluster in the ```CLUSTER_NAME``` variable. -For example if you are deploying the BYOH cluster, set the name to "my-byoh-tkc" - ```CLUSTER_NAME: my-byoh-tkc``` - -3. If you are deploying the cluster to BYOH, specify a static virtual IP address or FQDN in the ```BYOH_CONTROL_PLANE_ENDPOINT``` variable. - Specify a port in the "BYOH_CONTROL_PLANE_ENDPOINT_PORT" variable. (If not specified, by default the port is: 6443) - ```BYOH_CONTROL_PLANE_ENDPOINT: 10.90.110.100``` - ```BYOH_CONTROL_PLANE_ENDPOINT_PORT: 6443``` - -4. You can also deploy a BYOH workload cluster with Custom Control Plane and Worker Node Counts. -In this version, the dev and prod plans for Tanzu Kubernetes clusters deploy the following: -The dev plan: one control plane node and one worker node. -The prod plan: three control plane nodes and three worker nodes. - To deploy a Tanzu Kubernetes cluster with more control plane nodes than the dev and prod plans define by default, specify the ```CONTROL_PLANE_MACHINE_COUNT``` variable in the cluster configuration file. The number of control plane nodes that you specify in ```CONTROL_PLANE_MACHINE_COUNT``` must be uneven: - ```CONTROL_PLANE_MACHINE_COUNT: 5``` - Specify the number of worker nodes for the cluster in the WORKER_MACHINE_COUNT variable. For example: - ```WORKER_MACHINE_COUNT: 5``` - -5. Finally, you get a configuration file below, then save the configuration file as "my-byoh-tkc.yaml". - - ```yaml - CLUSTER_CIDR: 100.96.1.0/11 - CLUSTER_NAME: my-byoh-tkc - CLUSTER_PLAN: prod - INFRASTRUCTURE_PROVIDER: byoh - SERVICE_CIDR: 10.192.168.0/24 - BYOH_CONTROL_PLANE_ENDPOINT: 10.90.110.100 - BYOH_CONTROL_PLANE_ENDPOINT_PORT: 6443 - WORKER_MACHINE_COUNT: 5 - CONTROL_PLANE_MACHINE_COUNT: 5 - ``` - -6. Run the ```tanzu cluster create``` command, specifying the path to the configuration file in the ```--file``` option. - ```tanzu cluster create --file ./my-byoh-tkc.yaml``` - -7. To see information about the cluster, run the ```tanzu cluster get``` command, specifying the cluster name. - ```tanzu cluster get my-byoh-tkc``` - -8. You can also scale a cluster horizontally with the Tanzu CLI. To horizontally scale a Tanzu Kubernetes cluster, use the ```tanzu cluster scale``` command. You change the number of control plane nodes by specifying the ```--controlplane-machine-count``` option. You change the number of worker nodes by specifying the ```--worker-machine-count``` option. - To scale a cluster that you originally deployed with 3 control plane nodes and 5 worker nodes to 7 and 10 nodes respectively, run the following command: -```tanzu cluster scale --controlplane-machine-count 7 --worker-machine-count 10``` - -## Detailed Design - -1. Add the “**infrastructure-byoh**” folder which contains the YTT templates to generate the YAML files, so that CAPI can provision BYOH workload clusters using these YAML files. -Update "providers/config.yaml" and create new YTT under folder " providers/infrastructure-byoh/v0.1.0/" to support BYOH as a new type of provider. - -2. Add the configuration item to let users define control plane endpoint for BYOH workload cluster. -Update "providers/config_default.yaml" and tanzu-framework go code, so that new configurations can be read to create BYOH workload cluster. - -3. Configurations to provision BYOH workload clusters should be validated in case of invalid configuration input. - - -[cluster-api-book]: https://cluster-api.sigs.k8s.io/ -[releases]: https://github.com/kubernetes-sigs/cluster-api/releases diff --git a/docs/design/node-pool/package-based-lcm-node-pools.md b/docs/design/node-pool/package-based-lcm-node-pools.md deleted file mode 100644 index bc4fa15c9e..0000000000 --- a/docs/design/node-pool/package-based-lcm-node-pools.md +++ /dev/null @@ -1,71 +0,0 @@ -# Node Pools configuration for ClusterClass-based clusters - -This doc provides an overview of differences in behavior when using the node pool API against a cluster using a clusterclass definition. The one thing that all of these APIs have in common when operating against a clusterclass based cluster is the need to update the cluster, specifically the cluster topology. - -## Delete - -Delete is the most straight forward change. The cluster resource is updated to remove the definition of the machine deployment with the name of the node pool that is passed to the delete API. The API does still prohibit the deletion of the final node pool in the cluster. - -```bash -tanzu cluster node-pool delete tkg-wc-vsphere -n md–0 -``` - -## List - -List retrieves the MachineDeployment resources as in the non clusterclass based case and matches these resources against the machine deployments in the cluster topology. This allows the list API to return the same MachineDeployment resources with the names updated to match the machine deployments defined in the cluster topology. - -```bash -tanzu cluster node-pool list tkg-wc-vsphere - NAME NAMESPACE PHASE REPLICAS READY UPDATED UNAVAILABLE - md-0 default Ready 1 1 1 0 -``` - -## Properties on Node Pools in ClusterClass based Clusters - -Properties that can be updated on node pools in clusterclass based clusters can be broken down into two types. Direct properties of the machine deployment topology resources and variables overrides. Direct properties, like replica count, modify the machine deployment topolgy direct. Variable overrides rely on the definition of variables at the clusterclass level. When deploying a cluster based on a clusterclass, the cluster definition must specify a number of these variables, which apply to all machine deployments by default. The machine deployment topology allows these variables to be overridden on a machine deployment basis. - -The definitive source for properties that can be modified are the clusterclasses themselves. The TKGm clusterclasses all define a variable `worker` that contains worker node vm properties. This includes `instanceType` and `vmSize` for AWS and Azure respectively. The vSphere version includes properties for `diskGiB`, `memoryMiB`, and `numCPU`. TKGs defines top level variables for `vmClass` and `storageClass` as well as an array for `nodePoolVolumes` for customzing worker nodes. TKGm vSphere also defines a vcenter variable for updating properties related to the vcenter server. - -All TKG clusterclasses define a `nodePoolLabels` variable that specifies the node labels on the worker nodes. - -### Special Note - -The node pool API provided by the Tanzu CLI requires the above variables to be defined on the clusterclass to support creating and updating node pools. If you use a custom clusterclass these variables are required as top level variable definitions in the clusterclass. It is still possible to get and delete node pools on custom clusterclass based clusters using the Tanzu CLI. There is a special case where create and update will work for custom clusterclasses. Specifically if the node pool definition passed to the Tanzu cli specifies at most the `replicas`, `az`, `name`, `workerClass`, and `tkrResolver`. In this case the `workerClass` must match a `workerClass` definition in the custom clusterclass. - -## Set (Update) - -When the Set API is called using the name of an existing node pool the update will only modify the replica count and labels of the named node pool, if provided. Any other provided options will be ignored. Specifically the cluster's topology will be update with a new replica count and a nodePoolLabels variable override if these values are provided. - -## Set (Create) - -Creating node pools can follow one of two paths. A user can pass a base machine deployment that is used as the starting point for the new node pool. A deep copy of the named base machine deployment acts as a basis on which the user passed properties will be layered. In general this means all of the variable overrides of the copied machine deployment will be updated with new values provided by the user. This is different from the case where a base machine deployment is not provided. In this case, variable overrides will be copied from the global variable definitions defined in the cluster topology and then the user provided values will be layered on those. Additionally when a user does not provide a base machine deployment, they must provide a workerClass and tkrResolver definition. TKG ClusterClasses have a `tkg-worker` class defined by default, and should be used unless a user have added their own worker class definition. The tkrResolver is the value of the tkr-resolver annotation. - -Using a base machine deployment to create a new node pool. - -```bash -tanzu cluster node-pool set tkg-wc-vsphere -f /path/to/node-pool.yml –-base-machine-deployment md-0 -``` - -node-pool.yml - -```yaml -name: np-1 -replicas: 1 -nodeMachineType: t3.large -``` - -Without using a base machine deployment to create a new node pool. - -```bash -tanzu cluster node-pool set tkg-wc-vsphere -f /path/to/node-pool.yml -``` - -node-pool.yml - -```yaml -name: np-1 -replicas: 1 -nodeMachineType: t3.large -workerClass: tkg-worker -tkrResolver: os-name=ubuntu,os-arch=amd64 -``` diff --git a/docs/dev/build.md b/docs/dev/build.md index 76bef95189..d2d380f6b9 100644 --- a/docs/dev/build.md +++ b/docs/dev/build.md @@ -21,51 +21,12 @@ To build the APIs in Framework, the following commands exist: API controllers that exist in the Framework repo -* [Addons](https://github.com/vmware-tanzu/tanzu-framework/tree/main/addons) * [FeatureGates](https://github.com/vmware-tanzu/tanzu-framework/tree/main/featuregates) * [Capabilities](https://github.com/vmware-tanzu/tanzu-framework/tree/main/capabilities) -* [TKR](https://github.com/vmware-tanzu/tanzu-framework/tree/main/pkg/v1/tkr) Each controller directory has its own Dockerfile, Makefile and manifests needed to build the image and deploy the controller to the cluster. -### Framework CLI - -The CLI has specific targets for local development due to its distributed nature. - -`make build-install-cli-local`: cleans, builds and installs plugins locally for -your platform - -`make test`: Performs a suite of tests on the CLI and API controllers. - -### Building Plugins - -The CLI builder can accept directories using a single, global Go module -or multiple Go modules within sub directories. - -Generally, the directory structure when building plugins may look like: - -```sh -plugins-directory -|- foo-plugin -|- bar-plugin -``` - -where `foo-plugin` and `bar-plugin` are within a single, global, top level Go module -or are both individually, their own Go module. Both are accepted. - -Consider these command while building plugins: - -`make build-install-cli-all`: cleans, builds and installs plugins. - -`make build-install-cli-local`: cleans, builds, installs CLI and plugins locally -for your platform. - -`make build-cli-local`: Only builds the Tanzu CLI locally. - -Check out the [plugin implementation guide](../../cli/core/docs/cli/plugin_implementation_guide.md) -for more details on how to write plugins for Tanzu CLI. - ### Capabilities Framework provides Capability discovery @@ -74,7 +35,7 @@ and Capability API to query a cluster's capabilities. It can be used to understa objects in the cluster. For more detailed information on Capability functionality offered by Framework check out this -[doc](../api-machinery/capability-discovery.md) +[doc](../runtime-core/capability-discovery.md) ### Features and FeatureGates @@ -82,12 +43,4 @@ Framework offers Features and FeatureGates APIs to allow developers to deliver n safely. With these powerful APIs the teams can modify the system behavior without changing the code for more controlled experimentation over the lifecyle of features, these can be incredibly useful for agile management style environments. -For more detailed information on these APIs check out this [doc](../api-machinery/features-and-featuregates.md) - -### Context-aware API-driven Plugin Discovery - -The Tanzu CLI is an amalgamation of all the Tanzu infrastructure elements under one unified core CLI experience. The core CLI supports a plugin model where the developers of different Tanzu services (bundled or SaaS) can distribute plugins that target functionalities of the services they own. When users switch between different services via the CLI context, we want to surface only the relevant plugins for the given context for a crisp user experience. - -This feature is gated by `features.global.context-aware-cli-for-plugins` CLI feature flag and can be turned on/off as described [here](../../cli/core/docs/cli/config-features.md). When this feature is enabled, the CLI will not honor plugins installed prior to this feature being enabled, instead users will need to install plugins again with either `tanzu plugin install ` or `tanzu plugin sync`. - -For more detailed information on these design check out this [doc](../../cli/core/docs/design/context-aware-plugin-discovery-design.md) +For more detailed information on these APIs check out this [doc](../runtime-core/features-and-featuregates.md) diff --git a/docs/dev/merging_standards.md b/docs/dev/merging_standards.md deleted file mode 100644 index cbbc12e85d..0000000000 --- a/docs/dev/merging_standards.md +++ /dev/null @@ -1,31 +0,0 @@ -# Merging Standards - -Many aspects of Framework are intended to be standardized - things like CLI flags, log output and terminology are all intended to be standard to ensure cohesion across the product. - -This document intends to layout steps on how to consider Pull Requests which may alter these areas. - -## CLI Words - -We have standard [CLI words](../../pkg/v1/cli/command/plugin/lint/cli-wordlist.yml) defined in this repo to make it simple to keep our CLI words intact and allow our CLI plugins to vet themselves. - -The easiest way to check if a command aligns with our CLI nouns and verbs standards is to run the plugins hidden `lint` comand. Every plugin offered by Tanzu CLI can lint itself against our standard words list. For any plugin, simply run: - -`tanzu lint` - -Alternatively, the list can always just [be referenced directly](https://github.com/vmware-tanzu/tanzu-framework/blob/main/hack/linter/cli-wordlist.yml). - -### Format - -The [CLI style-guide](../../cli/core/docs/cli/style_guide.md) provides guidance on how CLI nouns and verbs should be structured, please make sure to consult this while evaluating CLI word changes. - -In short, words meet the following criteria: - -* English, using US spelling -* Clear and unambiguous -* Concise without using acronyms that are not an industry standard (URL is good, MC is not) - -Ideally, words will be the appropriate part of speech; nouns should be nouns, verbs should be verbs. - -Ideally, merge requests proposing new words will define those terms. - -Any additions that contradict existing terms should be adjusted and changes which do not conform to this list always require input from *Product*. This list is parsed and used to enforce standardization so it is important to treat changes here deliberately, like changing a model. diff --git a/docs/dev/troubleshooting.md b/docs/dev/troubleshooting.md index fa60287cfd..136f06390e 100644 --- a/docs/dev/troubleshooting.md +++ b/docs/dev/troubleshooting.md @@ -1,26 +1,5 @@ # Troubleshooting -When running commands or developing locally, sometimes things may go awry and you may need -more information on the status of the cluster. - -The following tips may be useful when troubleshooting aspects of Tanzu Framework. - -## Verbose Output - -The Tanzu CLI provides verbose output options, and setting this to its highest value (`-v9`) -can be useful when unexpected things happen. - -`-v, --verbose int32 Number for the log level verbosity(0-9)` - -## Clean and Rebuild CLI Plugins - -Sometimes it is necessary to sanitize your plugin environment by cleaning and rebuild your artifacts. -Over time, one may run into issues due to the plugin artifacts being in an inconsistent state due to prior -development builds. Cleaning the plugin versions and starting with fresh plugin builds can help with unexpected -or difficult CLI issues. - -The [Build doc](build.md) describes how to accomplish this. - ## Open an Issue If you stumble into a situation where a clean build of the main branch will not build cleanly, please open an diff --git a/docs/framework-use-cases.md b/docs/framework-use-cases.md index 53af80fccb..9e68ce803c 100644 --- a/docs/framework-use-cases.md +++ b/docs/framework-use-cases.md @@ -3,26 +3,7 @@ This document provides some use cases for Framework to understand the project's context. -## Use Case #1 - CLI Plugins - -### Context - -Allow the teams and external partners to extend the Tanzu CLI so that they can -build, own and release their own piece of functionality. - -### Solution - -The Tanzu CLI is based on a modular plugin architecture that consists of -plugins. This architecture enables teams to build, own, and release their own -piece of functionality as well as enable external partners to integrate with -the system. The Tanzu CLI also provides tools to make creating and compiling -new plugins straightforward. - -Check out this [document](../cli/core/docs/cli/cli-architecture.md) to learn more about the -Tanzu CLI architecture and this [document](../cli/core/docs/cli/plugin_implementation_guide.md) -to learn on how to bootstrap a new CLI plugin. - -## Use Case #2 - Features and FeatureGates +## Use Case #1 - Features and FeatureGates ### Context @@ -41,10 +22,10 @@ behavior of the plugin or controller without changing the code for more controlled experimentation, these can be incredibly useful for agile management style environments. -Check out this [document](./api-machinery/features-and-featuregates.md) to +Check out this [document](runtime-core/features-and-featuregates.md) to learn more about the Features and FeatureGates APIs and how to use them. -## Use Case #3 - Capabilities +## Use Case #2 - Capabilities ### Context @@ -62,4 +43,4 @@ to query a cluster's capabilities. It can be used to understand the API surface area and query for objects in the cluster. For more detailed information on Capability functionality offered by Framework -check out this [document](./api-machinery/capability-discovery.md). +check out this [document](runtime-core/capability-discovery.md). diff --git a/docs/glossary.md b/docs/glossary.md index 0dd1d857d3..30938c0c60 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -1,47 +1,15 @@ # Tanzu Framework Glossary -**Addon:** see definition of “Package.” Framework will be replacing this word with “package” over time. - -**BOM - Bill of materials:** A manifest that identifies components and their versions in a release. - -**Builder:** This helps plugin authors by scaffolding CLI plugin repositories for new plugins, and by building CLI plugins from code for specified architectures. - -**Catalog:** Holds the information of all currently installed plugins on a host OS. - **Condition:** A Kubernetes concept that communicates the status of a resource during its lifecycle. Conditions can include timestamps for these state changes and so provide a timeline of what happened to a resource. A condition may include a ‘reason’ string which can provide detail especially useful when troubleshooting. -**Core, Auto-managed, and User-managed:** refers to the way in which the lifecycle of a package is managed. Note that these terms are defined for convenience and should not show up in the API or CLI. - -* **Core:** Packages that are installed in clusters by default, typically because they’re required for basic cluster functionality. The versions for these packages are managed as part of the Tanzu Kubernetes release/Bill of Materials and managed in lock step with the version of Tanzu Kubernetes Grid (TKG) and/or Kubernetes. Thus, the version of these packages is automatically selected, and upgrades happen automatically when the cluster itself is upgraded. - -* **Auto-managed:** Packages that a user opts to install, but for which the version of the package is automatically selected. Like core packages, upgrades happen automatically when the cluster itself is upgraded. Details of this will be determined by the linked patching effort. - -* **User-managed:** Packages whose lifecycle is explicitly managed by a user. This would include packages delivered by TKG which are not automatically managed as part of TKG upgrades. Instead, users will manage the lifecycle for these packages: when to install, what version to install, when to upgrade, and what version to upgrade to. - **Discovery API:** How an API consumer discovers the APIs and API versions/revisions supported by a specific instance of the local control plane. -**Extension:** See definition of “Package”. Formerly a term used to mean the same thing. - -**Extensibility:** The Tanzu CLI was built to be an extensible framework, allowing teams to add functionality via a plugin rather than a separate CLI, to enable a more cohesive user experience. - **FeatureGate:** The mechanism that provides a means to control the activation state for a set of Features. FeatureGates are a resource that is managed by Platform Operators. **Feature Activation:** The reconciled state of all Features. If a FeatureGate exists that references a specific Feature, it is reconciled by the FeatureGate to display the correct Activations and Deactivations. If a FeatureGate doesn't exist, Features will always default to their defined activation. **Finalizer:** A code function in a K8s controller resource used to help cleanup. Best practice is to provide a timestamp for deletion of objects to avoid further reconciliation overhead the controller needs to do for that object. -**Groups:** How plugin output is displayed. Currently Admin, Extra, Run, System, Version are displayed within groups. - -**Hub and Spoke:** Employed by controller-runtime to cut down on the number of permutations of conversions between different versions. One version is designated as the “hub” (by implementing the Hub interface) and all the other versions define conversions to and from the “hub”. - -**Management Package:** A package that’s intended to run in a management cluster; the unit of extensibility for the management cluster. - **Package** (also known as Addon or Extension): A unit of extensibility for a Kubernetes cluster that leverages the [Carvel](https://carvel.dev/) tools. A single package is a combination of configuration metadata and OCI images that ultimately inform the package manager what software it holds and how to install it into a Kubernetes cluster. -**Plugin:** Unit of extensibility for CLI, delivered as a package and potentially referenced from a management package. The CLI consists of plugins, each of which shows up as either a resource or command (such as ‘login’ or ‘apps’. Plugins are developed in Go using the Cobra framework and conform to the Tanzu styleguide to ensure consistency between plugins. - **Predicate:** A defined condition, such a change in version, used to help filter events that controllers watch when trying to reconcile. - -**Repository:** Represents a group of plugin artifacts that are installable by the Tanzu CLI. A repository is defined as an interface. - -**TKG SDK:** A collection of packages and tools provided by Framework intended to provide developers with additional integration capabilities. diff --git a/docs/release/release-process.md b/docs/release/release-process.md index ab7641a830..b69152106a 100644 --- a/docs/release/release-process.md +++ b/docs/release/release-process.md @@ -4,15 +4,14 @@ The person who is responsible for cutting a release, pushes a tag to the GitHub repo to trigger the automation. A GitHub action then does the following things: -1. Runs a full build via `make all` to build the UI and CLI. -1. Runs the tests. -1. Uploads the CLI artifacts to GCP buckets. -1. Creates a draft github release. +1. Runs a full build via `make` targets. +2. Runs the tests. +3. Creates a draft github release. After the GitHub action runs successfully without failure, the person who is cutting the release: 1. Runs the [release-notes](release-notes-gathering-process.md) command to gather the release notes from the pull requests that are part of the release. -1. Goes to the releases page and adds the release notes to the Draft release +2. Goes to the releases page and adds the release notes to the Draft release and publishes the release. diff --git a/docs/api-machinery/README.md b/docs/runtime-core/README.md similarity index 100% rename from docs/api-machinery/README.md rename to docs/runtime-core/README.md diff --git a/docs/api-machinery/capability-discovery.md b/docs/runtime-core/capability-discovery.md similarity index 100% rename from docs/api-machinery/capability-discovery.md rename to docs/runtime-core/capability-discovery.md diff --git a/docs/api-machinery/features-and-featuregates.md b/docs/runtime-core/features-and-featuregates.md similarity index 100% rename from docs/api-machinery/features-and-featuregates.md rename to docs/runtime-core/features-and-featuregates.md diff --git a/docs/api-machinery/guide/README.md b/docs/runtime-core/guide/README.md similarity index 100% rename from docs/api-machinery/guide/README.md rename to docs/runtime-core/guide/README.md diff --git a/docs/api-machinery/guide/examples/controller.go.sample b/docs/runtime-core/guide/examples/controller.go.sample similarity index 100% rename from docs/api-machinery/guide/examples/controller.go.sample rename to docs/runtime-core/guide/examples/controller.go.sample diff --git a/docs/api-machinery/guide/examples/megacache_types.go.sample b/docs/runtime-core/guide/examples/megacache_types.go.sample similarity index 100% rename from docs/api-machinery/guide/examples/megacache_types.go.sample rename to docs/runtime-core/guide/examples/megacache_types.go.sample diff --git a/docs/api-machinery/tanzu-core-controllers.md b/docs/runtime-core/tanzu-core-controllers.md similarity index 100% rename from docs/api-machinery/tanzu-core-controllers.md rename to docs/runtime-core/tanzu-core-controllers.md diff --git a/featuregates/Makefile b/featuregates/Makefile deleted file mode 100644 index c75f518cd4..0000000000 --- a/featuregates/Makefile +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../common.mk - -IMG_DEFAULT_NAME := featuregates-controller-manager -IMG_DEFAULT_TAG := latest -IMG_DEFAULT_NAME_TAG := $(IMG_DEFAULT_NAME):$(IMG_DEFAULT_TAG) - -IMG_VERSION_OVERRIDE ?= $(IMG_DEFAULT_TAG) - -ifeq ($(strip $(OCI_REGISTRY)),) - IMG ?= $(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -else - IMG ?= $(OCI_REGISTRY)/$(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -endif - -CRD_OPTIONS ?= "crd" - -all: manager - - - -LOCALBIN ?= $(shell pwd)/../hack/tools/bin -$(LOCALBIN): - mkdir -p $(LOCALBIN) - -ENVTEST ?= $(LOCALBIN)/setup-envtest -ENVTEST_K8S_VERSION = 1.26.1 - -.PHONY: envtest -envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. -$(ENVTEST): $(LOCALBIN) - test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest - -# Run tests -test: envtest - cd client && go test ./... -coverprofile cover.out - cd controller && KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test ./... -v -coverprofile cover.out - -# Build manager binary -manager: - go build -ldflags "$(LD_FLAGS)" -o bin/manager ./controller/main.go - -# Run against the configured Kubernetes cluster in ~/.kube/config -run: - cd controller && go run -ldflags "$(LD_FLAGS)" ./main.go - -.PHONY: docker-build -docker-build: ## Build docker image - cd ../ && docker build -t $(IMG) -f featuregates/controller/Dockerfile --build-arg LD_FLAGS="$(LD_FLAGS)" --build-arg DISTROLESS_BASE_IMAGE="$(DISTROLESS_BASE_IMAGE)" --build-arg GOPROXY="$(GOPROXY)" --build-arg GOSUMDB="$(GOSUMDB)" . - -.PHONY: docker-publish -docker-publish: ## Publish docker image - docker push $(IMG) - -.PHONY: kbld-image-replace -kbld-image-replace: ## Add newImage in kbld-config.yaml - cd ../hack/packages/kbld-image-replace && \ - go run main.go -kbld-config ../../../packages/featuregates/kbld-config.yaml $(IMG_DEFAULT_NAME_TAG) $(IMG) - -.PHONY: docker-image-names -docker-image-names: - @echo $(IMG) - -.PHONY: docker-build-and-publish -docker-build-and-publish: docker-build docker-publish kbld-image-replace diff --git a/featuregates/client/go.mod b/featuregates/client/go.mod index 933d6189b3..d946106210 100644 --- a/featuregates/client/go.mod +++ b/featuregates/client/go.mod @@ -3,34 +3,29 @@ module github.com/vmware-tanzu/tanzu-framework/featuregates/client go 1.18 replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../apis/cli github.com/vmware-tanzu/tanzu-framework/apis/config => ../../apis/config github.com/vmware-tanzu/tanzu-framework/apis/core => ../../apis/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../cli/runtime github.com/vmware-tanzu/tanzu-framework/util => ../../util ) require ( github.com/vmware-tanzu/tanzu-framework/apis/config v0.0.0-00010101000000-000000000000 github.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 github.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000 - k8s.io/api v0.24.4 - k8s.io/apimachinery v0.24.4 - k8s.io/client-go v0.24.4 + github.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0 + k8s.io/api v0.25.4 + k8s.io/apimachinery v0.25.4 + k8s.io/client-go v0.25.4 sigs.k8s.io/controller-runtime v0.12.3 ) require ( - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fatih/color v1.13.0 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/ghodss/yaml v1.0.0 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect @@ -48,22 +43,17 @@ require ( github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect github.com/kr/pretty v0.2.1 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // 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.1.6 // indirect - github.com/onsi/gomega v1.20.2 // indirect + github.com/onsi/ginkgo/v2 v2.8.4 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.14.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - go.uber.org/atomic v1.9.0 // indirect golang.org/x/net v0.8.0 // indirect golang.org/x/oauth2 v0.3.0 // indirect golang.org/x/sys v0.6.0 // indirect @@ -76,11 +66,11 @@ require ( 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/apiextensions-apiserver v0.24.4 // indirect - k8s.io/component-base v0.24.4 // indirect - k8s.io/klog/v2 v2.80.0 // indirect + k8s.io/apiextensions-apiserver v0.25.4 // indirect + k8s.io/component-base v0.25.4 // indirect + k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 // indirect k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 // indirect + k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/featuregates/client/go.sum b/featuregates/client/go.sum index 5c6f122ef5..7fc9c8744b 100644 --- a/featuregates/client/go.sum +++ b/featuregates/client/go.sum @@ -13,11 +13,6 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -26,7 +21,6 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -37,48 +31,21 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= @@ -88,62 +55,26 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= 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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -156,34 +87,24 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= +github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -196,7 +117,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -212,15 +132,10 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -230,19 +145,15 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -250,55 +161,20 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= 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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -309,18 +185,14 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -329,40 +201,13 @@ github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn 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/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 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.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= 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= @@ -370,43 +215,22 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 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-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU= -github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.20.2 h1:8uQq0zMgLEfa0vRrrBgaJF2gyW9Da9BmfGV+OyUzfkY= -github.com/onsi/gomega v1.20.2/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/onsi/ginkgo/v2 v2.8.4 h1:gf5mIQ8cLFieruNLAdgijHF1PYfLphKm2dxxcUtcqK0= +github.com/onsi/ginkgo/v2 v2.8.4/go.mod h1:427dEDQZkDKsBvCjc2A/ZPefhKxsTTrsQegMlayL730= +github.com/onsi/gomega v1.27.2 h1:SKU0CXeKE/WVgIV1T61kSa3+IRE8Ekrv9rdXDwwTqnY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= @@ -419,8 +243,6 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= @@ -428,43 +250,20 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 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/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -472,78 +271,33 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0 h1:lUoMXSpa/oH37UJnMY8WFEzjAOQHjcVlwsbxUbEcowg= +github.com/vmware-tanzu/tanzu-plugin-runtime v0.80.0/go.mod h1:y70TLdev7MX8K6CkAA7h92qVUDyjbX8y9/J5q4UmhRs= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -566,8 +320,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -576,17 +328,9 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= 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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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= @@ -598,7 +342,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -609,25 +352,14 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= @@ -637,14 +369,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= @@ -658,17 +383,11 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -677,16 +396,11 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -697,39 +411,21 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -741,7 +437,6 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -750,31 +445,23 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -794,7 +481,6 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -802,16 +488,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= 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= @@ -834,11 +512,6 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -868,7 +541,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -878,20 +550,6 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -905,15 +563,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 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= @@ -934,37 +585,24 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/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= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -972,45 +610,30 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.4 h1:I5Y645gJ8zWKawyr78lVfDQkZrAViSbeRXsPZWTxmXk= -k8s.io/api v0.24.4/go.mod h1:42pVfA0NRxrtJhZQOvRSyZcJihzAdU59WBtTjYcB0/M= -k8s.io/apiextensions-apiserver v0.24.4 h1:w53Pm4zu8fCt9WfiRgS2YI6LE6I4NJ5aUi78GElD3K8= -k8s.io/apiextensions-apiserver v0.24.4/go.mod h1:iDK+Xb4jsPNnRGj5jU/WqqjLvt8363M7cKixKe1C9+U= -k8s.io/apimachinery v0.24.4 h1:S0Ur3J/PbivTcL43EdSdPhqCqKla2NIuneNwZcTDeGQ= -k8s.io/apimachinery v0.24.4/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.4/go.mod h1:mAuC3pZVc0IDXLx7lUHoisBOtBa1SobfLW/CI3klXQE= -k8s.io/client-go v0.24.4 h1:hIAIJZIPyaw46AkxwyR0FRfM/pRxpUNTd3ysYu9vyRg= -k8s.io/client-go v0.24.4/go.mod h1:+AxlPWw/H6f+EJhRSjIeALaJT4tbeB/8g9BNvXGPd0Y= -k8s.io/code-generator v0.24.4/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.4 h1:WEGRp06GBYVwxp5JdiRaJ1zkdOhrqucxRv/8IrABLG0= -k8s.io/component-base v0.24.4/go.mod h1:sWxkgcMfbYHadw0OJ0N+vIscd14/nqSIM2veCdg843o= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= -k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs= +k8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ= +k8s.io/apiextensions-apiserver v0.25.4 h1:7hu9pF+xikxQuQZ7/30z/qxIPZc2J1lFElPtr7f+B6U= +k8s.io/apiextensions-apiserver v0.25.4/go.mod h1:bkSGki5YBoZWdn5pWtNIdGvDrrsRWlmnvl9a+tAw5vQ= +k8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc= +k8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= +k8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8= +k8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw= +k8s.io/component-base v0.25.4 h1:n1bjg9Yt+G1C0WnIDJmg2fo6wbEU1UGMRiQSjmj7hNQ= +k8s.io/component-base v0.25.4/go.mod h1:nnZJU8OP13PJEm6/p5V2ztgX2oyteIaAGKGMYb2L2cY= +k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 h1:hWRbsoRWt44OEBnYUd4ceLy4ofBoh+p9vauWp/I5Gdg= +k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 h1:XmRqFcQlCy/lKRZ39j+RVpokYNroHPqV3mcBRfnhT5o= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8= +k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= 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= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/featuregates/client/pkg/featuregateclient/client.go b/featuregates/client/pkg/featuregateclient/client.go index cd1b457c75..91aae87823 100644 --- a/featuregates/client/pkg/featuregateclient/client.go +++ b/featuregates/client/pkg/featuregateclient/client.go @@ -15,7 +15,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" corev1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" + "github.com/vmware-tanzu/tanzu-plugin-runtime/config" + "github.com/vmware-tanzu/tanzu-plugin-runtime/config/types" ) // FeatureGateClient defines methods to interact with FeatureGate resources @@ -277,11 +278,14 @@ func (f *FeatureGateClient) setDeactivated(ctx context.Context, gate *corev1alph // getCurrentClusterConfig gets the config of current logged in cluster func getCurrentClusterConfig() (*rest.Config, error) { - server, err := config.GetCurrentServer() + c, err := config.GetCurrentContext(types.TargetK8s) if err != nil { return nil, err } - restConfig, err := getRestConfigWithContext(server.ManagementClusterOpts.Context, server.ManagementClusterOpts.Path) + if c.ClusterOpts == nil { + return nil, fmt.Errorf("unexpected error: context options is nil") + } + restConfig, err := getRestConfigWithContext(c.ClusterOpts.Context, c.ClusterOpts.Path) if err != nil { return nil, fmt.Errorf("could not get rest config: %w", err) } diff --git a/featuregates/controller/Dockerfile b/featuregates/controller/Dockerfile deleted file mode 100644 index c497aa5eea..0000000000 --- a/featuregates/controller/Dockerfile +++ /dev/null @@ -1,52 +0,0 @@ -# SPDX-License-Identifier: Apache-2.0 -# Enable Buildkit - -# syntax=docker/dockerfile:1.4 - -# Build from publicly reachable source by default, but allow people to re-build images on -# top of their own trusted images. -ARG BUILDER_BASE_IMAGE=golang:1.18 -ARG DISTROLESS_BASE_IMAGE=gcr.io/distroless/static:nonroot - -# Build the manager binary -FROM $BUILDER_BASE_IMAGE as builder - -WORKDIR /workspace - -# Copy the Go Modules manifests -COPY featuregates/controller/go.mod featuregates/controller/go.mod -COPY featuregates/controller/go.sum featuregates/controller/go.sum -COPY featuregates/client featuregates/client -COPY apis/ apis/ -COPY cli/runtime cli/runtime -COPY capabilities/client capabilities/client -COPY util/go.mod util/go.mod - -WORKDIR featuregates/controller -# Setting default GOPROXY to https://proxy.golang.org,direct and GOSUMDB to sum.golang.org which can be override by Makefile -ARG GOSUMDB -ARG GOPROXY -ENV GOSUMDB=$GOSUMDB -ENV GOPROXY=$GOPROXY -# cache deps before building and copying source so that we don't need to re-download as much -# and so that source changes don't invalidate our downloaded layer -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod go mod download - -# Copy the go source -COPY ./featuregates/controller/pkg ./pkg -COPY ./featuregates/controller/main.go ./main.go - -# Build -ARG LD_FLAGS -ENV LD_FLAGS="$LD_FLAGS "'-extldflags "-static"' - -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags "$LD_FLAGS" -o manager ./main.go - -# Use distroless as minimal base image to package the manager binary -# Refer to https://github.com/GoogleContainerTools/distroless for more details -FROM $DISTROLESS_BASE_IMAGE -WORKDIR / -COPY --from=builder /workspace/featuregates/controller/manager . -USER nonroot:nonroot - -ENTRYPOINT ["/manager"] diff --git a/featuregates/controller/go.mod b/featuregates/controller/go.mod index 273f0b3213..dd95dd28d2 100644 --- a/featuregates/controller/go.mod +++ b/featuregates/controller/go.mod @@ -3,46 +3,47 @@ module github.com/vmware-tanzu/tanzu-framework/featuregates/controller go 1.18 replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../../apis/cli github.com/vmware-tanzu/tanzu-framework/apis/config => ../../apis/config github.com/vmware-tanzu/tanzu-framework/apis/core => ../../apis/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../../cli/runtime github.com/vmware-tanzu/tanzu-framework/featuregates/client => ../client github.com/vmware-tanzu/tanzu-framework/util => ../../util ) require ( github.com/go-logr/logr v1.2.3 - github.com/onsi/ginkgo/v2 v2.6.0 - github.com/onsi/gomega v1.24.1 + github.com/onsi/ginkgo/v2 v2.8.4 + github.com/onsi/gomega v1.27.1 github.com/vmware-tanzu/tanzu-framework/apis/config v0.0.0-20220824221239-af5a644ffef7 github.com/vmware-tanzu/tanzu-framework/apis/core v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 github.com/vmware-tanzu/tanzu-framework/featuregates/client v0.0.0-20221024130358-59eae49d96aa - k8s.io/api v0.24.6 - k8s.io/apimachinery v0.24.6 - k8s.io/client-go v0.24.6 - k8s.io/component-base v0.24.6 + github.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000 + k8s.io/api v0.25.4 + k8s.io/apimachinery v0.25.4 + k8s.io/client-go v0.25.4 + k8s.io/component-base v0.25.4 sigs.k8s.io/controller-runtime v0.12.3 ) require ( github.com/beorn7/perks v1.0.1 // indirect + github.com/blendle/zapdriver v1.3.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/zapr v1.2.0 // indirect + github.com/go-logr/zapr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.22.3 // indirect + github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/gnostic v0.6.9 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect github.com/google/uuid v1.3.0 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect @@ -69,16 +70,18 @@ require ( golang.org/x/term v0.6.0 // indirect golang.org/x/text v0.8.0 // indirect golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.6.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.1 // 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/apiextensions-apiserver v0.24.4 // indirect - k8s.io/klog/v2 v2.80.0 // indirect + k8s.io/apiextensions-apiserver v0.25.4 // indirect + k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 // indirect k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 // indirect + k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 // indirect + knative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect sigs.k8s.io/yaml v1.3.0 // indirect diff --git a/featuregates/controller/go.sum b/featuregates/controller/go.sum index b6949ebe09..b1e8fca265 100644 --- a/featuregates/controller/go.sum +++ b/featuregates/controller/go.sum @@ -13,11 +13,6 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -26,7 +21,6 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -37,47 +31,25 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= +github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= @@ -87,59 +59,27 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= 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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -152,34 +92,27 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= +github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= +github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -192,7 +125,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -208,15 +140,10 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -226,19 +153,15 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -246,56 +169,24 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= 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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -306,16 +197,12 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -323,30 +210,13 @@ github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= 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/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 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.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= 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= @@ -354,43 +224,23 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 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-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.6.0 h1:9t9b9vRUbFq3C4qKFCGkVuq/fIHji802N1nrtkh1mNc= -github.com/onsi/ginkgo/v2 v2.6.0/go.mod h1:63DOGlLAH8+REH8jUGdL3YpCpu7JODesutUjdENfUAc= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= -github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/onsi/ginkgo/v2 v2.8.4 h1:gf5mIQ8cLFieruNLAdgijHF1PYfLphKm2dxxcUtcqK0= +github.com/onsi/ginkgo/v2 v2.8.4/go.mod h1:427dEDQZkDKsBvCjc2A/ZPefhKxsTTrsQegMlayL730= +github.com/onsi/gomega v1.27.1 h1:rfztXRbg6nv/5f+Raen9RcGoSecHIFgBBLQK3Wdj754= +github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= @@ -403,8 +253,6 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= @@ -412,45 +260,23 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 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/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -458,52 +284,21 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -511,26 +306,20 @@ go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -553,8 +342,6 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -563,17 +350,11 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= 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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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= @@ -585,7 +366,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -596,25 +376,14 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= @@ -624,14 +393,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= @@ -646,12 +408,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -662,11 +420,7 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -681,35 +435,20 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -722,7 +461,6 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -731,31 +469,24 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -775,7 +506,6 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -783,16 +513,10 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 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= @@ -815,11 +539,6 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -849,7 +568,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -859,20 +577,6 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -886,15 +590,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 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= @@ -915,19 +612,11 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 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= @@ -943,8 +632,6 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0/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= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -952,49 +639,32 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.4/go.mod h1:42pVfA0NRxrtJhZQOvRSyZcJihzAdU59WBtTjYcB0/M= -k8s.io/api v0.24.6 h1:9EZhqZv4Ct++e6XMh3f5bmP4XMxsuxf4c7WOCCjYvF8= -k8s.io/api v0.24.6/go.mod h1:eoAZTnLglpwBajOxAusPL3xfVW5tUn3Y3gQv8e1XHBA= -k8s.io/apiextensions-apiserver v0.24.4 h1:w53Pm4zu8fCt9WfiRgS2YI6LE6I4NJ5aUi78GElD3K8= -k8s.io/apiextensions-apiserver v0.24.4/go.mod h1:iDK+Xb4jsPNnRGj5jU/WqqjLvt8363M7cKixKe1C9+U= -k8s.io/apimachinery v0.24.4/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.6 h1:Sp4EHDrBtm0V1z/8poY52HhP79dAIcI9lb9DUG54XPc= -k8s.io/apimachinery v0.24.6/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.4/go.mod h1:mAuC3pZVc0IDXLx7lUHoisBOtBa1SobfLW/CI3klXQE= -k8s.io/client-go v0.24.4/go.mod h1:+AxlPWw/H6f+EJhRSjIeALaJT4tbeB/8g9BNvXGPd0Y= -k8s.io/client-go v0.24.6 h1:q7gZYyGL0Iv9zynYOFi5DHc3NFZ2aA0P56QpWFXbEyE= -k8s.io/client-go v0.24.6/go.mod h1:qaJRTFlI24ONWGplf+j8IgTyb6ztpwS6SGfjcNCRpQ8= -k8s.io/code-generator v0.24.4/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.4/go.mod h1:sWxkgcMfbYHadw0OJ0N+vIscd14/nqSIM2veCdg843o= -k8s.io/component-base v0.24.6 h1:LqSZunOeX1l6BpsMaD+iiJJSxZYl7IlVFW6qQu52ikA= -k8s.io/component-base v0.24.6/go.mod h1:YwPBIsm9c6VONDa6vBW4WjDMyvQgrLMHNoUokOkOdzU= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= -k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs= +k8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ= +k8s.io/apiextensions-apiserver v0.25.4 h1:7hu9pF+xikxQuQZ7/30z/qxIPZc2J1lFElPtr7f+B6U= +k8s.io/apiextensions-apiserver v0.25.4/go.mod h1:bkSGki5YBoZWdn5pWtNIdGvDrrsRWlmnvl9a+tAw5vQ= +k8s.io/apimachinery v0.25.4 h1:CtXsuaitMESSu339tfhVXhQrPET+EiWnIY1rcurKnAc= +k8s.io/apimachinery v0.25.4/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= +k8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8= +k8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw= +k8s.io/component-base v0.25.4 h1:n1bjg9Yt+G1C0WnIDJmg2fo6wbEU1UGMRiQSjmj7hNQ= +k8s.io/component-base v0.25.4/go.mod h1:nnZJU8OP13PJEm6/p5V2ztgX2oyteIaAGKGMYb2L2cY= +k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54 h1:hWRbsoRWt44OEBnYUd4ceLy4ofBoh+p9vauWp/I5Gdg= +k8s.io/klog/v2 v2.80.2-0.20221028030830-9ae4992afb54/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 h1:XmRqFcQlCy/lKRZ39j+RVpokYNroHPqV3mcBRfnhT5o= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8= +k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +knative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d h1:mubqXUjYfnwNg3IGWYEj2YffXYIxg44Qn9GS5vPAjck= +knative.dev/pkg v0.0.0-20230404101938-ee73c9355c9d/go.mod h1:EQk8+qkZ8fMtrDYOOb9e9xMQG29N+L54iXBCfNXRm90= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= 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= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/featuregates/controller/main.go b/featuregates/controller/main.go index 1f8d682b2b..0dcc382491 100644 --- a/featuregates/controller/main.go +++ b/featuregates/controller/main.go @@ -22,14 +22,21 @@ import ( configv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/config/v1alpha1" corev1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/core/v1alpha2" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/buildinfo" coreFeatureController "github.com/vmware-tanzu/tanzu-framework/featuregates/controller/pkg/feature" configFeatureGateController "github.com/vmware-tanzu/tanzu-framework/featuregates/controller/pkg/featuregate" + "github.com/vmware-tanzu/tanzu-framework/util/buildinfo" + "github.com/vmware-tanzu/tanzu-framework/util/webhook/certs" ) var ( - scheme = runtime.NewScheme() - setupLog = ctrl.Log.WithName("setup") + scheme = runtime.NewScheme() + setupLog = ctrl.Log.WithName("setup") + defaultWebhookConfigLabel = "tanzu.vmware.com/featuregates-webhook-managed-certs=true" + defaultWebhookServiceNamespace = "default" + defaultWebhookServiceName = "tanzu-featuregates-webhook-service" + defaultWebhookSecretNamespace = "default" + defaultWebhookSecretName = "tanzu-featuregates-webhook-server-cert" //nolint:gosec + defaultWebhookSecretVolumeMountPath = "/tmp/k8s-webhook-server/serving-certs" //nolint:gosec ) func init() { @@ -50,13 +57,29 @@ func setCipherSuiteFunc(cipherSuiteString string) (func(cfg *tls.Config), error) }, nil } +//nolint:funlen func main() { - var webhookServerPort int - var tlsMinVersion string - var tlsCipherSuites string + var ( + webhookServerPort int + tlsMinVersion string + tlsCipherSuites string + webhookConfigLabel string + webhookServiceNamespace string + webhookServiceName string + webhookSecretNamespace string + webhookSecretName string + webhookSecretVolumeMountPath string + ) + flag.IntVar(&webhookServerPort, "webhook-server-port", 9443, "The port that the webhook server serves at.") - flag.StringVar(&tlsMinVersion, "tls-min-version", "1.2", "minimum TLS version in use by the webhook server. Recommended values are \"1.2\" and \"1.3\".") + flag.StringVar(&tlsMinVersion, "tls-min-version", "1.2", "The minimum TLS version to be used by the webhook server. Recommended values are \"1.2\" and \"1.3\".") flag.StringVar(&tlsCipherSuites, "tls-cipher-suites", "", "Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be used.\n"+fmt.Sprintf("Possible values are %s.", strings.Join(cliflag.TLSCipherPossibleValues(), ", "))) + flag.StringVar(&webhookConfigLabel, "webhook-config-label", defaultWebhookConfigLabel, "The label used to select webhook configurations to update the certs for.") + flag.StringVar(&webhookServiceNamespace, "webhook-service-namespace", defaultWebhookServiceNamespace, "The namespace in which webhook service is installed.") + flag.StringVar(&webhookServiceName, "webhook-service-name", defaultWebhookServiceName, "The name of the webhook service.") + flag.StringVar(&webhookSecretNamespace, "webhook-secret-namespace", defaultWebhookSecretNamespace, "The namespace in which webhook secret is installed.") + flag.StringVar(&webhookSecretName, "webhook-secret-name", defaultWebhookSecretName, "The name of the webhook secret.") + flag.StringVar(&webhookSecretVolumeMountPath, "webhook-secret-volume-mount-path", defaultWebhookSecretVolumeMountPath, "The filesystem path to which the webhook secret is mounted.") opts := zap.Options{ Development: true, @@ -69,7 +92,7 @@ func main() { setupLog.Info("Version", "version", buildinfo.Version, "buildDate", buildinfo.Date, "sha", buildinfo.SHA) var err error - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{Scheme: scheme, MetricsBindAddress: "0", Port: webhookServerPort}) + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{Scheme: scheme, MetricsBindAddress: "0", Port: webhookServerPort, CertDir: webhookSecretVolumeMountPath}) if err != nil { setupLog.Error(err, "unable to start manager") os.Exit(1) @@ -114,6 +137,42 @@ func main() { //+kubebuilder:scaffold:builder + signalHandler := ctrl.SetupSignalHandler() + + // Start certificate manager + setupLog.Info("Starting certificate manager") + certManagerOpts := &certs.Options{ + Client: mgr.GetClient(), + Logger: ctrl.Log.WithName("featuregates-webhook-cert-manager"), + CertDir: webhookSecretVolumeMountPath, + WebhookConfigLabel: webhookConfigLabel, + RotationIntervalAnnotationKey: "tanzu.vmware.com/featuregates-webhook-rotation-interval", + NextRotationAnnotationKey: "tanzu.vmware.com/featuregates-webhook-next-rotation", + RotationCountAnnotationKey: "tanzu.vmware.com/featuregates-webhook-rotation-count", + SecretName: webhookSecretName, + SecretNamespace: webhookSecretNamespace, + ServiceName: webhookServiceName, + ServiceNamespace: webhookServiceNamespace, + } + + certManager, err := certs.New(certManagerOpts) + if err != nil { + setupLog.Error(err, "failed to create certificate manager") + os.Exit(1) + } + + // Start cert manager. + if err := certManager.Start(signalHandler); err != nil { + setupLog.Error(err, "failed to start certificate manager") + os.Exit(1) + } + + // Wait for cert dir to be ready. + if err := certManager.WaitForCertDirReady(); err != nil { + setupLog.Error(err, "certificates not ready") + os.Exit(1) + } + if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { setupLog.Error(err, "unable to set up health check") os.Exit(1) @@ -124,7 +183,7 @@ func main() { } setupLog.Info("starting manager") - if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { + if err := mgr.Start(signalHandler); err != nil { setupLog.Error(err, "problem running manager") os.Exit(1) } diff --git a/featuregates/controller/pkg/feature/feature_suite_test.go b/featuregates/controller/pkg/feature/feature_suite_test.go index 64d34556b2..b15bb51a15 100644 --- a/featuregates/controller/pkg/feature/feature_suite_test.go +++ b/featuregates/controller/pkg/feature/feature_suite_test.go @@ -1,3 +1,5 @@ +//go:build envtest + // Copyright 2023 VMware, Inc. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 diff --git a/go.mod b/go.mod index c9ed6bd72d..54fc2e7573 100644 --- a/go.mod +++ b/go.mod @@ -3,259 +3,10 @@ module github.com/vmware-tanzu/tanzu-framework go 1.18 replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ./apis/cli github.com/vmware-tanzu/tanzu-framework/apis/config => ./apis/config - github.com/vmware-tanzu/tanzu-framework/apis/run => ./apis/run github.com/vmware-tanzu/tanzu-framework/capabilities/client => ./capabilities/client - github.com/vmware-tanzu/tanzu-framework/cli/core => ./cli/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ./cli/runtime - github.com/vmware-tanzu/tanzu-framework/packageclients => ./packageclients - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common => ./pinniped-components/common - github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr => ./pkg/v1/tkr - github.com/vmware-tanzu/tanzu-framework/tkg => ./tkg - github.com/vmware-tanzu/tanzu-framework/tkr => ./tkr github.com/vmware-tanzu/tanzu-framework/util => ./util - sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.8 ) // Legacy tags before v0.1.0 was created retract [v1.4.0-pre-alpha-1, v1.4.0-pre-alpha-2] - -require ( - github.com/Jeffail/gabs v1.4.0 - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/golang-jwt/jwt v3.2.2+incompatible - github.com/google/go-cmp v0.5.9 - github.com/jeremywohl/flatten v1.0.1 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.24.1 - github.com/pkg/errors v0.9.1 - github.com/spf13/cobra v1.6.1 - github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.1 - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/test/pkg v0.0.0-20221114124829-a8c2eac58dbf - github.com/vmware-tanzu/tanzu-framework/tkg v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/tkr v0.0.0-00010101000000-000000000000 - golang.org/x/oauth2 v0.3.0 - google.golang.org/grpc v1.50.1 - google.golang.org/protobuf v1.28.1 - gopkg.in/yaml.v2 v2.4.0 - k8s.io/api v0.24.4 - k8s.io/apimachinery v0.24.4 - k8s.io/client-go v0.24.4 - sigs.k8s.io/cluster-api v1.2.8 - sigs.k8s.io/controller-runtime v0.12.3 -) - -require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.6.0 // indirect - cloud.google.com/go/storage v1.27.0 // indirect - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/Azure/azure-sdk-for-go v66.0.0+incompatible // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.23 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.18 // indirect - github.com/Azure/go-autorest/autorest/azure/auth v0.5.10 // indirect - github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect - github.com/BurntSushi/toml v1.1.0 // indirect - github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/semver/v3 v3.2.0 // indirect - github.com/Masterminds/sprig/v3 v3.2.3 // indirect - github.com/Microsoft/go-winio v0.5.2 // indirect - github.com/adrg/xdg v0.4.0 // indirect - github.com/alessio/shellescape v1.4.1 // indirect - github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d // indirect - github.com/apparentlymart/go-cidr v1.1.0 // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect - github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7 // indirect - github.com/aws/amazon-vpc-cni-k8s v1.12.0 // indirect - github.com/aws/aws-sdk-go v1.44.107 // indirect - github.com/awslabs/goformation/v4 v4.19.5 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.11.4 // indirect - github.com/coredns/caddy v1.1.1 // indirect - github.com/coredns/corefile-migration v1.0.18 // indirect - github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e // indirect - github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect - github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/docker/cli v20.10.16+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.17+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.4.0 // indirect - github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 // indirect - github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 // indirect - github.com/elazarl/go-bindata-assetfs v1.0.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/getkin/kin-openapi v0.94.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-asn1-ber/asn1-ber v1.5.1 // indirect - github.com/go-ldap/ldap/v3 v3.3.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect - github.com/go-openapi/analysis v0.19.5 // indirect - github.com/go-openapi/errors v0.19.2 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-openapi/loads v0.19.4 // indirect - github.com/go-openapi/runtime v0.19.4 // indirect - github.com/go-openapi/spec v0.19.5 // indirect - github.com/go-openapi/strfmt v0.19.5 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/go-openapi/validate v0.19.8 // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.0.0 // indirect - github.com/golang/glog v1.0.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/cel-go v0.12.5 // indirect - github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-containerregistry v0.10.0 // indirect - github.com/google/go-github/v45 v45.2.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/gosuri/uitable v0.0.4 // indirect - github.com/hashicorp/go-version v1.4.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/huandu/xstrings v1.3.3 // indirect - github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/jessevdk/go-flags v1.4.0 // indirect - github.com/jinzhu/copier v0.3.5 // 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/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b // indirect - github.com/k14s/imgpkg v0.17.0 // indirect - github.com/k14s/kbld v0.32.0 // indirect - github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 // indirect - github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.15.4 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // 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/nxadm/tail v1.4.8 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rs/xid v1.4.0 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b // indirect - github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522 // indirect - github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect - github.com/spf13/afero v1.9.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/stoewer/go-strcase v1.2.0 // indirect - github.com/subosito/gotenv v1.3.0 // indirect - github.com/valyala/fastjson v1.6.3 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec // indirect - github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect - github.com/vmware-tanzu/carvel-imgpkg v0.23.1 // indirect - github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 // indirect - github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 // indirect - github.com/vmware-tanzu/carvel-vendir v0.30.0 // indirect - github.com/vmware-tanzu/carvel-ytt v0.40.0 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/apis/config v0.0.0-20220824221239-af5a644ffef7 // indirect - github.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/cli/core v0.0.0-20220914003300-5b2ed024556a // indirect - github.com/vmware-tanzu/tanzu-framework/packageclients v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000 // indirect - github.com/vmware/govmomi v0.30.2 // indirect - github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect - go.mongodb.org/mongo-driver v1.5.1 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/api v0.102.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.66.4 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.24.4 // indirect - k8s.io/apiserver v0.24.4 // indirect - k8s.io/cluster-bootstrap v0.24.4 // indirect - k8s.io/component-base v0.24.4 // indirect - k8s.io/klog/v2 v2.80.0 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 // indirect - sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2 // indirect - sigs.k8s.io/cluster-api-provider-azure v1.6.1 // indirect - sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 // indirect - sigs.k8s.io/cluster-api/test v1.2.8 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/kind v0.15.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/go.sum b/go.sum index 30582b2b02..e69de29bb2 100644 --- a/go.sum +++ b/go.sum @@ -1,2142 +0,0 @@ -4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= -cloud.google.com/go/iam v0.6.0 h1:nsqQC88kT5Iwlm4MeNGTpfMWddp6NB/UOLFTH6m1QfQ= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/longrunning v0.1.1 h1:y50CXG4j0+qvEukslYFBCrzaXX0qpFbBzc3PchSu/LE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= -cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCqWCLp6Cifo= -github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible h1:bmmC38SlE8/E81nNADlgmVGurPWMHDX2YNXVQMrBpEE= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.23 h1:bRQWsW25/YkoxnIqXMPF94JW33qWDcrPMZ3bINaAruU= -github.com/Azure/go-autorest/autorest v0.11.23/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.10 h1:F9A3Z++TtAoFysBsNOIJILoHuYBaYvhVGsMGEqPtIS8= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.10/go.mod h1:zQXYYNX9kXzRMrJNVXWUfNy38oPMF5/2TeZ4Wylc9fE= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 h1:dMOmEJfkLKW/7JsokJqkyoYSgmR08hi9KrhjZb+JALY= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28= -github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo= -github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= -github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d h1:0xIrH2lJbraclvJT3pvTf3u2oCAL60cAqiv4qRpz4EI= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU= -github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7 h1:UpBQmQ1gKLi+i+/Dohoqk7FfuxlYQYveajqs1pk/CvA= -github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7/go.mod h1:BcllDeAFx8PtaMrPxvvuCUo7NRS2x6w+3W17WFDu0sk= -github.com/aws/amazon-vpc-cni-k8s v1.12.0 h1:WP8wHJ+UjViYkpMi2Uu5hHiPTYH3/jPC9pG3PrTmoWY= -github.com/aws/amazon-vpc-cni-k8s v1.12.0/go.mod h1:vZdHLUZf7Kj4mpqzG+szRxvCe/XMS/EAcxwMklI6NOQ= -github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= -github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.107 h1:VP7Rq3wzsOV7wrfHqjAAKRksD4We58PaoVSDPKhm8nw= -github.com/aws/aws-sdk-go v1.44.107/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/awslabs/goformation/v4 v4.19.5 h1:Y+Tzh01tWg8gf//AgGKUamaja7Wx9NPiJf1FpZu4/iU= -github.com/awslabs/goformation/v4 v4.19.5/go.mod h1:JoNpnVCBOUtEz9bFxc9sjy8uBUCLF5c4D1L7RhRTVM8= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/blizzy78/varnamelen v0.3.0/go.mod h1:hbwRdBvoBqxk34XyQ6HA0UH3G0/1TKuv5AC4eaBT0Ec= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/breml/bidichk v0.1.1/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudfoundry/bosh-utils v0.0.0-20191216173634-505d7f919144/go.mod h1:JCrKwetZGjxbfq1U139TZuXDBfdGLtjOEAfxMWKV/QM= -github.com/cloudfoundry/config-server v0.1.20/go.mod h1:Y3b/MHqyp22CcG0X1qvEHG8lujoebxjD9IAslyS/Yk0= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.11.4 h1:LjrYUZpyOhiSaU7hHrdR82/RBoxfGWSaC0VeSSMXqnk= -github.com/containerd/stargz-snapshotter/estargz v0.11.4/go.mod h1:7vRJIcImfY8bpifnMjt+HTJoQxASq7T28MYbP15/Nf0= -github.com/coredns/caddy v1.1.0/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= -github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/corefile-migration v1.0.18 h1:zs5PJm/VGZVje1ESRj6ZqyUuVsVfagExkbLU2QKV5mI= -github.com/coredns/corefile-migration v1.0.18/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e h1:4AxO89dwbgA957M8DX5AV/KsOmxDyAB1BES0INY+A/0= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= -github.com/cppforlife/go-cli-ui v0.0.0-20200506005011-4268990983cc/go.mod h1:I0qrzCmuPWYI6kAOvkllYjaW2aovclWbJ96+v+YyHb0= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f h1:yVW0v4zDXzJo1i8G9G3vtvNpyzhvtLalO34BsN/K88E= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f/go.mod h1:L18TqO77ci8i+hFtlMC4zSFz/D3O8lf84TyVU+zFF8E= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/daixiang0/gci v0.2.9/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.16+incompatible h1:aLQ8XowgKpR3/IysPj8qZQJBVQ+Qws61icFuZl6iKYs= -github.com/docker/cli v20.10.16+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 h1:aRd8M7HJVZOqn/vhOzrGcQH0lNAMkqMn+pXUYkatmcA= -github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 h1:7QPwrLT79GlD5sizHf27aoY2RTvw62mO6x7mxkScNk0= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46/go.mod h1:esf2rsHFNlZlxsqsZDojNBcnNs5REqIvRrWRHqX0vEU= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw= -github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getkin/kin-openapi v0.94.0 h1:bAxg2vxgnHHHoeefVdmGbR+oxtJlcv5HsJJa3qmAHuo= -github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= -github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-critic/go-critic v0.6.1/go.mod h1:SdNCfU0yF3UBjtaZGw6586/WocupMOJuiqgom5DsQxM= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-ldap/ldap/v3 v3.3.0 h1:lwx+SJpgOHd8tG6SumBQZXCmNX51zM8B1cfxJ5gv4tQ= -github.com/go-ldap/ldap/v3 v3.3.0/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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 v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4 h1:5I4CCSqoWzT+82bBkNIvmLc0UOsoKKQ4Fz+3VxOB7SY= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= -github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-openapi/validate v0.19.8 h1:YFzsdWIDfVuLvIOF+ZmKjVg1MbPJ1QgY9PihMwei1ys= -github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.43.0/go.mod h1:VIFlUqidx5ggxDfQagdvd9E67UjMXtTHBkBQ7sHoC5Q= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-go v0.12.5 h1:DmzaiSgoaqGCjtpPQWl26/gND+yRpim56H1jCVev6d8= -github.com/google/cel-go v0.12.5/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.10.0 h1:qd/fv2nQajGZJenaNcdaghlwSPjQ0NphN9hzArr2WWg= -github.com/google/go-containerregistry v0.10.0/go.mod h1:C7uwbB1QUAtvnknyd3ethxJRd4gtEjU/9WLXzckfI1Y= -github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= -github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= -github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= -github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= -github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= -github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= -github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hpcloud/tail v1.0.1-0.20180514194441-a1dbeea552b7/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= -github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jeremywohl/flatten v1.0.1 h1:LrsxmB3hfwJuE+ptGOijix1PIfOoKLJ3Uee/mzbgtrs= -github.com/jeremywohl/flatten v1.0.1/go.mod h1:4AmD/VxjWcI5SRB0n6szE2A6s2fsNHDLO0nAlMHgfLQ= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= -github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -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/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57 h1:CwBRArr+BWBopnUJhDjJw86rPL/jGbEjfHWKzTasSqE= -github.com/k14s/imgpkg v0.17.0 h1:l1HqYtjecqx7iYecJUvxQQYdo3WubCahHQ30lh0p9sU= -github.com/k14s/imgpkg v0.17.0/go.mod h1:xYZ7gQxYP3O35vGIXcYchDEHq0xA81FOheCp8Vlq5ko= -github.com/k14s/kbld v0.32.0 h1:zf3qCir0usz7rX6JRF97QxaZ25+13EniE7z+ll0xaZ8= -github.com/k14s/kbld v0.32.0/go.mod h1:N7Ij72ZhJ2B7kTUxavGTBT1YymIfmAeO6JKyNbtja1g= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 h1:wKSifC/VbCaQMqXYn6/gSFqle82OX4bE3KYALDU9FlU= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115/go.mod h1:mGrnmO5qnhJIaSiwMo05cvRL6Ww9ccYbTgNFcm6RHZQ= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 h1:4bcRTTSx+LKSxMWibIwzHnDNmaN1x52oEpvnjCy+8vk= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368/go.mod h1:lKGj1op99m4GtQISxoD2t+K+WO/q2NzEPKvfXFQfbCA= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.4 h1:1kn4/7MepF/CHmYub99/nNX8az0IJjfSOU/jbnTVfqQ= -github.com/klauspost/compress v1.15.4/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= -github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= -github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.1.2/go.mod h1:bnXsMr+ZTH09V5rssEI+jHAZ4z+ZdyhgO/zsy3EhK+0= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= -github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc= -github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= -github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -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 v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.5.0 h1:TRtrvv2vdQqzkwrQ1ke6vtXf7IK34RBUJafIy1wMwls= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= -github.com/onsi/gomega v1.12.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= -github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 h1:+czc/J8SlhPKLOtVLMQc+xDCFBT73ZStMsRhSsUhsSg= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -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/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.13/go.mod h1:Ul8wwdqR6kBVOCt2dipDBkE+T6vAV/iixkrKuRTN1oQ= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.10/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20210428214800-545e0d2e0bf7/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= -github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b h1:jUK33OXuZP/l6babJtnLo1qsGvq6G9so9KMflGAm4YA= -github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b/go.mod h1:8458kAagoME2+LN5//WxE71ysZ3B7r22fdgb7qVmXSY= -github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522 h1:fOCp11H0yuyAt2wqlbJtbyPzSgaxHTv8uN1pMpkG1t8= -github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522/go.mod h1:tQTYKOQgxoH3v6dEmdHiz4JG+nbxWwM5fgPQUpSZqVQ= -github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securego/gosec/v2 v2.9.1/go.mod h1:oDcDLcatOJxkCGaCaq8lua1jTnYf6Sou4wdiJ1n4iHc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil/v3 v3.21.10/go.mod h1:t75NhzCZ/dYyPQjyQmrAYP6c8+LCdFANeBMdLPCNnew= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -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 v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY= -github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= -github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= -github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= -github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1 h1:sUHDtnvcIMMcY/Pudym6DJ0kv7+uyMCAqQby0SLnQVs= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1/go.mod h1:2XNe+P0MDgya0FPEMOVZLAXku05VZhccVdDcXChhvy8= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 h1:zgWNumjhN+0CCiq1Wo4lVTmO89eOA6HuPXgv1sVhE4k= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0/go.mod h1:Hldrv7kPAD3THS1yUYZPFIaHmPE0ENO0ljzbJrpftiE= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 h1:3mSDyzhf52Y0jdvHrhJUf4Sk97CILBOkQt/WUaD8G/8= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0/go.mod h1:UW9xzccG6vjNoq2emVderTX11epILNyxtmGxFupRsHc= -github.com/vmware-tanzu/carvel-vendir v0.30.0 h1:JqElRFpSsYJQmI5Hrxl1Fx9wJZ2xeDk+TVnnSrFLFVU= -github.com/vmware-tanzu/carvel-vendir v0.30.0/go.mod h1:qFV2/3Cu584fhG2wXodoIm8KhX1wKHRFavBiRjK/Ly0= -github.com/vmware-tanzu/carvel-ytt v0.40.0 h1:WUWTtwvfqV9CN9v207oDt2xfhmuWHGwc4MMaXJAqIEE= -github.com/vmware-tanzu/carvel-ytt v0.40.0/go.mod h1:crDcKbS1GM4Q34puoVxdrajWOXrxjOxvUCwtsNV5Etc= -github.com/vmware-tanzu/tanzu-framework/test/pkg v0.0.0-20221114124829-a8c2eac58dbf h1:KL+cthxghTjH0qrj3AtN26qDWatqXrbp7a/StjcnmMU= -github.com/vmware-tanzu/tanzu-framework/test/pkg v0.0.0-20221114124829-a8c2eac58dbf/go.mod h1:WxG7I8d++BA0bcic2Ta3Rm5BHuWkGtH6rpSs0ry9uLA= -github.com/vmware/govmomi v0.30.2 h1:zPMmLTtAfBgOVsTgwKOzVVahQIOC4A2oyFQFSsn/0ag= -github.com/vmware/govmomi v0.30.2/go.mod h1:F7adsVewLNHsW/IIm7ziFURaXDaHEwcc+ym4r3INMdY= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.5.1 h1:9nOVLGDfOaZ9R0tBumx/BcuqkbFpyTCU2r/Po7A2azI= -go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= -go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0= -go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= -go4.org/intern v0.0.0-20220617035311-6925f38cc365 h1:t9hFvR102YlOqU0fQn1wgwhNvSbHGBbbJxX9JKfU3l0= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180730214132-a0f8a16cb08c/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/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-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/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= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= -inet.af/netaddr v0.0.0-20220811202034-502d2d690317 h1:U2fwK6P2EqmopP/hFLTOAjWTki0qgd4GMJn5X8wOleU= -k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= -k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.4 h1:I5Y645gJ8zWKawyr78lVfDQkZrAViSbeRXsPZWTxmXk= -k8s.io/api v0.24.4/go.mod h1:42pVfA0NRxrtJhZQOvRSyZcJihzAdU59WBtTjYcB0/M= -k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= -k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= -k8s.io/apiextensions-apiserver v0.24.4 h1:w53Pm4zu8fCt9WfiRgS2YI6LE6I4NJ5aUi78GElD3K8= -k8s.io/apiextensions-apiserver v0.24.4/go.mod h1:iDK+Xb4jsPNnRGj5jU/WqqjLvt8363M7cKixKe1C9+U= -k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.4 h1:S0Ur3J/PbivTcL43EdSdPhqCqKla2NIuneNwZcTDeGQ= -k8s.io/apimachinery v0.24.4/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= -k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= -k8s.io/apiserver v0.24.4 h1:ei+OunC83pVEiagBeZhTnRZvkclHgpzs/rrm7aSBDYs= -k8s.io/apiserver v0.24.4/go.mod h1:mAuC3pZVc0IDXLx7lUHoisBOtBa1SobfLW/CI3klXQE= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= -k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.4 h1:hIAIJZIPyaw46AkxwyR0FRfM/pRxpUNTd3ysYu9vyRg= -k8s.io/client-go v0.24.4/go.mod h1:+AxlPWw/H6f+EJhRSjIeALaJT4tbeB/8g9BNvXGPd0Y= -k8s.io/cluster-bootstrap v0.24.4 h1:ZryK73DHK4dv5yAr5081yO03rrEK2Dz9jUtymqEle9Q= -k8s.io/cluster-bootstrap v0.24.4/go.mod h1:D9SYcEo302eah8yxFoPciGy8dRnReZr7fG+waTAvj14= -k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.4/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= -k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.4 h1:WEGRp06GBYVwxp5JdiRaJ1zkdOhrqucxRv/8IrABLG0= -k8s.io/component-base v0.24.4/go.mod h1:sWxkgcMfbYHadw0OJ0N+vIscd14/nqSIM2veCdg843o= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= -k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 h1:XmRqFcQlCy/lKRZ39j+RVpokYNroHPqV3mcBRfnhT5o= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2 h1:WjTt0uyUG+FJBodnrSzb1L3mHfkIgtgMnNQQ+NJMuT8= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2/go.mod h1:ZKM3W39Pl7uPuuB6mT/dWakgy1O8OcivGRCAZqSP+Hs= -sigs.k8s.io/cluster-api-provider-azure v1.6.1 h1:GpY9YLiUqovz4gwIEg2PRYOhJ5e/AG7sTHtoxzt6K4w= -sigs.k8s.io/cluster-api-provider-azure v1.6.1/go.mod h1:wM/V5BBRq+m5KCE9h5YVtMQ3qcIOsGBb7UDD/tXufko= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 h1:D0bDtSyRIcBmuGFyW65otEh+VIz8SGioaAjYok/cK5Y= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3/go.mod h1:EIWdG6qGX1iW0U5qiMi+EDQ9gmW7pylJwKDtHOkBQ6g= -sigs.k8s.io/cluster-api/test v1.2.8 h1:kYziHLSV+KqBoQXg7STGU4ZQpClayqIyw+BTYGx71uE= -sigs.k8s.io/cluster-api/test v1.2.8/go.mod h1:55r564Dm7/eO7LH76SRE8whfg4yUnsLz5akqqej4Q+8= -sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kind v0.15.0 h1:Fskj234L4hjQlsScCgeYvCBIRt06cjLzc7+kbr1u8Tg= -sigs.k8s.io/kind v0.15.0/go.mod h1:cKTqagdRyUQmihhBOd+7p43DpOPRn9rHsUC08K1Jbsk= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/hack/check-license.sh b/hack/check-license.sh index fd1b8873b6..2e3e44a502 100755 --- a/hack/check-license.sh +++ b/hack/check-license.sh @@ -12,13 +12,12 @@ set -o pipefail verify_license() { printf "Checking License in shell scripts and Makefiles ...\n" local required_keywords=("VMware, Inc." "SPDX-License-Identifier: Apache-2.0") - local file_patterns_to_check=("*.sh" "Makefile") + local file_patterns_to_check=("*.sh" "Makefile" "*.mk") local result result=$(mktemp /tmp/tf-licence-check.XXXXXX) for ext in "${file_patterns_to_check[@]}"; do - # ignore ./vendor dir, ./pinniped dir ( the dir is cloned while building CLI) and node_modules dir - find . -type d \( -path ./vendor -o -path ./pinniped -o -name node_modules \) -prune -o -name "$ext" -type f -print0 | + find . -type d -o -name "$ext" -type f -print0 | while IFS= read -r -d '' path; do for rword in "${required_keywords[@]}"; do if ! grep -q "$rword" "$path"; then diff --git a/hack/check-mdlint.sh b/hack/check-mdlint.sh index 78b08b15fd..51a0ad04f3 100755 --- a/hack/check-mdlint.sh +++ b/hack/check-mdlint.sh @@ -18,9 +18,4 @@ cd "$(dirname "${BASH_SOURCE[0]}")/.." docker run --rm -v "$(pwd)":/build \ gcr.io/cluster-api-provider-vsphere/extra/mdlint:0.23.2 /md/lint \ -i **/CHANGELOG.md \ - -i tkg/web/node_modules \ - -i docs/cli/commands \ - -i test/cli/mock \ - -i providers/ytt/vendir \ - -i providers/provider-bundle/providers/ytt/vendir \ - -i pinniped . + -i docs/cli/commands . diff --git a/hack/clustergen/ci-validate-clustergen.sh b/hack/clustergen/ci-validate-clustergen.sh deleted file mode 100755 index 79d1ba1e8d..0000000000 --- a/hack/clustergen/ci-validate-clustergen.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Usage: -# ci-validate-clustergen.sh branch_name target-branch-name - -SCRIPT_DIR="$(cd -P "$(dirname "$0")" && pwd)" - -GOOS=$(go env GOOS) -GOARCH=$(go env GOARCH) -CLI_REPO=${CLI_REPO:-${PWD}/../..} -GIT_BRANCH_PROVIDERS=$1 -GIT_BRANCH_PROVIDERS_BASE=$2 - -cd providers - -# TODO: As we are using providers as library, clustergen should not rely on building binary -# each time with new providers, instead we should write some go testing tool which runs -# clustergen tests via the tkg cli library interface -make generate-testcases - -git log --pretty=oneline -5 -make generate-bindata -make CLUSTERGEN_CC_OUTPUT_DIR=newcc CLUSTERGEN_OUTPUT_DIR=new GOOS=${GOOS} GOARCH=${GOARCH} CLI_REPO=${CLI_REPO} cluster-generation-tests -git checkout . - -echo git checkout -B old origin/${GIT_BRANCH_PROVIDERS_BASE} -git checkout -B old origin/${GIT_BRANCH_PROVIDERS_BASE} -git log --pretty=oneline -5 -make generate-bindata -make CLUSTERGEN_CC_OUTPUT_DIR=oldcc CLUSTERGEN_OUTPUT_DIR=old GOOS=${GOOS} GOARCH=${GOARCH} CLI_REPO=${CLI_REPO} cluster-generation-tests -git checkout . -git checkout - - -pushd tests/clustergen/testdata - -diff -r -U15 old new > clustergen.diff.txt -cat clustergen.diff.txt -echo "no diff" > clustergen.html -docker run -i --rm -v $PWD:$PWD -w $PWD gcr.io/eminent-nation-87317/diff2html diff2html -i file -F clustergen.html -- clustergen.diff.txt - -diff -r -U10 oldcc/cclass newcc/cclass > clustergen_cc.diff.txt - -pushd newcc -diff -r -U10 legacy cclass > ../clustergen_noncc_vs_cc.diff.txt -popd - -popd - -exit 0 diff --git a/hack/clustergen/cluster-check.sh b/hack/clustergen/cluster-check.sh deleted file mode 100755 index f2b44f9dcb..0000000000 --- a/hack/clustergen/cluster-check.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Usage: -# clustergen-check.sh base-commit current-commit - -if ! git diff-index --quiet HEAD --; then - echo >&2 "Please commit or stash uncommitted changes before running again." - exit 1 -fi - -BASE_DIR="$(dirname "$0")" - -GOOS=$(go env GOOS) -GOARCH=$(go env GOARCH) -CLI_REPO=${CLI_REPO:-${PWD}/../..} -# Note: if GIT_BRANCH_PROVIDERS_BASE is not set, default to HEAD^, which will not -# produce the behavior unless the provider changes is consolidate into a single -# commit at HEAD -GIT_BRANCH_PROVIDERS_BASE=${1:-HEAD^} -GIT_BRANCH_PROVIDERS=${2:-HEAD} -LAST_BASE_BRANCH_COMMIT_FILE="tests/clustergen/testdata/base_branch_commit" - -BASE_BRANCH_COMMIT=$(git rev-parse ${GIT_BRANCH_PROVIDERS_BASE}) -LAST_BASE_BRANCH_COMMIT=$(cat ${LAST_BASE_BRANCH_COMMIT_FILE}) - -CURR_COMMIT=$(git rev-parse ${GIT_BRANCH_PROVIDERS}) - -echo "=== Diffing clustergen output between: ${BASE_BRANCH_COMMIT} (${GIT_BRANCH_PROVIDERS_BASE})" -echo " and: ${CURR_COMMIT} (${GIT_BRANCH_PROVIDERS})" - - -# TODO: As we are using providers as library, clustergen should not rely on building binary -# each time with new providers, instead we should write some go testing tool which runs -# clustergen tests via the tkg cli library interface -make generate-testcases - -# TODO: Handle current commit that is not HEAD -rm -rf tests/clustergen/testdata/new || true -git log --pretty=oneline -5 | cat -make CLUSTERGEN_CC_OUTPUT_DIR=newcc CLUSTERGEN_OUTPUT_DIR=new GOOS=${GOOS} GOARCH=${GOARCH} CLI_REPO=${CLI_REPO} cluster-generation-tests - -if [ "${LAST_BASE_BRANCH_COMMIT}" != "${BASE_BRANCH_COMMIT}" ]; then - echo "Base branch differs, regenerating output for ${GIT_BRANCH_PROVIDERS_BASE}...." - echo -n "${BASE_BRANCH_COMMIT}" > "${LAST_BASE_BRANCH_COMMIT_FILE}" - rm -rf tests/clustergen/testdata/old || true - git checkout -B clustergen_test_base ${GIT_BRANCH_PROVIDERS_BASE} - git log --pretty=oneline -5 | cat - make CLUSTERGEN_CC_OUTPUT_DIR=oldcc CLUSTERGEN_OUTPUT_DIR=old GOOS=${GOOS} GOARCH=${GOARCH} CLI_REPO=${CLI_REPO} cluster-generation-tests - git checkout . - git checkout - -else - echo "Base branch commit for ${GIT_BRANCH_PROVIDERS_BASE} unchanged, skipping generation of base set...." -fi - -pushd tests/clustergen/testdata -mkdir output || true -rm -f output/* -diff -r -U15 oldcc/cclass newcc/cclass > output/clustergen_cc.diff.txt -diff -r -U15 old new > output/clustergen.diff.txt -cat output/clustergen.diff.txt -docker run -i --rm -v $PWD:$PWD -w $PWD gcr.io/eminent-nation-87317/tkg-go-ci diff2html -i file -F output/clustergen.html -- output/clustergen.diff.txt -popd - -exit 0 diff --git a/hack/clustergen/rebuild-cli.sh b/hack/clustergen/rebuild-cli.sh deleted file mode 100755 index 3be82a6d0f..0000000000 --- a/hack/clustergen/rebuild-cli.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Usage: -# rebuild-cli.sh [provider-repo-path] - -GOOS=$(go env GOOS) -GOARCH=$(go env GOARCH) -CLI_REPO=${CLI_REPO:-${PWD}/../..} - -pushd ${CLI_REPO} - -#go mod edit -replace github.com/vmware-tanzu/tkg-providers=$1 -#cat go.mod -# -# Build tkg cli -mkdir -p ${CLI_REPO}/tkg/web/dist # Add web/dist directory if missing for building cli -make tkg-cli - -# revert updated go.mod file of tkg-cli repo which was updated before building cli -#go mod edit -replace github.com/vmware-tanzu/tkg-providers=./providers - -popd diff --git a/hack/embed-pinniped-binary.sh b/hack/embed-pinniped-binary.sh deleted file mode 100755 index edcb7a4b52..0000000000 --- a/hack/embed-pinniped-binary.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# A helper script to be invoked prior to building plugins for a particular target (os/arch) -# Specifically affects the correct building of the pinniped-auth plugin since it needs to embed the -# pinniped client built for the same os/arch that it is built for. -# TODO : remove when we no longer need to embed said binary and can directly link to the pinniped -# repo code. - -set -o errexit -set -o nounset -set -o pipefail -set -o xtrace - -GO=$1 -shift -GOOS=$1 -shift -GOARCH=$1 -shift - -while (( "$#" )); do - pinniped_version="$1" - pinniped_binary="cmd/cli/plugin/pinniped-auth/asset/pinniped-${pinniped_version}" - echo "embed-pinniped-binary.sh: building pinniped version '$pinniped_version' to '$pinniped_binary'" - - pushd pinniped >/dev/null - git checkout -- . - git checkout "$pinniped_version" - go get -u golang.org/x/sys - GOARCH=${GOARCH} GOOS=${GOOS} ${GO} build -o "../${pinniped_binary}" ./cmd/pinniped - popd >/dev/null - - git update-index --assume-unchanged "$pinniped_binary" - - shift -done diff --git a/hack/fetch-install-tf.sh b/hack/fetch-install-tf.sh deleted file mode 100755 index c34238427e..0000000000 --- a/hack/fetch-install-tf.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Inspired by - https://github.com/vmware-tanzu/community-edition/blob/main/hack/install.sh -# Script to install tanzu framework -# Usage: hack/fetch-install-tf.sh - -set -o errexit -set -o nounset -set -o pipefail -set -o xtrace - -#Identify the OS specific binary to be downloaded -OS=$(uname -s | tr '[:upper:]' '[:lower:]') -ARCH="amd64" -BASE_CLI_PACKAGE_NAME="tanzu-cli" -COMPRESSION="tar.gz" -BASE_CLI="tanzu-core" - -case "${OS}" in - linux|darwin) - BINARY="${BASE_CLI_PACKAGE_NAME}-${OS}-${ARCH}.${COMPRESSION}" - ;; - *) - echo "${OS} is unsupported" - exit 1 - ;; -esac - -#Validate if required tools are installed -TOOLS=("curl" "jq") -MISSING_TOOLS=() -for tool in "${TOOLS[@]}";do - if ! type "${tool}" > /dev/null; then - MISSING_TOOLS+=("${tool}") - fi -done -if [ ${#MISSING_TOOLS[@]} -gt 0 ]; then - echo "Missing installation of required tool(s)- ${MISSING_TOOLS[*]}" - exit 1 -fi - - -GH_REPO_ORG="vmware-tanzu" -GH_REPO="tanzu-framework" -GH_API="https://api.github.com" -GH_REPO_API_BASE="${GH_API}/repos/${GH_REPO_ORG}/${GH_REPO}" -GH_TAGS="${GH_REPO_API_BASE}/releases/latest" -AUTH="" -# Validate GitHub access token -if [ -z "${GITHUB_TOKEN:-}" ]; then - echo "Warning: No GITHUB_TOKEN variable defined - requests to the GitHub API may be rate limited" -else - AUTH="Authorization: token ${GITHUB_TOKEN}" - curl -o /dev/null -sLH "${AUTH}" ${GH_REPO_API_BASE} || { echo "Error: Unauthenticated token or network issue!"; exit 1; } -fi - - -echo "Fetching information about the latest Tanzu Framework release." -LATEST_RELEASE_RESPONSE=$(curl -sLH "${AUTH}" ${GH_TAGS} ) -BIN_DOWNLOAD_URL=$(echo "${LATEST_RELEASE_RESPONSE}" | jq -r ".assets[].browser_download_url" | grep "${BINARY}") -LATEST_VERSION=$(echo "${LATEST_RELEASE_RESPONSE}" | jq -r ".tag_name") - -echo "The latest version of Tanzu Framework CLI '${LATEST_VERSION}' will be downloaded and installed." - -#Generate temp directory where cli will be downloaded -TF_INSTALL_PATH=$(mktemp -d 2>/dev/null || mktemp -d -t 'tf-install-tmp') - -function cleanup { - echo "Cleanup temporary binary download path." - rm -rf "${TF_INSTALL_PATH}" -} -trap cleanup EXIT - -echo "Downloading '${BINARY}' from the latest Tanzu Framework Release." -curl -sLH "${AUTH}" "${BIN_DOWNLOAD_URL}" > "${TF_INSTALL_PATH}/${BINARY}" -mkdir "${TF_INSTALL_PATH}/${LATEST_VERSION}" -tar -zxf "${TF_INSTALL_PATH}/${BINARY}" -C "${TF_INSTALL_PATH}" "${LATEST_VERSION}/${BASE_CLI}-${OS}_${ARCH}" - -GH_RAW_CONTENT="https://raw.githubusercontent.com" -INSTALL_SCRIPT_URL="${GH_RAW_CONTENT}/${GH_REPO_ORG}/${GH_REPO}/${LATEST_VERSION}/hack/install.sh" -curl -sLH "${AUTH}" "${INSTALL_SCRIPT_URL}" | bash -se - "${TF_INSTALL_PATH}/${LATEST_VERSION}/${BASE_CLI}-${OS}_${ARCH}" -INSTALL_STATUS=$? -if [ "${INSTALL_STATUS}" -eq 0 ]; then - echo "Successfully installed Tanzu CLI. You can verify the same by trying to check the version using 'tanzu version' command." -else - echo "Failed to install the downloaded Tanzu CLI." - exit 1 -fi diff --git a/hack/gen-publish-images-fromtar.sh b/hack/gen-publish-images-fromtar.sh deleted file mode 100755 index c12d789793..0000000000 --- a/hack/gen-publish-images-fromtar.sh +++ /dev/null @@ -1,164 +0,0 @@ -#!/bin/bash -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -eo pipefail - -TANZU_BOM_DIR=${HOME}/.config/tanzu/tkg/bom -INSTALL_INSTRUCTIONS='See https://github.com/mikefarah/yq#install for installation instructions' -TKG_CUSTOM_IMAGE_REPOSITORY=${TKG_CUSTOM_IMAGE_REPOSITORY:-''} -TKG_IMAGE_REPO=${TKG_IMAGE_REPO:-''} -TKG_BOM_IMAGE_TAG=${TKG_BOM_IMAGE_TAG:-''} - - -echodual() { - echo "$@" 1>&2 - echo "#" "$@" -} - -if [ -z "$TKG_CUSTOM_IMAGE_REPOSITORY" ]; then - echo "TKG_CUSTOM_IMAGE_REPOSITORY variable is required but is not defined" >&2 - exit 1 -fi - -if [ -z "$TKG_IMAGE_REPO" ]; then - echo "TKG_IMAGE_REPO variable is required but is not defined" >&2 - exit 2 -fi - -if ! [ -x "$(command -v imgpkg)" ]; then - echo 'Error: imgpkg is not installed.' >&2 - exit 3 -fi - -if ! [ -x "$(command -v yq)" ]; then - echo 'Error: yq is not installed.' >&2 - echo "${INSTALL_INSTRUCTIONS}" >&2 - exit 3 -fi - -function imgpkg_copy() { - src=$1 - dst=$2 - echo "" - echo "imgpkg copy --tar $src.tar --to-repo $dst" -} - -if [ -n "$TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE" ]; then - function imgpkg_copy() { - src=$1 - dst=$2 - echo "" - echo "imgpkg copy --tar $src.tar --to-repo $dst --registry-ca-cert-path /tmp/cacrtbase64d.crt" - } -fi - -echo "set -eo pipefail" -echo 'if [ -n "$TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE" ]; then - echo $TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE > /tmp/cacrtbase64 - base64 -d /tmp/cacrtbase64 > /tmp/cacrtbase64d.crt -fi' -echodual "Note that yq must be version above or equal to version 4.9.2 and below version 5." - -actualImageRepository="$TKG_IMAGE_REPO" - -# Iterate through TKG BoM file to create the complete Image name -# and then pull, retag and push image to custom registry. -list=$(imgpkg tag list -i "${actualImageRepository}"/tkg-bom) -for imageTag in ${list}; do - tanzucliversion=$(tanzu version | head -n 1 | cut -c10-15) - if [[ ${imageTag} == ${tanzucliversion}* ]] || [[ ${imageTag} == ${TKG_BOM_IMAGE_TAG} ]]; then - TKG_BOM_FILE="tkg-bom-${imageTag//_/+}.yaml" - imgpkg pull --image "${actualImageRepository}/tkg-bom:${imageTag}" --output "tmp" > /dev/null 2>&1 - echodual "Processing TKG BOM file ${TKG_BOM_FILE}" - - actualTKGImage=${TKG_CUSTOM_IMAGE_REPOSITORY}/tkg-bom - customTKGImage=tkg-bom-${imageTag} - imgpkg_copy $customTKGImage $actualTKGImage - - # Get components in the tkg-bom. - # Remove the leading '[' and trailing ']' in the output of yq. - components=(`yq e '.components | keys | .. style="flow"' "tmp/$TKG_BOM_FILE" | sed 's/^.//;s/.$//'`) - for comp in "${components[@]}" - do - # remove: leading and trailing whitespace, and trailing comma - comp=`echo $comp | sed -e 's/^[[:space:]]*//' | sed 's/,*$//g'` - get_comp_images="yq e '.components[\"${comp}\"][] | select(has(\"images\"))|.images[] | .imagePath + \":\" + .tag' "\"tmp/\"$TKG_BOM_FILE"" - - eval $get_comp_images | while read -r image; do - image2=$(echo "$image" | tr ':' '-' | tr '/' '-') - image3=$(echo "$image" | cut -f1 -d":") - actualImage=${TKG_CUSTOM_IMAGE_REPOSITORY}/${image3} - customImage=${image2} - imgpkg_copy $customImage $actualImage - done - done - - rm -rf tmp - echodual "Finished processing TKG BOM file ${TKG_BOM_FILE}" - echo "" - fi -done - -# Iterate through TKR BoM file to create the complete Image name -# and then pull, retag and push image to custom registry. -# DOWNLOAD_TKRS is a space separated list of TKR names, as stored in registry -# when set, the tkr-bom will be ignored. -list=${DOWNLOAD_TKRS:-$(imgpkg tag list -i ${actualImageRepository}/tkr-bom)} -for imageTag in ${list}; do - if [[ ${imageTag} == v* ]]; then - TKR_BOM_FILE="tkr-bom-${imageTag//_/+}.yaml" - echodual "Processing TKR BOM file ${TKR_BOM_FILE}" - - actualTKRImage=${TKG_CUSTOM_IMAGE_REPOSITORY}/tkr-bom - customTKRImage=tkr-bom-${imageTag} - imgpkg_copy $customTKRImage $actualTKRImage - imgpkg pull --image ${actualImageRepository}/tkr-bom:${imageTag} --output "tmp" > /dev/null 2>&1 - - # Get components in the tkr-bom. - # Remove the leading '[' and trailing ']' in the output of yq. - components=(`yq e '.components | keys | .. style="flow"' "tmp/$TKR_BOM_FILE" | sed 's/^.//;s/.$//'`) - for comp in "${components[@]}" - do - # remove: leading and trailing whitespace, and trailing comma - comp=`echo $comp | sed -e 's/^[[:space:]]*//' | sed 's/,*$//g'` - get_comp_images="yq e '.components[\"${comp}\"][] | select(has(\"images\"))|.images[] | .imagePath + \":\" + .tag' "\"tmp/\"$TKR_BOM_FILE"" - - eval $get_comp_images | while read -r image; do - image2=$(echo "$image" | cut -f1 -d":") - actualImage=${TKG_CUSTOM_IMAGE_REPOSITORY}/${image2} - image3=$(echo "$image" | tr ':' '-' | tr '/' '-') - customImage=${image3} - imgpkg_copy $customImage $actualImage - done - done - - rm -rf tmp - echodual "Finished processing TKR BOM file ${TKR_BOM_FILE}" - echo "" - fi -done - -list=$(imgpkg tag list -i ${actualImageRepository}/tkr-compatibility) -for imageTag in ${list}; do - if [[ ${imageTag} == v* ]]; then - echodual "Processing TKR compatibility image" - actualImage=${TKG_CUSTOM_IMAGE_REPOSITORY}/tkr-compatibility - customImage=tkr-compatibility-${imageTag} - imgpkg_copy $customImage $actualImage - echo "" - echodual "Finished processing TKR compatibility image" - fi -done - -list=$(imgpkg tag list -i ${actualImageRepository}/tkg-compatibility) -for imageTag in ${list}; do - if [[ ${imageTag} == v* ]]; then - echodual "Processing TKG compatibility image" - actualImage=${TKG_CUSTOM_IMAGE_REPOSITORY}/tkg-compatibility - customImage=tkg-compatibility-${imageTag} - imgpkg_copy $customImage $actualImage - echo "" - echodual "Finished processing TKG compatibility image" - fi -done diff --git a/hack/gen-publish-images-totar.sh b/hack/gen-publish-images-totar.sh deleted file mode 100755 index 99506ab46a..0000000000 --- a/hack/gen-publish-images-totar.sh +++ /dev/null @@ -1,152 +0,0 @@ -#!/bin/bash -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -TANZU_BOM_DIR=${HOME}/.config/tanzu/tkg/bom -INSTALL_INSTRUCTIONS='See https://github.com/mikefarah/yq#install for installation instructions' -TKG_IMAGE_REPO=${TKG_IMAGE_REPO:-''} -TKG_BOM_IMAGE_TAG=${TKG_BOM_IMAGE_TAG:-''} - - -echodual() { - echo "$@" 1>&2 - echo "#" "$@" -} - -if [ -z "$TKG_IMAGE_REPO" ]; then - echo "TKG_IMAGE_REPO variable is required but is not defined" >&2 - exit 2 -fi - -if ! [ -x "$(command -v imgpkg)" ]; then - echo 'Error: imgpkg is not installed.' >&2 - exit 3 -fi - -if ! [ -x "$(command -v yq)" ]; then - echo 'Error: yq is not installed.' >&2 - echo "${INSTALL_INSTRUCTIONS}" >&2 - exit 3 -fi - -function imgpkg_copy() { - flags=$1 - src=$2 - dst=$3 - echo "" - echo "imgpkg copy $flags $src --to-tar $dst.tar" -} - -echo "set -euo pipefail" -echodual "Note that yq must be version above or equal to version 4.9.2 and below version 5." - -actualImageRepository="$TKG_IMAGE_REPO" - -# Iterate through TKG BoM file to create the complete Image name -# and then pull, retag and push image to custom registry. -list=$(imgpkg tag list -i "${actualImageRepository}"/tkg-bom) -for imageTag in ${list}; do - tanzucliversion=$(tanzu version | head -n 1 | cut -c10-15) - if [[ ${imageTag} == ${tanzucliversion}* ]] || [[ ${imageTag} == ${TKG_BOM_IMAGE_TAG} ]]; then - TKG_BOM_FILE="tkg-bom-${imageTag//_/+}.yaml" - imgpkg pull --image "${actualImageRepository}/tkg-bom:${imageTag}" --output "tmp" > /dev/null 2>&1 - echodual "Processing TKG BOM file ${TKG_BOM_FILE}" - - actualTKGImage=${actualImageRepository}/tkg-bom:${imageTag} - customTKGImage=tkg-bom-${imageTag} - imgpkg_copy "-i" $actualTKGImage $customTKGImage - - # Get components in the tkg-bom. - # Remove the leading '[' and trailing ']' in the output of yq. - components=(`yq e '.components | keys | .. style="flow"' "tmp/$TKG_BOM_FILE" | sed 's/^.//;s/.$//'`) - for comp in "${components[@]}" - do - # remove: leading and trailing whitespace, and trailing comma - comp=`echo $comp | sed -e 's/^[[:space:]]*//' | sed 's/,*$//g'` - get_comp_images="yq e '.components[\"${comp}\"][] | select(has(\"images\"))|.images[] | .imagePath + \":\" + .tag' "\"tmp/\"$TKG_BOM_FILE"" - - flags="-i" - if [ $comp = "tkg-standard-packages" ] || [ $comp = "standalone-plugins-package" ] || [ $comp = "tanzu-framework-management-packages" ]; then - flags="-b" - fi - eval $get_comp_images | while read -r image; do - actualImage=${actualImageRepository}/${image} - image2=$(echo "$image" | tr ':' '-' | tr '/' '-') - customImage=${image2} - imgpkg_copy $flags $actualImage $customImage - done - done - - rm -rf tmp - echodual "Finished processing TKG BOM file ${TKG_BOM_FILE}" - echo "" - fi -done - -# Iterate through TKR BoM file to create the complete Image name -# and then pull, retag and push image to custom registry. -# DOWNLOAD_TKRS is a space separated list of TKR names, as stored in registry -# when set, the tkr-bom will be ignored. -list=${DOWNLOAD_TKRS:-$(imgpkg tag list -i ${actualImageRepository}/tkr-bom)} -for imageTag in ${list}; do - if [[ ${imageTag} == v* ]]; then - TKR_BOM_FILE="tkr-bom-${imageTag//_/+}.yaml" - echodual "Processing TKR BOM file ${TKR_BOM_FILE}" - - actualTKRImage=${actualImageRepository}/tkr-bom:${imageTag} - customTKRImage=tkr-bom-${imageTag} - imgpkg_copy "-i" $actualTKRImage $customTKRImage - imgpkg pull --image ${actualImageRepository}/tkr-bom:${imageTag} --output "tmp" > /dev/null 2>&1 - - # Get components in the tkr-bom. - # Remove the leading '[' and trailing ']' in the output of yq. - components=(`yq e '.components | keys | .. style="flow"' "tmp/$TKR_BOM_FILE" | sed 's/^.//;s/.$//'`) - for comp in "${components[@]}" - do - # remove: leading and trailing whitespace, and trailing comma - comp=`echo $comp | sed -e 's/^[[:space:]]*//' | sed 's/,*$//g'` - get_comp_images="yq e '.components[\"${comp}\"][] | select(has(\"images\"))|.images[] | .imagePath + \":\" + .tag' "\"tmp/\"$TKR_BOM_FILE"" - - flags="-i" - if [ "$comp" = "tkg-core-packages" ] || [ "$comp" = "capabilities-package" ] || [ "$comp" = "tkg-storageclass-package" ]; then - flags="-b" - fi - eval $get_comp_images | while read -r image; do - actualImage=${actualImageRepository}/${image} - image2=$(echo "$image" | tr ':' '-' | tr '/' '-') - customImage=${image2} - imgpkg_copy $flags $actualImage $customImage - done - done - - rm -rf tmp - echodual "Finished processing TKR BOM file ${TKR_BOM_FILE}" - echo "" - fi -done - -list=$(imgpkg tag list -i ${actualImageRepository}/tkr-compatibility) -for imageTag in ${list}; do - if [[ ${imageTag} == v* ]]; then - echodual "Processing TKR compatibility image" - actualImage=${actualImageRepository}/tkr-compatibility:${imageTag} - customImage=tkr-compatibility-${imageTag} - imgpkg_copy "-i" $actualImage $customImage - echo "" - echodual "Finished processing TKR compatibility image" - fi -done - -list=$(imgpkg tag list -i ${actualImageRepository}/tkg-compatibility) -for imageTag in ${list}; do - if [[ ${imageTag} == v* ]]; then - echodual "Processing TKG compatibility image" - actualImage=${actualImageRepository}/tkg-compatibility:${imageTag} - customImage=tkg-compatibility-${imageTag} - imgpkg_copy "-i" $actualImage $customImage - echo "" - echodual "Finished processing TKG compatibility image" - fi -done diff --git a/hack/gen-publish-images.sh b/hack/gen-publish-images.sh deleted file mode 100755 index e67e9e1b4a..0000000000 --- a/hack/gen-publish-images.sh +++ /dev/null @@ -1,176 +0,0 @@ -#!/bin/bash -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -INSTALL_INSTRUCTIONS='See https://github.com/mikefarah/yq#install for installation instructions' -TKG_CUSTOM_IMAGE_REPOSITORY=${TKG_CUSTOM_IMAGE_REPOSITORY:-''} -TKG_IMAGE_REPO=${TKG_IMAGE_REPO:-''} -TKG_CUSTOM_COMPATIBILITY_IMAGE_PATH=${TKG_CUSTOM_COMPATIBILITY_IMAGE_PATH:-''} -TKG_BOM_IMAGE_TAG=${TKG_BOM_IMAGE_TAG:-''} - -echodual() { - echo "$@" 1>&2 - echo "#" "$@" -} - -if [ -z "$TKG_CUSTOM_IMAGE_REPOSITORY" ]; then - echo "TKG_CUSTOM_IMAGE_REPOSITORY variable is required but is not defined" >&2 - exit 1 -fi - -if [ -z "$TKG_IMAGE_REPO" ]; then - echo "TKG_IMAGE_REPO variable is required but is not defined" >&2 - exit 2 -fi - -if ! [ -x "$(command -v imgpkg)" ]; then - echo 'Error: imgpkg is not installed.' >&2 - exit 3 -fi - -if ! [ -x "$(command -v yq)" ]; then - echo 'Error: yq is not installed.' >&2 - echo "${INSTALL_INSTRUCTIONS}" >&2 - exit 3 -fi - -function imgpkg_copy() { - flags=$1 - src=$2 - dst=$3 - echo "" - echo "imgpkg copy $flags $src --to-repo $dst" -} - -if [ -n "$TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE" ]; then - echo $TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE > /tmp/cacrtbase64 - base64 -d /tmp/cacrtbase64 > /tmp/cacrtbase64d.crt - function imgpkg_copy() { - flags=$1 - src=$2 - dst=$3 - echo "" - echo "imgpkg copy $flags $src --to-repo $dst --registry-ca-cert-path /tmp/cacrtbase64d.crt" - } -fi - -echo "set -euo pipefail" -echodual "Note that yq must be version above or equal to version 4.9.2 and below version 5." - -actualImageRepository="$TKG_IMAGE_REPO" - -# Iterate through TKG BoM file to create the complete Image name -# and then pull, retag and push image to custom registry. -list=$(imgpkg tag list -i "${actualImageRepository}"/tkg-bom) -for imageTag in ${list}; do - tanzucliversion=$(tanzu version | head -n 1 | cut -c10-15) - if [[ ${imageTag} == ${tanzucliversion}* ]] || [[ ${imageTag} == ${TKG_BOM_IMAGE_TAG} ]]; then - TKG_BOM_FILE="tkg-bom-${imageTag//_/+}.yaml" - imgpkg pull --image "${actualImageRepository}/tkg-bom:${imageTag}" --output "tmp" > /dev/null 2>&1 - echodual "Processing TKG BOM file ${TKG_BOM_FILE}" - - actualTKGImage=${actualImageRepository}/tkg-bom:${imageTag} - customTKGImage=${TKG_CUSTOM_IMAGE_REPOSITORY}/tkg-bom - imgpkg_copy "-i" $actualTKGImage $customTKGImage - - # Get components in the tkg-bom. - # Remove the leading '[' and trailing ']' in the output of yq. - components=(`yq e '.components | keys | .. style="flow"' "tmp/$TKG_BOM_FILE" | sed 's/^.//;s/.$//'`) - for comp in "${components[@]}" - do - # remove: leading and trailing whitespace, and trailing comma - comp=`echo $comp | sed -e 's/^[[:space:]]*//' | sed 's/,*$//g'` - get_comp_images="yq e '.components[\"${comp}\"][] | select(has(\"images\"))|.images[] | .imagePath + \":\" + .tag' "\"tmp/\"$TKG_BOM_FILE"" - - flags="-i" - if [ $comp = "tkg-standard-packages" ] || [ $comp = "standalone-plugins-package" ] || [ $comp = "tanzu-framework-management-packages" ]; then - flags="-b" - fi - eval $get_comp_images | while read -r image; do - actualImage=${actualImageRepository}/${image} - image2=$(echo "$image" | cut -f1 -d":") - customImage=$TKG_CUSTOM_IMAGE_REPOSITORY/${image2} - imgpkg_copy $flags $actualImage $customImage - done - done - - rm -rf tmp - echodual "Finished processing TKG BOM file ${TKG_BOM_FILE}" - echo "" - fi -done - -# Iterate through TKR BoM file to create the complete Image name -# and then pull, retag and push image to custom registry. -# DOWNLOAD_TKRS is a space separated list of TKR names, as stored in registry -# when set, the tkr-bom will be ignored. -list=${DOWNLOAD_TKRS:-$(imgpkg tag list -i ${actualImageRepository}/tkr-bom)} -for imageTag in ${list}; do - if [[ ${imageTag} == v* ]]; then - TKR_BOM_FILE="tkr-bom-${imageTag//_/+}.yaml" - echodual "Processing TKR BOM file ${TKR_BOM_FILE}" - - actualTKRImage=${actualImageRepository}/tkr-bom:${imageTag} - customTKRImage=${TKG_CUSTOM_IMAGE_REPOSITORY}/tkr-bom - imgpkg_copy "-i" $actualTKRImage $customTKRImage - imgpkg pull --image ${actualImageRepository}/tkr-bom:${imageTag} --output "tmp" > /dev/null 2>&1 - - # Get components in the tkr-bom. - # Remove the leading '[' and trailing ']' in the output of yq. - components=(`yq e '.components | keys | .. style="flow"' "tmp/$TKR_BOM_FILE" | sed 's/^.//;s/.$//'`) - for comp in "${components[@]}" - do - # remove: leading and trailing whitespace, and trailing comma - comp=`echo $comp | sed -e 's/^[[:space:]]*//' | sed 's/,*$//g'` - get_comp_images="yq e '.components[\"${comp}\"][] | select(has(\"images\"))|.images[] | .imagePath + \":\" + .tag' "\"tmp/\"$TKR_BOM_FILE"" - - flags="-i" - if [ $comp = "tkg-core-packages" ]; then - flags="-b" - fi - eval $get_comp_images | while read -r image; do - actualImage=${actualImageRepository}/${image} - image2=$(echo "$image" | cut -f1 -d":") - customImage=$TKG_CUSTOM_IMAGE_REPOSITORY/${image2} - imgpkg_copy $flags $actualImage $customImage - done - done - - rm -rf tmp - echodual "Finished processing TKR BOM file ${TKR_BOM_FILE}" - echo "" - fi -done - -list=$(imgpkg tag list -i ${actualImageRepository}/tkr-compatibility) -for imageTag in ${list}; do - if [[ ${imageTag} == v* ]]; then - echodual "Processing TKR compatibility image" - actualImage=${actualImageRepository}/tkr-compatibility:${imageTag} - customImage=$TKG_CUSTOM_IMAGE_REPOSITORY/tkr-compatibility - imgpkg_copy "-i" $actualImage $customImage - echo "" - echodual "Finished processing TKR compatibility image" - fi -done - -tkg_compatibility_endpoint=${actualImageRepository}/tkg-compatibility -if ! [ -z "$TKG_CUSTOM_COMPATIBILITY_IMAGE_PATH" ]; then - # it is assumed that the TKG_CUSTOM_COMPATIBILITY_IMAGE_PATH variable would have the '/tkg-compatibility' suffix - # TKG_CUSTOM_COMPATIBILITY_IMAGE_PATH is also used by 'tanzu plugin install' commands and it requires the '/tkg-compatibility' suffix - tkg_compatibility_endpoint=${actualImageRepository}/${TKG_CUSTOM_COMPATIBILITY_IMAGE_PATH} -fi - -list=$(imgpkg tag list -i ${tkg_compatibility_endpoint}) -for imageTag in ${list}; do - if [[ ${imageTag} == v* ]]; then - echodual "Processing TKG compatibility image" - actualImage=${tkg_compatibility_endpoint}:${imageTag} - customImage=$TKG_CUSTOM_IMAGE_REPOSITORY/tkg-compatibility - imgpkg_copy "-i" $actualImage $customImage - echo "" - echodual "Finished processing TKG compatibility image" - fi -done diff --git a/hack/install.bat b/hack/install.bat deleted file mode 100755 index 47bdd3c172..0000000000 --- a/hack/install.bat +++ /dev/null @@ -1,37 +0,0 @@ -:: Copyright 2021 VMware Tanzu Community Edition contributors. All Rights Reserved. -:: SPDX-License-Identifier: Apache-2.0 - -:: Inspired by - https://github.com/vmware-tanzu/community-edition/blob/main/hack/install.bat -:: Script to install tanzu framework -:: Usage: .\hack\install.bat \path\to\tanzu-framework\core\binary - -@echo off - -:: start copy tanzu cli -SET TANZU_CLI_DIR=%ProgramFiles%\tanzu -mkdir "%TANZU_CLI_DIR%" || goto :error -copy /B /Y %1 "%TANZU_CLI_DIR%\tanzu.exe" || goto :error - -:: set cli path -set PATH=%PATH%;%TANZU_CLI_DIR% -:: setx /M path "%path%;%TANZU_CLI_DIR%" -:: end copy tanzu cli - -:: set plugin path -SET PLUGIN_DIR="%LocalAppData%\tanzu-cli" -SET TANZU_CACHE_DIR="%LocalAppData%\.cache\tanzu" -mkdir %PLUGIN_DIR% || goto :error -:: delete the plugin cache if it exists, before installing new plugins -rmdir /Q /S %TANZU_CACHE_DIR% - -:: install plugins -tanzu plugin sync || goto :error -tanzu plugin list || goto :error - -echo "Installation complete!" -echo "Please add %TANZU_CLI_DIR% permanently into your system's PATH." -goto :EOF - -:error -echo Failed with error #%errorlevel%. -exit /b %errorlevel% diff --git a/hack/install.sh b/hack/install.sh deleted file mode 100755 index bb694dd7fc..0000000000 --- a/hack/install.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Inspired by - https://github.com/vmware-tanzu/community-edition/blob/main/hack/install.sh -# Script to install tanzu framework -# Usage: ./hack/install.sh /path/to/tanzu-framework/core/binary - -set -o errexit -set -o nounset -set -o pipefail -set -o xtrace - -TF_INSTALL_PATH="${1:?Tanzu-Framework path argument empty. Example usage: ./hack/install.sh /path/to/tanzu-framework/core/binary}" - -ALLOW_INSTALL_AS_ROOT="${ALLOW_INSTALL_AS_ROOT:-""}" -if [[ "$EUID" -eq 0 && "${ALLOW_INSTALL_AS_ROOT}" != "true" ]]; then - echo "Do not run this script as root" - exit 1 -fi - -MY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -OS=$(uname -s | tr '[:upper:]' '[:lower:]') -ARCH="amd64" - -case "${OS}" in - linux) - XDG_DATA_HOME="${HOME}/.local/share" - ;; - darwin) - XDG_DATA_HOME="${HOME}/Library/Application Support" - ;; - *) - echo "${OS} is unsupported" - exit 1 - ;; -esac -echo "${XDG_DATA_HOME}" - -# check if the tanzu CLI already exists and remove it to avoid conflicts -if [[ -n "$(command -v tanzu)" ]]; then - # best effort, so just ignore errors - sudo rm -f "$(command -v tanzu)" > /dev/null -fi - -# set install dir to /usr/local/bin -TANZU_BIN_PATH="/usr/local/bin" -echo Installing tanzu cli to "${TANZU_BIN_PATH}" - -# if plugin cache pre-exists, remove it so new plugins are detected -TANZU_PLUGIN_CACHE="${HOME}/.cache/tanzu/catalog.yaml" -if [[ -n "${TANZU_PLUGIN_CACHE}" ]]; then - echo "Removing old plugin cache from ${TANZU_PLUGIN_CACHE}" - rm -f "${TANZU_PLUGIN_CACHE}" > /dev/null -fi - -# install tanzu cli -sudo install "${TF_INSTALL_PATH}" "${TANZU_BIN_PATH}/tanzu" - -# install plugins -tanzu plugin sync - -tanzu plugin list - -echo "Installation complete!" diff --git a/hack/linter/cli-wordlist.yml b/hack/linter/cli-wordlist.yml deleted file mode 100644 index 442e0a9eae..0000000000 --- a/hack/linter/cli-wordlist.yml +++ /dev/null @@ -1 +0,0 @@ -../../pkg/v1/cli/command/plugin/lint/cli-wordlist.yml diff --git a/hack/packages/kbld-image-replace/Makefile b/hack/packages/kbld-image-replace/Makefile deleted file mode 100644 index affb5e5735..0000000000 --- a/hack/packages/kbld-image-replace/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -.DEFAULT_GOAL:=help - -help: ## Display this help message - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[0-9A-Za-z_-]+:.*?##/ { printf " \033[36m%-45s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -lint: ## Run Go code linting -ifeq ($(origin GOLANGCI_LINT),undefined) - @echo "Error! GOLANGCI_LINT env var not set" -else - $(GOLANGCI_LINT) run -v --timeout=5m -endif - -get-deps: ## Get all dependencies - go mod download - -test: ## Run unit testing suite - echo "N/A: No unit tests for hack/packages" - -e2e-test: ## Run e2e testing suite - echo "N/A: No e2e tests for hack/packages" - -build: ## Build the executable - go build -o kbld-image-replace main.go - -run: ## Run the kbld-image-replace program to add a newImage path to an existing image in kbld-config.yaml. - go run main.go $(IMAGE) $(NEW_IMAGE) diff --git a/hack/packages/kbld-image-replace/go.mod b/hack/packages/kbld-image-replace/go.mod deleted file mode 100644 index 2295df1265..0000000000 --- a/hack/packages/kbld-image-replace/go.mod +++ /dev/null @@ -1,31 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/hack/packages - -go 1.18 - -require ( - github.com/k14s/kbld v0.32.0 - sigs.k8s.io/yaml v1.3.0 -) - -require ( - github.com/go-logr/logr v1.2.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/go-cmp v0.5.6 // indirect - github.com/google/go-containerregistry v0.7.0 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/hashicorp/go-version v1.3.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/vmware-tanzu/carvel-imgpkg v0.23.1 // indirect - github.com/vmware-tanzu/carvel-vendir v0.24.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/text v0.8.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apimachinery v0.23.0 // indirect - k8s.io/klog/v2 v2.30.0 // indirect - k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b // indirect - sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect -) diff --git a/hack/packages/kbld-image-replace/main.go b/hack/packages/kbld-image-replace/main.go deleted file mode 100644 index be34a8d2e9..0000000000 --- a/hack/packages/kbld-image-replace/main.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package main is a utility program to add a newImage path to an existing image in kbld-config.yaml. -package main - -import ( - "flag" - "log" - "os" - "path/filepath" - - kbld "github.com/k14s/kbld/pkg/kbld/config" - "sigs.k8s.io/yaml" -) - -func main() { - file := flag.String("kbld-config", "../../../packages/kbld-config.yaml", "Path to kbld-config.yaml file") - flag.Parse() - - if len(flag.Args()) != 2 { - log.Fatal("need image and newImage arguments") - } - - image := flag.Arg(0) - newImage := flag.Arg(1) - - file = &[]string{filepath.Clean(*file)}[0] - - data, err := os.ReadFile(*file) - if err != nil { - log.Fatal(err) - } - - config := &kbld.Config{} - if err := yaml.Unmarshal(data, config); err != nil { - log.Fatal(err) - } - - found := false - for i := range config.Overrides { - if config.Overrides[i].Image == image { - config.Overrides[i].NewImage = newImage - found = true - break - } - } - - if !found { - log.Fatalf("image %q not found in kbld config", image) - } - - data, err = yaml.Marshal(config) - if err != nil { - log.Fatal(err) - } - - if err = os.WriteFile(*file, data, 0644); err != nil { - log.Fatal(err) - } -} diff --git a/hack/packages/package-tools/cmd/carvelTools.go b/hack/packages/package-tools/cmd/carvelTools.go deleted file mode 100644 index 7515b49044..0000000000 --- a/hack/packages/package-tools/cmd/carvelTools.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -// CarvelTools defines the carvel tools used for building packages -type CarvelTools struct { - Tools []Tool `yaml:"tools"` -} - -// Tool is the definition of the carvel tool -type Tool struct { - Name string `yaml:"name"` - Version string `yaml:"version"` - URL string `yaml:"url"` -} diff --git a/hack/packages/package-tools/cmd/config/carvel-tools-config.yaml b/hack/packages/package-tools/cmd/config/carvel-tools-config.yaml deleted file mode 100644 index bd0e966119..0000000000 --- a/hack/packages/package-tools/cmd/config/carvel-tools-config.yaml +++ /dev/null @@ -1,13 +0,0 @@ -tools: - - name: ytt - version: v0.40.0 - url: https://github.com/vmware-tanzu/carvel-ytt/releases/download/{{ .VERSION }}/ytt-{{ .OS }}-{{ .ARCH }} - - name: kbld - version: v0.31.0 - url: https://github.com/vmware-tanzu/carvel-kbld/releases/download/{{ .VERSION }}/kbld-{{ .OS }}-{{ .ARCH }} - - name: vendir - version: v0.23.0 - url: https://github.com/vmware-tanzu/carvel-vendir/releases/download/{{ .VERSION }}/vendir-{{ .OS }}-{{ .ARCH }} - - name: imgpkg - version: v0.11.0 - url: https://github.com/vmware-tanzu/carvel-imgpkg/releases/download/{{ .VERSION }}/imgpkg-{{ .OS }}-{{ .ARCH }} diff --git a/hack/packages/package-tools/cmd/doc.go b/hack/packages/package-tools/cmd/doc.go deleted file mode 100644 index 83f5db7cf6..0000000000 --- a/hack/packages/package-tools/cmd/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package cmd provides commands for package tooling -package cmd diff --git a/hack/packages/package-tools/cmd/helpers.go b/hack/packages/package-tools/cmd/helpers.go deleted file mode 100644 index a0e5e083f6..0000000000 --- a/hack/packages/package-tools/cmd/helpers.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "fmt" - "os" - "path/filepath" - - "gopkg.in/yaml.v2" - - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/constants" -) - -func readPackageValues(projectRootDir string) (PackageValues, error) { - var packageValues PackageValues - - packageValuesData, err := os.ReadFile(filepath.Join(projectRootDir, constants.PackageValuesFilePath)) - if err != nil { - return PackageValues{}, fmt.Errorf("reading %s: %w", constants.PackageValuesFilePath, err) - } - - if err := yaml.Unmarshal(packageValuesData, &packageValues); err != nil { - return PackageValues{}, fmt.Errorf("unmarshalling package values data: %w", err) - } - - return packageValues, nil -} - -// getPackageFromPackageValues returns the list of package definition from the package-values.yaml file. -func getPackageFromPackageValues(projectRootDir, packageName string) ([]Package, error) { - packageValues, err := readPackageValues(projectRootDir) - if err != nil { - return []Package{}, err - } - - matchingPackages := []Package{} - for i := range packageValues.Repositories { - packages := packageValues.Repositories[i].Packages - for i := range packages { - if packages[i].Name == packageName { - if packages[i].Version == version { - return []Package{packages[i]}, nil - } - matchingPackages = append(matchingPackages, packages[i]) - } - } - } - - // Found packages but no matching version found, returning all matching package - if len(matchingPackages) >= 1 { - return matchingPackages, nil - } - - return []Package{}, fmt.Errorf("package %q not found in %s", packageName, constants.PackageValuesFilePath) -} - -// filterPackageRepos returns a list of repos that should be generated. -func filterPackageRepos(pkgVals PackageValues) ([]string, error) { - var filteredRepos []string - - for repo := range pkgVals.Repositories { - if packageRepository == "" { - // --repository flag was not provided and is optional, so don't - // filter out any repos. - filteredRepos = append(filteredRepos, repo) - continue - } - - _, found := pkgVals.Repositories[packageRepository] - if !found { - return nil, fmt.Errorf("%s repository not found", packageRepository) - } - - if packageRepository == repo { - filteredRepos = append(filteredRepos, repo) - } - } - - return filteredRepos, nil -} - -// packagesContains checks if a package is in the given collection of packages. -func packagesContains(packagesList []Package, pkg string) bool { - for i := range packagesList { - if packagesList[i].Name == pkg { - return true - } - } - return false -} - -type formattedVersion struct { - concatenator string - version, noV, subVersion string - concat, concatNoV string -} - -func formatVersion(pkg *Package, concatenator string) formattedVersion { - if pkg != nil && pkg.SkipVersionOverride { - fv := formattedVersion{ - version: pkg.Version, - noV: getPackageVersion(pkg.Version), - concatenator: concatenator, - subVersion: pkg.PackageSubVersion, - } - - fv.concat = fv.version - fv.concatNoV = fv.noV - if fv.subVersion != "" { - fv.concat = fv.version + concatenator + fv.subVersion - fv.concatNoV = fv.noV + concatenator + fv.subVersion - } - return fv - } - - fv := formattedVersion{ - version: version, - noV: getPackageVersion(version), - concatenator: concatenator, - } - - if pkg != nil { - fv.subVersion = pkg.PackageSubVersion - } - if subVersion != "" { - // subVersion flag overrides package values subversion. - fv.subVersion = subVersion - } - - fv.concat = fv.version - fv.concatNoV = fv.noV - if fv.subVersion != "" { - fv.concat = fv.version + concatenator + fv.subVersion - fv.concatNoV = fv.noV + concatenator + fv.subVersion - } - - return fv -} - -func getPackageVersion(version string) string { - pkgVersion := version - if string(version[0]) == "v" { - pkgVersion = version[1:] - } - return pkgVersion -} - -func getEnvArrayFromMap(env map[string]string) []string { - var arrEnv []string - for k, v := range env { - arrEnv = append(arrEnv, fmt.Sprintf("%s=%s", k, v)) - } - return arrEnv -} - -func getTempPackageHelpersLib(lib string) (string, error) { - tempDir, err := os.MkdirTemp(os.TempDir(), "package-helpers.lib-") - if err != nil { - return "", fmt.Errorf("cannot create temporary directory: %w", err) - } - tempFileName := filepath.Join(tempDir, "package-helpers.lib.yaml") - if err := os.WriteFile(tempFileName, []byte(lib), 0755); err != nil { - return "", err - } - return tempFileName, nil -} diff --git a/hack/packages/package-tools/cmd/helpers_test.go b/hack/packages/package-tools/cmd/helpers_test.go deleted file mode 100644 index 48fb7934d2..0000000000 --- a/hack/packages/package-tools/cmd/helpers_test.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package cmd - -import ( - "testing" -) - -func TestFormatVersion(t *testing.T) { - tests := []struct { - desc string - versionFlag string - subVersionFlag string - pkg *Package - concatenator string - want formattedVersion - }{ - { - desc: "version begins with 'v', read subVersion from package", - versionFlag: "v1.0.0", - subVersionFlag: "", - pkg: &Package{ - PackageSubVersion: "v12.0", - }, - concatenator: "_", - want: formattedVersion{ - concatenator: "_", - concat: "v1.0.0_v12.0", - concatNoV: "1.0.0_v12.0", - version: "v1.0.0", - noV: "1.0.0", - subVersion: "v12.0", - }, - }, - { - desc: "version begins with a number, subVersion flag takes precedence over package subVersion", - versionFlag: "1.0.0", - subVersionFlag: "1309", - pkg: &Package{ - PackageSubVersion: "12.0", - }, - concatenator: "+", - want: formattedVersion{ - concatenator: "+", - concat: "1.0.0+1309", - concatNoV: "1.0.0+1309", - version: "1.0.0", - noV: "1.0.0", - subVersion: "1309", - }, - }, - { - desc: "package subVersion is empty, but subVersion flag is not", - versionFlag: "v1.0.0", - subVersionFlag: "vmware.1", - pkg: &Package{ - PackageSubVersion: "", - }, - concatenator: "_", - want: formattedVersion{ - concatenator: "_", - concat: "v1.0.0_vmware.1", - concatNoV: "1.0.0_vmware.1", - version: "v1.0.0", - noV: "1.0.0", - subVersion: "vmware.1", - }, - }, - { - desc: "subVersion flag is empty, but package subVersion is not", - versionFlag: "v1.0.0", - subVersionFlag: "", - pkg: &Package{ - PackageSubVersion: "vmware.2", - }, - concatenator: "+", - want: formattedVersion{ - concatenator: "+", - concat: "v1.0.0+vmware.2", - concatNoV: "1.0.0+vmware.2", - version: "v1.0.0", - noV: "1.0.0", - subVersion: "vmware.2", - }, - }, - { - desc: "no subVersion has been provided", - versionFlag: "v1.0.0", - subVersionFlag: "", - pkg: &Package{ - PackageSubVersion: "", - }, - concatenator: "+", - want: formattedVersion{ - concatenator: "+", - concat: "v1.0.0", - concatNoV: "1.0.0", - version: "v1.0.0", - noV: "1.0.0", - subVersion: "", - }, - }, - { - desc: "package information nor subVersion flag not provided", - versionFlag: "v1.0.0", - subVersionFlag: "", - pkg: nil, - concatenator: "+++", - want: formattedVersion{ - concatenator: "+++", - concat: "v1.0.0", - concatNoV: "1.0.0", - version: "v1.0.0", - noV: "1.0.0", - subVersion: "", - }, - }, - { - desc: "no package information, but subVersion flag provided", - versionFlag: "v1.0.0", - subVersionFlag: "may.04", - pkg: nil, - concatenator: "", - want: formattedVersion{ - concatenator: "", - concat: "v1.0.0may.04", - concatNoV: "1.0.0may.04", - version: "v1.0.0", - noV: "1.0.0", - subVersion: "may.04", - }, - }, - } - - for _, tc := range tests { - t.Run(tc.desc, func(t *testing.T) { - // Set global variables. - version = tc.versionFlag - subVersion = tc.subVersionFlag - - if got := formatVersion(tc.pkg, tc.concatenator); got != tc.want { - t.Errorf("want %#v, got %#v", tc.want, got) - } - }) - } -} diff --git a/hack/packages/package-tools/cmd/package-bundle-generate.go b/hack/packages/package-tools/cmd/package-bundle-generate.go deleted file mode 100644 index 09e9761512..0000000000 --- a/hack/packages/package-tools/cmd/package-bundle-generate.go +++ /dev/null @@ -1,307 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "bytes" - "fmt" - "os" - "os/exec" - "path/filepath" - - "github.com/spf13/cobra" - "gopkg.in/yaml.v2" - - "github.com/vmware-tanzu/carvel-imgpkg/pkg/imgpkg/lockconfig" - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/constants" - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/utils" -) - -var packageRepository, version, subVersion string -var all, thick bool - -// packageBundleGenerateCmd is for generating package bundle -var packageBundleGenerateCmd = &cobra.Command{ - Use: "generate", - Short: "Generate package bundle", - RunE: runPackageBundleGenerate, -} - -func init() { - packageBundleCmd.AddCommand(packageBundleGenerateCmd) - packageBundleGenerateCmd.Flags().StringVar(&packageRepository, "repository", "", "Package repository of the package bundle being created") - packageBundleGenerateCmd.Flags().StringVar(®istry, "registry", "", "OCI registry where the package bundle image needs to be stored") - packageBundleGenerateCmd.Flags().StringVar(&version, "version", "", "Package bundle version") - packageBundleGenerateCmd.Flags().StringVar(&subVersion, "sub-version", "", "Package bundle subversion") - packageBundleGenerateCmd.Flags().BoolVar(&all, "all", false, "Generate all package bundles in a repository") - packageBundleGenerateCmd.Flags().BoolVar(&thick, "thick", false, "Include thick tarball(s) in package bundle(s)") - packageBundleGenerateCmd.MarkFlagRequired("version") //nolint: errcheck -} - -func runPackageBundleGenerate(cmd *cobra.Command, args []string) error { - if err := validatePackageBundleGenerateFlags(); err != nil { - return err - } - packageName := "" - if len(args) == 1 { - packageName = args[0] - } - - projectRootDir, err := utils.GetProjectRootDir() - if err != nil { - return err - } - - toolsBinDir := filepath.Join(projectRootDir, constants.ToolsBinDirPath) - - if all { - if err := generatePackageBundles(projectRootDir, toolsBinDir); err != nil { - return fmt.Errorf("couldn't generate imgpkg lock output file: %w", err) - } - } else { - fmt.Printf("Generating %q package bundle...\n", packageName) - - pkgs, err := getPackageFromPackageValues(projectRootDir, packageName) - if err != nil { - return err - } - - for i := range pkgs { - packagePath := filepath.Join(projectRootDir, "packages", packageName) - if err := generateSingleImgpkgLockOutput(toolsBinDir, packagePath, getEnvArrayFromMap(pkgs[i].Env)...); err != nil { - return fmt.Errorf("couldn't generate imgpkg lock output file: %w", err) - } - - if err := generatePackageBundle(&pkgs[i], projectRootDir, toolsBinDir, packageName, packagePath); err != nil { - return fmt.Errorf("couldn't generate the package bundle: %w", err) - } - buildPkgDir := filepath.Join(projectRootDir, "build", "packages") - pkgValsDir := filepath.Join(projectRootDir, constants.PackageValuesFilePath) - if err := generatePackageCR(projectRootDir, toolsBinDir, registry, buildPkgDir, pkgValsDir, &pkgs[i]); err != nil { - return err - } - } - } - return nil -} - -func validatePackageBundleGenerateFlags() error { - if utils.IsStringEmpty(version) { - return fmt.Errorf("version flag cannot be empty") - } - return nil -} - -func generateSingleImgpkgLockOutput(toolsBinDir, packagePath string, envArray ...string) error { - if err := utils.RunMakeTarget(packagePath, "configure-package", envArray...); err != nil { - return err - } - - imgpkgLockOutputDir := filepath.Join(packagePath, "bundle", ".imgpkg") - if err := utils.CreateDir(imgpkgLockOutputDir); err != nil { - return err - } - - // run the ytt command on the package config and pipe the output to kbld command to generate imgpkg lock output file - yttCmd := exec.Command(filepath.Join(toolsBinDir, "ytt"), - "--ignore-unknown-comments", - "-f", filepath.Join(packagePath, "bundle", "config")) // #nosec G204 - - kbldArgs := []string{ - "-f", "-", - "--imgpkg-lock-output", filepath.Join(imgpkgLockOutputDir, "images.yml"), - } - if _, err := os.Stat(filepath.Join(packagePath, "kbld-config.yaml")); err == nil { - kbldArgs = append(kbldArgs, "-f", filepath.Join(packagePath, "kbld-config.yaml")) - } - - kbldCmd := exec.Command(filepath.Join(toolsBinDir, "kbld"), kbldArgs...) // #nosec G204 - - pipe, err := yttCmd.StdoutPipe() - if err != nil { - return fmt.Errorf("couldn't run ytt command to generate imgpkg lock output file: %w", err) - } - defer pipe.Close() - var kbldCmdErrBytes, yttCmdErrBytes bytes.Buffer - kbldCmd.Stdin = pipe - kbldCmd.Stderr = &kbldCmdErrBytes - yttCmd.Stderr = &yttCmdErrBytes - - fmt.Println(yttCmd.String()) - if err := yttCmd.Start(); err != nil { - return fmt.Errorf("couldn't run ytt command: %w", err) - } - - fmt.Println(kbldCmd.String()) - if err := kbldCmd.Run(); err != nil { - return fmt.Errorf("couldn't run kbld command to generate imgpkg lock output file: %s", kbldCmdErrBytes.String()) - } - - if yttCmdErrBytes.String() != "" { - return fmt.Errorf("couldn't run ytt command: %s", yttCmdErrBytes.String()) - } - - if err := utils.RunMakeTarget(packagePath, "reset-package"); err != nil { - return err - } - return nil -} - -func generatePackageBundle(pkg *Package, projectRootDir, toolsBinDir, packageName, packagePath string) error { - if err := utils.RunMakeTarget(packagePath, "configure-package", getEnvArrayFromMap(pkg.Env)...); err != nil { - return err - } - - formattedVer := formatVersion(pkg, "_") - imagePackageVersion := formattedVer.concat - - // create tarball of package bundle - tarBallPath := filepath.Join(projectRootDir, constants.PackageBundlesDir) - tarBallFileName := packageName + "-" + imagePackageVersion + ".tar.gz" - pathToContents := filepath.Join(packagePath, "bundle") - if err := utils.CreateTarball(tarBallPath, tarBallFileName, pathToContents); err != nil { - return fmt.Errorf("couldn't generate package bundle: %w", err) - } - - // create thick tarball - if thick { - fmt.Println("Including thick tarball...") - var cmdErr bytes.Buffer - - packageURL := fmt.Sprintf("%s/%s:%s", constants.LocalRegistryURL, packageName, imagePackageVersion) - imgpkgPushCmd := exec.Command( - filepath.Join(toolsBinDir, "imgpkg"), - "push", - "-b", packageURL, - "--file", filepath.Join(packagePath, "bundle"), - ) // #nosec G204 - imgpkgPushCmd.Stderr = &cmdErr - if err := imgpkgPushCmd.Run(); err != nil { - fmt.Println("cmd:", imgpkgPushCmd.String()) - fmt.Println("err:", err) - return fmt.Errorf("pushing package bundle to local registry: %s", cmdErr.String()) - } - - tarBallFileName = packageName + "-" + imagePackageVersion + "-thick.tar.gz" - imgpkgCopyCmd := exec.Command( - filepath.Join(toolsBinDir, "imgpkg"), - "copy", - "-b", packageURL, - "--to-tar", filepath.Join(tarBallPath, tarBallFileName), - ) // #nosec G204 - imgpkgCopyCmd.Stderr = &cmdErr - if err := imgpkgCopyCmd.Run(); err != nil { - return fmt.Errorf("generating thick tarball: %s", cmdErr.String()) - } - } - - if err := utils.RunMakeTarget(packagePath, "reset-package"); err != nil { - return err - } - return nil -} - -func generatePackageBundles(projectRootDir, toolsBinDir string) error { - pkgVals, err := readPackageValues(projectRootDir) - if err != nil { - return err - } - packageRepos, err := filterPackageRepos(pkgVals) - if err != nil { - return err - } - - for _, repo := range packageRepos { - for i := range pkgVals.Repositories[repo].Packages { - fmt.Printf("Generating %q package bundle...\n", pkgVals.Repositories[repo].Packages[i].Name) - - packagePath := filepath.Join(projectRootDir, "packages", pkgVals.Repositories[repo].Packages[i].Name) - if err := utils.RunMakeTarget(packagePath, "configure-package", getEnvArrayFromMap(pkgVals.Repositories[repo].Packages[i].Env)...); err != nil { - return err - } - - // generate package bundle imgpkg lock output file - if err := generateSingleImgpkgLockOutput(toolsBinDir, packagePath, getEnvArrayFromMap(pkgVals.Repositories[repo].Packages[i].Env)...); err != nil { - return fmt.Errorf("couldn't generate imgpkg lock output file: %w", err) - } - - // push the imgpkg bundle to local registry - imagePackageVersion := formatVersion(&pkgVals.Repositories[repo].Packages[i], "_").concat - lockOutputFile := pkgVals.Repositories[repo].Packages[i].Name + "-" + imagePackageVersion + "-lock-output.yaml" - imgpkgCmd := exec.Command( - filepath.Join(toolsBinDir, "imgpkg"), - "push", "-b", constants.LocalRegistryURL+"/"+pkgVals.Repositories[repo].Packages[i].Name+":"+imagePackageVersion, - "--file", filepath.Join(packagePath, "bundle"), - "--lock-output", lockOutputFile, - ) // #nosec G204 - - var imgpkgCmdErrBytes bytes.Buffer - imgpkgCmd.Stderr = &imgpkgCmdErrBytes - fmt.Println(imgpkgCmd.String()) - if err := imgpkgCmd.Run(); err != nil { - return fmt.Errorf("couldn't push the imgpkg bundle: %s", imgpkgCmdErrBytes.String()) - } - - // update the package version and sha256 in package-values-sha256.yaml file - lockOutputData, err := os.ReadFile(lockOutputFile) - if err != nil { - return fmt.Errorf("couldn't read lock output file %s: %w", lockOutputFile, err) - } - - bundleLock := lockconfig.BundleLock{} - if err := yaml.Unmarshal(lockOutputData, &bundleLock); err != nil { - return fmt.Errorf("error while unmarshaling: %w", err) - } - - pkgVals.Repositories[repo].Packages[i].Version = formatVersion(&pkgVals.Repositories[repo].Packages[i], "_").version - pkgVals.Repositories[repo].Packages[i].Sha256 = utils.AfterString( - bundleLock.Bundle.Image, - constants.LocalRegistryURL+"/"+pkgVals.Repositories[repo].Packages[i].Name+"@sha256:", - ) - yamlData, err := yaml.Marshal(&pkgVals) - if err != nil { - return fmt.Errorf("error while marshaling: %w", err) - } - - comments := []byte("#@data/values\n---\n") - yamlData = append(comments, yamlData...) - if err := os.WriteFile(filepath.Join(projectRootDir, constants.PackageValuesSha256FilePath), yamlData, 0755); err != nil { - return err - } - - err = generatePackageBundle( - &pkgVals.Repositories[repo].Packages[i], - projectRootDir, - toolsBinDir, - pkgVals.Repositories[repo].Packages[i].Name, - packagePath, - ) - if err != nil { - return fmt.Errorf("couldn't generate package bundle: %w", err) - } - - buildPkgsDir := filepath.Join(projectRootDir, "build", "packages") - pkgValsPath := filepath.Join(projectRootDir, constants.PackageValuesFilePath) - err = generatePackageCR( - projectRootDir, - toolsBinDir, - registry, - buildPkgsDir, - pkgValsPath, - &pkgVals.Repositories[repo].Packages[i], - ) - if err != nil { - return err - } - - // remove lock output files - os.Remove(lockOutputFile) - - if err := utils.RunMakeTarget(packagePath, "reset-package"); err != nil { - return err - } - } - } - return nil -} diff --git a/hack/packages/package-tools/cmd/package-bundle-push.go b/hack/packages/package-tools/cmd/package-bundle-push.go deleted file mode 100644 index 4e6791e55d..0000000000 --- a/hack/packages/package-tools/cmd/package-bundle-push.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "bytes" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/constants" - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/utils" -) - -// packageBundlePushCmd is for pushing package bundles -var packageBundlePushCmd = &cobra.Command{ - Use: "push", - Short: "Push package bundle", - RunE: runPackageBundlePush, -} - -func init() { - packageBundleCmd.AddCommand(packageBundlePushCmd) - packageBundlePushCmd.Flags().StringVar(&packageRepository, "repository", "", "Package repository of the package bundle being pushed") - packageBundlePushCmd.Flags().StringVar(®istry, "registry", "", "OCI registry where the package bundle image needs to be stored") - packageBundlePushCmd.Flags().StringVar(&version, "version", "", "Package bundle version") - packageBundlePushCmd.Flags().StringVar(&subVersion, "sub-version", "", "Package bundle subversion") - packageBundlePushCmd.Flags().BoolVar(&all, "all", false, "Push all package bundles in given package repository to an image repository") - packageBundlePushCmd.MarkFlagRequired("registry") //nolint: errcheck - packageBundlePushCmd.MarkFlagRequired("version") //nolint: errcheck -} - -func runPackageBundlePush(cmd *cobra.Command, args []string) error { - if err := validatePackageBundlePushFlags(args); err != nil { - return err - } - projectRootDir, err := utils.GetProjectRootDir() - if err != nil { - return err - } - toolsBinDir := filepath.Join(projectRootDir, constants.ToolsBinDirPath) - - packageValues, err := readPackageValues(projectRootDir) - if err != nil { - return err - } - - repos, err := filterPackageRepos(packageValues) - if err != nil { - return err - } - - if !all { - // The first argument is expected to be a comma-separated list of - // package bundles. - if err := prunePackages(packageValues.Repositories, args[0]); err != nil { - return err - } - } - - for _, repo := range repos { - for i := range packageValues.Repositories[repo].Packages { - pkg := packageValues.Repositories[repo].Packages[i] - fmt.Printf("Pushing %q package bundle...\n", pkg.Name) - imagePackageVersion := formatVersion(&packageValues.Repositories[repo].Packages[i], "_").concat - - packageBundlePath := filepath.Join(projectRootDir, constants.PackageBundlesDir, pkg.Name+"-"+imagePackageVersion) - if err := utils.CreateDir(packageBundlePath); err != nil { - return err - } - - // untar the package bundle - tarBallFilePath := filepath.Join(projectRootDir, constants.PackageBundlesDir, pkg.Name+"-"+imagePackageVersion+".tar.gz") - r, err := os.Open(tarBallFilePath) - if err != nil { - return fmt.Errorf("couldn't open tar file %s: %w", tarBallFilePath, err) - } - if err := utils.Untar(packageBundlePath, r); err != nil { - return fmt.Errorf("couldn't untar package bundle: %w", err) - } - - // push the package bundle to remote registry - imgpkgCmd := exec.Command( - filepath.Join(toolsBinDir, "imgpkg"), - "push", "-b", registry+"/"+pkg.Name+":"+imagePackageVersion, - "--file", packageBundlePath, - ) // #nosec G204 - - var errBytes bytes.Buffer - imgpkgCmd.Stderr = &errBytes - if err := imgpkgCmd.Run(); err != nil { - return fmt.Errorf("couldn't push the package bundle: %s", errBytes.String()) - } - - // remove the untared package bundle - if err := os.RemoveAll(packageBundlePath); err != nil { - return err - } - } - } - return nil -} - -func validatePackageBundlePushFlags(args []string) error { - // At least one argument is expected to be passed in if --all is not specified. - if !all && len(args) == 0 { - return fmt.Errorf("at least one package bundle name is required to be specified") - } - - if utils.IsStringEmpty(registry) { - return fmt.Errorf("registry flag cannot be empty") - } - if utils.IsStringEmpty(version) { - return fmt.Errorf("version flag cannot be empty") - } - return nil -} - -// prunePackages will update in place the given map of repository packages to -// contain only the bundle packages listed in csvBundles. -func prunePackages(repos map[string]Repository, csvBundles string) error { - bundles := strings.Split(csvBundles, ",") - - prunedPkgs := make(map[string][]Package) - for repoName := range repos { - prunedPkgs[repoName] = []Package{} - } - - for _, bundle := range bundles { - var bundleFound bool - - RepoLoop: - for repoName := range repos { - for i := range repos[repoName].Packages { - pkg := repos[repoName].Packages[i] - if pkg.Name == bundle { - bundleFound = true - prunedPkgs[repoName] = append(prunedPkgs[repoName], pkg) - break RepoLoop - } - } - } - - if !bundleFound { - return fmt.Errorf("unable to find package bundle %q", bundle) - } - } - - for repoName, pkgs := range prunedPkgs { - tmpRepo := repos[repoName] - tmpRepo.Packages = pkgs - repos[repoName] = tmpRepo - } - - return nil -} diff --git a/hack/packages/package-tools/cmd/package-bundle.go b/hack/packages/package-tools/cmd/package-bundle.go deleted file mode 100644 index 96de5143ee..0000000000 --- a/hack/packages/package-tools/cmd/package-bundle.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import "github.com/spf13/cobra" - -var packageBundleCmd = &cobra.Command{ - Use: "package-bundle", - Short: "Package bundle operations", -} - -func init() { - rootCmd.AddCommand(packageBundleCmd) -} diff --git a/hack/packages/package-tools/cmd/packageValues.go b/hack/packages/package-tools/cmd/packageValues.go deleted file mode 100644 index e21b3f2e0c..0000000000 --- a/hack/packages/package-tools/cmd/packageValues.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -// PackageValues defines the packages configuration -type PackageValues struct { - Repositories map[string]Repository `yaml:"repositories"` -} - -// Repository defines package repository configuration -type Repository struct { - Name string `yaml:"name"` - Domain string `yaml:"domain"` - PackageSpec PackageSpec `yaml:"packageSpec"` - Packages []Package `yaml:"packages"` - Sha256 string `yaml:"sha256"` - Registry string `yaml:"registry"` -} - -// PackageSpec defines a particular package configuration -type PackageSpec struct { - SyncPeriod string `yaml:"syncPeriod"` - Deploy Deploy `yaml:"deploy"` -} - -// Deploy defines package deployment configuration -type Deploy struct { - KappWaitTimeout string `yaml:"kappWaitTimeout"` - KubeAPIQPS string `yaml:"kubeAPIQPS"` - KubeAPIBurst string `yaml:"kubeAPIBurst"` -} - -// Package holds the information about a package -type Package struct { - Name string `yaml:"name"` - DisplayName string `yaml:"displayName"` - Path string `yaml:"path"` - Domain string `yaml:"domain"` - Version string `yaml:"version"` - Sha256 string `yaml:"sha256"` - PackageSubVersion string `yaml:"packageSubVersion,omitempty"` - SkipVersionOverride bool `yaml:"skipVersionOverride,omitempty"` - Env map[string]string `yaml:"env,omitempty"` -} diff --git a/hack/packages/package-tools/cmd/prepare.go b/hack/packages/package-tools/cmd/prepare.go deleted file mode 100644 index a925ca01dc..0000000000 --- a/hack/packages/package-tools/cmd/prepare.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "bytes" - "context" - _ "embed" // required to embed file - "fmt" - "io" - "net/http" - "os" - "path/filepath" - "runtime" - "text/template" - - "github.com/spf13/cobra" - "gopkg.in/yaml.v2" - - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/utils" -) - -// prepareCmd is for preparing package tooling for building packages -var prepareCmd = &cobra.Command{ - Use: "prepare", - Short: "Prepare for building packages", - Long: "Prepare is for preparing package tooling like downloading Carvel binaries etc. for building packages", - RunE: runPrepare, -} - -//go:embed config/carvel-tools-config.yaml -var carvelTools []byte - -var clean bool - -func init() { - rootCmd.AddCommand(prepareCmd) - prepareCmd.Flags().BoolVar(&clean, "clean", false, "Deletes the existing Carvel tool binaries") -} - -func runPrepare(cmd *cobra.Command, args []string) error { - if err := downloadCarvelBinaries(); err != nil { - return fmt.Errorf("couldn't download carvel binaries: %w", err) - } - return nil -} - -// downloadCarvelBinaries downloads the carvel binaries and places them in hack/tools/bin in project root dir -func downloadCarvelBinaries() error { - c := new(CarvelTools) - err := yaml.Unmarshal(carvelTools, c) - if err != nil { - return fmt.Errorf("unmarshal error: %w", err) - } - - projectRootDir, err := utils.GetProjectRootDir() - if err != nil { - return err - } - - toolsBinDir := filepath.Join(projectRootDir, "hack", "tools", "bin") - - // clean hack/tools/bin directory - if clean { - if _, err := os.Stat(toolsBinDir); !os.IsNotExist(err) { - if err := os.RemoveAll(toolsBinDir); err != nil { - return fmt.Errorf("couldn't delete carvel binaries: %w", err) - } - } - } - - if err := utils.CreateDir(toolsBinDir); err != nil { - return err - } - - for _, tool := range c.Tools { - fmt.Printf("Downloading %q binary, version: %q \n", tool.Name, tool.Version) - - // resolve the url template and get the url - t, err := template.New("url").Parse(tool.URL) - if err != nil { - return err - } - var url bytes.Buffer - err = t.Execute(&url, struct { - VERSION string - OS string - ARCH string - }{ - tool.Version, - runtime.GOOS, - runtime.GOARCH, - }) - if err != nil { - return err - } - - httpClient := &http.Client{} - req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, url.String(), http.NoBody) - if err != nil { - return fmt.Errorf("couldn't download %s binary: %w", tool.Name, err) - } - resp, err := httpClient.Do(req) - if err != nil { - return fmt.Errorf("couldn't download %s binary: %w", tool.Name, err) - } - defer resp.Body.Close() - - // Create the binary file - out, err := os.OpenFile(filepath.Join(toolsBinDir, tool.Name), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755) - if err != nil { - return err - } - defer out.Close() - - // Write the body to file - _, err = io.Copy(out, resp.Body) - if err != nil { - return err - } - } - return nil -} diff --git a/hack/packages/package-tools/cmd/repo-bundle-generate.go b/hack/packages/package-tools/cmd/repo-bundle-generate.go deleted file mode 100644 index 9d4cfbc44c..0000000000 --- a/hack/packages/package-tools/cmd/repo-bundle-generate.go +++ /dev/null @@ -1,354 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "bytes" - _ "embed" // required to embed file - "fmt" - "os" - "os/exec" - "path/filepath" - - "github.com/spf13/cobra" - "gopkg.in/yaml.v2" - - "github.com/vmware-tanzu/carvel-imgpkg/pkg/imgpkg/lockconfig" - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/constants" - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/utils" -) - -var packageValuesFile, registry string - -// repoBundleGenerateCmd is for generating package repo bundle -var repoBundleGenerateCmd = &cobra.Command{ - Use: "generate", - Short: "Generate package repo bundle", - RunE: runRepoBundleGenerate, -} - -func init() { - repositoryBundleCmd.AddCommand(repoBundleGenerateCmd) - repoBundleGenerateCmd.Flags().StringVar(&packageRepository, "repository", "", "Package repository of the package bundles") - repoBundleGenerateCmd.Flags().StringVar(®istry, "registry", "", "OCI registry where the package repo bundle image needs to be stored") - repoBundleGenerateCmd.Flags().StringVar(&version, "version", "", "Package version of a package in repo bundle") - repoBundleGenerateCmd.Flags().StringVar(&subVersion, "sub-version", "", "Package subversion of a package in repo bundle") - repoBundleGenerateCmd.Flags().StringVar(&packageValuesFile, "package-values-file", "", "File containing the packages configuration") - repoBundleGenerateCmd.MarkFlagRequired("repository") //nolint: errcheck - repoBundleGenerateCmd.MarkFlagRequired("registry") //nolint: errcheck - repoBundleGenerateCmd.MarkFlagRequired("version") //nolint: errcheck -} - -//go:embed templates/images-tmpl.yaml -var imagesLockTemplate string - -//go:embed templates/package-helpers.lib.yaml -var packageHelpersLib string - -//go:embed templates/package-cr-overlay.yaml -var packageCrOverlay string - -//go:embed templates/package-metadata-cr-overlay.yaml -var packageMetadataCrOverlay string - -//go:embed templates/packagerepo-tmpl.yaml -var packageRepoTemplate string - -func runRepoBundleGenerate(cmd *cobra.Command, args []string) error { - if err := validateRepoBundleGenerateFlags(); err != nil { - return err - } - projectRootDir, err := utils.GetProjectRootDir() - if err != nil { - return err - } - - if packageValuesFile == "" { - if err := generatePackageBundlesSha256(projectRootDir, constants.LocalRegistryURL); err != nil { - return fmt.Errorf("couldn't generate package-values-sha256.yaml: %w", err) - } - packageValuesFile = filepath.Join(projectRootDir, constants.PackageValuesSha256FilePath) - } - - if err := generateRepoBundle(projectRootDir); err != nil { - return fmt.Errorf("couldn't generate package repo bundle: %w", err) - } - - return nil -} - -func validateRepoBundleGenerateFlags() error { - if utils.IsStringEmpty(packageRepository) { - return fmt.Errorf("repository flag cannot be empty") - } - if utils.IsStringEmpty(registry) { - return fmt.Errorf("registry flag cannot be empty") - } - if utils.IsStringEmpty(version) { - return fmt.Errorf("version flag cannot be empty") - } - return nil -} - -func generatePackageBundlesSha256(projectRootDir, localRegistry string) error { - packageValuesData, err := os.ReadFile(filepath.Join(projectRootDir, constants.PackageValuesFilePath)) - if err != nil { - return fmt.Errorf("couldn't read package-values.yaml: %w ", err) - } - - packageValues := PackageValues{} - if err := yaml.Unmarshal(packageValuesData, &packageValues); err != nil { - return err - } - - repository, found := packageValues.Repositories[packageRepository] - if !found { - return fmt.Errorf("repository not found %s", packageRepository) - } - - for i := range repository.Packages { - pkg := repository.Packages[i] - formattedVer := formatVersion(&repository.Packages[i], "_") - packagePath := filepath.Join(projectRootDir, "packages", pkg.Name) - toolsBinDir := filepath.Join(projectRootDir, constants.ToolsBinDirPath) - - if err := utils.RunMakeTarget(packagePath, "configure-package", getEnvArrayFromMap(pkg.Env)...); err != nil { - return err - } - - // push the imgpkg bundle to local registry - lockOutputFile := pkg.Name + "-" + formattedVer.concat + "-lock-output.yaml" - imgpkgCmd := exec.Command( - filepath.Join(toolsBinDir, "imgpkg"), - "push", - "-b", localRegistry+"/"+pkg.Name+":"+formattedVer.concat, - "--file", filepath.Join(packagePath, "bundle"), - "--lock-output", lockOutputFile, - ) // #nosec G204 - - var errBytes bytes.Buffer - imgpkgCmd.Stderr = &errBytes - if err := imgpkgCmd.Run(); err != nil { - return fmt.Errorf("couldn't push the imgpkg bundle: %s", errBytes.String()) - } - - // update the package version and sha256 - lockOutputData, err := os.ReadFile(lockOutputFile) - if err != nil { - return fmt.Errorf("couldn't read lock output file %s: %w", lockOutputFile, err) - } - - bundleLock := lockconfig.BundleLock{} - if err := yaml.Unmarshal(lockOutputData, &bundleLock); err != nil { - return fmt.Errorf("error while unmarshaling: %w", err) - } - - packageValues.Repositories[packageRepository].Packages[i].Version = formattedVer.noV - packageValues.Repositories[packageRepository].Packages[i].Sha256 = utils.AfterString( - bundleLock.Bundle.Image, - localRegistry+"/"+pkg.Name+"@sha256:", - ) - packageValues.Repositories[packageRepository].Packages[i].PackageSubVersion = formattedVer.subVersion - yamlData, err := yaml.Marshal(&packageValues) - if err != nil { - return fmt.Errorf("error while marshaling: %w", err) - } - - comments := []byte("#@data/values\n---\n") - yamlData = append(comments, yamlData...) - if err := os.WriteFile(filepath.Join(projectRootDir, constants.PackageValuesSha256FilePath), yamlData, 0755); err != nil { - return err - } - - // remove lock output files - if err := os.Remove(lockOutputFile); err != nil { - return fmt.Errorf("couldn't remove file %s: %w", lockOutputFile, err) - } - - if err := utils.RunMakeTarget(packagePath, "reset-package"); err != nil { - return err - } - } - return nil -} - -func generateRepoBundle(projectRootDir string) error { - fmt.Printf("Generating %q repo bundle...\n", packageRepository) - if err := utils.CreateDir(filepath.Join(projectRootDir, constants.RepoBundlesDir, packageRepository, ".imgpkg")); err != nil { - return err - } - - if err := utils.CreateDir(filepath.Join(projectRootDir, constants.RepoBundlesDir, packageRepository, "packages")); err != nil { - return err - } - - toolsBinDir := filepath.Join(projectRootDir, constants.ToolsBinDirPath) - - // write the ytt lib to a temp file and delete it later - packageHelpersLibFile, err := getTempPackageHelpersLib(packageHelpersLib) - if err != nil { - return err - } - defer os.Remove(packageHelpersLibFile) - - // generate repo bundle image lock output file - yttCmd := exec.Command( - filepath.Join(toolsBinDir, "ytt"), - "-f-", - "-f", packageHelpersLibFile, - "-f", packageValuesFile, - "-v", "packageRepository="+packageRepository, - "-v", "registry="+registry, - ) // #nosec G204 - - outFilePath := filepath.Join(projectRootDir, constants.RepoBundlesDir, packageRepository, ".imgpkg", "images.yml") - outfile, err := os.Create(outFilePath) - if err != nil { - return fmt.Errorf("error creating file %s : %w", outFilePath, err) - } - defer outfile.Close() - var errBytes bytes.Buffer - yttCmd.Stdout = outfile - yttCmd.Stderr = &errBytes - - yttCmdStdin, err := yttCmd.StdinPipe() - if err != nil { - return fmt.Errorf("couldn't run ytt command to generate imgpkg lock output file for repo bundle: %w", err) - } - _, err = yttCmdStdin.Write([]byte(imagesLockTemplate)) - if err != nil { - return fmt.Errorf("couldn't run ytt command to generate imgpkg lock output file for repo bundle: %w", err) - } - yttCmdStdin.Close() - - if err = yttCmd.Run(); err != nil { - return fmt.Errorf("couldn't generate the image lock output file: %s", errBytes.String()) - } - - packageValuesData, err := os.ReadFile(packageValuesFile) - if err != nil { - return fmt.Errorf("couldn't read file %s: %w", packageValuesFile, err) - } - - packageValues := PackageValues{} - if err := yaml.Unmarshal(packageValuesData, &packageValues); err != nil { - return fmt.Errorf("error while unmarshaling: %w", err) - } - - repository, found := packageValues.Repositories[packageRepository] - if !found { - return fmt.Errorf("%s repository not found", packageRepository) - } - - pkgRepoPkgsDir := filepath.Join(projectRootDir, constants.RepoBundlesDir, packageRepository, "packages") - for i := range repository.Packages { - if err := generatePackageCR(projectRootDir, toolsBinDir, registry, pkgRepoPkgsDir, packageValuesFile, &repository.Packages[i]); err != nil { - return fmt.Errorf("couldn't generate the package: %w", err) - } - } - - // create tarball of repo bundle - tarballVersion := formatVersion(nil, "_").concat - tarBallPath := filepath.Join(projectRootDir, constants.RepoBundlesDir, packageRepository) - tarBallFileName := packageRepository + "-repo-" + tarballVersion + ".tar.gz" - if err := utils.CreateTarball(tarBallPath, tarBallFileName, tarBallPath); err != nil { - return fmt.Errorf("couldn't generate package bundle: %w", err) - } - - return nil -} - -func generatePackageCR(projectRootDir, toolsBinDir, registry, packageArtifactDirectory, packageValuesFile string, pkg *Package) error { - // package values file - fmt.Printf("Generating Package CR for package '%s:%s'...\n", pkg.Name, pkg.Version) - if err := utils.CreateDir(filepath.Join(packageArtifactDirectory, pkg.Name+"."+pkg.Domain)); err != nil { - return err - } - - formattedVer := formatVersion(pkg, "+") - - // write the ytt lib to a temp file and delete it later - packageHelpersLibFile, err := getTempPackageHelpersLib(packageHelpersLib) - if err != nil { - return err - } - defer os.Remove(packageHelpersLibFile) - - // generate Package CR and write it to a file - packageYttCmd := exec.Command( - filepath.Join(toolsBinDir, "ytt"), - "-f-", - "-f", filepath.Join(projectRootDir, "packages", pkg.Name, "package.yaml"), - "-f", packageHelpersLibFile, - "-f", packageValuesFile, - "-v", "packageRepository="+packageRepository, - "-v", "packageName="+pkg.Name, - "-v", "registry="+registry, - "-v", "timestamp="+utils.GetFormattedCurrentTime(), - "-v", "version="+formattedVer.noV, - "-v", "subVersion="+formattedVer.subVersion, - ) // #nosec G204 - - packageFileName := formattedVer.concatNoV + ".yml" - packageFilePath := filepath.Join(packageArtifactDirectory, pkg.Name+"."+pkg.Domain, packageFileName) - packageFile, err := os.Create(packageFilePath) - if err != nil { - return fmt.Errorf("couldn't create file %s: %w", packageFilePath, err) - } - defer packageFile.Close() - var packageYttCmdErrBytes bytes.Buffer - packageYttCmd.Stdout = packageFile - packageYttCmd.Stderr = &packageYttCmdErrBytes - - packageYttCmdStdin, err := packageYttCmd.StdinPipe() - if err != nil { - return fmt.Errorf("couldn't run ytt command to generate Package CR for repo bundle: %w", err) - } - _, err = packageYttCmdStdin.Write([]byte(packageCrOverlay)) - if err != nil { - return fmt.Errorf("couldn't run ytt command to generate Package CR for repo bundle: %w", err) - } - packageYttCmdStdin.Close() - - err = packageYttCmd.Run() - if err != nil { - return fmt.Errorf("couldn't generate Package CR %s: %s", pkg.Name, packageYttCmdErrBytes.String()) - } - - // generate PacakageMetadata CR and write it to a file - packageMetadataYttCmd := exec.Command( - filepath.Join(toolsBinDir, "ytt"), "-f", filepath.Join(projectRootDir, "packages", pkg.Name, "metadata.yaml"), - "-f-", - "-f", packageHelpersLibFile, - "-f", packageValuesFile, - "-v", "packageRepository="+packageRepository, - "-v", "packageName="+pkg.Name, - "-v", "registry="+registry, - ) // #nosec G204 - - packageMetadataFilePath := filepath.Join(packageArtifactDirectory, pkg.Name+"."+pkg.Domain, "metadata.yml") - metadataFile, err := os.Create(packageMetadataFilePath) - if err != nil { - return fmt.Errorf("couldn't create file %s: %w", packageMetadataFilePath, err) - } - defer metadataFile.Close() - var packageMetadataYttCmdErrBytes bytes.Buffer - packageMetadataYttCmd.Stdout = metadataFile - packageMetadataYttCmd.Stderr = &packageMetadataYttCmdErrBytes - - packageMetadataYttCmdStdin, err := packageMetadataYttCmd.StdinPipe() - if err != nil { - return fmt.Errorf("couldn't run ytt command to generate PackageMetadata CR for repo bundle: %w", err) - } - _, err = packageMetadataYttCmdStdin.Write([]byte(packageMetadataCrOverlay)) - if err != nil { - return fmt.Errorf("couldn't run ytt command to generate PackageMetadata CR for repo bundle: %w", err) - } - packageMetadataYttCmdStdin.Close() - err = packageMetadataYttCmd.Run() - if err != nil { - return fmt.Errorf("couldn't generate PackageMetadata CR %s: %s", pkg.Name, packageMetadataYttCmdErrBytes.String()) - } - return nil -} diff --git a/hack/packages/package-tools/cmd/repo-bundle-push.go b/hack/packages/package-tools/cmd/repo-bundle-push.go deleted file mode 100644 index 242eeda94d..0000000000 --- a/hack/packages/package-tools/cmd/repo-bundle-push.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "bytes" - "fmt" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/spf13/cobra" - "gopkg.in/yaml.v2" - - "github.com/vmware-tanzu/carvel-imgpkg/pkg/imgpkg/lockconfig" - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/constants" - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/utils" -) - -// repoBundlePushCmd is for pushing package repo bundle -var repoBundlePushCmd = &cobra.Command{ - Use: "push", - Short: "Push package repo bundle", - RunE: runRepoBundlePush, -} - -func init() { - repositoryBundleCmd.AddCommand(repoBundlePushCmd) - repoBundlePushCmd.Flags().StringVar(&packageRepository, "repository", "", "Package repository of the package repo bundle being pushed") - repoBundlePushCmd.Flags().StringVar(®istry, "registry", "", "OCI registry where the package repo bundle image needs to be stored") - repoBundlePushCmd.Flags().StringVar(&version, "version", "", "Package repo bundle version") - repoBundlePushCmd.Flags().StringVar(&subVersion, "sub-version", "", "Package subversion of a package in repo bundle") - repoBundlePushCmd.MarkFlagRequired("repository") //nolint: errcheck - repoBundlePushCmd.MarkFlagRequired("registry") //nolint: errcheck - repoBundlePushCmd.MarkFlagRequired("version") //nolint: errcheck -} - -func runRepoBundlePush(cmd *cobra.Command, args []string) error { //nolint:funlen - fmt.Printf("Pushing package repo bundle %q...\n", packageRepository) - if err := validateRepoBundlePushFlags(); err != nil { - return err - } - projectRootDir, err := utils.GetProjectRootDir() - if err != nil { - return err - } - - toolsBinDir := filepath.Join(projectRootDir, constants.ToolsBinDirPath) - repoVersion := formatVersion(nil, "+").concat - - repoBundlePath := filepath.Join(projectRootDir, constants.RepoBundlesDir, packageRepository, packageRepository+"-repo-"+repoVersion) - if err := utils.CreateDir(repoBundlePath); err != nil { - return err - } - - // untar the repo bundle - tarBallVersion := formatVersion(nil, "_").concat - tarBallFilePath := filepath.Join(projectRootDir, constants.RepoBundlesDir, packageRepository, packageRepository+"-repo-"+tarBallVersion+".tar.gz") - r, err := os.Open(tarBallFilePath) - if err != nil { - return fmt.Errorf("couldn't open tar file %s: %w", tarBallFilePath, err) - } - if err := utils.Untar(repoBundlePath, r); err != nil { - return fmt.Errorf("couldn't untar package bundle: %w", err) - } - - // push the repo bundle - lockOutputFile := filepath.Join(repoBundlePath, packageRepository+"-repo-"+repoVersion+"-lock-output.yaml") - imgpkgCmd := exec.Command( - filepath.Join(toolsBinDir, "imgpkg"), - "push", - "-b", - registry+"/"+packageRepository+":"+tarBallVersion, - "--file", repoBundlePath, - "--lock-output", lockOutputFile, - ) // #nosec G204 - - var imgpkgCmdErrBytes bytes.Buffer - imgpkgCmd.Stderr = &imgpkgCmdErrBytes - if err := imgpkgCmd.Run(); err != nil { - return fmt.Errorf("couldn't push the package repo bundle: %s", imgpkgCmdErrBytes.String()) - } - - // generate PackageRepository CR - lockOutputData, err := os.ReadFile(lockOutputFile) - if err != nil { - return fmt.Errorf("couldn't read lock output file %s: %w", lockOutputFile, err) - } - - bundleLock := lockconfig.BundleLock{} - if err := yaml.Unmarshal(lockOutputData, &bundleLock); err != nil { - return fmt.Errorf("error while unmarshaling: %w", err) - } - - sha256 := strings.Split(bundleLock.Bundle.Image, ":")[1] - - // write the ytt lib to a temp file and delete it later - packageHelpersLibFile, err := getTempPackageHelpersLib(packageHelpersLib) - if err != nil { - return err - } - defer os.Remove(packageHelpersLibFile) - - yttCmd := exec.Command( - filepath.Join(toolsBinDir, "ytt"), - "-f-", - "-f", packageHelpersLibFile, - "-f", filepath.Join(projectRootDir, constants.PackageValuesSha256FilePath), - "-v", "packageRepository="+packageRepository, - "-v", "registry="+registry, - "-v", "sha256="+sha256, - ) // #nosec G204 - - packageRepositoryCRFilePath := filepath.Join(projectRootDir, constants.RepoBundlesDir, packageRepository, packageRepository+"-repo-"+repoVersion+".yaml") - outfile, err := os.Create(packageRepositoryCRFilePath) - if err != nil { - return fmt.Errorf("error creating file %s : %w", packageRepositoryCRFilePath, err) - } - defer outfile.Close() - var errBytes bytes.Buffer - yttCmd.Stdout = outfile - yttCmd.Stderr = &errBytes - yttCmdStdin, err := yttCmd.StdinPipe() - if err != nil { - return fmt.Errorf("couldn't run ytt command to generate PackageRepository CR: %w", err) - } - _, err = yttCmdStdin.Write([]byte(packageRepoTemplate)) - if err != nil { - return fmt.Errorf("couldn't run ytt command to generate PackageRepository CR: %w", err) - } - yttCmdStdin.Close() - - if err = yttCmd.Run(); err != nil { - return fmt.Errorf("couldn't generate PackageRepository CR: %s", errBytes.String()) - } - - // remove untared package repo bundle - if err := os.RemoveAll(repoBundlePath); err != nil { - return err - } - - return nil -} - -func validateRepoBundlePushFlags() error { - if utils.IsStringEmpty(packageRepository) { - return fmt.Errorf("repository flag cannot be empty") - } - if utils.IsStringEmpty(registry) { - return fmt.Errorf("registry flag cannot be empty") - } - if utils.IsStringEmpty(version) { - return fmt.Errorf("version flag cannot be empty") - } - return nil -} diff --git a/hack/packages/package-tools/cmd/repo-bundle.go b/hack/packages/package-tools/cmd/repo-bundle.go deleted file mode 100644 index 2fa0a686ef..0000000000 --- a/hack/packages/package-tools/cmd/repo-bundle.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import "github.com/spf13/cobra" - -var repositoryBundleCmd = &cobra.Command{ - Use: "repo-bundle", - Short: "Package repo bundle operations", -} - -func init() { - rootCmd.AddCommand(repositoryBundleCmd) -} diff --git a/hack/packages/package-tools/cmd/root.go b/hack/packages/package-tools/cmd/root.go deleted file mode 100644 index b17061a1ec..0000000000 --- a/hack/packages/package-tools/cmd/root.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "os" - - "github.com/spf13/cobra" -) - -// rootCmd represents the base command when called without any subcommands -var rootCmd = &cobra.Command{ - Use: "package-tooling", - Short: "package tooling to create packages in framework", -} - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - err := rootCmd.Execute() - if err != nil { - os.Exit(1) - } -} diff --git a/hack/packages/package-tools/cmd/templates/images-tmpl.yaml b/hack/packages/package-tools/cmd/templates/images-tmpl.yaml deleted file mode 100644 index 9c60805f13..0000000000 --- a/hack/packages/package-tools/cmd/templates/images-tmpl.yaml +++ /dev/null @@ -1,19 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("package-helpers.lib.yaml", "get_package_repository") - -#@ package_repository = get_package_repository(data.values.packageRepository, "") - ---- -apiVersion: imgpkg.carvel.dev/v1alpha1 -images: - #@ for package in package_repository.packages: - #@ if not hasattr(package, "packageSubVersion") or package.packageSubVersion == "": - #@ imagePackageVersion = "v" + package.version - #@ else: - #@ imagePackageVersion = "v" + package.version + "_" + package.packageSubVersion - #@ end - - annotations: - kbld.carvel.dev/id: #@ "{}/{}:{}".format(data.values.registry, package.name, imagePackageVersion) - image: #@ "{}/{}@sha256:{}".format(data.values.registry, package.name, package.sha256) -#@ end -kind: ImagesLock diff --git a/hack/packages/package-tools/cmd/templates/package-cr-overlay.yaml b/hack/packages/package-tools/cmd/templates/package-cr-overlay.yaml deleted file mode 100644 index 4017d94817..0000000000 --- a/hack/packages/package-tools/cmd/templates/package-cr-overlay.yaml +++ /dev/null @@ -1,97 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") -#@ load("package-helpers.lib.yaml", "get_package_repository", "get_package", "get_package_spec") - -#@ package_repository = get_package_repository(data.values.packageRepository, data.values.packageName) -#@ package = get_package(package_repository, data.values.packageName) -#@ packageSpec = get_package_spec(package_repository, package) -#@ skipVersionOverride = hasattr(package, "skipVersionOverride") and package.skipVersionOverride - -#@ if not hasattr(package, "packageSubVersion") and data.values.subVersion == "": -#@ if package.version == "latest" or skipVersionOverride: -#@ packageVersion = data.values.version -#@ else: -#@ packageVersion = package.version -#@ end -#@ else: -#@ subVersion = data.values.subVersion -#@ if subVersion == "": -#@ subVersion = package.packageSubVersion -#@ end -#@ if package.version == "latest" or skipVersionOverride: -#@ packageVersion = data.values.version + "+" + subVersion -#@ else: -#@ packageVersion = package.version + "+" + subVersion -#@ end -#@ end - -#@ if not hasattr(package, "packageSubVersion") and data.values.subVersion == "": -#@ if package.version == "latest" or skipVersionOverride: -#@ imagePackageVersion = "v" + data.values.version -#@ else: -#@ imagePackageVersion = "v" + package.version -#@ end -#@ else: -#@ subVersion = data.values.subVersion -#@ if subVersion == "": -#@ subVersion = package.packageSubVersion -#@ end -#@ if package.version == "latest" or skipVersionOverride: -#@ imagePackageVersion = "v" + data.values.version + "_" + subVersion -#@ else: -#@ imagePackageVersion = "v" + package.version + "_" + subVersion -#@ end -#@ end - -#@ packageLicense = "VMware’s End User License Agreement (Underlying OSS license: Apache License 2.0)" - -#@overlay/match by=overlay.subset({"kind":"Package"}),expects=1 ---- -metadata: - name: #@ "{}.{}.{}".format(package.name, package_repository.domain, packageVersion) - #@overlay/match expects="0+" - #@overlay/remove - namespace: "" -spec: - refName: #@ "{}.{}".format(package.name, package_repository.domain) - version: #@ packageVersion - #@overlay/match when=0 - releasedAt: #@ data.values.timestamp - #@overlay/match missing_ok=True - #@overlay/replace - licenses: - - #@ packageLicense - template: - spec: - #@ if/end packageSpec: - #@overlay/match missing_ok=True - #@overlay/remove - syncPeriod: - fetch: - #@overlay/match by=overlay.index(0) - - imgpkgBundle: - image: #@ "{}/{}:{}".format(data.values.registry, package.name, imagePackageVersion) - template: - #@overlay/match by=overlay.index(0) - - ytt: - #@overlay/match missing_ok=True - ignoreUnknownComments: true - deploy: - #@overlay/match by=overlay.index(0) - - kapp: - #@ if packageSpec: - #@overlay/match missing_ok=True - rawOptions: - #@overlay/match by=lambda indexOrKey, left, right: "wait-timeout" in left, missing_ok=True - - #@ "--wait-timeout={}".format(packageSpec.deploy.kappWaitTimeout) - #@overlay/match by=lambda indexOrKey, left, right: "kube-api-qps" in left, missing_ok=True - - #@ "--kube-api-qps={}".format(packageSpec.deploy.kubeAPIQPS) - #@overlay/match by=lambda indexOrKey, left, right: "kube-api-burst" in left, missing_ok=True - - #@ "--kube-api-burst={}".format(packageSpec.deploy.kubeAPIBurst) - #@ end - #@overlay/match missing_ok=True - valuesSchema: - #@overlay/match missing_ok=True - openAPIv3: - #@overlay/match missing_ok=True - title: #@ "{}.{}.{} values schema".format(package.name, package_repository.domain, packageVersion) diff --git a/hack/packages/package-tools/cmd/templates/package-helpers.lib.yaml b/hack/packages/package-tools/cmd/templates/package-helpers.lib.yaml deleted file mode 100644 index 81e967ddfb..0000000000 --- a/hack/packages/package-tools/cmd/templates/package-helpers.lib.yaml +++ /dev/null @@ -1,34 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:assert", "assert") - -#@ def get_package_repository(repository_name, package_name): -#@ if repository_name == "": -#@ for repository in data.values.repositories: -#@ for package in data.values.repositories[repository].packages: -#@ if package.name == package_name: -#@ return data.values.repositories[repository] -#@ end -#@ end -#@ end -#@ else: -#@ return data.values.repositories[repository_name] -#@ end -#@ end - -#@ def get_package(package_repository, package_name): -#@ for package in package_repository.packages: -#@ if package.name == package_name: -#@ return package -#@ end -#@ end -#@ return None -#@ end - -#@ def get_package_spec(package_repository, package): -#@ if hasattr(package, 'spec'): -#@ return package.spec -#@ elif hasattr(package_repository, 'packageSpec'): -#@ return package_repository.packageSpec -#@ end -#@ return None -#@ end diff --git a/hack/packages/package-tools/cmd/templates/package-metadata-cr-overlay.yaml b/hack/packages/package-tools/cmd/templates/package-metadata-cr-overlay.yaml deleted file mode 100644 index e2d45723c2..0000000000 --- a/hack/packages/package-tools/cmd/templates/package-metadata-cr-overlay.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") -#@ load("package-helpers.lib.yaml", "get_package_repository", "get_package") - -#@ package_repository = get_package_repository(data.values.packageRepository, data.values.packageName) -#@ package = get_package(package_repository, data.values.packageName) - -#@overlay/match by=overlay.subset({"kind":"PackageMetadata"}),expects=1 ---- -metadata: - name: #@ "{}.{}".format(package.name, package_repository.domain) - #@overlay/match expects="0+" - #@overlay/remove - namespace: "" diff --git a/hack/packages/package-tools/cmd/templates/packagerepo-tmpl.yaml b/hack/packages/package-tools/cmd/templates/packagerepo-tmpl.yaml deleted file mode 100644 index 65d6b9f67b..0000000000 --- a/hack/packages/package-tools/cmd/templates/packagerepo-tmpl.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("package-helpers.lib.yaml", "get_package_repository") - -#@ package_repository = get_package_repository(data.values.packageRepository, "") - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageRepository -metadata: - name: #@ "{}.{}".format(package_repository.name, package_repository.domain) -spec: - fetch: - imgpkgBundle: - image: #@ "{}/{}@sha256:{}".format(data.values.registry, package_repository.name, data.values.sha256) diff --git a/hack/packages/package-tools/cmd/vendir-sync.go b/hack/packages/package-tools/cmd/vendir-sync.go deleted file mode 100644 index e84a2ab6a7..0000000000 --- a/hack/packages/package-tools/cmd/vendir-sync.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "bytes" - "fmt" - "os" - "os/exec" - "path/filepath" - - "github.com/spf13/cobra" - "golang.org/x/sync/errgroup" - - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/constants" - "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/utils" -) - -// packageVendirSyncCmd is for sync the package -var packageVendirSyncCmd = &cobra.Command{ - Use: "vendir sync", - Short: "Package vendir sync", - RunE: runPackageVendirSync, -} - -func init() { - rootCmd.AddCommand(packageVendirSyncCmd) - packageVendirSyncCmd.Flags().StringVar(&packageRepository, "repository", "", "Package repository of the packages to be synced") -} - -func runPackageVendirSync(cmd *cobra.Command, args []string) error { - projectRootDir, err := utils.GetProjectRootDir() - if err != nil { - return err - } - - packageValues, err := readPackageValues(projectRootDir) - if err != nil { - return err - } - pkgRepos, err := filterPackageRepos(packageValues) - if err != nil { - return err - } - - packagesPath := filepath.Join(projectRootDir, "packages") - toolsBinDir := filepath.Join(projectRootDir, constants.ToolsBinDirPath) - files, err := os.ReadDir(packagesPath) - if err != nil { - return fmt.Errorf("couldn't read packages directory: %w", err) - } - - var g errgroup.Group - - for _, file := range files { - if !file.IsDir() { - continue - } - for _, repo := range pkgRepos { - if packagesContains(packageValues.Repositories[repo].Packages, file.Name()) { - packagePath := filepath.Join(packagesPath, file.Name()) - - // Skip if vendir.yml doesn't exist in package. - if _, err := os.Stat(filepath.Join(packagePath, "vendir.yml")); err != nil { - if os.IsNotExist(err) { - fmt.Printf("No vendir.yml found in package %q. Skipping vendir sync...\n", file.Name()) - break - } else { - return err - } - } - - fmt.Printf("Syncing package %q\n", file.Name()) - g.Go(func() error { - return syncPackage(packagePath, toolsBinDir) - }) - } - } - } - return g.Wait() -} - -func syncPackage(packagePath, toolsBinDir string) error { - cmd := exec.Command(filepath.Join(toolsBinDir, "vendir"), "sync", "--chdir", packagePath) // #nosec G204 - var errBytes bytes.Buffer - cmd.Stderr = &errBytes - if err := cmd.Run(); err != nil { - return fmt.Errorf("couldn't vendir sync package %q: %s", filepath.Base(packagePath), errBytes.String()) - } - return nil -} diff --git a/hack/packages/package-tools/constants/constants.go b/hack/packages/package-tools/constants/constants.go deleted file mode 100644 index 2cc80af82c..0000000000 --- a/hack/packages/package-tools/constants/constants.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -const ( - // LocalRegistryURL is the url of the local docker registry - LocalRegistryURL = "localhost:5001" - - // ToolsBinDirPath is the tools bin directory path - ToolsBinDirPath = "hack/tools/bin" - - // PackageBundlesDir is the path to generated package bundles - PackageBundlesDir = "build/package-bundles" - - // PackageValuesFilePath is the path to package-values.yaml file - PackageValuesFilePath = "packages/package-values.yaml" - - // PackageValuesSha256FilePath is the path to package-values-sha256.yaml file - PackageValuesSha256FilePath = "packages/package-values-sha256.yaml" - - // RepoBundlesDir is the path to the generated repo bundles - RepoBundlesDir = "build/package-repo-bundles" -) diff --git a/hack/packages/package-tools/constants/doc.go b/hack/packages/package-tools/constants/doc.go deleted file mode 100644 index 6a0bd127b1..0000000000 --- a/hack/packages/package-tools/constants/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package constants related to package tooling -package constants diff --git a/hack/packages/package-tools/go.mod b/hack/packages/package-tools/go.mod deleted file mode 100644 index 7b44cff279..0000000000 --- a/hack/packages/package-tools/go.mod +++ /dev/null @@ -1,17 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools - -go 1.18 - -require ( - github.com/spf13/cobra v1.3.0 - github.com/vmware-tanzu/carvel-imgpkg v0.24.0 - golang.org/x/sync v0.1.0 - gopkg.in/yaml.v2 v2.4.0 -) - -require ( - github.com/google/go-containerregistry v0.7.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/hack/packages/package-tools/go.sum b/hack/packages/package-tools/go.sum deleted file mode 100644 index 7d4dbe56ce..0000000000 --- a/hack/packages/package-tools/go.sum +++ /dev/null @@ -1,1338 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.10.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -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/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -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-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-containerregistry v0.7.0 h1:u0onUUOcyoCDHEiJoyR1R1gx5er1+r06V5DBhUU5ndk= -github.com/google/go-containerregistry v0.7.0/go.mod h1:2zaoelrL0d08gGbpdP3LqyUuBmhWbpD6IOe2s9nLS2k= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= -github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmware-tanzu/carvel-imgpkg v0.24.0 h1:fGI35emBVJVMyIBepfAGV6UllkuQtQYFYP2WlDDzMls= -github.com/vmware-tanzu/carvel-imgpkg v0.24.0/go.mod h1:+FkS0JDakRSK5J0SmUg9cJfkD4d3Gp11qKzPrK9NAYk= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -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-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/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/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211111162719-482062a4217b/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc/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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/hack/packages/package-tools/main.go b/hack/packages/package-tools/main.go deleted file mode 100644 index c1ce40d749..0000000000 --- a/hack/packages/package-tools/main.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import "github.com/vmware-tanzu/tanzu-framework/hack/packages/package-tools/cmd" - -func main() { - cmd.Execute() -} diff --git a/hack/packages/package-tools/utils/doc.go b/hack/packages/package-tools/utils/doc.go deleted file mode 100644 index baadb71bf0..0000000000 --- a/hack/packages/package-tools/utils/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package utils provides utilities for package tooling -package utils diff --git a/hack/packages/package-tools/utils/utils.go b/hack/packages/package-tools/utils/utils.go deleted file mode 100644 index 077aad65ee..0000000000 --- a/hack/packages/package-tools/utils/utils.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "archive/tar" - "bytes" - "compress/gzip" - "fmt" - "io" - "os" - "os/exec" - "path/filepath" - "strings" - "time" -) - -// GetProjectRootDir return project root directory -func GetProjectRootDir() (string, error) { - cmdOut, err := exec.Command("git", "rev-parse", "--show-toplevel").Output() - if err != nil { - return "", fmt.Errorf("couldn't get the project root dir: %w", err) - } - return strings.TrimSpace(string(cmdOut)), nil -} - -// CreateDir creates a directory -func CreateDir(path string) error { - if err := os.MkdirAll(path, 0755); err != nil { - return fmt.Errorf("couldn't create directory %s: %w", path, err) - } - return nil -} - -// RunMakeTarget runs a make target -func RunMakeTarget(path, target string, envArray ...string) error { - cmd := exec.Command("make", "-C", path, target) - var errBytes bytes.Buffer - cmd.Stderr = &errBytes - cmd.Env = os.Environ() - cmd.Env = append(cmd.Env, envArray...) - err := cmd.Run() - if err != nil { - return fmt.Errorf("couldn't run the make target %s: %s", target, errBytes.String()) - } - return nil -} - -// CreateTarball creates a tarball of contents of a path -func CreateTarball(tarballPath, tarballFileName, pathToContents string) error { - if err := CreateDir(tarballPath); err != nil { - return err - } - file, err := os.OpenFile(filepath.Join(tarballPath, tarballFileName), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755) - if err != nil { - return fmt.Errorf("couldn't create tarball file %s: %w", tarballFileName, err) - } - defer file.Close() - - gzipWriter := gzip.NewWriter(file) - defer gzipWriter.Close() - - tarWriter := tar.NewWriter(gzipWriter) - defer tarWriter.Close() - - return filepath.Walk(pathToContents, func(file string, fi os.FileInfo, err error) error { - if err != nil { - return err - } - - if fi.IsDir() { - return nil - } - - if !fi.Mode().IsRegular() { - return nil - } - - // create a new dir/file header - header, err := tar.FileInfoHeader(fi, fi.Name()) - if err != nil { - return err - } - - // update the name to correctly reflect the desired destination when untaring - header.Name = strings.TrimPrefix(strings.Replace(file, pathToContents, "", -1), string(filepath.Separator)) - - // write the header - if err := tarWriter.WriteHeader(header); err != nil { - return err - } - - // open files for taring - f, err := os.Open(file) - if err != nil { - return err - } - - // copy file data into tar writer - if _, err := io.Copy(tarWriter, f); err != nil { - return err - } - - f.Close() - - return nil - }) -} - -// Untar function untars a tarball -func Untar(dst string, r io.Reader) error { - gzr, err := gzip.NewReader(r) - if err != nil { - return err - } - defer gzr.Close() - - tr := tar.NewReader(gzr) - - for { - header, err := tr.Next() - - switch { - case err == io.EOF: - return nil - - case err != nil: - return err - - case header == nil: - continue - } - - // this is an action taken for gosec rule G305: File traversal when extracting zip/tar archive - if err := sanitizeExtractPath(header.Name, dst); err != nil { - return err - } - // the target location where the dir/file should be created - target := filepath.Join(dst, header.Name) //nolint: gosec - - // check the file type - switch header.Typeflag { - // if its a dir and it doesn't exist create it - case tar.TypeDir: - if _, err := os.Stat(target); err != nil { - if err := os.MkdirAll(target, 0755); err != nil { - return err - } - } - - // if it's a file create it - case tar.TypeReg: - err := os.MkdirAll(filepath.Dir(target), 0755) - if err != nil { - return err - } - f, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode)) - if err != nil { - return err - } - - if _, err := io.Copy(f, tr); err != nil { //nolint: gosec - return err - } - - f.Close() - } - } -} - -// AfterString is for getting a substring after a string. -func AfterString(str, after string) string { - pos := strings.LastIndex(str, after) - if pos == -1 { - return "" - } - adjustedPos := pos + len(after) - if adjustedPos >= len(str) { - return "" - } - return str[adjustedPos:] -} - -// GetFormattedCurrentTime return time in RFC3339 format -func GetFormattedCurrentTime() string { - t := time.Now() - return t.Format(time.RFC3339) -} - -// sanitizeExtractPath is validation for zip slip vulnerability https://snyk.io/research/zip-slip-vulnerability -func sanitizeExtractPath(destination, filePath string) error { - destinationPath := filepath.Join(destination, filePath) - if !strings.HasPrefix(destinationPath, filepath.Clean(destination)+string(os.PathSeparator)) { - return fmt.Errorf("illegal file path: %s", filePath) - } - return nil -} - -// IsStringEmpty checks if a string is empty -func IsStringEmpty(str string) bool { - return str == "" -} diff --git a/hack/packages/scripts/package-utils.sh b/hack/packages/scripts/package-utils.sh deleted file mode 100755 index d1ed90e3b9..0000000000 --- a/hack/packages/scripts/package-utils.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -eoux pipefail - -function trivy_scan() { - tmp_dir=$(mktemp -d) - while IFS='|' read -r image; do - "${TOOLS_BIN_DIR}"/trivy --cache-dir "$tmp_dir" image --exit-code 1 --severity CRITICAL --ignore-unfixed "$image" - done < <("${TOOLS_BIN_DIR}"/yq e ".overrides[] | .newImage" "${PROJECT_ROOT}/packages/kbld-config.yaml") -} - -"$@" diff --git a/hack/providers-sync-tools/Makefile b/hack/providers-sync-tools/Makefile deleted file mode 100644 index b2da207011..0000000000 --- a/hack/providers-sync-tools/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -VENDIR := $(abspath ../tools)/bin/vendir - -.PHONY: all -all: clean sync render move validate - -.PHONY: clean -clean: - rm -rf **/build - -.PHONY: sync -sync: - $(VENDIR) sync --lock-file /dev/null - -.PHONY: render -render: - ./render.sh - -.PHONY: move -move: - ./move.sh - -.PHONY: validate -validate: sync render - ./validate.sh diff --git a/hack/providers-sync-tools/README.md b/hack/providers-sync-tools/README.md deleted file mode 100644 index 3aa59580d9..0000000000 --- a/hack/providers-sync-tools/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# Providers Sync Tools - -## Overview - -Tanzu-framework is moving towards packaging cluster-api componentry. While this -transition is happening, tanzu-framework will have cluster-api components in -two locations: `packages/cluster-api*` and `providers`. - -These tools exist to ensure cluster-api related packages in the -`packages` directory stay in sync with the content in -`providers`. - -## How it works - -The tooling in this directory vendirs the cluster-api packages into a git -ignored directory: - -`hack/provider-sync-tools//build/upstream` - -The tooling then renders the files into `hack/provider-sync-tools//build/rendered` using ytt. The render includes two sets of -overlays. - -1. The first set of overlays come from the package's overlays. - -1. The second set of overlays are specific to edits needed to - `providers`, and exist in the `hack/provider-sync-tools//overlay`. An example of such an edit would be the - controller image in the CRDs of the package. - -This tooling will prevent edits made directly to the cluster-api related -folders in `providers`. Instead of directly editing those files, -overlays should be created in `hack/provider-sync-tools//overlay`. Running the `make all` target in this folder will render the -package contents along with the overlays, and then place the edited files in -`providers`. - -The validate task will ensure that the rendered content from the package and -overlays have no diff with the content of `providers`. - -## What to do in common scenarios - -1. Making a tweak to `providers/` - - add an overlay file to `hack/provider-sync-tools//overlays`. - NOTE: There are many files in `providers//` and - only some of them are copied from upstream cluster-api, typically CRDs. - These sync tools are intended to sync the files that come from upstream - and the tweaks to files that come from upstream. Files in - `providers/` that are not from upstream should - be edited in place, i.e. cluster configuration files. - - run `make all` to and check to see that `providers/` contents looks as desired. - - commit the changes - -1. Bumping cluster-api to a newer version - - edit the package(s) `packages//` - vendir file to match the desired version - - run the unit tests in the package(s), ensuring they're passing. - - `cd hack/provider-sync-tools && make all` - - ensure the `providers/` looks as desired. - - commit the changes diff --git a/hack/providers-sync-tools/cluster-api-bootstrap-kubeadm/overlay/update-capi-image.yaml b/hack/providers-sync-tools/cluster-api-bootstrap-kubeadm/overlay/update-capi-image.yaml deleted file mode 100644 index 51d28cdedf..0000000000 --- a/hack/providers-sync-tools/cluster-api-bootstrap-kubeadm/overlay/update-capi-image.yaml +++ /dev/null @@ -1,10 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capi-kubeadm-bootstrap-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - image: "registry.tkg.vmware.run/cluster-api/kubeadm-bootstrap-controller:${CABPK_CONTROLLER_IMAGE_TAG}" diff --git a/hack/providers-sync-tools/cluster-api-bootstrap-kubeadm/overlay/update-pod-security-admission.yaml b/hack/providers-sync-tools/cluster-api-bootstrap-kubeadm/overlay/update-pod-security-admission.yaml deleted file mode 100644 index da122cbf2e..0000000000 --- a/hack/providers-sync-tools/cluster-api-bootstrap-kubeadm/overlay/update-pod-security-admission.yaml +++ /dev/null @@ -1,23 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capi-kubeadm-bootstrap-controller-manager"}}) ---- -spec: - template: - spec: - #@overlay/match missing_ok=True - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - - #@overlay/match missing_ok=True - securityContext: - allowPrivilegeEscalation: false - capabilities: - #@overlay/replace - drop: - - ALL - diff --git a/hack/providers-sync-tools/cluster-api-control-plane-kubeadm/overlay/update-capi-image.yaml b/hack/providers-sync-tools/cluster-api-control-plane-kubeadm/overlay/update-capi-image.yaml deleted file mode 100644 index 2101ec0e0d..0000000000 --- a/hack/providers-sync-tools/cluster-api-control-plane-kubeadm/overlay/update-capi-image.yaml +++ /dev/null @@ -1,10 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capi-kubeadm-control-plane-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - image: "registry.tkg.vmware.run/cluster-api/kubeadm-control-plane-controller:${KCP_CONTROLLER_IMAGE_TAG}" diff --git a/hack/providers-sync-tools/cluster-api-control-plane-kubeadm/overlay/update-pod-security-admission.yaml b/hack/providers-sync-tools/cluster-api-control-plane-kubeadm/overlay/update-pod-security-admission.yaml deleted file mode 100644 index 588cd2de9f..0000000000 --- a/hack/providers-sync-tools/cluster-api-control-plane-kubeadm/overlay/update-pod-security-admission.yaml +++ /dev/null @@ -1,23 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capi-kubeadm-control-plane-controller-manager"}}) ---- -spec: - template: - spec: - #@overlay/match missing_ok=True - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - - #@overlay/match missing_ok=True - securityContext: - allowPrivilegeEscalation: false - capabilities: - #@overlay/replace - drop: - - ALL - diff --git a/hack/providers-sync-tools/cluster-api-provider-aws/overlay/add-proxy-environment-variables.yaml b/hack/providers-sync-tools/cluster-api-provider-aws/overlay/add-proxy-environment-variables.yaml deleted file mode 100644 index e19c472ab7..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-aws/overlay/add-proxy-environment-variables.yaml +++ /dev/null @@ -1,18 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "capa-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - env: - - name: HTTP_PROXY - value: ${TKG_HTTP_PROXY} - - name: HTTPS_PROXY - value: ${TKG_HTTPS_PROXY} - - name: NO_PROXY - value: ${TKG_NO_PROXY} - diff --git a/hack/providers-sync-tools/cluster-api-provider-aws/overlay/change-deployment-image.yaml b/hack/providers-sync-tools/cluster-api-provider-aws/overlay/change-deployment-image.yaml deleted file mode 100644 index 040bf465a6..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-aws/overlay/change-deployment-image.yaml +++ /dev/null @@ -1,11 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "capa-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - image: registry.tkg.vmware.run/cluster-api-aws/cluster-api-aws-controller:${CAPA_CONTROLLER_IMAGE_TAG} diff --git a/hack/providers-sync-tools/cluster-api-provider-aws/overlay/update-pod-security-admission.yaml b/hack/providers-sync-tools/cluster-api-provider-aws/overlay/update-pod-security-admission.yaml deleted file mode 100644 index d27a807f41..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-aws/overlay/update-pod-security-admission.yaml +++ /dev/null @@ -1,25 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capa-controller-manager"}}) ---- -spec: - template: - spec: - #@overlay/match missing_ok=True - securityContext: - #@overlay/match missing_ok=True - runAsNonRoot: true - #@overlay/match missing_ok=True - seccompProfile: - type: RuntimeDefault - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - - #@overlay/match missing_ok=True - securityContext: - allowPrivilegeEscalation: false - capabilities: - #@overlay/replace - drop: - - ALL - diff --git a/hack/providers-sync-tools/cluster-api-provider-azure/overlay/add-proxy-environment-variables.yaml b/hack/providers-sync-tools/cluster-api-provider-azure/overlay/add-proxy-environment-variables.yaml deleted file mode 100644 index 6f562558fd..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-azure/overlay/add-proxy-environment-variables.yaml +++ /dev/null @@ -1,17 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "capz-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - env: - - name: HTTP_PROXY - value: ${TKG_HTTP_PROXY} - - name: HTTPS_PROXY - value: ${TKG_HTTPS_PROXY} - - name: NO_PROXY - value: ${TKG_NO_PROXY} diff --git a/hack/providers-sync-tools/cluster-api-provider-azure/overlay/change-image-urls.yaml b/hack/providers-sync-tools/cluster-api-provider-azure/overlay/change-image-urls.yaml deleted file mode 100644 index 8448651130..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-azure/overlay/change-image-urls.yaml +++ /dev/null @@ -1,20 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "capz-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - image: registry.tkg.vmware.run/cluster-api/cluster-api-azure-controller:${CAPZ_CONTROLLER_IMAGE_TAG} - -#@overlay/match by=overlay.subset({"kind": "DaemonSet", "metadata": {"name": "capz-nmi"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "nmi"}) - - image: registry.tkg.vmware.run/cluster-api/nmi:${NMI_IMAGE_TAG} diff --git a/hack/providers-sync-tools/cluster-api-provider-azure/overlay/update-pod-security-admission.yaml b/hack/providers-sync-tools/cluster-api-provider-azure/overlay/update-pod-security-admission.yaml deleted file mode 100644 index 0453216e25..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-azure/overlay/update-pod-security-admission.yaml +++ /dev/null @@ -1,25 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capz-controller-manager"}}) ---- -spec: - template: - spec: - #@overlay/match missing_ok=True - securityContext: - #@overlay/match missing_ok=True - runAsNonRoot: true - #@overlay/match missing_ok=True - seccompProfile: - type: RuntimeDefault - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - - #@overlay/match missing_ok=True - securityContext: - allowPrivilegeEscalation: false - capabilities: - #@overlay/replace - drop: - - ALL - diff --git a/hack/providers-sync-tools/cluster-api-provider-docker/overlay/update-capi-image.yaml b/hack/providers-sync-tools/cluster-api-provider-docker/overlay/update-capi-image.yaml deleted file mode 100644 index 8608a4d861..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-docker/overlay/update-capi-image.yaml +++ /dev/null @@ -1,10 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capd-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - image: "registry.tkg.vmware.run/cluster-api/capd-manager:${CAPD_CONTROLLER_IMAGE_TAG}" diff --git a/hack/providers-sync-tools/cluster-api-provider-oci/overlay/add-proxy-environment-variables.yaml b/hack/providers-sync-tools/cluster-api-provider-oci/overlay/add-proxy-environment-variables.yaml deleted file mode 100644 index 3de7d44f4e..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-oci/overlay/add-proxy-environment-variables.yaml +++ /dev/null @@ -1,17 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "capoci-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - env: - - name: HTTP_PROXY - value: ${TKG_HTTP_PROXY} - - name: HTTPS_PROXY - value: ${TKG_HTTPS_PROXY} - - name: NO_PROXY - value: ${TKG_NO_PROXY} diff --git a/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/add-proxy-environment-variables.yaml b/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/add-proxy-environment-variables.yaml deleted file mode 100644 index 5d843e900e..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/add-proxy-environment-variables.yaml +++ /dev/null @@ -1,18 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "capv-controller-manager"}}), expects=2 ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - env: - - name: HTTP_PROXY - value: ${TKG_HTTP_PROXY} - - name: HTTPS_PROXY - value: ${TKG_HTTPS_PROXY} - - name: NO_PROXY - value: ${TKG_NO_PROXY} - diff --git a/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/add-release-to-metadata.yaml b/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/add-release-to-metadata.yaml deleted file mode 100644 index 0d8ea3c03e..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/add-release-to-metadata.yaml +++ /dev/null @@ -1,9 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Metadata"}) ---- -releaseSeries: -#@overlay/append -- major: 1 - minor: 1 - contract: v1beta1 diff --git a/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/update-capi-image.yaml b/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/update-capi-image.yaml deleted file mode 100644 index dc837582cf..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/update-capi-image.yaml +++ /dev/null @@ -1,10 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capv-controller-manager"}}), expects=2 ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - image: "registry.tkg.vmware.run/cluster-api/cluster-api-vsphere-controller:${CAPV_CONTROLLER_IMAGE_TAG}" diff --git a/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/update-pod-security-admission.yaml b/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/update-pod-security-admission.yaml deleted file mode 100644 index bb00e21ca4..0000000000 --- a/hack/providers-sync-tools/cluster-api-provider-vsphere/overlay/update-pod-security-admission.yaml +++ /dev/null @@ -1,25 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capv-controller-manager"}}), expects=2 ---- -spec: - template: - spec: - #@overlay/match missing_ok=True - securityContext: - #@overlay/match missing_ok=True - runAsNonRoot: true - #@overlay/match missing_ok=True - seccompProfile: - type: RuntimeDefault - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - - #@overlay/match missing_ok=True - securityContext: - allowPrivilegeEscalation: false - capabilities: - #@overlay/replace - drop: - - ALL - diff --git a/hack/providers-sync-tools/cluster-api/overlay/update-capi-image.yaml b/hack/providers-sync-tools/cluster-api/overlay/update-capi-image.yaml deleted file mode 100644 index 8537b67bba..0000000000 --- a/hack/providers-sync-tools/cluster-api/overlay/update-capi-image.yaml +++ /dev/null @@ -1,10 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capi-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - image: "registry.tkg.vmware.run/cluster-api/cluster-api-controller:${CAPI_CONTROLLER_IMAGE_TAG}" diff --git a/hack/providers-sync-tools/cluster-api/overlay/update-pod-security-admission.yaml b/hack/providers-sync-tools/cluster-api/overlay/update-pod-security-admission.yaml deleted file mode 100644 index daad25e9db..0000000000 --- a/hack/providers-sync-tools/cluster-api/overlay/update-pod-security-admission.yaml +++ /dev/null @@ -1,23 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capi-controller-manager"}}) ---- -spec: - template: - spec: - #@overlay/match missing_ok=True - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - - #@overlay/match missing_ok=True - securityContext: - allowPrivilegeEscalation: false - capabilities: - #@overlay/replace - drop: - - ALL - diff --git a/hack/providers-sync-tools/move.sh b/hack/providers-sync-tools/move.sh deleted file mode 100755 index 161f3ea998..0000000000 --- a/hack/providers-sync-tools/move.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -e -set -o pipefail - -function place_rendered_files() { - local source_package_name="${1}" - local provider_name="${2}" - local rendered_dir="${source_package_name}/build/rendered" - - local version=$(cat ../../packages/${source_package_name}/vendir.yml | grep tag | sed 's/^.*tag: //') - - cp -r "${rendered_dir}/upstream/." "../../providers/${provider_name}/${version}/" -} - -place_rendered_files "cluster-api" "cluster-api" -place_rendered_files "cluster-api-control-plane-kubeadm" "control-plane-kubeadm" -place_rendered_files "cluster-api-bootstrap-kubeadm" "bootstrap-kubeadm" -place_rendered_files "cluster-api-provider-aws" "infrastructure-aws" -place_rendered_files "cluster-api-provider-azure" "infrastructure-azure" -place_rendered_files "cluster-api-provider-docker" "infrastructure-docker" -place_rendered_files "cluster-api-provider-vsphere" "infrastructure-vsphere" diff --git a/hack/providers-sync-tools/render.sh b/hack/providers-sync-tools/render.sh deleted file mode 100755 index 7d7d62674e..0000000000 --- a/hack/providers-sync-tools/render.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -e -set -o pipefail -ROOT="$(cd "$(dirname ${0})/../.." &> /dev/null && pwd)" - -function render_upstream_package_file() { - local source_package_name="${1}" - local build_dir="${source_package_name}/build" - local pkg_v1_providers_specific_overlays_dir="${source_package_name}/overlay" - local syncd_upstream_dir="${build_dir}/upstream" - local rendered_dir="${build_dir}/rendered" - - mkdir -p "${rendered_dir}" - mkdir -p "${pkg_v1_providers_specific_overlays_dir}" - - ${ROOT}/hack/tools/bin/ytt -f "${syncd_upstream_dir}" \ - -f "${pkg_v1_providers_specific_overlays_dir}" \ - --output-files "${rendered_dir}" - find "${rendered_dir}" -type f -exec chmod 664 {} \; -} - -render_upstream_package_file "cluster-api-control-plane-kubeadm" -render_upstream_package_file "cluster-api" -render_upstream_package_file "cluster-api-bootstrap-kubeadm" -render_upstream_package_file "cluster-api-provider-aws" -render_upstream_package_file "cluster-api-provider-azure" -render_upstream_package_file "cluster-api-provider-docker" -render_upstream_package_file "cluster-api-provider-vsphere" - -# infrastructure-docker: The infrastructure-components.yaml is named -# infrastructure-components-development.yaml upstream. Renaming it to -# infrastructure-components.yaml here to match providers naming. -mv cluster-api-provider-docker/build/rendered/upstream/infrastructure-components{-development,}.yaml diff --git a/hack/providers-sync-tools/validate.sh b/hack/providers-sync-tools/validate.sh deleted file mode 100755 index f3160485a4..0000000000 --- a/hack/providers-sync-tools/validate.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -e -set -o pipefail - -function validate_rendered_files() { - local source_package_name="${1}" - local provider_name="${2}" - local rendered_dir="${source_package_name}/build/rendered" - - local version=$(cat ../../packages/${source_package_name}/vendir.yml | grep tag | sed 's/^.*tag: //') - - local rendered_files="$(find "${rendered_dir}/upstream" -type f)" - set +e - for rendered_file in ${rendered_files}; do - diff -s "../../providers/${provider_name}/${version}/$(basename ${rendered_file})" "${rendered_file}" - local exit_code="${?}" - if [[ ${exit_code} -ne 0 ]]; then - echo "[Error] Files ${rendered_file} and ../../providers/${provider_name}/${version}/$(basename ${rendered_file}) are different." - echo "[Error] providers is out of sync with packages/cluster-api*. See 'hack/providers-sync-tools/README.md'." - exit ${exit_code} - fi - done - set -e -} - -validate_rendered_files "cluster-api" "cluster-api" -validate_rendered_files "cluster-api-control-plane-kubeadm" "control-plane-kubeadm" -validate_rendered_files "cluster-api-bootstrap-kubeadm" "bootstrap-kubeadm" -validate_rendered_files "cluster-api-provider-aws" "infrastructure-aws" -validate_rendered_files "cluster-api-provider-azure" "infrastructure-azure" -validate_rendered_files "cluster-api-provider-docker" "infrastructure-docker" -validate_rendered_files "cluster-api-provider-vsphere" "infrastructure-vsphere" diff --git a/hack/providers-sync-tools/vendir.yml b/hack/providers-sync-tools/vendir.yml deleted file mode 100644 index d4c2a9405f..0000000000 --- a/hack/providers-sync-tools/vendir.yml +++ /dev/null @@ -1,38 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -directories: -- path: cluster-api-control-plane-kubeadm/build/upstream - contents: - - path: . - directory: - path: ../../packages/cluster-api-control-plane-kubeadm/bundle/config/ -- path: cluster-api/build/upstream - contents: - - path: . - directory: - path: ../../packages/cluster-api/bundle/config/ -- path: cluster-api-bootstrap-kubeadm/build/upstream - contents: - - path: . - directory: - path: ../../packages/cluster-api-bootstrap-kubeadm/bundle/config/ -- path: cluster-api-provider-aws/build/upstream - contents: - - path: . - directory: - path: ../../packages/cluster-api-provider-aws/bundle/config/ -- path: cluster-api-provider-azure/build/upstream - contents: - - path: . - directory: - path: ../../packages/cluster-api-provider-azure/bundle/config/ -- path: cluster-api-provider-docker/build/upstream - contents: - - path: . - directory: - path: ../../packages/cluster-api-provider-docker/bundle/config/ -- path: cluster-api-provider-vsphere/build/upstream - contents: - - path: . - directory: - path: ../../packages/cluster-api-provider-vsphere/bundle/config/ diff --git a/hack/test-release-artifacts.ps1 b/hack/test-release-artifacts.ps1 deleted file mode 100755 index 2765381912..0000000000 --- a/hack/test-release-artifacts.ps1 +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright 2020-2021 VMware Tanzu Community Edition contributors. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Script to test release artifacts on Windows OS -# Inspired by - https://github.com/vmware-tanzu/community-edition/blob/main/test/release-build-test/check-release-build.ps1 - -param ( - # Tanzu Framework release version argument - [Parameter(Mandatory=$True)] - [string]$version, - - # Path to the signtool - [Parameter(Mandatory=$True)] - [string]$signToolPath -) - -$ErrorActionPreference = 'Stop'; - -Set-PSDebug -Trace 1 - -if ((Test-Path env:GITHUB_TOKEN) -eq $False) { - throw "GITHUB_TOKEN environment variable is not set" -} - -$tempFolderPath = Join-Path $Env:Temp $(New-Guid) -New-Item -Type Directory -Path $tempFolderPath - -$tanzuCLIPath = Join-Path $tempFolderPath tanzu -New-Item -Type Directory -Path $tanzuCLIPath - -$TF_REPO_URL = "https://github.com/vmware-tanzu/tanzu-framework" - -gh release download $version --repo $TF_REPO_URL --pattern "tanzu-framework-windows-amd64.zip" --dir $tempFolderPath - -Expand-Archive -LiteralPath "$tempFolderPath\tanzu-framework-windows-amd64.zip" -Destination "$tanzuCLIPath" - -# Check if the binaries are all signed - Get-ChildItem -Path $tanzuCLIPath -File -Recurse -Exclude *.yaml | Foreach-Object { - & $signToolPath verify /pa $_.FullName - if ($LastExitCode -ne 0) { - throw "Error verifying: " + $_.FullName - } -} - -& ".\hack\install.bat" "$tanzuCLIPath\cli\core\$version\tanzu-core-windows_amd64.exe" "$version" - -$Env:Path += ";C:\Program Files\tanzu" - -tanzu version - -if ($LastExitCode -ne 0) { - throw "Error verifying tanzu CLI using version command: " + $_.FullName -} - -tanzu management-cluster version - -if ($LastExitCode -ne 0) { - throw "Error verifying tanzu cluster plugin using version command: " + $_.FullName -} - -tanzu package version - -if ($LastExitCode -ne 0) { - throw "Error verifying tanzu package plugin using version command: " + $_.FullName -} - -tanzu secret version - -if ($LastExitCode -ne 0) { - throw "Error verifying tanzu conformance plugin using version command: " + $_.FullName -} - -tanzu login version - -if ($LastExitCode -ne 0) { - throw "Error verifying tanzu login plugin using version command: " + $_.FullName -} - -tanzu pinniped-auth version - -if ($LastExitCode -ne 0) { - throw "Error verifying tanzu auth plugin using version command: " + $_.FullName -} - -tanzu isolated-cluster version - -if ($LastExitCode -ne 0) { - throw "Error verifying tanzu auth plugin using version command: " + $_.FullName -} - diff --git a/hack/test-release-artifacts.sh b/hack/test-release-artifacts.sh deleted file mode 100755 index 54585d1b4e..0000000000 --- a/hack/test-release-artifacts.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Script to test release artifacts on MacOS and Linux OS -# Inspired by - https://github.com/vmware-tanzu/community-edition/blob/main/test/release-build-test/check-release-build.sh - -set -o errexit -set -o nounset -set -o pipefail -set -o xtrace - -version="${1:?Tanzu-Framework version argument empty. Example usage: ./hack/test-release-artifacts.sh v0.10.0}" -: "${GITHUB_TOKEN:?GITHUB_TOKEN is not set}" - -TF_REPO_URL="https://github.com/vmware-tanzu/tanzu-framework" -OS=$(uname -s | tr '[:upper:]' '[:lower:]') -ARCH="amd64" - -temp_dir=$(mktemp -d) - -TF_TAR_BALL="${temp_dir}/tanzu-framework-${OS}-${ARCH}.tar.gz" -TF_INSTALLATION_DIR="${temp_dir}/tanzu-framework-${OS}-${ARCH}" - -gh release download "${version}" --repo ${TF_REPO_URL} --pattern "tanzu-framework-${OS}-${ARCH}.tar.gz" --dir "${temp_dir}" - -mkdir "${temp_dir}"/tanzu && tar xvzf "${TF_TAR_BALL}" --directory "${temp_dir}" -C tanzu - -if [ "${OS}" == 'darwin' ]; then - for binary in "${temp_dir}"/tanzu/cli/*; do - if [[ -d "${binary}" ]]; then - spctl -vv --type install --asses "${binary}"/"${version}"/* - fi - done -fi - -./hack/install.sh "${temp_dir}/tanzu/cli/core/${version}/tanzu-core-${OS}_${ARCH}" "${version}" - -tanzu version - -tanzu management-cluster version - -tanzu package version - -tanzu secret version - -tanzu login version - -tanzu pinniped-auth version - -tanzu isolated-cluster version diff --git a/hack/update-bundled-bom-filename/update-bundled-default-bom-files-configdata.txt b/hack/update-bundled-bom-filename/update-bundled-default-bom-files-configdata.txt deleted file mode 100644 index 49afe844a4..0000000000 --- a/hack/update-bundled-bom-filename/update-bundled-default-bom-files-configdata.txt +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigpaths - -// IMPORTANT: Please !!DO NOT!!! change the content of this file manually -// This file is auto-generated based on the default BoM file and Image repository details -// Provided during build time and the values mentioned here are used when used as library - -// All the variables are set during build time -// Note: Please !!DO NOT!!! change the name or remove this variable -var ( - TKGDefaultImageRepo string = "TKG_DEFAULT_IMAGE_REPOSITORY" - TKGDefaultCompatibilityImagePath string = "TKG_DEFAULT_COMPATIBILITY_IMAGE_PATH" - TKGManagementClusterPluginVersion string = "TKG_MANAGEMENT_CLUSTER_PLUGIN_VERSION" -) diff --git a/hack/verify-dirty.sh b/hack/verify-dirty.sh index 89f04c8a6c..b49e8252c6 100755 --- a/hack/verify-dirty.sh +++ b/hack/verify-dirty.sh @@ -43,18 +43,3 @@ else echo "OK" fi - -echo -echo "#############################" -echo "Verify make configure-bom..." -echo "#############################" -make configure-bom -if ! (git diff --quiet HEAD -- . "${ignore_files[@]}" "${ignore_file_ui_bindata}"); then - echo "FAIL" - echo "'make configure-bom' generated diffs!" - echo "Please verify if default BOM variable changes are intended and commit the diffs if so." - #TODO: Automate configure-bom as part of the build process instead - exit 0 -else - echo "OK" -fi diff --git a/object-propagation/Dockerfile b/object-propagation/Dockerfile deleted file mode 100644 index 7b61a7efed..0000000000 --- a/object-propagation/Dockerfile +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Enable Buildkit -# syntax=docker/dockerfile:1.4 - -# Build from publicly reachable source by default, but allow people to re-build images on -# top of their own trusted images. -ARG BUILDER_BASE_IMAGE=golang:1.18 -ARG DISTROLESS_BASE_IMAGE=gcr.io/distroless/static:nonroot - -# Build the manager binary -FROM $BUILDER_BASE_IMAGE as builder - -WORKDIR /workspace - -# Copy the Go Modules manifests -COPY apis/run/ apis/run/ -COPY util/ util/ - -COPY object-propagation/go.mod object-propagation/go.mod -COPY object-propagation/go.sum object-propagation/go.sum - -WORKDIR /workspace/object-propagation -# Setting default GOPROXY to https://proxy.golang.org,direct and GOSUMDB to sum.golang.org which can be override by Makefile -ARG GOSUMDB -ARG GOPROXY -ENV GOSUMDB=$GOSUMDB -ENV GOPROXY=$GOPROXY -# cache deps before building and copying source so that we don't need to re-download as much -# and so that source changes don't invalidate our downloaded layer -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod go mod download - -# Copy the go source -COPY object-propagation/ ./ - -# Build -ARG LD_FLAGS -ENV LD_FLAGS="$LD_FLAGS "'-extldflags "-static"' -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -a -ldflags "$LD_FLAGS" -o manager main.go - -# Use distroless as minimal base image to package the manager binary -# Refer to https://github.com/GoogleContainerTools/distroless for more details -FROM $DISTROLESS_BASE_IMAGE -WORKDIR / -COPY --from=builder /workspace/object-propagation/manager . -USER nonroot:nonroot - -ENTRYPOINT ["/manager"] \ No newline at end of file diff --git a/object-propagation/Makefile b/object-propagation/Makefile deleted file mode 100644 index 86d51e0e48..0000000000 --- a/object-propagation/Makefile +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../common.mk - -IMG_DEFAULT_NAME := object-propagation-controller -IMG_DEFAULT_TAG := latest -IMG_DEFAULT_NAME_TAG := $(IMG_DEFAULT_NAME):$(IMG_DEFAULT_TAG) - -IMG_VERSION_OVERRIDE ?= $(IMG_DEFAULT_TAG) - -ifeq ($(strip $(OCI_REGISTRY)),) - IMG ?= $(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -else - IMG ?= $(OCI_REGISTRY)/$(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -endif - -all: manager - -# Run tests -test: fmt vet - go test ./... -coverprofile cover.out - -# Build manager binary -manager: fmt vet - go build -ldflags "$(LD_FLAGS)" -o bin/manager ./main.go - -# Run go fmt against code -fmt: - go fmt ./... - -# Run go vet against code -vet: - go vet ./... - -.PHONY: docker-build -docker-build: ## Build docker image - cd ../ && docker build -t $(IMG) -f object-propagation/Dockerfile --build-arg LD_FLAGS="$(LD_FLAGS)" --build-arg DISTROLESS_BASE_IMAGE="$(DISTROLESS_BASE_IMAGE)" --build-arg GOPROXY="$(GOPROXY)" --build-arg GOSUMDB="$(GOSUMDB)" . - -.PHONY: docker-publish -docker-publish: ## Publish docker image - docker push $(IMG) - -.PHONY: kbld-image-replace -kbld-image-replace: ## Add newImage in kbld-config.yaml - cd ../hack/packages/kbld-image-replace && \ - go run main.go -kbld-config ../../../packages/tkg-clusterclass/kbld-config.yaml $(IMG_DEFAULT_NAME_TAG) $(IMG) - -.PHONY: docker-image-names -docker-image-names: - @echo $(IMG) - -.PHONY: docker-build-and-publish -docker-build-and-publish: docker-build docker-publish kbld-image-replace diff --git a/object-propagation/README.md b/object-propagation/README.md deleted file mode 100644 index 60657c02cd..0000000000 --- a/object-propagation/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Object Propagation Controller - -This controller source objects into the target namespaces. - -Each set of source objects is specified using: - -- apiVersion - required -- kind - required -- namespace - required -- label selector - may be empty ("") - -The target namespace is specified by a label selector, which may be empty (""). - -`target.detectAndReplaceSourceNSRef` can be used to indicate that references to the source namespace should be replaced -with the target namespace. - -The controller reads configuration provided via `--input` CLI parameter (default: `/dev/stdin`). -Example input: - -```yaml -- source: - apiVersion: v1 - kind: ConfigMap - namespace: tanzu-system - labelSelector: 'run.tanzu.vmware.com/propagated' - target: - namespaceLabelSelector: '!cluster.x-k8s.io/provider' - detectAndReplaceSourceNSRef: true -- source: - apiVersion: v1 - kind: Secret - namespace: tanzu-system - labelSelector: 'run.tanzu.vmware.com/propagated' - target: - namespaceLabelSelector: '!cluster.x-k8s.io/provider' -``` diff --git a/object-propagation/config/config.go b/object-propagation/config/config.go deleted file mode 100644 index 8ea7e9c725..0000000000 --- a/object-propagation/config/config.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package config provides structs for parsing object-propagation controller configuration. -package config - -import ( - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/labels" - "sigs.k8s.io/yaml" -) - -type Source struct { - Namespace string `json:"namespace"` - APIVersion string `json:"apiVersion"` - Kind string `json:"kind"` - LabelSelector string `json:"labelSelector"` -} - -type Target struct { - NamespaceLabelSelector string `json:"namespaceLabelSelector"` - DetectAndReplaceSourceNSRef bool `json:"detectAndReplaceSourceNSRef"` -} - -type Entry struct { - Source Source `json:"source"` - Target Target `json:"target"` -} - -func Parse(bytes []byte) ([]*Entry, error) { - var configEntries []*Entry - if err := yaml.Unmarshal(bytes, &configEntries); err != nil { - return nil, errors.Wrap(err, "parsing config") - } - if len(configEntries) == 0 { - return nil, errors.New("no config entries parsed") - } - for _, entry := range configEntries { - if err := validate(entry); err != nil { - return nil, err - } - } - return configEntries, nil -} - -func validate(entry *Entry) error { - if entry == nil { - return errors.New("nil config entry") - } - if entry.Source.APIVersion == "" { - return errors.New("source.apiVersion is empty") - } - if entry.Source.Kind == "" { - return errors.New("source.kind is empty") - } - if entry.Source.Namespace == "" { - return errors.New("source.namespace is empty") - } - if _, err := labels.Parse(entry.Source.LabelSelector); err != nil { - return errors.Wrap(err, "parsing source.selector") - } - if _, err := labels.Parse(entry.Target.NamespaceLabelSelector); err != nil { - return errors.Wrap(err, "parsing target.namespaceSelector") - } - return nil -} diff --git a/object-propagation/go.mod b/object-propagation/go.mod deleted file mode 100644 index cb12d94410..0000000000 --- a/object-propagation/go.mod +++ /dev/null @@ -1,83 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/object-propagation - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/run => ../apis/run - github.com/vmware-tanzu/tanzu-framework/util => ../util -) - -require ( - github.com/go-logr/logr v1.2.3 - github.com/imdario/mergo v0.3.12 - github.com/onsi/ginkgo/v2 v2.2.0 - github.com/onsi/gomega v1.20.1 - github.com/pkg/errors v0.9.1 - github.com/stretchr/testify v1.7.1 - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000 - k8s.io/api v0.24.2 - k8s.io/apimachinery v0.24.2 - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 - sigs.k8s.io/cluster-api v1.2.8 - sigs.k8s.io/controller-runtime v0.12.3 - sigs.k8s.io/yaml v1.3.0 -) - -require ( - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.2.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.6 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // 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/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.2 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/spf13/pflag v1.0.5 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.19.1 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.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/apiextensions-apiserver v0.24.2 // indirect - k8s.io/client-go v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.70.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect -) diff --git a/object-propagation/go.sum b/object-propagation/go.sum deleted file mode 100644 index 0ab35a0205..0000000000 --- a/object-propagation/go.sum +++ /dev/null @@ -1,980 +0,0 @@ -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.2.0 h1:3ZNA3L1c5FYDFTTxbFeVGGD8jYvjYauHD30YgLxVsNI= -github.com/onsi/ginkgo/v2 v2.2.0/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= -github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -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= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -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= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/object-propagation/main.go b/object-propagation/main.go deleted file mode 100644 index dfd0fd46b3..0000000000 --- a/object-propagation/main.go +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "flag" - "fmt" - "os" - "reflect" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - ctrl "sigs.k8s.io/controller-runtime" - clientconfig "sigs.k8s.io/controller-runtime/pkg/client/config" - "sigs.k8s.io/controller-runtime/pkg/log/zap" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/manager/signals" - - "github.com/vmware-tanzu/tanzu-framework/object-propagation/config" - "github.com/vmware-tanzu/tanzu-framework/object-propagation/propagation" - "github.com/vmware-tanzu/tanzu-framework/util/buildinfo" -) - -var ( - scheme = runtime.NewScheme() - setupLog = ctrl.Log.WithName("setup") -) - -func init() { - utilruntime.Must(corev1.AddToScheme(scheme)) -} - -var ( - metricsAddr string - input string -) - -func init() { - flag.StringVar(&metricsAddr, "metrics-bind-addr", ":8080", "The address the metric endpoint binds to") - flag.StringVar(&input, "input", "/dev/stdin", "Input file (default: /dev/stdin)") - flag.Parse() - - setupLog.Info("Version", "version", buildinfo.Version, "buildDate", buildinfo.Date, "sha", buildinfo.SHA) -} - -func main() { - opts := zap.Options{ - Development: true, - } - opts.BindFlags(flag.CommandLine) - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) - - configEntries := readConfig(input) - - ctx := signals.SetupSignalHandler() - mgr := createManager() - - propagationConfigs := propagation.Configs(configEntries) - propagationReconcilers := propagationReconcilers(ctx, mgr, propagationConfigs) - setupWithManager(mgr, propagationReconcilers) - - startManager(ctx, mgr) -} - -func readConfig(input string) []*config.Entry { - bytes, err := os.ReadFile(input) - if err != nil { - panic(errors.Wrap(err, "reading config")) - } - result, err := config.Parse(bytes) - if err != nil { - panic(errors.Wrap(err, "parsing config")) - } - return result -} - -func createManager() manager.Manager { - // Setup Manager - setupLog.Info("setting up manager") - mgr, err := manager.New(clientconfig.GetConfigOrDie(), manager.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - }) - if err != nil { - panic(errors.Wrap(err, "unable to set up controller manager")) - } - return mgr -} - -func propagationReconcilers(ctx context.Context, mgr manager.Manager, propagationConfigs []*propagation.Config) []managedComponent { - var result []managedComponent - for _, propagationConfig := range propagationConfigs { - result = append(result, propagationReconciler(ctx, mgr, propagationConfig)) - } - return result -} - -func propagationReconciler(ctx context.Context, mgr manager.Manager, propagationConfig *propagation.Config) *propagation.Reconciler { - return &propagation.Reconciler{ - Ctx: ctx, - Log: mgr.GetLogger().WithName("object-propagation").WithName(propagationConfig.ObjectType.GetObjectKind().GroupVersionKind().Kind), - Client: mgr.GetClient(), - Config: *propagationConfig, - } -} - -func setupWithManager(mgr manager.Manager, managedComponents []managedComponent) { - for _, c := range managedComponents { - setupLog.Info("setting up component", "type", fullTypeName(c)) - if err := c.SetupWithManager(mgr); err != nil { - panic(errors.Wrapf(err, "unable to setup component type '%s'", fullTypeName(c))) - } - } -} - -func fullTypeName(c managedComponent) string { - cType := reflect.TypeOf(c) - for cType.Kind() == reflect.Ptr { - cType = cType.Elem() - } - return fmt.Sprintf("%s.%s", cType.PkgPath(), cType.Name()) -} - -type managedComponent interface { - SetupWithManager(ctrl.Manager) error -} - -func startManager(ctx context.Context, mgr manager.Manager) { - setupLog.Info("starting manager") - if err := mgr.Start(ctx); err != nil { - panic(errors.Wrap(err, "unable to run manager")) - } -} diff --git a/object-propagation/propagation/config.go b/object-propagation/propagation/config.go deleted file mode 100644 index 0cbe5f8dbe..0000000000 --- a/object-propagation/propagation/config.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package propagation - -import ( - "fmt" - - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/labels" - - "github.com/vmware-tanzu/tanzu-framework/object-propagation/config" -) - -func NewConfig(configEntry *config.Entry) *Config { - sourceObject := &unstructured.Unstructured{} - - sourceObject.SetAPIVersion(configEntry.Source.APIVersion) - sourceObject.SetKind(configEntry.Source.Kind) - sourceObjectList := &unstructured.UnstructuredList{} - sourceObjectList.SetAPIVersion(configEntry.Source.APIVersion) - sourceObjectList.SetKind(fmt.Sprintf("%sList", configEntry.Source.Kind)) - - propagationConfig := Config{ - SourceNamespace: configEntry.Source.Namespace, - ObjectType: sourceObject, - ObjectListType: sourceObjectList, - DetectSrcNSRef: configEntry.Target.DetectAndReplaceSourceNSRef, - } - - for _, s := range []struct { - str string - selector *labels.Selector - }{ - {configEntry.Source.LabelSelector, &propagationConfig.SourceSelector}, - {configEntry.Target.NamespaceLabelSelector, &propagationConfig.TargetNSSelector}, - } { - var err error - if *s.selector, err = labels.Parse(s.str); err != nil { - panic(errors.Wrapf(err, "Error parsing selector '%s'", s.str)) - } - } - - return &propagationConfig -} - -func Configs(configEntries []*config.Entry) []*Config { - var result []*Config - for _, configEntry := range configEntries { - result = append(result, NewConfig(configEntry)) - } - return result -} diff --git a/object-propagation/propagation/reconciler.go b/object-propagation/propagation/reconciler.go deleted file mode 100644 index 3da9ff832d..0000000000 --- a/object-propagation/propagation/reconciler.go +++ /dev/null @@ -1,286 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package propagation provides object-propagation controller reconciler. -package propagation - -import ( - "context" - "fmt" - "reflect" - "time" - - "github.com/go-logr/logr" - "github.com/imdario/mergo" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/types" - kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/utils/pointer" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/builder" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/predicate" - "sigs.k8s.io/controller-runtime/pkg/source" - - "github.com/vmware-tanzu/tanzu-framework/util/patchset" -) - -type Reconciler struct { - Ctx context.Context - Log logr.Logger - - Client client.Client - Config Config -} - -type Config struct { - ObjectType client.Object - ObjectListType client.ObjectList - SourceNamespace string - DetectSrcNSRef bool - SourceSelector labels.Selector - TargetNSSelector labels.Selector -} - -func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error { - return ctrl.NewControllerManagedBy(mgr). - For( - r.Config.ObjectType, - builder.WithPredicates( - predicate.NewPredicateFuncs(r.matchesSourceSelectorWithinSourceNamespace), - predicate.ResourceVersionChangedPredicate{})). - Watches( - &source.Kind{Type: &corev1.Namespace{}}, - handler.EnqueueRequestsFromMapFunc(r.toAllSourceObjectsForNonExcludedNamespace), - builder.WithPredicates(predicate.LabelChangedPredicate{})). - Watches( - &source.Kind{Type: r.Config.ObjectType}, - handler.EnqueueRequestsFromMapFunc(r.toSourceObject), - builder.WithPredicates( - predicate.NewPredicateFuncs(r.matchesSourceSelectorWithinSourceNamespace), - predicate.ResourceVersionChangedPredicate{})). - Named(fmt.Sprintf("object_propagator_%s", r.Config.ObjectType.GetObjectKind().GroupVersionKind().Kind)). - Complete(r) -} - -func (r *Reconciler) matchesSourceSelectorWithinSourceNamespace(sourceObj client.Object) bool { - return sourceObj.GetNamespace() == r.Config.SourceNamespace && - r.Config.SourceSelector.Matches(labels.Set(sourceObj.GetLabels())) -} - -func (r *Reconciler) toAllSourceObjectsForNonExcludedNamespace(ns client.Object) []ctrl.Request { - if !ns.GetDeletionTimestamp().IsZero() { - return nil - } - if !r.Config.TargetNSSelector.Matches(labels.Set(ns.GetLabels())) { - return nil - } - - list := r.Config.ObjectListType.DeepCopyObject().(client.ObjectList) - if err := r.Client.List(r.Ctx, list, &client.ListOptions{ - Namespace: r.Config.SourceNamespace, - LabelSelector: r.Config.SourceSelector, - }); err != nil { - r.Log.Error(err, "error listing source objects") - return nil - } - - items := reflect.ValueOf(list).Elem().FieldByName("Items") - result := make([]ctrl.Request, items.Len()) - - for i := 0; i < items.Len(); i++ { - objValue := items.Index(i) - object := objValue.Addr().Interface().(client.Object) - - result[i].Namespace = object.GetNamespace() - result[i].Name = object.GetName() - } - - return result -} - -func (r *Reconciler) toSourceObject(targetObj client.Object) []ctrl.Request { - if targetObj.GetNamespace() == r.Config.SourceNamespace { - return nil // target object cannot be in the source namespace - } - - ns := &corev1.Namespace{} - if err := r.Client.Get(r.Ctx, types.NamespacedName{Name: targetObj.GetNamespace()}, ns); err != nil { - if !apierrors.IsNotFound(err) { - r.Log.Error(err, "error getting namespace resource for target object", - "type", targetObj.GetObjectKind().GroupVersionKind(), - "object", types.NamespacedName{Namespace: targetObj.GetNamespace(), Name: targetObj.GetName()}) - } - return nil - } - if !ns.DeletionTimestamp.IsZero() || !r.Config.TargetNSSelector.Matches(labels.Set(ns.GetLabels())) { - return nil - } - - return []ctrl.Request{{NamespacedName: types.NamespacedName{ - Namespace: r.Config.SourceNamespace, - Name: targetObj.GetName(), - }}} -} - -func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - sourceObj := r.Config.ObjectType.DeepCopyObject().(client.Object) - - if err := r.Client.Get(ctx, req.NamespacedName, sourceObj); err != nil { - if !apierrors.IsNotFound(err) { - return ctrl.Result{}, err - } - // sourceObj not found - sourceObj.SetNamespace(req.Namespace) - sourceObj.SetName(req.Name) - sourceObj.SetDeletionTimestamp(&metav1.Time{Time: time.Now()}) - } - - nsList := &corev1.NamespaceList{} - if err := r.Client.List(ctx, nsList, client.MatchingLabelsSelector{Selector: r.Config.TargetNSSelector}); err != nil { - return ctrl.Result{}, err - } - - var errs []error - for i := range nsList.Items { - nsObj := &nsList.Items[i] - // skip if nsObj is the source namespace or if it is being deleted - if nsObj.Name == r.Config.SourceNamespace || !nsObj.DeletionTimestamp.IsZero() { - continue - } - errs = append(errs, r.propagate(ctx, nsObj.Name, sourceObj)) - } - - err := kerrors.NewAggregate(errs) - errSansConflict := kerrors.FilterOut(err, apierrors.IsConflict) - - return ctrl.Result{Requeue: err != nil}, errSansConflict -} - -func (r *Reconciler) propagate(ctx context.Context, targetNS string, sourceObj client.Object) error { - targetObj := r.Config.ObjectType.DeepCopyObject().(client.Object) - - if err := r.Client.Get(ctx, client.ObjectKey{Namespace: targetNS, Name: sourceObj.GetName()}, targetObj); err != nil { - if !apierrors.IsNotFound(err) { - return err - } - - // targetObj not found - if !sourceObj.GetDeletionTimestamp().IsZero() { // sourceObj is being deleted - return nil // nothing else to do - } - - // targetObj not found, create - r.Log.Info("Creating object", "type", sourceObj.GetObjectKind().GroupVersionKind(), - "namespace", targetNS, "name", sourceObj.GetName()) - targetObj.SetNamespace(targetNS) - if err := r.overwrite(targetObj, sourceObj); err != nil { - return err - } - return r.Client.Create(ctx, targetObj) - } - - // targetObj exists - if !sourceObj.GetDeletionTimestamp().IsZero() { // sourceObj is being deleted - r.Log.Info("Deleting object", "type", sourceObj.GetObjectKind().GroupVersionKind(), - "namespace", targetNS, "name", sourceObj.GetName()) - err := r.Client.Delete(ctx, targetObj) - return errors.Wrap(err, "deleting target object") - } - - // targetObj exists, patch - r.Log.Info("Patching object", "type", sourceObj.GetObjectKind().GroupVersionKind(), - "namespace", targetNS, "name", sourceObj.GetName()) - ps := patchset.New(r.Client) - ps.Add(targetObj) - - if err := r.overwrite(targetObj, sourceObj); err != nil { - return err - } - return ps.Apply(ctx) -} - -func (r *Reconciler) overwrite(targetObj, sourceObj client.Object) error { - orig := targetObj.DeepCopyObject().(client.Object) - - sourceObjWithSourceNSReplaced := sourceObj.DeepCopyObject().(client.Object) - if r.Config.DetectSrcNSRef { - stringValueReplacer{ - old: r.Config.SourceNamespace, - new: targetObj.GetNamespace(), - }.Replace(sourceObjWithSourceNSReplaced) - } - - if err := mergo.Merge(targetObj, sourceObjWithSourceNSReplaced, mergo.WithOverwriteWithEmptyValue); err != nil { - return err - } - restoreMeta(targetObj, orig) - - targetObj.SetOwnerReferences(nil) - - return nil -} - -type stringValueReplacer struct { - old string - new string -} - -func (r stringValueReplacer) Replace(obj interface{}) { - v := reflect.ValueOf(obj) - r.replace(v) -} - -func (r stringValueReplacer) replace(v reflect.Value) { - switch v.Kind() { - case reflect.Ptr: - r.replace(v.Elem()) - case reflect.Interface: - r.replace(v.Elem()) - case reflect.Map: - r.replaceMap(v) - case reflect.Slice: - for i := 0; i < v.Len(); i++ { - r.replace(v.Index(i)) - } - case reflect.Struct: - for i := 0; i < v.NumField(); i++ { - r.replace(v.Field(i)) - } - case reflect.String: - if v.CanSet() && v.String() == r.old { - v.SetString(r.new) - } - } -} - -func (r stringValueReplacer) replaceMap(v reflect.Value) { - iter := v.MapRange() - for iter.Next() { - kv, vv := iter.Key(), iter.Value() - switch { - case vv.Kind() == reflect.String && vv.String() == r.old: - v.SetMapIndex(kv, reflect.ValueOf(r.new)) - case vv.Kind() == reflect.Interface && vv.Elem().Kind() == reflect.String && vv.Elem().String() == r.old: - v.SetMapIndex(kv, reflect.ValueOf(r.new)) - case vv.Kind() == reflect.Ptr && vv.Elem().Kind() == reflect.String && vv.Elem().String() == r.old: - v.SetMapIndex(kv, reflect.ValueOf(pointer.StringPtr(r.new))) - default: - r.replace(vv) - } - } -} - -func restoreMeta(targetObj, orig client.Object) { - targetObj.SetNamespace(orig.GetNamespace()) - targetObj.SetUID(orig.GetUID()) - targetObj.SetResourceVersion(orig.GetResourceVersion()) - targetObj.SetGeneration(orig.GetGeneration()) - targetObj.SetSelfLink(orig.GetSelfLink()) - targetObj.SetCreationTimestamp(orig.GetCreationTimestamp()) -} diff --git a/object-propagation/propagation/reconciler_test.go b/object-propagation/propagation/reconciler_test.go deleted file mode 100644 index 502d01e20b..0000000000 --- a/object-propagation/propagation/reconciler_test.go +++ /dev/null @@ -1,598 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package propagation - -import ( - "context" - "reflect" - "testing" - "time" - - "github.com/go-logr/logr" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/apimachinery/pkg/util/uuid" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/sets" - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/object-propagation/config" -) - -func TestPropagationReconciler(t *testing.T) { - RegisterFailHandler(Fail) - suiteConfig, _ := GinkgoConfiguration() - suiteConfig.FailFast = true - RunSpecs(t, "Object Propagation Tests", suiteConfig) -} - -const ( - nameNSTKGSystem = "tkg-system" - nameNSDefault = "default" - nameNSUser1 = "user1" -) - -var _ = Describe("Reconciler", func() { - var ( - scheme *runtime.Scheme - - ctx context.Context - log logr.Logger - - c client.Client - r *Reconciler - - conf Config - objects []client.Object - ) - - BeforeEach(func() { - scheme = initScheme() - - ctx = context.Background() - log = logr.Discard() - }) - - var ( - nsTKGSystem, nsDefault, nsUser1 *corev1.Namespace - ) - - BeforeEach(func() { - nsTKGSystem = &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: nameNSTKGSystem, UID: uuid.NewUUID()}} - nsDefault = &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: nameNSDefault, UID: uuid.NewUUID()}} - nsUser1 = &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: nameNSUser1, UID: uuid.NewUUID()}} - - objects = []client.Object{nsTKGSystem, nsDefault, nsUser1} - }) - - BeforeEach(func() { - conf = *NewConfig(&config.Entry{ - Source: config.Source{ - Namespace: nameNSTKGSystem, - APIVersion: "cluster.x-k8s.io/v1beta1", - Kind: "ClusterClass", - LabelSelector: "", - }, - Target: config.Target{ - NamespaceLabelSelector: "!cluster.x-k8s.io/provider", - DetectAndReplaceSourceNSRef: true, - }, - }) - }) - - JustBeforeEach(func() { - c = uidSetter{fake.NewClientBuilder().WithScheme(scheme).WithObjects(objects...).Build()} - r = &Reconciler{ - Ctx: ctx, - Log: log, - Client: c, - Config: conf, - } - }) - - Context("r.Reconcile()", func() { - When("getting the source object returns an error", func() { - var expectedErr = errors.New("expected") - - JustBeforeEach(func() { - c = errorGetter{Client: c, err: expectedErr} - r.Client = c - }) - - It("should return the error", func() { - _, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{ - Namespace: nameNSTKGSystem, - Name: "cc1", - }}) - Expect(errors.Cause(err)).To(Equal(expectedErr)) - }) - }) - - When("the source object is not found", func() { - When("the target object is not found", func() { - It("should do nothing", func() { - _, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{ - Namespace: nameNSTKGSystem, - Name: "cc1", - }}) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - When("getting the target object returns an error", func() { - var expectedErr = errors.New("expected") - - JustBeforeEach(func() { - c = targetedErrorGetter{Client: c, namespace: nameNSDefault, err: expectedErr} - r.Client = c - }) - - It("should return the error", func() { - _, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{ - Namespace: nameNSTKGSystem, - Name: "cc1", - }}) - Expect(err).To(HaveOccurred()) - Expect(kerrors.FilterOut(err, errEquals(expectedErr))).To(BeNil()) - }) - }) - - When("target objects exist", func() { - var cc0 *clusterv1.ClusterClass - - BeforeEach(func() { - cc0 = &clusterv1.ClusterClass{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: nameNSTKGSystem, - Name: "cc0", - }, - } - // not adding cc0 to objects: it does not exist - for _, ns := range []string{nameNSDefault, nameNSUser1} { - objects = append(objects, &clusterv1.ClusterClass{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns, - Name: "cc0", - UID: uuid.NewUUID(), - }, - }) - } - }) - - It("should delete the target object", func() { - _, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{ - Namespace: cc0.Namespace, - Name: cc0.Name, - }}) - Expect(err).ToNot(HaveOccurred()) - - for _, ns := range []string{nameNSDefault, nameNSUser1} { - cc := &clusterv1.ClusterClass{} - err := r.Client.Get(ctx, client.ObjectKey{Namespace: ns, Name: cc0.Name}, cc) - Expect(err).To(HaveOccurred()) - Expect(apierrors.IsNotFound(err)).To(BeTrue()) - } - }) - }) - }) - - When("the source object exists", func() { - var cc0 *clusterv1.ClusterClass - - BeforeEach(func() { - cc0 = &clusterv1.ClusterClass{ - TypeMeta: metav1.TypeMeta{ - Kind: "ClusterClass", - APIVersion: "cluster.x-k8s.io/v1beta1", - }, - ObjectMeta: metav1.ObjectMeta{ - Namespace: nameNSTKGSystem, - Name: "cc0", - UID: uuid.NewUUID(), - }, - Spec: clusterv1.ClusterClassSpec{ - Infrastructure: clusterv1.LocalObjectTemplate{Ref: &corev1.ObjectReference{ - Kind: "AwesomeInfraCluster", - Namespace: nameNSTKGSystem, - Name: "awesome-infra-cluster", - APIVersion: "run.tanzu.vmware.com/v1omega3", - }}, - ControlPlane: clusterv1.ControlPlaneClass{ - Metadata: clusterv1.ObjectMeta{Annotations: map[string]string{ - runv1.AnnotationResolveTKR: "", - }}, - }, - Workers: clusterv1.WorkersClass{ - MachineDeployments: []clusterv1.MachineDeploymentClass{{ - Template: clusterv1.MachineDeploymentClassTemplate{ - Bootstrap: clusterv1.LocalObjectTemplate{ - Ref: &corev1.ObjectReference{ - Kind: "AwesomeBootstrapTemplate", - Namespace: nameNSTKGSystem, - Name: "awesome-bootstrap-template", - APIVersion: "run.tanzu.vmware.com/v1omega3", - }, - }, - }, - }}, - }, - }, - } - objects = append(objects, cc0) - }) - - When("target objects are not found", func() { - It("should create the target object", func() { - _, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{ - Namespace: cc0.Namespace, - Name: cc0.Name, - }}) - Expect(err).ToNot(HaveOccurred()) - - for _, ns := range []string{nameNSDefault, nameNSUser1} { - cc := &clusterv1.ClusterClass{} - Expect(r.Client.Get(ctx, client.ObjectKey{Namespace: ns, Name: cc0.Name}, cc)).To(Succeed()) - - Expect(cc.Spec.Infrastructure.Ref.Namespace).To(Equal(ns)) - Expect(cc.Spec.Workers.MachineDeployments[0].Template.Bootstrap.Ref.Namespace).To(Equal(ns)) - cc.Spec.Infrastructure.Ref.Namespace = cc0.Namespace - cc.Spec.Workers.MachineDeployments[0].Template.Bootstrap.Ref.Namespace = cc0.Namespace - - restoreMeta(cc, cc0) - Expect(cc).To(Equal(cc0)) - } - }) - }) - - When("target objects exist (but may be different)", func() { - BeforeEach(func() { - for _, ns := range []string{nameNSDefault, nameNSUser1} { - objects = append(objects, &clusterv1.ClusterClass{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns, - Name: "cc0", - UID: uuid.NewUUID(), - }, - }) - } - }) - - It("should patch the target object", func() { - _, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{ - Namespace: cc0.Namespace, - Name: cc0.Name, - }}) - Expect(err).ToNot(HaveOccurred()) - - for _, ns := range []string{nameNSDefault, nameNSUser1} { - cc := &clusterv1.ClusterClass{} - Expect(r.Client.Get(ctx, client.ObjectKey{Namespace: ns, Name: cc0.Name}, cc)).To(Succeed()) - - Expect(cc.Spec.Infrastructure.Ref.Namespace).To(Equal(ns)) - Expect(cc.Spec.Workers.MachineDeployments[0].Template.Bootstrap.Ref.Namespace).To(Equal(ns)) - cc.Spec.Infrastructure.Ref.Namespace = cc0.Namespace - cc.Spec.Workers.MachineDeployments[0].Template.Bootstrap.Ref.Namespace = cc0.Namespace - - restoreMeta(cc, cc0) - Expect(cc).To(Equal(cc0)) - } - }) - }) - - When("the source object has non-empty ownerReferences", func() { - BeforeEach(func() { - cc0.SetOwnerReferences([]metav1.OwnerReference{{ - APIVersion: "some.thing/v1omega3", - Kind: "Something", - Name: "some-thing", - UID: uuid.NewUUID(), - }}) - }) - - When("target objects are not found", func() { - It("should create the target object", func() { - _, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{ - Namespace: cc0.Namespace, - Name: cc0.Name, - }}) - Expect(err).ToNot(HaveOccurred()) - - for _, ns := range []string{nameNSDefault, nameNSUser1} { - cc := &clusterv1.ClusterClass{} - Expect(r.Client.Get(ctx, client.ObjectKey{Namespace: ns, Name: cc0.Name}, cc)).To(Succeed()) - - Expect(cc.Spec.Infrastructure.Ref.Namespace).To(Equal(ns)) - Expect(cc.Spec.Workers.MachineDeployments[0].Template.Bootstrap.Ref.Namespace).To(Equal(ns)) - Expect(cc.OwnerReferences).To(BeNil()) - cc.Spec.Infrastructure.Ref.Namespace = cc0.Namespace - cc.Spec.Workers.MachineDeployments[0].Template.Bootstrap.Ref.Namespace = cc0.Namespace - cc.OwnerReferences = cc0.OwnerReferences - - restoreMeta(cc, cc0) - Expect(cc).To(Equal(cc0)) - } - }) - }) - - When("target objects exist (but may be different)", func() { - BeforeEach(func() { - for _, ns := range []string{nameNSDefault, nameNSUser1} { - objects = append(objects, &clusterv1.ClusterClass{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: ns, - Name: "cc0", - UID: uuid.NewUUID(), - }, - }) - } - }) - - It("should patch the target object", func() { - _, err := r.Reconcile(ctx, ctrl.Request{NamespacedName: types.NamespacedName{ - Namespace: cc0.Namespace, - Name: cc0.Name, - }}) - Expect(err).ToNot(HaveOccurred()) - - for _, ns := range []string{nameNSDefault, nameNSUser1} { - cc := &clusterv1.ClusterClass{} - Expect(r.Client.Get(ctx, client.ObjectKey{Namespace: ns, Name: cc0.Name}, cc)).To(Succeed()) - - Expect(cc.Spec.Infrastructure.Ref.Namespace).To(Equal(ns)) - Expect(cc.Spec.Workers.MachineDeployments[0].Template.Bootstrap.Ref.Namespace).To(Equal(ns)) - Expect(cc.OwnerReferences).To(BeNil()) - cc.Spec.Infrastructure.Ref.Namespace = cc0.Namespace - cc.Spec.Workers.MachineDeployments[0].Template.Bootstrap.Ref.Namespace = cc0.Namespace - cc.OwnerReferences = cc0.OwnerReferences - - restoreMeta(cc, cc0) - Expect(cc).To(Equal(cc0)) - } - }) - }) - }) - }) - }) - - Context("r.toAllSourceObjectsForNonExcludedNamespace()", func() { - var ns *corev1.Namespace - - BeforeEach(func() { - ns = &corev1.Namespace{} - }) - - When("ns is being deleted", func() { - It("should return nil", func() { - ns.DeletionTimestamp = &metav1.Time{Time: time.Now()} - Expect(r.toAllSourceObjectsForNonExcludedNamespace(ns)).To(BeNil()) - }) - }) - - When("ns doesn't match the target selector", func() { - It("should return nil", func() { - ns.Labels = labels.Set{"cluster.x-k8s.io/provider": ""} - Expect(r.toAllSourceObjectsForNonExcludedNamespace(ns)).To(BeNil()) - }) - }) - - When("ns matches the target selector", func() { - var ccNames sets.StringSet - - BeforeEach(func() { - ccNames = sets.Strings("cc0", "cc1", "cc2") - for ccName := range ccNames { - objects = append(objects, &clusterv1.ClusterClass{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: nameNSTKGSystem, - Name: ccName, - UID: uuid.NewUUID(), - }, - }) - } - }) - - It("should return requests for all source objects", func() { - requests := r.toAllSourceObjectsForNonExcludedNamespace(ns) - Expect(len(requests)).To(Equal(len(ccNames))) - - names := make(sets.StringSet, len(requests)) - for _, request := range requests { - Expect(request.Namespace).To(Equal(nameNSTKGSystem)) - names.Add(request.Name) - } - Expect(names).To(Equal(ccNames)) - }) - }) - }) - - Context("r.toSourceObject()", func() { - var targetObj *clusterv1.ClusterClass - - BeforeEach(func() { - targetObj = &clusterv1.ClusterClass{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: nameNSUser1, - Name: "cc", - }, - } - }) - - When("the target object's namespace is actually the source namespace", func() { - BeforeEach(func() { - targetObj.Namespace = nameNSTKGSystem - }) - It("should return nil", func() { - Expect(r.toSourceObject(targetObj)).To(BeNil()) - }) - }) - - When("getting the target object's namespace returns an error", func() { - expectedErr := errors.New("expected") - - JustBeforeEach(func() { - c = targetedErrorGetter{Client: c, objectType: &corev1.Namespace{}, err: expectedErr} - r.Client = c - }) - - It("should return nil", func() { - Expect(r.toSourceObject(targetObj)).To(BeNil()) - }) - }) - - When("the target object's namespace is being deleted", func() { - BeforeEach(func() { - nsUser1.DeletionTimestamp = &metav1.Time{Time: time.Now()} - }) - - It("should return nil", func() { - Expect(r.toSourceObject(targetObj)).To(BeNil()) - }) - }) - - When("the target object's namespace does not match the target namespace selector", func() { - BeforeEach(func() { - nsUser1.Labels = labels.Set{ - "cluster.x-k8s.io/provider": "", - } - }) - - It("should return nil", func() { - Expect(r.toSourceObject(targetObj)).To(BeNil()) - }) - }) - - When("the target object's namespace matches the selector and is not being deleted", func() { - It("should return the request for the corresponding object in the source namespace", func() { - requests := r.toSourceObject(targetObj) - Expect(requests).To(HaveLen(1)) - Expect(requests[0].Namespace).To(Equal(nameNSTKGSystem)) - Expect(requests[0].Name).To(Equal(targetObj.Name)) - }) - }) - }) - - Context("r.matchesSourceSelectorWithinSourceNamespace()", func() { - var sourceObj *clusterv1.ClusterClass - - BeforeEach(func() { - sourceObj = &clusterv1.ClusterClass{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: nameNSTKGSystem, - Name: "cc0", - }, - } - }) - - When("the object's namespace is not the source namespace", func() { - BeforeEach(func() { - sourceObj.Namespace = nameNSUser1 - }) - - It("should return false", func() { - Expect(r.matchesSourceSelectorWithinSourceNamespace(sourceObj)).To(BeFalse()) - }) - }) - - When("the object's labels do not match the source selector", func() { - BeforeEach(func() { - selector, err := labels.Parse("special-required-label") - Expect(err).ToNot(HaveOccurred()) - conf.SourceSelector = selector - }) - - It("should return false", func() { - Expect(r.matchesSourceSelectorWithinSourceNamespace(sourceObj)).To(BeFalse()) - }) - }) - - When("the object is in the source namespace and matches the source selector", func() { - It("should return false", func() { - Expect(r.matchesSourceSelectorWithinSourceNamespace(sourceObj)).To(BeTrue()) - }) - }) - }) -}) - -func errEquals(err error) kerrors.Matcher { - return func(e error) bool { - return e == err - } -} - -func initScheme() *runtime.Scheme { - scheme := runtime.NewScheme() - _ = clusterv1.AddToScheme(scheme) - _ = corev1.AddToScheme(scheme) - return scheme -} - -// uidSetter emulates real clusters' behavior of setting UIDs on objects being created -type uidSetter struct { - client.Client -} - -func (u uidSetter) Create(ctx context.Context, obj client.Object, opts ...client.CreateOption) error { - obj.(metav1.Object).SetUID(uuid.NewUUID()) - return u.Client.Create(ctx, obj, opts...) -} - -type errorGetter struct { - client.Client - err error -} - -func (c errorGetter) Get(_ context.Context, _ client.ObjectKey, _ client.Object) error { - return c.err -} - -type targetedErrorGetter struct { - client.Client - - objectType client.Object - namespace string - name string - - err error -} - -func (c targetedErrorGetter) Get(ctx context.Context, key client.ObjectKey, obj client.Object) error { - if c.returnErr(key, obj) { - return c.err - } - return c.Client.Get(ctx, key, obj) -} - -func (c targetedErrorGetter) returnErr(key client.ObjectKey, obj client.Object) bool { - if c.namespace != "" && key.Namespace != c.namespace { - return false - } - if c.name != "" && key.Name != c.name { - return false - } - if c.objectType != nil && !reflect.TypeOf(obj).AssignableTo(reflect.TypeOf(c.objectType)) { - return false - } - return true -} - -var _ = Describe("targetedErrorGetter", func() { - Context("returnErr()", func() { - It("should work correctly", func() { - c := targetedErrorGetter{objectType: &corev1.ConfigMap{}} - Expect(c.returnErr(client.ObjectKey{}, &corev1.ConfigMap{})).To(BeTrue()) - Expect(c.returnErr(client.ObjectKey{}, &corev1.Secret{})).To(BeFalse()) - }) - }) -}) diff --git a/object-propagation/propagation/replacer_test.go b/object-propagation/propagation/replacer_test.go deleted file mode 100644 index 93f8539a47..0000000000 --- a/object-propagation/propagation/replacer_test.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package propagation - -import ( - "testing" - - "github.com/stretchr/testify/require" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/utils/pointer" -) - -func TestStringValueReplacer(t *testing.T) { - replacer := stringValueReplacer{ - old: "tkg-system", - new: "default", - } - - m0 := map[string]interface{}{ - "ns1": "tkg-system", - "ns2": pointer.StringPtr("tkg-system"), - "ns3": map[string]string{ - "ns": "tkg-system", - }, - "ns4": map[string]*string{ - "ns": pointer.StringPtr("tkg-system"), - }, - } - u := &unstructured.Unstructured{Object: m0} - - replacer.Replace(u) - - require.Equal(t, replacer.new, u.Object["ns1"]) - require.Equal(t, replacer.new, *u.Object["ns2"].(*string)) - require.Equal(t, replacer.new, u.Object["ns3"].(map[string]string)["ns"]) - require.Equal(t, replacer.new, *u.Object["ns4"].(map[string]*string)["ns"]) -} diff --git a/packageclients/Makefile b/packageclients/Makefile deleted file mode 100644 index b48f907a12..0000000000 --- a/packageclients/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../common.mk - -test: fmt vet ## Run tests - ${GO} test ./... -coverprofile cover.out - -vet: ## Run go vet against code - ${GO} vet ./... - -COUNTERFEITER := $(TOOLS_BIN_DIR)/counterfeiter -$(COUNTERFEITER): $(TOOLS_BIN_DIR) - $(GO) build -tags=tools -o $@ github.com/maxbrunsfeld/counterfeiter/v6 - -generate-fakes: $(COUNTERFEITER) ## Generate fakes for unit tests - PATH=$(TOOLS_BIN_DIR):"$(PATH)" $(GO) generate ./... - $(MAKE) fmt - diff --git a/packageclients/go.mod b/packageclients/go.mod deleted file mode 100644 index 1b6596a9ff..0000000000 --- a/packageclients/go.mod +++ /dev/null @@ -1,69 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/packageclients - -go 1.18 - -require ( - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/briandowns/spinner v1.19.0 - github.com/getkin/kin-openapi v0.94.0 - github.com/google/go-containerregistry v0.7.0 - github.com/mattn/go-isatty v0.0.16 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - github.com/pkg/errors v0.9.1 - github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 - github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 - github.com/vmware-tanzu/carvel-vendir v0.26.0 - k8s.io/api v0.24.4 - k8s.io/apimachinery v0.24.4 - k8s.io/client-go v0.24.4 - sigs.k8s.io/controller-runtime v0.12.3 -) - -require ( - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.8.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/swag v0.21.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/imdario/mergo v0.3.12 // 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.12 // 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/nxadm/tail v1.4.8 // indirect - github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/packageclients/go.sum b/packageclients/go.sum deleted file mode 100644 index ff2846bb98..0000000000 --- a/packageclients/go.sum +++ /dev/null @@ -1,1556 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudfoundry/bosh-utils v0.0.0-20191216173634-505d7f919144/go.mod h1:JCrKwetZGjxbfq1U139TZuXDBfdGLtjOEAfxMWKV/QM= -github.com/cloudfoundry/config-server v0.1.20/go.mod h1:Y3b/MHqyp22CcG0X1qvEHG8lujoebxjD9IAslyS/Yk0= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.10.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -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/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw= -github.com/emicklei/go-restful/v3 v3.8.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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getkin/kin-openapi v0.94.0 h1:bAxg2vxgnHHHoeefVdmGbR+oxtJlcv5HsJJa3qmAHuo= -github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -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 v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.7.0 h1:u0onUUOcyoCDHEiJoyR1R1gx5er1+r06V5DBhUU5ndk= -github.com/google/go-containerregistry v0.7.0/go.mod h1:2zaoelrL0d08gGbpdP3LqyUuBmhWbpD6IOe2s9nLS2k= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -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.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -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/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 h1:zgWNumjhN+0CCiq1Wo4lVTmO89eOA6HuPXgv1sVhE4k= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0/go.mod h1:Hldrv7kPAD3THS1yUYZPFIaHmPE0ENO0ljzbJrpftiE= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 h1:3mSDyzhf52Y0jdvHrhJUf4Sk97CILBOkQt/WUaD8G/8= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0/go.mod h1:UW9xzccG6vjNoq2emVderTX11epILNyxtmGxFupRsHc= -github.com/vmware-tanzu/carvel-vendir v0.26.0 h1:Q98tPnH9WUAWE2vJSAP0lsHGsfwGjfW2y+JUOEiJ/Yk= -github.com/vmware-tanzu/carvel-vendir v0.26.0/go.mod h1:JcuNNVONFbZTbm/GjtGiWUfFrt17YBQzeGT9+gY1+yY= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/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 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/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= -gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211111162719-482062a4217b/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= -k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.24.4 h1:I5Y645gJ8zWKawyr78lVfDQkZrAViSbeRXsPZWTxmXk= -k8s.io/api v0.24.4/go.mod h1:42pVfA0NRxrtJhZQOvRSyZcJihzAdU59WBtTjYcB0/M= -k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= -k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.24.4 h1:S0Ur3J/PbivTcL43EdSdPhqCqKla2NIuneNwZcTDeGQ= -k8s.io/apimachinery v0.24.4/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= -k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= -k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.24.4 h1:hIAIJZIPyaw46AkxwyR0FRfM/pRxpUNTd3ysYu9vyRg= -k8s.io/client-go v0.24.4/go.mod h1:+AxlPWw/H6f+EJhRSjIeALaJT4tbeB/8g9BNvXGPd0Y= -k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= -k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/packageclients/pkg/fakes/crtclient.go b/packageclients/pkg/fakes/crtclient.go deleted file mode 100644 index 84d7b9075c..0000000000 --- a/packageclients/pkg/fakes/crtclient.go +++ /dev/null @@ -1,786 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "context" - "sync" - - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" -) - -type CrtClient struct { - CreateStub func(context.Context, client.Object, ...client.CreateOption) error - createMutex sync.RWMutex - createArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.CreateOption - } - createReturns struct { - result1 error - } - createReturnsOnCall map[int]struct { - result1 error - } - DeleteStub func(context.Context, client.Object, ...client.DeleteOption) error - deleteMutex sync.RWMutex - deleteArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteOption - } - deleteReturns struct { - result1 error - } - deleteReturnsOnCall map[int]struct { - result1 error - } - DeleteAllOfStub func(context.Context, client.Object, ...client.DeleteAllOfOption) error - deleteAllOfMutex sync.RWMutex - deleteAllOfArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteAllOfOption - } - deleteAllOfReturns struct { - result1 error - } - deleteAllOfReturnsOnCall map[int]struct { - result1 error - } - GetStub func(context.Context, types.NamespacedName, client.Object) error - getMutex sync.RWMutex - getArgsForCall []struct { - arg1 context.Context - arg2 types.NamespacedName - arg3 client.Object - } - getReturns struct { - result1 error - } - getReturnsOnCall map[int]struct { - result1 error - } - ListStub func(context.Context, client.ObjectList, ...client.ListOption) error - listMutex sync.RWMutex - listArgsForCall []struct { - arg1 context.Context - arg2 client.ObjectList - arg3 []client.ListOption - } - listReturns struct { - result1 error - } - listReturnsOnCall map[int]struct { - result1 error - } - PatchStub func(context.Context, client.Object, client.Patch, ...client.PatchOption) error - patchMutex sync.RWMutex - patchArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 client.Patch - arg4 []client.PatchOption - } - patchReturns struct { - result1 error - } - patchReturnsOnCall map[int]struct { - result1 error - } - RESTMapperStub func() meta.RESTMapper - rESTMapperMutex sync.RWMutex - rESTMapperArgsForCall []struct { - } - rESTMapperReturns struct { - result1 meta.RESTMapper - } - rESTMapperReturnsOnCall map[int]struct { - result1 meta.RESTMapper - } - SchemeStub func() *runtime.Scheme - schemeMutex sync.RWMutex - schemeArgsForCall []struct { - } - schemeReturns struct { - result1 *runtime.Scheme - } - schemeReturnsOnCall map[int]struct { - result1 *runtime.Scheme - } - StatusStub func() client.StatusWriter - statusMutex sync.RWMutex - statusArgsForCall []struct { - } - statusReturns struct { - result1 client.StatusWriter - } - statusReturnsOnCall map[int]struct { - result1 client.StatusWriter - } - UpdateStub func(context.Context, client.Object, ...client.UpdateOption) error - updateMutex sync.RWMutex - updateArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.UpdateOption - } - updateReturns struct { - result1 error - } - updateReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *CrtClient) Create(arg1 context.Context, arg2 client.Object, arg3 ...client.CreateOption) error { - fake.createMutex.Lock() - ret, specificReturn := fake.createReturnsOnCall[len(fake.createArgsForCall)] - fake.createArgsForCall = append(fake.createArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.CreateOption - }{arg1, arg2, arg3}) - stub := fake.CreateStub - fakeReturns := fake.createReturns - fake.recordInvocation("Create", []interface{}{arg1, arg2, arg3}) - fake.createMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CrtClient) CreateCallCount() int { - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - return len(fake.createArgsForCall) -} - -func (fake *CrtClient) CreateCalls(stub func(context.Context, client.Object, ...client.CreateOption) error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = stub -} - -func (fake *CrtClient) CreateArgsForCall(i int) (context.Context, client.Object, []client.CreateOption) { - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - argsForCall := fake.createArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CrtClient) CreateReturns(result1 error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = nil - fake.createReturns = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) CreateReturnsOnCall(i int, result1 error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = nil - if fake.createReturnsOnCall == nil { - fake.createReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.createReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) Delete(arg1 context.Context, arg2 client.Object, arg3 ...client.DeleteOption) error { - fake.deleteMutex.Lock() - ret, specificReturn := fake.deleteReturnsOnCall[len(fake.deleteArgsForCall)] - fake.deleteArgsForCall = append(fake.deleteArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteOption - }{arg1, arg2, arg3}) - stub := fake.DeleteStub - fakeReturns := fake.deleteReturns - fake.recordInvocation("Delete", []interface{}{arg1, arg2, arg3}) - fake.deleteMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CrtClient) DeleteCallCount() int { - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - return len(fake.deleteArgsForCall) -} - -func (fake *CrtClient) DeleteCalls(stub func(context.Context, client.Object, ...client.DeleteOption) error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = stub -} - -func (fake *CrtClient) DeleteArgsForCall(i int) (context.Context, client.Object, []client.DeleteOption) { - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - argsForCall := fake.deleteArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CrtClient) DeleteReturns(result1 error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = nil - fake.deleteReturns = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) DeleteReturnsOnCall(i int, result1 error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = nil - if fake.deleteReturnsOnCall == nil { - fake.deleteReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) DeleteAllOf(arg1 context.Context, arg2 client.Object, arg3 ...client.DeleteAllOfOption) error { - fake.deleteAllOfMutex.Lock() - ret, specificReturn := fake.deleteAllOfReturnsOnCall[len(fake.deleteAllOfArgsForCall)] - fake.deleteAllOfArgsForCall = append(fake.deleteAllOfArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteAllOfOption - }{arg1, arg2, arg3}) - stub := fake.DeleteAllOfStub - fakeReturns := fake.deleteAllOfReturns - fake.recordInvocation("DeleteAllOf", []interface{}{arg1, arg2, arg3}) - fake.deleteAllOfMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CrtClient) DeleteAllOfCallCount() int { - fake.deleteAllOfMutex.RLock() - defer fake.deleteAllOfMutex.RUnlock() - return len(fake.deleteAllOfArgsForCall) -} - -func (fake *CrtClient) DeleteAllOfCalls(stub func(context.Context, client.Object, ...client.DeleteAllOfOption) error) { - fake.deleteAllOfMutex.Lock() - defer fake.deleteAllOfMutex.Unlock() - fake.DeleteAllOfStub = stub -} - -func (fake *CrtClient) DeleteAllOfArgsForCall(i int) (context.Context, client.Object, []client.DeleteAllOfOption) { - fake.deleteAllOfMutex.RLock() - defer fake.deleteAllOfMutex.RUnlock() - argsForCall := fake.deleteAllOfArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CrtClient) DeleteAllOfReturns(result1 error) { - fake.deleteAllOfMutex.Lock() - defer fake.deleteAllOfMutex.Unlock() - fake.DeleteAllOfStub = nil - fake.deleteAllOfReturns = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) DeleteAllOfReturnsOnCall(i int, result1 error) { - fake.deleteAllOfMutex.Lock() - defer fake.deleteAllOfMutex.Unlock() - fake.DeleteAllOfStub = nil - if fake.deleteAllOfReturnsOnCall == nil { - fake.deleteAllOfReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteAllOfReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) Get(arg1 context.Context, arg2 types.NamespacedName, arg3 client.Object) error { - fake.getMutex.Lock() - ret, specificReturn := fake.getReturnsOnCall[len(fake.getArgsForCall)] - fake.getArgsForCall = append(fake.getArgsForCall, struct { - arg1 context.Context - arg2 types.NamespacedName - arg3 client.Object - }{arg1, arg2, arg3}) - stub := fake.GetStub - fakeReturns := fake.getReturns - fake.recordInvocation("Get", []interface{}{arg1, arg2, arg3}) - fake.getMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CrtClient) GetCallCount() int { - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - return len(fake.getArgsForCall) -} - -func (fake *CrtClient) GetCalls(stub func(context.Context, types.NamespacedName, client.Object) error) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = stub -} - -func (fake *CrtClient) GetArgsForCall(i int) (context.Context, types.NamespacedName, client.Object) { - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - argsForCall := fake.getArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CrtClient) GetReturns(result1 error) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = nil - fake.getReturns = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) GetReturnsOnCall(i int, result1 error) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = nil - if fake.getReturnsOnCall == nil { - fake.getReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.getReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) List(arg1 context.Context, arg2 client.ObjectList, arg3 ...client.ListOption) error { - fake.listMutex.Lock() - ret, specificReturn := fake.listReturnsOnCall[len(fake.listArgsForCall)] - fake.listArgsForCall = append(fake.listArgsForCall, struct { - arg1 context.Context - arg2 client.ObjectList - arg3 []client.ListOption - }{arg1, arg2, arg3}) - stub := fake.ListStub - fakeReturns := fake.listReturns - fake.recordInvocation("List", []interface{}{arg1, arg2, arg3}) - fake.listMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CrtClient) ListCallCount() int { - fake.listMutex.RLock() - defer fake.listMutex.RUnlock() - return len(fake.listArgsForCall) -} - -func (fake *CrtClient) ListCalls(stub func(context.Context, client.ObjectList, ...client.ListOption) error) { - fake.listMutex.Lock() - defer fake.listMutex.Unlock() - fake.ListStub = stub -} - -func (fake *CrtClient) ListArgsForCall(i int) (context.Context, client.ObjectList, []client.ListOption) { - fake.listMutex.RLock() - defer fake.listMutex.RUnlock() - argsForCall := fake.listArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CrtClient) ListReturns(result1 error) { - fake.listMutex.Lock() - defer fake.listMutex.Unlock() - fake.ListStub = nil - fake.listReturns = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) ListReturnsOnCall(i int, result1 error) { - fake.listMutex.Lock() - defer fake.listMutex.Unlock() - fake.ListStub = nil - if fake.listReturnsOnCall == nil { - fake.listReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.listReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) Patch(arg1 context.Context, arg2 client.Object, arg3 client.Patch, arg4 ...client.PatchOption) error { - fake.patchMutex.Lock() - ret, specificReturn := fake.patchReturnsOnCall[len(fake.patchArgsForCall)] - fake.patchArgsForCall = append(fake.patchArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 client.Patch - arg4 []client.PatchOption - }{arg1, arg2, arg3, arg4}) - stub := fake.PatchStub - fakeReturns := fake.patchReturns - fake.recordInvocation("Patch", []interface{}{arg1, arg2, arg3, arg4}) - fake.patchMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CrtClient) PatchCallCount() int { - fake.patchMutex.RLock() - defer fake.patchMutex.RUnlock() - return len(fake.patchArgsForCall) -} - -func (fake *CrtClient) PatchCalls(stub func(context.Context, client.Object, client.Patch, ...client.PatchOption) error) { - fake.patchMutex.Lock() - defer fake.patchMutex.Unlock() - fake.PatchStub = stub -} - -func (fake *CrtClient) PatchArgsForCall(i int) (context.Context, client.Object, client.Patch, []client.PatchOption) { - fake.patchMutex.RLock() - defer fake.patchMutex.RUnlock() - argsForCall := fake.patchArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *CrtClient) PatchReturns(result1 error) { - fake.patchMutex.Lock() - defer fake.patchMutex.Unlock() - fake.PatchStub = nil - fake.patchReturns = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) PatchReturnsOnCall(i int, result1 error) { - fake.patchMutex.Lock() - defer fake.patchMutex.Unlock() - fake.PatchStub = nil - if fake.patchReturnsOnCall == nil { - fake.patchReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) RESTMapper() meta.RESTMapper { - fake.rESTMapperMutex.Lock() - ret, specificReturn := fake.rESTMapperReturnsOnCall[len(fake.rESTMapperArgsForCall)] - fake.rESTMapperArgsForCall = append(fake.rESTMapperArgsForCall, struct { - }{}) - stub := fake.RESTMapperStub - fakeReturns := fake.rESTMapperReturns - fake.recordInvocation("RESTMapper", []interface{}{}) - fake.rESTMapperMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CrtClient) RESTMapperCallCount() int { - fake.rESTMapperMutex.RLock() - defer fake.rESTMapperMutex.RUnlock() - return len(fake.rESTMapperArgsForCall) -} - -func (fake *CrtClient) RESTMapperCalls(stub func() meta.RESTMapper) { - fake.rESTMapperMutex.Lock() - defer fake.rESTMapperMutex.Unlock() - fake.RESTMapperStub = stub -} - -func (fake *CrtClient) RESTMapperReturns(result1 meta.RESTMapper) { - fake.rESTMapperMutex.Lock() - defer fake.rESTMapperMutex.Unlock() - fake.RESTMapperStub = nil - fake.rESTMapperReturns = struct { - result1 meta.RESTMapper - }{result1} -} - -func (fake *CrtClient) RESTMapperReturnsOnCall(i int, result1 meta.RESTMapper) { - fake.rESTMapperMutex.Lock() - defer fake.rESTMapperMutex.Unlock() - fake.RESTMapperStub = nil - if fake.rESTMapperReturnsOnCall == nil { - fake.rESTMapperReturnsOnCall = make(map[int]struct { - result1 meta.RESTMapper - }) - } - fake.rESTMapperReturnsOnCall[i] = struct { - result1 meta.RESTMapper - }{result1} -} - -func (fake *CrtClient) Scheme() *runtime.Scheme { - fake.schemeMutex.Lock() - ret, specificReturn := fake.schemeReturnsOnCall[len(fake.schemeArgsForCall)] - fake.schemeArgsForCall = append(fake.schemeArgsForCall, struct { - }{}) - stub := fake.SchemeStub - fakeReturns := fake.schemeReturns - fake.recordInvocation("Scheme", []interface{}{}) - fake.schemeMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CrtClient) SchemeCallCount() int { - fake.schemeMutex.RLock() - defer fake.schemeMutex.RUnlock() - return len(fake.schemeArgsForCall) -} - -func (fake *CrtClient) SchemeCalls(stub func() *runtime.Scheme) { - fake.schemeMutex.Lock() - defer fake.schemeMutex.Unlock() - fake.SchemeStub = stub -} - -func (fake *CrtClient) SchemeReturns(result1 *runtime.Scheme) { - fake.schemeMutex.Lock() - defer fake.schemeMutex.Unlock() - fake.SchemeStub = nil - fake.schemeReturns = struct { - result1 *runtime.Scheme - }{result1} -} - -func (fake *CrtClient) SchemeReturnsOnCall(i int, result1 *runtime.Scheme) { - fake.schemeMutex.Lock() - defer fake.schemeMutex.Unlock() - fake.SchemeStub = nil - if fake.schemeReturnsOnCall == nil { - fake.schemeReturnsOnCall = make(map[int]struct { - result1 *runtime.Scheme - }) - } - fake.schemeReturnsOnCall[i] = struct { - result1 *runtime.Scheme - }{result1} -} - -func (fake *CrtClient) Status() client.StatusWriter { - fake.statusMutex.Lock() - ret, specificReturn := fake.statusReturnsOnCall[len(fake.statusArgsForCall)] - fake.statusArgsForCall = append(fake.statusArgsForCall, struct { - }{}) - stub := fake.StatusStub - fakeReturns := fake.statusReturns - fake.recordInvocation("Status", []interface{}{}) - fake.statusMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CrtClient) StatusCallCount() int { - fake.statusMutex.RLock() - defer fake.statusMutex.RUnlock() - return len(fake.statusArgsForCall) -} - -func (fake *CrtClient) StatusCalls(stub func() client.StatusWriter) { - fake.statusMutex.Lock() - defer fake.statusMutex.Unlock() - fake.StatusStub = stub -} - -func (fake *CrtClient) StatusReturns(result1 client.StatusWriter) { - fake.statusMutex.Lock() - defer fake.statusMutex.Unlock() - fake.StatusStub = nil - fake.statusReturns = struct { - result1 client.StatusWriter - }{result1} -} - -func (fake *CrtClient) StatusReturnsOnCall(i int, result1 client.StatusWriter) { - fake.statusMutex.Lock() - defer fake.statusMutex.Unlock() - fake.StatusStub = nil - if fake.statusReturnsOnCall == nil { - fake.statusReturnsOnCall = make(map[int]struct { - result1 client.StatusWriter - }) - } - fake.statusReturnsOnCall[i] = struct { - result1 client.StatusWriter - }{result1} -} - -func (fake *CrtClient) Update(arg1 context.Context, arg2 client.Object, arg3 ...client.UpdateOption) error { - fake.updateMutex.Lock() - ret, specificReturn := fake.updateReturnsOnCall[len(fake.updateArgsForCall)] - fake.updateArgsForCall = append(fake.updateArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.UpdateOption - }{arg1, arg2, arg3}) - stub := fake.UpdateStub - fakeReturns := fake.updateReturns - fake.recordInvocation("Update", []interface{}{arg1, arg2, arg3}) - fake.updateMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CrtClient) UpdateCallCount() int { - fake.updateMutex.RLock() - defer fake.updateMutex.RUnlock() - return len(fake.updateArgsForCall) -} - -func (fake *CrtClient) UpdateCalls(stub func(context.Context, client.Object, ...client.UpdateOption) error) { - fake.updateMutex.Lock() - defer fake.updateMutex.Unlock() - fake.UpdateStub = stub -} - -func (fake *CrtClient) UpdateArgsForCall(i int) (context.Context, client.Object, []client.UpdateOption) { - fake.updateMutex.RLock() - defer fake.updateMutex.RUnlock() - argsForCall := fake.updateArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CrtClient) UpdateReturns(result1 error) { - fake.updateMutex.Lock() - defer fake.updateMutex.Unlock() - fake.UpdateStub = nil - fake.updateReturns = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) UpdateReturnsOnCall(i int, result1 error) { - fake.updateMutex.Lock() - defer fake.updateMutex.Unlock() - fake.UpdateStub = nil - if fake.updateReturnsOnCall == nil { - fake.updateReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CrtClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - fake.deleteAllOfMutex.RLock() - defer fake.deleteAllOfMutex.RUnlock() - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - fake.listMutex.RLock() - defer fake.listMutex.RUnlock() - fake.patchMutex.RLock() - defer fake.patchMutex.RUnlock() - fake.rESTMapperMutex.RLock() - defer fake.rESTMapperMutex.RUnlock() - fake.schemeMutex.RLock() - defer fake.schemeMutex.RUnlock() - fake.statusMutex.RLock() - defer fake.statusMutex.RUnlock() - fake.updateMutex.RLock() - defer fake.updateMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *CrtClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ packageclient.CrtClient = new(CrtClient) diff --git a/packageclients/pkg/fakes/kappclient.go b/packageclients/pkg/fakes/kappclient.go deleted file mode 100644 index 8ccfd25260..0000000000 --- a/packageclients/pkg/fakes/kappclient.go +++ /dev/null @@ -1,1527 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - v1 "k8s.io/api/core/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - - v1alpha1a "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - v1alpha1b "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - v1alpha1c "github.com/vmware-tanzu/carvel-secretgen-controller/pkg/apis/secretgen2/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/kappclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -type KappClient struct { - CreatePackageInstallStub func(*v1alpha1.PackageInstall, *packagedatamodel.PkgPluginResourceCreationStatus) error - createPackageInstallMutex sync.RWMutex - createPackageInstallArgsForCall []struct { - arg1 *v1alpha1.PackageInstall - arg2 *packagedatamodel.PkgPluginResourceCreationStatus - } - createPackageInstallReturns struct { - result1 error - } - createPackageInstallReturnsOnCall map[int]struct { - result1 error - } - CreatePackageRepositoryStub func(*v1alpha1.PackageRepository) error - createPackageRepositoryMutex sync.RWMutex - createPackageRepositoryArgsForCall []struct { - arg1 *v1alpha1.PackageRepository - } - createPackageRepositoryReturns struct { - result1 error - } - createPackageRepositoryReturnsOnCall map[int]struct { - result1 error - } - DeletePackageRepositoryStub func(*v1alpha1.PackageRepository) error - deletePackageRepositoryMutex sync.RWMutex - deletePackageRepositoryArgsForCall []struct { - arg1 *v1alpha1.PackageRepository - } - deletePackageRepositoryReturns struct { - result1 error - } - deletePackageRepositoryReturnsOnCall map[int]struct { - result1 error - } - GetAppCRStub func(string, string) (*v1alpha1a.App, error) - getAppCRMutex sync.RWMutex - getAppCRArgsForCall []struct { - arg1 string - arg2 string - } - getAppCRReturns struct { - result1 *v1alpha1a.App - result2 error - } - getAppCRReturnsOnCall map[int]struct { - result1 *v1alpha1a.App - result2 error - } - GetClientStub func() client.Client - getClientMutex sync.RWMutex - getClientArgsForCall []struct { - } - getClientReturns struct { - result1 client.Client - } - getClientReturnsOnCall map[int]struct { - result1 client.Client - } - GetPackageStub func(string, string) (*v1alpha1b.Package, error) - getPackageMutex sync.RWMutex - getPackageArgsForCall []struct { - arg1 string - arg2 string - } - getPackageReturns struct { - result1 *v1alpha1b.Package - result2 error - } - getPackageReturnsOnCall map[int]struct { - result1 *v1alpha1b.Package - result2 error - } - GetPackageInstallStub func(string, string) (*v1alpha1.PackageInstall, error) - getPackageInstallMutex sync.RWMutex - getPackageInstallArgsForCall []struct { - arg1 string - arg2 string - } - getPackageInstallReturns struct { - result1 *v1alpha1.PackageInstall - result2 error - } - getPackageInstallReturnsOnCall map[int]struct { - result1 *v1alpha1.PackageInstall - result2 error - } - GetPackageMetadataByNameStub func(string, string) (*v1alpha1b.PackageMetadata, error) - getPackageMetadataByNameMutex sync.RWMutex - getPackageMetadataByNameArgsForCall []struct { - arg1 string - arg2 string - } - getPackageMetadataByNameReturns struct { - result1 *v1alpha1b.PackageMetadata - result2 error - } - getPackageMetadataByNameReturnsOnCall map[int]struct { - result1 *v1alpha1b.PackageMetadata - result2 error - } - GetPackageRepositoryStub func(string, string) (*v1alpha1.PackageRepository, error) - getPackageRepositoryMutex sync.RWMutex - getPackageRepositoryArgsForCall []struct { - arg1 string - arg2 string - } - getPackageRepositoryReturns struct { - result1 *v1alpha1.PackageRepository - result2 error - } - getPackageRepositoryReturnsOnCall map[int]struct { - result1 *v1alpha1.PackageRepository - result2 error - } - GetSecretExportStub func(string, string) (*v1alpha1c.SecretExport, error) - getSecretExportMutex sync.RWMutex - getSecretExportArgsForCall []struct { - arg1 string - arg2 string - } - getSecretExportReturns struct { - result1 *v1alpha1c.SecretExport - result2 error - } - getSecretExportReturnsOnCall map[int]struct { - result1 *v1alpha1c.SecretExport - result2 error - } - GetSecretValueStub func(string, string) ([]byte, error) - getSecretValueMutex sync.RWMutex - getSecretValueArgsForCall []struct { - arg1 string - arg2 string - } - getSecretValueReturns struct { - result1 []byte - result2 error - } - getSecretValueReturnsOnCall map[int]struct { - result1 []byte - result2 error - } - ListPackageInstallsStub func(string) (*v1alpha1.PackageInstallList, error) - listPackageInstallsMutex sync.RWMutex - listPackageInstallsArgsForCall []struct { - arg1 string - } - listPackageInstallsReturns struct { - result1 *v1alpha1.PackageInstallList - result2 error - } - listPackageInstallsReturnsOnCall map[int]struct { - result1 *v1alpha1.PackageInstallList - result2 error - } - ListPackageMetadataStub func(string) (*v1alpha1b.PackageMetadataList, error) - listPackageMetadataMutex sync.RWMutex - listPackageMetadataArgsForCall []struct { - arg1 string - } - listPackageMetadataReturns struct { - result1 *v1alpha1b.PackageMetadataList - result2 error - } - listPackageMetadataReturnsOnCall map[int]struct { - result1 *v1alpha1b.PackageMetadataList - result2 error - } - ListPackageRepositoriesStub func(string) (*v1alpha1.PackageRepositoryList, error) - listPackageRepositoriesMutex sync.RWMutex - listPackageRepositoriesArgsForCall []struct { - arg1 string - } - listPackageRepositoriesReturns struct { - result1 *v1alpha1.PackageRepositoryList - result2 error - } - listPackageRepositoriesReturnsOnCall map[int]struct { - result1 *v1alpha1.PackageRepositoryList - result2 error - } - ListPackagesStub func(string, string) (*v1alpha1b.PackageList, error) - listPackagesMutex sync.RWMutex - listPackagesArgsForCall []struct { - arg1 string - arg2 string - } - listPackagesReturns struct { - result1 *v1alpha1b.PackageList - result2 error - } - listPackagesReturnsOnCall map[int]struct { - result1 *v1alpha1b.PackageList - result2 error - } - ListRegistrySecretsStub func(string) (*v1.SecretList, error) - listRegistrySecretsMutex sync.RWMutex - listRegistrySecretsArgsForCall []struct { - arg1 string - } - listRegistrySecretsReturns struct { - result1 *v1.SecretList - result2 error - } - listRegistrySecretsReturnsOnCall map[int]struct { - result1 *v1.SecretList - result2 error - } - ListSecretExportsStub func(string) (*v1alpha1c.SecretExportList, error) - listSecretExportsMutex sync.RWMutex - listSecretExportsArgsForCall []struct { - arg1 string - } - listSecretExportsReturns struct { - result1 *v1alpha1c.SecretExportList - result2 error - } - listSecretExportsReturnsOnCall map[int]struct { - result1 *v1alpha1c.SecretExportList - result2 error - } - UpdatePackageInstallStub func(*v1alpha1.PackageInstall, *packagedatamodel.PkgPluginResourceCreationStatus) error - updatePackageInstallMutex sync.RWMutex - updatePackageInstallArgsForCall []struct { - arg1 *v1alpha1.PackageInstall - arg2 *packagedatamodel.PkgPluginResourceCreationStatus - } - updatePackageInstallReturns struct { - result1 error - } - updatePackageInstallReturnsOnCall map[int]struct { - result1 error - } - UpdatePackageRepositoryStub func(*v1alpha1.PackageRepository) error - updatePackageRepositoryMutex sync.RWMutex - updatePackageRepositoryArgsForCall []struct { - arg1 *v1alpha1.PackageRepository - } - updatePackageRepositoryReturns struct { - result1 error - } - updatePackageRepositoryReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *KappClient) CreatePackageInstall(arg1 *v1alpha1.PackageInstall, arg2 *packagedatamodel.PkgPluginResourceCreationStatus) error { - fake.createPackageInstallMutex.Lock() - ret, specificReturn := fake.createPackageInstallReturnsOnCall[len(fake.createPackageInstallArgsForCall)] - fake.createPackageInstallArgsForCall = append(fake.createPackageInstallArgsForCall, struct { - arg1 *v1alpha1.PackageInstall - arg2 *packagedatamodel.PkgPluginResourceCreationStatus - }{arg1, arg2}) - stub := fake.CreatePackageInstallStub - fakeReturns := fake.createPackageInstallReturns - fake.recordInvocation("CreatePackageInstall", []interface{}{arg1, arg2}) - fake.createPackageInstallMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *KappClient) CreatePackageInstallCallCount() int { - fake.createPackageInstallMutex.RLock() - defer fake.createPackageInstallMutex.RUnlock() - return len(fake.createPackageInstallArgsForCall) -} - -func (fake *KappClient) CreatePackageInstallCalls(stub func(*v1alpha1.PackageInstall, *packagedatamodel.PkgPluginResourceCreationStatus) error) { - fake.createPackageInstallMutex.Lock() - defer fake.createPackageInstallMutex.Unlock() - fake.CreatePackageInstallStub = stub -} - -func (fake *KappClient) CreatePackageInstallArgsForCall(i int) (*v1alpha1.PackageInstall, *packagedatamodel.PkgPluginResourceCreationStatus) { - fake.createPackageInstallMutex.RLock() - defer fake.createPackageInstallMutex.RUnlock() - argsForCall := fake.createPackageInstallArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KappClient) CreatePackageInstallReturns(result1 error) { - fake.createPackageInstallMutex.Lock() - defer fake.createPackageInstallMutex.Unlock() - fake.CreatePackageInstallStub = nil - fake.createPackageInstallReturns = struct { - result1 error - }{result1} -} - -func (fake *KappClient) CreatePackageInstallReturnsOnCall(i int, result1 error) { - fake.createPackageInstallMutex.Lock() - defer fake.createPackageInstallMutex.Unlock() - fake.CreatePackageInstallStub = nil - if fake.createPackageInstallReturnsOnCall == nil { - fake.createPackageInstallReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.createPackageInstallReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *KappClient) CreatePackageRepository(arg1 *v1alpha1.PackageRepository) error { - fake.createPackageRepositoryMutex.Lock() - ret, specificReturn := fake.createPackageRepositoryReturnsOnCall[len(fake.createPackageRepositoryArgsForCall)] - fake.createPackageRepositoryArgsForCall = append(fake.createPackageRepositoryArgsForCall, struct { - arg1 *v1alpha1.PackageRepository - }{arg1}) - stub := fake.CreatePackageRepositoryStub - fakeReturns := fake.createPackageRepositoryReturns - fake.recordInvocation("CreatePackageRepository", []interface{}{arg1}) - fake.createPackageRepositoryMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *KappClient) CreatePackageRepositoryCallCount() int { - fake.createPackageRepositoryMutex.RLock() - defer fake.createPackageRepositoryMutex.RUnlock() - return len(fake.createPackageRepositoryArgsForCall) -} - -func (fake *KappClient) CreatePackageRepositoryCalls(stub func(*v1alpha1.PackageRepository) error) { - fake.createPackageRepositoryMutex.Lock() - defer fake.createPackageRepositoryMutex.Unlock() - fake.CreatePackageRepositoryStub = stub -} - -func (fake *KappClient) CreatePackageRepositoryArgsForCall(i int) *v1alpha1.PackageRepository { - fake.createPackageRepositoryMutex.RLock() - defer fake.createPackageRepositoryMutex.RUnlock() - argsForCall := fake.createPackageRepositoryArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *KappClient) CreatePackageRepositoryReturns(result1 error) { - fake.createPackageRepositoryMutex.Lock() - defer fake.createPackageRepositoryMutex.Unlock() - fake.CreatePackageRepositoryStub = nil - fake.createPackageRepositoryReturns = struct { - result1 error - }{result1} -} - -func (fake *KappClient) CreatePackageRepositoryReturnsOnCall(i int, result1 error) { - fake.createPackageRepositoryMutex.Lock() - defer fake.createPackageRepositoryMutex.Unlock() - fake.CreatePackageRepositoryStub = nil - if fake.createPackageRepositoryReturnsOnCall == nil { - fake.createPackageRepositoryReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.createPackageRepositoryReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *KappClient) DeletePackageRepository(arg1 *v1alpha1.PackageRepository) error { - fake.deletePackageRepositoryMutex.Lock() - ret, specificReturn := fake.deletePackageRepositoryReturnsOnCall[len(fake.deletePackageRepositoryArgsForCall)] - fake.deletePackageRepositoryArgsForCall = append(fake.deletePackageRepositoryArgsForCall, struct { - arg1 *v1alpha1.PackageRepository - }{arg1}) - stub := fake.DeletePackageRepositoryStub - fakeReturns := fake.deletePackageRepositoryReturns - fake.recordInvocation("DeletePackageRepository", []interface{}{arg1}) - fake.deletePackageRepositoryMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *KappClient) DeletePackageRepositoryCallCount() int { - fake.deletePackageRepositoryMutex.RLock() - defer fake.deletePackageRepositoryMutex.RUnlock() - return len(fake.deletePackageRepositoryArgsForCall) -} - -func (fake *KappClient) DeletePackageRepositoryCalls(stub func(*v1alpha1.PackageRepository) error) { - fake.deletePackageRepositoryMutex.Lock() - defer fake.deletePackageRepositoryMutex.Unlock() - fake.DeletePackageRepositoryStub = stub -} - -func (fake *KappClient) DeletePackageRepositoryArgsForCall(i int) *v1alpha1.PackageRepository { - fake.deletePackageRepositoryMutex.RLock() - defer fake.deletePackageRepositoryMutex.RUnlock() - argsForCall := fake.deletePackageRepositoryArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *KappClient) DeletePackageRepositoryReturns(result1 error) { - fake.deletePackageRepositoryMutex.Lock() - defer fake.deletePackageRepositoryMutex.Unlock() - fake.DeletePackageRepositoryStub = nil - fake.deletePackageRepositoryReturns = struct { - result1 error - }{result1} -} - -func (fake *KappClient) DeletePackageRepositoryReturnsOnCall(i int, result1 error) { - fake.deletePackageRepositoryMutex.Lock() - defer fake.deletePackageRepositoryMutex.Unlock() - fake.DeletePackageRepositoryStub = nil - if fake.deletePackageRepositoryReturnsOnCall == nil { - fake.deletePackageRepositoryReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deletePackageRepositoryReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *KappClient) GetAppCR(arg1 string, arg2 string) (*v1alpha1a.App, error) { - fake.getAppCRMutex.Lock() - ret, specificReturn := fake.getAppCRReturnsOnCall[len(fake.getAppCRArgsForCall)] - fake.getAppCRArgsForCall = append(fake.getAppCRArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetAppCRStub - fakeReturns := fake.getAppCRReturns - fake.recordInvocation("GetAppCR", []interface{}{arg1, arg2}) - fake.getAppCRMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) GetAppCRCallCount() int { - fake.getAppCRMutex.RLock() - defer fake.getAppCRMutex.RUnlock() - return len(fake.getAppCRArgsForCall) -} - -func (fake *KappClient) GetAppCRCalls(stub func(string, string) (*v1alpha1a.App, error)) { - fake.getAppCRMutex.Lock() - defer fake.getAppCRMutex.Unlock() - fake.GetAppCRStub = stub -} - -func (fake *KappClient) GetAppCRArgsForCall(i int) (string, string) { - fake.getAppCRMutex.RLock() - defer fake.getAppCRMutex.RUnlock() - argsForCall := fake.getAppCRArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KappClient) GetAppCRReturns(result1 *v1alpha1a.App, result2 error) { - fake.getAppCRMutex.Lock() - defer fake.getAppCRMutex.Unlock() - fake.GetAppCRStub = nil - fake.getAppCRReturns = struct { - result1 *v1alpha1a.App - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetAppCRReturnsOnCall(i int, result1 *v1alpha1a.App, result2 error) { - fake.getAppCRMutex.Lock() - defer fake.getAppCRMutex.Unlock() - fake.GetAppCRStub = nil - if fake.getAppCRReturnsOnCall == nil { - fake.getAppCRReturnsOnCall = make(map[int]struct { - result1 *v1alpha1a.App - result2 error - }) - } - fake.getAppCRReturnsOnCall[i] = struct { - result1 *v1alpha1a.App - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetClient() client.Client { - fake.getClientMutex.Lock() - ret, specificReturn := fake.getClientReturnsOnCall[len(fake.getClientArgsForCall)] - fake.getClientArgsForCall = append(fake.getClientArgsForCall, struct { - }{}) - stub := fake.GetClientStub - fakeReturns := fake.getClientReturns - fake.recordInvocation("GetClient", []interface{}{}) - fake.getClientMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *KappClient) GetClientCallCount() int { - fake.getClientMutex.RLock() - defer fake.getClientMutex.RUnlock() - return len(fake.getClientArgsForCall) -} - -func (fake *KappClient) GetClientCalls(stub func() client.Client) { - fake.getClientMutex.Lock() - defer fake.getClientMutex.Unlock() - fake.GetClientStub = stub -} - -func (fake *KappClient) GetClientReturns(result1 client.Client) { - fake.getClientMutex.Lock() - defer fake.getClientMutex.Unlock() - fake.GetClientStub = nil - fake.getClientReturns = struct { - result1 client.Client - }{result1} -} - -func (fake *KappClient) GetClientReturnsOnCall(i int, result1 client.Client) { - fake.getClientMutex.Lock() - defer fake.getClientMutex.Unlock() - fake.GetClientStub = nil - if fake.getClientReturnsOnCall == nil { - fake.getClientReturnsOnCall = make(map[int]struct { - result1 client.Client - }) - } - fake.getClientReturnsOnCall[i] = struct { - result1 client.Client - }{result1} -} - -func (fake *KappClient) GetPackage(arg1 string, arg2 string) (*v1alpha1b.Package, error) { - fake.getPackageMutex.Lock() - ret, specificReturn := fake.getPackageReturnsOnCall[len(fake.getPackageArgsForCall)] - fake.getPackageArgsForCall = append(fake.getPackageArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetPackageStub - fakeReturns := fake.getPackageReturns - fake.recordInvocation("GetPackage", []interface{}{arg1, arg2}) - fake.getPackageMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) GetPackageCallCount() int { - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - return len(fake.getPackageArgsForCall) -} - -func (fake *KappClient) GetPackageCalls(stub func(string, string) (*v1alpha1b.Package, error)) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = stub -} - -func (fake *KappClient) GetPackageArgsForCall(i int) (string, string) { - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - argsForCall := fake.getPackageArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KappClient) GetPackageReturns(result1 *v1alpha1b.Package, result2 error) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = nil - fake.getPackageReturns = struct { - result1 *v1alpha1b.Package - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetPackageReturnsOnCall(i int, result1 *v1alpha1b.Package, result2 error) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = nil - if fake.getPackageReturnsOnCall == nil { - fake.getPackageReturnsOnCall = make(map[int]struct { - result1 *v1alpha1b.Package - result2 error - }) - } - fake.getPackageReturnsOnCall[i] = struct { - result1 *v1alpha1b.Package - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetPackageInstall(arg1 string, arg2 string) (*v1alpha1.PackageInstall, error) { - fake.getPackageInstallMutex.Lock() - ret, specificReturn := fake.getPackageInstallReturnsOnCall[len(fake.getPackageInstallArgsForCall)] - fake.getPackageInstallArgsForCall = append(fake.getPackageInstallArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetPackageInstallStub - fakeReturns := fake.getPackageInstallReturns - fake.recordInvocation("GetPackageInstall", []interface{}{arg1, arg2}) - fake.getPackageInstallMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) GetPackageInstallCallCount() int { - fake.getPackageInstallMutex.RLock() - defer fake.getPackageInstallMutex.RUnlock() - return len(fake.getPackageInstallArgsForCall) -} - -func (fake *KappClient) GetPackageInstallCalls(stub func(string, string) (*v1alpha1.PackageInstall, error)) { - fake.getPackageInstallMutex.Lock() - defer fake.getPackageInstallMutex.Unlock() - fake.GetPackageInstallStub = stub -} - -func (fake *KappClient) GetPackageInstallArgsForCall(i int) (string, string) { - fake.getPackageInstallMutex.RLock() - defer fake.getPackageInstallMutex.RUnlock() - argsForCall := fake.getPackageInstallArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KappClient) GetPackageInstallReturns(result1 *v1alpha1.PackageInstall, result2 error) { - fake.getPackageInstallMutex.Lock() - defer fake.getPackageInstallMutex.Unlock() - fake.GetPackageInstallStub = nil - fake.getPackageInstallReturns = struct { - result1 *v1alpha1.PackageInstall - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetPackageInstallReturnsOnCall(i int, result1 *v1alpha1.PackageInstall, result2 error) { - fake.getPackageInstallMutex.Lock() - defer fake.getPackageInstallMutex.Unlock() - fake.GetPackageInstallStub = nil - if fake.getPackageInstallReturnsOnCall == nil { - fake.getPackageInstallReturnsOnCall = make(map[int]struct { - result1 *v1alpha1.PackageInstall - result2 error - }) - } - fake.getPackageInstallReturnsOnCall[i] = struct { - result1 *v1alpha1.PackageInstall - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetPackageMetadataByName(arg1 string, arg2 string) (*v1alpha1b.PackageMetadata, error) { - fake.getPackageMetadataByNameMutex.Lock() - ret, specificReturn := fake.getPackageMetadataByNameReturnsOnCall[len(fake.getPackageMetadataByNameArgsForCall)] - fake.getPackageMetadataByNameArgsForCall = append(fake.getPackageMetadataByNameArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetPackageMetadataByNameStub - fakeReturns := fake.getPackageMetadataByNameReturns - fake.recordInvocation("GetPackageMetadataByName", []interface{}{arg1, arg2}) - fake.getPackageMetadataByNameMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) GetPackageMetadataByNameCallCount() int { - fake.getPackageMetadataByNameMutex.RLock() - defer fake.getPackageMetadataByNameMutex.RUnlock() - return len(fake.getPackageMetadataByNameArgsForCall) -} - -func (fake *KappClient) GetPackageMetadataByNameCalls(stub func(string, string) (*v1alpha1b.PackageMetadata, error)) { - fake.getPackageMetadataByNameMutex.Lock() - defer fake.getPackageMetadataByNameMutex.Unlock() - fake.GetPackageMetadataByNameStub = stub -} - -func (fake *KappClient) GetPackageMetadataByNameArgsForCall(i int) (string, string) { - fake.getPackageMetadataByNameMutex.RLock() - defer fake.getPackageMetadataByNameMutex.RUnlock() - argsForCall := fake.getPackageMetadataByNameArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KappClient) GetPackageMetadataByNameReturns(result1 *v1alpha1b.PackageMetadata, result2 error) { - fake.getPackageMetadataByNameMutex.Lock() - defer fake.getPackageMetadataByNameMutex.Unlock() - fake.GetPackageMetadataByNameStub = nil - fake.getPackageMetadataByNameReturns = struct { - result1 *v1alpha1b.PackageMetadata - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetPackageMetadataByNameReturnsOnCall(i int, result1 *v1alpha1b.PackageMetadata, result2 error) { - fake.getPackageMetadataByNameMutex.Lock() - defer fake.getPackageMetadataByNameMutex.Unlock() - fake.GetPackageMetadataByNameStub = nil - if fake.getPackageMetadataByNameReturnsOnCall == nil { - fake.getPackageMetadataByNameReturnsOnCall = make(map[int]struct { - result1 *v1alpha1b.PackageMetadata - result2 error - }) - } - fake.getPackageMetadataByNameReturnsOnCall[i] = struct { - result1 *v1alpha1b.PackageMetadata - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetPackageRepository(arg1 string, arg2 string) (*v1alpha1.PackageRepository, error) { - fake.getPackageRepositoryMutex.Lock() - ret, specificReturn := fake.getPackageRepositoryReturnsOnCall[len(fake.getPackageRepositoryArgsForCall)] - fake.getPackageRepositoryArgsForCall = append(fake.getPackageRepositoryArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetPackageRepositoryStub - fakeReturns := fake.getPackageRepositoryReturns - fake.recordInvocation("GetPackageRepository", []interface{}{arg1, arg2}) - fake.getPackageRepositoryMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) GetPackageRepositoryCallCount() int { - fake.getPackageRepositoryMutex.RLock() - defer fake.getPackageRepositoryMutex.RUnlock() - return len(fake.getPackageRepositoryArgsForCall) -} - -func (fake *KappClient) GetPackageRepositoryCalls(stub func(string, string) (*v1alpha1.PackageRepository, error)) { - fake.getPackageRepositoryMutex.Lock() - defer fake.getPackageRepositoryMutex.Unlock() - fake.GetPackageRepositoryStub = stub -} - -func (fake *KappClient) GetPackageRepositoryArgsForCall(i int) (string, string) { - fake.getPackageRepositoryMutex.RLock() - defer fake.getPackageRepositoryMutex.RUnlock() - argsForCall := fake.getPackageRepositoryArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KappClient) GetPackageRepositoryReturns(result1 *v1alpha1.PackageRepository, result2 error) { - fake.getPackageRepositoryMutex.Lock() - defer fake.getPackageRepositoryMutex.Unlock() - fake.GetPackageRepositoryStub = nil - fake.getPackageRepositoryReturns = struct { - result1 *v1alpha1.PackageRepository - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetPackageRepositoryReturnsOnCall(i int, result1 *v1alpha1.PackageRepository, result2 error) { - fake.getPackageRepositoryMutex.Lock() - defer fake.getPackageRepositoryMutex.Unlock() - fake.GetPackageRepositoryStub = nil - if fake.getPackageRepositoryReturnsOnCall == nil { - fake.getPackageRepositoryReturnsOnCall = make(map[int]struct { - result1 *v1alpha1.PackageRepository - result2 error - }) - } - fake.getPackageRepositoryReturnsOnCall[i] = struct { - result1 *v1alpha1.PackageRepository - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetSecretExport(arg1 string, arg2 string) (*v1alpha1c.SecretExport, error) { - fake.getSecretExportMutex.Lock() - ret, specificReturn := fake.getSecretExportReturnsOnCall[len(fake.getSecretExportArgsForCall)] - fake.getSecretExportArgsForCall = append(fake.getSecretExportArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetSecretExportStub - fakeReturns := fake.getSecretExportReturns - fake.recordInvocation("GetSecretExport", []interface{}{arg1, arg2}) - fake.getSecretExportMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) GetSecretExportCallCount() int { - fake.getSecretExportMutex.RLock() - defer fake.getSecretExportMutex.RUnlock() - return len(fake.getSecretExportArgsForCall) -} - -func (fake *KappClient) GetSecretExportCalls(stub func(string, string) (*v1alpha1c.SecretExport, error)) { - fake.getSecretExportMutex.Lock() - defer fake.getSecretExportMutex.Unlock() - fake.GetSecretExportStub = stub -} - -func (fake *KappClient) GetSecretExportArgsForCall(i int) (string, string) { - fake.getSecretExportMutex.RLock() - defer fake.getSecretExportMutex.RUnlock() - argsForCall := fake.getSecretExportArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KappClient) GetSecretExportReturns(result1 *v1alpha1c.SecretExport, result2 error) { - fake.getSecretExportMutex.Lock() - defer fake.getSecretExportMutex.Unlock() - fake.GetSecretExportStub = nil - fake.getSecretExportReturns = struct { - result1 *v1alpha1c.SecretExport - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetSecretExportReturnsOnCall(i int, result1 *v1alpha1c.SecretExport, result2 error) { - fake.getSecretExportMutex.Lock() - defer fake.getSecretExportMutex.Unlock() - fake.GetSecretExportStub = nil - if fake.getSecretExportReturnsOnCall == nil { - fake.getSecretExportReturnsOnCall = make(map[int]struct { - result1 *v1alpha1c.SecretExport - result2 error - }) - } - fake.getSecretExportReturnsOnCall[i] = struct { - result1 *v1alpha1c.SecretExport - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetSecretValue(arg1 string, arg2 string) ([]byte, error) { - fake.getSecretValueMutex.Lock() - ret, specificReturn := fake.getSecretValueReturnsOnCall[len(fake.getSecretValueArgsForCall)] - fake.getSecretValueArgsForCall = append(fake.getSecretValueArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetSecretValueStub - fakeReturns := fake.getSecretValueReturns - fake.recordInvocation("GetSecretValue", []interface{}{arg1, arg2}) - fake.getSecretValueMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) GetSecretValueCallCount() int { - fake.getSecretValueMutex.RLock() - defer fake.getSecretValueMutex.RUnlock() - return len(fake.getSecretValueArgsForCall) -} - -func (fake *KappClient) GetSecretValueCalls(stub func(string, string) ([]byte, error)) { - fake.getSecretValueMutex.Lock() - defer fake.getSecretValueMutex.Unlock() - fake.GetSecretValueStub = stub -} - -func (fake *KappClient) GetSecretValueArgsForCall(i int) (string, string) { - fake.getSecretValueMutex.RLock() - defer fake.getSecretValueMutex.RUnlock() - argsForCall := fake.getSecretValueArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KappClient) GetSecretValueReturns(result1 []byte, result2 error) { - fake.getSecretValueMutex.Lock() - defer fake.getSecretValueMutex.Unlock() - fake.GetSecretValueStub = nil - fake.getSecretValueReturns = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *KappClient) GetSecretValueReturnsOnCall(i int, result1 []byte, result2 error) { - fake.getSecretValueMutex.Lock() - defer fake.getSecretValueMutex.Unlock() - fake.GetSecretValueStub = nil - if fake.getSecretValueReturnsOnCall == nil { - fake.getSecretValueReturnsOnCall = make(map[int]struct { - result1 []byte - result2 error - }) - } - fake.getSecretValueReturnsOnCall[i] = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListPackageInstalls(arg1 string) (*v1alpha1.PackageInstallList, error) { - fake.listPackageInstallsMutex.Lock() - ret, specificReturn := fake.listPackageInstallsReturnsOnCall[len(fake.listPackageInstallsArgsForCall)] - fake.listPackageInstallsArgsForCall = append(fake.listPackageInstallsArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ListPackageInstallsStub - fakeReturns := fake.listPackageInstallsReturns - fake.recordInvocation("ListPackageInstalls", []interface{}{arg1}) - fake.listPackageInstallsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) ListPackageInstallsCallCount() int { - fake.listPackageInstallsMutex.RLock() - defer fake.listPackageInstallsMutex.RUnlock() - return len(fake.listPackageInstallsArgsForCall) -} - -func (fake *KappClient) ListPackageInstallsCalls(stub func(string) (*v1alpha1.PackageInstallList, error)) { - fake.listPackageInstallsMutex.Lock() - defer fake.listPackageInstallsMutex.Unlock() - fake.ListPackageInstallsStub = stub -} - -func (fake *KappClient) ListPackageInstallsArgsForCall(i int) string { - fake.listPackageInstallsMutex.RLock() - defer fake.listPackageInstallsMutex.RUnlock() - argsForCall := fake.listPackageInstallsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *KappClient) ListPackageInstallsReturns(result1 *v1alpha1.PackageInstallList, result2 error) { - fake.listPackageInstallsMutex.Lock() - defer fake.listPackageInstallsMutex.Unlock() - fake.ListPackageInstallsStub = nil - fake.listPackageInstallsReturns = struct { - result1 *v1alpha1.PackageInstallList - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListPackageInstallsReturnsOnCall(i int, result1 *v1alpha1.PackageInstallList, result2 error) { - fake.listPackageInstallsMutex.Lock() - defer fake.listPackageInstallsMutex.Unlock() - fake.ListPackageInstallsStub = nil - if fake.listPackageInstallsReturnsOnCall == nil { - fake.listPackageInstallsReturnsOnCall = make(map[int]struct { - result1 *v1alpha1.PackageInstallList - result2 error - }) - } - fake.listPackageInstallsReturnsOnCall[i] = struct { - result1 *v1alpha1.PackageInstallList - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListPackageMetadata(arg1 string) (*v1alpha1b.PackageMetadataList, error) { - fake.listPackageMetadataMutex.Lock() - ret, specificReturn := fake.listPackageMetadataReturnsOnCall[len(fake.listPackageMetadataArgsForCall)] - fake.listPackageMetadataArgsForCall = append(fake.listPackageMetadataArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ListPackageMetadataStub - fakeReturns := fake.listPackageMetadataReturns - fake.recordInvocation("ListPackageMetadata", []interface{}{arg1}) - fake.listPackageMetadataMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) ListPackageMetadataCallCount() int { - fake.listPackageMetadataMutex.RLock() - defer fake.listPackageMetadataMutex.RUnlock() - return len(fake.listPackageMetadataArgsForCall) -} - -func (fake *KappClient) ListPackageMetadataCalls(stub func(string) (*v1alpha1b.PackageMetadataList, error)) { - fake.listPackageMetadataMutex.Lock() - defer fake.listPackageMetadataMutex.Unlock() - fake.ListPackageMetadataStub = stub -} - -func (fake *KappClient) ListPackageMetadataArgsForCall(i int) string { - fake.listPackageMetadataMutex.RLock() - defer fake.listPackageMetadataMutex.RUnlock() - argsForCall := fake.listPackageMetadataArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *KappClient) ListPackageMetadataReturns(result1 *v1alpha1b.PackageMetadataList, result2 error) { - fake.listPackageMetadataMutex.Lock() - defer fake.listPackageMetadataMutex.Unlock() - fake.ListPackageMetadataStub = nil - fake.listPackageMetadataReturns = struct { - result1 *v1alpha1b.PackageMetadataList - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListPackageMetadataReturnsOnCall(i int, result1 *v1alpha1b.PackageMetadataList, result2 error) { - fake.listPackageMetadataMutex.Lock() - defer fake.listPackageMetadataMutex.Unlock() - fake.ListPackageMetadataStub = nil - if fake.listPackageMetadataReturnsOnCall == nil { - fake.listPackageMetadataReturnsOnCall = make(map[int]struct { - result1 *v1alpha1b.PackageMetadataList - result2 error - }) - } - fake.listPackageMetadataReturnsOnCall[i] = struct { - result1 *v1alpha1b.PackageMetadataList - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListPackageRepositories(arg1 string) (*v1alpha1.PackageRepositoryList, error) { - fake.listPackageRepositoriesMutex.Lock() - ret, specificReturn := fake.listPackageRepositoriesReturnsOnCall[len(fake.listPackageRepositoriesArgsForCall)] - fake.listPackageRepositoriesArgsForCall = append(fake.listPackageRepositoriesArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ListPackageRepositoriesStub - fakeReturns := fake.listPackageRepositoriesReturns - fake.recordInvocation("ListPackageRepositories", []interface{}{arg1}) - fake.listPackageRepositoriesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) ListPackageRepositoriesCallCount() int { - fake.listPackageRepositoriesMutex.RLock() - defer fake.listPackageRepositoriesMutex.RUnlock() - return len(fake.listPackageRepositoriesArgsForCall) -} - -func (fake *KappClient) ListPackageRepositoriesCalls(stub func(string) (*v1alpha1.PackageRepositoryList, error)) { - fake.listPackageRepositoriesMutex.Lock() - defer fake.listPackageRepositoriesMutex.Unlock() - fake.ListPackageRepositoriesStub = stub -} - -func (fake *KappClient) ListPackageRepositoriesArgsForCall(i int) string { - fake.listPackageRepositoriesMutex.RLock() - defer fake.listPackageRepositoriesMutex.RUnlock() - argsForCall := fake.listPackageRepositoriesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *KappClient) ListPackageRepositoriesReturns(result1 *v1alpha1.PackageRepositoryList, result2 error) { - fake.listPackageRepositoriesMutex.Lock() - defer fake.listPackageRepositoriesMutex.Unlock() - fake.ListPackageRepositoriesStub = nil - fake.listPackageRepositoriesReturns = struct { - result1 *v1alpha1.PackageRepositoryList - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListPackageRepositoriesReturnsOnCall(i int, result1 *v1alpha1.PackageRepositoryList, result2 error) { - fake.listPackageRepositoriesMutex.Lock() - defer fake.listPackageRepositoriesMutex.Unlock() - fake.ListPackageRepositoriesStub = nil - if fake.listPackageRepositoriesReturnsOnCall == nil { - fake.listPackageRepositoriesReturnsOnCall = make(map[int]struct { - result1 *v1alpha1.PackageRepositoryList - result2 error - }) - } - fake.listPackageRepositoriesReturnsOnCall[i] = struct { - result1 *v1alpha1.PackageRepositoryList - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListPackages(arg1 string, arg2 string) (*v1alpha1b.PackageList, error) { - fake.listPackagesMutex.Lock() - ret, specificReturn := fake.listPackagesReturnsOnCall[len(fake.listPackagesArgsForCall)] - fake.listPackagesArgsForCall = append(fake.listPackagesArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.ListPackagesStub - fakeReturns := fake.listPackagesReturns - fake.recordInvocation("ListPackages", []interface{}{arg1, arg2}) - fake.listPackagesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) ListPackagesCallCount() int { - fake.listPackagesMutex.RLock() - defer fake.listPackagesMutex.RUnlock() - return len(fake.listPackagesArgsForCall) -} - -func (fake *KappClient) ListPackagesCalls(stub func(string, string) (*v1alpha1b.PackageList, error)) { - fake.listPackagesMutex.Lock() - defer fake.listPackagesMutex.Unlock() - fake.ListPackagesStub = stub -} - -func (fake *KappClient) ListPackagesArgsForCall(i int) (string, string) { - fake.listPackagesMutex.RLock() - defer fake.listPackagesMutex.RUnlock() - argsForCall := fake.listPackagesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KappClient) ListPackagesReturns(result1 *v1alpha1b.PackageList, result2 error) { - fake.listPackagesMutex.Lock() - defer fake.listPackagesMutex.Unlock() - fake.ListPackagesStub = nil - fake.listPackagesReturns = struct { - result1 *v1alpha1b.PackageList - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListPackagesReturnsOnCall(i int, result1 *v1alpha1b.PackageList, result2 error) { - fake.listPackagesMutex.Lock() - defer fake.listPackagesMutex.Unlock() - fake.ListPackagesStub = nil - if fake.listPackagesReturnsOnCall == nil { - fake.listPackagesReturnsOnCall = make(map[int]struct { - result1 *v1alpha1b.PackageList - result2 error - }) - } - fake.listPackagesReturnsOnCall[i] = struct { - result1 *v1alpha1b.PackageList - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListRegistrySecrets(arg1 string) (*v1.SecretList, error) { - fake.listRegistrySecretsMutex.Lock() - ret, specificReturn := fake.listRegistrySecretsReturnsOnCall[len(fake.listRegistrySecretsArgsForCall)] - fake.listRegistrySecretsArgsForCall = append(fake.listRegistrySecretsArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ListRegistrySecretsStub - fakeReturns := fake.listRegistrySecretsReturns - fake.recordInvocation("ListRegistrySecrets", []interface{}{arg1}) - fake.listRegistrySecretsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) ListRegistrySecretsCallCount() int { - fake.listRegistrySecretsMutex.RLock() - defer fake.listRegistrySecretsMutex.RUnlock() - return len(fake.listRegistrySecretsArgsForCall) -} - -func (fake *KappClient) ListRegistrySecretsCalls(stub func(string) (*v1.SecretList, error)) { - fake.listRegistrySecretsMutex.Lock() - defer fake.listRegistrySecretsMutex.Unlock() - fake.ListRegistrySecretsStub = stub -} - -func (fake *KappClient) ListRegistrySecretsArgsForCall(i int) string { - fake.listRegistrySecretsMutex.RLock() - defer fake.listRegistrySecretsMutex.RUnlock() - argsForCall := fake.listRegistrySecretsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *KappClient) ListRegistrySecretsReturns(result1 *v1.SecretList, result2 error) { - fake.listRegistrySecretsMutex.Lock() - defer fake.listRegistrySecretsMutex.Unlock() - fake.ListRegistrySecretsStub = nil - fake.listRegistrySecretsReturns = struct { - result1 *v1.SecretList - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListRegistrySecretsReturnsOnCall(i int, result1 *v1.SecretList, result2 error) { - fake.listRegistrySecretsMutex.Lock() - defer fake.listRegistrySecretsMutex.Unlock() - fake.ListRegistrySecretsStub = nil - if fake.listRegistrySecretsReturnsOnCall == nil { - fake.listRegistrySecretsReturnsOnCall = make(map[int]struct { - result1 *v1.SecretList - result2 error - }) - } - fake.listRegistrySecretsReturnsOnCall[i] = struct { - result1 *v1.SecretList - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListSecretExports(arg1 string) (*v1alpha1c.SecretExportList, error) { - fake.listSecretExportsMutex.Lock() - ret, specificReturn := fake.listSecretExportsReturnsOnCall[len(fake.listSecretExportsArgsForCall)] - fake.listSecretExportsArgsForCall = append(fake.listSecretExportsArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ListSecretExportsStub - fakeReturns := fake.listSecretExportsReturns - fake.recordInvocation("ListSecretExports", []interface{}{arg1}) - fake.listSecretExportsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KappClient) ListSecretExportsCallCount() int { - fake.listSecretExportsMutex.RLock() - defer fake.listSecretExportsMutex.RUnlock() - return len(fake.listSecretExportsArgsForCall) -} - -func (fake *KappClient) ListSecretExportsCalls(stub func(string) (*v1alpha1c.SecretExportList, error)) { - fake.listSecretExportsMutex.Lock() - defer fake.listSecretExportsMutex.Unlock() - fake.ListSecretExportsStub = stub -} - -func (fake *KappClient) ListSecretExportsArgsForCall(i int) string { - fake.listSecretExportsMutex.RLock() - defer fake.listSecretExportsMutex.RUnlock() - argsForCall := fake.listSecretExportsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *KappClient) ListSecretExportsReturns(result1 *v1alpha1c.SecretExportList, result2 error) { - fake.listSecretExportsMutex.Lock() - defer fake.listSecretExportsMutex.Unlock() - fake.ListSecretExportsStub = nil - fake.listSecretExportsReturns = struct { - result1 *v1alpha1c.SecretExportList - result2 error - }{result1, result2} -} - -func (fake *KappClient) ListSecretExportsReturnsOnCall(i int, result1 *v1alpha1c.SecretExportList, result2 error) { - fake.listSecretExportsMutex.Lock() - defer fake.listSecretExportsMutex.Unlock() - fake.ListSecretExportsStub = nil - if fake.listSecretExportsReturnsOnCall == nil { - fake.listSecretExportsReturnsOnCall = make(map[int]struct { - result1 *v1alpha1c.SecretExportList - result2 error - }) - } - fake.listSecretExportsReturnsOnCall[i] = struct { - result1 *v1alpha1c.SecretExportList - result2 error - }{result1, result2} -} - -func (fake *KappClient) UpdatePackageInstall(arg1 *v1alpha1.PackageInstall, arg2 *packagedatamodel.PkgPluginResourceCreationStatus) error { - fake.updatePackageInstallMutex.Lock() - ret, specificReturn := fake.updatePackageInstallReturnsOnCall[len(fake.updatePackageInstallArgsForCall)] - fake.updatePackageInstallArgsForCall = append(fake.updatePackageInstallArgsForCall, struct { - arg1 *v1alpha1.PackageInstall - arg2 *packagedatamodel.PkgPluginResourceCreationStatus - }{arg1, arg2}) - stub := fake.UpdatePackageInstallStub - fakeReturns := fake.updatePackageInstallReturns - fake.recordInvocation("UpdatePackageInstall", []interface{}{arg1, arg2}) - fake.updatePackageInstallMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *KappClient) UpdatePackageInstallCallCount() int { - fake.updatePackageInstallMutex.RLock() - defer fake.updatePackageInstallMutex.RUnlock() - return len(fake.updatePackageInstallArgsForCall) -} - -func (fake *KappClient) UpdatePackageInstallCalls(stub func(*v1alpha1.PackageInstall, *packagedatamodel.PkgPluginResourceCreationStatus) error) { - fake.updatePackageInstallMutex.Lock() - defer fake.updatePackageInstallMutex.Unlock() - fake.UpdatePackageInstallStub = stub -} - -func (fake *KappClient) UpdatePackageInstallArgsForCall(i int) (*v1alpha1.PackageInstall, *packagedatamodel.PkgPluginResourceCreationStatus) { - fake.updatePackageInstallMutex.RLock() - defer fake.updatePackageInstallMutex.RUnlock() - argsForCall := fake.updatePackageInstallArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KappClient) UpdatePackageInstallReturns(result1 error) { - fake.updatePackageInstallMutex.Lock() - defer fake.updatePackageInstallMutex.Unlock() - fake.UpdatePackageInstallStub = nil - fake.updatePackageInstallReturns = struct { - result1 error - }{result1} -} - -func (fake *KappClient) UpdatePackageInstallReturnsOnCall(i int, result1 error) { - fake.updatePackageInstallMutex.Lock() - defer fake.updatePackageInstallMutex.Unlock() - fake.UpdatePackageInstallStub = nil - if fake.updatePackageInstallReturnsOnCall == nil { - fake.updatePackageInstallReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updatePackageInstallReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *KappClient) UpdatePackageRepository(arg1 *v1alpha1.PackageRepository) error { - fake.updatePackageRepositoryMutex.Lock() - ret, specificReturn := fake.updatePackageRepositoryReturnsOnCall[len(fake.updatePackageRepositoryArgsForCall)] - fake.updatePackageRepositoryArgsForCall = append(fake.updatePackageRepositoryArgsForCall, struct { - arg1 *v1alpha1.PackageRepository - }{arg1}) - stub := fake.UpdatePackageRepositoryStub - fakeReturns := fake.updatePackageRepositoryReturns - fake.recordInvocation("UpdatePackageRepository", []interface{}{arg1}) - fake.updatePackageRepositoryMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *KappClient) UpdatePackageRepositoryCallCount() int { - fake.updatePackageRepositoryMutex.RLock() - defer fake.updatePackageRepositoryMutex.RUnlock() - return len(fake.updatePackageRepositoryArgsForCall) -} - -func (fake *KappClient) UpdatePackageRepositoryCalls(stub func(*v1alpha1.PackageRepository) error) { - fake.updatePackageRepositoryMutex.Lock() - defer fake.updatePackageRepositoryMutex.Unlock() - fake.UpdatePackageRepositoryStub = stub -} - -func (fake *KappClient) UpdatePackageRepositoryArgsForCall(i int) *v1alpha1.PackageRepository { - fake.updatePackageRepositoryMutex.RLock() - defer fake.updatePackageRepositoryMutex.RUnlock() - argsForCall := fake.updatePackageRepositoryArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *KappClient) UpdatePackageRepositoryReturns(result1 error) { - fake.updatePackageRepositoryMutex.Lock() - defer fake.updatePackageRepositoryMutex.Unlock() - fake.UpdatePackageRepositoryStub = nil - fake.updatePackageRepositoryReturns = struct { - result1 error - }{result1} -} - -func (fake *KappClient) UpdatePackageRepositoryReturnsOnCall(i int, result1 error) { - fake.updatePackageRepositoryMutex.Lock() - defer fake.updatePackageRepositoryMutex.Unlock() - fake.UpdatePackageRepositoryStub = nil - if fake.updatePackageRepositoryReturnsOnCall == nil { - fake.updatePackageRepositoryReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updatePackageRepositoryReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *KappClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.createPackageInstallMutex.RLock() - defer fake.createPackageInstallMutex.RUnlock() - fake.createPackageRepositoryMutex.RLock() - defer fake.createPackageRepositoryMutex.RUnlock() - fake.deletePackageRepositoryMutex.RLock() - defer fake.deletePackageRepositoryMutex.RUnlock() - fake.getAppCRMutex.RLock() - defer fake.getAppCRMutex.RUnlock() - fake.getClientMutex.RLock() - defer fake.getClientMutex.RUnlock() - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - fake.getPackageInstallMutex.RLock() - defer fake.getPackageInstallMutex.RUnlock() - fake.getPackageMetadataByNameMutex.RLock() - defer fake.getPackageMetadataByNameMutex.RUnlock() - fake.getPackageRepositoryMutex.RLock() - defer fake.getPackageRepositoryMutex.RUnlock() - fake.getSecretExportMutex.RLock() - defer fake.getSecretExportMutex.RUnlock() - fake.getSecretValueMutex.RLock() - defer fake.getSecretValueMutex.RUnlock() - fake.listPackageInstallsMutex.RLock() - defer fake.listPackageInstallsMutex.RUnlock() - fake.listPackageMetadataMutex.RLock() - defer fake.listPackageMetadataMutex.RUnlock() - fake.listPackageRepositoriesMutex.RLock() - defer fake.listPackageRepositoriesMutex.RUnlock() - fake.listPackagesMutex.RLock() - defer fake.listPackagesMutex.RUnlock() - fake.listRegistrySecretsMutex.RLock() - defer fake.listRegistrySecretsMutex.RUnlock() - fake.listSecretExportsMutex.RLock() - defer fake.listSecretExportsMutex.RUnlock() - fake.updatePackageInstallMutex.RLock() - defer fake.updatePackageInstallMutex.RUnlock() - fake.updatePackageRepositoryMutex.RLock() - defer fake.updatePackageRepositoryMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *KappClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ kappclient.Client = new(KappClient) diff --git a/packageclients/pkg/fakes/packageclient.go b/packageclients/pkg/fakes/packageclient.go deleted file mode 100644 index a6d9ddf0ee..0000000000 --- a/packageclients/pkg/fakes/packageclient.go +++ /dev/null @@ -1,1771 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - v1 "k8s.io/api/core/v1" - - v1alpha1a "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - v1alpha1b "github.com/vmware-tanzu/carvel-secretgen-controller/pkg/apis/secretgen2/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -type PackageClient struct { - AddRegistrySecretStub func(*packagedatamodel.RegistrySecretOptions) error - addRegistrySecretMutex sync.RWMutex - addRegistrySecretArgsForCall []struct { - arg1 *packagedatamodel.RegistrySecretOptions - } - addRegistrySecretReturns struct { - result1 error - } - addRegistrySecretReturnsOnCall map[int]struct { - result1 error - } - AddRepositoryStub func(*packagedatamodel.RepositoryOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType) - addRepositoryMutex sync.RWMutex - addRepositoryArgsForCall []struct { - arg1 *packagedatamodel.RepositoryOptions - arg2 *packagedatamodel.PackageProgress - arg3 packagedatamodel.OperationType - } - AddRepositorySyncStub func(*packagedatamodel.RepositoryOptions, packagedatamodel.OperationType) error - addRepositorySyncMutex sync.RWMutex - addRepositorySyncArgsForCall []struct { - arg1 *packagedatamodel.RepositoryOptions - arg2 packagedatamodel.OperationType - } - addRepositorySyncReturns struct { - result1 error - } - addRepositorySyncReturnsOnCall map[int]struct { - result1 error - } - DeleteRegistrySecretStub func(*packagedatamodel.RegistrySecretOptions) (bool, error) - deleteRegistrySecretMutex sync.RWMutex - deleteRegistrySecretArgsForCall []struct { - arg1 *packagedatamodel.RegistrySecretOptions - } - deleteRegistrySecretReturns struct { - result1 bool - result2 error - } - deleteRegistrySecretReturnsOnCall map[int]struct { - result1 bool - result2 error - } - DeleteRepositoryStub func(*packagedatamodel.RepositoryOptions, *packagedatamodel.PackageProgress) - deleteRepositoryMutex sync.RWMutex - deleteRepositoryArgsForCall []struct { - arg1 *packagedatamodel.RepositoryOptions - arg2 *packagedatamodel.PackageProgress - } - DeleteRepositorySyncStub func(*packagedatamodel.RepositoryOptions) error - deleteRepositorySyncMutex sync.RWMutex - deleteRepositorySyncArgsForCall []struct { - arg1 *packagedatamodel.RepositoryOptions - } - deleteRepositorySyncReturns struct { - result1 error - } - deleteRepositorySyncReturnsOnCall map[int]struct { - result1 error - } - GetPackageStub func(*packagedatamodel.PackageOptions) (*v1alpha1.PackageMetadata, *v1alpha1.Package, error) - getPackageMutex sync.RWMutex - getPackageArgsForCall []struct { - arg1 *packagedatamodel.PackageOptions - } - getPackageReturns struct { - result1 *v1alpha1.PackageMetadata - result2 *v1alpha1.Package - result3 error - } - getPackageReturnsOnCall map[int]struct { - result1 *v1alpha1.PackageMetadata - result2 *v1alpha1.Package - result3 error - } - GetPackageInstallStub func(*packagedatamodel.PackageOptions) (*v1alpha1a.PackageInstall, error) - getPackageInstallMutex sync.RWMutex - getPackageInstallArgsForCall []struct { - arg1 *packagedatamodel.PackageOptions - } - getPackageInstallReturns struct { - result1 *v1alpha1a.PackageInstall - result2 error - } - getPackageInstallReturnsOnCall map[int]struct { - result1 *v1alpha1a.PackageInstall - result2 error - } - GetRepositoryStub func(*packagedatamodel.RepositoryOptions) (*v1alpha1a.PackageRepository, error) - getRepositoryMutex sync.RWMutex - getRepositoryArgsForCall []struct { - arg1 *packagedatamodel.RepositoryOptions - } - getRepositoryReturns struct { - result1 *v1alpha1a.PackageRepository - result2 error - } - getRepositoryReturnsOnCall map[int]struct { - result1 *v1alpha1a.PackageRepository - result2 error - } - GetSecretExportStub func(*packagedatamodel.RegistrySecretOptions) (*v1alpha1b.SecretExport, error) - getSecretExportMutex sync.RWMutex - getSecretExportArgsForCall []struct { - arg1 *packagedatamodel.RegistrySecretOptions - } - getSecretExportReturns struct { - result1 *v1alpha1b.SecretExport - result2 error - } - getSecretExportReturnsOnCall map[int]struct { - result1 *v1alpha1b.SecretExport - result2 error - } - InstallPackageStub func(*packagedatamodel.PackageOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType) - installPackageMutex sync.RWMutex - installPackageArgsForCall []struct { - arg1 *packagedatamodel.PackageOptions - arg2 *packagedatamodel.PackageProgress - arg3 packagedatamodel.OperationType - } - InstallPackageSyncStub func(*packagedatamodel.PackageOptions, packagedatamodel.OperationType) error - installPackageSyncMutex sync.RWMutex - installPackageSyncArgsForCall []struct { - arg1 *packagedatamodel.PackageOptions - arg2 packagedatamodel.OperationType - } - installPackageSyncReturns struct { - result1 error - } - installPackageSyncReturnsOnCall map[int]struct { - result1 error - } - ListPackageInstallsStub func(*packagedatamodel.PackageOptions) (*v1alpha1a.PackageInstallList, error) - listPackageInstallsMutex sync.RWMutex - listPackageInstallsArgsForCall []struct { - arg1 *packagedatamodel.PackageOptions - } - listPackageInstallsReturns struct { - result1 *v1alpha1a.PackageInstallList - result2 error - } - listPackageInstallsReturnsOnCall map[int]struct { - result1 *v1alpha1a.PackageInstallList - result2 error - } - ListPackageMetadataStub func(*packagedatamodel.PackageAvailableOptions) (*v1alpha1.PackageMetadataList, error) - listPackageMetadataMutex sync.RWMutex - listPackageMetadataArgsForCall []struct { - arg1 *packagedatamodel.PackageAvailableOptions - } - listPackageMetadataReturns struct { - result1 *v1alpha1.PackageMetadataList - result2 error - } - listPackageMetadataReturnsOnCall map[int]struct { - result1 *v1alpha1.PackageMetadataList - result2 error - } - ListPackagesStub func(*packagedatamodel.PackageAvailableOptions) (*v1alpha1.PackageList, error) - listPackagesMutex sync.RWMutex - listPackagesArgsForCall []struct { - arg1 *packagedatamodel.PackageAvailableOptions - } - listPackagesReturns struct { - result1 *v1alpha1.PackageList - result2 error - } - listPackagesReturnsOnCall map[int]struct { - result1 *v1alpha1.PackageList - result2 error - } - ListRegistrySecretsStub func(*packagedatamodel.RegistrySecretOptions) (*v1.SecretList, error) - listRegistrySecretsMutex sync.RWMutex - listRegistrySecretsArgsForCall []struct { - arg1 *packagedatamodel.RegistrySecretOptions - } - listRegistrySecretsReturns struct { - result1 *v1.SecretList - result2 error - } - listRegistrySecretsReturnsOnCall map[int]struct { - result1 *v1.SecretList - result2 error - } - ListRepositoriesStub func(*packagedatamodel.RepositoryOptions) (*v1alpha1a.PackageRepositoryList, error) - listRepositoriesMutex sync.RWMutex - listRepositoriesArgsForCall []struct { - arg1 *packagedatamodel.RepositoryOptions - } - listRepositoriesReturns struct { - result1 *v1alpha1a.PackageRepositoryList - result2 error - } - listRepositoriesReturnsOnCall map[int]struct { - result1 *v1alpha1a.PackageRepositoryList - result2 error - } - ListSecretExportsStub func(*packagedatamodel.RegistrySecretOptions) (*v1alpha1b.SecretExportList, error) - listSecretExportsMutex sync.RWMutex - listSecretExportsArgsForCall []struct { - arg1 *packagedatamodel.RegistrySecretOptions - } - listSecretExportsReturns struct { - result1 *v1alpha1b.SecretExportList - result2 error - } - listSecretExportsReturnsOnCall map[int]struct { - result1 *v1alpha1b.SecretExportList - result2 error - } - UninstallPackageStub func(*packagedatamodel.PackageOptions, *packagedatamodel.PackageProgress) - uninstallPackageMutex sync.RWMutex - uninstallPackageArgsForCall []struct { - arg1 *packagedatamodel.PackageOptions - arg2 *packagedatamodel.PackageProgress - } - UninstallPackageSyncStub func(*packagedatamodel.PackageOptions) error - uninstallPackageSyncMutex sync.RWMutex - uninstallPackageSyncArgsForCall []struct { - arg1 *packagedatamodel.PackageOptions - } - uninstallPackageSyncReturns struct { - result1 error - } - uninstallPackageSyncReturnsOnCall map[int]struct { - result1 error - } - UpdatePackageStub func(*packagedatamodel.PackageOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType) - updatePackageMutex sync.RWMutex - updatePackageArgsForCall []struct { - arg1 *packagedatamodel.PackageOptions - arg2 *packagedatamodel.PackageProgress - arg3 packagedatamodel.OperationType - } - UpdatePackageSyncStub func(*packagedatamodel.PackageOptions, packagedatamodel.OperationType) error - updatePackageSyncMutex sync.RWMutex - updatePackageSyncArgsForCall []struct { - arg1 *packagedatamodel.PackageOptions - arg2 packagedatamodel.OperationType - } - updatePackageSyncReturns struct { - result1 error - } - updatePackageSyncReturnsOnCall map[int]struct { - result1 error - } - UpdateRegistrySecretStub func(*packagedatamodel.RegistrySecretOptions) error - updateRegistrySecretMutex sync.RWMutex - updateRegistrySecretArgsForCall []struct { - arg1 *packagedatamodel.RegistrySecretOptions - } - updateRegistrySecretReturns struct { - result1 error - } - updateRegistrySecretReturnsOnCall map[int]struct { - result1 error - } - UpdateRepositoryStub func(*packagedatamodel.RepositoryOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType) - updateRepositoryMutex sync.RWMutex - updateRepositoryArgsForCall []struct { - arg1 *packagedatamodel.RepositoryOptions - arg2 *packagedatamodel.PackageProgress - arg3 packagedatamodel.OperationType - } - UpdateRepositorySyncStub func(*packagedatamodel.RepositoryOptions, packagedatamodel.OperationType) error - updateRepositorySyncMutex sync.RWMutex - updateRepositorySyncArgsForCall []struct { - arg1 *packagedatamodel.RepositoryOptions - arg2 packagedatamodel.OperationType - } - updateRepositorySyncReturns struct { - result1 error - } - updateRepositorySyncReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *PackageClient) AddRegistrySecret(arg1 *packagedatamodel.RegistrySecretOptions) error { - fake.addRegistrySecretMutex.Lock() - ret, specificReturn := fake.addRegistrySecretReturnsOnCall[len(fake.addRegistrySecretArgsForCall)] - fake.addRegistrySecretArgsForCall = append(fake.addRegistrySecretArgsForCall, struct { - arg1 *packagedatamodel.RegistrySecretOptions - }{arg1}) - stub := fake.AddRegistrySecretStub - fakeReturns := fake.addRegistrySecretReturns - fake.recordInvocation("AddRegistrySecret", []interface{}{arg1}) - fake.addRegistrySecretMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *PackageClient) AddRegistrySecretCallCount() int { - fake.addRegistrySecretMutex.RLock() - defer fake.addRegistrySecretMutex.RUnlock() - return len(fake.addRegistrySecretArgsForCall) -} - -func (fake *PackageClient) AddRegistrySecretCalls(stub func(*packagedatamodel.RegistrySecretOptions) error) { - fake.addRegistrySecretMutex.Lock() - defer fake.addRegistrySecretMutex.Unlock() - fake.AddRegistrySecretStub = stub -} - -func (fake *PackageClient) AddRegistrySecretArgsForCall(i int) *packagedatamodel.RegistrySecretOptions { - fake.addRegistrySecretMutex.RLock() - defer fake.addRegistrySecretMutex.RUnlock() - argsForCall := fake.addRegistrySecretArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) AddRegistrySecretReturns(result1 error) { - fake.addRegistrySecretMutex.Lock() - defer fake.addRegistrySecretMutex.Unlock() - fake.AddRegistrySecretStub = nil - fake.addRegistrySecretReturns = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) AddRegistrySecretReturnsOnCall(i int, result1 error) { - fake.addRegistrySecretMutex.Lock() - defer fake.addRegistrySecretMutex.Unlock() - fake.AddRegistrySecretStub = nil - if fake.addRegistrySecretReturnsOnCall == nil { - fake.addRegistrySecretReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.addRegistrySecretReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) AddRepository(arg1 *packagedatamodel.RepositoryOptions, arg2 *packagedatamodel.PackageProgress, arg3 packagedatamodel.OperationType) { - fake.addRepositoryMutex.Lock() - fake.addRepositoryArgsForCall = append(fake.addRepositoryArgsForCall, struct { - arg1 *packagedatamodel.RepositoryOptions - arg2 *packagedatamodel.PackageProgress - arg3 packagedatamodel.OperationType - }{arg1, arg2, arg3}) - stub := fake.AddRepositoryStub - fake.recordInvocation("AddRepository", []interface{}{arg1, arg2, arg3}) - fake.addRepositoryMutex.Unlock() - if stub != nil { - fake.AddRepositoryStub(arg1, arg2, arg3) - } -} - -func (fake *PackageClient) AddRepositoryCallCount() int { - fake.addRepositoryMutex.RLock() - defer fake.addRepositoryMutex.RUnlock() - return len(fake.addRepositoryArgsForCall) -} - -func (fake *PackageClient) AddRepositoryCalls(stub func(*packagedatamodel.RepositoryOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType)) { - fake.addRepositoryMutex.Lock() - defer fake.addRepositoryMutex.Unlock() - fake.AddRepositoryStub = stub -} - -func (fake *PackageClient) AddRepositoryArgsForCall(i int) (*packagedatamodel.RepositoryOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType) { - fake.addRepositoryMutex.RLock() - defer fake.addRepositoryMutex.RUnlock() - argsForCall := fake.addRepositoryArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *PackageClient) AddRepositorySync(arg1 *packagedatamodel.RepositoryOptions, arg2 packagedatamodel.OperationType) error { - fake.addRepositorySyncMutex.Lock() - ret, specificReturn := fake.addRepositorySyncReturnsOnCall[len(fake.addRepositorySyncArgsForCall)] - fake.addRepositorySyncArgsForCall = append(fake.addRepositorySyncArgsForCall, struct { - arg1 *packagedatamodel.RepositoryOptions - arg2 packagedatamodel.OperationType - }{arg1, arg2}) - stub := fake.AddRepositorySyncStub - fakeReturns := fake.addRepositorySyncReturns - fake.recordInvocation("AddRepositorySync", []interface{}{arg1, arg2}) - fake.addRepositorySyncMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *PackageClient) AddRepositorySyncCallCount() int { - fake.addRepositorySyncMutex.RLock() - defer fake.addRepositorySyncMutex.RUnlock() - return len(fake.addRepositorySyncArgsForCall) -} - -func (fake *PackageClient) AddRepositorySyncCalls(stub func(*packagedatamodel.RepositoryOptions, packagedatamodel.OperationType) error) { - fake.addRepositorySyncMutex.Lock() - defer fake.addRepositorySyncMutex.Unlock() - fake.AddRepositorySyncStub = stub -} - -func (fake *PackageClient) AddRepositorySyncArgsForCall(i int) (*packagedatamodel.RepositoryOptions, packagedatamodel.OperationType) { - fake.addRepositorySyncMutex.RLock() - defer fake.addRepositorySyncMutex.RUnlock() - argsForCall := fake.addRepositorySyncArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *PackageClient) AddRepositorySyncReturns(result1 error) { - fake.addRepositorySyncMutex.Lock() - defer fake.addRepositorySyncMutex.Unlock() - fake.AddRepositorySyncStub = nil - fake.addRepositorySyncReturns = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) AddRepositorySyncReturnsOnCall(i int, result1 error) { - fake.addRepositorySyncMutex.Lock() - defer fake.addRepositorySyncMutex.Unlock() - fake.AddRepositorySyncStub = nil - if fake.addRepositorySyncReturnsOnCall == nil { - fake.addRepositorySyncReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.addRepositorySyncReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) DeleteRegistrySecret(arg1 *packagedatamodel.RegistrySecretOptions) (bool, error) { - fake.deleteRegistrySecretMutex.Lock() - ret, specificReturn := fake.deleteRegistrySecretReturnsOnCall[len(fake.deleteRegistrySecretArgsForCall)] - fake.deleteRegistrySecretArgsForCall = append(fake.deleteRegistrySecretArgsForCall, struct { - arg1 *packagedatamodel.RegistrySecretOptions - }{arg1}) - stub := fake.DeleteRegistrySecretStub - fakeReturns := fake.deleteRegistrySecretReturns - fake.recordInvocation("DeleteRegistrySecret", []interface{}{arg1}) - fake.deleteRegistrySecretMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *PackageClient) DeleteRegistrySecretCallCount() int { - fake.deleteRegistrySecretMutex.RLock() - defer fake.deleteRegistrySecretMutex.RUnlock() - return len(fake.deleteRegistrySecretArgsForCall) -} - -func (fake *PackageClient) DeleteRegistrySecretCalls(stub func(*packagedatamodel.RegistrySecretOptions) (bool, error)) { - fake.deleteRegistrySecretMutex.Lock() - defer fake.deleteRegistrySecretMutex.Unlock() - fake.DeleteRegistrySecretStub = stub -} - -func (fake *PackageClient) DeleteRegistrySecretArgsForCall(i int) *packagedatamodel.RegistrySecretOptions { - fake.deleteRegistrySecretMutex.RLock() - defer fake.deleteRegistrySecretMutex.RUnlock() - argsForCall := fake.deleteRegistrySecretArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) DeleteRegistrySecretReturns(result1 bool, result2 error) { - fake.deleteRegistrySecretMutex.Lock() - defer fake.deleteRegistrySecretMutex.Unlock() - fake.DeleteRegistrySecretStub = nil - fake.deleteRegistrySecretReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *PackageClient) DeleteRegistrySecretReturnsOnCall(i int, result1 bool, result2 error) { - fake.deleteRegistrySecretMutex.Lock() - defer fake.deleteRegistrySecretMutex.Unlock() - fake.DeleteRegistrySecretStub = nil - if fake.deleteRegistrySecretReturnsOnCall == nil { - fake.deleteRegistrySecretReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.deleteRegistrySecretReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *PackageClient) DeleteRepository(arg1 *packagedatamodel.RepositoryOptions, arg2 *packagedatamodel.PackageProgress) { - fake.deleteRepositoryMutex.Lock() - fake.deleteRepositoryArgsForCall = append(fake.deleteRepositoryArgsForCall, struct { - arg1 *packagedatamodel.RepositoryOptions - arg2 *packagedatamodel.PackageProgress - }{arg1, arg2}) - stub := fake.DeleteRepositoryStub - fake.recordInvocation("DeleteRepository", []interface{}{arg1, arg2}) - fake.deleteRepositoryMutex.Unlock() - if stub != nil { - fake.DeleteRepositoryStub(arg1, arg2) - } -} - -func (fake *PackageClient) DeleteRepositoryCallCount() int { - fake.deleteRepositoryMutex.RLock() - defer fake.deleteRepositoryMutex.RUnlock() - return len(fake.deleteRepositoryArgsForCall) -} - -func (fake *PackageClient) DeleteRepositoryCalls(stub func(*packagedatamodel.RepositoryOptions, *packagedatamodel.PackageProgress)) { - fake.deleteRepositoryMutex.Lock() - defer fake.deleteRepositoryMutex.Unlock() - fake.DeleteRepositoryStub = stub -} - -func (fake *PackageClient) DeleteRepositoryArgsForCall(i int) (*packagedatamodel.RepositoryOptions, *packagedatamodel.PackageProgress) { - fake.deleteRepositoryMutex.RLock() - defer fake.deleteRepositoryMutex.RUnlock() - argsForCall := fake.deleteRepositoryArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *PackageClient) DeleteRepositorySync(arg1 *packagedatamodel.RepositoryOptions) error { - fake.deleteRepositorySyncMutex.Lock() - ret, specificReturn := fake.deleteRepositorySyncReturnsOnCall[len(fake.deleteRepositorySyncArgsForCall)] - fake.deleteRepositorySyncArgsForCall = append(fake.deleteRepositorySyncArgsForCall, struct { - arg1 *packagedatamodel.RepositoryOptions - }{arg1}) - stub := fake.DeleteRepositorySyncStub - fakeReturns := fake.deleteRepositorySyncReturns - fake.recordInvocation("DeleteRepositorySync", []interface{}{arg1}) - fake.deleteRepositorySyncMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *PackageClient) DeleteRepositorySyncCallCount() int { - fake.deleteRepositorySyncMutex.RLock() - defer fake.deleteRepositorySyncMutex.RUnlock() - return len(fake.deleteRepositorySyncArgsForCall) -} - -func (fake *PackageClient) DeleteRepositorySyncCalls(stub func(*packagedatamodel.RepositoryOptions) error) { - fake.deleteRepositorySyncMutex.Lock() - defer fake.deleteRepositorySyncMutex.Unlock() - fake.DeleteRepositorySyncStub = stub -} - -func (fake *PackageClient) DeleteRepositorySyncArgsForCall(i int) *packagedatamodel.RepositoryOptions { - fake.deleteRepositorySyncMutex.RLock() - defer fake.deleteRepositorySyncMutex.RUnlock() - argsForCall := fake.deleteRepositorySyncArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) DeleteRepositorySyncReturns(result1 error) { - fake.deleteRepositorySyncMutex.Lock() - defer fake.deleteRepositorySyncMutex.Unlock() - fake.DeleteRepositorySyncStub = nil - fake.deleteRepositorySyncReturns = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) DeleteRepositorySyncReturnsOnCall(i int, result1 error) { - fake.deleteRepositorySyncMutex.Lock() - defer fake.deleteRepositorySyncMutex.Unlock() - fake.DeleteRepositorySyncStub = nil - if fake.deleteRepositorySyncReturnsOnCall == nil { - fake.deleteRepositorySyncReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteRepositorySyncReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) GetPackage(arg1 *packagedatamodel.PackageOptions) (*v1alpha1.PackageMetadata, *v1alpha1.Package, error) { - fake.getPackageMutex.Lock() - ret, specificReturn := fake.getPackageReturnsOnCall[len(fake.getPackageArgsForCall)] - fake.getPackageArgsForCall = append(fake.getPackageArgsForCall, struct { - arg1 *packagedatamodel.PackageOptions - }{arg1}) - stub := fake.GetPackageStub - fakeReturns := fake.getPackageReturns - fake.recordInvocation("GetPackage", []interface{}{arg1}) - fake.getPackageMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *PackageClient) GetPackageCallCount() int { - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - return len(fake.getPackageArgsForCall) -} - -func (fake *PackageClient) GetPackageCalls(stub func(*packagedatamodel.PackageOptions) (*v1alpha1.PackageMetadata, *v1alpha1.Package, error)) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = stub -} - -func (fake *PackageClient) GetPackageArgsForCall(i int) *packagedatamodel.PackageOptions { - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - argsForCall := fake.getPackageArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) GetPackageReturns(result1 *v1alpha1.PackageMetadata, result2 *v1alpha1.Package, result3 error) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = nil - fake.getPackageReturns = struct { - result1 *v1alpha1.PackageMetadata - result2 *v1alpha1.Package - result3 error - }{result1, result2, result3} -} - -func (fake *PackageClient) GetPackageReturnsOnCall(i int, result1 *v1alpha1.PackageMetadata, result2 *v1alpha1.Package, result3 error) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = nil - if fake.getPackageReturnsOnCall == nil { - fake.getPackageReturnsOnCall = make(map[int]struct { - result1 *v1alpha1.PackageMetadata - result2 *v1alpha1.Package - result3 error - }) - } - fake.getPackageReturnsOnCall[i] = struct { - result1 *v1alpha1.PackageMetadata - result2 *v1alpha1.Package - result3 error - }{result1, result2, result3} -} - -func (fake *PackageClient) GetPackageInstall(arg1 *packagedatamodel.PackageOptions) (*v1alpha1a.PackageInstall, error) { - fake.getPackageInstallMutex.Lock() - ret, specificReturn := fake.getPackageInstallReturnsOnCall[len(fake.getPackageInstallArgsForCall)] - fake.getPackageInstallArgsForCall = append(fake.getPackageInstallArgsForCall, struct { - arg1 *packagedatamodel.PackageOptions - }{arg1}) - stub := fake.GetPackageInstallStub - fakeReturns := fake.getPackageInstallReturns - fake.recordInvocation("GetPackageInstall", []interface{}{arg1}) - fake.getPackageInstallMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *PackageClient) GetPackageInstallCallCount() int { - fake.getPackageInstallMutex.RLock() - defer fake.getPackageInstallMutex.RUnlock() - return len(fake.getPackageInstallArgsForCall) -} - -func (fake *PackageClient) GetPackageInstallCalls(stub func(*packagedatamodel.PackageOptions) (*v1alpha1a.PackageInstall, error)) { - fake.getPackageInstallMutex.Lock() - defer fake.getPackageInstallMutex.Unlock() - fake.GetPackageInstallStub = stub -} - -func (fake *PackageClient) GetPackageInstallArgsForCall(i int) *packagedatamodel.PackageOptions { - fake.getPackageInstallMutex.RLock() - defer fake.getPackageInstallMutex.RUnlock() - argsForCall := fake.getPackageInstallArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) GetPackageInstallReturns(result1 *v1alpha1a.PackageInstall, result2 error) { - fake.getPackageInstallMutex.Lock() - defer fake.getPackageInstallMutex.Unlock() - fake.GetPackageInstallStub = nil - fake.getPackageInstallReturns = struct { - result1 *v1alpha1a.PackageInstall - result2 error - }{result1, result2} -} - -func (fake *PackageClient) GetPackageInstallReturnsOnCall(i int, result1 *v1alpha1a.PackageInstall, result2 error) { - fake.getPackageInstallMutex.Lock() - defer fake.getPackageInstallMutex.Unlock() - fake.GetPackageInstallStub = nil - if fake.getPackageInstallReturnsOnCall == nil { - fake.getPackageInstallReturnsOnCall = make(map[int]struct { - result1 *v1alpha1a.PackageInstall - result2 error - }) - } - fake.getPackageInstallReturnsOnCall[i] = struct { - result1 *v1alpha1a.PackageInstall - result2 error - }{result1, result2} -} - -func (fake *PackageClient) GetRepository(arg1 *packagedatamodel.RepositoryOptions) (*v1alpha1a.PackageRepository, error) { - fake.getRepositoryMutex.Lock() - ret, specificReturn := fake.getRepositoryReturnsOnCall[len(fake.getRepositoryArgsForCall)] - fake.getRepositoryArgsForCall = append(fake.getRepositoryArgsForCall, struct { - arg1 *packagedatamodel.RepositoryOptions - }{arg1}) - stub := fake.GetRepositoryStub - fakeReturns := fake.getRepositoryReturns - fake.recordInvocation("GetRepository", []interface{}{arg1}) - fake.getRepositoryMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *PackageClient) GetRepositoryCallCount() int { - fake.getRepositoryMutex.RLock() - defer fake.getRepositoryMutex.RUnlock() - return len(fake.getRepositoryArgsForCall) -} - -func (fake *PackageClient) GetRepositoryCalls(stub func(*packagedatamodel.RepositoryOptions) (*v1alpha1a.PackageRepository, error)) { - fake.getRepositoryMutex.Lock() - defer fake.getRepositoryMutex.Unlock() - fake.GetRepositoryStub = stub -} - -func (fake *PackageClient) GetRepositoryArgsForCall(i int) *packagedatamodel.RepositoryOptions { - fake.getRepositoryMutex.RLock() - defer fake.getRepositoryMutex.RUnlock() - argsForCall := fake.getRepositoryArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) GetRepositoryReturns(result1 *v1alpha1a.PackageRepository, result2 error) { - fake.getRepositoryMutex.Lock() - defer fake.getRepositoryMutex.Unlock() - fake.GetRepositoryStub = nil - fake.getRepositoryReturns = struct { - result1 *v1alpha1a.PackageRepository - result2 error - }{result1, result2} -} - -func (fake *PackageClient) GetRepositoryReturnsOnCall(i int, result1 *v1alpha1a.PackageRepository, result2 error) { - fake.getRepositoryMutex.Lock() - defer fake.getRepositoryMutex.Unlock() - fake.GetRepositoryStub = nil - if fake.getRepositoryReturnsOnCall == nil { - fake.getRepositoryReturnsOnCall = make(map[int]struct { - result1 *v1alpha1a.PackageRepository - result2 error - }) - } - fake.getRepositoryReturnsOnCall[i] = struct { - result1 *v1alpha1a.PackageRepository - result2 error - }{result1, result2} -} - -func (fake *PackageClient) GetSecretExport(arg1 *packagedatamodel.RegistrySecretOptions) (*v1alpha1b.SecretExport, error) { - fake.getSecretExportMutex.Lock() - ret, specificReturn := fake.getSecretExportReturnsOnCall[len(fake.getSecretExportArgsForCall)] - fake.getSecretExportArgsForCall = append(fake.getSecretExportArgsForCall, struct { - arg1 *packagedatamodel.RegistrySecretOptions - }{arg1}) - stub := fake.GetSecretExportStub - fakeReturns := fake.getSecretExportReturns - fake.recordInvocation("GetSecretExport", []interface{}{arg1}) - fake.getSecretExportMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *PackageClient) GetSecretExportCallCount() int { - fake.getSecretExportMutex.RLock() - defer fake.getSecretExportMutex.RUnlock() - return len(fake.getSecretExportArgsForCall) -} - -func (fake *PackageClient) GetSecretExportCalls(stub func(*packagedatamodel.RegistrySecretOptions) (*v1alpha1b.SecretExport, error)) { - fake.getSecretExportMutex.Lock() - defer fake.getSecretExportMutex.Unlock() - fake.GetSecretExportStub = stub -} - -func (fake *PackageClient) GetSecretExportArgsForCall(i int) *packagedatamodel.RegistrySecretOptions { - fake.getSecretExportMutex.RLock() - defer fake.getSecretExportMutex.RUnlock() - argsForCall := fake.getSecretExportArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) GetSecretExportReturns(result1 *v1alpha1b.SecretExport, result2 error) { - fake.getSecretExportMutex.Lock() - defer fake.getSecretExportMutex.Unlock() - fake.GetSecretExportStub = nil - fake.getSecretExportReturns = struct { - result1 *v1alpha1b.SecretExport - result2 error - }{result1, result2} -} - -func (fake *PackageClient) GetSecretExportReturnsOnCall(i int, result1 *v1alpha1b.SecretExport, result2 error) { - fake.getSecretExportMutex.Lock() - defer fake.getSecretExportMutex.Unlock() - fake.GetSecretExportStub = nil - if fake.getSecretExportReturnsOnCall == nil { - fake.getSecretExportReturnsOnCall = make(map[int]struct { - result1 *v1alpha1b.SecretExport - result2 error - }) - } - fake.getSecretExportReturnsOnCall[i] = struct { - result1 *v1alpha1b.SecretExport - result2 error - }{result1, result2} -} - -func (fake *PackageClient) InstallPackage(arg1 *packagedatamodel.PackageOptions, arg2 *packagedatamodel.PackageProgress, arg3 packagedatamodel.OperationType) { - fake.installPackageMutex.Lock() - fake.installPackageArgsForCall = append(fake.installPackageArgsForCall, struct { - arg1 *packagedatamodel.PackageOptions - arg2 *packagedatamodel.PackageProgress - arg3 packagedatamodel.OperationType - }{arg1, arg2, arg3}) - stub := fake.InstallPackageStub - fake.recordInvocation("InstallPackage", []interface{}{arg1, arg2, arg3}) - fake.installPackageMutex.Unlock() - if stub != nil { - fake.InstallPackageStub(arg1, arg2, arg3) - } -} - -func (fake *PackageClient) InstallPackageCallCount() int { - fake.installPackageMutex.RLock() - defer fake.installPackageMutex.RUnlock() - return len(fake.installPackageArgsForCall) -} - -func (fake *PackageClient) InstallPackageCalls(stub func(*packagedatamodel.PackageOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType)) { - fake.installPackageMutex.Lock() - defer fake.installPackageMutex.Unlock() - fake.InstallPackageStub = stub -} - -func (fake *PackageClient) InstallPackageArgsForCall(i int) (*packagedatamodel.PackageOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType) { - fake.installPackageMutex.RLock() - defer fake.installPackageMutex.RUnlock() - argsForCall := fake.installPackageArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *PackageClient) InstallPackageSync(arg1 *packagedatamodel.PackageOptions, arg2 packagedatamodel.OperationType) error { - fake.installPackageSyncMutex.Lock() - ret, specificReturn := fake.installPackageSyncReturnsOnCall[len(fake.installPackageSyncArgsForCall)] - fake.installPackageSyncArgsForCall = append(fake.installPackageSyncArgsForCall, struct { - arg1 *packagedatamodel.PackageOptions - arg2 packagedatamodel.OperationType - }{arg1, arg2}) - stub := fake.InstallPackageSyncStub - fakeReturns := fake.installPackageSyncReturns - fake.recordInvocation("InstallPackageSync", []interface{}{arg1, arg2}) - fake.installPackageSyncMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *PackageClient) InstallPackageSyncCallCount() int { - fake.installPackageSyncMutex.RLock() - defer fake.installPackageSyncMutex.RUnlock() - return len(fake.installPackageSyncArgsForCall) -} - -func (fake *PackageClient) InstallPackageSyncCalls(stub func(*packagedatamodel.PackageOptions, packagedatamodel.OperationType) error) { - fake.installPackageSyncMutex.Lock() - defer fake.installPackageSyncMutex.Unlock() - fake.InstallPackageSyncStub = stub -} - -func (fake *PackageClient) InstallPackageSyncArgsForCall(i int) (*packagedatamodel.PackageOptions, packagedatamodel.OperationType) { - fake.installPackageSyncMutex.RLock() - defer fake.installPackageSyncMutex.RUnlock() - argsForCall := fake.installPackageSyncArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *PackageClient) InstallPackageSyncReturns(result1 error) { - fake.installPackageSyncMutex.Lock() - defer fake.installPackageSyncMutex.Unlock() - fake.InstallPackageSyncStub = nil - fake.installPackageSyncReturns = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) InstallPackageSyncReturnsOnCall(i int, result1 error) { - fake.installPackageSyncMutex.Lock() - defer fake.installPackageSyncMutex.Unlock() - fake.InstallPackageSyncStub = nil - if fake.installPackageSyncReturnsOnCall == nil { - fake.installPackageSyncReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.installPackageSyncReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) ListPackageInstalls(arg1 *packagedatamodel.PackageOptions) (*v1alpha1a.PackageInstallList, error) { - fake.listPackageInstallsMutex.Lock() - ret, specificReturn := fake.listPackageInstallsReturnsOnCall[len(fake.listPackageInstallsArgsForCall)] - fake.listPackageInstallsArgsForCall = append(fake.listPackageInstallsArgsForCall, struct { - arg1 *packagedatamodel.PackageOptions - }{arg1}) - stub := fake.ListPackageInstallsStub - fakeReturns := fake.listPackageInstallsReturns - fake.recordInvocation("ListPackageInstalls", []interface{}{arg1}) - fake.listPackageInstallsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *PackageClient) ListPackageInstallsCallCount() int { - fake.listPackageInstallsMutex.RLock() - defer fake.listPackageInstallsMutex.RUnlock() - return len(fake.listPackageInstallsArgsForCall) -} - -func (fake *PackageClient) ListPackageInstallsCalls(stub func(*packagedatamodel.PackageOptions) (*v1alpha1a.PackageInstallList, error)) { - fake.listPackageInstallsMutex.Lock() - defer fake.listPackageInstallsMutex.Unlock() - fake.ListPackageInstallsStub = stub -} - -func (fake *PackageClient) ListPackageInstallsArgsForCall(i int) *packagedatamodel.PackageOptions { - fake.listPackageInstallsMutex.RLock() - defer fake.listPackageInstallsMutex.RUnlock() - argsForCall := fake.listPackageInstallsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) ListPackageInstallsReturns(result1 *v1alpha1a.PackageInstallList, result2 error) { - fake.listPackageInstallsMutex.Lock() - defer fake.listPackageInstallsMutex.Unlock() - fake.ListPackageInstallsStub = nil - fake.listPackageInstallsReturns = struct { - result1 *v1alpha1a.PackageInstallList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) ListPackageInstallsReturnsOnCall(i int, result1 *v1alpha1a.PackageInstallList, result2 error) { - fake.listPackageInstallsMutex.Lock() - defer fake.listPackageInstallsMutex.Unlock() - fake.ListPackageInstallsStub = nil - if fake.listPackageInstallsReturnsOnCall == nil { - fake.listPackageInstallsReturnsOnCall = make(map[int]struct { - result1 *v1alpha1a.PackageInstallList - result2 error - }) - } - fake.listPackageInstallsReturnsOnCall[i] = struct { - result1 *v1alpha1a.PackageInstallList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) ListPackageMetadata(arg1 *packagedatamodel.PackageAvailableOptions) (*v1alpha1.PackageMetadataList, error) { - fake.listPackageMetadataMutex.Lock() - ret, specificReturn := fake.listPackageMetadataReturnsOnCall[len(fake.listPackageMetadataArgsForCall)] - fake.listPackageMetadataArgsForCall = append(fake.listPackageMetadataArgsForCall, struct { - arg1 *packagedatamodel.PackageAvailableOptions - }{arg1}) - stub := fake.ListPackageMetadataStub - fakeReturns := fake.listPackageMetadataReturns - fake.recordInvocation("ListPackageMetadata", []interface{}{arg1}) - fake.listPackageMetadataMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *PackageClient) ListPackageMetadataCallCount() int { - fake.listPackageMetadataMutex.RLock() - defer fake.listPackageMetadataMutex.RUnlock() - return len(fake.listPackageMetadataArgsForCall) -} - -func (fake *PackageClient) ListPackageMetadataCalls(stub func(*packagedatamodel.PackageAvailableOptions) (*v1alpha1.PackageMetadataList, error)) { - fake.listPackageMetadataMutex.Lock() - defer fake.listPackageMetadataMutex.Unlock() - fake.ListPackageMetadataStub = stub -} - -func (fake *PackageClient) ListPackageMetadataArgsForCall(i int) *packagedatamodel.PackageAvailableOptions { - fake.listPackageMetadataMutex.RLock() - defer fake.listPackageMetadataMutex.RUnlock() - argsForCall := fake.listPackageMetadataArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) ListPackageMetadataReturns(result1 *v1alpha1.PackageMetadataList, result2 error) { - fake.listPackageMetadataMutex.Lock() - defer fake.listPackageMetadataMutex.Unlock() - fake.ListPackageMetadataStub = nil - fake.listPackageMetadataReturns = struct { - result1 *v1alpha1.PackageMetadataList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) ListPackageMetadataReturnsOnCall(i int, result1 *v1alpha1.PackageMetadataList, result2 error) { - fake.listPackageMetadataMutex.Lock() - defer fake.listPackageMetadataMutex.Unlock() - fake.ListPackageMetadataStub = nil - if fake.listPackageMetadataReturnsOnCall == nil { - fake.listPackageMetadataReturnsOnCall = make(map[int]struct { - result1 *v1alpha1.PackageMetadataList - result2 error - }) - } - fake.listPackageMetadataReturnsOnCall[i] = struct { - result1 *v1alpha1.PackageMetadataList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) ListPackages(arg1 *packagedatamodel.PackageAvailableOptions) (*v1alpha1.PackageList, error) { - fake.listPackagesMutex.Lock() - ret, specificReturn := fake.listPackagesReturnsOnCall[len(fake.listPackagesArgsForCall)] - fake.listPackagesArgsForCall = append(fake.listPackagesArgsForCall, struct { - arg1 *packagedatamodel.PackageAvailableOptions - }{arg1}) - stub := fake.ListPackagesStub - fakeReturns := fake.listPackagesReturns - fake.recordInvocation("ListPackages", []interface{}{arg1}) - fake.listPackagesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *PackageClient) ListPackagesCallCount() int { - fake.listPackagesMutex.RLock() - defer fake.listPackagesMutex.RUnlock() - return len(fake.listPackagesArgsForCall) -} - -func (fake *PackageClient) ListPackagesCalls(stub func(*packagedatamodel.PackageAvailableOptions) (*v1alpha1.PackageList, error)) { - fake.listPackagesMutex.Lock() - defer fake.listPackagesMutex.Unlock() - fake.ListPackagesStub = stub -} - -func (fake *PackageClient) ListPackagesArgsForCall(i int) *packagedatamodel.PackageAvailableOptions { - fake.listPackagesMutex.RLock() - defer fake.listPackagesMutex.RUnlock() - argsForCall := fake.listPackagesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) ListPackagesReturns(result1 *v1alpha1.PackageList, result2 error) { - fake.listPackagesMutex.Lock() - defer fake.listPackagesMutex.Unlock() - fake.ListPackagesStub = nil - fake.listPackagesReturns = struct { - result1 *v1alpha1.PackageList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) ListPackagesReturnsOnCall(i int, result1 *v1alpha1.PackageList, result2 error) { - fake.listPackagesMutex.Lock() - defer fake.listPackagesMutex.Unlock() - fake.ListPackagesStub = nil - if fake.listPackagesReturnsOnCall == nil { - fake.listPackagesReturnsOnCall = make(map[int]struct { - result1 *v1alpha1.PackageList - result2 error - }) - } - fake.listPackagesReturnsOnCall[i] = struct { - result1 *v1alpha1.PackageList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) ListRegistrySecrets(arg1 *packagedatamodel.RegistrySecretOptions) (*v1.SecretList, error) { - fake.listRegistrySecretsMutex.Lock() - ret, specificReturn := fake.listRegistrySecretsReturnsOnCall[len(fake.listRegistrySecretsArgsForCall)] - fake.listRegistrySecretsArgsForCall = append(fake.listRegistrySecretsArgsForCall, struct { - arg1 *packagedatamodel.RegistrySecretOptions - }{arg1}) - stub := fake.ListRegistrySecretsStub - fakeReturns := fake.listRegistrySecretsReturns - fake.recordInvocation("ListRegistrySecrets", []interface{}{arg1}) - fake.listRegistrySecretsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *PackageClient) ListRegistrySecretsCallCount() int { - fake.listRegistrySecretsMutex.RLock() - defer fake.listRegistrySecretsMutex.RUnlock() - return len(fake.listRegistrySecretsArgsForCall) -} - -func (fake *PackageClient) ListRegistrySecretsCalls(stub func(*packagedatamodel.RegistrySecretOptions) (*v1.SecretList, error)) { - fake.listRegistrySecretsMutex.Lock() - defer fake.listRegistrySecretsMutex.Unlock() - fake.ListRegistrySecretsStub = stub -} - -func (fake *PackageClient) ListRegistrySecretsArgsForCall(i int) *packagedatamodel.RegistrySecretOptions { - fake.listRegistrySecretsMutex.RLock() - defer fake.listRegistrySecretsMutex.RUnlock() - argsForCall := fake.listRegistrySecretsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) ListRegistrySecretsReturns(result1 *v1.SecretList, result2 error) { - fake.listRegistrySecretsMutex.Lock() - defer fake.listRegistrySecretsMutex.Unlock() - fake.ListRegistrySecretsStub = nil - fake.listRegistrySecretsReturns = struct { - result1 *v1.SecretList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) ListRegistrySecretsReturnsOnCall(i int, result1 *v1.SecretList, result2 error) { - fake.listRegistrySecretsMutex.Lock() - defer fake.listRegistrySecretsMutex.Unlock() - fake.ListRegistrySecretsStub = nil - if fake.listRegistrySecretsReturnsOnCall == nil { - fake.listRegistrySecretsReturnsOnCall = make(map[int]struct { - result1 *v1.SecretList - result2 error - }) - } - fake.listRegistrySecretsReturnsOnCall[i] = struct { - result1 *v1.SecretList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) ListRepositories(arg1 *packagedatamodel.RepositoryOptions) (*v1alpha1a.PackageRepositoryList, error) { - fake.listRepositoriesMutex.Lock() - ret, specificReturn := fake.listRepositoriesReturnsOnCall[len(fake.listRepositoriesArgsForCall)] - fake.listRepositoriesArgsForCall = append(fake.listRepositoriesArgsForCall, struct { - arg1 *packagedatamodel.RepositoryOptions - }{arg1}) - stub := fake.ListRepositoriesStub - fakeReturns := fake.listRepositoriesReturns - fake.recordInvocation("ListRepositories", []interface{}{arg1}) - fake.listRepositoriesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *PackageClient) ListRepositoriesCallCount() int { - fake.listRepositoriesMutex.RLock() - defer fake.listRepositoriesMutex.RUnlock() - return len(fake.listRepositoriesArgsForCall) -} - -func (fake *PackageClient) ListRepositoriesCalls(stub func(*packagedatamodel.RepositoryOptions) (*v1alpha1a.PackageRepositoryList, error)) { - fake.listRepositoriesMutex.Lock() - defer fake.listRepositoriesMutex.Unlock() - fake.ListRepositoriesStub = stub -} - -func (fake *PackageClient) ListRepositoriesArgsForCall(i int) *packagedatamodel.RepositoryOptions { - fake.listRepositoriesMutex.RLock() - defer fake.listRepositoriesMutex.RUnlock() - argsForCall := fake.listRepositoriesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) ListRepositoriesReturns(result1 *v1alpha1a.PackageRepositoryList, result2 error) { - fake.listRepositoriesMutex.Lock() - defer fake.listRepositoriesMutex.Unlock() - fake.ListRepositoriesStub = nil - fake.listRepositoriesReturns = struct { - result1 *v1alpha1a.PackageRepositoryList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) ListRepositoriesReturnsOnCall(i int, result1 *v1alpha1a.PackageRepositoryList, result2 error) { - fake.listRepositoriesMutex.Lock() - defer fake.listRepositoriesMutex.Unlock() - fake.ListRepositoriesStub = nil - if fake.listRepositoriesReturnsOnCall == nil { - fake.listRepositoriesReturnsOnCall = make(map[int]struct { - result1 *v1alpha1a.PackageRepositoryList - result2 error - }) - } - fake.listRepositoriesReturnsOnCall[i] = struct { - result1 *v1alpha1a.PackageRepositoryList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) ListSecretExports(arg1 *packagedatamodel.RegistrySecretOptions) (*v1alpha1b.SecretExportList, error) { - fake.listSecretExportsMutex.Lock() - ret, specificReturn := fake.listSecretExportsReturnsOnCall[len(fake.listSecretExportsArgsForCall)] - fake.listSecretExportsArgsForCall = append(fake.listSecretExportsArgsForCall, struct { - arg1 *packagedatamodel.RegistrySecretOptions - }{arg1}) - stub := fake.ListSecretExportsStub - fakeReturns := fake.listSecretExportsReturns - fake.recordInvocation("ListSecretExports", []interface{}{arg1}) - fake.listSecretExportsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *PackageClient) ListSecretExportsCallCount() int { - fake.listSecretExportsMutex.RLock() - defer fake.listSecretExportsMutex.RUnlock() - return len(fake.listSecretExportsArgsForCall) -} - -func (fake *PackageClient) ListSecretExportsCalls(stub func(*packagedatamodel.RegistrySecretOptions) (*v1alpha1b.SecretExportList, error)) { - fake.listSecretExportsMutex.Lock() - defer fake.listSecretExportsMutex.Unlock() - fake.ListSecretExportsStub = stub -} - -func (fake *PackageClient) ListSecretExportsArgsForCall(i int) *packagedatamodel.RegistrySecretOptions { - fake.listSecretExportsMutex.RLock() - defer fake.listSecretExportsMutex.RUnlock() - argsForCall := fake.listSecretExportsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) ListSecretExportsReturns(result1 *v1alpha1b.SecretExportList, result2 error) { - fake.listSecretExportsMutex.Lock() - defer fake.listSecretExportsMutex.Unlock() - fake.ListSecretExportsStub = nil - fake.listSecretExportsReturns = struct { - result1 *v1alpha1b.SecretExportList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) ListSecretExportsReturnsOnCall(i int, result1 *v1alpha1b.SecretExportList, result2 error) { - fake.listSecretExportsMutex.Lock() - defer fake.listSecretExportsMutex.Unlock() - fake.ListSecretExportsStub = nil - if fake.listSecretExportsReturnsOnCall == nil { - fake.listSecretExportsReturnsOnCall = make(map[int]struct { - result1 *v1alpha1b.SecretExportList - result2 error - }) - } - fake.listSecretExportsReturnsOnCall[i] = struct { - result1 *v1alpha1b.SecretExportList - result2 error - }{result1, result2} -} - -func (fake *PackageClient) UninstallPackage(arg1 *packagedatamodel.PackageOptions, arg2 *packagedatamodel.PackageProgress) { - fake.uninstallPackageMutex.Lock() - fake.uninstallPackageArgsForCall = append(fake.uninstallPackageArgsForCall, struct { - arg1 *packagedatamodel.PackageOptions - arg2 *packagedatamodel.PackageProgress - }{arg1, arg2}) - stub := fake.UninstallPackageStub - fake.recordInvocation("UninstallPackage", []interface{}{arg1, arg2}) - fake.uninstallPackageMutex.Unlock() - if stub != nil { - fake.UninstallPackageStub(arg1, arg2) - } -} - -func (fake *PackageClient) UninstallPackageCallCount() int { - fake.uninstallPackageMutex.RLock() - defer fake.uninstallPackageMutex.RUnlock() - return len(fake.uninstallPackageArgsForCall) -} - -func (fake *PackageClient) UninstallPackageCalls(stub func(*packagedatamodel.PackageOptions, *packagedatamodel.PackageProgress)) { - fake.uninstallPackageMutex.Lock() - defer fake.uninstallPackageMutex.Unlock() - fake.UninstallPackageStub = stub -} - -func (fake *PackageClient) UninstallPackageArgsForCall(i int) (*packagedatamodel.PackageOptions, *packagedatamodel.PackageProgress) { - fake.uninstallPackageMutex.RLock() - defer fake.uninstallPackageMutex.RUnlock() - argsForCall := fake.uninstallPackageArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *PackageClient) UninstallPackageSync(arg1 *packagedatamodel.PackageOptions) error { - fake.uninstallPackageSyncMutex.Lock() - ret, specificReturn := fake.uninstallPackageSyncReturnsOnCall[len(fake.uninstallPackageSyncArgsForCall)] - fake.uninstallPackageSyncArgsForCall = append(fake.uninstallPackageSyncArgsForCall, struct { - arg1 *packagedatamodel.PackageOptions - }{arg1}) - stub := fake.UninstallPackageSyncStub - fakeReturns := fake.uninstallPackageSyncReturns - fake.recordInvocation("UninstallPackageSync", []interface{}{arg1}) - fake.uninstallPackageSyncMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *PackageClient) UninstallPackageSyncCallCount() int { - fake.uninstallPackageSyncMutex.RLock() - defer fake.uninstallPackageSyncMutex.RUnlock() - return len(fake.uninstallPackageSyncArgsForCall) -} - -func (fake *PackageClient) UninstallPackageSyncCalls(stub func(*packagedatamodel.PackageOptions) error) { - fake.uninstallPackageSyncMutex.Lock() - defer fake.uninstallPackageSyncMutex.Unlock() - fake.UninstallPackageSyncStub = stub -} - -func (fake *PackageClient) UninstallPackageSyncArgsForCall(i int) *packagedatamodel.PackageOptions { - fake.uninstallPackageSyncMutex.RLock() - defer fake.uninstallPackageSyncMutex.RUnlock() - argsForCall := fake.uninstallPackageSyncArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) UninstallPackageSyncReturns(result1 error) { - fake.uninstallPackageSyncMutex.Lock() - defer fake.uninstallPackageSyncMutex.Unlock() - fake.UninstallPackageSyncStub = nil - fake.uninstallPackageSyncReturns = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) UninstallPackageSyncReturnsOnCall(i int, result1 error) { - fake.uninstallPackageSyncMutex.Lock() - defer fake.uninstallPackageSyncMutex.Unlock() - fake.UninstallPackageSyncStub = nil - if fake.uninstallPackageSyncReturnsOnCall == nil { - fake.uninstallPackageSyncReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.uninstallPackageSyncReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) UpdatePackage(arg1 *packagedatamodel.PackageOptions, arg2 *packagedatamodel.PackageProgress, arg3 packagedatamodel.OperationType) { - fake.updatePackageMutex.Lock() - fake.updatePackageArgsForCall = append(fake.updatePackageArgsForCall, struct { - arg1 *packagedatamodel.PackageOptions - arg2 *packagedatamodel.PackageProgress - arg3 packagedatamodel.OperationType - }{arg1, arg2, arg3}) - stub := fake.UpdatePackageStub - fake.recordInvocation("UpdatePackage", []interface{}{arg1, arg2, arg3}) - fake.updatePackageMutex.Unlock() - if stub != nil { - fake.UpdatePackageStub(arg1, arg2, arg3) - } -} - -func (fake *PackageClient) UpdatePackageCallCount() int { - fake.updatePackageMutex.RLock() - defer fake.updatePackageMutex.RUnlock() - return len(fake.updatePackageArgsForCall) -} - -func (fake *PackageClient) UpdatePackageCalls(stub func(*packagedatamodel.PackageOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType)) { - fake.updatePackageMutex.Lock() - defer fake.updatePackageMutex.Unlock() - fake.UpdatePackageStub = stub -} - -func (fake *PackageClient) UpdatePackageArgsForCall(i int) (*packagedatamodel.PackageOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType) { - fake.updatePackageMutex.RLock() - defer fake.updatePackageMutex.RUnlock() - argsForCall := fake.updatePackageArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *PackageClient) UpdatePackageSync(arg1 *packagedatamodel.PackageOptions, arg2 packagedatamodel.OperationType) error { - fake.updatePackageSyncMutex.Lock() - ret, specificReturn := fake.updatePackageSyncReturnsOnCall[len(fake.updatePackageSyncArgsForCall)] - fake.updatePackageSyncArgsForCall = append(fake.updatePackageSyncArgsForCall, struct { - arg1 *packagedatamodel.PackageOptions - arg2 packagedatamodel.OperationType - }{arg1, arg2}) - stub := fake.UpdatePackageSyncStub - fakeReturns := fake.updatePackageSyncReturns - fake.recordInvocation("UpdatePackageSync", []interface{}{arg1, arg2}) - fake.updatePackageSyncMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *PackageClient) UpdatePackageSyncCallCount() int { - fake.updatePackageSyncMutex.RLock() - defer fake.updatePackageSyncMutex.RUnlock() - return len(fake.updatePackageSyncArgsForCall) -} - -func (fake *PackageClient) UpdatePackageSyncCalls(stub func(*packagedatamodel.PackageOptions, packagedatamodel.OperationType) error) { - fake.updatePackageSyncMutex.Lock() - defer fake.updatePackageSyncMutex.Unlock() - fake.UpdatePackageSyncStub = stub -} - -func (fake *PackageClient) UpdatePackageSyncArgsForCall(i int) (*packagedatamodel.PackageOptions, packagedatamodel.OperationType) { - fake.updatePackageSyncMutex.RLock() - defer fake.updatePackageSyncMutex.RUnlock() - argsForCall := fake.updatePackageSyncArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *PackageClient) UpdatePackageSyncReturns(result1 error) { - fake.updatePackageSyncMutex.Lock() - defer fake.updatePackageSyncMutex.Unlock() - fake.UpdatePackageSyncStub = nil - fake.updatePackageSyncReturns = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) UpdatePackageSyncReturnsOnCall(i int, result1 error) { - fake.updatePackageSyncMutex.Lock() - defer fake.updatePackageSyncMutex.Unlock() - fake.UpdatePackageSyncStub = nil - if fake.updatePackageSyncReturnsOnCall == nil { - fake.updatePackageSyncReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updatePackageSyncReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) UpdateRegistrySecret(arg1 *packagedatamodel.RegistrySecretOptions) error { - fake.updateRegistrySecretMutex.Lock() - ret, specificReturn := fake.updateRegistrySecretReturnsOnCall[len(fake.updateRegistrySecretArgsForCall)] - fake.updateRegistrySecretArgsForCall = append(fake.updateRegistrySecretArgsForCall, struct { - arg1 *packagedatamodel.RegistrySecretOptions - }{arg1}) - stub := fake.UpdateRegistrySecretStub - fakeReturns := fake.updateRegistrySecretReturns - fake.recordInvocation("UpdateRegistrySecret", []interface{}{arg1}) - fake.updateRegistrySecretMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *PackageClient) UpdateRegistrySecretCallCount() int { - fake.updateRegistrySecretMutex.RLock() - defer fake.updateRegistrySecretMutex.RUnlock() - return len(fake.updateRegistrySecretArgsForCall) -} - -func (fake *PackageClient) UpdateRegistrySecretCalls(stub func(*packagedatamodel.RegistrySecretOptions) error) { - fake.updateRegistrySecretMutex.Lock() - defer fake.updateRegistrySecretMutex.Unlock() - fake.UpdateRegistrySecretStub = stub -} - -func (fake *PackageClient) UpdateRegistrySecretArgsForCall(i int) *packagedatamodel.RegistrySecretOptions { - fake.updateRegistrySecretMutex.RLock() - defer fake.updateRegistrySecretMutex.RUnlock() - argsForCall := fake.updateRegistrySecretArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *PackageClient) UpdateRegistrySecretReturns(result1 error) { - fake.updateRegistrySecretMutex.Lock() - defer fake.updateRegistrySecretMutex.Unlock() - fake.UpdateRegistrySecretStub = nil - fake.updateRegistrySecretReturns = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) UpdateRegistrySecretReturnsOnCall(i int, result1 error) { - fake.updateRegistrySecretMutex.Lock() - defer fake.updateRegistrySecretMutex.Unlock() - fake.UpdateRegistrySecretStub = nil - if fake.updateRegistrySecretReturnsOnCall == nil { - fake.updateRegistrySecretReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateRegistrySecretReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) UpdateRepository(arg1 *packagedatamodel.RepositoryOptions, arg2 *packagedatamodel.PackageProgress, arg3 packagedatamodel.OperationType) { - fake.updateRepositoryMutex.Lock() - fake.updateRepositoryArgsForCall = append(fake.updateRepositoryArgsForCall, struct { - arg1 *packagedatamodel.RepositoryOptions - arg2 *packagedatamodel.PackageProgress - arg3 packagedatamodel.OperationType - }{arg1, arg2, arg3}) - stub := fake.UpdateRepositoryStub - fake.recordInvocation("UpdateRepository", []interface{}{arg1, arg2, arg3}) - fake.updateRepositoryMutex.Unlock() - if stub != nil { - fake.UpdateRepositoryStub(arg1, arg2, arg3) - } -} - -func (fake *PackageClient) UpdateRepositoryCallCount() int { - fake.updateRepositoryMutex.RLock() - defer fake.updateRepositoryMutex.RUnlock() - return len(fake.updateRepositoryArgsForCall) -} - -func (fake *PackageClient) UpdateRepositoryCalls(stub func(*packagedatamodel.RepositoryOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType)) { - fake.updateRepositoryMutex.Lock() - defer fake.updateRepositoryMutex.Unlock() - fake.UpdateRepositoryStub = stub -} - -func (fake *PackageClient) UpdateRepositoryArgsForCall(i int) (*packagedatamodel.RepositoryOptions, *packagedatamodel.PackageProgress, packagedatamodel.OperationType) { - fake.updateRepositoryMutex.RLock() - defer fake.updateRepositoryMutex.RUnlock() - argsForCall := fake.updateRepositoryArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *PackageClient) UpdateRepositorySync(arg1 *packagedatamodel.RepositoryOptions, arg2 packagedatamodel.OperationType) error { - fake.updateRepositorySyncMutex.Lock() - ret, specificReturn := fake.updateRepositorySyncReturnsOnCall[len(fake.updateRepositorySyncArgsForCall)] - fake.updateRepositorySyncArgsForCall = append(fake.updateRepositorySyncArgsForCall, struct { - arg1 *packagedatamodel.RepositoryOptions - arg2 packagedatamodel.OperationType - }{arg1, arg2}) - stub := fake.UpdateRepositorySyncStub - fakeReturns := fake.updateRepositorySyncReturns - fake.recordInvocation("UpdateRepositorySync", []interface{}{arg1, arg2}) - fake.updateRepositorySyncMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *PackageClient) UpdateRepositorySyncCallCount() int { - fake.updateRepositorySyncMutex.RLock() - defer fake.updateRepositorySyncMutex.RUnlock() - return len(fake.updateRepositorySyncArgsForCall) -} - -func (fake *PackageClient) UpdateRepositorySyncCalls(stub func(*packagedatamodel.RepositoryOptions, packagedatamodel.OperationType) error) { - fake.updateRepositorySyncMutex.Lock() - defer fake.updateRepositorySyncMutex.Unlock() - fake.UpdateRepositorySyncStub = stub -} - -func (fake *PackageClient) UpdateRepositorySyncArgsForCall(i int) (*packagedatamodel.RepositoryOptions, packagedatamodel.OperationType) { - fake.updateRepositorySyncMutex.RLock() - defer fake.updateRepositorySyncMutex.RUnlock() - argsForCall := fake.updateRepositorySyncArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *PackageClient) UpdateRepositorySyncReturns(result1 error) { - fake.updateRepositorySyncMutex.Lock() - defer fake.updateRepositorySyncMutex.Unlock() - fake.UpdateRepositorySyncStub = nil - fake.updateRepositorySyncReturns = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) UpdateRepositorySyncReturnsOnCall(i int, result1 error) { - fake.updateRepositorySyncMutex.Lock() - defer fake.updateRepositorySyncMutex.Unlock() - fake.UpdateRepositorySyncStub = nil - if fake.updateRepositorySyncReturnsOnCall == nil { - fake.updateRepositorySyncReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateRepositorySyncReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *PackageClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.addRegistrySecretMutex.RLock() - defer fake.addRegistrySecretMutex.RUnlock() - fake.addRepositoryMutex.RLock() - defer fake.addRepositoryMutex.RUnlock() - fake.addRepositorySyncMutex.RLock() - defer fake.addRepositorySyncMutex.RUnlock() - fake.deleteRegistrySecretMutex.RLock() - defer fake.deleteRegistrySecretMutex.RUnlock() - fake.deleteRepositoryMutex.RLock() - defer fake.deleteRepositoryMutex.RUnlock() - fake.deleteRepositorySyncMutex.RLock() - defer fake.deleteRepositorySyncMutex.RUnlock() - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - fake.getPackageInstallMutex.RLock() - defer fake.getPackageInstallMutex.RUnlock() - fake.getRepositoryMutex.RLock() - defer fake.getRepositoryMutex.RUnlock() - fake.getSecretExportMutex.RLock() - defer fake.getSecretExportMutex.RUnlock() - fake.installPackageMutex.RLock() - defer fake.installPackageMutex.RUnlock() - fake.installPackageSyncMutex.RLock() - defer fake.installPackageSyncMutex.RUnlock() - fake.listPackageInstallsMutex.RLock() - defer fake.listPackageInstallsMutex.RUnlock() - fake.listPackageMetadataMutex.RLock() - defer fake.listPackageMetadataMutex.RUnlock() - fake.listPackagesMutex.RLock() - defer fake.listPackagesMutex.RUnlock() - fake.listRegistrySecretsMutex.RLock() - defer fake.listRegistrySecretsMutex.RUnlock() - fake.listRepositoriesMutex.RLock() - defer fake.listRepositoriesMutex.RUnlock() - fake.listSecretExportsMutex.RLock() - defer fake.listSecretExportsMutex.RUnlock() - fake.uninstallPackageMutex.RLock() - defer fake.uninstallPackageMutex.RUnlock() - fake.uninstallPackageSyncMutex.RLock() - defer fake.uninstallPackageSyncMutex.RUnlock() - fake.updatePackageMutex.RLock() - defer fake.updatePackageMutex.RUnlock() - fake.updatePackageSyncMutex.RLock() - defer fake.updatePackageSyncMutex.RUnlock() - fake.updateRegistrySecretMutex.RLock() - defer fake.updateRegistrySecretMutex.RUnlock() - fake.updateRepositoryMutex.RLock() - defer fake.updateRepositoryMutex.RUnlock() - fake.updateRepositorySyncMutex.RLock() - defer fake.updateRepositorySyncMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *PackageClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ packageclient.PackageClient = new(PackageClient) diff --git a/packageclients/pkg/kappclient/client.go b/packageclients/pkg/kappclient/client.go deleted file mode 100644 index 77aac3c476..0000000000 --- a/packageclients/pkg/kappclient/client.go +++ /dev/null @@ -1,361 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package kappclient - -import ( - "context" - "fmt" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/apiutil" - k8sconfig "sigs.k8s.io/controller-runtime/pkg/client/config" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - secretgenctrl "github.com/vmware-tanzu/carvel-secretgen-controller/pkg/apis/secretgen2/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -type client struct { - client crtclient.Client -} - -// GetClient returns k8s client filed of the client -func (c *client) GetClient() crtclient.Client { - return c.client -} - -// NewKappClient returns a new kapp client -func NewKappClient(kubeCfgPath string) (Client, error) { - return NewKappClientForContext(kubeCfgPath, "") -} - -func NewKappClientForContext(kubeCfgPath, kubeContext string) (Client, error) { - var ( - restConfig *rest.Config - err error - ) - - scheme := runtime.NewScheme() - if err := corev1.AddToScheme(scheme); err != nil { - return nil, err - } - if err := rbacv1.AddToScheme(scheme); err != nil { - return nil, err - } - if err := kappipkg.AddToScheme(scheme); err != nil { - return nil, err - } - if err := kapppkg.AddToScheme(scheme); err != nil { - return nil, err - } - if err := kappctrl.AddToScheme(scheme); err != nil { - return nil, err - } - if err := secretgenctrl.AddToScheme(scheme); err != nil { - return nil, err - } - - if restConfig, err = GetKubeConfigForContext(kubeCfgPath, kubeContext); err != nil { - return nil, err - } - - // As there are many registered resources in the cluster, set the values for the maximum number of - // queries per second and the maximum burst for throttle to a high value to avoid throttling of messages - restConfig.QPS = packagedatamodel.DefaultQPS - restConfig.Burst = packagedatamodel.DefaultBurst - - mapper, err := apiutil.NewDynamicRESTMapper(restConfig, apiutil.WithLazyDiscovery) - if err != nil { - return nil, errors.Wrap(err, "Unable to set up rest mapper") - } - crtClient, err := crtclient.New(restConfig, crtclient.Options{Scheme: scheme, Mapper: mapper}) - if err != nil { - return nil, errors.Wrap(err, "Unable to create cluster client") - } - return &client{client: crtClient}, nil -} - -// GetKubeConfig gets kubeconfig from the provided kubeconfig path. Otherwise, it gets the kubeconfig from "$HOME/.kube/config" if existing -func GetKubeConfig(kubeCfgPath string) (*rest.Config, error) { - return GetKubeConfigForContext(kubeCfgPath, "") -} - -// GetKubeConfigForContext gets kubeconfig from the provided kubeconfig path. Otherwise, it gets the kubeconfig from "$HOME/.kube/config" if existing -func GetKubeConfigForContext(kubeCfgPath, kubeContext string) (*rest.Config, error) { - var ( - restConfig *rest.Config - err error - ) - - if kubeCfgPath == "" { - if restConfig, err = k8sconfig.GetConfig(); err != nil { - return nil, err - } - } else { - config, err := clientcmd.LoadFromFile(kubeCfgPath) - if err != nil { - return nil, errors.Wrapf(err, "failed to load kubeconfig from %s", kubeCfgPath) - } - if kubeContext != "" { - config.CurrentContext = kubeContext - } - rawConfig, err := clientcmd.Write(*config) - if err != nil { - return nil, errors.Wrap(err, "Unable to write config") - } - if restConfig, err = clientcmd.RESTConfigFromKubeConfig(rawConfig); err != nil { - return nil, errors.Wrap(err, "Unable to set up rest config") - } - } - - return restConfig, nil -} - -func (c *client) addAnnotations(meta *v1.ObjectMeta, pkgPluginResourceCreationStatus *packagedatamodel.PkgPluginResourceCreationStatus) { - if meta.Annotations == nil { - meta.Annotations = make(map[string]string) - } - if pkgPluginResourceCreationStatus.IsServiceAccountCreated { - meta.Annotations[packagedatamodel.TanzuPkgPluginAnnotation+"-"+packagedatamodel.KindClusterRole] = fmt.Sprintf(packagedatamodel.ClusterRoleName, meta.Name, meta.Namespace) - meta.Annotations[packagedatamodel.TanzuPkgPluginAnnotation+"-"+packagedatamodel.KindClusterRoleBinding] = fmt.Sprintf(packagedatamodel.ClusterRoleBindingName, meta.Name, meta.Namespace) - meta.Annotations[packagedatamodel.TanzuPkgPluginAnnotation+"-"+packagedatamodel.KindServiceAccount] = fmt.Sprintf(packagedatamodel.ServiceAccountName, meta.Name, meta.Namespace) - } - if pkgPluginResourceCreationStatus.IsSecretCreated { - meta.Annotations[packagedatamodel.TanzuPkgPluginAnnotation+"-"+packagedatamodel.KindSecret] = fmt.Sprintf(packagedatamodel.SecretName, meta.Name, meta.Namespace) - } -} - -// CreatePackageRepository creates a PackageRepository CR -func (c *client) CreatePackageRepository(repository *kappipkg.PackageRepository) error { - if err := c.client.Create(context.Background(), repository); err != nil { - return err - } - - return nil -} - -// DeletePackageRepository deletes the provided PackageRepository CR -func (c *client) DeletePackageRepository(repository *kappipkg.PackageRepository) error { - if err := c.client.Delete(context.Background(), repository); err != nil { - return err - } - - return nil -} - -// CreatePackageInstall creates a PackageInstall CR -func (c *client) CreatePackageInstall(packageInstall *kappipkg.PackageInstall, pkgPluginResourceCreationStatus *packagedatamodel.PkgPluginResourceCreationStatus) error { - installedPkg := packageInstall.DeepCopy() - c.addAnnotations(&installedPkg.ObjectMeta, pkgPluginResourceCreationStatus) - - if err := c.client.Create(context.Background(), installedPkg); err != nil { - return err - } - - return nil -} - -// GetAppCR gets the App CR -func (c *client) GetAppCR(appName, namespace string) (*kappctrl.App, error) { - app := &kappctrl.App{} - if err := c.client.Get(context.Background(), crtclient.ObjectKey{Name: appName, Namespace: namespace}, app); err != nil { - return nil, err - } - - return app, nil -} - -// GetPackageInstall gets the PackageInstall CR for the provided package name -func (c *client) GetPackageInstall(packageInstallName, namespace string) (*kappipkg.PackageInstall, error) { - installedPkg := &kappipkg.PackageInstall{} - if err := c.client.Get(context.Background(), crtclient.ObjectKey{Name: packageInstallName, Namespace: namespace}, installedPkg); err != nil { - return nil, err - } - - return installedPkg, nil -} - -// GetPackageMetadataByName gets the package with the specified name -func (c *client) GetPackageMetadataByName(packageName, namespace string) (*kapppkg.PackageMetadata, error) { - pkg := &kapppkg.PackageMetadata{} - if err := c.client.Get(context.Background(), crtclient.ObjectKey{Name: packageName, Namespace: namespace}, pkg); err != nil { - return nil, err - } - - return pkg, nil -} - -// GetPackageRepository gets the PackageRepository CR -func (c *client) GetPackageRepository(repositoryName, namespace string) (*kappipkg.PackageRepository, error) { - repository := &kappipkg.PackageRepository{} - err := c.client.Get(context.Background(), crtclient.ObjectKey{Name: repositoryName, Namespace: namespace}, repository) - if err != nil { - return nil, err - } - return repository, nil -} - -// ListPackageRepositories gets the list of PackageRepository CRs -func (c *client) ListPackageRepositories(namespace string) (*kappipkg.PackageRepositoryList, error) { - var selectors []crtclient.ListOption - repositoryList := &kappipkg.PackageRepositoryList{} - - selectors = []crtclient.ListOption{crtclient.InNamespace(namespace)} - - err := c.client.List(context.Background(), repositoryList, selectors...) - if err != nil { - return nil, err - } - return repositoryList, nil -} - -// ListRegistrySecrets gets the list of all Secrets of type "kubernetes.io/dockerconfigjson" -func (c *client) ListRegistrySecrets(namespace string) (*corev1.SecretList, error) { - var selectors []crtclient.ListOption - secretList := &corev1.SecretList{} - - selectors = []crtclient.ListOption{crtclient.InNamespace(namespace), crtclient.MatchingFields(map[string]string{"type": string(corev1.SecretTypeDockerConfigJson)})} - - err := c.client.List(context.Background(), secretList, selectors...) - if err != nil { - return nil, err - } - return secretList, nil -} - -// ListSecretExports gets the list of all SecretExports -func (c *client) ListSecretExports(namespace string) (*secretgenctrl.SecretExportList, error) { - var selectors []crtclient.ListOption - secretExportList := &secretgenctrl.SecretExportList{} - - selectors = []crtclient.ListOption{crtclient.InNamespace(namespace)} - - err := c.client.List(context.Background(), secretExportList, selectors...) - if err != nil { - return nil, err - } - return secretExportList, nil -} - -// GetSecretExport gets the SecretExport having the same name and namespace as specified secret -func (c *client) GetSecretExport(secretName, namespace string) (*secretgenctrl.SecretExport, error) { - secretExport := &secretgenctrl.SecretExport{} - err := c.client.Get(context.Background(), crtclient.ObjectKey{Name: secretName, Namespace: namespace}, secretExport) - if err != nil { - return nil, err - } - return secretExport, nil -} - -// ListPackageMetadata gets the list of PackageMetadata CRs -func (c *client) ListPackageMetadata(namespace string) (*kapppkg.PackageMetadataList, error) { - var selectors []crtclient.ListOption - packageList := &kapppkg.PackageMetadataList{} - - selectors = []crtclient.ListOption{crtclient.InNamespace(namespace)} - - err := c.client.List(context.Background(), packageList, selectors...) - if err != nil { - return nil, err - } - return packageList, nil -} - -// ListPackageInstalls gets the list of PackageInstall CR in the specified namespace. -// If no namespace be provided, it returns the list of installed packages across all namespaces -func (c *client) ListPackageInstalls(namespace string) (*kappipkg.PackageInstallList, error) { - var selectors []crtclient.ListOption - packageInstallList := &kappipkg.PackageInstallList{} - - selectors = []crtclient.ListOption{crtclient.InNamespace(namespace)} - - if err := c.client.List(context.Background(), packageInstallList, selectors...); err != nil { - return nil, err - } - - return packageInstallList, nil -} - -// ListPackages gets the list of Package CRs -func (c *client) ListPackages(packageName, namespace string) (*kapppkg.PackageList, error) { - var selectors []crtclient.ListOption - packageVersionList := &kapppkg.PackageList{} - - if packageName != "" { - selectors = []crtclient.ListOption{ - crtclient.MatchingFields(map[string]string{"spec.refName": packageName}), - crtclient.InNamespace(namespace), - } - } - - if err := c.client.List(context.Background(), packageVersionList, selectors...); err != nil { - return nil, err - } - - return packageVersionList, nil -} - -// UpdatePackageInstall updates the PackageInstall CR -func (c *client) UpdatePackageInstall(packageInstall *kappipkg.PackageInstall, pkgPluginResourceCreationStatus *packagedatamodel.PkgPluginResourceCreationStatus) error { - c.addAnnotations(&packageInstall.ObjectMeta, pkgPluginResourceCreationStatus) - - if err := c.client.Update(context.Background(), packageInstall); err != nil { - return err - } - - return nil -} - -// GetPackage gets Package CR -func (c *client) GetPackage(packageName, namespace string) (*kapppkg.Package, error) { - pkg := &kapppkg.Package{} - if err := c.client.Get(context.Background(), crtclient.ObjectKey{Name: packageName, Namespace: namespace}, pkg); err != nil { - return nil, err - } - return pkg, nil -} - -// UpdatePackageRepository updates a PackageRepository CR -func (c *client) UpdatePackageRepository(repository *kappipkg.PackageRepository) error { - if err := c.client.Update(context.Background(), repository); err != nil { - return err - } - - return nil -} - -func (c *client) GetSecretValue(secretName, namespace string) ([]byte, error) { - var err error - - secret := &corev1.Secret{} - err = c.client.Get(context.Background(), crtclient.ObjectKey{Name: secretName, Namespace: namespace}, secret) - if err != nil { - return nil, err - } - - var data []byte - for _, value := range secret.Data { - stringValue := string(value) - if len(stringValue) < 3 { - data = append(data, packagedatamodel.YamlSeparator...) - data = append(data, "\n"...) - } - if len(stringValue) >= 3 && stringValue[:3] != packagedatamodel.YamlSeparator { - data = append(data, packagedatamodel.YamlSeparator...) - data = append(data, "\n"...) - } - data = append(data, value...) - } - - return data, nil -} diff --git a/packageclients/pkg/kappclient/interface.go b/packageclients/pkg/kappclient/interface.go deleted file mode 100644 index 6a81163ddc..0000000000 --- a/packageclients/pkg/kappclient/interface.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package kappclient provides CRUD functionality for kapp-controller related resources -package kappclient - -import ( - corev1 "k8s.io/api/core/v1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - secretgen "github.com/vmware-tanzu/carvel-secretgen-controller/pkg/apis/secretgen2/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -//go:generate counterfeiter -o ../fakes -generate - -// Client is the kapp client interface -// -//counterfeiter:generate -o ../fakes/kappclient.go --fake-name KappClient . Client -type Client interface { - CreatePackageInstall(packageInstall *kappipkg.PackageInstall, pkgPluginResourceCreationStatus *packagedatamodel.PkgPluginResourceCreationStatus) error - CreatePackageRepository(repository *kappipkg.PackageRepository) error - DeletePackageRepository(repository *kappipkg.PackageRepository) error - GetAppCR(appName string, namespace string) (*kappctrl.App, error) - GetClient() crtclient.Client - GetPackageInstall(packageInstallName string, namespace string) (*kappipkg.PackageInstall, error) - GetPackageMetadataByName(packageName string, namespace string) (*kapppkg.PackageMetadata, error) - GetPackageRepository(repositoryName, namespace string) (*kappipkg.PackageRepository, error) - GetPackage(packageName string, namespace string) (*kapppkg.Package, error) - GetSecretExport(secretName, namespace string) (*secretgen.SecretExport, error) - GetSecretValue(secretName, namespace string) ([]byte, error) - ListPackageInstalls(namespace string) (*kappipkg.PackageInstallList, error) - ListPackageMetadata(namespace string) (*kapppkg.PackageMetadataList, error) - ListPackages(packageName string, namespace string) (*kapppkg.PackageList, error) - ListPackageRepositories(namespace string) (*kappipkg.PackageRepositoryList, error) - ListRegistrySecrets(namespace string) (*corev1.SecretList, error) - ListSecretExports(namespace string) (*secretgen.SecretExportList, error) - UpdatePackageInstall(packageInstall *kappipkg.PackageInstall, pkgPluginResourceCreationStatus *packagedatamodel.PkgPluginResourceCreationStatus) error - UpdatePackageRepository(repository *kappipkg.PackageRepository) error -} diff --git a/packageclients/pkg/packageclient/client.go b/packageclients/pkg/packageclient/client.go deleted file mode 100644 index 7f41fd1409..0000000000 --- a/packageclients/pkg/packageclient/client.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/kappclient" -) - -type pkgClient struct { - kappClient kappclient.Client -} - -// NewPackageClient instantiates pkgClient pkgClient with kubeconfig -func NewPackageClient(kubeconfigPath string) (PackageClient, error) { - return NewPackageClientForContext(kubeconfigPath, "") -} - -// NewPackageClientForContext instantiates pkgClient with kubeconfig and kubecontext -func NewPackageClientForContext(kubeconfigPath, kubeContext string) (PackageClient, error) { - var err error - client := &pkgClient{} - - if client.kappClient, err = kappclient.NewKappClientForContext(kubeconfigPath, kubeContext); err != nil { - return nil, err - } - - return client, nil -} - -func NewPackageClientWithKappClient(kappClient kappclient.Client) (PackageClient, error) { - return &pkgClient{ - kappClient: kappClient, - }, nil -} diff --git a/packageclients/pkg/packageclient/display_utils.go b/packageclients/pkg/packageclient/display_utils.go deleted file mode 100644 index 3467548721..0000000000 --- a/packageclients/pkg/packageclient/display_utils.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "fmt" - "os" - "time" - - "github.com/aunum/log" - "github.com/briandowns/spinner" - "github.com/mattn/go-isatty" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -// DisplayProgress creates an spinner instance; keeps receiving the progress messages in the channel and displays those using the spinner until an error occurs -func DisplayProgress(initialMsg string, pp *packagedatamodel.PackageProgress) error { //nolint:gocyclo - var ( - currMsg string - s *spinner.Spinner - err error - ) - - newSpinner := func() (*spinner.Spinner, error) { - s = spinner.New(spinner.CharSets[9], 100*time.Millisecond) - if err := s.Color("bgBlack", "bold", "fgWhite"); err != nil { - return nil, err - } - return s, nil - } - if s, err = newSpinner(); err != nil { - return err - } - - s.Suffix = fmt.Sprintf(" %s", initialMsg) - // Start the spinner only if attached to terminal - attachedToTerminal := isatty.IsTerminal(os.Stdout.Fd()) || isatty.IsCygwinTerminal(os.Stdout.Fd()) - if attachedToTerminal { - s.Start() - } - - writeProgressToSpinner := func(s *spinner.Spinner, msg string) error { - if !attachedToTerminal { - return nil - } - spinnerMsg := s.Suffix - s.Stop() - if s, err = newSpinner(); err != nil { - return err - } - // Stopping the spinner would eliminate the whole line - // We want to keep the spinner message to give users more contexts - log.Infof("%s\n", spinnerMsg) - s.Suffix = fmt.Sprintf(" %s", msg) - s.Start() - return nil - } - - defer func() { - if attachedToTerminal { - s.Stop() - } - }() - for { - select { - case err := <-pp.Err: - s.FinalMSG = "\n\n" - return err - case msg := <-pp.ProgressMsg: - if msg != currMsg { - if err := writeProgressToSpinner(s, msg); err != nil { - return err - } - currMsg = msg - } - case <-pp.Done: - for msg := range pp.ProgressMsg { - if msg == currMsg { - continue - } - if err := writeProgressToSpinner(s, msg); err != nil { - return err - } - currMsg = msg - } - return nil - } - } -} - -func newPackageProgress() *packagedatamodel.PackageProgress { - return &packagedatamodel.PackageProgress{ - ProgressMsg: make(chan string, 10), - Err: make(chan error), - Done: make(chan struct{}), - } -} diff --git a/packageclients/pkg/packageclient/image_utils.go b/packageclients/pkg/packageclient/image_utils.go deleted file mode 100644 index c5aedd01fd..0000000000 --- a/packageclients/pkg/packageclient/image_utils.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "fmt" - "strings" - - "github.com/google/go-containerregistry/pkg/name" - "github.com/pkg/errors" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -// ParseRegistryImageURL parses the registry image URL to get repository and tag, tag is empty if not specified -func ParseRegistryImageURL(imgURL string) (repository, tag string, err error) { - ref, err := name.ParseReference(imgURL, name.WeakValidation) - if err != nil { - return "", "", err - } - - repository = ref.Context().String() - tag = ref.Identifier() - // the parser function sets the tag to "latest" if not specified, however we want it to be empty - if tag == packagedatamodel.DefaultRepositoryImageTag && !strings.HasSuffix(imgURL, ":"+packagedatamodel.DefaultRepositoryImageTag) { - tag = "" - } - return repository, tag, nil -} - -// GetCurrentRepositoryAndTagInUse fetches the current tag used by package repository, taking tagselection into account -func GetCurrentRepositoryAndTagInUse(pkgr *kappipkg.PackageRepository) (repository, tag string, err error) { - if pkgr.Spec.Fetch == nil || pkgr.Spec.Fetch.ImgpkgBundle == nil { - return "", "", errors.New("failed to find OCI registry URL") - } - - repository, tag, err = ParseRegistryImageURL(pkgr.Spec.Fetch.ImgpkgBundle.Image) - if err != nil { - return "", "", errors.Wrap(err, "failed to parse OCI registry URL") - } - - if tag == "" { - tag = packagedatamodel.DefaultRepositoryImageTag - } - - if pkgr.Spec.Fetch.ImgpkgBundle.TagSelection != nil && pkgr.Spec.Fetch.ImgpkgBundle.TagSelection.Semver != nil { - tag = fmt.Sprintf("(%s)", pkgr.Spec.Fetch.ImgpkgBundle.TagSelection.Semver.Constraints) - } - - return repository, tag, nil -} diff --git a/packageclients/pkg/packageclient/image_utils_test.go b/packageclients/pkg/packageclient/image_utils_test.go deleted file mode 100644 index 72af4e9290..0000000000 --- a/packageclients/pkg/packageclient/image_utils_test.go +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - versions "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/versions/v1alpha1" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var _ = Describe("Test image utils", func() { - Context("check tag in image URL", func() { - - It("should have error if image url isn't valid", func() { - // case 1 - repository, tag, err := ParseRegistryImageURL("sftp://user:passwd@example.com/foo/bar:latest") - Expect(err).To(HaveOccurred()) - Expect(repository).To(Equal("")) - Expect(tag).To(Equal("")) - }) - - It("should give the correct tag when tag is specified", func() { - // case 1 - repository, tag, err := ParseRegistryImageURL("foo/bar:1.1") - Expect(err).NotTo(HaveOccurred()) - Expect(repository).To(Equal("index.docker.io/foo/bar")) - Expect(tag).To(Equal("1.1")) - - // case 2 - repository, tag, err = ParseRegistryImageURL("localhost.localdomain:5000/foo/bar:latest") - Expect(err).NotTo(HaveOccurred()) - Expect(repository).To(Equal("localhost.localdomain:5000/foo/bar")) - Expect(tag).To(Equal("latest")) - }) - - It("should give the empty tag when tag is not specified", func() { - // case 1 - repository, tag, err := ParseRegistryImageURL("foo/bar") - Expect(err).NotTo(HaveOccurred()) - Expect(repository).To(Equal("index.docker.io/foo/bar")) - Expect(tag).To(Equal("")) - - // case 2 - repository, tag, err = ParseRegistryImageURL("localhost.localdomain:5000/foo/bar") - Expect(err).NotTo(HaveOccurred()) - Expect(repository).To(Equal("localhost.localdomain:5000/foo/bar")) - Expect(tag).To(Equal("")) - }) - - It("should give the digest when sha256 is specified", func() { - // case 1 - repository, tag, err := ParseRegistryImageURL("us-east4-docker.pkg.dev/cf-sandbox-dkalinin/test-areg-private/example-pkg-repo@sha256:a80e9b512b9eff76ab638cce50a3c4541a12673d9b698103314f32c93f1deb61") - Expect(err).NotTo(HaveOccurred()) - Expect(repository).To(Equal("us-east4-docker.pkg.dev/cf-sandbox-dkalinin/test-areg-private/example-pkg-repo")) - Expect(tag).To(Equal("sha256:a80e9b512b9eff76ab638cce50a3c4541a12673d9b698103314f32c93f1deb61")) - - // case 2 - repository, tag, err = ParseRegistryImageURL("projects-stg.registry.vmware.com/tkg/packages/standard/repo@sha256:dce0b8e03a2a2f8b7ddb732def271f50435b490875c9e90ce3df51cae8af68e5") - Expect(err).NotTo(HaveOccurred()) - Expect(repository).To(Equal("projects-stg.registry.vmware.com/tkg/packages/standard/repo")) - Expect(tag).To(Equal("sha256:dce0b8e03a2a2f8b7ddb732def271f50435b490875c9e90ce3df51cae8af68e5")) - }) - }) - - Context("get current repository and tag", func() { - - It("should get tag from URL when tagselection is not specified", func() { - // case 1 - pkgr := &kappipkg.PackageRepository{ - TypeMeta: metav1.TypeMeta{APIVersion: packagedatamodel.DefaultAPIVersion, Kind: packagedatamodel.KindPackageRepository}, - ObjectMeta: metav1.ObjectMeta{Name: testRepoName, Namespace: testNamespaceName}, - Spec: kappipkg.PackageRepositorySpec{Fetch: &kappipkg.PackageRepositoryFetch{ - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{Image: "localhost.localdomain:5000/foo/bar"}, - }}, - } - repository, tag, err := GetCurrentRepositoryAndTagInUse(pkgr) - Expect(err).ToNot(HaveOccurred()) - Expect(repository).To(Equal("localhost.localdomain:5000/foo/bar")) - Expect(tag).To(Equal(packagedatamodel.DefaultRepositoryImageTag)) - - // case 2 - pkgr = &kappipkg.PackageRepository{ - TypeMeta: metav1.TypeMeta{APIVersion: packagedatamodel.DefaultAPIVersion, Kind: packagedatamodel.KindPackageRepository}, - ObjectMeta: metav1.ObjectMeta{Name: testRepoName, Namespace: testNamespaceName}, - Spec: kappipkg.PackageRepositorySpec{Fetch: &kappipkg.PackageRepositoryFetch{ - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{Image: "projects-stg.registry.vmware.com/tkg/test-packages/test-repo:v1.1.0"}, - }}, - } - repository, tag, err = GetCurrentRepositoryAndTagInUse(pkgr) - Expect(err).ToNot(HaveOccurred()) - Expect(repository).To(Equal("projects-stg.registry.vmware.com/tkg/test-packages/test-repo")) - Expect(tag).To(Equal("v1.1.0")) - - // case 3 - pkgr = &kappipkg.PackageRepository{ - TypeMeta: metav1.TypeMeta{APIVersion: packagedatamodel.DefaultAPIVersion, Kind: packagedatamodel.KindPackageRepository}, - ObjectMeta: metav1.ObjectMeta{Name: testRepoName, Namespace: testNamespaceName}, - Spec: kappipkg.PackageRepositorySpec{Fetch: &kappipkg.PackageRepositoryFetch{ - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{Image: "foo/bar:latest"}, - }}, - } - repository, tag, err = GetCurrentRepositoryAndTagInUse(pkgr) - Expect(err).ToNot(HaveOccurred()) - Expect(repository).To(Equal("index.docker.io/foo/bar")) - Expect(tag).To(Equal("latest")) - }) - - It("should have tag constraint when tagselection is specified", func() { - // case 1 - pkgr := &kappipkg.PackageRepository{ - TypeMeta: metav1.TypeMeta{APIVersion: packagedatamodel.DefaultAPIVersion, Kind: packagedatamodel.KindPackageRepository}, - ObjectMeta: metav1.ObjectMeta{Name: testRepoName, Namespace: testNamespaceName}, - Spec: kappipkg.PackageRepositorySpec{Fetch: &kappipkg.PackageRepositoryFetch{ - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{ - Image: "localhost.localdomain:5000/foo/bar", - TagSelection: &versions.VersionSelection{ - Semver: &versions.VersionSelectionSemver{ - Constraints: ">0.0.0", - }, - }, - }, - }}, - } - repository, tag, err := GetCurrentRepositoryAndTagInUse(pkgr) - Expect(err).ToNot(HaveOccurred()) - Expect(repository).To(Equal("localhost.localdomain:5000/foo/bar")) - Expect(tag).To(ContainSubstring(packagedatamodel.DefaultRepositoryImageTagConstraint)) - - // case 2 - pkgr = &kappipkg.PackageRepository{ - TypeMeta: metav1.TypeMeta{APIVersion: packagedatamodel.DefaultAPIVersion, Kind: packagedatamodel.KindPackageRepository}, - ObjectMeta: metav1.ObjectMeta{Name: testRepoName, Namespace: testNamespaceName}, - Spec: kappipkg.PackageRepositorySpec{Fetch: &kappipkg.PackageRepositoryFetch{ - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{ - Image: "projects-stg.registry.vmware.com/tkg/test-packages/test-repo:v1.1.0", - TagSelection: &versions.VersionSelection{ - Semver: &versions.VersionSelectionSemver{ - Constraints: ">0.0.0", - }, - }, - }, - }}, - } - repository, tag, err = GetCurrentRepositoryAndTagInUse(pkgr) - Expect(err).ToNot(HaveOccurred()) - Expect(repository).To(Equal("projects-stg.registry.vmware.com/tkg/test-packages/test-repo")) - Expect(tag).To(ContainSubstring(packagedatamodel.DefaultRepositoryImageTagConstraint)) - - // case 3 - pkgr = &kappipkg.PackageRepository{ - TypeMeta: metav1.TypeMeta{APIVersion: packagedatamodel.DefaultAPIVersion, Kind: packagedatamodel.KindPackageRepository}, - ObjectMeta: metav1.ObjectMeta{Name: testRepoName, Namespace: testNamespaceName}, - Spec: kappipkg.PackageRepositorySpec{Fetch: &kappipkg.PackageRepositoryFetch{ - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{ - Image: "foo/bar:latest", - TagSelection: &versions.VersionSelection{ - Semver: &versions.VersionSelectionSemver{ - Constraints: ">0.0.0", - }, - }, - }, - }}, - } - repository, tag, err = GetCurrentRepositoryAndTagInUse(pkgr) - Expect(err).ToNot(HaveOccurred()) - Expect(repository).To(Equal("index.docker.io/foo/bar")) - Expect(tag).To(ContainSubstring(packagedatamodel.DefaultRepositoryImageTagConstraint)) - }) - }) -}) diff --git a/packageclients/pkg/packageclient/interface.go b/packageclients/pkg/packageclient/interface.go deleted file mode 100644 index 50d0bdbde1..0000000000 --- a/packageclients/pkg/packageclient/interface.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package packageclient provides functionality for package plugin -package packageclient - -import ( - corev1 "k8s.io/api/core/v1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - secretgen "github.com/vmware-tanzu/carvel-secretgen-controller/pkg/apis/secretgen2/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -//go:generate counterfeiter -o ../fakes -generate - -// PackageClient is the TKG package client interface -// -//counterfeiter:generate -o ../fakes/packageclient.go --fake-name PackageClient . PackageClient -type PackageClient interface { - AddRegistrySecret(o *packagedatamodel.RegistrySecretOptions) error - AddRepository(o *packagedatamodel.RepositoryOptions, packageProgress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) - AddRepositorySync(o *packagedatamodel.RepositoryOptions, operationType packagedatamodel.OperationType) error - DeleteRegistrySecret(o *packagedatamodel.RegistrySecretOptions) (bool, error) - DeleteRepository(o *packagedatamodel.RepositoryOptions, packageProgress *packagedatamodel.PackageProgress) - DeleteRepositorySync(o *packagedatamodel.RepositoryOptions) error - GetPackageInstall(o *packagedatamodel.PackageOptions) (*kappipkg.PackageInstall, error) - GetPackage(o *packagedatamodel.PackageOptions) (*kapppkg.PackageMetadata, *kapppkg.Package, error) - GetRepository(o *packagedatamodel.RepositoryOptions) (*kappipkg.PackageRepository, error) - GetSecretExport(o *packagedatamodel.RegistrySecretOptions) (*secretgen.SecretExport, error) - InstallPackage(o *packagedatamodel.PackageOptions, packageProgress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) - InstallPackageSync(o *packagedatamodel.PackageOptions, operationType packagedatamodel.OperationType) error - ListPackageInstalls(o *packagedatamodel.PackageOptions) (*kappipkg.PackageInstallList, error) - ListPackageMetadata(o *packagedatamodel.PackageAvailableOptions) (*kapppkg.PackageMetadataList, error) - ListPackages(o *packagedatamodel.PackageAvailableOptions) (*kapppkg.PackageList, error) - ListRegistrySecrets(o *packagedatamodel.RegistrySecretOptions) (*corev1.SecretList, error) - ListSecretExports(o *packagedatamodel.RegistrySecretOptions) (*secretgen.SecretExportList, error) - ListRepositories(o *packagedatamodel.RepositoryOptions) (*kappipkg.PackageRepositoryList, error) - UninstallPackage(o *packagedatamodel.PackageOptions, packageProgress *packagedatamodel.PackageProgress) - UninstallPackageSync(o *packagedatamodel.PackageOptions) error - UpdateRegistrySecret(o *packagedatamodel.RegistrySecretOptions) error - UpdatePackage(o *packagedatamodel.PackageOptions, packageProgress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) - UpdatePackageSync(o *packagedatamodel.PackageOptions, operationType packagedatamodel.OperationType) error - UpdateRepository(o *packagedatamodel.RepositoryOptions, progress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) - UpdateRepositorySync(o *packagedatamodel.RepositoryOptions, operationType packagedatamodel.OperationType) error -} - -// CrtClient clientset interface -// -//counterfeiter:generate -o ../fakes/crtclient.go --fake-name CrtClient . CrtClient -type CrtClient interface { - crtclient.Client -} diff --git a/packageclients/pkg/packageclient/package_get.go b/packageclients/pkg/packageclient/package_get.go deleted file mode 100644 index fc3f6636cc..0000000000 --- a/packageclients/pkg/packageclient/package_get.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "fmt" - - "github.com/pkg/errors" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -// GetPackageInstall takes an installed package name and returns the corresponding installed package -func (p *pkgClient) GetPackageInstall(o *packagedatamodel.PackageOptions) (*kappipkg.PackageInstall, error) { - pkg, err := p.kappClient.GetPackageInstall(o.PackageName, o.Namespace) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("failed to find installed package '%s' in namespace '%s'", o.PackageName, o.Namespace)) - } - return pkg, nil -} - -// GetPackage takes a package name and package version and returns the corresponding PackageMetadata and Package. -// If the resolution is unsuccessful, an error is returned. -func (p *pkgClient) GetPackage(o *packagedatamodel.PackageOptions) (*kapppkg.PackageMetadata, *kapppkg.Package, error) { - var ( - resolvedPackage *kapppkg.PackageMetadata - err error - ) - - if resolvedPackage, err = p.kappClient.GetPackageMetadataByName(o.PackageName, o.Namespace); err != nil { - return nil, nil, errors.Wrapf(err, "failed to find a package with name '%s' in namespace '%s'", o.PackageName, o.Namespace) - } - - packageVersions, err := p.kappClient.ListPackages(o.PackageName, o.Namespace) - if err != nil { - return nil, nil, errors.Wrap(err, "failed to list package versions") - } - - for _, item := range packageVersions.Items { //nolint:gocritic - if item.Spec.Version == o.Version { - return resolvedPackage, &item, nil - } - } - - // If only one package version available and version is not provided, use that version - if len(packageVersions.Items) == 1 && o.Version == "" { - return resolvedPackage, &packageVersions.Items[0], nil - } - - return nil, nil, errors.Errorf(fmt.Sprintf("failed to resolve package '%s' with version '%s'", o.PackageName, o.Version)) -} diff --git a/packageclients/pkg/packageclient/package_get_test.go b/packageclients/pkg/packageclient/package_get_test.go deleted file mode 100644 index b305271634..0000000000 --- a/packageclients/pkg/packageclient/package_get_test.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var _ = Describe("Get Installed Package", func() { - var ( - ctl PackageClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.PackageOptions{ - PackageName: testPkgName, - Namespace: testNamespaceName, - } - options = opts - pkgInstall *kappipkg.PackageInstall - ) - - JustBeforeEach(func() { - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - - pkgInstall, err = ctl.GetPackageInstall(&options) - }) - - Context("failure in getting installed packages due to GetPackageInstall API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageInstallReturns(nil, errors.New("failure in GetPackageInstall")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in GetPackageInstall")) - Expect(pkgInstall).To(BeNil()) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in getting installed packages", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageInstallReturns(testPkgInstall, nil) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - Expect(pkgInstall).NotTo(BeNil()) - Expect(pkgInstall).To(Equal(testPkgInstall)) - }) - AfterEach(func() { options = opts }) - }) -}) diff --git a/packageclients/pkg/packageclient/package_install.go b/packageclients/pkg/packageclient/package_install.go deleted file mode 100644 index cf432b74c6..0000000000 --- a/packageclients/pkg/packageclient/package_install.go +++ /dev/null @@ -1,408 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "context" - "fmt" - "os" - "path/filepath" - "time" - - "github.com/aunum/log" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - k8serror "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - versions "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/versions/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -const ( - msgRunPackageInstalledUpdate = "\n\nPlease consider using 'tanzu package installed update' to update the installed package with correct settings\n" -) - -// InstallPackage installs the PackageInstall and its associated resources in the cluster -func (p *pkgClient) InstallPackage(o *packagedatamodel.PackageOptions, progress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) { - p.installPackage(o, progress, operationType) -} - -// InstallPackageSync installs the PackageInstall and its associated resources in the cluster and returns an error if any -func (p *pkgClient) InstallPackageSync(o *packagedatamodel.PackageOptions, operationType packagedatamodel.OperationType) error { - pp := newPackageProgress() - - go p.installPackage(o, pp, operationType) - - initialMsg := fmt.Sprintf("Installing package '%s'", o.PackageName) - if err := DisplayProgress(initialMsg, pp); err != nil { - if err.Error() == packagedatamodel.ErrPackageAlreadyExists { - log.Infof("Updated installed package '%s'", o.PkgInstallName) - return nil - } - return err - } - - log.Infof("\n %s", fmt.Sprintf("Added installed package '%s'", - o.PkgInstallName)) - return nil -} - -func (p *pkgClient) installPackage(o *packagedatamodel.PackageOptions, progress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) { - var ( - pkgInstall *kappipkg.PackageInstall - pkgPluginResourceCreationStatus *packagedatamodel.PkgPluginResourceCreationStatus - err error - ) - - defer func() { - if err != nil { - progress.Err <- err - } - if operationType == packagedatamodel.OperationTypeInstall { - close(progress.ProgressMsg) - close(progress.Done) - } - }() - - if pkgInstall, err = p.kappClient.GetPackageInstall(o.PkgInstallName, o.Namespace); err != nil { - if !k8serror.IsNotFound(err) { - return - } - err = nil - } - - if pkgInstall != nil { - progress.ProgressMsg <- fmt.Sprintf("Updating package '%s'", o.PkgInstallName) - p.UpdatePackage(o, progress, packagedatamodel.OperationTypeInstall) - err = &packagedatamodel.PackagePluginNonCriticalError{Reason: packagedatamodel.ErrPackageAlreadyExists} - return - } - - if err = p.validateValuesFile(o); err != nil { - return - } - - if o.CreateNamespace { - progress.ProgressMsg <- fmt.Sprintf("Creating namespace '%s'", o.Namespace) - if err = p.createNamespace(o.Namespace); err != nil { - return - } - } else if err = p.kappClient.GetClient().Get(context.Background(), crtclient.ObjectKey{Name: o.Namespace}, &corev1.Namespace{}); err != nil { - return - } - - progress.ProgressMsg <- fmt.Sprintf("Getting package metadata for '%s'", o.PackageName) - if _, _, err = p.GetPackage(o); err != nil { - return - } - - if pkgPluginResourceCreationStatus, err = p.createRelatedResources(o, progress.ProgressMsg); err != nil { - return - } - - progress.ProgressMsg <- "Creating package resource" - if err = p.createPackageInstall(o, pkgPluginResourceCreationStatus); err != nil { - return - } - - if o.Wait { - if err = p.waitForResourceInstallation(o.PkgInstallName, o.Namespace, o.PollInterval, o.PollTimeout, progress.ProgressMsg, packagedatamodel.ResourceTypePackageInstall); err != nil { - log.Warning(msgRunPackageInstalledUpdate) - return - } - } -} - -func (p *pkgClient) createRelatedResources(o *packagedatamodel.PackageOptions, progress chan string) (*packagedatamodel.PkgPluginResourceCreationStatus, error) { - var ( - pkgPluginResourceCreationStatus packagedatamodel.PkgPluginResourceCreationStatus - err error - ) - - if o.ServiceAccountName == "" { - o.ServiceAccountName = fmt.Sprintf(packagedatamodel.ServiceAccountName, o.PkgInstallName, o.Namespace) - progress <- fmt.Sprintf("Creating service account '%s'", o.ServiceAccountName) - if pkgPluginResourceCreationStatus.IsServiceAccountCreated, err = p.createOrUpdateServiceAccount(o); err != nil { - return &pkgPluginResourceCreationStatus, err - } - - o.ClusterRoleName = fmt.Sprintf(packagedatamodel.ClusterRoleName, o.PkgInstallName, o.Namespace) - progress <- fmt.Sprintf("Creating cluster admin role '%s'", o.ClusterRoleName) - if err := p.createOrUpdateClusterAdminRole(o); err != nil { - return &pkgPluginResourceCreationStatus, err - } - - o.ClusterRoleBindingName = fmt.Sprintf(packagedatamodel.ClusterRoleBindingName, o.PkgInstallName, o.Namespace) - progress <- fmt.Sprintf("Creating cluster role binding '%s'", o.ClusterRoleBindingName) - if err := p.createOrUpdateClusterRoleBinding(o); err != nil { - return &pkgPluginResourceCreationStatus, err - } - } else { - objKey := crtclient.ObjectKey{Name: o.ServiceAccountName, Namespace: o.Namespace} - svcAccount := &corev1.ServiceAccount{} - if err = p.kappClient.GetClient().Get(context.Background(), objKey, svcAccount); err != nil { - err = errors.Wrap(err, fmt.Sprintf("failed to find service account '%s' in namespace '%s'", o.ServiceAccountName, o.Namespace)) - return &pkgPluginResourceCreationStatus, err - } - if svcAccountAnnotation, ok := svcAccount.GetAnnotations()[packagedatamodel.TanzuPkgPluginAnnotation]; ok { - if svcAccountAnnotation != fmt.Sprintf(packagedatamodel.TanzuPkgPluginResource, o.PkgInstallName, o.Namespace) { - err = fmt.Errorf("provided service account '%s' is already used by another package in namespace '%s'", o.ServiceAccountName, o.Namespace) - return &pkgPluginResourceCreationStatus, err - } - } - } - - if o.ValuesFile != "" { - o.SecretName = fmt.Sprintf(packagedatamodel.SecretName, o.PkgInstallName, o.Namespace) - progress <- fmt.Sprintf("Creating secret '%s'", o.SecretName) - if pkgPluginResourceCreationStatus.IsSecretCreated, err = p.createOrUpdateDataValuesSecret(o); err != nil { - return &pkgPluginResourceCreationStatus, err - } - } - - return &pkgPluginResourceCreationStatus, nil -} - -// createOrUpdateClusterAdminRole creates or updates a ClusterRole resource -func (p *pkgClient) createOrUpdateClusterAdminRole(o *packagedatamodel.PackageOptions) error { - clusterRole := &rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{ - Name: o.ClusterRoleName, - Annotations: map[string]string{packagedatamodel.TanzuPkgPluginAnnotation: fmt.Sprintf(packagedatamodel.TanzuPkgPluginResource, o.PkgInstallName, o.Namespace)}, - }, - Rules: []rbacv1.PolicyRule{ - {APIGroups: []string{"*"}, Verbs: []string{"*"}, Resources: []string{"*"}}, - }, - } - - if err := p.kappClient.GetClient().Create(context.Background(), clusterRole); err != nil { - if k8serror.IsAlreadyExists(err) { - if err := p.kappClient.GetClient().Update(context.Background(), clusterRole); err != nil { - return err - } - } else { - return err - } - } - - return nil -} - -// createOrUpdateClusterRoleBinding creates or updates a ClusterRoleBinding resource -func (p *pkgClient) createOrUpdateClusterRoleBinding(o *packagedatamodel.PackageOptions) error { - clusterRoleBinding := &rbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{ - Name: o.ClusterRoleBindingName, - Annotations: map[string]string{packagedatamodel.TanzuPkgPluginAnnotation: fmt.Sprintf(packagedatamodel.TanzuPkgPluginResource, o.PkgInstallName, o.Namespace)}, - }, - Subjects: []rbacv1.Subject{{Kind: packagedatamodel.KindServiceAccount, Name: o.ServiceAccountName, Namespace: o.Namespace}}, - RoleRef: rbacv1.RoleRef{ - APIGroup: "rbac.authorization.k8s.io", - Kind: packagedatamodel.KindClusterRole, - Name: o.ClusterRoleName, - }, - } - - if err := p.kappClient.GetClient().Create(context.Background(), clusterRoleBinding); err != nil { - if k8serror.IsAlreadyExists(err) { - if err := p.kappClient.GetClient().Update(context.Background(), clusterRoleBinding); err != nil { - return err - } - } else { - return err - } - } - - return nil -} - -// createOrUpdateDataValuesSecret create or updates a secret object containing the user-provided configuration. -func (p *pkgClient) createOrUpdateDataValuesSecret(o *packagedatamodel.PackageOptions) (bool, error) { - var err error - - dataValues := make(map[string][]byte) - - if dataValues[filepath.Base(o.ValuesFile)], err = os.ReadFile(o.ValuesFile); err != nil { - return false, errors.Wrap(err, fmt.Sprintf("failed to read from data values file '%s'", o.ValuesFile)) - } - Secret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: o.SecretName, - Namespace: o.Namespace, - Annotations: map[string]string{packagedatamodel.TanzuPkgPluginAnnotation: fmt.Sprintf(packagedatamodel.TanzuPkgPluginResource, o.PkgInstallName, o.Namespace)}, - }, - Data: dataValues, - } - - if err := p.kappClient.GetClient().Create(context.Background(), Secret); err != nil { - if k8serror.IsAlreadyExists(err) { - if err := p.kappClient.GetClient().Update(context.Background(), Secret); err != nil { - return false, err - } - } else { - return false, err - } - } - - return true, nil -} - -// createNamespace creates a namespace resource if it doesn't already exist -func (p *pkgClient) createNamespace(namespace string) error { - err := p.kappClient.GetClient().Get( - context.Background(), - crtclient.ObjectKey{Name: namespace}, - &corev1.Namespace{}) - if err != nil { - if !k8serror.IsNotFound(err) { - return err - } - ns := &corev1.Namespace{ - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindNamespace}, - ObjectMeta: metav1.ObjectMeta{Name: namespace}, - } - if err := p.kappClient.GetClient().Create(context.Background(), ns); err != nil { - return errors.Wrap(err, "failed to create namespace") - } - } - - return nil -} - -// createPackageInstall creates the PackageInstall CR -func (p *pkgClient) createPackageInstall(o *packagedatamodel.PackageOptions, pkgPluginResourceCreationStatus *packagedatamodel.PkgPluginResourceCreationStatus) error { - // construct the PackageInstall CR - packageInstall := &kappipkg.PackageInstall{ - ObjectMeta: metav1.ObjectMeta{Name: o.PkgInstallName, - Namespace: o.Namespace, - Labels: o.Labels, - }, - Spec: kappipkg.PackageInstallSpec{ - ServiceAccountName: o.ServiceAccountName, - PackageRef: &kappipkg.PackageRef{ - RefName: o.PackageName, - VersionSelection: &versions.VersionSelectionSemver{ - Constraints: o.Version, - Prereleases: &versions.VersionSelectionSemverPrereleases{}, - }, - }, - }, - } - - // if configuration data file was provided, reference the secret name in the PackageInstall - if pkgPluginResourceCreationStatus.IsSecretCreated { - packageInstall.Spec.Values = []kappipkg.PackageInstallValues{ - { - SecretRef: &kappipkg.PackageInstallValuesSecretRef{ - Name: fmt.Sprintf(packagedatamodel.SecretName, o.PkgInstallName, o.Namespace), - }, - }, - } - } - - if err := p.kappClient.CreatePackageInstall(packageInstall, pkgPluginResourceCreationStatus); err != nil { - return errors.Wrap(err, "failed to create PackageInstall resource") - } - - return nil -} - -// createOrUpdateServiceAccount creates or updates a ServiceAccount resource -func (p *pkgClient) createOrUpdateServiceAccount(o *packagedatamodel.PackageOptions) (bool, error) { - serviceAccount := &corev1.ServiceAccount{ - ObjectMeta: metav1.ObjectMeta{ - Name: o.ServiceAccountName, - Namespace: o.Namespace, - Annotations: map[string]string{packagedatamodel.TanzuPkgPluginAnnotation: fmt.Sprintf(packagedatamodel.TanzuPkgPluginResource, o.PkgInstallName, o.Namespace)}}, - } - - if err := p.kappClient.GetClient().Create(context.Background(), serviceAccount); err != nil { - if k8serror.IsAlreadyExists(err) { - if err := p.kappClient.GetClient().Update(context.Background(), serviceAccount); err != nil { - return false, err - } - } else { - return false, err - } - } - - return true, nil -} - -func (p *pkgClient) validateValuesFile(o *packagedatamodel.PackageOptions) error { - if o.ValuesFile == "" { - return nil - } - - if _, err := os.ReadFile(o.ValuesFile); err != nil { - err = errors.Wrap(err, fmt.Sprintf("failed to read from data values file '%s'", o.ValuesFile)) - return err - } - - return nil -} - -// waitForResourceInstallation waits until the package get installed successfully or a failure happen -func (p *pkgClient) waitForResourceInstallation(name, namespace string, pollInterval, pollTimeout time.Duration, progress chan string, rscType packagedatamodel.ResourceType) error { //nolint:gocyclo - var ( - status kappctrl.GenericStatus - reconcileSucceeded bool - ) - progress <- fmt.Sprintf("Waiting for '%s' reconciliation for '%s'", rscType.String(), name) - if err := wait.Poll(pollInterval, pollTimeout, func() (done bool, err error) { - switch rscType { - case packagedatamodel.ResourceTypePackageRepository: - resource, err := p.kappClient.GetPackageRepository(name, namespace) - if err != nil { - return false, err - } - if resource.Generation != resource.Status.ObservedGeneration { - // Should wait for generation to be observed before checking the reconciliation status so that we know we are checking the new spec - return false, nil - } - status = resource.Status.GenericStatus - case packagedatamodel.ResourceTypePackageInstall: - resource, err := p.kappClient.GetPackageInstall(name, namespace) - if err != nil { - return false, err - } - if resource.Generation != resource.Status.ObservedGeneration { - // Should wait for generation to be observed before checking the reconciliation status so that we know we are checking the new spec - return false, nil - } - status = resource.Status.GenericStatus - } - - for _, cond := range status.Conditions { - if progress != nil { - progress <- fmt.Sprintf("'%s' resource install status: %s", rscType.String(), cond.Type) - } - switch { - case cond.Type == kappctrl.ReconcileSucceeded && cond.Status == corev1.ConditionTrue: - if progress != nil { - progress <- fmt.Sprintf("'%s' resource successfully reconciled", rscType.String()) - } - reconcileSucceeded = true - return true, nil - case cond.Type == kappctrl.ReconcileFailed && cond.Status == corev1.ConditionTrue: - return false, fmt.Errorf("resource reconciliation failed: %s. %s", status.UsefulErrorMessage, status.FriendlyDescription) - } - } - return false, nil - }); err != nil { - return err - } - - if !reconcileSucceeded { - return fmt.Errorf("'%s' resource reconciliation timeout", rscType.String()) - } - - return nil -} diff --git a/packageclients/pkg/packageclient/package_install_test.go b/packageclients/pkg/packageclient/package_install_test.go deleted file mode 100644 index 0ceb7a7955..0000000000 --- a/packageclients/pkg/packageclient/package_install_test.go +++ /dev/null @@ -1,649 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - "fmt" - "os" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - versions "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/versions/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -const ( - testClusterRoleName = "test-pkg-test-ns-cluster-role" - testClusterRoleBindingName = "test-pkg-test-ns-cluster-rolebinding" - testSecretValuesName = "test-pkg-test-ns-values" //nolint:gosec - testServiceAccountName = "test-pkg-test-ns-sa" - testNamespaceName = "test-ns" - testPkgInstallName = "test-pkg" - testPkgName = "test-pkg.com" - testPkgVersion = "1.0.0" - testPollInterval = 100 * time.Millisecond - testPollTimeout = 1 * time.Minute - testFailureMsg = "should return an error" - testSuccessMsg = "should not return an error" - testUsefulErrMsg = "some failure happened" - testValuesFile = "value-file" -) - -var ( - testPkgInstall = &kappipkg.PackageInstall{ - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindPackageInstall}, - ObjectMeta: metav1.ObjectMeta{Name: testPkgInstallName, Namespace: testNamespaceName, Generation: 1}, - Spec: kappipkg.PackageInstallSpec{ - ServiceAccountName: testServiceAccountName, - PackageRef: &kappipkg.PackageRef{ - RefName: testPkgName, - VersionSelection: testVersionSelection, - }, - }, - Status: kappipkg.PackageInstallStatus{ - GenericStatus: kappctrl.GenericStatus{ - Conditions: []kappctrl.AppCondition{{Type: kappctrl.Reconciling, Status: corev1.ConditionTrue}, {Type: kappctrl.ReconcileSucceeded, Status: corev1.ConditionTrue}}, - UsefulErrorMessage: "", - ObservedGeneration: 1, - }, - }, - } - - testPkgVersionList = &kapppkg.PackageList{ - TypeMeta: metav1.TypeMeta{Kind: "PackageVersionList"}, - Items: []kapppkg.Package{ - {TypeMeta: metav1.TypeMeta{ - Kind: "PackageVersion"}, - ObjectMeta: metav1.ObjectMeta{Name: testPkgInstallName, Namespace: testNamespaceName}, - Spec: kapppkg.PackageSpec{RefName: testPkgInstallName, Version: testPkgVersion}, - }, - }, - } - - testVersionSelection = &versions.VersionSelectionSemver{Constraints: "1.0.0"} -) - -var _ = Describe("Install Package", func() { - var ( - ctl PackageClient - crtCtl *fakes.CrtClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.PackageOptions{ - PkgInstallName: testPkgInstallName, - Namespace: testNamespaceName, - PackageName: testPkgName, - Version: testPkgVersion, - PollInterval: testPollInterval, - PollTimeout: testPollTimeout, - CreateNamespace: true, - } - options = opts - progress *packagedatamodel.PackageProgress - ) - - JustBeforeEach(func() { - progress = &packagedatamodel.PackageProgress{ - ProgressMsg: make(chan string, 10), - Err: make(chan error), - Done: make(chan struct{}), - } - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - go ctl.InstallPackage(&options, progress, packagedatamodel.OperationTypeInstall) - err = testReceive(progress) - }) - - Context("failure in getting installed package due to GetPackageInstall API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - kappCtl.GetPackageInstallReturnsOnCall(0, nil, errors.New("failure in GetPackageInstall")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in GetPackageInstall")) - }) - AfterEach(func() { options = opts }) - }) - - Context("falling back to update when trying to install an existing package install (with reconciliation failure)", func() { - BeforeEach(func() { - options.Wait = true - options.ValuesFile = testValuesFile - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - kappCtl.GetPackageInstallReturns(testPkgInstall, nil) - err = os.WriteFile(testValuesFile, []byte("test"), 0644) - Expect(err).ToNot(HaveOccurred()) - Expect(testPkgInstall.Status.ObservedGeneration).To(Equal(testPkgInstall.Generation)) - Expect(len(testPkgInstall.Status.Conditions)).To(BeNumerically("==", 2)) - testPkgInstall.Status.Conditions[1] = kappctrl.AppCondition{Type: kappctrl.ReconcileFailed, Status: corev1.ConditionTrue} - testPkgInstall.Status.UsefulErrorMessage = testUsefulErrMsg - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(testUsefulErrMsg)) - }) - AfterEach(func() { - options = opts - testPkgInstall.Status.Conditions[1].Type = kappctrl.ReconcileSucceeded - err = os.Remove(testValuesFile) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("falling back to update when trying to install an existing package install (throwing non-critical error)", func() { - BeforeEach(func() { - options.Wait = true - options.PackageName = testPkgName - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - Expect(options.PackageName).To(Equal(testPkgInstall.Spec.PackageRef.RefName)) - kappCtl.GetPackageInstallReturns(testPkgInstall, nil) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(packagedatamodel.ErrPackageAlreadyExists)) - }) - AfterEach(func() { - options = opts - }) - }) - - Context("failure in listing package versions due to ListPackages API error (in GetPackage())", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(nil, errors.New("failure in ListPackages")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in ListPackages")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in finding the provided package version", func() { - BeforeEach(func() { - options.Version = "2.0.0" - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to resolve package 'test-pkg.com' with version '2.0.0'")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in finding the provided package name", func() { - BeforeEach(func() { - options.PackageName = "test-pkg.org" - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - kappCtl.GetPackageMetadataByNameReturns(nil, apierrors.NewNotFound(schema.GroupResource{Resource: "PackageMetadata"}, "test-pkg.org")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("PackageMetadata \"test-pkg.org\" not found")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in namespace creation due to namespace Get API error", func() { - BeforeEach(func() { - options.CreateNamespace = true - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - crtCtl.GetReturns(errors.New("failure in Get namespace")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Get namespace")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in namespace creation due to namespace Create API error", func() { - BeforeEach(func() { - options.CreateNamespace = true - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - crtCtl.GetReturns(apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindNamespace}, testNamespaceName)) - crtCtl.CreateReturns(errors.New("failure in Create namespace")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Create namespace")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in getting an existing namespace (namespace NotFound error)", func() { - BeforeEach(func() { - options.CreateNamespace = false - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - crtCtl.GetReturns(apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindNamespace}, testNamespaceName)) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("Namespace \"%s\" not found", testNamespaceName))) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in creating service account", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - crtCtl.CreateReturnsOnCall(0, errors.New("failure in Create ServiceAccount")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Create ServiceAccount")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating service account", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - crtCtl.CreateReturnsOnCall(0, apierrors.NewAlreadyExists(schema.GroupResource{Resource: packagedatamodel.KindServiceAccount}, testServiceAccountName)) - crtCtl.UpdateReturnsOnCall(0, errors.New("failure in Update ServiceAccount")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Update ServiceAccount")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in creating cluster admin role", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - crtCtl.CreateReturnsOnCall(0, nil) - crtCtl.CreateReturnsOnCall(1, errors.New("failure in Create ClusterRole")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Create ClusterRole")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating cluster admin role", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - crtCtl.CreateReturnsOnCall(0, apierrors.NewAlreadyExists(schema.GroupResource{Resource: packagedatamodel.KindServiceAccount}, testServiceAccountName)) - crtCtl.UpdateReturnsOnCall(0, nil) - crtCtl.CreateReturnsOnCall(1, apierrors.NewAlreadyExists(schema.GroupResource{Resource: packagedatamodel.KindClusterRole}, testClusterRoleName)) - crtCtl.UpdateReturnsOnCall(1, errors.New("failure in Update ClusterRole")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Update ClusterRole")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in creating cluster role binding", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - crtCtl.CreateReturnsOnCall(0, nil) - crtCtl.CreateReturnsOnCall(1, nil) - crtCtl.CreateReturnsOnCall(2, errors.New("failure in Create ClusterRoleBinding")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Create ClusterRoleBinding")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating cluster role binding", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - crtCtl.CreateReturnsOnCall(0, apierrors.NewAlreadyExists(schema.GroupResource{Resource: packagedatamodel.KindServiceAccount}, testServiceAccountName)) - crtCtl.UpdateReturnsOnCall(0, nil) - crtCtl.CreateReturnsOnCall(1, apierrors.NewAlreadyExists(schema.GroupResource{Resource: packagedatamodel.KindClusterRole}, testClusterRoleName)) - crtCtl.UpdateReturnsOnCall(1, nil) - crtCtl.CreateReturnsOnCall(2, apierrors.NewAlreadyExists(schema.GroupResource{Resource: packagedatamodel.KindClusterRoleBinding}, testClusterRoleBindingName)) - crtCtl.UpdateReturnsOnCall(2, errors.New("failure in Update ClusterRoleBinding")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Update ClusterRoleBinding")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in finding the provided service account", func() { - BeforeEach(func() { - options.ServiceAccountName = testServiceAccountName - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - crtCtl.GetReturns(apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindServiceAccount}, testServiceAccountName)) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("ServiceAccount \"test-pkg-test-ns-sa\" not found")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in finding the provided secret value file", func() { - BeforeEach(func() { - options.ValuesFile = testValuesFile - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("open value-file: no such file or directory")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in creating secret", func() { - BeforeEach(func() { - options.ValuesFile = testValuesFile - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - err = os.WriteFile(testValuesFile, []byte("test"), 0644) - Expect(err).ToNot(HaveOccurred()) - crtCtl.CreateReturnsOnCall(0, nil) - crtCtl.CreateReturnsOnCall(1, nil) - crtCtl.CreateReturnsOnCall(2, nil) - crtCtl.CreateReturnsOnCall(3, errors.New("failure in Create Secret")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Create Secret")) - }) - AfterEach(func() { - options = opts - err = os.Remove(testValuesFile) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("failure in updating secret", func() { - BeforeEach(func() { - options.ValuesFile = testValuesFile - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - err = os.WriteFile(testValuesFile, []byte("test"), 0644) - Expect(err).ToNot(HaveOccurred()) - crtCtl.CreateReturnsOnCall(0, apierrors.NewAlreadyExists(schema.GroupResource{Resource: packagedatamodel.KindServiceAccount}, testServiceAccountName)) - crtCtl.UpdateReturnsOnCall(0, nil) - crtCtl.CreateReturnsOnCall(1, apierrors.NewAlreadyExists(schema.GroupResource{Resource: packagedatamodel.KindClusterRole}, testClusterRoleName)) - crtCtl.UpdateReturnsOnCall(1, nil) - crtCtl.CreateReturnsOnCall(2, apierrors.NewAlreadyExists(schema.GroupResource{Resource: packagedatamodel.KindClusterRoleBinding}, testClusterRoleBindingName)) - crtCtl.UpdateReturnsOnCall(2, nil) - crtCtl.CreateReturnsOnCall(3, apierrors.NewAlreadyExists(schema.GroupResource{Resource: packagedatamodel.KindSecret}, testSecretName)) - crtCtl.UpdateReturnsOnCall(3, errors.New("failure in Update Secret")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Update Secret")) - }) - AfterEach(func() { - options = opts - err = os.Remove(testValuesFile) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("failure in creating package install due to CreatePackageInstall API error", func() { - BeforeEach(func() { - options.ValuesFile = testValuesFile - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - err = os.WriteFile(testValuesFile, []byte("test"), 0644) - Expect(err).ToNot(HaveOccurred()) - crtCtl.CreateReturnsOnCall(0, nil) - crtCtl.CreateReturnsOnCall(1, nil) - crtCtl.CreateReturnsOnCall(2, nil) - crtCtl.CreateReturnsOnCall(3, nil) - kappCtl.CreatePackageInstallReturns(errors.New("failure in CreatePackageInstall")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in CreatePackageInstall")) - }) - AfterEach(func() { - options = opts - err = os.Remove(testValuesFile) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("failure when trying to install a package install (with reconciliation failure)", func() { - BeforeEach(func() { - options.Wait = true - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - kappCtl.GetPackageInstallReturnsOnCall(0, nil, apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindPackageInstall}, testPkgInstallName)) - kappCtl.GetPackageInstallReturnsOnCall(1, testPkgInstall, nil) - Expect(testPkgInstall.Status.ObservedGeneration).To(Equal(testPkgInstall.Generation)) - Expect(len(testPkgInstall.Status.Conditions)).To(BeNumerically("==", 2)) - testPkgInstall.Status.Conditions[1] = kappctrl.AppCondition{Type: kappctrl.ReconcileFailed, Status: corev1.ConditionTrue} - testPkgInstall.Status.UsefulErrorMessage = testUsefulErrMsg - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(testUsefulErrMsg)) - }) - AfterEach(func() { - options = opts - testPkgInstall.Status.Conditions[1].Type = kappctrl.ReconcileSucceeded - }) - }) - - Context("success in installing the package in not previously existing 'test-ns' namespace", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - crtCtl.GetReturns(apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindNamespace}, testNamespaceName)) - }) - It(testSuccessMsg, func() { - Expect(err).ToNot(HaveOccurred()) - expectedCreatedResourceNames := []string{testServiceAccountName, testClusterRoleName, testClusterRoleBindingName, testNamespaceName} - testPackageInstallPostValidation(crtCtl, kappCtl, expectedCreatedResourceNames) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in installing the package in the already existing 'test-ns' namespace", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - }) - It(testSuccessMsg, func() { - Expect(err).ToNot(HaveOccurred()) - expectedCreatedResourceNames := []string{testServiceAccountName, testClusterRoleName, testClusterRoleBindingName} - testPackageInstallPostValidation(crtCtl, kappCtl, expectedCreatedResourceNames) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in installing the package due to GetPackageInstall API error in waitForResourceInstallation", func() { - BeforeEach(func() { - options.Wait = true - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - kappCtl.GetPackageInstallReturnsOnCall(0, nil, nil) - kappCtl.GetPackageInstallReturnsOnCall(1, nil, errors.New("failure in GetPackageInstall")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in GetPackageInstall")) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in installing the package with a successful reconciliation (Wait flag being set)", func() { - BeforeEach(func() { - options.Wait = true - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - kappCtl.GetPackageInstallReturnsOnCall(0, nil, apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindPackageInstall}, testPkgInstallName)) - kappCtl.GetPackageInstallReturnsOnCall(1, testPkgInstall, nil) - Expect(testPkgInstall.Status.ObservedGeneration).To(Equal(testPkgInstall.Generation)) - }) - It(testSuccessMsg, func() { - Expect(err).ToNot(HaveOccurred()) - expectedCreatedResourceNames := []string{testServiceAccountName, testClusterRoleName, testClusterRoleBindingName} - testPackageInstallPostValidation(crtCtl, kappCtl, expectedCreatedResourceNames) - }) - AfterEach(func() { - options = opts - }) - }) - - Context("success in installing the package with secret value file specified", func() { - BeforeEach(func() { - options.ValuesFile = testValuesFile - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - err = os.WriteFile(testValuesFile, []byte("test"), 0644) - Expect(err).ToNot(HaveOccurred()) - }) - It(testSuccessMsg, func() { - Expect(err).ToNot(HaveOccurred()) - expectedCreatedResourceNames := []string{testServiceAccountName, testClusterRoleName, testClusterRoleBindingName, testSecretValuesName} - testPackageInstallPostValidation(crtCtl, kappCtl, expectedCreatedResourceNames) - }) - AfterEach(func() { - options = opts - err = os.Remove(testValuesFile) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("failure when trying to update an existing package install, but providing a different o.PackageName than Spec.PackageRef.RefName", func() { - BeforeEach(func() { - options.Wait = true - options.PackageName = "some-other-package" - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - Expect(options.PackageName).NotTo(Equal(testPkgInstall.Spec.PackageRef.RefName)) - kappCtl.GetPackageInstallReturns(testPkgInstall, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("installed package '%s' is already associated with package '%s'", options.PkgInstallName, testPkgInstall.Spec.PackageRef.RefName))) - }) - AfterEach(func() { - options = opts - options.PackageName = testPkgName - }) - }) -}) - -func testPackageInstallPostValidation(crtCtl *fakes.CrtClient, kappCtl *fakes.KappClient, expCreatedResourceNames []string) { - createCallCnt := crtCtl.CreateCallCount() - Expect(createCallCnt).To(BeNumerically("==", len(expCreatedResourceNames))) - createdResourceNames := make([]string, createCallCnt) - for i := 0; i < createCallCnt; i++ { - _, obj, _ := crtCtl.CreateArgsForCall(i) - createdResourceNames[i] = testGetObjectName(obj) - } - Expect(createdResourceNames).Should(ConsistOf(expCreatedResourceNames)) - - kappCreateCallCnt := kappCtl.CreatePackageInstallCallCount() - Expect(kappCreateCallCnt).To(BeNumerically("==", 1)) - installed, _ := kappCtl.CreatePackageInstallArgsForCall(0) - Expect(installed.Name).Should(Equal(testPkgInstallName)) -} - -func testGetObjectName(o interface{}) string { - accessor, err := meta.Accessor(o) - Expect(err).ToNot(HaveOccurred()) - return accessor.GetName() -} - -func testReceive(progress *packagedatamodel.PackageProgress) error { - for { - select { - case err := <-progress.Err: - return err - case <-progress.ProgressMsg: - continue - case <-progress.Done: - return nil - } - } -} diff --git a/packageclients/pkg/packageclient/package_list.go b/packageclients/pkg/packageclient/package_list.go deleted file mode 100644 index 43168e9637..0000000000 --- a/packageclients/pkg/packageclient/package_list.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "github.com/pkg/errors" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -func (p *pkgClient) ListPackageInstalls(o *packagedatamodel.PackageOptions) (*kappipkg.PackageInstallList, error) { - packageInstallList, err := p.kappClient.ListPackageInstalls(o.Namespace) - if err != nil { - return nil, errors.Wrap(err, "failed to list installed packages") - } - return packageInstallList, nil -} - -func (p *pkgClient) ListPackageMetadata(o *packagedatamodel.PackageAvailableOptions) (*kapppkg.PackageMetadataList, error) { - packageList, err := p.kappClient.ListPackageMetadata(o.Namespace) - if err != nil { - return nil, errors.Wrap(err, "failed to list packages") - } - return packageList, nil -} - -func (p *pkgClient) ListPackages(o *packagedatamodel.PackageAvailableOptions) (*kapppkg.PackageList, error) { - packageVersionList, err := p.kappClient.ListPackages(o.PackageName, o.Namespace) - if err != nil { - return nil, errors.Wrap(err, "failed to list package versions") - } - return packageVersionList, nil -} diff --git a/packageclients/pkg/packageclient/package_list_test.go b/packageclients/pkg/packageclient/package_list_test.go deleted file mode 100644 index d23c698083..0000000000 --- a/packageclients/pkg/packageclient/package_list_test.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var _ = Describe("List Packages", func() { - var ( - ctl PackageClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.PackageOptions{ - AllNamespaces: false, - Namespace: testNamespaceName, - } - options = opts - optsAvailable = packagedatamodel.PackageAvailableOptions{ - Namespace: testNamespaceName, - AllNamespaces: false, - ValuesSchema: false, - } - optionsAvailable = optsAvailable - pkgMetadataList *kapppkg.PackageMetadataList - packageInstalls *kappipkg.PackageInstallList - packageVersions *kapppkg.PackageList - pkgInstallList = &kappipkg.PackageInstallList{ - TypeMeta: metav1.TypeMeta{Kind: "PackageInstallList"}, - Items: []kappipkg.PackageInstall{*testPkgInstall}, - } - packageMetadataList = &kapppkg.PackageMetadataList{ - TypeMeta: metav1.TypeMeta{Kind: "PackageList"}, - Items: []kapppkg.PackageMetadata{{ - TypeMeta: metav1.TypeMeta{Kind: "PackageMetadata"}, - ObjectMeta: metav1.ObjectMeta{Name: testPkgInstallName, Namespace: testNamespaceName}}, - }, - } - ) - - Context("failure in listing available packages due to ListPackageMetadata API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListPackageMetadataReturns(nil, errors.New("failure in ListPackageMetadata")) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - pkgMetadataList, err = ctl.ListPackageMetadata(&optionsAvailable) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in ListPackageMetadata")) - Expect(pkgMetadataList).To(BeNil()) - }) - AfterEach(func() { optionsAvailable = optsAvailable }) - }) - - Context("success in listing available packages", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListPackageMetadataReturns(packageMetadataList, nil) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - pkgMetadataList, err = ctl.ListPackageMetadata(&optionsAvailable) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - Expect(pkgMetadataList).NotTo(BeNil()) - Expect(pkgMetadataList).To(Equal(packageMetadataList)) - }) - AfterEach(func() { optionsAvailable = optsAvailable }) - }) - - Context("failure in listing installed packages due to ListPackageInstalls API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListPackageInstallsReturns(nil, errors.New("failure in ListPackageInstalls")) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - packageInstalls, err = ctl.ListPackageInstalls(&options) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in ListPackageInstalls")) - Expect(packageInstalls).To(BeNil()) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in listing installed packages", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListPackageInstallsReturns(pkgInstallList, nil) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - packageInstalls, err = ctl.ListPackageInstalls(&options) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - Expect(packageInstalls).NotTo(BeNil()) - Expect(packageInstalls).To(Equal(pkgInstallList)) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in listing package versions due to ListPackages API error", func() { - BeforeEach(func() { - optionsAvailable.PackageName = testPkgInstallName - kappCtl = &fakes.KappClient{} - kappCtl.ListPackagesReturns(nil, errors.New("failure in ListPackages")) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - packageVersions, err = ctl.ListPackages(&optionsAvailable) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in ListPackages")) - Expect(packageVersions).To(BeNil()) - }) - AfterEach(func() { optionsAvailable = optsAvailable }) - }) - - Context("success in listing package versions", func() { - BeforeEach(func() { - optionsAvailable.PackageName = testPkgInstallName - kappCtl = &fakes.KappClient{} - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - packageVersions, err = ctl.ListPackages(&optionsAvailable) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - Expect(packageVersions).NotTo(BeNil()) - Expect(packageVersions).To(Equal(testPkgVersionList)) - }) - AfterEach(func() { optionsAvailable = optsAvailable }) - }) -}) diff --git a/packageclients/pkg/packageclient/package_uninstall.go b/packageclients/pkg/packageclient/package_uninstall.go deleted file mode 100644 index f15854af0e..0000000000 --- a/packageclients/pkg/packageclient/package_uninstall.go +++ /dev/null @@ -1,281 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "context" - "fmt" - "strings" - "time" - - "github.com/aunum/log" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -// UninstallPackage uninstalls the PackageInstall and its associated resources from the cluster -func (p *pkgClient) UninstallPackage(o *packagedatamodel.PackageOptions, progress *packagedatamodel.PackageProgress) { - p.uninstallPackage(o, progress) -} - -// UninstallPackage uninstalls the PackageInstall and its associated resources from the cluster and returns error if any -func (p *pkgClient) UninstallPackageSync(o *packagedatamodel.PackageOptions) error { - pp := newPackageProgress() - - go p.UninstallPackage(o, pp) - - initialMsg := fmt.Sprintf("Uninstalling package '%s' from namespace '%s'", o.PkgInstallName, o.Namespace) - if err := DisplayProgress(initialMsg, pp); err != nil { - if err.Error() == packagedatamodel.ErrPackageNotInstalled { - log.Warningf("package '%s' is not installed in namespace '%s'.", o.PkgInstallName, o.Namespace) - return nil - } - return err - } - log.Infof("%s", fmt.Sprintf("Uninstalled package '%s' from namespace '%s'", o.PkgInstallName, o.Namespace)) - return nil -} - -func (p *pkgClient) uninstallPackage(o *packagedatamodel.PackageOptions, progress *packagedatamodel.PackageProgress) { - var ( - pkgInstall *kappipkg.PackageInstall - err error - ) - - defer func() { - progressCleanup(err, progress) - }() - - progress.ProgressMsg <- fmt.Sprintf("Getting package install for '%s'", o.PkgInstallName) - pkgInstall, err = p.kappClient.GetPackageInstall(o.PkgInstallName, o.Namespace) - if err != nil { - if apierrors.IsNotFound(err) { - if err := p.deletePreviouslyInstalledResources(o, progress.ProgressMsg); err != nil { - return - } - err = &packagedatamodel.PackagePluginNonCriticalError{Reason: packagedatamodel.ErrPackageNotInstalled} - } else { - err = errors.Wrap(err, fmt.Sprintf("\nfailed to find installed package '%s' in namespace '%s'", o.PkgInstallName, o.Namespace)) - } - return - } - - progress.ProgressMsg <- fmt.Sprintf("Deleting package install '%s' from namespace '%s'", o.PkgInstallName, o.Namespace) - - if err = p.deletePackageInstall(o); err != nil { - return - } - - if err = p.waitForResourceDeletion(o.PkgInstallName, o.Namespace, o.PollInterval, o.PollTimeout, progress.ProgressMsg, packagedatamodel.ResourceTypePackageInstall); err != nil { - return - } - - if err = p.deletePkgPluginCreatedResources(pkgInstall, progress.ProgressMsg); err != nil { - return - } -} - -// deletePkgPluginCreatedResources deletes the associated resources which were installed upon installation of the PackageInstall CR -func (p *pkgClient) deletePkgPluginCreatedResources(pkgInstall *kappipkg.PackageInstall, progress chan string) error { //nolint:gocyclo - for k, v := range pkgInstall.GetAnnotations() { - split := strings.Split(k, "/") - if len(split) <= 1 { - continue - } - resourceKind := strings.Split(split[1], packagedatamodel.TanzuPkgPluginPrefix+"-") - if len(resourceKind) <= 1 { - continue - } - - var obj crtclient.Object - objMeta := metav1.ObjectMeta{Name: v, Namespace: pkgInstall.Namespace} - - switch resourceKind[1] { - case packagedatamodel.KindSecret: - if progress != nil { - progress <- fmt.Sprintf("Deleting secret '%s'", objMeta.Name) - } - obj = &corev1.Secret{ObjectMeta: objMeta, TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindSecret}} - if err := p.kappClient.GetClient().Delete(context.Background(), obj); err != nil { - return errors.Wrap(err, "failed to delete Secret resource") - } - case packagedatamodel.KindServiceAccount: - if progress != nil { - progress <- fmt.Sprintf("Deleting service account '%s'", objMeta.Name) - } - obj = &corev1.ServiceAccount{ObjectMeta: objMeta, TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindServiceAccount}} - if err := p.kappClient.GetClient().Delete(context.Background(), obj); err != nil { - return errors.Wrap(err, "failed to delete ServiceAccount resource") - } - case packagedatamodel.KindClusterRole: - if progress != nil { - progress <- fmt.Sprintf("Deleting admin role '%s'", objMeta.Name) - } - obj = &rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{Name: v}, - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindClusterRole}, - } - if err := p.kappClient.GetClient().Delete(context.Background(), obj); err != nil { - return errors.Wrap(err, "failed to delete ClusterRole resource") - } - case packagedatamodel.KindClusterRoleBinding: - if progress != nil { - progress <- fmt.Sprintf("Deleting role binding '%s'", objMeta.Name) - } - obj = &rbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{Name: v}, - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindClusterRoleBinding}, - } - if err := p.kappClient.GetClient().Delete(context.Background(), obj); err != nil { - return errors.Wrap(err, "failed to delete ClusterRoleBinding resource") - } - } - } - - return nil -} - -// deletePackageInstall deletes the PackageInstall CR -func (p *pkgClient) deletePackageInstall(o *packagedatamodel.PackageOptions) error { - obj := &kappipkg.PackageInstall{ - ObjectMeta: metav1.ObjectMeta{ - Name: o.PkgInstallName, - Namespace: o.Namespace, - }, - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindPackageInstall}, - } - - if err := p.kappClient.GetClient().Delete(context.Background(), obj); err != nil { - if !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete PackageInstall resource") - } - } - - return nil -} - -// deletePreviouslyInstalledResources deletes the related resources if previously installed through the package plugin -func (p *pkgClient) deletePreviouslyInstalledResources(o *packagedatamodel.PackageOptions, progress chan string) error { - var name string - resourceAnnotation := fmt.Sprintf(packagedatamodel.TanzuPkgPluginResource, o.PkgInstallName, o.Namespace) - - name = fmt.Sprintf(packagedatamodel.ClusterRoleBindingName, o.PkgInstallName, o.Namespace) - if err := p.deleteAnnotatedResource("role binding", &rbacv1.ClusterRoleBinding{}, crtclient.ObjectKey{Name: name}, resourceAnnotation, progress); err != nil { - return err - } - - name = fmt.Sprintf(packagedatamodel.ClusterRoleName, o.PkgInstallName, o.Namespace) - if err := p.deleteAnnotatedResource("admin role", &rbacv1.ClusterRole{}, crtclient.ObjectKey{Name: name}, resourceAnnotation, progress); err != nil { - return err - } - - name = fmt.Sprintf(packagedatamodel.ServiceAccountName, o.PkgInstallName, o.Namespace) - if err := p.deleteAnnotatedResource("service account", &corev1.ServiceAccount{}, crtclient.ObjectKey{Name: name, Namespace: o.Namespace}, resourceAnnotation, progress); err != nil { - return err - } - - name = fmt.Sprintf(packagedatamodel.SecretName, o.PkgInstallName, o.Namespace) - if err := p.deleteAnnotatedResource("secret", &corev1.Secret{}, crtclient.ObjectKey{Name: name, Namespace: o.Namespace}, resourceAnnotation, progress); err != nil { - return err - } - - return nil -} - -// deleteAnnotatedResource deletes the corresponding resource to the installed package name & namespace in case it has the package plugin annotation -func (p *pkgClient) deleteAnnotatedResource(resourceType string, obj crtclient.Object, objKey crtclient.ObjectKey, resourceAnnotation string, progress chan string) error { - if err := p.kappClient.GetClient().Get(context.Background(), objKey, obj); err != nil { - if !apierrors.IsNotFound(err) { - return err - } - } else { - progress <- fmt.Sprintf("Deleting %s '%s'", resourceType, objKey.Name) - o, err := meta.Accessor(obj) - if err != nil { - return err - } - for k, v := range o.GetAnnotations() { - split := strings.Split(k, "/") - if len(split) <= 1 || split[1] != packagedatamodel.TanzuPkgPluginPrefix { - continue - } - if v != resourceAnnotation { - continue - } - if err := p.kappClient.GetClient().Delete(context.Background(), obj); err != nil { - return err - } - break - } - } - - return nil -} - -func progressCleanup(err error, progress *packagedatamodel.PackageProgress) { - if err != nil { - progress.Err <- err - } - close(progress.ProgressMsg) - close(progress.Done) -} - -// waitForResourceDeletion waits until the CR gets deleted successfully or a failure happens -func (p *pkgClient) waitForResourceDeletion(name, namespace string, pollInterval, pollTimeout time.Duration, progress chan string, rscType packagedatamodel.ResourceType) error { - var status kappctrl.GenericStatus - if err := wait.Poll(pollInterval, pollTimeout, func() (done bool, err error) { - switch rscType { - case packagedatamodel.ResourceTypePackageRepository: - resource, err := p.kappClient.GetPackageRepository(name, namespace) - if err != nil { - if apierrors.IsNotFound(err) { - return true, nil - } - return false, err - } - if resource.Generation != resource.Status.ObservedGeneration { - // Should wait for generation to be observed before checking the reconciliation status so that we know we are checking the new spec - return false, nil - } - status = resource.Status.GenericStatus - case packagedatamodel.ResourceTypePackageInstall: - resource, err := p.kappClient.GetPackageInstall(name, namespace) - if err != nil { - if apierrors.IsNotFound(err) { - return true, nil - } - return false, err - } - if resource.Generation != resource.Status.ObservedGeneration { - // Should wait for generation to be observed before checking the reconciliation status so that we know we are checking the new spec - return false, nil - } - status = resource.Status.GenericStatus - } - for _, cond := range status.Conditions { - if progress != nil { - progress <- fmt.Sprintf("'%s' resource deletion status: %s", rscType.String(), cond.Type) - } - if cond.Type == kappctrl.DeleteFailed && cond.Status == corev1.ConditionTrue { - return false, fmt.Errorf("resource deletion failed: %s. %s", status.UsefulErrorMessage, status.FriendlyDescription) - } - } - - return false, nil - }); err != nil { - return err - } - - return nil -} diff --git a/packageclients/pkg/packageclient/package_uninstall_test.go b/packageclients/pkg/packageclient/package_uninstall_test.go deleted file mode 100644 index 131ce0a333..0000000000 --- a/packageclients/pkg/packageclient/package_uninstall_test.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var _ = Describe("Uninstall Package", func() { - var ( - ctl PackageClient - crtCtl *fakes.CrtClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.PackageOptions{ - PkgInstallName: testPkgInstallName, - Namespace: testNamespaceName, - PollInterval: testPollInterval, - PollTimeout: testPollTimeout, - } - options = opts - progress *packagedatamodel.PackageProgress - pkgInstall = kappipkg.PackageInstall{ - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindPackageInstall}, - ObjectMeta: metav1.ObjectMeta{ - Name: testPkgInstallName, - Namespace: testNamespaceName, - Generation: 1, - Annotations: map[string]string{ - packagedatamodel.TanzuPkgPluginAnnotation + "-" + packagedatamodel.KindClusterRole: "test-pkg-test-ns-cluster-role", - packagedatamodel.TanzuPkgPluginAnnotation + "-" + packagedatamodel.KindClusterRoleBinding: "test-pkg-test-ns-cluster-rolebinding", - packagedatamodel.TanzuPkgPluginAnnotation + "-" + packagedatamodel.KindServiceAccount: "test-pkg-test-ns-sa", - packagedatamodel.TanzuPkgPluginAnnotation + "-" + packagedatamodel.KindSecret: "test-pkg-test-ns-values", - }}, - } - ) - - JustBeforeEach(func() { - progress = &packagedatamodel.PackageProgress{ - ProgressMsg: make(chan string, 10), - Err: make(chan error), - Done: make(chan struct{}), - } - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - go ctl.UninstallPackage(&options, progress) - err = testReceive(progress) - }) - - Context("failure in getting installed packages due to GetPackageInstall API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageInstallReturns(nil, errors.New("failure in GetPackageInstall")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in GetPackageInstall")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in deleting installed package", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.GetPackageInstallReturns(&pkgInstall, nil) - crtCtl.DeleteReturns(errors.New("failure in PackageInstall deletion")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in PackageInstall deletion")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in PackageInstall CR deletion", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.GetPackageInstallReturns(&pkgInstall, nil) - crtCtl.DeleteReturns(nil) - pkgInstall.Status = kappipkg.PackageInstallStatus{ - GenericStatus: kappctrl.GenericStatus{ - Conditions: []kappctrl.AppCondition{ - {Type: kappctrl.Deleting, Status: corev1.ConditionTrue}, - {Type: kappctrl.DeleteFailed, Status: corev1.ConditionTrue}, - }, - UsefulErrorMessage: testUsefulErrMsg, - ObservedGeneration: 1, - }, - } - Expect(pkgInstall.Status.ObservedGeneration).To(Equal(pkgInstall.Generation)) - kappCtl.GetPackageInstallReturns(&pkgInstall, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(testUsefulErrMsg)) - }) - AfterEach(func() { options = opts }) - }) -}) diff --git a/packageclients/pkg/packageclient/package_update.go b/packageclients/pkg/packageclient/package_update.go deleted file mode 100644 index d5facec3c9..0000000000 --- a/packageclients/pkg/packageclient/package_update.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "context" - "fmt" - "os" - "path/filepath" - - "github.com/aunum/log" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - k8serror "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -func (p *pkgClient) UpdatePackage(o *packagedatamodel.PackageOptions, progress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) { - p.updatePackage(o, progress, operationType) -} - -// UpdatePackageSync installs/updates the package and returns an error if any -func (p *pkgClient) UpdatePackageSync(o *packagedatamodel.PackageOptions, operationType packagedatamodel.OperationType) error { - pp := newPackageProgress() - - go p.updatePackage(o, pp, operationType) - - initialMsg := fmt.Sprintf("Updating installed package '%s'", o.PkgInstallName) - if err := DisplayProgress(initialMsg, pp); err != nil { - if err.Error() == packagedatamodel.ErrPackageNotInstalled { - log.Warningf("package '%s' is not among the list of installed packages in namespace '%s'", o.PkgInstallName, o.Namespace) - return nil - } - return err - } - log.Infof("%s", fmt.Sprintf("Updated installed package '%s' in namespace '%s'", o.PkgInstallName, o.Namespace)) - return nil -} - -func (p *pkgClient) updatePackage(o *packagedatamodel.PackageOptions, progress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) { - var ( - pkgInstall *kappipkg.PackageInstall - pkgInstallToUpdate *kappipkg.PackageInstall - pkgPluginResourceCreationStatus packagedatamodel.PkgPluginResourceCreationStatus - err error - changed bool - ) - - defer func() { - if err != nil { - progress.Err <- err - } - if operationType == packagedatamodel.OperationTypeUpdate { - close(progress.ProgressMsg) - close(progress.Done) - } - }() - - progress.ProgressMsg <- fmt.Sprintf("Getting package install for '%s'", o.PkgInstallName) - if pkgInstall, err = p.kappClient.GetPackageInstall(o.PkgInstallName, o.Namespace); err != nil { - if !k8serror.IsNotFound(err) { - return - } - err = nil - } - - if pkgInstall == nil { - if !o.Install { - err = &packagedatamodel.PackagePluginNonCriticalError{Reason: packagedatamodel.ErrPackageNotInstalled} - return - } - progress.ProgressMsg <- fmt.Sprintf("Installing package '%s'", o.PkgInstallName) - p.InstallPackage(o, progress, packagedatamodel.OperationTypeUpdate) - return - } - - if pkgInstallToUpdate, changed, err = p.preparePackageInstallForUpdate(o, pkgInstall); err != nil { - return - } - - progress.ProgressMsg <- fmt.Sprintf("Getting package metadata for '%s'", pkgInstallToUpdate.Spec.PackageRef.RefName) - if _, _, err = p.GetPackage(o); err != nil { - return - } - - if pkgPluginResourceCreationStatus.IsSecretCreated, err = p.createOrUpdateValuesSecret(o, pkgInstallToUpdate, progress.ProgressMsg); err != nil { - return - } - - if o.ValuesFile == "" && !changed { - return - } - - progress.ProgressMsg <- fmt.Sprintf("Updating package install for '%s'", o.PkgInstallName) - if err = p.kappClient.UpdatePackageInstall(pkgInstallToUpdate, &pkgPluginResourceCreationStatus); err != nil { - err = errors.Wrap(err, fmt.Sprintf("failed to update package '%s'", o.PkgInstallName)) - return - } - - if o.Wait { - if err = p.waitForResourceInstallation(o.PkgInstallName, o.Namespace, o.PollInterval, o.PollTimeout, progress.ProgressMsg, packagedatamodel.ResourceTypePackageInstall); err != nil { - return - } - } -} - -func (p *pkgClient) preparePackageInstallForUpdate(o *packagedatamodel.PackageOptions, pkgInstall *kappipkg.PackageInstall) (*kappipkg.PackageInstall, bool, error) { - var changed bool - - if err := p.validateValuesFile(o); err != nil { - return nil, false, err - } - - pkgInstallToUpdate := pkgInstall.DeepCopy() - - if pkgInstallToUpdate.Spec.PackageRef == nil || pkgInstallToUpdate.Spec.PackageRef.VersionSelection == nil { - err := fmt.Errorf("failed to update package '%s' as no existing package reference/version was found in the package install", o.PkgInstallName) - return nil, false, err - } - - // If o.PackageName is provided by the user (via --package-name flag), verify that the package name in PackageInstall matches it. - // This will prevent the users from accidentally overwriting an installed package with another package content due to choosing a pre-existing name for the package isntall. - // Otherwise if o.PackageName is not provided, fill it from the installed package spec, as the validation logic in GetPackage() needs this field to be set. - if o.PackageName != "" && pkgInstallToUpdate.Spec.PackageRef.RefName != o.PackageName { - err := fmt.Errorf("installed package '%s' is already associated with package '%s'", o.PkgInstallName, pkgInstallToUpdate.Spec.PackageRef.RefName) - return nil, false, err - } - o.PackageName = pkgInstallToUpdate.Spec.PackageRef.RefName - - // If o.Version is provided by the user (via --version flag), set the version in PackageInstall to this version - // Otherwise if o.Version is not provided, fill it from the installed package spec, as the validation logic in GetPackage() needs this field to be set. - if o.Version != "" { - if pkgInstallToUpdate.Spec.PackageRef.VersionSelection.Constraints != o.Version { - changed = true - pkgInstallToUpdate.Spec.PackageRef.VersionSelection.Constraints = o.Version - } - } else { - o.Version = pkgInstallToUpdate.Spec.PackageRef.VersionSelection.Constraints - } - - return pkgInstallToUpdate, changed, nil -} - -// createOrUpdateValuesSecret either creates or updates the values secret depending on whether the corresponding annotation exists or not -func (p *pkgClient) createOrUpdateValuesSecret(o *packagedatamodel.PackageOptions, pkgInstallToUpdate *kappipkg.PackageInstall, progress chan string) (bool, error) { - var ( - secretCreated bool - err error - ) - - if o.ValuesFile == "" { - return false, nil - } - - o.SecretName = fmt.Sprintf(packagedatamodel.SecretName, o.PkgInstallName, o.Namespace) - - if o.SecretName == pkgInstallToUpdate.GetAnnotations()[packagedatamodel.TanzuPkgPluginAnnotation+"-Secret"] { - progress <- fmt.Sprintf("Updating secret '%s'", o.SecretName) - if err = p.updateDataValuesSecret(o); err != nil { - err = errors.Wrap(err, "failed to update secret based on values file") - return false, err - } - } else { - progress <- fmt.Sprintf("Creating secret '%s'", o.SecretName) - if secretCreated, err = p.createOrUpdateDataValuesSecret(o); err != nil { - return secretCreated, errors.Wrap(err, "failed to create secret based on values file") - } - } - - pkgInstallToUpdate.Spec.Values = []kappipkg.PackageInstallValues{ - {SecretRef: &kappipkg.PackageInstallValuesSecretRef{Name: o.SecretName}}, - } - - return secretCreated, nil -} - -// updateDataValuesSecret update a secret object containing the user-provided configuration. -func (p *pkgClient) updateDataValuesSecret(o *packagedatamodel.PackageOptions) error { - var err error - dataValues := make(map[string][]byte) - - if dataValues[filepath.Base(o.ValuesFile)], err = os.ReadFile(o.ValuesFile); err != nil { - return errors.Wrap(err, fmt.Sprintf("failed to read from data values file '%s'", o.ValuesFile)) - } - Secret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{Name: o.SecretName, Namespace: o.Namespace}, Data: dataValues, - } - - if err := p.kappClient.GetClient().Update(context.Background(), Secret); err != nil { - return errors.Wrap(err, "failed to update Secret resource") - } - - return nil -} diff --git a/packageclients/pkg/packageclient/package_update_test.go b/packageclients/pkg/packageclient/package_update_test.go deleted file mode 100644 index f58cb7640a..0000000000 --- a/packageclients/pkg/packageclient/package_update_test.go +++ /dev/null @@ -1,339 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - "fmt" - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime/schema" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - versions "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/versions/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var _ = Describe("Update Package", func() { - var ( - ctl PackageClient - crtCtl *fakes.CrtClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.PackageOptions{ - PkgInstallName: testPkgInstallName, - Namespace: testNamespaceName, - Version: "2.0.0", - PollInterval: testPollInterval, - PollTimeout: testPollTimeout, - CreateNamespace: true, - Install: false, - } - options = opts - progress *packagedatamodel.PackageProgress - ) - - JustBeforeEach(func() { - progress = &packagedatamodel.PackageProgress{ - ProgressMsg: make(chan string, 10), - Err: make(chan error), - Done: make(chan struct{}), - } - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - go ctl.UpdatePackage(&options, progress, packagedatamodel.OperationTypeUpdate) - err = testReceive(progress) - }) - - Context("failure in getting the installed package due to GetPackageInstall API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageInstallReturnsOnCall(0, nil, errors.New("failure in GetPackageInstall")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in GetPackageInstall")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure due to PackageInstall being nil and --install flag not provided", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageInstallReturnsOnCall(0, nil, apierrors.NewNotFound(schema.GroupResource{Resource: "PackageInstall"}, testPkgInstallName)) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("package install does not exist in the namespace")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in installing the package due to a failure in ListPackages", func() { - BeforeEach(func() { - options.Install = true - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.GetPackageInstallReturnsOnCall(0, nil, nil) - kappCtl.ListPackagesReturns(nil, errors.New("failure in ListPackages")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to list package versions")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in installing the not-already-existing package due to GetPackageByName API error", func() { - BeforeEach(func() { - options.Install = true - options.PackageName = testPkgName - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.GetPackageInstallReturns(nil, nil) - kappCtl.GetPackageMetadataByNameReturns(nil, errors.New("failure in GetPackageByName")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in GetPackageByName")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the installed package due to GetPackageByName API error", func() { - BeforeEach(func() { - options.Version = testPkgVersion - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageInstallReturns(testPkgInstall, nil) - kappCtl.GetPackageMetadataByNameReturns(nil, errors.New("failure in GetPackageByName")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in GetPackageByName")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the installed package with nil version spec", func() { - BeforeEach(func() { - options.Install = true - options.PackageName = testPkgName - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - testPkgInstall.Spec.PackageRef.VersionSelection = nil - kappCtl.GetPackageInstallReturnsOnCall(0, testPkgInstall, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to update package 'test-pkg' as no existing package reference/version was found in the package install")) - }) - AfterEach(func() { - options = opts - testPkgInstall.Spec.PackageRef.VersionSelection = testVersionSelection - }) - }) - - Context("failure in updating the installed package with nil version spec", func() { - BeforeEach(func() { - options.Version = testPkgVersion - kappCtl = &fakes.KappClient{} - testPkgInstall.Spec.PackageRef.VersionSelection = nil - kappCtl.GetPackageInstallReturnsOnCall(0, testPkgInstall, nil) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to update package 'test-pkg'")) - }) - AfterEach(func() { - options = opts - testPkgInstall.Spec.PackageRef.VersionSelection = testVersionSelection - }) - }) - - Context("failure in updating the installed package due to failure in opening the provided secret value file", func() { - BeforeEach(func() { - options.Version = testPkgVersion - options.ValuesFile = testValuesFile - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageInstallReturnsOnCall(0, testPkgInstall, nil) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to read from data values file 'value-file': open value-file: no such file or directory")) - }) - AfterEach(func() { - options = opts - testPkgInstall.Spec.PackageRef.VersionSelection = testVersionSelection - }) - }) - - Context("failure in updating the installed package due to failure in creating the secret resource", func() { - BeforeEach(func() { - options.Version = testPkgVersion - options.ValuesFile = testValuesFile - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.GetPackageInstallReturnsOnCall(0, testPkgInstall, nil) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - err = os.WriteFile(testValuesFile, []byte("test"), 0644) - Expect(err).ToNot(HaveOccurred()) - Secret = testSecret - crtCtl.CreateReturns(errors.New("error on creating the secret resource")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error on creating the secret resource")) - }) - AfterEach(func() { - options = opts - Secret = &corev1.Secret{} - testPkgInstall.Spec.PackageRef.VersionSelection = testVersionSelection - err = os.Remove(testValuesFile) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("failure in updating the installed package due to failure in updating the secret resource", func() { - BeforeEach(func() { - options.Version = testPkgVersion - options.ValuesFile = testValuesFile - testPkgInstall.Annotations = make(map[string]string) - testPkgInstall.Annotations[packagedatamodel.TanzuPkgPluginAnnotation+"-Secret"] = fmt.Sprintf(packagedatamodel.SecretName, options.PkgInstallName, options.Namespace) - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.GetPackageInstallReturnsOnCall(0, testPkgInstall, nil) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - err = os.WriteFile(testValuesFile, []byte("test"), 0644) - Expect(err).ToNot(HaveOccurred()) - Secret = testSecret - crtCtl.UpdateReturns(errors.New("error on updating the secret resource")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error on updating the secret resource")) - }) - AfterEach(func() { - options = opts - Secret = &corev1.Secret{} - testPkgInstall.Spec.PackageRef.VersionSelection = testVersionSelection - err = os.Remove(testValuesFile) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("failure in updating the installed package due to UpdatePackageInstall API error", func() { - BeforeEach(func() { - options.Version = testPkgVersion - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageInstallReturnsOnCall(0, testPkgInstall, nil) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - testPkgInstall.Spec.PackageRef = &kappipkg.PackageRef{ - RefName: testPkgName, - VersionSelection: &versions.VersionSelectionSemver{}, - } - kappCtl.UpdatePackageInstallReturns(errors.New("failure in UpdatePackageInstall")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in UpdatePackageInstall")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the installed package due to GetPackageInstall API error in waitForResourceInstallation", func() { - BeforeEach(func() { - options.Version = testPkgVersion - options.Wait = true - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageInstallReturnsOnCall(0, testPkgInstall, nil) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - testPkgInstall.Spec.PackageRef = &kappipkg.PackageRef{ - RefName: testPkgName, - VersionSelection: &versions.VersionSelectionSemver{}, - } - kappCtl.GetPackageInstallReturnsOnCall(1, nil, errors.New("failure in GetPackageInstall")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in GetPackageInstall")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the installed package due to reconciliation failure", func() { - BeforeEach(func() { - options.Version = testPkgVersion - options.Wait = true - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageInstallReturnsOnCall(0, testPkgInstall, nil) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - testPkgInstall.Spec.PackageRef = &kappipkg.PackageRef{ - RefName: testPkgName, - VersionSelection: &versions.VersionSelectionSemver{}, - } - kappCtl.GetPackageInstallReturnsOnCall(1, testPkgInstall, nil) - Expect(testPkgInstall.Status.ObservedGeneration).To(Equal(testPkgInstall.Generation)) - Expect(len(testPkgInstall.Status.Conditions)).To(BeNumerically("==", 2)) - testPkgInstall.Status.Conditions[1].Type = kappctrl.ReconcileFailed - testPkgInstall.Status.UsefulErrorMessage = testUsefulErrMsg - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("resource reconciliation failed: %s", testUsefulErrMsg))) - }) - AfterEach(func() { - options = opts - testPkgInstall.Status.Conditions[1].Type = kappctrl.ReconcileSucceeded - }) - }) - - Context("success in installing the not-already-existing package", func() { - BeforeEach(func() { - options.Install = true - options.PackageName = testPkgName - options.Version = testPkgVersion - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.GetPackageInstallReturnsOnCall(0, nil, nil) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in updating the installed package", func() { - BeforeEach(func() { - options.Version = testPkgVersion - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageInstallReturnsOnCall(0, testPkgInstall, nil) - kappCtl.ListPackagesReturns(testPkgVersionList, nil) - testPkgInstall.Spec.PackageRef = &kappipkg.PackageRef{ - RefName: testPkgName, - VersionSelection: &versions.VersionSelectionSemver{}, - } - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - }) - AfterEach(func() { options = opts }) - }) -}) diff --git a/packageclients/pkg/packageclient/packageclient_suite_test.go b/packageclients/pkg/packageclient/packageclient_suite_test.go deleted file mode 100644 index 682d60d956..0000000000 --- a/packageclients/pkg/packageclient/packageclient_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestPackageClient(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "PackageClient Suite") -} diff --git a/packageclients/pkg/packageclient/registry_secret_add.go b/packageclients/pkg/packageclient/registry_secret_add.go deleted file mode 100644 index 5b76aed9e1..0000000000 --- a/packageclients/pkg/packageclient/registry_secret_add.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "context" - "encoding/json" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - secretgenctrl "github.com/vmware-tanzu/carvel-secretgen-controller/pkg/apis/secretgen2/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -// DockerConfigJSON represents authentication information for pulling images from private registries -// Note: datapolicy is seemingly used for log sanitization: https://github.com/kubernetes/enhancements/blob/master/keps/sig-security/1933-secret-logging-static-analysis/README.md -// TODO: change to use k8s types after upgrading the K8s version -type DockerConfigJSON struct { - Auths map[string]DockerConfigEntry `json:"auths" datapolicy:"token"` -} - -type DockerConfigEntry struct { - Username string `json:"username,omitempty"` - Password string `json:"password,omitempty" datapolicy:"password"` -} - -// AddRegistrySecret adds a registry secret to the cluster -func (p *pkgClient) AddRegistrySecret(o *packagedatamodel.RegistrySecretOptions) error { - dockerCfg := DockerConfigJSON{Auths: map[string]DockerConfigEntry{o.Server: {Username: o.Username, Password: o.Password}}} - dockerCfgContent, err := json.Marshal(dockerCfg) - if err != nil { - return err - } - - Secret = p.newSecret(o.SecretName, o.Namespace, corev1.SecretTypeDockerConfigJson) - Secret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - if err := p.kappClient.GetClient().Create(context.Background(), Secret); err != nil { - return errors.Wrap(err, "failed to create Secret resource") - } - - if o.ExportToAllNamespaces { - SecretExport = p.newSecretExport(o.SecretName, o.Namespace) - if err := p.kappClient.GetClient().Create(context.Background(), SecretExport); err != nil { - return errors.Wrap(err, "failed to create SecretExport resource") - } - } - - return nil -} - -// newSecret creates a new secret object -func (p *pkgClient) newSecret(name, namespace string, secretType corev1.SecretType) *corev1.Secret { - return &corev1.Secret{ - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindSecret, APIVersion: corev1.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace}, - Type: secretType, - Data: map[string][]byte{}, - } -} - -// newSecretExport creates a new SecretExport object -func (p *pkgClient) newSecretExport(name, namespace string) *secretgenctrl.SecretExport { - return &secretgenctrl.SecretExport{ - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindSecretExport, APIVersion: secretgenctrl.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace}, - Spec: secretgenctrl.SecretExportSpec{ToNamespaces: []string{"*"}}, - } -} diff --git a/packageclients/pkg/packageclient/registry_secret_add_test.go b/packageclients/pkg/packageclient/registry_secret_add_test.go deleted file mode 100644 index 15942da491..0000000000 --- a/packageclients/pkg/packageclient/registry_secret_add_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -const ( - testSecretName = "test-secret" - testPassword = "test-password" - testRegistry = "test-registry" - testUsername = "test-username" - testServer = "us-east4-docker.pkg.dev" -) - -var _ = Describe("Add Secret", func() { - var ( - ctl PackageClient - crtCtl *fakes.CrtClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.RegistrySecretOptions{ - ExportToAllNamespaces: false, - Namespace: testNamespaceName, - Password: testPassword, - Server: testRegistry, - SecretName: testSecretName, - Username: testUsername, - } - options = opts - ) - - JustBeforeEach(func() { - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - err = ctl.AddRegistrySecret(&options) - }) - - Context("failure in creating Secret due to Create API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.CreateReturnsOnCall(0, errors.New("failure in create Secret")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in create Secret")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in creating SecretExport due to Create API error", func() { - BeforeEach(func() { - options.ExportToAllNamespaces = true - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.CreateReturnsOnCall(0, nil) - crtCtl.CreateReturnsOnCall(1, errors.New("failure in create SecretExport")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in create SecretExport")) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in creating Secret and SecretExport", func() { - BeforeEach(func() { - options.ExportToAllNamespaces = true - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.CreateReturnsOnCall(0, nil) - crtCtl.CreateReturnsOnCall(1, nil) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - }) - AfterEach(func() { options = opts }) - }) -}) diff --git a/packageclients/pkg/packageclient/registry_secret_delete.go b/packageclients/pkg/packageclient/registry_secret_delete.go deleted file mode 100644 index 96715868f9..0000000000 --- a/packageclients/pkg/packageclient/registry_secret_delete.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "context" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - secretgenctrl "github.com/vmware-tanzu/carvel-secretgen-controller/pkg/apis/secretgen2/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -// DeleteRegistrySecret deletes a registry secret from the cluster -func (p *pkgClient) DeleteRegistrySecret(o *packagedatamodel.RegistrySecretOptions) (bool, error) { - SecretExport = &secretgenctrl.SecretExport{ - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindSecretExport, APIVersion: secretgenctrl.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{Name: o.SecretName, Namespace: o.Namespace}, - } - if err := p.kappClient.GetClient().Delete(context.Background(), SecretExport); err != nil { - if !apierrors.IsNotFound(err) { - return true, errors.Wrap(err, "failed to delete SecretExport resource") - } - } - - Secret = &corev1.Secret{ - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindSecret, APIVersion: corev1.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{Name: o.SecretName, Namespace: o.Namespace}, - } - if err := p.kappClient.GetClient().Delete(context.Background(), Secret); err != nil { - if !apierrors.IsNotFound(err) { - return true, errors.Wrap(err, "failed to delete Secret resource") - } - return false, nil - } - - return true, nil -} diff --git a/packageclients/pkg/packageclient/registry_secret_delete_test.go b/packageclients/pkg/packageclient/registry_secret_delete_test.go deleted file mode 100644 index 0649b50076..0000000000 --- a/packageclients/pkg/packageclient/registry_secret_delete_test.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime/schema" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var _ = Describe("Delete Secret", func() { - var ( - ctl PackageClient - crtCtl *fakes.CrtClient - kappCtl *fakes.KappClient - err error - isSecretFound bool - opts = packagedatamodel.RegistrySecretOptions{ - ExportToAllNamespaces: false, - Namespace: testNamespaceName, - Password: testPassword, - Server: testRegistry, - SecretName: testSecretName, - Username: testUsername, - SkipPrompt: true, - } - options = opts - ) - - JustBeforeEach(func() { - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - isSecretFound, err = ctl.DeleteRegistrySecret(&options) - }) - - Context("success when trying to delete SecretExport returns NotFound error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.DeleteReturnsOnCall(0, apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindSecretExport}, testSecretName)) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in deleting SecretExport due to Delete API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.DeleteReturnsOnCall(0, errors.New("failure in delete SecretExport")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in delete SecretExport")) - Expect(isSecretFound).To(BeTrue()) - }) - AfterEach(func() { options = opts }) - }) - - Context("success when trying to delete Secret returns NotFound error", func() { - BeforeEach(func() { - options.ExportToAllNamespaces = true - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.DeleteReturnsOnCall(0, nil) - crtCtl.DeleteReturnsOnCall(1, apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindSecret}, testSecretName)) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - Expect(isSecretFound).To(BeFalse()) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in deleting Secret due to Delete API error", func() { - BeforeEach(func() { - options.ExportToAllNamespaces = true - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.DeleteReturnsOnCall(0, nil) - crtCtl.DeleteReturnsOnCall(1, errors.New("failure in delete Secret")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in delete Secret")) - Expect(isSecretFound).To(BeTrue()) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in deleting Secret and SecretExport", func() { - BeforeEach(func() { - options.ExportToAllNamespaces = true - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.DeleteReturnsOnCall(0, nil) - crtCtl.DeleteReturnsOnCall(1, nil) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - Expect(isSecretFound).To(BeTrue()) - }) - AfterEach(func() { options = opts }) - }) -}) diff --git a/packageclients/pkg/packageclient/registry_secret_list.go b/packageclients/pkg/packageclient/registry_secret_list.go deleted file mode 100644 index 88d8a135da..0000000000 --- a/packageclients/pkg/packageclient/registry_secret_list.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - - secretgenctrl "github.com/vmware-tanzu/carvel-secretgen-controller/pkg/apis/secretgen2/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -// ListRegistrySecrets lists all registry secrets of type kubernetes.io/dockerconfigjson across the cluster. -func (p *pkgClient) ListRegistrySecrets(o *packagedatamodel.RegistrySecretOptions) (*corev1.SecretList, error) { - registrySecretList, err := p.kappClient.ListRegistrySecrets(o.Namespace) - if err != nil { - return nil, errors.Wrap(err, "failed to list existing registry secrets in the cluster") - } - - return registrySecretList, nil -} - -// ListSecretExports lists all SecretExports across the cluster. -func (p *pkgClient) ListSecretExports(o *packagedatamodel.RegistrySecretOptions) (*secretgenctrl.SecretExportList, error) { - secretExportList, err := p.kappClient.ListSecretExports(o.Namespace) - if err != nil { - return nil, errors.Wrap(err, "failed to list existing secret exports in the cluster") - } - - return secretExportList, nil -} - -// GetSecretExport gets the SecretExport having the same name and namespace as specified secret. -func (p *pkgClient) GetSecretExport(o *packagedatamodel.RegistrySecretOptions) (*secretgenctrl.SecretExport, error) { - var err error - SecretExport, err = p.kappClient.GetSecretExport(o.SecretName, o.Namespace) - if err != nil { - return nil, errors.Wrap(err, "failed to get existing secret export in the cluster") - } - - return SecretExport, nil -} diff --git a/packageclients/pkg/packageclient/registry_secret_list_test.go b/packageclients/pkg/packageclient/registry_secret_list_test.go deleted file mode 100644 index 56f3b2b3af..0000000000 --- a/packageclients/pkg/packageclient/registry_secret_list_test.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - "encoding/json" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - secretgenctrl "github.com/vmware-tanzu/carvel-secretgen-controller/pkg/apis/secretgen2/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -const testSecretExportName = "test-secret" - -var testDockerConfig = DockerConfigJSON{Auths: map[string]DockerConfigEntry{"us-east4-docker.pkg.dev": {Username: "test_user", Password: "test_password"}}} - -var testSecret = &corev1.Secret{ - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindSecret, APIVersion: corev1.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{Name: testSecretName, Namespace: testNamespaceName}, - Type: corev1.SecretTypeDockerConfigJson, - Data: map[string][]byte{}, -} - -var testSecretExport = &secretgenctrl.SecretExport{ - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindSecretExport, APIVersion: secretgenctrl.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{Name: testSecretExportName, Namespace: testNamespaceName}, - Spec: secretgenctrl.SecretExportSpec{ToNamespaces: []string{"*"}}, -} - -var _ = Describe("List Secrets", func() { - var ( - ctl PackageClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.RegistrySecretOptions{ - Namespace: testNamespaceName, - AllNamespaces: false, - } - options = opts - secrets *corev1.SecretList - secretList = &corev1.SecretList{ - TypeMeta: metav1.TypeMeta{Kind: "SecretList"}, - Items: []corev1.Secret{*testSecret}, - } - ) - - JustBeforeEach(func() { - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - dockerCfgContent, _ := json.Marshal(testDockerConfig) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - secrets, err = ctl.ListRegistrySecrets(&options) - }) - - Context("failure in listing secrets due to ListRegistrySecrets API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListRegistrySecretsReturns(nil, errors.New("failure in ListRegistrySecrets")) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in ListRegistrySecrets")) - Expect(secrets).To(BeNil()) - }) - }) - - Context("success in listing secrets", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListRegistrySecretsReturns(secretList, nil) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - Expect(secrets).NotTo(BeNil()) - Expect(secrets).To(Equal(secretList)) - }) - }) -}) - -var _ = Describe("List Secret Exports", func() { - var ( - ctl PackageClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.RegistrySecretOptions{ - Namespace: testNamespaceName, - AllNamespaces: false, - } - options = opts - secretExports *secretgenctrl.SecretExportList - secretExportList = &secretgenctrl.SecretExportList{ - TypeMeta: metav1.TypeMeta{Kind: "SecretList"}, - Items: []secretgenctrl.SecretExport{*testSecretExport}, - } - ) - - JustBeforeEach(func() { - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - secretExports, err = ctl.ListSecretExports(&options) - }) - - Context("failure in listing secret exports due to ListSecretExports API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListSecretExportsReturns(nil, errors.New("failure in ListSecretExports")) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in ListSecretExports")) - Expect(secretExports).To(BeNil()) - }) - }) - - Context("success in listing secret exports", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListSecretExportsReturns(secretExportList, nil) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - Expect(secretExports).NotTo(BeNil()) - Expect(secretExports).To(Equal(secretExportList)) - }) - }) -}) diff --git a/packageclients/pkg/packageclient/registry_secret_update.go b/packageclients/pkg/packageclient/registry_secret_update.go deleted file mode 100644 index 1f9d773ea9..0000000000 --- a/packageclients/pkg/packageclient/registry_secret_update.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "context" - "encoding/json" - "fmt" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - secretgenctrl "github.com/vmware-tanzu/carvel-secretgen-controller/pkg/apis/secretgen2/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var ( - Secret = &corev1.Secret{} - SecretExport = &secretgenctrl.SecretExport{} -) - -// UpdateRegistrySecret updates a registry Secret in the cluster -func (p *pkgClient) UpdateRegistrySecret(o *packagedatamodel.RegistrySecretOptions) error { - if err := p.kappClient.GetClient().Get(context.Background(), crtclient.ObjectKey{Name: o.SecretName, Namespace: o.Namespace}, Secret); err != nil { - if apierrors.IsNotFound(err) { - return fmt.Errorf("secret '%s' does not exist in namespace '%s'", o.SecretName, o.Namespace) - } - return err - } - - registry, username, password, err := extractExistingSecretCredentials(Secret, o) - if err != nil { - return err - } - - // if the user has provided a new value for the "username", use it - if o.Username != "" { - username = o.Username - } - // if the username field remains empty, should return an error (this check is performed here as previously there was no appropriate validation in command line "tanzu secret registry add") - if username == "" { - return fmt.Errorf("no 'username' is provided for the secret '%s'. Please provide one through --username flag", o.SecretName) - } - - // if the user has provided a new value for the "password", use it - if o.Password != "" { - password = o.Password - } - - dockerCfg := DockerConfigJSON{Auths: map[string]DockerConfigEntry{registry: {Username: username, Password: password}}} - dockerCfgContent, err := json.Marshal(dockerCfg) - if err != nil { - return err - } - secretToUpdate := Secret.DeepCopy() - secretToUpdate.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - - if err := p.kappClient.GetClient().Update(context.Background(), secretToUpdate); err != nil { - return errors.Wrap(err, "failed to update Secret resource") - } - - if err := p.UpdateSecretExport(o); err != nil { - return err - } - - return nil -} - -func extractExistingSecretCredentials(secret *corev1.Secret, o *packagedatamodel.RegistrySecretOptions) (string, string, string, error) { - var ( - registry string - username string - password string - dataMap map[string]interface{} - ) - - if err := json.Unmarshal(secret.Data[corev1.DockerConfigJsonKey], &dataMap); err != nil { - return "", "", "", err - } - - auths, ok := dataMap["auths"] - if !ok { - return "", "", "", fmt.Errorf("no 'auths' entry exists in secret '%s'", o.SecretName) - } - - entries := auths.(map[string]interface{}) - if len(entries) != 1 { - return "", "", "", fmt.Errorf("updating secret '%s' is not allowed as multiple registry entries exists", o.SecretName) - } - - // It is assumed that only one such entry exists - for reg, v := range entries { - registry = reg - // this check is for the corner case where the user has performed "tanzu secret registry add" while a secret with the same name already exists with a different value for the registry server field. - if o.Server != "" && registry != o.Server { - return "", "", "", fmt.Errorf("secret '%s' already exists and the registry server's value is '%s'. Changing the value of the registry server FQDN is not allowed", o.SecretName, registry) - } - credentials := v.(map[string]interface{}) - currentUsername, ok := credentials["username"] - if ok { - username = currentUsername.(string) - } - currentPassword, ok := credentials["password"] - if !ok { - return "", "", "", fmt.Errorf("no 'password' entry exists in secret '%s'", o.SecretName) - } - password = currentPassword.(string) - } - - return registry, username, password, nil -} - -// UpdateSecretExport updates the SecretExport resource in the cluster -func (p *pkgClient) UpdateSecretExport(o *packagedatamodel.RegistrySecretOptions) error { - if o.Export.ExportToAllNamespaces == nil { - return nil - } - - if *o.Export.ExportToAllNamespaces { - err := p.kappClient.GetClient().Get(context.Background(), crtclient.ObjectKey{Name: o.SecretName, Namespace: o.Namespace}, SecretExport) - if err != nil { - if !apierrors.IsNotFound(err) { - return err - } - SecretExport = p.newSecretExport(o.SecretName, o.Namespace) - if err := p.kappClient.GetClient().Create(context.Background(), SecretExport); err != nil { - return errors.Wrap(err, "failed to create SecretExport resource") - } - return nil - } - secretExportToUpdate := SecretExport.DeepCopy() - secretExportToUpdate.Spec = secretgenctrl.SecretExportSpec{ToNamespaces: []string{"*"}} - if err := p.kappClient.GetClient().Update(context.Background(), secretExportToUpdate); err != nil { - return errors.Wrap(err, "failed to update SecretExport resource") - } - } else { // un-export already exported secrets - SecretExport = &secretgenctrl.SecretExport{ - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindSecretExport, APIVersion: secretgenctrl.SchemeGroupVersion.String()}, - ObjectMeta: metav1.ObjectMeta{Name: o.SecretName, Namespace: o.Namespace}, - } - if err := p.kappClient.GetClient().Delete(context.Background(), SecretExport); err != nil { - if !apierrors.IsNotFound(err) { - return errors.Wrap(err, "failed to delete SecretExport resource") - } - } - } - - return nil -} diff --git a/packageclients/pkg/packageclient/registry_secret_update_test.go b/packageclients/pkg/packageclient/registry_secret_update_test.go deleted file mode 100644 index 753c2d06d5..0000000000 --- a/packageclients/pkg/packageclient/registry_secret_update_test.go +++ /dev/null @@ -1,357 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - "encoding/json" - "fmt" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime/schema" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var _ = Describe("Update Secret", func() { - type invalidDockerCfgJSON struct { - Auths map[string]DockerConfigEntry `json:"invalid-key" datapolicy:"token"` - } - var ( - ctl PackageClient - crtCtl *fakes.CrtClient - kappCtl *fakes.KappClient - err error - dockerCfgContent []byte - f = false - t = true - opts = packagedatamodel.RegistrySecretOptions{ - Export: packagedatamodel.TypeBoolPtr{ExportToAllNamespaces: &t}, - Namespace: testNamespaceName, - Password: testPassword, - SecretName: testSecretName, - Username: testUsername, - Server: testServer, - } - options = opts - testDockerCfgInvalid = invalidDockerCfgJSON{Auths: map[string]DockerConfigEntry{testServer: {Username: "test_user", Password: "test_password"}}} - testDockerCfgMultipleRegistries = DockerConfigJSON{Auths: map[string]DockerConfigEntry{testServer: {Username: "test_user", Password: "test_password"}, "us-west-docker.pkg.dev": {Username: "test_user", Password: "test_password"}}} - testDockerCfgNoUsername = DockerConfigJSON{Auths: map[string]DockerConfigEntry{testServer: {Password: "test_password"}}} - testDockerCfgNoPassword = DockerConfigJSON{Auths: map[string]DockerConfigEntry{testServer: {Username: "test_user"}}} - ) - - JustBeforeEach(func() { - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - err = ctl.UpdateRegistrySecret(&options) - }) - - Context("failure in updating Secret due to Secret Get NotFound error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.GetReturnsOnCall(0, apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindSecret}, testSecretName)) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("secret '%s' does not exist in namespace '%s'", options.SecretName, options.Namespace))) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the Secret due to Secret Get error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.GetReturnsOnCall(0, errors.New("failure in Secret Get")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Secret Get")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the Secret due to the non-existence of the 'auths' field in the secret", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerCfgInvalid) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("no 'auths' entry exists in secret '%s'", testSecretName))) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the Secret due to the existence of multiple registries in the secret", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerCfgMultipleRegistries) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("updating secret '%s' is not allowed as multiple registry entries exists", testSecretName))) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the Secret due to a change in the value of the 'server'", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - options.Server = "new-server" - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerCfgNoUsername) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("secret '%s' already exists and the registry server's value is '%s'. Changing the value of the registry server FQDN is not allowed", testSecretName, testServer))) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the Secret due to the empty value for the 'username'", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - options.Username = "" - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerCfgNoUsername) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("no 'username' is provided for the secret '%s'", testSecretName))) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the Secret due to the non-existence of the 'password' field in the secret", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerCfgNoPassword) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("no 'password' entry exists in secret '%s'", testSecretName))) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the Secret due to Secret Update error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerConfig) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - crtCtl.UpdateReturnsOnCall(0, errors.New("failure in Secret Update")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Secret Update")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the Secret due to SecretExport Get error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerConfig) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - crtCtl.UpdateReturnsOnCall(0, nil) - crtCtl.GetReturnsOnCall(1, errors.New("failure in SecretExport Get")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in SecretExport Get")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the Secret due to SecretExport Create error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerConfig) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - crtCtl.UpdateReturnsOnCall(0, nil) - crtCtl.GetReturnsOnCall(1, apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindSecretExport}, testSecretName)) - crtCtl.CreateReturnsOnCall(0, errors.New("failure in SecretExport Create")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in SecretExport Create")) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in updating the Secret and Creating SecretExport", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerConfig) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - crtCtl.UpdateReturnsOnCall(0, nil) - crtCtl.GetReturnsOnCall(1, apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindSecretExport}, testSecretName)) - crtCtl.CreateReturnsOnCall(0, nil) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the Secret due to SecretExport Update error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerConfig) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - crtCtl.UpdateReturnsOnCall(0, nil) - crtCtl.GetReturnsOnCall(1, nil) - crtCtl.UpdateReturnsOnCall(1, errors.New("failure in SecretExport Update")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in SecretExport Update")) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in updating the Secret and updating SecretExport", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerConfig) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - crtCtl.UpdateReturnsOnCall(0, nil) - crtCtl.GetReturnsOnCall(1, nil) - crtCtl.UpdateReturnsOnCall(0, nil) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating the Secret with --export-to-all-namespaces=false due to SecretExport Delete error", func() { - BeforeEach(func() { - options.Export = packagedatamodel.TypeBoolPtr{ExportToAllNamespaces: &f} - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerConfig) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - crtCtl.UpdateReturnsOnCall(0, nil) - crtCtl.DeleteReturnsOnCall(0, errors.New("failure in SecretExport Delete")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in SecretExport Delete")) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in updating the Secret with --export-to-all-namespaces=false (SecretExport already not found)", func() { - BeforeEach(func() { - options.Export = packagedatamodel.TypeBoolPtr{ExportToAllNamespaces: &f} - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerConfig) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - crtCtl.UpdateReturnsOnCall(0, nil) - crtCtl.DeleteReturnsOnCall(0, apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindSecretExport}, testSecretName)) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in updating the Secret and deleting SecretExport (--export-to-all-namespaces=false)", func() { - BeforeEach(func() { - options.Export = packagedatamodel.TypeBoolPtr{ExportToAllNamespaces: &f} - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - Secret = testSecret - crtCtl.GetReturnsOnCall(0, nil) - dockerCfgContent, err = json.Marshal(testDockerConfig) - Expect(err).NotTo(HaveOccurred()) - testSecret.Data[corev1.DockerConfigJsonKey] = dockerCfgContent - crtCtl.UpdateReturnsOnCall(0, nil) - crtCtl.DeleteReturnsOnCall(0, nil) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - }) - AfterEach(func() { options = opts }) - }) -}) diff --git a/packageclients/pkg/packageclient/repository_add.go b/packageclients/pkg/packageclient/repository_add.go deleted file mode 100644 index 88a92d9923..0000000000 --- a/packageclients/pkg/packageclient/repository_add.go +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "fmt" - - "github.com/aunum/log" - "github.com/pkg/errors" - k8serror "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - versions "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/versions/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -const ( - msgRunPackageRepositoryUpdate = "\n\nPlease consider using 'tanzu package repository update' to update the package repository with correct settings\n" -) - -// AddRepository validates the provided input and adds the package repository CR to the cluster -func (p *pkgClient) AddRepository(o *packagedatamodel.RepositoryOptions, progress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) { - p.addRepository(o, progress, operationType) -} - -// AddRepositorySync validates the provided input and adds the package repository CR to the cluster and returns error if any -func (p *pkgClient) AddRepositorySync(o *packagedatamodel.RepositoryOptions, operationType packagedatamodel.OperationType) error { - pp := newPackageProgress() - - go p.addRepository(o, pp, operationType) - - initialMsg := fmt.Sprintf("Adding package repository '%s'", o.RepositoryName) - if err := DisplayProgress(initialMsg, pp); err != nil { - if err.Error() == packagedatamodel.ErrRepoAlreadyExists { - log.Infof("Updated package repository '%s' in namespace '%s'", o.RepositoryName, o.Namespace) - return nil - } - return err - } - log.Infof("Added package repository '%s' in namespace '%s'", o.RepositoryName, o.Namespace) - return nil -} - -func (p *pkgClient) addRepository(o *packagedatamodel.RepositoryOptions, progress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) { - var ( - pkgRepository *kappipkg.PackageRepository - err error - ) - - defer func() { - if err != nil { - progress.Err <- err - } - if operationType == packagedatamodel.OperationTypeInstall { - close(progress.ProgressMsg) - close(progress.Done) - } - }() - - if pkgRepository, err = p.kappClient.GetPackageRepository(o.RepositoryName, o.Namespace); err != nil { - if !k8serror.IsNotFound(err) { - return - } - err = nil - } - - if pkgRepository != nil { - progress.ProgressMsg <- fmt.Sprintf("Updating package repository '%s'", o.RepositoryName) - p.UpdateRepository(o, progress, packagedatamodel.OperationTypeInstall) - err = &packagedatamodel.PackagePluginNonCriticalError{Reason: packagedatamodel.ErrRepoAlreadyExists} - return - } - - progress.ProgressMsg <- "Validating provided settings for the package repository" - if err = p.validateRepositoryAdd(o.RepositoryName, o.RepositoryURL, o.Namespace); err != nil { - return - } - - if o.CreateNamespace { - progress.ProgressMsg <- fmt.Sprintf("Creating namespace '%s'", o.Namespace) - if err = p.createNamespace(o.Namespace); err != nil { - return - } - } - - newPackageRepo, err := p.newPackageRepository(o.RepositoryName, o.RepositoryURL, o.Namespace) - if err != nil { - return - } - - progress.ProgressMsg <- "Creating package repository resource" - - if err = p.kappClient.CreatePackageRepository(newPackageRepo); err != nil { - err = errors.Wrap(err, fmt.Sprintf("failed to create package repository '%s' in namespace '%s'", o.RepositoryName, o.Namespace)) - return - } - - if o.Wait { - if err = p.waitForResourceInstallation(o.RepositoryName, o.Namespace, o.PollInterval, o.PollTimeout, progress.ProgressMsg, packagedatamodel.ResourceTypePackageRepository); err != nil { - log.Warning(msgRunPackageRepositoryUpdate) - return - } - } -} - -// newPackageRepository creates a new instance of the PackageRepository object -// If tag is empty, use tagSelection field to select the latest release tag -func (p *pkgClient) newPackageRepository(repositoryName, repositoryImg, namespace string) (*kappipkg.PackageRepository, error) { - pkgr := &kappipkg.PackageRepository{ - TypeMeta: metav1.TypeMeta{APIVersion: packagedatamodel.DefaultAPIVersion, Kind: packagedatamodel.KindPackageRepository}, - ObjectMeta: metav1.ObjectMeta{Name: repositoryName, Namespace: namespace}, - Spec: kappipkg.PackageRepositorySpec{Fetch: &kappipkg.PackageRepositoryFetch{ - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{Image: repositoryImg}, - }}, - } - - _, tag, err := ParseRegistryImageURL(repositoryImg) - if err != nil { - return nil, errors.Wrap(err, "failed to parse OCI registry URL") - } - - if tag == "" { - pkgr.Spec.Fetch.ImgpkgBundle.TagSelection = &versions.VersionSelection{ - Semver: &versions.VersionSelectionSemver{ - Constraints: packagedatamodel.DefaultRepositoryImageTagConstraint, - }, - } - } - return pkgr, nil -} - -// validateRepositoryAdd ensures that another repository (with the same name or same OCI registry URL) does not already exist in the cluster -func (p *pkgClient) validateRepositoryAdd(repositoryName, repositoryImg, namespace string) error { - repositoryList, err := p.kappClient.ListPackageRepositories(namespace) - if err != nil { - return errors.Wrap(err, "failed to list package repositories") - } - - for _, repository := range repositoryList.Items { //nolint:gocritic - if repository.Name == repositoryName { - return fmt.Errorf("package repository name '%s' already exists in namespace '%s'", repositoryName, namespace) - } - - if repository.Spec.Fetch != nil && repository.Spec.Fetch.ImgpkgBundle != nil && - repository.Spec.Fetch.ImgpkgBundle.Image == repositoryImg { - return fmt.Errorf("package repository URL '%s' already exists in namespace '%s'", repositoryImg, namespace) - } - } - - return nil -} diff --git a/packageclients/pkg/packageclient/repository_add_test.go b/packageclients/pkg/packageclient/repository_add_test.go deleted file mode 100644 index c19f13e779..0000000000 --- a/packageclients/pkg/packageclient/repository_add_test.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - "fmt" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -const ( - testRepoName = "test-repo" - testRepoURL = "test.registry.vmware.com/test-repo" - testSecondRepoName = "test-repo-2" - testSecondRepoURL = "test.registry.vmware.com/test-repo-2:v1.1.0" - testThirdRepoName = "test-repo-3" - testThirdRepoURL = "test.registry.vmware.com/test-repo-3" -) - -var testRepository = &kappipkg.PackageRepository{ - TypeMeta: metav1.TypeMeta{Kind: packagedatamodel.KindPackageRepository}, - ObjectMeta: metav1.ObjectMeta{Name: testRepoName, Namespace: testNamespaceName}, - Spec: kappipkg.PackageRepositorySpec{ - Fetch: &kappipkg.PackageRepositoryFetch{ - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{Image: testRepoURL}, - }, - }} - -var _ = Describe("Add Repository", func() { - var ( - ctl PackageClient - crtCtl *fakes.CrtClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.RepositoryOptions{ - RepositoryName: testRepoName, - RepositoryURL: testRepoURL, - Namespace: testNamespaceName, - CreateRepository: false, - CreateNamespace: false, - } - options = opts - progress *packagedatamodel.PackageProgress - pkgRepositoryList = &kappipkg.PackageRepositoryList{ - Items: []kappipkg.PackageRepository{*testRepository}, - } - ) - - JustBeforeEach(func() { - progress = &packagedatamodel.PackageProgress{ - ProgressMsg: make(chan string, 10), - Err: make(chan error), - Done: make(chan struct{}), - } - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - go ctl.AddRepository(&options, progress, packagedatamodel.OperationTypeInstall) - err = testReceive(progress) - }) - - Context("failure in listing package repositories due to ListPackageRepositories API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListPackageRepositoriesReturns(nil, errors.New("failure in ListPackageRepositories")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in ListPackageRepositories")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in validating repository name", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("package repository name '%s' already exists in namespace '%s'", options.RepositoryName, options.Namespace))) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in validating repository OCI registry URL", func() { - BeforeEach(func() { - options.RepositoryName = testSecondRepoName - kappCtl = &fakes.KappClient{} - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("package repository URL '%s' already exists in namespace '%s'", options.RepositoryURL, options.Namespace))) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in namespace creation", func() { - BeforeEach(func() { - options.CreateNamespace = true - options.RepositoryName = testSecondRepoName - options.RepositoryURL = testSecondRepoURL - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.GetReturns(errors.New("failure in Get namespace")) - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - kappCtl.CreatePackageRepositoryReturns(nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in Get namespace")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in creating package repository due to CreatePackageRepository API error", func() { - BeforeEach(func() { - options.RepositoryName = testSecondRepoName - options.RepositoryURL = testSecondRepoURL - kappCtl = &fakes.KappClient{} - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - kappCtl.CreatePackageRepositoryReturns(errors.New("failure in CreatePackageRepository")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in CreatePackageRepository")) - }) - AfterEach(func() { options = opts }) - }) - - Context("falling back to update when trying to add an existing package repository (throwing non-critical error)", func() { - BeforeEach(func() { - options.Wait = true - options.RepositoryName = testRepoName - options.Wait = false - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - kappCtl.GetPackageRepositoryReturns(testRepository, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(packagedatamodel.ErrRepoAlreadyExists)) - }) - AfterEach(func() { - options = opts - options.RepositoryName = testRegistry - }) - }) - - Context("success in creating the package repository in not previously existing 'test-ns' namespace", func() { - BeforeEach(func() { - options.CreateNamespace = true - options.RepositoryName = testSecondRepoName - options.RepositoryURL = testSecondRepoURL - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.GetReturns(apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindNamespace}, testNamespaceName)) - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - kappCtl.CreatePackageRepositoryReturns(nil) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - testRepositoryAddPostValidation(kappCtl, &options, true) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in creating the package repository in the already existing 'test-ns' namespace", func() { - BeforeEach(func() { - options.CreateNamespace = true - options.RepositoryName = testSecondRepoName - options.RepositoryURL = testSecondRepoURL - kappCtl = &fakes.KappClient{} - crtCtl = &fakes.CrtClient{} - kappCtl.GetClientReturns(crtCtl) - crtCtl.GetReturns(nil) - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - kappCtl.CreatePackageRepositoryReturns(nil) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - testRepositoryAddPostValidation(kappCtl, &options, true) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in creating package repository with No tag in URL", func() { - BeforeEach(func() { - options.RepositoryName = testThirdRepoName - options.RepositoryURL = testThirdRepoURL - kappCtl = &fakes.KappClient{} - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - kappCtl.CreatePackageRepositoryReturns(nil) - }) - It(testSuccessMsg, func() { - Expect(err).ToNot(HaveOccurred()) - testRepositoryAddPostValidation(kappCtl, &options, false) - }) - AfterEach(func() { options = opts }) - }) -}) - -func testRepositoryAddPostValidation(kappCtl *fakes.KappClient, options *packagedatamodel.RepositoryOptions, hasTag bool) { - createRepoCallCnt := kappCtl.CreatePackageRepositoryCallCount() - Expect(createRepoCallCnt).To(BeNumerically("==", 1)) - pkgRepo := kappCtl.CreatePackageRepositoryArgsForCall(0) - Expect(pkgRepo.Name).Should(Equal(options.RepositoryName)) - Expect(pkgRepo.Namespace).Should(Equal(options.Namespace)) - Expect(pkgRepo.Spec.Fetch.ImgpkgBundle.Image).Should(Equal(options.RepositoryURL)) - if hasTag { - Expect(pkgRepo.Spec.Fetch.ImgpkgBundle.TagSelection).Should(BeNil()) - } else { - Expect(pkgRepo.Spec.Fetch.ImgpkgBundle.TagSelection).ShouldNot(Equal(nil)) - Expect(pkgRepo.Spec.Fetch.ImgpkgBundle.TagSelection.Semver.Constraints).Should(Equal(packagedatamodel.DefaultRepositoryImageTagConstraint)) - } -} diff --git a/packageclients/pkg/packageclient/repository_delete.go b/packageclients/pkg/packageclient/repository_delete.go deleted file mode 100644 index 2b8e680cbb..0000000000 --- a/packageclients/pkg/packageclient/repository_delete.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "fmt" - - "github.com/aunum/log" - "github.com/pkg/errors" - apierrors "k8s.io/apimachinery/pkg/api/errors" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -func (p *pkgClient) DeleteRepository(o *packagedatamodel.RepositoryOptions, progress *packagedatamodel.PackageProgress) { - p.deleteRepository(o, progress) -} - -func (p *pkgClient) DeleteRepositorySync(o *packagedatamodel.RepositoryOptions) error { - pp := newPackageProgress() - - go p.deleteRepository(o, pp) - - initialMsg := fmt.Sprintf("Deleting package repository '%s'", o.RepositoryName) - if err := DisplayProgress(initialMsg, pp); err != nil { - if err.Error() == packagedatamodel.ErrRepoNotExists { - log.Warningf("package repository '%s' does not exist in namespace '%s'", o.RepositoryName, o.Namespace) - return nil - } - return err - } - log.Infof("Deleted package repository '%s' from namespace '%s'", o.RepositoryName, o.Namespace) - return nil -} - -func (p *pkgClient) deleteRepository(o *packagedatamodel.RepositoryOptions, progress *packagedatamodel.PackageProgress) { - var ( - packageRepo *kappipkg.PackageRepository - err error - ) - - defer func() { - progressCleanup(err, progress) - }() - - progress.ProgressMsg <- fmt.Sprintf("Getting package repository '%s'", o.RepositoryName) - packageRepo, err = p.kappClient.GetPackageRepository(o.RepositoryName, o.Namespace) - if err != nil { - if apierrors.IsNotFound(err) { - err = &packagedatamodel.PackagePluginNonCriticalError{Reason: packagedatamodel.ErrRepoNotExists} - } - return - } - - progress.ProgressMsg <- "Deleting package repository resource" - err = p.kappClient.DeletePackageRepository(packageRepo) - if err != nil { - err = errors.Wrap(err, fmt.Sprintf("failed to delete package repository '%s' from namespace '%s'", o.RepositoryName, o.Namespace)) - } - - if o.Wait { - if err = p.waitForResourceDeletion(o.RepositoryName, o.Namespace, o.PollInterval, o.PollTimeout, progress.ProgressMsg, packagedatamodel.ResourceTypePackageRepository); err != nil { - return - } - } -} diff --git a/packageclients/pkg/packageclient/repository_delete_test.go b/packageclients/pkg/packageclient/repository_delete_test.go deleted file mode 100644 index 993e67cc87..0000000000 --- a/packageclients/pkg/packageclient/repository_delete_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime/schema" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var _ = Describe("Delete Repository", func() { - var ( - ctl PackageClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.RepositoryOptions{ - RepositoryName: testRepoName, - IsForceDelete: false, - } - options = opts - progress *packagedatamodel.PackageProgress - ) - - JustBeforeEach(func() { - progress = &packagedatamodel.PackageProgress{ - ProgressMsg: make(chan string, 10), - Err: make(chan error), - Done: make(chan struct{}), - } - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - go ctl.DeleteRepository(&options, progress) - err = testReceive(progress) - }) - - Context("failure in deleting the package repository due to DeletePackageRepository API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(testRepository, nil) - kappCtl.DeletePackageRepositoryReturns(errors.New("failure in DeletePackageRepository")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in DeletePackageRepository")) - }) - AfterEach(func() { options = opts }) - }) - - Context("not being able to get the package repository due to failure in GetPackageRepository", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(nil, errors.New("failure in GetPackageRepository")) - }) - It(testSuccessMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in GetPackageRepository")) - }) - AfterEach(func() { options = opts }) - }) - - Context("not being able to get the package repository due to non existent repository", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(nil, apierrors.NewNotFound(schema.GroupResource{Resource: packagedatamodel.KindPackageRepository}, testRepoName)) - }) - It(testSuccessMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(packagedatamodel.ErrRepoNotExists)) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in deleting the package repository", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(testRepository, nil) - kappCtl.DeletePackageRepositoryReturns(nil) - - }) - It(testSuccessMsg, func() { - Expect(err).ToNot(HaveOccurred()) - }) - AfterEach(func() { options = opts }) - }) -}) diff --git a/packageclients/pkg/packageclient/repository_get.go b/packageclients/pkg/packageclient/repository_get.go deleted file mode 100644 index 43ff835da8..0000000000 --- a/packageclients/pkg/packageclient/repository_get.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "fmt" - - "github.com/aunum/log" - "github.com/pkg/errors" - apierrors "k8s.io/apimachinery/pkg/api/errors" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -func (p *pkgClient) GetRepository(o *packagedatamodel.RepositoryOptions) (*kappipkg.PackageRepository, error) { - packageRepository, err := p.kappClient.GetPackageRepository(o.RepositoryName, o.Namespace) - if err != nil { - if apierrors.IsNotFound(err) { - log.Warningf("package repository '%s' does not exist in namespace '%s'", o.RepositoryName, o.Namespace) - return nil, nil - } - return nil, errors.Wrap(err, fmt.Sprintf("failed to find package repository '%s' in namespace '%s'", o.RepositoryName, o.Namespace)) - } - - return packageRepository, nil -} diff --git a/packageclients/pkg/packageclient/repository_get_test.go b/packageclients/pkg/packageclient/repository_get_test.go deleted file mode 100644 index e7c6d4885d..0000000000 --- a/packageclients/pkg/packageclient/repository_get_test.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var _ = Describe("Get Repository", func() { - var ( - ctl PackageClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.RepositoryOptions{ - RepositoryName: testRepoName, - Namespace: testNamespaceName, - } - options = opts - repository *kappipkg.PackageRepository - ) - - JustBeforeEach(func() { - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - repository, err = ctl.GetRepository(&options) - }) - - Context("failure in getting package repository due to GetPackageRepository API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(nil, errors.New("failure in GetPackageRepository")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in GetPackageRepository")) - Expect(repository).To(BeNil()) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in getting package repository", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(testRepository, nil) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - Expect(repository).NotTo(BeNil()) - Expect(repository).To(Equal(testRepository)) - }) - AfterEach(func() { options = opts }) - }) -}) diff --git a/packageclients/pkg/packageclient/repository_list.go b/packageclients/pkg/packageclient/repository_list.go deleted file mode 100644 index ecd8bf911a..0000000000 --- a/packageclients/pkg/packageclient/repository_list.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "github.com/pkg/errors" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -func (p *pkgClient) ListRepositories(o *packagedatamodel.RepositoryOptions) (*kappipkg.PackageRepositoryList, error) { - packageRepositoryList, err := p.kappClient.ListPackageRepositories(o.Namespace) - if err != nil { - return nil, errors.Wrap(err, "failed to list existing package repositories in the cluster") - } - - return packageRepositoryList, nil -} diff --git a/packageclients/pkg/packageclient/repository_list_test.go b/packageclients/pkg/packageclient/repository_list_test.go deleted file mode 100644 index ba3045750b..0000000000 --- a/packageclients/pkg/packageclient/repository_list_test.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var _ = Describe("List Repositories", func() { - var ( - ctl PackageClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.RepositoryOptions{ - Namespace: testNamespaceName, - AllNamespaces: false, - } - options = opts - repositories *kappipkg.PackageRepositoryList - repositoryList = &kappipkg.PackageRepositoryList{ - TypeMeta: metav1.TypeMeta{Kind: "PackageRepositoryList"}, - Items: []kappipkg.PackageRepository{*testRepository}, - } - ) - - JustBeforeEach(func() { - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - repositories, err = ctl.ListRepositories(&options) - }) - - Context("failure in listing package repositories due to ListPackageRepositories API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListPackageRepositoriesReturns(nil, errors.New("failure in ListPackageRepositories")) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in ListPackageRepositories")) - Expect(repositories).To(BeNil()) - }) - }) - - Context("success in listing package repositories", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.ListPackageRepositoriesReturns(repositoryList, nil) - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - }) - It(testSuccessMsg, func() { - Expect(err).NotTo(HaveOccurred()) - Expect(repositories).NotTo(BeNil()) - Expect(repositories).To(Equal(repositoryList)) - }) - }) -}) diff --git a/packageclients/pkg/packageclient/repository_update.go b/packageclients/pkg/packageclient/repository_update.go deleted file mode 100644 index 1e3f6b7a19..0000000000 --- a/packageclients/pkg/packageclient/repository_update.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "fmt" - - "github.com/aunum/log" - "github.com/pkg/errors" - k8serror "k8s.io/apimachinery/pkg/api/errors" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - versions "github.com/vmware-tanzu/carvel-vendir/pkg/vendir/versions/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -func (p *pkgClient) UpdateRepository(o *packagedatamodel.RepositoryOptions, progress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) { - p.updateRepository(o, progress, operationType) -} - -func (p *pkgClient) UpdateRepositorySync(o *packagedatamodel.RepositoryOptions, operationType packagedatamodel.OperationType) error { - pp := newPackageProgress() - - go p.updateRepository(o, pp, operationType) - - initialMsg := fmt.Sprintf("Updating package repository '%s'", o.RepositoryName) - if err := DisplayProgress(initialMsg, pp); err != nil { - if err.Error() == packagedatamodel.ErrRepoNotExists { - log.Warningf("package repository '%s' does not exist in namespace '%s'", o.RepositoryName, o.Namespace) - return nil - } - return err - } - log.Infof("Updated package repository '%s' in namespace '%s'", o.RepositoryName, o.Namespace) - return nil -} - -func (p *pkgClient) updateRepository(o *packagedatamodel.RepositoryOptions, progress *packagedatamodel.PackageProgress, operationType packagedatamodel.OperationType) { - var ( - existingRepository *kappipkg.PackageRepository - err error - tag string - ) - - defer func() { - if err != nil { - progress.Err <- err - } - if operationType == packagedatamodel.OperationTypeUpdate { - close(progress.ProgressMsg) - close(progress.Done) - } - }() - - progress.ProgressMsg <- fmt.Sprintf("Getting package repository '%s'", o.RepositoryName) - existingRepository, err = p.kappClient.GetPackageRepository(o.RepositoryName, o.Namespace) - if err != nil { - if k8serror.IsNotFound(err) { - err = nil - } else { - return - } - } - - if existingRepository != nil { - repositoryToUpdate := existingRepository.DeepCopy() - progress.ProgressMsg <- "Validating provided settings for the package repository" - if err = p.validateRepositoryUpdate(o.RepositoryName, o.RepositoryURL, o.Namespace); err != nil { - return - } - - _, tag, err = ParseRegistryImageURL(o.RepositoryURL) - if err != nil { - err = errors.Wrap(err, "failed to parse OCI registry URL") - return - } - - repositoryToUpdate.Spec = kappipkg.PackageRepositorySpec{ - Fetch: &kappipkg.PackageRepositoryFetch{ - ImgpkgBundle: &kappctrl.AppFetchImgpkgBundle{Image: o.RepositoryURL}, - }, - } - - if tag == "" { - repositoryToUpdate.Spec.Fetch.ImgpkgBundle.TagSelection = &versions.VersionSelection{ - Semver: &versions.VersionSelectionSemver{ - Constraints: packagedatamodel.DefaultRepositoryImageTagConstraint, - }, - } - } - - progress.ProgressMsg <- "Updating package repository resource" - if err = p.kappClient.UpdatePackageRepository(repositoryToUpdate); err != nil { - err = errors.Wrap(err, fmt.Sprintf("failed to update package repository '%s' in namespace '%s'", o.RepositoryName, o.Namespace)) - return - } - - if o.Wait { - if err = p.waitForResourceInstallation(o.RepositoryName, o.Namespace, o.PollInterval, o.PollTimeout, progress.ProgressMsg, packagedatamodel.ResourceTypePackageRepository); err != nil { - return - } - } - } else if o.CreateRepository { - p.AddRepository(o, progress, packagedatamodel.OperationTypeUpdate) - } else { - err = &packagedatamodel.PackagePluginNonCriticalError{Reason: packagedatamodel.ErrRepoNotExists} - } -} - -// validateRepositoryUpdate ensures that another repository (with the same OCI registry URL) does not already exist in the cluster -func (p *pkgClient) validateRepositoryUpdate(repositoryName, repositoryImg, namespace string) error { - repositoryList, err := p.kappClient.ListPackageRepositories(namespace) - if err != nil { - return errors.Wrap(err, "failed to list package repositories") - } - - for _, repository := range repositoryList.Items { //nolint:gocritic - // This stops the update validation to compare with itself - if repository.Name == repositoryName { - continue - } - - if repository.Spec.Fetch != nil && repository.Spec.Fetch.ImgpkgBundle != nil && - repository.Spec.Fetch.ImgpkgBundle.Image == repositoryImg { - return errors.New("repository with the same OCI registry URL already exists") - } - } - - return nil -} diff --git a/packageclients/pkg/packageclient/repository_update_test.go b/packageclients/pkg/packageclient/repository_update_test.go deleted file mode 100644 index 1fef6df13f..0000000000 --- a/packageclients/pkg/packageclient/repository_update_test.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient_test - -import ( - "fmt" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime/schema" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" -) - -var _ = Describe("Update Repository", func() { - var ( - ctl PackageClient - kappCtl *fakes.KappClient - err error - opts = packagedatamodel.RepositoryOptions{ - RepositoryName: testRepoName, - RepositoryURL: testRepoURL, - CreateRepository: false, - } - options = opts - progress *packagedatamodel.PackageProgress - pkgRepositoryList = &kappipkg.PackageRepositoryList{ - Items: []kappipkg.PackageRepository{*testRepository}, - } - ) - - JustBeforeEach(func() { - progress = &packagedatamodel.PackageProgress{ - ProgressMsg: make(chan string, 10), - Err: make(chan error), - Done: make(chan struct{}), - } - ctl, err = NewPackageClientWithKappClient(kappCtl) - Expect(err).NotTo(HaveOccurred()) - go ctl.UpdateRepository(&options, progress, packagedatamodel.OperationTypeUpdate) - err = testReceive(progress) - }) - - Context("failure in getting the package repository due to GetPackageRepository API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(nil, errors.New("failure in GetPackageRepository")) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in GetPackageRepository")) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in adding package repository as a repository with the same OCI registry URL already exists", func() { - BeforeEach(func() { - options.CreateRepository = true - options.RepositoryName = testSecondRepoName - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(nil, apierrors.NewNotFound(schema.GroupResource{Resource: "Repository"}, testSecondRepoName)) - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("package repository URL '%s' already exists in namespace '%s'", options.RepositoryURL, options.Namespace))) - }) - AfterEach(func() { options = opts }) - }) - - Context("failure in updating package repository due to UpdatePackageRepository API error", func() { - BeforeEach(func() { - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(testRepository, apierrors.NewNotFound(schema.GroupResource{Resource: "Repository"}, testRepoName)) - kappCtl.UpdatePackageRepositoryReturns(errors.New("failure in UpdatePackageRepository")) - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - }) - It(testFailureMsg, func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failure in UpdatePackageRepository")) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in adding package repository", func() { - BeforeEach(func() { - options.CreateRepository = true - options.RepositoryName = testSecondRepoName - options.RepositoryURL = testSecondRepoURL - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(nil, apierrors.NewNotFound(schema.GroupResource{Resource: "Repository"}, testSecondRepoName)) - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - }) - It(testSuccessMsg, func() { - Expect(err).ToNot(HaveOccurred()) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in updating package repository with tag", func() { - BeforeEach(func() { - options.RepositoryURL = testSecondRepoURL - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(testRepository, apierrors.NewNotFound(schema.GroupResource{Resource: "Repository"}, testRepoName)) - kappCtl.UpdatePackageRepositoryReturns(nil) - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - }) - It(testSuccessMsg, func() { - Expect(err).ToNot(HaveOccurred()) - updateRepoCallCnt := kappCtl.UpdatePackageRepositoryCallCount() - Expect(updateRepoCallCnt).To(BeNumerically("==", 1)) - pkgRepo := kappCtl.UpdatePackageRepositoryArgsForCall(0) - Expect(pkgRepo.Name).Should(Equal(options.RepositoryName)) - Expect(pkgRepo.Spec.Fetch.ImgpkgBundle.Image).Should(Equal(options.RepositoryURL)) - Expect(pkgRepo.Spec.Fetch.ImgpkgBundle.TagSelection).Should(BeNil()) - }) - AfterEach(func() { options = opts }) - }) - - Context("success in updating package repository without tag", func() { - BeforeEach(func() { - options.RepositoryURL = testThirdRepoURL - kappCtl = &fakes.KappClient{} - kappCtl.GetPackageRepositoryReturns(testRepository, apierrors.NewNotFound(schema.GroupResource{Resource: "Repository"}, testRepoName)) - kappCtl.UpdatePackageRepositoryReturns(nil) - kappCtl.ListPackageRepositoriesReturns(pkgRepositoryList, nil) - }) - It(testSuccessMsg, func() { - Expect(err).ToNot(HaveOccurred()) - updateRepoCallCnt := kappCtl.UpdatePackageRepositoryCallCount() - Expect(updateRepoCallCnt).To(BeNumerically("==", 1)) - pkgRepo := kappCtl.UpdatePackageRepositoryArgsForCall(0) - Expect(pkgRepo.Name).Should(Equal(options.RepositoryName)) - Expect(pkgRepo.Spec.Fetch.ImgpkgBundle.Image).Should(Equal(options.RepositoryURL)) - Expect(pkgRepo.Spec.Fetch.ImgpkgBundle.TagSelection).ShouldNot(Equal(nil)) - Expect(pkgRepo.Spec.Fetch.ImgpkgBundle.TagSelection.Semver.Constraints).Should(Equal(packagedatamodel.DefaultRepositoryImageTagConstraint)) - }) - AfterEach(func() { options = opts }) - }) -}) diff --git a/packageclients/pkg/packageclient/utils.go b/packageclients/pkg/packageclient/utils.go deleted file mode 100644 index b63cc0c892..0000000000 --- a/packageclients/pkg/packageclient/utils.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "encoding/json" - "fmt" - "strings" - - "github.com/getkin/kin-openapi/openapi3" - - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" -) - -// DataValueProperty holds the details of each property under Carvel package.spec.valuesSchema.openAPIv3.properties. -// The example of the schema could be found at: https://carvel.dev/kapp-controller/docs/latest/packaging/#package-1 -// From above example, we would have the following: -// -// DataValueProperty.Key = "namespace" -// DataValueProperty.Type = "string" -// DataValueProperty.Description = "Namespace where fluent-bit will be installed." -// DataValueProperty.Default = "fluent-bit" -type DataValueProperty struct { - Key string - Type interface{} - Description interface{} - Default interface{} -} - -// PackageValuesSchemaParser loads Carvel package values schema and extract property details -type PackageValuesSchemaParser struct { - Doc *openapi3.T - DataValueProperties []DataValueProperty - fieldPath []string // This is the internal variable to temporarily hold the path of a field when traversing on Doc. -} - -// NewValuesSchemaParser instantiate a new PackageValuesSchemaParser -func NewValuesSchemaParser(valuesSchema kapppkg.ValuesSchema) (*PackageValuesSchemaParser, error) { - loader := openapi3.NewLoader() - doc, loadErr := loader.LoadFromData(valuesSchema.OpenAPIv3.Raw) - if loadErr != nil { - return nil, loadErr - } - return &PackageValuesSchemaParser{Doc: doc, DataValueProperties: []DataValueProperty{}}, nil -} - -// ParseProperties parses the loaded doc and feed the details into []DataValueProperty -func (parser *PackageValuesSchemaParser) ParseProperties() ([]DataValueProperty, error) { - walkErr := parser.walkOnValueSchemaProperties(parser.Doc.Extensions) - if walkErr != nil { - // returning []DataValueProperty{} is to be safe when caller uses len() or for loop, nil in above case will cause - // panic unexpectedly. - return []DataValueProperty{}, walkErr - } - return parser.DataValueProperties, nil -} - -// walkOnValueSchemaProperties is a recursive function to walk on the given docMap and store the details of each property -// within res *[]DataValueProperty. Caller could use the returned *[]DataValueProperty for any purposes. -// Parameter docMap map[string]interface{} is a map representation of Carvel package.spec.valuesSchema.openAPIv3. From the example -// of https://carvel.dev/kapp-controller/docs/latest/packaging/#package-1, docMap should have `title`, `examples` and -// `properties` as top-level keys which might hold nested maps. -func (parser *PackageValuesSchemaParser) walkOnValueSchemaProperties(docMap map[string]interface{}) error { - var properties interface{} - var exist bool - // Base case one: if current level does not have properties field, we do not need to go deeper to look for - // the nested properties. - if properties, exist = docMap["properties"]; !exist && len(parser.fieldPath) > 0 { - parser.DataValueProperties = append(parser.DataValueProperties, DataValueProperty{ - Key: strings.Join(parser.fieldPath, "."), - Type: docMap["type"], - Description: docMap["description"], - Default: docMap["default"], - }) - return nil - } - - var propertiesMap map[string]interface{} - var err error - - // properties is an interface, it needs to be casted to proper type - switch t := properties.(type) { - case json.RawMessage: - err = json.Unmarshal(properties.(json.RawMessage), &propertiesMap) - if err != nil { - return err - } - case map[string]interface{}: - propertiesMap = properties.(map[string]interface{}) - default: - errMsg := fmt.Sprintf("unable to parse the value schema, the value of key named 'properties' has unsupported"+ - " type %v. Expected types are: [map[string]interface{}, json.RawMessage]", t) - return fmt.Errorf(errMsg) - } - - // Base case two: if current level does have properties field but that interface is an empty map, we do not need to - // look for nested properties. - if len(propertiesMap) == 0 { - parser.DataValueProperties = append(parser.DataValueProperties, DataValueProperty{ - Key: strings.Join(parser.fieldPath, "."), - Type: docMap["type"], - Description: docMap["description"], - Default: docMap["default"], - }) - return nil - } - - // Recursively look into nested map entries in order to load details of properties - for k, v := range propertiesMap { - if _, ok := v.(map[string]interface{}); ok { - parser.fieldPath = append(parser.fieldPath, k) - _ = parser.walkOnValueSchemaProperties(v.(map[string]interface{})) - parser.fieldPath = parser.fieldPath[:len(parser.fieldPath)-1] - } - } - return nil -} diff --git a/packageclients/pkg/packageclient/utils_test.go b/packageclients/pkg/packageclient/utils_test.go deleted file mode 100644 index 88517f831f..0000000000 --- a/packageclients/pkg/packageclient/utils_test.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packageclient - -import ( - "k8s.io/apimachinery/pkg/runtime" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" -) - -var rawInvalidDummyPackageSchema = ` -foo: - bar: xxx -` -var rawValidDummyPackageSchema = ` -title: external-dns.community.tanzu.vmware.com.0.8.0 values schema -examples: - - namespace: tanzu-system-service-discovery - deployment: - args: - - --source=service - - --txt-owner-id=k8s - - --domain-filter=k8s.example.org - - --namespace=tanzu-system-service-discovery - - --provider=rfc2136 - - --rfc2136-host=100.69.97.77 - - --rfc2136-port=53 - - --rfc2136-zone=k8s.example.org - - --rfc2136-tsig-secret=MTlQs3NNU= - - --rfc2136-tsig-secret-alg=hmac-sha256 - - --rfc2136-tsig-keyname=externaldns-key - - --rfc2136-tsig-axfr - env: [] - securityContext: {} - volumeMounts: [] - volumes: [] -properties: - namespace: - type: string - description: The namespace in which to deploy ExternalDNS. - default: external-dns - examples: - - external-dns - deployment: - type: object - description: Deployment related configuration - properties: - args: - type: array - description: | - List of arguments passed via command-line to external-dns. For - more guidance on configuration options for your desired DNS - provider, consult the ExternalDNS docs at - https://github.com/kubernetes-sigs/external-dns#running-externaldns - items: - type: string - env: - type: array - description: "List of environment variables to set in the external-dns container." - items: - $ref: "#/definitions/io.k8s.api.core.v1.EnvVar" - securityContext: - description: "SecurityContext defines the security options the external-dns container should be run with. More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/" - $ref: "#/definitions/io.k8s.api.core.v1.SecurityContext" - volumeMounts: - type: array - description: "Pod volumes to mount into the external-dns container's filesystem." - items: - $ref: "#/definitions/io.k8s.api.core.v1.VolumeMount" - volumes: - type: array - description: "List of volumes that can be mounted by containers belonging to the external-dns pod. More info: https://kubernetes.io/docs/concepts/storage/volumes" - items: - $ref: "#/definitions/io.k8s.api.core.v1.Volume" -` - -var _ = Describe("Test utils", func() { - Context("parsing package values schema", func() { - var ( - valuesSchema kapppkg.ValuesSchema - parser *PackageValuesSchemaParser - err error - ) - It("should not have error if values schema is valid", func() { - valuesSchema = kapppkg.ValuesSchema{ - OpenAPIv3: runtime.RawExtension{ - Raw: []byte(rawValidDummyPackageSchema), - }, - } - parser, err = NewValuesSchemaParser(valuesSchema) - Expect(err).NotTo(HaveOccurred()) - parsedProperties, err := parser.ParseProperties() - Expect(err).NotTo(HaveOccurred()) - Expect(len(parsedProperties)).ShouldNot(Equal(0)) - Expect(len(parser.DataValueProperties)).ShouldNot(Equal(0)) - }) - It("should have error if values schema is invalid", func() { - valuesSchema = kapppkg.ValuesSchema{ - OpenAPIv3: runtime.RawExtension{ - Raw: []byte(rawInvalidDummyPackageSchema), - }, - } - parser, err = NewValuesSchemaParser(valuesSchema) - Expect(err).NotTo(HaveOccurred()) - parsedProperties, err := parser.ParseProperties() - Expect(err).To(HaveOccurred()) - Expect(len(parsedProperties)).Should(Equal(0)) - Expect(len(parser.DataValueProperties)).Should(Equal(0)) - }) - }) -}) diff --git a/packageclients/pkg/packagedatamodel/constants.go b/packageclients/pkg/packagedatamodel/constants.go deleted file mode 100644 index 3cc827274f..0000000000 --- a/packageclients/pkg/packagedatamodel/constants.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint -package packagedatamodel - -import "time" - -const ( - ClusterRoleBindingName = "%s-%s-cluster-rolebinding" - ClusterRoleName = "%s-%s-cluster-role" - DataPackagingAPIName = "data.packaging.carvel.dev" - DefaultAPIVersion = "install.package.carvel.dev/v1alpha1" - DefaultNamespace = "default" - DefaultPollInterval = 1 * time.Second - DefaultPollTimeout = 15 * time.Minute - DefaultRepositoryImageTag = "latest" - DefaultRepositoryImageTagConstraint = ">0.0.0" - ErrPackageNotInstalled = "package install does not exist in the namespace" - ErrRepoNotExists = "package repository does not exist in the namespace" - ErrPackageAlreadyExists = "package install already exists in the namespace" - ErrRepoAlreadyExists = "package repository already exists in the namespace" - KindClusterRole = "ClusterRole" - KindClusterRoleBinding = "ClusterRoleBinding" - KindNamespace = "Namespace" - KindPackageInstall = "PackageInstall" - KindPackageRepository = "PackageRepository" - KindSecret = "Secret" - KindSecretExport = "SecretExport" - KindServiceAccount = "ServiceAccount" - PackagingAPINotAvailable = "package plugin can not be used as '%s/%s' API is not available in the cluster" - PackagingAPIName = "packaging.carvel.dev" - PackagingAPIVersion = "v1alpha1" - SecretGenAPINotAvailable = "secret plugin can not be used as '%s/%s' API is not available in the cluster" - SecretGenAPIName = "secretgen.carvel.dev" - SecretGenAPIVersion = "v1alpha1" - SecretName = "%s-%s-values" - ServiceAccountName = "%s-%s-sa" - ShortDescriptionMaxLength = 20 - TanzuPkgPluginAnnotation = "tkg.tanzu.vmware.com/tanzu-package" - TanzuPkgPluginPrefix = "tanzu-package" - TanzuPkgPluginResource = "%s-%s" - YamlSeparator = "---" -) - -const ( - // DefaultQPS is the default maximum query per second for the rest config - DefaultQPS = 200 - // DefaultBurst is the default maximum burst for throttle for the rest config - DefaultBurst = 200 - // DefaultClusterPrefix is TKG cluster prefix - DefaultClusterPrefix = "tkg-cli-" - // DefaultLogLevel is the default log level - DefaultLogLevel = 6 -) diff --git a/packageclients/pkg/packagedatamodel/package.go b/packageclients/pkg/packagedatamodel/package.go deleted file mode 100644 index bc809e3c0c..0000000000 --- a/packageclients/pkg/packagedatamodel/package.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packagedatamodel - -import "time" - -// PackageOptions includes fields for package operations -type PackageOptions struct { - Available string - ClusterRoleName string - ClusterRoleBindingName string - Namespace string - PackageName string - PkgInstallName string - SecretName string - ServiceAccountName string - ValuesFile string - Version string - PollInterval time.Duration - PollTimeout time.Duration - AllNamespaces bool - CreateNamespace bool - Install bool - Wait bool - SkipPrompt bool - Labels map[string]string -} - -// NewPackageOptions instantiates PackageOptions -func NewPackageOptions() *PackageOptions { - return &PackageOptions{} -} diff --git a/packageclients/pkg/packagedatamodel/package_available.go b/packageclients/pkg/packagedatamodel/package_available.go deleted file mode 100644 index df59675282..0000000000 --- a/packageclients/pkg/packagedatamodel/package_available.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packagedatamodel - -// PackageAvailableOptions includes fields for package available -type PackageAvailableOptions struct { - Namespace string - PackageName string - AllNamespaces bool - ValuesSchema bool - GenerateDefaultValuesFile bool -} - -// NewPackageAvailableOptions instantiates PackageAvailableOptions -func NewPackageAvailableOptions() *PackageAvailableOptions { - return &PackageAvailableOptions{} -} diff --git a/packageclients/pkg/packagedatamodel/progress.go b/packageclients/pkg/packagedatamodel/progress.go deleted file mode 100644 index 5c6e36a63c..0000000000 --- a/packageclients/pkg/packagedatamodel/progress.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packagedatamodel - -// PackageProgress includes channels for sending messages -type PackageProgress struct { - // Use buffered chan so that sending goroutine doesn't block - ProgressMsg chan string - // Err chan for reporting errors - Err chan error - // Empty struct for signaling that goroutine is finished - Done chan struct{} -} diff --git a/packageclients/pkg/packagedatamodel/repository.go b/packageclients/pkg/packagedatamodel/repository.go deleted file mode 100644 index 8dba3f7deb..0000000000 --- a/packageclients/pkg/packagedatamodel/repository.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packagedatamodel - -import "time" - -// RepositoryOptions includes fields for repository operations -type RepositoryOptions struct { - Namespace string - RepositoryName string - RepositoryURL string - PollInterval time.Duration - PollTimeout time.Duration - AllNamespaces bool - CreateRepository bool - CreateNamespace bool - IsForceDelete bool - SkipPrompt bool - Wait bool -} - -// NewRepositoryOptions instantiates RepositoryOptions -func NewRepositoryOptions() *RepositoryOptions { - return &RepositoryOptions{} -} diff --git a/packageclients/pkg/packagedatamodel/secret.go b/packageclients/pkg/packagedatamodel/secret.go deleted file mode 100644 index 12aedf76e2..0000000000 --- a/packageclients/pkg/packagedatamodel/secret.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package packagedatamodel - -// RegistrySecretOptions includes fields for registry image pull secret operations -type RegistrySecretOptions struct { - AllNamespaces bool - ExportToAllNamespaces bool - PasswordStdin bool - SkipPrompt bool - Export TypeBoolPtr - Namespace string - Password string - PasswordEnvVar string - PasswordFile string - PasswordInput string - Server string - SecretName string - Username string -} - -// NewRegistrySecretOptions instantiates RegistrySecretOptions -func NewRegistrySecretOptions() *RegistrySecretOptions { - return &RegistrySecretOptions{} -} diff --git a/packageclients/pkg/packagedatamodel/types.go b/packageclients/pkg/packagedatamodel/types.go deleted file mode 100644 index c6f8c2995a..0000000000 --- a/packageclients/pkg/packagedatamodel/types.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint -package packagedatamodel - -import ( - "fmt" -) - -// PackagePluginNonCriticalError is used for non critical package plugin errors which should be treated more like warnings -type PackagePluginNonCriticalError struct { - Reason string -} - -func (e *PackagePluginNonCriticalError) Error() string { return e.Reason } - -type ResourceType int - -const ( - ResourceTypePackageInstall ResourceType = iota - ResourceTypePackageRepository -) - -func (r ResourceType) String() string { - switch r { - case ResourceTypePackageInstall: - return "PackageInstall" - case ResourceTypePackageRepository: - return "PackageRepository" - } - return "" -} - -type OperationType int - -const ( - OperationTypeInstall OperationType = iota - OperationTypeUpdate -) - -type PkgPluginResourceCreationStatus struct { - IsServiceAccountCreated bool - IsSecretCreated bool -} - -// TypeBoolPtr satisfies Value interface defined in "https://github.com/spf13/pflag/blob/master/flag.go" -type TypeBoolPtr struct { - ExportToAllNamespaces *bool -} - -// Type returns the default type for a TypeBoolPtr variable -func (v *TypeBoolPtr) Type() string { - return "" -} - -// Set sets the TypeBoolPtr variable based on the string argument -func (v *TypeBoolPtr) Set(val string) error { - f := false - t := true - if val == "true" || val == "True" { - v.ExportToAllNamespaces = &t - } else if val == "false" || val == "False" { - v.ExportToAllNamespaces = &f - } else if val != "" { - return fmt.Errorf("invalid argument '%s'", val) - } - - return nil -} - -// String returns the string representation of a TypeBoolPtr variable -func (v *TypeBoolPtr) String() string { - if v.ExportToAllNamespaces != nil { - return fmt.Sprint(*v.ExportToAllNamespaces) - } - return "" -} diff --git a/packages/addons-manager/Makefile b/packages/addons-manager/Makefile deleted file mode 100644 index 047b729714..0000000000 --- a/packages/addons-manager/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/addons-manager/README.md b/packages/addons-manager/README.md deleted file mode 100644 index 94aa5affb8..0000000000 --- a/packages/addons-manager/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# addons-manager Package - -Addons-manager generates addon secrets which contain the configurations for addons based on TKR/BOM, KubeadmControlPlane and CLI inputs provided during cluster creation. -It then creates these PackageInstall CRs on management and workload clusters which then get reconciled by a local kapp-controller. - -## Components - -Client Library -Addon Controller - -## Usage Example - -The following is a basic guide for getting started with addons-manager. - -Management cluster - -1. “tanzu management-cluster create” to create a management cluster. - -2. tanzu-addons-controller-manager will be deployed when cluster is being created diff --git a/packages/addons-manager/bundle/config/overlays/feature-gate-clusterbootstrap.yaml b/packages/addons-manager/bundle/config/overlays/feature-gate-clusterbootstrap.yaml deleted file mode 100644 index 264b82ad3d..0000000000 --- a/packages/addons-manager/bundle/config/overlays/feature-gate-clusterbootstrap.yaml +++ /dev/null @@ -1,21 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:template", "template") -#@ load("/upstream/webhook-manifests.lib.yaml", "webhook_manifests") - -#@ antreaconfigscrd = overlay.subset({"kind": "CustomResourceDefinition", "metadata": {"name": "antreaconfigs.cni.tanzu.vmware.com"}}) -#@ calicoconfigscrd = overlay.subset({"kind": "CustomResourceDefinition", "metadata": {"name": "calicoconfigs.cni.tanzu.vmware.com"}}) -#@ clusterbootstrapscrd = overlay.subset({"kind": "CustomResourceDefinition", "metadata": {"name": "clusterbootstraps.run.tanzu.vmware.com"}}) -#@ clusterbootstraptemplatescrd = overlay.subset({"kind": "CustomResourceDefinition", "metadata": {"name": "clusterbootstraptemplates.run.tanzu.vmware.com"}}) -#@ kappcontrollerconfigscrd = overlay.subset({"kind": "CustomResourceDefinition", "metadata": {"name": "kappcontrollerconfigs.run.tanzu.vmware.com"}}) -#@ vspherecpiconfigscrd = overlay.subset({"kind": "CustomResourceDefinition", "metadata": {"name": "vspherecpiconfigs.cpi.tanzu.vmware.com"}}) -#@ vspherecsiconfigscrd = overlay.subset({"kind": "CustomResourceDefinition", "metadata": {"name": "vspherecsiconfigs.csi.tanzu.vmware.com"}}) - -#@ if data.values.tanzuAddonsManager.featureGates.clusterBootstrapController: ---- #@ template.replace(webhook_manifests()) -#@ end - -#@overlay/match by=overlay.or_op(antreaconfigscrd, calicoconfigscrd, clusterbootstrapscrd, clusterbootstraptemplatescrd, kappcontrollerconfigscrd, vspherecpiconfigscrd, vspherecsiconfigscrd), expects=7 -#@ if/end not data.values.tanzuAddonsManager.featureGates.clusterBootstrapController: -#@overlay/remove - diff --git a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cni.tanzu.vmware.com_antreaconfigs.yaml b/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cni.tanzu.vmware.com_antreaconfigs.yaml deleted file mode 100644 index 05820eed4f..0000000000 --- a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cni.tanzu.vmware.com_antreaconfigs.yaml +++ /dev/null @@ -1,632 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: antreaconfigs.cni.tanzu.vmware.com -spec: - group: cni.tanzu.vmware.com - names: - kind: AntreaConfig - listKind: AntreaConfigList - plural: antreaconfigs - shortNames: - - antreaconf - singular: antreaconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The traffic encapsulation mode. One of the following options => - encap, noEncap, hybrid, networkPolicyOnly - jsonPath: .spec.antrea.config.trafficEncapMode - name: TrafficEncapMode - type: string - - description: Default MTU to use for the host gateway interface and the network - interface of each Pod. If omitted, antrea-agent will discover the MTU of the - Node's primary interface - jsonPath: .spec.antrea.config.defaultMTU - name: DefaultMTU - type: string - - description: Flag to enable/disable antrea proxy - jsonPath: .spec.antrea.config.featureGates.AntreaProxy - name: AntreaProxy - type: string - - description: Flag to enable/disable antrea policy - jsonPath: .spec.antrea.config.featureGates.AntreaPolicy - name: AntreaPolicy - type: string - - description: Name of the antrea data values secret - jsonPath: .status.secretRef - name: SecretRef - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: AntreaConfig is the Schema for the antreaconfigs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AntreaConfigSpec defines the desired state of AntreaConfig - properties: - antrea: - properties: - config: - properties: - antreaProxy: - description: Specifies AntreaProxy related configuration. - properties: - nodePortAddresses: - items: - type: string - type: array - proxyAll: - type: boolean - proxyLoadBalancerIPs: - type: boolean - skipServices: - items: - type: string - type: array - type: object - defaultMTU: - default: "" - description: Default MTU to use for the host gateway interface - and the network interface of each Pod. If omitted, antrea-agent - will discover the MTU of the Node's primary interface - type: string - disableTXChecksumOffload: - default: false - description: Disable TX checksum offloading for container - network interfaces - type: boolean - disableUdpTunnelOffload: - default: false - description: Disable UDP tunnel offload feature on default - NIC - type: boolean - dnsServerOverride: - default: "" - description: Provide the address of DNS server, to override - the kube-dns service - type: string - egress: - description: Specifies Egress related configuration. - properties: - exceptCIDRs: - items: - type: string - type: array - type: object - enableBridgingMode: - default: false - description: Enable bridging mode of Pod network on Nodes - type: boolean - enableUsageReporting: - default: false - description: Enable usage reporting (telemetry) to VMware. - type: boolean - featureGates: - description: FeatureGates is a map of feature names to flags - that enable or disable experimental features - properties: - AntreaIPAM: - default: false - description: Flag to enable/disable antrea IPAM - type: boolean - AntreaPolicy: - default: true - description: Flag to enable/disable antrea policy - type: boolean - AntreaProxy: - default: true - description: Flag to enable/disable antrea proxy - type: boolean - AntreaTraceflow: - default: true - description: Flag to enable/disable antrea traceflow - type: boolean - Egress: - default: true - description: Flag to enable/disable SNAT IPs of Pod egress - traffic - type: boolean - EndpointSlice: - default: false - description: Flag to enable/disable EndpointSlice support - in AntreaProxy. If AntreaProxy is not enabled, this - flag will not take effect - type: boolean - FlowExporter: - default: false - description: Flag to enable/disable flow exporter - type: boolean - Multicast: - default: false - description: Flag to enable/disable multicast - type: boolean - Multicluster: - default: false - description: Enable Antrea Multi-cluster Gateway to support - cross-cluster traffic. - type: boolean - NetworkPolicyStats: - default: false - description: Flag to enable/disable network policy stats - type: boolean - NodePortLocal: - default: true - description: Flag to enable/disable NodePortLocal feature - to make the pods reachable externally through NodePort - type: boolean - SecondaryNetwork: - default: false - description: Enable support for provisioning secondary - network interfaces for Pods (using Pod annotations). - type: boolean - ServiceExternalIP: - default: false - description: Flag to enable/disable service external IP - type: boolean - TrafficControl: - default: false - description: Enable mirroring or redirecting the traffic - Pods send or receive. - type: boolean - type: object - flowExporter: - description: Specifies FlowExporter related configuration. - properties: - activeFlowTimeout: - type: string - collectorAddress: - type: string - idleFlowTimeout: - type: string - pollInterval: - type: string - type: object - kubeAPIServerOverride: - description: Provide the address of Kubernetes apiserver, - to override any value provided in kubeconfig or InClusterConfig. - type: string - multicast: - description: Multicast related configuration. - properties: - igmpQueryInterval: - type: string - type: object - multicastInterfaces: - description: The names of the interfaces on Nodes that are - used to forward multicast traffic. - items: - type: string - type: array - multicluster: - description: MultiCluster realted configuration. - properties: - enable: - type: boolean - namespace: - type: string - type: object - noSNAT: - default: false - description: Flag to enable/disable SNAT for the egress traffic - from a Pod to the external network - type: boolean - nodePortLocal: - description: Specifies NodePortLocal related configuration. - properties: - enabled: - type: boolean - portRange: - type: string - type: object - serviceCIDR: - description: ClusterIP CIDR range for Services. - type: string - tlsCipherSuites: - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - description: List of allowed cipher suites. If omitted, the - default Go Cipher Suites will be used - type: string - trafficEncapMode: - default: encap - description: The traffic encapsulation mode. One of the following - options => encap, noEncap, hybrid, networkPolicyOnly - enum: - - encap - - noEncap - - hybrid - - networkPolicyOnly - type: string - trafficEncryptionMode: - description: Determines how tunnel traffic is encrypted. One - of the following options =:> none, ipsec, wireguard - type: string - transportInterface: - description: The name of the interface on Node which is used - for tunneling or routing. - type: string - transportInterfaceCIDRs: - description: The network CIDRs of the interface on Node which - is used for tunneling or routing. - items: - type: string - type: array - tunnelType: - description: Tunnel protocols used for encapsulating traffic - across Nodes. One of the following options =:> geneve, vxlan, - gre, stt - type: string - wireGuard: - description: Specifies WireGuard related configuration. - properties: - port: - type: integer - type: object - type: object - type: object - type: object - status: - description: AntreaConfigStatus defines the observed state of AntreaConfig - properties: - secretRef: - description: Reference to the data value secret created by controller - type: string - type: object - required: - - spec - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: The traffic encapsulation mode. One of the following options => - encap, noEncap, hybrid, networkPolicyOnly - jsonPath: .spec.antrea.config.trafficEncapMode - name: TrafficEncapMode - type: string - - description: Default MTU to use for the host gateway interface and the network - interface of each Pod. If omitted, antrea-agent will discover the MTU of the - Node's primary interface - jsonPath: .spec.antrea.config.defaultMTU - name: DefaultMTU - type: string - - description: Flag to enable/disable antrea proxy - jsonPath: .spec.antrea.config.featureGates.AntreaProxy - name: AntreaProxy - type: string - - description: Flag to enable/disable antrea policy - jsonPath: .spec.antrea.config.featureGates.AntreaPolicy - name: AntreaPolicy - type: string - - description: Name of the antrea data values secret - jsonPath: .status.secretRef - name: SecretRef - type: string - name: v1alpha2 - schema: - openAPIV3Schema: - description: AntreaConfig is the Schema for the antreaconfigs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AntreaConfigSpec defines the desired state of AntreaConfig - properties: - antrea: - properties: - config: - properties: - antreaProxy: - description: Specifies AntreaProxy related configuration. - properties: - nodePortAddresses: - items: - type: string - type: array - proxyAll: - type: boolean - proxyLoadBalancerIPs: - type: boolean - skipServices: - items: - type: string - type: array - type: object - defaultMTU: - default: "" - description: Default MTU to use for the host gateway interface - and the network interface of each Pod. If omitted, antrea-agent - will discover the MTU of the Node's primary interface - type: string - disableTXChecksumOffload: - default: false - description: Disable TX checksum offloading for container - network interfaces - type: boolean - disableUdpTunnelOffload: - default: false - description: Disable UDP tunnel offload feature on default - NIC - type: boolean - dnsServerOverride: - default: "" - description: Provide the address of DNS server, to override - the kube-dns service - type: string - egress: - description: Specifies Egress related configuration. - properties: - exceptCIDRs: - items: - type: string - type: array - type: object - enableBridgingMode: - default: false - description: Enable bridging mode of Pod network on Nodes - type: boolean - enableUsageReporting: - default: false - description: Enable usage reporting (telemetry) to VMware. - type: boolean - featureGates: - description: FeatureGates is a map of feature names to flags - that enable or disable experimental features - properties: - AntreaIPAM: - default: false - description: Flag to enable/disable antrea IPAM - type: boolean - AntreaPolicy: - default: true - description: Flag to enable/disable antrea policy - type: boolean - AntreaProxy: - default: true - description: Flag to enable/disable antrea proxy - type: boolean - AntreaTraceflow: - default: true - description: Flag to enable/disable antrea traceflow - type: boolean - Egress: - default: true - description: Flag to enable/disable SNAT IPs of Pod egress - traffic - type: boolean - EndpointSlice: - default: false - description: Flag to enable/disable EndpointSlice support - in AntreaProxy. If AntreaProxy is not enabled, this - flag will not take effect - type: boolean - FlowExporter: - default: false - description: Flag to enable/disable flow exporter - type: boolean - Multicast: - default: false - description: Flag to enable/disable multicast - type: boolean - Multicluster: - default: false - description: Enable Antrea Multi-cluster Gateway to support - cross-cluster traffic. - type: boolean - NetworkPolicyStats: - default: false - description: Flag to enable/disable network policy stats - type: boolean - NodePortLocal: - default: true - description: Flag to enable/disable NodePortLocal feature - to make the pods reachable externally through NodePort - type: boolean - SecondaryNetwork: - default: false - description: Enable support for provisioning secondary - network interfaces for Pods (using Pod annotations). - type: boolean - ServiceExternalIP: - default: false - description: Flag to enable/disable service external IP - type: boolean - TrafficControl: - default: false - description: Enable mirroring or redirecting the traffic - Pods send or receive. - type: boolean - type: object - flowExporter: - description: Specifies FlowExporter related configuration. - properties: - activeFlowTimeout: - type: string - collectorAddress: - type: string - idleFlowTimeout: - type: string - pollInterval: - type: string - type: object - kubeAPIServerOverride: - description: Provide the address of Kubernetes apiserver, - to override any value provided in kubeconfig or InClusterConfig. - type: string - multicast: - description: Multicast related configuration. - properties: - igmpQueryInterval: - type: string - type: object - multicastInterfaces: - description: The names of the interfaces on Nodes that are - used to forward multicast traffic. - items: - type: string - type: array - multicluster: - description: MultiCluster realted configuration. - properties: - enable: - type: boolean - namespace: - type: string - type: object - noSNAT: - default: false - description: Flag to enable/disable SNAT for the egress traffic - from a Pod to the external network - type: boolean - nodePortLocal: - description: Specifies NodePortLocal related configuration. - properties: - enabled: - type: boolean - portRange: - type: string - type: object - serviceCIDR: - description: ClusterIP CIDR range for Services. - type: string - tlsCipherSuites: - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - description: List of allowed cipher suites. If omitted, the - default Go Cipher Suites will be used - type: string - trafficEncapMode: - default: encap - description: The traffic encapsulation mode. One of the following - options => encap, noEncap, hybrid, networkPolicyOnly - enum: - - encap - - noEncap - - hybrid - - networkPolicyOnly - type: string - trafficEncryptionMode: - description: Determines how tunnel traffic is encrypted. One - of the following options =:> none, ipsec, wireguard - type: string - transportInterface: - description: The name of the interface on Node which is used - for tunneling or routing. - type: string - transportInterfaceCIDRs: - description: The network CIDRs of the interface on Node which - is used for tunneling or routing. - items: - type: string - type: array - tunnelType: - description: Tunnel protocols used for encapsulating traffic - across Nodes. One of the following options =:> geneve, vxlan, - gre, stt - type: string - wireGuard: - description: Specifies WireGuard related configuration. - properties: - port: - type: integer - type: object - type: object - type: object - antreaNsx: - description: AntreaNsx defines nsxt adapter related configurations - properties: - bootstrapFrom: - description: BootstrapFrom either providerRef or inline configs - properties: - inline: - description: Inline is used with TKGm, user need to fill in - manually - properties: - clusterName: - description: ClusterName is the name for the created cluster - type: string - nsxCertName: - description: NsxCertName is cert files to access nsx manager - type: string - nsxManagers: - description: NsxManagers is the list for nsx managers, - it can be either IP address or domain name - items: - type: string - type: array - type: object - providerRef: - description: ProviderRef is used with uTKG, which will be - filled by uTKG Addon Controller - properties: - apigroup: - description: Api version for nsxServiceAccount, its value - is "nsx.vmware.com/v1alpha1" now - type: string - kind: - description: Kind is the kind for crd, here its value - is NsxServiceAccount - type: string - name: - description: Name is the name for NsxServiceAccount - type: string - type: object - type: object - config: - description: Config is configuration for nsxt adapter - properties: - infraType: - description: InfraType is the type for infrastructure, so - far it is vSphere, VMC, AWS, Azure - type: string - type: object - enable: - default: false - description: Enable indicates whether nsxt adapter shall be enabled - in the cluster - type: boolean - type: object - type: object - status: - description: AntreaConfigStatus defines the observed state of AntreaConfig - properties: - message: - description: Message to indicate failure reason - type: string - secretRef: - description: Reference to the data value secret created by controller - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cni.tanzu.vmware.com_calicoconfigs.yaml b/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cni.tanzu.vmware.com_calicoconfigs.yaml deleted file mode 100644 index 57d7c1704b..0000000000 --- a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cni.tanzu.vmware.com_calicoconfigs.yaml +++ /dev/null @@ -1,88 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: calicoconfigs.cni.tanzu.vmware.com -spec: - group: cni.tanzu.vmware.com - names: - kind: CalicoConfig - listKind: CalicoConfigList - plural: calicoconfigs - shortNames: - - calicoconf - singular: calicoconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Maximum transmission unit setting. '0' as default means MTU will - be auto detected - jsonPath: .spec.calico.config.vethMTU - name: VethMTU - type: integer - - description: Name of the Calico data values secret - jsonPath: .status.secretRef - name: SecretRef - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: CalicoConfig is the Schema for the calicoconfigs API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: CalicoConfigSpec defines the desired state of CalicoConfig. - properties: - calico: - description: Calico stores the configurations for Calico. - properties: - config: - description: CalicoConfigDataValue contains the specific configurations - for the Calico package. - properties: - skipCNIBinaries: - default: false - description: SkipCNIBinaries allows to skip the cni plugin - binaries installation. Default to false. Set to true for - providers who already installed cni plugin binaries in their - OVAs and do not want Calico to overwrite them. - type: boolean - vethMTU: - default: 0 - description: VethMTU defines maximum transmission unit. "0" - as default means MTU will be auto detected. - format: int64 - minimum: 0 - type: integer - type: object - type: object - type: object - status: - description: CalicoConfigStatus defines the observed state of CalicoConfig. - properties: - secretRef: - description: SecretRef is the name of the data value secret created - by calico controller. - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cpi.tanzu.vmware.com_kubevipcpiconfigs.yaml b/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cpi.tanzu.vmware.com_kubevipcpiconfigs.yaml deleted file mode 100644 index 6b0ee49d04..0000000000 --- a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cpi.tanzu.vmware.com_kubevipcpiconfigs.yaml +++ /dev/null @@ -1,67 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.8.0 - creationTimestamp: null - name: kubevipcpiconfigs.cpi.tanzu.vmware.com -spec: - group: cpi.tanzu.vmware.com - names: - kind: KubevipCPIConfig - listKind: KubevipCPIConfigList - plural: kubevipcpiconfigs - singular: kubevipcpiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: KubevipCPIConfig is the Schema for the kubevipcpiconfigs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubevipCPIConfigSpec defines the desired state of KubevipCPIConfig - properties: - loadbalancerCIDRs: - description: loadbalancerCIDRs is a list of comma separated - cidrs will be used to allocate IP for external load balancer. For - example 192.168.0.200/29,192.168.1.200/29 - type: string - loadbalancerIPRanges: - description: loadbalancerIPRanges is a list of comma separated IP - ranges will be used to allocate IP for external load balancer. For - example 192.168.0.10-192.168.0.11,192.168.0.10-192.168.0.13 - type: string - type: object - status: - description: KubevipCPIConfigStatus defines the observed state of KubevipCPIConfig - properties: - secretRef: - description: Name of the secret created by kubevip cloudprovider config - controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cpi.tanzu.vmware.com_oraclecpiconfigs.yaml b/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cpi.tanzu.vmware.com_oraclecpiconfigs.yaml deleted file mode 100644 index 47166a51a0..0000000000 --- a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cpi.tanzu.vmware.com_oraclecpiconfigs.yaml +++ /dev/null @@ -1,148 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.8.0 - creationTimestamp: null - name: oraclecpiconfigs.cpi.tanzu.vmware.com -spec: - group: cpi.tanzu.vmware.com - names: - kind: OracleCPIConfig - listKind: OracleCPIConfigList - plural: oraclecpiconfigs - shortNames: - - ocicpicfgs - singular: oraclecpiconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The name of the oraclecpiconfigs - jsonPath: .spec.namespace - name: Name - type: string - - description: Name of the kapp-controller data values secret - jsonPath: .status.secretRef - name: Secret - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: OracleCPIConfig is the Schema for the OracleCPIConfig API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OracleCPIConfigSpec defines the desired state of OracleCPIConfig - properties: - compartment: - description: Compartment configures the Oracle Cloud compartment within - which the cluster resides. - type: string - loadBalancer: - description: LoadBalancer configures the load balancer provisioning - for the Oracle CPI - properties: - securityListManagementMode: - default: All - description: 'SecurityListManagementMode configures how security - lists are managed by the CCM. If you choose to have security - lists managed by the CCM, ensure you have setup the following - additional OCI policy: Allow dynamic-group [your dynamic group - name] to manage security-lists in compartment [your compartment - name] "All" (default): Manage all required security list rules - for load balancer services. "Frontend": Manage only security - list rules for ingress to the load balancer. Requires that the - user has setup a rule that allows inbound traffic to the appropriate - ports for kube proxy health port, node port ranges, and health - check port ranges. E.g. 10.82.0.0/16 30000-32000. "None": Disables - all security list management. Requires that the user has setup - a rule that allows inbound traffic to the appropriate ports - for kube proxy health port, node port ranges, and health check - port ranges. E.g. 10.82.0.0/16 30000-32000. Additionally requires - the user to mange rules to allow inbound traffic to load balancers.' - enum: - - All - - Frontend - - None - type: string - securityListSubnetMapping: - description: SecurityListSubnetMapping controls an optional specification - of security lists to modify per subnet. This does not apply - if security list management is off. - items: - properties: - securityList: - description: SecurityList specifies the security list to - modify for the subnet. - pattern: ^ocid1\.securitylist\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - type: string - subnet: - description: Subnet specifies the subnet to which to modify - a security list for. - pattern: ^ocid1\.subnet\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - type: string - required: - - securityList - - subnet - type: object - type: array - subnet1: - pattern: ^ocid1\.subnet\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - type: string - subnet2: - pattern: ^ocid1\.subnet\.oc[0-9]+\.[a-z0-9]*\.[a-z0-9]+$ - type: string - required: - - securityListManagementMode - type: object - proxy: - description: Proxy configures the proxy settings for the Oracle CPI - properties: - http_proxy: - description: HTTP proxy setting - type: string - https_proxy: - description: HTTPS proxy setting - type: string - no_proxy: - description: No-proxy setting - type: string - type: object - vcn: - description: VCN configures the Virtual Cloud Network (VCN) within - which the cluster resides. - type: string - required: - - compartment - - vcn - type: object - status: - description: OracleCPIConfigStatus defines the observed state of OracleCPIConfig - properties: - secretRef: - description: Name of the data value secret created by Oracle CPI controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cpi.tanzu.vmware.com_vspherecpiconfigs.yaml b/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cpi.tanzu.vmware.com_vspherecpiconfigs.yaml deleted file mode 100644 index 1018d13457..0000000000 --- a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/cpi.tanzu.vmware.com_vspherecpiconfigs.yaml +++ /dev/null @@ -1,223 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: vspherecpiconfigs.cpi.tanzu.vmware.com -spec: - group: cpi.tanzu.vmware.com - names: - kind: VSphereCPIConfig - listKind: VSphereCPIConfigList - plural: vspherecpiconfigs - shortNames: - - vcpic - singular: vspherecpiconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The name of the VSphereCPIConfig - jsonPath: .spec.namespace - name: Name - type: string - - description: Name of the kapp-controller data values secret - jsonPath: .spec.vsphereCPI.mode - name: Mode - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: VSphereCPIConfig is the Schema for the VSphereCPIConfig API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereCPIConfigSpec defines the desired state of VSphereCPIConfig - properties: - vsphereCPI: - properties: - antreaNSXPodRoutingEnabled: - default: false - description: A flag that enables pod routing by Antrea NSX for - paravirtual mode - type: boolean - datacenter: - description: The datacenter in which VMs are created/located - type: string - insecure: - description: The flag that disables TLS peer verification - type: boolean - ipFamily: - description: The IP family configuration - enum: - - ipv4 - - ipv6 - - ipv4,ipv6 - - ipv6,ipv4 - type: string - mode: - description: The vSphere mode. Either `vsphereCPI` or `vsphereParavirtualCPI`. - enum: - - vsphereCPI - - vsphereParavirtualCPI - type: string - nsxt: - properties: - apiHost: - description: The NSX-T server - type: string - clientCertData: - description: Client certificate data for NSX-T - type: string - clientCertKeyData: - description: Client certificate key for NSX-T - type: string - credentialLocalObjRef: - description: A secret reference that contains Nsx-T login - credential to access NSX-T consists of the field username - and password - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - insecure: - description: Insecure is to be set to true if NSX-T uses self-signed - cert - type: boolean - podRoutingEnabled: - default: false - description: A flag that enables pod routing - type: boolean - remoteAuth: - description: RemoteAuth is to be set to true if NSX-T uses - remote authentication (authentication done through the vIDM) - type: boolean - rootCAData: - description: The certificate authority for the server certificate - for locally signed certificates - type: string - route: - description: Route configuration for NSXT - properties: - routerPath: - description: NSX-T T0/T1 logical router path - type: string - type: object - vmcAccessToken: - description: VMCAccessToken is VMC access token for token - based authentication - type: string - vmcAuthHost: - description: VMCAuthHost is VMC verification host for token - based authentication - type: string - type: object - proxy: - properties: - http_proxy: - description: HTTP proxy setting - type: string - https_proxy: - description: HTTPS proxy setting - type: string - no_proxy: - description: No-proxy setting - type: string - type: object - region: - description: The region used by vSphere multi-AZ feature - type: string - tlsCipherSuites: - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - description: External arguments for cloud provider - type: string - tlsThumbprint: - description: The cryptographic thumbprint of the vSphere endpoint's - certificate. Default value is "". - type: string - vCenterAPIEndpoint: - description: The IP address or FQDN of the vSphere endpoint - type: string - vSphereCredentialLocalObjRef: - description: A secret reference that contains vSphere login credentials - to access a vSphere endpoint consists of the fields username - and password - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - vmNetwork: - properties: - excludeExternalSubnetCidr: - description: External VM network CIDR to be excluded - type: string - excludeInternalSubnetCidr: - description: Internal VM network CIDR to be excluded - type: string - external: - description: External VM network name - type: string - internal: - description: Internal VM network name - type: string - type: object - zone: - description: The zone used by vSphere multi-AZ feature - type: string - type: object - required: - - vsphereCPI - type: object - status: - description: VSphereCPIConfigStatus defines the observed state of VSphereCPIConfig - properties: - secretRef: - description: Name of the data value secret created by vSphere CPI - controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_awsebscsiconfigs.yaml b/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_awsebscsiconfigs.yaml deleted file mode 100644 index 7278a815a3..0000000000 --- a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_awsebscsiconfigs.yaml +++ /dev/null @@ -1,70 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: awsebscsiconfigs.csi.tanzu.vmware.com -spec: - group: csi.tanzu.vmware.com - names: - kind: AwsEbsCSIConfig - listKind: AwsEbsCSIConfigList - plural: awsebscsiconfigs - singular: awsebscsiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AwsEbsCSIConfig is the Schema for the awsebscsiconfigs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AwsEbsCSIConfigSpec defines the desired state of AwsEbsCSIConfig - properties: - awsEBSCSIDriver: - description: AwsEbsCSI is the Schema for the awsebscsiconfigs API - properties: - deploymentReplicas: - format: int32 - type: integer - httpProxy: - type: string - httpsProxy: - type: string - namespace: - description: The namespace csi components are to be deployed in - type: string - noProxy: - type: string - required: - - namespace - type: object - required: - - awsEBSCSIDriver - type: object - status: - description: AwsEbsCSIConfigStatus defines the observed state of AwsEbsCSIConfig - properties: - secretRef: - description: Name of the secret created by csi controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_azurediskcsiconfigs.yaml b/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_azurediskcsiconfigs.yaml deleted file mode 100644 index fba84ee915..0000000000 --- a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_azurediskcsiconfigs.yaml +++ /dev/null @@ -1,69 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: azurediskcsiconfigs.csi.tanzu.vmware.com -spec: - group: csi.tanzu.vmware.com - names: - kind: AzureDiskCSIConfig - listKind: AzureDiskCSIConfigList - plural: azurediskcsiconfigs - singular: azurediskcsiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AzureDiskCSIConfig is the Schema for the azurediskcsiconfigs - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureDiskCSIConfigSpec defines the desired state of AzureDiskCSIConfig - properties: - azureDiskCSIDriver: - description: AzureDiskCSI is the Schema for the awsebscsiconfigs API - properties: - deploymentReplicas: - format: int32 - type: integer - httpProxy: - type: string - httpsProxy: - type: string - namespace: - description: The namespace csi components are to be deployed in - type: string - noProxy: - type: string - type: object - required: - - azureDiskCSIDriver - type: object - status: - description: AzureDiskCSIConfigStatus defines the observed state of AzureDiskCSIConfig - properties: - secretRef: - description: Name of the secret created by csi controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_azurefilecsiconfigs.yaml b/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_azurefilecsiconfigs.yaml deleted file mode 100644 index c944b00f68..0000000000 --- a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_azurefilecsiconfigs.yaml +++ /dev/null @@ -1,70 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: azurefilecsiconfigs.csi.tanzu.vmware.com -spec: - group: csi.tanzu.vmware.com - names: - kind: AzureFileCSIConfig - listKind: AzureFileCSIConfigList - plural: azurefilecsiconfigs - singular: azurefilecsiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AzureFileCSIConfig is the Schema for the azurefilecsiconfigs - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureFileCSIConfigSpec defines the desired state of AzureFileCSIConfig - properties: - azureFileCSIDriver: - description: AzureFileCSI is the Schema for the AzureFileCSIConfig - properties: - deploymentReplicas: - format: int32 - type: integer - httpProxy: - type: string - httpsProxy: - type: string - namespace: - description: The namespace csi components are to be deployed in - type: string - noProxy: - type: string - required: - - namespace - type: object - required: - - azureFileCSIDriver - type: object - status: - description: AzureFileCSIConfigStatus defines the observed state of AzureFileCSIConfig - properties: - secretRef: - description: Name of the secret created by csi controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_vspherecsiconfigs.yaml b/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_vspherecsiconfigs.yaml deleted file mode 100644 index 9792e20aaf..0000000000 --- a/packages/addons-manager/bundle/config/upstream/addonconfigscrds/csi.tanzu.vmware.com_vspherecsiconfigs.yaml +++ /dev/null @@ -1,149 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: vspherecsiconfigs.csi.tanzu.vmware.com -spec: - group: csi.tanzu.vmware.com - names: - kind: VSphereCSIConfig - listKind: VSphereCSIConfigList - plural: vspherecsiconfigs - singular: vspherecsiconfig - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: VSphereCSIConfig is the Schema for the vspherecsiconfigs API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereCSIConfigSpec defines the desired state of VSphereCSIConfig - properties: - vsphereCSI: - properties: - config: - properties: - attachTimeout: - type: string - clusterName: - type: string - datacenter: - type: string - deploymentReplicas: - format: int32 - type: integer - httpProxy: - type: string - httpsProxy: - type: string - insecureFlag: - type: boolean - namespace: - description: The namespace csi components are to be deployed - in - type: string - netPermissions: - additionalProperties: - description: NetPermissionConfig consists of information - used to restrict the network permissions set on file share - volumes - properties: - ips: - description: 'Client IP address, IP range or IP subnet. - Example: "10.20.30.0/24"; defaults to "*" if not specified' - type: string - permissions: - description: Is it READ_ONLY, READ_WRITE or NO_ACCESS. - Defaults to "READ_WRITE" if not specified - type: string - rootsquash: - description: Disallow root access for this IP range. - Defaults to "false" if not specified - type: boolean - type: object - type: object - noProxy: - type: string - provisionTimeout: - type: string - publicNetwork: - type: string - region: - type: string - resizerTimeout: - type: string - server: - type: string - tlsThumbprint: - type: string - useTopologyCategories: - type: boolean - vSphereCredentialLocalObjRef: - description: A secret reference that contains vSphere login - credentials to access a vSphere endpoint consists of the - fields username and password - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - vSphereVersion: - type: string - windowsSupport: - type: boolean - zone: - type: string - type: object - mode: - description: The vSphere mode. Either `vsphereCSI` or `vsphereParavirtualCSI`. - enum: - - vsphereCSI - - vsphereParavirtualCSI - type: string - required: - - mode - type: object - required: - - vsphereCSI - type: object - status: - description: VSphereCSIConfigStatus defines the observed state of VSphereCSIConfig - properties: - secretRef: - description: Name of the secret created by csi controller - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} diff --git a/packages/addons-manager/bundle/config/upstream/addons-manager.yaml b/packages/addons-manager/bundle/config/upstream/addons-manager.yaml deleted file mode 100644 index 2e143aadfc..0000000000 --- a/packages/addons-manager/bundle/config/upstream/addons-manager.yaml +++ /dev/null @@ -1,412 +0,0 @@ -#@ load("@ytt:data", "data") - -#@ if data.values.tanzuAddonsManager.createNamespace: ---- -apiVersion: v1 -kind: Namespace -metadata: - name: #@ data.values.tanzuAddonsManager.namespace -#@ end ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: tanzu-addons-manager - name: tanzu-addons-manager-sa - namespace: #@ data.values.tanzuAddonsManager.namespace ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-addons-manager-clusterrole -rules: -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - get - - list -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - - tanzukubernetesreleases/status - - clusterbootstraps - - clusterbootstraptemplates - - kappcontrollerconfigs - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - cni.tanzu.vmware.com - resources: - - antreaconfigs - - calicoconfigs - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -#! permissions are required for addons-manager to reconcile vspherecpiconfigs and CPI related service accounts -- apiGroups: - - cpi.tanzu.vmware.com - resources: - - vspherecpiconfigs - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - cpi.tanzu.vmware.com - resources: - - vspherecpiconfigs/status - verbs: - - get - - update - - patch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - providerserviceaccounts - verbs: - - get - - create - - list - - watch - - update - - patch -#! permissions are required for addons-manager to reconcile vspherecsiconfigs and CSI related service accounts -- apiGroups: - - csi.tanzu.vmware.com - resources: - - vspherecsiconfigs - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - csi.tanzu.vmware.com - resources: - - vspherecsiconfigs/status - verbs: - - get - - update - - patch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - providerserviceaccounts - verbs: - - get - - create - - list - - watch - - update - - patch -#! permissions required by VsphereCPIConfig and VSphereCSIConfig controller to create ClusterRole for CAPV to reconcile ProviderServiceAccount -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachineservices - - virtualmachineservices/status - verbs: - - get - - create - - update - - patch - - delete -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachines - - virtualmachines/status - verbs: - - get - - list - - watch - - update - - patch -- apiGroups: - - nsx.vmware.com - resources: - - ippools - - ippools/status - verbs: - - get - - create - - update - - list - - patch - - delete - - watch -- apiGroups: - - nsx.vmware.com - resources: - - routesets - - routesets/status - verbs: - - get - - create - - update - - list - - patch - - delete -- apiGroups: - - cns.vmware.com - resources: - - cnsvolumemetadatas - - cnsfileaccessconfigs - verbs: - - get - - list - - watch - - update - - create - - delete -- apiGroups: - - cns.vmware.com - resources: - - cnscsisvfeaturestates - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims - verbs: - - get - - list - - watch - - update - - create - - delete -- apiGroups: - - "" - resources: - - persistentvolumeclaims/status - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - list -#! permissions are required for addons-manager to create/update resources in the ProviderRef which are dynamic. -- apiGroups: ['*'] - resources: ['*'] - verbs: - - get - - list - - watch - - create - - update - - patch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - kubeadmcontrolplanes - - kubeadmcontrolplanes/status - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch -- apiGroups: - - kappctrl.k14s.io - resources: - - apps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - packaging.carvel.dev - resources: - - packagerepositories - - packagerepositories/status - verbs: - - get - - list - - watch - - create - - update - - patch -- apiGroups: - - packaging.carvel.dev - resources: - - packageinstalls - - packageinstalls/status - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-addons-manager-clusterrolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-addons-manager-clusterrole -subjects: -- kind: ServiceAccount - name: tanzu-addons-manager-sa - namespace: #@ data.values.tanzuAddonsManager.namespace ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: tanzu-addons-manager - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting addons.config.tanzu.vmware.com/webhook" - kapp.k14s.io/change-rule.1: "delete before deleting addons.config.tanzu.vmware.com/webhook" - name: tanzu-addons-controller-manager - namespace: #@ data.values.tanzuAddonsManager.namespace -spec: - #@ if data.values.tanzuAddonsManager.deployment.leaderElection: - replicas: #@ data.values.tanzuAddonsManager.deployment.replicas - #@ else: - replicas: 1 - #@ end - strategy: - rollingUpdate: - maxUnavailable: 1 - selector: - matchLabels: - app: tanzu-addons-manager - template: - metadata: - labels: - app: tanzu-addons-manager - spec: - #@ if/end data.values.tanzuAddonsManager.deployment.nodeSelector: - nodeSelector: #@ data.values.tanzuAddonsManager.deployment.nodeSelector - containers: - - args: - - #@ "--metrics-bind-addr={}".format(data.values.tanzuAddonsManager.deployment.metricsBindAddress) - - #@ "--leader-elect={}".format(data.values.tanzuAddonsManager.deployment.leaderElection) - - #@ "--health-addr=:{}".format(data.values.tanzuAddonsManager.deployment.healthzPort) - - #@ "--cluster-delete-timeout={}".format(data.values.tanzuAddonsManager.deployment.clusterDeleteTimeout) - - #@ "--webhook-server-port={}".format(data.values.tanzuAddonsManager.deployment.webhookServerPort) - - #@ "--addon-namespace={}".format(data.values.tanzuAddonsManager.namespace) - - #@ "--tls-cipher-suites={}".format(data.values.tanzuAddonsManager.deployment.tlsCipherSuites) - #@ if/end data.values.tanzuAddonsManager.featureGates.clusterBootstrapController: - - --feature-gate-cluster-bootstrap=true - #@ if/end data.values.tanzuAddonsManager.featureGates.packageInstallStatus: - - --feature-gate-package-install-status=true - image: addons-controller:latest - imagePullPolicy: IfNotPresent - name: tanzu-addons-controller - resources: - limits: - cpu: 500m - memory: 1200Mi - requests: - cpu: 100m - memory: 40Mi - ports: - - containerPort: #@ data.values.tanzuAddonsManager.deployment.webhookServerPort - name: webhook-server - protocol: TCP - - containerPort: #@ data.values.tanzuAddonsManager.deployment.healthzPort - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - livenessProbe: - httpGet: - path: /healthz - port: healthz - startupProbe: - httpGet: - path: /healthz - port: healthz - failureThreshold: 60 - periodSeconds: 10 - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - serviceAccount: tanzu-addons-manager-sa - terminationGracePeriodSeconds: 10 - #@ if/end data.values.tanzuAddonsManager.deployment.hostNetwork: - hostNetwork: true - #@ if/end data.values.tanzuAddonsManager.deployment.priorityClassName: - priorityClassName: #@ data.values.tanzuAddonsManager.deployment.priorityClassName - #@ if/end hasattr(data.values.tanzuAddonsManager.deployment, 'tolerations') and data.values.tanzuAddonsManager.deployment.tolerations: - tolerations: #@ data.values.tanzuAddonsManager.deployment.tolerations diff --git a/packages/addons-manager/bundle/config/upstream/runcrds/run.tanzu.vmware.com_clusterbootstraps.yaml b/packages/addons-manager/bundle/config/upstream/runcrds/run.tanzu.vmware.com_clusterbootstraps.yaml deleted file mode 100644 index 5478cd77ac..0000000000 --- a/packages/addons-manager/bundle/config/upstream/runcrds/run.tanzu.vmware.com_clusterbootstraps.yaml +++ /dev/null @@ -1,328 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: clusterbootstraps.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: ClusterBootstrap - listKind: ClusterBootstrapList - plural: clusterbootstraps - shortNames: - - cb - singular: clusterbootstrap - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: CNI package name and version - jsonPath: .spec.cni.refName - name: CNI - type: string - - description: CSI package name and version - jsonPath: .spec.csi.refName - name: CSI - type: string - - description: CPI package name and version - jsonPath: .spec.cpi.refName - name: CPI - type: string - - description: Kapp package name and version - jsonPath: .spec.kapp.refName - name: Kapp - type: string - - description: Additional packages - jsonPath: .spec.additionalPackages[*].refName - name: Additional Packages - priority: 10 - type: string - - description: Resolved TKR name - jsonPath: .status.resolvedTKR - name: Resolved_TKR - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: ClusterBootstrap is the Schema for the ClusterBootstraps API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterBootstrapTemplateSpec defines the desired state of - ClusterBootstrapTemplate - properties: - additionalPackages: - items: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, the - specified Kind must be in the core API group. For - any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - type: array - cni: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - cpi: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - csi: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - kapp: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - paused: - default: false - description: Paused can be used to prevent controllers from processing - the ClusterBootstrap and all its associated objects. - type: boolean - type: object - status: - description: ClusterBootstrapStatus defines the observed state of ClusterBootstrap - properties: - conditions: - description: Conditions provide observations of the operational state - of a Cluster API resource. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - resolvedTKR: - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/packages/addons-manager/bundle/config/upstream/runcrds/run.tanzu.vmware.com_clusterbootstraptemplates.yaml b/packages/addons-manager/bundle/config/upstream/runcrds/run.tanzu.vmware.com_clusterbootstraptemplates.yaml deleted file mode 100644 index 71387564df..0000000000 --- a/packages/addons-manager/bundle/config/upstream/runcrds/run.tanzu.vmware.com_clusterbootstraptemplates.yaml +++ /dev/null @@ -1,272 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: clusterbootstraptemplates.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: ClusterBootstrapTemplate - listKind: ClusterBootstrapTemplateList - plural: clusterbootstraptemplates - shortNames: - - cbt - singular: clusterbootstraptemplate - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: CNI package name and version - jsonPath: .spec.cni.refName - name: CNI - type: string - - description: CSI package name and version - jsonPath: .spec.csi.refName - name: CSI - type: string - - description: CPI package name and version - jsonPath: .spec.cpi.refName - name: CPI - type: string - - description: Kapp package name and version - jsonPath: .spec.kapp.refName - name: Kapp - type: string - - description: Additional packages - jsonPath: .spec.additionalPackages[*].refName - name: Additional Packages - priority: 10 - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: ClusterBootstrapTemplate is the Schema for the ClusterBootstraptemplates - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterBootstrapTemplateSpec defines the desired state of - ClusterBootstrapTemplate - properties: - additionalPackages: - items: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, the - specified Kind must be in the core API group. For - any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - type: array - cni: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - cpi: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - csi: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - kapp: - properties: - refName: - type: string - valuesFrom: - description: ValuesFrom specifies how values for package install - are retrieved from - properties: - inline: - type: object - x-kubernetes-preserve-unknown-fields: true - providerRef: - description: TypedLocalObjectReference contains enough information - to let you locate the typed referenced object inside the - same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being - referenced. If APIGroup is not specified, the specified - Kind must be in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - x-kubernetes-map-type: atomic - secretRef: - type: string - type: object - required: - - refName - type: object - paused: - default: false - description: Paused can be used to prevent controllers from processing - the ClusterBootstrap and all its associated objects. - type: boolean - type: object - required: - - spec - type: object - served: true - storage: true - subresources: {} diff --git a/packages/addons-manager/bundle/config/upstream/runcrds/run.tanzu.vmware.com_kappcontrollerconfigs.yaml b/packages/addons-manager/bundle/config/upstream/runcrds/run.tanzu.vmware.com_kappcontrollerconfigs.yaml deleted file mode 100644 index f1f614a0dc..0000000000 --- a/packages/addons-manager/bundle/config/upstream/runcrds/run.tanzu.vmware.com_kappcontrollerconfigs.yaml +++ /dev/null @@ -1,166 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - name: kappcontrollerconfigs.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: KappControllerConfig - listKind: KappControllerConfigList - plural: kappcontrollerconfigs - shortNames: - - kappconf - singular: kappcontrollerconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The namespace in which kapp-controller is deployed - jsonPath: .spec.namespace - name: Namespace - type: string - - description: The namespace value used for global packaging resources. Any Package - and PackageMetadata CRs within that namespace will be included in all other - namespaces on the cluster, without duplicating them - jsonPath: .spec.kappController.globalNamespace - name: GlobalNamespace - type: string - - description: Name of the kapp-controller data values secret - jsonPath: .status.secretName - name: SecretName - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: KappControllerConfig is the Schema for the kappcontrollerconfigs - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KappControllerConfigSpec defines the desired state of KappControllerConfig - properties: - kappController: - default: - deployment: - hostNetwork: true - properties: - config: - properties: - caCerts: - description: A cert chain of trusted CA certs. These will - be added to the system-wide cert pool of trusted CA's. Cluster-wide - CA Certificate setting will be used if this is not provided. - type: string - dangerousSkipTLSVerify: - description: A comma delimited list of hostnames for which - kapp-controller should skip TLS verification - type: string - httpProxy: - description: The url/ip of a proxy for kapp controller to - use when making network requests. Cluster-wide HTTP proxy - setting will be used if this is not provided. - type: string - httpsProxy: - description: The url/ip of a TLS capable proxy for kapp-controller - to use when making network requests. Cluster-wide HTTPS - proxy setting will be used if this is not provided. - type: string - noProxy: - description: A comma delimited list of domain names which - kapp-controller should bypass the proxy for when making - requests. Cluster-wide no-proxy setting will be used if - this is not provided. - type: string - type: object - createNamespace: - default: false - description: Whether to create namespace specified for kapp-controller - type: boolean - deployment: - default: - hostNetwork: true - properties: - apiPort: - default: 10100 - description: Bind port for kapp-controller API - type: integer - concurrency: - default: 4 - description: Concurrency of kapp-controller deployment - type: integer - hostNetwork: - default: true - description: Whether to enable host networking for kapp-controller - deployment - type: boolean - metricsBindAddress: - default: "0" - description: Address for metrics server - type: string - priorityClassName: - default: system-cluster-critical - description: The priority value that various system components - use to find the priority of the kapp-controller pod - type: string - tolerations: - default: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - description: kapp-controller deployment tolerations - items: - additionalProperties: - type: string - type: object - type: array - type: object - globalNamespace: - default: tkg-system - description: The namespace value used for global packaging resources. - Any Package and PackageMetadata CRs within that namespace will - be included in all other namespaces on the cluster, without - duplicating them - type: string - type: object - namespace: - default: tkg-system - description: The namespace in which kapp-controller is deployed - type: string - type: object - status: - description: KappControllerConfigStatus defines the observed state of - KappControllerConfig - properties: - secretRef: - description: Name of the data value secret created by controller - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} diff --git a/packages/addons-manager/bundle/config/upstream/webhook-manifests.lib.yaml b/packages/addons-manager/bundle/config/upstream/webhook-manifests.lib.yaml deleted file mode 100644 index ce7ca8fa6a..0000000000 --- a/packages/addons-manager/bundle/config/upstream/webhook-manifests.lib.yaml +++ /dev/null @@ -1,179 +0,0 @@ -#@ load("@ytt:data", "data") - -#@ def webhook_manifests(): ---- -apiVersion: v1 -kind: Service -metadata: - name: tanzu-addons-manager-webhook-service - namespace: #@ data.values.tanzuAddonsManager.namespace -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - app: tanzu-addons-manager ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - labels: - tkg.tanzu.vmware.com/addon-webhooks: "addon-webhooks" - annotations: - kapp.k14s.io/change-group: "addons.config.tanzu.vmware.com/webhook" - name: tkg-cni-validating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: #@ data.values.tanzuAddonsManager.namespace - path: /validate-cni-tanzu-vmware-com-v1alpha1-antreaconfig - failurePolicy: Fail - name: antreaconfig.validating.vmware.com - rules: - - apiGroups: - - cni.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - antreaconfigs - sideEffects: None - timeoutSeconds: 30 - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: #@ data.values.tanzuAddonsManager.namespace - path: /validate-cni-tanzu-vmware-com-v1alpha1-calicoconfig - failurePolicy: Fail - name: calicoconfig.validating.vmware.com - rules: - - apiGroups: - - cni.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - calicoconfigs - sideEffects: None - timeoutSeconds: 30 ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - labels: - tkg.tanzu.vmware.com/addon-webhooks: "addon-webhooks" - annotations: - kapp.k14s.io/change-group: "addons.config.tanzu.vmware.com/webhook" - name: clusterbootstrap-mutating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: #@ data.values.tanzuAddonsManager.namespace - path: /mutate-run-tanzu-vmware-com-v1alpha3-clusterbootstrap - failurePolicy: Fail - name: clusterbootstrap.mutating.vmware.com - rules: - - apiGroups: - - run.tanzu.vmware.com - apiVersions: - - v1alpha3 - operations: - - CREATE - - UPDATE - resources: - - clusterbootstraps - sideEffects: None - timeoutSeconds: 30 - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: #@ data.values.tanzuAddonsManager.namespace - path: /mutate-cluster-x-k8s-io-v1beta1-cluster - failurePolicy: Fail - name: clusterpause.mutating.vmware.com - reinvocationPolicy: IfNeeded - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - UPDATE - resources: - - clusters - sideEffects: None - timeoutSeconds: 30 ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - labels: - tkg.tanzu.vmware.com/addon-webhooks: "addon-webhooks" - annotations: - kapp.k14s.io/change-group: "addons.config.tanzu.vmware.com/webhook" - name: clusterbootstrap-validating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: #@ data.values.tanzuAddonsManager.namespace - path: /validate-run-tanzu-vmware-com-v1alpha3-clusterbootstrap - failurePolicy: Fail - name: clusterbootstrap.validating.vmware.com - rules: - - apiGroups: - - run.tanzu.vmware.com - apiVersions: - - v1alpha3 - operations: - - CREATE - - UPDATE - resources: - - clusterbootstraps - sideEffects: None - timeoutSeconds: 30 - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tanzu-addons-manager-webhook-service - namespace: #@ data.values.tanzuAddonsManager.namespace - path: /validate-run-tanzu-vmware-com-v1alpha3-clusterbootstraptemplate - failurePolicy: Fail - name: clusterbootstraptemplate.validating.vmware.com - rules: - - apiGroups: - - run.tanzu.vmware.com - apiVersions: - - v1alpha3 - operations: - - CREATE - - UPDATE - resources: - - clusterbootstraptemplates - sideEffects: None - timeoutSeconds: 30 - -#@ end diff --git a/packages/addons-manager/bundle/config/values.yaml b/packages/addons-manager/bundle/config/values.yaml deleted file mode 100644 index 7ea721f4e6..0000000000 --- a/packages/addons-manager/bundle/config/values.yaml +++ /dev/null @@ -1,28 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True - ---- -tanzuAddonsManager: - namespace: tkg-system - createNamespace: true - deployment: - replicas: 2 - leaderElection: false - hostNetwork: true - priorityClassName: null - nodeSelector: null - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - webhookServerPort: 9865 - healthzPort: 18316 - clusterDeleteTimeout: "10m" - metricsBindAddress: "localhost:18317" - tlsCipherSuites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" - featureGates: - clusterBootstrapController: false - packageInstallStatus: false diff --git a/packages/addons-manager/kbld-config.yaml b/packages/addons-manager/kbld-config.yaml deleted file mode 100644 index 7df93a3364..0000000000 --- a/packages/addons-manager/kbld-config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: kbld.k14s.io/v1alpha1 -kind: Config -overrides: -- image: addons-controller:latest - newImage: "" diff --git a/packages/addons-manager/metadata.yaml b/packages/addons-manager/metadata.yaml deleted file mode 100644 index 5e00e9a699..0000000000 --- a/packages/addons-manager/metadata.yaml +++ /dev/null @@ -1,35 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: addons-manager.tanzu.vmware.com - namespace: addons-manager - - # The packaging.carvel.dev/revision annotation is added to help Kapp-controller - # decide which version of the file to select as source of truth in the case that - # a package is defined in multiple repositories. - # See here for more details: https://carvel.dev/kapp-controller/docs/develop/packaging/#combinations-and-special-cases - # - # The string "2.0" was chosen because it was during the creation of tkg 2.0 that we introduced the annotation. - # The string in this file should never require changing. It is not tied to a release or required to be tied to a - # release or any other "version" number. See cited documentation for string format requirements. - # - # The string "2.0" was used in this file because it was during tkg 2.0 that the annotation was first introduced. Because - # it was the first time it was used in this package, the string could have been chosen to be anything. - # If at any other time, a new package-bundle with the same name, addons-manager.tanzu.vmware.com, is defined in a DIFFERENT - # repository. It is in those new files that the revision should be made "higher" or "lower" than "2.0" depending on the - # use case being addressed. - # Simply choosing the number based on the release will likely result in unforeseen issues. We - # were able to do this here, because it was the first time. Any subsequent change needs to use this file as reference, - # thus the reason to never change the version here without through thought and consideration. - annotations: - packaging.carvel.dev/revision: "2.0" -spec: - displayName: "tanzu-addons-manager" - longDescription: "This package provides TKG addons lifecycle management capabilities." - shortDescription: "This package provides TKG addons lifecycle management capabilities." - providerName: VMware - maintainers: - - name: Lucheng Bao - - name: Guanpeng Gao - categories: - - "addons-lifecycle-management" diff --git a/packages/addons-manager/package.yaml b/packages/addons-manager/package.yaml deleted file mode 100644 index e6ea205b6a..0000000000 --- a/packages/addons-manager/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: addons-manager.tanzu.vmware.com.1.5.0 - namespace: addons-manager -spec: - refName: addons-manager.tanzu.vmware.com - version: latest - licenses: - - "UNKNOWN" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/addons-manager/vendir.lock.yml b/packages/addons-manager/vendir.lock.yml deleted file mode 100644 index 2812a9dbb1..0000000000 --- a/packages/addons-manager/vendir.lock.yml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - directory: {} - path: runcrds - - directory: {} - path: addonconfigscrds - - manual: {} - path: addons-manager.yaml - - manual: {} - path: webhook-manifests.lib.yaml - path: bundle/config/upstream -- contents: - - manual: {} - path: feature-gate-clusterbootstrap.yaml - path: bundle/config/overlays -kind: LockConfig diff --git a/packages/addons-manager/vendir.yml b/packages/addons-manager/vendir.yml deleted file mode 100644 index efb1c010dc..0000000000 --- a/packages/addons-manager/vendir.yml +++ /dev/null @@ -1,34 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: runcrds - directory: - path: ../../apis/run/config/crd/bases/ - includePaths: - - run.tanzu.vmware.com_clusterbootstraps.yaml - - run.tanzu.vmware.com_clusterbootstraptemplates.yaml - - run.tanzu.vmware.com_kappcontrollerconfigs.yaml - - path: addonconfigscrds - directory: - path: ../../apis/addonconfigs/config/crd/bases/ - includePaths: - - cni.tanzu.vmware.com_antreaconfigs.yaml - - cni.tanzu.vmware.com_calicoconfigs.yaml - - cpi.tanzu.vmware.com_oraclecpiconfigs.yaml - - cpi.tanzu.vmware.com_vspherecpiconfigs.yaml - - csi.tanzu.vmware.com_vspherecsiconfigs.yaml - - csi.tanzu.vmware.com_azurediskcsiconfigs.yaml - - csi.tanzu.vmware.com_awsebscsiconfigs.yaml - - csi.tanzu.vmware.com_azurefilecsiconfigs.yaml - - cpi.tanzu.vmware.com_kubevipcpiconfigs.yaml - - path: addons-manager.yaml - manual: {} - - path: webhook-manifests.lib.yaml - manual: {} - - path: bundle/config/overlays - contents: - - path: feature-gate-clusterbootstrap.yaml - manual: {} diff --git a/packages/ako-operator-v2/Makefile b/packages/ako-operator-v2/Makefile deleted file mode 100644 index 047b729714..0000000000 --- a/packages/ako-operator-v2/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/ako-operator-v2/README.md b/packages/ako-operator-v2/README.md deleted file mode 100644 index 44bcca5ba7..0000000000 --- a/packages/ako-operator-v2/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# ako-operator Package - -This package provides << awesome functionality >> using [ako-operator](https://INFO_NEEDED). - -## Components - -## Configuration - -The following configuration values can be set to customize the ako-operator installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -### ako-operator Configuration - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -## Usage Example - -The following is a basic guide for getting started with ako-operator. diff --git a/packages/ako-operator-v2/bundle/config/kapp-config.yaml b/packages/ako-operator-v2/bundle/config/kapp-config.yaml deleted file mode 100644 index 823305d48a..0000000000 --- a/packages/ako-operator-v2/bundle/config/kapp-config.yaml +++ /dev/null @@ -1,41 +0,0 @@ -#@ load("/values.star", "values") - ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: ako-operator-kapp-config - labels: - kapp.k14s.io/config: "" -data: - #@yaml/text-templated-strings - config.yml: | - apiVersion: kapp.k14s.io/v1alpha1 - kind: Config - rebaseRules: - - paths: - - [spec, cloudName] - - [spec, controller] - - [spec, adminCredentialRef] - - [spec, certificateAuthorityRef] - - [spec, dataNetwork] - - [spec, controllerVersion] - - [spec, extraConfigs] - - [spec, controlPlaneNetwork] - - [spec, serviceEngineGroup] - type: copy - sources: [existing, new] - resourceMatchers: - - apiVersionKindMatcher: {apiVersion: networking.tkg.tanzu.vmware.com/v1alpha1, kind: AKODeploymentConfig} - - paths: - - [data, username] - - [data, password] - type: copy - sources: [existing, new] - resourceMatchers: - - kindNamespaceNameMatcher: {kind: Secret, namespace: (@= values.akoOperator.namespace@), name: (@= values.akoOperator.config.avi_admin_credential_name@)} - - path: [data, certificateAuthorityData] - type: copy - sources: [existing, new] - resourceMatchers: - - kindNamespaceNameMatcher: {kind: Secret, namespace: (@= values.akoOperator.namespace@), name: (@= values.akoOperator.config.avi_ca_name@)} diff --git a/packages/ako-operator-v2/bundle/config/overlays/overlay-akodeploymentconfig.yaml b/packages/ako-operator-v2/bundle/config/overlays/overlay-akodeploymentconfig.yaml deleted file mode 100644 index ca5b31cf29..0000000000 --- a/packages/ako-operator-v2/bundle/config/overlays/overlay-akodeploymentconfig.yaml +++ /dev/null @@ -1,119 +0,0 @@ -#@ load("/values.star", "values") -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:json", "json") - -#@overlay/match by=overlay.subset({"kind": "AKODeploymentConfig", "metadata": {"name": "install-ako-for-all"}}) ---- -#@overlay/replace -apiVersion: networking.tkg.tanzu.vmware.com/v1alpha1 -kind: AKODeploymentConfig -metadata: - name: install-ako-for-all -spec: -#@ if values.akoOperator.config.avi_labels != '""': - #@overlay/match missing_ok=True - clusterSelector: - matchLabels: #@ json.decode(values.akoOperator.config.avi_labels) -#@ end -#@ if values.akoOperator.config.avi_controller_version != "": - #@overlay/match missing_ok=True - controllerVersion: #@ values.akoOperator.config.avi_controller_version -#@ end - cloudName: #@ values.akoOperator.config.avi_cloud_name - serviceEngineGroup: #@ values.akoOperator.config.avi_service_engine_group - controller: #@ values.akoOperator.config.avi_controller - adminCredentialRef: - name: #@ values.akoOperator.config.avi_admin_credential_name - namespace: #@ values.akoOperator.namespace - certificateAuthorityRef: - name: #@ values.akoOperator.config.avi_ca_name - namespace: #@ values.akoOperator.namespace - dataNetwork: - name: #@ values.akoOperator.config.avi_data_network - cidr: #@ values.akoOperator.config.avi_data_network_cidr - controlPlaneNetwork: - name: #@ values.akoOperator.config.avi_control_plane_network - cidr: #@ values.akoOperator.config.avi_control_plane_network_cidr - extraConfigs: -#@ if values.akoOperator.config.avi_cni_plugin: -#@overlay/match missing_ok=True - cniPlugin: #@ values.akoOperator.config.avi_cni_plugin -#@ end - disableStaticRouteSync: #@ values.akoOperator.config.avi_disable_static_route_sync - ingress: - disableIngressClass: #@ values.akoOperator.config.avi_disable_ingress_class - defaultIngressController: #@ values.akoOperator.config.avi_ingress_default_ingress_controller -#@ if values.akoOperator.config.avi_ingress_shard_vs_size != "": - #@overlay/match missing_ok=True - shardVSSize: #@ values.akoOperator.config.avi_ingress_shard_vs_size -#@ end -#@ if values.akoOperator.config.avi_ingress_service_type != "": - #@overlay/match missing_ok=True - serviceType: #@ values.akoOperator.config.avi_ingress_service_type -#@ end -#@ if values.akoOperator.config.avi_ingress_node_network_list != '""': - #@overlay/match missing_ok=True - nodeNetworkList: #@ json.decode(values.akoOperator.config.avi_ingress_node_network_list) -#@ end -#@ if values.akoOperator.config.avi_nsxt_t1_lr: - #@overlay/match missing_ok=True - networksConfig: - nsxtT1LR: #@ values.akoOperator.config.avi_nsxt_t1_lr -#@ end - -#@overlay/match by=overlay.subset({"kind": "AKODeploymentConfig", "metadata": {"name": "install-ako-for-management-cluster"}}) ---- -#@overlay/replace -apiVersion: networking.tkg.tanzu.vmware.com/v1alpha1 -kind: AKODeploymentConfig -metadata: - name: install-ako-for-management-cluster -spec: - clusterSelector: - matchLabels: - cluster-role.tkg.tanzu.vmware.com/management: "" -#@ if values.akoOperator.config.avi_controller_version != "": - #@overlay/match missing_ok=True - controllerVersion: #@ values.akoOperator.config.avi_controller_version -#@ end - dataNetwork: - name: #@ values.akoOperator.config.avi_management_cluster_vip_network_name - cidr: #@ values.akoOperator.config.avi_management_cluster_vip_network_cidr - controlPlaneNetwork: - name: #@ values.akoOperator.config.avi_management_cluster_control_plane_vip_network_name - cidr: #@ values.akoOperator.config.avi_management_cluster_control_plane_vip_network_cidr - cloudName: #@ values.akoOperator.config.avi_cloud_name - serviceEngineGroup: #@ values.akoOperator.config.avi_management_cluster_service_engine_group - controller: #@ values.akoOperator.config.avi_controller - adminCredentialRef: - name: #@ values.akoOperator.config.avi_admin_credential_name - namespace: #@ values.akoOperator.namespace - certificateAuthorityRef: - name: #@ values.akoOperator.config.avi_ca_name - namespace: #@ values.akoOperator.namespace - extraConfigs: -#@ if values.akoOperator.config.avi_cni_plugin: -#@overlay/match missing_ok=True - cniPlugin: #@ values.akoOperator.config.avi_cni_plugin -#@ end - disableStaticRouteSync: #@ values.akoOperator.config.avi_disable_static_route_sync - ingress: - disableIngressClass: #@ values.akoOperator.config.avi_disable_ingress_class - defaultIngressController: #@ values.akoOperator.config.avi_ingress_default_ingress_controller -#@ if values.akoOperator.config.avi_ingress_shard_vs_size != "": - #@overlay/match missing_ok=True - shardVSSize: #@ values.akoOperator.config.avi_ingress_shard_vs_size -#@ end -#@ if values.akoOperator.config.avi_ingress_service_type != "": - #@overlay/match missing_ok=True - serviceType: #@ values.akoOperator.config.avi_ingress_service_type -#@ end -#@ if values.akoOperator.config.avi_ingress_node_network_list != '""': - #@overlay/match missing_ok=True - nodeNetworkList: #@ json.decode(values.akoOperator.config.avi_ingress_node_network_list) -#@ end -#@ if values.akoOperator.config.avi_nsxt_t1_lr: - #@overlay/match missing_ok=True - networksConfig: - nsxtT1LR: #@ values.akoOperator.config.avi_nsxt_t1_lr -#@ end diff --git a/packages/ako-operator-v2/bundle/config/overlays/overlay-deployment.yaml b/packages/ako-operator-v2/bundle/config/overlays/overlay-deployment.yaml deleted file mode 100644 index a80dd484df..0000000000 --- a/packages/ako-operator-v2/bundle/config/overlays/overlay-deployment.yaml +++ /dev/null @@ -1,71 +0,0 @@ -#@ load("/values.star", "values") -#@ load("@ytt:overlay", "overlay") - -#@ def labels(): -app: tanzu-ako-operator -#@ end - -#@overlay/match by=overlay.subset({"kind": "Namespace", "metadata": {"name": "tkg-system-networking"}}) ---- -#@overlay/replace -apiVersion: v1 -kind: Namespace -metadata: - name: #@ values.akoOperator.namespace - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "ako-operator-controller-manager"}}) ---- -#@overlay/replace -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: #@ labels() - name: ako-operator-controller-manager - namespace: #@ values.akoOperator.namespace - #@overlay/match missing_ok=True - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" -spec: - replicas: 1 - selector: - matchLabels: #@ labels() - template: - metadata: - labels: #@ labels() - spec: - containers: - #@overlay/match by="name" - #@overlay/replace - - args: - - --metrics-addr=:8080 - command: - - /manager - image: ako-operator:latest - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - env: - #@ if values.akoOperator.on_bootstrap_cluster: - #@overlay/match missing_ok=True - - name: bootstrap_cluster - value: "True" - #@ end - - name: cluster_class_enabled - value: "True" - - name: avi_control_plane_ha_provider - value: #@ "{}".format(values.akoOperator.config.avi_control_plane_ha_provider) - - name: control_plane_endpoint_port - value: #@ "{}".format(values.akoOperator.config.avi_control_plane_endpoint_port) - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - runAsUser: 65532 - runAsGroup: 65532 diff --git a/packages/ako-operator-v2/bundle/config/overlays/overlay-secret.yaml b/packages/ako-operator-v2/bundle/config/overlays/overlay-secret.yaml deleted file mode 100644 index 87e5e6204e..0000000000 --- a/packages/ako-operator-v2/bundle/config/overlays/overlay-secret.yaml +++ /dev/null @@ -1,28 +0,0 @@ -#@ load("/values.star", "values") -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:base64", "base64") - -#@overlay/match by=overlay.subset({"kind": "Secret", "metadata": {"name": "avi-controller-credentials"}}) ---- -#@overlay/replace -apiVersion: v1 -kind: Secret -metadata: - name: #@ values.akoOperator.config.avi_admin_credential_name - namespace: #@ values.akoOperator.namespace -type: Opaque -data: - username: #@ base64.encode(values.akoOperator.config.avi_username) - password: #@ base64.encode(values.akoOperator.config.avi_password) - -#@overlay/match by=overlay.subset({"kind": "Secret", "metadata": {"name": "avi-controller-ca"}}) ---- -#@overlay/replace -apiVersion: v1 -kind: Secret -metadata: - name: #@ values.akoOperator.config.avi_ca_name - namespace: #@ values.akoOperator.namespace -type: Opaque -data: - certificateAuthorityData: #@ values.akoOperator.config.avi_ca_data_b64 diff --git a/packages/ako-operator-v2/bundle/config/upstream/akooperator/akodeploymentconfig.yaml b/packages/ako-operator-v2/bundle/config/upstream/akooperator/akodeploymentconfig.yaml deleted file mode 100644 index d42d6d7e70..0000000000 --- a/packages/ako-operator-v2/bundle/config/upstream/akooperator/akodeploymentconfig.yaml +++ /dev/null @@ -1,56 +0,0 @@ ---- -apiVersion: networking.tkg.tanzu.vmware.com/v1alpha1 -kind: AKODeploymentConfig -metadata: - name: install-ako-for-all -spec: - cloudName: "" - serviceEngineGroup: "" - controller: "" - adminCredentialRef: - name: controller-credentials - namespace: default - certificateAuthorityRef: - name: controller-ca - namespace: default - dataNetwork: - name: "" - cidr: "" - controlPlaneNetwork: - name: "" - cidr: "" - extraConfigs: - disableStaticRouteSync: false - ingress: - disableIngressClass: true - defaultIngressController: false - ---- -apiVersion: networking.tkg.tanzu.vmware.com/v1alpha1 -kind: AKODeploymentConfig -metadata: - name: install-ako-for-management-cluster -spec: - clusterSelector: - matchLabels: - cluster-role.tkg.tanzu.vmware.com/management: "" - cloudName: "" - serviceEngineGroup: "" - controller: "" - adminCredentialRef: - name: controller-credentials - namespace: default - certificateAuthorityRef: - name: controller-ca - namespace: default - dataNetwork: - name: "" - cidr: "" - controlPlaneNetwork: - name: "" - cidr: "" - extraConfigs: - disableStaticRouteSync: false - ingress: - disableIngressClass: true - defaultIngressController: false diff --git a/packages/ako-operator-v2/bundle/config/upstream/akooperator/aviinfrasettings.yaml b/packages/ako-operator-v2/bundle/config/upstream/akooperator/aviinfrasettings.yaml deleted file mode 100644 index d9241d32aa..0000000000 --- a/packages/ako-operator-v2/bundle/config/upstream/akooperator/aviinfrasettings.yaml +++ /dev/null @@ -1,99 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: aviinfrasettings.ako.vmware.com -spec: - conversion: - strategy: None - group: ako.vmware.com - names: - kind: AviInfraSetting - listKind: AviInfraSettingList - plural: aviinfrasettings - singular: aviinfrasetting - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AviInfraSetting is used to select specific Avi controller infra attributes. - properties: - spec: - properties: - network: - properties: - vipNetworks: - items: - properties: - networkName: - type: string - cidr: - type: string - v6cidr: - type: string - required: - - networkName - type: object - type: array - nodeNetworks: - items: - properties: - networkName: - type: string - cidrs: - type: array - items: - type: string - required: - - networkName - type: object - type: array - enableRhi: - type: boolean - enablePublicIP: - type: boolean - bgpPeerLabels: - items: - type: string - type: array - type: object - seGroup: - properties: - name: - type: string - type: object - required: - - name - l7Settings: - properties: - shardSize: - enum: - - SMALL - - MEDIUM - - LARGE - - DEDICATED - type: string - type: object - required: - - shardSize - type: object - status: - properties: - error: - type: string - status: - type: string - type: object - type: object - additionalPrinterColumns: - - description: status of the nas object - jsonPath: .status.status - name: Status - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - served: true - storage: true - subresources: - status: {} diff --git a/packages/ako-operator-v2/bundle/config/upstream/akooperator/deployment.yaml b/packages/ako-operator-v2/bundle/config/upstream/akooperator/deployment.yaml deleted file mode 100644 index bca2939ec8..0000000000 --- a/packages/ako-operator-v2/bundle/config/upstream/akooperator/deployment.yaml +++ /dev/null @@ -1,74 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: tkg-system-networking ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: tanzu-ako-operator - name: ako-operator-controller-manager - namespace: tkg-system-networking -spec: - replicas: 1 - selector: - matchLabels: - app: tanzu-ako-operator - template: - metadata: - labels: - app: tanzu-ako-operator - spec: - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - containers: - - args: - - --metrics-addr=:8080 - command: - - /manager - image: ako-operator:latest - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - env: - - name: bootstrap_cluster - value: "False" - - name: avi_control_plane_ha_provider - value: "False" - - name: control_plane_endpoint_port - value: "6443" - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - affinity: - nodeAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 10 - preference: - matchExpressions: - - key: node-role.kubernetes.io/control-plane - operator: Exists - #! remove once usage of node-role.kubernetes.io/master is removed from Kubernetes - - weight: 10 - preference: - matchExpressions: - - key: node-role.kubernetes.io/master - operator: Exists - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: webhook-server-cert diff --git a/packages/ako-operator-v2/bundle/config/upstream/akooperator/secret.yaml b/packages/ako-operator-v2/bundle/config/upstream/akooperator/secret.yaml deleted file mode 100644 index 760dc7268b..0000000000 --- a/packages/ako-operator-v2/bundle/config/upstream/akooperator/secret.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: avi-controller-credentials - namespace: tkg-system-networking -type: Opaque -data: - username: "" - password: "" ---- -apiVersion: v1 -kind: Secret -metadata: - name: avi-controller-ca - namespace: tkg-system-networking -type: Opaque -data: - certificateAuthorityData: "" diff --git a/packages/ako-operator-v2/bundle/config/upstream/akooperator/static.yaml b/packages/ako-operator-v2/bundle/config/upstream/akooperator/static.yaml deleted file mode 100644 index e0619014b2..0000000000 --- a/packages/ako-operator-v2/bundle/config/upstream/akooperator/static.yaml +++ /dev/null @@ -1,846 +0,0 @@ - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - name: akodeploymentconfigs.networking.tkg.tanzu.vmware.com -spec: - group: networking.tkg.tanzu.vmware.com - names: - kind: AKODeploymentConfig - listKind: AKODeploymentConfigList - plural: akodeploymentconfigs - shortNames: - - adc - singular: akodeploymentconfig - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: AKODeploymentConfig is the Schema for the akodeploymentconfigs - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AKODeploymentConfigSpec defines the desired state of an AKODeploymentConfig - AKODeploymentConfig describes the shared configurations for AKO deployments - across a set of Clusters. - properties: - adminCredentialRef: - description: "AdminCredentialRef points to a Secret resource which - includes the username and password to access and configure the Avi - Controller. \n * username Username used with basic - authentication for the Avi REST API - * password Password used with basic authentication - for the Avi REST API \n This credential - needs to be bound with admin tenant and will be used by AKO Operator - to automate configurations and operations." - properties: - name: - description: Name is the name of resource being referenced. - type: string - namespace: - description: Namespace of the resource being referenced. - type: string - required: - - name - - namespace - type: object - certificateAuthorityRef: - description: "CertificateAuthorityRef points to a Secret resource - that includes the AVI Controller's CA \n * certificateAuthorityData - \ PEM-encoded certificate authority certificates" - properties: - name: - description: Name is the name of resource being referenced. - type: string - namespace: - description: Namespace of the resource being referenced. - type: string - required: - - name - - namespace - type: object - cloudName: - description: CloudName speficies the AVI Cloud AKO will be deployed - with - type: string - clusterSelector: - description: Label selector for Clusters. The Clusters that are selected - by this will be the ones affected by this AKODeploymentConfig. It - must match the Cluster labels. This field is immutable. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: key is the label key that the selector applies - to. - type: string - operator: - description: operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - controlPlaneNetwork: - description: ControlPlaneNetwork describes the control plane network - of the clusters selected by an akoDeploymentConfig - properties: - cidr: - type: string - name: - type: string - required: - - cidr - - name - type: object - controller: - description: Controller is the AVI Controller endpoint to which AKO - talks to provision Load Balancer resources The format is [scheme://]address[:port] - * scheme http or https, defaults to https if - not specified * address IP - address of the AVI Controller specified - * port if not specified, use default port - for the corresponding scheme - type: string - controllerVersion: - description: ControllerVersion is the AVI Controller version which - AKO Operator and AKO talks to. this value can be auto detected and - corrected. - type: string - dataNetwork: - description: DataNetworks describes the Data Networks the AKO will - be deployed with. This field is immutable. - properties: - cidr: - type: string - ipPools: - items: - description: IPPool defines a contiguous range of IP Addresses - properties: - end: - description: End represents the ending IP address of the - pool. - type: string - start: - description: Start represents the starting IP address of - the pool. - type: string - type: - description: Type represents the type of IP Address - enum: - - V4 - type: string - required: - - end - - start - - type - type: object - type: array - name: - type: string - required: - - cidr - - name - type: object - extraConfigs: - description: ExtraConfigs contains extra configurations for AKO Deployment - properties: - apiServerPort: - description: ApiServerPort specifies Internal port for AKO's API - server for the liveness probe of the AKO pod default port is - 8080 - type: integer - blockedNamespaceList: - description: This is the list of system namespaces from which - AKO will not listen any Kubernetes object event. - items: - type: string - type: array - cniPlugin: - description: 'CniPlugin describes which cni plugin cluster is - using. default value is antrea, set this string if cluster cni - is other type. AKO supported CNI: antrea|calico|canal|flannel|openshift|ncp' - enum: - - antrea - - calico - - canal - - flannel - - openshift - - ncp - type: string - disableStaticRouteSync: - description: DisableStaticRouteSync describes ako should sync - static routing or not. If the POD networks are reachable from - the Avi SE, this should be to true. Otherwise, it should be - false. It would be true by default. - type: boolean - enableEVH: - description: EnableEVH specifies if you want to enable the Enhanced - Virtual Hosting Model in Avi Controller for the Virtual Services, - default value is false - type: boolean - enableEvents: - description: Defines Enable or disable Event broadcasting via - AKO - type: boolean - fullSyncFrequency: - description: FullSyncFrequency controls how often AKO polls the - Avi controller to update itself with cloud configurations. Default - value is 1800 - type: string - ingress: - description: IngressConfigs specifies ingress configuration for - ako - properties: - defaultIngressController: - description: DefaultIngressController bool describes ako is - the default ingress controller to use - type: boolean - disableIngressClass: - description: DisableIngressClass will prevent AKO Operator - to install AKO IngressClass into workload clusters for old - version of K8s - type: boolean - enableMCI: - description: Enabling this flag would tell AKO to start processing - multi-cluster ingress objects - type: boolean - noPGForSNI: - description: NoPGForSNI describes if you want to get rid of - poolgroups from SNI VSes. Do not use this flag, if you don't - want http caching, default value is false. - type: boolean - nodeNetworkList: - description: NodeNetworkList describes the details of network - and CIDRs are used in pool placement network for vcenter - cloud. Node Network details are not needed when in NodePort - mode / static routes are disabled / non vcenter clouds. - items: - properties: - cidrs: - description: Cidrs represents all the IP CIDRs in this - network - items: - type: string - type: array - networkName: - description: NetworkName is the name of this network - type: string - type: object - type: array - passthroughShardSize: - description: PassthroughShardSize controls the passthrough - virtualservice numbers Valid value should be SMALL, MEDIUM - or LARGE, default value is SMALL - enum: - - SMALL - - MEDIUM - - LARGE - type: string - serviceType: - description: ServiceType string describes ingress methods - for a service Valid value should be NodePort, ClusterIP - and NodePortLocal - enum: - - NodePort - - ClusterIP - - NodePortLocal - type: string - shardVSSize: - description: ShardVSSize describes ingress shared virtual - service size Valid value should be SMALL, MEDIUM, LARGE - or DEDICATED, default value is SMALL - enum: - - SMALL - - MEDIUM - - LARGE - - DEDICATED - type: string - type: object - ipFamily: - description: This flag can take values V4 or V6 (default V4) default - value is V4 - enum: - - V4 - - V6 - type: string - istioEnabled: - description: This flag needs to be enabled when AKO is be to brought - up in an Istio environment default value is false - type: boolean - l4Config: - description: IngressConfigs specifies L4 load balancer configuration - for ako - properties: - autoFQDN: - description: AutoFQDN controls the FQDN generation. Valid - value should be default(..), flat (-.) - or disabled, - enum: - - default - - flat - - disabled - type: string - defaultDomain: - description: DefaultDomain controls the default sub-domain - to use for L4 VSes when multiple sub-domains are configured - in the cloud. - type: string - type: object - layer7Only: - description: Layer7Only specifies if you want AKO only to do layer - 7 load balancing. default value is false - type: boolean - log: - description: Log specifies the configuration for AKO logging - properties: - logFile: - description: LogFile specifies the log file name - type: string - logLevel: - description: LogLevel specifies the AKO pod log level Valid - value should be INFO, DEBUG, WARN or ERROR, default value - is INFO - enum: - - INFO - - DEBUG - - WARN - - ERROR - type: string - mountPath: - description: MountPath specifies the path to mount PVC - type: string - persistentVolumeClaim: - description: PersistentVolumeClaim specifies if a PVC should - make for AKO logging - type: string - type: object - namespaceSelector: - description: NameSpaceSelector contains label key and value used - for namespace migration. Same label has to be present on namespace/s - which needs migration/sync to AKO - properties: - labelKey: - type: string - labelValue: - type: string - type: object - networksConfig: - description: NetworksConfig specifies the network configurations - for virtual services. - properties: - bgpPeerLabels: - description: BGPPeerLabels specifies BGP peers, this is used - for selective VsVip advertisement. - items: - type: string - type: array - enableRHI: - description: EnableRHI specifies cluster wide setting for - BGP peering. default value is false - type: boolean - nsxtT1LR: - description: T1 Logical Segment mapping for backend network. - Only applies to NSX-T cloud. - type: string - type: object - nodePortSelector: - description: NodePortSelector only applicable if serviceType is - NodePort - properties: - key: - type: string - value: - type: string - type: object - primaryInstance: - description: 'Defines AKO instance is primary or not. Value `true` - indicates that AKO instance is primary. In a multiple AKO deployment - in a cluster, only one AKO instance should be primary. Default - value: true.' - type: boolean - rbac: - description: Rbac specifies the configuration for AKO Rbac - properties: - pspEnabled: - description: PspEnabled enables the deployment of a PodSecurityPolicy - that grants AKO the proper role - type: boolean - pspPolicyAPIVersion: - description: PspPolicyAPIVersion decides the API version of - the PodSecurityPolicy - type: string - type: object - servicesAPI: - description: 'ServicesAPI specifies if enables AKO in services - API mode: https://kubernetes-sigs.github.io/service-apis/. Currently, - implemented only for L4. This flag uses the upstream GA APIs - which are not backward compatible with the advancedL4 APIs which - uses a fork and a version of v1alpha1pre1 default value is false' - type: boolean - useDefaultSecretsOnly: - description: If this flag is set to true, AKO will only handle - default secrets from the namespace where AKO is installed This - flag is applicable only to Openshift clusters default value - is false - type: boolean - vipPerNamespace: - description: Enabling this flag would tell AKO to create Parent - VS per Namespace in EVH mode default value is false - type: boolean - type: object - serviceEngineGroup: - description: ServiceEngineGroup is the group name of Service Engine - that's to be used by the set of AKO Deployments - type: string - tenant: - description: The AVI tenant for the current AKODeploymentConfig This - field is optional. - properties: - context: - description: Context is the type of AVI tenant context. Defaults - to Provider. This field is immutable. - enum: - - Provider - - Tenant - type: string - name: - description: Name is the name of the tenant. This field is immutable. - type: string - required: - - name - type: object - workloadCredentialRef: - description: "WorkloadCredentialRef points to a Secret resource which - includes the username and password to access and configure the Avi - Controller. \n * username Username used with basic - authentication for the Avi REST API - * password Password used with basic authentication - for the Avi REST API \n This field - is optional. When it's not specified, username/password will be - automatically generated for each Cluster and Tenant needs to be - non-nil in this case." - properties: - name: - description: Name is the name of resource being referenced. - type: string - namespace: - description: Namespace of the resource being referenced. - type: string - required: - - name - - namespace - type: object - required: - - adminCredentialRef - - certificateAuthorityRef - - cloudName - - controller - - dataNetwork - - serviceEngineGroup - type: object - status: - description: AKODeploymentConfigStatus defines the observed state of AKODeploymentConfig - properties: - conditions: - description: Conditions defines current state of the AKODeploymentConfig. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - observedGeneration: - description: ObservedGeneration reflects the generation of the most - recently observed AKODeploymentConfig. - format: int64 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - app: tanzu-ako-operator - name: ako-operator-leader-election-role - namespace: tkg-system-networking -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: tanzu-ako-operator - name: ako-operator-manager-role -rules: -- apiGroups: - - "" - resources: - - services - - services/status - - endpoints - - endpoints/status - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - addons.cluster.x-k8s.io - resources: - - clusterresourcesets - - clusterresourcesets/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - update - - watch -- apiGroups: - - networking.tkg.tanzu.vmware.com - resources: - - akodeploymentconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - networking.tkg.tanzu.vmware.com - resources: - - akodeploymentconfigs/status - verbs: - - get - - patch - - update -- apiGroups: - - ako.vmware.com - resources: - - aviinfrasettings - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - run.tanzu.vmware.com - resources: - - clusterbootstraps - - clusterbootstraps/status - - tanzukubernetesreleases - - tanzukubernetesreleases/status - verbs: - - get - - list - - watch - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: tanzu-ako-operator - name: ako-operator-metrics-reader -rules: -- nonResourceURLs: - - /metrics - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - app: tanzu-ako-operator - name: ako-operator-leader-election-rolebinding - namespace: tkg-system-networking -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: ako-operator-leader-election-role -subjects: -- kind: ServiceAccount - name: default - namespace: tkg-system-networking ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app: tanzu-ako-operator - name: ako-operator-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: ako-operator-manager-role -subjects: -- kind: ServiceAccount - name: default - namespace: tkg-system-networking - ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app: tanzu-ako-operator - name: ako-operator-webhook-service - namespace: tkg-system-networking -spec: - ports: - - port: 443 - targetPort: 9443 - selector: - app: tanzu-ako-operator - ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - app: tanzu-ako-operator - name: ako-operator-serving-cert - namespace: tkg-system-networking -spec: - dnsNames: - - ako-operator-webhook-service.tkg-system-networking.svc - - ako-operator-webhook-service.tkg-system-networking.svc.cluster.local - issuerRef: - kind: Issuer - name: ako-operator-selfsigned-issuer - secretName: webhook-server-cert ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - app: tanzu-ako-operator - name: ako-operator-selfsigned-issuer - namespace: tkg-system-networking -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: tkg-system-networking/ako-operator-serving-cert - labels: - app: tanzu-ako-operator - name: ako-operator-mutating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1alpha1 - clientConfig: - service: - name: ako-operator-webhook-service - namespace: tkg-system-networking - path: /validate-networking-tkg-tanzu-vmware-com-v1alpha1-akodeploymentconfig - failurePolicy: Fail - name: vakodeploymentconfig.kb.io - rules: - - apiGroups: - - networking.tkg.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - akodeploymentconfigs - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: tkg-system-networking/ako-operator-serving-cert - labels: - app: tanzu-ako-operator - name: ako-operator-validating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1alpha1 - clientConfig: - service: - name: ako-operator-webhook-service - namespace: tkg-system-networking - path: /validate-networking-tkg-tanzu-vmware-com-v1alpha1-akodeploymentconfig - failurePolicy: Fail - name: vakodeploymentconfig.kb.io - rules: - - apiGroups: - - networking.tkg.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - akodeploymentconfigs - sideEffects: None diff --git a/packages/ako-operator-v2/bundle/config/values.star b/packages/ako-operator-v2/bundle/config/values.star deleted file mode 100644 index 0695049d07..0000000000 --- a/packages/ako-operator-v2/bundle/config/values.star +++ /dev/null @@ -1,5 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:assert", "assert") - -# export -values = data.values diff --git a/packages/ako-operator-v2/bundle/config/values.yaml b/packages/ako-operator-v2/bundle/config/values.yaml deleted file mode 100644 index a16e563c9e..0000000000 --- a/packages/ako-operator-v2/bundle/config/values.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -akoOperator: - avi_enable: false - namespace: tkg-system-networking - cluster_name: "" - on_bootstrap_cluster: false - config: - avi_admin_credential_name: avi-controller-credentials - avi_ca_name: avi-controller-ca - avi_controller: "" - avi_controller_version: "" - avi_username: "" - avi_password: "" - avi_ca_data_b64: "" - avi_cloud_name: "" - avi_service_engine_group: "" - avi_management_cluster_service_engine_group: null - avi_data_network: "" - avi_data_network_cidr: "" - avi_control_plane_network: "" - avi_control_plane_network_cidr: "" - avi_management_cluster_vip_network_name: "" - avi_management_cluster_vip_network_cidr: "" - avi_management_cluster_control_plane_vip_network_name: "" - avi_management_cluster_control_plane_vip_network_cidr: "" - avi_labels: '""' - avi_cni_plugin: "" - avi_control_plane_ha_provider: false - avi_control_plane_endpoint_port: 6443 - avi_nsxt_t1_lr: null - avi_disable_ingress_class: true - avi_disable_static_route_sync: false - avi_ingress_default_ingress_controller: false - avi_ingress_shard_vs_size: "" - avi_ingress_service_type: "" - avi_ingress_node_network_list: '""' diff --git a/packages/ako-operator-v2/kbld-config.yaml b/packages/ako-operator-v2/kbld-config.yaml deleted file mode 100644 index bb6e8146b8..0000000000 --- a/packages/ako-operator-v2/kbld-config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: kbld.k14s.io/v1alpha1 -kind: Config -overrides: - - image: ako-operator:latest - newImage: "projects-stg.registry.vmware.com/tkg/sandbox/ako-operator:v1.7.0_vmware.1" diff --git a/packages/ako-operator-v2/metadata.yaml b/packages/ako-operator-v2/metadata.yaml deleted file mode 100644 index ce1aa2378d..0000000000 --- a/packages/ako-operator-v2/metadata.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: ako-operator-v2.tanzu.vmware.com -spec: - displayName: "ako-operator-v2" - longDescription: "NSX Advanced Load Balancer using ako-operator" - shortDescription: "NSX Advanced Load Balancer using ako-operator" - providerName: VMware - maintainers: - - name: Xudong Liu - - name: Lubron Zhan - - name: Chen Lin - categories: - - "networking" diff --git a/packages/ako-operator-v2/package.yaml b/packages/ako-operator-v2/package.yaml deleted file mode 100644 index e195037963..0000000000 --- a/packages/ako-operator-v2/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: ako-operator-v2.tanzu.vmware.com - namespace: ako-operator-v2 -spec: - refName: ako-operator-v2.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/ako-operator-v2/vendir.lock.yml b/packages/ako-operator-v2/vendir.lock.yml deleted file mode 100644 index 96a4894c49..0000000000 --- a/packages/ako-operator-v2/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/ako-operator-v2/vendir.yml b/packages/ako-operator-v2/vendir.yml deleted file mode 100644 index 68e298be68..0000000000 --- a/packages/ako-operator-v2/vendir.yml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -## There are local files we don't want to overwrite -## But vendir sync will overwrite unless we separate files in different sub directories in below section, which is time consuming -## Keep below for future update -# directories: -# - path: bundle/config -# contents: -# - path: . -# git: -# url: git@github.com:vmware-tanzu/tce.git -# ref: 8fa1eddbee7864510faf26e545b01e29ac966be5 -# newRootPath: addons/packages/ako-operator/1.7.0/bundle/config -# includePaths: -# - addons/packages/ako-operator/1.7.0/bundle/config/**/* -# - path: metadata.yaml -# contents: -# - path: . -# git: -# url: git@github.com:vmware-tanzu/tce.git -# ref: 8fa1eddbee7864510faf26e545b01e29ac966be5 -# newRootPath: addons/packages/ako-operator/metadata.yaml -# includePaths: -# - addons/packages/ako-operator/metadata.yaml diff --git a/packages/cliplugins/Makefile b/packages/cliplugins/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/cliplugins/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/cliplugins/README.md b/packages/cliplugins/README.md deleted file mode 100644 index 4307d3ea25..0000000000 --- a/packages/cliplugins/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# cliplugins Package - -This package provides the `CLIPlugin` CRD that defines the CLIPlugin resource which is used to define CLIPlugins used by the Tanzu CLI when talking to a management cluster. This is a required package that needs to be installed on each management cluster so that the Tanzu CLI can understand the recommended set of plugins to use when talking to the cluster. - -## Components - -* CLIPlugin CRD - -## Details - -To learn more about the CLIPlugins and how it is getting used with Tanzu CLI, refer to this [doc](../../docs/design/context-aware-plugin-discovery-design.md) diff --git a/packages/cliplugins/bundle/config/cliplugin-crd.yaml b/packages/cliplugins/bundle/config/cliplugin-crd.yaml deleted file mode 100644 index 0263ace9dc..0000000000 --- a/packages/cliplugins/bundle/config/cliplugin-crd.yaml +++ /dev/null @@ -1,115 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") - -#@ if data.values.deployCLIPluginCRD: - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - kapp.k14s.io/change-group: "cliplugins.cli.tanzu.vmware.com/crd" - creationTimestamp: null - name: cliplugins.cli.tanzu.vmware.com -spec: - group: cli.tanzu.vmware.com - names: - kind: CLIPlugin - listKind: CLIPluginList - plural: cliplugins - singular: cliplugin - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: CLIPlugin denotes a Tanzu cli plugin. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: CLIPluginSpec defines the desired state of CLIPlugin. - properties: - artifacts: - additionalProperties: - description: ArtifactList contains an Artifact object for every - supported platform of a version. - items: - description: Artifact points to an individual plugin binary specific - to a version and platform. - properties: - arch: - description: Arch is CPU architecture of the plugin binary - in `GOARCH` format. - type: string - digest: - description: SHA256 hash of the plugin binary. - type: string - image: - description: Image is a fully qualified OCI image for the - plugin binary. - type: string - os: - description: OS of the plugin binary in `GOOS` format. - type: string - type: - description: Type of the binary artifact. Valid values are - S3, GCP, OCIImage. - type: string - uri: - description: AssetURI is a URI of the plugin binary. This - can be a fully qualified HTTP path or a local path. - type: string - required: - - arch - - os - - type - type: object - type: array - description: Artifacts contains an artifact list for every supported - version. - type: object - description: - description: Description is the plugin's description. - type: string - optional: - description: Optional specifies whether the plugin is mandatory or - optional If optional, the plugin will not get auto-downloaded as - part of `tanzu login` or `tanzu plugin sync` command To view the - list of plugin, user can use `tanzu plugin list` and to download - a specific plugin run, `tanzu plugin install ` - type: boolean - recommendedVersion: - description: Recommended version that Tanzu CLI should use if available. - The value should be a valid semantic version as defined in https://semver.org/. - E.g., 2.0.1 - type: string - target: - description: Target specifies the target of the plugin. Only needed - for standalone plugins - type: string - required: - - artifacts - - description - - optional - - recommendedVersion - type: object - required: - - metadata - - spec - type: object - served: true - storage: true - -#@ end diff --git a/packages/cliplugins/bundle/config/values.yaml b/packages/cliplugins/bundle/config/values.yaml deleted file mode 100644 index b313602935..0000000000 --- a/packages/cliplugins/bundle/config/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True - ---- -deployCLIPluginCRD: true diff --git a/packages/cliplugins/metadata.yaml b/packages/cliplugins/metadata.yaml deleted file mode 100644 index d3c69ebc93..0000000000 --- a/packages/cliplugins/metadata.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: cliplugins.tanzu.vmware.com -spec: - displayName: "cliplugins" - longDescription: "CLIPlugins package provides the CLIPlugin CRD" - shortDescription: "CLIPlugin management" - providerName: VMware - maintainers: - - name: "Anuj Chaudhari" - categories: - - "cliplugins" diff --git a/packages/cliplugins/package.yaml b/packages/cliplugins/package.yaml deleted file mode 100644 index 1b310da7fb..0000000000 --- a/packages/cliplugins/package.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: cliplugins.tanzu.vmware.com -spec: - refName: cliplugins.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true diff --git a/packages/cliplugins/vendir.lock.yml b/packages/cliplugins/vendir.lock.yml deleted file mode 100644 index 96a4894c49..0000000000 --- a/packages/cliplugins/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/cliplugins/vendir.yml b/packages/cliplugins/vendir.yml deleted file mode 100644 index 963f250148..0000000000 --- a/packages/cliplugins/vendir.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 diff --git a/packages/cluster-api-bootstrap-kubeadm/Makefile b/packages/cluster-api-bootstrap-kubeadm/Makefile deleted file mode 100644 index 047b729714..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/cluster-api-bootstrap-kubeadm/README.md b/packages/cluster-api-bootstrap-kubeadm/README.md deleted file mode 100644 index ccd3e2fb9c..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# cluster-api-bootstrap-kubeadm Package - -This package provides the cluster API kubeadm boostrap provider which generates -the cluster certificates, initializes the control plane, and joins control -plane and worker nodes to the cluster. -[cluster-api bootstrap provider](https://cluster-api.sigs.k8s.io/user/concepts.html#bootstrap-provider). - -## Components - -* capi-kubeadm-bootstrap-controller-manager - -## Usage Example - -To learn more about cluster-api visit . diff --git a/packages/cluster-api-bootstrap-kubeadm/bundle/config/overlay/add-bootstrap-token-ttl.yaml b/packages/cluster-api-bootstrap-kubeadm/bundle/config/overlay/add-bootstrap-token-ttl.yaml deleted file mode 100644 index ecbb0dc300..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/bundle/config/overlay/add-bootstrap-token-ttl.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "capi-kubeadm-bootstrap-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - args: - #@overlay/match by=overlay.index(3) - #@overlay/replace - - --bootstrap-token-ttl=${CAPBK_BOOTSTRAP_TOKEN_TTL:=15m} diff --git a/packages/cluster-api-bootstrap-kubeadm/bundle/config/upstream/bootstrap-components.yaml b/packages/cluster-api-bootstrap-kubeadm/bundle/config/upstream/bootstrap-components.yaml deleted file mode 100644 index e227cd43a4..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/bundle/config/upstream/bootstrap-components.yaml +++ /dev/null @@ -1,6529 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - control-plane: controller-manager - name: capi-kubeadm-bootstrap-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-bootstrap-system/capi-kubeadm-bootstrap-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: kubeadmconfigs.bootstrap.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: bootstrap.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: KubeadmConfig - listKind: KubeadmConfigList - plural: kubeadmconfigs - singular: kubeadmconfig - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: KubeadmConfig is the Schema for the kubeadmconfigs API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. - Either ClusterConfiguration and InitConfiguration should be defined - or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are - the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server - control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names - for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to - the control plane component. TODO: This is temporary and - ideally we would like to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will - be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where - hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that - we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look - for all required certificates. NB: if not provided, this will - default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or - DNS name for the control plane; it can be a valid IP address - or a RFC-1123 DNS subdomain, both with optional TCP port. In - case the ControlPlaneEndpoint is not specified, the AdvertiseAddress - + BindPort are used; in case the ControlPlaneEndpoint is specified - but without a TCP port, the BindPort is used. Possible usages - are: e.g. In a cluster with more than one control plane instances, - this field should be assigned the address of the external load - balancer in front of the control plane instances. e.g. in environments - with enforced node recycling, the ControlPlaneEndpoint could - be used for assigning a stable DNS to the control plane. NB: - This value defaults to the first value in the Cluster object - status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the - controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to - the control plane component. TODO: This is temporary and - ideally we would like to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will - be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where - hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed - in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, the ImageRepository defined - in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. - In case this value is set, kubeadm does not change automatically - the version of the above components during upgrades. - type: string - type: - description: Type defines the DNS add-on to be used - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value - defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external - etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file - used to secure etcd communication. Required if using - a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used - to secure etcd communication. Required if using a TLS - connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure - etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring - the local etcd instance Local and External are mutually - exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place - its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to - the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the - image. In case this value is set, kubeadm does not change - automatically the version of the above components during - upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative - Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative - Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull - images from. If empty, `k8s.gcr.io` will be used by default; - in case of kubernetes version is a CI build (kubernetes version - starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` - will be used as a default for control plane components and for - kube-proxy, while `k8s.gcr.io` will be used for all the other - images. - type: string - kind: - description: 'Kind is a string value representing the REST resource - this object represents. Servers may infer this from the endpoint - the client submits requests to. Cannot be updated. In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control - plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking - topology of the cluster. NB: This value defaults to the Cluster - object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. - Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, - the API server will not allocate CIDR ranges for every node. - Defaults to a comma-delimited string of the Cluster object's - spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. - Defaults to a comma-delimited string of the Cluster object's - spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" - if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler - control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to - the control plane component. TODO: This is temporary and - ideally we would like to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will - be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where - hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - useHyperKubeImage: - description: UseHyperKubeImage controls if hyperkube should be - used for Kubernetes components instead of their respective separate - images - type: boolean - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition - tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to - setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the - command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be - used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite - any existing filesystem. If true, any pre-existing file - system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. - The valid options are: "auto|any", "auto", "any", "none", - and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for - Microsoft Azure that instructs cloud-init to replace a - file system of . NOTE: unless you define a label, - this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to - setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is - true, a single partition will be created for the entire - device. When layout is false, it means don't partition - or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks - and create the partition if a partition or filesystem - is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition - table. The following are supported: ''mbr'': default and - setups a MS-DOS partition table ''gpt'': setups a GPT - partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data - upon creation. - items: - description: File defines the input for generating write_files in - cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to - populate the file. - properties: - secret: - description: Secret represents a secret that should populate - this file. - properties: - key: - description: Key is the key in the secret's data map - for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. - "root:root". - type: string - path: - description: Path specifies the full path on disk where to store - the file. - type: string - permissions: - description: Permissions specifies the permissions to assign - to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are - the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time - and describes a set of Bootstrap Tokens to create. This information - IS NOT uploaded to the kubeadm cluster configmap, partly because - of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored - as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why - this token exists and what it's used for, so other administrators - can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token - expires. Defaults to being set dynamically at runtime - based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this - token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional - trust between nodes and control-planes. Used for joining - nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. - Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token - can be used. Can by default be used for establishing bidirectional - trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource - this object represents. Servers may infer this from the endpoint - the client submits requests to. Cannot be updated. In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API - server instance that's deployed on this control plane node In - HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint - in the sense that ControlPlaneEndpoint is the global endpoint - for the cluster, which then loadbalances the requests to each - individual API server. This configuration object lets you customize - what IP/DNS name and port the local API server advertises it's - accessible on. By default, kubeadm tries to auto-detect the - IP of the default interface and use that, but in case that process - fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the - API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server - to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering - the new control-plane node to the cluster. When used in the - context of control plane nodes, NodeRegistration should remain - consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node API - object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the kubelet - command line via the environment file kubeadm writes at - runtime for the kubelet to source. This overrides the generic - base-level configuration in the kubelet-config-1.X ConfigMap - Flags have higher priority when parsing. These values are - local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node - API object that will be created in this `kubeadm init` or - `kubeadm join` operation. This field is also used in the - CommonName field of the kubelet's client certificate to - the API server. Defaults to the hostname of the node if - not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object - should be registered with. If this field is unset, i.e. - nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. If - you don''t want to taint your control-plane node, set this - field to an empty slice, i.e. `taints: {}` in the YAML file. - This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the - "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods - that do not tolerate the taint. Valid effects are - NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to - a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint - key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the - join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority - used to secure comunications between node and control-plane. - Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when - there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane - instance to be deployed on the joining node. If nil, no additional - control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the - API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for - the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API - Server to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet - to use during the TLS Bootstrap process TODO: revisit when there - is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for - bootstrap token based discovery BootstrapToken and File - are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name - to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key - pins to verify when token-based discovery is used. The - root CA found during discovery must match one of these - values. Specifying an empty set disables root CA pinning, - which can be unsafe. Each hash is specified as ":", - where the only currently supported type is "sha256". - This is a hex-encoded SHA-256 hash of the Subject Public - Key Info (SPKI) object in DER-encoded ASN.1. These hashes - can be calculated using, for example, OpenSSL: openssl - x509 -pubkey -in ca.crt openssl rsa -pubin -outform - der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster - information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based - discovery without CA verification via CACertHashes. - This can weaken the security of kubeadm since other - nodes can impersonate the control-plane. - type: boolean - required: - - token - - unsafeSkipCAVerification - type: object - file: - description: File is used to specify a file or URL to a kubeconfig - file from which to load cluster information BootstrapToken - and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual - file path or URL to the kubeconfig file from which to - load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: 'TLSBootstrapToken is a token used for TLS bootstrapping. - If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, - but can be overridden. If .File is set, this field **must - be set** in case the KubeConfigFile does not contain any - other authentication information TODO: revisit when there - is defaulting from k/k' - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource - this object represents. Servers may infer this from the endpoint - the client submits requests to. Cannot be updated. In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering - the new control-plane node to the cluster. When used in the - context of control plane nodes, NodeRegistration should remain - consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node API - object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the kubelet - command line via the environment file kubeadm writes at - runtime for the kubelet to source. This overrides the generic - base-level configuration in the kubelet-config-1.X ConfigMap - Flags have higher priority when parsing. These values are - local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node - API object that will be created in this `kubeadm init` or - `kubeadm join` operation. This field is also used in the - CommonName field of the kubelet's client certificate to - the API server. Defaults to the hostname of the node if - not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object - should be registered with. If this field is unset, i.e. - nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. If - you don''t want to taint your control-plane node, set this - field to an empty slice, i.e. `taints: {}` in the YAML file. - This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the - "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods - that do not tolerate the taint. Valid effects are - NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to - a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint - key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after - kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before - kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command - with a shell script with retries for joins. \n This is meant to - be an experimental temporary workaround on some environments where - joins fail due to timing (and other issues). The long term goal - is to add retries to kubeadm proper and use that functionality. - \n This will add about 40KB to userdata \n For more information, - refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the - user - type: string - homeDir: - description: HomeDir specifies the home directory to use for - the user - type: string - inactive: - description: Inactive specifies whether to mark the user as - inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should - be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group for the - user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized - keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. - It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - status: - description: KubeadmConfigStatus defines the observed state of KubeadmConfig. - properties: - bootstrapData: - description: "BootstrapData will be a cloud-init script for now. \n - Deprecated: Switch to DataSecretName." - format: byte - type: string - conditions: - description: Conditions defines current service state of the KubeadmConfig. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - dataSecretName: - description: DataSecretName is the name of the secret that stores - the bootstrap data script. - type: string - failureMessage: - description: FailureMessage will be set on non-retryable errors - type: string - failureReason: - description: FailureReason will be set on non-retryable errors - type: string - observedGeneration: - description: ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - ready: - description: Ready indicates the BootstrapData field is ready to be - consumed - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmConfig - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: KubeadmConfig is the Schema for the kubeadmconfigs API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. - Either ClusterConfiguration and InitConfiguration should be defined - or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are - the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server - control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names - for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to - the control plane component. TODO: This is temporary and - ideally we would like to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will - be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where - hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that - we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look - for all required certificates. NB: if not provided, this will - default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or - DNS name for the control plane; it can be a valid IP address - or a RFC-1123 DNS subdomain, both with optional TCP port. In - case the ControlPlaneEndpoint is not specified, the AdvertiseAddress - + BindPort are used; in case the ControlPlaneEndpoint is specified - but without a TCP port, the BindPort is used. Possible usages - are: e.g. In a cluster with more than one control plane instances, - this field should be assigned the address of the external load - balancer in front of the control plane instances. e.g. in environments - with enforced node recycling, the ControlPlaneEndpoint could - be used for assigning a stable DNS to the control plane. NB: - This value defaults to the first value in the Cluster object - status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the - controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to - the control plane component. TODO: This is temporary and - ideally we would like to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will - be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where - hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed - in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, the ImageRepository defined - in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. - In case this value is set, kubeadm does not change automatically - the version of the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value - defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external - etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file - used to secure etcd communication. Required if using - a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used - to secure etcd communication. Required if using a TLS - connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure - etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring - the local etcd instance Local and External are mutually - exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place - its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to - the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the - image. In case this value is set, kubeadm does not change - automatically the version of the above components during - upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative - Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative - Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull - images from. If empty, `registry.k8s.io` will be used by default; - in case of kubernetes version is a CI build (kubernetes version - starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` - will be used as a default for control plane components and for - kube-proxy, while `registry.k8s.io` will be used for all the - other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource - this object represents. Servers may infer this from the endpoint - the client submits requests to. Cannot be updated. In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control - plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking - topology of the cluster. NB: This value defaults to the Cluster - object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. - Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, - the API server will not allocate CIDR ranges for every node. - Defaults to a comma-delimited string of the Cluster object's - spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. - Defaults to a comma-delimited string of the Cluster object's - spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" - if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler - control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to - the control plane component. TODO: This is temporary and - ideally we would like to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will - be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where - hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition - tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to - setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the - command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be - used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite - any existing filesystem. If true, any pre-existing file - system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. - The valid options are: "auto|any", "auto", "any", "none", - and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for - Microsoft Azure that instructs cloud-init to replace a - file system of . NOTE: unless you define a label, - this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to - setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is - true, a single partition will be created for the entire - device. When layout is false, it means don't partition - or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks - and create the partition if a partition or filesystem - is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition - table. The following are supported: ''mbr'': default and - setups a MS-DOS partition table ''gpt'': setups a GPT - partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data - upon creation. - items: - description: File defines the input for generating write_files in - cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to - populate the file. - properties: - secret: - description: Secret represents a secret that should populate - this file. - properties: - key: - description: Key is the key in the secret's data map - for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. - "root:root". - type: string - path: - description: Path specifies the full path on disk where to store - the file. - type: string - permissions: - description: Permissions specifies the permissions to assign - to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are - the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time - and describes a set of Bootstrap Tokens to create. This information - IS NOT uploaded to the kubeadm cluster configmap, partly because - of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored - as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why - this token exists and what it's used for, so other administrators - can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token - expires. Defaults to being set dynamically at runtime - based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this - token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional - trust between nodes and control-planes. Used for joining - nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. - Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token - can be used. Can by default be used for establishing bidirectional - trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource - this object represents. Servers may infer this from the endpoint - the client submits requests to. Cannot be updated. In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API - server instance that's deployed on this control plane node In - HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint - in the sense that ControlPlaneEndpoint is the global endpoint - for the cluster, which then loadbalances the requests to each - individual API server. This configuration object lets you customize - what IP/DNS name and port the local API server advertises it's - accessible on. By default, kubeadm tries to auto-detect the - IP of the default interface and use that, but in case that process - fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the - API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server - to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering - the new control-plane node to the cluster. When used in the - context of control plane nodes, NodeRegistration should remain - consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node API - object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight - errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the kubelet - command line via the environment file kubeadm writes at - runtime for the kubelet to source. This overrides the generic - base-level configuration in the kubelet-config-1.X ConfigMap - Flags have higher priority when parsing. These values are - local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node - API object that will be created in this `kubeadm init` or - `kubeadm join` operation. This field is also used in the - CommonName field of the kubelet's client certificate to - the API server. Defaults to the hostname of the node if - not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object - should be registered with. If this field is unset, i.e. - nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. If - you don''t want to taint your control-plane node, set this - field to an empty slice, i.e. `taints: {}` in the YAML file. - This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the - "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods - that do not tolerate the taint. Valid effects are - NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to - a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint - key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the - join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority - used to secure comunications between node and control-plane. - Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when - there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane - instance to be deployed on the joining node. If nil, no additional - control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the - API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for - the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API - Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet - to use during the TLS Bootstrap process TODO: revisit when there - is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for - bootstrap token based discovery BootstrapToken and File - are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name - to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key - pins to verify when token-based discovery is used. The - root CA found during discovery must match one of these - values. Specifying an empty set disables root CA pinning, - which can be unsafe. Each hash is specified as ":", - where the only currently supported type is "sha256". - This is a hex-encoded SHA-256 hash of the Subject Public - Key Info (SPKI) object in DER-encoded ASN.1. These hashes - can be calculated using, for example, OpenSSL: openssl - x509 -pubkey -in ca.crt openssl rsa -pubin -outform - der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster - information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based - discovery without CA verification via CACertHashes. - This can weaken the security of kubeadm since other - nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to a kubeconfig - file from which to load cluster information BootstrapToken - and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual - file path or URL to the kubeconfig file from which to - load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS bootstrapping. - If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, - but can be overridden. If .File is set, this field **must - be set** in case the KubeConfigFile does not contain any - other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource - this object represents. Servers may infer this from the endpoint - the client submits requests to. Cannot be updated. In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering - the new control-plane node to the cluster. When used in the - context of control plane nodes, NodeRegistration should remain - consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node API - object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight - errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the kubelet - command line via the environment file kubeadm writes at - runtime for the kubelet to source. This overrides the generic - base-level configuration in the kubelet-config-1.X ConfigMap - Flags have higher priority when parsing. These values are - local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node - API object that will be created in this `kubeadm init` or - `kubeadm join` operation. This field is also used in the - CommonName field of the kubelet's client certificate to - the API server. Defaults to the hostname of the node if - not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object - should be registered with. If this field is unset, i.e. - nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. If - you don''t want to taint your control-plane node, set this - field to an empty slice, i.e. `taints: {}` in the YAML file. - This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the - "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods - that do not tolerate the taint. Valid effects are - NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to - a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint - key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after - kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before - kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command - with a shell script with retries for joins. \n This is meant to - be an experimental temporary workaround on some environments where - joins fail due to timing (and other issues). The long term goal - is to add retries to kubeadm proper and use that functionality. - \n This will add about 40KB to userdata \n For more information, - refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the - user - type: string - homeDir: - description: HomeDir specifies the home directory to use for - the user - type: string - inactive: - description: Inactive specifies whether to mark the user as - inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should - be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group for the - user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized - keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. - It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - status: - description: KubeadmConfigStatus defines the observed state of KubeadmConfig. - properties: - conditions: - description: Conditions defines current service state of the KubeadmConfig. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - dataSecretName: - description: DataSecretName is the name of the secret that stores - the bootstrap data script. - type: string - failureMessage: - description: FailureMessage will be set on non-retryable errors - type: string - failureReason: - description: FailureReason will be set on non-retryable errors - type: string - observedGeneration: - description: ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - ready: - description: Ready indicates the BootstrapData field is ready to be - consumed - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .metadata.labels['cluster\.x-k8s\.io/cluster-name'] - name: Cluster - type: string - - description: Time duration since creation of KubeadmConfig - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: KubeadmConfig is the Schema for the kubeadmconfigs API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. - Either ClusterConfiguration and InitConfiguration should be defined - or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are - the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server - control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names - for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to - the control plane component. TODO: This is temporary and - ideally we would like to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will - be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where - hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that - we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look - for all required certificates. NB: if not provided, this will - default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or - DNS name for the control plane; it can be a valid IP address - or a RFC-1123 DNS subdomain, both with optional TCP port. In - case the ControlPlaneEndpoint is not specified, the AdvertiseAddress - + BindPort are used; in case the ControlPlaneEndpoint is specified - but without a TCP port, the BindPort is used. Possible usages - are: e.g. In a cluster with more than one control plane instances, - this field should be assigned the address of the external load - balancer in front of the control plane instances. e.g. in environments - with enforced node recycling, the ControlPlaneEndpoint could - be used for assigning a stable DNS to the control plane. NB: - This value defaults to the first value in the Cluster object - status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the - controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to - the control plane component. TODO: This is temporary and - ideally we would like to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will - be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where - hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed - in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, the ImageRepository defined - in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. - In case this value is set, kubeadm does not change automatically - the version of the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value - defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external - etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file - used to secure etcd communication. Required if using - a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used - to secure etcd communication. Required if using a TLS - connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure - etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring - the local etcd instance Local and External are mutually - exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place - its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to - the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the - image. In case this value is set, kubeadm does not change - automatically the version of the above components during - upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative - Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative - Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull - images from. If empty, `registry.k8s.io` will be used by default; - in case of kubernetes version is a CI build (kubernetes version - starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` - will be used as a default for control plane components and for - kube-proxy, while `registry.k8s.io` will be used for all the - other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource - this object represents. Servers may infer this from the endpoint - the client submits requests to. Cannot be updated. In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control - plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking - topology of the cluster. NB: This value defaults to the Cluster - object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. - Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, - the API server will not allocate CIDR ranges for every node. - Defaults to a comma-delimited string of the Cluster object's - spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. - Defaults to a comma-delimited string of the Cluster object's - spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" - if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler - control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to - the control plane component. TODO: This is temporary and - ideally we would like to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will - be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where - hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition - tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to - setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the - command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be - used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite - any existing filesystem. If true, any pre-existing file - system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. - The valid options are: "auto|any", "auto", "any", "none", - and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for - Microsoft Azure that instructs cloud-init to replace a - file system of . NOTE: unless you define a label, - this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to - setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is - true, a single partition will be created for the entire - device. When layout is false, it means don't partition - or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks - and create the partition if a partition or filesystem - is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition - table. The following are supported: ''mbr'': default and - setups a MS-DOS partition table ''gpt'': setups a GPT - partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data - upon creation. - items: - description: File defines the input for generating write_files in - cloud-init. - properties: - append: - description: Append specifies whether to append Content to existing - file if Path exists. - type: boolean - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to - populate the file. - properties: - secret: - description: Secret represents a secret that should populate - this file. - properties: - key: - description: Key is the key in the secret's data map - for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. - "root:root". - type: string - path: - description: Path specifies the full path on disk where to store - the file. - type: string - permissions: - description: Permissions specifies the permissions to assign - to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - - ignition - type: string - ignition: - description: Ignition contains Ignition specific configuration. - properties: - containerLinuxConfig: - description: ContainerLinuxConfig contains CLC specific configuration. - properties: - additionalConfig: - description: "AdditionalConfig contains additional configuration - to be merged with the Ignition configuration generated by - the bootstrapper controller. More info: https://coreos.github.io/ignition/operator-notes/#config-merging - \n The data format is documented here: https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/" - type: string - strict: - description: Strict controls if AdditionalConfig should be - strictly parsed. If so, warnings are treated as errors. - type: boolean - type: object - type: object - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are - the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time - and describes a set of Bootstrap Tokens to create. This information - IS NOT uploaded to the kubeadm cluster configmap, partly because - of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored - as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why - this token exists and what it's used for, so other administrators - can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token - expires. Defaults to being set dynamically at runtime - based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this - token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional - trust between nodes and control-planes. Used for joining - nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. - Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token - can be used. Can by default be used for establishing bidirectional - trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource - this object represents. Servers may infer this from the endpoint - the client submits requests to. Cannot be updated. In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API - server instance that's deployed on this control plane node In - HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint - in the sense that ControlPlaneEndpoint is the global endpoint - for the cluster, which then loadbalances the requests to each - individual API server. This configuration object lets you customize - what IP/DNS name and port the local API server advertises it's - accessible on. By default, kubeadm tries to auto-detect the - IP of the default interface and use that, but in case that process - fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the - API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server - to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering - the new control-plane node to the cluster. When used in the - context of control plane nodes, NodeRegistration should remain - consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node API - object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight - errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the kubelet - command line via the environment file kubeadm writes at - runtime for the kubelet to source. This overrides the generic - base-level configuration in the kubelet-config-1.X ConfigMap - Flags have higher priority when parsing. These values are - local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node - API object that will be created in this `kubeadm init` or - `kubeadm join` operation. This field is also used in the - CommonName field of the kubelet's client certificate to - the API server. Defaults to the hostname of the node if - not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object - should be registered with. If this field is unset, i.e. - nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. If - you don''t want to taint your control-plane node, set this - field to an empty slice, i.e. `taints: {}` in the YAML file. - This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the - "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods - that do not tolerate the taint. Valid effects are - NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to - a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint - key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying patches - to components deployed by kubeadm during "kubeadm init". The - minimum kubernetes version needed to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains - files named "target[suffix][+patchtype].extension". For - example, "kube-apiserver0+merge.yaml" or just "etcd.json". - "target" can be one of "kube-apiserver", "kube-controller-manager", - "kube-scheduler", "etcd". "patchtype" can be one of "strategic" - "merge" or "json" and they match the patch formats supported - by kubectl. The default "patchtype" is "strategic". "extension" - must be either "json" or "yaml". "suffix" is an optional - string that can be used to determine which patches are applied - first alpha-numerically. These files can be written into - the target directory via KubeadmConfig.Files which specifies - additional files to be created on the machine, either with - content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during command - execution. The list of phases can be obtained with the "kubeadm - init --help" command. This option takes effect only on Kubernetes - >=1.22.0. - items: - type: string - type: array - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the - join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority - used to secure comunications between node and control-plane. - Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when - there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane - instance to be deployed on the joining node. If nil, no additional - control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the - API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for - the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API - Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet - to use during the TLS Bootstrap process TODO: revisit when there - is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for - bootstrap token based discovery BootstrapToken and File - are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name - to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key - pins to verify when token-based discovery is used. The - root CA found during discovery must match one of these - values. Specifying an empty set disables root CA pinning, - which can be unsafe. Each hash is specified as ":", - where the only currently supported type is "sha256". - This is a hex-encoded SHA-256 hash of the Subject Public - Key Info (SPKI) object in DER-encoded ASN.1. These hashes - can be calculated using, for example, OpenSSL: openssl - x509 -pubkey -in ca.crt openssl rsa -pubin -outform - der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster - information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based - discovery without CA verification via CACertHashes. - This can weaken the security of kubeadm since other - nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to a kubeconfig - file from which to load cluster information BootstrapToken - and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual - file path or URL to the kubeconfig file from which to - load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS bootstrapping. - If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, - but can be overridden. If .File is set, this field **must - be set** in case the KubeConfigFile does not contain any - other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource - this object represents. Servers may infer this from the endpoint - the client submits requests to. Cannot be updated. In CamelCase. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering - the new control-plane node to the cluster. When used in the - context of control plane nodes, NodeRegistration should remain - consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node API - object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight - errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the kubelet - command line via the environment file kubeadm writes at - runtime for the kubelet to source. This overrides the generic - base-level configuration in the kubelet-config-1.X ConfigMap - Flags have higher priority when parsing. These values are - local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node - API object that will be created in this `kubeadm init` or - `kubeadm join` operation. This field is also used in the - CommonName field of the kubelet's client certificate to - the API server. Defaults to the hostname of the node if - not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object - should be registered with. If this field is unset, i.e. - nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. If - you don''t want to taint your control-plane node, set this - field to an empty slice, i.e. `taints: {}` in the YAML file. - This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the - "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods - that do not tolerate the taint. Valid effects are - NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to - a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint - key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying patches - to components deployed by kubeadm during "kubeadm join". The - minimum kubernetes version needed to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains - files named "target[suffix][+patchtype].extension". For - example, "kube-apiserver0+merge.yaml" or just "etcd.json". - "target" can be one of "kube-apiserver", "kube-controller-manager", - "kube-scheduler", "etcd". "patchtype" can be one of "strategic" - "merge" or "json" and they match the patch formats supported - by kubectl. The default "patchtype" is "strategic". "extension" - must be either "json" or "yaml". "suffix" is an optional - string that can be used to determine which patches are applied - first alpha-numerically. These files can be written into - the target directory via KubeadmConfig.Files which specifies - additional files to be created on the machine, either with - content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during command - execution. The list of phases can be obtained with the "kubeadm - init --help" command. This option takes effect only on Kubernetes - >=1.22.0. - items: - type: string - type: array - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after - kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before - kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command - with a shell script with retries for joins. \n This is meant to - be an experimental temporary workaround on some environments where - joins fail due to timing (and other issues). The long term goal - is to add retries to kubeadm proper and use that functionality. - \n This will add about 40KB to userdata \n For more information, - refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055. - Deprecated: This experimental fix is no longer needed and this field - will be removed in a future release." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the - user - type: string - homeDir: - description: HomeDir specifies the home directory to use for - the user - type: string - inactive: - description: Inactive specifies whether to mark the user as - inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should - be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of passwd to - populate the passwd. - properties: - secret: - description: Secret represents a secret that should populate - this password. - properties: - key: - description: Key is the key in the secret's data map - for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary group for the - user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized - keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. - It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - status: - description: KubeadmConfigStatus defines the observed state of KubeadmConfig. - properties: - conditions: - description: Conditions defines current service state of the KubeadmConfig. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - dataSecretName: - description: DataSecretName is the name of the secret that stores - the bootstrap data script. - type: string - failureMessage: - description: FailureMessage will be set on non-retryable errors - type: string - failureReason: - description: FailureReason will be set on non-retryable errors - type: string - observedGeneration: - description: ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - ready: - description: Ready indicates the BootstrapData field is ready to be - consumed - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-bootstrap-system/capi-kubeadm-bootstrap-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: kubeadmconfigtemplates.bootstrap.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: bootstrap.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: KubeadmConfigTemplate - listKind: KubeadmConfigTemplateList - plural: kubeadmconfigtemplates - singular: kubeadmconfigtemplate - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: KubeadmConfigTemplate is the Schema for the kubeadmconfigtemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigTemplateSpec defines the desired state of KubeadmConfigTemplate. - properties: - template: - description: KubeadmConfigTemplateResource defines the Template structure. - properties: - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. - Either ClusterConfiguration and InitConfiguration should be - defined or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration - are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the - API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative - Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to - pass to the control plane component. TODO: This - is temporary and ideally we would like to switch - all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host - that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the - pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod - template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout - that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal value, - and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store - or look for all required certificates. NB: if not provided, - this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address - or DNS name for the control plane; it can be a valid - IP address or a RFC-1123 DNS subdomain, both with optional - TCP port. In case the ControlPlaneEndpoint is not specified, - the AdvertiseAddress + BindPort are used; in case the - ControlPlaneEndpoint is specified but without a TCP - port, the BindPort is used. Possible usages are: e.g. - In a cluster with more than one control plane instances, - this field should be assigned the address of the external - load balancer in front of the control plane instances. - e.g. in environments with enforced node recycling, - the ControlPlaneEndpoint could be used for assigning - a stable DNS to the control plane. NB: This value defaults - to the first value in the Cluster object status.apiEndpoints - array.' - type: string - controllerManager: - description: ControllerManager contains extra settings - for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to - pass to the control plane component. TODO: This - is temporary and ideally we would like to switch - all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host - that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the - pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod - template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on - installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for - the image. In case this value is set, kubeadm does - not change automatically the version of the above - components during upgrades. - type: string - type: - description: Type defines the DNS add-on to be used - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This - value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to - an external etcd cluster Local and External are - mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority - file used to secure etcd communication. Required - if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification - file used to secure etcd communication. Required - if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required - for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to - secure etcd communication. Required if using - a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for - configuring the local etcd instance Local and External - are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will - place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided - to the etcd binary when run inside a static - pod. - type: object - imageRepository: - description: ImageRepository sets the container - registry to pull images from. if not set, the - ImageRepository defined in ClusterConfiguration - will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag - for the image. In case this value is set, kubeadm - does not change automatically the version of - the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative - Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject - Alternative Names for the etcd server signing - cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry - to pull images from. If empty, `k8s.gcr.io` will be - used by default; in case of kubernetes version is a - CI build (kubernetes version starts with `ci/` or `ci-cross/`) - `gcr.io/k8s-staging-ci-images` will be used as a default - for control plane components and for kube-proxy, while - `k8s.gcr.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the - REST resource this object represents. Servers may infer - this from the endpoint the client submits requests to. - Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version - of the control plane. NB: This value defaults to the - Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking - topology of the cluster. NB: This value defaults to - the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s - services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. - If unset, the API server will not allocate CIDR - ranges for every node. Defaults to a comma-delimited - string of the Cluster object's spec.clusterNetwork.services.cidrBlocks - if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s - services. Defaults to a comma-delimited string of - the Cluster object's spec.clusterNetwork.pods.cidrBlocks, - or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the - scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to - pass to the control plane component. TODO: This - is temporary and ideally we would like to switch - all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host - that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the - pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod - template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - useHyperKubeImage: - description: UseHyperKubeImage controls if hyperkube should - be used for Kubernetes components instead of their respective - separate images - type: boolean - type: object - diskSetup: - description: DiskSetup specifies options for the creation - of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems - to setup. - items: - description: Filesystem defines the file systems to - be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to - add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system - type. - type: string - label: - description: Label specifies the file system label - to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to - overwrite any existing filesystem. If true, any - pre-existing file system will be destroyed. Use - with Caution. - type: boolean - partition: - description: 'Partition specifies the partition - to use. The valid options are: "auto|any", "auto", - "any", "none", and , where NUM is the actual - partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, - used for Microsoft Azure that instructs cloud-init - to replace a file system of . NOTE: unless - you define a label, this requires the use of the - ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions - to setup. - items: - description: Partition defines how to create and layout - a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. - If it is true, a single partition will be created - for the entire device. When layout is false, it - means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip - checks and create the partition if a partition - or filesystem is found on the device. Use with - caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition - table. The following are supported: ''mbr'': default - and setups a MS-DOS partition table ''gpt'': setups - a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data - upon creation. - items: - description: File defines the input for generating write_files - in cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content - to populate the file. - properties: - secret: - description: Secret represents a secret that should - populate this file. - properties: - key: - description: Key is the key in the secret's - data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the - file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, - e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where - to store the file. - type: string - permissions: - description: Permissions specifies the permissions to - assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap - data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration - are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal value, - and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm - init` time and describes a set of Bootstrap Tokens to - create. This information IS NOT uploaded to the kubeadm - cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap - token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message - why this token exists and what it's used for, - so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when - this token expires. Defaults to being set dynamically - at runtime based on the TTL. Expires and TTL are - mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that - this token will authenticate as when/if used for - authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional - trust between nodes and control-planes. Used for - joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this - token. Defaults to 24h. Expires and TTL are mutually - exclusive. - type: string - usages: - description: Usages describes the ways in which - this token can be used. Can by default be used - for establishing bidirectional trust, but that - can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the - REST resource this object represents. Servers may infer - this from the endpoint the client submits requests to. - Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance that's deployed on this control - plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint - in the sense that ControlPlaneEndpoint is the global - endpoint for the cluster, which then loadbalances the - requests to each individual API server. This configuration - object lets you customize what IP/DNS name and port - the local API server advertises it's accessible on. - By default, kubeadm tries to auto-detect the IP of the - default interface and use that, but in case that process - fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address - for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the - API Server to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate - to registering the new control-plane node to the cluster. - When used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration - and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container - runtime info. This information will be annotated - to the Node API object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra - arguments to the kubelet. The arguments here are - passed to the kubelet command line via the environment - file kubeadm writes at runtime for the kubelet to - source. This overrides the generic base-level configuration - in the kubelet-config-1.X ConfigMap Flags have higher - priority when parsing. These values are local and - specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of - the Node API object that will be created in this - `kubeadm init` or `kubeadm join` operation. This - field is also used in the CommonName field of the - kubelet's client certificate to the API server. - Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node - API object should be registered with. If this field - is unset, i.e. nil, in the `kubeadm init` process - it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: - {}` in the YAML file. This field is solely used - for Node registration.' - items: - description: The node this Taint is attached to - has the "effect" on any pod that does not tolerate - the Taint. - properties: - effect: - description: Required. The effect of the taint - on pods that do not tolerate the taint. Valid - effects are NoSchedule, PreferNoSchedule and - NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at - which the taint was added. It is only written - for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to - the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration - for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal value, - and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate - authority used to secure comunications between node - and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". - TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control - plane instance to be deployed on the joining node. If - nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance to be deployed on this - node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address - for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for - the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - type: object - discovery: - description: 'Discovery specifies the options for the - kubelet to use during the TLS Bootstrap process TODO: - revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options - for bootstrap token based discovery BootstrapToken - and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain - name to the API server from which info will - be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of - public key pins to verify when token-based discovery - is used. The root CA found during discovery - must match one of these values. Specifying an - empty set disables root CA pinning, which can - be unsafe. Each hash is specified as ":", - where the only currently supported type is "sha256". - This is a hex-encoded SHA-256 hash of the Subject - Public Key Info (SPKI) object in DER-encoded - ASN.1. These hashes can be calculated using, - for example, OpenSSL: openssl x509 -pubkey -in - ca.crt openssl rsa -pubin -outform der 2>&/dev/null - | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate - cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based - discovery without CA verification via CACertHashes. - This can weaken the security of kubeadm since - other nodes can impersonate the control-plane. - type: boolean - required: - - token - - unsafeSkipCAVerification - type: object - file: - description: File is used to specify a file or URL - to a kubeconfig file from which to load cluster - information BootstrapToken and File are mutually - exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify - the actual file path or URL to the kubeconfig - file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: 'TLSBootstrapToken is a token used for - TLS bootstrapping. If .BootstrapToken is set, this - field is defaulted to .BootstrapToken.Token, but - can be overridden. If .File is set, this field **must - be set** in case the KubeConfigFile does not contain - any other authentication information TODO: revisit - when there is defaulting from k/k' - type: string - type: object - kind: - description: 'Kind is a string value representing the - REST resource this object represents. Servers may infer - this from the endpoint the client submits requests to. - Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate - to registering the new control-plane node to the cluster. - When used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration - and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container - runtime info. This information will be annotated - to the Node API object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra - arguments to the kubelet. The arguments here are - passed to the kubelet command line via the environment - file kubeadm writes at runtime for the kubelet to - source. This overrides the generic base-level configuration - in the kubelet-config-1.X ConfigMap Flags have higher - priority when parsing. These values are local and - specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of - the Node API object that will be created in this - `kubeadm init` or `kubeadm join` operation. This - field is also used in the CommonName field of the - kubelet's client certificate to the API server. - Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node - API object should be registered with. If this field - is unset, i.e. nil, in the `kubeadm init` process - it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: - {}` in the YAML file. This field is solely used - for Node registration.' - items: - description: The node this Taint is attached to - has the "effect" on any pod that does not tolerate - the Taint. - properties: - effect: - description: Required. The effect of the taint - on pods that do not tolerate the taint. Valid - effects are NoSchedule, PreferNoSchedule and - NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at - which the taint was added. It is only written - for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to - the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be - setup. - items: - description: MountPoints defines input for generated mounts - in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands - to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to - run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm - command with a shell script with retries for joins. \n This - is meant to be an experimental temporary workaround on some - environments where joins fail due to timing (and other issues). - The long term goal is to add retries to kubeadm proper and - use that functionality. \n This will add about 40KB to userdata - \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user - in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the - user - type: string - groups: - description: Groups specifies the additional groups - for the user - type: string - homeDir: - description: HomeDir specifies the home directory to - use for the user - type: string - inactive: - description: Inactive specifies whether to mark the - user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login - should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for - the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group - for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh - authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level - verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - type: object - required: - - template - type: object - type: object - served: true - storage: false - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmConfigTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: KubeadmConfigTemplate is the Schema for the kubeadmconfigtemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigTemplateSpec defines the desired state of KubeadmConfigTemplate. - properties: - template: - description: KubeadmConfigTemplateResource defines the Template structure. - properties: - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. - Either ClusterConfiguration and InitConfiguration should be - defined or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration - are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the - API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative - Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to - pass to the control plane component. TODO: This - is temporary and ideally we would like to switch - all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host - that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the - pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod - template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout - that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal value, - and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store - or look for all required certificates. NB: if not provided, - this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address - or DNS name for the control plane; it can be a valid - IP address or a RFC-1123 DNS subdomain, both with optional - TCP port. In case the ControlPlaneEndpoint is not specified, - the AdvertiseAddress + BindPort are used; in case the - ControlPlaneEndpoint is specified but without a TCP - port, the BindPort is used. Possible usages are: e.g. - In a cluster with more than one control plane instances, - this field should be assigned the address of the external - load balancer in front of the control plane instances. - e.g. in environments with enforced node recycling, - the ControlPlaneEndpoint could be used for assigning - a stable DNS to the control plane. NB: This value defaults - to the first value in the Cluster object status.apiEndpoints - array.' - type: string - controllerManager: - description: ControllerManager contains extra settings - for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to - pass to the control plane component. TODO: This - is temporary and ideally we would like to switch - all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host - that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the - pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod - template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on - installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for - the image. In case this value is set, kubeadm does - not change automatically the version of the above - components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This - value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to - an external etcd cluster Local and External are - mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority - file used to secure etcd communication. Required - if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification - file used to secure etcd communication. Required - if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required - for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to - secure etcd communication. Required if using - a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for - configuring the local etcd instance Local and External - are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will - place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided - to the etcd binary when run inside a static - pod. - type: object - imageRepository: - description: ImageRepository sets the container - registry to pull images from. if not set, the - ImageRepository defined in ClusterConfiguration - will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag - for the image. In case this value is set, kubeadm - does not change automatically the version of - the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative - Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject - Alternative Names for the etcd server signing - cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry - to pull images from. If empty, `registry.k8s.io` will - be used by default; in case of kubernetes version is - a CI build (kubernetes version starts with `ci/` or - `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be - used as a default for control plane components and for - kube-proxy, while `registry.k8s.io` will be used for - all the other images. - type: string - kind: - description: 'Kind is a string value representing the - REST resource this object represents. Servers may infer - this from the endpoint the client submits requests to. - Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version - of the control plane. NB: This value defaults to the - Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking - topology of the cluster. NB: This value defaults to - the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s - services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. - If unset, the API server will not allocate CIDR - ranges for every node. Defaults to a comma-delimited - string of the Cluster object's spec.clusterNetwork.services.cidrBlocks - if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s - services. Defaults to a comma-delimited string of - the Cluster object's spec.clusterNetwork.pods.cidrBlocks, - or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the - scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to - pass to the control plane component. TODO: This - is temporary and ideally we would like to switch - all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host - that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the - pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod - template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation - of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems - to setup. - items: - description: Filesystem defines the file systems to - be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to - add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system - type. - type: string - label: - description: Label specifies the file system label - to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to - overwrite any existing filesystem. If true, any - pre-existing file system will be destroyed. Use - with Caution. - type: boolean - partition: - description: 'Partition specifies the partition - to use. The valid options are: "auto|any", "auto", - "any", "none", and , where NUM is the actual - partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, - used for Microsoft Azure that instructs cloud-init - to replace a file system of . NOTE: unless - you define a label, this requires the use of the - ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions - to setup. - items: - description: Partition defines how to create and layout - a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. - If it is true, a single partition will be created - for the entire device. When layout is false, it - means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip - checks and create the partition if a partition - or filesystem is found on the device. Use with - caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition - table. The following are supported: ''mbr'': default - and setups a MS-DOS partition table ''gpt'': setups - a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data - upon creation. - items: - description: File defines the input for generating write_files - in cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content - to populate the file. - properties: - secret: - description: Secret represents a secret that should - populate this file. - properties: - key: - description: Key is the key in the secret's - data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the - file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, - e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where - to store the file. - type: string - permissions: - description: Permissions specifies the permissions to - assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap - data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration - are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal value, - and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm - init` time and describes a set of Bootstrap Tokens to - create. This information IS NOT uploaded to the kubeadm - cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap - token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message - why this token exists and what it's used for, - so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when - this token expires. Defaults to being set dynamically - at runtime based on the TTL. Expires and TTL are - mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that - this token will authenticate as when/if used for - authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional - trust between nodes and control-planes. Used for - joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this - token. Defaults to 24h. Expires and TTL are mutually - exclusive. - type: string - usages: - description: Usages describes the ways in which - this token can be used. Can by default be used - for establishing bidirectional trust, but that - can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the - REST resource this object represents. Servers may infer - this from the endpoint the client submits requests to. - Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance that's deployed on this control - plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint - in the sense that ControlPlaneEndpoint is the global - endpoint for the cluster, which then loadbalances the - requests to each individual API server. This configuration - object lets you customize what IP/DNS name and port - the local API server advertises it's accessible on. - By default, kubeadm tries to auto-detect the IP of the - default interface and use that, but in case that process - fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address - for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the - API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate - to registering the new control-plane node to the cluster. - When used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration - and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container - runtime info. This information will be annotated - to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice - of pre-flight errors to be ignored when the current - node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra - arguments to the kubelet. The arguments here are - passed to the kubelet command line via the environment - file kubeadm writes at runtime for the kubelet to - source. This overrides the generic base-level configuration - in the kubelet-config-1.X ConfigMap Flags have higher - priority when parsing. These values are local and - specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of - the Node API object that will be created in this - `kubeadm init` or `kubeadm join` operation. This - field is also used in the CommonName field of the - kubelet's client certificate to the API server. - Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node - API object should be registered with. If this field - is unset, i.e. nil, in the `kubeadm init` process - it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: - {}` in the YAML file. This field is solely used - for Node registration.' - items: - description: The node this Taint is attached to - has the "effect" on any pod that does not tolerate - the Taint. - properties: - effect: - description: Required. The effect of the taint - on pods that do not tolerate the taint. Valid - effects are NoSchedule, PreferNoSchedule and - NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at - which the taint was added. It is only written - for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to - the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration - for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal value, - and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate - authority used to secure comunications between node - and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". - TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control - plane instance to be deployed on the joining node. If - nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance to be deployed on this - node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address - for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for - the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the - kubelet to use during the TLS Bootstrap process TODO: - revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options - for bootstrap token based discovery BootstrapToken - and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain - name to the API server from which info will - be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of - public key pins to verify when token-based discovery - is used. The root CA found during discovery - must match one of these values. Specifying an - empty set disables root CA pinning, which can - be unsafe. Each hash is specified as ":", - where the only currently supported type is "sha256". - This is a hex-encoded SHA-256 hash of the Subject - Public Key Info (SPKI) object in DER-encoded - ASN.1. These hashes can be calculated using, - for example, OpenSSL: openssl x509 -pubkey -in - ca.crt openssl rsa -pubin -outform der 2>&/dev/null - | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate - cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based - discovery without CA verification via CACertHashes. - This can weaken the security of kubeadm since - other nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL - to a kubeconfig file from which to load cluster - information BootstrapToken and File are mutually - exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify - the actual file path or URL to the kubeconfig - file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for - TLS bootstrapping. If .BootstrapToken is set, this - field is defaulted to .BootstrapToken.Token, but - can be overridden. If .File is set, this field **must - be set** in case the KubeConfigFile does not contain - any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the - REST resource this object represents. Servers may infer - this from the endpoint the client submits requests to. - Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate - to registering the new control-plane node to the cluster. - When used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration - and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container - runtime info. This information will be annotated - to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice - of pre-flight errors to be ignored when the current - node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra - arguments to the kubelet. The arguments here are - passed to the kubelet command line via the environment - file kubeadm writes at runtime for the kubelet to - source. This overrides the generic base-level configuration - in the kubelet-config-1.X ConfigMap Flags have higher - priority when parsing. These values are local and - specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of - the Node API object that will be created in this - `kubeadm init` or `kubeadm join` operation. This - field is also used in the CommonName field of the - kubelet's client certificate to the API server. - Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node - API object should be registered with. If this field - is unset, i.e. nil, in the `kubeadm init` process - it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: - {}` in the YAML file. This field is solely used - for Node registration.' - items: - description: The node this Taint is attached to - has the "effect" on any pod that does not tolerate - the Taint. - properties: - effect: - description: Required. The effect of the taint - on pods that do not tolerate the taint. Valid - effects are NoSchedule, PreferNoSchedule and - NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at - which the taint was added. It is only written - for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to - the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be - setup. - items: - description: MountPoints defines input for generated mounts - in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands - to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to - run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm - command with a shell script with retries for joins. \n This - is meant to be an experimental temporary workaround on some - environments where joins fail due to timing (and other issues). - The long term goal is to add retries to kubeadm proper and - use that functionality. \n This will add about 40KB to userdata - \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user - in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the - user - type: string - groups: - description: Groups specifies the additional groups - for the user - type: string - homeDir: - description: HomeDir specifies the home directory to - use for the user - type: string - inactive: - description: Inactive specifies whether to mark the - user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login - should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for - the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group - for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh - authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level - verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - type: object - required: - - template - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmConfigTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: KubeadmConfigTemplate is the Schema for the kubeadmconfigtemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigTemplateSpec defines the desired state of KubeadmConfigTemplate. - properties: - template: - description: KubeadmConfigTemplateResource defines the Template structure. - properties: - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. - Either ClusterConfiguration and InitConfiguration should be - defined or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration - are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the - API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative - Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to - pass to the control plane component. TODO: This - is temporary and ideally we would like to switch - all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host - that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the - pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod - template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout - that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal value, - and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store - or look for all required certificates. NB: if not provided, - this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address - or DNS name for the control plane; it can be a valid - IP address or a RFC-1123 DNS subdomain, both with optional - TCP port. In case the ControlPlaneEndpoint is not specified, - the AdvertiseAddress + BindPort are used; in case the - ControlPlaneEndpoint is specified but without a TCP - port, the BindPort is used. Possible usages are: e.g. - In a cluster with more than one control plane instances, - this field should be assigned the address of the external - load balancer in front of the control plane instances. - e.g. in environments with enforced node recycling, - the ControlPlaneEndpoint could be used for assigning - a stable DNS to the control plane. NB: This value defaults - to the first value in the Cluster object status.apiEndpoints - array.' - type: string - controllerManager: - description: ControllerManager contains extra settings - for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to - pass to the control plane component. TODO: This - is temporary and ideally we would like to switch - all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host - that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the - pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod - template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on - installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for - the image. In case this value is set, kubeadm does - not change automatically the version of the above - components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This - value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to - an external etcd cluster Local and External are - mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority - file used to secure etcd communication. Required - if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification - file used to secure etcd communication. Required - if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required - for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to - secure etcd communication. Required if using - a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for - configuring the local etcd instance Local and External - are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will - place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided - to the etcd binary when run inside a static - pod. - type: object - imageRepository: - description: ImageRepository sets the container - registry to pull images from. if not set, the - ImageRepository defined in ClusterConfiguration - will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag - for the image. In case this value is set, kubeadm - does not change automatically the version of - the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative - Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject - Alternative Names for the etcd server signing - cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry - to pull images from. If empty, `registry.k8s.io` will - be used by default; in case of kubernetes version is - a CI build (kubernetes version starts with `ci/` or - `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be - used as a default for control plane components and for - kube-proxy, while `registry.k8s.io` will be used for - all the other images. - type: string - kind: - description: 'Kind is a string value representing the - REST resource this object represents. Servers may infer - this from the endpoint the client submits requests to. - Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version - of the control plane. NB: This value defaults to the - Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking - topology of the cluster. NB: This value defaults to - the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s - services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. - If unset, the API server will not allocate CIDR - ranges for every node. Defaults to a comma-delimited - string of the Cluster object's spec.clusterNetwork.services.cidrBlocks - if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s - services. Defaults to a comma-delimited string of - the Cluster object's spec.clusterNetwork.pods.cidrBlocks, - or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the - scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to - pass to the control plane component. TODO: This - is temporary and ideally we would like to switch - all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host - that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the - pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod - template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation - of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems - to setup. - items: - description: Filesystem defines the file systems to - be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to - add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system - type. - type: string - label: - description: Label specifies the file system label - to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to - overwrite any existing filesystem. If true, any - pre-existing file system will be destroyed. Use - with Caution. - type: boolean - partition: - description: 'Partition specifies the partition - to use. The valid options are: "auto|any", "auto", - "any", "none", and , where NUM is the actual - partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, - used for Microsoft Azure that instructs cloud-init - to replace a file system of . NOTE: unless - you define a label, this requires the use of the - ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions - to setup. - items: - description: Partition defines how to create and layout - a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. - If it is true, a single partition will be created - for the entire device. When layout is false, it - means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip - checks and create the partition if a partition - or filesystem is found on the device. Use with - caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition - table. The following are supported: ''mbr'': default - and setups a MS-DOS partition table ''gpt'': setups - a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data - upon creation. - items: - description: File defines the input for generating write_files - in cloud-init. - properties: - append: - description: Append specifies whether to append Content - to existing file if Path exists. - type: boolean - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content - to populate the file. - properties: - secret: - description: Secret represents a secret that should - populate this file. - properties: - key: - description: Key is the key in the secret's - data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the - file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, - e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where - to store the file. - type: string - permissions: - description: Permissions specifies the permissions to - assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap - data - enum: - - cloud-config - - ignition - type: string - ignition: - description: Ignition contains Ignition specific configuration. - properties: - containerLinuxConfig: - description: ContainerLinuxConfig contains CLC specific - configuration. - properties: - additionalConfig: - description: "AdditionalConfig contains additional - configuration to be merged with the Ignition configuration - generated by the bootstrapper controller. More info: - https://coreos.github.io/ignition/operator-notes/#config-merging - \n The data format is documented here: https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/" - type: string - strict: - description: Strict controls if AdditionalConfig should - be strictly parsed. If so, warnings are treated - as errors. - type: boolean - type: object - type: object - initConfiguration: - description: InitConfiguration along with ClusterConfiguration - are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal value, - and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm - init` time and describes a set of Bootstrap Tokens to - create. This information IS NOT uploaded to the kubeadm - cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap - token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message - why this token exists and what it's used for, - so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when - this token expires. Defaults to being set dynamically - at runtime based on the TTL. Expires and TTL are - mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that - this token will authenticate as when/if used for - authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional - trust between nodes and control-planes. Used for - joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this - token. Defaults to 24h. Expires and TTL are mutually - exclusive. - type: string - usages: - description: Usages describes the ways in which - this token can be used. Can by default be used - for establishing bidirectional trust, but that - can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the - REST resource this object represents. Servers may infer - this from the endpoint the client submits requests to. - Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance that's deployed on this control - plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint - in the sense that ControlPlaneEndpoint is the global - endpoint for the cluster, which then loadbalances the - requests to each individual API server. This configuration - object lets you customize what IP/DNS name and port - the local API server advertises it's accessible on. - By default, kubeadm tries to auto-detect the IP of the - default interface and use that, but in case that process - fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address - for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the - API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate - to registering the new control-plane node to the cluster. - When used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration - and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container - runtime info. This information will be annotated - to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice - of pre-flight errors to be ignored when the current - node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra - arguments to the kubelet. The arguments here are - passed to the kubelet command line via the environment - file kubeadm writes at runtime for the kubelet to - source. This overrides the generic base-level configuration - in the kubelet-config-1.X ConfigMap Flags have higher - priority when parsing. These values are local and - specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of - the Node API object that will be created in this - `kubeadm init` or `kubeadm join` operation. This - field is also used in the CommonName field of the - kubelet's client certificate to the API server. - Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node - API object should be registered with. If this field - is unset, i.e. nil, in the `kubeadm init` process - it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: - {}` in the YAML file. This field is solely used - for Node registration.' - items: - description: The node this Taint is attached to - has the "effect" on any pod that does not tolerate - the Taint. - properties: - effect: - description: Required. The effect of the taint - on pods that do not tolerate the taint. Valid - effects are NoSchedule, PreferNoSchedule and - NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at - which the taint was added. It is only written - for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to - the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying - patches to components deployed by kubeadm during "kubeadm - init". The minimum kubernetes version needed to support - Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that - contains files named "target[suffix][+patchtype].extension". - For example, "kube-apiserver0+merge.yaml" or just - "etcd.json". "target" can be one of "kube-apiserver", - "kube-controller-manager", "kube-scheduler", "etcd". - "patchtype" can be one of "strategic" "merge" or - "json" and they match the patch formats supported - by kubectl. The default "patchtype" is "strategic". - "extension" must be either "json" or "yaml". "suffix" - is an optional string that can be used to determine - which patches are applied first alpha-numerically. - These files can be written into the target directory - via KubeadmConfig.Files which specifies additional - files to be created on the machine, either with - content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during - command execution. The list of phases can be obtained - with the "kubeadm init --help" command. This option - takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration - for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal value, - and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate - authority used to secure comunications between node - and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". - TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control - plane instance to be deployed on the joining node. If - nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance to be deployed on this - node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address - for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for - the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the - kubelet to use during the TLS Bootstrap process TODO: - revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options - for bootstrap token based discovery BootstrapToken - and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain - name to the API server from which info will - be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of - public key pins to verify when token-based discovery - is used. The root CA found during discovery - must match one of these values. Specifying an - empty set disables root CA pinning, which can - be unsafe. Each hash is specified as ":", - where the only currently supported type is "sha256". - This is a hex-encoded SHA-256 hash of the Subject - Public Key Info (SPKI) object in DER-encoded - ASN.1. These hashes can be calculated using, - for example, OpenSSL: openssl x509 -pubkey -in - ca.crt openssl rsa -pubin -outform der 2>&/dev/null - | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate - cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based - discovery without CA verification via CACertHashes. - This can weaken the security of kubeadm since - other nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL - to a kubeconfig file from which to load cluster - information BootstrapToken and File are mutually - exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify - the actual file path or URL to the kubeconfig - file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for - TLS bootstrapping. If .BootstrapToken is set, this - field is defaulted to .BootstrapToken.Token, but - can be overridden. If .File is set, this field **must - be set** in case the KubeConfigFile does not contain - any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the - REST resource this object represents. Servers may infer - this from the endpoint the client submits requests to. - Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate - to registering the new control-plane node to the cluster. - When used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration - and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container - runtime info. This information will be annotated - to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice - of pre-flight errors to be ignored when the current - node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra - arguments to the kubelet. The arguments here are - passed to the kubelet command line via the environment - file kubeadm writes at runtime for the kubelet to - source. This overrides the generic base-level configuration - in the kubelet-config-1.X ConfigMap Flags have higher - priority when parsing. These values are local and - specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of - the Node API object that will be created in this - `kubeadm init` or `kubeadm join` operation. This - field is also used in the CommonName field of the - kubelet's client certificate to the API server. - Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node - API object should be registered with. If this field - is unset, i.e. nil, in the `kubeadm init` process - it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: - {}` in the YAML file. This field is solely used - for Node registration.' - items: - description: The node this Taint is attached to - has the "effect" on any pod that does not tolerate - the Taint. - properties: - effect: - description: Required. The effect of the taint - on pods that do not tolerate the taint. Valid - effects are NoSchedule, PreferNoSchedule and - NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at - which the taint was added. It is only written - for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to - the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying - patches to components deployed by kubeadm during "kubeadm - join". The minimum kubernetes version needed to support - Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that - contains files named "target[suffix][+patchtype].extension". - For example, "kube-apiserver0+merge.yaml" or just - "etcd.json". "target" can be one of "kube-apiserver", - "kube-controller-manager", "kube-scheduler", "etcd". - "patchtype" can be one of "strategic" "merge" or - "json" and they match the patch formats supported - by kubectl. The default "patchtype" is "strategic". - "extension" must be either "json" or "yaml". "suffix" - is an optional string that can be used to determine - which patches are applied first alpha-numerically. - These files can be written into the target directory - via KubeadmConfig.Files which specifies additional - files to be created on the machine, either with - content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during - command execution. The list of phases can be obtained - with the "kubeadm init --help" command. This option - takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - mounts: - description: Mounts specifies a list of mount points to be - setup. - items: - description: MountPoints defines input for generated mounts - in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands - to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to - run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm - command with a shell script with retries for joins. \n This - is meant to be an experimental temporary workaround on some - environments where joins fail due to timing (and other issues). - The long term goal is to add retries to kubeadm proper and - use that functionality. \n This will add about 40KB to userdata - \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055. - Deprecated: This experimental fix is no longer needed and - this field will be removed in a future release." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user - in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the - user - type: string - groups: - description: Groups specifies the additional groups - for the user - type: string - homeDir: - description: HomeDir specifies the home directory to - use for the user - type: string - inactive: - description: Inactive specifies whether to mark the - user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login - should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for - the user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of passwd - to populate the passwd. - properties: - secret: - description: Secret represents a secret that should - populate this password. - properties: - key: - description: Key is the key in the secret's - data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary group - for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh - authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level - verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - type: object - required: - - template - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-manager - namespace: capi-kubeadm-bootstrap-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-leader-election-role - namespace: capi-kubeadm-bootstrap-system -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-manager-role -rules: -- apiGroups: - - "" - resources: - - configmaps - - events - - secrets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - bootstrap.cluster.x-k8s.io - resources: - - kubeadmconfigs - - kubeadmconfigs/finalizers - - kubeadmconfigs/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - - machinepools - - machinepools/status - - machines - - machines/status - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-leader-election-rolebinding - namespace: capi-kubeadm-bootstrap-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capi-kubeadm-bootstrap-leader-election-role -subjects: -- kind: ServiceAccount - name: capi-kubeadm-bootstrap-manager - namespace: capi-kubeadm-bootstrap-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capi-kubeadm-bootstrap-manager-role -subjects: -- kind: ServiceAccount - name: capi-kubeadm-bootstrap-manager - namespace: capi-kubeadm-bootstrap-system ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: bootstrap-kubeadm ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - control-plane: controller-manager - name: capi-kubeadm-bootstrap-controller-manager - namespace: capi-kubeadm-bootstrap-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --metrics-bind-addr=localhost:8080 - - --feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},KubeadmBootstrapFormatIgnition=${EXP_KUBEADM_BOOTSTRAP_FORMAT_IGNITION:=false} - - --bootstrap-token-ttl=${KUBEADM_BOOTSTRAP_TOKEN_TTL:=15m} - command: - - /manager - image: k8s.gcr.io/cluster-api/kubeadm-bootstrap-controller:v1.2.8 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - serviceAccountName: capi-kubeadm-bootstrap-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - secretName: capi-kubeadm-bootstrap-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-serving-cert - namespace: capi-kubeadm-bootstrap-system -spec: - dnsNames: - - capi-kubeadm-bootstrap-webhook-service.capi-kubeadm-bootstrap-system.svc - - capi-kubeadm-bootstrap-webhook-service.capi-kubeadm-bootstrap-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capi-kubeadm-bootstrap-selfsigned-issuer - secretName: capi-kubeadm-bootstrap-webhook-service-cert - subject: - organizations: - - k8s-sig-cluster-lifecycle ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-selfsigned-issuer - namespace: capi-kubeadm-bootstrap-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-bootstrap-system/capi-kubeadm-bootstrap-serving-cert - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /mutate-bootstrap-cluster-x-k8s-io-v1beta1-kubeadmconfig - failurePolicy: Fail - name: default.kubeadmconfig.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmconfigs - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /mutate-bootstrap-cluster-x-k8s-io-v1beta1-kubeadmconfigtemplate - failurePolicy: Fail - name: default.kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmconfigtemplates - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-bootstrap-system/capi-kubeadm-bootstrap-serving-cert - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /validate-bootstrap-cluster-x-k8s-io-v1beta1-kubeadmconfig - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.kubeadmconfig.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmconfigs - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /validate-bootstrap-cluster-x-k8s-io-v1beta1-kubeadmconfigtemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmconfigtemplates - sideEffects: None diff --git a/packages/cluster-api-bootstrap-kubeadm/bundle/config/upstream/metadata.yaml b/packages/cluster-api-bootstrap-kubeadm/bundle/config/upstream/metadata.yaml deleted file mode 100644 index 625544516d..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/bundle/config/upstream/metadata.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# maps release series of major.minor to cluster-api contract version -# the contract version may change between minor or major versions, but *not* -# between patch versions. -# -# update this file only when a new major or minor version is released -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: - - major: 1 - minor: 2 - contract: v1beta1 - - major: 1 - minor: 1 - contract: v1beta1 - - major: 1 - minor: 0 - contract: v1beta1 - - major: 0 - minor: 4 - contract: v1alpha4 - - major: 0 - minor: 3 - contract: v1alpha3 diff --git a/packages/cluster-api-bootstrap-kubeadm/bundle/config/values.yaml b/packages/cluster-api-bootstrap-kubeadm/bundle/config/values.yaml deleted file mode 100644 index e25fdc8014..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/bundle/config/values.yaml +++ /dev/null @@ -1,2 +0,0 @@ -#@data/values ---- diff --git a/packages/cluster-api-bootstrap-kubeadm/metadata.yaml b/packages/cluster-api-bootstrap-kubeadm/metadata.yaml deleted file mode 100644 index 85abfe0e10..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: cluster-api-bootstrap-kubeadm.tanzu.vmware.com - namespace: cluster-api-bootstrap-kubeadm -spec: - displayName: "cluster-api-bootstrap-kubeadm" - longDescription: "The Cluster API kubeadm bootstrap provider generates the cluster certificates, initializes the control plane, and joins control plane and worker nodes to the cluster." - shortDescription: "Cluster bootstrapping" - providerName: VMware - maintainers: - - name: "" - categories: - - "cluster management" diff --git a/packages/cluster-api-bootstrap-kubeadm/package.yaml b/packages/cluster-api-bootstrap-kubeadm/package.yaml deleted file mode 100644 index 3a1bb079a1..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: cluster-api-bootstrap-kubeadm.tanzu.vmware.com - namespace: cluster-api-bootstrap-kubeadm -spec: - refName: cluster-api-bootstrap-kubeadm.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/cluster-api-bootstrap-kubeadm/test/go.mod b/packages/cluster-api-bootstrap-kubeadm/test/go.mod deleted file mode 100644 index 213083da0f..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/test/go.mod +++ /dev/null @@ -1,25 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/packages/cluster-api-bootstrap-kubeadm/test - -go 1.18 - -require ( - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - github.com/vmware-tanzu/tanzu-framework/test/pkg v0.0.0-00010101000000-000000000000 -) - -require ( - github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect -) - -replace github.com/vmware-tanzu/tanzu-framework/test/pkg => ../../../test/pkg diff --git a/packages/cluster-api-bootstrap-kubeadm/test/go.sum b/packages/cluster-api-bootstrap-kubeadm/test/go.sum deleted file mode 100644 index 2141875765..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/test/go.sum +++ /dev/null @@ -1,116 +0,0 @@ -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/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 h1:aRd8M7HJVZOqn/vhOzrGcQH0lNAMkqMn+pXUYkatmcA= -github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -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/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= -github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -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/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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/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.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e h1:3i3ny04XV6HbZ2N1oIBw1UBYATHAOpo4tfTF83JM3Z0= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/packages/cluster-api-bootstrap-kubeadm/test/unit/overlay_test.go b/packages/cluster-api-bootstrap-kubeadm/test/unit/overlay_test.go deleted file mode 100644 index 8b9239ecf0..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/test/unit/overlay_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "path/filepath" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -const ( - packageRoot = "../.." -) - -var _ = Describe("Cluster-API-bootstrap-kubeadm Ytt Templating", func() { - var paths []string - BeforeEach(func() { - paths = []string{ - filepath.Join(packageRoot, "bundle", "config"), - } - }) - - It("sets the bootstrap token ttl flag to 15m", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, nil) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capi-kubeadm-bootstrap-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[?(@.name=='manager')].args[3]", - "--bootstrap-token-ttl=${CAPBK_BOOTSTRAP_TOKEN_TTL:=15m}", - )) - }) -}) diff --git a/packages/cluster-api-bootstrap-kubeadm/test/unit/unit_suite_test.go b/packages/cluster-api-bootstrap-kubeadm/test/unit/unit_suite_test.go deleted file mode 100644 index e7d8842248..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/test/unit/unit_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestUnit(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Cluster API Bootstrap Kubeadm Unit Suite") -} diff --git a/packages/cluster-api-bootstrap-kubeadm/vendir.lock.yml b/packages/cluster-api-bootstrap-kubeadm/vendir.lock.yml deleted file mode 100644 index 199970a1e8..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/vendir.lock.yml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - githubRelease: - url: https://api.github.com/repos/kubernetes-sigs/cluster-api/releases/86051101 - path: . - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/cluster-api-bootstrap-kubeadm/vendir.yml b/packages/cluster-api-bootstrap-kubeadm/vendir.yml deleted file mode 100644 index 27ab1b9174..0000000000 --- a/packages/cluster-api-bootstrap-kubeadm/vendir.yml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: . - githubRelease: - slug: kubernetes-sigs/cluster-api - tag: v1.2.8 - disableAutoChecksumValidation: true - includePaths: - - bootstrap-components.yaml - - metadata.yaml diff --git a/packages/cluster-api-control-plane-kubeadm/Makefile b/packages/cluster-api-control-plane-kubeadm/Makefile deleted file mode 100644 index 50a0a1d176..0000000000 --- a/packages/cluster-api-control-plane-kubeadm/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package - diff --git a/packages/cluster-api-control-plane-kubeadm/README.md b/packages/cluster-api-control-plane-kubeadm/README.md deleted file mode 100644 index d4700f4aff..0000000000 --- a/packages/cluster-api-control-plane-kubeadm/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# cluster-api-control-plane-kubeadm Package - -This package provides the cluster API kubeadm control plane provider which -instantiates the kubernetes control plane. Required serces include etcd, api -server, controller manager, and the scheduler. -[cluster-api control plane provider](https://cluster-api.sigs.k8s.io/developer/architecture/controllers/control-plane.html#control-plane-provider). - -## Components - -* capi-kubeadm-control-plane-controller-manager - -## Usage Example - -To learn more about cluster-api visit . diff --git a/packages/cluster-api-control-plane-kubeadm/bundle/config/overlay/set-feature-flags.yaml b/packages/cluster-api-control-plane-kubeadm/bundle/config/overlay/set-feature-flags.yaml deleted file mode 100644 index b11edcc9e9..0000000000 --- a/packages/cluster-api-control-plane-kubeadm/bundle/config/overlay/set-feature-flags.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capi-kubeadm-control-plane-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - args: - #@overlay/match by=overlay.index(2) - #@overlay/replace - - "--feature-gates=ClusterTopology=${CLUSTER_TOPOLOGY:=true},KubeadmBootstrapFormatIgnition=${EXP_KUBEADM_BOOTSTRAP_FORMAT_IGNITION:=false}" diff --git a/packages/cluster-api-control-plane-kubeadm/bundle/config/upstream/control-plane-components.yaml b/packages/cluster-api-control-plane-kubeadm/bundle/config/upstream/control-plane-components.yaml deleted file mode 100644 index ce93ea0b0a..0000000000 --- a/packages/cluster-api-control-plane-kubeadm/bundle/config/upstream/control-plane-components.yaml +++ /dev/null @@ -1,6591 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - control-plane: controller-manager - name: capi-kubeadm-control-plane-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-control-plane-system/capi-kubeadm-control-plane-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: kubeadmcontrolplanes.controlplane.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: controlplane.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: KubeadmControlPlane - listKind: KubeadmControlPlaneList - plural: kubeadmcontrolplanes - shortNames: - - kcp - singular: kubeadmcontrolplane - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: This denotes whether or not the control plane has the uploaded - kubeadm-config configmap - jsonPath: .status.initialized - name: Initialized - type: boolean - - description: KubeadmControlPlane API Server is ready to receive requests - jsonPath: .status.ready - name: API Server Available - type: boolean - - description: Kubernetes version associated with this control plane - jsonPath: .spec.version - name: Version - type: string - - description: Total number of non-terminated machines targeted by this control - plane - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of fully running and ready control plane machines - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: Total number of non-terminated machines targeted by this control - plane that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this control plane - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - name: v1alpha3 - schema: - openAPIV3Schema: - description: KubeadmControlPlane is the Schema for the KubeadmControlPlane - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmControlPlaneSpec defines the desired state of KubeadmControlPlane. - properties: - infrastructureTemplate: - description: InfrastructureTemplate is a required reference to a custom - resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - kubeadmConfigSpec: - description: KubeadmConfigSpec is a KubeadmConfigSpec to use for initializing - and joining machines to the control plane. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration - are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API - server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names - for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass - to the control plane component. TODO: This is temporary - and ideally we would like to switch all components to - use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that - will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod - where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the - volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout - that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or - look for all required certificates. NB: if not provided, - this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address - or DNS name for the control plane; it can be a valid IP - address or a RFC-1123 DNS subdomain, both with optional - TCP port. In case the ControlPlaneEndpoint is not specified, - the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint - is specified but without a TCP port, the BindPort is used. - Possible usages are: e.g. In a cluster with more than one - control plane instances, this field should be assigned the - address of the external load balancer in front of the control - plane instances. e.g. in environments with enforced node - recycling, the ControlPlaneEndpoint could be used for assigning - a stable DNS to the control plane. NB: This value defaults - to the first value in the Cluster object status.apiEndpoints - array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for - the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass - to the control plane component. TODO: This is temporary - and ideally we would like to switch all components to - use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that - will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod - where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the - volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed - in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the - image. In case this value is set, kubeadm does not change - automatically the version of the above components during - upgrades. - type: string - type: - description: Type defines the DNS add-on to be used - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This - value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external - etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority - file used to secure etcd communication. Required - if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file - used to secure etcd communication. Required if using - a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for - ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure - etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring - the local etcd instance Local and External are mutually - exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place - its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided - to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for - the image. In case this value is set, kubeadm does - not change automatically the version of the above - components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative - Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative - Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to - pull images from. If empty, `k8s.gcr.io` will be used by - default; in case of kubernetes version is a CI build (kubernetes - version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` - will be used as a default for control plane components and - for kube-proxy, while `k8s.gcr.io` will be used for all - the other images. - type: string - kind: - description: 'Kind is a string value representing the REST - resource this object represents. Servers may infer this - from the endpoint the client submits requests to. Cannot - be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the - control plane. NB: This value defaults to the Machine object - spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking - topology of the cluster. NB: This value defaults to the - Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. - Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If - unset, the API server will not allocate CIDR ranges - for every node. Defaults to a comma-delimited string - of the Cluster object's spec.clusterNetwork.services.cidrBlocks - if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. - Defaults to a comma-delimited string of the Cluster - object's spec.clusterNetwork.pods.cidrBlocks, or to - "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler - control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass - to the control plane component. TODO: This is temporary - and ideally we would like to switch all components to - use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that - will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod - where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the - volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - useHyperKubeImage: - description: UseHyperKubeImage controls if hyperkube should - be used for Kubernetes components instead of their respective - separate images - type: boolean - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition - tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems - to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add - to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to - be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite - any existing filesystem. If true, any pre-existing - file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. - The valid options are: "auto|any", "auto", "any", - "none", and , where NUM is the actual partition - number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used - for Microsoft Azure that instructs cloud-init to replace - a file system of . NOTE: unless you define - a label, this requires the use of the ''any'' partition - directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions - to setup. - items: - description: Partition defines how to create and layout - a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If - it is true, a single partition will be created for - the entire device. When layout is false, it means - don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks - and create the partition if a partition or filesystem - is found on the device. Use with caution. Default - is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition - table. The following are supported: ''mbr'': default - and setups a MS-DOS partition table ''gpt'': setups - a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data - upon creation. - items: - description: File defines the input for generating write_files - in cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content - to populate the file. - properties: - secret: - description: Secret represents a secret that should - populate this file. - properties: - key: - description: Key is the key in the secret's data - map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file - contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, - e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where - to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign - to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap - data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration - are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` - time and describes a set of Bootstrap Tokens to create. - This information IS NOT uploaded to the kubeadm cluster - configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, - stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message - why this token exists and what it's used for, so other - administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this - token expires. Defaults to being set dynamically at - runtime based on the TTL. Expires and TTL are mutually - exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that - this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional - trust between nodes and control-planes. Used for joining - nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. - Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this - token can be used. Can by default be used for establishing - bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST - resource this object represents. Servers may infer this - from the endpoint the client submits requests to. Cannot - be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the - API server instance that's deployed on this control plane - node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint - in the sense that ControlPlaneEndpoint is the global endpoint - for the cluster, which then loadbalances the requests to - each individual API server. This configuration object lets - you customize what IP/DNS name and port the local API server - advertises it's accessible on. By default, kubeadm tries - to auto-detect the IP of the default interface and use that, - but in case that process fails you may set the desired value - here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for - the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API - Server to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to - registering the new control-plane node to the cluster. When - used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration and - JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node - API object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the - kubelet command line via the environment file kubeadm - writes at runtime for the kubelet to source. This overrides - the generic base-level configuration in the kubelet-config-1.X - ConfigMap Flags have higher priority when parsing. These - values are local and specific to the node kubeadm is - executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the - Node API object that will be created in this `kubeadm - init` or `kubeadm join` operation. This field is also - used in the CommonName field of the kubelet's client - certificate to the API server. Defaults to the hostname - of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API - object should be registered with. If this field is unset, - i.e. nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: {}` - in the YAML file. This field is solely used for Node - registration.' - items: - description: The node this Taint is attached to has - the "effect" on any pod that does not tolerate the - Taint. - properties: - effect: - description: Required. The effect of the taint on - pods that do not tolerate the taint. Valid effects - are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the - taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for - the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate - authority used to secure comunications between node and - control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". - TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane - instance to be deployed on the joining node. If nil, no - additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address - for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the - API Server to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet - to use during the TLS Bootstrap process TODO: revisit when - there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options - for bootstrap token based discovery BootstrapToken and - File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain - name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public - key pins to verify when token-based discovery is - used. The root CA found during discovery must match - one of these values. Specifying an empty set disables - root CA pinning, which can be unsafe. Each hash - is specified as ":", where the only - currently supported type is "sha256". This is a - hex-encoded SHA-256 hash of the Subject Public Key - Info (SPKI) object in DER-encoded ASN.1. These hashes - can be calculated using, for example, OpenSSL: openssl - x509 -pubkey -in ca.crt openssl rsa -pubin -outform - der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster - information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based - discovery without CA verification via CACertHashes. - This can weaken the security of kubeadm since other - nodes can impersonate the control-plane. - type: boolean - required: - - token - - unsafeSkipCAVerification - type: object - file: - description: File is used to specify a file or URL to - a kubeconfig file from which to load cluster information - BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the - actual file path or URL to the kubeconfig file from - which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: 'TLSBootstrapToken is a token used for TLS - bootstrapping. If .BootstrapToken is set, this field - is defaulted to .BootstrapToken.Token, but can be overridden. - If .File is set, this field **must be set** in case - the KubeConfigFile does not contain any other authentication - information TODO: revisit when there is defaulting from - k/k' - type: string - type: object - kind: - description: 'Kind is a string value representing the REST - resource this object represents. Servers may infer this - from the endpoint the client submits requests to. Cannot - be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to - registering the new control-plane node to the cluster. When - used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration and - JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node - API object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the - kubelet command line via the environment file kubeadm - writes at runtime for the kubelet to source. This overrides - the generic base-level configuration in the kubelet-config-1.X - ConfigMap Flags have higher priority when parsing. These - values are local and specific to the node kubeadm is - executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the - Node API object that will be created in this `kubeadm - init` or `kubeadm join` operation. This field is also - used in the CommonName field of the kubelet's client - certificate to the API server. Defaults to the hostname - of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API - object should be registered with. If this field is unset, - i.e. nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: {}` - in the YAML file. This field is solely used for Node - registration.' - items: - description: The node this Taint is attached to has - the "effect" on any pod that does not tolerate the - Taint. - properties: - effect: - description: Required. The effect of the taint on - pods that do not tolerate the taint. Valid effects - are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the - taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts - in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run - after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run - before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm - command with a shell script with retries for joins. \n This - is meant to be an experimental temporary workaround on some - environments where joins fail due to timing (and other issues). - The long term goal is to add retries to kubeadm proper and use - that functionality. \n This will add about 40KB to userdata - \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in - cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for - the user - type: string - homeDir: - description: HomeDir specifies the home directory to use - for the user - type: string - inactive: - description: Inactive specifies whether to mark the user - as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should - be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the - user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group for - the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized - keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level - verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the - controller will spend on draining a controlplane node The default - value is 0, meaning that the node can be drained without any time - limitations. NOTE: NodeDrainTimeout is different from `kubectl drain - --timeout`' - type: string - replicas: - description: Number of desired machines. Defaults to 1. When stacked - etcd is used only odd numbers are permitted, as per [etcd best practice](https://etcd.io/docs/v3.3.12/faq/#why-an-odd-number-of-cluster-members). - This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - rolloutStrategy: - description: The RolloutStrategy to use to replace control plane machines - with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if RolloutStrategyType - = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of control planes that can - be scheduled above or under the desired number of control - planes. Value can be an absolute number 1 or 0. Defaults - to 1. Example: when this is set to 1, the control plane - can be scaled up immediately when the rolling update starts.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of rollout. Currently the only supported strategy - is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - upgradeAfter: - description: UpgradeAfter is a field to indicate an upgrade should - be performed after the specified time even if no changes have been - made to the KubeadmControlPlane - format: date-time - type: string - version: - description: Version defines the desired Kubernetes version. - type: string - required: - - infrastructureTemplate - - kubeadmConfigSpec - - version - type: object - status: - description: KubeadmControlPlaneStatus defines the observed state of KubeadmControlPlane. - properties: - conditions: - description: Conditions defines current service state of the KubeadmControlPlane. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: ErrorMessage indicates that there is a terminal problem - reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a terminal problem - reconciling the state, and will be set to a token value suitable - for programmatic interpretation. - type: string - initialized: - description: Initialized denotes whether or not the control plane - has the uploaded kubeadm-config configmap. - type: boolean - observedGeneration: - description: ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - ready: - description: Ready denotes that the KubeadmControlPlane API Server - is ready to receive requests. - type: boolean - readyReplicas: - description: Total number of fully running and ready control plane - machines. - format: int32 - type: integer - replicas: - description: Total number of non-terminated machines targeted by this - control plane (their labels match the selector). - format: int32 - type: integer - selector: - description: 'Selector is the label selector in string format to avoid - introspection by clients, and is used to provide the CRD-based integration - for the scale subresource and additional integrations for things - like kubectl describe.. The string will be in the same format as - the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - unavailableReplicas: - description: Total number of unavailable machines targeted by this - control plane. This is the total number of machines that are still - required for the deployment to have 100% available capacity. They - may either be machines that are running but not yet ready or machines - that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: Total number of non-terminated machines targeted by this - control plane that have the desired template spec. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmControlPlane - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: This denotes whether or not the control plane has the uploaded - kubeadm-config configmap - jsonPath: .status.initialized - name: Initialized - type: boolean - - description: KubeadmControlPlane API Server is ready to receive requests - jsonPath: .status.ready - name: API Server Available - type: boolean - - description: Kubernetes version associated with this control plane - jsonPath: .spec.version - name: Version - type: string - - description: Total number of non-terminated machines targeted by this control - plane - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of fully running and ready control plane machines - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: Total number of non-terminated machines targeted by this control - plane that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this control plane - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - name: v1alpha4 - schema: - openAPIV3Schema: - description: KubeadmControlPlane is the Schema for the KubeadmControlPlane - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmControlPlaneSpec defines the desired state of KubeadmControlPlane. - properties: - kubeadmConfigSpec: - description: KubeadmConfigSpec is a KubeadmConfigSpec to use for initializing - and joining machines to the control plane. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration - are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API - server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names - for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass - to the control plane component. TODO: This is temporary - and ideally we would like to switch all components to - use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that - will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod - where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the - volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout - that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or - look for all required certificates. NB: if not provided, - this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address - or DNS name for the control plane; it can be a valid IP - address or a RFC-1123 DNS subdomain, both with optional - TCP port. In case the ControlPlaneEndpoint is not specified, - the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint - is specified but without a TCP port, the BindPort is used. - Possible usages are: e.g. In a cluster with more than one - control plane instances, this field should be assigned the - address of the external load balancer in front of the control - plane instances. e.g. in environments with enforced node - recycling, the ControlPlaneEndpoint could be used for assigning - a stable DNS to the control plane. NB: This value defaults - to the first value in the Cluster object status.apiEndpoints - array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for - the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass - to the control plane component. TODO: This is temporary - and ideally we would like to switch all components to - use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that - will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod - where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the - volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed - in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the - image. In case this value is set, kubeadm does not change - automatically the version of the above components during - upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This - value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external - etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority - file used to secure etcd communication. Required - if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file - used to secure etcd communication. Required if using - a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for - ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure - etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring - the local etcd instance Local and External are mutually - exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place - its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided - to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for - the image. In case this value is set, kubeadm does - not change automatically the version of the above - components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative - Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative - Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to - pull images from. If empty, `registry.k8s.io` will be used - by default; in case of kubernetes version is a CI build - (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` - will be used as a default for control plane components and - for kube-proxy, while `registry.k8s.io` will be used for - all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST - resource this object represents. Servers may infer this - from the endpoint the client submits requests to. Cannot - be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the - control plane. NB: This value defaults to the Machine object - spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking - topology of the cluster. NB: This value defaults to the - Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. - Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If - unset, the API server will not allocate CIDR ranges - for every node. Defaults to a comma-delimited string - of the Cluster object's spec.clusterNetwork.services.cidrBlocks - if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. - Defaults to a comma-delimited string of the Cluster - object's spec.clusterNetwork.pods.cidrBlocks, or to - "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler - control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass - to the control plane component. TODO: This is temporary - and ideally we would like to switch all components to - use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that - will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod - where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the - volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition - tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems - to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add - to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to - be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite - any existing filesystem. If true, any pre-existing - file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. - The valid options are: "auto|any", "auto", "any", - "none", and , where NUM is the actual partition - number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used - for Microsoft Azure that instructs cloud-init to replace - a file system of . NOTE: unless you define - a label, this requires the use of the ''any'' partition - directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions - to setup. - items: - description: Partition defines how to create and layout - a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If - it is true, a single partition will be created for - the entire device. When layout is false, it means - don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks - and create the partition if a partition or filesystem - is found on the device. Use with caution. Default - is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition - table. The following are supported: ''mbr'': default - and setups a MS-DOS partition table ''gpt'': setups - a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data - upon creation. - items: - description: File defines the input for generating write_files - in cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content - to populate the file. - properties: - secret: - description: Secret represents a secret that should - populate this file. - properties: - key: - description: Key is the key in the secret's data - map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file - contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, - e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where - to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign - to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap - data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration - are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` - time and describes a set of Bootstrap Tokens to create. - This information IS NOT uploaded to the kubeadm cluster - configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, - stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message - why this token exists and what it's used for, so other - administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this - token expires. Defaults to being set dynamically at - runtime based on the TTL. Expires and TTL are mutually - exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that - this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional - trust between nodes and control-planes. Used for joining - nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. - Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this - token can be used. Can by default be used for establishing - bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST - resource this object represents. Servers may infer this - from the endpoint the client submits requests to. Cannot - be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the - API server instance that's deployed on this control plane - node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint - in the sense that ControlPlaneEndpoint is the global endpoint - for the cluster, which then loadbalances the requests to - each individual API server. This configuration object lets - you customize what IP/DNS name and port the local API server - advertises it's accessible on. By default, kubeadm tries - to auto-detect the IP of the default interface and use that, - but in case that process fails you may set the desired value - here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for - the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API - Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to - registering the new control-plane node to the cluster. When - used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration and - JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node - API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of - pre-flight errors to be ignored when the current node - is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the - kubelet command line via the environment file kubeadm - writes at runtime for the kubelet to source. This overrides - the generic base-level configuration in the kubelet-config-1.X - ConfigMap Flags have higher priority when parsing. These - values are local and specific to the node kubeadm is - executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the - Node API object that will be created in this `kubeadm - init` or `kubeadm join` operation. This field is also - used in the CommonName field of the kubelet's client - certificate to the API server. Defaults to the hostname - of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API - object should be registered with. If this field is unset, - i.e. nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: {}` - in the YAML file. This field is solely used for Node - registration.' - items: - description: The node this Taint is attached to has - the "effect" on any pod that does not tolerate the - Taint. - properties: - effect: - description: Required. The effect of the taint on - pods that do not tolerate the taint. Valid effects - are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the - taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for - the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate - authority used to secure comunications between node and - control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". - TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane - instance to be deployed on the joining node. If nil, no - additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address - for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the - API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet - to use during the TLS Bootstrap process TODO: revisit when - there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options - for bootstrap token based discovery BootstrapToken and - File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain - name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public - key pins to verify when token-based discovery is - used. The root CA found during discovery must match - one of these values. Specifying an empty set disables - root CA pinning, which can be unsafe. Each hash - is specified as ":", where the only - currently supported type is "sha256". This is a - hex-encoded SHA-256 hash of the Subject Public Key - Info (SPKI) object in DER-encoded ASN.1. These hashes - can be calculated using, for example, OpenSSL: openssl - x509 -pubkey -in ca.crt openssl rsa -pubin -outform - der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster - information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based - discovery without CA verification via CACertHashes. - This can weaken the security of kubeadm since other - nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to - a kubeconfig file from which to load cluster information - BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the - actual file path or URL to the kubeconfig file from - which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS - bootstrapping. If .BootstrapToken is set, this field - is defaulted to .BootstrapToken.Token, but can be overridden. - If .File is set, this field **must be set** in case - the KubeConfigFile does not contain any other authentication - information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST - resource this object represents. Servers may infer this - from the endpoint the client submits requests to. Cannot - be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to - registering the new control-plane node to the cluster. When - used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration and - JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node - API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of - pre-flight errors to be ignored when the current node - is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the - kubelet command line via the environment file kubeadm - writes at runtime for the kubelet to source. This overrides - the generic base-level configuration in the kubelet-config-1.X - ConfigMap Flags have higher priority when parsing. These - values are local and specific to the node kubeadm is - executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the - Node API object that will be created in this `kubeadm - init` or `kubeadm join` operation. This field is also - used in the CommonName field of the kubelet's client - certificate to the API server. Defaults to the hostname - of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API - object should be registered with. If this field is unset, - i.e. nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: {}` - in the YAML file. This field is solely used for Node - registration.' - items: - description: The node this Taint is attached to has - the "effect" on any pod that does not tolerate the - Taint. - properties: - effect: - description: Required. The effect of the taint on - pods that do not tolerate the taint. Valid effects - are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the - taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts - in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run - after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run - before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm - command with a shell script with retries for joins. \n This - is meant to be an experimental temporary workaround on some - environments where joins fail due to timing (and other issues). - The long term goal is to add retries to kubeadm proper and use - that functionality. \n This will add about 40KB to userdata - \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in - cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for - the user - type: string - homeDir: - description: HomeDir specifies the home directory to use - for the user - type: string - inactive: - description: Inactive specifies whether to mark the user - as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should - be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the - user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group for - the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized - keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level - verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - machineTemplate: - description: MachineTemplate contains information about how machines - should be shaped when creating or updating a control plane. - properties: - infrastructureRef: - description: InfrastructureRef is a required reference to a custom - resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part - of an object. TODO: this design is not final and this field - is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that - the controller will spend on draining a controlplane node The - default value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different from - `kubectl drain --timeout`' - type: string - required: - - infrastructureRef - type: object - replicas: - description: Number of desired machines. Defaults to 1. When stacked - etcd is used only odd numbers are permitted, as per [etcd best practice](https://etcd.io/docs/v3.3.12/faq/#why-an-odd-number-of-cluster-members). - This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - rolloutAfter: - description: RolloutAfter is a field to indicate a rollout should - be performed after the specified time even if no changes have been - made to the KubeadmControlPlane. - format: date-time - type: string - rolloutStrategy: - default: - rollingUpdate: - maxSurge: 1 - type: RollingUpdate - description: The RolloutStrategy to use to replace control plane machines - with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if RolloutStrategyType - = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of control planes that can - be scheduled above or under the desired number of control - planes. Value can be an absolute number 1 or 0. Defaults - to 1. Example: when this is set to 1, the control plane - can be scaled up immediately when the rolling update starts.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of rollout. Currently the only supported strategy - is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - version: - description: Version defines the desired Kubernetes version. - type: string - required: - - kubeadmConfigSpec - - machineTemplate - - version - type: object - status: - description: KubeadmControlPlaneStatus defines the observed state of KubeadmControlPlane. - properties: - conditions: - description: Conditions defines current service state of the KubeadmControlPlane. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: ErrorMessage indicates that there is a terminal problem - reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a terminal problem - reconciling the state, and will be set to a token value suitable - for programmatic interpretation. - type: string - initialized: - description: Initialized denotes whether or not the control plane - has the uploaded kubeadm-config configmap. - type: boolean - observedGeneration: - description: ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - ready: - description: Ready denotes that the KubeadmControlPlane API Server - is ready to receive requests. - type: boolean - readyReplicas: - description: Total number of fully running and ready control plane - machines. - format: int32 - type: integer - replicas: - description: Total number of non-terminated machines targeted by this - control plane (their labels match the selector). - format: int32 - type: integer - selector: - description: 'Selector is the label selector in string format to avoid - introspection by clients, and is used to provide the CRD-based integration - for the scale subresource and additional integrations for things - like kubectl describe.. The string will be in the same format as - the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - unavailableReplicas: - description: Total number of unavailable machines targeted by this - control plane. This is the total number of machines that are still - required for the deployment to have 100% available capacity. They - may either be machines that are running but not yet ready or machines - that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: Total number of non-terminated machines targeted by this - control plane that have the desired template spec. - format: int32 - type: integer - version: - description: Version represents the minimum Kubernetes version for - the control plane machines in the cluster. - type: string - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .metadata.labels['cluster\.x-k8s\.io/cluster-name'] - name: Cluster - type: string - - description: This denotes whether or not the control plane has the uploaded - kubeadm-config configmap - jsonPath: .status.initialized - name: Initialized - type: boolean - - description: KubeadmControlPlane API Server is ready to receive requests - jsonPath: .status.ready - name: API Server Available - type: boolean - - description: Total number of machines desired by this control plane - jsonPath: .spec.replicas - name: Desired - priority: 10 - type: integer - - description: Total number of non-terminated machines targeted by this control - plane - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of fully running and ready control plane machines - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: Total number of non-terminated machines targeted by this control - plane that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this control plane - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - - description: Time duration since creation of KubeadmControlPlane - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this control plane - jsonPath: .spec.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: KubeadmControlPlane is the Schema for the KubeadmControlPlane - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmControlPlaneSpec defines the desired state of KubeadmControlPlane. - properties: - kubeadmConfigSpec: - description: KubeadmConfigSpec is a KubeadmConfigSpec to use for initializing - and joining machines to the control plane. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration - are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API - server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names - for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass - to the control plane component. TODO: This is temporary - and ideally we would like to switch all components to - use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that - will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod - where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the - volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout - that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or - look for all required certificates. NB: if not provided, - this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address - or DNS name for the control plane; it can be a valid IP - address or a RFC-1123 DNS subdomain, both with optional - TCP port. In case the ControlPlaneEndpoint is not specified, - the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint - is specified but without a TCP port, the BindPort is used. - Possible usages are: e.g. In a cluster with more than one - control plane instances, this field should be assigned the - address of the external load balancer in front of the control - plane instances. e.g. in environments with enforced node - recycling, the ControlPlaneEndpoint could be used for assigning - a stable DNS to the control plane. NB: This value defaults - to the first value in the Cluster object status.apiEndpoints - array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for - the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass - to the control plane component. TODO: This is temporary - and ideally we would like to switch all components to - use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that - will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod - where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the - volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed - in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the - image. In case this value is set, kubeadm does not change - automatically the version of the above components during - upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This - value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external - etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority - file used to secure etcd communication. Required - if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file - used to secure etcd communication. Required if using - a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for - ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure - etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring - the local etcd instance Local and External are mutually - exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place - its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided - to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry - to pull images from. if not set, the ImageRepository - defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for - the image. In case this value is set, kubeadm does - not change automatically the version of the above - components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative - Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative - Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to - pull images from. If empty, `registry.k8s.io` will be used - by default; in case of kubernetes version is a CI build - (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` - will be used as a default for control plane components and - for kube-proxy, while `registry.k8s.io` will be used for - all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST - resource this object represents. Servers may infer this - from the endpoint the client submits requests to. Cannot - be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the - control plane. NB: This value defaults to the Machine object - spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking - topology of the cluster. NB: This value defaults to the - Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. - Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If - unset, the API server will not allocate CIDR ranges - for every node. Defaults to a comma-delimited string - of the Cluster object's spec.clusterNetwork.services.cidrBlocks - if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. - Defaults to a comma-delimited string of the Cluster - object's spec.clusterNetwork.pods.cidrBlocks, or to - "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler - control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass - to the control plane component. TODO: This is temporary - and ideally we would like to switch all components to - use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, - mounted to the control plane component. - items: - description: HostPathMount contains elements describing - volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that - will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod - where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the - volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition - tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems - to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add - to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to - be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite - any existing filesystem. If true, any pre-existing - file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. - The valid options are: "auto|any", "auto", "any", - "none", and , where NUM is the actual partition - number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used - for Microsoft Azure that instructs cloud-init to replace - a file system of . NOTE: unless you define - a label, this requires the use of the ''any'' partition - directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions - to setup. - items: - description: Partition defines how to create and layout - a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If - it is true, a single partition will be created for - the entire device. When layout is false, it means - don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks - and create the partition if a partition or filesystem - is found on the device. Use with caution. Default - is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition - table. The following are supported: ''mbr'': default - and setups a MS-DOS partition table ''gpt'': setups - a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data - upon creation. - items: - description: File defines the input for generating write_files - in cloud-init. - properties: - append: - description: Append specifies whether to append Content - to existing file if Path exists. - type: boolean - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content - to populate the file. - properties: - secret: - description: Secret represents a secret that should - populate this file. - properties: - key: - description: Key is the key in the secret's data - map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file - contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, - e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where - to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign - to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap - data - enum: - - cloud-config - - ignition - type: string - ignition: - description: Ignition contains Ignition specific configuration. - properties: - containerLinuxConfig: - description: ContainerLinuxConfig contains CLC specific configuration. - properties: - additionalConfig: - description: "AdditionalConfig contains additional configuration - to be merged with the Ignition configuration generated - by the bootstrapper controller. More info: https://coreos.github.io/ignition/operator-notes/#config-merging - \n The data format is documented here: https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/" - type: string - strict: - description: Strict controls if AdditionalConfig should - be strictly parsed. If so, warnings are treated as errors. - type: boolean - type: object - type: object - initConfiguration: - description: InitConfiguration along with ClusterConfiguration - are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` - time and describes a set of Bootstrap Tokens to create. - This information IS NOT uploaded to the kubeadm cluster - configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, - stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message - why this token exists and what it's used for, so other - administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this - token expires. Defaults to being set dynamically at - runtime based on the TTL. Expires and TTL are mutually - exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that - this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional - trust between nodes and control-planes. Used for joining - nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. - Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this - token can be used. Can by default be used for establishing - bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST - resource this object represents. Servers may infer this - from the endpoint the client submits requests to. Cannot - be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the - API server instance that's deployed on this control plane - node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint - in the sense that ControlPlaneEndpoint is the global endpoint - for the cluster, which then loadbalances the requests to - each individual API server. This configuration object lets - you customize what IP/DNS name and port the local API server - advertises it's accessible on. By default, kubeadm tries - to auto-detect the IP of the default interface and use that, - but in case that process fails you may set the desired value - here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for - the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API - Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to - registering the new control-plane node to the cluster. When - used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration and - JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node - API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of - pre-flight errors to be ignored when the current node - is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the - kubelet command line via the environment file kubeadm - writes at runtime for the kubelet to source. This overrides - the generic base-level configuration in the kubelet-config-1.X - ConfigMap Flags have higher priority when parsing. These - values are local and specific to the node kubeadm is - executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the - Node API object that will be created in this `kubeadm - init` or `kubeadm join` operation. This field is also - used in the CommonName field of the kubelet's client - certificate to the API server. Defaults to the hostname - of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API - object should be registered with. If this field is unset, - i.e. nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: {}` - in the YAML file. This field is solely used for Node - registration.' - items: - description: The node this Taint is attached to has - the "effect" on any pod that does not tolerate the - Taint. - properties: - effect: - description: Required. The effect of the taint on - pods that do not tolerate the taint. Valid effects - are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the - taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying - patches to components deployed by kubeadm during "kubeadm - init". The minimum kubernetes version needed to support - Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains - files named "target[suffix][+patchtype].extension". - For example, "kube-apiserver0+merge.yaml" or just "etcd.json". - "target" can be one of "kube-apiserver", "kube-controller-manager", - "kube-scheduler", "etcd". "patchtype" can be one of - "strategic" "merge" or "json" and they match the patch - formats supported by kubectl. The default "patchtype" - is "strategic". "extension" must be either "json" or - "yaml". "suffix" is an optional string that can be used - to determine which patches are applied first alpha-numerically. - These files can be written into the target directory - via KubeadmConfig.Files which specifies additional files - to be created on the machine, either with content inline - or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during - command execution. The list of phases can be obtained with - the "kubeadm init --help" command. This option takes effect - only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for - the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this - representation of an object. Servers should convert recognized - schemas to the latest internal value, and may reject unrecognized - values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate - authority used to secure comunications between node and - control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". - TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane - instance to be deployed on the joining node. If nil, no - additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address - for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the - API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet - to use during the TLS Bootstrap process TODO: revisit when - there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options - for bootstrap token based discovery BootstrapToken and - File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain - name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public - key pins to verify when token-based discovery is - used. The root CA found during discovery must match - one of these values. Specifying an empty set disables - root CA pinning, which can be unsafe. Each hash - is specified as ":", where the only - currently supported type is "sha256". This is a - hex-encoded SHA-256 hash of the Subject Public Key - Info (SPKI) object in DER-encoded ASN.1. These hashes - can be calculated using, for example, OpenSSL: openssl - x509 -pubkey -in ca.crt openssl rsa -pubin -outform - der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster - information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based - discovery without CA verification via CACertHashes. - This can weaken the security of kubeadm since other - nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to - a kubeconfig file from which to load cluster information - BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the - actual file path or URL to the kubeconfig file from - which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS - bootstrapping. If .BootstrapToken is set, this field - is defaulted to .BootstrapToken.Token, but can be overridden. - If .File is set, this field **must be set** in case - the KubeConfigFile does not contain any other authentication - information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST - resource this object represents. Servers may infer this - from the endpoint the client submits requests to. Cannot - be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to - registering the new control-plane node to the cluster. When - used in the context of control plane nodes, NodeRegistration - should remain consistent across both InitConfiguration and - JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime - info. This information will be annotated to the Node - API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of - pre-flight errors to be ignored when the current node - is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments - to the kubelet. The arguments here are passed to the - kubelet command line via the environment file kubeadm - writes at runtime for the kubelet to source. This overrides - the generic base-level configuration in the kubelet-config-1.X - ConfigMap Flags have higher priority when parsing. These - values are local and specific to the node kubeadm is - executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the - Node API object that will be created in this `kubeadm - init` or `kubeadm join` operation. This field is also - used in the CommonName field of the kubelet's client - certificate to the API server. Defaults to the hostname - of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API - object should be registered with. If this field is unset, - i.e. nil, in the `kubeadm init` process it will be defaulted - to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane node, - set this field to an empty slice, i.e. `taints: {}` - in the YAML file. This field is solely used for Node - registration.' - items: - description: The node this Taint is attached to has - the "effect" on any pod that does not tolerate the - Taint. - properties: - effect: - description: Required. The effect of the taint on - pods that do not tolerate the taint. Valid effects - are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied - to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which - the taint was added. It is only written for NoExecute - taints. - format: date-time - type: string - value: - description: The taint value corresponding to the - taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying - patches to components deployed by kubeadm during "kubeadm - join". The minimum kubernetes version needed to support - Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains - files named "target[suffix][+patchtype].extension". - For example, "kube-apiserver0+merge.yaml" or just "etcd.json". - "target" can be one of "kube-apiserver", "kube-controller-manager", - "kube-scheduler", "etcd". "patchtype" can be one of - "strategic" "merge" or "json" and they match the patch - formats supported by kubectl. The default "patchtype" - is "strategic". "extension" must be either "json" or - "yaml". "suffix" is an optional string that can be used - to determine which patches are applied first alpha-numerically. - These files can be written into the target directory - via KubeadmConfig.Files which specifies additional files - to be created on the machine, either with content inline - or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during - command execution. The list of phases can be obtained with - the "kubeadm init --help" command. This option takes effect - only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts - in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run - after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run - before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm - command with a shell script with retries for joins. \n This - is meant to be an experimental temporary workaround on some - environments where joins fail due to timing (and other issues). - The long term goal is to add retries to kubeadm proper and use - that functionality. \n This will add about 40KB to userdata - \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055. - Deprecated: This experimental fix is no longer needed and this - field will be removed in a future release." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in - cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for - the user - type: string - homeDir: - description: HomeDir specifies the home directory to use - for the user - type: string - inactive: - description: Inactive specifies whether to mark the user - as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should - be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the - user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of passwd - to populate the passwd. - properties: - secret: - description: Secret represents a secret that should - populate this password. - properties: - key: - description: Key is the key in the secret's data - map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary group for - the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized - keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level - verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - machineTemplate: - description: MachineTemplate contains information about how machines - should be shaped when creating or updating a control plane. - properties: - infrastructureRef: - description: InfrastructureRef is a required reference to a custom - resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part - of an object. TODO: this design is not final and this field - is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - nodeDeletionTimeout: - description: NodeDeletionTimeout defines how long the machine - controller will attempt to delete the Node that the Machine - hosts after the Machine is marked for deletion. A duration of - 0 will retry deletion indefinitely. If no value is provided, - the default value for this property of the Machine resource - will be used. - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that - the controller will spend on draining a controlplane node The - default value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different from - `kubectl drain --timeout`' - type: string - required: - - infrastructureRef - type: object - replicas: - description: Number of desired machines. Defaults to 1. When stacked - etcd is used only odd numbers are permitted, as per [etcd best practice](https://etcd.io/docs/v3.3.12/faq/#why-an-odd-number-of-cluster-members). - This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - rolloutAfter: - description: RolloutAfter is a field to indicate a rollout should - be performed after the specified time even if no changes have been - made to the KubeadmControlPlane. - format: date-time - type: string - rolloutBefore: - description: RolloutBefore is a field to indicate a rollout should - be performed if the specified criteria is met. - properties: - certificatesExpiryDays: - description: CertificatesExpiryDays indicates a rollout needs - to be performed if the certificates of the machine will expire - within the specified days. - format: int32 - type: integer - type: object - rolloutStrategy: - default: - rollingUpdate: - maxSurge: 1 - type: RollingUpdate - description: The RolloutStrategy to use to replace control plane machines - with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if RolloutStrategyType - = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of control planes that can - be scheduled above or under the desired number of control - planes. Value can be an absolute number 1 or 0. Defaults - to 1. Example: when this is set to 1, the control plane - can be scaled up immediately when the rolling update starts.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of rollout. Currently the only supported strategy - is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - version: - description: Version defines the desired Kubernetes version. - type: string - required: - - kubeadmConfigSpec - - machineTemplate - - version - type: object - status: - description: KubeadmControlPlaneStatus defines the observed state of KubeadmControlPlane. - properties: - conditions: - description: Conditions defines current service state of the KubeadmControlPlane. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: ErrorMessage indicates that there is a terminal problem - reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a terminal problem - reconciling the state, and will be set to a token value suitable - for programmatic interpretation. - type: string - initialized: - description: Initialized denotes whether or not the control plane - has the uploaded kubeadm-config configmap. - type: boolean - observedGeneration: - description: ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - ready: - description: Ready denotes that the KubeadmControlPlane API Server - is ready to receive requests. - type: boolean - readyReplicas: - description: Total number of fully running and ready control plane - machines. - format: int32 - type: integer - replicas: - description: Total number of non-terminated machines targeted by this - control plane (their labels match the selector). - format: int32 - type: integer - selector: - description: 'Selector is the label selector in string format to avoid - introspection by clients, and is used to provide the CRD-based integration - for the scale subresource and additional integrations for things - like kubectl describe.. The string will be in the same format as - the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - unavailableReplicas: - description: Total number of unavailable machines targeted by this - control plane. This is the total number of machines that are still - required for the deployment to have 100% available capacity. They - may either be machines that are running but not yet ready or machines - that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: Total number of non-terminated machines targeted by this - control plane that have the desired template spec. - format: int32 - type: integer - version: - description: Version represents the minimum Kubernetes version for - the control plane machines in the cluster. - type: string - type: object - type: object - served: true - storage: true - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-control-plane-system/capi-kubeadm-control-plane-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: kubeadmcontrolplanetemplates.controlplane.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: controlplane.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: KubeadmControlPlaneTemplate - listKind: KubeadmControlPlaneTemplateList - plural: kubeadmcontrolplanetemplates - singular: kubeadmcontrolplanetemplate - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmControlPlaneTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: KubeadmControlPlaneTemplate is the Schema for the kubeadmcontrolplanetemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmControlPlaneTemplateSpec defines the desired state - of KubeadmControlPlaneTemplate. - properties: - template: - description: KubeadmControlPlaneTemplateResource describes the data - needed to create a KubeadmControlPlane from a template. - properties: - spec: - description: KubeadmControlPlaneSpec defines the desired state - of KubeadmControlPlane. - properties: - kubeadmConfigSpec: - description: KubeadmConfigSpec is a KubeadmConfigSpec to use - for initializing and joining machines to the control plane. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration - are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for - the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative - Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags - to pass to the control plane component. TODO: - This is temporary and ideally we would like - to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements - describing volumes that are mounted from the - host. - properties: - hostPath: - description: HostPath is the path in the - host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside - the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the - pod template. - type: string - pathType: - description: PathType is the type of the - HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the - timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal - value, and may reject unrecognized values. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store - or look for all required certificates. NB: if not - provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP - address or DNS name for the control plane; it can - be a valid IP address or a RFC-1123 DNS subdomain, - both with optional TCP port. In case the ControlPlaneEndpoint - is not specified, the AdvertiseAddress + BindPort - are used; in case the ControlPlaneEndpoint is specified - but without a TCP port, the BindPort is used. Possible - usages are: e.g. In a cluster with more than one - control plane instances, this field should be assigned - the address of the external load balancer in front - of the control plane instances. e.g. in environments - with enforced node recycling, the ControlPlaneEndpoint - could be used for assigning a stable DNS to the - control plane. NB: This value defaults to the first - value in the Cluster object status.apiEndpoints - array.' - type: string - controllerManager: - description: ControllerManager contains extra settings - for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags - to pass to the control plane component. TODO: - This is temporary and ideally we would like - to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements - describing volumes that are mounted from the - host. - properties: - hostPath: - description: HostPath is the path in the - host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside - the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the - pod template. - type: string - pathType: - description: PathType is the type of the - HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on - installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container - registry to pull images from. if not set, the - ImageRepository defined in ClusterConfiguration - will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag - for the image. In case this value is set, kubeadm - does not change automatically the version of - the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: - This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect - to an external etcd cluster Local and External - are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate - Authority file used to secure etcd communication. - Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification - file used to secure etcd communication. - Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required - for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used - to secure etcd communication. Required if - using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs - for configuring the local etcd instance Local - and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd - will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments - provided to the etcd binary when run inside - a static pod. - type: object - imageRepository: - description: ImageRepository sets the container - registry to pull images from. if not set, - the ImageRepository defined in ClusterConfiguration - will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a - tag for the image. In case this value is - set, kubeadm does not change automatically - the version of the above components during - upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject - Alternative Names for the etcd peer signing - cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject - Alternative Names for the etcd server signing - cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry - to pull images from. If empty, `registry.k8s.io` - will be used by default; in case of kubernetes version - is a CI build (kubernetes version starts with `ci/` - or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will - be used as a default for control plane components - and for kube-proxy, while `registry.k8s.io` will - be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing - the REST resource this object represents. Servers - may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version - of the control plane. NB: This value defaults to - the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the - networking topology of the cluster. NB: This value - defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used - by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. - If unset, the API server will not allocate CIDR - ranges for every node. Defaults to a comma-delimited - string of the Cluster object's spec.clusterNetwork.services.cidrBlocks - if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used - by k8s services. Defaults to a comma-delimited - string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, - or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for - the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags - to pass to the control plane component. TODO: - This is temporary and ideally we would like - to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements - describing volumes that are mounted from the - host. - properties: - hostPath: - description: HostPath is the path in the - host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside - the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the - pod template. - type: string - pathType: - description: PathType is the type of the - HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation - of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file - systems to setup. - items: - description: Filesystem defines the file systems - to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options - to add to the command for creating the file - system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system - type. - type: string - label: - description: Label specifies the file system - label to be used. If set to None, no label - is used. - type: string - overwrite: - description: Overwrite defines whether or not - to overwrite any existing filesystem. If true, - any pre-existing file system will be destroyed. - Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition - to use. The valid options are: "auto|any", - "auto", "any", "none", and , where NUM - is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, - used for Microsoft Azure that instructs cloud-init - to replace a file system of . NOTE: - unless you define a label, this requires the - use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the - partitions to setup. - items: - description: Partition defines how to create and - layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. - If it is true, a single partition will be - created for the entire device. When layout - is false, it means don't partition or ignore - existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to - skip checks and create the partition if a - partition or filesystem is found on the device. - Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of - partition table. The following are supported: - ''mbr'': default and setups a MS-DOS partition - table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed - to user_data upon creation. - items: - description: File defines the input for generating write_files - in cloud-init. - properties: - content: - description: Content is the actual content of the - file. - type: string - contentFrom: - description: ContentFrom is a referenced source - of content to populate the file. - properties: - secret: - description: Secret represents a secret that - should populate this file. - properties: - key: - description: Key is the key in the secret's - data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of - the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the - file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk - where to store the file. - type: string - permissions: - description: Permissions specifies the permissions - to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the - bootstrap data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration - are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal - value, and may reject unrecognized values. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm - init` time and describes a set of Bootstrap Tokens - to create. This information IS NOT uploaded to the - kubeadm cluster configmap, partly because of its - sensitive nature - items: - description: BootstrapToken describes one bootstrap - token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly - message why this token exists and what it's - used for, so other administrators can know - its purpose. - type: string - expires: - description: Expires specifies the timestamp - when this token expires. Defaults to being - set dynamically at runtime based on the TTL. - Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups - that this token will authenticate as when/if - used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing - bidirectional trust between nodes and control-planes. - Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for - this token. Defaults to 24h. Expires and TTL - are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which - this token can be used. Can by default be - used for establishing bidirectional trust, - but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing - the REST resource this object represents. Servers - may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance that's deployed on this - control plane node In HA setups, this differs from - ClusterConfiguration.ControlPlaneEndpoint in the - sense that ControlPlaneEndpoint is the global endpoint - for the cluster, which then loadbalances the requests - to each individual API server. This configuration - object lets you customize what IP/DNS name and port - the local API server advertises it's accessible - on. By default, kubeadm tries to auto-detect the - IP of the default interface and use that, but in - case that process fails you may set the desired - value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address - for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for - the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate - to registering the new control-plane node to the - cluster. When used in the context of control plane - nodes, NodeRegistration should remain consistent - across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container - runtime info. This information will be annotated - to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a - slice of pre-flight errors to be ignored when - the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra - arguments to the kubelet. The arguments here - are passed to the kubelet command line via the - environment file kubeadm writes at runtime for - the kubelet to source. This overrides the generic - base-level configuration in the kubelet-config-1.X - ConfigMap Flags have higher priority when parsing. - These values are local and specific to the node - kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field - of the Node API object that will be created - in this `kubeadm init` or `kubeadm join` operation. - This field is also used in the CommonName field - of the kubelet's client certificate to the API - server. Defaults to the hostname of the node - if not provided. - type: string - taints: - description: 'Taints specifies the taints the - Node API object should be registered with. If - this field is unset, i.e. nil, in the `kubeadm - init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane - node, set this field to an empty slice, i.e. - `taints: {}` in the YAML file. This field is - solely used for Node registration.' - items: - description: The node this Taint is attached - to has the "effect" on any pod that does not - tolerate the Taint. - properties: - effect: - description: Required. The effect of the - taint on pods that do not tolerate the - taint. Valid effects are NoSchedule, PreferNoSchedule - and NoExecute. - type: string - key: - description: Required. The taint key to - be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time - at which the taint was added. It is only - written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding - to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration - for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal - value, and may reject unrecognized values. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate - authority used to secure comunications between node - and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". - TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control - plane instance to be deployed on the joining node. - If nil, no additional control plane instance will - be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance to be deployed on - this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP - address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port - for the API Server to bind to. Defaults - to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for - the kubelet to use during the TLS Bootstrap process - TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the - options for bootstrap token based discovery - BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or - domain name to the API server from which - info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set - of public key pins to verify when token-based - discovery is used. The root CA found during - discovery must match one of these values. - Specifying an empty set disables root CA - pinning, which can be unsafe. Each hash - is specified as ":", where - the only currently supported type is "sha256". - This is a hex-encoded SHA-256 hash of the - Subject Public Key Info (SPKI) object in - DER-encoded ASN.1. These hashes can be calculated - using, for example, OpenSSL: openssl x509 - -pubkey -in ca.crt openssl rsa -pubin -outform - der 2>&/dev/null | openssl dgst -sha256 - -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate - cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows - token-based discovery without CA verification - via CACertHashes. This can weaken the security - of kubeadm since other nodes can impersonate - the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or - URL to a kubeconfig file from which to load - cluster information BootstrapToken and File - are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify - the actual file path or URL to the kubeconfig - file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used - for TLS bootstrapping. If .BootstrapToken is - set, this field is defaulted to .BootstrapToken.Token, - but can be overridden. If .File is set, this - field **must be set** in case the KubeConfigFile - does not contain any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing - the REST resource this object represents. Servers - may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate - to registering the new control-plane node to the - cluster. When used in the context of control plane - nodes, NodeRegistration should remain consistent - across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container - runtime info. This information will be annotated - to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a - slice of pre-flight errors to be ignored when - the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra - arguments to the kubelet. The arguments here - are passed to the kubelet command line via the - environment file kubeadm writes at runtime for - the kubelet to source. This overrides the generic - base-level configuration in the kubelet-config-1.X - ConfigMap Flags have higher priority when parsing. - These values are local and specific to the node - kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field - of the Node API object that will be created - in this `kubeadm init` or `kubeadm join` operation. - This field is also used in the CommonName field - of the kubelet's client certificate to the API - server. Defaults to the hostname of the node - if not provided. - type: string - taints: - description: 'Taints specifies the taints the - Node API object should be registered with. If - this field is unset, i.e. nil, in the `kubeadm - init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane - node, set this field to an empty slice, i.e. - `taints: {}` in the YAML file. This field is - solely used for Node registration.' - items: - description: The node this Taint is attached - to has the "effect" on any pod that does not - tolerate the Taint. - properties: - effect: - description: Required. The effect of the - taint on pods that do not tolerate the - taint. Valid effects are NoSchedule, PreferNoSchedule - and NoExecute. - type: string - key: - description: Required. The taint key to - be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time - at which the taint was added. It is only - written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding - to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to - be setup. - items: - description: MountPoints defines input for generated - mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should - be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to - use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands - to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands - to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic - kubeadm command with a shell script with retries for - joins. \n This is meant to be an experimental temporary - workaround on some environments where joins fail due - to timing (and other issues). The long term goal is - to add retries to kubeadm proper and use that functionality. - \n This will add about 40KB to userdata \n For more - information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated - user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for - the user - type: string - groups: - description: Groups specifies the additional groups - for the user - type: string - homeDir: - description: HomeDir specifies the home directory - to use for the user - type: string - inactive: - description: Inactive specifies whether to mark - the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password - login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password - for the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary - group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list - of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the - user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log - level verbosity. It overrides the `--v` flag in kubeadm - commands. - format: int32 - type: integer - type: object - machineTemplate: - description: MachineTemplate contains information about how - machines should be shaped when creating or updating a control - plane. - properties: - infrastructureRef: - description: InfrastructureRef is a required reference - to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - metadata: - description: 'Standard object''s metadata. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value - map stored with a resource that may be set by external - tools to store and retrieve arbitrary metadata. - They are not queryable and should be preserved when - modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can - be used to organize and categorize (scope and select) - objects. May match selectors of replication controllers - and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of - time that the controller will spend on draining a controlplane - node The default value is 0, meaning that the node can - be drained without any time limitations. NOTE: NodeDrainTimeout - is different from `kubectl drain --timeout`' - type: string - required: - - infrastructureRef - type: object - replicas: - description: Number of desired machines. Defaults to 1. When - stacked etcd is used only odd numbers are permitted, as - per [etcd best practice](https://etcd.io/docs/v3.3.12/faq/#why-an-odd-number-of-cluster-members). - This is a pointer to distinguish between explicit zero and - not specified. - format: int32 - type: integer - rolloutAfter: - description: RolloutAfter is a field to indicate a rollout - should be performed after the specified time even if no - changes have been made to the KubeadmControlPlane. - format: date-time - type: string - rolloutStrategy: - default: - rollingUpdate: - maxSurge: 1 - type: RollingUpdate - description: The RolloutStrategy to use to replace control - plane machines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only - if RolloutStrategyType = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of control planes - that can be scheduled above or under the desired - number of control planes. Value can be an absolute - number 1 or 0. Defaults to 1. Example: when this - is set to 1, the control plane can be scaled up - immediately when the rolling update starts.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of rollout. Currently the only supported - strategy is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - version: - description: Version defines the desired Kubernetes version. - type: string - required: - - kubeadmConfigSpec - - machineTemplate - - version - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmControlPlaneTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: KubeadmControlPlaneTemplate is the Schema for the kubeadmcontrolplanetemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmControlPlaneTemplateSpec defines the desired state - of KubeadmControlPlaneTemplate. - properties: - template: - description: KubeadmControlPlaneTemplateResource describes the data - needed to create a KubeadmControlPlane from a template. - properties: - spec: - description: 'KubeadmControlPlaneTemplateResourceSpec defines - the desired state of KubeadmControlPlane. NOTE: KubeadmControlPlaneTemplateResourceSpec - is similar to KubeadmControlPlaneSpec but omits Replicas and - Version fields. These fields do not make sense on the KubeadmControlPlaneTemplate, - because they are calculated by the Cluster topology reconciler - during reconciliation and thus cannot be configured on the KubeadmControlPlaneTemplate.' - properties: - kubeadmConfigSpec: - description: KubeadmConfigSpec is a KubeadmConfigSpec to use - for initializing and joining machines to the control plane. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration - are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for - the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative - Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags - to pass to the control plane component. TODO: - This is temporary and ideally we would like - to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements - describing volumes that are mounted from the - host. - properties: - hostPath: - description: HostPath is the path in the - host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside - the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the - pod template. - type: string - pathType: - description: PathType is the type of the - HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the - timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal - value, and may reject unrecognized values. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store - or look for all required certificates. NB: if not - provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP - address or DNS name for the control plane; it can - be a valid IP address or a RFC-1123 DNS subdomain, - both with optional TCP port. In case the ControlPlaneEndpoint - is not specified, the AdvertiseAddress + BindPort - are used; in case the ControlPlaneEndpoint is specified - but without a TCP port, the BindPort is used. Possible - usages are: e.g. In a cluster with more than one - control plane instances, this field should be assigned - the address of the external load balancer in front - of the control plane instances. e.g. in environments - with enforced node recycling, the ControlPlaneEndpoint - could be used for assigning a stable DNS to the - control plane. NB: This value defaults to the first - value in the Cluster object status.apiEndpoints - array.' - type: string - controllerManager: - description: ControllerManager contains extra settings - for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags - to pass to the control plane component. TODO: - This is temporary and ideally we would like - to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements - describing volumes that are mounted from the - host. - properties: - hostPath: - description: HostPath is the path in the - host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside - the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the - pod template. - type: string - pathType: - description: PathType is the type of the - HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on - installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container - registry to pull images from. if not set, the - ImageRepository defined in ClusterConfiguration - will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag - for the image. In case this value is set, kubeadm - does not change automatically the version of - the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: - This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect - to an external etcd cluster Local and External - are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate - Authority file used to secure etcd communication. - Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification - file used to secure etcd communication. - Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required - for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used - to secure etcd communication. Required if - using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs - for configuring the local etcd instance Local - and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd - will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments - provided to the etcd binary when run inside - a static pod. - type: object - imageRepository: - description: ImageRepository sets the container - registry to pull images from. if not set, - the ImageRepository defined in ClusterConfiguration - will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a - tag for the image. In case this value is - set, kubeadm does not change automatically - the version of the above components during - upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject - Alternative Names for the etcd peer signing - cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject - Alternative Names for the etcd server signing - cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry - to pull images from. If empty, `registry.k8s.io` - will be used by default; in case of kubernetes version - is a CI build (kubernetes version starts with `ci/` - or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will - be used as a default for control plane components - and for kube-proxy, while `registry.k8s.io` will - be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing - the REST resource this object represents. Servers - may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version - of the control plane. NB: This value defaults to - the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the - networking topology of the cluster. NB: This value - defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used - by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. - If unset, the API server will not allocate CIDR - ranges for every node. Defaults to a comma-delimited - string of the Cluster object's spec.clusterNetwork.services.cidrBlocks - if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used - by k8s services. Defaults to a comma-delimited - string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, - or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for - the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags - to pass to the control plane component. TODO: - This is temporary and ideally we would like - to switch all components to use ComponentConfig - + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host - volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements - describing volumes that are mounted from the - host. - properties: - hostPath: - description: HostPath is the path in the - host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside - the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the - pod template. - type: string - pathType: - description: PathType is the type of the - HostPath. - type: string - readOnly: - description: ReadOnly controls write access - to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation - of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file - systems to setup. - items: - description: Filesystem defines the file systems - to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options - to add to the command for creating the file - system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system - type. - type: string - label: - description: Label specifies the file system - label to be used. If set to None, no label - is used. - type: string - overwrite: - description: Overwrite defines whether or not - to overwrite any existing filesystem. If true, - any pre-existing file system will be destroyed. - Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition - to use. The valid options are: "auto|any", - "auto", "any", "none", and , where NUM - is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, - used for Microsoft Azure that instructs cloud-init - to replace a file system of . NOTE: - unless you define a label, this requires the - use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the - partitions to setup. - items: - description: Partition defines how to create and - layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. - If it is true, a single partition will be - created for the entire device. When layout - is false, it means don't partition or ignore - existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to - skip checks and create the partition if a - partition or filesystem is found on the device. - Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of - partition table. The following are supported: - ''mbr'': default and setups a MS-DOS partition - table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed - to user_data upon creation. - items: - description: File defines the input for generating write_files - in cloud-init. - properties: - append: - description: Append specifies whether to append - Content to existing file if Path exists. - type: boolean - content: - description: Content is the actual content of the - file. - type: string - contentFrom: - description: ContentFrom is a referenced source - of content to populate the file. - properties: - secret: - description: Secret represents a secret that - should populate this file. - properties: - key: - description: Key is the key in the secret's - data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of - the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the - file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk - where to store the file. - type: string - permissions: - description: Permissions specifies the permissions - to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the - bootstrap data - enum: - - cloud-config - - ignition - type: string - ignition: - description: Ignition contains Ignition specific configuration. - properties: - containerLinuxConfig: - description: ContainerLinuxConfig contains CLC specific - configuration. - properties: - additionalConfig: - description: "AdditionalConfig contains additional - configuration to be merged with the Ignition - configuration generated by the bootstrapper - controller. More info: https://coreos.github.io/ignition/operator-notes/#config-merging - \n The data format is documented here: https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/" - type: string - strict: - description: Strict controls if AdditionalConfig - should be strictly parsed. If so, warnings are - treated as errors. - type: boolean - type: object - type: object - initConfiguration: - description: InitConfiguration along with ClusterConfiguration - are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal - value, and may reject unrecognized values. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm - init` time and describes a set of Bootstrap Tokens - to create. This information IS NOT uploaded to the - kubeadm cluster configmap, partly because of its - sensitive nature - items: - description: BootstrapToken describes one bootstrap - token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly - message why this token exists and what it's - used for, so other administrators can know - its purpose. - type: string - expires: - description: Expires specifies the timestamp - when this token expires. Defaults to being - set dynamically at runtime based on the TTL. - Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups - that this token will authenticate as when/if - used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing - bidirectional trust between nodes and control-planes. - Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for - this token. Defaults to 24h. Expires and TTL - are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which - this token can be used. Can by default be - used for establishing bidirectional trust, - but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing - the REST resource this object represents. Servers - may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance that's deployed on this - control plane node In HA setups, this differs from - ClusterConfiguration.ControlPlaneEndpoint in the - sense that ControlPlaneEndpoint is the global endpoint - for the cluster, which then loadbalances the requests - to each individual API server. This configuration - object lets you customize what IP/DNS name and port - the local API server advertises it's accessible - on. By default, kubeadm tries to auto-detect the - IP of the default interface and use that, but in - case that process fails you may set the desired - value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address - for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for - the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate - to registering the new control-plane node to the - cluster. When used in the context of control plane - nodes, NodeRegistration should remain consistent - across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container - runtime info. This information will be annotated - to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a - slice of pre-flight errors to be ignored when - the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra - arguments to the kubelet. The arguments here - are passed to the kubelet command line via the - environment file kubeadm writes at runtime for - the kubelet to source. This overrides the generic - base-level configuration in the kubelet-config-1.X - ConfigMap Flags have higher priority when parsing. - These values are local and specific to the node - kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field - of the Node API object that will be created - in this `kubeadm init` or `kubeadm join` operation. - This field is also used in the CommonName field - of the kubelet's client certificate to the API - server. Defaults to the hostname of the node - if not provided. - type: string - taints: - description: 'Taints specifies the taints the - Node API object should be registered with. If - this field is unset, i.e. nil, in the `kubeadm - init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane - node, set this field to an empty slice, i.e. - `taints: {}` in the YAML file. This field is - solely used for Node registration.' - items: - description: The node this Taint is attached - to has the "effect" on any pod that does not - tolerate the Taint. - properties: - effect: - description: Required. The effect of the - taint on pods that do not tolerate the - taint. Valid effects are NoSchedule, PreferNoSchedule - and NoExecute. - type: string - key: - description: Required. The taint key to - be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time - at which the taint was added. It is only - written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding - to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying - patches to components deployed by kubeadm during - "kubeadm init". The minimum kubernetes version needed - to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory - that contains files named "target[suffix][+patchtype].extension". - For example, "kube-apiserver0+merge.yaml" or - just "etcd.json". "target" can be one of "kube-apiserver", - "kube-controller-manager", "kube-scheduler", - "etcd". "patchtype" can be one of "strategic" - "merge" or "json" and they match the patch formats - supported by kubectl. The default "patchtype" - is "strategic". "extension" must be either "json" - or "yaml". "suffix" is an optional string that - can be used to determine which patches are applied - first alpha-numerically. These files can be - written into the target directory via KubeadmConfig.Files - which specifies additional files to be created - on the machine, either with content inline or - by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip - during command execution. The list of phases can - be obtained with the "kubeadm init --help" command. - This option takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration - for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema - of this representation of an object. Servers should - convert recognized schemas to the latest internal - value, and may reject unrecognized values. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate - authority used to secure comunications between node - and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". - TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control - plane instance to be deployed on the joining node. - If nil, no additional control plane instance will - be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint - of the API server instance to be deployed on - this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP - address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port - for the API Server to bind to. Defaults - to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for - the kubelet to use during the TLS Bootstrap process - TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the - options for bootstrap token based discovery - BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or - domain name to the API server from which - info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set - of public key pins to verify when token-based - discovery is used. The root CA found during - discovery must match one of these values. - Specifying an empty set disables root CA - pinning, which can be unsafe. Each hash - is specified as ":", where - the only currently supported type is "sha256". - This is a hex-encoded SHA-256 hash of the - Subject Public Key Info (SPKI) object in - DER-encoded ASN.1. These hashes can be calculated - using, for example, OpenSSL: openssl x509 - -pubkey -in ca.crt openssl rsa -pubin -outform - der 2>&/dev/null | openssl dgst -sha256 - -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate - cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows - token-based discovery without CA verification - via CACertHashes. This can weaken the security - of kubeadm since other nodes can impersonate - the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or - URL to a kubeconfig file from which to load - cluster information BootstrapToken and File - are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify - the actual file path or URL to the kubeconfig - file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used - for TLS bootstrapping. If .BootstrapToken is - set, this field is defaulted to .BootstrapToken.Token, - but can be overridden. If .File is set, this - field **must be set** in case the KubeConfigFile - does not contain any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing - the REST resource this object represents. Servers - may infer this from the endpoint the client submits - requests to. Cannot be updated. In CamelCase. More - info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate - to registering the new control-plane node to the - cluster. When used in the context of control plane - nodes, NodeRegistration should remain consistent - across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container - runtime info. This information will be annotated - to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a - slice of pre-flight errors to be ignored when - the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra - arguments to the kubelet. The arguments here - are passed to the kubelet command line via the - environment file kubeadm writes at runtime for - the kubelet to source. This overrides the generic - base-level configuration in the kubelet-config-1.X - ConfigMap Flags have higher priority when parsing. - These values are local and specific to the node - kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field - of the Node API object that will be created - in this `kubeadm init` or `kubeadm join` operation. - This field is also used in the CommonName field - of the kubelet's client certificate to the API - server. Defaults to the hostname of the node - if not provided. - type: string - taints: - description: 'Taints specifies the taints the - Node API object should be registered with. If - this field is unset, i.e. nil, in the `kubeadm - init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. - If you don''t want to taint your control-plane - node, set this field to an empty slice, i.e. - `taints: {}` in the YAML file. This field is - solely used for Node registration.' - items: - description: The node this Taint is attached - to has the "effect" on any pod that does not - tolerate the Taint. - properties: - effect: - description: Required. The effect of the - taint on pods that do not tolerate the - taint. Valid effects are NoSchedule, PreferNoSchedule - and NoExecute. - type: string - key: - description: Required. The taint key to - be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time - at which the taint was added. It is only - written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding - to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying - patches to components deployed by kubeadm during - "kubeadm join". The minimum kubernetes version needed - to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory - that contains files named "target[suffix][+patchtype].extension". - For example, "kube-apiserver0+merge.yaml" or - just "etcd.json". "target" can be one of "kube-apiserver", - "kube-controller-manager", "kube-scheduler", - "etcd". "patchtype" can be one of "strategic" - "merge" or "json" and they match the patch formats - supported by kubectl. The default "patchtype" - is "strategic". "extension" must be either "json" - or "yaml". "suffix" is an optional string that - can be used to determine which patches are applied - first alpha-numerically. These files can be - written into the target directory via KubeadmConfig.Files - which specifies additional files to be created - on the machine, either with content inline or - by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip - during command execution. The list of phases can - be obtained with the "kubeadm init --help" command. - This option takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - mounts: - description: Mounts specifies a list of mount points to - be setup. - items: - description: MountPoints defines input for generated - mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should - be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to - use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands - to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands - to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic - kubeadm command with a shell script with retries for - joins. \n This is meant to be an experimental temporary - workaround on some environments where joins fail due - to timing (and other issues). The long term goal is - to add retries to kubeadm proper and use that functionality. - \n This will add about 40KB to userdata \n For more - information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055. - Deprecated: This experimental fix is no longer needed - and this field will be removed in a future release." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated - user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for - the user - type: string - groups: - description: Groups specifies the additional groups - for the user - type: string - homeDir: - description: HomeDir specifies the home directory - to use for the user - type: string - inactive: - description: Inactive specifies whether to mark - the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password - login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password - for the user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of - passwd to populate the passwd. - properties: - secret: - description: Secret represents a secret that - should populate this password. - properties: - key: - description: Key is the key in the secret's - data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary - group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list - of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the - user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log - level verbosity. It overrides the `--v` flag in kubeadm - commands. - format: int32 - type: integer - type: object - machineTemplate: - description: MachineTemplate contains information about how - machines should be shaped when creating or updating a control - plane. - properties: - nodeDeletionTimeout: - description: NodeDeletionTimeout defines how long the - machine controller will attempt to delete the Node that - the Machine hosts after the Machine is marked for deletion. - A duration of 0 will retry deletion indefinitely. If - no value is provided, the default value for this property - of the Machine resource will be used. - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of - time that the controller will spend on draining a controlplane - node The default value is 0, meaning that the node can - be drained without any time limitations. NOTE: NodeDrainTimeout - is different from `kubectl drain --timeout`' - type: string - type: object - rolloutAfter: - description: RolloutAfter is a field to indicate a rollout - should be performed after the specified time even if no - changes have been made to the KubeadmControlPlane. - format: date-time - type: string - rolloutBefore: - description: RolloutBefore is a field to indicate a rollout - should be performed if the specified criteria is met. - properties: - certificatesExpiryDays: - description: CertificatesExpiryDays indicates a rollout - needs to be performed if the certificates of the machine - will expire within the specified days. - format: int32 - type: integer - type: object - rolloutStrategy: - default: - rollingUpdate: - maxSurge: 1 - type: RollingUpdate - description: The RolloutStrategy to use to replace control - plane machines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only - if RolloutStrategyType = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of control planes - that can be scheduled above or under the desired - number of control planes. Value can be an absolute - number 1 or 0. Defaults to 1. Example: when this - is set to 1, the control plane can be scaled up - immediately when the rolling update starts.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of rollout. Currently the only supported - strategy is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - required: - - kubeadmConfigSpec - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-manager - namespace: capi-kubeadm-control-plane-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-leader-election-role - namespace: capi-kubeadm-control-plane-system -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -aggregationRule: - clusterRoleSelectors: - - matchLabels: - kubeadm.controlplane.cluster.x-k8s.io/aggregate-to-manager: "true" -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-aggregated-manager-role -rules: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - kubeadm.controlplane.cluster.x-k8s.io/aggregate-to-manager: "true" - name: capi-kubeadm-control-plane-manager-role -rules: -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - get - - list - - watch -- apiGroups: - - bootstrap.cluster.x-k8s.io - - controlplane.cluster.x-k8s.io - - infrastructure.cluster.x-k8s.io - resources: - - '*' - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - get - - list - - patch - - update - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-leader-election-rolebinding - namespace: capi-kubeadm-control-plane-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capi-kubeadm-control-plane-leader-election-role -subjects: -- kind: ServiceAccount - name: capi-kubeadm-control-plane-manager - namespace: capi-kubeadm-control-plane-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capi-kubeadm-control-plane-aggregated-manager-role -subjects: -- kind: ServiceAccount - name: capi-kubeadm-control-plane-manager - namespace: capi-kubeadm-control-plane-system ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: control-plane-kubeadm ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - control-plane: controller-manager - name: capi-kubeadm-control-plane-controller-manager - namespace: capi-kubeadm-control-plane-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: control-plane-kubeadm - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --metrics-bind-addr=localhost:8080 - - --feature-gates=ClusterTopology=${CLUSTER_TOPOLOGY:=false},KubeadmBootstrapFormatIgnition=${EXP_KUBEADM_BOOTSTRAP_FORMAT_IGNITION:=false} - command: - - /manager - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_UID - valueFrom: - fieldRef: - fieldPath: metadata.uid - image: k8s.gcr.io/cluster-api/kubeadm-control-plane-controller:v1.2.8 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - serviceAccountName: capi-kubeadm-control-plane-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - secretName: capi-kubeadm-control-plane-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-serving-cert - namespace: capi-kubeadm-control-plane-system -spec: - dnsNames: - - capi-kubeadm-control-plane-webhook-service.capi-kubeadm-control-plane-system.svc - - capi-kubeadm-control-plane-webhook-service.capi-kubeadm-control-plane-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capi-kubeadm-control-plane-selfsigned-issuer - secretName: capi-kubeadm-control-plane-webhook-service-cert - subject: - organizations: - - k8s-sig-cluster-lifecycle ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-selfsigned-issuer - namespace: capi-kubeadm-control-plane-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-control-plane-system/capi-kubeadm-control-plane-serving-cert - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /mutate-controlplane-cluster-x-k8s-io-v1beta1-kubeadmcontrolplane - failurePolicy: Fail - matchPolicy: Equivalent - name: default.kubeadmcontrolplane.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmcontrolplanes - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /mutate-controlplane-cluster-x-k8s-io-v1beta1-kubeadmcontrolplanetemplate - failurePolicy: Fail - name: default.kubeadmcontrolplanetemplate.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmcontrolplanetemplates - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-control-plane-system/capi-kubeadm-control-plane-serving-cert - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /validate-controlplane-cluster-x-k8s-io-v1beta1-kubeadmcontrolplane - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.kubeadmcontrolplane.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmcontrolplanes - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /validate-controlplane-cluster-x-k8s-io-v1beta1-kubeadmcontrolplanetemplate - failurePolicy: Fail - name: validation.kubeadmcontrolplanetemplate.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmcontrolplanetemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /validate-scale-controlplane-cluster-x-k8s-io-v1beta1-kubeadmcontrolplane - failurePolicy: Fail - matchPolicy: Equivalent - name: validation-scale.kubeadmcontrolplane.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - UPDATE - resources: - - kubeadmcontrolplanes/scale - sideEffects: None diff --git a/packages/cluster-api-control-plane-kubeadm/bundle/config/upstream/metadata.yaml b/packages/cluster-api-control-plane-kubeadm/bundle/config/upstream/metadata.yaml deleted file mode 100644 index 625544516d..0000000000 --- a/packages/cluster-api-control-plane-kubeadm/bundle/config/upstream/metadata.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# maps release series of major.minor to cluster-api contract version -# the contract version may change between minor or major versions, but *not* -# between patch versions. -# -# update this file only when a new major or minor version is released -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: - - major: 1 - minor: 2 - contract: v1beta1 - - major: 1 - minor: 1 - contract: v1beta1 - - major: 1 - minor: 0 - contract: v1beta1 - - major: 0 - minor: 4 - contract: v1alpha4 - - major: 0 - minor: 3 - contract: v1alpha3 diff --git a/packages/cluster-api-control-plane-kubeadm/bundle/config/values.yaml b/packages/cluster-api-control-plane-kubeadm/bundle/config/values.yaml deleted file mode 100644 index e25fdc8014..0000000000 --- a/packages/cluster-api-control-plane-kubeadm/bundle/config/values.yaml +++ /dev/null @@ -1,2 +0,0 @@ -#@data/values ---- diff --git a/packages/cluster-api-control-plane-kubeadm/metadata.yaml b/packages/cluster-api-control-plane-kubeadm/metadata.yaml deleted file mode 100644 index 1fb4c31720..0000000000 --- a/packages/cluster-api-control-plane-kubeadm/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: cluster-api-control-plane-kubeadm.tanzu.vmware.com - namespace: cluster-api-control-plane-kubeadm -spec: - displayName: "cluster-api-control-plane-kubeadm" - longDescription: "The Cluster API kubeadm control plane provider instantiates the Kubernetes control plane." - shortDescription: "Cluster control plane" - providerName: VMware - maintainers: - - name: "" - categories: - - "cluster management" diff --git a/packages/cluster-api-control-plane-kubeadm/package.yaml b/packages/cluster-api-control-plane-kubeadm/package.yaml deleted file mode 100644 index 47d61dab58..0000000000 --- a/packages/cluster-api-control-plane-kubeadm/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: cluster-api-control-plane-kubeadm.tanzu.vmware.com - namespace: cluster-api-control-plane-kubeadm -spec: - refName: cluster-api-control-plane-kubeadm.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/cluster-api-control-plane-kubeadm/vendir.lock.yml b/packages/cluster-api-control-plane-kubeadm/vendir.lock.yml deleted file mode 100644 index 199970a1e8..0000000000 --- a/packages/cluster-api-control-plane-kubeadm/vendir.lock.yml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - githubRelease: - url: https://api.github.com/repos/kubernetes-sigs/cluster-api/releases/86051101 - path: . - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/cluster-api-control-plane-kubeadm/vendir.yml b/packages/cluster-api-control-plane-kubeadm/vendir.yml deleted file mode 100644 index 5fbc6cb5bf..0000000000 --- a/packages/cluster-api-control-plane-kubeadm/vendir.yml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: . - githubRelease: - slug: kubernetes-sigs/cluster-api - tag: v1.2.8 - disableAutoChecksumValidation: true - includePaths: - - control-plane-components.yaml - - metadata.yaml diff --git a/packages/cluster-api-provider-aws/Makefile b/packages/cluster-api-provider-aws/Makefile deleted file mode 100644 index 047b729714..0000000000 --- a/packages/cluster-api-provider-aws/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/cluster-api-provider-aws/README.md b/packages/cluster-api-provider-aws/README.md deleted file mode 100644 index c3de0e9f53..0000000000 --- a/packages/cluster-api-provider-aws/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# cluster-api-provider-aws Package - -This package provides consistent deployment and day 2 operations of -"self-managed" and EKS Kubernetes clusters on AWS using -[cluster-api-provider-aws](https://github.com/kubernetes-sigs/cluster-api-provider-aws). - -## Components - -* capa-controller-manager - -## Configuration - -The following configuration values can be set to customize the installation. - -| Value | Required/Optional | Description | -|------------------------------------|-------------------|-----------------------------------------------------------------------------| -| `capaControllerManager.httpProxy` | Optional | Configures the HTTP_PROXY environment variable on capa-controller-manager. | -| `capaControllerManager.httpsProxy` | Optional | Configures the HTTPS_PROXY environment variable on capa-controller-manager. | -| `capaControllerManager.noProxy` | Optional | Configures the NO_PROXY environment variable on capa-controller-manager. | - -## Usage Example - -To learn more about cluster-api-provider-aws visit -. diff --git a/packages/cluster-api-provider-aws/bundle/config/overlay/add-proxy-environment-variables.yaml b/packages/cluster-api-provider-aws/bundle/config/overlay/add-proxy-environment-variables.yaml deleted file mode 100644 index 69ba8326b3..0000000000 --- a/packages/cluster-api-provider-aws/bundle/config/overlay/add-proxy-environment-variables.yaml +++ /dev/null @@ -1,24 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "capa-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - env: - #@ if data.values.capaControllerManager.httpProxy != "": - - name: "HTTP_PROXY" - value: #@ data.values.capaControllerManager.httpProxy - #@ end - #@ if data.values.capaControllerManager.httpsProxy != "": - - name: "HTTPS_PROXY" - value: #@ data.values.capaControllerManager.httpsProxy - #@ end - #@ if data.values.capaControllerManager.noProxy != "": - - name: "NO_PROXY" - value: #@ data.values.capaControllerManager.noProxy - #@ end - diff --git a/packages/cluster-api-provider-aws/bundle/config/overlay/set-features-gates.yaml b/packages/cluster-api-provider-aws/bundle/config/overlay/set-features-gates.yaml deleted file mode 100644 index 88aaa2bd26..0000000000 --- a/packages/cluster-api-provider-aws/bundle/config/overlay/set-features-gates.yaml +++ /dev/null @@ -1,15 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capa-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - args: - #@overlay/match by=overlay.index(1) - #@overlay/replace - - "--feature-gates=EKS=${CAPA_EKS:=true},EKSEnableIAM=${CAPA_EKS_IAM:=false},EKSAllowAddRoles=${CAPA_EKS_ADD_ROLES:=false},EKSFargate=${EXP_EKS_FARGATE:=false},MachinePool=${EXP_MACHINE_POOL:=false},EventBridgeInstanceState=${EVENT_BRIDGE_INSTANCE_STATE:=false},AutoControllerIdentityCreator=${AUTO_CONTROLLER_IDENTITY_CREATOR:=true},BootstrapFormatIgnition=${EXP_BOOTSTRAP_FORMAT_IGNITION:=false},ExternalResourceGC=${EXP_EXTERNAL_RESOURCE_GC:=true}" - diff --git a/packages/cluster-api-provider-aws/bundle/config/upstream/infrastructure-components.yaml b/packages/cluster-api-provider-aws/bundle/config/upstream/infrastructure-components.yaml deleted file mode 100644 index faae72f65b..0000000000 --- a/packages/cluster-api-provider-aws/bundle/config/upstream/infrastructure-components.yaml +++ /dev/null @@ -1,12359 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - clusterctl.cluster.x-k8s.io/move-hierarchy: "" - name: awsclustercontrolleridentities.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSClusterControllerIdentity - listKind: AWSClusterControllerIdentityList - plural: awsclustercontrolleridentities - shortNames: - - awsci - singular: awsclustercontrolleridentity - scope: Cluster - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSClusterControllerIdentity is the Schema for the awsclustercontrolleridentities - API It is used to grant access to use Cluster API Provider AWS Controller - credentials. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterControllerIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces - are allowed to use the identity from. Namespaces can be selected - either using an array of namespaces or with label selector. An empty - allowedNamespaces object indicates that AWSClusters can use this - identity from any namespace. If this object is nil, no namespaces - will be allowed (default behaviour, if this field is not provided) - A namespace should be either in the NamespaceList or match with - Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot - use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot - use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - type: object - type: object - served: true - storage: false - - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSClusterControllerIdentity is the Schema for the awsclustercontrolleridentities - API It is used to grant access to use Cluster API Provider AWS Controller - credentials. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterControllerIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces - are allowed to use the identity from. Namespaces can be selected - either using an array of namespaces or with label selector. An empty - allowedNamespaces object indicates that AWSClusters can use this - identity from any namespace. If this object is nil, no namespaces - will be allowed (default behaviour, if this field is not provided) - A namespace should be either in the NamespaceList or match with - Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot - use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot - use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - clusterctl.cluster.x-k8s.io/move-hierarchy: "" - name: awsclusterroleidentities.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSClusterRoleIdentity - listKind: AWSClusterRoleIdentityList - plural: awsclusterroleidentities - shortNames: - - awsri - singular: awsclusterroleidentity - scope: Cluster - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSClusterRoleIdentity is the Schema for the awsclusterroleidentities - API It is used to assume a role using the provided sourceRef. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterRoleIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces - are allowed to use the identity from. Namespaces can be selected - either using an array of namespaces or with label selector. An empty - allowedNamespaces object indicates that AWSClusters can use this - identity from any namespace. If this object is nil, no namespaces - will be allowed (default behaviour, if this field is not provided) - A namespace should be either in the NamespaceList or match with - Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot - use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot - use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - durationSeconds: - description: The duration, in seconds, of the role session before - it is renewed. - format: int32 - maximum: 43200 - minimum: 900 - type: integer - externalID: - description: A unique identifier that might be required when you assume - a role in another account. If the administrator of the account to - which the role belongs provided you with an external ID, then provide - that value in the ExternalId parameter. This value can be any string, - such as a passphrase or account number. A cross-account role is - usually set up to trust everyone in an account. Therefore, the administrator - of the trusting account might send an external ID to the administrator - of the trusted account. That way, only someone with the ID can assume - the role, rather than everyone in the account. For more information - about the external ID, see How to Use an External ID When Granting - Access to Your AWS Resources to a Third Party in the IAM User Guide. - type: string - inlinePolicy: - description: An IAM policy as a JSON-encoded string that you want - to use as an inline session policy. - type: string - policyARNs: - description: The Amazon Resource Names (ARNs) of the IAM managed policies - that you want to use as managed session policies. The policies must - exist in the same account as the role. - items: - type: string - type: array - roleARN: - description: The Amazon Resource Name (ARN) of the role to assume. - type: string - sessionName: - description: An identifier for the assumed role session - type: string - sourceIdentityRef: - description: SourceIdentityRef is a reference to another identity - which will be chained to do role assumption. All identity types - are accepted. - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - required: - - roleARN - type: object - type: object - served: true - storage: false - - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSClusterRoleIdentity is the Schema for the awsclusterroleidentities - API It is used to assume a role using the provided sourceRef. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterRoleIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces - are allowed to use the identity from. Namespaces can be selected - either using an array of namespaces or with label selector. An empty - allowedNamespaces object indicates that AWSClusters can use this - identity from any namespace. If this object is nil, no namespaces - will be allowed (default behaviour, if this field is not provided) - A namespace should be either in the NamespaceList or match with - Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot - use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot - use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - durationSeconds: - description: The duration, in seconds, of the role session before - it is renewed. - format: int32 - maximum: 43200 - minimum: 900 - type: integer - externalID: - description: A unique identifier that might be required when you assume - a role in another account. If the administrator of the account to - which the role belongs provided you with an external ID, then provide - that value in the ExternalId parameter. This value can be any string, - such as a passphrase or account number. A cross-account role is - usually set up to trust everyone in an account. Therefore, the administrator - of the trusting account might send an external ID to the administrator - of the trusted account. That way, only someone with the ID can assume - the role, rather than everyone in the account. For more information - about the external ID, see How to Use an External ID When Granting - Access to Your AWS Resources to a Third Party in the IAM User Guide. - type: string - inlinePolicy: - description: An IAM policy as a JSON-encoded string that you want - to use as an inline session policy. - type: string - policyARNs: - description: The Amazon Resource Names (ARNs) of the IAM managed policies - that you want to use as managed session policies. The policies must - exist in the same account as the role. - items: - type: string - type: array - roleARN: - description: The Amazon Resource Name (ARN) of the role to assume. - type: string - sessionName: - description: An identifier for the assumed role session - type: string - sourceIdentityRef: - description: SourceIdentityRef is a reference to another identity - which will be chained to do role assumption. All identity types - are accepted. - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - required: - - roleARN - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsclusters.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSCluster - listKind: AWSClusterList - plural: awsclusters - shortNames: - - awsc - singular: awscluster - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this AWSCluster belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Cluster infrastructure is ready for EC2 instances - jsonPath: .status.ready - name: Ready - type: string - - description: AWS VPC the cluster is using - jsonPath: .spec.network.vpc.id - name: VPC - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint - name: Endpoint - priority: 1 - type: string - - description: Bastion IP address for breakglass access - jsonPath: .status.bastion.publicIp - name: Bastion IP - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSCluster is the schema for Amazon EC2 based Kubernetes Cluster - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSClusterSpec defines the desired state of an EC2-based - Kubernetes cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS - resources managed by the AWS provider, in addition to the ones added - by default. - type: object - bastion: - description: Bastion contains options to configure the bastion host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks allowed - to access the bastion host. They are set as ingress rules for - the Bastion host's Security Group (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the bastion. - If not specified, the AMI will default to one picked out in - public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are no Ingress - rules in the bastion host's security group. Requires AllowedCIDRBlocks - to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a bastion - host instance with a public ip to access the VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance type - for the bastion. If not specified, Cluster API Provider AWS - will use t3.micro for all regions except us-east-1, where t2.micro - will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneLoadBalancer: - description: ControlPlaneLoadBalancer is optional configuration for - customizing control plane behavior. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups sets the security groups - used by the load balancer. Expected to be security group IDs - This is optional - if not provided new security groups will - be created for the load balancer - items: - type: string - type: array - crossZoneLoadBalancing: - description: "CrossZoneLoadBalancing enables the classic ELB cross - availability zone balancing. \n With cross-zone load balancing, - each load balancer node for your Classic Load Balancer distributes - requests evenly across the registered instances in all enabled - Availability Zones. If cross-zone load balancing is disabled, - each load balancer node distributes requests evenly across the - registered instances in its Availability Zone only. \n Defaults - to false." - type: boolean - healthCheckProtocol: - description: HealthCheckProtocol sets the protocol type for classic - ELB health check target default value is ClassicELBProtocolSSL - type: string - name: - description: Name sets the name of the classic ELB load balancer. - As per AWS, the name must be unique within your set of load - balancers for the region, must have a maximum of 32 characters, - must contain only alphanumeric characters or hyphens, and cannot - begin or end with a hyphen. Once set, the value cannot be changed. - maxLength: 32 - pattern: ^[A-Za-z0-9]([A-Za-z0-9]{0,31}|[-A-Za-z0-9]{0,30}[A-Za-z0-9])$ - type: string - scheme: - default: internet-facing - description: Scheme sets the scheme of the load balancer (defaults - to internet-facing) - enum: - - internet-facing - - internal - type: string - subnets: - description: Subnets sets the subnets that should be applied to - the control plane load balancer (defaults to discovered subnets - for managed VPCs or an empty set for unmanaged VPCs) - items: - type: string - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be used when - reconciling this cluster - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system - used to look up machine images when a machine does not specify an - AMI. When set, this will be used for all cluster machines unless - a machine specifies a different ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up - machine images when a machine does not specify an AMI. When set, - this will be used for all cluster machines unless a machine specifies - a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} - and {{.K8sVersion}} with the base OS and kubernetes version, respectively. - The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the - default), and the kubernetes version as defined by the packages - produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the ubuntu - base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to look up - machine images when a machine does not specify an AMI. When set, - this will be used for all cluster machines unless a machine specifies - a different ImageLookupOrg. - type: string - network: - description: NetworkSpec encapsulates all things related to AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply to control - plane and worker node security groups. The source for the - rule will be set to control plane and worker security group - IDs. - items: - description: CNIIngressRule defines an AWS ingress rule - for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the protocol - type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set of security - groups to use for cluster instances This is optional - if not - provided new security groups will be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability zone - to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used when - the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference - this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block to be - used when the provider creates a managed VPC. A subnet - can have an IPv4 and an IPv6 address. IPv6 is only supported - in managed clusters, this field cannot be set on AWSCluster - object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 subnet. - A subnet is IPv6 when it is associated with a VPC that - has IPv6 enabled. IPv6 is only supported in managed clusters, - this field cannot be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public subnet. - A subnet is public when it is associated with a route - table that has a route to an internet gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id associated - with the subnet. Ignored unless the subnet is managed - by the provider, in which case this is set on the public - subnet where the NAT gateway resides. It is then used - to determine routes for private subnets in the same AZ - as the public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id associated - with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the - resource. - type: object - type: object - type: array - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies how AZs - should be selected if there are more AZs in a region than - specified by AvailabilityZoneUsageLimit. There are 2 selection - schemes: Ordered - selects based on alphabetical order Random - - selects AZs randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies the maximum - number of availability zones (AZ) that should be used in - a region when automatically creating subnets. If a region - has more than this number of AZs then this number of AZs - will be picked randomly when creating default subnets. Defaults - to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used when the - provider creates a managed VPC. Defaults to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider should - use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet gateway - associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings for the - network. Supported only in managed clusters. This field - cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided by Amazon - when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the id of - the egress only internet gateway associated with an - IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must be defined - in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: object - region: - description: The AWS Region the cluster lives in. - type: string - s3Bucket: - description: S3Bucket contains options to configure a supporting S3 - bucket for this cluster - currently used for nodes requiring Ignition - (https://coreos.github.io/ignition/) for bootstrapping (requires - BootstrapFormatIgnition feature flag to be enabled). - properties: - controlPlaneIAMInstanceProfile: - description: ControlPlaneIAMInstanceProfile is a name of the IAMInstanceProfile, - which will be allowed to read control-plane node bootstrap data - from S3 Bucket. - type: string - name: - description: Name defines name of S3 Bucket to be created. - maxLength: 63 - minLength: 3 - pattern: ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ - type: string - nodesIAMInstanceProfiles: - description: NodesIAMInstanceProfiles is a list of IAM instance - profiles, which will be allowed to read worker nodes bootstrap - data from S3 Bucket. - items: - type: string - type: array - required: - - controlPlaneIAMInstanceProfile - - name - - nodesIAMInstanceProfiles - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the - bastion host. Valid values are empty string (do not use SSH keys), - a valid SSH key name, or omitted (use the default SSH key name) - type: string - type: object - status: - description: AWSClusterStatus defines the observed state of AWSCluster. - properties: - bastion: - description: Instance describes an AWS instance. - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - availabilityZone: - description: Availability zone of instance - type: string - ebsOptimized: - description: Indicates whether the instance is optimized for Amazon - EBS I/O. - type: boolean - enaSupport: - description: Specifies whether enhanced networking with ENA is - enabled. - type: boolean - iamProfile: - description: The name of the IAM instance profile associated with - the instance, if applicable. - type: string - id: - type: string - imageId: - description: The ID of the AMI used to launch the instance. - type: string - instanceState: - description: The current state of the instance. - type: string - networkInterfaces: - description: Specifies ENIs attached to instance - items: - type: string - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for - the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by - the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage - device. Must be greater than the image snapshot size or - 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported - for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - type: array - privateIp: - description: The private IPv4 address assigned to the instance. - type: string - publicIp: - description: The public IPv4 address assigned to the instance, - if applicable. - type: string - rootVolume: - description: Configuration options for the root storage volume. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by the - controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for - the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - securityGroupIds: - description: SecurityGroupIDs are one or more security group IDs - this instance belongs to. - items: - type: string - type: array - spotMarketOptions: - description: SpotMarketOptions option for configuring instances - to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is - willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: The name of the SSH key pair. - type: string - subnetId: - description: The ID of the subnet of the instance. - type: string - tags: - additionalProperties: - type: string - description: The tags associated with the instance. - type: object - tenancy: - description: Tenancy indicates if instance should run on shared - or single-tenant hardware. - type: string - type: - description: The instance type. - type: string - userData: - description: UserData is the raw data script passed to the instance - which is run upon bootstrap. This field must not be base64 encoded - and should only be used when running a new instance. - type: string - volumeIDs: - description: IDs of the instance's volumes - items: - type: string - type: array - required: - - id - type: object - conditions: - description: Conditions provide observations of the operational state - of a Cluster API resource. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a slice of FailureDomains. - type: object - networkStatus: - description: NetworkStatus encapsulates AWS networking resources. - properties: - apiServerElb: - description: APIServerELB is the Kubernetes api server classic - load balancer. - properties: - attributes: - description: Attributes defines extra attributes associated - with the load balancer. - properties: - crossZoneLoadBalancing: - description: CrossZoneLoadBalancing enables the classic - load balancer load balancing. - type: boolean - idleTimeout: - description: IdleTimeout is time that the connection is - allowed to be idle (no data has been sent over the connection) - before it is closed by the load balancer. - format: int64 - type: integer - type: object - availabilityZones: - description: AvailabilityZones is an array of availability - zones in the VPC attached to the load balancer. - items: - type: string - type: array - dnsName: - description: DNSName is the dns name of the load balancer. - type: string - healthChecks: - description: HealthCheck is the classic elb health check associated - with the load balancer. - properties: - healthyThreshold: - format: int64 - type: integer - interval: - description: A Duration represents the elapsed time between - two instants as an int64 nanosecond count. The representation - limits the largest representable duration to approximately - 290 years. - format: int64 - type: integer - target: - type: string - timeout: - description: A Duration represents the elapsed time between - two instants as an int64 nanosecond count. The representation - limits the largest representable duration to approximately - 290 years. - format: int64 - type: integer - unhealthyThreshold: - format: int64 - type: integer - required: - - healthyThreshold - - interval - - target - - timeout - - unhealthyThreshold - type: object - listeners: - description: Listeners is an array of classic elb listeners - associated with the load balancer. There must be at least - one. - items: - description: ClassicELBListener defines an AWS classic load - balancer listener. - properties: - instancePort: - format: int64 - type: integer - instanceProtocol: - description: ClassicELBProtocol defines listener protocols - for a classic load balancer. - type: string - port: - format: int64 - type: integer - protocol: - description: ClassicELBProtocol defines listener protocols - for a classic load balancer. - type: string - required: - - instancePort - - instanceProtocol - - port - - protocol - type: object - type: array - name: - description: The name of the load balancer. It must be unique - within the set of load balancers defined in the region. - It also serves as identifier. - type: string - scheme: - description: Scheme is the load balancer scheme, either internet-facing - or private. - type: string - securityGroupIds: - description: SecurityGroupIDs is an array of security groups - assigned to the load balancer. - items: - type: string - type: array - subnetIds: - description: SubnetIDs is an array of subnets in the VPC attached - to the load balancer. - items: - type: string - type: array - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the load - balancer. - type: object - type: object - securityGroups: - additionalProperties: - description: SecurityGroup defines an AWS security group. - properties: - id: - description: ID is a unique identifier. - type: string - ingressRule: - description: IngressRules is the inbound rules associated - with the security group. - items: - description: IngressRule defines an AWS ingress rule for - security groups. - properties: - cidrBlocks: - description: List of CIDR blocks to allow access from. - Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - description: - type: string - fromPort: - format: int64 - type: integer - ipv6CidrBlocks: - description: List of IPv6 CIDR blocks to allow access - from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - protocol: - description: SecurityGroupProtocol defines the protocol - type for a security group rule. - type: string - sourceSecurityGroupIds: - description: The security group id to allow access - from. Cannot be specified with CidrBlocks. - items: - type: string - type: array - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - name: - description: Name is the security group name. - type: string - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the security - group. - type: object - required: - - id - - name - type: object - description: SecurityGroups is a map from the role/kind of the - security group to its unique name, if any. - type: object - type: object - ready: - default: false - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this AWSCluster belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Cluster infrastructure is ready for EC2 instances - jsonPath: .status.ready - name: Ready - type: string - - description: AWS VPC the cluster is using - jsonPath: .spec.network.vpc.id - name: VPC - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint - name: Endpoint - priority: 1 - type: string - - description: Bastion IP address for breakglass access - jsonPath: .status.bastion.publicIp - name: Bastion IP - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSCluster is the schema for Amazon EC2 based Kubernetes Cluster - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSClusterSpec defines the desired state of an EC2-based - Kubernetes cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS - resources managed by the AWS provider, in addition to the ones added - by default. - type: object - bastion: - description: Bastion contains options to configure the bastion host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks allowed - to access the bastion host. They are set as ingress rules for - the Bastion host's Security Group (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the bastion. - If not specified, the AMI will default to one picked out in - public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are no Ingress - rules in the bastion host's security group. Requires AllowedCIDRBlocks - to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a bastion - host instance with a public ip to access the VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance type - for the bastion. If not specified, Cluster API Provider AWS - will use t3.micro for all regions except us-east-1, where t2.micro - will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneLoadBalancer: - description: ControlPlaneLoadBalancer is optional configuration for - customizing control plane behavior. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups sets the security groups - used by the load balancer. Expected to be security group IDs - This is optional - if not provided new security groups will - be created for the load balancer - items: - type: string - type: array - crossZoneLoadBalancing: - description: "CrossZoneLoadBalancing enables the classic ELB cross - availability zone balancing. \n With cross-zone load balancing, - each load balancer node for your Classic Load Balancer distributes - requests evenly across the registered instances in all enabled - Availability Zones. If cross-zone load balancing is disabled, - each load balancer node distributes requests evenly across the - registered instances in its Availability Zone only. \n Defaults - to false." - type: boolean - healthCheckProtocol: - description: HealthCheckProtocol sets the protocol type for classic - ELB health check target default value is ClassicELBProtocolSSL - type: string - name: - description: Name sets the name of the classic ELB load balancer. - As per AWS, the name must be unique within your set of load - balancers for the region, must have a maximum of 32 characters, - must contain only alphanumeric characters or hyphens, and cannot - begin or end with a hyphen. Once set, the value cannot be changed. - maxLength: 32 - pattern: ^[A-Za-z0-9]([A-Za-z0-9]{0,31}|[-A-Za-z0-9]{0,30}[A-Za-z0-9])$ - type: string - scheme: - default: internet-facing - description: Scheme sets the scheme of the load balancer (defaults - to internet-facing) - enum: - - internet-facing - - internal - type: string - subnets: - description: Subnets sets the subnets that should be applied to - the control plane load balancer (defaults to discovered subnets - for managed VPCs or an empty set for unmanaged VPCs) - items: - type: string - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be used when - reconciling this cluster - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system - used to look up machine images when a machine does not specify an - AMI. When set, this will be used for all cluster machines unless - a machine specifies a different ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up - machine images when a machine does not specify an AMI. When set, - this will be used for all cluster machines unless a machine specifies - a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} - and {{.K8sVersion}} with the base OS and kubernetes version, respectively. - The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the - default), and the kubernetes version as defined by the packages - produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the ubuntu - base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to look up - machine images when a machine does not specify an AMI. When set, - this will be used for all cluster machines unless a machine specifies - a different ImageLookupOrg. - type: string - network: - description: NetworkSpec encapsulates all things related to AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply to control - plane and worker node security groups. The source for the - rule will be set to control plane and worker security group - IDs. - items: - description: CNIIngressRule defines an AWS ingress rule - for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the protocol - type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set of security - groups to use for cluster instances This is optional - if not - provided new security groups will be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability zone - to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used when - the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference - this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block to be - used when the provider creates a managed VPC. A subnet - can have an IPv4 and an IPv6 address. IPv6 is only supported - in managed clusters, this field cannot be set on AWSCluster - object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 subnet. - A subnet is IPv6 when it is associated with a VPC that - has IPv6 enabled. IPv6 is only supported in managed clusters, - this field cannot be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public subnet. - A subnet is public when it is associated with a route - table that has a route to an internet gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id associated - with the subnet. Ignored unless the subnet is managed - by the provider, in which case this is set on the public - subnet where the NAT gateway resides. It is then used - to determine routes for private subnets in the same AZ - as the public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id associated - with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the - resource. - type: object - required: - - id - type: object - type: array - x-kubernetes-list-map-keys: - - id - x-kubernetes-list-type: map - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies how AZs - should be selected if there are more AZs in a region than - specified by AvailabilityZoneUsageLimit. There are 2 selection - schemes: Ordered - selects based on alphabetical order Random - - selects AZs randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies the maximum - number of availability zones (AZ) that should be used in - a region when automatically creating subnets. If a region - has more than this number of AZs then this number of AZs - will be picked randomly when creating default subnets. Defaults - to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used when the - provider creates a managed VPC. Defaults to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider should - use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet gateway - associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings for the - network. Supported only in managed clusters. This field - cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided by Amazon - when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the id of - the egress only internet gateway associated with an - IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must be defined - in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: object - region: - description: The AWS Region the cluster lives in. - type: string - s3Bucket: - description: S3Bucket contains options to configure a supporting S3 - bucket for this cluster - currently used for nodes requiring Ignition - (https://coreos.github.io/ignition/) for bootstrapping (requires - BootstrapFormatIgnition feature flag to be enabled). - properties: - controlPlaneIAMInstanceProfile: - description: ControlPlaneIAMInstanceProfile is a name of the IAMInstanceProfile, - which will be allowed to read control-plane node bootstrap data - from S3 Bucket. - type: string - name: - description: Name defines name of S3 Bucket to be created. - maxLength: 63 - minLength: 3 - pattern: ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ - type: string - nodesIAMInstanceProfiles: - description: NodesIAMInstanceProfiles is a list of IAM instance - profiles, which will be allowed to read worker nodes bootstrap - data from S3 Bucket. - items: - type: string - type: array - required: - - controlPlaneIAMInstanceProfile - - name - - nodesIAMInstanceProfiles - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the - bastion host. Valid values are empty string (do not use SSH keys), - a valid SSH key name, or omitted (use the default SSH key name) - type: string - type: object - status: - description: AWSClusterStatus defines the observed state of AWSCluster. - properties: - bastion: - description: Instance describes an AWS instance. - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - availabilityZone: - description: Availability zone of instance - type: string - ebsOptimized: - description: Indicates whether the instance is optimized for Amazon - EBS I/O. - type: boolean - enaSupport: - description: Specifies whether enhanced networking with ENA is - enabled. - type: boolean - iamProfile: - description: The name of the IAM instance profile associated with - the instance, if applicable. - type: string - id: - type: string - imageId: - description: The ID of the AMI used to launch the instance. - type: string - instanceState: - description: The current state of the instance. - type: string - networkInterfaces: - description: Specifies ENIs attached to instance - items: - type: string - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for - the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by - the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage - device. Must be greater than the image snapshot size or - 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported - for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - type: array - privateIp: - description: The private IPv4 address assigned to the instance. - type: string - publicIp: - description: The public IPv4 address assigned to the instance, - if applicable. - type: string - rootVolume: - description: Configuration options for the root storage volume. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by the - controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for - the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - securityGroupIds: - description: SecurityGroupIDs are one or more security group IDs - this instance belongs to. - items: - type: string - type: array - spotMarketOptions: - description: SpotMarketOptions option for configuring instances - to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is - willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: The name of the SSH key pair. - type: string - subnetId: - description: The ID of the subnet of the instance. - type: string - tags: - additionalProperties: - type: string - description: The tags associated with the instance. - type: object - tenancy: - description: Tenancy indicates if instance should run on shared - or single-tenant hardware. - type: string - type: - description: The instance type. - type: string - userData: - description: UserData is the raw data script passed to the instance - which is run upon bootstrap. This field must not be base64 encoded - and should only be used when running a new instance. - type: string - volumeIDs: - description: IDs of the instance's volumes - items: - type: string - type: array - required: - - id - type: object - conditions: - description: Conditions provide observations of the operational state - of a Cluster API resource. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a slice of FailureDomains. - type: object - networkStatus: - description: NetworkStatus encapsulates AWS networking resources. - properties: - apiServerElb: - description: APIServerELB is the Kubernetes api server classic - load balancer. - properties: - attributes: - description: Attributes defines extra attributes associated - with the load balancer. - properties: - crossZoneLoadBalancing: - description: CrossZoneLoadBalancing enables the classic - load balancer load balancing. - type: boolean - idleTimeout: - description: IdleTimeout is time that the connection is - allowed to be idle (no data has been sent over the connection) - before it is closed by the load balancer. - format: int64 - type: integer - type: object - availabilityZones: - description: AvailabilityZones is an array of availability - zones in the VPC attached to the load balancer. - items: - type: string - type: array - dnsName: - description: DNSName is the dns name of the load balancer. - type: string - healthChecks: - description: HealthCheck is the classic elb health check associated - with the load balancer. - properties: - healthyThreshold: - format: int64 - type: integer - interval: - description: A Duration represents the elapsed time between - two instants as an int64 nanosecond count. The representation - limits the largest representable duration to approximately - 290 years. - format: int64 - type: integer - target: - type: string - timeout: - description: A Duration represents the elapsed time between - two instants as an int64 nanosecond count. The representation - limits the largest representable duration to approximately - 290 years. - format: int64 - type: integer - unhealthyThreshold: - format: int64 - type: integer - required: - - healthyThreshold - - interval - - target - - timeout - - unhealthyThreshold - type: object - listeners: - description: Listeners is an array of classic elb listeners - associated with the load balancer. There must be at least - one. - items: - description: ClassicELBListener defines an AWS classic load - balancer listener. - properties: - instancePort: - format: int64 - type: integer - instanceProtocol: - description: ClassicELBProtocol defines listener protocols - for a classic load balancer. - type: string - port: - format: int64 - type: integer - protocol: - description: ClassicELBProtocol defines listener protocols - for a classic load balancer. - type: string - required: - - instancePort - - instanceProtocol - - port - - protocol - type: object - type: array - name: - description: The name of the load balancer. It must be unique - within the set of load balancers defined in the region. - It also serves as identifier. - type: string - scheme: - description: Scheme is the load balancer scheme, either internet-facing - or private. - type: string - securityGroupIds: - description: SecurityGroupIDs is an array of security groups - assigned to the load balancer. - items: - type: string - type: array - subnetIds: - description: SubnetIDs is an array of subnets in the VPC attached - to the load balancer. - items: - type: string - type: array - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the load - balancer. - type: object - type: object - securityGroups: - additionalProperties: - description: SecurityGroup defines an AWS security group. - properties: - id: - description: ID is a unique identifier. - type: string - ingressRule: - description: IngressRules is the inbound rules associated - with the security group. - items: - description: IngressRule defines an AWS ingress rule for - security groups. - properties: - cidrBlocks: - description: List of CIDR blocks to allow access from. - Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - description: - type: string - fromPort: - format: int64 - type: integer - ipv6CidrBlocks: - description: List of IPv6 CIDR blocks to allow access - from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - protocol: - description: SecurityGroupProtocol defines the protocol - type for a security group rule. - type: string - sourceSecurityGroupIds: - description: The security group id to allow access - from. Cannot be specified with CidrBlocks. - items: - type: string - type: array - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - name: - description: Name is the security group name. - type: string - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the security - group. - type: object - required: - - id - - name - type: object - description: SecurityGroups is a map from the role/kind of the - security group to its unique name, if any. - type: object - type: object - ready: - default: false - type: boolean - required: - - ready - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - clusterctl.cluster.x-k8s.io/move-hierarchy: "" - name: awsclusterstaticidentities.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSClusterStaticIdentity - listKind: AWSClusterStaticIdentityList - plural: awsclusterstaticidentities - shortNames: - - awssi - singular: awsclusterstaticidentity - scope: Cluster - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSClusterStaticIdentity is the Schema for the awsclusterstaticidentities - API It represents a reference to an AWS access key ID and secret access - key, stored in a secret. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterStaticIdentity - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces - are allowed to use the identity from. Namespaces can be selected - either using an array of namespaces or with label selector. An empty - allowedNamespaces object indicates that AWSClusters can use this - identity from any namespace. If this object is nil, no namespaces - will be allowed (default behaviour, if this field is not provided) - A namespace should be either in the NamespaceList or match with - Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot - use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot - use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - secretRef: - description: 'Reference to a secret containing the credentials. The - secret should contain the following data keys: AccessKeyID: AKIAIOSFODNN7EXAMPLE - SecretAccessKey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY SessionToken: - Optional' - type: string - required: - - secretRef - type: object - type: object - served: true - storage: false - - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSClusterStaticIdentity is the Schema for the awsclusterstaticidentities - API It represents a reference to an AWS access key ID and secret access - key, stored in a secret. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterStaticIdentity - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces - are allowed to use the identity from. Namespaces can be selected - either using an array of namespaces or with label selector. An empty - allowedNamespaces object indicates that AWSClusters can use this - identity from any namespace. If this object is nil, no namespaces - will be allowed (default behaviour, if this field is not provided) - A namespace should be either in the NamespaceList or match with - Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot - use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot - use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - secretRef: - description: 'Reference to a secret containing the credentials. The - secret should contain the following data keys: AccessKeyID: AKIAIOSFODNN7EXAMPLE - SecretAccessKey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY SessionToken: - Optional' - type: string - required: - - secretRef - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsclustertemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSClusterTemplate - listKind: AWSClusterTemplateList - plural: awsclustertemplates - shortNames: - - awsct - singular: awsclustertemplate - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Time duration since creation of AWSClusterTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSClusterTemplate is the schema for Amazon EC2 based Kubernetes - Cluster Templates. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSClusterTemplateSpec defines the desired state of AWSClusterTemplate. - properties: - template: - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: AWSClusterSpec defines the desired state of an EC2-based - Kubernetes cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to - add to AWS resources managed by the AWS provider, in addition - to the ones added by default. - type: object - bastion: - description: Bastion contains options to configure the bastion - host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks - allowed to access the bastion host. They are set as - ingress rules for the Bastion host's Security Group - (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the - bastion. If not specified, the AMI will default to one - picked out in public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are - no Ingress rules in the bastion host's security group. - Requires AllowedCIDRBlocks to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a - bastion host instance with a public ip to access the - VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance - type for the bastion. If not specified, Cluster API - Provider AWS will use t3.micro for all regions except - us-east-1, where t2.micro will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint - used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneLoadBalancer: - description: ControlPlaneLoadBalancer is optional configuration - for customizing control plane behavior. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups sets the security - groups used by the load balancer. Expected to be security - group IDs This is optional - if not provided new security - groups will be created for the load balancer - items: - type: string - type: array - crossZoneLoadBalancing: - description: "CrossZoneLoadBalancing enables the classic - ELB cross availability zone balancing. \n With cross-zone - load balancing, each load balancer node for your Classic - Load Balancer distributes requests evenly across the - registered instances in all enabled Availability Zones. - If cross-zone load balancing is disabled, each load - balancer node distributes requests evenly across the - registered instances in its Availability Zone only. - \n Defaults to false." - type: boolean - healthCheckProtocol: - description: HealthCheckProtocol sets the protocol type - for classic ELB health check target default value is - ClassicELBProtocolSSL - type: string - name: - description: Name sets the name of the classic ELB load - balancer. As per AWS, the name must be unique within - your set of load balancers for the region, must have - a maximum of 32 characters, must contain only alphanumeric - characters or hyphens, and cannot begin or end with - a hyphen. Once set, the value cannot be changed. - maxLength: 32 - pattern: ^[A-Za-z0-9]([A-Za-z0-9]{0,31}|[-A-Za-z0-9]{0,30}[A-Za-z0-9])$ - type: string - scheme: - default: internet-facing - description: Scheme sets the scheme of the load balancer - (defaults to internet-facing) - enum: - - internet-facing - - internal - type: string - subnets: - description: Subnets sets the subnets that should be applied - to the control plane load balancer (defaults to discovered - subnets for managed VPCs or an empty set for unmanaged - VPCs) - items: - type: string - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be - used when reconciling this cluster - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating - system used to look up machine images when a machine does - not specify an AMI. When set, this will be used for all - cluster machines unless a machine specifies a different - ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to - look up machine images when a machine does not specify an - AMI. When set, this will be used for all cluster machines - unless a machine specifies a different ImageLookupOrg. Supports - substitutions for {{.BaseOS}} and {{.K8sVersion}} with the - base OS and kubernetes version, respectively. The BaseOS - will be the value in ImageLookupBaseOS or ubuntu (the default), - and the kubernetes version as defined by the packages produced - by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the - ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to - look up machine images when a machine does not specify an - AMI. When set, this will be used for all cluster machines - unless a machine specifies a different ImageLookupOrg. - type: string - network: - description: NetworkSpec encapsulates all things related to - AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply - to control plane and worker node security groups. - The source for the rule will be set to control plane - and worker security group IDs. - items: - description: CNIIngressRule defines an AWS ingress - rule for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the - protocol type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set - of security groups to use for cluster instances This - is optional - if not provided new security groups will - be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability - zone to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used - when the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference - this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block - to be used when the provider creates a managed - VPC. A subnet can have an IPv4 and an IPv6 address. - IPv6 is only supported in managed clusters, this - field cannot be set on AWSCluster object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 - subnet. A subnet is IPv6 when it is associated - with a VPC that has IPv6 enabled. IPv6 is only - supported in managed clusters, this field cannot - be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public - subnet. A subnet is public when it is associated - with a route table that has a route to an internet - gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id - associated with the subnet. Ignored unless the - subnet is managed by the provider, in which case - this is set on the public subnet where the NAT - gateway resides. It is then used to determine - routes for private subnets in the same AZ as the - public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id - associated with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing - the resource. - type: object - type: object - type: array - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies - how AZs should be selected if there are more AZs - in a region than specified by AvailabilityZoneUsageLimit. - There are 2 selection schemes: Ordered - selects - based on alphabetical order Random - selects AZs - randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies - the maximum number of availability zones (AZ) that - should be used in a region when automatically creating - subnets. If a region has more than this number of - AZs then this number of AZs will be picked randomly - when creating default subnets. Defaults to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used - when the provider creates a managed VPC. Defaults - to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider - should use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet - gateway associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings - for the network. Supported only in managed clusters. - This field cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided - by Amazon when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the - id of the egress only internet gateway associated - with an IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must - be defined in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing - the resource. - type: object - type: object - type: object - region: - description: The AWS Region the cluster lives in. - type: string - s3Bucket: - description: S3Bucket contains options to configure a supporting - S3 bucket for this cluster - currently used for nodes requiring - Ignition (https://coreos.github.io/ignition/) for bootstrapping - (requires BootstrapFormatIgnition feature flag to be enabled). - properties: - controlPlaneIAMInstanceProfile: - description: ControlPlaneIAMInstanceProfile is a name - of the IAMInstanceProfile, which will be allowed to - read control-plane node bootstrap data from S3 Bucket. - type: string - name: - description: Name defines name of S3 Bucket to be created. - maxLength: 63 - minLength: 3 - pattern: ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ - type: string - nodesIAMInstanceProfiles: - description: NodesIAMInstanceProfiles is a list of IAM - instance profiles, which will be allowed to read worker - nodes bootstrap data from S3 Bucket. - items: - type: string - type: array - required: - - controlPlaneIAMInstanceProfile - - name - - nodesIAMInstanceProfiles - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach - to the bastion host. Valid values are empty string (do not - use SSH keys), a valid SSH key name, or omitted (use the - default SSH key name) - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of AWSClusterTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSClusterTemplate is the schema for Amazon EC2 based Kubernetes - Cluster Templates. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSClusterTemplateSpec defines the desired state of AWSClusterTemplate. - properties: - template: - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: AWSClusterSpec defines the desired state of an EC2-based - Kubernetes cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to - add to AWS resources managed by the AWS provider, in addition - to the ones added by default. - type: object - bastion: - description: Bastion contains options to configure the bastion - host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks - allowed to access the bastion host. They are set as - ingress rules for the Bastion host's Security Group - (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the - bastion. If not specified, the AMI will default to one - picked out in public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are - no Ingress rules in the bastion host's security group. - Requires AllowedCIDRBlocks to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a - bastion host instance with a public ip to access the - VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance - type for the bastion. If not specified, Cluster API - Provider AWS will use t3.micro for all regions except - us-east-1, where t2.micro will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint - used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneLoadBalancer: - description: ControlPlaneLoadBalancer is optional configuration - for customizing control plane behavior. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups sets the security - groups used by the load balancer. Expected to be security - group IDs This is optional - if not provided new security - groups will be created for the load balancer - items: - type: string - type: array - crossZoneLoadBalancing: - description: "CrossZoneLoadBalancing enables the classic - ELB cross availability zone balancing. \n With cross-zone - load balancing, each load balancer node for your Classic - Load Balancer distributes requests evenly across the - registered instances in all enabled Availability Zones. - If cross-zone load balancing is disabled, each load - balancer node distributes requests evenly across the - registered instances in its Availability Zone only. - \n Defaults to false." - type: boolean - healthCheckProtocol: - description: HealthCheckProtocol sets the protocol type - for classic ELB health check target default value is - ClassicELBProtocolSSL - type: string - name: - description: Name sets the name of the classic ELB load - balancer. As per AWS, the name must be unique within - your set of load balancers for the region, must have - a maximum of 32 characters, must contain only alphanumeric - characters or hyphens, and cannot begin or end with - a hyphen. Once set, the value cannot be changed. - maxLength: 32 - pattern: ^[A-Za-z0-9]([A-Za-z0-9]{0,31}|[-A-Za-z0-9]{0,30}[A-Za-z0-9])$ - type: string - scheme: - default: internet-facing - description: Scheme sets the scheme of the load balancer - (defaults to internet-facing) - enum: - - internet-facing - - internal - type: string - subnets: - description: Subnets sets the subnets that should be applied - to the control plane load balancer (defaults to discovered - subnets for managed VPCs or an empty set for unmanaged - VPCs) - items: - type: string - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be - used when reconciling this cluster - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating - system used to look up machine images when a machine does - not specify an AMI. When set, this will be used for all - cluster machines unless a machine specifies a different - ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to - look up machine images when a machine does not specify an - AMI. When set, this will be used for all cluster machines - unless a machine specifies a different ImageLookupOrg. Supports - substitutions for {{.BaseOS}} and {{.K8sVersion}} with the - base OS and kubernetes version, respectively. The BaseOS - will be the value in ImageLookupBaseOS or ubuntu (the default), - and the kubernetes version as defined by the packages produced - by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the - ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to - look up machine images when a machine does not specify an - AMI. When set, this will be used for all cluster machines - unless a machine specifies a different ImageLookupOrg. - type: string - network: - description: NetworkSpec encapsulates all things related to - AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply - to control plane and worker node security groups. - The source for the rule will be set to control plane - and worker security group IDs. - items: - description: CNIIngressRule defines an AWS ingress - rule for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the - protocol type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set - of security groups to use for cluster instances This - is optional - if not provided new security groups will - be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability - zone to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used - when the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference - this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block - to be used when the provider creates a managed - VPC. A subnet can have an IPv4 and an IPv6 address. - IPv6 is only supported in managed clusters, this - field cannot be set on AWSCluster object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 - subnet. A subnet is IPv6 when it is associated - with a VPC that has IPv6 enabled. IPv6 is only - supported in managed clusters, this field cannot - be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public - subnet. A subnet is public when it is associated - with a route table that has a route to an internet - gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id - associated with the subnet. Ignored unless the - subnet is managed by the provider, in which case - this is set on the public subnet where the NAT - gateway resides. It is then used to determine - routes for private subnets in the same AZ as the - public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id - associated with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing - the resource. - type: object - required: - - id - type: object - type: array - x-kubernetes-list-map-keys: - - id - x-kubernetes-list-type: map - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies - how AZs should be selected if there are more AZs - in a region than specified by AvailabilityZoneUsageLimit. - There are 2 selection schemes: Ordered - selects - based on alphabetical order Random - selects AZs - randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies - the maximum number of availability zones (AZ) that - should be used in a region when automatically creating - subnets. If a region has more than this number of - AZs then this number of AZs will be picked randomly - when creating default subnets. Defaults to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used - when the provider creates a managed VPC. Defaults - to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider - should use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet - gateway associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings - for the network. Supported only in managed clusters. - This field cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided - by Amazon when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the - id of the egress only internet gateway associated - with an IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must - be defined in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing - the resource. - type: object - type: object - type: object - region: - description: The AWS Region the cluster lives in. - type: string - s3Bucket: - description: S3Bucket contains options to configure a supporting - S3 bucket for this cluster - currently used for nodes requiring - Ignition (https://coreos.github.io/ignition/) for bootstrapping - (requires BootstrapFormatIgnition feature flag to be enabled). - properties: - controlPlaneIAMInstanceProfile: - description: ControlPlaneIAMInstanceProfile is a name - of the IAMInstanceProfile, which will be allowed to - read control-plane node bootstrap data from S3 Bucket. - type: string - name: - description: Name defines name of S3 Bucket to be created. - maxLength: 63 - minLength: 3 - pattern: ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ - type: string - nodesIAMInstanceProfiles: - description: NodesIAMInstanceProfiles is a list of IAM - instance profiles, which will be allowed to read worker - nodes bootstrap data from S3 Bucket. - items: - type: string - type: array - required: - - controlPlaneIAMInstanceProfile - - name - - nodesIAMInstanceProfiles - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach - to the bastion host. Valid values are empty string (do not - use SSH keys), a valid SSH key name, or omitted (use the - default SSH key name) - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.10.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsfargateprofiles.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSFargateProfile - listKind: AWSFargateProfileList - plural: awsfargateprofiles - shortNames: - - awsfp - singular: awsfargateprofile - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: AWSFargateProfile ready status - jsonPath: .status.ready - name: Ready - type: string - - description: EKS Fargate profile name - jsonPath: .spec.profileName - name: ProfileName - type: string - - description: Failure reason - jsonPath: .status.failureReason - name: FailureReason - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSFargateProfile is the Schema for the awsfargateprofiles API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: FargateProfileSpec defines the desired state of FargateProfile. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS - resources managed by the AWS provider, in addition to the ones added - by default. - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - profileName: - description: ProfileName specifies the profile name. - type: string - roleName: - description: RoleName specifies the name of IAM role for this fargate - pool If the role is pre-existing we will treat it as unmanaged and - not delete it on deletion. If the EKSEnableIAM feature flag is true - and no name is supplied then a role is created. - type: string - selectors: - description: Selectors specify fargate pod selectors. - items: - description: FargateSelector specifies a selector for pods that - should run on this fargate pool. - properties: - labels: - additionalProperties: - type: string - description: Labels specifies which pod labels this selector - should match. - type: object - namespace: - description: Namespace specifies which namespace this selector - should match. - type: string - type: object - type: array - subnetIDs: - description: SubnetIDs specifies which subnets are used for the auto - scaling group of this nodegroup. - items: - type: string - type: array - required: - - clusterName - type: object - status: - description: FargateProfileStatus defines the observed state of FargateProfile. - properties: - conditions: - description: Conditions defines current state of the Fargate profile. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the FargateProfile and will contain - a more verbose string suitable for logging and human consumption. - \n This field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the FargateProfile's spec or the configuration of the - controller, and that manual intervention is required. Examples of - terminal errors would be invalid combinations of settings in the - spec, values that are unsupported by the controller, or the responsible - controller itself being critically misconfigured. \n Any transient - errors that occur during the reconciliation of FargateProfiles can - be added as events to the FargateProfile object and/or logged in - the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the FargateProfile and will contain - a succinct value suitable for machine interpretation. \n This field - should not be set for transitive errors that a controller faces - that are expected to be fixed automatically over time (like service - outages), but instead indicate that something is fundamentally wrong - with the FargateProfile's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of FargateProfiles can be added - as events to the FargateProfile object and/or logged in the controller's - output." - type: string - ready: - default: false - description: Ready denotes that the FargateProfile is available. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: AWSFargateProfile ready status - jsonPath: .status.ready - name: Ready - type: string - - description: EKS Fargate profile name - jsonPath: .spec.profileName - name: ProfileName - type: string - - description: Failure reason - jsonPath: .status.failureReason - name: FailureReason - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSFargateProfile is the Schema for the awsfargateprofiles API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: FargateProfileSpec defines the desired state of FargateProfile. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS - resources managed by the AWS provider, in addition to the ones added - by default. - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - profileName: - description: ProfileName specifies the profile name. - type: string - roleName: - description: RoleName specifies the name of IAM role for this fargate - pool If the role is pre-existing we will treat it as unmanaged and - not delete it on deletion. If the EKSEnableIAM feature flag is true - and no name is supplied then a role is created. - type: string - selectors: - description: Selectors specify fargate pod selectors. - items: - description: FargateSelector specifies a selector for pods that - should run on this fargate pool. - properties: - labels: - additionalProperties: - type: string - description: Labels specifies which pod labels this selector - should match. - type: object - namespace: - description: Namespace specifies which namespace this selector - should match. - type: string - type: object - type: array - subnetIDs: - description: SubnetIDs specifies which subnets are used for the auto - scaling group of this nodegroup. - items: - type: string - type: array - required: - - clusterName - type: object - status: - description: FargateProfileStatus defines the observed state of FargateProfile. - properties: - conditions: - description: Conditions defines current state of the Fargate profile. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the FargateProfile and will contain - a more verbose string suitable for logging and human consumption. - \n This field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the FargateProfile's spec or the configuration of the - controller, and that manual intervention is required. Examples of - terminal errors would be invalid combinations of settings in the - spec, values that are unsupported by the controller, or the responsible - controller itself being critically misconfigured. \n Any transient - errors that occur during the reconciliation of FargateProfiles can - be added as events to the FargateProfile object and/or logged in - the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the FargateProfile and will contain - a succinct value suitable for machine interpretation. \n This field - should not be set for transitive errors that a controller faces - that are expected to be fixed automatically over time (like service - outages), but instead indicate that something is fundamentally wrong - with the FargateProfile's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of FargateProfiles can be added - as events to the FargateProfile object and/or logged in the controller's - output." - type: string - ready: - default: false - description: Ready denotes that the FargateProfile is available. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.10.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmachinepools.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSMachinePool - listKind: AWSMachinePoolList - plural: awsmachinepools - shortNames: - - awsmp - singular: awsmachinepool - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Machine ready status - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Minimum instanes in ASG - jsonPath: .spec.minSize - name: MinSize - type: integer - - description: Maximum instanes in ASG - jsonPath: .spec.maxSize - name: MaxSize - type: integer - - description: Launch Template ID - jsonPath: .status.launchTemplateID - name: LaunchTemplate ID - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSMachinePool is the Schema for the awsmachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachinePoolSpec defines the desired state of AWSMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an - instance, in addition to the ones added by default by the AWS provider. - type: object - availabilityZones: - description: AvailabilityZones is an array of availability zones instances - can run in - items: - type: string - type: array - awsLaunchTemplate: - description: AWSLaunchTemplate specifies the launch template and version - to use when an instance is launched. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references - to security groups that should be applied to the instances. - These security groups would be set in addition to any security - groups defined at the cluster level or in the actuator. - items: - description: AWSResourceReference is a reference to a specific - AWS resource by ID or filters. Only one of ID or Filters may - be specified. Specifying more than one will result in a validation - error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to - identify a resource They are applied according to the - rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS - resource. - properties: - name: - description: Name of the filter. Filter names are - case-sensitive. - type: string - values: - description: Values includes one or more filter values. - Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - ami: - description: AMI is the reference to the AMI from which to create - the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look - up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - iamInstanceProfile: - description: The name or the Amazon Resource Name (ARN) of the - instance profile associated with the IAM role for the instance. - The instance profile contains the IAM role. - type: string - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating - system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look - up the image for this machine It will be ignored if an explicit - AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} - with the base OS and kubernetes version, respectively. The BaseOS - will be the value in ImageLookupBaseOS or ubuntu (the default), - and the kubernetes version as defined by the packages produced - by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the ubuntu - base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use - for image lookup if AMI is not set. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. - Example: m4.xlarge' - type: string - name: - description: The name of the launch template. - type: string - rootVolume: - description: RootVolume encapsulates the configuration options - for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by the - controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for - the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions are options for configuring AWSMachinePool - instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is - willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to - the instance. Valid values are empty string (do not use SSH - keys), a valid SSH key name, or omitted (use the default SSH - key name) - type: string - versionNumber: - description: 'VersionNumber is the version of the launch template - that is applied. Typically a new version is created when at - least one of the following happens: 1) A new launch template - spec is applied. 2) One or more parameters in an existing template - is changed. 3) A new AMI is discovered.' - format: int64 - type: integer - type: object - capacityRebalance: - description: Enable or disable the capacity rebalance autoscaling - group feature - type: boolean - defaultCoolDown: - description: The amount of time, in seconds, after a scaling activity - completes before another scaling activity can start. If no value - is supplied by user a default value of 300 seconds is set - type: string - maxSize: - default: 1 - description: MaxSize defines the maximum size of the group. - format: int32 - minimum: 1 - type: integer - minSize: - default: 1 - description: MinSize defines the minimum size of the group. - format: int32 - minimum: 0 - type: integer - mixedInstancesPolicy: - description: MixedInstancesPolicy describes how multiple instance - types will be used by the ASG. - properties: - instancesDistribution: - description: InstancesDistribution to configure distribution of - On-Demand Instances and Spot Instances. - properties: - onDemandAllocationStrategy: - default: prioritized - description: OnDemandAllocationStrategy indicates how to allocate - instance types to fulfill On-Demand capacity. - enum: - - prioritized - type: string - onDemandBaseCapacity: - default: 0 - format: int64 - type: integer - onDemandPercentageAboveBaseCapacity: - default: 100 - format: int64 - type: integer - spotAllocationStrategy: - default: lowest-price - description: SpotAllocationStrategy indicates how to allocate - instances across Spot Instance pools. - enum: - - lowest-price - - capacity-optimized - type: string - type: object - overrides: - items: - description: Overrides are used to override the instance type - specified by the launch template with multiple instance types - that can be used to launch On-Demand Instances and Spot Instances. - properties: - instanceType: - type: string - required: - - instanceType - type: object - type: array - type: object - providerID: - description: ProviderID is the ARN of the associated ASG - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine - instances provided by the provider. This field must match the provider - IDs as seen on the node objects corresponding to a machine pool's - machine instances. - items: - type: string - type: array - refreshPreferences: - description: RefreshPreferences describes set of preferences associated - with the instance refresh request. - properties: - instanceWarmup: - description: The number of seconds until a newly launched instance - is configured and ready to use. During this time, the next replacement - will not be initiated. The default is to use the value for the - health check grace period defined for the group. - format: int64 - type: integer - minHealthyPercentage: - description: The amount of capacity as a percentage in ASG that - must remain healthy during an instance refresh. The default - is 90. - format: int64 - type: integer - strategy: - description: The strategy to use for the instance refresh. The - only valid value is Rolling. A rolling update is an update that - is applied to all instances in an Auto Scaling group until all - instances have been updated. - type: string - type: object - subnets: - description: Subnets is an array of subnet configurations - items: - description: AWSResourceReference is a reference to a specific AWS - resource by ID or filters. Only one of ID or Filters may be specified. - Specifying more than one will result in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify - a resource They are applied according to the rules defined - by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. - Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - required: - - awsLaunchTemplate - - maxSize - - minSize - type: object - status: - description: AWSMachinePoolStatus defines the observed state of AWSMachinePool. - properties: - asgStatus: - description: ASGStatus is a status string returned by the autoscaling - API. - type: string - conditions: - description: Conditions defines current service state of the AWSMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - instances: - description: Instances contains the status for each instance in the - pool - items: - description: AWSMachinePoolInstanceStatus defines the status of - the AWSMachinePoolInstance. - properties: - instanceID: - description: InstanceID is the identification of the Machine - Instance within ASG - type: string - version: - description: Version defines the Kubernetes version for the - Machine Instance - type: string - type: object - type: array - launchTemplateID: - description: The ID of the launch template - type: string - launchTemplateVersion: - description: The version of the launch template - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Machine ready status - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Minimum instanes in ASG - jsonPath: .spec.minSize - name: MinSize - type: integer - - description: Maximum instanes in ASG - jsonPath: .spec.maxSize - name: MaxSize - type: integer - - description: Launch Template ID - jsonPath: .status.launchTemplateID - name: LaunchTemplate ID - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSMachinePool is the Schema for the awsmachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachinePoolSpec defines the desired state of AWSMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an - instance, in addition to the ones added by default by the AWS provider. - type: object - availabilityZones: - description: AvailabilityZones is an array of availability zones instances - can run in - items: - type: string - type: array - awsLaunchTemplate: - description: AWSLaunchTemplate specifies the launch template and version - to use when an instance is launched. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references - to security groups that should be applied to the instances. - These security groups would be set in addition to any security - groups defined at the cluster level or in the actuator. - items: - description: AWSResourceReference is a reference to a specific - AWS resource by ID or filters. Only one of ID or Filters may - be specified. Specifying more than one will result in a validation - error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to - identify a resource They are applied according to the - rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS - resource. - properties: - name: - description: Name of the filter. Filter names are - case-sensitive. - type: string - values: - description: Values includes one or more filter values. - Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - ami: - description: AMI is the reference to the AMI from which to create - the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look - up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - iamInstanceProfile: - description: The name or the Amazon Resource Name (ARN) of the - instance profile associated with the IAM role for the instance. - The instance profile contains the IAM role. - type: string - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating - system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look - up the image for this machine It will be ignored if an explicit - AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} - with the base OS and kubernetes version, respectively. The BaseOS - will be the value in ImageLookupBaseOS or ubuntu (the default), - and the kubernetes version as defined by the packages produced - by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the ubuntu - base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use - for image lookup if AMI is not set. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. - Example: m4.xlarge' - type: string - name: - description: The name of the launch template. - type: string - rootVolume: - description: RootVolume encapsulates the configuration options - for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by the - controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for - the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions are options for configuring AWSMachinePool - instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is - willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to - the instance. Valid values are empty string (do not use SSH - keys), a valid SSH key name, or omitted (use the default SSH - key name) - type: string - versionNumber: - description: 'VersionNumber is the version of the launch template - that is applied. Typically a new version is created when at - least one of the following happens: 1) A new launch template - spec is applied. 2) One or more parameters in an existing template - is changed. 3) A new AMI is discovered.' - format: int64 - type: integer - type: object - capacityRebalance: - description: Enable or disable the capacity rebalance autoscaling - group feature - type: boolean - defaultCoolDown: - description: The amount of time, in seconds, after a scaling activity - completes before another scaling activity can start. If no value - is supplied by user a default value of 300 seconds is set - type: string - maxSize: - default: 1 - description: MaxSize defines the maximum size of the group. - format: int32 - minimum: 1 - type: integer - minSize: - default: 1 - description: MinSize defines the minimum size of the group. - format: int32 - minimum: 0 - type: integer - mixedInstancesPolicy: - description: MixedInstancesPolicy describes how multiple instance - types will be used by the ASG. - properties: - instancesDistribution: - description: InstancesDistribution to configure distribution of - On-Demand Instances and Spot Instances. - properties: - onDemandAllocationStrategy: - default: prioritized - description: OnDemandAllocationStrategy indicates how to allocate - instance types to fulfill On-Demand capacity. - enum: - - prioritized - type: string - onDemandBaseCapacity: - default: 0 - format: int64 - type: integer - onDemandPercentageAboveBaseCapacity: - default: 100 - format: int64 - type: integer - spotAllocationStrategy: - default: lowest-price - description: SpotAllocationStrategy indicates how to allocate - instances across Spot Instance pools. - enum: - - lowest-price - - capacity-optimized - type: string - type: object - overrides: - items: - description: Overrides are used to override the instance type - specified by the launch template with multiple instance types - that can be used to launch On-Demand Instances and Spot Instances. - properties: - instanceType: - type: string - required: - - instanceType - type: object - type: array - type: object - providerID: - description: ProviderID is the ARN of the associated ASG - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine - instances provided by the provider. This field must match the provider - IDs as seen on the node objects corresponding to a machine pool's - machine instances. - items: - type: string - type: array - refreshPreferences: - description: RefreshPreferences describes set of preferences associated - with the instance refresh request. - properties: - disable: - description: Disable, if true, disables instance refresh from - triggering when new launch templates are detected. This is useful - in scenarios where ASG nodes are externally managed. - type: boolean - instanceWarmup: - description: The number of seconds until a newly launched instance - is configured and ready to use. During this time, the next replacement - will not be initiated. The default is to use the value for the - health check grace period defined for the group. - format: int64 - type: integer - minHealthyPercentage: - description: The amount of capacity as a percentage in ASG that - must remain healthy during an instance refresh. The default - is 90. - format: int64 - type: integer - strategy: - description: The strategy to use for the instance refresh. The - only valid value is Rolling. A rolling update is an update that - is applied to all instances in an Auto Scaling group until all - instances have been updated. - type: string - type: object - subnets: - description: Subnets is an array of subnet configurations - items: - description: AWSResourceReference is a reference to a specific AWS - resource by ID or filters. Only one of ID or Filters may be specified. - Specifying more than one will result in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify - a resource They are applied according to the rules defined - by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. - Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - suspendProcesses: - description: SuspendProcesses defines a list of processes to suspend - for the given ASG. This is constantly reconciled. If a process is - removed from this list it will automatically be resumed. - properties: - all: - type: boolean - processes: - description: Processes defines the processes which can be enabled - or disabled individually. - properties: - addToLoadBalancer: - type: boolean - alarmNotification: - type: boolean - azRebalance: - type: boolean - healthCheck: - type: boolean - instanceRefresh: - type: boolean - launch: - type: boolean - replaceUnhealthy: - type: boolean - scheduledActions: - type: boolean - terminate: - type: boolean - type: object - type: object - required: - - awsLaunchTemplate - - maxSize - - minSize - type: object - status: - description: AWSMachinePoolStatus defines the observed state of AWSMachinePool. - properties: - asgStatus: - description: ASGStatus is a status string returned by the autoscaling - API. - type: string - conditions: - description: Conditions defines current service state of the AWSMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - instances: - description: Instances contains the status for each instance in the - pool - items: - description: AWSMachinePoolInstanceStatus defines the status of - the AWSMachinePoolInstance. - properties: - instanceID: - description: InstanceID is the identification of the Machine - Instance within ASG - type: string - version: - description: Version defines the Kubernetes version for the - Machine Instance - type: string - type: object - type: array - launchTemplateID: - description: The ID of the launch template - type: string - launchTemplateVersion: - description: The version of the launch template - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSMachine - listKind: AWSMachineList - plural: awsmachines - shortNames: - - awsm - singular: awsmachine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this AWSMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: EC2 instance state - jsonPath: .status.instanceState - name: State - type: string - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: EC2 instance ID - jsonPath: .spec.providerID - name: InstanceID - type: string - - description: Machine object which owns with this AWSMachine - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSMachine is the schema for Amazon EC2 machines. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachineSpec defines the desired state of an Amazon EC2 - instance. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references to - security groups that should be applied to the instance. These security - groups would be set in addition to any security groups defined at - the cluster level or in the actuator. It is possible to specify - either IDs of Filters. Using Filters will cause additional requests - to AWS API and if tags change the attached security groups might - change too. - items: - description: AWSResourceReference is a reference to a specific AWS - resource by ID or filters. Only one of ID or Filters may be specified. - Specifying more than one will result in a validation error. - properties: - arn: - description: 'ARN of resource. Deprecated: This field has no - function and is going to be removed in the next release.' - type: string - filters: - description: 'Filters is a set of key/value pairs used to identify - a resource They are applied according to the rules defined - by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. - Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an - instance, in addition to the ones added by default by the AWS provider. - If both the AWSCluster and the AWSMachine specify the same tag name - with different values, the AWSMachine's value takes precedence. - type: object - ami: - description: AMI is the reference to the AMI from which to create - the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look up - an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - cloudInit: - description: CloudInit defines options related to the bootstrapping - systems where CloudInit is used. - properties: - insecureSkipSecretsManager: - description: InsecureSkipSecretsManager, when set to true will - not use AWS Secrets Manager or AWS Systems Manager Parameter - Store to ensure privacy of userdata. By default, a cloud-init - boothook shell script is prepended to download the userdata - from Secrets Manager and additionally delete the secret. - type: boolean - secretCount: - description: SecretCount is the number of secrets used to form - the complete secret - format: int32 - type: integer - secretPrefix: - description: SecretPrefix is the prefix for the secret name. This - is stored temporarily, and deleted when the machine registers - as a node against the workload cluster. - type: string - secureSecretsBackend: - description: SecureSecretsBackend, when set to parameter-store - will utilize the AWS Systems Manager Parameter Storage to distribute - secrets. By default or with the value of secrets-manager, will - use AWS Secrets Manager instead. - enum: - - secrets-manager - - ssm-parameter-store - type: string - type: object - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster API. For - this infrastructure provider, the ID is equivalent to an AWS Availability - Zone. If multiple subnets are matched for the availability zone, - the first one returned is picked. - type: string - iamInstanceProfile: - description: IAMInstanceProfile is a name of an IAM instance profile - to assign to the instance - type: string - ignition: - description: Ignition defined options related to the bootstrapping - systems where Ignition is used. - properties: - version: - default: "2.3" - description: Version defines which version of Ignition will be - used to generate bootstrap data. - enum: - - "2.3" - type: string - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system - to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up - the image for this machine It will be ignored if an explicit AMI - is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} - with the base OS and kubernetes version, respectively. The BaseOS - will be the value in ImageLookupBaseOS or ubuntu (the default), - and the kubernetes version as defined by the packages produced by - kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the ubuntu - base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use for - image lookup if AMI is not set. - type: string - instanceID: - description: InstanceID is the EC2 instance ID for this machine. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. Example: - m4.xlarge' - minLength: 2 - type: string - networkInterfaces: - description: NetworkInterfaces is a list of ENIs to associate with - the instance. A maximum of 2 may be specified. - items: - type: string - maxItems: 2 - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for the - storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be used. - The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. - Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for - the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - type: array - providerID: - description: ProviderID is the unique identifier as specified by the - cloud provider. - type: string - publicIP: - description: 'PublicIP specifies whether the instance should get a - public IP. Precedence for this setting is as follows: 1. This field - if set 2. Cluster/flavor setting 3. Subnet default' - type: boolean - rootVolume: - description: RootVolume encapsulates the configuration options for - the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the - volume. Can be either a KMS key ID or ARN. If Encrypted is set - and this is omitted, the default AWS key will be used. The key - must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. - Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the - volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions allows users to configure instances - to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing - to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the - instance. Valid values are empty string (do not use SSH keys), a - valid SSH key name, or omitted (use the default SSH key name) - type: string - subnet: - description: Subnet is a reference to the subnet to use for this instance. - If not specified, the cluster subnet will be used. - properties: - arn: - description: 'ARN of resource. Deprecated: This field has no function - and is going to be removed in the next release.' - type: string - filters: - description: 'Filters is a set of key/value pairs used to identify - a resource They are applied according to the rules defined by - the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. - Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - tenancy: - description: Tenancy indicates if instance should run on shared or - single-tenant hardware. - enum: - - default - - dedicated - - host - type: string - uncompressedUserData: - description: UncompressedUserData specify whether the user data is - gzip-compressed before it is sent to ec2 instance. cloud-init has - built-in support for gzip-compressed user data user data stored - in aws secret manager is always gzip-compressed. - type: boolean - required: - - instanceType - type: object - status: - description: AWSMachineStatus defines the observed state of AWSMachine. - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the AWSMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - instanceState: - description: InstanceState is the state of the AWS instance for this - machine. - type: string - interruptible: - description: Interruptible reports that this machine is using spot - instances and can therefore be interrupted by CAPI when it receives - a notice that the spot instance is to be terminated by AWS. This - will be set to true when SpotMarketOptions is not nil (i.e. this - machine is using a spot instance). - type: boolean - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this AWSMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: EC2 instance state - jsonPath: .status.instanceState - name: State - type: string - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: EC2 instance ID - jsonPath: .spec.providerID - name: InstanceID - type: string - - description: Machine object which owns with this AWSMachine - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSMachine is the schema for Amazon EC2 machines. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachineSpec defines the desired state of an Amazon EC2 - instance. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references to - security groups that should be applied to the instance. These security - groups would be set in addition to any security groups defined at - the cluster level or in the actuator. It is possible to specify - either IDs of Filters. Using Filters will cause additional requests - to AWS API and if tags change the attached security groups might - change too. - items: - description: AWSResourceReference is a reference to a specific AWS - resource by ID or filters. Only one of ID or Filters may be specified. - Specifying more than one will result in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify - a resource They are applied according to the rules defined - by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. - Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an - instance, in addition to the ones added by default by the AWS provider. - If both the AWSCluster and the AWSMachine specify the same tag name - with different values, the AWSMachine's value takes precedence. - type: object - ami: - description: AMI is the reference to the AMI from which to create - the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look up - an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - cloudInit: - description: CloudInit defines options related to the bootstrapping - systems where CloudInit is used. - properties: - insecureSkipSecretsManager: - description: InsecureSkipSecretsManager, when set to true will - not use AWS Secrets Manager or AWS Systems Manager Parameter - Store to ensure privacy of userdata. By default, a cloud-init - boothook shell script is prepended to download the userdata - from Secrets Manager and additionally delete the secret. - type: boolean - secretCount: - description: SecretCount is the number of secrets used to form - the complete secret - format: int32 - type: integer - secretPrefix: - description: SecretPrefix is the prefix for the secret name. This - is stored temporarily, and deleted when the machine registers - as a node against the workload cluster. - type: string - secureSecretsBackend: - description: SecureSecretsBackend, when set to parameter-store - will utilize the AWS Systems Manager Parameter Storage to distribute - secrets. By default or with the value of secrets-manager, will - use AWS Secrets Manager instead. - enum: - - secrets-manager - - ssm-parameter-store - type: string - type: object - iamInstanceProfile: - description: IAMInstanceProfile is a name of an IAM instance profile - to assign to the instance - type: string - ignition: - description: Ignition defined options related to the bootstrapping - systems where Ignition is used. - properties: - version: - default: "2.3" - description: Version defines which version of Ignition will be - used to generate bootstrap data. - enum: - - "2.3" - type: string - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system - to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up - the image for this machine It will be ignored if an explicit AMI - is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} - with the base OS and kubernetes version, respectively. The BaseOS - will be the value in ImageLookupBaseOS or ubuntu (the default), - and the kubernetes version as defined by the packages produced by - kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the ubuntu - base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use for - image lookup if AMI is not set. - type: string - instanceID: - description: InstanceID is the EC2 instance ID for this machine. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. Example: - m4.xlarge' - minLength: 2 - type: string - networkInterfaces: - description: NetworkInterfaces is a list of ENIs to associate with - the instance. A maximum of 2 may be specified. - items: - type: string - maxItems: 2 - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for the - storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be used. - The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. - Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for - the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - type: array - providerID: - description: ProviderID is the unique identifier as specified by the - cloud provider. - type: string - publicIP: - description: 'PublicIP specifies whether the instance should get a - public IP. Precedence for this setting is as follows: 1. This field - if set 2. Cluster/flavor setting 3. Subnet default' - type: boolean - rootVolume: - description: RootVolume encapsulates the configuration options for - the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the - volume. Can be either a KMS key ID or ARN. If Encrypted is set - and this is omitted, the default AWS key will be used. The key - must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. - Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the - volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions allows users to configure instances - to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing - to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the - instance. Valid values are empty string (do not use SSH keys), a - valid SSH key name, or omitted (use the default SSH key name) - type: string - subnet: - description: Subnet is a reference to the subnet to use for this instance. - If not specified, the cluster subnet will be used. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify - a resource They are applied according to the rules defined by - the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. - Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - tenancy: - description: Tenancy indicates if instance should run on shared or - single-tenant hardware. - enum: - - default - - dedicated - - host - type: string - uncompressedUserData: - description: UncompressedUserData specify whether the user data is - gzip-compressed before it is sent to ec2 instance. cloud-init has - built-in support for gzip-compressed user data user data stored - in aws secret manager is always gzip-compressed. - type: boolean - required: - - instanceType - type: object - status: - description: AWSMachineStatus defines the observed state of AWSMachine. - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the AWSMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - instanceState: - description: InstanceState is the state of the AWS instance for this - machine. - type: string - interruptible: - description: Interruptible reports that this machine is using spot - instances and can therefore be interrupted by CAPI when it receives - a notice that the spot instance is to be terminated by AWS. This - will be set to true when SpotMarketOptions is not nil (i.e. this - machine is using a spot instance). - type: boolean - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmachinetemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSMachineTemplate - listKind: AWSMachineTemplateList - plural: awsmachinetemplates - shortNames: - - awsmt - singular: awsmachinetemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSMachineTemplate is the schema for the Amazon EC2 Machine Templates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachineTemplateSpec defines the desired state of AWSMachineTemplate. - properties: - template: - description: AWSMachineTemplateResource describes the data needed - to create am AWSMachine from a template. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references - to security groups that should be applied to the instance. - These security groups would be set in addition to any security - groups defined at the cluster level or in the actuator. - It is possible to specify either IDs of Filters. Using Filters - will cause additional requests to AWS API and if tags change - the attached security groups might change too. - items: - description: AWSResourceReference is a reference to a specific - AWS resource by ID or filters. Only one of ID or Filters - may be specified. Specifying more than one will result - in a validation error. - properties: - arn: - description: 'ARN of resource. Deprecated: This field - has no function and is going to be removed in the - next release.' - type: string - filters: - description: 'Filters is a set of key/value pairs used - to identify a resource They are applied according - to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an - AWS resource. - properties: - name: - description: Name of the filter. Filter names - are case-sensitive. - type: string - values: - description: Values includes one or more filter - values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to - add to an instance, in addition to the ones added by default - by the AWS provider. If both the AWSCluster and the AWSMachine - specify the same tag name with different values, the AWSMachine's - value takes precedence. - type: object - ami: - description: AMI is the reference to the AMI from which to - create the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will - look up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - cloudInit: - description: CloudInit defines options related to the bootstrapping - systems where CloudInit is used. - properties: - insecureSkipSecretsManager: - description: InsecureSkipSecretsManager, when set to true - will not use AWS Secrets Manager or AWS Systems Manager - Parameter Store to ensure privacy of userdata. By default, - a cloud-init boothook shell script is prepended to download - the userdata from Secrets Manager and additionally delete - the secret. - type: boolean - secretCount: - description: SecretCount is the number of secrets used - to form the complete secret - format: int32 - type: integer - secretPrefix: - description: SecretPrefix is the prefix for the secret - name. This is stored temporarily, and deleted when the - machine registers as a node against the workload cluster. - type: string - secureSecretsBackend: - description: SecureSecretsBackend, when set to parameter-store - will utilize the AWS Systems Manager Parameter Storage - to distribute secrets. By default or with the value - of secrets-manager, will use AWS Secrets Manager instead. - enum: - - secrets-manager - - ssm-parameter-store - type: string - type: object - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster - API. For this infrastructure provider, the ID is equivalent - to an AWS Availability Zone. If multiple subnets are matched - for the availability zone, the first one returned is picked. - type: string - iamInstanceProfile: - description: IAMInstanceProfile is a name of an IAM instance - profile to assign to the instance - type: string - ignition: - description: Ignition defined options related to the bootstrapping - systems where Ignition is used. - properties: - version: - default: "2.3" - description: Version defines which version of Ignition - will be used to generate bootstrap data. - enum: - - "2.3" - type: string - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating - system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to - look up the image for this machine It will be ignored if - an explicit AMI is set. Supports substitutions for {{.BaseOS}} - and {{.K8sVersion}} with the base OS and kubernetes version, - respectively. The BaseOS will be the value in ImageLookupBaseOS - or ubuntu (the default), and the kubernetes version as defined - by the packages produced by kubernetes/release without v - as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, - the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the - ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to - use for image lookup if AMI is not set. - type: string - instanceID: - description: InstanceID is the EC2 instance ID for this machine. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. - Example: m4.xlarge' - minLength: 2 - type: string - networkInterfaces: - description: NetworkInterfaces is a list of ENIs to associate - with the instance. A maximum of 2 may be specified. - items: - type: string - maxItems: 2 - type: array - nonRootVolumes: - description: Configuration options for the non root storage - volumes. - items: - description: Volume encapsulates the configuration options - for the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should - be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to - encrypt the volume. Can be either a KMS key ID or - ARN. If Encrypted is set and this is omitted, the - default AWS key will be used. The key must already - exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for - the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage - device. Must be greater than the image snapshot size - or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported - for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, - io1, etc...). - type: string - required: - - size - type: object - type: array - providerID: - description: ProviderID is the unique identifier as specified - by the cloud provider. - type: string - publicIP: - description: 'PublicIP specifies whether the instance should - get a public IP. Precedence for this setting is as follows: - 1. This field if set 2. Cluster/flavor setting 3. Subnet - default' - type: boolean - rootVolume: - description: RootVolume encapsulates the configuration options - for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be - encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will - be used. The key must already exist and be accessible - by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for - the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage - device. Must be greater than the image snapshot size - or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported - for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, - io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions allows users to configure instances - to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user - is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach - to the instance. Valid values are empty string (do not use - SSH keys), a valid SSH key name, or omitted (use the default - SSH key name) - type: string - subnet: - description: Subnet is a reference to the subnet to use for - this instance. If not specified, the cluster subnet will - be used. - properties: - arn: - description: 'ARN of resource. Deprecated: This field - has no function and is going to be removed in the next - release.' - type: string - filters: - description: 'Filters is a set of key/value pairs used - to identify a resource They are applied according to - the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an - AWS resource. - properties: - name: - description: Name of the filter. Filter names are - case-sensitive. - type: string - values: - description: Values includes one or more filter - values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - tenancy: - description: Tenancy indicates if instance should run on shared - or single-tenant hardware. - enum: - - default - - dedicated - - host - type: string - uncompressedUserData: - description: UncompressedUserData specify whether the user - data is gzip-compressed before it is sent to ec2 instance. - cloud-init has built-in support for gzip-compressed user - data user data stored in aws secret manager is always gzip-compressed. - type: boolean - required: - - instanceType - type: object - required: - - spec - type: object - required: - - template - type: object - status: - description: AWSMachineTemplateStatus defines a status for an AWSMachineTemplate. - properties: - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Capacity defines the resource capacity for this machine. - This value is used for autoscaling from zero operations as defined - in: https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20210310-opt-in-autoscaling-from-zero.md' - type: object - type: object - type: object - served: true - storage: false - - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSMachineTemplate is the schema for the Amazon EC2 Machine Templates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachineTemplateSpec defines the desired state of AWSMachineTemplate. - properties: - template: - description: AWSMachineTemplateResource describes the data needed - to create am AWSMachine from a template. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references - to security groups that should be applied to the instance. - These security groups would be set in addition to any security - groups defined at the cluster level or in the actuator. - It is possible to specify either IDs of Filters. Using Filters - will cause additional requests to AWS API and if tags change - the attached security groups might change too. - items: - description: AWSResourceReference is a reference to a specific - AWS resource by ID or filters. Only one of ID or Filters - may be specified. Specifying more than one will result - in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used - to identify a resource They are applied according - to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an - AWS resource. - properties: - name: - description: Name of the filter. Filter names - are case-sensitive. - type: string - values: - description: Values includes one or more filter - values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to - add to an instance, in addition to the ones added by default - by the AWS provider. If both the AWSCluster and the AWSMachine - specify the same tag name with different values, the AWSMachine's - value takes precedence. - type: object - ami: - description: AMI is the reference to the AMI from which to - create the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will - look up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - cloudInit: - description: CloudInit defines options related to the bootstrapping - systems where CloudInit is used. - properties: - insecureSkipSecretsManager: - description: InsecureSkipSecretsManager, when set to true - will not use AWS Secrets Manager or AWS Systems Manager - Parameter Store to ensure privacy of userdata. By default, - a cloud-init boothook shell script is prepended to download - the userdata from Secrets Manager and additionally delete - the secret. - type: boolean - secretCount: - description: SecretCount is the number of secrets used - to form the complete secret - format: int32 - type: integer - secretPrefix: - description: SecretPrefix is the prefix for the secret - name. This is stored temporarily, and deleted when the - machine registers as a node against the workload cluster. - type: string - secureSecretsBackend: - description: SecureSecretsBackend, when set to parameter-store - will utilize the AWS Systems Manager Parameter Storage - to distribute secrets. By default or with the value - of secrets-manager, will use AWS Secrets Manager instead. - enum: - - secrets-manager - - ssm-parameter-store - type: string - type: object - iamInstanceProfile: - description: IAMInstanceProfile is a name of an IAM instance - profile to assign to the instance - type: string - ignition: - description: Ignition defined options related to the bootstrapping - systems where Ignition is used. - properties: - version: - default: "2.3" - description: Version defines which version of Ignition - will be used to generate bootstrap data. - enum: - - "2.3" - type: string - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating - system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to - look up the image for this machine It will be ignored if - an explicit AMI is set. Supports substitutions for {{.BaseOS}} - and {{.K8sVersion}} with the base OS and kubernetes version, - respectively. The BaseOS will be the value in ImageLookupBaseOS - or ubuntu (the default), and the kubernetes version as defined - by the packages produced by kubernetes/release without v - as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, - the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the - ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to - use for image lookup if AMI is not set. - type: string - instanceID: - description: InstanceID is the EC2 instance ID for this machine. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. - Example: m4.xlarge' - minLength: 2 - type: string - networkInterfaces: - description: NetworkInterfaces is a list of ENIs to associate - with the instance. A maximum of 2 may be specified. - items: - type: string - maxItems: 2 - type: array - nonRootVolumes: - description: Configuration options for the non root storage - volumes. - items: - description: Volume encapsulates the configuration options - for the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should - be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to - encrypt the volume. Can be either a KMS key ID or - ARN. If Encrypted is set and this is omitted, the - default AWS key will be used. The key must already - exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for - the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage - device. Must be greater than the image snapshot size - or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported - for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, - io1, etc...). - type: string - required: - - size - type: object - type: array - providerID: - description: ProviderID is the unique identifier as specified - by the cloud provider. - type: string - publicIP: - description: 'PublicIP specifies whether the instance should - get a public IP. Precedence for this setting is as follows: - 1. This field if set 2. Cluster/flavor setting 3. Subnet - default' - type: boolean - rootVolume: - description: RootVolume encapsulates the configuration options - for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be - encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will - be used. The key must already exist and be accessible - by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for - the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage - device. Must be greater than the image snapshot size - or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported - for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, - io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions allows users to configure instances - to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user - is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach - to the instance. Valid values are empty string (do not use - SSH keys), a valid SSH key name, or omitted (use the default - SSH key name) - type: string - subnet: - description: Subnet is a reference to the subnet to use for - this instance. If not specified, the cluster subnet will - be used. - properties: - filters: - description: 'Filters is a set of key/value pairs used - to identify a resource They are applied according to - the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an - AWS resource. - properties: - name: - description: Name of the filter. Filter names are - case-sensitive. - type: string - values: - description: Values includes one or more filter - values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - tenancy: - description: Tenancy indicates if instance should run on shared - or single-tenant hardware. - enum: - - default - - dedicated - - host - type: string - uncompressedUserData: - description: UncompressedUserData specify whether the user - data is gzip-compressed before it is sent to ec2 instance. - cloud-init has built-in support for gzip-compressed user - data user data stored in aws secret manager is always gzip-compressed. - type: boolean - required: - - instanceType - type: object - required: - - spec - type: object - required: - - template - type: object - status: - description: AWSMachineTemplateStatus defines a status for an AWSMachineTemplate. - properties: - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Capacity defines the resource capacity for this machine. - This value is used for autoscaling from zero operations as defined - in: https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20210310-opt-in-autoscaling-from-zero.md' - type: object - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmanagedclusters.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSManagedCluster - listKind: AWSManagedClusterList - plural: awsmanagedclusters - shortNames: - - awsmc - singular: awsmanagedcluster - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this AWSManagedControl belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Control plane infrastructure is ready for worker nodes - jsonPath: .status.ready - name: Ready - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSManagedCluster is the Schema for the awsmanagedclusters API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSManagedClusterSpec defines the desired state of AWSManagedCluster - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - type: object - status: - description: AWSManagedClusterStatus defines the observed state of AWSManagedCluster - properties: - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains specifies a list fo available availability - zones that can be used - type: object - ready: - description: Ready is when the AWSManagedControlPlane has a API server - URL. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmanagedcontrolplanes.controlplane.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: controlplane.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSManagedControlPlane - listKind: AWSManagedControlPlaneList - plural: awsmanagedcontrolplanes - shortNames: - - awsmcp - singular: awsmanagedcontrolplane - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this AWSManagedControl belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Control plane infrastructure is ready for worker nodes - jsonPath: .status.ready - name: Ready - type: string - - description: AWS VPC the control plane is using - jsonPath: .spec.network.vpc.id - name: VPC - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - - description: Bastion IP address for breakglass access - jsonPath: .status.bastion.publicIp - name: Bastion IP - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSManagedControlPlane is the schema for the Amazon EKS Managed - Control Plane API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSManagedControlPlaneSpec defines the desired state of an - Amazon EKS Cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS - resources managed by the AWS provider, in addition to the ones added - by default. - type: object - addons: - description: Addons defines the EKS addons to enable with the EKS - cluster. - items: - description: Addon represents a EKS addon. - properties: - conflictResolution: - default: none - description: ConflictResolution is used to declare what should - happen if there are parameter conflicts. Defaults to none - enum: - - overwrite - - none - type: string - name: - description: Name is the name of the addon - minLength: 2 - type: string - serviceAccountRoleARN: - description: ServiceAccountRoleArn is the ARN of an IAM role - to bind to the addons service account - type: string - version: - description: Version is the version of the addon to use - type: string - required: - - name - - version - type: object - type: array - associateOIDCProvider: - default: false - description: AssociateOIDCProvider can be enabled to automatically - create an identity provider for the controller for use with IAM - roles for service accounts - type: boolean - bastion: - description: Bastion contains options to configure the bastion host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks allowed - to access the bastion host. They are set as ingress rules for - the Bastion host's Security Group (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the bastion. - If not specified, the AMI will default to one picked out in - public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are no Ingress - rules in the bastion host's security group. Requires AllowedCIDRBlocks - to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a bastion - host instance with a public ip to access the VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance type - for the bastion. If not specified, Cluster API Provider AWS - will use t3.micro for all regions except us-east-1, where t2.micro - will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - disableVPCCNI: - default: false - description: DisableVPCCNI indicates that the Amazon VPC CNI should - be disabled. With EKS clusters the Amazon VPC CNI is automatically - installed into the cluster. For clusters where you want to use an - alternate CNI this option provides a way to specify that the Amazon - VPC CNI should be deleted. You cannot set this to true if you are - using the Amazon VPC CNI addon. - type: boolean - eksClusterName: - description: EKSClusterName allows you to specify the name of the - EKS cluster in AWS. If you don't specify a name then a default name - will be created based on the namespace and name of the managed control - plane. - type: string - encryptionConfig: - description: EncryptionConfig specifies the encryption configuration - for the cluster - properties: - provider: - description: Provider specifies the ARN or alias of the CMK (in - AWS KMS) - type: string - resources: - description: Resources specifies the resources to be encrypted - items: - type: string - type: array - type: object - endpointAccess: - description: Endpoints specifies access to this cluster's control - plane endpoints - properties: - private: - description: Private points VPC-internal control plane access - to the private endpoint - type: boolean - public: - description: Public controls whether control plane endpoints are - publicly accessible - type: boolean - publicCIDRs: - description: PublicCIDRs specifies which blocks can access the - public endpoint - items: - type: string - type: array - type: object - iamAuthenticatorConfig: - description: IAMAuthenticatorConfig allows the specification of any - additional user or role mappings for use when generating the aws-iam-authenticator - configuration. If this is nil the default configuration is still - generated for the cluster. - properties: - mapRoles: - description: RoleMappings is a list of role mappings - items: - description: RoleMapping represents a mapping from a IAM role - to Kubernetes users and groups. - properties: - groups: - description: Groups is a list of kubernetes RBAC groups - items: - type: string - type: array - rolearn: - description: RoleARN is the AWS ARN for the role to map - minLength: 31 - type: string - username: - description: UserName is a kubernetes RBAC user subject - type: string - required: - - groups - - rolearn - - username - type: object - type: array - mapUsers: - description: UserMappings is a list of user mappings - items: - description: UserMapping represents a mapping from an IAM user - to Kubernetes users and groups. - properties: - groups: - description: Groups is a list of kubernetes RBAC groups - items: - type: string - type: array - userarn: - description: UserARN is the AWS ARN for the user to map - minLength: 31 - type: string - username: - description: UserName is a kubernetes RBAC user subject - type: string - required: - - groups - - userarn - - username - type: object - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be used when - reconciling the managed control plane. - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system - used to look up machine images when a machine does not specify an - AMI. When set, this will be used for all cluster machines unless - a machine specifies a different ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up - machine images when a machine does not specify an AMI. When set, - this will be used for all cluster machines unless a machine specifies - a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} - and {{.K8sVersion}} with the base OS and kubernetes version, respectively. - The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the - default), and the kubernetes version as defined by the packages - produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the ubuntu - base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to look up - machine images when a machine does not specify an AMI. When set, - this will be used for all cluster machines unless a machine specifies - a different ImageLookupOrg. - type: string - kubeProxy: - description: KubeProxy defines managed attributes of the kube-proxy - daemonset - properties: - disable: - default: false - description: Disable set to true indicates that kube-proxy should - be disabled. With EKS clusters kube-proxy is automatically installed - into the cluster. For clusters where you want to use kube-proxy - functionality that is provided with an alternate CNI, this option - provides a way to specify that the kube-proxy daemonset should - be deleted. You cannot set this to true if you are using the - Amazon kube-proxy addon. - type: boolean - type: object - logging: - description: Logging specifies which EKS Cluster logs should be enabled. - Entries for each of the enabled logs will be sent to CloudWatch - properties: - apiServer: - default: false - description: APIServer indicates if the Kubernetes API Server - log (kube-apiserver) shoulkd be enabled - type: boolean - audit: - default: false - description: Audit indicates if the Kubernetes API audit log should - be enabled - type: boolean - authenticator: - default: false - description: Authenticator indicates if the iam authenticator - log should be enabled - type: boolean - controllerManager: - default: false - description: ControllerManager indicates if the controller manager - (kube-controller-manager) log should be enabled - type: boolean - scheduler: - default: false - description: Scheduler indicates if the Kubernetes scheduler (kube-scheduler) - log should be enabled - type: boolean - required: - - apiServer - - audit - - authenticator - - controllerManager - - scheduler - type: object - network: - description: NetworkSpec encapsulates all things related to AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply to control - plane and worker node security groups. The source for the - rule will be set to control plane and worker security group - IDs. - items: - description: CNIIngressRule defines an AWS ingress rule - for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the protocol - type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set of security - groups to use for cluster instances This is optional - if not - provided new security groups will be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability zone - to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used when - the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference - this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block to be - used when the provider creates a managed VPC. A subnet - can have an IPv4 and an IPv6 address. IPv6 is only supported - in managed clusters, this field cannot be set on AWSCluster - object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 subnet. - A subnet is IPv6 when it is associated with a VPC that - has IPv6 enabled. IPv6 is only supported in managed clusters, - this field cannot be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public subnet. - A subnet is public when it is associated with a route - table that has a route to an internet gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id associated - with the subnet. Ignored unless the subnet is managed - by the provider, in which case this is set on the public - subnet where the NAT gateway resides. It is then used - to determine routes for private subnets in the same AZ - as the public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id associated - with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the - resource. - type: object - required: - - id - type: object - type: array - x-kubernetes-list-map-keys: - - id - x-kubernetes-list-type: map - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies how AZs - should be selected if there are more AZs in a region than - specified by AvailabilityZoneUsageLimit. There are 2 selection - schemes: Ordered - selects based on alphabetical order Random - - selects AZs randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies the maximum - number of availability zones (AZ) that should be used in - a region when automatically creating subnets. If a region - has more than this number of AZs then this number of AZs - will be picked randomly when creating default subnets. Defaults - to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used when the - provider creates a managed VPC. Defaults to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider should - use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet gateway - associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings for the - network. Supported only in managed clusters. This field - cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided by Amazon - when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the id of - the egress only internet gateway associated with an - IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must be defined - in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: object - oidcIdentityProviderConfig: - description: IdentityProviderconfig is used to specify the oidc provider - config to be attached with this eks cluster - properties: - clientId: - description: This is also known as audience. The ID for the client - application that makes authentication requests to the OpenID - identity provider. - type: string - groupsClaim: - description: The JWT claim that the provider uses to return your - groups. - type: string - groupsPrefix: - description: 'The prefix that is prepended to group claims to - prevent clashes with existing names (such as system: groups). - For example, the valueoidc: will create group names like oidc:engineering - and oidc:infra.' - type: string - identityProviderConfigName: - description: "The name of the OIDC provider configuration. \n - IdentityProviderConfigName is a required field" - type: string - issuerUrl: - description: The URL of the OpenID identity provider that allows - the API server to discover public signing keys for verifying - tokens. The URL must begin with https:// and should correspond - to the iss claim in the provider's OIDC ID tokens. Per the OIDC - standard, path components are allowed but query parameters are - not. Typically the URL consists of only a hostname, like https://server.example.org - or https://example.com. This URL should point to the level below - .well-known/openid-configuration and must be publicly accessible - over the internet. - type: string - requiredClaims: - additionalProperties: - type: string - description: The key value pairs that describe required claims - in the identity token. If set, each claim is verified to be - present in the token with a matching value. For the maximum - number of claims that you can require, see Amazon EKS service - quotas (https://docs.aws.amazon.com/eks/latest/userguide/service-quotas.html) - in the Amazon EKS User Guide. - type: object - tags: - additionalProperties: - type: string - description: tags to apply to oidc identity provider association - type: object - usernameClaim: - description: The JSON Web Token (JWT) claim to use as the username. - The default is sub, which is expected to be a unique identifier - of the end user. You can choose other claims, such as email - or name, depending on the OpenID identity provider. Claims other - than email are prefixed with the issuer URL to prevent naming - clashes with other plug-ins. - type: string - usernamePrefix: - description: The prefix that is prepended to username claims to - prevent clashes with existing names. If you do not provide this - field, and username is a value other than email, the prefix - defaults to issuerurl#. You can use the value - to disable all - prefixing. - type: string - type: object - region: - description: The AWS Region the cluster lives in. - type: string - roleAdditionalPolicies: - description: RoleAdditionalPolicies allows you to attach additional - polices to the control plane role. You must enable the EKSAllowAddRoles - feature flag to incorporate these into the created role. - items: - type: string - type: array - roleName: - description: RoleName specifies the name of IAM role that gives EKS - permission to make API calls. If the role is pre-existing we will - treat it as unmanaged and not delete it on deletion. If the EKSEnableIAM - feature flag is true and no name is supplied then a role is created. - minLength: 2 - type: string - secondaryCidrBlock: - description: SecondaryCidrBlock is the additional CIDR range to use - for pod IPs. Must be within the 100.64.0.0/10 or 198.19.0.0/16 range. - type: string - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the - bastion host. Valid values are empty string (do not use SSH keys), - a valid SSH key name, or omitted (use the default SSH key name) - type: string - tokenMethod: - default: iam-authenticator - description: TokenMethod is used to specify the method for obtaining - a client token for communicating with EKS iam-authenticator - obtains - a client token using iam-authentictor aws-cli - obtains a client - token using the AWS CLI Defaults to iam-authenticator - enum: - - iam-authenticator - - aws-cli - type: string - version: - description: Version defines the desired Kubernetes version. If no - version number is supplied then the latest version of Kubernetes - that EKS supports will be used. - minLength: 2 - pattern: ^v?(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.?(\.0|[1-9][0-9]*)?$ - type: string - vpcCni: - description: VpcCni is used to set configuration options for the VPC - CNI plugin - properties: - env: - description: Env defines a list of environment variables to apply - to the `aws-node` DaemonSet - items: - description: EnvVar represents an environment variable present - in a Container. - properties: - name: - description: Name of the environment variable. Must be a - C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in - the container and any service environment variables. If - a variable cannot be resolved, the reference in the input - string will be unchanged. Double $$ are reduced to a single - $, which allows for escaping the $(VAR_NAME) syntax: i.e. - "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". - Escaped references will never be expanded, regardless - of whether the variable exists or not. Defaults to "".' - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - fieldRef: - description: 'Selects a field of the pod: supports metadata.name, - metadata.namespace, `metadata.labels['''']`, - `metadata.annotations['''']`, spec.nodeName, - spec.serviceAccountName, status.hostIP, status.podIP, - status.podIPs.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the - specified API version. - type: string - required: - - fieldPath - type: object - resourceFieldRef: - description: 'Selects a resource of the container: only - resources limits and requests (limits.cpu, limits.memory, - limits.ephemeral-storage, requests.cpu, requests.memory - and requests.ephemeral-storage) are currently supported.' - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the - exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - type: object - required: - - name - type: object - type: array - type: object - type: object - status: - description: AWSManagedControlPlaneStatus defines the observed state of - an Amazon EKS Cluster. - properties: - addons: - description: Addons holds the current status of the EKS addons - items: - description: AddonState represents the state of an addon. - properties: - arn: - description: ARN is the AWS ARN of the addon - type: string - createdAt: - description: CreatedAt is the date and time the addon was created - at - format: date-time - type: string - issues: - description: Issues is a list of issue associated with the addon - items: - description: AddonIssue represents an issue with an addon. - properties: - code: - description: Code is the issue code - type: string - message: - description: Message is the textual description of the - issue - type: string - resourceIds: - description: ResourceIDs is a list of resource ids for - the issue - items: - type: string - type: array - type: object - type: array - modifiedAt: - description: ModifiedAt is the date and time the addon was last - modified - format: date-time - type: string - name: - description: Name is the name of the addon - type: string - serviceAccountRoleARN: - description: ServiceAccountRoleArn is the ARN of the IAM role - used for the service account - type: string - status: - description: Status is the status of the addon - type: string - version: - description: Version is the version of the addon to use - type: string - required: - - arn - - name - - version - type: object - type: array - bastion: - description: Bastion holds details of the instance that is used as - a bastion jump box - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - availabilityZone: - description: Availability zone of instance - type: string - ebsOptimized: - description: Indicates whether the instance is optimized for Amazon - EBS I/O. - type: boolean - enaSupport: - description: Specifies whether enhanced networking with ENA is - enabled. - type: boolean - iamProfile: - description: The name of the IAM instance profile associated with - the instance, if applicable. - type: string - id: - type: string - imageId: - description: The ID of the AMI used to launch the instance. - type: string - instanceState: - description: The current state of the instance. - type: string - networkInterfaces: - description: Specifies ENIs attached to instance - items: - type: string - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for - the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by - the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage - device. Must be greater than the image snapshot size or - 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported - for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - type: array - privateIp: - description: The private IPv4 address assigned to the instance. - type: string - publicIp: - description: The public IPv4 address assigned to the instance, - if applicable. - type: string - rootVolume: - description: Configuration options for the root storage volume. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by the - controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for - the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - securityGroupIds: - description: SecurityGroupIDs are one or more security group IDs - this instance belongs to. - items: - type: string - type: array - spotMarketOptions: - description: SpotMarketOptions option for configuring instances - to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is - willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: The name of the SSH key pair. - type: string - subnetId: - description: The ID of the subnet of the instance. - type: string - tags: - additionalProperties: - type: string - description: The tags associated with the instance. - type: object - tenancy: - description: Tenancy indicates if instance should run on shared - or single-tenant hardware. - type: string - type: - description: The instance type. - type: string - userData: - description: UserData is the raw data script passed to the instance - which is run upon bootstrap. This field must not be base64 encoded - and should only be used when running a new instance. - type: string - volumeIDs: - description: IDs of the instance's volumes - items: - type: string - type: array - required: - - id - type: object - conditions: - description: Conditions specifies the cpnditions for the managed control - plane - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - externalManagedControlPlane: - default: true - description: ExternalManagedControlPlane indicates to cluster-api - that the control plane is managed by an external service such as - AKS, EKS, GKE, etc. - type: boolean - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains specifies a list fo available availability - zones that can be used - type: object - failureMessage: - description: ErrorMessage indicates that there is a terminal problem - reconciling the state, and will be set to a descriptive error message. - type: string - identityProviderStatus: - description: IdentityProviderStatus holds the status for associated - identity provider - properties: - arn: - description: ARN holds the ARN of associated identity provider - type: string - status: - description: Status holds current status of associated identity - provider - type: string - type: object - initialized: - description: Initialized denotes whether or not the control plane - has the uploaded kubernetes config-map. - type: boolean - networkStatus: - description: Networks holds details about the AWS networking resources - used by the control plane - properties: - apiServerElb: - description: APIServerELB is the Kubernetes api server classic - load balancer. - properties: - attributes: - description: Attributes defines extra attributes associated - with the load balancer. - properties: - crossZoneLoadBalancing: - description: CrossZoneLoadBalancing enables the classic - load balancer load balancing. - type: boolean - idleTimeout: - description: IdleTimeout is time that the connection is - allowed to be idle (no data has been sent over the connection) - before it is closed by the load balancer. - format: int64 - type: integer - type: object - availabilityZones: - description: AvailabilityZones is an array of availability - zones in the VPC attached to the load balancer. - items: - type: string - type: array - dnsName: - description: DNSName is the dns name of the load balancer. - type: string - healthChecks: - description: HealthCheck is the classic elb health check associated - with the load balancer. - properties: - healthyThreshold: - format: int64 - type: integer - interval: - description: A Duration represents the elapsed time between - two instants as an int64 nanosecond count. The representation - limits the largest representable duration to approximately - 290 years. - format: int64 - type: integer - target: - type: string - timeout: - description: A Duration represents the elapsed time between - two instants as an int64 nanosecond count. The representation - limits the largest representable duration to approximately - 290 years. - format: int64 - type: integer - unhealthyThreshold: - format: int64 - type: integer - required: - - healthyThreshold - - interval - - target - - timeout - - unhealthyThreshold - type: object - listeners: - description: Listeners is an array of classic elb listeners - associated with the load balancer. There must be at least - one. - items: - description: ClassicELBListener defines an AWS classic load - balancer listener. - properties: - instancePort: - format: int64 - type: integer - instanceProtocol: - description: ClassicELBProtocol defines listener protocols - for a classic load balancer. - type: string - port: - format: int64 - type: integer - protocol: - description: ClassicELBProtocol defines listener protocols - for a classic load balancer. - type: string - required: - - instancePort - - instanceProtocol - - port - - protocol - type: object - type: array - name: - description: The name of the load balancer. It must be unique - within the set of load balancers defined in the region. - It also serves as identifier. - type: string - scheme: - description: Scheme is the load balancer scheme, either internet-facing - or private. - type: string - securityGroupIds: - description: SecurityGroupIDs is an array of security groups - assigned to the load balancer. - items: - type: string - type: array - subnetIds: - description: SubnetIDs is an array of subnets in the VPC attached - to the load balancer. - items: - type: string - type: array - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the load - balancer. - type: object - type: object - securityGroups: - additionalProperties: - description: SecurityGroup defines an AWS security group. - properties: - id: - description: ID is a unique identifier. - type: string - ingressRule: - description: IngressRules is the inbound rules associated - with the security group. - items: - description: IngressRule defines an AWS ingress rule for - security groups. - properties: - cidrBlocks: - description: List of CIDR blocks to allow access from. - Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - description: - type: string - fromPort: - format: int64 - type: integer - ipv6CidrBlocks: - description: List of IPv6 CIDR blocks to allow access - from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - protocol: - description: SecurityGroupProtocol defines the protocol - type for a security group rule. - type: string - sourceSecurityGroupIds: - description: The security group id to allow access - from. Cannot be specified with CidrBlocks. - items: - type: string - type: array - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - name: - description: Name is the security group name. - type: string - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the security - group. - type: object - required: - - id - - name - type: object - description: SecurityGroups is a map from the role/kind of the - security group to its unique name, if any. - type: object - type: object - oidcProvider: - description: OIDCProvider holds the status of the identity provider - for this cluster - properties: - arn: - description: ARN holds the ARN of the provider - type: string - trustPolicy: - description: TrustPolicy contains the boilerplate IAM trust policy - to use for IRSA - type: string - type: object - ready: - default: false - description: Ready denotes that the AWSManagedControlPlane API Server - is ready to receive requests and that the VPC infra is ready. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this AWSManagedControl belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Control plane infrastructure is ready for worker nodes - jsonPath: .status.ready - name: Ready - type: string - - description: AWS VPC the control plane is using - jsonPath: .spec.network.vpc.id - name: VPC - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - - description: Bastion IP address for breakglass access - jsonPath: .status.bastion.publicIp - name: Bastion IP - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSManagedControlPlane is the schema for the Amazon EKS Managed - Control Plane API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSManagedControlPlaneSpec defines the desired state of an - Amazon EKS Cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS - resources managed by the AWS provider, in addition to the ones added - by default. - type: object - addons: - description: Addons defines the EKS addons to enable with the EKS - cluster. - items: - description: Addon represents a EKS addon. - properties: - conflictResolution: - default: overwrite - description: ConflictResolution is used to declare what should - happen if there are parameter conflicts. Defaults to none - enum: - - overwrite - - none - type: string - name: - description: Name is the name of the addon - minLength: 2 - type: string - serviceAccountRoleARN: - description: ServiceAccountRoleArn is the ARN of an IAM role - to bind to the addons service account - type: string - version: - description: Version is the version of the addon to use - type: string - required: - - name - - version - type: object - type: array - associateOIDCProvider: - default: false - description: AssociateOIDCProvider can be enabled to automatically - create an identity provider for the controller for use with IAM - roles for service accounts - type: boolean - bastion: - description: Bastion contains options to configure the bastion host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks allowed - to access the bastion host. They are set as ingress rules for - the Bastion host's Security Group (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the bastion. - If not specified, the AMI will default to one picked out in - public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are no Ingress - rules in the bastion host's security group. Requires AllowedCIDRBlocks - to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a bastion - host instance with a public ip to access the VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance type - for the bastion. If not specified, Cluster API Provider AWS - will use t3.micro for all regions except us-east-1, where t2.micro - will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - eksClusterName: - description: EKSClusterName allows you to specify the name of the - EKS cluster in AWS. If you don't specify a name then a default name - will be created based on the namespace and name of the managed control - plane. - type: string - encryptionConfig: - description: EncryptionConfig specifies the encryption configuration - for the cluster - properties: - provider: - description: Provider specifies the ARN or alias of the CMK (in - AWS KMS) - type: string - resources: - description: Resources specifies the resources to be encrypted - items: - type: string - type: array - type: object - endpointAccess: - description: Endpoints specifies access to this cluster's control - plane endpoints - properties: - private: - description: Private points VPC-internal control plane access - to the private endpoint - type: boolean - public: - description: Public controls whether control plane endpoints are - publicly accessible - type: boolean - publicCIDRs: - description: PublicCIDRs specifies which blocks can access the - public endpoint - items: - type: string - type: array - type: object - iamAuthenticatorConfig: - description: IAMAuthenticatorConfig allows the specification of any - additional user or role mappings for use when generating the aws-iam-authenticator - configuration. If this is nil the default configuration is still - generated for the cluster. - properties: - mapRoles: - description: RoleMappings is a list of role mappings - items: - description: RoleMapping represents a mapping from a IAM role - to Kubernetes users and groups. - properties: - groups: - description: Groups is a list of kubernetes RBAC groups - items: - type: string - type: array - rolearn: - description: RoleARN is the AWS ARN for the role to map - minLength: 31 - type: string - username: - description: UserName is a kubernetes RBAC user subject - type: string - required: - - groups - - rolearn - - username - type: object - type: array - mapUsers: - description: UserMappings is a list of user mappings - items: - description: UserMapping represents a mapping from an IAM user - to Kubernetes users and groups. - properties: - groups: - description: Groups is a list of kubernetes RBAC groups - items: - type: string - type: array - userarn: - description: UserARN is the AWS ARN for the user to map - minLength: 31 - type: string - username: - description: UserName is a kubernetes RBAC user subject - type: string - required: - - groups - - userarn - - username - type: object - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be used when - reconciling the managed control plane. - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system - used to look up machine images when a machine does not specify an - AMI. When set, this will be used for all cluster machines unless - a machine specifies a different ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up - machine images when a machine does not specify an AMI. When set, - this will be used for all cluster machines unless a machine specifies - a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} - and {{.K8sVersion}} with the base OS and kubernetes version, respectively. - The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the - default), and the kubernetes version as defined by the packages - produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the ubuntu - base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to look up - machine images when a machine does not specify an AMI. When set, - this will be used for all cluster machines unless a machine specifies - a different ImageLookupOrg. - type: string - kubeProxy: - description: KubeProxy defines managed attributes of the kube-proxy - daemonset - properties: - disable: - default: false - description: Disable set to true indicates that kube-proxy should - be disabled. With EKS clusters kube-proxy is automatically installed - into the cluster. For clusters where you want to use kube-proxy - functionality that is provided with an alternate CNI, this option - provides a way to specify that the kube-proxy daemonset should - be deleted. You cannot set this to true if you are using the - Amazon kube-proxy addon. - type: boolean - type: object - logging: - description: Logging specifies which EKS Cluster logs should be enabled. - Entries for each of the enabled logs will be sent to CloudWatch - properties: - apiServer: - default: false - description: APIServer indicates if the Kubernetes API Server - log (kube-apiserver) shoulkd be enabled - type: boolean - audit: - default: false - description: Audit indicates if the Kubernetes API audit log should - be enabled - type: boolean - authenticator: - default: false - description: Authenticator indicates if the iam authenticator - log should be enabled - type: boolean - controllerManager: - default: false - description: ControllerManager indicates if the controller manager - (kube-controller-manager) log should be enabled - type: boolean - scheduler: - default: false - description: Scheduler indicates if the Kubernetes scheduler (kube-scheduler) - log should be enabled - type: boolean - required: - - apiServer - - audit - - authenticator - - controllerManager - - scheduler - type: object - network: - description: NetworkSpec encapsulates all things related to AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply to control - plane and worker node security groups. The source for the - rule will be set to control plane and worker security group - IDs. - items: - description: CNIIngressRule defines an AWS ingress rule - for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the protocol - type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set of security - groups to use for cluster instances This is optional - if not - provided new security groups will be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability zone - to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used when - the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference - this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block to be - used when the provider creates a managed VPC. A subnet - can have an IPv4 and an IPv6 address. IPv6 is only supported - in managed clusters, this field cannot be set on AWSCluster - object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 subnet. - A subnet is IPv6 when it is associated with a VPC that - has IPv6 enabled. IPv6 is only supported in managed clusters, - this field cannot be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public subnet. - A subnet is public when it is associated with a route - table that has a route to an internet gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id associated - with the subnet. Ignored unless the subnet is managed - by the provider, in which case this is set on the public - subnet where the NAT gateway resides. It is then used - to determine routes for private subnets in the same AZ - as the public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id associated - with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the - resource. - type: object - required: - - id - type: object - type: array - x-kubernetes-list-map-keys: - - id - x-kubernetes-list-type: map - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies how AZs - should be selected if there are more AZs in a region than - specified by AvailabilityZoneUsageLimit. There are 2 selection - schemes: Ordered - selects based on alphabetical order Random - - selects AZs randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies the maximum - number of availability zones (AZ) that should be used in - a region when automatically creating subnets. If a region - has more than this number of AZs then this number of AZs - will be picked randomly when creating default subnets. Defaults - to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used when the - provider creates a managed VPC. Defaults to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider should - use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet gateway - associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings for the - network. Supported only in managed clusters. This field - cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided by Amazon - when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the id of - the egress only internet gateway associated with an - IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must be defined - in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: object - oidcIdentityProviderConfig: - description: IdentityProviderconfig is used to specify the oidc provider - config to be attached with this eks cluster - properties: - clientId: - description: This is also known as audience. The ID for the client - application that makes authentication requests to the OpenID - identity provider. - type: string - groupsClaim: - description: The JWT claim that the provider uses to return your - groups. - type: string - groupsPrefix: - description: 'The prefix that is prepended to group claims to - prevent clashes with existing names (such as system: groups). - For example, the valueoidc: will create group names like oidc:engineering - and oidc:infra.' - type: string - identityProviderConfigName: - description: "The name of the OIDC provider configuration. \n - IdentityProviderConfigName is a required field" - type: string - issuerUrl: - description: The URL of the OpenID identity provider that allows - the API server to discover public signing keys for verifying - tokens. The URL must begin with https:// and should correspond - to the iss claim in the provider's OIDC ID tokens. Per the OIDC - standard, path components are allowed but query parameters are - not. Typically the URL consists of only a hostname, like https://server.example.org - or https://example.com. This URL should point to the level below - .well-known/openid-configuration and must be publicly accessible - over the internet. - type: string - requiredClaims: - additionalProperties: - type: string - description: The key value pairs that describe required claims - in the identity token. If set, each claim is verified to be - present in the token with a matching value. For the maximum - number of claims that you can require, see Amazon EKS service - quotas (https://docs.aws.amazon.com/eks/latest/userguide/service-quotas.html) - in the Amazon EKS User Guide. - type: object - tags: - additionalProperties: - type: string - description: tags to apply to oidc identity provider association - type: object - usernameClaim: - description: The JSON Web Token (JWT) claim to use as the username. - The default is sub, which is expected to be a unique identifier - of the end user. You can choose other claims, such as email - or name, depending on the OpenID identity provider. Claims other - than email are prefixed with the issuer URL to prevent naming - clashes with other plug-ins. - type: string - usernamePrefix: - description: The prefix that is prepended to username claims to - prevent clashes with existing names. If you do not provide this - field, and username is a value other than email, the prefix - defaults to issuerurl#. You can use the value - to disable all - prefixing. - type: string - type: object - region: - description: The AWS Region the cluster lives in. - type: string - roleAdditionalPolicies: - description: RoleAdditionalPolicies allows you to attach additional - polices to the control plane role. You must enable the EKSAllowAddRoles - feature flag to incorporate these into the created role. - items: - type: string - type: array - roleName: - description: RoleName specifies the name of IAM role that gives EKS - permission to make API calls. If the role is pre-existing we will - treat it as unmanaged and not delete it on deletion. If the EKSEnableIAM - feature flag is true and no name is supplied then a role is created. - minLength: 2 - type: string - secondaryCidrBlock: - description: SecondaryCidrBlock is the additional CIDR range to use - for pod IPs. Must be within the 100.64.0.0/10 or 198.19.0.0/16 range. - type: string - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the - bastion host. Valid values are empty string (do not use SSH keys), - a valid SSH key name, or omitted (use the default SSH key name) - type: string - tokenMethod: - default: iam-authenticator - description: TokenMethod is used to specify the method for obtaining - a client token for communicating with EKS iam-authenticator - obtains - a client token using iam-authentictor aws-cli - obtains a client - token using the AWS CLI Defaults to iam-authenticator - enum: - - iam-authenticator - - aws-cli - type: string - version: - description: Version defines the desired Kubernetes version. If no - version number is supplied then the latest version of Kubernetes - that EKS supports will be used. - minLength: 2 - pattern: ^v?(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.?(\.0|[1-9][0-9]*)?$ - type: string - vpcCni: - description: VpcCni is used to set configuration options for the VPC - CNI plugin - properties: - disable: - default: false - description: Disable indicates that the Amazon VPC CNI should - be disabled. With EKS clusters the Amazon VPC CNI is automatically - installed into the cluster. For clusters where you want to use - an alternate CNI this option provides a way to specify that - the Amazon VPC CNI should be deleted. You cannot set this to - true if you are using the Amazon VPC CNI addon. - type: boolean - env: - description: Env defines a list of environment variables to apply - to the `aws-node` DaemonSet - items: - description: EnvVar represents an environment variable present - in a Container. - properties: - name: - description: Name of the environment variable. Must be a - C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded - using the previously defined environment variables in - the container and any service environment variables. If - a variable cannot be resolved, the reference in the input - string will be unchanged. Double $$ are reduced to a single - $, which allows for escaping the $(VAR_NAME) syntax: i.e. - "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". - Escaped references will never be expanded, regardless - of whether the variable exists or not. Defaults to "".' - type: string - valueFrom: - description: Source for the environment variable's value. - Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the ConfigMap or its - key must be defined - type: boolean - required: - - key - type: object - fieldRef: - description: 'Selects a field of the pod: supports metadata.name, - metadata.namespace, `metadata.labels['''']`, - `metadata.annotations['''']`, spec.nodeName, - spec.serviceAccountName, status.hostIP, status.podIP, - status.podIPs.' - properties: - apiVersion: - description: Version of the schema the FieldPath - is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the - specified API version. - type: string - required: - - fieldPath - type: object - resourceFieldRef: - description: 'Selects a resource of the container: only - resources limits and requests (limits.cpu, limits.memory, - limits.ephemeral-storage, requests.cpu, requests.memory - and requests.ephemeral-storage) are currently supported.' - properties: - containerName: - description: 'Container name: required for volumes, - optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the - exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - secretKeyRef: - description: Selects a key of a secret in the pod's - namespace - properties: - key: - description: The key of the secret to select from. Must - be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, - uid?' - type: string - optional: - description: Specify whether the Secret or its key - must be defined - type: boolean - required: - - key - type: object - type: object - required: - - name - type: object - type: array - type: object - type: object - status: - description: AWSManagedControlPlaneStatus defines the observed state of - an Amazon EKS Cluster. - properties: - addons: - description: Addons holds the current status of the EKS addons - items: - description: AddonState represents the state of an addon. - properties: - arn: - description: ARN is the AWS ARN of the addon - type: string - createdAt: - description: CreatedAt is the date and time the addon was created - at - format: date-time - type: string - issues: - description: Issues is a list of issue associated with the addon - items: - description: AddonIssue represents an issue with an addon. - properties: - code: - description: Code is the issue code - type: string - message: - description: Message is the textual description of the - issue - type: string - resourceIds: - description: ResourceIDs is a list of resource ids for - the issue - items: - type: string - type: array - type: object - type: array - modifiedAt: - description: ModifiedAt is the date and time the addon was last - modified - format: date-time - type: string - name: - description: Name is the name of the addon - type: string - serviceAccountRoleARN: - description: ServiceAccountRoleArn is the ARN of the IAM role - used for the service account - type: string - status: - description: Status is the status of the addon - type: string - version: - description: Version is the version of the addon to use - type: string - required: - - arn - - name - - version - type: object - type: array - bastion: - description: Bastion holds details of the instance that is used as - a bastion jump box - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - availabilityZone: - description: Availability zone of instance - type: string - ebsOptimized: - description: Indicates whether the instance is optimized for Amazon - EBS I/O. - type: boolean - enaSupport: - description: Specifies whether enhanced networking with ENA is - enabled. - type: boolean - iamProfile: - description: The name of the IAM instance profile associated with - the instance, if applicable. - type: string - id: - type: string - imageId: - description: The ID of the AMI used to launch the instance. - type: string - instanceState: - description: The current state of the instance. - type: string - networkInterfaces: - description: Specifies ENIs attached to instance - items: - type: string - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for - the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by - the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage - device. Must be greater than the image snapshot size or - 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported - for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - type: array - privateIp: - description: The private IPv4 address assigned to the instance. - type: string - publicIp: - description: The public IPv4 address assigned to the instance, - if applicable. - type: string - rootVolume: - description: Configuration options for the root storage volume. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by the - controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for - the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - securityGroupIds: - description: SecurityGroupIDs are one or more security group IDs - this instance belongs to. - items: - type: string - type: array - spotMarketOptions: - description: SpotMarketOptions option for configuring instances - to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is - willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: The name of the SSH key pair. - type: string - subnetId: - description: The ID of the subnet of the instance. - type: string - tags: - additionalProperties: - type: string - description: The tags associated with the instance. - type: object - tenancy: - description: Tenancy indicates if instance should run on shared - or single-tenant hardware. - type: string - type: - description: The instance type. - type: string - userData: - description: UserData is the raw data script passed to the instance - which is run upon bootstrap. This field must not be base64 encoded - and should only be used when running a new instance. - type: string - volumeIDs: - description: IDs of the instance's volumes - items: - type: string - type: array - required: - - id - type: object - conditions: - description: Conditions specifies the cpnditions for the managed control - plane - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - externalManagedControlPlane: - default: true - description: ExternalManagedControlPlane indicates to cluster-api - that the control plane is managed by an external service such as - AKS, EKS, GKE, etc. - type: boolean - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains specifies a list fo available availability - zones that can be used - type: object - failureMessage: - description: ErrorMessage indicates that there is a terminal problem - reconciling the state, and will be set to a descriptive error message. - type: string - identityProviderStatus: - description: IdentityProviderStatus holds the status for associated - identity provider - properties: - arn: - description: ARN holds the ARN of associated identity provider - type: string - status: - description: Status holds current status of associated identity - provider - type: string - type: object - initialized: - description: Initialized denotes whether or not the control plane - has the uploaded kubernetes config-map. - type: boolean - networkStatus: - description: Networks holds details about the AWS networking resources - used by the control plane - properties: - apiServerElb: - description: APIServerELB is the Kubernetes api server classic - load balancer. - properties: - attributes: - description: Attributes defines extra attributes associated - with the load balancer. - properties: - crossZoneLoadBalancing: - description: CrossZoneLoadBalancing enables the classic - load balancer load balancing. - type: boolean - idleTimeout: - description: IdleTimeout is time that the connection is - allowed to be idle (no data has been sent over the connection) - before it is closed by the load balancer. - format: int64 - type: integer - type: object - availabilityZones: - description: AvailabilityZones is an array of availability - zones in the VPC attached to the load balancer. - items: - type: string - type: array - dnsName: - description: DNSName is the dns name of the load balancer. - type: string - healthChecks: - description: HealthCheck is the classic elb health check associated - with the load balancer. - properties: - healthyThreshold: - format: int64 - type: integer - interval: - description: A Duration represents the elapsed time between - two instants as an int64 nanosecond count. The representation - limits the largest representable duration to approximately - 290 years. - format: int64 - type: integer - target: - type: string - timeout: - description: A Duration represents the elapsed time between - two instants as an int64 nanosecond count. The representation - limits the largest representable duration to approximately - 290 years. - format: int64 - type: integer - unhealthyThreshold: - format: int64 - type: integer - required: - - healthyThreshold - - interval - - target - - timeout - - unhealthyThreshold - type: object - listeners: - description: Listeners is an array of classic elb listeners - associated with the load balancer. There must be at least - one. - items: - description: ClassicELBListener defines an AWS classic load - balancer listener. - properties: - instancePort: - format: int64 - type: integer - instanceProtocol: - description: ClassicELBProtocol defines listener protocols - for a classic load balancer. - type: string - port: - format: int64 - type: integer - protocol: - description: ClassicELBProtocol defines listener protocols - for a classic load balancer. - type: string - required: - - instancePort - - instanceProtocol - - port - - protocol - type: object - type: array - name: - description: The name of the load balancer. It must be unique - within the set of load balancers defined in the region. - It also serves as identifier. - type: string - scheme: - description: Scheme is the load balancer scheme, either internet-facing - or private. - type: string - securityGroupIds: - description: SecurityGroupIDs is an array of security groups - assigned to the load balancer. - items: - type: string - type: array - subnetIds: - description: SubnetIDs is an array of subnets in the VPC attached - to the load balancer. - items: - type: string - type: array - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the load - balancer. - type: object - type: object - securityGroups: - additionalProperties: - description: SecurityGroup defines an AWS security group. - properties: - id: - description: ID is a unique identifier. - type: string - ingressRule: - description: IngressRules is the inbound rules associated - with the security group. - items: - description: IngressRule defines an AWS ingress rule for - security groups. - properties: - cidrBlocks: - description: List of CIDR blocks to allow access from. - Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - description: - type: string - fromPort: - format: int64 - type: integer - ipv6CidrBlocks: - description: List of IPv6 CIDR blocks to allow access - from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - protocol: - description: SecurityGroupProtocol defines the protocol - type for a security group rule. - type: string - sourceSecurityGroupIds: - description: The security group id to allow access - from. Cannot be specified with CidrBlocks. - items: - type: string - type: array - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - name: - description: Name is the security group name. - type: string - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the security - group. - type: object - required: - - id - - name - type: object - description: SecurityGroups is a map from the role/kind of the - security group to its unique name, if any. - type: object - type: object - oidcProvider: - description: OIDCProvider holds the status of the identity provider - for this cluster - properties: - arn: - description: ARN holds the ARN of the provider - type: string - trustPolicy: - description: TrustPolicy contains the boilerplate IAM trust policy - to use for IRSA - type: string - type: object - ready: - default: false - description: Ready denotes that the AWSManagedControlPlane API Server - is ready to receive requests and that the VPC infra is ready. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.10.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmanagedmachinepools.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSManagedMachinePool - listKind: AWSManagedMachinePoolList - plural: awsmanagedmachinepools - shortNames: - - awsmmp - singular: awsmanagedmachinepool - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: MachinePool ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Number of replicas - jsonPath: .status.replicas - name: Replicas - type: integer - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSManagedMachinePool is the Schema for the awsmanagedmachinepools - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSManagedMachinePoolSpec defines the desired state of AWSManagedMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS - resources managed by the AWS provider, in addition to the ones added - by default. - type: object - amiType: - default: AL2_x86_64 - description: AMIType defines the AMI type - enum: - - AL2_x86_64 - - AL2_x86_64_GPU - - AL2_ARM_64 - - CUSTOM - type: string - amiVersion: - description: AMIVersion defines the desired AMI release version. If - no version number is supplied then the latest version for the Kubernetes - version will be used - minLength: 2 - type: string - availabilityZones: - description: AvailabilityZones is an array of availability zones instances - can run in - items: - type: string - type: array - awsLaunchTemplate: - description: AWSLaunchTemplate specifies the launch template to use - to create the managed node group. If AWSLaunchTemplate is specified, - certain node group configuraions outside of launch template are - prohibited (https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html). - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references - to security groups that should be applied to the instances. - These security groups would be set in addition to any security - groups defined at the cluster level or in the actuator. - items: - description: AWSResourceReference is a reference to a specific - AWS resource by ID or filters. Only one of ID or Filters may - be specified. Specifying more than one will result in a validation - error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to - identify a resource They are applied according to the - rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS - resource. - properties: - name: - description: Name of the filter. Filter names are - case-sensitive. - type: string - values: - description: Values includes one or more filter values. - Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - ami: - description: AMI is the reference to the AMI from which to create - the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look - up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - iamInstanceProfile: - description: The name or the Amazon Resource Name (ARN) of the - instance profile associated with the IAM role for the instance. - The instance profile contains the IAM role. - type: string - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating - system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look - up the image for this machine It will be ignored if an explicit - AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} - with the base OS and kubernetes version, respectively. The BaseOS - will be the value in ImageLookupBaseOS or ubuntu (the default), - and the kubernetes version as defined by the packages produced - by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the ubuntu - base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use - for image lookup if AMI is not set. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. - Example: m4.xlarge' - type: string - name: - description: The name of the launch template. - type: string - rootVolume: - description: RootVolume encapsulates the configuration options - for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by the - controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for - the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions are options for configuring AWSMachinePool - instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is - willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to - the instance. Valid values are empty string (do not use SSH - keys), a valid SSH key name, or omitted (use the default SSH - key name) - type: string - versionNumber: - description: 'VersionNumber is the version of the launch template - that is applied. Typically a new version is created when at - least one of the following happens: 1) A new launch template - spec is applied. 2) One or more parameters in an existing template - is changed. 3) A new AMI is discovered.' - format: int64 - type: integer - type: object - capacityType: - default: onDemand - description: CapacityType specifies the capacity type for the ASG - behind this pool - enum: - - onDemand - - spot - type: string - diskSize: - description: DiskSize specifies the root disk size - format: int32 - type: integer - eksNodegroupName: - description: EKSNodegroupName specifies the name of the nodegroup - in AWS corresponding to this MachinePool. If you don't specify a - name then a default name will be created based on the namespace - and name of the managed machine pool. - type: string - instanceType: - description: InstanceType specifies the AWS instance type - type: string - labels: - additionalProperties: - type: string - description: Labels specifies labels for the Kubernetes node objects - type: object - providerIDList: - description: ProviderIDList are the provider IDs of instances in the - autoscaling group corresponding to the nodegroup represented by - this machine pool - items: - type: string - type: array - remoteAccess: - description: RemoteAccess specifies how machines can be accessed remotely - properties: - public: - description: Public specifies whether to open port 22 to the public - internet - type: boolean - sourceSecurityGroups: - description: SourceSecurityGroups specifies which security groups - are allowed access - items: - type: string - type: array - sshKeyName: - description: SSHKeyName specifies which EC2 SSH key can be used - to access machines. If left empty, the key from the control - plane is used. - type: string - type: object - roleAdditionalPolicies: - description: RoleAdditionalPolicies allows you to attach additional - polices to the node group role. You must enable the EKSAllowAddRoles - feature flag to incorporate these into the created role. - items: - type: string - type: array - roleName: - description: RoleName specifies the name of IAM role for the node - group. If the role is pre-existing we will treat it as unmanaged - and not delete it on deletion. If the EKSEnableIAM feature flag - is true and no name is supplied then a role is created. - type: string - scaling: - description: Scaling specifies scaling for the ASG behind this pool - properties: - maxSize: - format: int32 - type: integer - minSize: - format: int32 - type: integer - type: object - subnetIDs: - description: SubnetIDs specifies which subnets are used for the auto - scaling group of this nodegroup - items: - type: string - type: array - taints: - description: Taints specifies the taints to apply to the nodes of - the machine pool - items: - description: Taint defines the specs for a Kubernetes taint. - properties: - effect: - description: Effect specifies the effect for the taint - enum: - - no-schedule - - no-execute - - prefer-no-schedule - type: string - key: - description: Key is the key of the taint - type: string - value: - description: Value is the value of the taint - type: string - required: - - effect - - key - - value - type: object - type: array - updateConfig: - description: UpdateConfig holds the optional config to control the - behaviour of the update to the nodegroup. - properties: - maxUnavailable: - description: MaxUnavailable is the maximum number of nodes unavailable - at once during a version update. Nodes will be updated in parallel. - The maximum number is 100. - maximum: 100 - minimum: 1 - type: integer - maxUnavailablePrecentage: - description: MaxUnavailablePercentage is the maximum percentage - of nodes unavailable during a version update. This percentage - of nodes will be updated in parallel, up to 100 nodes at once. - maximum: 100 - minimum: 1 - type: integer - type: object - type: object - status: - description: AWSManagedMachinePoolStatus defines the observed state of - AWSManagedMachinePool. - properties: - conditions: - description: Conditions defines current service state of the managed - machine pool - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a more verbose string suitable for logging and human consumption. - \n This field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the MachinePool's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of MachinePools can be added as - events to the MachinePool object and/or logged in the controller's - output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a succinct value suitable for machine interpretation. \n This field - should not be set for transitive errors that a controller faces - that are expected to be fixed automatically over time (like service - outages), but instead indicate that something is fundamentally wrong - with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of MachinePools can be added as - events to the MachinePool object and/or logged in the controller's - output." - type: string - launchTemplateID: - description: The ID of the launch template - type: string - launchTemplateVersion: - description: The version of the launch template - type: string - ready: - default: false - description: Ready denotes that the AWSManagedMachinePool nodegroup - has joined the cluster - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: MachinePool ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Number of replicas - jsonPath: .status.replicas - name: Replicas - type: integer - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSManagedMachinePool is the Schema for the awsmanagedmachinepools - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSManagedMachinePoolSpec defines the desired state of AWSManagedMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS - resources managed by the AWS provider, in addition to the ones added - by default. - type: object - amiType: - default: AL2_x86_64 - description: AMIType defines the AMI type - enum: - - AL2_x86_64 - - AL2_x86_64_GPU - - AL2_ARM_64 - - CUSTOM - type: string - amiVersion: - description: AMIVersion defines the desired AMI release version. If - no version number is supplied then the latest version for the Kubernetes - version will be used - minLength: 2 - type: string - availabilityZones: - description: AvailabilityZones is an array of availability zones instances - can run in - items: - type: string - type: array - awsLaunchTemplate: - description: AWSLaunchTemplate specifies the launch template to use - to create the managed node group. If AWSLaunchTemplate is specified, - certain node group configuraions outside of launch template are - prohibited (https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html). - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references - to security groups that should be applied to the instances. - These security groups would be set in addition to any security - groups defined at the cluster level or in the actuator. - items: - description: AWSResourceReference is a reference to a specific - AWS resource by ID or filters. Only one of ID or Filters may - be specified. Specifying more than one will result in a validation - error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to - identify a resource They are applied according to the - rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS - resource. - properties: - name: - description: Name of the filter. Filter names are - case-sensitive. - type: string - values: - description: Values includes one or more filter values. - Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - ami: - description: AMI is the reference to the AMI from which to create - the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look - up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - iamInstanceProfile: - description: The name or the Amazon Resource Name (ARN) of the - instance profile associated with the IAM role for the instance. - The instance profile contains the IAM role. - type: string - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating - system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look - up the image for this machine It will be ignored if an explicit - AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} - with the base OS and kubernetes version, respectively. The BaseOS - will be the value in ImageLookupBaseOS or ubuntu (the default), - and the kubernetes version as defined by the packages produced - by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, - or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* - will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* - for a Machine that is targeting kubernetes v1.18.0 and the ubuntu - base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use - for image lookup if AMI is not set. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. - Example: m4.xlarge' - type: string - name: - description: The name of the launch template. - type: string - rootVolume: - description: RootVolume encapsulates the configuration options - for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted - or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt - the volume. Can be either a KMS key ID or ARN. If Encrypted - is set and this is omitted, the default AWS key will be - used. The key must already exist and be accessible by the - controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the - disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. - Must be greater than the image snapshot size or 8 (whichever - is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for - the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, - etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions are options for configuring AWSMachinePool - instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is - willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to - the instance. Valid values are empty string (do not use SSH - keys), a valid SSH key name, or omitted (use the default SSH - key name) - type: string - versionNumber: - description: 'VersionNumber is the version of the launch template - that is applied. Typically a new version is created when at - least one of the following happens: 1) A new launch template - spec is applied. 2) One or more parameters in an existing template - is changed. 3) A new AMI is discovered.' - format: int64 - type: integer - type: object - capacityType: - default: onDemand - description: CapacityType specifies the capacity type for the ASG - behind this pool - enum: - - onDemand - - spot - type: string - diskSize: - description: DiskSize specifies the root disk size - format: int32 - type: integer - eksNodegroupName: - description: EKSNodegroupName specifies the name of the nodegroup - in AWS corresponding to this MachinePool. If you don't specify a - name then a default name will be created based on the namespace - and name of the managed machine pool. - type: string - instanceType: - description: InstanceType specifies the AWS instance type - type: string - labels: - additionalProperties: - type: string - description: Labels specifies labels for the Kubernetes node objects - type: object - providerIDList: - description: ProviderIDList are the provider IDs of instances in the - autoscaling group corresponding to the nodegroup represented by - this machine pool - items: - type: string - type: array - remoteAccess: - description: RemoteAccess specifies how machines can be accessed remotely - properties: - public: - description: Public specifies whether to open port 22 to the public - internet - type: boolean - sourceSecurityGroups: - description: SourceSecurityGroups specifies which security groups - are allowed access - items: - type: string - type: array - sshKeyName: - description: SSHKeyName specifies which EC2 SSH key can be used - to access machines. If left empty, the key from the control - plane is used. - type: string - type: object - roleAdditionalPolicies: - description: RoleAdditionalPolicies allows you to attach additional - polices to the node group role. You must enable the EKSAllowAddRoles - feature flag to incorporate these into the created role. - items: - type: string - type: array - roleName: - description: RoleName specifies the name of IAM role for the node - group. If the role is pre-existing we will treat it as unmanaged - and not delete it on deletion. If the EKSEnableIAM feature flag - is true and no name is supplied then a role is created. - type: string - scaling: - description: Scaling specifies scaling for the ASG behind this pool - properties: - maxSize: - format: int32 - type: integer - minSize: - format: int32 - type: integer - type: object - subnetIDs: - description: SubnetIDs specifies which subnets are used for the auto - scaling group of this nodegroup - items: - type: string - type: array - taints: - description: Taints specifies the taints to apply to the nodes of - the machine pool - items: - description: Taint defines the specs for a Kubernetes taint. - properties: - effect: - description: Effect specifies the effect for the taint - enum: - - no-schedule - - no-execute - - prefer-no-schedule - type: string - key: - description: Key is the key of the taint - type: string - value: - description: Value is the value of the taint - type: string - required: - - effect - - key - - value - type: object - type: array - updateConfig: - description: UpdateConfig holds the optional config to control the - behaviour of the update to the nodegroup. - properties: - maxUnavailable: - description: MaxUnavailable is the maximum number of nodes unavailable - at once during a version update. Nodes will be updated in parallel. - The maximum number is 100. - maximum: 100 - minimum: 1 - type: integer - maxUnavailablePercentage: - description: MaxUnavailablePercentage is the maximum percentage - of nodes unavailable during a version update. This percentage - of nodes will be updated in parallel, up to 100 nodes at once. - maximum: 100 - minimum: 1 - type: integer - type: object - type: object - status: - description: AWSManagedMachinePoolStatus defines the observed state of - AWSManagedMachinePool. - properties: - conditions: - description: Conditions defines current service state of the managed - machine pool - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a more verbose string suitable for logging and human consumption. - \n This field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the MachinePool's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of MachinePools can be added as - events to the MachinePool object and/or logged in the controller's - output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a succinct value suitable for machine interpretation. \n This field - should not be set for transitive errors that a controller faces - that are expected to be fixed automatically over time (like service - outages), but instead indicate that something is fundamentally wrong - with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of MachinePools can be added as - events to the MachinePool object and/or logged in the controller's - output." - type: string - launchTemplateID: - description: The ID of the launch template - type: string - launchTemplateVersion: - description: The version of the launch template - type: string - ready: - default: false - description: Ready denotes that the AWSManagedMachinePool nodegroup - has joined the cluster - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - required: - - ready - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: eksconfigs.bootstrap.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: bootstrap.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: EKSConfig - listKind: EKSConfigList - plural: eksconfigs - shortNames: - - eksc - singular: eksconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Bootstrap configuration is ready - jsonPath: .status.ready - name: Ready - type: string - - description: Name of Secret containing bootstrap data - jsonPath: .status.dataSecretName - name: DataSecretName - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: EKSConfig is the schema for the Amazon EKS Machine Bootstrap - Configuration API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: EKSConfigSpec defines the desired state of Amazon EKS Bootstrap - Configuration. - properties: - apiRetryAttempts: - description: APIRetryAttempts is the number of retry attempts for - AWS API call. - type: integer - containerRuntime: - description: ContainerRuntime specify the container runtime to use - when bootstrapping EKS. - type: string - dnsClusterIP: - description: DNSClusterIP overrides the IP address to use for DNS - queries within the cluster. - type: string - dockerConfigJson: - description: DockerConfigJson is used for the contents of the /etc/docker/daemon.json - file. Useful if you want a custom config differing from the default - one in the AMI. This is expected to be a json string. - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes the specified kubelet args into - the Amazon EKS machine bootstrap script - type: object - pauseContainer: - description: PauseContainer allows customization of the pause container - to use. - properties: - accountNumber: - description: AccountNumber is the AWS account number to pull the - pause container from. - type: string - version: - description: Version is the tag of the pause container to use. - type: string - required: - - accountNumber - - version - type: object - serviceIPV6Cidr: - description: ServiceIPV6Cidr is the ipv6 cidr range of the cluster. - If this is specified then the ip family will be set to ipv6. - type: string - useMaxPods: - description: UseMaxPods sets --max-pods for the kubelet when true. - type: boolean - type: object - status: - description: EKSConfigStatus defines the observed state of the Amazon - EKS Bootstrap Configuration. - properties: - conditions: - description: Conditions defines current service state of the EKSConfig. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - dataSecretName: - description: DataSecretName is the name of the secret that stores - the bootstrap data script. - type: string - failureMessage: - description: FailureMessage will be set on non-retryable errors - type: string - failureReason: - description: FailureReason will be set on non-retryable errors - type: string - observedGeneration: - description: ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - ready: - description: Ready indicates the BootstrapData secret is ready to - be consumed - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Bootstrap configuration is ready - jsonPath: .status.ready - name: Ready - type: string - - description: Name of Secret containing bootstrap data - jsonPath: .status.dataSecretName - name: DataSecretName - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: EKSConfig is the schema for the Amazon EKS Machine Bootstrap - Configuration API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: EKSConfigSpec defines the desired state of Amazon EKS Bootstrap - Configuration. - properties: - apiRetryAttempts: - description: APIRetryAttempts is the number of retry attempts for - AWS API call. - type: integer - boostrapCommandOverride: - description: BootstrapCommandOverride allows you to override the bootstrap - command to use for EKS nodes. - type: string - containerRuntime: - description: ContainerRuntime specify the container runtime to use - when bootstrapping EKS. - type: string - diskSetup: - description: DiskSetup specifies options for the creation of partition - tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to - setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the - command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be - used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite - any existing filesystem. If true, any pre-existing file - system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. - The valid options are: "auto|any", "auto", "any", "none", - and , where NUM is the actual partition number.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to - setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is - true, a single partition will be created for the entire - device. When layout is false, it means don't partition - or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks - and create the partition if a partition or filesystem - is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition - table. The following are supported: ''mbr'': default and - setups a MS-DOS partition table ''gpt'': setups a GPT - partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - dnsClusterIP: - description: DNSClusterIP overrides the IP address to use for DNS - queries within the cluster. - type: string - dockerConfigJson: - description: DockerConfigJson is used for the contents of the /etc/docker/daemon.json - file. Useful if you want a custom config differing from the default - one in the AMI. This is expected to be a json string. - type: string - files: - description: Files specifies extra files to be passed to user_data - upon creation. - items: - description: File defines the input for generating write_files in - cloud-init. - properties: - append: - description: Append specifies whether to append Content to existing - file if Path exists. - type: boolean - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to - populate the file. - properties: - secret: - description: Secret represents a secret that should populate - this file. - properties: - key: - description: Key is the key in the secret's data map - for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. - "root:root". - type: string - path: - description: Path specifies the full path on disk where to store - the file. - type: string - permissions: - description: Permissions specifies the permissions to assign - to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes the specified kubelet args into - the Amazon EKS machine bootstrap script - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - pauseContainer: - description: PauseContainer allows customization of the pause container - to use. - properties: - accountNumber: - description: AccountNumber is the AWS account number to pull the - pause container from. - type: string - version: - description: Version is the tag of the pause container to use. - type: string - required: - - accountNumber - - version - type: object - postBootstrapCommands: - description: PostBootstrapCommands specifies extra commands to run - after bootstrapping nodes to the cluster - items: - type: string - type: array - preBootstrapCommands: - description: PreBootstrapCommands specifies extra commands to run - before bootstrapping nodes to the cluster - items: - type: string - type: array - serviceIPV6Cidr: - description: ServiceIPV6Cidr is the ipv6 cidr range of the cluster. - If this is specified then the ip family will be set to ipv6. - type: string - useMaxPods: - description: UseMaxPods sets --max-pods for the kubelet when true. - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the - user - type: string - homeDir: - description: HomeDir specifies the home directory to use for - the user - type: string - inactive: - description: Inactive specifies whether to mark the user as - inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should - be disabled - type: boolean - name: - description: Name specifies the username - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of passwd to - populate the passwd. - properties: - secret: - description: Secret represents a secret that should populate - this password. - properties: - key: - description: Key is the key in the secret's data map - for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary group for the - user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized - keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - type: object - status: - description: EKSConfigStatus defines the observed state of the Amazon - EKS Bootstrap Configuration. - properties: - conditions: - description: Conditions defines current service state of the EKSConfig. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - dataSecretName: - description: DataSecretName is the name of the secret that stores - the bootstrap data script. - type: string - failureMessage: - description: FailureMessage will be set on non-retryable errors - type: string - failureReason: - description: FailureReason will be set on non-retryable errors - type: string - observedGeneration: - description: ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - ready: - description: Ready indicates the BootstrapData secret is ready to - be consumed - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: eksconfigtemplates.bootstrap.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: bootstrap.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: EKSConfigTemplate - listKind: EKSConfigTemplateList - plural: eksconfigtemplates - shortNames: - - eksct - singular: eksconfigtemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: EKSConfigTemplate is the Amazon EKS Bootstrap Configuration Template - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: EKSConfigTemplateSpec defines the desired state of templated - EKSConfig Amazon EKS Bootstrap Configuration resources. - properties: - template: - description: EKSConfigTemplateResource defines the Template structure. - properties: - spec: - description: EKSConfigSpec defines the desired state of Amazon - EKS Bootstrap Configuration. - properties: - apiRetryAttempts: - description: APIRetryAttempts is the number of retry attempts - for AWS API call. - type: integer - containerRuntime: - description: ContainerRuntime specify the container runtime - to use when bootstrapping EKS. - type: string - dnsClusterIP: - description: DNSClusterIP overrides the IP address to use - for DNS queries within the cluster. - type: string - dockerConfigJson: - description: DockerConfigJson is used for the contents of - the /etc/docker/daemon.json file. Useful if you want a custom - config differing from the default one in the AMI. This is - expected to be a json string. - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes the specified kubelet - args into the Amazon EKS machine bootstrap script - type: object - pauseContainer: - description: PauseContainer allows customization of the pause - container to use. - properties: - accountNumber: - description: AccountNumber is the AWS account number to - pull the pause container from. - type: string - version: - description: Version is the tag of the pause container - to use. - type: string - required: - - accountNumber - - version - type: object - serviceIPV6Cidr: - description: ServiceIPV6Cidr is the ipv6 cidr range of the - cluster. If this is specified then the ip family will be - set to ipv6. - type: string - useMaxPods: - description: UseMaxPods sets --max-pods for the kubelet when - true. - type: boolean - type: object - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1beta2 - schema: - openAPIV3Schema: - description: EKSConfigTemplate is the Amazon EKS Bootstrap Configuration Template - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: EKSConfigTemplateSpec defines the desired state of templated - EKSConfig Amazon EKS Bootstrap Configuration resources. - properties: - template: - description: EKSConfigTemplateResource defines the Template structure. - properties: - spec: - description: EKSConfigSpec defines the desired state of Amazon - EKS Bootstrap Configuration. - properties: - apiRetryAttempts: - description: APIRetryAttempts is the number of retry attempts - for AWS API call. - type: integer - boostrapCommandOverride: - description: BootstrapCommandOverride allows you to override - the bootstrap command to use for EKS nodes. - type: string - containerRuntime: - description: ContainerRuntime specify the container runtime - to use when bootstrapping EKS. - type: string - diskSetup: - description: DiskSetup specifies options for the creation - of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems - to setup. - items: - description: Filesystem defines the file systems to - be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to - add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system - type. - type: string - label: - description: Label specifies the file system label - to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to - overwrite any existing filesystem. If true, any - pre-existing file system will be destroyed. Use - with Caution. - type: boolean - partition: - description: 'Partition specifies the partition - to use. The valid options are: "auto|any", "auto", - "any", "none", and , where NUM is the actual - partition number.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions - to setup. - items: - description: Partition defines how to create and layout - a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. - If it is true, a single partition will be created - for the entire device. When layout is false, it - means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip - checks and create the partition if a partition - or filesystem is found on the device. Use with - caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition - table. The following are supported: ''mbr'': default - and setups a MS-DOS partition table ''gpt'': setups - a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - dnsClusterIP: - description: DNSClusterIP overrides the IP address to use - for DNS queries within the cluster. - type: string - dockerConfigJson: - description: DockerConfigJson is used for the contents of - the /etc/docker/daemon.json file. Useful if you want a custom - config differing from the default one in the AMI. This is - expected to be a json string. - type: string - files: - description: Files specifies extra files to be passed to user_data - upon creation. - items: - description: File defines the input for generating write_files - in cloud-init. - properties: - append: - description: Append specifies whether to append Content - to existing file if Path exists. - type: boolean - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content - to populate the file. - properties: - secret: - description: Secret represents a secret that should - populate this file. - properties: - key: - description: Key is the key in the secret's - data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the - file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, - e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where - to store the file. - type: string - permissions: - description: Permissions specifies the permissions to - assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes the specified kubelet - args into the Amazon EKS machine bootstrap script - type: object - mounts: - description: Mounts specifies a list of mount points to be - setup. - items: - description: MountPoints defines input for generated mounts - in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - pauseContainer: - description: PauseContainer allows customization of the pause - container to use. - properties: - accountNumber: - description: AccountNumber is the AWS account number to - pull the pause container from. - type: string - version: - description: Version is the tag of the pause container - to use. - type: string - required: - - accountNumber - - version - type: object - postBootstrapCommands: - description: PostBootstrapCommands specifies extra commands - to run after bootstrapping nodes to the cluster - items: - type: string - type: array - preBootstrapCommands: - description: PreBootstrapCommands specifies extra commands - to run before bootstrapping nodes to the cluster - items: - type: string - type: array - serviceIPV6Cidr: - description: ServiceIPV6Cidr is the ipv6 cidr range of the - cluster. If this is specified then the ip family will be - set to ipv6. - type: string - useMaxPods: - description: UseMaxPods sets --max-pods for the kubelet when - true. - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user - in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the - user - type: string - groups: - description: Groups specifies the additional groups - for the user - type: string - homeDir: - description: HomeDir specifies the home directory to - use for the user - type: string - inactive: - description: Inactive specifies whether to mark the - user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login - should be disabled - type: boolean - name: - description: Name specifies the username - type: string - passwd: - description: Passwd specifies a hashed password for - the user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of passwd - to populate the passwd. - properties: - secret: - description: Secret represents a secret that should - populate this password. - properties: - key: - description: Key is the key in the secret's - data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's - namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary group - for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh - authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - type: object - type: object - required: - - template - type: object - type: object - served: true - storage: true ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - annotations: - ${AWS_CONTROLLER_IAM_ROLE/#arn/eks.amazonaws.com/role-arn: arn} - labels: - cluster.x-k8s.io/provider: infrastructure-aws - control-plane: controller-manager - name: capa-controller-manager - namespace: capa-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-leader-elect-role - namespace: capa-system -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-manager-role -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - bootstrap.cluster.x-k8s.io - resources: - - eksconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - bootstrap.cluster.x-k8s.io - resources: - - eksconfigs/status - verbs: - - get - - patch - - update -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - machinepools - - machines - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - - machinepools/status - verbs: - - get - - list - - patch - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/status - verbs: - - get - - list - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - awsmanagedcontrolplanes - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - awsmanagedcontrolplanes - - awsmanagedcontrolplanes/status - verbs: - - get - - list - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - awsmanagedcontrolplanes/status - verbs: - - get - - patch - - update -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsclustercontrolleridentities - verbs: - - create - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsclustercontrolleridentities - - awsclusterroleidentities - - awsclusterstaticidentities - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsclusterroleidentities - - awsclusterstaticidentities - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsfargateprofiles - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsfargateprofiles/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachinepools - - awsmachinepools/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachinepools/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachines - - awsmachines/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachines/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedclusters - - awsmanagedclusters/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedmachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedmachinepools - - awsmanagedmachinepools/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedmachinepools/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-leader-elect-rolebinding - namespace: capa-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capa-leader-elect-role -subjects: -- kind: ServiceAccount - name: capa-controller-manager - namespace: capa-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capa-manager-role -subjects: -- kind: ServiceAccount - name: capa-controller-manager - namespace: capa-system ---- -apiVersion: v1 -data: - credentials: ${AWS_B64ENCODED_CREDENTIALS} -kind: Secret -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-manager-bootstrap-credentials - namespace: capa-system -type: Opaque ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-webhook-service - namespace: capa-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-aws ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - control-plane: capa-controller-manager - name: capa-controller-manager - namespace: capa-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-aws - control-plane: capa-controller-manager - template: - metadata: - annotations: - iam.amazonaws.com/role: ${AWS_CONTROLLER_IAM_ROLE:=""} - labels: - cluster.x-k8s.io/provider: infrastructure-aws - control-plane: capa-controller-manager - spec: - affinity: - nodeAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: ${K8S_CP_LABEL:=node-role.kubernetes.io/control-plane} - operator: Exists - weight: 10 - - preference: - matchExpressions: - - key: node-role.kubernetes.io/master - operator: Exists - weight: 10 - containers: - - args: - - --leader-elect - - --feature-gates=EKS=${CAPA_EKS:=true},EKSEnableIAM=${CAPA_EKS_IAM:=false},EKSAllowAddRoles=${CAPA_EKS_ADD_ROLES:=false},EKSFargate=${EXP_EKS_FARGATE:=false},MachinePool=${EXP_MACHINE_POOL:=false},EventBridgeInstanceState=${EVENT_BRIDGE_INSTANCE_STATE:=false},AutoControllerIdentityCreator=${AUTO_CONTROLLER_IDENTITY_CREATOR:=true},BootstrapFormatIgnition=${EXP_BOOTSTRAP_FORMAT_IGNITION:=false},ExternalResourceGC=${EXP_EXTERNAL_RESOURCE_GC:=false} - - --v=${CAPA_LOGLEVEL:=0} - - --metrics-bind-addr=127.0.0.1:8080 - env: - - name: AWS_SHARED_CREDENTIALS_FILE - value: /home/.aws/credentials - image: registry.k8s.io/cluster-api-aws/cluster-api-aws-controller:v2.0.2 - imagePullPolicy: IfNotPresent - livenessProbe: - failureThreshold: 3 - httpGet: - path: /healthz - port: healthz - periodSeconds: 10 - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - - mountPath: /home/.aws - name: credentials - securityContext: - fsGroup: 1000 - serviceAccountName: capa-controller-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: capa-webhook-service-cert - - name: credentials - secret: - secretName: capa-manager-bootstrap-credentials ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-serving-cert - namespace: capa-system -spec: - dnsNames: - - capa-webhook-service.capa-system.svc - - capa-webhook-service.capa-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capa-selfsigned-issuer - secretName: capa-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-selfsigned-issuer - namespace: capa-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awscluster - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awscluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsclustercontrolleridentity - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsclustercontrolleridentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclustercontrolleridentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsclusterroleidentity - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsclusterroleidentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusterroleidentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsclusterstaticidentity - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsclusterstaticidentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusterstaticidentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsmachine - failurePolicy: Fail - name: mutation.awsmachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmachines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsfargateprofile - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsfargateprofile.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsfargateprofiles - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsmachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsmanagedmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsmanagedmachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmanagedmachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-bootstrap-cluster-x-k8s-io-v1beta2-eksconfig - failurePolicy: Fail - matchPolicy: Equivalent - name: default.eksconfigs.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - eksconfig - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-bootstrap-cluster-x-k8s-io-v1beta2-eksconfigtemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: default.eksconfigtemplates.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - eksconfigtemplate - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-controlplane-cluster-x-k8s-io-v1beta2-awsmanagedcontrolplane - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsmanagedcontrolplanes.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmanagedcontrolplanes - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awscluster - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awscluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsclustercontrolleridentity - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsclustercontrolleridentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclustercontrolleridentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsclusterroleidentity - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsclusterroleidentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusterroleidentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsclusterstaticidentity - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsclusterstaticidentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusterstaticidentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsmachine - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsmachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmachines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsfargateprofile - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsfargateprofile.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsfargateprofiles - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsmachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsmanagedmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsmanagedmachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmanagedmachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-bootstrap-cluster-x-k8s-io-v1beta2-eksconfig - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.eksconfigs.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - eksconfig - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-bootstrap-cluster-x-k8s-io-v1beta2-eksconfigtemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.eksconfigtemplates.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - eksconfigtemplate - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-controlplane-cluster-x-k8s-io-v1beta2-awsmanagedcontrolplane - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsmanagedcontrolplanes.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmanagedcontrolplanes - sideEffects: None diff --git a/packages/cluster-api-provider-aws/bundle/config/upstream/metadata.yaml b/packages/cluster-api-provider-aws/bundle/config/upstream/metadata.yaml deleted file mode 100644 index d3cd7cccb9..0000000000 --- a/packages/cluster-api-provider-aws/bundle/config/upstream/metadata.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# maps release series of major.minor to cluster-api contract version -# the contract version may change between minor or major versions, but *not* -# between patch versions. -# -# update this file only when a new major or minor version is released -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -releaseSeries: - - major: 0 - minor: 4 - contract: v1alpha2 - - major: 0 - minor: 5 - contract: v1alpha3 - - major: 0 - minor: 6 - contract: v1alpha3 - - major: 0 - minor: 7 - contract: v1alpha4 - - major: 1 - minor: 0 - contract: v1beta1 - - major: 1 - minor: 1 - contract: v1beta1 - - major: 1 - minor: 2 - contract: v1beta1 - - major: 2 - minor: 0 - contract: v1beta1 diff --git a/packages/cluster-api-provider-aws/bundle/config/values.yaml b/packages/cluster-api-provider-aws/bundle/config/values.yaml deleted file mode 100644 index fd6fd6c148..0000000000 --- a/packages/cluster-api-provider-aws/bundle/config/values.yaml +++ /dev/null @@ -1,10 +0,0 @@ -#@data/values-schema ---- - -capaControllerManager: - #@schema/desc "Configures the HTTP_PROXY environment variable on capa-controller-manager." - httpProxy: "" - #@schema/desc "Configures the HTTPS_PROXY environment variable on capa-controller-manager." - httpsProxy: "" - #@schema/desc "Configures the NO_PROXY environment variable on capa-controller-manager." - noProxy: "" diff --git a/packages/cluster-api-provider-aws/metadata.yaml b/packages/cluster-api-provider-aws/metadata.yaml deleted file mode 100644 index beb2be4573..0000000000 --- a/packages/cluster-api-provider-aws/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: cluster-api-provider-aws.tanzu.vmware.com - namespace: cluster-api-provider-aws -spec: - displayName: "cluster-api-provider-aws" - longDescription: "Cluster API Provider AWS provides consistent deployment and day 2 operations of 'self-managed' and EKS Kubernetes clusters on AWS" - shortDescription: "Cluster management for AWS" - providerName: VMware - maintainers: - - name: "" - categories: - - "cluster management" diff --git a/packages/cluster-api-provider-aws/package.yaml b/packages/cluster-api-provider-aws/package.yaml deleted file mode 100644 index 5dd50173a6..0000000000 --- a/packages/cluster-api-provider-aws/package.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: cluster-api-provider-aws.tanzu.vmware.com - namespace: cluster-api-provider-aws -spec: - refName: cluster-api-provider-aws.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} - valuesSchema: - openAPIv3: - type: object - additionalProperties: false - properties: - capaControllerManager: - type: object - additionalProperties: false - properties: - httpProxy: - type: string - description: Configures the HTTP_PROXY environment variable on capa-controller-manager. - default: "" - httpsProxy: - type: string - description: Configures the HTTPS_PROXY environment variable on capa-controller-manager. - default: "" - noProxy: - type: string - description: Configures the NO_PROXY environment variable on capa-controller-manager. - default: "" diff --git a/packages/cluster-api-provider-aws/test/go.mod b/packages/cluster-api-provider-aws/test/go.mod deleted file mode 100644 index de18ca3ca3..0000000000 --- a/packages/cluster-api-provider-aws/test/go.mod +++ /dev/null @@ -1,25 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/packages/cluster-api-provider-aws/test - -go 1.18 - -require ( - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - github.com/vmware-tanzu/tanzu-framework/test/pkg v0.0.0-00010101000000-000000000000 -) - -require ( - github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect -) - -replace github.com/vmware-tanzu/tanzu-framework/test/pkg => ../../../test/pkg diff --git a/packages/cluster-api-provider-aws/test/go.sum b/packages/cluster-api-provider-aws/test/go.sum deleted file mode 100644 index 2141875765..0000000000 --- a/packages/cluster-api-provider-aws/test/go.sum +++ /dev/null @@ -1,116 +0,0 @@ -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/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 h1:aRd8M7HJVZOqn/vhOzrGcQH0lNAMkqMn+pXUYkatmcA= -github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -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/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= -github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -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/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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/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.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e h1:3i3ny04XV6HbZ2N1oIBw1UBYATHAOpo4tfTF83JM3Z0= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/packages/cluster-api-provider-aws/test/unit/overlay_test.go b/packages/cluster-api-provider-aws/test/unit/overlay_test.go deleted file mode 100644 index a08c4823a1..0000000000 --- a/packages/cluster-api-provider-aws/test/unit/overlay_test.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -const ( - packageRoot = "../.." -) - -var _ = Describe("Cluster-API Provider AWS Ytt Templating", func() { - var paths []string - var values string - - BeforeEach(func() { - paths = []string{ - filepath.Join(packageRoot, "bundle", "config"), - } - }) - - Context("when the httpProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capaControllerManager: - httpProxy: http://127.0.0.1:3124` - }) - It("adds HTTP_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capa-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='AWS_SHARED_CREDENTIALS_FILE')].value", - "/home/.aws/credentials", - )) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')].value", - "http://127.0.0.1:3124", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')]")) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')]")) - }) - }) - - Context("when the httpsProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capaControllerManager: - httpsProxy: https://127.0.0.1:3124` - }) - It("adds HTTPS_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capa-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='AWS_SHARED_CREDENTIALS_FILE')].value", - "/home/.aws/credentials", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')]")) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')].value", - "https://127.0.0.1:3124", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')]")) - }) - }) - - Context("when the noProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capaControllerManager: - noProxy: 10.0.0.0/16,127.0.0.1` - }) - It("adds NO_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capa-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='AWS_SHARED_CREDENTIALS_FILE')].value", - "/home/.aws/credentials", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')]")) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')]")) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')].value", - "10.0.0.0/16,127.0.0.1", - )) - }) - }) -}) diff --git a/packages/cluster-api-provider-aws/test/unit/unit_suite_test.go b/packages/cluster-api-provider-aws/test/unit/unit_suite_test.go deleted file mode 100644 index 213983322c..0000000000 --- a/packages/cluster-api-provider-aws/test/unit/unit_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestUnit(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Cluster API Provider AWS Unit Suite") -} diff --git a/packages/cluster-api-provider-aws/vendir.lock.yml b/packages/cluster-api-provider-aws/vendir.lock.yml deleted file mode 100644 index d3968b63a8..0000000000 --- a/packages/cluster-api-provider-aws/vendir.lock.yml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - githubRelease: - url: https://api.github.com/repos/kubernetes-sigs/cluster-api-provider-aws/releases/84705542 - path: . - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/cluster-api-provider-aws/vendir.yml b/packages/cluster-api-provider-aws/vendir.yml deleted file mode 100644 index 85af237775..0000000000 --- a/packages/cluster-api-provider-aws/vendir.yml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: . - githubRelease: - slug: kubernetes-sigs/cluster-api-provider-aws - tag: v2.0.2 - disableAutoChecksumValidation: true - includePaths: - - infrastructure-components.yaml - - metadata.yaml diff --git a/packages/cluster-api-provider-azure/Makefile b/packages/cluster-api-provider-azure/Makefile deleted file mode 100644 index 047b729714..0000000000 --- a/packages/cluster-api-provider-azure/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/cluster-api-provider-azure/README.md b/packages/cluster-api-provider-azure/README.md deleted file mode 100644 index 70c5feb861..0000000000 --- a/packages/cluster-api-provider-azure/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# cluster-api-provider-azure Package - -This package provides the Cluster API implementation for Microsoft Azure using -[cluster-api-provider-azure](https://github.com/kubernetes-sigs/cluster-api-provider-azure). - -## Components - -* capz-controller-manager - -## Configuration - -The following configuration values can be set to customize the installation. - -| Value | Required/Optional | Description | -|------------------------------------|-------------------|-----------------------------------------------------------------------------| -| `capzControllerManager.httpProxy` | Optional | Configures the HTTP_PROXY environment variable on capz-controller-manager. | -| `capzControllerManager.httpsProxy` | Optional | Configures the HTTPS_PROXY environment variable on capz-controller-manager. | -| `capzControllerManager.noProxy` | Optional | Configures the NO_PROXY environment variable on capz-controller-manager. | - -## Usage Example - -To learn more about cluster-api-provider-azure visit -. diff --git a/packages/cluster-api-provider-azure/bundle/config/overlay/add-pod-security-namespace-labels.yaml b/packages/cluster-api-provider-azure/bundle/config/overlay/add-pod-security-namespace-labels.yaml deleted file mode 100644 index fb05ec2a77..0000000000 --- a/packages/cluster-api-provider-azure/bundle/config/overlay/add-pod-security-namespace-labels.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Namespace", "metadata": {"name": "capz-system"}}) ---- -metadata: - labels: - #@overlay/match missing_ok=True - pod-security.kubernetes.io/enforce: privileged - #@overlay/match missing_ok=True - pod-security.kubernetes.io/warn: privileged - #@overlay/match missing_ok=True - pod-security.kubernetes.io/audit: privileged diff --git a/packages/cluster-api-provider-azure/bundle/config/overlay/add-proxy-environment-variables.yaml b/packages/cluster-api-provider-azure/bundle/config/overlay/add-proxy-environment-variables.yaml deleted file mode 100644 index 288e2d6472..0000000000 --- a/packages/cluster-api-provider-azure/bundle/config/overlay/add-proxy-environment-variables.yaml +++ /dev/null @@ -1,24 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "capz-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - env: - #@ if data.values.capzControllerManager.httpProxy != "": - - name: "HTTP_PROXY" - value: #@ data.values.capzControllerManager.httpProxy - #@ end - #@ if data.values.capzControllerManager.httpsProxy != "": - - name: "HTTPS_PROXY" - value: #@ data.values.capzControllerManager.httpsProxy - #@ end - #@ if data.values.capzControllerManager.noProxy != "": - - name: "NO_PROXY" - value: #@ data.values.capzControllerManager.noProxy - #@ end - diff --git a/packages/cluster-api-provider-azure/bundle/config/upstream/infrastructure-components.yaml b/packages/cluster-api-provider-azure/bundle/config/upstream/infrastructure-components.yaml deleted file mode 100644 index 7d514e453e..0000000000 --- a/packages/cluster-api-provider-azure/bundle/config/upstream/infrastructure-components.yaml +++ /dev/null @@ -1,11866 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azureclusteridentities.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureClusterIdentity - listKind: AzureClusterIdentityList - plural: azureclusteridentities - singular: azureclusteridentity - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureClusterIdentity is the Schema for the azureclustersidentities - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterIdentitySpec defines the parameters that are - used to create an AzureIdentity. - properties: - allowedNamespaces: - description: "AllowedNamespaces is an array of namespaces that AzureClusters - can use this Identity from. \n An empty list (default) indicates - that AzureClusters can use this Identity from any namespace. This - field is intentionally not a pointer because the nil behavior (no - namespaces) is undesirable here." - items: - type: string - type: array - clientID: - description: Both User Assigned MSI and SP can use this field. - type: string - clientSecret: - description: ClientSecret is a secret reference which should contain - either a Service Principal password or certificate secret. - properties: - name: - description: name is unique within a namespace to reference a - secret resource. - type: string - namespace: - description: namespace defines the space within which the secret - name must be unique. - type: string - type: object - x-kubernetes-map-type: atomic - resourceID: - description: User assigned MSI resource id. - type: string - tenantID: - description: Service principal primary tenant id. - type: string - type: - description: UserAssignedMSI or Service Principal - enum: - - ServicePrincipal - - UserAssignedMSI - type: string - required: - - clientID - - tenantID - - type - type: object - status: - description: AzureClusterIdentityStatus defines the observed state of - AzureClusterIdentity. - properties: - conditions: - description: Conditions defines current service state of the AzureClusterIdentity. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureClusterIdentity is the Schema for the azureclustersidentities - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterIdentitySpec defines the parameters that are - used to create an AzureIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify the namespaces - the clusters are allowed to use the identity from. Namespaces can - be selected either using an array of namespaces or with label selector. - An empty allowedNamespaces object indicates that AzureClusters can - use this identity from any namespace. If this object is nil, no - namespaces will be allowed (default behaviour, if this field is - not provided) A namespace should be either in the NamespaceList - or match with Selector to use the identity. - nullable: true - properties: - list: - description: A nil or empty list indicates that AzureCluster cannot - use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: "Selector is a selector of namespaces that AzureCluster - can use this Identity from. This is a standard Kubernetes LabelSelector, - a label query over a set of resources. The result of matchLabels - and matchExpressions are ANDed. \n A nil or empty selector indicates - that AzureCluster cannot use this AzureClusterIdentity from - any namespace." - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - clientID: - description: Both User Assigned MSI and SP can use this field. - type: string - clientSecret: - description: ClientSecret is a secret reference which should contain - either a Service Principal password or certificate secret. - properties: - name: - description: name is unique within a namespace to reference a - secret resource. - type: string - namespace: - description: namespace defines the space within which the secret - name must be unique. - type: string - type: object - x-kubernetes-map-type: atomic - resourceID: - description: User assigned MSI resource id. - type: string - tenantID: - description: Service principal primary tenant id. - type: string - type: - description: UserAssignedMSI or Service Principal - enum: - - ServicePrincipal - - UserAssignedMSI - type: string - required: - - clientID - - tenantID - - type - type: object - status: - description: AzureClusterIdentityStatus defines the observed state of - AzureClusterIdentity. - properties: - conditions: - description: Conditions defines current service state of the AzureClusterIdentity. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureClusterIdentity is the Schema for the azureclustersidentities - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterIdentitySpec defines the parameters that are - used to create an AzureIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify the namespaces - the clusters are allowed to use the identity from. Namespaces can - be selected either using an array of namespaces or with label selector. - An empty allowedNamespaces object indicates that AzureClusters can - use this identity from any namespace. If this object is nil, no - namespaces will be allowed (default behaviour, if this field is - not provided) A namespace should be either in the NamespaceList - or match with Selector to use the identity. - nullable: true - properties: - list: - description: A nil or empty list indicates that AzureCluster cannot - use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: "Selector is a selector of namespaces that AzureCluster - can use this Identity from. This is a standard Kubernetes LabelSelector, - a label query over a set of resources. The result of matchLabels - and matchExpressions are ANDed. \n A nil or empty selector indicates - that AzureCluster cannot use this AzureClusterIdentity from - any namespace." - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - clientID: - description: ClientID is the service principal client ID. Both User - Assigned MSI and SP can use this field. - type: string - clientSecret: - description: ClientSecret is a secret reference which should contain - either a Service Principal password or certificate secret. - properties: - name: - description: name is unique within a namespace to reference a - secret resource. - type: string - namespace: - description: namespace defines the space within which the secret - name must be unique. - type: string - type: object - x-kubernetes-map-type: atomic - resourceID: - description: ResourceID is the Azure resource ID for the User Assigned - MSI resource. Only applicable when type is UserAssignedMSI. - type: string - tenantID: - description: TenantID is the service principal primary tenant id. - type: string - type: - description: Type is the type of Azure Identity used. ServicePrincipal, - ServicePrincipalCertificate, UserAssignedMSI or ManualServicePrincipal. - enum: - - ServicePrincipal - - UserAssignedMSI - - ManualServicePrincipal - - ServicePrincipalCertificate - type: string - required: - - clientID - - tenantID - - type - type: object - status: - description: AzureClusterIdentityStatus defines the observed state of - AzureClusterIdentity. - properties: - conditions: - description: Conditions defines current service state of the AzureClusterIdentity. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azureclusters.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureCluster - listKind: AzureClusterList - plural: azureclusters - singular: azurecluster - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this AzureCluster belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - jsonPath: .status.ready - name: Ready - type: boolean - - jsonPath: .spec.resourceGroup - name: Resource Group - priority: 1 - type: string - - jsonPath: .spec.subscriptionID - name: SubscriptionID - priority: 1 - type: string - - jsonPath: .spec.location - name: Location - priority: 1 - type: string - - description: Control Plane Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureCluster is the Schema for the azureclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterSpec defines the desired state of AzureCluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure - resources managed by the Azure provider, in addition to the ones - added by default. - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to a AzureIdentity to be used - when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - location: - type: string - networkSpec: - description: NetworkSpec encapsulates all things related to Azure - network. - properties: - apiServerLB: - description: APIServerLB is the configuration for the control-plane - load balancer. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend - IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create - an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - id: - type: string - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - subnets: - description: Subnets is the configuration for the control-plane - subnet and the node subnet. - items: - description: SubnetSpec configures an Azure subnet. - properties: - cidrBlock: - description: 'CidrBlock is the CIDR block to be used when - the provider creates a managed Vnet. Deprecated: Use CIDRBlocks - instead' - type: string - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, - specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID defines a unique identifier to reference - this resource. - type: string - internalLBIPAddress: - description: 'InternalLBIPAddress is the IP address that - will be used as the internal LB private IP. For the control - plane subnet only. Deprecated: Use LoadBalancer private - IP instead' - type: string - name: - description: Name defines a name for the subnet resource. - type: string - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - type: string - routeTable: - description: RouteTable defines the route table that should - be attached to this subnet. - properties: - id: - type: string - name: - type: string - type: object - securityGroup: - description: SecurityGroup defines the NSG (network security - group) that should be attached to this subnet. - properties: - id: - type: string - ingressRule: - description: IngressRules is a slice of Azure ingress - rules for security groups. - items: - description: IngressRule defines an Azure ingress - rule for security groups. - properties: - description: - type: string - destination: - description: Destination - The destination address - prefix. CIDR or destination IP range. Asterix - '*' can also be used to match all source IPs. - Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' - and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts - The destination - port or range. Integer or range between 0 and - 65535. Asterix '*' can also be used to match - all ports. - type: string - name: - type: string - priority: - description: Priority - A number between 100 and - 4096. Each rule should have a unique value for - priority. Rules are processed in priority order, - with lower numbers processed before higher numbers. - Once traffic matches a rule, processing stops. - format: int32 - type: integer - protocol: - description: SecurityGroupProtocol defines the - protocol type for a security group rule. - type: string - source: - description: Source - The CIDR or source IP range. - Asterix '*' can also be used to match all source - IPs. Default tags such as 'VirtualNetwork', - 'AzureLoadBalancer' and 'Internet' can also - be used. If this is an ingress rule, specifies - where network traffic originates from. - type: string - sourcePorts: - description: SourcePorts - The source port or - range. Integer or range between 0 and 65535. - Asterix '*' can also be used to match all ports. - type: string - required: - - description - - name - - protocol - type: object - type: array - name: - type: string - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - type: object - required: - - name - type: object - type: array - vnet: - description: Vnet is the configuration for the Azure virtual network. - properties: - cidrBlock: - description: 'CidrBlock is the CIDR block to be used when - the provider creates a managed virtual network. Deprecated: - Use CIDRBlocks instead' - type: string - cidrBlocks: - description: CIDRBlocks defines the virtual network's address - space, specified as one or more address prefixes in CIDR - notation. - items: - type: string - type: array - id: - description: ID is the identifier of the virtual network this - provider should use to create resources. - type: string - name: - description: Name defines a name for the virtual network resource. - type: string - resourceGroup: - description: ResourceGroup is the name of the resource group - of the existing virtual network or the resource group where - a managed virtual network should be created. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - required: - - name - type: object - type: object - resourceGroup: - type: string - subscriptionID: - type: string - required: - - location - type: object - status: - description: AzureClusterStatus defines the observed state of AzureCluster. - properties: - conditions: - description: Conditions defines current service state of the AzureCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: 'FailureDomains specifies the list of unique failure - domains for the location/region of the cluster. A FailureDomain - maps to Availability Zone with an Azure Region (if the region support - them). An Availability Zone is a separate data center within a region - and they can be used to ensure the cluster is more resilient to - failure. See: https://docs.microsoft.com/en-us/azure/availability-zones/az-overview - This list will be used by Cluster API to try and spread the machines - across the failure domains.' - type: object - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this AzureCluster belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].reason - name: Reason - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].message - name: Message - priority: 1 - type: string - - jsonPath: .spec.resourceGroup - name: Resource Group - priority: 1 - type: string - - jsonPath: .spec.subscriptionID - name: SubscriptionID - priority: 1 - type: string - - jsonPath: .spec.location - name: Location - priority: 1 - type: string - - description: Control Plane Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureCluster is the Schema for the azureclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterSpec defines the desired state of AzureCluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure - resources managed by the Azure provider, in addition to the ones - added by default. - type: object - azureEnvironment: - description: 'AzureEnvironment is the name of the AzureCloud to be - used. The default value that would be used by most users is "AzurePublicCloud", - other values are: - ChinaCloud: "AzureChinaCloud" - GermanCloud: - "AzureGermanCloud" - PublicCloud: "AzurePublicCloud" - USGovernmentCloud: - "AzureUSGovernmentCloud"' - type: string - bastionSpec: - description: BastionSpec encapsulates all things related to the Bastions - in the cluster. - properties: - azureBastion: - description: AzureBastion specifies how the Azure Bastion cloud - component should be configured. - properties: - name: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create an - Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - subnet: - description: SubnetSpec configures an Azure subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, - specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID defines a unique identifier to reference - this resource. - type: string - name: - description: Name defines a name for the subnet resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - id: - type: string - ip: - description: PublicIPSpec defines the inputs to create - an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - name: - type: string - type: object - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - type: string - routeTable: - description: RouteTable defines the route table that should - be attached to this subnet. - properties: - id: - type: string - name: - type: string - type: object - securityGroup: - description: SecurityGroup defines the NSG (network security - group) that should be attached to this subnet. - properties: - id: - type: string - name: - type: string - securityRules: - description: SecurityRules is a slice of Azure security - rules for security groups. - items: - description: SecurityRule defines an Azure security - rule for security groups. - properties: - description: - description: A description for this rule. Restricted - to 140 chars. - type: string - destination: - description: Destination is the destination - address prefix. CIDR or destination IP range. - Asterix '*' can also be used to match all - source IPs. Default tags such as 'VirtualNetwork', - 'AzureLoadBalancer' and 'Internet' can also - be used. - type: string - destinationPorts: - description: DestinationPorts specifies the - destination port or range. Integer or range - between 0 and 65535. Asterix '*' can also - be used to match all ports. - type: string - direction: - description: Direction indicates whether the - rule applies to inbound, or outbound traffic. - "Inbound" or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within the - network security group. - type: string - priority: - description: Priority is a number between 100 - and 4096. Each rule should have a unique value - for priority. Rules are processed in priority - order, with lower numbers processed before - higher numbers. Once traffic matches a rule, - processing stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the protocol - type. "Tcp", "Udp", "Icmp", or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR or source - IP range. Asterix '*' can also be used to - match all source IPs. Default tags such as - 'VirtualNetwork', 'AzureLoadBalancer' and - 'Internet' can also be used. If this is an - ingress rule, specifies where network traffic - originates from. - type: string - sourcePorts: - description: SourcePorts specifies source port - or range. Integer or range between 0 and 65535. - Asterix '*' can also be used to match all - ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - type: object - required: - - name - type: object - type: object - type: object - cloudProviderConfigOverrides: - description: 'CloudProviderConfigOverrides is an optional set of configuration - values that can be overridden in azure cloud provider config. This - is only a subset of options that are available in azure cloud provider - config. Some values for the cloud provider config are inferred from - other parts of cluster api provider azure spec, and may not be available - for overrides. See: https://kubernetes-sigs.github.io/cloud-provider-azure/install/configs - Note: All cloud provider config values can be customized by creating - the secret beforehand. CloudProviderConfigOverrides is only used - when the secret is managed by the Azure Provider.' - properties: - backOffs: - description: BackOffConfig indicates the back-off config options. - properties: - cloudProviderBackoff: - type: boolean - cloudProviderBackoffDuration: - type: integer - cloudProviderBackoffExponent: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffJitter: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffRetries: - type: integer - type: object - rateLimits: - items: - description: 'RateLimitSpec represents the rate limit configuration - for a particular kind of resource. Eg. loadBalancerRateLimit - is used to configure rate limits for load balancers. This - eventually gets converted to CloudProviderRateLimitConfig - that cloud-provider-azure expects. See: https://github.com/kubernetes-sigs/cloud-provider-azure/blob/d585c2031925b39c925624302f22f8856e29e352/pkg/provider/azure_ratelimit.go#L25 - We cannot use CloudProviderRateLimitConfig directly because - floating point values are not supported in controller-tools. - See: https://github.com/kubernetes-sigs/controller-tools/issues/245' - properties: - config: - description: RateLimitConfig indicates the rate limit config - options. - properties: - cloudProviderRateLimit: - type: boolean - cloudProviderRateLimitBucket: - type: integer - cloudProviderRateLimitBucketWrite: - type: integer - cloudProviderRateLimitQPS: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderRateLimitQPSWrite: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - name: - description: Name is the name of the rate limit spec. - enum: - - defaultRateLimit - - routeRateLimit - - subnetsRateLimit - - interfaceRateLimit - - routeTableRateLimit - - loadBalancerRateLimit - - publicIPAddressRateLimit - - securityGroupRateLimit - - virtualMachineRateLimit - - storageAccountRateLimit - - diskRateLimit - - snapshotRateLimit - - virtualMachineScaleSetRateLimit - - virtualMachineSizesRateLimit - - availabilitySetRateLimit - type: string - type: object - type: array - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to an AzureIdentity to be - used when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - location: - type: string - networkSpec: - description: NetworkSpec encapsulates all things related to Azure - network. - properties: - apiServerLB: - description: APIServerLB is the configuration for the control-plane - load balancer. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend - IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create - an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend - IP addresses for the load balancer. - format: int32 - type: integer - id: - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for - the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - controlPlaneOutboundLB: - description: ControlPlaneOutboundLB is the configuration for the - control-plane outbound load balancer. This is different from - APIServerLB, and is used only in private clusters (optionally) - for enabling outbound traffic. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend - IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create - an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend - IP addresses for the load balancer. - format: int32 - type: integer - id: - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for - the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - nodeOutboundLB: - description: NodeOutboundLB is the configuration for the node - outbound load balancer. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend - IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create - an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend - IP addresses for the load balancer. - format: int32 - type: integer - id: - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for - the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - privateDNSZoneName: - description: PrivateDNSZoneName defines the zone name for the - Azure Private DNS. - type: string - subnets: - description: Subnets is the configuration for the control-plane - subnet and the node subnet. - items: - description: SubnetSpec configures an Azure subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, - specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID defines a unique identifier to reference - this resource. - type: string - name: - description: Name defines a name for the subnet resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - id: - type: string - ip: - description: PublicIPSpec defines the inputs to create - an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - name: - type: string - type: object - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - type: string - routeTable: - description: RouteTable defines the route table that should - be attached to this subnet. - properties: - id: - type: string - name: - type: string - type: object - securityGroup: - description: SecurityGroup defines the NSG (network security - group) that should be attached to this subnet. - properties: - id: - type: string - name: - type: string - securityRules: - description: SecurityRules is a slice of Azure security - rules for security groups. - items: - description: SecurityRule defines an Azure security - rule for security groups. - properties: - description: - description: A description for this rule. Restricted - to 140 chars. - type: string - destination: - description: Destination is the destination address - prefix. CIDR or destination IP range. Asterix - '*' can also be used to match all source IPs. - Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' - and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts specifies the destination - port or range. Integer or range between 0 and - 65535. Asterix '*' can also be used to match - all ports. - type: string - direction: - description: Direction indicates whether the rule - applies to inbound, or outbound traffic. "Inbound" - or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within the - network security group. - type: string - priority: - description: Priority is a number between 100 - and 4096. Each rule should have a unique value - for priority. Rules are processed in priority - order, with lower numbers processed before higher - numbers. Once traffic matches a rule, processing - stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the protocol type. - "Tcp", "Udp", "Icmp", or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR or source - IP range. Asterix '*' can also be used to match - all source IPs. Default tags such as 'VirtualNetwork', - 'AzureLoadBalancer' and 'Internet' can also - be used. If this is an ingress rule, specifies - where network traffic originates from. - type: string - sourcePorts: - description: SourcePorts specifies source port - or range. Integer or range between 0 and 65535. - Asterix '*' can also be used to match all ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - type: object - required: - - name - type: object - type: array - vnet: - description: Vnet is the configuration for the Azure virtual network. - properties: - cidrBlocks: - description: CIDRBlocks defines the virtual network's address - space, specified as one or more address prefixes in CIDR - notation. - items: - type: string - type: array - id: - description: ID is the identifier of the virtual network this - provider should use to create resources. - type: string - name: - description: Name defines a name for the virtual network resource. - type: string - resourceGroup: - description: ResourceGroup is the name of the resource group - of the existing virtual network or the resource group where - a managed virtual network should be created. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - required: - - name - type: object - type: object - resourceGroup: - type: string - subscriptionID: - type: string - required: - - location - type: object - status: - description: AzureClusterStatus defines the observed state of AzureCluster. - properties: - conditions: - description: Conditions defines current service state of the AzureCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: 'FailureDomains specifies the list of unique failure - domains for the location/region of the cluster. A FailureDomain - maps to Availability Zone with an Azure Region (if the region support - them). An Availability Zone is a separate data center within a region - and they can be used to ensure the cluster is more resilient to - failure. See: https://docs.microsoft.com/en-us/azure/availability-zones/az-overview - This list will be used by Cluster API to try and spread the machines - across the failure domains.' - type: object - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure - long-running operations so they can be continued on the next reconciliation - loop. - items: - description: Future contains the data needed for an Azure long-running - operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. Together - with the service name, this forms the unique identifier for - the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together - with the name of the resource, this forms the unique identifier - for the future. - type: string - type: - description: Type describes the type of future, such as update, - create, delete, etc. - type: string - required: - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this AzureCluster belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].reason - name: Reason - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].message - name: Message - priority: 1 - type: string - - jsonPath: .spec.resourceGroup - name: Resource Group - priority: 1 - type: string - - jsonPath: .spec.subscriptionID - name: SubscriptionID - priority: 1 - type: string - - jsonPath: .spec.location - name: Location - priority: 1 - type: string - - description: Control Plane Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureCluster is the Schema for the azureclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterSpec defines the desired state of AzureCluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure - resources managed by the Azure provider, in addition to the ones - added by default. - type: object - azureEnvironment: - description: 'AzureEnvironment is the name of the AzureCloud to be - used. The default value that would be used by most users is "AzurePublicCloud", - other values are: - ChinaCloud: "AzureChinaCloud" - GermanCloud: - "AzureGermanCloud" - PublicCloud: "AzurePublicCloud" - USGovernmentCloud: - "AzureUSGovernmentCloud"' - type: string - bastionSpec: - description: BastionSpec encapsulates all things related to the Bastions - in the cluster. - properties: - azureBastion: - description: AzureBastion specifies how the Azure Bastion cloud - component should be configured. - properties: - name: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create an - Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated with - the object. - properties: - tag: - description: 'Tag specifies the value of the IP - tag associated with the public IP. Example: SQL.' - type: string - type: - description: 'Type specifies the IP tag type. Example: - FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - subnet: - description: SubnetSpec configures an Azure subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, - specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID is the Azure resource ID of the subnet. - READ-ONLY - type: string - name: - description: Name defines a name for the subnet resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - id: - description: ID is the Azure resource ID of the NAT - gateway. READ-ONLY - type: string - ip: - description: PublicIPSpec defines the inputs to create - an Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated - with the object. - properties: - tag: - description: 'Tag specifies the value of - the IP tag associated with the public - IP. Example: SQL.' - type: string - type: - description: 'Type specifies the IP tag - type. Example: FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - name: - type: string - required: - - name - type: object - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - enum: - - node - - control-plane - - bastion - type: string - routeTable: - description: RouteTable defines the route table that should - be attached to this subnet. - properties: - id: - description: ID is the Azure resource ID of the route - table. READ-ONLY - type: string - name: - type: string - required: - - name - type: object - securityGroup: - description: SecurityGroup defines the NSG (network security - group) that should be attached to this subnet. - properties: - id: - description: ID is the Azure resource ID of the security - group. READ-ONLY - type: string - name: - type: string - securityRules: - description: SecurityRules is a slice of Azure security - rules for security groups. - items: - description: SecurityRule defines an Azure security - rule for security groups. - properties: - description: - description: A description for this rule. Restricted - to 140 chars. - type: string - destination: - description: Destination is the destination - address prefix. CIDR or destination IP range. - Asterix '*' can also be used to match all - source IPs. Default tags such as 'VirtualNetwork', - 'AzureLoadBalancer' and 'Internet' can also - be used. - type: string - destinationPorts: - description: DestinationPorts specifies the - destination port or range. Integer or range - between 0 and 65535. Asterix '*' can also - be used to match all ports. - type: string - direction: - description: Direction indicates whether the - rule applies to inbound, or outbound traffic. - "Inbound" or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within the - network security group. - type: string - priority: - description: Priority is a number between 100 - and 4096. Each rule should have a unique value - for priority. Rules are processed in priority - order, with lower numbers processed before - higher numbers. Once traffic matches a rule, - processing stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the protocol - type. "Tcp", "Udp", "Icmp", or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR or source - IP range. Asterix '*' can also be used to - match all source IPs. Default tags such as - 'VirtualNetwork', 'AzureLoadBalancer' and - 'Internet' can also be used. If this is an - ingress rule, specifies where network traffic - originates from. - type: string - sourcePorts: - description: SourcePorts specifies source port - or range. Integer or range between 0 and 65535. - Asterix '*' can also be used to match all - ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - required: - - name - type: object - serviceEndpoints: - description: ServiceEndpoints is a slice of Virtual Network - service endpoints to enable for the subnets. - items: - description: ServiceEndpointSpec configures an Azure - Service Endpoint. - properties: - locations: - items: - type: string - type: array - service: - type: string - required: - - locations - - service - type: object - type: array - x-kubernetes-list-map-keys: - - service - x-kubernetes-list-type: map - required: - - name - - role - type: object - type: object - type: object - cloudProviderConfigOverrides: - description: 'CloudProviderConfigOverrides is an optional set of configuration - values that can be overridden in azure cloud provider config. This - is only a subset of options that are available in azure cloud provider - config. Some values for the cloud provider config are inferred from - other parts of cluster api provider azure spec, and may not be available - for overrides. See: https://kubernetes-sigs.github.io/cloud-provider-azure/install/configs - Note: All cloud provider config values can be customized by creating - the secret beforehand. CloudProviderConfigOverrides is only used - when the secret is managed by the Azure Provider.' - properties: - backOffs: - description: BackOffConfig indicates the back-off config options. - properties: - cloudProviderBackoff: - type: boolean - cloudProviderBackoffDuration: - type: integer - cloudProviderBackoffExponent: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffJitter: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffRetries: - type: integer - type: object - rateLimits: - items: - description: 'RateLimitSpec represents the rate limit configuration - for a particular kind of resource. Eg. loadBalancerRateLimit - is used to configure rate limits for load balancers. This - eventually gets converted to CloudProviderRateLimitConfig - that cloud-provider-azure expects. See: https://github.com/kubernetes-sigs/cloud-provider-azure/blob/d585c2031925b39c925624302f22f8856e29e352/pkg/provider/azure_ratelimit.go#L25 - We cannot use CloudProviderRateLimitConfig directly because - floating point values are not supported in controller-tools. - See: https://github.com/kubernetes-sigs/controller-tools/issues/245' - properties: - config: - description: RateLimitConfig indicates the rate limit config - options. - properties: - cloudProviderRateLimit: - type: boolean - cloudProviderRateLimitBucket: - type: integer - cloudProviderRateLimitBucketWrite: - type: integer - cloudProviderRateLimitQPS: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderRateLimitQPSWrite: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - name: - description: Name is the name of the rate limit spec. - enum: - - defaultRateLimit - - routeRateLimit - - subnetsRateLimit - - interfaceRateLimit - - routeTableRateLimit - - loadBalancerRateLimit - - publicIPAddressRateLimit - - securityGroupRateLimit - - virtualMachineRateLimit - - storageAccountRateLimit - - diskRateLimit - - snapshotRateLimit - - virtualMachineScaleSetRateLimit - - virtualMachineSizesRateLimit - - availabilitySetRateLimit - type: string - required: - - name - type: object - type: array - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. It is not recommended to set - this when creating an AzureCluster as CAPZ will set this for you. - However, if it is set, CAPZ will not change it. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to an AzureIdentity to be - used when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - location: - type: string - networkSpec: - description: NetworkSpec encapsulates all things related to Azure - network. - properties: - apiServerLB: - description: APIServerLB is the configuration for the control-plane - load balancer. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend - IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create - an Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated - with the object. - properties: - tag: - description: 'Tag specifies the value of the - IP tag associated with the public IP. Example: - SQL.' - type: string - type: - description: 'Type specifies the IP tag type. - Example: FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend - IP addresses for the load balancer. - format: int32 - type: integer - id: - description: ID is the Azure resource ID of the load balancer. - READ-ONLY - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for - the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - controlPlaneOutboundLB: - description: ControlPlaneOutboundLB is the configuration for the - control-plane outbound load balancer. This is different from - APIServerLB, and is used only in private clusters (optionally) - for enabling outbound traffic. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend - IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create - an Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated - with the object. - properties: - tag: - description: 'Tag specifies the value of the - IP tag associated with the public IP. Example: - SQL.' - type: string - type: - description: 'Type specifies the IP tag type. - Example: FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend - IP addresses for the load balancer. - format: int32 - type: integer - id: - description: ID is the Azure resource ID of the load balancer. - READ-ONLY - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for - the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - nodeOutboundLB: - description: NodeOutboundLB is the configuration for the node - outbound load balancer. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend - IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create - an Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated - with the object. - properties: - tag: - description: 'Tag specifies the value of the - IP tag associated with the public IP. Example: - SQL.' - type: string - type: - description: 'Type specifies the IP tag type. - Example: FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend - IP addresses for the load balancer. - format: int32 - type: integer - id: - description: ID is the Azure resource ID of the load balancer. - READ-ONLY - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for - the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - privateDNSZoneName: - description: PrivateDNSZoneName defines the zone name for the - Azure Private DNS. - type: string - subnets: - description: Subnets is the configuration for the control-plane - subnet and the node subnet. - items: - description: SubnetSpec configures an Azure subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, - specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID is the Azure resource ID of the subnet. - READ-ONLY - type: string - name: - description: Name defines a name for the subnet resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - id: - description: ID is the Azure resource ID of the NAT - gateway. READ-ONLY - type: string - ip: - description: PublicIPSpec defines the inputs to create - an Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated - with the object. - properties: - tag: - description: 'Tag specifies the value of the - IP tag associated with the public IP. Example: - SQL.' - type: string - type: - description: 'Type specifies the IP tag type. - Example: FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - name: - type: string - required: - - name - type: object - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - enum: - - node - - control-plane - - bastion - type: string - routeTable: - description: RouteTable defines the route table that should - be attached to this subnet. - properties: - id: - description: ID is the Azure resource ID of the route - table. READ-ONLY - type: string - name: - type: string - required: - - name - type: object - securityGroup: - description: SecurityGroup defines the NSG (network security - group) that should be attached to this subnet. - properties: - id: - description: ID is the Azure resource ID of the security - group. READ-ONLY - type: string - name: - type: string - securityRules: - description: SecurityRules is a slice of Azure security - rules for security groups. - items: - description: SecurityRule defines an Azure security - rule for security groups. - properties: - description: - description: A description for this rule. Restricted - to 140 chars. - type: string - destination: - description: Destination is the destination address - prefix. CIDR or destination IP range. Asterix - '*' can also be used to match all source IPs. - Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' - and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts specifies the destination - port or range. Integer or range between 0 and - 65535. Asterix '*' can also be used to match - all ports. - type: string - direction: - description: Direction indicates whether the rule - applies to inbound, or outbound traffic. "Inbound" - or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within the - network security group. - type: string - priority: - description: Priority is a number between 100 - and 4096. Each rule should have a unique value - for priority. Rules are processed in priority - order, with lower numbers processed before higher - numbers. Once traffic matches a rule, processing - stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the protocol type. - "Tcp", "Udp", "Icmp", or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR or source - IP range. Asterix '*' can also be used to match - all source IPs. Default tags such as 'VirtualNetwork', - 'AzureLoadBalancer' and 'Internet' can also - be used. If this is an ingress rule, specifies - where network traffic originates from. - type: string - sourcePorts: - description: SourcePorts specifies source port - or range. Integer or range between 0 and 65535. - Asterix '*' can also be used to match all ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - required: - - name - type: object - serviceEndpoints: - description: ServiceEndpoints is a slice of Virtual Network - service endpoints to enable for the subnets. - items: - description: ServiceEndpointSpec configures an Azure Service - Endpoint. - properties: - locations: - items: - type: string - type: array - service: - type: string - required: - - locations - - service - type: object - type: array - x-kubernetes-list-map-keys: - - service - x-kubernetes-list-type: map - required: - - name - - role - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - vnet: - description: Vnet is the configuration for the Azure virtual network. - properties: - cidrBlocks: - description: CIDRBlocks defines the virtual network's address - space, specified as one or more address prefixes in CIDR - notation. - items: - type: string - type: array - id: - description: ID is the Azure resource ID of the virtual network. - READ-ONLY - type: string - name: - description: Name defines a name for the virtual network resource. - type: string - peerings: - description: Peerings defines a list of peerings of the newly - created virtual network with existing virtual networks. - items: - description: VnetPeeringSpec specifies an existing remote - virtual network to peer with the AzureCluster's virtual - network. - properties: - remoteVnetName: - description: RemoteVnetName defines name of the remote - virtual network. - type: string - resourceGroup: - description: ResourceGroup is the resource group name - of the remote virtual network. - type: string - required: - - remoteVnetName - type: object - type: array - resourceGroup: - description: ResourceGroup is the name of the resource group - of the existing virtual network or the resource group where - a managed virtual network should be created. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - required: - - name - type: object - type: object - resourceGroup: - type: string - subscriptionID: - type: string - required: - - location - type: object - status: - description: AzureClusterStatus defines the observed state of AzureCluster. - properties: - conditions: - description: Conditions defines current service state of the AzureCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: 'FailureDomains specifies the list of unique failure - domains for the location/region of the cluster. A FailureDomain - maps to Availability Zone with an Azure Region (if the region support - them). An Availability Zone is a separate data center within a region - and they can be used to ensure the cluster is more resilient to - failure. See: https://docs.microsoft.com/en-us/azure/availability-zones/az-overview - This list will be used by Cluster API to try and spread the machines - across the failure domains.' - type: object - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure - long-running operations so they can be continued on the next reconciliation - loop. - items: - description: Future contains the data needed for an Azure long-running - operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. Together - with the service name, this forms the unique identifier for - the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together - with the name of the resource, this forms the unique identifier - for the future. - type: string - type: - description: Type describes the type of future, such as update, - create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azureclustertemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureClusterTemplate - listKind: AzureClusterTemplateList - plural: azureclustertemplates - singular: azureclustertemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureClusterTemplate is the Schema for the azureclustertemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterTemplateSpec defines the desired state of AzureClusterTemplate. - properties: - template: - description: AzureClusterTemplateResource describes the data needed - to create an AzureCluster from a template. - properties: - spec: - description: AzureClusterTemplateResourceSpec specifies an Azure - cluster template resource. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to - add to Azure resources managed by the Azure provider, in - addition to the ones added by default. - type: object - azureEnvironment: - description: 'AzureEnvironment is the name of the AzureCloud - to be used. The default value that would be used by most - users is "AzurePublicCloud", other values are: - ChinaCloud: - "AzureChinaCloud" - GermanCloud: "AzureGermanCloud" - PublicCloud: - "AzurePublicCloud" - USGovernmentCloud: "AzureUSGovernmentCloud"' - type: string - bastionSpec: - description: BastionSpec encapsulates all things related to - the Bastions in the cluster. - properties: - azureBastion: - description: AzureBastionTemplateSpec specifies a template - for an Azure Bastion host. - properties: - subnet: - description: SubnetTemplateSpec specifies a template - for a subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address - space, specified as one or more address prefixes - in CIDR notation. - items: - type: string - type: array - name: - description: Name defines a name for the subnet - resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - name: - type: string - required: - - name - type: object - role: - description: Role defines the subnet role (eg. - Node, ControlPlane) - enum: - - node - - control-plane - - bastion - type: string - securityGroup: - description: SecurityGroup defines the NSG (network - security group) that should be attached to this - subnet. - properties: - securityRules: - description: SecurityRules is a slice of Azure - security rules for security groups. - items: - description: SecurityRule defines an Azure - security rule for security groups. - properties: - description: - description: A description for this - rule. Restricted to 140 chars. - type: string - destination: - description: Destination is the destination - address prefix. CIDR or destination - IP range. Asterix '*' can also be - used to match all source IPs. Default - tags such as 'VirtualNetwork', 'AzureLoadBalancer' - and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts specifies - the destination port or range. Integer - or range between 0 and 65535. Asterix - '*' can also be used to match all - ports. - type: string - direction: - description: Direction indicates whether - the rule applies to inbound, or outbound - traffic. "Inbound" or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within - the network security group. - type: string - priority: - description: Priority is a number between - 100 and 4096. Each rule should have - a unique value for priority. Rules - are processed in priority order, with - lower numbers processed before higher - numbers. Once traffic matches a rule, - processing stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the - protocol type. "Tcp", "Udp", "Icmp", - or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR - or source IP range. Asterix '*' can - also be used to match all source IPs. - Default tags such as 'VirtualNetwork', - 'AzureLoadBalancer' and 'Internet' - can also be used. If this is an ingress - rule, specifies where network traffic - originates from. - type: string - sourcePorts: - description: SourcePorts specifies source - port or range. Integer or range between - 0 and 65535. Asterix '*' can also - be used to match all ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - type: object - serviceEndpoints: - description: ServiceEndpoints is a slice of Virtual - Network service endpoints to enable for the - subnets. - items: - description: ServiceEndpointSpec configures - an Azure Service Endpoint. - properties: - locations: - items: - type: string - type: array - service: - type: string - required: - - locations - - service - type: object - type: array - x-kubernetes-list-map-keys: - - service - x-kubernetes-list-type: map - required: - - name - - role - type: object - type: object - type: object - cloudProviderConfigOverrides: - description: 'CloudProviderConfigOverrides is an optional - set of configuration values that can be overridden in azure - cloud provider config. This is only a subset of options - that are available in azure cloud provider config. Some - values for the cloud provider config are inferred from other - parts of cluster api provider azure spec, and may not be - available for overrides. See: https://kubernetes-sigs.github.io/cloud-provider-azure/install/configs - Note: All cloud provider config values can be customized - by creating the secret beforehand. CloudProviderConfigOverrides - is only used when the secret is managed by the Azure Provider.' - properties: - backOffs: - description: BackOffConfig indicates the back-off config - options. - properties: - cloudProviderBackoff: - type: boolean - cloudProviderBackoffDuration: - type: integer - cloudProviderBackoffExponent: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffJitter: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffRetries: - type: integer - type: object - rateLimits: - items: - description: 'RateLimitSpec represents the rate limit - configuration for a particular kind of resource. Eg. - loadBalancerRateLimit is used to configure rate limits - for load balancers. This eventually gets converted - to CloudProviderRateLimitConfig that cloud-provider-azure - expects. See: https://github.com/kubernetes-sigs/cloud-provider-azure/blob/d585c2031925b39c925624302f22f8856e29e352/pkg/provider/azure_ratelimit.go#L25 - We cannot use CloudProviderRateLimitConfig directly - because floating point values are not supported in - controller-tools. See: https://github.com/kubernetes-sigs/controller-tools/issues/245' - properties: - config: - description: RateLimitConfig indicates the rate - limit config options. - properties: - cloudProviderRateLimit: - type: boolean - cloudProviderRateLimitBucket: - type: integer - cloudProviderRateLimitBucketWrite: - type: integer - cloudProviderRateLimitQPS: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderRateLimitQPSWrite: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - name: - description: Name is the name of the rate limit - spec. - enum: - - defaultRateLimit - - routeRateLimit - - subnetsRateLimit - - interfaceRateLimit - - routeTableRateLimit - - loadBalancerRateLimit - - publicIPAddressRateLimit - - securityGroupRateLimit - - virtualMachineRateLimit - - storageAccountRateLimit - - diskRateLimit - - snapshotRateLimit - - virtualMachineScaleSetRateLimit - - virtualMachineSizesRateLimit - - availabilitySetRateLimit - type: string - required: - - name - type: object - type: array - type: object - identityRef: - description: IdentityRef is a reference to an AzureIdentity - to be used when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - location: - type: string - networkSpec: - description: NetworkSpec encapsulates all things related to - Azure network. - properties: - apiServerLB: - description: APIServerLB is the configuration for the - control-plane load balancer. - properties: - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout - for the TCP idle connection. - format: int32 - type: integer - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer - Type. - type: string - type: object - controlPlaneOutboundLB: - description: ControlPlaneOutboundLB is the configuration - for the control-plane outbound load balancer. This is - different from APIServerLB, and is used only in private - clusters (optionally) for enabling outbound traffic. - properties: - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout - for the TCP idle connection. - format: int32 - type: integer - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer - Type. - type: string - type: object - nodeOutboundLB: - description: NodeOutboundLB is the configuration for the - node outbound load balancer. - properties: - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout - for the TCP idle connection. - format: int32 - type: integer - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer - Type. - type: string - type: object - privateDNSZoneName: - description: PrivateDNSZoneName defines the zone name - for the Azure Private DNS. - type: string - subnets: - description: Subnets is the configuration for the control-plane - subnet and the node subnet. - items: - description: SubnetTemplateSpec specifies a template - for a subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address - space, specified as one or more address prefixes - in CIDR notation. - items: - type: string - type: array - name: - description: Name defines a name for the subnet - resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - name: - type: string - required: - - name - type: object - role: - description: Role defines the subnet role (eg. Node, - ControlPlane) - enum: - - node - - control-plane - - bastion - type: string - securityGroup: - description: SecurityGroup defines the NSG (network - security group) that should be attached to this - subnet. - properties: - securityRules: - description: SecurityRules is a slice of Azure - security rules for security groups. - items: - description: SecurityRule defines an Azure - security rule for security groups. - properties: - description: - description: A description for this rule. - Restricted to 140 chars. - type: string - destination: - description: Destination is the destination - address prefix. CIDR or destination - IP range. Asterix '*' can also be used - to match all source IPs. Default tags - such as 'VirtualNetwork', 'AzureLoadBalancer' - and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts specifies - the destination port or range. Integer - or range between 0 and 65535. Asterix - '*' can also be used to match all ports. - type: string - direction: - description: Direction indicates whether - the rule applies to inbound, or outbound - traffic. "Inbound" or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within - the network security group. - type: string - priority: - description: Priority is a number between - 100 and 4096. Each rule should have - a unique value for priority. Rules are - processed in priority order, with lower - numbers processed before higher numbers. - Once traffic matches a rule, processing - stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the protocol - type. "Tcp", "Udp", "Icmp", or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR - or source IP range. Asterix '*' can - also be used to match all source IPs. - Default tags such as 'VirtualNetwork', - 'AzureLoadBalancer' and 'Internet' can - also be used. If this is an ingress - rule, specifies where network traffic - originates from. - type: string - sourcePorts: - description: SourcePorts specifies source - port or range. Integer or range between - 0 and 65535. Asterix '*' can also be - used to match all ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - type: object - serviceEndpoints: - description: ServiceEndpoints is a slice of Virtual - Network service endpoints to enable for the subnets. - items: - description: ServiceEndpointSpec configures an - Azure Service Endpoint. - properties: - locations: - items: - type: string - type: array - service: - type: string - required: - - locations - - service - type: object - type: array - x-kubernetes-list-map-keys: - - service - x-kubernetes-list-type: map - required: - - name - - role - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - vnet: - description: Vnet is the configuration for the Azure virtual - network. - properties: - cidrBlocks: - description: CIDRBlocks defines the virtual network's - address space, specified as one or more address - prefixes in CIDR notation. - items: - type: string - type: array - peerings: - description: Peerings defines a list of peerings of - the newly created virtual network with existing - virtual networks. - items: - description: VnetPeeringClassSpec specifies a virtual - network peering class. - properties: - remoteVnetName: - description: RemoteVnetName defines name of - the remote virtual network. - type: string - resourceGroup: - description: ResourceGroup is the resource group - name of the remote virtual network. - type: string - required: - - remoteVnetName - type: object - type: array - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing - the resource. - type: object - type: object - type: object - subscriptionID: - type: string - required: - - location - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: unapproved - controller-gen.kubebuilder.io/version: v0.5.0 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: azureidentities.aadpodidentity.k8s.io -spec: - group: aadpodidentity.k8s.io - names: - kind: AzureIdentity - listKind: AzureIdentityList - plural: azureidentities - singular: azureidentity - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: AzureIdentity is the specification of the identity data structure. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureIdentitySpec describes the credential specifications - of an identity on Azure. - properties: - adEndpoint: - type: string - adResourceID: - description: For service principal. Option param for specifying the AD - details. - type: string - auxiliaryTenantIDs: - description: Service principal auxiliary tenant ids - items: - type: string - nullable: true - type: array - clientID: - description: Both User Assigned MSI and SP can use this field. - type: string - clientPassword: - description: Used for service principal - properties: - name: - description: Name is unique within a namespace to reference a - secret resource. - type: string - namespace: - description: Namespace defines the space within which the secret - name must be unique. - type: string - type: object - metadata: - type: object - replicas: - format: int32 - nullable: true - type: integer - resourceID: - description: User assigned MSI resource id. - type: string - tenantID: - description: Service principal primary tenant id. - type: string - type: - description: UserAssignedMSI or Service Principal - type: integer - type: object - status: - description: AzureIdentityStatus contains the replica status of the resource. - properties: - availableReplicas: - format: int32 - type: integer - metadata: - type: object - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: unapproved - controller-gen.kubebuilder.io/version: v0.5.0 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: azureidentitybindings.aadpodidentity.k8s.io -spec: - group: aadpodidentity.k8s.io - names: - kind: AzureIdentityBinding - listKind: AzureIdentityBindingList - plural: azureidentitybindings - singular: azureidentitybinding - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: AzureIdentityBinding brings together the spec of matching pods - and the identity which they can use. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureIdentityBindingSpec matches the pod with the Identity. - Used to indicate the potential matches to look for between the pod/deployment - and the identities present. - properties: - azureIdentity: - type: string - metadata: - type: object - selector: - type: string - weight: - description: Weight is used to figure out which of the matching identities - would be selected. - type: integer - type: object - status: - description: AzureIdentityBindingStatus contains the status of an AzureIdentityBinding. - properties: - availableReplicas: - format: int32 - type: integer - metadata: - type: object - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremachinepoolmachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureMachinePoolMachine - listKind: AzureMachinePoolMachineList - plural: azuremachinepoolmachines - shortNames: - - ampm - singular: azuremachinepoolmachine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Kubernetes version - jsonPath: .status.version - name: Version - type: string - - description: Flag indicating infrastructure is successfully provisioned - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VMSS VM provisioning state - jsonPath: .status.provisioningState - name: State - type: string - - description: Cluster to which this AzureMachinePoolMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: Azure VMSS VM ID - jsonPath: .spec.providerID - name: VMSS VM ID - priority: 1 - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureMachinePoolMachine is the Schema for the azuremachinepoolmachines - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachinePoolMachineSpec defines the desired state of - AzureMachinePoolMachine. - properties: - instanceID: - description: InstanceID is the identification of the Machine Instance - within the VMSS - type: string - providerID: - description: ProviderID is the identification ID of the Virtual Machine - Scale Set - type: string - required: - - instanceID - - providerID - type: object - status: - description: AzureMachinePoolMachineStatus defines the observed state - of AzureMachinePoolMachine. - properties: - conditions: - description: Conditions defines current service state of the AzureMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a more verbose string suitable for logging and human consumption. - \n Any transient errors that occur during the reconciliation of - MachinePools can be added as events to the MachinePool object and/or - logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the MachinePool machine and will - contain a succinct value suitable for machine interpretation. \n - Any transient errors that occur during the reconciliation of MachinePools - can be added as events to the MachinePool object and/or logged in - the controller's output." - type: string - instanceName: - description: InstanceName is the name of the Machine Instance within - the VMSS - type: string - latestModelApplied: - description: LatestModelApplied indicates the instance is running - the most up-to-date VMSS model. A VMSS model describes the image - version the VM is running. If the instance is not running the latest - model, it means the instance may not be running the version of Kubernetes - the Machine Pool has specified and needs to be updated. - type: boolean - longRunningOperationStates: - description: LongRunningOperationStates saves the state for Azure - long running operations so they can be continued on the next reconciliation - loop. - items: - description: Future contains the data needed for an Azure long-running - operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. Together - with the service name, this forms the unique identifier for - the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together - with the name of the resource, this forms the unique identifier - for the future. - type: string - type: - description: Type describes the type of future, such as update, - create, delete, etc. - type: string - required: - - name - - serviceName - - type - type: object - type: array - nodeRef: - description: NodeRef will point to the corresponding Node if it exists. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - provisioningState: - description: ProvisioningState is the provisioning state of the Azure - virtual machine instance. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - version: - description: Version defines the Kubernetes version for the VM Instance - type: string - required: - - latestModelApplied - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Kubernetes version - jsonPath: .status.version - name: Version - type: string - - description: Flag indicating infrastructure is successfully provisioned - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VMSS VM provisioning state - jsonPath: .status.provisioningState - name: State - type: string - - description: Cluster to which this AzureMachinePoolMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: Azure VMSS VM ID - jsonPath: .spec.providerID - name: VMSS VM ID - priority: 1 - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureMachinePoolMachine is the Schema for the azuremachinepoolmachines - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachinePoolMachineSpec defines the desired state of - AzureMachinePoolMachine. - properties: - instanceID: - description: InstanceID is the identification of the Machine Instance - within the VMSS - type: string - providerID: - description: ProviderID is the identification ID of the Virtual Machine - Scale Set - type: string - required: - - instanceID - - providerID - type: object - status: - description: AzureMachinePoolMachineStatus defines the observed state - of AzureMachinePoolMachine. - properties: - conditions: - description: Conditions defines current service state of the AzureMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a more verbose string suitable for logging and human consumption. - \n Any transient errors that occur during the reconciliation of - MachinePools can be added as events to the MachinePool object and/or - logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the MachinePool machine and will - contain a succinct value suitable for machine interpretation. \n - Any transient errors that occur during the reconciliation of MachinePools - can be added as events to the MachinePool object and/or logged in - the controller's output." - type: string - instanceName: - description: InstanceName is the name of the Machine Instance within - the VMSS - type: string - latestModelApplied: - description: LatestModelApplied indicates the instance is running - the most up-to-date VMSS model. A VMSS model describes the image - version the VM is running. If the instance is not running the latest - model, it means the instance may not be running the version of Kubernetes - the Machine Pool has specified and needs to be updated. - type: boolean - longRunningOperationStates: - description: LongRunningOperationStates saves the state for Azure - long running operations so they can be continued on the next reconciliation - loop. - items: - description: Future contains the data needed for an Azure long-running - operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. Together - with the service name, this forms the unique identifier for - the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together - with the name of the resource, this forms the unique identifier - for the future. - type: string - type: - description: Type describes the type of future, such as update, - create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - nodeRef: - description: NodeRef will point to the corresponding Node if it exists. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - provisioningState: - description: ProvisioningState is the provisioning state of the Azure - virtual machine instance. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - version: - description: Version defines the Kubernetes version for the VM Instance - type: string - required: - - latestModelApplied - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremachinepools.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureMachinePool - listKind: AzureMachinePoolList - plural: azuremachinepools - shortNames: - - amp - singular: azuremachinepool - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: AzureMachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: AzureMachinePool replicas count - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VMSS provisioning state - jsonPath: .status.provisioningState - name: State - type: string - - description: Cluster to which this AzureMachinePool belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: MachinePool object to which this AzureMachinePool belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="MachinePool")].name - name: MachinePool - priority: 1 - type: string - - description: Azure VMSS ID - jsonPath: .spec.providerID - name: VMSS ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.template.vmSize - name: VM Size - priority: 1 - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureMachinePool is the Schema for the azuremachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachinePoolSpec defines the desired state of AzureMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an - instance, in addition to the ones added by default by the Azure - provider. If both the AzureCluster and the AzureMachine specify - the same tag name with different values, the AzureMachine's value - takes precedence. - type: object - identity: - default: None - description: Identity is the type of identity used for the Virtual - Machine Scale Set. The type 'SystemAssigned' is an implicitly created - identity. The generated identity will be assigned a Subscription - contributor role. The type 'UserAssigned' is a standalone Azure - resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - location: - description: Location is the Azure region location e.g. westus2 - type: string - providerID: - description: ProviderID is the identification ID of the Virtual Machine - Scale Set - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine - instances provided by the provider. This field must match the provider - IDs as seen on the node objects corresponding to a machine pool's - machine instances. - items: - type: string - type: array - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment - to create for a system assigned identity. It can be any valid GUID. - If not specified, a random GUID will be generated. - type: string - template: - description: Template contains the details used to build a replica - virtual machine within the Machine Pool. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated - networking. If omitted, it will be set based on whether the - requested VMSize supports accelerated networking. If AcceleratedNetworking - is set to true with a VMSize that does not support it, Azure - will return an error. - type: boolean - dataDisks: - description: DataDisks specifies the list of data disks to be - created for a Virtual Machine - items: - description: DataDisk specifies the parameters that are used - to add one or more data disks to the machine. - properties: - cachingType: - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the - data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the - data disk. This value is used to identify data disks within - the VM and therefore must be unique for each data disk - attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options - for a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk - encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to - the machine name to generate the disk name. Each disk - name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - image: - description: Image is used to provide details of an image to use - during Virtual Machine creation. If image details are omitted - the image will default the Azure Marketplace "capi" offer, which - is based on Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the - Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization - that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such - as a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published - by a third party publisher and a Plan will be generated - for it. - type: boolean - version: - description: Version specifies the version of an image - sku. The allowed formats are Major.Minor.Build or 'latest'. - Major, Minor, and Build are decimal numbers. Specify - 'latest' to use the latest version of an image available - at deploy time. Even if you use 'latest', the VM image - will not automatically update after deploy time even - if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from - an Azure Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared - image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - resourceGroup: - description: ResourceGroup specifies the resource group - containing the shared image gallery - minLength: 1 - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription - that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace - image. The allowed formats are Major.Minor.Build or - 'latest'. Major, Minor, and Build are decimal numbers. - Specify 'latest' to use the latest version of an image - available at deploy time. Even if you use 'latest', - the VM image will not automatically update after deploy - time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk contains the operating system disk information - for a Virtual Machine - properties: - cachingType: - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings - for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" - See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks - for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options - for a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk - encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - osType: - type: string - required: - - diskSizeGB - - managedDisk - - osType - type: object - securityProfile: - description: SecurityProfile specifies the Security profile settings - for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption - should be enabled or disabled for a virtual machine or virtual - machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine - should use a Spot VM - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is - willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - description: SSHPublicKey is the SSH public key string base64 - encoded to add to a Virtual Machine - type: string - terminateNotificationTimeout: - description: TerminateNotificationTimeout enables or disables - VMSS scheduled events termination notification with specified - timeout allowed values are between 5 and 15 (mins) - type: integer - vmSize: - description: VMSize is the size of the Virtual Machine to build. - See https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines/createorupdate#virtualmachinesizetypes - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure - identities provided by the user The lifecycle of a user-assigned - identity is managed separately from the lifecycle of the AzureMachinePool. - See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities - provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned - Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - required: - - location - - template - type: object - status: - description: AzureMachinePoolStatus defines the observed state of AzureMachinePool. - properties: - conditions: - description: Conditions defines current service state of the AzureMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a more verbose string suitable for logging and human consumption. - \n This field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the MachinePool's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of MachinePools can be added as - events to the MachinePool object and/or logged in the controller's - output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a succinct value suitable for machine interpretation. \n This field - should not be set for transitive errors that a controller faces - that are expected to be fixed automatically over time (like service - outages), but instead indicate that something is fundamentally wrong - with the MachinePool's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of MachinePools can be added as - events to the MachinePool object and/or logged in the controller's - output." - type: string - instances: - description: Instances is the VM instance status for each VM in the - VMSS - items: - description: AzureMachinePoolInstanceStatus provides status information - for each instance in the VMSS. - properties: - instanceID: - description: InstanceID is the identification of the Machine - Instance within the VMSS - type: string - instanceName: - description: InstanceName is the name of the Machine Instance - within the VMSS - type: string - latestModelApplied: - description: LatestModelApplied indicates the instance is running - the most up-to-date VMSS model. A VMSS model describes the - image version the VM is running. If the instance is not running - the latest model, it means the instance may not be running - the version of Kubernetes the Machine Pool has specified and - needs to be updated. - type: boolean - providerID: - description: ProviderID is the provider identification of the - VMSS Instance - type: string - provisioningState: - description: ProvisioningState is the provisioning state of - the Azure virtual machine instance. - type: string - version: - description: Version defines the Kubernetes version for the - VM Instance - type: string - required: - - latestModelApplied - type: object - type: array - longRunningOperationState: - description: LongRunningOperationState saves the state for an Azure - long running operations so it can be continued on the next reconciliation - loop. - properties: - futureData: - description: FutureData is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - type: - description: Type describes the type of future, update, create, - delete, etc. - type: string - required: - - type - type: object - provisioningState: - description: ProvisioningState is the provisioning state of the Azure - virtual machine. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - version: - description: Version is the Kubernetes version for the current VMSS - model - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: AzureMachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: AzureMachinePool replicas count - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VMSS provisioning state - jsonPath: .status.provisioningState - name: State - type: string - - description: Cluster to which this AzureMachinePool belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: MachinePool object to which this AzureMachinePool belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="MachinePool")].name - name: MachinePool - priority: 1 - type: string - - description: Azure VMSS ID - jsonPath: .spec.providerID - name: VMSS ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.template.vmSize - name: VM Size - priority: 1 - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureMachinePool is the Schema for the azuremachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachinePoolSpec defines the desired state of AzureMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an - instance, in addition to the ones added by default by the Azure - provider. If both the AzureCluster and the AzureMachine specify - the same tag name with different values, the AzureMachine's value - takes precedence. - type: object - identity: - default: None - description: Identity is the type of identity used for the Virtual - Machine Scale Set. The type 'SystemAssigned' is an implicitly created - identity. The generated identity will be assigned a Subscription - contributor role. The type 'UserAssigned' is a standalone Azure - resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - location: - description: Location is the Azure region location e.g. westus2 - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the - controller will spend on draining a node. The default value is 0, - meaning that the node can be drained without any time limitations. - NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the Virtual Machine - Scale Set - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine - instances provided by the provider. This field must match the provider - IDs as seen on the node objects corresponding to a machine pool's - machine instances. - items: - type: string - type: array - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment - to create for a system assigned identity. It can be any valid GUID. - If not specified, a random GUID will be generated. - type: string - strategy: - default: - rollingUpdate: - deletePolicy: Oldest - maxSurge: 1 - maxUnavailable: 0 - type: RollingUpdate - description: The deployment strategy to use to replace existing AzureMachinePoolMachines - with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if MachineDeploymentStrategyType - = RollingUpdate. - properties: - deletePolicy: - default: Oldest - description: DeletePolicy defines the policy used by the MachineDeployment - to identify nodes to delete when downscaling. Valid values - are "Random, "Newest", "Oldest" When no value is supplied, - the default is Oldest - enum: - - Random - - Newest - - Oldest - type: string - maxSurge: - anyOf: - - type: integer - - type: string - default: 1 - description: 'The maximum number of machines that can be scheduled - above the desired number of machines. Value can be an absolute - number (ex: 5) or a percentage of desired machines (ex: - 10%). This can not be 0 if MaxUnavailable is 0. Absolute - number is calculated from percentage by rounding up. Defaults - to 1. Example: when this is set to 30%, the new MachineSet - can be scaled up immediately when the rolling update starts, - such that the total number of old and new machines do not - exceed 130% of desired machines. Once old machines have - been killed, new MachineSet can be scaled up further, ensuring - that total number of machines running at any time during - the update is at most 130% of desired machines.' - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - default: 0 - description: 'The maximum number of machines that can be unavailable - during the update. Value can be an absolute number (ex: - 5) or a percentage of desired machines (ex: 10%). Absolute - number is calculated from percentage by rounding down. This - can not be 0 if MaxSurge is 0. Defaults to 0. Example: when - this is set to 30%, the old MachineSet can be scaled down - to 70% of desired machines immediately when the rolling - update starts. Once new machines are ready, old MachineSet - can be scaled down further, followed by scaling up the new - MachineSet, ensuring that the total number of machines available - at all times during the update is at least 70% of desired - machines.' - x-kubernetes-int-or-string: true - type: object - type: - default: RollingUpdate - description: Type of deployment. Currently the only supported - strategy is RollingUpdate - enum: - - RollingUpdate - type: string - type: object - template: - description: Template contains the details used to build a replica - virtual machine within the Machine Pool - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated - networking. If omitted, it will be set based on whether the - requested VMSize supports accelerated networking. If AcceleratedNetworking - is set to true with a VMSize that does not support it, Azure - will return an error. - type: boolean - dataDisks: - description: DataDisks specifies the list of data disks to be - created for a Virtual Machine - items: - description: DataDisk specifies the parameters that are used - to add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the - data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the - data disk. This value is used to identify data disks within - the VM and therefore must be unique for each data disk - attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters - for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk - encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to - the machine name to generate the disk name. Each disk - name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - image: - description: Image is used to provide details of an image to use - during VM creation. If image details are omitted the image will - default the Azure Marketplace "capi" offer, which is based on - Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the - Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization - that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such - as a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published - by a third party publisher and a Plan will be generated - for it. - type: boolean - version: - description: Version specifies the version of an image - sku. The allowed formats are Major.Minor.Build or 'latest'. - Major, Minor, and Build are decimal numbers. Specify - 'latest' to use the latest version of an image available - at deploy time. Even if you use 'latest', the VM image - will not automatically update after deploy time even - if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from - an Azure Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared - image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. - This is needed when the source image from which this - SIG image was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization - that created the image. This value will be used to add - a `Plan` in the API request when creating the VM/VMSS - resource. This is needed when the source image from - which this SIG image was built requires the `Plan` to - be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group - containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such - as a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. - This is needed when the source image from which this - SIG image was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription - that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace - image. The allowed formats are Major.Minor.Build or - 'latest'. Major, Minor, and Build are decimal numbers. - Specify 'latest' to use the latest version of an image - available at deploy time. Even if you use 'latest', - the VM image will not automatically update after deploy - time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk contains the operating system disk information - for a Virtual Machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings - for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" - See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks - for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the - OS disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters - for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk - encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - securityProfile: - description: SecurityProfile specifies the Security profile settings - for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption - should be enabled or disabled for a virtual machine or virtual - machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine - should use a Spot VM - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is - willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - description: SSHPublicKey is the SSH public key string base64 - encoded to add to a Virtual Machine - type: string - subnetName: - description: SubnetName selects the Subnet where the VMSS will - be placed - type: string - terminateNotificationTimeout: - description: TerminateNotificationTimeout enables or disables - VMSS scheduled events termination notification with specified - timeout allowed values are between 5 and 15 (mins) - type: integer - vmSize: - description: VMSize is the size of the Virtual Machine to build. - See https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines/createorupdate#virtualmachinesizetypes - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure - identities provided by the user The lifecycle of a user-assigned - identity is managed separately from the lifecycle of the AzureMachinePool. - See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities - provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned - Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - required: - - location - - template - type: object - status: - description: AzureMachinePoolStatus defines the observed state of AzureMachinePool. - properties: - conditions: - description: Conditions defines current service state of the AzureMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a more verbose string suitable for logging and human consumption. - \n This field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the MachinePool's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of MachinePools can be added as - events to the MachinePool object and/or logged in the controller's - output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a succinct value suitable for machine interpretation. \n This field - should not be set for transitive errors that a controller faces - that are expected to be fixed automatically over time (like service - outages), but instead indicate that something is fundamentally wrong - with the MachinePool's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of MachinePools can be added as - events to the MachinePool object and/or logged in the controller's - output." - type: string - image: - description: Image is the current image used in the AzureMachinePool. - When the spec image is nil, this image is populated with the details - of the defaulted Azure Marketplace "capi" offer. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure - Marketplace - properties: - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that - created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as - a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published - by a third party publisher and a Plan will be generated - for it. - type: boolean - version: - description: Version specifies the version of an image sku. - The allowed formats are Major.Minor.Build or 'latest'. Major, - Minor, and Build are decimal numbers. Specify 'latest' to - use the latest version of an image available at deploy time. - Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from an Azure - Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared image - gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer This value will be used to add a `Plan` in - the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that - created the image. This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing - the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as - a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription - that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace - image. The allowed formats are Major.Minor.Build or 'latest'. - Major, Minor, and Build are decimal numbers. Specify 'latest' - to use the latest version of an image available at deploy - time. Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - instances: - description: Instances is the VM instance status for each VM in the - VMSS - items: - description: AzureMachinePoolInstanceStatus provides status information - for each instance in the VMSS. - properties: - instanceID: - description: InstanceID is the identification of the Machine - Instance within the VMSS - type: string - instanceName: - description: InstanceName is the name of the Machine Instance - within the VMSS - type: string - latestModelApplied: - description: LatestModelApplied indicates the instance is running - the most up-to-date VMSS model. A VMSS model describes the - image version the VM is running. If the instance is not running - the latest model, it means the instance may not be running - the version of Kubernetes the Machine Pool has specified and - needs to be updated. - type: boolean - providerID: - description: ProviderID is the provider identification of the - VMSS Instance - type: string - provisioningState: - description: ProvisioningState is the provisioning state of - the Azure virtual machine instance. - type: string - version: - description: Version defines the Kubernetes version for the - VM Instance - type: string - required: - - latestModelApplied - type: object - type: array - longRunningOperationStates: - description: LongRunningOperationStates saves the state for Azure - long-running operations so they can be continued on the next reconciliation - loop. - items: - description: Future contains the data needed for an Azure long-running - operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. Together - with the service name, this forms the unique identifier for - the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together - with the name of the resource, this forms the unique identifier - for the future. - type: string - type: - description: Type describes the type of future, such as update, - create, delete, etc. - type: string - required: - - name - - serviceName - - type - type: object - type: array - provisioningState: - description: ProvisioningState is the provisioning state of the Azure - virtual machine. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - version: - description: Version is the Kubernetes version for the current VMSS - model - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: AzureMachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: AzureMachinePool replicas count - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VMSS provisioning state - jsonPath: .status.provisioningState - name: State - type: string - - description: Cluster to which this AzureMachinePool belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: MachinePool object to which this AzureMachinePool belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="MachinePool")].name - name: MachinePool - priority: 1 - type: string - - description: Azure VMSS ID - jsonPath: .spec.providerID - name: VMSS ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.template.vmSize - name: VM Size - priority: 1 - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureMachinePool is the Schema for the azuremachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachinePoolSpec defines the desired state of AzureMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an - instance, in addition to the ones added by default by the Azure - provider. If both the AzureCluster and the AzureMachine specify - the same tag name with different values, the AzureMachine's value - takes precedence. - type: object - identity: - default: None - description: Identity is the type of identity used for the Virtual - Machine Scale Set. The type 'SystemAssigned' is an implicitly created - identity. The generated identity will be assigned a Subscription - contributor role. The type 'UserAssigned' is a standalone Azure - resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - location: - description: Location is the Azure region location e.g. westus2 - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the - controller will spend on draining a node. The default value is 0, - meaning that the node can be drained without any time limitations. - NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the Virtual Machine - Scale Set - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine - instances provided by the provider. This field must match the provider - IDs as seen on the node objects corresponding to a machine pool's - machine instances. - items: - type: string - type: array - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment - to create for a system assigned identity. It can be any valid GUID. - If not specified, a random GUID will be generated. - type: string - strategy: - default: - rollingUpdate: - deletePolicy: Oldest - maxSurge: 1 - maxUnavailable: 0 - type: RollingUpdate - description: The deployment strategy to use to replace existing AzureMachinePoolMachines - with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if MachineDeploymentStrategyType - = RollingUpdate. - properties: - deletePolicy: - default: Oldest - description: DeletePolicy defines the policy used by the MachineDeployment - to identify nodes to delete when downscaling. Valid values - are "Random, "Newest", "Oldest" When no value is supplied, - the default is Oldest - enum: - - Random - - Newest - - Oldest - type: string - maxSurge: - anyOf: - - type: integer - - type: string - default: 1 - description: 'The maximum number of machines that can be scheduled - above the desired number of machines. Value can be an absolute - number (ex: 5) or a percentage of desired machines (ex: - 10%). This can not be 0 if MaxUnavailable is 0. Absolute - number is calculated from percentage by rounding up. Defaults - to 1. Example: when this is set to 30%, the new MachineSet - can be scaled up immediately when the rolling update starts, - such that the total number of old and new machines do not - exceed 130% of desired machines. Once old machines have - been killed, new MachineSet can be scaled up further, ensuring - that total number of machines running at any time during - the update is at most 130% of desired machines.' - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - default: 0 - description: 'The maximum number of machines that can be unavailable - during the update. Value can be an absolute number (ex: - 5) or a percentage of desired machines (ex: 10%). Absolute - number is calculated from percentage by rounding down. This - can not be 0 if MaxSurge is 0. Defaults to 0. Example: when - this is set to 30%, the old MachineSet can be scaled down - to 70% of desired machines immediately when the rolling - update starts. Once new machines are ready, old MachineSet - can be scaled down further, followed by scaling up the new - MachineSet, ensuring that the total number of machines available - at all times during the update is at least 70% of desired - machines.' - x-kubernetes-int-or-string: true - type: object - type: - default: RollingUpdate - description: Type of deployment. Currently the only supported - strategy is RollingUpdate - enum: - - RollingUpdate - type: string - type: object - template: - description: Template contains the details used to build a replica - virtual machine within the Machine Pool - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated - networking. If omitted, it will be set based on whether the - requested VMSize supports accelerated networking. If AcceleratedNetworking - is set to true with a VMSize that does not support it, Azure - will return an error. - type: boolean - dataDisks: - description: DataDisks specifies the list of data disks to be - created for a Virtual Machine - items: - description: DataDisk specifies the parameters that are used - to add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the - data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the - data disk. This value is used to identify data disks within - the VM and therefore must be unique for each data disk - attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters - for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk - encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to - the machine name to generate the disk name. Each disk - name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - image: - description: Image is used to provide details of an image to use - during VM creation. If image details are omitted the image will - default the Azure Marketplace "capi" offer, which is based on - Ubuntu. - properties: - computeGallery: - description: ComputeGallery specifies an image to use from - the Azure Compute Gallery - properties: - gallery: - description: Gallery specifies the name of the compute - image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - plan: - description: Plan contains plan information. - properties: - offer: - description: Offer specifies the name of a group of - related images created by the publisher. For example, - UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization - that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, - such as a major release of a distribution. For example, - 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - required: - - offer - - publisher - - sku - type: object - resourceGroup: - description: ResourceGroup specifies the resource group - containing the private compute gallery. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription - that contains the private compute gallery. - type: string - version: - description: Version specifies the version of the marketplace - image. The allowed formats are Major.Minor.Build or - 'latest'. Major, Minor, and Build are decimal numbers. - Specify 'latest' to use the latest version of an image - available at deploy time. Even if you use 'latest', - the VM image will not automatically update after deploy - time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - version - type: object - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the - Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization - that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such - as a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published - by a third party publisher and a Plan will be generated - for it. - type: boolean - version: - description: Version specifies the version of an image - sku. The allowed formats are Major.Minor.Build or 'latest'. - Major, Minor, and Build are decimal numbers. Specify - 'latest' to use the latest version of an image available - at deploy time. Even if you use 'latest', the VM image - will not automatically update after deploy time even - if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: 'SharedGallery specifies an image to use from - an Azure Shared Image Gallery Deprecated: use ComputeGallery - instead.' - properties: - gallery: - description: Gallery specifies the name of the shared - image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. - This is needed when the source image from which this - SIG image was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization - that created the image. This value will be used to add - a `Plan` in the API request when creating the VM/VMSS - resource. This is needed when the source image from - which this SIG image was built requires the `Plan` to - be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group - containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such - as a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. - This is needed when the source image from which this - SIG image was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription - that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace - image. The allowed formats are Major.Minor.Build or - 'latest'. Major, Minor, and Build are decimal numbers. - Specify 'latest' to use the latest version of an image - available at deploy time. Even if you use 'latest', - the VM image will not automatically update after deploy - time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk contains the operating system disk information - for a Virtual Machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings - for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" - See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks - for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the - OS disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters - for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk - encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - securityProfile: - description: SecurityProfile specifies the Security profile settings - for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption - should be enabled or disabled for a virtual machine or virtual - machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine - should use a Spot VM - properties: - evictionPolicy: - description: EvictionPolicy defines the behavior of the virtual - machine when it is evicted. It can be either Delete or Deallocate. - enum: - - Deallocate - - Delete - type: string - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is - willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - description: SSHPublicKey is the SSH public key string base64 - encoded to add to a Virtual Machine - type: string - subnetName: - description: SubnetName selects the Subnet where the VMSS will - be placed - type: string - terminateNotificationTimeout: - description: TerminateNotificationTimeout enables or disables - VMSS scheduled events termination notification with specified - timeout allowed values are between 5 and 15 (mins) - type: integer - vmExtensions: - description: VMExtensions specifies a list of extensions to be - added to the scale set. - items: - description: VMExtension specifies the parameters for a custom - VM extension. - properties: - name: - description: Name is the name of the extension. - type: string - protectedSettings: - additionalProperties: - type: string - description: ProtectedSettings is a JSON formatted protected - settings for the extension. - type: object - publisher: - description: Publisher is the name of the extension handler - publisher. - type: string - settings: - additionalProperties: - type: string - description: Settings is a JSON formatted public settings - for the extension. - type: object - version: - description: Version specifies the version of the script - handler. - type: string - required: - - name - - publisher - - version - type: object - type: array - vmSize: - description: VMSize is the size of the Virtual Machine to build. - See https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines/createorupdate#virtualmachinesizetypes - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure - identities provided by the user The lifecycle of a user-assigned - identity is managed separately from the lifecycle of the AzureMachinePool. - See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities - provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned - Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - required: - - location - - template - type: object - status: - description: AzureMachinePoolStatus defines the observed state of AzureMachinePool. - properties: - conditions: - description: Conditions defines current service state of the AzureMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a more verbose string suitable for logging and human consumption. - \n This field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the MachinePool's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of MachinePools can be added as - events to the MachinePool object and/or logged in the controller's - output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the MachinePool and will contain - a succinct value suitable for machine interpretation. \n This field - should not be set for transitive errors that a controller faces - that are expected to be fixed automatically over time (like service - outages), but instead indicate that something is fundamentally wrong - with the MachinePool's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of MachinePools can be added as - events to the MachinePool object and/or logged in the controller's - output." - type: string - image: - description: Image is the current image used in the AzureMachinePool. - When the spec image is nil, this image is populated with the details - of the defaulted Azure Marketplace "capi" offer. - properties: - computeGallery: - description: ComputeGallery specifies an image to use from the - Azure Compute Gallery - properties: - gallery: - description: Gallery specifies the name of the compute image - gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - plan: - description: Plan contains plan information. - properties: - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization - that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such - as a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter - minLength: 1 - type: string - required: - - offer - - publisher - - sku - type: object - resourceGroup: - description: ResourceGroup specifies the resource group containing - the private compute gallery. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription - that contains the private compute gallery. - type: string - version: - description: Version specifies the version of the marketplace - image. The allowed formats are Major.Minor.Build or 'latest'. - Major, Minor, and Build are decimal numbers. Specify 'latest' - to use the latest version of an image available at deploy - time. Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - version - type: object - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure - Marketplace - properties: - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that - created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as - a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published - by a third party publisher and a Plan will be generated - for it. - type: boolean - version: - description: Version specifies the version of an image sku. - The allowed formats are Major.Minor.Build or 'latest'. Major, - Minor, and Build are decimal numbers. Specify 'latest' to - use the latest version of an image available at deploy time. - Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: 'SharedGallery specifies an image to use from an - Azure Shared Image Gallery Deprecated: use ComputeGallery instead.' - properties: - gallery: - description: Gallery specifies the name of the shared image - gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer This value will be used to add a `Plan` in - the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that - created the image. This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing - the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as - a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription - that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace - image. The allowed formats are Major.Minor.Build or 'latest'. - Major, Minor, and Build are decimal numbers. Specify 'latest' - to use the latest version of an image available at deploy - time. Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - instances: - description: Instances is the VM instance status for each VM in the - VMSS - items: - description: AzureMachinePoolInstanceStatus provides status information - for each instance in the VMSS. - properties: - instanceID: - description: InstanceID is the identification of the Machine - Instance within the VMSS - type: string - instanceName: - description: InstanceName is the name of the Machine Instance - within the VMSS - type: string - latestModelApplied: - description: LatestModelApplied indicates the instance is running - the most up-to-date VMSS model. A VMSS model describes the - image version the VM is running. If the instance is not running - the latest model, it means the instance may not be running - the version of Kubernetes the Machine Pool has specified and - needs to be updated. - type: boolean - providerID: - description: ProviderID is the provider identification of the - VMSS Instance - type: string - provisioningState: - description: ProvisioningState is the provisioning state of - the Azure virtual machine instance. - type: string - version: - description: Version defines the Kubernetes version for the - VM Instance - type: string - required: - - latestModelApplied - type: object - type: array - longRunningOperationStates: - description: LongRunningOperationStates saves the state for Azure - long-running operations so they can be continued on the next reconciliation - loop. - items: - description: Future contains the data needed for an Azure long-running - operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. Together - with the service name, this forms the unique identifier for - the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together - with the name of the resource, this forms the unique identifier - for the future. - type: string - type: - description: Type describes the type of future, such as update, - create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - provisioningState: - description: ProvisioningState is the provisioning state of the Azure - virtual machine. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - version: - description: Version is the Kubernetes version for the current VMSS - model - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureMachine - listKind: AzureMachineList - plural: azuremachines - singular: azuremachine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: AzureMachine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VM provisioning state - jsonPath: .status.vmState - name: State - type: string - - description: Cluster to which this AzureMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: Machine object to which this AzureMachine belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Azure VM ID - jsonPath: .spec.providerID - name: VM ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.vmSize - name: VM Size - priority: 1 - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureMachine is the Schema for the azuremachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineSpec defines the desired state of AzureMachine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated - networking. If omitted, it will be set based on whether the requested - VMSize supports accelerated networking. If AcceleratedNetworking - is set to true with a VMSize that does not support it, Azure will - return an error. - type: boolean - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an - instance, in addition to the ones added by default by the Azure - provider. If both the AzureCluster and the AzureMachine specify - the same tag name with different values, the AzureMachine's value - takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create dynamic - public ips for machines where this value is true. - type: boolean - availabilityZone: - description: 'Deprecated: use FailureDomain instead' - properties: - enabled: - type: boolean - id: - type: string - type: object - dataDisks: - description: DataDisk specifies the parameters that are used to add - one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are used to - add one or more data disks to the machine. - properties: - cachingType: - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data - disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data - disk. This value is used to identify data disks within the - VM and therefore must be unique for each data disk attached - to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options for - a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption - options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the - machine name to generate the disk name. Each disk name will - be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure which - is required for some CNI's to send traffic from a pods on one machine - to another. This is required for IpV6 with Calico in combination - with User Defined Routes (set by the Azure Cloud Controller manager). - Default is false for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster API. This - relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the virtual - machine. The type 'SystemAssigned' is an implicitly created identity. - The generated identity will be assigned a Subscription contributor - role. The type 'UserAssigned' is a standalone Azure resource provided - by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image to use during - VM creation. If image details are omitted the image will default - the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure - Marketplace - properties: - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that - created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as - a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published - by a third party publisher and a Plan will be generated - for it. - type: boolean - version: - description: Version specifies the version of an image sku. - The allowed formats are Major.Minor.Build or 'latest'. Major, - Minor, and Build are decimal numbers. Specify 'latest' to - use the latest version of an image available at deploy time. - Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from an Azure - Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared image - gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing - the shared image gallery - minLength: 1 - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription - that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace - image. The allowed formats are Major.Minor.Build or 'latest'. - Major, Minor, and Build are decimal numbers. Specify 'latest' - to use the latest version of an image available at deploy - time. Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - location: - description: 'Deprecated: to support old clients, will be removed - in v1alpha4/v1beta1' - type: string - osDisk: - description: OSDisk specifies the parameters for the operating system - disk of the machine - properties: - cachingType: - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings - for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" - See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks - for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options for - a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption - options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - osType: - type: string - required: - - diskSizeGB - - managedDisk - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified by the - cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment - to create for a system assigned identity. It can be any valid GUID. - If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile settings - for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should - be enabled or disabled for a virtual machine or virtual machine - scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine - should use a Spot VM. - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing - to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure - identities provided by the user The lifecycle of a user-assigned - identity is managed separately from the lifecycle of the AzureMachine. - See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities - provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned - Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmSize: - type: string - required: - - location - - osDisk - - sshPublicKey - - vmSize - type: object - status: - description: AzureMachineStatus defines the observed state of AzureMachine. - properties: - addresses: - description: Addresses contains the Azure instance associated addresses. - items: - description: NodeAddress contains information for the node's address. - properties: - address: - description: The node address. - type: string - type: - description: Node address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the AzureMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "ErrorMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "ErrorReason will be set in the event that there is a - terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - vmState: - description: VMState is the provisioning state of the Azure virtual - machine. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: AzureMachine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VM provisioning state - jsonPath: .status.vmState - name: State - type: string - - description: Cluster to which this AzureMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: Machine object to which this AzureMachine belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Azure VM ID - jsonPath: .spec.providerID - name: VM ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.vmSize - name: VM Size - priority: 1 - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureMachine is the Schema for the azuremachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineSpec defines the desired state of AzureMachine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated - networking. If omitted, it will be set based on whether the requested - VMSize supports accelerated networking. If AcceleratedNetworking - is set to true with a VMSize that does not support it, Azure will - return an error. - type: boolean - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an - instance, in addition to the ones added by default by the Azure - provider. If both the AzureCluster and the AzureMachine specify - the same tag name with different values, the AzureMachine's value - takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create dynamic - public ips for machines where this value is true. - type: boolean - dataDisks: - description: DataDisk specifies the parameters that are used to add - one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are used to - add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data - disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data - disk. This value is used to identify data disks within the - VM and therefore must be unique for each data disk attached - to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters - for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption - options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the - machine name to generate the disk name. Each disk name will - be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure which - is required for some CNI's to send traffic from a pods on one machine - to another. This is required for IpV6 with Calico in combination - with User Defined Routes (set by the Azure Cloud Controller manager). - Default is false for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster API. This - relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the virtual - machine. The type 'SystemAssigned' is an implicitly created identity. - The generated identity will be assigned a Subscription contributor - role. The type 'UserAssigned' is a standalone Azure resource provided - by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image to use during - VM creation. If image details are omitted the image will default - the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure - Marketplace - properties: - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that - created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as - a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published - by a third party publisher and a Plan will be generated - for it. - type: boolean - version: - description: Version specifies the version of an image sku. - The allowed formats are Major.Minor.Build or 'latest'. Major, - Minor, and Build are decimal numbers. Specify 'latest' to - use the latest version of an image available at deploy time. - Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from an Azure - Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared image - gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer This value will be used to add a `Plan` in - the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that - created the image. This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing - the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as - a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription - that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace - image. The allowed formats are Major.Minor.Build or 'latest'. - Major, Minor, and Build are decimal numbers. Specify 'latest' - to use the latest version of an image available at deploy - time. Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk specifies the parameters for the operating system - disk of the machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings - for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" - See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks - for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the OS - disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters - for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption - options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified by the - cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment - to create for a system assigned identity. It can be any valid GUID. - If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile settings - for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should - be enabled or disabled for a virtual machine or virtual machine - scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine - should use a Spot VM - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing - to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - subnetName: - description: SubnetName selects the Subnet where the VM will be placed - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure - identities provided by the user The lifecycle of a user-assigned - identity is managed separately from the lifecycle of the AzureMachine. - See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities - provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned - Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmSize: - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - status: - description: AzureMachineStatus defines the observed state of AzureMachine. - properties: - addresses: - description: Addresses contains the Azure instance associated addresses. - items: - description: NodeAddress contains information for the node's address. - properties: - address: - description: The node address. - type: string - type: - description: Node address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the AzureMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "ErrorMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "ErrorReason will be set in the event that there is a - terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure - long-running operations so they can be continued on the next reconciliation - loop. - items: - description: Future contains the data needed for an Azure long-running - operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. Together - with the service name, this forms the unique identifier for - the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together - with the name of the resource, this forms the unique identifier - for the future. - type: string - type: - description: Type describes the type of future, such as update, - create, delete, etc. - type: string - required: - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - vmState: - description: VMState is the provisioning state of the Azure virtual - machine. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].reason - name: Reason - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].message - name: Message - priority: 1 - type: string - - description: Azure VM provisioning state - jsonPath: .status.vmState - name: State - type: string - - description: Cluster to which this AzureMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: Machine object to which this AzureMachine belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Azure VM ID - jsonPath: .spec.providerID - name: VM ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.vmSize - name: VM Size - priority: 1 - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureMachine is the Schema for the azuremachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineSpec defines the desired state of AzureMachine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated - networking. If omitted, it will be set based on whether the requested - VMSize supports accelerated networking. If AcceleratedNetworking - is set to true with a VMSize that does not support it, Azure will - return an error. - type: boolean - additionalCapabilities: - description: AdditionalCapabilities specifies additional capabilities - enabled or disabled on the virtual machine. - properties: - ultraSSDEnabled: - description: UltraSSDEnabled enables or disables Azure UltraSSD - capability for the virtual machine. Defaults to true if Ultra - SSD data disks are specified, otherwise it doesn't set the capability - on the VM. - type: boolean - type: object - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an - instance, in addition to the ones added by default by the Azure - provider. If both the AzureCluster and the AzureMachine specify - the same tag name with different values, the AzureMachine's value - takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create dynamic - public ips for machines where this value is true. - type: boolean - dataDisks: - description: DataDisk specifies the parameters that are used to add - one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are used to - add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data - disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data - disk. This value is used to identify data disks within the - VM and therefore must be unique for each data disk attached - to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters - for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption - options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the - machine name to generate the disk name. Each disk name will - be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - dnsServers: - description: DNSServers adds a list of DNS Server IP addresses to - the VM NICs. - items: - type: string - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure which - is required for some CNI's to send traffic from a pods on one machine - to another. This is required for IpV6 with Calico in combination - with User Defined Routes (set by the Azure Cloud Controller manager). - Default is false for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster API. This - relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the virtual - machine. The type 'SystemAssigned' is an implicitly created identity. - The generated identity will be assigned a Subscription contributor - role. The type 'UserAssigned' is a standalone Azure resource provided - by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image to use during - VM creation. If image details are omitted the image will default - the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - computeGallery: - description: ComputeGallery specifies an image to use from the - Azure Compute Gallery - properties: - gallery: - description: Gallery specifies the name of the compute image - gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - plan: - description: Plan contains plan information. - properties: - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization - that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such - as a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter - minLength: 1 - type: string - required: - - offer - - publisher - - sku - type: object - resourceGroup: - description: ResourceGroup specifies the resource group containing - the private compute gallery. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription - that contains the private compute gallery. - type: string - version: - description: Version specifies the version of the marketplace - image. The allowed formats are Major.Minor.Build or 'latest'. - Major, Minor, and Build are decimal numbers. Specify 'latest' - to use the latest version of an image available at deploy - time. Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - version - type: object - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure - Marketplace - properties: - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that - created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as - a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published - by a third party publisher and a Plan will be generated - for it. - type: boolean - version: - description: Version specifies the version of an image sku. - The allowed formats are Major.Minor.Build or 'latest'. Major, - Minor, and Build are decimal numbers. Specify 'latest' to - use the latest version of an image available at deploy time. - Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: 'SharedGallery specifies an image to use from an - Azure Shared Image Gallery Deprecated: use ComputeGallery instead.' - properties: - gallery: - description: Gallery specifies the name of the shared image - gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related - images created by the publisher. For example, UbuntuServer, - WindowsServer This value will be used to add a `Plan` in - the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that - created the image. This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing - the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as - a major release of a distribution. For example, 18.04-LTS, - 2019-Datacenter This value will be used to add a `Plan` - in the API request when creating the VM/VMSS resource. This - is needed when the source image from which this SIG image - was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription - that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace - image. The allowed formats are Major.Minor.Build or 'latest'. - Major, Minor, and Build are decimal numbers. Specify 'latest' - to use the latest version of an image available at deploy - time. Even if you use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk specifies the parameters for the operating system - disk of the machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings - for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" - See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks - for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the OS - disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters - for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption - options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified by the - cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment - to create for a system assigned identity. It can be any valid GUID. - If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile settings - for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should - be enabled or disabled for a virtual machine or virtual machine - scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine - should use a Spot VM - properties: - evictionPolicy: - description: EvictionPolicy defines the behavior of the virtual - machine when it is evicted. It can be either Delete or Deallocate. - enum: - - Deallocate - - Delete - type: string - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing - to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - subnetName: - description: SubnetName selects the Subnet where the VM will be placed - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure - identities provided by the user The lifecycle of a user-assigned - identity is managed separately from the lifecycle of the AzureMachine. - See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities - provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned - Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmExtensions: - description: VMExtensions specifies a list of extensions to be added - to the virtual machine. - items: - description: VMExtension specifies the parameters for a custom VM - extension. - properties: - name: - description: Name is the name of the extension. - type: string - protectedSettings: - additionalProperties: - type: string - description: ProtectedSettings is a JSON formatted protected - settings for the extension. - type: object - publisher: - description: Publisher is the name of the extension handler - publisher. - type: string - settings: - additionalProperties: - type: string - description: Settings is a JSON formatted public settings for - the extension. - type: object - version: - description: Version specifies the version of the script handler. - type: string - required: - - name - - publisher - - version - type: object - type: array - vmSize: - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - status: - description: AzureMachineStatus defines the observed state of AzureMachine. - properties: - addresses: - description: Addresses contains the Azure instance associated addresses. - items: - description: NodeAddress contains information for the node's address. - properties: - address: - description: The node address. - type: string - type: - description: Node address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the AzureMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "ErrorMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "ErrorReason will be set in the event that there is a - terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure - long-running operations so they can be continued on the next reconciliation - loop. - items: - description: Future contains the data needed for an Azure long-running - operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. Together - with the service name, this forms the unique identifier for - the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together - with the name of the resource, this forms the unique identifier - for the future. - type: string - type: - description: Type describes the type of future, such as update, - create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - vmState: - description: VMState is the provisioning state of the Azure virtual - machine. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremachinetemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureMachineTemplate - listKind: AzureMachineTemplateList - plural: azuremachinetemplates - singular: azuremachinetemplate - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureMachineTemplate is the Schema for the azuremachinetemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineTemplateSpec defines the desired state of AzureMachineTemplate. - properties: - template: - description: AzureMachineTemplateResource describes the data needed - to create an AzureMachine from a template. - properties: - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure - accelerated networking. If omitted, it will be set based - on whether the requested VMSize supports accelerated networking. - If AcceleratedNetworking is set to true with a VMSize that - does not support it, Azure will return an error. - type: boolean - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to - add to an instance, in addition to the ones added by default - by the Azure provider. If both the AzureCluster and the - AzureMachine specify the same tag name with different values, - the AzureMachine's value takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create - dynamic public ips for machines where this value is true. - type: boolean - availabilityZone: - description: 'Deprecated: use FailureDomain instead' - properties: - enabled: - type: boolean - id: - type: string - type: object - dataDisks: - description: DataDisk specifies the parameters that are used - to add one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are - used to add one or more data disks to the machine. - properties: - cachingType: - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign - to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of - the data disk. This value is used to identify data - disks within the VM and therefore must be unique for - each data disk attached to a VM. The value must be - between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options - for a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines - disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended - to the machine name to generate the disk name. Each - disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure - which is required for some CNI's to send traffic from a - pods on one machine to another. This is required for IpV6 - with Calico in combination with User Defined Routes (set - by the Azure Cloud Controller manager). Default is false - for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster - API. This relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the - virtual machine. The type 'SystemAssigned' is an implicitly - created identity. The generated identity will be assigned - a Subscription contributor role. The type 'UserAssigned' - is a standalone Azure resource provided by the user and - assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image - to use during VM creation. If image details are omitted - the image will default the Azure Marketplace "capi" offer, - which is based on Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from - the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of - related images created by the publisher. For example, - UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization - that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, - such as a major release of a distribution. For example, - 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is - published by a third party publisher and a Plan - will be generated for it. - type: boolean - version: - description: Version specifies the version of an image - sku. The allowed formats are Major.Minor.Build or - 'latest'. Major, Minor, and Build are decimal numbers. - Specify 'latest' to use the latest version of an - image available at deploy time. Even if you use - 'latest', the VM image will not automatically update - after deploy time even if a new version becomes - available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from - an Azure Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared - image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - resourceGroup: - description: ResourceGroup specifies the resource - group containing the shared image gallery - minLength: 1 - type: string - subscriptionID: - description: SubscriptionID is the identifier of the - subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the - marketplace image. The allowed formats are Major.Minor.Build - or 'latest'. Major, Minor, and Build are decimal - numbers. Specify 'latest' to use the latest version - of an image available at deploy time. Even if you - use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes - available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - location: - description: 'Deprecated: to support old clients, will be - removed in v1alpha4/v1beta1' - type: string - osDisk: - description: OSDisk specifies the parameters for the operating - system disk of the machine - properties: - cachingType: - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk - settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set - to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks - for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options - for a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk - encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - osType: - type: string - required: - - diskSizeGB - - managedDisk - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified - by the cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment - to create for a system assigned identity. It can be any - valid GUID. If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile - settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption - should be enabled or disabled for a virtual machine - or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the - Machine should use a Spot VM. - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user - is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone - Azure identities provided by the user The lifecycle of a - user-assigned identity is managed separately from the lifecycle - of the AzureMachine. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned - identities provided by the user to be assigned to Azure - resources. - properties: - providerID: - description: 'ProviderID is the identification ID of - the user-assigned Identity, the format of an identity - is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmSize: - type: string - required: - - location - - osDisk - - sshPublicKey - - vmSize - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureMachineTemplate is the Schema for the azuremachinetemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineTemplateSpec defines the desired state of AzureMachineTemplate. - properties: - template: - description: AzureMachineTemplateResource describes the data needed - to create an AzureMachine from a template. - properties: - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure - accelerated networking. If omitted, it will be set based - on whether the requested VMSize supports accelerated networking. - If AcceleratedNetworking is set to true with a VMSize that - does not support it, Azure will return an error. - type: boolean - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to - add to an instance, in addition to the ones added by default - by the Azure provider. If both the AzureCluster and the - AzureMachine specify the same tag name with different values, - the AzureMachine's value takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create - dynamic public ips for machines where this value is true. - type: boolean - dataDisks: - description: DataDisk specifies the parameters that are used - to add one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are - used to add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign - to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of - the data disk. This value is used to identify data - disks within the VM and therefore must be unique for - each data disk attached to a VM. The value must be - between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk - parameters for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines - disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended - to the machine name to generate the disk name. Each - disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure - which is required for some CNI's to send traffic from a - pods on one machine to another. This is required for IpV6 - with Calico in combination with User Defined Routes (set - by the Azure Cloud Controller manager). Default is false - for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster - API. This relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the - virtual machine. The type 'SystemAssigned' is an implicitly - created identity. The generated identity will be assigned - a Subscription contributor role. The type 'UserAssigned' - is a standalone Azure resource provided by the user and - assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image - to use during VM creation. If image details are omitted - the image will default the Azure Marketplace "capi" offer, - which is based on Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from - the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of - related images created by the publisher. For example, - UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization - that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, - such as a major release of a distribution. For example, - 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is - published by a third party publisher and a Plan - will be generated for it. - type: boolean - version: - description: Version specifies the version of an image - sku. The allowed formats are Major.Minor.Build or - 'latest'. Major, Minor, and Build are decimal numbers. - Specify 'latest' to use the latest version of an - image available at deploy time. Even if you use - 'latest', the VM image will not automatically update - after deploy time even if a new version becomes - available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from - an Azure Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared - image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of - related images created by the publisher. For example, - UbuntuServer, WindowsServer This value will be used - to add a `Plan` in the API request when creating - the VM/VMSS resource. This is needed when the source - image from which this SIG image was built requires - the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization - that created the image. This value will be used - to add a `Plan` in the API request when creating - the VM/VMSS resource. This is needed when the source - image from which this SIG image was built requires - the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource - group containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, - such as a major release of a distribution. For example, - 18.04-LTS, 2019-Datacenter This value will be used - to add a `Plan` in the API request when creating - the VM/VMSS resource. This is needed when the source - image from which this SIG image was built requires - the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the - subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the - marketplace image. The allowed formats are Major.Minor.Build - or 'latest'. Major, Minor, and Build are decimal - numbers. Specify 'latest' to use the latest version - of an image available at deploy time. Even if you - use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes - available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk specifies the parameters for the operating - system disk of the machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk - settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set - to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks - for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to - the OS disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters - for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk - encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified - by the cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment - to create for a system assigned identity. It can be any - valid GUID. If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile - settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption - should be enabled or disabled for a virtual machine - or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the - Machine should use a Spot VM - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user - is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - subnetName: - description: SubnetName selects the Subnet where the VM will - be placed - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone - Azure identities provided by the user The lifecycle of a - user-assigned identity is managed separately from the lifecycle - of the AzureMachine. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned - identities provided by the user to be assigned to Azure - resources. - properties: - providerID: - description: 'ProviderID is the identification ID of - the user-assigned Identity, the format of an identity - is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmSize: - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureMachineTemplate is the Schema for the azuremachinetemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineTemplateSpec defines the desired state of AzureMachineTemplate. - properties: - template: - description: AzureMachineTemplateResource describes the data needed - to create an AzureMachine from a template. - properties: - metadata: - description: "ObjectMeta is metadata that all persisted resources - must have, which includes all objects users must create. This - is a copy of customizable fields from metav1.ObjectMeta. \n - ObjectMeta is embedded in `Machine.Spec`, `MachineDeployment.Template` - and `MachineSet.Template`, which are not top-level Kubernetes - objects. Given that metav1.ObjectMeta has lots of special cases - and read-only fields which end up in the generated CRD validation, - having it as a subset simplifies the API and some issues that - can impact user experience. \n During the [upgrade to controller-tools@v2](https://github.com/kubernetes-sigs/cluster-api/pull/1054) - for v1alpha2, we noticed a failure would occur running Cluster - API test suite against the new CRDs, specifically `spec.metadata.creationTimestamp - in body must be of type string: \"null\"`. The investigation - showed that `controller-tools@v2` behaves differently than its - previous version when handling types from [metav1](k8s.io/apimachinery/pkg/apis/meta/v1) - package. \n In more details, we found that embedded (non-top - level) types that embedded `metav1.ObjectMeta` had validation - properties, including for `creationTimestamp` (metav1.Time). - The `metav1.Time` type specifies a custom json marshaller that, - when IsZero() is true, returns `null` which breaks validation - because the field isn't marked as nullable. \n In future versions, - controller-tools@v2 might allow overriding the type and validation - for embedded types. When that happens, this hack should be revisited." - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure - accelerated networking. If omitted, it will be set based - on whether the requested VMSize supports accelerated networking. - If AcceleratedNetworking is set to true with a VMSize that - does not support it, Azure will return an error. - type: boolean - additionalCapabilities: - description: AdditionalCapabilities specifies additional capabilities - enabled or disabled on the virtual machine. - properties: - ultraSSDEnabled: - description: UltraSSDEnabled enables or disables Azure - UltraSSD capability for the virtual machine. Defaults - to true if Ultra SSD data disks are specified, otherwise - it doesn't set the capability on the VM. - type: boolean - type: object - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to - add to an instance, in addition to the ones added by default - by the Azure provider. If both the AzureCluster and the - AzureMachine specify the same tag name with different values, - the AzureMachine's value takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create - dynamic public ips for machines where this value is true. - type: boolean - dataDisks: - description: DataDisk specifies the parameters that are used - to add one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are - used to add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign - to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of - the data disk. This value is used to identify data - disks within the VM and therefore must be unique for - each data disk attached to a VM. The value must be - between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk - parameters for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines - disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended - to the machine name to generate the disk name. Each - disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - dnsServers: - description: DNSServers adds a list of DNS Server IP addresses - to the VM NICs. - items: - type: string - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure - which is required for some CNI's to send traffic from a - pods on one machine to another. This is required for IpV6 - with Calico in combination with User Defined Routes (set - by the Azure Cloud Controller manager). Default is false - for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster - API. This relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the - virtual machine. The type 'SystemAssigned' is an implicitly - created identity. The generated identity will be assigned - a Subscription contributor role. The type 'UserAssigned' - is a standalone Azure resource provided by the user and - assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image - to use during VM creation. If image details are omitted - the image will default the Azure Marketplace "capi" offer, - which is based on Ubuntu. - properties: - computeGallery: - description: ComputeGallery specifies an image to use - from the Azure Compute Gallery - properties: - gallery: - description: Gallery specifies the name of the compute - image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - plan: - description: Plan contains plan information. - properties: - offer: - description: Offer specifies the name of a group - of related images created by the publisher. - For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization - that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, - such as a major release of a distribution. For - example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - required: - - offer - - publisher - - sku - type: object - resourceGroup: - description: ResourceGroup specifies the resource - group containing the private compute gallery. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the - subscription that contains the private compute gallery. - type: string - version: - description: Version specifies the version of the - marketplace image. The allowed formats are Major.Minor.Build - or 'latest'. Major, Minor, and Build are decimal - numbers. Specify 'latest' to use the latest version - of an image available at deploy time. Even if you - use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes - available. - minLength: 1 - type: string - required: - - gallery - - name - - version - type: object - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from - the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of - related images created by the publisher. For example, - UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization - that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, - such as a major release of a distribution. For example, - 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is - published by a third party publisher and a Plan - will be generated for it. - type: boolean - version: - description: Version specifies the version of an image - sku. The allowed formats are Major.Minor.Build or - 'latest'. Major, Minor, and Build are decimal numbers. - Specify 'latest' to use the latest version of an - image available at deploy time. Even if you use - 'latest', the VM image will not automatically update - after deploy time even if a new version becomes - available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: 'SharedGallery specifies an image to use - from an Azure Shared Image Gallery Deprecated: use ComputeGallery - instead.' - properties: - gallery: - description: Gallery specifies the name of the shared - image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of - related images created by the publisher. For example, - UbuntuServer, WindowsServer This value will be used - to add a `Plan` in the API request when creating - the VM/VMSS resource. This is needed when the source - image from which this SIG image was built requires - the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization - that created the image. This value will be used - to add a `Plan` in the API request when creating - the VM/VMSS resource. This is needed when the source - image from which this SIG image was built requires - the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource - group containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, - such as a major release of a distribution. For example, - 18.04-LTS, 2019-Datacenter This value will be used - to add a `Plan` in the API request when creating - the VM/VMSS resource. This is needed when the source - image from which this SIG image was built requires - the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the - subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the - marketplace image. The allowed formats are Major.Minor.Build - or 'latest'. Major, Minor, and Build are decimal - numbers. Specify 'latest' to use the latest version - of an image available at deploy time. Even if you - use 'latest', the VM image will not automatically - update after deploy time even if a new version becomes - available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk specifies the parameters for the operating - system disk of the machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk - settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set - to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks - for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to - the OS disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters - for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk - encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet - resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified - by the cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment - to create for a system assigned identity. It can be any - valid GUID. If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile - settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption - should be enabled or disabled for a virtual machine - or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the - Machine should use a Spot VM - properties: - evictionPolicy: - description: EvictionPolicy defines the behavior of the - virtual machine when it is evicted. It can be either - Delete or Deallocate. - enum: - - Deallocate - - Delete - type: string - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user - is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - subnetName: - description: SubnetName selects the Subnet where the VM will - be placed - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone - Azure identities provided by the user The lifecycle of a - user-assigned identity is managed separately from the lifecycle - of the AzureMachine. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned - identities provided by the user to be assigned to Azure - resources. - properties: - providerID: - description: 'ProviderID is the identification ID of - the user-assigned Identity, the format of an identity - is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmExtensions: - description: VMExtensions specifies a list of extensions to - be added to the virtual machine. - items: - description: VMExtension specifies the parameters for a - custom VM extension. - properties: - name: - description: Name is the name of the extension. - type: string - protectedSettings: - additionalProperties: - type: string - description: ProtectedSettings is a JSON formatted protected - settings for the extension. - type: object - publisher: - description: Publisher is the name of the extension - handler publisher. - type: string - settings: - additionalProperties: - type: string - description: Settings is a JSON formatted public settings - for the extension. - type: object - version: - description: Version specifies the version of the script - handler. - type: string - required: - - name - - publisher - - version - type: object - type: array - vmSize: - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremanagedclusters.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureManagedCluster - listKind: AzureManagedClusterList - plural: azuremanagedclusters - shortNames: - - amc - singular: azuremanagedcluster - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureManagedCluster is the Schema for the azuremanagedclusters - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedClusterSpec defines the desired state of AzureManagedCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - type: object - status: - description: AzureManagedClusterStatus defines the observed state of AzureManagedCluster. - properties: - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureManagedCluster is the Schema for the azuremanagedclusters - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedClusterSpec defines the desired state of AzureManagedCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - type: object - status: - description: AzureManagedClusterStatus defines the observed state of AzureManagedCluster. - properties: - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureManagedCluster is the Schema for the azuremanagedclusters - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedClusterSpec defines the desired state of AzureManagedCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - type: object - status: - description: AzureManagedClusterStatus defines the observed state of AzureManagedCluster. - properties: - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremanagedcontrolplanes.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureManagedControlPlane - listKind: AzureManagedControlPlaneList - plural: azuremanagedcontrolplanes - shortNames: - - amcp - singular: azuremanagedcontrolplane - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureManagedControlPlane is the Schema for the azuremanagedcontrolplanes - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedControlPlaneSpec defines the desired state of - AzureManagedControlPlane. - properties: - aadProfile: - description: AadProfile is Azure Active Directory configuration to - integrate with AKS for aad authentication. - properties: - adminGroupObjectIDs: - description: AdminGroupObjectIDs - AAD group object IDs that will - have admin role of the cluster. - items: - type: string - type: array - managed: - description: Managed - Whether to enable managed AAD. - type: boolean - required: - - adminGroupObjectIDs - - managed - type: object - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure - resources managed by the Azure provider, in addition to the ones - added by default. - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - dnsServiceIP: - description: DNSServiceIP is an IP address assigned to the Kubernetes - DNS service. It must be within the Kubernetes service address range - specified in serviceCidr. - type: string - loadBalancerSKU: - description: LoadBalancerSKU is the SKU of the loadBalancer to be - provisioned. - enum: - - Basic - - Standard - type: string - location: - description: 'Location is a string matching one of the canonical Azure - region names. Examples: "westus2", "eastus".' - type: string - networkPlugin: - description: NetworkPlugin used for building Kubernetes network. - enum: - - azure - - kubenet - type: string - networkPolicy: - description: NetworkPolicy used for building Kubernetes network. - enum: - - azure - - calico - type: string - nodeResourceGroupName: - description: NodeResourceGroupName is the name of the resource group - containing cluster IaaS resources. Will be populated to default - in webhook. - type: string - resourceGroupName: - description: ResourceGroupName is the name of the Azure resource group - for this AKS Cluster. - type: string - sshPublicKey: - description: SSHPublicKey is a string literal containing an ssh public - key base64 encoded. - type: string - subscriptionID: - description: SubscriotionID is the GUID of the Azure subscription - to hold this cluster. - type: string - version: - description: Version defines the desired Kubernetes version. - minLength: 2 - type: string - virtualNetwork: - description: VirtualNetwork describes the vnet for the AKS cluster. - Will be created if it does not exist. - properties: - cidrBlock: - type: string - name: - type: string - subnet: - description: ManagedControlPlaneSubnet describes a subnet for - an AKS cluster. - properties: - cidrBlock: - type: string - name: - type: string - required: - - cidrBlock - - name - type: object - required: - - cidrBlock - - name - type: object - required: - - location - - nodeResourceGroupName - - resourceGroupName - - sshPublicKey - - version - type: object - status: - description: AzureManagedControlPlaneStatus defines the observed state - of AzureManagedControlPlane. - properties: - initialized: - description: Initialized is true when the the control plane is available - for initial contact. This may occur before the control plane is - fully ready. In the AzureManagedControlPlane implementation, these - are identical. - type: boolean - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureManagedControlPlane is the Schema for the azuremanagedcontrolplanes - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedControlPlaneSpec defines the desired state of - AzureManagedControlPlane. - properties: - aadProfile: - description: AadProfile is Azure Active Directory configuration to - integrate with AKS for aad authentication. - properties: - adminGroupObjectIDs: - description: AdminGroupObjectIDs - AAD group object IDs that will - have admin role of the cluster. - items: - type: string - type: array - managed: - description: Managed - Whether to enable managed AAD. - type: boolean - required: - - adminGroupObjectIDs - - managed - type: object - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure - resources managed by the Azure provider, in addition to the ones - added by default. - type: object - apiServerAccessProfile: - description: APIServerAccessProfile is the access profile for AKS - API server. - properties: - authorizedIPRanges: - description: AuthorizedIPRanges - Authorized IP Ranges to kubernetes - API server. - items: - type: string - type: array - enablePrivateCluster: - description: EnablePrivateCluster - Whether to create the cluster - as a private cluster or not. - type: boolean - enablePrivateClusterPublicFQDN: - description: EnablePrivateClusterPublicFQDN - Whether to create - additional public FQDN for private cluster or not. - type: boolean - privateDNSZone: - description: PrivateDNSZone - Private dns zone mode for private - cluster. - enum: - - System - - None - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - dnsServiceIP: - description: DNSServiceIP is an IP address assigned to the Kubernetes - DNS service. It must be within the Kubernetes service address range - specified in serviceCidr. - type: string - identityRef: - description: IdentityRef is a reference to a AzureClusterIdentity - to be used when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - loadBalancerProfile: - description: LoadBalancerProfile is the profile of the cluster load - balancer. - properties: - allocatedOutboundPorts: - description: AllocatedOutboundPorts - Desired number of allocated - SNAT ports per VM. Allowed values must be in the range of 0 - to 64000 (inclusive). The default value is 0 which results in - Azure dynamically allocating ports. - format: int32 - type: integer - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes - Desired outbound flow idle - timeout in minutes. Allowed values must be in the range of 4 - to 120 (inclusive). The default value is 30 minutes. - format: int32 - type: integer - managedOutboundIPs: - description: ManagedOutboundIPs - Desired managed outbound IPs - for the cluster load balancer. - format: int32 - type: integer - outboundIPPrefixes: - description: OutboundIPPrefixes - Desired outbound IP Prefix resources - for the cluster load balancer. - items: - type: string - type: array - outboundIPs: - description: OutboundIPs - Desired outbound IP resources for the - cluster load balancer. - items: - type: string - type: array - type: object - loadBalancerSKU: - description: LoadBalancerSKU is the SKU of the loadBalancer to be - provisioned. - enum: - - Basic - - Standard - type: string - location: - description: 'Location is a string matching one of the canonical Azure - region names. Examples: "westus2", "eastus".' - type: string - networkPlugin: - description: NetworkPlugin used for building Kubernetes network. - enum: - - azure - - kubenet - type: string - networkPolicy: - description: NetworkPolicy used for building Kubernetes network. - enum: - - azure - - calico - type: string - nodeResourceGroupName: - description: NodeResourceGroupName is the name of the resource group - containing cluster IaaS resources. Will be populated to default - in webhook. - type: string - resourceGroupName: - description: ResourceGroupName is the name of the Azure resource group - for this AKS Cluster. - type: string - sku: - description: SKU is the SKU of the AKS to be provisioned. - properties: - tier: - description: Tier - Tier of a managed cluster SKU. - enum: - - Free - - Paid - type: string - required: - - tier - type: object - sshPublicKey: - description: SSHPublicKey is a string literal containing an ssh public - key base64 encoded. - type: string - subscriptionID: - description: SubscriptionID is the GUID of the Azure subscription - to hold this cluster. - type: string - version: - description: Version defines the desired Kubernetes version. - minLength: 2 - type: string - virtualNetwork: - description: VirtualNetwork describes the vnet for the AKS cluster. - Will be created if it does not exist. - properties: - cidrBlock: - type: string - name: - type: string - subnet: - description: ManagedControlPlaneSubnet describes a subnet for - an AKS cluster. - properties: - cidrBlock: - type: string - name: - type: string - required: - - cidrBlock - - name - type: object - required: - - cidrBlock - - name - type: object - required: - - location - - resourceGroupName - - sshPublicKey - - version - type: object - status: - description: AzureManagedControlPlaneStatus defines the observed state - of AzureManagedControlPlane. - properties: - initialized: - description: Initialized is true when the the control plane is available - for initial contact. This may occur before the control plane is - fully ready. In the AzureManagedControlPlane implementation, these - are identical. - type: boolean - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure - long-running operations so they can be continued on the next reconciliation - loop. - items: - description: Future contains the data needed for an Azure long-running - operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. Together - with the service name, this forms the unique identifier for - the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together - with the name of the resource, this forms the unique identifier - for the future. - type: string - type: - description: Type describes the type of future, such as update, - create, delete, etc. - type: string - required: - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureManagedControlPlane is the Schema for the azuremanagedcontrolplanes - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedControlPlaneSpec defines the desired state of - AzureManagedControlPlane. - properties: - aadProfile: - description: AadProfile is Azure Active Directory configuration to - integrate with AKS for aad authentication. - properties: - adminGroupObjectIDs: - description: AdminGroupObjectIDs - AAD group object IDs that will - have admin role of the cluster. - items: - type: string - type: array - managed: - description: Managed - Whether to enable managed AAD. - type: boolean - required: - - adminGroupObjectIDs - - managed - type: object - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure - resources managed by the Azure provider, in addition to the ones - added by default. - type: object - addonProfiles: - description: AddonProfiles are the profiles of managed cluster add-on. - items: - description: AddonProfile represents a managed cluster add-on. - properties: - config: - additionalProperties: - type: string - description: Config - Key-value pairs for configuring the add-on. - type: object - enabled: - description: Enabled - Whether the add-on is enabled or not. - type: boolean - name: - description: Name - The name of the managed cluster add-on. - type: string - required: - - enabled - - name - type: object - type: array - apiServerAccessProfile: - description: APIServerAccessProfile is the access profile for AKS - API server. - properties: - authorizedIPRanges: - description: AuthorizedIPRanges - Authorized IP Ranges to kubernetes - API server. - items: - type: string - type: array - enablePrivateCluster: - description: EnablePrivateCluster - Whether to create the cluster - as a private cluster or not. - type: boolean - enablePrivateClusterPublicFQDN: - description: EnablePrivateClusterPublicFQDN - Whether to create - additional public FQDN for private cluster or not. - type: boolean - privateDNSZone: - description: PrivateDNSZone - Private dns zone mode for private - cluster. - enum: - - System - - None - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - dnsServiceIP: - description: DNSServiceIP is an IP address assigned to the Kubernetes - DNS service. It must be within the Kubernetes service address range - specified in serviceCidr. - type: string - identityRef: - description: IdentityRef is a reference to a AzureClusterIdentity - to be used when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - loadBalancerProfile: - description: LoadBalancerProfile is the profile of the cluster load - balancer. - properties: - allocatedOutboundPorts: - description: AllocatedOutboundPorts - Desired number of allocated - SNAT ports per VM. Allowed values must be in the range of 0 - to 64000 (inclusive). The default value is 0 which results in - Azure dynamically allocating ports. - format: int32 - type: integer - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes - Desired outbound flow idle - timeout in minutes. Allowed values must be in the range of 4 - to 120 (inclusive). The default value is 30 minutes. - format: int32 - type: integer - managedOutboundIPs: - description: ManagedOutboundIPs - Desired managed outbound IPs - for the cluster load balancer. - format: int32 - type: integer - outboundIPPrefixes: - description: OutboundIPPrefixes - Desired outbound IP Prefix resources - for the cluster load balancer. - items: - type: string - type: array - outboundIPs: - description: OutboundIPs - Desired outbound IP resources for the - cluster load balancer. - items: - type: string - type: array - type: object - loadBalancerSKU: - description: LoadBalancerSKU is the SKU of the loadBalancer to be - provisioned. - enum: - - Basic - - Standard - type: string - location: - description: 'Location is a string matching one of the canonical Azure - region names. Examples: "westus2", "eastus".' - type: string - networkPlugin: - description: NetworkPlugin used for building Kubernetes network. - enum: - - azure - - kubenet - type: string - networkPolicy: - description: NetworkPolicy used for building Kubernetes network. - enum: - - azure - - calico - type: string - nodeResourceGroupName: - description: NodeResourceGroupName is the name of the resource group - containing cluster IaaS resources. Will be populated to default - in webhook. - type: string - resourceGroupName: - description: ResourceGroupName is the name of the Azure resource group - for this AKS Cluster. - type: string - sku: - description: SKU is the SKU of the AKS to be provisioned. - properties: - tier: - description: Tier - Tier of a managed cluster SKU. - enum: - - Free - - Paid - type: string - required: - - tier - type: object - sshPublicKey: - description: SSHPublicKey is a string literal containing an ssh public - key base64 encoded. - type: string - subscriptionID: - description: SubscriptionID is the GUID of the Azure subscription - to hold this cluster. - type: string - version: - description: Version defines the desired Kubernetes version. - minLength: 2 - type: string - virtualNetwork: - description: VirtualNetwork describes the vnet for the AKS cluster. - Will be created if it does not exist. - properties: - cidrBlock: - type: string - name: - type: string - resourceGroup: - description: ResourceGroup is the name of the Azure resource group - for the VNet and Subnet. - type: string - subnet: - description: ManagedControlPlaneSubnet describes a subnet for - an AKS cluster. - properties: - cidrBlock: - type: string - name: - type: string - serviceEndpoints: - description: ServiceEndpoints is a slice of Virtual Network - service endpoints to enable for the subnets. - items: - description: ServiceEndpointSpec configures an Azure Service - Endpoint. - properties: - locations: - items: - type: string - type: array - service: - type: string - required: - - locations - - service - type: object - type: array - x-kubernetes-list-map-keys: - - service - x-kubernetes-list-type: map - required: - - cidrBlock - - name - type: object - required: - - cidrBlock - - name - type: object - required: - - location - - resourceGroupName - - sshPublicKey - - version - type: object - status: - description: AzureManagedControlPlaneStatus defines the observed state - of AzureManagedControlPlane. - properties: - conditions: - description: Conditions defines current service state of the AzureManagedControlPlane. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - initialized: - description: Initialized is true when the control plane is available - for initial contact. This may occur before the control plane is - fully ready. In the AzureManagedControlPlane implementation, these - are identical. - type: boolean - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure - long-running operations so they can be continued on the next reconciliation - loop. - items: - description: Future contains the data needed for an Azure long-running - operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. Together - with the service name, this forms the unique identifier for - the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together - with the name of the resource, this forms the unique identifier - for the future. - type: string - type: - description: Type describes the type of future, such as update, - create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremanagedmachinepools.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureManagedMachinePool - listKind: AzureManagedMachinePoolList - plural: azuremanagedmachinepools - shortNames: - - ammp - singular: azuremanagedmachinepool - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureManagedMachinePool is the Schema for the azuremanagedmachinepools - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedMachinePoolSpec defines the desired state of - AzureManagedMachinePool. - properties: - mode: - description: 'Mode - represents mode of an agent pool. Possible values - include: System, User.' - enum: - - System - - User - type: string - osDiskSizeGB: - description: OSDiskSizeGB is the disk size for every machine in this - agent pool. If you specify 0, it will apply the default osDisk size - according to the vmSize specified. - format: int32 - type: integer - providerIDList: - description: ProviderIDList is the unique identifier as specified - by the cloud provider. - items: - type: string - type: array - sku: - description: SKU is the size of the VMs in the node pool. - type: string - required: - - mode - - sku - type: object - status: - description: AzureManagedMachinePoolStatus defines the observed state - of AzureManagedMachinePool. - properties: - errorMessage: - description: Any transient errors that occur during the reconciliation - of Machines can be added as events to the Machine object and/or - logged in the controller's output. - type: string - errorReason: - description: Any transient errors that occur during the reconciliation - of Machines can be added as events to the Machine object and/or - logged in the controller's output. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureManagedMachinePool is the Schema for the azuremanagedmachinepools - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedMachinePoolSpec defines the desired state of - AzureManagedMachinePool. - properties: - mode: - description: 'Mode - represents mode of an agent pool. Possible values - include: System, User.' - enum: - - System - - User - type: string - name: - description: Name - name of the agent pool. If not specified, CAPZ - uses the name of the CR as the agent pool name. - type: string - osDiskSizeGB: - description: OSDiskSizeGB is the disk size for every machine in this - agent pool. If you specify 0, it will apply the default osDisk size - according to the vmSize specified. - format: int32 - type: integer - providerIDList: - description: ProviderIDList is the unique identifier as specified - by the cloud provider. - items: - type: string - type: array - sku: - description: SKU is the size of the VMs in the node pool. - type: string - required: - - mode - - sku - type: object - status: - description: AzureManagedMachinePoolStatus defines the observed state - of AzureManagedMachinePool. - properties: - errorMessage: - description: Any transient errors that occur during the reconciliation - of Machines can be added as events to the Machine object and/or - logged in the controller's output. - type: string - errorReason: - description: Any transient errors that occur during the reconciliation - of Machines can be added as events to the Machine object and/or - logged in the controller's output. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.mode - name: Mode - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureManagedMachinePool is the Schema for the azuremanagedmachinepools - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedMachinePoolSpec defines the desired state of - AzureManagedMachinePool. - properties: - availabilityZones: - description: AvailabilityZones - Availability zones for nodes. Must - use VirtualMachineScaleSets AgentPoolType. - items: - type: string - type: array - enableNodePublicIP: - description: EnableNodePublicIP controls whether or not nodes in the - pool each have a public IP address. - type: boolean - enableUltraSSD: - description: EnableUltraSSD enables the storage type UltraSSD_LRS - for the agent pool. - type: boolean - maxPods: - description: MaxPods specifies the kubelet --max-pods configuration - for the node pool. - format: int32 - type: integer - mode: - description: 'Mode - represents mode of an agent pool. Possible values - include: System, User.' - enum: - - System - - User - type: string - name: - description: Name - name of the agent pool. If not specified, CAPZ - uses the name of the CR as the agent pool name. - type: string - nodeLabels: - additionalProperties: - type: string - description: Node labels - labels for all of the nodes present in - node pool - type: object - nodePublicIPPrefixID: - description: NodePublicIPPrefixID specifies the public IP prefix resource - ID which VM nodes should use IPs from. - type: string - osDiskSizeGB: - description: OSDiskSizeGB is the disk size for every machine in this - agent pool. If you specify 0, it will apply the default osDisk size - according to the vmSize specified. - format: int32 - type: integer - osDiskType: - default: Managed - description: OsDiskType specifies the OS disk type for each node in - the pool. Allowed values are 'Ephemeral' and 'Managed'. - enum: - - Ephemeral - - Managed - type: string - osType: - description: 'OSType specifies the virtual machine operating system. - Default to Linux. Possible values include: ''Linux'', ''Windows''' - enum: - - Linux - - Windows - type: string - providerIDList: - description: ProviderIDList is the unique identifier as specified - by the cloud provider. - items: - type: string - type: array - scaleSetPriority: - description: 'ScaleSetPriority specifies the ScaleSetPriority value. - Default to Regular. Possible values include: ''Regular'', ''Spot''' - enum: - - Regular - - Spot - type: string - scaling: - description: Scaling specifies the autoscaling parameters for the - node pool. - properties: - maxSize: - format: int32 - type: integer - minSize: - format: int32 - type: integer - type: object - sku: - description: SKU is the size of the VMs in the node pool. - type: string - taints: - description: Taints specifies the taints for nodes present in this - agent pool. - items: - description: Taint represents a Kubernetes taint. - properties: - effect: - description: Effect specifies the effect for the taint - enum: - - NoSchedule - - NoExecute - - PreferNoSchedule - type: string - key: - description: Key is the key of the taint - type: string - value: - description: Value is the value of the taint - type: string - required: - - effect - - key - - value - type: object - type: array - required: - - mode - - sku - type: object - status: - description: AzureManagedMachinePoolStatus defines the observed state - of AzureManagedMachinePool. - properties: - conditions: - description: Conditions defines current service state of the AzureManagedControlPlane. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - errorMessage: - description: Any transient errors that occur during the reconciliation - of Machines can be added as events to the Machine object and/or - logged in the controller's output. - type: string - errorReason: - description: Any transient errors that occur during the reconciliation - of Machines can be added as events to the Machine object and/or - logged in the controller's output. - type: string - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure - long-running operations so they can be continued on the next reconciliation - loop. - items: - description: Future contains the data needed for an Azure long-running - operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest - Future. - type: string - name: - description: Name is the name of the Azure resource. Together - with the service name, this forms the unique identifier for - the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the - resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together - with the name of the resource, this forms the unique identifier - for the future. - type: string - type: - description: Type describes the type of future, such as update, - create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: unapproved - controller-gen.kubebuilder.io/version: v0.5.0 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: azurepodidentityexceptions.aadpodidentity.k8s.io -spec: - group: aadpodidentity.k8s.io - names: - kind: AzurePodIdentityException - listKind: AzurePodIdentityExceptionList - plural: azurepodidentityexceptions - singular: azurepodidentityexception - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: AzurePodIdentityException contains the pod selectors for all - pods that don't require NMI to process and request token on their behalf. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzurePodIdentityExceptionSpec matches pods with the selector - defined. If request originates from a pod that matches the selector, - nmi will proxy the request and send response back without any validation. - properties: - metadata: - type: object - podLabels: - additionalProperties: - type: string - type: object - type: object - status: - description: AzurePodIdentityExceptionStatus contains the status of an - AzurePodIdentityException. - properties: - metadata: - type: object - status: - type: string - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-manager - namespace: capz-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-leader-election-role - namespace: capz-system -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-aad-pod-id-nmi-role -rules: -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - get - - list -- apiGroups: - - "" - resources: - - pods - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - get -- apiGroups: - - aadpodidentity.k8s.io - resources: - - azureidentitybindings - - azureidentities - - azurepodidentityexceptions - verbs: - - '*' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-manager-role -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - namespaces - verbs: - - list -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - aadpodidentity.k8s.io - resources: - - azureidentities - - azureidentities/status - verbs: - - get - - list - - watch -- apiGroups: - - aadpodidentity.k8s.io - resources: - - azureidentitybindings - - azureidentitybindings/status - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - patch - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - - machinepools/status - verbs: - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/status - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - nodes - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azureclusteridentities - - azureclusteridentities/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azureclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azureclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachinepoolmachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachinepoolmachines/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachinepools/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachines/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachinetemplates - - azuremachinetemplates/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedcontrolplanes - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedcontrolplanes/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedmachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedmachinepools/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-leader-election-rolebinding - namespace: capz-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capz-leader-election-role -subjects: -- kind: ServiceAccount - name: capz-manager - namespace: capz-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - k8s-app: capz-aad-pod-id-nmi-binding - name: capz-aad-pod-id-nmi-binding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capz-aad-pod-id-nmi-role -subjects: -- kind: ServiceAccount - name: capz-manager - namespace: capz-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capz-manager-role -subjects: -- kind: ServiceAccount - name: capz-manager - namespace: capz-system ---- -apiVersion: v1 -data: - client-id: ${AZURE_CLIENT_ID_B64:=""} - client-secret: ${AZURE_CLIENT_SECRET_B64:=""} - subscription-id: ${AZURE_SUBSCRIPTION_ID_B64:=""} - tenant-id: ${AZURE_TENANT_ID_B64:=""} -kind: Secret -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-manager-bootstrap-credentials - namespace: capz-system -type: Opaque ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-webhook-service - namespace: capz-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-azure ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - aadpodidbinding: capz-controller-aadpodidentity-selector - cluster.x-k8s.io/provider: infrastructure-azure - control-plane: capz-controller-manager - name: capz-controller-manager - namespace: capz-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-azure - control-plane: capz-controller-manager - template: - metadata: - annotations: - kubectl.kubernetes.io/default-container: manager - labels: - aadpodidbinding: capz-controller-aadpodidentity-selector - cluster.x-k8s.io/provider: infrastructure-azure - control-plane: capz-controller-manager - spec: - containers: - - args: - - --leader-elect - - --metrics-bind-addr=localhost:8080 - - --feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},AKS=${EXP_AKS:=false} - - --v=0 - env: - - name: AZURE_SUBSCRIPTION_ID - valueFrom: - secretKeyRef: - key: subscription-id - name: capz-manager-bootstrap-credentials - - name: AZURE_TENANT_ID - valueFrom: - secretKeyRef: - key: tenant-id - name: capz-manager-bootstrap-credentials - - name: AZURE_CLIENT_ID - valueFrom: - secretKeyRef: - key: client-id - name: capz-manager-bootstrap-credentials - - name: AZURE_CLIENT_SECRET - valueFrom: - secretKeyRef: - key: client-secret - name: capz-manager-bootstrap-credentials - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - image: registry.k8s.io/cluster-api-azure/cluster-api-azure-controller:v1.6.3 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - initialDelaySeconds: 10 - periodSeconds: 10 - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - initialDelaySeconds: 10 - periodSeconds: 10 - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - serviceAccountName: capz-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: capz-webhook-service-cert ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - component: nmi - k8s-app: aad-pod-id - tier: node - name: capz-nmi - namespace: capz-system -spec: - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-azure - component: nmi - tier: node - template: - metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - component: nmi - tier: node - spec: - containers: - - args: - - --node=$(NODE_NAME) - - --operation-mode=managed - - --forceNamespaced - - --http-probe-port=8085 - env: - - name: FORCENAMESPACED - value: "true" - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: LOG_LEVEL - value: DEBUG - image: mcr.microsoft.com/oss/azure/aad-pod-identity/nmi:v1.8.14 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: 8085 - initialDelaySeconds: 10 - periodSeconds: 5 - name: nmi - resources: - limits: - cpu: 200m - memory: 512Mi - requests: - cpu: 100m - memory: 256Mi - securityContext: - capabilities: - add: - - DAC_READ_SEARCH - - NET_ADMIN - - NET_RAW - drop: - - ALL - runAsUser: 0 - volumeMounts: - - mountPath: /run/xtables.lock - name: iptableslock - - mountPath: /etc/default - name: default-path - readOnly: true - - mountPath: /etc/default/kubelet - name: kubelet-config - readOnly: true - dnsPolicy: ClusterFirstWithHostNet - hostNetwork: true - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: capz-manager - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - hostPath: - path: /run/xtables.lock - type: FileOrCreate - name: iptableslock - - hostPath: - path: /etc/default - type: DirectoryOrCreate - name: default-path - - hostPath: - path: /etc/default/kubelet - type: FileOrCreate - name: kubelet-config - updateStrategy: - type: RollingUpdate ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-serving-cert - namespace: capz-system -spec: - dnsNames: - - capz-webhook-service.capz-system.svc - - capz-webhook-service.capz-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capz-selfsigned-issuer - secretName: capz-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-selfsigned-issuer - namespace: capz-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azurecluster - failurePolicy: Fail - matchPolicy: Equivalent - name: default.azurecluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azureclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azureclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: default.azureclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azureclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: default.azuremachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: default.azuremachinetemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachinetemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachinepool - failurePolicy: Fail - name: default.azuremachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azuremanagedcontrolplane - failurePolicy: Fail - name: default.azuremanagedcontrolplanes.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremanagedcontrolplanes - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azuremanagedmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: default.azuremanagedmachinepools.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremanagedmachinepools - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azurecluster - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.azurecluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azureclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azureclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.azureclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azureclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.azuremachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.azuremachinetemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachinetemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachinepool - failurePolicy: Fail - name: validation.azuremachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachinepoolmachine - failurePolicy: Fail - name: azuremachinepoolmachine.kb.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachinepoolmachines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremanagedcluster - failurePolicy: Fail - name: validation.azuremanagedclusters.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - UPDATE - resources: - - azuremanagedclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremanagedcontrolplane - failurePolicy: Fail - name: validation.azuremanagedcontrolplanes.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremanagedcontrolplanes - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremanagedmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.azuremanagedmachinepools.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - UPDATE - - DELETE - resources: - - azuremanagedmachinepools - sideEffects: None diff --git a/packages/cluster-api-provider-azure/bundle/config/upstream/metadata.yaml b/packages/cluster-api-provider-azure/bundle/config/upstream/metadata.yaml deleted file mode 100644 index 3d853b2b85..0000000000 --- a/packages/cluster-api-provider-azure/bundle/config/upstream/metadata.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# maps release series of major.minor to cluster-api contract version -# the contract version may change between minor or major versions, but *not* -# between patch versions. -# -# update this file only when a new major or minor version is released -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -releaseSeries: - - major: 0 - minor: 3 - contract: v1alpha2 - - major: 0 - minor: 4 - contract: v1alpha3 - - major: 0 - minor: 5 - contract: v1alpha4 - - major: 1 - minor: 0 - contract: v1beta1 - - major: 1 - minor: 1 - contract: v1beta1 - - major: 1 - minor: 2 - contract: v1beta1 - - major: 1 - minor: 3 - contract: v1beta1 - - major: 1 - minor: 4 - contract: v1beta1 - - major: 1 - minor: 5 - contract: v1beta1 - - major: 1 - minor: 6 - contract: v1beta1 diff --git a/packages/cluster-api-provider-azure/bundle/config/values.yaml b/packages/cluster-api-provider-azure/bundle/config/values.yaml deleted file mode 100644 index f834e4a485..0000000000 --- a/packages/cluster-api-provider-azure/bundle/config/values.yaml +++ /dev/null @@ -1,10 +0,0 @@ -#@data/values-schema ---- - -capzControllerManager: - #@schema/desc "Configures the HTTP_PROXY environment variable on capz-controller-manager." - httpProxy: "" - #@schema/desc "Configures the HTTPS_PROXY environment variable on capz-controller-manager." - httpsProxy: "" - #@schema/desc "Configures the NO_PROXY environment variable on capz-controller-manager." - noProxy: "" diff --git a/packages/cluster-api-provider-azure/metadata.yaml b/packages/cluster-api-provider-azure/metadata.yaml deleted file mode 100644 index 98c812812e..0000000000 --- a/packages/cluster-api-provider-azure/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: cluster-api-provider-azure.tanzu.vmware.com - namespace: cluster-api-provider-azure -spec: - displayName: "cluster-api-provider-azure" - longDescription: "Cluster API implementation for Microsoft Azure" - shortDescription: "Cluster management for Azure" - providerName: VMware - maintainers: - - name: "" - categories: - - "cluster management" diff --git a/packages/cluster-api-provider-azure/package.yaml b/packages/cluster-api-provider-azure/package.yaml deleted file mode 100644 index 30b5d688bf..0000000000 --- a/packages/cluster-api-provider-azure/package.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: cluster-api-provider-azure.tanzu.vmware.com - namespace: cluster-api-provider-azure -spec: - refName: cluster-api-provider-azure.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} - valuesSchema: - openAPIv3: - type: object - additionalProperties: false - properties: - capzControllerManager: - type: object - additionalProperties: false - properties: - httpProxy: - type: string - description: Configures the HTTP_PROXY environment variable on capz-controller-manager. - default: "" - httpsProxy: - type: string - description: Configures the HTTPS_PROXY environment variable on capz-controller-manager. - default: "" - noProxy: - type: string - description: Configures the NO_PROXY environment variable on capz-controller-manager. - default: "" diff --git a/packages/cluster-api-provider-azure/test/go.mod b/packages/cluster-api-provider-azure/test/go.mod deleted file mode 100644 index 962ce3514f..0000000000 --- a/packages/cluster-api-provider-azure/test/go.mod +++ /dev/null @@ -1,25 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/packages/cluster-api-provider-azure/test - -go 1.18 - -require ( - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - github.com/vmware-tanzu/tanzu-framework/test/pkg v0.0.0-00010101000000-000000000000 -) - -require ( - github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect -) - -replace github.com/vmware-tanzu/tanzu-framework/test/pkg => ../../../test/pkg diff --git a/packages/cluster-api-provider-azure/test/go.sum b/packages/cluster-api-provider-azure/test/go.sum deleted file mode 100644 index 2141875765..0000000000 --- a/packages/cluster-api-provider-azure/test/go.sum +++ /dev/null @@ -1,116 +0,0 @@ -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/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 h1:aRd8M7HJVZOqn/vhOzrGcQH0lNAMkqMn+pXUYkatmcA= -github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -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/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= -github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -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/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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/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.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e h1:3i3ny04XV6HbZ2N1oIBw1UBYATHAOpo4tfTF83JM3Z0= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/packages/cluster-api-provider-azure/test/unit/overlay_test.go b/packages/cluster-api-provider-azure/test/unit/overlay_test.go deleted file mode 100644 index e20db82596..0000000000 --- a/packages/cluster-api-provider-azure/test/unit/overlay_test.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -const ( - packageRoot = "../.." -) - -var _ = Describe("Cluster-API Provider Azure Ytt Templating", func() { - var paths []string - var values string - - BeforeEach(func() { - paths = []string{ - filepath.Join(packageRoot, "bundle", "config"), - } - }) - - Context("when the httpProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capzControllerManager: - httpProxy: http://127.0.0.1:3124` - }) - It("adds HTTP_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capz-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='AZURE_SUBSCRIPTION_ID')].valueFrom.secretKeyRef.key", - "subscription-id", - )) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')].value", - "http://127.0.0.1:3124", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')]")) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')]")) - }) - }) - - Context("when the httpsProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capzControllerManager: - httpsProxy: https://127.0.0.1:3124` - }) - It("adds HTTPS_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capz-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='AZURE_SUBSCRIPTION_ID')].valueFrom.secretKeyRef.key", - "subscription-id", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')]")) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')].value", - "https://127.0.0.1:3124", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')]")) - }) - }) - - Context("when the noProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capzControllerManager: - noProxy: 10.0.0.0/16,127.0.0.1` - }) - It("adds NO_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capz-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='AZURE_SUBSCRIPTION_ID')].valueFrom.secretKeyRef.key", - "subscription-id", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')]")) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')]")) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')].value", - "10.0.0.0/16,127.0.0.1", - )) - }) - }) -}) diff --git a/packages/cluster-api-provider-azure/test/unit/unit_suite_test.go b/packages/cluster-api-provider-azure/test/unit/unit_suite_test.go deleted file mode 100644 index 0cff203a34..0000000000 --- a/packages/cluster-api-provider-azure/test/unit/unit_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestUnit(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Cluster API Provider Azure Unit Suite") -} diff --git a/packages/cluster-api-provider-azure/vendir.lock.yml b/packages/cluster-api-provider-azure/vendir.lock.yml deleted file mode 100644 index 7567a29c8c..0000000000 --- a/packages/cluster-api-provider-azure/vendir.lock.yml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - githubRelease: - url: https://api.github.com/repos/kubernetes-sigs/cluster-api-provider-azure/releases/91926745 - path: . - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/cluster-api-provider-azure/vendir.yml b/packages/cluster-api-provider-azure/vendir.yml deleted file mode 100644 index 6808a32b4b..0000000000 --- a/packages/cluster-api-provider-azure/vendir.yml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: . - githubRelease: - slug: kubernetes-sigs/cluster-api-provider-azure - tag: v1.6.3 - disableAutoChecksumValidation: true - includePaths: - - infrastructure-components.yaml - - metadata.yaml diff --git a/packages/cluster-api-provider-docker/Makefile b/packages/cluster-api-provider-docker/Makefile deleted file mode 100644 index 047b729714..0000000000 --- a/packages/cluster-api-provider-docker/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/cluster-api-provider-docker/README.md b/packages/cluster-api-provider-docker/README.md deleted file mode 100644 index da6fe65873..0000000000 --- a/packages/cluster-api-provider-docker/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# cluster-api-provider-docker Package - -This package provides a docker based reference implementation of an -infrastructure provider for the Cluster API project using -[cluster-api-provider-docker](https://github.com/kubernetes-sigs/cluster-api/tree/main/test/infrastructure/docker). - -## Components - -* capd-controller-manager - -## Usage Example - -To learn more about cluster-api-provider-docker visit -. diff --git a/packages/cluster-api-provider-docker/bundle/config/overlay/add-pod-security-namespace-labels.yaml b/packages/cluster-api-provider-docker/bundle/config/overlay/add-pod-security-namespace-labels.yaml deleted file mode 100644 index 5e5b814ded..0000000000 --- a/packages/cluster-api-provider-docker/bundle/config/overlay/add-pod-security-namespace-labels.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Namespace", "metadata": {"name": "capd-system"}}) ---- -metadata: - labels: - #@overlay/match missing_ok=True - pod-security.kubernetes.io/enforce: privileged - #@overlay/match missing_ok=True - pod-security.kubernetes.io/warn: privileged - #@overlay/match missing_ok=True - pod-security.kubernetes.io/audit: privileged diff --git a/packages/cluster-api-provider-docker/bundle/config/overlay/set-feature-gates.yaml b/packages/cluster-api-provider-docker/bundle/config/overlay/set-feature-gates.yaml deleted file mode 100644 index 15bbc2495e..0000000000 --- a/packages/cluster-api-provider-docker/bundle/config/overlay/set-feature-gates.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capd-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - args: - #@overlay/match by=overlay.index(2) - #@overlay/replace - - "--feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},ClusterTopology=${CLUSTER_TOPOLOGY:=true}" diff --git a/packages/cluster-api-provider-docker/bundle/config/upstream/infrastructure-components-development.yaml b/packages/cluster-api-provider-docker/bundle/config/upstream/infrastructure-components-development.yaml deleted file mode 100644 index 46a3ee05f0..0000000000 --- a/packages/cluster-api-provider-docker/bundle/config/upstream/infrastructure-components-development.yaml +++ /dev/null @@ -1,2537 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - control-plane: controller-manager - name: capd-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: infrastructure-docker - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: dockerclusters.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capd-webhook-service - namespace: capd-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: DockerCluster - listKind: DockerClusterList - plural: dockerclusters - singular: dockercluster - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: DockerCluster is the Schema for the dockerclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server is serving. - type: string - port: - description: Port is the port on which the API server is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are not usulaly defined on the spec. The - docker provider is special since failure domains don't mean anything - in a local docker environment. Instead, the docker cluster controller - will simply copy these into the Status and allow the Cluster API - controllers to do what they will with the defined failure domains. - type: object - type: object - status: - description: DockerClusterStatus defines the observed state of DockerCluster. - properties: - conditions: - description: Conditions defines current service state of the DockerCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains don't mean much in CAPD since it's all - local, but we can see how the rest of cluster API will use this - if we populate it. - type: object - ready: - description: Ready denotes that the docker cluster (infrastructure) - is ready. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerCluster - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: DockerCluster is the Schema for the dockerclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server is serving. - type: string - port: - description: Port is the port on which the API server is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are not usulaly defined on the spec. The - docker provider is special since failure domains don't mean anything - in a local docker environment. Instead, the docker cluster controller - will simply copy these into the Status and allow the Cluster API - controllers to do what they will with the defined failure domains. - type: object - loadBalancer: - description: LoadBalancer allows defining configurations for the cluster - load balancer. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull - the haproxy image from. if not set, "kindest" will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the haproxy - image. if not set, "v20210715-a6da3463" will be used instead. - type: string - type: object - type: object - status: - description: DockerClusterStatus defines the observed state of DockerCluster. - properties: - conditions: - description: Conditions defines current service state of the DockerCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains don't mean much in CAPD since it's all - local, but we can see how the rest of cluster API will use this - if we populate it. - type: object - ready: - description: Ready denotes that the docker cluster (infrastructure) - is ready. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .metadata.labels['cluster\.x-k8s\.io/cluster-name'] - name: Cluster - type: string - - description: Time duration since creation of DockerCluster - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: DockerCluster is the Schema for the dockerclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server is serving. - type: string - port: - description: Port is the port on which the API server is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are usually not defined in the spec. The - docker provider is special since failure domains don't mean anything - in a local docker environment. Instead, the docker cluster controller - will simply copy these into the Status and allow the Cluster API - controllers to do what they will with the defined failure domains. - type: object - loadBalancer: - description: LoadBalancer allows defining configurations for the cluster - load balancer. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull - the haproxy image from. if not set, "kindest" will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the haproxy - image. if not set, "v20210715-a6da3463" will be used instead. - type: string - type: object - type: object - status: - description: DockerClusterStatus defines the observed state of DockerCluster. - properties: - conditions: - description: Conditions defines current service state of the DockerCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains don't mean much in CAPD since it's all - local, but we can see how the rest of cluster API will use this - if we populate it. - type: object - ready: - description: Ready denotes that the docker cluster (infrastructure) - is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: infrastructure-docker - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: dockerclustertemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capd-webhook-service - namespace: capd-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - kind: DockerClusterTemplate - listKind: DockerClusterTemplateList - plural: dockerclustertemplates - singular: dockerclustertemplate - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Time duration since creation of DockerClusterTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: DockerClusterTemplate is the Schema for the dockerclustertemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterTemplateSpec defines the desired state of DockerClusterTemplate. - properties: - template: - description: DockerClusterTemplateResource describes the data needed - to create a DockerCluster from a template. - properties: - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint - used to communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server - is serving. - type: string - port: - description: Port is the port on which the API server - is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster - API failure domains. It allows controllers to understand - how many failure domains a cluster can optionally span - across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes - an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure - domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are not usulaly defined on the - spec. The docker provider is special since failure domains - don't mean anything in a local docker environment. Instead, - the docker cluster controller will simply copy these into - the Status and allow the Cluster API controllers to do what - they will with the defined failure domains. - type: object - loadBalancer: - description: LoadBalancer allows defining configurations for - the cluster load balancer. - properties: - imageRepository: - description: ImageRepository sets the container registry - to pull the haproxy image from. if not set, "kindest" - will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the - haproxy image. if not set, "v20210715-a6da3463" will - be used instead. - type: string - type: object - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerClusterTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: DockerClusterTemplate is the Schema for the dockerclustertemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterTemplateSpec defines the desired state of DockerClusterTemplate. - properties: - template: - description: DockerClusterTemplateResource describes the data needed - to create a DockerCluster from a template. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint - used to communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server - is serving. - type: string - port: - description: Port is the port on which the API server - is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster - API failure domains. It allows controllers to understand - how many failure domains a cluster can optionally span - across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes - an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure - domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are usually not defined in the - spec. The docker provider is special since failure domains - don't mean anything in a local docker environment. Instead, - the docker cluster controller will simply copy these into - the Status and allow the Cluster API controllers to do what - they will with the defined failure domains. - type: object - loadBalancer: - description: LoadBalancer allows defining configurations for - the cluster load balancer. - properties: - imageRepository: - description: ImageRepository sets the container registry - to pull the haproxy image from. if not set, "kindest" - will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the - haproxy image. if not set, "v20210715-a6da3463" will - be used instead. - type: string - type: object - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: infrastructure-docker - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: dockermachinepools.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capd-webhook-service - namespace: capd-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: DockerMachinePool - listKind: DockerMachinePoolList - plural: dockermachinepools - singular: dockermachinepool - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: DockerMachinePool is the Schema for the dockermachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachinePoolSpec defines the desired state of DockerMachinePool. - properties: - providerID: - description: ProviderID is the identification ID of the Machine Pool - type: string - providerIDList: - description: ProviderIDList is the list of identification IDs of machine - instances managed by this Machine Pool - items: - type: string - type: array - template: - description: Template contains the details used to build a replica - machine within the Machine Pool - properties: - customImage: - description: CustomImage allows customizing the container image - that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for - the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. - This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath - doesn't exist, then runtimes should report error. If the - hostpath is a symbolic link, runtimes should follow the - symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly - created machine. This can be used to speed up tests by avoiding - e.g. to download CNI images on all the containers. - items: - type: string - type: array - type: object - type: object - status: - description: DockerMachinePoolStatus defines the observed state of DockerMachinePool. - properties: - conditions: - description: Conditions defines current service state of the DockerMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - instances: - description: Instances contains the status for each instance in the - pool - items: - description: DockerMachinePoolInstanceStatus contains status information - about a DockerMachinePool. - properties: - addresses: - description: Addresses contains the associated addresses for - the docker machine. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping - has been run against this machine - type: boolean - instanceName: - description: InstanceName is the identification of the Machine - Instance within the Machine Pool - type: string - providerID: - description: ProviderID is the provider identification of the - Machine Pool Instance - type: string - ready: - description: Ready denotes that the machine (docker container) - is ready - type: boolean - version: - description: Version defines the Kubernetes version for the - Machine Instance - type: string - type: object - type: array - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - ready: - description: Ready denotes that the machine pool is ready - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerMachinePool - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: DockerMachinePool is the Schema for the dockermachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachinePoolSpec defines the desired state of DockerMachinePool. - properties: - providerID: - description: ProviderID is the identification ID of the Machine Pool - type: string - providerIDList: - description: ProviderIDList is the list of identification IDs of machine - instances managed by this Machine Pool - items: - type: string - type: array - template: - description: Template contains the details used to build a replica - machine within the Machine Pool - properties: - customImage: - description: CustomImage allows customizing the container image - that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for - the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. - This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath - doesn't exist, then runtimes should report error. If the - hostpath is a symbolic link, runtimes should follow the - symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly - created machine. This can be used to speed up tests by avoiding - e.g. to download CNI images on all the containers. - items: - type: string - type: array - type: object - type: object - status: - description: DockerMachinePoolStatus defines the observed state of DockerMachinePool. - properties: - conditions: - description: Conditions defines current service state of the DockerMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - instances: - description: Instances contains the status for each instance in the - pool - items: - description: DockerMachinePoolInstanceStatus contains status information - about a DockerMachinePool. - properties: - addresses: - description: Addresses contains the associated addresses for - the docker machine. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping - has been run against this machine - type: boolean - instanceName: - description: InstanceName is the identification of the Machine - Instance within the Machine Pool - type: string - providerID: - description: ProviderID is the provider identification of the - Machine Pool Instance - type: string - ready: - description: Ready denotes that the machine (docker container) - is ready - type: boolean - version: - description: Version defines the Kubernetes version for the - Machine Instance - type: string - type: object - type: array - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - ready: - description: Ready denotes that the machine pool is ready - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerMachinePool - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: DockerMachinePool is the Schema for the dockermachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachinePoolSpec defines the desired state of DockerMachinePool. - properties: - providerID: - description: ProviderID is the identification ID of the Machine Pool - type: string - providerIDList: - description: ProviderIDList is the list of identification IDs of machine - instances managed by this Machine Pool - items: - type: string - type: array - template: - description: Template contains the details used to build a replica - machine within the Machine Pool - properties: - customImage: - description: CustomImage allows customizing the container image - that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for - the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. - This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath - doesn't exist, then runtimes should report error. If the - hostpath is a symbolic link, runtimes should follow the - symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly - created machine. This can be used to speed up tests by avoiding - e.g. to download CNI images on all the containers. - items: - type: string - type: array - type: object - type: object - status: - description: DockerMachinePoolStatus defines the observed state of DockerMachinePool. - properties: - conditions: - description: Conditions defines current service state of the DockerMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - instances: - description: Instances contains the status for each instance in the - pool - items: - description: DockerMachinePoolInstanceStatus contains status information - about a DockerMachinePool. - properties: - addresses: - description: Addresses contains the associated addresses for - the docker machine. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping - has been run against this machine - type: boolean - instanceName: - description: InstanceName is the identification of the Machine - Instance within the Machine Pool - type: string - providerID: - description: ProviderID is the provider identification of the - Machine Pool Instance - type: string - ready: - description: Ready denotes that the machine (docker container) - is ready - type: boolean - version: - description: Version defines the Kubernetes version for the - Machine Instance - type: string - type: object - type: array - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - ready: - description: Ready denotes that the machine pool is ready - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: infrastructure-docker - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: dockermachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capd-webhook-service - namespace: capd-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: DockerMachine - listKind: DockerMachineList - plural: dockermachines - singular: dockermachine - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: DockerMachine is the Schema for the dockermachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineSpec defines the desired state of DockerMachine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has - been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container image that - is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the - node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. - This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath - doesn't exist, then runtimes should report error. If the hostpath - is a symbolic link, runtimes should follow the symlink and - mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created - machine. This can be used to speed up tests by avoiding e.g. to - download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID format - (docker:////) - type: string - type: object - status: - description: DockerMachineStatus defines the observed state of DockerMachine. - properties: - addresses: - description: Addresses contains the associated addresses for the docker - machine. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the DockerMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - loadBalancerConfigured: - description: LoadBalancerConfigured denotes that the machine has been - added to the load balancer - type: boolean - ready: - description: Ready denotes that the machine (docker container) is - ready - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerMachine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: DockerMachine is the Schema for the dockermachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineSpec defines the desired state of DockerMachine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has - been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container image that - is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the - node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. - This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath - doesn't exist, then runtimes should report error. If the hostpath - is a symbolic link, runtimes should follow the symlink and - mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created - machine. This can be used to speed up tests by avoiding e.g. to - download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID format - (docker:////) - type: string - type: object - status: - description: DockerMachineStatus defines the observed state of DockerMachine. - properties: - addresses: - description: Addresses contains the associated addresses for the docker - machine. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the DockerMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - loadBalancerConfigured: - description: LoadBalancerConfigured denotes that the machine has been - added to the load balancer - type: boolean - ready: - description: Ready denotes that the machine (docker container) is - ready - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .metadata.labels['cluster\.x-k8s\.io/cluster-name'] - name: Cluster - type: string - - description: Time duration since creation of DockerMachine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: DockerMachine is the Schema for the dockermachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineSpec defines the desired state of DockerMachine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has - been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container image that - is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the - node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. - This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath - doesn't exist, then runtimes should report error. If the hostpath - is a symbolic link, runtimes should follow the symlink and - mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created - machine. This can be used to speed up tests by avoiding e.g. to - download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID format - (docker:////) - type: string - type: object - status: - description: DockerMachineStatus defines the observed state of DockerMachine. - properties: - addresses: - description: Addresses contains the associated addresses for the docker - machine. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the DockerMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - loadBalancerConfigured: - description: LoadBalancerConfigured denotes that the machine has been - added to the load balancer - type: boolean - ready: - description: Ready denotes that the machine (docker container) is - ready - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: infrastructure-docker - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: dockermachinetemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capd-webhook-service - namespace: capd-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: DockerMachineTemplate - listKind: DockerMachineTemplateList - plural: dockermachinetemplates - singular: dockermachinetemplate - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: DockerMachineTemplate is the Schema for the dockermachinetemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineTemplateSpec defines the desired state of DockerMachineTemplate. - properties: - template: - description: DockerMachineTemplateResource describes the data needed - to create a DockerMachine from a template. - properties: - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping - has been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container - image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points - for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into - a container. This is a simplified version of kind v1alpha4.Mount - types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath - doesn't exist, then runtimes should report error. - If the hostpath is a symbolic link, runtimes should - follow the symlink and mount the real destination - to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a - newly created machine. This can be used to speed up tests - by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID - format (docker:////) - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - additionalPrinterColumns: - - description: Time duration since creation of DockerMachineTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: DockerMachineTemplate is the Schema for the dockermachinetemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineTemplateSpec defines the desired state of DockerMachineTemplate. - properties: - template: - description: DockerMachineTemplateResource describes the data needed - to create a DockerMachine from a template. - properties: - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping - has been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container - image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points - for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into - a container. This is a simplified version of kind v1alpha4.Mount - types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath - doesn't exist, then runtimes should report error. - If the hostpath is a symbolic link, runtimes should - follow the symlink and mount the real destination - to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a - newly created machine. This can be used to speed up tests - by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID - format (docker:////) - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerMachineTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: DockerMachineTemplate is the Schema for the dockermachinetemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineTemplateSpec defines the desired state of DockerMachineTemplate. - properties: - template: - description: DockerMachineTemplateResource describes the data needed - to create a DockerMachine from a template. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping - has been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container - image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points - for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into - a container. This is a simplified version of kind v1alpha4.Mount - types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath - doesn't exist, then runtimes should report error. - If the hostpath is a symbolic link, runtimes should - follow the symlink and mount the real destination - to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a - newly created machine. This can be used to speed up tests - by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID - format (docker:////) - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-manager - namespace: capd-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-leader-election-role - namespace: capd-system -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-manager-role -rules: -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - machines - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - - machinepools/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockerclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockerclusters/finalizers - - dockerclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockermachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockermachinepools/finalizers - - dockermachinepools/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockermachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockermachines/finalizers - - dockermachines/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-leader-election-rolebinding - namespace: capd-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capd-leader-election-role -subjects: -- kind: ServiceAccount - name: capd-manager - namespace: capd-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capd-manager-role -subjects: -- kind: ServiceAccount - name: capd-manager - namespace: capd-system ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-webhook-service - namespace: capd-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-docker ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - control-plane: controller-manager - name: capd-controller-manager - namespace: capd-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-docker - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --metrics-bind-addr=localhost:8080 - - --feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},ClusterTopology=${CLUSTER_TOPOLOGY:=false} - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_UID - valueFrom: - fieldRef: - fieldPath: metadata.uid - image: gcr.io/k8s-staging-cluster-api/capd-manager:v1.2.8 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - securityContext: - privileged: true - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - - mountPath: /var/run/docker.sock - name: dockersock - serviceAccountName: capd-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - secretName: capd-webhook-service-cert - - hostPath: - path: /var/run/docker.sock - name: dockersock ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-serving-cert - namespace: capd-system -spec: - dnsNames: - - capd-webhook-service.capd-system.svc - - capd-webhook-service.capd-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capd-selfsigned-issuer - secretName: capd-webhook-service-cert - subject: - organizations: - - k8s-sig-cluster-lifecycle ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-selfsigned-issuer - namespace: capd-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capd-webhook-service - namespace: capd-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-dockercluster - failurePolicy: Fail - matchPolicy: Equivalent - name: default.dockercluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - dockerclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capd-webhook-service - namespace: capd-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-dockerclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: default.dockerclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - dockerclustertemplates - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capd-webhook-service - namespace: capd-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-dockercluster - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.dockercluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - dockerclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capd-webhook-service - namespace: capd-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-dockerclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.dockerclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - dockerclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capd-webhook-service - namespace: capd-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-dockermachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.dockermachinetemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - dockermachinetemplates - sideEffects: None diff --git a/packages/cluster-api-provider-docker/bundle/config/upstream/metadata.yaml b/packages/cluster-api-provider-docker/bundle/config/upstream/metadata.yaml deleted file mode 100644 index 625544516d..0000000000 --- a/packages/cluster-api-provider-docker/bundle/config/upstream/metadata.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# maps release series of major.minor to cluster-api contract version -# the contract version may change between minor or major versions, but *not* -# between patch versions. -# -# update this file only when a new major or minor version is released -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: - - major: 1 - minor: 2 - contract: v1beta1 - - major: 1 - minor: 1 - contract: v1beta1 - - major: 1 - minor: 0 - contract: v1beta1 - - major: 0 - minor: 4 - contract: v1alpha4 - - major: 0 - minor: 3 - contract: v1alpha3 diff --git a/packages/cluster-api-provider-docker/bundle/config/values.yaml b/packages/cluster-api-provider-docker/bundle/config/values.yaml deleted file mode 100644 index e25fdc8014..0000000000 --- a/packages/cluster-api-provider-docker/bundle/config/values.yaml +++ /dev/null @@ -1,2 +0,0 @@ -#@data/values ---- diff --git a/packages/cluster-api-provider-docker/metadata.yaml b/packages/cluster-api-provider-docker/metadata.yaml deleted file mode 100644 index 84ef0fb5c9..0000000000 --- a/packages/cluster-api-provider-docker/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: cluster-api-provider-docker.tanzu.vmware.com - namespace: cluster-api-provider-docker -spec: - displayName: "cluster-api-provider-docker" - longDescription: "CAPD is a reference implementation of an infrastructure provider for the Cluster API project using Docker." - shortDescription: "Cluster management for Docker" - providerName: VMware - maintainers: - - name: "" - categories: - - "cluster management" diff --git a/packages/cluster-api-provider-docker/package.yaml b/packages/cluster-api-provider-docker/package.yaml deleted file mode 100644 index 22c103ddfd..0000000000 --- a/packages/cluster-api-provider-docker/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: cluster-api-provider-docker.tanzu.vmware.com - namespace: cluster-api-provider-docker -spec: - refName: cluster-api-provider-docker.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/cluster-api-provider-docker/test/go.mod b/packages/cluster-api-provider-docker/test/go.mod deleted file mode 100644 index f63288aa8a..0000000000 --- a/packages/cluster-api-provider-docker/test/go.mod +++ /dev/null @@ -1,25 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/packages/cluster-api-provider-docker/test - -go 1.18 - -require ( - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - github.com/vmware-tanzu/tanzu-framework/test/pkg v0.0.0-00010101000000-000000000000 -) - -require ( - github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect -) - -replace github.com/vmware-tanzu/tanzu-framework/test/pkg => ../../../test/pkg diff --git a/packages/cluster-api-provider-docker/test/go.sum b/packages/cluster-api-provider-docker/test/go.sum deleted file mode 100644 index 2141875765..0000000000 --- a/packages/cluster-api-provider-docker/test/go.sum +++ /dev/null @@ -1,116 +0,0 @@ -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/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 h1:aRd8M7HJVZOqn/vhOzrGcQH0lNAMkqMn+pXUYkatmcA= -github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -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/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= -github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -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/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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/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.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e h1:3i3ny04XV6HbZ2N1oIBw1UBYATHAOpo4tfTF83JM3Z0= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/packages/cluster-api-provider-docker/test/unit/overlay_test.go b/packages/cluster-api-provider-docker/test/unit/overlay_test.go deleted file mode 100644 index e3d74fe7a1..0000000000 --- a/packages/cluster-api-provider-docker/test/unit/overlay_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "path/filepath" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -const ( - packageRoot = "../.." -) - -var _ = Describe("Cluster-API Provider Docker Ytt Templating", func() { - var paths []string - - BeforeEach(func() { - paths = []string{ - filepath.Join(packageRoot, "bundle", "config"), - } - }) - - It("enables ClusterTopology feature gates on capd-controller-manager Deployment", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, nil) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capd-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].args[2]", - "--feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},ClusterTopology=${CLUSTER_TOPOLOGY:=true}", - )) - }) -}) diff --git a/packages/cluster-api-provider-docker/test/unit/unit_suite_test.go b/packages/cluster-api-provider-docker/test/unit/unit_suite_test.go deleted file mode 100644 index 5187423b54..0000000000 --- a/packages/cluster-api-provider-docker/test/unit/unit_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestUnit(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Cluster API Provider Docker Unit Suite") -} diff --git a/packages/cluster-api-provider-docker/vendir.lock.yml b/packages/cluster-api-provider-docker/vendir.lock.yml deleted file mode 100644 index 199970a1e8..0000000000 --- a/packages/cluster-api-provider-docker/vendir.lock.yml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - githubRelease: - url: https://api.github.com/repos/kubernetes-sigs/cluster-api/releases/86051101 - path: . - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/cluster-api-provider-docker/vendir.yml b/packages/cluster-api-provider-docker/vendir.yml deleted file mode 100644 index 41f3510d2f..0000000000 --- a/packages/cluster-api-provider-docker/vendir.yml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: . - githubRelease: - slug: kubernetes-sigs/cluster-api - tag: v1.2.8 - disableAutoChecksumValidation: true - includePaths: - - infrastructure-components-development.yaml - - metadata.yaml diff --git a/packages/cluster-api-provider-oci/Makefile b/packages/cluster-api-provider-oci/Makefile deleted file mode 100644 index 540a332e47..0000000000 --- a/packages/cluster-api-provider-oci/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package \ No newline at end of file diff --git a/packages/cluster-api-provider-oci/README.md b/packages/cluster-api-provider-oci/README.md deleted file mode 100644 index 248b1d7756..0000000000 --- a/packages/cluster-api-provider-oci/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# cluster-api-provider-aws Package - -This package provides consistent deployment and day 2 operations of -"self-managed" Kubernetes clusters on OCI using -[cluster-api-provider-oci](https://github.com/oracle/cluster-api-provider-oci). - -## Components - -* capoci-controller-manager - -## Configuration - -The following configuration values can be set to customize the installation. - -| Value | Required/Optional | Description | -|--------------------------------------|-------------------|------------------------------------------------------------------------------| -| `capociControllerManager.httpProxy` | Optional | Configures the HTTP_PROXY environment variable on capoci-controller-manager. | -| `capociControllerManager.httpsProxy` | Optional | Configures the HTTPS_PROXY environment variable on capoci-controller-manager. | -| `capociControllerManager.noProxy` | Optional | Configures the NO_PROXY environment variable on capoci-controller-manager. | - -## Usage Example - -To learn more about cluster-api-provider-oci visit -. diff --git a/packages/cluster-api-provider-oci/bundle/config/overlay/add-proxy-environment-variables.yaml b/packages/cluster-api-provider-oci/bundle/config/overlay/add-proxy-environment-variables.yaml deleted file mode 100644 index 1fb7535286..0000000000 --- a/packages/cluster-api-provider-oci/bundle/config/overlay/add-proxy-environment-variables.yaml +++ /dev/null @@ -1,24 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "capoci-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - env: - #@ if data.values.capociControllerManager.httpProxy != "": - - name: "HTTP_PROXY" - value: #@ data.values.capociControllerManager.httpProxy - #@ end - #@ if data.values.capociControllerManager.httpsProxy != "": - - name: "HTTPS_PROXY" - value: #@ data.values.capociControllerManager.httpsProxy - #@ end - #@ if data.values.capociControllerManager.noProxy != "": - - name: "NO_PROXY" - value: #@ data.values.capociControllerManager.noProxy - #@ end - diff --git a/packages/cluster-api-provider-oci/bundle/config/upstream/infrastructure-components.yaml b/packages/cluster-api-provider-oci/bundle/config/upstream/infrastructure-components.yaml deleted file mode 100644 index 368716e5eb..0000000000 --- a/packages/cluster-api-provider-oci/bundle/config/upstream/infrastructure-components.yaml +++ /dev/null @@ -1,3297 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager - name: cluster-api-provider-oci-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: cluster-api-provider-oci-system/capoci-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-oci - cluster.x-k8s.io/v1beta1: v1beta1 - name: ociclusters.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - service: - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - kind: OCICluster - listKind: OCIClusterList - plural: ociclusters - singular: ocicluster - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: OCICluster is the Schema for the ociclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OCIClusterSpec defines the desired state of OciCluster - properties: - compartmentId: - description: Compartment to create the cluster network. - type: string - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - definedTags: - additionalProperties: - additionalProperties: - type: string - type: object - description: 'Defined tags for this resource. Each key is predefined - and scoped to a namespace. For more information, see Resource Tags - (https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm). - Example: `{"Operations": {"CostCenter": "42"}}`' - type: object - freeformTags: - additionalProperties: - type: string - description: Free-form tags for this resource. - type: object - networkSpec: - description: NetworkSpec encapsulates all things related to OCI network. - properties: - apiServerLoadBalancer: - description: API Server LB configuration. - properties: - loadBalancerId: - description: ID of Load Balancer. - type: string - name: - description: LoadBalancer Name. - type: string - type: object - skipNetworkManagement: - description: SkipNetworkManagement defines if the networking spec(VCN - related) specified by the user needs to be reconciled(actioned-upon) - or used as it is. APIServerLB will still be reconciled. - type: boolean - vcn: - description: VCN configuration. - properties: - cidr: - description: VCN CIDR. - type: string - id: - description: VCN OCID. - type: string - internetGatewayId: - description: ID of Internet Gateway. - type: string - name: - description: VCN Name. - type: string - natGatewayId: - description: ID of Nat Gateway. - type: string - networkSecurityGroups: - description: NetworkSecurityGroups is the configuration for - the Network Security Groups required in the VCN. - items: - description: NSG defines configuration for a Network Security - Group. https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/networksecuritygroups.htm - properties: - egressRules: - description: EgressRules on the NSG. - items: - description: EgressSecurityRuleForNSG is EgressSecurityRule - for NSG. - properties: - egressRule: - description: EgressSecurityRule A rule for allowing - outbound IP packets. - properties: - description: - description: An optional description of your - choice for the rule. - type: string - destination: - description: 'Conceptually, this is the range - of IP addresses that a packet originating - from the instance can go to. Allowed values: * - IP address range in CIDR notation. For example: - `192.168.1.0/24` or `2001:0db8:0123:45::/56` Note - that IPv6 addressing is currently supported - only in certain regions. See IPv6 Addresses - (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, if - you''re setting up a security list rule - for traffic destined for a particular `Service` - through a service gateway. For example: - `oci-phx-objectstorage`.' - type: string - destinationType: - description: 'Type of destination for the - rule. The default is `CIDR_BLOCK`. Allowed - values: * `CIDR_BLOCK`: If the rule''s - `destination` is an IP address range in - CIDR notation. * `SERVICE_CIDR_BLOCK`: - If the rule''s `destination` is the `cidrBlock` - value for a Service (the rule is for - traffic destined for a particular `Service` - through a service gateway).' - type: string - icmpOptions: - description: 'IcmpOptions Optional and valid - only for ICMP and ICMPv6. Use to specify - a particular ICMP type and code as defined - in: - ICMP Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as the protocol - but omit this object, then all ICMP types - and codes are allowed. If you do provide - this object, the type is required and the - code is optional. To enable MTU negotiation - for ingress internet traffic via IPv4, make - sure to allow type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and Don''t - Fragment was Set"). If you need to specify - multiple codes for a single type, create - a separate security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows traffic - in one direction. Remember to add a corresponding - stateless rule in the other direction if - you need to support bidirectional traffic. - For example, if egress traffic allows TCP - destination port 80, there should be an - ingress rule to allow TCP source port 80. - Defaults to false, which means the rule - is stateful and a corresponding rule is - not necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. Specify - either `all` or an IPv4 protocol number - as defined in Protocol Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP ("1"), - TCP ("6"), UDP ("17"), and ICMPv6 ("58"). - type: string - tcpOptions: - description: TcpOptions Optional and valid - only for TCP. Use to specify particular - destination ports for TCP rules. If you - specify TCP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and valid - only for UDP. Use to specify particular - destination ports for UDP rules. If you - specify UDP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - type: object - id: - description: 'EgressSecurityRule ID for NSG. Deprecated: - this field is not populated and used during - reconciliation' - type: string - type: object - type: array - id: - description: NSG OCID. - type: string - ingressRules: - description: IngressRules on the NSG. - items: - description: IngressSecurityRuleForNSG is IngressSecurityRule - for NSG - properties: - id: - description: 'IngressSecurityRule ID for NSG. - Deprecated: this field is not populated and - used during reconciliation' - type: string - ingressRule: - description: IngressSecurityRule A rule for allowing - inbound IP packets. - properties: - description: - description: An optional description of your - choice for the rule. - type: string - icmpOptions: - description: 'IcmpOptions Optional and valid - only for ICMP and ICMPv6. Use to specify - a particular ICMP type and code as defined - in: - ICMP Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as the protocol - but omit this object, then all ICMP types - and codes are allowed. If you do provide - this object, the type is required and the - code is optional. To enable MTU negotiation - for ingress internet traffic via IPv4, make - sure to allow type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and Don''t - Fragment was Set"). If you need to specify - multiple codes for a single type, create - a separate security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows traffic - in one direction. Remember to add a corresponding - stateless rule in the other direction if - you need to support bidirectional traffic. - For example, if ingress traffic allows TCP - destination port 80, there should be an - egress rule to allow TCP source port 80. - Defaults to false, which means the rule - is stateful and a corresponding rule is - not necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. Specify - either `all` or an IPv4 protocol number - as defined in Protocol Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP ("1"), - TCP ("6"), UDP ("17"), and ICMPv6 ("58"). - type: string - source: - description: 'Conceptually, this is the range - of IP addresses that a packet coming into - the instance can come from. Allowed values: * - IP address range in CIDR notation. For example: - `192.168.1.0/24` or `2001:0db8:0123:45::/56`. IPv6 - addressing is supported for all commercial - and government regions. See IPv6 Addresses - (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, if - you''re setting up a security list rule - for traffic coming from a particular `Service` - through a service gateway. For example: - `oci-phx-objectstorage`.' - type: string - sourceType: - description: 'Type of source for the rule. - The default is `CIDR_BLOCK`. * `CIDR_BLOCK`: - If the rule''s `source` is an IP address - range in CIDR notation. * `SERVICE_CIDR_BLOCK`: - If the rule''s `source` is the `cidrBlock` - value for a Service (the rule is for - traffic coming from a particular `Service` - through a service gateway).' - type: string - tcpOptions: - description: TcpOptions Optional and valid - only for TCP. Use to specify particular - destination ports for TCP rules. If you - specify TCP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and valid - only for UDP. Use to specify particular - destination ports for UDP rules. If you - specify UDP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - type: object - type: object - type: array - name: - description: NSG Name. - type: string - role: - description: Role defines the NSG role (eg. control-plane, - control-plane-endpoint, service-lb, worker). - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - privateRouteTableId: - description: ID of Private Route Table. - type: string - publicRouteTableId: - description: ID of Public Route Table. - type: string - serviceGatewayId: - description: ID of Service Gateway. - type: string - subnets: - description: Subnets is the configuration for subnets required - in the VCN. - items: - description: Subnet defines the configuration for a network's - subnet https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/managingVCNs_topic-Overview_of_VCNs_and_Subnets.htm#Overview - properties: - cidr: - description: Subnet CIDR. - type: string - id: - description: Subnet OCID. - type: string - name: - description: Subnet Name. - type: string - role: - description: Role defines the subnet role (eg. control-plane, - control-plane-endpoint, service-lb, worker). - type: string - securityList: - description: The security list associated with Subnet. - properties: - egressRules: - description: EgressRules on the SecurityList. - items: - description: EgressSecurityRule A rule for allowing - outbound IP packets. - properties: - description: - description: An optional description of your - choice for the rule. - type: string - destination: - description: 'Conceptually, this is the range - of IP addresses that a packet originating - from the instance can go to. Allowed values: * - IP address range in CIDR notation. For example: - `192.168.1.0/24` or `2001:0db8:0123:45::/56` Note - that IPv6 addressing is currently supported - only in certain regions. See IPv6 Addresses - (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, if - you''re setting up a security list rule - for traffic destined for a particular `Service` - through a service gateway. For example: - `oci-phx-objectstorage`.' - type: string - destinationType: - description: 'Type of destination for the - rule. The default is `CIDR_BLOCK`. Allowed - values: * `CIDR_BLOCK`: If the rule''s - `destination` is an IP address range in - CIDR notation. * `SERVICE_CIDR_BLOCK`: - If the rule''s `destination` is the `cidrBlock` - value for a Service (the rule is for - traffic destined for a particular `Service` - through a service gateway).' - type: string - icmpOptions: - description: 'IcmpOptions Optional and valid - only for ICMP and ICMPv6. Use to specify - a particular ICMP type and code as defined - in: - ICMP Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as the protocol - but omit this object, then all ICMP types - and codes are allowed. If you do provide - this object, the type is required and the - code is optional. To enable MTU negotiation - for ingress internet traffic via IPv4, make - sure to allow type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and Don''t - Fragment was Set"). If you need to specify - multiple codes for a single type, create - a separate security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows traffic - in one direction. Remember to add a corresponding - stateless rule in the other direction if - you need to support bidirectional traffic. - For example, if egress traffic allows TCP - destination port 80, there should be an - ingress rule to allow TCP source port 80. - Defaults to false, which means the rule - is stateful and a corresponding rule is - not necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. Specify - either `all` or an IPv4 protocol number - as defined in Protocol Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP ("1"), - TCP ("6"), UDP ("17"), and ICMPv6 ("58"). - type: string - tcpOptions: - description: TcpOptions Optional and valid - only for TCP. Use to specify particular - destination ports for TCP rules. If you - specify TCP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and valid - only for UDP. Use to specify particular - destination ports for UDP rules. If you - specify UDP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - type: object - type: array - id: - description: ID of the SecurityList. - type: string - ingressRules: - description: IngressRules on the SecurityList. - items: - description: IngressSecurityRule A rule for allowing - inbound IP packets. - properties: - description: - description: An optional description of your - choice for the rule. - type: string - icmpOptions: - description: 'IcmpOptions Optional and valid - only for ICMP and ICMPv6. Use to specify - a particular ICMP type and code as defined - in: - ICMP Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as the protocol - but omit this object, then all ICMP types - and codes are allowed. If you do provide - this object, the type is required and the - code is optional. To enable MTU negotiation - for ingress internet traffic via IPv4, make - sure to allow type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and Don''t - Fragment was Set"). If you need to specify - multiple codes for a single type, create - a separate security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows traffic - in one direction. Remember to add a corresponding - stateless rule in the other direction if - you need to support bidirectional traffic. - For example, if ingress traffic allows TCP - destination port 80, there should be an - egress rule to allow TCP source port 80. - Defaults to false, which means the rule - is stateful and a corresponding rule is - not necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. Specify - either `all` or an IPv4 protocol number - as defined in Protocol Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP ("1"), - TCP ("6"), UDP ("17"), and ICMPv6 ("58"). - type: string - source: - description: 'Conceptually, this is the range - of IP addresses that a packet coming into - the instance can come from. Allowed values: * - IP address range in CIDR notation. For example: - `192.168.1.0/24` or `2001:0db8:0123:45::/56`. IPv6 - addressing is supported for all commercial - and government regions. See IPv6 Addresses - (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, if - you''re setting up a security list rule - for traffic coming from a particular `Service` - through a service gateway. For example: - `oci-phx-objectstorage`.' - type: string - sourceType: - description: 'Type of source for the rule. - The default is `CIDR_BLOCK`. * `CIDR_BLOCK`: - If the rule''s `source` is an IP address - range in CIDR notation. * `SERVICE_CIDR_BLOCK`: - If the rule''s `source` is the `cidrBlock` - value for a Service (the rule is for - traffic coming from a particular `Service` - through a service gateway).' - type: string - tcpOptions: - description: TcpOptions Optional and valid - only for TCP. Use to specify particular - destination ports for TCP rules. If you - specify TCP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and valid - only for UDP. Use to specify particular - destination ports for UDP rules. If you - specify UDP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - type: object - type: array - name: - description: SecurityList Name. - type: string - type: object - type: - description: Type defines the subnet type (e.g. public, - private). - type: string - required: - - name - - role - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - vcnPeering: - description: VCNPeering configuration. - properties: - drg: - description: DRG configuration refers to the DRG which has - to be created if required. If management cluster and workload - cluster shares the same DRG, this fields is not required - to be specified. - properties: - id: - description: ID is the OCID for the created DRG. - type: string - manage: - description: Manage defines whether the DRG has to be - managed(including create). If set to false(the default) - the ID has to be specified by the user to a valid DRG - ID to which the VCN has to be attached. - type: boolean - name: - description: Name is the name of the created DRG. - type: string - vcnAttachmentId: - description: VcnAttachmentId is the ID of the VCN attachment - of the DRG. The workload cluster VCN can be attached - to either the management cluster VCN if they are sharing - the same DRG or to the workload cluster DRG. - type: string - type: object - peerRouteRules: - description: PeerRouteRules defines the routing rules which - will be added to the private route tables of the workload - cluster VCN. The routes defined here will be directed to - DRG. - items: - description: PeerRouteRule defines a Route Rule to be routed - via a DRG. - properties: - vcnCIDRRange: - description: VCNCIDRRange is the CIDR Range of peer - VCN to which the workload cluster VCN will be peered. - The CIDR range is required to add the route rule in - the workload cluster VCN, the route rule will forward - any traffic to the CIDR to the DRG. - type: string - type: object - type: array - remotePeeringConnections: - description: RemotePeeringConnections defines the RPC connections - which be established with the workload cluster DRG. - items: - description: RemotePeeringConnection is used to peer VCNs - residing in different regions(typically). Remote VCN Peering - is explained here - https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/remoteVCNpeering.htm - properties: - managePeerRPC: - description: ManagePeerRPC will define if the Peer VCN - needs to be managed. If set to true a Remote Peering - Connection will be created in the Peer DRG and the - connection will be created between local and peer - RPC. - type: boolean - peerDRGId: - description: PeerDRGId defines the DRG ID of the peer. - type: string - peerRPCConnectionId: - description: PeerRPCConnectionId defines the RPC ID - of peer. If ManagePeerRPC is set to true this will - be created by Cluster API Provider for OCI, otherwise - this has be defined by the user. - type: string - peerRegionName: - description: PeerRegionName defined the region name - of Peer VCN. - type: string - rpcConnectionId: - description: RPCConnectionId is the connection ID of - the connection between peer and local RPC. - type: string - type: object - type: array - type: object - type: object - ociResourceIdentifier: - description: The unique ID which will be used to tag all the resources - created by this Cluster. The tag will be used to identify resources - belonging to this cluster. this will be auto-generated and should - not be set by the user. - type: string - region: - description: Region the cluster operates in. It must be one of available - regions in Region Identifier format. See https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm - type: string - type: object - status: - description: OCIClusterStatus defines the observed state of OCICluster - properties: - availabilityDomains: - additionalProperties: - description: OCIAvailabilityDomain contains information about an - Availability Domain (AD). - properties: - faultDomains: - description: 'FaultDomains a list of fault domain (FD) names. - Example: ["FAULT-DOMAIN-1"]' - items: - type: string - type: array - name: - description: 'Name is the AD''s full name. Example: Uocm:PHX-AD-1' - type: string - type: object - description: AvailabilityDomains encapsulates the clusters Availability - Domain (AD) information in a map where the map key is the AD name - and the struct is details about the AD. - type: object - conditions: - description: NetworkSpec encapsulates all things related to OCI network. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a slice of FailureDomains. - type: object - ready: - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-oci - cluster.x-k8s.io/v1beta1: v1beta1 - name: ociclustertemplates.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: OCIClusterTemplate - listKind: OCIClusterTemplateList - plural: ociclustertemplates - singular: ociclustertemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: OCIClusterTemplate is the Schema for the ociclustertemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OCIClusterTemplateSpec defines the desired state of OCIClusterTemplate. - properties: - template: - description: OCIClusterTemplateResource describes the data needed - to create an OCICluster from a template. - properties: - spec: - description: OCIClusterSpec defines the desired state of OciCluster - properties: - compartmentId: - description: Compartment to create the cluster network. - type: string - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint - used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - definedTags: - additionalProperties: - additionalProperties: - type: string - type: object - description: 'Defined tags for this resource. Each key is - predefined and scoped to a namespace. For more information, - see Resource Tags (https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm). - Example: `{"Operations": {"CostCenter": "42"}}`' - type: object - freeformTags: - additionalProperties: - type: string - description: Free-form tags for this resource. - type: object - networkSpec: - description: NetworkSpec encapsulates all things related to - OCI network. - properties: - apiServerLoadBalancer: - description: API Server LB configuration. - properties: - loadBalancerId: - description: ID of Load Balancer. - type: string - name: - description: LoadBalancer Name. - type: string - type: object - skipNetworkManagement: - description: SkipNetworkManagement defines if the networking - spec(VCN related) specified by the user needs to be - reconciled(actioned-upon) or used as it is. APIServerLB - will still be reconciled. - type: boolean - vcn: - description: VCN configuration. - properties: - cidr: - description: VCN CIDR. - type: string - id: - description: VCN OCID. - type: string - internetGatewayId: - description: ID of Internet Gateway. - type: string - name: - description: VCN Name. - type: string - natGatewayId: - description: ID of Nat Gateway. - type: string - networkSecurityGroups: - description: NetworkSecurityGroups is the configuration - for the Network Security Groups required in the - VCN. - items: - description: NSG defines configuration for a Network - Security Group. https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/networksecuritygroups.htm - properties: - egressRules: - description: EgressRules on the NSG. - items: - description: EgressSecurityRuleForNSG is EgressSecurityRule - for NSG. - properties: - egressRule: - description: EgressSecurityRule A rule - for allowing outbound IP packets. - properties: - description: - description: An optional description - of your choice for the rule. - type: string - destination: - description: 'Conceptually, this is - the range of IP addresses that a - packet originating from the instance - can go to. Allowed values: * IP - address range in CIDR notation. - For example: `192.168.1.0/24` or - `2001:0db8:0123:45::/56` Note - that IPv6 addressing is currently - supported only in certain regions. - See IPv6 Addresses (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, - if you''re setting up a security - list rule for traffic destined for - a particular `Service` through a - service gateway. For example: `oci-phx-objectstorage`.' - type: string - destinationType: - description: 'Type of destination - for the rule. The default is `CIDR_BLOCK`. - Allowed values: * `CIDR_BLOCK`: - If the rule''s `destination` is - an IP address range in CIDR notation. * - `SERVICE_CIDR_BLOCK`: If the rule''s - `destination` is the `cidrBlock` - value for a Service (the rule - is for traffic destined for a particular - `Service` through a service gateway).' - type: string - icmpOptions: - description: 'IcmpOptions Optional - and valid only for ICMP and ICMPv6. - Use to specify a particular ICMP - type and code as defined in: - ICMP - Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as - the protocol but omit this object, - then all ICMP types and codes are - allowed. If you do provide this - object, the type is required and - the code is optional. To enable - MTU negotiation for ingress internet - traffic via IPv4, make sure to allow - type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and - Don''t Fragment was Set"). If you - need to specify multiple codes for - a single type, create a separate - security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows - traffic in one direction. Remember - to add a corresponding stateless - rule in the other direction if you - need to support bidirectional traffic. - For example, if egress traffic allows - TCP destination port 80, there should - be an ingress rule to allow TCP - source port 80. Defaults to false, - which means the rule is stateful - and a corresponding rule is not - necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. - Specify either `all` or an IPv4 - protocol number as defined in Protocol - Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP - ("1"), TCP ("6"), UDP ("17"), and - ICMPv6 ("58"). - type: string - tcpOptions: - description: TcpOptions Optional and - valid only for TCP. Use to specify - particular destination ports for - TCP rules. If you specify TCP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and - valid only for UDP. Use to specify - particular destination ports for - UDP rules. If you specify UDP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - type: object - id: - description: 'EgressSecurityRule ID for - NSG. Deprecated: this field is not populated - and used during reconciliation' - type: string - type: object - type: array - id: - description: NSG OCID. - type: string - ingressRules: - description: IngressRules on the NSG. - items: - description: IngressSecurityRuleForNSG is - IngressSecurityRule for NSG - properties: - id: - description: 'IngressSecurityRule ID for - NSG. Deprecated: this field is not populated - and used during reconciliation' - type: string - ingressRule: - description: IngressSecurityRule A rule - for allowing inbound IP packets. - properties: - description: - description: An optional description - of your choice for the rule. - type: string - icmpOptions: - description: 'IcmpOptions Optional - and valid only for ICMP and ICMPv6. - Use to specify a particular ICMP - type and code as defined in: - ICMP - Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as - the protocol but omit this object, - then all ICMP types and codes are - allowed. If you do provide this - object, the type is required and - the code is optional. To enable - MTU negotiation for ingress internet - traffic via IPv4, make sure to allow - type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and - Don''t Fragment was Set"). If you - need to specify multiple codes for - a single type, create a separate - security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows - traffic in one direction. Remember - to add a corresponding stateless - rule in the other direction if you - need to support bidirectional traffic. - For example, if ingress traffic - allows TCP destination port 80, - there should be an egress rule to - allow TCP source port 80. Defaults - to false, which means the rule is - stateful and a corresponding rule - is not necessary for bidirectional - traffic. - type: boolean - protocol: - description: The transport protocol. - Specify either `all` or an IPv4 - protocol number as defined in Protocol - Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP - ("1"), TCP ("6"), UDP ("17"), and - ICMPv6 ("58"). - type: string - source: - description: 'Conceptually, this is - the range of IP addresses that a - packet coming into the instance - can come from. Allowed values: * - IP address range in CIDR notation. - For example: `192.168.1.0/24` or - `2001:0db8:0123:45::/56`. IPv6 - addressing is supported for all - commercial and government regions. - See IPv6 Addresses (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, - if you''re setting up a security - list rule for traffic coming from - a particular `Service` through a - service gateway. For example: `oci-phx-objectstorage`.' - type: string - sourceType: - description: 'Type of source for the - rule. The default is `CIDR_BLOCK`. * - `CIDR_BLOCK`: If the rule''s `source` - is an IP address range in CIDR notation. * - `SERVICE_CIDR_BLOCK`: If the rule''s - `source` is the `cidrBlock` value - for a Service (the rule is for - traffic coming from a particular - `Service` through a service gateway).' - type: string - tcpOptions: - description: TcpOptions Optional and - valid only for TCP. Use to specify - particular destination ports for - TCP rules. If you specify TCP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and - valid only for UDP. Use to specify - particular destination ports for - UDP rules. If you specify UDP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - type: object - type: object - type: array - name: - description: NSG Name. - type: string - role: - description: Role defines the NSG role (eg. - control-plane, control-plane-endpoint, service-lb, - worker). - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - privateRouteTableId: - description: ID of Private Route Table. - type: string - publicRouteTableId: - description: ID of Public Route Table. - type: string - serviceGatewayId: - description: ID of Service Gateway. - type: string - subnets: - description: Subnets is the configuration for subnets - required in the VCN. - items: - description: Subnet defines the configuration for - a network's subnet https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/managingVCNs_topic-Overview_of_VCNs_and_Subnets.htm#Overview - properties: - cidr: - description: Subnet CIDR. - type: string - id: - description: Subnet OCID. - type: string - name: - description: Subnet Name. - type: string - role: - description: Role defines the subnet role (eg. - control-plane, control-plane-endpoint, service-lb, - worker). - type: string - securityList: - description: The security list associated with - Subnet. - properties: - egressRules: - description: EgressRules on the SecurityList. - items: - description: EgressSecurityRule A rule - for allowing outbound IP packets. - properties: - description: - description: An optional description - of your choice for the rule. - type: string - destination: - description: 'Conceptually, this is - the range of IP addresses that a - packet originating from the instance - can go to. Allowed values: * IP - address range in CIDR notation. - For example: `192.168.1.0/24` or - `2001:0db8:0123:45::/56` Note - that IPv6 addressing is currently - supported only in certain regions. - See IPv6 Addresses (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, - if you''re setting up a security - list rule for traffic destined for - a particular `Service` through a - service gateway. For example: `oci-phx-objectstorage`.' - type: string - destinationType: - description: 'Type of destination - for the rule. The default is `CIDR_BLOCK`. - Allowed values: * `CIDR_BLOCK`: - If the rule''s `destination` is - an IP address range in CIDR notation. * - `SERVICE_CIDR_BLOCK`: If the rule''s - `destination` is the `cidrBlock` - value for a Service (the rule - is for traffic destined for a particular - `Service` through a service gateway).' - type: string - icmpOptions: - description: 'IcmpOptions Optional - and valid only for ICMP and ICMPv6. - Use to specify a particular ICMP - type and code as defined in: - ICMP - Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as - the protocol but omit this object, - then all ICMP types and codes are - allowed. If you do provide this - object, the type is required and - the code is optional. To enable - MTU negotiation for ingress internet - traffic via IPv4, make sure to allow - type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and - Don''t Fragment was Set"). If you - need to specify multiple codes for - a single type, create a separate - security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows - traffic in one direction. Remember - to add a corresponding stateless - rule in the other direction if you - need to support bidirectional traffic. - For example, if egress traffic allows - TCP destination port 80, there should - be an ingress rule to allow TCP - source port 80. Defaults to false, - which means the rule is stateful - and a corresponding rule is not - necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. - Specify either `all` or an IPv4 - protocol number as defined in Protocol - Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP - ("1"), TCP ("6"), UDP ("17"), and - ICMPv6 ("58"). - type: string - tcpOptions: - description: TcpOptions Optional and - valid only for TCP. Use to specify - particular destination ports for - TCP rules. If you specify TCP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and - valid only for UDP. Use to specify - particular destination ports for - UDP rules. If you specify UDP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - type: object - type: array - id: - description: ID of the SecurityList. - type: string - ingressRules: - description: IngressRules on the SecurityList. - items: - description: IngressSecurityRule A rule - for allowing inbound IP packets. - properties: - description: - description: An optional description - of your choice for the rule. - type: string - icmpOptions: - description: 'IcmpOptions Optional - and valid only for ICMP and ICMPv6. - Use to specify a particular ICMP - type and code as defined in: - ICMP - Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as - the protocol but omit this object, - then all ICMP types and codes are - allowed. If you do provide this - object, the type is required and - the code is optional. To enable - MTU negotiation for ingress internet - traffic via IPv4, make sure to allow - type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and - Don''t Fragment was Set"). If you - need to specify multiple codes for - a single type, create a separate - security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows - traffic in one direction. Remember - to add a corresponding stateless - rule in the other direction if you - need to support bidirectional traffic. - For example, if ingress traffic - allows TCP destination port 80, - there should be an egress rule to - allow TCP source port 80. Defaults - to false, which means the rule is - stateful and a corresponding rule - is not necessary for bidirectional - traffic. - type: boolean - protocol: - description: The transport protocol. - Specify either `all` or an IPv4 - protocol number as defined in Protocol - Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP - ("1"), TCP ("6"), UDP ("17"), and - ICMPv6 ("58"). - type: string - source: - description: 'Conceptually, this is - the range of IP addresses that a - packet coming into the instance - can come from. Allowed values: * - IP address range in CIDR notation. - For example: `192.168.1.0/24` or - `2001:0db8:0123:45::/56`. IPv6 - addressing is supported for all - commercial and government regions. - See IPv6 Addresses (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, - if you''re setting up a security - list rule for traffic coming from - a particular `Service` through a - service gateway. For example: `oci-phx-objectstorage`.' - type: string - sourceType: - description: 'Type of source for the - rule. The default is `CIDR_BLOCK`. * - `CIDR_BLOCK`: If the rule''s `source` - is an IP address range in CIDR notation. * - `SERVICE_CIDR_BLOCK`: If the rule''s - `source` is the `cidrBlock` value - for a Service (the rule is for - traffic coming from a particular - `Service` through a service gateway).' - type: string - tcpOptions: - description: TcpOptions Optional and - valid only for TCP. Use to specify - particular destination ports for - TCP rules. If you specify TCP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and - valid only for UDP. Use to specify - particular destination ports for - UDP rules. If you specify UDP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - type: object - type: array - name: - description: SecurityList Name. - type: string - type: object - type: - description: Type defines the subnet type (e.g. - public, private). - type: string - required: - - name - - role - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - vcnPeering: - description: VCNPeering configuration. - properties: - drg: - description: DRG configuration refers to the DRG which - has to be created if required. If management cluster - and workload cluster shares the same DRG, this fields - is not required to be specified. - properties: - id: - description: ID is the OCID for the created DRG. - type: string - manage: - description: Manage defines whether the DRG has - to be managed(including create). If set to false(the - default) the ID has to be specified by the user - to a valid DRG ID to which the VCN has to be - attached. - type: boolean - name: - description: Name is the name of the created DRG. - type: string - vcnAttachmentId: - description: VcnAttachmentId is the ID of the - VCN attachment of the DRG. The workload cluster - VCN can be attached to either the management - cluster VCN if they are sharing the same DRG - or to the workload cluster DRG. - type: string - type: object - peerRouteRules: - description: PeerRouteRules defines the routing rules - which will be added to the private route tables - of the workload cluster VCN. The routes defined - here will be directed to DRG. - items: - description: PeerRouteRule defines a Route Rule - to be routed via a DRG. - properties: - vcnCIDRRange: - description: VCNCIDRRange is the CIDR Range - of peer VCN to which the workload cluster - VCN will be peered. The CIDR range is required - to add the route rule in the workload cluster - VCN, the route rule will forward any traffic - to the CIDR to the DRG. - type: string - type: object - type: array - remotePeeringConnections: - description: RemotePeeringConnections defines the - RPC connections which be established with the workload - cluster DRG. - items: - description: RemotePeeringConnection is used to - peer VCNs residing in different regions(typically). - Remote VCN Peering is explained here - https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/remoteVCNpeering.htm - properties: - managePeerRPC: - description: ManagePeerRPC will define if the - Peer VCN needs to be managed. If set to true - a Remote Peering Connection will be created - in the Peer DRG and the connection will be - created between local and peer RPC. - type: boolean - peerDRGId: - description: PeerDRGId defines the DRG ID of - the peer. - type: string - peerRPCConnectionId: - description: PeerRPCConnectionId defines the - RPC ID of peer. If ManagePeerRPC is set to - true this will be created by Cluster API Provider - for OCI, otherwise this has be defined by - the user. - type: string - peerRegionName: - description: PeerRegionName defined the region - name of Peer VCN. - type: string - rpcConnectionId: - description: RPCConnectionId is the connection - ID of the connection between peer and local - RPC. - type: string - type: object - type: array - type: object - type: object - ociResourceIdentifier: - description: The unique ID which will be used to tag all the - resources created by this Cluster. The tag will be used - to identify resources belonging to this cluster. this will - be auto-generated and should not be set by the user. - type: string - region: - description: Region the cluster operates in. It must be one - of available regions in Region Identifier format. See https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-oci - cluster.x-k8s.io/v1beta1: v1beta1 - name: ocimachinepools.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - kind: OCIMachinePool - listKind: OCIMachinePoolList - plural: ocimachinepools - singular: ocimachinepool - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OCIMachinePoolSpec defines the desired state of OCIMachinePool - properties: - imageId: - description: OCID of the image to be used to launch the instance. - type: string - instanceConfiguration: - properties: - instanceConfigurationId: - type: string - instanceDetails: - properties: - shape: - type: string - type: object - type: object - metadata: - additionalProperties: - type: string - description: Custom metadata key/value pairs that you provide, such - as the SSH public key required to connect to the instance. - type: object - ocid: - description: OCID is the OCID of the associated InstancePool - type: string - placementDetails: - items: - properties: - availabilityDomain: - description: The availability domain to place instances. - type: integer - required: - - availabilityDomain - type: object - type: array - providerID: - description: ProviderID is the OCID of the associated InstancePool - in a provider format - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine - instances provided by the provider. This field must match the provider - IDs as seen on the node objects corresponding to a machine pool's - machine instances. - items: - type: string - type: array - shapeConfig: - description: The shape configuration of the instance, applicable for - flex instances. - properties: - baselineOcpuUtilization: - description: 'The baseline OCPU utilization for a subcore burstable - VM instance. Leave this attribute blank for a non-burstable - instance, or explicitly specify non-burstable with `BASELINE_1_1`. - The following values are supported: - `BASELINE_1_8` - baseline - usage is 1/8 of an OCPU. - `BASELINE_1_2` - baseline usage is - 1/2 of an OCPU. - `BASELINE_1_1` - baseline usage is an entire - OCPU. This represents a non-burstable instance.' - type: string - memoryInGBs: - description: The total amount of memory available to the instance, - in gigabytes. - type: string - ocpus: - description: The total number of OCPUs available to the instance. - type: string - type: object - vnicAssignPublicIp: - default: false - description: Whether the VNIC should be assigned a public IP address. - type: boolean - type: object - status: - description: OCIMachinePoolStatus defines the observed state of OCIMachinePool - properties: - conditions: - description: Conditions defines current service state of the OCIMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - type: string - failureReason: - description: MachineStatusError defines errors states for Machine - objects. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: cluster-api-provider-oci-system/capoci-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-oci - cluster.x-k8s.io/v1beta1: v1beta1 - name: ocimachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - service: - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - kind: OCIMachine - listKind: OCIMachineList - plural: ocimachines - singular: ocimachine - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: OCIMachine is the Schema for the ocimachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OCIMachineSpec defines the desired state of OCIMachine Please - read the API https://docs.oracle.com/en-us/iaas/api/#/en/iaas/20160918/Instance/LaunchInstance - for more information about the parameters below - properties: - bootVolumeSizeInGBs: - description: The size of boot volume. Please see https://docs.oracle.com/en-us/iaas/Content/Block/Tasks/extendingbootpartition.htm - to extend the boot volume size. - type: string - compartmentId: - description: Compartment to launch the instance in. - type: string - definedTags: - additionalProperties: - additionalProperties: - type: string - type: object - description: 'Defined tags for this resource. Each key is predefined - and scoped to a namespace. For more information, see Resource Tags - (https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm). - Example: `{"Operations": {"CostCenter": "42"}}`' - type: object - freeformTags: - additionalProperties: - type: string - description: Free-form tags for this resource. - type: object - imageId: - description: OCID of the image to be used to launch the instance. - type: string - instanceId: - description: OCID of launched compute instance. - type: string - isPvEncryptionInTransitEnabled: - default: true - description: Is in transit encryption of volumes required. - type: boolean - metadata: - additionalProperties: - type: string - description: Custom metadata key/value pairs that you provide, such - as the SSH public key required to connect to the instance. - type: object - networkDetails: - description: PrimaryNetworkInterface is required to specify subnet. - properties: - assignPublicIp: - type: boolean - nsgId: - type: string - subnetId: - type: string - subnetName: - type: string - type: object - nsgName: - description: The name of NSG to use. The name here refers to the NSGs - defined in the OCICluster Spec. Optional, only if multiple NSGs - of a type is defined, else the first element is used. - type: string - providerID: - description: Provider ID of the instance, this will be set by Cluster - API provider itself, users should not set this parameter. - type: string - shape: - description: Shape of the instance. - type: string - shapeConfig: - description: The shape configuration of rhe instance, applicable for - flex instances. - properties: - baselineOcpuUtilization: - description: 'The baseline OCPU utilization for a subcore burstable - VM instance. Leave this attribute blank for a non-burstable - instance, or explicitly specify non-burstable with `BASELINE_1_1`. - The following values are supported: - `BASELINE_1_8` - baseline - usage is 1/8 of an OCPU. - `BASELINE_1_2` - baseline usage is - 1/2 of an OCPU. - `BASELINE_1_1` - baseline usage is an entire - OCPU. This represents a non-burstable instance.' - type: string - memoryInGBs: - description: The total amount of memory available to the instance, - in gigabytes. - type: string - ocpus: - description: The total number of OCPUs available to the instance. - type: string - type: object - subnetName: - description: The name of the subnet to use. The name here refers to - the subnets defined in the OCICluster Spec. Optional, only if multiple - subnets of a type is defined, else the first element is used. - type: string - type: object - status: - description: OCIMachineStatus defines the observed state of OCIMachine. - properties: - addresses: - description: Addresses contains the addresses of the associated OCI - instance. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the OCIMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - createBackendWorkRequestId: - description: Create Backend OPC work request ID for the machine backend. - type: string - deleteBackendWorkRequestId: - description: Delete Backend OPC work request ID for the machine backend. - type: string - failureMessage: - description: The error message corresponding to the error on the machine. - type: string - failureReason: - description: Error status on the machine. - type: string - launchInstanceWorkRequestId: - description: Launch instance work request ID. - type: string - ready: - description: Flag set to true when machine is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-oci - cluster.x-k8s.io/v1beta1: v1beta1 - name: ocimachinetemplates.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: OCIMachineTemplate - listKind: OCIMachineTemplateList - plural: ocimachinetemplates - singular: ocimachinetemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: OCIMachineTemplate is the schema for the OCI compute instance - machine template. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OCIMachineTemplateSpec defines the desired state of OCIMachineTemplate. - properties: - template: - description: OCIMachineTemplateResource describes the data needed - to create an OCIMachine from a template. - properties: - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - bootVolumeSizeInGBs: - description: The size of boot volume. Please see https://docs.oracle.com/en-us/iaas/Content/Block/Tasks/extendingbootpartition.htm - to extend the boot volume size. - type: string - compartmentId: - description: Compartment to launch the instance in. - type: string - definedTags: - additionalProperties: - additionalProperties: - type: string - type: object - description: 'Defined tags for this resource. Each key is - predefined and scoped to a namespace. For more information, - see Resource Tags (https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm). - Example: `{"Operations": {"CostCenter": "42"}}`' - type: object - freeformTags: - additionalProperties: - type: string - description: Free-form tags for this resource. - type: object - imageId: - description: OCID of the image to be used to launch the instance. - type: string - instanceId: - description: OCID of launched compute instance. - type: string - isPvEncryptionInTransitEnabled: - default: true - description: Is in transit encryption of volumes required. - type: boolean - metadata: - additionalProperties: - type: string - description: Custom metadata key/value pairs that you provide, - such as the SSH public key required to connect to the instance. - type: object - networkDetails: - description: PrimaryNetworkInterface is required to specify - subnet. - properties: - assignPublicIp: - type: boolean - nsgId: - type: string - subnetId: - type: string - subnetName: - type: string - type: object - nsgName: - description: The name of NSG to use. The name here refers - to the NSGs defined in the OCICluster Spec. Optional, only - if multiple NSGs of a type is defined, else the first element - is used. - type: string - providerID: - description: Provider ID of the instance, this will be set - by Cluster API provider itself, users should not set this - parameter. - type: string - shape: - description: Shape of the instance. - type: string - shapeConfig: - description: The shape configuration of rhe instance, applicable - for flex instances. - properties: - baselineOcpuUtilization: - description: 'The baseline OCPU utilization for a subcore - burstable VM instance. Leave this attribute blank for - a non-burstable instance, or explicitly specify non-burstable - with `BASELINE_1_1`. The following values are supported: - - `BASELINE_1_8` - baseline usage is 1/8 of an OCPU. - - `BASELINE_1_2` - baseline usage is 1/2 of an OCPU. - - `BASELINE_1_1` - baseline usage is an entire OCPU. - This represents a non-burstable instance.' - type: string - memoryInGBs: - description: The total amount of memory available to the - instance, in gigabytes. - type: string - ocpus: - description: The total number of OCPUs available to the - instance. - type: string - type: object - subnetName: - description: The name of the subnet to use. The name here - refers to the subnets defined in the OCICluster Spec. Optional, - only if multiple subnets of a type is defined, else the - first element is used. - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-controller-manager - namespace: cluster-api-provider-oci-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-leader-election-role - namespace: cluster-api-provider-oci-system -rules: - - apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete - - apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-manager-role -rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ociclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - update - - watch - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ociclusters/finalizers - verbs: - - update - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ociclusters/status - verbs: - - get - - patch - - update - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachines/finalizers - verbs: - - update - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachines/status - verbs: - - get - - patch - - update - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachinepools - - ocimachinepools/status - verbs: - - get - - list - - watch - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachinepools/status - verbs: - - get - - patch - - update - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachinepools/status - verbs: - - get - - patch - - update - - apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/status - verbs: - - get - - list - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - - machinepools/status - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-metrics-reader -rules: - - nonResourceURLs: - - /metrics - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-proxy-role -rules: - - apiGroups: - - authentication.k8s.io - resources: - - tokenreviews - verbs: - - create - - apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-leader-election-rolebinding - namespace: cluster-api-provider-oci-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capoci-leader-election-role -subjects: - - kind: ServiceAccount - name: capoci-controller-manager - namespace: cluster-api-provider-oci-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capoci-manager-role -subjects: - - kind: ServiceAccount - name: capoci-controller-manager - namespace: cluster-api-provider-oci-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-proxy-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capoci-proxy-role -subjects: - - kind: ServiceAccount - name: capoci-controller-manager - namespace: cluster-api-provider-oci-system ---- -apiVersion: v1 -data: - controller_manager_config.yaml: | - apiVersion: controller-runtime.sigs.k8s.io/v1alpha1 - kind: ControllerManagerConfig - health: - healthProbeBindAddress: :8081 - metrics: - bindAddress: 127.0.0.1:8080 - webhook: - port: 9443 - leaderElection: - leaderElect: true - resourceName: 237d8a8a.cluster.x-k8s.io -kind: ConfigMap -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-manager-config - namespace: cluster-api-provider-oci-system ---- -apiVersion: v1 -data: - fingerprint: ${OCI_CREDENTIALS_FINGERPRINT_B64:=""} - key: ${OCI_CREDENTIALS_KEY_B64:=""} - passphrase: ${OCI_CREDENTIALS_PASSPHRASE_B64:=""} - region: ${OCI_REGION_B64:=""} - tenancy: ${OCI_TENANCY_ID_B64:=""} - useInstancePrincipal: ${USE_INSTANCE_PRINCIPAL_B64:="ZmFsc2U="} - user: ${OCI_USER_ID_B64:=""} -kind: Secret -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-auth-config - namespace: cluster-api-provider-oci-system -type: Opaque ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager - name: capoci-controller-manager-metrics-service - namespace: cluster-api-provider-oci-system -spec: - ports: - - name: https - port: 8443 - targetPort: https - selector: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-oci ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager - name: capoci-controller-manager - namespace: cluster-api-provider-oci-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager - spec: - affinity: - nodeAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: ${K8S_CP_LABEL:=node-role.kubernetes.io/control-plane} - operator: Exists - weight: 10 - - preference: - matchExpressions: - - key: node-role.kubernetes.io/master - operator: Exists - weight: 10 - containers: - - args: - - --leader-elect - - --feature-gates=MachinePool=${EXP_MACHINE_POOL:=false} - - --metrics-bind-address=127.0.0.1:8080 - - --logging-format=${LOG_FORMAT:=text} - command: - - /manager - env: - - name: AUTH_CONFIG_DIR - value: /etc/oci - image: ghcr.io/oracle/cluster-api-oci-controller:v0.4.0 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: 8081 - initialDelaySeconds: 15 - periodSeconds: 20 - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 10 - securityContext: - allowPrivilegeEscalation: false - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - - mountPath: /etc/oci - name: auth-config-dir - readOnly: true - serviceAccountName: capoci-controller-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: capoci-webhook-service-cert - - name: auth-config-dir - secret: - secretName: capoci-auth-config ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-serving-cert - namespace: cluster-api-provider-oci-system -spec: - dnsNames: - - capoci-webhook-service.cluster-api-provider-oci-system.svc - - capoci-webhook-service.cluster-api-provider-oci-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capoci-selfsigned-issuer - secretName: capoci-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-selfsigned-issuer - namespace: cluster-api-provider-oci-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: cluster-api-provider-oci-system/capoci-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-mutating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-ocicluster - failurePolicy: Fail - matchPolicy: Equivalent - name: default.ocicluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - ociclusters - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: cluster-api-provider-oci-system/capoci-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-validating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-ocicluster - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.ocicluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - ociclusters - sideEffects: None - - admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-ocimachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.ocimachinetemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - ocimachinetemplates - sideEffects: None diff --git a/packages/cluster-api-provider-oci/bundle/config/upstream/metadata.yaml b/packages/cluster-api-provider-oci/bundle/config/upstream/metadata.yaml deleted file mode 100644 index 5a9463aa5b..0000000000 --- a/packages/cluster-api-provider-oci/bundle/config/upstream/metadata.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# maps release series of major.minor to cluster-api contract version -# the contract version may change between minor or major versions, but *not* -# between patch versions. -# -# update this file only when a new major or minor version is released -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -releaseSeries: - - major: 0 - minor: 4 - contract: v1beta1 diff --git a/packages/cluster-api-provider-oci/bundle/config/values.yaml b/packages/cluster-api-provider-oci/bundle/config/values.yaml deleted file mode 100644 index 280fd4014f..0000000000 --- a/packages/cluster-api-provider-oci/bundle/config/values.yaml +++ /dev/null @@ -1,10 +0,0 @@ -#@data/values-schema ---- - -capociControllerManager: - #@schema/desc "Configures the HTTP_PROXY environment variable on capoci-controller-manager." - httpProxy: "" - #@schema/desc "Configures the HTTPS_PROXY environment variable on capoci-controller-manager." - httpsProxy: "" - #@schema/desc "Configures the NO_PROXY environment variable on capoci-controller-manager." - noProxy: "" diff --git a/packages/cluster-api-provider-oci/metadata.yaml b/packages/cluster-api-provider-oci/metadata.yaml deleted file mode 100644 index b2dd91dc38..0000000000 --- a/packages/cluster-api-provider-oci/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: cluster-api-provider-oci.tanzu.vmware.com - namespace: cluster-api-provider-oci -spec: - displayName: "cluster-api-provider-oci" - longDescription: "Cluster API Provider OCI provides consistent deployment and day 2 operations of 'self-managed' Kubernetes clusters on OCI" - shortDescription: "Cluster management for OCI" - providerName: VMware - maintainers: - - name: "" - categories: - - "cluster management" diff --git a/packages/cluster-api-provider-oci/package.yaml b/packages/cluster-api-provider-oci/package.yaml deleted file mode 100644 index 48f7661066..0000000000 --- a/packages/cluster-api-provider-oci/package.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: cluster-api-provider-oci.tanzu.vmware.com - namespace: cluster-api-provider-oci -spec: - refName: cluster-api-provider-oci.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} - valuesSchema: - openAPIv3: - type: object - additionalProperties: false - properties: - capociControllerManager: - type: object - additionalProperties: false - properties: - httpProxy: - type: string - description: Configures the HTTP_PROXY environment variable on capoci-controller-manager. - default: "" - httpsProxy: - type: string - description: Configures the HTTPS_PROXY environment variable on capoci-controller-manager. - default: "" - noProxy: - type: string - description: Configures the NO_PROXY environment variable on capoci-controller-manager. - default: "" diff --git a/packages/cluster-api-provider-oci/test/unit/overlay_test.go b/packages/cluster-api-provider-oci/test/unit/overlay_test.go deleted file mode 100644 index 1dbd2e9798..0000000000 --- a/packages/cluster-api-provider-oci/test/unit/overlay_test.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -const ( - packageRoot = "../.." -) - -var _ = Describe("Cluster-API Provider OCI Ytt Templating", func() { - var paths []string - var values string - - BeforeEach(func() { - paths = []string{ - filepath.Join(packageRoot, "bundle", "config"), - } - }) - - Context("when the httpProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capociControllerManager: - httpProxy: http://127.0.0.1:3124` - }) - It("adds HTTP_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capoci-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='AUTH_CONFIG_DIR')].value", - "/etc/oci", - )) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')].value", - "http://127.0.0.1:3124", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')]")) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')]")) - }) - }) - - Context("when the httpsProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capociControllerManager: - httpsProxy: https://127.0.0.1:3124` - }) - It("adds HTTPS_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capoci-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='AUTH_CONFIG_DIR')].value", - "/etc/oci", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')]")) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')].value", - "https://127.0.0.1:3124", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')]")) - }) - }) - - Context("when the noProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capociControllerManager: - noProxy: 10.0.0.0/16,127.0.0.1` - }) - It("adds NO_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capoci-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='AUTH_CONFIG_DIR')].value", - "/etc/oci", - )) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')]")) - Expect(docs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')]")) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')].value", - "10.0.0.0/16,127.0.0.1", - )) - }) - }) -}) diff --git a/packages/cluster-api-provider-oci/test/unit/unit_suite_test.go b/packages/cluster-api-provider-oci/test/unit/unit_suite_test.go deleted file mode 100644 index 2db287f1ca..0000000000 --- a/packages/cluster-api-provider-oci/test/unit/unit_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestUnit(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Cluster API Provider OCI Unit Suite") -} diff --git a/packages/cluster-api-provider-oci/vendir.lock.yml b/packages/cluster-api-provider-oci/vendir.lock.yml deleted file mode 100644 index 618c22a4be..0000000000 --- a/packages/cluster-api-provider-oci/vendir.lock.yml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: - - contents: - - githubRelease: - url: https://api.github.com/repos/oracle/cluster-api-provider-oci/releases/55060239 - path: . - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/cluster-api-provider-oci/vendir.yml b/packages/cluster-api-provider-oci/vendir.yml deleted file mode 100644 index 6974b757e5..0000000000 --- a/packages/cluster-api-provider-oci/vendir.yml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: . - githubRelease: - slug: oracle/cluster-api-provider-oci - tag: v0.3.0 - disableAutoChecksumValidation: true - includePaths: - - infrastructure-components.yaml - - metadata.yaml diff --git a/packages/cluster-api-provider-vsphere/Makefile b/packages/cluster-api-provider-vsphere/Makefile deleted file mode 100644 index 047b729714..0000000000 --- a/packages/cluster-api-provider-vsphere/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/cluster-api-provider-vsphere/README.md b/packages/cluster-api-provider-vsphere/README.md deleted file mode 100644 index 2b7909206f..0000000000 --- a/packages/cluster-api-provider-vsphere/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# cluster-api-provider-vsphere Package - -This package provides the Cluster API implementation for vSphere using -[cluster-api-provider-vsphere](https://github.com/kubernetes-sigs/cluster-api-provider-vsphere). - -## Components - -* capv-controller-manager - -## Configuration - -The following configuration values can be set to customize the installation. - -| Value | Required/Optional | Description | -|------------------------------------|-------------------|-----------------------------------------------------------------------------| -| `capvControllerManager.httpProxy` | Optional | Configures the HTTP_PROXY environment variable on capv-controller-manager. | -| `capvControllerManager.httpsProxy` | Optional | Configures the HTTPS_PROXY environment variable on capv-controller-manager. | -| `capvControllerManager.noProxy` | Optional | Configures the NO_PROXY environment variable on capv-controller-manager. | - -## Usage Example - -To learn more about cluster-api-provider-vsphere visit -. diff --git a/packages/cluster-api-provider-vsphere/bundle/config/overlay/add-proxy-environment-variables.yaml b/packages/cluster-api-provider-vsphere/bundle/config/overlay/add-proxy-environment-variables.yaml deleted file mode 100644 index 370a06953a..0000000000 --- a/packages/cluster-api-provider-vsphere/bundle/config/overlay/add-proxy-environment-variables.yaml +++ /dev/null @@ -1,25 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "capv-controller-manager"}}), expects=2 ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - #@overlay/match-child-defaults missing_ok=True - - env: - #@ if data.values.capvControllerManager.httpProxy != "": - - name: "HTTP_PROXY" - value: #@ data.values.capvControllerManager.httpProxy - #@ end - #@ if data.values.capvControllerManager.httpsProxy != "": - - name: "HTTPS_PROXY" - value: #@ data.values.capvControllerManager.httpsProxy - #@ end - #@ if data.values.capvControllerManager.noProxy != "": - - name: "NO_PROXY" - value: #@ data.values.capvControllerManager.noProxy - #@ end - diff --git a/packages/cluster-api-provider-vsphere/bundle/config/overlay/set-features-gates.yaml b/packages/cluster-api-provider-vsphere/bundle/config/overlay/set-features-gates.yaml deleted file mode 100644 index b346b7118e..0000000000 --- a/packages/cluster-api-provider-vsphere/bundle/config/overlay/set-features-gates.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capv-controller-manager"}}),expects="1+" ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - args: - #@overlay/match by=overlay.index(3) - #@overlay/replace - - "--feature-gates=NodeAntiAffinity=${EXP_NODE_ANTI_AFFINITY:=true},NodeLabeling=${EXP_NODE_LABELING:=true}" diff --git a/packages/cluster-api-provider-vsphere/bundle/config/upstream/infrastructure-components-supervisor.yaml b/packages/cluster-api-provider-vsphere/bundle/config/upstream/infrastructure-components-supervisor.yaml deleted file mode 100644 index 9ac7dc402c..0000000000 --- a/packages/cluster-api-provider-vsphere/bundle/config/upstream/infrastructure-components-supervisor.yaml +++ /dev/null @@ -1,1711 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: providerserviceaccounts.vmware.infrastructure.cluster.x-k8s.io -spec: - group: vmware.infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: ProviderServiceAccount - listKind: ProviderServiceAccountList - plural: providerserviceaccounts - singular: providerserviceaccount - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .spec.ref.name - name: VSphereCluster - type: string - - jsonPath: .spec.targetNamespace - name: TargetNamespace - type: string - - jsonPath: .spec.targetSecretName - name: TargetSecretName - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: ProviderServiceAccount is the schema for the ProviderServiceAccount - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ProviderServiceAccountSpec defines the desired state of ProviderServiceAccount. - properties: - ref: - description: Ref specifies the reference to the VSphereCluster for - which the ProviderServiceAccount needs to be realized. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - rules: - description: Rules specifies the privileges that need to be granted - to the service account. - items: - description: PolicyRule holds information that describes a policy - rule, but does not contain information about who the rule applies - to or which namespace the rule applies to. - properties: - apiGroups: - description: APIGroups is the name of the APIGroup that contains - the resources. If multiple API groups are specified, any - action requested against one of the enumerated resources in - any API group will be allowed. - items: - type: string - type: array - nonResourceURLs: - description: NonResourceURLs is a set of partial urls that a - user should have access to. *s are allowed, but only as the - full, final step in the path Since non-resource URLs are not - namespaced, this field is only applicable for ClusterRoles - referenced from a ClusterRoleBinding. Rules can either apply - to API resources (such as "pods" or "secrets") or non-resource - URL paths (such as "/api"), but not both. - items: - type: string - type: array - resourceNames: - description: ResourceNames is an optional white list of names - that the rule applies to. An empty set means that everything - is allowed. - items: - type: string - type: array - resources: - description: Resources is a list of resources this rule applies - to. '*' represents all resources. - items: - type: string - type: array - verbs: - description: Verbs is a list of Verbs that apply to ALL the - ResourceKinds contained in this rule. '*' represents all verbs. - items: - type: string - type: array - required: - - verbs - type: object - type: array - targetNamespace: - description: TargetNamespace is the namespace in the target cluster - where the secret containing the generated service account token - needs to be created. - type: string - targetSecretName: - description: TargetSecretName is the name of the secret in the target - cluster that contains the generated service account token. - type: string - required: - - ref - - rules - - targetNamespace - - targetSecretName - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vsphereclusters.vmware.infrastructure.cluster.x-k8s.io -spec: - group: vmware.infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereCluster - listKind: VSphereClusterList - plural: vsphereclusters - singular: vspherecluster - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereCluster is the Schema for the VSphereClusters API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - controlPlaneEndpoint: - description: APIEndpoint represents a reachable Kubernetes API endpoint. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - required: - - controlPlaneEndpoint - type: object - status: - description: VSphereClusterStatus defines the observed state of VSphereClusterSpec - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a list of failure domain objects synced - from the infrastructure provider. - type: object - ready: - description: Ready indicates the infrastructure required to deploy - this cluster is ready. - type: boolean - resourcePolicyName: - description: ResourcePolicyName is the name of the VirtualMachineSetResourcePolicy - for the cluster, if one exists - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vsphereclustertemplates.vmware.infrastructure.cluster.x-k8s.io -spec: - group: vmware.infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereClusterTemplate - listKind: VSphereClusterTemplateList - plural: vsphereclustertemplates - singular: vsphereclustertemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereClusterTemplate is the Schema for the vsphereclustertemplates - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterTemplateSpec defines the desired state of VSphereClusterTemplate - properties: - template: - properties: - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - controlPlaneEndpoint: - description: APIEndpoint represents a reachable Kubernetes - API endpoint. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - required: - - controlPlaneEndpoint - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspheremachines.vmware.infrastructure.cluster.x-k8s.io -spec: - group: vmware.infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereMachine - listKind: VSphereMachineList - plural: vspheremachines - singular: vspheremachine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Zone - jsonPath: .spec.failureDomain - name: Zone - type: string - - description: Provider ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: IP address - jsonPath: .status.vmIp - name: IPAddr - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereMachine is the Schema for the vspheremachines API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineSpec defines the desired state of VSphereMachine - properties: - className: - description: ClassName is the name of the class used when specifying - the underlying virtual machine - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will - be created in. Must match a key in the FailureDomains map stored - on the cluster object. - type: string - imageName: - description: ImageName is the name of the base image used when specifying - the underlying virtual machine - type: string - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated - as vsphere://12345678-1234-1234-1234-123456789abc. This is required - at runtime by CAPI. Do not remove this field. - type: string - storageClass: - description: StorageClass is the name of the storage class used when - specifying the underlying virtual machine. - type: string - volumes: - description: Volumes is the set of PVCs to be created and attached - to the VSphereMachine - items: - description: VSphereMachineVolume defines a PVC attachment - properties: - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Capacity is the PVC capacity - type: object - name: - description: 'Name is suffix used to name this PVC as: VSphereMachine.Name - + "-" + Name' - type: string - storageClass: - description: StorageClass defaults to VSphereMachineSpec.StorageClass - type: string - required: - - capacity - - name - type: object - type: array - required: - - className - - imageName - type: object - status: - description: VSphereMachineStatus defines the observed state of VSphereMachine - properties: - addresses: - description: Addresses contains the instance associated addresses. - items: - description: NodeAddress contains information for the node's address. - properties: - address: - description: The node address. - type: string - type: - description: Node address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - ready: - description: Ready is true when the provider resource is ready. This - is required at runtime by CAPI. Do not remove this field. - type: boolean - vmID: - description: ID is used to identify the virtual machine. - type: string - vmIp: - description: IPAddr is the IP address used to access the virtual machine. - type: string - vmstatus: - description: VMStatus is used to identify the virtual machine status. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspheremachinetemplates.vmware.infrastructure.cluster.x-k8s.io -spec: - group: vmware.infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereMachineTemplate - listKind: VSphereMachineTemplateList - plural: vspheremachinetemplates - singular: vspheremachinetemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereMachineTemplate is the Schema for the vspheremachinetemplates - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineTemplateSpec defines the desired state of VSphereMachineTemplate - properties: - template: - description: VSphereMachineTemplateResource describes the data needed - to create a VSphereMachine from a template - properties: - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - className: - description: ClassName is the name of the class used when - specifying the underlying virtual machine - type: string - failureDomain: - description: FailureDomain is the failure domain the machine - will be created in. Must match a key in the FailureDomains - map stored on the cluster object. - type: string - imageName: - description: ImageName is the name of the base image used - when specifying the underlying virtual machine - type: string - providerID: - description: ProviderID is the virtual machine's BIOS UUID - formated as vsphere://12345678-1234-1234-1234-123456789abc. - This is required at runtime by CAPI. Do not remove this - field. - type: string - storageClass: - description: StorageClass is the name of the storage class - used when specifying the underlying virtual machine. - type: string - volumes: - description: Volumes is the set of PVCs to be created and - attached to the VSphereMachine - items: - description: VSphereMachineVolume defines a PVC attachment - properties: - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Capacity is the PVC capacity - type: object - name: - description: 'Name is suffix used to name this PVC as: - VSphereMachine.Name + "-" + Name' - type: string - storageClass: - description: StorageClass defaults to VSphereMachineSpec.StorageClass - type: string - required: - - capacity - - name - type: object - type: array - required: - - className - - imageName - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-leader-election-role - namespace: capv-system -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -aggregationRule: - clusterRoleSelectors: - - matchLabels: - capv.infrastucture.cluster.x-k8s.io/aggregate-to-manager: "true" -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-aggregated-manager-role -rules: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - capv.infrastucture.cluster.x-k8s.io/aggregate-to-manager: "true" - cluster.x-k8s.io/aggregate-to-manager: "true" - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - kubeadm.controlplane.cluster.x-k8s.io/aggregate-to-manager: "true" - name: capv-manager-role -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - configmaps - - events - - nodes - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - patch - - update -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims - verbs: - - create - - delete - - get - - list - - update - - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims/status - verbs: - - get - - patch - - update -- apiGroups: - - "" - resources: - - secrets - verbs: - - get -- apiGroups: - - "" - resources: - - serviceaccounts - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - services - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - services/status - verbs: - - get -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - machines - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - - machinesets - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - verbs: - - get - - list - - patch - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines/status - verbs: - - get - - list - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - kubeadmcontrolplanes - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - nodes - verbs: - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusteridentities - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusteridentities/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheredeploymentzones - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheredeploymentzones/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherefailuredomains - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachines/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherevms - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherevms/status - verbs: - - get - - patch - - update -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddressclaims - verbs: - - create - - get - - list - - update - - watch -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddresses - verbs: - - get - - list - - watch -- apiGroups: - - netoperator.vmware.com - resources: - - networks - verbs: - - get - - list - - watch -- apiGroups: - - rbac.authorization.k8s.io - resources: - - rolebindings - - roles - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - topology.tanzu.vmware.com - resources: - - availabilityzones - verbs: - - get - - list - - watch -- apiGroups: - - topology.tanzu.vmware.com - resources: - - availabilityzones/status - verbs: - - get - - list - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachineimages - - virtualmachineimages/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachineservices - - virtualmachineservices/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachinesetresourcepolicies - - virtualmachinesetresourcepolicies/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.com - resources: - - virtualnetworks - - virtualnetworks/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - providerserviceaccounts - verbs: - - get - - list - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - providerserviceaccounts/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclustertemplates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachines/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-leader-election-rolebinding - namespace: capv-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capv-leader-election-role -subjects: -- kind: ServiceAccount - name: default - namespace: capv-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capv-aggregated-manager-role -subjects: -- kind: ServiceAccount - name: default - namespace: capv-system ---- -apiVersion: v1 -kind: Secret -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-manager-bootstrap-credentials - namespace: capv-system -stringData: - credentials.yaml: |- - username: '${VSPHERE_USERNAME}' - password: '${VSPHERE_PASSWORD}' -type: Opaque ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-webhook-service - namespace: capv-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - control-plane: controller-manager - name: capv-controller-manager - namespace: capv-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --logtostderr - - --v=4 - - --feature-gates=NodeAntiAffinity=${EXP_NODE_ANTI_AFFINITY:=false},NodeLabeling=${EXP_NODE_LABELING:=false} - env: - - name: SERVICE_ACCOUNTS_CM_NAMESPACE - value: ${SERVICE_ACCOUNTS_CM_NAMESPACE} - - name: SERVICE_ACCOUNTS_CM_NAME - value: ${SERVICE_ACCOUNTS_CM_NAME} - image: gcr.io/cluster-api-provider-vsphere/release/manager:v1.5.3 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - - mountPath: /etc/capv - name: manager-bootstrap-credentials - readOnly: true - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: capv-webhook-service-cert - - name: manager-bootstrap-credentials - secret: - secretName: capv-manager-bootstrap-credentials ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-serving-cert - namespace: capv-system -spec: - dnsNames: - - capv-webhook-service.capv-system.svc - - capv-webhook-service.capv-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capv-selfsigned-issuer - secretName: capv-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-selfsigned-issuer - namespace: capv-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspheredeploymentzone - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspheredeploymentzone.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheredeploymentzones - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspherefailuredomain - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspherefailuredomain.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherefailuredomains - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspheremachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachines - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspherevm - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspherevm.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherevms - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vsphereclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vsphereclustertemplate.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vsphereclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspherefailuredomain - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspherefailuredomain.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherefailuredomains - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspheremachine.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachines - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspheremachinetemplate.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachinetemplates - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspherevm - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspherevm.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherevms - sideEffects: None diff --git a/packages/cluster-api-provider-vsphere/bundle/config/upstream/infrastructure-components.yaml b/packages/cluster-api-provider-vsphere/bundle/config/upstream/infrastructure-components.yaml deleted file mode 100644 index dc81ffea48..0000000000 --- a/packages/cluster-api-provider-vsphere/bundle/config/upstream/infrastructure-components.yaml +++ /dev/null @@ -1,7174 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vsphereclusteridentities.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereClusterIdentity - listKind: VSphereClusterIdentityList - plural: vsphereclusteridentities - singular: vsphereclusteridentity - scope: Cluster - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereClusterIdentity defines the account to be used for reconciling - clusters - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces - are allowed to use this account. Namespaces can be selected with - a label selector. If this object is nil, no namespaces will be allowed - properties: - selector: - description: Selector is a standard Kubernetes LabelSelector. - A label query over a set of resources. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - type: object - secretName: - description: SecretName references a Secret inside the controller - namespace with the credentials to use - minLength: 1 - type: string - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - ready: - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereClusterIdentity defines the account to be used for reconciling - clusters - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces - are allowed to use this account. Namespaces can be selected with - a label selector. If this object is nil, no namespaces will be allowed - properties: - selector: - description: Selector is a standard Kubernetes LabelSelector. - A label query over a set of resources. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - type: object - secretName: - description: SecretName references a Secret inside the controller - namespace with the credentials to use - minLength: 1 - type: string - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - ready: - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereClusterIdentity defines the account to be used for reconciling - clusters - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces - are allowed to use this account. Namespaces can be selected with - a label selector. If this object is nil, no namespaces will be allowed - properties: - selector: - description: Selector is a standard Kubernetes LabelSelector. - A label query over a set of resources. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that relates - the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If - the operator is In or NotIn, the values array must - be non-empty. If the operator is Exists or DoesNotExist, - the values array must be empty. This array is replaced - during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A - single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is "key", - the operator is "In", and the values array contains only - "value". The requirements are ANDed. - type: object - type: object - type: object - secretName: - description: SecretName references a Secret inside the controller - namespace with the credentials to use - minLength: 1 - type: string - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - ready: - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vsphereclusters.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereCluster - listKind: VSphereClusterList - plural: vsphereclusters - singular: vspherecluster - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster infrastructure is ready for VSphereMachine - jsonPath: .status.ready - name: Ready - type: string - - description: Server is the address of the vSphere endpoint - jsonPath: .spec.server - name: Server - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint[0] - name: ControlPlaneEndpoint - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereCluster is the Schema for the vsphereclusters API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - cloudProviderConfiguration: - description: 'CloudProviderConfiguration holds the cluster-wide configuration - for the DEPRECATED: will be removed in v1alpha4 vSphere cloud provider.' - properties: - disk: - description: Disk is the vSphere cloud provider's disk configuration. - properties: - scsiControllerType: - description: SCSIControllerType defines SCSI controller to - be used. - type: string - type: object - global: - description: Global is the vSphere cloud provider's global configuration. - properties: - apiBindPort: - description: APIBindPort configures the vSphere cloud controller - manager API port. Defaults to 43001. - type: string - apiDisable: - description: APIDisable disables the vSphere cloud controller - manager API. Defaults to true. - type: boolean - caFile: - description: CAFile Specifies the path to a CA certificate - in PEM format. If not configured, the system's CA certificates - will be used. - type: string - datacenters: - description: Datacenters is a CSV string of the datacenters - in which VMs are located. - type: string - insecure: - description: Insecure is a flag that disables TLS peer verification. - type: boolean - password: - description: Password is the password used to access a vSphere - endpoint. - type: string - port: - description: Port is the port on which the vSphere endpoint - is listening. Defaults to 443. - type: string - roundTripperCount: - description: RoundTripperCount specifies the SOAP round tripper - count (retries = RoundTripper - 1) - format: int32 - type: integer - secretName: - description: SecretName is the name of the Kubernetes secret - in which the vSphere credentials are located. - type: string - secretNamespace: - description: SecretNamespace is the namespace for SecretName. - type: string - secretsDirectory: - description: 'SecretsDirectory is a directory in which secrets - may be found. This may used in the event that: 1. It is - not desirable to use the K8s API to watch changes to secrets - 2. The cloud controller manager is not running in a K8s - environment, such as DC/OS. For example, the container - storage interface (CSI) is container orcehstrator (CO) - agnostic, and should support non-K8s COs. Defaults to /etc/cloud/credentials.' - type: string - serviceAccount: - description: ServiceAccount is the Kubernetes service account - used to launch the cloud controller manager. Defaults to - cloud-controller-manager. - type: string - thumbprint: - description: Thumbprint is the cryptographic thumbprint of - the vSphere endpoint's certificate. - type: string - username: - description: Username is the username used to access a vSphere - endpoint. - type: string - type: object - labels: - description: Labels is the vSphere cloud provider's zone and region - configuration. - properties: - region: - description: Region is the region in which VMs are created/located. - type: string - zone: - description: Zone is the zone in which VMs are created/located. - type: string - type: object - network: - description: Network is the vSphere cloud provider's network configuration. - properties: - name: - description: Name is the name of the network to which VMs - are connected. - type: string - type: object - providerConfig: - description: CPIProviderConfig contains extra information used - to configure the vSphere cloud provider. - properties: - cloud: - properties: - controllerImage: - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs passes through extra arguments - to the cloud provider. The arguments here are passed - to the cloud provider daemonset specification - type: object - type: object - storage: - properties: - attacherImage: - type: string - controllerImage: - type: string - livenessProbeImage: - type: string - metadataSyncerImage: - type: string - nodeDriverImage: - type: string - provisionerImage: - type: string - registrarImage: - type: string - type: object - type: object - virtualCenter: - additionalProperties: - description: CPIVCenterConfig is a vSphere cloud provider's - vCenter configuration. - properties: - datacenters: - description: Datacenters is a CSV string of the datacenters - in which VMs are located. - type: string - password: - description: Password is the password used to access a vSphere - endpoint. - type: string - port: - description: Port is the port on which the vSphere endpoint - is listening. Defaults to 443. - type: string - roundTripperCount: - description: RoundTripperCount specifies the SOAP round - tripper count (retries = RoundTripper - 1) - format: int32 - type: integer - thumbprint: - description: Thumbprint is the cryptographic thumbprint - of the vSphere endpoint's certificate. - type: string - username: - description: Username is the username used to access a vSphere - endpoint. - type: string - type: object - description: VCenter is a list of vCenter configurations. - type: object - workspace: - description: Workspace is the vSphere cloud provider's workspace - configuration. - properties: - datacenter: - description: Datacenter is the datacenter in which VMs are - created/located. - type: string - datastore: - description: Datastore is the datastore in which VMs are created/located. - type: string - folder: - description: Folder is the folder in which VMs are created/located. - type: string - resourcePool: - description: ResourcePool is the resource pool in which VMs - are created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere - endpoint. - type: string - type: object - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to either a Secret or VSphereClusterIdentity - that contains the identity to use when reconciling the cluster. - properties: - kind: - description: Kind of the identity. Can either be VSphereClusterIdentity - or Secret - enum: - - VSphereClusterIdentity - - Secret - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - insecure: - description: 'Insecure is a flag that controls whether or not to validate - the vSphere server''s certificate. DEPRECATED: will be removed in - v1alpha4' - type: boolean - loadBalancerRef: - description: 'LoadBalancerRef may be used to enable a control plane - load balancer for this cluster. When a LoadBalancerRef is provided, - the VSphereCluster.Status.Ready field will not be true until the - referenced resource is Status.Ready and has a non-empty Status.Address - value. DEPRECATED: will be removed in v1alpha4' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the - given vCenter server's host certificate When provided, Insecure - should not be set to true - type: string - type: object - status: - description: VSphereClusterStatus defines the observed state of VSphereClusterSpec - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a list of failure domain objects synced - from the infrastructure provider. - type: object - ready: - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster infrastructure is ready for VSphereMachine - jsonPath: .status.ready - name: Ready - type: string - - description: Server is the address of the vSphere endpoint - jsonPath: .spec.server - name: Server - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint[0] - name: ControlPlaneEndpoint - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereCluster is the Schema for the vsphereclusters API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to either a Secret or VSphereClusterIdentity - that contains the identity to use when reconciling the cluster. - properties: - kind: - description: Kind of the identity. Can either be VSphereClusterIdentity - or Secret - enum: - - VSphereClusterIdentity - - Secret - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the - given vCenter server's host certificate - type: string - type: object - status: - description: VSphereClusterStatus defines the observed state of VSphereClusterSpec - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a list of failure domain objects synced - from the infrastructure provider. - type: object - ready: - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster infrastructure is ready for VSphereMachine - jsonPath: .status.ready - name: Ready - type: string - - description: Server is the address of the vSphere endpoint. - jsonPath: .spec.server - name: Server - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint[0] - name: ControlPlaneEndpoint - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereCluster is the Schema for the vsphereclusters API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - clusterModules: - description: ClusterModules hosts information regarding the anti-affinity - vSphere constructs for each of the objects responsible for creation - of VM objects belonging to the cluster. - items: - description: ClusterModule holds the anti affinity construct `ClusterModule` - identifier in use by the VMs owned by the object referred by the - TargetObjectName field. - properties: - controlPlane: - description: ControlPlane indicates whether the referred object - is responsible for control plane nodes. Currently, only the - KubeadmControlPlane objects have this flag set to true. Only - a single object in the slice can have this value set to true. - type: boolean - moduleUUID: - description: ModuleUUID is the unique identifier of the `ClusterModule` - used by the object. - type: string - targetObjectName: - description: TargetObjectName points to the object that uses - the Cluster Module information to enforce anti-affinity amongst - its descendant VM objects. - type: string - required: - - controlPlane - - moduleUUID - - targetObjectName - type: object - type: array - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to either a Secret or VSphereClusterIdentity - that contains the identity to use when reconciling the cluster. - properties: - kind: - description: Kind of the identity. Can either be VSphereClusterIdentity - or Secret - enum: - - VSphereClusterIdentity - - Secret - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the - given vCenter server's host certificate - type: string - type: object - status: - description: VSphereClusterStatus defines the observed state of VSphereClusterSpec - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a list of failure domain objects synced - from the infrastructure provider. - type: object - ready: - type: boolean - vCenterVersion: - description: VCenterVersion defines the version of the vCenter server - defined in the spec. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vsphereclustertemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereClusterTemplate - listKind: VSphereClusterTemplateList - plural: vsphereclustertemplates - singular: vsphereclustertemplate - scope: Namespaced - versions: - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereClusterTemplate is the Schema for the vsphereclustertemplates - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterTemplateSpec defines the desired state of VSphereClusterTemplate - properties: - template: - properties: - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint - used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to either a Secret - or VSphereClusterIdentity that contains the identity to - use when reconciling the cluster. - properties: - kind: - description: Kind of the identity. Can either be VSphereClusterIdentity - or Secret - enum: - - VSphereClusterIdentity - - Secret - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum - of the given vCenter server's host certificate - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereClusterTemplate is the Schema for the vsphereclustertemplates - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterTemplateSpec defines the desired state of VSphereClusterTemplate - properties: - template: - properties: - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - clusterModules: - description: ClusterModules hosts information regarding the - anti-affinity vSphere constructs for each of the objects - responsible for creation of VM objects belonging to the - cluster. - items: - description: ClusterModule holds the anti affinity construct - `ClusterModule` identifier in use by the VMs owned by - the object referred by the TargetObjectName field. - properties: - controlPlane: - description: ControlPlane indicates whether the referred - object is responsible for control plane nodes. Currently, - only the KubeadmControlPlane objects have this flag - set to true. Only a single object in the slice can - have this value set to true. - type: boolean - moduleUUID: - description: ModuleUUID is the unique identifier of - the `ClusterModule` used by the object. - type: string - targetObjectName: - description: TargetObjectName points to the object that - uses the Cluster Module information to enforce anti-affinity - amongst its descendant VM objects. - type: string - required: - - controlPlane - - moduleUUID - - targetObjectName - type: object - type: array - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint - used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to either a Secret - or VSphereClusterIdentity that contains the identity to - use when reconciling the cluster. - properties: - kind: - description: Kind of the identity. Can either be VSphereClusterIdentity - or Secret - enum: - - VSphereClusterIdentity - - Secret - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum - of the given vCenter server's host certificate - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspheredeploymentzones.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereDeploymentZone - listKind: VSphereDeploymentZoneList - plural: vspheredeploymentzones - singular: vspheredeploymentzone - scope: Cluster - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereDeploymentZone is the Schema for the vspheredeploymentzones - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereDeploymentZoneSpec defines the desired state of VSphereDeploymentZone - properties: - controlPlane: - description: ControlPlane determines if this failure domain is suitable - for use by control plane machines. - type: boolean - failureDomain: - description: failureDomain is the name of the VSphereFailureDomain - used for this VSphereDeploymentZone - type: string - placementConstraint: - description: PlacementConstraint encapsulates the placement constraints - used within this deployment zone. - properties: - folder: - description: Folder is the name or inventory path of the folder - in which the virtual machine is created/located. - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the - resource pool in which the virtual machine is created/located. - type: string - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - required: - - placementConstraint - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - ready: - description: Ready is true when the VSphereDeploymentZone resource - is ready. If set to false, it will be ignored by VSphereClusters - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereDeploymentZone is the Schema for the vspheredeploymentzones - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereDeploymentZoneSpec defines the desired state of VSphereDeploymentZone - properties: - controlPlane: - description: ControlPlane determines if this failure domain is suitable - for use by control plane machines. - type: boolean - failureDomain: - description: FailureDomain is the name of the VSphereFailureDomain - used for this VSphereDeploymentZone - type: string - placementConstraint: - description: PlacementConstraint encapsulates the placement constraints - used within this deployment zone. - properties: - folder: - description: Folder is the name or inventory path of the folder - in which the virtual machine is created/located. - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the - resource pool in which the virtual machine is created/located. - type: string - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - required: - - placementConstraint - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - ready: - description: Ready is true when the VSphereDeploymentZone resource - is ready. If set to false, it will be ignored by VSphereClusters - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereDeploymentZone is the Schema for the vspheredeploymentzones - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereDeploymentZoneSpec defines the desired state of VSphereDeploymentZone - properties: - controlPlane: - description: ControlPlane determines if this failure domain is suitable - for use by control plane machines. - type: boolean - failureDomain: - description: FailureDomain is the name of the VSphereFailureDomain - used for this VSphereDeploymentZone - type: string - placementConstraint: - description: PlacementConstraint encapsulates the placement constraints - used within this deployment zone. - properties: - folder: - description: Folder is the name or inventory path of the folder - in which the virtual machine is created/located. - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the - resource pool in which the virtual machine is created/located. - type: string - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - required: - - placementConstraint - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - ready: - description: Ready is true when the VSphereDeploymentZone resource - is ready. If set to false, it will be ignored by VSphereClusters - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspherefailuredomains.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereFailureDomain - listKind: VSphereFailureDomainList - plural: vspherefailuredomains - singular: vspherefailuredomain - scope: Cluster - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereFailureDomain is the Schema for the vspherefailuredomains - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereFailureDomainSpec defines the desired state of VSphereFailureDomain - properties: - region: - description: Region defines the name and type of a region - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in - the Topology - type: boolean - name: - description: Name is the name of the tag that represents this - failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values - are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - topology: - description: Topology is the what describes a given failure domain - using vSphere constructs - properties: - computeCluster: - description: ComputeCluster as the failure domain - type: string - datacenter: - description: The underlying infrastructure for this failure domain - Datacenter as the failure domain - type: string - datastore: - description: Datastore is the name or inventory path of the datastore - in which the virtual machine is created/located. - type: string - hosts: - description: Hosts has information required for placement of machines - on VSphere hosts. - properties: - hostGroupName: - description: HostGroupName is the name of the Host group - type: string - vmGroupName: - description: VMGroupName is the name of the VM group - type: string - required: - - hostGroupName - - vmGroupName - type: object - networks: - description: Networks is the list of networks within this failure - domain - items: - type: string - type: array - required: - - datacenter - type: object - zone: - description: Zone defines the name and type of a zone - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in - the Topology - type: boolean - name: - description: Name is the name of the tag that represents this - failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values - are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - required: - - region - - topology - - zone - type: object - type: object - served: true - storage: false - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereFailureDomain is the Schema for the vspherefailuredomains - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereFailureDomainSpec defines the desired state of VSphereFailureDomain - properties: - region: - description: Region defines the name and type of a region - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in - the Topology - type: boolean - name: - description: Name is the name of the tag that represents this - failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values - are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - topology: - description: Topology describes a given failure domain using vSphere - constructs - properties: - computeCluster: - description: ComputeCluster as the failure domain - type: string - datacenter: - description: The underlying infrastructure for this failure domain - Datacenter as the failure domain - type: string - datastore: - description: Datastore is the name or inventory path of the datastore - in which the virtual machine is created/located. - type: string - hosts: - description: Hosts has information required for placement of machines - on VSphere hosts. - properties: - hostGroupName: - description: HostGroupName is the name of the Host group - type: string - vmGroupName: - description: VMGroupName is the name of the VM group - type: string - required: - - hostGroupName - - vmGroupName - type: object - networks: - description: Networks is the list of networks within this failure - domain - items: - type: string - type: array - required: - - datacenter - type: object - zone: - description: Zone defines the name and type of a zone - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in - the Topology - type: boolean - name: - description: Name is the name of the tag that represents this - failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values - are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - required: - - region - - topology - - zone - type: object - type: object - served: true - storage: false - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereFailureDomain is the Schema for the vspherefailuredomains - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereFailureDomainSpec defines the desired state of VSphereFailureDomain - properties: - region: - description: Region defines the name and type of a region - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in - the Topology - type: boolean - name: - description: Name is the name of the tag that represents this - failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values - are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - topology: - description: Topology describes a given failure domain using vSphere - constructs - properties: - computeCluster: - description: ComputeCluster as the failure domain - type: string - datacenter: - description: Datacenter as the failure domain. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore - in which the virtual machine is created/located. - type: string - hosts: - description: Hosts has information required for placement of machines - on VSphere hosts. - properties: - hostGroupName: - description: HostGroupName is the name of the Host group - type: string - vmGroupName: - description: VMGroupName is the name of the VM group - type: string - required: - - hostGroupName - - vmGroupName - type: object - networks: - description: Networks is the list of networks within this failure - domain - items: - type: string - type: array - required: - - datacenter - type: object - zone: - description: Zone defines the name and type of a zone - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in - the Topology - type: boolean - name: - description: Name is the name of the tag that represents this - failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values - are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - required: - - region - - topology - - zone - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspheremachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereMachine - listKind: VSphereMachineList - plural: vspheremachines - singular: vspheremachine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this VSphereMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: VSphereMachine instance ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine object which owns this VSphereMachine - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereMachine is the Schema for the vspheremachines API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineSpec defines the desired state of VSphereMachine - properties: - cloneMode: - description: CloneMode specifies the type of clone operation. The - LinkedClone mode is only support for templates that have at least - one snapshot. If the template has no snapshots, then CloneMode defaults - to FullClone. When LinkedClone mode is enabled the DiskGiB field - is ignored as it is not possible to expand disks of linked clones. - Defaults to LinkedClone, but fails gracefully to FullClone if the - source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options - that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter - in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore - in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. - Defaults to the eponymous property value in the template from which - the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster API. For - this infrastructure provider, the name is equivalent to the name - of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder in - which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, - in MiB. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's - VM. - properties: - devices: - description: Devices is the list of network devices used by the - virtual machine. TODO(akutz) Make sure at least one network - matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration - for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly assign - a name to the network device as it exists in the guest - operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not - to use DHCP for IPv4 on this device. If true then IPAddrs - should not contain any IPv4 addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether or not - to use DHCP for IPv6 on this device. If true then IPAddrs - should not contain any IPv6 addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or - IPv6 addresses to assign to this device. Required when - DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. - It is generally a good idea to omit this field and allow - a MAC address to be generated. Please note that this value - must use the VMware OUI to work with the in-tree vSphere - cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit - size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses - used as DNS nameservers. Please note that Linux allows - only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network - to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes - applied to the device. - items: - description: NetworkRouteSpec defines a static network - route. - properties: - metric: - description: Metric is the weight/priority of the - route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used - when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the - Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied - to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual - machine. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute - CPUs in this virtual machine. Defaults to the eponymous property - value in the template from which the virtual machine is cloned. - format: int32 - type: integer - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated - as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource - pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server - on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create - a linked clone. This field is ignored if LinkedClone is not enabled. - Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this - Virtual Machine - type: string - template: - description: Template is the name or inventory path of the template - used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the - given vCenter server's host certificate When this is set to empty, - this VirtualMachine would be created without TLS certificate validation - of the communication between Cluster API Provider vSphere and the - VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereMachineStatus defines the observed state of VSphereMachine - properties: - addresses: - description: Addresses contains the VSphere instance associated addresses. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - network: - description: Network returns the network status for each of the machine's - configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's - networks. - properties: - connected: - description: Connected is a flag that indicates whether this - network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by - vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this VSphereMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: VSphereMachine instance ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine object which owns this VSphereMachine - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereMachine is the Schema for the vspheremachines API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineSpec defines the desired state of VSphereMachine - properties: - cloneMode: - description: CloneMode specifies the type of clone operation. The - LinkedClone mode is only support for templates that have at least - one snapshot. If the template has no snapshots, then CloneMode defaults - to FullClone. When LinkedClone mode is enabled the DiskGiB field - is ignored as it is not possible to expand disks of linked clones. - Defaults to LinkedClone, but fails gracefully to FullClone if the - source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options - that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter - in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore - in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. - Defaults to the eponymous property value in the template from which - the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster API. For - this infrastructure provider, the name is equivalent to the name - of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder in - which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, - in MiB. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's - VM. - properties: - devices: - description: Devices is the list of network devices used by the - virtual machine. TODO(akutz) Make sure at least one network - matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration - for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly assign - a name to the network device as it exists in the guest - operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not - to use DHCP for IPv4 on this device. If true then IPAddrs - should not contain any IPv4 addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether or not - to use DHCP for IPv6 on this device. If true then IPAddrs - should not contain any IPv6 addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or - IPv6 addresses to assign to this device. Required when - DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. - It is generally a good idea to omit this field and allow - a MAC address to be generated. Please note that this value - must use the VMware OUI to work with the in-tree vSphere - cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit - size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses - used as DNS nameservers. Please note that Linux allows - only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network - to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes - applied to the device. - items: - description: NetworkRouteSpec defines a static network - route. - properties: - metric: - description: Metric is the weight/priority of the - route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used - when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the - Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied - to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual - machine. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute - CPUs in this virtual machine. Defaults to the eponymous property - value in the template from which the virtual machine is cloned. - format: int32 - type: integer - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated - as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource - pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server - on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create - a linked clone. This field is ignored if LinkedClone is not enabled. - Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this - Virtual Machine - type: string - template: - description: Template is the name or inventory path of the template - used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the - given vCenter server's host certificate When this is set to empty, - this VirtualMachine would be created without TLS certificate validation - of the communication between Cluster API Provider vSphere and the - VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereMachineStatus defines the observed state of VSphereMachine - properties: - addresses: - description: Addresses contains the VSphere instance associated addresses. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - network: - description: Network returns the network status for each of the machine's - configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's - networks. - properties: - connected: - description: Connected is a flag that indicates whether this - network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by - vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this VSphereMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: VSphereMachine instance ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine object which owns with this VSphereMachine - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereMachine is the Schema for the vspheremachines API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineSpec defines the desired state of VSphereMachine - properties: - additionalDisksGiB: - description: AdditionalDisksGiB holds the sizes of additional disks - of the virtual machine, in GiB Defaults to the eponymous property - value in the template from which the virtual machine is cloned. - items: - format: int32 - type: integer - type: array - cloneMode: - description: CloneMode specifies the type of clone operation. The - LinkedClone mode is only support for templates that have at least - one snapshot. If the template has no snapshots, then CloneMode defaults - to FullClone. When LinkedClone mode is enabled the DiskGiB field - is ignored as it is not possible to expand disks of linked clones. - Defaults to LinkedClone, but fails gracefully to FullClone if the - source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options - that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter - in which the virtual machine is created/located. Defaults to * which - selects the default datacenter. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore - in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. - Defaults to the eponymous property value in the template from which - the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster API. For - this infrastructure provider, the name is equivalent to the name - of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder in - which the virtual machine is created/located. - type: string - hardwareVersion: - description: HardwareVersion is the hardware version of the virtual - machine. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. Check the compatibility - with the ESXi version before setting the value. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, - in MiB. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's - VM. - properties: - devices: - description: Devices is the list of network devices used by the - virtual machine. TODO(akutz) Make sure at least one network - matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration - for a virtual machine's network device. - properties: - addressesFromPools: - description: AddressesFromPools is a list of IPAddressPools - that should be assigned to IPAddressClaims. The machine's - cloud-init metadata will be populated with IPAddresses - fulfilled by an IPAM provider. - items: - description: TypedLocalObjectReference contains enough - information to let you locate the typed referenced object - inside the same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, - the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - type: array - deviceName: - description: DeviceName may be used to explicitly assign - a name to the network device as it exists in the guest - operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not - to use DHCP for IPv4 on this device. If true then IPAddrs - should not contain any IPv4 addresses. - type: boolean - dhcp4Overrides: - description: DHCP4Overrides allows for the control over - several DHCP behaviors. Overrides will only be applied - when the corresponding DHCP flag is set. Only configured - values will be sent, omitted values will default to distribution - defaults. Dependent on support in the network stack for - your distribution. For more information see the netplan - reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will be sent - to the DHCP server instead of the machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize routes - for devices. A lower metric for an interface will - have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname - of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers in - the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values `true`, - `false`, or `route`. When `true`, the domain name - from the DHCP server will be used as the DNS search - domain for this device. When `route`, the domain name - from the DHCP response will be used for routing DNS - only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname from - the DHCP server will be set as the transient hostname - of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from the DHCP - server will be set as the MTU of the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers from - the DHCP server will be used by systemd-timesyncd - and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes from - the DHCP server will be installed in the routing table. - type: string - type: object - dhcp6: - description: DHCP6 is a flag that indicates whether or not - to use DHCP for IPv6 on this device. If true then IPAddrs - should not contain any IPv6 addresses. - type: boolean - dhcp6Overrides: - description: DHCP6Overrides allows for the control over - several DHCP behaviors. Overrides will only be applied - when the corresponding DHCP flag is set. Only configured - values will be sent, omitted values will default to distribution - defaults. Dependent on support in the network stack for - your distribution. For more information see the netplan - reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will be sent - to the DHCP server instead of the machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize routes - for devices. A lower metric for an interface will - have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname - of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers in - the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values `true`, - `false`, or `route`. When `true`, the domain name - from the DHCP server will be used as the DNS search - domain for this device. When `route`, the domain name - from the DHCP response will be used for routing DNS - only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname from - the DHCP server will be set as the transient hostname - of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from the DHCP - server will be set as the MTU of the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers from - the DHCP server will be used by systemd-timesyncd - and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes from - the DHCP server will be installed in the routing table. - type: string - type: object - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or - IPv6 addresses to assign to this device. Required when - DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. - It is generally a good idea to omit this field and allow - a MAC address to be generated. Please note that this value - must use the VMware OUI to work with the in-tree vSphere - cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit - size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses - used as DNS nameservers. Please note that Linux allows - only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network - to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes - applied to the device. - items: - description: NetworkRouteSpec defines a static network - route. - properties: - metric: - description: Metric is the weight/priority of the - route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used - when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the - Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied - to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual - machine. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute - CPUs in this virtual machine. Defaults to the eponymous property - value in the template from which the virtual machine is cloned. - format: int32 - type: integer - os: - description: OS is the Operating System of the virtual machine Defaults - to Linux - type: string - pciDevices: - description: PciDevices is the list of pci devices used by the virtual - machine. - items: - description: PCIDeviceSpec defines virtual machine's PCI configuration - properties: - deviceId: - description: DeviceID is the device ID of a virtual machine's - PCI, in integer. Defaults to the eponymous property value - in the template from which the virtual machine is cloned. - format: int32 - type: integer - vendorId: - description: VendorId is the vendor ID of a virtual machine's - PCI, in integer. Defaults to the eponymous property value - in the template from which the virtual machine is cloned. - format: int32 - type: integer - type: object - type: array - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated - as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource - pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server - on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create - a linked clone. This field is ignored if LinkedClone is not enabled. - Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this - Virtual Machine - type: string - tagIDs: - description: TagIDs is an optional set of tags to add to an instance. - Specified tagIDs must use URN-notation instead of display names. - items: - type: string - type: array - template: - description: Template is the name or inventory path of the template - used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the - given vCenter server's host certificate When this is set to empty, - this VirtualMachine would be created without TLS certificate validation - of the communication between Cluster API Provider vSphere and the - VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereMachineStatus defines the observed state of VSphereMachine - properties: - addresses: - description: Addresses contains the VSphere instance associated addresses. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - network: - description: Network returns the network status for each of the machine's - configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's - networks. - properties: - connected: - description: Connected is a flag that indicates whether this - network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by - vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspheremachinetemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereMachineTemplate - listKind: VSphereMachineTemplateList - plural: vspheremachinetemplates - singular: vspheremachinetemplate - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereMachineTemplate is the Schema for the vspheremachinetemplates - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineTemplateSpec defines the desired state of VSphereMachineTemplate - properties: - template: - description: VSphereMachineTemplateResource describes the data needed - to create a VSphereMachine from a template - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - generateName: - description: "GenerateName is an optional prefix, used by - the server, to generate a unique name ONLY IF the Name field - has not been provided. If this field is used, the name returned - to the client will be different than the name passed. This - value will also be combined with a unique suffix. The provided - value has the same validation rules as the Name field, and - may be truncated by the length of the suffix required to - make the value unique on the server. \n If this field is - specified and the generated name exists, the server will - NOT return a 409 - instead, it will either return 201 Created - or 500 with Reason ServerTimeout indicating a unique name - could not be found in the time allotted, and the client - should retry (optionally after the time indicated in the - Retry-After header). \n Applied only if Name is not specified. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency - \n Deprecated: This field has no function and is going to - be removed in a next release." - type: string - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - name: - description: "Name must be unique within a namespace. Is required - when creating resources, although some resources may allow - a client to request the generation of an appropriate name - automatically. Name is primarily intended for creation idempotence - and configuration definition. Cannot be updated. More info: - http://kubernetes.io/docs/user-guide/identifiers#names \n - Deprecated: This field has no function and is going to be - removed in a next release." - type: string - namespace: - description: "Namespace defines the space within each name - must be unique. An empty namespace is equivalent to the - \"default\" namespace, but \"default\" is the canonical - representation. Not all objects are required to be scoped - to a namespace - the value of this field for those objects - will be empty. \n Must be a DNS_LABEL. Cannot be updated. - More info: http://kubernetes.io/docs/user-guide/namespaces - \n Deprecated: This field has no function and is going to - be removed in a next release." - type: string - ownerReferences: - description: "List of objects depended by this object. If - ALL objects in the list have been deleted, this object will - be garbage collected. If this object is managed by a controller, - then an entry in this list will point to this controller, - with the controller field set to true. There cannot be more - than one managing controller. \n Deprecated: This field - has no function and is going to be removed in a next release." - items: - description: OwnerReference contains enough information - to let you identify an owning object. An owning object - must be in the same namespace as the dependent, or be - cluster-scoped, so there is no namespace field. - properties: - apiVersion: - description: API version of the referent. - type: string - blockOwnerDeletion: - description: If true, AND if the owner has the "foregroundDeletion" - finalizer, then the owner cannot be deleted from the - key-value store until this reference is removed. See - https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion - for how the garbage collector interacts with this - field and enforces the foreground deletion. Defaults - to false. To set this field, a user needs "delete" - permission of the owner, otherwise 422 (Unprocessable - Entity) will be returned. - type: boolean - controller: - description: If true, this reference points to the managing - controller. - type: boolean - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names' - type: string - uid: - description: 'UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids' - type: string - required: - - apiVersion - - kind - - name - - uid - type: object - type: array - type: object - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - cloneMode: - description: CloneMode specifies the type of clone operation. - The LinkedClone mode is only support for templates that - have at least one snapshot. If the template has no snapshots, - then CloneMode defaults to FullClone. When LinkedClone mode - is enabled the DiskGiB field is ignored as it is not possible - to expand disks of linked clones. Defaults to LinkedClone, - but fails gracefully to FullClone if the source of the clone - operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX - options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the - datacenter in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the - datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, - in GiB. Defaults to the eponymous property value in the - template from which the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster - API. For this infrastructure provider, the name is equivalent - to the name of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder - in which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's - memory, in MiB. Defaults to the eponymous property value - in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this - machine's VM. - properties: - devices: - description: Devices is the list of network devices used - by the virtual machine. TODO(akutz) Make sure at least - one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration - for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly - assign a name to the network device as it exists - in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether - or not to use DHCP for IPv4 on this device. If - true then IPAddrs should not contain any IPv4 - addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether - or not to use DHCP for IPv6 on this device. If - true then IPAddrs should not contain any IPv6 - addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by - this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by - this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 - and/or IPv6 addresses to assign to this device. - Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by - this device. It is generally a good idea to omit - this field and allow a MAC address to be generated. - Please note that this value must use the VMware - OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission - Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or - IPv6 addresses used as DNS nameservers. Please - note that Linux allows only three nameservers - (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere - network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static - routes applied to the device. - items: - description: NetworkRouteSpec defines a static - network route. - properties: - metric: - description: Metric is the weight/priority - of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains - used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR - for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes - applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network - route. - properties: - metric: - description: Metric is the weight/priority of the - route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in - a virtual machine. Defaults to the eponymous property value - in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to - distribute CPUs in this virtual machine. Defaults to the - eponymous property value in the template from which the - virtual machine is cloned. - format: int32 - type: integer - providerID: - description: ProviderID is the virtual machine's BIOS UUID - formated as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of - the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere - server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which - to create a linked clone. This field is ignored if LinkedClone - is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use - with this Virtual Machine - type: string - template: - description: Template is the name or inventory path of the - template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum - of the given vCenter server's host certificate When this - is set to empty, this VirtualMachine would be created without - TLS certificate validation of the communication between - Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereMachineTemplate is the Schema for the vspheremachinetemplates - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineTemplateSpec defines the desired state of VSphereMachineTemplate - properties: - template: - description: VSphereMachineTemplateResource describes the data needed - to create a VSphereMachine from a template - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - cloneMode: - description: CloneMode specifies the type of clone operation. - The LinkedClone mode is only support for templates that - have at least one snapshot. If the template has no snapshots, - then CloneMode defaults to FullClone. When LinkedClone mode - is enabled the DiskGiB field is ignored as it is not possible - to expand disks of linked clones. Defaults to LinkedClone, - but fails gracefully to FullClone if the source of the clone - operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX - options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the - datacenter in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the - datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, - in GiB. Defaults to the eponymous property value in the - template from which the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster - API. For this infrastructure provider, the name is equivalent - to the name of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder - in which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's - memory, in MiB. Defaults to the eponymous property value - in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this - machine's VM. - properties: - devices: - description: Devices is the list of network devices used - by the virtual machine. TODO(akutz) Make sure at least - one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration - for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly - assign a name to the network device as it exists - in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether - or not to use DHCP for IPv4 on this device. If - true then IPAddrs should not contain any IPv4 - addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether - or not to use DHCP for IPv6 on this device. If - true then IPAddrs should not contain any IPv6 - addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by - this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by - this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 - and/or IPv6 addresses to assign to this device. - Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by - this device. It is generally a good idea to omit - this field and allow a MAC address to be generated. - Please note that this value must use the VMware - OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission - Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or - IPv6 addresses used as DNS nameservers. Please - note that Linux allows only three nameservers - (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere - network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static - routes applied to the device. - items: - description: NetworkRouteSpec defines a static - network route. - properties: - metric: - description: Metric is the weight/priority - of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains - used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR - for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes - applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network - route. - properties: - metric: - description: Metric is the weight/priority of the - route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in - a virtual machine. Defaults to the eponymous property value - in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to - distribute CPUs in this virtual machine. Defaults to the - eponymous property value in the template from which the - virtual machine is cloned. - format: int32 - type: integer - providerID: - description: ProviderID is the virtual machine's BIOS UUID - formated as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of - the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere - server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which - to create a linked clone. This field is ignored if LinkedClone - is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use - with this Virtual Machine - type: string - template: - description: Template is the name or inventory path of the - template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum - of the given vCenter server's host certificate When this - is set to empty, this VirtualMachine would be created without - TLS certificate validation of the communication between - Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereMachineTemplate is the Schema for the vspheremachinetemplates - API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineTemplateSpec defines the desired state of VSphereMachineTemplate - properties: - template: - description: VSphereMachineTemplateResource describes the data needed - to create a VSphereMachine from a template - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - additionalDisksGiB: - description: AdditionalDisksGiB holds the sizes of additional - disks of the virtual machine, in GiB Defaults to the eponymous - property value in the template from which the virtual machine - is cloned. - items: - format: int32 - type: integer - type: array - cloneMode: - description: CloneMode specifies the type of clone operation. - The LinkedClone mode is only support for templates that - have at least one snapshot. If the template has no snapshots, - then CloneMode defaults to FullClone. When LinkedClone mode - is enabled the DiskGiB field is ignored as it is not possible - to expand disks of linked clones. Defaults to LinkedClone, - but fails gracefully to FullClone if the source of the clone - operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX - options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the - datacenter in which the virtual machine is created/located. - Defaults to * which selects the default datacenter. - type: string - datastore: - description: Datastore is the name or inventory path of the - datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, - in GiB. Defaults to the eponymous property value in the - template from which the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier - this Machine should be attached to, as defined in Cluster - API. For this infrastructure provider, the name is equivalent - to the name of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder - in which the virtual machine is created/located. - type: string - hardwareVersion: - description: HardwareVersion is the hardware version of the - virtual machine. Defaults to the eponymous property value - in the template from which the virtual machine is cloned. - Check the compatibility with the ESXi version before setting - the value. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's - memory, in MiB. Defaults to the eponymous property value - in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this - machine's VM. - properties: - devices: - description: Devices is the list of network devices used - by the virtual machine. TODO(akutz) Make sure at least - one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration - for a virtual machine's network device. - properties: - addressesFromPools: - description: AddressesFromPools is a list of IPAddressPools - that should be assigned to IPAddressClaims. The - machine's cloud-init metadata will be populated - with IPAddresses fulfilled by an IPAM provider. - items: - description: TypedLocalObjectReference contains - enough information to let you locate the typed - referenced object inside the same namespace. - properties: - apiGroup: - description: APIGroup is the group for the - resource being referenced. If APIGroup is - not specified, the specified Kind must be - in the core API group. For any other third-party - types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource - being referenced - type: string - name: - description: Name is the name of resource - being referenced - type: string - required: - - kind - - name - type: object - type: array - deviceName: - description: DeviceName may be used to explicitly - assign a name to the network device as it exists - in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether - or not to use DHCP for IPv4 on this device. If - true then IPAddrs should not contain any IPv4 - addresses. - type: boolean - dhcp4Overrides: - description: DHCP4Overrides allows for the control - over several DHCP behaviors. Overrides will only - be applied when the corresponding DHCP flag is - set. Only configured values will be sent, omitted - values will default to distribution defaults. - Dependent on support in the network stack for - your distribution. For more information see the - netplan reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will - be sent to the DHCP server instead of the - machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize - routes for devices. A lower metric for an - interface will have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname - of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers - in the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values - `true`, `false`, or `route`. When `true`, - the domain name from the DHCP server will - be used as the DNS search domain for this - device. When `route`, the domain name from - the DHCP response will be used for routing - DNS only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname - from the DHCP server will be set as the transient - hostname of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from - the DHCP server will be set as the MTU of - the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers - from the DHCP server will be used by systemd-timesyncd - and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes - from the DHCP server will be installed in - the routing table. - type: string - type: object - dhcp6: - description: DHCP6 is a flag that indicates whether - or not to use DHCP for IPv6 on this device. If - true then IPAddrs should not contain any IPv6 - addresses. - type: boolean - dhcp6Overrides: - description: DHCP6Overrides allows for the control - over several DHCP behaviors. Overrides will only - be applied when the corresponding DHCP flag is - set. Only configured values will be sent, omitted - values will default to distribution defaults. - Dependent on support in the network stack for - your distribution. For more information see the - netplan reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will - be sent to the DHCP server instead of the - machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize - routes for devices. A lower metric for an - interface will have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname - of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers - in the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values - `true`, `false`, or `route`. When `true`, - the domain name from the DHCP server will - be used as the DNS search domain for this - device. When `route`, the domain name from - the DHCP response will be used for routing - DNS only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname - from the DHCP server will be set as the transient - hostname of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from - the DHCP server will be set as the MTU of - the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers - from the DHCP server will be used by systemd-timesyncd - and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes - from the DHCP server will be installed in - the routing table. - type: string - type: object - gateway4: - description: Gateway4 is the IPv4 gateway used by - this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by - this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 - and/or IPv6 addresses to assign to this device. - Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by - this device. It is generally a good idea to omit - this field and allow a MAC address to be generated. - Please note that this value must use the VMware - OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission - Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or - IPv6 addresses used as DNS nameservers. Please - note that Linux allows only three nameservers - (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere - network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static - routes applied to the device. - items: - description: NetworkRouteSpec defines a static - network route. - properties: - metric: - description: Metric is the weight/priority - of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains - used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR - for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes - applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network - route. - properties: - metric: - description: Metric is the weight/priority of the - route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in - a virtual machine. Defaults to the eponymous property value - in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to - distribute CPUs in this virtual machine. Defaults to the - eponymous property value in the template from which the - virtual machine is cloned. - format: int32 - type: integer - os: - description: OS is the Operating System of the virtual machine - Defaults to Linux - type: string - pciDevices: - description: PciDevices is the list of pci devices used by - the virtual machine. - items: - description: PCIDeviceSpec defines virtual machine's PCI - configuration - properties: - deviceId: - description: DeviceID is the device ID of a virtual - machine's PCI, in integer. Defaults to the eponymous - property value in the template from which the virtual - machine is cloned. - format: int32 - type: integer - vendorId: - description: VendorId is the vendor ID of a virtual - machine's PCI, in integer. Defaults to the eponymous - property value in the template from which the virtual - machine is cloned. - format: int32 - type: integer - type: object - type: array - providerID: - description: ProviderID is the virtual machine's BIOS UUID - formated as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of - the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere - server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which - to create a linked clone. This field is ignored if LinkedClone - is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use - with this Virtual Machine - type: string - tagIDs: - description: TagIDs is an optional set of tags to add to an - instance. Specified tagIDs must use URN-notation instead - of display names. - items: - type: string - type: array - template: - description: Template is the name or inventory path of the - template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum - of the given vCenter server's host certificate When this - is set to empty, this VirtualMachine would be created without - TLS certificate validation of the communication between - Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspherevms.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - kind: VSphereVM - listKind: VSphereVMList - plural: vspherevms - singular: vspherevm - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereVM is the Schema for the vspherevms API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereVMSpec defines the desired state of VSphereVM. - properties: - biosUUID: - description: BiosUUID is the the VM's BIOS UUID that is assigned at - runtime after the VM has been created. This field is required at - runtime for other controllers that read this CRD as unstructured - data. - type: string - bootstrapRef: - description: BootstrapRef is a reference to a bootstrap provider-specific - resource that holds configuration details. This field is optional - in case no bootstrap data is required to create a VM. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - cloneMode: - description: CloneMode specifies the type of clone operation. The - LinkedClone mode is only support for templates that have at least - one snapshot. If the template has no snapshots, then CloneMode defaults - to FullClone. When LinkedClone mode is enabled the DiskGiB field - is ignored as it is not possible to expand disks of linked clones. - Defaults to LinkedClone, but fails gracefully to FullClone if the - source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options - that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter - in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore - in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. - Defaults to the eponymous property value in the template from which - the virtual machine is cloned. - format: int32 - type: integer - folder: - description: Folder is the name or inventory path of the folder in - which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, - in MiB. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's - VM. - properties: - devices: - description: Devices is the list of network devices used by the - virtual machine. TODO(akutz) Make sure at least one network - matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration - for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly assign - a name to the network device as it exists in the guest - operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not - to use DHCP for IPv4 on this device. If true then IPAddrs - should not contain any IPv4 addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether or not - to use DHCP for IPv6 on this device. If true then IPAddrs - should not contain any IPv6 addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or - IPv6 addresses to assign to this device. Required when - DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. - It is generally a good idea to omit this field and allow - a MAC address to be generated. Please note that this value - must use the VMware OUI to work with the in-tree vSphere - cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit - size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses - used as DNS nameservers. Please note that Linux allows - only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network - to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes - applied to the device. - items: - description: NetworkRouteSpec defines a static network - route. - properties: - metric: - description: Metric is the weight/priority of the - route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used - when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the - Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied - to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual - machine. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute - CPUs in this virtual machine. Defaults to the eponymous property - value in the template from which the virtual machine is cloned. - format: int32 - type: integer - resourcePool: - description: ResourcePool is the name or inventory path of the resource - pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server - on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create - a linked clone. This field is ignored if LinkedClone is not enabled. - Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this - Virtual Machine - type: string - template: - description: Template is the name or inventory path of the template - used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the - given vCenter server's host certificate When this is set to empty, - this VirtualMachine would be created without TLS certificate validation - of the communication between Cluster API Provider vSphere and the - VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereVMStatus defines the observed state of VSphereVM - properties: - addresses: - description: Addresses is a list of the VM's IP addresses. This field - is required at runtime for other controllers that read this CRD - as unstructured data. - items: - type: string - type: array - cloneMode: - description: CloneMode is the type of clone operation used to clone - this VM. Since LinkedMode is the default but fails gracefully if - the source of the clone has no snapshots, this field may be used - to determine the actual type of clone operation used to create this - VM. - type: string - conditions: - description: Conditions defines current service state of the VSphereVM. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the vspherevm and will contain a - more verbose string suitable for logging and human consumption. - \n This field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the vm. \n Any transient errors that occur during the - reconciliation of vspherevms can be added as events to the vspherevm - object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the vspherevm and will contain a - succinct value suitable for vm interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the vm. \n Any transient errors that occur during the reconciliation - of vspherevms can be added as events to the vspherevm object and/or - logged in the controller's output." - type: string - network: - description: Network returns the network status for each of the machine's - configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's - networks. - properties: - connected: - description: Connected is a flag that indicates whether this - network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by - vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. This - field is required at runtime for other controllers that read this - CRD as unstructured data. - type: boolean - retryAfter: - description: RetryAfter tracks the time we can retry queueing a task - format: date-time - type: string - snapshot: - description: Snapshot is the name of the snapshot from which the VM - was cloned if LinkedMode is enabled. - type: string - taskRef: - description: TaskRef is a managed object reference to a Task related - to the machine. This value is set automatically at runtime and should - not be set or modified by users. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereVM is the Schema for the vspherevms API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereVMSpec defines the desired state of VSphereVM. - properties: - biosUUID: - description: BiosUUID is the the VM's BIOS UUID that is assigned at - runtime after the VM has been created. This field is required at - runtime for other controllers that read this CRD as unstructured - data. - type: string - bootstrapRef: - description: BootstrapRef is a reference to a bootstrap provider-specific - resource that holds configuration details. This field is optional - in case no bootstrap data is required to create a VM. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - cloneMode: - description: CloneMode specifies the type of clone operation. The - LinkedClone mode is only support for templates that have at least - one snapshot. If the template has no snapshots, then CloneMode defaults - to FullClone. When LinkedClone mode is enabled the DiskGiB field - is ignored as it is not possible to expand disks of linked clones. - Defaults to LinkedClone, but fails gracefully to FullClone if the - source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options - that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter - in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore - in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. - Defaults to the eponymous property value in the template from which - the virtual machine is cloned. - format: int32 - type: integer - folder: - description: Folder is the name or inventory path of the folder in - which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, - in MiB. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's - VM. - properties: - devices: - description: Devices is the list of network devices used by the - virtual machine. TODO(akutz) Make sure at least one network - matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration - for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly assign - a name to the network device as it exists in the guest - operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not - to use DHCP for IPv4 on this device. If true then IPAddrs - should not contain any IPv4 addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether or not - to use DHCP for IPv6 on this device. If true then IPAddrs - should not contain any IPv6 addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or - IPv6 addresses to assign to this device. Required when - DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. - It is generally a good idea to omit this field and allow - a MAC address to be generated. Please note that this value - must use the VMware OUI to work with the in-tree vSphere - cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit - size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses - used as DNS nameservers. Please note that Linux allows - only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network - to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes - applied to the device. - items: - description: NetworkRouteSpec defines a static network - route. - properties: - metric: - description: Metric is the weight/priority of the - route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used - when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the - Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied - to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual - machine. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute - CPUs in this virtual machine. Defaults to the eponymous property - value in the template from which the virtual machine is cloned. - format: int32 - type: integer - resourcePool: - description: ResourcePool is the name or inventory path of the resource - pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server - on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create - a linked clone. This field is ignored if LinkedClone is not enabled. - Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this - Virtual Machine - type: string - template: - description: Template is the name or inventory path of the template - used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the - given vCenter server's host certificate When this is set to empty, - this VirtualMachine would be created without TLS certificate validation - of the communication between Cluster API Provider vSphere and the - VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereVMStatus defines the observed state of VSphereVM - properties: - addresses: - description: Addresses is a list of the VM's IP addresses. This field - is required at runtime for other controllers that read this CRD - as unstructured data. - items: - type: string - type: array - cloneMode: - description: CloneMode is the type of clone operation used to clone - this VM. Since LinkedMode is the default but fails gracefully if - the source of the clone has no snapshots, this field may be used - to determine the actual type of clone operation used to create this - VM. - type: string - conditions: - description: Conditions defines current service state of the VSphereVM. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the vspherevm and will contain a - more verbose string suitable for logging and human consumption. - \n This field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the vm. \n Any transient errors that occur during the - reconciliation of vspherevms can be added as events to the vspherevm - object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the vspherevm and will contain a - succinct value suitable for vm interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the vm. \n Any transient errors that occur during the reconciliation - of vspherevms can be added as events to the vspherevm object and/or - logged in the controller's output." - type: string - network: - description: Network returns the network status for each of the machine's - configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's - networks. - properties: - connected: - description: Connected is a flag that indicates whether this - network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by - vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. This - field is required at runtime for other controllers that read this - CRD as unstructured data. - type: boolean - retryAfter: - description: RetryAfter tracks the time we can retry queueing a task - format: date-time - type: string - snapshot: - description: Snapshot is the name of the snapshot from which the VM - was cloned if LinkedMode is enabled. - type: string - taskRef: - description: TaskRef is a managed object reference to a Task related - to the machine. This value is set automatically at runtime and should - not be set or modified by users. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereVM is the Schema for the vspherevms API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereVMSpec defines the desired state of VSphereVM. - properties: - additionalDisksGiB: - description: AdditionalDisksGiB holds the sizes of additional disks - of the virtual machine, in GiB Defaults to the eponymous property - value in the template from which the virtual machine is cloned. - items: - format: int32 - type: integer - type: array - biosUUID: - description: BiosUUID is the the VM's BIOS UUID that is assigned at - runtime after the VM has been created. This field is required at - runtime for other controllers that read this CRD as unstructured - data. - type: string - bootstrapRef: - description: BootstrapRef is a reference to a bootstrap provider-specific - resource that holds configuration details. This field is optional - in case no bootstrap data is required to create a VM. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - cloneMode: - description: CloneMode specifies the type of clone operation. The - LinkedClone mode is only support for templates that have at least - one snapshot. If the template has no snapshots, then CloneMode defaults - to FullClone. When LinkedClone mode is enabled the DiskGiB field - is ignored as it is not possible to expand disks of linked clones. - Defaults to LinkedClone, but fails gracefully to FullClone if the - source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options - that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter - in which the virtual machine is created/located. Defaults to * which - selects the default datacenter. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore - in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. - Defaults to the eponymous property value in the template from which - the virtual machine is cloned. - format: int32 - type: integer - folder: - description: Folder is the name or inventory path of the folder in - which the virtual machine is created/located. - type: string - hardwareVersion: - description: HardwareVersion is the hardware version of the virtual - machine. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. Check the compatibility - with the ESXi version before setting the value. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, - in MiB. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's - VM. - properties: - devices: - description: Devices is the list of network devices used by the - virtual machine. TODO(akutz) Make sure at least one network - matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration - for a virtual machine's network device. - properties: - addressesFromPools: - description: AddressesFromPools is a list of IPAddressPools - that should be assigned to IPAddressClaims. The machine's - cloud-init metadata will be populated with IPAddresses - fulfilled by an IPAM provider. - items: - description: TypedLocalObjectReference contains enough - information to let you locate the typed referenced object - inside the same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource - being referenced. If APIGroup is not specified, - the specified Kind must be in the core API group. - For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - type: array - deviceName: - description: DeviceName may be used to explicitly assign - a name to the network device as it exists in the guest - operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not - to use DHCP for IPv4 on this device. If true then IPAddrs - should not contain any IPv4 addresses. - type: boolean - dhcp4Overrides: - description: DHCP4Overrides allows for the control over - several DHCP behaviors. Overrides will only be applied - when the corresponding DHCP flag is set. Only configured - values will be sent, omitted values will default to distribution - defaults. Dependent on support in the network stack for - your distribution. For more information see the netplan - reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will be sent - to the DHCP server instead of the machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize routes - for devices. A lower metric for an interface will - have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname - of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers in - the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values `true`, - `false`, or `route`. When `true`, the domain name - from the DHCP server will be used as the DNS search - domain for this device. When `route`, the domain name - from the DHCP response will be used for routing DNS - only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname from - the DHCP server will be set as the transient hostname - of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from the DHCP - server will be set as the MTU of the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers from - the DHCP server will be used by systemd-timesyncd - and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes from - the DHCP server will be installed in the routing table. - type: string - type: object - dhcp6: - description: DHCP6 is a flag that indicates whether or not - to use DHCP for IPv6 on this device. If true then IPAddrs - should not contain any IPv6 addresses. - type: boolean - dhcp6Overrides: - description: DHCP6Overrides allows for the control over - several DHCP behaviors. Overrides will only be applied - when the corresponding DHCP flag is set. Only configured - values will be sent, omitted values will default to distribution - defaults. Dependent on support in the network stack for - your distribution. For more information see the netplan - reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will be sent - to the DHCP server instead of the machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize routes - for devices. A lower metric for an interface will - have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname - of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers in - the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values `true`, - `false`, or `route`. When `true`, the domain name - from the DHCP server will be used as the DNS search - domain for this device. When `route`, the domain name - from the DHCP response will be used for routing DNS - only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname from - the DHCP server will be set as the transient hostname - of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from the DHCP - server will be set as the MTU of the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers from - the DHCP server will be used by systemd-timesyncd - and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes from - the DHCP server will be installed in the routing table. - type: string - type: object - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. - Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or - IPv6 addresses to assign to this device. Required when - DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. - It is generally a good idea to omit this field and allow - a MAC address to be generated. Please note that this value - must use the VMware OUI to work with the in-tree vSphere - cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit - size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses - used as DNS nameservers. Please note that Linux allows - only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network - to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes - applied to the device. - items: - description: NetworkRouteSpec defines a static network - route. - properties: - metric: - description: Metric is the weight/priority of the - route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used - when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the - Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied - to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual - machine. Defaults to the eponymous property value in the template - from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute - CPUs in this virtual machine. Defaults to the eponymous property - value in the template from which the virtual machine is cloned. - format: int32 - type: integer - os: - description: OS is the Operating System of the virtual machine Defaults - to Linux - type: string - pciDevices: - description: PciDevices is the list of pci devices used by the virtual - machine. - items: - description: PCIDeviceSpec defines virtual machine's PCI configuration - properties: - deviceId: - description: DeviceID is the device ID of a virtual machine's - PCI, in integer. Defaults to the eponymous property value - in the template from which the virtual machine is cloned. - format: int32 - type: integer - vendorId: - description: VendorId is the vendor ID of a virtual machine's - PCI, in integer. Defaults to the eponymous property value - in the template from which the virtual machine is cloned. - format: int32 - type: integer - type: object - type: array - resourcePool: - description: ResourcePool is the name or inventory path of the resource - pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server - on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create - a linked clone. This field is ignored if LinkedClone is not enabled. - Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this - Virtual Machine - type: string - tagIDs: - description: TagIDs is an optional set of tags to add to an instance. - Specified tagIDs must use URN-notation instead of display names. - items: - type: string - type: array - template: - description: Template is the name or inventory path of the template - used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the - given vCenter server's host certificate When this is set to empty, - this VirtualMachine would be created without TLS certificate validation - of the communication between Cluster API Provider vSphere and the - VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereVMStatus defines the observed state of VSphereVM - properties: - addresses: - description: Addresses is a list of the VM's IP addresses. This field - is required at runtime for other controllers that read this CRD - as unstructured data. - items: - type: string - type: array - cloneMode: - description: CloneMode is the type of clone operation used to clone - this VM. Since LinkedMode is the default but fails gracefully if - the source of the clone has no snapshots, this field may be used - to determine the actual type of clone operation used to create this - VM. - type: string - conditions: - description: Conditions defines current service state of the VSphereVM. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is - a terminal problem reconciling the vspherevm and will contain a - more verbose string suitable for logging and human consumption. - \n This field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the vm. \n Any transient errors that occur during the - reconciliation of vspherevms can be added as events to the vspherevm - object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is - a terminal problem reconciling the vspherevm and will contain a - succinct value suitable for vm interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the vm. \n Any transient errors that occur during the reconciliation - of vspherevms can be added as events to the vspherevm object and/or - logged in the controller's output." - type: string - host: - description: Host describes the hostname or IP address of the infrastructure - host that the VSphereVM is residing on. - type: string - moduleUUID: - description: ModuleUUID is the unique identifier for the vCenter cluster - module construct which is used to configure anti-affinity. Objects - with the same ModuleUUID will be anti-affined, meaning that the - vCenter DRS will best effort schedule the VMs on separate hosts. - type: string - network: - description: Network returns the network status for each of the machine's - configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's - networks. - properties: - connected: - description: Connected is a flag that indicates whether this - network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by - vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. This - field is required at runtime for other controllers that read this - CRD as unstructured data. - type: boolean - retryAfter: - description: RetryAfter tracks the time we can retry queueing a task - format: date-time - type: string - snapshot: - description: Snapshot is the name of the snapshot from which the VM - was cloned if LinkedMode is enabled. - type: string - taskRef: - description: TaskRef is a managed object reference to a Task related - to the machine. This value is set automatically at runtime and should - not be set or modified by users. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-leader-election-role - namespace: capv-system -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -aggregationRule: - clusterRoleSelectors: - - matchLabels: - capv.infrastucture.cluster.x-k8s.io/aggregate-to-manager: "true" -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-aggregated-manager-role -rules: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - capv.infrastucture.cluster.x-k8s.io/aggregate-to-manager: "true" - cluster.x-k8s.io/aggregate-to-manager: "true" - cluster.x-k8s.io/provider: infrastructure-vsphere - kubeadm.controlplane.cluster.x-k8s.io/aggregate-to-manager: "true" - name: capv-manager-role -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - configmaps - - events - - nodes - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - patch - - update -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims - verbs: - - create - - delete - - get - - list - - update - - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims/status - verbs: - - get - - patch - - update -- apiGroups: - - "" - resources: - - secrets - verbs: - - get -- apiGroups: - - "" - resources: - - serviceaccounts - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - services - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - services/status - verbs: - - get -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - machines - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - - machinesets - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - verbs: - - get - - list - - patch - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines/status - verbs: - - get - - list - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - kubeadmcontrolplanes - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - nodes - verbs: - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusteridentities - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusteridentities/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheredeploymentzones - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheredeploymentzones/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherefailuredomains - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachines/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherevms - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherevms/status - verbs: - - get - - patch - - update -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddressclaims - verbs: - - create - - get - - list - - update - - watch -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddresses - verbs: - - get - - list - - watch -- apiGroups: - - netoperator.vmware.com - resources: - - networks - verbs: - - get - - list - - watch -- apiGroups: - - rbac.authorization.k8s.io - resources: - - rolebindings - - roles - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - topology.tanzu.vmware.com - resources: - - availabilityzones - verbs: - - get - - list - - watch -- apiGroups: - - topology.tanzu.vmware.com - resources: - - availabilityzones/status - verbs: - - get - - list - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachineimages - - virtualmachineimages/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachineservices - - virtualmachineservices/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachinesetresourcepolicies - - virtualmachinesetresourcepolicies/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.com - resources: - - virtualnetworks - - virtualnetworks/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - providerserviceaccounts - verbs: - - get - - list - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - providerserviceaccounts/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclustertemplates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachines/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-leader-election-rolebinding - namespace: capv-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capv-leader-election-role -subjects: -- kind: ServiceAccount - name: default - namespace: capv-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capv-aggregated-manager-role -subjects: -- kind: ServiceAccount - name: default - namespace: capv-system ---- -apiVersion: v1 -kind: Secret -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-manager-bootstrap-credentials - namespace: capv-system -stringData: - credentials.yaml: |- - username: '${VSPHERE_USERNAME}' - password: '${VSPHERE_PASSWORD}' -type: Opaque ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-webhook-service - namespace: capv-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-vsphere ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - control-plane: controller-manager - name: capv-controller-manager - namespace: capv-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-vsphere - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --logtostderr - - --v=4 - - --feature-gates=NodeAntiAffinity=${EXP_NODE_ANTI_AFFINITY:=false},NodeLabeling=${EXP_NODE_LABELING:=false} - image: gcr.io/cluster-api-provider-vsphere/release/manager:v1.5.3 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - - mountPath: /etc/capv - name: manager-bootstrap-credentials - readOnly: true - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: capv-webhook-service-cert - - name: manager-bootstrap-credentials - secret: - secretName: capv-manager-bootstrap-credentials ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-serving-cert - namespace: capv-system -spec: - dnsNames: - - capv-webhook-service.capv-system.svc - - capv-webhook-service.capv-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capv-selfsigned-issuer - secretName: capv-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-selfsigned-issuer - namespace: capv-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspheredeploymentzone - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspheredeploymentzone.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheredeploymentzones - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspherefailuredomain - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspherefailuredomain.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherefailuredomains - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspheremachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachines - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspherevm - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspherevm.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherevms - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vsphereclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vsphereclustertemplate.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vsphereclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspherefailuredomain - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspherefailuredomain.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherefailuredomains - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspheremachine.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachines - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspheremachinetemplate.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachinetemplates - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspherevm - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspherevm.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherevms - sideEffects: None diff --git a/packages/cluster-api-provider-vsphere/bundle/config/upstream/metadata.yaml b/packages/cluster-api-provider-vsphere/bundle/config/upstream/metadata.yaml deleted file mode 100644 index 0d4fc8ecc2..0000000000 --- a/packages/cluster-api-provider-vsphere/bundle/config/upstream/metadata.yaml +++ /dev/null @@ -1,41 +0,0 @@ -# maps release series of major.minor to cluster-api contract version -# the contract version may change between minor or major versions, but *not* -# between patch versions. -# -# update this file only when a new major or minor version is released -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: - - major: 0 - minor: 4 - contract: v1alpha2 - - major: 0 - minor: 5 - contract: v1alpha2 - - major: 0 - minor: 6 - contract: v1alpha3 - - major: 0 - minor: 7 - contract: v1alpha3 - - major: 0 - minor: 8 - contract: v1alpha4 - - major: 1 - minor: 0 - contract: v1beta1 - - major: 1 - minor: 1 - contract: v1beta1 - - major: 1 - minor: 2 - contract: v1beta1 - - major: 1 - minor: 3 - contract: v1beta1 - - major: 1 - minor: 4 - contract: v1beta1 - - major: 1 - minor: 5 - contract: v1beta1 diff --git a/packages/cluster-api-provider-vsphere/bundle/config/values.yaml b/packages/cluster-api-provider-vsphere/bundle/config/values.yaml deleted file mode 100644 index 0026dae2b6..0000000000 --- a/packages/cluster-api-provider-vsphere/bundle/config/values.yaml +++ /dev/null @@ -1,10 +0,0 @@ -#@data/values ---- - -capvControllerManager: - #@schema/desc "Configures the HTTP_PROXY environment variable on capv-controller-manager." - httpProxy: "" - #@schema/desc "Configures the HTTPS_PROXY environment variable on capv-controller-manager." - httpsProxy: "" - #@schema/desc "Configures the NO_PROXY environment variable on capv-controller-manager." - noProxy: "" diff --git a/packages/cluster-api-provider-vsphere/metadata.yaml b/packages/cluster-api-provider-vsphere/metadata.yaml deleted file mode 100644 index acf46c0f7d..0000000000 --- a/packages/cluster-api-provider-vsphere/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: cluster-api-provider-vsphere.tanzu.vmware.com - namespace: cluster-api-provider-vsphere -spec: - displayName: "cluster-api-provider-vsphere" - longDescription: "Cluster API provider for vSphere is a concrete implementation of Cluster API for vSphere" - shortDescription: "Cluster management for vSphere" - providerName: VMware - maintainers: - - name: "" - categories: - - "cluster management" diff --git a/packages/cluster-api-provider-vsphere/package.yaml b/packages/cluster-api-provider-vsphere/package.yaml deleted file mode 100644 index 97419be7ed..0000000000 --- a/packages/cluster-api-provider-vsphere/package.yaml +++ /dev/null @@ -1,46 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: cluster-api-provider-vsphere.tanzu.vmware.com - namespace: cluster-api-provider-vsphere -spec: - refName: cluster-api-provider-vsphere.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} - valuesSchema: - openAPIv3: - type: object - additionalProperties: false - properties: - capvControllerManager: - type: object - additionalProperties: false - properties: - httpProxy: - type: string - description: Configures the HTTP_PROXY environment variable on capv-controller-manager. - default: "" - httpsProxy: - type: string - description: Configures the HTTPS_PROXY environment variable on capv-controller-manager. - default: "" - noProxy: - type: string - description: Configures the NO_PROXY environment variable on capv-controller-manager. - default: "" diff --git a/packages/cluster-api-provider-vsphere/test/go.mod b/packages/cluster-api-provider-vsphere/test/go.mod deleted file mode 100644 index c7a2efcbcb..0000000000 --- a/packages/cluster-api-provider-vsphere/test/go.mod +++ /dev/null @@ -1,25 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/packages/cluster-api-provider-vsphere/test - -go 1.18 - -require ( - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - github.com/vmware-tanzu/tanzu-framework/test/pkg v0.0.0-00010101000000-000000000000 -) - -require ( - github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect -) - -replace github.com/vmware-tanzu/tanzu-framework/test/pkg => ../../../test/pkg diff --git a/packages/cluster-api-provider-vsphere/test/go.sum b/packages/cluster-api-provider-vsphere/test/go.sum deleted file mode 100644 index 2141875765..0000000000 --- a/packages/cluster-api-provider-vsphere/test/go.sum +++ /dev/null @@ -1,116 +0,0 @@ -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/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 h1:aRd8M7HJVZOqn/vhOzrGcQH0lNAMkqMn+pXUYkatmcA= -github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -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/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= -github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -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/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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/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.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e h1:3i3ny04XV6HbZ2N1oIBw1UBYATHAOpo4tfTF83JM3Z0= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/packages/cluster-api-provider-vsphere/test/unit/overlay_test.go b/packages/cluster-api-provider-vsphere/test/unit/overlay_test.go deleted file mode 100644 index 886e127f2d..0000000000 --- a/packages/cluster-api-provider-vsphere/test/unit/overlay_test.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -const ( - packageRoot = "../.." -) - -var _ = Describe("Cluster-API Provider vSphere Ytt Templating", func() { - var paths []string - var values string - - BeforeEach(func() { - paths = []string{ - filepath.Join(packageRoot, "bundle", "config"), - } - }) - - Context("when the httpProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capvControllerManager: - httpProxy: http://127.0.0.1:3124` - }) - It("adds HTTP_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capv-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(2)) - for _, doc := range docs { - Expect(doc).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')].value", - "http://127.0.0.1:3124", - )) - Expect(doc).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')]")) - Expect(doc).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')]")) - } - }) - }) - - Context("when the httpsProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capvControllerManager: - httpsProxy: https://127.0.0.1:3124` - }) - It("adds HTTPS_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capv-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(2)) - for _, doc := range docs { - Expect(doc).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')]")) - Expect(doc).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')].value", - "https://127.0.0.1:3124", - )) - Expect(doc).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')]")) - } - }) - }) - - Context("when the noProxy data value is provided", func() { - BeforeEach(func() { - values = `#@data/values ---- -capvControllerManager: - noProxy: 10.0.0.0/16,127.0.0.1` - }) - It("adds NO_PROXY environment variable to the deployment container", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capv-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(2)) - for _, doc := range docs { - Expect(doc).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTP_PROXY')]")) - Expect(doc).NotTo(HaveYAMLPath("$.spec.template.spec.containers[0].env[?(@.name=='HTTPS_PROXY')]")) - Expect(doc).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].env[?(@.name=='NO_PROXY')].value", - "10.0.0.0/16,127.0.0.1", - )) - } - }) - }) -}) diff --git a/packages/cluster-api-provider-vsphere/test/unit/unit_suite_test.go b/packages/cluster-api-provider-vsphere/test/unit/unit_suite_test.go deleted file mode 100644 index 6d78dbdd23..0000000000 --- a/packages/cluster-api-provider-vsphere/test/unit/unit_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestUnit(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Cluster API Provider vSphere Unit Suite") -} diff --git a/packages/cluster-api-provider-vsphere/vendir.lock.yml b/packages/cluster-api-provider-vsphere/vendir.lock.yml deleted file mode 100644 index 672e81cc83..0000000000 --- a/packages/cluster-api-provider-vsphere/vendir.lock.yml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - githubRelease: - url: https://api.github.com/repos/kubernetes-sigs/cluster-api-provider-vsphere/releases/92284318 - path: . - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/cluster-api-provider-vsphere/vendir.yml b/packages/cluster-api-provider-vsphere/vendir.yml deleted file mode 100644 index 4a5361181f..0000000000 --- a/packages/cluster-api-provider-vsphere/vendir.yml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: . - githubRelease: - slug: kubernetes-sigs/cluster-api-provider-vsphere - tag: v1.5.3 - disableAutoChecksumValidation: true - includePaths: - - infrastructure-components.yaml - - infrastructure-components-supervisor.yaml - - metadata.yaml diff --git a/packages/cluster-api/Makefile b/packages/cluster-api/Makefile deleted file mode 100644 index 047b729714..0000000000 --- a/packages/cluster-api/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/cluster-api/README.md b/packages/cluster-api/README.md deleted file mode 100644 index 6127bc8765..0000000000 --- a/packages/cluster-api/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# cluster-api Package - -This package provides declarative APIs and tooling to simplify provisioning, -upgrading, and operating multiple Kubernetes clusters using -[cluster-api](https://cluster-api.sigs.k8s.io/). - -## Components - -* capi-controller-manager - -## Usage Example - -To learn more about cluster-api visit . diff --git a/packages/cluster-api/bundle/config/overlay/set-feature-gates.yaml b/packages/cluster-api/bundle/config/overlay/set-feature-gates.yaml deleted file mode 100644 index a3cc36eca5..0000000000 --- a/packages/cluster-api/bundle/config/overlay/set-feature-gates.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=overlay.subset({"kind":"Deployment", "metadata": {"name": "capi-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - args: - #@overlay/match by=overlay.index(2) - #@overlay/replace - - "--feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},ClusterResourceSet=${EXP_CLUSTER_RESOURCE_SET:=true},ClusterTopology=${CLUSTER_TOPOLOGY:=true},RuntimeSDK=${EXP_RUNTIME_SDK:=false}" diff --git a/packages/cluster-api/bundle/config/upstream/core-components.yaml b/packages/cluster-api/bundle/config/upstream/core-components.yaml deleted file mode 100644 index c48af8844c..0000000000 --- a/packages/cluster-api/bundle/config/upstream/core-components.yaml +++ /dev/null @@ -1,11885 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - control-plane: controller-manager - name: capi-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: clusterclasses.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: ClusterClass - listKind: ClusterClassList - plural: clusterclasses - shortNames: - - cc - singular: clusterclass - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Time duration since creation of ClusterClass - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: - ClusterClass is a template which can be used to create managed - topologies. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: ClusterClassSpec describes the desired state of the ClusterClass. - properties: - controlPlane: - description: - ControlPlane is a reference to a local struct that holds - the details for provisioning the Control Plane for the Cluster. - properties: - machineInfrastructure: - description: - "MachineTemplate defines the metadata and infrastructure - information for control plane machines. \n This field is supported - if and only if the control plane provider template referenced - above is Machine based and supports setting replicas." - properties: - ref: - description: - Ref is a required reference to a custom resource - offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - metadata: - description: - "Metadata is the metadata applied to the machines - of the ControlPlane. At runtime this metadata is merged with - the corresponding metadata from the topology. \n This field - is supported if and only if the control plane provider template - referenced is Machine based." - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - ref: - description: - Ref is a required reference to a custom resource - offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part - of an object. TODO: this design is not final and this field - is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - infrastructure: - description: - Infrastructure is a reference to a provider-specific - template that holds the details for provisioning infrastructure - specific cluster for the underlying provider. The underlying provider - is responsible for the implementation of the template to an infrastructure - cluster. - properties: - ref: - description: - Ref is a required reference to a custom resource - offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part - of an object. TODO: this design is not final and this field - is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - workers: - description: - Workers describes the worker nodes for the cluster. It - is a collection of node types which can be used to create the worker - nodes of the cluster. - properties: - machineDeployments: - description: - MachineDeployments is a list of machine deployment - classes that can be used to create a set of worker nodes. - items: - description: - MachineDeploymentClass serves as a template to - define a set of worker nodes of the cluster provisioned using - the `ClusterClass`. - properties: - class: - description: - Class denotes a type of worker node present - in the cluster, this name MUST be unique within a ClusterClass - and can be referenced in the Cluster to create a managed - MachineDeployment. - type: string - template: - description: - Template is a local struct containing a collection - of templates for creation of MachineDeployment objects - representing a set of worker nodes. - properties: - bootstrap: - description: - Bootstrap contains the bootstrap template - reference to be used for the creation of worker Machines. - properties: - ref: - description: - Ref is a required reference to a custom - resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an - object instead of an entire object, this string - should contain a valid JSON/Go field access - statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to - a container within a pod, this would take - on a value like: "spec.containers{name}" (where - "name" refers to the name of the container - that triggered the event) or if no container - name is specified "spec.containers[2]" (container - with index 2 in this pod). This syntax is - chosen only to have some well-defined way - of referencing a part of an object. TODO: - this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: - "Kind of the referent. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: - "Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which - this reference is made, if any. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: - "UID of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - infrastructure: - description: - Infrastructure contains the infrastructure - template reference to be used for the creation of - worker Machines. - properties: - ref: - description: - Ref is a required reference to a custom - resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an - object instead of an entire object, this string - should contain a valid JSON/Go field access - statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to - a container within a pod, this would take - on a value like: "spec.containers{name}" (where - "name" refers to the name of the container - that triggered the event) or if no container - name is specified "spec.containers[2]" (container - with index 2 in this pod). This syntax is - chosen only to have some well-defined way - of referencing a part of an object. TODO: - this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: - "Kind of the referent. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: - "Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which - this reference is made, if any. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: - "UID of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - metadata: - description: - Metadata is the metadata applied to the - machines of the MachineDeployment. At runtime this - metadata is merged with the corresponding metadata - from the topology. - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key - value map stored with a resource that may be set - by external tools to store and retrieve arbitrary - metadata. They are not queryable and should be - preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that - can be used to organize and categorize (scope - and select) objects. May match selectors of replication - controllers and services. More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - required: - - bootstrap - - infrastructure - type: object - required: - - class - - template - type: object - type: array - type: object - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of ClusterClass - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: - ClusterClass is a template which can be used to create managed - topologies. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: ClusterClassSpec describes the desired state of the ClusterClass. - properties: - controlPlane: - description: - ControlPlane is a reference to a local struct that holds - the details for provisioning the Control Plane for the Cluster. - properties: - machineHealthCheck: - description: - MachineHealthCheck defines a MachineHealthCheck for - this ControlPlaneClass. This field is supported if and only - if the ControlPlane provider template referenced above is Machine - based and supports setting replicas. - properties: - maxUnhealthy: - anyOf: - - type: integer - - type: string - description: - Any further remediation is only allowed if at - most "MaxUnhealthy" machines selected by "selector" are - not healthy. - x-kubernetes-int-or-string: true - nodeStartupTimeout: - description: - Machines older than this duration without a node - will be considered to have failed and will be remediated. - If you wish to disable this feature, set the value explicitly - to 0. - type: string - remediationTemplate: - description: - "RemediationTemplate is a reference to a remediation - template provided by an infrastructure provider. \n This - field is completely optional, when filled, the MachineHealthCheck - controller creates a new object from the template referenced - and hands off remediation of the machine to a controller - that lives outside of Cluster API." - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - unhealthyConditions: - description: - UnhealthyConditions contains a list of the conditions - that determine whether a node is considered unhealthy. The - conditions are combined in a logical OR, i.e. if any of - the conditions is met, the node is unhealthy. - items: - description: - UnhealthyCondition represents a Node condition - type and value with a timeout specified as a duration. When - the named condition has been in the given status for at - least the timeout value, a node is considered unhealthy. - properties: - status: - minLength: 1 - type: string - timeout: - type: string - type: - minLength: 1 - type: string - required: - - status - - timeout - - type - type: object - type: array - unhealthyRange: - description: - 'Any further remediation is only allowed if the - number of machines selected by "selector" as not healthy - is within the range of "UnhealthyRange". Takes precedence - over MaxUnhealthy. Eg. "[3-5]" - This means that remediation - will be allowed only when: (a) there are at least 3 unhealthy - machines (and) (b) there are at most 5 unhealthy machines' - type: string - type: object - machineInfrastructure: - description: - "MachineInfrastructure defines the metadata and infrastructure - information for control plane machines. \n This field is supported - if and only if the control plane provider template referenced - above is Machine based and supports setting replicas." - properties: - ref: - description: - Ref is a required reference to a custom resource - offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - metadata: - description: - "Metadata is the metadata applied to the machines - of the ControlPlane. At runtime this metadata is merged with - the corresponding metadata from the topology. \n This field - is supported if and only if the control plane provider template - referenced is Machine based." - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - ref: - description: - Ref is a required reference to a custom resource - offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part - of an object. TODO: this design is not final and this field - is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - infrastructure: - description: - Infrastructure is a reference to a provider-specific - template that holds the details for provisioning infrastructure - specific cluster for the underlying provider. The underlying provider - is responsible for the implementation of the template to an infrastructure - cluster. - properties: - ref: - description: - Ref is a required reference to a custom resource - offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part - of an object. TODO: this design is not final and this field - is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - patches: - description: - "Patches defines the patches which are applied to customize - referenced templates of a ClusterClass. Note: Patches will be applied - in the order of the array." - items: - description: - ClusterClassPatch defines a patch which is applied - to customize the referenced templates. - properties: - definitions: - description: - "Definitions define inline patches. Note: Patches - will be applied in the order of the array. Note: Exactly one - of Definitions or External must be set." - items: - description: - PatchDefinition defines a patch which is applied - to customize the referenced templates. - properties: - jsonPatches: - description: - "JSONPatches defines the patches which should - be applied on the templates matching the selector. Note: - Patches will be applied in the order of the array." - items: - description: JSONPatch defines a JSON patch. - properties: - op: - description: - "Op defines the operation of the patch. - Note: Only `add`, `replace` and `remove` are supported." - type: string - path: - description: - "Path defines the path of the patch. - Note: Only the spec of a template can be patched, - thus the path has to start with /spec/. Note: - For now the only allowed array modifications are - `append` and `prepend`, i.e.: * for op: `add`: - only index 0 (prepend) and - (append) are allowed - * for op: `replace` or `remove`: no indexes are - allowed" - type: string - value: - description: - "Value defines the value of the patch. - Note: Either Value or ValueFrom is required for - add and replace operations. Only one of them is - allowed to be set at the same time. Note: We have - to use apiextensionsv1.JSON instead of our JSON - type, because controller-tools has a hard-coded - schema for apiextensionsv1.JSON which cannot be - produced by another type (unset type field). Ref: - https://github.com/kubernetes-sigs/controller-tools/blob/d0e03a142d0ecdd5491593e941ee1d6b5d91dba6/pkg/crd/known_types.go#L106-L111" - x-kubernetes-preserve-unknown-fields: true - valueFrom: - description: - "ValueFrom defines the value of the - patch. Note: Either Value or ValueFrom is required - for add and replace operations. Only one of them - is allowed to be set at the same time." - properties: - template: - description: - "Template is the Go template to - be used to calculate the value. A template - can reference variables defined in .spec.variables - and builtin variables. Note: The template - must evaluate to a valid YAML or JSON value." - type: string - variable: - description: - Variable is the variable to be - used as value. Variable can be one of the - variables defined in .spec.variables or a - builtin variable. - type: string - type: object - required: - - op - - path - type: object - type: array - selector: - description: - Selector defines on which templates the patch - should be applied. - properties: - apiVersion: - description: APIVersion filters templates by apiVersion. - type: string - kind: - description: Kind filters templates by kind. - type: string - matchResources: - description: - MatchResources selects templates based - on where they are referenced. - properties: - controlPlane: - description: - "ControlPlane selects templates referenced - in .spec.ControlPlane. Note: this will match - the controlPlane and also the controlPlane machineInfrastructure - (depending on the kind and apiVersion)." - type: boolean - infrastructureCluster: - description: - InfrastructureCluster selects templates - referenced in .spec.infrastructure. - type: boolean - machineDeploymentClass: - description: - MachineDeploymentClass selects templates - referenced in specific MachineDeploymentClasses - in .spec.workers.machineDeployments. - properties: - names: - description: - Names selects templates by class - names. - items: - type: string - type: array - type: object - type: object - required: - - apiVersion - - kind - - matchResources - type: object - required: - - jsonPatches - - selector - type: object - type: array - description: - description: - Description is a human-readable description of - this patch. - type: string - enabledIf: - description: - EnabledIf is a Go template to be used to calculate - if a patch should be enabled. It can reference variables defined - in .spec.variables and builtin variables. The patch will be - enabled if the template evaluates to `true`, otherwise it - will be disabled. If EnabledIf is not set, the patch will - be enabled per default. - type: string - external: - description: - "External defines an external patch. Note: Exactly - one of Definitions or External must be set." - properties: - generateExtension: - description: - GenerateExtension references an extension which - is called to generate patches. - type: string - validateExtension: - description: - ValidateExtension references an extension which - is called to validate the topology. - type: string - type: object - name: - description: Name of the patch. - type: string - required: - - name - type: object - type: array - variables: - description: - Variables defines the variables which can be configured - in the Cluster topology and are then used in patches. - items: - description: - ClusterClassVariable defines a variable which can be - configured in the Cluster topology and used in patches. - properties: - name: - description: Name of the variable. - type: string - required: - description: - "Required specifies if the variable is required. - Note: this applies to the variable as a whole and thus the - top-level object defined in the schema. If nested fields are - required, this will be specified inside the schema." - type: boolean - schema: - description: Schema defines the schema of the variable. - properties: - openAPIV3Schema: - description: - OpenAPIV3Schema defines the schema of a variable - via OpenAPI v3 schema. The schema is a subset of the schema - used in Kubernetes CRDs. - properties: - additionalProperties: - description: - "AdditionalProperties specifies the schema - of values in a map (keys are always strings). NOTE: - Can only be set if type is object. NOTE: AdditionalProperties - is mutually exclusive with Properties. NOTE: This - field uses PreserveUnknownFields and Schemaless, because - recursive validation is not possible." - x-kubernetes-preserve-unknown-fields: true - default: - description: - "Default is the default value of the variable. - NOTE: Can be set for all types." - x-kubernetes-preserve-unknown-fields: true - description: - description: - Description is a human-readable description - of this variable. - type: string - enum: - description: - "Enum is the list of valid values of the - variable. NOTE: Can be set for all types." - items: - x-kubernetes-preserve-unknown-fields: true - type: array - example: - description: Example is an example for this variable. - x-kubernetes-preserve-unknown-fields: true - exclusiveMaximum: - description: - "ExclusiveMaximum specifies if the Maximum - is exclusive. NOTE: Can only be set if type is integer - or number." - type: boolean - exclusiveMinimum: - description: - "ExclusiveMinimum specifies if the Minimum - is exclusive. NOTE: Can only be set if type is integer - or number." - type: boolean - format: - description: - "Format is an OpenAPI v3 format string. - Unknown formats are ignored. For a list of supported - formats please see: (of the k8s.io/apiextensions-apiserver - version we're currently using) https://github.com/kubernetes/apiextensions-apiserver/blob/master/pkg/apiserver/validation/formats.go - NOTE: Can only be set if type is string." - type: string - items: - description: - "Items specifies fields of an array. NOTE: - Can only be set if type is array. NOTE: This field - uses PreserveUnknownFields and Schemaless, because - recursive validation is not possible." - x-kubernetes-preserve-unknown-fields: true - maxItems: - description: - "MaxItems is the max length of an array - variable. NOTE: Can only be set if type is array." - format: int64 - type: integer - maxLength: - description: - "MaxLength is the max length of a string - variable. NOTE: Can only be set if type is string." - format: int64 - type: integer - maximum: - description: - "Maximum is the maximum of an integer or - number variable. If ExclusiveMaximum is false, the - variable is valid if it is lower than, or equal to, - the value of Maximum. If ExclusiveMaximum is true, - the variable is valid if it is strictly lower than - the value of Maximum. NOTE: Can only be set if type - is integer or number." - format: int64 - type: integer - minItems: - description: - "MinItems is the min length of an array - variable. NOTE: Can only be set if type is array." - format: int64 - type: integer - minLength: - description: - "MinLength is the min length of a string - variable. NOTE: Can only be set if type is string." - format: int64 - type: integer - minimum: - description: - "Minimum is the minimum of an integer or - number variable. If ExclusiveMinimum is false, the - variable is valid if it is greater than, or equal - to, the value of Minimum. If ExclusiveMinimum is true, - the variable is valid if it is strictly greater than - the value of Minimum. NOTE: Can only be set if type - is integer or number." - format: int64 - type: integer - pattern: - description: - "Pattern is the regex which a string variable - must match. NOTE: Can only be set if type is string." - type: string - properties: - description: - "Properties specifies fields of an object. - NOTE: Can only be set if type is object. NOTE: Properties - is mutually exclusive with AdditionalProperties. NOTE: - This field uses PreserveUnknownFields and Schemaless, - because recursive validation is not possible." - x-kubernetes-preserve-unknown-fields: true - required: - description: - "Required specifies which fields of an - object are required. NOTE: Can only be set if type - is object." - items: - type: string - type: array - type: - description: - "Type is the type of the variable. Valid - values are: object, array, string, integer, number - or boolean." - type: string - uniqueItems: - description: - "UniqueItems specifies if items in an array - must be unique. NOTE: Can only be set if type is array." - type: boolean - required: - - type - type: object - required: - - openAPIV3Schema - type: object - required: - - name - - required - - schema - type: object - type: array - workers: - description: - Workers describes the worker nodes for the cluster. It - is a collection of node types which can be used to create the worker - nodes of the cluster. - properties: - machineDeployments: - description: - MachineDeployments is a list of machine deployment - classes that can be used to create a set of worker nodes. - items: - description: - MachineDeploymentClass serves as a template to - define a set of worker nodes of the cluster provisioned using - the `ClusterClass`. - properties: - class: - description: - Class denotes a type of worker node present - in the cluster, this name MUST be unique within a ClusterClass - and can be referenced in the Cluster to create a managed - MachineDeployment. - type: string - machineHealthCheck: - description: - MachineHealthCheck defines a MachineHealthCheck - for this MachineDeploymentClass. - properties: - maxUnhealthy: - anyOf: - - type: integer - - type: string - description: - Any further remediation is only allowed - if at most "MaxUnhealthy" machines selected by "selector" - are not healthy. - x-kubernetes-int-or-string: true - nodeStartupTimeout: - description: - Machines older than this duration without - a node will be considered to have failed and will - be remediated. If you wish to disable this feature, - set the value explicitly to 0. - type: string - remediationTemplate: - description: - "RemediationTemplate is a reference to - a remediation template provided by an infrastructure - provider. \n This field is completely optional, when - filled, the MachineHealthCheck controller creates - a new object from the template referenced and hands - off remediation of the machine to a controller that - lives outside of Cluster API." - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: - "spec.containers{name}" (where "name" refers to - the name of the container that triggered the event) - or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax - is chosen only to have some well-defined way of - referencing a part of an object. TODO: this design - is not final and this field is subject to change - in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which - this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - unhealthyConditions: - description: - UnhealthyConditions contains a list of - the conditions that determine whether a node is considered - unhealthy. The conditions are combined in a logical - OR, i.e. if any of the conditions is met, the node - is unhealthy. - items: - description: - UnhealthyCondition represents a Node - condition type and value with a timeout specified - as a duration. When the named condition has been - in the given status for at least the timeout value, - a node is considered unhealthy. - properties: - status: - minLength: 1 - type: string - timeout: - type: string - type: - minLength: 1 - type: string - required: - - status - - timeout - - type - type: object - type: array - unhealthyRange: - description: - 'Any further remediation is only allowed - if the number of machines selected by "selector" as - not healthy is within the range of "UnhealthyRange". - Takes precedence over MaxUnhealthy. Eg. "[3-5]" - - This means that remediation will be allowed only when: - (a) there are at least 3 unhealthy machines (and) - (b) there are at most 5 unhealthy machines' - type: string - type: object - template: - description: - Template is a local struct containing a collection - of templates for creation of MachineDeployment objects - representing a set of worker nodes. - properties: - bootstrap: - description: - Bootstrap contains the bootstrap template - reference to be used for the creation of worker Machines. - properties: - ref: - description: - Ref is a required reference to a custom - resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an - object instead of an entire object, this string - should contain a valid JSON/Go field access - statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to - a container within a pod, this would take - on a value like: "spec.containers{name}" (where - "name" refers to the name of the container - that triggered the event) or if no container - name is specified "spec.containers[2]" (container - with index 2 in this pod). This syntax is - chosen only to have some well-defined way - of referencing a part of an object. TODO: - this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: - "Kind of the referent. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: - "Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which - this reference is made, if any. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: - "UID of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - infrastructure: - description: - Infrastructure contains the infrastructure - template reference to be used for the creation of - worker Machines. - properties: - ref: - description: - Ref is a required reference to a custom - resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an - object instead of an entire object, this string - should contain a valid JSON/Go field access - statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to - a container within a pod, this would take - on a value like: "spec.containers{name}" (where - "name" refers to the name of the container - that triggered the event) or if no container - name is specified "spec.containers[2]" (container - with index 2 in this pod). This syntax is - chosen only to have some well-defined way - of referencing a part of an object. TODO: - this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: - "Kind of the referent. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: - "Name of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More - info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which - this reference is made, if any. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: - "UID of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - metadata: - description: - Metadata is the metadata applied to the - machines of the MachineDeployment. At runtime this - metadata is merged with the corresponding metadata - from the topology. - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key - value map stored with a resource that may be set - by external tools to store and retrieve arbitrary - metadata. They are not queryable and should be - preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that - can be used to organize and categorize (scope - and select) objects. May match selectors of replication - controllers and services. More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - required: - - bootstrap - - infrastructure - type: object - required: - - class - - template - type: object - type: array - type: object - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: clusterresourcesetbindings.addons.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: addons.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: ClusterResourceSetBinding - listKind: ClusterResourceSetBindingList - plural: clusterresourcesetbindings - singular: clusterresourcesetbinding - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: - ClusterResourceSetBinding lists all matching ClusterResourceSets - with the cluster it belongs to. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: - ClusterResourceSetBindingSpec defines the desired state of - ClusterResourceSetBinding. - properties: - bindings: - description: Bindings is a list of ClusterResourceSets and their resources. - items: - description: - ResourceSetBinding keeps info on all of the resources - in a ClusterResourceSet. - properties: - clusterResourceSetName: - description: - ClusterResourceSetName is the name of the ClusterResourceSet - that is applied to the owner cluster of the binding. - type: string - resources: - description: - Resources is a list of resources that the ClusterResourceSet - has. - items: - description: - ResourceBinding shows the status of a resource - that belongs to a ClusterResourceSet matched by the owner - cluster of the ClusterResourceSetBinding object. - properties: - applied: - description: - Applied is to track if a resource is applied - to the cluster or not. - type: boolean - hash: - description: - Hash is the hash of a resource's data. This - can be used to decide if a resource is changed. For - "ApplyOnce" ClusterResourceSet.spec.strategy, this is - no-op as that strategy does not act on change. - type: string - kind: - description: - "Kind of the resource. Supported kinds are: - Secrets and ConfigMaps." - enum: - - Secret - - ConfigMap - type: string - lastAppliedTime: - description: - LastAppliedTime identifies when this resource - was last applied to the cluster. - format: date-time - type: string - name: - description: - Name of the resource that is in the same - namespace with ClusterResourceSet object. - minLength: 1 - type: string - required: - - applied - - kind - - name - type: object - type: array - required: - - clusterResourceSetName - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of ClusterResourceSetBinding - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: - ClusterResourceSetBinding lists all matching ClusterResourceSets - with the cluster it belongs to. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: - ClusterResourceSetBindingSpec defines the desired state of - ClusterResourceSetBinding. - properties: - bindings: - description: Bindings is a list of ClusterResourceSets and their resources. - items: - description: - ResourceSetBinding keeps info on all of the resources - in a ClusterResourceSet. - properties: - clusterResourceSetName: - description: - ClusterResourceSetName is the name of the ClusterResourceSet - that is applied to the owner cluster of the binding. - type: string - resources: - description: - Resources is a list of resources that the ClusterResourceSet - has. - items: - description: - ResourceBinding shows the status of a resource - that belongs to a ClusterResourceSet matched by the owner - cluster of the ClusterResourceSetBinding object. - properties: - applied: - description: - Applied is to track if a resource is applied - to the cluster or not. - type: boolean - hash: - description: - Hash is the hash of a resource's data. This - can be used to decide if a resource is changed. For - "ApplyOnce" ClusterResourceSet.spec.strategy, this is - no-op as that strategy does not act on change. - type: string - kind: - description: - "Kind of the resource. Supported kinds are: - Secrets and ConfigMaps." - enum: - - Secret - - ConfigMap - type: string - lastAppliedTime: - description: - LastAppliedTime identifies when this resource - was last applied to the cluster. - format: date-time - type: string - name: - description: - Name of the resource that is in the same - namespace with ClusterResourceSet object. - minLength: 1 - type: string - required: - - applied - - kind - - name - type: object - type: array - required: - - clusterResourceSetName - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of ClusterResourceSetBinding - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: - ClusterResourceSetBinding lists all matching ClusterResourceSets - with the cluster it belongs to. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: - ClusterResourceSetBindingSpec defines the desired state of - ClusterResourceSetBinding. - properties: - bindings: - description: Bindings is a list of ClusterResourceSets and their resources. - items: - description: - ResourceSetBinding keeps info on all of the resources - in a ClusterResourceSet. - properties: - clusterResourceSetName: - description: - ClusterResourceSetName is the name of the ClusterResourceSet - that is applied to the owner cluster of the binding. - type: string - resources: - description: - Resources is a list of resources that the ClusterResourceSet - has. - items: - description: - ResourceBinding shows the status of a resource - that belongs to a ClusterResourceSet matched by the owner - cluster of the ClusterResourceSetBinding object. - properties: - applied: - description: - Applied is to track if a resource is applied - to the cluster or not. - type: boolean - hash: - description: - Hash is the hash of a resource's data. This - can be used to decide if a resource is changed. For - "ApplyOnce" ClusterResourceSet.spec.strategy, this is - no-op as that strategy does not act on change. - type: string - kind: - description: - "Kind of the resource. Supported kinds are: - Secrets and ConfigMaps." - enum: - - Secret - - ConfigMap - type: string - lastAppliedTime: - description: - LastAppliedTime identifies when this resource - was last applied to the cluster. - format: date-time - type: string - name: - description: - Name of the resource that is in the same - namespace with ClusterResourceSet object. - minLength: 1 - type: string - required: - - applied - - kind - - name - type: object - type: array - required: - - clusterResourceSetName - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: clusterresourcesets.addons.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: addons.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: ClusterResourceSet - listKind: ClusterResourceSetList - plural: clusterresourcesets - singular: clusterresourceset - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: - ClusterResourceSet is the Schema for the clusterresourcesets - API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: ClusterResourceSetSpec defines the desired state of ClusterResourceSet. - properties: - clusterSelector: - description: - Label selector for Clusters. The Clusters that are selected - by this will be the ones affected by this ClusterResourceSet. It - must match the Cluster labels. This field is immutable. - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - resources: - description: - Resources is a list of Secrets/ConfigMaps where each - contains 1 or more resources to be applied to remote clusters. - items: - description: ResourceRef specifies a resource. - properties: - kind: - description: - "Kind of the resource. Supported kinds are: Secrets - and ConfigMaps." - enum: - - Secret - - ConfigMap - type: string - name: - description: - Name of the resource that is in the same namespace - with ClusterResourceSet object. - minLength: 1 - type: string - required: - - kind - - name - type: object - type: array - strategy: - description: - Strategy is the strategy to be used during applying resources. - Defaults to ApplyOnce. This field is immutable. - enum: - - ApplyOnce - type: string - required: - - clusterSelector - type: object - status: - description: ClusterResourceSetStatus defines the observed state of ClusterResourceSet. - properties: - conditions: - description: Conditions defines current state of the ClusterResourceSet. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - observedGeneration: - description: - ObservedGeneration reflects the generation of the most - recently observed ClusterResourceSet. - format: int64 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of ClusterResourceSet - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: - ClusterResourceSet is the Schema for the clusterresourcesets - API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: ClusterResourceSetSpec defines the desired state of ClusterResourceSet. - properties: - clusterSelector: - description: - Label selector for Clusters. The Clusters that are selected - by this will be the ones affected by this ClusterResourceSet. It - must match the Cluster labels. This field is immutable. Label selector - cannot be empty. - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - resources: - description: - Resources is a list of Secrets/ConfigMaps where each - contains 1 or more resources to be applied to remote clusters. - items: - description: ResourceRef specifies a resource. - properties: - kind: - description: - "Kind of the resource. Supported kinds are: Secrets - and ConfigMaps." - enum: - - Secret - - ConfigMap - type: string - name: - description: - Name of the resource that is in the same namespace - with ClusterResourceSet object. - minLength: 1 - type: string - required: - - kind - - name - type: object - type: array - strategy: - description: - Strategy is the strategy to be used during applying resources. - Defaults to ApplyOnce. This field is immutable. - enum: - - ApplyOnce - type: string - required: - - clusterSelector - type: object - status: - description: ClusterResourceSetStatus defines the observed state of ClusterResourceSet. - properties: - conditions: - description: Conditions defines current state of the ClusterResourceSet. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - observedGeneration: - description: - ObservedGeneration reflects the generation of the most - recently observed ClusterResourceSet. - format: int64 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of ClusterResourceSet - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: - ClusterResourceSet is the Schema for the clusterresourcesets - API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: ClusterResourceSetSpec defines the desired state of ClusterResourceSet. - properties: - clusterSelector: - description: - Label selector for Clusters. The Clusters that are selected - by this will be the ones affected by this ClusterResourceSet. It - must match the Cluster labels. This field is immutable. Label selector - cannot be empty. - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - resources: - description: - Resources is a list of Secrets/ConfigMaps where each - contains 1 or more resources to be applied to remote clusters. - items: - description: ResourceRef specifies a resource. - properties: - kind: - description: - "Kind of the resource. Supported kinds are: Secrets - and ConfigMaps." - enum: - - Secret - - ConfigMap - type: string - name: - description: - Name of the resource that is in the same namespace - with ClusterResourceSet object. - minLength: 1 - type: string - required: - - kind - - name - type: object - type: array - strategy: - description: - Strategy is the strategy to be used during applying resources. - Defaults to ApplyOnce. This field is immutable. - enum: - - ApplyOnce - type: string - required: - - clusterSelector - type: object - status: - description: ClusterResourceSetStatus defines the observed state of ClusterResourceSet. - properties: - conditions: - description: Conditions defines current state of the ClusterResourceSet. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - observedGeneration: - description: - ObservedGeneration reflects the generation of the most - recently observed ClusterResourceSet. - format: int64 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: clusters.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: Cluster - listKind: ClusterList - plural: clusters - shortNames: - - cl - singular: cluster - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster status such as Pending/Provisioning/Provisioned/Deleting/Failed - jsonPath: .status.phase - name: Phase - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: Cluster is the Schema for the clusters API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: ClusterSpec defines the desired state of Cluster. - properties: - clusterNetwork: - description: Cluster network configuration. - properties: - apiServerPort: - description: - APIServerPort specifies the port the API Server should - bind to. Defaults to 6443. - format: int32 - type: integer - pods: - description: The network ranges from which Pod networks are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - serviceDomain: - description: Domain name for services. - type: string - services: - description: The network ranges from which service VIPs are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - type: object - controlPlaneEndpoint: - description: - ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneRef: - description: - ControlPlaneRef is an optional reference to a provider-specific - resource that holds the details for provisioning the Control Plane - for a Cluster. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - infrastructureRef: - description: - InfrastructureRef is a reference to a provider-specific - resource that holds the details for provisioning infrastructure - for a cluster in said provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - paused: - description: - Paused can be used to prevent controllers from processing - the Cluster and all its associated objects. - type: boolean - type: object - status: - description: ClusterStatus defines the observed state of Cluster. - properties: - conditions: - description: Conditions defines current service state of the cluster. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - controlPlaneInitialized: - description: - ControlPlaneInitialized defines if the control plane - has been initialized. - type: boolean - controlPlaneReady: - description: ControlPlaneReady defines if the control plane is ready. - type: boolean - failureDomains: - additionalProperties: - description: - FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: - Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: - ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: - FailureDomains is a slice of failure domain objects synced - from the infrastructure provider. - type: object - failureMessage: - description: - FailureMessage indicates that there is a fatal problem - reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: - FailureReason indicates that there is a fatal problem - reconciling the state, and will be set to a token value suitable - for programmatic interpretation. - type: string - infrastructureReady: - description: - InfrastructureReady is the state of the infrastructure - provider. - type: boolean - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of cluster actuation. - E.g. Pending, Running, Terminating, Failed etc. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of Cluster - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Cluster status such as Pending/Provisioning/Provisioned/Deleting/Failed - jsonPath: .status.phase - name: Phase - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: Cluster is the Schema for the clusters API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: ClusterSpec defines the desired state of Cluster. - properties: - clusterNetwork: - description: Cluster network configuration. - properties: - apiServerPort: - description: - APIServerPort specifies the port the API Server should - bind to. Defaults to 6443. - format: int32 - type: integer - pods: - description: The network ranges from which Pod networks are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - serviceDomain: - description: Domain name for services. - type: string - services: - description: The network ranges from which service VIPs are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - type: object - controlPlaneEndpoint: - description: - ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneRef: - description: - ControlPlaneRef is an optional reference to a provider-specific - resource that holds the details for provisioning the Control Plane - for a Cluster. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - infrastructureRef: - description: - InfrastructureRef is a reference to a provider-specific - resource that holds the details for provisioning infrastructure - for a cluster in said provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - paused: - description: - Paused can be used to prevent controllers from processing - the Cluster and all its associated objects. - type: boolean - topology: - description: - "This encapsulates the topology for the cluster. NOTE: - It is required to enable the ClusterTopology feature gate flag to - activate managed topologies support; this feature is highly experimental, - and parts of it might still be not implemented." - properties: - class: - description: - The name of the ClusterClass object to create the - topology. - type: string - controlPlane: - description: ControlPlane describes the cluster control plane. - properties: - metadata: - description: - "Metadata is the metadata applied to the machines - of the ControlPlane. At runtime this metadata is merged - with the corresponding metadata from the ClusterClass. \n - This field is supported if and only if the control plane - provider template referenced in the ClusterClass is Machine - based." - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value - map stored with a resource that may be set by external - tools to store and retrieve arbitrary metadata. They - are not queryable and should be preserved when modifying - objects. More info: http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be - used to organize and categorize (scope and select) objects. - May match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - replicas: - description: - Replicas is the number of control plane nodes. - If the value is nil, the ControlPlane object is created - without the number of Replicas and it's assumed that the - control plane controller does not implement support for - this field. When specified against a control plane provider - that lacks support for this field, this value will be ignored. - format: int32 - type: integer - type: object - rolloutAfter: - description: - RolloutAfter performs a rollout of the entire cluster - one component at a time, control plane first and then machine - deployments. - format: date-time - type: string - version: - description: The Kubernetes version of the cluster. - type: string - workers: - description: - Workers encapsulates the different constructs that - form the worker nodes for the cluster. - properties: - machineDeployments: - description: - MachineDeployments is a list of machine deployments - in the cluster. - items: - description: - MachineDeploymentTopology specifies the different - parameters for a set of worker nodes in the topology. - This set of nodes is managed by a MachineDeployment object - whose lifecycle is managed by the Cluster controller. - properties: - class: - description: - Class is the name of the MachineDeploymentClass - used to create the set of worker nodes. This should - match one of the deployment classes defined in the - ClusterClass object mentioned in the `Cluster.Spec.Class` - field. - type: string - metadata: - description: - Metadata is the metadata applied to the - machines of the MachineDeployment. At runtime this - metadata is merged with the corresponding metadata - from the ClusterClass. - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key - value map stored with a resource that may be set - by external tools to store and retrieve arbitrary - metadata. They are not queryable and should be - preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that - can be used to organize and categorize (scope - and select) objects. May match selectors of replication - controllers and services. More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - name: - description: - Name is the unique identifier for this - MachineDeploymentTopology. The value is used with - other unique identifiers to create a MachineDeployment's - Name (e.g. cluster's name, etc). In case the name - is greater than the allowed maximum length, the values - are hashed together. - type: string - replicas: - description: - Replicas is the number of worker nodes - belonging to this set. If the value is nil, the MachineDeployment - is created without the number of Replicas (defaulting - to zero) and it's assumed that an external entity - (like cluster autoscaler) is responsible for the management - of this value. - format: int32 - type: integer - required: - - class - - name - type: object - type: array - type: object - required: - - class - - version - type: object - type: object - status: - description: ClusterStatus defines the observed state of Cluster. - properties: - conditions: - description: Conditions defines current service state of the cluster. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - controlPlaneReady: - description: ControlPlaneReady defines if the control plane is ready. - type: boolean - failureDomains: - additionalProperties: - description: - FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: - Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: - ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: - FailureDomains is a slice of failure domain objects synced - from the infrastructure provider. - type: object - failureMessage: - description: - FailureMessage indicates that there is a fatal problem - reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: - FailureReason indicates that there is a fatal problem - reconciling the state, and will be set to a token value suitable - for programmatic interpretation. - type: string - infrastructureReady: - description: - InfrastructureReady is the state of the infrastructure - provider. - type: boolean - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of cluster actuation. - E.g. Pending, Running, Terminating, Failed etc. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster status such as Pending/Provisioning/Provisioned/Deleting/Failed - jsonPath: .status.phase - name: Phase - type: string - - description: Time duration since creation of Cluster - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this Cluster - jsonPath: .spec.topology.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: Cluster is the Schema for the clusters API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: ClusterSpec defines the desired state of Cluster. - properties: - clusterNetwork: - description: Cluster network configuration. - properties: - apiServerPort: - description: - APIServerPort specifies the port the API Server should - bind to. Defaults to 6443. - format: int32 - type: integer - pods: - description: The network ranges from which Pod networks are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - serviceDomain: - description: Domain name for services. - type: string - services: - description: The network ranges from which service VIPs are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - type: object - controlPlaneEndpoint: - description: - ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneRef: - description: - ControlPlaneRef is an optional reference to a provider-specific - resource that holds the details for provisioning the Control Plane - for a Cluster. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - infrastructureRef: - description: - InfrastructureRef is a reference to a provider-specific - resource that holds the details for provisioning infrastructure - for a cluster in said provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - paused: - description: - Paused can be used to prevent controllers from processing - the Cluster and all its associated objects. - type: boolean - topology: - description: - "This encapsulates the topology for the cluster. NOTE: - It is required to enable the ClusterTopology feature gate flag to - activate managed topologies support; this feature is highly experimental, - and parts of it might still be not implemented." - properties: - class: - description: - The name of the ClusterClass object to create the - topology. - type: string - controlPlane: - description: ControlPlane describes the cluster control plane. - properties: - metadata: - description: - "Metadata is the metadata applied to the machines - of the ControlPlane. At runtime this metadata is merged - with the corresponding metadata from the ClusterClass. \n - This field is supported if and only if the control plane - provider template referenced in the ClusterClass is Machine - based." - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value - map stored with a resource that may be set by external - tools to store and retrieve arbitrary metadata. They - are not queryable and should be preserved when modifying - objects. More info: http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be - used to organize and categorize (scope and select) objects. - May match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The default - value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different - from `kubectl drain --timeout`" - type: string - replicas: - description: - Replicas is the number of control plane nodes. - If the value is nil, the ControlPlane object is created - without the number of Replicas and it's assumed that the - control plane controller does not implement support for - this field. When specified against a control plane provider - that lacks support for this field, this value will be ignored. - format: int32 - type: integer - type: object - rolloutAfter: - description: - RolloutAfter performs a rollout of the entire cluster - one component at a time, control plane first and then machine - deployments. - format: date-time - type: string - variables: - description: - Variables can be used to customize the Cluster through - patches. They must comply to the corresponding VariableClasses - defined in the ClusterClass. - items: - description: - ClusterVariable can be used to customize the Cluster - through patches. It must comply to the corresponding ClusterClassVariable - defined in the ClusterClass. - properties: - name: - description: Name of the variable. - type: string - value: - description: - "Value of the variable. Note: the value will - be validated against the schema of the corresponding ClusterClassVariable - from the ClusterClass. Note: We have to use apiextensionsv1.JSON - instead of a custom JSON type, because controller-tools - has a hard-coded schema for apiextensionsv1.JSON which - cannot be produced by another type via controller-tools, - i.e. it is not possible to have no type field. Ref: https://github.com/kubernetes-sigs/controller-tools/blob/d0e03a142d0ecdd5491593e941ee1d6b5d91dba6/pkg/crd/known_types.go#L106-L111" - x-kubernetes-preserve-unknown-fields: true - required: - - name - - value - type: object - type: array - version: - description: The Kubernetes version of the cluster. - type: string - workers: - description: - Workers encapsulates the different constructs that - form the worker nodes for the cluster. - properties: - machineDeployments: - description: - MachineDeployments is a list of machine deployments - in the cluster. - items: - description: - MachineDeploymentTopology specifies the different - parameters for a set of worker nodes in the topology. - This set of nodes is managed by a MachineDeployment object - whose lifecycle is managed by the Cluster controller. - properties: - class: - description: - Class is the name of the MachineDeploymentClass - used to create the set of worker nodes. This should - match one of the deployment classes defined in the - ClusterClass object mentioned in the `Cluster.Spec.Class` - field. - type: string - failureDomain: - description: - FailureDomain is the failure domain the - machines will be created in. Must match a key in the - FailureDomains map stored on the cluster object. - type: string - metadata: - description: - Metadata is the metadata applied to the - machines of the MachineDeployment. At runtime this - metadata is merged with the corresponding metadata - from the ClusterClass. - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key - value map stored with a resource that may be set - by external tools to store and retrieve arbitrary - metadata. They are not queryable and should be - preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that - can be used to organize and categorize (scope - and select) objects. May match selectors of replication - controllers and services. More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - name: - description: - Name is the unique identifier for this - MachineDeploymentTopology. The value is used with - other unique identifiers to create a MachineDeployment's - Name (e.g. cluster's name, etc). In case the name - is greater than the allowed maximum length, the values - are hashed together. - type: string - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of - time that the controller will spend on draining a - node. The default value is 0, meaning that the node - can be drained without any time limitations. NOTE: - NodeDrainTimeout is different from `kubectl drain - --timeout`" - type: string - replicas: - description: - Replicas is the number of worker nodes - belonging to this set. If the value is nil, the MachineDeployment - is created without the number of Replicas (defaulting - to zero) and it's assumed that an external entity - (like cluster autoscaler) is responsible for the management - of this value. - format: int32 - type: integer - variables: - description: - Variables can be used to customize the - MachineDeployment through patches. - properties: - overrides: - description: - Overrides can be used to override Cluster - level variables. - items: - description: - ClusterVariable can be used to customize - the Cluster through patches. It must comply - to the corresponding ClusterClassVariable defined - in the ClusterClass. - properties: - name: - description: Name of the variable. - type: string - value: - description: - "Value of the variable. Note: - the value will be validated against the - schema of the corresponding ClusterClassVariable - from the ClusterClass. Note: We have to - use apiextensionsv1.JSON instead of a custom - JSON type, because controller-tools has - a hard-coded schema for apiextensionsv1.JSON - which cannot be produced by another type - via controller-tools, i.e. it is not possible - to have no type field. Ref: https://github.com/kubernetes-sigs/controller-tools/blob/d0e03a142d0ecdd5491593e941ee1d6b5d91dba6/pkg/crd/known_types.go#L106-L111" - x-kubernetes-preserve-unknown-fields: true - required: - - name - - value - type: object - type: array - type: object - required: - - class - - name - type: object - type: array - type: object - required: - - class - - version - type: object - type: object - status: - description: ClusterStatus defines the observed state of Cluster. - properties: - conditions: - description: Conditions defines current service state of the cluster. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - controlPlaneReady: - description: ControlPlaneReady defines if the control plane is ready. - type: boolean - failureDomains: - additionalProperties: - description: - FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: - Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: - ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: - FailureDomains is a slice of failure domain objects synced - from the infrastructure provider. - type: object - failureMessage: - description: - FailureMessage indicates that there is a fatal problem - reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: - FailureReason indicates that there is a fatal problem - reconciling the state, and will be set to a token value suitable - for programmatic interpretation. - type: string - infrastructureReady: - description: - InfrastructureReady is the state of the infrastructure - provider. - type: boolean - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of cluster actuation. - E.g. Pending, Running, Terminating, Failed etc. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.1 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: cluster-api - name: extensionconfigs.runtime.cluster.x-k8s.io -spec: - group: runtime.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: ExtensionConfig - listKind: ExtensionConfigList - plural: extensionconfigs - shortNames: - - ext - singular: extensionconfig - scope: Cluster - versions: - - additionalPrinterColumns: - - description: Time duration since creation of ExtensionConfig - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: ExtensionConfig is the Schema for the ExtensionConfig API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: ExtensionConfigSpec is the desired state of the ExtensionConfig - properties: - clientConfig: - description: - ClientConfig defines how to communicate with the Extension - server. - properties: - caBundle: - description: - CABundle is a PEM encoded CA bundle which will be - used to validate the Extension server's server certificate. - format: byte - type: string - service: - description: - "Service is a reference to the Kubernetes service - for the Extension server. Note: Exactly one of `url` or `service` - must be specified. \n If the Extension server is running within - a cluster, then you should use `service`." - properties: - name: - description: Name is the name of the service. - type: string - namespace: - description: Namespace is the namespace of the service. - type: string - path: - description: - Path is an optional URL path and if present may - be any string permissible in a URL. If a path is set it - will be used as prefix to the hook-specific path. - type: string - port: - description: - Port is the port on the service that's hosting - the Extension server. Defaults to 443. Port should be a - valid port number (1-65535, inclusive). - format: int32 - type: integer - required: - - name - - namespace - type: object - url: - description: - "URL gives the location of the Extension server, - in standard URL form (`scheme://host:port/path`). Note: Exactly - one of `url` or `service` must be specified. \n The scheme must - be \"https\". \n The `host` should not refer to a service running - in the cluster; use the `service` field instead. \n A path is - optional, and if present may be any string permissible in a - URL. If a path is set it will be used as prefix to the hook-specific - path. \n Attempting to use a user or basic auth e.g. \"user:password@\" - is not allowed. Fragments (\"#...\") and query parameters (\"?...\") - are not allowed either." - type: string - type: object - namespaceSelector: - description: - NamespaceSelector decides whether to call the hook for - an object based on whether the namespace for that object matches - the selector. Defaults to the empty LabelSelector, which matches - all objects. - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - required: - - clientConfig - type: object - status: - description: ExtensionConfigStatus is the current state of the ExtensionConfig - properties: - conditions: - description: Conditions define the current service state of the ExtensionConfig. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - handlers: - description: - Handlers defines the current ExtensionHandlers supported - by an Extension. - items: - description: - ExtensionHandler specifies the details of a handler - for a particular runtime hook registered by an Extension server. - properties: - failurePolicy: - description: - FailurePolicy defines how failures in calls to - the ExtensionHandler should be handled by a client. Defaults - to Fail if not set. - type: string - name: - description: Name is the unique name of the ExtensionHandler. - type: string - requestHook: - description: - RequestHook defines the versioned runtime hook - which this ExtensionHandler serves. - properties: - apiVersion: - description: - APIVersion is the group and version of the - Hook. - type: string - hook: - description: Hook is the name of the hook. - type: string - required: - - apiVersion - - hook - type: object - timeoutSeconds: - description: - TimeoutSeconds defines the timeout duration for - client calls to the ExtensionHandler. Defaults to 10 is not - set. - format: int32 - type: integer - required: - - name - - requestHook - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.1 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: cluster-api - name: ipaddressclaims.ipam.cluster.x-k8s.io -spec: - group: ipam.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: IPAddressClaim - listKind: IPAddressClaimList - plural: ipaddressclaims - singular: ipaddressclaim - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Name of the pool to allocate an address from - jsonPath: .spec.poolRef.name - name: Pool Name - type: string - - description: Kind of the pool to allocate an address from - jsonPath: .spec.poolRef.kind - name: Pool Kind - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: IPAddressClaim is the Schema for the ipaddressclaim API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: IPAddressClaimSpec is the desired state of an IPAddressClaim. - properties: - poolRef: - description: - PoolRef is a reference to the pool from which an IP address - should be created. - properties: - apiGroup: - description: - APIGroup is the group for the resource being referenced. - If APIGroup is not specified, the specified Kind must be in - the core API group. For any other third-party types, APIGroup - is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - apiGroup - - kind - - name - type: object - required: - - poolRef - type: object - status: - description: IPAddressClaimStatus is the observed status of a IPAddressClaim. - properties: - addressRef: - description: - AddressRef is a reference to the address that was created - for this claim. - properties: - name: - description: - "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?" - type: string - type: object - conditions: - description: Conditions summarises the current state of the IPAddressClaim - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - required: - - addressRef - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.1 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: cluster-api - name: ipaddresses.ipam.cluster.x-k8s.io -spec: - group: ipam.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: IPAddress - listKind: IPAddressList - plural: ipaddresses - singular: ipaddress - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Address - jsonPath: .spec.address - name: Address - type: string - - description: Name of the pool the address is from - jsonPath: .spec.poolRef.name - name: Pool Name - type: string - - description: Kind of the pool the address is from - jsonPath: .spec.poolRef.kind - name: Pool Kind - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: IPAddress is the Schema for the ipaddress API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: IPAddressSpec is the desired state of an IPAddress. - properties: - address: - description: Address is the IP address. - type: string - claimRef: - description: - ClaimRef is a reference to the claim this IPAddress was - created for. - properties: - name: - description: - "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?" - type: string - type: object - gateway: - description: - Gateway is the network gateway of the network the address - is from. - type: string - poolRef: - description: - PoolRef is a reference to the pool that this IPAddress - was created from. - properties: - apiGroup: - description: - APIGroup is the group for the resource being referenced. - If APIGroup is not specified, the specified Kind must be in - the core API group. For any other third-party types, APIGroup - is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - apiGroup - - kind - - name - type: object - prefix: - description: Prefix is the prefix of the address. - type: integer - required: - - address - - claimRef - - gateway - - poolRef - - prefix - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: machinedeployments.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: MachineDeployment - listKind: MachineDeploymentList - plural: machinedeployments - shortNames: - - md - singular: machinedeployment - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: MachineDeployment status such as ScalingUp/ScalingDown/Running/Failed/Unknown - jsonPath: .status.phase - name: Phase - type: string - - description: Total number of non-terminated machines targeted by this MachineDeployment - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of ready machines targeted by this MachineDeployment - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: - Total number of non-terminated machines targeted by this deployment - that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this MachineDeployment - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - name: v1alpha3 - schema: - openAPIV3Schema: - description: MachineDeployment is the Schema for the machinedeployments API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachineDeploymentSpec defines the desired state of MachineDeployment. - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - minReadySeconds: - description: - Minimum number of seconds for which a newly created machine - should be ready. Defaults to 0 (machine will be considered available - as soon as it is ready) - format: int32 - type: integer - paused: - description: Indicates that the deployment is paused. - type: boolean - progressDeadlineSeconds: - description: - The maximum time in seconds for a deployment to make - progress before it is considered to be failed. The deployment controller - will continue to process failed deployments and a condition with - a ProgressDeadlineExceeded reason will be surfaced in the deployment - status. Note that progress will not be estimated during the time - a deployment is paused. Defaults to 600s. - format: int32 - type: integer - replicas: - description: - Number of desired machines. Defaults to 1. This is a - pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - revisionHistoryLimit: - description: - The number of old MachineSets to retain to allow rollback. - This is a pointer to distinguish between explicit zero and not specified. - Defaults to 1. - format: int32 - type: integer - selector: - description: - Label selector for machines. Existing MachineSets whose - machines are selected by this will be the ones affected by this - deployment. It must match the machine template's labels. - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - strategy: - description: - The deployment strategy to use to replace existing machines - with new ones. - properties: - rollingUpdate: - description: - Rolling update config params. Present only if MachineDeploymentStrategyType - = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: - "The maximum number of machines that can be scheduled - above the desired number of machines. Value can be an absolute - number (ex: 5) or a percentage of desired machines (ex: - 10%). This can not be 0 if MaxUnavailable is 0. Absolute - number is calculated from percentage by rounding up. Defaults - to 1. Example: when this is set to 30%, the new MachineSet - can be scaled up immediately when the rolling update starts, - such that the total number of old and new machines do not - exceed 130% of desired machines. Once old machines have - been killed, new MachineSet can be scaled up further, ensuring - that total number of machines running at any time during - the update is at most 130% of desired machines." - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - description: - "The maximum number of machines that can be unavailable - during the update. Value can be an absolute number (ex: - 5) or a percentage of desired machines (ex: 10%). Absolute - number is calculated from percentage by rounding down. This - can not be 0 if MaxSurge is 0. Defaults to 0. Example: when - this is set to 30%, the old MachineSet can be scaled down - to 70% of desired machines immediately when the rolling - update starts. Once new machines are ready, old MachineSet - can be scaled down further, followed by scaling up the new - MachineSet, ensuring that the total number of machines available - at all times during the update is at least 70% of desired - machines." - x-kubernetes-int-or-string: true - type: object - type: - description: - Type of deployment. Currently the only supported - strategy is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations" - type: object - generateName: - description: - "GenerateName is an optional prefix, used by - the server, to generate a unique name ONLY IF the Name field - has not been provided. If this field is used, the name returned - to the client will be different than the name passed. This - value will also be combined with a unique suffix. The provided - value has the same validation rules as the Name field, and - may be truncated by the length of the suffix required to - make the value unique on the server. \n If this field is - specified and the generated name exists, the server will - NOT return a 409 - instead, it will either return 201 Created - or 500 with Reason ServerTimeout indicating a unique name - could not be found in the time allotted, and the client - should retry (optionally after the time indicated in the - Retry-After header). \n Applied only if Name is not specified. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency - \n Deprecated: This field has no function and is going to - be removed in a next release." - type: string - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - name: - description: - "Name must be unique within a namespace. Is required - when creating resources, although some resources may allow - a client to request the generation of an appropriate name - automatically. Name is primarily intended for creation idempotence - and configuration definition. Cannot be updated. More info: - http://kubernetes.io/docs/user-guide/identifiers#names \n - Deprecated: This field has no function and is going to be - removed in a next release." - type: string - namespace: - description: - "Namespace defines the space within each name - must be unique. An empty namespace is equivalent to the - \"default\" namespace, but \"default\" is the canonical - representation. Not all objects are required to be scoped - to a namespace - the value of this field for those objects - will be empty. \n Must be a DNS_LABEL. Cannot be updated. - More info: http://kubernetes.io/docs/user-guide/namespaces - \n Deprecated: This field has no function and is going to - be removed in a next release." - type: string - ownerReferences: - description: - "List of objects depended by this object. If - ALL objects in the list have been deleted, this object will - be garbage collected. If this object is managed by a controller, - then an entry in this list will point to this controller, - with the controller field set to true. There cannot be more - than one managing controller. \n Deprecated: This field - has no function and is going to be removed in a next release." - items: - description: - OwnerReference contains enough information - to let you identify an owning object. An owning object - must be in the same namespace as the dependent, or be - cluster-scoped, so there is no namespace field. - properties: - apiVersion: - description: API version of the referent. - type: string - blockOwnerDeletion: - description: - If true, AND if the owner has the "foregroundDeletion" - finalizer, then the owner cannot be deleted from the - key-value store until this reference is removed. See - https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion - for how the garbage collector interacts with this - field and enforces the foreground deletion. Defaults - to false. To set this field, a user needs "delete" - permission of the owner, otherwise 422 (Unprocessable - Entity) will be returned. - type: boolean - controller: - description: - If true, this reference points to the managing - controller. - type: boolean - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" - type: string - uid: - description: "UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids" - type: string - required: - - apiVersion - - kind - - name - - uid - type: object - x-kubernetes-map-type: atomic - type: array - type: object - spec: - description: - "Specification of the desired behavior of the machine. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which - encapsulates fields to configure the Machine’s bootstrapping - mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference - is optional to allow users/operators to specify Bootstrap.Data - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - data: - description: - "Data contains the bootstrap data, such as - cloud-init details scripts. If nil, the Machine should - remain in the Pending state. \n Deprecated: Switch to - DataSecretName." - type: string - dataSecretName: - description: - DataSecretName is the name of the secret - that stores the bootstrap data script. If nil, the Machine - should remain in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object - belongs to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine - will be created in. Must match a key in the FailureDomains - map stored on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to - a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The default - value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different - from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine - provided by the provider. This field must match the provider - ID as seen on the node object corresponding to this machine. - This field is required by higher level consumers of cluster-api. - Example use case is cluster autoscaler with cluster-api - as provider. Clean-up logic in the autoscaler compares machines - to nodes to find out machines at provider which could not - get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field - is required by autoscaler to be able to have a provider - view of the list of machines. Another list of nodes is queried - from the k8s apiserver and then a comparison is done to - find out unregistered machines and are marked for delete. - This field will be set by the actuators and consumed by - higher level entities like autoscaler that will be interfacing - with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. - This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - - template - type: object - status: - description: MachineDeploymentStatus defines the observed state of MachineDeployment. - properties: - availableReplicas: - description: - Total number of available machines (ready for at least - minReadySeconds) targeted by this deployment. - format: int32 - type: integer - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of a MachineDeployment - (ScalingUp, ScalingDown, Running, Failed, or Unknown). - type: string - readyReplicas: - description: Total number of ready machines targeted by this deployment. - format: int32 - type: integer - replicas: - description: - Total number of non-terminated machines targeted by this - deployment (their labels match the selector). - format: int32 - type: integer - selector: - description: - "Selector is the same as the label selector but in the - string format to avoid introspection by clients. The string will - be in the same format as the query-param syntax. More info about - label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors" - type: string - unavailableReplicas: - description: - Total number of unavailable machines targeted by this - deployment. This is the total number of machines that are still - required for the deployment to have 100% available capacity. They - may either be machines that are running but not yet available or - machines that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: - Total number of non-terminated machines targeted by this - deployment that have the desired template spec. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Time duration since creation of MachineDeployment - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: MachineDeployment status such as ScalingUp/ScalingDown/Running/Failed/Unknown - jsonPath: .status.phase - name: Phase - type: string - - description: Total number of non-terminated machines targeted by this MachineDeployment - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of ready machines targeted by this MachineDeployment - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: - Total number of non-terminated machines targeted by this deployment - that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this MachineDeployment - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - name: v1alpha4 - schema: - openAPIV3Schema: - description: MachineDeployment is the Schema for the machinedeployments API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachineDeploymentSpec defines the desired state of MachineDeployment. - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - minReadySeconds: - description: - Minimum number of seconds for which a newly created machine - should be ready. Defaults to 0 (machine will be considered available - as soon as it is ready) - format: int32 - type: integer - paused: - description: Indicates that the deployment is paused. - type: boolean - progressDeadlineSeconds: - description: - The maximum time in seconds for a deployment to make - progress before it is considered to be failed. The deployment controller - will continue to process failed deployments and a condition with - a ProgressDeadlineExceeded reason will be surfaced in the deployment - status. Note that progress will not be estimated during the time - a deployment is paused. Defaults to 600s. - format: int32 - type: integer - replicas: - default: 1 - description: - Number of desired machines. Defaults to 1. This is a - pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - revisionHistoryLimit: - description: - The number of old MachineSets to retain to allow rollback. - This is a pointer to distinguish between explicit zero and not specified. - Defaults to 1. - format: int32 - type: integer - selector: - description: - Label selector for machines. Existing MachineSets whose - machines are selected by this will be the ones affected by this - deployment. It must match the machine template's labels. - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - strategy: - description: - The deployment strategy to use to replace existing machines - with new ones. - properties: - rollingUpdate: - description: - Rolling update config params. Present only if MachineDeploymentStrategyType - = RollingUpdate. - properties: - deletePolicy: - description: - DeletePolicy defines the policy used by the MachineDeployment - to identify nodes to delete when downscaling. Valid values - are "Random, "Newest", "Oldest" When no value is supplied, - the default DeletePolicy of MachineSet is used - enum: - - Random - - Newest - - Oldest - type: string - maxSurge: - anyOf: - - type: integer - - type: string - description: - "The maximum number of machines that can be scheduled - above the desired number of machines. Value can be an absolute - number (ex: 5) or a percentage of desired machines (ex: - 10%). This can not be 0 if MaxUnavailable is 0. Absolute - number is calculated from percentage by rounding up. Defaults - to 1. Example: when this is set to 30%, the new MachineSet - can be scaled up immediately when the rolling update starts, - such that the total number of old and new machines do not - exceed 130% of desired machines. Once old machines have - been killed, new MachineSet can be scaled up further, ensuring - that total number of machines running at any time during - the update is at most 130% of desired machines." - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - description: - "The maximum number of machines that can be unavailable - during the update. Value can be an absolute number (ex: - 5) or a percentage of desired machines (ex: 10%). Absolute - number is calculated from percentage by rounding down. This - can not be 0 if MaxSurge is 0. Defaults to 0. Example: when - this is set to 30%, the old MachineSet can be scaled down - to 70% of desired machines immediately when the rolling - update starts. Once new machines are ready, old MachineSet - can be scaled down further, followed by scaling up the new - MachineSet, ensuring that the total number of machines available - at all times during the update is at least 70% of desired - machines." - x-kubernetes-int-or-string: true - type: object - type: - description: Type of deployment. Default is RollingUpdate. - enum: - - RollingUpdate - - OnDelete - type: string - type: object - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - spec: - description: - "Specification of the desired behavior of the machine. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which - encapsulates fields to configure the Machine’s bootstrapping - mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference - is optional to allow users/operators to specify Bootstrap.DataSecretName - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: - DataSecretName is the name of the secret - that stores the bootstrap data script. If nil, the Machine - should remain in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object - belongs to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine - will be created in. Must match a key in the FailureDomains - map stored on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to - a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The default - value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different - from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine - provided by the provider. This field must match the provider - ID as seen on the node object corresponding to this machine. - This field is required by higher level consumers of cluster-api. - Example use case is cluster autoscaler with cluster-api - as provider. Clean-up logic in the autoscaler compares machines - to nodes to find out machines at provider which could not - get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field - is required by autoscaler to be able to have a provider - view of the list of machines. Another list of nodes is queried - from the k8s apiserver and then a comparison is done to - find out unregistered machines and are marked for delete. - This field will be set by the actuators and consumed by - higher level entities like autoscaler that will be interfacing - with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. - This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - - template - type: object - status: - description: MachineDeploymentStatus defines the observed state of MachineDeployment. - properties: - availableReplicas: - description: - Total number of available machines (ready for at least - minReadySeconds) targeted by this deployment. - format: int32 - type: integer - conditions: - description: Conditions defines current service state of the MachineDeployment. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of a MachineDeployment - (ScalingUp, ScalingDown, Running, Failed, or Unknown). - type: string - readyReplicas: - description: Total number of ready machines targeted by this deployment. - format: int32 - type: integer - replicas: - description: - Total number of non-terminated machines targeted by this - deployment (their labels match the selector). - format: int32 - type: integer - selector: - description: - "Selector is the same as the label selector but in the - string format to avoid introspection by clients. The string will - be in the same format as the query-param syntax. More info about - label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors" - type: string - unavailableReplicas: - description: - Total number of unavailable machines targeted by this - deployment. This is the total number of machines that are still - required for the deployment to have 100% available capacity. They - may either be machines that are running but not yet available or - machines that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: - Total number of non-terminated machines targeted by this - deployment that have the desired template spec. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Total number of machines desired by this MachineDeployment - jsonPath: .spec.replicas - name: Desired - priority: 10 - type: integer - - description: Total number of non-terminated machines targeted by this MachineDeployment - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of ready machines targeted by this MachineDeployment - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: - Total number of non-terminated machines targeted by this deployment - that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this MachineDeployment - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - - description: MachineDeployment status such as ScalingUp/ScalingDown/Running/Failed/Unknown - jsonPath: .status.phase - name: Phase - type: string - - description: Time duration since creation of MachineDeployment - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this MachineDeployment - jsonPath: .spec.template.spec.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: MachineDeployment is the Schema for the machinedeployments API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachineDeploymentSpec defines the desired state of MachineDeployment. - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - minReadySeconds: - description: - Minimum number of seconds for which a newly created machine - should be ready. Defaults to 0 (machine will be considered available - as soon as it is ready) - format: int32 - type: integer - paused: - description: Indicates that the deployment is paused. - type: boolean - progressDeadlineSeconds: - description: - The maximum time in seconds for a deployment to make - progress before it is considered to be failed. The deployment controller - will continue to process failed deployments and a condition with - a ProgressDeadlineExceeded reason will be surfaced in the deployment - status. Note that progress will not be estimated during the time - a deployment is paused. Defaults to 600s. - format: int32 - type: integer - replicas: - default: 1 - description: - Number of desired machines. Defaults to 1. This is a - pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - revisionHistoryLimit: - description: - The number of old MachineSets to retain to allow rollback. - This is a pointer to distinguish between explicit zero and not specified. - Defaults to 1. - format: int32 - type: integer - selector: - description: - Label selector for machines. Existing MachineSets whose - machines are selected by this will be the ones affected by this - deployment. It must match the machine template's labels. - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - strategy: - description: - The deployment strategy to use to replace existing machines - with new ones. - properties: - rollingUpdate: - description: - Rolling update config params. Present only if MachineDeploymentStrategyType - = RollingUpdate. - properties: - deletePolicy: - description: - DeletePolicy defines the policy used by the MachineDeployment - to identify nodes to delete when downscaling. Valid values - are "Random, "Newest", "Oldest" When no value is supplied, - the default DeletePolicy of MachineSet is used - enum: - - Random - - Newest - - Oldest - type: string - maxSurge: - anyOf: - - type: integer - - type: string - description: - "The maximum number of machines that can be scheduled - above the desired number of machines. Value can be an absolute - number (ex: 5) or a percentage of desired machines (ex: - 10%). This can not be 0 if MaxUnavailable is 0. Absolute - number is calculated from percentage by rounding up. Defaults - to 1. Example: when this is set to 30%, the new MachineSet - can be scaled up immediately when the rolling update starts, - such that the total number of old and new machines do not - exceed 130% of desired machines. Once old machines have - been killed, new MachineSet can be scaled up further, ensuring - that total number of machines running at any time during - the update is at most 130% of desired machines." - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - description: - "The maximum number of machines that can be unavailable - during the update. Value can be an absolute number (ex: - 5) or a percentage of desired machines (ex: 10%). Absolute - number is calculated from percentage by rounding down. This - can not be 0 if MaxSurge is 0. Defaults to 0. Example: when - this is set to 30%, the old MachineSet can be scaled down - to 70% of desired machines immediately when the rolling - update starts. Once new machines are ready, old MachineSet - can be scaled down further, followed by scaling up the new - MachineSet, ensuring that the total number of machines available - at all times during the update is at least 70% of desired - machines." - x-kubernetes-int-or-string: true - type: object - type: - description: Type of deployment. Default is RollingUpdate. - enum: - - RollingUpdate - - OnDelete - type: string - type: object - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - spec: - description: - "Specification of the desired behavior of the machine. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which - encapsulates fields to configure the Machine’s bootstrapping - mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference - is optional to allow users/operators to specify Bootstrap.DataSecretName - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: - DataSecretName is the name of the secret - that stores the bootstrap data script. If nil, the Machine - should remain in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object - belongs to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine - will be created in. Must match a key in the FailureDomains - map stored on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to - a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDeletionTimeout: - description: - NodeDeletionTimeout defines how long the controller - will attempt to delete the Node that the Machine hosts after - the Machine is marked for deletion. A duration of 0 will - retry deletion indefinitely. Defaults to 10 seconds. - type: string - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The default - value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different - from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine - provided by the provider. This field must match the provider - ID as seen on the node object corresponding to this machine. - This field is required by higher level consumers of cluster-api. - Example use case is cluster autoscaler with cluster-api - as provider. Clean-up logic in the autoscaler compares machines - to nodes to find out machines at provider which could not - get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field - is required by autoscaler to be able to have a provider - view of the list of machines. Another list of nodes is queried - from the k8s apiserver and then a comparison is done to - find out unregistered machines and are marked for delete. - This field will be set by the actuators and consumed by - higher level entities like autoscaler that will be interfacing - with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. - This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - - template - type: object - status: - description: MachineDeploymentStatus defines the observed state of MachineDeployment. - properties: - availableReplicas: - description: - Total number of available machines (ready for at least - minReadySeconds) targeted by this deployment. - format: int32 - type: integer - conditions: - description: Conditions defines current service state of the MachineDeployment. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of a MachineDeployment - (ScalingUp, ScalingDown, Running, Failed, or Unknown). - type: string - readyReplicas: - description: Total number of ready machines targeted by this deployment. - format: int32 - type: integer - replicas: - description: - Total number of non-terminated machines targeted by this - deployment (their labels match the selector). - format: int32 - type: integer - selector: - description: - "Selector is the same as the label selector but in the - string format to avoid introspection by clients. The string will - be in the same format as the query-param syntax. More info about - label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors" - type: string - unavailableReplicas: - description: - Total number of unavailable machines targeted by this - deployment. This is the total number of machines that are still - required for the deployment to have 100% available capacity. They - may either be machines that are running but not yet available or - machines that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: - Total number of non-terminated machines targeted by this - deployment that have the desired template spec. - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: machinehealthchecks.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: MachineHealthCheck - listKind: MachineHealthCheckList - plural: machinehealthchecks - shortNames: - - mhc - - mhcs - singular: machinehealthcheck - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Maximum number of unhealthy machines allowed - jsonPath: .spec.maxUnhealthy - name: MaxUnhealthy - type: string - - description: Number of machines currently monitored - jsonPath: .status.expectedMachines - name: ExpectedMachines - type: integer - - description: Current observed healthy machines - jsonPath: .status.currentHealthy - name: CurrentHealthy - type: integer - name: v1alpha3 - schema: - openAPIV3Schema: - description: - MachineHealthCheck is the Schema for the machinehealthchecks - API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: Specification of machine health check policy - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - maxUnhealthy: - anyOf: - - type: integer - - type: string - description: - Any further remediation is only allowed if at most "MaxUnhealthy" - machines selected by "selector" are not healthy. - x-kubernetes-int-or-string: true - nodeStartupTimeout: - description: - Machines older than this duration without a node will - be considered to have failed and will be remediated. - type: string - remediationTemplate: - description: - "RemediationTemplate is a reference to a remediation - template provided by an infrastructure provider. \n This field is - completely optional, when filled, the MachineHealthCheck controller - creates a new object from the template referenced and hands off - remediation of the machine to a controller that lives outside of - Cluster API." - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - selector: - description: - Label selector to match machines whose health will be - exercised - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - unhealthyConditions: - description: - UnhealthyConditions contains a list of the conditions - that determine whether a node is considered unhealthy. The conditions - are combined in a logical OR, i.e. if any of the conditions is met, - the node is unhealthy. - items: - description: - UnhealthyCondition represents a Node condition type - and value with a timeout specified as a duration. When the named - condition has been in the given status for at least the timeout - value, a node is considered unhealthy. - properties: - status: - minLength: 1 - type: string - timeout: - type: string - type: - minLength: 1 - type: string - required: - - status - - timeout - - type - type: object - minItems: 1 - type: array - required: - - clusterName - - selector - - unhealthyConditions - type: object - status: - description: Most recently observed status of MachineHealthCheck resource - properties: - conditions: - description: Conditions defines current service state of the MachineHealthCheck. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - currentHealthy: - description: - total number of healthy machines counted by this machine - health check - format: int32 - minimum: 0 - type: integer - expectedMachines: - description: - total number of machines counted by this machine health - check - format: int32 - minimum: 0 - type: integer - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - remediationsAllowed: - description: - RemediationsAllowed is the number of further remediations - allowed by this machine health check before maxUnhealthy short circuiting - will be applied - format: int32 - minimum: 0 - type: integer - targets: - description: - Targets shows the current list of machines the machine - health check is watching - items: - type: string - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Time duration since creation of MachineHealthCheck - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Maximum number of unhealthy machines allowed - jsonPath: .spec.maxUnhealthy - name: MaxUnhealthy - type: string - - description: Number of machines currently monitored - jsonPath: .status.expectedMachines - name: ExpectedMachines - type: integer - - description: Current observed healthy machines - jsonPath: .status.currentHealthy - name: CurrentHealthy - type: integer - name: v1alpha4 - schema: - openAPIV3Schema: - description: - MachineHealthCheck is the Schema for the machinehealthchecks - API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: Specification of machine health check policy - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - maxUnhealthy: - anyOf: - - type: integer - - type: string - description: - Any further remediation is only allowed if at most "MaxUnhealthy" - machines selected by "selector" are not healthy. - x-kubernetes-int-or-string: true - nodeStartupTimeout: - description: - Machines older than this duration without a node will - be considered to have failed and will be remediated. If not set, - this value is defaulted to 10 minutes. If you wish to disable this - feature, set the value explicitly to 0. - type: string - remediationTemplate: - description: - "RemediationTemplate is a reference to a remediation - template provided by an infrastructure provider. \n This field is - completely optional, when filled, the MachineHealthCheck controller - creates a new object from the template referenced and hands off - remediation of the machine to a controller that lives outside of - Cluster API." - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - selector: - description: - Label selector to match machines whose health will be - exercised - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - unhealthyConditions: - description: - UnhealthyConditions contains a list of the conditions - that determine whether a node is considered unhealthy. The conditions - are combined in a logical OR, i.e. if any of the conditions is met, - the node is unhealthy. - items: - description: - UnhealthyCondition represents a Node condition type - and value with a timeout specified as a duration. When the named - condition has been in the given status for at least the timeout - value, a node is considered unhealthy. - properties: - status: - minLength: 1 - type: string - timeout: - type: string - type: - minLength: 1 - type: string - required: - - status - - timeout - - type - type: object - minItems: 1 - type: array - unhealthyRange: - description: - 'Any further remediation is only allowed if the number - of machines selected by "selector" as not healthy is within the - range of "UnhealthyRange". Takes precedence over MaxUnhealthy. Eg. - "[3-5]" - This means that remediation will be allowed only when: - (a) there are at least 3 unhealthy machines (and) (b) there are - at most 5 unhealthy machines' - pattern: ^\[[0-9]+-[0-9]+\]$ - type: string - required: - - clusterName - - selector - - unhealthyConditions - type: object - status: - description: Most recently observed status of MachineHealthCheck resource - properties: - conditions: - description: Conditions defines current service state of the MachineHealthCheck. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - currentHealthy: - description: - total number of healthy machines counted by this machine - health check - format: int32 - minimum: 0 - type: integer - expectedMachines: - description: - total number of machines counted by this machine health - check - format: int32 - minimum: 0 - type: integer - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - remediationsAllowed: - description: - RemediationsAllowed is the number of further remediations - allowed by this machine health check before maxUnhealthy short circuiting - will be applied - format: int32 - minimum: 0 - type: integer - targets: - description: - Targets shows the current list of machines the machine - health check is watching - items: - type: string - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Number of machines currently monitored - jsonPath: .status.expectedMachines - name: ExpectedMachines - type: integer - - description: Maximum number of unhealthy machines allowed - jsonPath: .spec.maxUnhealthy - name: MaxUnhealthy - type: string - - description: Current observed healthy machines - jsonPath: .status.currentHealthy - name: CurrentHealthy - type: integer - - description: Time duration since creation of MachineHealthCheck - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: - MachineHealthCheck is the Schema for the machinehealthchecks - API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: Specification of machine health check policy - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - maxUnhealthy: - anyOf: - - type: integer - - type: string - description: - Any further remediation is only allowed if at most "MaxUnhealthy" - machines selected by "selector" are not healthy. - x-kubernetes-int-or-string: true - nodeStartupTimeout: - description: - Machines older than this duration without a node will - be considered to have failed and will be remediated. If not set, - this value is defaulted to 10 minutes. If you wish to disable this - feature, set the value explicitly to 0. - type: string - remediationTemplate: - description: - "RemediationTemplate is a reference to a remediation - template provided by an infrastructure provider. \n This field is - completely optional, when filled, the MachineHealthCheck controller - creates a new object from the template referenced and hands off - remediation of the machine to a controller that lives outside of - Cluster API." - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - selector: - description: - Label selector to match machines whose health will be - exercised - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - unhealthyConditions: - description: - UnhealthyConditions contains a list of the conditions - that determine whether a node is considered unhealthy. The conditions - are combined in a logical OR, i.e. if any of the conditions is met, - the node is unhealthy. - items: - description: - UnhealthyCondition represents a Node condition type - and value with a timeout specified as a duration. When the named - condition has been in the given status for at least the timeout - value, a node is considered unhealthy. - properties: - status: - minLength: 1 - type: string - timeout: - type: string - type: - minLength: 1 - type: string - required: - - status - - timeout - - type - type: object - minItems: 1 - type: array - unhealthyRange: - description: - 'Any further remediation is only allowed if the number - of machines selected by "selector" as not healthy is within the - range of "UnhealthyRange". Takes precedence over MaxUnhealthy. Eg. - "[3-5]" - This means that remediation will be allowed only when: - (a) there are at least 3 unhealthy machines (and) (b) there are - at most 5 unhealthy machines' - pattern: ^\[[0-9]+-[0-9]+\]$ - type: string - required: - - clusterName - - selector - - unhealthyConditions - type: object - status: - description: Most recently observed status of MachineHealthCheck resource - properties: - conditions: - description: Conditions defines current service state of the MachineHealthCheck. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - currentHealthy: - description: - total number of healthy machines counted by this machine - health check - format: int32 - minimum: 0 - type: integer - expectedMachines: - description: - total number of machines counted by this machine health - check - format: int32 - minimum: 0 - type: integer - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - remediationsAllowed: - description: - RemediationsAllowed is the number of further remediations - allowed by this machine health check before maxUnhealthy short circuiting - will be applied - format: int32 - minimum: 0 - type: integer - targets: - description: - Targets shows the current list of machines the machine - health check is watching - items: - type: string - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: machinepools.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: MachinePool - listKind: MachinePoolList - plural: machinepools - shortNames: - - mp - singular: machinepool - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: MachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: - MachinePool status such as Terminating/Pending/Provisioning/Running/Failed - etc - jsonPath: .status.phase - name: Phase - type: string - - description: Kubernetes version associated with this MachinePool - jsonPath: .spec.template.spec.version - name: Version - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: MachinePool is the Schema for the machinepools API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachinePoolSpec defines the desired state of MachinePool. - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - failureDomains: - description: - FailureDomains is the list of failure domains this MachinePool - should be attached to. - items: - type: string - type: array - minReadySeconds: - description: - Minimum number of seconds for which a newly created machine - instances should be ready. Defaults to 0 (machine instance will - be considered available as soon as it is ready) - format: int32 - type: integer - providerIDList: - description: - ProviderIDList are the identification IDs of machine - instances provided by the provider. This field must match the provider - IDs as seen on the node objects corresponding to a machine pool's - machine instances. - items: - type: string - type: array - replicas: - description: - Number of desired machines. Defaults to 1. This is a - pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - strategy: - description: - The deployment strategy to use to replace existing machine - instances with new ones. - properties: - rollingUpdate: - description: - Rolling update config params. Present only if MachineDeploymentStrategyType - = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: - "The maximum number of machines that can be scheduled - above the desired number of machines. Value can be an absolute - number (ex: 5) or a percentage of desired machines (ex: - 10%). This can not be 0 if MaxUnavailable is 0. Absolute - number is calculated from percentage by rounding up. Defaults - to 1. Example: when this is set to 30%, the new MachineSet - can be scaled up immediately when the rolling update starts, - such that the total number of old and new machines do not - exceed 130% of desired machines. Once old machines have - been killed, new MachineSet can be scaled up further, ensuring - that total number of machines running at any time during - the update is at most 130% of desired machines." - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - description: - "The maximum number of machines that can be unavailable - during the update. Value can be an absolute number (ex: - 5) or a percentage of desired machines (ex: 10%). Absolute - number is calculated from percentage by rounding down. This - can not be 0 if MaxSurge is 0. Defaults to 0. Example: when - this is set to 30%, the old MachineSet can be scaled down - to 70% of desired machines immediately when the rolling - update starts. Once new machines are ready, old MachineSet - can be scaled down further, followed by scaling up the new - MachineSet, ensuring that the total number of machines available - at all times during the update is at least 70% of desired - machines." - x-kubernetes-int-or-string: true - type: object - type: - description: - Type of deployment. Currently the only supported - strategy is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations" - type: object - generateName: - description: - "GenerateName is an optional prefix, used by - the server, to generate a unique name ONLY IF the Name field - has not been provided. If this field is used, the name returned - to the client will be different than the name passed. This - value will also be combined with a unique suffix. The provided - value has the same validation rules as the Name field, and - may be truncated by the length of the suffix required to - make the value unique on the server. \n If this field is - specified and the generated name exists, the server will - NOT return a 409 - instead, it will either return 201 Created - or 500 with Reason ServerTimeout indicating a unique name - could not be found in the time allotted, and the client - should retry (optionally after the time indicated in the - Retry-After header). \n Applied only if Name is not specified. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency - \n Deprecated: This field has no function and is going to - be removed in a next release." - type: string - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - name: - description: - "Name must be unique within a namespace. Is required - when creating resources, although some resources may allow - a client to request the generation of an appropriate name - automatically. Name is primarily intended for creation idempotence - and configuration definition. Cannot be updated. More info: - http://kubernetes.io/docs/user-guide/identifiers#names \n - Deprecated: This field has no function and is going to be - removed in a next release." - type: string - namespace: - description: - "Namespace defines the space within each name - must be unique. An empty namespace is equivalent to the - \"default\" namespace, but \"default\" is the canonical - representation. Not all objects are required to be scoped - to a namespace - the value of this field for those objects - will be empty. \n Must be a DNS_LABEL. Cannot be updated. - More info: http://kubernetes.io/docs/user-guide/namespaces - \n Deprecated: This field has no function and is going to - be removed in a next release." - type: string - ownerReferences: - description: - "List of objects depended by this object. If - ALL objects in the list have been deleted, this object will - be garbage collected. If this object is managed by a controller, - then an entry in this list will point to this controller, - with the controller field set to true. There cannot be more - than one managing controller. \n Deprecated: This field - has no function and is going to be removed in a next release." - items: - description: - OwnerReference contains enough information - to let you identify an owning object. An owning object - must be in the same namespace as the dependent, or be - cluster-scoped, so there is no namespace field. - properties: - apiVersion: - description: API version of the referent. - type: string - blockOwnerDeletion: - description: - If true, AND if the owner has the "foregroundDeletion" - finalizer, then the owner cannot be deleted from the - key-value store until this reference is removed. See - https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion - for how the garbage collector interacts with this - field and enforces the foreground deletion. Defaults - to false. To set this field, a user needs "delete" - permission of the owner, otherwise 422 (Unprocessable - Entity) will be returned. - type: boolean - controller: - description: - If true, this reference points to the managing - controller. - type: boolean - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" - type: string - uid: - description: "UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids" - type: string - required: - - apiVersion - - kind - - name - - uid - type: object - x-kubernetes-map-type: atomic - type: array - type: object - spec: - description: - "Specification of the desired behavior of the machine. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which - encapsulates fields to configure the Machine’s bootstrapping - mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference - is optional to allow users/operators to specify Bootstrap.Data - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - data: - description: - "Data contains the bootstrap data, such as - cloud-init details scripts. If nil, the Machine should - remain in the Pending state. \n Deprecated: Switch to - DataSecretName." - type: string - dataSecretName: - description: - DataSecretName is the name of the secret - that stores the bootstrap data script. If nil, the Machine - should remain in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object - belongs to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine - will be created in. Must match a key in the FailureDomains - map stored on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to - a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The default - value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different - from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine - provided by the provider. This field must match the provider - ID as seen on the node object corresponding to this machine. - This field is required by higher level consumers of cluster-api. - Example use case is cluster autoscaler with cluster-api - as provider. Clean-up logic in the autoscaler compares machines - to nodes to find out machines at provider which could not - get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field - is required by autoscaler to be able to have a provider - view of the list of machines. Another list of nodes is queried - from the k8s apiserver and then a comparison is done to - find out unregistered machines and are marked for delete. - This field will be set by the actuators and consumed by - higher level entities like autoscaler that will be interfacing - with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. - This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - template - type: object - status: - description: MachinePoolStatus defines the observed state of MachinePool. - properties: - availableReplicas: - description: - The number of available replicas (ready for at least - minReadySeconds) for this MachinePool. - format: int32 - type: integer - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - conditions: - description: Conditions define the current service state of the MachinePool. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: - FailureMessage indicates that there is a problem reconciling - the state, and will be set to a descriptive error message. - type: string - failureReason: - description: - FailureReason indicates that there is a problem reconciling - the state, and will be set to a token value suitable for programmatic - interpretation. - type: string - infrastructureReady: - description: - InfrastructureReady is the state of the infrastructure - provider. - type: boolean - nodeRefs: - description: - NodeRefs will point to the corresponding Nodes if it - they exist. - items: - description: - 'ObjectReference contains enough information to let - you inspect or modify the referred object. --- New uses of this - type are discouraged because of difficulty describing its usage - when embedded in APIs. 1. Ignored fields. It includes many fields - which are not generally honored. For instance, ResourceVersion - and FieldPath are both very rarely valid in actual usage. 2. Invalid - usage help. It is impossible to add specific help for individual - usage. In most embedded usages, there are particular restrictions - like, "must refer only to types A and B" or "UID not honored" - or "name must be restricted". Those cannot be well described when - embedded. 3. Inconsistent validation. Because the usages are - different, the validation rules are different by usage, which - makes it hard for users to predict what will happen. 4. The fields - are both imprecise and overly precise. Kind is not a precise - mapping to a URL. This can produce ambiguity during interpretation - and require a REST mapping. In most cases, the dependency is - on the group,resource tuple and the version of the actual struct - is irrelevant. 5. We cannot easily change it. Because this type - is embedded in many locations, updates to this type will affect - numerous schemas. Don''t make new APIs embed an underspecified - API type they do not control. Instead of using this type, create - a locally provided and used type that is well-focused on your - reference. For example, ServiceReferences for admission registration: - https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 - .' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - type: array - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of cluster actuation. - E.g. Pending, Running, Terminating, Failed etc. - type: string - readyReplicas: - description: - The number of ready replicas for this MachinePool. A - machine is considered ready when the node has been created and is - "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - unavailableReplicas: - description: - Total number of unavailable machine instances targeted - by this machine pool. This is the total number of machine instances - that are still required for the machine pool to have 100% available - capacity. They may either be machine instances that are running - but not yet available or machine instances that still have not been - created. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - scale: - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of MachinePool - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: MachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: - MachinePool status such as Terminating/Pending/Provisioning/Running/Failed - etc - jsonPath: .status.phase - name: Phase - type: string - - description: Kubernetes version associated with this MachinePool - jsonPath: .spec.template.spec.version - name: Version - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: MachinePool is the Schema for the machinepools API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachinePoolSpec defines the desired state of MachinePool. - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - failureDomains: - description: - FailureDomains is the list of failure domains this MachinePool - should be attached to. - items: - type: string - type: array - minReadySeconds: - description: - Minimum number of seconds for which a newly created machine - instances should be ready. Defaults to 0 (machine instance will - be considered available as soon as it is ready) - format: int32 - type: integer - providerIDList: - description: - ProviderIDList are the identification IDs of machine - instances provided by the provider. This field must match the provider - IDs as seen on the node objects corresponding to a machine pool's - machine instances. - items: - type: string - type: array - replicas: - description: - Number of desired machines. Defaults to 1. This is a - pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - spec: - description: - "Specification of the desired behavior of the machine. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which - encapsulates fields to configure the Machine’s bootstrapping - mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference - is optional to allow users/operators to specify Bootstrap.DataSecretName - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: - DataSecretName is the name of the secret - that stores the bootstrap data script. If nil, the Machine - should remain in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object - belongs to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine - will be created in. Must match a key in the FailureDomains - map stored on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to - a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The default - value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different - from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine - provided by the provider. This field must match the provider - ID as seen on the node object corresponding to this machine. - This field is required by higher level consumers of cluster-api. - Example use case is cluster autoscaler with cluster-api - as provider. Clean-up logic in the autoscaler compares machines - to nodes to find out machines at provider which could not - get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field - is required by autoscaler to be able to have a provider - view of the list of machines. Another list of nodes is queried - from the k8s apiserver and then a comparison is done to - find out unregistered machines and are marked for delete. - This field will be set by the actuators and consumed by - higher level entities like autoscaler that will be interfacing - with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. - This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - template - type: object - status: - description: MachinePoolStatus defines the observed state of MachinePool. - properties: - availableReplicas: - description: - The number of available replicas (ready for at least - minReadySeconds) for this MachinePool. - format: int32 - type: integer - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - conditions: - description: Conditions define the current service state of the MachinePool. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: - FailureMessage indicates that there is a problem reconciling - the state, and will be set to a descriptive error message. - type: string - failureReason: - description: - FailureReason indicates that there is a problem reconciling - the state, and will be set to a token value suitable for programmatic - interpretation. - type: string - infrastructureReady: - description: - InfrastructureReady is the state of the infrastructure - provider. - type: boolean - nodeRefs: - description: - NodeRefs will point to the corresponding Nodes if it - they exist. - items: - description: - 'ObjectReference contains enough information to let - you inspect or modify the referred object. --- New uses of this - type are discouraged because of difficulty describing its usage - when embedded in APIs. 1. Ignored fields. It includes many fields - which are not generally honored. For instance, ResourceVersion - and FieldPath are both very rarely valid in actual usage. 2. Invalid - usage help. It is impossible to add specific help for individual - usage. In most embedded usages, there are particular restrictions - like, "must refer only to types A and B" or "UID not honored" - or "name must be restricted". Those cannot be well described when - embedded. 3. Inconsistent validation. Because the usages are - different, the validation rules are different by usage, which - makes it hard for users to predict what will happen. 4. The fields - are both imprecise and overly precise. Kind is not a precise - mapping to a URL. This can produce ambiguity during interpretation - and require a REST mapping. In most cases, the dependency is - on the group,resource tuple and the version of the actual struct - is irrelevant. 5. We cannot easily change it. Because this type - is embedded in many locations, updates to this type will affect - numerous schemas. Don''t make new APIs embed an underspecified - API type they do not control. Instead of using this type, create - a locally provided and used type that is well-focused on your - reference. For example, ServiceReferences for admission registration: - https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 - .' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - type: array - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of cluster actuation. - E.g. Pending, Running, Terminating, Failed etc. - type: string - readyReplicas: - description: - The number of ready replicas for this MachinePool. A - machine is considered ready when the node has been created and is - "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - unavailableReplicas: - description: - Total number of unavailable machine instances targeted - by this machine pool. This is the total number of machine instances - that are still required for the machine pool to have 100% available - capacity. They may either be machine instances that are running - but not yet available or machine instances that still have not been - created. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - scale: - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Total number of machines desired by this MachinePool - jsonPath: .spec.replicas - name: Desired - priority: 10 - type: integer - - description: MachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: - MachinePool status such as Terminating/Pending/Provisioning/Running/Failed - etc - jsonPath: .status.phase - name: Phase - type: string - - description: Time duration since creation of MachinePool - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this MachinePool - jsonPath: .spec.template.spec.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: MachinePool is the Schema for the machinepools API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachinePoolSpec defines the desired state of MachinePool. - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - failureDomains: - description: - FailureDomains is the list of failure domains this MachinePool - should be attached to. - items: - type: string - type: array - minReadySeconds: - description: - Minimum number of seconds for which a newly created machine - instances should be ready. Defaults to 0 (machine instance will - be considered available as soon as it is ready) - format: int32 - type: integer - providerIDList: - description: - ProviderIDList are the identification IDs of machine - instances provided by the provider. This field must match the provider - IDs as seen on the node objects corresponding to a machine pool's - machine instances. - items: - type: string - type: array - replicas: - description: - Number of desired machines. Defaults to 1. This is a - pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - spec: - description: - "Specification of the desired behavior of the machine. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which - encapsulates fields to configure the Machine’s bootstrapping - mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference - is optional to allow users/operators to specify Bootstrap.DataSecretName - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: - DataSecretName is the name of the secret - that stores the bootstrap data script. If nil, the Machine - should remain in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object - belongs to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine - will be created in. Must match a key in the FailureDomains - map stored on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to - a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDeletionTimeout: - description: - NodeDeletionTimeout defines how long the controller - will attempt to delete the Node that the Machine hosts after - the Machine is marked for deletion. A duration of 0 will - retry deletion indefinitely. Defaults to 10 seconds. - type: string - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The default - value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different - from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine - provided by the provider. This field must match the provider - ID as seen on the node object corresponding to this machine. - This field is required by higher level consumers of cluster-api. - Example use case is cluster autoscaler with cluster-api - as provider. Clean-up logic in the autoscaler compares machines - to nodes to find out machines at provider which could not - get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field - is required by autoscaler to be able to have a provider - view of the list of machines. Another list of nodes is queried - from the k8s apiserver and then a comparison is done to - find out unregistered machines and are marked for delete. - This field will be set by the actuators and consumed by - higher level entities like autoscaler that will be interfacing - with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. - This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - template - type: object - status: - description: MachinePoolStatus defines the observed state of MachinePool. - properties: - availableReplicas: - description: - The number of available replicas (ready for at least - minReadySeconds) for this MachinePool. - format: int32 - type: integer - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - conditions: - description: Conditions define the current service state of the MachinePool. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: - FailureMessage indicates that there is a problem reconciling - the state, and will be set to a descriptive error message. - type: string - failureReason: - description: - FailureReason indicates that there is a problem reconciling - the state, and will be set to a token value suitable for programmatic - interpretation. - type: string - infrastructureReady: - description: - InfrastructureReady is the state of the infrastructure - provider. - type: boolean - nodeRefs: - description: - NodeRefs will point to the corresponding Nodes if it - they exist. - items: - description: - 'ObjectReference contains enough information to let - you inspect or modify the referred object. --- New uses of this - type are discouraged because of difficulty describing its usage - when embedded in APIs. 1. Ignored fields. It includes many fields - which are not generally honored. For instance, ResourceVersion - and FieldPath are both very rarely valid in actual usage. 2. Invalid - usage help. It is impossible to add specific help for individual - usage. In most embedded usages, there are particular restrictions - like, "must refer only to types A and B" or "UID not honored" - or "name must be restricted". Those cannot be well described when - embedded. 3. Inconsistent validation. Because the usages are - different, the validation rules are different by usage, which - makes it hard for users to predict what will happen. 4. The fields - are both imprecise and overly precise. Kind is not a precise - mapping to a URL. This can produce ambiguity during interpretation - and require a REST mapping. In most cases, the dependency is - on the group,resource tuple and the version of the actual struct - is irrelevant. 5. We cannot easily change it. Because this type - is embedded in many locations, updates to this type will affect - numerous schemas. Don''t make new APIs embed an underspecified - API type they do not control. Instead of using this type, create - a locally provided and used type that is well-focused on your - reference. For example, ServiceReferences for admission registration: - https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 - .' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - type: array - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of cluster actuation. - E.g. Pending, Running, Terminating, Failed etc. - type: string - readyReplicas: - description: - The number of ready replicas for this MachinePool. A - machine is considered ready when the node has been created and is - "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - unavailableReplicas: - description: - Total number of unavailable machine instances targeted - by this machine pool. This is the total number of machine instances - that are still required for the machine pool to have 100% available - capacity. They may either be machine instances that are running - but not yet available or machine instances that still have not been - created. - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - scale: - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: machines.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: Machine - listKind: MachineList - plural: machines - shortNames: - - ma - singular: machine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Provider ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine status such as Terminating/Pending/Running/Failed etc - jsonPath: .status.phase - name: Phase - type: string - - description: Kubernetes version associated with this Machine - jsonPath: .spec.version - name: Version - type: string - - description: Node name associated with this machine - jsonPath: .status.nodeRef.name - name: NodeName - priority: 1 - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: Machine is the Schema for the machines API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachineSpec defines the desired state of Machine. - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which encapsulates - fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference is - optional to allow users/operators to specify Bootstrap.Data - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part - of an object. TODO: this design is not final and this field - is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - data: - description: - "Data contains the bootstrap data, such as cloud-init - details scripts. If nil, the Machine should remain in the Pending - state. \n Deprecated: Switch to DataSecretName." - type: string - dataSecretName: - description: - DataSecretName is the name of the secret that stores - the bootstrap data script. If nil, the Machine should remain - in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine will - be created in. Must match a key in the FailureDomains map stored - on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to a custom - resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time that the - controller will spend on draining a node. The default value is 0, - meaning that the node can be drained without any time limitations. - NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine provided - by the provider. This field must match the provider ID as seen on - the node object corresponding to this machine. This field is required - by higher level consumers of cluster-api. Example use case is cluster - autoscaler with cluster-api as provider. Clean-up logic in the autoscaler - compares machines to nodes to find out machines at provider which - could not get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field is required - by autoscaler to be able to have a provider view of the list of - machines. Another list of nodes is queried from the k8s apiserver - and then a comparison is done to find out unregistered machines - and are marked for delete. This field will be set by the actuators - and consumed by higher level entities like autoscaler that will - be interfacing with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. This - field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - status: - description: MachineStatus defines the observed state of Machine. - properties: - addresses: - description: - Addresses is a list of addresses assigned to the machine. - This field is copied from the infrastructure provider reference. - items: - description: - MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: - Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - conditions: - description: Conditions defines current service state of the Machine. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: - "FailureMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: - "FailureReason will be set in the event that there is - a terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - infrastructureReady: - description: - InfrastructureReady is the state of the infrastructure - provider. - type: boolean - lastUpdated: - description: - LastUpdated identifies when the phase of the Machine - last transitioned. - format: date-time - type: string - nodeRef: - description: NodeRef will point to the corresponding Node if it exists. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of machine actuation. - E.g. Pending, Running, Terminating, Failed etc. - type: string - version: - description: - Version specifies the current version of Kubernetes running - on the corresponding Node. This is meant to be a means of bubbling - up status from the Node to the Machine. It is entirely optional, - but useful for end-user UX if it’s present. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Provider ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine status such as Terminating/Pending/Running/Failed etc - jsonPath: .status.phase - name: Phase - type: string - - description: Kubernetes version associated with this Machine - jsonPath: .spec.version - name: Version - type: string - - description: Node name associated with this machine - jsonPath: .status.nodeRef.name - name: NodeName - priority: 1 - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: Machine is the Schema for the machines API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachineSpec defines the desired state of Machine. - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which encapsulates - fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference is - optional to allow users/operators to specify Bootstrap.DataSecretName - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part - of an object. TODO: this design is not final and this field - is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: - DataSecretName is the name of the secret that stores - the bootstrap data script. If nil, the Machine should remain - in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine will - be created in. Must match a key in the FailureDomains map stored - on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to a custom - resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time that the - controller will spend on draining a node. The default value is 0, - meaning that the node can be drained without any time limitations. - NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine provided - by the provider. This field must match the provider ID as seen on - the node object corresponding to this machine. This field is required - by higher level consumers of cluster-api. Example use case is cluster - autoscaler with cluster-api as provider. Clean-up logic in the autoscaler - compares machines to nodes to find out machines at provider which - could not get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field is required - by autoscaler to be able to have a provider view of the list of - machines. Another list of nodes is queried from the k8s apiserver - and then a comparison is done to find out unregistered machines - and are marked for delete. This field will be set by the actuators - and consumed by higher level entities like autoscaler that will - be interfacing with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. This - field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - status: - description: MachineStatus defines the observed state of Machine. - properties: - addresses: - description: - Addresses is a list of addresses assigned to the machine. - This field is copied from the infrastructure provider reference. - items: - description: - MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: - Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - conditions: - description: Conditions defines current service state of the Machine. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: - "FailureMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: - "FailureReason will be set in the event that there is - a terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - infrastructureReady: - description: - InfrastructureReady is the state of the infrastructure - provider. - type: boolean - lastUpdated: - description: - LastUpdated identifies when the phase of the Machine - last transitioned. - format: date-time - type: string - nodeInfo: - description: - "NodeInfo is a set of ids/uuids to uniquely identify - the node. More info: https://kubernetes.io/docs/concepts/nodes/node/#info" - properties: - architecture: - description: The Architecture reported by the node - type: string - bootID: - description: Boot ID reported by the node. - type: string - containerRuntimeVersion: - description: - ContainerRuntime Version reported by the node through - runtime remote API (e.g. containerd://1.4.2). - type: string - kernelVersion: - description: - Kernel Version reported by the node from 'uname -r' - (e.g. 3.16.0-0.bpo.4-amd64). - type: string - kubeProxyVersion: - description: KubeProxy Version reported by the node. - type: string - kubeletVersion: - description: Kubelet Version reported by the node. - type: string - machineID: - description: - "MachineID reported by the node. For unique machine - identification in the cluster this field is preferred. Learn - more from man(5) machine-id: http://man7.org/linux/man-pages/man5/machine-id.5.html" - type: string - operatingSystem: - description: The Operating System reported by the node - type: string - osImage: - description: - OS Image reported by the node from /etc/os-release - (e.g. Debian GNU/Linux 7 (wheezy)). - type: string - systemUUID: - description: - SystemUUID reported by the node. For unique machine - identification MachineID is preferred. This field is specific - to Red Hat hosts https://access.redhat.com/documentation/en-us/red_hat_subscription_management/1/html/rhsm/uuid - type: string - required: - - architecture - - bootID - - containerRuntimeVersion - - kernelVersion - - kubeProxyVersion - - kubeletVersion - - machineID - - operatingSystem - - osImage - - systemUUID - type: object - nodeRef: - description: NodeRef will point to the corresponding Node if it exists. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of machine actuation. - E.g. Pending, Running, Terminating, Failed etc. - type: string - version: - description: - Version specifies the current version of Kubernetes running - on the corresponding Node. This is meant to be a means of bubbling - up status from the Node to the Machine. It is entirely optional, - but useful for end-user UX if it’s present. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Node name associated with this machine - jsonPath: .status.nodeRef.name - name: NodeName - type: string - - description: Provider ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine status such as Terminating/Pending/Running/Failed etc - jsonPath: .status.phase - name: Phase - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this Machine - jsonPath: .spec.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: Machine is the Schema for the machines API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachineSpec defines the desired state of Machine. - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which encapsulates - fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference is - optional to allow users/operators to specify Bootstrap.DataSecretName - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part - of an object. TODO: this design is not final and this field - is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: - DataSecretName is the name of the secret that stores - the bootstrap data script. If nil, the Machine should remain - in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine will - be created in. Must match a key in the FailureDomains map stored - on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to a custom - resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDeletionTimeout: - description: - NodeDeletionTimeout defines how long the controller will - attempt to delete the Node that the Machine hosts after the Machine - is marked for deletion. A duration of 0 will retry deletion indefinitely. - Defaults to 10 seconds. - type: string - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time that the - controller will spend on draining a node. The default value is 0, - meaning that the node can be drained without any time limitations. - NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine provided - by the provider. This field must match the provider ID as seen on - the node object corresponding to this machine. This field is required - by higher level consumers of cluster-api. Example use case is cluster - autoscaler with cluster-api as provider. Clean-up logic in the autoscaler - compares machines to nodes to find out machines at provider which - could not get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field is required - by autoscaler to be able to have a provider view of the list of - machines. Another list of nodes is queried from the k8s apiserver - and then a comparison is done to find out unregistered machines - and are marked for delete. This field will be set by the actuators - and consumed by higher level entities like autoscaler that will - be interfacing with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. This - field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - status: - description: MachineStatus defines the observed state of Machine. - properties: - addresses: - description: - Addresses is a list of addresses assigned to the machine. - This field is copied from the infrastructure provider reference. - items: - description: - MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: - Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - certificatesExpiryDate: - description: - CertificatesExpiryDate is the expiry date of the machine - certificates. This value is only set for control plane machines. - format: date-time - type: string - conditions: - description: Conditions defines current service state of the Machine. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: - "FailureMessage will be set in the event that there is - a terminal problem reconciling the Machine and will contain a more - verbose string suitable for logging and human consumption. \n This - field should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the Machine's spec or the configuration of the controller, - and that manual intervention is required. Examples of terminal errors - would be invalid combinations of settings in the spec, values that - are unsupported by the controller, or the responsible controller - itself being critically misconfigured. \n Any transient errors that - occur during the reconciliation of Machines can be added as events - to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: - "FailureReason will be set in the event that there is - a terminal problem reconciling the Machine and will contain a succinct - value suitable for machine interpretation. \n This field should - not be set for transitive errors that a controller faces that are - expected to be fixed automatically over time (like service outages), - but instead indicate that something is fundamentally wrong with - the Machine's spec or the configuration of the controller, and that - manual intervention is required. Examples of terminal errors would - be invalid combinations of settings in the spec, values that are - unsupported by the controller, or the responsible controller itself - being critically misconfigured. \n Any transient errors that occur - during the reconciliation of Machines can be added as events to - the Machine object and/or logged in the controller's output." - type: string - infrastructureReady: - description: - InfrastructureReady is the state of the infrastructure - provider. - type: boolean - lastUpdated: - description: - LastUpdated identifies when the phase of the Machine - last transitioned. - format: date-time - type: string - nodeInfo: - description: - "NodeInfo is a set of ids/uuids to uniquely identify - the node. More info: https://kubernetes.io/docs/concepts/nodes/node/#info" - properties: - architecture: - description: The Architecture reported by the node - type: string - bootID: - description: Boot ID reported by the node. - type: string - containerRuntimeVersion: - description: - ContainerRuntime Version reported by the node through - runtime remote API (e.g. containerd://1.4.2). - type: string - kernelVersion: - description: - Kernel Version reported by the node from 'uname -r' - (e.g. 3.16.0-0.bpo.4-amd64). - type: string - kubeProxyVersion: - description: KubeProxy Version reported by the node. - type: string - kubeletVersion: - description: Kubelet Version reported by the node. - type: string - machineID: - description: - "MachineID reported by the node. For unique machine - identification in the cluster this field is preferred. Learn - more from man(5) machine-id: http://man7.org/linux/man-pages/man5/machine-id.5.html" - type: string - operatingSystem: - description: The Operating System reported by the node - type: string - osImage: - description: - OS Image reported by the node from /etc/os-release - (e.g. Debian GNU/Linux 7 (wheezy)). - type: string - systemUUID: - description: - SystemUUID reported by the node. For unique machine - identification MachineID is preferred. This field is specific - to Red Hat hosts https://access.redhat.com/documentation/en-us/red_hat_subscription_management/1/html/rhsm/uuid - type: string - required: - - architecture - - bootID - - containerRuntimeVersion - - kernelVersion - - kubeProxyVersion - - kubeletVersion - - machineID - - operatingSystem - - osImage - - systemUUID - type: object - nodeRef: - description: NodeRef will point to the corresponding Node if it exists. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - observedGeneration: - description: - ObservedGeneration is the latest generation observed - by the controller. - format: int64 - type: integer - phase: - description: - Phase represents the current phase of machine actuation. - E.g. Pending, Running, Terminating, Failed etc. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: machinesets.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: MachineSet - listKind: MachineSetList - plural: machinesets - shortNames: - - ms - singular: machineset - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Total number of non-terminated machines targeted by this machineset - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of available machines (ready for at least minReadySeconds) - jsonPath: .status.availableReplicas - name: Available - type: integer - - description: Total number of ready machines targeted by this machineset. - jsonPath: .status.readyReplicas - name: Ready - type: integer - name: v1alpha3 - schema: - openAPIV3Schema: - description: MachineSet is the Schema for the machinesets API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachineSetSpec defines the desired state of MachineSet. - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - deletePolicy: - description: - DeletePolicy defines the policy used to identify nodes - to delete when downscaling. Defaults to "Random". Valid values - are "Random, "Newest", "Oldest" - enum: - - Random - - Newest - - Oldest - type: string - minReadySeconds: - description: - MinReadySeconds is the minimum number of seconds for - which a newly created machine should be ready. Defaults to 0 (machine - will be considered available as soon as it is ready) - format: int32 - type: integer - replicas: - description: - Replicas is the number of desired replicas. This is a - pointer to distinguish between explicit zero and unspecified. Defaults - to 1. - format: int32 - type: integer - selector: - description: - "Selector is a label query over machines that should - match the replica count. Label keys and values that must match in - order to be controlled by this MachineSet. It must match the machine - template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors" - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - template: - description: - Template is the object that describes the machine that - will be created if insufficient replicas are detected. Object references - to custom resources resources are treated as templates. - properties: - metadata: - description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations" - type: object - generateName: - description: - "GenerateName is an optional prefix, used by - the server, to generate a unique name ONLY IF the Name field - has not been provided. If this field is used, the name returned - to the client will be different than the name passed. This - value will also be combined with a unique suffix. The provided - value has the same validation rules as the Name field, and - may be truncated by the length of the suffix required to - make the value unique on the server. \n If this field is - specified and the generated name exists, the server will - NOT return a 409 - instead, it will either return 201 Created - or 500 with Reason ServerTimeout indicating a unique name - could not be found in the time allotted, and the client - should retry (optionally after the time indicated in the - Retry-After header). \n Applied only if Name is not specified. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency - \n Deprecated: This field has no function and is going to - be removed in a next release." - type: string - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - name: - description: - "Name must be unique within a namespace. Is required - when creating resources, although some resources may allow - a client to request the generation of an appropriate name - automatically. Name is primarily intended for creation idempotence - and configuration definition. Cannot be updated. More info: - http://kubernetes.io/docs/user-guide/identifiers#names \n - Deprecated: This field has no function and is going to be - removed in a next release." - type: string - namespace: - description: - "Namespace defines the space within each name - must be unique. An empty namespace is equivalent to the - \"default\" namespace, but \"default\" is the canonical - representation. Not all objects are required to be scoped - to a namespace - the value of this field for those objects - will be empty. \n Must be a DNS_LABEL. Cannot be updated. - More info: http://kubernetes.io/docs/user-guide/namespaces - \n Deprecated: This field has no function and is going to - be removed in a next release." - type: string - ownerReferences: - description: - "List of objects depended by this object. If - ALL objects in the list have been deleted, this object will - be garbage collected. If this object is managed by a controller, - then an entry in this list will point to this controller, - with the controller field set to true. There cannot be more - than one managing controller. \n Deprecated: This field - has no function and is going to be removed in a next release." - items: - description: - OwnerReference contains enough information - to let you identify an owning object. An owning object - must be in the same namespace as the dependent, or be - cluster-scoped, so there is no namespace field. - properties: - apiVersion: - description: API version of the referent. - type: string - blockOwnerDeletion: - description: - If true, AND if the owner has the "foregroundDeletion" - finalizer, then the owner cannot be deleted from the - key-value store until this reference is removed. See - https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion - for how the garbage collector interacts with this - field and enforces the foreground deletion. Defaults - to false. To set this field, a user needs "delete" - permission of the owner, otherwise 422 (Unprocessable - Entity) will be returned. - type: boolean - controller: - description: - If true, this reference points to the managing - controller. - type: boolean - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names" - type: string - uid: - description: "UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids" - type: string - required: - - apiVersion - - kind - - name - - uid - type: object - x-kubernetes-map-type: atomic - type: array - type: object - spec: - description: - "Specification of the desired behavior of the machine. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which - encapsulates fields to configure the Machine’s bootstrapping - mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference - is optional to allow users/operators to specify Bootstrap.Data - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - data: - description: - "Data contains the bootstrap data, such as - cloud-init details scripts. If nil, the Machine should - remain in the Pending state. \n Deprecated: Switch to - DataSecretName." - type: string - dataSecretName: - description: - DataSecretName is the name of the secret - that stores the bootstrap data script. If nil, the Machine - should remain in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object - belongs to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine - will be created in. Must match a key in the FailureDomains - map stored on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to - a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The default - value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different - from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine - provided by the provider. This field must match the provider - ID as seen on the node object corresponding to this machine. - This field is required by higher level consumers of cluster-api. - Example use case is cluster autoscaler with cluster-api - as provider. Clean-up logic in the autoscaler compares machines - to nodes to find out machines at provider which could not - get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field - is required by autoscaler to be able to have a provider - view of the list of machines. Another list of nodes is queried - from the k8s apiserver and then a comparison is done to - find out unregistered machines and are marked for delete. - This field will be set by the actuators and consumed by - higher level entities like autoscaler that will be interfacing - with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. - This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - type: object - status: - description: MachineSetStatus defines the observed state of MachineSet. - properties: - availableReplicas: - description: - The number of available replicas (ready for at least - minReadySeconds) for this MachineSet. - format: int32 - type: integer - failureMessage: - type: string - failureReason: - description: - "In the event that there is a terminal problem reconciling - the replicas, both FailureReason and FailureMessage will be set. - FailureReason will be populated with a succinct value suitable for - machine interpretation, while FailureMessage will contain a more - verbose string suitable for logging and human consumption. \n These - fields should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the MachineTemplate's spec or the configuration of the - machine controller, and that manual intervention is required. Examples - of terminal errors would be invalid combinations of settings in - the spec, values that are unsupported by the machine controller, - or the responsible machine controller itself being critically misconfigured. - \n Any transient errors that occur during the reconciliation of - Machines can be added as events to the MachineSet object and/or - logged in the controller's output." - type: string - fullyLabeledReplicas: - description: - The number of replicas that have labels matching the - labels of the machine template of the MachineSet. - format: int32 - type: integer - observedGeneration: - description: - ObservedGeneration reflects the generation of the most - recently observed MachineSet. - format: int64 - type: integer - readyReplicas: - description: - The number of ready replicas for this MachineSet. A machine - is considered ready when the node has been created and is "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - selector: - description: - "Selector is the same as the label selector but in the - string format to avoid introspection by clients. The string will - be in the same format as the query-param syntax. More info about - label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors" - type: string - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Time duration since creation of MachineSet - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Total number of non-terminated machines targeted by this machineset - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of available machines (ready for at least minReadySeconds) - jsonPath: .status.availableReplicas - name: Available - type: integer - - description: Total number of ready machines targeted by this machineset. - jsonPath: .status.readyReplicas - name: Ready - type: integer - name: v1alpha4 - schema: - openAPIV3Schema: - description: MachineSet is the Schema for the machinesets API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachineSetSpec defines the desired state of MachineSet. - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - deletePolicy: - description: - DeletePolicy defines the policy used to identify nodes - to delete when downscaling. Defaults to "Random". Valid values - are "Random, "Newest", "Oldest" - enum: - - Random - - Newest - - Oldest - type: string - minReadySeconds: - description: - MinReadySeconds is the minimum number of seconds for - which a newly created machine should be ready. Defaults to 0 (machine - will be considered available as soon as it is ready) - format: int32 - type: integer - replicas: - default: 1 - description: - Replicas is the number of desired replicas. This is a - pointer to distinguish between explicit zero and unspecified. Defaults - to 1. - format: int32 - type: integer - selector: - description: - "Selector is a label query over machines that should - match the replica count. Label keys and values that must match in - order to be controlled by this MachineSet. It must match the machine - template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors" - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - template: - description: - Template is the object that describes the machine that - will be created if insufficient replicas are detected. Object references - to custom resources resources are treated as templates. - properties: - metadata: - description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - spec: - description: - "Specification of the desired behavior of the machine. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which - encapsulates fields to configure the Machine’s bootstrapping - mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference - is optional to allow users/operators to specify Bootstrap.DataSecretName - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: - DataSecretName is the name of the secret - that stores the bootstrap data script. If nil, the Machine - should remain in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object - belongs to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine - will be created in. Must match a key in the FailureDomains - map stored on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to - a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The default - value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different - from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine - provided by the provider. This field must match the provider - ID as seen on the node object corresponding to this machine. - This field is required by higher level consumers of cluster-api. - Example use case is cluster autoscaler with cluster-api - as provider. Clean-up logic in the autoscaler compares machines - to nodes to find out machines at provider which could not - get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field - is required by autoscaler to be able to have a provider - view of the list of machines. Another list of nodes is queried - from the k8s apiserver and then a comparison is done to - find out unregistered machines and are marked for delete. - This field will be set by the actuators and consumed by - higher level entities like autoscaler that will be interfacing - with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. - This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - type: object - status: - description: MachineSetStatus defines the observed state of MachineSet. - properties: - availableReplicas: - description: - The number of available replicas (ready for at least - minReadySeconds) for this MachineSet. - format: int32 - type: integer - conditions: - description: Conditions defines current service state of the MachineSet. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - type: string - failureReason: - description: - "In the event that there is a terminal problem reconciling - the replicas, both FailureReason and FailureMessage will be set. - FailureReason will be populated with a succinct value suitable for - machine interpretation, while FailureMessage will contain a more - verbose string suitable for logging and human consumption. \n These - fields should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the MachineTemplate's spec or the configuration of the - machine controller, and that manual intervention is required. Examples - of terminal errors would be invalid combinations of settings in - the spec, values that are unsupported by the machine controller, - or the responsible machine controller itself being critically misconfigured. - \n Any transient errors that occur during the reconciliation of - Machines can be added as events to the MachineSet object and/or - logged in the controller's output." - type: string - fullyLabeledReplicas: - description: - The number of replicas that have labels matching the - labels of the machine template of the MachineSet. - format: int32 - type: integer - observedGeneration: - description: - ObservedGeneration reflects the generation of the most - recently observed MachineSet. - format: int64 - type: integer - readyReplicas: - description: - The number of ready replicas for this MachineSet. A machine - is considered ready when the node has been created and is "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - selector: - description: - "Selector is the same as the label selector but in the - string format to avoid introspection by clients. The string will - be in the same format as the query-param syntax. More info about - label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors" - type: string - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Total number of machines desired by this machineset - jsonPath: .spec.replicas - name: Desired - priority: 10 - type: integer - - description: Total number of non-terminated machines targeted by this machineset - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of ready machines targeted by this machineset. - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: Total number of available machines (ready for at least minReadySeconds) - jsonPath: .status.availableReplicas - name: Available - type: integer - - description: Time duration since creation of MachineSet - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this MachineSet - jsonPath: .spec.template.spec.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: MachineSet is the Schema for the machinesets API. - properties: - apiVersion: - description: - "APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources" - type: string - kind: - description: - "Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - metadata: - type: object - spec: - description: MachineSetSpec defines the desired state of MachineSet. - properties: - clusterName: - description: - ClusterName is the name of the Cluster this object belongs - to. - minLength: 1 - type: string - deletePolicy: - description: - DeletePolicy defines the policy used to identify nodes - to delete when downscaling. Defaults to "Random". Valid values - are "Random, "Newest", "Oldest" - enum: - - Random - - Newest - - Oldest - type: string - minReadySeconds: - description: - MinReadySeconds is the minimum number of seconds for - which a newly created machine should be ready. Defaults to 0 (machine - will be considered available as soon as it is ready) - format: int32 - type: integer - replicas: - default: 1 - description: - Replicas is the number of desired replicas. This is a - pointer to distinguish between explicit zero and unspecified. Defaults - to 1. - format: int32 - type: integer - selector: - description: - "Selector is a label query over machines that should - match the replica count. Label keys and values that must match in - order to be controlled by this MachineSet. It must match the machine - template's labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors" - properties: - matchExpressions: - description: - matchExpressions is a list of label selector requirements. - The requirements are ANDed. - items: - description: - A label selector requirement is a selector that - contains values, a key, and an operator that relates the key - and values. - properties: - key: - description: - key is the label key that the selector applies - to. - type: string - operator: - description: - operator represents a key's relationship to - a set of values. Valid operators are In, NotIn, Exists - and DoesNotExist. - type: string - values: - description: - values is an array of string values. If the - operator is In or NotIn, the values array must be non-empty. - If the operator is Exists or DoesNotExist, the values - array must be empty. This array is replaced during a strategic - merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: - matchLabels is a map of {key,value} pairs. A single - {key,value} in the matchLabels map is equivalent to an element - of matchExpressions, whose key field is "key", the operator - is "In", and the values array contains only "value". The requirements - are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - template: - description: - Template is the object that describes the machine that - will be created if insufficient replicas are detected. Object references - to custom resources resources are treated as templates. - properties: - metadata: - description: "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" - properties: - annotations: - additionalProperties: - type: string - description: - "Annotations is an unstructured key value map - stored with a resource that may be set by external tools - to store and retrieve arbitrary metadata. They are not queryable - and should be preserved when modifying objects. More info: - http://kubernetes.io/docs/user-guide/annotations" - type: object - labels: - additionalProperties: - type: string - description: - "Map of string keys and values that can be used - to organize and categorize (scope and select) objects. May - match selectors of replication controllers and services. - More info: http://kubernetes.io/docs/user-guide/labels" - type: object - type: object - spec: - description: - "Specification of the desired behavior of the machine. - More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status" - properties: - bootstrap: - description: - Bootstrap is a reference to a local struct which - encapsulates fields to configure the Machine’s bootstrapping - mechanism. - properties: - configRef: - description: - ConfigRef is a reference to a bootstrap provider-specific - resource that holds configuration details. The reference - is optional to allow users/operators to specify Bootstrap.DataSecretName - without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: - "Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: - DataSecretName is the name of the secret - that stores the bootstrap data script. If nil, the Machine - should remain in the Pending state. - type: string - type: object - clusterName: - description: - ClusterName is the name of the Cluster this object - belongs to. - minLength: 1 - type: string - failureDomain: - description: - FailureDomain is the failure domain the machine - will be created in. Must match a key in the FailureDomains - map stored on the cluster object. - type: string - infrastructureRef: - description: - InfrastructureRef is a required reference to - a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: - 'If referring to a piece of an object instead - of an entire object, this string should contain a valid - JSON/Go field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that - triggered the event) or if no container name is specified - "spec.containers[2]" (container with index 2 in this - pod). This syntax is chosen only to have some well-defined - way of referencing a part of an object. TODO: this design - is not final and this field is subject to change in - the future.' - type: string - kind: - description: "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds" - type: string - name: - description: "Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names" - type: string - namespace: - description: "Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" - type: string - resourceVersion: - description: - "Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency" - type: string - uid: - description: "UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids" - type: string - type: object - x-kubernetes-map-type: atomic - nodeDeletionTimeout: - description: - NodeDeletionTimeout defines how long the controller - will attempt to delete the Node that the Machine hosts after - the Machine is marked for deletion. A duration of 0 will - retry deletion indefinitely. Defaults to 10 seconds. - type: string - nodeDrainTimeout: - description: - "NodeDrainTimeout is the total amount of time - that the controller will spend on draining a node. The default - value is 0, meaning that the node can be drained without - any time limitations. NOTE: NodeDrainTimeout is different - from `kubectl drain --timeout`" - type: string - providerID: - description: - ProviderID is the identification ID of the machine - provided by the provider. This field must match the provider - ID as seen on the node object corresponding to this machine. - This field is required by higher level consumers of cluster-api. - Example use case is cluster autoscaler with cluster-api - as provider. Clean-up logic in the autoscaler compares machines - to nodes to find out machines at provider which could not - get registered as Kubernetes nodes. With cluster-api as - a generic out-of-tree provider for autoscaler, this field - is required by autoscaler to be able to have a provider - view of the list of machines. Another list of nodes is queried - from the k8s apiserver and then a comparison is done to - find out unregistered machines and are marked for delete. - This field will be set by the actuators and consumed by - higher level entities like autoscaler that will be interfacing - with cluster-api as generic provider. - type: string - version: - description: - Version defines the desired Kubernetes version. - This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - type: object - status: - description: MachineSetStatus defines the observed state of MachineSet. - properties: - availableReplicas: - description: - The number of available replicas (ready for at least - minReadySeconds) for this MachineSet. - format: int32 - type: integer - conditions: - description: Conditions defines current service state of the MachineSet. - items: - description: - Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: - Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: - A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: - The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: - Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: - Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - type: string - failureReason: - description: - "In the event that there is a terminal problem reconciling - the replicas, both FailureReason and FailureMessage will be set. - FailureReason will be populated with a succinct value suitable for - machine interpretation, while FailureMessage will contain a more - verbose string suitable for logging and human consumption. \n These - fields should not be set for transitive errors that a controller - faces that are expected to be fixed automatically over time (like - service outages), but instead indicate that something is fundamentally - wrong with the MachineTemplate's spec or the configuration of the - machine controller, and that manual intervention is required. Examples - of terminal errors would be invalid combinations of settings in - the spec, values that are unsupported by the machine controller, - or the responsible machine controller itself being critically misconfigured. - \n Any transient errors that occur during the reconciliation of - Machines can be added as events to the MachineSet object and/or - logged in the controller's output." - type: string - fullyLabeledReplicas: - description: - The number of replicas that have labels matching the - labels of the machine template of the MachineSet. - format: int32 - type: integer - observedGeneration: - description: - ObservedGeneration reflects the generation of the most - recently observed MachineSet. - format: int64 - type: integer - readyReplicas: - description: - The number of ready replicas for this MachineSet. A machine - is considered ready when the node has been created and is "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - selector: - description: - "Selector is the same as the label selector but in the - string format to avoid introspection by clients. The string will - be in the same format as the query-param syntax. More info about - label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors" - type: string - type: object - type: object - served: true - storage: true - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-manager - namespace: capi-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-leader-election-role - namespace: capi-system -rules: - - apiGroups: - - "" - resources: - - events - verbs: - - create - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -aggregationRule: - clusterRoleSelectors: - - matchLabels: - cluster.x-k8s.io/aggregate-to-manager: "true" -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-aggregated-manager-role -rules: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/aggregate-to-manager: "true" - cluster.x-k8s.io/provider: cluster-api - name: capi-manager-role -rules: - - apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch - - apiGroups: - - addons.cluster.x-k8s.io - resources: - - "*" - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - addons.cluster.x-k8s.io - resources: - - clusterresourcesets/finalizers - - clusterresourcesets/status - verbs: - - get - - patch - - update - - apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - get - - list - - watch - - apiGroups: - - bootstrap.cluster.x-k8s.io - - controlplane.cluster.x-k8s.io - - infrastructure.cluster.x-k8s.io - resources: - - "*" - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - bootstrap.cluster.x-k8s.io - - infrastructure.cluster.x-k8s.io - resources: - - "*" - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - clusterclasses - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - clusters - verbs: - - get - - list - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/finalizers - - clusters/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - - machinedeployments/finalizers - verbs: - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - - machinedeployments/finalizers - - machinedeployments/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinehealthchecks - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinehealthchecks - - machinehealthchecks/finalizers - - machinehealthchecks/status - verbs: - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - - machinepools/finalizers - - machinepools/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/finalizers - - machines/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/status - verbs: - - delete - - get - - list - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinesets - verbs: - - get - - list - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinesets - - machinesets/finalizers - verbs: - - get - - list - - patch - - update - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinesets - - machinesets/finalizers - - machinesets/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - patch - - watch - - apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - watch - - apiGroups: - - "" - resources: - - nodes - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - watch - - apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddressclaims - verbs: - - get - - list - - watch - - apiGroups: - - runtime.cluster.x-k8s.io - resources: - - extensionconfigs - - extensionconfigs/status - verbs: - - get - - list - - patch - - update - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-leader-election-rolebinding - namespace: capi-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capi-leader-election-role -subjects: - - kind: ServiceAccount - name: capi-manager - namespace: capi-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capi-aggregated-manager-role -subjects: - - kind: ServiceAccount - name: capi-manager - namespace: capi-system ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-webhook-service - namespace: capi-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: cluster-api ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - control-plane: controller-manager - name: capi-controller-manager - namespace: capi-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: cluster-api - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --metrics-bind-addr=localhost:8080 - - --feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},ClusterResourceSet=${EXP_CLUSTER_RESOURCE_SET:=false},ClusterTopology=${CLUSTER_TOPOLOGY:=false},RuntimeSDK=${EXP_RUNTIME_SDK:=false} - command: - - /manager - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_UID - valueFrom: - fieldRef: - fieldPath: metadata.uid - image: k8s.gcr.io/cluster-api/cluster-api-controller:v1.2.8 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - serviceAccountName: capi-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - secretName: capi-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-serving-cert - namespace: capi-system -spec: - dnsNames: - - capi-webhook-service.capi-system.svc - - capi-webhook-service.capi-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capi-selfsigned-issuer - secretName: capi-webhook-service-cert - subject: - organizations: - - k8s-sig-cluster-lifecycle ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-selfsigned-issuer - namespace: capi-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-mutating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-machine - failurePolicy: Fail - matchPolicy: Equivalent - name: default.machine.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machines - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-machinedeployment - failurePolicy: Fail - matchPolicy: Equivalent - name: default.machinedeployment.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinedeployments - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-machinehealthcheck - failurePolicy: Fail - matchPolicy: Equivalent - name: default.machinehealthcheck.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinehealthchecks - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-machineset - failurePolicy: Fail - matchPolicy: Equivalent - name: default.machineset.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinesets - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-cluster - failurePolicy: Fail - matchPolicy: Equivalent - name: default.cluster.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - clusters - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-clusterclass - failurePolicy: Fail - matchPolicy: Equivalent - name: default.clusterclass.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - clusterclasses - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-runtime-cluster-x-k8s-io-v1alpha1-extensionconfig - failurePolicy: Fail - matchPolicy: Equivalent - name: default.extensionconfig.runtime.addons.cluster.x-k8s.io - rules: - - apiGroups: - - runtime.cluster.x-k8s.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - extensionconfigs - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-machinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: default.machinepool.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinepools - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-addons-cluster-x-k8s-io-v1beta1-clusterresourceset - failurePolicy: Fail - matchPolicy: Equivalent - name: default.clusterresourceset.addons.cluster.x-k8s.io - rules: - - apiGroups: - - addons.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - clusterresourcesets - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-validating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-machine - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.machine.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machines - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-machinedeployment - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.machinedeployment.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinedeployments - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-machinehealthcheck - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.machinehealthcheck.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinehealthchecks - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-machineset - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.machineset.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinesets - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-cluster - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.cluster.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - clusters - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-clusterclass - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.clusterclass.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - clusterclasses - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-runtime-cluster-x-k8s-io-v1alpha1-extensionconfig - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.extensionconfig.runtime.cluster.x-k8s.io - rules: - - apiGroups: - - runtime.cluster.x-k8s.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - extensionconfigs - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-machinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.machinepool.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinepools - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-addons-cluster-x-k8s-io-v1beta1-clusterresourceset - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.clusterresourceset.addons.cluster.x-k8s.io - rules: - - apiGroups: - - addons.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - clusterresourcesets - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-ipam-cluster-x-k8s-io-v1alpha1-ipaddress - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.ipaddress.ipam.cluster.x-k8s.io - rules: - - apiGroups: - - ipam.cluster.x-k8s.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - ipaddresses - sideEffects: None - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-ipam-cluster-x-k8s-io-v1alpha1-ipaddressclaim - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.ipaddressclaim.ipam.cluster.x-k8s.io - rules: - - apiGroups: - - ipam.cluster.x-k8s.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - ipaddressclaims - sideEffects: None diff --git a/packages/cluster-api/bundle/config/upstream/metadata.yaml b/packages/cluster-api/bundle/config/upstream/metadata.yaml deleted file mode 100644 index 625544516d..0000000000 --- a/packages/cluster-api/bundle/config/upstream/metadata.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# maps release series of major.minor to cluster-api contract version -# the contract version may change between minor or major versions, but *not* -# between patch versions. -# -# update this file only when a new major or minor version is released -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: - - major: 1 - minor: 2 - contract: v1beta1 - - major: 1 - minor: 1 - contract: v1beta1 - - major: 1 - minor: 0 - contract: v1beta1 - - major: 0 - minor: 4 - contract: v1alpha4 - - major: 0 - minor: 3 - contract: v1alpha3 diff --git a/packages/cluster-api/bundle/config/values.yaml b/packages/cluster-api/bundle/config/values.yaml deleted file mode 100644 index e25fdc8014..0000000000 --- a/packages/cluster-api/bundle/config/values.yaml +++ /dev/null @@ -1,2 +0,0 @@ -#@data/values ---- diff --git a/packages/cluster-api/metadata.yaml b/packages/cluster-api/metadata.yaml deleted file mode 100644 index 81ae91d7bd..0000000000 --- a/packages/cluster-api/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: cluster-api.tanzu.vmware.com - namespace: cluster-api -spec: - displayName: "cluster-api" - longDescription: "Cluster API is a Kubernetes sub-project focused on providing declarative APIs and tooling to simplify provisioning, upgrading, and operating multiple Kubernetes clusters." - shortDescription: "Cluster management" - providerName: VMware - maintainers: - - name: "" - categories: - - "cluster management" diff --git a/packages/cluster-api/package.yaml b/packages/cluster-api/package.yaml deleted file mode 100644 index aa04c81b12..0000000000 --- a/packages/cluster-api/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: cluster-api.tanzu.vmware.com - namespace: cluster-api -spec: - refName: cluster-api.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/cluster-api/test/go.mod b/packages/cluster-api/test/go.mod deleted file mode 100644 index fe1e0d6645..0000000000 --- a/packages/cluster-api/test/go.mod +++ /dev/null @@ -1,25 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/packages/cluster-api/test - -go 1.18 - -require ( - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - github.com/vmware-tanzu/tanzu-framework/test/pkg v0.0.0-00010101000000-000000000000 -) - -require ( - github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect -) - -replace github.com/vmware-tanzu/tanzu-framework/test/pkg => ../../../test/pkg diff --git a/packages/cluster-api/test/go.sum b/packages/cluster-api/test/go.sum deleted file mode 100644 index 2141875765..0000000000 --- a/packages/cluster-api/test/go.sum +++ /dev/null @@ -1,116 +0,0 @@ -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/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 h1:aRd8M7HJVZOqn/vhOzrGcQH0lNAMkqMn+pXUYkatmcA= -github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -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/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= -github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -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/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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/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.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e h1:3i3ny04XV6HbZ2N1oIBw1UBYATHAOpo4tfTF83JM3Z0= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/packages/cluster-api/test/unit/overlay_test.go b/packages/cluster-api/test/unit/overlay_test.go deleted file mode 100644 index 640daf5df6..0000000000 --- a/packages/cluster-api/test/unit/overlay_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "path/filepath" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -const ( - packageRoot = "../.." -) - -var _ = Describe("Cluster-API Ytt Templating", func() { - var paths []string - BeforeEach(func() { - paths = []string{ - filepath.Join(packageRoot, "bundle", "config"), - } - }) - - It("enables ClusterResourceSet and ClusterTopology feature gates on capi-controller-manager Deployment", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, nil) - Expect(err).NotTo(HaveOccurred()) - docs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "capi-controller-manager", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(HaveYAMLPathWithValue( - "$.spec.template.spec.containers[0].args[2]", - "--feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},ClusterResourceSet=${EXP_CLUSTER_RESOURCE_SET:=true},ClusterTopology=${CLUSTER_TOPOLOGY:=true},RuntimeSDK=${EXP_RUNTIME_SDK:=false}", - )) - }) -}) diff --git a/packages/cluster-api/test/unit/unit_suite_test.go b/packages/cluster-api/test/unit/unit_suite_test.go deleted file mode 100644 index ed88728824..0000000000 --- a/packages/cluster-api/test/unit/unit_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestUnit(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Cluster API Unit Suite") -} diff --git a/packages/cluster-api/vendir.lock.yml b/packages/cluster-api/vendir.lock.yml deleted file mode 100644 index 199970a1e8..0000000000 --- a/packages/cluster-api/vendir.lock.yml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - githubRelease: - url: https://api.github.com/repos/kubernetes-sigs/cluster-api/releases/86051101 - path: . - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/cluster-api/vendir.yml b/packages/cluster-api/vendir.yml deleted file mode 100644 index 557dc1460b..0000000000 --- a/packages/cluster-api/vendir.yml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: . - githubRelease: - slug: kubernetes-sigs/cluster-api - tag: v1.2.8 - disableAutoChecksumValidation: true - includePaths: - - core-components.yaml - - metadata.yaml diff --git a/packages/core-management-plugins/Makefile b/packages/core-management-plugins/Makefile deleted file mode 100644 index 357f5eed27..0000000000 --- a/packages/core-management-plugins/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../../common.mk - -configure-package: ## Configure package before creating the package - sed -e "s/\VERSION/${BUILD_VERSION}/" values.template.yaml > bundle/config/zz_generated_values.yaml - -reset-package: ## Reset configured package - rm bundle/config/zz_generated_values.yaml | true diff --git a/packages/core-management-plugins/README.md b/packages/core-management-plugins/README.md deleted file mode 100644 index bef0d99085..0000000000 --- a/packages/core-management-plugins/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# core-management-plugins Package - -This package provides the `CLIPlugin` CRD and default resources needed for the Tanzu CLI to understand `CLIPlugin` resources. This is a required package that needs to be installed on each management cluster so that the Tanzu CLI can understand the recommended set of plugins to use when talking to the cluster. - -## Components - -* CLIPlugin CRD -* Required CLIPlugin resources for `cluster`, `kubernetes-release` plugins, etc. - -## Details - -To learn more about the CLIPlugins and how it is getting used with Tanzu CLI, refer to this [doc](../../docs/design/context-aware-plugin-discovery-design.md) diff --git a/packages/core-management-plugins/bundle/config/cliplugin-crd.yaml b/packages/core-management-plugins/bundle/config/cliplugin-crd.yaml deleted file mode 100644 index 8d2b33c7f0..0000000000 --- a/packages/core-management-plugins/bundle/config/cliplugin-crd.yaml +++ /dev/null @@ -1,109 +0,0 @@ - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - kapp.k14s.io/change-group: "cliplugins.cli.tanzu.vmware.com/crd" - creationTimestamp: null - name: cliplugins.cli.tanzu.vmware.com -spec: - group: cli.tanzu.vmware.com - names: - kind: CLIPlugin - listKind: CLIPluginList - plural: cliplugins - singular: cliplugin - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: CLIPlugin denotes a Tanzu cli plugin. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: CLIPluginSpec defines the desired state of CLIPlugin. - properties: - artifacts: - additionalProperties: - description: ArtifactList contains an Artifact object for every - supported platform of a version. - items: - description: Artifact points to an individual plugin binary specific - to a version and platform. - properties: - arch: - description: Arch is CPU architecture of the plugin binary - in `GOARCH` format. - type: string - digest: - description: SHA256 hash of the plugin binary. - type: string - image: - description: Image is a fully qualified OCI image for the - plugin binary. - type: string - os: - description: OS of the plugin binary in `GOOS` format. - type: string - type: - description: Type of the binary artifact. Valid values are - S3, GCP, OCIImage. - type: string - uri: - description: AssetURI is a URI of the plugin binary. This - can be a fully qualified HTTP path or a local path. - type: string - required: - - arch - - os - - type - type: object - type: array - description: Artifacts contains an artifact list for every supported - version. - type: object - description: - description: Description is the plugin's description. - type: string - optional: - description: Optional specifies whether the plugin is mandatory or - optional If optional, the plugin will not get auto-downloaded as - part of `tanzu login` or `tanzu plugin sync` command To view the - list of plugin, user can use `tanzu plugin list` and to download - a specific plugin run, `tanzu plugin install ` - type: boolean - recommendedVersion: - description: Recommended version that Tanzu CLI should use if available. - The value should be a valid semantic version as defined in https://semver.org/. - E.g., 2.0.1 - type: string - target: - description: Target specifies the target of the plugin. Only needed - for standalone plugins - type: string - required: - - artifacts - - description - - optional - - recommendedVersion - type: object - required: - - metadata - - spec - type: object - served: true - storage: true diff --git a/packages/core-management-plugins/bundle/config/cluster.yaml b/packages/core-management-plugins/bundle/config/cluster.yaml deleted file mode 100644 index 2558278733..0000000000 --- a/packages/core-management-plugins/bundle/config/cluster.yaml +++ /dev/null @@ -1,30 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - creationTimestamp: null - name: cluster - annotations: - kapp.k14s.io/change-rule: "upsert after upserting cliplugins.cli.tanzu.vmware.com/crd" -spec: - artifacts: - #@yaml/text-templated-strings - (@= data.values.cluster.version @): - - arch: amd64 - image: tanzu-cli-plugins/cluster-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/cluster-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/cluster-windows-amd64:latest - os: windows - type: oci - description: Kubernetes cluster operations - optional: false - recommendedVersion: #@ data.values.cluster.version diff --git a/packages/core-management-plugins/bundle/config/feature.yaml b/packages/core-management-plugins/bundle/config/feature.yaml deleted file mode 100644 index e02c3a67fb..0000000000 --- a/packages/core-management-plugins/bundle/config/feature.yaml +++ /dev/null @@ -1,29 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - name: feature - annotations: - kapp.k14s.io/change-rule: "upsert after upserting cliplugins.cli.tanzu.vmware.com/crd" -spec: - artifacts: - #@yaml/text-templated-strings - (@= data.values.feature.version @): - - arch: amd64 - image: tanzu-cli-plugins/feature-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/feature-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/feature-windows-amd64:latest - os: windows - type: oci - description: Operate on features and featuregates - optional: false - recommendedVersion: #@ data.values.feature.version diff --git a/packages/core-management-plugins/bundle/config/kubernetes-release.yaml b/packages/core-management-plugins/bundle/config/kubernetes-release.yaml deleted file mode 100644 index 0fa44e0b2b..0000000000 --- a/packages/core-management-plugins/bundle/config/kubernetes-release.yaml +++ /dev/null @@ -1,30 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - creationTimestamp: null - name: kubernetes-release - annotations: - kapp.k14s.io/change-rule: "upsert after upserting cliplugins.cli.tanzu.vmware.com/crd" -spec: - artifacts: - #@yaml/text-templated-strings - (@= data.values.kubernetesrelease.version @): - - arch: amd64 - image: tanzu-cli-plugins/kubernetes-release-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/kubernetes-release-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/kubernetes-release-windows-amd64:latest - os: windows - type: oci - description: Kubernetes release operations - optional: false - recommendedVersion: #@ data.values.kubernetesrelease.version diff --git a/packages/core-management-plugins/kbld-config.yaml b/packages/core-management-plugins/kbld-config.yaml deleted file mode 100644 index cadb92c9c7..0000000000 --- a/packages/core-management-plugins/kbld-config.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: kbld.k14s.io/v1alpha1 -kind: Config -overrides: -#! tanzu-cliplugins linux-amd64 -- image: tanzu-cli-plugins/cluster-linux-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/kubernetes-release-linux-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/feature-linux-amd64:latest - newImage: "" -#! tanzu-cliplugins darwin-amd64 -- image: tanzu-cli-plugins/cluster-darwin-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/kubernetes-release-darwin-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/feature-darwin-amd64:latest - newImage: "" -#! tanzu-cliplugins windows-amd64 -- image: tanzu-cli-plugins/cluster-windows-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/kubernetes-release-windows-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/feature-windows-amd64:latest - newImage: "" diff --git a/packages/core-management-plugins/metadata.yaml b/packages/core-management-plugins/metadata.yaml deleted file mode 100644 index 052c0a51c7..0000000000 --- a/packages/core-management-plugins/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: core-management-plugins.tanzu.vmware.com - namespace: tkg-system -spec: - displayName: "core-management-plugins" - longDescription: "Core Management CLIPlugins package provides the CLIPlugin CRD and default resources needed for the Tanzu CLI to understand the recommended set of plugins to use when talking to the cluster." - shortDescription: "CLIPlugin management" - providerName: VMware - maintainers: - - name: "Anuj Chaudhari" - categories: - - "cliplugins" diff --git a/packages/core-management-plugins/package.yaml b/packages/core-management-plugins/package.yaml deleted file mode 100644 index 3c6147f8c1..0000000000 --- a/packages/core-management-plugins/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tanzu-core-management-plugins.tanzu.vmware.com - namespace: tkg-system -spec: - refName: core-management-plugins.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/core-management-plugins/values.template.yaml b/packages/core-management-plugins/values.template.yaml deleted file mode 100644 index 805888f42d..0000000000 --- a/packages/core-management-plugins/values.template.yaml +++ /dev/null @@ -1,10 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True - ---- -cluster: - version: VERSION -kubernetesrelease: - version: VERSION -feature: - version: VERSION diff --git a/packages/core-management-plugins/vendir.lock.yml b/packages/core-management-plugins/vendir.lock.yml deleted file mode 100755 index 96a4894c49..0000000000 --- a/packages/core-management-plugins/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/core-management-plugins/vendir.yml b/packages/core-management-plugins/vendir.yml deleted file mode 100644 index 963f250148..0000000000 --- a/packages/core-management-plugins/vendir.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 diff --git a/packages/featuregates/bundle/config/upstream/certificates.yaml b/packages/featuregates/bundle/config/upstream/certificates.yaml deleted file mode 100644 index 66ebc52fc7..0000000000 --- a/packages/featuregates/bundle/config/upstream/certificates.yaml +++ /dev/null @@ -1,29 +0,0 @@ -#@ load("@ytt:data", "data") - -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: tanzu-featuregates-selfsigned-issuer - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-group: "featuregates.config.tanzu.vmware.com/issuer" -spec: - selfSigned: {} ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: tanzu-featuregates-serving-cert - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-group: "featuregates.config.tanzu.vmware.com/certificate" - kapp.k14s.io/change-rule.0: "upsert after upserting featuregates.config.tanzu.vmware.com/issuer" - kapp.k14s.io/change-rule.1: "delete before deleting featuregates.config.tanzu.vmware.com/issuer" -spec: - dnsNames: - - #@ "tanzu-featuregates-webhook-service.{}.svc".format(data.values.namespace) - - #@ "tanzu-featuregates-webhook-service-cert.{}.svc.cluster.local".format(data.values.namespace) - issuerRef: - kind: Issuer - name: tanzu-featuregates-selfsigned-issuer - secretName: tanzu-featuregates-webhook-server-cert diff --git a/packages/featuregates/bundle/config/upstream/rbac.yaml b/packages/featuregates/bundle/config/upstream/rbac.yaml index 1a89d18e8d..8619a2a476 100644 --- a/packages/featuregates/bundle/config/upstream/rbac.yaml +++ b/packages/featuregates/bundle/config/upstream/rbac.yaml @@ -99,6 +99,27 @@ rules: - get - list - watch + - apiGroups: + - "" + resources: + - secrets + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - "admissionregistration.k8s.io" + resources: + - mutatingwebhookconfigurations + - validatingwebhookconfigurations + verbs: + - get + - list + - patch + - update + - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding diff --git a/packages/featuregates/bundle/config/upstream/tanzu-featuregates-manager.yaml b/packages/featuregates/bundle/config/upstream/tanzu-featuregates-manager.yaml index 9909972887..12a955fab4 100644 --- a/packages/featuregates/bundle/config/upstream/tanzu-featuregates-manager.yaml +++ b/packages/featuregates/bundle/config/upstream/tanzu-featuregates-manager.yaml @@ -9,10 +9,6 @@ metadata: app: tanzu-featuregates-manager name: tanzu-featuregates-controller-manager namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/update-strategy: "fallback-on-replace" - kapp.k14s.io/change-rule.0: "upsert after upserting featuregates.config.tanzu.vmware.com/certificate" - kapp.k14s.io/change-rule.1: "delete before deleting featuregates.config.tanzu.vmware.com/certificate" spec: replicas: 1 selector: @@ -30,6 +26,11 @@ spec: args: - #@ "--webhook-server-port={}".format(getWebhookServerPort()) - #@ "--tls-cipher-suites={}".format(data.values.deployment.tlsCipherSuites) + - "--webhook-config-label=tanzu.vmware.com/featuregates-webhook-managed-certs=true" + - #@ "--webhook-service-namespace={}".format(data.values.namespace) + - "--webhook-service-name=tanzu-featuregates-webhook-service" + - #@ "--webhook-secret-namespace={}".format(data.values.namespace) + - "--webhook-secret-name=tanzu-featuregates-webhook-server-cert" resources: limits: cpu: 100m diff --git a/packages/featuregates/bundle/config/upstream/webhook-secret.yaml b/packages/featuregates/bundle/config/upstream/webhook-secret.yaml new file mode 100644 index 0000000000..e4afde3c68 --- /dev/null +++ b/packages/featuregates/bundle/config/upstream/webhook-secret.yaml @@ -0,0 +1,10 @@ +#@ load("@ytt:data", "data") + +apiVersion: v1 +kind: Secret +metadata: + annotations: + tanzu.vmware.com/featuregates-webhook-rotation-interval: 168h + name: tanzu-featuregates-webhook-server-cert + namespace: #@ data.values.namespace +type: Opaque diff --git a/packages/featuregates/bundle/config/upstream/webhooks/config/webhook.yaml b/packages/featuregates/bundle/config/upstream/webhooks/config/webhook.yaml index 04277f30dd..7742f6b2c3 100644 --- a/packages/featuregates/bundle/config/upstream/webhooks/config/webhook.yaml +++ b/packages/featuregates/bundle/config/upstream/webhooks/config/webhook.yaml @@ -4,9 +4,8 @@ apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: name: tanzu-featuregates-validating-webhook - annotations: - # This is the expected certificate generated beforehand. - cert-manager.io/inject-ca-from: #@ "{}/tanzu-featuregates-serving-cert".format(data.values.namespace) + labels: + tanzu.vmware.com/featuregates-webhook-managed-certs: "true" webhooks: - admissionReviewVersions: - v1beta1 diff --git a/packages/featuregates/bundle/config/upstream/webhooks/core/webhook.yaml b/packages/featuregates/bundle/config/upstream/webhooks/core/webhook.yaml index f33e8cd9f8..5a4fd3d7bf 100644 --- a/packages/featuregates/bundle/config/upstream/webhooks/core/webhook.yaml +++ b/packages/featuregates/bundle/config/upstream/webhooks/core/webhook.yaml @@ -4,9 +4,8 @@ apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: name: tanzu-featuregates-validating-webhook-core - annotations: - # This is the expected certificate generated beforehand. - cert-manager.io/inject-ca-from: #@ "{}/tanzu-featuregates-serving-cert".format(data.values.namespace) + labels: + tanzu.vmware.com/featuregates-webhook-managed-certs: "true" webhooks: - admissionReviewVersions: - v1beta1 diff --git a/packages/featuregates/vendir.lock.yml b/packages/featuregates/vendir.lock.yml index e6d88ab78f..aaae06b9f8 100644 --- a/packages/featuregates/vendir.lock.yml +++ b/packages/featuregates/vendir.lock.yml @@ -6,7 +6,7 @@ directories: - directory: {} path: crds/core - manual: {} - path: certificates.yaml + path: webhook-secret.yaml - manual: {} path: rbac.yaml - manual: {} diff --git a/packages/featuregates/vendir.yml b/packages/featuregates/vendir.yml index b54a6e8a40..6367bdc96c 100644 --- a/packages/featuregates/vendir.yml +++ b/packages/featuregates/vendir.yml @@ -12,7 +12,7 @@ directories: includePaths: - core.tanzu.vmware.com_features.yaml - core.tanzu.vmware.com_featuregates.yaml - - path: certificates.yaml + - path: webhook-secret.yaml manual: {} - path: rbac.yaml manual: {} diff --git a/packages/framework/Makefile b/packages/framework/Makefile deleted file mode 100644 index 047b729714..0000000000 --- a/packages/framework/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/framework/README.md b/packages/framework/README.md deleted file mode 100644 index b457bdd5e0..0000000000 --- a/packages/framework/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Framework Package - -Framework management package is a meta package that provides PackageInstall CRs and Service Accounts needed for -installing the packages below: - -1. Featuregates -2. Addons-manager -3. TKR Service -4. Capabilities (To be added) -5. Tanzu Auth Service -6. CLI Plugins diff --git a/packages/framework/bundle/config/packageinstalls/addons-manager-pi.yaml b/packages/framework/bundle/config/packageinstalls/addons-manager-pi.yaml deleted file mode 100644 index aa5f413951..0000000000 --- a/packages/framework/bundle/config/packageinstalls/addons-manager-pi.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tanzu-addons-manager - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting addons-manager-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting addons-manager-packageinstall/serviceaccount" - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - serviceAccountName: tanzu-addons-manager-package-sa - packageRef: - refName: addons-manager.tanzu.vmware.com - versionSelection: - prereleases: {} - #@ if data.values.addonsManagerPackageValues.versionConstraints: - constraints: #@ data.values.addonsManagerPackageValues.versionConstraints - #@ end - values: - - secretRef: - name: tanzu-addons-manager-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: tanzu-addons-manager-values - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting addons-manager-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting addons-manager-packageinstall/serviceaccount" -type: Opaque -stringData: - values.yaml: #@ yaml.encode(data.values.addonsManagerPackageValues) diff --git a/packages/framework/bundle/config/packageinstalls/addons-manager-service-account.yaml b/packages/framework/bundle/config/packageinstalls/addons-manager-service-account.yaml deleted file mode 100644 index 0ee0eaed67..0000000000 --- a/packages/framework/bundle/config/packageinstalls/addons-manager-service-account.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#@ load("@ytt:data", "data") - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tanzu-addons-manager-package-sa - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "addons-manager-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-addons-manager-package-cluster-role - annotations: - kapp.k14s.io/change-group: "addons-manager-packageinstall/serviceaccount-0" -rules: -- apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-addons-manager-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "addons-manager-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting addons-manager-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting addons-manager-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-addons-manager-package-cluster-role -subjects: - - kind: ServiceAccount - name: tanzu-addons-manager-package-sa - namespace: #@ data.values.namespaceForPackageInstallation diff --git a/packages/framework/bundle/config/packageinstalls/cliplugins-pi.yaml b/packages/framework/bundle/config/packageinstalls/cliplugins-pi.yaml deleted file mode 100644 index a720712d12..0000000000 --- a/packages/framework/bundle/config/packageinstalls/cliplugins-pi.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tanzu-cliplugins - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting cliplugins-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting cliplugins-packageinstall/serviceaccount" - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - serviceAccountName: tanzu-cliplugins-package-sa - packageRef: - refName: cliplugins.tanzu.vmware.com - versionSelection: - prereleases: {} - #@ if data.values.clipluginsPackageValues.versionConstraints: - constraints: #@ data.values.clipluginsPackageValues.versionConstraints - #@ end - values: - - secretRef: - name: tanzu-cliplugins-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: tanzu-cliplugins-values - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting cliplugins-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting cliplugins-packageinstall/serviceaccount" -type: Opaque -stringData: - values.yaml: #@ yaml.encode(data.values.clipluginsPackageValues) diff --git a/packages/framework/bundle/config/packageinstalls/cliplugins-service-account.yaml b/packages/framework/bundle/config/packageinstalls/cliplugins-service-account.yaml deleted file mode 100644 index e1d66047b7..0000000000 --- a/packages/framework/bundle/config/packageinstalls/cliplugins-service-account.yaml +++ /dev/null @@ -1,77 +0,0 @@ -#@ load("@ytt:data", "data") - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tanzu-cliplugins-package-sa - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "cliplugins-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-cliplugins-package-cluster-role - annotations: - kapp.k14s.io/change-group: "cliplugins-packageinstall/serviceaccount-0" -rules: - - apiGroups: - - "" - resources: - - secrets - - configmaps - - serviceaccounts - - services - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - create - - update - - get - - apiGroups: - - packaging.carvel.dev - resources: - - packageinstalls - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - rbac.authorization.k8s.io - resources: - - clusterroles - - clusterrolebindings - verbs: - - create - - update - - get - - list - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-cliplugins-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-rule: "upsert after upserting cliplugins-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting cliplugins-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting cliplugins-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-cliplugins-package-cluster-role -subjects: - - kind: ServiceAccount - name: tanzu-cliplugins-package-sa - namespace: #@ data.values.namespaceForPackageInstallation diff --git a/packages/framework/bundle/config/packageinstalls/featuregates-pi.yaml b/packages/framework/bundle/config/packageinstalls/featuregates-pi.yaml deleted file mode 100644 index 9fb0628348..0000000000 --- a/packages/framework/bundle/config/packageinstalls/featuregates-pi.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tanzu-featuregates - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting featuregates-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting featuregates-packageinstall/serviceaccount" - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - serviceAccountName: tanzu-featuregates-package-sa - packageRef: - refName: featuregates.tanzu.vmware.com - versionSelection: - prereleases: {} - #@ if data.values.featureGatesPackageValues.versionConstraints: - constraints: #@ data.values.featureGatesPackageValues.versionConstraints - #@ end - values: - - secretRef: - name: tanzu-featuregates-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: tanzu-featuregates-values - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting featuregates-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting featuregates-packageinstall/serviceaccount" -type: Opaque -stringData: - values.yaml: #@ yaml.encode(data.values.featureGatesPackageValues) diff --git a/packages/framework/bundle/config/packageinstalls/featuregates-service-account.yaml b/packages/framework/bundle/config/packageinstalls/featuregates-service-account.yaml deleted file mode 100644 index 113c028193..0000000000 --- a/packages/framework/bundle/config/packageinstalls/featuregates-service-account.yaml +++ /dev/null @@ -1,182 +0,0 @@ -#@ load("@ytt:data", "data") - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tanzu-featuregates-package-sa - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "featuregates-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-featuregates-package-cluster-role - annotations: - kapp.k14s.io/change-group: "featuregates-packageinstall/serviceaccount-0" -rules: - - apiGroups: - - "" - resources: - - configmaps - - serviceaccounts - - services - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - apps - resources: - - deployments - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - cert-manager.io - resources: - - issuers - - certificates - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - admissionregistration.k8s.io - resources: - - validatingwebhookconfigurations - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - rbac.authorization.k8s.io - resources: - - clusterroles - - clusterrolebindings - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - config.tanzu.vmware.com - resources: - - featuregates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - delete - - apiGroups: - - config.tanzu.vmware.com - resources: - - featuregates/status - verbs: - - get - - patch - - update - - apiGroups: - - config.tanzu.vmware.com - resources: - - features - verbs: - - get - - list - - watch - - apiGroups: - - config.tanzu.vmware.com - resources: - - features/status - verbs: - - get - - patch - - update - - apiGroups: - - core.tanzu.vmware.com - resources: - - featuregates - verbs: - - get - - list - - patch - - update - - watch - - apiGroups: - - core.tanzu.vmware.com - resources: - - featuregates/status - verbs: - - get - - patch - - update - - apiGroups: - - core.tanzu.vmware.com - resources: - - features - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - core.tanzu.vmware.com - resources: - - features/status - verbs: - - get - - patch - - update - - apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-featuregates-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "featuregates-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting featuregates-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting featuregates-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-featuregates-package-cluster-role -subjects: - - kind: ServiceAccount - name: tanzu-featuregates-package-sa - namespace: #@ data.values.namespaceForPackageInstallation diff --git a/packages/framework/bundle/config/packageinstalls/tanzu-auth-pi.yaml b/packages/framework/bundle/config/packageinstalls/tanzu-auth-pi.yaml deleted file mode 100644 index 5c34c3d124..0000000000 --- a/packages/framework/bundle/config/packageinstalls/tanzu-auth-pi.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tanzu-auth - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tanzu-auth-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tanzu-auth-packageinstall/serviceaccount" - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - serviceAccountName: tanzu-auth-package-sa - packageRef: - refName: tanzu-auth.tanzu.vmware.com - versionSelection: - prereleases: {} - #@ if data.values.tanzuAuthPackageValues.versionConstraints: - constraints: #@ data.values.tanzuAuthPackageValues.versionConstraints - #@ end - values: - - secretRef: - name: tanzu-auth-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: tanzu-auth-values - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tanzu-auth-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tanzu-auth-packageinstall/serviceaccount" -type: Opaque -stringData: - values.yaml: #@ yaml.encode(data.values.tanzuAuthPackageValues) diff --git a/packages/framework/bundle/config/packageinstalls/tanzu-auth-service-account.yaml b/packages/framework/bundle/config/packageinstalls/tanzu-auth-service-account.yaml deleted file mode 100644 index 5ee33f171d..0000000000 --- a/packages/framework/bundle/config/packageinstalls/tanzu-auth-service-account.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#@ load("@ytt:data", "data") - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tanzu-auth-package-sa - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "tanzu-auth-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-auth-package-cluster-role - annotations: - kapp.k14s.io/change-group: "tanzu-auth-packageinstall/serviceaccount-0" -rules: -- apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-auth-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "tanzu-auth-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting tanzu-auth-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting tanzu-auth-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-auth-package-cluster-role -subjects: - - kind: ServiceAccount - name: tanzu-auth-package-sa - namespace: #@ data.values.namespaceForPackageInstallation diff --git a/packages/framework/bundle/config/packageinstalls/tkr-service-pi.yaml b/packages/framework/bundle/config/packageinstalls/tkr-service-pi.yaml deleted file mode 100644 index f60bda0970..0000000000 --- a/packages/framework/bundle/config/packageinstalls/tkr-service-pi.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tkr-service - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-service-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-service-packageinstall/serviceaccount" - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - serviceAccountName: tkr-service-package-sa - packageRef: - refName: tkr-service.tanzu.vmware.com - versionSelection: - prereleases: {} - #@ if data.values.tkrServicePackageValues.versionConstraints: - constraints: #@ data.values.tkrServicePackageValues.versionConstraints - #@ end - values: - - secretRef: - name: tkr-service-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: tkr-service-values - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-service-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-service-packageinstall/serviceaccount" -type: Opaque -stringData: - values.yaml: #@ yaml.encode(data.values.tkrServicePackageValues) diff --git a/packages/framework/bundle/config/packageinstalls/tkr-service-service-account.yaml b/packages/framework/bundle/config/packageinstalls/tkr-service-service-account.yaml deleted file mode 100644 index 168af534ea..0000000000 --- a/packages/framework/bundle/config/packageinstalls/tkr-service-service-account.yaml +++ /dev/null @@ -1,158 +0,0 @@ -#@ load("@ytt:data", "data") - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tkr-service-package-sa - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "tkr-service-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tkr-service-package-cluster-role - annotations: - kapp.k14s.io/change-group: "tkr-service-packageinstall/serviceaccount-0" -rules: - - apiGroups: - - "" - resources: - - configmaps - - serviceaccounts - - services - verbs: - - create - - update - - get - - list - - delete - - watch - - apiGroups: - - apps - resources: - - deployments - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - cert-manager.io - resources: - - issuers - - certificates - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - admissionregistration.k8s.io - resources: - - mutatingwebhookconfigurations - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - rbac.authorization.k8s.io - resources: - - clusterroles - - clusterrolebindings - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - - osimages - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases/status - - osimages/status - verbs: - - get - - patch - - update - - apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch - - create - - update - - patch - - apiGroups: - - cluster.x-k8s.io - resources: - - clusterclasses - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create - - get - - update - - apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - create - - update - - get - - list - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tkr-service-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "tkr-service-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-service-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-service-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tkr-service-package-cluster-role -subjects: - - kind: ServiceAccount - name: tkr-service-package-sa - namespace: #@ data.values.namespaceForPackageInstallation diff --git a/packages/framework/bundle/config/values.yaml b/packages/framework/bundle/config/values.yaml deleted file mode 100644 index cbaaee0906..0000000000 --- a/packages/framework/bundle/config/values.yaml +++ /dev/null @@ -1,63 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -namespaceForPackageInstallation: -featureGatesPackageValues: - namespace: - versionConstraints: - deployment: - hostNetwork: false - nodeSelector: null - tolerations: [] - webhookServerPort: 9443 -tkrServicePackageValues: - namespace: - versionConstraints: - deployment: - hostNetwork: false - nodeSelector: null - tolerations: [] - #! If hostNetwork is set to true the below two ports should be different - tkrConversionWebhookServerPort: 9443 - tkrResolverWebhookServerPort: 9443 - httpProxy: - httpsProxy: - noProxy: -addonsManagerPackageValues: - versionConstraints: - tanzuAddonsManager: - namespace: tkg-system - createNamespace: false - deployment: - replicas: 2 - leaderElection: false - hostNetwork: true - priorityClassName: system-cluster-critical - nodeSelector: null - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - webhookServerPort: 9865 - healthzPort: 18316 - clusterDeleteTimeout: "10m" - metricsBindAddress: "localhost:18317" - featureGates: - clusterBootstrapController: false - packageInstallStatus: false -clipluginsPackageValues: - namespace: - versionConstraints: -tanzuAuthPackageValues: - versionConstraints: - createNamespace: true - namespace: tanzu-auth - controller: - image: tanzu-auth-controller-manager:latest - deployment: - hostNetwork: true - nodeSelector: null - tolerations: [] diff --git a/packages/framework/metadata.yaml b/packages/framework/metadata.yaml deleted file mode 100644 index d4c1681f58..0000000000 --- a/packages/framework/metadata.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: framework.tanzu.vmware.com - namespace: framework -spec: - displayName: "framework" - longDescription: "framework package provides PackageInstall CRs and Service Accounts needed for installing the Tanzu Framework components (addons, featuregates, TKR)" - shortDescription: "Tanzu Framework components" - providerName: VMware - maintainers: - - name: "Rajath Agasthya" - - name: "Jeff Moroski" - - name: "Harish Yayi" - - name: "Lucheng Bao" - - name: "Guanpeng Gao" - categories: - - "Tanzu Framework components" diff --git a/packages/framework/package.yaml b/packages/framework/package.yaml deleted file mode 100644 index a90e49eb97..0000000000 --- a/packages/framework/package.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: framework.tanzu.vmware.com -spec: - refName: framework.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/framework/vendir.lock.yml b/packages/framework/vendir.lock.yml deleted file mode 100644 index 96a4894c49..0000000000 --- a/packages/framework/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/framework/vendir.yml b/packages/framework/vendir.yml deleted file mode 100644 index b99b7a2c98..0000000000 --- a/packages/framework/vendir.yml +++ /dev/null @@ -1,2 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config diff --git a/packages/package-values.yaml b/packages/package-values.yaml index a13310770d..f27f06ef80 100644 --- a/packages/package-values.yaml +++ b/packages/package-values.yaml @@ -1,10 +1,10 @@ #@data/values --- repositories: - management: + runtime-core: version: null sha256: latest - name: management + name: runtime-core domain: tanzu.vmware.com registry: registry @@ -24,206 +24,9 @@ repositories: version: latest #! Gets replaced with imgpkg sha256 at build, this should be name:version sha256: "featuregates:latest" - - name: tanzu-auth - displayName: tanzu-auth - #! Relative path to package bundle - path: packages/tanzu-auth - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tanzu-auth:latest" - - name: cliplugins - displayName: cliplugins - #! Relative path to package bundle - path: packages/cliplugins - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "cliplugins:latest" - - name: core-management-plugins - displayName: core-management-plugins - #! Relative path to package bundle - path: packages/core-management-plugins - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "core-management-plugins:latest" - - name: addons-manager - displayName: addons-manager - #! Relative path to package bundle - path: packages/addons-manager - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "addons-manager:latest" - - name: ako-operator-v2 - displayName: ako-operator-v2 - #! Relative path to package bundle - path: packages/ako-operator-v2 - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "ako-operator:latest" - - name: tkg - displayName: tkg - #! Relative path to package bundle - path: packages/tkg - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkg:latest" - - name: tkg-clusterclass - displayName: tkg-clusterclass - #! Relative path to package bundle - path: packages/tkg-clusterclass - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkg-clusterclass:latest" - - name: tkg-autoscaler - displayName: tkg-autoscaler - #! Relative path to package bundle - path: packages/tkg-autoscaler - domain: tanzu.vmware.com - version: v1.21.0 - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkg-autoscaler:latest" - skipVersionOverride: true - env: - AUTOSCALER_IMAGE: projects-stg.registry.vmware.com\/tkg\/cluster-autoscaler:v1.21.0_vmware.1 - - name: tkg-autoscaler - displayName: tkg-autoscaler - #! Relative path to package bundle - path: packages/tkg-autoscaler - domain: tanzu.vmware.com - version: v1.22.0 - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkg-autoscaler:latest" - skipVersionOverride: true - env: - AUTOSCALER_IMAGE: projects-stg.registry.vmware.com\/tkg\/cluster-autoscaler:v1.22.0_vmware.1 - - name: tkg-autoscaler - displayName: tkg-autoscaler - #! Relative path to package bundle - path: packages/tkg-autoscaler - domain: tanzu.vmware.com - version: v1.23.0 - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkg-autoscaler:latest" - skipVersionOverride: true - env: - AUTOSCALER_IMAGE: projects-stg.registry.vmware.com\/tkg\/cluster-autoscaler:v1.23.0_vmware.1 - - name: tkg-clusterclass-docker - displayName: tkg-clusterclass-docker - #! Relative path to package bundle - path: packages/tkg-clusterclass-docker - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkg-clusterclass-docker:latest" - - name: tkg-clusterclass-azure - displayName: tkg-clusterclass-azure - #! Relative path to package bundle - path: packages/tkg-clusterclass-azure - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkg-clusterclass-azure:latest" - - name: tkg-clusterclass-vsphere - displayName: tkg-clusterclass-vsphere - #! Relative path to package bundle - path: packages/tkg-clusterclass-vsphere - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkg-clusterclass-vsphere:latest" - - name: tkg-clusterclass-aws - displayName: tkg-clusterclass-aws - #! Relative path to package bundle - path: packages/tkg-clusterclass-aws - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkg-clusterclass-aws:latest" - - name: tkg-clusterclass-oci - displayName: tkg-clusterclass-oci - #! Relative path to package bundle - path: packages/tkg-clusterclass-oci - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkg-clusterclass-oci:latest" - - name: tkr-service - displayName: tkr-service - #! Relative path to package bundle - path: packages/tkr-service - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkr-service:latest" - - name: framework - displayName: framework - #! Relative path to package bundle - path: packages/framework - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "framework:latest" - - name: tkr-source-controller - displayName: tkr-source-controller - #! Relative path to package bundle - path: packages/tkr-source-controller - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkr-source-controller:latest" - - name: tkr-vsphere-resolver - displayName: tkr-vsphere-resolver - #! Relative path to package bundle - path: packages/tkr-vsphere-resolver - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkr-vsphere-resolver:latest" - - name: tkg-windows - displayName: tkg-windows - #! Relative path to package bundle - path: packages/tkg-windows - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "tkg-windows:latest" - standalone: - version: null - sha256: null - name: standalone - domain: tanzu.vmware.com - - packageSpec: - syncPeriod: 5m - deploy: - kappWaitTimeout: 5m - kubeAPIQPS: 20 - kubeAPIBurst: 30 - - packages: - - name: standalone-plugins - displayName: standalone-plugins - #! Relative path to package bundle - path: packages/standalone-plugins - domain: tanzu.vmware.com - version: latest - #! Gets replaced with imgpkg sha256 at build, this should be name:version - sha256: "standalone-plugins:latest" - name: capabilities path: packages/capabilities domain: tanzu.vmware.com version: latest sha256: "capabilities:latest" - - name: tkg-storageclass - displayName: tkg-storageclass - path: packages/standalone/tkg-storageclass - domain: tanzu.vmware.com - version: latest - sha256: "tkg-storageclass:latest" diff --git a/packages/standalone-plugins/Makefile b/packages/standalone-plugins/Makefile deleted file mode 100644 index 357f5eed27..0000000000 --- a/packages/standalone-plugins/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../../common.mk - -configure-package: ## Configure package before creating the package - sed -e "s/\VERSION/${BUILD_VERSION}/" values.template.yaml > bundle/config/zz_generated_values.yaml - -reset-package: ## Reset configured package - rm bundle/config/zz_generated_values.yaml | true diff --git a/packages/standalone-plugins/README.md b/packages/standalone-plugins/README.md deleted file mode 100644 index f9d5a94fc0..0000000000 --- a/packages/standalone-plugins/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# standalone-plugins Package - -This standalone-plugins package is a standalone package which includes standalone CLI plugin resources. This package is directly consumed by Tanzu CLI and is not installed directly on any management or workload clusters. - -## Components - -* Required CLIPlugin resources for standalone plugins like `login`, `management-cluster`, `package`, `secret` etc. - -## Details - -To learn more about the CLIPlugins and how it is getting used with Tanzu CLI, refer to this [doc](../../docs/design/context-aware-plugin-discovery-design.md) diff --git a/packages/standalone-plugins/bundle/config/overlay/isolated-cluster.yaml b/packages/standalone-plugins/bundle/config/overlay/isolated-cluster.yaml deleted file mode 100644 index 48f1ce337e..0000000000 --- a/packages/standalone-plugins/bundle/config/overlay/isolated-cluster.yaml +++ /dev/null @@ -1,28 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - creationTimestamp: null - name: isolated-cluster -spec: - artifacts: - #@yaml/text-templated-strings - (@= data.values.isolatedcluster.version @): - - arch: amd64 - image: tanzu-cli-plugins/isolated-cluster-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/isolated-cluster-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/isolated-cluster-windows-amd64:latest - os: windows - type: oci - description: isolated-cluster operations - optional: false - recommendedVersion: #@ data.values.isolatedcluster.version diff --git a/packages/standalone-plugins/bundle/config/overlay/login.yaml b/packages/standalone-plugins/bundle/config/overlay/login.yaml deleted file mode 100644 index 9615351b29..0000000000 --- a/packages/standalone-plugins/bundle/config/overlay/login.yaml +++ /dev/null @@ -1,28 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - creationTimestamp: null - name: login -spec: - artifacts: - #@yaml/text-templated-strings - (@= data.values.login.version @): - - arch: amd64 - image: tanzu-cli-plugins/login-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/login-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/login-windows-amd64:latest - os: windows - type: oci - description: Login to the platform - optional: false - recommendedVersion: #@ data.values.login.version diff --git a/packages/standalone-plugins/bundle/config/overlay/management-cluster.yaml b/packages/standalone-plugins/bundle/config/overlay/management-cluster.yaml deleted file mode 100644 index 585b467846..0000000000 --- a/packages/standalone-plugins/bundle/config/overlay/management-cluster.yaml +++ /dev/null @@ -1,29 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - creationTimestamp: null - name: management-cluster -spec: - artifacts: - #@yaml/text-templated-strings - (@= data.values.managementcluster.version @): - - arch: amd64 - image: tanzu-cli-plugins/management-cluster-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/management-cluster-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/management-cluster-windows-amd64:latest - os: windows - type: oci - description: Kubernetes management-cluster operations - optional: false - recommendedVersion: #@ data.values.managementcluster.version - target: kubernetes diff --git a/packages/standalone-plugins/bundle/config/overlay/package.yaml b/packages/standalone-plugins/bundle/config/overlay/package.yaml deleted file mode 100644 index c6241d9b3b..0000000000 --- a/packages/standalone-plugins/bundle/config/overlay/package.yaml +++ /dev/null @@ -1,29 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - creationTimestamp: null - name: package -spec: - artifacts: - #@yaml/text-templated-strings - (@= data.values.package.version @): - - arch: amd64 - image: tanzu-cli-plugins/package-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/package-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/package-windows-amd64:latest - os: windows - type: oci - description: Tanzu package management - optional: false - recommendedVersion: #@ data.values.package.version - target: kubernetes diff --git a/packages/standalone-plugins/bundle/config/overlay/pinniped-auth.yaml b/packages/standalone-plugins/bundle/config/overlay/pinniped-auth.yaml deleted file mode 100644 index 48c36768aa..0000000000 --- a/packages/standalone-plugins/bundle/config/overlay/pinniped-auth.yaml +++ /dev/null @@ -1,28 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - creationTimestamp: null - name: pinniped-auth -spec: - artifacts: - #@yaml/text-templated-strings - (@= data.values.pinnipedauth.version @): - - arch: amd64 - image: tanzu-cli-plugins/pinniped-auth-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/pinniped-auth-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/pinniped-auth-windows-amd64:latest - os: windows - type: oci - description: Pinniped authentication operations (usually not directly invoked) - optional: false - recommendedVersion: #@ data.values.pinnipedauth.version diff --git a/packages/standalone-plugins/bundle/config/overlay/secret.yaml b/packages/standalone-plugins/bundle/config/overlay/secret.yaml deleted file mode 100644 index 3c5c69f6e3..0000000000 --- a/packages/standalone-plugins/bundle/config/overlay/secret.yaml +++ /dev/null @@ -1,29 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - creationTimestamp: null - name: secret -spec: - artifacts: - #@yaml/text-templated-strings - (@= data.values.secret.version @): - - arch: amd64 - image: tanzu-cli-plugins/secret-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/secret-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/secret-windows-amd64:latest - os: windows - type: oci - description: Tanzu secret management - optional: false - recommendedVersion: #@ data.values.secret.version - target: kubernetes diff --git a/packages/standalone-plugins/bundle/config/overlay/telemetry.yaml b/packages/standalone-plugins/bundle/config/overlay/telemetry.yaml deleted file mode 100644 index c8bbd4c8f7..0000000000 --- a/packages/standalone-plugins/bundle/config/overlay/telemetry.yaml +++ /dev/null @@ -1,30 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") - ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: CLIPlugin -metadata: - name: telemetry - annotations: - kapp.k14s.io/change-rule: "upsert after upserting cliplugins.cli.tanzu.vmware.com/crd" -spec: - artifacts: - #@yaml/text-templated-strings - (@= data.values.telemetry.version @): - - arch: amd64 - image: tanzu-cli-plugins/telemetry-darwin-amd64:latest - os: darwin - type: oci - - arch: amd64 - image: tanzu-cli-plugins/telemetry-linux-amd64:latest - os: linux - type: oci - - arch: amd64 - image: tanzu-cli-plugins/telemetry-windows-amd64:latest - os: windows - type: oci - description: Configure cluster-wide telemetry settings - optional: false - recommendedVersion: #@ data.values.telemetry.version - target: kubernetes diff --git a/packages/standalone-plugins/kbld-config.yaml b/packages/standalone-plugins/kbld-config.yaml deleted file mode 100644 index a8db528480..0000000000 --- a/packages/standalone-plugins/kbld-config.yaml +++ /dev/null @@ -1,49 +0,0 @@ -apiVersion: kbld.k14s.io/v1alpha1 -kind: Config -overrides: -#! tanzu-cliplugins linux-amd64 -- image: tanzu-cli-plugins/login-linux-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/management-cluster-linux-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/package-linux-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/pinniped-auth-linux-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/secret-linux-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/telemetry-linux-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/isolated-cluster-linux-amd64:latest - newImage: "" -#! tanzu-cliplugins darwin-amd64 -- image: tanzu-cli-plugins/login-darwin-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/management-cluster-darwin-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/package-darwin-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/pinniped-auth-darwin-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/secret-darwin-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/telemetry-darwin-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/isolated-cluster-darwin-amd64:latest - newImage: "" -#! tanzu-cliplugins windows-amd64 -- image: tanzu-cli-plugins/login-windows-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/management-cluster-windows-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/package-windows-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/pinniped-auth-windows-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/secret-windows-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/telemetry-windows-amd64:latest - newImage: "" -- image: tanzu-cli-plugins/isolated-cluster-windows-amd64:latest - newImage: "" - diff --git a/packages/standalone-plugins/metadata.yaml b/packages/standalone-plugins/metadata.yaml deleted file mode 100644 index 7c241cdc78..0000000000 --- a/packages/standalone-plugins/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: standalone-plugins.tanzu.vmware.com - namespace: standalone-plugins -spec: - displayName: "standalone-plugins" - longDescription: "Standalone CLIPlugin package provides API resources that allow discovery of default plugins available with Tanzu CLI. These plugins are context agnostic" - shortDescription: "Standalone CLI Plugins" - providerName: VMware - maintainers: - - name: "Anuj Chaudhari" - categories: - - "cliplugins" diff --git a/packages/standalone-plugins/package.yaml b/packages/standalone-plugins/package.yaml deleted file mode 100644 index de108b18f5..0000000000 --- a/packages/standalone-plugins/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: standalone-plugins.tanzu.vmware.com - namespace: standalone-plugins -spec: - refName: standalone-plugins.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/standalone-plugins/values.template.yaml b/packages/standalone-plugins/values.template.yaml deleted file mode 100644 index e7a1c9f14f..0000000000 --- a/packages/standalone-plugins/values.template.yaml +++ /dev/null @@ -1,18 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True - ---- -login: - version: VERSION -managementcluster: - version: VERSION -package: - version: VERSION -pinnipedauth: - version: VERSION -secret: - version: VERSION -telemetry: - version: VERSION -isolatedcluster: - version: VERSION diff --git a/packages/standalone-plugins/vendir.lock.yml b/packages/standalone-plugins/vendir.lock.yml deleted file mode 100644 index 96a4894c49..0000000000 --- a/packages/standalone-plugins/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/standalone-plugins/vendir.yml b/packages/standalone-plugins/vendir.yml deleted file mode 100644 index 963f250148..0000000000 --- a/packages/standalone-plugins/vendir.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 diff --git a/packages/tanzu-auth/Makefile b/packages/tanzu-auth/Makefile deleted file mode 100644 index 047b729714..0000000000 --- a/packages/tanzu-auth/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tanzu-auth/README.md b/packages/tanzu-auth/README.md deleted file mode 100644 index 941c63282f..0000000000 --- a/packages/tanzu-auth/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Tanzu Auth Package - -Tanzu Auth management package provides federated user authentication to a fleet of clusters via [pinniped](https://pinniped.dev/). - -## Components - -* tanzu-auth-cascade-controller - -## Usage Example - -The `hack/run.sh` script in `pinniped-components/tanzu-auth-controller-manager` will deploy the tanzu-auth package. diff --git a/packages/tanzu-auth/bundle/config/deployment.yaml b/packages/tanzu-auth/bundle/config/deployment.yaml deleted file mode 100644 index 6388491308..0000000000 --- a/packages/tanzu-auth/bundle/config/deployment.yaml +++ /dev/null @@ -1,40 +0,0 @@ -#@ load("@ytt:data", "data") ---- -kind: Deployment -apiVersion: apps/v1 -metadata: - name: tanzu-auth-controller-manager - namespace: #@ data.values.namespace -spec: - selector: - matchLabels: - app: tanzu-auth-controller-manager - template: - metadata: - labels: - app: tanzu-auth-controller-manager - #! TODO: check out the spec of other packages, such as addons-manager-v1 for resource limits, etc. - #! we probably want to flesh this out. - spec: - #@ if/end hasattr(data.values.deployment, 'nodeSelector') and data.values.deployment.nodeSelector: - nodeSelector: #@ data.values.deployment.nodeSelector - serviceAccountName: tanzu-auth-controller-manager-sa - containers: - - image: #@ data.values.controller.image - name: tanzu-auth-controller-manager - args: ["--disable-cascade-v1alpha1", "--metrics-bind-addr=0"] - securityContext: - readOnlyRootFilesystem: true - runAsNonRoot: true - allowPrivilegeEscalation: false - capabilities: - drop: [ "ALL" ] - #! seccompProfile was introduced in Kube v1.19. Using it on an older Kube version will result in a - #! kubectl validation error when installing via `kubectl apply`, which can be ignored using kubectl's - #! `--validate=false` flag. Note that installing via `kapp` does not complain about this validation error. - seccompProfile: - type: "RuntimeDefault" - #@ if/end data.values.deployment.hostNetwork: - hostNetwork: true - #@ if/end hasattr(data.values.deployment, 'tolerations') and data.values.deployment.tolerations: - tolerations: #@ data.values.deployment.tolerations diff --git a/packages/tanzu-auth/bundle/config/namespace.yaml b/packages/tanzu-auth/bundle/config/namespace.yaml deleted file mode 100644 index 99e4fe00c0..0000000000 --- a/packages/tanzu-auth/bundle/config/namespace.yaml +++ /dev/null @@ -1,12 +0,0 @@ -#@ load("@ytt:data", "data") - -#@ if data.values.createNamespace: ---- -apiVersion: v1 -kind: Namespace -metadata: - name: #@ data.values.namespace - labels: - #@ if/end data.values.deployment.hostNetwork: - pod-security.kubernetes.io/enforce: privileged -#@ end diff --git a/packages/tanzu-auth/bundle/config/role.yaml b/packages/tanzu-auth/bundle/config/role.yaml deleted file mode 100644 index adf35e8305..0000000000 --- a/packages/tanzu-auth/bundle/config/role.yaml +++ /dev/null @@ -1,34 +0,0 @@ ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - name: tanzu-auth-controller-manager -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - verbs: - - get - - list - - watch diff --git a/packages/tanzu-auth/bundle/config/rolebinding.yaml b/packages/tanzu-auth/bundle/config/rolebinding.yaml deleted file mode 100644 index 72a734842a..0000000000 --- a/packages/tanzu-auth/bundle/config/rolebinding.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#@ load("@ytt:data", "data") ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: tanzu-auth-controller-manager -subjects: - - kind: ServiceAccount - name: tanzu-auth-controller-manager-sa - namespace: #@ data.values.namespace -roleRef: - kind: ClusterRole - name: tanzu-auth-controller-manager - apiGroup: rbac.authorization.k8s.io diff --git a/packages/tanzu-auth/bundle/config/serviceaccount.yaml b/packages/tanzu-auth/bundle/config/serviceaccount.yaml deleted file mode 100644 index dc4072cb02..0000000000 --- a/packages/tanzu-auth/bundle/config/serviceaccount.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tanzu-auth-controller-manager-sa - namespace: #@ data.values.namespace diff --git a/packages/tanzu-auth/bundle/config/values.yaml b/packages/tanzu-auth/bundle/config/values.yaml deleted file mode 100644 index 16e8e90d90..0000000000 --- a/packages/tanzu-auth/bundle/config/values.yaml +++ /dev/null @@ -1,11 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -createNamespace: true -namespace: tanzu-auth -controller: - image: tanzu-auth-controller-manager:latest -deployment: - hostNetwork: true - nodeSelector: null - tolerations: [] diff --git a/packages/tanzu-auth/kbld-config.yaml b/packages/tanzu-auth/kbld-config.yaml deleted file mode 100644 index 7b9178e648..0000000000 --- a/packages/tanzu-auth/kbld-config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: kbld.k14s.io/v1alpha1 -kind: Config -overrides: -- image: tanzu-auth-controller-manager:latest - newImage: "" diff --git a/packages/tanzu-auth/metadata.yaml b/packages/tanzu-auth/metadata.yaml deleted file mode 100644 index d9092e3dad..0000000000 --- a/packages/tanzu-auth/metadata.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tanzu-auth.tanzu.vmware.com -spec: - displayName: "tanzu-auth" - longDescription: "Tanzu Auth orchestrates the deployment of Pinniped packages to provide federated auth to a fleet of clusters for Tanzu" - shortDescription: "Tanzu Auth orchestrates the deployment of Pinniped packages" - providerName: VMware - maintainers: - - name: "Benjamin A. Petersen" - - name: "Ryan Richard" - - name: "Joshua Casey" - categories: - - "auth" diff --git a/packages/tanzu-auth/package.yaml b/packages/tanzu-auth/package.yaml deleted file mode 100644 index e455ff0874..0000000000 --- a/packages/tanzu-auth/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tanzu-auth.tanzu.vmware.com.1.6.0 - namespace: tkg-system -spec: - refName: tanzu-auth.tanzu.vmware.com - version: 1.6.0 - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tanzu-auth/vendir.lock.yml b/packages/tanzu-auth/vendir.lock.yml deleted file mode 100644 index eed24db801..0000000000 --- a/packages/tanzu-auth/vendir.lock.yml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - manual: {} - path: namespace.yaml - - manual: {} - path: deployment.yaml - - manual: {} - path: role.yaml - - manual: {} - path: rolebinding.yaml - - manual: {} - path: serviceaccount.yaml - - manual: {} - path: values.yaml - path: bundle/config -kind: LockConfig diff --git a/packages/tanzu-auth/vendir.yml b/packages/tanzu-auth/vendir.yml deleted file mode 100644 index ed62939a44..0000000000 --- a/packages/tanzu-auth/vendir.yml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config - contents: - - path: namespace.yaml - manual: {} - - path: deployment.yaml - manual: {} - - path: role.yaml - manual: {} - - path: rolebinding.yaml - manual: {} - - path: serviceaccount.yaml - manual: {} - - path: values.yaml - manual: {} diff --git a/packages/tkg-autoscaler/Makefile b/packages/tkg-autoscaler/Makefile deleted file mode 100644 index 4737cf08af..0000000000 --- a/packages/tkg-autoscaler/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../../common.mk - -configure-package: ## Configure package before creating the package - sed -e 's/\IMAGE/${AUTOSCALER_IMAGE}/' values.template.yaml > bundle/config/zz_generated_values.yaml - -reset-package: ## Reset configured package - rm bundle/config/zz_generated_values.yaml | true diff --git a/packages/tkg-autoscaler/README.md b/packages/tkg-autoscaler/README.md deleted file mode 100644 index 92703a99c1..0000000000 --- a/packages/tkg-autoscaler/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# tkg-clusterclass-aws Package - -This package provides << awesome functionality >> using [tkg-autoscaler](https://INFO_NEEDED). - -## Components - -## Configuration - -The following configuration values can be set to customize the tkg-autoscaler installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -### tkg-autoscaler Configuration - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -## Usage Example - -The following is a basic guide for getting started with tkg-autoscaler. diff --git a/packages/tkg-autoscaler/bundle/config/upstream/tkg-autoscaler.yaml b/packages/tkg-autoscaler/bundle/config/upstream/tkg-autoscaler.yaml deleted file mode 100644 index 9dc78cadd4..0000000000 --- a/packages/tkg-autoscaler/bundle/config/upstream/tkg-autoscaler.yaml +++ /dev/null @@ -1,209 +0,0 @@ -#@ load("@ytt:data", "data") - -#@ def autoscaler_volume_name(): -#@ return "{}-cluster-autoscaler-volume".format(data.values.CLUSTER_NAME) -#@ end - -#@ def autoscaler_kubeconfig_mount_path(): -#@ return "/mnt/{}-kubeconfig".format(data.values.CLUSTER_NAME) -#@ end - -#@ def autoscaler_args(): -#@ args = ["--cloud-provider=clusterapi"] -#@ args.append("--v=4") -#@ args.append("--clusterapi-cloud-config-authoritative") -#@ args.append("--kubeconfig=" + autoscaler_kubeconfig_mount_path() + "/value") -#@ args.append("--node-group-auto-discovery=clusterapi:clusterName=" + data.values.CLUSTER_NAME) -#@ args.append("--scale-down-delay-after-add=" + data.values.AUTOSCALER_SCALE_DOWN_DELAY_AFTER_ADD) -#@ args.append("--scale-down-delay-after-delete=" + data.values.AUTOSCALER_SCALE_DOWN_DELAY_AFTER_DELETE) -#@ args.append("--scale-down-delay-after-failure=" + data.values.AUTOSCALER_SCALE_DOWN_DELAY_AFTER_FAILURE) -#@ args.append("--scale-down-unneeded-time=" + data.values.AUTOSCALER_SCALE_DOWN_UNNEEDED_TIME) -#@ args.append("--max-node-provision-time=" + data.values.AUTOSCALER_MAX_NODE_PROVISION_TIME) -#@ args.append("--max-nodes-total=" + "{}".format(data.values.AUTOSCALER_MAX_NODES_TOTAL)) -#@ return args -#@ end - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: #@ "{}-cluster-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - app: #@ "{}-cluster-autoscaler".format(data.values.CLUSTER_NAME) -spec: - selector: - matchLabels: - app: #@ "{}-cluster-autoscaler".format(data.values.CLUSTER_NAME) - replicas: 1 - template: - metadata: - labels: - app: #@ "{}-cluster-autoscaler".format(data.values.CLUSTER_NAME) - spec: - containers: - - image: #@ data.values.autoscaler_image - name: #@ "{}-cluster-autoscaler".format(data.values.CLUSTER_NAME) - volumeMounts: - - name: #@ autoscaler_volume_name() - mountPath: #@ autoscaler_kubeconfig_mount_path() - readOnly: true - command: - - /cluster-autoscaler - args: #@ autoscaler_args() - volumes: - - name: #@ autoscaler_volume_name() - secret: - secretName: #@ "{}-kubeconfig".format(data.values.CLUSTER_NAME) - serviceAccountName: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: #@ "{}-autoscaler-workload".format(data.values.CLUSTER_NAME) -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-autoscaler-workload -subjects: - - kind: ServiceAccount - name: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: #@ "{}-autoscaler-management".format(data.values.CLUSTER_NAME) -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-autoscaler-management -subjects: - - kind: ServiceAccount - name: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE ---- -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: cluster-autoscaler-workload -rules: - - apiGroups: - - "" - resources: - - persistentvolumeclaims - - persistentvolumes - - pods - - replicationcontrollers - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - nodes - verbs: - - get - - list - - update - - watch - - apiGroups: - - "" - resources: - - pods/eviction - verbs: - - create - - apiGroups: - - policy - resources: - - poddisruptionbudgets - verbs: - - list - - watch - - apiGroups: - - storage.k8s.io - resources: - - csinodes - - storageclasses - verbs: - - get - - list - - watch - - apiGroups: - - batch - resources: - - jobs - verbs: - - list - - watch - - apiGroups: - - apps - resources: - - daemonsets - - replicasets - - statefulsets - verbs: - - list - - watch - - apiGroups: - - "" - resources: - - events - verbs: - - create - - patch - - apiGroups: - - "" - resources: - - configmaps - verbs: - - create - - delete - - get - - update - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create - - get - - update ---- -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: cluster-autoscaler-management -rules: - - apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - - machines - - machinesets - verbs: - - get - - list - - update - - watch - - patch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments/scale - - machinesets/scale - verbs: - - get - - update - diff --git a/packages/tkg-autoscaler/bundle/config/values.yaml b/packages/tkg-autoscaler/bundle/config/values.yaml deleted file mode 100644 index 7c342048ae..0000000000 --- a/packages/tkg-autoscaler/bundle/config/values.yaml +++ /dev/null @@ -1,17 +0,0 @@ -#@data/values - -#@overlay/match-child-defaults missing_ok=True ---- - -#! User configurable values for tkg-autoscaler - -CLUSTER_NAME: "" -NAMESPACE: -AUTOSCALER_MAX_NODES_TOTAL: "0" -AUTOSCALER_SCALE_DOWN_DELAY_AFTER_ADD: "10m" -AUTOSCALER_SCALE_DOWN_DELAY_AFTER_DELETE: "10s" -AUTOSCALER_SCALE_DOWN_DELAY_AFTER_FAILURE: "3m" -AUTOSCALER_SCALE_DOWN_UNNEEDED_TIME: "10m" -AUTOSCALER_MAX_NODE_PROVISION_TIME: "15m" -TKG_CLUSTER_ROLE: -PROVIDER_TYPE: diff --git a/packages/tkg-autoscaler/metadata.yaml b/packages/tkg-autoscaler/metadata.yaml deleted file mode 100644 index 191f3fdbdd..0000000000 --- a/packages/tkg-autoscaler/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkg-autoscaler.tanzu.vmware.com - namespace: default -spec: - displayName: "tkg-autoscaler" - longDescription: "Autoscaler package for tkg clusters" - shortDescription: "Defines the autoscaler resources for Tanzu" - providerName: VMware - maintainers: - - name: "Sudarshan Aji" - categories: - - "clusterclass" diff --git a/packages/tkg-autoscaler/package.yaml b/packages/tkg-autoscaler/package.yaml deleted file mode 100644 index d7d41943b3..0000000000 --- a/packages/tkg-autoscaler/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkg-autoscaler.tanzu.vmware.com - namespace: default -spec: - refName: tkg-autoscaler.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkg-autoscaler/values.template.yaml b/packages/tkg-autoscaler/values.template.yaml deleted file mode 100644 index 52a48916c2..0000000000 --- a/packages/tkg-autoscaler/values.template.yaml +++ /dev/null @@ -1,5 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True - ---- -autoscaler_image: IMAGE diff --git a/packages/tkg-autoscaler/vendir.lock.yml b/packages/tkg-autoscaler/vendir.lock.yml deleted file mode 100644 index 96a4894c49..0000000000 --- a/packages/tkg-autoscaler/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/tkg-autoscaler/vendir.yml b/packages/tkg-autoscaler/vendir.yml deleted file mode 100644 index 963f250148..0000000000 --- a/packages/tkg-autoscaler/vendir.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 diff --git a/packages/tkg-clusterclass-aws/Makefile b/packages/tkg-clusterclass-aws/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/tkg-clusterclass-aws/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkg-clusterclass-aws/README.md b/packages/tkg-clusterclass-aws/README.md deleted file mode 100644 index 3da2c4e7f3..0000000000 --- a/packages/tkg-clusterclass-aws/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# tkg-clusterclass-aws Package - -This package provides << awesome functionality >> using [tkg-clusterclass-aws](https://INFO_NEEDED). - -## Components - -## Configuration - -The following configuration values can be set to customize the tkg-clusterclass-aws installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -### tkg-clusterclass-aws Configuration - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -## Usage Example - -The following is a basic guide for getting started with tkg-clusterclass-aws. diff --git a/packages/tkg-clusterclass-aws/bundle/config/upstream/base.yaml b/packages/tkg-clusterclass-aws/bundle/config/upstream/base.yaml deleted file mode 100644 index 8c779c88f5..0000000000 --- a/packages/tkg-clusterclass-aws/bundle/config/upstream/base.yaml +++ /dev/null @@ -1,1516 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - name: #@ "tkg-aws-default-{}".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - annotations: - run.tanzu.vmware.com/resolve-tkr: "" -spec: - controlPlane: - ref: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - name: #@ "tkg-aws-default-{}-kcp".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - machineInfrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - name: #@ "tkg-aws-default-{}-control-plane".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - workers: - machineDeployments: - - class: tkg-worker - template: - bootstrap: - ref: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: #@ "tkg-aws-default-{}-md-config".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - name: #@ "tkg-aws-default-{}-worker".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - name: #@ "tkg-aws-default-{}-cluster".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - variables: - - name: etcdExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: apiServerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeSchedulerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeControllerManagerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: controlPlaneKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: workerKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: tlsCipherSuites - required: false - schema: - openAPIV3Schema: - type: string - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - - name: region - required: true - schema: - openAPIV3Schema: - type: string - #@ if data.values.AWS_REGION: - default: #@ data.values.AWS_REGION - #@ end - - name: sshKeyName - required: true - schema: - openAPIV3Schema: - type: string - #@ if data.values.AWS_SSH_KEY_NAME: - default: #@ data.values.AWS_SSH_KEY_NAME - #@ end - - name: identityRef - required: true - schema: - openAPIV3Schema: - type: object - properties: - kind: - type: string - default: AWSClusterRoleIdentity - name: - type: string - #! required: - #! - name - - name: bastion - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - required: - - enabled - default: - enabled: #@ data.values.BASTION_HOST_ENABLED - - name: loadBalancerSchemeInternal - required: false - schema: - openAPIV3Schema: - type: boolean - default: false - - name: cni - required: true - schema: - openAPIV3Schema: - type: string - #@ if data.values.CNI: - default: #@ data.values.CNI - #@ else: - default: "" - #@ end - - name: network - required: true - schema: - openAPIV3Schema: - type: object - properties: - vpc: - type: object - properties: - existingID: - type: string - cidr: - type: string - default: 10.0.0.0/16 - format: cidr - subnets: - type: array - items: - type: object - properties: - az: - type: string - private: &subnet - type: object - properties: - id: - type: string - cidr: - type: string - format: cidr - public: *subnet - securityGroupOverrides: - type: object - properties: - bastion: - type: string - apiServerLB: - type: string - lb: - type: string - controlplane: - type: string - node: - type: string - required: - - vpc - - subnets - - name: proxy - required: false - schema: - openAPIV3Schema: - type: object - properties: - httpProxy: - type: string - httpsProxy: - type: string - noProxy: - type: array - items: - type: string - default: [] - required: - - httpProxy - - httpsProxy - - name: controlPlane - required: true - schema: - openAPIV3Schema: - type: object - properties: - instanceType: - type: string - default: t3.large - rootVolume: - type: object - properties: - sizeGiB: - type: integer - #@ if data.values.AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB: - default: #@ data.values.AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB - #@ else: - default: 80 - #@ end - nodeLabels: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: worker - required: true - schema: - openAPIV3Schema: - type: object - properties: - instanceType: - type: string - default: m5.large - rootVolume: - type: object - properties: - sizeGiB: - type: integer - #@ if data.values.AWS_NODE_OS_DISK_SIZE_GIB: - default: #@ data.values.AWS_NODE_OS_DISK_SIZE_GIB - #@ else: - default: 80 - #@ end - - name: imageRepository - required: false - schema: - openAPIV3Schema: - type: object - properties: - host: - type: string - tlsCertificateValidation: - type: boolean - default: true - - name: trust - required: false - schema: - openAPIV3Schema: - type: object - properties: - additionalTrustedCAs: - type: array - items: - type: object - properties: - name: - type: string - data: - type: string - required: - - name - - data - - name: additionalImageRegistries - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - required: - - host - properties: - host: - type: string - skipTlsVerify: - type: boolean - default: false - caCert: - type: string - - name: auditLogging - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: false - required: - - enabled - default: - enabled: false - - name: nodePoolLabels - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: TKR_DATA - required: false - schema: - openAPIV3Schema: - type: object - properties: {} - - name: controlPlaneCertificateRotation - required: false - schema: - openAPIV3Schema: - type: object - properties: - activate: - type: boolean - default: true - daysBefore: - type: integer - format: int32 - minimum: 7 - default: 90 - default: - activate: true - daysBefore: 90 - patches: - - name: etcdExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .etcdExtraArgs }} - {{- if eq $key "cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: apiServerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: aws - {{- end }} - - name: kubeSchedulerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/scheduler/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .kubeSchedulerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: kubeControllerManagerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .kubeControllerManagerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: aws - {{- end }} - - name: controlPlaneKubeletExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: aws - {{- end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: aws - {{- end }} - - name: workerKubeletExtraArgs - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - "tkg-worker" - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .workerKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: aws - {{- end }} - - name: AWSCT_main - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: replace - path: /spec/template/spec/region - valueFrom: - variable: region - - op: replace - path: /spec/template/spec/sshKeyName - valueFrom: - variable: sshKeyName - - op: replace - path: /spec/template/spec/bastion/enabled - valueFrom: - variable: bastion.enabled - - op: add - path: /spec/template/spec/network/vpc/cidrBlock - valueFrom: - variable: network.vpc.cidr - - op: replace - path: /spec/template/spec/network/subnets - valueFrom: - template: | - {{ $suffix := list "a" "b" "c" }} - {{- range $i, $subnet := .network.subnets }} - - availabilityZone: {{ if $subnet.az }} {{- $subnet.az }} {{- else if $.region }} {{- $.region }} {{- index $suffix $i }} {{- end }} - cidrBlock: {{ $subnet.private.cidr | default "\"\"" }} - id: {{ $subnet.private.id | default "\"\"" }} - {{- if or (empty $.network.vpc.existingID) (not (empty $subnet.public)) }} - - availabilityZone: {{ if $subnet.az }} {{- $subnet.az }} {{- else if $.region }} {{- $.region }} {{- index $suffix $i }} {{- end }} - cidrBlock: {{ $subnet.public.cidr | default "\"\"" }} - isPublic: true - id: {{ $subnet.public.id | default "\"\"" }} - {{- end }} - {{- end }} - - - name: AWSCT_CNIIngressRules_Calico - enabledIf: '{{ .cni | eq "calico" }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/network/cni/cniIngressRules/- - value: - description: bgp (calico) - fromPort: 179 - protocol: tcp - toPort: 179 - - op: add - path: /spec/template/spec/network/cni/cniIngressRules/- - value: - description: IP-in-IP (calico) - fromPort: -1 - protocol: "4" - toPort: 65535 - - name: AWSCT_CNIIngressRules_Antrea - enabledIf: '{{ .cni | eq "antrea" }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/network/cni/cniIngressRules/- - value: - description: antrea1 - fromPort: 10349 - protocol: tcp - toPort: 10349 - - op: add - path: /spec/template/spec/network/cni/cniIngressRules/- - value: - description: genev - fromPort: 6081 - protocol: udp - toPort: 6081 - - - name: AWSCT_VPC_ID - enabledIf: '{{ not (empty .network.vpc.existingID) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/network/vpc/id - valueFrom: - variable: network.vpc.existingID - - - name: AWSCT_IdentityRef - enabledIf: '{{ not (empty .identityRef.name) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/identityRef - valueFrom: - template: | - kind: {{ if .identityRef.kind }} {{- .identityRef.kind }} {{- else -}} AWSClusterRoleIdentity {{- end }} - name: {{ .identityRef.name }} - - - name: AWSCT_ControlPlaneLoadBalancerScheme - enabledIf: '{{ .loadBalancerSchemeInternal }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/controlPlaneLoadBalancer - valueFrom: - template: | - scheme: internal - - - name: AWSCT_SecurityGroupOverrides - enabledIf: '{{ any .network.securityGroupOverrides.bastion .network.securityGroupOverrides.controlPlane .network.securityGroupOverrides.apiServerLB .network.securityGroupOverrides.node .network.securityGroupOverrides.lb }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/network/securityGroupOverrides - valueFrom: - template: | - {{ if .network.securityGroupOverrides.bastion }} bastion: {{ .network.securityGroupOverrides.bastion }} {{- end }} - {{ if .network.securityGroupOverrides.controlPlane }} controlplane: {{ .network.securityGroupOverrides.controlPlane }} {{- end }} - {{ if .network.securityGroupOverrides.apiServerLB }} apiserver-lb: {{ .network.securityGroupOverrides.apiServerLB }} {{- end }} - {{ if .network.securityGroupOverrides.node }} node: {{ .network.securityGroupOverrides.node }} {{- end }} - {{ if .network.securityGroupOverrides.lb }} lb: {{ .network.securityGroupOverrides.lb }} {{- end }} - - - name: AWS_KCPT - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.etcd.imageTag }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.coredns.imageTag }}' - - - name: AWS_MT_controlplane - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/instanceType - valueFrom: - variable: controlPlane.instanceType - - op: replace - path: /spec/template/spec/sshKeyName - valueFrom: - variable: sshKeyName - - op: replace - path: /spec/template/spec/rootVolume/size - valueFrom: - variable: controlPlane.rootVolume.sizeGiB - - op: replace - path: /spec/template/spec/ami/id - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).osImageRef.id }}' - - name: AWS_MT_worker - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - matchResources: - machineDeploymentClass: - names: - - "tkg-worker" - jsonPatches: - - op: replace - path: /spec/template/spec/instanceType - valueFrom: - variable: worker.instanceType - - op: replace - path: /spec/template/spec/sshKeyName - valueFrom: - variable: sshKeyName - - op: replace - path: /spec/template/spec/rootVolume/size - valueFrom: - variable: worker.rootVolume.sizeGiB - - op: replace - path: /spec/template/spec/ami/id - valueFrom: - template: '{{ (index .TKR_DATA .builtin.machineDeployment.version).osImageRef.id }}' - - - name: nodeLabels - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key }}={{ $val }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key }}={{ $val }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - "tkg-worker" - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.machineDeployment.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end}} - {{- if .nodePoolLabels -}} - , - {{- $first := true }} - {{- range .nodePoolLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - name: httpProxy - enabledIf: '{{ not (empty .proxy) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &containerdProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list .network.vpc.cidr "169.254.0.0/16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /etc/systemd/system/containerd.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &kubeletProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list .network.vpc.cidr "169.254.0.0/16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /usr/lib/systemd/system/kubelet.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPProxy | - export HTTP_PROXY= {{- .proxy.httpProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPSProxy | - export HTTPS_PROXY= {{- .proxy.httpsProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportNoProxy | - export NO_PROXY= {{- list .network.vpc.cidr "169.254.0.0/16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *containerdProxyConf - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *kubeletProxyConf - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPSProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportNoProxy - - name: httpProxyCACert - enabledIf: '{{ $hasProxyCert := false }} {{- range .trust.additionalTrustedCAs }} {{- if .name | eq "proxy" }} {{- $hasProxyCert = true }} {{- end }} {{- end }} {{- $hasProxyCert }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - name: customizedImageRepo - enabledIf: '{{ not (empty .imageRepository.host) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - name: registryCACert - enabledIf: '{{ not (empty .trust.additionalTrustedCAs) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/containerd/ {{- index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} .crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/containerd/{{ index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }}.crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - name: additionalRegistryCACerts - enabledIf: '{{ not (empty .additionalImageRegistries) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &insertCAScript | - path: /tmp/insert_registry_ca_certs.sh - content: | - #!/bin/bash - set -e - {{- range .additionalImageRegistries }} - {{- if eq .skipTlsVerify false }} - echo '{{ .caCert }}' | base64 -d > /etc/containerd/{{ .host }}.crt - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo ' ca_file = "/etc/containerd/{{ .host }}.crt"' >> /etc/containerd/config.toml - {{- else }} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo " insecure_skip_verify = true" >> /etc/containerd/config.toml - {{- end }} - {{- end }} - permissions: "0755" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *insertCAScript - - name: auditLogging - enabledIf: '{{ .auditLogging.enabled }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-path - value: /var/log/kubernetes/audit.log - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-policy-file - value: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxage - value: "30" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxbackup - value: "10" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxsize - value: "100" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-policy - hostPath: /etc/kubernetes/audit-policy.yaml - mountPath: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-logs - hostPath: /var/log/kubernetes - mountPath: /var/log/kubernetes - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - value: - path: /etc/kubernetes/audit-policy.yaml - owner: "root:root" - permissions: "0600" - content: | - --- - apiVersion: audit.k8s.io/v1 - kind: Policy - rules: - #! The following requests were manually identified as high-volume and low-risk, - #! so drop them. - - level: None - users: ["system:serviceaccount:kube-system:kube-proxy"] - verbs: ["watch"] - resources: - - group: "" #! core - resources: ["endpoints", "services", "services/status"] - - level: None - userGroups: ["system:nodes"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["nodes", "nodes/status"] - - level: None - users: - - system:kube-controller-manager - - system:kube-scheduler - - system:serviceaccount:kube-system:endpoint-controller - verbs: ["get", "update"] - namespaces: ["kube-system"] - resources: - - group: "" #! core - resources: ["endpoints"] - - level: None - users: ["system:apiserver"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["namespaces", "namespaces/status", "namespaces/finalize"] - #! Don't log HPA fetching metrics. - - level: None - users: - - system:kube-controller-manager - verbs: ["get", "list"] - resources: - - group: "metrics.k8s.io" - #! Don't log these read-only URLs. - - level: None - nonResourceURLs: - - /healthz* - - /version - - /swagger* - #! Don't log events requests. - - level: None - resources: - - group: "" #! core - resources: ["events"] - #! Don't log TMC service account performing read operations because they are high-volume. - - level: None - userGroups: ["system:serviceaccounts:vmware-system-tmc"] - verbs: ["get", "list", "watch"] - #! Don't log read requests from garbage collector because they are high-volume. - - level: None - users: ["system:serviceaccount:kube-system:generic-garbage-collector"] - verbs: ["get", "list", "watch"] - #! node and pod status calls from nodes are high-volume and can be large, don't log responses for expected updates from nodes - - level: Request - userGroups: ["system:nodes"] - verbs: ["update","patch"] - resources: - - group: "" #! core - resources: ["nodes/status", "pods/status"] - omitStages: - - "RequestReceived" - #! deletecollection calls can be large, don't log responses for expected namespace deletions - - level: Request - users: ["system:serviceaccount:kube-system:namespace-controller"] - verbs: ["deletecollection"] - omitStages: - - "RequestReceived" - #! Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data, - #! so only log at the Metadata level. - - level: Metadata - resources: - - group: "" #! core - resources: ["secrets", "configmaps"] - - group: authentication.k8s.io - resources: ["tokenreviews"] - omitStages: - - "RequestReceived" - #! Get repsonses can be large; skip them. - - level: Request - verbs: ["get", "list", "watch"] - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for known APIs - - level: RequestResponse - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for all other requests. - - level: Metadata - omitStages: - - "RequestReceived" - - name: kcptCertificateRotation - enabledIf: '{{ .controlPlaneCertificateRotation.activate }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/rolloutBefore - valueFrom: - template: | - certificatesExpiryDays: {{ .controlPlaneCertificateRotation.daysBefore }} ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSClusterTemplate -metadata: - name: #@ "tkg-aws-default-{}-cluster".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - region: #@ data.values.AWS_REGION - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - bastion: - enabled: true - network: - vpc: - cidrBlock: - subnets: - - availabilityZone: #@ data.values.AWS_NODE_AZ - cidrBlock: #@ data.values.AWS_PRIVATE_NODE_CIDR - id: #@ data.values.AWS_PRIVATE_SUBNET_ID - cni: - cniIngressRules: - - description: kapp-controller - fromPort: 10100 - protocol: tcp - toPort: 10100 - - description: addons-manager - fromPort: 9865 - protocol: tcp - toPort: 9865 ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlaneTemplate -metadata: - name: #@ "tkg-aws-default-{}-kcp".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - kubeadmConfigSpec: - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - preKubeadmCommands: - #! Ensure a non-empty preKubeadmCommands array is present to facilitate patching - - echo "running preKubeadmCommands..." - useExperimentalRetryJoin: true - clusterConfiguration: - apiServer: - timeoutForControlPlane: "8m0s" - extraVolumes: [] - extraArgs: {} - controllerManager: - extraArgs: {} - dns: - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - extraArgs: {} - imageRepository: dummy.registry.vmware.com - scheduler: - extraArgs: {} - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: {} - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: {} ---- -kind: AWSMachineTemplate -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -metadata: - name: #@ "tkg-aws-default-{}-control-plane".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - instanceType: #@ data.values.CONTROL_PLANE_MACHINE_TYPE - iamInstanceProfile: "control-plane.tkg.cloud.vmware.com" - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - ami: - id: #@ data.values.AWS_AMI_ID - rootVolume: - size: 80 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSMachineTemplate -metadata: - name: #@ "tkg-aws-default-{}-worker".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - instanceType: #@ data.values.NODE_MACHINE_TYPE - iamInstanceProfile: "nodes.tkg.cloud.vmware.com" - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - ami: - id: #@ data.values.AWS_AMI_ID - rootVolume: - size: 80 ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "tkg-aws-default-{}-md-config".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - useExperimentalRetryJoin: true - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: {} - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - preKubeadmCommands: - #! Ensure a non-empty preKubeadmCommands array is present to facilitate patching - - echo "running preKubeadmCommands..." diff --git a/packages/tkg-clusterclass-aws/bundle/config/upstream/overlay-kube-apiserver-admission.yaml b/packages/tkg-clusterclass-aws/bundle/config/upstream/overlay-kube-apiserver-admission.yaml deleted file mode 100644 index f5f7a77dcb..0000000000 --- a/packages/tkg-clusterclass-aws/bundle/config/upstream/overlay-kube-apiserver-admission.yaml +++ /dev/null @@ -1,192 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/append - - name: eventRateLimitConf - required: false - schema: - openAPIV3Schema: - type: string - default: "" - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/admission-control-config.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: admin-control-conf - hostPath: /etc/kubernetes/admission-control-config.yaml - mountPath: /etc/kubernetes/admission-control-config.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/admission-control-config.yaml - content: |- - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - {{- if and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }} - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - {{- end }} - {{- if .eventRateLimitConf }} - - name: EventRateLimit - path: eventConfig.yaml - {{- end }} - enabledIf: '{{ or (and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version)) (.eventRateLimitConf) }}' - #@overlay/append - - name: eventRateLimitConf - description: "Adds an admission configuration for EventRateLimit." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/enable-admission-plugins" - valueFrom: - template: | - {{ $containEnableAdmissionPlugin := false }} - {{- $admissionPlugins := "" }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "enable-admission-plugins" }} - {{- $containEnableAdmissionPlugin = true }} - {{- $admissionPlugins = $val }} - {{- end }} - {{- end }} - {{- if not $containEnableAdmissionPlugin }} - NodeRestriction,EventRateLimit - {{- else -}} - {{- $admissionPlugins -}},EventRateLimit - {{- end }} - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: event-conf - hostPath: /etc/kubernetes/eventConfig.yaml - mountPath: /etc/kubernetes/eventConfig.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/eventConfig.yaml - encoding: base64 - content: {{ .eventRateLimitConf}} - enabledIf: '{{ not (empty .eventRateLimitConf) }}' diff --git a/packages/tkg-clusterclass-aws/bundle/config/upstream/overlay.yaml b/packages/tkg-clusterclass-aws/bundle/config/upstream/overlay.yaml deleted file mode 100644 index f7c984209a..0000000000 --- a/packages/tkg-clusterclass-aws/bundle/config/upstream/overlay.yaml +++ /dev/null @@ -1,77 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - controlPlane: - #@overlay/match missing_ok=True - machineHealthCheck: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_CONTROL_PLANE: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_CONTROL_PLANE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - workers: - machineDeployments: - #@overlay/match by=overlay.index(0) - - class: tkg-worker - #@overlay/match missing_ok=True - machineHealthCheck: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - patches: - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: KCP_INIT_APISERVER_EMPTY_EXTRAVOLUMES_ARRAY - #@overlay/append - - name: restartContainerdService - enabledIf: '{{ not (and (empty .proxy) (empty .trust.additionalTrustedCAs) (empty .imageRepository.host) (empty .additionalImageRegistries)) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl restart containerd - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl restart containerd diff --git a/packages/tkg-clusterclass-aws/bundle/config/values.yaml b/packages/tkg-clusterclass-aws/bundle/config/values.yaml deleted file mode 100644 index 563ce5806d..0000000000 --- a/packages/tkg-clusterclass-aws/bundle/config/values.yaml +++ /dev/null @@ -1,31 +0,0 @@ -#@data/values - -#@overlay/match-child-defaults missing_ok=True ---- - -#! User configurable values for tkg-clusterclass-aws - -#! TODO(vui) cleanup default values - -ENABLE_MHC: true -ENABLE_MHC_WORKER_NODE: true -ENABLE_MHC_CONTROL_PLANE: true -MHC_MAX_UNHEALTHY_CONTROL_PLANE: 100% -MHC_MAX_UNHEALTHY_WORKER_NODE: 100% -MHC_UNKNOWN_STATUS_TIMEOUT: 5m -MHC_FALSE_STATUS_TIMEOUT: 12m -NODE_STARTUP_TIMEOUT: 20m -AWS_SSH_KEY_NAME: "" -AWS_REGION: "us-west-2" -BASTION_HOST_ENABLED: true -CONTROL_PLANE_MACHINE_TYPE: "t3.large" -NODE_MACHINE_TYPE: m5.large -AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB: 80 -AWS_NODE_OS_DISK_SIZE_GIB: 80 -NAMESPACE: tkg-system -CNI: antrea -AWS_CLUSTER_CLASS_VERSION: v1.0.0 -AWS_NODE_AZ: "" -AWS_PRIVATE_NODE_CIDR: "" -AWS_PRIVATE_SUBNET_ID: "" -AWS_AMI_ID: "" diff --git a/packages/tkg-clusterclass-aws/metadata.yaml b/packages/tkg-clusterclass-aws/metadata.yaml deleted file mode 100644 index e624d415f6..0000000000 --- a/packages/tkg-clusterclass-aws/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkg-clusterclass-aws.tanzu.vmware.com - namespace: tkg-clusterclass-aws -spec: - displayName: "tkg-clusterclass-aws" - longDescription: "ClusterClass for AWS defines the default set of AWS ClusterClass resources for Tanzu" - shortDescription: "Defines the AWS ClusterClass resources for Tanzu" - providerName: VMware - maintainers: - - name: "" - categories: - - "clusterclass" diff --git a/packages/tkg-clusterclass-aws/package.yaml b/packages/tkg-clusterclass-aws/package.yaml deleted file mode 100644 index 59d8c979ce..0000000000 --- a/packages/tkg-clusterclass-aws/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkg-clusterclass-aws.tanzu.vmware.com - namespace: tkg-clusterclass-aws -spec: - refName: tkg-clusterclass-aws.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkg-clusterclass-aws/vendir.lock.yml b/packages/tkg-clusterclass-aws/vendir.lock.yml deleted file mode 100644 index 96a4894c49..0000000000 --- a/packages/tkg-clusterclass-aws/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/tkg-clusterclass-aws/vendir.yml b/packages/tkg-clusterclass-aws/vendir.yml deleted file mode 100644 index 963f250148..0000000000 --- a/packages/tkg-clusterclass-aws/vendir.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 diff --git a/packages/tkg-clusterclass-azure/Makefile b/packages/tkg-clusterclass-azure/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/tkg-clusterclass-azure/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkg-clusterclass-azure/README.md b/packages/tkg-clusterclass-azure/README.md deleted file mode 100644 index ff30757bde..0000000000 --- a/packages/tkg-clusterclass-azure/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# tkg-clusterclass-azure Package - -This package provides << awesome functionality >> using [tkg-clusterclass-azure](https://INFO_NEEDED). - -## Components - -## Configuration - -The following configuration values can be set to customize the tkg-clusterclass-azure installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -### tkg-clusterclass-azure Configuration - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -## Usage Example - -The following is a basic guide for getting started with tkg-clusterclass-azure. diff --git a/packages/tkg-clusterclass-azure/bundle/config/upstream/base.yaml b/packages/tkg-clusterclass-azure/bundle/config/upstream/base.yaml deleted file mode 100644 index e48986dc4a..0000000000 --- a/packages/tkg-clusterclass-azure/bundle/config/upstream/base.yaml +++ /dev/null @@ -1,1887 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - name: #@ "tkg-azure-default-{}".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - annotations: - run.tanzu.vmware.com/resolve-tkr: "" -spec: - controlPlane: - ref: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - name: #@ "tkg-azure-default-{}-kcp".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - machineInfrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - name: #@ "tkg-azure-default-{}-control-plane".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - workers: - machineDeployments: - - class: tkg-worker - template: - bootstrap: - ref: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: #@ "tkg-azure-default-{}-md-config".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - name: #@ "tkg-azure-default-{}-worker".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - name: #@ "tkg-azure-default-{}-cluster".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - variables: - - name: etcdExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: apiServerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeSchedulerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeControllerManagerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: controlPlaneKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: workerKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: tlsCipherSuites - required: false - schema: - openAPIV3Schema: - type: string - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - - name: location - required: true - schema: - openAPIV3Schema: - type: string - - name: resourceGroup - required: false - schema: - openAPIV3Schema: - type: string - - name: subscriptionID - required: true - schema: - openAPIV3Schema: - type: string - - name: identityRef - required: false - schema: - openAPIV3Schema: - type: object - properties: - name: - type: string - default: '' - namespace: - type: string - default: default - default: - namespace: default - - name: environment - required: false - schema: - openAPIV3Schema: - type: string - default: AzurePublicCloud - - name: sshPublicKey - required: true - schema: - openAPIV3Schema: - type: string - format: base64 - - name: acceleratedNetworking - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: true - required: - - enabled - default: - enabled: true - - name: privateCluster - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: false - required: - - enabled - default: - enabled: false - - name: frontendPrivateIP - required: false - schema: - openAPIV3Schema: - type: string - default: 10.0.0.10 - - name: apiServerPort - required: false - schema: - openAPIV3Schema: - type: integer - - name: network - required: true - schema: - openAPIV3Schema: - type: object - properties: - vnet: - type: object - properties: - name: - type: string - cidrBlocks: - type: array - items: - type: string - format: cidr - resourceGroup: - type: string - required: - - cidrBlocks - required: - - vnet - - name: proxy - required: false - schema: - openAPIV3Schema: - type: object - properties: - httpProxy: - type: string - httpsProxy: - type: string - noProxy: - type: array - items: - type: string - default: [] - required: - - httpProxy - - httpsProxy - - name: clusterRole - required: true - schema: - openAPIV3Schema: - type: string - - name: controlPlane - required: false - schema: - openAPIV3Schema: - type: object - properties: - vmSize: - type: string - default: Standard_D2s_v3 - osDisk: - type: object - properties: - storageAccountType: - type: string - default: Premium_LRS - sizeGiB: - type: integer - default: 128 - dataDisk: - type: object - properties: - sizeGiB: - type: integer - default: 256 - subnet: - type: object - properties: - name: - type: string - cidr: - type: string - default: 10.0.0.0/24 - securityGroup: - type: string - outboundLB: - type: object - properties: - enabled: - type: boolean - default: false - frontendIPCount: - type: integer - default: 1 - nodeLabels: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: worker - required: false - schema: - openAPIV3Schema: - type: object - properties: - vmSize: - type: string - default: Standard_D2s_v3 - osDisk: - type: object - properties: - storageAccountType: - type: string - default: Premium_LRS - sizeGiB: - type: integer - default: 128 - dataDisks: - type: array - items: - type: object - properties: - sizeGiB: - type: integer - default: 256 - default: [] - subnet: - type: object - properties: - name: - type: string - cidr: - type: string - format: cidr - default: 10.0.1.0/24 - securityGroup: - type: string - outboundLB: - type: object - properties: - enabled: - type: boolean - default: false - frontendIPCount: - type: integer - default: 1 - idleTimeoutInMinutes: - type: integer - default: 4 - - name: imageRepository - required: false - schema: - openAPIV3Schema: - type: object - properties: - host: - type: string - tlsCertificateValidation: - type: boolean - default: true - - name: trust - required: false - schema: - openAPIV3Schema: - type: object - properties: - additionalTrustedCAs: - type: array - items: - type: object - properties: - name: - type: string - data: - type: string - required: - - name - - data - - name: additionalImageRegistries - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - required: - - host - properties: - host: - type: string - skipTlsVerify: - type: boolean - default: false - caCert: - type: string - - name: auditLogging - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: false - required: - - enabled - default: - enabled: false - - name: customTags - required: false - schema: - openAPIV3Schema: - type: string - default: "" - - name: nodePoolLabels - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: TKR_DATA - required: false - schema: - openAPIV3Schema: - type: object - properties: {} - - name: controlPlaneCertificateRotation - required: false - schema: - openAPIV3Schema: - type: object - properties: - activate: - type: boolean - default: true - daysBefore: - type: integer - format: int32 - minimum: 7 - default: 90 - default: - activate: true - daysBefore: 90 - patches: - - name: etcdExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containQuotaBackendBytes := false }} - {{- range $key, $val := .etcdExtraArgs }} - {{- if eq $key "cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "quota-backend-bytes" }} - {{- $containQuotaBackendBytes = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containQuotaBackendBytes }} - quota-backend-bytes: "8589934592" - {{- end }} - - name: kubeControllerManagerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containAllocateNodeCidrs := false }} - {{ $containCloudConfig := false }} - {{ $containCloudProvider := false }} - {{ $containClusterName := false }} - {{- range $key, $val := .kubeControllerManagerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "allocate-node-cidrs" }} - {{- $containAllocateNodeCidrs = true }} - {{- end }} - {{- if eq $key "cloud-config" }} - {{- $containCloudConfig = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "cluster-name" }} - {{- $containClusterName = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containAllocateNodeCidrs }} - allocate-node-cidrs: "true" - {{- end }} - {{- if not $containCloudConfig }} - cloud-config: /etc/kubernetes/azure.json - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: azure - {{- end }} - {{- if not $containClusterName }} - cluster-name: ${CLUSTER_NAME} - {{- end }} - - name: apiServerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudConfig := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-config" }} - {{- $containCloudConfig = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudConfig }} - cloud-config: /etc/kubernetes/azure.json - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: azure - {{- end }} - - name: kubeSchedulerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/scheduler/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .kubeSchedulerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: controlPlaneKubeletExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudConfig := false }} - {{ $containCloudProvider := false }} - {{ $containContainerRegistConf := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-config" }} - {{- $containCloudConfig = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "azure-container-registry-config" }} - {{- $containContainerRegistConf = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudConfig }} - cloud-config: /etc/kubernetes/azure.json - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: azure - {{- end }} - {{- if not $containContainerRegistConf }} - azure-container-registry-config: /etc/kubernetes/azure.json - {{- end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudConfig := false }} - {{ $containCloudProvider := false }} - {{ $containContainerRegistConf := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-config" }} - {{- $containCloudConfig = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "azure-container-registry-config" }} - {{- $containContainerRegistConf = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudConfig }} - cloud-config: /etc/kubernetes/azure.json - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: azure - {{- end }} - {{- if not $containContainerRegistConf }} - azure-container-registry-config: /etc/kubernetes/azure.json - {{- end }} - - name: workerKubeletExtraArgs - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudConfig := false }} - {{ $containCloudProvider := false }} - {{ $containContainerRegistConf := false }} - {{- range $key, $val := .workerKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-config" }} - {{- $containCloudConfig = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "azure-container-registry-config" }} - {{- $containContainerRegistConf = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudConfig }} - cloud-config: /etc/kubernetes/azure.json - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: azure - {{- end }} - {{- if not $containContainerRegistConf }} - azure-container-registry-config: /etc/kubernetes/azure.json - {{- end }} - - name: AzureClusterCustomTags - enabledIf: '{{ not (empty .customTags) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/additionalTags - valueFrom: - template: | - {{ $azureTags := split "," .customTags }} {{- range $azureTag := $azureTags }} {{- $azureTag = trim $azureTag}} {{- $azureTagSplit := split "=" $azureTag }} {{- $azureTagSplit._0 -}} : {{ $azureTagSplit._1 }} - {{ end }} - - name: AzureClusterIdentityRef - enabledIf: '{{ (not (empty .identityRef.name)) | or (.clusterRole | eq "management") }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/identityRef - valueFrom: - template: | - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterIdentity - name: {{.builtin.cluster.name}}-identity - namespace: tkg-system - - name: AzureClusterIdentityName - enabledIf: '{{ with .identityRef }} {{- all .name .namespace }} {{- else -}} false {{- end }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: replace - path: /spec/template/spec/identityRef/name - valueFrom: - variable: identityRef.name - - op: replace - path: /spec/template/spec/identityRef/namespace - valueFrom: - variable: identityRef.namespace - - name: ACT_main - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: replace - path: /spec/template/spec/azureEnvironment - valueFrom: - variable: environment - - op: replace - path: /spec/template/spec/location - valueFrom: - variable: location - - op: replace - path: /spec/template/spec/networkSpec/vnet - valueFrom: - template: | - name: {{ if .network.vnet.name }} {{- .network.vnet.name }} {{- else }} {{- .builtin.cluster.name -}} -vnet {{- end }} - resourceGroup: {{ if .network.vnet.resourceGroup }} {{- .network.vnet.resourceGroup }} {{- else if .resourceGroup }} {{- .resourceGroup }} {{- else }} {{- .builtin.cluster.name }} {{- end }} - cidrBlocks: - {{ range .network.vnet.cidrBlocks -}} - - {{ . }} - {{- end }} - - op: add - path: /spec/template/spec/resourceGroup - valueFrom: - template: | - {{ if .resourceGroup }} {{- .resourceGroup }} {{- else }} {{- .builtin.cluster.name }} {{- end }} - - op: replace - path: /spec/template/spec/subscriptionID - valueFrom: - variable: subscriptionID - - op: replace - path: /spec/template/spec/networkSpec/subnets - valueFrom: - template: | - - name: '{{ .controlPlane.subnet.name | default "management-cluster-controlplane-subnet" }}' - role: control-plane - cidrBlocks: [ {{- .controlPlane.subnet.cidr -}} ] - {{ if .controlPlane.subnet.securityGroup -}} securityGroup: {{ .controlPlane.subnet.securityGroup }} {{- end }} - - name: '{{ .worker.subnet.name | default "management-cluster-node-subnet" }}' - role: node - cidrBlocks: [ {{- .worker.subnet.cidr -}} ] - {{ if .worker.subnet.securityGroup -}} securityGroup: {{ .worker.subnet.securityGroup }} {{- end }} - - name: AMT_ControlPlane_Main - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/sshPublicKey - valueFrom: - variable: sshPublicKey - - op: replace - path: /spec/template/spec/vmSize - valueFrom: - variable: controlPlane.vmSize - - op: add - path: /spec/template/spec/acceleratedNetworking - valueFrom: - variable: acceleratedNetworking.enabled - - op: replace - path: /spec/template/spec/dataDisks - valueFrom: - template: | - {{ range .controlPlane.dataDisks }} - - diskSizeGB: {{ .sizeGiB }} - lun: 0 - nameSuffix: etcddisk - {{- end }} - - op: replace - path: /spec/template/spec/osDisk - valueFrom: - template: | - osType: Linux - diskSizeGB: {{ .controlPlane.osDisk.sizeGiB }} - managedDisk: - storageAccountType: {{ .controlPlane.osDisk.storageAccountType }} - - op: add - path: /spec/template/spec/image - valueFrom: - template: | - {{- $osImageRef := (index .TKR_DATA .builtin.controlPlane.version).osImageRef -}} - {{- if index $osImageRef "gallery" }} - sharedGallery: - resourceGroup: {{ index $osImageRef "resourceGroup" }} - name: {{ index $osImageRef "name" }} - subscriptionID: {{ index $osImageRef "subscriptionID" }} - gallery: {{ index $osImageRef "gallery" }} - version: {{ index $osImageRef "version" }} - {{- end }} - {{- if index $osImageRef "sku" }} - marketplace: - sku: {{ index $osImageRef "sku" }} - publisher: {{ index $osImageRef "publisher" }} - offer: {{ index $osImageRef "offer" }} - version: {{ index $osImageRef "version" }} - thirdPartyImage: {{ index $osImageRef "thirdPartyImage" }} - {{- end -}} - - name: KCPT_ControlPlane_Main - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - contentFrom: - secret: - key: control-plane-azure.json - name: {{ .builtin.controlPlane.machineTemplate.infrastructureRef.name -}} -azure-json - owner: root:root - path: /etc/kubernetes/azure.json - permissions: "0644" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.etcd.imageTag }}' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.coredns.imageTag }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs/cluster-name - valueFrom: - template: '{{ .builtin.cluster.name }}' - - name: cloudConfigVolume - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: cloud-config - hostPath: /etc/kubernetes/azure.json - mountPath: /etc/kubernetes/azure.json - readOnly: true - - name: apiServerBindPort - enabledIf: '{{ not (empty .apiServerPort) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/localAPIEndpoint - valueFrom: - template: | - advertiseAddress: '0.0.0.0' - bindPort: {{ .apiServerPort }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/controlPlane - valueFrom: - template: | - localAPIEndpoint: - advertiseAddress: '0.0.0.0' - bindPort: {{ .apiServerPort }} - - name: AMT_MachineDeployment_Main - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: replace - path: "/spec/template/spec/sshPublicKey" - valueFrom: - variable: sshPublicKey - - op: replace - path: /spec/template/spec/vmSize - valueFrom: - variable: worker.vmSize - - op: add - path: /spec/template/spec/acceleratedNetworking - valueFrom: - variable: acceleratedNetworking.enabled - - op: replace - path: /spec/template/spec/osDisk - valueFrom: - template: | - osType: Linux - diskSizeGB: {{ .worker.osDisk.sizeGiB }} - managedDisk: - storageAccountType: {{ .worker.osDisk.storageAccountType }} - - op: add - path: /spec/template/spec/image - valueFrom: - template: | - {{- $osImageRef := (index .TKR_DATA .builtin.machineDeployment.version).osImageRef -}} - {{- if index $osImageRef "gallery" }} - sharedGallery: - resourceGroup: {{ index $osImageRef "resourceGroup" }} - name: {{ index $osImageRef "name" }} - subscriptionID: {{ index $osImageRef "subscriptionID" }} - gallery: {{ index $osImageRef "gallery" }} - version: {{ index $osImageRef "version" }} - {{- end }} - {{- if index $osImageRef "sku" }} - marketplace: - sku: {{ index $osImageRef "sku" }} - publisher: {{ index $osImageRef "publisher" }} - offer: {{ index $osImageRef "offer" }} - version: {{ index $osImageRef "version" }} - thirdPartyImage: {{ index $osImageRef "thirdPartyImage" }} - {{- end -}} - - name: KCT_Worker_Main - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - contentFrom: - secret: - key: worker-node-azure.json - name: {{ .builtin.machineDeployment.infrastructureRef.name -}} -azure-json - owner: root:root - path: /etc/kubernetes/azure.json - permissions: "0644" - - name: enableNodeDataDisk - enabledIf: '{{ gt (.worker.dataDisks | len) 0 }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: "/spec/template/spec/dataDisks" - valueFrom: - template: | - {{ range .worker.dataDisks -}} - - diskSizeGB: {{ .sizeGiB }} - lun: 0 - nameSuffix: nodedisk - {{- end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/diskSetup - valueFrom: - template: | - filesystems: - - device: /dev/disk/azure/scsi1/lun0 - extraOpts: - - -E - - lazy_itable_init=1,lazy_journal_init=1 - filesystem: ext4 - label: node_disk - partitions: - - device: /dev/disk/azure/scsi1/lun0 - layout: true - overwrite: false - tableType: gpt - - op: add - path: /spec/template/spec/mounts - valueFrom: - template: | - - - LABEL=node_disk - - /var/lib/nodedisk - - name: ACT_EnablePrivateCluster - enabledIf: '{{ .privateCluster.enabled }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/networkSpec/apiServerLB - valueFrom: - template: | - type: Internal - frontendIPs: - - name: lb- {{- .builtin.cluster.name -}} -ip-frontend - privateIP: {{ .frontendPrivateIP }} - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands - valueFrom: - template: | - - "if [ -f /tmp/kubeadm.yaml ] || [ -f /run/kubeadm/kubeadm.yaml ]; then echo '127.0.0.1 apiserver. {{- .builtin.cluster.name -}} .capz.io apiserver' >> /etc/hosts; fi" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/postKubeadmCommands - valueFrom: - template: | - - "if [ -f /tmp/kubeadm-join-config.yaml ] || [ -f /run/kubeadm/kubeadm-join-config.yaml ]; then echo '127.0.0.1 apiserver. {{- .builtin.cluster.name -}} .capz.io apiserver' >> /etc/hosts; fi" - - name: ACT_EnableControlPlaneOutboundLB - enabledIf: '{{ and .privateCluster.enabled .controlPlane.outboundLB.enabled }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/networkSpec/controlPlaneOutboundLB - valueFrom: - template: | - frontendIPsCount: {{ .controlPlane.outboundLB.frontendIPCount }} - - name: ACT_EnableNodeOutboundLB - enabledIf: '{{ and .privateCluster.enabled .worker.outboundLB.enabled }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/networkSpec/nodeOutboundLB - valueFrom: - template: | - frontendIPsCount: {{ .worker.outboundLB.frontendIPCount }} - idleTimeoutInMinutes: {{ .worker.outboundLB.idleTimeoutInMinutes }} - - name: ACT_DisableNodeOutboundLB - enabledIf: '{{ and .privateCluster.enabled (not (.worker.outboundLB.enabled)) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: remove - path: /spec/template/spec/networkSpec/nodeOutboundLB - - name: nodeLabels - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - "tkg-worker" - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.machineDeployment.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end}} - {{- if .nodePoolLabels -}} - , - {{- $first := true }} - {{- range .nodePoolLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - name: httpProxy - enabledIf: '{{ not (empty .proxy) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &containerdProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list .network.vnet.cidr "169.254.0.0/16" "168.63.129.16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /etc/systemd/system/containerd.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &kubeletProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list .network.vnet.cidr "169.254.0.0/16" "168.63.129.16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /usr/lib/systemd/system/kubelet.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPProxy | - export HTTP_PROXY= {{- .proxy.httpProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPSProxy | - export HTTPS_PROXY= {{- .proxy.httpsProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportNoProxy | - export NO_PROXY= {{- list .network.vnet.cidr "169.254.0.0/16" "168.63.129.16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *containerdProxyConf - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *kubeletProxyConf - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPSProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportNoProxy - - name: httpProxyCACert - enabledIf: '{{ $hasProxyCert := false }} {{- range .trust.additionalTrustedCAs }} {{- if .name | eq "proxy" }} {{- $hasProxyCert = true }} {{- end }} {{- end }} {{- $hasProxyCert }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - name: customizedImageRepo - enabledIf: '{{ not (empty .imageRepository.host) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - name: registryCACert - enabledIf: '{{ not (empty .trust.additionalTrustedCAs) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/containerd/ {{- index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} .crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/containerd/{{ index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }}.crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - name: additionalRegistryCACerts - enabledIf: '{{ not (empty .additionalImageRegistries) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &insertCAScript | - path: /tmp/insert_registry_ca_certs.sh - content: | - #!/bin/bash - set -e - {{- range .additionalImageRegistries }} - {{- if eq .skipTlsVerify false }} - echo '{{ .caCert }}' | base64 -d > /etc/containerd/{{ .host }}.crt - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo ' ca_file = "/etc/containerd/{{ .host }}.crt"' >> /etc/containerd/config.toml - {{- else }} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo " insecure_skip_verify = true" >> /etc/containerd/config.toml - {{- end }} - {{- end }} - permissions: "0755" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *insertCAScript - - name: auditLogging - enabledIf: '{{ .auditLogging.enabled }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-path - value: /var/log/kubernetes/audit.log - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-policy-file - value: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxage - value: "30" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxbackup - value: "10" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxsize - value: "100" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-policy - hostPath: /etc/kubernetes/audit-policy.yaml - mountPath: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-logs - hostPath: /var/log/kubernetes - mountPath: /var/log/kubernetes - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - value: - path: /etc/kubernetes/audit-policy.yaml - owner: "root:root" - permissions: "0600" - content: | - --- - apiVersion: audit.k8s.io/v1 - kind: Policy - rules: - #! The following requests were manually identified as high-volume and low-risk, - #! so drop them. - - level: None - users: ["system:serviceaccount:kube-system:kube-proxy"] - verbs: ["watch"] - resources: - - group: "" #! core - resources: ["endpoints", "services", "services/status"] - - level: None - userGroups: ["system:nodes"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["nodes", "nodes/status"] - - level: None - users: - - system:kube-controller-manager - - system:kube-scheduler - - system:serviceaccount:kube-system:endpoint-controller - verbs: ["get", "update"] - namespaces: ["kube-system"] - resources: - - group: "" #! core - resources: ["endpoints"] - - level: None - users: ["system:apiserver"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["namespaces", "namespaces/status", "namespaces/finalize"] - #! Don't log HPA fetching metrics. - - level: None - users: - - system:kube-controller-manager - verbs: ["get", "list"] - resources: - - group: "metrics.k8s.io" - #! Don't log these read-only URLs. - - level: None - nonResourceURLs: - - /healthz* - - /version - - /swagger* - #! Don't log events requests. - - level: None - resources: - - group: "" #! core - resources: ["events"] - #! Don't log TMC service account performing read operations because they are high-volume. - - level: None - userGroups: ["system:serviceaccounts:vmware-system-tmc"] - verbs: ["get", "list", "watch"] - #! Don't log read requests from garbage collector because they are high-volume. - - level: None - users: ["system:serviceaccount:kube-system:generic-garbage-collector"] - verbs: ["get", "list", "watch"] - #! node and pod status calls from nodes are high-volume and can be large, don't log responses for expected updates from nodes - - level: Request - userGroups: ["system:nodes"] - verbs: ["update","patch"] - resources: - - group: "" #! core - resources: ["nodes/status", "pods/status"] - omitStages: - - "RequestReceived" - #! deletecollection calls can be large, don't log responses for expected namespace deletions - - level: Request - users: ["system:serviceaccount:kube-system:namespace-controller"] - verbs: ["deletecollection"] - omitStages: - - "RequestReceived" - #! Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data, - #! so only log at the Metadata level. - - level: Metadata - resources: - - group: "" #! core - resources: ["secrets", "configmaps"] - - group: authentication.k8s.io - resources: ["tokenreviews"] - omitStages: - - "RequestReceived" - #! Get repsonses can be large; skip them. - - level: Request - verbs: ["get", "list", "watch"] - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for known APIs - - level: RequestResponse - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for all other requests. - - level: Metadata - omitStages: - - "RequestReceived" - - name: kcptCertificateRotation - enabledIf: '{{ .controlPlaneCertificateRotation.activate }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/rolloutBefore - valueFrom: - template: | - certificatesExpiryDays: {{ .controlPlaneCertificateRotation.daysBefore }} ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureClusterTemplate -metadata: - name: #@ "tkg-azure-default-{}-cluster".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - azureEnvironment: #@ data.values.AZURE_ENVIRONMENT - location: #@ data.values.AZURE_LOCATION - networkSpec: - vnet: - cidrBlock: #@ data.values.AZURE_VNET_CIDR - subnets: - #@ if data.values.AZURE_CONTROL_PLANE_SUBNET_NAME == "": - - name: management-cluster-controlplane-subnet - role: control-plane - cidrBlock: #@ data.values.AZURE_CONTROL_PLANE_SUBNET_CIDR - #@ else: - - name: #@ data.values.AZURE_CONTROL_PLANE_SUBNET_NAME - role: control-plane - cidrBlock: #@ data.values.AZURE_CONTROL_PLANE_SUBNET_CIDR - #@ end - #@ if data.values.AZURE_NODE_SUBNET_NAME == "": - - name: management-cluster-node-subnet - role: node - cidrBlock: #@ data.values.AZURE_NODE_SUBNET_CIDR - #@ else: - - name: #@ data.values.AZURE_NODE_SUBNET_NAME - role: node - cidrBlock: #@ data.values.AZURE_NODE_SUBNET_CIDR - #@ end - subscriptionID: #@ data.values.AZURE_SUBSCRIPTION_ID ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlaneTemplate -metadata: - name: #@ "tkg-azure-default-{}-kcp".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - kubeadmConfigSpec: - clusterConfiguration: - apiServer: - extraArgs: {} - extraVolumes: [] - timeoutForControlPlane: 20m - scheduler: - extraArgs: {} - controllerManager: - extraArgs: {} - extraVolumes: - - hostPath: /etc/kubernetes/azure.json - mountPath: /etc/kubernetes/azure.json - name: cloud-config - readOnly: true - dns: - imageRepository: #! e.g. registry.tkg.vmware.run - imageTag: #! e.g. v1.6.5_vmware.4 - etcd: - local: - dataDir: /var/lib/etcddisk/etcd - extraArgs: {} - imageRepository: #! e.g. registry.tkg.vmware.run - imageTag: #! e.g v3.4.3_vmware.4 - imageRepository: #! e.g. registry.tkg.vmware.run - diskSetup: - filesystems: - - device: /dev/disk/azure/scsi1/lun0 - extraOpts: - - -E - - lazy_itable_init=1,lazy_journal_init=1 - filesystem: ext4 - label: etcd_disk - - device: ephemeral0.1 - filesystem: ext4 - label: ephemeral0 - replaceFS: ntfs - partitions: - - device: /dev/disk/azure/scsi1/lun0 - layout: true - overwrite: false - tableType: gpt - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data["local_hostname"] }}' - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data["local_hostname"] }}' - mounts: - - - LABEL=etcd_disk - - /var/lib/etcddisk - useExperimentalRetryJoin: true - postKubeadmCommands: - - echo "running postKubeadmCommands..." - preKubeadmCommands: - #! Ensure a non-empty preKubeadmCommands array is present to facilitate patching - - echo "running preKubeadmCommands..." ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureMachineTemplate -metadata: - name: #@ "tkg-azure-default-{}-control-plane".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - dataDisks: - - diskSizeGB: 256 - lun: 0 - nameSuffix: etcddisk - osDisk: - diskSizeGB: 128 - managedDisk: - storageAccountType: Premium_LRS - osType: Linux - sshPublicKey: c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkl3QUFBUUVBdXR2WGhHWFhzN0t5cFV3c1F1dmc3MCtHclVJUXg1YS9QOFBROGhPbWVzZFAwb1hFMElSKzNuN0NGRzhpK0IwV08rdkhCYnc2b3VkSnR6bmNLaE5hU2N3ZFllT1JVbFVLcVN1QXJtU0NjQnpaZDFTTlVSY2NPRWlocjBEUVg5NXk0YjFUS3QxNjl3eVlzZ0JQeDNHcmprc2xJalRDblZKZmdoWlZOZFdKWWJrRVNuck9ySW05KzFsL3JLT09UOWpsR1NER3M1RW5mM2sxTEY3WThTUVVwdXVOZlNKTU9GRlVHTlVxNjY5L0Fod1FJSDJJYjhPQjY5cmV4ajdwQmdCWjFpd3l6eFlWUGZ3aUZSWXR0eFNDRVJiNk82alh4U21KS3FhTkdNcS9QdlJrTVUzTndxNDV1anN1M3l2NmVFSTVLZGpIV0pFdGd3ZWhXa0ZGL2NGcWd3PT0gd2p1bkB2bXdhcmUuY29t - vmSize: #@ data.values.AZURE_CONTROL_PLANE_MACHINE_TYPE ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureMachineTemplate -metadata: - name: #@ "tkg-azure-default-{}-worker".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - osDisk: - diskSizeGB: 128 - managedDisk: - storageAccountType: Premium_LRS - osType: Linux - sshPublicKey: c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkl3QUFBUUVBdXR2WGhHWFhzN0t5cFV3c1F1dmc3MCtHclVJUXg1YS9QOFBROGhPbWVzZFAwb1hFMElSKzNuN0NGRzhpK0IwV08rdkhCYnc2b3VkSnR6bmNLaE5hU2N3ZFllT1JVbFVLcVN1QXJtU0NjQnpaZDFTTlVSY2NPRWlocjBEUVg5NXk0YjFUS3QxNjl3eVlzZ0JQeDNHcmprc2xJalRDblZKZmdoWlZOZFdKWWJrRVNuck9ySW05KzFsL3JLT09UOWpsR1NER3M1RW5mM2sxTEY3WThTUVVwdXVOZlNKTU9GRlVHTlVxNjY5L0Fod1FJSDJJYjhPQjY5cmV4ajdwQmdCWjFpd3l6eFlWUGZ3aUZSWXR0eFNDRVJiNk82alh4U21KS3FhTkdNcS9QdlJrTVUzTndxNDV1anN1M3l2NmVFSTVLZGpIV0pFdGd3ZWhXa0ZGL2NGcWd3PT0gd2p1bkB2bXdhcmUuY29t - vmSize: #@ data.values.AZURE_NODE_MACHINE_TYPE - ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "tkg-azure-default-{}-md-config".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data["local_hostname"] }}' - useExperimentalRetryJoin: true - preKubeadmCommands: - - echo "running preKubeadmCommands..." diff --git a/packages/tkg-clusterclass-azure/bundle/config/upstream/overlay-kube-apiserver-admission.yaml b/packages/tkg-clusterclass-azure/bundle/config/upstream/overlay-kube-apiserver-admission.yaml deleted file mode 100644 index 965c26e66d..0000000000 --- a/packages/tkg-clusterclass-azure/bundle/config/upstream/overlay-kube-apiserver-admission.yaml +++ /dev/null @@ -1,192 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/append - - name: eventRateLimitConf - required: false - schema: - openAPIV3Schema: - type: string - default: "" - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/admission-control-config.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: admin-control-conf - hostPath: /etc/kubernetes/admission-control-config.yaml - mountPath: /etc/kubernetes/admission-control-config.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/admission-control-config.yaml - content: |- - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - {{- if and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }} - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - {{- end }} - {{- if .eventRateLimitConf }} - - name: EventRateLimit - path: eventConfig.yaml - {{- end }} - enabledIf: '{{ or (and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version)) (.eventRateLimitConf) }}' - #@overlay/append - - name: eventRateLimitConf - description: "Adds an admission configuration for EventRateLimit." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/enable-admission-plugins" - valueFrom: - template: | - {{ $containEnableAdmissionPlugin := false }} - {{- $admissionPlugins := "" }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "enable-admission-plugins" }} - {{- $containEnableAdmissionPlugin = true }} - {{- $admissionPlugins = $val }} - {{- end }} - {{- end }} - {{- if not $containEnableAdmissionPlugin }} - NodeRestriction,EventRateLimit - {{- else -}} - {{- $admissionPlugins -}},EventRateLimit - {{- end }} - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: event-conf - hostPath: /etc/kubernetes/eventConfig.yaml - mountPath: /etc/kubernetes/eventConfig.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/eventConfig.yaml - encoding: base64 - content: {{ .eventRateLimitConf}} - enabledIf: '{{ not (empty .eventRateLimitConf) }}' diff --git a/packages/tkg-clusterclass-azure/bundle/config/upstream/overlay.yaml b/packages/tkg-clusterclass-azure/bundle/config/upstream/overlay.yaml deleted file mode 100644 index 27c8c63098..0000000000 --- a/packages/tkg-clusterclass-azure/bundle/config/upstream/overlay.yaml +++ /dev/null @@ -1,101 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - controlPlane: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_CONTROL_PLANE: - #@overlay/match missing_ok=True - machineHealthCheck: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_CONTROL_PLANE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - workers: - machineDeployments: - #@overlay/match by=overlay.index(0) - - class: tkg-worker - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - #@overlay/match missing_ok=True - machineHealthCheck: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - patches: - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: KCP_INIT_APISERVER_EMPTY_EXTRAVOLUMES_ARRAY - #@overlay/append - - name: restartContainerdService - enabledIf: '{{ not (and (empty .proxy) (empty .trust.additionalTrustedCAs) (empty .imageRepository.host) (empty .additionalImageRegistries)) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl restart containerd - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl restart containerd - -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+" ---- -spec: - #@overlay/match missing_ok=True - template: - #@overlay/match missing_ok=True - spec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #@overlay/append - - "if [ -f /etc/kubernetes/azure.json ]; then sed -i 's/\"vmType\": \"vmss\"/\"vmType\": \"standard\"/' /etc/kubernetes/azure.json; fi" - -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlaneTemplate"}) ---- -spec: - template: - spec: - #@overlay/match missing_ok=True - kubeadmConfigSpec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #@overlay/append - - "if [ -f /etc/kubernetes/azure.json ]; then sed -i 's/\"vmType\": \"vmss\"/\"vmType\": \"standard\"/' /etc/kubernetes/azure.json; fi" diff --git a/packages/tkg-clusterclass-azure/bundle/config/values.yaml b/packages/tkg-clusterclass-azure/bundle/config/values.yaml deleted file mode 100644 index 04e7aa4e4c..0000000000 --- a/packages/tkg-clusterclass-azure/bundle/config/values.yaml +++ /dev/null @@ -1,27 +0,0 @@ -#@data/values - -#@overlay/match-child-defaults missing_ok=True ---- - -#! User configurable values for tkg-clusterclass-azure - -ENABLE_MHC: true -ENABLE_MHC_WORKER_NODE: true -ENABLE_MHC_CONTROL_PLANE: true -MHC_UNKNOWN_STATUS_TIMEOUT: 5m -MHC_FALSE_STATUS_TIMEOUT: 12m -MHC_MAX_UNHEALTHY_CONTROL_PLANE: 100% -MHC_MAX_UNHEALTHY_WORKER_NODE: 100% -NODE_STARTUP_TIMEOUT: 20m -NAMESPACE: tkg-system -AZURE_ENVIRONMENT: "" -AZURE_LOCATION: "" -AZURE_VNET_CIDR: "" -AZURE_CONTROL_PLANE_SUBNET_NAME: management-cluster-controlplane-subnet -AZURE_CONTROL_PLANE_SUBNET_CIDR: "" -AZURE_NODE_SUBNET_NAME: management-cluster-node-subnet -AZURE_NODE_SUBNET_CIDR: "" -AZURE_SUBSCRIPTION_ID: "" -AZURE_CLUSTER_CLASS_VERSION: v1.0.0 -AZURE_CONTROL_PLANE_MACHINE_TYPE: "" -AZURE_NODE_MACHINE_TYPE: "" diff --git a/packages/tkg-clusterclass-azure/metadata.yaml b/packages/tkg-clusterclass-azure/metadata.yaml deleted file mode 100644 index 634a5c4803..0000000000 --- a/packages/tkg-clusterclass-azure/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkg-clusterclass-azure.tanzu.vmware.com - namespace: tkg-clusterclass-azure -spec: - displayName: "tkg-clusterclass-azure" - longDescription: "ClusterClass for Azure defines the default set of Azure ClusterClass resources for Tanzu" - shortDescription: "Defines the Azure ClusterClass resources for Tanzu" - providerName: VMware - maintainers: - - name: "" - categories: - - "clusterclass" diff --git a/packages/tkg-clusterclass-azure/package.yaml b/packages/tkg-clusterclass-azure/package.yaml deleted file mode 100644 index ce29dd6d99..0000000000 --- a/packages/tkg-clusterclass-azure/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkg-clusterclass-azure.tanzu.vmware.com - namespace: tkg-clusterclass-azure -spec: - refName: tkg-clusterclass-azure.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkg-clusterclass-azure/vendir.lock.yml b/packages/tkg-clusterclass-azure/vendir.lock.yml deleted file mode 100644 index 96a4894c49..0000000000 --- a/packages/tkg-clusterclass-azure/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/tkg-clusterclass-azure/vendir.yml b/packages/tkg-clusterclass-azure/vendir.yml deleted file mode 100644 index 963f250148..0000000000 --- a/packages/tkg-clusterclass-azure/vendir.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 diff --git a/packages/tkg-clusterclass-docker/Makefile b/packages/tkg-clusterclass-docker/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/tkg-clusterclass-docker/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkg-clusterclass-docker/README.md b/packages/tkg-clusterclass-docker/README.md deleted file mode 100644 index 415bc01858..0000000000 --- a/packages/tkg-clusterclass-docker/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# tkg-clusterclass-docker Package - -This package provides << awesome functionality >> using [tkg-clusterclass-docker](https://INFO_NEEDED). - -## Components - -## Configuration - -The following configuration values can be set to customize the tkg-clusterclass-docker installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -### tkg-clusterclass-docker Configuration - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -## Usage Example - -The following is a basic guide for getting started with tkg-clusterclass-docker. diff --git a/packages/tkg-clusterclass-docker/bundle/config/upstream/base.yaml b/packages/tkg-clusterclass-docker/bundle/config/upstream/base.yaml deleted file mode 100644 index bb877a88d2..0000000000 --- a/packages/tkg-clusterclass-docker/bundle/config/upstream/base.yaml +++ /dev/null @@ -1,352 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - annotations: - run.tanzu.vmware.com/resolve-tkr: "" - name: #@ "tkg-docker-default-{}".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - controlPlane: - ref: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - name: #@ "tkg-docker-default-{}-kcp".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - machineInfrastructure: - ref: - kind: DockerMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-docker-default-{}-control-plane".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerClusterTemplate - name: #@ "tkg-docker-default-{}-cluster".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - workers: - machineDeployments: - - class: default-worker - template: - bootstrap: - ref: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: #@ "tkg-docker-default-{}-md-config".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerMachineTemplate - name: #@ "tkg-docker-default-{}-worker".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - variables: - - name: TKR_DATA - required: false - schema: - openAPIV3Schema: - type: object - properties: { } - - name: cni - required: true - schema: - openAPIV3Schema: - type: string - default: antrea - - name: imageRepository - required: true - schema: - openAPIV3Schema: - type: string - default: projects-stg.registry.vmware.com/tkg - example: "k8s.gcr.io" - description: "imageRepository sets the container registry to pull images from. If empty, `k8s.gcr.io` will be used by default." - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: true - description: "enabled enables the patches to enable Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - default: "baseline" - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of privileged, baseline, restricted." - audit: - type: string - default: "restricted" - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of privileged, baseline, restricted." - warn: - type: string - default: "restricted" - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of privileged, baseline, restricted." - patches: - - name: KCPT_ControlPlane_Main - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageTag - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.etcd.imageTag}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageTag - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.coredns.imageTag}}' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: curl https://get.docker.com/builds/Linux/x86_64/docker-1.12.0.tgz | tar zxOf - docker/docker > /usr/local/bin/docker;chmod +x /usr/local/bin/docker - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: peerIdx=$(ip link | grep eth0 | awk -F[@:] '{ print $3 }' | cut -c 3-);peerName=$(docker run --rm --net=host --entrypoint=/bin/ip projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 link | grep ^"$peerIdx":| awk -F[:@] '{ print $2 }' | cut -c 2-);docker run --rm --net=host --privileged --entrypoint=/usr/sbin/ethtool projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 -K "$peerName" tx off - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: sysctl -w net.ipv4.tcp_retries2=4 - - name: imageRepository - description: "Sets the imageRepository used for the KubeadmControlPlane." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository" - valueFrom: - variable: imageRepository - - name: cgroupDriver-controlPlane - description: | - Sets the cgroupDriver to cgroupfs if a Kubernetes version < v1.24 is referenced. - This is required because kind and the node images do not support the default - systemd cgroupDriver for kubernetes < v1.24. - enabledIf: '{{ semverCompare "<= v1.23" .builtin.controlPlane.version }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/cgroup-driver" - value: cgroupfs - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/cgroup-driver" - value: cgroupfs - - name: antrea-prekubeadm - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - default-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: curl https://get.docker.com/builds/Linux/x86_64/docker-1.12.0.tgz | tar zxOf - docker/docker > /usr/local/bin/docker;chmod +x /usr/local/bin/docker - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: peerIdx=$(ip link | grep eth0 | awk -F[@:] '{ print $3 }' | cut -c 3-);peerName=$(docker run --rm --net=host --entrypoint=/bin/ip projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 link | grep ^"$peerIdx":| awk -F[:@] '{ print $2 }' | cut -c 2-);docker run --rm --net=host --privileged --entrypoint=/usr/sbin/ethtool projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 -K "$peerName" tx off - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: sysctl -w net.ipv4.tcp_retries2=4 - - name: cgroupDriver-machineDeployment - description: | - Sets the cgroupDriver to cgroupfs if a Kubernetes version < v1.24 is referenced. - This is required because kind and the node images do not support the default - systemd cgroupDriver for kubernetes < v1.24. - enabledIf: '{{ semverCompare "<= v1.23" .builtin.machineDeployment.version }}' - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - default-worker - jsonPatches: - - op: add - path: "/spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/cgroup-driver" - value: cgroupfs - - name: customImage - description: "Sets the container image that is used for running dockerMachines for the controlPlane and default-worker machineDeployments." - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerMachineTemplate - matchResources: - machineDeploymentClass: - names: - - default-worker - jsonPatches: - - op: add - path: "/spec/template/spec/customImage" - value: projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/customImage" - value: projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 - - name: podSecurityStandard - description: "Adds an admission configuration for PodSecurity to the kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs" - value: - admission-control-config-file: "/etc/kubernetes/kube-apiserver-admission-pss.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes" - value: - - name: admission-pss - hostPath: /etc/kubernetes/kube-apiserver-admission-pss.yaml - mountPath: /etc/kubernetes/kube-apiserver-admission-pss.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files" - valueFrom: - template: | - - content: | - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ .podSecurityStandard.enforce }}" - enforce-version: "latest" - audit: "{{ .podSecurityStandard.audit }}" - audit-version: "latest" - warn: "{{ .podSecurityStandard.warn }}" - warn-version: "latest" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [kube-system] - path: /etc/kubernetes/kube-apiserver-admission-pss.yaml - enabledIf: "{{ .podSecurityStandard.enabled }}" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerClusterTemplate -metadata: - name: #@ "tkg-docker-default-{}-cluster".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: {} ---- -kind: KubeadmControlPlaneTemplate -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -metadata: - name: #@ "tkg-docker-default-{}-kcp".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - kubeadmConfigSpec: - preKubeadmCommands: - - echo "running preKubeadmCommands..." - clusterConfiguration: - controllerManager: - extraArgs: { enable-hostpath-provisioner: 'true' } - apiServer: - certSANs: [localhost, 127.0.0.1, 0.0.0.0, host.docker.internal] - dns: - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - extraArgs: - cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - imageRepository: dummy.registry.vmware.com - initConfiguration: - nodeRegistration: - criSocket: unix:///var/run/containerd/containerd.sock - kubeletExtraArgs: - eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%' - joinConfiguration: - nodeRegistration: - criSocket: unix:///var/run/containerd/containerd.sock - kubeletExtraArgs: - eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%' ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerMachineTemplate -metadata: - name: #@ "tkg-docker-default-{}-control-plane".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - extraMounts: - - containerPath: "/var/run/docker.sock" - hostPath: "/var/run/docker.sock" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerMachineTemplate -metadata: - name: #@ "tkg-docker-default-{}-worker".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - extraMounts: - - containerPath: "/var/run/docker.sock" - hostPath: "/var/run/docker.sock" ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "tkg-docker-default-{}-md-config".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - preKubeadmCommands: - - echo "running preKubeadmCommands..." - joinConfiguration: - nodeRegistration: - criSocket: unix:///var/run/containerd/containerd.sock - kubeletExtraArgs: - eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%' diff --git a/packages/tkg-clusterclass-docker/bundle/config/upstream/overlay-kube-apiserver-admission.yaml b/packages/tkg-clusterclass-docker/bundle/config/upstream/overlay-kube-apiserver-admission.yaml deleted file mode 100644 index 965c26e66d..0000000000 --- a/packages/tkg-clusterclass-docker/bundle/config/upstream/overlay-kube-apiserver-admission.yaml +++ /dev/null @@ -1,192 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/append - - name: eventRateLimitConf - required: false - schema: - openAPIV3Schema: - type: string - default: "" - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/admission-control-config.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: admin-control-conf - hostPath: /etc/kubernetes/admission-control-config.yaml - mountPath: /etc/kubernetes/admission-control-config.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/admission-control-config.yaml - content: |- - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - {{- if and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }} - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - {{- end }} - {{- if .eventRateLimitConf }} - - name: EventRateLimit - path: eventConfig.yaml - {{- end }} - enabledIf: '{{ or (and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version)) (.eventRateLimitConf) }}' - #@overlay/append - - name: eventRateLimitConf - description: "Adds an admission configuration for EventRateLimit." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/enable-admission-plugins" - valueFrom: - template: | - {{ $containEnableAdmissionPlugin := false }} - {{- $admissionPlugins := "" }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "enable-admission-plugins" }} - {{- $containEnableAdmissionPlugin = true }} - {{- $admissionPlugins = $val }} - {{- end }} - {{- end }} - {{- if not $containEnableAdmissionPlugin }} - NodeRestriction,EventRateLimit - {{- else -}} - {{- $admissionPlugins -}},EventRateLimit - {{- end }} - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: event-conf - hostPath: /etc/kubernetes/eventConfig.yaml - mountPath: /etc/kubernetes/eventConfig.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/eventConfig.yaml - encoding: base64 - content: {{ .eventRateLimitConf}} - enabledIf: '{{ not (empty .eventRateLimitConf) }}' diff --git a/packages/tkg-clusterclass-docker/bundle/config/upstream/overlay-pod-security-admission.yaml b/packages/tkg-clusterclass-docker/bundle/config/upstream/overlay-pod-security-admission.yaml deleted file mode 100644 index 754c1ce0aa..0000000000 --- a/packages/tkg-clusterclass-docker/bundle/config/upstream/overlay-pod-security-admission.yaml +++ /dev/null @@ -1,134 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for PodSecurity to the kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/kube-apiserver-admission-pss.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - value: - name: admission-pss - hostPath: /etc/kubernetes/kube-apiserver-admission-pss.yaml - mountPath: /etc/kubernetes/kube-apiserver-admission-pss.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - content: |- - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - path: /etc/kubernetes/kube-apiserver-admission-pss.yaml - enabledIf: '{{ and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }}' diff --git a/packages/tkg-clusterclass-docker/bundle/config/upstream/overlay.yaml b/packages/tkg-clusterclass-docker/bundle/config/upstream/overlay.yaml deleted file mode 100644 index e85fd269f8..0000000000 --- a/packages/tkg-clusterclass-docker/bundle/config/upstream/overlay.yaml +++ /dev/null @@ -1,80 +0,0 @@ -#! This overlay is adds a patch as first element in the patches to create an empty -#! dict at the apiservers extraArgs definition. -#! With this other patches are able to insert into the now existing dictionary. -#! Otherwise the dict would not exist and the patches would fail. -#! Empty dictionaries get dropped due to omitEmpty set at the CRD level. -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -spec: - controlPlane: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_CONTROL_PLANE: - #@overlay/match missing_ok=True - machineHealthCheck: - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_CONTROL_PLANE - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - workers: - machineDeployments: - #@overlay/match by="class" - - class: default-worker - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - #@overlay/match missing_ok=True - machineHealthCheck: - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - patches: - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs - value: {} - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: CAPD_KCP_INIT_EMPTY_APISERVER_EXTRAARGS - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: CAPD_KCP_INIT_EMPTY_FILES_ARRAY - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: KCP_INIT_APISERVER_EMPTY_EXTRAVOLUMES_ARRAY diff --git a/packages/tkg-clusterclass-docker/bundle/config/values.yaml b/packages/tkg-clusterclass-docker/bundle/config/values.yaml deleted file mode 100644 index 0dbced9d5b..0000000000 --- a/packages/tkg-clusterclass-docker/bundle/config/values.yaml +++ /dev/null @@ -1,16 +0,0 @@ -#@data/values - -#@overlay/match-child-defaults missing_ok=True ---- - -#! User configurable values for tkg-clusterclass-docker -NAMESPACE: tkg-system -DOCKER_CLUSTER_CLASS_VERSION: v1.0.0 -ENABLE_MHC: true -ENABLE_MHC_CONTROL_PLANE: true -ENABLE_MHC_WORKER_NODE: true -MHC_UNKNOWN_STATUS_TIMEOUT: 5m -MHC_FALSE_STATUS_TIMEOUT: 12m -MHC_MAX_UNHEALTHY_CONTROL_PLANE: 100% -MHC_MAX_UNHEALTHY_WORKER_NODE: 100% -NODE_STARTUP_TIMEOUT: 20m diff --git a/packages/tkg-clusterclass-docker/metadata.yaml b/packages/tkg-clusterclass-docker/metadata.yaml deleted file mode 100644 index 24ce63d198..0000000000 --- a/packages/tkg-clusterclass-docker/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkg-clusterclass-docker.tanzu.vmware.com - namespace: default -spec: - displayName: "tkg-clusterclass-docker" - longDescription: "ClusterClass for Docker defines the default set of Docker ClusterClass resources for Tanzu" - shortDescription: "Defines the Docker ClusterClass resources for Tanzu" - providerName: VMware - maintainers: - - name: "" - categories: - - "clusterclass" diff --git a/packages/tkg-clusterclass-docker/package.yaml b/packages/tkg-clusterclass-docker/package.yaml deleted file mode 100644 index b8535f8c47..0000000000 --- a/packages/tkg-clusterclass-docker/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkg-clusterclass-docker.tanzu.vmware.com - namespace: default -spec: - refName: tkg-clusterclass-docker.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkg-clusterclass-docker/vendir.lock.yml b/packages/tkg-clusterclass-docker/vendir.lock.yml deleted file mode 100644 index 96a4894c49..0000000000 --- a/packages/tkg-clusterclass-docker/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/tkg-clusterclass-docker/vendir.yml b/packages/tkg-clusterclass-docker/vendir.yml deleted file mode 100644 index 963f250148..0000000000 --- a/packages/tkg-clusterclass-docker/vendir.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 diff --git a/packages/tkg-clusterclass-oci/Makefile b/packages/tkg-clusterclass-oci/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/tkg-clusterclass-oci/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkg-clusterclass-oci/README.md b/packages/tkg-clusterclass-oci/README.md deleted file mode 100644 index 6bb3f76053..0000000000 --- a/packages/tkg-clusterclass-oci/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# tkg-clusterclass-oci Package - -This package provides << awesome functionality >> using [tkg-clusterclass-oci](https://INFO_NEEDED). - -## Components - -## Configuration - -The following configuration values can be set to customize the tkg-clusterclass-oci installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -### tkg-clusterclass-oci Configuration - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -## Usage Example - -The following is a basic guide for getting started with tkg-clusterclass-oci. diff --git a/packages/tkg-clusterclass-oci/bundle/config/upstream/base.yaml b/packages/tkg-clusterclass-oci/bundle/config/upstream/base.yaml deleted file mode 100644 index f1cf4f694c..0000000000 --- a/packages/tkg-clusterclass-oci/bundle/config/upstream/base.yaml +++ /dev/null @@ -1,1049 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - name: tkg-oci-default - namespace: #@ data.values.NAMESPACE -spec: - controlPlane: - ref: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - name: tkg-oci-kcp - machineInfrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - name: tkg-controlplane-oci-template - workers: - machineDeployments: - - class: tkg-worker - template: - bootstrap: - ref: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: tkg-oci-bootstrap-template - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - name: tkg-oci-worker-template - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - name: oci-cluster-template - variables: - - name: sshKey - required: false - schema: - openAPIV3Schema: - type: string - default: default - - name: privateServiceSubnetId - required: false - schema: - openAPIV3Schema: - type: string - default: "" - - name: compartmentId - required: true - schema: - openAPIV3Schema: - type: string - - name: externalVCNId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalControlPlaneEndpointNSGId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalControlPlaneNSGId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalWorkerNSGId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalControlPlaneEndpointSubnetId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalControlPlaneSubnetId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalWorkerSubnetId - required: false - schema: - openAPIV3Schema: - type: string - - name: nodeMachineShape - required: false - schema: - openAPIV3Schema: - type: string - default: VM.Standard.E4.Flex - - name: nodeMachineOcpus - required: false - schema: - openAPIV3Schema: - type: string - default: "1" - - name: controlPlaneMachineShape - required: false - schema: - openAPIV3Schema: - type: string - default: VM.Standard.E4.Flex - - name: controlPlaneMachineOcpus - required: false - schema: - openAPIV3Schema: - type: string - default: "1" - - name: nodePvTransitEncryption - required: false - schema: - openAPIV3Schema: - type: boolean - default: true - - name: controlPlanePvTransitEncryption - required: false - schema: - openAPIV3Schema: - type: boolean - default: true - - name: imageRepository - required: false - schema: - openAPIV3Schema: - type: object - properties: - host: - type: string - tlsCertificateValidation: - type: boolean - default: true - - name: cni - required: true - schema: - openAPIV3Schema: - type: string - #@ if data.values.CNI: - default: #@ data.values.CNI - #@ else: - default: "" - #@ end - - name: trust - required: false - schema: - openAPIV3Schema: - type: object - properties: - additionalTrustedCAs: - type: array - items: - type: object - properties: - name: - type: string - data: - type: string - required: - - name - - data - - name: auditLogging - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: false - required: - - enabled - default: - enabled: false - - name: TKR_DATA - required: false - schema: - openAPIV3Schema: - type: object - properties: {} - - name: controlPlaneCertificateRotation - required: false - schema: - openAPIV3Schema: - type: object - properties: - activate: - type: boolean - default: true - daysBefore: - type: integer - format: int32 - minimum: 7 - default: 90 - default: - activate: true - daysBefore: 90 - - name: etcdExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: apiServerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: kubeSchedulerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: kubeControllerManagerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: controlPlaneKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: workerKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: tlsCipherSuites - required: false - schema: - openAPIV3Schema: - type: string - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - patches: - - name: etcdExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .etcdExtraArgs }} - {{- if eq $key "cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: apiServerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - {{- end }} - - name: kubeSchedulerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/scheduler/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .kubeSchedulerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: kubeControllerManagerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .kubeControllerManagerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: controlPlaneKubeletExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{ $containProviderId := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "provider-id" }} - {{- $containProviderId = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - {{- if not $containProviderId }} - provider-id: oci://{{ ds["id"] }} - {{- end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{ $containProviderId := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "provider-id" }} - {{- $containProviderId = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - {{- if not $containProviderId }} - provider-id: oci://{{ ds["id"] }} - {{- end }} - - name: workerKubeletExtraArgs - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - "tkg-worker" - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{ $containProviderId := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "provider-id" }} - {{- $containProviderId = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - {{- if not $containProviderId }} - provider-id: oci://{{ ds["id"] }} - {{- end }} - - name: compartmentId - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: "/spec/template/spec/compartmentId" - valueFrom: - variable: compartmentId - #! JSON Patches for externally managed cluster infrastructure - #! these patches are only enabled if a non-empty externalVCNId variable is specified - - name: skipNetworkManagement - enabledIf: '{{ not (empty .externalVCNId) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: "/spec/template/spec/networkSpec/skipNetworkManagement" - value: true - - name: externalVCNId - enabledIf: '{{ not (empty .externalVCNId) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: "/spec/template/spec/networkSpec/vcn/id" - valueFrom: - variable: externalVCNId - - name: externalNetworkSecurityGroups - enabledIf: '{{ not (empty .externalVCNId) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: replace - path: "/spec/template/spec/networkSpec/vcn/networkSecurityGroups" - valueFrom: - template: | - - id: {{ .externalControlPlaneEndpointNSGId }} - role: control-plane-endpoint - name: control-plane-endpoint - - id: {{ .externalWorkerNSGId }} - role: worker - name: worker - - id: {{ .externalControlPlaneNSGId }} - role: control-plane - name: control-plane - - name: externalSubnets - enabledIf: '{{ not (empty .externalVCNId) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: "/spec/template/spec/networkSpec/vcn/subnets" - valueFrom: - template: | - - id: {{ .externalControlPlaneEndpointSubnetId }} - role: control-plane-endpoint - name: control-plane-endpoint - - id: {{ .externalWorkerSubnetId }} - role: worker - name: worker - - id: {{ .externalControlPlaneSubnetId }} - role: control-plane - name: control-plane - - name: sshAuthorizedKeys - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - controlPlane: true - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: "/spec/template/spec/metadata/ssh_authorized_keys" - valueFrom: - variable: sshKey - - name: nodeShape - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: replace - path: "/spec/template/spec/shape" - valueFrom: - variable: nodeMachineShape - - name: controlPlaneMachineShape - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/shape" - valueFrom: - variable: controlPlaneMachineShape - - name: controlPlaneImageId - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/imageId" - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).osImageRef.id }}' - - name: workerImageId - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: "/spec/template/spec/imageId" - valueFrom: - template: '{{ (index .TKR_DATA .builtin.machineDeployment.version).osImageRef.id }}' - - name: nodeIsPvEncryptionInTransitEnabled - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: "/spec/template/spec/isPvEncryptionInTransitEnabled" - valueFrom: - variable: nodePvTransitEncryption - - name: controlPlaneIsPvEncryptionInTransitEnabled - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/isPvEncryptionInTransitEnabled" - valueFrom: - variable: controlPlanePvTransitEncryption - - name: nodeOcpus - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/shapeConfig/ocpus - valueFrom: - variable: nodeMachineOcpus - - name: controlPlaneOcpus - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/shapeConfig/ocpus - valueFrom: - variable: controlPlaneMachineOcpus - - name: apiServerBindPort - enabledIf: '{{ not (empty .apiServerPort) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/localAPIEndpoint - valueFrom: - template: | - advertiseAddress: '0.0.0.0' - bindPort: {{ .apiServerPort }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/controlPlane - valueFrom: - template: | - localAPIEndpoint: - advertiseAddress: '0.0.0.0' - bindPort: {{ .apiServerPort }} - - name: OCI_KCPT - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.etcd.imageTag }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.coredns.imageTag }}' - - name: customizedImageRepo - enabledIf: '{{ not (empty .imageRepository.host) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - name: kcptCertificateRotation - enabledIf: '{{ .controlPlaneCertificateRotation.activate }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/rolloutBefore - valueFrom: - template: | - certificatesExpiryDays: {{ .controlPlaneCertificateRotation.daysBefore }} ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: OCIClusterTemplate -metadata: - name: oci-cluster-template - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - networkSpec: - vcn: - cidr: "10.0.0.0/16" - subnets: - networkSecurityGroups: - - egressRules: - - egressRule: - description: Control Plane Nodes access to Internet - destination: 0.0.0.0/0 - destinationType: CIDR_BLOCK - isStateless: false - protocol: all - ingressRules: - - ingressRule: - description: Kubernetes API endpoint to Kubernetes control plane node(apiserver - port) communication - isStateless: false - protocol: "6" - source: 10.0.0.8/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 6443 - min: 6443 - - ingressRule: - description: Control plane node to control plane node(apiserver port) - communication - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 6443 - min: 6443 - - ingressRule: - description: Worker Node to Kubernetes control plane node(apiserver port) - communication - isStateless: false - protocol: "6" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 6443 - min: 6443 - - ingressRule: - description: etcd client communication - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 2379 - min: 2379 - - ingressRule: - description: etcd peer - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 2380 - min: 2380 - - ingressRule: - description: Antrea Service - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 10349 - min: 10349 - - ingressRule: - description: Antrea Service - isStateless: false - protocol: "6" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 10349 - min: 10349 - - ingressRule: - description: Geneve Service - isStateless: false - protocol: "17" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - udpOptions: - destinationPortRange: - max: 6081 - min: 6081 - - ingressRule: - description: Geneve Service - isStateless: false - protocol: "17" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - udpOptions: - destinationPortRange: - max: 6081 - min: 6081 - - ingressRule: - description: Path discovery - icmpOptions: - code: 3 - type: 3 - isStateless: false - protocol: "1" - source: 10.0.0.0/16 - sourceType: CIDR_BLOCK - - ingressRule: - description: Inbound SSH traffic to control plane nodes - isStateless: false - protocol: "6" - source: 0.0.0.0/0 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 22 - min: 22 - - ingressRule: - description: Control Plane to Control Plane Kubelet Communication - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 10250 - min: 10250 - name: control-plane - role: control-plane - - egressRules: - - egressRule: - description: Worker Nodes access to Internet - destination: 0.0.0.0/0 - destinationType: CIDR_BLOCK - isStateless: false - protocol: all - ingressRules: - - ingressRule: - description: Inbound SSH traffic to worker nodes - isStateless: false - protocol: "6" - source: 0.0.0.0/0 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 22 - min: 22 - - ingressRule: - description: Path discovery - icmpOptions: - code: 3 - type: 3 - isStateless: false - protocol: "1" - source: 10.0.0.0/16 - sourceType: CIDR_BLOCK - - ingressRule: - description: Control plane nodes to worker node Kubelet Communication - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 10250 - min: 10250 - - ingressRule: - description: Worker nodes to worker node Kubelet Communication - isStateless: false - protocol: "6" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 10250 - min: 10250 - - ingressRule: - description: Geneve Service - isStateless: false - protocol: "17" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - udpOptions: - destinationPortRange: - max: 6081 - min: 6081 - - ingressRule: - description: Geneve Service - isStateless: false - protocol: "17" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - udpOptions: - destinationPortRange: - max: 6081 - min: 6081 - - ingressRule: - description: Worker node to default NodePort ingress communication - isStateless: false - protocol: "6" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 32767 - min: 30000 - name: worker - role: worker ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlaneTemplate -metadata: - name: tkg-oci-kcp - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - kubeadmConfigSpec: - files: [] - preKubeadmCommands: - #! Ensure a non-empty preKubeadmCommands array is present to facilitate patching - - echo "running preKubeadmCommands..." - useExperimentalRetryJoin: true - clusterConfiguration: - apiServer: - timeoutForControlPlane: "8m0s" - extraVolumes: [] - extraArgs: {} - controllerManager: - extraArgs: {} - dns: - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - extraArgs: {} - imageRepository: dummy.registry.vmware.com - scheduler: - extraArgs: {} - initConfiguration: - nodeRegistration: - name: '{{ ds["hostname"] }}' - kubeletExtraArgs: {} - joinConfiguration: - nodeRegistration: - name: '{{ ds["hostname"] }}' - kubeletExtraArgs: {} ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: OCIMachineTemplate -metadata: - name: tkg-controlplane-oci-template - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - #! will be replaced by shape variable defined above - shape: VM.Standard.E4.Flex - metadata: {} - shapeConfig: {} - ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: OCIMachineTemplate -metadata: - name: tkg-oci-worker-template - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - #! will be replaced by shape variable defined above - shape: VM.Standard.E4.Flex - metadata: {} - shapeConfig: {} ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: tkg-oci-bootstrap-template - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - joinConfiguration: - nodeRegistration: - kubeletExtraArgs: {} - preKubeadmCommands: [] - files: [] diff --git a/packages/tkg-clusterclass-oci/bundle/config/upstream/overlay-kube-apiserver-admission.yaml b/packages/tkg-clusterclass-oci/bundle/config/upstream/overlay-kube-apiserver-admission.yaml deleted file mode 100644 index 965c26e66d..0000000000 --- a/packages/tkg-clusterclass-oci/bundle/config/upstream/overlay-kube-apiserver-admission.yaml +++ /dev/null @@ -1,192 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/append - - name: eventRateLimitConf - required: false - schema: - openAPIV3Schema: - type: string - default: "" - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/admission-control-config.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: admin-control-conf - hostPath: /etc/kubernetes/admission-control-config.yaml - mountPath: /etc/kubernetes/admission-control-config.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/admission-control-config.yaml - content: |- - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - {{- if and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }} - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - {{- end }} - {{- if .eventRateLimitConf }} - - name: EventRateLimit - path: eventConfig.yaml - {{- end }} - enabledIf: '{{ or (and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version)) (.eventRateLimitConf) }}' - #@overlay/append - - name: eventRateLimitConf - description: "Adds an admission configuration for EventRateLimit." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/enable-admission-plugins" - valueFrom: - template: | - {{ $containEnableAdmissionPlugin := false }} - {{- $admissionPlugins := "" }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "enable-admission-plugins" }} - {{- $containEnableAdmissionPlugin = true }} - {{- $admissionPlugins = $val }} - {{- end }} - {{- end }} - {{- if not $containEnableAdmissionPlugin }} - NodeRestriction,EventRateLimit - {{- else -}} - {{- $admissionPlugins -}},EventRateLimit - {{- end }} - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: event-conf - hostPath: /etc/kubernetes/eventConfig.yaml - mountPath: /etc/kubernetes/eventConfig.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/eventConfig.yaml - encoding: base64 - content: {{ .eventRateLimitConf}} - enabledIf: '{{ not (empty .eventRateLimitConf) }}' diff --git a/packages/tkg-clusterclass-oci/bundle/config/upstream/overlay.yaml b/packages/tkg-clusterclass-oci/bundle/config/upstream/overlay.yaml deleted file mode 100644 index 6efd795148..0000000000 --- a/packages/tkg-clusterclass-oci/bundle/config/upstream/overlay.yaml +++ /dev/null @@ -1,66 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - controlPlane: - #@overlay/match missing_ok=True - machineHealthCheck: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_CONTROL_PLANE: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_CONTROL_PLANE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - workers: - machineDeployments: - #@overlay/match by=overlay.index(0) - - class: tkg-worker - #@overlay/match missing_ok=True - machineHealthCheck: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - patches: - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: CAPOCI_KCP_INIT_EMPTY_FILES_ARRAY - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: KCP_INIT_APISERVER_EMPTY_EXTRAVOLUMES_ARRAY diff --git a/packages/tkg-clusterclass-oci/bundle/config/values.yaml b/packages/tkg-clusterclass-oci/bundle/config/values.yaml deleted file mode 100644 index c5eca4eefd..0000000000 --- a/packages/tkg-clusterclass-oci/bundle/config/values.yaml +++ /dev/null @@ -1,17 +0,0 @@ -#@data/values - -#@overlay/match-child-defaults missing_ok=True ---- - -#! User configurable values for tkg-clusterclass-oci - -ENABLE_MHC: true -ENABLE_MHC_WORKER_NODE: true -ENABLE_MHC_CONTROL_PLANE: true -MHC_UNKNOWN_STATUS_TIMEOUT: 5m -MHC_FALSE_STATUS_TIMEOUT: 12m -MHC_MAX_UNHEALTHY_CONTROL_PLANE: 100% -MHC_MAX_UNHEALTHY_WORKER_NODE: 100% -NODE_STARTUP_TIMEOUT: 20m -NAMESPACE: tkg-system -CNI: antrea diff --git a/packages/tkg-clusterclass-oci/metadata.yaml b/packages/tkg-clusterclass-oci/metadata.yaml deleted file mode 100644 index a6f9c6a01b..0000000000 --- a/packages/tkg-clusterclass-oci/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkg-clusterclass-oci.tanzu.vmware.com - namespace: tkg-clusterclass-oci -spec: - displayName: "tkg-clusterclass-oci" - longDescription: "ClusterClass for OCI defines the default set of OCI ClusterClass resources for Tanzu" - shortDescription: "Defines the OCI ClusterClass resources for Tanzu" - providerName: VMware - maintainers: - - name: "" - categories: - - "clusterclass" diff --git a/packages/tkg-clusterclass-oci/package.yaml b/packages/tkg-clusterclass-oci/package.yaml deleted file mode 100644 index f436ac9330..0000000000 --- a/packages/tkg-clusterclass-oci/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkg-clusterclass-oci.tanzu.vmware.com - namespace: tkg-clusterclass-oci -spec: - refName: tkg-clusterclass-oci.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkg-clusterclass-oci/vendir.lock.yml b/packages/tkg-clusterclass-oci/vendir.lock.yml deleted file mode 100644 index 96a4894c49..0000000000 --- a/packages/tkg-clusterclass-oci/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/tkg-clusterclass-oci/vendir.yml b/packages/tkg-clusterclass-oci/vendir.yml deleted file mode 100644 index 963f250148..0000000000 --- a/packages/tkg-clusterclass-oci/vendir.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 diff --git a/packages/tkg-clusterclass-vsphere/Makefile b/packages/tkg-clusterclass-vsphere/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/tkg-clusterclass-vsphere/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkg-clusterclass-vsphere/README.md b/packages/tkg-clusterclass-vsphere/README.md deleted file mode 100644 index 0d0456c1b9..0000000000 --- a/packages/tkg-clusterclass-vsphere/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# tkg-clusterclass-vsphere Package - -This package provides << awesome functionality >> using [tkg-clusterclass-vsphere](https://INFO_NEEDED). - -## Components - -## Configuration - -The following configuration values can be set to customize the tkg-clusterclass-vsphere installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -### tkg-clusterclass-vsphere Configuration - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -## Usage Example - -The following is a basic guide for getting started with tkg-clusterclass-vsphere. diff --git a/packages/tkg-clusterclass-vsphere/bundle/config/upstream/base.yaml b/packages/tkg-clusterclass-vsphere/bundle/config/upstream/base.yaml deleted file mode 100644 index 190da804f8..0000000000 --- a/packages/tkg-clusterclass-vsphere/bundle/config/upstream/base.yaml +++ /dev/null @@ -1,2413 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:regexp", "regexp") - -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereClusterTemplate -metadata: - name: #@ "tkg-vsphere-default-{}-cluster".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - server: #@ data.values.VSPHERE_SERVER - thumbprint: #@ data.values.VSPHERE_TLS_THUMBPRINT ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: #@ "tkg-vsphere-default-{}-control-plane".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - cloneMode: #@ data.values.VSPHERE_CLONE_MODE - datacenter: #@ data.values.VSPHERE_DATACENTER - datastore: #@ data.values.VSPHERE_DATASTORE - storagePolicyName: #@ data.values.VSPHERE_STORAGE_POLICY_ID - diskGiB: #@ data.values.VSPHERE_CONTROL_PLANE_DISK_GIB - folder: #@ data.values.VSPHERE_FOLDER - memoryMiB: #@ data.values.VSPHERE_CONTROL_PLANE_MEM_MIB - network: - devices: - - dhcp4: true - networkName: #@ data.values.VSPHERE_NETWORK - numCPUs: #@ data.values.VSPHERE_CONTROL_PLANE_NUM_CPUS - resourcePool: #@ data.values.VSPHERE_RESOURCE_POOL - server: #@ data.values.VSPHERE_SERVER - template: #@ data.values.VSPHERE_TEMPLATE ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: #@ "tkg-vsphere-default-{}-worker".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - cloneMode: #@ data.values.VSPHERE_CLONE_MODE - datacenter: #@ data.values.VSPHERE_DATACENTER - datastore: #@ data.values.VSPHERE_DATASTORE - storagePolicyName: #@ data.values.VSPHERE_STORAGE_POLICY_ID - diskGiB: #@ data.values.VSPHERE_WORKER_DISK_GIB - folder: #@ data.values.VSPHERE_FOLDER - memoryMiB: #@ data.values.VSPHERE_WORKER_MEM_MIB - network: - devices: - - dhcp4: true - networkName: #@ data.values.VSPHERE_NETWORK - numCPUs: #@ data.values.VSPHERE_WORKER_NUM_CPUS - resourcePool: #@ data.values.VSPHERE_RESOURCE_POOL - server: #@ data.values.VSPHERE_SERVER - template: #@ data.values.VSPHERE_TEMPLATE ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlaneTemplate -metadata: - name: #@ "tkg-vsphere-default-{}-kcp".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - kubeadmConfigSpec: - useExperimentalRetryJoin: true - clusterConfiguration: - imageRepository: dummy.registry.vmware.com - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - extraArgs: {} - dns: - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - apiServer: - timeoutForControlPlane: "8m0s" - extraVolumes: [] - extraArgs: {} - controllerManager: - extraArgs: {} - scheduler: - extraArgs: {} - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data.hostname }}' - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data.hostname }}' - preKubeadmCommands: - - hostname "{{ ds.meta_data.hostname }}" - - echo "::1 ipv6-localhost ipv6-loopback" >/etc/hosts - - echo "127.0.0.1 localhost" >>/etc/hosts - - echo "127.0.0.1 {{ ds.meta_data.hostname }}" >>/etc/hosts - - echo "{{ ds.meta_data.hostname }}" >/etc/hostname - users: - - name: capv - sshAuthorizedKeys: - - #@ data.values.VSPHERE_SSH_AUTHORIZED_KEY - sudo: ALL=(ALL) NOPASSWD:ALL ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "tkg-vsphere-default-{}-md-config".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - useExperimentalRetryJoin: true - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data.hostname }}' - preKubeadmCommands: - - hostname "{{ ds.meta_data.hostname }}" - - echo "::1 ipv6-localhost ipv6-loopback" >/etc/hosts - - echo "127.0.0.1 localhost" >>/etc/hosts - - echo "127.0.0.1 {{ ds.meta_data.hostname }}" >>/etc/hosts - - echo "{{ ds.meta_data.hostname }}" >/etc/hostname - postKubeadmCommands: - - echo "running postKubeadmCommands..." - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - users: - - name: capv - sshAuthorizedKeys: - - #@ data.values.VSPHERE_SSH_AUTHORIZED_KEY - sudo: ALL=(ALL) NOPASSWD:ALL ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - name: #@ "tkg-vsphere-default-{}".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - annotations: - run.tanzu.vmware.com/resolve-tkr: "" -spec: - controlPlane: - ref: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - name: #@ "tkg-vsphere-default-{}-kcp".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - machineInfrastructure: - ref: - kind: VSphereMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-vsphere-default-{}-control-plane".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereClusterTemplate - name: #@ "tkg-vsphere-default-{}-cluster".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - workers: - machineDeployments: - - class: tkg-worker - template: - bootstrap: - ref: - kind: KubeadmConfigTemplate - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-vsphere-default-{}-md-config".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - kind: VSphereMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-vsphere-default-{}-worker".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - - class: tkg-worker-windows - template: - bootstrap: - ref: - kind: KubeadmConfigTemplate - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-vsphere-default-{}-md-config".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - kind: VSphereMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-vsphere-default-{}-worker".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - variables: - - name: vcenter - required: true - schema: - openAPIV3Schema: - type: object - properties: - cloneMode: - type: string - default: fullClone - network: - type: string - default: VMNetwork - datacenter: - type: string - default: "" - datastore: - type: string - default: "" - folder: - type: string - default: "" - resourcePool: - type: string - default: "" - storagePolicyID: - type: string - default: "" - server: - type: string - default: "" - tlsThumbprint: - type: string - default: "" - template: - type: string - default: "" - required: - - datacenter - - datastore - - folder - - resourcePool - - server - - name: VSPHERE_WINDOWS_TEMPLATE - required: false - schema: - openAPIV3Schema: - type: string - default: "" - - name: vipNetworkInterface - required: true - schema: - openAPIV3Schema: - type: string - default: eth0 - - name: cni - required: true - schema: - openAPIV3Schema: - type: string - #@ if data.values.CNI: - default: #@ data.values.CNI - #@ else: - default: "none" - #@ end - - name: network - required: false - schema: - openAPIV3Schema: - type: object - properties: - ipv6Primary: - type: boolean - default: false - addressesFromPools: - type: array - items: - type: object - properties: - apiGroup: - type: string - kind: - type: string - name: - type: string - required: - - apiGroup - - kind - - name - default: [] - default: - ipv6Primary: false - - name: proxy - required: false - schema: - openAPIV3Schema: - type: object - properties: - httpProxy: - type: string - httpsProxy: - type: string - noProxy: - type: array - items: - type: string - default: [] - systemWide: - type: boolean - default: false - required: - - httpProxy - - httpsProxy - - name: imageRepository - required: false - schema: - openAPIV3Schema: - type: object - properties: - host: - type: string - tlsCertificateValidation: - type: boolean - default: true - - name: aviAPIServerHAProvider - required: false - schema: - openAPIV3Schema: - type: boolean - default: false - - name: apiServerEndpoint - required: false - schema: - openAPIV3Schema: - type: string - default: "" - - name: apiServerPort - required: false - schema: - openAPIV3Schema: - type: integer - - name: kubeVipLoadBalancerProvider - required: false - schema: - openAPIV3Schema: - type: boolean - default: false - - name: trust - required: false - schema: - openAPIV3Schema: - type: object - properties: - additionalTrustedCAs: - type: array - items: - type: object - properties: - name: - type: string - data: - type: string - required: - - name - - data - - name: additionalImageRegistries - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - required: - - host - properties: - host: - type: string - skipTlsVerify: - type: boolean - default: false - caCert: - type: string - - name: auditLogging - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: false - default: - enabled: false - - name: user - required: false - schema: - openAPIV3Schema: - type: object - properties: - sshAuthorizedKeys: - type: array - items: - type: string - default: [] - - name: controlPlane - required: true - schema: - openAPIV3Schema: - type: object - properties: - machine: - type: object - properties: - numCPUs: - type: integer - default: 2 - diskGiB: - type: integer - default: 40 - memoryMiB: - type: integer - default: 8192 - customVMXKeys: - type: object - additionalProperties: - type: string - default: {} - network: - type: object - properties: - nameservers: - type: array - items: - type: string - default: [] - searchDomains: - type: array - items: - type: string - default: [] - nodeLabels: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: worker - required: false - schema: - openAPIV3Schema: - type: object - properties: - machine: - type: object - properties: - numCPUs: - type: integer - default: 2 - diskGiB: - type: integer - default: 40 - memoryMiB: - type: integer - default: 4096 - customVMXKeys: - type: object - additionalProperties: - type: string - default: {} - network: - type: object - properties: - nameservers: - type: array - items: - type: string - default: [] - searchDomains: - type: array - items: - type: string - default: [] - - name: nodePoolLabels - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: ntpServers - required: false - schema: - openAPIV3Schema: - type: array - items: - type: string - default: [] - - name: additionalFQDN - required: false - schema: - openAPIV3Schema: - type: array - items: - type: string - default: [] - - name: TKR_DATA - required: false - schema: - openAPIV3Schema: - type: object - properties: {} - - name: controlPlaneTaint - required: false - schema: - openAPIV3Schema: - type: boolean - default: true - - name: etcdExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: apiServerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeSchedulerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeControllerManagerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: controlPlaneKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: workerKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: tlsCipherSuites - required: false - schema: - openAPIV3Schema: - type: string - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - - name: identityRef - required: false - schema: - openAPIV3Schema: - type: object - properties: - name: - type: string - kind: - type: string - required: - - name - - kind - - name: controlPlaneCertificateRotation - required: false - schema: - openAPIV3Schema: - type: object - properties: - activate: - type: boolean - default: true - daysBefore: - type: integer - format: int32 - minimum: 7 - default: 90 - default: - activate: true - daysBefore: 90 - - name: customTDNFRepository - required: false - schema: - openAPIV3Schema: - type: object - properties: - certificate: - type: string - - name: pci - required: false - schema: - openAPIV3Schema: - type: object - properties: - worker: - type: object - properties: - devices: - type: array - items: - type: object - properties: - vendorId: - type: number - deviceId: - type: number - required: - - deviceId - - vendorId - default: [] - hardwareVersion: - type: string - default: vmx-15 - controlPlane: - type: object - properties: - devices: - type: array - items: - type: object - properties: - vendorId: - type: number - deviceId: - type: number - required: - - deviceId - - vendorId - default: [] - hardwareVersion: - type: string - default: vmx-15 - patches: - - name: etcdExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .etcdExtraArgs }} - {{- if eq $key "cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: apiServerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - - name: kubeSchedulerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/scheduler/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .kubeSchedulerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: kubeControllerManagerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .kubeControllerManagerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - - name: controlPlaneKubeletExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - - name: workerKubeletExtraArgs - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - - tkg-worker-windows - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .workerKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - - name: vsphereClusterTemplate - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/controlPlaneEndpoint - valueFrom: - template: | - host: '{{ .apiServerEndpoint }}' - port: 6443 - - op: replace - path: /spec/template/spec/thumbprint - valueFrom: - variable: vcenter.tlsThumbprint - - op: replace - path: /spec/template/spec/server - valueFrom: - variable: vcenter.server - - name: vSphereClusterIdentityRef - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/identityRef - valueFrom: - template: | - {{ if .identityRef -}} - kind: {{ .identityRef.kind }} - name: {{ .identityRef.name }} - {{- else -}} - kind: Secret - name: '{{ .builtin.cluster.name }}' - {{- end }} - - name: controlPlaneMachineTemplate - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/numCPUs - valueFrom: - variable: controlPlane.machine.numCPUs - - op: replace - path: /spec/template/spec/diskGiB - valueFrom: - variable: controlPlane.machine.diskGiB - - op: replace - path: /spec/template/spec/memoryMiB - valueFrom: - variable: controlPlane.machine.memoryMiB - - op: replace - path: /spec/template/spec/cloneMode - valueFrom: - variable: vcenter.cloneMode - - op: replace - path: /spec/template/spec/network - valueFrom: - variable: vcenter.network - - op: replace - path: /spec/template/spec/datacenter - valueFrom: - variable: vcenter.datacenter - - op: replace - path: /spec/template/spec/datastore - valueFrom: - variable: vcenter.datastore - - op: replace - path: /spec/template/spec/folder - valueFrom: - variable: vcenter.folder - - op: replace - path: /spec/template/spec/resourcePool - valueFrom: - variable: vcenter.resourcePool - - op: replace - path: /spec/template/spec/storagePolicyName - valueFrom: - variable: vcenter.storagePolicyID - - op: replace - path: /spec/template/spec/server - valueFrom: - variable: vcenter.server - - op: replace - path: /spec/template/spec/template - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).osImageRef.template }}' - - name: workerMachineTemplate - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - - tkg-worker-windows - jsonPatches: - - op: replace - path: /spec/template/spec/numCPUs - valueFrom: - variable: worker.machine.numCPUs - - op: replace - path: /spec/template/spec/diskGiB - valueFrom: - variable: worker.machine.diskGiB - - op: replace - path: /spec/template/spec/memoryMiB - valueFrom: - variable: worker.machine.memoryMiB - - op: replace - path: /spec/template/spec/cloneMode - valueFrom: - variable: vcenter.cloneMode - - op: replace - path: /spec/template/spec/network - valueFrom: - variable: vcenter.network - - op: replace - path: /spec/template/spec/datacenter - valueFrom: - variable: vcenter.datacenter - - op: replace - path: /spec/template/spec/datastore - valueFrom: - variable: vcenter.datastore - - op: replace - path: /spec/template/spec/folder - valueFrom: - variable: vcenter.folder - - op: replace - path: /spec/template/spec/resourcePool - valueFrom: - variable: vcenter.resourcePool - - op: replace - path: /spec/template/spec/storagePolicyName - valueFrom: - variable: vcenter.storagePolicyID - - op: replace - path: /spec/template/spec/server - valueFrom: - variable: vcenter.server - - op: replace - path: /spec/template/spec/template - valueFrom: - template: '{{ (index .TKR_DATA .builtin.machineDeployment.version).osImageRef.template }}' - - name: kubeadmControlPlaneTemplate - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/users - valueFrom: - template: | - - name: capv - sshAuthorizedKeys: - {{- range .user.sshAuthorizedKeys }} - - ' {{- . -}} ' - {{- end }} - sudo: ALL=(ALL) NOPASSWD:ALL - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageTag - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.etcd.imageTag}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageTag - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.coredns.imageTag}}' - - name: KubeadmConfigTemplate - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: replace - path: /spec/template/spec/users - valueFrom: - template: | - - name: capv - sshAuthorizedKeys: - {{- range .user.sshAuthorizedKeys }} - - ' {{- . -}} ' - {{- end }} - sudo: ALL=(ALL) NOPASSWD:ALL - - name: kubeVIPPod - enabledIf: '{{ not .aviAPIServerHAProvider }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - owner: root:root - path: /etc/kubernetes/manifests/kube-vip.yaml - content: | - --- - apiVersion: v1 - kind: Pod - metadata: - creationTimestamp: null - name: kube-vip - namespace: kube-system - spec: - containers: - - args: - - manager - env: - - name: cp_enable - value: "true" - - name: svc_enable - value: "{{ .kubeVipLoadBalancerProvider }}" - - name: vip_arp - value: "true" - - name: vip_leaderelection - value: "true" - - name: address - value: {{ .apiServerEndpoint }} - {{- if and (not .aviControlPlaneHAProvider) .apiServerPort }} - - name: port - value: "{{ .apiServerPort }}" - {{- end }} - - name: vip_interface - value: {{ .vipNetworkInterface }} - - name: vip_leaseduration - value: "30" - - name: vip_renewdeadline - value: "20" - - name: vip_retryperiod - value: "4" - image: {{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}/kube-vip:{{(index (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec "kube-vip").imageTag}} - imagePullPolicy: IfNotPresent - name: kube-vip - resources: {} - securityContext: - capabilities: - add: - - NET_ADMIN - - NET_RAW - volumeMounts: - - mountPath: /etc/kubernetes/admin.conf - name: kubeconfig - hostNetwork: true - hostAliases: - - hostnames: - - kubernetes - ip: 127.0.0.1 - volumes: - - hostPath: - path: /etc/kubernetes/admin.conf - type: FileOrCreate - name: kubeconfig - status: {} - - name: networkConfiguration - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/network - valueFrom: - template: | - devices: - - networkName: {{ .vcenter.network }} - {{ if .controlPlane.network.nameservers -}} - nameservers: - {{- range .controlPlane.network.nameservers }} - - {{ . }} - {{- end }} - {{- end }} - {{ if .controlPlane.network.searchDomains -}} - searchDomains: - {{- range .controlPlane.network.searchDomains }} - - {{ . }} - {{- end }} - {{- end }} - {{ if list "IPv4" "DualStack" | has .builtin.cluster.network.ipFamily | and (empty .network.addressesFromPools) -}} - dhcp4: true - {{ if .controlPlane.network.nameservers -}} - dhcp4Overrides: - useDNS: false - {{- end }} - {{- end }} - {{ if list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily | and (empty .network.addressesFromPools) -}} - dhcp6: true - {{ if .controlPlane.network.nameservers -}} - dhcp6Overrides: - useDNS: false - {{- end }} - {{- end }} - {{ if .network.addressesFromPools -}} - addressesFromPools: - {{- range .network.addressesFromPools }} - - apiGroup: {{ .apiGroup }} - kind: {{ .kind }} - name: {{ .name }} - {{- end }} - {{- end }} - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - - tkg-worker-windows - jsonPatches: - - op: add - path: /spec/template/spec/network - valueFrom: - template: | - devices: - - networkName: {{ .vcenter.network }} - {{ if .worker.network.nameservers -}} - nameservers: - {{- range .worker.network.nameservers }} - - {{ . }} - {{- end }} - {{- end }} - {{ if .controlPlane.network.searchDomains -}} - searchDomains: - {{- range .controlPlane.network.searchDomains }} - - {{ . }} - {{- end }} - {{- end }} - {{ if list "IPv4" "DualStack" | has .builtin.cluster.network.ipFamily | and (empty .network.addressesFromPools) -}} - dhcp4: true - {{ if .worker.network.nameservers -}} - dhcp4Overrides: - useDNS: false - {{- end }} - {{- end }} - {{ if list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily | and (empty .network.addressesFromPools) -}} - dhcp6: true - {{ if .worker.network.nameservers -}} - dhcp6Overrides: - useDNS: false - {{- end }} - {{- end }} - {{ if .network.addressesFromPools -}} - addressesFromPools: - {{- range .network.addressesFromPools }} - - apiGroup: {{ .apiGroup }} - kind: {{ .kind }} - name: {{ .name }} - {{- end }} - {{- end }} - - name: ipv6localhost - enabledIf: '{{ list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: echo "::1 localhost" >> /etc/hosts - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: echo "::1 localhost" >> /etc/hosts - - name: clusterApiServerPort - enabledIf: '{{ not (empty .apiServerPort) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: replace - path: /spec/template/spec/controlPlaneEndpoint/port - valueFrom: - variable: apiServerPort - - name: apiServerEndpointConfiguration - enabledIf: '{{ and (not .aviAPIServerHAProvider) (not (empty .apiServerPort)) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/localAPIEndpoint - valueFrom: - template: | - {{ if .builtin.cluster.network.ipFamily | eq "IPv6" | or (.builtin.cluster.network.ipFamily | eq "DualStack" | and (.network.ipv6Primary | default false)) -}} - advertiseAddress: '::/0' - {{- else -}} - advertiseAddress: '0.0.0.0' - {{- end }} - bindPort: {{ .apiServerPort }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/controlPlane - valueFrom: - template: | - localAPIEndpoint: - {{ if .builtin.cluster.network.ipFamily | eq "IPv6" | or (.builtin.cluster.network.ipFamily | eq "DualStack" | and (.network.ipv6Primary | default false)) -}} - advertiseAddress: '::/0' - {{- else -}} - advertiseAddress: '0.0.0.0' - {{- end }} - bindPort: {{ .apiServerPort }} - - name: bindAddressConfiguration - enabledIf: '{{ .builtin.cluster.network.ipFamily | eq "DualStack" | and (.network.ipv6Primary | default false) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/node-ip - value: "::" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-ip - value: "::" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/advertise-address - valueFrom: - variable: apiServerEndpoint - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/bind-address - value: "::" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs/bind-address - value: "::" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/scheduler/extraArgs/bind-address - value: "::" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-ip - value: "::" - - name: ipv6KubeletNodeIPConfiguration - enabledIf: '{{ and (.builtin.cluster.network.ipFamily | eq "IPv6" | or (.builtin.cluster.network.ipFamily | eq "DualStack" | and (.network.ipv6Primary | default false))) (not .aviAPIServerHAProvider) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - value: - content: "" - owner: root:root - path: /etc/sysconfig/kubelet - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: "echo \"$(ip -6 -json addr show dev eth0 scope global | jq -r .[0].addr_info[0].local) $(hostname)\" >> /etc/hosts" - - name: nodeLabels - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if regexMatch "^(?:[a-zA-z])(?:[-\\w\\.]*[a-zA-z])$" $val }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if regexMatch "^(?:[a-zA-z])(?:[-\\w\\.]*[a-zA-z])$" $val }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - - tkg-worker-windows - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.machineDeployment.version).labels }} - {{- if regexMatch "^(?:[a-zA-z])(?:[-\\w\\.]*[a-zA-z])$" $val }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end }} - {{- end }} - {{- if .nodePoolLabels -}} - , - {{- $first := true }} - {{- range .nodePoolLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - name: httpProxy - enabledIf: '{{ not (empty .proxy) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &containerdProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /etc/systemd/system/containerd.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &kubeletProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /usr/lib/systemd/system/kubelet.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPProxy | - export HTTP_PROXY= {{- .proxy.httpProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPSProxy | - export HTTPS_PROXY= {{- .proxy.httpsProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportNoProxy | - export NO_PROXY= {{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *containerdProxyConf - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *kubeletProxyConf - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPSProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportNoProxy - - name: httpProxyCACert - enabledIf: '{{ $hasProxyCert := false }} {{- range .trust.additionalTrustedCAs }} {{- if .name | eq "proxy" }} {{- $hasProxyCert = true }} {{- end }} {{- end }} {{- $hasProxyCert }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - name: customizedImageRepo - enabledIf: '{{ not (empty .imageRepository.host) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - name: registryCACert - enabledIf: '{{ not (empty .trust.additionalTrustedCAs) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/containerd/ {{- index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} .crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/containerd/{{ index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }}.crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - name: additionalRegistryCACerts - enabledIf: '{{ not (empty .additionalImageRegistries) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &insertCAScript | - path: /tmp/insert_registry_ca_certs.sh - content: | - #!/bin/bash - set -e - {{- range .additionalImageRegistries }} - {{- if eq .skipTlsVerify false }} - echo '{{ .caCert }}' | base64 -d > /etc/containerd/{{ .host }}.crt - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo ' ca_file = "/etc/containerd/{{ .host }}.crt"' >> /etc/containerd/config.toml - {{- else }} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo " insecure_skip_verify = true" >> /etc/containerd/config.toml - {{- end }} - {{- end }} - permissions: "0755" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *insertCAScript - - name: auditLogging - enabledIf: '{{ .auditLogging.enabled }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-path - value: /var/log/kubernetes/audit.log - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-policy-file - value: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxage - value: "30" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxbackup - value: "10" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxsize - value: "100" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-policy - hostPath: /etc/kubernetes/audit-policy.yaml - mountPath: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-logs - hostPath: /var/log/kubernetes - mountPath: /var/log/kubernetes - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - value: - path: /etc/kubernetes/audit-policy.yaml - owner: "root:root" - permissions: "0600" - content: | - --- - apiVersion: audit.k8s.io/v1 - kind: Policy - rules: - #! The following requests were manually identified as high-volume and low-risk, - #! so drop them. - - level: None - users: ["system:serviceaccount:kube-system:kube-proxy"] - verbs: ["watch"] - resources: - - group: "" #! core - resources: ["endpoints", "services", "services/status"] - - level: None - userGroups: ["system:nodes"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["nodes", "nodes/status"] - - level: None - users: - - system:kube-controller-manager - - system:kube-scheduler - - system:serviceaccount:kube-system:endpoint-controller - verbs: ["get", "update"] - namespaces: ["kube-system"] - resources: - - group: "" #! core - resources: ["endpoints"] - - level: None - users: ["system:apiserver"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["namespaces", "namespaces/status", "namespaces/finalize"] - #! Don't log HPA fetching metrics. - - level: None - users: - - system:kube-controller-manager - verbs: ["get", "list"] - resources: - - group: "metrics.k8s.io" - #! Don't log these read-only URLs. - - level: None - nonResourceURLs: - - /healthz* - - /version - - /swagger* - #! Don't log events requests. - - level: None - resources: - - group: "" #! core - resources: ["events"] - #! Don't log TMC service account performing read operations because they are high-volume. - - level: None - userGroups: ["system:serviceaccounts:vmware-system-tmc"] - verbs: ["get", "list", "watch"] - #! Don't log read requests from garbage collector because they are high-volume. - - level: None - users: ["system:serviceaccount:kube-system:generic-garbage-collector"] - verbs: ["get", "list", "watch"] - #! node and pod status calls from nodes are high-volume and can be large, don't log responses for expected updates from nodes - - level: Request - userGroups: ["system:nodes"] - verbs: ["update","patch"] - resources: - - group: "" #! core - resources: ["nodes/status", "pods/status"] - omitStages: - - "RequestReceived" - #! deletecollection calls can be large, don't log responses for expected namespace deletions - - level: Request - users: ["system:serviceaccount:kube-system:namespace-controller"] - verbs: ["deletecollection"] - omitStages: - - "RequestReceived" - #! Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data, - #! so only log at the Metadata level. - - level: Metadata - resources: - - group: "" #! core - resources: ["secrets", "configmaps"] - - group: authentication.k8s.io - resources: ["tokenreviews"] - omitStages: - - "RequestReceived" - #! Get repsonses can be large; skip them. - - level: Request - verbs: ["get", "list", "watch"] - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for known APIs - - level: RequestResponse - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for all other requests. - - level: Metadata - omitStages: - - "RequestReceived" - - name: controlPlaneTaint - enabledIf: '{{ not .controlPlaneTaint }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/taints - value: [] - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/taints - value: [] - - name: kcptCertificateRotation - enabledIf: '{{ .controlPlaneCertificateRotation.activate }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/rolloutBefore - valueFrom: - template: | - certificatesExpiryDays: {{ .controlPlaneCertificateRotation.daysBefore }} - - name: windows - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker-windows - jsonPatches: - - op: remove - path: /spec/template/spec/useExperimentalRetryJoin - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/criSocket - value: npipe:////./pipe/containerd-containerd - - op: remove - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/tls-cipher-suites - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/register-with-taints - value: os=windows:NoSchedule - - op: replace - path: /spec/template/spec/joinConfiguration/nodeRegistration/name - value: '{{ ds.meta_data.hostname }}' - - op: replace - path: /spec/template/spec/preKubeadmCommands - valueFrom: - template: | - - echo | set /p="::1 ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6" > C:\etc\hosts & echo. >> C:\etc\hosts - - echo | set /p="127.0.0.1 {{" {{ ds.meta_data.hostname }} "}} localhost localhost.localdomain localhost4 localhost4.localdomain4" >> C:\etc\hosts - - op: add - path: /spec/template/spec/files/- - value: - path: 'C:\k\prevent_windows_updates.ps1' - content: | - Set-Service -Name "wuauserv" -StartupType Disabled -Status Stopped - - op: add - path: /spec/template/spec/files/- - value: - content: | - # Disable firewall for SSH and OVS access - Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False - path: C:\k\disable_firewall.ps1 - - op: add - path: /spec/template/spec/postKubeadmCommands/- - value: powershell c:/k/prevent_windows_updates.ps1 -ExecutionPolicy Bypass - - op: add - path: /spec/template/spec/postKubeadmCommands/- - value: powershell c:/k/disable_firewall.ps1 - - op: replace - path: /spec/template/spec/users - valueFrom: - template: | - - name: capv - groups: Administrators - sshAuthorizedKeys: - {{- range .user.sshAuthorizedKeys }} - - ' {{- . -}} ' - {{- end }} - sudo: ALL=(ALL) NOPASSWD:ALL - - name: windows-antrea - enabledIf: '{{ .cni | eq "antrea" }}' - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker-windows - jsonPatches: - - op: add - path: /spec/template/spec/files/- - value: - path: 'C:\Temp\antrea.ps1' - content: | - function WaitForSaToken($KubeCfgFile, $ServiceAcctName) { - $SaToken = $null - $LoopCount = 400 - do { - $LoopCount = $LoopCount - 1 - if ($LoopCount -eq 0) { - break - } - sleep 5 - $SaToken=$(kubectl --kubeconfig=$KubeCfgFile get secrets -n kube-system -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='$ServiceAcctName')].data.token}") - } while ($SaToken -eq $null) - return $SaToken - } - - $TempFolder = 'C:\programdata\temp' - $AntreaInTempFolder = "$TempFolder\antrea-windows-advanced.zip" - $KubeproxyInTempFolder = "$TempFolder\kube-proxy.exe" - - # Create Folders - $folders = @('C:\k\antrea', 'C:\var\log\antrea', 'C:\k\antrea\bin', 'C:\var\log\kube-proxy', 'C:\opt\cni\bin', 'C:\etc\cni\net.d') - foreach ($f in $folders) { - New-Item -ItemType Directory -Force -Path $f - } - - # Add Windows Defender Options - $avexceptions = @('C:\program files\containerd\ctr.exe', 'C:\program files\containerd\containerd.exe') - foreach ($e in $avexceptions) { - Add-MpPreference -ExclusionProcess $e - } - - # Extract Antrea, Antrea binary should be packed into windows OVA already - $antreaZipFile = 'C:\k\antrea\antrea-windows-advanced.zip' - if (!(Test-Path $antreaZipFile)) { - cp $AntreaInTempFolder $antreaZipFile - } - Expand-Archive -Force -Path $antreaZipFile -DestinationPath C:\k\antrea - cp C:\k\antrea\bin\antrea-cni.exe C:\opt\cni\bin\antrea.exe -Force - cp C:\k\antrea\bin\host-local.exe C:\opt\cni\bin\host-local.exe -Force - cp C:\k\antrea\etc\antrea-cni.conflist C:\etc\cni\net.d\10-antrea.conflist -Force - - # Get HostIP and set in kubeadm-flags.env - [Environment]::SetEnvironmentVariable("NODE_NAME", (hostname).ToLower()) - $env:HostIP = ( - Get-NetIPConfiguration | - Where-Object { - $_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.Status -ne "Disconnected" - } - ).IPv4Address.IPAddress - $file = 'C:\var\lib\kubelet\kubeadm-flags.env' - $newstr = "--node-ip=" + $env:HostIP - $raw = Get-Content -Path $file -TotalCount 1 - $raw = $raw -replace ".$" - $new = "$($raw) $($newstr)`"" - Set-Content $file $new - - $KubeConfigFile = 'C:\etc\kubernetes\kubelet.conf' - - # Wait for antrea-agent token to be ready, the token will be used by Install-AntreaAgent - $AntreaAgentToken = (WaitForSaToken $KubeConfigFile 'antrea-agent') - - # Setup Kube-Proxy config file - $KubeProxyToken = (WaitForSaToken $KubeConfigFile 'kube-proxy-windows') - $KubeProxyConfig = 'C:\k\antrea\etc\kube-proxy.conf' - $KubeAPIServer = $(kubectl --kubeconfig=$KubeConfigFile config view -o jsonpath='{.clusters[0].cluster.server}') - $KubeProxyToken = $([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($KubeProxyToken))) - kubectl config --kubeconfig=$KubeProxyConfig set-cluster kubernetes --server=$KubeAPIServer --insecure-skip-tls-verify - kubectl config --kubeconfig=$KubeProxyConfig set-credentials kube-proxy-windows --token=$KubeProxyToken - kubectl config --kubeconfig=$KubeProxyConfig set-context kube-proxy-windows@kubernetes --cluster=kubernetes --user=kube-proxy-windows - kubectl config --kubeconfig=$KubeProxyConfig use-context kube-proxy-windows@kubernetes - - # kube-proxy.exe should be packed into windows OVA - if (!(Test-Path 'C:\k\kube-proxy.exe')) { - cp $KubeproxyInTempFolder 'C:\k\kube-proxy.exe' - } - - # Install antrea-agent & OVS - Import-Module C:\k\antrea\helper.psm1 - & Install-AntreaAgent -KubernetesHome "C:\k" -KubeConfig "C:\etc\kubernetes\kubelet.conf" -AntreaHome "C:\k\antrea" -AntreaVersion "1.7.1" - New-KubeProxyServiceInterface - & C:\k\antrea\Install-OVS.ps1 -ImportCertificate $false -LocalFile C:\k\antrea\ovs-win64.zip - - # Setup Services - $nssm = (Get-Command nssm).Source - & $nssm set kubelet start SERVICE_AUTO_START - & $nssm install kube-proxy "C:\k\kube-proxy.exe" "--proxy-mode=userspace --kubeconfig=$KubeProxyConfig --log-dir=C:\var\log\kube-proxy --logtostderr=false --alsologtostderr" - & $nssm install antrea-agent "C:\k\antrea\bin\antrea-agent.exe" "--config=C:\k\antrea\etc\antrea-agent.conf --logtostderr=false --log_dir=C:\var\log\antrea --alsologtostderr --log_file_max_size=100 --log_file_max_num=4" - & $nssm set antrea-agent DependOnService kube-proxy ovs-vswitchd - & $nssm set antrea-agent Start SERVICE_AUTO_START - - # Start Services - start-service kubelet - start-service kube-proxy - start-service antrea-agent - - op: add - path: /spec/template/spec/postKubeadmCommands/- - value: powershell C:/Temp/antrea.ps1 -ExecutionPolicy Bypass - - name: ntpServers - enabledIf: '{{ not (empty .ntpServers) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/ntp - valueFrom: - template: | - enabled: true - servers: - {{- range .ntpServers }} - - {{ . }} - {{- end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/ntp - valueFrom: - template: | - enabled: true - servers: - {{- range .ntpServers }} - - {{ . }} - {{- end }} - - name: additionalFQDN - enabledIf: '{{ not (empty .additionalFQDN) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/certSANs - valueFrom: - template: | - {{- range .additionalFQDN }} - - {{ . }} - {{- end }} - - name: addCustomTDNFRepository - enabledIf: '{{ not (empty .customTDNFRepository) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: 'rm -rf /etc/yum.repos.d/*' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - {{ if .customTDNFRepository.certificate -}} - path: /etc/ssl/certs/private-tdnf-repository-ca.pem - content: {{.customTDNFRepository.certificate}} - encoding: base64 - permissions: "0444" - {{- end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: 'rm -rf /etc/yum.repos.d/*' - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - {{ if .customTDNFRepository.certificate -}} - path: /etc/ssl/certs/private-tdnf-repository-ca.pem - content: {{.customTDNFRepository.certificate}} - encoding: base64 - permissions: "0444" - {{- end }} - - name: systemWideProxy - enabledIf: '{{ .proxy.systemWide }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTP_PROXY={{- .proxy.httpProxy }}" >> /etc/profile - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTPS_PROXY= {{- .proxy.httpsProxy }}" >> /etc/profile - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo 'export NO_PROXY={{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }}' >> /etc/profile - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTP_PROXY={{- .proxy.httpProxy }}" >> /etc/environment - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTPS_PROXY= {{- .proxy.httpsProxy }}" >> /etc/environment - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo 'export NO_PROXY={{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }}' >> /etc/environment - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTP_PROXY={{- .proxy.httpProxy }}" >> /etc/profile - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTPS_PROXY= {{- .proxy.httpsProxy }}" >> /etc/profile - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo 'export NO_PROXY={{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }}' >> /etc/profile - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTP_PROXY={{- .proxy.httpProxy }}" >> /etc/environment - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTPS_PROXY= {{- .proxy.httpsProxy }}" >> /etc/environment - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo 'export NO_PROXY={{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }}' >> /etc/environment - - name: pciWorker - enabledIf: '{{ not (empty .pci.worker.devices) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/pciDevices - valueFrom: - template: | - {{- range .pci.worker.devices}} - - deviceId: {{ .deviceId }} - vendorId: {{ .vendorId }} - {{- end }} - - op: add - path: /spec/template/spec/hardwareVersion - valueFrom: - variable: pci.worker.hardwareVersion - - name: pciControlPlane - enabledIf: '{{ not (empty .pci.controlPlane.devices) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/pciDevices - valueFrom: - template: | - {{- range .pci.controlPlane.devices}} - - deviceId: {{ .deviceId }} - vendorId: {{ .vendorId }} - {{- end }} - - op: add - path: /spec/template/spec/hardwareVersion - valueFrom: - variable: pci.controlPlane.hardwareVersion - - name: workerVMCustomizations - enabledIf: '{{ not (empty .worker.machine.customVMXKeys) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/customVMXKeys - valueFrom: - template: | - {{- range $key, $val := .worker.machine.customVMXKeys}} - {{ $key }} : "{{ $val }}" - {{- end }} - - name: controlPlaneVMCustomizations - enabledIf: '{{ not (empty .controlPlane.machine.customVMXKeys) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/customVMXKeys - valueFrom: - template: | - {{- range $key, $val := .controlPlane.machine.customVMXKeys}} - {{ $key }} : "{{ $val }}" - {{- end }} diff --git a/packages/tkg-clusterclass-vsphere/bundle/config/upstream/overlay-kube-apiserver-admission.yaml b/packages/tkg-clusterclass-vsphere/bundle/config/upstream/overlay-kube-apiserver-admission.yaml deleted file mode 100644 index 965c26e66d..0000000000 --- a/packages/tkg-clusterclass-vsphere/bundle/config/upstream/overlay-kube-apiserver-admission.yaml +++ /dev/null @@ -1,192 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/append - - name: eventRateLimitConf - required: false - schema: - openAPIV3Schema: - type: string - default: "" - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/admission-control-config.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: admin-control-conf - hostPath: /etc/kubernetes/admission-control-config.yaml - mountPath: /etc/kubernetes/admission-control-config.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/admission-control-config.yaml - content: |- - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - {{- if and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }} - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - {{- end }} - {{- if .eventRateLimitConf }} - - name: EventRateLimit - path: eventConfig.yaml - {{- end }} - enabledIf: '{{ or (and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version)) (.eventRateLimitConf) }}' - #@overlay/append - - name: eventRateLimitConf - description: "Adds an admission configuration for EventRateLimit." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/enable-admission-plugins" - valueFrom: - template: | - {{ $containEnableAdmissionPlugin := false }} - {{- $admissionPlugins := "" }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "enable-admission-plugins" }} - {{- $containEnableAdmissionPlugin = true }} - {{- $admissionPlugins = $val }} - {{- end }} - {{- end }} - {{- if not $containEnableAdmissionPlugin }} - NodeRestriction,EventRateLimit - {{- else -}} - {{- $admissionPlugins -}},EventRateLimit - {{- end }} - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: event-conf - hostPath: /etc/kubernetes/eventConfig.yaml - mountPath: /etc/kubernetes/eventConfig.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/eventConfig.yaml - encoding: base64 - content: {{ .eventRateLimitConf}} - enabledIf: '{{ not (empty .eventRateLimitConf) }}' diff --git a/packages/tkg-clusterclass-vsphere/bundle/config/upstream/overlay.yaml b/packages/tkg-clusterclass-vsphere/bundle/config/upstream/overlay.yaml deleted file mode 100644 index 3638492bd7..0000000000 --- a/packages/tkg-clusterclass-vsphere/bundle/config/upstream/overlay.yaml +++ /dev/null @@ -1,95 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - namespace: #@ data.values.NAMESPACE -spec: - controlPlane: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_CONTROL_PLANE: - #@overlay/match missing_ok=True - machineHealthCheck: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_CONTROL_PLANE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - workers: - machineDeployments: - #@overlay/match by="class" - - class: tkg-worker - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - #@overlay/match missing_ok=True - machineHealthCheck: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - - #@overlay/match by="class", missing_ok=True - - class: tkg-worker-windows - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - #@overlay/match missing_ok=True - machineHealthCheck: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - patches: - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: KCP_INIT_APISERVER_EMPTY_EXTRAVOLUMES_ARRAY - #@overlay/append - - name: restartContainerdService - enabledIf: '{{ not (and (empty .proxy) (empty .trust.additionalTrustedCAs) (empty .imageRepository.host) (empty .additionalImageRegistries)) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl restart containerd - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl restart containerd diff --git a/packages/tkg-clusterclass-vsphere/bundle/config/values.yaml b/packages/tkg-clusterclass-vsphere/bundle/config/values.yaml deleted file mode 100644 index 0fa7ae3f7e..0000000000 --- a/packages/tkg-clusterclass-vsphere/bundle/config/values.yaml +++ /dev/null @@ -1,43 +0,0 @@ -#@data/values - -#@overlay/match-child-defaults missing_ok=True ---- - -#! User configurable values for tkg-clusterclass-vsphere - -NAMESPACE: tkg-system -ENABLE_MHC: true -ENABLE_MHC_CONTROL_PLANE: true -ENABLE_MHC_WORKER_NODE: true -MHC_UNKNOWN_STATUS_TIMEOUT: 5m -MHC_FALSE_STATUS_TIMEOUT: 12m -MHC_MAX_UNHEALTHY_CONTROL_PLANE: 100% -MHC_MAX_UNHEALTHY_WORKER_NODE: 100% -NODE_STARTUP_TIMEOUT: 20m -IS_WINDOWS_WORKLOAD_CLUSTER: false -VSPHERE_CLUSTER_CLASS_VERSION: v1.0.0 - -CNI: antrea - -VSPHERE_SERVER: "" -VSPHERE_TLS_THUMBPRINT: "" -VSPHERE_DATACENTER: "" -VSPHERE_DATASTORE: "" -VSPHERE_STORAGE_POLICY_ID: "" -VSPHERE_FOLDER: "" -VSPHERE_NETWORK: "" -VSPHERE_RESOURCE_POOL: "" -VSPHERE_TEMPLATE: "" -VSPHERE_SSH_AUTHORIZED_KEY: "" -VSPHERE_USERNAME: "" -VSPHERE_PASSWORD: "" - -VSPHERE_CONTROL_PLANE_DISK_GIB: 40 -VSPHERE_CONTROL_PLANE_MEM_MIB: 8192 -VSPHERE_CONTROL_PLANE_NUM_CPUS: 2 -VSPHERE_WORKER_NUM_CPUS: 2 -VSPHERE_WORKER_DISK_GIB: 40 -VSPHERE_WORKER_MEM_MIB: 4096 -VSPHERE_CLONE_MODE: "fullClone" - -CLUSTER_NAME: management-cluster diff --git a/packages/tkg-clusterclass-vsphere/kbld-config.yaml b/packages/tkg-clusterclass-vsphere/kbld-config.yaml deleted file mode 100644 index cf7896c6c3..0000000000 --- a/packages/tkg-clusterclass-vsphere/kbld-config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -apiVersion: kbld.k14s.io/v1alpha1 -kind: Config diff --git a/packages/tkg-clusterclass-vsphere/metadata.yaml b/packages/tkg-clusterclass-vsphere/metadata.yaml deleted file mode 100644 index 0dcd7e7157..0000000000 --- a/packages/tkg-clusterclass-vsphere/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkg-clusterclass-vsphere.tanzu.vmware.com - namespace: tkg-clusterclass-vsphere -spec: - displayName: "tkg-clusterclass-vsphere" - longDescription: "ClusterClass for vSphere defines the default set of vSphere ClusterClass resources for Tanzu" - shortDescription: "Defines the vSphere ClusterClass resources for Tanzu" - providerName: VMware - maintainers: - - name: "" - categories: - - "clusterclass" diff --git a/packages/tkg-clusterclass-vsphere/package.yaml b/packages/tkg-clusterclass-vsphere/package.yaml deleted file mode 100644 index be656f6304..0000000000 --- a/packages/tkg-clusterclass-vsphere/package.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkg-clusterclass-vsphere.tanzu.vmware.com - namespace: tkg-clusterclass-vsphere -spec: - refName: tkg-clusterclass-vsphere.tanzu.vmware.com - version: latest - releaseNotes: "relevant release notes..." - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkg-clusterclass-vsphere/vendir.lock.yml b/packages/tkg-clusterclass-vsphere/vendir.lock.yml deleted file mode 100644 index f1e98d5228..0000000000 --- a/packages/tkg-clusterclass-vsphere/vendir.lock.yml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - manual: {} - path: base.yaml - - manual: {} - path: overlay.yaml - - manual: {} - path: overlay-kube-apiserver-admission.yaml - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/tkg-clusterclass-vsphere/vendir.yml b/packages/tkg-clusterclass-vsphere/vendir.yml deleted file mode 100644 index 6007af6735..0000000000 --- a/packages/tkg-clusterclass-vsphere/vendir.yml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: base.yaml - manual: {} - - path: overlay.yaml - manual: {} - - path: overlay-kube-apiserver-admission.yaml - manual: {} diff --git a/packages/tkg-clusterclass/Makefile b/packages/tkg-clusterclass/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/tkg-clusterclass/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkg-clusterclass/README.md b/packages/tkg-clusterclass/README.md deleted file mode 100644 index 8ef152408b..0000000000 --- a/packages/tkg-clusterclass/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# tkg-clusterclass Package - -This package provides << awesome functionality >> using [tkg-clusterclass](https://INFO_NEEDED). - -## Components - -## Configuration - -The following configuration values can be set to customize the tkg-clusterclass installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -### tkg-clusterclass Configuration - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -## Usage Example - -The following is a basic guide for getting started with tkg-clusterclass. diff --git a/packages/tkg-clusterclass/bundle/config/object-propagation/deployment.yaml b/packages/tkg-clusterclass/bundle/config/object-propagation/deployment.yaml deleted file mode 100644 index 2db9196927..0000000000 --- a/packages/tkg-clusterclass/bundle/config/object-propagation/deployment.yaml +++ /dev/null @@ -1,198 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") - -#@ def get_unsupported_ns(): -#@ unsupported_ns = "(cert-manager, kube-node-lease, kube-public, kube-system, tanzu-auth, tkg-system-public, tkg-system-telemetry, tkr-system, avi-system, tkg-system-networking, secretgen-controller)" -#@ return "!cluster.x-k8s.io/provider, kubernetes.io/metadata.name notin " + unsupported_ns -#@ end - -#@ def getObjectPropagationConfig(): - -#! generic resources from CAPI -- source: - apiVersion: cluster.x-k8s.io/v1beta1 - kind: ClusterClass - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -- source: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -- source: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '!topology.cluster.x-k8s.io/owned' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true - -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "docker": -#! Docker infra specific resources -- source: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerClusterTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -- source: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerMachineTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '!topology.cluster.x-k8s.io/owned' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -#@ end - -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "aws": -#! AWS infra specific resources -- source: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AWSClusterTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -- source: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AWSMachineTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '!topology.cluster.x-k8s.io/owned' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -#@ end - -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "azure": -#! Azure infra specific resources -- source: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -- source: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '!topology.cluster.x-k8s.io/owned' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -#@ end - - -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "oci": -#! Oracle Cloud infra specific resources -- source: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -- source: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -#@ end - -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "vsphere": -#! vSphere infra specific resources -- source: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereClusterTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -- source: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - namespace: #@ data.values.namespaceForPackageInstallation - labelSelector: '!topology.cluster.x-k8s.io/owned' - target: - namespaceLabelSelector: #@ get_unsupported_ns() - detectAndReplaceSourceNSRef: true -#@ end - -#@ end - ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: object-propagation-config - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "object-propagation-controller.tanzu.vmware.com/ConfigMap" -data: - configData: #@ yaml.encode(getObjectPropagationConfig()) ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: object-propagation-controller - name: object-propagation-controller-manager - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting object-propagation-controller.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.1: "delete before deleting object-propagation-controller.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.2: "upsert after upserting object-propagation-controller.tanzu.vmware.com/ConfigMap" - kapp.k14s.io/change-rule.3: "delete before deleting object-propagation-controller.tanzu.vmware.com/ConfigMap" -spec: - replicas: 1 - selector: - matchLabels: - app: object-propagation-controller - template: - metadata: - labels: - app: object-propagation-controller - spec: - containers: - - image: object-propagation-controller:latest - imagePullPolicy: IfNotPresent - name: manager - command: - - /manager - args: - - --metrics-bind-addr=0 - - --input=/dev/config/object-propagation-controller.config - resources: - limits: - cpu: 100m - memory: 200Mi - requests: - cpu: 100m - memory: 40Mi - volumeMounts: - - name: config-mnt - mountPath: /dev/config/object-propagation-controller.config - subPath: configData - serviceAccount: object-propagation-controller-manager-sa - terminationGracePeriodSeconds: 10 - volumes: - - name: config-mnt - configMap: - name: object-propagation-config diff --git a/packages/tkg-clusterclass/bundle/config/object-propagation/rbac.yaml b/packages/tkg-clusterclass/bundle/config/object-propagation/rbac.yaml deleted file mode 100644 index 0c1c683c95..0000000000 --- a/packages/tkg-clusterclass/bundle/config/object-propagation/rbac.yaml +++ /dev/null @@ -1,40 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: object-propagation-controller - name: object-propagation-controller-manager-sa - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "object-propagation-controller.tanzu.vmware.com/serviceaccount" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: object-propagation-controller-manager-role - annotations: - kapp.k14s.io/change-group: "object-propagation-controller.tanzu.vmware.com/serviceaccount" -rules: - # RBAC rules to create PackageInstall CR and service accounts - - apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: object-propagation-controller-manager-clusterrolebinding - annotations: - kapp.k14s.io/change-group: "object-propagation-controller.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.0: "upsert after upserting object-propagation-controller.tanzu.vmware.com/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting object-propagation-controller.tanzu.vmware.com/serviceaccount" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: object-propagation-controller-manager-role -subjects: -- kind: ServiceAccount - name: object-propagation-controller-manager-sa - namespace: #@ data.values.namespaceForPackageInstallation diff --git a/packages/tkg-clusterclass/bundle/config/packageinstalls/tkg-infra-clusterclass-pi.yaml b/packages/tkg-clusterclass/bundle/config/packageinstalls/tkg-infra-clusterclass-pi.yaml deleted file mode 100644 index 4fcbf24fc4..0000000000 --- a/packages/tkg-clusterclass/bundle/config/packageinstalls/tkg-infra-clusterclass-pi.yaml +++ /dev/null @@ -1,80 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -#@ def get_clusterclass_name(): - -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "aws": -#@ return "tkg-clusterclass-aws" -#@ end -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "docker": -#@ return "tkg-clusterclass-docker" -#@ end -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "azure": -#@ return "tkg-clusterclass-azure" -#@ end -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "vsphere": -#@ return "tkg-clusterclass-vsphere" -#@ end -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "oci": -#@ return "tkg-clusterclass-oci.tanzu.vmware.com" -#@ end - -#@ end - -#@ def get_clusterclass_package_name(): - -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "aws": -#@ return "tkg-clusterclass-aws.tanzu.vmware.com" -#@ end -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "docker": -#@ return "tkg-clusterclass-docker.tanzu.vmware.com" -#@ end -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "azure": -#@ return "tkg-clusterclass-azure.tanzu.vmware.com" -#@ end -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "vsphere": -#@ return "tkg-clusterclass-vsphere.tanzu.vmware.com" -#@ end -#@ if data.values.clusterclassInfraPackageValues.infraProvider == "oci": -#@ return "tkg-clusterclass-oci.tanzu.vmware.com" -#@ end - -#@ end - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: #@ get_clusterclass_name() - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkg-infra-clusterclass-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tkg-infra-clusterclass-packageinstall/serviceaccount" - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - serviceAccountName: tanzu-infra-clusterclass-package-sa - packageRef: - refName: #@ get_clusterclass_package_name() - versionSelection: - prereleases: {} - #@ if data.values.clusterclassInfraPackageValues.versionConstraints: - constraints: #@ data.values.clusterclassInfraPackageValues.versionConstraints - #@ end - values: - - secretRef: - name: tkg-clusterclass-infra-values - ---- -apiVersion: v1 -kind: Secret -metadata: - name: tkg-clusterclass-infra-values - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkg-infra-clusterclass-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tkg-infra-clusterclass-packageinstall/serviceaccount" -type: Opaque -stringData: - values.yaml: #@ yaml.encode(data.values.clusterclassInfraPackageValues.configValues) diff --git a/packages/tkg-clusterclass/bundle/config/packageinstalls/tkg-infra-clusterclass-service-account.yaml b/packages/tkg-clusterclass/bundle/config/packageinstalls/tkg-infra-clusterclass-service-account.yaml deleted file mode 100644 index 5660fc3fa1..0000000000 --- a/packages/tkg-clusterclass/bundle/config/packageinstalls/tkg-infra-clusterclass-service-account.yaml +++ /dev/null @@ -1,118 +0,0 @@ -#@ load("@ytt:data", "data") - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tanzu-infra-clusterclass-package-sa - namespace: #@ data.values.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "tkg-infra-clusterclass-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-infra-clusterclass-package-cluster-role - annotations: - kapp.k14s.io/change-group: "tkg-infra-clusterclass-packageinstall/serviceaccount-0" -rules: - - apiGroups: - - "" - resources: - - secrets - - configmaps - - serviceaccounts - - services - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - cluster.x-k8s.io - resources: - - clusterclasses - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - bootstrap.cluster.x-k8s.io - resources: - - kubeadmconfigtemplates - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachinetemplates - - awsclustertemplates - - vspheremachinetemplates - - vsphereclustertemplates - - azuremachinetemplates - - azureclustertemplates - - dockermachinetemplates - - dockerclustertemplates - - ocimachinetemplates - - ociclustertemplates - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - kubeadmcontrolplanetemplates - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - packaging.carvel.dev - resources: - - packageinstalls - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - rbac.authorization.k8s.io - resources: - - clusterroles - - clusterrolebindings - verbs: - - create - - update - - get - - list - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-infra-clusterclass-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "tkg-infra-clusterclass-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting tkg-infra-clusterclass-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting tkg-infra-clusterclass-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-infra-clusterclass-package-cluster-role -subjects: - - kind: ServiceAccount - name: tanzu-infra-clusterclass-package-sa - namespace: #@ data.values.namespaceForPackageInstallation diff --git a/packages/tkg-clusterclass/bundle/config/values.yaml b/packages/tkg-clusterclass/bundle/config/values.yaml deleted file mode 100644 index 531450ae37..0000000000 --- a/packages/tkg-clusterclass/bundle/config/values.yaml +++ /dev/null @@ -1,11 +0,0 @@ -#@data/values ---- - -#! User configurable values for tkg-clusterclass. - -namespaceForPackageInstallation: tkg-system -clusterclassInfraPackageValues: - namespace: tkg-system - infraProvider: "" - configValues: - versionConstraints: diff --git a/packages/tkg-clusterclass/hack/sync-cc.sh b/packages/tkg-clusterclass/hack/sync-cc.sh deleted file mode 100755 index bfd6211e8a..0000000000 --- a/packages/tkg-clusterclass/hack/sync-cc.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -PROVIDERS_DIR=${SCRIPT_DIR}/../../../providers -PKGS_DIR=${SCRIPT_DIR}/../.. -BINNAME="$( basename "${BASH_SOURCE[0]}" )" - -infras="aws vsphere azure docker oci" - -for infra in $infras; do - ls ${PROVIDERS_DIR}/infrastructure-${infra}/v*/cconly/* - rm ${PKGS_DIR}/tkg-clusterclass-${infra}/bundle/config/upstream/* - cp ${PROVIDERS_DIR}/infrastructure-${infra}/v*/cconly/* ${PKGS_DIR}/tkg-clusterclass-${infra}/bundle/config/upstream/ -done - diff --git a/packages/tkg-clusterclass/kbld-config.yaml b/packages/tkg-clusterclass/kbld-config.yaml deleted file mode 100644 index eb98340c24..0000000000 --- a/packages/tkg-clusterclass/kbld-config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: kbld.k14s.io/v1alpha1 -kind: Config -overrides: -- image: object-propagation-controller:latest - newImage: "" diff --git a/packages/tkg-clusterclass/metadata.yaml b/packages/tkg-clusterclass/metadata.yaml deleted file mode 100644 index 0e4a1fc0e1..0000000000 --- a/packages/tkg-clusterclass/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkg-clusterclass.tanzu.vmware.com - namespace: tkg-clusterclass -spec: - displayName: "tkg-clusterclass" - longDescription: "Defines the default set of ClusterClass resources for Tanzu" - shortDescription: "Defines the ClusterClass resources for Tanzu" - providerName: VMware - maintainers: - - name: "" - categories: - - "clusterclass" diff --git a/packages/tkg-clusterclass/package.yaml b/packages/tkg-clusterclass/package.yaml deleted file mode 100644 index f9b8bf08d3..0000000000 --- a/packages/tkg-clusterclass/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkg-clusterclass.tanzu.vmware.com - namespace: tkg-clusterclass -spec: - refName: tkg-clusterclass.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkg-clusterclass/vendir.lock.yml b/packages/tkg-clusterclass/vendir.lock.yml deleted file mode 100644 index 96a4894c49..0000000000 --- a/packages/tkg-clusterclass/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/tkg-clusterclass/vendir.yml b/packages/tkg-clusterclass/vendir.yml deleted file mode 100644 index 963f250148..0000000000 --- a/packages/tkg-clusterclass/vendir.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 diff --git a/packages/tkg-storageclass/Makefile b/packages/tkg-storageclass/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/tkg-storageclass/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkg-storageclass/README.md b/packages/tkg-storageclass/README.md deleted file mode 100644 index dadc66d294..0000000000 --- a/packages/tkg-storageclass/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# tkg-storageclass Package - -This package provides << awesome functionality >> using [tkg-storageclass](https://INFO_NEEDED). - -## Components - -## Configuration - -The following configuration values can be set to customize the tkg-storageclass installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -### tkg-storageclass Configuration - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -## Usage Example - -The following is a basic guide for getting started with tkg-storageclass. diff --git a/packages/tkg-storageclass/bundle/config/upstream/base.yaml b/packages/tkg-storageclass/bundle/config/upstream/base.yaml deleted file mode 100644 index 145799f5fb..0000000000 --- a/packages/tkg-storageclass/bundle/config/upstream/base.yaml +++ /dev/null @@ -1,69 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -#@ if data.values.infraProvider == "aws": ---- -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: default - annotations: - storageclass.kubernetes.io/is-default-class: "true" -provisioner: ebs.csi.aws.com -allowVolumeExpansion: true -#@ end - -#@ if data.values.infraProvider == "azure": ---- -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: default - annotations: - storageclass.kubernetes.io/is-default-class: "true" - labels: - kubernetes.io/cluster-service: "true" -provisioner: disk.csi.azure.com -allowVolumeExpansion: true -parameters: - kind: Managed - storageaccounttype: Standard_LRS - cachingmode: ReadOnly -volumeBindingMode: WaitForFirstConsumer ---- -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: azure-file - labels: - kubernetes.io/cluster-service: "true" -provisioner: file.csi.azure.com -mountOptions: - - dir_mode=0777 - - file_mode=0777 - - uid=0 - - gid=0 - - mfsymlinks - - cache=strict - - actimeo=30 -allowVolumeExpansion: true -parameters: - skuName: Premium_LRS -#@ end - -#@ if data.values.infraProvider == "vsphere": ---- -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: default - annotations: - storageclass.kubernetes.io/is-default-class: "true" -provisioner: csi.vsphere.vmware.com -allowVolumeExpansion: true -#@ if data.values.VSPHERE_STORAGE_POLICY_ID != "": -parameters: - storagepolicyname: #@ data.values.VSPHERE_STORAGE_POLICY_ID -#@ end -#@ end diff --git a/packages/tkg-storageclass/bundle/config/values.yaml b/packages/tkg-storageclass/bundle/config/values.yaml deleted file mode 100644 index 3ee25c8a92..0000000000 --- a/packages/tkg-storageclass/bundle/config/values.yaml +++ /dev/null @@ -1,8 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- - -infraProvider: "" -#! User configurable values for VSPHERE_STORAGE_CLASS_ID - -VSPHERE_STORAGE_POLICY_ID: "" diff --git a/packages/tkg-storageclass/metadata.yaml b/packages/tkg-storageclass/metadata.yaml deleted file mode 100644 index e03546c2ba..0000000000 --- a/packages/tkg-storageclass/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkg-storageclass.tanzu.vmware.com - namespace: tanzu-package-repo-global -spec: - displayName: "tkg-storageclass" - longDescription: "tkg-storageclass defines the storageclass resources for the cluster" - shortDescription: "Defines the storageclass resources for the cluster" - providerName: VMware - maintainers: - - name: "Xiaoshuang Guo" - categories: - - "storageclass" diff --git a/packages/tkg-storageclass/package.yaml b/packages/tkg-storageclass/package.yaml deleted file mode 100644 index ae51c87315..0000000000 --- a/packages/tkg-storageclass/package.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkg-storageclass.tanzu.vmware.com.0.21.0-dev - namespace: tanzu-package-repo-global -spec: - refName: tkg-storageclass.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: - rawOptions: - - --dangerous-allow-empty-list-of-resources=true diff --git a/packages/tkg-storageclass/vendir.lock.yml b/packages/tkg-storageclass/vendir.lock.yml deleted file mode 100755 index 96a4894c49..0000000000 --- a/packages/tkg-storageclass/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/tkg-storageclass/vendir.yml b/packages/tkg-storageclass/vendir.yml deleted file mode 100644 index 963f250148..0000000000 --- a/packages/tkg-storageclass/vendir.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 diff --git a/packages/tkg-windows/Makefile b/packages/tkg-windows/Makefile deleted file mode 100644 index 047b729714..0000000000 --- a/packages/tkg-windows/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkg-windows/README.md b/packages/tkg-windows/README.md deleted file mode 100644 index 6f1c573c60..0000000000 --- a/packages/tkg-windows/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# tkg-windows Package - -The tkg-windows package provides the following services: - -* RBAC objects for Kube-Proxy and Antrea CNI installation on Windows. - -## Configuration - -The following configuration values can be set to customize the tkg-windows installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `namespace` | Optional | Namespace the resources will be created (default: kube-system) | - -## Components - -* Role: node:antrea-read-secret -* RoleBinding: node:read-antrea-sa -* ClusterRole: node: kube-proxy -* ClusterRoleBinding: node:kube-proxy -* ServiceAccount: kube-proxy-windows diff --git a/packages/tkg-windows/bundle/config/upstream/rbac.yaml b/packages/tkg-windows/bundle/config/upstream/rbac.yaml deleted file mode 100644 index fb9653af6d..0000000000 --- a/packages/tkg-windows/bundle/config/upstream/rbac.yaml +++ /dev/null @@ -1,96 +0,0 @@ -#@ load("@ytt:data", "data") - ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - namespace: #@ data.values.namespace - name: node:antrea-read-secrets -rules: -- apiGroups: [""] - resources: ["serviceaccounts"] - resourceNames: ["antrea-agent"] - verbs: ["get"] -- apiGroups: [""] - resources: ["secrets"] - verbs: ["list","get"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: node:read-antrea-sa - namespace: #@ data.values.namespace -subjects: -- kind: Group - name: system:nodes - apiGroup: rbac.authorization.k8s.io -roleRef: - kind: Role - name: node:antrea-read-secrets - apiGroup: rbac.authorization.k8s.io ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: node:kube-proxy -rules: -- apiGroups: - - "" - resources: - - endpoints - - services - verbs: - - get - - list - - watch -- apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - get - - list - - watch - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: node:kube-proxy -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: node:kube-proxy -subjects: -- kind: Group - name: system:nodes - apiGroup: rbac.authorization.k8s.io -- kind: ServiceAccount - name: kube-proxy-windows - namespace: #@ data.values.namespace ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: kube-proxy - name: kube-proxy-windows - namespace: #@ data.values.namespace ---- -apiVersion: v1 -kind: Secret -metadata: - annotations: - kubernetes.io/service-account.name: kube-proxy-windows - name: kube-proxy-windows-token - namespace: #@ data.values.namespace -type: kubernetes.io/service-account-token ---- diff --git a/packages/tkg-windows/bundle/config/values.yaml b/packages/tkg-windows/bundle/config/values.yaml deleted file mode 100644 index 1369deb7a7..0000000000 --- a/packages/tkg-windows/bundle/config/values.yaml +++ /dev/null @@ -1,4 +0,0 @@ -#@data/values ---- - -namespace: kube-system diff --git a/packages/tkg-windows/metadata.yaml b/packages/tkg-windows/metadata.yaml deleted file mode 100644 index d67504e207..0000000000 --- a/packages/tkg-windows/metadata.yaml +++ /dev/null @@ -1,13 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkg-windows.tanzu.vmware.com -spec: - displayName: "tkg-windows" - longDescription: "TKG Windows BYOI resources" - shortDescription: "TKG Windows BYOI resources" - providerName: VMware - maintainers: - - name: "Amim Knabben" - categories: - - "tkg windows" diff --git a/packages/tkg-windows/package.yaml b/packages/tkg-windows/package.yaml deleted file mode 100644 index 9f5a7e736c..0000000000 --- a/packages/tkg-windows/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkg-windows.tanzu.vmware.com -spec: - refName: tkg-windows.tanzu.vmware.com - version: latest - releaseNotes: "Windows RBAC resources installation" - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkg-windows/vendir.lock.yml b/packages/tkg-windows/vendir.lock.yml deleted file mode 100644 index bf8f3781b2..0000000000 --- a/packages/tkg-windows/vendir.lock.yml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - manual: {} - path: rbac.yaml - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/tkg-windows/vendir.yml b/packages/tkg-windows/vendir.yml deleted file mode 100644 index 274c125128..0000000000 --- a/packages/tkg-windows/vendir.yml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: rbac.yaml - manual: {} diff --git a/packages/tkg/Makefile b/packages/tkg/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/tkg/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkg/README.md b/packages/tkg/README.md deleted file mode 100644 index f8845831cd..0000000000 --- a/packages/tkg/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# tkg Package - -This package provides << awesome functionality >> using [tkg](https://INFO_NEEDED). - -## Components - -## Configuration - -The following configuration values can be set to customize the tkg installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -### tkg Configuration - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -## Usage Example - -The following is a basic guide for getting started with tkg. diff --git a/packages/tkg/bundle/config/namespaces/featuregates-package-resources-namespace.yaml b/packages/tkg/bundle/config/namespaces/featuregates-package-resources-namespace.yaml deleted file mode 100644 index 57683dd5e8..0000000000 --- a/packages/tkg/bundle/config/namespaces/featuregates-package-resources-namespace.yaml +++ /dev/null @@ -1,9 +0,0 @@ -#@ load("@ytt:data", "data") - -#@ if data.values.frameworkPackage.featureGatesPackageValues.createNamespace: ---- -apiVersion: v1 -kind: Namespace -metadata: - name: #@ data.values.frameworkPackage.featureGatesPackageValues.namespace -#@ end diff --git a/packages/tkg/bundle/config/namespaces/tkr-service-package-resources-namespace.yaml b/packages/tkg/bundle/config/namespaces/tkr-service-package-resources-namespace.yaml deleted file mode 100644 index c32f2c4784..0000000000 --- a/packages/tkg/bundle/config/namespaces/tkr-service-package-resources-namespace.yaml +++ /dev/null @@ -1,9 +0,0 @@ -#@ load("@ytt:data", "data") - -#@ if data.values.frameworkPackage.tkrServicePackageValues.createNamespace: ---- -apiVersion: v1 -kind: Namespace -metadata: - name: #@ data.values.frameworkPackage.tkrServicePackageValues.namespace -#@ end diff --git a/packages/tkg/bundle/config/packageinstalls/ako-operator-pi.yaml b/packages/tkg/bundle/config/packageinstalls/ako-operator-pi.yaml deleted file mode 100644 index 1ff68b2b42..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/ako-operator-pi.yaml +++ /dev/null @@ -1,33 +0,0 @@ -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") -#@ if data.values.akoOperatorPackage.akoOperator.avi_enable: ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: ako-operator - namespace: tkg-system - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - packageRef: - refName: ako-operator-v2.tanzu.vmware.com - versionSelection: - prereleases: {} - serviceAccountName: ako-operator-v2-package-sa - values: - - secretRef: - name: ako-operator-v2-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: ako-operator-v2-values - namespace: tkg-system - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting ako-operator-v2-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting ako-operator-v2-packageinstall/serviceaccount" -type: Opaque -stringData: - values.yaml: #@ yaml.encode(data.values.akoOperatorPackage) -#@ end diff --git a/packages/tkg/bundle/config/packageinstalls/ako-operator-service-account.yaml b/packages/tkg/bundle/config/packageinstalls/ako-operator-service-account.yaml deleted file mode 100644 index f210f61570..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/ako-operator-service-account.yaml +++ /dev/null @@ -1,41 +0,0 @@ -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") -#@ if data.values.akoOperatorPackage.akoOperator.avi_enable: ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: ako-operator-v2-package-sa - namespace: tkg-system - annotations: - kapp.k14s.io/change-group: "ako-operator-v2-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: ako-operator-v2-package-role - annotations: - kapp.k14s.io/change-group: "ako-operator-v2-packageinstall/serviceaccount-0" -rules: - # RBAC rules to create PackageInstall CR and service accounts - - apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: ako-operator-v2-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "ako-operator-v2-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting ako-operator-v2-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting ako-operator-v2-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: ako-operator-v2-package-role -subjects: - - kind: ServiceAccount - name: ako-operator-v2-package-sa - namespace: tkg-system -#@ end diff --git a/packages/tkg/bundle/config/packageinstalls/core-management-plugins-pi.yaml b/packages/tkg/bundle/config/packageinstalls/core-management-plugins-pi.yaml deleted file mode 100644 index 03f8077d3a..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/core-management-plugins-pi.yaml +++ /dev/null @@ -1,25 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tanzu-core-management-plugins - namespace: #@ data.values.coreManagementPluginsPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting framework-packageinstall/tanzu-framework" - kapp.k14s.io/change-rule.1: "upsert after upserting core-management-plugins-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.2: "delete before deleting core-management-plugins-packageinstall/serviceaccount" - - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - serviceAccountName: core-management-plugins-package-sa - packageRef: - refName: core-management-plugins.tanzu.vmware.com - versionSelection: - prereleases: {} - #@ if data.values.coreManagementPluginsPackage.versionConstraints: - constraints: #@ data.values.coreManagementPluginsPackage.versionConstraints - #@ end diff --git a/packages/tkg/bundle/config/packageinstalls/core-management-plugins-service-account.yaml b/packages/tkg/bundle/config/packageinstalls/core-management-plugins-service-account.yaml deleted file mode 100644 index 7b3581fe4e..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/core-management-plugins-service-account.yaml +++ /dev/null @@ -1,39 +0,0 @@ -#@ load("@ytt:data", "data") - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: core-management-plugins-package-sa - namespace: #@ data.values.coreManagementPluginsPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "core-management-plugins-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: core-management-plugins-package-role - annotations: - kapp.k14s.io/change-group: "core-management-plugins-packageinstall/serviceaccount-0" -rules: - # RBAC rules to create PackageInstall CR and service accounts - - apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: core-management-plugins-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "core-management-plugins-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting core-management-plugins-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting core-management-plugins-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: core-management-plugins-package-role -subjects: - - kind: ServiceAccount - name: core-management-plugins-package-sa - namespace: #@ data.values.coreManagementPluginsPackage.namespaceForPackageInstallation diff --git a/packages/tkg/bundle/config/packageinstalls/framework-pi.yaml b/packages/tkg/bundle/config/packageinstalls/framework-pi.yaml deleted file mode 100644 index 6bb858ab95..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/framework-pi.yaml +++ /dev/null @@ -1,39 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tanzu-framework - namespace: #@ data.values.frameworkPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "framework-packageinstall/tanzu-framework" - kapp.k14s.io/change-rule.0: "upsert after upserting framework-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting framework-packageinstall/serviceaccount" - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - serviceAccountName: tanzu-framework-package-sa - packageRef: - refName: framework.tanzu.vmware.com - versionSelection: - prereleases: {} - #@ if data.values.frameworkPackage.versionConstraints: - constraints: #@ data.values.frameworkPackage.versionConstraints - #@ end - values: - - secretRef: - name: tanzu-framework-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: tanzu-framework-values - namespace: #@ data.values.frameworkPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting framework-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting framework-packageinstall/serviceaccount" -type: Opaque -stringData: - values.yaml: #@ yaml.encode(data.values.frameworkPackage) diff --git a/packages/tkg/bundle/config/packageinstalls/framework-service-account.yaml b/packages/tkg/bundle/config/packageinstalls/framework-service-account.yaml deleted file mode 100644 index 4277e82db2..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/framework-service-account.yaml +++ /dev/null @@ -1,39 +0,0 @@ -#@ load("@ytt:data", "data") - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tanzu-framework-package-sa - namespace: #@ data.values.frameworkPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "framework-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-framework-package-role - annotations: - kapp.k14s.io/change-group: "framework-packageinstall/serviceaccount-0" -rules: - # RBAC rules to create PackageInstall CR and service accounts - - apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-framework-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "framework-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting framework-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting framework-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-framework-package-role -subjects: - - kind: ServiceAccount - name: tanzu-framework-package-sa - namespace: #@ data.values.frameworkPackage.namespaceForPackageInstallation diff --git a/packages/tkg/bundle/config/packageinstalls/tkg-clusterclass-pi.yaml b/packages/tkg/bundle/config/packageinstalls/tkg-clusterclass-pi.yaml deleted file mode 100644 index 5e9e779171..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/tkg-clusterclass-pi.yaml +++ /dev/null @@ -1,48 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -#@ def clusterclassPackageValues(): -namespaceForPackageInstallation: #@ data.values.clusterclassPackage.namespaceForPackageInstallation -clusterclassInfraPackageValues: - namespace: #@ data.values.clusterclassPackage.clusterclassInfraPackageValues.namespace - infraProvider: #@ data.values.metadata.infraProvider - configValues: #@ data.values.configvalues - versionConstraints: #@ data.values.clusterclassPackage.clusterclassInfraPackageValues.versionConstraints -#@ end - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tkg-clusterclass - namespace: #@ data.values.clusterclassPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkg-clusterclass-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tkg-clusterclass-packageinstall/serviceaccount" - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - serviceAccountName: tanzu-tkg-package-sa - packageRef: - refName: tkg-clusterclass.tanzu.vmware.com - versionSelection: - prereleases: {} - #@ if data.values.clusterclassPackage.versionConstraints: - constraints: #@ data.values.clusterclassPackage.versionConstraints - #@ end - values: - - secretRef: - name: tkg-clusterclass-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: tkg-clusterclass-values - namespace: #@ data.values.clusterclassPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkg-clusterclass-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tkg-clusterclass-packageinstall/serviceaccount" -type: Opaque -stringData: - values.yaml: #@ yaml.encode(clusterclassPackageValues()) diff --git a/packages/tkg/bundle/config/packageinstalls/tkg-clusterclass-service-account.yaml b/packages/tkg/bundle/config/packageinstalls/tkg-clusterclass-service-account.yaml deleted file mode 100644 index 0d59a8fd1e..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/tkg-clusterclass-service-account.yaml +++ /dev/null @@ -1,39 +0,0 @@ -#@ load("@ytt:data", "data") - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tanzu-tkg-package-sa - namespace: #@ data.values.clusterclassPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "tkg-clusterclass-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-tkg-package-cluster-role - annotations: - kapp.k14s.io/change-group: "tkg-clusterclass-packageinstall/serviceaccount-0" -rules: - # RBAC rules to create PackageInstall CR and service accounts - - apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-tkg-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "tkg-clusterclass-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting tkg-clusterclass-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting tkg-clusterclass-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-tkg-package-cluster-role -subjects: - - kind: ServiceAccount - name: tanzu-tkg-package-sa - namespace: #@ data.values.clusterclassPackage.namespaceForPackageInstallation diff --git a/packages/tkg/bundle/config/packageinstalls/tkr-source-controller-pi.yaml b/packages/tkg/bundle/config/packageinstalls/tkr-source-controller-pi.yaml deleted file mode 100644 index b1a98fdbc2..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/tkr-source-controller-pi.yaml +++ /dev/null @@ -1,40 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tkr-source-controller - namespace: #@ data.values.tkrSourceControllerPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting framework-packageinstall/tanzu-framework" - kapp.k14s.io/change-rule.1: "upsert after upserting tkr-source-controller-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.2: "delete before deleting tkr-source-controller-packageinstall/serviceaccount" - - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - serviceAccountName: tkr-source-controller-package-sa - packageRef: - refName: tkr-source-controller.tanzu.vmware.com - versionSelection: - prereleases: {} - #@ if data.values.tkrSourceControllerPackage.versionConstraints: - constraints: #@ data.values.tkrSourceControllerPackage.versionConstraints - #@ end - values: - - secretRef: - name: tkr-source-controller-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: tkr-source-controller-values - namespace: #@ data.values.tkrSourceControllerPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-source-controller-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-source-controller-packageinstall/serviceaccount" -type: Opaque -stringData: - values.yaml: #@ yaml.encode(data.values.tkrSourceControllerPackage.tkrSourceControllerPackageValues) diff --git a/packages/tkg/bundle/config/packageinstalls/tkr-source-controller-service-account.yaml b/packages/tkg/bundle/config/packageinstalls/tkr-source-controller-service-account.yaml deleted file mode 100644 index bf2cae16e6..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/tkr-source-controller-service-account.yaml +++ /dev/null @@ -1,39 +0,0 @@ -#@ load("@ytt:data", "data") - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tkr-source-controller-package-sa - namespace: #@ data.values.tkrSourceControllerPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "tkr-source-controller-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tkr-source-controller-package-role - annotations: - kapp.k14s.io/change-group: "tkr-source-controller-packageinstall/serviceaccount-0" -rules: - # RBAC rules to create PackageInstall CR and service accounts - - apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tkr-source-controller-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "tkr-source-controller-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-source-controller-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-source-controller-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tkr-source-controller-package-role -subjects: - - kind: ServiceAccount - name: tkr-source-controller-package-sa - namespace: #@ data.values.tkrSourceControllerPackage.namespaceForPackageInstallation diff --git a/packages/tkg/bundle/config/packageinstalls/tkr-vsphere-resolver-pi.yaml b/packages/tkg/bundle/config/packageinstalls/tkr-vsphere-resolver-pi.yaml deleted file mode 100644 index c7267bbc79..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/tkr-vsphere-resolver-pi.yaml +++ /dev/null @@ -1,43 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") - -#@ if data.values.metadata.infraProvider == "vsphere": ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tkr-vsphere-resolver - namespace: #@ data.values.tkrSourceControllerPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting framework-packageinstall/tanzu-framework" - kapp.k14s.io/change-rule.1: "upsert after upserting tkr-vsphere-resolver-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.2: "delete before deleting tkr-vsphere-resolver-packageinstall/serviceaccount" - - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - serviceAccountName: tkr-vsphere-resolver-package-sa - packageRef: - refName: tkr-vsphere-resolver.tanzu.vmware.com - versionSelection: - prereleases: {} - #@ if data.values.tkrSourceControllerPackage.versionConstraints: - constraints: #@ data.values.tkrSourceControllerPackage.versionConstraints - #@ end - values: - - secretRef: - name: tkr-vsphere-resolver-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: tkr-vsphere-resolver-values - namespace: #@ data.values.tkrSourceControllerPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-vsphere-resolver-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-vsphere-resolver-packageinstall/serviceaccount" -type: Opaque -stringData: - values.yaml: #@ yaml.encode(data.values.tkrSourceControllerPackage.tkrSourceControllerPackageValues) - -#@ end diff --git a/packages/tkg/bundle/config/packageinstalls/tkr-vsphere-resolver-service-account.yaml b/packages/tkg/bundle/config/packageinstalls/tkr-vsphere-resolver-service-account.yaml deleted file mode 100644 index 29c5d1ab50..0000000000 --- a/packages/tkg/bundle/config/packageinstalls/tkr-vsphere-resolver-service-account.yaml +++ /dev/null @@ -1,42 +0,0 @@ -#@ load("@ytt:data", "data") - -#@ if data.values.metadata.infraProvider == "vsphere": ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tkr-vsphere-resolver-package-sa - namespace: #@ data.values.tkrSourceControllerPackage.namespaceForPackageInstallation - annotations: - kapp.k14s.io/change-group: "tkr-vsphere-resolver-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tkr-vsphere-resolver-package-role - annotations: - kapp.k14s.io/change-group: "tkr-vsphere-resolver-packageinstall/serviceaccount-0" -rules: - # RBAC rules to create PackageInstall CR and service accounts - - apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tkr-vsphere-resolver-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "tkr-vsphere-resolver-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-vsphere-resolver-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-vsphere-resolver-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tkr-vsphere-resolver-package-role -subjects: - - kind: ServiceAccount - name: tkr-vsphere-resolver-package-sa - namespace: #@ data.values.tkrSourceControllerPackage.namespaceForPackageInstallation - -#@ end diff --git a/packages/tkg/bundle/config/values.yaml b/packages/tkg/bundle/config/values.yaml deleted file mode 100644 index 6a6da159dd..0000000000 --- a/packages/tkg/bundle/config/values.yaml +++ /dev/null @@ -1,140 +0,0 @@ -#@data/values ---- -#! User configurable values for tkg. - -metadata: - infraProvider: "" - -configvalues: - -frameworkPackage: - namespaceForPackageInstallation: tkg-system - versionConstraints: - featureGatesPackageValues: - namespace: tkg-system - createNamespace: false - versionConstraints: - deployment: - hostNetwork: false - nodeSelector: null - tolerations: [] - webhookServerPort: 9443 - tkrServicePackageValues: - namespace: tkg-system - createNamespace: false - versionConstraints: - deployment: - hostNetwork: false - nodeSelector: null - tolerations: [] - #! If hostNetwork is set to true the below two ports should be different - tkrConversionWebhookServerPort: 9443 - tkrResolverWebhookServerPort: 9443 - httpProxy: - httpsProxy: - noProxy: - addonsManagerPackageValues: - versionConstraints: - tanzuAddonsManager: - namespace: tkg-system - createNamespace: false - deployment: - replicas: 2 - leaderElection: false - hostNetwork: true - priorityClassName: system-cluster-critical - nodeSelector: null - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - webhookServerPort: 9865 - healthzPort: 18316 - clusterDeleteTimeout: "10m" - metricsBindAddress: "localhost:18317" - featureGates: - clusterBootstrapController: false - packageInstallStatus: false - clipluginsPackageValues: - namespace: tkg-system - versionConstraints: - deployCLIPluginCRD: false - tanzuAuthPackageValues: - namespace: tanzu-auth - versionConstraints: - controller: - image: tanzu-auth-controller-manager:latest - -clusterclassPackage: - namespaceForPackageInstallation: tkg-system - versionConstraints: - clusterclassInfraPackageValues: - namespace: tkg-system - createNamespace: false - versionConstraints: - -tkrSourceControllerPackage: - namespaceForPackageInstallation: tkg-system - versionConstraints: - tkrSourceControllerPackageValues: - namespace: tkg-system - legacyNamespace: tkr-system - bomImagePath: - bomMetadataImagePath: - tkrRepoImagePath: - defaultCompatibleTKR: - skipVerifyRegistryCert: false - initialDiscoverFrequency: 60 - continuousDiscoverFrequency: 600 - caCerts: "" - imageRepository: "" - deployment: - hostNetwork: false - nodeSelector: null - tolerations: [] - httpProxy: - httpsProxy: - noProxy: - -coreManagementPluginsPackage: - namespaceForPackageInstallation: tkg-system - versionConstraints: - -akoOperatorPackage: - akoOperator: - avi_enable: false - namespace: tkg-system-networking - cluster_name: "" - config: - avi_admin_credential_name: avi-controller-credentials - avi_ca_name: avi-controller-ca - avi_controller: "" - avi_controller_version: "" - avi_username: "" - avi_password: "" - avi_ca_data_b64: "" - avi_cloud_name: "" - avi_service_engine_group: "" - avi_management_cluster_service_engine_group: null - avi_data_network: "" - avi_data_network_cidr: "" - avi_control_plane_network: "" - avi_control_plane_network_cidr: "" - avi_management_cluster_vip_network_name: "" - avi_management_cluster_vip_network_cidr: "" - avi_management_cluster_control_plane_vip_network_name: "" - avi_management_cluster_control_plane_vip_network_cidr: "" - avi_labels: '""' - avi_cni_plugin: "" - avi_control_plane_ha_provider: false - avi_control_plane_endpoint_port: 6443 - avi_nsxt_t1_lr: null - avi_disable_ingress_class: true - avi_disable_static_route_sync: false - avi_ingress_default_ingress_controller: false - avi_ingress_shard_vs_size: "" - avi_ingress_service_type: "" - avi_ingress_node_network_list: '""' diff --git a/packages/tkg/metadata.yaml b/packages/tkg/metadata.yaml deleted file mode 100644 index 4d75c1824f..0000000000 --- a/packages/tkg/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkg.tanzu.vmware.com - namespace: tkg -spec: - displayName: "tkg" - longDescription: "TKG composite package deploys all management component to the kubernetes cluster to convert cluster into TKG management cluster" - shortDescription: "TKG composite package to deploy all management component" - providerName: VMware - maintainers: - - name: "" - categories: - - "" diff --git a/packages/tkg/package.yaml b/packages/tkg/package.yaml deleted file mode 100644 index c62a8ca7b9..0000000000 --- a/packages/tkg/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkg.tanzu.vmware.com - namespace: tkg -spec: - refName: tkg.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkg/testdata/sample-values.yaml b/packages/tkg/testdata/sample-values.yaml deleted file mode 100644 index 5d39fb93fe..0000000000 --- a/packages/tkg/testdata/sample-values.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -metadata: - infraProvider: "aws" - -configvalues: - -frameworkPackage: - versionConstraints: - featureGatesPackageValues: - versionConstraints: - tkrServicePackageValues: - versionConstraints: - clipluginsPackageValues: - versionConstraints: - addonsManagerPackageValues: - versionConstraints: - tanzuAuthPackageValues: - versionConstraints: - -clusterclassPackage: - versionConstraints: - clusterclassInfraPackageValues: - versionConstraints: diff --git a/packages/tkg/vendir.lock.yml b/packages/tkg/vendir.lock.yml deleted file mode 100644 index 96a4894c49..0000000000 --- a/packages/tkg/vendir.lock.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: null -kind: LockConfig diff --git a/packages/tkg/vendir.yml b/packages/tkg/vendir.yml deleted file mode 100644 index 963f250148..0000000000 --- a/packages/tkg/vendir.yml +++ /dev/null @@ -1,3 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 diff --git a/packages/tkr-service/Makefile b/packages/tkr-service/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/tkr-service/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkr-service/README.md b/packages/tkr-service/README.md deleted file mode 100644 index 95dd364043..0000000000 --- a/packages/tkr-service/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# tkr-service Package - -The tkr-service management package provides the following services: - -* TKR resolution functionality based on the annotations provided on cluster and clusterclass objects. - -## Components - -* tkr-resolver-cluster-webhook -* tkr-conversion-webhook -* tkr-status-controller diff --git a/packages/tkr-service/bundle/config/upstream/certificates.yaml b/packages/tkr-service/bundle/config/upstream/certificates.yaml deleted file mode 100644 index 3888acdbdc..0000000000 --- a/packages/tkr-service/bundle/config/upstream/certificates.yaml +++ /dev/null @@ -1,50 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - name: tkr-service-selfsigned-issuer - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-group: "tkr-service.tanzu.vmware.com/issuer" -spec: - selfSigned: {} ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - name: tkr-resolver-cluster-webhook-serving-cert - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-group: "tkr-service.tanzu.vmware.com/certificate" - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-service.tanzu.vmware.com/issuer" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-service.tanzu.vmware.com/issuer" -spec: - dnsNames: - - #@ "tkr-resolver-cluster-webhook-service.{}.svc".format(data.values.namespace) - - #@ "tkr-resolver-cluster-webhook-service-cert.{}.svc.cluster.local".format(data.values.namespace) - issuerRef: - kind: Issuer - name: tkr-service-selfsigned-issuer - secretName: tkr-resolver-cluster-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - name: tkr-conversion-webhook-serving-cert - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-group: "tkr-service.tanzu.vmware.com/certificate" - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-service.tanzu.vmware.com/issuer" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-service.tanzu.vmware.com/issuer" -spec: - dnsNames: - - #@ "tkr-conversion-webhook-service.{}.svc".format(data.values.namespace) - - #@ "tkr-conversion-webhook-service-cert.{}.svc.cluster.local".format(data.values.namespace) - issuerRef: - kind: Issuer - name: tkr-service-selfsigned-issuer - secretName: tkr-conversion-webhook-service-cert diff --git a/packages/tkr-service/bundle/config/upstream/osimage-crd.yaml b/packages/tkr-service/bundle/config/upstream/osimage-crd.yaml deleted file mode 100644 index 44475d3d53..0000000000 --- a/packages/tkr-service/bundle/config/upstream/osimage-crd.yaml +++ /dev/null @@ -1,168 +0,0 @@ ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - name: osimages.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: OSImage - listKind: OSImageList - plural: osimages - shortNames: - - osimg - singular: osimage - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.kubernetesVersion - name: K8S Version - type: string - - jsonPath: .spec.os.name - name: OS Name - type: string - - jsonPath: .spec.os.version - name: OS Version - type: string - - jsonPath: .spec.os.arch - name: Arch - type: string - - jsonPath: .spec.image.type - name: Type - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - name: v1alpha3 - schema: - openAPIV3Schema: - description: OSImage is the schema for the OSImages API. OSImage objects represent - OSImages shipped as parts of TKRs. OSImages are immutable to end-users. - They are created and managed by TKG to provide discovery of Kubernetes releases - to TKG users and OS image details for infrastructure Machines. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OSImageSpec defines the desired state of OSImage - properties: - image: - description: Image specifies the "Image" part of the OSImage. - properties: - ref: - description: Ref is a key-value map identifying the image within - the infrastructure provider. This is the data to be injected - into the infra-Machine objects (like AWSMachine) on creation. - type: object - x-kubernetes-preserve-unknown-fields: true - type: - description: 'Type of the OSImage, roughly corresponding to the - infrastructure provider (vSphere can serve both ova and vmop). - Some of currently known types are: "ami", "azure", "docker", - "ova", "vmop".' - type: string - required: - - ref - - type - type: object - kubernetesVersion: - description: KubernetesVersion specifies the build version of the - Kubernetes shipped with this OSImage. - type: string - os: - description: OS specifies the "OS" part of the OSImage. - properties: - arch: - type: string - name: - type: string - type: - type: string - version: - type: string - required: - - arch - - name - - type - - version - type: object - required: - - image - - kubernetesVersion - - os - type: object - status: - description: OSImageStatus defines the observed state of OSImage - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/packages/tkr-service/bundle/config/upstream/rbac.yaml b/packages/tkr-service/bundle/config/upstream/rbac.yaml deleted file mode 100644 index 4565a94d93..0000000000 --- a/packages/tkr-service/bundle/config/upstream/rbac.yaml +++ /dev/null @@ -1,97 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: tkr-resolver-cluster-webhook - name: tkr-service-manager-sa - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-group: "tkr-service.tanzu.vmware.com/serviceaccount" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tkr-service-manager-role - annotations: - kapp.k14s.io/change-group: "tkr-service.tanzu.vmware.com/serviceaccount" -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - - osimages - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases/status - - osimages/status - verbs: - - get - - patch - - update -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch - - create - - update - - patch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusterclasses - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - create - - update - - delete - - watch -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create - - get - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tkr-service-manager-clusterrolebinding - annotations: - kapp.k14s.io/change-group: "tkr-service.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-service.tanzu.vmware.com/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-service.tanzu.vmware.com/serviceaccount" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tkr-service-manager-role -subjects: -- kind: ServiceAccount - name: tkr-service-manager-sa - namespace: #@ data.values.namespace diff --git a/packages/tkr-service/bundle/config/upstream/service.yaml b/packages/tkr-service/bundle/config/upstream/service.yaml deleted file mode 100644 index 8c0b4b8bab..0000000000 --- a/packages/tkr-service/bundle/config/upstream/service.yaml +++ /dev/null @@ -1,27 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: v1 -kind: Service -metadata: - name: tkr-resolver-cluster-webhook-service - namespace: #@ data.values.namespace -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - app: tkr-resolver-cluster-webhook - -#! TKR Conversion webhook ---- -apiVersion: v1 -kind: Service -metadata: - name: tkr-conversion-webhook-service - namespace: #@ data.values.namespace -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - app: tkr-conversion-webhook diff --git a/packages/tkr-service/bundle/config/upstream/tkr-conversion-webhook-deployment.yaml b/packages/tkr-service/bundle/config/upstream/tkr-conversion-webhook-deployment.yaml deleted file mode 100644 index 49868167ec..0000000000 --- a/packages/tkr-service/bundle/config/upstream/tkr-conversion-webhook-deployment.yaml +++ /dev/null @@ -1,65 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: tkr-conversion-webhook - name: tkr-conversion-webhook-manager - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-service.tanzu.vmware.com/certificate" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-service.tanzu.vmware.com/certificate" -spec: - replicas: 1 - selector: - matchLabels: - app: tkr-conversion-webhook - template: - metadata: - labels: - app: tkr-conversion-webhook - spec: - containers: - - image: tkr-conversion-webhook:latest - imagePullPolicy: IfNotPresent - name: manager - command: - - /manager - args: - - --metrics-bind-addr=0 - - #@ "--webhook-server-port={}".format(data.values.deployment.tkrConversionWebhookServerPort) - - #@ "--tls-cipher-suites={}".format(data.values.deployment.tlsCipherSuites) - resources: - limits: - cpu: 100m - memory: 200Mi - requests: - cpu: 100m - memory: 100Mi - ports: - - containerPort: #@ data.values.deployment.tkrConversionWebhookServerPort - name: webhook-server - protocol: TCP - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - serviceAccount: tkr-service-manager-sa - terminationGracePeriodSeconds: 10 - volumes: - - name: cert - secret: - secretName: tkr-conversion-webhook-service-cert - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'hostNetwork') and data.values.deployment.hostNetwork: - #@overlay/match missing_ok=True - hostNetwork: true - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'tolerations') and data.values.deployment.tolerations: - #@overlay/match missing_ok=True - tolerations: #@ data.values.deployment.tolerations - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'nodeSelector') and data.values.deployment.nodeSelector: - #@overlay/match missing_ok=True - nodeSelector: #@ data.values.deployment.nodeSelector - #@ end diff --git a/packages/tkr-service/bundle/config/upstream/tkr-crd.yaml b/packages/tkr-service/bundle/config/upstream/tkr-crd.yaml deleted file mode 100644 index 4cb4fb2c26..0000000000 --- a/packages/tkr-service/bundle/config/upstream/tkr-crd.yaml +++ /dev/null @@ -1,572 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.8.0 - cert-manager.io/inject-ca-from: #@ "{}/tkr-conversion-webhook-serving-cert".format(data.values.namespace) - creationTimestamp: null - name: tanzukubernetesreleases.run.tanzu.vmware.com -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: tkr-conversion-webhook-service - namespace: #@ data.values.namespace - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: run.tanzu.vmware.com - names: - kind: TanzuKubernetesRelease - listKind: TanzuKubernetesReleaseList - plural: tanzukubernetesreleases - shortNames: - - tkr - singular: tanzukubernetesrelease - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG, which can be used to create TanzuKubernetesCluster instances. TKRs - are immutable to end-users. They are created and managed by TKG to provide - discovery of Kubernetes releases to TKG users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - images: - description: Images is the list of (other than Kubernetes core) essential - container images shipped by this TKR (e.g. coredns, etcd). - items: - description: ContainerImage is a struct representing a single fully - qualified container image name, constructed as `{Repository}/{Name}:{Tag}`. - properties: - name: - description: Name is the container image name without the repository - prefix. It MUST be a valid URI path, MAY contain zero or more - '/', and SHOULD NOT start or end with '/'. - type: string - repository: - description: Repository is the container image repository used - by this image. It MUST be a DNS-compatible name. - type: string - tag: - description: Tag is the container image version tag. It is the - suffix coming after ':' in a fully qualified image name. - type: string - required: - - name - type: object - type: array - kubernetesVersion: - description: KubernetesVersion is the fully qualified Semantic Versioning - conformant version of Kubernetes shipped by this TKR. The same KubernetesVersion - MAY be shipped by different TKRs. - type: string - nodeImageRef: - description: NodeImageRef refers to an object representing the image - used to create TKC nodes (e.g. VirtualMachineImage). - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - repository: - description: Repository is the container image repository for Kubernetes - core images, such as kube-apiserver, kube-proxy, etc. It MUST be - a DNS-compatible name. - type: string - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - - jsonPath: .status.conditions[?(@.type=='UpdatesAvailable')].message - name: Updates Available - type: string - name: v1alpha2 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG Service, which can be used to create TanzuKubernetesCluster instances. - TKRs are immutable to end-users. They are created and managed by TKG Service - to provide discovery of Kubernetes releases to TKG Service users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - images: - description: Images is the list of (other than Kubernetes core) essential - container images shipped by this TKR (e.g. coredns, etcd). - items: - description: ContainerImage is a struct representing a single fully - qualified container image name, constructed as `{Repository}/{Name}:{Tag}`. - properties: - name: - description: Name is the container image name without the repository - prefix. It MUST be a valid URI path, MAY contain zero or more - '/', and SHOULD NOT start or end with '/'. - type: string - repository: - description: Repository is the container image repository used - by this image. It MUST be a DNS-compatible name. - type: string - tag: - description: Tag is the container image version tag. It is the - suffix coming after ':' in a fully qualified image name. - type: string - required: - - name - type: object - type: array - kubernetesVersion: - description: KubernetesVersion is the fully qualified Semantic Versioning - conformant version of Kubernetes shipped by this TKR. The same KubernetesVersion - MAY be shipped by different TKRs. - type: string - nodeImageRef: - description: NodeImageRef refers to an object representing the image - used to create TKC nodes (e.g. VirtualMachineImage). - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - repository: - description: Repository is the container image repository for Kubernetes - core images, such as kube-apiserver, kube-proxy, etc. It MUST be - a DNS-compatible name. - type: string - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - name: v1alpha3 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG, which can be used to create TanzuKubernetesCluster instances. TKRs - are immutable to end-users. They are created and managed by TKG to provide - discovery of Kubernetes releases to TKG users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - bootstrapPackages: - description: BootstrapPackages lists references to all bootstrap packages - shipped with this TKR. - items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - type: array - kubernetes: - description: Kubernetes is Kubernetes - properties: - coredns: - description: CoreDNS specifies the container image repository - and tag for coredns. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - etcd: - description: Etcd specifies the container image repository and - tag for etcd. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - imageRepository: - description: ImageRepository specifies container image registry - to pull images from. - type: string - kube-vip: - description: KubeVIP specifies the container image repository - and tag for kube-vip. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - pause: - description: Pause specifies the container image repository and - tag for pause. - properties: - imageRepository: - description: ImageRepository sets the container registry to - pull images from. if not set, defaults to the ImageRepository - defined in KubernetesSpec. - type: string - imageTag: - description: ImageTag specifies a tag for the image. - type: string - type: object - version: - description: Version is Semantic Versioning conformant version - of the Kubernetes build shipped by this TKR. The same Kubernetes - build MAY be shipped by multiple TKRs. - type: string - required: - - version - type: object - osImages: - description: OSImages lists references to all OSImage objects shipped - with this TKR. - items: - description: LocalObjectReference contains enough information to - let you locate the referenced object inside the same namespace. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - type: array - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - kubernetes - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] diff --git a/packages/tkr-service/bundle/config/upstream/tkr-resolver-cluster-webhook-deployment.yaml b/packages/tkr-service/bundle/config/upstream/tkr-resolver-cluster-webhook-deployment.yaml deleted file mode 100644 index f7a47f7572..0000000000 --- a/packages/tkr-service/bundle/config/upstream/tkr-resolver-cluster-webhook-deployment.yaml +++ /dev/null @@ -1,67 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: tkr-resolver-cluster-webhook - name: tkr-resolver-cluster-webhook-manager - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-service.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-service.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.2: "upsert after upserting tkr-service.tanzu.vmware.com/certificate" - kapp.k14s.io/change-rule.3: "delete before deleting tkr-service.tanzu.vmware.com/certificate" -spec: - replicas: 1 - selector: - matchLabels: - app: tkr-resolver-cluster-webhook - template: - metadata: - labels: - app: tkr-resolver-cluster-webhook - spec: - containers: - - image: tkr-resolver-cluster-webhook:latest - imagePullPolicy: IfNotPresent - name: manager - command: - - /manager - args: - - --metrics-bind-addr=0 - - #@ "--webhook-server-port={}".format(data.values.deployment.tkrResolverWebhookServerPort) - - #@ "--tls-cipher-suites={}".format(data.values.deployment.tlsCipherSuites) - resources: - limits: - cpu: 100m - memory: 200Mi - requests: - cpu: 100m - memory: 100Mi - ports: - - containerPort: #@ data.values.deployment.tkrResolverWebhookServerPort - name: webhook-server - protocol: TCP - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - serviceAccount: tkr-service-manager-sa - terminationGracePeriodSeconds: 10 - volumes: - - name: cert - secret: - secretName: tkr-resolver-cluster-webhook-service-cert - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'hostNetwork') and data.values.deployment.hostNetwork: - #@overlay/match missing_ok=True - hostNetwork: true - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'tolerations') and data.values.deployment.tolerations: - #@overlay/match missing_ok=True - tolerations: #@ data.values.deployment.tolerations - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'nodeSelector') and data.values.deployment.nodeSelector: - #@overlay/match missing_ok=True - nodeSelector: #@ data.values.deployment.nodeSelector - #@ end diff --git a/packages/tkr-service/bundle/config/upstream/tkr-status-controller-deployment.yaml b/packages/tkr-service/bundle/config/upstream/tkr-status-controller-deployment.yaml deleted file mode 100644 index eced04aba6..0000000000 --- a/packages/tkr-service/bundle/config/upstream/tkr-status-controller-deployment.yaml +++ /dev/null @@ -1,51 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: tkr-status-controller - name: tkr-status-controller-manager - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-service.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-service.tanzu.vmware.com/ClusterRoleBinding" -spec: - replicas: 1 - selector: - matchLabels: - app: tkr-status-controller - template: - metadata: - labels: - app: tkr-status-controller - spec: - containers: - - image: tkr-status-controller:latest - imagePullPolicy: IfNotPresent - name: manager - command: - - /manager - args: - - --metrics-bind-addr=0 - resources: - limits: - cpu: 100m - memory: 200Mi - requests: - cpu: 100m - memory: 100Mi - serviceAccount: tkr-service-manager-sa - terminationGracePeriodSeconds: 10 - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'hostNetwork') and data.values.deployment.hostNetwork: - #@overlay/match missing_ok=True - hostNetwork: true - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'tolerations') and data.values.deployment.tolerations: - #@overlay/match missing_ok=True - tolerations: #@ data.values.deployment.tolerations - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'nodeSelector') and data.values.deployment.nodeSelector: - #@overlay/match missing_ok=True - nodeSelector: #@ data.values.deployment.nodeSelector - #@ end diff --git a/packages/tkr-service/bundle/config/upstream/webhook.yaml b/packages/tkr-service/bundle/config/upstream/webhook.yaml deleted file mode 100644 index 1a80e88cad..0000000000 --- a/packages/tkr-service/bundle/config/upstream/webhook.yaml +++ /dev/null @@ -1,32 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: #@ "{}/tkr-resolver-cluster-webhook-serving-cert".format(data.values.namespace) - name: tkr-cluster-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tkr-resolver-cluster-webhook-service - namespace: #@ data.values.namespace - path: /mutate-cluster - failurePolicy: Fail - matchPolicy: Equivalent - name: tkr-resolver-cluster-webhook.tanzu.vmware.com - rules: - - apiGroups: ["cluster.x-k8s.io"] - apiVersions: - - v1 - - v1beta1 - - v1alpha4 - operations: - - CREATE - - UPDATE - resources: - - "clusters" - sideEffects: None diff --git a/packages/tkr-service/bundle/config/values.yaml b/packages/tkr-service/bundle/config/values.yaml deleted file mode 100644 index d71c5e44a7..0000000000 --- a/packages/tkr-service/bundle/config/values.yaml +++ /dev/null @@ -1,12 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -namespace: tkg-system -deployment: - hostNetwork: false - nodeSelector: null - tolerations: [] - #! If hostNetwork is set to true the below two ports should be different - tkrConversionWebhookServerPort: 9443 - tkrResolverWebhookServerPort: 9443 - tlsCipherSuites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" diff --git a/packages/tkr-service/kbld-config.yaml b/packages/tkr-service/kbld-config.yaml deleted file mode 100644 index ab112389de..0000000000 --- a/packages/tkr-service/kbld-config.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: kbld.k14s.io/v1alpha1 -kind: Config -overrides: -- image: tkr-resolver-cluster-webhook:latest - newImage: "" -- image: tkr-conversion-webhook:latest - newImage: "" -- image: tkr-status-controller:latest - newImage: "" diff --git a/packages/tkr-service/metadata.yaml b/packages/tkr-service/metadata.yaml deleted file mode 100644 index 0e64f8ecf1..0000000000 --- a/packages/tkr-service/metadata.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkr-service.tanzu.vmware.com - namespace: tkr-service -spec: - displayName: "tkr-service" - longDescription: "tkr-service package provides TKR resolution based on the annotations provided on cluster and clusterclass resources" - shortDescription: "TKR resolution service" - providerName: VMware - maintainers: - - name: "Ivan Mikushin" - - name: "Prem Kalle" - categories: - - "tkr resolution" diff --git a/packages/tkr-service/package.yaml b/packages/tkr-service/package.yaml deleted file mode 100644 index 0ca4079178..0000000000 --- a/packages/tkr-service/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkr-service.tanzu.vmware.com - namespace: tkr-service -spec: - refName: tkr-service.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkr-service/vendir.lock.yml b/packages/tkr-service/vendir.lock.yml deleted file mode 100755 index 5347da8363..0000000000 --- a/packages/tkr-service/vendir.lock.yml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - manual: {} - path: certificates.yaml - - manual: {} - path: rbac.yaml - - manual: {} - path: service.yaml - - manual: {} - path: tkr-resolver-cluster-webhook-deployment.yaml - - manual: {} - path: webhook.yaml - - manual: {} - path: tkr-conversion-webhook-deployment.yaml - - manual: {} - path: tkr-crd.yaml - - manual: {} - path: tkr-status-controller-deployment.yaml - - manual: {} - path: osimage-crd.yaml - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/tkr-service/vendir.yml b/packages/tkr-service/vendir.yml deleted file mode 100644 index 16b711e829..0000000000 --- a/packages/tkr-service/vendir.yml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: certificates.yaml - manual: {} - - path: rbac.yaml - manual: {} - - path: service.yaml - manual: {} - - path: tkr-resolver-cluster-webhook-deployment.yaml - manual: {} - - path: webhook.yaml - manual: {} - - path: tkr-conversion-webhook-deployment.yaml - manual: {} - - path: tkr-crd.yaml - manual: {} - - path: tkr-status-controller-deployment.yaml - manual: { } - - path: osimage-crd.yaml - manual: {} diff --git a/packages/tkr-source-controller/Makefile b/packages/tkr-source-controller/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/tkr-source-controller/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkr-source-controller/README.md b/packages/tkr-source-controller/README.md deleted file mode 100644 index c80394d904..0000000000 --- a/packages/tkr-source-controller/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# tkr-service Package - -The tkr-source-controller management package provides the following services: - -* Fetches and installs TKRs and related resources from the source(Image repository) and reconciles the TKR compatibility with the management cluster. - -## Components - -* tkr-source-controller diff --git a/packages/tkr-source-controller/bundle/config/overlays/overlay-tkr-source-controller.yaml b/packages/tkr-source-controller/bundle/config/overlays/overlay-tkr-source-controller.yaml deleted file mode 100644 index af32a24fb0..0000000000 --- a/packages/tkr-source-controller/bundle/config/overlays/overlay-tkr-source-controller.yaml +++ /dev/null @@ -1,43 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:base64", "base64") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "tkr-source-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - env: - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'httpProxy') and data.values.deployment.httpProxy: - - name: "HTTP_PROXY" - value: #@ data.values.deployment.httpProxy - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'httpsProxy') and data.values.deployment.httpsProxy: - - name: "HTTPS_PROXY" - value: #@ data.values.deployment.httpsProxy - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'noProxy') and data.values.deployment.noProxy: - - name: "NO_PROXY" - value: #@ data.values.deployment.noProxy - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'hostNetwork') and data.values.deployment.hostNetwork: - #@overlay/match missing_ok=True - hostNetwork: true - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'tolerations') and data.values.deployment.tolerations: - #@overlay/match missing_ok=True - tolerations: #@ data.values.deployment.tolerations - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'nodeSelector') and data.values.deployment.nodeSelector: - #@overlay/match missing_ok=True - nodeSelector: #@ data.values.deployment.nodeSelector - #@ end - -#@ if data.values.caCerts: -#@overlay/match by=overlay.subset({"kind":"ConfigMap","metadata":{"name": "tkr-controller-config"}}) ---- -data: - caCerts: #@ base64.decode(data.values.caCerts) -#@ end diff --git a/packages/tkr-source-controller/bundle/config/upstream/default-compatible-tkr.yaml b/packages/tkr-source-controller/bundle/config/upstream/default-compatible-tkr.yaml deleted file mode 100644 index 0080e97045..0000000000 --- a/packages/tkr-source-controller/bundle/config/upstream/default-compatible-tkr.yaml +++ /dev/null @@ -1,31 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") - -#@ def getCompatibleTKRs(): -- #@ data.values.defaultCompatibleTKR -#@ end - ---- -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - run.tanzu.vmware.com/additional-compatible-tkrs: "" - name: tkg-compatibility-versions - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-group: "tkr-source-controller.tanzu.vmware.com/ConfigMap" -data: - tkrVersions: #@ yaml.encode(getCompatibleTKRs()) - ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: tkr-controller-config - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-group: "tkr-source-controller.tanzu.vmware.com/ConfigMap" -data: - caCerts: "" - imageRepository: #@ data.values.imageRepository diff --git a/packages/tkr-source-controller/bundle/config/upstream/rbac.yaml b/packages/tkr-source-controller/bundle/config/upstream/rbac.yaml deleted file mode 100644 index 28d3baa7c5..0000000000 --- a/packages/tkr-source-controller/bundle/config/upstream/rbac.yaml +++ /dev/null @@ -1,40 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: tkr-source-controller - name: tkr-source-controller-manager-sa - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-group: "tkr-source-controller.tanzu.vmware.com/serviceaccount" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tkr-source-controller-manager-role - annotations: - kapp.k14s.io/change-group: "tkr-source-controller.tanzu.vmware.com/serviceaccount" -rules: - # RBAC rules to create PackageInstall CR and service accounts - - apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tkr-source-controller-manager-clusterrolebinding - annotations: - kapp.k14s.io/change-group: "tkr-source-controller.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-source-controller.tanzu.vmware.com/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-source-controller.tanzu.vmware.com/serviceaccount" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tkr-source-controller-manager-role -subjects: -- kind: ServiceAccount - name: tkr-source-controller-manager-sa - namespace: #@ data.values.namespace diff --git a/packages/tkr-source-controller/bundle/config/upstream/tkr-source-controller-deployment.yaml b/packages/tkr-source-controller/bundle/config/upstream/tkr-source-controller-deployment.yaml deleted file mode 100644 index a19524bb08..0000000000 --- a/packages/tkr-source-controller/bundle/config/upstream/tkr-source-controller-deployment.yaml +++ /dev/null @@ -1,58 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: v1 -kind: Namespace -metadata: - labels: - control-plane: controller-manager - name: #@ data.values.legacyNamespace ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: tkr-source-controller - name: tkr-source-controller-manager - namespace: #@ data.values.namespace - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-source-controller.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-source-controller.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.3: "upsert after upserting tkr-source-controller.tanzu.vmware.com/ConfigMap" -spec: - replicas: 1 - selector: - matchLabels: - app: tkr-source-controller - template: - metadata: - labels: - app: tkr-source-controller - spec: - containers: - - image: tkr-source-controller:latest - imagePullPolicy: IfNotPresent - name: manager - command: - - /manager - args: - - --metrics-bind-addr=0 - - --sa-name=tkr-source-controller-manager-sa - - #@ "--namespace={}".format(data.values.namespace) - - #@ "--legacy-namespace={}".format(data.values.legacyNamespace) - - #@ "--bom-image-path={}".format(data.values.bomImagePath) - - #@ "--bom-metadata-image-path={}".format(data.values.bomMetadataImagePath) - - #@ "--tkr-repo-image-path={}".format(data.values.tkrRepoImagePath) - - #@ "--initial-discover-frequency={}".format(data.values.initialDiscoverFrequency) - - #@ "--continuous-discover-frequency={}".format(data.values.continuousDiscoverFrequency) - #@ if/end hasattr(data.values, 'skipVerifyRegistryCert') and data.values.skipVerifyRegistryCert: - - --skip-verify-registry-cert=true - env: - resources: - limits: - cpu: 100m - memory: 200Mi - requests: - cpu: 100m - memory: 100Mi - serviceAccount: tkr-source-controller-manager-sa - terminationGracePeriodSeconds: 10 diff --git a/packages/tkr-source-controller/bundle/config/values.yaml b/packages/tkr-source-controller/bundle/config/values.yaml deleted file mode 100644 index 232ee00e9e..0000000000 --- a/packages/tkr-source-controller/bundle/config/values.yaml +++ /dev/null @@ -1,21 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -namespace: tkg-system -legacyNamespace: tkr-system -bomImagePath: -bomMetadataImagePath: -tkrRepoImagePath: -defaultCompatibleTKR: -skipVerifyRegistryCert: false -initialDiscoverFrequency: 60 -continuousDiscoverFrequency: 600 -caCerts: "" -imageRepository: "" -deployment: - hostNetwork: false - nodeSelector: null - tolerations: [] - httpProxy: - httpsProxy: - noProxy: diff --git a/packages/tkr-source-controller/kbld-config.yaml b/packages/tkr-source-controller/kbld-config.yaml deleted file mode 100644 index de36836a10..0000000000 --- a/packages/tkr-source-controller/kbld-config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: kbld.k14s.io/v1alpha1 -kind: Config -overrides: - - image: tkr-source-controller:latest - newImage: "" diff --git a/packages/tkr-source-controller/metadata.yaml b/packages/tkr-source-controller/metadata.yaml deleted file mode 100644 index 31ffd39543..0000000000 --- a/packages/tkr-source-controller/metadata.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkr-source-controller.tanzu.vmware.com - namespace: tkr-source-controller -spec: - displayName: "tkr-source-controller" - longDescription: "tkr-source-controller package fetches and installs the TKRs and related resources from the source(Image repository) and reconciles the TKR compatibility with the management cluster" - shortDescription: "TKR resource reconciler" - providerName: VMware - maintainers: - - name: "Ivan Mikushin" - - name: "Prem Kalle" - categories: - - "tkr source reconciliation" diff --git a/packages/tkr-source-controller/package.yaml b/packages/tkr-source-controller/package.yaml deleted file mode 100644 index 817fa1fb2a..0000000000 --- a/packages/tkr-source-controller/package.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkr-source-controller.tanzu.vmware.com - namespace: tkr-source-controller -spec: - refName: tkr-source-controller.tanzu.vmware.com - version: latest - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkr-source-controller/vendir.lock.yml b/packages/tkr-source-controller/vendir.lock.yml deleted file mode 100755 index 38bfb11678..0000000000 --- a/packages/tkr-source-controller/vendir.lock.yml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - manual: {} - path: rbac.yaml - - manual: {} - path: default-compatible-tkr.yaml - - manual: {} - path: tkr-source-controller-deployment.yaml - path: bundle/config/upstream -- contents: - - manual: {} - path: overlay-tkr-source-controller.yaml - path: bundle/config/overlays -kind: LockConfig diff --git a/packages/tkr-source-controller/vendir.yml b/packages/tkr-source-controller/vendir.yml deleted file mode 100644 index 6d8a32f668..0000000000 --- a/packages/tkr-source-controller/vendir.yml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - manual: {} - path: rbac.yaml - - manual: {} - path: default-compatible-tkr.yaml - - manual: {} - path: tkr-source-controller-deployment.yaml - - path: bundle/config/overlays - contents: - - path: overlay-tkr-source-controller.yaml - manual: {} diff --git a/packages/tkr-vsphere-resolver/Makefile b/packages/tkr-vsphere-resolver/Makefile deleted file mode 100644 index d149cbe414..0000000000 --- a/packages/tkr-vsphere-resolver/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -configure-package: ## Configure package before creating the package - -reset-package: ## Reset configured package diff --git a/packages/tkr-vsphere-resolver/README.md b/packages/tkr-vsphere-resolver/README.md deleted file mode 100644 index 1c19c5b0b2..0000000000 --- a/packages/tkr-vsphere-resolver/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# tkr-vsphere-resolver Package - -This package provides << awesome functionality >> using [tkr-vsphere-resolver](https://INFO_NEEDED). - -## Components - -* tkr-vsphere-cluster-webhook - -## Configuration - -The following configuration values can be set to customize the tkr-vsphere-resolver installation. - -### Global - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -### tkr-vsphere-resolver Configuration - -| Value | Required/Optional | Description | -|-------|-------------------|-------------| -| `name` | Optional | description | - -## Usage Example - -The following is a basic guide for getting started with tkr-vsphere-resolver. diff --git a/packages/tkr-vsphere-resolver/bundle/config/overlays/overlay-tkr-vsphere-resolver-cluster-webhook-deployment.yaml b/packages/tkr-vsphere-resolver/bundle/config/overlays/overlay-tkr-vsphere-resolver-cluster-webhook-deployment.yaml deleted file mode 100644 index b45b2c26b2..0000000000 --- a/packages/tkr-vsphere-resolver/bundle/config/overlays/overlay-tkr-vsphere-resolver-cluster-webhook-deployment.yaml +++ /dev/null @@ -1,24 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:base64", "base64") - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "tkr-vsphere-resolver-webhook-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "manager"}) - - env: - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'httpProxy') and data.values.deployment.httpProxy: - - name: "HTTP_PROXY" - value: #@ data.values.deployment.httpProxy - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'httpsProxy') and data.values.deployment.httpsProxy: - - name: "HTTPS_PROXY" - value: #@ data.values.deployment.httpsProxy - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'noProxy') and data.values.deployment.noProxy: - - name: "NO_PROXY" - value: #@ data.values.deployment.noProxy - #@ end diff --git a/packages/tkr-vsphere-resolver/bundle/config/upstream/certificates.yaml b/packages/tkr-vsphere-resolver/bundle/config/upstream/certificates.yaml deleted file mode 100644 index b579a0324d..0000000000 --- a/packages/tkr-vsphere-resolver/bundle/config/upstream/certificates.yaml +++ /dev/null @@ -1,31 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - name: tkr-vsphere-resolver-service-selfsigned-issuer - namespace: #@ data.values.NAMESPACE - annotations: - kapp.k14s.io/change-group: "tkr-vsphere-resolver.tanzu.vmware.com/issuer" -spec: - selfSigned: {} ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - name: tkr-vsphere-resolver-webhook-serving-cert - namespace: #@ data.values.NAMESPACE - annotations: - kapp.k14s.io/change-group: "tkr-vsphere-resolver.tanzu.vmware.com/certificate" - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-vsphere-resolver.tanzu.vmware.com/issuer" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-vsphere-resolver.tanzu.vmware.com/issuer" -spec: - dnsNames: - - #@ "tkr-vsphere-resolver-webhook-service.{}.svc".format(data.values.NAMESPACE) - - #@ "tkr-vsphere-resolver-webhook-service-cert.{}.svc.cluster.local".format(data.values.NAMESPACE) - issuerRef: - kind: Issuer - name: tkr-vsphere-resolver-service-selfsigned-issuer - secretName: tkr-vsphere-resolver-webhook-service-cert diff --git a/packages/tkr-vsphere-resolver/bundle/config/upstream/rbac.yaml b/packages/tkr-vsphere-resolver/bundle/config/upstream/rbac.yaml deleted file mode 100644 index 795df57e18..0000000000 --- a/packages/tkr-vsphere-resolver/bundle/config/upstream/rbac.yaml +++ /dev/null @@ -1,106 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: tkr-vsphere-resolver-webhook - name: tkr-vsphere-resolver-manager-sa - namespace: #@ data.values.NAMESPACE - annotations: - kapp.k14s.io/change-group: "tkr-vsphere-resolver.tanzu.vmware.com/serviceaccount" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tkr-vsphere-resolver-manager-role - annotations: - kapp.k14s.io/change-group: "tkr-vsphere-resolver.tanzu.vmware.com/serviceaccount" -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - - osimages - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases/status - - osimages/status - verbs: - - get - - patch - - update -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch - - create - - update - - patch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusterclasses - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusteridentities - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - configmaps - - secrets - verbs: - - get - - list - - create - - update - - delete - - watch -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create - - get - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tkr-vsphere-resolver-manager-clusterrolebinding - annotations: - kapp.k14s.io/change-group: "tkr-vsphere-resolver.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-vsphere-resolver.tanzu.vmware.com/serviceaccount" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-vsphere-resolver.tanzu.vmware.com/serviceaccount" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tkr-vsphere-resolver-manager-role -subjects: -- kind: ServiceAccount - name: tkr-vsphere-resolver-manager-sa - namespace: #@ data.values.NAMESPACE diff --git a/packages/tkr-vsphere-resolver/bundle/config/upstream/service.yaml b/packages/tkr-vsphere-resolver/bundle/config/upstream/service.yaml deleted file mode 100644 index c194753e63..0000000000 --- a/packages/tkr-vsphere-resolver/bundle/config/upstream/service.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#@ load("@ytt:data", "data") -#! tkr-vsphere-resolver-webhook ---- -apiVersion: v1 -kind: Service -metadata: - name: tkr-vsphere-resolver-webhook-service - namespace: #@ data.values.NAMESPACE -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - app: tkr-vsphere-resolver-webhook diff --git a/packages/tkr-vsphere-resolver/bundle/config/upstream/tkr-vsphere-resolver-cluster-webhook-deployment.yaml b/packages/tkr-vsphere-resolver/bundle/config/upstream/tkr-vsphere-resolver-cluster-webhook-deployment.yaml deleted file mode 100644 index 03ee54f676..0000000000 --- a/packages/tkr-vsphere-resolver/bundle/config/upstream/tkr-vsphere-resolver-cluster-webhook-deployment.yaml +++ /dev/null @@ -1,67 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: tkr-vsphere-resolver-webhook - name: tkr-vsphere-resolver-webhook-manager - namespace: #@ data.values.NAMESPACE - annotations: - kapp.k14s.io/change-rule.0: "upsert after upserting tkr-vsphere-resolver.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.1: "delete before deleting tkr-vsphere-resolver.tanzu.vmware.com/ClusterRoleBinding" - kapp.k14s.io/change-rule.2: "upsert after upserting tkr-vsphere-resolver.tanzu.vmware.com/certificate" - kapp.k14s.io/change-rule.3: "delete before deleting tkr-vsphere-resolver.tanzu.vmware.com/certificate" -spec: - replicas: 1 - selector: - matchLabels: - app: tkr-vsphere-resolver-webhook - template: - metadata: - labels: - app: tkr-vsphere-resolver-webhook - spec: - containers: - - image: tkr-vsphere-cluster-webhook:latest - imagePullPolicy: IfNotPresent - name: manager - command: - - /manager - args: - - --metrics-bind-addr=0 - - #@ "--webhook-server-port={}".format(data.values.deployment.tkrVsphereResolverWebhookServerPort) - env: - resources: - limits: - cpu: 100m - memory: 200Mi - requests: - cpu: 100m - memory: 100Mi - ports: - - containerPort: #@ data.values.deployment.tkrVsphereResolverWebhookServerPort - name: webhook-server - protocol: TCP - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - serviceAccount: tkr-vsphere-resolver-manager-sa - terminationGracePeriodSeconds: 10 - volumes: - - name: cert - secret: - secretName: tkr-vsphere-resolver-webhook-service-cert - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'hostNetwork') and data.values.deployment.hostNetwork: - #@overlay/match missing_ok=True - hostNetwork: true - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'tolerations') and data.values.deployment.tolerations: - #@overlay/match missing_ok=True - tolerations: #@ data.values.deployment.tolerations - #@ end - #@ if hasattr(data.values, 'deployment') and hasattr(data.values.deployment, 'nodeSelector') and data.values.deployment.nodeSelector: - #@overlay/match missing_ok=True - nodeSelector: #@ data.values.deployment.nodeSelector - #@ end diff --git a/packages/tkr-vsphere-resolver/bundle/config/upstream/webhook.yaml b/packages/tkr-vsphere-resolver/bundle/config/upstream/webhook.yaml deleted file mode 100644 index 716e735e0b..0000000000 --- a/packages/tkr-vsphere-resolver/bundle/config/upstream/webhook.yaml +++ /dev/null @@ -1,34 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: #@ "{}/tkr-vsphere-resolver-webhook-serving-cert".format(data.values.NAMESPACE) - name: tkr-vsphere-resolver-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: tkr-vsphere-resolver-webhook-service - namespace: #@ data.values.NAMESPACE - path: /resolve-template - failurePolicy: Fail - matchPolicy: Equivalent - name: tkr-vsphere-resolver-webhook.tanzu.vmware.com - reinvocationPolicy: IfNeeded - rules: - - apiGroups: ["cluster.x-k8s.io"] - apiVersions: - - v1 - - v1beta1 - - v1alpha4 - operations: - - CREATE - - UPDATE - resources: - - "clusters" - sideEffects: None - timeoutSeconds: 30 diff --git a/packages/tkr-vsphere-resolver/bundle/config/values.yaml b/packages/tkr-vsphere-resolver/bundle/config/values.yaml deleted file mode 100644 index 7e6cbd8d30..0000000000 --- a/packages/tkr-vsphere-resolver/bundle/config/values.yaml +++ /dev/null @@ -1,18 +0,0 @@ -#@data/values - -#@overlay/match-child-defaults missing_ok=True ---- - -#! User configurable values for tkr-vsphere-resolver - -NAMESPACE: tkg-system - -deployment: - hostNetwork: false - nodeSelector: null - tolerations: [] - #! If hostNetwork is set to true the below two ports should be different - tkrVsphereResolverWebhookServerPort: 9443 - httpProxy: - httpsProxy: - noProxy: diff --git a/packages/tkr-vsphere-resolver/kbld-config.yaml b/packages/tkr-vsphere-resolver/kbld-config.yaml deleted file mode 100644 index 53f329364f..0000000000 --- a/packages/tkr-vsphere-resolver/kbld-config.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: kbld.k14s.io/v1alpha1 -kind: Config -overrides: -- image: tkr-vsphere-cluster-webhook:latest - newImage: "" diff --git a/packages/tkr-vsphere-resolver/metadata.yaml b/packages/tkr-vsphere-resolver/metadata.yaml deleted file mode 100644 index 236f037297..0000000000 --- a/packages/tkr-vsphere-resolver/metadata.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: PackageMetadata -metadata: - name: tkr-vsphere-resolver.tanzu.vmware.com - namespace: tkr-vsphere-resolver -spec: - displayName: "tkr-vsphere-resolver" - longDescription: "vSphere Template Resolver finds VM template based on OS version and arch for vSphere provider" - shortDescription: "vSphere VM template resolver" - providerName: VMware - maintainers: - - name: "" - categories: - - "tkr resolution" diff --git a/packages/tkr-vsphere-resolver/package.yaml b/packages/tkr-vsphere-resolver/package.yaml deleted file mode 100644 index 5d3bc417fe..0000000000 --- a/packages/tkr-vsphere-resolver/package.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: data.packaging.carvel.dev/v1alpha1 -kind: Package -metadata: - name: tkr-vsphere-resolver.tanzu.vmware.com - namespace: tkr-vsphere-resolver -spec: - refName: tkr-vsphere-resolver.tanzu.vmware.com - version: latest - releaseNotes: "relevant release notes..." - licenses: - - "Apache 2.0" - template: - spec: - fetch: - - imgpkgBundle: - image: # Get this value by pushing to your OCI Registry - template: - - ytt: - paths: - - config/ - - kbld: - paths: - - "-" - - .imgpkg/images.yml - deploy: - - kapp: {} diff --git a/packages/tkr-vsphere-resolver/vendir.lock.yml b/packages/tkr-vsphere-resolver/vendir.lock.yml deleted file mode 100644 index cc16bc2c32..0000000000 --- a/packages/tkr-vsphere-resolver/vendir.lock.yml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - manual: {} - path: certificates.yaml - - manual: {} - path: rbac.yaml - - manual: {} - path: service.yaml - - manual: {} - path: tkr-vsphere-resolver-cluster-webhook-deployment.yaml - - manual: {} - path: webhook.yaml - path: bundle/config/upstream -kind: LockConfig diff --git a/packages/tkr-vsphere-resolver/vendir.yml b/packages/tkr-vsphere-resolver/vendir.yml deleted file mode 100644 index 944da75012..0000000000 --- a/packages/tkr-vsphere-resolver/vendir.yml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -minimumRequiredVersion: 0.12.0 -directories: - - path: bundle/config/upstream - contents: - - path: certificates.yaml - manual: {} - - path: rbac.yaml - manual: {} - - path: service.yaml - manual: {} - - path: tkr-vsphere-resolver-cluster-webhook-deployment.yaml - manual: {} - - path: webhook.yaml - manual: {} diff --git a/pinniped-components/common/doc.go b/pinniped-components/common/doc.go deleted file mode 100644 index 6d4655fa0b..0000000000 --- a/pinniped-components/common/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package common is intentionally empty at this time -package common diff --git a/pinniped-components/common/go.mod b/pinniped-components/common/go.mod deleted file mode 100644 index d84dc9f3cf..0000000000 --- a/pinniped-components/common/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/pinniped-components/common - -go 1.18 - -require github.com/pkg/errors v0.9.1 diff --git a/pinniped-components/common/go.sum b/pinniped-components/common/go.sum deleted file mode 100644 index 7c401c3f58..0000000000 --- a/pinniped-components/common/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/pinniped-components/common/pkg/pinnipedinfo/doc.go b/pinniped-components/common/pkg/pinnipedinfo/doc.go deleted file mode 100644 index 900dcbd35a..0000000000 --- a/pinniped-components/common/pkg/pinnipedinfo/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package pinnipedinfo contains common code related to the Pinniped Info config map -package pinnipedinfo diff --git a/pinniped-components/common/pkg/pinnipedinfo/pinnipedinfo.go b/pinniped-components/common/pkg/pinnipedinfo/pinnipedinfo.go deleted file mode 100644 index 04c0749128..0000000000 --- a/pinniped-components/common/pkg/pinnipedinfo/pinnipedinfo.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package pinnipedinfo - -import ( - "encoding/json" - - "github.com/pkg/errors" -) - -// PinnipedInfo contains settings for the supervisor. -type PinnipedInfo struct { - ClusterName string `json:"cluster_name"` - Issuer string `json:"issuer"` - IssuerCABundleData string `json:"issuer_ca_bundle_data"` - - // ConciergeEndpoint does not appear to be set anywhere in tanzu-framework. - // It appears that `pinniped kubeconfig get` will autodetect this endpoint from the current Kubeconfig context, - // when someone invokes `tanzu pinniped-auth login` via a Kubeconfig. - // See https://github.com/vmware-tanzu/pinniped/blob/77041760ccf3747972faa9b029fb85f0cb2b592c/cmd/pinniped/cmd/kubeconfig.go#L428-L436 - ConciergeEndpoint string `json:"concierge_endpoint,omitempty"` -} - -func ByteArrayToPinnipedInfo(responseBody []byte) (*PinnipedInfo, error) { - var pinnipedConfigMapInfo struct { - Data PinnipedInfo - } - if err := json.Unmarshal(responseBody, &pinnipedConfigMapInfo); err != nil { - return nil, errors.Wrap(err, "error parsing http response body") - } - - return &pinnipedConfigMapInfo.Data, nil -} diff --git a/pinniped-components/docs/resources/architecture.png b/pinniped-components/docs/resources/architecture.png deleted file mode 100644 index dfa0d33377..0000000000 Binary files a/pinniped-components/docs/resources/architecture.png and /dev/null differ diff --git a/pinniped-components/hack/test.sh b/pinniped-components/hack/test.sh deleted file mode 100755 index 4da874d74e..0000000000 --- a/pinniped-components/hack/test.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -xeuo pipefail - -MY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -# Always run from pinniped directory for reproducibility. -cd "${MY_DIR}/.." - -# Test post-deploy job -make -C ./post-deploy test - -# Test tanzu-auth-controller-manager -./tanzu-auth-controller-manager/hack/check.sh diff --git a/pinniped-components/hack/tools/Makefile b/pinniped-components/hack/tools/Makefile deleted file mode 100644 index 35d46a6786..0000000000 --- a/pinniped-components/hack/tools/Makefile +++ /dev/null @@ -1,182 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Build tooling that is used for the main project - -# Ensure Make is run with bash shell as some syntax below is bash-specific -SHELL := /usr/bin/env bash - -.DEFAULT_GOAL := help - -# Use GOPROXY environment variable if set -GOPROXY := $(shell go env GOPROXY) -ifeq (,$(strip $(GOPROXY))) -GOPROXY := https://proxy.golang.org -endif -export GOPROXY - -# Active module mode, as we use go modules to manage dependencies -export GO111MODULE := on - -# Directories. -ROOT_DIR:=$(shell git rev-parse --show-toplevel) -BIN_DIR := bin -TOOLS_SCRIPTS_DIR := $(ROOT_DIR)/pinniped-components/hack/tools -SRCS := go.mod go.sum - -GOLANGCI_LINT_VERSION=1.46.0 -IMGPKG_VERSION=v0.31.0 -KAPP_VERSION=v0.52.0 -KBLD_VERSION=v0.31.0 -# darwin arm64 available in K8S_VERSION=1.24.1 -K8S_VERSION=1.23.5 -VALE_VERSION=2.17.0 -VENDIR_VERSION=v0.30.0 -YQ_VERSION=v4.5.0 -YTT_VERSION=v0.42.0 - -# Host information. -HOST_OS=$(shell go env GOOS) -HOST_ARCH=$(shell go env GOARCH) - -# Binaries. -CONTROLLER_GEN := $(BIN_DIR)/controller-gen -GINKGO := $(BIN_DIR)/ginkgo -GOLANGCI_LINT := $(BIN_DIR)/golangci-lint -GOIMPORTS := $(BIN_DIR)/goimports -KUBEBUILDER := $(BIN_DIR)/kubebuilder -KUSTOMIZE := $(BIN_DIR)/kustomize -GOBINDATA := $(BIN_DIR)/gobindata -VALE := $(BIN_DIR)/vale -YTT := $(BIN_DIR)/ytt -KBLD := $(BIN_DIR)/kbld -VENDIR := $(BIN_DIR)/vendir -IMGPKG := $(BIN_DIR)/imgpkg -YQ := $(BIN_DIR)/yq -TRIVY := $(BIN_DIR)/trivy -KAPP := $(BIN_DIR)/kapp -CONVERSION_GEN := $(BIN_DIR)/conversion-gen - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -## -------------------------------------- -## Binaries -## -------------------------------------- - -controller-gen: $(CONTROLLER_GEN) -$(CONTROLLER_GEN): go.mod go.sum - go build -tags=tools -o $@ sigs.k8s.io/controller-tools/cmd/controller-gen - -ginkgo: $(GINKGO) -$(GINKGO): go.mod - mkdir -p $(BIN_DIR) - go build -tags=tools -o $(BIN_DIR)/ginkgo github.com/onsi/ginkgo/ginkgo - -COUNTERFEITER := $(BIN_DIR)/counterfeiter -$(COUNTERFEITER): $(BIN_DIR) go.mod go.sum - go build -tags=tools -o $@ github.com/maxbrunsfeld/counterfeiter/v6 - -golangci-lint: $(GOLANGCI_LINT) ## Install golangci-lint -$(GOLANGCI_LINT): - mkdir -p $(BIN_DIR) - curl -L https://github.com/golangci/golangci-lint/releases/download/v$(GOLANGCI_LINT_VERSION)/golangci-lint-$(GOLANGCI_LINT_VERSION)-$(HOST_OS)-$(HOST_ARCH).tar.gz | tar -xz -C /tmp/ - mv /tmp/golangci-lint-$(GOLANGCI_LINT_VERSION)-$(HOST_OS)-$(HOST_ARCH)/golangci-lint $(@) - -goimports: $(GOIMPORTS) $(SRCS) ## Build goimports -$(GOIMPORTS): go.mod go.sum - go build -tags=tools -o $@ golang.org/x/tools/cmd/goimports - -kubebuilder: $(KUBEBUILDER) ## Install kubebuilder -$(KUBEBUILDER): - mkdir -p $(BIN_DIR) - curl -L https://go.kubebuilder.io/test-tools/${K8S_VERSION}/${HOST_OS}/${HOST_ARCH} | tar -xz -C /tmp/ - mv /tmp/kubebuilder $(@) - -kustomize: $(KUSTOMIZE) -$(KUSTOMIZE): $(BIN_DIR) go.mod go.sum # Build kustomize from tools folder. - CGO_ENABLED=0 go build -tags=tools -o $@ sigs.k8s.io/kustomize/kustomize/v4 - -gobindata: $(GOBINDATA) -$(GOBINDATA): go.mod go.sum # Build go-bindata - mkdir -p $(BIN_DIR) - go build -tags=tools -o $(BIN_DIR) github.com/shuLhan/go-bindata/...; mv $(BIN_DIR)/go-bindata $(GOBINDATA) - -vale: $(VALE) -$(VALE): - mkdir -p $(BIN_DIR) - # vale uses macOS for darwin, Linux for linux and 64 for amd64, so manually map them - curl -sfL https://github.com/errata-ai/vale/releases/download/v$(VALE_VERSION)/vale_$(VALE_VERSION)_$(shell echo $(HOST_OS) | sed 's,darwin,macOS,g'| sed 's,linux,Linux,g')_$(shell echo $(HOST_ARCH) | sed 's,amd,,g')-bit.tar.gz | tar -xz -C /tmp/ - mv /tmp/vale $(@) - chmod a+x $(@) - -yq: $(YQ) ## Download yq -$(YQ): - mkdir -p $(BIN_DIR) - echo $(HOST_OS) $(HOST_ARCH) - curl -sL https://github.com/mikefarah/yq/releases/download/$(YQ_VERSION)/yq_$(HOST_OS)_$(HOST_ARCH) -o $(@) && \ - chmod a+x $(@) - -conversion-gen: $(CONVERSION_GEN) $(SRCS) ## Build conversion-gen -$(CONVERSION_GEN): go.mod - mkdir -p $(BIN_DIR) - go build -tags=tools -o $(BIN_DIR) k8s.io/code-generator/cmd/conversion-gen - -## -------------------------------------------------------------------------------------------------------- -## Carvel tools -## -------------------------------------------------------------------------------------------------------- - -ytt: $(YTT) ## Install ytt -$(YTT): - mkdir -p $(BIN_DIR) - curl -LO https://github.com/vmware-tanzu/carvel-ytt/releases/download/$(YTT_VERSION)/ytt-$(HOST_OS)-$(HOST_ARCH) - mv ytt-$(HOST_OS)-$(HOST_ARCH) $(@) - chmod a+x $(@) - -kbld: $(KBLD) ## Download kbld -$(KBLD): - mkdir -p $(BIN_DIR) - curl -LO https://github.com/vmware-tanzu/carvel-kbld/releases/download/$(KBLD_VERSION)/kbld-$(HOST_OS)-$(HOST_ARCH) - mv kbld-$(HOST_OS)-$(HOST_ARCH) $(@) - chmod a+x $(@) - -vendir: $(VENDIR) ## Download vendir -$(VENDIR): - mkdir -p $(BIN_DIR) - curl -LO https://github.com/vmware-tanzu/carvel-vendir/releases/download/$(VENDIR_VERSION)/vendir-$(HOST_OS)-$(HOST_ARCH) - mv vendir-$(HOST_OS)-$(HOST_ARCH) $(@) - chmod a+x $(@) - -imgpkg: $(IMGPKG) ## Download imgpkg -$(IMGPKG): - mkdir -p $(BIN_DIR) - curl -LO https://github.com/vmware-tanzu/carvel-imgpkg/releases/download/$(IMGPKG_VERSION)/imgpkg-$(HOST_OS)-$(HOST_ARCH) - mv imgpkg-$(HOST_OS)-$(HOST_ARCH) $(@) - chmod a+x $(@) - -kapp: $(KAPP) ## Download kapp -$(KAPP): - mkdir -p $(BIN_DIR) - curl -LO https://github.com/vmware-tanzu/carvel-kapp/releases/download/$(KAPP_VERSION)/kapp-$(HOST_OS)-$(HOST_ARCH) - mv kapp-$(HOST_OS)-$(HOST_ARCH) $(@) - chmod a+x $(@) - -## -------------------------------------- -## Trivy -## -------------------------------------- - -trivy: $(TRIVY) ## Download trivy -$(TRIVY): - curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b $(BIN_DIR) - -## -------------------------------------- -## Cleanup -## -------------------------------------- - -.PHONY: clean -clean: ## Remove all generated binaries - rm -rf bin diff --git a/pinniped-components/hack/tools/go.mod b/pinniped-components/hack/tools/go.mod deleted file mode 100644 index 88ea87168b..0000000000 --- a/pinniped-components/hack/tools/go.mod +++ /dev/null @@ -1,79 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/pinniped-components/hack/tools - -go 1.18 - -require ( - github.com/maxbrunsfeld/counterfeiter/v6 v6.5.0 - github.com/onsi/ginkgo v1.16.5 - github.com/shuLhan/go-bindata v4.0.0+incompatible - golang.org/x/tools v0.6.0 - k8s.io/code-generator v0.24.3 - sigs.k8s.io/controller-tools v0.9.2 - sigs.k8s.io/kustomize/kustomize/v4 v4.5.7 -) - -require ( - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/go-errors/errors v1.0.1 // indirect - github.com/go-logr/logr v1.2.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect - github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.6 // indirect - github.com/google/gofuzz v1.1.0 // indirect - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/kr/pretty v0.2.1 // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/mattn/go-colorable v0.1.11 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/mitchellh/mapstructure v1.4.2 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/spf13/cobra v1.4.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/xlab/treeprint v1.1.0 // indirect - go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e // indirect - k8s.io/api v0.24.0 // indirect - k8s.io/apiextensions-apiserver v0.24.0 // indirect - k8s.io/apimachinery v0.24.0 // indirect - k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/kustomize/api v0.12.1 // indirect - sigs.k8s.io/kustomize/cmd/config v0.10.9 // indirect - sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/pinniped-components/hack/tools/go.sum b/pinniped-components/hack/tools/go.sum deleted file mode 100644 index 2291b044ff..0000000000 --- a/pinniped-components/hack/tools/go.sum +++ /dev/null @@ -1,996 +0,0 @@ -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.5.0 h1:rBhB9Rls+yb8kA4x5a/cWxOufWfXt24E+kq4YlbGj3g= -github.com/maxbrunsfeld/counterfeiter/v6 v6.5.0/go.mod h1:fJ0UAZc1fx3xZhU4eSHQDJ1ApFmTVhp5VTpV9tm2ogg= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -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 v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/shuLhan/go-bindata v4.0.0+incompatible h1:xD8LkuVZLV5OOn/IEuFdt6EEAW7deWiqgwaaSGhjAJc= -github.com/shuLhan/go-bindata v4.0.0+incompatible/go.mod h1:pkcPAATLBDD2+SpAPnX5vEM90F7fcwHCvvLCMXcmw3g= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= -github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e h1:3i3ny04XV6HbZ2N1oIBw1UBYATHAOpo4tfTF83JM3Z0= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.0 h1:J0hann2hfxWr1hinZIDefw7Q96wmCBx6SSB8IY0MdDg= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/apiextensions-apiserver v0.24.0 h1:JfgFqbA8gKJ/uDT++feAqk9jBIwNnL9YGdQvaI9DLtY= -k8s.io/apiextensions-apiserver v0.24.0/go.mod h1:iuVe4aEpe6827lvO6yWQVxiPSpPoSKVjkq+MIdg84cM= -k8s.io/apimachinery v0.24.0 h1:ydFCyC/DjCvFCHK5OPMKBlxayQytB8pxy8YQInd5UyQ= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.0/go.mod h1:WFx2yiOMawnogNToVvUYT9nn1jaIkMKj41ZYCVycsBA= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.3 h1:itd1V1ZAYKM+WT+qQDlFKhU1D/Ff5HcEFL/icfClnZA= -k8s.io/code-generator v0.24.3/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 h1:TT1WdmqqXareKxZ/oNXEUSwKlLiHzPMyB0t8BaFeBYI= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/controller-tools v0.9.2 h1:AkTE3QAdz9LS4iD3EJvHyYxBkg/g9fTbgiYsrcsFCcM= -sigs.k8s.io/controller-tools v0.9.2/go.mod h1:NUkn8FTV3Sad3wWpSK7dt/145qfuQ8CKJV6j4jHC5rM= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM= -sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s= -sigs.k8s.io/kustomize/cmd/config v0.10.9 h1:LV8AUwZPuvqhGfia50uNwsPwNg1xOy9koEf5hyBnYs4= -sigs.k8s.io/kustomize/cmd/config v0.10.9/go.mod h1:T0s850zPV3wKfBALA0dyeP/K74jlJcoP8Pr9ZWwE3MQ= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.7 h1:cDW6AVMl6t/SLuQaezMET8hgnadZGIAr8tUrxFVOrpg= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.7/go.mod h1:VSNKEH9D9d9bLiWEGbS6Xbg/Ih0tgQalmPvntzRxZ/Q= -sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk= -sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -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= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/pinniped-components/hack/tools/main.go b/pinniped-components/hack/tools/main.go deleted file mode 100644 index 602e391142..0000000000 --- a/pinniped-components/hack/tools/main.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// This file is only present to make the linter happy. - -package main - -func main() {} diff --git a/pinniped-components/hack/tools/tools.go b/pinniped-components/hack/tools/tools.go deleted file mode 100644 index d2e46da1b4..0000000000 --- a/pinniped-components/hack/tools/tools.go +++ /dev/null @@ -1,19 +0,0 @@ -//go:build tools -// +build tools - -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tools imports things required by build scripts, to force `go mod` to see them as dependencies - -package tools - -import ( - _ "github.com/maxbrunsfeld/counterfeiter/v6" - _ "github.com/onsi/ginkgo/ginkgo" - _ "github.com/shuLhan/go-bindata" - _ "golang.org/x/tools/cmd/goimports" - _ "k8s.io/code-generator/cmd/conversion-gen" - _ "sigs.k8s.io/controller-tools/cmd/controller-gen" - _ "sigs.k8s.io/kustomize/kustomize/v4" -) diff --git a/pinniped-components/pkg/buildinfo/buildvar.go b/pinniped-components/pkg/buildinfo/buildvar.go deleted file mode 100644 index 1360537945..0000000000 --- a/pinniped-components/pkg/buildinfo/buildvar.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package buildinfo holds global vars set at build time to provide information about the build. -// This package SHOULD NOT import other packages -- to avoid dependency cycles. -package buildinfo - -// This package - -var ( - // Date is the date the binary was built. - // Set by go build -ldflags "-X" flag - Date string - - // SHA is the git commit SHA the binary was built with. - // Set by go build -ldflags "-X" flag - SHA string - - // Version is the version the binary was built with. - // Set by go build -ldflags "-X" flag - Version string -) diff --git a/pinniped-components/pkg/buildinfo/metadata.go b/pinniped-components/pkg/buildinfo/metadata.go deleted file mode 100644 index 718d489b93..0000000000 --- a/pinniped-components/pkg/buildinfo/metadata.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package buildinfo - -// IsOfficialBuild is the flag that gets set to True if it is an official build being released. -// Set by go build -ldflags "-X" flag -var IsOfficialBuild string diff --git a/pinniped-components/post-deploy/Dockerfile b/pinniped-components/post-deploy/Dockerfile deleted file mode 100644 index f4d0abc39c..0000000000 --- a/pinniped-components/post-deploy/Dockerfile +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 -# syntax=docker.io/docker/dockerfile:1.3.0 - -# Build from publicly reachable source by default, but allow people to re-build images on -# top of their own trusted images. -ARG BUILDER_BASE_IMAGE=golang:1.18 -ARG DISTROLESS_BASE_IMAGE=gcr.io/distroless/static:nonroot - -# Build the post-deploy binary -FROM $BUILDER_BASE_IMAGE as builder - -WORKDIR /workspace -# Copy the Go Modules manifests -# We depend on tanzu-auth-controller-manager, so copy it in -COPY tanzu-auth-controller-manager tanzu-auth-controller-manager -COPY post-deploy/go.mod post-deploy/go.mod -COPY post-deploy/go.sum post-deploy/go.sum - -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod cd post-deploy && go mod download - -# Copy the source -COPY post-deploy/cmd/ post-deploy/cmd/ -COPY post-deploy/pkg/ post-deploy/pkg/ -COPY post-deploy/Makefile post-deploy/Makefile -#COPY .git/ .git/ - -# Setting default GOPROXY to https://proxy.golang.org,direct and GOSUMDB to sum.golang.org which can be override by Makefile -ARG GOSUMDB -ARG GOPROXY -ENV GOSUMDB=$GOSUMDB -ENV GOPROXY=$GOPROXY -# cache deps before building and copying source so that we don't need to re-download as much -# and so that source changes don't invalidate our downloaded layer -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod make native -C post-deploy - - -# Support older deployment YAMLs by providing symlink for the historic job name without -job. -# The subdirectory here is to ensure that the docker COPY command does not follow the symlink -# itself and simply duplicate the binary again and bloat the container image. -RUN mkdir -p /tmp/links -RUN ln -s /tkg-pinniped-post-deploy-job /tmp/links/tkg-pinniped-post-deploy - -FROM $DISTROLESS_BASE_IMAGE -WORKDIR / -# Make sure to copy the symlink. -COPY --from=builder /tmp/links/ . -COPY --from=builder /workspace/post-deploy/tkg-pinniped-post-deploy-job . -COPY --from=builder /workspace/post-deploy/tkg-pinniped-post-deploy-controller . -CMD ["/tkg-pinniped-post-deploy-job"] \ No newline at end of file diff --git a/pinniped-components/post-deploy/Makefile b/pinniped-components/post-deploy/Makefile deleted file mode 100644 index cc32b4977f..0000000000 --- a/pinniped-components/post-deploy/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# If you update this file, please follow: -# https://suva.sh/posts/well-documented-makefiles/ - -.DEFAULT_GOAL:=help - -GIT_VERSION ?= $(shell git describe --always --tags) -GIT_REF_LONG = $(shell git rev-parse --verify HEAD) -# Release version -VERSION ?= $(GIT_VERSION) -#Adding Support for GOPROXY and GOSUMDB -GOPROXY ?= "https://proxy.golang.org,direct" -GOSUMDB ?= "sum.golang.org" -DISTROLESS_BASE_IMAGE ?= gcr.io/distroless/static:nonroot - - -.PHONY: test -test: fmt vet ## Run tests - go test ./... -coverprofile coverage.txt -v 2 - -.PHONY: fmt -fmt: ## Format the code base - go fmt ./... - -.PHONY: vet -vet: ## Vet codebase - go vet ./... - -native: ## Build binary - CGO_ENABLED=0 go build -o tkg-pinniped-post-deploy-job -ldflags="-s -w -X $(GOTARGET)/pkg/buildinfo.Version=$(GIT_VERSION) -X github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/buildinfo.GitSHA=$(GIT_REF_LONG)" github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/cmd/job - CGO_ENABLED=0 go build -o tkg-pinniped-post-deploy-controller -ldflags="-s -w -X $(GOTARGET)/pkg/buildinfo.Version=$(GIT_VERSION) -X github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/buildinfo.GitSHA=$(GIT_REF_LONG)" github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/cmd/controller - -.PHONY: build-images -build-images: ## Build tkg-pinniped-post-deploy docker images - VERSION=$(VERSION) DISTROLESS_BASE_IMAGE=$(DISTROLESS_BASE_IMAGE) ./hack/scripts/build-images.sh - -run: - go run ./cmd/job \ - --supervisor-namespace=pinniped-supervisor \ - --concierge-namespace=pinniped-concierge \ - --supervisor-svc-name=pinniped-supervisor \ - --federationdomain-name=pinniped-federation-domain \ - --jwtauthenticator-name=tkg-jwt-authenticator \ - --supervisor-cert-name=pinniped-cert \ - --dex-namespace=tanzu-system-auth \ - --dex-svc-name=dexsvc \ - --dex-cert-name=dex-cert \ - --dex-configmap-name=dex \ - --is-dex-required=false diff --git a/pinniped-components/post-deploy/README.md b/pinniped-components/post-deploy/README.md deleted file mode 100644 index 1049cf89cf..0000000000 --- a/pinniped-components/post-deploy/README.md +++ /dev/null @@ -1,105 +0,0 @@ -# tkg-pinniped-post-deploy - -**Note:** This doc is out of date - -This repo contains the implementation for Pinniped post deployment configuration on TKG. TKG provides an automated way -for users to install Pinniped on TKG clusters, however there are some configurations need to be seamlessly handled. e.g. -configure `FederationDomain` issuer and `JWTAuthenticator` issuer. - -## Workflow - -### Management cluster - -* User creates `Secret` with ytt values of Pinniped to notify addons-manager the installation of Pinniped and Dex addon. -* The addons-manager figures out the correct ytt template and create `App` for kapp-controller to consume. The logic - within this repo will be packaged as a container and wrapped in above ytt template as a `Job`. The `Job` will be run - as the last step to configure Pinniped and Dex. - -#### What are handled by `tkg-pinniped-post-deploy` - -* Autodetect the IP address or DNS name of Pinniped supervisor service -* Create or update `Certificate` of Pinniped with valid service IP address or DNS name of Pinniped supervisor -* Create or update `JWTAuthenticator` with valid issuer IP address or DNS name of Pinniped supervisor -* Create or update `FederationDomain` with valid issuer IP address of DNS name of Pinniped supervisor -* Create `ConfigMap` with Pinniped information under kube-public namespace -* Create or update `Certificate` of Dex with valid service IP address or DNS name of Dex service endpoint -* Create or update `OIDCIdentityProvider` with valid service IP address or DNS name of Dex service endpoint and Dex's CaBundle -* Update `ConfigMap` of Dex with valid issuer IP address or DNS name of Pinniped supervisor, valid service IP address or DNS name of Dex service endpoint and randomly generated client secret -* Update `PinnipedOidcSecret` with the same client secret - -### Workload cluster - -* User creates `Secret` with ytt values of Pinniped to notify addons-manager the installation of Pinniped addon. -* The addons-manager figures out the correct ytt template and create `App` for kapp-controller to consume. The logic - within this repo will be packaged as a container and wrapped in above ytt template as a `Job`. The `Job` will be run - as the last step to configure Pinniped. - -#### What are handled by `tkg-pinniped-post-deploy` - -* Create or update `JWTAuthenticator` with the Pinniped supervisor info passed in. User should be able to fetch the Pinniped - supervisor info from pinniped-info ConfigMap on management cluster. - -### List of changes - -#### Pinniped - -* FederationDomain - * SupervisorServiceEndpoint -* PinnipedCertificate - * SupervisorServiceEndpoint -* JWTAuthenticator - * SupervisorServiceEndpoint - * PinnipedCaBundle -* ConfigMap - * SupervisorServiceEndpoint - * PinnipedCaBundle - -#### Dex - -* DexCertificate - * DexEndpoint -* IDP - * DexEndpoint - * DexCaBundle -* ConfigMap - * SupervisorEndpoint - * DexEndpoint - * ClientSecret -* PinnipedOidcSecret - * ClientSecret - -## How to run the post deploy from local env - -* Set the `KUBECONFIG` pointing to the cluster -* `make run` (**Note**: You might want to substitute the flags in Makefile used by the `make run` to satisfy your test) - -## How to run everything all together - -### OIDC - -* Login to your OIDC provider dashboard, e.g. [https://www.okta.com/](https://www.okta.com/), create the web application and remember the clientID, secret and the url(e.g. `https://dev-xxxxxx.okta.com`). -* Get the ytt value examples from [here](../examples), update the OIDC related values. -* Render the YAML by using ytt command - * Go to addons root dir - * Run `ytt --ignore-unknown-comments -f ./ytt-common-libs -f ./pinniped/templates -f ./pinniped/examples/mc-vsphere-oidc.yaml > tmp.yaml` -* Run `kubectl apply -f tmp.yaml`. You should be able to see all things are deployed and post deploy job is completed after a while -* Login to your OIDC provider dashboard, e.g. [https://www.okta.com/](https://www.okta.com/), direct to the application and make sure the login redirect url is pointing to the Pinniped supervisor service - It could be external IP address or DNS name. For example, `https:///callback` -* Run `./hack/bin/pinniped-cli get kubeconfig > tmp.kubeconfig` to get the kubeconfig configured by Pinniped -* Run `kubectl --kubeconfig=./tmp.kubeconfig get pods`, you should be redirected to the browser which asks the login from OIDC provider - -### LDAP - -* Get the ytt value examples from [here](../examples), update the LDAP related values including LDAP host, userSearch and groupSearch policies. -* Render the YAML by using ytt command - * Go to addons root dir - * Run `ytt --ignore-unknown-comments -f ./ytt-common-libs -f ./pinniped/templates -f ./pinniped/examples/mc-vsphere-ldap.yaml > tmp.yaml` -* Run `kubectl apply -f tmp.yaml`. You should be able to see all things are deployed and post deploy job is completed after a while -* Run `./hack/bin/pinniped-cli get kubeconfig > tmp.kubeconfig` to get the kubeconfig configured by Pinniped -* Run `kubectl --kubeconfig=./tmp.kubeconfig get pods`, you should be redirected to the browser which asks the login from LDAP provider - -## How to build docker images - -**Note**: The dev image is under: `gcr.io/kubernetes-development-244305/gdaniel/tkg-pinniped-post-deploy:with-dex`. - -You could also build your own images by using `make build-images` diff --git a/pinniped-components/post-deploy/cmd/controller/main.go b/pinniped-components/post-deploy/cmd/controller/main.go deleted file mode 100644 index 6091fc82ea..0000000000 --- a/pinniped-components/post-deploy/cmd/controller/main.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "flag" - "fmt" - "os" - - "k8s.io/klog/v2" - "k8s.io/klog/v2/klogr" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/tanzu-auth-controller-manager/controllers" -) - -func main() { - klog.InitFlags(nil) - flag.Parse() - ctrl.SetLogger(klogr.New()) - setupLog := ctrl.Log.WithName("pinniped post deploy").WithName("set up") - setupLog.Info("starting set up") - if err := reallyMain(setupLog); err != nil { - setupLog.Error(err, "error running controller") - os.Exit(1) - } -} - -func reallyMain(setupLog logr.Logger) error { - // Add types our controller uses to scheme. - scheme := runtime.NewScheme() - addToSchemes := []func(*runtime.Scheme) error{ - corev1.AddToScheme, - clusterapiv1beta1.AddToScheme, - } - for _, addToScheme := range addToSchemes { - if err := addToScheme(scheme); err != nil { - return fmt.Errorf("cannot add to scheme: %w", err) - } - } - - // Create manager to run our controller. - manager, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - }) - if err != nil { - return fmt.Errorf("unable to start manager: %w", err) - } - - // Register our controllers with the manager. - if err := controllers.NewV1Controller(manager.GetClient()).SetupWithManager(manager); err != nil { - return fmt.Errorf("unable to create %s: %w", controllers.CascadeControllerV1alpha1Name, err) - } - - // Tell manager to start running our controller. - setupLog.V(1).Info("starting manager") - if err := manager.Start(ctrl.SetupSignalHandler()); err != nil { - return fmt.Errorf("unable to start manager: %w", err) - } - - return nil -} diff --git a/pinniped-components/post-deploy/cmd/job/main.go b/pinniped-components/post-deploy/cmd/job/main.go deleted file mode 100644 index e7f02b3396..0000000000 --- a/pinniped-components/post-deploy/cmd/job/main.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "flag" - "fmt" - "os" - - certmanagerclientset "github.com/jetstack/cert-manager/pkg/client/clientset/versioned" - pinnipedconciergeclientset "go.pinniped.dev/generated/1.20/client/concierge/clientset/versioned" - pinnipedsupervisorclientset "go.pinniped.dev/generated/1.20/client/supervisor/clientset/versioned" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/configure" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/vars" -) - -func main() { - // optional - flag.StringVar(&vars.SupervisorNamespace, "supervisor-namespace", vars.SupervisorNamespace, "The namespace of Pinniped supervisor") - - // required for management cluster: yes - // required for workload cluster: no - flag.StringVar(&vars.SupervisorSvcName, "supervisor-svc-name", "", "The name of Pinniped supervisor service") - - flag.StringVar(&vars.ConciergeNamespace, "concierge-namespace", vars.ConciergeNamespace, "The namespace of Pinniped concierge") - - // required for management cluster: no - // required for workload cluster: yes - flag.StringVar(&vars.SupervisorSvcEndpoint, "supervisor-svc-endpoint", "", "The endpoint of Pinniped supervisor service") - - // required for management cluster: yes - // required for workload cluster: no - flag.StringVar(&vars.FederationDomainName, "federationdomain-name", "", "The name of Pinniped FederationDomain") - - // required for management cluster: yes - // required for workload cluster: yes - flag.StringVar(&vars.JWTAuthenticatorName, "jwtauthenticator-name", "", "The name of Pinniped JWTAuthenticator") - - // optional for management cluster: no - // optional for workload cluster: yes - flag.StringVar(&vars.JWTAuthenticatorAudience, "jwtauthenticator-audience", "", "The uid of the workload cluster if provided, otherwise defaulted to the workload cluster name. This value is published to the pinniped-info configmap.") - - // required for management cluster: yes - // required for workload cluster: no - flag.StringVar(&vars.SupervisorCertName, "supervisor-cert-name", "", "The name of Certificate for Pinniped supervisor service") - - // required for management cluster: no - // required for workload cluster: yes - flag.StringVar(&vars.SupervisorCABundleData, "supervisor-ca-bundle-data", "", "The CA data of Pinniped supervisor service") - - // required for management cluster: yes - // required for workload cluster: no - flag.StringVar(&vars.DexNamespace, "dex-namespace", vars.DexNamespace, "The namespace of Dex") - - // required for management cluster: yes - // required for workload cluster: no - flag.StringVar(&vars.DexSvcName, "dex-svc-name", vars.DexSvcName, "The name of Dex service") - - // required for management cluster: yes - // required for workload cluster: no - flag.StringVar(&vars.DexCertName, "dex-cert-name", vars.DexCertName, "The name of Dex TLS certificate") - - // required for management cluster: yes - // required for workload cluster: no - flag.StringVar(&vars.DexConfigMapName, "dex-configmap-name", vars.DexConfigMapName, "The name of Dex config map") - - // TODO: update the "custom-tls-secret" param name post Calgary, to make it more self explanatory - // required for management cluster: no - // required for workload cluster: no - flag.StringVar(&vars.CustomTLSSecretName, "custom-tls-secret", vars.CustomTLSSecretName, "The name of custom TLS secret for Pinniped and Dex, i.e. Pinniped federation domain and Dex exposed connection, this will override the default self-signed TLS certificate") - - // required for management cluster: yes - // required for workload cluster: no - flag.BoolVar(&vars.IsDexRequired, "is-dex-required", vars.IsDexRequired, "If configuring dex is required") - - flag.Parse() - - loggerMgr := initZapLog() - zap.ReplaceGlobals(loggerMgr) - defer loggerMgr.Sync() //nolint:errcheck - logger := loggerMgr.Sugar() - - clients, err := initClients() - if err != nil { - logger.Error(err) - os.Exit(1) // nolint:gocritic - } - - if err := configure.TKGAuthentication(clients); err != nil { - logger.Error(err) - os.Exit(1) - } -} - -func initZapLog() *zap.Logger { - config := zap.NewDevelopmentConfig() - config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder - config.EncoderConfig.TimeKey = "timestamp" - config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder - config.EncoderConfig.CallerKey = "caller" - logger, _ := config.Build() - return logger -} - -func initClients() (configure.Clients, error) { - cfg, err := rest.InClusterConfig() - if err != nil { - return configure.Clients{}, fmt.Errorf("could not get k8s config: %w", err) - } - - return configure.Clients{ - K8SClientset: kubernetes.NewForConfigOrDie(cfg), - SupervisorClientset: pinnipedsupervisorclientset.NewForConfigOrDie(cfg), - ConciergeClientset: pinnipedconciergeclientset.NewForConfigOrDie(cfg), - CertmanagerClientset: certmanagerclientset.NewForConfigOrDie(cfg), - }, nil -} diff --git a/pinniped-components/post-deploy/go.mod b/pinniped-components/post-deploy/go.mod deleted file mode 100644 index cf50ce0750..0000000000 --- a/pinniped-components/post-deploy/go.mod +++ /dev/null @@ -1,109 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy - -go 1.18 - -// Right now, we depend on Kube 1.23, but Pinniped 1.20. -// -// This is because we need to depend on Pinniped v0.12.1 (because that is the -// latest Pinniped version running on TKG clusters), but Pinniped v0.12.1 does -// not contain generated Pinniped APIs/clients to go with Kube 1.23 (i.e., -// https://github.com/vmware-tanzu/pinniped/tree/v0.12.1/generated does not -// contain a 1.23 directory). -// -// For now, we will depend on Pinniped 1.20 generated code because go mod logic -// will automatically update our dependency graph to use the later Kube version -// in the graph (i.e., our post-deploy job will use Kube v0.23.0, derived from -// the dependencies k8s.io/{api,apimachinery,client-go} v0.23.0). This seems -// like the best of the worst ways to go. -// -// In the future, we should always try to depend on the same version of Kube and -// Pinniped generated code (i.e., when we update to depend on Kube 1.24, we -// should also depend on go.pinniped.dev/generated/1.24). - -require ( - github.com/go-logr/logr v1.2.2 - github.com/jetstack/cert-manager v1.1.0 - github.com/stretchr/testify v1.8.0 - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/pinniped-components/tanzu-auth-controller-manager v0.0.0-00010101000000-000000000000 - go.pinniped.dev/generated/1.20/apis v0.0.0-00010101000000-000000000000 - go.pinniped.dev/generated/1.20/client v0.0.0-20220209183828-4d6a2af89419 // Commit SHA 4d6a2af89419 is tag v0.12.1. - go.uber.org/zap v1.21.0 - gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.24.2 - k8s.io/apimachinery v0.24.2 - k8s.io/client-go v0.24.2 - k8s.io/klog/v2 v2.60.1 - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 - sigs.k8s.io/cluster-api v1.2.8 - sigs.k8s.io/controller-runtime v0.12.3 -) - -require ( - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/swag v0.21.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/imdario/mergo v0.3.12 // 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/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // 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/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/spf13/pflag v1.0.5 // indirect - go.pinniped.dev/generated/1.19/apis v0.0.0-20220310140840-61c8d5452705 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.7.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) - -// Import an nested go modules have some known issues. The following replace temporarily fixes it -// https://github.com/golang/go/issues/34055 -// -// Commit SHA 4d6a2af89419 is tag v0.12.1. -replace go.pinniped.dev/generated/1.20/apis => go.pinniped.dev/generated/1.19/apis v0.0.0-20220209183828-4d6a2af89419 - -replace github.com/vmware-tanzu/tanzu-framework/pinniped-components/tanzu-auth-controller-manager => ../tanzu-auth-controller-manager - -replace github.com/vmware-tanzu/tanzu-framework/pinniped-components/common => ../common - -replace sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.8 diff --git a/pinniped-components/post-deploy/go.sum b/pinniped-components/post-deploy/go.sum deleted file mode 100644 index fe8983a1f7..0000000000 --- a/pinniped-components/post-deploy/go.sum +++ /dev/null @@ -1,1328 +0,0 @@ -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v46.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.6/go.mod h1:V6p3pKZx1KKkJubbxnDWrzNhEIfOy/pTGasLqzHIPHs= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.4/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.0/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Venafi/vcert/v4 v4.11.0/go.mod h1:OE+UZ0cj8qqVUuk0u7R4GIk4ZB6JMSf/WySqnBPNwws= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.34.30/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.13.2/go.mod h1:27kfc1apuifUmJhp069y0+hwlKDg4bd8LWlu7oKeZvM= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpu/goacmedns v0.0.3/go.mod h1:4MipLkI+qScwqtVxcNO6okBhbgRrr7/tKXUSgSL0teQ= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.44.0/go.mod h1:p7dOjjtSBqCTUksqtA5Fd3uaKs9kyTq2xcz76ulEJRU= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -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/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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 v0.2.1-0.20200730175230-ee2de8da5be6/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= -github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= -github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= -github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= -github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= -github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= -github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jetstack/cert-manager v1.1.0 h1:gEhBV9I83m+kpQShDhNO4+J8O2qfNDjvAEL27pThGmg= -github.com/jetstack/cert-manager v1.1.0/go.mod h1:GULIHTGjSc2LjlgBCLhQ8u5WmQ95hk9FAiQbhjMthMk= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -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/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/crd-schema-fuzz v1.0.0/go.mod h1:4z/rcm37JxUkSsExFcLL6ZIT1SgDRdLiu7qq1evdVS0= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.4.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pavel-v-chernykh/keystore-go v2.1.0+incompatible/go.mod h1:xlUlxe/2ItGlQyMTstqeDv9r3U4obH7xYd26TbDQutY= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.pinniped.dev/generated/1.19/apis v0.0.0-20220209183828-4d6a2af89419 h1:PnXcwF9YUfxZtmq3cJ/fPLLXE1rItHegDfBgWwL6GvI= -go.pinniped.dev/generated/1.19/apis v0.0.0-20220209183828-4d6a2af89419/go.mod h1:6k9XxeFCS9jagDqsAuuCKvUt+bGjKa9iQNGsPQgZ5pk= -go.pinniped.dev/generated/1.19/apis v0.0.0-20220310140840-61c8d5452705 h1:0Y4RCQ5SuvBhosEj4FO11MXNOKsdACCEMCWFHg1It4U= -go.pinniped.dev/generated/1.19/apis v0.0.0-20220310140840-61c8d5452705/go.mod h1:merKq3HJ+5PlQi4PJkQZTuqJWBxseIGYTRstW0VWH+g= -go.pinniped.dev/generated/1.20/client v0.0.0-20220209183828-4d6a2af89419 h1:APjHS1/VEyr/tsJkN2h1YHan4lq9VhwGAuVVey1oJls= -go.pinniped.dev/generated/1.20/client v0.0.0-20220209183828-4d6a2af89419/go.mod h1:C1qHDHOJY8zd7bijywwI6u6wnGGrwkvVzNImTSV2iIw= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180117170059-2c42eef0765b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -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= -gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.52.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.0.0/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= -k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= -k8s.io/api v0.19.0/go.mod h1:I1K45XlvTrDjmj5LoM5LuP/KYrhWbjUKT/SoPG0qTjw= -k8s.io/api v0.19.5/go.mod h1:yGZReuNa0vj56op6eT+NLrXJne0R0u9ktexZ8jdJzpc= -k8s.io/api v0.19.15/go.mod h1:rMRWjnIJQmurd/FdLobht6dCSbJQ+UDpyOwPaoFS7lI= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.18.0/go.mod h1:18Cwn1Xws4xnWQNC00FLq1E350b9lUF+aOdIWDOZxgo= -k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= -k8s.io/apiextensions-apiserver v0.19.0/go.mod h1:znfQxNpjqz/ZehvbfMg5N6fvBJW5Lqu5HVLTJQdP4Fs= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= -k8s.io/apimachinery v0.19.0/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.19.5/go.mod h1:6sRbGRAVY5DOCuZwB5XkqguBqpqLU6q/kOaOdk29z6Q= -k8s.io/apimachinery v0.19.15/go.mod h1:RMyblyny2ZcDQ/oVE+lC31u7XTHUaSXEK2IhgtwGxfc= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw= -k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= -k8s.io/apiserver v0.19.0/go.mod h1:XvzqavYj73931x7FLtyagh8WibHpePJ1QwWrSJs2CLk= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/cli-runtime v0.19.0/go.mod h1:tun9l0eUklT8IHIM0jors17KmUjcrAxn0myoBYwuNuo= -k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8= -k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= -k8s.io/client-go v0.19.0/go.mod h1:H9E/VT95blcFQnlyShFgnFT9ZnJOAceiUHM3MlRC+mU= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= -k8s.io/code-generator v0.19.0/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c= -k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= -k8s.io/component-base v0.19.0/go.mod h1:dKsY8BxkA+9dZIAh2aWJLL/UdASFDNtGYTCItL4LM7Y= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -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.3.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-aggregator v0.19.0/go.mod h1:1Ln45PQggFAG8xOqWPIYMxUq8WNtpPnYsbUJ39DpF/A= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.19.0/go.mod h1:gPCjjsmE6unJzgaUNXIFGZGafiUp5jh0If3F/x7/rRg= -k8s.io/metrics v0.19.0/go.mod h1:WykpW8B60OeAJx1imdwUgyOID2kDljr/Q+1zrPJ98Wo= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/controller-runtime v0.6.2/go.mod h1:vhcq/rlnENJ09SIRp3EveTaZ0yqH526hjf9iJdbUJ/E= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/controller-tools v0.2.9-0.20200414181213-645d44dca7c0/go.mod h1:YKE/iHvcKITCljdnlqHYe+kAt7ZldvtAwUzQff0k1T0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -software.sslmate.com/src/go-pkcs12 v0.0.0-20180114231543-2291e8f0f237/go.mod h1:/xvNRWUqm0+/ZMiF4EX00vrSCMsE4/NHb+Pt3freEeQ= -software.sslmate.com/src/go-pkcs12 v0.0.0-20200830195227-52f69702a001/go.mod h1:/xvNRWUqm0+/ZMiF4EX00vrSCMsE4/NHb+Pt3freEeQ= -vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/pinniped-components/post-deploy/hack/scripts/build-images.sh b/pinniped-components/post-deploy/hack/scripts/build-images.sh deleted file mode 100755 index d260f0c69b..0000000000 --- a/pinniped-components/post-deploy/hack/scripts/build-images.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -o errexit -set -o nounset -set -o pipefail - -ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." >/dev/null 2>&1 && pwd )" -# shellcheck source=./hack/scripts/common.sh -source "${ROOT_DIR}/hack/scripts/common.sh" - -REPO_NAME="${REPO_NAME:-vmware.io}" -IMAGE_NAME="${IMAGE_NAME:-tkg-pinniped-post-deploy}" -IMAGE_TAG="${VERSION//+/_}" -FULL_IMAGE_NAME="${REPO_NAME}/${IMAGE_NAME}:${IMAGE_TAG}" -FULL_IMAGE_TAR_NAME="${IMAGE_NAME}-${IMAGE_TAG}" - -# Build from publicly reachable source by default, but allow people to re-build images on -# top of their own trusted images. -BUILDER_BASE_IMAGE="${BUILDER_BASE_IMAGE:-}" -DISTROLESS_BASE_IMAGE="${DISTROLESS_BASE_IMAGE}" - -if [[ -z "${BUILDER_BASE_IMAGE}" ]]; -then - docker build \ - --build-arg DISTROLESS_BASE_IMAGE="${DISTROLESS_BASE_IMAGE}" \ - --build-arg GOPROXY="${GOPROXY}" \ - --build-arg GOSUMDB="${GOSUMDB}" \ - -t "${FULL_IMAGE_NAME}" \ - -f "${ROOT_DIR}"/Dockerfile .. -else - docker build \ - --build-arg BUILDER_BASE_IMAGE="${BUILDER_BASE_IMAGE}" \ - --build-arg DISTROLESS_BASE_IMAGE="${DISTROLESS_BASE_IMAGE}" \ - --build-arg GOPROXY="${GOPROXY}" \ - --build-arg GOSUMDB="${GOSUMDB}" \ - -t "${FULL_IMAGE_NAME}" \ - -f "${ROOT_DIR}"/Dockerfile .. -fi - -mkdir -p "${ROOT_DIR}"/artifacts/images -cd "${ROOT_DIR}"/artifacts/images -docker save "${FULL_IMAGE_NAME}" | gzip -c > "${FULL_IMAGE_TAR_NAME}.tar.gz" - -IMAGE_ID=$(docker inspect -f '{{.ID}}' "${FULL_IMAGE_NAME}") -echo "${REPO_NAME}/${IMAGE_NAME}@${IMAGE_ID}" > "${FULL_IMAGE_TAR_NAME}-image-digests.txt" - -sha256 "${FULL_IMAGE_TAR_NAME}-image-digests.txt" "${FULL_IMAGE_TAR_NAME}.tar.gz" > "${FULL_IMAGE_TAR_NAME}-image-checksums.txt" diff --git a/pinniped-components/post-deploy/hack/scripts/common.sh b/pinniped-components/post-deploy/hack/scripts/common.sh deleted file mode 100755 index cf2d6f36a1..0000000000 --- a/pinniped-components/post-deploy/hack/scripts/common.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -o errexit -set -o nounset -set -o pipefail - -################################################################################ -## FUNCTIONS ## -################################################################################ -function sha256 { - local cmd - - if command -v sha256sum &> /dev/null; then - cmd=(sha256sum) - elif command -v shasum &> /dev/null; then - cmd=(shasum -a 256) - else - echo "ERROR: could not find shasum or sha256sum." - return 1 - fi - - "${cmd[@]}" "$@" -} - -function sha1 { - local cmd - - if command -v sha1sum &> /dev/null; then - cmd=(sha1sum) - elif command -v shasum &> /dev/null; then - cmd=(shasum -a 1) - else - echo "ERROR: could not find shasum or sha1sum." - return 1 - fi - - "${cmd[@]}" "$@" -} diff --git a/pinniped-components/post-deploy/pkg/buildinfo/version.go b/pinniped-components/post-deploy/pkg/buildinfo/version.go deleted file mode 100644 index 99a18ff4ad..0000000000 --- a/pinniped-components/post-deploy/pkg/buildinfo/version.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package buildinfo holds build-time information. -// This is a separate package so that other packages can import it without -// worrying about introducing circular dependencies. -package buildinfo - -// Version is the current version, set by the go linker's -X flag at build time -var Version = "v0.0.1" - -// GitSHA is the actual commit that is being built, set by the go linker's -X flag at build time -var GitSHA string diff --git a/pinniped-components/post-deploy/pkg/configure/concierge/concierge.go b/pinniped-components/post-deploy/pkg/configure/concierge/concierge.go deleted file mode 100644 index b12cb913c9..0000000000 --- a/pinniped-components/post-deploy/pkg/configure/concierge/concierge.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package concierge implements concierge functionality. -package concierge - -import ( - "context" - "fmt" - - authv1alpha1 "go.pinniped.dev/generated/1.20/apis/concierge/authentication/v1alpha1" - pinnipedconciergeclientset "go.pinniped.dev/generated/1.20/client/concierge/clientset/versioned" - "go.uber.org/zap" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// Configurator contains concierge client information. -type Configurator struct { - Clientset pinnipedconciergeclientset.Interface -} - -// CreateOrUpdateJWTAuthenticator creates a new JWT or updates an existing one. -func (c Configurator) CreateOrUpdateJWTAuthenticator(ctx context.Context, name, issuer, audience, caData string) error { - var err error - var jwtAuthenticator *authv1alpha1.JWTAuthenticator - if jwtAuthenticator, err = c.Clientset.AuthenticationV1alpha1().JWTAuthenticators().Get(ctx, name, metav1.GetOptions{}); err != nil { - if errors.IsNotFound(err) { - // create if not found - zap.S().Infof("Creating the JWTAuthenticator %s", name) - newJWTAuthenticator := &authv1alpha1.JWTAuthenticator{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Spec: authv1alpha1.JWTAuthenticatorSpec{ - Issuer: issuer, - Audience: audience, - TLS: &authv1alpha1.TLSSpec{ - CertificateAuthorityData: caData, - }, - }, - } - if _, err = c.Clientset.AuthenticationV1alpha1().JWTAuthenticators().Create(ctx, newJWTAuthenticator, metav1.CreateOptions{}); err != nil { - err = fmt.Errorf("could not create jwtauthenticator %s: %w", name, err) - zap.S().Error(err) - return err - } - - zap.S().Infof("Created the JWTAuthenticator %s", name) - return nil - } - err = fmt.Errorf("could not get jwtauthenticator %s: %w", name, err) - zap.S().Error(err) - return err - } - - // update existing JWTAuthenticator - zap.S().Infof("Updating existing JWTAuthenticator %s", name) - copiedJwtAuthenticator := jwtAuthenticator.DeepCopy() - copiedJwtAuthenticator.Spec.Issuer = issuer - copiedJwtAuthenticator.Spec.Audience = audience - copiedJwtAuthenticator.Spec.TLS = &authv1alpha1.TLSSpec{ - CertificateAuthorityData: caData, - } - if _, err = c.Clientset.AuthenticationV1alpha1().JWTAuthenticators().Update(ctx, copiedJwtAuthenticator, metav1.UpdateOptions{}); err != nil { - err = fmt.Errorf("could not update jwtauthenticator %s: %w", name, err) - zap.S().Error(err) - return err - } - - zap.S().Infof("Updated the JWTAuthenticator %s", name) - return nil -} diff --git a/pinniped-components/post-deploy/pkg/configure/concierge/concierge_test.go b/pinniped-components/post-deploy/pkg/configure/concierge/concierge_test.go deleted file mode 100644 index 449a20a4b1..0000000000 --- a/pinniped-components/post-deploy/pkg/configure/concierge/concierge_test.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package concierge - -import ( - "context" - "errors" - "fmt" - "testing" - - "github.com/stretchr/testify/require" - authv1alpha1 "go.pinniped.dev/generated/1.20/apis/concierge/authentication/v1alpha1" - pinnipedconciergefake "go.pinniped.dev/generated/1.20/client/concierge/clientset/versioned/fake" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - kubetesting "k8s.io/client-go/testing" -) - -func TestCreateOrUpdateJWTAuthenticator(t *testing.T) { - jwtAuthenticatorGVR := authv1alpha1.SchemeGroupVersion.WithResource("jwtauthenticators") - - jwtAuthenticator := &authv1alpha1.JWTAuthenticator{ - ObjectMeta: metav1.ObjectMeta{ - Name: "some-name", - }, - Spec: authv1alpha1.JWTAuthenticatorSpec{ - Issuer: "some-issuer", - Audience: "some-audience", - TLS: &authv1alpha1.TLSSpec{ - CertificateAuthorityData: "some-ca-data", - }, - }, - } - - tests := []struct { - name string - newClientset func() *pinnipedconciergefake.Clientset - wantError string - wantActions []kubetesting.Action - }{ - { - name: "getting jwt authenticator fails", - newClientset: func() *pinnipedconciergefake.Clientset { - c := pinnipedconciergefake.NewSimpleClientset() - c.PrependReactor("get", "jwtauthenticators", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New("some get error") - }) - return c - }, - wantError: fmt.Sprintf("could not get jwtauthenticator %s: some get error", jwtAuthenticator.Name), - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator.Name), - }, - }, - { - name: "jwt authenticator does not exist", - newClientset: func() *pinnipedconciergefake.Clientset { - return pinnipedconciergefake.NewSimpleClientset() - }, - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator.Name), - kubetesting.NewRootCreateAction(jwtAuthenticatorGVR, jwtAuthenticator), - }, - }, - { - name: "jwt authenticator does not exist and creating jwtauthenticator fails", - newClientset: func() *pinnipedconciergefake.Clientset { - c := pinnipedconciergefake.NewSimpleClientset() - c.PrependReactor("create", "jwtauthenticators", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New("some create error") - }) - return c - }, - wantError: fmt.Sprintf("could not create jwtauthenticator %s: some create error", jwtAuthenticator.Name), - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator.Name), - kubetesting.NewRootCreateAction(jwtAuthenticatorGVR, jwtAuthenticator), - }, - }, - { - name: "jwt authenticator exists and is up to date", - newClientset: func() *pinnipedconciergefake.Clientset { - return pinnipedconciergefake.NewSimpleClientset(jwtAuthenticator.DeepCopy()) - }, - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator.Name), - kubetesting.NewRootUpdateAction(jwtAuthenticatorGVR, jwtAuthenticator), - }, - }, - { - name: "jwt authenticator exists and is not up to date", - newClientset: func() *pinnipedconciergefake.Clientset { - existingJWTAuthenticator := jwtAuthenticator.DeepCopy() - existingJWTAuthenticator.Spec.Issuer = "some-other-issuer" - existingJWTAuthenticator.Spec.Audience = "some-other-audience" - existingJWTAuthenticator.Spec.TLS = nil - return pinnipedconciergefake.NewSimpleClientset(jwtAuthenticator.DeepCopy()) - }, - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator.Name), - kubetesting.NewRootUpdateAction(jwtAuthenticatorGVR, jwtAuthenticator), - }, - }, - { - name: "updating jwtauthenticator fails", - newClientset: func() *pinnipedconciergefake.Clientset { - c := pinnipedconciergefake.NewSimpleClientset(jwtAuthenticator.DeepCopy()) - c.PrependReactor("update", "jwtauthenticators", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New("some update error") - }) - return c - }, - wantError: fmt.Sprintf("could not update jwtauthenticator %s: some update error", jwtAuthenticator.Name), - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator.Name), - kubetesting.NewRootUpdateAction(jwtAuthenticatorGVR, jwtAuthenticator), - }, - }, - } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - clientset := test.newClientset() - err := Configurator{ - Clientset: clientset, - }.CreateOrUpdateJWTAuthenticator( - context.Background(), - jwtAuthenticator.Name, - jwtAuthenticator.Spec.Issuer, - jwtAuthenticator.Spec.Audience, - jwtAuthenticator.Spec.TLS.CertificateAuthorityData, - ) - if test.wantError != "" { - require.EqualError(t, err, test.wantError) - } else { - require.NoError(t, err) - } - require.Equal(t, test.wantActions, clientset.Actions()) - }) - } -} diff --git a/pinniped-components/post-deploy/pkg/configure/configure.go b/pinniped-components/post-deploy/pkg/configure/configure.go deleted file mode 100644 index b127608d07..0000000000 --- a/pinniped-components/post-deploy/pkg/configure/configure.go +++ /dev/null @@ -1,573 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package configure implements configuration functionality. -package configure - -import ( - "context" - "encoding/base64" - "fmt" - "net/url" - "strings" - "time" - - certmanagerv1 "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1" - certmanagerclientset "github.com/jetstack/cert-manager/pkg/client/clientset/versioned" - pinnipedconciergeclientset "go.pinniped.dev/generated/1.20/client/concierge/clientset/versioned" - pinnipedsupervisorclientset "go.pinniped.dev/generated/1.20/client/supervisor/clientset/versioned" - "go.uber.org/zap" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/util/retry" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/configure/concierge" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/configure/dex" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/configure/supervisor" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/inspect" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/utils" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/vars" -) - -// Clients contains the various client interfaces used. -type Clients struct { - K8SClientset kubernetes.Interface - SupervisorClientset pinnipedsupervisorclientset.Interface - ConciergeClientset pinnipedconciergeclientset.Interface - CertmanagerClientset certmanagerclientset.Interface -} - -// Parameters contains the settings used. -type Parameters struct { - ClusterName string - ClusterType string - SupervisorSvcName string - SupervisorSvcNamespace string - SupervisorSvcEndpoint string - FederationDomainName string - JWTAuthenticatorName string - JWTAuthenticatorAudience string - SupervisorCertName string - SupervisorCertNamespace string - SupervisorCABundleData string - DexNamespace string - DexSvcName string - DexCertName string - DexConfigMapName string -} - -func ensureDeploymentReady(ctx context.Context, c Clients, namespace, deploymentTypeName string) error { - backOff := wait.Backoff{ - Steps: 3, - Duration: 15 * time.Second, - Factor: 1.0, - Jitter: 0.1, - } - - return retry.OnError( - backOff, - func(err error) bool { - return err != nil - }, - func() error { - var listErr error - deployments, listErr := c.K8SClientset.AppsV1().Deployments(namespace).List(ctx, metav1.ListOptions{}) - if listErr != nil { - return listErr - } - if len(deployments.Items) == 0 { - return errors.NewServiceUnavailable(fmt.Sprintf("no %s deployments found", deploymentTypeName)) - } - for i := range deployments.Items { - deployment := deployments.Items[i] - ready := deployment.Status.ReadyReplicas - desired := *deployment.Spec.Replicas - if int(ready) != int(desired) { - return errors.NewServiceUnavailable(fmt.Sprintf("the %s deployment does not have enough ready replicas. %v/%v are ready", deploymentTypeName, ready, desired)) - } - } - return nil - }) -} - -func ensureResources(ctx context.Context, c Clients, isMgmtCluster bool) (bool, error) { - zap.S().Info("Readiness check for required resources") - - backOff := wait.Backoff{ - Steps: 3, - Duration: 15 * time.Second, - Factor: 1.0, - Jitter: 0.1, - } - - // ensure concierge is ready - err := ensureDeploymentReady(ctx, c, vars.ConciergeNamespace, "concierge") - if err != nil { - zap.S().Errorf("the Pinniped concierge deployment is not ready, error: %v", err) - return false, err - } - zap.S().Infof("The Pinniped concierge deployments are ready") - - if !isMgmtCluster { - return true, nil - } - - // ensure supervisor is ready - err = ensureDeploymentReady(ctx, c, vars.SupervisorNamespace, "supervisor") - if err != nil { - zap.S().Errorf("the Pinniped supervisor deployment is not ready, error: %v", err) - return false, err - } - zap.S().Infof("The Pinniped supervisor deployments are ready") - - // ensure IDP is ready - err = retry.OnError( - backOff, - // retry just in case the resource is not yet ready - errors.IsNotFound, - func() error { - var e error - _, e = c.SupervisorClientset.IDPV1alpha1().OIDCIdentityProviders(vars.SupervisorNamespace).Get(ctx, vars.PinnipedOIDCProviderName, metav1.GetOptions{}) - return e - }, - ) - if err != nil { - zap.S().Errorf("OIDCIdentityProvider %s/%s is not ready, error: %v", vars.SupervisorNamespace, vars.PinnipedOIDCProviderName, err) - return false, err - } - zap.S().Infof("The Pinniped OIDCIdentityProvider %s/%s is ready", vars.SupervisorNamespace, vars.PinnipedOIDCProviderName) - - // only do readiness check for dex if it is required - if vars.IsDexRequired { - // ensure Dex is ready - err = retry.OnError( - backOff, - func(e error) bool { - return e != nil - }, - func() error { - var e error - dexDeployment, e := c.K8SClientset.AppsV1().Deployments(vars.DexNamespace).Get(ctx, "dex", metav1.GetOptions{}) - if e != nil { - return e - } - ready := dexDeployment.Status.ReadyReplicas - desired := *dexDeployment.Spec.Replicas - if int(ready) != int(desired) { - return errors.NewServiceUnavailable(fmt.Sprintf("Dex deployment does not have enough ready replicas. %v/%v are ready", ready, desired)) - } - return nil - }) - if err != nil { - zap.S().Errorf("the Dex deployment is not ready, error: %v", err) - return false, err - } - zap.S().Info("The Dex deployments are ready") - } - return true, nil -} - -// TKGAuthentication authenticates against Tanzu Kubernetes Grid -func TKGAuthentication(c Clients) error { - var err error - ctx := context.Background() - - inspector := inspect.Inspector{K8sClientset: c.K8SClientset, Context: ctx} - - clusterName, clusterType, err := getClusterNameAndType(inspector) - if err != nil { - return err - } - - // ensure the required resources are up and running before going to configure them - ready, err := ensureResources(ctx, c, clusterType == "management") - if !ready { - return err - } - - if err := Pinniped(ctx, c, inspector, &Parameters{ - ClusterName: clusterName, - ClusterType: clusterType, // TODO: when tkg-metadata disappears, we will error here - SupervisorSvcName: vars.SupervisorSvcName, - SupervisorSvcNamespace: vars.SupervisorNamespace, - SupervisorSvcEndpoint: vars.SupervisorSvcEndpoint, - FederationDomainName: vars.FederationDomainName, - JWTAuthenticatorName: vars.JWTAuthenticatorName, - JWTAuthenticatorAudience: vars.JWTAuthenticatorAudience, - SupervisorCertName: vars.SupervisorCertName, - SupervisorCertNamespace: vars.SupervisorNamespace, - SupervisorCABundleData: vars.SupervisorCABundleData, - DexNamespace: vars.DexNamespace, - DexSvcName: vars.DexSvcName, - DexCertName: vars.DexCertName, - DexConfigMapName: vars.DexConfigMapName, - }); err != nil { - // logging has been done inside the function - return err - } - zap.S().Info("Successfully configured the Pinniped") - - if vars.IsDexRequired { - if err := Dex(ctx, c, inspector, &Parameters{ - ClusterName: clusterName, - ClusterType: clusterType, // TODO: when tkg-metadata disappears, we will error here - SupervisorSvcName: vars.SupervisorSvcName, - SupervisorSvcNamespace: vars.SupervisorNamespace, - SupervisorSvcEndpoint: vars.SupervisorSvcEndpoint, - FederationDomainName: vars.FederationDomainName, - JWTAuthenticatorName: vars.JWTAuthenticatorName, - SupervisorCertName: vars.SupervisorCertName, - SupervisorCertNamespace: vars.SupervisorNamespace, - SupervisorCABundleData: vars.SupervisorCABundleData, - DexNamespace: vars.DexNamespace, - DexSvcName: vars.DexSvcName, - DexCertName: vars.DexCertName, - }); err != nil { - // logging has been done inside the function - return err - } - zap.S().Info("Successfully configured Dex") - } - return nil -} - -// configureTLSSecret will configure and return the secret used for TLS. -func configureTLSSecret(ctx context.Context, c Clients, certNamespace, certName, endpoint string) (*corev1.Secret, error) { - var secret *corev1.Secret - var err error - // If users specifies a custom TLS secret, use it directly - if vars.CustomTLSSecretName != "" { - zap.S().Infof("Override certificate with user provided secret %s", vars.CustomTLSSecretName) - if secret, err = c.K8SClientset.CoreV1().Secrets(certNamespace).Get(ctx, vars.CustomTLSSecretName, metav1.GetOptions{}); err != nil { - zap.S().Error(err) - return secret, err - } - } else { - // Update Pinniped supervisor certificate - var updatedCert *certmanagerv1.Certificate - if updatedCert, err = updateCertSubjectAltNames(ctx, c, certNamespace, certName, endpoint); err != nil { - // log has been done inside of UpdateCert() - return secret, err - } - - if secret, err = utils.GetSecretFromCert(ctx, c.K8SClientset, updatedCert); err != nil { - zap.S().Error(err) - return secret, err - } - } - - return secret, nil -} - -// Pinniped initializes Pinniped -// nolint:gocyclo // We should refactor this thing to be less unruly... -func Pinniped(ctx context.Context, c Clients, inspector inspect.Inspector, p *Parameters) error { - var err error - - zap.S().Info("Configure Pinniped...") - conciergeConfigurator := concierge.Configurator{Clientset: c.ConciergeClientset} - if p.ClusterType == constants.TKGMgmtClusterType { - zap.S().Info("Management cluster detected") - // endpoint is the routable endpoint for Pinniped supervisor. e.g. https://10.161.151.250:31234 - var supervisorSvcEndpoint string - if p.SupervisorSvcEndpoint != "" { - // If the endpoint is passed in, then use it for management cluster otherwise construct the correct one - supervisorSvcEndpoint, err = utils.RemoveDefaultTLSPort(p.SupervisorSvcEndpoint) - if err != nil { - zap.S().Error(err) - return err - } - } else if supervisorSvcEndpoint, err = inspector.GetServiceEndpoint(p.SupervisorSvcNamespace, p.SupervisorSvcName); err != nil { - zap.S().Error(err) - return err - } - supervisorConfigurator := supervisor.Configurator{Clientset: c.SupervisorClientset, K8SClientset: c.K8SClientset} - if err = supervisorConfigurator.CreateOrUpdateFederationDomain(ctx, vars.SupervisorNamespace, p.FederationDomainName, supervisorSvcEndpoint); err != nil { - zap.S().Error(err) - return err - } - - secret, err := configureTLSSecret(ctx, c, p.SupervisorCertNamespace, p.SupervisorCertName, supervisorSvcEndpoint) - if err != nil { - return err - } - - // create Pinniped concierge JWTAuthenticator - caData := base64.StdEncoding.EncodeToString(secret.Data["ca.crt"]) - if err = conciergeConfigurator.CreateOrUpdateJWTAuthenticator(ctx, - p.JWTAuthenticatorName, supervisorSvcEndpoint, supervisorSvcEndpoint, caData); err != nil { - zap.S().Error(err) - return err - } - - // create configmap for Pinniped info - if err := createOrUpdateManagementClusterPinnipedInfo(ctx, pinnipedinfo.PinnipedInfo{ - ClusterName: p.ClusterName, - Issuer: supervisorSvcEndpoint, - IssuerCABundleData: caData, - }, c.K8SClientset, p.SupervisorSvcNamespace); err != nil { - return err - } - } else if p.ClusterType == constants.TKGWorkloadClusterType { - zap.S().Info("Workload cluster detected") - - audience := p.JWTAuthenticatorAudience - if audience == "" { - audience = p.ClusterName - } - - if err = conciergeConfigurator.CreateOrUpdateJWTAuthenticator(ctx, p.JWTAuthenticatorName, p.SupervisorSvcEndpoint, audience, p.SupervisorCABundleData); err != nil { - // on workload cluster, we only create or update JWTAuthenticator - // SupervisorSvcEndpoint will be passed in on workload cluster - zap.S().Error(err) - return err - } - } else { - return fmt.Errorf("unknown cluster type %s", p.ClusterType) - } - - zap.S().Infof("Restarting Pinniped supervisor pods to reload the configmap that contains custom TLS secret names...") - // restart the Pinniped pod to refresh the config - // After the user specifies a custom Pinniped secret name, we need to update the default Pinniped TLS secret name stored in a config map. - // This info can't be refreshed unless the Pinniped supervisor pods are restarted. - var podList *corev1.PodList - podList, err = c.K8SClientset.CoreV1().Pods(p.SupervisorSvcNamespace).List(ctx, metav1.ListOptions{}) - if err != nil { - zap.S().Error(err) - return err - } - - for i := range podList.Items { - pod := &podList.Items[i] - if strings.Contains(pod.Name, "pinniped-supervisor") { - zap.S().Infof("Restarting Pinniped supervisor pod %s", pod.Name) - if err = c.K8SClientset.CoreV1().Pods(p.SupervisorSvcNamespace).Delete(ctx, pod.Name, metav1.DeleteOptions{}); err != nil { - zap.S().Error(err) - return err - } - } - } - - return nil -} - -// Dex initializes Dex. -func Dex(ctx context.Context, c Clients, inspector inspect.Inspector, p *Parameters) error { - var err error - - // Only deploy Dex on management cluster - if p.ClusterType == constants.TKGMgmtClusterType { - zap.S().Info("Configure Dex...") - zap.S().Info("Management cluster detected") - // endpoint is the routable endpoint for Pinniped supervisor. e.g. https://10.161.151.250:31234 - var supervisorSvcEndpoint string - if p.SupervisorSvcEndpoint != "" { - // If the endpoint is passed in, then use it for management cluster otherwise construct the correct one - supervisorSvcEndpoint = p.SupervisorSvcEndpoint - } else if supervisorSvcEndpoint, err = inspector.GetServiceEndpoint(p.SupervisorSvcNamespace, p.SupervisorSvcName); err != nil { - zap.S().Error(err) - return err - } - - var dexSvcEndpoint string - if dexSvcEndpoint, err = inspector.GetServiceEndpoint(p.DexNamespace, p.DexSvcName); err != nil { - zap.S().Error(err) - return err - } - - secret, err := configureTLSSecret(ctx, c, p.DexNamespace, p.DexCertName, dexSvcEndpoint) - if err != nil { - return err - } - - // recreate the OIDCIdentityProvider - supervisorConfigurator := supervisor.Configurator{Clientset: c.SupervisorClientset, K8SClientset: c.K8SClientset} - if _, err = supervisorConfigurator.RecreateIDPForDex(ctx, p.DexNamespace, p.DexSvcName, secret); err != nil { - zap.S().Error(err) - return err - } - - // update configmap - var clientSecret string - clientSecret, err = utils.RandomHex(16) - if err != nil { - zap.S().Error(err) - return err - } - dexConfigurator := dex.Configurator{CertmanagerClientset: c.CertmanagerClientset, K8SClientset: c.K8SClientset} - if err := dexConfigurator.CreateOrUpdateDexConfigMap(ctx, &dex.Info{ - DexSvcEndpoint: dexSvcEndpoint, - SupervisorSvcEndpoint: supervisorSvcEndpoint, - DexNamespace: p.DexNamespace, - DexConfigmapName: p.DexConfigMapName, - ClientSecret: clientSecret, - }); err != nil { - return err - } - - // update Pinniped OIDC client secret - var dexClientCredentialSecret *corev1.Secret - if dexClientCredentialSecret, err = c.K8SClientset.CoreV1().Secrets(vars.SupervisorNamespace).Get(ctx, vars.PinnipedOIDCClientSecretName, metav1.GetOptions{}); err != nil { - return err - } - dexClientCredentialSecret.StringData = map[string]string{ - "clientID": constants.DexClientID, - "clientSecret": clientSecret, - } - if _, err = c.K8SClientset.CoreV1().Secrets(vars.SupervisorNamespace).Update(ctx, dexClientCredentialSecret, metav1.UpdateOptions{}); err != nil { - return err - } - zap.S().Infof("Updated Pinniped OIDC client secret to match Dex staticClient config") - - // restart the Dex pod to refresh the config - var podList *corev1.PodList - podList, err = c.K8SClientset.CoreV1().Pods(p.DexNamespace).List(ctx, metav1.ListOptions{}) - if err != nil { - zap.S().Error(err) - return err - } - for i := range podList.Items { - pod := &podList.Items[i] - if err = c.K8SClientset.CoreV1().Pods(p.DexNamespace).Delete(ctx, pod.Name, metav1.DeleteOptions{}); err != nil { - zap.S().Error(err) - return err - } - } - } - - return nil -} - -func updateCertSubjectAltNames(ctx context.Context, c Clients, certNamespace, certName, fullURL string) (*certmanagerv1.Certificate, error) { - var err error - var cert *certmanagerv1.Certificate - - if cert, err = c.CertmanagerClientset.CertmanagerV1().Certificates(certNamespace).Get(ctx, certName, metav1.GetOptions{}); err != nil { - // no-op is the certificate does not exist - if errors.IsNotFound(err) { - zap.S().Warnf("The Certificate %s/%s does not exist. Nothing to be updated", certNamespace, certName) - return nil, nil - } - zap.S().Error(err) - return nil, err - } - - // delete the secret, the deletion of certificate might not have the corresponding secret deleted. - zap.S().Infof("Deleting the Secret %s/%s", certNamespace, cert.Spec.SecretName) - err = retry.OnError(retry.DefaultRetry, - func(e error) bool { - if errors.IsNotFound(e) { - zap.S().Warnf("The Secret %s/%s does not exist, nothing to delete", certNamespace, cert.Spec.SecretName) - return false - } - return true - }, - func() error { - return c.K8SClientset.CoreV1().Secrets(certNamespace).Delete(ctx, cert.Spec.SecretName, metav1.DeleteOptions{}) - }, - ) - if err != nil { - if !errors.IsNotFound(err) { - zap.S().Error(err) - return nil, err - } - - // If the secret is not found, just log as warning, without returning error back - zap.S().Warn(err) - } - zap.S().Infof("Deleted the Secret %s/%s", certNamespace, cert.Spec.SecretName) - - // update the dnsNames or ipAddresses section in certificate - var parsedURL *url.URL - if parsedURL, err = url.Parse(fullURL); err != nil { - zap.S().Error(err) - return nil, err - } - host := parsedURL.Hostname() - zap.S().Infof("Updating the Certificate %s/%s with host: %s", certNamespace, certName, host) - var updatedCert *certmanagerv1.Certificate - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { - var fetchedCert *certmanagerv1.Certificate - var e error - if fetchedCert, e = c.CertmanagerClientset.CertmanagerV1().Certificates(certNamespace).Get(ctx, certName, metav1.GetOptions{}); e != nil { - return e - } - if utils.IsIP(host) { - fetchedCert.Spec.IPAddresses = []string{host} - } else { - // unset CN in the case if we have DNSNames because of the following reasons: - // 1. CN is a deprecated x509 field - // 2. CN from cert manager has 64 characters limit, usually hostname is longer than that if using ELB or others - fetchedCert.Spec.CommonName = "" - fetchedCert.Spec.DNSNames = []string{host} - } - updatedCert, e = c.CertmanagerClientset.CertmanagerV1().Certificates(certNamespace).Update(ctx, fetchedCert, metav1.UpdateOptions{}) - return e - }) - if err != nil { - zap.S().Error(err) - return nil, err - } - zap.S().Infof("Updated the Certificate %s/%s with host: %s", certNamespace, certName, host) - - return updatedCert, nil -} - -// getClusterNameAndType handles obtaining cluster name & type to correctly configure the JWTAuthenticator -// correctly for the given cluster. -func getClusterNameAndType(inspector inspect.Inspector) (clusterName, clusterType string, err error) { - foundMetadata, err := inspector.GetTKGMetadata() - if err != nil { - // all errors are unexpected errors as GetTKGMetadata() will not return a 404 - return "", "", err - } - if foundMetadata != nil { - return foundMetadata.Cluster.Name, foundMetadata.Cluster.Type, nil - } - // tkg-metadata was not found. in a TKGs scenerio we may still be able to recover. - if len(vars.JWTAuthenticatorAudience) != 0 { - // This is a TKGs workload cluster fallback use case. - // TKGs will pass audience via the flag --jwtauthenticator-audience=- - // If so, it will be used as an override to cluster.name (and we know the cluster.type is workload) - // NOTE: if anyone besides TKGs is using this flag, they may still run into unexpected behaviour not - // knowing that this inference is made. - return "", constants.TKGWorkloadClusterType, nil - } - - return "", "", fmt.Errorf("tkg-metadata configmap not found, nor was --jwtauthenticator-audience flag present, jwtauthenticator audience cannot be configured: %w", err) - // // FUTURE - // // TKGm workload||management future use case - // // if we don't have tkg-metadata available, we need to attempt to infer cluster.name and cluster.type from other resources. - // nodeList, err := c.K8SClientset.CoreV1().Nodes().List(ctx, metav1.ListOptions{}) - // if err != nil { - // zap.S().Errorf("%s, jwtauthenticator audience cannot be configured", err) - // // if we can't list nodes, we don't have an alternative course of action at this point. - // // fail hard. this is an unexpected fail state. we could look into alternatives such as: - // // - get the kube-system namespace for the cluster and use its UID - // // - simply generate another random string - // return "", "", fmt.Errorf("%s, jwtauthenticator audience cannot be configured", err) - // } - // if len(nodeList.Items) == 0 { - // zap.S().Error("no nodes available to read cluster-name annotation, jwtauthenticator audience cannot be configured") - // return "", "", stdliberrors.New("no nodes available to read cluster-name annotation, jwtauthenticator audience cannot be configured") - // } - // - // zap.S().Info("Successfully listed Nodes") - // // cluster-api provides cluster-name annotation on nodes - // for _, node := range nodeList.Items { - // if len(node.Annotations["cluster.x-k8s.io/cluster-name"]) != 0 { - // clusterName = node.Annotations["cluster.x-k8s.io/cluster-name"] - // break - // } - // } - // if clusterName == "" { - // return "", "", stdliberrors.New("nodes not annotated with cluster-name annotation, jwtauthenticator audience cannot be configured") - // } - // - // return clusterName, "", stdliberrors.New("cluster name inferred from nodes, but cluster type is unknown, jwtauthenticator audience cannot be configured") -} diff --git a/pinniped-components/post-deploy/pkg/configure/configure_test.go b/pinniped-components/post-deploy/pkg/configure/configure_test.go deleted file mode 100644 index 501962a360..0000000000 --- a/pinniped-components/post-deploy/pkg/configure/configure_test.go +++ /dev/null @@ -1,847 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package configure - -import ( - "context" - "encoding/base64" - "fmt" - "testing" - - certmanagerv1 "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1" - certmanagerfake "github.com/jetstack/cert-manager/pkg/client/clientset/versioned/fake" - "github.com/stretchr/testify/require" - "go.uber.org/zap" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - kubefake "k8s.io/client-go/kubernetes/fake" - kubetesting "k8s.io/client-go/testing" - "k8s.io/utils/pointer" - - authv1alpha1 "go.pinniped.dev/generated/1.20/apis/concierge/authentication/v1alpha1" - configv1alpha1 "go.pinniped.dev/generated/1.20/apis/supervisor/config/v1alpha1" - idpv1alpha1 "go.pinniped.dev/generated/1.20/apis/supervisor/idp/v1alpha1" - supervisoridpv1alpha1 "go.pinniped.dev/generated/1.20/apis/supervisor/idp/v1alpha1" - pinnipedconciergefake "go.pinniped.dev/generated/1.20/client/concierge/clientset/versioned/fake" - pinnipedsupervisorfake "go.pinniped.dev/generated/1.20/client/supervisor/clientset/versioned/fake" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/inspect" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/vars" -) - -func TestTKGAuthentication(t *testing.T) { - - const ( - supervisorNamespaceName = "pinniped-supervisor" // vars.SupervisorNamespace default - supervisorNamespaceUID = "pinniped-supervisor-namespace-object-uid" - ) - - enableLogging() // Comment me out for less verbose test logs - - supervisorNamespace := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: supervisorNamespaceName, - UID: supervisorNamespaceUID, - }, - } - - supervisorCertificateSecret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: supervisorNamespaceName, - Name: "some-supervisor-certificate-secret-name", - }, - Type: corev1.SecretTypeTLS, - Data: map[string][]byte{ - "ca.crt": []byte("some-ca-bundle-data"), - }, - } - - supervisorService := &corev1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: supervisorNamespaceName, - // This is set via flag on post-deploy job, the default value is empty string. This simplifies the test. - Name: "", - }, - Spec: corev1.ServiceSpec{ - Type: corev1.ServiceTypeLoadBalancer, - Ports: []corev1.ServicePort{{Port: 12345}}, - }, - Status: corev1.ServiceStatus{ - LoadBalancer: corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{{IP: "1.2.3.4"}}, - }, - }, - } - - supervisorCertificate := &certmanagerv1.Certificate{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: supervisorNamespaceName, - // This is set via flag on post-deploy job, the default value is empty string. This simplifies the test. - Name: "", - }, - Spec: certmanagerv1.CertificateSpec{ - SecretName: supervisorCertificateSecret.Name, - IPAddresses: []string{ - supervisorService.Status.LoadBalancer.Ingress[0].IP, - }, - }, - } - - federationDomainGVR := configv1alpha1.SchemeGroupVersion.WithResource("federationdomains") - federationDomain := &configv1alpha1.FederationDomain{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: supervisorNamespaceName, - Name: "my-federation-domain", - }, - Spec: configv1alpha1.FederationDomainSpec{ - Issuer: serviceHTTPSEndpoint(supervisorService), - }, - } - - jwtAuthenticatorGVR := authv1alpha1.SchemeGroupVersion.WithResource("jwtauthenticators") - jwtAuthenticator := func(audience string) *authv1alpha1.JWTAuthenticator { - return &authv1alpha1.JWTAuthenticator{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-cool-authenticator", - }, - Spec: authv1alpha1.JWTAuthenticatorSpec{ - Issuer: federationDomain.Spec.Issuer, - Audience: audience, - TLS: &authv1alpha1.TLSSpec{ - CertificateAuthorityData: base64.StdEncoding.EncodeToString(supervisorCertificateSecret.Data["ca.crt"]), - }, - }, - } - } - - tkgMetadataConfigmapManagementCluster := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: constants.TKGSystemPublicNamespace, - Name: constants.TKGMetaConfigMapName, - }, - Data: map[string]string{ - "metadata.yaml": `cluster: - name: tkg-mgmt-vc - type: management - plan: dev - kubernetesProvider: VMware Tanzu Kubernetes Grid - tkgVersion: v1.6.0-zshippable - edition: tkg`, - }, - } - tkgMetadataConfigmapWorkloadCluster := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: constants.TKGSystemPublicNamespace, - Name: constants.TKGMetaConfigMapName, - }, - Data: map[string]string{ - "metadata.yaml": `cluster: - name: some-workload-cluster - type: workload - plan: dev - kubernetesProvider: VMware Tanzu Kubernetes Grid - tkgVersion: v1.6.0-zshippable - edition: tkg`, - }, - } - - conciergeDeployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "pinniped-concierge", - Name: "pinniped-concierge", - }, - Spec: appsv1.DeploymentSpec{ - Replicas: pointer.Int32Ptr(1), - }, - Status: appsv1.DeploymentStatus{ - Replicas: int32(1), - ReadyReplicas: int32(1), - }, - } - supervisorDeployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "pinniped-supervisor", - Name: "pinniped-supervisor", - }, - Spec: appsv1.DeploymentSpec{ - Replicas: pointer.Int32Ptr(1), - }, - Status: appsv1.DeploymentStatus{ - Replicas: int32(1), - ReadyReplicas: int32(1), - }, - } - - oidcIdentityProviderGVR := idpv1alpha1.SchemeGroupVersion.WithResource("oidcidentityproviders") - upstreamIdentityProvider := &supervisoridpv1alpha1.OIDCIdentityProvider{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "pinniped-supervisor", - Name: "upstream-oidc-identity-provider", - }, - Spec: supervisoridpv1alpha1.OIDCIdentityProviderSpec{ - Issuer: "https://identityforall.com", - Claims: supervisoridpv1alpha1.OIDCClaims{ - Username: "email", - }, - Client: supervisoridpv1alpha1.OIDCClient{ - SecretName: "some-upstream-oidc-client", - }, - }, - Status: supervisoridpv1alpha1.OIDCIdentityProviderStatus{ - Phase: supervisoridpv1alpha1.PhaseReady, - }, - } - - // NOTE: these tests exercise what is essentially glue code between TKGs & TKGm to make uTKG functional for the Pinniped Package. - // There is a combination of flags, defaulting values and querying a configmap on cluster that can ultimately lead to a functioning - // pinniped installation. These tests are valuable as this is difficult to reason about without knowledge if the external factors. - tests := []struct { - name string - newKubeClient func() *kubefake.Clientset - newCertManagerClient func() *certmanagerfake.Clientset - newSupervisorClient func() *pinnipedsupervisorfake.Clientset - newConciergeClient func() *pinnipedconciergefake.Clientset - finalSetup func() - cleanup func() - wantError string - wantConciergeClientActions []kubetesting.Action - wantSupervisorClientActions []kubetesting.Action - }{ - { - name: "TKGm Management Cluster Case: The JWTAuthenticator audience is set to the Supervisor Service Endpoint value and the cluster.type is derived from tkg-metadata configmap and the pinniped supervisor will be deployed", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset( - supervisorNamespace, - tkgMetadataConfigmapManagementCluster, - conciergeDeployment, - supervisorDeployment, - supervisorService, - supervisorCertificateSecret, - ) - c.PrependReactor("delete", "secrets", func(action kubetesting.Action) (bool, runtime.Object, error) { - // When we delete the secret in the implementation, we expect the cert-manager controller - // to recreate it. Since there is no cert-manager controller running, let's just tell the - // fake kube client to not delete it (i.e., that we "handled" the delete ourselves). - return actionIsOnObject(action, supervisorCertificateSecret), nil, nil - }) - return c - }, - newCertManagerClient: func() *certmanagerfake.Clientset { - return certmanagerfake.NewSimpleClientset(supervisorCertificate) - }, - newSupervisorClient: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset( - upstreamIdentityProvider, - federationDomain, - ) - }, - newConciergeClient: func() *pinnipedconciergefake.Clientset { - defaultJWTAuthenticator := jwtAuthenticator("initial-incorrect-audience") - return pinnipedconciergefake.NewSimpleClientset(defaultJWTAuthenticator) - }, - // In the TKGm use case on a Management Cluster, the Audience is set to the supervisor service endpoint value. - // This is probably a little weird, it is definitely unexpected. - // But it is likely a unique value amongst the fleet of clusters and therefore seems to work today. - // If this is ever changed (in production code) to be a more expected audience (e.g. cluster.name-cluster.uid) - // it would invalidate existing deployed kubeconfigs. Proceed with caution! - wantConciergeClientActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator("").Name), - kubetesting.NewRootUpdateAction(jwtAuthenticatorGVR, jwtAuthenticator("https://1.2.3.4:12345")), - }, - wantSupervisorClientActions: []kubetesting.Action{ - kubetesting.NewGetAction(oidcIdentityProviderGVR, upstreamIdentityProvider.Namespace, upstreamIdentityProvider.Name), - kubetesting.NewGetAction(federationDomainGVR, federationDomain.Namespace, federationDomain.Name), - kubetesting.NewUpdateAction(federationDomainGVR, federationDomain.Namespace, &configv1alpha1.FederationDomain{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-federation-domain", - Namespace: "pinniped-supervisor", - }, - Spec: configv1alpha1.FederationDomainSpec{ - Issuer: "https://1.2.3.4:12345", - TLS: nil, // when nil, Pinniped will use trusted CA's compiled into the container image - }, - }), - }, - }, - { - name: "TKGm Workload Cluster Case: When the tkg-metadata configmap is found, the cluster.name and cluster.type is used from the configmap to configure pinniped and set the concierge jwtauthenticator audience and supervisor will not be deployed", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset( - tkgMetadataConfigmapWorkloadCluster, - conciergeDeployment, - supervisorDeployment, - supervisorService, - supervisorCertificateSecret, - ) - c.PrependReactor("delete", "secrets", func(action kubetesting.Action) (bool, runtime.Object, error) { - // When we delete the secret in the implementation, we expect the cert-manager controller - // to recreate it. Since there is no cert-manager controller running, let's just tell the - // fake kube client to not delete it (i.e., that we "handled" the delete ourselves). - return actionIsOnObject(action, supervisorCertificateSecret), nil, nil - }) - return c - }, - newCertManagerClient: func() *certmanagerfake.Clientset { - return certmanagerfake.NewSimpleClientset(supervisorCertificate) - }, - newSupervisorClient: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset( - upstreamIdentityProvider, - ) - }, - newConciergeClient: func() *pinnipedconciergefake.Clientset { - defaultJWTAuthenticator := jwtAuthenticator("initial-incorrect-audience") - return pinnipedconciergefake.NewSimpleClientset(defaultJWTAuthenticator) - }, - wantConciergeClientActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator("").Name), - kubetesting.NewRootUpdateAction(jwtAuthenticatorGVR, jwtAuthenticator("some-workload-cluster")), - }, - // this is not a mgmt cluster, so no supervisor actions should take place - wantSupervisorClientActions: []kubetesting.Action{}, - finalSetup: func() { - vars.SupervisorSvcEndpoint = "https://1.2.3.4:12345" // mgmt cluster figures this out by itself, but workload does not. - }, - cleanup: func() { - vars.SupervisorSvcEndpoint = "" - }, - }, - { - name: "TKGs Workload Cluster Case: When the --jwtauthenticator-audience flag is provided then its value becomes the jwtauthenticator audience and the cluster.type is assumed to be workload which means supervisor will not be deployed", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset( - conciergeDeployment, - supervisorDeployment, - supervisorService, - supervisorCertificateSecret, - ) - c.PrependReactor("delete", "secrets", func(action kubetesting.Action) (bool, runtime.Object, error) { - // When we delete the secret in the implementation, we expect the cert-manager controller - // to recreate it. Since there is no cert-manager controller running, let's just tell the - // fake kube client to not delete it (i.e., that we "handled" the delete ourselves). - return actionIsOnObject(action, supervisorCertificateSecret), nil, nil - }) - return c - }, - newCertManagerClient: func() *certmanagerfake.Clientset { - return certmanagerfake.NewSimpleClientset(supervisorCertificate) - }, - newSupervisorClient: func() *pinnipedsupervisorfake.Clientset { - // return a fake idp when requsted - return pinnipedsupervisorfake.NewSimpleClientset( - upstreamIdentityProvider, - ) - }, - newConciergeClient: func() *pinnipedconciergefake.Clientset { - defaultJWTAuthenticator := jwtAuthenticator("initial-incorrect-audience") - return pinnipedconciergefake.NewSimpleClientset(defaultJWTAuthenticator) - }, - finalSetup: func() { - // this var emulate the set flag --jwtauthenticator-audience=amazing.cluster-1234567890 - // therefore: - // - audience=amazing.cluster-1234567890 is set as Audience - // - Cluster.Type is inferred to be "workload" - vars.JWTAuthenticatorAudience = "amazing.cluster-1234567890" - vars.SupervisorSvcEndpoint = "https://1.2.3.4:12345" // mgmt cluster figures this out by itself, but workload does not. - }, - cleanup: func() { - vars.JWTAuthenticatorAudience = "" - vars.SupervisorSvcEndpoint = "" - }, - wantConciergeClientActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator("").Name), - kubetesting.NewRootUpdateAction(jwtAuthenticatorGVR, jwtAuthenticator("amazing.cluster-1234567890")), - }, - // this is not a mgmt cluster, so no supervisor actions should take place - wantSupervisorClientActions: []kubetesting.Action{}, - }, - } - - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - vars.JWTAuthenticatorName = "my-cool-authenticator" - vars.FederationDomainName = "my-federation-domain" - vars.SupervisorCABundleData = base64.StdEncoding.EncodeToString([]byte("some-ca-bundle-data")) - t.Cleanup(func() { - vars.JWTAuthenticatorName = "" - vars.FederationDomainName = "" - vars.SupervisorCABundleData = "" - }) - fakeKubeClient := test.newKubeClient() - fakeCertManagerClient := test.newCertManagerClient() - supervisorClientset := test.newSupervisorClient() - conciergeClientset := test.newConciergeClient() - clients := Clients{ - K8SClientset: fakeKubeClient, - CertmanagerClientset: fakeCertManagerClient, - SupervisorClientset: supervisorClientset, - ConciergeClientset: conciergeClientset, - } - - if test.finalSetup != nil { - test.finalSetup() - } - t.Cleanup(func() { - if test.cleanup != nil { - test.cleanup() - } - }) - err := TKGAuthentication(clients) - - require.Equal(t, test.wantSupervisorClientActions, supervisorClientset.Actions()) - require.Equal(t, test.wantConciergeClientActions, conciergeClientset.Actions()) - - if test.wantError != "" { - require.EqualError(t, err, test.wantError) - } else { - require.NoError(t, err) - } - }) - } -} - -func TestPinniped(t *testing.T) { - const ( - supervisorNamespaceName = "pinniped-supervisor" // vars.SupervisorNamespace default - supervisorNamespaceUID = "pinniped-supervisor-namespace-object-uid" - ) - - enableLogging() // Comment me out for less verbose test logs - - namespaceGVR := corev1.SchemeGroupVersion.WithResource("namespaces") - supervisorNamespace := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: supervisorNamespaceName, - UID: supervisorNamespaceUID, - }, - } - - podGVR := corev1.SchemeGroupVersion.WithResource("pods") - podGVK := corev1.SchemeGroupVersion.WithKind("Pod") - supervisorPods := []*corev1.Pod{ - {ObjectMeta: metav1.ObjectMeta{Namespace: supervisorNamespaceName, Name: "pinniped-supervisor-abc"}}, - {ObjectMeta: metav1.ObjectMeta{Namespace: supervisorNamespaceName, Name: "pinniped-supervisor-def"}}, - } - - secretGVR := corev1.SchemeGroupVersion.WithResource("secrets") - supervisorCertificateSecret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: supervisorNamespaceName, - Name: "some-supervisor-certificate-secret-name", - }, - Type: corev1.SecretTypeTLS, - Data: map[string][]byte{ - "ca.crt": []byte("some-ca-bundle-data"), - }, - } - - serviceGVR := corev1.SchemeGroupVersion.WithResource("services") - supervisorService := &corev1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: supervisorNamespaceName, - Name: "some-supervisor-service-name", - }, - Spec: corev1.ServiceSpec{ - Type: corev1.ServiceTypeLoadBalancer, - Ports: []corev1.ServicePort{{Port: 12345}}, - }, - Status: corev1.ServiceStatus{ - LoadBalancer: corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{{IP: "1.2.3.4"}}, - }, - }, - } - - supervisorNamespaceOwnerRef := metav1.OwnerReference{ - APIVersion: "v1", - Kind: "Namespace", - Name: supervisorNamespaceName, - UID: supervisorNamespaceUID, - } - - configMapGVR := corev1.SchemeGroupVersion.WithResource("configmaps") - pinnipedInfoConfigMap := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "kube-public", - Name: "pinniped-info", - OwnerReferences: []metav1.OwnerReference{supervisorNamespaceOwnerRef}, - }, - Data: map[string]string{ - "cluster_name": "some-pinniped-info-management-cluster-name", - "issuer": serviceHTTPSEndpoint(supervisorService), - "issuer_ca_bundle_data": base64.StdEncoding.EncodeToString(supervisorCertificateSecret.Data["ca.crt"]), - }, - } - - certificateGVR := certmanagerv1.SchemeGroupVersion.WithResource("certificates") - supervisorCertificate := &certmanagerv1.Certificate{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: supervisorNamespaceName, - Name: "some-supervisor-certificate-name", - }, - Spec: certmanagerv1.CertificateSpec{ - SecretName: supervisorCertificateSecret.Name, - IPAddresses: []string{ - supervisorService.Status.LoadBalancer.Ingress[0].IP, - }, - }, - } - - federationDomainGVR := configv1alpha1.SchemeGroupVersion.WithResource("federationdomains") - federationDomain := &configv1alpha1.FederationDomain{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: supervisorNamespaceName, - Name: "some-federation-domain-name", - }, - Spec: configv1alpha1.FederationDomainSpec{ - Issuer: serviceHTTPSEndpoint(supervisorService), - }, - } - - jwtAuthenticatorGVR := authv1alpha1.SchemeGroupVersion.WithResource("jwtauthenticators") - jwtAuthenticator := &authv1alpha1.JWTAuthenticator{ - ObjectMeta: metav1.ObjectMeta{ - Name: "some-jwt-authenticator-name", - }, - Spec: authv1alpha1.JWTAuthenticatorSpec{ - Issuer: federationDomain.Spec.Issuer, - Audience: federationDomain.Spec.Issuer, - TLS: &authv1alpha1.TLSSpec{ - CertificateAuthorityData: base64.StdEncoding.EncodeToString(supervisorCertificateSecret.Data["ca.crt"]), - }, - }, - } - jwtAuthenticatorWithUUIDAudience := jwtAuthenticator.DeepCopy() - jwtAuthenticatorWithUUIDAudience.ObjectMeta.Name = "jwt-authenticator-meow" - jwtAuthenticatorWithUUIDAudience.Spec.Audience = "tiny angry kittens TINY ANGRY KITTENS!!!" - - tests := []struct { - name string - newKubeClient func() *kubefake.Clientset - newCertManagerClient func() *certmanagerfake.Clientset - newSupervisorClient func() *pinnipedsupervisorfake.Clientset - newConciergeClient func() *pinnipedconciergefake.Clientset - parameters Parameters - wantError string - wantKubeClientActions []kubetesting.Action - wantCertManagerClientActions []kubetesting.Action - wantSupervisorClientActions []kubetesting.Action - wantConciergeClientActions []kubetesting.Action - }{ - { - name: "management cluster configured from scratch", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset( - supervisorNamespace, - supervisorService, - supervisorCertificateSecret, - supervisorPods[0], - supervisorPods[1], - ) - c.PrependReactor("delete", "secrets", func(action kubetesting.Action) (bool, runtime.Object, error) { - // When we delete the secret in the implementation, we expect the cert-manager controller - // to recreate it. Since there is no cert-manager controller running, let's just tell the - // fake kube client to not delete it (i.e., that we "handled" the delete ourselves). - return actionIsOnObject(action, supervisorCertificateSecret), nil, nil - }) - return c - }, - newCertManagerClient: func() *certmanagerfake.Clientset { - return certmanagerfake.NewSimpleClientset(supervisorCertificate) - }, - newSupervisorClient: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset() - }, - newConciergeClient: func() *pinnipedconciergefake.Clientset { - // The jwtauthenticator is usually deployed onto the management cluster with no spec fields - // set; see: - // https://github.com/vmware-tanzu/community-edition/blob/1aa7936d88f5d9b04398d800bfe83a165619ee16/addons/packages/pinniped/0.4.4/bundle/config/overlay/pinniped-jwtauthenticator.yaml - defaultJWTAuthenticator := jwtAuthenticator.DeepCopy() - defaultJWTAuthenticator.Spec = authv1alpha1.JWTAuthenticatorSpec{} - return pinnipedconciergefake.NewSimpleClientset(defaultJWTAuthenticator) - }, - parameters: Parameters{ - ClusterType: "management", - ClusterName: pinnipedInfoConfigMap.Data["cluster_name"], - SupervisorSvcNamespace: supervisorService.Namespace, - SupervisorSvcName: supervisorService.Name, - FederationDomainName: federationDomain.Name, - SupervisorCertNamespace: supervisorCertificate.Namespace, - SupervisorCertName: supervisorCertificate.Name, - JWTAuthenticatorName: jwtAuthenticator.Name, - }, - wantKubeClientActions: []kubetesting.Action{ - // 1. Get the supervisor service endpoint to create the correct issuer - kubetesting.NewGetAction(serviceGVR, supervisorService.Namespace, supervisorService.Name), - // 4. Blow away the old supervisor certificate secret to force it to recreate - kubetesting.NewDeleteAction(secretGVR, supervisorCertificateSecret.Namespace, supervisorCertificateSecret.Name), - // 5. Read the new supervisor certificate secret that has the correct SAN(s) from step 3 - kubetesting.NewGetAction(secretGVR, supervisorCertificateSecret.Namespace, supervisorCertificateSecret.Name), - // 7. Create the pinniped info configmap with the supervisor discovery information - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, pinnipedInfoConfigMap.Namespace, pinnipedInfoConfigMap.Name), - kubetesting.NewCreateAction(configMapGVR, pinnipedInfoConfigMap.Namespace, pinnipedInfoConfigMap), - // 8. Kick the supervisor pods so that they reload new serving cert info - kubetesting.NewListAction(podGVR, podGVK, supervisorNamespaceName, metav1.ListOptions{}), - kubetesting.NewDeleteAction(podGVR, supervisorPods[0].Namespace, supervisorPods[0].Name), - kubetesting.NewDeleteAction(podGVR, supervisorPods[1].Namespace, supervisorPods[1].Name), - }, - wantCertManagerClientActions: []kubetesting.Action{ - // 3. We ensure the supervisor certificate has the correct SAN(s) - kubetesting.NewGetAction(certificateGVR, supervisorCertificate.Namespace, supervisorCertificate.Name), - kubetesting.NewGetAction(certificateGVR, supervisorCertificate.Namespace, supervisorCertificate.Name), - kubetesting.NewUpdateAction(certificateGVR, supervisorCertificate.Namespace, supervisorCertificate), - }, - wantSupervisorClientActions: []kubetesting.Action{ - // 2. We create the federationdomain with the correct issuer - kubetesting.NewGetAction(federationDomainGVR, federationDomain.Namespace, federationDomain.Name), - kubetesting.NewCreateAction(federationDomainGVR, federationDomain.Namespace, federationDomain), - }, - wantConciergeClientActions: []kubetesting.Action{ - // 6. We update the jwtauthenticator with the correct supervisor issuer, CA data, and audience - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator.Name), - kubetesting.NewRootUpdateAction(jwtAuthenticatorGVR, jwtAuthenticator), - }, - }, { - name: "management cluster configured with explicit concierge audience should ignore the audience (not write it to the JWTAuthenticator)", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset( - supervisorNamespace, - supervisorService, - supervisorCertificateSecret, - supervisorPods[0], - supervisorPods[1], - ) - c.PrependReactor("delete", "secrets", func(action kubetesting.Action) (bool, runtime.Object, error) { - // When we delete the secret in the implementation, we expect the cert-manager controller - // to recreate it. Since there is no cert-manager controller running, let's just tell the - // fake kube client to not delete it (i.e., that we "handled" the delete ourselves). - return actionIsOnObject(action, supervisorCertificateSecret), nil, nil - }) - return c - }, - newCertManagerClient: func() *certmanagerfake.Clientset { - return certmanagerfake.NewSimpleClientset(supervisorCertificate) - }, - newSupervisorClient: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset() - }, - // even if a custom audience is provided (see parameters) the mgmt cluster should still return a generic authenticator - newConciergeClient: func() *pinnipedconciergefake.Clientset { - // The jwtauthenticator is usually deployed onto the management cluster with no spec fields - // set; see: - // https://github.com/vmware-tanzu/community-edition/blob/1aa7936d88f5d9b04398d800bfe83a165619ee16/addons/packages/pinniped/0.4.4/bundle/config/overlay/pinniped-jwtauthenticator.yaml - defaultJWTAuthenticator := jwtAuthenticator.DeepCopy() - defaultJWTAuthenticator.Spec = authv1alpha1.JWTAuthenticatorSpec{} - return pinnipedconciergefake.NewSimpleClientset(defaultJWTAuthenticator) - }, - parameters: Parameters{ - ClusterType: "management", - ClusterName: pinnipedInfoConfigMap.Data["cluster_name"], - SupervisorSvcNamespace: supervisorService.Namespace, - SupervisorSvcName: supervisorService.Name, - FederationDomainName: federationDomain.Name, - SupervisorCertNamespace: supervisorCertificate.Namespace, - SupervisorCertName: supervisorCertificate.Name, - JWTAuthenticatorName: jwtAuthenticator.Name, - JWTAuthenticatorAudience: "I am a rebel and providing this even when I should not have done so.", - }, - wantKubeClientActions: []kubetesting.Action{ - // 1. Get the supervisor service endpoint to create the correct issuer - kubetesting.NewGetAction(serviceGVR, supervisorService.Namespace, supervisorService.Name), - // 4. Blow away the old supervisor certificate secret to force it to recreate - kubetesting.NewDeleteAction(secretGVR, supervisorCertificateSecret.Namespace, supervisorCertificateSecret.Name), - // 5. Read the new supervisor certificate secret that has the correct SAN(s) from step 3 - kubetesting.NewGetAction(secretGVR, supervisorCertificateSecret.Namespace, supervisorCertificateSecret.Name), - // 7. Create the pinniped info configmap with the supervisor discovery information - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, pinnipedInfoConfigMap.Namespace, pinnipedInfoConfigMap.Name), - kubetesting.NewCreateAction(configMapGVR, pinnipedInfoConfigMap.Namespace, pinnipedInfoConfigMap), - // 8. Kick the supervisor pods so that they reload new serving cert info - kubetesting.NewListAction(podGVR, podGVK, supervisorNamespaceName, metav1.ListOptions{}), - kubetesting.NewDeleteAction(podGVR, supervisorPods[0].Namespace, supervisorPods[0].Name), - kubetesting.NewDeleteAction(podGVR, supervisorPods[1].Namespace, supervisorPods[1].Name), - }, - wantCertManagerClientActions: []kubetesting.Action{ - // 3. We ensure the supervisor certificate has the correct SAN(s) - kubetesting.NewGetAction(certificateGVR, supervisorCertificate.Namespace, supervisorCertificate.Name), - kubetesting.NewGetAction(certificateGVR, supervisorCertificate.Namespace, supervisorCertificate.Name), - kubetesting.NewUpdateAction(certificateGVR, supervisorCertificate.Namespace, supervisorCertificate), - }, - wantSupervisorClientActions: []kubetesting.Action{ - // 2. We create the federationdomain with the correct issuer - kubetesting.NewGetAction(federationDomainGVR, federationDomain.Namespace, federationDomain.Name), - kubetesting.NewCreateAction(federationDomainGVR, federationDomain.Namespace, federationDomain), - }, - // Even though we are given parameters with a custom audience, we want to get back a generic authenticator - // without the custom audience on the mgmt cluster. - wantConciergeClientActions: []kubetesting.Action{ - // 6. We update the jwtauthenticator with the correct supervisor issuer, CA data, and audience - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator.Name), - kubetesting.NewRootUpdateAction(jwtAuthenticatorGVR, jwtAuthenticator), - }, - }, - { - name: "workload cluster configured from scratch", - newKubeClient: func() *kubefake.Clientset { - return kubefake.NewSimpleClientset() - }, - newCertManagerClient: func() *certmanagerfake.Clientset { - return certmanagerfake.NewSimpleClientset(supervisorCertificate) - }, - newSupervisorClient: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset() - }, - newConciergeClient: func() *pinnipedconciergefake.Clientset { - // The jwtauthenticator is usually deployed onto the workload cluster with all fields set - // correctly except for the audience; see: - // https://github.com/vmware-tanzu/community-edition/blob/1aa7936d88f5d9b04398d800bfe83a165619ee16/addons/packages/pinniped/0.4.4/bundle/config/overlay/pinniped-jwtauthenticator.yaml - defaultJWTAuthenticator := jwtAuthenticator.DeepCopy() - defaultJWTAuthenticator.Spec.Audience = "wrong-audience" - return pinnipedconciergefake.NewSimpleClientset(defaultJWTAuthenticator) - }, - parameters: Parameters{ - ClusterType: "workload", - ClusterName: jwtAuthenticator.Spec.Audience, - SupervisorSvcNamespace: supervisorService.Namespace, - SupervisorSvcEndpoint: jwtAuthenticator.Spec.Issuer, - SupervisorCABundleData: jwtAuthenticator.Spec.TLS.CertificateAuthorityData, - JWTAuthenticatorName: jwtAuthenticator.Name, - }, - wantKubeClientActions: []kubetesting.Action{ - // 2. Look for any supervisor pods to recreate (we do this on both management and workload clusters) - kubetesting.NewListAction(podGVR, podGVK, supervisorNamespaceName, metav1.ListOptions{}), - }, - wantCertManagerClientActions: []kubetesting.Action{}, - wantSupervisorClientActions: []kubetesting.Action{}, - wantConciergeClientActions: []kubetesting.Action{ - // 1. We update the jwtauthenticator with the correct supervisor issuer, CA data, and audience - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticator.Name), - kubetesting.NewRootUpdateAction(jwtAuthenticatorGVR, jwtAuthenticator), - }, - }, - { - name: "workload cluster configured from scratch with explicit concierge audience should generate a JWTAuthenticator with the customized audience value", - newKubeClient: func() *kubefake.Clientset { - return kubefake.NewSimpleClientset() - }, - newCertManagerClient: func() *certmanagerfake.Clientset { - return certmanagerfake.NewSimpleClientset(supervisorCertificate) - }, - newSupervisorClient: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset() - }, - // on the workload cluster, if given a custom audience, we should return a JWTAuthenticator with that audience - newConciergeClient: func() *pinnipedconciergefake.Clientset { - // The jwtauthenticator is usually deployed onto the workload cluster with all fields set - // correctly except for the audience; see: - // https://github.com/vmware-tanzu/community-edition/blob/1aa7936d88f5d9b04398d800bfe83a165619ee16/addons/packages/pinniped/0.4.4/bundle/config/overlay/pinniped-jwtauthenticator.yaml - jwtAuthenticatorWIthUUID := jwtAuthenticatorWithUUIDAudience.DeepCopy() - return pinnipedconciergefake.NewSimpleClientset(jwtAuthenticatorWIthUUID) - }, - parameters: Parameters{ - ClusterType: "workload", - SupervisorSvcNamespace: supervisorService.Namespace, - SupervisorSvcEndpoint: jwtAuthenticatorWithUUIDAudience.Spec.Issuer, - SupervisorCABundleData: jwtAuthenticatorWithUUIDAudience.Spec.TLS.CertificateAuthorityData, - JWTAuthenticatorName: jwtAuthenticatorWithUUIDAudience.Name, - // custom audience provided - JWTAuthenticatorAudience: jwtAuthenticatorWithUUIDAudience.Spec.Audience, - }, - wantKubeClientActions: []kubetesting.Action{ - // 2. Look for any supervisor pods to recreate (we do this on both management and workload clusters) - kubetesting.NewListAction(podGVR, podGVK, supervisorNamespaceName, metav1.ListOptions{}), - }, - wantCertManagerClientActions: []kubetesting.Action{}, - wantSupervisorClientActions: []kubetesting.Action{}, - // on the workload cluster, if given a custom audience, we should return a JWTAuthenticator with that audience - wantConciergeClientActions: []kubetesting.Action{ - // 1. We update the jwtauthenticator with the correct supervisor issuer, CA data, and audience - kubetesting.NewRootGetAction(jwtAuthenticatorGVR, jwtAuthenticatorWithUUIDAudience.Name), - kubetesting.NewRootUpdateAction(jwtAuthenticatorGVR, jwtAuthenticatorWithUUIDAudience), - }, - }, - { - name: "unknown cluster type", - newKubeClient: func() *kubefake.Clientset { - return kubefake.NewSimpleClientset() - }, - newCertManagerClient: func() *certmanagerfake.Clientset { - return certmanagerfake.NewSimpleClientset(supervisorCertificate) - }, - newSupervisorClient: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset() - }, - newConciergeClient: func() *pinnipedconciergefake.Clientset { - defaultJWTAuthenticator := jwtAuthenticator.DeepCopy() - return pinnipedconciergefake.NewSimpleClientset(defaultJWTAuthenticator) - }, - parameters: Parameters{ - ClusterType: "penguin", - }, - wantError: "unknown cluster type penguin", - wantKubeClientActions: []kubetesting.Action{}, - wantCertManagerClientActions: []kubetesting.Action{}, - wantSupervisorClientActions: []kubetesting.Action{}, - wantConciergeClientActions: []kubetesting.Action{}, - }, - } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - fakeKubeClient := test.newKubeClient() - fakeCertManagerClient := test.newCertManagerClient() - supervisorClientset := test.newSupervisorClient() - conciergeClientset := test.newConciergeClient() - clients := Clients{ - K8SClientset: fakeKubeClient, - CertmanagerClientset: fakeCertManagerClient, - SupervisorClientset: supervisorClientset, - ConciergeClientset: conciergeClientset, - } - inspector := inspect.Inspector{K8sClientset: fakeKubeClient, Context: context.Background()} - err := Pinniped(context.Background(), clients, inspector, &test.parameters) - if test.wantError != "" { - require.EqualError(t, err, test.wantError) - } else { - require.NoError(t, err) - } - require.Equal(t, test.wantKubeClientActions, fakeKubeClient.Actions()) - require.Equal(t, test.wantCertManagerClientActions, fakeCertManagerClient.Actions()) - require.Equal(t, test.wantSupervisorClientActions, supervisorClientset.Actions()) - require.Equal(t, test.wantConciergeClientActions, conciergeClientset.Actions()) - }) - } -} - -func enableLogging() { - config := zap.NewDevelopmentConfig() - logger, _ := config.Build() - zap.ReplaceGlobals(logger) -} - -func serviceHTTPSEndpoint(service *corev1.Service) string { - return fmt.Sprintf("https://%s:%d", service.Status.LoadBalancer.Ingress[0].IP, service.Spec.Ports[0].Port) -} - -func actionIsOnObject(action kubetesting.Action, object metav1.Object) bool { - if action.GetNamespace() != object.GetNamespace() { - return false - } - - actionWithName, ok := action.(interface{ GetName() string }) - if !ok { - return false - } - - if actionWithName.GetName() != object.GetName() { - return false - } - - return true -} diff --git a/pinniped-components/post-deploy/pkg/configure/dex/dex.go b/pinniped-components/post-deploy/pkg/configure/dex/dex.go deleted file mode 100644 index 15f314fa73..0000000000 --- a/pinniped-components/post-deploy/pkg/configure/dex/dex.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package dex implements Dex handling functionality. -package dex - -import ( - "context" - - certmanagerclientset "github.com/jetstack/cert-manager/pkg/client/clientset/versioned" - "go.uber.org/zap" - "gopkg.in/yaml.v3" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/schemas" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/vars" -) - -// Configurator contains client information for Dex. -type Configurator struct { - CertmanagerClientset certmanagerclientset.Interface - K8SClientset kubernetes.Interface -} - -// Info contains configuration settings for Dex. -type Info struct { - DexSvcEndpoint string - SupervisorSvcEndpoint string - DexNamespace string - DexConfigmapName string - ClientSecret string -} - -// CreateOrUpdateDexConfigMap creates a new ConfigMap for Dex, or updates an existing one. -func (c Configurator) CreateOrUpdateDexConfigMap(ctx context.Context, dexInfo *Info) error { - var err error - zap.S().Info("Creating the ConfigMap of Dex") - - // create configmap under kube-public namespace - var dexConfigMap *corev1.ConfigMap - dexConfigMap, err = c.K8SClientset.CoreV1().ConfigMaps(vars.DexNamespace).Get(ctx, vars.DexConfigMapName, metav1.GetOptions{}) - if err != nil { - zap.S().Error(err) - return err - } - - configStr := dexConfigMap.Data["config.yaml"] - - dexConf := &schemas.DexConfig{} - err = yaml.Unmarshal([]byte(configStr), dexConf) - if err != nil { - zap.S().Error(err) - return err - } - - // change dex config values - dexConf.Issuer = dexInfo.DexSvcEndpoint - dexConf.StaticClients[0] = &schemas.StaticClient{ - ID: constants.DexClientID, - Name: constants.DexClientID, - RedirectURIs: []string{dexInfo.SupervisorSvcEndpoint + "/callback"}, - Secret: dexInfo.ClientSecret, - } - for _, connector := range dexConf.Connectors { - if connector.Type == "oidc" { - connector.Config.RedirectURI = dexInfo.DexSvcEndpoint + "/callback" - } - } - - out, err := yaml.Marshal(dexConf) - if err != nil { - zap.S().Error(err) - return err - } - - // update dex config map - copiedConfigMap := dexConfigMap.DeepCopy() - copiedConfigMap.Data = map[string]string{ - "config.yaml": string(out), - } - _, err = c.K8SClientset.CoreV1().ConfigMaps(vars.DexNamespace).Update(ctx, copiedConfigMap, metav1.UpdateOptions{}) - if err != nil { - zap.S().Error(err) - return err - } - - zap.S().Infof("Updated the ConfigMap %s/%s for Dex", vars.DexNamespace, vars.DexConfigMapName) - return nil -} diff --git a/pinniped-components/post-deploy/pkg/configure/helper.go b/pinniped-components/post-deploy/pkg/configure/helper.go deleted file mode 100644 index 750a155235..0000000000 --- a/pinniped-components/post-deploy/pkg/configure/helper.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package configure - -import ( - "context" - "encoding/json" - "fmt" - - "k8s.io/client-go/kubernetes" - - "go.uber.org/zap" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/util/retry" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/constants" -) - -// createOrUpdateManagementClusterPinnipedInfo creates Pinniped information or updates existing data for a management cluster. -func createOrUpdateManagementClusterPinnipedInfo(ctx context.Context, pinnipedInfo pinnipedinfo.PinnipedInfo, k8sClientSet kubernetes.Interface, supervisorNamespaceName string) error { - var err error - zap.S().Info("Creating the ConfigMap for Pinniped info") - - data, err := json.Marshal(pinnipedInfo) - if err != nil { - err = fmt.Errorf("could not marshal Pinniped info into JSON: %w", err) - zap.S().Error(err) - return err - } - dataMap := make(map[string]string) - if err = json.Unmarshal(data, &dataMap); err != nil { - err = fmt.Errorf("could not unmarshal Pinniped info into map[string]string: %w", err) - zap.S().Error(err) - return err - } - - // Get the Supervisor's namespace so we can use it as the ownerRef for the ConfigMap. - // - // In TKGm classy management clusters, the pinniped-info ConfigMap is created here by this Job. - // If the user configures the management cluster back to the default of identity_management_type=none, - // then the pinniped-supervisor namespace is deleted, but nothing deletes the pinniped-info ConfigMap. - // To cause the ConfigMap to be deleted in this case, we set its ownerRef to point to the pinniped-supervisor namespace. - // When the ConfigMap is deleted, the v3_cascade_controller will update the pinniped addon secret of all workload - // clusters to have the default content of identity_management_type=none. - // - // In TKGm legacy management clusters, the pinniped-info ConfigMap is created here by this Job. - // When the user deletes the pinniped addon secret, the pinniped addon will be deleted, including the - // pinniped-supervisor namespace. When the ConfigMap is deleted, the v1_cascade_controller will delete the pinniped - // addon secret of all workload clusters. - // - // In a TKGs management clusters, this Job is not used and something else is responsible for creating/updating/deleting - // the pinniped-info ConfigMap. - supervisorNamespace, err := k8sClientSet.CoreV1().Namespaces().Get(ctx, supervisorNamespaceName, metav1.GetOptions{}) - if err != nil { - err = fmt.Errorf("could not get namespace %s: %w", supervisorNamespaceName, err) - zap.S().Error(err) - return err - } - - // create configmap under kube-public namespace - pinnipedConfigMap := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.PinnipedInfoConfigMapName, - Namespace: constants.KubePublicNamespace, - OwnerReferences: []metav1.OwnerReference{ - { - APIVersion: corev1.SchemeGroupVersion.String(), - Kind: "Namespace", - Name: supervisorNamespace.Name, - UID: supervisorNamespace.UID, - }, - }, - }, - Data: dataMap, - } - - if _, err = k8sClientSet.CoreV1().ConfigMaps(constants.KubePublicNamespace).Get(ctx, constants.PinnipedInfoConfigMapName, metav1.GetOptions{}); err != nil { - if errors.IsNotFound(err) { - // create if does not exist - if _, err = k8sClientSet.CoreV1().ConfigMaps(constants.KubePublicNamespace).Create(ctx, pinnipedConfigMap, metav1.CreateOptions{}); err != nil { - err = fmt.Errorf("could not create pinniped-info configmap: %w", err) - zap.S().Error(err) - return err - } - - zap.S().Infof("Created the ConfigMap %s/%s for Pinniped info", constants.KubePublicNamespace, constants.PinnipedInfoConfigMapName) - return nil - } - // return err if could not get the configmap due to other errors - err = fmt.Errorf("could not get pinniped-info configmap: %w", err) - zap.S().Error(err) - return err - } - - // if we have configmap fetched, try to update - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { - var e error - var configMapUpdated *corev1.ConfigMap - if configMapUpdated, e = k8sClientSet.CoreV1().ConfigMaps(constants.KubePublicNamespace).Get(ctx, constants.PinnipedInfoConfigMapName, metav1.GetOptions{}); e != nil { - return e - } - configMapUpdated.OwnerReferences = pinnipedConfigMap.OwnerReferences - configMapUpdated.Data = pinnipedConfigMap.Data - _, e = k8sClientSet.CoreV1().ConfigMaps(constants.KubePublicNamespace).Update(ctx, configMapUpdated, metav1.UpdateOptions{}) - return e - }) - if err != nil { - err = fmt.Errorf("could not update pinniped-info configmap: %w", err) - zap.S().Error(err) - return err - } - - zap.S().Infof("Updated the ConfigMap %s/%s for Pinniped info", constants.KubePublicNamespace, constants.PinnipedInfoConfigMapName) - return nil -} diff --git a/pinniped-components/post-deploy/pkg/configure/helper_test.go b/pinniped-components/post-deploy/pkg/configure/helper_test.go deleted file mode 100644 index 0504b77fad..0000000000 --- a/pinniped-components/post-deploy/pkg/configure/helper_test.go +++ /dev/null @@ -1,340 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package configure - -import ( - "context" - "errors" - "fmt" - "sync" - "testing" - - "github.com/stretchr/testify/require" - corev1 "k8s.io/api/core/v1" - kubeerrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - kubefake "k8s.io/client-go/kubernetes/fake" - kubetesting "k8s.io/client-go/testing" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" -) - -func TestCreateOrUpdateManagementClusterPinnipedInfo(t *testing.T) { - const ( - kubePublicNamespaceName = "kube-public" - supervisorNamespaceName = "pinniped-supervisor" - supervisorNamespaceUID = "pinniped-supervisor-namespace-object-uid" - pinnipedInfoConfigMapName = "pinniped-info" - ) - var ( - clusterName = "some-cluster-name" - issuer = "some-issuer" - issuerCA = "some-issuer-ca-bundle-data" - ) - - managementClusterPinnipedInfo := pinnipedinfo.PinnipedInfo{ - ClusterName: clusterName, - Issuer: issuer, - IssuerCABundleData: issuerCA, - } - - emptyFieldsPinnipedInfo := pinnipedinfo.PinnipedInfo{} - - configMapGVR := corev1.SchemeGroupVersion.WithResource("configmaps") - namespaceGVR := corev1.SchemeGroupVersion.WithResource("namespaces") - - supervisorNamespaceOwnerRef := metav1.OwnerReference{ - APIVersion: "v1", - Kind: "Namespace", - Name: supervisorNamespaceName, - UID: supervisorNamespaceUID, - } - - managementClusterPinnipedInfoConfigMap := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: kubePublicNamespaceName, - Name: pinnipedInfoConfigMapName, - OwnerReferences: []metav1.OwnerReference{supervisorNamespaceOwnerRef}, - }, - Data: map[string]string{ - "cluster_name": clusterName, - "issuer": issuer, - "issuer_ca_bundle_data": issuerCA, - }, - } - - emptyFieldsPinnipedInfoConfigMap := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: kubePublicNamespaceName, - Name: pinnipedInfoConfigMapName, - OwnerReferences: []metav1.OwnerReference{supervisorNamespaceOwnerRef}, - }, - Data: map[string]string{ - "cluster_name": "", - "issuer": "", - "issuer_ca_bundle_data": "", - }, - } - - noOwnerRefPinnipedConfigMap := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: kubePublicNamespaceName, - Name: pinnipedInfoConfigMapName, - }, - Data: map[string]string{ - "cluster_name": clusterName, - "issuer": issuer, - "issuer_ca_bundle_data": issuerCA, - }, - } - - supervisorNamespace := &corev1.Namespace{ - TypeMeta: metav1.TypeMeta{ - // Since the production k8s client will return empty strings here from "get namespace", our unit - // test will also do that, to make sure that our production code does not depend on using these values. - Kind: "", - APIVersion: "", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: supervisorNamespaceName, - UID: supervisorNamespaceUID, - }, - } - - tests := []struct { - name string - newKubeClient func() *kubefake.Clientset - pinnipedInfo pinnipedinfo.PinnipedInfo - wantError string - wantActions []kubetesting.Action - }{ - { - name: "getting pinniped info fails", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset(supervisorNamespace) - c.PrependReactor("get", "configmaps", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New("some get error") - }) - return c - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantError: "could not get pinniped-info configmap: some get error", - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - }, - }, - { - name: "getting pinniped supervisor namespace does not exist", - newKubeClient: func() *kubefake.Clientset { - return kubefake.NewSimpleClientset() - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantError: fmt.Sprintf(`could not get namespace %[1]s: namespaces %[1]q not found`, supervisorNamespaceName), - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - }, - }, - { - name: "getting pinniped supervisor namespace results in some other error aside from not found", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset(supervisorNamespace) - c.PrependReactor("get", "namespaces", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New("some get error") - }) - return c - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantError: fmt.Sprintf(`could not get namespace %[1]s: some get error`, supervisorNamespaceName), - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - }, - }, - { - name: "pinniped info does not exist, creates it", - newKubeClient: func() *kubefake.Clientset { - return kubefake.NewSimpleClientset(supervisorNamespace) - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewCreateAction(configMapGVR, kubePublicNamespaceName, managementClusterPinnipedInfoConfigMap), - }, - }, - { - name: "pinniped info does not exist and creating pinniped-info fails", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset(supervisorNamespace) - c.PrependReactor("create", "configmaps", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New("some create error") - }) - return c - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantError: "could not create pinniped-info configmap: some create error", - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewCreateAction(configMapGVR, kubePublicNamespaceName, managementClusterPinnipedInfoConfigMap), - }, - }, - { - name: "pinniped info exists and is up to date for management cluster", - newKubeClient: func() *kubefake.Clientset { - return kubefake.NewSimpleClientset(managementClusterPinnipedInfoConfigMap, supervisorNamespace) - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewUpdateAction(configMapGVR, kubePublicNamespaceName, managementClusterPinnipedInfoConfigMap), - }, - }, - { - name: "pinniped info exists and is not up to date", - newKubeClient: func() *kubefake.Clientset { - existingPinnipedInfoConfigMap := managementClusterPinnipedInfoConfigMap.DeepCopy() - existingPinnipedInfoConfigMap.Data = map[string]string{ - "cluster_name": "invalid-cluster-name", - } - return kubefake.NewSimpleClientset(managementClusterPinnipedInfoConfigMap, supervisorNamespace) - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewUpdateAction(configMapGVR, kubePublicNamespaceName, managementClusterPinnipedInfoConfigMap), - }, - }, - { - name: "pinniped info exists and getting pinniped-info fails", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset(managementClusterPinnipedInfoConfigMap, supervisorNamespace) - once := &sync.Once{} - c.PrependReactor("get", "configmaps", func(a kubetesting.Action) (bool, runtime.Object, error) { - err := errors.New("some get error") - once.Do(func() { - // The first time get is called, we should succeed. The second time get is called (i.e., - // before update), this Do() func will not run and we will fail. - err = nil - }) - return true, nil, err - }) - return c - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantError: "could not update pinniped-info configmap: some get error", - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - }, - }, - { - name: "pinniped info exists and updating pinniped-info fails", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset(managementClusterPinnipedInfoConfigMap, supervisorNamespace) - c.PrependReactor("update", "configmaps", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New("some update error") - }) - return c - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantError: "could not update pinniped-info configmap: some update error", - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewUpdateAction(configMapGVR, kubePublicNamespaceName, managementClusterPinnipedInfoConfigMap), - }, - }, - { - name: "pinniped info exists and updating pinniped-info fails the first time because of a conflict but passes on retry", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset(managementClusterPinnipedInfoConfigMap, supervisorNamespace) - once := &sync.Once{} - c.PrependReactor("update", "configmaps", func(a kubetesting.Action) (bool, runtime.Object, error) { - var err error - once.Do(func() { - // The first first update is called, we should return this Conflict error. The second - // time update is called (i.e., on retry), this Do() func will not run and we will - // succeed. - err = kubeerrors.NewConflict( - configMapGVR.GroupResource(), - pinnipedInfoConfigMapName, - errors.New("some error"), - ) - }) - return true, nil, err - }) - return c - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewUpdateAction(configMapGVR, kubePublicNamespaceName, managementClusterPinnipedInfoConfigMap), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewUpdateAction(configMapGVR, kubePublicNamespaceName, managementClusterPinnipedInfoConfigMap), - }, - }, - { - name: "fields added to Pinniped Info config map when they are set to empty", - newKubeClient: func() *kubefake.Clientset { - return kubefake.NewSimpleClientset(emptyFieldsPinnipedInfoConfigMap, supervisorNamespace) - }, - pinnipedInfo: emptyFieldsPinnipedInfo, - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewUpdateAction(configMapGVR, kubePublicNamespaceName, emptyFieldsPinnipedInfoConfigMap), - }, - }, - { - name: "with existing configMap with ownerRef, will update configMap with the ownerRef", - newKubeClient: func() *kubefake.Clientset { - return kubefake.NewSimpleClientset(noOwnerRefPinnipedConfigMap, supervisorNamespace) - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewUpdateAction(configMapGVR, kubePublicNamespaceName, managementClusterPinnipedInfoConfigMap), - }, - }, - { - name: "with existing configMap with ownerRef, will keep the ownerRef in the update", - newKubeClient: func() *kubefake.Clientset { - return kubefake.NewSimpleClientset(managementClusterPinnipedInfoConfigMap, supervisorNamespace) - }, - pinnipedInfo: managementClusterPinnipedInfo, - wantActions: []kubetesting.Action{ - kubetesting.NewRootGetAction(namespaceGVR, supervisorNamespaceName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewGetAction(configMapGVR, kubePublicNamespaceName, pinnipedInfoConfigMapName), - kubetesting.NewUpdateAction(configMapGVR, kubePublicNamespaceName, managementClusterPinnipedInfoConfigMap), - }, - }, - } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - kubeClient := test.newKubeClient() - err := createOrUpdateManagementClusterPinnipedInfo(context.Background(), test.pinnipedInfo, kubeClient, supervisorNamespaceName) - if test.wantError != "" { - require.EqualError(t, err, test.wantError) - } else { - require.NoError(t, err) - } - require.Equal(t, test.wantActions, kubeClient.Actions()) - }) - } -} diff --git a/pinniped-components/post-deploy/pkg/configure/supervisor/supervisor.go b/pinniped-components/post-deploy/pkg/configure/supervisor/supervisor.go deleted file mode 100644 index 531715a6ad..0000000000 --- a/pinniped-components/post-deploy/pkg/configure/supervisor/supervisor.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package supervisor implements the pinniped supervisor. -package supervisor - -import ( - "context" - "encoding/base64" - "fmt" - "time" - - configv1alpha1 "go.pinniped.dev/generated/1.20/apis/supervisor/config/v1alpha1" - idpv1alpha1 "go.pinniped.dev/generated/1.20/apis/supervisor/idp/v1alpha1" - pinnipedsupervisorclientset "go.pinniped.dev/generated/1.20/client/supervisor/clientset/versioned" - "go.uber.org/zap" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/util/retry" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/inspect" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/vars" -) - -// Configurator contains client information. -type Configurator struct { - Clientset pinnipedsupervisorclientset.Interface - K8SClientset kubernetes.Interface -} - -// CreateOrUpdateFederationDomain creates a new federation domain or updates an existing one. -func (c Configurator) CreateOrUpdateFederationDomain(ctx context.Context, namespace, name, issuer string) error { - var err error - var federationDomain *configv1alpha1.FederationDomain - if federationDomain, err = c.Clientset.ConfigV1alpha1().FederationDomains(namespace).Get(ctx, name, metav1.GetOptions{}); err != nil { - if errors.IsNotFound(err) { - // create if not found - zap.S().Infof("Creating the FederationDomain %s/%s", namespace, name) - newFederationDomain := &configv1alpha1.FederationDomain{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - Spec: configv1alpha1.FederationDomainSpec{ - Issuer: issuer, - }, - } - if _, err = c.Clientset.ConfigV1alpha1().FederationDomains(namespace).Create(ctx, newFederationDomain, metav1.CreateOptions{}); err != nil { - err = fmt.Errorf("could not create federationdomain %s/%s: %w", namespace, name, err) - zap.S().Error(err) - return err - } - - zap.S().Infof("Created the FederationDomain %s/%s", namespace, name) - return nil - } - err = fmt.Errorf("could not get federationdomain %s/%s: %w", namespace, name, err) - zap.S().Error(err) - return err - } - - // update existing FederationDomain - zap.S().Infof("Updating existing FederationDomain %s/%s", namespace, name) - copiedFederationDomain := federationDomain.DeepCopy() - copiedFederationDomain.Spec.Issuer = issuer - if _, err = c.Clientset.ConfigV1alpha1().FederationDomains(namespace).Update(ctx, copiedFederationDomain, metav1.UpdateOptions{}); err != nil { - err = fmt.Errorf("could not update federationdomain %s/%s: %w", namespace, name, err) - zap.S().Error(err) - return err - } - - zap.S().Infof("Updated the FederationDomain %s/%s", namespace, name) - return nil -} - -// RecreateIDPForDex recreates the IDP for Dex. The reason of recreation is because updating IDP could not trigger the reconciliation -// from Pinniped controller to update the IDP status, the upstream discovery would be stuck in failed status. -// UI will show "Unprocessable Entity: No upstream providers are configured" -func (c Configurator) RecreateIDPForDex(ctx context.Context, dexNamespace, dexSvcName string, dexTLSSecret *corev1.Secret) (*idpv1alpha1.OIDCIdentityProvider, error) { - zap.S().Infof("Recreating OIDCIdentityProvider %s/%s to point to Dex %s/%s...", vars.SupervisorNamespace, vars.PinnipedOIDCProviderName, dexNamespace, dexSvcName) - inspector := inspect.Inspector{Context: ctx, K8sClientset: c.K8SClientset} - var err error - var dexSvcEndpoint string - if dexSvcEndpoint, err = inspector.GetServiceEndpoint(dexNamespace, dexSvcName); err != nil { - err = fmt.Errorf("could not get dex service endpoint: %w", err) - zap.S().Error(err) - return nil, err - } - - var fetchedIDP *idpv1alpha1.OIDCIdentityProvider - err = retry.OnError(wait.Backoff{ - Steps: 3, - Duration: 3 * time.Second, - Factor: 2.0, - Jitter: 0.1, - }, - // retry just in case the resource is not yet ready - errors.IsNotFound, - func() error { - var e error - fetchedIDP, e = c.Clientset.IDPV1alpha1().OIDCIdentityProviders(vars.SupervisorNamespace).Get(ctx, vars.PinnipedOIDCProviderName, metav1.GetOptions{}) - return e - }, - ) - if err != nil { - err = fmt.Errorf("could not get oidcidentityprovider %s/%s: %w", vars.SupervisorNamespace, vars.PinnipedOIDCProviderName, err) - zap.S().Error(err) - return nil, err - } - - if err = c.Clientset.IDPV1alpha1().OIDCIdentityProviders(vars.SupervisorNamespace).Delete(ctx, vars.PinnipedOIDCProviderName, metav1.DeleteOptions{}); err != nil { - zap.S().Warn(err) - } - - // update issuer pointing to Dex - // update tls by using Dex TLS CA cert - copiedIDP := fetchedIDP.DeepCopy() - copiedIDP.ObjectMeta.ResourceVersion = "" - copiedIDP.Spec.Issuer = dexSvcEndpoint - copiedIDP.Spec.TLS = &idpv1alpha1.TLSSpec{ - CertificateAuthorityData: base64.StdEncoding.EncodeToString(dexTLSSecret.Data["ca.crt"]), - } - var updatedIDP *idpv1alpha1.OIDCIdentityProvider - err = retry.OnError(wait.Backoff{ - Steps: 3, - Duration: 6 * time.Second, - Factor: 2.0, - Jitter: 0.1, - }, - // retry if the resource has not been completely deleted - errors.IsAlreadyExists, - func() error { - var e error - updatedIDP, e = c.Clientset.IDPV1alpha1().OIDCIdentityProviders(vars.SupervisorNamespace).Create(ctx, copiedIDP, metav1.CreateOptions{}) - return e - }, - ) - if err != nil { - err = fmt.Errorf("could not create oidcidentityprovider %s/%s: %w", vars.SupervisorNamespace, vars.PinnipedOIDCProviderName, err) - zap.S().Error(err) - return nil, err - } - - zap.S().Infof("Recreated OIDCIdentityProvider %s/%s to point to Dex %s/%s", vars.SupervisorNamespace, vars.PinnipedOIDCProviderName, dexNamespace, dexSvcName) - return updatedIDP, nil -} diff --git a/pinniped-components/post-deploy/pkg/configure/supervisor/supervisor_test.go b/pinniped-components/post-deploy/pkg/configure/supervisor/supervisor_test.go deleted file mode 100644 index 7234b35ef9..0000000000 --- a/pinniped-components/post-deploy/pkg/configure/supervisor/supervisor_test.go +++ /dev/null @@ -1,368 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package supervisor - -import ( - "context" - "encoding/base64" - "errors" - "fmt" - "sync" - "testing" - - "github.com/stretchr/testify/require" - configv1alpha1 "go.pinniped.dev/generated/1.20/apis/supervisor/config/v1alpha1" - idpv1alpha1 "go.pinniped.dev/generated/1.20/apis/supervisor/idp/v1alpha1" - pinnipedsupervisorfake "go.pinniped.dev/generated/1.20/client/supervisor/clientset/versioned/fake" - corev1 "k8s.io/api/core/v1" - kubeerrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - kubefake "k8s.io/client-go/kubernetes/fake" - kubetesting "k8s.io/client-go/testing" -) - -func TestCreateOrUpdateFederationDomain(t *testing.T) { - federationDomainGVR := configv1alpha1.SchemeGroupVersion.WithResource("federationdomains") - - federationDomain := &configv1alpha1.FederationDomain{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "some-namespace", - Name: "some-name", - }, - Spec: configv1alpha1.FederationDomainSpec{ - Issuer: "some-issuer", - }, - } - - tests := []struct { - name string - newClientset func() *pinnipedsupervisorfake.Clientset - wantError string - wantActions []kubetesting.Action - }{ - { - name: "getting jwt authenticator fails", - newClientset: func() *pinnipedsupervisorfake.Clientset { - c := pinnipedsupervisorfake.NewSimpleClientset() - c.PrependReactor("get", "federationdomains", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New("some get error") - }) - return c - }, - wantError: fmt.Sprintf("could not get federationdomain %s/%s: some get error", federationDomain.Namespace, federationDomain.Name), - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(federationDomainGVR, federationDomain.Namespace, federationDomain.Name), - }, - }, - { - name: "jwt authenticator does not exist", - newClientset: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset() - }, - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(federationDomainGVR, federationDomain.Namespace, federationDomain.Name), - kubetesting.NewCreateAction(federationDomainGVR, federationDomain.Namespace, federationDomain), - }, - }, - { - name: "jwt authenticator does not exist and creating federationdomain fails", - newClientset: func() *pinnipedsupervisorfake.Clientset { - c := pinnipedsupervisorfake.NewSimpleClientset() - c.PrependReactor("create", "federationdomains", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New("some create error") - }) - return c - }, - wantError: fmt.Sprintf("could not create federationdomain %s/%s: some create error", federationDomain.Namespace, federationDomain.Name), - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(federationDomainGVR, federationDomain.Namespace, federationDomain.Name), - kubetesting.NewCreateAction(federationDomainGVR, federationDomain.Namespace, federationDomain), - }, - }, - { - name: "jwt authenticator exists and is up to date", - newClientset: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset(federationDomain.DeepCopy()) - }, - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(federationDomainGVR, federationDomain.Namespace, federationDomain.Name), - kubetesting.NewUpdateAction(federationDomainGVR, federationDomain.Namespace, federationDomain), - }, - }, - { - name: "jwt authenticator exists and is not up to date", - newClientset: func() *pinnipedsupervisorfake.Clientset { - existingFederationDomain := federationDomain.DeepCopy() - existingFederationDomain.Spec.Issuer = "some-other-issuer" - return pinnipedsupervisorfake.NewSimpleClientset(federationDomain.DeepCopy()) - }, - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(federationDomainGVR, federationDomain.Namespace, federationDomain.Name), - kubetesting.NewUpdateAction(federationDomainGVR, federationDomain.Namespace, federationDomain), - }, - }, - { - name: "updating federationdomain fails", - newClientset: func() *pinnipedsupervisorfake.Clientset { - c := pinnipedsupervisorfake.NewSimpleClientset(federationDomain.DeepCopy()) - c.PrependReactor("update", "federationdomains", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New("some update error") - }) - return c - }, - wantError: fmt.Sprintf("could not update federationdomain %s/%s: some update error", federationDomain.Namespace, federationDomain.Name), - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(federationDomainGVR, federationDomain.Namespace, federationDomain.Name), - kubetesting.NewUpdateAction(federationDomainGVR, federationDomain.Namespace, federationDomain), - }, - }, - } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - clientset := test.newClientset() - err := Configurator{ - Clientset: clientset, - }.CreateOrUpdateFederationDomain( - context.Background(), - federationDomain.Namespace, - federationDomain.Name, - federationDomain.Spec.Issuer, - ) - if test.wantError != "" { - require.EqualError(t, err, test.wantError) - } else { - require.NoError(t, err) - } - require.Equal(t, test.wantActions, clientset.Actions()) - }) - } -} - -func TestRecreateIDPForDex(t *testing.T) { - const ( - dexServiceIP = "1.2.3.4" - dexServicePort = 12345 - ) - - dexCAData := []byte("some-dex-ca-data") - - dexService := &corev1.Service{ - Spec: corev1.ServiceSpec{ - Type: corev1.ServiceTypeLoadBalancer, - Ports: []corev1.ServicePort{corev1.ServicePort{Port: dexServicePort}}, - }, - Status: corev1.ServiceStatus{ - LoadBalancer: corev1.LoadBalancerStatus{ - Ingress: []corev1.LoadBalancerIngress{corev1.LoadBalancerIngress{IP: dexServiceIP}}, - }, - }, - } - dexTLSSecret := &corev1.Secret{ - Data: map[string][]byte{ - "ca.crt": dexCAData, - }, - } - - oidcIdentityProviderGVR := idpv1alpha1.SchemeGroupVersion.WithResource("oidcidentityproviders") - - oidcIdentityProvider := &idpv1alpha1.OIDCIdentityProvider{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "pinniped-supervisor", - Name: "upstream-oidc-identity-provider", - }, - Spec: idpv1alpha1.OIDCIdentityProviderSpec{ - Issuer: fmt.Sprintf("https://%s:%d", dexServiceIP, dexServicePort), - TLS: &idpv1alpha1.TLSSpec{ - CertificateAuthorityData: base64.StdEncoding.EncodeToString(dexCAData), - }, - }, - } - - tests := []struct { - name string - kubeClientError string - newClientset func() *pinnipedsupervisorfake.Clientset - wantError string - wantOIDCIdentityProvider *idpv1alpha1.OIDCIdentityProvider - wantActions []kubetesting.Action - }{ - { - name: "inspecting dex service endpoint fails", - kubeClientError: "some get error", - newClientset: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset() - }, - wantError: "could not get dex service endpoint: some get error", - wantActions: []kubetesting.Action{}, - }, - { - name: "oidcidentityprovider does not exist", - newClientset: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset() - }, - wantError: fmt.Sprintf( - `could not get oidcidentityprovider %s/%s: oidcidentityproviders.idp.supervisor.pinniped.dev "upstream-oidc-identity-provider" not found`, - oidcIdentityProvider.Namespace, - oidcIdentityProvider.Name, - ), - wantActions: []kubetesting.Action{ - // We retry 3 times to get the oidcidentityprovider but we fail every time because it - // doesn't exist. - kubetesting.NewGetAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewGetAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewGetAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - }, - }, - { - name: "oidcidentityprovider exists and is up to date", - newClientset: func() *pinnipedsupervisorfake.Clientset { - return pinnipedsupervisorfake.NewSimpleClientset(oidcIdentityProvider.DeepCopy()) - }, - wantOIDCIdentityProvider: oidcIdentityProvider, - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewDeleteAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewCreateAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider), - }, - }, - { - name: "oidcidentityprovider exists and needs update", - newClientset: func() *pinnipedsupervisorfake.Clientset { - existingOIDCIdentityProvider := oidcIdentityProvider.DeepCopy() - existingOIDCIdentityProvider.Spec.Issuer = "some-incorrect-issuer" - existingOIDCIdentityProvider.Spec.TLS = nil - return pinnipedsupervisorfake.NewSimpleClientset(existingOIDCIdentityProvider) - }, - wantOIDCIdentityProvider: oidcIdentityProvider, - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewDeleteAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewCreateAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider), - }, - }, - { - name: "oidcidentityprovider exists after the first get", - newClientset: func() *pinnipedsupervisorfake.Clientset { - c := pinnipedsupervisorfake.NewSimpleClientset(oidcIdentityProvider.DeepCopy()) - once := &sync.Once{} - c.PrependReactor("get", "oidcidentityproviders", func(a kubetesting.Action) (bool, runtime.Object, error) { - var err error - once.Do(func() { - // When the first get is called, we should return this NotFound error. The second time - // update is called (i.e., on retry), this Do() func will not run and we will succeed. - err = kubeerrors.NewNotFound(oidcIdentityProviderGVR.GroupResource(), oidcIdentityProvider.Name) - }) - return true, oidcIdentityProvider, err - }) - return c - }, - wantOIDCIdentityProvider: oidcIdentityProvider, - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewGetAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewDeleteAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewCreateAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider), - }, - }, - { - name: "deleting oidcidentityprovider fails", - newClientset: func() *pinnipedsupervisorfake.Clientset { - c := pinnipedsupervisorfake.NewSimpleClientset(oidcIdentityProvider.DeepCopy()) - c.PrependReactor("delete", "oidcidentityproviders", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, oidcIdentityProvider, errors.New("some delete error") - }) - return c - }, - wantError: fmt.Sprintf( - `could not create oidcidentityprovider %s/%s: oidcidentityproviders.idp.supervisor.pinniped.dev "upstream-oidc-identity-provider" already exists`, - oidcIdentityProvider.Namespace, - oidcIdentityProvider.Name, - ), - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewDeleteAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - // We retry 3 times to create the oidcidentityprovider, but fail each time since we failed to delete it. - kubetesting.NewCreateAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider), - kubetesting.NewCreateAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider), - kubetesting.NewCreateAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider), - }, - }, - { - name: "deleting oidcidentityprovider takes time to complete", - newClientset: func() *pinnipedsupervisorfake.Clientset { - c := pinnipedsupervisorfake.NewSimpleClientset(oidcIdentityProvider.DeepCopy()) - once := &sync.Once{} - c.PrependReactor("create", "oidcidentityproviders", func(a kubetesting.Action) (bool, runtime.Object, error) { - var err error - once.Do(func() { - // When the first get is called, we should return this Conflict error. The second time - // update is called (i.e., on retry), this Do() func will not run and we will succeed. - err = kubeerrors.NewAlreadyExists(oidcIdentityProviderGVR.GroupResource(), oidcIdentityProvider.Name) - }) - return true, oidcIdentityProvider, err - }) - return c - }, - wantOIDCIdentityProvider: oidcIdentityProvider, - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewDeleteAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewCreateAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider), - kubetesting.NewCreateAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider), - }, - }, - { - name: "creating oidcidentityprovider fails", - newClientset: func() *pinnipedsupervisorfake.Clientset { - c := pinnipedsupervisorfake.NewSimpleClientset(oidcIdentityProvider.DeepCopy()) - c.PrependReactor("create", "oidcidentityproviders", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, oidcIdentityProvider, errors.New("some create error") - }) - return c - }, - wantError: fmt.Sprintf( - "could not create oidcidentityprovider %s/%s: some create error", - oidcIdentityProvider.Namespace, - oidcIdentityProvider.Name, - ), - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewDeleteAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider.Name), - kubetesting.NewCreateAction(oidcIdentityProviderGVR, oidcIdentityProvider.Namespace, oidcIdentityProvider), - }, - }, - } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - kubeClient := kubefake.NewSimpleClientset(dexService) - if test.kubeClientError != "" { - kubeClient.PrependReactor("get", "services", func(a kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New(test.kubeClientError) - }) - } - - clientset := test.newClientset() - - returnedOIDCIdentityProvider, err := Configurator{ - K8SClientset: kubeClient, - Clientset: clientset, - }.RecreateIDPForDex( - context.Background(), - dexService.Namespace, - dexService.Name, - dexTLSSecret, - ) - if test.wantError != "" { - require.EqualError(t, err, test.wantError) - } else { - require.NoError(t, err) - } - require.Equal(t, test.wantOIDCIdentityProvider, returnedOIDCIdentityProvider) - require.Equal(t, test.wantActions, clientset.Actions()) - }) - } -} diff --git a/pinniped-components/post-deploy/pkg/constants/constants.go b/pinniped-components/post-deploy/pkg/constants/constants.go deleted file mode 100644 index 36bbfb0ea1..0000000000 --- a/pinniped-components/post-deploy/pkg/constants/constants.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package constants defines constants used throughout the codebase. -package constants - -var ( - // TKGMgmtClusterType is the "management" cluster type. - TKGMgmtClusterType = "management" - - // TKGWorkloadClusterType is the "workload" cluster type. - TKGWorkloadClusterType = "workload" - - // TKGSystemPublicNamespace is the "tkg-system-public" cluster type. - TKGSystemPublicNamespace = "tkg-system-public" - - // TKGMetaConfigMapName is the "tkg-metadata" cluster type. - TKGMetaConfigMapName = "tkg-metadata" - - // PinnipedInfoConfigMapName is the "pinniped-info" cluster type. - PinnipedInfoConfigMapName = "pinniped-info" - - // KubePublicNamespace is the "kube-public" cluster type. - KubePublicNamespace = "kube-public" - - // ClusterInfoConfigMapName is the "cluster-info" cluster type. - ClusterInfoConfigMapName = "cluster-info" - - // DexClientID is the "pinniped-client-id" cluster type. - DexClientID = "pinniped-client-id" -) diff --git a/pinniped-components/post-deploy/pkg/inspect/inspect.go b/pinniped-components/post-deploy/pkg/inspect/inspect.go deleted file mode 100644 index eb1c6320e9..0000000000 --- a/pinniped-components/post-deploy/pkg/inspect/inspect.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package inspect implements inspector functionality. -package inspect - -import ( - "context" - "fmt" - "net" - "net/url" - "time" - - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/util/retry" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/constants" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/post-deploy/pkg/utils" - - "go.uber.org/zap" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/yaml" - "k8s.io/client-go/kubernetes" -) - -// Inspector contains the inspect settings. -type Inspector struct { - K8sClientset kubernetes.Interface - Context context.Context -} - -// TKGMetadata contains Tanzu Kubernetes Grid metadata. -type TKGMetadata struct { - /* - The configmap contains the metadata like the following, but we only care about type and provider - metadata.yaml: | - cluster: - name: tkg-cluster-wc-765 - type: workload - plan: dev - kubernetesProvider: VMware Tanzu Kubernetes Grid - tkgVersion: 1.2.1 - infrastructure: - provider: vsphere - bom: - configmapRef: - name: tkg-bom - */ - Cluster TKGMetadataCluster `yaml:"cluster"` -} - -type TKGMetadataCluster struct { - Name string `yaml:"name"` - Type string `yaml:"type"` - Infrastructure struct { - Provider string `yaml:"provider"` - } `yaml:"infrastructure"` -} - -// ClusterInfo contains information about the cluster. -type ClusterInfo struct { - /* - kubeconfig: | - apiVersion: v1 - clusters: - - cluster: - certificate-authority-data: xxxxxxx - server: https://10.161.151.250:6443 - name: "" - contexts: null - current-context: "" - kind: Config - preferences: {} - users: null - */ - - Clusters []struct { - Cluster struct { - Server string `yaml:"server"` - } `yaml:"cluster"` - } `yaml:"clusters"` -} - -// GetTKGMetadata reads the data from tkg-metadata ConfigMap -// Note: The tkg-metadata will not get updated as today if user has some day2 configurations against the cluster. That -// means some mutable fields will have stale data. Use this function with caution when the data you want to read could -// be updated by user -func (i Inspector) GetTKGMetadata() (*TKGMetadata, error) { - zap.S().Info("Getting TKG metadata...") - - var tkgMetaConfigMap *corev1.ConfigMap - var err error - if tkgMetaConfigMap, err = i.K8sClientset.CoreV1().ConfigMaps(constants.TKGSystemPublicNamespace). - Get(i.Context, constants.TKGMetaConfigMapName, metav1.GetOptions{}); err != nil { - if errors.IsNotFound(err) { - zap.S().Warnf("%s not found", constants.TKGMetaConfigMapName) - return nil, nil - } - return nil, err - } - - tkgMetadata := &TKGMetadata{} - if err = yaml.Unmarshal([]byte(tkgMetaConfigMap.Data["metadata.yaml"]), tkgMetadata); err != nil { - zap.S().Error(err) - return nil, err - } - - return tkgMetadata, nil -} - -// GetControlPlaneHostname checks the tkg-metadata ConfigMap and returns the hostname of control plane -// Return the IP address or the hostname of the control plane -func (i *Inspector) GetControlPlaneHostname() (string, error) { - zap.S().Info("Getting the control plane hostname...") - - var clusterInfoConfigMap *corev1.ConfigMap - var err error - - if clusterInfoConfigMap, err = i.K8sClientset.CoreV1().ConfigMaps(constants.KubePublicNamespace). - Get(i.Context, constants.ClusterInfoConfigMapName, metav1.GetOptions{}); err != nil { - if errors.IsNotFound(err) { - zap.S().Warnf("%s not found", constants.TKGMetaConfigMapName) - return "", nil - } - return "", err - } - - clusterInfo := &ClusterInfo{} - if err = yaml.Unmarshal([]byte(clusterInfoConfigMap.Data["kubeconfig"]), clusterInfo); err != nil { - zap.S().Error(err) - return "", err - } - - // we do not expect there are more than one cluster under clusters section, if so only get the first one - controlPlaneURL := clusterInfo.Clusters[0].Cluster.Server - var parsedURL *url.URL - if parsedURL, err = url.Parse(controlPlaneURL); err != nil { - zap.S().Error(err) - return "", nil - } - return parsedURL.Hostname(), nil -} - -// GetServiceEndpoint takes the service name and namespace to construct the correct service endpoint -// Return external accessible service endpoint -func (i *Inspector) GetServiceEndpoint(namespace, name string) (string, error) { - var service *corev1.Service - zap.S().Infof("Getting the external endpoint of Service %s/%s...", namespace, name) - err := retry.OnError(wait.Backoff{ - Steps: 6, - Duration: 3 * time.Second, - Factor: 2.0, - Jitter: 0.1, - }, - errors.IsServiceUnavailable, - func() error { - var e error - service, e = i.K8sClientset.CoreV1().Services(namespace).Get(i.Context, name, metav1.GetOptions{}) - if e != nil { - return e - } - // lets wait the loadbalancer to be ready if its ServiceType is LoadBalancer - if service.Spec.Type == corev1.ServiceTypeLoadBalancer && len(service.Status.LoadBalancer.Ingress) == 0 { - return errors.NewServiceUnavailable("the LoadBalancer ingress is not ready") - } - return nil - }, - ) - if err != nil { - zap.S().Error(err) - return "", err - } - - var host string - var serviceEndpoint string - if service.Spec.Type == corev1.ServiceTypeNodePort { - zap.S().Info("Detected the service type is NodePort") - // on vsphere if the service is using NodePort, the service accessible IP is the control plane VIP - if host, err = i.GetControlPlaneHostname(); err != nil { - zap.S().Error(err) - return "", err - } - serviceEndpoint = fmt.Sprintf("https://%s", net.JoinHostPort(host, fmt.Sprint(service.Spec.Ports[0].NodePort))) - } else if service.Spec.Type == corev1.ServiceTypeLoadBalancer { - hostname := service.Status.LoadBalancer.Ingress[0].Hostname - ip := service.Status.LoadBalancer.Ingress[0].IP - if hostname != "" { - // on aws the loadbalancer.ingress does not have IP, it has hostname instead - host = hostname - } else if ip != "" { - // on gce or openstack it usually is set to be IP - host = ip - } - serviceEndpoint = fmt.Sprintf("https://%s", net.JoinHostPort(host, fmt.Sprint(service.Spec.Ports[0].Port))) - } - serviceEndpoint, err = utils.RemoveDefaultTLSPort(serviceEndpoint) - if err != nil { - return "", err - } - zap.S().Infof("The external endpoint of Service %s/%s is %s", namespace, name, serviceEndpoint) - return serviceEndpoint, nil -} diff --git a/pinniped-components/post-deploy/pkg/schemas/schemas.go b/pinniped-components/post-deploy/pkg/schemas/schemas.go deleted file mode 100644 index b914efb557..0000000000 --- a/pinniped-components/post-deploy/pkg/schemas/schemas.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package schemas defines the YAML schemas for various objects. -package schemas - -// DexConfig contains the Dex configuration settings. -type DexConfig struct { - Issuer string `yaml:"issuer,omitempty"` - FrontEnd *frontEnd `yaml:"frontend,omitempty"` - Web *web `yaml:"web,omitempty"` - Expiry *expiry `yaml:"expiry,omitempty"` - Logger *logger `yaml:"logger,omitempty"` - StaticClients []*StaticClient `yaml:"staticClients,omitempty"` - Connectors []*connector `yaml:"connectors,omitempty"` - Oauth2 *oauth2 `yaml:"oauth2,omitempty"` - Storage *storage `yaml:"storage,omitempty"` - EnablePasswordDB bool `yaml:"enablePasswordDB"` -} - -type frontEnd struct { - Theme string `yaml:"theme,omitempty"` -} - -type web struct { - HTTPS string `yaml:"https,omitempty"` - TLSCert string `yaml:"tlsCert,omitempty"` - TLSKey string `yaml:"tlsKey,omitempty"` -} - -type expiry struct { - SigningKeys string `yaml:"signingKeys,omitempty"` - IDTokens string `yaml:"idTokens,omitempty"` - AuthRequests string `yaml:"authRequests,omitempty"` - DeviceRequests string `yaml:"deviceRequests,omitempty"` - // https://dexidp.io/docs/id-tokens/#expiration-and-rotation-settings - // Leave this as map[string]any because the contents do not need to be read - RefreshTokens map[string]any `yaml:"refreshTokens,omitempty"` -} - -type logger struct { - Level string `yaml:"level,omitempty"` - Format string `yaml:"format,omitempty"` -} - -// StaticClient contains client information. -type StaticClient struct { - ID string `yaml:"id,omitempty"` - Name string `yaml:"name,omitempty"` - RedirectURIs []string `yaml:"redirectURIs,omitempty"` - Secret string `yaml:"secret,omitempty"` -} - -type connector struct { - Type string `yaml:"type,omitempty"` - ID string `yaml:"id,omitempty"` - Name string `yaml:"name,omitempty"` - Config struct { - UserSearch struct { - BaseDN string `yaml:"baseDN,omitempty"` - Filter string `yaml:"filter,omitempty"` - Username string `yaml:"username,omitempty"` - IDAttr string `yaml:"idAttr,omitempty"` - EmailAttr string `yaml:"emailAttr,omitempty"` - NameAttr string `yaml:"nameAttr,omitempty"` - Scope string `yaml:"scope,omitempty"` - } `yaml:"userSearch,omitempty"` - GroupSearch struct { - BaseDN string `yaml:"baseDN,omitempty"` - Filter string `yaml:"filter,omitempty"` - NameAttr string `yaml:"nameAttr,omitempty"` - Scope string `yaml:"scope,omitempty"` - UserMatchers []struct { - UserAttr string `yaml:"userAttr,omitempty"` - GroupAttr string `yaml:"groupAttr,omitempty"` - } `yaml:"userMatchers,omitempty"` - } `yaml:"groupSearch,omitempty"` - HostedDomains []string `yaml:"hostedDomains,omitempty"` - Scopes []string `yaml:"scopes,omitempty"` - Issuer string `yaml:"issuer,omitempty"` - ClientID string `yaml:"clientID,omitempty"` - ClientSecret string `yaml:"clientSecret,omitempty"` - RedirectURI string `yaml:"redirectURI,omitempty"` - BasicAuthUnsupported string `yaml:"basicAuthUnsupported,omitempty"` - UserIDKey string `yaml:"userIDKey,omitempty"` - UserNameKey string `yaml:"userNameKey,omitempty"` - Host string `yaml:"host,omitempty"` - BindDN string `yaml:"bindDN,omitempty"` - BindPW string `yaml:"bindPW,omitempty"` - UsernamePrompt string `yaml:"usernamePrompt,omitempty"` - RootCA string `yaml:"rootCA,omitempty"` - RootCAData string `yaml:"rootCAData,omitempty"` - ClaimMapping map[string]string `yaml:"claimMapping,omitempty"` - InsecureSkipEmailVerified bool `yaml:"insecureSkipEmailVerified,omitempty"` - InsecureEnableGroups bool `yaml:"insecureEnableGroups,omitempty"` - GetUserInfo bool `yaml:"getUserInfo,omitempty"` - InsecureSkipVerify bool `yaml:"insecureSkipVerify"` - InsecureNoSSL bool `yaml:"insecureNoSSL,omitempty"` - StartTLS bool `yaml:"startTLS,omitempty"` - } `yaml:"config"` -} - -type oauth2 struct { - SkipApprovalScreen bool `yaml:"skipApprovalScreen"` - ResponseTypes []string `yaml:"responseTypes,omitempty"` -} - -type storage struct { - Type string `yaml:"type,omitempty"` - Config struct { - InCluster bool `yaml:"inCluster"` - } `yaml:"config"` -} diff --git a/pinniped-components/post-deploy/pkg/utils/utils.go b/pinniped-components/post-deploy/pkg/utils/utils.go deleted file mode 100644 index 9bb9185b9b..0000000000 --- a/pinniped-components/post-deploy/pkg/utils/utils.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package utils implements utility functions. -package utils - -import ( - "context" - "crypto/rand" - "encoding/hex" - "fmt" - "net" - "net/url" - "time" - - certmanagerv1 "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1" - "go.uber.org/zap" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/util/retry" -) - -// IsIP checks if a string contains a valid IP address. -func IsIP(host string) bool { - addr := net.ParseIP(host) - return addr != nil -} - -// RemoveDefaultTLSPort removes the port value from fullURL if it is the default 443. -func RemoveDefaultTLSPort(fullURL string) (string, error) { - var err error - var parsedURL *url.URL - if parsedURL, err = url.Parse(fullURL); err != nil { - zap.S().Error(err) - return "", fmt.Errorf("cannot parse url: %w", err) - } - if parsedURL.Port() == "443" { - return fmt.Sprintf("%s://%s", parsedURL.Scheme, parsedURL.Hostname()), nil - } - return fullURL, nil -} - -// RandomHex returns a random hexadecimal number of n length. -func RandomHex(n int) (string, error) { - bytes := make([]byte, n) - if _, err := rand.Read(bytes); err != nil { - return "", err - } - return hex.EncodeToString(bytes), nil -} - -// GetSecretFromCert extracts the secret for the certificate. -func GetSecretFromCert(ctx context.Context, client kubernetes.Interface, cert *certmanagerv1.Certificate) (*corev1.Secret, error) { - // get secret from cert - var secret *corev1.Secret - secretNamespace := cert.Namespace - secretName := cert.Spec.SecretName - err := retry.OnError(wait.Backoff{ - Steps: 6, - Duration: 3 * time.Second, - Factor: 2.0, - Jitter: 0.1, - }, - errors.IsNotFound, - func() error { - var getErr error - secret, getErr = client.CoreV1().Secrets(secretNamespace).Get(ctx, secretName, metav1.GetOptions{}) - return getErr - }, - ) - if err != nil { - zap.S().Errorf("unable to get the Secret %s/%s referenced by Certificate %s/%s. Error: %v", secretNamespace, secretName, cert.Namespace, cert.Namespace, err) - return nil, err - } - zap.S().Infof("Got the Secret %s/%s referenced by Certificate %s/%s.", secretNamespace, secretName, cert.Namespace, cert.Namespace) - return secret, nil -} diff --git a/pinniped-components/post-deploy/pkg/utils/utils_test.go b/pinniped-components/post-deploy/pkg/utils/utils_test.go deleted file mode 100644 index 94ba128bd7..0000000000 --- a/pinniped-components/post-deploy/pkg/utils/utils_test.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "context" - "errors" - "testing" - - certmanagerv1 "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1" - "github.com/stretchr/testify/require" - corev1 "k8s.io/api/core/v1" - kubeerrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - kubefake "k8s.io/client-go/kubernetes/fake" - kubetesting "k8s.io/client-go/testing" -) - -func TestRemoveDefaultTLSPort(t *testing.T) { - tests := []struct { - name string - url string - wantURL string - wantError string - }{ - { - name: "invalid url", - url: "not a valid url \x01", - wantError: `cannot parse url: parse "not a valid url \x01": net/url: invalid control character in URL`, - }, - { - name: "contains no port", - url: "https://example.com", - wantURL: "https://example.com", - }, - { - name: "contains non-443 port", - url: "https://example.com:12345", - wantURL: "https://example.com:12345", - }, - { - name: "contains 443 port", - url: "https://example.com:443", - wantURL: "https://example.com", - }, - } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - gotURL, err := RemoveDefaultTLSPort(test.url) - if test.wantError != "" { - require.EqualError(t, err, test.wantError) - } else { - require.NoError(t, err) - } - require.Equal(t, test.wantURL, gotURL) - }) - } -} - -func TestGetSecretFromCert(t *testing.T) { - secretGVR := corev1.SchemeGroupVersion.WithResource("secrets") - secret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{Namespace: "some-namespace", Name: "some-secret"}, - } - - cert := &certmanagerv1.Certificate{ - ObjectMeta: metav1.ObjectMeta{Namespace: secret.Namespace}, - Spec: certmanagerv1.CertificateSpec{SecretName: secret.Name}, - } - - tests := []struct { - name string - newKubeClient func() *kubefake.Clientset - wantSecret *corev1.Secret - wantError string - wantActions []kubetesting.Action - }{ - { - name: "happy path", - newKubeClient: func() *kubefake.Clientset { return kubefake.NewSimpleClientset(secret) }, - wantSecret: secret, - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(secretGVR, secret.Namespace, secret.Name), - }, - }, - { - name: "secret is not there until 3rd retry", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset(secret) - retries := 2 - c.PrependReactor("get", "secrets", func(_ kubetesting.Action) (bool, runtime.Object, error) { - if retries == 0 { - return true, secret, nil - } - retries-- - return true, nil, kubeerrors.NewNotFound(secretGVR.GroupResource(), secret.Name) - }) - return c - }, - wantSecret: secret, - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(secretGVR, secret.Namespace, secret.Name), - kubetesting.NewGetAction(secretGVR, secret.Namespace, secret.Name), - kubetesting.NewGetAction(secretGVR, secret.Namespace, secret.Name), - }, - }, - { - name: "secret get fails", - newKubeClient: func() *kubefake.Clientset { - c := kubefake.NewSimpleClientset(secret) - c.PrependReactor("get", "secrets", func(_ kubetesting.Action) (bool, runtime.Object, error) { - return true, nil, errors.New("some get error") - }) - return c - }, - wantError: "some get error", - wantActions: []kubetesting.Action{ - kubetesting.NewGetAction(secretGVR, secret.Namespace, secret.Name), - }, - }, - } - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - fakeKubeClient := test.newKubeClient() - gotSecret, err := GetSecretFromCert(context.Background(), fakeKubeClient, cert) - if test.wantError != "" { - require.EqualError(t, err, test.wantError) - } else { - require.NoError(t, err) - } - require.Equal(t, test.wantSecret, gotSecret) - require.Equal(t, test.wantActions, fakeKubeClient.Actions()) - }) - } -} diff --git a/pinniped-components/post-deploy/pkg/vars/vars.go b/pinniped-components/post-deploy/pkg/vars/vars.go deleted file mode 100644 index c861ada643..0000000000 --- a/pinniped-components/post-deploy/pkg/vars/vars.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package vars contains variables used throughout the codebase. -package vars - -var ( - // SupervisorNamespace is the supervisor service namespace. - SupervisorNamespace = "pinniped-supervisor" - - // SupervisorSvcName is the supervisor service name. - SupervisorSvcName = "" - - // ConciergeNamespace is the Concierge namespace. - ConciergeNamespace = "pinniped-concierge" - - // DexNamespace is the Dex namespace. - DexNamespace = "tanzu-system-auth" - - // DexSvcName is the Dex service name. - DexSvcName = "dexsvc" - - // DexCertName is the Dex cert name. - DexCertName = "dex-cert-tls" - - // DexConfigMapName is the Dex ConfigMap name. - DexConfigMapName = "dex" - - // PinnipedOIDCProviderName is the Dex OIDC identity provider. - PinnipedOIDCProviderName = "upstream-oidc-identity-provider" - - // PinnipedOIDCClientSecretName is the Dex client credentials. - PinnipedOIDCClientSecretName = "upstream-idp-client-credentials" //nolint:gosec - - // SupervisorSvcEndpoint is the supervisor service endpoint. - SupervisorSvcEndpoint = "" - - // FederationDomainName is the federation domain name. - FederationDomainName = "" - - // JWTAuthenticatorName is the JWT authentication name. - JWTAuthenticatorName = "" - - // JWTAuthenticatorAudience is the JWT authenticator audience. - JWTAuthenticatorAudience = "" - - // SupervisorCertName is the supervisor cert name. - SupervisorCertName = "" - - // SupervisorCABundleData is the supervisor CA bundle data. - SupervisorCABundleData = "" - - // CustomTLSSecretName is the the name of custom provided TLS secret if they don't want to use the self-signed cert generated by cert manager - CustomTLSSecretName = "" - - // IsDexRequired is flag indicates if configuring dex is required - IsDexRequired = false -) diff --git a/pinniped-components/readme.md b/pinniped-components/readme.md deleted file mode 100644 index 4d726048c5..0000000000 --- a/pinniped-components/readme.md +++ /dev/null @@ -1,208 +0,0 @@ -# Pinniped integration for TKG - -## Introduction - -The goal of integrating with Pinniped is to provide user authentication feature for TKG clusters. Pinniped allows cluster -administrators to easily plug in external identity providers (IDPs) into Kubernetes clusters. This is achieved via a -uniform install procedure across all types and origins of Kubernetes clusters, declarative configuration via Kubernetes -APIs, enterprise-grade integrations with IDPs, and distribution-specific integration strategies. Users could specify the -identity management source(OIDC/LDAP) during the cluster bootstrapping step and perform Day2 configurations based on -their needs. - -[Official Pinniped documentation](https://pinniped.dev/docs/) - -## Architecture - -![architecture](docs/resources/architecture.png) - -### Components on Management cluster - -* Pinniped Supervisor -* Pinniped Concierge -* Dex -* Pinniped post deployment job - -There are three CRs of Pinniped will be deployed: - -* OIDCIdentityProvider -* FederationDomain -* JWTAuthenticator - -And there is a ConfigMap called `pinniped-info` created under `kube-public` with cluster_name, issuer, -issuer_ca_bundle_data as its content. - -#### Why having Dex deployed as part of Pinniped - -Having Dex deployed as part of Pinniped is to support LDAP use cases since current release of Pinniped(v0.4.0) does not -have LDAP supported. Per design for TKG Calgary release, we actually use Dex for both OIDC and LDAP by configuring the -upstream identity provider of Pinniped to always be Dex and the static client of Dex always be Pinniped. We have the plan -to improve this flow by using Dex only for LDAP, and this will land post TKG Calgary release. - -#### Why having Pinniped post deployment job - -There are something we could not configure at the time of the deployment, e.g. service external IP/DNS for both Pinniped -and Dex. We need the post deployment job to configure those things to make the entire authentication work. It configures -the following: - -* Update `Certificate` to have correct external IP/DNS for both Dex and Pinniped service. -* Update `OIDCIdentityProvider` to have correct issuer url and tls cert. -* Update `JWTAuthenticator` to have correct issuer url. -* Update `ConfigMap` of Dex to have correct configurations. -* Update `Secret` used by the communication between Dex and Pinniped. - -There will be a new implementation of the post deployment job which will configure the `Pinniped Addon Secret` directly -instead of updating the K8S resources, so that the Addon-Manager will picks up the change and reconcile. - -### Components on Workload clusters - -* Pinniped Concierge - -There are one CRs of Pinniped will be deployed: - -* JWTAuthenticator - -The JWTAuthenticator holds the issuer url pointing back to Pinniped Supervisor service, so that the workload cluster could -communicate back to management cluster to complete the whole authentication flow. - -## How to enable TKG Pinniped addon at the cluster bootstrapping step - -If you use TKG cli or Tanzu cli to bootstrap TKG clusters, then the installation wizard will guide you to fill in the required -configurations in order to deploy TKG Pinniped addon. - -## How to enable TKG Pinniped addon to an existing cluster - -**Note:** You could use this approach to deploy TKG Pinniped addon to any clusters, there is no need to install addon-manager -or kapp-controller to test out TKG Pinniped addon. - -* Create the ytt value yaml(`values.yaml`) based on the example from [here](./examples), and substitute the values for - your case. -* Run `ytt --ignore-unknown-comments -f ../ytt-common-libs -f ../pinniped/templates -f values.yaml > pinniped.yaml` -* Run `kubectl apply -f pinniped.yaml`. Once you have applied the `pinniped.yaml` you should be able to see required - resources are creating. The post deploy job - will also be running to configure the Pinniped and Dex installation to make all things work. Wait for a while until - the post deploy job to complete. - * If using external OIDC provider, you might want to configure the OIDC provider by providing correct login redirect - url to Dex service. -* Copy the Pinniped-cli from [here](./post-deploy/hack/bin/pinniped-cli) or download from Pinniped [Github](https://github.com/vmware-tanzu/pinniped/releases) -* Run `./pinniped-cli get kubeconfig` to get the updated kubeconfig which could be distributed to authorized users. The - users with that kubeconfig will be redirected to configured authentication page. - -## How to use custom TLS Certificates - -Pinniped and Dex use self-signed `Issuer` by default to generate the signed TLS certificates. Users can override the default -setting with the following two options. - -### Using custom ClusterIssuer - -If the user has an existing `ClusterIssuer` that can be used to sign certificates, the self-signed Issuer can be replaced -by specifying `custom_cluster_issuer` in values.yaml. User can put the name of the `ClusterIssuer` for this field, then -both Pinniped and Dex TLS certificates will be signed by this ClusterIssuer instead. - -### Using custom TLS Secret - -Users can also specify their own TLS secrets directly. This can only be configured as day 2 operation after Pinniped and -Dex are running successfully. - -Users will need to create 2 separate `kubernetes.io/tls` secrets. Both secrets should have the same name. The first one -should be signed against the IP or DNS of Pinniped service and put in the namespace of Pinniped Supervisor. The second one -should be signed against IP or DNS of Dex service and put in the namespace of Dex. - -Once the secrets are ready, add the secret name to `custom_tls_secret` in values.yaml and redeploy. - -## Day 2 operations in TKG Calgary release - -It is possible that you provided the incorrect configurations for your user authentication on Day 1 and you want to perform -Day 2 operations to reconfigure it. - -The following settings are the configurable on Day 2: - -* **OIDC client ID**: The client ID of upstream OIDC provider. To make the changes, update `dex.config.oidc.CLIENT_ID` in - Pinniped addon `Secret` and restart Dex pods. -* **OIDC client secret**: The client secret of upstream OIDC provider. To make the changes, update `dex.config.oidc.CLIENT_SECRET` - in Pinniped addon `Secret` and restart Dex pods. -* **OIDC issuer**: The upstream OIDC issuer url. To make the changes, update `dex.config.oidc.issuer` in - Pinniped addon `Secret` and restart Dex pods. -* **OIDC scopes**: List of additional scopes to request in token response. To make the changes, update `dex.config.oidc.scopes` in - Pinniped addon `Secret` and restart Dex pods. -* **OIDC claimMapping**: Some providers return non-standard claims (eg. mail). Use claimMapping to map those - claims to standard claims. To make the changes, update `dex.config.oidc.scopes` in Pinniped addon `Secret` and restart - Dex pods. -* **LDAP host**: Host and optional port of the LDAP server in the form "host:port". To make the changes, update - `dex.config.ldap.host` in Pinniped addon `Secret` and restart Dex pods. -* **LDAP bindDN and bindPW**: The DN and password for an application service account. The connector uses these credentials - to search for users and groups. Not required if the LDAP server provides access for anonymous auth. To make the changes, - update `dex.config.ldap.bindDN` or `dex.config.ldap.bindPW` in Pinniped addon `Secret` and restart Dex pods. -* **LDAP userSearch**: User search maps a username and password entered by a user to a LDAP entry. To make the changes, - update `dex.config.oidc.userSearch` in Pinniped addon `Secret` and restart Dex pods. -* **LDAP groupSearch**: Group search queries for groups given a user entry. To make the changes, update - `dex.config.oidc.userSearch` in Pinniped addon `Secret` and restart Dex pods. - -Above configurations are eventually loaded in Dex. More details on Dex configurations could be found here: - -* [LDAP](https://dexidp.io/docs/connectors/ldap/) -* [OIDC](https://dexidp.io/docs/connectors/oidc/) - -* **Custom cluster issuer**: The name of custom cluster issuer - * Update the `custom_cluster_issuer` in Pinniped addon secret called `-pinniped-addon` - * Pinniped post deployment job will be triggered to perform the reconfiguration -* **Custom tls secret**: The name of the custom TLS secret - * Update the `custom_tls_secret` in Pinniped addon secret called `-pinniped-addon` - * Pinniped post deployment job will be triggered to perform the reconfiguration - -## Images - -### Post deploy job images - -* Latest development image: gcr.io/kubernetes-development-244305/gdaniel/tkg-pinniped-post-deploy:latest - -### Pinniped addon template images - -* Latest development image: gcr.io/kubernetes-development-244305/gdaniel/tkg-addons-pinniped-templates:latest - -## Known issues and debug guidelines - -### Manually updated fields are reverted - -The kapp-controller under the hood will reconcile the `App` based on the configuration values from Pinniped addon `Secret`. -Only few fields are configured to be ignored by kapp-controller: - -* `OIDCIdentityProvider.spec.authorizationConfig` -* `OIDCIdentityProvider.spec.claims` -* `OIDCIdentityProvider.spec.issuer` -* `OIDCIdentityProvider.spec.tls` -* `FederationDomain.spec.issuer` -* `JWTAuthenticator.spec.audience` -* `JWTAuthenticator.spec.claims` -* `JWTAuthenticator.spec.issuer` -* `JWTAuthenticator.spec.tls` -* Dex `ConfigMap` -* Dex TLS `Certificate` -* Pinniped TLS `Certificate` -* Pinniped client `Secret` - -So any changes in other fields will be reverted to be what were provided in the Pinniped addon `Secret` after the sync -period. If you want to reconfigure anything other than above fields, please update the Pinnied addon `Secret` accordingly. - -### The OIDC discovery failure from `OIDCIdentityProvider` CR status - -* Check the `issuer` field to make sure it is configured properly, if not you could update the value directly in - `OIDCIdentityProvider`. -* Check if the `tls` field has the correct certificate, the TLS certificate is the one used to talk to upstream IDP. In - TKG Calgary release, the upstream of Pinniped is Dex. -* The `OIDCIdentityProvider` should be configured automatically by the post deployment job, if it is not configured properly - check the log of post deployment job to see there are any errors - -### Cannot authenticate from workload cluster - -* Make sure the Pinniped supervisor service is accessible from workload cluster. -* Check the `JWTAuthenticator` CR to make sure the `issuer` field is configured properly. It should be configured to be - the Pinniped supervisor service external IP/DNS. If the value is incorrect, you could update `JWTAuthenticator` CR directly. -* Check the `tls` field has the correct CA bundle data. The CA bundle is used for the communication between workload cluster - and Pinniped supervisor service in management cluster. - -### Post deployment job fails - -* With error message "the LoadBalancer ingress is not ready": We saw this issue several times with TKG on Azure. The root - cause of this issue is that either Pinniped supervisor service external IP or Dex service external IP is not ready when - using `LoadBalancer` as the `Service.Spec.Type`. Try to run `kubectl delete app pinniped -n tkg-system`, wait for a while - to let the addon-manager recreate the Pinniped addon, list the service to see if external IP address is assigned. diff --git a/pinniped-components/tanzu-auth-controller-manager/.gitignore b/pinniped-components/tanzu-auth-controller-manager/.gitignore deleted file mode 100644 index 36946b0e06..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/.gitignore +++ /dev/null @@ -1 +0,0 @@ -coverage.txt \ No newline at end of file diff --git a/pinniped-components/tanzu-auth-controller-manager/Dockerfile b/pinniped-components/tanzu-auth-controller-manager/Dockerfile deleted file mode 100644 index 2d66e39f06..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/Dockerfile +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Enable Buildkit -# syntax=docker/dockerfile:1.4 - -# Build from publicly reachable source by default, but allow people to re-build images on -# top of their own trusted images. -ARG BUILDER_BASE_IMAGE=golang:1.18 -ARG DISTROLESS_BASE_IMAGE=gcr.io/distroless/static:nonroot - -# Build the tanzu-auth-controller-manager binary -FROM $BUILDER_BASE_IMAGE as builder - -WORKDIR /workspace -# Copy the Go Modules manifests -COPY go.mod go.mod -COPY go.sum go.sum - -# Setting default GOPROXY to https://proxy.golang.org,direct and GOSUMDB to sum.golang.org which can be override by Makefile -ARG GOSUMDB -ARG GOPROXY -ENV GOSUMDB=$GOSUMDB -ENV GOPROXY=$GOPROXY -# cache deps before building and copying source so that we don't need to re-download as much -# and so that source changes don't invalidate our downloaded layer -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod go mod download - -# Copy the source -COPY main.go main.go -COPY controllers/ controllers/ - -# Build -ARG LD_FLAGS -ENV LD_FLAGS="$LD_FLAGS "'-extldflags "-static"' -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -a -ldflags "$LD_FLAGS" -o tanzu-auth-controller-manager . - -FROM $DISTROLESS_BASE_IMAGE -WORKDIR / -COPY --from=builder /workspace/tanzu-auth-controller-manager . -USER 65532:65532 -ENTRYPOINT ["/tanzu-auth-controller-manager"] diff --git a/pinniped-components/tanzu-auth-controller-manager/Makefile b/pinniped-components/tanzu-auth-controller-manager/Makefile deleted file mode 100644 index 0765425ffb..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# This Makefile is here to follow step 4 of this README: -# https://github.com/vmware-tanzu/tanzu-framework/blob/5cdba3181afbc31b05d4df51052fb47f3fcb5b92/docs/packages/add-new-package-to-package-repo.md - -BUILD_SHA ?= $$(git describe --match=$(git rev-parse --short HEAD) --always --dirty) -BUILD_DATE ?= $$(date -u +"%Y-%m-%d") -BUILD_VERSION ?= $(shell git describe --tags --abbrev=0 2>$(NUL)) - -ifeq ($(strip $(BUILD_VERSION)),) -BUILD_VERSION = dev -endif - -ifdef DEBUG -LD_FLAGS = -s -GC_FLAGS = all=-N -l -else -LD_FLAGS = -s -w -GC_FLAGS = -endif - -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/pinniped-components/pkg/buildinfo.Date=$(BUILD_DATE)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/pinniped-components/pkg/buildinfo.SHA=$(BUILD_SHA)' -LD_FLAGS += -X 'github.com/vmware-tanzu/tanzu-framework/pinniped-components/pkg/buildinfo.Version=$(BUILD_VERSION)' - -IMG_DEFAULT_NAME := tanzu-auth-controller-manager -IMG_DEFAULT_TAG := latest -IMG_DEFAULT_NAME_TAG := $(IMG_DEFAULT_NAME):$(IMG_DEFAULT_TAG) - -IMG_VERSION_OVERRIDE ?= $(IMG_DEFAULT_TAG) - -#Adding Support for GOPROXY and GOSUMDB -GOPROXY ?= "https://proxy.golang.org,direct" -GOSUMDB ?= "sum.golang.org" -DISTROLESS_BASE_IMAGE ?= gcr.io/distroless/static:nonroot - -ifeq ($(strip $(OCI_REGISTRY)),) - IMG ?= $(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -else - IMG ?= $(OCI_REGISTRY)/$(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -endif - -.PHONY: docker-build -docker-build: ## Build docker image - docker build -t $(IMG) -f Dockerfile --build-arg LD_FLAGS="$(LD_FLAGS)" --build-arg DISTROLESS_BASE_IMAGE="$(DISTROLESS_BASE_IMAGE)" --build-arg GOPROXY="$(GOPROXY)" --build-arg GOSUMDB="$(GOSUMDB)" . - -.PHONY: docker-publish -docker-publish: ## Publish docker image - docker push $(IMG) - -.PHONY: kbld-image-replace -kbld-image-replace: ## Add newImage in kbld-config.yaml - cd ../../hack/packages/kbld-image-replace && \ - go run main.go -kbld-config ../../../packages/tanzu-auth/kbld-config.yaml $(IMG_DEFAULT_NAME_TAG) $(IMG) diff --git a/pinniped-components/tanzu-auth-controller-manager/README.md b/pinniped-components/tanzu-auth-controller-manager/README.md deleted file mode 100644 index 59ec37fae7..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# tanzu-auth-controller-manager - -This directory is home to the `tanzu-auth-controller-manager`. - -To run this on a cluster: - -```sh -./hack/run.sh -``` - -To run the tests: - -```sh -./hack/test.sh -``` - -To run static checks (e.g., `go fmt`, `go vet`, `golangci-lint`) and the tests: - -```sh -./hack/check.sh -``` - -To generate the default pinniped addon secret: - -```sh -# The primary use case of this feature is through the top-level Tanzu Framework Makefile, via a command like: -# (consult the top-level Makefile for further details) -make generate-package-secret PACKAGE=pinniped tkr=v1.23.3---vmware.1-tkg.1 iaas=vsphere - -# to generate the secret in the context of the /pinniped-components/tanzu-auth-controller-manager, do one of the following: - -# manually via ytt -ytt -f ./hack/ytt -v tkr=v1.23.3---vmware.1-tkg.1 -v infrastructure_provider=vsphere - -# using the generate script -# arguments are ytt args passed as: -v for example, something like: -./hack/generate-package-secret.sh -v tkr=v1.23.3---vmware.1-tkg.1 -v infrastructure_provider=vsphere -``` - -To change the log level, add the `--v=LOG_LEVEL` arg to the controller deployment. LOG_LEVEL should -be a number. Default log level is 0. Example: - -```yaml ---- -kind: Deployment -apiVersion: apps/v1 -metadata: - name: tanzu-auth-controller-manager - namespace: tanzu-auth -spec: - selector: - matchLabels: - app: tanzu-auth-controller-manager - template: - metadata: - labels: - app: tanzu-auth-controller-manager - spec: - serviceAccountName: tanzu-auth-controller-manager-sa - containers: - - args: - - --v=1 - image: #@ data.values.image - name: tanzu-auth-controller-manager -``` diff --git a/pinniped-components/tanzu-auth-controller-manager/controllers/constants.go b/pinniped-components/tanzu-auth-controller-manager/controllers/constants.go deleted file mode 100644 index 91e66eb111..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/controllers/constants.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -// infrastructure provider name constants -const ( - InfrastructureProviderVSphere = "vsphere" - InfrastructureProviderAWS = "aws" - InfrastructureProviderAzure = "azure" - InfrastructureProviderDocker = "docker" -) - -const ( - // InfrastructureRefVSphere is the vSphere infrastructure - InfrastructureRefVSphere = "VSphereCluster" - // InfrastructureRefAWS is the AWS infrastructure - InfrastructureRefAWS = "AWSCluster" - // InfrastructureRefAzure is the Azure infrastructure - InfrastructureRefAzure = "AzureCluster" -) - -const ( - CascadeControllerV1alpha1Name = "v1alpha1 tanzu auth cascade controller" - CascadeControllerV1alpha3Name = "v1alpha3 tanzu auth cascade controller" -) - -const ( - // TODO: I kinda don't like that we're copying a lot of these from addons/pkg/constants - - // tkgDataValueFileName is the default name of YTT data value field - tkgDataValueFieldName = "values.yaml" - - // tkgDataOverlayFileName is the default name of YTT data overlay field - tkgDataOverlayFieldName = "overlays.yaml" - - // secretNamespaceLogKey is the log key for "secret namespace" - secretNamespaceLogKey = "secret namespace" - - // secretNameLogKey is the log key for "secret name" - secretNameLogKey = "secret name" - - // clusterNamespaceLogKey is the log key for "cluster namespace" - clusterNamespaceLogKey = "cluster namespace" - - // clusterNameLogKey is the log key for "cluster name" - clusterNameLogKey = "cluster name" - - // tkgClusterNameLabel is the label on the Secret to indicate the cluster on which addon is to be installed - tkgClusterNameLabel = "tkg.tanzu.vmware.com/cluster-name" - - // clusterBootstrapManagedSecret is the name for the secrets that are managed by ClusterBootstrapController - clusterBootstrapManagedSecret = "clusterbootstrap-secret" - - // tkgAddonType is the type associated with a TKG addon secret - tkgAddonType = "tkg.tanzu.vmware.com/addon" - - // tkgAddonTypeAnnotation is the addon type annotation - tkgAddonTypeAnnotation = "tkg.tanzu.vmware.com/addon-type" - - // pinnipedAddonTypeAnnotation is the addon type annotation for Pinniped - pinnipedAddonTypeAnnotation = "authentication/pinniped" - - // tkgAddonLabel is the label associated with a TKG addon secret - tkgAddonLabel = "tkg.tanzu.vmware.com/addon-name" - - // pinnipedAddonLabel is the addon label for pinniped - pinnipedAddonLabel = "pinniped" - - // packageNameLabel is the label on the cloned objects namely Secrets and Providers by "TanzuClusterBootstrap" Reconciler to indicate the package name - packageNameLabel = "tkg.tanzu.vmware.com/package-name" - - // tkrLabel is the TKR label. - tkrLabel = "tanzuKubernetesRelease" - - // tkrLabelClassyClusters is the TKR label for the clusters created using cluster-class - tkrLabelClassyClusters = "run.tanzu.vmware.com/tkr" - - // Pinniped is the package label value for pinniped - pinnipedPackageLabel = "pinniped" - - // pinnipedInfoConfigMapName is the name of the Pinniped Info Configmap - pinnipedInfoConfigMapName = "pinniped-info" - - // Issuer is the key for "issuer" field in the Pinniped Info Configmap - issuerKey = "issuer" - - // issuerCABundleKey is the key for "issuer_ca_bundle_data" field in the Pinniped Info Configmap - issuerCABundleKey = "issuer_ca_bundle_data" - - // supervisorCABundleKey is the key for "supervisor_ca_bundle_data" field in the Pinniped ClusterBootstrap secret - supervisorCABundleKey = "supervisor_ca_bundle_data" - - // supervisorEndpointKey is the key for "supervisor_svc_endpoint" field in the Pinniped ClusterBootstrap secret - supervisorEndpointKey = "supervisor_svc_endpoint" - - // identityManagementTypeKey is the key for "identity_management_type" field in the Pinniped ClusterBootstrap secret - identityManagementTypeKey = "identity_management_type" - - // kubePublicNamespace is the `kube-public` namespace - kubePublicNamespace = "kube-public" - - // tkgManagementLabel is the label associated with a TKG management cluster - tkgManagementLabel = "cluster-role.tkg.tanzu.vmware.com/management" - - // infrastructureRefDocker is the Docker infrastructure - infrastructureRefDocker = "DockerCluster" - - // oidc is the string for oidc value for identity_management_type field in the Pinniped ClusterBootstrap secret - oidc = "oidc" - - // none is the string for none value for identity_management_type field in the Pinniped ClusterBootstrap secret - none = "none" - - // valuesYAMLPrefix is the data values prefix necessary in the addon secret - valuesYAMLPrefix = `#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -` -) diff --git a/pinniped-components/tanzu-auth-controller-manager/controllers/handlers.go b/pinniped-components/tanzu-auth-controller-manager/controllers/handlers.go deleted file mode 100644 index 0497892839..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/controllers/handlers.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "fmt" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/builder" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/predicate" -) - -func configMapHandler(o client.Object) []ctrl.Request { - // return empty object, if pinniped-info CM changes, update all secrets/clusters - return []ctrl.Request{{}} -} - -func withNamespacedName(namespacedName types.NamespacedName) builder.Predicates { - isNamespacedName := func(o client.Object) bool { - return o.GetNamespace() == namespacedName.Namespace && o.GetName() == namespacedName.Name - } - return builder.WithPredicates( - predicate.Funcs{ - CreateFunc: func(e event.CreateEvent) bool { return isNamespacedName(e.Object) }, - UpdateFunc: func(e event.UpdateEvent) bool { - return isNamespacedName(e.ObjectOld) || isNamespacedName(e.ObjectNew) - }, - DeleteFunc: func(e event.DeleteEvent) bool { return isNamespacedName(e.Object) }, - GenericFunc: func(e event.GenericEvent) bool { return isNamespacedName(e.Object) }, - }, - ) -} - -// withLabel determines if the input object contains the given label -func withLabel(label string) builder.Predicates { - return builder.WithPredicates( - predicate.Funcs{ - CreateFunc: func(e event.CreateEvent) bool { return hasLabel(e.Object, label) }, - UpdateFunc: func(e event.UpdateEvent) bool { - // TODO: do we want to process if either old or new cluster has/had tkrLabel?? - return hasLabel(e.ObjectOld, label) || hasLabel(e.ObjectNew, label) - }, - DeleteFunc: func(e event.DeleteEvent) bool { return hasLabel(e.Object, label) }, - GenericFunc: func(e event.GenericEvent) bool { return hasLabel(e.Object, label) }, - }, - ) -} - -func (c *PinnipedV3Controller) withPackageName(packageName string) builder.Predicates { - var log logr.Logger - containsPackageName := func(o client.Object, packageName string) bool { - var secret *corev1.Secret - log = c.Log.WithValues(secretNamespaceLogKey, o.GetName(), secretNameLogKey, o.GetNamespace()) - switch obj := o.(type) { - case *corev1.Secret: - secret = obj - default: - c.Log.V(1).Info("expected secret, got", "type", fmt.Sprintf("%T", o)) - return false - } - // TODO: do we care if secret is paused? - if secretIsType(secret, clusterBootstrapManagedSecret) && containsPackageName(secret, packageName) { - log.V(1).Info("adding secret for reconciliation") - return true - } - - log.V(1).Info( - "secret is not a cluster bootstrap type or does not have the given name", - "name", packageName) - return false - } - // Predicate func will get called for all events (createObject, update, deleteObject, generic) - return builder.WithPredicates( - predicate.Funcs{ - CreateFunc: func(e event.CreateEvent) bool { return containsPackageName(e.Object, packageName) }, - UpdateFunc: func(e event.UpdateEvent) bool { - return containsPackageName(e.ObjectOld, packageName) || containsPackageName(e.ObjectNew, packageName) - }, - DeleteFunc: func(e event.DeleteEvent) bool { - log.V(1).Info( - "secret is being deleted, skipping reconcile", - secretNamespaceLogKey, e.Object.GetNamespace(), - secretNameLogKey, e.Object.GetName(), - ) - return false - }, - GenericFunc: func(e event.GenericEvent) bool { return containsPackageName(e.Object, packageName) }, - }, - ) -} - -func (c *PinnipedV1Controller) addonSecretToCluster(o client.Object) []ctrl.Request { - clusterName, labelExists := o.GetLabels()[tkgClusterNameLabel] - - if !labelExists || clusterName == "" { - c.Log.Error(nil, "cluster name label not found on resource", - secretNamespaceLogKey, o.GetNamespace(), secretNameLogKey, o.GetName()) - return nil - } - - return []ctrl.Request{{ - NamespacedName: client.ObjectKey{Namespace: o.GetNamespace(), Name: clusterName}, - }} -} - -func (c *PinnipedV1Controller) withAddonLabel(addonLabel string) predicate.Funcs { - // Predicate func will get called for all events (create, update, delete, generic) - return predicate.NewPredicateFuncs(func(o client.Object) bool { - var secret *corev1.Secret - log := c.Log.WithValues(secretNamespaceLogKey, o.GetNamespace(), secretNameLogKey, o.GetName()) - switch obj := o.(type) { - case *corev1.Secret: - secret = obj - default: - log.V(1).Info("expected secret, got", "type", fmt.Sprintf("%T", o)) - return false - } - - // TODO: do we care if secret is paused? - if secretIsType(secret, tkgAddonType) && matchesLabelValue(secret, tkgAddonLabel, addonLabel) { - log.V(1).Info("adding cluster for reconciliation") - return true - } - - log.V(1).Info("secret is not an addon Type or does not have the given label", "label", addonLabel) - return false - }) -} diff --git a/pinniped-components/tanzu-auth-controller-manager/controllers/suite_test.go b/pinniped-components/tanzu-auth-controller-manager/controllers/suite_test.go deleted file mode 100644 index 3676dfe604..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/controllers/suite_test.go +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "path/filepath" - "testing" - - "golang.org/x/tools/go/packages" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - utilerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/kubernetes/scheme" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/envtest" - "sigs.k8s.io/controller-runtime/pkg/envtest/printer" - logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/log/zap" - "sigs.k8s.io/controller-runtime/pkg/manager" - //+kubebuilder:scaffold:imports -) - -// These tests use Ginkgo (BDD-style Go testing framework). Refer to -// http://onsi.github.io/ginkgo/ to learn more about Ginkgo. - -var k8sClient client.Client -var testEnv *envtest.Environment -var ctx = ctrl.SetupSignalHandler() -var cancel context.CancelFunc - -const pinnipedNamespace = "pinniped-namespace" - -func TestController(t *testing.T) { - RegisterFailHandler(Fail) - - RunSpecsWithDefaultAndCustomReporters(t, - "Controller Suite", - []Reporter{printer.NewlineReporter{}}) -} - -var _ = BeforeSuite(func() { - logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) - - By("bootstrapping test environment") - testEnv = &envtest.Environment{ - CRDInstallOptions: envtest.CRDInstallOptions{ - ErrorIfPathMissing: true, - CleanUpAfterUse: true, - }, - ErrorIfCRDPathMissing: true, - } - var err error - testEnv.CRDInstallOptions.Paths, err = getExternalCRDPaths() - Expect(err).NotTo(HaveOccurred()) - - cfg, err := testEnv.Start() - Expect(err).NotTo(HaveOccurred()) - Expect(cfg).NotTo(BeNil()) - - err = corev1.AddToScheme(scheme.Scheme) - Expect(err).NotTo(HaveOccurred()) - - err = clusterapiv1beta1.AddToScheme(scheme.Scheme) - Expect(err).NotTo(HaveOccurred()) - - //+kubebuilder:scaffold:scheme - - k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) - Expect(err).NotTo(HaveOccurred()) - Expect(k8sClient).NotTo(BeNil()) - - options := manager.Options{} - mgr, err := ctrl.NewManager(testEnv.Config, options) - Expect(err).NotTo(HaveOccurred()) - - Expect(NewV1Controller(k8sClient).SetupWithManager(mgr)).To(Succeed()) - Expect(NewV3Controller(k8sClient).SetupWithManager(mgr)).To(Succeed()) - - ctx, cancel = context.WithCancel(ctx) - ns := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: pinnipedNamespace}} - Expect(k8sClient.Create(ctx, ns)).To(Succeed()) - - go func() { - defer GinkgoRecover() - Expect(mgr.Start(ctx)).To(Succeed()) - }() -}, 60) - -var _ = AfterSuite(func() { - By("tearing down the test environment") - // TODO: should we delete namespace here? - cancel() - err := testEnv.Stop() - Expect(err).NotTo(HaveOccurred()) -}) - -func getExternalCRDPaths() ([]string, error) { - externalDeps := map[string][]string{ - "sigs.k8s.io/cluster-api/api/v1beta1": {"config/crd/bases", - "controlplane/kubeadm/config/crd/bases"}, - } - - packageConfig := &packages.Config{ - Mode: packages.NeedModule, - } - - var crdPaths []string - for dep, crdDirs := range externalDeps { - for _, crdDir := range crdDirs { - pkgs, err := packages.Load(packageConfig, dep) - if err != nil { - return nil, err - } - pkg := pkgs[0] - if pkg.Errors != nil { - errs := []error{} - for _, err := range pkg.Errors { - errs = append(errs, err) - } - return nil, utilerrors.NewAggregate(errs) - } - crdPaths = append(crdPaths, filepath.Join(pkg.Module.Dir, crdDir)) - } - } - - logf.Log.Info("external CRD paths", "crdPaths", crdPaths) - return crdPaths, nil -} diff --git a/pinniped-components/tanzu-auth-controller-manager/controllers/suite_test_crd_dependencies.go b/pinniped-components/tanzu-auth-controller-manager/controllers/suite_test_crd_dependencies.go deleted file mode 100644 index 601636518a..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/controllers/suite_test_crd_dependencies.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build tests -// +build tests - -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Ensure CRDs used for tests are present - -package controllers - -import ( - _ "sigs.k8s.io/cluster-api/api/v1beta1" -) diff --git a/pinniped-components/tanzu-auth-controller-manager/controllers/utils.go b/pinniped-components/tanzu-auth-controller-manager/controllers/utils.go deleted file mode 100644 index 0b6e31d8a6..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/controllers/utils.go +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - "reflect" - "strings" - - "github.com/go-logr/logr" - "gopkg.in/yaml.v3" - corev1 "k8s.io/api/core/v1" - k8serror "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// secretIsType returns true if the secret type matches the given expectedType -func secretIsType(secret *corev1.Secret, expectedType corev1.SecretType) bool { - return secret.Type == expectedType -} - -// containsPackageName returns true if the `tkg.tanzu.vmware.com/package-name` label contains the package name we pass in -func containsPackageName(secret *corev1.Secret, expectedName string) bool { - name, labelExists := secret.Labels[packageNameLabel] - return labelExists && strings.Contains(name, expectedName) -} - -// hasLabel returns true if the given object has the provided label -func hasLabel(o client.Object, label string) bool { - _, labelExists := o.GetLabels()[label] - - return labelExists -} - -// matchesLabelValue returns true if the value for the given labelKey matches the labelValue we provide -func matchesLabelValue(secret *corev1.Secret, labelKey, labelValue string) bool { - if !hasLabel(secret, labelKey) { - return false - } - return secret.Labels[labelKey] == labelValue -} - -// getClusterNameFromSecret gets the cluster name from data in a secret and returns the cluster name -func getClusterNameFromSecret(secret *corev1.Secret) (string, error) { - for _, ownerRef := range secret.OwnerReferences { - if ownerRef.Kind == reflect.TypeOf(clusterapiv1beta1.Cluster{}).Name() { - return ownerRef.Name, nil - } - } - - if secret.GetLabels() != nil { - clusterName := secret.GetLabels()[tkgClusterNameLabel] - if clusterName != "" { - return clusterName, nil - } - } - return "", fmt.Errorf("could not get cluster name from secret") -} - -// isManagementCluster returns true if the cluster has the "cluster-role.tkg.tanzu.vmware.com/management" label -func isManagementCluster(cluster *clusterapiv1beta1.Cluster) bool { - _, labelExists := cluster.GetLabels()[tkgManagementLabel] - return labelExists -} - -// getInfraProvider get infrastructure kind from cluster spec -func getInfraProvider(cluster *clusterapiv1beta1.Cluster) (string, error) { - var infraProvider string - - infrastructureRef := cluster.Spec.InfrastructureRef - if infrastructureRef == nil { - return "", fmt.Errorf("cluster.Spec.InfrastructureRef is not set for cluster '%s", cluster.Name) - } - - switch infrastructureRef.Kind { - case InfrastructureRefVSphere: - infraProvider = InfrastructureProviderVSphere - case InfrastructureRefAWS: - infraProvider = InfrastructureProviderAWS - case InfrastructureRefAzure: - infraProvider = InfrastructureProviderAzure - case infrastructureRefDocker: - infraProvider = InfrastructureProviderDocker - default: - return "", fmt.Errorf("unknown cluster.Spec.InfrastructureRef.Kind is set for cluster '%s", cluster.Name) - } - - return infraProvider, nil -} - -// listSecretsContainingPackageName returns true if the value of the "tkg.tanzu.vmware.com/package-name" label includes the given packageName -func listSecretsContainingPackageName(ctx context.Context, c client.Client, packageName string) (*corev1.SecretList, error) { - packageSecrets := &corev1.SecretList{} - selector := metav1.LabelSelector{ - MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: packageNameLabel, Operator: metav1.LabelSelectorOpExists, Values: nil}, - }, - } - - s, err := metav1.LabelSelectorAsSelector(&selector) - if err != nil { - return nil, err - } - if err := c.List(ctx, packageSecrets, client.MatchingLabelsSelector{Selector: s}); err != nil { - return nil, err - } - secrets := &corev1.SecretList{} - // Unfortunately I could not find a LabelSelector that would do value "contains" for us, manually doing this for now - for i := range packageSecrets.Items { - secret := &packageSecrets.Items[i] - if secretIsType(secret, clusterBootstrapManagedSecret) && containsPackageName(secret, packageName) { - secrets.Items = append(secrets.Items, *secret) - } - } - - return secrets, nil -} - -// listClustersContainingLabel returns true if the cluster has the given label -func listClustersContainingLabel(ctx context.Context, c client.Client, label string) (*clusterapiv1beta1.ClusterList, error) { - clusters := &clusterapiv1beta1.ClusterList{} - selector := metav1.LabelSelector{ - MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: label, Operator: metav1.LabelSelectorOpExists, Values: nil}, - }, - } - - s, err := metav1.LabelSelectorAsSelector(&selector) - if err != nil { - return nil, err - } - - if err := c.List(ctx, clusters, client.MatchingLabelsSelector{Selector: s}); err != nil { - return nil, err - } - - return clusters, nil -} - -// getPinnipedInfoConfigMap returns the "pinniped-info" configmap in the "kube-public" namespace, sets data to nil if configmap not found -func getPinnipedInfoConfigMap(ctx context.Context, c client.Client, log logr.Logger) (*corev1.ConfigMap, error) { - pinnipedInfoCM := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: kubePublicNamespace, - Name: pinnipedInfoConfigMapName, - }, - } - - if err := c.Get(ctx, client.ObjectKeyFromObject(pinnipedInfoCM), pinnipedInfoCM); err != nil { - if !k8serror.IsNotFound(err) { - return nil, err - } - - log.V(1).Info("pinniped-info configmap not found, setting Data to nil") - pinnipedInfoCM.Data = nil - } - - return pinnipedInfoCM, nil -} - -// getClusterFromSecret returns the cluster associated with a given secret -func getClusterFromSecret(ctx context.Context, c client.Client, secret *corev1.Secret) (*clusterapiv1beta1.Cluster, error) { - secretNamespace := secret.Namespace - clusterName, err := getClusterNameFromSecret(secret) - if err != nil { - return nil, err - } - - cluster := &clusterapiv1beta1.Cluster{} - if err := c.Get(ctx, types.NamespacedName{Namespace: secretNamespace, Name: clusterName}, cluster); err != nil { - return nil, err - } - - return cluster, nil -} - -// getMutateFn returns a function that updates the "values.yaml" section of the given secret -func getMutateFn(secret *corev1.Secret, pinnipedInfoCM *corev1.ConfigMap, cluster *clusterapiv1beta1.Cluster, log logr.Logger, isV1 bool) func() error { - return func() error { - supervisorAddress := "" - supervisorCABundle := "" - identityManagementType := none - - if pinnipedInfoCM.Data != nil { - supervisorAddress = pinnipedInfoCM.Data[issuerKey] - supervisorCABundle = pinnipedInfoCM.Data[issuerCABundleKey] - identityManagementType = oidc - log.V(1).Info("retrieved data from pinniped-info configmap", - "supervisorAddress", supervisorAddress, - "supervisorCABundle", supervisorCABundle) - } - - if secret.Data == nil { - secret.Data = map[string][]byte{} - } - - pinnipedDataValues := &pinnipedDataValues{} - existingDataValues, labelExists := secret.Data[tkgDataValueFieldName] - if labelExists { - if err := yaml.Unmarshal(existingDataValues, pinnipedDataValues); err != nil { - log.Error(err, "unable to unmarshal existing data values from secret") - } - } - - pinnipedDataValues.IdentityManagementType = identityManagementType - infraProvider, err := getInfraProvider(cluster) - if err != nil { - if pinnipedDataValues.Infrastructure != "" { - infraProvider = pinnipedDataValues.Infrastructure - } else { - log.Error(err, "unable to get infrastructure_provider, setting to vSphere") - infraProvider = InfrastructureProviderVSphere - } - } - pinnipedDataValues.Infrastructure = infraProvider - pinnipedDataValues.ClusterRole = "workload" - pinnipedDataValues.Pinniped.SupervisorEndpoint = supervisorAddress - pinnipedDataValues.Pinniped.SupervisorCABundle = supervisorCABundle - - if isV1 { - // - pinnipedDataValues.Pinniped.Concierge.Audience = cluster.Name - } else { - // - - pinnipedDataValues.Pinniped.Concierge.Audience = fmt.Sprintf("%s-%s", cluster.Name, string(cluster.UID)) - } - - if !isV1 && identityManagementType == none { - // we actually have to set this to empty vs. not adding the vars above so that it overwrites - // what is already there - pinnipedDataValues.Pinniped = pinniped{} - } - - dataValueYamlBytes, err := yaml.Marshal(pinnipedDataValues) - if err != nil { - log.Error(err, "error marshaling Pinniped Secret values to yaml") - return err - } - - if isV1 { - dataValueYamlBytes = append([]byte(valuesYAMLPrefix), dataValueYamlBytes...) - if secret.ObjectMeta.Annotations == nil { - secret.ObjectMeta.Annotations = make(map[string]string) - } - secret.ObjectMeta.Annotations[tkgAddonTypeAnnotation] = pinnipedAddonTypeAnnotation - - if secret.ObjectMeta.Labels == nil { - secret.ObjectMeta.Labels = make(map[string]string) - } - secret.ObjectMeta.Labels[tkgAddonLabel] = pinnipedAddonLabel - secret.ObjectMeta.Labels[tkgClusterNameLabel] = cluster.Name - secret.Type = tkgAddonType - } - - secret.Data[tkgDataValueFieldName] = dataValueYamlBytes - return nil - } -} - -func secretNameFromClusterName(clusterName types.NamespacedName) types.NamespacedName { - return types.NamespacedName{ - Namespace: clusterName.Namespace, - Name: fmt.Sprintf("%s-pinniped-addon", clusterName.Name), - } -} - -type pinnipedDataValues struct { - IdentityManagementType string `yaml:"identity_management_type,omitempty"` - Infrastructure string `yaml:"infrastructure_provider,omitempty"` - ClusterRole string `yaml:"tkg_cluster_role,omitempty"` - Pinniped pinniped `yaml:"pinniped,omitempty"` -} - -type concierge struct { - Audience string `yaml:"audience,omitempty"` -} - -type pinniped struct { - SupervisorEndpoint string `yaml:"supervisor_svc_endpoint"` - SupervisorCABundle string `yaml:"supervisor_ca_bundle_data"` - Concierge concierge `yaml:"concierge"` -} diff --git a/pinniped-components/tanzu-auth-controller-manager/controllers/utils_test.go b/pinniped-components/tanzu-auth-controller-manager/controllers/utils_test.go deleted file mode 100644 index de3f35b7f8..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/controllers/utils_test.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - "fmt" - "time" - - . "github.com/onsi/gomega" - "gopkg.in/yaml.v3" - corev1 "k8s.io/api/core/v1" - k8serrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -func createObject(ctx context.Context, o client.Object) { - oCopy := o.DeepCopyObject().(client.Object) - err := k8sClient.Create(ctx, oCopy) - Expect(err).NotTo(HaveOccurred()) - - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(o), oCopy) - g.Expect(err).NotTo(HaveOccurred()) - }).Should(Succeed()) -} - -func deleteObject(ctx context.Context, o client.Object) { - err := k8sClient.Delete(ctx, o) - - // Accept cases where the object has already been deleted. - if err != nil { - Expect(k8serrors.IsNotFound(err)).To(BeTrue(), "got error: %#v", err) - } - - oCopy := o.DeepCopyObject().(client.Object) - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(o), oCopy) - g.Expect(k8serrors.IsNotFound(err)).To(BeTrue()) - }, time.Second*60).Should(Succeed()) -} - -func updateObject(ctx context.Context, o client.Object) { - oCopy := o.DeepCopyObject().(client.Object) - err := k8sClient.Update(ctx, oCopy) - Expect(err).NotTo(HaveOccurred()) - - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(o), oCopy) - g.Expect(err).NotTo(HaveOccurred()) - }).Should(Succeed()) -} - -func verifyNoSecretFunc(ctx context.Context, cluster *clusterapiv1beta1.Cluster, isV1 bool) func(Gomega) { - return func(g Gomega) { - secret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: cluster.Namespace, - Name: fmt.Sprintf("%s-pinniped.tanzu.vmware.com-package", cluster.Name), - }, - } - - if isV1 { - secret.Name = fmt.Sprintf("%s-pinniped-addon", cluster.Name) - } - - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(secret), secret) - g.Expect(k8serrors.IsNotFound(err)).To(BeTrue()) - } -} - -func verifySecretFunc(ctx context.Context, cluster *clusterapiv1beta1.Cluster, configMap *corev1.ConfigMap, isV1 bool) func(Gomega) { - return func(g Gomega) { - clusterCopy := cluster.DeepCopy() - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(clusterCopy), clusterCopy) - g.Expect(err).NotTo(HaveOccurred()) - - secret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: clusterCopy.Namespace, - Name: fmt.Sprintf("%s-pinniped.tanzu.vmware.com-package", clusterCopy.Name), - }, - } - - wantSecretLabel := map[string]string{ - packageNameLabel: testPinnipedLabel, - tkgClusterNameLabel: clusterCopy.Name, - } - - wantValuesYAML := map[string]interface{}{ - identityManagementTypeKey: none, - "infrastructure_provider": "vsphere", - "tkg_cluster_role": "workload", - } - - if configMap != nil { - wantValuesYAML[identityManagementTypeKey] = oidc - - var audience string - if isV1 { - audience = clusterCopy.Name - } else { - audience = fmt.Sprintf("%s-%s", clusterCopy.Name, string(clusterCopy.UID)) - } - - m := make(map[string]interface{}) - m[supervisorEndpointKey] = configMap.Data[issuerKey] - m[supervisorCABundleKey] = configMap.Data[issuerCABundleKey] - m["concierge"] = map[string]interface{}{ - "audience": audience, - } - wantValuesYAML["pinniped"] = m - } - - if isV1 { - delete(wantSecretLabel, packageNameLabel) - wantSecretLabel[tkgAddonLabel] = pinnipedAddonLabel - secret.Name = fmt.Sprintf("%s-pinniped-addon", clusterCopy.Name) - } - - err = k8sClient.Get(ctx, client.ObjectKeyFromObject(secret), secret) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(secret.Labels).To(Equal(wantSecretLabel)) - var gotValuesYAML map[string]interface{} - g.Expect(yaml.Unmarshal(secret.Data[tkgDataValueFieldName], &gotValuesYAML)).Should(Succeed()) - g.Expect(gotValuesYAML).Should(Equal(wantValuesYAML)) - - if isV1 { - g.Expect(string(secret.Data[tkgDataValueFieldName])).To(HavePrefix(valuesYAMLPrefix)) - g.Expect(secret.Type).To(Equal(corev1.SecretType(tkgAddonType))) - g.Expect(secret.Annotations).To(Equal(map[string]string{tkgAddonTypeAnnotation: pinnipedAddonTypeAnnotation})) - } else { - g.Expect(secret.Type).To(Equal(corev1.SecretType(clusterBootstrapManagedSecret))) - } - } -} diff --git a/pinniped-components/tanzu-auth-controller-manager/controllers/v1_cascade_controller.go b/pinniped-components/tanzu-auth-controller-manager/controllers/v1_cascade_controller.go deleted file mode 100644 index 0d0736832e..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/controllers/v1_cascade_controller.go +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package controllers contains the tanzu-auth-controller-manager code. -package controllers - -import ( - "context" - - "sigs.k8s.io/controller-runtime/pkg/builder" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - k8serror "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" -) - -type PinnipedV1Controller struct { - client client.Client - Log logr.Logger -} - -func NewV1Controller(c client.Client) *PinnipedV1Controller { - return &PinnipedV1Controller{ - client: c, - Log: ctrl.Log.WithName(CascadeControllerV1alpha1Name), - } -} - -func (c *PinnipedV1Controller) SetupWithManager(manager ctrl.Manager) error { - err := ctrl. - NewControllerManagedBy(manager). - For(&clusterapiv1beta1.Cluster{}, - withLabel(tkrLabel)). // any cluster with label "tanzuKubernetesRelease" - Watches( - &source.Kind{Type: &corev1.ConfigMap{}}, - handler.EnqueueRequestsFromMapFunc(configMapHandler), // enqueues an empty ctrl.Request to indicate that the configmap changed - withNamespacedName(types.NamespacedName{Namespace: "kube-public", Name: "pinniped-info"}), - ). - Watches( - &source.Kind{Type: &corev1.Secret{}}, - handler.EnqueueRequestsFromMapFunc(c.addonSecretToCluster), // enqueues value of "tkg.tanzu.vmware.com/cluster-name" label - builder.WithPredicates( - c.withAddonLabel("pinniped"), // type="tkg.tanzu.vmware.com/addon" and "tkg.tanzu.vmware.com/addon-name" label has value equal to "pinniped" - ), - ). - Complete(c) - if err != nil { - c.Log.Error(err, "error creating controller") - return err - } - return nil -} - -// +kubebuilder:rbac:groups="",resources=secrets,verbs=list;watch;get;patch;create;delete -// +kubebuilder:rbac:groups="",resources=configmaps,verbs=list;watch;get -// +kubebuilder:rbac:groups="cluster.x-k8s.io",resources=clusters,verbs=list;watch;get - -func (c *PinnipedV1Controller) Reconcile(ctx context.Context, req ctrl.Request) (reconcile.Result, error) { - log := c.Log.WithName("reconcile").WithValues("request object", req) - log.Info("starting reconciliation") - pinnipedInfoCM, err := getPinnipedInfoConfigMap(ctx, c.client, log) - if err != nil { - log.Error(err, "error getting pinniped-info configmap") - return reconcile.Result{}, err - } - - if (req == ctrl.Request{}) { - // The pinniped-info configmap has changed. Find all the Secrets for all the Clusters and update their contents. - log.V(1).Info("configmap changed, checking all clusters") - clusters, err := listClustersContainingLabel(ctx, c.client, tkrLabel) // all clusters with label "tanzuKubernetesRelease" - if err != nil { - log.Error(err, "error retrieving clusters", "cluster label", tkrLabel) - return reconcile.Result{}, err - } - - for i := range clusters.Items { - cluster := &clusters.Items[i] - log = log.WithValues(clusterNamespaceLogKey, cluster.Namespace, clusterNameLogKey, cluster.Name) - if isManagementCluster(cluster) { - log.V(1).Info("skipping reconciliation of management cluster") - continue - } - - if err := c.reconcileAddonSecret(ctx, cluster, pinnipedInfoCM, log); err != nil { - log.Error(err, "error reconciling addon secret") - return reconcile.Result{}, err - } - } - return reconcile.Result{}, nil - } - - // Either a Cluster has changed, or a Secret with a label pointing to a Cluster has changed. - // Either way, get the Cluster name and namespace from req. - cluster := clusterapiv1beta1.Cluster{} - if err := c.client.Get(ctx, req.NamespacedName, &cluster); err != nil { - if k8serror.IsNotFound(err) { - // The Cluster must have been deleted. - secretNamespacedName := secretNameFromClusterName(req.NamespacedName) - log = log.WithValues( - secretNamespaceLogKey, secretNamespacedName.Namespace, - secretNameLogKey, secretNamespacedName.Name) - if err := c.reconcileDelete(ctx, secretNamespacedName, log); err != nil { - return reconcile.Result{}, err - } - return reconcile.Result{}, nil - } - log.Error(err, "error getting cluster") - return reconcile.Result{}, err - } - - log = log.WithValues(clusterNamespaceLogKey, cluster.Namespace, clusterNameLogKey, cluster.Name) - - if isManagementCluster(&cluster) { - log.V(1).Info("skipping reconciliation of management cluster") - return reconcile.Result{}, nil - } - - if err := c.reconcileAddonSecret(ctx, &cluster, pinnipedInfoCM, log); err != nil { - log.Error(err, "error reconciling addon secret") - return reconcile.Result{}, err - } - return reconcile.Result{}, nil -} - -func (c *PinnipedV1Controller) reconcileAddonSecret(ctx context.Context, cluster *clusterapiv1beta1.Cluster, pinnipedInfoCM *corev1.ConfigMap, log logr.Logger) error { - secretNamespacedName := secretNameFromClusterName(client.ObjectKeyFromObject(cluster)) - log = log.WithValues(secretNamespaceLogKey, secretNamespacedName.Namespace, secretNameLogKey, secretNamespacedName.Name) - // For v1alpha1 we will delete secret if CM is not found - // also check if cluster is scheduled for deletion, if so, delete addon secret on mgmt cluster - if pinnipedInfoCM.Data == nil || !cluster.GetDeletionTimestamp().IsZero() { - log.V(1).Info("deleting secret") - if err := c.reconcileDelete(ctx, secretNameFromClusterName(client.ObjectKeyFromObject(cluster)), log); err != nil { - return err - } - return nil - } - secret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: secretNamespacedName.Namespace, - Name: secretNamespacedName.Name, - }, - } - secret.Type = tkgAddonType - - log.V(1).Info("creating or patching addon secret") - result, err := controllerutil.CreateOrPatch(ctx, c.client, secret, getMutateFn(secret, pinnipedInfoCM, cluster, log, true)) - if err != nil && !k8serror.IsAlreadyExists(err) { - log.Error(err, "error creating or patching data values") - return err - } - - log.Info("finished reconciling secret", "result", result) - - return nil -} - -func (c *PinnipedV1Controller) reconcileDelete(ctx context.Context, secretNamespacedName types.NamespacedName, log logr.Logger) error { - secret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: secretNamespacedName.Namespace, - Name: secretNamespacedName.Name, - }, - } - - if err := c.client.Delete(ctx, secret); err != nil { - if k8serror.IsNotFound(err) { - log.V(1).Info("secret not found") - return nil - } - log.Error(err, "error deleting addon secret") - return err - } - - // made this V1 since the logs were pretty excessive... and I couldn't seem to avoid it even w/the notFound clause above - log.V(1).Info("finished reconciling secret", "result", "deleted") - return nil -} diff --git a/pinniped-components/tanzu-auth-controller-manager/controllers/v1_cascade_controller_test.go b/pinniped-components/tanzu-auth-controller-manager/controllers/v1_cascade_controller_test.go deleted file mode 100644 index 035c5159c4..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/controllers/v1_cascade_controller_test.go +++ /dev/null @@ -1,513 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "fmt" - - "gopkg.in/yaml.v3" - - "sigs.k8s.io/controller-runtime/pkg/client" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" -) - -const testTKRLabel = "v1.22.3" - -var _ = Describe("Controller", func() { - - var ( - cluster *clusterapiv1beta1.Cluster - configMap *corev1.ConfigMap - secret *corev1.Secret - ) - - BeforeEach(func() { - cluster = &clusterapiv1beta1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: pinnipedNamespace, - Name: "some-name", - Labels: map[string]string{ - tkrLabel: testTKRLabel, - }, - }, - Spec: clusterapiv1beta1.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - Kind: InfrastructureRefVSphere, - Name: "some-name", - }, - }, - } - - configMap = &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "kube-public", - Name: "pinniped-info", - }, - Data: map[string]string{ - "issuer": "tuna.io", - "issuer_ca_bundle_data": "ball-of-fluff", - }, - } - - secret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: cluster.Namespace, - Name: fmt.Sprintf("%s-pinniped-addon", cluster.Name), - }, - } - }) - - AfterEach(func() { - deleteObject(ctx, secret) - }) - - Context("Cluster", func() { - BeforeEach(func() { - createObject(ctx, cluster) - }) - - AfterEach(func() { - deleteObject(ctx, cluster) - }) - - Context("cluster is created", func() { - When("there is no pinniped-info configmap", func() { - It("does not create a secret", func() { - Eventually(verifyNoSecretFunc(ctx, cluster, true)).Should(Succeed()) - }) - }) - - When("there is a pinniped-info configmap", func() { - BeforeEach(func() { - createObject(ctx, configMap) - }) - - AfterEach(func() { - deleteObject(ctx, configMap) - }) - - It("creates a secret with information from configmap", func() { - Eventually(verifySecretFunc(ctx, cluster, configMap, true)).Should(Succeed()) - }) - }) - }) - - Context("cluster is updated", func() { - BeforeEach(func() { - clusterCopy := cluster.DeepCopy() - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(clusterCopy), clusterCopy) - g.Expect(err).NotTo(HaveOccurred()) - }).Should(Succeed()) - annotations := clusterCopy.ObjectMeta.Annotations - if annotations == nil { - annotations = make(map[string]string) - } - annotations["sweetest-cat"] = "lionel" - clusterCopy.ObjectMeta.Annotations = annotations - updateObject(ctx, clusterCopy) - }) - - When("there is no pinniped-info configmap", func() { - It("does not create a secret", func() { - Eventually(verifyNoSecretFunc(ctx, cluster, true)).Should(Succeed()) - }) - }) - - When("there is a pinniped-info configmap", func() { - BeforeEach(func() { - createObject(ctx, configMap) - }) - - AfterEach(func() { - deleteObject(ctx, configMap) - }) - - It("updates the secret with information from configmap", func() { - Eventually(verifySecretFunc(ctx, cluster, configMap, true)).Should(Succeed()) - }) - }) - }) - - Context("cluster is deleted", func() { - When("there is no pinniped-info configmap", func() { - BeforeEach(func() { - deleteObject(ctx, cluster) - }) - - It("does not create a secret", func() { - Eventually(verifyNoSecretFunc(ctx, cluster, true)).Should(Succeed()) - }) - }) - - When("there is a pinniped-info configmap", func() { - BeforeEach(func() { - createObject(ctx, configMap) - Eventually(verifySecretFunc(ctx, cluster, configMap, true)).Should(Succeed()) - deleteObject(ctx, cluster) - }) - - AfterEach(func() { - deleteObject(ctx, configMap) - }) - - It("deletes the secret", func() { - Eventually(verifyNoSecretFunc(ctx, cluster, true)).Should(Succeed()) - }) - }) - }) - }) - - Context("Addon Secret", func() { - BeforeEach(func() { - createObject(ctx, configMap) - createObject(ctx, cluster) - }) - - AfterEach(func() { - deleteObject(ctx, configMap) - deleteObject(ctx, cluster) - }) - - When("the secret is deleted", func() { - BeforeEach(func() { - // Make sure the secret exists so that we know we are deleting something... - Eventually(func(g Gomega) { - g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(secret), secret.DeepCopy())).Should(Succeed()) - }).Should(Succeed()) - // ...then delete the secret... - Expect(k8sClient.Delete(ctx, secret)).To(Succeed()) - // ...then don't wait for the secret to be gone because that would be a race with the - // controller. - }) - - It("recreates the secret with values from the configmap", func() { - Eventually(func(g Gomega) { - Eventually(verifySecretFunc(ctx, cluster, configMap, true)).Should(Succeed()) - }).Should(Succeed()) - }) - }) - - When("essential secret data values are changed", func() { - var secretCopy *corev1.Secret - BeforeEach(func() { - secretCopy = secret.DeepCopy() - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(secretCopy), secretCopy) - g.Expect(err).NotTo(HaveOccurred()) - }).Should(Succeed()) - updatedSecretDataValues := &pinnipedDataValues{} - updatedSecretDataValues.Pinniped.SupervisorEndpoint = "marshmallow.fluff" - updatedSecretDataValues.Pinniped.SupervisorCABundle = "hairball" - updatedSecretDataValues.Pinniped.Concierge.Audience = "animal-kingdom" - updatedSecretDataValues.Infrastructure = "cat-tree" - updatedSecretDataValues.ClusterRole = "lounge" - updatedSecretDataValues.IdentityManagementType = "meow" - dataValueYamlBytes, _ := yaml.Marshal(updatedSecretDataValues) - secretCopy.Data[tkgDataValueFieldName] = dataValueYamlBytes - updateObject(ctx, secretCopy) - }) - - It("resets the secret with the proper data values", func() { - Eventually(verifySecretFunc(ctx, cluster, configMap, true)).Should(Succeed()) - }) - }) - - When("the secret contains overlays", func() { - var expectedSecret *corev1.Secret - BeforeEach(func() { - expectedSecret = secret.DeepCopy() - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(expectedSecret), expectedSecret) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(expectedSecret.Data).NotTo(BeNil()) - }).Should(Succeed()) - expectedSecret.Data[tkgDataOverlayFieldName] = []byte(`#@ load("@ytt:overlay", "overlay") - #@overlay/match by=overlay.subset({"kind": "Service", "metadata": {"name": "pinniped-supervisor", "namespace": "pinniped-supervisor"}}) - --- - #@overlay/replace - spec: - type: LoadBalancer - selector: - app: pinniped-supervisor - ports: - - name: https - protocol: TCP - port: 443 - targetPort: 8443`) - updateObject(ctx, expectedSecret) - }) - - It("they are preserved", func() { - Consistently(func(g Gomega) { - actualSecret := secret.DeepCopy() - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(actualSecret), actualSecret) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(actualSecret.Data[tkgDataOverlayFieldName]).Should(Equal(expectedSecret.Data[tkgDataOverlayFieldName])) - Eventually(verifySecretFunc(ctx, cluster, configMap, true)).Should(Succeed()) - }).Should(Succeed()) - }) - }) - - When("the secret does not have the Pinniped addon label", func() { - var expectedSecret *corev1.Secret - - BeforeEach(func() { - expectedSecret = secret.DeepCopy() - expectedSecret.Name = "another-secret" - expectedSecret.Type = "tkg.tanzu.vmware.com/addon" - expectedSecret.Labels = map[string]string{ - tkgAddonLabel: "pumpkin", - tkgClusterNameLabel: cluster.Name, - } - expectedSecret.Data = map[string][]byte{ - "values.yaml": []byte("identity_management_type: moses"), - } - createObject(ctx, expectedSecret) - }) - - AfterEach(func() { - deleteObject(ctx, expectedSecret) - }) - - It("does not get updated", func() { - Eventually(func(g Gomega) { - actualSecret := expectedSecret.DeepCopy() - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(actualSecret), actualSecret) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(actualSecret.Labels).To(Equal(expectedSecret.Labels)) - g.Expect(actualSecret.Data).To(Equal(expectedSecret.Data)) - }).Should(Succeed()) - }) - }) - - When("the secret is not an addon type", func() { - var expectedSecret *corev1.Secret - - BeforeEach(func() { - expectedSecret = secret.DeepCopy() - expectedSecret.Type = "not-an-addon" - expectedSecret.Labels = map[string]string{ - tkgAddonLabel: pinnipedAddonLabel, - tkgClusterNameLabel: cluster.Name, - } - expectedSecret.Name = "newest-secret" - expectedSecret.Data = map[string][]byte{ - "values.yaml": []byte("identity_management_type: moses"), - } - createObject(ctx, expectedSecret) - }) - - AfterEach(func() { - deleteObject(ctx, expectedSecret) - }) - - It("does not get updated", func() { - Eventually(func(g Gomega) { - actualSecret := expectedSecret.DeepCopy() - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(actualSecret), actualSecret) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(actualSecret.Labels).To(Equal(expectedSecret.Labels)) - g.Expect(actualSecret.Type).To(Equal(expectedSecret.Type)) - g.Expect(actualSecret.Data).To(Equal(expectedSecret.Data)) - }).Should(Succeed()) - }) - }) - - When("the annotation is changed on the secret", func() { - var secretCopy *corev1.Secret - - BeforeEach(func() { - secretCopy = secret.DeepCopy() - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(secretCopy), secretCopy) - g.Expect(err).NotTo(HaveOccurred()) - }).Should(Succeed()) - secretCopy.Annotations = map[string]string{ - tkgAddonTypeAnnotation: "calico", - } - updateObject(ctx, secretCopy) - }) - - It("the annotation gets updated", func() { - Eventually(func(g Gomega) { - Eventually(verifySecretFunc(ctx, cluster, configMap, true)).Should(Succeed()) - }).Should(Succeed()) - }) - }) - - }) - - Context("pinniped-info configmap", func() { - - var clusters []*clusterapiv1beta1.Cluster - - BeforeEach(func() { - cluster2 := &clusterapiv1beta1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: pinnipedNamespace, - Name: "another-name", - Labels: map[string]string{ - tkrLabel: testTKRLabel, - }, - }, - Spec: clusterapiv1beta1.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - Kind: InfrastructureRefVSphere, - Name: "another-name", - }, - }, - } - - clusters = []*clusterapiv1beta1.Cluster{cluster, cluster2} - - for _, c := range clusters { - createObject(ctx, c) - } - }) - - AfterEach(func() { - deleteObject(ctx, configMap) - - for _, c := range clusters { - deleteObject(ctx, c) - } - }) - When("the configmap gets created", func() { - BeforeEach(func() { - createObject(ctx, configMap) - }) - - It("creates all the addons secrets", func() { - for _, c := range clusters { - Eventually(verifySecretFunc(ctx, c, configMap, true)).Should(Succeed()) - } - }) - }) - - When("the configmap gets updated", func() { - var configMapCopy *corev1.ConfigMap - BeforeEach(func() { - createObject(ctx, configMap) - configMapCopy = configMap.DeepCopy() - configMapCopy.Data[issuerKey] = "cats.dev" - configMapCopy.Data[issuerCABundleKey] = "cattree" - updateObject(ctx, configMapCopy) - }) - - It("updates all the addon secrets", func() { - for _, c := range clusters { - Eventually(verifySecretFunc(ctx, c, configMapCopy, true)).Should(Succeed()) - } - }) - }) - - When("the configmap gets deleted", func() { - BeforeEach(func() { - createObject(ctx, configMap) - }) - - It("deletes all the addon secrets", func() { - // delete it - deleteObject(ctx, configMap) - // then check if all of the secrets are deleted, also - for _, c := range clusters { - Eventually(verifyNoSecretFunc(ctx, c, true)).Should(Succeed()) - } - }) - }) - - When("the configmap does not have an issuer or caBundle", func() { - var configMapCopy *corev1.ConfigMap - BeforeEach(func() { - configMapCopy = configMap.DeepCopy() - configMapCopy.Data["fake_data"] = "something-fake" - delete(configMapCopy.Data, issuerKey) - delete(configMapCopy.Data, issuerCABundleKey) - createObject(ctx, configMapCopy) - }) - - AfterEach(func() { - deleteObject(ctx, configMapCopy) - }) - - It("passes through an empty string for the value", func() { - for _, c := range clusters { - Eventually(verifySecretFunc(ctx, c, configMapCopy, true)).Should(Succeed()) - } - }) - }) - - When("a configmap in a different namespace gets created", func() { - var configMapCopy *corev1.ConfigMap - BeforeEach(func() { - createObject(ctx, configMap) - configMapCopy = configMap.DeepCopy() - configMapCopy.Namespace = pinnipedNamespace - configMapCopy.Data["issuer"] = "moses.org" - configMapCopy.Data["issuer_ca_bundle_data"] = "laziest" - createObject(ctx, configMapCopy) - }) - - AfterEach(func() { - deleteObject(ctx, configMapCopy) - }) - - It("does not update addon secrets", func() { - for _, c := range clusters { - Eventually(verifySecretFunc(ctx, c, configMap, true)).Should(Succeed()) - } - }) - }) - When("a configmap with a different name gets created", func() { - var configMapCopy *corev1.ConfigMap - BeforeEach(func() { - createObject(ctx, configMap) - configMapCopy = configMap.DeepCopy() - configMapCopy.Name = "sweet-potato" - configMapCopy.Data = make(map[string]string) - configMapCopy.Data["issuer"] = "zelda.cat" - configMapCopy.Data["issuer_ca_bundle_data"] = "zeldz" - createObject(ctx, configMapCopy) - }) - - AfterEach(func() { - deleteObject(ctx, configMapCopy) - }) - - It("does not update addon secrets", func() { - for _, c := range clusters { - Eventually(verifySecretFunc(ctx, c, configMap, true)).Should(Succeed()) - } - }) - }) - - When("there are no clusters and a configmap gets created", func() { - BeforeEach(func() { - for _, c := range clusters { - deleteObject(ctx, c) - secret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: c.Namespace, - Name: fmt.Sprintf("%s-pinniped-addon", c.Name), - }, - } - deleteObject(ctx, secret) - } - createObject(ctx, configMap) - }) - - It("does not create addon secrets", func() { - for _, c := range clusters { - Eventually(verifyNoSecretFunc(ctx, c, true)).Should(Succeed()) - } - }) - }) - }) -}) diff --git a/pinniped-components/tanzu-auth-controller-manager/controllers/v3_cascade_controller.go b/pinniped-components/tanzu-auth-controller-manager/controllers/v3_cascade_controller.go deleted file mode 100644 index aec5f316a8..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/controllers/v3_cascade_controller.go +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "context" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - k8serror "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" -) - -type PinnipedV3Controller struct { - client client.Client - Log logr.Logger -} - -func NewV3Controller(c client.Client) *PinnipedV3Controller { - return &PinnipedV3Controller{ - client: c, - Log: ctrl.Log.WithName(CascadeControllerV1alpha3Name), - } -} - -func (c *PinnipedV3Controller) SetupWithManager(manager ctrl.Manager) error { - // Note that this controller is not directly watching Clusters, unlike the v1 controller. - // It watches Secrets with a certain type and label, and also watches the pinniped-info configmap. - // This controller is not responsible for creating or deleting the pinniped clusterbootstrap-secrets, - // which are created elsewhere during cluster creation for classy clusters. - // Instead, it is only responsible for updating the content of the pinniped clusterbootstrap-secrets based on the - // content of the pinniped-info configmap. When the pinniped-info configmap does not exist, the pinniped - // clusterbootstrap-secrets will be updated by this controller to contain some defaults. - err := ctrl. - NewControllerManagedBy(manager). - For( - &corev1.Secret{}, - c.withPackageName(pinnipedPackageLabel), // type="clusterbootstrap-secret" and "tkg.tanzu.vmware.com/package-name" label has value containing "pinniped" - ). - Watches( - &source.Kind{Type: &corev1.ConfigMap{}}, - handler.EnqueueRequestsFromMapFunc(configMapHandler), // enqueues an empty ctrl.Request to indicate that the configmap changed - withNamespacedName(types.NamespacedName{Namespace: "kube-public", Name: "pinniped-info"}), - ). - Complete(c) - if err != nil { - c.Log.Error(err, "error creating controller") - return err - } - return nil -} - -// +kubebuilder:rbac:groups="",resources=secrets,verbs=list;watch;get;patch;delete -// +kubebuilder:rbac:groups="",resources=configmaps,verbs=list;watch;get -// +kubebuilder:rbac:groups="cluster.x-k8s.io",resources=clusters,verbs=get - -func (c *PinnipedV3Controller) Reconcile(ctx context.Context, req ctrl.Request) (reconcile.Result, error) { - log := c.Log.WithName("reconcile").WithValues("request object", req) - log.Info("starting reconciliation") - pinnipedInfoCM, err := getPinnipedInfoConfigMap(ctx, c.client, log) - if err != nil { - log.Error(err, "error getting pinniped-info configmap") - return reconcile.Result{}, err - } - - if (req == ctrl.Request{}) { - // The pinniped-info configmap has changed. Find all the secrets and update their contents. - log.V(1).Info("empty request provided, checking all secrets") - - // List secrets with same type and label as those secrets being watched by this controller. - secrets, err := listSecretsContainingPackageName(ctx, c.client, pinnipedPackageLabel) - if err != nil { - log.Error(err, "error retrieving secrets", "package name", pinnipedPackageLabel) - return reconcile.Result{}, err - } - - for i := range secrets.Items { - if err := c.reconcileSecret(ctx, &secrets.Items[i], pinnipedInfoCM, log); err != nil { - log.Error(err, "error reconciling secret") - return reconcile.Result{}, err - } - } - - return reconcile.Result{}, nil - } - - // A particular secret has changed. Update its contents. - secret := corev1.Secret{} - if err := c.client.Get(ctx, req.NamespacedName, &secret); err != nil { - if k8serror.IsNotFound(err) { - // If secret not found, assume cluster was deleted, secret will be deleted via OwnerRef - log.V(1).Info("could not find secret, assuming it has been deleted") - return reconcile.Result{}, nil - } - log.Error(err, "error getting secret") - return reconcile.Result{}, err - } - - if err := c.reconcileSecret(ctx, &secret, pinnipedInfoCM, log); err != nil { - log.Error(err, "Error reconciling secret") - return reconcile.Result{}, err - } - - return reconcile.Result{}, nil -} - -func (c *PinnipedV3Controller) reconcileSecret(ctx context.Context, secret *corev1.Secret, pinnipedInfoCM *corev1.ConfigMap, log logr.Logger) error { - // check if secret is scheduled for deletion, if so, skip reconcile - log = log.WithValues(secretNamespaceLogKey, secret.Namespace, secretNameLogKey, secret.Name) - if !secret.GetDeletionTimestamp().IsZero() { - log.V(1).Info("secret is getting deleted, skipping reconcile") - return nil - } - - // Get the Cluster name from the Secret's ownerRefs or from its "tkg.tanzu.vmware.com/cluster-name" label, - // and use it to get the Cluster resource. While updating the Secret's contents below, the Cluster will be - // used to determine the infrastructure type. - cluster, err := getClusterFromSecret(ctx, c.client, secret) - if err != nil { - if k8serror.IsNotFound(err) { - // When cluster is deleted, secret will get deleted since it has an owner ref. - // Or it could be the case that the Secret was created just moments before its - // corresponding Cluster was created. - log.V(1).Info("cluster for secret was not found, skipping secret reconcile") - return nil - } - log.Error(err, "error getting cluster for secret, skipping reconciliation") - return nil - } - - // Check the Cluster's labels to determine if it is a management cluster. Do not update the pinniped - // clusterbootstrap-secret for the management cluster to avoid overwriting its contents. This controller - // is not responsible for configuring pinniped on management clusters. The user will provide the management - // cluster's pinniped configuration either during `tanzu management-cluster create`, or by following the - // documentation to update the pinniped addon secret for the management cluster on an existing management cluster. - // Either way, this controller should not interfere with the user's configuration for the management cluster. - if isManagementCluster(cluster) { - log.V(1).Info("skipping reconciliation of secret for management cluster") - return nil - } - - log = log.WithValues(clusterNamespaceLogKey, cluster.Namespace, clusterNameLogKey, cluster.Name) - - // check if cluster is scheduled for deletion, if so, skip reconciling secret - if !cluster.GetDeletionTimestamp().IsZero() { - log.V(1).Info("cluster is getting deleted, skipping secret reconcile") - return nil - } - - if err := c.reconcileDataValues(ctx, secret, cluster, pinnipedInfoCM, log); err != nil { - return err - } - - return nil -} - -func (c *PinnipedV3Controller) reconcileDataValues(ctx context.Context, secret *corev1.Secret, cluster *clusterapiv1beta1.Cluster, pinnipedInfoCM *corev1.ConfigMap, log logr.Logger) error { - pinnipedSecret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: secret.Namespace, - Name: secret.Name, - }, - } - - log.V(1).Info("creating or patching secret") - // TODO: Create or Patch here vs. just patch since it should already be there? - result, err := controllerutil.CreateOrPatch(ctx, c.client, pinnipedSecret, getMutateFn(pinnipedSecret, pinnipedInfoCM, cluster, log, false)) - if err != nil { - // TODO: Return err if not found here or nah? (maybe depends on contract w/CB controller) - log.Error(err, "error creating or patching data values") - return err - } - - log.Info("finished reconciling secret", "result", result) - - return nil -} diff --git a/pinniped-components/tanzu-auth-controller-manager/controllers/v3_cascade_controller_test.go b/pinniped-components/tanzu-auth-controller-manager/controllers/v3_cascade_controller_test.go deleted file mode 100644 index dac133a3d6..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/controllers/v3_cascade_controller_test.go +++ /dev/null @@ -1,507 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package controllers - -import ( - "fmt" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - k8serrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -const testPinnipedLabel = "pinniped.tanzu.vmware.com.1.2.3--vmware.1-tkg.1" - -var _ = Describe("Controller", func() { - var ( - cluster, managementCluster *clusterapiv1beta1.Cluster - pinnipedCBSecret, managementClusterPinnipedCBSecret *corev1.Secret - ) - - BeforeEach(func() { - cluster = &clusterapiv1beta1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: pinnipedNamespace, - Name: "some-name", - Labels: map[string]string{ - tkrLabelClassyClusters: "v1.23.3", - }, - }, - Spec: clusterapiv1beta1.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - Kind: InfrastructureRefVSphere, - Name: "some-name", - }, - }, - } - - managementCluster = &clusterapiv1beta1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: pinnipedNamespace, - Name: "some-management-cluster-name", - Labels: map[string]string{ - tkrLabelClassyClusters: "v1.23.3", - tkgManagementLabel: "", - }, - }, - } - - pinnipedCBSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: pinnipedNamespace, - Name: fmt.Sprintf("%s-pinniped.tanzu.vmware.com-package", cluster.Name), - Labels: map[string]string{ - packageNameLabel: testPinnipedLabel, - tkgClusterNameLabel: cluster.Name, - }, - }, - Type: clusterBootstrapManagedSecret, - } - - // This Secret is to configure Pinniped on the management cluster, so this controller should never - // edit this Secret, since it is not responsible for configuring Pinniped on management clusters. - managementClusterPinnipedCBSecret = &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: pinnipedNamespace, - Name: fmt.Sprintf("%s-pinniped.tanzu.vmware.com-package", managementCluster.Name), - Labels: map[string]string{ - packageNameLabel: testPinnipedLabel, - tkgClusterNameLabel: managementCluster.Name, - }, - }, - Data: map[string][]byte{tkgDataValueFieldName: []byte("should-not-be-edited")}, - Type: clusterBootstrapManagedSecret, - } - }) - - Context("pinniped-info configmap does not exist", func() { - BeforeEach(func() { - createObject(ctx, cluster) - createObject(ctx, pinnipedCBSecret) - }) - - AfterEach(func() { - deleteObject(ctx, cluster) - deleteObject(ctx, pinnipedCBSecret) - }) - - When("the pinniped cluster bootstrap secret gets created", func() { - It("updates the secret with the default data values", func() { - Eventually(verifySecretFunc(ctx, cluster, nil, false)).Should(Succeed()) - }) - }) - - When("the pinniped cluster bootstrap secret gets updated by some other actor", func() { - BeforeEach(func() { - secretCopy := pinnipedCBSecret.DeepCopy() - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(secretCopy), secretCopy) - g.Expect(err).NotTo(HaveOccurred()) - }).Should(Succeed()) - updatedSecretDataValues := map[string][]byte{ - tkgDataValueFieldName: []byte(fmt.Sprintf("%s: fire", identityManagementTypeKey)), - } - secretCopy.Data = updatedSecretDataValues - updateObject(ctx, secretCopy) - }) - - It("resets the secret's data values back to the defaults", func() { - Eventually(verifySecretFunc(ctx, cluster, nil, false)).Should(Succeed()) - }) - }) - - When("the pinniped cluster bootstrap secret contains overlays", func() { - var secretCopy *corev1.Secret - BeforeEach(func() { - secretCopy = pinnipedCBSecret.DeepCopy() - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(secretCopy), secretCopy) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(secretCopy.Data).NotTo(BeNil()) - }).Should(Succeed()) - secretCopy.Data[tkgDataOverlayFieldName] = []byte(`#@ load("@ytt:overlay", "overlay") - #@overlay/match by=overlay.subset({"kind": "Service", "metadata": {"name": "pinniped-supervisor", "namespace": "pinniped-supervisor"}}) - --- - #@overlay/replace - spec: - type: LoadBalancer - selector: - app: pinniped-supervisor - ports: - - name: https - protocol: TCP - port: 443 - targetPort: 8443`) - updateObject(ctx, secretCopy) - }) - - It("preserves the overlays", func() { - Consistently(func(g Gomega) { - actualSecret := pinnipedCBSecret.DeepCopy() - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(actualSecret), actualSecret) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(actualSecret.Data[tkgDataOverlayFieldName]).Should(Equal(secretCopy.Data[tkgDataOverlayFieldName])) - Eventually(verifySecretFunc(ctx, cluster, nil, false)).Should(Succeed()) - }).Should(Succeed()) - }) - }) - - When("another similar looking secret does not have the Pinniped package label", func() { - var secretCopy *corev1.Secret - var secretLabels map[string]string - var secretData map[string][]byte - - BeforeEach(func() { - secretCopy = pinnipedCBSecret.DeepCopy() - secretLabels = map[string]string{ - tkgAddonLabel: "pinniped", - tkgClusterNameLabel: cluster.Name, - } - secretData = map[string][]byte{ - tkgDataValueFieldName: []byte(fmt.Sprintf("%s: moses", identityManagementTypeKey)), - } - secretCopy.Name = "another-one" - secretCopy.Labels = secretLabels - secretCopy.Type = clusterBootstrapManagedSecret - secretCopy.Data = secretData - createObject(ctx, secretCopy) - }) - - AfterEach(func() { - deleteObject(ctx, secretCopy) - }) - - It("does not update that other similar secret", func() { - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(secretCopy), secretCopy) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(secretCopy.Labels).To(Equal(secretLabels)) - g.Expect(secretCopy.Data).To(Equal(secretData)) - }).Should(Succeed()) - }) - }) - - When("another similar looking secret is not a clusterbootstrap-secret type", func() { - var secretCopy *corev1.Secret - var secretLabels map[string]string - var secretData map[string][]byte - - BeforeEach(func() { - secretCopy = pinnipedCBSecret.DeepCopy() - secretCopy.Name = "newest-one" - secretLabels = map[string]string{ - packageNameLabel: "pinniped.fun.times", - tkgClusterNameLabel: cluster.Name, - } - secretData = map[string][]byte{ - tkgDataValueFieldName: []byte(fmt.Sprintf("%s: moses", identityManagementTypeKey)), - } - secretCopy.Labels = secretLabels - secretCopy.Type = "not-" + clusterBootstrapManagedSecret - secretCopy.Data = secretData - createObject(ctx, secretCopy) - }) - - AfterEach(func() { - deleteObject(ctx, secretCopy) - }) - - It("does not update that other similar secret", func() { - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(secretCopy), secretCopy) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(secretCopy.Labels).To(Equal(secretLabels)) - g.Expect(secretCopy.Data).To(Equal(secretData)) - }).Should(Succeed()) - }) - }) - }) - - Context("pinniped-info configmap exists", func() { - var ( - clusters []*clusterapiv1beta1.Cluster - configMap *corev1.ConfigMap - secrets []*corev1.Secret - ) - BeforeEach(func() { - configMap = &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "kube-public", - Name: "pinniped-info", - }, - Data: map[string]string{ - issuerKey: "tuna.io", - issuerCABundleKey: "ball-of-fluff", - }, - } - - cluster2 := &clusterapiv1beta1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: pinnipedNamespace, - Name: "another-name", - }, - Spec: clusterapiv1beta1.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - Kind: InfrastructureRefVSphere, - Name: "another-name", - }, - }, - } - - secret2 := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: pinnipedNamespace, - Name: fmt.Sprintf("%s-pinniped.tanzu.vmware.com-package", cluster2.Name), - Labels: map[string]string{ - packageNameLabel: testPinnipedLabel, - tkgClusterNameLabel: cluster2.Name, - }, - }, - Type: clusterBootstrapManagedSecret, - } - - clusters = []*clusterapiv1beta1.Cluster{cluster, cluster2} - secrets = []*corev1.Secret{pinnipedCBSecret, secret2} - - for _, c := range clusters { - createObject(ctx, c) - } - - for _, s := range secrets { - createObject(ctx, s) - } - }) - - AfterEach(func() { - deleteObject(ctx, configMap) - for _, c := range clusters { - deleteObject(ctx, c) - } - - for _, s := range secrets { - deleteObject(ctx, s) - } - }) - - Context("the pinniped-info configmap gets created", func() { - When("there are no clusters and no pinniped cluster bootstrap secrets", func() { - BeforeEach(func() { - for _, c := range clusters { - deleteObject(ctx, c) - } - for _, s := range secrets { - deleteObject(ctx, s) - } - createObject(ctx, configMap) - }) - - It("does not create any pinniped cluster bootstrap secrets", func() { - for _, c := range clusters { - Eventually(verifyNoSecretFunc(ctx, c, false)).Should(Succeed()) - } - }) - }) - - When("there are clusters and pinniped cluster bootstrap secrets", func() { - BeforeEach(func() { - createObject(ctx, configMap) - }) - - It("updates all the pinniped cluster bootstrap secrets using the values from the configmap", func() { - for _, c := range clusters { - Eventually(verifySecretFunc(ctx, c, configMap, false)).Should(Succeed()) - } - }) - }) - }) - - When("the pinniped-info configmap gets updated", func() { - var configMapCopy *corev1.ConfigMap - BeforeEach(func() { - createObject(ctx, configMap) - configMapCopy = configMap.DeepCopy() - configMapCopy.Data[issuerKey] = "cats.meow" - configMapCopy.Data[issuerCABundleKey] = "secret-blanket" - updateObject(ctx, configMapCopy) - }) - - It("updates all the pinniped cluster bootstrap secrets using the new values from the configmap", func() { - for _, c := range clusters { - Eventually(verifySecretFunc(ctx, c, configMapCopy, false)).Should(Succeed()) - } - }) - }) - - When("the pinniped-info configmap does not have an issuer or caBundle", func() { - var configMapCopy *corev1.ConfigMap - BeforeEach(func() { - configMapCopy = configMap.DeepCopy() - configMapCopy.Data["fakeData"] = "fake" - delete(configMapCopy.Data, issuerKey) - delete(configMapCopy.Data, issuerCABundleKey) - createObject(ctx, configMapCopy) - }) - - AfterEach(func() { - deleteObject(ctx, configMapCopy) - }) - - It("updates all the pinniped cluster bootstrap secrets using an empty string for the issuer and CA values", func() { - for _, c := range clusters { - Eventually(verifySecretFunc(ctx, c, configMapCopy, false)).Should(Succeed()) - } - }) - }) - - When("the pinniped-info configmap gets deleted", func() { - BeforeEach(func() { - createObject(ctx, configMap) - deleteObject(ctx, configMap) - }) - - It("updates all the pinniped cluster bootstrap secrets to set their contents back to the default values", func() { - for _, c := range clusters { - Eventually(verifySecretFunc(ctx, c, nil, false)).Should(Succeed()) - } - }) - }) - - When("a configmap in a different namespace (other than kube-public) gets created", func() { - var configMapCopy *corev1.ConfigMap - BeforeEach(func() { - createObject(ctx, configMap) - configMapCopy = configMap.DeepCopy() - configMapCopy.Namespace = pinnipedNamespace - configMapCopy.Data[issuerKey] = "lionel.cat" - configMapCopy.Data[issuerCABundleKey] = "catdog" - createObject(ctx, configMapCopy) - }) - - AfterEach(func() { - deleteObject(ctx, configMapCopy) - }) - - It("does not update the pinniped cluster bootstrap secrets", func() { - for _, c := range clusters { - Eventually(verifySecretFunc(ctx, c, configMap, false)).Should(Succeed()) - } - }) - }) - - When("a configmap with a different name (other than pinniped-info) gets created", func() { - var configMapCopy *corev1.ConfigMap - BeforeEach(func() { - createObject(ctx, configMap) - configMapCopy = configMap.DeepCopy() - configMapCopy.Name = "kitties" - configMapCopy.Data = make(map[string]string) - configMapCopy.Data[issuerKey] = "pumpkin.me" - configMapCopy.Data[issuerCABundleKey] = "punkiest" - createObject(ctx, configMapCopy) - }) - - AfterEach(func() { - deleteObject(ctx, configMapCopy) - }) - - It("does not update the pinniped cluster bootstrap secrets", func() { - for _, c := range clusters { - Eventually(verifySecretFunc(ctx, c, configMap, false)).Should(Succeed()) - } - }) - }) - - When("there are no clusters and a pinniped-info configmap gets created", func() { - BeforeEach(func() { - for _, c := range clusters { - deleteObject(ctx, c) - } - for _, s := range secrets { - deleteObject(ctx, s) - } - createObject(ctx, configMap) - }) - - It("does not create any pinniped cluster bootstrap secrets", func() { - for _, s := range secrets { - Eventually(func(g Gomega) { - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(s), s) - g.Expect(k8serrors.IsNotFound(err)).To(BeTrue()) - }).Should(Succeed()) - } - }) - }) - }) - - Context("management cluster exists", func() { - BeforeEach(func() { - createObject(ctx, cluster) - createObject(ctx, managementCluster) - createObject(ctx, pinnipedCBSecret) - createObject(ctx, managementClusterPinnipedCBSecret) - }) - - AfterEach(func() { - deleteObject(ctx, cluster) - deleteObject(ctx, managementCluster) - deleteObject(ctx, pinnipedCBSecret) - deleteObject(ctx, managementClusterPinnipedCBSecret) - }) - - When("the pinniped cluster bootstrap secret gets created", func() { - It("updates the non-management cluster secret with the default data values", func() { - Eventually(verifySecretFunc(ctx, cluster, nil, false)).Should(Succeed()) - }) - - It("does not change the management cluster bootstrap secret", func() { - Consistently(func(g Gomega) { - actualSecret := managementClusterPinnipedCBSecret.DeepCopy() - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(actualSecret), actualSecret) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(actualSecret.Data).Should(Equal(managementClusterPinnipedCBSecret.Data)) - }).Should(Succeed()) - }) - }) - - Context("the pinniped-info configmap also exists", func() { - var configMap *corev1.ConfigMap - BeforeEach(func() { - configMap = &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "kube-public", - Name: "pinniped-info", - }, - Data: map[string]string{ - issuerKey: "tuna.io", - issuerCABundleKey: "ball-of-fluff", - }, - } - createObject(ctx, configMap) - }) - - AfterEach(func() { - deleteObject(ctx, configMap) - }) - - When("the configmap gets created", func() { - It("updates the non-management cluster secret using the values from the configmap", func() { - Eventually(verifySecretFunc(ctx, cluster, configMap, false)).Should(Succeed()) - }) - - It("does not change the management cluster bootstrap secret", func() { - Consistently(func(g Gomega) { - actualSecret := managementClusterPinnipedCBSecret.DeepCopy() - err := k8sClient.Get(ctx, client.ObjectKeyFromObject(actualSecret), actualSecret) - g.Expect(err).NotTo(HaveOccurred()) - g.Expect(actualSecret.Data).Should(Equal(managementClusterPinnipedCBSecret.Data)) - }).Should(Succeed()) - }) - }) - }) - }) -}) diff --git a/pinniped-components/tanzu-auth-controller-manager/go.mod b/pinniped-components/tanzu-auth-controller-manager/go.mod deleted file mode 100644 index 3eb9592d37..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/go.mod +++ /dev/null @@ -1,80 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/pinniped-components/tanzu-auth-controller-manager - -go 1.18 - -require ( - github.com/go-logr/logr v1.2.2 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - golang.org/x/tools v0.6.0 - gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.24.2 - k8s.io/apimachinery v0.24.2 - k8s.io/client-go v0.24.2 - k8s.io/klog/v2 v2.60.1 - sigs.k8s.io/cluster-api v1.2.8 - sigs.k8s.io/controller-runtime v0.12.3 -) - -require ( - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // 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/nxadm/tail v1.4.8 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.8.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.7.0 // indirect - go.uber.org/zap v1.21.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/pinniped-components/tanzu-auth-controller-manager/go.sum b/pinniped-components/tanzu-auth-controller-manager/go.sum deleted file mode 100644 index 8356a37244..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/go.sum +++ /dev/null @@ -1,992 +0,0 @@ -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -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= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -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= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/pinniped-components/tanzu-auth-controller-manager/hack/check.sh b/pinniped-components/tanzu-auth-controller-manager/hack/check.sh deleted file mode 100755 index 6b1d579e84..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/hack/check.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -xeuo pipefail - -MY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -# Always run from tanzu-auth-controller-manager directory for reproducibility -cd "${MY_DIR}/.." - -# Make sure all the files are formatted -test -z "$(go fmt ./...)" || (echo "files were not properly formatted per 'go fmt'" && exit 1) - -# Make sure all the files pass 'go vet' -go vet ./... || error "'go vet' failed" - -# Make sure all the files pass t-f linting config -./hack/lint.sh - -# Make sure our tests pass. -./hack/test.sh - -# Make sure our default secret generation script works as expected -./hack/generate-package-secret.test.sh diff --git a/pinniped-components/tanzu-auth-controller-manager/hack/generate-package-secret.sh b/pinniped-components/tanzu-auth-controller-manager/hack/generate-package-secret.sh deleted file mode 100755 index 8af013023b..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/hack/generate-package-secret.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# This script is typically invoked by a make target in the top-level Makefile. -# For TKGm, that make target is called by the bolt CLI code during the build process. - -set -euo pipefail - -MY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -# Always run from tanzu-auth-controller-manager directory for reproducibility -cd "${MY_DIR}/.." - -# Run YTT, passing the arguments to this script straight through to YTT to ease future extensions template -ytt -f ./hack/ytt/schema.yaml -f ./hack/ytt/default-package-secret.yaml -f ./hack/ytt/values.yaml $@ diff --git a/pinniped-components/tanzu-auth-controller-manager/hack/generate-package-secret.test.sh b/pinniped-components/tanzu-auth-controller-manager/hack/generate-package-secret.test.sh deleted file mode 100755 index f0371c69b6..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/hack/generate-package-secret.test.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -MY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -# Always run from tanzu-auth-controller-manager directory for reproducibility -cd "${MY_DIR}/.." - -# test with no args -TEST_RESULT_1=$(./hack/generate-package-secret.sh) -EXPECTED_1="apiVersion: v1 -kind: Secret -metadata: - name: default-pinniped-config-v0.0.0 -stringData: - values.yaml: | - infrastructure_provider: vsphere - identity_management_type: none - tkg_cluster_role: workload" - -if [[ "${TEST_RESULT_1}" != "${EXPECTED_1}" ]] -then - echo "default secret generation does not match expected output" - echo -e "result: \n${TEST_RESULT_1}" - echo -e "expected: \n${EXPECTED_1}" - exit 1 -fi - -# test with provided args -TEST_RESULT_2=$(./hack/generate-package-secret.sh -v tkr=foo -v infrastructure_provider=ALTERNATIVE_IAAS_TO_VSPHERE) -EXPECTED_2="apiVersion: v1 -kind: Secret -metadata: - name: default-pinniped-config-foo -stringData: - values.yaml: | - infrastructure_provider: ALTERNATIVE_IAAS_TO_VSPHERE - identity_management_type: none - tkg_cluster_role: workload" - -if [[ "${TEST_RESULT_2}" != "${EXPECTED_2}" ]] -then - echo "secret generation with parameters does not match expected output" - echo -e "result: \n${TEST_RESULT_2}" - echo -e "expected: \n${EXPECTED_2}" - exit 1 -fi diff --git a/pinniped-components/tanzu-auth-controller-manager/hack/generate.sh b/pinniped-components/tanzu-auth-controller-manager/hack/generate.sh deleted file mode 100755 index 79e72da117..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/hack/generate.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -MY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -TF_ROOT="${MY_DIR}/../../.." -PINNIPED_DIR="${MY_DIR}/../.." - -# Always run from tanzu-auth-controller-manager directory for reproducibility -PACKAGES_DIR="${TF_ROOT}/packages" -TANZU_AUTH_DIR="${PACKAGES_DIR}/tanzu-auth" -TANZU_AUTH_CONFIG_DIR="${TANZU_AUTH_DIR}/bundle/config" - -cd "${MY_DIR}/.." - -# Install controller-gen -make controller-gen -C "${PINNIPED_DIR}/hack/tools" - -# generate RBAC rules -"${PINNIPED_DIR}/hack/tools/bin/controller-gen" paths=./controllers +rbac:roleName=tanzu-auth-controller-manager output:rbac:dir="${TANZU_AUTH_CONFIG_DIR}" diff --git a/pinniped-components/tanzu-auth-controller-manager/hack/lint.sh b/pinniped-components/tanzu-auth-controller-manager/hack/lint.sh deleted file mode 100755 index d5c8cc0616..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/hack/lint.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -MY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -PINNIPED_DIR="${MY_DIR}/../.." - -# Always run from tanzu-auth-controller-manager directory for reproducibility -cd "${MY_DIR}/.." - -# Install golangci-lint -make golangci-lint -C "${PINNIPED_DIR}/hack/tools" - -# Run linter -"${PINNIPED_DIR}/hack/tools/bin/golangci-lint" run -v diff --git a/pinniped-components/tanzu-auth-controller-manager/hack/run.sh b/pinniped-components/tanzu-auth-controller-manager/hack/run.sh deleted file mode 100755 index 5ef00fee7f..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/hack/run.sh +++ /dev/null @@ -1,145 +0,0 @@ -#!/bin/bash - -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -euo pipefail - -YELLOW='\033[0;33m' -DEFAULT='\033[0m' - -MY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -TF_ROOT="${MY_DIR}/../../.." - -APP_NAME="tanzu-auth" -KAPP_CONTROLLER_NAME="${APP_NAME}-ctrl" - -# location for the package install -PACKAGES_DIR="${TF_ROOT}/packages" -TANZU_AUTH_DIR="${PACKAGES_DIR}/${APP_NAME}" -TANZU_AUTH_BUNDLE_DIR="${TANZU_AUTH_DIR}/bundle" -TANZU_AUTH_CONFIG_DIR="${TANZU_AUTH_BUNDLE_DIR}/config" - -TANZU_AUTH_PACKAGE_FILE="${TANZU_AUTH_DIR}/package.yaml" - -# location to deploy the image -REGISTRY_NAME="harbor-repo.vmware.com" -REGISTRY_PROJECT="tkgiam" -REGISTRY="${REGISTRY_NAME}/${REGISTRY_PROJECT}" - -# name of image to match that defined in /packages/tanzu-auth -CONTROLLER_MANAGER_NAME="${APP_NAME}-controller-manager" -CONTROLLER_MANAGER_PACKAGE_NAME="${CONTROLLER_MANAGER_NAME}-package" -CONTROLLER_NAMESPACE_NAME="${APP_NAME}" - -# Always run from tanzu-auth-controller-manager directory for reproducibility -cd "${MY_DIR}/.." - -TAG="dev" -# TAG="$(uuidgen)" # Uncomment to create random image every time - -# build the tanzu-auth-controller-manager image -# -------------------------------------------------------- -CONTROLLER_IMAGE="${REGISTRY}/$(whoami)/${CONTROLLER_MANAGER_NAME}:${TAG}" -echo -e "${YELLOW}building ${CONTROLLER_MANAGER_NAME} image and pushing to ${CONTROLLER_IMAGE}...${DEFAULT}" - -# push the tanzu-auth-controller-manager to the registry -docker build -t "${CONTROLLER_IMAGE}" . -docker push "${CONTROLLER_IMAGE}" - - -# build the tanzu-auth-controller-manager-package image -# -------------------------------------------------------- -PACKAGE_IMAGE="${REGISTRY}/$(whoami)/${CONTROLLER_MANAGER_PACKAGE_NAME}:${TAG}" -echo -e "${YELLOW}building ${CONTROLLER_MANAGER_PACKAGE_NAME} image and pushing to ${PACKAGE_IMAGE}...${DEFAULT}" - -# generate new RBAC into /packages/tanzu-auth/bundle/config -echo -e "${YELLOW}generating RBAC...${DEFAULT}" -./hack/generate.sh - -# the namespace must exist before the package can be deployed -echo -e "${YELLOW}creating namespace ${APP_NAME}...${DEFAULT}" -ytt --data-value "createNamespace=true" --data-value "namespace=${APP_NAME}" --file "${TANZU_AUTH_CONFIG_DIR}/namespace.yaml" | kubectl apply -f - - -echo -e "${YELLOW}rebuilding image lock file with ytt and kbld...${DEFAULT}" -mkdir -p "${TANZU_AUTH_BUNDLE_DIR}/.imgpkg" -ytt --data-value "controller.image=${CONTROLLER_IMAGE}" --file "${TANZU_AUTH_CONFIG_DIR}" \ - | kbld --file - --imgpkg-lock-output "${TANZU_AUTH_BUNDLE_DIR}/.imgpkg/images.yml" - -# push the tanzu-auth-controller-manager-package to the registry -echo -e "${YELLOW}pushing ${PACKAGE_IMAGE} to registry with imgpkg...${DEFAULT}" -imgpkg push --bundle "${PACKAGE_IMAGE}" --file "${TANZU_AUTH_BUNDLE_DIR}" - -# inject the package name into the package file & deploy -echo -e "${YELLOW}creating package ${TANZU_AUTH_PACKAGE_FILE} with image ${PACKAGE_IMAGE}...${DEFAULT}" -yq e ".spec.template.spec.fetch[0].imgpkgBundle.image = \"${PACKAGE_IMAGE}\"" "${TANZU_AUTH_PACKAGE_FILE}" \ - | kubectl apply -f - -kubectl apply -f "${TANZU_AUTH_DIR}/metadata.yaml" - - -# Deploy the package on the cluster -echo -e "${YELLOW}creating package install...${DEFAULT}" -PACKAGE_SA_NAME="${CONTROLLER_MANAGER_PACKAGE_NAME}-sa" -PACKAGE_NAMESPACE="tkg-system" -PACKAGE_INSTALL="$(cat </dev/null 2>&1 && pwd )" -PINNIPED_DIR="${MY_DIR}/../.." - -# Always run from tanzu-auth-controller-manager directory for reproducibility -cd "${MY_DIR}/.." - -# Install kubebuilder -make kubebuilder -C "${PINNIPED_DIR}/hack/tools" - -# Run tests -KUBEBUILDER_ASSETS="${PINNIPED_DIR}/hack/tools/bin/kubebuilder/bin" go test ./... -coverprofile coverage.txt -v 2 diff --git a/pinniped-components/tanzu-auth-controller-manager/hack/ytt/default-package-secret.yaml b/pinniped-components/tanzu-auth-controller-manager/hack/ytt/default-package-secret.yaml deleted file mode 100644 index b3959d84a0..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/hack/ytt/default-package-secret.yaml +++ /dev/null @@ -1,18 +0,0 @@ -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") -#@overlay/match-child-defaults missing_ok=True - -#@ def config(): ---- -infrastructure_provider: #@ data.values.infrastructure_provider -identity_management_type: none -tkg_cluster_role: workload -#@ end - ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "default-pinniped-config-" + data.values.tkr -stringData: - values.yaml: #@ yaml.encode(config()) diff --git a/pinniped-components/tanzu-auth-controller-manager/hack/ytt/schema.yaml b/pinniped-components/tanzu-auth-controller-manager/hack/ytt/schema.yaml deleted file mode 100644 index c4bee5c78e..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/hack/ytt/schema.yaml +++ /dev/null @@ -1,4 +0,0 @@ -#@data/values-schema ---- -tkr: "1.2.3---vmware.1-tkg.1" #! tkr values look something like this -infrastructure_provider: "vsphere" #! infra provider will be one of several options, such as vsphere, aws, azure diff --git a/pinniped-components/tanzu-auth-controller-manager/hack/ytt/values.yaml b/pinniped-components/tanzu-auth-controller-manager/hack/ytt/values.yaml deleted file mode 100644 index 05543f5774..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/hack/ytt/values.yaml +++ /dev/null @@ -1,5 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -tkr: v0.0.0 #! invalid tkr version, but defaulted here to make generating secret easier -infrastructure_provider: vsphere diff --git a/pinniped-components/tanzu-auth-controller-manager/main.go b/pinniped-components/tanzu-auth-controller-manager/main.go deleted file mode 100644 index ce036bcac2..0000000000 --- a/pinniped-components/tanzu-auth-controller-manager/main.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "flag" - "fmt" - "os" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/tanzu-auth-controller-manager/controllers" - - "k8s.io/klog/v2" - "k8s.io/klog/v2/klogr" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" -) - -var metricsAddr string - -func main() { - flag.StringVar(&metricsAddr, "metrics-bind-addr", ":8080", "The address the metric endpoint binds to.") - disableCascadeV1alpha1 := flag.Bool("disable-cascade-v1alpha1", false, "whether to disable the v1alpha1 control loop") - klog.InitFlags(nil) - flag.Parse() - ctrl.SetLogger(klogr.New()) - setupLog := ctrl.Log.WithName("tanzu auth controller manager").WithName("set up") - setupLog.Info("starting set up") - if err := reallyMain(setupLog, *disableCascadeV1alpha1); err != nil { - setupLog.Error(err, "error running controller") - os.Exit(1) - } -} - -func reallyMain(setupLog logr.Logger, disableCascadeV1alpha1 bool) error { - // Add types our controller uses to scheme. - scheme := runtime.NewScheme() - addToSchemes := []func(*runtime.Scheme) error{ - corev1.AddToScheme, - clusterapiv1beta1.AddToScheme, - } - for _, addToScheme := range addToSchemes { - if err := addToScheme(scheme); err != nil { - return fmt.Errorf("cannot add to scheme: %w", err) - } - } - - // Create manager to run our controller. - manager, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - MetricsBindAddress: metricsAddr, - Scheme: scheme, - }) - if err != nil { - return fmt.Errorf("unable to start manager: %w", err) - } - - // Register our controllers with the manager. - if !disableCascadeV1alpha1 { - if err := controllers.NewV1Controller(manager.GetClient()).SetupWithManager(manager); err != nil { - return fmt.Errorf("unable to create %s: %w", controllers.CascadeControllerV1alpha1Name, err) - } - } - if err := controllers.NewV3Controller(manager.GetClient()).SetupWithManager(manager); err != nil { - return fmt.Errorf("unable to create %s: %w", controllers.CascadeControllerV1alpha3Name, err) - } - - // Tell manager to start running our controller. - setupLog.V(1).Info("starting manager") - if err := manager.Start(ctrl.SetupSignalHandler()); err != nil { - return fmt.Errorf("unable to start manager: %w", err) - } - - return nil -} diff --git a/pkg/v1/auth/csp/doc.go b/pkg/v1/auth/csp/doc.go deleted file mode 100644 index 71832f52a5..0000000000 --- a/pkg/v1/auth/csp/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package csp provides VMware Cloud Services Platform token utilities. -package csp diff --git a/pkg/v1/auth/csp/grpc.go b/pkg/v1/auth/csp/grpc.go deleted file mode 100644 index 0f63872ee0..0000000000 --- a/pkg/v1/auth/csp/grpc.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package csp - -import ( - "context" - "fmt" - "time" - - "github.com/aunum/log" - - "golang.org/x/oauth2" - "google.golang.org/grpc" - grpc_oauth "google.golang.org/grpc/credentials/oauth" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -const ( - mdKeyAuthToken = "Authorization" - authTokenPrefix = "Bearer " - mdKeyAuthIDToken = "X-User-Id" - apiToken = "api-token" -) - -// WithCredentialDiscovery returns a grpc.CallOption that adds credentials into gRPC calls. -// The credentials are loaded from the auth context found on the machine. -func WithCredentialDiscovery() (grpc.CallOption, error) { - cfg, err := config.GetClientConfig() - if err != nil { - return nil, err - } - // Wrap our TokenSource to supply id tokens - return grpc.PerRPCCredentials(&TokenSource{ - TokenSource: &configSource{cfg}, - }), nil -} - -// WithStaticCreds will wrap a static access token into a grpc.CallOption -func WithStaticCreds(accessToken string) grpc.CallOption { - return grpc.PerRPCCredentials(&grpc_oauth.TokenSource{ - TokenSource: oauth2.StaticTokenSource( - &oauth2.Token{AccessToken: accessToken}, - ), - }) -} - -type configSource struct { - *configapi.ClientConfig -} - -// Token fetches the token. -func (c *configSource) Token() (*oauth2.Token, error) { - g, err := c.GetCurrentServer() - if err != nil { - return nil, err - } - if !g.IsGlobal() { - return nil, fmt.Errorf("trying to fetch token for non global server") - } - if !IsExpired(g.GlobalOpts.Auth.Expiration.Time) { - tok := &oauth2.Token{ - AccessToken: g.GlobalOpts.Auth.AccessToken, - Expiry: g.GlobalOpts.Auth.Expiration.Time, - } - return tok.WithExtra(map[string]interface{}{ - ExtraIDToken: g.GlobalOpts.Auth.IDToken, - }), nil - } - token, err := GetAccessTokenFromAPIToken(g.GlobalOpts.Auth.RefreshToken, ProdIssuer) - if err != nil { - return nil, err - } - - g.GlobalOpts.Auth.Type = apiToken - expiration := time.Now().Local().Add(time.Second * time.Duration(token.ExpiresIn)) - g.GlobalOpts.Auth.Expiration = metav1.NewTime(expiration) - g.GlobalOpts.Auth.RefreshToken = token.RefreshToken - g.GlobalOpts.Auth.AccessToken = token.AccessToken - g.GlobalOpts.Auth.IDToken = token.IDToken - - // Acquire tanzu config lock - config.AcquireTanzuConfigLock() - defer config.ReleaseTanzuConfigLock() - - // TODO: Add Read/Write locking mechanism before updating the configuration - // Currently we are only acquiring the lock while updating the configuration - if err := config.StoreClientConfig(c.ClientConfig); err != nil { - return nil, err - } - - tok := &oauth2.Token{ - AccessToken: token.AccessToken, - RefreshToken: token.RefreshToken, - Expiry: expiration, - } - return tok.WithExtra(map[string]interface{}{ - ExtraIDToken: token.IDToken, - }), nil -} - -// TokenSource supplies PerRPCCredentials from an oauth2.TokenSource using CSP as the IDP. -// It will supply access token through authorization header and id_token through user-Id header -type TokenSource struct { - oauth2.TokenSource -} - -// GetRequestMetadata gets the request metadata as a map from a TokenSource. -func (ts TokenSource) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - token, err := ts.Token() - if err != nil { - return nil, err - } - - headers := map[string]string{mdKeyAuthToken: authTokenPrefix + " " + token.AccessToken} - idTok := IDTokenFromTokenSource(token) - if idTok != "" { - headers[mdKeyAuthIDToken] = idTok - } - - return headers, nil -} - -// RequireTransportSecurity indicates whether the credentials requires transport security. -func (ts TokenSource) RequireTransportSecurity() bool { - return true -} - -// GetAuthOptsOrExit returns the grpc auth options. If accessToken is not empty it uses it, else it fetches the token -// from the current auth context. If it encounters and error, it exits. -func GetAuthOptsOrExit() grpc.CallOption { - var authOpts grpc.CallOption - var err error - authOpts, err = WithCredentialDiscovery() - if err != nil { - log.Fatal("Not logged in. Please retry after logging in") - } - - return authOpts -} diff --git a/pkg/v1/auth/csp/token.go b/pkg/v1/auth/csp/token.go deleted file mode 100644 index 70c957bc9d..0000000000 --- a/pkg/v1/auth/csp/token.go +++ /dev/null @@ -1,213 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package csp - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "time" - - "github.com/aunum/log" - "github.com/golang-jwt/jwt" - "github.com/pkg/errors" - - "golang.org/x/oauth2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -const ( - // AuthTokenDir is a directory where cluster access token and refresh tokens are stored. - AuthTokenDir = "tokens" - - // ExtraIDToken is the key in the Extra fields map that contains id_token. - ExtraIDToken = "id_token" - - // StgIssuer is the CSP staging issuer. - StgIssuer = "https://console-stg.cloud.vmware.com/csp/gateway/am/api" - - // ProdIssuer is the CSP issuer. - ProdIssuer = "https://console.cloud.vmware.com/csp/gateway/am/api" - - //nolint:gosec // Avoid "hardcoded credentials" false positive. - // APITokenKey is the env var for an API token override. - APITokenKey = "CSP_API_TOKEN" -) - -var ( - // KnownIssuers are known OAuth2 endpoints in each CSP environment. - KnownIssuers = map[string]oauth2.Endpoint{ - StgIssuer: { - AuthURL: "https://console-stg.cloud.vmware.com/csp/gateway/discovery", - TokenURL: "https://console-stg.cloud.vmware.com/csp/gateway/am/api/auth/authorize", - AuthStyle: oauth2.AuthStyleInHeader, - }, - ProdIssuer: { - AuthURL: "https://console.cloud.vmware.com/csp/gateway/discovery", - TokenURL: "https://console.cloud.vmware.com/csp/gateway/am/api/auth/authorize", - AuthStyle: oauth2.AuthStyleInHeader, - }, - } -) - -// IDTokenFromTokenSource parses out the id token from extra info in tokensource if available, or returns empty string. -func IDTokenFromTokenSource(token *oauth2.Token) (idTok string) { - extraTok := token.Extra("id_token") - if extraTok != nil { - idTok = extraTok.(string) - } - return -} - -// Token is a CSP token. -type Token struct { - // IDToken for OIDC. - IDToken string `json:"id_token"` - - // TokenType is the type of token. - TokenType string `json:"token_type"` - - // ExpiresIn is experation in seconds. - ExpiresIn int64 `json:"expires_in"` - - // Scope of the token. - Scope string `json:"scope"` - - // AccessToken from CSP. - AccessToken string `json:"access_token"` - - // RefreshToken for use with Refresh Token grant. - RefreshToken string `json:"refresh_token"` -} - -// GetAccessTokenFromAPIToken fetches CSP access token using the API-token. -func GetAccessTokenFromAPIToken(apiToken, issuer string) (*Token, error) { - api := fmt.Sprintf("%s/auth/api-tokens/authorize", issuer) - data := url.Values{} - data.Set("refresh_token", apiToken) - req, _ := http.NewRequestWithContext(context.Background(), "POST", api, bytes.NewBufferString(data.Encode())) - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - - httpClient := &http.Client{} - resp, err := httpClient.Do(req) - if err != nil { - return nil, errors.WithMessage(err, "Failed to obtain access token. Please provide valid VMware Cloud Services API-token") - } - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(resp.Body) - return nil, errors.Errorf("Failed to obtain access token. Please provide valid VMware Cloud Services API-token -- %s", string(body)) - } - - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - token := Token{} - - if err = json.Unmarshal(body, &token); err != nil { - return nil, errors.Wrap(err, "could not unmarshal auth token") - } - - return &token, nil -} - -// GetIssuer returns the appropriate CSP issuer based on the environment. -func GetIssuer(staging bool) string { - if staging { - return StgIssuer - } - return ProdIssuer -} - -// IsExpired checks for the token expiry and returns true if the token has expired else will return false -func IsExpired(tokenExpiry time.Time) bool { - // refresh at half token life - two := 2 - now := time.Now().Unix() - halfDur := -time.Duration((tokenExpiry.Unix()-now)/int64(two)) * time.Second - return tokenExpiry.Add(halfDur).Unix() < now -} - -// ParseToken parses the token. -func ParseToken(tkn *oauth2.Token) (*Claims, error) { - token, _, err := new(jwt.Parser).ParseUnverified(tkn.AccessToken, jwt.MapClaims{}) - if err != nil { - return nil, err - } - - c, ok := token.Claims.(jwt.MapClaims) - if !ok { - return nil, fmt.Errorf("could not parse claims") - } - perm := []string{} - p, ok := c["perms"].([]interface{}) - if !ok { - log.Warning("could not parse perms from token") - } - for _, i := range p { - perm = append(perm, i.(string)) - } - uname, ok := c["username"].(string) - if !ok { - return nil, fmt.Errorf("could not parse username from token") - } - orgID, ok := c["context_name"].(string) - if !ok { - return nil, fmt.Errorf("could not parse orgID from token") - } - claims := &Claims{ - Username: uname, - Permissions: perm, - OrgID: orgID, - Raw: c, - } - return claims, nil -} - -// Claims are the jwt claims. -type Claims struct { - Username string - Permissions []string - OrgID string - Raw map[string]interface{} -} - -// GetToken fetches a token for the current auth context. -func GetToken(g *configapi.GlobalServerAuth) (*oauth2.Token, error) { - if !IsExpired(g.Expiration.Time) { - tok := &oauth2.Token{ - AccessToken: g.AccessToken, - Expiry: g.Expiration.Time, - } - return tok.WithExtra(map[string]interface{}{ - "id_token": g.IDToken, - }), nil - } - - // TODO (pbarker): support more issuers. - token, err := GetAccessTokenFromAPIToken(g.RefreshToken, ProdIssuer) - if err != nil { - return nil, err - } - - g.Type = "api-token" - expiration := time.Now().Local().Add(time.Second * time.Duration(token.ExpiresIn)) - g.Expiration = metav1.NewTime(expiration) - g.RefreshToken = token.RefreshToken - g.AccessToken = token.AccessToken - g.IDToken = token.IDToken - - tok := &oauth2.Token{ - AccessToken: token.AccessToken, - RefreshToken: token.RefreshToken, - Expiry: expiration, - } - return tok.WithExtra(map[string]interface{}{ - "id_token": token.IDToken, - }), nil -} diff --git a/pkg/v1/auth/csp/token_test.go b/pkg/v1/auth/csp/token_test.go deleted file mode 100644 index e507610e76..0000000000 --- a/pkg/v1/auth/csp/token_test.go +++ /dev/null @@ -1,213 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package csp - -import ( - "crypto/hmac" - "crypto/sha256" - "encoding/base64" - "encoding/hex" - "fmt" - "net/http" - "net/http/httptest" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "golang.org/x/oauth2" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -var JWTHeader = `{"alg":"HS256","typ":"JWT"}` - -func TestGetAccessTokenFromAPIToken(t *testing.T) { - assert := assert.New(t) - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, `{ - "id_token": "abc", - "token_type": "Test", - "expires_in": 86400, - "scope": "Test", - "access_token": "LetMeIn", - "refresh_token": "LetMeInAgain"}`) - })) - defer ts.Close() - - token, err := GetAccessTokenFromAPIToken("asdas", ts.URL) - assert.Nil(err) - assert.Equal("LetMeIn", token.AccessToken) -} - -func TestGetAccessTokenFromAPIToken_Err(t *testing.T) { - assert := assert.New(t) - - token, err := GetAccessTokenFromAPIToken("asdas", "example.com") - assert.NotNil(err) - assert.Nil(token) -} - -func TestGetAccessTokenFromAPIToken_FailStatus(t *testing.T) { - assert := assert.New(t) - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusForbidden) - })) - defer ts.Close() - - token, err := GetAccessTokenFromAPIToken("asdas", ts.URL) - assert.NotNil(err) - assert.Contains(err.Error(), "obtain access token") - assert.Nil(token) -} - -func TestGetAccessTokenFromAPIToken_InvalidResponse(t *testing.T) { - assert := assert.New(t) - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, `[{ - "id_token": "abc", - "token_type": "Test", - "expires_in": 86400, - "scope": "Test", - "access_token": "LetMeIn", - "refresh_token": "LetMeInAgain"}]`) - })) - defer ts.Close() - - token, err := GetAccessTokenFromAPIToken("asdas", ts.URL) - assert.NotNil(err) - assert.Contains(err.Error(), "could not unmarshal") - assert.Nil(token) -} - -func TestIsExpired(t *testing.T) { - assert := assert.New(t) - - testTime := time.Now().Add(-time.Minute) - assert.True(IsExpired(testTime)) - - testTime = time.Now().Add(time.Minute * 30) - assert.False(IsExpired(testTime)) -} - -func generateJWTToken(claims string) string { - hm := hmac.New(sha256.New, []byte("secret")) - _, _ = hm.Write([]byte(fmt.Sprintf( - "%s.%s", - base64.RawURLEncoding.EncodeToString([]byte(JWTHeader)), - base64.RawURLEncoding.EncodeToString([]byte(claims)), - ))) - sha := hex.EncodeToString(hm.Sum(nil)) - return fmt.Sprintf( - "%s.%s.%s", - base64.RawURLEncoding.EncodeToString([]byte(JWTHeader)), - base64.RawURLEncoding.EncodeToString([]byte(claims)), - sha, - ) -} - -func TestParseToken_ParseFailure(t *testing.T) { - assert := assert.New(t) - - // Pass in incorrectly formatted AccessToken - tkn := oauth2.Token{ - AccessToken: "LetMeIn", - TokenType: "Bearer", - RefreshToken: "LetMeInAgain", - Expiry: time.Now().Add(time.Minute * 30), - } - - context, err := ParseToken(&tkn) - assert.NotNil(err) - assert.Contains(err.Error(), "invalid") - assert.Nil(context) -} - -func TestParseToken_MissingUsername(t *testing.T) { - assert := assert.New(t) - - accessToken := generateJWTToken( - `{"sub":"1234567890","name":"John Doe","iat":1516239022}`, - ) - tkn := oauth2.Token{ - AccessToken: accessToken, - TokenType: "Bearer", - RefreshToken: "LetMeInAgain", - Expiry: time.Now().Add(time.Minute * 30), - } - - context, err := ParseToken(&tkn) - assert.NotNil(err) - assert.Contains(err.Error(), "could not parse username") - assert.Nil(context) -} - -func TestParseToken_MissingContextname(t *testing.T) { - assert := assert.New(t) - - accessToken := generateJWTToken( - `{"sub":"1234567890","username":"John Doe","orgID":1516239022}`, - ) - tkn := oauth2.Token{ - AccessToken: accessToken, - TokenType: "Bearer", - RefreshToken: "LetMeInAgain", - Expiry: time.Now().Add(time.Minute * 30), - } - - context, err := ParseToken(&tkn) - assert.NotNil(err) - assert.Contains(err.Error(), "could not parse orgID") - assert.Nil(context) -} - -func TestParseToken(t *testing.T) { - assert := assert.New(t) - - accessToken := generateJWTToken( - `{"sub":"1234567890","username":"John Doe","context_name":"1516239022"}`, - ) - tkn := oauth2.Token{ - AccessToken: accessToken, - TokenType: "Bearer", - RefreshToken: "LetMeInAgain", - Expiry: time.Now().Add(time.Minute * 30), - } - - claim, err := ParseToken(&tkn) - assert.Nil(err) - assert.NotNil(claim) - - assert.Equal("John Doe", claim.Username) - assert.Equal("1516239022", claim.OrgID) - assert.Empty(claim.Permissions) -} - -func TestGetToken(t *testing.T) { - assert := assert.New(t) - - accessToken := generateJWTToken( - `{"sub":"1234567890","username":"joe","context_name":"1516239022"}`, - ) - expireTime := time.Now().Add(time.Minute * 30) - - serverAuth := configapi.GlobalServerAuth{ - Issuer: "https://oidc.example.com", - UserName: "jdoe", - AccessToken: accessToken, - IDToken: "xxyyzz", - RefreshToken: "sprite", - Expiration: v1.NewTime(expireTime), - Type: "client", - } - - tok, err := GetToken(&serverAuth) - assert.Nil(err) - assert.NotNil(tok) - assert.Equal(accessToken, tok.AccessToken) - assert.Equal(expireTime, tok.Expiry) -} diff --git a/pkg/v1/auth/wcp/discovery.go b/pkg/v1/auth/wcp/discovery.go deleted file mode 100644 index 6d845269ad..0000000000 --- a/pkg/v1/auth/wcp/discovery.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package wcp provides helpers to interact with a vSphere Supervisor. -package wcp - -import ( - "fmt" - "net/http" - - "github.com/aunum/log" -) - -const ( - SupervisorVIPConfigMapName = "vip-cluster-info" -) - -// IsVSphereSupervisor probes the given endpoint on a well known vSphere -// Supervisor 'login banner' endpoint. -// Returns true iff it was able to successfully determine that the endpoint was -// a vSphere Supervisor. -func IsVSphereSupervisor(endpoint string, httpClient *http.Client) (bool, error) { - loginBannerURL := fmt.Sprintf("%s/wcp/loginbanner", endpoint) - - req, _ := http.NewRequest("GET", loginBannerURL, http.NoBody) - - resp, err := httpClient.Do(req) - if err != nil { - log.Debug("Failed to test for vSphere supervisor: %+v", err) - return false, err - } - defer resp.Body.Close() - - if resp.StatusCode == http.StatusOK { - log.Debug("Got login banner from server") - return true, nil - } - - log.Debug("Could not get login banner from server, response code = %+v", resp.StatusCode) - return false, nil -} diff --git a/pkg/v1/auth/wcp/discovery_test.go b/pkg/v1/auth/wcp/discovery_test.go deleted file mode 100644 index 1f7c1ea920..0000000000 --- a/pkg/v1/auth/wcp/discovery_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package wcp_test - -import ( - "crypto/tls" - "errors" - "net/http" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/ghttp" - - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/auth/wcp" -) - -func TestWCPAuth(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "WCP Auth Suite") -} - -type errorRoundTripper struct{} - -func (e *errorRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { - return nil, errors.New("an error occurred") -} - -var _ = Describe("Tests for vSphere Supervisor discovery", func() { - var endpoint string - var httpClient *http.Client - var tlsServer *ghttp.Server - BeforeEach(func() { - tlsServer = ghttp.NewTLSServer() - endpoint = tlsServer.URL() - httpClient = &http.Client{ - Transport: &http.Transport{ - // #nosec - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: true, - }, - }, - } - }) - Context("When the given endpoint exposes a login banner endpoint", func() { - It("returns true", func() { - tlsServer.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/wcp/loginbanner"), - ghttp.RespondWith(http.StatusOK, "Hello World! This is a login banner."), - ), - ) - result, err := wcp.IsVSphereSupervisor(endpoint, httpClient) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(BeTrue()) - }) - }) - Context("When the given endpoint does not expose a login banner endpoint", func() { - It("returns false", func() { - tlsServer.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/wcp/loginbanner"), - ghttp.RespondWith(http.StatusNotFound, "I'm a 404"), - ), - ) - result, err := wcp.IsVSphereSupervisor(endpoint, httpClient) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(BeFalse()) - }) - }) - Context("When an error occurs contacting the endpoint", func() { - It("returns an error", func() { - httpClient = &http.Client{ - Transport: &errorRoundTripper{}, - } - _, err := wcp.IsVSphereSupervisor(endpoint, httpClient) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("an error occurred")) - }) - }) -}) diff --git a/pkg/v1/buildinfo/buildvar.go b/pkg/v1/buildinfo/buildvar.go deleted file mode 100644 index 1360537945..0000000000 --- a/pkg/v1/buildinfo/buildvar.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package buildinfo holds global vars set at build time to provide information about the build. -// This package SHOULD NOT import other packages -- to avoid dependency cycles. -package buildinfo - -// This package - -var ( - // Date is the date the binary was built. - // Set by go build -ldflags "-X" flag - Date string - - // SHA is the git commit SHA the binary was built with. - // Set by go build -ldflags "-X" flag - SHA string - - // Version is the version the binary was built with. - // Set by go build -ldflags "-X" flag - Version string -) diff --git a/pkg/v1/buildinfo/metadata.go b/pkg/v1/buildinfo/metadata.go deleted file mode 100644 index 718d489b93..0000000000 --- a/pkg/v1/buildinfo/metadata.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package buildinfo - -// IsOfficialBuild is the flag that gets set to True if it is an official build being released. -// Set by go build -ldflags "-X" flag -var IsOfficialBuild string diff --git a/pkg/v1/providers/Makefile b/pkg/v1/providers/Makefile deleted file mode 100644 index 7906eda3f8..0000000000 --- a/pkg/v1/providers/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -.DEFAULT_GOAL:=help - -# Set language for consistent sorting across operating systems -build-provider-template-image: - make -C "../../../providers" build-provider-template-image - -save-provider-template-image: ## Save provider template image - make -C "../../../providers" save-provider-template-image - ln -fs ../../../providers/artifacts artifacts - -push-provider-template-image: ## Push provider template image - make -C "../../../providers" push-provider-template-image diff --git a/pkg/v1/test/cmp/compare.go b/pkg/v1/test/cmp/compare.go deleted file mode 100644 index a6dd265627..0000000000 --- a/pkg/v1/test/cmp/compare.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmp - -import ( - "encoding/json" - "fmt" - "reflect" - - "github.com/Jeffail/gabs" - "github.com/jeremywohl/flatten" - "google.golang.org/protobuf/proto" //nolint -) - -// Comparer is used to compare two values. An error means the fields are either not equal or that -// an error occurred in comparing them. -type Comparer interface { - // Eq will compare the interface values of 'a' and 'b' for equality. - Eq(a, b interface{}) error -} - -// DeepEqualComparer compares two objects using the deep equal operators. -type DeepEqualComparer struct{} - -// Eq will compare using the reflect deep equal function. -func (de *DeepEqualComparer) Eq(a, b interface{}) error { - eq := reflect.DeepEqual(a, b) - if !eq { - am, _ := json.Marshal(a) - bm, _ := json.Marshal(b) - return fmt.Errorf("%q does not exactly equal %q", string(am), string(bm)) - } - return nil -} - -// DefinedComparer tells whether one interface contains the defined fields of another. This operator relies on `omitempty` json -// tags being present in fields that shouldn't be compared when empty. -type DefinedComparer struct{} - -// Eq will tell whether the fields and values defined in 'a' are present in 'b'. An error mean the values are either not equal -// or that an error occurred in comparing them. -func (dc *DefinedComparer) Eq(a, b interface{}) error { - am, err := json.Marshal(a) - if err != nil { - return err - } - bm, err := json.Marshal(b) - if err != nil { - return err - } - bc, err := gabs.ParseJSON(bm) - if err != nil { - return err - } - aflat, err := flatten.FlattenString(string(am), "", flatten.DotStyle) - if err != nil { - return err - } - var af map[string]interface{} - err = json.Unmarshal([]byte(aflat), &af) - if err != nil { - return err - } - contains := true - for ak, av := range af { - eq := reflect.DeepEqual(bc.Path(ak).Data(), av) - if !eq { - contains = false - break - } - } - if !contains { - return fmt.Errorf("values in %s are not present in %s", string(am), string(bm)) - } - return nil -} - -// Contains checks if the given list contains the element using the comparer. -func Contains(list, contains interface{}, comparer Comparer) (err error) { - switch reflect.TypeOf(list).Kind() { - case reflect.Slice: - s := reflect.ValueOf(list) - for i := 0; i < s.Len(); i++ { - o := s.Index(i) - err = comparer.Eq(contains, o.Interface()) - if err == nil { - return nil - } - } - default: - return fmt.Errorf("not an iterable slice: %#v", list) - } - return err -} - -// IterableMessage is an iterable proto message type. -type IterableMessage interface { - proto.Message - Contains(a interface{}, comparer Comparer) error -} diff --git a/pkg/v1/test/cmp/compare_test.go b/pkg/v1/test/cmp/compare_test.go deleted file mode 100644 index 40e48eaa18..0000000000 --- a/pkg/v1/test/cmp/compare_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmp - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -type TestStruct struct { - S1 string `json:"s1,omitempty"` - S2 string `json:"s2,omitempty"` - I1 int `json:"i1,omitempty"` - A *A `json:"a,omitempty"` -} - -type A struct { - AA string `json:"aa,omitempty"` -} - -func TestDefined(t *testing.T) { - cc := DefinedComparer{} - for _, test := range []struct { - name string - a interface{} - b interface{} - shouldErr bool - }{ - { - name: "basic test", - a: TestStruct{ - S1: "test", - }, - b: TestStruct{ - S1: "test", - S2: "test2", - }, - shouldErr: false, - }, - { - name: "nested missing", - a: TestStruct{ - S1: "test", - A: &A{AA: "aa"}, - }, - b: TestStruct{ - S1: "test", - S2: "test2", - }, - shouldErr: true, - }, - { - name: "nested present", - a: TestStruct{ - S1: "test", - A: &A{AA: "aa"}, - }, - b: TestStruct{ - S1: "test", - S2: "test2", - A: &A{AA: "aa"}, - }, - shouldErr: false, - }, - { - name: "nested value wrong", - a: TestStruct{ - S1: "test", - A: &A{AA: "aa"}, - }, - b: TestStruct{ - S1: "test", - S2: "test2", - I1: 5, - A: &A{AA: "b"}, - }, - shouldErr: true, - }, - } { - t.Run(test.name, func(t *testing.T) { - err := cc.Eq(test.a, test.b) - if test.shouldErr { - require.NotNil(t, err, "test should error") - } else { - require.Nil(t, err, "test should not error") - } - }) - } -} diff --git a/pkg/v1/test/cmp/strings/doc.go b/pkg/v1/test/cmp/strings/doc.go deleted file mode 100644 index 67f5c53418..0000000000 --- a/pkg/v1/test/cmp/strings/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package strings provides string related utilities for testing purposes. -package strings diff --git a/pkg/v1/test/cmp/strings/slices.go b/pkg/v1/test/cmp/strings/slices.go deleted file mode 100644 index 133e27c5ab..0000000000 --- a/pkg/v1/test/cmp/strings/slices.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package strings - -import ( - "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/cmpopts" -) - -// SliceDiffIgnoreOrder returns a human-readable diff of two string slices. -// Two slices are considered equal when they have the same length and same elements. The order of the elements is -// ignored while comparing. Nil and empty slices are considered equal. -// -// This function is intended to be used in tests for comparing expected and actual values, and printing the diff for -// users to debug: -// -// if diff := SliceDiffIgnoreOrder(got, want); diff != "" { -// t.Errorf("got: %v, want: %v, diff: %s", got, want, diff) -// } -func SliceDiffIgnoreOrder(a, b []string) string { - return cmp.Diff(a, b, cmpopts.EquateEmpty(), cmpopts.SortSlices(func(x, y string) bool { return x < y })) -} diff --git a/pkg/v1/test/cmp/strings/slices_test.go b/pkg/v1/test/cmp/strings/slices_test.go deleted file mode 100644 index 6fd9e774a3..0000000000 --- a/pkg/v1/test/cmp/strings/slices_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2. - -package strings - -import "testing" - -func TestSliceDiffIgnoreOrder(t *testing.T) { - testCases := []struct { - description string - a []string - b []string - diffEmpty bool - }{ - { - "Non empty diff - elements different", - []string{"abc", "def"}, - []string{"abc", "ghi"}, - false, - }, - { - "Empty diff - same elements", - []string{"abc", "def"}, - []string{"abc", "def"}, - true, - }, - { - "Empty diff - same elements unordered", - []string{"abc", "def", "ghi"}, - []string{"def", "ghi", "abc"}, - true, - }, - { - "Empty diff - nil slices", - nil, - nil, - true, - }, - { - "Empty diff - non nil empty slices", - []string{}, - []string{}, - true, - }, - { - "Empty diff - nil and non-nil slices", - nil, - []string{}, - true, - }, - } - for _, tc := range testCases { - t.Run(tc.description, func(t *testing.T) { - diff := SliceDiffIgnoreOrder(tc.a, tc.b) - if (len(diff) == 0) != tc.diffEmpty { - t.Errorf("expected diffEmpty to be %t, got diff: %s", tc.diffEmpty, diff) - } - }) - } -} diff --git a/pkg/v1/tkr/Dockerfile b/pkg/v1/tkr/Dockerfile deleted file mode 100644 index 66dd65ab37..0000000000 --- a/pkg/v1/tkr/Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 -# syntax=docker.io/docker/dockerfile:1.3.0 - -# Build from publicly reachable source by default, but allow people to re-build images on -# top of their own trusted images. -ARG BUILDER_BASE_IMAGE=golang:1.18 -ARG DISTROLESS_BASE_IMAGE=gcr.io/distroless/static:nonroot - -# Build the manager binary -FROM $BUILDER_BASE_IMAGE as builder - -WORKDIR /workspace - -# Copy the Go Modules manifests -COPY apis/run/ apis/run/ -COPY util/ util/ - -COPY pkg/v1/tkr/go.mod pkg/v1/tkr/go.mod -COPY pkg/v1/tkr/go.sum pkg/v1/tkr/go.sum - -WORKDIR /workspace/pkg/v1/tkr - -# Setting default GOPROXY to https://proxy.golang.org,direct and GOSUMDB to sum.golang.org which can be override by Makefile -ARG GOSUMDB -ARG GOPROXY -ENV GOSUMDB=$GOSUMDB -ENV GOPROXY=$GOPROXY -# cache deps before building and copying source so that we don't need to re-download as much -# and so that source changes don't invalidate our downloaded layer -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod go mod download - -# Copy the go source -COPY pkg/v1/tkr/ ./ - -# Build -ARG LD_FLAGS -ENV LD_FLAGS="$LD_FLAGS "'-extldflags "-static"' -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -a -ldflags "$LD_FLAGS" -o manager ./main.go - -# Use distroless as minimal base image to package the manager binary -# Refer to https://github.com/GoogleContainerTools/distroless for more details -FROM $DISTROLESS_BASE_IMAGE -WORKDIR / -COPY --from=builder /workspace/pkg/v1/tkr/manager . -USER nonroot:nonroot - -ENTRYPOINT ["/manager"] diff --git a/pkg/v1/tkr/Makefile b/pkg/v1/tkr/Makefile deleted file mode 100644 index 43e49d19bc..0000000000 --- a/pkg/v1/tkr/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../../../common.mk - -IMG ?= tkr-controller-manager:latest -CRD_OPTIONS ?= "crd" - -all: manager - -# Run tests -test: fmt vet manifests - go test ./... -coverprofile cover.out - -# Build manager binary -manager: fmt vet - go build -ldflags "$(LD_FLAGS)" -o bin/manager main.go - -# Run against the configured Kubernetes cluster in ~/.kube/config -run: fmt vet - go run -ldflags "$(LD_FLAGS)" ./main.go - -# Run go fmt against code -fmt: - go fmt ./... - -# Run go vet against code -vet: - go vet ./... - -# Generate deployment manifest for the tkr manager -deployment: manifests - cd config/manager && kustomize edit set image controller=${IMG} - kustomize build config/default - -manifests: controller-gen ## Generate manifests e.g. CRD, RBAC etc. - $(CONTROLLER_GEN) \ - $(CRD_OPTIONS) \ - paths=../apis/... \ - output:crd:artifacts:config=../../../config/crd/bases - -controller-gen: ## Download controller-gen -ifeq (, $(shell which controller-gen)) - @{ \ - set -e ;\ - CONTROLLER_GEN_TMP_DIR=$$(mktemp -d) ;\ - cd $$CONTROLLER_GEN_TMP_DIR ;\ - $(GO) mod init tmp ;\ - $(GO) get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.2.5 ;\ - rm -rf $$CONTROLLER_GEN_TMP_DIR ;\ - } -CONTROLLER_GEN=$(GOBIN)/controller-gen -else -CONTROLLER_GEN=$(shell which controller-gen) -endif - -.PHONY: fakes -fakes: ## Generate fake files for go unit tests - go generate ./pkg/... - - -.PHONY: docker-build -docker-build: - cd ../../../ && docker build -t $(IMG) -f pkg/v1/tkr/Dockerfile --build-arg LD_FLAGS="$(LD_FLAGS)" --build-arg DISTROLESS_BASE_IMAGE="$(DISTROLESS_BASE_IMAGE)" --build-arg GOPROXY="$(GOPROXY)" --build-arg GOSUMDB="$(GOSUMDB)" . diff --git a/pkg/v1/tkr/config/default/kustomization.yaml b/pkg/v1/tkr/config/default/kustomization.yaml deleted file mode 100644 index bf20a746bd..0000000000 --- a/pkg/v1/tkr/config/default/kustomization.yaml +++ /dev/null @@ -1,69 +0,0 @@ -# Adds namespace to all resources. -namespace: tkr-system - -# Value of this field is prepended to the -# names of all resources, e.g. a deployment named -# "wordpress" becomes "alices-wordpress". -# Note that it should also match with the prefix (text before '-') of the namespace -# field above. -namePrefix: tkr- - -# Labels to add to all resources and selectors. -#commonLabels: -# someName: someValue - -bases: -- ../../../../../config/crd/ -- ../rbac -- ../manager -# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in -# crd/kustomization.yaml -- ../webhook -# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required. -- ../certmanager -# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'. -#- ../prometheus - -patchesStrategicMerge: - # Protect the /metrics endpoint by putting it behind auth. - # If you want your controller-manager to expose the /metrics - # endpoint w/o any authn/z, please comment the following line. -#- manager_auth_proxy_patch.yaml - -# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in -- manager_webhook_patch.yaml - -# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. -# Uncomment 'CERTMANAGER' sections in crd/kustomization.yaml to enable the CA injection in the admission webhooks. -# 'CERTMANAGER' needs to be enabled to use ca injection -- webhookcainjection_patch.yaml - -# the following config is for teaching kustomize how to do var substitution -vars: -# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix. -- name: CERTIFICATE_NAMESPACE # namespace of the certificate CR - objref: - kind: Certificate - group: cert-manager.io - version: v1alpha2 - name: serving-cert # this name should match the one in certificate.yaml - fieldref: - fieldpath: metadata.namespace -- name: CERTIFICATE_NAME - objref: - kind: Certificate - group: cert-manager.io - version: v1alpha2 - name: serving-cert # this name should match the one in certificate.yaml -- name: SERVICE_NAMESPACE # namespace of the service - objref: - kind: Service - version: v1 - name: webhook-service - fieldref: - fieldpath: metadata.namespace -- name: SERVICE_NAME - objref: - kind: Service - version: v1 - name: webhook-service diff --git a/pkg/v1/tkr/config/manager/kustomization.yaml b/pkg/v1/tkr/config/manager/kustomization.yaml deleted file mode 100644 index 05d067066d..0000000000 --- a/pkg/v1/tkr/config/manager/kustomization.yaml +++ /dev/null @@ -1,8 +0,0 @@ -resources: -- manager.yaml -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization -images: -- name: controller - newName: tkr-controller-manager - newTag: latest diff --git a/pkg/v1/tkr/config/manager/manager.yaml b/pkg/v1/tkr/config/manager/manager.yaml deleted file mode 100644 index b6c85a52d5..0000000000 --- a/pkg/v1/tkr/config/manager/manager.yaml +++ /dev/null @@ -1,39 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - control-plane: controller-manager - name: system ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: controller-manager - namespace: system - labels: - control-plane: controller-manager -spec: - selector: - matchLabels: - control-plane: controller-manager - replicas: 1 - template: - metadata: - labels: - control-plane: controller-manager - spec: - containers: - - command: - - /manager - args: - - --enable-leader-election - image: controller:latest - name: manager - resources: - limits: - cpu: 100m - memory: 30Mi - requests: - cpu: 100m - memory: 20Mi - terminationGracePeriodSeconds: 10 diff --git a/pkg/v1/tkr/config/rbac/kustomization.yaml b/pkg/v1/tkr/config/rbac/kustomization.yaml deleted file mode 100644 index 08dd6cb560..0000000000 --- a/pkg/v1/tkr/config/rbac/kustomization.yaml +++ /dev/null @@ -1,6 +0,0 @@ -resources: -- role.yaml -- role_binding.yaml -- leader_election_role.yaml -- leader_election_role_binding.yaml - diff --git a/pkg/v1/tkr/config/rbac/leader_election_role.yaml b/pkg/v1/tkr/config/rbac/leader_election_role.yaml deleted file mode 100644 index eaa79158fb..0000000000 --- a/pkg/v1/tkr/config/rbac/leader_election_role.yaml +++ /dev/null @@ -1,32 +0,0 @@ -# permissions to do leader election. -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: leader-election-role -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create diff --git a/pkg/v1/tkr/config/rbac/leader_election_role_binding.yaml b/pkg/v1/tkr/config/rbac/leader_election_role_binding.yaml deleted file mode 100644 index eed16906f4..0000000000 --- a/pkg/v1/tkr/config/rbac/leader_election_role_binding.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: leader-election-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: leader-election-role -subjects: -- kind: ServiceAccount - name: default - namespace: system diff --git a/pkg/v1/tkr/config/rbac/role.yaml b/pkg/v1/tkr/config/rbac/role.yaml deleted file mode 100644 index 7c7654712b..0000000000 --- a/pkg/v1/tkr/config/rbac/role.yaml +++ /dev/null @@ -1,49 +0,0 @@ - ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - name: manager-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases/status - verbs: - - get - - patch - - update -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete diff --git a/pkg/v1/tkr/config/rbac/role_binding.yaml b/pkg/v1/tkr/config/rbac/role_binding.yaml deleted file mode 100644 index 8f2658702c..0000000000 --- a/pkg/v1/tkr/config/rbac/role_binding.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: manager-role -subjects: -- kind: ServiceAccount - name: default - namespace: system diff --git a/pkg/v1/tkr/config/rbac/tanzukubernetesrelease_editor_role.yaml b/pkg/v1/tkr/config/rbac/tanzukubernetesrelease_editor_role.yaml deleted file mode 100644 index 792e5f4114..0000000000 --- a/pkg/v1/tkr/config/rbac/tanzukubernetesrelease_editor_role.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# permissions for end users to edit tanzukubernetesreleases. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzukubernetesrelease-editor-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases/status - verbs: - - get diff --git a/pkg/v1/tkr/config/rbac/tanzukubernetesrelease_viewer_role.yaml b/pkg/v1/tkr/config/rbac/tanzukubernetesrelease_viewer_role.yaml deleted file mode 100644 index 6fa67881ed..0000000000 --- a/pkg/v1/tkr/config/rbac/tanzukubernetesrelease_viewer_role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# permissions for end users to view tanzukubernetesreleases. -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzukubernetesrelease-viewer-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - verbs: - - get - - list - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases/status - verbs: - - get diff --git a/pkg/v1/tkr/controllers/label/doc.go b/pkg/v1/tkr/controllers/label/doc.go deleted file mode 100644 index e8048abb33..0000000000 --- a/pkg/v1/tkr/controllers/label/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package label defines a labeling controller for TanzuKubernetesRelease resources. -package label diff --git a/pkg/v1/tkr/controllers/label/suite_test.go b/pkg/v1/tkr/controllers/label/suite_test.go deleted file mode 100644 index 8a82d000fc..0000000000 --- a/pkg/v1/tkr/controllers/label/suite_test.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package label - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "sigs.k8s.io/controller-runtime/pkg/envtest/printer" - // +kubebuilder:scaffold:imports -) - -// These tests use Ginkgo (BDD-style Go testing framework). Refer to -// http://onsi.github.io/ginkgo/ to learn more about Ginkgo. - -func TestAPIs(t *testing.T) { - RegisterFailHandler(Fail) - - RunSpecsWithDefaultAndCustomReporters(t, - "Controller Suite", - []Reporter{printer.NewlineReporter{}}) -} diff --git a/pkg/v1/tkr/controllers/label/tkr_label_controller.go b/pkg/v1/tkr/controllers/label/tkr_label_controller.go deleted file mode 100644 index 8d0db552cf..0000000000 --- a/pkg/v1/tkr/controllers/label/tkr_label_controller.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package label - -import ( - "context" - - "github.com/go-logr/logr" - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/runtime" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" - - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - mgrcontext "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/context" -) - -const ( - controllerName = "tkr-labeling-controller" -) - -// +kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=tanzukubernetesreleases,verbs=get;list;watch;create;update;patch;delete -// +kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=tanzukubernetesreleases/status,verbs=get;update;patch - -// AddToManager adds this package's controller to the provided manager. -func AddToManager(ctx *mgrcontext.ControllerManagerContext, mgr ctrl.Manager) error { - c, err := controller.New(controllerName, mgr, controller.Options{ - Reconciler: newReconciler(ctx), - }) - if err != nil { - return errors.Wrapf(err, "error constructing controller '%s'", controllerName) - } - return c.Watch(&source.Kind{Type: &runv1.TanzuKubernetesRelease{}}, &handler.EnqueueRequestForObject{}) -} - -func newReconciler(ctx *mgrcontext.ControllerManagerContext) reconciler { - return reconciler{ - ctx: ctx.Context, - client: ctx.Client, - logger: ctx.Logger, - scheme: ctx.Scheme, - } -} - -type reconciler struct { - ctx context.Context - client client.Client - logger logr.Logger - scheme *runtime.Scheme -} - -func (r reconciler) Reconcile(ctx context.Context, req reconcile.Request) (result reconcile.Result, err error) { - return result, err -} diff --git a/pkg/v1/tkr/controllers/source/configurer.go b/pkg/v1/tkr/controllers/source/configurer.go deleted file mode 100644 index dbbd26b5c9..0000000000 --- a/pkg/v1/tkr/controllers/source/configurer.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package source - -import ( - "context" - "os" - "path" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - k8serr "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/types" - - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/constants" -) - -const ( - configMapName = "tkr-controller-config" - caCertsKey = "caCerts" - registryCertsFile = "registry_certs" -) - -func (r *reconciler) Configure() error { - configMap := &corev1.ConfigMap{} - err := r.client.Get(context.Background(), types.NamespacedName{Namespace: constants.TKRNamespace, Name: configMapName}, configMap) - // Not configure anything if the ConfigMap is not found - if k8serr.IsNotFound(err) { - return nil - } - - if err != nil { - return errors.Wrapf(err, "unable to find the ConfigMap %s", configMapName) - } - err = addTrustedCerts(configMap.Data[caCertsKey]) - if err != nil { - return errors.Wrap(err, "failed to add certs") - } - - return nil -} - -func addTrustedCerts(certChain string) (err error) { - if certChain == "" { - return nil - } - - filePath, err := getRegistryCertFile() - if err != nil { - return err - } - - return os.WriteFile(filePath, []byte(certChain), 0644) -} -func getRegistryCertFile() (string, error) { - home, err := os.UserHomeDir() - if err != nil { - return "", errors.Wrap(err, "could not locate local tanzu dir") - } - return path.Join(home, registryCertsFile), nil -} diff --git a/pkg/v1/tkr/controllers/source/doc.go b/pkg/v1/tkr/controllers/source/doc.go deleted file mode 100644 index 20cba8fd4a..0000000000 --- a/pkg/v1/tkr/controllers/source/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package source defines source controller for reconciling TanzuKubernetesRelease resources. -package source diff --git a/pkg/v1/tkr/controllers/source/helper.go b/pkg/v1/tkr/controllers/source/helper.go deleted file mode 100644 index f605bda7a2..0000000000 --- a/pkg/v1/tkr/controllers/source/helper.go +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package source - -import ( - "context" - "regexp" - "strconv" - "strings" - "time" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/version" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - utilconditions "sigs.k8s.io/cluster-api/util/conditions" - - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/constants" -) - -const ( - // InitialDiscoveryRetry is the number of retries for the initial TKR sync-up - InitialDiscoveryRetry = 10 - // GetManagementClusterInfoFailedError is the error message for not getting management cluster info - GetManagementClusterInfoFailedError = "failed to get management cluster info" -) - -// NewTkrFromBom gets a new TKR matching tkrName from the BOM information in bomContent -func NewTkrFromBom(tkrName string, bomContent []byte) (runv1.TanzuKubernetesRelease, error) { - bom, err := tkrv1.NewBom(bomContent) - if err != nil { - return runv1.TanzuKubernetesRelease{}, errors.Wrap(err, "failed to parse the BOM file content") - } - - k8sComponent, err := bom.GetComponent(constants.BOMKubernetesComponentKey) - if err != nil { - return runv1.TanzuKubernetesRelease{}, errors.Wrap(err, "failed to get the Kubernetes component from the BOM file") - } - - k8sVersion := "" - if len(k8sComponent) != 0 { - k8sVersion = k8sComponent[0].Version - } - - releaseVersion, err := bom.GetReleaseVersion() - if err != nil { - return runv1.TanzuKubernetesRelease{}, errors.Wrap(err, "failed to get the TKG release from the BOM file") - } - - repository, err := bom.GetImageRepository() - if err != nil { - return runv1.TanzuKubernetesRelease{}, errors.Wrap(err, "failed to get the image repository from the BOM file") - } - - components, err := bom.Components() - if err != nil { - return runv1.TanzuKubernetesRelease{}, errors.Wrap(err, "failed to get the image repository from the BOM file") - } - - containerImages := []runv1.ContainerImage{} - - for _, component := range components { - for _, componentInfo := range component { - for _, image := range componentInfo.Images { - containerImage := runv1.ContainerImage{ - Name: image.ImagePath, - Tag: image.Tag, - Repository: repository, - } - containerImages = append(containerImages, containerImage) - } - } - } - - newTkr := runv1.TanzuKubernetesRelease{ - ObjectMeta: metav1.ObjectMeta{ - Name: tkrName, - }, - Spec: runv1.TanzuKubernetesReleaseSpec{ - Version: releaseVersion, - KubernetesVersion: k8sVersion, - Repository: repository, - Images: containerImages, - }, - Status: runv1.TanzuKubernetesReleaseStatus{ - Conditions: []clusterv1.Condition{ - { - Type: runv1.ConditionCompatible, - Status: corev1.ConditionUnknown, - LastTransitionTime: metav1.Time{Time: time.Now()}, - Severity: "", - Reason: "", - Message: "", - }, - { - Type: runv1.ConditionUpdatesAvailable, - Status: corev1.ConditionFalse, - LastTransitionTime: metav1.Time{Time: time.Now()}, - Severity: "", - Reason: "", - Message: "", - }, - { - Type: runv1.ConditionUpgradeAvailable, - Status: corev1.ConditionFalse, - LastTransitionTime: metav1.Time{Time: time.Now()}, - Severity: "", - Reason: "", - Message: "Deprecated", - }, - }, - }, - } - - return newTkr, nil -} - -// TKRVersion contains the TKR version info -type TKRVersion struct { - Major uint - Minor uint - Patch uint - VMware uint - TKG uint -} - -func upgradeQualified(fromTKR, toTKR *runv1.TanzuKubernetesRelease) bool { - if !utilconditions.IsTrue(toTKR, runv1.ConditionCompatible) { - return false - } - - from, err := NewTKRVersion(fromTKR.Spec.Version) - if err != nil { - return false - } - to, err := NewTKRVersion(toTKR.Spec.Version) - if err != nil { - return false - } - - if from.Major != to.Major { - return false - } - // skipping minor version upgrade is not supported - if from.Minor != to.Minor { - return from.Minor+1 == to.Minor - } - - if from.Patch != to.Patch { - return from.Patch < to.Patch - } - if from.VMware != to.VMware { - return from.VMware < to.VMware - } - - return from.TKG < to.TKG -} - -// NewTKRVersion return the TKRVersion parsed from the TKR version string -func NewTKRVersion(tkrVersion string) (TKRVersion, error) { - parsedVersion, err := version.ParseSemantic(tkrVersion) - if err != nil { - return TKRVersion{}, err - } - v := TKRVersion{ - Major: parsedVersion.Major(), - Minor: parsedVersion.Minor(), - Patch: parsedVersion.Patch(), - } - - m := regexp.MustCompile(`tkg.(\d+)`) - tkgVersion := m.FindStringSubmatch(tkrVersion) - - if tkgVersion != nil { - ver, err := strconv.Atoi(tkgVersion[1]) - if err != nil { - return v, err - } - v.TKG = uint(ver) - } else { - v.TKG = 0 - } - - m = regexp.MustCompile(`vmware.(\d+)`) - vmVersion := m.FindStringSubmatch(tkrVersion) - if vmVersion != nil { - ver, err := strconv.Atoi(vmVersion[1]) - if err != nil { - return v, err - } - v.VMware = uint(ver) - } else { - v.VMware = 0 - } - - return v, nil -} - -// GetManagementClusterVersion get the version of the management cluster -func (r *reconciler) GetManagementClusterVersion(ctx context.Context) (string, error) { - clusterList := &clusterv1.ClusterList{} - err := r.client.List(ctx, clusterList) - if err != nil { - return "", errors.Wrap(err, "failed to list clusters from control plane") - } - - items := clusterList.Items - for i := range items { - labels := items[i].GetLabels() - if _, ok := labels[constants.ManagementClusterRoleLabel]; ok { - tkgVersion, ok := items[i].Annotations[constants.TKGVersionKey] - if ok { - return tkgVersion, nil - } - } - } - - return "", errors.New(GetManagementClusterInfoFailedError) -} - -func hasDeprecateUpgradeAvailableCondition(conditions []clusterv1.Condition) bool { - for _, c := range conditions { - if c.Type == runv1.ConditionUpgradeAvailable { - return true - } - } - return false -} - -type errorSlice []error - -func (e errorSlice) Error() string { - if len(e) == 0 { - return "" - } - sb := &strings.Builder{} - for i, err := range e { - if i != 0 { - sb.WriteString(", ") - } - sb.WriteString(err.Error()) - } - return sb.String() -} diff --git a/pkg/v1/tkr/controllers/source/suite_test.go b/pkg/v1/tkr/controllers/source/suite_test.go deleted file mode 100644 index e827a7a4bf..0000000000 --- a/pkg/v1/tkr/controllers/source/suite_test.go +++ /dev/null @@ -1,814 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package source - -import ( - "context" - "os" - "testing" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/uuid" - clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha3" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/conditions" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client" - - // The fake package is deprecated, though there is talk of undeprecating it - "sigs.k8s.io/controller-runtime/pkg/client/fake" // nolint:staticcheck,nolintlint - ctrllog "sigs.k8s.io/controller-runtime/pkg/log" - - // +kubebuilder:scaffold:imports - - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/fakes" - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/constants" -) - -const ( - version11713 = "v1.17.13---vmware.1" - version11810 = "v1.18.10---vmware.1" - version1191 = "v1.19.1---vmware.1" - version1193 = "v1.19.3---vmware.1" - version1205 = "v1.20.5---vmware.1" -) - -// These tests use Ginkgo (BDD-style Go testing framework). Refer to -// http://onsi.github.io/ginkgo/ to learn more about Ginkgo. - -var bomContent17 []byte -var bomContent18 []byte -var bomContent193 []byte -var bomContent191 []byte -var bomContent120 []byte -var metadataContent []byte - -func TestAPIs(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "TKR source controller test") -} - -func addToScheme(scheme *runtime.Scheme) { - _ = capi.AddToScheme(scheme) - _ = corev1.AddToScheme(scheme) - _ = runv1.AddToScheme(scheme) -} - -var _ = BeforeSuite(func() { - bomContent17, _ = os.ReadFile("../../fakes/boms/bom-v1.17.13+vmware.1.yaml") - bomContent18, _ = os.ReadFile("../../fakes/boms/bom-v1.18.10+vmware.1.yaml") - bomContent193, _ = os.ReadFile("../../fakes/boms/bom-v1.19.3+vmware.1.yaml") - bomContent191, _ = os.ReadFile("../../fakes/boms/bom-v1.19.1+vmware.1.yaml") - metadataContent, _ = os.ReadFile("../../fakes/boms/metadata.yaml") -}) - -var _ = Describe("SyncRelease", func() { - var ( - fakeClient client.Client - fakeRegistry *fakes.Registry - scheme *runtime.Scheme - objects []runtime.Object - r reconciler - err error - ) - - JustBeforeEach(func() { - scheme = runtime.NewScheme() - addToScheme(scheme) - fakeClient = uidSetter{fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build()} - r = reconciler{ - ctx: context.Background(), - client: fakeClient, - log: ctrllog.Log, - scheme: scheme, - registry: fakeRegistry, - bomImage: "my-registry.io/tkrs", - } - - err = r.SyncRelease(context.Background()) - }) - - Context("When BOM images with proper content are published", func() { - - BeforeEach(func() { - fakeRegistry = &fakes.Registry{} - fakeRegistry.ListImageTagsReturns([]string{"bom-v1.17.13+vmware.1", "bom-v1.18.10+vmware.1", "bom-v1.19.3+vmware.1"}, nil) - - // we'll fetch BOM metadata image first - fakeRegistry.ListImageTagsReturnsOnCall(0, []string{"v1"}, nil) - fakeRegistry.GetFileReturnsOnCall(0, metadataContent, nil) - - fakeRegistry.GetFileReturnsOnCall(1, bomContent17, nil) - fakeRegistry.GetFileReturnsOnCall(2, bomContent18, nil) - fakeRegistry.GetFileReturnsOnCall(3, bomContent193, nil) - objects = []runtime.Object{} - - }) - - It("should create BOM ConfigMaps", func() { - Expect(err).ToNot(HaveOccurred()) - - metadata, err := r.compatibilityMetadata(r.ctx) - Expect(err).ToNot(HaveOccurred()) - Expect(metadata).ToNot(BeNil()) - - cmList := &corev1.ConfigMapList{} - opts := []client.ListOption{ - client.InNamespace(constants.TKRNamespace), - client.HasLabels{constants.BomConfigMapTKRLabel}, - } - Expect(fakeClient.List(context.Background(), cmList, opts...)).To(Succeed()) - Expect(len(cmList.Items)).To(Equal(3)) - }) - - }) - - Context("When a new BOM images is released", func() { - - BeforeEach(func() { - fakeRegistry = &fakes.Registry{} - fakeRegistry.ListImageTagsReturns([]string{"bom-v1.17.13+vmware.1", "bom-v1.18.10+vmware.1", "bom-v1.19.3+vmware.1"}, nil) - - // we'll fetch BOM metadata image first - fakeRegistry.ListImageTagsReturnsOnCall(0, []string{"v1"}, nil) - fakeRegistry.GetFileReturnsOnCall(0, metadataContent, nil) - - fakeRegistry.GetFileReturnsOnCall(1, bomContent193, nil) - - cm1 := newConfigMap(version11713, map[string]string{constants.BomConfigMapTKRLabel: version11713}, map[string]string{constants.BomConfigMapImageTagAnnotation: "bom-v1.17.13+vmware.1"}, bomContent17) - cm2 := newConfigMap(version11810, map[string]string{constants.BomConfigMapTKRLabel: version11810}, map[string]string{constants.BomConfigMapImageTagAnnotation: "bom-v1.18.10+vmware.1"}, bomContent18) - - objects = []runtime.Object{cm1, cm2} - }) - - It("should create a new ConfigMap based on the new BOM", func() { - Expect(err).ToNot(HaveOccurred()) - cmList := &corev1.ConfigMapList{} - opts := []client.ListOption{ - client.InNamespace(constants.TKRNamespace), - client.HasLabels{constants.BomConfigMapTKRLabel}, - } - Expect(fakeClient.List(context.Background(), cmList, opts...)).To(Succeed()) - Expect(len(cmList.Items)).To(Equal(3)) - }) - }) - -}) - -var _ = Describe("UpdateTKRCompatibleCondition", func() { - var ( - tkrs []runv1.TanzuKubernetesRelease - fakeClient client.Client - scheme *runtime.Scheme - objects []runtime.Object - r reconciler - err error - ) - - JustBeforeEach(func() { - scheme = runtime.NewScheme() - addToScheme(scheme) - fakeClient = uidSetter{fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build()} - r = reconciler{ - ctx: context.Background(), - client: fakeClient, - log: ctrllog.Log, - scheme: scheme, - bomImage: "my-registry.io/tkrs", - } - err = r.UpdateTKRCompatibleCondition(context.Background(), tkrs) - }) - - Context("When reconcile the compatible condition of the TKRs", func() { - BeforeEach(func() { - tkr1, _ := NewTkrFromBom(version11713, bomContent17) - tkr2, _ := NewTkrFromBom(version11810, bomContent18) - tkr3, _ := NewTkrFromBom(version1193, bomContent193) - tkr4, _ := NewTkrFromBom(version1191, bomContent191) - tkr5, _ := NewTkrFromBom(version1205, bomContent120) - cm := newMetadataConfigMap(metadataContent) - tkrs = []runv1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2, tkr5} - - mgmtcluster := newManagementCluster(map[string]string{constants.ManagementClusterRoleLabel: ""}, map[string]string{constants.TKGVersionKey: "v1.10"}) - objects = []runtime.Object{mgmtcluster, cm} - }) - It("should update the TKRs' compatible condition", func() { - Expect(err).ToNot(HaveOccurred()) - for _, tkr := range tkrs { - if tkr.Name == version1193 { - status, msg := getConditionStatusAndMessage(tkr.Status.Conditions, runv1.ConditionCompatible) - Expect(string(status)).To(Equal("False")) - Expect(msg).To(Equal("")) - } - - if tkr.Name == version11810 { - status, msg := getConditionStatusAndMessage(tkr.Status.Conditions, runv1.ConditionCompatible) - Expect(string(status)).To(Equal("True")) - Expect(msg).To(Equal("")) - } - - if tkr.Name == version1191 { - status, msg := getConditionStatusAndMessage(tkr.Status.Conditions, runv1.ConditionCompatible) - Expect(string(status)).To(Equal("False")) - Expect(msg).To(Equal("")) - } - - if tkr.Name == version11713 { - status, msg := getConditionStatusAndMessage(tkr.Status.Conditions, runv1.ConditionCompatible) - Expect(string(status)).To(Equal("False")) - Expect(msg).To(Equal("")) - } - if tkr.Name == version1205 { - status, msg := getConditionStatusAndMessage(tkr.Status.Conditions, runv1.ConditionCompatible) - Expect(string(status)).To(Equal("True")) - Expect(msg).To(Equal("")) - } - } - }) - }) -}) - -var _ = Describe("UpdateTKRUpgradeAvailableCondition", func() { - var ( - tkrs []runv1.TanzuKubernetesRelease - r reconciler - ) - - JustBeforeEach(func() { - r = reconciler{} - r.UpdateTKRUpdatesAvailableCondition(tkrs) - }) - - Context("When there are available upgrade for some of the TKRs", func() { - BeforeEach(func() { - tkr1, _ := NewTkrFromBom(version11713, bomContent17) - tkr2, _ := NewTkrFromBom(version11810, bomContent18) - tkr3, _ := NewTkrFromBom(version1193, bomContent193) - tkr4, _ := NewTkrFromBom(version1191, bomContent191) - conditions.Set(&tkr2, conditions.TrueCondition(runv1.ConditionCompatible)) - conditions.Set(&tkr3, conditions.TrueCondition(runv1.ConditionCompatible)) - conditions.Set(&tkr4, conditions.TrueCondition(runv1.ConditionCompatible)) - tkrs = []runv1.TanzuKubernetesRelease{tkr1, tkr4, tkr3, tkr2} - }) - It("should update the UpgradeAvailable Condition with proper message", func() { - - for _, tkr := range tkrs { - if tkr.Name == version1193 { - status, msg := getConditionStatusAndMessage(tkr.Status.Conditions, runv1.ConditionUpdatesAvailable) - Expect(string(status)).To(Equal("False")) - Expect(msg).To(Equal("")) - } - - if tkr.Name == version11810 { - status, msg := getConditionStatusAndMessage(tkr.Status.Conditions, runv1.ConditionUpdatesAvailable) - Expect(string(status)).To(Equal("True")) - Expect(msg).To(Equal("[v1.19.1+vmware.1 v1.19.3+vmware.1]")) - } - - if tkr.Name == version1191 { - status, msg := getConditionStatusAndMessage(tkr.Status.Conditions, runv1.ConditionUpdatesAvailable) - Expect(string(status)).To(Equal("True")) - Expect(msg).To(Equal("[v1.19.3+vmware.1]")) - } - - if tkr.Name == version11713 { - status, msg := getConditionStatusAndMessage(tkr.Status.Conditions, runv1.ConditionUpdatesAvailable) - Expect(string(status)).To(Equal("True")) - Expect(msg).To(Equal("[v1.18.10+vmware.1]")) - } - } - }) - }) -}) - -var _ = Describe("initialReconcile", func() { - var ( - fakeClient client.Client - fakeRegistry *fakes.Registry - scheme *runtime.Scheme - objects []runtime.Object - ctx context.Context - cancel func() - retries int - r reconciler - ) - - BeforeEach(func() { - scheme = runtime.NewScheme() - addToScheme(scheme) - fakeClient = uidSetter{fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build()} - retries = 3 - ctx, cancel = context.WithCancel(context.Background()) - go func() { - time.Sleep(time.Second * 5) - cancel() - }() - }) - JustBeforeEach(func() { - r = reconciler{ - ctx: ctx, - client: fakeClient, - log: ctrllog.Log, - scheme: scheme, - registry: fakeRegistry, - bomImage: "my-registry.io/tkrs", - compatibilityMetadataImage: "", - } - r.initialReconcile(ctx, 1*time.Second, retries) - }) - - Context("When in initial sync-up stage", func() { - BeforeEach(func() { - fakeRegistry = &fakes.Registry{} - fakeRegistry.ListImageTagsReturns([]string{"bom-v1.17.13+vmware.1", "bom-v1.18.10+vmware.1", "bom-v1.19.3+vmware.1"}, nil) - - // we'll fetch BOM metadata image first - fakeRegistry.ListImageTagsReturnsOnCall(0, []string{"v1"}, nil) - fakeRegistry.GetFileReturnsOnCall(0, metadataContent, nil) - - fakeRegistry.GetFileReturnsOnCall(1, bomContent17, nil) - fakeRegistry.GetFileReturnsOnCall(2, bomContent18, nil) - fakeRegistry.GetFileReturnsOnCall(3, bomContent193, nil) - }) - It("retrieve the list of images at least once", func() { - Expect(fakeRegistry.ListImageTagsCallCount()).Should(BeNumerically(">=", 1)) - }) - }) - - Context("When cluster is ready, but the some BOM content can not be retrieved", func() { - BeforeEach(func() { - fakeRegistry = &fakes.Registry{} - fakeRegistry.ListImageTagsReturns([]string{"bom-v1.17.13+vmware.1", "bom-v1.18.10+vmware.1", "bom-v1.19.3+vmware.1"}, nil) - - // we'll fetch BOM metadata image first - fakeRegistry.ListImageTagsReturnsOnCall(0, []string{"v1"}, nil) - fakeRegistry.GetFileReturnsOnCall(0, metadataContent, nil) - - fakeRegistry.GetFileReturnsOnCall(1, bomContent17, nil) - fakeRegistry.GetFileReturnsOnCall(2, nil, errors.New("fake-error")) - fakeRegistry.GetFileReturnsOnCall(3, bomContent193, nil) - mgmtcluster := newManagementCluster(map[string]string{constants.ManagementClusterRoleLabel: ""}, map[string]string{constants.TKGVersionKey: "v1.1"}) - objects = []runtime.Object{mgmtcluster} - fakeClient = uidSetter{fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build()} - }) - - It("should retrieve what can be retrieved and create appropriate ConfigMaps", func() { - cmList := &corev1.ConfigMapList{} - opts := []client.ListOption{ - client.InNamespace(constants.TKRNamespace), - client.HasLabels{constants.BomConfigMapTKRLabel}, - } - Expect(fakeClient.List(context.Background(), cmList, opts...)).To(Succeed()) - Expect(len(cmList.Items)).To(Equal(2)) - - metadata, err := r.compatibilityMetadata(r.ctx) - Expect(err).ToNot(HaveOccurred()) - Expect(metadata).ToNot(BeNil()) - }) - - When("there are 0 retries", func() { - BeforeEach(func() { - retries = 0 - }) - - It("should not attempt fetching images more than once", func() { - // ListImageTags() called for both metadata and BOM images - // Since there are no retries, these 2 calls are supposed to be made once - Expect(fakeRegistry.ListImageTagsCallCount()).To(Equal(2)) - }) - }) - - When("context is canceled (controller is being stopped)", func() { - BeforeEach(func() { - cancel() - }) - - It("should not attempt fetching images", func() { - Expect(fakeRegistry.ListImageTagsCallCount()).To(Equal(0)) - }) - }) - }) - - Context("When cluster is ready, and bom content can be retrieved", func() { - BeforeEach(func() { - fakeRegistry = &fakes.Registry{} - fakeRegistry.ListImageTagsReturns([]string{"bom-v1.17.13+vmware.1", "bom-v1.18.10+vmware.1", "bom-v1.19.3+vmware.1"}, nil) - - // we'll fetch BOM metadata image first - fakeRegistry.ListImageTagsReturnsOnCall(0, []string{"v1"}, nil) - fakeRegistry.GetFileReturnsOnCall(0, metadataContent, nil) - - fakeRegistry.GetFileReturnsOnCall(1, bomContent17, nil) - fakeRegistry.GetFileReturnsOnCall(2, bomContent18, nil) - fakeRegistry.GetFileReturnsOnCall(3, bomContent193, nil) - - mgmtcluster := newManagementCluster(map[string]string{constants.ManagementClusterRoleLabel: ""}, map[string]string{constants.TKGVersionKey: "v1.1"}) - objects = []runtime.Object{mgmtcluster} - fakeClient = uidSetter{fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build()} - }) - - It("should create the metadata ConfigMap and all BOM ConfigMaps", func() { - cmList := &corev1.ConfigMapList{} - opts := []client.ListOption{ - client.InNamespace(constants.TKRNamespace), - client.HasLabels{constants.BomConfigMapTKRLabel}, - } - Expect(fakeClient.List(context.Background(), cmList, opts...)).To(Succeed()) - Expect(len(cmList.Items)).To(Equal(3)) - - metadata, err := r.compatibilityMetadata(r.ctx) - Expect(err).ToNot(HaveOccurred()) - Expect(metadata).ToNot(BeNil()) - }) - - When("creating a ConfigMap returns an error", func() { - BeforeEach(func() { - fakeClient = clientErrOnCreate{Client: fakeClient, err: errors.New("EXPECTED"), errOnName: "v1.18.10---vmware.1"} - fakeClient = clientErrOnCreate{Client: fakeClient, err: errors.New("EXPECTED"), errOnName: constants.BOMMetadataConfigMapName} - }) - - It("should create the metadata ConfigMap and all BOM ConfigMaps except those affected by the error", func() { - cmList := &corev1.ConfigMapList{} - opts := []client.ListOption{ - client.InNamespace(constants.TKRNamespace), - client.HasLabels{constants.BomConfigMapTKRLabel}, - } - Expect(fakeClient.List(context.Background(), cmList, opts...)).To(Succeed()) - Expect(len(cmList.Items)).To(Equal(2)) // not all 3 are expected - - metadata, err := r.compatibilityMetadata(r.ctx) - Expect(err).To(HaveOccurred()) - Expect(metadata).To(BeNil()) - }) - }) - }) -}) - -type clientErrOnCreate struct { - client.Client - err error - errOnName string -} - -func (c clientErrOnCreate) Create(ctx context.Context, obj client.Object, opts ...client.CreateOption) error { - if cm, ok := obj.(*corev1.ConfigMap); ok && cm.Name == c.errOnName { - return c.err - } - return c.Client.Create(ctx, obj, opts...) -} - -var _ = Describe("watchMgmtCluster()", func() { - When("receiving an event for a workload Cluster", func() { - It("should NOT emit a request", func() { - Expect(watchMgmtCluster(&clusterv1.Cluster{})).To(HaveLen(0)) - Expect(watchMgmtCluster(&clusterv1.Cluster{ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{}, - }})).To(HaveLen(0)) - }) - }) - - When("receiving an event for a management Cluster", func() { - It("should emit a request", func() { - cluster := &clusterv1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{constants.ManagementClusterRoleLabel: ""}, - }, - } - requests := watchMgmtCluster(cluster) - Expect(requests).To(HaveLen(1)) - Expect(requests[0].Namespace).To(Equal(constants.TKRNamespace)) - Expect(requests[0].Name).To(Equal(constants.BOMMetadataConfigMapName)) - }) - }) -}) - -var _ = Describe("r.Reconcile()", func() { - var ( - fakeRegistry *fakes.Registry - fakeClient client.Client - scheme *runtime.Scheme - objects []runtime.Object - r reconciler - ) - - JustBeforeEach(func() { - scheme = runtime.NewScheme() - addToScheme(scheme) - fakeClient = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build() - r = reconciler{ - registry: fakeRegistry, - ctx: context.Background(), - client: fakeClient, - log: ctrllog.Log, - scheme: scheme, - compatibilityMetadataImage: "", - } - }) - - When("new BOM ConfigMaps are added", func() { - var ( - cm1, cm2, cmMeta *corev1.ConfigMap - err error - ) - - BeforeEach(func() { - cm1 = newConfigMap(version11810, map[string]string{constants.BomConfigMapTKRLabel: version11810}, map[string]string{constants.BomConfigMapImageTagAnnotation: "bom-v1.18.10+vmware.1"}, bomContent18) - cm2 = newConfigMap(version1193, map[string]string{constants.BomConfigMapTKRLabel: version1193}, map[string]string{constants.BomConfigMapImageTagAnnotation: "bom-v1.19.3+vmware.1"}, bomContent193) - tkr1 := existingTkrFromBom(version11810, bomContent18) - mgmtCluster := newManagementCluster(map[string]string{constants.ManagementClusterRoleLabel: ""}, map[string]string{constants.TKGVersionKey: "v1.1"}) - cmMeta = newMetadataConfigMap(metadataContent) - - objects = []runtime.Object{mgmtCluster, cmMeta, cm1, cm2, &tkr1} - }) - - It("should create the corresponding TKRs", func() { - _, err = r.Reconcile(r.ctx, req(cm2)) - Expect(err).ToNot(HaveOccurred()) - _, err = r.Reconcile(r.ctx, req(cmMeta)) - Expect(err).ToNot(HaveOccurred()) - - tkrList := &runv1.TanzuKubernetesReleaseList{} - Expect(r.client.List(r.ctx, tkrList)).To(Succeed()) - Expect(tkrList.Items).To(HaveLen(2)) - - found1193 := false - for i := range tkrList.Items { - tkr := &tkrList.Items[i] - if tkr.Name == "v1.19.3---vmware.1" { - found1193 = true - status, _ := getConditionStatusAndMessage(tkr.Status.Conditions, runv1.ConditionCompatible) - Expect(status).To(Equal(corev1.ConditionFalse)) - continue - } - status, _ := getConditionStatusAndMessage(tkr.Status.Conditions, runv1.ConditionCompatible) - Expect(status).To(Equal(corev1.ConditionTrue)) - } - Expect(found1193).To(BeTrue()) - - }) - }) - - When("a TKR already exists for the BOM ConfigMap", func() { - var ( - cm1, cm2 *corev1.ConfigMap - err error - ) - - BeforeEach(func() { - cm1 = newConfigMap(version11713, map[string]string{constants.BomConfigMapTKRLabel: version11713}, map[string]string{constants.BomConfigMapImageTagAnnotation: "bom-v1.17.13+vmware.1"}, bomContent17) - cm2 = newConfigMap(version1193, map[string]string{constants.BomConfigMapTKRLabel: version1193}, map[string]string{constants.BomConfigMapImageTagAnnotation: "bom-v1.19.3+vmware.1"}, bomContent193) - tkr1 := existingTkrFromBom(version11713, bomContent17) - mgmtCluster := newManagementCluster(map[string]string{constants.ManagementClusterRoleLabel: ""}, map[string]string{constants.TKGVersionKey: "v1.1"}) - cmMeta := newMetadataConfigMap(metadataContent) - - objects = []runtime.Object{mgmtCluster, cmMeta, cm1, cm2, &tkr1} - }) - - It("should not return an error", func() { - _, err = r.Reconcile(r.ctx, req(cm1)) - Expect(err).ToNot(HaveOccurred()) - - tkrList := &runv1.TanzuKubernetesReleaseList{} - Expect(r.client.List(r.ctx, tkrList)).To(Succeed()) - Expect(tkrList.Items).To(HaveLen(1)) - }) - }) - - When("a TKR cannot be created for the BOM ConfigMap", func() { - var ( - cm1, cm2 *corev1.ConfigMap - err error - ) - - BeforeEach(func() { - cm1 = newConfigMap(version11713, map[string]string{constants.BomConfigMapTKRLabel: version11713}, map[string]string{constants.BomConfigMapImageTagAnnotation: "bom-v1.17.13+vmware.1"}, bomContent17) - cm2 = newConfigMap(version1193, map[string]string{constants.BomConfigMapTKRLabel: version1193}, map[string]string{constants.BomConfigMapImageTagAnnotation: "bom-v1.19.3+vmware.1"}, bomContent193) - mgmtCluster := newManagementCluster(map[string]string{constants.ManagementClusterRoleLabel: ""}, map[string]string{constants.TKGVersionKey: "v1.1"}) - cmMeta := newMetadataConfigMap(metadataContent) - - delete(cm1.BinaryData, constants.BomConfigMapContentKey) - delete(cm2.Labels, constants.BomConfigMapTKRLabel) - - objects = []runtime.Object{mgmtCluster, cmMeta, cm1, cm2} - }) - - It("should not return an error, and TKR is not created", func() { - _, err = r.Reconcile(r.ctx, req(cm1)) - Expect(err).ToNot(HaveOccurred()) - _, err = r.Reconcile(r.ctx, req(cm2)) - Expect(err).ToNot(HaveOccurred()) - - tkrList := &runv1.TanzuKubernetesReleaseList{} - Expect(r.client.List(r.ctx, tkrList)).To(Succeed()) - Expect(tkrList.Items).To(HaveLen(0)) // no TKRs created - }) - }) - - When("reconciling the BOM metadata ConfigMap", func() { - var ( - cm1, cmMeta *corev1.ConfigMap - err error - ) - - BeforeEach(func() { - cm1 = newConfigMap(version11713, map[string]string{constants.BomConfigMapTKRLabel: version11713}, map[string]string{constants.BomConfigMapImageTagAnnotation: "bom-v1.17.13+vmware.1"}, bomContent17) - tkr1 := existingTkrFromBom(version11713, bomContent17) - conditions.MarkFalse(&tkr1, runv1.ConditionCompatible, "", capi.ConditionSeverityInfo, "") - mgmtCluster := newManagementCluster(map[string]string{constants.ManagementClusterRoleLabel: ""}, map[string]string{constants.TKGVersionKey: "v1.1"}) - cmMeta = newMetadataConfigMap(metadataContent) - - objects = []runtime.Object{mgmtCluster, cmMeta, cm1, &tkr1} - }) - - When("management cluster is in place", func() { - It("should not return an error", func() { - _, err = r.Reconcile(r.ctx, req(cmMeta)) - Expect(err).ToNot(HaveOccurred()) - - tkrList := &runv1.TanzuKubernetesReleaseList{} - Expect(r.client.List(r.ctx, tkrList)).To(Succeed()) - Expect(tkrList.Items).To(HaveLen(1)) - Expect(conditions.IsTrue(&tkrList.Items[0], runv1.ConditionCompatible)).To(BeTrue()) - }) - }) - - When("there's an error getting the management cluster info", func() { - expectedErr := errors.New("this is a bad day for clusters") - - JustBeforeEach(func() { - r.client = clientErrOnGetCluster{Client: r.client, err: expectedErr} - }) - - It("should return that error, so reconciliation would be retried", func() { - _, err := r.Reconcile(r.ctx, req(cmMeta)) - Expect(err).To(HaveOccurred()) - Expect(errors.Cause(err)).To(Equal(expectedErr)) - }) - }) - }) - - When("BOM metadata ConfigMap cannot be obtained", func() { - var ( - cm1, cm2 *corev1.ConfigMap - err error - ) - - BeforeEach(func() { - cm1 = newConfigMap(version11713, map[string]string{constants.BomConfigMapTKRLabel: version11713}, map[string]string{constants.BomConfigMapImageTagAnnotation: "bom-v1.17.13+vmware.1"}, bomContent17) - cm2 = newConfigMap(version1193, map[string]string{constants.BomConfigMapTKRLabel: version1193}, map[string]string{constants.BomConfigMapImageTagAnnotation: "bom-v1.19.3+vmware.1"}, bomContent193) - tkr1 := existingTkrFromBom(version11713, bomContent17) - mgmtCluster := newManagementCluster(map[string]string{constants.ManagementClusterRoleLabel: ""}, map[string]string{constants.TKGVersionKey: "v1.1"}) - - objects = []runtime.Object{mgmtCluster, cm1, cm2, &tkr1} - }) - - It("should still create the TKRs, but with default status conditions", func() { - _, err = r.Reconcile(r.ctx, req(cm2)) - Expect(err).ToNot(HaveOccurred()) - - tkrList := &runv1.TanzuKubernetesReleaseList{} - Expect(r.client.List(r.ctx, tkrList)).To(Succeed()) - Expect(tkrList.Items).To(HaveLen(2)) - - for i := range tkrList.Items { - tkr := &tkrList.Items[i] - condition := conditions.Get(tkr, runv1.ConditionCompatible) - Expect(condition == nil || condition.Status == corev1.ConditionUnknown || condition.Status == corev1.ConditionFalse).To(BeTrue()) - } - }) - }) -}) - -var _ = Describe("r.compatibilityMetadata()", func() { - var ( - fakeRegistry *fakes.Registry - fakeClient client.Client - scheme *runtime.Scheme - objects []runtime.Object - r reconciler - ) - - JustBeforeEach(func() { - scheme = runtime.NewScheme() - addToScheme(scheme) - fakeClient = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build() - r = reconciler{ - registry: fakeRegistry, - ctx: context.Background(), - client: fakeClient, - log: ctrllog.Log, - scheme: scheme, - compatibilityMetadataImage: "", - } - }) - - BeforeEach(func() { - fakeRegistry = &fakes.Registry{} - fakeRegistry.ListImageTagsReturnsOnCall(0, []string{"v1"}, nil) - fakeRegistry.GetFileReturnsOnCall(0, metadataContent, nil) - }) - - It("should correctly parse bom-metadata", func() { - err := r.reconcileBOMMetadataCM(r.ctx) - Expect(err).ToNot(HaveOccurred()) - - cm := &corev1.ConfigMap{} - Expect(r.client.Get(r.ctx, - client.ObjectKey{Namespace: constants.TKRNamespace, Name: constants.BOMMetadataConfigMapName}, - cm)).To(Succeed()) - Expect(normalizeYAML(cm.BinaryData[constants.BOMMetadataCompatibilityKey])).To(Equal(normalizeYAML(metadataContent))) - - compatibilityMetadata, err := r.compatibilityMetadata(r.ctx) - Expect(err).ToNot(HaveOccurred()) - Expect(compatibilityMetadata.ManagementClusterVersions).ToNot(BeEmpty()) - }) -}) - -type clientErrOnGetCluster struct { - client.Client - err error -} - -func (c clientErrOnGetCluster) Get(ctx context.Context, key client.ObjectKey, obj client.Object) error { - if _, ok := obj.(*capi.Cluster); !ok { - return c.err - } - return c.Client.Get(ctx, key, obj) -} - -var _ = Describe("errorSlice.Error()", func() { - err := errorSlice{errors.New("one"), errors.New("two"), errors.New("three")} - Expect(err.Error()).To(Equal("one, two, three")) - Expect(errorSlice{}.Error()).To(Equal("")) -}) - -func req(o metav1.Object) ctrl.Request { - return ctrl.Request{NamespacedName: client.ObjectKey{Namespace: o.GetNamespace(), Name: o.GetName()}} -} - -func getConditionStatusAndMessage(conditions []capi.Condition, conditionType capi.ConditionType) (corev1.ConditionStatus, string) { - for _, condition := range conditions { - if condition.Type == conditionType { - return condition.Status, condition.Message - } - } - return "", "" -} - -func newConfigMap(name string, labels, annotations map[string]string, content []byte) *corev1.ConfigMap { - return &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: constants.TKRNamespace, - Labels: labels, - Annotations: annotations, - }, - BinaryData: map[string][]byte{constants.BomConfigMapContentKey: content}, - } -} - -func newMetadataConfigMap(content []byte) *corev1.ConfigMap { - return &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.BOMMetadataConfigMapName, - Namespace: constants.TKRNamespace, - }, - BinaryData: map[string][]byte{constants.BOMMetadataCompatibilityKey: content}, - } -} - -func newManagementCluster(labels, annotations map[string]string) *capi.Cluster { - return &capi.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: "mgmt-cluster", - Namespace: constants.TKGNamespace, - Labels: labels, - Annotations: annotations, - }, - } -} - -// uidSetter emulates real clusters' behavior of setting UIDs on objects being created -type uidSetter struct { - client.Client -} - -func (u uidSetter) Create(ctx context.Context, obj client.Object, opts ...client.CreateOption) error { - obj.(metav1.Object).SetUID(uuid.NewUUID()) - return u.Client.Create(ctx, obj, opts...) -} - -// existingTkrFromBom produces a fake pre-existing TKR accessible via a fake client. -func existingTkrFromBom(tkrName string, bomContent []byte) runv1.TanzuKubernetesRelease { - tkr, _ := NewTkrFromBom(tkrName, bomContent) - tkr.UID = uuid.NewUUID() - return tkr -} diff --git a/pkg/v1/tkr/controllers/source/test_helper.go b/pkg/v1/tkr/controllers/source/test_helper.go deleted file mode 100644 index e19c61ad44..0000000000 --- a/pkg/v1/tkr/controllers/source/test_helper.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package source - -import "sigs.k8s.io/yaml" - -func normalizeYAML(content []byte) string { - var parsed map[string]interface{} - err := yaml.Unmarshal(content, &parsed) - if err != nil { - panic(err) - } - bytes, err := yaml.Marshal(parsed) - if err != nil { - panic(err) - } - return string(bytes) -} diff --git a/pkg/v1/tkr/controllers/source/tkr_source_controller.go b/pkg/v1/tkr/controllers/source/tkr_source_controller.go deleted file mode 100644 index 1a6d0daeac..0000000000 --- a/pkg/v1/tkr/controllers/source/tkr_source_controller.go +++ /dev/null @@ -1,568 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package source - -import ( - "context" - "fmt" - "os" - "sort" - "strconv" - "strings" - "time" - - "github.com/go-logr/logr" - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - types2 "k8s.io/apimachinery/pkg/types" - kerrors "k8s.io/apimachinery/pkg/util/errors" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/conditions" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/builder" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/event" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/predicate" - "sigs.k8s.io/controller-runtime/pkg/reconcile" - "sigs.k8s.io/controller-runtime/pkg/source" - "sigs.k8s.io/yaml" - - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/constants" - mgrcontext "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/context" - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/registry" - "github.com/vmware-tanzu/tanzu-framework/util/patchset" -) - -// TanzuKubernetesReleaseReconciler reconciles a TanzuKubernetesRelease object -type reconciler struct { - ctx context.Context - client client.Client - log logr.Logger - scheme *runtime.Scheme - options mgrcontext.TanzuKubernetesReleaseDiscoverOptions - bomImage string - compatibilityMetadataImage string - registry registry.Registry - registryOps ctlimg.Opts -} - -// Reconcile performs the reconciliation step -func (r *reconciler) Reconcile(ctx context.Context, req ctrl.Request) (result reconcile.Result, retErr error) { - ps := patchset.New(r.client) - defer func() { - // apply patches unless an error is being returned - if retErr != nil { - return - } - if err := ps.Apply(ctx); err != nil { - if err = kerrors.FilterOut(err, apierrors.IsConflict); err == nil { - // retry if someone updated an object we wanted to patch - result = ctrl.Result{Requeue: true} - } - retErr = errors.Wrap(err, "applying patches to TKRs") - } - }() - - configMap := &corev1.ConfigMap{} - if err := r.client.Get(ctx, types2.NamespacedName{Namespace: req.Namespace, Name: req.Name}, configMap); err != nil { - if apierrors.IsNotFound(err) { - return ctrl.Result{}, nil // do nothing if the ConfigMap does not exist - } - return ctrl.Result{}, err - } - r.log.Info("reconciling CM", "ns", req.Namespace, "name", req.Name) - if configMap.Name == constants.BOMMetadataConfigMapName { - return ctrl.Result{}, r.updateConditions(ctx, ps) - } - - return ctrl.Result{}, r.reconcileConfigMap(ctx, configMap) -} - -func (r *reconciler) reconcileConfigMap(ctx context.Context, configMap *corev1.ConfigMap) error { - tkr, err := tkrFromConfigMap(configMap) - if err != nil { - r.log.Error(err, "Could not create TKR from ConfigMap", "ConfigMap", configMap.Name) - return nil // no need to retry: if the ConfigMap changes, we'll get called - } - if tkr == nil { - return nil // no need to retry: no TKR in this ConfigMap - } - - existingTKR := &runv1.TanzuKubernetesRelease{} - if err := r.client.Get(ctx, client.ObjectKey{Name: tkr.Name}, existingTKR); err != nil { - if apierrors.IsNotFound(err) { - if err := r.client.Create(ctx, tkr); err != nil { - if apierrors.IsAlreadyExists(err) { - return nil // the TKR already exists, we're done. - } - return errors.Wrapf(err, "could not create TKR: ConfigMap.name='%s'", configMap.Name) - } - return nil - } - return errors.Wrapf(err, "could not get TKR: ConfigMap.name='%s'", configMap.Name) - } - - return nil -} - -func tkrFromConfigMap(configMap *corev1.ConfigMap) (*runv1.TanzuKubernetesRelease, error) { - tkrName, labelOK := configMap.ObjectMeta.Labels[constants.BomConfigMapTKRLabel] - if !labelOK { - return nil, nil // not interested in ConfigMaps without this label - } - - bomContent, ok := configMap.BinaryData[constants.BomConfigMapContentKey] - if !ok { - return nil, errors.New("failed to get the BOM file content from the BOM ConfigMap") - } - - newTkr, err := NewTkrFromBom(tkrName, bomContent) - if err != nil { - return nil, errors.Wrap(err, "failed to generate TKR from BOM ConfigMap") - } - - return &newTkr, nil -} - -func (r *reconciler) updateConditions(ctx context.Context, ps patchset.PatchSet) error { - tkrList := &runv1.TanzuKubernetesReleaseList{} - if err := r.client.List(ctx, tkrList); err != nil { - return errors.Wrap(err, "could not list TKRs") - } - - for i := range tkrList.Items { - ps.Add(&tkrList.Items[i]) - } - - if err := r.UpdateTKRCompatibleCondition(ctx, tkrList.Items); err != nil { - return errors.Wrap(err, "failed to update Compatible condition for TKRs") - } - - r.UpdateTKRUpdatesAvailableCondition(tkrList.Items) - - return nil -} - -// AddToManager adds this package's controller to the provided manager. -func AddToManager(ctx *mgrcontext.ControllerManagerContext, mgr ctrl.Manager) error { - r := newReconciler(ctx) - if err := mgr.Add(r); err != nil { - return err - } - return ctrl.NewControllerManagedBy(mgr). - For(&corev1.ConfigMap{}, builder.WithPredicates(eventFilter(func(eventMeta metav1.Object) bool { - return eventMeta.GetNamespace() == constants.TKRNamespace && eventMeta.GetName() != constants.TKRControllerLeaderElectionCM - }))). // we're watching ConfigMaps and producing TKRs - Watches(&source.Kind{Type: &runv1.TanzuKubernetesRelease{}}, handler.EnqueueRequestsFromMapFunc(watchTKRs)). - Watches(&source.Kind{Type: &clusterv1.Cluster{}}, handler.EnqueueRequestsFromMapFunc(watchMgmtCluster)). - Named("tkr-source-controller"). - Complete(r) -} - -// watchTKRs returns reconcile.Request for bom-metadata ConfigMap reacting to TKR updates, -// which should affect TKR Compatible and UpdatesAvailable conditions. -func watchTKRs(client.Object) []reconcile.Request { - return []reconcile.Request{{NamespacedName: client.ObjectKey{ - Namespace: constants.TKRNamespace, - Name: constants.BOMMetadataConfigMapName, - }}} -} - -// watchMgmtCluster returns reconcile.Request for bom-metadata ConfigMap reacting to mgmt Cluster updates, -// which should affect TKR Compatible and UpdatesAvailable conditions. -func watchMgmtCluster(o client.Object) []reconcile.Request { - labels := o.GetLabels() - if labels == nil { - return nil - } - if _, exists := labels[constants.ManagementClusterRoleLabel]; exists { - return []reconcile.Request{{NamespacedName: client.ObjectKey{ - Namespace: constants.TKRNamespace, - Name: constants.BOMMetadataConfigMapName, - }}} - } - return nil -} - -func eventFilter(p func(eventMeta metav1.Object) bool) *predicate.Funcs { - return &predicate.Funcs{ - CreateFunc: func(createEvent event.CreateEvent) bool { - return p(createEvent.Object) - }, - DeleteFunc: func(deleteEvent event.DeleteEvent) bool { - return p(deleteEvent.Object) - }, - UpdateFunc: func(updateEvent event.UpdateEvent) bool { - return p(updateEvent.ObjectOld) - }, - GenericFunc: func(genericEvent event.GenericEvent) bool { - return p(genericEvent.Object) - }, - } -} - -// +kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=tanzukubernetesreleases,verbs=get;list;watch;create;update;patch;delete -// +kubebuilder:rbac:groups=run.tanzu.vmware.com,resources=tanzukubernetesreleases/status,verbs=get;update;patch - -func (r *reconciler) createBOMConfigMap(ctx context.Context, tag string) error { - r.log.Info("Fetching BOM", "image", r.bomImage, "tag", tag) - bomContent, err := r.registry.GetFile(fmt.Sprintf("%s:%s", r.bomImage, tag), "") - if err != nil { - return errors.Wrapf(err, "failed to get the BOM file from image %s:%s", r.bomImage, tag) - } - - bom, err := tkrv1.NewBom(bomContent) - if err != nil { - return errors.Wrapf(err, "failed to parse content from image %s:%s", r.bomImage, tag) - } - - releaseName, err := bom.GetReleaseVersion() - if err != nil || releaseName == "" { - return errors.Wrapf(err, "failed to get the release version from BOM image %s:%s", r.bomImage, tag) - } - - name := strings.ReplaceAll(releaseName, "+", "---") - - // label the ConfigMap with image tag and tkr name - labels := make(map[string]string) - labels[constants.BomConfigMapTKRLabel] = name - - annotations := make(map[string]string) - annotations[constants.BomConfigMapImageTagAnnotation] = tag - - binaryData := make(map[string][]byte) - binaryData[constants.BomConfigMapContentKey] = bomContent - - cm := corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: constants.TKRNamespace, - Labels: labels, - Annotations: annotations, - }, - BinaryData: binaryData, - } - - if err := r.client.Create(ctx, &cm); err != nil && !apierrors.IsAlreadyExists(err) { - return errors.Wrapf(err, "could not create ConfigMap: name='%s'", cm.Name) - } - return nil -} - -func (r *reconciler) reconcileBOMMetadataCM(ctx context.Context) error { - metadata, err := r.fetchCompatibilityMetadata() - if err != nil { - return err - } - - metadataContent, err := yaml.Marshal(metadata) - if err != nil { - return err - } - - cm := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: constants.TKRNamespace, - Name: constants.BOMMetadataConfigMapName, - }, - } - - _, err = controllerutil.CreateOrUpdate(ctx, r.client, cm, func() error { - cm.BinaryData = map[string][]byte{ - constants.BOMMetadataCompatibilityKey: metadataContent, - } - return nil - }) - - return errors.Wrap(err, "error creating or updating BOM metadata ConfigMap") -} - -func (r *reconciler) reconcileBOMConfigMap(ctx context.Context) error { - r.log.Info("Listing BOM image tags", "image", r.bomImage) - imageTags, err := r.registry.ListImageTags(r.bomImage) - if err != nil { - return errors.Wrap(err, "failed to list current available BOM image tags") - } - tagMap := make(map[string]bool) - for _, tag := range imageTags { - tagMap[tag] = false - } - - cmList := &corev1.ConfigMapList{} - if err := r.client.List(ctx, cmList, &client.ListOptions{Namespace: constants.TKRNamespace}); err != nil { - return errors.Wrap(err, "failed to get BOM ConfigMaps") - } - - for i := range cmList.Items { - if imageTag, ok := cmList.Items[i].ObjectMeta.Annotations[constants.BomConfigMapImageTagAnnotation]; ok { - if _, ok := tagMap[imageTag]; ok { - tagMap[imageTag] = true - } - } - } - var errs errorSlice - for tag, exist := range tagMap { - if !exist { - if err := r.createBOMConfigMap(ctx, tag); err != nil { - errs = append(errs, errors.Wrapf(err, "failed to create BOM ConfigMap for image %s", fmt.Sprintf("%s:%s", r.bomImage, tag))) - } - } - } - if len(errs) != 0 { - return errs - } - - r.log.Info("Done reconciling BOM images", "image", r.bomImage) - return nil -} - -func changeTKRCondition(tkr *runv1.TanzuKubernetesRelease, conditionType string, status corev1.ConditionStatus, message string) { - newCondition := &clusterv1.Condition{ - Type: clusterv1.ConditionType(conditionType), - Status: status, - Message: message, - } - conditions.Set(tkr, newCondition) -} - -func (r *reconciler) UpdateTKRUpdatesAvailableCondition(tkrs []runv1.TanzuKubernetesRelease) { - for i := range tkrs { - upgradeTo := []string{} - for j := range tkrs { - if upgradeQualified(&tkrs[i], &tkrs[j]) { - upgradeTo = append(upgradeTo, tkrs[j].Spec.Version) - } - } - if len(upgradeTo) != 0 { - msg := fmt.Sprintf("[%s]", strings.Join(upgradeTo, " ")) - changeTKRCondition(&tkrs[i], runv1.ConditionUpdatesAvailable, corev1.ConditionTrue, msg) - } else { - changeTKRCondition(&tkrs[i], runv1.ConditionUpdatesAvailable, corev1.ConditionFalse, "") - } - - if hasDeprecateUpgradeAvailableCondition(tkrs[i].Status.Conditions) { - if len(upgradeTo) != 0 { - msg := fmt.Sprintf("Deprecated, TKR(s) with later version is available: %s", strings.Join(upgradeTo, ",")) - changeTKRCondition(&tkrs[i], runv1.ConditionUpgradeAvailable, corev1.ConditionTrue, msg) - } else { - changeTKRCondition(&tkrs[i], runv1.ConditionUpgradeAvailable, corev1.ConditionFalse, "Deprecated") - } - } - } -} - -func (r *reconciler) UpdateTKRCompatibleCondition(ctx context.Context, tkrs []runv1.TanzuKubernetesRelease) error { - // TODO: reconcile compatible status based on compatibility metadata - - compatibleSet := make(map[string]struct{}) - defer func() { // update conditions no matter what - for i := range tkrs { - if _, ok := compatibleSet[tkrs[i].Spec.Version]; ok { - changeTKRCondition(&tkrs[i], runv1.ConditionCompatible, corev1.ConditionTrue, "") - } else { - changeTKRCondition(&tkrs[i], runv1.ConditionCompatible, corev1.ConditionFalse, "") - } - } - }() - - mgmtClusterVersion, err := r.GetManagementClusterVersion(ctx) - if err != nil { - return errors.Wrap(err, "failed to get the management cluster info") - } - - metadata, err := r.compatibilityMetadata(ctx) - if err != nil { - return errors.Wrapf(err, "failed to get BOM compatibility metadata") - } - - compatibleReleases := []string{} - for _, mgmtVersion := range metadata.ManagementClusterVersions { - if mgmtClusterVersion == mgmtVersion.TKGVersion { - compatibleReleases = mgmtVersion.SupportedKubernetesVersions - } - } - - for _, r := range compatibleReleases { - compatibleSet[r] = struct{}{} - } - - return nil -} - -func (r *reconciler) fetchCompatibilityMetadata() (*tkrv1.CompatibilityMetadata, error) { - r.log.Info("Listing BOM metadata image tags", "image", r.compatibilityMetadataImage) - tags, err := r.registry.ListImageTags(r.compatibilityMetadataImage) - if err != nil { - return nil, errors.Wrap(err, "failed to list compatibility metadata image tags") - } - if len(tags) == 0 { - return nil, errors.New("no compatibility metadata image tags found") - } - - tagNum := []int{} - for _, tag := range tags { - ver, err := strconv.Atoi(strings.TrimPrefix(tag, "v")) - if err == nil { - tagNum = append(tagNum, ver) - } - } - - sort.Ints(tagNum) - - metadataContent := []byte{} - var metadata tkrv1.CompatibilityMetadata - - for i := len(tagNum) - 1; i >= 0; i-- { - tagName := fmt.Sprintf("v%d", tagNum[i]) - r.log.Info("Fetching BOM metadata image", "image", r.compatibilityMetadataImage, "tag", tagName) - metadataContent, err = r.registry.GetFile(fmt.Sprintf("%s:%s", r.compatibilityMetadataImage, tagName), "") - if err == nil { - if err = yaml.Unmarshal(metadataContent, &metadata); err == nil { - break - } - r.log.Error(err, "Failed to unmarshal TKR compatibility metadata file", "image", fmt.Sprintf("%s:%s", r.compatibilityMetadataImage, tagName)) - } else { - r.log.Error(err, "Failed to retrieve TKR compatibility metadata image content", "image", fmt.Sprintf("%s:%s", r.compatibilityMetadataImage, tagName)) - } - } - - if len(metadataContent) == 0 { - return nil, errors.New("failed to fetch TKR compatibility metadata") - } - - return &metadata, nil -} - -func (r *reconciler) compatibilityMetadata(ctx context.Context) (*tkrv1.CompatibilityMetadata, error) { - cm := &corev1.ConfigMap{} - cmObjectKey := client.ObjectKey{Namespace: constants.TKRNamespace, Name: constants.BOMMetadataConfigMapName} - if err := r.client.Get(ctx, cmObjectKey, cm); err != nil { - return nil, err - } - - metadataContent, ok := cm.BinaryData[constants.BOMMetadataCompatibilityKey] - if !ok { - return nil, errors.New("compatibility key not found in bom-metadata ConfigMap") - } - - var metadata tkrv1.CompatibilityMetadata - if err := yaml.Unmarshal(metadataContent, &metadata); err != nil { - return nil, err - } - return &metadata, nil -} - -func (r *reconciler) SyncRelease(ctx context.Context) error { - select { - case <-ctx.Done(): - return errors.New("canceled") - default: - } - - // create/update bom-metadata ConfigMap - if err := r.reconcileBOMMetadataCM(ctx); err != nil { - // not returning: even if we fail to get BOM metadata, we still want to reconcile BOM ConfigMaps - r.log.Error(err, "Failed to reconcile BOM metadata ConfigMap") - } - // create BOM ConfigMaps for new images - err := r.reconcileBOMConfigMap(ctx) - return errors.Wrap(err, "failed to reconcile BOM ConfigMaps") -} - -func (r *reconciler) initialReconcile(ctx context.Context, frequency time.Duration, retries int) { - for { - if err := r.SyncRelease(ctx); err != nil { - r.log.Error(err, "Failed to complete initial TKR discovery") - retries-- - if retries <= 0 { - return - } - - r.log.Info("Failed to complete initial TKR discovery, retrying") - select { - case <-ctx.Done(): - r.log.Info("Stop performing initial TKR discovery") - return - case <-time.After(frequency): - continue - } - } - return - } -} - -func (r *reconciler) tkrDiscovery(ctx context.Context, frequency time.Duration) { - for { - if err := r.SyncRelease(ctx); err != nil { - r.log.Error(err, "Failed to reconcile TKRs, retrying") - } - select { - case <-ctx.Done(): - r.log.Info("Stop performing TKR discovery") - return - case <-time.After(frequency): - } - } -} - -func (r *reconciler) Start(ctx context.Context) error { - var err error - r.log.Info("Starting TanzuKubernetesReleaase Reconciler") - - r.log.Info("Performing configuration setup") - err = r.Configure() - if err != nil { - return errors.Wrap(err, "failed to configure the controller") - } - - // Add custom CA cert paths only if VerifyCerts is enabled - if r.registryOps.VerifyCerts { - registryCertPath, err := getRegistryCertFile() - if err == nil { - if _, err = os.Stat(registryCertPath); err == nil { - r.registryOps.CACertPaths = []string{registryCertPath} - } - } - } - - r.registry, err = registry.New(&r.registryOps) - if err != nil { - return err - } - - r.log.Info("Performing an initial release discovery") - r.initialReconcile(ctx, r.options.InitialDiscoveryFrequency, InitialDiscoveryRetry) - - r.log.Info("Initial TKR discovery completed") - - r.tkrDiscovery(ctx, r.options.ContinuousDiscoveryFrequency) - - r.log.Info("Stopping Tanzu Kubernetes release Reconciler") - return nil -} - -func newReconciler(ctx *mgrcontext.ControllerManagerContext) *reconciler { - regOpts := ctlimg.Opts{ - VerifyCerts: ctx.VerifyRegistryCert, - Anon: true, - } - return &reconciler{ - ctx: ctx.Context, - client: ctx.Client, - log: ctx.Logger, - scheme: ctx.Scheme, - options: ctx.TKRDiscoveryOption, - registryOps: regOpts, - bomImage: ctx.BOMImagePath, - compatibilityMetadataImage: ctx.BOMMetadataImagePath, - } -} diff --git a/pkg/v1/tkr/fakes/boms/bad-bom.yaml b/pkg/v1/tkr/fakes/boms/bad-bom.yaml deleted file mode 100644 index 534f4eda46..0000000000 --- a/pkg/v1/tkr/fakes/boms/bad-bom.yaml +++ /dev/null @@ -1,4 +0,0 @@ -release: - version: "" -imageConfig: - imageRepository: registry.tkg.vmware.run diff --git a/pkg/v1/tkr/fakes/boms/bom-v1.17.13+vmware.1.yaml b/pkg/v1/tkr/fakes/boms/bom-v1.17.13+vmware.1.yaml deleted file mode 100644 index 565b0987b1..0000000000 --- a/pkg/v1/tkr/fakes/boms/bom-v1.17.13+vmware.1.yaml +++ /dev/null @@ -1,44 +0,0 @@ -release: - version: v1.17.13+vmware.1 -components: - kubernetes: - - version: v1.17.13+vmware.1 - images: - image1: - imagePath: somerepo/someimage - tag: "latest" - image2: - imagePath: anotherrepo/someimage - tag: "latest" -imageConfig: - imageRepository: registry.tkg.vmware.run -ova: - - name: photon_ova - osinfo: - name: "photonos" - version: "1.1" - arch: "amd64" - version: "v1.19.3+vmware.1" - metadata: - ANY_NAME: ANY_INTERFACE -ami: - ap-northeast-1: - - id: ami-0b3606365e3b9dc63 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE -azure: - - publisher: vmware-inc - offer: tkg-capi - sku: k8s-1dot19dot3-ubuntu-1804 - version: "2020.11.05" - thirdPartyImage: true - osinfo: - name: "windows" - version: "10.1706" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE diff --git a/pkg/v1/tkr/fakes/boms/bom-v1.18.10+vmware.1.yaml b/pkg/v1/tkr/fakes/boms/bom-v1.18.10+vmware.1.yaml deleted file mode 100644 index 10643f1bb5..0000000000 --- a/pkg/v1/tkr/fakes/boms/bom-v1.18.10+vmware.1.yaml +++ /dev/null @@ -1,44 +0,0 @@ -release: - version: v1.18.10+vmware.1 -components: - kubernetes: - - version: v1.18.10+vmware.1 - images: - image1: - imagePath: somerepo/someimage - tag: "latest" - image2: - imagePath: anotherrepo/someimage - tag: "latest" -imageConfig: - imageRepository: registry.tkg.vmware.run -ova: - - name: photon_ova - osinfo: - name: "photonos" - version: "1.1" - arch: "amd64" - version: "v1.19.3+vmware.1" - metadata: - ANY_NAME: ANY_INTERFACE -ami: - ap-northeast-1: - - id: ami-0b3606365e3b9dc63 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE -azure: - - publisher: vmware-inc - offer: tkg-capi - sku: k8s-1dot19dot3-ubuntu-1804 - version: "2020.11.05" - thirdPartyImage: true - osinfo: - name: "windows" - version: "10.1706" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE diff --git a/pkg/v1/tkr/fakes/boms/bom-v1.19.1+vmware.1.yaml b/pkg/v1/tkr/fakes/boms/bom-v1.19.1+vmware.1.yaml deleted file mode 100644 index 239641708f..0000000000 --- a/pkg/v1/tkr/fakes/boms/bom-v1.19.1+vmware.1.yaml +++ /dev/null @@ -1,44 +0,0 @@ -release: - version: v1.19.1+vmware.1 -components: - kubernetes: - - version: v1.19.1+vmware.1 - images: - image1: - imagePath: somerepo/someimage - tag: "latest" - image2: - imagePath: anotherrepo/someimage - tag: "latest" -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -ova: - - name: photon_ova - osinfo: - name: "photonos" - version: "1.1" - arch: "amd64" - version: "v1.19.3+vmware.1" - metadata: - ANY_NAME: ANY_INTERFACE -ami: - ap-northeast-1: - - id: ami-0b3606365e3b9dc63 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE -azure: - - publisher: vmware-inc - offer: tkg-capi - sku: k8s-1dot19dot3-ubuntu-1804 - version: "2020.11.05" - thirdPartyImage: true - osinfo: - name: "windows" - version: "10.1706" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE diff --git a/pkg/v1/tkr/fakes/boms/bom-v1.19.3+vmware.1.yaml b/pkg/v1/tkr/fakes/boms/bom-v1.19.3+vmware.1.yaml deleted file mode 100644 index a20934d73d..0000000000 --- a/pkg/v1/tkr/fakes/boms/bom-v1.19.3+vmware.1.yaml +++ /dev/null @@ -1,44 +0,0 @@ -release: - version: v1.19.3+vmware.1 -components: - kubernetes: - - version: v1.19.3+vmware.1 - images: - image1: - imagePath: somerepo/someimage - tag: "latest" - image2: - imagePath: anotherrepo/someimage - tag: "latest" -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -ova: - - name: photon_ova - osinfo: - name: "photonos" - version: "1.1" - arch: "amd64" - version: "v1.19.3+vmware.1" - metadata: - ANY_NAME: ANY_INTERFACE -ami: - ap-northeast-1: - - id: ami-0b3606365e3b9dc63 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE -azure: - - publisher: vmware-inc - offer: tkg-capi - sku: k8s-1dot19dot3-ubuntu-1804 - version: "2020.11.05" - thirdPartyImage: true - osinfo: - name: "windows" - version: "10.1706" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE diff --git a/pkg/v1/tkr/fakes/boms/bom-v1.20.5+vmware.1.yaml b/pkg/v1/tkr/fakes/boms/bom-v1.20.5+vmware.1.yaml deleted file mode 100644 index 9591d1ec59..0000000000 --- a/pkg/v1/tkr/fakes/boms/bom-v1.20.5+vmware.1.yaml +++ /dev/null @@ -1,44 +0,0 @@ -release: - version: v1.20.5+vmware.1 -components: - kubernetes: - - version: v1.20.5+vmware.1 - images: - image1: - imagePath: somerepo/someimage - tag: "latest" - image2: - imagePath: anotherrepo/someimage - tag: "latest" -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -ova: - - name: photon_ova - osinfo: - name: "photonos" - version: "1.1" - arch: "amd64" - version: "v1.20.5+vmware.1" - metadata: - ANY_NAME: ANY_INTERFACE -ami: - ap-northeast-1: - - id: ami-0b3606365e3b9dc63 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE -azure: - - publisher: vmware-inc - offer: tkg-capi - sku: k8s-1dot20dot5-ubuntu-1804 - version: "2020.11.05" - thirdPartyImage: true - osinfo: - name: "windows" - version: "10.1706" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE diff --git a/pkg/v1/tkr/fakes/boms/metadata.yaml b/pkg/v1/tkr/fakes/boms/metadata.yaml deleted file mode 100644 index 4f30d93e48..0000000000 --- a/pkg/v1/tkr/fakes/boms/metadata.yaml +++ /dev/null @@ -1,24 +0,0 @@ -managementClusterVersions: -- version: v1.0 - supportedKubernetesVersions: - - v1.17.13+vmware.1 -- version: v1.2 - supportedKubernetesVersions: - - v1.18.10+vmware.1 - - v1.19.1+vmware.2 - - v1.19.3+vmware.1 - - v1.17.13+vmware.1 -- version: v1.3 - supportedKubernetesVersions: - - v1.18.10+vmware.1 - - v1.19.1+vmware.2 - - v1.19.3+vmware.1 - - v1.17.13+vmware.1 -- version: v1.10 - supportedKubernetesVersions: - - v1.18.10+vmware.1 - - v1.20.5+vmware.1 -- version: v1.1 - supportedKubernetesVersions: - - v1.18.10+vmware.1 - - v1.17.13+vmware.1 diff --git a/pkg/v1/tkr/fakes/registy.go b/pkg/v1/tkr/fakes/registy.go deleted file mode 100644 index f6a1a3d750..0000000000 --- a/pkg/v1/tkr/fakes/registy.go +++ /dev/null @@ -1,352 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/registry" -) - -type Registry struct { - DownloadBundleStub func(string, string) error - downloadBundleMutex sync.RWMutex - downloadBundleArgsForCall []struct { - arg1 string - arg2 string - } - downloadBundleReturns struct { - result1 error - } - downloadBundleReturnsOnCall map[int]struct { - result1 error - } - GetFileStub func(string, string) ([]byte, error) - getFileMutex sync.RWMutex - getFileArgsForCall []struct { - arg1 string - arg2 string - } - getFileReturns struct { - result1 []byte - result2 error - } - getFileReturnsOnCall map[int]struct { - result1 []byte - result2 error - } - GetFilesStub func(string) (map[string][]byte, error) - getFilesMutex sync.RWMutex - getFilesArgsForCall []struct { - arg1 string - } - getFilesReturns struct { - result1 map[string][]byte - result2 error - } - getFilesReturnsOnCall map[int]struct { - result1 map[string][]byte - result2 error - } - ListImageTagsStub func(string) ([]string, error) - listImageTagsMutex sync.RWMutex - listImageTagsArgsForCall []struct { - arg1 string - } - listImageTagsReturns struct { - result1 []string - result2 error - } - listImageTagsReturnsOnCall map[int]struct { - result1 []string - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *Registry) DownloadBundle(arg1 string, arg2 string) error { - fake.downloadBundleMutex.Lock() - ret, specificReturn := fake.downloadBundleReturnsOnCall[len(fake.downloadBundleArgsForCall)] - fake.downloadBundleArgsForCall = append(fake.downloadBundleArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.DownloadBundleStub - fakeReturns := fake.downloadBundleReturns - fake.recordInvocation("DownloadBundle", []interface{}{arg1, arg2}) - fake.downloadBundleMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Registry) DownloadBundleCallCount() int { - fake.downloadBundleMutex.RLock() - defer fake.downloadBundleMutex.RUnlock() - return len(fake.downloadBundleArgsForCall) -} - -func (fake *Registry) DownloadBundleCalls(stub func(string, string) error) { - fake.downloadBundleMutex.Lock() - defer fake.downloadBundleMutex.Unlock() - fake.DownloadBundleStub = stub -} - -func (fake *Registry) DownloadBundleArgsForCall(i int) (string, string) { - fake.downloadBundleMutex.RLock() - defer fake.downloadBundleMutex.RUnlock() - argsForCall := fake.downloadBundleArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Registry) DownloadBundleReturns(result1 error) { - fake.downloadBundleMutex.Lock() - defer fake.downloadBundleMutex.Unlock() - fake.DownloadBundleStub = nil - fake.downloadBundleReturns = struct { - result1 error - }{result1} -} - -func (fake *Registry) DownloadBundleReturnsOnCall(i int, result1 error) { - fake.downloadBundleMutex.Lock() - defer fake.downloadBundleMutex.Unlock() - fake.DownloadBundleStub = nil - if fake.downloadBundleReturnsOnCall == nil { - fake.downloadBundleReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.downloadBundleReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Registry) GetFile(arg1 string, arg2 string) ([]byte, error) { - fake.getFileMutex.Lock() - ret, specificReturn := fake.getFileReturnsOnCall[len(fake.getFileArgsForCall)] - fake.getFileArgsForCall = append(fake.getFileArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetFileStub - fakeReturns := fake.getFileReturns - fake.recordInvocation("GetFile", []interface{}{arg1, arg2}) - fake.getFileMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Registry) GetFileCallCount() int { - fake.getFileMutex.RLock() - defer fake.getFileMutex.RUnlock() - return len(fake.getFileArgsForCall) -} - -func (fake *Registry) GetFileCalls(stub func(string, string) ([]byte, error)) { - fake.getFileMutex.Lock() - defer fake.getFileMutex.Unlock() - fake.GetFileStub = stub -} - -func (fake *Registry) GetFileArgsForCall(i int) (string, string) { - fake.getFileMutex.RLock() - defer fake.getFileMutex.RUnlock() - argsForCall := fake.getFileArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Registry) GetFileReturns(result1 []byte, result2 error) { - fake.getFileMutex.Lock() - defer fake.getFileMutex.Unlock() - fake.GetFileStub = nil - fake.getFileReturns = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *Registry) GetFileReturnsOnCall(i int, result1 []byte, result2 error) { - fake.getFileMutex.Lock() - defer fake.getFileMutex.Unlock() - fake.GetFileStub = nil - if fake.getFileReturnsOnCall == nil { - fake.getFileReturnsOnCall = make(map[int]struct { - result1 []byte - result2 error - }) - } - fake.getFileReturnsOnCall[i] = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *Registry) GetFiles(arg1 string) (map[string][]byte, error) { - fake.getFilesMutex.Lock() - ret, specificReturn := fake.getFilesReturnsOnCall[len(fake.getFilesArgsForCall)] - fake.getFilesArgsForCall = append(fake.getFilesArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetFilesStub - fakeReturns := fake.getFilesReturns - fake.recordInvocation("GetFiles", []interface{}{arg1}) - fake.getFilesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Registry) GetFilesCallCount() int { - fake.getFilesMutex.RLock() - defer fake.getFilesMutex.RUnlock() - return len(fake.getFilesArgsForCall) -} - -func (fake *Registry) GetFilesCalls(stub func(string) (map[string][]byte, error)) { - fake.getFilesMutex.Lock() - defer fake.getFilesMutex.Unlock() - fake.GetFilesStub = stub -} - -func (fake *Registry) GetFilesArgsForCall(i int) string { - fake.getFilesMutex.RLock() - defer fake.getFilesMutex.RUnlock() - argsForCall := fake.getFilesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Registry) GetFilesReturns(result1 map[string][]byte, result2 error) { - fake.getFilesMutex.Lock() - defer fake.getFilesMutex.Unlock() - fake.GetFilesStub = nil - fake.getFilesReturns = struct { - result1 map[string][]byte - result2 error - }{result1, result2} -} - -func (fake *Registry) GetFilesReturnsOnCall(i int, result1 map[string][]byte, result2 error) { - fake.getFilesMutex.Lock() - defer fake.getFilesMutex.Unlock() - fake.GetFilesStub = nil - if fake.getFilesReturnsOnCall == nil { - fake.getFilesReturnsOnCall = make(map[int]struct { - result1 map[string][]byte - result2 error - }) - } - fake.getFilesReturnsOnCall[i] = struct { - result1 map[string][]byte - result2 error - }{result1, result2} -} - -func (fake *Registry) ListImageTags(arg1 string) ([]string, error) { - fake.listImageTagsMutex.Lock() - ret, specificReturn := fake.listImageTagsReturnsOnCall[len(fake.listImageTagsArgsForCall)] - fake.listImageTagsArgsForCall = append(fake.listImageTagsArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ListImageTagsStub - fakeReturns := fake.listImageTagsReturns - fake.recordInvocation("ListImageTags", []interface{}{arg1}) - fake.listImageTagsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Registry) ListImageTagsCallCount() int { - fake.listImageTagsMutex.RLock() - defer fake.listImageTagsMutex.RUnlock() - return len(fake.listImageTagsArgsForCall) -} - -func (fake *Registry) ListImageTagsCalls(stub func(string) ([]string, error)) { - fake.listImageTagsMutex.Lock() - defer fake.listImageTagsMutex.Unlock() - fake.ListImageTagsStub = stub -} - -func (fake *Registry) ListImageTagsArgsForCall(i int) string { - fake.listImageTagsMutex.RLock() - defer fake.listImageTagsMutex.RUnlock() - argsForCall := fake.listImageTagsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Registry) ListImageTagsReturns(result1 []string, result2 error) { - fake.listImageTagsMutex.Lock() - defer fake.listImageTagsMutex.Unlock() - fake.ListImageTagsStub = nil - fake.listImageTagsReturns = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *Registry) ListImageTagsReturnsOnCall(i int, result1 []string, result2 error) { - fake.listImageTagsMutex.Lock() - defer fake.listImageTagsMutex.Unlock() - fake.ListImageTagsStub = nil - if fake.listImageTagsReturnsOnCall == nil { - fake.listImageTagsReturnsOnCall = make(map[int]struct { - result1 []string - result2 error - }) - } - fake.listImageTagsReturnsOnCall[i] = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *Registry) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.downloadBundleMutex.RLock() - defer fake.downloadBundleMutex.RUnlock() - fake.getFileMutex.RLock() - defer fake.getFileMutex.RUnlock() - fake.getFilesMutex.RLock() - defer fake.getFilesMutex.RUnlock() - fake.listImageTagsMutex.RLock() - defer fake.listImageTagsMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *Registry) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ registry.Registry = new(Registry) diff --git a/pkg/v1/tkr/go.mod b/pkg/v1/tkr/go.mod deleted file mode 100644 index 72139b9f01..0000000000 --- a/pkg/v1/tkr/go.mod +++ /dev/null @@ -1,114 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/run => ../../../apis/run - github.com/vmware-tanzu/tanzu-framework/util => ../../../util -) - -require ( - github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f - github.com/go-logr/logr v1.2.3 - github.com/google/go-containerregistry v0.10.0 - github.com/k14s/imgpkg v0.17.0 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.20.1 - github.com/pkg/errors v0.9.1 - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000 - k8s.io/api v0.24.2 - k8s.io/apimachinery v0.24.2 - sigs.k8s.io/cluster-api v1.2.8 - sigs.k8s.io/controller-runtime v0.12.3 - sigs.k8s.io/yaml v1.3.0 -) - -require ( - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.11.4 // indirect - github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72 // indirect - github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v20.10.16+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.16+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v4.12.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/swag v0.19.15 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.15.4 // indirect - github.com/kr/pretty v0.2.1 // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mitchellh/go-homedir v1.1.0 // 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/nxadm/tail v1.4.8 // indirect - github.com/onsi/ginkgo/v2 v2.2.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 // indirect - github.com/prometheus/client_golang v1.12.2 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/spf13/cobra v1.5.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.7.5 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.19.1 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/client-go v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.70.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/kubectl v0.24.0 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect -) diff --git a/pkg/v1/tkr/go.sum b/pkg/v1/tkr/go.sum deleted file mode 100644 index ccb403f2c1..0000000000 --- a/pkg/v1/tkr/go.sum +++ /dev/null @@ -1,1658 +0,0 @@ -4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= -cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCqWCLp6Cifo= -github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e h1:GCzyKMDDjSGnlpl3clrdAK7I1AaVoaiKDOYkUzChZzg= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= -github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/blizzy78/varnamelen v0.3.0/go.mod h1:hbwRdBvoBqxk34XyQ6HA0UH3G0/1TKuv5AC4eaBT0Ec= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/breml/bidichk v0.1.1/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso= -github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.11.4 h1:LjrYUZpyOhiSaU7hHrdR82/RBoxfGWSaC0VeSSMXqnk= -github.com/containerd/stargz-snapshotter/estargz v0.11.4/go.mod h1:7vRJIcImfY8bpifnMjt+HTJoQxASq7T28MYbP15/Nf0= -github.com/coredns/caddy v1.1.0 h1:ezvsPrT/tA/7pYDBZxu0cT0VmWk75AfIaf6GSYCNMf0= -github.com/coredns/corefile-migration v1.0.18 h1:zs5PJm/VGZVje1ESRj6ZqyUuVsVfagExkbLU2QKV5mI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72 h1:rPWcUBgMb1ox2eCohCuZ8gsZVe0aB5qBbYaBpdoxfCE= -github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= -github.com/cppforlife/go-cli-ui v0.0.0-20200506005011-4268990983cc/go.mod h1:I0qrzCmuPWYI6kAOvkllYjaW2aovclWbJ96+v+YyHb0= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f h1:yVW0v4zDXzJo1i8G9G3vtvNpyzhvtLalO34BsN/K88E= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f/go.mod h1:L18TqO77ci8i+hFtlMC4zSFz/D3O8lf84TyVU+zFF8E= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/daixiang0/gci v0.2.9/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.16+incompatible h1:aLQ8XowgKpR3/IysPj8qZQJBVQ+Qws61icFuZl6iKYs= -github.com/docker/cli v20.10.16+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.16+incompatible h1:2Db6ZR/+FUR3hqPMwnogOPHFn405crbpxvWzKovETOQ= -github.com/docker/docker v20.10.16+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-critic/go-critic v0.6.1/go.mod h1:SdNCfU0yF3UBjtaZGw6586/WocupMOJuiqgom5DsQxM= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.43.0/go.mod h1:VIFlUqidx5ggxDfQagdvd9E67UjMXtTHBkBQ7sHoC5Q= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1 h1:MQBGSZGnDwh7T/un+mzGKOMz3x+4E/GDPprWjDL+1Jg= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.10.0 h1:qd/fv2nQajGZJenaNcdaghlwSPjQ0NphN9hzArr2WWg= -github.com/google/go-containerregistry v0.10.0/go.mod h1:C7uwbB1QUAtvnknyd3ethxJRd4gtEjU/9WLXzckfI1Y= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= -github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= -github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hpcloud/tail v1.0.1-0.20180514194441-a1dbeea552b7/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= -github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k14s/imgpkg v0.17.0 h1:l1HqYtjecqx7iYecJUvxQQYdo3WubCahHQ30lh0p9sU= -github.com/k14s/imgpkg v0.17.0/go.mod h1:xYZ7gQxYP3O35vGIXcYchDEHq0xA81FOheCp8Vlq5ko= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.4 h1:1kn4/7MepF/CHmYub99/nNX8az0IJjfSOU/jbnTVfqQ= -github.com/klauspost/compress v1.15.4/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= -github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= -github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.1.2/go.mod h1:bnXsMr+ZTH09V5rssEI+jHAZ4z+ZdyhgO/zsy3EhK+0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= -github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc= -github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= -github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.2.0 h1:3ZNA3L1c5FYDFTTxbFeVGGD8jYvjYauHD30YgLxVsNI= -github.com/onsi/ginkgo/v2 v2.2.0/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q= -github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 h1:+czc/J8SlhPKLOtVLMQc+xDCFBT73ZStMsRhSsUhsSg= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -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/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.13/go.mod h1:Ul8wwdqR6kBVOCt2dipDBkE+T6vAV/iixkrKuRTN1oQ= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.10/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20210428214800-545e0d2e0bf7/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= -github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securego/gosec/v2 v2.9.1/go.mod h1:oDcDLcatOJxkCGaCaq8lua1jTnYf6Sou4wdiJ1n4iHc= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil/v3 v3.21.10/go.mod h1:t75NhzCZ/dYyPQjyQmrAYP6c8+LCdFANeBMdLPCNnew= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.5 h1:s5PTfem8p8EbKQOctVV53k6jCJt3UX4IEJzwh+C324Q= -github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY= -github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= -github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= -github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= -go4.org/intern v0.0.0-20211027215823-ae77deb06f29 h1:UXLjNohABv4S58tHmeuIZDO6e3mHpW2Dx33gaNt03LE= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180730214132-a0f8a16cb08c/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -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.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -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= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd h1:e0TwkXOdbnH/1x5rc5MZ/VYyiZ4v+RdVfrGMqEwT68I= -google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc/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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= -inet.af/netaddr v0.0.0-20220617031823-097006376321 h1:B4dC8ySKTQXasnjDTMsoCMf1sQG4WsMej0WXaHxunmU= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/cluster-bootstrap v0.24.0 h1:MTs2x3Vfcl/PWvB5bfX7gzTFRyi4ZSbNSQgGJTCb6Sw= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/pkg/v1/tkr/main.go b/pkg/v1/tkr/main.go deleted file mode 100644 index 215f51cdfc..0000000000 --- a/pkg/v1/tkr/main.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "context" - "flag" - "os" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - ctrllog "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/log/zap" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - tkrsourcectr "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/controllers/source" - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/constants" - mgrcontext "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/context" - "github.com/vmware-tanzu/tanzu-framework/util/buildinfo" -) - -var ( - scheme = runtime.NewScheme() - setupLog = ctrl.Log.WithName("setup") -) - -func init() { - _ = capi.AddToScheme(scheme) - _ = corev1.AddToScheme(scheme) - _ = runv1alpha1.AddToScheme(scheme) -} - -func main() { - var enableLeaderElection bool - var bomImagePath string - var bomMetadataImagePath string - var initTKRDiscoveryFreq float64 - var continuousTKRDiscoverFreq float64 - var skipVerifyRegistryCerts bool - flag.StringVar(&bomImagePath, "bom-image-path", "", "The BOM image path.") - flag.StringVar(&bomMetadataImagePath, "bom-metadata-image-path", "", "The BOM compatibility metadata image path.") - flag.BoolVar(&enableLeaderElection, "enable-leader-election", false, - "Enable leader election for controller manager. "+ - "Enabling this will ensure there is only one active controller manager.") - flag.BoolVar(&skipVerifyRegistryCerts, "skip-verify-registry-cert", false, "Set whether to verify server's certificate chain and host name") - flag.Float64Var(&initTKRDiscoveryFreq, "initial-discover-frequency", 60, "Initial TKR discovery frequency in seconds") - flag.Float64Var(&continuousTKRDiscoverFreq, "continuous-discover-frequency", 600, "Continuous TKR discovery frequency in seconds") - flag.Parse() - - ctrl.SetLogger(zap.New(zap.UseDevMode(true))) - - setupLog.Info("Version", "version", buildinfo.Version, "buildDate", buildinfo.Date, "sha", buildinfo.SHA) - - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - Port: 9443, - LeaderElection: enableLeaderElection, - LeaderElectionID: constants.TKRControllerLeaderElectionCM, - - LeaderElectionNamespace: constants.TKRNamespace, - }) - if err != nil { - setupLog.Error(err, "Unable to start manager") - os.Exit(1) - } - mgrContext := &mgrcontext.ControllerManagerContext{ - Client: mgr.GetClient(), - Context: context.Background(), - BOMImagePath: bomImagePath, - BOMMetadataImagePath: bomMetadataImagePath, - Logger: ctrllog.Log, - Scheme: mgr.GetScheme(), - TKRDiscoveryOption: mgrcontext.NewTanzuKubernetesReleaseDiscoverOptions(initTKRDiscoveryFreq, continuousTKRDiscoverFreq), - VerifyRegistryCert: !skipVerifyRegistryCerts, - } - - if err := tkrsourcectr.AddToManager(mgrContext, mgr); err != nil { - setupLog.Error(err, "Error initializing the tkr-source-controller") - os.Exit(1) - } - - // +kubebuilder:scaffold:builder - - setupLog.Info("Starting manager") - if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { - setupLog.Error(err, "Problem running manager") - os.Exit(1) - } -} diff --git a/pkg/v1/tkr/pkg/constants/constants.go b/pkg/v1/tkr/pkg/constants/constants.go deleted file mode 100644 index 07f8288211..0000000000 --- a/pkg/v1/tkr/pkg/constants/constants.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -const ( - // BomConfigMapTKRLabel is the BOM ConfigMap TKR label - BomConfigMapTKRLabel = "tanzuKubernetesRelease" - - // BomConfigMapImageTagAnnotation is the BOM ConfigMap image tag annotation - BomConfigMapImageTagAnnotation = "bomImageTag" - - // BomConfigMapContentKey is the BOM ConfigMap content key - BomConfigMapContentKey = "bomContent" - - // BOMKubernetesComponentKey is the BOM k8s component key - BOMKubernetesComponentKey = "kubernetes" - - // ManagementClusterRoleLabel is the management cluster role label - // It indicates the cluster object represents a mgmt cluster - ManagementClusterRoleLabel = "cluster-role.tkg.tanzu.vmware.com/management" - - // TKGVersionKey is the TKG version key - TKGVersionKey = "TKGVERSION" - - // TKRNamespace is the TKR namespace - TKRNamespace = "tkr-system" - - // TKRControllerLeaderElectionCM is the ConfigMap used as the TKR Controller leader election lock - TKRControllerLeaderElectionCM = "abf9f9ab.tanzu.vmware.com" - - // TKGNamespace is the TKG namespace - TKGNamespace = "tkg-system" - - // TanzuKubernetesReleaseInactiveLabel is the TKR inactive label - TanzuKubernetesReleaseInactiveLabel = "inactive" - - // BOMMetadataConfigMapName is the name of the ConfigMap holding BOM metadata - BOMMetadataConfigMapName = "bom-metadata" - - // BOMMetadataCompatibilityKey in binaryData in bom-metadata ConfigMap holds compatibility metadata - BOMMetadataCompatibilityKey = "compatibility" -) diff --git a/pkg/v1/tkr/pkg/constants/doc.go b/pkg/v1/tkr/pkg/constants/doc.go deleted file mode 100644 index 50ba833dde..0000000000 --- a/pkg/v1/tkr/pkg/constants/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package constants provides some constants for TKR. -package constants diff --git a/pkg/v1/tkr/pkg/context/controller_manager_context.go b/pkg/v1/tkr/pkg/context/controller_manager_context.go deleted file mode 100644 index 88c4d07c94..0000000000 --- a/pkg/v1/tkr/pkg/context/controller_manager_context.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package context - -import ( - "context" - "time" - - "github.com/go-logr/logr" - "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// TanzuKubernetesReleaseDiscoverOptions contains the discovery options -type TanzuKubernetesReleaseDiscoverOptions struct { - InitialDiscoveryFrequency time.Duration - ContinuousDiscoveryFrequency time.Duration -} - -// ControllerManagerContext contains the controller manager context -type ControllerManagerContext struct { - BOMImagePath string - BOMMetadataImagePath string - Context context.Context - Client client.Client - Logger logr.Logger - Scheme *runtime.Scheme - VerifyRegistryCert bool - TKRDiscoveryOption TanzuKubernetesReleaseDiscoverOptions -} - -// NewTanzuKubernetesReleaseDiscoverOptions instantiates a new set of TanzuKubernetesReleaseDiscoverOptions -func NewTanzuKubernetesReleaseDiscoverOptions(initFreq, continuousFreq float64) TanzuKubernetesReleaseDiscoverOptions { - return TanzuKubernetesReleaseDiscoverOptions{ - InitialDiscoveryFrequency: time.Duration(initFreq) * time.Second, - ContinuousDiscoveryFrequency: time.Duration(continuousFreq) * time.Second, - } -} diff --git a/pkg/v1/tkr/pkg/context/doc.go b/pkg/v1/tkr/pkg/context/doc.go deleted file mode 100644 index 81ffd74a85..0000000000 --- a/pkg/v1/tkr/pkg/context/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package context provides controller manager context for TKR resources. -package context diff --git a/pkg/v1/tkr/pkg/registry/client.go b/pkg/v1/tkr/pkg/registry/client.go deleted file mode 100644 index a9804e1412..0000000000 --- a/pkg/v1/tkr/pkg/registry/client.go +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package registry - -import ( - "archive/tar" - "bytes" - "io" - - "github.com/cppforlife/go-cli-ui/ui" - regname "github.com/google/go-containerregistry/pkg/name" - regv1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/k14s/imgpkg/pkg/imgpkg/cmd" - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - "github.com/pkg/errors" -) - -type registry struct { - opts *ctlimg.Opts - registry ctlimg.Registry -} - -// New instantiates a new Registry -func New(opts *ctlimg.Opts) (Registry, error) { - reg, err := ctlimg.NewRegistry(*opts) - if err != nil { - return nil, errors.Wrap(err, "failed to initialze registry client") - } - - return ®istry{ - opts: opts, - registry: reg, - }, nil -} - -// ListImageTags lists all tags of the given image. -func (r *registry) ListImageTags(imageName string) ([]string, error) { - ref, err := regname.ParseReference(imageName, regname.WeakValidation) - if err != nil { - return []string{}, err - } - - return r.registry.ListTags(ref.Context()) -} - -// GetFile gets the file content bundled in the given image:tag. -// If filename is empty, it will get the first file. -func (r *registry) GetFile(imageWithTag, filename string) ([]byte, error) { - ref, err := regname.ParseReference(imageWithTag, regname.WeakValidation) - if err != nil { - return nil, err - } - d, err := r.registry.Get(ref) - if err != nil { - return nil, errors.Wrap(err, "Collecting images") - } - - img, err := d.Image() - if err != nil { - return nil, err - } - - return getFileContentFromImage(img, filename) -} - -func getFileContentFromImage(image regv1.Image, filename string) ([]byte, error) { - layers, err := image.Layers() - - if err != nil { - return nil, err - } - - for _, imgLayer := range layers { - layerStream, err := imgLayer.Uncompressed() - if err != nil { - return nil, err - } - - // suppressed the lint failure for now, as this code is unfamiliar to me. - // created a Github issue to track this https://github.com/vmware-tanzu/tanzu-framework/issues/3917 - defer layerStream.Close() //nolint:gocritic - - files := make(map[string][]byte) - err = getFileFromLayer(layerStream, files) - if err != nil { - return nil, err - } - - for k, v := range files { - if filename == "" || k == filename { - return v, nil - } - } - } - return nil, errors.New("cannot find file from the image") -} - -func getFileFromLayer(stream io.Reader, files map[string][]byte) error { - tarReader := tar.NewReader(stream) - - for { - hdr, err := tarReader.Next() - if err != nil { - if err == io.EOF { - break - } - return err - } - - if hdr.Typeflag == tar.TypeReg || hdr.Typeflag == tar.TypeRegA { - buf, err := io.ReadAll(tarReader) - if err != nil { - return err - } - files[hdr.Name] = buf - } - } - return nil -} - -// GetFiles get all the files content bundled in the given image:tag. -func (r *registry) GetFiles(imageWithTag string) (map[string][]byte, error) { - ref, err := regname.ParseReference(imageWithTag, regname.WeakValidation) - if err != nil { - return nil, err - } - d, err := r.registry.Get(ref) - if err != nil { - return nil, errors.Wrap(err, "Collecting images") - } - img, err := d.Image() - if err != nil { - return nil, err - } - - return getAllFilesContentFromImage(img) -} - -func getAllFilesContentFromImage(image regv1.Image) (map[string][]byte, error) { - layers, err := image.Layers() - - if err != nil { - return nil, err - } - - files := make(map[string][]byte) - - for _, imgLayer := range layers { - layerStream, err := imgLayer.Uncompressed() - if err != nil { - return nil, err - } - - // suppressed the lint failure for now, as this code is unfamiliar to me. - // created a Github issue to track this https://github.com/vmware-tanzu/tanzu-framework/issues/3917 - defer layerStream.Close() //nolint:gocritic - - err = getFileFromLayer(layerStream, files) - if err != nil { - return nil, err - } - } - - if len(files) != 0 { - return files, nil - } - - return nil, errors.New("cannot find file from the image") -} - -// DownloadBundle downloads OCI bundle similar to `imgpkg pull -b` command -// It is recommended to use this function when downloading imgpkg bundle because -// - During the air-gapped script, these plugin discovery packages are copied to a -// private registry with the `imgpkg copy` command -// - Downloading files directly from OCI image similar to `GetFiles` doesn't work -// because it doesn't update the `ImageLock` file when we download the package from -// different registry. And returns original ImageLock file. and as ImageLock file -// is pointing to original registry instead of private registry, image references -// does not point to the correct location - -func (r *registry) DownloadBundle(imageName, outputDir string) error { - // Creating a dummy writer to capture the logs - // currently this logs are not displayed or used directly - var outputBuf, errorBuf bytes.Buffer - writerUI := ui.NewWriterUI(&outputBuf, &errorBuf, nil) - - pullOptions := cmd.NewPullOptions(writerUI) - pullOptions.OutputPath = outputDir - pullOptions.BundleFlags = cmd.BundleFlags{Bundle: imageName} - - if r.opts != nil { - pullOptions.RegistryFlags = cmd.RegistryFlags{ - CACertPaths: r.opts.CACertPaths, - VerifyCerts: r.opts.VerifyCerts, - Insecure: r.opts.Insecure, - Anon: r.opts.Anon, - } - } - - return pullOptions.Run() -} diff --git a/pkg/v1/tkr/pkg/registry/client_integ_test.go b/pkg/v1/tkr/pkg/registry/client_integ_test.go deleted file mode 100644 index fc7d7f7eeb..0000000000 --- a/pkg/v1/tkr/pkg/registry/client_integ_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package registry - -import ( - "fmt" - "os" - "strconv" - "testing" - - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - - tkrv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/pkg/tkr/v1" -) - -func TestRegistryPullBOM(t *testing.T) { - if integTest := os.Getenv("TKR_INTEG_TEST"); integTest != "true" { - return - } - bomRegistry := os.Getenv("TEST_BOM_IMAGE_PATH") - if bomRegistry == "" { - t.Fatal("TEST_BOM_IMAGE_PATH must be set") - } - - numTags, err := strconv.Atoi(os.Getenv("TEST_BOM_IMAGE_NUM")) - if err != nil { - t.Fatalf("wrong TEST_BOM_IMAGE_NUM, %s", err.Error()) - } - - ro := ctlimg.Opts{} - - reg, err := New(&ro) - if err != nil { - t.Fatalf("error creating registry client") - } - - tags, err := reg.ListImageTags(bomRegistry) - if err != nil { - t.Fatalf("error listing tags should not occurs %s", err.Error()) - } - - if numTags != len(tags) { - t.Fatal("number of tags does not match") - } - - t.Log(tags[0]) - - content, err := reg.GetFile(fmt.Sprintf("%s:%s", bomRegistry, tags[0]), "") - if err != nil { - t.Fatalf("error getting image content should not occurs %s", err.Error()) - } - - bom, err := tkrv1.NewBom(content) - if err != nil { - t.Fatalf("error parsing bom content should not occurs %s", err.Error()) - } - - t.Log(bom.GetComponent("kubernetes")) -} diff --git a/pkg/v1/tkr/pkg/registry/doc.go b/pkg/v1/tkr/pkg/registry/doc.go deleted file mode 100644 index bdcd61d8a2..0000000000 --- a/pkg/v1/tkr/pkg/registry/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package registry defines a Registry interface and client for working for imkpkg images. -package registry diff --git a/pkg/v1/tkr/pkg/registry/interface.go b/pkg/v1/tkr/pkg/registry/interface.go deleted file mode 100644 index 81f1ad8e38..0000000000 --- a/pkg/v1/tkr/pkg/registry/interface.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package registry - -//go:generate counterfeiter -o ../../fakes/registy.go --fake-name Registry . Registry - -// Registry defines the Registry interface -type Registry interface { - // ListImageTags lists all tags of the given image. - ListImageTags(imageName string) ([]string, error) - // GetFile gets the file content bundled in the given image:tag. - // If filename is empty, it will get the first file. - GetFile(imageWithTag string, filename string) ([]byte, error) - // GetFiles get all the files content bundled in the given image:tag. - GetFiles(imageWithTag string) (map[string][]byte, error) - // DownloadBundle downloads OCI bundle similar to `imgpkg pull -b` command - // It is recommended to use this function when downloading imgpkg bundle - DownloadBundle(imageName, outputDir string) error -} diff --git a/pkg/v1/tkr/pkg/utils/utils.go b/pkg/v1/tkr/pkg/utils/utils.go deleted file mode 100644 index ee6c30ef64..0000000000 --- a/pkg/v1/tkr/pkg/utils/utils.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package utils provides some utility functionalities for TKR. -package utils - -import ( - "fmt" - "strings" - - corev1 "k8s.io/api/core/v1" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/version" - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/constants" -) - -// UpgradesNotAvailableError is an error type to return when upgrades are not available -type UpgradesNotAvailableError struct { - message string -} - -// NewUpgradesNotAvailableError returns a struct of type UpgradesNotAvailableError -func NewUpgradesNotAvailableError(message string) UpgradesNotAvailableError { - return UpgradesNotAvailableError{ - message: message, - } -} - -func (e UpgradesNotAvailableError) Error() string { - return e.message -} - -// IsTkrCompatible checks if TKR is compatible -func IsTkrCompatible(tkr *runv1alpha1.TanzuKubernetesRelease) bool { - for _, condition := range tkr.Status.Conditions { - if condition.Type == runv1alpha1.ConditionCompatible { - compatible := string(condition.Status) - return compatible == "True" || compatible == "true" - } - } - - return false -} - -// IsTkrActive checks if the TKR is active -func IsTkrActive(tkr *runv1alpha1.TanzuKubernetesRelease) bool { - labels := tkr.Labels - if labels != nil { - if _, exists := labels[constants.TanzuKubernetesReleaseInactiveLabel]; exists { - return false - } - } - return true -} - -// GetAvailableUpgrades returns the available upgrades of a TKR -func GetAvailableUpgrades(clusterName, namespace string, tkr *runv1alpha1.TanzuKubernetesRelease) ([]string, error) { - upgradeMsg := "" - - for _, condition := range tkr.Status.Conditions { - if condition.Type == runv1alpha1.ConditionUpdatesAvailable && condition.Status == corev1.ConditionTrue { - upgradeMsg = condition.Message - break - } - // If the TKR's have deprecated UpgradeAvailable condition use it - if condition.Type == runv1alpha1.ConditionUpgradeAvailable && condition.Status == corev1.ConditionTrue { - upgradeMsg = condition.Message - break - } - } - - if upgradeMsg == "" { - return []string{}, NewUpgradesNotAvailableError(fmt.Sprintf("no available upgrades for cluster %q, namespace %q", clusterName, namespace)) - } - - var availableUpgradeList []string - // TODO: Message format was changed to follow TKGs, keeping this old format check for backward compatibility.Can be cleaned up after couple minor version releases. - if strings.Contains(upgradeMsg, "TKR(s)") { - // Example for TKGm :upgradeMsg - "Deprecated, TKR(s) with later version is available: ," - strs := strings.Split(upgradeMsg, ": ") - if len(strs) != 2 { - return []string{}, NewUpgradesNotAvailableError(fmt.Sprintf("no available upgrades for cluster %q, namespace %q", clusterName, namespace)) - } - availableUpgradeList = strings.Split(strs[1], ",") - } else { - // Example for TKGs :upgradeMsg - [ ]" - strs := strings.Split(strings.TrimRight(strings.TrimLeft(upgradeMsg, "["), "]"), " ") - if len(strs) == 0 { - return []string{}, NewUpgradesNotAvailableError(fmt.Sprintf("no available upgrades for cluster %q, namespace %q", clusterName, namespace)) - } - availableUpgradeList = strs - } - - // convert them to tkrName if the available upgrade list contains TKR versions - for idx := range availableUpgradeList { - if !strings.HasPrefix(availableUpgradeList[idx], "v") { - availableUpgradeList[idx] = "v" + availableUpgradeList[idx] - } - availableUpgradeList[idx] = version.Label(availableUpgradeList[idx]) - } - - return availableUpgradeList, nil -} diff --git a/providers/.yamllint b/providers/.yamllint deleted file mode 100644 index 50e3a3b376..0000000000 --- a/providers/.yamllint +++ /dev/null @@ -1,8 +0,0 @@ -rules: - line-length: disable - indentation: - level: error - indent-sequences: consistent -ignore: | - **/_ytt_lib/ - diff --git a/providers/Makefile b/providers/Makefile deleted file mode 100644 index 22120f0ffa..0000000000 --- a/providers/Makefile +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -.DEFAULT_GOAL:=help - -# Set language for consistent sorting across operating systems -export LC_ALL := C - -GOOS ?= $(shell go env GOOS) -GOARCH ?= $(shell go env GOARCH) -PROJECT_ROOT = $(shell pwd) - -CLI_REPO ?= ${PROJECT_ROOT}/.. -TOOLS_DIR ?= ${PROJECT_ROOT}/../hack/tools -TOOLS_BIN_DIR ?= ${TOOLS_DIR}/bin -GOBINDATA := $(TOOLS_BIN_DIR)/gobindata -VENDIR := $(TOOLS_BIN_DIR)/vendir -VENDIR_VERSION = v0.17.0 -CLUSTERGEN_OUTPUT_DIR ?= generated -CLUSTERGEN_BASE ?= origin/main -PROVIDER_DIR_NAME = providers -PROVIDER_BUNDLE_DIR = provider-bundle/${PROVIDER_DIR_NAME} -PROVIDER_BUNDLE_ZIP = ${PROJECT_ROOT}/client/manifest/providers.zip -TKG_PROVIDER_BUNDLE_ZIP = ${PROJECT_ROOT}/tkg/tkgctl/client/manifest/providers.zip - -# Image URL to use building/pushing provider image -PROVIDER_TEMPLATE_IMG_NAME ?= provider-templates -IMAGE_REPO ?= vmware.io -PROVIDER_TEMPLATE_IMG_TAG ?= latest - - -FILES_TO_IGNORE?=.env .idea .git .github hack .yamllint .gitlab Makefile provider-bundle tests README.md client go.mod go.sum providers.sha256sum Dockerfile.templates -ifeq ($(EXCLUDE_CLUSTER_CLASS_FILES), true) -FILES_TO_IGNORE+=yttcc yttcb cconly cc.yaml -endif -FILES_TO_IGNORE_REGEX=$(subst $(space) ,\|,$(FILES_TO_IGNORE)) - - -help: ## Display this help - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -verify-build: ## verify-build verifies the changes with generated files - -all: lint ## run all target - -.PHONY: build-cli ## build tkg cli with existing provider changes -build-cli: - CLI_REPO=${CLI_REPO} ${CLI_REPO}/hack/clustergen/rebuild-cli.sh ${PWD} - -## -------------------------------------- -## Linting -## -------------------------------------- - -.PHONY: lint -lint: ## Run YAML linter - yamllint ${CLI_REPO}/providers -c .yamllint - -## -------------------------------------- -## Generate provider templates -## -------------------------------------- - -.PHONY: clean-providers -clean-providers: ## cleans provider-bundle - # cleanup old provider bundles - @rm -rf client/manifest/providers.zip - @rm -rf provider-bundle || true - @mkdir -p ${PROVIDER_BUNDLE_DIR} - -setup-provider-for-generation: clean-providers - # using temporary directory to extract all files which needs to bundle - find . -type f | grep -v "${FILES_TO_IGNORE_REGEX}" | xargs tar cf - -T - | tar -C ${PROVIDER_BUNDLE_DIR} -x - -.PHONY: generate-provider-bundle-zip -generate-provider-bundle-zip: setup-provider-for-generation ## generates provider zip bundle - cd ${PROVIDER_BUNDLE_DIR} && zip -r ${PROVIDER_BUNDLE_ZIP} . - -## -------------------------------------- -## build save and push Provider templates -## -------------------------------------- - -build-provider-template-image: setup-provider-for-generation ## Build provider template image - cd ${PROVIDER_BUNDLE_DIR} && docker build -t $(IMAGE_REPO)/${PROVIDER_TEMPLATE_IMG_NAME}:${PROVIDER_TEMPLATE_IMG_TAG} -f ../../hack/Dockerfile.templates . - -save-provider-template-image: ## Save provider template image - mkdir -p "${PROJECT_ROOT}/artifacts" - docker save $(IMAGE_REPO)/${PROVIDER_TEMPLATE_IMG_NAME}:${PROVIDER_TEMPLATE_IMG_TAG} | gzip -c > "${PROJECT_ROOT}/artifacts/${PROVIDER_TEMPLATE_IMG_NAME}-${PROVIDER_TEMPLATE_IMG_TAG}.tar.gz" - -push-provider-template-image: ## Push provider template image - docker push $(IMAGE_REPO)/${PROVIDER_TEMPLATE_IMG_NAME}:${PROVIDER_TEMPLATE_IMG_TAG} - -## -------------------------------------- -## Cluster generation tests -## -------------------------------------- - -rename-test-outputs: ## show commands to rename the expected output files to match up with testcases renamed by generate-testcases - # Assumes that the topmost commit contains the testcases rename - git show --summary | grep '^ rename' | perl -pe 's@rename (.*){(\d+.case) => (\d+.case).*@git mv $$1/expected/$$2.output $$1/expected/$$3.output@' - -.PHONY: generate-testcases -generate-testcases: ## Regenerates test cases based on parameter model files. Requires PICT to be available. - cd tests/clustergen && ./gen_testcases.sh - -.PHONY: cluster-generation-tests -cluster-generation-tests: build-cli ## Run cluster compliance test against cluster generation dataset - cd tests/clustergen && TKG=${CLI_REPO}/bin/tkg-${GOOS}-${GOARCH} ./run_tests.sh ${CLUSTERGEN_OUTPUT_DIR} ${CLUSTERGEN_CC_OUTPUT_DIR} - -.PHONY: cluster-generation-diffs -cluster-generation-diffs: ## Run before/after cluster generation comparison tests - CLI_REPO=${CLI_REPO} ${CLI_REPO}/hack/clustergen/cluster-check.sh ${CLUSTERGEN_BASE} - -## -------------------------------------- -## Install tools -## -------------------------------------- - -vendir: $(VENDIR) ## Install vendir -$(VENDIR): - mkdir -p hack/tools/bin - curl -LO https://github.com/vmware-tanzu/carvel-vendir/releases/download/$(VENDIR_VERSION)/vendir-$(GOOS)-$(GOARCH) - mv vendir-$(GOOS)-$(GOARCH) $(@) - chmod a+x $(@) - -## -------------------------------------- -## Run vendir sync -## -------------------------------------- - -.PHONY: vendir-sync -vendir-sync: vendir ## Run vendir sync - ${TOOLS_BIN_DIR}/vendir sync -# end of Makefile diff --git a/providers/ako/ako-pi.yaml b/providers/ako/ako-pi.yaml deleted file mode 100644 index f9a07c680f..0000000000 --- a/providers/ako/ako-pi.yaml +++ /dev/null @@ -1,58 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") - ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: load-balancer-and-ingress-service - namespace: tkg-system - annotations: - kapp.k14s.io/disable-wait: "" - labels: - tkg.tanzu.vmware.com/package-type: "management" -spec: - packageRef: - refName: load-balancer-and-ingress-service.tanzu.vmware.com - versionSelection: - prereleases: {} - serviceAccountName: load-balancer-and-ingress-service-package-sa - values: - - secretRef: - name: #@ "{}-load-balancer-and-ingress-service-addon".format(data.values.CLUSTER_NAME) ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: load-balancer-and-ingress-service-package-sa - namespace: tkg-system - annotations: - kapp.k14s.io/change-group: "load-balancer-and-ingress-service-packageinstall/serviceaccount-0" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: load-balancer-and-ingress-service-package-role - annotations: - kapp.k14s.io/change-group: "load-balancer-and-ingress-service-packageinstall/serviceaccount-0" -rules: -- apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: load-balancer-and-ingress-service-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: "load-balancer-and-ingress-service-packageinstall/serviceaccount" - kapp.k14s.io/change-rule.0: "upsert after upserting load-balancer-and-ingress-service-packageinstall/serviceaccount-0" - kapp.k14s.io/change-rule.1: "delete before deleting load-balancer-and-ingress-service-packageinstall/serviceaccount-0" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: load-balancer-and-ingress-service-package-role -subjects: -- kind: ServiceAccount - name: load-balancer-and-ingress-service-package-sa - namespace: tkg-system diff --git a/providers/bootstrap-kubeadm/v1.2.8/bootstrap-components.yaml b/providers/bootstrap-kubeadm/v1.2.8/bootstrap-components.yaml deleted file mode 100644 index 1a88cc0cd1..0000000000 --- a/providers/bootstrap-kubeadm/v1.2.8/bootstrap-components.yaml +++ /dev/null @@ -1,4597 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - control-plane: controller-manager - name: capi-kubeadm-bootstrap-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-bootstrap-system/capi-kubeadm-bootstrap-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: kubeadmconfigs.bootstrap.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: bootstrap.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: KubeadmConfig - listKind: KubeadmConfigList - plural: kubeadmconfigs - singular: kubeadmconfig - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: KubeadmConfig is the Schema for the kubeadmconfigs API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. Either ClusterConfiguration and InitConfiguration should be defined or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look for all required certificates. NB: if not provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint is specified but without a TCP port, the BindPort is used. Possible usages are: e.g. In a cluster with more than one control plane instances, this field should be assigned the address of the external load balancer in front of the control plane instances. e.g. in environments with enforced node recycling, the ControlPlaneEndpoint could be used for assigning a stable DNS to the control plane. NB: This value defaults to the first value in the Cluster object status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - type: - description: Type defines the DNS add-on to be used - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file used to secure etcd communication. Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used to secure etcd communication. Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring the local etcd instance Local and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. If empty, `k8s.gcr.io` will be used by default; in case of kubernetes version is a CI build (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be used as a default for control plane components and for kube-proxy, while `k8s.gcr.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking topology of the cluster. NB: This value defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, the API server will not allocate CIDR ranges for every node. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - useHyperKubeImage: - description: UseHyperKubeImage controls if hyperkube should be used for Kubernetes components instead of their respective separate images - type: boolean - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of . NOTE: unless you define a label, this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time and describes a set of Bootstrap Tokens to create. This information IS NOT uploaded to the kubeadm cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why this token exists and what it's used for, so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token expires. Defaults to being set dynamically at runtime based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional trust between nodes and control-planes. Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token can be used. Can by default be used for establishing bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance that's deployed on this control plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint in the sense that ControlPlaneEndpoint is the global endpoint for the cluster, which then loadbalances the requests to each individual API server. This configuration object lets you customize what IP/DNS name and port the local API server advertises it's accessible on. By default, kubeadm tries to auto-detect the IP of the default interface and use that, but in case that process fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority used to secure comunications between node and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane instance to be deployed on the joining node. If nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet to use during the TLS Bootstrap process TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for bootstrap token based discovery BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key pins to verify when token-based discovery is used. The root CA found during discovery must match one of these values. Specifying an empty set disables root CA pinning, which can be unsafe. Each hash is specified as ":", where the only currently supported type is "sha256". This is a hex-encoded SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded ASN.1. These hashes can be calculated using, for example, OpenSSL: openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based discovery without CA verification via CACertHashes. This can weaken the security of kubeadm since other nodes can impersonate the control-plane. - type: boolean - required: - - token - - unsafeSkipCAVerification - type: object - file: - description: File is used to specify a file or URL to a kubeconfig file from which to load cluster information BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual file path or URL to the kubeconfig file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: 'TLSBootstrapToken is a token used for TLS bootstrapping. If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, but can be overridden. If .File is set, this field **must be set** in case the KubeConfigFile does not contain any other authentication information TODO: revisit when there is defaulting from k/k' - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command with a shell script with retries for joins. \n This is meant to be an experimental temporary workaround on some environments where joins fail due to timing (and other issues). The long term goal is to add retries to kubeadm proper and use that functionality. \n This will add about 40KB to userdata \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - status: - description: KubeadmConfigStatus defines the observed state of KubeadmConfig. - properties: - bootstrapData: - description: "BootstrapData will be a cloud-init script for now. \n Deprecated: Switch to DataSecretName." - format: byte - type: string - conditions: - description: Conditions defines current service state of the KubeadmConfig. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. - type: string - failureMessage: - description: FailureMessage will be set on non-retryable errors - type: string - failureReason: - description: FailureReason will be set on non-retryable errors - type: string - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - ready: - description: Ready indicates the BootstrapData field is ready to be consumed - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmConfig - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: KubeadmConfig is the Schema for the kubeadmconfigs API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. Either ClusterConfiguration and InitConfiguration should be defined or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look for all required certificates. NB: if not provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint is specified but without a TCP port, the BindPort is used. Possible usages are: e.g. In a cluster with more than one control plane instances, this field should be assigned the address of the external load balancer in front of the control plane instances. e.g. in environments with enforced node recycling, the ControlPlaneEndpoint could be used for assigning a stable DNS to the control plane. NB: This value defaults to the first value in the Cluster object status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file used to secure etcd communication. Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used to secure etcd communication. Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring the local etcd instance Local and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. If empty, `registry.k8s.io` will be used by default; in case of kubernetes version is a CI build (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be used as a default for control plane components and for kube-proxy, while `registry.k8s.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking topology of the cluster. NB: This value defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, the API server will not allocate CIDR ranges for every node. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of . NOTE: unless you define a label, this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time and describes a set of Bootstrap Tokens to create. This information IS NOT uploaded to the kubeadm cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why this token exists and what it's used for, so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token expires. Defaults to being set dynamically at runtime based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional trust between nodes and control-planes. Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token can be used. Can by default be used for establishing bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance that's deployed on this control plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint in the sense that ControlPlaneEndpoint is the global endpoint for the cluster, which then loadbalances the requests to each individual API server. This configuration object lets you customize what IP/DNS name and port the local API server advertises it's accessible on. By default, kubeadm tries to auto-detect the IP of the default interface and use that, but in case that process fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority used to secure comunications between node and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane instance to be deployed on the joining node. If nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet to use during the TLS Bootstrap process TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for bootstrap token based discovery BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key pins to verify when token-based discovery is used. The root CA found during discovery must match one of these values. Specifying an empty set disables root CA pinning, which can be unsafe. Each hash is specified as ":", where the only currently supported type is "sha256". This is a hex-encoded SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded ASN.1. These hashes can be calculated using, for example, OpenSSL: openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based discovery without CA verification via CACertHashes. This can weaken the security of kubeadm since other nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to a kubeconfig file from which to load cluster information BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual file path or URL to the kubeconfig file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS bootstrapping. If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, but can be overridden. If .File is set, this field **must be set** in case the KubeConfigFile does not contain any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command with a shell script with retries for joins. \n This is meant to be an experimental temporary workaround on some environments where joins fail due to timing (and other issues). The long term goal is to add retries to kubeadm proper and use that functionality. \n This will add about 40KB to userdata \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - status: - description: KubeadmConfigStatus defines the observed state of KubeadmConfig. - properties: - conditions: - description: Conditions defines current service state of the KubeadmConfig. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. - type: string - failureMessage: - description: FailureMessage will be set on non-retryable errors - type: string - failureReason: - description: FailureReason will be set on non-retryable errors - type: string - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - ready: - description: Ready indicates the BootstrapData field is ready to be consumed - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .metadata.labels['cluster\.x-k8s\.io/cluster-name'] - name: Cluster - type: string - - description: Time duration since creation of KubeadmConfig - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: KubeadmConfig is the Schema for the kubeadmconfigs API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. Either ClusterConfiguration and InitConfiguration should be defined or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look for all required certificates. NB: if not provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint is specified but without a TCP port, the BindPort is used. Possible usages are: e.g. In a cluster with more than one control plane instances, this field should be assigned the address of the external load balancer in front of the control plane instances. e.g. in environments with enforced node recycling, the ControlPlaneEndpoint could be used for assigning a stable DNS to the control plane. NB: This value defaults to the first value in the Cluster object status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file used to secure etcd communication. Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used to secure etcd communication. Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring the local etcd instance Local and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. If empty, `registry.k8s.io` will be used by default; in case of kubernetes version is a CI build (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be used as a default for control plane components and for kube-proxy, while `registry.k8s.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking topology of the cluster. NB: This value defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, the API server will not allocate CIDR ranges for every node. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of . NOTE: unless you define a label, this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - append: - description: Append specifies whether to append Content to existing file if Path exists. - type: boolean - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - - ignition - type: string - ignition: - description: Ignition contains Ignition specific configuration. - properties: - containerLinuxConfig: - description: ContainerLinuxConfig contains CLC specific configuration. - properties: - additionalConfig: - description: "AdditionalConfig contains additional configuration to be merged with the Ignition configuration generated by the bootstrapper controller. More info: https://coreos.github.io/ignition/operator-notes/#config-merging \n The data format is documented here: https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/" - type: string - strict: - description: Strict controls if AdditionalConfig should be strictly parsed. If so, warnings are treated as errors. - type: boolean - type: object - type: object - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time and describes a set of Bootstrap Tokens to create. This information IS NOT uploaded to the kubeadm cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why this token exists and what it's used for, so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token expires. Defaults to being set dynamically at runtime based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional trust between nodes and control-planes. Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token can be used. Can by default be used for establishing bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance that's deployed on this control plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint in the sense that ControlPlaneEndpoint is the global endpoint for the cluster, which then loadbalances the requests to each individual API server. This configuration object lets you customize what IP/DNS name and port the local API server advertises it's accessible on. By default, kubeadm tries to auto-detect the IP of the default interface and use that, but in case that process fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying patches to components deployed by kubeadm during "kubeadm init". The minimum kubernetes version needed to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic" "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. These files can be written into the target directory via KubeadmConfig.Files which specifies additional files to be created on the machine, either with content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during command execution. The list of phases can be obtained with the "kubeadm init --help" command. This option takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority used to secure comunications between node and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane instance to be deployed on the joining node. If nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet to use during the TLS Bootstrap process TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for bootstrap token based discovery BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key pins to verify when token-based discovery is used. The root CA found during discovery must match one of these values. Specifying an empty set disables root CA pinning, which can be unsafe. Each hash is specified as ":", where the only currently supported type is "sha256". This is a hex-encoded SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded ASN.1. These hashes can be calculated using, for example, OpenSSL: openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based discovery without CA verification via CACertHashes. This can weaken the security of kubeadm since other nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to a kubeconfig file from which to load cluster information BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual file path or URL to the kubeconfig file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS bootstrapping. If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, but can be overridden. If .File is set, this field **must be set** in case the KubeConfigFile does not contain any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying patches to components deployed by kubeadm during "kubeadm join". The minimum kubernetes version needed to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic" "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. These files can be written into the target directory via KubeadmConfig.Files which specifies additional files to be created on the machine, either with content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during command execution. The list of phases can be obtained with the "kubeadm init --help" command. This option takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command with a shell script with retries for joins. \n This is meant to be an experimental temporary workaround on some environments where joins fail due to timing (and other issues). The long term goal is to add retries to kubeadm proper and use that functionality. \n This will add about 40KB to userdata \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055. Deprecated: This experimental fix is no longer needed and this field will be removed in a future release." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of passwd to populate the passwd. - properties: - secret: - description: Secret represents a secret that should populate this password. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - status: - description: KubeadmConfigStatus defines the observed state of KubeadmConfig. - properties: - conditions: - description: Conditions defines current service state of the KubeadmConfig. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. - type: string - failureMessage: - description: FailureMessage will be set on non-retryable errors - type: string - failureReason: - description: FailureReason will be set on non-retryable errors - type: string - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - ready: - description: Ready indicates the BootstrapData field is ready to be consumed - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-bootstrap-system/capi-kubeadm-bootstrap-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: kubeadmconfigtemplates.bootstrap.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: bootstrap.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: KubeadmConfigTemplate - listKind: KubeadmConfigTemplateList - plural: kubeadmconfigtemplates - singular: kubeadmconfigtemplate - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: KubeadmConfigTemplate is the Schema for the kubeadmconfigtemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigTemplateSpec defines the desired state of KubeadmConfigTemplate. - properties: - template: - description: KubeadmConfigTemplateResource defines the Template structure. - properties: - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. Either ClusterConfiguration and InitConfiguration should be defined or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look for all required certificates. NB: if not provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint is specified but without a TCP port, the BindPort is used. Possible usages are: e.g. In a cluster with more than one control plane instances, this field should be assigned the address of the external load balancer in front of the control plane instances. e.g. in environments with enforced node recycling, the ControlPlaneEndpoint could be used for assigning a stable DNS to the control plane. NB: This value defaults to the first value in the Cluster object status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - type: - description: Type defines the DNS add-on to be used - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file used to secure etcd communication. Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used to secure etcd communication. Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring the local etcd instance Local and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. If empty, `k8s.gcr.io` will be used by default; in case of kubernetes version is a CI build (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be used as a default for control plane components and for kube-proxy, while `k8s.gcr.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking topology of the cluster. NB: This value defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, the API server will not allocate CIDR ranges for every node. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - useHyperKubeImage: - description: UseHyperKubeImage controls if hyperkube should be used for Kubernetes components instead of their respective separate images - type: boolean - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of . NOTE: unless you define a label, this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time and describes a set of Bootstrap Tokens to create. This information IS NOT uploaded to the kubeadm cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why this token exists and what it's used for, so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token expires. Defaults to being set dynamically at runtime based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional trust between nodes and control-planes. Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token can be used. Can by default be used for establishing bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance that's deployed on this control plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint in the sense that ControlPlaneEndpoint is the global endpoint for the cluster, which then loadbalances the requests to each individual API server. This configuration object lets you customize what IP/DNS name and port the local API server advertises it's accessible on. By default, kubeadm tries to auto-detect the IP of the default interface and use that, but in case that process fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority used to secure comunications between node and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane instance to be deployed on the joining node. If nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet to use during the TLS Bootstrap process TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for bootstrap token based discovery BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key pins to verify when token-based discovery is used. The root CA found during discovery must match one of these values. Specifying an empty set disables root CA pinning, which can be unsafe. Each hash is specified as ":", where the only currently supported type is "sha256". This is a hex-encoded SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded ASN.1. These hashes can be calculated using, for example, OpenSSL: openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based discovery without CA verification via CACertHashes. This can weaken the security of kubeadm since other nodes can impersonate the control-plane. - type: boolean - required: - - token - - unsafeSkipCAVerification - type: object - file: - description: File is used to specify a file or URL to a kubeconfig file from which to load cluster information BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual file path or URL to the kubeconfig file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: 'TLSBootstrapToken is a token used for TLS bootstrapping. If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, but can be overridden. If .File is set, this field **must be set** in case the KubeConfigFile does not contain any other authentication information TODO: revisit when there is defaulting from k/k' - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command with a shell script with retries for joins. \n This is meant to be an experimental temporary workaround on some environments where joins fail due to timing (and other issues). The long term goal is to add retries to kubeadm proper and use that functionality. \n This will add about 40KB to userdata \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - type: object - required: - - template - type: object - type: object - served: true - storage: false - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmConfigTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: KubeadmConfigTemplate is the Schema for the kubeadmconfigtemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigTemplateSpec defines the desired state of KubeadmConfigTemplate. - properties: - template: - description: KubeadmConfigTemplateResource defines the Template structure. - properties: - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. Either ClusterConfiguration and InitConfiguration should be defined or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look for all required certificates. NB: if not provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint is specified but without a TCP port, the BindPort is used. Possible usages are: e.g. In a cluster with more than one control plane instances, this field should be assigned the address of the external load balancer in front of the control plane instances. e.g. in environments with enforced node recycling, the ControlPlaneEndpoint could be used for assigning a stable DNS to the control plane. NB: This value defaults to the first value in the Cluster object status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file used to secure etcd communication. Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used to secure etcd communication. Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring the local etcd instance Local and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. If empty, `registry.k8s.io` will be used by default; in case of kubernetes version is a CI build (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be used as a default for control plane components and for kube-proxy, while `registry.k8s.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking topology of the cluster. NB: This value defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, the API server will not allocate CIDR ranges for every node. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of . NOTE: unless you define a label, this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time and describes a set of Bootstrap Tokens to create. This information IS NOT uploaded to the kubeadm cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why this token exists and what it's used for, so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token expires. Defaults to being set dynamically at runtime based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional trust between nodes and control-planes. Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token can be used. Can by default be used for establishing bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance that's deployed on this control plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint in the sense that ControlPlaneEndpoint is the global endpoint for the cluster, which then loadbalances the requests to each individual API server. This configuration object lets you customize what IP/DNS name and port the local API server advertises it's accessible on. By default, kubeadm tries to auto-detect the IP of the default interface and use that, but in case that process fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority used to secure comunications between node and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane instance to be deployed on the joining node. If nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet to use during the TLS Bootstrap process TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for bootstrap token based discovery BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key pins to verify when token-based discovery is used. The root CA found during discovery must match one of these values. Specifying an empty set disables root CA pinning, which can be unsafe. Each hash is specified as ":", where the only currently supported type is "sha256". This is a hex-encoded SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded ASN.1. These hashes can be calculated using, for example, OpenSSL: openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based discovery without CA verification via CACertHashes. This can weaken the security of kubeadm since other nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to a kubeconfig file from which to load cluster information BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual file path or URL to the kubeconfig file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS bootstrapping. If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, but can be overridden. If .File is set, this field **must be set** in case the KubeConfigFile does not contain any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command with a shell script with retries for joins. \n This is meant to be an experimental temporary workaround on some environments where joins fail due to timing (and other issues). The long term goal is to add retries to kubeadm proper and use that functionality. \n This will add about 40KB to userdata \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - type: object - required: - - template - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmConfigTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: KubeadmConfigTemplate is the Schema for the kubeadmconfigtemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmConfigTemplateSpec defines the desired state of KubeadmConfigTemplate. - properties: - template: - description: KubeadmConfigTemplateResource defines the Template structure. - properties: - spec: - description: KubeadmConfigSpec defines the desired state of KubeadmConfig. Either ClusterConfiguration and InitConfiguration should be defined or the JoinConfiguration should be defined. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look for all required certificates. NB: if not provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint is specified but without a TCP port, the BindPort is used. Possible usages are: e.g. In a cluster with more than one control plane instances, this field should be assigned the address of the external load balancer in front of the control plane instances. e.g. in environments with enforced node recycling, the ControlPlaneEndpoint could be used for assigning a stable DNS to the control plane. NB: This value defaults to the first value in the Cluster object status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file used to secure etcd communication. Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used to secure etcd communication. Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring the local etcd instance Local and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. If empty, `registry.k8s.io` will be used by default; in case of kubernetes version is a CI build (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be used as a default for control plane components and for kube-proxy, while `registry.k8s.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking topology of the cluster. NB: This value defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, the API server will not allocate CIDR ranges for every node. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of . NOTE: unless you define a label, this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - append: - description: Append specifies whether to append Content to existing file if Path exists. - type: boolean - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - - ignition - type: string - ignition: - description: Ignition contains Ignition specific configuration. - properties: - containerLinuxConfig: - description: ContainerLinuxConfig contains CLC specific configuration. - properties: - additionalConfig: - description: "AdditionalConfig contains additional configuration to be merged with the Ignition configuration generated by the bootstrapper controller. More info: https://coreos.github.io/ignition/operator-notes/#config-merging \n The data format is documented here: https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/" - type: string - strict: - description: Strict controls if AdditionalConfig should be strictly parsed. If so, warnings are treated as errors. - type: boolean - type: object - type: object - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time and describes a set of Bootstrap Tokens to create. This information IS NOT uploaded to the kubeadm cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why this token exists and what it's used for, so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token expires. Defaults to being set dynamically at runtime based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional trust between nodes and control-planes. Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token can be used. Can by default be used for establishing bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance that's deployed on this control plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint in the sense that ControlPlaneEndpoint is the global endpoint for the cluster, which then loadbalances the requests to each individual API server. This configuration object lets you customize what IP/DNS name and port the local API server advertises it's accessible on. By default, kubeadm tries to auto-detect the IP of the default interface and use that, but in case that process fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying patches to components deployed by kubeadm during "kubeadm init". The minimum kubernetes version needed to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic" "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. These files can be written into the target directory via KubeadmConfig.Files which specifies additional files to be created on the machine, either with content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during command execution. The list of phases can be obtained with the "kubeadm init --help" command. This option takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority used to secure comunications between node and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane instance to be deployed on the joining node. If nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet to use during the TLS Bootstrap process TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for bootstrap token based discovery BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key pins to verify when token-based discovery is used. The root CA found during discovery must match one of these values. Specifying an empty set disables root CA pinning, which can be unsafe. Each hash is specified as ":", where the only currently supported type is "sha256". This is a hex-encoded SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded ASN.1. These hashes can be calculated using, for example, OpenSSL: openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based discovery without CA verification via CACertHashes. This can weaken the security of kubeadm since other nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to a kubeconfig file from which to load cluster information BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual file path or URL to the kubeconfig file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS bootstrapping. If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, but can be overridden. If .File is set, this field **must be set** in case the KubeConfigFile does not contain any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying patches to components deployed by kubeadm during "kubeadm join". The minimum kubernetes version needed to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic" "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. These files can be written into the target directory via KubeadmConfig.Files which specifies additional files to be created on the machine, either with content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during command execution. The list of phases can be obtained with the "kubeadm init --help" command. This option takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command with a shell script with retries for joins. \n This is meant to be an experimental temporary workaround on some environments where joins fail due to timing (and other issues). The long term goal is to add retries to kubeadm proper and use that functionality. \n This will add about 40KB to userdata \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055. Deprecated: This experimental fix is no longer needed and this field will be removed in a future release." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of passwd to populate the passwd. - properties: - secret: - description: Secret represents a secret that should populate this password. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - type: object - required: - - template - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-manager - namespace: capi-kubeadm-bootstrap-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-leader-election-role - namespace: capi-kubeadm-bootstrap-system -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-manager-role -rules: -- apiGroups: - - "" - resources: - - configmaps - - events - - secrets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - bootstrap.cluster.x-k8s.io - resources: - - kubeadmconfigs - - kubeadmconfigs/finalizers - - kubeadmconfigs/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - - machinepools - - machinepools/status - - machines - - machines/status - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-leader-election-rolebinding - namespace: capi-kubeadm-bootstrap-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capi-kubeadm-bootstrap-leader-election-role -subjects: -- kind: ServiceAccount - name: capi-kubeadm-bootstrap-manager - namespace: capi-kubeadm-bootstrap-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capi-kubeadm-bootstrap-manager-role -subjects: -- kind: ServiceAccount - name: capi-kubeadm-bootstrap-manager - namespace: capi-kubeadm-bootstrap-system ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: bootstrap-kubeadm ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - control-plane: controller-manager - name: capi-kubeadm-bootstrap-controller-manager - namespace: capi-kubeadm-bootstrap-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --metrics-bind-addr=localhost:8080 - - --feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},KubeadmBootstrapFormatIgnition=${EXP_KUBEADM_BOOTSTRAP_FORMAT_IGNITION:=false} - - --bootstrap-token-ttl=${CAPBK_BOOTSTRAP_TOKEN_TTL:=15m} - command: - - /manager - image: registry.tkg.vmware.run/cluster-api/kubeadm-bootstrap-controller:${CABPK_CONTROLLER_IMAGE_TAG} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - serviceAccountName: capi-kubeadm-bootstrap-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - secretName: capi-kubeadm-bootstrap-webhook-service-cert - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-serving-cert - namespace: capi-kubeadm-bootstrap-system -spec: - dnsNames: - - capi-kubeadm-bootstrap-webhook-service.capi-kubeadm-bootstrap-system.svc - - capi-kubeadm-bootstrap-webhook-service.capi-kubeadm-bootstrap-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capi-kubeadm-bootstrap-selfsigned-issuer - secretName: capi-kubeadm-bootstrap-webhook-service-cert - subject: - organizations: - - k8s-sig-cluster-lifecycle ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-selfsigned-issuer - namespace: capi-kubeadm-bootstrap-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-bootstrap-system/capi-kubeadm-bootstrap-serving-cert - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /mutate-bootstrap-cluster-x-k8s-io-v1beta1-kubeadmconfig - failurePolicy: Fail - name: default.kubeadmconfig.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmconfigs - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /mutate-bootstrap-cluster-x-k8s-io-v1beta1-kubeadmconfigtemplate - failurePolicy: Fail - name: default.kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmconfigtemplates - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-bootstrap-system/capi-kubeadm-bootstrap-serving-cert - labels: - cluster.x-k8s.io/provider: bootstrap-kubeadm - name: capi-kubeadm-bootstrap-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /validate-bootstrap-cluster-x-k8s-io-v1beta1-kubeadmconfig - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.kubeadmconfig.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmconfigs - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-bootstrap-webhook-service - namespace: capi-kubeadm-bootstrap-system - path: /validate-bootstrap-cluster-x-k8s-io-v1beta1-kubeadmconfigtemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmconfigtemplates - sideEffects: None diff --git a/providers/bootstrap-kubeadm/v1.2.8/metadata.yaml b/providers/bootstrap-kubeadm/v1.2.8/metadata.yaml deleted file mode 100644 index 6957197b7b..0000000000 --- a/providers/bootstrap-kubeadm/v1.2.8/metadata.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: -- major: 1 - minor: 2 - contract: v1beta1 -- major: 1 - minor: 1 - contract: v1beta1 -- major: 1 - minor: 0 - contract: v1beta1 -- major: 0 - minor: 4 - contract: v1alpha4 -- major: 0 - minor: 3 - contract: v1alpha3 diff --git a/providers/cert-manager/v1.10.2/cert-manager.yaml b/providers/cert-manager/v1.10.2/cert-manager.yaml deleted file mode 100644 index ab763a43e9..0000000000 --- a/providers/cert-manager/v1.10.2/cert-manager.yaml +++ /dev/null @@ -1,5503 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: cert-manager ---- -# Source: cert-manager/templates/crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: clusterissuers.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.10.2" -spec: - group: cert-manager.io - names: - kind: ClusterIssuer - listKind: ClusterIssuerList - plural: clusterissuers - singular: clusterissuer - categories: - - cert-manager - scope: Cluster - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: A ClusterIssuer represents a certificate issuing authority which can be referenced as part of `issuerRef` fields. It is similar to an Issuer, however it is cluster-scoped and therefore can be referenced by resources that exist in *any* namespace, not just the same namespace as the referent. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the ClusterIssuer resource. - type: object - properties: - acme: - description: ACME configures this issuer to communicate with a RFC8555 (ACME) server to obtain signed x509 certificates. - type: object - required: - - privateKeySecretRef - - server - properties: - disableAccountKeyGeneration: - description: Enables or disables generating a new ACME account key. If true, the Issuer resource will *not* request a new account but will expect the account key to be supplied via an existing secret. If false, the cert-manager system will generate a new ACME account key for the Issuer. Defaults to false. - type: boolean - email: - description: Email is the email address to be associated with the ACME account. This field is optional, but it is strongly recommended to be set. It will be used to contact you in case of issues with your account or certificates, including expiry notification emails. This field may be updated after the account is initially registered. - type: string - enableDurationFeature: - description: Enables requesting a Not After date on certificates that matches the duration of the certificate. This is not supported by all ACME servers like Let's Encrypt. If set to true when the ACME server does not support it it will create an error on the Order. Defaults to false. - type: boolean - externalAccountBinding: - description: ExternalAccountBinding is a reference to a CA external account of the ACME server. If set, upon registration cert-manager will attempt to associate the given external account credentials with the registered ACME account. - type: object - required: - - keyID - - keySecretRef - properties: - keyAlgorithm: - description: 'Deprecated: keyAlgorithm field exists for historical compatibility reasons and should not be used. The algorithm is now hardcoded to HS256 in golang/x/crypto/acme.' - type: string - enum: - - HS256 - - HS384 - - HS512 - keyID: - description: keyID is the ID of the CA key that the External Account is bound to. - type: string - keySecretRef: - description: keySecretRef is a Secret Key Selector referencing a data item in a Kubernetes Secret which holds the symmetric MAC key of the External Account Binding. The `key` is the index string that is paired with the key data in the Secret and should not be confused with the key data itself, or indeed with the External Account Binding keyID above. The secret key stored in the Secret **must** be un-padded, base64 URL encoded data. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - preferredChain: - description: 'PreferredChain is the chain to use if the ACME server outputs multiple. PreferredChain is no guarantee that this one gets delivered by the ACME endpoint. For example, for Let''s Encrypt''s DST crosssign you would use: "DST Root CA X3" or "ISRG Root X1" for the newer Let''s Encrypt root CA. This value picks the first certificate bundle in the ACME alternative chains that has a certificate with this value as its issuer''s CN' - type: string - maxLength: 64 - privateKeySecretRef: - description: PrivateKey is the name of a Kubernetes Secret resource that will be used to store the automatically generated ACME account private key. Optionally, a `key` may be specified to select a specific entry within the named Secret resource. If `key` is not specified, a default of `tls.key` will be used. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - server: - description: 'Server is the URL used to access the ACME server''s ''directory'' endpoint. For example, for Let''s Encrypt''s staging endpoint, you would use: "https://acme-staging-v02.api.letsencrypt.org/directory". Only ACME v2 endpoints (i.e. RFC 8555) are supported.' - type: string - skipTLSVerify: - description: Enables or disables validation of the ACME server TLS certificate. If true, requests to the ACME server will not have their TLS certificate validated (i.e. insecure connections will be allowed). Only enable this option in development environments. The cert-manager system installed roots will be used to verify connections to the ACME server if this is false. Defaults to false. - type: boolean - solvers: - description: 'Solvers is a list of challenge solvers that will be used to solve ACME challenges for the matching domains. Solver configurations must be provided in order to obtain certificates from an ACME server. For more information, see: https://cert-manager.io/docs/configuration/acme/' - type: array - items: - description: An ACMEChallengeSolver describes how to solve ACME challenges for the issuer it is part of. A selector may be provided to use different solving strategies for different DNS names. Only one of HTTP01 or DNS01 must be provided. - type: object - properties: - dns01: - description: Configures cert-manager to attempt to complete authorizations by performing the DNS01 challenge flow. - type: object - properties: - acmeDNS: - description: Use the 'ACME DNS' (https://github.com/joohoi/acme-dns) API to manage DNS01 challenge records. - type: object - required: - - accountSecretRef - - host - properties: - accountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - host: - type: string - akamai: - description: Use the Akamai DNS zone management API to manage DNS01 challenge records. - type: object - required: - - accessTokenSecretRef - - clientSecretSecretRef - - clientTokenSecretRef - - serviceConsumerDomain - properties: - accessTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientSecretSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - serviceConsumerDomain: - type: string - azureDNS: - description: Use the Microsoft Azure DNS API to manage DNS01 challenge records. - type: object - required: - - resourceGroupName - - subscriptionID - properties: - clientID: - description: if both this and ClientSecret are left unset MSI will be used - type: string - clientSecretSecretRef: - description: if both this and ClientID are left unset MSI will be used - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - environment: - description: name of the Azure environment (default AzurePublicCloud) - type: string - enum: - - AzurePublicCloud - - AzureChinaCloud - - AzureGermanCloud - - AzureUSGovernmentCloud - hostedZoneName: - description: name of the DNS zone that should be used - type: string - managedIdentity: - description: managed identity configuration, can not be used at the same time as clientID, clientSecretSecretRef or tenantID - type: object - properties: - clientID: - description: client ID of the managed identity, can not be used at the same time as resourceID - type: string - resourceID: - description: resource ID of the managed identity, can not be used at the same time as clientID - type: string - resourceGroupName: - description: resource group the DNS zone is located in - type: string - subscriptionID: - description: ID of the Azure subscription - type: string - tenantID: - description: when specifying ClientID and ClientSecret then this field is also needed - type: string - cloudDNS: - description: Use the Google Cloud DNS API to manage DNS01 challenge records. - type: object - required: - - project - properties: - hostedZoneName: - description: HostedZoneName is an optional field that tells cert-manager in which Cloud DNS zone the challenge record has to be created. If left empty cert-manager will automatically choose a zone. - type: string - project: - type: string - serviceAccountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - cloudflare: - description: Use the Cloudflare API to manage DNS01 challenge records. - type: object - properties: - apiKeySecretRef: - description: 'API key to use to authenticate with Cloudflare. Note: using an API token to authenticate is now the recommended method as it allows greater control of permissions.' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - apiTokenSecretRef: - description: API token used to authenticate with Cloudflare. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - email: - description: Email of the account, only required when using API key based authentication. - type: string - cnameStrategy: - description: CNAMEStrategy configures how the DNS01 provider should handle CNAME records when found in DNS zones. - type: string - enum: - - None - - Follow - digitalocean: - description: Use the DigitalOcean DNS API to manage DNS01 challenge records. - type: object - required: - - tokenSecretRef - properties: - tokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - rfc2136: - description: Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/) to manage DNS01 challenge records. - type: object - required: - - nameserver - properties: - nameserver: - description: The IP address or hostname of an authoritative DNS server supporting RFC2136 in the form host:port. If the host is an IPv6 address it must be enclosed in square brackets (e.g [2001:db8::1]) ; port is optional. This field is required. - type: string - tsigAlgorithm: - description: 'The TSIG Algorithm configured in the DNS supporting RFC2136. Used only when ``tsigSecretSecretRef`` and ``tsigKeyName`` are defined. Supported values are (case-insensitive): ``HMACMD5`` (default), ``HMACSHA1``, ``HMACSHA256`` or ``HMACSHA512``.' - type: string - tsigKeyName: - description: The TSIG Key name configured in the DNS. If ``tsigSecretSecretRef`` is defined, this field is required. - type: string - tsigSecretSecretRef: - description: The name of the secret containing the TSIG value. If ``tsigKeyName`` is defined, this field is required. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - route53: - description: Use the AWS Route53 API to manage DNS01 challenge records. - type: object - required: - - region - properties: - accessKeyID: - description: 'The AccessKeyID is used for authentication. Cannot be set when SecretAccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: string - accessKeyIDSecretRef: - description: 'The SecretAccessKey is used for authentication. If set, pull the AWS access key ID from a key within a Kubernetes Secret. Cannot be set when AccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - hostedZoneID: - description: If set, the provider will manage only this zone in Route53 and will not do an lookup using the route53:ListHostedZonesByName api call. - type: string - region: - description: Always set the region when using AccessKeyID and SecretAccessKey - type: string - role: - description: Role is a Role ARN which the Route53 provider will assume using either the explicit credentials AccessKeyID/SecretAccessKey or the inferred credentials from environment variables, shared credentials file or AWS Instance metadata - type: string - secretAccessKeySecretRef: - description: 'The SecretAccessKey is used for authentication. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - webhook: - description: Configure an external webhook based DNS01 challenge solver to manage DNS01 challenge records. - type: object - required: - - groupName - - solverName - properties: - config: - description: Additional configuration that should be passed to the webhook apiserver when challenges are processed. This can contain arbitrary JSON data. Secret values should not be specified in this stanza. If secret values are needed (e.g. credentials for a DNS service), you should use a SecretKeySelector to reference a Secret resource. For details on the schema of this field, consult the webhook provider implementation's documentation. - x-kubernetes-preserve-unknown-fields: true - groupName: - description: The API group name that should be used when POSTing ChallengePayload resources to the webhook apiserver. This should be the same as the GroupName specified in the webhook provider implementation. - type: string - solverName: - description: The name of the solver to use, as defined in the webhook provider implementation. This will typically be the name of the provider, e.g. 'cloudflare'. - type: string - http01: - description: Configures cert-manager to attempt to complete authorizations by performing the HTTP01 challenge flow. It is not possible to obtain certificates for wildcard domain names (e.g. `*.example.com`) using the HTTP01 challenge mechanism. - type: object - properties: - gatewayHTTPRoute: - description: The Gateway API is a sig-network community API that models service networking in Kubernetes (https://gateway-api.sigs.k8s.io/). The Gateway solver will create HTTPRoutes with the specified labels in the same namespace as the challenge. This solver is experimental, and fields / behaviour may change in the future. - type: object - properties: - labels: - description: Custom labels that will be applied to HTTPRoutes created by cert-manager while solving HTTP-01 challenges. - type: object - additionalProperties: - type: string - parentRefs: - description: 'When solving an HTTP-01 challenge, cert-manager creates an HTTPRoute. cert-manager needs to know which parentRefs should be used when creating the HTTPRoute. Usually, the parentRef references a Gateway. See: https://gateway-api.sigs.k8s.io/v1alpha2/api-types/httproute/#attaching-to-gateways' - type: array - items: - description: "ParentReference identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid." - type: object - required: - - name - properties: - group: - description: "Group is the group of the referent. \n Support: Core" - type: string - default: gateway.networking.k8s.io - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - kind: - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Custom (Other Resources)" - type: string - default: Gateway - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - name: - description: "Name is the name of the referent. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - namespace: - description: "Namespace is the namespace of the referent. When unspecified (or empty string), this refers to the local namespace of the Route. \n Support: Core" - type: string - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - type: integer - format: int32 - maximum: 65535 - minimum: 1 - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - ingress: - description: The ingress based HTTP01 challenge solver will solve challenges by creating or modifying Ingress resources in order to route requests for '/.well-known/acme-challenge/XYZ' to 'challenge solver' pods that are provisioned by cert-manager for each Challenge to be completed. - type: object - properties: - class: - description: The ingress class to use when creating Ingress resources to solve ACME challenges that use this challenge solver. Only one of 'class' or 'name' may be specified. - type: string - ingressTemplate: - description: Optional ingress template used to configure the ACME challenge solver ingress used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the ingress used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - name: - description: The name of the ingress resource that should have ACME challenge solving routes inserted into it in order to solve HTTP01 challenges. This is typically used in conjunction with ingress controllers like ingress-gce, which maintains a 1:1 mapping between external IPs and ingress resources. - type: string - podTemplate: - description: Optional pod template used to configure the ACME challenge solver pods used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the pod used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the create ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - spec: - description: PodSpec defines overrides for the HTTP01 challenge solver pod. Only the 'priorityClassName', 'nodeSelector', 'affinity', 'serviceAccountName' and 'tolerations' fields are supported currently. All other fields will be ignored. - type: object - properties: - affinity: - description: If specified, the pod's scheduling constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. - type: array - items: - description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). - type: object - required: - - preference - - weight - properties: - preference: - description: A node selector term, associated with the corresponding weight. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - x-kubernetes-map-type: atomic - weight: - description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. The terms are ORed. - type: array - items: - description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - x-kubernetes-map-type: atomic - x-kubernetes-map-type: atomic - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - nodeSelector: - description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - priorityClassName: - description: If specified, the pod's priorityClassName. - type: string - serviceAccountName: - description: If specified, the pod's service account - type: string - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - selector: - description: Selector selects a set of DNSNames on the Certificate resource that should be solved using this challenge solver. If not specified, the solver will be treated as the 'default' solver with the lowest priority, i.e. if any other solver has a more specific match, it will be used instead. - type: object - properties: - dnsNames: - description: List of DNSNames that this solver will be used to solve. If specified and a match is found, a dnsNames selector will take precedence over a dnsZones selector. If multiple solvers match with the same dnsNames value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - dnsZones: - description: List of DNSZones that this solver will be used to solve. The most specific DNS zone match specified here will take precedence over other DNS zone matches, so a solver specifying sys.example.com will be selected over one specifying example.com for the domain www.sys.example.com. If multiple solvers match with the same dnsZones value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - matchLabels: - description: A label selector that is used to refine the set of certificate's that this challenge solver will apply to. - type: object - additionalProperties: - type: string - ca: - description: CA configures this issuer to sign certificates using a signing CA keypair stored in a Secret resource. This is used to build internal PKIs that are managed by cert-manager. - type: object - required: - - secretName - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set, certificates will be issued without distribution points set. - type: array - items: - type: string - ocspServers: - description: The OCSP server list is an X.509 v3 extension that defines a list of URLs of OCSP responders. The OCSP responders can be queried for the revocation status of an issued certificate. If not set, the certificate will be issued with no OCSP servers set. For example, an OCSP server URL could be "http://ocsp.int-x3.letsencrypt.org". - type: array - items: - type: string - secretName: - description: SecretName is the name of the secret used to sign Certificates issued by this Issuer. - type: string - selfSigned: - description: SelfSigned configures this issuer to 'self sign' certificates using the private key used to create the CertificateRequest object. - type: object - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set certificate will be issued without CDP. Values are strings. - type: array - items: - type: string - vault: - description: Vault configures this issuer to sign certificates using a HashiCorp Vault PKI backend. - type: object - required: - - auth - - path - - server - properties: - auth: - description: Auth configures how cert-manager authenticates with the Vault server. - type: object - properties: - appRole: - description: AppRole authenticates with Vault using the App Role auth mechanism, with the role and secret stored in a Kubernetes Secret resource. - type: object - required: - - path - - roleId - - secretRef - properties: - path: - description: 'Path where the App Role authentication backend is mounted in Vault, e.g: "approle"' - type: string - roleId: - description: RoleID configured in the App Role authentication backend when setting up the authentication backend in Vault. - type: string - secretRef: - description: Reference to a key in a Secret that contains the App Role secret used to authenticate with Vault. The `key` field must be specified and denotes which entry within the Secret resource is used as the app role secret. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - kubernetes: - description: Kubernetes authenticates with Vault by passing the ServiceAccount token stored in the named Secret resource to the Vault server. - type: object - required: - - role - - secretRef - properties: - mountPath: - description: The Vault mountPath here is the mount path to use when authenticating with Vault. For example, setting a value to `/v1/auth/foo`, will use the path `/v1/auth/foo/login` to authenticate with Vault. If unspecified, the default value "/v1/auth/kubernetes" will be used. - type: string - role: - description: A required field containing the Vault Role to assume. A Role binds a Kubernetes ServiceAccount with a set of Vault policies. - type: string - secretRef: - description: The required Secret field containing a Kubernetes ServiceAccount JWT used for authenticating with Vault. Use of 'ambient credentials' is not supported. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - tokenSecretRef: - description: TokenSecretRef authenticates with Vault by presenting a token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - caBundle: - description: PEM-encoded CA bundle (base64-encoded) used to validate Vault server certificate. Only used if the Server URL is using HTTPS protocol. This parameter is ignored for plain HTTP protocol connection. If not set the system root certificates are used to validate the TLS connection. Mutually exclusive with CABundleSecretRef. If neither CABundle nor CABundleSecretRef are defined, the cert-manager controller system root certificates are used to validate the TLS connection. - type: string - format: byte - caBundleSecretRef: - description: CABundleSecretRef is a reference to a Secret which contains the CABundle which will be used when connecting to Vault when using HTTPS. Mutually exclusive with CABundle. If neither CABundleSecretRef nor CABundle are defined, the cert-manager controller system root certificates are used to validate the TLS connection. If no key for the Secret is specified, cert-manager will default to 'ca.crt'. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Name of the vault namespace. Namespaces is a set of features within Vault Enterprise that allows Vault environments to support Secure Multi-tenancy. e.g: "ns1" More about namespaces can be found here https://www.vaultproject.io/docs/enterprise/namespaces' - type: string - path: - description: 'Path is the mount path of the Vault PKI backend''s `sign` endpoint, e.g: "my_pki_mount/sign/my-role-name".' - type: string - server: - description: 'Server is the connection address for the Vault server, e.g: "https://vault.example.com:8200".' - type: string - venafi: - description: Venafi configures this issuer to sign certificates using a Venafi TPP or Venafi Cloud policy zone. - type: object - required: - - zone - properties: - cloud: - description: Cloud specifies the Venafi cloud configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - apiTokenSecretRef - properties: - apiTokenSecretRef: - description: APITokenSecretRef is a secret key selector for the Venafi Cloud API token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: URL is the base URL for Venafi Cloud. Defaults to "https://api.venafi.cloud/v1". - type: string - tpp: - description: TPP specifies Trust Protection Platform configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - credentialsRef - - url - properties: - caBundle: - description: CABundle is a PEM encoded TLS certificate to use to verify connections to the TPP instance. If specified, system roots will not be used and the issuing CA for the TPP instance must be verifiable using the provided root. If not specified, the connection will be verified using the cert-manager system root certificates. - type: string - format: byte - credentialsRef: - description: CredentialsRef is a reference to a Secret containing the username and password for the TPP server. The secret must contain two keys, 'username' and 'password'. - type: object - required: - - name - properties: - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: 'URL is the base URL for the vedsdk endpoint of the Venafi TPP instance, for example: "https://tpp.example.com/vedsdk".' - type: string - zone: - description: Zone is the Venafi Policy Zone to use for this issuer. All requests made to the Venafi platform will be restricted by the named zone policy. This field is required. - type: string - status: - description: Status of the ClusterIssuer. This is set and managed automatically. - type: object - properties: - acme: - description: ACME specific status options. This field should only be set if the Issuer is configured to use an ACME server to issue certificates. - type: object - properties: - lastRegisteredEmail: - description: LastRegisteredEmail is the email associated with the latest registered ACME account, in order to track changes made to registered account associated with the Issuer - type: string - uri: - description: URI is the unique account identifier, which can also be used to retrieve account details from the CA - type: string - conditions: - description: List of status conditions to indicate the status of a CertificateRequest. Known condition types are `Ready`. - type: array - items: - description: IssuerCondition contains condition information for an Issuer. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - observedGeneration: - description: If set, this represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.condition[x].observedGeneration is 9, the condition is out of date with respect to the current state of the Issuer. - type: integer - format: int64 - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`). - type: string - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - served: true - storage: true ---- -# Source: cert-manager/templates/crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: challenges.acme.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.10.2" -spec: - group: acme.cert-manager.io - names: - kind: Challenge - listKind: ChallengeList - plural: challenges - singular: challenge - categories: - - cert-manager - - cert-manager-acme - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.state - name: State - type: string - - jsonPath: .spec.dnsName - name: Domain - type: string - - jsonPath: .status.reason - name: Reason - priority: 1 - type: string - - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: Challenge is a type to represent a Challenge request with an ACME server - type: object - required: - - metadata - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - type: object - required: - - authorizationURL - - dnsName - - issuerRef - - key - - solver - - token - - type - - url - properties: - authorizationURL: - description: The URL to the ACME Authorization resource that this challenge is a part of. - type: string - dnsName: - description: dnsName is the identifier that this challenge is for, e.g. example.com. If the requested DNSName is a 'wildcard', this field MUST be set to the non-wildcard domain, e.g. for `*.example.com`, it must be `example.com`. - type: string - issuerRef: - description: References a properly configured ACME-type Issuer which should be used to create this Challenge. If the Issuer does not exist, processing will be retried. If the Issuer is not an 'ACME' Issuer, an error will be returned and the Challenge will be marked as failed. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - key: - description: 'The ACME challenge key for this challenge For HTTP01 challenges, this is the value that must be responded with to complete the HTTP01 challenge in the format: `.`. For DNS01 challenges, this is the base64 encoded SHA256 sum of the `.` text that must be set as the TXT record content.' - type: string - solver: - description: Contains the domain solving configuration that should be used to solve this challenge resource. - type: object - properties: - dns01: - description: Configures cert-manager to attempt to complete authorizations by performing the DNS01 challenge flow. - type: object - properties: - acmeDNS: - description: Use the 'ACME DNS' (https://github.com/joohoi/acme-dns) API to manage DNS01 challenge records. - type: object - required: - - accountSecretRef - - host - properties: - accountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - host: - type: string - akamai: - description: Use the Akamai DNS zone management API to manage DNS01 challenge records. - type: object - required: - - accessTokenSecretRef - - clientSecretSecretRef - - clientTokenSecretRef - - serviceConsumerDomain - properties: - accessTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientSecretSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - serviceConsumerDomain: - type: string - azureDNS: - description: Use the Microsoft Azure DNS API to manage DNS01 challenge records. - type: object - required: - - resourceGroupName - - subscriptionID - properties: - clientID: - description: if both this and ClientSecret are left unset MSI will be used - type: string - clientSecretSecretRef: - description: if both this and ClientID are left unset MSI will be used - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - environment: - description: name of the Azure environment (default AzurePublicCloud) - type: string - enum: - - AzurePublicCloud - - AzureChinaCloud - - AzureGermanCloud - - AzureUSGovernmentCloud - hostedZoneName: - description: name of the DNS zone that should be used - type: string - managedIdentity: - description: managed identity configuration, can not be used at the same time as clientID, clientSecretSecretRef or tenantID - type: object - properties: - clientID: - description: client ID of the managed identity, can not be used at the same time as resourceID - type: string - resourceID: - description: resource ID of the managed identity, can not be used at the same time as clientID - type: string - resourceGroupName: - description: resource group the DNS zone is located in - type: string - subscriptionID: - description: ID of the Azure subscription - type: string - tenantID: - description: when specifying ClientID and ClientSecret then this field is also needed - type: string - cloudDNS: - description: Use the Google Cloud DNS API to manage DNS01 challenge records. - type: object - required: - - project - properties: - hostedZoneName: - description: HostedZoneName is an optional field that tells cert-manager in which Cloud DNS zone the challenge record has to be created. If left empty cert-manager will automatically choose a zone. - type: string - project: - type: string - serviceAccountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - cloudflare: - description: Use the Cloudflare API to manage DNS01 challenge records. - type: object - properties: - apiKeySecretRef: - description: 'API key to use to authenticate with Cloudflare. Note: using an API token to authenticate is now the recommended method as it allows greater control of permissions.' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - apiTokenSecretRef: - description: API token used to authenticate with Cloudflare. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - email: - description: Email of the account, only required when using API key based authentication. - type: string - cnameStrategy: - description: CNAMEStrategy configures how the DNS01 provider should handle CNAME records when found in DNS zones. - type: string - enum: - - None - - Follow - digitalocean: - description: Use the DigitalOcean DNS API to manage DNS01 challenge records. - type: object - required: - - tokenSecretRef - properties: - tokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - rfc2136: - description: Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/) to manage DNS01 challenge records. - type: object - required: - - nameserver - properties: - nameserver: - description: The IP address or hostname of an authoritative DNS server supporting RFC2136 in the form host:port. If the host is an IPv6 address it must be enclosed in square brackets (e.g [2001:db8::1]) ; port is optional. This field is required. - type: string - tsigAlgorithm: - description: 'The TSIG Algorithm configured in the DNS supporting RFC2136. Used only when ``tsigSecretSecretRef`` and ``tsigKeyName`` are defined. Supported values are (case-insensitive): ``HMACMD5`` (default), ``HMACSHA1``, ``HMACSHA256`` or ``HMACSHA512``.' - type: string - tsigKeyName: - description: The TSIG Key name configured in the DNS. If ``tsigSecretSecretRef`` is defined, this field is required. - type: string - tsigSecretSecretRef: - description: The name of the secret containing the TSIG value. If ``tsigKeyName`` is defined, this field is required. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - route53: - description: Use the AWS Route53 API to manage DNS01 challenge records. - type: object - required: - - region - properties: - accessKeyID: - description: 'The AccessKeyID is used for authentication. Cannot be set when SecretAccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: string - accessKeyIDSecretRef: - description: 'The SecretAccessKey is used for authentication. If set, pull the AWS access key ID from a key within a Kubernetes Secret. Cannot be set when AccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - hostedZoneID: - description: If set, the provider will manage only this zone in Route53 and will not do an lookup using the route53:ListHostedZonesByName api call. - type: string - region: - description: Always set the region when using AccessKeyID and SecretAccessKey - type: string - role: - description: Role is a Role ARN which the Route53 provider will assume using either the explicit credentials AccessKeyID/SecretAccessKey or the inferred credentials from environment variables, shared credentials file or AWS Instance metadata - type: string - secretAccessKeySecretRef: - description: 'The SecretAccessKey is used for authentication. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - webhook: - description: Configure an external webhook based DNS01 challenge solver to manage DNS01 challenge records. - type: object - required: - - groupName - - solverName - properties: - config: - description: Additional configuration that should be passed to the webhook apiserver when challenges are processed. This can contain arbitrary JSON data. Secret values should not be specified in this stanza. If secret values are needed (e.g. credentials for a DNS service), you should use a SecretKeySelector to reference a Secret resource. For details on the schema of this field, consult the webhook provider implementation's documentation. - x-kubernetes-preserve-unknown-fields: true - groupName: - description: The API group name that should be used when POSTing ChallengePayload resources to the webhook apiserver. This should be the same as the GroupName specified in the webhook provider implementation. - type: string - solverName: - description: The name of the solver to use, as defined in the webhook provider implementation. This will typically be the name of the provider, e.g. 'cloudflare'. - type: string - http01: - description: Configures cert-manager to attempt to complete authorizations by performing the HTTP01 challenge flow. It is not possible to obtain certificates for wildcard domain names (e.g. `*.example.com`) using the HTTP01 challenge mechanism. - type: object - properties: - gatewayHTTPRoute: - description: The Gateway API is a sig-network community API that models service networking in Kubernetes (https://gateway-api.sigs.k8s.io/). The Gateway solver will create HTTPRoutes with the specified labels in the same namespace as the challenge. This solver is experimental, and fields / behaviour may change in the future. - type: object - properties: - labels: - description: Custom labels that will be applied to HTTPRoutes created by cert-manager while solving HTTP-01 challenges. - type: object - additionalProperties: - type: string - parentRefs: - description: 'When solving an HTTP-01 challenge, cert-manager creates an HTTPRoute. cert-manager needs to know which parentRefs should be used when creating the HTTPRoute. Usually, the parentRef references a Gateway. See: https://gateway-api.sigs.k8s.io/v1alpha2/api-types/httproute/#attaching-to-gateways' - type: array - items: - description: "ParentReference identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid." - type: object - required: - - name - properties: - group: - description: "Group is the group of the referent. \n Support: Core" - type: string - default: gateway.networking.k8s.io - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - kind: - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Custom (Other Resources)" - type: string - default: Gateway - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - name: - description: "Name is the name of the referent. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - namespace: - description: "Namespace is the namespace of the referent. When unspecified (or empty string), this refers to the local namespace of the Route. \n Support: Core" - type: string - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - type: integer - format: int32 - maximum: 65535 - minimum: 1 - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - ingress: - description: The ingress based HTTP01 challenge solver will solve challenges by creating or modifying Ingress resources in order to route requests for '/.well-known/acme-challenge/XYZ' to 'challenge solver' pods that are provisioned by cert-manager for each Challenge to be completed. - type: object - properties: - class: - description: The ingress class to use when creating Ingress resources to solve ACME challenges that use this challenge solver. Only one of 'class' or 'name' may be specified. - type: string - ingressTemplate: - description: Optional ingress template used to configure the ACME challenge solver ingress used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the ingress used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - name: - description: The name of the ingress resource that should have ACME challenge solving routes inserted into it in order to solve HTTP01 challenges. This is typically used in conjunction with ingress controllers like ingress-gce, which maintains a 1:1 mapping between external IPs and ingress resources. - type: string - podTemplate: - description: Optional pod template used to configure the ACME challenge solver pods used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the pod used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the create ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - spec: - description: PodSpec defines overrides for the HTTP01 challenge solver pod. Only the 'priorityClassName', 'nodeSelector', 'affinity', 'serviceAccountName' and 'tolerations' fields are supported currently. All other fields will be ignored. - type: object - properties: - affinity: - description: If specified, the pod's scheduling constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. - type: array - items: - description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). - type: object - required: - - preference - - weight - properties: - preference: - description: A node selector term, associated with the corresponding weight. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - x-kubernetes-map-type: atomic - weight: - description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. The terms are ORed. - type: array - items: - description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - x-kubernetes-map-type: atomic - x-kubernetes-map-type: atomic - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - nodeSelector: - description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - priorityClassName: - description: If specified, the pod's priorityClassName. - type: string - serviceAccountName: - description: If specified, the pod's service account - type: string - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - selector: - description: Selector selects a set of DNSNames on the Certificate resource that should be solved using this challenge solver. If not specified, the solver will be treated as the 'default' solver with the lowest priority, i.e. if any other solver has a more specific match, it will be used instead. - type: object - properties: - dnsNames: - description: List of DNSNames that this solver will be used to solve. If specified and a match is found, a dnsNames selector will take precedence over a dnsZones selector. If multiple solvers match with the same dnsNames value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - dnsZones: - description: List of DNSZones that this solver will be used to solve. The most specific DNS zone match specified here will take precedence over other DNS zone matches, so a solver specifying sys.example.com will be selected over one specifying example.com for the domain www.sys.example.com. If multiple solvers match with the same dnsZones value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - matchLabels: - description: A label selector that is used to refine the set of certificate's that this challenge solver will apply to. - type: object - additionalProperties: - type: string - token: - description: The ACME challenge token for this challenge. This is the raw value returned from the ACME server. - type: string - type: - description: The type of ACME challenge this resource represents. One of "HTTP-01" or "DNS-01". - type: string - enum: - - HTTP-01 - - DNS-01 - url: - description: The URL of the ACME Challenge resource for this challenge. This can be used to lookup details about the status of this challenge. - type: string - wildcard: - description: wildcard will be true if this challenge is for a wildcard identifier, for example '*.example.com'. - type: boolean - status: - type: object - properties: - presented: - description: presented will be set to true if the challenge values for this challenge are currently 'presented'. This *does not* imply the self check is passing. Only that the values have been 'submitted' for the appropriate challenge mechanism (i.e. the DNS01 TXT record has been presented, or the HTTP01 configuration has been configured). - type: boolean - processing: - description: Used to denote whether this challenge should be processed or not. This field will only be set to true by the 'scheduling' component. It will only be set to false by the 'challenges' controller, after the challenge has reached a final state or timed out. If this field is set to false, the challenge controller will not take any more action. - type: boolean - reason: - description: Contains human readable information on why the Challenge is in the current state. - type: string - state: - description: Contains the current 'state' of the challenge. If not set, the state of the challenge is unknown. - type: string - enum: - - valid - - ready - - pending - - processing - - invalid - - expired - - errored - served: true - storage: true - subresources: - status: {} ---- -# Source: cert-manager/templates/crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: certificaterequests.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.10.2" -spec: - group: cert-manager.io - names: - kind: CertificateRequest - listKind: CertificateRequestList - plural: certificaterequests - shortNames: - - cr - - crs - singular: certificaterequest - categories: - - cert-manager - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Approved")].status - name: Approved - type: string - - jsonPath: .status.conditions[?(@.type=="Denied")].status - name: Denied - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .spec.issuerRef.name - name: Issuer - type: string - - jsonPath: .spec.username - name: Requestor - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: "A CertificateRequest is used to request a signed certificate from one of the configured issuers. \n All fields within the CertificateRequest's `spec` are immutable after creation. A CertificateRequest will either succeed or fail, as denoted by its `status.state` field. \n A CertificateRequest is a one-shot resource, meaning it represents a single point in time request for a certificate and cannot be re-used." - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the CertificateRequest resource. - type: object - required: - - issuerRef - - request - properties: - duration: - description: The requested 'duration' (i.e. lifetime) of the Certificate. This option may be ignored/overridden by some issuer types. - type: string - extra: - description: Extra contains extra attributes of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: object - additionalProperties: - type: array - items: - type: string - groups: - description: Groups contains group membership of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: array - items: - type: string - x-kubernetes-list-type: atomic - isCA: - description: IsCA will request to mark the certificate as valid for certificate signing when submitting to the issuer. This will automatically add the `cert sign` usage to the list of `usages`. - type: boolean - issuerRef: - description: IssuerRef is a reference to the issuer for this CertificateRequest. If the `kind` field is not set, or set to `Issuer`, an Issuer resource with the given name in the same namespace as the CertificateRequest will be used. If the `kind` field is set to `ClusterIssuer`, a ClusterIssuer with the provided name will be used. The `name` field in this stanza is required at all times. The group field refers to the API group of the issuer which defaults to `cert-manager.io` if empty. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - request: - description: The PEM-encoded x509 certificate signing request to be submitted to the CA for signing. - type: string - format: byte - uid: - description: UID contains the uid of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: string - usages: - description: Usages is the set of x509 usages that are requested for the certificate. If usages are set they SHOULD be encoded inside the CSR spec Defaults to `digital signature` and `key encipherment` if not specified. - type: array - items: - description: "KeyUsage specifies valid usage contexts for keys. See: https://tools.ietf.org/html/rfc5280#section-4.2.1.3 https://tools.ietf.org/html/rfc5280#section-4.2.1.12 \n Valid KeyUsage values are as follows: \"signing\", \"digital signature\", \"content commitment\", \"key encipherment\", \"key agreement\", \"data encipherment\", \"cert sign\", \"crl sign\", \"encipher only\", \"decipher only\", \"any\", \"server auth\", \"client auth\", \"code signing\", \"email protection\", \"s/mime\", \"ipsec end system\", \"ipsec tunnel\", \"ipsec user\", \"timestamping\", \"ocsp signing\", \"microsoft sgc\", \"netscape sgc\"" - type: string - enum: - - signing - - digital signature - - content commitment - - key encipherment - - key agreement - - data encipherment - - cert sign - - crl sign - - encipher only - - decipher only - - any - - server auth - - client auth - - code signing - - email protection - - s/mime - - ipsec end system - - ipsec tunnel - - ipsec user - - timestamping - - ocsp signing - - microsoft sgc - - netscape sgc - username: - description: Username contains the name of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: string - status: - description: Status of the CertificateRequest. This is set and managed automatically. - type: object - properties: - ca: - description: The PEM encoded x509 certificate of the signer, also known as the CA (Certificate Authority). This is set on a best-effort basis by different issuers. If not set, the CA is assumed to be unknown/not available. - type: string - format: byte - certificate: - description: The PEM encoded x509 certificate resulting from the certificate signing request. If not set, the CertificateRequest has either not been completed or has failed. More information on failure can be found by checking the `conditions` field. - type: string - format: byte - conditions: - description: List of status conditions to indicate the status of a CertificateRequest. Known condition types are `Ready` and `InvalidRequest`. - type: array - items: - description: CertificateRequestCondition contains condition information for a CertificateRequest. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`, `InvalidRequest`, `Approved`, `Denied`). - type: string - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - failureTime: - description: FailureTime stores the time that this CertificateRequest failed. This is used to influence garbage collection and back-off. - type: string - format: date-time - served: true - storage: true ---- -# Source: cert-manager/templates/crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: issuers.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.10.2" -spec: - group: cert-manager.io - names: - kind: Issuer - listKind: IssuerList - plural: issuers - singular: issuer - categories: - - cert-manager - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: An Issuer represents a certificate issuing authority which can be referenced as part of `issuerRef` fields. It is scoped to a single namespace and can therefore only be referenced by resources within the same namespace. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the Issuer resource. - type: object - properties: - acme: - description: ACME configures this issuer to communicate with a RFC8555 (ACME) server to obtain signed x509 certificates. - type: object - required: - - privateKeySecretRef - - server - properties: - disableAccountKeyGeneration: - description: Enables or disables generating a new ACME account key. If true, the Issuer resource will *not* request a new account but will expect the account key to be supplied via an existing secret. If false, the cert-manager system will generate a new ACME account key for the Issuer. Defaults to false. - type: boolean - email: - description: Email is the email address to be associated with the ACME account. This field is optional, but it is strongly recommended to be set. It will be used to contact you in case of issues with your account or certificates, including expiry notification emails. This field may be updated after the account is initially registered. - type: string - enableDurationFeature: - description: Enables requesting a Not After date on certificates that matches the duration of the certificate. This is not supported by all ACME servers like Let's Encrypt. If set to true when the ACME server does not support it it will create an error on the Order. Defaults to false. - type: boolean - externalAccountBinding: - description: ExternalAccountBinding is a reference to a CA external account of the ACME server. If set, upon registration cert-manager will attempt to associate the given external account credentials with the registered ACME account. - type: object - required: - - keyID - - keySecretRef - properties: - keyAlgorithm: - description: 'Deprecated: keyAlgorithm field exists for historical compatibility reasons and should not be used. The algorithm is now hardcoded to HS256 in golang/x/crypto/acme.' - type: string - enum: - - HS256 - - HS384 - - HS512 - keyID: - description: keyID is the ID of the CA key that the External Account is bound to. - type: string - keySecretRef: - description: keySecretRef is a Secret Key Selector referencing a data item in a Kubernetes Secret which holds the symmetric MAC key of the External Account Binding. The `key` is the index string that is paired with the key data in the Secret and should not be confused with the key data itself, or indeed with the External Account Binding keyID above. The secret key stored in the Secret **must** be un-padded, base64 URL encoded data. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - preferredChain: - description: 'PreferredChain is the chain to use if the ACME server outputs multiple. PreferredChain is no guarantee that this one gets delivered by the ACME endpoint. For example, for Let''s Encrypt''s DST crosssign you would use: "DST Root CA X3" or "ISRG Root X1" for the newer Let''s Encrypt root CA. This value picks the first certificate bundle in the ACME alternative chains that has a certificate with this value as its issuer''s CN' - type: string - maxLength: 64 - privateKeySecretRef: - description: PrivateKey is the name of a Kubernetes Secret resource that will be used to store the automatically generated ACME account private key. Optionally, a `key` may be specified to select a specific entry within the named Secret resource. If `key` is not specified, a default of `tls.key` will be used. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - server: - description: 'Server is the URL used to access the ACME server''s ''directory'' endpoint. For example, for Let''s Encrypt''s staging endpoint, you would use: "https://acme-staging-v02.api.letsencrypt.org/directory". Only ACME v2 endpoints (i.e. RFC 8555) are supported.' - type: string - skipTLSVerify: - description: Enables or disables validation of the ACME server TLS certificate. If true, requests to the ACME server will not have their TLS certificate validated (i.e. insecure connections will be allowed). Only enable this option in development environments. The cert-manager system installed roots will be used to verify connections to the ACME server if this is false. Defaults to false. - type: boolean - solvers: - description: 'Solvers is a list of challenge solvers that will be used to solve ACME challenges for the matching domains. Solver configurations must be provided in order to obtain certificates from an ACME server. For more information, see: https://cert-manager.io/docs/configuration/acme/' - type: array - items: - description: An ACMEChallengeSolver describes how to solve ACME challenges for the issuer it is part of. A selector may be provided to use different solving strategies for different DNS names. Only one of HTTP01 or DNS01 must be provided. - type: object - properties: - dns01: - description: Configures cert-manager to attempt to complete authorizations by performing the DNS01 challenge flow. - type: object - properties: - acmeDNS: - description: Use the 'ACME DNS' (https://github.com/joohoi/acme-dns) API to manage DNS01 challenge records. - type: object - required: - - accountSecretRef - - host - properties: - accountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - host: - type: string - akamai: - description: Use the Akamai DNS zone management API to manage DNS01 challenge records. - type: object - required: - - accessTokenSecretRef - - clientSecretSecretRef - - clientTokenSecretRef - - serviceConsumerDomain - properties: - accessTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientSecretSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - serviceConsumerDomain: - type: string - azureDNS: - description: Use the Microsoft Azure DNS API to manage DNS01 challenge records. - type: object - required: - - resourceGroupName - - subscriptionID - properties: - clientID: - description: if both this and ClientSecret are left unset MSI will be used - type: string - clientSecretSecretRef: - description: if both this and ClientID are left unset MSI will be used - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - environment: - description: name of the Azure environment (default AzurePublicCloud) - type: string - enum: - - AzurePublicCloud - - AzureChinaCloud - - AzureGermanCloud - - AzureUSGovernmentCloud - hostedZoneName: - description: name of the DNS zone that should be used - type: string - managedIdentity: - description: managed identity configuration, can not be used at the same time as clientID, clientSecretSecretRef or tenantID - type: object - properties: - clientID: - description: client ID of the managed identity, can not be used at the same time as resourceID - type: string - resourceID: - description: resource ID of the managed identity, can not be used at the same time as clientID - type: string - resourceGroupName: - description: resource group the DNS zone is located in - type: string - subscriptionID: - description: ID of the Azure subscription - type: string - tenantID: - description: when specifying ClientID and ClientSecret then this field is also needed - type: string - cloudDNS: - description: Use the Google Cloud DNS API to manage DNS01 challenge records. - type: object - required: - - project - properties: - hostedZoneName: - description: HostedZoneName is an optional field that tells cert-manager in which Cloud DNS zone the challenge record has to be created. If left empty cert-manager will automatically choose a zone. - type: string - project: - type: string - serviceAccountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - cloudflare: - description: Use the Cloudflare API to manage DNS01 challenge records. - type: object - properties: - apiKeySecretRef: - description: 'API key to use to authenticate with Cloudflare. Note: using an API token to authenticate is now the recommended method as it allows greater control of permissions.' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - apiTokenSecretRef: - description: API token used to authenticate with Cloudflare. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - email: - description: Email of the account, only required when using API key based authentication. - type: string - cnameStrategy: - description: CNAMEStrategy configures how the DNS01 provider should handle CNAME records when found in DNS zones. - type: string - enum: - - None - - Follow - digitalocean: - description: Use the DigitalOcean DNS API to manage DNS01 challenge records. - type: object - required: - - tokenSecretRef - properties: - tokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - rfc2136: - description: Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/) to manage DNS01 challenge records. - type: object - required: - - nameserver - properties: - nameserver: - description: The IP address or hostname of an authoritative DNS server supporting RFC2136 in the form host:port. If the host is an IPv6 address it must be enclosed in square brackets (e.g [2001:db8::1]) ; port is optional. This field is required. - type: string - tsigAlgorithm: - description: 'The TSIG Algorithm configured in the DNS supporting RFC2136. Used only when ``tsigSecretSecretRef`` and ``tsigKeyName`` are defined. Supported values are (case-insensitive): ``HMACMD5`` (default), ``HMACSHA1``, ``HMACSHA256`` or ``HMACSHA512``.' - type: string - tsigKeyName: - description: The TSIG Key name configured in the DNS. If ``tsigSecretSecretRef`` is defined, this field is required. - type: string - tsigSecretSecretRef: - description: The name of the secret containing the TSIG value. If ``tsigKeyName`` is defined, this field is required. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - route53: - description: Use the AWS Route53 API to manage DNS01 challenge records. - type: object - required: - - region - properties: - accessKeyID: - description: 'The AccessKeyID is used for authentication. Cannot be set when SecretAccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: string - accessKeyIDSecretRef: - description: 'The SecretAccessKey is used for authentication. If set, pull the AWS access key ID from a key within a Kubernetes Secret. Cannot be set when AccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - hostedZoneID: - description: If set, the provider will manage only this zone in Route53 and will not do an lookup using the route53:ListHostedZonesByName api call. - type: string - region: - description: Always set the region when using AccessKeyID and SecretAccessKey - type: string - role: - description: Role is a Role ARN which the Route53 provider will assume using either the explicit credentials AccessKeyID/SecretAccessKey or the inferred credentials from environment variables, shared credentials file or AWS Instance metadata - type: string - secretAccessKeySecretRef: - description: 'The SecretAccessKey is used for authentication. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - webhook: - description: Configure an external webhook based DNS01 challenge solver to manage DNS01 challenge records. - type: object - required: - - groupName - - solverName - properties: - config: - description: Additional configuration that should be passed to the webhook apiserver when challenges are processed. This can contain arbitrary JSON data. Secret values should not be specified in this stanza. If secret values are needed (e.g. credentials for a DNS service), you should use a SecretKeySelector to reference a Secret resource. For details on the schema of this field, consult the webhook provider implementation's documentation. - x-kubernetes-preserve-unknown-fields: true - groupName: - description: The API group name that should be used when POSTing ChallengePayload resources to the webhook apiserver. This should be the same as the GroupName specified in the webhook provider implementation. - type: string - solverName: - description: The name of the solver to use, as defined in the webhook provider implementation. This will typically be the name of the provider, e.g. 'cloudflare'. - type: string - http01: - description: Configures cert-manager to attempt to complete authorizations by performing the HTTP01 challenge flow. It is not possible to obtain certificates for wildcard domain names (e.g. `*.example.com`) using the HTTP01 challenge mechanism. - type: object - properties: - gatewayHTTPRoute: - description: The Gateway API is a sig-network community API that models service networking in Kubernetes (https://gateway-api.sigs.k8s.io/). The Gateway solver will create HTTPRoutes with the specified labels in the same namespace as the challenge. This solver is experimental, and fields / behaviour may change in the future. - type: object - properties: - labels: - description: Custom labels that will be applied to HTTPRoutes created by cert-manager while solving HTTP-01 challenges. - type: object - additionalProperties: - type: string - parentRefs: - description: 'When solving an HTTP-01 challenge, cert-manager creates an HTTPRoute. cert-manager needs to know which parentRefs should be used when creating the HTTPRoute. Usually, the parentRef references a Gateway. See: https://gateway-api.sigs.k8s.io/v1alpha2/api-types/httproute/#attaching-to-gateways' - type: array - items: - description: "ParentReference identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid." - type: object - required: - - name - properties: - group: - description: "Group is the group of the referent. \n Support: Core" - type: string - default: gateway.networking.k8s.io - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - kind: - description: "Kind is kind of the referent. \n Support: Core (Gateway) \n Support: Custom (Other Resources)" - type: string - default: Gateway - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - name: - description: "Name is the name of the referent. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - namespace: - description: "Namespace is the namespace of the referent. When unspecified (or empty string), this refers to the local namespace of the Route. \n Support: Core" - type: string - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - port: - description: "Port is the network port this Route targets. It can be interpreted differently based on the type of parent resource. \n When the parent resource is a Gateway, this targets all listeners listening on the specified port that also support this kind of Route(and select this Route). It's not recommended to set `Port` unless the networking behaviors specified in a Route must apply to a specific port as opposed to a listener(s) whose port(s) may be changed. When both Port and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support other parent resources. Implementations supporting other types of parent resources MUST clearly document how/if Port is interpreted. \n For the purpose of status, an attachment is considered successful as long as the parent resource accepts it partially. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Extended \n " - type: integer - format: int32 - maximum: 65535 - minimum: 1 - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name. When both Port (experimental) and SectionName are specified, the name and port of the selected listener must match both specified values. \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - ingress: - description: The ingress based HTTP01 challenge solver will solve challenges by creating or modifying Ingress resources in order to route requests for '/.well-known/acme-challenge/XYZ' to 'challenge solver' pods that are provisioned by cert-manager for each Challenge to be completed. - type: object - properties: - class: - description: The ingress class to use when creating Ingress resources to solve ACME challenges that use this challenge solver. Only one of 'class' or 'name' may be specified. - type: string - ingressTemplate: - description: Optional ingress template used to configure the ACME challenge solver ingress used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the ingress used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - name: - description: The name of the ingress resource that should have ACME challenge solving routes inserted into it in order to solve HTTP01 challenges. This is typically used in conjunction with ingress controllers like ingress-gce, which maintains a 1:1 mapping between external IPs and ingress resources. - type: string - podTemplate: - description: Optional pod template used to configure the ACME challenge solver pods used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the pod used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the create ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - spec: - description: PodSpec defines overrides for the HTTP01 challenge solver pod. Only the 'priorityClassName', 'nodeSelector', 'affinity', 'serviceAccountName' and 'tolerations' fields are supported currently. All other fields will be ignored. - type: object - properties: - affinity: - description: If specified, the pod's scheduling constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. - type: array - items: - description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). - type: object - required: - - preference - - weight - properties: - preference: - description: A node selector term, associated with the corresponding weight. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - x-kubernetes-map-type: atomic - weight: - description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. The terms are ORed. - type: array - items: - description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - x-kubernetes-map-type: atomic - x-kubernetes-map-type: atomic - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - x-kubernetes-map-type: atomic - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - nodeSelector: - description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - priorityClassName: - description: If specified, the pod's priorityClassName. - type: string - serviceAccountName: - description: If specified, the pod's service account - type: string - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - selector: - description: Selector selects a set of DNSNames on the Certificate resource that should be solved using this challenge solver. If not specified, the solver will be treated as the 'default' solver with the lowest priority, i.e. if any other solver has a more specific match, it will be used instead. - type: object - properties: - dnsNames: - description: List of DNSNames that this solver will be used to solve. If specified and a match is found, a dnsNames selector will take precedence over a dnsZones selector. If multiple solvers match with the same dnsNames value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - dnsZones: - description: List of DNSZones that this solver will be used to solve. The most specific DNS zone match specified here will take precedence over other DNS zone matches, so a solver specifying sys.example.com will be selected over one specifying example.com for the domain www.sys.example.com. If multiple solvers match with the same dnsZones value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - matchLabels: - description: A label selector that is used to refine the set of certificate's that this challenge solver will apply to. - type: object - additionalProperties: - type: string - ca: - description: CA configures this issuer to sign certificates using a signing CA keypair stored in a Secret resource. This is used to build internal PKIs that are managed by cert-manager. - type: object - required: - - secretName - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set, certificates will be issued without distribution points set. - type: array - items: - type: string - ocspServers: - description: The OCSP server list is an X.509 v3 extension that defines a list of URLs of OCSP responders. The OCSP responders can be queried for the revocation status of an issued certificate. If not set, the certificate will be issued with no OCSP servers set. For example, an OCSP server URL could be "http://ocsp.int-x3.letsencrypt.org". - type: array - items: - type: string - secretName: - description: SecretName is the name of the secret used to sign Certificates issued by this Issuer. - type: string - selfSigned: - description: SelfSigned configures this issuer to 'self sign' certificates using the private key used to create the CertificateRequest object. - type: object - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set certificate will be issued without CDP. Values are strings. - type: array - items: - type: string - vault: - description: Vault configures this issuer to sign certificates using a HashiCorp Vault PKI backend. - type: object - required: - - auth - - path - - server - properties: - auth: - description: Auth configures how cert-manager authenticates with the Vault server. - type: object - properties: - appRole: - description: AppRole authenticates with Vault using the App Role auth mechanism, with the role and secret stored in a Kubernetes Secret resource. - type: object - required: - - path - - roleId - - secretRef - properties: - path: - description: 'Path where the App Role authentication backend is mounted in Vault, e.g: "approle"' - type: string - roleId: - description: RoleID configured in the App Role authentication backend when setting up the authentication backend in Vault. - type: string - secretRef: - description: Reference to a key in a Secret that contains the App Role secret used to authenticate with Vault. The `key` field must be specified and denotes which entry within the Secret resource is used as the app role secret. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - kubernetes: - description: Kubernetes authenticates with Vault by passing the ServiceAccount token stored in the named Secret resource to the Vault server. - type: object - required: - - role - - secretRef - properties: - mountPath: - description: The Vault mountPath here is the mount path to use when authenticating with Vault. For example, setting a value to `/v1/auth/foo`, will use the path `/v1/auth/foo/login` to authenticate with Vault. If unspecified, the default value "/v1/auth/kubernetes" will be used. - type: string - role: - description: A required field containing the Vault Role to assume. A Role binds a Kubernetes ServiceAccount with a set of Vault policies. - type: string - secretRef: - description: The required Secret field containing a Kubernetes ServiceAccount JWT used for authenticating with Vault. Use of 'ambient credentials' is not supported. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - tokenSecretRef: - description: TokenSecretRef authenticates with Vault by presenting a token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - caBundle: - description: PEM-encoded CA bundle (base64-encoded) used to validate Vault server certificate. Only used if the Server URL is using HTTPS protocol. This parameter is ignored for plain HTTP protocol connection. If not set the system root certificates are used to validate the TLS connection. Mutually exclusive with CABundleSecretRef. If neither CABundle nor CABundleSecretRef are defined, the cert-manager controller system root certificates are used to validate the TLS connection. - type: string - format: byte - caBundleSecretRef: - description: CABundleSecretRef is a reference to a Secret which contains the CABundle which will be used when connecting to Vault when using HTTPS. Mutually exclusive with CABundle. If neither CABundleSecretRef nor CABundle are defined, the cert-manager controller system root certificates are used to validate the TLS connection. If no key for the Secret is specified, cert-manager will default to 'ca.crt'. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Name of the vault namespace. Namespaces is a set of features within Vault Enterprise that allows Vault environments to support Secure Multi-tenancy. e.g: "ns1" More about namespaces can be found here https://www.vaultproject.io/docs/enterprise/namespaces' - type: string - path: - description: 'Path is the mount path of the Vault PKI backend''s `sign` endpoint, e.g: "my_pki_mount/sign/my-role-name".' - type: string - server: - description: 'Server is the connection address for the Vault server, e.g: "https://vault.example.com:8200".' - type: string - venafi: - description: Venafi configures this issuer to sign certificates using a Venafi TPP or Venafi Cloud policy zone. - type: object - required: - - zone - properties: - cloud: - description: Cloud specifies the Venafi cloud configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - apiTokenSecretRef - properties: - apiTokenSecretRef: - description: APITokenSecretRef is a secret key selector for the Venafi Cloud API token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: URL is the base URL for Venafi Cloud. Defaults to "https://api.venafi.cloud/v1". - type: string - tpp: - description: TPP specifies Trust Protection Platform configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - credentialsRef - - url - properties: - caBundle: - description: CABundle is a PEM encoded TLS certificate to use to verify connections to the TPP instance. If specified, system roots will not be used and the issuing CA for the TPP instance must be verifiable using the provided root. If not specified, the connection will be verified using the cert-manager system root certificates. - type: string - format: byte - credentialsRef: - description: CredentialsRef is a reference to a Secret containing the username and password for the TPP server. The secret must contain two keys, 'username' and 'password'. - type: object - required: - - name - properties: - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: 'URL is the base URL for the vedsdk endpoint of the Venafi TPP instance, for example: "https://tpp.example.com/vedsdk".' - type: string - zone: - description: Zone is the Venafi Policy Zone to use for this issuer. All requests made to the Venafi platform will be restricted by the named zone policy. This field is required. - type: string - status: - description: Status of the Issuer. This is set and managed automatically. - type: object - properties: - acme: - description: ACME specific status options. This field should only be set if the Issuer is configured to use an ACME server to issue certificates. - type: object - properties: - lastRegisteredEmail: - description: LastRegisteredEmail is the email associated with the latest registered ACME account, in order to track changes made to registered account associated with the Issuer - type: string - uri: - description: URI is the unique account identifier, which can also be used to retrieve account details from the CA - type: string - conditions: - description: List of status conditions to indicate the status of a CertificateRequest. Known condition types are `Ready`. - type: array - items: - description: IssuerCondition contains condition information for an Issuer. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - observedGeneration: - description: If set, this represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.condition[x].observedGeneration is 9, the condition is out of date with respect to the current state of the Issuer. - type: integer - format: int64 - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`). - type: string - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - served: true - storage: true ---- -# Source: cert-manager/templates/crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: certificates.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.10.2" -spec: - group: cert-manager.io - names: - kind: Certificate - listKind: CertificateList - plural: certificates - shortNames: - - cert - - certs - singular: certificate - categories: - - cert-manager - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .spec.secretName - name: Secret - type: string - - jsonPath: .spec.issuerRef.name - name: Issuer - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: "A Certificate resource should be created to ensure an up to date and signed x509 certificate is stored in the Kubernetes Secret resource named in `spec.secretName`. \n The stored certificate will be renewed before it expires (as configured by `spec.renewBefore`)." - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the Certificate resource. - type: object - required: - - issuerRef - - secretName - properties: - additionalOutputFormats: - description: AdditionalOutputFormats defines extra output formats of the private key and signed certificate chain to be written to this Certificate's target Secret. This is an Alpha Feature and is only enabled with the `--feature-gates=AdditionalCertificateOutputFormats=true` option on both the controller and webhook components. - type: array - items: - description: CertificateAdditionalOutputFormat defines an additional output format of a Certificate resource. These contain supplementary data formats of the signed certificate chain and paired private key. - type: object - required: - - type - properties: - type: - description: Type is the name of the format type that should be written to the Certificate's target Secret. - type: string - enum: - - DER - - CombinedPEM - commonName: - description: 'CommonName is a common name to be used on the Certificate. The CommonName should have a length of 64 characters or fewer to avoid generating invalid CSRs. This value is ignored by TLS clients when any subject alt name is set. This is x509 behaviour: https://tools.ietf.org/html/rfc6125#section-6.4.4' - type: string - dnsNames: - description: DNSNames is a list of DNS subjectAltNames to be set on the Certificate. - type: array - items: - type: string - duration: - description: The requested 'duration' (i.e. lifetime) of the Certificate. This option may be ignored/overridden by some issuer types. If unset this defaults to 90 days. Certificate will be renewed either 2/3 through its duration or `renewBefore` period before its expiry, whichever is later. Minimum accepted duration is 1 hour. Value must be in units accepted by Go time.ParseDuration https://golang.org/pkg/time/#ParseDuration - type: string - emailAddresses: - description: EmailAddresses is a list of email subjectAltNames to be set on the Certificate. - type: array - items: - type: string - encodeUsagesInRequest: - description: EncodeUsagesInRequest controls whether key usages should be present in the CertificateRequest - type: boolean - ipAddresses: - description: IPAddresses is a list of IP address subjectAltNames to be set on the Certificate. - type: array - items: - type: string - isCA: - description: IsCA will mark this Certificate as valid for certificate signing. This will automatically add the `cert sign` usage to the list of `usages`. - type: boolean - issuerRef: - description: IssuerRef is a reference to the issuer for this certificate. If the `kind` field is not set, or set to `Issuer`, an Issuer resource with the given name in the same namespace as the Certificate will be used. If the `kind` field is set to `ClusterIssuer`, a ClusterIssuer with the provided name will be used. The `name` field in this stanza is required at all times. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - keystores: - description: Keystores configures additional keystore output formats stored in the `secretName` Secret resource. - type: object - properties: - jks: - description: JKS configures options for storing a JKS keystore in the `spec.secretName` Secret resource. - type: object - required: - - create - - passwordSecretRef - properties: - create: - description: Create enables JKS keystore creation for the Certificate. If true, a file named `keystore.jks` will be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef`. The keystore file will only be updated upon re-issuance. A file named `truststore.jks` will also be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef` containing the issuing Certificate Authority - type: boolean - passwordSecretRef: - description: PasswordSecretRef is a reference to a key in a Secret resource containing the password used to encrypt the JKS keystore. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - pkcs12: - description: PKCS12 configures options for storing a PKCS12 keystore in the `spec.secretName` Secret resource. - type: object - required: - - create - - passwordSecretRef - properties: - create: - description: Create enables PKCS12 keystore creation for the Certificate. If true, a file named `keystore.p12` will be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef`. The keystore file will only be updated upon re-issuance. A file named `truststore.p12` will also be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef` containing the issuing Certificate Authority - type: boolean - passwordSecretRef: - description: PasswordSecretRef is a reference to a key in a Secret resource containing the password used to encrypt the PKCS12 keystore. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - literalSubject: - description: LiteralSubject is an LDAP formatted string that represents the [X.509 Subject field](https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6). Use this *instead* of the Subject field if you need to ensure the correct ordering of the RDN sequence, such as when issuing certs for LDAP authentication. See https://github.com/cert-manager/cert-manager/issues/3203, https://github.com/cert-manager/cert-manager/issues/4424. This field is alpha level and is only supported by cert-manager installations where LiteralCertificateSubject feature gate is enabled on both cert-manager controller and webhook. - type: string - privateKey: - description: Options to control private keys used for the Certificate. - type: object - properties: - algorithm: - description: Algorithm is the private key algorithm of the corresponding private key for this certificate. If provided, allowed values are either `RSA`,`Ed25519` or `ECDSA` If `algorithm` is specified and `size` is not provided, key size of 256 will be used for `ECDSA` key algorithm and key size of 2048 will be used for `RSA` key algorithm. key size is ignored when using the `Ed25519` key algorithm. - type: string - enum: - - RSA - - ECDSA - - Ed25519 - encoding: - description: The private key cryptography standards (PKCS) encoding for this certificate's private key to be encoded in. If provided, allowed values are `PKCS1` and `PKCS8` standing for PKCS#1 and PKCS#8, respectively. Defaults to `PKCS1` if not specified. - type: string - enum: - - PKCS1 - - PKCS8 - rotationPolicy: - description: RotationPolicy controls how private keys should be regenerated when a re-issuance is being processed. If set to Never, a private key will only be generated if one does not already exist in the target `spec.secretName`. If one does exists but it does not have the correct algorithm or size, a warning will be raised to await user intervention. If set to Always, a private key matching the specified requirements will be generated whenever a re-issuance occurs. Default is 'Never' for backward compatibility. - type: string - enum: - - Never - - Always - size: - description: Size is the key bit size of the corresponding private key for this certificate. If `algorithm` is set to `RSA`, valid values are `2048`, `4096` or `8192`, and will default to `2048` if not specified. If `algorithm` is set to `ECDSA`, valid values are `256`, `384` or `521`, and will default to `256` if not specified. If `algorithm` is set to `Ed25519`, Size is ignored. No other values are allowed. - type: integer - renewBefore: - description: How long before the currently issued certificate's expiry cert-manager should renew the certificate. The default is 2/3 of the issued certificate's duration. Minimum accepted value is 5 minutes. Value must be in units accepted by Go time.ParseDuration https://golang.org/pkg/time/#ParseDuration - type: string - revisionHistoryLimit: - description: revisionHistoryLimit is the maximum number of CertificateRequest revisions that are maintained in the Certificate's history. Each revision represents a single `CertificateRequest` created by this Certificate, either when it was created, renewed, or Spec was changed. Revisions will be removed by oldest first if the number of revisions exceeds this number. If set, revisionHistoryLimit must be a value of `1` or greater. If unset (`nil`), revisions will not be garbage collected. Default value is `nil`. - type: integer - format: int32 - secretName: - description: SecretName is the name of the secret resource that will be automatically created and managed by this Certificate resource. It will be populated with a private key and certificate, signed by the denoted issuer. - type: string - secretTemplate: - description: SecretTemplate defines annotations and labels to be copied to the Certificate's Secret. Labels and annotations on the Secret will be changed as they appear on the SecretTemplate when added or removed. SecretTemplate annotations are added in conjunction with, and cannot overwrite, the base set of annotations cert-manager sets on the Certificate's Secret. - type: object - properties: - annotations: - description: Annotations is a key value map to be copied to the target Kubernetes Secret. - type: object - additionalProperties: - type: string - labels: - description: Labels is a key value map to be copied to the target Kubernetes Secret. - type: object - additionalProperties: - type: string - subject: - description: Full X509 name specification (https://golang.org/pkg/crypto/x509/pkix/#Name). - type: object - properties: - countries: - description: Countries to be used on the Certificate. - type: array - items: - type: string - localities: - description: Cities to be used on the Certificate. - type: array - items: - type: string - organizationalUnits: - description: Organizational Units to be used on the Certificate. - type: array - items: - type: string - organizations: - description: Organizations to be used on the Certificate. - type: array - items: - type: string - postalCodes: - description: Postal codes to be used on the Certificate. - type: array - items: - type: string - provinces: - description: State/Provinces to be used on the Certificate. - type: array - items: - type: string - serialNumber: - description: Serial number to be used on the Certificate. - type: string - streetAddresses: - description: Street addresses to be used on the Certificate. - type: array - items: - type: string - uris: - description: URIs is a list of URI subjectAltNames to be set on the Certificate. - type: array - items: - type: string - usages: - description: Usages is the set of x509 usages that are requested for the certificate. Defaults to `digital signature` and `key encipherment` if not specified. - type: array - items: - description: "KeyUsage specifies valid usage contexts for keys. See: https://tools.ietf.org/html/rfc5280#section-4.2.1.3 https://tools.ietf.org/html/rfc5280#section-4.2.1.12 \n Valid KeyUsage values are as follows: \"signing\", \"digital signature\", \"content commitment\", \"key encipherment\", \"key agreement\", \"data encipherment\", \"cert sign\", \"crl sign\", \"encipher only\", \"decipher only\", \"any\", \"server auth\", \"client auth\", \"code signing\", \"email protection\", \"s/mime\", \"ipsec end system\", \"ipsec tunnel\", \"ipsec user\", \"timestamping\", \"ocsp signing\", \"microsoft sgc\", \"netscape sgc\"" - type: string - enum: - - signing - - digital signature - - content commitment - - key encipherment - - key agreement - - data encipherment - - cert sign - - crl sign - - encipher only - - decipher only - - any - - server auth - - client auth - - code signing - - email protection - - s/mime - - ipsec end system - - ipsec tunnel - - ipsec user - - timestamping - - ocsp signing - - microsoft sgc - - netscape sgc - status: - description: Status of the Certificate. This is set and managed automatically. - type: object - properties: - conditions: - description: List of status conditions to indicate the status of certificates. Known condition types are `Ready` and `Issuing`. - type: array - items: - description: CertificateCondition contains condition information for an Certificate. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - observedGeneration: - description: If set, this represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.condition[x].observedGeneration is 9, the condition is out of date with respect to the current state of the Certificate. - type: integer - format: int64 - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`, `Issuing`). - type: string - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - failedIssuanceAttempts: - description: The number of continuous failed issuance attempts up till now. This field gets removed (if set) on a successful issuance and gets set to 1 if unset and an issuance has failed. If an issuance has failed, the delay till the next issuance will be calculated using formula time.Hour * 2 ^ (failedIssuanceAttempts - 1). - type: integer - lastFailureTime: - description: LastFailureTime is the time as recorded by the Certificate controller of the most recent failure to complete a CertificateRequest for this Certificate resource. If set, cert-manager will not re-request another Certificate until 1 hour has elapsed from this time. - type: string - format: date-time - nextPrivateKeySecretName: - description: The name of the Secret resource containing the private key to be used for the next certificate iteration. The keymanager controller will automatically set this field if the `Issuing` condition is set to `True`. It will automatically unset this field when the Issuing condition is not set or False. - type: string - notAfter: - description: The expiration time of the certificate stored in the secret named by this resource in `spec.secretName`. - type: string - format: date-time - notBefore: - description: The time after which the certificate stored in the secret named by this resource in spec.secretName is valid. - type: string - format: date-time - renewalTime: - description: RenewalTime is the time at which the certificate will be next renewed. If not set, no upcoming renewal is scheduled. - type: string - format: date-time - revision: - description: "The current 'revision' of the certificate as issued. \n When a CertificateRequest resource is created, it will have the `cert-manager.io/certificate-revision` set to one greater than the current value of this field. \n Upon issuance, this field will be set to the value of the annotation on the CertificateRequest resource used to issue the certificate. \n Persisting the value on the CertificateRequest resource allows the certificates controller to know whether a request is part of an old issuance or if it is part of the ongoing revision's issuance by checking if the revision value in the annotation is greater than this field." - type: integer - served: true - storage: true ---- -# Source: cert-manager/templates/crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: orders.acme.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.10.2" -spec: - group: acme.cert-manager.io - names: - kind: Order - listKind: OrderList - plural: orders - singular: order - categories: - - cert-manager - - cert-manager-acme - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.state - name: State - type: string - - jsonPath: .spec.issuerRef.name - name: Issuer - priority: 1 - type: string - - jsonPath: .status.reason - name: Reason - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: Order is a type to represent an Order with an ACME server - type: object - required: - - metadata - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - type: object - required: - - issuerRef - - request - properties: - commonName: - description: CommonName is the common name as specified on the DER encoded CSR. If specified, this value must also be present in `dnsNames` or `ipAddresses`. This field must match the corresponding field on the DER encoded CSR. - type: string - dnsNames: - description: DNSNames is a list of DNS names that should be included as part of the Order validation process. This field must match the corresponding field on the DER encoded CSR. - type: array - items: - type: string - duration: - description: Duration is the duration for the not after date for the requested certificate. this is set on order creation as pe the ACME spec. - type: string - ipAddresses: - description: IPAddresses is a list of IP addresses that should be included as part of the Order validation process. This field must match the corresponding field on the DER encoded CSR. - type: array - items: - type: string - issuerRef: - description: IssuerRef references a properly configured ACME-type Issuer which should be used to create this Order. If the Issuer does not exist, processing will be retried. If the Issuer is not an 'ACME' Issuer, an error will be returned and the Order will be marked as failed. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - request: - description: Certificate signing request bytes in DER encoding. This will be used when finalizing the order. This field must be set on the order. - type: string - format: byte - status: - type: object - properties: - authorizations: - description: Authorizations contains data returned from the ACME server on what authorizations must be completed in order to validate the DNS names specified on the Order. - type: array - items: - description: ACMEAuthorization contains data returned from the ACME server on an authorization that must be completed in order validate a DNS name on an ACME Order resource. - type: object - required: - - url - properties: - challenges: - description: Challenges specifies the challenge types offered by the ACME server. One of these challenge types will be selected when validating the DNS name and an appropriate Challenge resource will be created to perform the ACME challenge process. - type: array - items: - description: Challenge specifies a challenge offered by the ACME server for an Order. An appropriate Challenge resource can be created to perform the ACME challenge process. - type: object - required: - - token - - type - - url - properties: - token: - description: Token is the token that must be presented for this challenge. This is used to compute the 'key' that must also be presented. - type: string - type: - description: Type is the type of challenge being offered, e.g. 'http-01', 'dns-01', 'tls-sni-01', etc. This is the raw value retrieved from the ACME server. Only 'http-01' and 'dns-01' are supported by cert-manager, other values will be ignored. - type: string - url: - description: URL is the URL of this challenge. It can be used to retrieve additional metadata about the Challenge from the ACME server. - type: string - identifier: - description: Identifier is the DNS name to be validated as part of this authorization - type: string - initialState: - description: InitialState is the initial state of the ACME authorization when first fetched from the ACME server. If an Authorization is already 'valid', the Order controller will not create a Challenge resource for the authorization. This will occur when working with an ACME server that enables 'authz reuse' (such as Let's Encrypt's production endpoint). If not set and 'identifier' is set, the state is assumed to be pending and a Challenge will be created. - type: string - enum: - - valid - - ready - - pending - - processing - - invalid - - expired - - errored - url: - description: URL is the URL of the Authorization that must be completed - type: string - wildcard: - description: Wildcard will be true if this authorization is for a wildcard DNS name. If this is true, the identifier will be the *non-wildcard* version of the DNS name. For example, if '*.example.com' is the DNS name being validated, this field will be 'true' and the 'identifier' field will be 'example.com'. - type: boolean - certificate: - description: Certificate is a copy of the PEM encoded certificate for this Order. This field will be populated after the order has been successfully finalized with the ACME server, and the order has transitioned to the 'valid' state. - type: string - format: byte - failureTime: - description: FailureTime stores the time that this order failed. This is used to influence garbage collection and back-off. - type: string - format: date-time - finalizeURL: - description: FinalizeURL of the Order. This is used to obtain certificates for this order once it has been completed. - type: string - reason: - description: Reason optionally provides more information about a why the order is in the current state. - type: string - state: - description: State contains the current state of this Order resource. States 'success' and 'expired' are 'final' - type: string - enum: - - valid - - ready - - pending - - processing - - invalid - - expired - - errored - url: - description: URL of the Order. This will initially be empty when the resource is first created. The Order controller will populate this field when the Order is first processed. This field will be immutable after it is initially set. - type: string - served: true - storage: true ---- -# Source: cert-manager/templates/cainjector-serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: true -metadata: - name: cert-manager-cainjector - namespace: cert-manager - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.10.2" ---- -# Source: cert-manager/templates/serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: true -metadata: - name: cert-manager - namespace: cert-manager - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" ---- -# Source: cert-manager/templates/webhook-serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: true -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.10.2" ---- -# Source: cert-manager/templates/webhook-config.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" -data: ---- -# Source: cert-manager/templates/cainjector-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-cainjector - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.10.2" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["certificates"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["events"] - verbs: ["get", "create", "update", "patch"] - - apiGroups: ["admissionregistration.k8s.io"] - resources: ["validatingwebhookconfigurations", "mutatingwebhookconfigurations"] - verbs: ["get", "list", "watch", "update"] - - apiGroups: ["apiregistration.k8s.io"] - resources: ["apiservices"] - verbs: ["get", "list", "watch", "update"] - - apiGroups: ["apiextensions.k8s.io"] - resources: ["customresourcedefinitions"] - verbs: ["get", "list", "watch", "update"] ---- -# Source: cert-manager/templates/rbac.yaml -# Issuer controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-issuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["issuers", "issuers/status"] - verbs: ["update", "patch"] - - apiGroups: ["cert-manager.io"] - resources: ["issuers"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch", "create", "update", "delete"] - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] ---- -# Source: cert-manager/templates/rbac.yaml -# ClusterIssuer controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-clusterissuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["clusterissuers", "clusterissuers/status"] - verbs: ["update", "patch"] - - apiGroups: ["cert-manager.io"] - resources: ["clusterissuers"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch", "create", "update", "delete"] - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] ---- -# Source: cert-manager/templates/rbac.yaml -# Certificates controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-certificates - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificates/status", "certificaterequests", "certificaterequests/status"] - verbs: ["update", "patch"] - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificaterequests", "clusterissuers", "issuers"] - verbs: ["get", "list", "watch"] - # We require these rules to support users with the OwnerReferencesPermissionEnforcement - # admission controller enabled: - # https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement - - apiGroups: ["cert-manager.io"] - resources: ["certificates/finalizers", "certificaterequests/finalizers"] - verbs: ["update"] - - apiGroups: ["acme.cert-manager.io"] - resources: ["orders"] - verbs: ["create", "delete", "get", "list", "watch"] - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch", "create", "update", "delete", "patch"] - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] ---- -# Source: cert-manager/templates/rbac.yaml -# Orders controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-orders - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -rules: - - apiGroups: ["acme.cert-manager.io"] - resources: ["orders", "orders/status"] - verbs: ["update", "patch"] - - apiGroups: ["acme.cert-manager.io"] - resources: ["orders", "challenges"] - verbs: ["get", "list", "watch"] - - apiGroups: ["cert-manager.io"] - resources: ["clusterissuers", "issuers"] - verbs: ["get", "list", "watch"] - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges"] - verbs: ["create", "delete"] - # We require these rules to support users with the OwnerReferencesPermissionEnforcement - # admission controller enabled: - # https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement - - apiGroups: ["acme.cert-manager.io"] - resources: ["orders/finalizers"] - verbs: ["update"] - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] ---- -# Source: cert-manager/templates/rbac.yaml -# Challenges controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-challenges - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -rules: - # Use to update challenge resource status - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges", "challenges/status"] - verbs: ["update", "patch"] - # Used to watch challenge resources - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges"] - verbs: ["get", "list", "watch"] - # Used to watch challenges, issuer and clusterissuer resources - - apiGroups: ["cert-manager.io"] - resources: ["issuers", "clusterissuers"] - verbs: ["get", "list", "watch"] - # Need to be able to retrieve ACME account private key to complete challenges - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch"] - # Used to create events - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] - # HTTP01 rules - - apiGroups: [""] - resources: ["pods", "services"] - verbs: ["get", "list", "watch", "create", "delete"] - - apiGroups: ["networking.k8s.io"] - resources: ["ingresses"] - verbs: ["get", "list", "watch", "create", "delete", "update"] - - apiGroups: [ "gateway.networking.k8s.io" ] - resources: [ "httproutes" ] - verbs: ["get", "list", "watch", "create", "delete", "update"] - # We require the ability to specify a custom hostname when we are creating - # new ingress resources. - # See: https://github.com/openshift/origin/blob/21f191775636f9acadb44fa42beeb4f75b255532/pkg/route/apiserver/admission/ingress_admission.go#L84-L148 - - apiGroups: ["route.openshift.io"] - resources: ["routes/custom-host"] - verbs: ["create"] - # We require these rules to support users with the OwnerReferencesPermissionEnforcement - # admission controller enabled: - # https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges/finalizers"] - verbs: ["update"] - # DNS01 rules (duplicated above) - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch"] ---- -# Source: cert-manager/templates/rbac.yaml -# ingress-shim controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-ingress-shim - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificaterequests"] - verbs: ["create", "update", "delete"] - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificaterequests", "issuers", "clusterissuers"] - verbs: ["get", "list", "watch"] - - apiGroups: ["networking.k8s.io"] - resources: ["ingresses"] - verbs: ["get", "list", "watch"] - # We require these rules to support users with the OwnerReferencesPermissionEnforcement - # admission controller enabled: - # https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement - - apiGroups: ["networking.k8s.io"] - resources: ["ingresses/finalizers"] - verbs: ["update"] - - apiGroups: ["gateway.networking.k8s.io"] - resources: ["gateways", "httproutes"] - verbs: ["get", "list", "watch"] - - apiGroups: ["gateway.networking.k8s.io"] - resources: ["gateways/finalizers", "httproutes/finalizers"] - verbs: ["update"] - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-view - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" - rbac.authorization.k8s.io/aggregate-to-view: "true" - rbac.authorization.k8s.io/aggregate-to-edit: "true" - rbac.authorization.k8s.io/aggregate-to-admin: "true" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificaterequests", "issuers"] - verbs: ["get", "list", "watch"] - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges", "orders"] - verbs: ["get", "list", "watch"] ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-edit - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" - rbac.authorization.k8s.io/aggregate-to-edit: "true" - rbac.authorization.k8s.io/aggregate-to-admin: "true" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificaterequests", "issuers"] - verbs: ["create", "delete", "deletecollection", "patch", "update"] - - apiGroups: ["cert-manager.io"] - resources: ["certificates/status"] - verbs: ["update"] - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges", "orders"] - verbs: ["create", "delete", "deletecollection", "patch", "update"] ---- -# Source: cert-manager/templates/rbac.yaml -# Permission to approve CertificateRequests referencing cert-manager.io Issuers and ClusterIssuers -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-approve:cert-manager-io - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cert-manager" - app.kubernetes.io/version: "v1.10.2" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["signers"] - verbs: ["approve"] - resourceNames: ["issuers.cert-manager.io/*", "clusterissuers.cert-manager.io/*"] ---- -# Source: cert-manager/templates/rbac.yaml -# Permission to: -# - Update and sign CertificatSigningeRequests referencing cert-manager.io Issuers and ClusterIssuers -# - Perform SubjectAccessReviews to test whether users are able to reference Namespaced Issuers -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-certificatesigningrequests - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cert-manager" - app.kubernetes.io/version: "v1.10.2" -rules: - - apiGroups: ["certificates.k8s.io"] - resources: ["certificatesigningrequests"] - verbs: ["get", "list", "watch", "update"] - - apiGroups: ["certificates.k8s.io"] - resources: ["certificatesigningrequests/status"] - verbs: ["update", "patch"] - - apiGroups: ["certificates.k8s.io"] - resources: ["signers"] - resourceNames: ["issuers.cert-manager.io/*", "clusterissuers.cert-manager.io/*"] - verbs: ["sign"] - - apiGroups: ["authorization.k8s.io"] - resources: ["subjectaccessreviews"] - verbs: ["create"] ---- -# Source: cert-manager/templates/webhook-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-webhook:subjectaccessreviews - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.10.2" -rules: - - apiGroups: ["authorization.k8s.io"] - resources: ["subjectaccessreviews"] - verbs: ["create"] ---- -# Source: cert-manager/templates/cainjector-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-cainjector - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-cainjector -subjects: - - name: cert-manager-cainjector - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-issuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-issuers -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-clusterissuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-clusterissuers -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-certificates - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-certificates -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-orders - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-orders -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-challenges - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-challenges -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-ingress-shim - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-ingress-shim -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-approve:cert-manager-io - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cert-manager" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-approve:cert-manager-io -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-certificatesigningrequests - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cert-manager" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-certificatesigningrequests -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/webhook-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-webhook:subjectaccessreviews - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-webhook:subjectaccessreviews -subjects: - - apiGroup: "" - kind: ServiceAccount - name: cert-manager-webhook - namespace: cert-manager ---- -# Source: cert-manager/templates/cainjector-rbac.yaml -# leader election rules -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: cert-manager-cainjector:leaderelection - namespace: kube-system - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.10.2" -rules: - # Used for leader election by the controller - # cert-manager-cainjector-leader-election is used by the CertificateBased injector controller - # see cmd/cainjector/start.go#L113 - # cert-manager-cainjector-leader-election-core is used by the SecretBased injector controller - # see cmd/cainjector/start.go#L137 - - apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - resourceNames: ["cert-manager-cainjector-leader-election", "cert-manager-cainjector-leader-election-core"] - verbs: ["get", "update", "patch"] - - apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - verbs: ["create"] ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: cert-manager:leaderelection - namespace: kube-system - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -rules: - - apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - resourceNames: ["cert-manager-controller"] - verbs: ["get", "update", "patch"] - - apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - verbs: ["create"] ---- -# Source: cert-manager/templates/webhook-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: cert-manager-webhook:dynamic-serving - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.10.2" -rules: - - apiGroups: [""] - resources: ["secrets"] - resourceNames: - - 'cert-manager-webhook-ca' - verbs: ["get", "list", "watch", "update"] - # It's not possible to grant CREATE permission on a single resourceName. - - apiGroups: [""] - resources: ["secrets"] - verbs: ["create"] ---- -# Source: cert-manager/templates/cainjector-rbac.yaml -# grant cert-manager permission to manage the leaderelection configmap in the -# leader election namespace -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: cert-manager-cainjector:leaderelection - namespace: kube-system - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: cert-manager-cainjector:leaderelection -subjects: - - kind: ServiceAccount - name: cert-manager-cainjector - namespace: cert-manager ---- -# Source: cert-manager/templates/rbac.yaml -# grant cert-manager permission to manage the leaderelection configmap in the -# leader election namespace -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: cert-manager:leaderelection - namespace: kube-system - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: cert-manager:leaderelection -subjects: - - apiGroup: "" - kind: ServiceAccount - name: cert-manager - namespace: cert-manager ---- -# Source: cert-manager/templates/webhook-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: cert-manager-webhook:dynamic-serving - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.10.2" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: cert-manager-webhook:dynamic-serving -subjects: - - apiGroup: "" - kind: ServiceAccount - name: cert-manager-webhook - namespace: cert-manager ---- -# Source: cert-manager/templates/service.yaml -apiVersion: v1 -kind: Service -metadata: - name: cert-manager - namespace: cert-manager - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -spec: - type: ClusterIP - ports: - - protocol: TCP - port: 9402 - name: tcp-prometheus-servicemonitor - targetPort: 9402 - selector: - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" ---- -# Source: cert-manager/templates/webhook-service.yaml -apiVersion: v1 -kind: Service -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.10.2" -spec: - type: ClusterIP - ports: - - name: https - port: 443 - protocol: TCP - targetPort: "https" - selector: - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" ---- -# Source: cert-manager/templates/cainjector-deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: cert-manager-cainjector - namespace: cert-manager - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.10.2" -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - template: - metadata: - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.10.2" - spec: - serviceAccountName: cert-manager-cainjector - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - containers: - - name: cert-manager-cainjector - image: "quay.io/jetstack/cert-manager-cainjector:v1.10.2" - imagePullPolicy: IfNotPresent - args: - - --v=2 - - --leader-election-namespace=kube-system - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - nodeSelector: - kubernetes.io/os: linux ---- -# Source: cert-manager/templates/deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: cert-manager - namespace: cert-manager - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - template: - metadata: - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.10.2" - annotations: - prometheus.io/path: "/metrics" - prometheus.io/scrape: 'true' - prometheus.io/port: '9402' - spec: - serviceAccountName: cert-manager - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - containers: - - name: cert-manager-controller - image: "quay.io/jetstack/cert-manager-controller:v1.10.2" - imagePullPolicy: IfNotPresent - args: - - --v=2 - - --cluster-resource-namespace=$(POD_NAMESPACE) - - --leader-election-namespace=kube-system - ports: - - containerPort: 9402 - name: http-metrics - protocol: TCP - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - nodeSelector: - kubernetes.io/os: linux ---- -# Source: cert-manager/templates/webhook-deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.10.2" -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - template: - metadata: - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.10.2" - spec: - serviceAccountName: cert-manager-webhook - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - containers: - - name: cert-manager-webhook - image: "quay.io/jetstack/cert-manager-webhook:v1.10.2" - imagePullPolicy: IfNotPresent - args: - - --v=2 - - --secure-port=10250 - - --dynamic-serving-ca-secret-namespace=$(POD_NAMESPACE) - - --dynamic-serving-ca-secret-name=cert-manager-webhook-ca - - --dynamic-serving-dns-names=cert-manager-webhook - - --dynamic-serving-dns-names=cert-manager-webhook.$(POD_NAMESPACE) - - --dynamic-serving-dns-names=cert-manager-webhook.$(POD_NAMESPACE).svc - ports: - - name: https - protocol: TCP - containerPort: 10250 - - name: healthcheck - protocol: TCP - containerPort: 6080 - livenessProbe: - httpGet: - path: /livez - port: 6080 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - readinessProbe: - httpGet: - path: /healthz - port: 6080 - scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - nodeSelector: - kubernetes.io/os: linux ---- -# Source: cert-manager/templates/webhook-mutating-webhook.yaml -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - name: cert-manager-webhook - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.10.2" - annotations: - cert-manager.io/inject-ca-from-secret: "cert-manager/cert-manager-webhook-ca" -webhooks: - - name: webhook.cert-manager.io - rules: - - apiGroups: - - "cert-manager.io" - - "acme.cert-manager.io" - apiVersions: - - "v1" - operations: - - CREATE - - UPDATE - resources: - - "*/*" - admissionReviewVersions: ["v1"] - # This webhook only accepts v1 cert-manager resources. - # Equivalent matchPolicy ensures that non-v1 resource requests are sent to - # this webhook (after the resources have been converted to v1). - matchPolicy: Equivalent - timeoutSeconds: 10 - failurePolicy: Fail - # Only include 'sideEffects' field in Kubernetes 1.12+ - sideEffects: None - clientConfig: - service: - name: cert-manager-webhook - namespace: cert-manager - path: /mutate ---- -# Source: cert-manager/templates/webhook-validating-webhook.yaml -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - name: cert-manager-webhook - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.10.2" - annotations: - cert-manager.io/inject-ca-from-secret: "cert-manager/cert-manager-webhook-ca" -webhooks: - - name: webhook.cert-manager.io - namespaceSelector: - matchExpressions: - - key: "cert-manager.io/disable-validation" - operator: "NotIn" - values: - - "true" - - key: "name" - operator: "NotIn" - values: - - cert-manager - rules: - - apiGroups: - - "cert-manager.io" - - "acme.cert-manager.io" - apiVersions: - - "v1" - operations: - - CREATE - - UPDATE - resources: - - "*/*" - admissionReviewVersions: ["v1"] - # This webhook only accepts v1 cert-manager resources. - # Equivalent matchPolicy ensures that non-v1 resource requests are sent to - # this webhook (after the resources have been converted to v1). - matchPolicy: Equivalent - timeoutSeconds: 10 - failurePolicy: Fail - sideEffects: None - clientConfig: - service: - name: cert-manager-webhook - namespace: cert-manager - path: /validate diff --git a/providers/cert-manager/v1.7.2/cert-manager.yaml b/providers/cert-manager/v1.7.2/cert-manager.yaml deleted file mode 100644 index 488784d3a6..0000000000 --- a/providers/cert-manager/v1.7.2/cert-manager.yaml +++ /dev/null @@ -1,5504 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: certificaterequests.cert-manager.io - annotations: - cert-manager.io/inject-ca-from-secret: cert-manager/cert-manager-webhook-ca - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/version: v1.7.2 -spec: - group: cert-manager.io - names: - kind: CertificateRequest - listKind: CertificateRequestList - plural: certificaterequests - shortNames: - - cr - - crs - singular: certificaterequest - categories: - - cert-manager - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Approved")].status - name: Approved - type: string - - jsonPath: .status.conditions[?(@.type=="Denied")].status - name: Denied - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .spec.issuerRef.name - name: Issuer - type: string - - jsonPath: .spec.username - name: Requestor - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: "A CertificateRequest is used to request a signed certificate from one of the configured issuers. \n All fields within the CertificateRequest's `spec` are immutable after creation. A CertificateRequest will either succeed or fail, as denoted by its `status.state` field. \n A CertificateRequest is a one-shot resource, meaning it represents a single point in time request for a certificate and cannot be re-used." - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the CertificateRequest resource. - type: object - required: - - issuerRef - - request - properties: - duration: - description: The requested 'duration' (i.e. lifetime) of the Certificate. This option may be ignored/overridden by some issuer types. - type: string - extra: - description: Extra contains extra attributes of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: object - additionalProperties: - type: array - items: - type: string - groups: - description: Groups contains group membership of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: array - items: - type: string - x-kubernetes-list-type: atomic - isCA: - description: IsCA will request to mark the certificate as valid for certificate signing when submitting to the issuer. This will automatically add the `cert sign` usage to the list of `usages`. - type: boolean - issuerRef: - description: IssuerRef is a reference to the issuer for this CertificateRequest. If the `kind` field is not set, or set to `Issuer`, an Issuer resource with the given name in the same namespace as the CertificateRequest will be used. If the `kind` field is set to `ClusterIssuer`, a ClusterIssuer with the provided name will be used. The `name` field in this stanza is required at all times. The group field refers to the API group of the issuer which defaults to `cert-manager.io` if empty. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - request: - description: The PEM-encoded x509 certificate signing request to be submitted to the CA for signing. - type: string - format: byte - uid: - description: UID contains the uid of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: string - usages: - description: Usages is the set of x509 usages that are requested for the certificate. If usages are set they SHOULD be encoded inside the CSR spec Defaults to `digital signature` and `key encipherment` if not specified. - type: array - items: - description: 'KeyUsage specifies valid usage contexts for keys. See: https://tools.ietf.org/html/rfc5280#section-4.2.1.3 https://tools.ietf.org/html/rfc5280#section-4.2.1.12 Valid KeyUsage values are as follows: "signing", "digital signature", "content commitment", "key encipherment", "key agreement", "data encipherment", "cert sign", "crl sign", "encipher only", "decipher only", "any", "server auth", "client auth", "code signing", "email protection", "s/mime", "ipsec end system", "ipsec tunnel", "ipsec user", "timestamping", "ocsp signing", "microsoft sgc", "netscape sgc"' - type: string - enum: - - signing - - digital signature - - content commitment - - key encipherment - - key agreement - - data encipherment - - cert sign - - crl sign - - encipher only - - decipher only - - any - - server auth - - client auth - - code signing - - email protection - - s/mime - - ipsec end system - - ipsec tunnel - - ipsec user - - timestamping - - ocsp signing - - microsoft sgc - - netscape sgc - username: - description: Username contains the name of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: string - status: - description: Status of the CertificateRequest. This is set and managed automatically. - type: object - properties: - ca: - description: The PEM encoded x509 certificate of the signer, also known as the CA (Certificate Authority). This is set on a best-effort basis by different issuers. If not set, the CA is assumed to be unknown/not available. - type: string - format: byte - certificate: - description: The PEM encoded x509 certificate resulting from the certificate signing request. If not set, the CertificateRequest has either not been completed or has failed. More information on failure can be found by checking the `conditions` field. - type: string - format: byte - conditions: - description: List of status conditions to indicate the status of a CertificateRequest. Known condition types are `Ready` and `InvalidRequest`. - type: array - items: - description: CertificateRequestCondition contains condition information for a CertificateRequest. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`, `InvalidRequest`, `Approved`, `Denied`). - type: string - failureTime: - description: FailureTime stores the time that this CertificateRequest failed. This is used to influence garbage collection and back-off. - type: string - format: date-time - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: certificates.cert-manager.io - annotations: - cert-manager.io/inject-ca-from-secret: cert-manager/cert-manager-webhook-ca - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/version: v1.7.2 -spec: - group: cert-manager.io - names: - kind: Certificate - listKind: CertificateList - plural: certificates - shortNames: - - cert - - certs - singular: certificate - categories: - - cert-manager - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .spec.secretName - name: Secret - type: string - - jsonPath: .spec.issuerRef.name - name: Issuer - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: "A Certificate resource should be created to ensure an up to date and signed x509 certificate is stored in the Kubernetes Secret resource named in `spec.secretName`. \n The stored certificate will be renewed before it expires (as configured by `spec.renewBefore`)." - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the Certificate resource. - type: object - required: - - issuerRef - - secretName - properties: - additionalOutputFormats: - description: AdditionalOutputFormats defines extra output formats of the private key and signed certificate chain to be written to this Certificate's target Secret. This is an Alpha Feature and is only enabled with the `--feature-gates=AdditionalCertificateOutputFormats=true` option on both the controller and webhook components. - type: array - items: - description: CertificateAdditionalOutputFormat defines an additional output format of a Certificate resource. These contain supplementary data formats of the signed certificate chain and paired private key. - type: object - required: - - type - properties: - type: - description: Type is the name of the format type that should be written to the Certificate's target Secret. - type: string - enum: - - DER - - CombinedPEM - commonName: - description: 'CommonName is a common name to be used on the Certificate. The CommonName should have a length of 64 characters or fewer to avoid generating invalid CSRs. This value is ignored by TLS clients when any subject alt name is set. This is x509 behaviour: https://tools.ietf.org/html/rfc6125#section-6.4.4' - type: string - dnsNames: - description: DNSNames is a list of DNS subjectAltNames to be set on the Certificate. - type: array - items: - type: string - duration: - description: The requested 'duration' (i.e. lifetime) of the Certificate. This option may be ignored/overridden by some issuer types. If unset this defaults to 90 days. Certificate will be renewed either 2/3 through its duration or `renewBefore` period before its expiry, whichever is later. Minimum accepted duration is 1 hour. Value must be in units accepted by Go time.ParseDuration https://golang.org/pkg/time/#ParseDuration - type: string - emailAddresses: - description: EmailAddresses is a list of email subjectAltNames to be set on the Certificate. - type: array - items: - type: string - encodeUsagesInRequest: - description: EncodeUsagesInRequest controls whether key usages should be present in the CertificateRequest - type: boolean - ipAddresses: - description: IPAddresses is a list of IP address subjectAltNames to be set on the Certificate. - type: array - items: - type: string - isCA: - description: IsCA will mark this Certificate as valid for certificate signing. This will automatically add the `cert sign` usage to the list of `usages`. - type: boolean - issuerRef: - description: IssuerRef is a reference to the issuer for this certificate. If the `kind` field is not set, or set to `Issuer`, an Issuer resource with the given name in the same namespace as the Certificate will be used. If the `kind` field is set to `ClusterIssuer`, a ClusterIssuer with the provided name will be used. The `name` field in this stanza is required at all times. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - keystores: - description: Keystores configures additional keystore output formats stored in the `secretName` Secret resource. - type: object - properties: - jks: - description: JKS configures options for storing a JKS keystore in the `spec.secretName` Secret resource. - type: object - required: - - create - - passwordSecretRef - properties: - create: - description: Create enables JKS keystore creation for the Certificate. If true, a file named `keystore.jks` will be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef`. The keystore file will only be updated upon re-issuance. A file named `truststore.jks` will also be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef` containing the issuing Certificate Authority - type: boolean - passwordSecretRef: - description: PasswordSecretRef is a reference to a key in a Secret resource containing the password used to encrypt the JKS keystore. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - pkcs12: - description: PKCS12 configures options for storing a PKCS12 keystore in the `spec.secretName` Secret resource. - type: object - required: - - create - - passwordSecretRef - properties: - create: - description: Create enables PKCS12 keystore creation for the Certificate. If true, a file named `keystore.p12` will be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef`. The keystore file will only be updated upon re-issuance. A file named `truststore.p12` will also be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef` containing the issuing Certificate Authority - type: boolean - passwordSecretRef: - description: PasswordSecretRef is a reference to a key in a Secret resource containing the password used to encrypt the PKCS12 keystore. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - privateKey: - description: Options to control private keys used for the Certificate. - type: object - properties: - algorithm: - description: Algorithm is the private key algorithm of the corresponding private key for this certificate. If provided, allowed values are either `RSA`,`Ed25519` or `ECDSA` If `algorithm` is specified and `size` is not provided, key size of 256 will be used for `ECDSA` key algorithm and key size of 2048 will be used for `RSA` key algorithm. key size is ignored when using the `Ed25519` key algorithm. - type: string - enum: - - RSA - - ECDSA - - Ed25519 - encoding: - description: The private key cryptography standards (PKCS) encoding for this certificate's private key to be encoded in. If provided, allowed values are `PKCS1` and `PKCS8` standing for PKCS#1 and PKCS#8, respectively. Defaults to `PKCS1` if not specified. - type: string - enum: - - PKCS1 - - PKCS8 - rotationPolicy: - description: RotationPolicy controls how private keys should be regenerated when a re-issuance is being processed. If set to Never, a private key will only be generated if one does not already exist in the target `spec.secretName`. If one does exists but it does not have the correct algorithm or size, a warning will be raised to await user intervention. If set to Always, a private key matching the specified requirements will be generated whenever a re-issuance occurs. Default is 'Never' for backward compatibility. - type: string - size: - description: Size is the key bit size of the corresponding private key for this certificate. If `algorithm` is set to `RSA`, valid values are `2048`, `4096` or `8192`, and will default to `2048` if not specified. If `algorithm` is set to `ECDSA`, valid values are `256`, `384` or `521`, and will default to `256` if not specified. If `algorithm` is set to `Ed25519`, Size is ignored. No other values are allowed. - type: integer - renewBefore: - description: How long before the currently issued certificate's expiry cert-manager should renew the certificate. The default is 2/3 of the issued certificate's duration. Minimum accepted value is 5 minutes. Value must be in units accepted by Go time.ParseDuration https://golang.org/pkg/time/#ParseDuration - type: string - revisionHistoryLimit: - description: revisionHistoryLimit is the maximum number of CertificateRequest revisions that are maintained in the Certificate's history. Each revision represents a single `CertificateRequest` created by this Certificate, either when it was created, renewed, or Spec was changed. Revisions will be removed by oldest first if the number of revisions exceeds this number. If set, revisionHistoryLimit must be a value of `1` or greater. If unset (`nil`), revisions will not be garbage collected. Default value is `nil`. - type: integer - format: int32 - secretName: - description: SecretName is the name of the secret resource that will be automatically created and managed by this Certificate resource. It will be populated with a private key and certificate, signed by the denoted issuer. - type: string - secretTemplate: - description: SecretTemplate defines annotations and labels to be copied to the Certificate's Secret. Labels and annotations on the Secret will be changed as they appear on the SecretTemplate when added or removed. SecretTemplate annotations are added in conjunction with, and cannot overwrite, the base set of annotations cert-manager sets on the Certificate's Secret. - type: object - properties: - annotations: - description: Annotations is a key value map to be copied to the target Kubernetes Secret. - type: object - additionalProperties: - type: string - labels: - description: Labels is a key value map to be copied to the target Kubernetes Secret. - type: object - additionalProperties: - type: string - subject: - description: Full X509 name specification (https://golang.org/pkg/crypto/x509/pkix/#Name). - type: object - properties: - countries: - description: Countries to be used on the Certificate. - type: array - items: - type: string - localities: - description: Cities to be used on the Certificate. - type: array - items: - type: string - organizationalUnits: - description: Organizational Units to be used on the Certificate. - type: array - items: - type: string - organizations: - description: Organizations to be used on the Certificate. - type: array - items: - type: string - postalCodes: - description: Postal codes to be used on the Certificate. - type: array - items: - type: string - provinces: - description: State/Provinces to be used on the Certificate. - type: array - items: - type: string - serialNumber: - description: Serial number to be used on the Certificate. - type: string - streetAddresses: - description: Street addresses to be used on the Certificate. - type: array - items: - type: string - uris: - description: URIs is a list of URI subjectAltNames to be set on the Certificate. - type: array - items: - type: string - usages: - description: Usages is the set of x509 usages that are requested for the certificate. Defaults to `digital signature` and `key encipherment` if not specified. - type: array - items: - description: 'KeyUsage specifies valid usage contexts for keys. See: https://tools.ietf.org/html/rfc5280#section-4.2.1.3 https://tools.ietf.org/html/rfc5280#section-4.2.1.12 Valid KeyUsage values are as follows: "signing", "digital signature", "content commitment", "key encipherment", "key agreement", "data encipherment", "cert sign", "crl sign", "encipher only", "decipher only", "any", "server auth", "client auth", "code signing", "email protection", "s/mime", "ipsec end system", "ipsec tunnel", "ipsec user", "timestamping", "ocsp signing", "microsoft sgc", "netscape sgc"' - type: string - enum: - - signing - - digital signature - - content commitment - - key encipherment - - key agreement - - data encipherment - - cert sign - - crl sign - - encipher only - - decipher only - - any - - server auth - - client auth - - code signing - - email protection - - s/mime - - ipsec end system - - ipsec tunnel - - ipsec user - - timestamping - - ocsp signing - - microsoft sgc - - netscape sgc - status: - description: Status of the Certificate. This is set and managed automatically. - type: object - properties: - conditions: - description: List of status conditions to indicate the status of certificates. Known condition types are `Ready` and `Issuing`. - type: array - items: - description: CertificateCondition contains condition information for an Certificate. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - observedGeneration: - description: If set, this represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.condition[x].observedGeneration is 9, the condition is out of date with respect to the current state of the Certificate. - type: integer - format: int64 - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`, `Issuing`). - type: string - lastFailureTime: - description: LastFailureTime is the time as recorded by the Certificate controller of the most recent failure to complete a CertificateRequest for this Certificate resource. If set, cert-manager will not re-request another Certificate until 1 hour has elapsed from this time. - type: string - format: date-time - nextPrivateKeySecretName: - description: The name of the Secret resource containing the private key to be used for the next certificate iteration. The keymanager controller will automatically set this field if the `Issuing` condition is set to `True`. It will automatically unset this field when the Issuing condition is not set or False. - type: string - notAfter: - description: The expiration time of the certificate stored in the secret named by this resource in `spec.secretName`. - type: string - format: date-time - notBefore: - description: The time after which the certificate stored in the secret named by this resource in spec.secretName is valid. - type: string - format: date-time - renewalTime: - description: RenewalTime is the time at which the certificate will be next renewed. If not set, no upcoming renewal is scheduled. - type: string - format: date-time - revision: - description: "The current 'revision' of the certificate as issued. \n When a CertificateRequest resource is created, it will have the `cert-manager.io/certificate-revision` set to one greater than the current value of this field. \n Upon issuance, this field will be set to the value of the annotation on the CertificateRequest resource used to issue the certificate. \n Persisting the value on the CertificateRequest resource allows the certificates controller to know whether a request is part of an old issuance or if it is part of the ongoing revision's issuance by checking if the revision value in the annotation is greater than this field." - type: integer - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: challenges.acme.cert-manager.io - annotations: - cert-manager.io/inject-ca-from-secret: cert-manager/cert-manager-webhook-ca - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/version: v1.7.2 -spec: - group: acme.cert-manager.io - names: - kind: Challenge - listKind: ChallengeList - plural: challenges - singular: challenge - categories: - - cert-manager - - cert-manager-acme - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.state - name: State - type: string - - jsonPath: .spec.dnsName - name: Domain - type: string - - jsonPath: .status.reason - name: Reason - priority: 1 - type: string - - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: Challenge is a type to represent a Challenge request with an ACME server - type: object - required: - - metadata - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - type: object - required: - - authorizationURL - - dnsName - - issuerRef - - key - - solver - - token - - type - - url - properties: - authorizationURL: - description: The URL to the ACME Authorization resource that this challenge is a part of. - type: string - dnsName: - description: dnsName is the identifier that this challenge is for, e.g. example.com. If the requested DNSName is a 'wildcard', this field MUST be set to the non-wildcard domain, e.g. for `*.example.com`, it must be `example.com`. - type: string - issuerRef: - description: References a properly configured ACME-type Issuer which should be used to create this Challenge. If the Issuer does not exist, processing will be retried. If the Issuer is not an 'ACME' Issuer, an error will be returned and the Challenge will be marked as failed. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - key: - description: 'The ACME challenge key for this challenge For HTTP01 challenges, this is the value that must be responded with to complete the HTTP01 challenge in the format: `.`. For DNS01 challenges, this is the base64 encoded SHA256 sum of the `.` text that must be set as the TXT record content.' - type: string - solver: - description: Contains the domain solving configuration that should be used to solve this challenge resource. - type: object - properties: - dns01: - description: Configures cert-manager to attempt to complete authorizations by performing the DNS01 challenge flow. - type: object - properties: - acmeDNS: - description: Use the 'ACME DNS' (https://github.com/joohoi/acme-dns) API to manage DNS01 challenge records. - type: object - required: - - accountSecretRef - - host - properties: - accountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - host: - type: string - akamai: - description: Use the Akamai DNS zone management API to manage DNS01 challenge records. - type: object - required: - - accessTokenSecretRef - - clientSecretSecretRef - - clientTokenSecretRef - - serviceConsumerDomain - properties: - accessTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientSecretSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - serviceConsumerDomain: - type: string - azureDNS: - description: Use the Microsoft Azure DNS API to manage DNS01 challenge records. - type: object - required: - - resourceGroupName - - subscriptionID - properties: - clientID: - description: if both this and ClientSecret are left unset MSI will be used - type: string - clientSecretSecretRef: - description: if both this and ClientID are left unset MSI will be used - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - environment: - description: name of the Azure environment (default AzurePublicCloud) - type: string - enum: - - AzurePublicCloud - - AzureChinaCloud - - AzureGermanCloud - - AzureUSGovernmentCloud - hostedZoneName: - description: name of the DNS zone that should be used - type: string - managedIdentity: - description: managed identity configuration, can not be used at the same time as clientID, clientSecretSecretRef or tenantID - type: object - properties: - clientID: - description: client ID of the managed identity, can not be used at the same time as resourceID - type: string - resourceID: - description: resource ID of the managed identity, can not be used at the same time as clientID - type: string - resourceGroupName: - description: resource group the DNS zone is located in - type: string - subscriptionID: - description: ID of the Azure subscription - type: string - tenantID: - description: when specifying ClientID and ClientSecret then this field is also needed - type: string - cloudDNS: - description: Use the Google Cloud DNS API to manage DNS01 challenge records. - type: object - required: - - project - properties: - hostedZoneName: - description: HostedZoneName is an optional field that tells cert-manager in which Cloud DNS zone the challenge record has to be created. If left empty cert-manager will automatically choose a zone. - type: string - project: - type: string - serviceAccountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - cloudflare: - description: Use the Cloudflare API to manage DNS01 challenge records. - type: object - properties: - apiKeySecretRef: - description: 'API key to use to authenticate with Cloudflare. Note: using an API token to authenticate is now the recommended method as it allows greater control of permissions.' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - apiTokenSecretRef: - description: API token used to authenticate with Cloudflare. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - email: - description: Email of the account, only required when using API key based authentication. - type: string - cnameStrategy: - description: CNAMEStrategy configures how the DNS01 provider should handle CNAME records when found in DNS zones. - type: string - enum: - - None - - Follow - digitalocean: - description: Use the DigitalOcean DNS API to manage DNS01 challenge records. - type: object - required: - - tokenSecretRef - properties: - tokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - rfc2136: - description: Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/) to manage DNS01 challenge records. - type: object - required: - - nameserver - properties: - nameserver: - description: The IP address or hostname of an authoritative DNS server supporting RFC2136 in the form host:port. If the host is an IPv6 address it must be enclosed in square brackets (e.g [2001:db8::1]) ; port is optional. This field is required. - type: string - tsigAlgorithm: - description: 'The TSIG Algorithm configured in the DNS supporting RFC2136. Used only when ``tsigSecretSecretRef`` and ``tsigKeyName`` are defined. Supported values are (case-insensitive): ``HMACMD5`` (default), ``HMACSHA1``, ``HMACSHA256`` or ``HMACSHA512``.' - type: string - tsigKeyName: - description: The TSIG Key name configured in the DNS. If ``tsigSecretSecretRef`` is defined, this field is required. - type: string - tsigSecretSecretRef: - description: The name of the secret containing the TSIG value. If ``tsigKeyName`` is defined, this field is required. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - route53: - description: Use the AWS Route53 API to manage DNS01 challenge records. - type: object - required: - - region - properties: - accessKeyID: - description: 'The AccessKeyID is used for authentication. If not set we fall-back to using env vars, shared credentials file or AWS Instance metadata see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: string - hostedZoneID: - description: If set, the provider will manage only this zone in Route53 and will not do an lookup using the route53:ListHostedZonesByName api call. - type: string - region: - description: Always set the region when using AccessKeyID and SecretAccessKey - type: string - role: - description: Role is a Role ARN which the Route53 provider will assume using either the explicit credentials AccessKeyID/SecretAccessKey or the inferred credentials from environment variables, shared credentials file or AWS Instance metadata - type: string - secretAccessKeySecretRef: - description: The SecretAccessKey is used for authentication. If not set we fall-back to using env vars, shared credentials file or AWS Instance metadata https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - webhook: - description: Configure an external webhook based DNS01 challenge solver to manage DNS01 challenge records. - type: object - required: - - groupName - - solverName - properties: - config: - description: Additional configuration that should be passed to the webhook apiserver when challenges are processed. This can contain arbitrary JSON data. Secret values should not be specified in this stanza. If secret values are needed (e.g. credentials for a DNS service), you should use a SecretKeySelector to reference a Secret resource. For details on the schema of this field, consult the webhook provider implementation's documentation. - x-kubernetes-preserve-unknown-fields: true - groupName: - description: The API group name that should be used when POSTing ChallengePayload resources to the webhook apiserver. This should be the same as the GroupName specified in the webhook provider implementation. - type: string - solverName: - description: The name of the solver to use, as defined in the webhook provider implementation. This will typically be the name of the provider, e.g. 'cloudflare'. - type: string - http01: - description: Configures cert-manager to attempt to complete authorizations by performing the HTTP01 challenge flow. It is not possible to obtain certificates for wildcard domain names (e.g. `*.example.com`) using the HTTP01 challenge mechanism. - type: object - properties: - gatewayHTTPRoute: - description: The Gateway API is a sig-network community API that models service networking in Kubernetes (https://gateway-api.sigs.k8s.io/). The Gateway solver will create HTTPRoutes with the specified labels in the same namespace as the challenge. This solver is experimental, and fields / behaviour may change in the future. - type: object - properties: - labels: - description: The labels that cert-manager will use when creating the temporary HTTPRoute needed for solving the HTTP-01 challenge. These labels must match the label selector of at least one Gateway. - type: object - additionalProperties: - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - ingress: - description: The ingress based HTTP01 challenge solver will solve challenges by creating or modifying Ingress resources in order to route requests for '/.well-known/acme-challenge/XYZ' to 'challenge solver' pods that are provisioned by cert-manager for each Challenge to be completed. - type: object - properties: - class: - description: The ingress class to use when creating Ingress resources to solve ACME challenges that use this challenge solver. Only one of 'class' or 'name' may be specified. - type: string - ingressTemplate: - description: Optional ingress template used to configure the ACME challenge solver ingress used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the ingress used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - name: - description: The name of the ingress resource that should have ACME challenge solving routes inserted into it in order to solve HTTP01 challenges. This is typically used in conjunction with ingress controllers like ingress-gce, which maintains a 1:1 mapping between external IPs and ingress resources. - type: string - podTemplate: - description: Optional pod template used to configure the ACME challenge solver pods used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the pod used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the create ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - spec: - description: PodSpec defines overrides for the HTTP01 challenge solver pod. Only the 'priorityClassName', 'nodeSelector', 'affinity', 'serviceAccountName' and 'tolerations' fields are supported currently. All other fields will be ignored. - type: object - properties: - affinity: - description: If specified, the pod's scheduling constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. - type: array - items: - description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). - type: object - required: - - preference - - weight - properties: - preference: - description: A node selector term, associated with the corresponding weight. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - weight: - description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. The terms are ORed. - type: array - items: - description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - nodeSelector: - description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - priorityClassName: - description: If specified, the pod's priorityClassName. - type: string - serviceAccountName: - description: If specified, the pod's service account - type: string - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - selector: - description: Selector selects a set of DNSNames on the Certificate resource that should be solved using this challenge solver. If not specified, the solver will be treated as the 'default' solver with the lowest priority, i.e. if any other solver has a more specific match, it will be used instead. - type: object - properties: - dnsNames: - description: List of DNSNames that this solver will be used to solve. If specified and a match is found, a dnsNames selector will take precedence over a dnsZones selector. If multiple solvers match with the same dnsNames value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - dnsZones: - description: List of DNSZones that this solver will be used to solve. The most specific DNS zone match specified here will take precedence over other DNS zone matches, so a solver specifying sys.example.com will be selected over one specifying example.com for the domain www.sys.example.com. If multiple solvers match with the same dnsZones value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - matchLabels: - description: A label selector that is used to refine the set of certificate's that this challenge solver will apply to. - type: object - additionalProperties: - type: string - token: - description: The ACME challenge token for this challenge. This is the raw value returned from the ACME server. - type: string - type: - description: The type of ACME challenge this resource represents. One of "HTTP-01" or "DNS-01". - type: string - enum: - - HTTP-01 - - DNS-01 - url: - description: The URL of the ACME Challenge resource for this challenge. This can be used to lookup details about the status of this challenge. - type: string - wildcard: - description: wildcard will be true if this challenge is for a wildcard identifier, for example '*.example.com'. - type: boolean - status: - type: object - properties: - presented: - description: presented will be set to true if the challenge values for this challenge are currently 'presented'. This *does not* imply the self check is passing. Only that the values have been 'submitted' for the appropriate challenge mechanism (i.e. the DNS01 TXT record has been presented, or the HTTP01 configuration has been configured). - type: boolean - processing: - description: Used to denote whether this challenge should be processed or not. This field will only be set to true by the 'scheduling' component. It will only be set to false by the 'challenges' controller, after the challenge has reached a final state or timed out. If this field is set to false, the challenge controller will not take any more action. - type: boolean - reason: - description: Contains human readable information on why the Challenge is in the current state. - type: string - state: - description: Contains the current 'state' of the challenge. If not set, the state of the challenge is unknown. - type: string - enum: - - valid - - ready - - pending - - processing - - invalid - - expired - - errored - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: clusterissuers.cert-manager.io - annotations: - cert-manager.io/inject-ca-from-secret: cert-manager/cert-manager-webhook-ca - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/version: v1.7.2 -spec: - group: cert-manager.io - names: - kind: ClusterIssuer - listKind: ClusterIssuerList - plural: clusterissuers - singular: clusterissuer - categories: - - cert-manager - scope: Cluster - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: A ClusterIssuer represents a certificate issuing authority which can be referenced as part of `issuerRef` fields. It is similar to an Issuer, however it is cluster-scoped and therefore can be referenced by resources that exist in *any* namespace, not just the same namespace as the referent. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the ClusterIssuer resource. - type: object - properties: - acme: - description: ACME configures this issuer to communicate with a RFC8555 (ACME) server to obtain signed x509 certificates. - type: object - required: - - privateKeySecretRef - - server - properties: - disableAccountKeyGeneration: - description: Enables or disables generating a new ACME account key. If true, the Issuer resource will *not* request a new account but will expect the account key to be supplied via an existing secret. If false, the cert-manager system will generate a new ACME account key for the Issuer. Defaults to false. - type: boolean - email: - description: Email is the email address to be associated with the ACME account. This field is optional, but it is strongly recommended to be set. It will be used to contact you in case of issues with your account or certificates, including expiry notification emails. This field may be updated after the account is initially registered. - type: string - enableDurationFeature: - description: Enables requesting a Not After date on certificates that matches the duration of the certificate. This is not supported by all ACME servers like Let's Encrypt. If set to true when the ACME server does not support it it will create an error on the Order. Defaults to false. - type: boolean - externalAccountBinding: - description: ExternalAccountBinding is a reference to a CA external account of the ACME server. If set, upon registration cert-manager will attempt to associate the given external account credentials with the registered ACME account. - type: object - required: - - keyID - - keySecretRef - properties: - keyAlgorithm: - description: 'Deprecated: keyAlgorithm field exists for historical compatibility reasons and should not be used. The algorithm is now hardcoded to HS256 in golang/x/crypto/acme.' - type: string - enum: - - HS256 - - HS384 - - HS512 - keyID: - description: keyID is the ID of the CA key that the External Account is bound to. - type: string - keySecretRef: - description: keySecretRef is a Secret Key Selector referencing a data item in a Kubernetes Secret which holds the symmetric MAC key of the External Account Binding. The `key` is the index string that is paired with the key data in the Secret and should not be confused with the key data itself, or indeed with the External Account Binding keyID above. The secret key stored in the Secret **must** be un-padded, base64 URL encoded data. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - preferredChain: - description: 'PreferredChain is the chain to use if the ACME server outputs multiple. PreferredChain is no guarantee that this one gets delivered by the ACME endpoint. For example, for Let''s Encrypt''s DST crosssign you would use: "DST Root CA X3" or "ISRG Root X1" for the newer Let''s Encrypt root CA. This value picks the first certificate bundle in the ACME alternative chains that has a certificate with this value as its issuer''s CN' - type: string - maxLength: 64 - privateKeySecretRef: - description: PrivateKey is the name of a Kubernetes Secret resource that will be used to store the automatically generated ACME account private key. Optionally, a `key` may be specified to select a specific entry within the named Secret resource. If `key` is not specified, a default of `tls.key` will be used. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - server: - description: 'Server is the URL used to access the ACME server''s ''directory'' endpoint. For example, for Let''s Encrypt''s staging endpoint, you would use: "https://acme-staging-v02.api.letsencrypt.org/directory". Only ACME v2 endpoints (i.e. RFC 8555) are supported.' - type: string - skipTLSVerify: - description: Enables or disables validation of the ACME server TLS certificate. If true, requests to the ACME server will not have their TLS certificate validated (i.e. insecure connections will be allowed). Only enable this option in development environments. The cert-manager system installed roots will be used to verify connections to the ACME server if this is false. Defaults to false. - type: boolean - solvers: - description: 'Solvers is a list of challenge solvers that will be used to solve ACME challenges for the matching domains. Solver configurations must be provided in order to obtain certificates from an ACME server. For more information, see: https://cert-manager.io/docs/configuration/acme/' - type: array - items: - description: An ACMEChallengeSolver describes how to solve ACME challenges for the issuer it is part of. A selector may be provided to use different solving strategies for different DNS names. Only one of HTTP01 or DNS01 must be provided. - type: object - properties: - dns01: - description: Configures cert-manager to attempt to complete authorizations by performing the DNS01 challenge flow. - type: object - properties: - acmeDNS: - description: Use the 'ACME DNS' (https://github.com/joohoi/acme-dns) API to manage DNS01 challenge records. - type: object - required: - - accountSecretRef - - host - properties: - accountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - host: - type: string - akamai: - description: Use the Akamai DNS zone management API to manage DNS01 challenge records. - type: object - required: - - accessTokenSecretRef - - clientSecretSecretRef - - clientTokenSecretRef - - serviceConsumerDomain - properties: - accessTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientSecretSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - serviceConsumerDomain: - type: string - azureDNS: - description: Use the Microsoft Azure DNS API to manage DNS01 challenge records. - type: object - required: - - resourceGroupName - - subscriptionID - properties: - clientID: - description: if both this and ClientSecret are left unset MSI will be used - type: string - clientSecretSecretRef: - description: if both this and ClientID are left unset MSI will be used - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - environment: - description: name of the Azure environment (default AzurePublicCloud) - type: string - enum: - - AzurePublicCloud - - AzureChinaCloud - - AzureGermanCloud - - AzureUSGovernmentCloud - hostedZoneName: - description: name of the DNS zone that should be used - type: string - managedIdentity: - description: managed identity configuration, can not be used at the same time as clientID, clientSecretSecretRef or tenantID - type: object - properties: - clientID: - description: client ID of the managed identity, can not be used at the same time as resourceID - type: string - resourceID: - description: resource ID of the managed identity, can not be used at the same time as clientID - type: string - resourceGroupName: - description: resource group the DNS zone is located in - type: string - subscriptionID: - description: ID of the Azure subscription - type: string - tenantID: - description: when specifying ClientID and ClientSecret then this field is also needed - type: string - cloudDNS: - description: Use the Google Cloud DNS API to manage DNS01 challenge records. - type: object - required: - - project - properties: - hostedZoneName: - description: HostedZoneName is an optional field that tells cert-manager in which Cloud DNS zone the challenge record has to be created. If left empty cert-manager will automatically choose a zone. - type: string - project: - type: string - serviceAccountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - cloudflare: - description: Use the Cloudflare API to manage DNS01 challenge records. - type: object - properties: - apiKeySecretRef: - description: 'API key to use to authenticate with Cloudflare. Note: using an API token to authenticate is now the recommended method as it allows greater control of permissions.' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - apiTokenSecretRef: - description: API token used to authenticate with Cloudflare. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - email: - description: Email of the account, only required when using API key based authentication. - type: string - cnameStrategy: - description: CNAMEStrategy configures how the DNS01 provider should handle CNAME records when found in DNS zones. - type: string - enum: - - None - - Follow - digitalocean: - description: Use the DigitalOcean DNS API to manage DNS01 challenge records. - type: object - required: - - tokenSecretRef - properties: - tokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - rfc2136: - description: Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/) to manage DNS01 challenge records. - type: object - required: - - nameserver - properties: - nameserver: - description: The IP address or hostname of an authoritative DNS server supporting RFC2136 in the form host:port. If the host is an IPv6 address it must be enclosed in square brackets (e.g [2001:db8::1]) ; port is optional. This field is required. - type: string - tsigAlgorithm: - description: 'The TSIG Algorithm configured in the DNS supporting RFC2136. Used only when ``tsigSecretSecretRef`` and ``tsigKeyName`` are defined. Supported values are (case-insensitive): ``HMACMD5`` (default), ``HMACSHA1``, ``HMACSHA256`` or ``HMACSHA512``.' - type: string - tsigKeyName: - description: The TSIG Key name configured in the DNS. If ``tsigSecretSecretRef`` is defined, this field is required. - type: string - tsigSecretSecretRef: - description: The name of the secret containing the TSIG value. If ``tsigKeyName`` is defined, this field is required. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - route53: - description: Use the AWS Route53 API to manage DNS01 challenge records. - type: object - required: - - region - properties: - accessKeyID: - description: 'The AccessKeyID is used for authentication. If not set we fall-back to using env vars, shared credentials file or AWS Instance metadata see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: string - hostedZoneID: - description: If set, the provider will manage only this zone in Route53 and will not do an lookup using the route53:ListHostedZonesByName api call. - type: string - region: - description: Always set the region when using AccessKeyID and SecretAccessKey - type: string - role: - description: Role is a Role ARN which the Route53 provider will assume using either the explicit credentials AccessKeyID/SecretAccessKey or the inferred credentials from environment variables, shared credentials file or AWS Instance metadata - type: string - secretAccessKeySecretRef: - description: The SecretAccessKey is used for authentication. If not set we fall-back to using env vars, shared credentials file or AWS Instance metadata https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - webhook: - description: Configure an external webhook based DNS01 challenge solver to manage DNS01 challenge records. - type: object - required: - - groupName - - solverName - properties: - config: - description: Additional configuration that should be passed to the webhook apiserver when challenges are processed. This can contain arbitrary JSON data. Secret values should not be specified in this stanza. If secret values are needed (e.g. credentials for a DNS service), you should use a SecretKeySelector to reference a Secret resource. For details on the schema of this field, consult the webhook provider implementation's documentation. - x-kubernetes-preserve-unknown-fields: true - groupName: - description: The API group name that should be used when POSTing ChallengePayload resources to the webhook apiserver. This should be the same as the GroupName specified in the webhook provider implementation. - type: string - solverName: - description: The name of the solver to use, as defined in the webhook provider implementation. This will typically be the name of the provider, e.g. 'cloudflare'. - type: string - http01: - description: Configures cert-manager to attempt to complete authorizations by performing the HTTP01 challenge flow. It is not possible to obtain certificates for wildcard domain names (e.g. `*.example.com`) using the HTTP01 challenge mechanism. - type: object - properties: - gatewayHTTPRoute: - description: The Gateway API is a sig-network community API that models service networking in Kubernetes (https://gateway-api.sigs.k8s.io/). The Gateway solver will create HTTPRoutes with the specified labels in the same namespace as the challenge. This solver is experimental, and fields / behaviour may change in the future. - type: object - properties: - labels: - description: The labels that cert-manager will use when creating the temporary HTTPRoute needed for solving the HTTP-01 challenge. These labels must match the label selector of at least one Gateway. - type: object - additionalProperties: - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - ingress: - description: The ingress based HTTP01 challenge solver will solve challenges by creating or modifying Ingress resources in order to route requests for '/.well-known/acme-challenge/XYZ' to 'challenge solver' pods that are provisioned by cert-manager for each Challenge to be completed. - type: object - properties: - class: - description: The ingress class to use when creating Ingress resources to solve ACME challenges that use this challenge solver. Only one of 'class' or 'name' may be specified. - type: string - ingressTemplate: - description: Optional ingress template used to configure the ACME challenge solver ingress used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the ingress used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - name: - description: The name of the ingress resource that should have ACME challenge solving routes inserted into it in order to solve HTTP01 challenges. This is typically used in conjunction with ingress controllers like ingress-gce, which maintains a 1:1 mapping between external IPs and ingress resources. - type: string - podTemplate: - description: Optional pod template used to configure the ACME challenge solver pods used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the pod used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the create ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - spec: - description: PodSpec defines overrides for the HTTP01 challenge solver pod. Only the 'priorityClassName', 'nodeSelector', 'affinity', 'serviceAccountName' and 'tolerations' fields are supported currently. All other fields will be ignored. - type: object - properties: - affinity: - description: If specified, the pod's scheduling constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. - type: array - items: - description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). - type: object - required: - - preference - - weight - properties: - preference: - description: A node selector term, associated with the corresponding weight. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - weight: - description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. The terms are ORed. - type: array - items: - description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - nodeSelector: - description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - priorityClassName: - description: If specified, the pod's priorityClassName. - type: string - serviceAccountName: - description: If specified, the pod's service account - type: string - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - selector: - description: Selector selects a set of DNSNames on the Certificate resource that should be solved using this challenge solver. If not specified, the solver will be treated as the 'default' solver with the lowest priority, i.e. if any other solver has a more specific match, it will be used instead. - type: object - properties: - dnsNames: - description: List of DNSNames that this solver will be used to solve. If specified and a match is found, a dnsNames selector will take precedence over a dnsZones selector. If multiple solvers match with the same dnsNames value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - dnsZones: - description: List of DNSZones that this solver will be used to solve. The most specific DNS zone match specified here will take precedence over other DNS zone matches, so a solver specifying sys.example.com will be selected over one specifying example.com for the domain www.sys.example.com. If multiple solvers match with the same dnsZones value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - matchLabels: - description: A label selector that is used to refine the set of certificate's that this challenge solver will apply to. - type: object - additionalProperties: - type: string - ca: - description: CA configures this issuer to sign certificates using a signing CA keypair stored in a Secret resource. This is used to build internal PKIs that are managed by cert-manager. - type: object - required: - - secretName - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set, certificates will be issued without distribution points set. - type: array - items: - type: string - ocspServers: - description: The OCSP server list is an X.509 v3 extension that defines a list of URLs of OCSP responders. The OCSP responders can be queried for the revocation status of an issued certificate. If not set, the certificate will be issued with no OCSP servers set. For example, an OCSP server URL could be "http://ocsp.int-x3.letsencrypt.org". - type: array - items: - type: string - secretName: - description: SecretName is the name of the secret used to sign Certificates issued by this Issuer. - type: string - selfSigned: - description: SelfSigned configures this issuer to 'self sign' certificates using the private key used to create the CertificateRequest object. - type: object - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set certificate will be issued without CDP. Values are strings. - type: array - items: - type: string - vault: - description: Vault configures this issuer to sign certificates using a HashiCorp Vault PKI backend. - type: object - required: - - auth - - path - - server - properties: - auth: - description: Auth configures how cert-manager authenticates with the Vault server. - type: object - properties: - appRole: - description: AppRole authenticates with Vault using the App Role auth mechanism, with the role and secret stored in a Kubernetes Secret resource. - type: object - required: - - path - - roleId - - secretRef - properties: - path: - description: 'Path where the App Role authentication backend is mounted in Vault, e.g: "approle"' - type: string - roleId: - description: RoleID configured in the App Role authentication backend when setting up the authentication backend in Vault. - type: string - secretRef: - description: Reference to a key in a Secret that contains the App Role secret used to authenticate with Vault. The `key` field must be specified and denotes which entry within the Secret resource is used as the app role secret. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - kubernetes: - description: Kubernetes authenticates with Vault by passing the ServiceAccount token stored in the named Secret resource to the Vault server. - type: object - required: - - role - - secretRef - properties: - mountPath: - description: The Vault mountPath here is the mount path to use when authenticating with Vault. For example, setting a value to `/v1/auth/foo`, will use the path `/v1/auth/foo/login` to authenticate with Vault. If unspecified, the default value "/v1/auth/kubernetes" will be used. - type: string - role: - description: A required field containing the Vault Role to assume. A Role binds a Kubernetes ServiceAccount with a set of Vault policies. - type: string - secretRef: - description: The required Secret field containing a Kubernetes ServiceAccount JWT used for authenticating with Vault. Use of 'ambient credentials' is not supported. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - tokenSecretRef: - description: TokenSecretRef authenticates with Vault by presenting a token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - caBundle: - description: PEM-encoded CA bundle (base64-encoded) used to validate Vault server certificate. Only used if the Server URL is using HTTPS protocol. This parameter is ignored for plain HTTP protocol connection. If not set the system root certificates are used to validate the TLS connection. - type: string - format: byte - namespace: - description: 'Name of the vault namespace. Namespaces is a set of features within Vault Enterprise that allows Vault environments to support Secure Multi-tenancy. e.g: "ns1" More about namespaces can be found here https://www.vaultproject.io/docs/enterprise/namespaces' - type: string - path: - description: 'Path is the mount path of the Vault PKI backend''s `sign` endpoint, e.g: "my_pki_mount/sign/my-role-name".' - type: string - server: - description: 'Server is the connection address for the Vault server, e.g: "https://vault.example.com:8200".' - type: string - venafi: - description: Venafi configures this issuer to sign certificates using a Venafi TPP or Venafi Cloud policy zone. - type: object - required: - - zone - properties: - cloud: - description: Cloud specifies the Venafi cloud configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - apiTokenSecretRef - properties: - apiTokenSecretRef: - description: APITokenSecretRef is a secret key selector for the Venafi Cloud API token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: URL is the base URL for Venafi Cloud. Defaults to "https://api.venafi.cloud/v1". - type: string - tpp: - description: TPP specifies Trust Protection Platform configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - credentialsRef - - url - properties: - caBundle: - description: CABundle is a PEM encoded TLS certificate to use to verify connections to the TPP instance. If specified, system roots will not be used and the issuing CA for the TPP instance must be verifiable using the provided root. If not specified, the connection will be verified using the cert-manager system root certificates. - type: string - format: byte - credentialsRef: - description: CredentialsRef is a reference to a Secret containing the username and password for the TPP server. The secret must contain two keys, 'username' and 'password'. - type: object - required: - - name - properties: - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: 'URL is the base URL for the vedsdk endpoint of the Venafi TPP instance, for example: "https://tpp.example.com/vedsdk".' - type: string - zone: - description: Zone is the Venafi Policy Zone to use for this issuer. All requests made to the Venafi platform will be restricted by the named zone policy. This field is required. - type: string - status: - description: Status of the ClusterIssuer. This is set and managed automatically. - type: object - properties: - acme: - description: ACME specific status options. This field should only be set if the Issuer is configured to use an ACME server to issue certificates. - type: object - properties: - lastRegisteredEmail: - description: LastRegisteredEmail is the email associated with the latest registered ACME account, in order to track changes made to registered account associated with the Issuer - type: string - uri: - description: URI is the unique account identifier, which can also be used to retrieve account details from the CA - type: string - conditions: - description: List of status conditions to indicate the status of a CertificateRequest. Known condition types are `Ready`. - type: array - items: - description: IssuerCondition contains condition information for an Issuer. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - observedGeneration: - description: If set, this represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.condition[x].observedGeneration is 9, the condition is out of date with respect to the current state of the Issuer. - type: integer - format: int64 - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`). - type: string - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: issuers.cert-manager.io - annotations: - cert-manager.io/inject-ca-from-secret: cert-manager/cert-manager-webhook-ca - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/version: v1.7.2 -spec: - group: cert-manager.io - names: - kind: Issuer - listKind: IssuerList - plural: issuers - singular: issuer - categories: - - cert-manager - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: An Issuer represents a certificate issuing authority which can be referenced as part of `issuerRef` fields. It is scoped to a single namespace and can therefore only be referenced by resources within the same namespace. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the Issuer resource. - type: object - properties: - acme: - description: ACME configures this issuer to communicate with a RFC8555 (ACME) server to obtain signed x509 certificates. - type: object - required: - - privateKeySecretRef - - server - properties: - disableAccountKeyGeneration: - description: Enables or disables generating a new ACME account key. If true, the Issuer resource will *not* request a new account but will expect the account key to be supplied via an existing secret. If false, the cert-manager system will generate a new ACME account key for the Issuer. Defaults to false. - type: boolean - email: - description: Email is the email address to be associated with the ACME account. This field is optional, but it is strongly recommended to be set. It will be used to contact you in case of issues with your account or certificates, including expiry notification emails. This field may be updated after the account is initially registered. - type: string - enableDurationFeature: - description: Enables requesting a Not After date on certificates that matches the duration of the certificate. This is not supported by all ACME servers like Let's Encrypt. If set to true when the ACME server does not support it it will create an error on the Order. Defaults to false. - type: boolean - externalAccountBinding: - description: ExternalAccountBinding is a reference to a CA external account of the ACME server. If set, upon registration cert-manager will attempt to associate the given external account credentials with the registered ACME account. - type: object - required: - - keyID - - keySecretRef - properties: - keyAlgorithm: - description: 'Deprecated: keyAlgorithm field exists for historical compatibility reasons and should not be used. The algorithm is now hardcoded to HS256 in golang/x/crypto/acme.' - type: string - enum: - - HS256 - - HS384 - - HS512 - keyID: - description: keyID is the ID of the CA key that the External Account is bound to. - type: string - keySecretRef: - description: keySecretRef is a Secret Key Selector referencing a data item in a Kubernetes Secret which holds the symmetric MAC key of the External Account Binding. The `key` is the index string that is paired with the key data in the Secret and should not be confused with the key data itself, or indeed with the External Account Binding keyID above. The secret key stored in the Secret **must** be un-padded, base64 URL encoded data. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - preferredChain: - description: 'PreferredChain is the chain to use if the ACME server outputs multiple. PreferredChain is no guarantee that this one gets delivered by the ACME endpoint. For example, for Let''s Encrypt''s DST crosssign you would use: "DST Root CA X3" or "ISRG Root X1" for the newer Let''s Encrypt root CA. This value picks the first certificate bundle in the ACME alternative chains that has a certificate with this value as its issuer''s CN' - type: string - maxLength: 64 - privateKeySecretRef: - description: PrivateKey is the name of a Kubernetes Secret resource that will be used to store the automatically generated ACME account private key. Optionally, a `key` may be specified to select a specific entry within the named Secret resource. If `key` is not specified, a default of `tls.key` will be used. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - server: - description: 'Server is the URL used to access the ACME server''s ''directory'' endpoint. For example, for Let''s Encrypt''s staging endpoint, you would use: "https://acme-staging-v02.api.letsencrypt.org/directory". Only ACME v2 endpoints (i.e. RFC 8555) are supported.' - type: string - skipTLSVerify: - description: Enables or disables validation of the ACME server TLS certificate. If true, requests to the ACME server will not have their TLS certificate validated (i.e. insecure connections will be allowed). Only enable this option in development environments. The cert-manager system installed roots will be used to verify connections to the ACME server if this is false. Defaults to false. - type: boolean - solvers: - description: 'Solvers is a list of challenge solvers that will be used to solve ACME challenges for the matching domains. Solver configurations must be provided in order to obtain certificates from an ACME server. For more information, see: https://cert-manager.io/docs/configuration/acme/' - type: array - items: - description: An ACMEChallengeSolver describes how to solve ACME challenges for the issuer it is part of. A selector may be provided to use different solving strategies for different DNS names. Only one of HTTP01 or DNS01 must be provided. - type: object - properties: - dns01: - description: Configures cert-manager to attempt to complete authorizations by performing the DNS01 challenge flow. - type: object - properties: - acmeDNS: - description: Use the 'ACME DNS' (https://github.com/joohoi/acme-dns) API to manage DNS01 challenge records. - type: object - required: - - accountSecretRef - - host - properties: - accountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - host: - type: string - akamai: - description: Use the Akamai DNS zone management API to manage DNS01 challenge records. - type: object - required: - - accessTokenSecretRef - - clientSecretSecretRef - - clientTokenSecretRef - - serviceConsumerDomain - properties: - accessTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientSecretSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - serviceConsumerDomain: - type: string - azureDNS: - description: Use the Microsoft Azure DNS API to manage DNS01 challenge records. - type: object - required: - - resourceGroupName - - subscriptionID - properties: - clientID: - description: if both this and ClientSecret are left unset MSI will be used - type: string - clientSecretSecretRef: - description: if both this and ClientID are left unset MSI will be used - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - environment: - description: name of the Azure environment (default AzurePublicCloud) - type: string - enum: - - AzurePublicCloud - - AzureChinaCloud - - AzureGermanCloud - - AzureUSGovernmentCloud - hostedZoneName: - description: name of the DNS zone that should be used - type: string - managedIdentity: - description: managed identity configuration, can not be used at the same time as clientID, clientSecretSecretRef or tenantID - type: object - properties: - clientID: - description: client ID of the managed identity, can not be used at the same time as resourceID - type: string - resourceID: - description: resource ID of the managed identity, can not be used at the same time as clientID - type: string - resourceGroupName: - description: resource group the DNS zone is located in - type: string - subscriptionID: - description: ID of the Azure subscription - type: string - tenantID: - description: when specifying ClientID and ClientSecret then this field is also needed - type: string - cloudDNS: - description: Use the Google Cloud DNS API to manage DNS01 challenge records. - type: object - required: - - project - properties: - hostedZoneName: - description: HostedZoneName is an optional field that tells cert-manager in which Cloud DNS zone the challenge record has to be created. If left empty cert-manager will automatically choose a zone. - type: string - project: - type: string - serviceAccountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - cloudflare: - description: Use the Cloudflare API to manage DNS01 challenge records. - type: object - properties: - apiKeySecretRef: - description: 'API key to use to authenticate with Cloudflare. Note: using an API token to authenticate is now the recommended method as it allows greater control of permissions.' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - apiTokenSecretRef: - description: API token used to authenticate with Cloudflare. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - email: - description: Email of the account, only required when using API key based authentication. - type: string - cnameStrategy: - description: CNAMEStrategy configures how the DNS01 provider should handle CNAME records when found in DNS zones. - type: string - enum: - - None - - Follow - digitalocean: - description: Use the DigitalOcean DNS API to manage DNS01 challenge records. - type: object - required: - - tokenSecretRef - properties: - tokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - rfc2136: - description: Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/) to manage DNS01 challenge records. - type: object - required: - - nameserver - properties: - nameserver: - description: The IP address or hostname of an authoritative DNS server supporting RFC2136 in the form host:port. If the host is an IPv6 address it must be enclosed in square brackets (e.g [2001:db8::1]) ; port is optional. This field is required. - type: string - tsigAlgorithm: - description: 'The TSIG Algorithm configured in the DNS supporting RFC2136. Used only when ``tsigSecretSecretRef`` and ``tsigKeyName`` are defined. Supported values are (case-insensitive): ``HMACMD5`` (default), ``HMACSHA1``, ``HMACSHA256`` or ``HMACSHA512``.' - type: string - tsigKeyName: - description: The TSIG Key name configured in the DNS. If ``tsigSecretSecretRef`` is defined, this field is required. - type: string - tsigSecretSecretRef: - description: The name of the secret containing the TSIG value. If ``tsigKeyName`` is defined, this field is required. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - route53: - description: Use the AWS Route53 API to manage DNS01 challenge records. - type: object - required: - - region - properties: - accessKeyID: - description: 'The AccessKeyID is used for authentication. If not set we fall-back to using env vars, shared credentials file or AWS Instance metadata see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: string - hostedZoneID: - description: If set, the provider will manage only this zone in Route53 and will not do an lookup using the route53:ListHostedZonesByName api call. - type: string - region: - description: Always set the region when using AccessKeyID and SecretAccessKey - type: string - role: - description: Role is a Role ARN which the Route53 provider will assume using either the explicit credentials AccessKeyID/SecretAccessKey or the inferred credentials from environment variables, shared credentials file or AWS Instance metadata - type: string - secretAccessKeySecretRef: - description: The SecretAccessKey is used for authentication. If not set we fall-back to using env vars, shared credentials file or AWS Instance metadata https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - webhook: - description: Configure an external webhook based DNS01 challenge solver to manage DNS01 challenge records. - type: object - required: - - groupName - - solverName - properties: - config: - description: Additional configuration that should be passed to the webhook apiserver when challenges are processed. This can contain arbitrary JSON data. Secret values should not be specified in this stanza. If secret values are needed (e.g. credentials for a DNS service), you should use a SecretKeySelector to reference a Secret resource. For details on the schema of this field, consult the webhook provider implementation's documentation. - x-kubernetes-preserve-unknown-fields: true - groupName: - description: The API group name that should be used when POSTing ChallengePayload resources to the webhook apiserver. This should be the same as the GroupName specified in the webhook provider implementation. - type: string - solverName: - description: The name of the solver to use, as defined in the webhook provider implementation. This will typically be the name of the provider, e.g. 'cloudflare'. - type: string - http01: - description: Configures cert-manager to attempt to complete authorizations by performing the HTTP01 challenge flow. It is not possible to obtain certificates for wildcard domain names (e.g. `*.example.com`) using the HTTP01 challenge mechanism. - type: object - properties: - gatewayHTTPRoute: - description: The Gateway API is a sig-network community API that models service networking in Kubernetes (https://gateway-api.sigs.k8s.io/). The Gateway solver will create HTTPRoutes with the specified labels in the same namespace as the challenge. This solver is experimental, and fields / behaviour may change in the future. - type: object - properties: - labels: - description: The labels that cert-manager will use when creating the temporary HTTPRoute needed for solving the HTTP-01 challenge. These labels must match the label selector of at least one Gateway. - type: object - additionalProperties: - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - ingress: - description: The ingress based HTTP01 challenge solver will solve challenges by creating or modifying Ingress resources in order to route requests for '/.well-known/acme-challenge/XYZ' to 'challenge solver' pods that are provisioned by cert-manager for each Challenge to be completed. - type: object - properties: - class: - description: The ingress class to use when creating Ingress resources to solve ACME challenges that use this challenge solver. Only one of 'class' or 'name' may be specified. - type: string - ingressTemplate: - description: Optional ingress template used to configure the ACME challenge solver ingress used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the ingress used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - name: - description: The name of the ingress resource that should have ACME challenge solving routes inserted into it in order to solve HTTP01 challenges. This is typically used in conjunction with ingress controllers like ingress-gce, which maintains a 1:1 mapping between external IPs and ingress resources. - type: string - podTemplate: - description: Optional pod template used to configure the ACME challenge solver pods used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the pod used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the create ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - spec: - description: PodSpec defines overrides for the HTTP01 challenge solver pod. Only the 'priorityClassName', 'nodeSelector', 'affinity', 'serviceAccountName' and 'tolerations' fields are supported currently. All other fields will be ignored. - type: object - properties: - affinity: - description: If specified, the pod's scheduling constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. - type: array - items: - description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). - type: object - required: - - preference - - weight - properties: - preference: - description: A node selector term, associated with the corresponding weight. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - weight: - description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. The terms are ORed. - type: array - items: - description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. This field is beta-level and is only honored when PodAffinityNamespaceSelector feature is enabled. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace" - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - nodeSelector: - description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - priorityClassName: - description: If specified, the pod's priorityClassName. - type: string - serviceAccountName: - description: If specified, the pod's service account - type: string - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - selector: - description: Selector selects a set of DNSNames on the Certificate resource that should be solved using this challenge solver. If not specified, the solver will be treated as the 'default' solver with the lowest priority, i.e. if any other solver has a more specific match, it will be used instead. - type: object - properties: - dnsNames: - description: List of DNSNames that this solver will be used to solve. If specified and a match is found, a dnsNames selector will take precedence over a dnsZones selector. If multiple solvers match with the same dnsNames value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - dnsZones: - description: List of DNSZones that this solver will be used to solve. The most specific DNS zone match specified here will take precedence over other DNS zone matches, so a solver specifying sys.example.com will be selected over one specifying example.com for the domain www.sys.example.com. If multiple solvers match with the same dnsZones value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - matchLabels: - description: A label selector that is used to refine the set of certificate's that this challenge solver will apply to. - type: object - additionalProperties: - type: string - ca: - description: CA configures this issuer to sign certificates using a signing CA keypair stored in a Secret resource. This is used to build internal PKIs that are managed by cert-manager. - type: object - required: - - secretName - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set, certificates will be issued without distribution points set. - type: array - items: - type: string - ocspServers: - description: The OCSP server list is an X.509 v3 extension that defines a list of URLs of OCSP responders. The OCSP responders can be queried for the revocation status of an issued certificate. If not set, the certificate will be issued with no OCSP servers set. For example, an OCSP server URL could be "http://ocsp.int-x3.letsencrypt.org". - type: array - items: - type: string - secretName: - description: SecretName is the name of the secret used to sign Certificates issued by this Issuer. - type: string - selfSigned: - description: SelfSigned configures this issuer to 'self sign' certificates using the private key used to create the CertificateRequest object. - type: object - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set certificate will be issued without CDP. Values are strings. - type: array - items: - type: string - vault: - description: Vault configures this issuer to sign certificates using a HashiCorp Vault PKI backend. - type: object - required: - - auth - - path - - server - properties: - auth: - description: Auth configures how cert-manager authenticates with the Vault server. - type: object - properties: - appRole: - description: AppRole authenticates with Vault using the App Role auth mechanism, with the role and secret stored in a Kubernetes Secret resource. - type: object - required: - - path - - roleId - - secretRef - properties: - path: - description: 'Path where the App Role authentication backend is mounted in Vault, e.g: "approle"' - type: string - roleId: - description: RoleID configured in the App Role authentication backend when setting up the authentication backend in Vault. - type: string - secretRef: - description: Reference to a key in a Secret that contains the App Role secret used to authenticate with Vault. The `key` field must be specified and denotes which entry within the Secret resource is used as the app role secret. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - kubernetes: - description: Kubernetes authenticates with Vault by passing the ServiceAccount token stored in the named Secret resource to the Vault server. - type: object - required: - - role - - secretRef - properties: - mountPath: - description: The Vault mountPath here is the mount path to use when authenticating with Vault. For example, setting a value to `/v1/auth/foo`, will use the path `/v1/auth/foo/login` to authenticate with Vault. If unspecified, the default value "/v1/auth/kubernetes" will be used. - type: string - role: - description: A required field containing the Vault Role to assume. A Role binds a Kubernetes ServiceAccount with a set of Vault policies. - type: string - secretRef: - description: The required Secret field containing a Kubernetes ServiceAccount JWT used for authenticating with Vault. Use of 'ambient credentials' is not supported. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - tokenSecretRef: - description: TokenSecretRef authenticates with Vault by presenting a token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - caBundle: - description: PEM-encoded CA bundle (base64-encoded) used to validate Vault server certificate. Only used if the Server URL is using HTTPS protocol. This parameter is ignored for plain HTTP protocol connection. If not set the system root certificates are used to validate the TLS connection. - type: string - format: byte - namespace: - description: 'Name of the vault namespace. Namespaces is a set of features within Vault Enterprise that allows Vault environments to support Secure Multi-tenancy. e.g: "ns1" More about namespaces can be found here https://www.vaultproject.io/docs/enterprise/namespaces' - type: string - path: - description: 'Path is the mount path of the Vault PKI backend''s `sign` endpoint, e.g: "my_pki_mount/sign/my-role-name".' - type: string - server: - description: 'Server is the connection address for the Vault server, e.g: "https://vault.example.com:8200".' - type: string - venafi: - description: Venafi configures this issuer to sign certificates using a Venafi TPP or Venafi Cloud policy zone. - type: object - required: - - zone - properties: - cloud: - description: Cloud specifies the Venafi cloud configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - apiTokenSecretRef - properties: - apiTokenSecretRef: - description: APITokenSecretRef is a secret key selector for the Venafi Cloud API token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: URL is the base URL for Venafi Cloud. Defaults to "https://api.venafi.cloud/v1". - type: string - tpp: - description: TPP specifies Trust Protection Platform configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - credentialsRef - - url - properties: - caBundle: - description: CABundle is a PEM encoded TLS certificate to use to verify connections to the TPP instance. If specified, system roots will not be used and the issuing CA for the TPP instance must be verifiable using the provided root. If not specified, the connection will be verified using the cert-manager system root certificates. - type: string - format: byte - credentialsRef: - description: CredentialsRef is a reference to a Secret containing the username and password for the TPP server. The secret must contain two keys, 'username' and 'password'. - type: object - required: - - name - properties: - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: 'URL is the base URL for the vedsdk endpoint of the Venafi TPP instance, for example: "https://tpp.example.com/vedsdk".' - type: string - zone: - description: Zone is the Venafi Policy Zone to use for this issuer. All requests made to the Venafi platform will be restricted by the named zone policy. This field is required. - type: string - status: - description: Status of the Issuer. This is set and managed automatically. - type: object - properties: - acme: - description: ACME specific status options. This field should only be set if the Issuer is configured to use an ACME server to issue certificates. - type: object - properties: - lastRegisteredEmail: - description: LastRegisteredEmail is the email associated with the latest registered ACME account, in order to track changes made to registered account associated with the Issuer - type: string - uri: - description: URI is the unique account identifier, which can also be used to retrieve account details from the CA - type: string - conditions: - description: List of status conditions to indicate the status of a CertificateRequest. Known condition types are `Ready`. - type: array - items: - description: IssuerCondition contains condition information for an Issuer. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - observedGeneration: - description: If set, this represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.condition[x].observedGeneration is 9, the condition is out of date with respect to the current state of the Issuer. - type: integer - format: int64 - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`). - type: string - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: orders.acme.cert-manager.io - annotations: - cert-manager.io/inject-ca-from-secret: cert-manager/cert-manager-webhook-ca - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/version: v1.7.2 -spec: - group: acme.cert-manager.io - names: - kind: Order - listKind: OrderList - plural: orders - singular: order - categories: - - cert-manager - - cert-manager-acme - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.state - name: State - type: string - - jsonPath: .spec.issuerRef.name - name: Issuer - priority: 1 - type: string - - jsonPath: .status.reason - name: Reason - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: Order is a type to represent an Order with an ACME server - type: object - required: - - metadata - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - type: object - required: - - issuerRef - - request - properties: - commonName: - description: CommonName is the common name as specified on the DER encoded CSR. If specified, this value must also be present in `dnsNames` or `ipAddresses`. This field must match the corresponding field on the DER encoded CSR. - type: string - dnsNames: - description: DNSNames is a list of DNS names that should be included as part of the Order validation process. This field must match the corresponding field on the DER encoded CSR. - type: array - items: - type: string - duration: - description: Duration is the duration for the not after date for the requested certificate. this is set on order creation as pe the ACME spec. - type: string - ipAddresses: - description: IPAddresses is a list of IP addresses that should be included as part of the Order validation process. This field must match the corresponding field on the DER encoded CSR. - type: array - items: - type: string - issuerRef: - description: IssuerRef references a properly configured ACME-type Issuer which should be used to create this Order. If the Issuer does not exist, processing will be retried. If the Issuer is not an 'ACME' Issuer, an error will be returned and the Order will be marked as failed. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - request: - description: Certificate signing request bytes in DER encoding. This will be used when finalizing the order. This field must be set on the order. - type: string - format: byte - status: - type: object - properties: - authorizations: - description: Authorizations contains data returned from the ACME server on what authorizations must be completed in order to validate the DNS names specified on the Order. - type: array - items: - description: ACMEAuthorization contains data returned from the ACME server on an authorization that must be completed in order validate a DNS name on an ACME Order resource. - type: object - required: - - url - properties: - challenges: - description: Challenges specifies the challenge types offered by the ACME server. One of these challenge types will be selected when validating the DNS name and an appropriate Challenge resource will be created to perform the ACME challenge process. - type: array - items: - description: Challenge specifies a challenge offered by the ACME server for an Order. An appropriate Challenge resource can be created to perform the ACME challenge process. - type: object - required: - - token - - type - - url - properties: - token: - description: Token is the token that must be presented for this challenge. This is used to compute the 'key' that must also be presented. - type: string - type: - description: Type is the type of challenge being offered, e.g. 'http-01', 'dns-01', 'tls-sni-01', etc. This is the raw value retrieved from the ACME server. Only 'http-01' and 'dns-01' are supported by cert-manager, other values will be ignored. - type: string - url: - description: URL is the URL of this challenge. It can be used to retrieve additional metadata about the Challenge from the ACME server. - type: string - identifier: - description: Identifier is the DNS name to be validated as part of this authorization - type: string - initialState: - description: InitialState is the initial state of the ACME authorization when first fetched from the ACME server. If an Authorization is already 'valid', the Order controller will not create a Challenge resource for the authorization. This will occur when working with an ACME server that enables 'authz reuse' (such as Let's Encrypt's production endpoint). If not set and 'identifier' is set, the state is assumed to be pending and a Challenge will be created. - type: string - enum: - - valid - - ready - - pending - - processing - - invalid - - expired - - errored - url: - description: URL is the URL of the Authorization that must be completed - type: string - wildcard: - description: Wildcard will be true if this authorization is for a wildcard DNS name. If this is true, the identifier will be the *non-wildcard* version of the DNS name. For example, if '*.example.com' is the DNS name being validated, this field will be 'true' and the 'identifier' field will be 'example.com'. - type: boolean - certificate: - description: Certificate is a copy of the PEM encoded certificate for this Order. This field will be populated after the order has been successfully finalized with the ACME server, and the order has transitioned to the 'valid' state. - type: string - format: byte - failureTime: - description: FailureTime stores the time that this order failed. This is used to influence garbage collection and back-off. - type: string - format: date-time - finalizeURL: - description: FinalizeURL of the Order. This is used to obtain certificates for this order once it has been completed. - type: string - reason: - description: Reason optionally provides more information about a why the order is in the current state. - type: string - state: - description: State contains the current state of this Order resource. States 'success' and 'expired' are 'final' - type: string - enum: - - valid - - ready - - pending - - processing - - invalid - - expired - - errored - url: - description: URL of the Order. This will initially be empty when the resource is first created. The Order controller will populate this field when the Order is first processed. This field will be immutable after it is initially set. - type: string - served: true - storage: true ---- -apiVersion: v1 -kind: Namespace -metadata: - name: cert-manager ---- -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: true -metadata: - name: cert-manager-cainjector - namespace: cert-manager - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cainjector - app.kubernetes.io/version: v1.7.2 ---- -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: true -metadata: - name: cert-manager - namespace: cert-manager - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 ---- -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: true -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook - app.kubernetes.io/version: v1.7.2 ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook -data: null ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-cainjector - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cainjector - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - cert-manager.io - resources: - - certificates - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - get - - create - - update - - patch -- apiGroups: - - admissionregistration.k8s.io - resources: - - validatingwebhookconfigurations - - mutatingwebhookconfigurations - verbs: - - get - - list - - watch - - update -- apiGroups: - - apiregistration.k8s.io - resources: - - apiservices - verbs: - - get - - list - - watch - - update -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - get - - list - - watch - - update -- apiGroups: - - auditregistration.k8s.io - resources: - - auditsinks - verbs: - - get - - list - - watch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-issuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - cert-manager.io - resources: - - issuers - - issuers/status - verbs: - - update -- apiGroups: - - cert-manager.io - resources: - - issuers - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch - - create - - update - - delete -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-clusterissuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - cert-manager.io - resources: - - clusterissuers - - clusterissuers/status - verbs: - - update -- apiGroups: - - cert-manager.io - resources: - - clusterissuers - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch - - create - - update - - delete -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-certificates - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - cert-manager.io - resources: - - certificates - - certificates/status - - certificaterequests - - certificaterequests/status - verbs: - - update -- apiGroups: - - cert-manager.io - resources: - - certificates - - certificaterequests - - clusterissuers - - issuers - verbs: - - get - - list - - watch -- apiGroups: - - cert-manager.io - resources: - - certificates/finalizers - - certificaterequests/finalizers - verbs: - - update -- apiGroups: - - acme.cert-manager.io - resources: - - orders - verbs: - - create - - delete - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch - - create - - update - - delete - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-orders - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - acme.cert-manager.io - resources: - - orders - - orders/status - verbs: - - update -- apiGroups: - - acme.cert-manager.io - resources: - - orders - - challenges - verbs: - - get - - list - - watch -- apiGroups: - - cert-manager.io - resources: - - clusterissuers - - issuers - verbs: - - get - - list - - watch -- apiGroups: - - acme.cert-manager.io - resources: - - challenges - verbs: - - create - - delete -- apiGroups: - - acme.cert-manager.io - resources: - - orders/finalizers - verbs: - - update -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-challenges - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - acme.cert-manager.io - resources: - - challenges - - challenges/status - verbs: - - update -- apiGroups: - - acme.cert-manager.io - resources: - - challenges - verbs: - - get - - list - - watch -- apiGroups: - - cert-manager.io - resources: - - issuers - - clusterissuers - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch -- apiGroups: - - "" - resources: - - pods - - services - verbs: - - get - - list - - watch - - create - - delete -- apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch - - create - - delete - - update -- apiGroups: - - networking.x-k8s.io - resources: - - httproutes - verbs: - - get - - list - - watch - - create - - delete - - update -- apiGroups: - - route.openshift.io - resources: - - routes/custom-host - verbs: - - create -- apiGroups: - - acme.cert-manager.io - resources: - - challenges/finalizers - verbs: - - update -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-ingress-shim - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - cert-manager.io - resources: - - certificates - - certificaterequests - verbs: - - create - - update - - delete -- apiGroups: - - cert-manager.io - resources: - - certificates - - certificaterequests - - issuers - - clusterissuers - verbs: - - get - - list - - watch -- apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch -- apiGroups: - - networking.k8s.io - resources: - - ingresses/finalizers - verbs: - - update -- apiGroups: - - networking.x-k8s.io - resources: - - gateways - - httproutes - verbs: - - get - - list - - watch -- apiGroups: - - networking.x-k8s.io - resources: - - gateways/finalizers - - httproutes/finalizers - verbs: - - update -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-view - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 - rbac.authorization.k8s.io/aggregate-to-view: "true" - rbac.authorization.k8s.io/aggregate-to-edit: "true" - rbac.authorization.k8s.io/aggregate-to-admin: "true" -rules: -- apiGroups: - - cert-manager.io - resources: - - certificates - - certificaterequests - - issuers - verbs: - - get - - list - - watch -- apiGroups: - - acme.cert-manager.io - resources: - - challenges - - orders - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-edit - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 - rbac.authorization.k8s.io/aggregate-to-edit: "true" - rbac.authorization.k8s.io/aggregate-to-admin: "true" -rules: -- apiGroups: - - cert-manager.io - resources: - - certificates - - certificaterequests - - issuers - verbs: - - create - - delete - - deletecollection - - patch - - update -- apiGroups: - - acme.cert-manager.io - resources: - - challenges - - orders - verbs: - - create - - delete - - deletecollection - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-approve:cert-manager-io - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cert-manager - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - cert-manager.io - resources: - - signers - verbs: - - approve - resourceNames: - - issuers.cert-manager.io/* - - clusterissuers.cert-manager.io/* ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-certificatesigningrequests - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cert-manager - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - certificates.k8s.io - resources: - - certificatesigningrequests - verbs: - - get - - list - - watch - - update -- apiGroups: - - certificates.k8s.io - resources: - - certificatesigningrequests/status - verbs: - - update -- apiGroups: - - certificates.k8s.io - resources: - - signers - resourceNames: - - issuers.cert-manager.io/* - - clusterissuers.cert-manager.io/* - verbs: - - sign -- apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-webhook:subjectaccessreviews - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-cainjector - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cainjector - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-cainjector -subjects: -- name: cert-manager-cainjector - namespace: cert-manager - kind: ServiceAccount ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-issuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-issuers -subjects: -- name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-clusterissuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-clusterissuers -subjects: -- name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-certificates - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-certificates -subjects: -- name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-orders - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-orders -subjects: -- name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-challenges - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-challenges -subjects: -- name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-ingress-shim - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-ingress-shim -subjects: -- name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-approve:cert-manager-io - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cert-manager - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-approve:cert-manager-io -subjects: -- name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-certificatesigningrequests - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cert-manager - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-certificatesigningrequests -subjects: -- name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-webhook:subjectaccessreviews - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-webhook:subjectaccessreviews -subjects: -- apiGroup: "" - kind: ServiceAccount - name: cert-manager-webhook - namespace: cert-manager ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: cert-manager-cainjector:leaderelection - namespace: kube-system - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cainjector - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - "" - resources: - - configmaps - resourceNames: - - cert-manager-cainjector-leader-election - - cert-manager-cainjector-leader-election-core - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - configmaps - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - resourceNames: - - cert-manager-cainjector-leader-election - - cert-manager-cainjector-leader-election-core - verbs: - - get - - update - - patch -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: cert-manager:leaderelection - namespace: kube-system - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - "" - resources: - - configmaps - resourceNames: - - cert-manager-controller - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - configmaps - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - resourceNames: - - cert-manager-controller - verbs: - - get - - update - - patch -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: cert-manager-webhook:dynamic-serving - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook - app.kubernetes.io/version: v1.7.2 -rules: -- apiGroups: - - "" - resources: - - secrets - resourceNames: - - cert-manager-webhook-ca - verbs: - - get - - list - - watch - - update -- apiGroups: - - "" - resources: - - secrets - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: cert-manager-cainjector:leaderelection - namespace: kube-system - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cainjector - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: cert-manager-cainjector:leaderelection -subjects: -- kind: ServiceAccount - name: cert-manager-cainjector - namespace: cert-manager ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: cert-manager:leaderelection - namespace: kube-system - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: cert-manager:leaderelection -subjects: -- apiGroup: "" - kind: ServiceAccount - name: cert-manager - namespace: cert-manager ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: cert-manager-webhook:dynamic-serving - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook - app.kubernetes.io/version: v1.7.2 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: cert-manager-webhook:dynamic-serving -subjects: -- apiGroup: "" - kind: ServiceAccount - name: cert-manager-webhook - namespace: cert-manager ---- -apiVersion: v1 -kind: Service -metadata: - name: cert-manager - namespace: cert-manager - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 -spec: - type: ClusterIP - ports: - - protocol: TCP - port: 9402 - name: tcp-prometheus-servicemonitor - targetPort: 9402 - selector: - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller ---- -apiVersion: v1 -kind: Service -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook - app.kubernetes.io/version: v1.7.2 -spec: - type: ClusterIP - ports: - - name: https - port: 443 - protocol: TCP - targetPort: https - selector: - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: cert-manager-cainjector - namespace: cert-manager - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cainjector - app.kubernetes.io/version: v1.7.2 - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cainjector - template: - metadata: - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: cainjector - app.kubernetes.io/version: v1.7.2 - spec: - serviceAccountName: cert-manager-cainjector - securityContext: - runAsNonRoot: true - containers: - - name: cert-manager - image: quay.io/jetstack/cert-manager-cainjector:v1.7.2 - imagePullPolicy: IfNotPresent - args: - - --v=2 - - --leader-election-namespace=kube-system - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: cert-manager - namespace: cert-manager - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - template: - metadata: - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: controller - app.kubernetes.io/version: v1.7.2 - annotations: - prometheus.io/path: /metrics - prometheus.io/scrape: "true" - prometheus.io/port: "9402" - spec: - serviceAccountName: cert-manager - securityContext: - runAsNonRoot: true - containers: - - name: cert-manager - image: quay.io/jetstack/cert-manager-controller:v1.7.2 - imagePullPolicy: IfNotPresent - args: - - --v=2 - - --cluster-resource-namespace=$(POD_NAMESPACE) - - --leader-election-namespace=kube-system - ports: - - containerPort: 9402 - protocol: TCP - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook - app.kubernetes.io/version: v1.7.2 - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook - template: - metadata: - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook - app.kubernetes.io/version: v1.7.2 - spec: - serviceAccountName: cert-manager-webhook - securityContext: - runAsNonRoot: true - containers: - - name: cert-manager - image: quay.io/jetstack/cert-manager-webhook:v1.7.2 - imagePullPolicy: IfNotPresent - args: - - --v=2 - - --secure-port=10250 - - --dynamic-serving-ca-secret-namespace=$(POD_NAMESPACE) - - --dynamic-serving-ca-secret-name=cert-manager-webhook-ca - - --dynamic-serving-dns-names=cert-manager-webhook,cert-manager-webhook.cert-manager,cert-manager-webhook.cert-manager.svc - ports: - - name: https - protocol: TCP - containerPort: 10250 - livenessProbe: - httpGet: - path: /livez - port: 6080 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - readinessProbe: - httpGet: - path: /healthz - port: 6080 - scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - name: cert-manager-webhook - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook - app.kubernetes.io/version: v1.7.2 - annotations: - cert-manager.io/inject-ca-from-secret: cert-manager/cert-manager-webhook-ca -webhooks: -- name: webhook.cert-manager.io - rules: - - apiGroups: - - cert-manager.io - - acme.cert-manager.io - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - '*/*' - admissionReviewVersions: - - v1 - matchPolicy: Equivalent - timeoutSeconds: 10 - failurePolicy: Fail - sideEffects: None - clientConfig: - service: - name: cert-manager-webhook - namespace: cert-manager - path: /mutate ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - name: cert-manager-webhook - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: webhook - app.kubernetes.io/version: v1.7.2 - annotations: - cert-manager.io/inject-ca-from-secret: cert-manager/cert-manager-webhook-ca -webhooks: -- name: webhook.cert-manager.io - namespaceSelector: - matchExpressions: - - key: cert-manager.io/disable-validation - operator: NotIn - values: - - "true" - - key: name - operator: NotIn - values: - - cert-manager - rules: - - apiGroups: - - cert-manager.io - - acme.cert-manager.io - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - '*/*' - admissionReviewVersions: - - v1 - matchPolicy: Equivalent - timeoutSeconds: 10 - failurePolicy: Fail - sideEffects: None - clientConfig: - service: - name: cert-manager-webhook - namespace: cert-manager - path: /validate diff --git a/providers/cert-manager/v1.9.1/cert-manager.yaml b/providers/cert-manager/v1.9.1/cert-manager.yaml deleted file mode 100644 index e3a91dcc5e..0000000000 --- a/providers/cert-manager/v1.9.1/cert-manager.yaml +++ /dev/null @@ -1,5408 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: cert-manager ---- -# Source: cert-manager/templates/crd-templates.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: certificaterequests.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.9.1" -spec: - group: cert-manager.io - names: - kind: CertificateRequest - listKind: CertificateRequestList - plural: certificaterequests - shortNames: - - cr - - crs - singular: certificaterequest - categories: - - cert-manager - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Approved")].status - name: Approved - type: string - - jsonPath: .status.conditions[?(@.type=="Denied")].status - name: Denied - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .spec.issuerRef.name - name: Issuer - type: string - - jsonPath: .spec.username - name: Requestor - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: "A CertificateRequest is used to request a signed certificate from one of the configured issuers. \n All fields within the CertificateRequest's `spec` are immutable after creation. A CertificateRequest will either succeed or fail, as denoted by its `status.state` field. \n A CertificateRequest is a one-shot resource, meaning it represents a single point in time request for a certificate and cannot be re-used." - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the CertificateRequest resource. - type: object - required: - - issuerRef - - request - properties: - duration: - description: The requested 'duration' (i.e. lifetime) of the Certificate. This option may be ignored/overridden by some issuer types. - type: string - extra: - description: Extra contains extra attributes of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: object - additionalProperties: - type: array - items: - type: string - groups: - description: Groups contains group membership of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: array - items: - type: string - x-kubernetes-list-type: atomic - isCA: - description: IsCA will request to mark the certificate as valid for certificate signing when submitting to the issuer. This will automatically add the `cert sign` usage to the list of `usages`. - type: boolean - issuerRef: - description: IssuerRef is a reference to the issuer for this CertificateRequest. If the `kind` field is not set, or set to `Issuer`, an Issuer resource with the given name in the same namespace as the CertificateRequest will be used. If the `kind` field is set to `ClusterIssuer`, a ClusterIssuer with the provided name will be used. The `name` field in this stanza is required at all times. The group field refers to the API group of the issuer which defaults to `cert-manager.io` if empty. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - request: - description: The PEM-encoded x509 certificate signing request to be submitted to the CA for signing. - type: string - format: byte - uid: - description: UID contains the uid of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: string - usages: - description: Usages is the set of x509 usages that are requested for the certificate. If usages are set they SHOULD be encoded inside the CSR spec Defaults to `digital signature` and `key encipherment` if not specified. - type: array - items: - description: 'KeyUsage specifies valid usage contexts for keys. See: https://tools.ietf.org/html/rfc5280#section-4.2.1.3 https://tools.ietf.org/html/rfc5280#section-4.2.1.12 Valid KeyUsage values are as follows: "signing", "digital signature", "content commitment", "key encipherment", "key agreement", "data encipherment", "cert sign", "crl sign", "encipher only", "decipher only", "any", "server auth", "client auth", "code signing", "email protection", "s/mime", "ipsec end system", "ipsec tunnel", "ipsec user", "timestamping", "ocsp signing", "microsoft sgc", "netscape sgc"' - type: string - enum: - - signing - - digital signature - - content commitment - - key encipherment - - key agreement - - data encipherment - - cert sign - - crl sign - - encipher only - - decipher only - - any - - server auth - - client auth - - code signing - - email protection - - s/mime - - ipsec end system - - ipsec tunnel - - ipsec user - - timestamping - - ocsp signing - - microsoft sgc - - netscape sgc - username: - description: Username contains the name of the user that created the CertificateRequest. Populated by the cert-manager webhook on creation and immutable. - type: string - status: - description: Status of the CertificateRequest. This is set and managed automatically. - type: object - properties: - ca: - description: The PEM encoded x509 certificate of the signer, also known as the CA (Certificate Authority). This is set on a best-effort basis by different issuers. If not set, the CA is assumed to be unknown/not available. - type: string - format: byte - certificate: - description: The PEM encoded x509 certificate resulting from the certificate signing request. If not set, the CertificateRequest has either not been completed or has failed. More information on failure can be found by checking the `conditions` field. - type: string - format: byte - conditions: - description: List of status conditions to indicate the status of a CertificateRequest. Known condition types are `Ready` and `InvalidRequest`. - type: array - items: - description: CertificateRequestCondition contains condition information for a CertificateRequest. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`, `InvalidRequest`, `Approved`, `Denied`). - type: string - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - failureTime: - description: FailureTime stores the time that this CertificateRequest failed. This is used to influence garbage collection and back-off. - type: string - format: date-time - served: true - storage: true ---- -# Source: cert-manager/templates/crd-templates.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: certificates.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.9.1" -spec: - group: cert-manager.io - names: - kind: Certificate - listKind: CertificateList - plural: certificates - shortNames: - - cert - - certs - singular: certificate - categories: - - cert-manager - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .spec.secretName - name: Secret - type: string - - jsonPath: .spec.issuerRef.name - name: Issuer - priority: 1 - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: "A Certificate resource should be created to ensure an up to date and signed x509 certificate is stored in the Kubernetes Secret resource named in `spec.secretName`. \n The stored certificate will be renewed before it expires (as configured by `spec.renewBefore`)." - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the Certificate resource. - type: object - required: - - issuerRef - - secretName - properties: - additionalOutputFormats: - description: AdditionalOutputFormats defines extra output formats of the private key and signed certificate chain to be written to this Certificate's target Secret. This is an Alpha Feature and is only enabled with the `--feature-gates=AdditionalCertificateOutputFormats=true` option on both the controller and webhook components. - type: array - items: - description: CertificateAdditionalOutputFormat defines an additional output format of a Certificate resource. These contain supplementary data formats of the signed certificate chain and paired private key. - type: object - required: - - type - properties: - type: - description: Type is the name of the format type that should be written to the Certificate's target Secret. - type: string - enum: - - DER - - CombinedPEM - commonName: - description: 'CommonName is a common name to be used on the Certificate. The CommonName should have a length of 64 characters or fewer to avoid generating invalid CSRs. This value is ignored by TLS clients when any subject alt name is set. This is x509 behaviour: https://tools.ietf.org/html/rfc6125#section-6.4.4' - type: string - dnsNames: - description: DNSNames is a list of DNS subjectAltNames to be set on the Certificate. - type: array - items: - type: string - duration: - description: The requested 'duration' (i.e. lifetime) of the Certificate. This option may be ignored/overridden by some issuer types. If unset this defaults to 90 days. Certificate will be renewed either 2/3 through its duration or `renewBefore` period before its expiry, whichever is later. Minimum accepted duration is 1 hour. Value must be in units accepted by Go time.ParseDuration https://golang.org/pkg/time/#ParseDuration - type: string - emailAddresses: - description: EmailAddresses is a list of email subjectAltNames to be set on the Certificate. - type: array - items: - type: string - encodeUsagesInRequest: - description: EncodeUsagesInRequest controls whether key usages should be present in the CertificateRequest - type: boolean - ipAddresses: - description: IPAddresses is a list of IP address subjectAltNames to be set on the Certificate. - type: array - items: - type: string - isCA: - description: IsCA will mark this Certificate as valid for certificate signing. This will automatically add the `cert sign` usage to the list of `usages`. - type: boolean - issuerRef: - description: IssuerRef is a reference to the issuer for this certificate. If the `kind` field is not set, or set to `Issuer`, an Issuer resource with the given name in the same namespace as the Certificate will be used. If the `kind` field is set to `ClusterIssuer`, a ClusterIssuer with the provided name will be used. The `name` field in this stanza is required at all times. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - keystores: - description: Keystores configures additional keystore output formats stored in the `secretName` Secret resource. - type: object - properties: - jks: - description: JKS configures options for storing a JKS keystore in the `spec.secretName` Secret resource. - type: object - required: - - create - - passwordSecretRef - properties: - create: - description: Create enables JKS keystore creation for the Certificate. If true, a file named `keystore.jks` will be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef`. The keystore file will only be updated upon re-issuance. A file named `truststore.jks` will also be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef` containing the issuing Certificate Authority - type: boolean - passwordSecretRef: - description: PasswordSecretRef is a reference to a key in a Secret resource containing the password used to encrypt the JKS keystore. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - pkcs12: - description: PKCS12 configures options for storing a PKCS12 keystore in the `spec.secretName` Secret resource. - type: object - required: - - create - - passwordSecretRef - properties: - create: - description: Create enables PKCS12 keystore creation for the Certificate. If true, a file named `keystore.p12` will be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef`. The keystore file will only be updated upon re-issuance. A file named `truststore.p12` will also be created in the target Secret resource, encrypted using the password stored in `passwordSecretRef` containing the issuing Certificate Authority - type: boolean - passwordSecretRef: - description: PasswordSecretRef is a reference to a key in a Secret resource containing the password used to encrypt the PKCS12 keystore. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - literalSubject: - description: LiteralSubject is an LDAP formatted string that represents the [X.509 Subject field](https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6). Use this *instead* of the Subject field if you need to ensure the correct ordering of the RDN sequence, such as when issuing certs for LDAP authentication. See https://github.com/cert-manager/cert-manager/issues/3203, https://github.com/cert-manager/cert-manager/issues/4424. This field is alpha level and is only supported by cert-manager installations where LiteralCertificateSubject feature gate is enabled on both cert-manager controller and webhook. - type: string - privateKey: - description: Options to control private keys used for the Certificate. - type: object - properties: - algorithm: - description: Algorithm is the private key algorithm of the corresponding private key for this certificate. If provided, allowed values are either `RSA`,`Ed25519` or `ECDSA` If `algorithm` is specified and `size` is not provided, key size of 256 will be used for `ECDSA` key algorithm and key size of 2048 will be used for `RSA` key algorithm. key size is ignored when using the `Ed25519` key algorithm. - type: string - enum: - - RSA - - ECDSA - - Ed25519 - encoding: - description: The private key cryptography standards (PKCS) encoding for this certificate's private key to be encoded in. If provided, allowed values are `PKCS1` and `PKCS8` standing for PKCS#1 and PKCS#8, respectively. Defaults to `PKCS1` if not specified. - type: string - enum: - - PKCS1 - - PKCS8 - rotationPolicy: - description: RotationPolicy controls how private keys should be regenerated when a re-issuance is being processed. If set to Never, a private key will only be generated if one does not already exist in the target `spec.secretName`. If one does exists but it does not have the correct algorithm or size, a warning will be raised to await user intervention. If set to Always, a private key matching the specified requirements will be generated whenever a re-issuance occurs. Default is 'Never' for backward compatibility. - type: string - enum: - - Never - - Always - size: - description: Size is the key bit size of the corresponding private key for this certificate. If `algorithm` is set to `RSA`, valid values are `2048`, `4096` or `8192`, and will default to `2048` if not specified. If `algorithm` is set to `ECDSA`, valid values are `256`, `384` or `521`, and will default to `256` if not specified. If `algorithm` is set to `Ed25519`, Size is ignored. No other values are allowed. - type: integer - renewBefore: - description: How long before the currently issued certificate's expiry cert-manager should renew the certificate. The default is 2/3 of the issued certificate's duration. Minimum accepted value is 5 minutes. Value must be in units accepted by Go time.ParseDuration https://golang.org/pkg/time/#ParseDuration - type: string - revisionHistoryLimit: - description: revisionHistoryLimit is the maximum number of CertificateRequest revisions that are maintained in the Certificate's history. Each revision represents a single `CertificateRequest` created by this Certificate, either when it was created, renewed, or Spec was changed. Revisions will be removed by oldest first if the number of revisions exceeds this number. If set, revisionHistoryLimit must be a value of `1` or greater. If unset (`nil`), revisions will not be garbage collected. Default value is `nil`. - type: integer - format: int32 - secretName: - description: SecretName is the name of the secret resource that will be automatically created and managed by this Certificate resource. It will be populated with a private key and certificate, signed by the denoted issuer. - type: string - secretTemplate: - description: SecretTemplate defines annotations and labels to be copied to the Certificate's Secret. Labels and annotations on the Secret will be changed as they appear on the SecretTemplate when added or removed. SecretTemplate annotations are added in conjunction with, and cannot overwrite, the base set of annotations cert-manager sets on the Certificate's Secret. - type: object - properties: - annotations: - description: Annotations is a key value map to be copied to the target Kubernetes Secret. - type: object - additionalProperties: - type: string - labels: - description: Labels is a key value map to be copied to the target Kubernetes Secret. - type: object - additionalProperties: - type: string - subject: - description: Full X509 name specification (https://golang.org/pkg/crypto/x509/pkix/#Name). - type: object - properties: - countries: - description: Countries to be used on the Certificate. - type: array - items: - type: string - localities: - description: Cities to be used on the Certificate. - type: array - items: - type: string - organizationalUnits: - description: Organizational Units to be used on the Certificate. - type: array - items: - type: string - organizations: - description: Organizations to be used on the Certificate. - type: array - items: - type: string - postalCodes: - description: Postal codes to be used on the Certificate. - type: array - items: - type: string - provinces: - description: State/Provinces to be used on the Certificate. - type: array - items: - type: string - serialNumber: - description: Serial number to be used on the Certificate. - type: string - streetAddresses: - description: Street addresses to be used on the Certificate. - type: array - items: - type: string - uris: - description: URIs is a list of URI subjectAltNames to be set on the Certificate. - type: array - items: - type: string - usages: - description: Usages is the set of x509 usages that are requested for the certificate. Defaults to `digital signature` and `key encipherment` if not specified. - type: array - items: - description: 'KeyUsage specifies valid usage contexts for keys. See: https://tools.ietf.org/html/rfc5280#section-4.2.1.3 https://tools.ietf.org/html/rfc5280#section-4.2.1.12 Valid KeyUsage values are as follows: "signing", "digital signature", "content commitment", "key encipherment", "key agreement", "data encipherment", "cert sign", "crl sign", "encipher only", "decipher only", "any", "server auth", "client auth", "code signing", "email protection", "s/mime", "ipsec end system", "ipsec tunnel", "ipsec user", "timestamping", "ocsp signing", "microsoft sgc", "netscape sgc"' - type: string - enum: - - signing - - digital signature - - content commitment - - key encipherment - - key agreement - - data encipherment - - cert sign - - crl sign - - encipher only - - decipher only - - any - - server auth - - client auth - - code signing - - email protection - - s/mime - - ipsec end system - - ipsec tunnel - - ipsec user - - timestamping - - ocsp signing - - microsoft sgc - - netscape sgc - status: - description: Status of the Certificate. This is set and managed automatically. - type: object - properties: - conditions: - description: List of status conditions to indicate the status of certificates. Known condition types are `Ready` and `Issuing`. - type: array - items: - description: CertificateCondition contains condition information for an Certificate. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - observedGeneration: - description: If set, this represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.condition[x].observedGeneration is 9, the condition is out of date with respect to the current state of the Certificate. - type: integer - format: int64 - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`, `Issuing`). - type: string - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - failedIssuanceAttempts: - description: The number of continuous failed issuance attempts up till now. This field gets removed (if set) on a successful issuance and gets set to 1 if unset and an issuance has failed. If an issuance has failed, the delay till the next issuance will be calculated using formula time.Hour * 2 ^ (failedIssuanceAttempts - 1). - type: integer - lastFailureTime: - description: LastFailureTime is the time as recorded by the Certificate controller of the most recent failure to complete a CertificateRequest for this Certificate resource. If set, cert-manager will not re-request another Certificate until 1 hour has elapsed from this time. - type: string - format: date-time - nextPrivateKeySecretName: - description: The name of the Secret resource containing the private key to be used for the next certificate iteration. The keymanager controller will automatically set this field if the `Issuing` condition is set to `True`. It will automatically unset this field when the Issuing condition is not set or False. - type: string - notAfter: - description: The expiration time of the certificate stored in the secret named by this resource in `spec.secretName`. - type: string - format: date-time - notBefore: - description: The time after which the certificate stored in the secret named by this resource in spec.secretName is valid. - type: string - format: date-time - renewalTime: - description: RenewalTime is the time at which the certificate will be next renewed. If not set, no upcoming renewal is scheduled. - type: string - format: date-time - revision: - description: "The current 'revision' of the certificate as issued. \n When a CertificateRequest resource is created, it will have the `cert-manager.io/certificate-revision` set to one greater than the current value of this field. \n Upon issuance, this field will be set to the value of the annotation on the CertificateRequest resource used to issue the certificate. \n Persisting the value on the CertificateRequest resource allows the certificates controller to know whether a request is part of an old issuance or if it is part of the ongoing revision's issuance by checking if the revision value in the annotation is greater than this field." - type: integer - served: true - storage: true ---- -# Source: cert-manager/templates/crd-templates.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: challenges.acme.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.9.1" -spec: - group: acme.cert-manager.io - names: - kind: Challenge - listKind: ChallengeList - plural: challenges - singular: challenge - categories: - - cert-manager - - cert-manager-acme - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.state - name: State - type: string - - jsonPath: .spec.dnsName - name: Domain - type: string - - jsonPath: .status.reason - name: Reason - priority: 1 - type: string - - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: Challenge is a type to represent a Challenge request with an ACME server - type: object - required: - - metadata - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - type: object - required: - - authorizationURL - - dnsName - - issuerRef - - key - - solver - - token - - type - - url - properties: - authorizationURL: - description: The URL to the ACME Authorization resource that this challenge is a part of. - type: string - dnsName: - description: dnsName is the identifier that this challenge is for, e.g. example.com. If the requested DNSName is a 'wildcard', this field MUST be set to the non-wildcard domain, e.g. for `*.example.com`, it must be `example.com`. - type: string - issuerRef: - description: References a properly configured ACME-type Issuer which should be used to create this Challenge. If the Issuer does not exist, processing will be retried. If the Issuer is not an 'ACME' Issuer, an error will be returned and the Challenge will be marked as failed. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - key: - description: 'The ACME challenge key for this challenge For HTTP01 challenges, this is the value that must be responded with to complete the HTTP01 challenge in the format: `.`. For DNS01 challenges, this is the base64 encoded SHA256 sum of the `.` text that must be set as the TXT record content.' - type: string - solver: - description: Contains the domain solving configuration that should be used to solve this challenge resource. - type: object - properties: - dns01: - description: Configures cert-manager to attempt to complete authorizations by performing the DNS01 challenge flow. - type: object - properties: - acmeDNS: - description: Use the 'ACME DNS' (https://github.com/joohoi/acme-dns) API to manage DNS01 challenge records. - type: object - required: - - accountSecretRef - - host - properties: - accountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - host: - type: string - akamai: - description: Use the Akamai DNS zone management API to manage DNS01 challenge records. - type: object - required: - - accessTokenSecretRef - - clientSecretSecretRef - - clientTokenSecretRef - - serviceConsumerDomain - properties: - accessTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientSecretSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - serviceConsumerDomain: - type: string - azureDNS: - description: Use the Microsoft Azure DNS API to manage DNS01 challenge records. - type: object - required: - - resourceGroupName - - subscriptionID - properties: - clientID: - description: if both this and ClientSecret are left unset MSI will be used - type: string - clientSecretSecretRef: - description: if both this and ClientID are left unset MSI will be used - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - environment: - description: name of the Azure environment (default AzurePublicCloud) - type: string - enum: - - AzurePublicCloud - - AzureChinaCloud - - AzureGermanCloud - - AzureUSGovernmentCloud - hostedZoneName: - description: name of the DNS zone that should be used - type: string - managedIdentity: - description: managed identity configuration, can not be used at the same time as clientID, clientSecretSecretRef or tenantID - type: object - properties: - clientID: - description: client ID of the managed identity, can not be used at the same time as resourceID - type: string - resourceID: - description: resource ID of the managed identity, can not be used at the same time as clientID - type: string - resourceGroupName: - description: resource group the DNS zone is located in - type: string - subscriptionID: - description: ID of the Azure subscription - type: string - tenantID: - description: when specifying ClientID and ClientSecret then this field is also needed - type: string - cloudDNS: - description: Use the Google Cloud DNS API to manage DNS01 challenge records. - type: object - required: - - project - properties: - hostedZoneName: - description: HostedZoneName is an optional field that tells cert-manager in which Cloud DNS zone the challenge record has to be created. If left empty cert-manager will automatically choose a zone. - type: string - project: - type: string - serviceAccountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - cloudflare: - description: Use the Cloudflare API to manage DNS01 challenge records. - type: object - properties: - apiKeySecretRef: - description: 'API key to use to authenticate with Cloudflare. Note: using an API token to authenticate is now the recommended method as it allows greater control of permissions.' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - apiTokenSecretRef: - description: API token used to authenticate with Cloudflare. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - email: - description: Email of the account, only required when using API key based authentication. - type: string - cnameStrategy: - description: CNAMEStrategy configures how the DNS01 provider should handle CNAME records when found in DNS zones. - type: string - enum: - - None - - Follow - digitalocean: - description: Use the DigitalOcean DNS API to manage DNS01 challenge records. - type: object - required: - - tokenSecretRef - properties: - tokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - rfc2136: - description: Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/) to manage DNS01 challenge records. - type: object - required: - - nameserver - properties: - nameserver: - description: The IP address or hostname of an authoritative DNS server supporting RFC2136 in the form host:port. If the host is an IPv6 address it must be enclosed in square brackets (e.g [2001:db8::1]) ; port is optional. This field is required. - type: string - tsigAlgorithm: - description: 'The TSIG Algorithm configured in the DNS supporting RFC2136. Used only when ``tsigSecretSecretRef`` and ``tsigKeyName`` are defined. Supported values are (case-insensitive): ``HMACMD5`` (default), ``HMACSHA1``, ``HMACSHA256`` or ``HMACSHA512``.' - type: string - tsigKeyName: - description: The TSIG Key name configured in the DNS. If ``tsigSecretSecretRef`` is defined, this field is required. - type: string - tsigSecretSecretRef: - description: The name of the secret containing the TSIG value. If ``tsigKeyName`` is defined, this field is required. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - route53: - description: Use the AWS Route53 API to manage DNS01 challenge records. - type: object - required: - - region - properties: - accessKeyID: - description: 'The AccessKeyID is used for authentication. Cannot be set when SecretAccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: string - accessKeyIDSecretRef: - description: 'The SecretAccessKey is used for authentication. If set, pull the AWS access key ID from a key within a Kubernetes Secret. Cannot be set when AccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - hostedZoneID: - description: If set, the provider will manage only this zone in Route53 and will not do an lookup using the route53:ListHostedZonesByName api call. - type: string - region: - description: Always set the region when using AccessKeyID and SecretAccessKey - type: string - role: - description: Role is a Role ARN which the Route53 provider will assume using either the explicit credentials AccessKeyID/SecretAccessKey or the inferred credentials from environment variables, shared credentials file or AWS Instance metadata - type: string - secretAccessKeySecretRef: - description: 'The SecretAccessKey is used for authentication. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - webhook: - description: Configure an external webhook based DNS01 challenge solver to manage DNS01 challenge records. - type: object - required: - - groupName - - solverName - properties: - config: - description: Additional configuration that should be passed to the webhook apiserver when challenges are processed. This can contain arbitrary JSON data. Secret values should not be specified in this stanza. If secret values are needed (e.g. credentials for a DNS service), you should use a SecretKeySelector to reference a Secret resource. For details on the schema of this field, consult the webhook provider implementation's documentation. - x-kubernetes-preserve-unknown-fields: true - groupName: - description: The API group name that should be used when POSTing ChallengePayload resources to the webhook apiserver. This should be the same as the GroupName specified in the webhook provider implementation. - type: string - solverName: - description: The name of the solver to use, as defined in the webhook provider implementation. This will typically be the name of the provider, e.g. 'cloudflare'. - type: string - http01: - description: Configures cert-manager to attempt to complete authorizations by performing the HTTP01 challenge flow. It is not possible to obtain certificates for wildcard domain names (e.g. `*.example.com`) using the HTTP01 challenge mechanism. - type: object - properties: - gatewayHTTPRoute: - description: The Gateway API is a sig-network community API that models service networking in Kubernetes (https://gateway-api.sigs.k8s.io/). The Gateway solver will create HTTPRoutes with the specified labels in the same namespace as the challenge. This solver is experimental, and fields / behaviour may change in the future. - type: object - properties: - labels: - description: Custom labels that will be applied to HTTPRoutes created by cert-manager while solving HTTP-01 challenges. - type: object - additionalProperties: - type: string - parentRefs: - description: 'When solving an HTTP-01 challenge, cert-manager creates an HTTPRoute. cert-manager needs to know which parentRefs should be used when creating the HTTPRoute. Usually, the parentRef references a Gateway. See: https://gateway-api.sigs.k8s.io/v1alpha2/api-types/httproute/#attaching-to-gateways' - type: array - items: - description: "ParentRef identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid. \n References to objects with invalid Group and Kind are not valid, and must be rejected by the implementation, with appropriate Conditions set on the containing object." - type: object - required: - - name - properties: - group: - description: "Group is the group of the referent. \n Support: Core" - type: string - default: gateway.networking.k8s.io - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - kind: - description: "Kind is kind of the referent. \n Support: Core (Gateway) Support: Custom (Other Resources)" - type: string - default: Gateway - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - name: - description: "Name is the name of the referent. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - namespace: - description: "Namespace is the namespace of the referent. When unspecified (or empty string), this refers to the local namespace of the Route. \n Support: Core" - type: string - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - ingress: - description: The ingress based HTTP01 challenge solver will solve challenges by creating or modifying Ingress resources in order to route requests for '/.well-known/acme-challenge/XYZ' to 'challenge solver' pods that are provisioned by cert-manager for each Challenge to be completed. - type: object - properties: - class: - description: The ingress class to use when creating Ingress resources to solve ACME challenges that use this challenge solver. Only one of 'class' or 'name' may be specified. - type: string - ingressTemplate: - description: Optional ingress template used to configure the ACME challenge solver ingress used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the ingress used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - name: - description: The name of the ingress resource that should have ACME challenge solving routes inserted into it in order to solve HTTP01 challenges. This is typically used in conjunction with ingress controllers like ingress-gce, which maintains a 1:1 mapping between external IPs and ingress resources. - type: string - podTemplate: - description: Optional pod template used to configure the ACME challenge solver pods used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the pod used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the create ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - spec: - description: PodSpec defines overrides for the HTTP01 challenge solver pod. Only the 'priorityClassName', 'nodeSelector', 'affinity', 'serviceAccountName' and 'tolerations' fields are supported currently. All other fields will be ignored. - type: object - properties: - affinity: - description: If specified, the pod's scheduling constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. - type: array - items: - description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). - type: object - required: - - preference - - weight - properties: - preference: - description: A node selector term, associated with the corresponding weight. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - weight: - description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. The terms are ORed. - type: array - items: - description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - nodeSelector: - description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - priorityClassName: - description: If specified, the pod's priorityClassName. - type: string - serviceAccountName: - description: If specified, the pod's service account - type: string - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - selector: - description: Selector selects a set of DNSNames on the Certificate resource that should be solved using this challenge solver. If not specified, the solver will be treated as the 'default' solver with the lowest priority, i.e. if any other solver has a more specific match, it will be used instead. - type: object - properties: - dnsNames: - description: List of DNSNames that this solver will be used to solve. If specified and a match is found, a dnsNames selector will take precedence over a dnsZones selector. If multiple solvers match with the same dnsNames value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - dnsZones: - description: List of DNSZones that this solver will be used to solve. The most specific DNS zone match specified here will take precedence over other DNS zone matches, so a solver specifying sys.example.com will be selected over one specifying example.com for the domain www.sys.example.com. If multiple solvers match with the same dnsZones value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - matchLabels: - description: A label selector that is used to refine the set of certificate's that this challenge solver will apply to. - type: object - additionalProperties: - type: string - token: - description: The ACME challenge token for this challenge. This is the raw value returned from the ACME server. - type: string - type: - description: The type of ACME challenge this resource represents. One of "HTTP-01" or "DNS-01". - type: string - enum: - - HTTP-01 - - DNS-01 - url: - description: The URL of the ACME Challenge resource for this challenge. This can be used to lookup details about the status of this challenge. - type: string - wildcard: - description: wildcard will be true if this challenge is for a wildcard identifier, for example '*.example.com'. - type: boolean - status: - type: object - properties: - presented: - description: presented will be set to true if the challenge values for this challenge are currently 'presented'. This *does not* imply the self check is passing. Only that the values have been 'submitted' for the appropriate challenge mechanism (i.e. the DNS01 TXT record has been presented, or the HTTP01 configuration has been configured). - type: boolean - processing: - description: Used to denote whether this challenge should be processed or not. This field will only be set to true by the 'scheduling' component. It will only be set to false by the 'challenges' controller, after the challenge has reached a final state or timed out. If this field is set to false, the challenge controller will not take any more action. - type: boolean - reason: - description: Contains human readable information on why the Challenge is in the current state. - type: string - state: - description: Contains the current 'state' of the challenge. If not set, the state of the challenge is unknown. - type: string - enum: - - valid - - ready - - pending - - processing - - invalid - - expired - - errored - served: true - storage: true - subresources: - status: {} ---- -# Source: cert-manager/templates/crd-templates.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: clusterissuers.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.9.1" -spec: - group: cert-manager.io - names: - kind: ClusterIssuer - listKind: ClusterIssuerList - plural: clusterissuers - singular: clusterissuer - categories: - - cert-manager - scope: Cluster - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: A ClusterIssuer represents a certificate issuing authority which can be referenced as part of `issuerRef` fields. It is similar to an Issuer, however it is cluster-scoped and therefore can be referenced by resources that exist in *any* namespace, not just the same namespace as the referent. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the ClusterIssuer resource. - type: object - properties: - acme: - description: ACME configures this issuer to communicate with a RFC8555 (ACME) server to obtain signed x509 certificates. - type: object - required: - - privateKeySecretRef - - server - properties: - disableAccountKeyGeneration: - description: Enables or disables generating a new ACME account key. If true, the Issuer resource will *not* request a new account but will expect the account key to be supplied via an existing secret. If false, the cert-manager system will generate a new ACME account key for the Issuer. Defaults to false. - type: boolean - email: - description: Email is the email address to be associated with the ACME account. This field is optional, but it is strongly recommended to be set. It will be used to contact you in case of issues with your account or certificates, including expiry notification emails. This field may be updated after the account is initially registered. - type: string - enableDurationFeature: - description: Enables requesting a Not After date on certificates that matches the duration of the certificate. This is not supported by all ACME servers like Let's Encrypt. If set to true when the ACME server does not support it it will create an error on the Order. Defaults to false. - type: boolean - externalAccountBinding: - description: ExternalAccountBinding is a reference to a CA external account of the ACME server. If set, upon registration cert-manager will attempt to associate the given external account credentials with the registered ACME account. - type: object - required: - - keyID - - keySecretRef - properties: - keyAlgorithm: - description: 'Deprecated: keyAlgorithm field exists for historical compatibility reasons and should not be used. The algorithm is now hardcoded to HS256 in golang/x/crypto/acme.' - type: string - enum: - - HS256 - - HS384 - - HS512 - keyID: - description: keyID is the ID of the CA key that the External Account is bound to. - type: string - keySecretRef: - description: keySecretRef is a Secret Key Selector referencing a data item in a Kubernetes Secret which holds the symmetric MAC key of the External Account Binding. The `key` is the index string that is paired with the key data in the Secret and should not be confused with the key data itself, or indeed with the External Account Binding keyID above. The secret key stored in the Secret **must** be un-padded, base64 URL encoded data. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - preferredChain: - description: 'PreferredChain is the chain to use if the ACME server outputs multiple. PreferredChain is no guarantee that this one gets delivered by the ACME endpoint. For example, for Let''s Encrypt''s DST crosssign you would use: "DST Root CA X3" or "ISRG Root X1" for the newer Let''s Encrypt root CA. This value picks the first certificate bundle in the ACME alternative chains that has a certificate with this value as its issuer''s CN' - type: string - maxLength: 64 - privateKeySecretRef: - description: PrivateKey is the name of a Kubernetes Secret resource that will be used to store the automatically generated ACME account private key. Optionally, a `key` may be specified to select a specific entry within the named Secret resource. If `key` is not specified, a default of `tls.key` will be used. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - server: - description: 'Server is the URL used to access the ACME server''s ''directory'' endpoint. For example, for Let''s Encrypt''s staging endpoint, you would use: "https://acme-staging-v02.api.letsencrypt.org/directory". Only ACME v2 endpoints (i.e. RFC 8555) are supported.' - type: string - skipTLSVerify: - description: Enables or disables validation of the ACME server TLS certificate. If true, requests to the ACME server will not have their TLS certificate validated (i.e. insecure connections will be allowed). Only enable this option in development environments. The cert-manager system installed roots will be used to verify connections to the ACME server if this is false. Defaults to false. - type: boolean - solvers: - description: 'Solvers is a list of challenge solvers that will be used to solve ACME challenges for the matching domains. Solver configurations must be provided in order to obtain certificates from an ACME server. For more information, see: https://cert-manager.io/docs/configuration/acme/' - type: array - items: - description: An ACMEChallengeSolver describes how to solve ACME challenges for the issuer it is part of. A selector may be provided to use different solving strategies for different DNS names. Only one of HTTP01 or DNS01 must be provided. - type: object - properties: - dns01: - description: Configures cert-manager to attempt to complete authorizations by performing the DNS01 challenge flow. - type: object - properties: - acmeDNS: - description: Use the 'ACME DNS' (https://github.com/joohoi/acme-dns) API to manage DNS01 challenge records. - type: object - required: - - accountSecretRef - - host - properties: - accountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - host: - type: string - akamai: - description: Use the Akamai DNS zone management API to manage DNS01 challenge records. - type: object - required: - - accessTokenSecretRef - - clientSecretSecretRef - - clientTokenSecretRef - - serviceConsumerDomain - properties: - accessTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientSecretSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - serviceConsumerDomain: - type: string - azureDNS: - description: Use the Microsoft Azure DNS API to manage DNS01 challenge records. - type: object - required: - - resourceGroupName - - subscriptionID - properties: - clientID: - description: if both this and ClientSecret are left unset MSI will be used - type: string - clientSecretSecretRef: - description: if both this and ClientID are left unset MSI will be used - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - environment: - description: name of the Azure environment (default AzurePublicCloud) - type: string - enum: - - AzurePublicCloud - - AzureChinaCloud - - AzureGermanCloud - - AzureUSGovernmentCloud - hostedZoneName: - description: name of the DNS zone that should be used - type: string - managedIdentity: - description: managed identity configuration, can not be used at the same time as clientID, clientSecretSecretRef or tenantID - type: object - properties: - clientID: - description: client ID of the managed identity, can not be used at the same time as resourceID - type: string - resourceID: - description: resource ID of the managed identity, can not be used at the same time as clientID - type: string - resourceGroupName: - description: resource group the DNS zone is located in - type: string - subscriptionID: - description: ID of the Azure subscription - type: string - tenantID: - description: when specifying ClientID and ClientSecret then this field is also needed - type: string - cloudDNS: - description: Use the Google Cloud DNS API to manage DNS01 challenge records. - type: object - required: - - project - properties: - hostedZoneName: - description: HostedZoneName is an optional field that tells cert-manager in which Cloud DNS zone the challenge record has to be created. If left empty cert-manager will automatically choose a zone. - type: string - project: - type: string - serviceAccountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - cloudflare: - description: Use the Cloudflare API to manage DNS01 challenge records. - type: object - properties: - apiKeySecretRef: - description: 'API key to use to authenticate with Cloudflare. Note: using an API token to authenticate is now the recommended method as it allows greater control of permissions.' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - apiTokenSecretRef: - description: API token used to authenticate with Cloudflare. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - email: - description: Email of the account, only required when using API key based authentication. - type: string - cnameStrategy: - description: CNAMEStrategy configures how the DNS01 provider should handle CNAME records when found in DNS zones. - type: string - enum: - - None - - Follow - digitalocean: - description: Use the DigitalOcean DNS API to manage DNS01 challenge records. - type: object - required: - - tokenSecretRef - properties: - tokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - rfc2136: - description: Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/) to manage DNS01 challenge records. - type: object - required: - - nameserver - properties: - nameserver: - description: The IP address or hostname of an authoritative DNS server supporting RFC2136 in the form host:port. If the host is an IPv6 address it must be enclosed in square brackets (e.g [2001:db8::1]) ; port is optional. This field is required. - type: string - tsigAlgorithm: - description: 'The TSIG Algorithm configured in the DNS supporting RFC2136. Used only when ``tsigSecretSecretRef`` and ``tsigKeyName`` are defined. Supported values are (case-insensitive): ``HMACMD5`` (default), ``HMACSHA1``, ``HMACSHA256`` or ``HMACSHA512``.' - type: string - tsigKeyName: - description: The TSIG Key name configured in the DNS. If ``tsigSecretSecretRef`` is defined, this field is required. - type: string - tsigSecretSecretRef: - description: The name of the secret containing the TSIG value. If ``tsigKeyName`` is defined, this field is required. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - route53: - description: Use the AWS Route53 API to manage DNS01 challenge records. - type: object - required: - - region - properties: - accessKeyID: - description: 'The AccessKeyID is used for authentication. Cannot be set when SecretAccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: string - accessKeyIDSecretRef: - description: 'The SecretAccessKey is used for authentication. If set, pull the AWS access key ID from a key within a Kubernetes Secret. Cannot be set when AccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - hostedZoneID: - description: If set, the provider will manage only this zone in Route53 and will not do an lookup using the route53:ListHostedZonesByName api call. - type: string - region: - description: Always set the region when using AccessKeyID and SecretAccessKey - type: string - role: - description: Role is a Role ARN which the Route53 provider will assume using either the explicit credentials AccessKeyID/SecretAccessKey or the inferred credentials from environment variables, shared credentials file or AWS Instance metadata - type: string - secretAccessKeySecretRef: - description: 'The SecretAccessKey is used for authentication. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - webhook: - description: Configure an external webhook based DNS01 challenge solver to manage DNS01 challenge records. - type: object - required: - - groupName - - solverName - properties: - config: - description: Additional configuration that should be passed to the webhook apiserver when challenges are processed. This can contain arbitrary JSON data. Secret values should not be specified in this stanza. If secret values are needed (e.g. credentials for a DNS service), you should use a SecretKeySelector to reference a Secret resource. For details on the schema of this field, consult the webhook provider implementation's documentation. - x-kubernetes-preserve-unknown-fields: true - groupName: - description: The API group name that should be used when POSTing ChallengePayload resources to the webhook apiserver. This should be the same as the GroupName specified in the webhook provider implementation. - type: string - solverName: - description: The name of the solver to use, as defined in the webhook provider implementation. This will typically be the name of the provider, e.g. 'cloudflare'. - type: string - http01: - description: Configures cert-manager to attempt to complete authorizations by performing the HTTP01 challenge flow. It is not possible to obtain certificates for wildcard domain names (e.g. `*.example.com`) using the HTTP01 challenge mechanism. - type: object - properties: - gatewayHTTPRoute: - description: The Gateway API is a sig-network community API that models service networking in Kubernetes (https://gateway-api.sigs.k8s.io/). The Gateway solver will create HTTPRoutes with the specified labels in the same namespace as the challenge. This solver is experimental, and fields / behaviour may change in the future. - type: object - properties: - labels: - description: Custom labels that will be applied to HTTPRoutes created by cert-manager while solving HTTP-01 challenges. - type: object - additionalProperties: - type: string - parentRefs: - description: 'When solving an HTTP-01 challenge, cert-manager creates an HTTPRoute. cert-manager needs to know which parentRefs should be used when creating the HTTPRoute. Usually, the parentRef references a Gateway. See: https://gateway-api.sigs.k8s.io/v1alpha2/api-types/httproute/#attaching-to-gateways' - type: array - items: - description: "ParentRef identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid. \n References to objects with invalid Group and Kind are not valid, and must be rejected by the implementation, with appropriate Conditions set on the containing object." - type: object - required: - - name - properties: - group: - description: "Group is the group of the referent. \n Support: Core" - type: string - default: gateway.networking.k8s.io - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - kind: - description: "Kind is kind of the referent. \n Support: Core (Gateway) Support: Custom (Other Resources)" - type: string - default: Gateway - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - name: - description: "Name is the name of the referent. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - namespace: - description: "Namespace is the namespace of the referent. When unspecified (or empty string), this refers to the local namespace of the Route. \n Support: Core" - type: string - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - ingress: - description: The ingress based HTTP01 challenge solver will solve challenges by creating or modifying Ingress resources in order to route requests for '/.well-known/acme-challenge/XYZ' to 'challenge solver' pods that are provisioned by cert-manager for each Challenge to be completed. - type: object - properties: - class: - description: The ingress class to use when creating Ingress resources to solve ACME challenges that use this challenge solver. Only one of 'class' or 'name' may be specified. - type: string - ingressTemplate: - description: Optional ingress template used to configure the ACME challenge solver ingress used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the ingress used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - name: - description: The name of the ingress resource that should have ACME challenge solving routes inserted into it in order to solve HTTP01 challenges. This is typically used in conjunction with ingress controllers like ingress-gce, which maintains a 1:1 mapping between external IPs and ingress resources. - type: string - podTemplate: - description: Optional pod template used to configure the ACME challenge solver pods used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the pod used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the create ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - spec: - description: PodSpec defines overrides for the HTTP01 challenge solver pod. Only the 'priorityClassName', 'nodeSelector', 'affinity', 'serviceAccountName' and 'tolerations' fields are supported currently. All other fields will be ignored. - type: object - properties: - affinity: - description: If specified, the pod's scheduling constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. - type: array - items: - description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). - type: object - required: - - preference - - weight - properties: - preference: - description: A node selector term, associated with the corresponding weight. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - weight: - description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. The terms are ORed. - type: array - items: - description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - nodeSelector: - description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - priorityClassName: - description: If specified, the pod's priorityClassName. - type: string - serviceAccountName: - description: If specified, the pod's service account - type: string - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - selector: - description: Selector selects a set of DNSNames on the Certificate resource that should be solved using this challenge solver. If not specified, the solver will be treated as the 'default' solver with the lowest priority, i.e. if any other solver has a more specific match, it will be used instead. - type: object - properties: - dnsNames: - description: List of DNSNames that this solver will be used to solve. If specified and a match is found, a dnsNames selector will take precedence over a dnsZones selector. If multiple solvers match with the same dnsNames value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - dnsZones: - description: List of DNSZones that this solver will be used to solve. The most specific DNS zone match specified here will take precedence over other DNS zone matches, so a solver specifying sys.example.com will be selected over one specifying example.com for the domain www.sys.example.com. If multiple solvers match with the same dnsZones value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - matchLabels: - description: A label selector that is used to refine the set of certificate's that this challenge solver will apply to. - type: object - additionalProperties: - type: string - ca: - description: CA configures this issuer to sign certificates using a signing CA keypair stored in a Secret resource. This is used to build internal PKIs that are managed by cert-manager. - type: object - required: - - secretName - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set, certificates will be issued without distribution points set. - type: array - items: - type: string - ocspServers: - description: The OCSP server list is an X.509 v3 extension that defines a list of URLs of OCSP responders. The OCSP responders can be queried for the revocation status of an issued certificate. If not set, the certificate will be issued with no OCSP servers set. For example, an OCSP server URL could be "http://ocsp.int-x3.letsencrypt.org". - type: array - items: - type: string - secretName: - description: SecretName is the name of the secret used to sign Certificates issued by this Issuer. - type: string - selfSigned: - description: SelfSigned configures this issuer to 'self sign' certificates using the private key used to create the CertificateRequest object. - type: object - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set certificate will be issued without CDP. Values are strings. - type: array - items: - type: string - vault: - description: Vault configures this issuer to sign certificates using a HashiCorp Vault PKI backend. - type: object - required: - - auth - - path - - server - properties: - auth: - description: Auth configures how cert-manager authenticates with the Vault server. - type: object - properties: - appRole: - description: AppRole authenticates with Vault using the App Role auth mechanism, with the role and secret stored in a Kubernetes Secret resource. - type: object - required: - - path - - roleId - - secretRef - properties: - path: - description: 'Path where the App Role authentication backend is mounted in Vault, e.g: "approle"' - type: string - roleId: - description: RoleID configured in the App Role authentication backend when setting up the authentication backend in Vault. - type: string - secretRef: - description: Reference to a key in a Secret that contains the App Role secret used to authenticate with Vault. The `key` field must be specified and denotes which entry within the Secret resource is used as the app role secret. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - kubernetes: - description: Kubernetes authenticates with Vault by passing the ServiceAccount token stored in the named Secret resource to the Vault server. - type: object - required: - - role - - secretRef - properties: - mountPath: - description: The Vault mountPath here is the mount path to use when authenticating with Vault. For example, setting a value to `/v1/auth/foo`, will use the path `/v1/auth/foo/login` to authenticate with Vault. If unspecified, the default value "/v1/auth/kubernetes" will be used. - type: string - role: - description: A required field containing the Vault Role to assume. A Role binds a Kubernetes ServiceAccount with a set of Vault policies. - type: string - secretRef: - description: The required Secret field containing a Kubernetes ServiceAccount JWT used for authenticating with Vault. Use of 'ambient credentials' is not supported. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - tokenSecretRef: - description: TokenSecretRef authenticates with Vault by presenting a token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - caBundle: - description: PEM-encoded CA bundle (base64-encoded) used to validate Vault server certificate. Only used if the Server URL is using HTTPS protocol. This parameter is ignored for plain HTTP protocol connection. If not set the system root certificates are used to validate the TLS connection. - type: string - format: byte - namespace: - description: 'Name of the vault namespace. Namespaces is a set of features within Vault Enterprise that allows Vault environments to support Secure Multi-tenancy. e.g: "ns1" More about namespaces can be found here https://www.vaultproject.io/docs/enterprise/namespaces' - type: string - path: - description: 'Path is the mount path of the Vault PKI backend''s `sign` endpoint, e.g: "my_pki_mount/sign/my-role-name".' - type: string - server: - description: 'Server is the connection address for the Vault server, e.g: "https://vault.example.com:8200".' - type: string - venafi: - description: Venafi configures this issuer to sign certificates using a Venafi TPP or Venafi Cloud policy zone. - type: object - required: - - zone - properties: - cloud: - description: Cloud specifies the Venafi cloud configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - apiTokenSecretRef - properties: - apiTokenSecretRef: - description: APITokenSecretRef is a secret key selector for the Venafi Cloud API token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: URL is the base URL for Venafi Cloud. Defaults to "https://api.venafi.cloud/v1". - type: string - tpp: - description: TPP specifies Trust Protection Platform configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - credentialsRef - - url - properties: - caBundle: - description: CABundle is a PEM encoded TLS certificate to use to verify connections to the TPP instance. If specified, system roots will not be used and the issuing CA for the TPP instance must be verifiable using the provided root. If not specified, the connection will be verified using the cert-manager system root certificates. - type: string - format: byte - credentialsRef: - description: CredentialsRef is a reference to a Secret containing the username and password for the TPP server. The secret must contain two keys, 'username' and 'password'. - type: object - required: - - name - properties: - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: 'URL is the base URL for the vedsdk endpoint of the Venafi TPP instance, for example: "https://tpp.example.com/vedsdk".' - type: string - zone: - description: Zone is the Venafi Policy Zone to use for this issuer. All requests made to the Venafi platform will be restricted by the named zone policy. This field is required. - type: string - status: - description: Status of the ClusterIssuer. This is set and managed automatically. - type: object - properties: - acme: - description: ACME specific status options. This field should only be set if the Issuer is configured to use an ACME server to issue certificates. - type: object - properties: - lastRegisteredEmail: - description: LastRegisteredEmail is the email associated with the latest registered ACME account, in order to track changes made to registered account associated with the Issuer - type: string - uri: - description: URI is the unique account identifier, which can also be used to retrieve account details from the CA - type: string - conditions: - description: List of status conditions to indicate the status of a CertificateRequest. Known condition types are `Ready`. - type: array - items: - description: IssuerCondition contains condition information for an Issuer. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - observedGeneration: - description: If set, this represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.condition[x].observedGeneration is 9, the condition is out of date with respect to the current state of the Issuer. - type: integer - format: int64 - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`). - type: string - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - served: true - storage: true ---- -# Source: cert-manager/templates/crd-templates.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: issuers.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.9.1" -spec: - group: cert-manager.io - names: - kind: Issuer - listKind: IssuerList - plural: issuers - singular: issuer - categories: - - cert-manager - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: An Issuer represents a certificate issuing authority which can be referenced as part of `issuerRef` fields. It is scoped to a single namespace and can therefore only be referenced by resources within the same namespace. - type: object - required: - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Desired state of the Issuer resource. - type: object - properties: - acme: - description: ACME configures this issuer to communicate with a RFC8555 (ACME) server to obtain signed x509 certificates. - type: object - required: - - privateKeySecretRef - - server - properties: - disableAccountKeyGeneration: - description: Enables or disables generating a new ACME account key. If true, the Issuer resource will *not* request a new account but will expect the account key to be supplied via an existing secret. If false, the cert-manager system will generate a new ACME account key for the Issuer. Defaults to false. - type: boolean - email: - description: Email is the email address to be associated with the ACME account. This field is optional, but it is strongly recommended to be set. It will be used to contact you in case of issues with your account or certificates, including expiry notification emails. This field may be updated after the account is initially registered. - type: string - enableDurationFeature: - description: Enables requesting a Not After date on certificates that matches the duration of the certificate. This is not supported by all ACME servers like Let's Encrypt. If set to true when the ACME server does not support it it will create an error on the Order. Defaults to false. - type: boolean - externalAccountBinding: - description: ExternalAccountBinding is a reference to a CA external account of the ACME server. If set, upon registration cert-manager will attempt to associate the given external account credentials with the registered ACME account. - type: object - required: - - keyID - - keySecretRef - properties: - keyAlgorithm: - description: 'Deprecated: keyAlgorithm field exists for historical compatibility reasons and should not be used. The algorithm is now hardcoded to HS256 in golang/x/crypto/acme.' - type: string - enum: - - HS256 - - HS384 - - HS512 - keyID: - description: keyID is the ID of the CA key that the External Account is bound to. - type: string - keySecretRef: - description: keySecretRef is a Secret Key Selector referencing a data item in a Kubernetes Secret which holds the symmetric MAC key of the External Account Binding. The `key` is the index string that is paired with the key data in the Secret and should not be confused with the key data itself, or indeed with the External Account Binding keyID above. The secret key stored in the Secret **must** be un-padded, base64 URL encoded data. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - preferredChain: - description: 'PreferredChain is the chain to use if the ACME server outputs multiple. PreferredChain is no guarantee that this one gets delivered by the ACME endpoint. For example, for Let''s Encrypt''s DST crosssign you would use: "DST Root CA X3" or "ISRG Root X1" for the newer Let''s Encrypt root CA. This value picks the first certificate bundle in the ACME alternative chains that has a certificate with this value as its issuer''s CN' - type: string - maxLength: 64 - privateKeySecretRef: - description: PrivateKey is the name of a Kubernetes Secret resource that will be used to store the automatically generated ACME account private key. Optionally, a `key` may be specified to select a specific entry within the named Secret resource. If `key` is not specified, a default of `tls.key` will be used. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - server: - description: 'Server is the URL used to access the ACME server''s ''directory'' endpoint. For example, for Let''s Encrypt''s staging endpoint, you would use: "https://acme-staging-v02.api.letsencrypt.org/directory". Only ACME v2 endpoints (i.e. RFC 8555) are supported.' - type: string - skipTLSVerify: - description: Enables or disables validation of the ACME server TLS certificate. If true, requests to the ACME server will not have their TLS certificate validated (i.e. insecure connections will be allowed). Only enable this option in development environments. The cert-manager system installed roots will be used to verify connections to the ACME server if this is false. Defaults to false. - type: boolean - solvers: - description: 'Solvers is a list of challenge solvers that will be used to solve ACME challenges for the matching domains. Solver configurations must be provided in order to obtain certificates from an ACME server. For more information, see: https://cert-manager.io/docs/configuration/acme/' - type: array - items: - description: An ACMEChallengeSolver describes how to solve ACME challenges for the issuer it is part of. A selector may be provided to use different solving strategies for different DNS names. Only one of HTTP01 or DNS01 must be provided. - type: object - properties: - dns01: - description: Configures cert-manager to attempt to complete authorizations by performing the DNS01 challenge flow. - type: object - properties: - acmeDNS: - description: Use the 'ACME DNS' (https://github.com/joohoi/acme-dns) API to manage DNS01 challenge records. - type: object - required: - - accountSecretRef - - host - properties: - accountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - host: - type: string - akamai: - description: Use the Akamai DNS zone management API to manage DNS01 challenge records. - type: object - required: - - accessTokenSecretRef - - clientSecretSecretRef - - clientTokenSecretRef - - serviceConsumerDomain - properties: - accessTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientSecretSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - clientTokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - serviceConsumerDomain: - type: string - azureDNS: - description: Use the Microsoft Azure DNS API to manage DNS01 challenge records. - type: object - required: - - resourceGroupName - - subscriptionID - properties: - clientID: - description: if both this and ClientSecret are left unset MSI will be used - type: string - clientSecretSecretRef: - description: if both this and ClientID are left unset MSI will be used - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - environment: - description: name of the Azure environment (default AzurePublicCloud) - type: string - enum: - - AzurePublicCloud - - AzureChinaCloud - - AzureGermanCloud - - AzureUSGovernmentCloud - hostedZoneName: - description: name of the DNS zone that should be used - type: string - managedIdentity: - description: managed identity configuration, can not be used at the same time as clientID, clientSecretSecretRef or tenantID - type: object - properties: - clientID: - description: client ID of the managed identity, can not be used at the same time as resourceID - type: string - resourceID: - description: resource ID of the managed identity, can not be used at the same time as clientID - type: string - resourceGroupName: - description: resource group the DNS zone is located in - type: string - subscriptionID: - description: ID of the Azure subscription - type: string - tenantID: - description: when specifying ClientID and ClientSecret then this field is also needed - type: string - cloudDNS: - description: Use the Google Cloud DNS API to manage DNS01 challenge records. - type: object - required: - - project - properties: - hostedZoneName: - description: HostedZoneName is an optional field that tells cert-manager in which Cloud DNS zone the challenge record has to be created. If left empty cert-manager will automatically choose a zone. - type: string - project: - type: string - serviceAccountSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - cloudflare: - description: Use the Cloudflare API to manage DNS01 challenge records. - type: object - properties: - apiKeySecretRef: - description: 'API key to use to authenticate with Cloudflare. Note: using an API token to authenticate is now the recommended method as it allows greater control of permissions.' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - apiTokenSecretRef: - description: API token used to authenticate with Cloudflare. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - email: - description: Email of the account, only required when using API key based authentication. - type: string - cnameStrategy: - description: CNAMEStrategy configures how the DNS01 provider should handle CNAME records when found in DNS zones. - type: string - enum: - - None - - Follow - digitalocean: - description: Use the DigitalOcean DNS API to manage DNS01 challenge records. - type: object - required: - - tokenSecretRef - properties: - tokenSecretRef: - description: A reference to a specific 'key' within a Secret resource. In some instances, `key` is a required field. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - rfc2136: - description: Use RFC2136 ("Dynamic Updates in the Domain Name System") (https://datatracker.ietf.org/doc/rfc2136/) to manage DNS01 challenge records. - type: object - required: - - nameserver - properties: - nameserver: - description: The IP address or hostname of an authoritative DNS server supporting RFC2136 in the form host:port. If the host is an IPv6 address it must be enclosed in square brackets (e.g [2001:db8::1]) ; port is optional. This field is required. - type: string - tsigAlgorithm: - description: 'The TSIG Algorithm configured in the DNS supporting RFC2136. Used only when ``tsigSecretSecretRef`` and ``tsigKeyName`` are defined. Supported values are (case-insensitive): ``HMACMD5`` (default), ``HMACSHA1``, ``HMACSHA256`` or ``HMACSHA512``.' - type: string - tsigKeyName: - description: The TSIG Key name configured in the DNS. If ``tsigSecretSecretRef`` is defined, this field is required. - type: string - tsigSecretSecretRef: - description: The name of the secret containing the TSIG value. If ``tsigKeyName`` is defined, this field is required. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - route53: - description: Use the AWS Route53 API to manage DNS01 challenge records. - type: object - required: - - region - properties: - accessKeyID: - description: 'The AccessKeyID is used for authentication. Cannot be set when SecretAccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: string - accessKeyIDSecretRef: - description: 'The SecretAccessKey is used for authentication. If set, pull the AWS access key ID from a key within a Kubernetes Secret. Cannot be set when AccessKeyID is set. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - hostedZoneID: - description: If set, the provider will manage only this zone in Route53 and will not do an lookup using the route53:ListHostedZonesByName api call. - type: string - region: - description: Always set the region when using AccessKeyID and SecretAccessKey - type: string - role: - description: Role is a Role ARN which the Route53 provider will assume using either the explicit credentials AccessKeyID/SecretAccessKey or the inferred credentials from environment variables, shared credentials file or AWS Instance metadata - type: string - secretAccessKeySecretRef: - description: 'The SecretAccessKey is used for authentication. If neither the Access Key nor Key ID are set, we fall-back to using env vars, shared credentials file or AWS Instance metadata, see: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials' - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - webhook: - description: Configure an external webhook based DNS01 challenge solver to manage DNS01 challenge records. - type: object - required: - - groupName - - solverName - properties: - config: - description: Additional configuration that should be passed to the webhook apiserver when challenges are processed. This can contain arbitrary JSON data. Secret values should not be specified in this stanza. If secret values are needed (e.g. credentials for a DNS service), you should use a SecretKeySelector to reference a Secret resource. For details on the schema of this field, consult the webhook provider implementation's documentation. - x-kubernetes-preserve-unknown-fields: true - groupName: - description: The API group name that should be used when POSTing ChallengePayload resources to the webhook apiserver. This should be the same as the GroupName specified in the webhook provider implementation. - type: string - solverName: - description: The name of the solver to use, as defined in the webhook provider implementation. This will typically be the name of the provider, e.g. 'cloudflare'. - type: string - http01: - description: Configures cert-manager to attempt to complete authorizations by performing the HTTP01 challenge flow. It is not possible to obtain certificates for wildcard domain names (e.g. `*.example.com`) using the HTTP01 challenge mechanism. - type: object - properties: - gatewayHTTPRoute: - description: The Gateway API is a sig-network community API that models service networking in Kubernetes (https://gateway-api.sigs.k8s.io/). The Gateway solver will create HTTPRoutes with the specified labels in the same namespace as the challenge. This solver is experimental, and fields / behaviour may change in the future. - type: object - properties: - labels: - description: Custom labels that will be applied to HTTPRoutes created by cert-manager while solving HTTP-01 challenges. - type: object - additionalProperties: - type: string - parentRefs: - description: 'When solving an HTTP-01 challenge, cert-manager creates an HTTPRoute. cert-manager needs to know which parentRefs should be used when creating the HTTPRoute. Usually, the parentRef references a Gateway. See: https://gateway-api.sigs.k8s.io/v1alpha2/api-types/httproute/#attaching-to-gateways' - type: array - items: - description: "ParentRef identifies an API object (usually a Gateway) that can be considered a parent of this resource (usually a route). The only kind of parent resource with \"Core\" support is Gateway. This API may be extended in the future to support additional kinds of parent resources, such as HTTPRoute. \n The API object must be valid in the cluster; the Group and Kind must be registered in the cluster for this reference to be valid. \n References to objects with invalid Group and Kind are not valid, and must be rejected by the implementation, with appropriate Conditions set on the containing object." - type: object - required: - - name - properties: - group: - description: "Group is the group of the referent. \n Support: Core" - type: string - default: gateway.networking.k8s.io - maxLength: 253 - pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - kind: - description: "Kind is kind of the referent. \n Support: Core (Gateway) Support: Custom (Other Resources)" - type: string - default: Gateway - maxLength: 63 - minLength: 1 - pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$ - name: - description: "Name is the name of the referent. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - namespace: - description: "Namespace is the namespace of the referent. When unspecified (or empty string), this refers to the local namespace of the Route. \n Support: Core" - type: string - maxLength: 63 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - sectionName: - description: "SectionName is the name of a section within the target resource. In the following resources, SectionName is interpreted as the following: \n * Gateway: Listener Name \n Implementations MAY choose to support attaching Routes to other resources. If that is the case, they MUST clearly document how SectionName is interpreted. \n When unspecified (empty string), this will reference the entire resource. For the purpose of status, an attachment is considered successful if at least one section in the parent resource accepts it. For example, Gateway listeners can restrict which Routes can attach to them by Route kind, namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from the referencing Route, the Route MUST be considered successfully attached. If no Gateway listeners accept attachment from this Route, the Route MUST be considered detached from the Gateway. \n Support: Core" - type: string - maxLength: 253 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$ - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - ingress: - description: The ingress based HTTP01 challenge solver will solve challenges by creating or modifying Ingress resources in order to route requests for '/.well-known/acme-challenge/XYZ' to 'challenge solver' pods that are provisioned by cert-manager for each Challenge to be completed. - type: object - properties: - class: - description: The ingress class to use when creating Ingress resources to solve ACME challenges that use this challenge solver. Only one of 'class' or 'name' may be specified. - type: string - ingressTemplate: - description: Optional ingress template used to configure the ACME challenge solver ingress used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the ingress used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver ingress. - type: object - additionalProperties: - type: string - name: - description: The name of the ingress resource that should have ACME challenge solving routes inserted into it in order to solve HTTP01 challenges. This is typically used in conjunction with ingress controllers like ingress-gce, which maintains a 1:1 mapping between external IPs and ingress resources. - type: string - podTemplate: - description: Optional pod template used to configure the ACME challenge solver pods used for HTTP01 challenges. - type: object - properties: - metadata: - description: ObjectMeta overrides for the pod used to solve HTTP01 challenges. Only the 'labels' and 'annotations' fields may be set. If labels or annotations overlap with in-built values, the values here will override the in-built values. - type: object - properties: - annotations: - description: Annotations that should be added to the create ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - labels: - description: Labels that should be added to the created ACME HTTP01 solver pods. - type: object - additionalProperties: - type: string - spec: - description: PodSpec defines overrides for the HTTP01 challenge solver pod. Only the 'priorityClassName', 'nodeSelector', 'affinity', 'serviceAccountName' and 'tolerations' fields are supported currently. All other fields will be ignored. - type: object - properties: - affinity: - description: If specified, the pod's scheduling constraints - type: object - properties: - nodeAffinity: - description: Describes node affinity scheduling rules for the pod. - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. - type: array - items: - description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). - type: object - required: - - preference - - weight - properties: - preference: - description: A node selector term, associated with the corresponding weight. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - weight: - description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. - type: object - required: - - nodeSelectorTerms - properties: - nodeSelectorTerms: - description: Required. A list of node selector terms. The terms are ORed. - type: array - items: - description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. - type: object - properties: - matchExpressions: - description: A list of node selector requirements by node's labels. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchFields: - description: A list of node selector requirements by node's fields. - type: array - items: - description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: The label key that the selector applies to. - type: string - operator: - description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. - type: string - values: - description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. - type: array - items: - type: string - podAffinity: - description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - podAntiAffinity: - description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). - type: object - properties: - preferredDuringSchedulingIgnoredDuringExecution: - description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. - type: array - items: - description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) - type: object - required: - - podAffinityTerm - - weight - properties: - podAffinityTerm: - description: Required. A pod affinity term, associated with the corresponding weight. - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - weight: - description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. - type: integer - format: int32 - requiredDuringSchedulingIgnoredDuringExecution: - description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. - type: array - items: - description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running - type: object - required: - - topologyKey - properties: - labelSelector: - description: A label query over a set of resources, in this case pods. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaceSelector: - description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces. - type: object - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - type: array - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - type: object - required: - - key - - operator - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - type: array - items: - type: string - matchLabels: - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - additionalProperties: - type: string - namespaces: - description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace". - type: array - items: - type: string - topologyKey: - description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. - type: string - nodeSelector: - description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' - type: object - additionalProperties: - type: string - priorityClassName: - description: If specified, the pod's priorityClassName. - type: string - serviceAccountName: - description: If specified, the pod's service account - type: string - tolerations: - description: If specified, the pod's tolerations. - type: array - items: - description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . - type: object - properties: - effect: - description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. - type: string - operator: - description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. - type: string - tolerationSeconds: - description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. - type: integer - format: int64 - value: - description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. - type: string - serviceType: - description: Optional service type for Kubernetes solver service. Supported values are NodePort or ClusterIP. If unset, defaults to NodePort. - type: string - selector: - description: Selector selects a set of DNSNames on the Certificate resource that should be solved using this challenge solver. If not specified, the solver will be treated as the 'default' solver with the lowest priority, i.e. if any other solver has a more specific match, it will be used instead. - type: object - properties: - dnsNames: - description: List of DNSNames that this solver will be used to solve. If specified and a match is found, a dnsNames selector will take precedence over a dnsZones selector. If multiple solvers match with the same dnsNames value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - dnsZones: - description: List of DNSZones that this solver will be used to solve. The most specific DNS zone match specified here will take precedence over other DNS zone matches, so a solver specifying sys.example.com will be selected over one specifying example.com for the domain www.sys.example.com. If multiple solvers match with the same dnsZones value, the solver with the most matching labels in matchLabels will be selected. If neither has more matches, the solver defined earlier in the list will be selected. - type: array - items: - type: string - matchLabels: - description: A label selector that is used to refine the set of certificate's that this challenge solver will apply to. - type: object - additionalProperties: - type: string - ca: - description: CA configures this issuer to sign certificates using a signing CA keypair stored in a Secret resource. This is used to build internal PKIs that are managed by cert-manager. - type: object - required: - - secretName - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set, certificates will be issued without distribution points set. - type: array - items: - type: string - ocspServers: - description: The OCSP server list is an X.509 v3 extension that defines a list of URLs of OCSP responders. The OCSP responders can be queried for the revocation status of an issued certificate. If not set, the certificate will be issued with no OCSP servers set. For example, an OCSP server URL could be "http://ocsp.int-x3.letsencrypt.org". - type: array - items: - type: string - secretName: - description: SecretName is the name of the secret used to sign Certificates issued by this Issuer. - type: string - selfSigned: - description: SelfSigned configures this issuer to 'self sign' certificates using the private key used to create the CertificateRequest object. - type: object - properties: - crlDistributionPoints: - description: The CRL distribution points is an X.509 v3 certificate extension which identifies the location of the CRL from which the revocation of this certificate can be checked. If not set certificate will be issued without CDP. Values are strings. - type: array - items: - type: string - vault: - description: Vault configures this issuer to sign certificates using a HashiCorp Vault PKI backend. - type: object - required: - - auth - - path - - server - properties: - auth: - description: Auth configures how cert-manager authenticates with the Vault server. - type: object - properties: - appRole: - description: AppRole authenticates with Vault using the App Role auth mechanism, with the role and secret stored in a Kubernetes Secret resource. - type: object - required: - - path - - roleId - - secretRef - properties: - path: - description: 'Path where the App Role authentication backend is mounted in Vault, e.g: "approle"' - type: string - roleId: - description: RoleID configured in the App Role authentication backend when setting up the authentication backend in Vault. - type: string - secretRef: - description: Reference to a key in a Secret that contains the App Role secret used to authenticate with Vault. The `key` field must be specified and denotes which entry within the Secret resource is used as the app role secret. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - kubernetes: - description: Kubernetes authenticates with Vault by passing the ServiceAccount token stored in the named Secret resource to the Vault server. - type: object - required: - - role - - secretRef - properties: - mountPath: - description: The Vault mountPath here is the mount path to use when authenticating with Vault. For example, setting a value to `/v1/auth/foo`, will use the path `/v1/auth/foo/login` to authenticate with Vault. If unspecified, the default value "/v1/auth/kubernetes" will be used. - type: string - role: - description: A required field containing the Vault Role to assume. A Role binds a Kubernetes ServiceAccount with a set of Vault policies. - type: string - secretRef: - description: The required Secret field containing a Kubernetes ServiceAccount JWT used for authenticating with Vault. Use of 'ambient credentials' is not supported. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - tokenSecretRef: - description: TokenSecretRef authenticates with Vault by presenting a token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - caBundle: - description: PEM-encoded CA bundle (base64-encoded) used to validate Vault server certificate. Only used if the Server URL is using HTTPS protocol. This parameter is ignored for plain HTTP protocol connection. If not set the system root certificates are used to validate the TLS connection. - type: string - format: byte - namespace: - description: 'Name of the vault namespace. Namespaces is a set of features within Vault Enterprise that allows Vault environments to support Secure Multi-tenancy. e.g: "ns1" More about namespaces can be found here https://www.vaultproject.io/docs/enterprise/namespaces' - type: string - path: - description: 'Path is the mount path of the Vault PKI backend''s `sign` endpoint, e.g: "my_pki_mount/sign/my-role-name".' - type: string - server: - description: 'Server is the connection address for the Vault server, e.g: "https://vault.example.com:8200".' - type: string - venafi: - description: Venafi configures this issuer to sign certificates using a Venafi TPP or Venafi Cloud policy zone. - type: object - required: - - zone - properties: - cloud: - description: Cloud specifies the Venafi cloud configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - apiTokenSecretRef - properties: - apiTokenSecretRef: - description: APITokenSecretRef is a secret key selector for the Venafi Cloud API token. - type: object - required: - - name - properties: - key: - description: The key of the entry in the Secret resource's `data` field to be used. Some instances of this field may be defaulted, in others it may be required. - type: string - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: URL is the base URL for Venafi Cloud. Defaults to "https://api.venafi.cloud/v1". - type: string - tpp: - description: TPP specifies Trust Protection Platform configuration settings. Only one of TPP or Cloud may be specified. - type: object - required: - - credentialsRef - - url - properties: - caBundle: - description: CABundle is a PEM encoded TLS certificate to use to verify connections to the TPP instance. If specified, system roots will not be used and the issuing CA for the TPP instance must be verifiable using the provided root. If not specified, the connection will be verified using the cert-manager system root certificates. - type: string - format: byte - credentialsRef: - description: CredentialsRef is a reference to a Secret containing the username and password for the TPP server. The secret must contain two keys, 'username' and 'password'. - type: object - required: - - name - properties: - name: - description: 'Name of the resource being referred to. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - url: - description: 'URL is the base URL for the vedsdk endpoint of the Venafi TPP instance, for example: "https://tpp.example.com/vedsdk".' - type: string - zone: - description: Zone is the Venafi Policy Zone to use for this issuer. All requests made to the Venafi platform will be restricted by the named zone policy. This field is required. - type: string - status: - description: Status of the Issuer. This is set and managed automatically. - type: object - properties: - acme: - description: ACME specific status options. This field should only be set if the Issuer is configured to use an ACME server to issue certificates. - type: object - properties: - lastRegisteredEmail: - description: LastRegisteredEmail is the email associated with the latest registered ACME account, in order to track changes made to registered account associated with the Issuer - type: string - uri: - description: URI is the unique account identifier, which can also be used to retrieve account details from the CA - type: string - conditions: - description: List of status conditions to indicate the status of a CertificateRequest. Known condition types are `Ready`. - type: array - items: - description: IssuerCondition contains condition information for an Issuer. - type: object - required: - - status - - type - properties: - lastTransitionTime: - description: LastTransitionTime is the timestamp corresponding to the last status change of this condition. - type: string - format: date-time - message: - description: Message is a human readable description of the details of the last transition, complementing reason. - type: string - observedGeneration: - description: If set, this represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.condition[x].observedGeneration is 9, the condition is out of date with respect to the current state of the Issuer. - type: integer - format: int64 - reason: - description: Reason is a brief machine readable explanation for the condition's last transition. - type: string - status: - description: Status of the condition, one of (`True`, `False`, `Unknown`). - type: string - enum: - - "True" - - "False" - - Unknown - type: - description: Type of the condition, known values are (`Ready`). - type: string - x-kubernetes-list-map-keys: - - type - x-kubernetes-list-type: map - served: true - storage: true ---- -# Source: cert-manager/templates/crd-templates.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: orders.acme.cert-manager.io - labels: - app: 'cert-manager' - app.kubernetes.io/name: 'cert-manager' - app.kubernetes.io/instance: 'cert-manager' - # Generated labels - app.kubernetes.io/version: "v1.9.1" -spec: - group: acme.cert-manager.io - names: - kind: Order - listKind: OrderList - plural: orders - singular: order - categories: - - cert-manager - - cert-manager-acme - scope: Namespaced - versions: - - name: v1 - subresources: - status: {} - additionalPrinterColumns: - - jsonPath: .status.state - name: State - type: string - - jsonPath: .spec.issuerRef.name - name: Issuer - priority: 1 - type: string - - jsonPath: .status.reason - name: Reason - priority: 1 - type: string - - jsonPath: .metadata.creationTimestamp - description: CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC. - name: Age - type: date - schema: - openAPIV3Schema: - description: Order is a type to represent an Order with an ACME server - type: object - required: - - metadata - - spec - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - type: object - required: - - issuerRef - - request - properties: - commonName: - description: CommonName is the common name as specified on the DER encoded CSR. If specified, this value must also be present in `dnsNames` or `ipAddresses`. This field must match the corresponding field on the DER encoded CSR. - type: string - dnsNames: - description: DNSNames is a list of DNS names that should be included as part of the Order validation process. This field must match the corresponding field on the DER encoded CSR. - type: array - items: - type: string - duration: - description: Duration is the duration for the not after date for the requested certificate. this is set on order creation as pe the ACME spec. - type: string - ipAddresses: - description: IPAddresses is a list of IP addresses that should be included as part of the Order validation process. This field must match the corresponding field on the DER encoded CSR. - type: array - items: - type: string - issuerRef: - description: IssuerRef references a properly configured ACME-type Issuer which should be used to create this Order. If the Issuer does not exist, processing will be retried. If the Issuer is not an 'ACME' Issuer, an error will be returned and the Order will be marked as failed. - type: object - required: - - name - properties: - group: - description: Group of the resource being referred to. - type: string - kind: - description: Kind of the resource being referred to. - type: string - name: - description: Name of the resource being referred to. - type: string - request: - description: Certificate signing request bytes in DER encoding. This will be used when finalizing the order. This field must be set on the order. - type: string - format: byte - status: - type: object - properties: - authorizations: - description: Authorizations contains data returned from the ACME server on what authorizations must be completed in order to validate the DNS names specified on the Order. - type: array - items: - description: ACMEAuthorization contains data returned from the ACME server on an authorization that must be completed in order validate a DNS name on an ACME Order resource. - type: object - required: - - url - properties: - challenges: - description: Challenges specifies the challenge types offered by the ACME server. One of these challenge types will be selected when validating the DNS name and an appropriate Challenge resource will be created to perform the ACME challenge process. - type: array - items: - description: Challenge specifies a challenge offered by the ACME server for an Order. An appropriate Challenge resource can be created to perform the ACME challenge process. - type: object - required: - - token - - type - - url - properties: - token: - description: Token is the token that must be presented for this challenge. This is used to compute the 'key' that must also be presented. - type: string - type: - description: Type is the type of challenge being offered, e.g. 'http-01', 'dns-01', 'tls-sni-01', etc. This is the raw value retrieved from the ACME server. Only 'http-01' and 'dns-01' are supported by cert-manager, other values will be ignored. - type: string - url: - description: URL is the URL of this challenge. It can be used to retrieve additional metadata about the Challenge from the ACME server. - type: string - identifier: - description: Identifier is the DNS name to be validated as part of this authorization - type: string - initialState: - description: InitialState is the initial state of the ACME authorization when first fetched from the ACME server. If an Authorization is already 'valid', the Order controller will not create a Challenge resource for the authorization. This will occur when working with an ACME server that enables 'authz reuse' (such as Let's Encrypt's production endpoint). If not set and 'identifier' is set, the state is assumed to be pending and a Challenge will be created. - type: string - enum: - - valid - - ready - - pending - - processing - - invalid - - expired - - errored - url: - description: URL is the URL of the Authorization that must be completed - type: string - wildcard: - description: Wildcard will be true if this authorization is for a wildcard DNS name. If this is true, the identifier will be the *non-wildcard* version of the DNS name. For example, if '*.example.com' is the DNS name being validated, this field will be 'true' and the 'identifier' field will be 'example.com'. - type: boolean - certificate: - description: Certificate is a copy of the PEM encoded certificate for this Order. This field will be populated after the order has been successfully finalized with the ACME server, and the order has transitioned to the 'valid' state. - type: string - format: byte - failureTime: - description: FailureTime stores the time that this order failed. This is used to influence garbage collection and back-off. - type: string - format: date-time - finalizeURL: - description: FinalizeURL of the Order. This is used to obtain certificates for this order once it has been completed. - type: string - reason: - description: Reason optionally provides more information about a why the order is in the current state. - type: string - state: - description: State contains the current state of this Order resource. States 'success' and 'expired' are 'final' - type: string - enum: - - valid - - ready - - pending - - processing - - invalid - - expired - - errored - url: - description: URL of the Order. This will initially be empty when the resource is first created. The Order controller will populate this field when the Order is first processed. This field will be immutable after it is initially set. - type: string - served: true - storage: true ---- -# Source: cert-manager/templates/cainjector-serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: true -metadata: - name: cert-manager-cainjector - namespace: cert-manager - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.9.1" ---- -# Source: cert-manager/templates/serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: true -metadata: - name: cert-manager - namespace: cert-manager - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" ---- -# Source: cert-manager/templates/webhook-serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -automountServiceAccountToken: true -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.9.1" ---- -# Source: cert-manager/templates/webhook-config.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" -data: ---- -# Source: cert-manager/templates/cainjector-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-cainjector - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.9.1" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["certificates"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["events"] - verbs: ["get", "create", "update", "patch"] - - apiGroups: ["admissionregistration.k8s.io"] - resources: ["validatingwebhookconfigurations", "mutatingwebhookconfigurations"] - verbs: ["get", "list", "watch", "update"] - - apiGroups: ["apiregistration.k8s.io"] - resources: ["apiservices"] - verbs: ["get", "list", "watch", "update"] - - apiGroups: ["apiextensions.k8s.io"] - resources: ["customresourcedefinitions"] - verbs: ["get", "list", "watch", "update"] ---- -# Source: cert-manager/templates/rbac.yaml -# Issuer controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-issuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["issuers", "issuers/status"] - verbs: ["update", "patch"] - - apiGroups: ["cert-manager.io"] - resources: ["issuers"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch", "create", "update", "delete"] - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] ---- -# Source: cert-manager/templates/rbac.yaml -# ClusterIssuer controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-clusterissuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["clusterissuers", "clusterissuers/status"] - verbs: ["update", "patch"] - - apiGroups: ["cert-manager.io"] - resources: ["clusterissuers"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch", "create", "update", "delete"] - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] ---- -# Source: cert-manager/templates/rbac.yaml -# Certificates controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-certificates - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificates/status", "certificaterequests", "certificaterequests/status"] - verbs: ["update", "patch"] - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificaterequests", "clusterissuers", "issuers"] - verbs: ["get", "list", "watch"] - # We require these rules to support users with the OwnerReferencesPermissionEnforcement - # admission controller enabled: - # https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement - - apiGroups: ["cert-manager.io"] - resources: ["certificates/finalizers", "certificaterequests/finalizers"] - verbs: ["update"] - - apiGroups: ["acme.cert-manager.io"] - resources: ["orders"] - verbs: ["create", "delete", "get", "list", "watch"] - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch", "create", "update", "delete", "patch"] - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] ---- -# Source: cert-manager/templates/rbac.yaml -# Orders controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-orders - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -rules: - - apiGroups: ["acme.cert-manager.io"] - resources: ["orders", "orders/status"] - verbs: ["update", "patch"] - - apiGroups: ["acme.cert-manager.io"] - resources: ["orders", "challenges"] - verbs: ["get", "list", "watch"] - - apiGroups: ["cert-manager.io"] - resources: ["clusterissuers", "issuers"] - verbs: ["get", "list", "watch"] - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges"] - verbs: ["create", "delete"] - # We require these rules to support users with the OwnerReferencesPermissionEnforcement - # admission controller enabled: - # https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement - - apiGroups: ["acme.cert-manager.io"] - resources: ["orders/finalizers"] - verbs: ["update"] - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] ---- -# Source: cert-manager/templates/rbac.yaml -# Challenges controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-challenges - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -rules: - # Use to update challenge resource status - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges", "challenges/status"] - verbs: ["update", "patch"] - # Used to watch challenge resources - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges"] - verbs: ["get", "list", "watch"] - # Used to watch challenges, issuer and clusterissuer resources - - apiGroups: ["cert-manager.io"] - resources: ["issuers", "clusterissuers"] - verbs: ["get", "list", "watch"] - # Need to be able to retrieve ACME account private key to complete challenges - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch"] - # Used to create events - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] - # HTTP01 rules - - apiGroups: [""] - resources: ["pods", "services"] - verbs: ["get", "list", "watch", "create", "delete"] - - apiGroups: ["networking.k8s.io"] - resources: ["ingresses"] - verbs: ["get", "list", "watch", "create", "delete", "update"] - - apiGroups: [ "gateway.networking.k8s.io" ] - resources: [ "httproutes" ] - verbs: ["get", "list", "watch", "create", "delete", "update"] - # We require the ability to specify a custom hostname when we are creating - # new ingress resources. - # See: https://github.com/openshift/origin/blob/21f191775636f9acadb44fa42beeb4f75b255532/pkg/route/apiserver/admission/ingress_admission.go#L84-L148 - - apiGroups: ["route.openshift.io"] - resources: ["routes/custom-host"] - verbs: ["create"] - # We require these rules to support users with the OwnerReferencesPermissionEnforcement - # admission controller enabled: - # https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges/finalizers"] - verbs: ["update"] - # DNS01 rules (duplicated above) - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "watch"] ---- -# Source: cert-manager/templates/rbac.yaml -# ingress-shim controller role -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-ingress-shim - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificaterequests"] - verbs: ["create", "update", "delete"] - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificaterequests", "issuers", "clusterissuers"] - verbs: ["get", "list", "watch"] - - apiGroups: ["networking.k8s.io"] - resources: ["ingresses"] - verbs: ["get", "list", "watch"] - # We require these rules to support users with the OwnerReferencesPermissionEnforcement - # admission controller enabled: - # https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement - - apiGroups: ["networking.k8s.io"] - resources: ["ingresses/finalizers"] - verbs: ["update"] - - apiGroups: ["gateway.networking.k8s.io"] - resources: ["gateways", "httproutes"] - verbs: ["get", "list", "watch"] - - apiGroups: ["gateway.networking.k8s.io"] - resources: ["gateways/finalizers", "httproutes/finalizers"] - verbs: ["update"] - - apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch"] ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-view - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" - rbac.authorization.k8s.io/aggregate-to-view: "true" - rbac.authorization.k8s.io/aggregate-to-edit: "true" - rbac.authorization.k8s.io/aggregate-to-admin: "true" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificaterequests", "issuers"] - verbs: ["get", "list", "watch"] - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges", "orders"] - verbs: ["get", "list", "watch"] ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-edit - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" - rbac.authorization.k8s.io/aggregate-to-edit: "true" - rbac.authorization.k8s.io/aggregate-to-admin: "true" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["certificates", "certificaterequests", "issuers"] - verbs: ["create", "delete", "deletecollection", "patch", "update"] - - apiGroups: ["cert-manager.io"] - resources: ["certificates/status"] - verbs: ["update"] - - apiGroups: ["acme.cert-manager.io"] - resources: ["challenges", "orders"] - verbs: ["create", "delete", "deletecollection", "patch", "update"] ---- -# Source: cert-manager/templates/rbac.yaml -# Permission to approve CertificateRequests referencing cert-manager.io Issuers and ClusterIssuers -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-approve:cert-manager-io - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cert-manager" - app.kubernetes.io/version: "v1.9.1" -rules: - - apiGroups: ["cert-manager.io"] - resources: ["signers"] - verbs: ["approve"] - resourceNames: ["issuers.cert-manager.io/*", "clusterissuers.cert-manager.io/*"] ---- -# Source: cert-manager/templates/rbac.yaml -# Permission to: -# - Update and sign CertificatSigningeRequests referencing cert-manager.io Issuers and ClusterIssuers -# - Perform SubjectAccessReviews to test whether users are able to reference Namespaced Issuers -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-controller-certificatesigningrequests - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cert-manager" - app.kubernetes.io/version: "v1.9.1" -rules: - - apiGroups: ["certificates.k8s.io"] - resources: ["certificatesigningrequests"] - verbs: ["get", "list", "watch", "update"] - - apiGroups: ["certificates.k8s.io"] - resources: ["certificatesigningrequests/status"] - verbs: ["update", "patch"] - - apiGroups: ["certificates.k8s.io"] - resources: ["signers"] - resourceNames: ["issuers.cert-manager.io/*", "clusterissuers.cert-manager.io/*"] - verbs: ["sign"] - - apiGroups: ["authorization.k8s.io"] - resources: ["subjectaccessreviews"] - verbs: ["create"] ---- -# Source: cert-manager/templates/webhook-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cert-manager-webhook:subjectaccessreviews - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.9.1" -rules: - - apiGroups: ["authorization.k8s.io"] - resources: ["subjectaccessreviews"] - verbs: ["create"] ---- -# Source: cert-manager/templates/cainjector-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-cainjector - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-cainjector -subjects: - - name: cert-manager-cainjector - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-issuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-issuers -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-clusterissuers - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-clusterissuers -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-certificates - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-certificates -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-orders - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-orders -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-challenges - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-challenges -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-ingress-shim - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-ingress-shim -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-approve:cert-manager-io - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cert-manager" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-approve:cert-manager-io -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-controller-certificatesigningrequests - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cert-manager" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-controller-certificatesigningrequests -subjects: - - name: cert-manager - namespace: cert-manager - kind: ServiceAccount ---- -# Source: cert-manager/templates/webhook-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cert-manager-webhook:subjectaccessreviews - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cert-manager-webhook:subjectaccessreviews -subjects: - - apiGroup: "" - kind: ServiceAccount - name: cert-manager-webhook - namespace: cert-manager ---- -# Source: cert-manager/templates/cainjector-rbac.yaml -# leader election rules -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: cert-manager-cainjector:leaderelection - namespace: kube-system - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.9.1" -rules: - # Used for leader election by the controller - # cert-manager-cainjector-leader-election is used by the CertificateBased injector controller - # see cmd/cainjector/start.go#L113 - # cert-manager-cainjector-leader-election-core is used by the SecretBased injector controller - # see cmd/cainjector/start.go#L137 - - apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - resourceNames: ["cert-manager-cainjector-leader-election", "cert-manager-cainjector-leader-election-core"] - verbs: ["get", "update", "patch"] - - apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - verbs: ["create"] ---- -# Source: cert-manager/templates/rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: cert-manager:leaderelection - namespace: kube-system - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -rules: - - apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - resourceNames: ["cert-manager-controller"] - verbs: ["get", "update", "patch"] - - apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - verbs: ["create"] ---- -# Source: cert-manager/templates/webhook-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: cert-manager-webhook:dynamic-serving - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.9.1" -rules: - - apiGroups: [""] - resources: ["secrets"] - resourceNames: - - 'cert-manager-webhook-ca' - verbs: ["get", "list", "watch", "update"] - # It's not possible to grant CREATE permission on a single resourceName. - - apiGroups: [""] - resources: ["secrets"] - verbs: ["create"] ---- -# Source: cert-manager/templates/cainjector-rbac.yaml -# grant cert-manager permission to manage the leaderelection configmap in the -# leader election namespace -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: cert-manager-cainjector:leaderelection - namespace: kube-system - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: cert-manager-cainjector:leaderelection -subjects: - - kind: ServiceAccount - name: cert-manager-cainjector - namespace: cert-manager ---- -# Source: cert-manager/templates/rbac.yaml -# grant cert-manager permission to manage the leaderelection configmap in the -# leader election namespace -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: cert-manager:leaderelection - namespace: kube-system - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: cert-manager:leaderelection -subjects: - - apiGroup: "" - kind: ServiceAccount - name: cert-manager - namespace: cert-manager ---- -# Source: cert-manager/templates/webhook-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: cert-manager-webhook:dynamic-serving - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.9.1" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: cert-manager-webhook:dynamic-serving -subjects: - - apiGroup: "" - kind: ServiceAccount - name: cert-manager-webhook - namespace: cert-manager ---- -# Source: cert-manager/templates/service.yaml -apiVersion: v1 -kind: Service -metadata: - name: cert-manager - namespace: cert-manager - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -spec: - type: ClusterIP - ports: - - protocol: TCP - port: 9402 - name: tcp-prometheus-servicemonitor - targetPort: 9402 - selector: - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" ---- -# Source: cert-manager/templates/webhook-service.yaml -apiVersion: v1 -kind: Service -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.9.1" -spec: - type: ClusterIP - ports: - - name: https - port: 443 - protocol: TCP - targetPort: "https" - selector: - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" ---- -# Source: cert-manager/templates/cainjector-deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: cert-manager-cainjector - namespace: cert-manager - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.9.1" -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - template: - metadata: - labels: - app: cainjector - app.kubernetes.io/name: cainjector - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "cainjector" - app.kubernetes.io/version: "v1.9.1" - spec: - serviceAccountName: cert-manager-cainjector - securityContext: - runAsNonRoot: true - containers: - - name: cert-manager - image: "quay.io/jetstack/cert-manager-cainjector:v1.9.1" - imagePullPolicy: IfNotPresent - args: - - --v=2 - - --leader-election-namespace=kube-system - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - securityContext: - allowPrivilegeEscalation: false - nodeSelector: - kubernetes.io/os: linux ---- -# Source: cert-manager/templates/deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: cert-manager - namespace: cert-manager - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - template: - metadata: - labels: - app: cert-manager - app.kubernetes.io/name: cert-manager - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "controller" - app.kubernetes.io/version: "v1.9.1" - annotations: - prometheus.io/path: "/metrics" - prometheus.io/scrape: 'true' - prometheus.io/port: '9402' - spec: - serviceAccountName: cert-manager - securityContext: - runAsNonRoot: true - containers: - - name: cert-manager - image: "quay.io/jetstack/cert-manager-controller:v1.9.1" - imagePullPolicy: IfNotPresent - args: - - --v=2 - - --cluster-resource-namespace=$(POD_NAMESPACE) - - --leader-election-namespace=kube-system - ports: - - containerPort: 9402 - name: http-metrics - protocol: TCP - securityContext: - allowPrivilegeEscalation: false - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - nodeSelector: - kubernetes.io/os: linux ---- -# Source: cert-manager/templates/webhook-deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: cert-manager-webhook - namespace: cert-manager - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.9.1" -spec: - replicas: 1 - selector: - matchLabels: - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - template: - metadata: - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.9.1" - spec: - serviceAccountName: cert-manager-webhook - securityContext: - runAsNonRoot: true - containers: - - name: cert-manager - image: "quay.io/jetstack/cert-manager-webhook:v1.9.1" - imagePullPolicy: IfNotPresent - args: - - --v=2 - - --secure-port=10250 - - --dynamic-serving-ca-secret-namespace=$(POD_NAMESPACE) - - --dynamic-serving-ca-secret-name=cert-manager-webhook-ca - - --dynamic-serving-dns-names=cert-manager-webhook,cert-manager-webhook.cert-manager,cert-manager-webhook.cert-manager.svc - ports: - - name: https - protocol: TCP - containerPort: 10250 - livenessProbe: - httpGet: - path: /livez - port: 6080 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - readinessProbe: - httpGet: - path: /healthz - port: 6080 - scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 5 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - securityContext: - allowPrivilegeEscalation: false - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - nodeSelector: - kubernetes.io/os: linux ---- -# Source: cert-manager/templates/webhook-mutating-webhook.yaml -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - name: cert-manager-webhook - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.9.1" - annotations: - cert-manager.io/inject-ca-from-secret: "cert-manager/cert-manager-webhook-ca" -webhooks: - - name: webhook.cert-manager.io - rules: - - apiGroups: - - "cert-manager.io" - - "acme.cert-manager.io" - apiVersions: - - "v1" - operations: - - CREATE - - UPDATE - resources: - - "*/*" - admissionReviewVersions: ["v1"] - # This webhook only accepts v1 cert-manager resources. - # Equivalent matchPolicy ensures that non-v1 resource requests are sent to - # this webhook (after the resources have been converted to v1). - matchPolicy: Equivalent - timeoutSeconds: 10 - failurePolicy: Fail - # Only include 'sideEffects' field in Kubernetes 1.12+ - sideEffects: None - clientConfig: - service: - name: cert-manager-webhook - namespace: cert-manager - path: /mutate ---- -# Source: cert-manager/templates/webhook-validating-webhook.yaml -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - name: cert-manager-webhook - labels: - app: webhook - app.kubernetes.io/name: webhook - app.kubernetes.io/instance: cert-manager - app.kubernetes.io/component: "webhook" - app.kubernetes.io/version: "v1.9.1" - annotations: - cert-manager.io/inject-ca-from-secret: "cert-manager/cert-manager-webhook-ca" -webhooks: - - name: webhook.cert-manager.io - namespaceSelector: - matchExpressions: - - key: "cert-manager.io/disable-validation" - operator: "NotIn" - values: - - "true" - - key: "name" - operator: "NotIn" - values: - - cert-manager - rules: - - apiGroups: - - "cert-manager.io" - - "acme.cert-manager.io" - apiVersions: - - "v1" - operations: - - CREATE - - UPDATE - resources: - - "*/*" - admissionReviewVersions: ["v1"] - # This webhook only accepts v1 cert-manager resources. - # Equivalent matchPolicy ensures that non-v1 resource requests are sent to - # this webhook (after the resources have been converted to v1). - matchPolicy: Equivalent - timeoutSeconds: 10 - failurePolicy: Fail - sideEffects: None - clientConfig: - service: - name: cert-manager-webhook - namespace: cert-manager - path: /validate diff --git a/providers/client/client.go b/providers/client/client.go deleted file mode 100644 index 1a0bac2808..0000000000 --- a/providers/client/client.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package client provides access to the providers template data -package client - -import ( - "github.com/vmware-tanzu/tanzu-framework/providers/client/manifest" - "github.com/vmware-tanzu/tanzu-framework/tkg/providerinterface" -) - -type provider struct { -} - -// New returns provider client which implements provider interface -func New() providerinterface.ProviderInterface { - return &provider{} -} - -func (p *provider) GetProviderBundle() ([]byte, error) { - return manifest.ProviderZipBundle, nil -} diff --git a/providers/client/manifest/providers_embeded.go b/providers/client/manifest/providers_embeded.go deleted file mode 100644 index cea7becb16..0000000000 --- a/providers/client/manifest/providers_embeded.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//go:build embedproviders -// +build embedproviders - -// Package manifest... -package manifest - -import _ "embed" - -//go:embed providers.zip -var ProviderZipBundle []byte diff --git a/providers/client/manifest/providers_skipped.go b/providers/client/manifest/providers_skipped.go deleted file mode 100644 index 9ca45d8949..0000000000 --- a/providers/client/manifest/providers_skipped.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//go:build !embedproviders -// +build !embedproviders - -// Package manifest ... -package manifest - -// ProviderZipBundle variable defined when embedproviders tag is not passed during build -// Meaning provider will be downloaded based on TKG BoM file -var ProviderZipBundle []byte diff --git a/providers/cluster-api/v1.2.8/core-components.yaml b/providers/cluster-api/v1.2.8/core-components.yaml deleted file mode 100644 index c3be413038..0000000000 --- a/providers/cluster-api/v1.2.8/core-components.yaml +++ /dev/null @@ -1,7820 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - control-plane: controller-manager - name: capi-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: clusterclasses.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: ClusterClass - listKind: ClusterClassList - plural: clusterclasses - shortNames: - - cc - singular: clusterclass - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Time duration since creation of ClusterClass - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: ClusterClass is a template which can be used to create managed topologies. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterClassSpec describes the desired state of the ClusterClass. - properties: - controlPlane: - description: ControlPlane is a reference to a local struct that holds the details for provisioning the Control Plane for the Cluster. - properties: - machineInfrastructure: - description: "MachineTemplate defines the metadata and infrastructure information for control plane machines. \n This field is supported if and only if the control plane provider template referenced above is Machine based and supports setting replicas." - properties: - ref: - description: Ref is a required reference to a custom resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - metadata: - description: "Metadata is the metadata applied to the machines of the ControlPlane. At runtime this metadata is merged with the corresponding metadata from the topology. \n This field is supported if and only if the control plane provider template referenced is Machine based." - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - ref: - description: Ref is a required reference to a custom resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - infrastructure: - description: Infrastructure is a reference to a provider-specific template that holds the details for provisioning infrastructure specific cluster for the underlying provider. The underlying provider is responsible for the implementation of the template to an infrastructure cluster. - properties: - ref: - description: Ref is a required reference to a custom resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - workers: - description: Workers describes the worker nodes for the cluster. It is a collection of node types which can be used to create the worker nodes of the cluster. - properties: - machineDeployments: - description: MachineDeployments is a list of machine deployment classes that can be used to create a set of worker nodes. - items: - description: MachineDeploymentClass serves as a template to define a set of worker nodes of the cluster provisioned using the `ClusterClass`. - properties: - class: - description: Class denotes a type of worker node present in the cluster, this name MUST be unique within a ClusterClass and can be referenced in the Cluster to create a managed MachineDeployment. - type: string - template: - description: Template is a local struct containing a collection of templates for creation of MachineDeployment objects representing a set of worker nodes. - properties: - bootstrap: - description: Bootstrap contains the bootstrap template reference to be used for the creation of worker Machines. - properties: - ref: - description: Ref is a required reference to a custom resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - infrastructure: - description: Infrastructure contains the infrastructure template reference to be used for the creation of worker Machines. - properties: - ref: - description: Ref is a required reference to a custom resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - metadata: - description: Metadata is the metadata applied to the machines of the MachineDeployment. At runtime this metadata is merged with the corresponding metadata from the topology. - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - required: - - bootstrap - - infrastructure - type: object - required: - - class - - template - type: object - type: array - type: object - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of ClusterClass - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: ClusterClass is a template which can be used to create managed topologies. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterClassSpec describes the desired state of the ClusterClass. - properties: - controlPlane: - description: ControlPlane is a reference to a local struct that holds the details for provisioning the Control Plane for the Cluster. - properties: - machineHealthCheck: - description: MachineHealthCheck defines a MachineHealthCheck for this ControlPlaneClass. This field is supported if and only if the ControlPlane provider template referenced above is Machine based and supports setting replicas. - properties: - maxUnhealthy: - anyOf: - - type: integer - - type: string - description: Any further remediation is only allowed if at most "MaxUnhealthy" machines selected by "selector" are not healthy. - x-kubernetes-int-or-string: true - nodeStartupTimeout: - description: Machines older than this duration without a node will be considered to have failed and will be remediated. If you wish to disable this feature, set the value explicitly to 0. - type: string - remediationTemplate: - description: "RemediationTemplate is a reference to a remediation template provided by an infrastructure provider. \n This field is completely optional, when filled, the MachineHealthCheck controller creates a new object from the template referenced and hands off remediation of the machine to a controller that lives outside of Cluster API." - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - unhealthyConditions: - description: UnhealthyConditions contains a list of the conditions that determine whether a node is considered unhealthy. The conditions are combined in a logical OR, i.e. if any of the conditions is met, the node is unhealthy. - items: - description: UnhealthyCondition represents a Node condition type and value with a timeout specified as a duration. When the named condition has been in the given status for at least the timeout value, a node is considered unhealthy. - properties: - status: - minLength: 1 - type: string - timeout: - type: string - type: - minLength: 1 - type: string - required: - - status - - timeout - - type - type: object - type: array - unhealthyRange: - description: 'Any further remediation is only allowed if the number of machines selected by "selector" as not healthy is within the range of "UnhealthyRange". Takes precedence over MaxUnhealthy. Eg. "[3-5]" - This means that remediation will be allowed only when: (a) there are at least 3 unhealthy machines (and) (b) there are at most 5 unhealthy machines' - type: string - type: object - machineInfrastructure: - description: "MachineInfrastructure defines the metadata and infrastructure information for control plane machines. \n This field is supported if and only if the control plane provider template referenced above is Machine based and supports setting replicas." - properties: - ref: - description: Ref is a required reference to a custom resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - metadata: - description: "Metadata is the metadata applied to the machines of the ControlPlane. At runtime this metadata is merged with the corresponding metadata from the topology. \n This field is supported if and only if the control plane provider template referenced is Machine based." - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - ref: - description: Ref is a required reference to a custom resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - infrastructure: - description: Infrastructure is a reference to a provider-specific template that holds the details for provisioning infrastructure specific cluster for the underlying provider. The underlying provider is responsible for the implementation of the template to an infrastructure cluster. - properties: - ref: - description: Ref is a required reference to a custom resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - patches: - description: 'Patches defines the patches which are applied to customize referenced templates of a ClusterClass. Note: Patches will be applied in the order of the array.' - items: - description: ClusterClassPatch defines a patch which is applied to customize the referenced templates. - properties: - definitions: - description: 'Definitions define inline patches. Note: Patches will be applied in the order of the array. Note: Exactly one of Definitions or External must be set.' - items: - description: PatchDefinition defines a patch which is applied to customize the referenced templates. - properties: - jsonPatches: - description: 'JSONPatches defines the patches which should be applied on the templates matching the selector. Note: Patches will be applied in the order of the array.' - items: - description: JSONPatch defines a JSON patch. - properties: - op: - description: 'Op defines the operation of the patch. Note: Only `add`, `replace` and `remove` are supported.' - type: string - path: - description: 'Path defines the path of the patch. Note: Only the spec of a template can be patched, thus the path has to start with /spec/. Note: For now the only allowed array modifications are `append` and `prepend`, i.e.: * for op: `add`: only index 0 (prepend) and - (append) are allowed * for op: `replace` or `remove`: no indexes are allowed' - type: string - value: - description: 'Value defines the value of the patch. Note: Either Value or ValueFrom is required for add and replace operations. Only one of them is allowed to be set at the same time. Note: We have to use apiextensionsv1.JSON instead of our JSON type, because controller-tools has a hard-coded schema for apiextensionsv1.JSON which cannot be produced by another type (unset type field). Ref: https://github.com/kubernetes-sigs/controller-tools/blob/d0e03a142d0ecdd5491593e941ee1d6b5d91dba6/pkg/crd/known_types.go#L106-L111' - x-kubernetes-preserve-unknown-fields: true - valueFrom: - description: 'ValueFrom defines the value of the patch. Note: Either Value or ValueFrom is required for add and replace operations. Only one of them is allowed to be set at the same time.' - properties: - template: - description: 'Template is the Go template to be used to calculate the value. A template can reference variables defined in .spec.variables and builtin variables. Note: The template must evaluate to a valid YAML or JSON value.' - type: string - variable: - description: Variable is the variable to be used as value. Variable can be one of the variables defined in .spec.variables or a builtin variable. - type: string - type: object - required: - - op - - path - type: object - type: array - selector: - description: Selector defines on which templates the patch should be applied. - properties: - apiVersion: - description: APIVersion filters templates by apiVersion. - type: string - kind: - description: Kind filters templates by kind. - type: string - matchResources: - description: MatchResources selects templates based on where they are referenced. - properties: - controlPlane: - description: 'ControlPlane selects templates referenced in .spec.ControlPlane. Note: this will match the controlPlane and also the controlPlane machineInfrastructure (depending on the kind and apiVersion).' - type: boolean - infrastructureCluster: - description: InfrastructureCluster selects templates referenced in .spec.infrastructure. - type: boolean - machineDeploymentClass: - description: MachineDeploymentClass selects templates referenced in specific MachineDeploymentClasses in .spec.workers.machineDeployments. - properties: - names: - description: Names selects templates by class names. - items: - type: string - type: array - type: object - type: object - required: - - apiVersion - - kind - - matchResources - type: object - required: - - jsonPatches - - selector - type: object - type: array - description: - description: Description is a human-readable description of this patch. - type: string - enabledIf: - description: EnabledIf is a Go template to be used to calculate if a patch should be enabled. It can reference variables defined in .spec.variables and builtin variables. The patch will be enabled if the template evaluates to `true`, otherwise it will be disabled. If EnabledIf is not set, the patch will be enabled per default. - type: string - external: - description: 'External defines an external patch. Note: Exactly one of Definitions or External must be set.' - properties: - generateExtension: - description: GenerateExtension references an extension which is called to generate patches. - type: string - validateExtension: - description: ValidateExtension references an extension which is called to validate the topology. - type: string - type: object - name: - description: Name of the patch. - type: string - required: - - name - type: object - type: array - variables: - description: Variables defines the variables which can be configured in the Cluster topology and are then used in patches. - items: - description: ClusterClassVariable defines a variable which can be configured in the Cluster topology and used in patches. - properties: - name: - description: Name of the variable. - type: string - required: - description: 'Required specifies if the variable is required. Note: this applies to the variable as a whole and thus the top-level object defined in the schema. If nested fields are required, this will be specified inside the schema.' - type: boolean - schema: - description: Schema defines the schema of the variable. - properties: - openAPIV3Schema: - description: OpenAPIV3Schema defines the schema of a variable via OpenAPI v3 schema. The schema is a subset of the schema used in Kubernetes CRDs. - properties: - additionalProperties: - description: 'AdditionalProperties specifies the schema of values in a map (keys are always strings). NOTE: Can only be set if type is object. NOTE: AdditionalProperties is mutually exclusive with Properties. NOTE: This field uses PreserveUnknownFields and Schemaless, because recursive validation is not possible.' - x-kubernetes-preserve-unknown-fields: true - default: - description: 'Default is the default value of the variable. NOTE: Can be set for all types.' - x-kubernetes-preserve-unknown-fields: true - description: - description: Description is a human-readable description of this variable. - type: string - enum: - description: 'Enum is the list of valid values of the variable. NOTE: Can be set for all types.' - items: - x-kubernetes-preserve-unknown-fields: true - type: array - example: - description: Example is an example for this variable. - x-kubernetes-preserve-unknown-fields: true - exclusiveMaximum: - description: 'ExclusiveMaximum specifies if the Maximum is exclusive. NOTE: Can only be set if type is integer or number.' - type: boolean - exclusiveMinimum: - description: 'ExclusiveMinimum specifies if the Minimum is exclusive. NOTE: Can only be set if type is integer or number.' - type: boolean - format: - description: 'Format is an OpenAPI v3 format string. Unknown formats are ignored. For a list of supported formats please see: (of the k8s.io/apiextensions-apiserver version we''re currently using) https://github.com/kubernetes/apiextensions-apiserver/blob/master/pkg/apiserver/validation/formats.go NOTE: Can only be set if type is string.' - type: string - items: - description: 'Items specifies fields of an array. NOTE: Can only be set if type is array. NOTE: This field uses PreserveUnknownFields and Schemaless, because recursive validation is not possible.' - x-kubernetes-preserve-unknown-fields: true - maxItems: - description: 'MaxItems is the max length of an array variable. NOTE: Can only be set if type is array.' - format: int64 - type: integer - maxLength: - description: 'MaxLength is the max length of a string variable. NOTE: Can only be set if type is string.' - format: int64 - type: integer - maximum: - description: 'Maximum is the maximum of an integer or number variable. If ExclusiveMaximum is false, the variable is valid if it is lower than, or equal to, the value of Maximum. If ExclusiveMaximum is true, the variable is valid if it is strictly lower than the value of Maximum. NOTE: Can only be set if type is integer or number.' - format: int64 - type: integer - minItems: - description: 'MinItems is the min length of an array variable. NOTE: Can only be set if type is array.' - format: int64 - type: integer - minLength: - description: 'MinLength is the min length of a string variable. NOTE: Can only be set if type is string.' - format: int64 - type: integer - minimum: - description: 'Minimum is the minimum of an integer or number variable. If ExclusiveMinimum is false, the variable is valid if it is greater than, or equal to, the value of Minimum. If ExclusiveMinimum is true, the variable is valid if it is strictly greater than the value of Minimum. NOTE: Can only be set if type is integer or number.' - format: int64 - type: integer - pattern: - description: 'Pattern is the regex which a string variable must match. NOTE: Can only be set if type is string.' - type: string - properties: - description: 'Properties specifies fields of an object. NOTE: Can only be set if type is object. NOTE: Properties is mutually exclusive with AdditionalProperties. NOTE: This field uses PreserveUnknownFields and Schemaless, because recursive validation is not possible.' - x-kubernetes-preserve-unknown-fields: true - required: - description: 'Required specifies which fields of an object are required. NOTE: Can only be set if type is object.' - items: - type: string - type: array - type: - description: 'Type is the type of the variable. Valid values are: object, array, string, integer, number or boolean.' - type: string - uniqueItems: - description: 'UniqueItems specifies if items in an array must be unique. NOTE: Can only be set if type is array.' - type: boolean - required: - - type - type: object - required: - - openAPIV3Schema - type: object - required: - - name - - required - - schema - type: object - type: array - workers: - description: Workers describes the worker nodes for the cluster. It is a collection of node types which can be used to create the worker nodes of the cluster. - properties: - machineDeployments: - description: MachineDeployments is a list of machine deployment classes that can be used to create a set of worker nodes. - items: - description: MachineDeploymentClass serves as a template to define a set of worker nodes of the cluster provisioned using the `ClusterClass`. - properties: - class: - description: Class denotes a type of worker node present in the cluster, this name MUST be unique within a ClusterClass and can be referenced in the Cluster to create a managed MachineDeployment. - type: string - machineHealthCheck: - description: MachineHealthCheck defines a MachineHealthCheck for this MachineDeploymentClass. - properties: - maxUnhealthy: - anyOf: - - type: integer - - type: string - description: Any further remediation is only allowed if at most "MaxUnhealthy" machines selected by "selector" are not healthy. - x-kubernetes-int-or-string: true - nodeStartupTimeout: - description: Machines older than this duration without a node will be considered to have failed and will be remediated. If you wish to disable this feature, set the value explicitly to 0. - type: string - remediationTemplate: - description: "RemediationTemplate is a reference to a remediation template provided by an infrastructure provider. \n This field is completely optional, when filled, the MachineHealthCheck controller creates a new object from the template referenced and hands off remediation of the machine to a controller that lives outside of Cluster API." - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - unhealthyConditions: - description: UnhealthyConditions contains a list of the conditions that determine whether a node is considered unhealthy. The conditions are combined in a logical OR, i.e. if any of the conditions is met, the node is unhealthy. - items: - description: UnhealthyCondition represents a Node condition type and value with a timeout specified as a duration. When the named condition has been in the given status for at least the timeout value, a node is considered unhealthy. - properties: - status: - minLength: 1 - type: string - timeout: - type: string - type: - minLength: 1 - type: string - required: - - status - - timeout - - type - type: object - type: array - unhealthyRange: - description: 'Any further remediation is only allowed if the number of machines selected by "selector" as not healthy is within the range of "UnhealthyRange". Takes precedence over MaxUnhealthy. Eg. "[3-5]" - This means that remediation will be allowed only when: (a) there are at least 3 unhealthy machines (and) (b) there are at most 5 unhealthy machines' - type: string - type: object - template: - description: Template is a local struct containing a collection of templates for creation of MachineDeployment objects representing a set of worker nodes. - properties: - bootstrap: - description: Bootstrap contains the bootstrap template reference to be used for the creation of worker Machines. - properties: - ref: - description: Ref is a required reference to a custom resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - infrastructure: - description: Infrastructure contains the infrastructure template reference to be used for the creation of worker Machines. - properties: - ref: - description: Ref is a required reference to a custom resource offered by a provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - required: - - ref - type: object - metadata: - description: Metadata is the metadata applied to the machines of the MachineDeployment. At runtime this metadata is merged with the corresponding metadata from the topology. - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - required: - - bootstrap - - infrastructure - type: object - required: - - class - - template - type: object - type: array - type: object - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: clusterresourcesetbindings.addons.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: addons.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: ClusterResourceSetBinding - listKind: ClusterResourceSetBindingList - plural: clusterresourcesetbindings - singular: clusterresourcesetbinding - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: ClusterResourceSetBinding lists all matching ClusterResourceSets with the cluster it belongs to. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterResourceSetBindingSpec defines the desired state of ClusterResourceSetBinding. - properties: - bindings: - description: Bindings is a list of ClusterResourceSets and their resources. - items: - description: ResourceSetBinding keeps info on all of the resources in a ClusterResourceSet. - properties: - clusterResourceSetName: - description: ClusterResourceSetName is the name of the ClusterResourceSet that is applied to the owner cluster of the binding. - type: string - resources: - description: Resources is a list of resources that the ClusterResourceSet has. - items: - description: ResourceBinding shows the status of a resource that belongs to a ClusterResourceSet matched by the owner cluster of the ClusterResourceSetBinding object. - properties: - applied: - description: Applied is to track if a resource is applied to the cluster or not. - type: boolean - hash: - description: Hash is the hash of a resource's data. This can be used to decide if a resource is changed. For "ApplyOnce" ClusterResourceSet.spec.strategy, this is no-op as that strategy does not act on change. - type: string - kind: - description: 'Kind of the resource. Supported kinds are: Secrets and ConfigMaps.' - enum: - - Secret - - ConfigMap - type: string - lastAppliedTime: - description: LastAppliedTime identifies when this resource was last applied to the cluster. - format: date-time - type: string - name: - description: Name of the resource that is in the same namespace with ClusterResourceSet object. - minLength: 1 - type: string - required: - - applied - - kind - - name - type: object - type: array - required: - - clusterResourceSetName - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of ClusterResourceSetBinding - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: ClusterResourceSetBinding lists all matching ClusterResourceSets with the cluster it belongs to. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterResourceSetBindingSpec defines the desired state of ClusterResourceSetBinding. - properties: - bindings: - description: Bindings is a list of ClusterResourceSets and their resources. - items: - description: ResourceSetBinding keeps info on all of the resources in a ClusterResourceSet. - properties: - clusterResourceSetName: - description: ClusterResourceSetName is the name of the ClusterResourceSet that is applied to the owner cluster of the binding. - type: string - resources: - description: Resources is a list of resources that the ClusterResourceSet has. - items: - description: ResourceBinding shows the status of a resource that belongs to a ClusterResourceSet matched by the owner cluster of the ClusterResourceSetBinding object. - properties: - applied: - description: Applied is to track if a resource is applied to the cluster or not. - type: boolean - hash: - description: Hash is the hash of a resource's data. This can be used to decide if a resource is changed. For "ApplyOnce" ClusterResourceSet.spec.strategy, this is no-op as that strategy does not act on change. - type: string - kind: - description: 'Kind of the resource. Supported kinds are: Secrets and ConfigMaps.' - enum: - - Secret - - ConfigMap - type: string - lastAppliedTime: - description: LastAppliedTime identifies when this resource was last applied to the cluster. - format: date-time - type: string - name: - description: Name of the resource that is in the same namespace with ClusterResourceSet object. - minLength: 1 - type: string - required: - - applied - - kind - - name - type: object - type: array - required: - - clusterResourceSetName - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of ClusterResourceSetBinding - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: ClusterResourceSetBinding lists all matching ClusterResourceSets with the cluster it belongs to. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterResourceSetBindingSpec defines the desired state of ClusterResourceSetBinding. - properties: - bindings: - description: Bindings is a list of ClusterResourceSets and their resources. - items: - description: ResourceSetBinding keeps info on all of the resources in a ClusterResourceSet. - properties: - clusterResourceSetName: - description: ClusterResourceSetName is the name of the ClusterResourceSet that is applied to the owner cluster of the binding. - type: string - resources: - description: Resources is a list of resources that the ClusterResourceSet has. - items: - description: ResourceBinding shows the status of a resource that belongs to a ClusterResourceSet matched by the owner cluster of the ClusterResourceSetBinding object. - properties: - applied: - description: Applied is to track if a resource is applied to the cluster or not. - type: boolean - hash: - description: Hash is the hash of a resource's data. This can be used to decide if a resource is changed. For "ApplyOnce" ClusterResourceSet.spec.strategy, this is no-op as that strategy does not act on change. - type: string - kind: - description: 'Kind of the resource. Supported kinds are: Secrets and ConfigMaps.' - enum: - - Secret - - ConfigMap - type: string - lastAppliedTime: - description: LastAppliedTime identifies when this resource was last applied to the cluster. - format: date-time - type: string - name: - description: Name of the resource that is in the same namespace with ClusterResourceSet object. - minLength: 1 - type: string - required: - - applied - - kind - - name - type: object - type: array - required: - - clusterResourceSetName - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: clusterresourcesets.addons.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: addons.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: ClusterResourceSet - listKind: ClusterResourceSetList - plural: clusterresourcesets - singular: clusterresourceset - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: ClusterResourceSet is the Schema for the clusterresourcesets API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterResourceSetSpec defines the desired state of ClusterResourceSet. - properties: - clusterSelector: - description: Label selector for Clusters. The Clusters that are selected by this will be the ones affected by this ClusterResourceSet. It must match the Cluster labels. This field is immutable. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - resources: - description: Resources is a list of Secrets/ConfigMaps where each contains 1 or more resources to be applied to remote clusters. - items: - description: ResourceRef specifies a resource. - properties: - kind: - description: 'Kind of the resource. Supported kinds are: Secrets and ConfigMaps.' - enum: - - Secret - - ConfigMap - type: string - name: - description: Name of the resource that is in the same namespace with ClusterResourceSet object. - minLength: 1 - type: string - required: - - kind - - name - type: object - type: array - strategy: - description: Strategy is the strategy to be used during applying resources. Defaults to ApplyOnce. This field is immutable. - enum: - - ApplyOnce - type: string - required: - - clusterSelector - type: object - status: - description: ClusterResourceSetStatus defines the observed state of ClusterResourceSet. - properties: - conditions: - description: Conditions defines current state of the ClusterResourceSet. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - observedGeneration: - description: ObservedGeneration reflects the generation of the most recently observed ClusterResourceSet. - format: int64 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of ClusterResourceSet - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: ClusterResourceSet is the Schema for the clusterresourcesets API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterResourceSetSpec defines the desired state of ClusterResourceSet. - properties: - clusterSelector: - description: Label selector for Clusters. The Clusters that are selected by this will be the ones affected by this ClusterResourceSet. It must match the Cluster labels. This field is immutable. Label selector cannot be empty. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - resources: - description: Resources is a list of Secrets/ConfigMaps where each contains 1 or more resources to be applied to remote clusters. - items: - description: ResourceRef specifies a resource. - properties: - kind: - description: 'Kind of the resource. Supported kinds are: Secrets and ConfigMaps.' - enum: - - Secret - - ConfigMap - type: string - name: - description: Name of the resource that is in the same namespace with ClusterResourceSet object. - minLength: 1 - type: string - required: - - kind - - name - type: object - type: array - strategy: - description: Strategy is the strategy to be used during applying resources. Defaults to ApplyOnce. This field is immutable. - enum: - - ApplyOnce - type: string - required: - - clusterSelector - type: object - status: - description: ClusterResourceSetStatus defines the observed state of ClusterResourceSet. - properties: - conditions: - description: Conditions defines current state of the ClusterResourceSet. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - observedGeneration: - description: ObservedGeneration reflects the generation of the most recently observed ClusterResourceSet. - format: int64 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of ClusterResourceSet - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: ClusterResourceSet is the Schema for the clusterresourcesets API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterResourceSetSpec defines the desired state of ClusterResourceSet. - properties: - clusterSelector: - description: Label selector for Clusters. The Clusters that are selected by this will be the ones affected by this ClusterResourceSet. It must match the Cluster labels. This field is immutable. Label selector cannot be empty. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - resources: - description: Resources is a list of Secrets/ConfigMaps where each contains 1 or more resources to be applied to remote clusters. - items: - description: ResourceRef specifies a resource. - properties: - kind: - description: 'Kind of the resource. Supported kinds are: Secrets and ConfigMaps.' - enum: - - Secret - - ConfigMap - type: string - name: - description: Name of the resource that is in the same namespace with ClusterResourceSet object. - minLength: 1 - type: string - required: - - kind - - name - type: object - type: array - strategy: - description: Strategy is the strategy to be used during applying resources. Defaults to ApplyOnce. This field is immutable. - enum: - - ApplyOnce - type: string - required: - - clusterSelector - type: object - status: - description: ClusterResourceSetStatus defines the observed state of ClusterResourceSet. - properties: - conditions: - description: Conditions defines current state of the ClusterResourceSet. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - observedGeneration: - description: ObservedGeneration reflects the generation of the most recently observed ClusterResourceSet. - format: int64 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: clusters.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: Cluster - listKind: ClusterList - plural: clusters - shortNames: - - cl - singular: cluster - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster status such as Pending/Provisioning/Provisioned/Deleting/Failed - jsonPath: .status.phase - name: Phase - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: Cluster is the Schema for the clusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterSpec defines the desired state of Cluster. - properties: - clusterNetwork: - description: Cluster network configuration. - properties: - apiServerPort: - description: APIServerPort specifies the port the API Server should bind to. Defaults to 6443. - format: int32 - type: integer - pods: - description: The network ranges from which Pod networks are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - serviceDomain: - description: Domain name for services. - type: string - services: - description: The network ranges from which service VIPs are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneRef: - description: ControlPlaneRef is an optional reference to a provider-specific resource that holds the details for provisioning the Control Plane for a Cluster. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - infrastructureRef: - description: InfrastructureRef is a reference to a provider-specific resource that holds the details for provisioning infrastructure for a cluster in said provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - paused: - description: Paused can be used to prevent controllers from processing the Cluster and all its associated objects. - type: boolean - type: object - status: - description: ClusterStatus defines the observed state of Cluster. - properties: - conditions: - description: Conditions defines current service state of the cluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - controlPlaneInitialized: - description: ControlPlaneInitialized defines if the control plane has been initialized. - type: boolean - controlPlaneReady: - description: ControlPlaneReady defines if the control plane is ready. - type: boolean - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a slice of failure domain objects synced from the infrastructure provider. - type: object - failureMessage: - description: FailureMessage indicates that there is a fatal problem reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a fatal problem reconciling the state, and will be set to a token value suitable for programmatic interpretation. - type: string - infrastructureReady: - description: InfrastructureReady is the state of the infrastructure provider. - type: boolean - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of cluster actuation. E.g. Pending, Running, Terminating, Failed etc. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of Cluster - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Cluster status such as Pending/Provisioning/Provisioned/Deleting/Failed - jsonPath: .status.phase - name: Phase - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: Cluster is the Schema for the clusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterSpec defines the desired state of Cluster. - properties: - clusterNetwork: - description: Cluster network configuration. - properties: - apiServerPort: - description: APIServerPort specifies the port the API Server should bind to. Defaults to 6443. - format: int32 - type: integer - pods: - description: The network ranges from which Pod networks are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - serviceDomain: - description: Domain name for services. - type: string - services: - description: The network ranges from which service VIPs are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneRef: - description: ControlPlaneRef is an optional reference to a provider-specific resource that holds the details for provisioning the Control Plane for a Cluster. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - infrastructureRef: - description: InfrastructureRef is a reference to a provider-specific resource that holds the details for provisioning infrastructure for a cluster in said provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - paused: - description: Paused can be used to prevent controllers from processing the Cluster and all its associated objects. - type: boolean - topology: - description: 'This encapsulates the topology for the cluster. NOTE: It is required to enable the ClusterTopology feature gate flag to activate managed topologies support; this feature is highly experimental, and parts of it might still be not implemented.' - properties: - class: - description: The name of the ClusterClass object to create the topology. - type: string - controlPlane: - description: ControlPlane describes the cluster control plane. - properties: - metadata: - description: "Metadata is the metadata applied to the machines of the ControlPlane. At runtime this metadata is merged with the corresponding metadata from the ClusterClass. \n This field is supported if and only if the control plane provider template referenced in the ClusterClass is Machine based." - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - replicas: - description: Replicas is the number of control plane nodes. If the value is nil, the ControlPlane object is created without the number of Replicas and it's assumed that the control plane controller does not implement support for this field. When specified against a control plane provider that lacks support for this field, this value will be ignored. - format: int32 - type: integer - type: object - rolloutAfter: - description: RolloutAfter performs a rollout of the entire cluster one component at a time, control plane first and then machine deployments. - format: date-time - type: string - version: - description: The Kubernetes version of the cluster. - type: string - workers: - description: Workers encapsulates the different constructs that form the worker nodes for the cluster. - properties: - machineDeployments: - description: MachineDeployments is a list of machine deployments in the cluster. - items: - description: MachineDeploymentTopology specifies the different parameters for a set of worker nodes in the topology. This set of nodes is managed by a MachineDeployment object whose lifecycle is managed by the Cluster controller. - properties: - class: - description: Class is the name of the MachineDeploymentClass used to create the set of worker nodes. This should match one of the deployment classes defined in the ClusterClass object mentioned in the `Cluster.Spec.Class` field. - type: string - metadata: - description: Metadata is the metadata applied to the machines of the MachineDeployment. At runtime this metadata is merged with the corresponding metadata from the ClusterClass. - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - name: - description: Name is the unique identifier for this MachineDeploymentTopology. The value is used with other unique identifiers to create a MachineDeployment's Name (e.g. cluster's name, etc). In case the name is greater than the allowed maximum length, the values are hashed together. - type: string - replicas: - description: Replicas is the number of worker nodes belonging to this set. If the value is nil, the MachineDeployment is created without the number of Replicas (defaulting to zero) and it's assumed that an external entity (like cluster autoscaler) is responsible for the management of this value. - format: int32 - type: integer - required: - - class - - name - type: object - type: array - type: object - required: - - class - - version - type: object - type: object - status: - description: ClusterStatus defines the observed state of Cluster. - properties: - conditions: - description: Conditions defines current service state of the cluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - controlPlaneReady: - description: ControlPlaneReady defines if the control plane is ready. - type: boolean - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a slice of failure domain objects synced from the infrastructure provider. - type: object - failureMessage: - description: FailureMessage indicates that there is a fatal problem reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a fatal problem reconciling the state, and will be set to a token value suitable for programmatic interpretation. - type: string - infrastructureReady: - description: InfrastructureReady is the state of the infrastructure provider. - type: boolean - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of cluster actuation. E.g. Pending, Running, Terminating, Failed etc. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster status such as Pending/Provisioning/Provisioned/Deleting/Failed - jsonPath: .status.phase - name: Phase - type: string - - description: Time duration since creation of Cluster - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this Cluster - jsonPath: .spec.topology.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: Cluster is the Schema for the clusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterSpec defines the desired state of Cluster. - properties: - clusterNetwork: - description: Cluster network configuration. - properties: - apiServerPort: - description: APIServerPort specifies the port the API Server should bind to. Defaults to 6443. - format: int32 - type: integer - pods: - description: The network ranges from which Pod networks are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - serviceDomain: - description: Domain name for services. - type: string - services: - description: The network ranges from which service VIPs are allocated. - properties: - cidrBlocks: - items: - type: string - type: array - required: - - cidrBlocks - type: object - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneRef: - description: ControlPlaneRef is an optional reference to a provider-specific resource that holds the details for provisioning the Control Plane for a Cluster. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - infrastructureRef: - description: InfrastructureRef is a reference to a provider-specific resource that holds the details for provisioning infrastructure for a cluster in said provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - paused: - description: Paused can be used to prevent controllers from processing the Cluster and all its associated objects. - type: boolean - topology: - description: 'This encapsulates the topology for the cluster. NOTE: It is required to enable the ClusterTopology feature gate flag to activate managed topologies support; this feature is highly experimental, and parts of it might still be not implemented.' - properties: - class: - description: The name of the ClusterClass object to create the topology. - type: string - controlPlane: - description: ControlPlane describes the cluster control plane. - properties: - metadata: - description: "Metadata is the metadata applied to the machines of the ControlPlane. At runtime this metadata is merged with the corresponding metadata from the ClusterClass. \n This field is supported if and only if the control plane provider template referenced in the ClusterClass is Machine based." - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - replicas: - description: Replicas is the number of control plane nodes. If the value is nil, the ControlPlane object is created without the number of Replicas and it's assumed that the control plane controller does not implement support for this field. When specified against a control plane provider that lacks support for this field, this value will be ignored. - format: int32 - type: integer - type: object - rolloutAfter: - description: RolloutAfter performs a rollout of the entire cluster one component at a time, control plane first and then machine deployments. - format: date-time - type: string - variables: - description: Variables can be used to customize the Cluster through patches. They must comply to the corresponding VariableClasses defined in the ClusterClass. - items: - description: ClusterVariable can be used to customize the Cluster through patches. It must comply to the corresponding ClusterClassVariable defined in the ClusterClass. - properties: - name: - description: Name of the variable. - type: string - value: - description: 'Value of the variable. Note: the value will be validated against the schema of the corresponding ClusterClassVariable from the ClusterClass. Note: We have to use apiextensionsv1.JSON instead of a custom JSON type, because controller-tools has a hard-coded schema for apiextensionsv1.JSON which cannot be produced by another type via controller-tools, i.e. it is not possible to have no type field. Ref: https://github.com/kubernetes-sigs/controller-tools/blob/d0e03a142d0ecdd5491593e941ee1d6b5d91dba6/pkg/crd/known_types.go#L106-L111' - x-kubernetes-preserve-unknown-fields: true - required: - - name - - value - type: object - type: array - version: - description: The Kubernetes version of the cluster. - type: string - workers: - description: Workers encapsulates the different constructs that form the worker nodes for the cluster. - properties: - machineDeployments: - description: MachineDeployments is a list of machine deployments in the cluster. - items: - description: MachineDeploymentTopology specifies the different parameters for a set of worker nodes in the topology. This set of nodes is managed by a MachineDeployment object whose lifecycle is managed by the Cluster controller. - properties: - class: - description: Class is the name of the MachineDeploymentClass used to create the set of worker nodes. This should match one of the deployment classes defined in the ClusterClass object mentioned in the `Cluster.Spec.Class` field. - type: string - failureDomain: - description: FailureDomain is the failure domain the machines will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - metadata: - description: Metadata is the metadata applied to the machines of the MachineDeployment. At runtime this metadata is merged with the corresponding metadata from the ClusterClass. - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - name: - description: Name is the unique identifier for this MachineDeploymentTopology. The value is used with other unique identifiers to create a MachineDeployment's Name (e.g. cluster's name, etc). In case the name is greater than the allowed maximum length, the values are hashed together. - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - replicas: - description: Replicas is the number of worker nodes belonging to this set. If the value is nil, the MachineDeployment is created without the number of Replicas (defaulting to zero) and it's assumed that an external entity (like cluster autoscaler) is responsible for the management of this value. - format: int32 - type: integer - variables: - description: Variables can be used to customize the MachineDeployment through patches. - properties: - overrides: - description: Overrides can be used to override Cluster level variables. - items: - description: ClusterVariable can be used to customize the Cluster through patches. It must comply to the corresponding ClusterClassVariable defined in the ClusterClass. - properties: - name: - description: Name of the variable. - type: string - value: - description: 'Value of the variable. Note: the value will be validated against the schema of the corresponding ClusterClassVariable from the ClusterClass. Note: We have to use apiextensionsv1.JSON instead of a custom JSON type, because controller-tools has a hard-coded schema for apiextensionsv1.JSON which cannot be produced by another type via controller-tools, i.e. it is not possible to have no type field. Ref: https://github.com/kubernetes-sigs/controller-tools/blob/d0e03a142d0ecdd5491593e941ee1d6b5d91dba6/pkg/crd/known_types.go#L106-L111' - x-kubernetes-preserve-unknown-fields: true - required: - - name - - value - type: object - type: array - type: object - required: - - class - - name - type: object - type: array - type: object - required: - - class - - version - type: object - type: object - status: - description: ClusterStatus defines the observed state of Cluster. - properties: - conditions: - description: Conditions defines current service state of the cluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - controlPlaneReady: - description: ControlPlaneReady defines if the control plane is ready. - type: boolean - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a slice of failure domain objects synced from the infrastructure provider. - type: object - failureMessage: - description: FailureMessage indicates that there is a fatal problem reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a fatal problem reconciling the state, and will be set to a token value suitable for programmatic interpretation. - type: string - infrastructureReady: - description: InfrastructureReady is the state of the infrastructure provider. - type: boolean - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of cluster actuation. E.g. Pending, Running, Terminating, Failed etc. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.1 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: cluster-api - name: extensionconfigs.runtime.cluster.x-k8s.io -spec: - group: runtime.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: ExtensionConfig - listKind: ExtensionConfigList - plural: extensionconfigs - shortNames: - - ext - singular: extensionconfig - scope: Cluster - versions: - - additionalPrinterColumns: - - description: Time duration since creation of ExtensionConfig - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: ExtensionConfig is the Schema for the ExtensionConfig API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ExtensionConfigSpec is the desired state of the ExtensionConfig - properties: - clientConfig: - description: ClientConfig defines how to communicate with the Extension server. - properties: - caBundle: - description: CABundle is a PEM encoded CA bundle which will be used to validate the Extension server's server certificate. - format: byte - type: string - service: - description: "Service is a reference to the Kubernetes service for the Extension server. Note: Exactly one of `url` or `service` must be specified. \n If the Extension server is running within a cluster, then you should use `service`." - properties: - name: - description: Name is the name of the service. - type: string - namespace: - description: Namespace is the namespace of the service. - type: string - path: - description: Path is an optional URL path and if present may be any string permissible in a URL. If a path is set it will be used as prefix to the hook-specific path. - type: string - port: - description: Port is the port on the service that's hosting the Extension server. Defaults to 443. Port should be a valid port number (1-65535, inclusive). - format: int32 - type: integer - required: - - name - - namespace - type: object - url: - description: "URL gives the location of the Extension server, in standard URL form (`scheme://host:port/path`). Note: Exactly one of `url` or `service` must be specified. \n The scheme must be \"https\". \n The `host` should not refer to a service running in the cluster; use the `service` field instead. \n A path is optional, and if present may be any string permissible in a URL. If a path is set it will be used as prefix to the hook-specific path. \n Attempting to use a user or basic auth e.g. \"user:password@\" is not allowed. Fragments (\"#...\") and query parameters (\"?...\") are not allowed either." - type: string - type: object - namespaceSelector: - description: NamespaceSelector decides whether to call the hook for an object based on whether the namespace for that object matches the selector. Defaults to the empty LabelSelector, which matches all objects. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - required: - - clientConfig - type: object - status: - description: ExtensionConfigStatus is the current state of the ExtensionConfig - properties: - conditions: - description: Conditions define the current service state of the ExtensionConfig. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - handlers: - description: Handlers defines the current ExtensionHandlers supported by an Extension. - items: - description: ExtensionHandler specifies the details of a handler for a particular runtime hook registered by an Extension server. - properties: - failurePolicy: - description: FailurePolicy defines how failures in calls to the ExtensionHandler should be handled by a client. Defaults to Fail if not set. - type: string - name: - description: Name is the unique name of the ExtensionHandler. - type: string - requestHook: - description: RequestHook defines the versioned runtime hook which this ExtensionHandler serves. - properties: - apiVersion: - description: APIVersion is the group and version of the Hook. - type: string - hook: - description: Hook is the name of the hook. - type: string - required: - - apiVersion - - hook - type: object - timeoutSeconds: - description: TimeoutSeconds defines the timeout duration for client calls to the ExtensionHandler. Defaults to 10 is not set. - format: int32 - type: integer - required: - - name - - requestHook - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.1 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: cluster-api - name: ipaddressclaims.ipam.cluster.x-k8s.io -spec: - group: ipam.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: IPAddressClaim - listKind: IPAddressClaimList - plural: ipaddressclaims - singular: ipaddressclaim - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Name of the pool to allocate an address from - jsonPath: .spec.poolRef.name - name: Pool Name - type: string - - description: Kind of the pool to allocate an address from - jsonPath: .spec.poolRef.kind - name: Pool Kind - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: IPAddressClaim is the Schema for the ipaddressclaim API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: IPAddressClaimSpec is the desired state of an IPAddressClaim. - properties: - poolRef: - description: PoolRef is a reference to the pool from which an IP address should be created. - properties: - apiGroup: - description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - apiGroup - - kind - - name - type: object - required: - - poolRef - type: object - status: - description: IPAddressClaimStatus is the observed status of a IPAddressClaim. - properties: - addressRef: - description: AddressRef is a reference to the address that was created for this claim. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - conditions: - description: Conditions summarises the current state of the IPAddressClaim - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - required: - - addressRef - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.1 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: cluster-api - name: ipaddresses.ipam.cluster.x-k8s.io -spec: - group: ipam.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: IPAddress - listKind: IPAddressList - plural: ipaddresses - singular: ipaddress - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Address - jsonPath: .spec.address - name: Address - type: string - - description: Name of the pool the address is from - jsonPath: .spec.poolRef.name - name: Pool Name - type: string - - description: Kind of the pool the address is from - jsonPath: .spec.poolRef.kind - name: Pool Kind - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: IPAddress is the Schema for the ipaddress API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: IPAddressSpec is the desired state of an IPAddress. - properties: - address: - description: Address is the IP address. - type: string - claimRef: - description: ClaimRef is a reference to the claim this IPAddress was created for. - properties: - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - type: object - gateway: - description: Gateway is the network gateway of the network the address is from. - type: string - poolRef: - description: PoolRef is a reference to the pool that this IPAddress was created from. - properties: - apiGroup: - description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - apiGroup - - kind - - name - type: object - prefix: - description: Prefix is the prefix of the address. - type: integer - required: - - address - - claimRef - - gateway - - poolRef - - prefix - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: machinedeployments.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: MachineDeployment - listKind: MachineDeploymentList - plural: machinedeployments - shortNames: - - md - singular: machinedeployment - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: MachineDeployment status such as ScalingUp/ScalingDown/Running/Failed/Unknown - jsonPath: .status.phase - name: Phase - type: string - - description: Total number of non-terminated machines targeted by this MachineDeployment - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of ready machines targeted by this MachineDeployment - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: Total number of non-terminated machines targeted by this deployment that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this MachineDeployment - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - name: v1alpha3 - schema: - openAPIV3Schema: - description: MachineDeployment is the Schema for the machinedeployments API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachineDeploymentSpec defines the desired state of MachineDeployment. - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - minReadySeconds: - description: Minimum number of seconds for which a newly created machine should be ready. Defaults to 0 (machine will be considered available as soon as it is ready) - format: int32 - type: integer - paused: - description: Indicates that the deployment is paused. - type: boolean - progressDeadlineSeconds: - description: The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s. - format: int32 - type: integer - replicas: - description: Number of desired machines. Defaults to 1. This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - revisionHistoryLimit: - description: The number of old MachineSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1. - format: int32 - type: integer - selector: - description: Label selector for machines. Existing MachineSets whose machines are selected by this will be the ones affected by this deployment. It must match the machine template's labels. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - strategy: - description: The deployment strategy to use to replace existing machines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if MachineDeploymentStrategyType = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of machines that can be scheduled above the desired number of machines. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 1. Example: when this is set to 30%, the new MachineSet can be scaled up immediately when the rolling update starts, such that the total number of old and new machines do not exceed 130% of desired machines. Once old machines have been killed, new MachineSet can be scaled up further, ensuring that total number of machines running at any time during the update is at most 130% of desired machines.' - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - description: 'The maximum number of machines that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 0. Example: when this is set to 30%, the old MachineSet can be scaled down to 70% of desired machines immediately when the rolling update starts. Once new machines are ready, old MachineSet can be scaled down further, followed by scaling up the new MachineSet, ensuring that the total number of machines available at all times during the update is at least 70% of desired machines.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of deployment. Currently the only supported strategy is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - generateName: - description: "GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server. \n If this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header). \n Applied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - name: - description: "Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - namespace: - description: "Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty. \n Must be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - ownerReferences: - description: "List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller. \n Deprecated: This field has no function and is going to be removed in a next release." - items: - description: OwnerReference contains enough information to let you identify an owning object. An owning object must be in the same namespace as the dependent, or be cluster-scoped, so there is no namespace field. - properties: - apiVersion: - description: API version of the referent. - type: string - blockOwnerDeletion: - description: If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. See https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion for how the garbage collector interacts with this field and enforces the foreground deletion. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned. - type: boolean - controller: - description: If true, this reference points to the managing controller. - type: boolean - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names' - type: string - uid: - description: 'UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids' - type: string - required: - - apiVersion - - kind - - name - - uid - type: object - x-kubernetes-map-type: atomic - type: array - type: object - spec: - description: 'Specification of the desired behavior of the machine. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.Data without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - data: - description: "Data contains the bootstrap data, such as cloud-init details scripts. If nil, the Machine should remain in the Pending state. \n Deprecated: Switch to DataSecretName." - type: string - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - - template - type: object - status: - description: MachineDeploymentStatus defines the observed state of MachineDeployment. - properties: - availableReplicas: - description: Total number of available machines (ready for at least minReadySeconds) targeted by this deployment. - format: int32 - type: integer - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of a MachineDeployment (ScalingUp, ScalingDown, Running, Failed, or Unknown). - type: string - readyReplicas: - description: Total number of ready machines targeted by this deployment. - format: int32 - type: integer - replicas: - description: Total number of non-terminated machines targeted by this deployment (their labels match the selector). - format: int32 - type: integer - selector: - description: 'Selector is the same as the label selector but in the string format to avoid introspection by clients. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - unavailableReplicas: - description: Total number of unavailable machines targeted by this deployment. This is the total number of machines that are still required for the deployment to have 100% available capacity. They may either be machines that are running but not yet available or machines that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: Total number of non-terminated machines targeted by this deployment that have the desired template spec. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Time duration since creation of MachineDeployment - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: MachineDeployment status such as ScalingUp/ScalingDown/Running/Failed/Unknown - jsonPath: .status.phase - name: Phase - type: string - - description: Total number of non-terminated machines targeted by this MachineDeployment - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of ready machines targeted by this MachineDeployment - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: Total number of non-terminated machines targeted by this deployment that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this MachineDeployment - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - name: v1alpha4 - schema: - openAPIV3Schema: - description: MachineDeployment is the Schema for the machinedeployments API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachineDeploymentSpec defines the desired state of MachineDeployment. - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - minReadySeconds: - description: Minimum number of seconds for which a newly created machine should be ready. Defaults to 0 (machine will be considered available as soon as it is ready) - format: int32 - type: integer - paused: - description: Indicates that the deployment is paused. - type: boolean - progressDeadlineSeconds: - description: The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s. - format: int32 - type: integer - replicas: - default: 1 - description: Number of desired machines. Defaults to 1. This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - revisionHistoryLimit: - description: The number of old MachineSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1. - format: int32 - type: integer - selector: - description: Label selector for machines. Existing MachineSets whose machines are selected by this will be the ones affected by this deployment. It must match the machine template's labels. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - strategy: - description: The deployment strategy to use to replace existing machines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if MachineDeploymentStrategyType = RollingUpdate. - properties: - deletePolicy: - description: DeletePolicy defines the policy used by the MachineDeployment to identify nodes to delete when downscaling. Valid values are "Random, "Newest", "Oldest" When no value is supplied, the default DeletePolicy of MachineSet is used - enum: - - Random - - Newest - - Oldest - type: string - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of machines that can be scheduled above the desired number of machines. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 1. Example: when this is set to 30%, the new MachineSet can be scaled up immediately when the rolling update starts, such that the total number of old and new machines do not exceed 130% of desired machines. Once old machines have been killed, new MachineSet can be scaled up further, ensuring that total number of machines running at any time during the update is at most 130% of desired machines.' - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - description: 'The maximum number of machines that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 0. Example: when this is set to 30%, the old MachineSet can be scaled down to 70% of desired machines immediately when the rolling update starts. Once new machines are ready, old MachineSet can be scaled down further, followed by scaling up the new MachineSet, ensuring that the total number of machines available at all times during the update is at least 70% of desired machines.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of deployment. Default is RollingUpdate. - enum: - - RollingUpdate - - OnDelete - type: string - type: object - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: 'Specification of the desired behavior of the machine. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.DataSecretName without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - - template - type: object - status: - description: MachineDeploymentStatus defines the observed state of MachineDeployment. - properties: - availableReplicas: - description: Total number of available machines (ready for at least minReadySeconds) targeted by this deployment. - format: int32 - type: integer - conditions: - description: Conditions defines current service state of the MachineDeployment. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of a MachineDeployment (ScalingUp, ScalingDown, Running, Failed, or Unknown). - type: string - readyReplicas: - description: Total number of ready machines targeted by this deployment. - format: int32 - type: integer - replicas: - description: Total number of non-terminated machines targeted by this deployment (their labels match the selector). - format: int32 - type: integer - selector: - description: 'Selector is the same as the label selector but in the string format to avoid introspection by clients. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - unavailableReplicas: - description: Total number of unavailable machines targeted by this deployment. This is the total number of machines that are still required for the deployment to have 100% available capacity. They may either be machines that are running but not yet available or machines that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: Total number of non-terminated machines targeted by this deployment that have the desired template spec. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Total number of machines desired by this MachineDeployment - jsonPath: .spec.replicas - name: Desired - priority: 10 - type: integer - - description: Total number of non-terminated machines targeted by this MachineDeployment - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of ready machines targeted by this MachineDeployment - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: Total number of non-terminated machines targeted by this deployment that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this MachineDeployment - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - - description: MachineDeployment status such as ScalingUp/ScalingDown/Running/Failed/Unknown - jsonPath: .status.phase - name: Phase - type: string - - description: Time duration since creation of MachineDeployment - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this MachineDeployment - jsonPath: .spec.template.spec.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: MachineDeployment is the Schema for the machinedeployments API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachineDeploymentSpec defines the desired state of MachineDeployment. - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - minReadySeconds: - description: Minimum number of seconds for which a newly created machine should be ready. Defaults to 0 (machine will be considered available as soon as it is ready) - format: int32 - type: integer - paused: - description: Indicates that the deployment is paused. - type: boolean - progressDeadlineSeconds: - description: The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s. - format: int32 - type: integer - replicas: - default: 1 - description: Number of desired machines. Defaults to 1. This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - revisionHistoryLimit: - description: The number of old MachineSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1. - format: int32 - type: integer - selector: - description: Label selector for machines. Existing MachineSets whose machines are selected by this will be the ones affected by this deployment. It must match the machine template's labels. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - strategy: - description: The deployment strategy to use to replace existing machines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if MachineDeploymentStrategyType = RollingUpdate. - properties: - deletePolicy: - description: DeletePolicy defines the policy used by the MachineDeployment to identify nodes to delete when downscaling. Valid values are "Random, "Newest", "Oldest" When no value is supplied, the default DeletePolicy of MachineSet is used - enum: - - Random - - Newest - - Oldest - type: string - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of machines that can be scheduled above the desired number of machines. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 1. Example: when this is set to 30%, the new MachineSet can be scaled up immediately when the rolling update starts, such that the total number of old and new machines do not exceed 130% of desired machines. Once old machines have been killed, new MachineSet can be scaled up further, ensuring that total number of machines running at any time during the update is at most 130% of desired machines.' - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - description: 'The maximum number of machines that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 0. Example: when this is set to 30%, the old MachineSet can be scaled down to 70% of desired machines immediately when the rolling update starts. Once new machines are ready, old MachineSet can be scaled down further, followed by scaling up the new MachineSet, ensuring that the total number of machines available at all times during the update is at least 70% of desired machines.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of deployment. Default is RollingUpdate. - enum: - - RollingUpdate - - OnDelete - type: string - type: object - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: 'Specification of the desired behavior of the machine. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.DataSecretName without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDeletionTimeout: - description: NodeDeletionTimeout defines how long the controller will attempt to delete the Node that the Machine hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely. Defaults to 10 seconds. - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - - template - type: object - status: - description: MachineDeploymentStatus defines the observed state of MachineDeployment. - properties: - availableReplicas: - description: Total number of available machines (ready for at least minReadySeconds) targeted by this deployment. - format: int32 - type: integer - conditions: - description: Conditions defines current service state of the MachineDeployment. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of a MachineDeployment (ScalingUp, ScalingDown, Running, Failed, or Unknown). - type: string - readyReplicas: - description: Total number of ready machines targeted by this deployment. - format: int32 - type: integer - replicas: - description: Total number of non-terminated machines targeted by this deployment (their labels match the selector). - format: int32 - type: integer - selector: - description: 'Selector is the same as the label selector but in the string format to avoid introspection by clients. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - unavailableReplicas: - description: Total number of unavailable machines targeted by this deployment. This is the total number of machines that are still required for the deployment to have 100% available capacity. They may either be machines that are running but not yet available or machines that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: Total number of non-terminated machines targeted by this deployment that have the desired template spec. - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: machinehealthchecks.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: MachineHealthCheck - listKind: MachineHealthCheckList - plural: machinehealthchecks - shortNames: - - mhc - - mhcs - singular: machinehealthcheck - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Maximum number of unhealthy machines allowed - jsonPath: .spec.maxUnhealthy - name: MaxUnhealthy - type: string - - description: Number of machines currently monitored - jsonPath: .status.expectedMachines - name: ExpectedMachines - type: integer - - description: Current observed healthy machines - jsonPath: .status.currentHealthy - name: CurrentHealthy - type: integer - name: v1alpha3 - schema: - openAPIV3Schema: - description: MachineHealthCheck is the Schema for the machinehealthchecks API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Specification of machine health check policy - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - maxUnhealthy: - anyOf: - - type: integer - - type: string - description: Any further remediation is only allowed if at most "MaxUnhealthy" machines selected by "selector" are not healthy. - x-kubernetes-int-or-string: true - nodeStartupTimeout: - description: Machines older than this duration without a node will be considered to have failed and will be remediated. - type: string - remediationTemplate: - description: "RemediationTemplate is a reference to a remediation template provided by an infrastructure provider. \n This field is completely optional, when filled, the MachineHealthCheck controller creates a new object from the template referenced and hands off remediation of the machine to a controller that lives outside of Cluster API." - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - selector: - description: Label selector to match machines whose health will be exercised - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - unhealthyConditions: - description: UnhealthyConditions contains a list of the conditions that determine whether a node is considered unhealthy. The conditions are combined in a logical OR, i.e. if any of the conditions is met, the node is unhealthy. - items: - description: UnhealthyCondition represents a Node condition type and value with a timeout specified as a duration. When the named condition has been in the given status for at least the timeout value, a node is considered unhealthy. - properties: - status: - minLength: 1 - type: string - timeout: - type: string - type: - minLength: 1 - type: string - required: - - status - - timeout - - type - type: object - minItems: 1 - type: array - required: - - clusterName - - selector - - unhealthyConditions - type: object - status: - description: Most recently observed status of MachineHealthCheck resource - properties: - conditions: - description: Conditions defines current service state of the MachineHealthCheck. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - currentHealthy: - description: total number of healthy machines counted by this machine health check - format: int32 - minimum: 0 - type: integer - expectedMachines: - description: total number of machines counted by this machine health check - format: int32 - minimum: 0 - type: integer - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - remediationsAllowed: - description: RemediationsAllowed is the number of further remediations allowed by this machine health check before maxUnhealthy short circuiting will be applied - format: int32 - minimum: 0 - type: integer - targets: - description: Targets shows the current list of machines the machine health check is watching - items: - type: string - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Time duration since creation of MachineHealthCheck - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Maximum number of unhealthy machines allowed - jsonPath: .spec.maxUnhealthy - name: MaxUnhealthy - type: string - - description: Number of machines currently monitored - jsonPath: .status.expectedMachines - name: ExpectedMachines - type: integer - - description: Current observed healthy machines - jsonPath: .status.currentHealthy - name: CurrentHealthy - type: integer - name: v1alpha4 - schema: - openAPIV3Schema: - description: MachineHealthCheck is the Schema for the machinehealthchecks API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Specification of machine health check policy - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - maxUnhealthy: - anyOf: - - type: integer - - type: string - description: Any further remediation is only allowed if at most "MaxUnhealthy" machines selected by "selector" are not healthy. - x-kubernetes-int-or-string: true - nodeStartupTimeout: - description: Machines older than this duration without a node will be considered to have failed and will be remediated. If not set, this value is defaulted to 10 minutes. If you wish to disable this feature, set the value explicitly to 0. - type: string - remediationTemplate: - description: "RemediationTemplate is a reference to a remediation template provided by an infrastructure provider. \n This field is completely optional, when filled, the MachineHealthCheck controller creates a new object from the template referenced and hands off remediation of the machine to a controller that lives outside of Cluster API." - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - selector: - description: Label selector to match machines whose health will be exercised - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - unhealthyConditions: - description: UnhealthyConditions contains a list of the conditions that determine whether a node is considered unhealthy. The conditions are combined in a logical OR, i.e. if any of the conditions is met, the node is unhealthy. - items: - description: UnhealthyCondition represents a Node condition type and value with a timeout specified as a duration. When the named condition has been in the given status for at least the timeout value, a node is considered unhealthy. - properties: - status: - minLength: 1 - type: string - timeout: - type: string - type: - minLength: 1 - type: string - required: - - status - - timeout - - type - type: object - minItems: 1 - type: array - unhealthyRange: - description: 'Any further remediation is only allowed if the number of machines selected by "selector" as not healthy is within the range of "UnhealthyRange". Takes precedence over MaxUnhealthy. Eg. "[3-5]" - This means that remediation will be allowed only when: (a) there are at least 3 unhealthy machines (and) (b) there are at most 5 unhealthy machines' - pattern: ^\[[0-9]+-[0-9]+\]$ - type: string - required: - - clusterName - - selector - - unhealthyConditions - type: object - status: - description: Most recently observed status of MachineHealthCheck resource - properties: - conditions: - description: Conditions defines current service state of the MachineHealthCheck. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - currentHealthy: - description: total number of healthy machines counted by this machine health check - format: int32 - minimum: 0 - type: integer - expectedMachines: - description: total number of machines counted by this machine health check - format: int32 - minimum: 0 - type: integer - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - remediationsAllowed: - description: RemediationsAllowed is the number of further remediations allowed by this machine health check before maxUnhealthy short circuiting will be applied - format: int32 - minimum: 0 - type: integer - targets: - description: Targets shows the current list of machines the machine health check is watching - items: - type: string - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Number of machines currently monitored - jsonPath: .status.expectedMachines - name: ExpectedMachines - type: integer - - description: Maximum number of unhealthy machines allowed - jsonPath: .spec.maxUnhealthy - name: MaxUnhealthy - type: string - - description: Current observed healthy machines - jsonPath: .status.currentHealthy - name: CurrentHealthy - type: integer - - description: Time duration since creation of MachineHealthCheck - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: MachineHealthCheck is the Schema for the machinehealthchecks API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Specification of machine health check policy - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - maxUnhealthy: - anyOf: - - type: integer - - type: string - description: Any further remediation is only allowed if at most "MaxUnhealthy" machines selected by "selector" are not healthy. - x-kubernetes-int-or-string: true - nodeStartupTimeout: - description: Machines older than this duration without a node will be considered to have failed and will be remediated. If not set, this value is defaulted to 10 minutes. If you wish to disable this feature, set the value explicitly to 0. - type: string - remediationTemplate: - description: "RemediationTemplate is a reference to a remediation template provided by an infrastructure provider. \n This field is completely optional, when filled, the MachineHealthCheck controller creates a new object from the template referenced and hands off remediation of the machine to a controller that lives outside of Cluster API." - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - selector: - description: Label selector to match machines whose health will be exercised - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - unhealthyConditions: - description: UnhealthyConditions contains a list of the conditions that determine whether a node is considered unhealthy. The conditions are combined in a logical OR, i.e. if any of the conditions is met, the node is unhealthy. - items: - description: UnhealthyCondition represents a Node condition type and value with a timeout specified as a duration. When the named condition has been in the given status for at least the timeout value, a node is considered unhealthy. - properties: - status: - minLength: 1 - type: string - timeout: - type: string - type: - minLength: 1 - type: string - required: - - status - - timeout - - type - type: object - minItems: 1 - type: array - unhealthyRange: - description: 'Any further remediation is only allowed if the number of machines selected by "selector" as not healthy is within the range of "UnhealthyRange". Takes precedence over MaxUnhealthy. Eg. "[3-5]" - This means that remediation will be allowed only when: (a) there are at least 3 unhealthy machines (and) (b) there are at most 5 unhealthy machines' - pattern: ^\[[0-9]+-[0-9]+\]$ - type: string - required: - - clusterName - - selector - - unhealthyConditions - type: object - status: - description: Most recently observed status of MachineHealthCheck resource - properties: - conditions: - description: Conditions defines current service state of the MachineHealthCheck. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - currentHealthy: - description: total number of healthy machines counted by this machine health check - format: int32 - minimum: 0 - type: integer - expectedMachines: - description: total number of machines counted by this machine health check - format: int32 - minimum: 0 - type: integer - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - remediationsAllowed: - description: RemediationsAllowed is the number of further remediations allowed by this machine health check before maxUnhealthy short circuiting will be applied - format: int32 - minimum: 0 - type: integer - targets: - description: Targets shows the current list of machines the machine health check is watching - items: - type: string - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: machinepools.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: MachinePool - listKind: MachinePoolList - plural: machinepools - shortNames: - - mp - singular: machinepool - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: MachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: MachinePool status such as Terminating/Pending/Provisioning/Running/Failed etc - jsonPath: .status.phase - name: Phase - type: string - - description: Kubernetes version associated with this MachinePool - jsonPath: .spec.template.spec.version - name: Version - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: MachinePool is the Schema for the machinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachinePoolSpec defines the desired state of MachinePool. - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomains: - description: FailureDomains is the list of failure domains this MachinePool should be attached to. - items: - type: string - type: array - minReadySeconds: - description: Minimum number of seconds for which a newly created machine instances should be ready. Defaults to 0 (machine instance will be considered available as soon as it is ready) - format: int32 - type: integer - providerIDList: - description: ProviderIDList are the identification IDs of machine instances provided by the provider. This field must match the provider IDs as seen on the node objects corresponding to a machine pool's machine instances. - items: - type: string - type: array - replicas: - description: Number of desired machines. Defaults to 1. This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - strategy: - description: The deployment strategy to use to replace existing machine instances with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if MachineDeploymentStrategyType = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of machines that can be scheduled above the desired number of machines. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 1. Example: when this is set to 30%, the new MachineSet can be scaled up immediately when the rolling update starts, such that the total number of old and new machines do not exceed 130% of desired machines. Once old machines have been killed, new MachineSet can be scaled up further, ensuring that total number of machines running at any time during the update is at most 130% of desired machines.' - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - description: 'The maximum number of machines that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 0. Example: when this is set to 30%, the old MachineSet can be scaled down to 70% of desired machines immediately when the rolling update starts. Once new machines are ready, old MachineSet can be scaled down further, followed by scaling up the new MachineSet, ensuring that the total number of machines available at all times during the update is at least 70% of desired machines.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of deployment. Currently the only supported strategy is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - generateName: - description: "GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server. \n If this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header). \n Applied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - name: - description: "Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - namespace: - description: "Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty. \n Must be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - ownerReferences: - description: "List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller. \n Deprecated: This field has no function and is going to be removed in a next release." - items: - description: OwnerReference contains enough information to let you identify an owning object. An owning object must be in the same namespace as the dependent, or be cluster-scoped, so there is no namespace field. - properties: - apiVersion: - description: API version of the referent. - type: string - blockOwnerDeletion: - description: If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. See https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion for how the garbage collector interacts with this field and enforces the foreground deletion. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned. - type: boolean - controller: - description: If true, this reference points to the managing controller. - type: boolean - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names' - type: string - uid: - description: 'UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids' - type: string - required: - - apiVersion - - kind - - name - - uid - type: object - x-kubernetes-map-type: atomic - type: array - type: object - spec: - description: 'Specification of the desired behavior of the machine. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.Data without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - data: - description: "Data contains the bootstrap data, such as cloud-init details scripts. If nil, the Machine should remain in the Pending state. \n Deprecated: Switch to DataSecretName." - type: string - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - template - type: object - status: - description: MachinePoolStatus defines the observed state of MachinePool. - properties: - availableReplicas: - description: The number of available replicas (ready for at least minReadySeconds) for this MachinePool. - format: int32 - type: integer - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - conditions: - description: Conditions define the current service state of the MachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: FailureMessage indicates that there is a problem reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a problem reconciling the state, and will be set to a token value suitable for programmatic interpretation. - type: string - infrastructureReady: - description: InfrastructureReady is the state of the infrastructure provider. - type: boolean - nodeRefs: - description: NodeRefs will point to the corresponding Nodes if it they exist. - items: - description: 'ObjectReference contains enough information to let you inspect or modify the referred object. --- New uses of this type are discouraged because of difficulty describing its usage when embedded in APIs. 1. Ignored fields. It includes many fields which are not generally honored. For instance, ResourceVersion and FieldPath are both very rarely valid in actual usage. 2. Invalid usage help. It is impossible to add specific help for individual usage. In most embedded usages, there are particular restrictions like, "must refer only to types A and B" or "UID not honored" or "name must be restricted". Those cannot be well described when embedded. 3. Inconsistent validation. Because the usages are different, the validation rules are different by usage, which makes it hard for users to predict what will happen. 4. The fields are both imprecise and overly precise. Kind is not a precise mapping to a URL. This can produce ambiguity during interpretation and require a REST mapping. In most cases, the dependency is on the group,resource tuple and the version of the actual struct is irrelevant. 5. We cannot easily change it. Because this type is embedded in many locations, updates to this type will affect numerous schemas. Don''t make new APIs embed an underspecified API type they do not control. Instead of using this type, create a locally provided and used type that is well-focused on your reference. For example, ServiceReferences for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 .' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - type: array - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of cluster actuation. E.g. Pending, Running, Terminating, Failed etc. - type: string - readyReplicas: - description: The number of ready replicas for this MachinePool. A machine is considered ready when the node has been created and is "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - unavailableReplicas: - description: Total number of unavailable machine instances targeted by this machine pool. This is the total number of machine instances that are still required for the machine pool to have 100% available capacity. They may either be machine instances that are running but not yet available or machine instances that still have not been created. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - scale: - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of MachinePool - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: MachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: MachinePool status such as Terminating/Pending/Provisioning/Running/Failed etc - jsonPath: .status.phase - name: Phase - type: string - - description: Kubernetes version associated with this MachinePool - jsonPath: .spec.template.spec.version - name: Version - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: MachinePool is the Schema for the machinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachinePoolSpec defines the desired state of MachinePool. - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomains: - description: FailureDomains is the list of failure domains this MachinePool should be attached to. - items: - type: string - type: array - minReadySeconds: - description: Minimum number of seconds for which a newly created machine instances should be ready. Defaults to 0 (machine instance will be considered available as soon as it is ready) - format: int32 - type: integer - providerIDList: - description: ProviderIDList are the identification IDs of machine instances provided by the provider. This field must match the provider IDs as seen on the node objects corresponding to a machine pool's machine instances. - items: - type: string - type: array - replicas: - description: Number of desired machines. Defaults to 1. This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: 'Specification of the desired behavior of the machine. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.DataSecretName without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - template - type: object - status: - description: MachinePoolStatus defines the observed state of MachinePool. - properties: - availableReplicas: - description: The number of available replicas (ready for at least minReadySeconds) for this MachinePool. - format: int32 - type: integer - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - conditions: - description: Conditions define the current service state of the MachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: FailureMessage indicates that there is a problem reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a problem reconciling the state, and will be set to a token value suitable for programmatic interpretation. - type: string - infrastructureReady: - description: InfrastructureReady is the state of the infrastructure provider. - type: boolean - nodeRefs: - description: NodeRefs will point to the corresponding Nodes if it they exist. - items: - description: 'ObjectReference contains enough information to let you inspect or modify the referred object. --- New uses of this type are discouraged because of difficulty describing its usage when embedded in APIs. 1. Ignored fields. It includes many fields which are not generally honored. For instance, ResourceVersion and FieldPath are both very rarely valid in actual usage. 2. Invalid usage help. It is impossible to add specific help for individual usage. In most embedded usages, there are particular restrictions like, "must refer only to types A and B" or "UID not honored" or "name must be restricted". Those cannot be well described when embedded. 3. Inconsistent validation. Because the usages are different, the validation rules are different by usage, which makes it hard for users to predict what will happen. 4. The fields are both imprecise and overly precise. Kind is not a precise mapping to a URL. This can produce ambiguity during interpretation and require a REST mapping. In most cases, the dependency is on the group,resource tuple and the version of the actual struct is irrelevant. 5. We cannot easily change it. Because this type is embedded in many locations, updates to this type will affect numerous schemas. Don''t make new APIs embed an underspecified API type they do not control. Instead of using this type, create a locally provided and used type that is well-focused on your reference. For example, ServiceReferences for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 .' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - type: array - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of cluster actuation. E.g. Pending, Running, Terminating, Failed etc. - type: string - readyReplicas: - description: The number of ready replicas for this MachinePool. A machine is considered ready when the node has been created and is "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - unavailableReplicas: - description: Total number of unavailable machine instances targeted by this machine pool. This is the total number of machine instances that are still required for the machine pool to have 100% available capacity. They may either be machine instances that are running but not yet available or machine instances that still have not been created. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - scale: - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Total number of machines desired by this MachinePool - jsonPath: .spec.replicas - name: Desired - priority: 10 - type: integer - - description: MachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: MachinePool status such as Terminating/Pending/Provisioning/Running/Failed etc - jsonPath: .status.phase - name: Phase - type: string - - description: Time duration since creation of MachinePool - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this MachinePool - jsonPath: .spec.template.spec.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: MachinePool is the Schema for the machinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachinePoolSpec defines the desired state of MachinePool. - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomains: - description: FailureDomains is the list of failure domains this MachinePool should be attached to. - items: - type: string - type: array - minReadySeconds: - description: Minimum number of seconds for which a newly created machine instances should be ready. Defaults to 0 (machine instance will be considered available as soon as it is ready) - format: int32 - type: integer - providerIDList: - description: ProviderIDList are the identification IDs of machine instances provided by the provider. This field must match the provider IDs as seen on the node objects corresponding to a machine pool's machine instances. - items: - type: string - type: array - replicas: - description: Number of desired machines. Defaults to 1. This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - template: - description: Template describes the machines that will be created. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: 'Specification of the desired behavior of the machine. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.DataSecretName without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDeletionTimeout: - description: NodeDeletionTimeout defines how long the controller will attempt to delete the Node that the Machine hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely. Defaults to 10 seconds. - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - template - type: object - status: - description: MachinePoolStatus defines the observed state of MachinePool. - properties: - availableReplicas: - description: The number of available replicas (ready for at least minReadySeconds) for this MachinePool. - format: int32 - type: integer - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - conditions: - description: Conditions define the current service state of the MachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: FailureMessage indicates that there is a problem reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a problem reconciling the state, and will be set to a token value suitable for programmatic interpretation. - type: string - infrastructureReady: - description: InfrastructureReady is the state of the infrastructure provider. - type: boolean - nodeRefs: - description: NodeRefs will point to the corresponding Nodes if it they exist. - items: - description: 'ObjectReference contains enough information to let you inspect or modify the referred object. --- New uses of this type are discouraged because of difficulty describing its usage when embedded in APIs. 1. Ignored fields. It includes many fields which are not generally honored. For instance, ResourceVersion and FieldPath are both very rarely valid in actual usage. 2. Invalid usage help. It is impossible to add specific help for individual usage. In most embedded usages, there are particular restrictions like, "must refer only to types A and B" or "UID not honored" or "name must be restricted". Those cannot be well described when embedded. 3. Inconsistent validation. Because the usages are different, the validation rules are different by usage, which makes it hard for users to predict what will happen. 4. The fields are both imprecise and overly precise. Kind is not a precise mapping to a URL. This can produce ambiguity during interpretation and require a REST mapping. In most cases, the dependency is on the group,resource tuple and the version of the actual struct is irrelevant. 5. We cannot easily change it. Because this type is embedded in many locations, updates to this type will affect numerous schemas. Don''t make new APIs embed an underspecified API type they do not control. Instead of using this type, create a locally provided and used type that is well-focused on your reference. For example, ServiceReferences for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533 .' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - type: array - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of cluster actuation. E.g. Pending, Running, Terminating, Failed etc. - type: string - readyReplicas: - description: The number of ready replicas for this MachinePool. A machine is considered ready when the node has been created and is "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - unavailableReplicas: - description: Total number of unavailable machine instances targeted by this machine pool. This is the total number of machine instances that are still required for the machine pool to have 100% available capacity. They may either be machine instances that are running but not yet available or machine instances that still have not been created. - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - scale: - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: machines.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: Machine - listKind: MachineList - plural: machines - shortNames: - - ma - singular: machine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Provider ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine status such as Terminating/Pending/Running/Failed etc - jsonPath: .status.phase - name: Phase - type: string - - description: Kubernetes version associated with this Machine - jsonPath: .spec.version - name: Version - type: string - - description: Node name associated with this machine - jsonPath: .status.nodeRef.name - name: NodeName - priority: 1 - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: Machine is the Schema for the machines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachineSpec defines the desired state of Machine. - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.Data without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - data: - description: "Data contains the bootstrap data, such as cloud-init details scripts. If nil, the Machine should remain in the Pending state. \n Deprecated: Switch to DataSecretName." - type: string - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - status: - description: MachineStatus defines the observed state of Machine. - properties: - addresses: - description: Addresses is a list of addresses assigned to the machine. This field is copied from the infrastructure provider reference. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - conditions: - description: Conditions defines current service state of the Machine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - infrastructureReady: - description: InfrastructureReady is the state of the infrastructure provider. - type: boolean - lastUpdated: - description: LastUpdated identifies when the phase of the Machine last transitioned. - format: date-time - type: string - nodeRef: - description: NodeRef will point to the corresponding Node if it exists. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of machine actuation. E.g. Pending, Running, Terminating, Failed etc. - type: string - version: - description: Version specifies the current version of Kubernetes running on the corresponding Node. This is meant to be a means of bubbling up status from the Node to the Machine. It is entirely optional, but useful for end-user UX if it’s present. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Provider ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine status such as Terminating/Pending/Running/Failed etc - jsonPath: .status.phase - name: Phase - type: string - - description: Kubernetes version associated with this Machine - jsonPath: .spec.version - name: Version - type: string - - description: Node name associated with this machine - jsonPath: .status.nodeRef.name - name: NodeName - priority: 1 - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: Machine is the Schema for the machines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachineSpec defines the desired state of Machine. - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.DataSecretName without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - status: - description: MachineStatus defines the observed state of Machine. - properties: - addresses: - description: Addresses is a list of addresses assigned to the machine. This field is copied from the infrastructure provider reference. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - conditions: - description: Conditions defines current service state of the Machine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - infrastructureReady: - description: InfrastructureReady is the state of the infrastructure provider. - type: boolean - lastUpdated: - description: LastUpdated identifies when the phase of the Machine last transitioned. - format: date-time - type: string - nodeInfo: - description: 'NodeInfo is a set of ids/uuids to uniquely identify the node. More info: https://kubernetes.io/docs/concepts/nodes/node/#info' - properties: - architecture: - description: The Architecture reported by the node - type: string - bootID: - description: Boot ID reported by the node. - type: string - containerRuntimeVersion: - description: ContainerRuntime Version reported by the node through runtime remote API (e.g. containerd://1.4.2). - type: string - kernelVersion: - description: Kernel Version reported by the node from 'uname -r' (e.g. 3.16.0-0.bpo.4-amd64). - type: string - kubeProxyVersion: - description: KubeProxy Version reported by the node. - type: string - kubeletVersion: - description: Kubelet Version reported by the node. - type: string - machineID: - description: 'MachineID reported by the node. For unique machine identification in the cluster this field is preferred. Learn more from man(5) machine-id: http://man7.org/linux/man-pages/man5/machine-id.5.html' - type: string - operatingSystem: - description: The Operating System reported by the node - type: string - osImage: - description: OS Image reported by the node from /etc/os-release (e.g. Debian GNU/Linux 7 (wheezy)). - type: string - systemUUID: - description: SystemUUID reported by the node. For unique machine identification MachineID is preferred. This field is specific to Red Hat hosts https://access.redhat.com/documentation/en-us/red_hat_subscription_management/1/html/rhsm/uuid - type: string - required: - - architecture - - bootID - - containerRuntimeVersion - - kernelVersion - - kubeProxyVersion - - kubeletVersion - - machineID - - operatingSystem - - osImage - - systemUUID - type: object - nodeRef: - description: NodeRef will point to the corresponding Node if it exists. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of machine actuation. E.g. Pending, Running, Terminating, Failed etc. - type: string - version: - description: Version specifies the current version of Kubernetes running on the corresponding Node. This is meant to be a means of bubbling up status from the Node to the Machine. It is entirely optional, but useful for end-user UX if it’s present. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Node name associated with this machine - jsonPath: .status.nodeRef.name - name: NodeName - type: string - - description: Provider ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine status such as Terminating/Pending/Running/Failed etc - jsonPath: .status.phase - name: Phase - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this Machine - jsonPath: .spec.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: Machine is the Schema for the machines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachineSpec defines the desired state of Machine. - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.DataSecretName without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDeletionTimeout: - description: NodeDeletionTimeout defines how long the controller will attempt to delete the Node that the Machine hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely. Defaults to 10 seconds. - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - status: - description: MachineStatus defines the observed state of Machine. - properties: - addresses: - description: Addresses is a list of addresses assigned to the machine. This field is copied from the infrastructure provider reference. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapReady: - description: BootstrapReady is the state of the bootstrap provider. - type: boolean - certificatesExpiryDate: - description: CertificatesExpiryDate is the expiry date of the machine certificates. This value is only set for control plane machines. - format: date-time - type: string - conditions: - description: Conditions defines current service state of the Machine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - infrastructureReady: - description: InfrastructureReady is the state of the infrastructure provider. - type: boolean - lastUpdated: - description: LastUpdated identifies when the phase of the Machine last transitioned. - format: date-time - type: string - nodeInfo: - description: 'NodeInfo is a set of ids/uuids to uniquely identify the node. More info: https://kubernetes.io/docs/concepts/nodes/node/#info' - properties: - architecture: - description: The Architecture reported by the node - type: string - bootID: - description: Boot ID reported by the node. - type: string - containerRuntimeVersion: - description: ContainerRuntime Version reported by the node through runtime remote API (e.g. containerd://1.4.2). - type: string - kernelVersion: - description: Kernel Version reported by the node from 'uname -r' (e.g. 3.16.0-0.bpo.4-amd64). - type: string - kubeProxyVersion: - description: KubeProxy Version reported by the node. - type: string - kubeletVersion: - description: Kubelet Version reported by the node. - type: string - machineID: - description: 'MachineID reported by the node. For unique machine identification in the cluster this field is preferred. Learn more from man(5) machine-id: http://man7.org/linux/man-pages/man5/machine-id.5.html' - type: string - operatingSystem: - description: The Operating System reported by the node - type: string - osImage: - description: OS Image reported by the node from /etc/os-release (e.g. Debian GNU/Linux 7 (wheezy)). - type: string - systemUUID: - description: SystemUUID reported by the node. For unique machine identification MachineID is preferred. This field is specific to Red Hat hosts https://access.redhat.com/documentation/en-us/red_hat_subscription_management/1/html/rhsm/uuid - type: string - required: - - architecture - - bootID - - containerRuntimeVersion - - kernelVersion - - kubeProxyVersion - - kubeletVersion - - machineID - - operatingSystem - - osImage - - systemUUID - type: object - nodeRef: - description: NodeRef will point to the corresponding Node if it exists. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - phase: - description: Phase represents the current phase of machine actuation. E.g. Pending, Running, Terminating, Failed etc. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: cluster-api - name: machinesets.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-webhook-service - namespace: capi-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: cluster.x-k8s.io - names: - categories: - - cluster-api - kind: MachineSet - listKind: MachineSetList - plural: machinesets - shortNames: - - ms - singular: machineset - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Total number of non-terminated machines targeted by this machineset - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of available machines (ready for at least minReadySeconds) - jsonPath: .status.availableReplicas - name: Available - type: integer - - description: Total number of ready machines targeted by this machineset. - jsonPath: .status.readyReplicas - name: Ready - type: integer - name: v1alpha3 - schema: - openAPIV3Schema: - description: MachineSet is the Schema for the machinesets API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachineSetSpec defines the desired state of MachineSet. - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - deletePolicy: - description: DeletePolicy defines the policy used to identify nodes to delete when downscaling. Defaults to "Random". Valid values are "Random, "Newest", "Oldest" - enum: - - Random - - Newest - - Oldest - type: string - minReadySeconds: - description: MinReadySeconds is the minimum number of seconds for which a newly created machine should be ready. Defaults to 0 (machine will be considered available as soon as it is ready) - format: int32 - type: integer - replicas: - description: Replicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Defaults to 1. - format: int32 - type: integer - selector: - description: 'Selector is a label query over machines that should match the replica count. Label keys and values that must match in order to be controlled by this MachineSet. It must match the machine template''s labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors' - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - template: - description: Template is the object that describes the machine that will be created if insufficient replicas are detected. Object references to custom resources resources are treated as templates. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - generateName: - description: "GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server. \n If this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header). \n Applied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - name: - description: "Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - namespace: - description: "Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty. \n Must be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - ownerReferences: - description: "List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller. \n Deprecated: This field has no function and is going to be removed in a next release." - items: - description: OwnerReference contains enough information to let you identify an owning object. An owning object must be in the same namespace as the dependent, or be cluster-scoped, so there is no namespace field. - properties: - apiVersion: - description: API version of the referent. - type: string - blockOwnerDeletion: - description: If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. See https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion for how the garbage collector interacts with this field and enforces the foreground deletion. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned. - type: boolean - controller: - description: If true, this reference points to the managing controller. - type: boolean - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names' - type: string - uid: - description: 'UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids' - type: string - required: - - apiVersion - - kind - - name - - uid - type: object - x-kubernetes-map-type: atomic - type: array - type: object - spec: - description: 'Specification of the desired behavior of the machine. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.Data without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - data: - description: "Data contains the bootstrap data, such as cloud-init details scripts. If nil, the Machine should remain in the Pending state. \n Deprecated: Switch to DataSecretName." - type: string - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - type: object - status: - description: MachineSetStatus defines the observed state of MachineSet. - properties: - availableReplicas: - description: The number of available replicas (ready for at least minReadySeconds) for this MachineSet. - format: int32 - type: integer - failureMessage: - type: string - failureReason: - description: "In the event that there is a terminal problem reconciling the replicas, both FailureReason and FailureMessage will be set. FailureReason will be populated with a succinct value suitable for machine interpretation, while FailureMessage will contain a more verbose string suitable for logging and human consumption. \n These fields should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachineTemplate's spec or the configuration of the machine controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the machine controller, or the responsible machine controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the MachineSet object and/or logged in the controller's output." - type: string - fullyLabeledReplicas: - description: The number of replicas that have labels matching the labels of the machine template of the MachineSet. - format: int32 - type: integer - observedGeneration: - description: ObservedGeneration reflects the generation of the most recently observed MachineSet. - format: int64 - type: integer - readyReplicas: - description: The number of ready replicas for this MachineSet. A machine is considered ready when the node has been created and is "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - selector: - description: 'Selector is the same as the label selector but in the string format to avoid introspection by clients. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Time duration since creation of MachineSet - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Total number of non-terminated machines targeted by this machineset - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of available machines (ready for at least minReadySeconds) - jsonPath: .status.availableReplicas - name: Available - type: integer - - description: Total number of ready machines targeted by this machineset. - jsonPath: .status.readyReplicas - name: Ready - type: integer - name: v1alpha4 - schema: - openAPIV3Schema: - description: MachineSet is the Schema for the machinesets API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachineSetSpec defines the desired state of MachineSet. - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - deletePolicy: - description: DeletePolicy defines the policy used to identify nodes to delete when downscaling. Defaults to "Random". Valid values are "Random, "Newest", "Oldest" - enum: - - Random - - Newest - - Oldest - type: string - minReadySeconds: - description: MinReadySeconds is the minimum number of seconds for which a newly created machine should be ready. Defaults to 0 (machine will be considered available as soon as it is ready) - format: int32 - type: integer - replicas: - default: 1 - description: Replicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Defaults to 1. - format: int32 - type: integer - selector: - description: 'Selector is a label query over machines that should match the replica count. Label keys and values that must match in order to be controlled by this MachineSet. It must match the machine template''s labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors' - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - template: - description: Template is the object that describes the machine that will be created if insufficient replicas are detected. Object references to custom resources resources are treated as templates. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: 'Specification of the desired behavior of the machine. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.DataSecretName without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - type: object - status: - description: MachineSetStatus defines the observed state of MachineSet. - properties: - availableReplicas: - description: The number of available replicas (ready for at least minReadySeconds) for this MachineSet. - format: int32 - type: integer - conditions: - description: Conditions defines current service state of the MachineSet. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - type: string - failureReason: - description: "In the event that there is a terminal problem reconciling the replicas, both FailureReason and FailureMessage will be set. FailureReason will be populated with a succinct value suitable for machine interpretation, while FailureMessage will contain a more verbose string suitable for logging and human consumption. \n These fields should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachineTemplate's spec or the configuration of the machine controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the machine controller, or the responsible machine controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the MachineSet object and/or logged in the controller's output." - type: string - fullyLabeledReplicas: - description: The number of replicas that have labels matching the labels of the machine template of the MachineSet. - format: int32 - type: integer - observedGeneration: - description: ObservedGeneration reflects the generation of the most recently observed MachineSet. - format: int64 - type: integer - readyReplicas: - description: The number of ready replicas for this MachineSet. A machine is considered ready when the node has been created and is "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - selector: - description: 'Selector is the same as the label selector but in the string format to avoid introspection by clients. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .spec.clusterName - name: Cluster - type: string - - description: Total number of machines desired by this machineset - jsonPath: .spec.replicas - name: Desired - priority: 10 - type: integer - - description: Total number of non-terminated machines targeted by this machineset - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of ready machines targeted by this machineset. - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: Total number of available machines (ready for at least minReadySeconds) - jsonPath: .status.availableReplicas - name: Available - type: integer - - description: Time duration since creation of MachineSet - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this MachineSet - jsonPath: .spec.template.spec.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: MachineSet is the Schema for the machinesets API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: MachineSetSpec defines the desired state of MachineSet. - properties: - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - deletePolicy: - description: DeletePolicy defines the policy used to identify nodes to delete when downscaling. Defaults to "Random". Valid values are "Random, "Newest", "Oldest" - enum: - - Random - - Newest - - Oldest - type: string - minReadySeconds: - description: MinReadySeconds is the minimum number of seconds for which a newly created machine should be ready. Defaults to 0 (machine will be considered available as soon as it is ready) - format: int32 - type: integer - replicas: - default: 1 - description: Replicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Defaults to 1. - format: int32 - type: integer - selector: - description: 'Selector is a label query over machines that should match the replica count. Label keys and values that must match in order to be controlled by this MachineSet. It must match the machine template''s labels. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors' - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - template: - description: Template is the object that describes the machine that will be created if insufficient replicas are detected. Object references to custom resources resources are treated as templates. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: 'Specification of the desired behavior of the machine. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' - properties: - bootstrap: - description: Bootstrap is a reference to a local struct which encapsulates fields to configure the Machine’s bootstrapping mechanism. - properties: - configRef: - description: ConfigRef is a reference to a bootstrap provider-specific resource that holds configuration details. The reference is optional to allow users/operators to specify Bootstrap.DataSecretName without the need of a controller. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. If nil, the Machine should remain in the Pending state. - type: string - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - nodeDeletionTimeout: - description: NodeDeletionTimeout defines how long the controller will attempt to delete the Node that the Machine hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely. Defaults to 10 seconds. - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the machine provided by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level entities like autoscaler that will be interfacing with cluster-api as generic provider. - type: string - version: - description: Version defines the desired Kubernetes version. This field is meant to be optionally used by bootstrap providers. - type: string - required: - - bootstrap - - clusterName - - infrastructureRef - type: object - type: object - required: - - clusterName - - selector - type: object - status: - description: MachineSetStatus defines the observed state of MachineSet. - properties: - availableReplicas: - description: The number of available replicas (ready for at least minReadySeconds) for this MachineSet. - format: int32 - type: integer - conditions: - description: Conditions defines current service state of the MachineSet. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - type: string - failureReason: - description: "In the event that there is a terminal problem reconciling the replicas, both FailureReason and FailureMessage will be set. FailureReason will be populated with a succinct value suitable for machine interpretation, while FailureMessage will contain a more verbose string suitable for logging and human consumption. \n These fields should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachineTemplate's spec or the configuration of the machine controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the machine controller, or the responsible machine controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the MachineSet object and/or logged in the controller's output." - type: string - fullyLabeledReplicas: - description: The number of replicas that have labels matching the labels of the machine template of the MachineSet. - format: int32 - type: integer - observedGeneration: - description: ObservedGeneration reflects the generation of the most recently observed MachineSet. - format: int64 - type: integer - readyReplicas: - description: The number of ready replicas for this MachineSet. A machine is considered ready when the node has been created and is "Ready". - format: int32 - type: integer - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - selector: - description: 'Selector is the same as the label selector but in the string format to avoid introspection by clients. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - type: object - type: object - served: true - storage: true - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-manager - namespace: capi-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-leader-election-role - namespace: capi-system -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -aggregationRule: - clusterRoleSelectors: - - matchLabels: - cluster.x-k8s.io/aggregate-to-manager: "true" -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-aggregated-manager-role -rules: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/aggregate-to-manager: "true" - cluster.x-k8s.io/provider: cluster-api - name: capi-manager-role -rules: -- apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch -- apiGroups: - - addons.cluster.x-k8s.io - resources: - - '*' - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - addons.cluster.x-k8s.io - resources: - - clusterresourcesets/finalizers - - clusterresourcesets/status - verbs: - - get - - patch - - update -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - get - - list - - watch -- apiGroups: - - bootstrap.cluster.x-k8s.io - - controlplane.cluster.x-k8s.io - - infrastructure.cluster.x-k8s.io - resources: - - '*' - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - bootstrap.cluster.x-k8s.io - - infrastructure.cluster.x-k8s.io - resources: - - '*' - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusterclasses - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/finalizers - - clusters/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - - machinedeployments/finalizers - verbs: - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - - machinedeployments/finalizers - - machinedeployments/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinehealthchecks - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinehealthchecks - - machinehealthchecks/finalizers - - machinehealthchecks/status - verbs: - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - - machinepools/finalizers - - machinepools/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/finalizers - - machines/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/status - verbs: - - delete - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinesets - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinesets - - machinesets/finalizers - verbs: - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinesets - - machinesets/finalizers - - machinesets/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - patch - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - watch -- apiGroups: - - "" - resources: - - nodes - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - watch -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddressclaims - verbs: - - get - - list - - watch -- apiGroups: - - runtime.cluster.x-k8s.io - resources: - - extensionconfigs - - extensionconfigs/status - verbs: - - get - - list - - patch - - update - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-leader-election-rolebinding - namespace: capi-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capi-leader-election-role -subjects: -- kind: ServiceAccount - name: capi-manager - namespace: capi-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capi-aggregated-manager-role -subjects: -- kind: ServiceAccount - name: capi-manager - namespace: capi-system ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-webhook-service - namespace: capi-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: cluster-api ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - control-plane: controller-manager - name: capi-controller-manager - namespace: capi-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: cluster-api - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --metrics-bind-addr=localhost:8080 - - --feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},ClusterResourceSet=${EXP_CLUSTER_RESOURCE_SET:=true},ClusterTopology=${CLUSTER_TOPOLOGY:=true},RuntimeSDK=${EXP_RUNTIME_SDK:=false} - command: - - /manager - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_UID - valueFrom: - fieldRef: - fieldPath: metadata.uid - image: registry.tkg.vmware.run/cluster-api/cluster-api-controller:${CAPI_CONTROLLER_IMAGE_TAG} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - serviceAccountName: capi-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - secretName: capi-webhook-service-cert - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-serving-cert - namespace: capi-system -spec: - dnsNames: - - capi-webhook-service.capi-system.svc - - capi-webhook-service.capi-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capi-selfsigned-issuer - secretName: capi-webhook-service-cert - subject: - organizations: - - k8s-sig-cluster-lifecycle ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-selfsigned-issuer - namespace: capi-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-machine - failurePolicy: Fail - matchPolicy: Equivalent - name: default.machine.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-machinedeployment - failurePolicy: Fail - matchPolicy: Equivalent - name: default.machinedeployment.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinedeployments - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-machinehealthcheck - failurePolicy: Fail - matchPolicy: Equivalent - name: default.machinehealthcheck.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinehealthchecks - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-machineset - failurePolicy: Fail - matchPolicy: Equivalent - name: default.machineset.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinesets - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-cluster - failurePolicy: Fail - matchPolicy: Equivalent - name: default.cluster.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - clusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-clusterclass - failurePolicy: Fail - matchPolicy: Equivalent - name: default.clusterclass.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - clusterclasses - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-runtime-cluster-x-k8s-io-v1alpha1-extensionconfig - failurePolicy: Fail - matchPolicy: Equivalent - name: default.extensionconfig.runtime.addons.cluster.x-k8s.io - rules: - - apiGroups: - - runtime.cluster.x-k8s.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - extensionconfigs - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-cluster-x-k8s-io-v1beta1-machinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: default.machinepool.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /mutate-addons-cluster-x-k8s-io-v1beta1-clusterresourceset - failurePolicy: Fail - matchPolicy: Equivalent - name: default.clusterresourceset.addons.cluster.x-k8s.io - rules: - - apiGroups: - - addons.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - clusterresourcesets - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-system/capi-serving-cert - labels: - cluster.x-k8s.io/provider: cluster-api - name: capi-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-machine - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.machine.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-machinedeployment - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.machinedeployment.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinedeployments - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-machinehealthcheck - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.machinehealthcheck.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinehealthchecks - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-machineset - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.machineset.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinesets - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-cluster - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.cluster.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - clusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-clusterclass - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.clusterclass.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - clusterclasses - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-runtime-cluster-x-k8s-io-v1alpha1-extensionconfig - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.extensionconfig.runtime.cluster.x-k8s.io - rules: - - apiGroups: - - runtime.cluster.x-k8s.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - extensionconfigs - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-cluster-x-k8s-io-v1beta1-machinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.machinepool.cluster.x-k8s.io - rules: - - apiGroups: - - cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - machinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-addons-cluster-x-k8s-io-v1beta1-clusterresourceset - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.clusterresourceset.addons.cluster.x-k8s.io - rules: - - apiGroups: - - addons.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - clusterresourcesets - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-ipam-cluster-x-k8s-io-v1alpha1-ipaddress - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.ipaddress.ipam.cluster.x-k8s.io - rules: - - apiGroups: - - ipam.cluster.x-k8s.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - ipaddresses - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-webhook-service - namespace: capi-system - path: /validate-ipam-cluster-x-k8s-io-v1alpha1-ipaddressclaim - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.ipaddressclaim.ipam.cluster.x-k8s.io - rules: - - apiGroups: - - ipam.cluster.x-k8s.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - ipaddressclaims - sideEffects: None diff --git a/providers/cluster-api/v1.2.8/metadata.yaml b/providers/cluster-api/v1.2.8/metadata.yaml deleted file mode 100644 index 6957197b7b..0000000000 --- a/providers/cluster-api/v1.2.8/metadata.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: -- major: 1 - minor: 2 - contract: v1beta1 -- major: 1 - minor: 1 - contract: v1beta1 -- major: 1 - minor: 0 - contract: v1beta1 -- major: 0 - minor: 4 - contract: v1alpha4 -- major: 0 - minor: 3 - contract: v1alpha3 diff --git a/providers/config.yaml b/providers/config.yaml deleted file mode 100644 index f18f842848..0000000000 --- a/providers/config.yaml +++ /dev/null @@ -1,34 +0,0 @@ -providers: -- name: cluster-api - url: providers/cluster-api/v1.2.8/core-components.yaml - type: CoreProvider -- name: aws - url: providers/infrastructure-aws/v2.0.2/infrastructure-components.yaml - type: InfrastructureProvider -- name: vsphere - url: providers/infrastructure-vsphere/v1.5.3/infrastructure-components.yaml - type: InfrastructureProvider -- name: azure - url: providers/infrastructure-azure/v1.6.3/infrastructure-components.yaml - type: InfrastructureProvider -- name: tkg-service-vsphere - url: providers/infrastructure-tkg-service-vsphere/v1.1.0/unused.yaml - type: InfrastructureProvider -- name: oci - url: providers/infrastructure-oci/v0.4.0/infrastructure-components.yaml - type: InfrastructureProvider -- name: kubeadm - url: providers/bootstrap-kubeadm/v1.2.8/bootstrap-components.yaml - type: BootstrapProvider -- name: kubeadm - url: providers/control-plane-kubeadm/v1.2.8/control-plane-components.yaml - type: ControlPlaneProvider -- name: docker - url: providers/infrastructure-docker/v1.2.8/infrastructure-components.yaml - type: InfrastructureProvider -- name: ipam-in-cluster - url: providers/infrastructure-ipam-in-cluster/v0.1.0/ipam-components.yaml - type: InfrastructureProvider -cert-manager: - url: providers/cert-manager/v1.10.2/cert-manager.yaml - version: "v1.10.2" diff --git a/providers/config_default.yaml b/providers/config_default.yaml deleted file mode 100644 index 31384c0d7d..0000000000 --- a/providers/config_default.yaml +++ /dev/null @@ -1,843 +0,0 @@ -#@data/values - -#@overlay/match-child-defaults missing_ok=True ---- - -#! --------------------------------------------------------------------- -#! List of variables used in cluster configuration and their default -#! values, where available. It is recommended that overrides to any of -#! these values be done is the cluster configuration file instead. -#! --------------------------------------------------------------------- - - - -#! --------------------------------------------------------------------- -#! Cluster creation basic configuration -#! --------------------------------------------------------------------- -#! Cluster name to use when deploying cluster. -#! CLUSTER_NAME is required while creating workload cluster -CLUSTER_NAME: -#! Plan to use when creating cluster. Supported values 'dev', 'prod' -CLUSTER_PLAN: -#! Namespace to use to deploy workload cluster -#! if not provided `default` namespace will be used for workload cluster -NAMESPACE: -#! Supported infrastructure provider values are 'vsphere', 'aws', 'azure' -#! INFRASTRUCTURE_PROVIDER is required while creating management cluster -INFRASTRUCTURE_PROVIDER: -#! API Server Port number to be configured for the cluster. -#! if not provided default 6443 would be used. -#! if AVI load balancer is used for vSphere provider, VSPHERE_CONTROL_PLANE_ENDPOINT_PORT would -#! be used instead -CLUSTER_API_SERVER_PORT: - -CLUSTER_CLASS: - -#! ALLOW_LEGACY_CLUSTER will allow legacy based workload cluster creation. -#! Supported values are "false", "true". By default, it's "false". -ALLOW_LEGACY_CLUSTER: - -#! Instance size configuration -#! Instance size options available for vSphere are as follows: -#! vSphere: [extra-large,large,medium,small] - -#! Specify size for all nodes including control plane and worker nodes. -#! It can be overridden by CONTROLPLANE_SIZE and WORKER_SIZE config variables -SIZE: -#! Specify size for the control plane node -CONTROLPLANE_SIZE: -#! Specify size of the worker node -WORKER_SIZE: -#! Enable certificates automatic renewal for the control plane node -CONTROLPLANE_CERTIFICATE_ROTATION_ENABLED: true -#! Specify certificatesExpiryDays for the control plane node -CONTROLPLANE_CERTIFICATE_ROTATION_DAYS_BEFORE: 90 - -#! Management cluster creation specific configuration, does not apply to workload clusters - -#! VMware's Customer Experience Improvement Program ("CEIP") provides VMware with information that enables -#! VMware to improve its products and services and fix problems. By choosing to participate in CEIP, you agree that -#! VMware may collect technical information about your use of VMware products and services on a regular basis. This -#! information does not personally identify you. -#! Specify if this management cluster should participate in VMware CEIP. (default true) -ENABLE_CEIP_PARTICIPATION: -#! Deploy TKG Management cluster on vSphere 7.0 without prompt -DEPLOY_TKG_ON_VSPHERE7: -#! Enable TKGS on vSphere 7.0 without prompt -ENABLE_TKGS_ON_VSPHERE7: - -#! BUILD_EDITION is the Tanzu Edition, the plugin should be built for. -#! Valid values for BUILD_EDITION are 'tce' and 'tkg'. -BUILD_EDITION: - -#! ETCD_EXTRA_ARGS specified etcd flags. -#! It should be of the format "key1=value1;key2=value2". -#! E.g. "heartbeat-interval=300;election-timeout=2000" -ETCD_EXTRA_ARGS: - -#! APISERVER_EXTRA_ARGS specified kube api server flags. -#! It should be of the format "key1=value1;key2=value2". -#! E.g. "tls-min-version=VersionTLS12;tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256" -APISERVER_EXTRA_ARGS: - -#! KUBE_SCHEDULER_EXTRA_ARGS specified kube scheduler flags. -#! It should be of the format "key1=value1;key2=value2". -#! E.g. "tls-min-version=VersionTLS12;profiling=false" -KUBE_SCHEDULER_EXTRA_ARGS: - -#! KUBE_CONTROLLER_MANAGER_EXTRA_ARGS specified kube controller manager flags. -#! It should be of the format "key1=value1;key2=value2". -#! E.g. "tls-min-version=VersionTLS12;profiling=false" -KUBE_CONTROLLER_MANAGER_EXTRA_ARGS: - -#! CONTROLPLANE_KUBELET_EXTRA_ARGS specified kubelet flags for control plane nodes. -#! It should be of the format "key1=value1;key2=value2". -#! E.g. "read-only-port=0;event-qps=0" -CONTROLPLANE_KUBELET_EXTRA_ARGS: - -#! WORKER_KUBELET_EXTRA_ARGS specified kubelet flags for worker nodes. -#! It should be of the format "key1=value1;key2=value2". -#! E.g. "read-only-port=0;event-qps=0" -WORKER_KUBELET_EXTRA_ARGS: - -#! --------------------------------------------------------------------- -#! Settings for vSphere infrastructure provider -#! --------------------------------------------------------------------- - -#! CPU,disk,memory values to be used for creating cluster VMs -#! this can be overridden by defining the VSPHERE_WORKER_DISK_GIB for the workers -#! and VSPHERE_CONTROL_PLANE_DISK_GIB for the control plane -VSPHERE_NUM_CPUS: 2 -VSPHERE_DISK_GIB: 40 -VSPHERE_MEM_MIB: 4096 - -#! Specific overrides of the above settings that only apply control plane -#! or worker nodes -VSPHERE_CONTROL_PLANE_NUM_CPUS: 2 -VSPHERE_CONTROL_PLANE_DISK_GIB: 40 -VSPHERE_CONTROL_PLANE_MEM_MIB: 8192 - -VSPHERE_WORKER_NUM_CPUS: 2 -VSPHERE_WORKER_DISK_GIB: 40 -VSPHERE_WORKER_MEM_MIB: 4096 - -VSPHERE_CLONE_MODE: "fullClone" - -#! The network portgroup to assign each VM node -VSPHERE_NETWORK: VM Network - -#! The name of the VM template to be used to create a specific version of a Tanzu -#! Kubernetes Cluster. Since the appropriate template is automatically -#! discovered from the vCenter inventory, the use of this setting is no longer -#! necessary except to disambiguate among 2 or more applicable VM templates. -VSPHERE_TEMPLATE: -VSPHERE_TEMPLATE_MOID: - -#! WINDOWS PARAMETERS -#! The name of the VM Windows template to be used to create a specific version of -#! a Tanzu Kubernetes Cluster including WINDOWS node. -VSPHERE_WINDOWS_TEMPLATE: "" -IS_WINDOWS_WORKLOAD_CLUSTER: false - -VIP_NETWORK_INTERFACE: "eth0" - -#! The contents of the public key to be injected into the VM nodes created -VSPHERE_SSH_AUTHORIZED_KEY: -VSPHERE_USERNAME: -VSPHERE_PASSWORD: - -#! The content of zone and region information is used to deploy CPI and CSI in a -#! vSphere environment that includes multiple data centers or host clusters. -VSPHERE_REGION: -VSPHERE_ZONE: - -VSPHERE_AZ_0: -VSPHERE_AZ_1: -VSPHERE_AZ_2: - -#! FQDN or IP address to vCenter -VSPHERE_SERVER: - -#! Full inventory path or names are supported for the following -#! the former is required if there are multiple entities of the same type and -#! name in the VC inventory. -VSPHERE_DATACENTER: -#! Name of an existing resource pool in which to place this Tanzu Kubernetes cluster -VSPHERE_RESOURCE_POOL: -#! Name of the vSphere datastore to deploy the Tanzu Kubernetes cluster -#! as it appears in the vSphere inventory -VSPHERE_DATASTORE: -#! name of an existing VM folder in which to place Tanzu Kubernetes Grid VMs -VSPHERE_FOLDER: -VSPHERE_STORAGE_POLICY_ID: "" - -#! Device and vendor ids for GPU PCI passthrough support -#! VSPHERE_WORKER_PCI_DEVICES, if set will configure PCI passthrough on all worker machines -#! VSPHERE_WORKER_PCI_DEVICES must be specified in the format 0x:0x -#! e.g. VSPHERE_WORKER_PCI_DEVICES: "0x10DE:0x1EB8" -VSPHERE_WORKER_PCI_DEVICES: -#! VSPHERE_CONTROL_PLANE_PCI_DEVICES, if set will configure PCI passthrough on all control plane machines -#! VSPHERE_CONTROL_PLANE_PCI_DEVICES must be specified in the format : -#! e.g. VSPHERE_CONTROL_PLANE_PCI_DEVICES: "0x10DE:0x1EB8" -VSPHERE_CONTROL_PLANE_PCI_DEVICES: -#! VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST, if set to true will allow other PCI devices to be passed through -#! other than NVIDIA T4 (i.e. "0x10DE:0x1EB8") -VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST: -#! VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS, if set will set custom VMX keys on all control plane machines -#! Keys must be set in the form =,= -VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS: -#! VSPHERE_WORKER_CUSTOM_VMX_KEYS, if set will set custom VMX keys on all worker machines -#! Keys must be set in the form =,= -VSPHERE_WORKER_CUSTOM_VMX_KEYS: -#! WORKER_ROLLOUT_STRATEGY configures the MachineDeployment rollout strategy. If set to OnDelete, -#! on updates, the existing worker machines will be deleted *first* before the replacement worker machines are created. -WORKER_ROLLOUT_STRATEGY: "RollingUpdate" - -#! Customizable hardware version for VMs -#! This is used to explicitly upgrade the hardware version of the VM after the clone operation succeeds. -#! The version should be higher than the vmx_version property of the OVA. -#! If unset, the hardware version defaults to the proprty in the OVA. -#! VSPHERE_CONTROL_PLANE_HARDWARE_VERSION configures the hardware version of the control plane nodes. -#! e.g. VSPHERE_CONTROL_PLANE_HARDWARE_VERSION: "vmx-17" -VSPHERE_CONTROL_PLANE_HARDWARE_VERSION: -#! VSPHERE_WORKER_HARDWARE_VERSION configures the hardware version of the worker nodes. -#! e.g. VSPHERE_WORKER_HARDWARE_VERSION: "vmx-17" -VSPHERE_WORKER_HARDWARE_VERSION: - -#! Thumbprint of the vCenter server specified with VSPHERE_SERVER config variable -#! this value can be skipped if user wants to use insecure connection -#! by setting VSPHERE_INSECURE to true -VSPHERE_TLS_THUMBPRINT: "" -VSPHERE_INSECURE: false -#! Virtual IP address or FQDN for the cluster's control plane nodes -VSPHERE_CONTROL_PLANE_ENDPOINT: -VSPHERE_CONTROL_PLANE_ENDPOINT_PORT: 6443 -VSPHERE_ADDITIONAL_FQDN: -#! NSX-T specific configurations for enabling NSX-T routable pods -#! set this to true to enable NSX-T routable pods -NSXT_POD_ROUTING_ENABLED: false -NSXT_ROUTER_PATH: "" -#! NSX-T username -NSXT_USERNAME: "" -#! NSX-T password -NSXT_PASSWORD: "" -#! NSX-T host -NSXT_MANAGER_HOST: "" -#! set this to true if NSX-T uses self-signed cert -NSXT_ALLOW_UNVERIFIED_SSL: "false" -#! set this to true if NSX-T uses remote authentication (authentication done through the vIDM) -NSXT_REMOTE_AUTH: "false" -NSXT_VMC_ACCESS_TOKEN: "" -NSXT_VMC_AUTH_HOST: "" -NSXT_CLIENT_CERT_KEY_DATA: "" -NSXT_CLIENT_CERT_DATA: "" -NSXT_ROOT_CA_DATA_B64: "" -#! SecretName is the secret name for NSX-T username and password -NSXT_SECRET_NAME: "cloud-provider-vsphere-nsxt-credentials" -#! SecretNamespace is the secret namespace for NSX-T username and password -NSXT_SECRET_NAMESPACE: "kube-system" - - - -#! --------------------------------------------------------------------- -#! Settings for AWS infrastructure provider -#! --------------------------------------------------------------------- -#! For list of supported regions, see TKG documentation. -#! If you have already set an environment variable for the region, you must unset it. -AWS_REGION: -#! AWS_LOAD_BALANCER_SCHEME_INTERNAL will mean that the Kubernetes API Server Load Balancer will not be accessible and routed over the -#! internet. -AWS_LOAD_BALANCER_SCHEME_INTERNAL: false -#! AZ has to be contained in the AWS region -AWS_NODE_AZ: "" -#! set these if you want 3 control plane nodes. The below -#! availability zones must be in the same region as AWS_NODE_AZ -AWS_NODE_AZ_1: "" -AWS_NODE_AZ_2: "" -#! A new VPC will be created for the cluster to be created if this is set blank -#! to use a VPC that already exists in your selected AWS region, enter the ID of the VPC -#! and then set AWS_PUBLIC_SUBNET_ID and AWS_PRIVATE_SUBNET_ID. -#! This option is not required if you set AWS_VPC_CIDR. -AWS_VPC_ID: "" -AWS_PRIVATE_SUBNET_ID: "" -AWS_PUBLIC_SUBNET_ID: "" -AWS_PUBLIC_SUBNET_ID_1: "" -AWS_PRIVATE_SUBNET_ID_1: "" -AWS_PUBLIC_SUBNET_ID_2: "" -AWS_PRIVATE_SUBNET_ID_2: "" -AWS_VPC_CIDR: 10.0.0.0/16 -AWS_PRIVATE_NODE_CIDR: 10.0.0.0/24 -AWS_PUBLIC_NODE_CIDR: 10.0.1.0/24 -AWS_PRIVATE_NODE_CIDR_1: 10.0.2.0/24 -AWS_PUBLIC_NODE_CIDR_1: 10.0.3.0/24 -AWS_PRIVATE_NODE_CIDR_2: 10.0.4.0/24 -AWS_PUBLIC_NODE_CIDR_2: 10.0.5.0/24 -#! AWS_SECURITY_GROUP_APISERVER_LB is an optional security group ID of a pre-created -#! security group that will be used for Kubernetes API Server ELB, and will control -#! inbound access to the the control plane endpoint. -AWS_SECURITY_GROUP_APISERVER_LB: "" -#! AWS_SECURITY_GROUP_BASTION is an optional security group ID of a pre-created -#! security group that will be used to control in-bound access to the bastion. -AWS_SECURITY_GROUP_BASTION: "" -#! AWS_SECURITY_GROUP_CONTROLPLANE is an optional security group ID of a pre-created -#! security group that will be used to control in-bound access to the control plane nodes. -#! This group must allow access to port 6443 from AWS_SECURITY_GROUP_APISERVER_LB. -AWS_SECURITY_GROUP_CONTROLPLANE: "" -#! AWS_SECURITY_GROUP_LB is an optional security group for use by the Kubernetes -#! AWS Cloud Provider for setting rules for ELBs. -AWS_SECURITY_GROUP_LB: "" -#! AWS_SECURITY_GROUP_NODE is an optional security group that will be used to -#! to control in-bound acceess to all nodes. -AWS_SECURITY_GROUP_NODE: "" -#! AWS_IDENTITY_REF_KIND is an optional kind of a Kubernetes resource containing -#! an identity to be used for a cluster. Defaults to AWSClusterRoleIdentity if -#! AWS_IDENTITY_REF_NAME is also set. -AWS_IDENTITY_REF_KIND: "" -#! AWS_IDENTITY_REF_NAME is an optional name of a Kubernetes resource containing -#! an identity to be used for a cluster. -AWS_IDENTITY_REF_NAME: "" -#! AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB is the size of the root volume of the -#! control plane instances of a cluster. -AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB: 80 -#! AWS_NODE_OS_DISK_SIZE_GIB is the size of the root volume of the -#! node instances of a cluster. -AWS_NODE_OS_DISK_SIZE_GIB: 80 - -#! Control plane and worker node instance types. -#! For node sizing recommendations, refer to TKG documentation. -CONTROL_PLANE_MACHINE_TYPE: t3.large -NODE_MACHINE_TYPE: m5.large -NODE_MACHINE_TYPE_1: "" -NODE_MACHINE_TYPE_2: "" - -#! Name of the SSH private key that you registered with your Amazon EC2 accoun -AWS_SSH_KEY_NAME: - -#! Specify "true" to deploy an AWS basion host in the availability zone, or "false" to reuse an existing bastion host -BASTION_HOST_ENABLED: true - - - -#! --------------------------------------------------------------------- -#! Settings for creating clusters on vSphere with Tanzu -#! --------------------------------------------------------------------- -#! Identifies the storage class to be used for storage of the disks that store the root file systems of the worker nodes. -CONTROL_PLANE_STORAGE_CLASS: -#! Specifies the name of the VirtualMachineClass that describes the virtual -#! hardware settings to be used each control plane node in the pool. -CONTROL_PLANE_VM_CLASS: -#! Specifies a named storage class to be annotated as the default in the -#! cluster. If you do not specify it, there is no default. -DEFAULT_STORAGE_CLASS: -#! Specifies the service domain for the cluster -SERVICE_DOMAIN: -#! Specifies named persistent volume (PV) storage classes for container -#! workloads. Storage classes associated with the Supervisor Namespace are -#! replicated in the cluster. In other words, each storage class listed must be -#! available on the Supervisor Namespace for this to be a valid value -STORAGE_CLASSES: -#! Identifies the storage class to be used for storage of the disks that store the root file systems of the worker nodes. -WORKER_STORAGE_CLASS: -#! Specifies the name of the VirtualMachineClass that describes the virtual -#! hardware settings to be used each worker node in the pool -WORKER_VM_CLASS: -#! Specifies the name of the first node pool -NODE_POOL_0_NAME: "workers" -#! Specifies the labels to be applied on first node pool. It should be of the -#! format "key1=value1,key2=value2" -NODE_POOL_0_LABELS: -#! Specifies the taints string to be applied on first node pool. It should be of the -#! format "key1=value1:effect1,key2=value2:effect2" -NODE_POOL_0_TAINTS: -#! Specified node label for control plane -#! It should be of the format "key1=value1,key2=value2" -CONTROL_PLANE_NODE_LABELS: - - - -#! --------------------------------------------------------------------- -#! Settings for AZURE infrastructure provider -#! --------------------------------------------------------------------- -#! Azure account configurations - -#! The Azure cloud to deploy to, supported clouds are : -#! AzurePublicCloud, AzureChinaCloud, AzureGermanCloud, AzureUSGovernmentCloud -AZURE_ENVIRONMENT: "AzurePublicCloud" -#! The tenant ID is the ID of the AAD directory in which the app for Tanzu Kubernetes Grid is created -#! A Tenant is representative of an organization within Azure Active Directory. -#! It is a dedicated instance of the Azure AD service -AZURE_TENANT_ID: -#! The subscription ID is a GUID that uniquely identifies the subscription to use Azure services. -AZURE_SUBSCRIPTION_ID: -#! The client ID of the app for Tanzu Kubernetes Grid that you registered with Azure -AZURE_CLIENT_ID: -#! The client password of the app for Tanzu Kubernetes Grid that you registered with Azure -AZURE_CLIENT_SECRET: -#! Azure region where the resources will be created -AZURE_LOCATION: -#! SSH to allow for access to the cluster machines, as a base64-encoded string -AZURE_SSH_PUBLIC_KEY_B64: -#! Azure virtual machine size -AZURE_CONTROL_PLANE_MACHINE_TYPE: "Standard_D2s_v3" -AZURE_NODE_MACHINE_TYPE: "Standard_D2s_v3" -#! Accelerated Networking is enabled by default on all supported Azure VMs with 4 or more CPU. -AZURE_ENABLE_ACCELERATED_NETWORKING: true - -#! resource-group-name that already exists in your Azure account. -#! AZURE_RESOURCE_GROUP and AZURE_VNET_RESOURCE_GROUP are the same by default. - -#! Must be unique to each cluster. -AZURE_RESOURCE_GROUP: "" -#! If unset the value of AZURE_RESOURCE_GROUP will be used as the resource group -#! for the VNET -AZURE_VNET_RESOURCE_GROUP: "" - -AZURE_VNET_NAME: "" -AZURE_VNET_CIDR: "10.0.0.0/16" -AZURE_CONTROL_PLANE_SUBNET_NAME: "" -AZURE_CONTROL_PLANE_SUBNET_CIDR: "10.0.0.0/24" -AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP: "" -AZURE_NODE_SUBNET_NAME: "" -AZURE_NODE_SUBNET_CIDR: "10.0.1.0/24" -AZURE_NODE_SUBNET_SECURITY_GROUP: "" - -#! AZ has to be contained in the Azure location. -#! If not provided, the default value for AZURE_NODE_AZ is 1, AZURE_NODE_AZ_1 is 2 and AZURE_NODE_AZ_2 is 3 -AZURE_NODE_AZ: "" -#! set these if you want to customize the AZs for a prod cluster. The below -#! availability zones must be in the same region as AZURE_NODE_AZ -AZURE_NODE_AZ_1: "" -AZURE_NODE_AZ_2: "" - -#! set of tags to add to Azure resources managed by the Azure provider -AZURE_CUSTOM_TAGS: - -#! disk configuration -AZURE_CONTROL_PLANE_OS_DISK_SIZE_GIB: 128 -AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE: Premium_LRS -AZURE_NODE_OS_DISK_SIZE_GIB: 128 -AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE: Premium_LRS - -AZURE_CONTROL_PLANE_DATA_DISK_SIZE_GIB: 256 -AZURE_ENABLE_NODE_DATA_DISK: false -AZURE_NODE_DATA_DISK_SIZE_GIB: 256 - -#! Deploy private Azure clusters. -#! A Private cluster will have an Azure internal load balancer load balancing traffic inside the VNet to the control plane nodes. -AZURE_ENABLE_PRIVATE_CLUSTER: false -AZURE_FRONTEND_PRIVATE_IP: "10.0.0.100" -AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB: false -AZURE_ENABLE_NODE_OUTBOUND_LB: false -AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT: 1 -AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT: 1 -#! specifies the number of minutes to keep a TCP connection open for the outbound rule -#! https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-tcp-reset#configurable-tcp-idle-timeout -AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES: 4 - -#! Azure VM Image Config values -#! Azure image ID -AZURE_IMAGE_ID: -#! Azure shared image gallery -AZURE_IMAGE_RESOURCE_GROUP: -AZURE_IMAGE_NAME: -AZURE_IMAGE_SUBSCRIPTION_ID: -AZURE_IMAGE_GALLERY: -#! Azure marketplace image -AZURE_IMAGE_PUBLISHER: -AZURE_IMAGE_OFFER: -AZURE_IMAGE_SKU: -AZURE_IMAGE_THIRD_PARTY: -#! For both marketplace and shared image gallery -AZURE_IMAGE_VERSION: - -#! Azure multi-tenancy -AZURE_IDENTITY_NAME: -AZURE_IDENTITY_NAMESPACE: - -#! --------------------------------------------------------------------- -#! OIDC-related configuration -#! Set these values to enable OIDC on management cluster. -#! --------------------------------------------------------------------- -#! ENABLE_OIDC is either true or false. It can be set by user or by tkg cli option --enable-cluster-options="oidc" -ENABLE_OIDC: false -#! OIDC_ISSUER_URL is https://:30167 -#! OIDC_USERNAME_CLAIM is JWT claim to use as the user name. e.g, sub, email or name. -#! OIDC_GROUPS_CLAIM is JWT claim to use as the user's group. -#! OIDC_DEX_CA can be obtained by retrieving the secret dex-cert-tls from namespace tanzu-system-auth in the management cluster -#! e.g. kubectl get secret dex-cert-tls -n tanzu-system-auth -o 'go-template={{ index .data "ca.crt" }}' | base64 -D | gzip | base64 -OIDC_ISSUER_URL: -OIDC_USERNAME_CLAIM: -OIDC_GROUPS_CLAIM: -OIDC_DEX_CA: - - - -#! --------------------------------------------------------------------- -#! Machine Health Check configuration -#! --------------------------------------------------------------------- -ENABLE_MHC: -ENABLE_MHC_WORKER_NODE: true -ENABLE_MHC_CONTROL_PLANE: true -MHC_UNKNOWN_STATUS_TIMEOUT: 5m -MHC_FALSE_STATUS_TIMEOUT: 12m -MHC_MAX_UNHEALTHY_CONTROL_PLANE: 100% -MHC_MAX_UNHEALTHY_WORKER_NODE: 100% - -#! Common configuration -#! --------------------------------------------------------------------- - -#! Set this value to configure TKG to use a custom image repository for any -#! container image that needs to be pulled during cluster creation. This is -#! useful when deploying in an internet-restricted environment with the help -#! of a private container registry. -#! See TKG documentation for more information about preparing a private -#! container repository. -TKG_CUSTOM_IMAGE_REPOSITORY: "" -TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: false -TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: "" - -#! When user's application images are from a registry with a self-signed CA -#! set this value to configure the cluster to trust it. For a registry with -#! a public CA nothing need to change. This is only for user's application -#! images, to configure TKG image repository for cluster creation, use -#! TKG_CUSTOM_IMAGE_REPOSITORY instead. -#! Example image registry host name: 10.191.247.30:8443 -ADDITIONAL_IMAGE_REGISTRY_1: "" -ADDITIONAL_IMAGE_REGISTRY_1_SKIP_TLS_VERIFY: false -#! Base64 encoded self-signed CA certificate -ADDITIONAL_IMAGE_REGISTRY_1_CA_CERTIFICATE: "" - -ADDITIONAL_IMAGE_REGISTRY_2: "" -ADDITIONAL_IMAGE_REGISTRY_2_SKIP_TLS_VERIFY: false -ADDITIONAL_IMAGE_REGISTRY_2_CA_CERTIFICATE: "" - -ADDITIONAL_IMAGE_REGISTRY_3: "" -ADDITIONAL_IMAGE_REGISTRY_3_SKIP_TLS_VERIFY: false -ADDITIONAL_IMAGE_REGISTRY_3_CA_CERTIFICATE: "" - -#! PROXY configuration -#! If `TKG_PROXY_CA_CERT` is specified it gets used instead of -#! `TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE` while communicating -#! with the registry -TKG_HTTP_PROXY: "" -TKG_HTTPS_PROXY: "" -TKG_NO_PROXY: "" -TKG_PROXY_CA_CERT: "" -TKG_NODE_SYSTEM_WIDE_PROXY: false - -#! IP Family setting -TKG_IP_FAMILY: - -#! IPAM settings -NODE_IPAM_IP_POOL_NAME: "" - -#! Configure cloud provider permissions for TMC enablement. Only affects AWS at present. -DISABLE_TMC_CLOUD_PERMISSIONS: false - -#! Node Nameservers (currently only supports the vSphere provider) -CONTROL_PLANE_NODE_NAMESERVERS: -WORKER_NODE_NAMESERVERS: -#! Node SearchDomains -CONTROL_PLANE_NODE_SEARCH_DOMAINS: -WORKER_NODE_SEARCH_DOMAINS: - -#! Audit Logging settings -ENABLE_AUDIT_LOGGING: false - -#! Configures default storage class for workload cluster if enabled -ENABLE_DEFAULT_STORAGE_CLASS: true - -#! CIDR default values are set based on TKG_IP_FAMILY in the CLI -CLUSTER_CIDR: -SERVICE_CIDR: -NODE_STARTUP_TIMEOUT: 20m - -CONTROL_PLANE_MACHINE_COUNT: -WORKER_MACHINE_COUNT: -#! sets the number of worker nodes in the first AZ, AWS_NODE_AZ. -WORKER_MACHINE_COUNT_0: -#! sets the number of worker nodes in the second AZ, AWS_NODE_AZ_1. -WORKER_MACHINE_COUNT_1: -#! sets the number of worker nodes in the third AZ, AWS_NODE_AZ_2. -WORKER_MACHINE_COUNT_2: - -#! OS selection configuration -OS_NAME: "" -OS_VERSION: "" -OS_ARCH: "" - -USE_TOPOLOGY_CATEGORIES: false - -#! NTP server customization (Only support vSphere provider) -NTP_SERVERS: - -#! Disables pod security standards in kube-apiserver. -POD_SECURITY_STANDARD_DEACTIVATED: false - -POD_SECURITY_STANDARD_AUDIT: "baseline" -POD_SECURITY_STANDARD_WARN: "baseline" -POD_SECURITY_STANDARD_ENFORCE: "" - -#! --------------------------------------------------------------------- -#! Autoscaler related configuration -#! --------------------------------------------------------------------- -ENABLE_AUTOSCALER: false -AUTOSCALER_MAX_NODES_TOTAL: "0" -AUTOSCALER_SCALE_DOWN_DELAY_AFTER_ADD: "10m" -AUTOSCALER_SCALE_DOWN_DELAY_AFTER_DELETE: "10s" -AUTOSCALER_SCALE_DOWN_DELAY_AFTER_FAILURE: "3m" -AUTOSCALER_SCALE_DOWN_UNNEEDED_TIME: "10m" -AUTOSCALER_MAX_NODE_PROVISION_TIME: "15m" -AUTOSCALER_MIN_SIZE_0: -AUTOSCALER_MAX_SIZE_0: -AUTOSCALER_MIN_SIZE_1: -AUTOSCALER_MAX_SIZE_1: -AUTOSCALER_MIN_SIZE_2: -AUTOSCALER_MAX_SIZE_2: - - - -#! --------------------------------------------------------------------- -#! Settings for Docker infrastructure provider -#! --------------------------------------------------------------------- -DOCKER_MACHINE_TEMPLATE_IMAGE: - - - -#! --------------------------------------------------------------------- -#! Pinniped identity management configuration -#! --------------------------------------------------------------------- -#! Identifies the Identity management type to be deployed. Possible values are "oidc", "ldap" or "none" -#! If "none" is specified, pinniped services will not be deployed on the cluster -IDENTITY_MANAGEMENT_TYPE: "none" - -#! --------------------------------------------------------------------- -#! SecretGen Controller configuration -#! --------------------------------------------------------------------- -SECRETGEN_CONTROLLER_ENABLE: true - -#! Settings for Pinniped OIDC -CERT_DURATION: 2160h -CERT_RENEW_BEFORE: 360h -OIDC_IDENTITY_PROVIDER_NAME: -OIDC_IDENTITY_PROVIDER_ISSUER_URL: -OIDC_IDENTITY_PROVIDER_CLIENT_ID: -OIDC_IDENTITY_PROVIDER_CLIENT_SECRET: -#! comma separated list of scopes apart from openid e.g:"email,offline_access" -OIDC_IDENTITY_PROVIDER_SCOPES: "email,profile,groups" -OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM: -OIDC_IDENTITY_PROVIDER_GROUPS_CLAIM: -#! The following two variables are used to configure Pinniped JWTAuthenticator for workload clusters -SUPERVISOR_ISSUER_URL: -SUPERVISOR_ISSUER_CA_BUNDLE_DATA_B64: - -#! Settings for LDAP (Pinniped configured with Dex) -LDAP_BIND_DN: -LDAP_BIND_PASSWORD: -LDAP_HOST: -LDAP_USER_SEARCH_BASE_DN: -LDAP_USER_SEARCH_FILTER: -LDAP_USER_SEARCH_USERNAME: userPrincipalName -LDAP_USER_SEARCH_ID_ATTRIBUTE: DN -LDAP_USER_SEARCH_EMAIL_ATTRIBUTE: DN -LDAP_USER_SEARCH_NAME_ATTRIBUTE: -LDAP_GROUP_SEARCH_BASE_DN: -LDAP_GROUP_SEARCH_FILTER: -LDAP_GROUP_SEARCH_USER_ATTRIBUTE: DN -LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE: -LDAP_GROUP_SEARCH_NAME_ATTRIBUTE: cn -LDAP_ROOT_CA_DATA_B64: - - - -#! --------------------------------------------------------------------- -#! AVI NSX Advanced Loader Balancer configuration -#! --------------------------------------------------------------------- -#! Whether to use Avi aka. NSX Advanced Loader Balancer or not -AVI_ENABLE: false - -#! Whether to use Avi aka. NSX Advanced Loader Balancer to provide clusters' -#! control plane nodes load balancing or not -AVI_CONTROL_PLANE_HA_PROVIDER: false - -#! Settings for Avi aka. NSX Advanced Loader Balancer controller - -#! Avi aka. NSX Advanced Loader Balancer's controller ip or FQDN -AVI_CONTROLLER: -AVI_USERNAME: "" -AVI_PASSWORD: "" -#! The cerficiate used to access Avi aka. NSX Advanced Loader Balancer's controller, need to be base64 encoded -AVI_CA_DATA_B64: "" -#! Which infrastructure cloud will be used for TKG, currently support two type clouds: vcenter|NSX-T -AVI_CLOUD_NAME: -#! t1 router specifies the path for NSX Advanced Loader Balancer backend network, only applies when configure NSX ALB to NSX-T cloud -AVI_NSXT_T1LR: - - -#! Settings for workload clusters' load balancer VIP networks: -AVI_DATA_NETWORK: -AVI_DATA_NETWORK_CIDR: -AVI_CONTROL_PLANE_NETWORK: -AVI_CONTROL_PLANE_NETWORK_CIDR: -AVI_SERVICE_ENGINE_GROUP: - - -#! Settings for management cluster's load balancer VIP networks: -#! All fields in this section are optional, if leave them empty, -#! management cluster will use the same load balancer VIP network -#! configurations as workload clusters -AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME: -AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR: -AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME: -AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR: -AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP: - - -#! Settings for ako-operator components -AVI_NAMESPACE: "tkg-system-networking" -AVI_DISABLE_INGRESS_CLASS: true -AVI_AKO_IMAGE_PULL_POLICY: IfNotPresent -AVI_ADMIN_CREDENTIAL_NAME: avi-controller-credentials -AVI_CA_NAME: avi-controller-ca -#! AVI_LABELS specify default install-ako-for-all cluster selector matching labels -AVI_LABELS: - - -#! Settings for NSX Advanced Loader Balancer L7 load balancing configurations, which requires NSX Advanced Loader Balancer Enterprise license tier -AVI_DISABLE_STATIC_ROUTE_SYNC: true -AVI_INGRESS_DEFAULT_INGRESS_CONTROLLER: false -AVI_INGRESS_SHARD_VS_SIZE: "" -AVI_INGRESS_SERVICE_TYPE: "" -AVI_INGRESS_NODE_NETWORK_LIST: "" - - -#! --------------------------------------------------------------------- -#! Antrea CNI configuration -#! --------------------------------------------------------------------- -ANTREA_NO_SNAT: false -ANTREA_DISABLE_UDP_TUNNEL_OFFLOAD: false -ANTREA_TRAFFIC_ENCAP_MODE: "encap" -ANTREA_EGRESS_EXCEPT_CIDRS: "" -ANTREA_NODEPORTLOCAL_ENABLED: true -ANTREA_NODEPORTLOCAL_PORTRANGE: 61000-62000 -ANTREA_PROXY_ALL: false -ANTREA_PROXY_NODEPORT_ADDRS: "" -ANTREA_PROXY_SKIP_SERVICES: "" -ANTREA_PROXY_LOAD_BALANCER_IPS: false -ANTREA_FLOWEXPORTER_COLLECTOR_ADDRESS: "flow-aggregator.flow-aggregator.svc:4739:tls" -ANTREA_FLOWEXPORTER_POLL_INTERVAL: "5s" -ANTREA_FLOWEXPORTER_ACTIVE_TIMEOUT: "30s" -ANTREA_FLOWEXPORTER_IDLE_TIMEOUT: "15s" -ANTREA_KUBE_APISERVER_OVERRIDE: -ANTREA_TRANSPORT_INTERFACE: -ANTREA_TRANSPORT_INTERFACE_CIDRS: "" -ANTREA_MULTICAST_INTERFACES: "" -ANTREA_MULTICAST_IGMPQUERY_INTERVAL: "125s" -ANTREA_TUNNEL_TYPE: geneve -ANTREA_TUNNEL_PORT: 0 -ANTREA_TUNNEL_CSUM: false -ANTREA_TRAFFIC_ENCRYPTION_MODE: none -ANTREA_WIREGUARD_PORT: 51820 -ANTREA_ENABLE_USAGE_REPORTING: false -ANTREA_ENABLE_BRIDGING_MODE: false -ANTREA_DISABLE_TXCHECKSUM_OFFLOAD: false -ANTREA_DNS_SERVER_OVERRIDE: "" -ANTREA_MULTICLUSTER_ENABLE: false -ANTREA_MULTICLUSTER_NAMESPACE: "" - -#! Antrea feature gates -ANTREA_PROXY: true -ANTREA_ENDPOINTSLICE: true -ANTREA_POLICY: true -ANTREA_TRACEFLOW: true -ANTREA_NODEPORTLOCAL: true -ANTREA_NETWORKPOLICY_STATS: false -ANTREA_EGRESS: true -ANTREA_IPAM: false -ANTREA_FLOWEXPORTER: false -ANTREA_SERVICE_EXTERNALIP: false -ANTREA_MULTICAST: false -ANTREA_MULTICLUSTER: false -ANTREA_SECONDARY_NETWORK: false -ANTREA_TRAFFIC_CONTROL: false -ANTREA_TOPOLOGY_AWARE_HINTS: false - - - -KUBEVIP_LOADBALANCER_ENABLE: false -KUBEVIP_LOADBALANCER_IP_RANGES: "" -KUBEVIP_LOADBALANCER_CIDRS: "" - -CUSTOM_TDNF_REPOSITORY_CERTIFICATE: "" - -#! --------------------------------------------------------------------- -#! Internal configuration, not meant to be overridden -#! --------------------------------------------------------------------- -TKG_DEFAULT_BOM: -PROVIDER_TYPE: -TKG_CLUSTER_ROLE: -TKG_VERSION: -FILTER_BY_ADDON_TYPE: -REMOVE_CRS_FOR_ADDON_TYPE: -DISABLE_CRS_FOR_ADDON_TYPE: -CNI: antrea -KUBERNETES_RELEASE: -KUBERNETES_VERSION: v1.19.1+vmware.2 -#! This is autofilled by TKG CLI -AWS_AMI_ID: -TKR_DISCOVER_FREQUENCY: 600 -#! vSphere version -VSPHERE_VERSION: -#! CORE_DNS_IP is the IP of core DNS service, supports both IPv4 and IPv6 -#! It is the 10th index of SERVICE_CIDR subnet -CORE_DNS_IP: -#! This defines feature flag package-based-cc is enabled or not -FEATURE_FLAG_PACKAGE_BASED_CC: -#! Used for testing clusterclasses only -TKR_DATA: -VSPHERE_CLUSTER_CLASS_VERSION: v1.0.0 -AZURE_CLUSTER_CLASS_VERSION: v1.0.0 -AWS_CLUSTER_CLASS_VERSION: v1.0.0 -DOCKER_CLUSTER_CLASS_VERSION: v1.0.0 - -#! --------------------------------------------------------------------- -#! Settings for OCI infrastructure provider -#! --------------------------------------------------------------------- -OCI_CONTROL_PLANE_MACHINE_TYPE: "VM.Standard.E4.Flex" -OCI_CONTROL_PLANE_MACHINE_TYPE_OCPUS: "1" -OCI_CONTROL_PLANE_PV_TRANSIT_ENCRYPTION: true -OCI_NODE_MACHINE_TYPE: "VM.Standard.E4.Flex" -OCI_NODE_MACHINE_TYPE_OCPUS: "1" -OCI_NODE_PV_TRANSIT_ENCRYPTION: true -OCI_IMAGE_ID: -OCI_REGION: "us-phoenix-1" -OCI_COMPARTMENT_ID: -OCI_SSH_KEY: - -#! Settings to provide Oracle CPI subnet information -OCI_PRIVATE_SERVICE_SUBNET_ID: - -#! Settings to use externally managed network infrastructure -OCI_EXTERNAL_VCN_ID: -OCI_EXTERNAL_CONTROL_PLANE_EP_NSG_ID: -OCI_EXTERNAL_CONTROL_PLANE_NSG_ID: -OCI_EXTERNAL_WORKER_NSG_ID: -OCI_EXTERNAL_CONTROL_PLANE_EP_SUBNET_ID: -OCI_EXTERNAL_CONTROL_PLANE_SUBNET_ID: -OCI_EXTERNAL_WORKER_SUBNET_ID: - -#! Use base64 to encode the config.yaml content -APISERVER_EVENT_RATE_LIMIT_CONF_BASE64: - -#! --------------------------------------------------------------------- -#! BoM file processing, internal use only -#! --------------------------------------------------------------------- - -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -#@ files = data.list() -boms: - #@ for/end file in [ f for f in files if f.startswith("tkg-bom") or f.startswith("tkr-bom") or f.startswith("bom")]: - - bom_name: #@ file - bom_data: #@ yaml.decode(data.read(file)) diff --git a/providers/control-plane-kubeadm/v1.2.8/control-plane-components.yaml b/providers/control-plane-kubeadm/v1.2.8/control-plane-components.yaml deleted file mode 100644 index 6a981e57c9..0000000000 --- a/providers/control-plane-kubeadm/v1.2.8/control-plane-components.yaml +++ /dev/null @@ -1,4572 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - control-plane: controller-manager - name: capi-kubeadm-control-plane-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-control-plane-system/capi-kubeadm-control-plane-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: kubeadmcontrolplanes.controlplane.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: controlplane.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: KubeadmControlPlane - listKind: KubeadmControlPlaneList - plural: kubeadmcontrolplanes - shortNames: - - kcp - singular: kubeadmcontrolplane - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: This denotes whether or not the control plane has the uploaded kubeadm-config configmap - jsonPath: .status.initialized - name: Initialized - type: boolean - - description: KubeadmControlPlane API Server is ready to receive requests - jsonPath: .status.ready - name: API Server Available - type: boolean - - description: Kubernetes version associated with this control plane - jsonPath: .spec.version - name: Version - type: string - - description: Total number of non-terminated machines targeted by this control plane - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of fully running and ready control plane machines - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: Total number of non-terminated machines targeted by this control plane that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this control plane - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - name: v1alpha3 - schema: - openAPIV3Schema: - description: KubeadmControlPlane is the Schema for the KubeadmControlPlane API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmControlPlaneSpec defines the desired state of KubeadmControlPlane. - properties: - infrastructureTemplate: - description: InfrastructureTemplate is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - kubeadmConfigSpec: - description: KubeadmConfigSpec is a KubeadmConfigSpec to use for initializing and joining machines to the control plane. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look for all required certificates. NB: if not provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint is specified but without a TCP port, the BindPort is used. Possible usages are: e.g. In a cluster with more than one control plane instances, this field should be assigned the address of the external load balancer in front of the control plane instances. e.g. in environments with enforced node recycling, the ControlPlaneEndpoint could be used for assigning a stable DNS to the control plane. NB: This value defaults to the first value in the Cluster object status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - type: - description: Type defines the DNS add-on to be used - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file used to secure etcd communication. Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used to secure etcd communication. Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring the local etcd instance Local and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. If empty, `k8s.gcr.io` will be used by default; in case of kubernetes version is a CI build (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be used as a default for control plane components and for kube-proxy, while `k8s.gcr.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking topology of the cluster. NB: This value defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, the API server will not allocate CIDR ranges for every node. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - useHyperKubeImage: - description: UseHyperKubeImage controls if hyperkube should be used for Kubernetes components instead of their respective separate images - type: boolean - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of . NOTE: unless you define a label, this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time and describes a set of Bootstrap Tokens to create. This information IS NOT uploaded to the kubeadm cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why this token exists and what it's used for, so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token expires. Defaults to being set dynamically at runtime based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional trust between nodes and control-planes. Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token can be used. Can by default be used for establishing bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance that's deployed on this control plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint in the sense that ControlPlaneEndpoint is the global endpoint for the cluster, which then loadbalances the requests to each individual API server. This configuration object lets you customize what IP/DNS name and port the local API server advertises it's accessible on. By default, kubeadm tries to auto-detect the IP of the default interface and use that, but in case that process fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority used to secure comunications between node and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane instance to be deployed on the joining node. If nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - required: - - advertiseAddress - - bindPort - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet to use during the TLS Bootstrap process TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for bootstrap token based discovery BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key pins to verify when token-based discovery is used. The root CA found during discovery must match one of these values. Specifying an empty set disables root CA pinning, which can be unsafe. Each hash is specified as ":", where the only currently supported type is "sha256". This is a hex-encoded SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded ASN.1. These hashes can be calculated using, for example, OpenSSL: openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based discovery without CA verification via CACertHashes. This can weaken the security of kubeadm since other nodes can impersonate the control-plane. - type: boolean - required: - - token - - unsafeSkipCAVerification - type: object - file: - description: File is used to specify a file or URL to a kubeconfig file from which to load cluster information BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual file path or URL to the kubeconfig file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: 'TLSBootstrapToken is a token used for TLS bootstrapping. If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, but can be overridden. If .File is set, this field **must be set** in case the KubeConfigFile does not contain any other authentication information TODO: revisit when there is defaulting from k/k' - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command with a shell script with retries for joins. \n This is meant to be an experimental temporary workaround on some environments where joins fail due to timing (and other issues). The long term goal is to add retries to kubeadm proper and use that functionality. \n This will add about 40KB to userdata \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a controlplane node The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - replicas: - description: Number of desired machines. Defaults to 1. When stacked etcd is used only odd numbers are permitted, as per [etcd best practice](https://etcd.io/docs/v3.3.12/faq/#why-an-odd-number-of-cluster-members). This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - rolloutStrategy: - description: The RolloutStrategy to use to replace control plane machines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if RolloutStrategyType = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of control planes that can be scheduled above or under the desired number of control planes. Value can be an absolute number 1 or 0. Defaults to 1. Example: when this is set to 1, the control plane can be scaled up immediately when the rolling update starts.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of rollout. Currently the only supported strategy is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - upgradeAfter: - description: UpgradeAfter is a field to indicate an upgrade should be performed after the specified time even if no changes have been made to the KubeadmControlPlane - format: date-time - type: string - version: - description: Version defines the desired Kubernetes version. - type: string - required: - - infrastructureTemplate - - kubeadmConfigSpec - - version - type: object - status: - description: KubeadmControlPlaneStatus defines the observed state of KubeadmControlPlane. - properties: - conditions: - description: Conditions defines current service state of the KubeadmControlPlane. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: ErrorMessage indicates that there is a terminal problem reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a terminal problem reconciling the state, and will be set to a token value suitable for programmatic interpretation. - type: string - initialized: - description: Initialized denotes whether or not the control plane has the uploaded kubeadm-config configmap. - type: boolean - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - ready: - description: Ready denotes that the KubeadmControlPlane API Server is ready to receive requests. - type: boolean - readyReplicas: - description: Total number of fully running and ready control plane machines. - format: int32 - type: integer - replicas: - description: Total number of non-terminated machines targeted by this control plane (their labels match the selector). - format: int32 - type: integer - selector: - description: 'Selector is the label selector in string format to avoid introspection by clients, and is used to provide the CRD-based integration for the scale subresource and additional integrations for things like kubectl describe.. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - unavailableReplicas: - description: Total number of unavailable machines targeted by this control plane. This is the total number of machines that are still required for the deployment to have 100% available capacity. They may either be machines that are running but not yet ready or machines that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: Total number of non-terminated machines targeted by this control plane that have the desired template spec. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmControlPlane - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: This denotes whether or not the control plane has the uploaded kubeadm-config configmap - jsonPath: .status.initialized - name: Initialized - type: boolean - - description: KubeadmControlPlane API Server is ready to receive requests - jsonPath: .status.ready - name: API Server Available - type: boolean - - description: Kubernetes version associated with this control plane - jsonPath: .spec.version - name: Version - type: string - - description: Total number of non-terminated machines targeted by this control plane - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of fully running and ready control plane machines - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: Total number of non-terminated machines targeted by this control plane that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this control plane - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - name: v1alpha4 - schema: - openAPIV3Schema: - description: KubeadmControlPlane is the Schema for the KubeadmControlPlane API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmControlPlaneSpec defines the desired state of KubeadmControlPlane. - properties: - kubeadmConfigSpec: - description: KubeadmConfigSpec is a KubeadmConfigSpec to use for initializing and joining machines to the control plane. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look for all required certificates. NB: if not provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint is specified but without a TCP port, the BindPort is used. Possible usages are: e.g. In a cluster with more than one control plane instances, this field should be assigned the address of the external load balancer in front of the control plane instances. e.g. in environments with enforced node recycling, the ControlPlaneEndpoint could be used for assigning a stable DNS to the control plane. NB: This value defaults to the first value in the Cluster object status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file used to secure etcd communication. Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used to secure etcd communication. Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring the local etcd instance Local and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. If empty, `registry.k8s.io` will be used by default; in case of kubernetes version is a CI build (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be used as a default for control plane components and for kube-proxy, while `registry.k8s.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking topology of the cluster. NB: This value defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, the API server will not allocate CIDR ranges for every node. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of . NOTE: unless you define a label, this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time and describes a set of Bootstrap Tokens to create. This information IS NOT uploaded to the kubeadm cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why this token exists and what it's used for, so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token expires. Defaults to being set dynamically at runtime based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional trust between nodes and control-planes. Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token can be used. Can by default be used for establishing bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance that's deployed on this control plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint in the sense that ControlPlaneEndpoint is the global endpoint for the cluster, which then loadbalances the requests to each individual API server. This configuration object lets you customize what IP/DNS name and port the local API server advertises it's accessible on. By default, kubeadm tries to auto-detect the IP of the default interface and use that, but in case that process fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority used to secure comunications between node and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane instance to be deployed on the joining node. If nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet to use during the TLS Bootstrap process TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for bootstrap token based discovery BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key pins to verify when token-based discovery is used. The root CA found during discovery must match one of these values. Specifying an empty set disables root CA pinning, which can be unsafe. Each hash is specified as ":", where the only currently supported type is "sha256". This is a hex-encoded SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded ASN.1. These hashes can be calculated using, for example, OpenSSL: openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based discovery without CA verification via CACertHashes. This can weaken the security of kubeadm since other nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to a kubeconfig file from which to load cluster information BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual file path or URL to the kubeconfig file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS bootstrapping. If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, but can be overridden. If .File is set, this field **must be set** in case the KubeConfigFile does not contain any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command with a shell script with retries for joins. \n This is meant to be an experimental temporary workaround on some environments where joins fail due to timing (and other issues). The long term goal is to add retries to kubeadm proper and use that functionality. \n This will add about 40KB to userdata \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - machineTemplate: - description: MachineTemplate contains information about how machines should be shaped when creating or updating a control plane. - properties: - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a controlplane node The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - required: - - infrastructureRef - type: object - replicas: - description: Number of desired machines. Defaults to 1. When stacked etcd is used only odd numbers are permitted, as per [etcd best practice](https://etcd.io/docs/v3.3.12/faq/#why-an-odd-number-of-cluster-members). This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - rolloutAfter: - description: RolloutAfter is a field to indicate a rollout should be performed after the specified time even if no changes have been made to the KubeadmControlPlane. - format: date-time - type: string - rolloutStrategy: - default: - rollingUpdate: - maxSurge: 1 - type: RollingUpdate - description: The RolloutStrategy to use to replace control plane machines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if RolloutStrategyType = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of control planes that can be scheduled above or under the desired number of control planes. Value can be an absolute number 1 or 0. Defaults to 1. Example: when this is set to 1, the control plane can be scaled up immediately when the rolling update starts.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of rollout. Currently the only supported strategy is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - version: - description: Version defines the desired Kubernetes version. - type: string - required: - - kubeadmConfigSpec - - machineTemplate - - version - type: object - status: - description: KubeadmControlPlaneStatus defines the observed state of KubeadmControlPlane. - properties: - conditions: - description: Conditions defines current service state of the KubeadmControlPlane. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: ErrorMessage indicates that there is a terminal problem reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a terminal problem reconciling the state, and will be set to a token value suitable for programmatic interpretation. - type: string - initialized: - description: Initialized denotes whether or not the control plane has the uploaded kubeadm-config configmap. - type: boolean - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - ready: - description: Ready denotes that the KubeadmControlPlane API Server is ready to receive requests. - type: boolean - readyReplicas: - description: Total number of fully running and ready control plane machines. - format: int32 - type: integer - replicas: - description: Total number of non-terminated machines targeted by this control plane (their labels match the selector). - format: int32 - type: integer - selector: - description: 'Selector is the label selector in string format to avoid introspection by clients, and is used to provide the CRD-based integration for the scale subresource and additional integrations for things like kubectl describe.. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - unavailableReplicas: - description: Total number of unavailable machines targeted by this control plane. This is the total number of machines that are still required for the deployment to have 100% available capacity. They may either be machines that are running but not yet ready or machines that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: Total number of non-terminated machines targeted by this control plane that have the desired template spec. - format: int32 - type: integer - version: - description: Version represents the minimum Kubernetes version for the control plane machines in the cluster. - type: string - type: object - type: object - served: true - storage: false - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .metadata.labels['cluster\.x-k8s\.io/cluster-name'] - name: Cluster - type: string - - description: This denotes whether or not the control plane has the uploaded kubeadm-config configmap - jsonPath: .status.initialized - name: Initialized - type: boolean - - description: KubeadmControlPlane API Server is ready to receive requests - jsonPath: .status.ready - name: API Server Available - type: boolean - - description: Total number of machines desired by this control plane - jsonPath: .spec.replicas - name: Desired - priority: 10 - type: integer - - description: Total number of non-terminated machines targeted by this control plane - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Total number of fully running and ready control plane machines - jsonPath: .status.readyReplicas - name: Ready - type: integer - - description: Total number of non-terminated machines targeted by this control plane that have the desired template spec - jsonPath: .status.updatedReplicas - name: Updated - type: integer - - description: Total number of unavailable machines targeted by this control plane - jsonPath: .status.unavailableReplicas - name: Unavailable - type: integer - - description: Time duration since creation of KubeadmControlPlane - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Kubernetes version associated with this control plane - jsonPath: .spec.version - name: Version - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: KubeadmControlPlane is the Schema for the KubeadmControlPlane API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmControlPlaneSpec defines the desired state of KubeadmControlPlane. - properties: - kubeadmConfigSpec: - description: KubeadmConfigSpec is a KubeadmConfigSpec to use for initializing and joining machines to the control plane. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look for all required certificates. NB: if not provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint is specified but without a TCP port, the BindPort is used. Possible usages are: e.g. In a cluster with more than one control plane instances, this field should be assigned the address of the external load balancer in front of the control plane instances. e.g. in environments with enforced node recycling, the ControlPlaneEndpoint could be used for assigning a stable DNS to the control plane. NB: This value defaults to the first value in the Cluster object status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file used to secure etcd communication. Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used to secure etcd communication. Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring the local etcd instance Local and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. If empty, `registry.k8s.io` will be used by default; in case of kubernetes version is a CI build (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be used as a default for control plane components and for kube-proxy, while `registry.k8s.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking topology of the cluster. NB: This value defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, the API server will not allocate CIDR ranges for every node. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of . NOTE: unless you define a label, this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - append: - description: Append specifies whether to append Content to existing file if Path exists. - type: boolean - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - - ignition - type: string - ignition: - description: Ignition contains Ignition specific configuration. - properties: - containerLinuxConfig: - description: ContainerLinuxConfig contains CLC specific configuration. - properties: - additionalConfig: - description: "AdditionalConfig contains additional configuration to be merged with the Ignition configuration generated by the bootstrapper controller. More info: https://coreos.github.io/ignition/operator-notes/#config-merging \n The data format is documented here: https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/" - type: string - strict: - description: Strict controls if AdditionalConfig should be strictly parsed. If so, warnings are treated as errors. - type: boolean - type: object - type: object - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time and describes a set of Bootstrap Tokens to create. This information IS NOT uploaded to the kubeadm cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why this token exists and what it's used for, so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token expires. Defaults to being set dynamically at runtime based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional trust between nodes and control-planes. Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token can be used. Can by default be used for establishing bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance that's deployed on this control plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint in the sense that ControlPlaneEndpoint is the global endpoint for the cluster, which then loadbalances the requests to each individual API server. This configuration object lets you customize what IP/DNS name and port the local API server advertises it's accessible on. By default, kubeadm tries to auto-detect the IP of the default interface and use that, but in case that process fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying patches to components deployed by kubeadm during "kubeadm init". The minimum kubernetes version needed to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic" "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. These files can be written into the target directory via KubeadmConfig.Files which specifies additional files to be created on the machine, either with content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during command execution. The list of phases can be obtained with the "kubeadm init --help" command. This option takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority used to secure comunications between node and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane instance to be deployed on the joining node. If nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet to use during the TLS Bootstrap process TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for bootstrap token based discovery BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key pins to verify when token-based discovery is used. The root CA found during discovery must match one of these values. Specifying an empty set disables root CA pinning, which can be unsafe. Each hash is specified as ":", where the only currently supported type is "sha256". This is a hex-encoded SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded ASN.1. These hashes can be calculated using, for example, OpenSSL: openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based discovery without CA verification via CACertHashes. This can weaken the security of kubeadm since other nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to a kubeconfig file from which to load cluster information BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual file path or URL to the kubeconfig file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS bootstrapping. If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, but can be overridden. If .File is set, this field **must be set** in case the KubeConfigFile does not contain any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying patches to components deployed by kubeadm during "kubeadm join". The minimum kubernetes version needed to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic" "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. These files can be written into the target directory via KubeadmConfig.Files which specifies additional files to be created on the machine, either with content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during command execution. The list of phases can be obtained with the "kubeadm init --help" command. This option takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command with a shell script with retries for joins. \n This is meant to be an experimental temporary workaround on some environments where joins fail due to timing (and other issues). The long term goal is to add retries to kubeadm proper and use that functionality. \n This will add about 40KB to userdata \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055. Deprecated: This experimental fix is no longer needed and this field will be removed in a future release." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of passwd to populate the passwd. - properties: - secret: - description: Secret represents a secret that should populate this password. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - machineTemplate: - description: MachineTemplate contains information about how machines should be shaped when creating or updating a control plane. - properties: - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - nodeDeletionTimeout: - description: NodeDeletionTimeout defines how long the machine controller will attempt to delete the Node that the Machine hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely. If no value is provided, the default value for this property of the Machine resource will be used. - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a controlplane node The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - required: - - infrastructureRef - type: object - replicas: - description: Number of desired machines. Defaults to 1. When stacked etcd is used only odd numbers are permitted, as per [etcd best practice](https://etcd.io/docs/v3.3.12/faq/#why-an-odd-number-of-cluster-members). This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - rolloutAfter: - description: RolloutAfter is a field to indicate a rollout should be performed after the specified time even if no changes have been made to the KubeadmControlPlane. - format: date-time - type: string - rolloutBefore: - description: RolloutBefore is a field to indicate a rollout should be performed if the specified criteria is met. - properties: - certificatesExpiryDays: - description: CertificatesExpiryDays indicates a rollout needs to be performed if the certificates of the machine will expire within the specified days. - format: int32 - type: integer - type: object - rolloutStrategy: - default: - rollingUpdate: - maxSurge: 1 - type: RollingUpdate - description: The RolloutStrategy to use to replace control plane machines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if RolloutStrategyType = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of control planes that can be scheduled above or under the desired number of control planes. Value can be an absolute number 1 or 0. Defaults to 1. Example: when this is set to 1, the control plane can be scaled up immediately when the rolling update starts.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of rollout. Currently the only supported strategy is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - version: - description: Version defines the desired Kubernetes version. - type: string - required: - - kubeadmConfigSpec - - machineTemplate - - version - type: object - status: - description: KubeadmControlPlaneStatus defines the observed state of KubeadmControlPlane. - properties: - conditions: - description: Conditions defines current service state of the KubeadmControlPlane. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: ErrorMessage indicates that there is a terminal problem reconciling the state, and will be set to a descriptive error message. - type: string - failureReason: - description: FailureReason indicates that there is a terminal problem reconciling the state, and will be set to a token value suitable for programmatic interpretation. - type: string - initialized: - description: Initialized denotes whether or not the control plane has the uploaded kubeadm-config configmap. - type: boolean - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - ready: - description: Ready denotes that the KubeadmControlPlane API Server is ready to receive requests. - type: boolean - readyReplicas: - description: Total number of fully running and ready control plane machines. - format: int32 - type: integer - replicas: - description: Total number of non-terminated machines targeted by this control plane (their labels match the selector). - format: int32 - type: integer - selector: - description: 'Selector is the label selector in string format to avoid introspection by clients, and is used to provide the CRD-based integration for the scale subresource and additional integrations for things like kubectl describe.. The string will be in the same format as the query-param syntax. More info about label selectors: http://kubernetes.io/docs/user-guide/labels#label-selectors' - type: string - unavailableReplicas: - description: Total number of unavailable machines targeted by this control plane. This is the total number of machines that are still required for the deployment to have 100% available capacity. They may either be machines that are running but not yet ready or machines that still have not been created. - format: int32 - type: integer - updatedReplicas: - description: Total number of non-terminated machines targeted by this control plane that have the desired template spec. - format: int32 - type: integer - version: - description: Version represents the minimum Kubernetes version for the control plane machines in the cluster. - type: string - type: object - type: object - served: true - storage: true - subresources: - scale: - labelSelectorPath: .status.selector - specReplicasPath: .spec.replicas - statusReplicasPath: .status.replicas - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-control-plane-system/capi-kubeadm-control-plane-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: kubeadmcontrolplanetemplates.controlplane.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: controlplane.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: KubeadmControlPlaneTemplate - listKind: KubeadmControlPlaneTemplateList - plural: kubeadmcontrolplanetemplates - singular: kubeadmcontrolplanetemplate - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmControlPlaneTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: KubeadmControlPlaneTemplate is the Schema for the kubeadmcontrolplanetemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmControlPlaneTemplateSpec defines the desired state of KubeadmControlPlaneTemplate. - properties: - template: - description: KubeadmControlPlaneTemplateResource describes the data needed to create a KubeadmControlPlane from a template. - properties: - spec: - description: KubeadmControlPlaneSpec defines the desired state of KubeadmControlPlane. - properties: - kubeadmConfigSpec: - description: KubeadmConfigSpec is a KubeadmConfigSpec to use for initializing and joining machines to the control plane. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look for all required certificates. NB: if not provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint is specified but without a TCP port, the BindPort is used. Possible usages are: e.g. In a cluster with more than one control plane instances, this field should be assigned the address of the external load balancer in front of the control plane instances. e.g. in environments with enforced node recycling, the ControlPlaneEndpoint could be used for assigning a stable DNS to the control plane. NB: This value defaults to the first value in the Cluster object status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file used to secure etcd communication. Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used to secure etcd communication. Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring the local etcd instance Local and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. If empty, `registry.k8s.io` will be used by default; in case of kubernetes version is a CI build (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be used as a default for control plane components and for kube-proxy, while `registry.k8s.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking topology of the cluster. NB: This value defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, the API server will not allocate CIDR ranges for every node. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of . NOTE: unless you define a label, this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - type: string - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time and describes a set of Bootstrap Tokens to create. This information IS NOT uploaded to the kubeadm cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why this token exists and what it's used for, so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token expires. Defaults to being set dynamically at runtime based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional trust between nodes and control-planes. Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token can be used. Can by default be used for establishing bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance that's deployed on this control plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint in the sense that ControlPlaneEndpoint is the global endpoint for the cluster, which then loadbalances the requests to each individual API server. This configuration object lets you customize what IP/DNS name and port the local API server advertises it's accessible on. By default, kubeadm tries to auto-detect the IP of the default interface and use that, but in case that process fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority used to secure comunications between node and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane instance to be deployed on the joining node. If nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet to use during the TLS Bootstrap process TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for bootstrap token based discovery BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key pins to verify when token-based discovery is used. The root CA found during discovery must match one of these values. Specifying an empty set disables root CA pinning, which can be unsafe. Each hash is specified as ":", where the only currently supported type is "sha256". This is a hex-encoded SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded ASN.1. These hashes can be calculated using, for example, OpenSSL: openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based discovery without CA verification via CACertHashes. This can weaken the security of kubeadm since other nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to a kubeconfig file from which to load cluster information BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual file path or URL to the kubeconfig file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS bootstrapping. If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, but can be overridden. If .File is set, this field **must be set** in case the KubeConfigFile does not contain any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command with a shell script with retries for joins. \n This is meant to be an experimental temporary workaround on some environments where joins fail due to timing (and other issues). The long term goal is to add retries to kubeadm proper and use that functionality. \n This will add about 40KB to userdata \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - machineTemplate: - description: MachineTemplate contains information about how machines should be shaped when creating or updating a control plane. - properties: - infrastructureRef: - description: InfrastructureRef is a required reference to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a controlplane node The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - required: - - infrastructureRef - type: object - replicas: - description: Number of desired machines. Defaults to 1. When stacked etcd is used only odd numbers are permitted, as per [etcd best practice](https://etcd.io/docs/v3.3.12/faq/#why-an-odd-number-of-cluster-members). This is a pointer to distinguish between explicit zero and not specified. - format: int32 - type: integer - rolloutAfter: - description: RolloutAfter is a field to indicate a rollout should be performed after the specified time even if no changes have been made to the KubeadmControlPlane. - format: date-time - type: string - rolloutStrategy: - default: - rollingUpdate: - maxSurge: 1 - type: RollingUpdate - description: The RolloutStrategy to use to replace control plane machines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if RolloutStrategyType = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of control planes that can be scheduled above or under the desired number of control planes. Value can be an absolute number 1 or 0. Defaults to 1. Example: when this is set to 1, the control plane can be scaled up immediately when the rolling update starts.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of rollout. Currently the only supported strategy is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - version: - description: Version defines the desired Kubernetes version. - type: string - required: - - kubeadmConfigSpec - - machineTemplate - - version - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of KubeadmControlPlaneTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: KubeadmControlPlaneTemplate is the Schema for the kubeadmcontrolplanetemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeadmControlPlaneTemplateSpec defines the desired state of KubeadmControlPlaneTemplate. - properties: - template: - description: KubeadmControlPlaneTemplateResource describes the data needed to create a KubeadmControlPlane from a template. - properties: - spec: - description: 'KubeadmControlPlaneTemplateResourceSpec defines the desired state of KubeadmControlPlane. NOTE: KubeadmControlPlaneTemplateResourceSpec is similar to KubeadmControlPlaneSpec but omits Replicas and Version fields. These fields do not make sense on the KubeadmControlPlaneTemplate, because they are calculated by the Cluster topology reconciler during reconciliation and thus cannot be configured on the KubeadmControlPlaneTemplate.' - properties: - kubeadmConfigSpec: - description: KubeadmConfigSpec is a KubeadmConfigSpec to use for initializing and joining machines to the control plane. - properties: - clusterConfiguration: - description: ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command - properties: - apiServer: - description: APIServer contains extra settings for the API server control plane component - properties: - certSANs: - description: CertSANs sets extra Subject Alternative Names for the API Server signing cert. - items: - type: string - type: array - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - timeoutForControlPlane: - description: TimeoutForControlPlane controls the timeout that we use for API server to appear - type: string - type: object - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - certificatesDir: - description: 'CertificatesDir specifies where to store or look for all required certificates. NB: if not provided, this will default to `/etc/kubernetes/pki`' - type: string - clusterName: - description: The cluster name - type: string - controlPlaneEndpoint: - description: 'ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort are used; in case the ControlPlaneEndpoint is specified but without a TCP port, the BindPort is used. Possible usages are: e.g. In a cluster with more than one control plane instances, this field should be assigned the address of the external load balancer in front of the control plane instances. e.g. in environments with enforced node recycling, the ControlPlaneEndpoint could be used for assigning a stable DNS to the control plane. NB: This value defaults to the first value in the Cluster object status.apiEndpoints array.' - type: string - controllerManager: - description: ControllerManager contains extra settings for the controller manager control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - dns: - description: DNS defines the options for the DNS add-on installed in the cluster. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - type: object - etcd: - description: 'Etcd holds configuration for etcd. NB: This value defaults to a Local (stacked) etcd' - properties: - external: - description: External describes how to connect to an external etcd cluster Local and External are mutually exclusive - properties: - caFile: - description: CAFile is an SSL Certificate Authority file used to secure etcd communication. Required if using a TLS connection. - type: string - certFile: - description: CertFile is an SSL certification file used to secure etcd communication. Required if using a TLS connection. - type: string - endpoints: - description: Endpoints of etcd members. Required for ExternalEtcd. - items: - type: string - type: array - keyFile: - description: KeyFile is an SSL key file used to secure etcd communication. Required if using a TLS connection. - type: string - required: - - caFile - - certFile - - endpoints - - keyFile - type: object - local: - description: Local provides configuration knobs for configuring the local etcd instance Local and External are mutually exclusive - properties: - dataDir: - description: DataDir is the directory etcd will place its data. Defaults to "/var/lib/etcd". - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs are extra arguments provided to the etcd binary when run inside a static pod. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. if not set, the ImageRepository defined in ClusterConfiguration will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the image. In case this value is set, kubeadm does not change automatically the version of the above components during upgrades. - type: string - peerCertSANs: - description: PeerCertSANs sets extra Subject Alternative Names for the etcd peer signing cert. - items: - type: string - type: array - serverCertSANs: - description: ServerCertSANs sets extra Subject Alternative Names for the etcd server signing cert. - items: - type: string - type: array - type: object - type: object - featureGates: - additionalProperties: - type: boolean - description: FeatureGates enabled by the user. - type: object - imageRepository: - description: ImageRepository sets the container registry to pull images from. If empty, `registry.k8s.io` will be used by default; in case of kubernetes version is a CI build (kubernetes version starts with `ci/` or `ci-cross/`) `gcr.io/k8s-staging-ci-images` will be used as a default for control plane components and for kube-proxy, while `registry.k8s.io` will be used for all the other images. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - kubernetesVersion: - description: 'KubernetesVersion is the target version of the control plane. NB: This value defaults to the Machine object spec.version' - type: string - networking: - description: 'Networking holds configuration for the networking topology of the cluster. NB: This value defaults to the Cluster object spec.clusterNetwork.' - properties: - dnsDomain: - description: DNSDomain is the dns domain used by k8s services. Defaults to "cluster.local". - type: string - podSubnet: - description: PodSubnet is the subnet used by pods. If unset, the API server will not allocate CIDR ranges for every node. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.services.cidrBlocks if that is set - type: string - serviceSubnet: - description: ServiceSubnet is the subnet used by k8s services. Defaults to a comma-delimited string of the Cluster object's spec.clusterNetwork.pods.cidrBlocks, or to "10.96.0.0/12" if that's unset. - type: string - type: object - scheduler: - description: Scheduler contains extra settings for the scheduler control plane component - properties: - extraArgs: - additionalProperties: - type: string - description: 'ExtraArgs is an extra set of flags to pass to the control plane component. TODO: This is temporary and ideally we would like to switch all components to use ComponentConfig + ConfigMaps.' - type: object - extraVolumes: - description: ExtraVolumes is an extra set of host volumes, mounted to the control plane component. - items: - description: HostPathMount contains elements describing volumes that are mounted from the host. - properties: - hostPath: - description: HostPath is the path in the host that will be mounted inside the pod. - type: string - mountPath: - description: MountPath is the path inside the pod where hostPath will be mounted. - type: string - name: - description: Name of the volume inside the pod template. - type: string - pathType: - description: PathType is the type of the HostPath. - type: string - readOnly: - description: ReadOnly controls write access to the volume - type: boolean - required: - - hostPath - - mountPath - - name - type: object - type: array - type: object - type: object - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - replaceFS: - description: 'ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of . NOTE: unless you define a label, this requires the use of the ''any'' partition directive.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - append: - description: Append specifies whether to append Content to existing file if Path exists. - type: boolean - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - format: - description: Format specifies the output format of the bootstrap data - enum: - - cloud-config - - ignition - type: string - ignition: - description: Ignition contains Ignition specific configuration. - properties: - containerLinuxConfig: - description: ContainerLinuxConfig contains CLC specific configuration. - properties: - additionalConfig: - description: "AdditionalConfig contains additional configuration to be merged with the Ignition configuration generated by the bootstrapper controller. More info: https://coreos.github.io/ignition/operator-notes/#config-merging \n The data format is documented here: https://kinvolk.io/docs/flatcar-container-linux/latest/provisioning/cl-config/" - type: string - strict: - description: Strict controls if AdditionalConfig should be strictly parsed. If so, warnings are treated as errors. - type: boolean - type: object - type: object - initConfiguration: - description: InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - bootstrapTokens: - description: BootstrapTokens is respected at `kubeadm init` time and describes a set of Bootstrap Tokens to create. This information IS NOT uploaded to the kubeadm cluster configmap, partly because of its sensitive nature - items: - description: BootstrapToken describes one bootstrap token, stored as a Secret in the cluster. - properties: - description: - description: Description sets a human-friendly message why this token exists and what it's used for, so other administrators can know its purpose. - type: string - expires: - description: Expires specifies the timestamp when this token expires. Defaults to being set dynamically at runtime based on the TTL. Expires and TTL are mutually exclusive. - format: date-time - type: string - groups: - description: Groups specifies the extra groups that this token will authenticate as when/if used for authentication - items: - type: string - type: array - token: - description: Token is used for establishing bidirectional trust between nodes and control-planes. Used for joining nodes in the cluster. - type: string - ttl: - description: TTL defines the time to live for this token. Defaults to 24h. Expires and TTL are mutually exclusive. - type: string - usages: - description: Usages describes the ways in which this token can be used. Can by default be used for establishing bidirectional trust, but that can be changed here. - items: - type: string - type: array - required: - - token - type: object - type: array - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance that's deployed on this control plane node In HA setups, this differs from ClusterConfiguration.ControlPlaneEndpoint in the sense that ControlPlaneEndpoint is the global endpoint for the cluster, which then loadbalances the requests to each individual API server. This configuration object lets you customize what IP/DNS name and port the local API server advertises it's accessible on. By default, kubeadm tries to auto-detect the IP of the default interface and use that, but in case that process fails you may set the desired value here. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying patches to components deployed by kubeadm during "kubeadm init". The minimum kubernetes version needed to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic" "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. These files can be written into the target directory via KubeadmConfig.Files which specifies additional files to be created on the machine, either with content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during command execution. The list of phases can be obtained with the "kubeadm init --help" command. This option takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - joinConfiguration: - description: JoinConfiguration is the kubeadm configuration for the join command - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - caCertPath: - description: 'CACertPath is the path to the SSL certificate authority used to secure comunications between node and control-plane. Defaults to "/etc/kubernetes/pki/ca.crt". TODO: revisit when there is defaulting from k/k' - type: string - controlPlane: - description: ControlPlane defines the additional control plane instance to be deployed on the joining node. If nil, no additional control plane instance will be deployed. - properties: - localAPIEndpoint: - description: LocalAPIEndpoint represents the endpoint of the API server instance to be deployed on this node. - properties: - advertiseAddress: - description: AdvertiseAddress sets the IP address for the API server to advertise. - type: string - bindPort: - description: BindPort sets the secure port for the API Server to bind to. Defaults to 6443. - format: int32 - type: integer - type: object - type: object - discovery: - description: 'Discovery specifies the options for the kubelet to use during the TLS Bootstrap process TODO: revisit when there is defaulting from k/k' - properties: - bootstrapToken: - description: BootstrapToken is used to set the options for bootstrap token based discovery BootstrapToken and File are mutually exclusive - properties: - apiServerEndpoint: - description: APIServerEndpoint is an IP or domain name to the API server from which info will be fetched. - type: string - caCertHashes: - description: 'CACertHashes specifies a set of public key pins to verify when token-based discovery is used. The root CA found during discovery must match one of these values. Specifying an empty set disables root CA pinning, which can be unsafe. Each hash is specified as ":", where the only currently supported type is "sha256". This is a hex-encoded SHA-256 hash of the Subject Public Key Info (SPKI) object in DER-encoded ASN.1. These hashes can be calculated using, for example, OpenSSL: openssl x509 -pubkey -in ca.crt openssl rsa -pubin -outform der 2>&/dev/null | openssl dgst -sha256 -hex' - items: - type: string - type: array - token: - description: Token is a token used to validate cluster information fetched from the control-plane. - type: string - unsafeSkipCAVerification: - description: UnsafeSkipCAVerification allows token-based discovery without CA verification via CACertHashes. This can weaken the security of kubeadm since other nodes can impersonate the control-plane. - type: boolean - required: - - token - type: object - file: - description: File is used to specify a file or URL to a kubeconfig file from which to load cluster information BootstrapToken and File are mutually exclusive - properties: - kubeConfigPath: - description: KubeConfigPath is used to specify the actual file path or URL to the kubeconfig file from which to load cluster information - type: string - required: - - kubeConfigPath - type: object - timeout: - description: Timeout modifies the discovery timeout - type: string - tlsBootstrapToken: - description: TLSBootstrapToken is a token used for TLS bootstrapping. If .BootstrapToken is set, this field is defaulted to .BootstrapToken.Token, but can be overridden. If .File is set, this field **must be set** in case the KubeConfigFile does not contain any other authentication information - type: string - type: object - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - nodeRegistration: - description: NodeRegistration holds fields that relate to registering the new control-plane node to the cluster. When used in the context of control plane nodes, NodeRegistration should remain consistent across both InitConfiguration and JoinConfiguration - properties: - criSocket: - description: CRISocket is used to retrieve container runtime info. This information will be annotated to the Node API object, for later re-use - type: string - ignorePreflightErrors: - description: IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered. - items: - type: string - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config-1.X ConfigMap Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on. - type: object - name: - description: Name is the `.Metadata.Name` field of the Node API object that will be created in this `kubeadm init` or `kubeadm join` operation. This field is also used in the CommonName field of the kubelet's client certificate to the API server. Defaults to the hostname of the node if not provided. - type: string - taints: - description: 'Taints specifies the taints the Node API object should be registered with. If this field is unset, i.e. nil, in the `kubeadm init` process it will be defaulted to []v1.Taint{''node-role.kubernetes.io/master=""''}. If you don''t want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file. This field is solely used for Node registration.' - items: - description: The node this Taint is attached to has the "effect" on any pod that does not tolerate the Taint. - properties: - effect: - description: Required. The effect of the taint on pods that do not tolerate the taint. Valid effects are NoSchedule, PreferNoSchedule and NoExecute. - type: string - key: - description: Required. The taint key to be applied to a node. - type: string - timeAdded: - description: TimeAdded represents the time at which the taint was added. It is only written for NoExecute taints. - format: date-time - type: string - value: - description: The taint value corresponding to the taint key. - type: string - required: - - effect - - key - type: object - type: array - type: object - patches: - description: Patches contains options related to applying patches to components deployed by kubeadm during "kubeadm join". The minimum kubernetes version needed to support Patches is v1.22 - properties: - directory: - description: Directory is a path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic" "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. These files can be written into the target directory via KubeadmConfig.Files which specifies additional files to be created on the machine, either with content inline or by referencing a secret. - type: string - type: object - skipPhases: - description: SkipPhases is a list of phases to skip during command execution. The list of phases can be obtained with the "kubeadm init --help" command. This option takes effect only on Kubernetes >=1.22.0. - items: - type: string - type: array - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - postKubeadmCommands: - description: PostKubeadmCommands specifies extra commands to run after kubeadm runs - items: - type: string - type: array - preKubeadmCommands: - description: PreKubeadmCommands specifies extra commands to run before kubeadm runs - items: - type: string - type: array - useExperimentalRetryJoin: - description: "UseExperimentalRetryJoin replaces a basic kubeadm command with a shell script with retries for joins. \n This is meant to be an experimental temporary workaround on some environments where joins fail due to timing (and other issues). The long term goal is to add retries to kubeadm proper and use that functionality. \n This will add about 40KB to userdata \n For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055. Deprecated: This experimental fix is no longer needed and this field will be removed in a future release." - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the user name - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of passwd to populate the passwd. - properties: - secret: - description: Secret represents a secret that should populate this password. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - verbosity: - description: Verbosity is the number for the kubeadm log level verbosity. It overrides the `--v` flag in kubeadm commands. - format: int32 - type: integer - type: object - machineTemplate: - description: MachineTemplate contains information about how machines should be shaped when creating or updating a control plane. - properties: - nodeDeletionTimeout: - description: NodeDeletionTimeout defines how long the machine controller will attempt to delete the Node that the Machine hosts after the Machine is marked for deletion. A duration of 0 will retry deletion indefinitely. If no value is provided, the default value for this property of the Machine resource will be used. - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a controlplane node The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - type: object - rolloutAfter: - description: RolloutAfter is a field to indicate a rollout should be performed after the specified time even if no changes have been made to the KubeadmControlPlane. - format: date-time - type: string - rolloutBefore: - description: RolloutBefore is a field to indicate a rollout should be performed if the specified criteria is met. - properties: - certificatesExpiryDays: - description: CertificatesExpiryDays indicates a rollout needs to be performed if the certificates of the machine will expire within the specified days. - format: int32 - type: integer - type: object - rolloutStrategy: - default: - rollingUpdate: - maxSurge: 1 - type: RollingUpdate - description: The RolloutStrategy to use to replace control plane machines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if RolloutStrategyType = RollingUpdate. - properties: - maxSurge: - anyOf: - - type: integer - - type: string - description: 'The maximum number of control planes that can be scheduled above or under the desired number of control planes. Value can be an absolute number 1 or 0. Defaults to 1. Example: when this is set to 1, the control plane can be scaled up immediately when the rolling update starts.' - x-kubernetes-int-or-string: true - type: object - type: - description: Type of rollout. Currently the only supported strategy is "RollingUpdate". Default is RollingUpdate. - type: string - type: object - required: - - kubeadmConfigSpec - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-manager - namespace: capi-kubeadm-control-plane-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-leader-election-role - namespace: capi-kubeadm-control-plane-system -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -aggregationRule: - clusterRoleSelectors: - - matchLabels: - kubeadm.controlplane.cluster.x-k8s.io/aggregate-to-manager: "true" -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-aggregated-manager-role -rules: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - kubeadm.controlplane.cluster.x-k8s.io/aggregate-to-manager: "true" - name: capi-kubeadm-control-plane-manager-role -rules: -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - get - - list - - watch -- apiGroups: - - bootstrap.cluster.x-k8s.io - - controlplane.cluster.x-k8s.io - - infrastructure.cluster.x-k8s.io - resources: - - '*' - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - get - - list - - patch - - update - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-leader-election-rolebinding - namespace: capi-kubeadm-control-plane-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capi-kubeadm-control-plane-leader-election-role -subjects: -- kind: ServiceAccount - name: capi-kubeadm-control-plane-manager - namespace: capi-kubeadm-control-plane-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capi-kubeadm-control-plane-aggregated-manager-role -subjects: -- kind: ServiceAccount - name: capi-kubeadm-control-plane-manager - namespace: capi-kubeadm-control-plane-system ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: control-plane-kubeadm ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - control-plane: controller-manager - name: capi-kubeadm-control-plane-controller-manager - namespace: capi-kubeadm-control-plane-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: control-plane-kubeadm - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --metrics-bind-addr=localhost:8080 - - --feature-gates=ClusterTopology=${CLUSTER_TOPOLOGY:=true},KubeadmBootstrapFormatIgnition=${EXP_KUBEADM_BOOTSTRAP_FORMAT_IGNITION:=false} - command: - - /manager - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_UID - valueFrom: - fieldRef: - fieldPath: metadata.uid - image: registry.tkg.vmware.run/cluster-api/kubeadm-control-plane-controller:${KCP_CONTROLLER_IMAGE_TAG} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - serviceAccountName: capi-kubeadm-control-plane-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - secretName: capi-kubeadm-control-plane-webhook-service-cert - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-serving-cert - namespace: capi-kubeadm-control-plane-system -spec: - dnsNames: - - capi-kubeadm-control-plane-webhook-service.capi-kubeadm-control-plane-system.svc - - capi-kubeadm-control-plane-webhook-service.capi-kubeadm-control-plane-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capi-kubeadm-control-plane-selfsigned-issuer - secretName: capi-kubeadm-control-plane-webhook-service-cert - subject: - organizations: - - k8s-sig-cluster-lifecycle ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-selfsigned-issuer - namespace: capi-kubeadm-control-plane-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-control-plane-system/capi-kubeadm-control-plane-serving-cert - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /mutate-controlplane-cluster-x-k8s-io-v1beta1-kubeadmcontrolplane - failurePolicy: Fail - matchPolicy: Equivalent - name: default.kubeadmcontrolplane.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmcontrolplanes - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /mutate-controlplane-cluster-x-k8s-io-v1beta1-kubeadmcontrolplanetemplate - failurePolicy: Fail - name: default.kubeadmcontrolplanetemplate.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmcontrolplanetemplates - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capi-kubeadm-control-plane-system/capi-kubeadm-control-plane-serving-cert - labels: - cluster.x-k8s.io/provider: control-plane-kubeadm - name: capi-kubeadm-control-plane-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /validate-controlplane-cluster-x-k8s-io-v1beta1-kubeadmcontrolplane - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.kubeadmcontrolplane.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmcontrolplanes - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /validate-controlplane-cluster-x-k8s-io-v1beta1-kubeadmcontrolplanetemplate - failurePolicy: Fail - name: validation.kubeadmcontrolplanetemplate.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - kubeadmcontrolplanetemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capi-kubeadm-control-plane-webhook-service - namespace: capi-kubeadm-control-plane-system - path: /validate-scale-controlplane-cluster-x-k8s-io-v1beta1-kubeadmcontrolplane - failurePolicy: Fail - matchPolicy: Equivalent - name: validation-scale.kubeadmcontrolplane.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - UPDATE - resources: - - kubeadmcontrolplanes/scale - sideEffects: None diff --git a/providers/control-plane-kubeadm/v1.2.8/metadata.yaml b/providers/control-plane-kubeadm/v1.2.8/metadata.yaml deleted file mode 100644 index 6957197b7b..0000000000 --- a/providers/control-plane-kubeadm/v1.2.8/metadata.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: -- major: 1 - minor: 2 - contract: v1beta1 -- major: 1 - minor: 1 - contract: v1beta1 -- major: 1 - minor: 0 - contract: v1beta1 -- major: 0 - minor: 4 - contract: v1alpha4 -- major: 0 - minor: 3 - contract: v1alpha3 diff --git a/providers/hack/Dockerfile.templates b/providers/hack/Dockerfile.templates deleted file mode 100644 index a0188e6806..0000000000 --- a/providers/hack/Dockerfile.templates +++ /dev/null @@ -1,6 +0,0 @@ -FROM scratch - -################################################################################ -## COPY TEMPLATES ## -################################################################################ -COPY . ./ \ No newline at end of file diff --git a/providers/infrastructure-aws/v2.0.2/cconly/base.yaml b/providers/infrastructure-aws/v2.0.2/cconly/base.yaml deleted file mode 100644 index 8c779c88f5..0000000000 --- a/providers/infrastructure-aws/v2.0.2/cconly/base.yaml +++ /dev/null @@ -1,1516 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - name: #@ "tkg-aws-default-{}".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - annotations: - run.tanzu.vmware.com/resolve-tkr: "" -spec: - controlPlane: - ref: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - name: #@ "tkg-aws-default-{}-kcp".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - machineInfrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - name: #@ "tkg-aws-default-{}-control-plane".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - workers: - machineDeployments: - - class: tkg-worker - template: - bootstrap: - ref: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: #@ "tkg-aws-default-{}-md-config".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - name: #@ "tkg-aws-default-{}-worker".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - name: #@ "tkg-aws-default-{}-cluster".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - variables: - - name: etcdExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: apiServerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeSchedulerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeControllerManagerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: controlPlaneKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: workerKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: tlsCipherSuites - required: false - schema: - openAPIV3Schema: - type: string - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - - name: region - required: true - schema: - openAPIV3Schema: - type: string - #@ if data.values.AWS_REGION: - default: #@ data.values.AWS_REGION - #@ end - - name: sshKeyName - required: true - schema: - openAPIV3Schema: - type: string - #@ if data.values.AWS_SSH_KEY_NAME: - default: #@ data.values.AWS_SSH_KEY_NAME - #@ end - - name: identityRef - required: true - schema: - openAPIV3Schema: - type: object - properties: - kind: - type: string - default: AWSClusterRoleIdentity - name: - type: string - #! required: - #! - name - - name: bastion - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - required: - - enabled - default: - enabled: #@ data.values.BASTION_HOST_ENABLED - - name: loadBalancerSchemeInternal - required: false - schema: - openAPIV3Schema: - type: boolean - default: false - - name: cni - required: true - schema: - openAPIV3Schema: - type: string - #@ if data.values.CNI: - default: #@ data.values.CNI - #@ else: - default: "" - #@ end - - name: network - required: true - schema: - openAPIV3Schema: - type: object - properties: - vpc: - type: object - properties: - existingID: - type: string - cidr: - type: string - default: 10.0.0.0/16 - format: cidr - subnets: - type: array - items: - type: object - properties: - az: - type: string - private: &subnet - type: object - properties: - id: - type: string - cidr: - type: string - format: cidr - public: *subnet - securityGroupOverrides: - type: object - properties: - bastion: - type: string - apiServerLB: - type: string - lb: - type: string - controlplane: - type: string - node: - type: string - required: - - vpc - - subnets - - name: proxy - required: false - schema: - openAPIV3Schema: - type: object - properties: - httpProxy: - type: string - httpsProxy: - type: string - noProxy: - type: array - items: - type: string - default: [] - required: - - httpProxy - - httpsProxy - - name: controlPlane - required: true - schema: - openAPIV3Schema: - type: object - properties: - instanceType: - type: string - default: t3.large - rootVolume: - type: object - properties: - sizeGiB: - type: integer - #@ if data.values.AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB: - default: #@ data.values.AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB - #@ else: - default: 80 - #@ end - nodeLabels: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: worker - required: true - schema: - openAPIV3Schema: - type: object - properties: - instanceType: - type: string - default: m5.large - rootVolume: - type: object - properties: - sizeGiB: - type: integer - #@ if data.values.AWS_NODE_OS_DISK_SIZE_GIB: - default: #@ data.values.AWS_NODE_OS_DISK_SIZE_GIB - #@ else: - default: 80 - #@ end - - name: imageRepository - required: false - schema: - openAPIV3Schema: - type: object - properties: - host: - type: string - tlsCertificateValidation: - type: boolean - default: true - - name: trust - required: false - schema: - openAPIV3Schema: - type: object - properties: - additionalTrustedCAs: - type: array - items: - type: object - properties: - name: - type: string - data: - type: string - required: - - name - - data - - name: additionalImageRegistries - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - required: - - host - properties: - host: - type: string - skipTlsVerify: - type: boolean - default: false - caCert: - type: string - - name: auditLogging - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: false - required: - - enabled - default: - enabled: false - - name: nodePoolLabels - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: TKR_DATA - required: false - schema: - openAPIV3Schema: - type: object - properties: {} - - name: controlPlaneCertificateRotation - required: false - schema: - openAPIV3Schema: - type: object - properties: - activate: - type: boolean - default: true - daysBefore: - type: integer - format: int32 - minimum: 7 - default: 90 - default: - activate: true - daysBefore: 90 - patches: - - name: etcdExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .etcdExtraArgs }} - {{- if eq $key "cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: apiServerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: aws - {{- end }} - - name: kubeSchedulerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/scheduler/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .kubeSchedulerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: kubeControllerManagerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .kubeControllerManagerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: aws - {{- end }} - - name: controlPlaneKubeletExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: aws - {{- end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: aws - {{- end }} - - name: workerKubeletExtraArgs - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - "tkg-worker" - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .workerKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: aws - {{- end }} - - name: AWSCT_main - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: replace - path: /spec/template/spec/region - valueFrom: - variable: region - - op: replace - path: /spec/template/spec/sshKeyName - valueFrom: - variable: sshKeyName - - op: replace - path: /spec/template/spec/bastion/enabled - valueFrom: - variable: bastion.enabled - - op: add - path: /spec/template/spec/network/vpc/cidrBlock - valueFrom: - variable: network.vpc.cidr - - op: replace - path: /spec/template/spec/network/subnets - valueFrom: - template: | - {{ $suffix := list "a" "b" "c" }} - {{- range $i, $subnet := .network.subnets }} - - availabilityZone: {{ if $subnet.az }} {{- $subnet.az }} {{- else if $.region }} {{- $.region }} {{- index $suffix $i }} {{- end }} - cidrBlock: {{ $subnet.private.cidr | default "\"\"" }} - id: {{ $subnet.private.id | default "\"\"" }} - {{- if or (empty $.network.vpc.existingID) (not (empty $subnet.public)) }} - - availabilityZone: {{ if $subnet.az }} {{- $subnet.az }} {{- else if $.region }} {{- $.region }} {{- index $suffix $i }} {{- end }} - cidrBlock: {{ $subnet.public.cidr | default "\"\"" }} - isPublic: true - id: {{ $subnet.public.id | default "\"\"" }} - {{- end }} - {{- end }} - - - name: AWSCT_CNIIngressRules_Calico - enabledIf: '{{ .cni | eq "calico" }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/network/cni/cniIngressRules/- - value: - description: bgp (calico) - fromPort: 179 - protocol: tcp - toPort: 179 - - op: add - path: /spec/template/spec/network/cni/cniIngressRules/- - value: - description: IP-in-IP (calico) - fromPort: -1 - protocol: "4" - toPort: 65535 - - name: AWSCT_CNIIngressRules_Antrea - enabledIf: '{{ .cni | eq "antrea" }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/network/cni/cniIngressRules/- - value: - description: antrea1 - fromPort: 10349 - protocol: tcp - toPort: 10349 - - op: add - path: /spec/template/spec/network/cni/cniIngressRules/- - value: - description: genev - fromPort: 6081 - protocol: udp - toPort: 6081 - - - name: AWSCT_VPC_ID - enabledIf: '{{ not (empty .network.vpc.existingID) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/network/vpc/id - valueFrom: - variable: network.vpc.existingID - - - name: AWSCT_IdentityRef - enabledIf: '{{ not (empty .identityRef.name) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/identityRef - valueFrom: - template: | - kind: {{ if .identityRef.kind }} {{- .identityRef.kind }} {{- else -}} AWSClusterRoleIdentity {{- end }} - name: {{ .identityRef.name }} - - - name: AWSCT_ControlPlaneLoadBalancerScheme - enabledIf: '{{ .loadBalancerSchemeInternal }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/controlPlaneLoadBalancer - valueFrom: - template: | - scheme: internal - - - name: AWSCT_SecurityGroupOverrides - enabledIf: '{{ any .network.securityGroupOverrides.bastion .network.securityGroupOverrides.controlPlane .network.securityGroupOverrides.apiServerLB .network.securityGroupOverrides.node .network.securityGroupOverrides.lb }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/network/securityGroupOverrides - valueFrom: - template: | - {{ if .network.securityGroupOverrides.bastion }} bastion: {{ .network.securityGroupOverrides.bastion }} {{- end }} - {{ if .network.securityGroupOverrides.controlPlane }} controlplane: {{ .network.securityGroupOverrides.controlPlane }} {{- end }} - {{ if .network.securityGroupOverrides.apiServerLB }} apiserver-lb: {{ .network.securityGroupOverrides.apiServerLB }} {{- end }} - {{ if .network.securityGroupOverrides.node }} node: {{ .network.securityGroupOverrides.node }} {{- end }} - {{ if .network.securityGroupOverrides.lb }} lb: {{ .network.securityGroupOverrides.lb }} {{- end }} - - - name: AWS_KCPT - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.etcd.imageTag }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.coredns.imageTag }}' - - - name: AWS_MT_controlplane - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/instanceType - valueFrom: - variable: controlPlane.instanceType - - op: replace - path: /spec/template/spec/sshKeyName - valueFrom: - variable: sshKeyName - - op: replace - path: /spec/template/spec/rootVolume/size - valueFrom: - variable: controlPlane.rootVolume.sizeGiB - - op: replace - path: /spec/template/spec/ami/id - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).osImageRef.id }}' - - name: AWS_MT_worker - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - matchResources: - machineDeploymentClass: - names: - - "tkg-worker" - jsonPatches: - - op: replace - path: /spec/template/spec/instanceType - valueFrom: - variable: worker.instanceType - - op: replace - path: /spec/template/spec/sshKeyName - valueFrom: - variable: sshKeyName - - op: replace - path: /spec/template/spec/rootVolume/size - valueFrom: - variable: worker.rootVolume.sizeGiB - - op: replace - path: /spec/template/spec/ami/id - valueFrom: - template: '{{ (index .TKR_DATA .builtin.machineDeployment.version).osImageRef.id }}' - - - name: nodeLabels - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key }}={{ $val }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key }}={{ $val }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - "tkg-worker" - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.machineDeployment.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end}} - {{- if .nodePoolLabels -}} - , - {{- $first := true }} - {{- range .nodePoolLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - name: httpProxy - enabledIf: '{{ not (empty .proxy) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &containerdProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list .network.vpc.cidr "169.254.0.0/16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /etc/systemd/system/containerd.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &kubeletProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list .network.vpc.cidr "169.254.0.0/16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /usr/lib/systemd/system/kubelet.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPProxy | - export HTTP_PROXY= {{- .proxy.httpProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPSProxy | - export HTTPS_PROXY= {{- .proxy.httpsProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportNoProxy | - export NO_PROXY= {{- list .network.vpc.cidr "169.254.0.0/16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *containerdProxyConf - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *kubeletProxyConf - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPSProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportNoProxy - - name: httpProxyCACert - enabledIf: '{{ $hasProxyCert := false }} {{- range .trust.additionalTrustedCAs }} {{- if .name | eq "proxy" }} {{- $hasProxyCert = true }} {{- end }} {{- end }} {{- $hasProxyCert }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - name: customizedImageRepo - enabledIf: '{{ not (empty .imageRepository.host) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - name: registryCACert - enabledIf: '{{ not (empty .trust.additionalTrustedCAs) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/containerd/ {{- index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} .crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/containerd/{{ index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }}.crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - name: additionalRegistryCACerts - enabledIf: '{{ not (empty .additionalImageRegistries) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &insertCAScript | - path: /tmp/insert_registry_ca_certs.sh - content: | - #!/bin/bash - set -e - {{- range .additionalImageRegistries }} - {{- if eq .skipTlsVerify false }} - echo '{{ .caCert }}' | base64 -d > /etc/containerd/{{ .host }}.crt - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo ' ca_file = "/etc/containerd/{{ .host }}.crt"' >> /etc/containerd/config.toml - {{- else }} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo " insecure_skip_verify = true" >> /etc/containerd/config.toml - {{- end }} - {{- end }} - permissions: "0755" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *insertCAScript - - name: auditLogging - enabledIf: '{{ .auditLogging.enabled }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-path - value: /var/log/kubernetes/audit.log - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-policy-file - value: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxage - value: "30" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxbackup - value: "10" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxsize - value: "100" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-policy - hostPath: /etc/kubernetes/audit-policy.yaml - mountPath: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-logs - hostPath: /var/log/kubernetes - mountPath: /var/log/kubernetes - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - value: - path: /etc/kubernetes/audit-policy.yaml - owner: "root:root" - permissions: "0600" - content: | - --- - apiVersion: audit.k8s.io/v1 - kind: Policy - rules: - #! The following requests were manually identified as high-volume and low-risk, - #! so drop them. - - level: None - users: ["system:serviceaccount:kube-system:kube-proxy"] - verbs: ["watch"] - resources: - - group: "" #! core - resources: ["endpoints", "services", "services/status"] - - level: None - userGroups: ["system:nodes"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["nodes", "nodes/status"] - - level: None - users: - - system:kube-controller-manager - - system:kube-scheduler - - system:serviceaccount:kube-system:endpoint-controller - verbs: ["get", "update"] - namespaces: ["kube-system"] - resources: - - group: "" #! core - resources: ["endpoints"] - - level: None - users: ["system:apiserver"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["namespaces", "namespaces/status", "namespaces/finalize"] - #! Don't log HPA fetching metrics. - - level: None - users: - - system:kube-controller-manager - verbs: ["get", "list"] - resources: - - group: "metrics.k8s.io" - #! Don't log these read-only URLs. - - level: None - nonResourceURLs: - - /healthz* - - /version - - /swagger* - #! Don't log events requests. - - level: None - resources: - - group: "" #! core - resources: ["events"] - #! Don't log TMC service account performing read operations because they are high-volume. - - level: None - userGroups: ["system:serviceaccounts:vmware-system-tmc"] - verbs: ["get", "list", "watch"] - #! Don't log read requests from garbage collector because they are high-volume. - - level: None - users: ["system:serviceaccount:kube-system:generic-garbage-collector"] - verbs: ["get", "list", "watch"] - #! node and pod status calls from nodes are high-volume and can be large, don't log responses for expected updates from nodes - - level: Request - userGroups: ["system:nodes"] - verbs: ["update","patch"] - resources: - - group: "" #! core - resources: ["nodes/status", "pods/status"] - omitStages: - - "RequestReceived" - #! deletecollection calls can be large, don't log responses for expected namespace deletions - - level: Request - users: ["system:serviceaccount:kube-system:namespace-controller"] - verbs: ["deletecollection"] - omitStages: - - "RequestReceived" - #! Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data, - #! so only log at the Metadata level. - - level: Metadata - resources: - - group: "" #! core - resources: ["secrets", "configmaps"] - - group: authentication.k8s.io - resources: ["tokenreviews"] - omitStages: - - "RequestReceived" - #! Get repsonses can be large; skip them. - - level: Request - verbs: ["get", "list", "watch"] - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for known APIs - - level: RequestResponse - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for all other requests. - - level: Metadata - omitStages: - - "RequestReceived" - - name: kcptCertificateRotation - enabledIf: '{{ .controlPlaneCertificateRotation.activate }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/rolloutBefore - valueFrom: - template: | - certificatesExpiryDays: {{ .controlPlaneCertificateRotation.daysBefore }} ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSClusterTemplate -metadata: - name: #@ "tkg-aws-default-{}-cluster".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - region: #@ data.values.AWS_REGION - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - bastion: - enabled: true - network: - vpc: - cidrBlock: - subnets: - - availabilityZone: #@ data.values.AWS_NODE_AZ - cidrBlock: #@ data.values.AWS_PRIVATE_NODE_CIDR - id: #@ data.values.AWS_PRIVATE_SUBNET_ID - cni: - cniIngressRules: - - description: kapp-controller - fromPort: 10100 - protocol: tcp - toPort: 10100 - - description: addons-manager - fromPort: 9865 - protocol: tcp - toPort: 9865 ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlaneTemplate -metadata: - name: #@ "tkg-aws-default-{}-kcp".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - kubeadmConfigSpec: - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - preKubeadmCommands: - #! Ensure a non-empty preKubeadmCommands array is present to facilitate patching - - echo "running preKubeadmCommands..." - useExperimentalRetryJoin: true - clusterConfiguration: - apiServer: - timeoutForControlPlane: "8m0s" - extraVolumes: [] - extraArgs: {} - controllerManager: - extraArgs: {} - dns: - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - extraArgs: {} - imageRepository: dummy.registry.vmware.com - scheduler: - extraArgs: {} - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: {} - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: {} ---- -kind: AWSMachineTemplate -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -metadata: - name: #@ "tkg-aws-default-{}-control-plane".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - instanceType: #@ data.values.CONTROL_PLANE_MACHINE_TYPE - iamInstanceProfile: "control-plane.tkg.cloud.vmware.com" - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - ami: - id: #@ data.values.AWS_AMI_ID - rootVolume: - size: 80 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSMachineTemplate -metadata: - name: #@ "tkg-aws-default-{}-worker".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - instanceType: #@ data.values.NODE_MACHINE_TYPE - iamInstanceProfile: "nodes.tkg.cloud.vmware.com" - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - ami: - id: #@ data.values.AWS_AMI_ID - rootVolume: - size: 80 ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "tkg-aws-default-{}-md-config".format(data.values.AWS_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - useExperimentalRetryJoin: true - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: {} - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - preKubeadmCommands: - #! Ensure a non-empty preKubeadmCommands array is present to facilitate patching - - echo "running preKubeadmCommands..." diff --git a/providers/infrastructure-aws/v2.0.2/cconly/overlay-kube-apiserver-admission.yaml b/providers/infrastructure-aws/v2.0.2/cconly/overlay-kube-apiserver-admission.yaml deleted file mode 100644 index f5f7a77dcb..0000000000 --- a/providers/infrastructure-aws/v2.0.2/cconly/overlay-kube-apiserver-admission.yaml +++ /dev/null @@ -1,192 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/append - - name: eventRateLimitConf - required: false - schema: - openAPIV3Schema: - type: string - default: "" - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/admission-control-config.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: admin-control-conf - hostPath: /etc/kubernetes/admission-control-config.yaml - mountPath: /etc/kubernetes/admission-control-config.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/admission-control-config.yaml - content: |- - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - {{- if and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }} - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - {{- end }} - {{- if .eventRateLimitConf }} - - name: EventRateLimit - path: eventConfig.yaml - {{- end }} - enabledIf: '{{ or (and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version)) (.eventRateLimitConf) }}' - #@overlay/append - - name: eventRateLimitConf - description: "Adds an admission configuration for EventRateLimit." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/enable-admission-plugins" - valueFrom: - template: | - {{ $containEnableAdmissionPlugin := false }} - {{- $admissionPlugins := "" }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "enable-admission-plugins" }} - {{- $containEnableAdmissionPlugin = true }} - {{- $admissionPlugins = $val }} - {{- end }} - {{- end }} - {{- if not $containEnableAdmissionPlugin }} - NodeRestriction,EventRateLimit - {{- else -}} - {{- $admissionPlugins -}},EventRateLimit - {{- end }} - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: event-conf - hostPath: /etc/kubernetes/eventConfig.yaml - mountPath: /etc/kubernetes/eventConfig.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/eventConfig.yaml - encoding: base64 - content: {{ .eventRateLimitConf}} - enabledIf: '{{ not (empty .eventRateLimitConf) }}' diff --git a/providers/infrastructure-aws/v2.0.2/cconly/overlay.yaml b/providers/infrastructure-aws/v2.0.2/cconly/overlay.yaml deleted file mode 100644 index f7c984209a..0000000000 --- a/providers/infrastructure-aws/v2.0.2/cconly/overlay.yaml +++ /dev/null @@ -1,77 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - controlPlane: - #@overlay/match missing_ok=True - machineHealthCheck: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_CONTROL_PLANE: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_CONTROL_PLANE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - workers: - machineDeployments: - #@overlay/match by=overlay.index(0) - - class: tkg-worker - #@overlay/match missing_ok=True - machineHealthCheck: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - patches: - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: KCP_INIT_APISERVER_EMPTY_EXTRAVOLUMES_ARRAY - #@overlay/append - - name: restartContainerdService - enabledIf: '{{ not (and (empty .proxy) (empty .trust.additionalTrustedCAs) (empty .imageRepository.host) (empty .additionalImageRegistries)) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl restart containerd - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl restart containerd diff --git a/providers/infrastructure-aws/v2.0.2/cluster-template-definition-dev.yaml b/providers/infrastructure-aws/v2.0.2/cluster-template-definition-dev.yaml deleted file mode 100644 index f4c3272c50..0000000000 --- a/providers/infrastructure-aws/v2.0.2/cluster-template-definition-dev.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-aws/v2.0.2/ytt - - path: providers/infrastructure-aws/ytt - - path: providers/ytt - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-aws/v2.0.2/cluster-template-definition-devcc.yaml b/providers/infrastructure-aws/v2.0.2/cluster-template-definition-devcc.yaml deleted file mode 100644 index 6ab8d75c0c..0000000000 --- a/providers/infrastructure-aws/v2.0.2/cluster-template-definition-devcc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/yttcb - - path: providers/infrastructure-aws/v2.0.2/yttcc - - path: providers/infrastructure-aws/yttcc - - path: providers/yttcc - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-aws/v2.0.2/cluster-template-definition-prod.yaml b/providers/infrastructure-aws/v2.0.2/cluster-template-definition-prod.yaml deleted file mode 100644 index f4c3272c50..0000000000 --- a/providers/infrastructure-aws/v2.0.2/cluster-template-definition-prod.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-aws/v2.0.2/ytt - - path: providers/infrastructure-aws/ytt - - path: providers/ytt - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-aws/v2.0.2/cluster-template-definition-prodcc.yaml b/providers/infrastructure-aws/v2.0.2/cluster-template-definition-prodcc.yaml deleted file mode 100644 index 6ab8d75c0c..0000000000 --- a/providers/infrastructure-aws/v2.0.2/cluster-template-definition-prodcc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/yttcb - - path: providers/infrastructure-aws/v2.0.2/yttcc - - path: providers/infrastructure-aws/yttcc - - path: providers/yttcc - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-aws/v2.0.2/clusterclass-tkg-aws-default.yaml b/providers/infrastructure-aws/v2.0.2/clusterclass-tkg-aws-default.yaml deleted file mode 100644 index 8cdd49f76b..0000000000 --- a/providers/infrastructure-aws/v2.0.2/clusterclass-tkg-aws-default.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-aws/v2.0.2/cconly - - path: providers/config_default.yaml diff --git a/providers/infrastructure-aws/v2.0.2/infrastructure-components.yaml b/providers/infrastructure-aws/v2.0.2/infrastructure-components.yaml deleted file mode 100644 index 5c90c73075..0000000000 --- a/providers/infrastructure-aws/v2.0.2/infrastructure-components.yaml +++ /dev/null @@ -1,9595 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - clusterctl.cluster.x-k8s.io/move-hierarchy: "" - name: awsclustercontrolleridentities.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSClusterControllerIdentity - listKind: AWSClusterControllerIdentityList - plural: awsclustercontrolleridentities - shortNames: - - awsci - singular: awsclustercontrolleridentity - scope: Cluster - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSClusterControllerIdentity is the Schema for the awsclustercontrolleridentities API It is used to grant access to use Cluster API Provider AWS Controller credentials. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterControllerIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces are allowed to use the identity from. Namespaces can be selected either using an array of namespaces or with label selector. An empty allowedNamespaces object indicates that AWSClusters can use this identity from any namespace. If this object is nil, no namespaces will be allowed (default behaviour, if this field is not provided) A namespace should be either in the NamespaceList or match with Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - type: object - type: object - served: true - storage: false - - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSClusterControllerIdentity is the Schema for the awsclustercontrolleridentities API It is used to grant access to use Cluster API Provider AWS Controller credentials. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterControllerIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces are allowed to use the identity from. Namespaces can be selected either using an array of namespaces or with label selector. An empty allowedNamespaces object indicates that AWSClusters can use this identity from any namespace. If this object is nil, no namespaces will be allowed (default behaviour, if this field is not provided) A namespace should be either in the NamespaceList or match with Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - clusterctl.cluster.x-k8s.io/move-hierarchy: "" - name: awsclusterroleidentities.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSClusterRoleIdentity - listKind: AWSClusterRoleIdentityList - plural: awsclusterroleidentities - shortNames: - - awsri - singular: awsclusterroleidentity - scope: Cluster - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSClusterRoleIdentity is the Schema for the awsclusterroleidentities API It is used to assume a role using the provided sourceRef. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterRoleIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces are allowed to use the identity from. Namespaces can be selected either using an array of namespaces or with label selector. An empty allowedNamespaces object indicates that AWSClusters can use this identity from any namespace. If this object is nil, no namespaces will be allowed (default behaviour, if this field is not provided) A namespace should be either in the NamespaceList or match with Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - durationSeconds: - description: The duration, in seconds, of the role session before it is renewed. - format: int32 - maximum: 43200 - minimum: 900 - type: integer - externalID: - description: A unique identifier that might be required when you assume a role in another account. If the administrator of the account to which the role belongs provided you with an external ID, then provide that value in the ExternalId parameter. This value can be any string, such as a passphrase or account number. A cross-account role is usually set up to trust everyone in an account. Therefore, the administrator of the trusting account might send an external ID to the administrator of the trusted account. That way, only someone with the ID can assume the role, rather than everyone in the account. For more information about the external ID, see How to Use an External ID When Granting Access to Your AWS Resources to a Third Party in the IAM User Guide. - type: string - inlinePolicy: - description: An IAM policy as a JSON-encoded string that you want to use as an inline session policy. - type: string - policyARNs: - description: The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as managed session policies. The policies must exist in the same account as the role. - items: - type: string - type: array - roleARN: - description: The Amazon Resource Name (ARN) of the role to assume. - type: string - sessionName: - description: An identifier for the assumed role session - type: string - sourceIdentityRef: - description: SourceIdentityRef is a reference to another identity which will be chained to do role assumption. All identity types are accepted. - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - required: - - roleARN - type: object - type: object - served: true - storage: false - - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSClusterRoleIdentity is the Schema for the awsclusterroleidentities API It is used to assume a role using the provided sourceRef. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterRoleIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces are allowed to use the identity from. Namespaces can be selected either using an array of namespaces or with label selector. An empty allowedNamespaces object indicates that AWSClusters can use this identity from any namespace. If this object is nil, no namespaces will be allowed (default behaviour, if this field is not provided) A namespace should be either in the NamespaceList or match with Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - durationSeconds: - description: The duration, in seconds, of the role session before it is renewed. - format: int32 - maximum: 43200 - minimum: 900 - type: integer - externalID: - description: A unique identifier that might be required when you assume a role in another account. If the administrator of the account to which the role belongs provided you with an external ID, then provide that value in the ExternalId parameter. This value can be any string, such as a passphrase or account number. A cross-account role is usually set up to trust everyone in an account. Therefore, the administrator of the trusting account might send an external ID to the administrator of the trusted account. That way, only someone with the ID can assume the role, rather than everyone in the account. For more information about the external ID, see How to Use an External ID When Granting Access to Your AWS Resources to a Third Party in the IAM User Guide. - type: string - inlinePolicy: - description: An IAM policy as a JSON-encoded string that you want to use as an inline session policy. - type: string - policyARNs: - description: The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as managed session policies. The policies must exist in the same account as the role. - items: - type: string - type: array - roleARN: - description: The Amazon Resource Name (ARN) of the role to assume. - type: string - sessionName: - description: An identifier for the assumed role session - type: string - sourceIdentityRef: - description: SourceIdentityRef is a reference to another identity which will be chained to do role assumption. All identity types are accepted. - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - required: - - roleARN - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsclusters.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSCluster - listKind: AWSClusterList - plural: awsclusters - shortNames: - - awsc - singular: awscluster - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this AWSCluster belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Cluster infrastructure is ready for EC2 instances - jsonPath: .status.ready - name: Ready - type: string - - description: AWS VPC the cluster is using - jsonPath: .spec.network.vpc.id - name: VPC - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint - name: Endpoint - priority: 1 - type: string - - description: Bastion IP address for breakglass access - jsonPath: .status.bastion.publicIp - name: Bastion IP - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSCluster is the schema for Amazon EC2 based Kubernetes Cluster API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSClusterSpec defines the desired state of an EC2-based Kubernetes cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default. - type: object - bastion: - description: Bastion contains options to configure the bastion host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks allowed to access the bastion host. They are set as ingress rules for the Bastion host's Security Group (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the bastion. If not specified, the AMI will default to one picked out in public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are no Ingress rules in the bastion host's security group. Requires AllowedCIDRBlocks to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a bastion host instance with a public ip to access the VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance type for the bastion. If not specified, Cluster API Provider AWS will use t3.micro for all regions except us-east-1, where t2.micro will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneLoadBalancer: - description: ControlPlaneLoadBalancer is optional configuration for customizing control plane behavior. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups sets the security groups used by the load balancer. Expected to be security group IDs This is optional - if not provided new security groups will be created for the load balancer - items: - type: string - type: array - crossZoneLoadBalancing: - description: "CrossZoneLoadBalancing enables the classic ELB cross availability zone balancing. \n With cross-zone load balancing, each load balancer node for your Classic Load Balancer distributes requests evenly across the registered instances in all enabled Availability Zones. If cross-zone load balancing is disabled, each load balancer node distributes requests evenly across the registered instances in its Availability Zone only. \n Defaults to false." - type: boolean - healthCheckProtocol: - description: HealthCheckProtocol sets the protocol type for classic ELB health check target default value is ClassicELBProtocolSSL - type: string - name: - description: Name sets the name of the classic ELB load balancer. As per AWS, the name must be unique within your set of load balancers for the region, must have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and cannot begin or end with a hyphen. Once set, the value cannot be changed. - maxLength: 32 - pattern: ^[A-Za-z0-9]([A-Za-z0-9]{0,31}|[-A-Za-z0-9]{0,30}[A-Za-z0-9])$ - type: string - scheme: - default: internet-facing - description: Scheme sets the scheme of the load balancer (defaults to internet-facing) - enum: - - internet-facing - - internal - type: string - subnets: - description: Subnets sets the subnets that should be applied to the control plane load balancer (defaults to discovered subnets for managed VPCs or an empty set for unmanaged VPCs) - items: - type: string - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be used when reconciling this cluster - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system used to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. - type: string - network: - description: NetworkSpec encapsulates all things related to AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply to control plane and worker node security groups. The source for the rule will be set to control plane and worker security group IDs. - items: - description: CNIIngressRule defines an AWS ingress rule for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the protocol type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set of security groups to use for cluster instances This is optional - if not provided new security groups will be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability zone to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block to be used when the provider creates a managed VPC. A subnet can have an IPv4 and an IPv6 address. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 subnet. A subnet is IPv6 when it is associated with a VPC that has IPv6 enabled. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public subnet. A subnet is public when it is associated with a route table that has a route to an internet gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id associated with the subnet. Ignored unless the subnet is managed by the provider, in which case this is set on the public subnet where the NAT gateway resides. It is then used to determine routes for private subnets in the same AZ as the public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id associated with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: array - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies how AZs should be selected if there are more AZs in a region than specified by AvailabilityZoneUsageLimit. There are 2 selection schemes: Ordered - selects based on alphabetical order Random - selects AZs randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies the maximum number of availability zones (AZ) that should be used in a region when automatically creating subnets. If a region has more than this number of AZs then this number of AZs will be picked randomly when creating default subnets. Defaults to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. Defaults to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider should use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet gateway associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings for the network. Supported only in managed clusters. This field cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided by Amazon when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the id of the egress only internet gateway associated with an IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must be defined in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: object - region: - description: The AWS Region the cluster lives in. - type: string - s3Bucket: - description: S3Bucket contains options to configure a supporting S3 bucket for this cluster - currently used for nodes requiring Ignition (https://coreos.github.io/ignition/) for bootstrapping (requires BootstrapFormatIgnition feature flag to be enabled). - properties: - controlPlaneIAMInstanceProfile: - description: ControlPlaneIAMInstanceProfile is a name of the IAMInstanceProfile, which will be allowed to read control-plane node bootstrap data from S3 Bucket. - type: string - name: - description: Name defines name of S3 Bucket to be created. - maxLength: 63 - minLength: 3 - pattern: ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ - type: string - nodesIAMInstanceProfiles: - description: NodesIAMInstanceProfiles is a list of IAM instance profiles, which will be allowed to read worker nodes bootstrap data from S3 Bucket. - items: - type: string - type: array - required: - - controlPlaneIAMInstanceProfile - - name - - nodesIAMInstanceProfiles - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the bastion host. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - type: object - status: - description: AWSClusterStatus defines the observed state of AWSCluster. - properties: - bastion: - description: Instance describes an AWS instance. - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - availabilityZone: - description: Availability zone of instance - type: string - ebsOptimized: - description: Indicates whether the instance is optimized for Amazon EBS I/O. - type: boolean - enaSupport: - description: Specifies whether enhanced networking with ENA is enabled. - type: boolean - iamProfile: - description: The name of the IAM instance profile associated with the instance, if applicable. - type: string - id: - type: string - imageId: - description: The ID of the AMI used to launch the instance. - type: string - instanceState: - description: The current state of the instance. - type: string - networkInterfaces: - description: Specifies ENIs attached to instance - items: - type: string - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - type: array - privateIp: - description: The private IPv4 address assigned to the instance. - type: string - publicIp: - description: The public IPv4 address assigned to the instance, if applicable. - type: string - rootVolume: - description: Configuration options for the root storage volume. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - securityGroupIds: - description: SecurityGroupIDs are one or more security group IDs this instance belongs to. - items: - type: string - type: array - spotMarketOptions: - description: SpotMarketOptions option for configuring instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: The name of the SSH key pair. - type: string - subnetId: - description: The ID of the subnet of the instance. - type: string - tags: - additionalProperties: - type: string - description: The tags associated with the instance. - type: object - tenancy: - description: Tenancy indicates if instance should run on shared or single-tenant hardware. - type: string - type: - description: The instance type. - type: string - userData: - description: UserData is the raw data script passed to the instance which is run upon bootstrap. This field must not be base64 encoded and should only be used when running a new instance. - type: string - volumeIDs: - description: IDs of the instance's volumes - items: - type: string - type: array - required: - - id - type: object - conditions: - description: Conditions provide observations of the operational state of a Cluster API resource. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a slice of FailureDomains. - type: object - networkStatus: - description: NetworkStatus encapsulates AWS networking resources. - properties: - apiServerElb: - description: APIServerELB is the Kubernetes api server classic load balancer. - properties: - attributes: - description: Attributes defines extra attributes associated with the load balancer. - properties: - crossZoneLoadBalancing: - description: CrossZoneLoadBalancing enables the classic load balancer load balancing. - type: boolean - idleTimeout: - description: IdleTimeout is time that the connection is allowed to be idle (no data has been sent over the connection) before it is closed by the load balancer. - format: int64 - type: integer - type: object - availabilityZones: - description: AvailabilityZones is an array of availability zones in the VPC attached to the load balancer. - items: - type: string - type: array - dnsName: - description: DNSName is the dns name of the load balancer. - type: string - healthChecks: - description: HealthCheck is the classic elb health check associated with the load balancer. - properties: - healthyThreshold: - format: int64 - type: integer - interval: - description: A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. - format: int64 - type: integer - target: - type: string - timeout: - description: A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. - format: int64 - type: integer - unhealthyThreshold: - format: int64 - type: integer - required: - - healthyThreshold - - interval - - target - - timeout - - unhealthyThreshold - type: object - listeners: - description: Listeners is an array of classic elb listeners associated with the load balancer. There must be at least one. - items: - description: ClassicELBListener defines an AWS classic load balancer listener. - properties: - instancePort: - format: int64 - type: integer - instanceProtocol: - description: ClassicELBProtocol defines listener protocols for a classic load balancer. - type: string - port: - format: int64 - type: integer - protocol: - description: ClassicELBProtocol defines listener protocols for a classic load balancer. - type: string - required: - - instancePort - - instanceProtocol - - port - - protocol - type: object - type: array - name: - description: The name of the load balancer. It must be unique within the set of load balancers defined in the region. It also serves as identifier. - type: string - scheme: - description: Scheme is the load balancer scheme, either internet-facing or private. - type: string - securityGroupIds: - description: SecurityGroupIDs is an array of security groups assigned to the load balancer. - items: - type: string - type: array - subnetIds: - description: SubnetIDs is an array of subnets in the VPC attached to the load balancer. - items: - type: string - type: array - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the load balancer. - type: object - type: object - securityGroups: - additionalProperties: - description: SecurityGroup defines an AWS security group. - properties: - id: - description: ID is a unique identifier. - type: string - ingressRule: - description: IngressRules is the inbound rules associated with the security group. - items: - description: IngressRule defines an AWS ingress rule for security groups. - properties: - cidrBlocks: - description: List of CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - description: - type: string - fromPort: - format: int64 - type: integer - ipv6CidrBlocks: - description: List of IPv6 CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - protocol: - description: SecurityGroupProtocol defines the protocol type for a security group rule. - type: string - sourceSecurityGroupIds: - description: The security group id to allow access from. Cannot be specified with CidrBlocks. - items: - type: string - type: array - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - name: - description: Name is the security group name. - type: string - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the security group. - type: object - required: - - id - - name - type: object - description: SecurityGroups is a map from the role/kind of the security group to its unique name, if any. - type: object - type: object - ready: - default: false - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this AWSCluster belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Cluster infrastructure is ready for EC2 instances - jsonPath: .status.ready - name: Ready - type: string - - description: AWS VPC the cluster is using - jsonPath: .spec.network.vpc.id - name: VPC - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint - name: Endpoint - priority: 1 - type: string - - description: Bastion IP address for breakglass access - jsonPath: .status.bastion.publicIp - name: Bastion IP - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSCluster is the schema for Amazon EC2 based Kubernetes Cluster API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSClusterSpec defines the desired state of an EC2-based Kubernetes cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default. - type: object - bastion: - description: Bastion contains options to configure the bastion host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks allowed to access the bastion host. They are set as ingress rules for the Bastion host's Security Group (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the bastion. If not specified, the AMI will default to one picked out in public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are no Ingress rules in the bastion host's security group. Requires AllowedCIDRBlocks to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a bastion host instance with a public ip to access the VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance type for the bastion. If not specified, Cluster API Provider AWS will use t3.micro for all regions except us-east-1, where t2.micro will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneLoadBalancer: - description: ControlPlaneLoadBalancer is optional configuration for customizing control plane behavior. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups sets the security groups used by the load balancer. Expected to be security group IDs This is optional - if not provided new security groups will be created for the load balancer - items: - type: string - type: array - crossZoneLoadBalancing: - description: "CrossZoneLoadBalancing enables the classic ELB cross availability zone balancing. \n With cross-zone load balancing, each load balancer node for your Classic Load Balancer distributes requests evenly across the registered instances in all enabled Availability Zones. If cross-zone load balancing is disabled, each load balancer node distributes requests evenly across the registered instances in its Availability Zone only. \n Defaults to false." - type: boolean - healthCheckProtocol: - description: HealthCheckProtocol sets the protocol type for classic ELB health check target default value is ClassicELBProtocolSSL - type: string - name: - description: Name sets the name of the classic ELB load balancer. As per AWS, the name must be unique within your set of load balancers for the region, must have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and cannot begin or end with a hyphen. Once set, the value cannot be changed. - maxLength: 32 - pattern: ^[A-Za-z0-9]([A-Za-z0-9]{0,31}|[-A-Za-z0-9]{0,30}[A-Za-z0-9])$ - type: string - scheme: - default: internet-facing - description: Scheme sets the scheme of the load balancer (defaults to internet-facing) - enum: - - internet-facing - - internal - type: string - subnets: - description: Subnets sets the subnets that should be applied to the control plane load balancer (defaults to discovered subnets for managed VPCs or an empty set for unmanaged VPCs) - items: - type: string - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be used when reconciling this cluster - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system used to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. - type: string - network: - description: NetworkSpec encapsulates all things related to AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply to control plane and worker node security groups. The source for the rule will be set to control plane and worker security group IDs. - items: - description: CNIIngressRule defines an AWS ingress rule for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the protocol type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set of security groups to use for cluster instances This is optional - if not provided new security groups will be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability zone to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block to be used when the provider creates a managed VPC. A subnet can have an IPv4 and an IPv6 address. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 subnet. A subnet is IPv6 when it is associated with a VPC that has IPv6 enabled. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public subnet. A subnet is public when it is associated with a route table that has a route to an internet gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id associated with the subnet. Ignored unless the subnet is managed by the provider, in which case this is set on the public subnet where the NAT gateway resides. It is then used to determine routes for private subnets in the same AZ as the public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id associated with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - required: - - id - type: object - type: array - x-kubernetes-list-map-keys: - - id - x-kubernetes-list-type: map - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies how AZs should be selected if there are more AZs in a region than specified by AvailabilityZoneUsageLimit. There are 2 selection schemes: Ordered - selects based on alphabetical order Random - selects AZs randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies the maximum number of availability zones (AZ) that should be used in a region when automatically creating subnets. If a region has more than this number of AZs then this number of AZs will be picked randomly when creating default subnets. Defaults to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. Defaults to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider should use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet gateway associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings for the network. Supported only in managed clusters. This field cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided by Amazon when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the id of the egress only internet gateway associated with an IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must be defined in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: object - region: - description: The AWS Region the cluster lives in. - type: string - s3Bucket: - description: S3Bucket contains options to configure a supporting S3 bucket for this cluster - currently used for nodes requiring Ignition (https://coreos.github.io/ignition/) for bootstrapping (requires BootstrapFormatIgnition feature flag to be enabled). - properties: - controlPlaneIAMInstanceProfile: - description: ControlPlaneIAMInstanceProfile is a name of the IAMInstanceProfile, which will be allowed to read control-plane node bootstrap data from S3 Bucket. - type: string - name: - description: Name defines name of S3 Bucket to be created. - maxLength: 63 - minLength: 3 - pattern: ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ - type: string - nodesIAMInstanceProfiles: - description: NodesIAMInstanceProfiles is a list of IAM instance profiles, which will be allowed to read worker nodes bootstrap data from S3 Bucket. - items: - type: string - type: array - required: - - controlPlaneIAMInstanceProfile - - name - - nodesIAMInstanceProfiles - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the bastion host. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - type: object - status: - description: AWSClusterStatus defines the observed state of AWSCluster. - properties: - bastion: - description: Instance describes an AWS instance. - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - availabilityZone: - description: Availability zone of instance - type: string - ebsOptimized: - description: Indicates whether the instance is optimized for Amazon EBS I/O. - type: boolean - enaSupport: - description: Specifies whether enhanced networking with ENA is enabled. - type: boolean - iamProfile: - description: The name of the IAM instance profile associated with the instance, if applicable. - type: string - id: - type: string - imageId: - description: The ID of the AMI used to launch the instance. - type: string - instanceState: - description: The current state of the instance. - type: string - networkInterfaces: - description: Specifies ENIs attached to instance - items: - type: string - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - type: array - privateIp: - description: The private IPv4 address assigned to the instance. - type: string - publicIp: - description: The public IPv4 address assigned to the instance, if applicable. - type: string - rootVolume: - description: Configuration options for the root storage volume. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - securityGroupIds: - description: SecurityGroupIDs are one or more security group IDs this instance belongs to. - items: - type: string - type: array - spotMarketOptions: - description: SpotMarketOptions option for configuring instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: The name of the SSH key pair. - type: string - subnetId: - description: The ID of the subnet of the instance. - type: string - tags: - additionalProperties: - type: string - description: The tags associated with the instance. - type: object - tenancy: - description: Tenancy indicates if instance should run on shared or single-tenant hardware. - type: string - type: - description: The instance type. - type: string - userData: - description: UserData is the raw data script passed to the instance which is run upon bootstrap. This field must not be base64 encoded and should only be used when running a new instance. - type: string - volumeIDs: - description: IDs of the instance's volumes - items: - type: string - type: array - required: - - id - type: object - conditions: - description: Conditions provide observations of the operational state of a Cluster API resource. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a slice of FailureDomains. - type: object - networkStatus: - description: NetworkStatus encapsulates AWS networking resources. - properties: - apiServerElb: - description: APIServerELB is the Kubernetes api server classic load balancer. - properties: - attributes: - description: Attributes defines extra attributes associated with the load balancer. - properties: - crossZoneLoadBalancing: - description: CrossZoneLoadBalancing enables the classic load balancer load balancing. - type: boolean - idleTimeout: - description: IdleTimeout is time that the connection is allowed to be idle (no data has been sent over the connection) before it is closed by the load balancer. - format: int64 - type: integer - type: object - availabilityZones: - description: AvailabilityZones is an array of availability zones in the VPC attached to the load balancer. - items: - type: string - type: array - dnsName: - description: DNSName is the dns name of the load balancer. - type: string - healthChecks: - description: HealthCheck is the classic elb health check associated with the load balancer. - properties: - healthyThreshold: - format: int64 - type: integer - interval: - description: A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. - format: int64 - type: integer - target: - type: string - timeout: - description: A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. - format: int64 - type: integer - unhealthyThreshold: - format: int64 - type: integer - required: - - healthyThreshold - - interval - - target - - timeout - - unhealthyThreshold - type: object - listeners: - description: Listeners is an array of classic elb listeners associated with the load balancer. There must be at least one. - items: - description: ClassicELBListener defines an AWS classic load balancer listener. - properties: - instancePort: - format: int64 - type: integer - instanceProtocol: - description: ClassicELBProtocol defines listener protocols for a classic load balancer. - type: string - port: - format: int64 - type: integer - protocol: - description: ClassicELBProtocol defines listener protocols for a classic load balancer. - type: string - required: - - instancePort - - instanceProtocol - - port - - protocol - type: object - type: array - name: - description: The name of the load balancer. It must be unique within the set of load balancers defined in the region. It also serves as identifier. - type: string - scheme: - description: Scheme is the load balancer scheme, either internet-facing or private. - type: string - securityGroupIds: - description: SecurityGroupIDs is an array of security groups assigned to the load balancer. - items: - type: string - type: array - subnetIds: - description: SubnetIDs is an array of subnets in the VPC attached to the load balancer. - items: - type: string - type: array - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the load balancer. - type: object - type: object - securityGroups: - additionalProperties: - description: SecurityGroup defines an AWS security group. - properties: - id: - description: ID is a unique identifier. - type: string - ingressRule: - description: IngressRules is the inbound rules associated with the security group. - items: - description: IngressRule defines an AWS ingress rule for security groups. - properties: - cidrBlocks: - description: List of CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - description: - type: string - fromPort: - format: int64 - type: integer - ipv6CidrBlocks: - description: List of IPv6 CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - protocol: - description: SecurityGroupProtocol defines the protocol type for a security group rule. - type: string - sourceSecurityGroupIds: - description: The security group id to allow access from. Cannot be specified with CidrBlocks. - items: - type: string - type: array - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - name: - description: Name is the security group name. - type: string - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the security group. - type: object - required: - - id - - name - type: object - description: SecurityGroups is a map from the role/kind of the security group to its unique name, if any. - type: object - type: object - ready: - default: false - type: boolean - required: - - ready - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - clusterctl.cluster.x-k8s.io/move-hierarchy: "" - name: awsclusterstaticidentities.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSClusterStaticIdentity - listKind: AWSClusterStaticIdentityList - plural: awsclusterstaticidentities - shortNames: - - awssi - singular: awsclusterstaticidentity - scope: Cluster - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSClusterStaticIdentity is the Schema for the awsclusterstaticidentities API It represents a reference to an AWS access key ID and secret access key, stored in a secret. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterStaticIdentity - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces are allowed to use the identity from. Namespaces can be selected either using an array of namespaces or with label selector. An empty allowedNamespaces object indicates that AWSClusters can use this identity from any namespace. If this object is nil, no namespaces will be allowed (default behaviour, if this field is not provided) A namespace should be either in the NamespaceList or match with Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - secretRef: - description: 'Reference to a secret containing the credentials. The secret should contain the following data keys: AccessKeyID: AKIAIOSFODNN7EXAMPLE SecretAccessKey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY SessionToken: Optional' - type: string - required: - - secretRef - type: object - type: object - served: true - storage: false - - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSClusterStaticIdentity is the Schema for the awsclusterstaticidentities API It represents a reference to an AWS access key ID and secret access key, stored in a secret. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec for this AWSClusterStaticIdentity - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces are allowed to use the identity from. Namespaces can be selected either using an array of namespaces or with label selector. An empty allowedNamespaces object indicates that AWSClusters can use this identity from any namespace. If this object is nil, no namespaces will be allowed (default behaviour, if this field is not provided) A namespace should be either in the NamespaceList or match with Selector to use the identity. - nullable: true - properties: - list: - description: An nil or empty list indicates that AWSClusters cannot use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: An empty selector indicates that AWSClusters cannot use this AWSClusterIdentity from any namespace. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - secretRef: - description: 'Reference to a secret containing the credentials. The secret should contain the following data keys: AccessKeyID: AKIAIOSFODNN7EXAMPLE SecretAccessKey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY SessionToken: Optional' - type: string - required: - - secretRef - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsclustertemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSClusterTemplate - listKind: AWSClusterTemplateList - plural: awsclustertemplates - shortNames: - - awsct - singular: awsclustertemplate - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Time duration since creation of AWSClusterTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSClusterTemplate is the schema for Amazon EC2 based Kubernetes Cluster Templates. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSClusterTemplateSpec defines the desired state of AWSClusterTemplate. - properties: - template: - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: AWSClusterSpec defines the desired state of an EC2-based Kubernetes cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default. - type: object - bastion: - description: Bastion contains options to configure the bastion host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks allowed to access the bastion host. They are set as ingress rules for the Bastion host's Security Group (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the bastion. If not specified, the AMI will default to one picked out in public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are no Ingress rules in the bastion host's security group. Requires AllowedCIDRBlocks to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a bastion host instance with a public ip to access the VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance type for the bastion. If not specified, Cluster API Provider AWS will use t3.micro for all regions except us-east-1, where t2.micro will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneLoadBalancer: - description: ControlPlaneLoadBalancer is optional configuration for customizing control plane behavior. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups sets the security groups used by the load balancer. Expected to be security group IDs This is optional - if not provided new security groups will be created for the load balancer - items: - type: string - type: array - crossZoneLoadBalancing: - description: "CrossZoneLoadBalancing enables the classic ELB cross availability zone balancing. \n With cross-zone load balancing, each load balancer node for your Classic Load Balancer distributes requests evenly across the registered instances in all enabled Availability Zones. If cross-zone load balancing is disabled, each load balancer node distributes requests evenly across the registered instances in its Availability Zone only. \n Defaults to false." - type: boolean - healthCheckProtocol: - description: HealthCheckProtocol sets the protocol type for classic ELB health check target default value is ClassicELBProtocolSSL - type: string - name: - description: Name sets the name of the classic ELB load balancer. As per AWS, the name must be unique within your set of load balancers for the region, must have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and cannot begin or end with a hyphen. Once set, the value cannot be changed. - maxLength: 32 - pattern: ^[A-Za-z0-9]([A-Za-z0-9]{0,31}|[-A-Za-z0-9]{0,30}[A-Za-z0-9])$ - type: string - scheme: - default: internet-facing - description: Scheme sets the scheme of the load balancer (defaults to internet-facing) - enum: - - internet-facing - - internal - type: string - subnets: - description: Subnets sets the subnets that should be applied to the control plane load balancer (defaults to discovered subnets for managed VPCs or an empty set for unmanaged VPCs) - items: - type: string - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be used when reconciling this cluster - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system used to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. - type: string - network: - description: NetworkSpec encapsulates all things related to AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply to control plane and worker node security groups. The source for the rule will be set to control plane and worker security group IDs. - items: - description: CNIIngressRule defines an AWS ingress rule for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the protocol type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set of security groups to use for cluster instances This is optional - if not provided new security groups will be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability zone to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block to be used when the provider creates a managed VPC. A subnet can have an IPv4 and an IPv6 address. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 subnet. A subnet is IPv6 when it is associated with a VPC that has IPv6 enabled. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public subnet. A subnet is public when it is associated with a route table that has a route to an internet gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id associated with the subnet. Ignored unless the subnet is managed by the provider, in which case this is set on the public subnet where the NAT gateway resides. It is then used to determine routes for private subnets in the same AZ as the public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id associated with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: array - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies how AZs should be selected if there are more AZs in a region than specified by AvailabilityZoneUsageLimit. There are 2 selection schemes: Ordered - selects based on alphabetical order Random - selects AZs randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies the maximum number of availability zones (AZ) that should be used in a region when automatically creating subnets. If a region has more than this number of AZs then this number of AZs will be picked randomly when creating default subnets. Defaults to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. Defaults to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider should use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet gateway associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings for the network. Supported only in managed clusters. This field cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided by Amazon when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the id of the egress only internet gateway associated with an IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must be defined in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: object - region: - description: The AWS Region the cluster lives in. - type: string - s3Bucket: - description: S3Bucket contains options to configure a supporting S3 bucket for this cluster - currently used for nodes requiring Ignition (https://coreos.github.io/ignition/) for bootstrapping (requires BootstrapFormatIgnition feature flag to be enabled). - properties: - controlPlaneIAMInstanceProfile: - description: ControlPlaneIAMInstanceProfile is a name of the IAMInstanceProfile, which will be allowed to read control-plane node bootstrap data from S3 Bucket. - type: string - name: - description: Name defines name of S3 Bucket to be created. - maxLength: 63 - minLength: 3 - pattern: ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ - type: string - nodesIAMInstanceProfiles: - description: NodesIAMInstanceProfiles is a list of IAM instance profiles, which will be allowed to read worker nodes bootstrap data from S3 Bucket. - items: - type: string - type: array - required: - - controlPlaneIAMInstanceProfile - - name - - nodesIAMInstanceProfiles - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the bastion host. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of AWSClusterTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSClusterTemplate is the schema for Amazon EC2 based Kubernetes Cluster Templates. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSClusterTemplateSpec defines the desired state of AWSClusterTemplate. - properties: - template: - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: AWSClusterSpec defines the desired state of an EC2-based Kubernetes cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default. - type: object - bastion: - description: Bastion contains options to configure the bastion host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks allowed to access the bastion host. They are set as ingress rules for the Bastion host's Security Group (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the bastion. If not specified, the AMI will default to one picked out in public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are no Ingress rules in the bastion host's security group. Requires AllowedCIDRBlocks to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a bastion host instance with a public ip to access the VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance type for the bastion. If not specified, Cluster API Provider AWS will use t3.micro for all regions except us-east-1, where t2.micro will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - controlPlaneLoadBalancer: - description: ControlPlaneLoadBalancer is optional configuration for customizing control plane behavior. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups sets the security groups used by the load balancer. Expected to be security group IDs This is optional - if not provided new security groups will be created for the load balancer - items: - type: string - type: array - crossZoneLoadBalancing: - description: "CrossZoneLoadBalancing enables the classic ELB cross availability zone balancing. \n With cross-zone load balancing, each load balancer node for your Classic Load Balancer distributes requests evenly across the registered instances in all enabled Availability Zones. If cross-zone load balancing is disabled, each load balancer node distributes requests evenly across the registered instances in its Availability Zone only. \n Defaults to false." - type: boolean - healthCheckProtocol: - description: HealthCheckProtocol sets the protocol type for classic ELB health check target default value is ClassicELBProtocolSSL - type: string - name: - description: Name sets the name of the classic ELB load balancer. As per AWS, the name must be unique within your set of load balancers for the region, must have a maximum of 32 characters, must contain only alphanumeric characters or hyphens, and cannot begin or end with a hyphen. Once set, the value cannot be changed. - maxLength: 32 - pattern: ^[A-Za-z0-9]([A-Za-z0-9]{0,31}|[-A-Za-z0-9]{0,30}[A-Za-z0-9])$ - type: string - scheme: - default: internet-facing - description: Scheme sets the scheme of the load balancer (defaults to internet-facing) - enum: - - internet-facing - - internal - type: string - subnets: - description: Subnets sets the subnets that should be applied to the control plane load balancer (defaults to discovered subnets for managed VPCs or an empty set for unmanaged VPCs) - items: - type: string - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be used when reconciling this cluster - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system used to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. - type: string - network: - description: NetworkSpec encapsulates all things related to AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply to control plane and worker node security groups. The source for the rule will be set to control plane and worker security group IDs. - items: - description: CNIIngressRule defines an AWS ingress rule for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the protocol type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set of security groups to use for cluster instances This is optional - if not provided new security groups will be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability zone to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block to be used when the provider creates a managed VPC. A subnet can have an IPv4 and an IPv6 address. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 subnet. A subnet is IPv6 when it is associated with a VPC that has IPv6 enabled. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public subnet. A subnet is public when it is associated with a route table that has a route to an internet gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id associated with the subnet. Ignored unless the subnet is managed by the provider, in which case this is set on the public subnet where the NAT gateway resides. It is then used to determine routes for private subnets in the same AZ as the public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id associated with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - required: - - id - type: object - type: array - x-kubernetes-list-map-keys: - - id - x-kubernetes-list-type: map - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies how AZs should be selected if there are more AZs in a region than specified by AvailabilityZoneUsageLimit. There are 2 selection schemes: Ordered - selects based on alphabetical order Random - selects AZs randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies the maximum number of availability zones (AZ) that should be used in a region when automatically creating subnets. If a region has more than this number of AZs then this number of AZs will be picked randomly when creating default subnets. Defaults to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. Defaults to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider should use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet gateway associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings for the network. Supported only in managed clusters. This field cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided by Amazon when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the id of the egress only internet gateway associated with an IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must be defined in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: object - region: - description: The AWS Region the cluster lives in. - type: string - s3Bucket: - description: S3Bucket contains options to configure a supporting S3 bucket for this cluster - currently used for nodes requiring Ignition (https://coreos.github.io/ignition/) for bootstrapping (requires BootstrapFormatIgnition feature flag to be enabled). - properties: - controlPlaneIAMInstanceProfile: - description: ControlPlaneIAMInstanceProfile is a name of the IAMInstanceProfile, which will be allowed to read control-plane node bootstrap data from S3 Bucket. - type: string - name: - description: Name defines name of S3 Bucket to be created. - maxLength: 63 - minLength: 3 - pattern: ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ - type: string - nodesIAMInstanceProfiles: - description: NodesIAMInstanceProfiles is a list of IAM instance profiles, which will be allowed to read worker nodes bootstrap data from S3 Bucket. - items: - type: string - type: array - required: - - controlPlaneIAMInstanceProfile - - name - - nodesIAMInstanceProfiles - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the bastion host. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.10.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsfargateprofiles.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSFargateProfile - listKind: AWSFargateProfileList - plural: awsfargateprofiles - shortNames: - - awsfp - singular: awsfargateprofile - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: AWSFargateProfile ready status - jsonPath: .status.ready - name: Ready - type: string - - description: EKS Fargate profile name - jsonPath: .spec.profileName - name: ProfileName - type: string - - description: Failure reason - jsonPath: .status.failureReason - name: FailureReason - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSFargateProfile is the Schema for the awsfargateprofiles API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: FargateProfileSpec defines the desired state of FargateProfile. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default. - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - profileName: - description: ProfileName specifies the profile name. - type: string - roleName: - description: RoleName specifies the name of IAM role for this fargate pool If the role is pre-existing we will treat it as unmanaged and not delete it on deletion. If the EKSEnableIAM feature flag is true and no name is supplied then a role is created. - type: string - selectors: - description: Selectors specify fargate pod selectors. - items: - description: FargateSelector specifies a selector for pods that should run on this fargate pool. - properties: - labels: - additionalProperties: - type: string - description: Labels specifies which pod labels this selector should match. - type: object - namespace: - description: Namespace specifies which namespace this selector should match. - type: string - type: object - type: array - subnetIDs: - description: SubnetIDs specifies which subnets are used for the auto scaling group of this nodegroup. - items: - type: string - type: array - required: - - clusterName - type: object - status: - description: FargateProfileStatus defines the observed state of FargateProfile. - properties: - conditions: - description: Conditions defines current state of the Fargate profile. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the FargateProfile and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the FargateProfile's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of FargateProfiles can be added as events to the FargateProfile object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the FargateProfile and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the FargateProfile's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of FargateProfiles can be added as events to the FargateProfile object and/or logged in the controller's output." - type: string - ready: - default: false - description: Ready denotes that the FargateProfile is available. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: AWSFargateProfile ready status - jsonPath: .status.ready - name: Ready - type: string - - description: EKS Fargate profile name - jsonPath: .spec.profileName - name: ProfileName - type: string - - description: Failure reason - jsonPath: .status.failureReason - name: FailureReason - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSFargateProfile is the Schema for the awsfargateprofiles API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: FargateProfileSpec defines the desired state of FargateProfile. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default. - type: object - clusterName: - description: ClusterName is the name of the Cluster this object belongs to. - minLength: 1 - type: string - profileName: - description: ProfileName specifies the profile name. - type: string - roleName: - description: RoleName specifies the name of IAM role for this fargate pool If the role is pre-existing we will treat it as unmanaged and not delete it on deletion. If the EKSEnableIAM feature flag is true and no name is supplied then a role is created. - type: string - selectors: - description: Selectors specify fargate pod selectors. - items: - description: FargateSelector specifies a selector for pods that should run on this fargate pool. - properties: - labels: - additionalProperties: - type: string - description: Labels specifies which pod labels this selector should match. - type: object - namespace: - description: Namespace specifies which namespace this selector should match. - type: string - type: object - type: array - subnetIDs: - description: SubnetIDs specifies which subnets are used for the auto scaling group of this nodegroup. - items: - type: string - type: array - required: - - clusterName - type: object - status: - description: FargateProfileStatus defines the observed state of FargateProfile. - properties: - conditions: - description: Conditions defines current state of the Fargate profile. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the FargateProfile and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the FargateProfile's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of FargateProfiles can be added as events to the FargateProfile object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the FargateProfile and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the FargateProfile's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of FargateProfiles can be added as events to the FargateProfile object and/or logged in the controller's output." - type: string - ready: - default: false - description: Ready denotes that the FargateProfile is available. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.10.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmachinepools.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSMachinePool - listKind: AWSMachinePoolList - plural: awsmachinepools - shortNames: - - awsmp - singular: awsmachinepool - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Machine ready status - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Minimum instanes in ASG - jsonPath: .spec.minSize - name: MinSize - type: integer - - description: Maximum instanes in ASG - jsonPath: .spec.maxSize - name: MaxSize - type: integer - - description: Launch Template ID - jsonPath: .status.launchTemplateID - name: LaunchTemplate ID - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSMachinePool is the Schema for the awsmachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachinePoolSpec defines the desired state of AWSMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the AWS provider. - type: object - availabilityZones: - description: AvailabilityZones is an array of availability zones instances can run in - items: - type: string - type: array - awsLaunchTemplate: - description: AWSLaunchTemplate specifies the launch template and version to use when an instance is launched. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references to security groups that should be applied to the instances. These security groups would be set in addition to any security groups defined at the cluster level or in the actuator. - items: - description: AWSResourceReference is a reference to a specific AWS resource by ID or filters. Only one of ID or Filters may be specified. Specifying more than one will result in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - ami: - description: AMI is the reference to the AMI from which to create the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - iamInstanceProfile: - description: The name or the Amazon Resource Name (ARN) of the instance profile associated with the IAM role for the instance. The instance profile contains the IAM role. - type: string - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up the image for this machine It will be ignored if an explicit AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use for image lookup if AMI is not set. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. Example: m4.xlarge' - type: string - name: - description: The name of the launch template. - type: string - rootVolume: - description: RootVolume encapsulates the configuration options for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions are options for configuring AWSMachinePool instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the instance. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - versionNumber: - description: 'VersionNumber is the version of the launch template that is applied. Typically a new version is created when at least one of the following happens: 1) A new launch template spec is applied. 2) One or more parameters in an existing template is changed. 3) A new AMI is discovered.' - format: int64 - type: integer - type: object - capacityRebalance: - description: Enable or disable the capacity rebalance autoscaling group feature - type: boolean - defaultCoolDown: - description: The amount of time, in seconds, after a scaling activity completes before another scaling activity can start. If no value is supplied by user a default value of 300 seconds is set - type: string - maxSize: - default: 1 - description: MaxSize defines the maximum size of the group. - format: int32 - minimum: 1 - type: integer - minSize: - default: 1 - description: MinSize defines the minimum size of the group. - format: int32 - minimum: 0 - type: integer - mixedInstancesPolicy: - description: MixedInstancesPolicy describes how multiple instance types will be used by the ASG. - properties: - instancesDistribution: - description: InstancesDistribution to configure distribution of On-Demand Instances and Spot Instances. - properties: - onDemandAllocationStrategy: - default: prioritized - description: OnDemandAllocationStrategy indicates how to allocate instance types to fulfill On-Demand capacity. - enum: - - prioritized - type: string - onDemandBaseCapacity: - default: 0 - format: int64 - type: integer - onDemandPercentageAboveBaseCapacity: - default: 100 - format: int64 - type: integer - spotAllocationStrategy: - default: lowest-price - description: SpotAllocationStrategy indicates how to allocate instances across Spot Instance pools. - enum: - - lowest-price - - capacity-optimized - type: string - type: object - overrides: - items: - description: Overrides are used to override the instance type specified by the launch template with multiple instance types that can be used to launch On-Demand Instances and Spot Instances. - properties: - instanceType: - type: string - required: - - instanceType - type: object - type: array - type: object - providerID: - description: ProviderID is the ARN of the associated ASG - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine instances provided by the provider. This field must match the provider IDs as seen on the node objects corresponding to a machine pool's machine instances. - items: - type: string - type: array - refreshPreferences: - description: RefreshPreferences describes set of preferences associated with the instance refresh request. - properties: - instanceWarmup: - description: The number of seconds until a newly launched instance is configured and ready to use. During this time, the next replacement will not be initiated. The default is to use the value for the health check grace period defined for the group. - format: int64 - type: integer - minHealthyPercentage: - description: The amount of capacity as a percentage in ASG that must remain healthy during an instance refresh. The default is 90. - format: int64 - type: integer - strategy: - description: The strategy to use for the instance refresh. The only valid value is Rolling. A rolling update is an update that is applied to all instances in an Auto Scaling group until all instances have been updated. - type: string - type: object - subnets: - description: Subnets is an array of subnet configurations - items: - description: AWSResourceReference is a reference to a specific AWS resource by ID or filters. Only one of ID or Filters may be specified. Specifying more than one will result in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - required: - - awsLaunchTemplate - - maxSize - - minSize - type: object - status: - description: AWSMachinePoolStatus defines the observed state of AWSMachinePool. - properties: - asgStatus: - description: ASGStatus is a status string returned by the autoscaling API. - type: string - conditions: - description: Conditions defines current service state of the AWSMachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - instances: - description: Instances contains the status for each instance in the pool - items: - description: AWSMachinePoolInstanceStatus defines the status of the AWSMachinePoolInstance. - properties: - instanceID: - description: InstanceID is the identification of the Machine Instance within ASG - type: string - version: - description: Version defines the Kubernetes version for the Machine Instance - type: string - type: object - type: array - launchTemplateID: - description: The ID of the launch template - type: string - launchTemplateVersion: - description: The version of the launch template - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Machine ready status - jsonPath: .status.replicas - name: Replicas - type: integer - - description: Minimum instanes in ASG - jsonPath: .spec.minSize - name: MinSize - type: integer - - description: Maximum instanes in ASG - jsonPath: .spec.maxSize - name: MaxSize - type: integer - - description: Launch Template ID - jsonPath: .status.launchTemplateID - name: LaunchTemplate ID - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSMachinePool is the Schema for the awsmachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachinePoolSpec defines the desired state of AWSMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the AWS provider. - type: object - availabilityZones: - description: AvailabilityZones is an array of availability zones instances can run in - items: - type: string - type: array - awsLaunchTemplate: - description: AWSLaunchTemplate specifies the launch template and version to use when an instance is launched. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references to security groups that should be applied to the instances. These security groups would be set in addition to any security groups defined at the cluster level or in the actuator. - items: - description: AWSResourceReference is a reference to a specific AWS resource by ID or filters. Only one of ID or Filters may be specified. Specifying more than one will result in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - ami: - description: AMI is the reference to the AMI from which to create the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - iamInstanceProfile: - description: The name or the Amazon Resource Name (ARN) of the instance profile associated with the IAM role for the instance. The instance profile contains the IAM role. - type: string - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up the image for this machine It will be ignored if an explicit AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use for image lookup if AMI is not set. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. Example: m4.xlarge' - type: string - name: - description: The name of the launch template. - type: string - rootVolume: - description: RootVolume encapsulates the configuration options for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions are options for configuring AWSMachinePool instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the instance. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - versionNumber: - description: 'VersionNumber is the version of the launch template that is applied. Typically a new version is created when at least one of the following happens: 1) A new launch template spec is applied. 2) One or more parameters in an existing template is changed. 3) A new AMI is discovered.' - format: int64 - type: integer - type: object - capacityRebalance: - description: Enable or disable the capacity rebalance autoscaling group feature - type: boolean - defaultCoolDown: - description: The amount of time, in seconds, after a scaling activity completes before another scaling activity can start. If no value is supplied by user a default value of 300 seconds is set - type: string - maxSize: - default: 1 - description: MaxSize defines the maximum size of the group. - format: int32 - minimum: 1 - type: integer - minSize: - default: 1 - description: MinSize defines the minimum size of the group. - format: int32 - minimum: 0 - type: integer - mixedInstancesPolicy: - description: MixedInstancesPolicy describes how multiple instance types will be used by the ASG. - properties: - instancesDistribution: - description: InstancesDistribution to configure distribution of On-Demand Instances and Spot Instances. - properties: - onDemandAllocationStrategy: - default: prioritized - description: OnDemandAllocationStrategy indicates how to allocate instance types to fulfill On-Demand capacity. - enum: - - prioritized - type: string - onDemandBaseCapacity: - default: 0 - format: int64 - type: integer - onDemandPercentageAboveBaseCapacity: - default: 100 - format: int64 - type: integer - spotAllocationStrategy: - default: lowest-price - description: SpotAllocationStrategy indicates how to allocate instances across Spot Instance pools. - enum: - - lowest-price - - capacity-optimized - type: string - type: object - overrides: - items: - description: Overrides are used to override the instance type specified by the launch template with multiple instance types that can be used to launch On-Demand Instances and Spot Instances. - properties: - instanceType: - type: string - required: - - instanceType - type: object - type: array - type: object - providerID: - description: ProviderID is the ARN of the associated ASG - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine instances provided by the provider. This field must match the provider IDs as seen on the node objects corresponding to a machine pool's machine instances. - items: - type: string - type: array - refreshPreferences: - description: RefreshPreferences describes set of preferences associated with the instance refresh request. - properties: - disable: - description: Disable, if true, disables instance refresh from triggering when new launch templates are detected. This is useful in scenarios where ASG nodes are externally managed. - type: boolean - instanceWarmup: - description: The number of seconds until a newly launched instance is configured and ready to use. During this time, the next replacement will not be initiated. The default is to use the value for the health check grace period defined for the group. - format: int64 - type: integer - minHealthyPercentage: - description: The amount of capacity as a percentage in ASG that must remain healthy during an instance refresh. The default is 90. - format: int64 - type: integer - strategy: - description: The strategy to use for the instance refresh. The only valid value is Rolling. A rolling update is an update that is applied to all instances in an Auto Scaling group until all instances have been updated. - type: string - type: object - subnets: - description: Subnets is an array of subnet configurations - items: - description: AWSResourceReference is a reference to a specific AWS resource by ID or filters. Only one of ID or Filters may be specified. Specifying more than one will result in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - suspendProcesses: - description: SuspendProcesses defines a list of processes to suspend for the given ASG. This is constantly reconciled. If a process is removed from this list it will automatically be resumed. - properties: - all: - type: boolean - processes: - description: Processes defines the processes which can be enabled or disabled individually. - properties: - addToLoadBalancer: - type: boolean - alarmNotification: - type: boolean - azRebalance: - type: boolean - healthCheck: - type: boolean - instanceRefresh: - type: boolean - launch: - type: boolean - replaceUnhealthy: - type: boolean - scheduledActions: - type: boolean - terminate: - type: boolean - type: object - type: object - required: - - awsLaunchTemplate - - maxSize - - minSize - type: object - status: - description: AWSMachinePoolStatus defines the observed state of AWSMachinePool. - properties: - asgStatus: - description: ASGStatus is a status string returned by the autoscaling API. - type: string - conditions: - description: Conditions defines current service state of the AWSMachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - instances: - description: Instances contains the status for each instance in the pool - items: - description: AWSMachinePoolInstanceStatus defines the status of the AWSMachinePoolInstance. - properties: - instanceID: - description: InstanceID is the identification of the Machine Instance within ASG - type: string - version: - description: Version defines the Kubernetes version for the Machine Instance - type: string - type: object - type: array - launchTemplateID: - description: The ID of the launch template - type: string - launchTemplateVersion: - description: The version of the launch template - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSMachine - listKind: AWSMachineList - plural: awsmachines - shortNames: - - awsm - singular: awsmachine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this AWSMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: EC2 instance state - jsonPath: .status.instanceState - name: State - type: string - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: EC2 instance ID - jsonPath: .spec.providerID - name: InstanceID - type: string - - description: Machine object which owns with this AWSMachine - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSMachine is the schema for Amazon EC2 machines. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachineSpec defines the desired state of an Amazon EC2 instance. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references to security groups that should be applied to the instance. These security groups would be set in addition to any security groups defined at the cluster level or in the actuator. It is possible to specify either IDs of Filters. Using Filters will cause additional requests to AWS API and if tags change the attached security groups might change too. - items: - description: AWSResourceReference is a reference to a specific AWS resource by ID or filters. Only one of ID or Filters may be specified. Specifying more than one will result in a validation error. - properties: - arn: - description: 'ARN of resource. Deprecated: This field has no function and is going to be removed in the next release.' - type: string - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the AWS provider. If both the AWSCluster and the AWSMachine specify the same tag name with different values, the AWSMachine's value takes precedence. - type: object - ami: - description: AMI is the reference to the AMI from which to create the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - cloudInit: - description: CloudInit defines options related to the bootstrapping systems where CloudInit is used. - properties: - insecureSkipSecretsManager: - description: InsecureSkipSecretsManager, when set to true will not use AWS Secrets Manager or AWS Systems Manager Parameter Store to ensure privacy of userdata. By default, a cloud-init boothook shell script is prepended to download the userdata from Secrets Manager and additionally delete the secret. - type: boolean - secretCount: - description: SecretCount is the number of secrets used to form the complete secret - format: int32 - type: integer - secretPrefix: - description: SecretPrefix is the prefix for the secret name. This is stored temporarily, and deleted when the machine registers as a node against the workload cluster. - type: string - secureSecretsBackend: - description: SecureSecretsBackend, when set to parameter-store will utilize the AWS Systems Manager Parameter Storage to distribute secrets. By default or with the value of secrets-manager, will use AWS Secrets Manager instead. - enum: - - secrets-manager - - ssm-parameter-store - type: string - type: object - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. For this infrastructure provider, the ID is equivalent to an AWS Availability Zone. If multiple subnets are matched for the availability zone, the first one returned is picked. - type: string - iamInstanceProfile: - description: IAMInstanceProfile is a name of an IAM instance profile to assign to the instance - type: string - ignition: - description: Ignition defined options related to the bootstrapping systems where Ignition is used. - properties: - version: - default: "2.3" - description: Version defines which version of Ignition will be used to generate bootstrap data. - enum: - - "2.3" - type: string - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up the image for this machine It will be ignored if an explicit AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use for image lookup if AMI is not set. - type: string - instanceID: - description: InstanceID is the EC2 instance ID for this machine. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. Example: m4.xlarge' - minLength: 2 - type: string - networkInterfaces: - description: NetworkInterfaces is a list of ENIs to associate with the instance. A maximum of 2 may be specified. - items: - type: string - maxItems: 2 - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - type: array - providerID: - description: ProviderID is the unique identifier as specified by the cloud provider. - type: string - publicIP: - description: 'PublicIP specifies whether the instance should get a public IP. Precedence for this setting is as follows: 1. This field if set 2. Cluster/flavor setting 3. Subnet default' - type: boolean - rootVolume: - description: RootVolume encapsulates the configuration options for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions allows users to configure instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the instance. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - subnet: - description: Subnet is a reference to the subnet to use for this instance. If not specified, the cluster subnet will be used. - properties: - arn: - description: 'ARN of resource. Deprecated: This field has no function and is going to be removed in the next release.' - type: string - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - tenancy: - description: Tenancy indicates if instance should run on shared or single-tenant hardware. - enum: - - default - - dedicated - - host - type: string - uncompressedUserData: - description: UncompressedUserData specify whether the user data is gzip-compressed before it is sent to ec2 instance. cloud-init has built-in support for gzip-compressed user data user data stored in aws secret manager is always gzip-compressed. - type: boolean - required: - - instanceType - type: object - status: - description: AWSMachineStatus defines the observed state of AWSMachine. - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the AWSMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - instanceState: - description: InstanceState is the state of the AWS instance for this machine. - type: string - interruptible: - description: Interruptible reports that this machine is using spot instances and can therefore be interrupted by CAPI when it receives a notice that the spot instance is to be terminated by AWS. This will be set to true when SpotMarketOptions is not nil (i.e. this machine is using a spot instance). - type: boolean - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this AWSMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: EC2 instance state - jsonPath: .status.instanceState - name: State - type: string - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: EC2 instance ID - jsonPath: .spec.providerID - name: InstanceID - type: string - - description: Machine object which owns with this AWSMachine - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSMachine is the schema for Amazon EC2 machines. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachineSpec defines the desired state of an Amazon EC2 instance. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references to security groups that should be applied to the instance. These security groups would be set in addition to any security groups defined at the cluster level or in the actuator. It is possible to specify either IDs of Filters. Using Filters will cause additional requests to AWS API and if tags change the attached security groups might change too. - items: - description: AWSResourceReference is a reference to a specific AWS resource by ID or filters. Only one of ID or Filters may be specified. Specifying more than one will result in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the AWS provider. If both the AWSCluster and the AWSMachine specify the same tag name with different values, the AWSMachine's value takes precedence. - type: object - ami: - description: AMI is the reference to the AMI from which to create the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - cloudInit: - description: CloudInit defines options related to the bootstrapping systems where CloudInit is used. - properties: - insecureSkipSecretsManager: - description: InsecureSkipSecretsManager, when set to true will not use AWS Secrets Manager or AWS Systems Manager Parameter Store to ensure privacy of userdata. By default, a cloud-init boothook shell script is prepended to download the userdata from Secrets Manager and additionally delete the secret. - type: boolean - secretCount: - description: SecretCount is the number of secrets used to form the complete secret - format: int32 - type: integer - secretPrefix: - description: SecretPrefix is the prefix for the secret name. This is stored temporarily, and deleted when the machine registers as a node against the workload cluster. - type: string - secureSecretsBackend: - description: SecureSecretsBackend, when set to parameter-store will utilize the AWS Systems Manager Parameter Storage to distribute secrets. By default or with the value of secrets-manager, will use AWS Secrets Manager instead. - enum: - - secrets-manager - - ssm-parameter-store - type: string - type: object - iamInstanceProfile: - description: IAMInstanceProfile is a name of an IAM instance profile to assign to the instance - type: string - ignition: - description: Ignition defined options related to the bootstrapping systems where Ignition is used. - properties: - version: - default: "2.3" - description: Version defines which version of Ignition will be used to generate bootstrap data. - enum: - - "2.3" - type: string - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up the image for this machine It will be ignored if an explicit AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use for image lookup if AMI is not set. - type: string - instanceID: - description: InstanceID is the EC2 instance ID for this machine. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. Example: m4.xlarge' - minLength: 2 - type: string - networkInterfaces: - description: NetworkInterfaces is a list of ENIs to associate with the instance. A maximum of 2 may be specified. - items: - type: string - maxItems: 2 - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - type: array - providerID: - description: ProviderID is the unique identifier as specified by the cloud provider. - type: string - publicIP: - description: 'PublicIP specifies whether the instance should get a public IP. Precedence for this setting is as follows: 1. This field if set 2. Cluster/flavor setting 3. Subnet default' - type: boolean - rootVolume: - description: RootVolume encapsulates the configuration options for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions allows users to configure instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the instance. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - subnet: - description: Subnet is a reference to the subnet to use for this instance. If not specified, the cluster subnet will be used. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - tenancy: - description: Tenancy indicates if instance should run on shared or single-tenant hardware. - enum: - - default - - dedicated - - host - type: string - uncompressedUserData: - description: UncompressedUserData specify whether the user data is gzip-compressed before it is sent to ec2 instance. cloud-init has built-in support for gzip-compressed user data user data stored in aws secret manager is always gzip-compressed. - type: boolean - required: - - instanceType - type: object - status: - description: AWSMachineStatus defines the observed state of AWSMachine. - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the AWSMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - instanceState: - description: InstanceState is the state of the AWS instance for this machine. - type: string - interruptible: - description: Interruptible reports that this machine is using spot instances and can therefore be interrupted by CAPI when it receives a notice that the spot instance is to be terminated by AWS. This will be set to true when SpotMarketOptions is not nil (i.e. this machine is using a spot instance). - type: boolean - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmachinetemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSMachineTemplate - listKind: AWSMachineTemplateList - plural: awsmachinetemplates - shortNames: - - awsmt - singular: awsmachinetemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSMachineTemplate is the schema for the Amazon EC2 Machine Templates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachineTemplateSpec defines the desired state of AWSMachineTemplate. - properties: - template: - description: AWSMachineTemplateResource describes the data needed to create am AWSMachine from a template. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references to security groups that should be applied to the instance. These security groups would be set in addition to any security groups defined at the cluster level or in the actuator. It is possible to specify either IDs of Filters. Using Filters will cause additional requests to AWS API and if tags change the attached security groups might change too. - items: - description: AWSResourceReference is a reference to a specific AWS resource by ID or filters. Only one of ID or Filters may be specified. Specifying more than one will result in a validation error. - properties: - arn: - description: 'ARN of resource. Deprecated: This field has no function and is going to be removed in the next release.' - type: string - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the AWS provider. If both the AWSCluster and the AWSMachine specify the same tag name with different values, the AWSMachine's value takes precedence. - type: object - ami: - description: AMI is the reference to the AMI from which to create the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - cloudInit: - description: CloudInit defines options related to the bootstrapping systems where CloudInit is used. - properties: - insecureSkipSecretsManager: - description: InsecureSkipSecretsManager, when set to true will not use AWS Secrets Manager or AWS Systems Manager Parameter Store to ensure privacy of userdata. By default, a cloud-init boothook shell script is prepended to download the userdata from Secrets Manager and additionally delete the secret. - type: boolean - secretCount: - description: SecretCount is the number of secrets used to form the complete secret - format: int32 - type: integer - secretPrefix: - description: SecretPrefix is the prefix for the secret name. This is stored temporarily, and deleted when the machine registers as a node against the workload cluster. - type: string - secureSecretsBackend: - description: SecureSecretsBackend, when set to parameter-store will utilize the AWS Systems Manager Parameter Storage to distribute secrets. By default or with the value of secrets-manager, will use AWS Secrets Manager instead. - enum: - - secrets-manager - - ssm-parameter-store - type: string - type: object - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. For this infrastructure provider, the ID is equivalent to an AWS Availability Zone. If multiple subnets are matched for the availability zone, the first one returned is picked. - type: string - iamInstanceProfile: - description: IAMInstanceProfile is a name of an IAM instance profile to assign to the instance - type: string - ignition: - description: Ignition defined options related to the bootstrapping systems where Ignition is used. - properties: - version: - default: "2.3" - description: Version defines which version of Ignition will be used to generate bootstrap data. - enum: - - "2.3" - type: string - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up the image for this machine It will be ignored if an explicit AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use for image lookup if AMI is not set. - type: string - instanceID: - description: InstanceID is the EC2 instance ID for this machine. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. Example: m4.xlarge' - minLength: 2 - type: string - networkInterfaces: - description: NetworkInterfaces is a list of ENIs to associate with the instance. A maximum of 2 may be specified. - items: - type: string - maxItems: 2 - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - type: array - providerID: - description: ProviderID is the unique identifier as specified by the cloud provider. - type: string - publicIP: - description: 'PublicIP specifies whether the instance should get a public IP. Precedence for this setting is as follows: 1. This field if set 2. Cluster/flavor setting 3. Subnet default' - type: boolean - rootVolume: - description: RootVolume encapsulates the configuration options for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions allows users to configure instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the instance. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - subnet: - description: Subnet is a reference to the subnet to use for this instance. If not specified, the cluster subnet will be used. - properties: - arn: - description: 'ARN of resource. Deprecated: This field has no function and is going to be removed in the next release.' - type: string - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - tenancy: - description: Tenancy indicates if instance should run on shared or single-tenant hardware. - enum: - - default - - dedicated - - host - type: string - uncompressedUserData: - description: UncompressedUserData specify whether the user data is gzip-compressed before it is sent to ec2 instance. cloud-init has built-in support for gzip-compressed user data user data stored in aws secret manager is always gzip-compressed. - type: boolean - required: - - instanceType - type: object - required: - - spec - type: object - required: - - template - type: object - status: - description: AWSMachineTemplateStatus defines a status for an AWSMachineTemplate. - properties: - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Capacity defines the resource capacity for this machine. This value is used for autoscaling from zero operations as defined in: https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20210310-opt-in-autoscaling-from-zero.md' - type: object - type: object - type: object - served: true - storage: false - - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSMachineTemplate is the schema for the Amazon EC2 Machine Templates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSMachineTemplateSpec defines the desired state of AWSMachineTemplate. - properties: - template: - description: AWSMachineTemplateResource describes the data needed to create am AWSMachine from a template. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references to security groups that should be applied to the instance. These security groups would be set in addition to any security groups defined at the cluster level or in the actuator. It is possible to specify either IDs of Filters. Using Filters will cause additional requests to AWS API and if tags change the attached security groups might change too. - items: - description: AWSResourceReference is a reference to a specific AWS resource by ID or filters. Only one of ID or Filters may be specified. Specifying more than one will result in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the AWS provider. If both the AWSCluster and the AWSMachine specify the same tag name with different values, the AWSMachine's value takes precedence. - type: object - ami: - description: AMI is the reference to the AMI from which to create the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - cloudInit: - description: CloudInit defines options related to the bootstrapping systems where CloudInit is used. - properties: - insecureSkipSecretsManager: - description: InsecureSkipSecretsManager, when set to true will not use AWS Secrets Manager or AWS Systems Manager Parameter Store to ensure privacy of userdata. By default, a cloud-init boothook shell script is prepended to download the userdata from Secrets Manager and additionally delete the secret. - type: boolean - secretCount: - description: SecretCount is the number of secrets used to form the complete secret - format: int32 - type: integer - secretPrefix: - description: SecretPrefix is the prefix for the secret name. This is stored temporarily, and deleted when the machine registers as a node against the workload cluster. - type: string - secureSecretsBackend: - description: SecureSecretsBackend, when set to parameter-store will utilize the AWS Systems Manager Parameter Storage to distribute secrets. By default or with the value of secrets-manager, will use AWS Secrets Manager instead. - enum: - - secrets-manager - - ssm-parameter-store - type: string - type: object - iamInstanceProfile: - description: IAMInstanceProfile is a name of an IAM instance profile to assign to the instance - type: string - ignition: - description: Ignition defined options related to the bootstrapping systems where Ignition is used. - properties: - version: - default: "2.3" - description: Version defines which version of Ignition will be used to generate bootstrap data. - enum: - - "2.3" - type: string - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up the image for this machine It will be ignored if an explicit AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use for image lookup if AMI is not set. - type: string - instanceID: - description: InstanceID is the EC2 instance ID for this machine. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. Example: m4.xlarge' - minLength: 2 - type: string - networkInterfaces: - description: NetworkInterfaces is a list of ENIs to associate with the instance. A maximum of 2 may be specified. - items: - type: string - maxItems: 2 - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - type: array - providerID: - description: ProviderID is the unique identifier as specified by the cloud provider. - type: string - publicIP: - description: 'PublicIP specifies whether the instance should get a public IP. Precedence for this setting is as follows: 1. This field if set 2. Cluster/flavor setting 3. Subnet default' - type: boolean - rootVolume: - description: RootVolume encapsulates the configuration options for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions allows users to configure instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the instance. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - subnet: - description: Subnet is a reference to the subnet to use for this instance. If not specified, the cluster subnet will be used. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - tenancy: - description: Tenancy indicates if instance should run on shared or single-tenant hardware. - enum: - - default - - dedicated - - host - type: string - uncompressedUserData: - description: UncompressedUserData specify whether the user data is gzip-compressed before it is sent to ec2 instance. cloud-init has built-in support for gzip-compressed user data user data stored in aws secret manager is always gzip-compressed. - type: boolean - required: - - instanceType - type: object - required: - - spec - type: object - required: - - template - type: object - status: - description: AWSMachineTemplateStatus defines a status for an AWSMachineTemplate. - properties: - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: 'Capacity defines the resource capacity for this machine. This value is used for autoscaling from zero operations as defined in: https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20210310-opt-in-autoscaling-from-zero.md' - type: object - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmanagedclusters.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSManagedCluster - listKind: AWSManagedClusterList - plural: awsmanagedclusters - shortNames: - - awsmc - singular: awsmanagedcluster - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this AWSManagedControl belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Control plane infrastructure is ready for worker nodes - jsonPath: .status.ready - name: Ready - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSManagedCluster is the Schema for the awsmanagedclusters API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSManagedClusterSpec defines the desired state of AWSManagedCluster - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - type: object - status: - description: AWSManagedClusterStatus defines the observed state of AWSManagedCluster - properties: - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains specifies a list fo available availability zones that can be used - type: object - ready: - description: Ready is when the AWSManagedControlPlane has a API server URL. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmanagedcontrolplanes.controlplane.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: controlplane.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSManagedControlPlane - listKind: AWSManagedControlPlaneList - plural: awsmanagedcontrolplanes - shortNames: - - awsmcp - singular: awsmanagedcontrolplane - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this AWSManagedControl belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Control plane infrastructure is ready for worker nodes - jsonPath: .status.ready - name: Ready - type: string - - description: AWS VPC the control plane is using - jsonPath: .spec.network.vpc.id - name: VPC - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - - description: Bastion IP address for breakglass access - jsonPath: .status.bastion.publicIp - name: Bastion IP - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSManagedControlPlane is the schema for the Amazon EKS Managed Control Plane API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSManagedControlPlaneSpec defines the desired state of an Amazon EKS Cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default. - type: object - addons: - description: Addons defines the EKS addons to enable with the EKS cluster. - items: - description: Addon represents a EKS addon. - properties: - conflictResolution: - default: none - description: ConflictResolution is used to declare what should happen if there are parameter conflicts. Defaults to none - enum: - - overwrite - - none - type: string - name: - description: Name is the name of the addon - minLength: 2 - type: string - serviceAccountRoleARN: - description: ServiceAccountRoleArn is the ARN of an IAM role to bind to the addons service account - type: string - version: - description: Version is the version of the addon to use - type: string - required: - - name - - version - type: object - type: array - associateOIDCProvider: - default: false - description: AssociateOIDCProvider can be enabled to automatically create an identity provider for the controller for use with IAM roles for service accounts - type: boolean - bastion: - description: Bastion contains options to configure the bastion host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks allowed to access the bastion host. They are set as ingress rules for the Bastion host's Security Group (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the bastion. If not specified, the AMI will default to one picked out in public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are no Ingress rules in the bastion host's security group. Requires AllowedCIDRBlocks to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a bastion host instance with a public ip to access the VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance type for the bastion. If not specified, Cluster API Provider AWS will use t3.micro for all regions except us-east-1, where t2.micro will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - disableVPCCNI: - default: false - description: DisableVPCCNI indicates that the Amazon VPC CNI should be disabled. With EKS clusters the Amazon VPC CNI is automatically installed into the cluster. For clusters where you want to use an alternate CNI this option provides a way to specify that the Amazon VPC CNI should be deleted. You cannot set this to true if you are using the Amazon VPC CNI addon. - type: boolean - eksClusterName: - description: EKSClusterName allows you to specify the name of the EKS cluster in AWS. If you don't specify a name then a default name will be created based on the namespace and name of the managed control plane. - type: string - encryptionConfig: - description: EncryptionConfig specifies the encryption configuration for the cluster - properties: - provider: - description: Provider specifies the ARN or alias of the CMK (in AWS KMS) - type: string - resources: - description: Resources specifies the resources to be encrypted - items: - type: string - type: array - type: object - endpointAccess: - description: Endpoints specifies access to this cluster's control plane endpoints - properties: - private: - description: Private points VPC-internal control plane access to the private endpoint - type: boolean - public: - description: Public controls whether control plane endpoints are publicly accessible - type: boolean - publicCIDRs: - description: PublicCIDRs specifies which blocks can access the public endpoint - items: - type: string - type: array - type: object - iamAuthenticatorConfig: - description: IAMAuthenticatorConfig allows the specification of any additional user or role mappings for use when generating the aws-iam-authenticator configuration. If this is nil the default configuration is still generated for the cluster. - properties: - mapRoles: - description: RoleMappings is a list of role mappings - items: - description: RoleMapping represents a mapping from a IAM role to Kubernetes users and groups. - properties: - groups: - description: Groups is a list of kubernetes RBAC groups - items: - type: string - type: array - rolearn: - description: RoleARN is the AWS ARN for the role to map - minLength: 31 - type: string - username: - description: UserName is a kubernetes RBAC user subject - type: string - required: - - groups - - rolearn - - username - type: object - type: array - mapUsers: - description: UserMappings is a list of user mappings - items: - description: UserMapping represents a mapping from an IAM user to Kubernetes users and groups. - properties: - groups: - description: Groups is a list of kubernetes RBAC groups - items: - type: string - type: array - userarn: - description: UserARN is the AWS ARN for the user to map - minLength: 31 - type: string - username: - description: UserName is a kubernetes RBAC user subject - type: string - required: - - groups - - userarn - - username - type: object - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be used when reconciling the managed control plane. - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system used to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. - type: string - kubeProxy: - description: KubeProxy defines managed attributes of the kube-proxy daemonset - properties: - disable: - default: false - description: Disable set to true indicates that kube-proxy should be disabled. With EKS clusters kube-proxy is automatically installed into the cluster. For clusters where you want to use kube-proxy functionality that is provided with an alternate CNI, this option provides a way to specify that the kube-proxy daemonset should be deleted. You cannot set this to true if you are using the Amazon kube-proxy addon. - type: boolean - type: object - logging: - description: Logging specifies which EKS Cluster logs should be enabled. Entries for each of the enabled logs will be sent to CloudWatch - properties: - apiServer: - default: false - description: APIServer indicates if the Kubernetes API Server log (kube-apiserver) shoulkd be enabled - type: boolean - audit: - default: false - description: Audit indicates if the Kubernetes API audit log should be enabled - type: boolean - authenticator: - default: false - description: Authenticator indicates if the iam authenticator log should be enabled - type: boolean - controllerManager: - default: false - description: ControllerManager indicates if the controller manager (kube-controller-manager) log should be enabled - type: boolean - scheduler: - default: false - description: Scheduler indicates if the Kubernetes scheduler (kube-scheduler) log should be enabled - type: boolean - required: - - apiServer - - audit - - authenticator - - controllerManager - - scheduler - type: object - network: - description: NetworkSpec encapsulates all things related to AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply to control plane and worker node security groups. The source for the rule will be set to control plane and worker security group IDs. - items: - description: CNIIngressRule defines an AWS ingress rule for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the protocol type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set of security groups to use for cluster instances This is optional - if not provided new security groups will be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability zone to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block to be used when the provider creates a managed VPC. A subnet can have an IPv4 and an IPv6 address. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 subnet. A subnet is IPv6 when it is associated with a VPC that has IPv6 enabled. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public subnet. A subnet is public when it is associated with a route table that has a route to an internet gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id associated with the subnet. Ignored unless the subnet is managed by the provider, in which case this is set on the public subnet where the NAT gateway resides. It is then used to determine routes for private subnets in the same AZ as the public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id associated with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - required: - - id - type: object - type: array - x-kubernetes-list-map-keys: - - id - x-kubernetes-list-type: map - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies how AZs should be selected if there are more AZs in a region than specified by AvailabilityZoneUsageLimit. There are 2 selection schemes: Ordered - selects based on alphabetical order Random - selects AZs randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies the maximum number of availability zones (AZ) that should be used in a region when automatically creating subnets. If a region has more than this number of AZs then this number of AZs will be picked randomly when creating default subnets. Defaults to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. Defaults to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider should use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet gateway associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings for the network. Supported only in managed clusters. This field cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided by Amazon when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the id of the egress only internet gateway associated with an IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must be defined in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: object - oidcIdentityProviderConfig: - description: IdentityProviderconfig is used to specify the oidc provider config to be attached with this eks cluster - properties: - clientId: - description: This is also known as audience. The ID for the client application that makes authentication requests to the OpenID identity provider. - type: string - groupsClaim: - description: The JWT claim that the provider uses to return your groups. - type: string - groupsPrefix: - description: 'The prefix that is prepended to group claims to prevent clashes with existing names (such as system: groups). For example, the valueoidc: will create group names like oidc:engineering and oidc:infra.' - type: string - identityProviderConfigName: - description: "The name of the OIDC provider configuration. \n IdentityProviderConfigName is a required field" - type: string - issuerUrl: - description: The URL of the OpenID identity provider that allows the API server to discover public signing keys for verifying tokens. The URL must begin with https:// and should correspond to the iss claim in the provider's OIDC ID tokens. Per the OIDC standard, path components are allowed but query parameters are not. Typically the URL consists of only a hostname, like https://server.example.org or https://example.com. This URL should point to the level below .well-known/openid-configuration and must be publicly accessible over the internet. - type: string - requiredClaims: - additionalProperties: - type: string - description: The key value pairs that describe required claims in the identity token. If set, each claim is verified to be present in the token with a matching value. For the maximum number of claims that you can require, see Amazon EKS service quotas (https://docs.aws.amazon.com/eks/latest/userguide/service-quotas.html) in the Amazon EKS User Guide. - type: object - tags: - additionalProperties: - type: string - description: tags to apply to oidc identity provider association - type: object - usernameClaim: - description: The JSON Web Token (JWT) claim to use as the username. The default is sub, which is expected to be a unique identifier of the end user. You can choose other claims, such as email or name, depending on the OpenID identity provider. Claims other than email are prefixed with the issuer URL to prevent naming clashes with other plug-ins. - type: string - usernamePrefix: - description: The prefix that is prepended to username claims to prevent clashes with existing names. If you do not provide this field, and username is a value other than email, the prefix defaults to issuerurl#. You can use the value - to disable all prefixing. - type: string - type: object - region: - description: The AWS Region the cluster lives in. - type: string - roleAdditionalPolicies: - description: RoleAdditionalPolicies allows you to attach additional polices to the control plane role. You must enable the EKSAllowAddRoles feature flag to incorporate these into the created role. - items: - type: string - type: array - roleName: - description: RoleName specifies the name of IAM role that gives EKS permission to make API calls. If the role is pre-existing we will treat it as unmanaged and not delete it on deletion. If the EKSEnableIAM feature flag is true and no name is supplied then a role is created. - minLength: 2 - type: string - secondaryCidrBlock: - description: SecondaryCidrBlock is the additional CIDR range to use for pod IPs. Must be within the 100.64.0.0/10 or 198.19.0.0/16 range. - type: string - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the bastion host. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - tokenMethod: - default: iam-authenticator - description: TokenMethod is used to specify the method for obtaining a client token for communicating with EKS iam-authenticator - obtains a client token using iam-authentictor aws-cli - obtains a client token using the AWS CLI Defaults to iam-authenticator - enum: - - iam-authenticator - - aws-cli - type: string - version: - description: Version defines the desired Kubernetes version. If no version number is supplied then the latest version of Kubernetes that EKS supports will be used. - minLength: 2 - pattern: ^v?(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.?(\.0|[1-9][0-9]*)?$ - type: string - vpcCni: - description: VpcCni is used to set configuration options for the VPC CNI plugin - properties: - env: - description: Env defines a list of environment variables to apply to the `aws-node` DaemonSet - items: - description: EnvVar represents an environment variable present in a Container. - properties: - name: - description: Name of the environment variable. Must be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded using the previously defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' - type: string - valueFrom: - description: Source for the environment variable's value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap or its key must be defined - type: boolean - required: - - key - type: object - fieldRef: - description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' - properties: - apiVersion: - description: Version of the schema the FieldPath is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the specified API version. - type: string - required: - - fieldPath - type: object - resourceFieldRef: - description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' - properties: - containerName: - description: 'Container name: required for volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - secretKeyRef: - description: Selects a key of a secret in the pod's namespace - properties: - key: - description: The key of the secret to select from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be defined - type: boolean - required: - - key - type: object - type: object - required: - - name - type: object - type: array - type: object - type: object - status: - description: AWSManagedControlPlaneStatus defines the observed state of an Amazon EKS Cluster. - properties: - addons: - description: Addons holds the current status of the EKS addons - items: - description: AddonState represents the state of an addon. - properties: - arn: - description: ARN is the AWS ARN of the addon - type: string - createdAt: - description: CreatedAt is the date and time the addon was created at - format: date-time - type: string - issues: - description: Issues is a list of issue associated with the addon - items: - description: AddonIssue represents an issue with an addon. - properties: - code: - description: Code is the issue code - type: string - message: - description: Message is the textual description of the issue - type: string - resourceIds: - description: ResourceIDs is a list of resource ids for the issue - items: - type: string - type: array - type: object - type: array - modifiedAt: - description: ModifiedAt is the date and time the addon was last modified - format: date-time - type: string - name: - description: Name is the name of the addon - type: string - serviceAccountRoleARN: - description: ServiceAccountRoleArn is the ARN of the IAM role used for the service account - type: string - status: - description: Status is the status of the addon - type: string - version: - description: Version is the version of the addon to use - type: string - required: - - arn - - name - - version - type: object - type: array - bastion: - description: Bastion holds details of the instance that is used as a bastion jump box - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - availabilityZone: - description: Availability zone of instance - type: string - ebsOptimized: - description: Indicates whether the instance is optimized for Amazon EBS I/O. - type: boolean - enaSupport: - description: Specifies whether enhanced networking with ENA is enabled. - type: boolean - iamProfile: - description: The name of the IAM instance profile associated with the instance, if applicable. - type: string - id: - type: string - imageId: - description: The ID of the AMI used to launch the instance. - type: string - instanceState: - description: The current state of the instance. - type: string - networkInterfaces: - description: Specifies ENIs attached to instance - items: - type: string - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - type: array - privateIp: - description: The private IPv4 address assigned to the instance. - type: string - publicIp: - description: The public IPv4 address assigned to the instance, if applicable. - type: string - rootVolume: - description: Configuration options for the root storage volume. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - securityGroupIds: - description: SecurityGroupIDs are one or more security group IDs this instance belongs to. - items: - type: string - type: array - spotMarketOptions: - description: SpotMarketOptions option for configuring instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: The name of the SSH key pair. - type: string - subnetId: - description: The ID of the subnet of the instance. - type: string - tags: - additionalProperties: - type: string - description: The tags associated with the instance. - type: object - tenancy: - description: Tenancy indicates if instance should run on shared or single-tenant hardware. - type: string - type: - description: The instance type. - type: string - userData: - description: UserData is the raw data script passed to the instance which is run upon bootstrap. This field must not be base64 encoded and should only be used when running a new instance. - type: string - volumeIDs: - description: IDs of the instance's volumes - items: - type: string - type: array - required: - - id - type: object - conditions: - description: Conditions specifies the cpnditions for the managed control plane - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - externalManagedControlPlane: - default: true - description: ExternalManagedControlPlane indicates to cluster-api that the control plane is managed by an external service such as AKS, EKS, GKE, etc. - type: boolean - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains specifies a list fo available availability zones that can be used - type: object - failureMessage: - description: ErrorMessage indicates that there is a terminal problem reconciling the state, and will be set to a descriptive error message. - type: string - identityProviderStatus: - description: IdentityProviderStatus holds the status for associated identity provider - properties: - arn: - description: ARN holds the ARN of associated identity provider - type: string - status: - description: Status holds current status of associated identity provider - type: string - type: object - initialized: - description: Initialized denotes whether or not the control plane has the uploaded kubernetes config-map. - type: boolean - networkStatus: - description: Networks holds details about the AWS networking resources used by the control plane - properties: - apiServerElb: - description: APIServerELB is the Kubernetes api server classic load balancer. - properties: - attributes: - description: Attributes defines extra attributes associated with the load balancer. - properties: - crossZoneLoadBalancing: - description: CrossZoneLoadBalancing enables the classic load balancer load balancing. - type: boolean - idleTimeout: - description: IdleTimeout is time that the connection is allowed to be idle (no data has been sent over the connection) before it is closed by the load balancer. - format: int64 - type: integer - type: object - availabilityZones: - description: AvailabilityZones is an array of availability zones in the VPC attached to the load balancer. - items: - type: string - type: array - dnsName: - description: DNSName is the dns name of the load balancer. - type: string - healthChecks: - description: HealthCheck is the classic elb health check associated with the load balancer. - properties: - healthyThreshold: - format: int64 - type: integer - interval: - description: A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. - format: int64 - type: integer - target: - type: string - timeout: - description: A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. - format: int64 - type: integer - unhealthyThreshold: - format: int64 - type: integer - required: - - healthyThreshold - - interval - - target - - timeout - - unhealthyThreshold - type: object - listeners: - description: Listeners is an array of classic elb listeners associated with the load balancer. There must be at least one. - items: - description: ClassicELBListener defines an AWS classic load balancer listener. - properties: - instancePort: - format: int64 - type: integer - instanceProtocol: - description: ClassicELBProtocol defines listener protocols for a classic load balancer. - type: string - port: - format: int64 - type: integer - protocol: - description: ClassicELBProtocol defines listener protocols for a classic load balancer. - type: string - required: - - instancePort - - instanceProtocol - - port - - protocol - type: object - type: array - name: - description: The name of the load balancer. It must be unique within the set of load balancers defined in the region. It also serves as identifier. - type: string - scheme: - description: Scheme is the load balancer scheme, either internet-facing or private. - type: string - securityGroupIds: - description: SecurityGroupIDs is an array of security groups assigned to the load balancer. - items: - type: string - type: array - subnetIds: - description: SubnetIDs is an array of subnets in the VPC attached to the load balancer. - items: - type: string - type: array - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the load balancer. - type: object - type: object - securityGroups: - additionalProperties: - description: SecurityGroup defines an AWS security group. - properties: - id: - description: ID is a unique identifier. - type: string - ingressRule: - description: IngressRules is the inbound rules associated with the security group. - items: - description: IngressRule defines an AWS ingress rule for security groups. - properties: - cidrBlocks: - description: List of CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - description: - type: string - fromPort: - format: int64 - type: integer - ipv6CidrBlocks: - description: List of IPv6 CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - protocol: - description: SecurityGroupProtocol defines the protocol type for a security group rule. - type: string - sourceSecurityGroupIds: - description: The security group id to allow access from. Cannot be specified with CidrBlocks. - items: - type: string - type: array - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - name: - description: Name is the security group name. - type: string - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the security group. - type: object - required: - - id - - name - type: object - description: SecurityGroups is a map from the role/kind of the security group to its unique name, if any. - type: object - type: object - oidcProvider: - description: OIDCProvider holds the status of the identity provider for this cluster - properties: - arn: - description: ARN holds the ARN of the provider - type: string - trustPolicy: - description: TrustPolicy contains the boilerplate IAM trust policy to use for IRSA - type: string - type: object - ready: - default: false - description: Ready denotes that the AWSManagedControlPlane API Server is ready to receive requests and that the VPC infra is ready. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this AWSManagedControl belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Control plane infrastructure is ready for worker nodes - jsonPath: .status.ready - name: Ready - type: string - - description: AWS VPC the control plane is using - jsonPath: .spec.network.vpc.id - name: VPC - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - - description: Bastion IP address for breakglass access - jsonPath: .status.bastion.publicIp - name: Bastion IP - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSManagedControlPlane is the schema for the Amazon EKS Managed Control Plane API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSManagedControlPlaneSpec defines the desired state of an Amazon EKS Cluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default. - type: object - addons: - description: Addons defines the EKS addons to enable with the EKS cluster. - items: - description: Addon represents a EKS addon. - properties: - conflictResolution: - default: overwrite - description: ConflictResolution is used to declare what should happen if there are parameter conflicts. Defaults to none - enum: - - overwrite - - none - type: string - name: - description: Name is the name of the addon - minLength: 2 - type: string - serviceAccountRoleARN: - description: ServiceAccountRoleArn is the ARN of an IAM role to bind to the addons service account - type: string - version: - description: Version is the version of the addon to use - type: string - required: - - name - - version - type: object - type: array - associateOIDCProvider: - default: false - description: AssociateOIDCProvider can be enabled to automatically create an identity provider for the controller for use with IAM roles for service accounts - type: boolean - bastion: - description: Bastion contains options to configure the bastion host. - properties: - allowedCIDRBlocks: - description: AllowedCIDRBlocks is a list of CIDR blocks allowed to access the bastion host. They are set as ingress rules for the Bastion host's Security Group (defaults to 0.0.0.0/0). - items: - type: string - type: array - ami: - description: AMI will use the specified AMI to boot the bastion. If not specified, the AMI will default to one picked out in public space. - type: string - disableIngressRules: - description: DisableIngressRules will ensure there are no Ingress rules in the bastion host's security group. Requires AllowedCIDRBlocks to be empty. - type: boolean - enabled: - description: Enabled allows this provider to create a bastion host instance with a public ip to access the VPC private network. - type: boolean - instanceType: - description: InstanceType will use the specified instance type for the bastion. If not specified, Cluster API Provider AWS will use t3.micro for all regions except us-east-1, where t2.micro will be the default. - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - eksClusterName: - description: EKSClusterName allows you to specify the name of the EKS cluster in AWS. If you don't specify a name then a default name will be created based on the namespace and name of the managed control plane. - type: string - encryptionConfig: - description: EncryptionConfig specifies the encryption configuration for the cluster - properties: - provider: - description: Provider specifies the ARN or alias of the CMK (in AWS KMS) - type: string - resources: - description: Resources specifies the resources to be encrypted - items: - type: string - type: array - type: object - endpointAccess: - description: Endpoints specifies access to this cluster's control plane endpoints - properties: - private: - description: Private points VPC-internal control plane access to the private endpoint - type: boolean - public: - description: Public controls whether control plane endpoints are publicly accessible - type: boolean - publicCIDRs: - description: PublicCIDRs specifies which blocks can access the public endpoint - items: - type: string - type: array - type: object - iamAuthenticatorConfig: - description: IAMAuthenticatorConfig allows the specification of any additional user or role mappings for use when generating the aws-iam-authenticator configuration. If this is nil the default configuration is still generated for the cluster. - properties: - mapRoles: - description: RoleMappings is a list of role mappings - items: - description: RoleMapping represents a mapping from a IAM role to Kubernetes users and groups. - properties: - groups: - description: Groups is a list of kubernetes RBAC groups - items: - type: string - type: array - rolearn: - description: RoleARN is the AWS ARN for the role to map - minLength: 31 - type: string - username: - description: UserName is a kubernetes RBAC user subject - type: string - required: - - groups - - rolearn - - username - type: object - type: array - mapUsers: - description: UserMappings is a list of user mappings - items: - description: UserMapping represents a mapping from an IAM user to Kubernetes users and groups. - properties: - groups: - description: Groups is a list of kubernetes RBAC groups - items: - type: string - type: array - userarn: - description: UserARN is the AWS ARN for the user to map - minLength: 31 - type: string - username: - description: UserName is a kubernetes RBAC user subject - type: string - required: - - groups - - userarn - - username - type: object - type: array - type: object - identityRef: - description: IdentityRef is a reference to a identity to be used when reconciling the managed control plane. - properties: - kind: - description: Kind of the identity. - enum: - - AWSClusterControllerIdentity - - AWSClusterRoleIdentity - - AWSClusterStaticIdentity - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system used to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupBaseOS. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to look up machine images when a machine does not specify an AMI. When set, this will be used for all cluster machines unless a machine specifies a different ImageLookupOrg. - type: string - kubeProxy: - description: KubeProxy defines managed attributes of the kube-proxy daemonset - properties: - disable: - default: false - description: Disable set to true indicates that kube-proxy should be disabled. With EKS clusters kube-proxy is automatically installed into the cluster. For clusters where you want to use kube-proxy functionality that is provided with an alternate CNI, this option provides a way to specify that the kube-proxy daemonset should be deleted. You cannot set this to true if you are using the Amazon kube-proxy addon. - type: boolean - type: object - logging: - description: Logging specifies which EKS Cluster logs should be enabled. Entries for each of the enabled logs will be sent to CloudWatch - properties: - apiServer: - default: false - description: APIServer indicates if the Kubernetes API Server log (kube-apiserver) shoulkd be enabled - type: boolean - audit: - default: false - description: Audit indicates if the Kubernetes API audit log should be enabled - type: boolean - authenticator: - default: false - description: Authenticator indicates if the iam authenticator log should be enabled - type: boolean - controllerManager: - default: false - description: ControllerManager indicates if the controller manager (kube-controller-manager) log should be enabled - type: boolean - scheduler: - default: false - description: Scheduler indicates if the Kubernetes scheduler (kube-scheduler) log should be enabled - type: boolean - required: - - apiServer - - audit - - authenticator - - controllerManager - - scheduler - type: object - network: - description: NetworkSpec encapsulates all things related to AWS network. - properties: - cni: - description: CNI configuration - properties: - cniIngressRules: - description: CNIIngressRules specify rules to apply to control plane and worker node security groups. The source for the rule will be set to control plane and worker security group IDs. - items: - description: CNIIngressRule defines an AWS ingress rule for CNI requirements. - properties: - description: - type: string - fromPort: - format: int64 - type: integer - protocol: - description: SecurityGroupProtocol defines the protocol type for a security group rule. - type: string - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - type: object - securityGroupOverrides: - additionalProperties: - type: string - description: SecurityGroupOverrides is an optional set of security groups to use for cluster instances This is optional - if not provided new security groups will be created for the cluster - type: object - subnets: - description: Subnets configuration. - items: - description: SubnetSpec configures an AWS Subnet. - properties: - availabilityZone: - description: AvailabilityZone defines the availability zone to use for this subnet in the cluster's region. - type: string - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. - type: string - id: - description: ID defines a unique identifier to reference this resource. - type: string - ipv6CidrBlock: - description: IPv6CidrBlock is the IPv6 CIDR block to be used when the provider creates a managed VPC. A subnet can have an IPv4 and an IPv6 address. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: string - isIpv6: - description: IsIPv6 defines the subnet as an IPv6 subnet. A subnet is IPv6 when it is associated with a VPC that has IPv6 enabled. IPv6 is only supported in managed clusters, this field cannot be set on AWSCluster object. - type: boolean - isPublic: - description: IsPublic defines the subnet as a public subnet. A subnet is public when it is associated with a route table that has a route to an internet gateway. - type: boolean - natGatewayId: - description: NatGatewayID is the NAT gateway id associated with the subnet. Ignored unless the subnet is managed by the provider, in which case this is set on the public subnet where the NAT gateway resides. It is then used to determine routes for private subnets in the same AZ as the public subnet. - type: string - routeTableId: - description: RouteTableID is the routing table id associated with the subnet. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - required: - - id - type: object - type: array - x-kubernetes-list-map-keys: - - id - x-kubernetes-list-type: map - vpc: - description: VPC configuration. - properties: - availabilityZoneSelection: - default: Ordered - description: 'AvailabilityZoneSelection specifies how AZs should be selected if there are more AZs in a region than specified by AvailabilityZoneUsageLimit. There are 2 selection schemes: Ordered - selects based on alphabetical order Random - selects AZs randomly in a region Defaults to Ordered' - enum: - - Ordered - - Random - type: string - availabilityZoneUsageLimit: - default: 3 - description: AvailabilityZoneUsageLimit specifies the maximum number of availability zones (AZ) that should be used in a region when automatically creating subnets. If a region has more than this number of AZs then this number of AZs will be picked randomly when creating default subnets. Defaults to 3 - minimum: 1 - type: integer - cidrBlock: - description: CidrBlock is the CIDR block to be used when the provider creates a managed VPC. Defaults to 10.0.0.0/16. - type: string - id: - description: ID is the vpc-id of the VPC this provider should use to create resources. - type: string - internetGatewayId: - description: InternetGatewayID is the id of the internet gateway associated with the VPC. - type: string - ipv6: - description: IPv6 contains ipv6 specific settings for the network. Supported only in managed clusters. This field cannot be set on AWSCluster object. - properties: - cidrBlock: - description: CidrBlock is the CIDR block provided by Amazon when VPC has enabled IPv6. - type: string - egressOnlyInternetGatewayId: - description: EgressOnlyInternetGatewayID is the id of the egress only internet gateway associated with an IPv6 enabled VPC. - type: string - poolId: - description: PoolID is the IP pool which must be defined in case of BYO IP is defined. - type: string - type: object - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: object - oidcIdentityProviderConfig: - description: IdentityProviderconfig is used to specify the oidc provider config to be attached with this eks cluster - properties: - clientId: - description: This is also known as audience. The ID for the client application that makes authentication requests to the OpenID identity provider. - type: string - groupsClaim: - description: The JWT claim that the provider uses to return your groups. - type: string - groupsPrefix: - description: 'The prefix that is prepended to group claims to prevent clashes with existing names (such as system: groups). For example, the valueoidc: will create group names like oidc:engineering and oidc:infra.' - type: string - identityProviderConfigName: - description: "The name of the OIDC provider configuration. \n IdentityProviderConfigName is a required field" - type: string - issuerUrl: - description: The URL of the OpenID identity provider that allows the API server to discover public signing keys for verifying tokens. The URL must begin with https:// and should correspond to the iss claim in the provider's OIDC ID tokens. Per the OIDC standard, path components are allowed but query parameters are not. Typically the URL consists of only a hostname, like https://server.example.org or https://example.com. This URL should point to the level below .well-known/openid-configuration and must be publicly accessible over the internet. - type: string - requiredClaims: - additionalProperties: - type: string - description: The key value pairs that describe required claims in the identity token. If set, each claim is verified to be present in the token with a matching value. For the maximum number of claims that you can require, see Amazon EKS service quotas (https://docs.aws.amazon.com/eks/latest/userguide/service-quotas.html) in the Amazon EKS User Guide. - type: object - tags: - additionalProperties: - type: string - description: tags to apply to oidc identity provider association - type: object - usernameClaim: - description: The JSON Web Token (JWT) claim to use as the username. The default is sub, which is expected to be a unique identifier of the end user. You can choose other claims, such as email or name, depending on the OpenID identity provider. Claims other than email are prefixed with the issuer URL to prevent naming clashes with other plug-ins. - type: string - usernamePrefix: - description: The prefix that is prepended to username claims to prevent clashes with existing names. If you do not provide this field, and username is a value other than email, the prefix defaults to issuerurl#. You can use the value - to disable all prefixing. - type: string - type: object - region: - description: The AWS Region the cluster lives in. - type: string - roleAdditionalPolicies: - description: RoleAdditionalPolicies allows you to attach additional polices to the control plane role. You must enable the EKSAllowAddRoles feature flag to incorporate these into the created role. - items: - type: string - type: array - roleName: - description: RoleName specifies the name of IAM role that gives EKS permission to make API calls. If the role is pre-existing we will treat it as unmanaged and not delete it on deletion. If the EKSEnableIAM feature flag is true and no name is supplied then a role is created. - minLength: 2 - type: string - secondaryCidrBlock: - description: SecondaryCidrBlock is the additional CIDR range to use for pod IPs. Must be within the 100.64.0.0/10 or 198.19.0.0/16 range. - type: string - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the bastion host. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - tokenMethod: - default: iam-authenticator - description: TokenMethod is used to specify the method for obtaining a client token for communicating with EKS iam-authenticator - obtains a client token using iam-authentictor aws-cli - obtains a client token using the AWS CLI Defaults to iam-authenticator - enum: - - iam-authenticator - - aws-cli - type: string - version: - description: Version defines the desired Kubernetes version. If no version number is supplied then the latest version of Kubernetes that EKS supports will be used. - minLength: 2 - pattern: ^v?(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.?(\.0|[1-9][0-9]*)?$ - type: string - vpcCni: - description: VpcCni is used to set configuration options for the VPC CNI plugin - properties: - disable: - default: false - description: Disable indicates that the Amazon VPC CNI should be disabled. With EKS clusters the Amazon VPC CNI is automatically installed into the cluster. For clusters where you want to use an alternate CNI this option provides a way to specify that the Amazon VPC CNI should be deleted. You cannot set this to true if you are using the Amazon VPC CNI addon. - type: boolean - env: - description: Env defines a list of environment variables to apply to the `aws-node` DaemonSet - items: - description: EnvVar represents an environment variable present in a Container. - properties: - name: - description: Name of the environment variable. Must be a C_IDENTIFIER. - type: string - value: - description: 'Variable references $(VAR_NAME) are expanded using the previously defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. Double $$ are reduced to a single $, which allows for escaping the $(VAR_NAME) syntax: i.e. "$$(VAR_NAME)" will produce the string literal "$(VAR_NAME)". Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' - type: string - valueFrom: - description: Source for the environment variable's value. Cannot be used if value is not empty. - properties: - configMapKeyRef: - description: Selects a key of a ConfigMap. - properties: - key: - description: The key to select. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the ConfigMap or its key must be defined - type: boolean - required: - - key - type: object - fieldRef: - description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' - properties: - apiVersion: - description: Version of the schema the FieldPath is written in terms of, defaults to "v1". - type: string - fieldPath: - description: Path of the field to select in the specified API version. - type: string - required: - - fieldPath - type: object - resourceFieldRef: - description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' - properties: - containerName: - description: 'Container name: required for volumes, optional for env vars' - type: string - divisor: - anyOf: - - type: integer - - type: string - description: Specifies the output format of the exposed resources, defaults to "1" - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - resource: - description: 'Required: resource to select' - type: string - required: - - resource - type: object - secretKeyRef: - description: Selects a key of a secret in the pod's namespace - properties: - key: - description: The key of the secret to select from. Must be a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be defined - type: boolean - required: - - key - type: object - type: object - required: - - name - type: object - type: array - type: object - type: object - status: - description: AWSManagedControlPlaneStatus defines the observed state of an Amazon EKS Cluster. - properties: - addons: - description: Addons holds the current status of the EKS addons - items: - description: AddonState represents the state of an addon. - properties: - arn: - description: ARN is the AWS ARN of the addon - type: string - createdAt: - description: CreatedAt is the date and time the addon was created at - format: date-time - type: string - issues: - description: Issues is a list of issue associated with the addon - items: - description: AddonIssue represents an issue with an addon. - properties: - code: - description: Code is the issue code - type: string - message: - description: Message is the textual description of the issue - type: string - resourceIds: - description: ResourceIDs is a list of resource ids for the issue - items: - type: string - type: array - type: object - type: array - modifiedAt: - description: ModifiedAt is the date and time the addon was last modified - format: date-time - type: string - name: - description: Name is the name of the addon - type: string - serviceAccountRoleARN: - description: ServiceAccountRoleArn is the ARN of the IAM role used for the service account - type: string - status: - description: Status is the status of the addon - type: string - version: - description: Version is the version of the addon to use - type: string - required: - - arn - - name - - version - type: object - type: array - bastion: - description: Bastion holds details of the instance that is used as a bastion jump box - properties: - addresses: - description: Addresses contains the AWS instance associated addresses. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - availabilityZone: - description: Availability zone of instance - type: string - ebsOptimized: - description: Indicates whether the instance is optimized for Amazon EBS I/O. - type: boolean - enaSupport: - description: Specifies whether enhanced networking with ENA is enabled. - type: boolean - iamProfile: - description: The name of the IAM instance profile associated with the instance, if applicable. - type: string - id: - type: string - imageId: - description: The ID of the AMI used to launch the instance. - type: string - instanceState: - description: The current state of the instance. - type: string - networkInterfaces: - description: Specifies ENIs attached to instance - items: - type: string - type: array - nonRootVolumes: - description: Configuration options for the non root storage volumes. - items: - description: Volume encapsulates the configuration options for the storage device. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - type: array - privateIp: - description: The private IPv4 address assigned to the instance. - type: string - publicIp: - description: The public IPv4 address assigned to the instance, if applicable. - type: string - rootVolume: - description: Configuration options for the root storage volume. - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - securityGroupIds: - description: SecurityGroupIDs are one or more security group IDs this instance belongs to. - items: - type: string - type: array - spotMarketOptions: - description: SpotMarketOptions option for configuring instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: The name of the SSH key pair. - type: string - subnetId: - description: The ID of the subnet of the instance. - type: string - tags: - additionalProperties: - type: string - description: The tags associated with the instance. - type: object - tenancy: - description: Tenancy indicates if instance should run on shared or single-tenant hardware. - type: string - type: - description: The instance type. - type: string - userData: - description: UserData is the raw data script passed to the instance which is run upon bootstrap. This field must not be base64 encoded and should only be used when running a new instance. - type: string - volumeIDs: - description: IDs of the instance's volumes - items: - type: string - type: array - required: - - id - type: object - conditions: - description: Conditions specifies the cpnditions for the managed control plane - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - externalManagedControlPlane: - default: true - description: ExternalManagedControlPlane indicates to cluster-api that the control plane is managed by an external service such as AKS, EKS, GKE, etc. - type: boolean - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains specifies a list fo available availability zones that can be used - type: object - failureMessage: - description: ErrorMessage indicates that there is a terminal problem reconciling the state, and will be set to a descriptive error message. - type: string - identityProviderStatus: - description: IdentityProviderStatus holds the status for associated identity provider - properties: - arn: - description: ARN holds the ARN of associated identity provider - type: string - status: - description: Status holds current status of associated identity provider - type: string - type: object - initialized: - description: Initialized denotes whether or not the control plane has the uploaded kubernetes config-map. - type: boolean - networkStatus: - description: Networks holds details about the AWS networking resources used by the control plane - properties: - apiServerElb: - description: APIServerELB is the Kubernetes api server classic load balancer. - properties: - attributes: - description: Attributes defines extra attributes associated with the load balancer. - properties: - crossZoneLoadBalancing: - description: CrossZoneLoadBalancing enables the classic load balancer load balancing. - type: boolean - idleTimeout: - description: IdleTimeout is time that the connection is allowed to be idle (no data has been sent over the connection) before it is closed by the load balancer. - format: int64 - type: integer - type: object - availabilityZones: - description: AvailabilityZones is an array of availability zones in the VPC attached to the load balancer. - items: - type: string - type: array - dnsName: - description: DNSName is the dns name of the load balancer. - type: string - healthChecks: - description: HealthCheck is the classic elb health check associated with the load balancer. - properties: - healthyThreshold: - format: int64 - type: integer - interval: - description: A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. - format: int64 - type: integer - target: - type: string - timeout: - description: A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years. - format: int64 - type: integer - unhealthyThreshold: - format: int64 - type: integer - required: - - healthyThreshold - - interval - - target - - timeout - - unhealthyThreshold - type: object - listeners: - description: Listeners is an array of classic elb listeners associated with the load balancer. There must be at least one. - items: - description: ClassicELBListener defines an AWS classic load balancer listener. - properties: - instancePort: - format: int64 - type: integer - instanceProtocol: - description: ClassicELBProtocol defines listener protocols for a classic load balancer. - type: string - port: - format: int64 - type: integer - protocol: - description: ClassicELBProtocol defines listener protocols for a classic load balancer. - type: string - required: - - instancePort - - instanceProtocol - - port - - protocol - type: object - type: array - name: - description: The name of the load balancer. It must be unique within the set of load balancers defined in the region. It also serves as identifier. - type: string - scheme: - description: Scheme is the load balancer scheme, either internet-facing or private. - type: string - securityGroupIds: - description: SecurityGroupIDs is an array of security groups assigned to the load balancer. - items: - type: string - type: array - subnetIds: - description: SubnetIDs is an array of subnets in the VPC attached to the load balancer. - items: - type: string - type: array - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the load balancer. - type: object - type: object - securityGroups: - additionalProperties: - description: SecurityGroup defines an AWS security group. - properties: - id: - description: ID is a unique identifier. - type: string - ingressRule: - description: IngressRules is the inbound rules associated with the security group. - items: - description: IngressRule defines an AWS ingress rule for security groups. - properties: - cidrBlocks: - description: List of CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - description: - type: string - fromPort: - format: int64 - type: integer - ipv6CidrBlocks: - description: List of IPv6 CIDR blocks to allow access from. Cannot be specified with SourceSecurityGroupID. - items: - type: string - type: array - protocol: - description: SecurityGroupProtocol defines the protocol type for a security group rule. - type: string - sourceSecurityGroupIds: - description: The security group id to allow access from. Cannot be specified with CidrBlocks. - items: - type: string - type: array - toPort: - format: int64 - type: integer - required: - - description - - fromPort - - protocol - - toPort - type: object - type: array - name: - description: Name is the security group name. - type: string - tags: - additionalProperties: - type: string - description: Tags is a map of tags associated with the security group. - type: object - required: - - id - - name - type: object - description: SecurityGroups is a map from the role/kind of the security group to its unique name, if any. - type: object - type: object - oidcProvider: - description: OIDCProvider holds the status of the identity provider for this cluster - properties: - arn: - description: ARN holds the ARN of the provider - type: string - trustPolicy: - description: TrustPolicy contains the boilerplate IAM trust policy to use for IRSA - type: string - type: object - ready: - default: false - description: Ready denotes that the AWSManagedControlPlane API Server is ready to receive requests and that the VPC infra is ready. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.10.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: awsmanagedmachinepools.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AWSManagedMachinePool - listKind: AWSManagedMachinePoolList - plural: awsmanagedmachinepools - shortNames: - - awsmmp - singular: awsmanagedmachinepool - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: MachinePool ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Number of replicas - jsonPath: .status.replicas - name: Replicas - type: integer - name: v1beta1 - schema: - openAPIV3Schema: - description: AWSManagedMachinePool is the Schema for the awsmanagedmachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSManagedMachinePoolSpec defines the desired state of AWSManagedMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default. - type: object - amiType: - default: AL2_x86_64 - description: AMIType defines the AMI type - enum: - - AL2_x86_64 - - AL2_x86_64_GPU - - AL2_ARM_64 - - CUSTOM - type: string - amiVersion: - description: AMIVersion defines the desired AMI release version. If no version number is supplied then the latest version for the Kubernetes version will be used - minLength: 2 - type: string - availabilityZones: - description: AvailabilityZones is an array of availability zones instances can run in - items: - type: string - type: array - awsLaunchTemplate: - description: AWSLaunchTemplate specifies the launch template to use to create the managed node group. If AWSLaunchTemplate is specified, certain node group configuraions outside of launch template are prohibited (https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html). - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references to security groups that should be applied to the instances. These security groups would be set in addition to any security groups defined at the cluster level or in the actuator. - items: - description: AWSResourceReference is a reference to a specific AWS resource by ID or filters. Only one of ID or Filters may be specified. Specifying more than one will result in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - ami: - description: AMI is the reference to the AMI from which to create the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - iamInstanceProfile: - description: The name or the Amazon Resource Name (ARN) of the instance profile associated with the IAM role for the instance. The instance profile contains the IAM role. - type: string - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up the image for this machine It will be ignored if an explicit AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use for image lookup if AMI is not set. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. Example: m4.xlarge' - type: string - name: - description: The name of the launch template. - type: string - rootVolume: - description: RootVolume encapsulates the configuration options for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions are options for configuring AWSMachinePool instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the instance. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - versionNumber: - description: 'VersionNumber is the version of the launch template that is applied. Typically a new version is created when at least one of the following happens: 1) A new launch template spec is applied. 2) One or more parameters in an existing template is changed. 3) A new AMI is discovered.' - format: int64 - type: integer - type: object - capacityType: - default: onDemand - description: CapacityType specifies the capacity type for the ASG behind this pool - enum: - - onDemand - - spot - type: string - diskSize: - description: DiskSize specifies the root disk size - format: int32 - type: integer - eksNodegroupName: - description: EKSNodegroupName specifies the name of the nodegroup in AWS corresponding to this MachinePool. If you don't specify a name then a default name will be created based on the namespace and name of the managed machine pool. - type: string - instanceType: - description: InstanceType specifies the AWS instance type - type: string - labels: - additionalProperties: - type: string - description: Labels specifies labels for the Kubernetes node objects - type: object - providerIDList: - description: ProviderIDList are the provider IDs of instances in the autoscaling group corresponding to the nodegroup represented by this machine pool - items: - type: string - type: array - remoteAccess: - description: RemoteAccess specifies how machines can be accessed remotely - properties: - public: - description: Public specifies whether to open port 22 to the public internet - type: boolean - sourceSecurityGroups: - description: SourceSecurityGroups specifies which security groups are allowed access - items: - type: string - type: array - sshKeyName: - description: SSHKeyName specifies which EC2 SSH key can be used to access machines. If left empty, the key from the control plane is used. - type: string - type: object - roleAdditionalPolicies: - description: RoleAdditionalPolicies allows you to attach additional polices to the node group role. You must enable the EKSAllowAddRoles feature flag to incorporate these into the created role. - items: - type: string - type: array - roleName: - description: RoleName specifies the name of IAM role for the node group. If the role is pre-existing we will treat it as unmanaged and not delete it on deletion. If the EKSEnableIAM feature flag is true and no name is supplied then a role is created. - type: string - scaling: - description: Scaling specifies scaling for the ASG behind this pool - properties: - maxSize: - format: int32 - type: integer - minSize: - format: int32 - type: integer - type: object - subnetIDs: - description: SubnetIDs specifies which subnets are used for the auto scaling group of this nodegroup - items: - type: string - type: array - taints: - description: Taints specifies the taints to apply to the nodes of the machine pool - items: - description: Taint defines the specs for a Kubernetes taint. - properties: - effect: - description: Effect specifies the effect for the taint - enum: - - no-schedule - - no-execute - - prefer-no-schedule - type: string - key: - description: Key is the key of the taint - type: string - value: - description: Value is the value of the taint - type: string - required: - - effect - - key - - value - type: object - type: array - updateConfig: - description: UpdateConfig holds the optional config to control the behaviour of the update to the nodegroup. - properties: - maxUnavailable: - description: MaxUnavailable is the maximum number of nodes unavailable at once during a version update. Nodes will be updated in parallel. The maximum number is 100. - maximum: 100 - minimum: 1 - type: integer - maxUnavailablePrecentage: - description: MaxUnavailablePercentage is the maximum percentage of nodes unavailable during a version update. This percentage of nodes will be updated in parallel, up to 100 nodes at once. - maximum: 100 - minimum: 1 - type: integer - type: object - type: object - status: - description: AWSManagedMachinePoolStatus defines the observed state of AWSManagedMachinePool. - properties: - conditions: - description: Conditions defines current service state of the managed machine pool - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachinePool's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - launchTemplateID: - description: The ID of the launch template - type: string - launchTemplateVersion: - description: The version of the launch template - type: string - ready: - default: false - description: Ready denotes that the AWSManagedMachinePool nodegroup has joined the cluster - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: MachinePool ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Number of replicas - jsonPath: .status.replicas - name: Replicas - type: integer - name: v1beta2 - schema: - openAPIV3Schema: - description: AWSManagedMachinePool is the Schema for the awsmanagedmachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AWSManagedMachinePoolSpec defines the desired state of AWSManagedMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to AWS resources managed by the AWS provider, in addition to the ones added by default. - type: object - amiType: - default: AL2_x86_64 - description: AMIType defines the AMI type - enum: - - AL2_x86_64 - - AL2_x86_64_GPU - - AL2_ARM_64 - - CUSTOM - type: string - amiVersion: - description: AMIVersion defines the desired AMI release version. If no version number is supplied then the latest version for the Kubernetes version will be used - minLength: 2 - type: string - availabilityZones: - description: AvailabilityZones is an array of availability zones instances can run in - items: - type: string - type: array - awsLaunchTemplate: - description: AWSLaunchTemplate specifies the launch template to use to create the managed node group. If AWSLaunchTemplate is specified, certain node group configuraions outside of launch template are prohibited (https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html). - properties: - additionalSecurityGroups: - description: AdditionalSecurityGroups is an array of references to security groups that should be applied to the instances. These security groups would be set in addition to any security groups defined at the cluster level or in the actuator. - items: - description: AWSResourceReference is a reference to a specific AWS resource by ID or filters. Only one of ID or Filters may be specified. Specifying more than one will result in a validation error. - properties: - filters: - description: 'Filters is a set of key/value pairs used to identify a resource They are applied according to the rules defined by the AWS API: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html' - items: - description: Filter is a filter used to identify an AWS resource. - properties: - name: - description: Name of the filter. Filter names are case-sensitive. - type: string - values: - description: Values includes one or more filter values. Filter values are case-sensitive. - items: - type: string - type: array - required: - - name - - values - type: object - type: array - id: - description: ID of resource - type: string - type: object - type: array - ami: - description: AMI is the reference to the AMI from which to create the machine instance. - properties: - eksLookupType: - description: EKSOptimizedLookupType If specified, will look up an EKS Optimized image in SSM Parameter store - enum: - - AmazonLinux - - AmazonLinuxGPU - type: string - id: - description: ID of resource - type: string - type: object - iamInstanceProfile: - description: The name or the Amazon Resource Name (ARN) of the instance profile associated with the IAM role for the instance. The instance profile contains the IAM role. - type: string - imageLookupBaseOS: - description: ImageLookupBaseOS is the name of the base operating system to use for image lookup the AMI is not set. - type: string - imageLookupFormat: - description: 'ImageLookupFormat is the AMI naming format to look up the image for this machine It will be ignored if an explicit AMI is set. Supports substitutions for {{.BaseOS}} and {{.K8sVersion}} with the base OS and kubernetes version, respectively. The BaseOS will be the value in ImageLookupBaseOS or ubuntu (the default), and the kubernetes version as defined by the packages produced by kubernetes/release without v as a prefix: 1.13.0, 1.12.5-mybuild.1, or 1.17.3. For example, the default image format of capa-ami-{{.BaseOS}}-?{{.K8sVersion}}-* will end up searching for AMIs that match the pattern capa-ami-ubuntu-?1.18.0-* for a Machine that is targeting kubernetes v1.18.0 and the ubuntu base OS. See also: https://golang.org/pkg/text/template/' - type: string - imageLookupOrg: - description: ImageLookupOrg is the AWS Organization ID to use for image lookup if AMI is not set. - type: string - instanceType: - description: 'InstanceType is the type of instance to create. Example: m4.xlarge' - type: string - name: - description: The name of the launch template. - type: string - rootVolume: - description: RootVolume encapsulates the configuration options for the root volume - properties: - deviceName: - description: Device name - type: string - encrypted: - description: Encrypted is whether the volume should be encrypted or not. - type: boolean - encryptionKey: - description: EncryptionKey is the KMS key to use to encrypt the volume. Can be either a KMS key ID or ARN. If Encrypted is set and this is omitted, the default AWS key will be used. The key must already exist and be accessible by the controller. - type: string - iops: - description: IOPS is the number of IOPS requested for the disk. Not applicable to all types. - format: int64 - type: integer - size: - description: Size specifies size (in Gi) of the storage device. Must be greater than the image snapshot size or 8 (whichever is greater). - format: int64 - minimum: 8 - type: integer - throughput: - description: Throughput to provision in MiB/s supported for the volume type. Not applicable to all types. - format: int64 - type: integer - type: - description: Type is the type of the volume (e.g. gp2, io1, etc...). - type: string - required: - - size - type: object - spotMarketOptions: - description: SpotMarketOptions are options for configuring AWSMachinePool instances to be run using AWS Spot instances. - properties: - maxPrice: - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - type: string - type: object - sshKeyName: - description: SSHKeyName is the name of the ssh key to attach to the instance. Valid values are empty string (do not use SSH keys), a valid SSH key name, or omitted (use the default SSH key name) - type: string - versionNumber: - description: 'VersionNumber is the version of the launch template that is applied. Typically a new version is created when at least one of the following happens: 1) A new launch template spec is applied. 2) One or more parameters in an existing template is changed. 3) A new AMI is discovered.' - format: int64 - type: integer - type: object - capacityType: - default: onDemand - description: CapacityType specifies the capacity type for the ASG behind this pool - enum: - - onDemand - - spot - type: string - diskSize: - description: DiskSize specifies the root disk size - format: int32 - type: integer - eksNodegroupName: - description: EKSNodegroupName specifies the name of the nodegroup in AWS corresponding to this MachinePool. If you don't specify a name then a default name will be created based on the namespace and name of the managed machine pool. - type: string - instanceType: - description: InstanceType specifies the AWS instance type - type: string - labels: - additionalProperties: - type: string - description: Labels specifies labels for the Kubernetes node objects - type: object - providerIDList: - description: ProviderIDList are the provider IDs of instances in the autoscaling group corresponding to the nodegroup represented by this machine pool - items: - type: string - type: array - remoteAccess: - description: RemoteAccess specifies how machines can be accessed remotely - properties: - public: - description: Public specifies whether to open port 22 to the public internet - type: boolean - sourceSecurityGroups: - description: SourceSecurityGroups specifies which security groups are allowed access - items: - type: string - type: array - sshKeyName: - description: SSHKeyName specifies which EC2 SSH key can be used to access machines. If left empty, the key from the control plane is used. - type: string - type: object - roleAdditionalPolicies: - description: RoleAdditionalPolicies allows you to attach additional polices to the node group role. You must enable the EKSAllowAddRoles feature flag to incorporate these into the created role. - items: - type: string - type: array - roleName: - description: RoleName specifies the name of IAM role for the node group. If the role is pre-existing we will treat it as unmanaged and not delete it on deletion. If the EKSEnableIAM feature flag is true and no name is supplied then a role is created. - type: string - scaling: - description: Scaling specifies scaling for the ASG behind this pool - properties: - maxSize: - format: int32 - type: integer - minSize: - format: int32 - type: integer - type: object - subnetIDs: - description: SubnetIDs specifies which subnets are used for the auto scaling group of this nodegroup - items: - type: string - type: array - taints: - description: Taints specifies the taints to apply to the nodes of the machine pool - items: - description: Taint defines the specs for a Kubernetes taint. - properties: - effect: - description: Effect specifies the effect for the taint - enum: - - no-schedule - - no-execute - - prefer-no-schedule - type: string - key: - description: Key is the key of the taint - type: string - value: - description: Value is the value of the taint - type: string - required: - - effect - - key - - value - type: object - type: array - updateConfig: - description: UpdateConfig holds the optional config to control the behaviour of the update to the nodegroup. - properties: - maxUnavailable: - description: MaxUnavailable is the maximum number of nodes unavailable at once during a version update. Nodes will be updated in parallel. The maximum number is 100. - maximum: 100 - minimum: 1 - type: integer - maxUnavailablePercentage: - description: MaxUnavailablePercentage is the maximum percentage of nodes unavailable during a version update. This percentage of nodes will be updated in parallel, up to 100 nodes at once. - maximum: 100 - minimum: 1 - type: integer - type: object - type: object - status: - description: AWSManagedMachinePoolStatus defines the observed state of AWSManagedMachinePool. - properties: - conditions: - description: Conditions defines current service state of the managed machine pool - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachinePool's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - launchTemplateID: - description: The ID of the launch template - type: string - launchTemplateVersion: - description: The version of the launch template - type: string - ready: - default: false - description: Ready denotes that the AWSManagedMachinePool nodegroup has joined the cluster - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - required: - - ready - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: eksconfigs.bootstrap.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: bootstrap.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: EKSConfig - listKind: EKSConfigList - plural: eksconfigs - shortNames: - - eksc - singular: eksconfig - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Bootstrap configuration is ready - jsonPath: .status.ready - name: Ready - type: string - - description: Name of Secret containing bootstrap data - jsonPath: .status.dataSecretName - name: DataSecretName - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: EKSConfig is the schema for the Amazon EKS Machine Bootstrap Configuration API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: EKSConfigSpec defines the desired state of Amazon EKS Bootstrap Configuration. - properties: - apiRetryAttempts: - description: APIRetryAttempts is the number of retry attempts for AWS API call. - type: integer - containerRuntime: - description: ContainerRuntime specify the container runtime to use when bootstrapping EKS. - type: string - dnsClusterIP: - description: DNSClusterIP overrides the IP address to use for DNS queries within the cluster. - type: string - dockerConfigJson: - description: DockerConfigJson is used for the contents of the /etc/docker/daemon.json file. Useful if you want a custom config differing from the default one in the AMI. This is expected to be a json string. - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes the specified kubelet args into the Amazon EKS machine bootstrap script - type: object - pauseContainer: - description: PauseContainer allows customization of the pause container to use. - properties: - accountNumber: - description: AccountNumber is the AWS account number to pull the pause container from. - type: string - version: - description: Version is the tag of the pause container to use. - type: string - required: - - accountNumber - - version - type: object - serviceIPV6Cidr: - description: ServiceIPV6Cidr is the ipv6 cidr range of the cluster. If this is specified then the ip family will be set to ipv6. - type: string - useMaxPods: - description: UseMaxPods sets --max-pods for the kubelet when true. - type: boolean - type: object - status: - description: EKSConfigStatus defines the observed state of the Amazon EKS Bootstrap Configuration. - properties: - conditions: - description: Conditions defines current service state of the EKSConfig. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. - type: string - failureMessage: - description: FailureMessage will be set on non-retryable errors - type: string - failureReason: - description: FailureReason will be set on non-retryable errors - type: string - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - ready: - description: Ready indicates the BootstrapData secret is ready to be consumed - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Bootstrap configuration is ready - jsonPath: .status.ready - name: Ready - type: string - - description: Name of Secret containing bootstrap data - jsonPath: .status.dataSecretName - name: DataSecretName - type: string - name: v1beta2 - schema: - openAPIV3Schema: - description: EKSConfig is the schema for the Amazon EKS Machine Bootstrap Configuration API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: EKSConfigSpec defines the desired state of Amazon EKS Bootstrap Configuration. - properties: - apiRetryAttempts: - description: APIRetryAttempts is the number of retry attempts for AWS API call. - type: integer - boostrapCommandOverride: - description: BootstrapCommandOverride allows you to override the bootstrap command to use for EKS nodes. - type: string - containerRuntime: - description: ContainerRuntime specify the container runtime to use when bootstrapping EKS. - type: string - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - dnsClusterIP: - description: DNSClusterIP overrides the IP address to use for DNS queries within the cluster. - type: string - dockerConfigJson: - description: DockerConfigJson is used for the contents of the /etc/docker/daemon.json file. Useful if you want a custom config differing from the default one in the AMI. This is expected to be a json string. - type: string - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - append: - description: Append specifies whether to append Content to existing file if Path exists. - type: boolean - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes the specified kubelet args into the Amazon EKS machine bootstrap script - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - pauseContainer: - description: PauseContainer allows customization of the pause container to use. - properties: - accountNumber: - description: AccountNumber is the AWS account number to pull the pause container from. - type: string - version: - description: Version is the tag of the pause container to use. - type: string - required: - - accountNumber - - version - type: object - postBootstrapCommands: - description: PostBootstrapCommands specifies extra commands to run after bootstrapping nodes to the cluster - items: - type: string - type: array - preBootstrapCommands: - description: PreBootstrapCommands specifies extra commands to run before bootstrapping nodes to the cluster - items: - type: string - type: array - serviceIPV6Cidr: - description: ServiceIPV6Cidr is the ipv6 cidr range of the cluster. If this is specified then the ip family will be set to ipv6. - type: string - useMaxPods: - description: UseMaxPods sets --max-pods for the kubelet when true. - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the username - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of passwd to populate the passwd. - properties: - secret: - description: Secret represents a secret that should populate this password. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - type: object - status: - description: EKSConfigStatus defines the observed state of the Amazon EKS Bootstrap Configuration. - properties: - conditions: - description: Conditions defines current service state of the EKSConfig. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - dataSecretName: - description: DataSecretName is the name of the secret that stores the bootstrap data script. - type: string - failureMessage: - description: FailureMessage will be set on non-retryable errors - type: string - failureReason: - description: FailureReason will be set on non-retryable errors - type: string - observedGeneration: - description: ObservedGeneration is the latest generation observed by the controller. - format: int64 - type: integer - ready: - description: Ready indicates the BootstrapData secret is ready to be consumed - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - controller-gen.kubebuilder.io/version: v0.10.0 - labels: - cluster.x-k8s.io/provider: infrastructure-aws - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 - name: eksconfigtemplates.bootstrap.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capa-webhook-service - namespace: capa-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: bootstrap.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: EKSConfigTemplate - listKind: EKSConfigTemplateList - plural: eksconfigtemplates - shortNames: - - eksct - singular: eksconfigtemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: EKSConfigTemplate is the Amazon EKS Bootstrap Configuration Template API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: EKSConfigTemplateSpec defines the desired state of templated EKSConfig Amazon EKS Bootstrap Configuration resources. - properties: - template: - description: EKSConfigTemplateResource defines the Template structure. - properties: - spec: - description: EKSConfigSpec defines the desired state of Amazon EKS Bootstrap Configuration. - properties: - apiRetryAttempts: - description: APIRetryAttempts is the number of retry attempts for AWS API call. - type: integer - containerRuntime: - description: ContainerRuntime specify the container runtime to use when bootstrapping EKS. - type: string - dnsClusterIP: - description: DNSClusterIP overrides the IP address to use for DNS queries within the cluster. - type: string - dockerConfigJson: - description: DockerConfigJson is used for the contents of the /etc/docker/daemon.json file. Useful if you want a custom config differing from the default one in the AMI. This is expected to be a json string. - type: string - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes the specified kubelet args into the Amazon EKS machine bootstrap script - type: object - pauseContainer: - description: PauseContainer allows customization of the pause container to use. - properties: - accountNumber: - description: AccountNumber is the AWS account number to pull the pause container from. - type: string - version: - description: Version is the tag of the pause container to use. - type: string - required: - - accountNumber - - version - type: object - serviceIPV6Cidr: - description: ServiceIPV6Cidr is the ipv6 cidr range of the cluster. If this is specified then the ip family will be set to ipv6. - type: string - useMaxPods: - description: UseMaxPods sets --max-pods for the kubelet when true. - type: boolean - type: object - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1beta2 - schema: - openAPIV3Schema: - description: EKSConfigTemplate is the Amazon EKS Bootstrap Configuration Template API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: EKSConfigTemplateSpec defines the desired state of templated EKSConfig Amazon EKS Bootstrap Configuration resources. - properties: - template: - description: EKSConfigTemplateResource defines the Template structure. - properties: - spec: - description: EKSConfigSpec defines the desired state of Amazon EKS Bootstrap Configuration. - properties: - apiRetryAttempts: - description: APIRetryAttempts is the number of retry attempts for AWS API call. - type: integer - boostrapCommandOverride: - description: BootstrapCommandOverride allows you to override the bootstrap command to use for EKS nodes. - type: string - containerRuntime: - description: ContainerRuntime specify the container runtime to use when bootstrapping EKS. - type: string - diskSetup: - description: DiskSetup specifies options for the creation of partition tables and file systems on devices. - properties: - filesystems: - description: Filesystems specifies the list of file systems to setup. - items: - description: Filesystem defines the file systems to be created. - properties: - device: - description: Device specifies the device name - type: string - extraOpts: - description: ExtraOpts defined extra options to add to the command for creating the file system. - items: - type: string - type: array - filesystem: - description: Filesystem specifies the file system type. - type: string - label: - description: Label specifies the file system label to be used. If set to None, no label is used. - type: string - overwrite: - description: Overwrite defines whether or not to overwrite any existing filesystem. If true, any pre-existing file system will be destroyed. Use with Caution. - type: boolean - partition: - description: 'Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and , where NUM is the actual partition number.' - type: string - required: - - device - - filesystem - - label - type: object - type: array - partitions: - description: Partitions specifies the list of the partitions to setup. - items: - description: Partition defines how to create and layout a partition. - properties: - device: - description: Device is the name of the device. - type: string - layout: - description: Layout specifies the device layout. If it is true, a single partition will be created for the entire device. When layout is false, it means don't partition or ignore existing partitioning. - type: boolean - overwrite: - description: Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device. Use with caution. Default is 'false'. - type: boolean - tableType: - description: 'TableType specifies the tupe of partition table. The following are supported: ''mbr'': default and setups a MS-DOS partition table ''gpt'': setups a GPT partition table' - type: string - required: - - device - - layout - type: object - type: array - type: object - dnsClusterIP: - description: DNSClusterIP overrides the IP address to use for DNS queries within the cluster. - type: string - dockerConfigJson: - description: DockerConfigJson is used for the contents of the /etc/docker/daemon.json file. Useful if you want a custom config differing from the default one in the AMI. This is expected to be a json string. - type: string - files: - description: Files specifies extra files to be passed to user_data upon creation. - items: - description: File defines the input for generating write_files in cloud-init. - properties: - append: - description: Append specifies whether to append Content to existing file if Path exists. - type: boolean - content: - description: Content is the actual content of the file. - type: string - contentFrom: - description: ContentFrom is a referenced source of content to populate the file. - properties: - secret: - description: Secret represents a secret that should populate this file. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - encoding: - description: Encoding specifies the encoding of the file contents. - enum: - - base64 - - gzip - - gzip+base64 - type: string - owner: - description: Owner specifies the ownership of the file, e.g. "root:root". - type: string - path: - description: Path specifies the full path on disk where to store the file. - type: string - permissions: - description: Permissions specifies the permissions to assign to the file, e.g. "0640". - type: string - required: - - path - type: object - type: array - kubeletExtraArgs: - additionalProperties: - type: string - description: KubeletExtraArgs passes the specified kubelet args into the Amazon EKS machine bootstrap script - type: object - mounts: - description: Mounts specifies a list of mount points to be setup. - items: - description: MountPoints defines input for generated mounts in cloud-init. - items: - type: string - type: array - type: array - ntp: - description: NTP specifies NTP configuration - properties: - enabled: - description: Enabled specifies whether NTP should be enabled - type: boolean - servers: - description: Servers specifies which NTP servers to use - items: - type: string - type: array - type: object - pauseContainer: - description: PauseContainer allows customization of the pause container to use. - properties: - accountNumber: - description: AccountNumber is the AWS account number to pull the pause container from. - type: string - version: - description: Version is the tag of the pause container to use. - type: string - required: - - accountNumber - - version - type: object - postBootstrapCommands: - description: PostBootstrapCommands specifies extra commands to run after bootstrapping nodes to the cluster - items: - type: string - type: array - preBootstrapCommands: - description: PreBootstrapCommands specifies extra commands to run before bootstrapping nodes to the cluster - items: - type: string - type: array - serviceIPV6Cidr: - description: ServiceIPV6Cidr is the ipv6 cidr range of the cluster. If this is specified then the ip family will be set to ipv6. - type: string - useMaxPods: - description: UseMaxPods sets --max-pods for the kubelet when true. - type: boolean - users: - description: Users specifies extra users to add - items: - description: User defines the input for a generated user in cloud-init. - properties: - gecos: - description: Gecos specifies the gecos to use for the user - type: string - groups: - description: Groups specifies the additional groups for the user - type: string - homeDir: - description: HomeDir specifies the home directory to use for the user - type: string - inactive: - description: Inactive specifies whether to mark the user as inactive - type: boolean - lockPassword: - description: LockPassword specifies if password login should be disabled - type: boolean - name: - description: Name specifies the username - type: string - passwd: - description: Passwd specifies a hashed password for the user - type: string - passwdFrom: - description: PasswdFrom is a referenced source of passwd to populate the passwd. - properties: - secret: - description: Secret represents a secret that should populate this password. - properties: - key: - description: Key is the key in the secret's data map for this value. - type: string - name: - description: Name of the secret in the KubeadmBootstrapConfig's namespace to use. - type: string - required: - - key - - name - type: object - required: - - secret - type: object - primaryGroup: - description: PrimaryGroup specifies the primary group for the user - type: string - shell: - description: Shell specifies the user's shell - type: string - sshAuthorizedKeys: - description: SSHAuthorizedKeys specifies a list of ssh authorized keys for the user - items: - type: string - type: array - sudo: - description: Sudo specifies a sudo role for the user - type: string - required: - - name - type: object - type: array - type: object - type: object - required: - - template - type: object - type: object - served: true - storage: true ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - annotations: - ${AWS_CONTROLLER_IAM_ROLE/#arn/eks.amazonaws.com/role-arn: arn} - labels: - cluster.x-k8s.io/provider: infrastructure-aws - control-plane: controller-manager - name: capa-controller-manager - namespace: capa-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-leader-elect-role - namespace: capa-system -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-manager-role -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - bootstrap.cluster.x-k8s.io - resources: - - eksconfigs - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - bootstrap.cluster.x-k8s.io - resources: - - eksconfigs/status - verbs: - - get - - patch - - update -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - machinepools - - machines - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - - machinepools/status - verbs: - - get - - list - - patch - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/status - verbs: - - get - - list - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - awsmanagedcontrolplanes - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - awsmanagedcontrolplanes - - awsmanagedcontrolplanes/status - verbs: - - get - - list - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - awsmanagedcontrolplanes/status - verbs: - - get - - patch - - update -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsclustercontrolleridentities - verbs: - - create - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsclustercontrolleridentities - - awsclusterroleidentities - - awsclusterstaticidentities - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsclusterroleidentities - - awsclusterstaticidentities - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsfargateprofiles - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsfargateprofiles/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachinepools - - awsmachinepools/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachinepools/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachines - - awsmachines/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmachines/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedclusters - - awsmanagedclusters/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedmachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedmachinepools - - awsmanagedmachinepools/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - awsmanagedmachinepools/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-leader-elect-rolebinding - namespace: capa-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capa-leader-elect-role -subjects: -- kind: ServiceAccount - name: capa-controller-manager - namespace: capa-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capa-manager-role -subjects: -- kind: ServiceAccount - name: capa-controller-manager - namespace: capa-system ---- -apiVersion: v1 -data: - credentials: ${AWS_B64ENCODED_CREDENTIALS} -kind: Secret -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-manager-bootstrap-credentials - namespace: capa-system -type: Opaque ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-webhook-service - namespace: capa-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-aws ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - control-plane: capa-controller-manager - name: capa-controller-manager - namespace: capa-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-aws - control-plane: capa-controller-manager - template: - metadata: - annotations: - iam.amazonaws.com/role: ${AWS_CONTROLLER_IAM_ROLE:=""} - labels: - cluster.x-k8s.io/provider: infrastructure-aws - control-plane: capa-controller-manager - spec: - affinity: - nodeAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: ${K8S_CP_LABEL:=node-role.kubernetes.io/control-plane} - operator: Exists - weight: 10 - - preference: - matchExpressions: - - key: node-role.kubernetes.io/master - operator: Exists - weight: 10 - containers: - - args: - - --leader-elect - - --feature-gates=EKS=${CAPA_EKS:=true},EKSEnableIAM=${CAPA_EKS_IAM:=false},EKSAllowAddRoles=${CAPA_EKS_ADD_ROLES:=false},EKSFargate=${EXP_EKS_FARGATE:=false},MachinePool=${EXP_MACHINE_POOL:=false},EventBridgeInstanceState=${EVENT_BRIDGE_INSTANCE_STATE:=false},AutoControllerIdentityCreator=${AUTO_CONTROLLER_IDENTITY_CREATOR:=true},BootstrapFormatIgnition=${EXP_BOOTSTRAP_FORMAT_IGNITION:=false},ExternalResourceGC=${EXP_EXTERNAL_RESOURCE_GC:=true} - - --v=${CAPA_LOGLEVEL:=0} - - --metrics-bind-addr=127.0.0.1:8080 - env: - - name: AWS_SHARED_CREDENTIALS_FILE - value: /home/.aws/credentials - - name: HTTP_PROXY - value: ${TKG_HTTP_PROXY} - - name: HTTPS_PROXY - value: ${TKG_HTTPS_PROXY} - - name: NO_PROXY - value: ${TKG_NO_PROXY} - image: registry.tkg.vmware.run/cluster-api-aws/cluster-api-aws-controller:${CAPA_CONTROLLER_IMAGE_TAG} - imagePullPolicy: IfNotPresent - livenessProbe: - failureThreshold: 3 - httpGet: - path: /healthz - port: healthz - periodSeconds: 10 - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - - mountPath: /home/.aws - name: credentials - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - securityContext: - fsGroup: 1000 - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - serviceAccountName: capa-controller-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: capa-webhook-service-cert - - name: credentials - secret: - secretName: capa-manager-bootstrap-credentials ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-serving-cert - namespace: capa-system -spec: - dnsNames: - - capa-webhook-service.capa-system.svc - - capa-webhook-service.capa-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capa-selfsigned-issuer - secretName: capa-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-selfsigned-issuer - namespace: capa-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awscluster - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awscluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsclustercontrolleridentity - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsclustercontrolleridentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclustercontrolleridentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsclusterroleidentity - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsclusterroleidentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusterroleidentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsclusterstaticidentity - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsclusterstaticidentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusterstaticidentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsmachine - failurePolicy: Fail - name: mutation.awsmachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmachines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsfargateprofile - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsfargateprofile.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsfargateprofiles - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsmachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta2-awsmanagedmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsmanagedmachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmanagedmachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-bootstrap-cluster-x-k8s-io-v1beta2-eksconfig - failurePolicy: Fail - matchPolicy: Equivalent - name: default.eksconfigs.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - eksconfig - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-bootstrap-cluster-x-k8s-io-v1beta2-eksconfigtemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: default.eksconfigtemplates.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - eksconfigtemplate - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /mutate-controlplane-cluster-x-k8s-io-v1beta2-awsmanagedcontrolplane - failurePolicy: Fail - matchPolicy: Equivalent - name: default.awsmanagedcontrolplanes.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmanagedcontrolplanes - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capa-system/capa-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-aws - name: capa-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awscluster - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awscluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsclustercontrolleridentity - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsclustercontrolleridentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclustercontrolleridentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsclusterroleidentity - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsclusterroleidentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusterroleidentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsclusterstaticidentity - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsclusterstaticidentity.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclusterstaticidentities - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsmachine - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsmachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmachines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsfargateprofile - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsfargateprofile.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsfargateprofiles - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsmachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta2-awsmanagedmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsmanagedmachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmanagedmachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-bootstrap-cluster-x-k8s-io-v1beta2-eksconfig - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.eksconfigs.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - eksconfig - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-bootstrap-cluster-x-k8s-io-v1beta2-eksconfigtemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.eksconfigtemplates.bootstrap.cluster.x-k8s.io - rules: - - apiGroups: - - bootstrap.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - eksconfigtemplate - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capa-webhook-service - namespace: capa-system - path: /validate-controlplane-cluster-x-k8s-io-v1beta2-awsmanagedcontrolplane - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.awsmanagedcontrolplanes.controlplane.cluster.x-k8s.io - rules: - - apiGroups: - - controlplane.cluster.x-k8s.io - apiVersions: - - v1beta2 - operations: - - CREATE - - UPDATE - resources: - - awsmanagedcontrolplanes - sideEffects: None diff --git a/providers/infrastructure-aws/v2.0.2/metadata.yaml b/providers/infrastructure-aws/v2.0.2/metadata.yaml deleted file mode 100644 index b1482fc422..0000000000 --- a/providers/infrastructure-aws/v2.0.2/metadata.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -releaseSeries: -- major: 0 - minor: 4 - contract: v1alpha2 -- major: 0 - minor: 5 - contract: v1alpha3 -- major: 0 - minor: 6 - contract: v1alpha3 -- major: 0 - minor: 7 - contract: v1alpha4 -- major: 1 - minor: 0 - contract: v1beta1 -- major: 1 - minor: 1 - contract: v1beta1 -- major: 1 - minor: 2 - contract: v1beta1 -- major: 2 - minor: 0 - contract: v1beta1 diff --git a/providers/infrastructure-aws/v2.0.2/ytt/base-template.yaml b/providers/infrastructure-aws/v2.0.2/ytt/base-template.yaml deleted file mode 100644 index 2013a5eb30..0000000000 --- a/providers/infrastructure-aws/v2.0.2/ytt/base-template.yaml +++ /dev/null @@ -1,167 +0,0 @@ ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: "${CLUSTER_NAME}" - labels: - tkg.tanzu.vmware.com/cluster-name: '${ CLUSTER_NAME }' -spec: - clusterNetwork: - pods: - cidrBlocks: ["${CLUSTER_CIDR}"] - services: - cidrBlocks: ["${SERVICE_CIDR}"] - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSCluster - name: "${CLUSTER_NAME}" - controlPlaneRef: - kind: KubeadmControlPlane - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - name: "${CLUSTER_NAME}-control-plane" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSCluster -metadata: - name: "${CLUSTER_NAME}" -spec: - region: "${AWS_REGION}" - sshKeyName: "${AWS_SSH_KEY_NAME}" - bastion: - enabled: ${BASTION_HOST_ENABLED} - network: - vpc: - cidrBlock: '${AWS_VPC_CIDR}' - id: '${AWS_VPC_ID}' - subnets: - - availabilityZone: '${AWS_NODE_AZ}' - cidrBlock: '${AWS_PRIVATE_NODE_CIDR}' - id: '${AWS_PRIVATE_SUBNET_ID}' ---- -kind: KubeadmControlPlane -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -metadata: - name: "${CLUSTER_NAME}-control-plane" -spec: - replicas: ${CONTROL_PLANE_MACHINE_COUNT} - machineTemplate: - infrastructureRef: - kind: AWSMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - name: "${CLUSTER_NAME}-control-plane" - kubeadmConfigSpec: - useExperimentalRetryJoin: true - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - clusterConfiguration: - imageRepository: '${_TKG_K8S_IMAGE_REPOSITORY}' - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: '${_TKG_ETCD_IMAGE_REPOSITORY}' - imageTag: '${_TKG_ETCD_IMAGE_TAG}' - extraArgs: - cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - dns: - imageRepository: '${_TKG_COREDNS_IMAGE_REPOSITORY}' - imageTag: '${_TKG_COREDNS_IMAGE_TAG}' - apiServer: - timeoutForControlPlane: "8m0s" - extraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - controllerManager: - extraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - scheduler: - extraArgs: - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - version: "${KUBERNETES_VERSION}" ---- -kind: AWSMachineTemplate -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -metadata: - name: "${CLUSTER_NAME}-control-plane" -spec: - template: - spec: - instanceType: "${CONTROL_PLANE_MACHINE_TYPE}" - iamInstanceProfile: "control-plane.tkg.cloud.vmware.com" - sshKeyName: "${AWS_SSH_KEY_NAME}" - ami: - id: "${AWS_AMI_ID}" - rootVolume: - size: 80 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSMachineTemplate -metadata: - name: "${CLUSTER_NAME}-md-0" -spec: - template: - spec: - instanceType: "${NODE_MACHINE_TYPE}" - iamInstanceProfile: "nodes.tkg.cloud.vmware.com" - sshKeyName: "${AWS_SSH_KEY_NAME}" - ami: - id: "${AWS_AMI_ID}" - rootVolume: - size: 80 ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: "${CLUSTER_NAME}-md-0" -spec: - template: - spec: - useExperimentalRetryJoin: true - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - name: "${CLUSTER_NAME}-md-0" -spec: - clusterName: "${CLUSTER_NAME}" - replicas: ${WORKER_MACHINE_COUNT} - selector: - matchLabels: - strategy: - type: RollingUpdate - template: - metadata: - labels: - node-pool: "${CLUSTER_NAME}-worker-pool" - spec: - clusterName: "${CLUSTER_NAME}" - version: "${KUBERNETES_VERSION}" - bootstrap: - configRef: - name: "${CLUSTER_NAME}-md-0" - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - infrastructureRef: - name: "${CLUSTER_NAME}-md-0" - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - failureDomain: "${AWS_NODE_AZ}" diff --git a/providers/infrastructure-aws/v2.0.2/ytt/overlay.yaml b/providers/infrastructure-aws/v2.0.2/ytt/overlay.yaml deleted file mode 100644 index 46f5e77f66..0000000000 --- a/providers/infrastructure-aws/v2.0.2/ytt/overlay.yaml +++ /dev/null @@ -1,212 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_az_from_region", "verify_and_configure_machine_deployment_rollout_strategy") -#@ load("lib/validate.star", "validate_configuration") - -#@ validate_configuration("aws") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - -#@ default_az_0 = get_az_from_region(data.values.AWS_REGION, data.values.AWS_NODE_AZ, "a") - -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: #@ data.values.CLUSTER_NAME - labels: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - cluster-role.tkg.tanzu.vmware.com/(@= data.values.TKG_CLUSTER_ROLE @): "" - #@ end - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - #@overlay/match missing_ok=True - tanzuKubernetesRelease: #@ data.values.KUBERNETES_RELEASE -spec: - infrastructureRef: - name: #@ data.values.CLUSTER_NAME - controlPlaneRef: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - clusterNetwork: - #@ if data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - apiServerPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - pods: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.CLUSTER_CIDR - services: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.SERVICE_CIDR - -#@overlay/match by=overlay.subset({"kind":"AWSCluster"}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSCluster -metadata: - name: #@ data.values.CLUSTER_NAME -spec: - #@ if data.values.AWS_IDENTITY_REF_NAME != "": - #@overlay/match missing_ok=True - identityRef: - kind: #@ data.values.AWS_IDENTITY_REF_KIND or "AWSClusterRoleIdentity" - name: #@ data.values.AWS_IDENTITY_REF_NAME - #@ end - network: - #@ if data.values.AWS_SECURITY_GROUP_BASTION != "" or data.values.AWS_SECURITY_GROUP_CONTROLPLANE != "" or data.values.AWS_SECURITY_GROUP_APISERVER_LB != "" or data.values.AWS_SECURITY_GROUP_NODE != "" or data.values.AWS_SECURITY_GROUP_LB != "": - #@overlay/match missing_ok=True - securityGroupOverrides: - #@ if data.values.AWS_SECURITY_GROUP_BASTION != "": - #@overlay/match missing_ok=True - bastion: #@ data.values.AWS_SECURITY_GROUP_BASTION - #@ end - #@ if data.values.AWS_SECURITY_GROUP_CONTROLPLANE != "": - #@overlay/match missing_ok=True - controlplane: #@ data.values.AWS_SECURITY_GROUP_CONTROLPLANE - #@ end - #@ if data.values.AWS_SECURITY_GROUP_APISERVER_LB != "": - #@overlay/match missing_ok=True - apiserver-lb: #@ data.values.AWS_SECURITY_GROUP_APISERVER_LB - #@ end - #@ if data.values.AWS_SECURITY_GROUP_NODE != "": - #@overlay/match missing_ok=True - node: #@ data.values.AWS_SECURITY_GROUP_NODE - #@ end - #@ if data.values.AWS_SECURITY_GROUP_LB != "": - #@overlay/match missing_ok=True - lb: #@ data.values.AWS_SECURITY_GROUP_LB - #@ end - #@ end - -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -kind: KubeadmControlPlane -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -metadata: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) -spec: - replicas: #@ data.values.CONTROL_PLANE_MACHINE_COUNT - machineTemplate: - infrastructureRef: - kind: AWSMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - kubeadmConfigSpec: - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws - clusterConfiguration: - apiServer: - extraArgs: - cloud-provider: aws - controllerManager: - extraArgs: - cloud-provider: aws - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.imageRepository) - etcd: - local: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local.imageRepository) - imageTag: #@ bomDataForK8sVersion.kubeadmConfigSpec.etcd.local.imageTag - #@ if getattr(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local, "extraArgs", None) != None: - #@overlay/match missing_ok=True - extraArgs: - #@ for key in bomDataForK8sVersion.kubeadmConfigSpec.etcd.local["extraArgs"]: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - (@= key @): #@ "{}".format(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local["extraArgs"][key]).lower() - #@ end - #@ end - dns: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.dns.imageRepository) - imageTag: #@ bomDataForK8sVersion.kubeadmConfigSpec.dns.imageTag - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws - version: #@ data.values.KUBERNETES_VERSION -#@overlay/match by=overlay.subset({"kind": "AWSMachineTemplate", "metadata":{"name": "${CLUSTER_NAME}-control-plane"}}) ---- -kind: AWSMachineTemplate -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -metadata: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - instanceType: #@ data.values.CONTROL_PLANE_MACHINE_TYPE - iamInstanceProfile: "control-plane.tkg.cloud.vmware.com" - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - ami: - id: #@ data.values.AWS_AMI_ID - rootVolume: - size: #@ int(data.values.AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB) or 80 -#@overlay/match by=overlay.subset({"kind": "AWSMachineTemplate", "metadata":{"name": "${CLUSTER_NAME}-md-0"}}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSMachineTemplate -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - instanceType: #@ data.values.NODE_MACHINE_TYPE - iamInstanceProfile: "nodes.tkg.cloud.vmware.com" - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - ami: - id: #@ data.values.AWS_AMI_ID - rootVolume: - size: #@ int(data.values.AWS_NODE_OS_DISK_SIZE_GIB) or 80 -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate", "metadata":{"name": "${CLUSTER_NAME}-md-0"}}) ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws -#@overlay/match by=overlay.subset({"kind":"MachineDeployment", "metadata":{"name": "${CLUSTER_NAME}-md-0"}}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT_0 - selector: - matchLabels: null - strategy: - type: #@ verify_and_configure_machine_deployment_rollout_strategy(data.values.WORKER_ROLLOUT_STRATEGY) - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - clusterName: #@ data.values.CLUSTER_NAME - version: #@ data.values.KUBERNETES_VERSION - bootstrap: - configRef: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - infrastructureRef: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - failureDomain: #@ default_az_0 diff --git a/providers/infrastructure-aws/v2.0.2/yttcc/base-template.yaml b/providers/infrastructure-aws/v2.0.2/yttcc/base-template.yaml deleted file mode 100644 index 77f5d4a77b..0000000000 --- a/providers/infrastructure-aws/v2.0.2/yttcc/base-template.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: ${CLUSTER_NAME} - labels: - tkg.tanzu.vmware.com/cluster-name: '${ CLUSTER_NAME }' - annotations: - run.tanzu.vmware.com/resolve-tkr: "" -spec: - clusterNetwork: - pods: - cidrBlocks: ["${CLUSTER_CIDR}"] - services: - cidrBlocks: ["${SERVICE_CIDR}"] - topology: - class: tkg-cluster-class-dev - version: v1.21.2 - controlPlane: - replicas: ${CONTROL_PLANE_MACHINE_COUNT} - metadata: - annotations: - workers: - machineDeployments: - - class: tkg-worker - name: tkg-worker-pool - replicas: ${WORKER_MACHINE_COUNT} - metadata: - annotations: - variables: diff --git a/providers/infrastructure-aws/v2.0.2/yttcc/overlay.yaml b/providers/infrastructure-aws/v2.0.2/yttcc/overlay.yaml deleted file mode 100644 index 60e9051af9..0000000000 --- a/providers/infrastructure-aws/v2.0.2/yttcc/overlay.yaml +++ /dev/null @@ -1,116 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_az_from_region", "get_default_tkg_bom_data","get_tkr_version_from_tkr_name") -#@ load("lib/validate.star", "validate_configuration") -#@ load("/lib/config_variable_association.star", "config_variable_association", "get_cluster_variables", "get_aws_vars") - -#@ validate_configuration("aws") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - -#@ default_az_0 = get_az_from_region(data.values.AWS_REGION, data.values.AWS_NODE_AZ, "a") -#@ default_az_1 = get_az_from_region(data.values.AWS_REGION, data.values.AWS_NODE_AZ_1, "b") -#@ default_az_2 = get_az_from_region(data.values.AWS_REGION, data.values.AWS_NODE_AZ_2, "c") - -#@ def get_k8s_version_from_tkr(tkr_version): -#@ return tkr_version.split('+')[0] -#@ end - -#@ bomData = get_default_tkg_bom_data() - -#@ tkrVersion = get_tkr_version_from_tkr_name(data.values.KUBERNETES_RELEASE) - -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: #@ data.values.CLUSTER_NAME - labels: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - cluster-role.tkg.tanzu.vmware.com/(@= data.values.TKG_CLUSTER_ROLE @): "" - #@ end - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME -spec: - clusterNetwork: - #@ if data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - apiServerPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - pods: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.CLUSTER_CIDR - services: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.SERVICE_CIDR - topology: - class: #@ data.values.CLUSTER_CLASS - version: #@ tkrVersion - controlPlane: - replicas: #@ data.values.CONTROL_PLANE_MACHINE_COUNT - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: #@ "ami-region={},os-name={},os-arch={}".format(data.values.AWS_REGION, data.values.OS_NAME, data.values.OS_ARCH) - workers: - machineDeployments: - #@overlay/match by=overlay.index(0) - - class: tkg-worker - name: md-0 - replicas: #@ data.values.WORKER_MACHINE_COUNT_0 - #@overlay/match missing_ok=True - failureDomain: #@ default_az_0 - metadata: - annotations: - #! VVV TODO(tenczar) os-version handling (also handle empty values?) - run.tanzu.vmware.com/resolve-os-image: #@ "ami-region={},os-name={},os-arch={}".format(data.values.AWS_REGION, data.values.OS_NAME, data.values.OS_ARCH) - #@ if data.values.CLUSTER_PLAN == "prodcc": - #@overlay/append - - class: tkg-worker - name: md-1 - replicas: #@ data.values.WORKER_MACHINE_COUNT_1 - failureDomain: #@ default_az_1 - metadata: - annotations: - #! VVV TODO(tenczar) os-version handling (also handle empty values?) - run.tanzu.vmware.com/resolve-os-image: #@ "ami-region={},os-name={},os-arch={}".format(data.values.AWS_REGION, data.values.OS_NAME, data.values.OS_ARCH) - #@ if data.values.NODE_MACHINE_TYPE_1: - variables: - overrides: - - name: worker - value: - instanceType: #@ data.values.NODE_MACHINE_TYPE_1 - rootVolume: - sizeGiB: #@ data.values.AWS_NODE_OS_DISK_SIZE_GIB - #@ end - #@overlay/append - - class: tkg-worker - name: md-2 - replicas: #@ data.values.WORKER_MACHINE_COUNT_2 - failureDomain: #@ default_az_2 - metadata: - annotations: - #! VVV TODO(tenczar) os-version handling (also handle empty values?) - run.tanzu.vmware.com/resolve-os-image: #@ "ami-region={},os-name={},os-arch={}".format(data.values.AWS_REGION, data.values.OS_NAME, data.values.OS_ARCH) - #@ if data.values.NODE_MACHINE_TYPE_2: - variables: - overrides: - - name: worker - value: - instanceType: #@ data.values.NODE_MACHINE_TYPE_2 - rootVolume: - sizeGiB: #@ data.values.AWS_NODE_OS_DISK_SIZE_GIB - #@ end - #@ end - #@overlay/match missing_ok=True - variables: - #@ vars = get_aws_vars() - #@ for configVariable in vars: - #@ if vars[configVariable] != None and configVariable in ["additionalImageRegistries","workerKubeletExtraArgs","controlPlaneKubeletExtraArgs","kubeControllerManagerExtraArgs","kubeSchedulerExtraArgs","apiServerExtraArgs","etcdExtraArgs", "region", "sshKeyName", "bastion", "network", "controlPlane", "worker", "loadBalancerSchemeInternal", "identityRef", "imageRepository", "trust", "auditLogging", "cni", "TKR_DATA", "proxy", "controlPlaneCertificateRotation", "podSecurityStandard", "eventRateLimitConf"]: - - name: #@ configVariable - value: #@ vars[configVariable] - #@ end - #@ end diff --git a/providers/infrastructure-aws/ytt/aws-overlay.yaml b/providers/infrastructure-aws/ytt/aws-overlay.yaml deleted file mode 100644 index d2c7d5212b..0000000000 --- a/providers/infrastructure-aws/ytt/aws-overlay.yaml +++ /dev/null @@ -1,203 +0,0 @@ -#! Please add any overlays specific to AWS provider under this file. -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_az_from_region") - -#@ default_az_0 = get_az_from_region(data.values.AWS_REGION, data.values.AWS_NODE_AZ, "a") -#@ default_az_1 = get_az_from_region(data.values.AWS_REGION, data.values.AWS_NODE_AZ_1, "b") -#@ default_az_2 = get_az_from_region(data.values.AWS_REGION, data.values.AWS_NODE_AZ_2, "c") - -#@ bomData = get_bom_data_for_tkr_name() - -#@overlay/match by=overlay.subset({"kind":"AWSCluster"}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSCluster -metadata: - name: #@ data.values.CLUSTER_NAME -spec: - region: #@ data.values.AWS_REGION - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - bastion: - enabled: #@ data.values.BASTION_HOST_ENABLED - #@ if data.values.AWS_LOAD_BALANCER_SCHEME_INTERNAL == True: - #@overlay/match missing_ok=True - controlPlaneLoadBalancer: - #@overlay/match missing_ok=True - scheme: "internal" - #@ end - network: - vpc: - cidrBlock: #@ data.values.AWS_VPC_CIDR - id: #@ data.values.AWS_VPC_ID - subnets: - #@ if data.values.AWS_VPC_ID != "" and data.values.AWS_PUBLIC_SUBNET_ID != "": - #@overlay/append - - availabilityZone: #@ default_az_0 - cidrBlock: #@ data.values.AWS_PUBLIC_NODE_CIDR - isPublic: true - id: #@ data.values.AWS_PUBLIC_SUBNET_ID - #@ end - #@ if data.values.AWS_VPC_ID != "" and data.values.AWS_PRIVATE_SUBNET_ID != "": - #@overlay/match by=overlay.index(0) - #@overlay/replace - - availabilityZone: #@ default_az_0 - cidrBlock: #@ data.values.AWS_PRIVATE_NODE_CIDR - id: #@ data.values.AWS_PRIVATE_SUBNET_ID - #@ end - -#@ if data.values.CLUSTER_PLAN == "prod": -#@overlay/match by=overlay.subset({"kind":"AWSCluster"}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSCluster -spec: - network: - subnets: - #@ if data.values.AWS_VPC_ID != "" and data.values.AWS_PUBLIC_SUBNET_ID_1 != "": - #@overlay/append - - availabilityZone: #@ default_az_1 - cidrBlock: #@ data.values.AWS_PUBLIC_NODE_CIDR_1 - isPublic: true - id: #@ data.values.AWS_PUBLIC_SUBNET_ID_1 - #@ end - #@ if data.values.AWS_VPC_ID != "" and data.values.AWS_PRIVATE_SUBNET_ID_1 != "": - #@overlay/append - - availabilityZone: #@ default_az_1 - cidrBlock: #@ data.values.AWS_PRIVATE_NODE_CIDR_1 - id: #@ data.values.AWS_PRIVATE_SUBNET_ID_1 - #@ end - #@ if data.values.AWS_VPC_ID != "" and data.values.AWS_PUBLIC_SUBNET_ID_2 != "": - #@overlay/append - - availabilityZone: #@ default_az_2 - cidrBlock: #@ data.values.AWS_PUBLIC_NODE_CIDR_2 - isPublic: true - id: #@ data.values.AWS_PUBLIC_SUBNET_ID_2 - #@ end - #@ if data.values.AWS_VPC_ID != "" and data.values.AWS_PRIVATE_SUBNET_ID_2 != "": - #@overlay/append - - availabilityZone: #@ default_az_2 - cidrBlock: #@ data.values.AWS_PRIVATE_NODE_CIDR_2 - id: #@ data.values.AWS_PRIVATE_SUBNET_ID_2 - #@ end ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT_1 - selector: - matchLabels: null - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - clusterName: #@ data.values.CLUSTER_NAME - version: #@ data.values.KUBERNETES_VERSION - bootstrap: - configRef: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - infrastructureRef: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - failureDomain: #@ default_az_1 ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT_2 - selector: - matchLabels: null - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - clusterName: #@ data.values.CLUSTER_NAME - version: #@ data.values.KUBERNETES_VERSION - bootstrap: - configRef: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - infrastructureRef: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) - apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 - kind: AWSMachineTemplate - failureDomain: #@ default_az_2 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSMachineTemplate -metadata: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - #@ if data.values.NODE_MACHINE_TYPE_1 != "": - instanceType: #@ data.values.NODE_MACHINE_TYPE_1 - #@ else: - instanceType: #@ data.values.NODE_MACHINE_TYPE - #@ end - iamInstanceProfile: "nodes.tkg.cloud.vmware.com" - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - ami: - id: #@ data.values.AWS_AMI_ID - rootVolume: - size: #@ int(data.values.AWS_NODE_OS_DISK_SIZE_GIB) or 80 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta2 -kind: AWSMachineTemplate -metadata: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - #@ if data.values.NODE_MACHINE_TYPE_2 != "": - instanceType: #@ data.values.NODE_MACHINE_TYPE_2 - #@ else: - instanceType: #@ data.values.NODE_MACHINE_TYPE - #@ end - iamInstanceProfile: "nodes.tkg.cloud.vmware.com" - sshKeyName: #@ data.values.AWS_SSH_KEY_NAME - ami: - id: #@ data.values.AWS_AMI_ID - rootVolume: - size: #@ int(data.values.AWS_NODE_OS_DISK_SIZE_GIB) or 80 ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws -#@ end diff --git a/providers/infrastructure-aws/yttcc/aws-overlay.yaml b/providers/infrastructure-aws/yttcc/aws-overlay.yaml deleted file mode 100644 index 9913c70412..0000000000 --- a/providers/infrastructure-aws/yttcc/aws-overlay.yaml +++ /dev/null @@ -1,11 +0,0 @@ -#! Please add any overlays specific to AWS provider under this file. -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_az_from_region") - -#@ default_az_0 = get_az_from_region(data.values.AWS_REGION, data.values.AWS_NODE_AZ, "a") -#@ default_az_1 = get_az_from_region(data.values.AWS_REGION, data.values.AWS_NODE_AZ_1, "b") -#@ default_az_2 = get_az_from_region(data.values.AWS_REGION, data.values.AWS_NODE_AZ_2, "c") - -#@ bomData = get_bom_data_for_tkr_name() - diff --git a/providers/infrastructure-azure/v1.6.3/cconly/base.yaml b/providers/infrastructure-azure/v1.6.3/cconly/base.yaml deleted file mode 100644 index e48986dc4a..0000000000 --- a/providers/infrastructure-azure/v1.6.3/cconly/base.yaml +++ /dev/null @@ -1,1887 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - name: #@ "tkg-azure-default-{}".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - annotations: - run.tanzu.vmware.com/resolve-tkr: "" -spec: - controlPlane: - ref: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - name: #@ "tkg-azure-default-{}-kcp".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - machineInfrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - name: #@ "tkg-azure-default-{}-control-plane".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - workers: - machineDeployments: - - class: tkg-worker - template: - bootstrap: - ref: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: #@ "tkg-azure-default-{}-md-config".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - name: #@ "tkg-azure-default-{}-worker".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - name: #@ "tkg-azure-default-{}-cluster".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - variables: - - name: etcdExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: apiServerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeSchedulerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeControllerManagerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: controlPlaneKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: workerKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: tlsCipherSuites - required: false - schema: - openAPIV3Schema: - type: string - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - - name: location - required: true - schema: - openAPIV3Schema: - type: string - - name: resourceGroup - required: false - schema: - openAPIV3Schema: - type: string - - name: subscriptionID - required: true - schema: - openAPIV3Schema: - type: string - - name: identityRef - required: false - schema: - openAPIV3Schema: - type: object - properties: - name: - type: string - default: '' - namespace: - type: string - default: default - default: - namespace: default - - name: environment - required: false - schema: - openAPIV3Schema: - type: string - default: AzurePublicCloud - - name: sshPublicKey - required: true - schema: - openAPIV3Schema: - type: string - format: base64 - - name: acceleratedNetworking - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: true - required: - - enabled - default: - enabled: true - - name: privateCluster - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: false - required: - - enabled - default: - enabled: false - - name: frontendPrivateIP - required: false - schema: - openAPIV3Schema: - type: string - default: 10.0.0.10 - - name: apiServerPort - required: false - schema: - openAPIV3Schema: - type: integer - - name: network - required: true - schema: - openAPIV3Schema: - type: object - properties: - vnet: - type: object - properties: - name: - type: string - cidrBlocks: - type: array - items: - type: string - format: cidr - resourceGroup: - type: string - required: - - cidrBlocks - required: - - vnet - - name: proxy - required: false - schema: - openAPIV3Schema: - type: object - properties: - httpProxy: - type: string - httpsProxy: - type: string - noProxy: - type: array - items: - type: string - default: [] - required: - - httpProxy - - httpsProxy - - name: clusterRole - required: true - schema: - openAPIV3Schema: - type: string - - name: controlPlane - required: false - schema: - openAPIV3Schema: - type: object - properties: - vmSize: - type: string - default: Standard_D2s_v3 - osDisk: - type: object - properties: - storageAccountType: - type: string - default: Premium_LRS - sizeGiB: - type: integer - default: 128 - dataDisk: - type: object - properties: - sizeGiB: - type: integer - default: 256 - subnet: - type: object - properties: - name: - type: string - cidr: - type: string - default: 10.0.0.0/24 - securityGroup: - type: string - outboundLB: - type: object - properties: - enabled: - type: boolean - default: false - frontendIPCount: - type: integer - default: 1 - nodeLabels: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: worker - required: false - schema: - openAPIV3Schema: - type: object - properties: - vmSize: - type: string - default: Standard_D2s_v3 - osDisk: - type: object - properties: - storageAccountType: - type: string - default: Premium_LRS - sizeGiB: - type: integer - default: 128 - dataDisks: - type: array - items: - type: object - properties: - sizeGiB: - type: integer - default: 256 - default: [] - subnet: - type: object - properties: - name: - type: string - cidr: - type: string - format: cidr - default: 10.0.1.0/24 - securityGroup: - type: string - outboundLB: - type: object - properties: - enabled: - type: boolean - default: false - frontendIPCount: - type: integer - default: 1 - idleTimeoutInMinutes: - type: integer - default: 4 - - name: imageRepository - required: false - schema: - openAPIV3Schema: - type: object - properties: - host: - type: string - tlsCertificateValidation: - type: boolean - default: true - - name: trust - required: false - schema: - openAPIV3Schema: - type: object - properties: - additionalTrustedCAs: - type: array - items: - type: object - properties: - name: - type: string - data: - type: string - required: - - name - - data - - name: additionalImageRegistries - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - required: - - host - properties: - host: - type: string - skipTlsVerify: - type: boolean - default: false - caCert: - type: string - - name: auditLogging - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: false - required: - - enabled - default: - enabled: false - - name: customTags - required: false - schema: - openAPIV3Schema: - type: string - default: "" - - name: nodePoolLabels - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: TKR_DATA - required: false - schema: - openAPIV3Schema: - type: object - properties: {} - - name: controlPlaneCertificateRotation - required: false - schema: - openAPIV3Schema: - type: object - properties: - activate: - type: boolean - default: true - daysBefore: - type: integer - format: int32 - minimum: 7 - default: 90 - default: - activate: true - daysBefore: 90 - patches: - - name: etcdExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containQuotaBackendBytes := false }} - {{- range $key, $val := .etcdExtraArgs }} - {{- if eq $key "cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "quota-backend-bytes" }} - {{- $containQuotaBackendBytes = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containQuotaBackendBytes }} - quota-backend-bytes: "8589934592" - {{- end }} - - name: kubeControllerManagerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containAllocateNodeCidrs := false }} - {{ $containCloudConfig := false }} - {{ $containCloudProvider := false }} - {{ $containClusterName := false }} - {{- range $key, $val := .kubeControllerManagerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "allocate-node-cidrs" }} - {{- $containAllocateNodeCidrs = true }} - {{- end }} - {{- if eq $key "cloud-config" }} - {{- $containCloudConfig = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "cluster-name" }} - {{- $containClusterName = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containAllocateNodeCidrs }} - allocate-node-cidrs: "true" - {{- end }} - {{- if not $containCloudConfig }} - cloud-config: /etc/kubernetes/azure.json - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: azure - {{- end }} - {{- if not $containClusterName }} - cluster-name: ${CLUSTER_NAME} - {{- end }} - - name: apiServerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudConfig := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-config" }} - {{- $containCloudConfig = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudConfig }} - cloud-config: /etc/kubernetes/azure.json - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: azure - {{- end }} - - name: kubeSchedulerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/scheduler/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .kubeSchedulerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: controlPlaneKubeletExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudConfig := false }} - {{ $containCloudProvider := false }} - {{ $containContainerRegistConf := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-config" }} - {{- $containCloudConfig = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "azure-container-registry-config" }} - {{- $containContainerRegistConf = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudConfig }} - cloud-config: /etc/kubernetes/azure.json - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: azure - {{- end }} - {{- if not $containContainerRegistConf }} - azure-container-registry-config: /etc/kubernetes/azure.json - {{- end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudConfig := false }} - {{ $containCloudProvider := false }} - {{ $containContainerRegistConf := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-config" }} - {{- $containCloudConfig = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "azure-container-registry-config" }} - {{- $containContainerRegistConf = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudConfig }} - cloud-config: /etc/kubernetes/azure.json - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: azure - {{- end }} - {{- if not $containContainerRegistConf }} - azure-container-registry-config: /etc/kubernetes/azure.json - {{- end }} - - name: workerKubeletExtraArgs - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudConfig := false }} - {{ $containCloudProvider := false }} - {{ $containContainerRegistConf := false }} - {{- range $key, $val := .workerKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-config" }} - {{- $containCloudConfig = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "azure-container-registry-config" }} - {{- $containContainerRegistConf = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudConfig }} - cloud-config: /etc/kubernetes/azure.json - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: azure - {{- end }} - {{- if not $containContainerRegistConf }} - azure-container-registry-config: /etc/kubernetes/azure.json - {{- end }} - - name: AzureClusterCustomTags - enabledIf: '{{ not (empty .customTags) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/additionalTags - valueFrom: - template: | - {{ $azureTags := split "," .customTags }} {{- range $azureTag := $azureTags }} {{- $azureTag = trim $azureTag}} {{- $azureTagSplit := split "=" $azureTag }} {{- $azureTagSplit._0 -}} : {{ $azureTagSplit._1 }} - {{ end }} - - name: AzureClusterIdentityRef - enabledIf: '{{ (not (empty .identityRef.name)) | or (.clusterRole | eq "management") }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/identityRef - valueFrom: - template: | - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterIdentity - name: {{.builtin.cluster.name}}-identity - namespace: tkg-system - - name: AzureClusterIdentityName - enabledIf: '{{ with .identityRef }} {{- all .name .namespace }} {{- else -}} false {{- end }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: replace - path: /spec/template/spec/identityRef/name - valueFrom: - variable: identityRef.name - - op: replace - path: /spec/template/spec/identityRef/namespace - valueFrom: - variable: identityRef.namespace - - name: ACT_main - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: replace - path: /spec/template/spec/azureEnvironment - valueFrom: - variable: environment - - op: replace - path: /spec/template/spec/location - valueFrom: - variable: location - - op: replace - path: /spec/template/spec/networkSpec/vnet - valueFrom: - template: | - name: {{ if .network.vnet.name }} {{- .network.vnet.name }} {{- else }} {{- .builtin.cluster.name -}} -vnet {{- end }} - resourceGroup: {{ if .network.vnet.resourceGroup }} {{- .network.vnet.resourceGroup }} {{- else if .resourceGroup }} {{- .resourceGroup }} {{- else }} {{- .builtin.cluster.name }} {{- end }} - cidrBlocks: - {{ range .network.vnet.cidrBlocks -}} - - {{ . }} - {{- end }} - - op: add - path: /spec/template/spec/resourceGroup - valueFrom: - template: | - {{ if .resourceGroup }} {{- .resourceGroup }} {{- else }} {{- .builtin.cluster.name }} {{- end }} - - op: replace - path: /spec/template/spec/subscriptionID - valueFrom: - variable: subscriptionID - - op: replace - path: /spec/template/spec/networkSpec/subnets - valueFrom: - template: | - - name: '{{ .controlPlane.subnet.name | default "management-cluster-controlplane-subnet" }}' - role: control-plane - cidrBlocks: [ {{- .controlPlane.subnet.cidr -}} ] - {{ if .controlPlane.subnet.securityGroup -}} securityGroup: {{ .controlPlane.subnet.securityGroup }} {{- end }} - - name: '{{ .worker.subnet.name | default "management-cluster-node-subnet" }}' - role: node - cidrBlocks: [ {{- .worker.subnet.cidr -}} ] - {{ if .worker.subnet.securityGroup -}} securityGroup: {{ .worker.subnet.securityGroup }} {{- end }} - - name: AMT_ControlPlane_Main - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/sshPublicKey - valueFrom: - variable: sshPublicKey - - op: replace - path: /spec/template/spec/vmSize - valueFrom: - variable: controlPlane.vmSize - - op: add - path: /spec/template/spec/acceleratedNetworking - valueFrom: - variable: acceleratedNetworking.enabled - - op: replace - path: /spec/template/spec/dataDisks - valueFrom: - template: | - {{ range .controlPlane.dataDisks }} - - diskSizeGB: {{ .sizeGiB }} - lun: 0 - nameSuffix: etcddisk - {{- end }} - - op: replace - path: /spec/template/spec/osDisk - valueFrom: - template: | - osType: Linux - diskSizeGB: {{ .controlPlane.osDisk.sizeGiB }} - managedDisk: - storageAccountType: {{ .controlPlane.osDisk.storageAccountType }} - - op: add - path: /spec/template/spec/image - valueFrom: - template: | - {{- $osImageRef := (index .TKR_DATA .builtin.controlPlane.version).osImageRef -}} - {{- if index $osImageRef "gallery" }} - sharedGallery: - resourceGroup: {{ index $osImageRef "resourceGroup" }} - name: {{ index $osImageRef "name" }} - subscriptionID: {{ index $osImageRef "subscriptionID" }} - gallery: {{ index $osImageRef "gallery" }} - version: {{ index $osImageRef "version" }} - {{- end }} - {{- if index $osImageRef "sku" }} - marketplace: - sku: {{ index $osImageRef "sku" }} - publisher: {{ index $osImageRef "publisher" }} - offer: {{ index $osImageRef "offer" }} - version: {{ index $osImageRef "version" }} - thirdPartyImage: {{ index $osImageRef "thirdPartyImage" }} - {{- end -}} - - name: KCPT_ControlPlane_Main - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - contentFrom: - secret: - key: control-plane-azure.json - name: {{ .builtin.controlPlane.machineTemplate.infrastructureRef.name -}} -azure-json - owner: root:root - path: /etc/kubernetes/azure.json - permissions: "0644" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.etcd.imageTag }}' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.coredns.imageTag }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs/cluster-name - valueFrom: - template: '{{ .builtin.cluster.name }}' - - name: cloudConfigVolume - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: cloud-config - hostPath: /etc/kubernetes/azure.json - mountPath: /etc/kubernetes/azure.json - readOnly: true - - name: apiServerBindPort - enabledIf: '{{ not (empty .apiServerPort) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/localAPIEndpoint - valueFrom: - template: | - advertiseAddress: '0.0.0.0' - bindPort: {{ .apiServerPort }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/controlPlane - valueFrom: - template: | - localAPIEndpoint: - advertiseAddress: '0.0.0.0' - bindPort: {{ .apiServerPort }} - - name: AMT_MachineDeployment_Main - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: replace - path: "/spec/template/spec/sshPublicKey" - valueFrom: - variable: sshPublicKey - - op: replace - path: /spec/template/spec/vmSize - valueFrom: - variable: worker.vmSize - - op: add - path: /spec/template/spec/acceleratedNetworking - valueFrom: - variable: acceleratedNetworking.enabled - - op: replace - path: /spec/template/spec/osDisk - valueFrom: - template: | - osType: Linux - diskSizeGB: {{ .worker.osDisk.sizeGiB }} - managedDisk: - storageAccountType: {{ .worker.osDisk.storageAccountType }} - - op: add - path: /spec/template/spec/image - valueFrom: - template: | - {{- $osImageRef := (index .TKR_DATA .builtin.machineDeployment.version).osImageRef -}} - {{- if index $osImageRef "gallery" }} - sharedGallery: - resourceGroup: {{ index $osImageRef "resourceGroup" }} - name: {{ index $osImageRef "name" }} - subscriptionID: {{ index $osImageRef "subscriptionID" }} - gallery: {{ index $osImageRef "gallery" }} - version: {{ index $osImageRef "version" }} - {{- end }} - {{- if index $osImageRef "sku" }} - marketplace: - sku: {{ index $osImageRef "sku" }} - publisher: {{ index $osImageRef "publisher" }} - offer: {{ index $osImageRef "offer" }} - version: {{ index $osImageRef "version" }} - thirdPartyImage: {{ index $osImageRef "thirdPartyImage" }} - {{- end -}} - - name: KCT_Worker_Main - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - contentFrom: - secret: - key: worker-node-azure.json - name: {{ .builtin.machineDeployment.infrastructureRef.name -}} -azure-json - owner: root:root - path: /etc/kubernetes/azure.json - permissions: "0644" - - name: enableNodeDataDisk - enabledIf: '{{ gt (.worker.dataDisks | len) 0 }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: "/spec/template/spec/dataDisks" - valueFrom: - template: | - {{ range .worker.dataDisks -}} - - diskSizeGB: {{ .sizeGiB }} - lun: 0 - nameSuffix: nodedisk - {{- end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/diskSetup - valueFrom: - template: | - filesystems: - - device: /dev/disk/azure/scsi1/lun0 - extraOpts: - - -E - - lazy_itable_init=1,lazy_journal_init=1 - filesystem: ext4 - label: node_disk - partitions: - - device: /dev/disk/azure/scsi1/lun0 - layout: true - overwrite: false - tableType: gpt - - op: add - path: /spec/template/spec/mounts - valueFrom: - template: | - - - LABEL=node_disk - - /var/lib/nodedisk - - name: ACT_EnablePrivateCluster - enabledIf: '{{ .privateCluster.enabled }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/networkSpec/apiServerLB - valueFrom: - template: | - type: Internal - frontendIPs: - - name: lb- {{- .builtin.cluster.name -}} -ip-frontend - privateIP: {{ .frontendPrivateIP }} - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands - valueFrom: - template: | - - "if [ -f /tmp/kubeadm.yaml ] || [ -f /run/kubeadm/kubeadm.yaml ]; then echo '127.0.0.1 apiserver. {{- .builtin.cluster.name -}} .capz.io apiserver' >> /etc/hosts; fi" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/postKubeadmCommands - valueFrom: - template: | - - "if [ -f /tmp/kubeadm-join-config.yaml ] || [ -f /run/kubeadm/kubeadm-join-config.yaml ]; then echo '127.0.0.1 apiserver. {{- .builtin.cluster.name -}} .capz.io apiserver' >> /etc/hosts; fi" - - name: ACT_EnableControlPlaneOutboundLB - enabledIf: '{{ and .privateCluster.enabled .controlPlane.outboundLB.enabled }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/networkSpec/controlPlaneOutboundLB - valueFrom: - template: | - frontendIPsCount: {{ .controlPlane.outboundLB.frontendIPCount }} - - name: ACT_EnableNodeOutboundLB - enabledIf: '{{ and .privateCluster.enabled .worker.outboundLB.enabled }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/networkSpec/nodeOutboundLB - valueFrom: - template: | - frontendIPsCount: {{ .worker.outboundLB.frontendIPCount }} - idleTimeoutInMinutes: {{ .worker.outboundLB.idleTimeoutInMinutes }} - - name: ACT_DisableNodeOutboundLB - enabledIf: '{{ and .privateCluster.enabled (not (.worker.outboundLB.enabled)) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: remove - path: /spec/template/spec/networkSpec/nodeOutboundLB - - name: nodeLabels - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - "tkg-worker" - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.machineDeployment.version).labels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end}} - {{- if .nodePoolLabels -}} - , - {{- $first := true }} - {{- range .nodePoolLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - name: httpProxy - enabledIf: '{{ not (empty .proxy) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &containerdProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list .network.vnet.cidr "169.254.0.0/16" "168.63.129.16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /etc/systemd/system/containerd.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &kubeletProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list .network.vnet.cidr "169.254.0.0/16" "168.63.129.16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /usr/lib/systemd/system/kubelet.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPProxy | - export HTTP_PROXY= {{- .proxy.httpProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPSProxy | - export HTTPS_PROXY= {{- .proxy.httpsProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportNoProxy | - export NO_PROXY= {{- list .network.vnet.cidr "169.254.0.0/16" "168.63.129.16" "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *containerdProxyConf - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *kubeletProxyConf - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPSProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportNoProxy - - name: httpProxyCACert - enabledIf: '{{ $hasProxyCert := false }} {{- range .trust.additionalTrustedCAs }} {{- if .name | eq "proxy" }} {{- $hasProxyCert = true }} {{- end }} {{- end }} {{- $hasProxyCert }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - name: customizedImageRepo - enabledIf: '{{ not (empty .imageRepository.host) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - name: registryCACert - enabledIf: '{{ not (empty .trust.additionalTrustedCAs) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/containerd/ {{- index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} .crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/containerd/{{ index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }}.crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - name: additionalRegistryCACerts - enabledIf: '{{ not (empty .additionalImageRegistries) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &insertCAScript | - path: /tmp/insert_registry_ca_certs.sh - content: | - #!/bin/bash - set -e - {{- range .additionalImageRegistries }} - {{- if eq .skipTlsVerify false }} - echo '{{ .caCert }}' | base64 -d > /etc/containerd/{{ .host }}.crt - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo ' ca_file = "/etc/containerd/{{ .host }}.crt"' >> /etc/containerd/config.toml - {{- else }} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo " insecure_skip_verify = true" >> /etc/containerd/config.toml - {{- end }} - {{- end }} - permissions: "0755" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *insertCAScript - - name: auditLogging - enabledIf: '{{ .auditLogging.enabled }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-path - value: /var/log/kubernetes/audit.log - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-policy-file - value: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxage - value: "30" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxbackup - value: "10" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxsize - value: "100" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-policy - hostPath: /etc/kubernetes/audit-policy.yaml - mountPath: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-logs - hostPath: /var/log/kubernetes - mountPath: /var/log/kubernetes - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - value: - path: /etc/kubernetes/audit-policy.yaml - owner: "root:root" - permissions: "0600" - content: | - --- - apiVersion: audit.k8s.io/v1 - kind: Policy - rules: - #! The following requests were manually identified as high-volume and low-risk, - #! so drop them. - - level: None - users: ["system:serviceaccount:kube-system:kube-proxy"] - verbs: ["watch"] - resources: - - group: "" #! core - resources: ["endpoints", "services", "services/status"] - - level: None - userGroups: ["system:nodes"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["nodes", "nodes/status"] - - level: None - users: - - system:kube-controller-manager - - system:kube-scheduler - - system:serviceaccount:kube-system:endpoint-controller - verbs: ["get", "update"] - namespaces: ["kube-system"] - resources: - - group: "" #! core - resources: ["endpoints"] - - level: None - users: ["system:apiserver"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["namespaces", "namespaces/status", "namespaces/finalize"] - #! Don't log HPA fetching metrics. - - level: None - users: - - system:kube-controller-manager - verbs: ["get", "list"] - resources: - - group: "metrics.k8s.io" - #! Don't log these read-only URLs. - - level: None - nonResourceURLs: - - /healthz* - - /version - - /swagger* - #! Don't log events requests. - - level: None - resources: - - group: "" #! core - resources: ["events"] - #! Don't log TMC service account performing read operations because they are high-volume. - - level: None - userGroups: ["system:serviceaccounts:vmware-system-tmc"] - verbs: ["get", "list", "watch"] - #! Don't log read requests from garbage collector because they are high-volume. - - level: None - users: ["system:serviceaccount:kube-system:generic-garbage-collector"] - verbs: ["get", "list", "watch"] - #! node and pod status calls from nodes are high-volume and can be large, don't log responses for expected updates from nodes - - level: Request - userGroups: ["system:nodes"] - verbs: ["update","patch"] - resources: - - group: "" #! core - resources: ["nodes/status", "pods/status"] - omitStages: - - "RequestReceived" - #! deletecollection calls can be large, don't log responses for expected namespace deletions - - level: Request - users: ["system:serviceaccount:kube-system:namespace-controller"] - verbs: ["deletecollection"] - omitStages: - - "RequestReceived" - #! Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data, - #! so only log at the Metadata level. - - level: Metadata - resources: - - group: "" #! core - resources: ["secrets", "configmaps"] - - group: authentication.k8s.io - resources: ["tokenreviews"] - omitStages: - - "RequestReceived" - #! Get repsonses can be large; skip them. - - level: Request - verbs: ["get", "list", "watch"] - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for known APIs - - level: RequestResponse - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for all other requests. - - level: Metadata - omitStages: - - "RequestReceived" - - name: kcptCertificateRotation - enabledIf: '{{ .controlPlaneCertificateRotation.activate }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/rolloutBefore - valueFrom: - template: | - certificatesExpiryDays: {{ .controlPlaneCertificateRotation.daysBefore }} ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureClusterTemplate -metadata: - name: #@ "tkg-azure-default-{}-cluster".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - azureEnvironment: #@ data.values.AZURE_ENVIRONMENT - location: #@ data.values.AZURE_LOCATION - networkSpec: - vnet: - cidrBlock: #@ data.values.AZURE_VNET_CIDR - subnets: - #@ if data.values.AZURE_CONTROL_PLANE_SUBNET_NAME == "": - - name: management-cluster-controlplane-subnet - role: control-plane - cidrBlock: #@ data.values.AZURE_CONTROL_PLANE_SUBNET_CIDR - #@ else: - - name: #@ data.values.AZURE_CONTROL_PLANE_SUBNET_NAME - role: control-plane - cidrBlock: #@ data.values.AZURE_CONTROL_PLANE_SUBNET_CIDR - #@ end - #@ if data.values.AZURE_NODE_SUBNET_NAME == "": - - name: management-cluster-node-subnet - role: node - cidrBlock: #@ data.values.AZURE_NODE_SUBNET_CIDR - #@ else: - - name: #@ data.values.AZURE_NODE_SUBNET_NAME - role: node - cidrBlock: #@ data.values.AZURE_NODE_SUBNET_CIDR - #@ end - subscriptionID: #@ data.values.AZURE_SUBSCRIPTION_ID ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlaneTemplate -metadata: - name: #@ "tkg-azure-default-{}-kcp".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - kubeadmConfigSpec: - clusterConfiguration: - apiServer: - extraArgs: {} - extraVolumes: [] - timeoutForControlPlane: 20m - scheduler: - extraArgs: {} - controllerManager: - extraArgs: {} - extraVolumes: - - hostPath: /etc/kubernetes/azure.json - mountPath: /etc/kubernetes/azure.json - name: cloud-config - readOnly: true - dns: - imageRepository: #! e.g. registry.tkg.vmware.run - imageTag: #! e.g. v1.6.5_vmware.4 - etcd: - local: - dataDir: /var/lib/etcddisk/etcd - extraArgs: {} - imageRepository: #! e.g. registry.tkg.vmware.run - imageTag: #! e.g v3.4.3_vmware.4 - imageRepository: #! e.g. registry.tkg.vmware.run - diskSetup: - filesystems: - - device: /dev/disk/azure/scsi1/lun0 - extraOpts: - - -E - - lazy_itable_init=1,lazy_journal_init=1 - filesystem: ext4 - label: etcd_disk - - device: ephemeral0.1 - filesystem: ext4 - label: ephemeral0 - replaceFS: ntfs - partitions: - - device: /dev/disk/azure/scsi1/lun0 - layout: true - overwrite: false - tableType: gpt - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data["local_hostname"] }}' - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data["local_hostname"] }}' - mounts: - - - LABEL=etcd_disk - - /var/lib/etcddisk - useExperimentalRetryJoin: true - postKubeadmCommands: - - echo "running postKubeadmCommands..." - preKubeadmCommands: - #! Ensure a non-empty preKubeadmCommands array is present to facilitate patching - - echo "running preKubeadmCommands..." ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureMachineTemplate -metadata: - name: #@ "tkg-azure-default-{}-control-plane".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - dataDisks: - - diskSizeGB: 256 - lun: 0 - nameSuffix: etcddisk - osDisk: - diskSizeGB: 128 - managedDisk: - storageAccountType: Premium_LRS - osType: Linux - sshPublicKey: c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkl3QUFBUUVBdXR2WGhHWFhzN0t5cFV3c1F1dmc3MCtHclVJUXg1YS9QOFBROGhPbWVzZFAwb1hFMElSKzNuN0NGRzhpK0IwV08rdkhCYnc2b3VkSnR6bmNLaE5hU2N3ZFllT1JVbFVLcVN1QXJtU0NjQnpaZDFTTlVSY2NPRWlocjBEUVg5NXk0YjFUS3QxNjl3eVlzZ0JQeDNHcmprc2xJalRDblZKZmdoWlZOZFdKWWJrRVNuck9ySW05KzFsL3JLT09UOWpsR1NER3M1RW5mM2sxTEY3WThTUVVwdXVOZlNKTU9GRlVHTlVxNjY5L0Fod1FJSDJJYjhPQjY5cmV4ajdwQmdCWjFpd3l6eFlWUGZ3aUZSWXR0eFNDRVJiNk82alh4U21KS3FhTkdNcS9QdlJrTVUzTndxNDV1anN1M3l2NmVFSTVLZGpIV0pFdGd3ZWhXa0ZGL2NGcWd3PT0gd2p1bkB2bXdhcmUuY29t - vmSize: #@ data.values.AZURE_CONTROL_PLANE_MACHINE_TYPE ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureMachineTemplate -metadata: - name: #@ "tkg-azure-default-{}-worker".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - osDisk: - diskSizeGB: 128 - managedDisk: - storageAccountType: Premium_LRS - osType: Linux - sshPublicKey: c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkl3QUFBUUVBdXR2WGhHWFhzN0t5cFV3c1F1dmc3MCtHclVJUXg1YS9QOFBROGhPbWVzZFAwb1hFMElSKzNuN0NGRzhpK0IwV08rdkhCYnc2b3VkSnR6bmNLaE5hU2N3ZFllT1JVbFVLcVN1QXJtU0NjQnpaZDFTTlVSY2NPRWlocjBEUVg5NXk0YjFUS3QxNjl3eVlzZ0JQeDNHcmprc2xJalRDblZKZmdoWlZOZFdKWWJrRVNuck9ySW05KzFsL3JLT09UOWpsR1NER3M1RW5mM2sxTEY3WThTUVVwdXVOZlNKTU9GRlVHTlVxNjY5L0Fod1FJSDJJYjhPQjY5cmV4ajdwQmdCWjFpd3l6eFlWUGZ3aUZSWXR0eFNDRVJiNk82alh4U21KS3FhTkdNcS9QdlJrTVUzTndxNDV1anN1M3l2NmVFSTVLZGpIV0pFdGd3ZWhXa0ZGL2NGcWd3PT0gd2p1bkB2bXdhcmUuY29t - vmSize: #@ data.values.AZURE_NODE_MACHINE_TYPE - ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "tkg-azure-default-{}-md-config".format(data.values.AZURE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data["local_hostname"] }}' - useExperimentalRetryJoin: true - preKubeadmCommands: - - echo "running preKubeadmCommands..." diff --git a/providers/infrastructure-azure/v1.6.3/cconly/overlay-kube-apiserver-admission.yaml b/providers/infrastructure-azure/v1.6.3/cconly/overlay-kube-apiserver-admission.yaml deleted file mode 100644 index 965c26e66d..0000000000 --- a/providers/infrastructure-azure/v1.6.3/cconly/overlay-kube-apiserver-admission.yaml +++ /dev/null @@ -1,192 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/append - - name: eventRateLimitConf - required: false - schema: - openAPIV3Schema: - type: string - default: "" - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/admission-control-config.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: admin-control-conf - hostPath: /etc/kubernetes/admission-control-config.yaml - mountPath: /etc/kubernetes/admission-control-config.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/admission-control-config.yaml - content: |- - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - {{- if and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }} - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - {{- end }} - {{- if .eventRateLimitConf }} - - name: EventRateLimit - path: eventConfig.yaml - {{- end }} - enabledIf: '{{ or (and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version)) (.eventRateLimitConf) }}' - #@overlay/append - - name: eventRateLimitConf - description: "Adds an admission configuration for EventRateLimit." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/enable-admission-plugins" - valueFrom: - template: | - {{ $containEnableAdmissionPlugin := false }} - {{- $admissionPlugins := "" }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "enable-admission-plugins" }} - {{- $containEnableAdmissionPlugin = true }} - {{- $admissionPlugins = $val }} - {{- end }} - {{- end }} - {{- if not $containEnableAdmissionPlugin }} - NodeRestriction,EventRateLimit - {{- else -}} - {{- $admissionPlugins -}},EventRateLimit - {{- end }} - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: event-conf - hostPath: /etc/kubernetes/eventConfig.yaml - mountPath: /etc/kubernetes/eventConfig.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/eventConfig.yaml - encoding: base64 - content: {{ .eventRateLimitConf}} - enabledIf: '{{ not (empty .eventRateLimitConf) }}' diff --git a/providers/infrastructure-azure/v1.6.3/cconly/overlay.yaml b/providers/infrastructure-azure/v1.6.3/cconly/overlay.yaml deleted file mode 100644 index 27c8c63098..0000000000 --- a/providers/infrastructure-azure/v1.6.3/cconly/overlay.yaml +++ /dev/null @@ -1,101 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - controlPlane: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_CONTROL_PLANE: - #@overlay/match missing_ok=True - machineHealthCheck: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_CONTROL_PLANE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - workers: - machineDeployments: - #@overlay/match by=overlay.index(0) - - class: tkg-worker - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - #@overlay/match missing_ok=True - machineHealthCheck: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - patches: - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: KCP_INIT_APISERVER_EMPTY_EXTRAVOLUMES_ARRAY - #@overlay/append - - name: restartContainerdService - enabledIf: '{{ not (and (empty .proxy) (empty .trust.additionalTrustedCAs) (empty .imageRepository.host) (empty .additionalImageRegistries)) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl restart containerd - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl restart containerd - -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+" ---- -spec: - #@overlay/match missing_ok=True - template: - #@overlay/match missing_ok=True - spec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #@overlay/append - - "if [ -f /etc/kubernetes/azure.json ]; then sed -i 's/\"vmType\": \"vmss\"/\"vmType\": \"standard\"/' /etc/kubernetes/azure.json; fi" - -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlaneTemplate"}) ---- -spec: - template: - spec: - #@overlay/match missing_ok=True - kubeadmConfigSpec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #@overlay/append - - "if [ -f /etc/kubernetes/azure.json ]; then sed -i 's/\"vmType\": \"vmss\"/\"vmType\": \"standard\"/' /etc/kubernetes/azure.json; fi" diff --git a/providers/infrastructure-azure/v1.6.3/cluster-template-definition-dev.yaml b/providers/infrastructure-azure/v1.6.3/cluster-template-definition-dev.yaml deleted file mode 100644 index 633425d298..0000000000 --- a/providers/infrastructure-azure/v1.6.3/cluster-template-definition-dev.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-azure/v1.6.3/ytt - - path: providers/infrastructure-azure/ytt - - path: providers/ytt - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-azure/v1.6.3/cluster-template-definition-devcc.yaml b/providers/infrastructure-azure/v1.6.3/cluster-template-definition-devcc.yaml deleted file mode 100644 index 9832157274..0000000000 --- a/providers/infrastructure-azure/v1.6.3/cluster-template-definition-devcc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/yttcb - - path: providers/infrastructure-azure/v1.6.3/yttcc - - path: providers/infrastructure-azure/yttcc - - path: providers/yttcc - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-azure/v1.6.3/cluster-template-definition-prod.yaml b/providers/infrastructure-azure/v1.6.3/cluster-template-definition-prod.yaml deleted file mode 100644 index 633425d298..0000000000 --- a/providers/infrastructure-azure/v1.6.3/cluster-template-definition-prod.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-azure/v1.6.3/ytt - - path: providers/infrastructure-azure/ytt - - path: providers/ytt - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-azure/v1.6.3/cluster-template-definition-prodcc.yaml b/providers/infrastructure-azure/v1.6.3/cluster-template-definition-prodcc.yaml deleted file mode 100644 index 9832157274..0000000000 --- a/providers/infrastructure-azure/v1.6.3/cluster-template-definition-prodcc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/yttcb - - path: providers/infrastructure-azure/v1.6.3/yttcc - - path: providers/infrastructure-azure/yttcc - - path: providers/yttcc - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-azure/v1.6.3/clusterclass-tkg-azure-default.yaml b/providers/infrastructure-azure/v1.6.3/clusterclass-tkg-azure-default.yaml deleted file mode 100644 index 1396d35812..0000000000 --- a/providers/infrastructure-azure/v1.6.3/clusterclass-tkg-azure-default.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-azure/v1.6.3/cconly - - path: providers/config_default.yaml diff --git a/providers/infrastructure-azure/v1.6.3/infrastructure-components.yaml b/providers/infrastructure-azure/v1.6.3/infrastructure-components.yaml deleted file mode 100644 index 8cf8cc8e04..0000000000 --- a/providers/infrastructure-azure/v1.6.3/infrastructure-components.yaml +++ /dev/null @@ -1,9265 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - pod-security.kubernetes.io/enforce: privileged - pod-security.kubernetes.io/warn: privileged - pod-security.kubernetes.io/audit: privileged - name: capz-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azureclusteridentities.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureClusterIdentity - listKind: AzureClusterIdentityList - plural: azureclusteridentities - singular: azureclusteridentity - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureClusterIdentity is the Schema for the azureclustersidentities API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterIdentitySpec defines the parameters that are used to create an AzureIdentity. - properties: - allowedNamespaces: - description: "AllowedNamespaces is an array of namespaces that AzureClusters can use this Identity from. \n An empty list (default) indicates that AzureClusters can use this Identity from any namespace. This field is intentionally not a pointer because the nil behavior (no namespaces) is undesirable here." - items: - type: string - type: array - clientID: - description: Both User Assigned MSI and SP can use this field. - type: string - clientSecret: - description: ClientSecret is a secret reference which should contain either a Service Principal password or certificate secret. - properties: - name: - description: name is unique within a namespace to reference a secret resource. - type: string - namespace: - description: namespace defines the space within which the secret name must be unique. - type: string - type: object - x-kubernetes-map-type: atomic - resourceID: - description: User assigned MSI resource id. - type: string - tenantID: - description: Service principal primary tenant id. - type: string - type: - description: UserAssignedMSI or Service Principal - enum: - - ServicePrincipal - - UserAssignedMSI - type: string - required: - - clientID - - tenantID - - type - type: object - status: - description: AzureClusterIdentityStatus defines the observed state of AzureClusterIdentity. - properties: - conditions: - description: Conditions defines current service state of the AzureClusterIdentity. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureClusterIdentity is the Schema for the azureclustersidentities API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterIdentitySpec defines the parameters that are used to create an AzureIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify the namespaces the clusters are allowed to use the identity from. Namespaces can be selected either using an array of namespaces or with label selector. An empty allowedNamespaces object indicates that AzureClusters can use this identity from any namespace. If this object is nil, no namespaces will be allowed (default behaviour, if this field is not provided) A namespace should be either in the NamespaceList or match with Selector to use the identity. - nullable: true - properties: - list: - description: A nil or empty list indicates that AzureCluster cannot use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: "Selector is a selector of namespaces that AzureCluster can use this Identity from. This is a standard Kubernetes LabelSelector, a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. \n A nil or empty selector indicates that AzureCluster cannot use this AzureClusterIdentity from any namespace." - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - clientID: - description: Both User Assigned MSI and SP can use this field. - type: string - clientSecret: - description: ClientSecret is a secret reference which should contain either a Service Principal password or certificate secret. - properties: - name: - description: name is unique within a namespace to reference a secret resource. - type: string - namespace: - description: namespace defines the space within which the secret name must be unique. - type: string - type: object - x-kubernetes-map-type: atomic - resourceID: - description: User assigned MSI resource id. - type: string - tenantID: - description: Service principal primary tenant id. - type: string - type: - description: UserAssignedMSI or Service Principal - enum: - - ServicePrincipal - - UserAssignedMSI - type: string - required: - - clientID - - tenantID - - type - type: object - status: - description: AzureClusterIdentityStatus defines the observed state of AzureClusterIdentity. - properties: - conditions: - description: Conditions defines current service state of the AzureClusterIdentity. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureClusterIdentity is the Schema for the azureclustersidentities API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterIdentitySpec defines the parameters that are used to create an AzureIdentity. - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify the namespaces the clusters are allowed to use the identity from. Namespaces can be selected either using an array of namespaces or with label selector. An empty allowedNamespaces object indicates that AzureClusters can use this identity from any namespace. If this object is nil, no namespaces will be allowed (default behaviour, if this field is not provided) A namespace should be either in the NamespaceList or match with Selector to use the identity. - nullable: true - properties: - list: - description: A nil or empty list indicates that AzureCluster cannot use the identity from any namespace. - items: - type: string - nullable: true - type: array - selector: - description: "Selector is a selector of namespaces that AzureCluster can use this Identity from. This is a standard Kubernetes LabelSelector, a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. \n A nil or empty selector indicates that AzureCluster cannot use this AzureClusterIdentity from any namespace." - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - x-kubernetes-map-type: atomic - type: object - clientID: - description: ClientID is the service principal client ID. Both User Assigned MSI and SP can use this field. - type: string - clientSecret: - description: ClientSecret is a secret reference which should contain either a Service Principal password or certificate secret. - properties: - name: - description: name is unique within a namespace to reference a secret resource. - type: string - namespace: - description: namespace defines the space within which the secret name must be unique. - type: string - type: object - x-kubernetes-map-type: atomic - resourceID: - description: ResourceID is the Azure resource ID for the User Assigned MSI resource. Only applicable when type is UserAssignedMSI. - type: string - tenantID: - description: TenantID is the service principal primary tenant id. - type: string - type: - description: Type is the type of Azure Identity used. ServicePrincipal, ServicePrincipalCertificate, UserAssignedMSI or ManualServicePrincipal. - enum: - - ServicePrincipal - - UserAssignedMSI - - ManualServicePrincipal - - ServicePrincipalCertificate - type: string - required: - - clientID - - tenantID - - type - type: object - status: - description: AzureClusterIdentityStatus defines the observed state of AzureClusterIdentity. - properties: - conditions: - description: Conditions defines current service state of the AzureClusterIdentity. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azureclusters.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureCluster - listKind: AzureClusterList - plural: azureclusters - singular: azurecluster - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this AzureCluster belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - jsonPath: .status.ready - name: Ready - type: boolean - - jsonPath: .spec.resourceGroup - name: Resource Group - priority: 1 - type: string - - jsonPath: .spec.subscriptionID - name: SubscriptionID - priority: 1 - type: string - - jsonPath: .spec.location - name: Location - priority: 1 - type: string - - description: Control Plane Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureCluster is the Schema for the azureclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterSpec defines the desired state of AzureCluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure resources managed by the Azure provider, in addition to the ones added by default. - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to a AzureIdentity to be used when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - location: - type: string - networkSpec: - description: NetworkSpec encapsulates all things related to Azure network. - properties: - apiServerLB: - description: APIServerLB is the configuration for the control-plane load balancer. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - id: - type: string - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - subnets: - description: Subnets is the configuration for the control-plane subnet and the node subnet. - items: - description: SubnetSpec configures an Azure subnet. - properties: - cidrBlock: - description: 'CidrBlock is the CIDR block to be used when the provider creates a managed Vnet. Deprecated: Use CIDRBlocks instead' - type: string - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID defines a unique identifier to reference this resource. - type: string - internalLBIPAddress: - description: 'InternalLBIPAddress is the IP address that will be used as the internal LB private IP. For the control plane subnet only. Deprecated: Use LoadBalancer private IP instead' - type: string - name: - description: Name defines a name for the subnet resource. - type: string - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - type: string - routeTable: - description: RouteTable defines the route table that should be attached to this subnet. - properties: - id: - type: string - name: - type: string - type: object - securityGroup: - description: SecurityGroup defines the NSG (network security group) that should be attached to this subnet. - properties: - id: - type: string - ingressRule: - description: IngressRules is a slice of Azure ingress rules for security groups. - items: - description: IngressRule defines an Azure ingress rule for security groups. - properties: - description: - type: string - destination: - description: Destination - The destination address prefix. CIDR or destination IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts - The destination port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - name: - type: string - priority: - description: Priority - A number between 100 and 4096. Each rule should have a unique value for priority. Rules are processed in priority order, with lower numbers processed before higher numbers. Once traffic matches a rule, processing stops. - format: int32 - type: integer - protocol: - description: SecurityGroupProtocol defines the protocol type for a security group rule. - type: string - source: - description: Source - The CIDR or source IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. If this is an ingress rule, specifies where network traffic originates from. - type: string - sourcePorts: - description: SourcePorts - The source port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - required: - - description - - name - - protocol - type: object - type: array - name: - type: string - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - type: object - required: - - name - type: object - type: array - vnet: - description: Vnet is the configuration for the Azure virtual network. - properties: - cidrBlock: - description: 'CidrBlock is the CIDR block to be used when the provider creates a managed virtual network. Deprecated: Use CIDRBlocks instead' - type: string - cidrBlocks: - description: CIDRBlocks defines the virtual network's address space, specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID is the identifier of the virtual network this provider should use to create resources. - type: string - name: - description: Name defines a name for the virtual network resource. - type: string - resourceGroup: - description: ResourceGroup is the name of the resource group of the existing virtual network or the resource group where a managed virtual network should be created. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - required: - - name - type: object - type: object - resourceGroup: - type: string - subscriptionID: - type: string - required: - - location - type: object - status: - description: AzureClusterStatus defines the observed state of AzureCluster. - properties: - conditions: - description: Conditions defines current service state of the AzureCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: 'FailureDomains specifies the list of unique failure domains for the location/region of the cluster. A FailureDomain maps to Availability Zone with an Azure Region (if the region support them). An Availability Zone is a separate data center within a region and they can be used to ensure the cluster is more resilient to failure. See: https://docs.microsoft.com/en-us/azure/availability-zones/az-overview This list will be used by Cluster API to try and spread the machines across the failure domains.' - type: object - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this AzureCluster belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].reason - name: Reason - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].message - name: Message - priority: 1 - type: string - - jsonPath: .spec.resourceGroup - name: Resource Group - priority: 1 - type: string - - jsonPath: .spec.subscriptionID - name: SubscriptionID - priority: 1 - type: string - - jsonPath: .spec.location - name: Location - priority: 1 - type: string - - description: Control Plane Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureCluster is the Schema for the azureclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterSpec defines the desired state of AzureCluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure resources managed by the Azure provider, in addition to the ones added by default. - type: object - azureEnvironment: - description: 'AzureEnvironment is the name of the AzureCloud to be used. The default value that would be used by most users is "AzurePublicCloud", other values are: - ChinaCloud: "AzureChinaCloud" - GermanCloud: "AzureGermanCloud" - PublicCloud: "AzurePublicCloud" - USGovernmentCloud: "AzureUSGovernmentCloud"' - type: string - bastionSpec: - description: BastionSpec encapsulates all things related to the Bastions in the cluster. - properties: - azureBastion: - description: AzureBastion specifies how the Azure Bastion cloud component should be configured. - properties: - name: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - subnet: - description: SubnetSpec configures an Azure subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID defines a unique identifier to reference this resource. - type: string - name: - description: Name defines a name for the subnet resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - id: - type: string - ip: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - name: - type: string - type: object - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - type: string - routeTable: - description: RouteTable defines the route table that should be attached to this subnet. - properties: - id: - type: string - name: - type: string - type: object - securityGroup: - description: SecurityGroup defines the NSG (network security group) that should be attached to this subnet. - properties: - id: - type: string - name: - type: string - securityRules: - description: SecurityRules is a slice of Azure security rules for security groups. - items: - description: SecurityRule defines an Azure security rule for security groups. - properties: - description: - description: A description for this rule. Restricted to 140 chars. - type: string - destination: - description: Destination is the destination address prefix. CIDR or destination IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts specifies the destination port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - direction: - description: Direction indicates whether the rule applies to inbound, or outbound traffic. "Inbound" or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within the network security group. - type: string - priority: - description: Priority is a number between 100 and 4096. Each rule should have a unique value for priority. Rules are processed in priority order, with lower numbers processed before higher numbers. Once traffic matches a rule, processing stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the protocol type. "Tcp", "Udp", "Icmp", or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR or source IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. If this is an ingress rule, specifies where network traffic originates from. - type: string - sourcePorts: - description: SourcePorts specifies source port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - type: object - required: - - name - type: object - type: object - type: object - cloudProviderConfigOverrides: - description: 'CloudProviderConfigOverrides is an optional set of configuration values that can be overridden in azure cloud provider config. This is only a subset of options that are available in azure cloud provider config. Some values for the cloud provider config are inferred from other parts of cluster api provider azure spec, and may not be available for overrides. See: https://kubernetes-sigs.github.io/cloud-provider-azure/install/configs Note: All cloud provider config values can be customized by creating the secret beforehand. CloudProviderConfigOverrides is only used when the secret is managed by the Azure Provider.' - properties: - backOffs: - description: BackOffConfig indicates the back-off config options. - properties: - cloudProviderBackoff: - type: boolean - cloudProviderBackoffDuration: - type: integer - cloudProviderBackoffExponent: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffJitter: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffRetries: - type: integer - type: object - rateLimits: - items: - description: 'RateLimitSpec represents the rate limit configuration for a particular kind of resource. Eg. loadBalancerRateLimit is used to configure rate limits for load balancers. This eventually gets converted to CloudProviderRateLimitConfig that cloud-provider-azure expects. See: https://github.com/kubernetes-sigs/cloud-provider-azure/blob/d585c2031925b39c925624302f22f8856e29e352/pkg/provider/azure_ratelimit.go#L25 We cannot use CloudProviderRateLimitConfig directly because floating point values are not supported in controller-tools. See: https://github.com/kubernetes-sigs/controller-tools/issues/245' - properties: - config: - description: RateLimitConfig indicates the rate limit config options. - properties: - cloudProviderRateLimit: - type: boolean - cloudProviderRateLimitBucket: - type: integer - cloudProviderRateLimitBucketWrite: - type: integer - cloudProviderRateLimitQPS: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderRateLimitQPSWrite: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - name: - description: Name is the name of the rate limit spec. - enum: - - defaultRateLimit - - routeRateLimit - - subnetsRateLimit - - interfaceRateLimit - - routeTableRateLimit - - loadBalancerRateLimit - - publicIPAddressRateLimit - - securityGroupRateLimit - - virtualMachineRateLimit - - storageAccountRateLimit - - diskRateLimit - - snapshotRateLimit - - virtualMachineScaleSetRateLimit - - virtualMachineSizesRateLimit - - availabilitySetRateLimit - type: string - type: object - type: array - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to an AzureIdentity to be used when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - location: - type: string - networkSpec: - description: NetworkSpec encapsulates all things related to Azure network. - properties: - apiServerLB: - description: APIServerLB is the configuration for the control-plane load balancer. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend IP addresses for the load balancer. - format: int32 - type: integer - id: - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - controlPlaneOutboundLB: - description: ControlPlaneOutboundLB is the configuration for the control-plane outbound load balancer. This is different from APIServerLB, and is used only in private clusters (optionally) for enabling outbound traffic. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend IP addresses for the load balancer. - format: int32 - type: integer - id: - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - nodeOutboundLB: - description: NodeOutboundLB is the configuration for the node outbound load balancer. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend IP addresses for the load balancer. - format: int32 - type: integer - id: - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - privateDNSZoneName: - description: PrivateDNSZoneName defines the zone name for the Azure Private DNS. - type: string - subnets: - description: Subnets is the configuration for the control-plane subnet and the node subnet. - items: - description: SubnetSpec configures an Azure subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID defines a unique identifier to reference this resource. - type: string - name: - description: Name defines a name for the subnet resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - id: - type: string - ip: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - name: - type: string - required: - - name - type: object - name: - type: string - type: object - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - type: string - routeTable: - description: RouteTable defines the route table that should be attached to this subnet. - properties: - id: - type: string - name: - type: string - type: object - securityGroup: - description: SecurityGroup defines the NSG (network security group) that should be attached to this subnet. - properties: - id: - type: string - name: - type: string - securityRules: - description: SecurityRules is a slice of Azure security rules for security groups. - items: - description: SecurityRule defines an Azure security rule for security groups. - properties: - description: - description: A description for this rule. Restricted to 140 chars. - type: string - destination: - description: Destination is the destination address prefix. CIDR or destination IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts specifies the destination port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - direction: - description: Direction indicates whether the rule applies to inbound, or outbound traffic. "Inbound" or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within the network security group. - type: string - priority: - description: Priority is a number between 100 and 4096. Each rule should have a unique value for priority. Rules are processed in priority order, with lower numbers processed before higher numbers. Once traffic matches a rule, processing stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the protocol type. "Tcp", "Udp", "Icmp", or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR or source IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. If this is an ingress rule, specifies where network traffic originates from. - type: string - sourcePorts: - description: SourcePorts specifies source port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - type: object - required: - - name - type: object - type: array - vnet: - description: Vnet is the configuration for the Azure virtual network. - properties: - cidrBlocks: - description: CIDRBlocks defines the virtual network's address space, specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID is the identifier of the virtual network this provider should use to create resources. - type: string - name: - description: Name defines a name for the virtual network resource. - type: string - resourceGroup: - description: ResourceGroup is the name of the resource group of the existing virtual network or the resource group where a managed virtual network should be created. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - required: - - name - type: object - type: object - resourceGroup: - type: string - subscriptionID: - type: string - required: - - location - type: object - status: - description: AzureClusterStatus defines the observed state of AzureCluster. - properties: - conditions: - description: Conditions defines current service state of the AzureCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: 'FailureDomains specifies the list of unique failure domains for the location/region of the cluster. A FailureDomain maps to Availability Zone with an Azure Region (if the region support them). An Availability Zone is a separate data center within a region and they can be used to ensure the cluster is more resilient to failure. See: https://docs.microsoft.com/en-us/azure/availability-zones/az-overview This list will be used by Cluster API to try and spread the machines across the failure domains.' - type: object - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure long-running operations so they can be continued on the next reconciliation loop. - items: - description: Future contains the data needed for an Azure long-running operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. Together with the service name, this forms the unique identifier for the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together with the name of the resource, this forms the unique identifier for the future. - type: string - type: - description: Type describes the type of future, such as update, create, delete, etc. - type: string - required: - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this AzureCluster belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].reason - name: Reason - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].message - name: Message - priority: 1 - type: string - - jsonPath: .spec.resourceGroup - name: Resource Group - priority: 1 - type: string - - jsonPath: .spec.subscriptionID - name: SubscriptionID - priority: 1 - type: string - - jsonPath: .spec.location - name: Location - priority: 1 - type: string - - description: Control Plane Endpoint - jsonPath: .spec.controlPlaneEndpoint.host - name: Endpoint - priority: 1 - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureCluster is the Schema for the azureclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterSpec defines the desired state of AzureCluster. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure resources managed by the Azure provider, in addition to the ones added by default. - type: object - azureEnvironment: - description: 'AzureEnvironment is the name of the AzureCloud to be used. The default value that would be used by most users is "AzurePublicCloud", other values are: - ChinaCloud: "AzureChinaCloud" - GermanCloud: "AzureGermanCloud" - PublicCloud: "AzurePublicCloud" - USGovernmentCloud: "AzureUSGovernmentCloud"' - type: string - bastionSpec: - description: BastionSpec encapsulates all things related to the Bastions in the cluster. - properties: - azureBastion: - description: AzureBastion specifies how the Azure Bastion cloud component should be configured. - properties: - name: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated with the object. - properties: - tag: - description: 'Tag specifies the value of the IP tag associated with the public IP. Example: SQL.' - type: string - type: - description: 'Type specifies the IP tag type. Example: FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - subnet: - description: SubnetSpec configures an Azure subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID is the Azure resource ID of the subnet. READ-ONLY - type: string - name: - description: Name defines a name for the subnet resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - id: - description: ID is the Azure resource ID of the NAT gateway. READ-ONLY - type: string - ip: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated with the object. - properties: - tag: - description: 'Tag specifies the value of the IP tag associated with the public IP. Example: SQL.' - type: string - type: - description: 'Type specifies the IP tag type. Example: FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - name: - type: string - required: - - name - type: object - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - enum: - - node - - control-plane - - bastion - type: string - routeTable: - description: RouteTable defines the route table that should be attached to this subnet. - properties: - id: - description: ID is the Azure resource ID of the route table. READ-ONLY - type: string - name: - type: string - required: - - name - type: object - securityGroup: - description: SecurityGroup defines the NSG (network security group) that should be attached to this subnet. - properties: - id: - description: ID is the Azure resource ID of the security group. READ-ONLY - type: string - name: - type: string - securityRules: - description: SecurityRules is a slice of Azure security rules for security groups. - items: - description: SecurityRule defines an Azure security rule for security groups. - properties: - description: - description: A description for this rule. Restricted to 140 chars. - type: string - destination: - description: Destination is the destination address prefix. CIDR or destination IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts specifies the destination port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - direction: - description: Direction indicates whether the rule applies to inbound, or outbound traffic. "Inbound" or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within the network security group. - type: string - priority: - description: Priority is a number between 100 and 4096. Each rule should have a unique value for priority. Rules are processed in priority order, with lower numbers processed before higher numbers. Once traffic matches a rule, processing stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the protocol type. "Tcp", "Udp", "Icmp", or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR or source IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. If this is an ingress rule, specifies where network traffic originates from. - type: string - sourcePorts: - description: SourcePorts specifies source port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - required: - - name - type: object - serviceEndpoints: - description: ServiceEndpoints is a slice of Virtual Network service endpoints to enable for the subnets. - items: - description: ServiceEndpointSpec configures an Azure Service Endpoint. - properties: - locations: - items: - type: string - type: array - service: - type: string - required: - - locations - - service - type: object - type: array - x-kubernetes-list-map-keys: - - service - x-kubernetes-list-type: map - required: - - name - - role - type: object - type: object - type: object - cloudProviderConfigOverrides: - description: 'CloudProviderConfigOverrides is an optional set of configuration values that can be overridden in azure cloud provider config. This is only a subset of options that are available in azure cloud provider config. Some values for the cloud provider config are inferred from other parts of cluster api provider azure spec, and may not be available for overrides. See: https://kubernetes-sigs.github.io/cloud-provider-azure/install/configs Note: All cloud provider config values can be customized by creating the secret beforehand. CloudProviderConfigOverrides is only used when the secret is managed by the Azure Provider.' - properties: - backOffs: - description: BackOffConfig indicates the back-off config options. - properties: - cloudProviderBackoff: - type: boolean - cloudProviderBackoffDuration: - type: integer - cloudProviderBackoffExponent: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffJitter: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffRetries: - type: integer - type: object - rateLimits: - items: - description: 'RateLimitSpec represents the rate limit configuration for a particular kind of resource. Eg. loadBalancerRateLimit is used to configure rate limits for load balancers. This eventually gets converted to CloudProviderRateLimitConfig that cloud-provider-azure expects. See: https://github.com/kubernetes-sigs/cloud-provider-azure/blob/d585c2031925b39c925624302f22f8856e29e352/pkg/provider/azure_ratelimit.go#L25 We cannot use CloudProviderRateLimitConfig directly because floating point values are not supported in controller-tools. See: https://github.com/kubernetes-sigs/controller-tools/issues/245' - properties: - config: - description: RateLimitConfig indicates the rate limit config options. - properties: - cloudProviderRateLimit: - type: boolean - cloudProviderRateLimitBucket: - type: integer - cloudProviderRateLimitBucketWrite: - type: integer - cloudProviderRateLimitQPS: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderRateLimitQPSWrite: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - name: - description: Name is the name of the rate limit spec. - enum: - - defaultRateLimit - - routeRateLimit - - subnetsRateLimit - - interfaceRateLimit - - routeTableRateLimit - - loadBalancerRateLimit - - publicIPAddressRateLimit - - securityGroupRateLimit - - virtualMachineRateLimit - - storageAccountRateLimit - - diskRateLimit - - snapshotRateLimit - - virtualMachineScaleSetRateLimit - - virtualMachineSizesRateLimit - - availabilitySetRateLimit - type: string - required: - - name - type: object - type: array - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. It is not recommended to set this when creating an AzureCluster as CAPZ will set this for you. However, if it is set, CAPZ will not change it. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to an AzureIdentity to be used when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - location: - type: string - networkSpec: - description: NetworkSpec encapsulates all things related to Azure network. - properties: - apiServerLB: - description: APIServerLB is the configuration for the control-plane load balancer. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated with the object. - properties: - tag: - description: 'Tag specifies the value of the IP tag associated with the public IP. Example: SQL.' - type: string - type: - description: 'Type specifies the IP tag type. Example: FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend IP addresses for the load balancer. - format: int32 - type: integer - id: - description: ID is the Azure resource ID of the load balancer. READ-ONLY - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - controlPlaneOutboundLB: - description: ControlPlaneOutboundLB is the configuration for the control-plane outbound load balancer. This is different from APIServerLB, and is used only in private clusters (optionally) for enabling outbound traffic. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated with the object. - properties: - tag: - description: 'Tag specifies the value of the IP tag associated with the public IP. Example: SQL.' - type: string - type: - description: 'Type specifies the IP tag type. Example: FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend IP addresses for the load balancer. - format: int32 - type: integer - id: - description: ID is the Azure resource ID of the load balancer. READ-ONLY - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - nodeOutboundLB: - description: NodeOutboundLB is the configuration for the node outbound load balancer. - properties: - frontendIPs: - items: - description: FrontendIP defines a load balancer frontend IP configuration. - properties: - name: - minLength: 1 - type: string - privateIP: - type: string - publicIP: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated with the object. - properties: - tag: - description: 'Tag specifies the value of the IP tag associated with the public IP. Example: SQL.' - type: string - type: - description: 'Type specifies the IP tag type. Example: FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - required: - - name - type: object - type: array - frontendIPsCount: - description: FrontendIPsCount specifies the number of frontend IP addresses for the load balancer. - format: int32 - type: integer - id: - description: ID is the Azure resource ID of the load balancer. READ-ONLY - type: string - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for the TCP idle connection. - format: int32 - type: integer - name: - type: string - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - privateDNSZoneName: - description: PrivateDNSZoneName defines the zone name for the Azure Private DNS. - type: string - subnets: - description: Subnets is the configuration for the control-plane subnet and the node subnet. - items: - description: SubnetSpec configures an Azure subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID is the Azure resource ID of the subnet. READ-ONLY - type: string - name: - description: Name defines a name for the subnet resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - id: - description: ID is the Azure resource ID of the NAT gateway. READ-ONLY - type: string - ip: - description: PublicIPSpec defines the inputs to create an Azure public IP address. - properties: - dnsName: - type: string - ipTags: - items: - description: IPTag contains the IpTag associated with the object. - properties: - tag: - description: 'Tag specifies the value of the IP tag associated with the public IP. Example: SQL.' - type: string - type: - description: 'Type specifies the IP tag type. Example: FirstPartyUsage.' - type: string - required: - - tag - - type - type: object - type: array - name: - type: string - required: - - name - type: object - name: - type: string - required: - - name - type: object - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - enum: - - node - - control-plane - - bastion - type: string - routeTable: - description: RouteTable defines the route table that should be attached to this subnet. - properties: - id: - description: ID is the Azure resource ID of the route table. READ-ONLY - type: string - name: - type: string - required: - - name - type: object - securityGroup: - description: SecurityGroup defines the NSG (network security group) that should be attached to this subnet. - properties: - id: - description: ID is the Azure resource ID of the security group. READ-ONLY - type: string - name: - type: string - securityRules: - description: SecurityRules is a slice of Azure security rules for security groups. - items: - description: SecurityRule defines an Azure security rule for security groups. - properties: - description: - description: A description for this rule. Restricted to 140 chars. - type: string - destination: - description: Destination is the destination address prefix. CIDR or destination IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts specifies the destination port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - direction: - description: Direction indicates whether the rule applies to inbound, or outbound traffic. "Inbound" or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within the network security group. - type: string - priority: - description: Priority is a number between 100 and 4096. Each rule should have a unique value for priority. Rules are processed in priority order, with lower numbers processed before higher numbers. Once traffic matches a rule, processing stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the protocol type. "Tcp", "Udp", "Icmp", or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR or source IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. If this is an ingress rule, specifies where network traffic originates from. - type: string - sourcePorts: - description: SourcePorts specifies source port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - required: - - name - type: object - serviceEndpoints: - description: ServiceEndpoints is a slice of Virtual Network service endpoints to enable for the subnets. - items: - description: ServiceEndpointSpec configures an Azure Service Endpoint. - properties: - locations: - items: - type: string - type: array - service: - type: string - required: - - locations - - service - type: object - type: array - x-kubernetes-list-map-keys: - - service - x-kubernetes-list-type: map - required: - - name - - role - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - vnet: - description: Vnet is the configuration for the Azure virtual network. - properties: - cidrBlocks: - description: CIDRBlocks defines the virtual network's address space, specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - id: - description: ID is the Azure resource ID of the virtual network. READ-ONLY - type: string - name: - description: Name defines a name for the virtual network resource. - type: string - peerings: - description: Peerings defines a list of peerings of the newly created virtual network with existing virtual networks. - items: - description: VnetPeeringSpec specifies an existing remote virtual network to peer with the AzureCluster's virtual network. - properties: - remoteVnetName: - description: RemoteVnetName defines name of the remote virtual network. - type: string - resourceGroup: - description: ResourceGroup is the resource group name of the remote virtual network. - type: string - required: - - remoteVnetName - type: object - type: array - resourceGroup: - description: ResourceGroup is the name of the resource group of the existing virtual network or the resource group where a managed virtual network should be created. - type: string - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - required: - - name - type: object - type: object - resourceGroup: - type: string - subscriptionID: - type: string - required: - - location - type: object - status: - description: AzureClusterStatus defines the observed state of AzureCluster. - properties: - conditions: - description: Conditions defines current service state of the AzureCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: 'FailureDomains specifies the list of unique failure domains for the location/region of the cluster. A FailureDomain maps to Availability Zone with an Azure Region (if the region support them). An Availability Zone is a separate data center within a region and they can be used to ensure the cluster is more resilient to failure. See: https://docs.microsoft.com/en-us/azure/availability-zones/az-overview This list will be used by Cluster API to try and spread the machines across the failure domains.' - type: object - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure long-running operations so they can be continued on the next reconciliation loop. - items: - description: Future contains the data needed for an Azure long-running operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. Together with the service name, this forms the unique identifier for the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together with the name of the resource, this forms the unique identifier for the future. - type: string - type: - description: Type describes the type of future, such as update, create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azureclustertemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureClusterTemplate - listKind: AzureClusterTemplateList - plural: azureclustertemplates - singular: azureclustertemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureClusterTemplate is the Schema for the azureclustertemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureClusterTemplateSpec defines the desired state of AzureClusterTemplate. - properties: - template: - description: AzureClusterTemplateResource describes the data needed to create an AzureCluster from a template. - properties: - spec: - description: AzureClusterTemplateResourceSpec specifies an Azure cluster template resource. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure resources managed by the Azure provider, in addition to the ones added by default. - type: object - azureEnvironment: - description: 'AzureEnvironment is the name of the AzureCloud to be used. The default value that would be used by most users is "AzurePublicCloud", other values are: - ChinaCloud: "AzureChinaCloud" - GermanCloud: "AzureGermanCloud" - PublicCloud: "AzurePublicCloud" - USGovernmentCloud: "AzureUSGovernmentCloud"' - type: string - bastionSpec: - description: BastionSpec encapsulates all things related to the Bastions in the cluster. - properties: - azureBastion: - description: AzureBastionTemplateSpec specifies a template for an Azure Bastion host. - properties: - subnet: - description: SubnetTemplateSpec specifies a template for a subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - name: - description: Name defines a name for the subnet resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - name: - type: string - required: - - name - type: object - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - enum: - - node - - control-plane - - bastion - type: string - securityGroup: - description: SecurityGroup defines the NSG (network security group) that should be attached to this subnet. - properties: - securityRules: - description: SecurityRules is a slice of Azure security rules for security groups. - items: - description: SecurityRule defines an Azure security rule for security groups. - properties: - description: - description: A description for this rule. Restricted to 140 chars. - type: string - destination: - description: Destination is the destination address prefix. CIDR or destination IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts specifies the destination port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - direction: - description: Direction indicates whether the rule applies to inbound, or outbound traffic. "Inbound" or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within the network security group. - type: string - priority: - description: Priority is a number between 100 and 4096. Each rule should have a unique value for priority. Rules are processed in priority order, with lower numbers processed before higher numbers. Once traffic matches a rule, processing stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the protocol type. "Tcp", "Udp", "Icmp", or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR or source IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. If this is an ingress rule, specifies where network traffic originates from. - type: string - sourcePorts: - description: SourcePorts specifies source port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - type: object - serviceEndpoints: - description: ServiceEndpoints is a slice of Virtual Network service endpoints to enable for the subnets. - items: - description: ServiceEndpointSpec configures an Azure Service Endpoint. - properties: - locations: - items: - type: string - type: array - service: - type: string - required: - - locations - - service - type: object - type: array - x-kubernetes-list-map-keys: - - service - x-kubernetes-list-type: map - required: - - name - - role - type: object - type: object - type: object - cloudProviderConfigOverrides: - description: 'CloudProviderConfigOverrides is an optional set of configuration values that can be overridden in azure cloud provider config. This is only a subset of options that are available in azure cloud provider config. Some values for the cloud provider config are inferred from other parts of cluster api provider azure spec, and may not be available for overrides. See: https://kubernetes-sigs.github.io/cloud-provider-azure/install/configs Note: All cloud provider config values can be customized by creating the secret beforehand. CloudProviderConfigOverrides is only used when the secret is managed by the Azure Provider.' - properties: - backOffs: - description: BackOffConfig indicates the back-off config options. - properties: - cloudProviderBackoff: - type: boolean - cloudProviderBackoffDuration: - type: integer - cloudProviderBackoffExponent: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffJitter: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderBackoffRetries: - type: integer - type: object - rateLimits: - items: - description: 'RateLimitSpec represents the rate limit configuration for a particular kind of resource. Eg. loadBalancerRateLimit is used to configure rate limits for load balancers. This eventually gets converted to CloudProviderRateLimitConfig that cloud-provider-azure expects. See: https://github.com/kubernetes-sigs/cloud-provider-azure/blob/d585c2031925b39c925624302f22f8856e29e352/pkg/provider/azure_ratelimit.go#L25 We cannot use CloudProviderRateLimitConfig directly because floating point values are not supported in controller-tools. See: https://github.com/kubernetes-sigs/controller-tools/issues/245' - properties: - config: - description: RateLimitConfig indicates the rate limit config options. - properties: - cloudProviderRateLimit: - type: boolean - cloudProviderRateLimitBucket: - type: integer - cloudProviderRateLimitBucketWrite: - type: integer - cloudProviderRateLimitQPS: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - cloudProviderRateLimitQPSWrite: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - name: - description: Name is the name of the rate limit spec. - enum: - - defaultRateLimit - - routeRateLimit - - subnetsRateLimit - - interfaceRateLimit - - routeTableRateLimit - - loadBalancerRateLimit - - publicIPAddressRateLimit - - securityGroupRateLimit - - virtualMachineRateLimit - - storageAccountRateLimit - - diskRateLimit - - snapshotRateLimit - - virtualMachineScaleSetRateLimit - - virtualMachineSizesRateLimit - - availabilitySetRateLimit - type: string - required: - - name - type: object - type: array - type: object - identityRef: - description: IdentityRef is a reference to an AzureIdentity to be used when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - location: - type: string - networkSpec: - description: NetworkSpec encapsulates all things related to Azure network. - properties: - apiServerLB: - description: APIServerLB is the configuration for the control-plane load balancer. - properties: - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for the TCP idle connection. - format: int32 - type: integer - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - controlPlaneOutboundLB: - description: ControlPlaneOutboundLB is the configuration for the control-plane outbound load balancer. This is different from APIServerLB, and is used only in private clusters (optionally) for enabling outbound traffic. - properties: - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for the TCP idle connection. - format: int32 - type: integer - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - nodeOutboundLB: - description: NodeOutboundLB is the configuration for the node outbound load balancer. - properties: - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes specifies the timeout for the TCP idle connection. - format: int32 - type: integer - sku: - description: SKU defines an Azure load balancer SKU. - type: string - type: - description: LBType defines an Azure load balancer Type. - type: string - type: object - privateDNSZoneName: - description: PrivateDNSZoneName defines the zone name for the Azure Private DNS. - type: string - subnets: - description: Subnets is the configuration for the control-plane subnet and the node subnet. - items: - description: SubnetTemplateSpec specifies a template for a subnet. - properties: - cidrBlocks: - description: CIDRBlocks defines the subnet's address space, specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - name: - description: Name defines a name for the subnet resource. - type: string - natGateway: - description: NatGateway associated with this subnet. - properties: - name: - type: string - required: - - name - type: object - role: - description: Role defines the subnet role (eg. Node, ControlPlane) - enum: - - node - - control-plane - - bastion - type: string - securityGroup: - description: SecurityGroup defines the NSG (network security group) that should be attached to this subnet. - properties: - securityRules: - description: SecurityRules is a slice of Azure security rules for security groups. - items: - description: SecurityRule defines an Azure security rule for security groups. - properties: - description: - description: A description for this rule. Restricted to 140 chars. - type: string - destination: - description: Destination is the destination address prefix. CIDR or destination IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. - type: string - destinationPorts: - description: DestinationPorts specifies the destination port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - direction: - description: Direction indicates whether the rule applies to inbound, or outbound traffic. "Inbound" or "Outbound". - enum: - - Inbound - - Outbound - type: string - name: - description: Name is a unique name within the network security group. - type: string - priority: - description: Priority is a number between 100 and 4096. Each rule should have a unique value for priority. Rules are processed in priority order, with lower numbers processed before higher numbers. Once traffic matches a rule, processing stops. - format: int32 - type: integer - protocol: - description: Protocol specifies the protocol type. "Tcp", "Udp", "Icmp", or "*". - enum: - - Tcp - - Udp - - Icmp - - '*' - type: string - source: - description: Source specifies the CIDR or source IP range. Asterix '*' can also be used to match all source IPs. Default tags such as 'VirtualNetwork', 'AzureLoadBalancer' and 'Internet' can also be used. If this is an ingress rule, specifies where network traffic originates from. - type: string - sourcePorts: - description: SourcePorts specifies source port or range. Integer or range between 0 and 65535. Asterix '*' can also be used to match all ports. - type: string - required: - - description - - direction - - name - - protocol - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - tags: - additionalProperties: - type: string - description: Tags defines a map of tags. - type: object - type: object - serviceEndpoints: - description: ServiceEndpoints is a slice of Virtual Network service endpoints to enable for the subnets. - items: - description: ServiceEndpointSpec configures an Azure Service Endpoint. - properties: - locations: - items: - type: string - type: array - service: - type: string - required: - - locations - - service - type: object - type: array - x-kubernetes-list-map-keys: - - service - x-kubernetes-list-type: map - required: - - name - - role - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - vnet: - description: Vnet is the configuration for the Azure virtual network. - properties: - cidrBlocks: - description: CIDRBlocks defines the virtual network's address space, specified as one or more address prefixes in CIDR notation. - items: - type: string - type: array - peerings: - description: Peerings defines a list of peerings of the newly created virtual network with existing virtual networks. - items: - description: VnetPeeringClassSpec specifies a virtual network peering class. - properties: - remoteVnetName: - description: RemoteVnetName defines name of the remote virtual network. - type: string - resourceGroup: - description: ResourceGroup is the resource group name of the remote virtual network. - type: string - required: - - remoteVnetName - type: object - type: array - tags: - additionalProperties: - type: string - description: Tags is a collection of tags describing the resource. - type: object - type: object - type: object - subscriptionID: - type: string - required: - - location - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: unapproved - controller-gen.kubebuilder.io/version: v0.5.0 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: azureidentities.aadpodidentity.k8s.io -spec: - group: aadpodidentity.k8s.io - names: - kind: AzureIdentity - listKind: AzureIdentityList - plural: azureidentities - singular: azureidentity - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: AzureIdentity is the specification of the identity data structure. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureIdentitySpec describes the credential specifications of an identity on Azure. - properties: - adEndpoint: - type: string - adResourceID: - description: For service principal. Option param for specifying the AD details. - type: string - auxiliaryTenantIDs: - description: Service principal auxiliary tenant ids - items: - type: string - nullable: true - type: array - clientID: - description: Both User Assigned MSI and SP can use this field. - type: string - clientPassword: - description: Used for service principal - properties: - name: - description: Name is unique within a namespace to reference a secret resource. - type: string - namespace: - description: Namespace defines the space within which the secret name must be unique. - type: string - type: object - metadata: - type: object - replicas: - format: int32 - nullable: true - type: integer - resourceID: - description: User assigned MSI resource id. - type: string - tenantID: - description: Service principal primary tenant id. - type: string - type: - description: UserAssignedMSI or Service Principal - type: integer - type: object - status: - description: AzureIdentityStatus contains the replica status of the resource. - properties: - availableReplicas: - format: int32 - type: integer - metadata: - type: object - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: unapproved - controller-gen.kubebuilder.io/version: v0.5.0 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: azureidentitybindings.aadpodidentity.k8s.io -spec: - group: aadpodidentity.k8s.io - names: - kind: AzureIdentityBinding - listKind: AzureIdentityBindingList - plural: azureidentitybindings - singular: azureidentitybinding - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: AzureIdentityBinding brings together the spec of matching pods and the identity which they can use. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureIdentityBindingSpec matches the pod with the Identity. Used to indicate the potential matches to look for between the pod/deployment and the identities present. - properties: - azureIdentity: - type: string - metadata: - type: object - selector: - type: string - weight: - description: Weight is used to figure out which of the matching identities would be selected. - type: integer - type: object - status: - description: AzureIdentityBindingStatus contains the status of an AzureIdentityBinding. - properties: - availableReplicas: - format: int32 - type: integer - metadata: - type: object - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremachinepoolmachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureMachinePoolMachine - listKind: AzureMachinePoolMachineList - plural: azuremachinepoolmachines - shortNames: - - ampm - singular: azuremachinepoolmachine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Kubernetes version - jsonPath: .status.version - name: Version - type: string - - description: Flag indicating infrastructure is successfully provisioned - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VMSS VM provisioning state - jsonPath: .status.provisioningState - name: State - type: string - - description: Cluster to which this AzureMachinePoolMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: Azure VMSS VM ID - jsonPath: .spec.providerID - name: VMSS VM ID - priority: 1 - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureMachinePoolMachine is the Schema for the azuremachinepoolmachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachinePoolMachineSpec defines the desired state of AzureMachinePoolMachine. - properties: - instanceID: - description: InstanceID is the identification of the Machine Instance within the VMSS - type: string - providerID: - description: ProviderID is the identification ID of the Virtual Machine Scale Set - type: string - required: - - instanceID - - providerID - type: object - status: - description: AzureMachinePoolMachineStatus defines the observed state of AzureMachinePoolMachine. - properties: - conditions: - description: Conditions defines current service state of the AzureMachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a more verbose string suitable for logging and human consumption. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the MachinePool machine and will contain a succinct value suitable for machine interpretation. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - instanceName: - description: InstanceName is the name of the Machine Instance within the VMSS - type: string - latestModelApplied: - description: LatestModelApplied indicates the instance is running the most up-to-date VMSS model. A VMSS model describes the image version the VM is running. If the instance is not running the latest model, it means the instance may not be running the version of Kubernetes the Machine Pool has specified and needs to be updated. - type: boolean - longRunningOperationStates: - description: LongRunningOperationStates saves the state for Azure long running operations so they can be continued on the next reconciliation loop. - items: - description: Future contains the data needed for an Azure long-running operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. Together with the service name, this forms the unique identifier for the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together with the name of the resource, this forms the unique identifier for the future. - type: string - type: - description: Type describes the type of future, such as update, create, delete, etc. - type: string - required: - - name - - serviceName - - type - type: object - type: array - nodeRef: - description: NodeRef will point to the corresponding Node if it exists. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - provisioningState: - description: ProvisioningState is the provisioning state of the Azure virtual machine instance. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - version: - description: Version defines the Kubernetes version for the VM Instance - type: string - required: - - latestModelApplied - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Kubernetes version - jsonPath: .status.version - name: Version - type: string - - description: Flag indicating infrastructure is successfully provisioned - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VMSS VM provisioning state - jsonPath: .status.provisioningState - name: State - type: string - - description: Cluster to which this AzureMachinePoolMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: Azure VMSS VM ID - jsonPath: .spec.providerID - name: VMSS VM ID - priority: 1 - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureMachinePoolMachine is the Schema for the azuremachinepoolmachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachinePoolMachineSpec defines the desired state of AzureMachinePoolMachine. - properties: - instanceID: - description: InstanceID is the identification of the Machine Instance within the VMSS - type: string - providerID: - description: ProviderID is the identification ID of the Virtual Machine Scale Set - type: string - required: - - instanceID - - providerID - type: object - status: - description: AzureMachinePoolMachineStatus defines the observed state of AzureMachinePoolMachine. - properties: - conditions: - description: Conditions defines current service state of the AzureMachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a more verbose string suitable for logging and human consumption. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the MachinePool machine and will contain a succinct value suitable for machine interpretation. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - instanceName: - description: InstanceName is the name of the Machine Instance within the VMSS - type: string - latestModelApplied: - description: LatestModelApplied indicates the instance is running the most up-to-date VMSS model. A VMSS model describes the image version the VM is running. If the instance is not running the latest model, it means the instance may not be running the version of Kubernetes the Machine Pool has specified and needs to be updated. - type: boolean - longRunningOperationStates: - description: LongRunningOperationStates saves the state for Azure long running operations so they can be continued on the next reconciliation loop. - items: - description: Future contains the data needed for an Azure long-running operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. Together with the service name, this forms the unique identifier for the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together with the name of the resource, this forms the unique identifier for the future. - type: string - type: - description: Type describes the type of future, such as update, create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - nodeRef: - description: NodeRef will point to the corresponding Node if it exists. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - provisioningState: - description: ProvisioningState is the provisioning state of the Azure virtual machine instance. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - version: - description: Version defines the Kubernetes version for the VM Instance - type: string - required: - - latestModelApplied - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremachinepools.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureMachinePool - listKind: AzureMachinePoolList - plural: azuremachinepools - shortNames: - - amp - singular: azuremachinepool - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: AzureMachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: AzureMachinePool replicas count - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VMSS provisioning state - jsonPath: .status.provisioningState - name: State - type: string - - description: Cluster to which this AzureMachinePool belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: MachinePool object to which this AzureMachinePool belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="MachinePool")].name - name: MachinePool - priority: 1 - type: string - - description: Azure VMSS ID - jsonPath: .spec.providerID - name: VMSS ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.template.vmSize - name: VM Size - priority: 1 - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureMachinePool is the Schema for the azuremachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachinePoolSpec defines the desired state of AzureMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the Azure provider. If both the AzureCluster and the AzureMachine specify the same tag name with different values, the AzureMachine's value takes precedence. - type: object - identity: - default: None - description: Identity is the type of identity used for the Virtual Machine Scale Set. The type 'SystemAssigned' is an implicitly created identity. The generated identity will be assigned a Subscription contributor role. The type 'UserAssigned' is a standalone Azure resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - location: - description: Location is the Azure region location e.g. westus2 - type: string - providerID: - description: ProviderID is the identification ID of the Virtual Machine Scale Set - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine instances provided by the provider. This field must match the provider IDs as seen on the node objects corresponding to a machine pool's machine instances. - items: - type: string - type: array - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment to create for a system assigned identity. It can be any valid GUID. If not specified, a random GUID will be generated. - type: string - template: - description: Template contains the details used to build a replica virtual machine within the Machine Pool. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated networking. If omitted, it will be set based on whether the requested VMSize supports accelerated networking. If AcceleratedNetworking is set to true with a VMSize that does not support it, Azure will return an error. - type: boolean - dataDisks: - description: DataDisks specifies the list of data disks to be created for a Virtual Machine - items: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine. - properties: - cachingType: - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options for a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the machine name to generate the disk name. Each disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - image: - description: Image is used to provide details of an image to use during Virtual Machine creation. If image details are omitted the image will default the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published by a third party publisher and a Plan will be generated for it. - type: boolean - version: - description: Version specifies the version of an image sku. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from an Azure Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing the shared image gallery - minLength: 1 - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk contains the operating system disk information for a Virtual Machine - properties: - cachingType: - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options for a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - osType: - type: string - required: - - diskSizeGB - - managedDisk - - osType - type: object - securityProfile: - description: SecurityProfile specifies the Security profile settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should be enabled or disabled for a virtual machine or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine should use a Spot VM - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - description: SSHPublicKey is the SSH public key string base64 encoded to add to a Virtual Machine - type: string - terminateNotificationTimeout: - description: TerminateNotificationTimeout enables or disables VMSS scheduled events termination notification with specified timeout allowed values are between 5 and 15 (mins) - type: integer - vmSize: - description: VMSize is the size of the Virtual Machine to build. See https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines/createorupdate#virtualmachinesizetypes - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure identities provided by the user The lifecycle of a user-assigned identity is managed separately from the lifecycle of the AzureMachinePool. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - required: - - location - - template - type: object - status: - description: AzureMachinePoolStatus defines the observed state of AzureMachinePool. - properties: - conditions: - description: Conditions defines current service state of the AzureMachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachinePool's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachinePool's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - instances: - description: Instances is the VM instance status for each VM in the VMSS - items: - description: AzureMachinePoolInstanceStatus provides status information for each instance in the VMSS. - properties: - instanceID: - description: InstanceID is the identification of the Machine Instance within the VMSS - type: string - instanceName: - description: InstanceName is the name of the Machine Instance within the VMSS - type: string - latestModelApplied: - description: LatestModelApplied indicates the instance is running the most up-to-date VMSS model. A VMSS model describes the image version the VM is running. If the instance is not running the latest model, it means the instance may not be running the version of Kubernetes the Machine Pool has specified and needs to be updated. - type: boolean - providerID: - description: ProviderID is the provider identification of the VMSS Instance - type: string - provisioningState: - description: ProvisioningState is the provisioning state of the Azure virtual machine instance. - type: string - version: - description: Version defines the Kubernetes version for the VM Instance - type: string - required: - - latestModelApplied - type: object - type: array - longRunningOperationState: - description: LongRunningOperationState saves the state for an Azure long running operations so it can be continued on the next reconciliation loop. - properties: - futureData: - description: FutureData is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - type: - description: Type describes the type of future, update, create, delete, etc. - type: string - required: - - type - type: object - provisioningState: - description: ProvisioningState is the provisioning state of the Azure virtual machine. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - version: - description: Version is the Kubernetes version for the current VMSS model - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: AzureMachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: AzureMachinePool replicas count - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VMSS provisioning state - jsonPath: .status.provisioningState - name: State - type: string - - description: Cluster to which this AzureMachinePool belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: MachinePool object to which this AzureMachinePool belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="MachinePool")].name - name: MachinePool - priority: 1 - type: string - - description: Azure VMSS ID - jsonPath: .spec.providerID - name: VMSS ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.template.vmSize - name: VM Size - priority: 1 - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureMachinePool is the Schema for the azuremachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachinePoolSpec defines the desired state of AzureMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the Azure provider. If both the AzureCluster and the AzureMachine specify the same tag name with different values, the AzureMachine's value takes precedence. - type: object - identity: - default: None - description: Identity is the type of identity used for the Virtual Machine Scale Set. The type 'SystemAssigned' is an implicitly created identity. The generated identity will be assigned a Subscription contributor role. The type 'UserAssigned' is a standalone Azure resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - location: - description: Location is the Azure region location e.g. westus2 - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the Virtual Machine Scale Set - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine instances provided by the provider. This field must match the provider IDs as seen on the node objects corresponding to a machine pool's machine instances. - items: - type: string - type: array - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment to create for a system assigned identity. It can be any valid GUID. If not specified, a random GUID will be generated. - type: string - strategy: - default: - rollingUpdate: - deletePolicy: Oldest - maxSurge: 1 - maxUnavailable: 0 - type: RollingUpdate - description: The deployment strategy to use to replace existing AzureMachinePoolMachines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if MachineDeploymentStrategyType = RollingUpdate. - properties: - deletePolicy: - default: Oldest - description: DeletePolicy defines the policy used by the MachineDeployment to identify nodes to delete when downscaling. Valid values are "Random, "Newest", "Oldest" When no value is supplied, the default is Oldest - enum: - - Random - - Newest - - Oldest - type: string - maxSurge: - anyOf: - - type: integer - - type: string - default: 1 - description: 'The maximum number of machines that can be scheduled above the desired number of machines. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 1. Example: when this is set to 30%, the new MachineSet can be scaled up immediately when the rolling update starts, such that the total number of old and new machines do not exceed 130% of desired machines. Once old machines have been killed, new MachineSet can be scaled up further, ensuring that total number of machines running at any time during the update is at most 130% of desired machines.' - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - default: 0 - description: 'The maximum number of machines that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 0. Example: when this is set to 30%, the old MachineSet can be scaled down to 70% of desired machines immediately when the rolling update starts. Once new machines are ready, old MachineSet can be scaled down further, followed by scaling up the new MachineSet, ensuring that the total number of machines available at all times during the update is at least 70% of desired machines.' - x-kubernetes-int-or-string: true - type: object - type: - default: RollingUpdate - description: Type of deployment. Currently the only supported strategy is RollingUpdate - enum: - - RollingUpdate - type: string - type: object - template: - description: Template contains the details used to build a replica virtual machine within the Machine Pool - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated networking. If omitted, it will be set based on whether the requested VMSize supports accelerated networking. If AcceleratedNetworking is set to true with a VMSize that does not support it, Azure will return an error. - type: boolean - dataDisks: - description: DataDisks specifies the list of data disks to be created for a Virtual Machine - items: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the machine name to generate the disk name. Each disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - image: - description: Image is used to provide details of an image to use during VM creation. If image details are omitted the image will default the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published by a third party publisher and a Plan will be generated for it. - type: boolean - version: - description: Version specifies the version of an image sku. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from an Azure Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that created the image. This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk contains the operating system disk information for a Virtual Machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the OS disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - securityProfile: - description: SecurityProfile specifies the Security profile settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should be enabled or disabled for a virtual machine or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine should use a Spot VM - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - description: SSHPublicKey is the SSH public key string base64 encoded to add to a Virtual Machine - type: string - subnetName: - description: SubnetName selects the Subnet where the VMSS will be placed - type: string - terminateNotificationTimeout: - description: TerminateNotificationTimeout enables or disables VMSS scheduled events termination notification with specified timeout allowed values are between 5 and 15 (mins) - type: integer - vmSize: - description: VMSize is the size of the Virtual Machine to build. See https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines/createorupdate#virtualmachinesizetypes - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure identities provided by the user The lifecycle of a user-assigned identity is managed separately from the lifecycle of the AzureMachinePool. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - required: - - location - - template - type: object - status: - description: AzureMachinePoolStatus defines the observed state of AzureMachinePool. - properties: - conditions: - description: Conditions defines current service state of the AzureMachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachinePool's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachinePool's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - image: - description: Image is the current image used in the AzureMachinePool. When the spec image is nil, this image is populated with the details of the defaulted Azure Marketplace "capi" offer. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published by a third party publisher and a Plan will be generated for it. - type: boolean - version: - description: Version specifies the version of an image sku. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from an Azure Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that created the image. This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - instances: - description: Instances is the VM instance status for each VM in the VMSS - items: - description: AzureMachinePoolInstanceStatus provides status information for each instance in the VMSS. - properties: - instanceID: - description: InstanceID is the identification of the Machine Instance within the VMSS - type: string - instanceName: - description: InstanceName is the name of the Machine Instance within the VMSS - type: string - latestModelApplied: - description: LatestModelApplied indicates the instance is running the most up-to-date VMSS model. A VMSS model describes the image version the VM is running. If the instance is not running the latest model, it means the instance may not be running the version of Kubernetes the Machine Pool has specified and needs to be updated. - type: boolean - providerID: - description: ProviderID is the provider identification of the VMSS Instance - type: string - provisioningState: - description: ProvisioningState is the provisioning state of the Azure virtual machine instance. - type: string - version: - description: Version defines the Kubernetes version for the VM Instance - type: string - required: - - latestModelApplied - type: object - type: array - longRunningOperationStates: - description: LongRunningOperationStates saves the state for Azure long-running operations so they can be continued on the next reconciliation loop. - items: - description: Future contains the data needed for an Azure long-running operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. Together with the service name, this forms the unique identifier for the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together with the name of the resource, this forms the unique identifier for the future. - type: string - type: - description: Type describes the type of future, such as update, create, delete, etc. - type: string - required: - - name - - serviceName - - type - type: object - type: array - provisioningState: - description: ProvisioningState is the provisioning state of the Azure virtual machine. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - version: - description: Version is the Kubernetes version for the current VMSS model - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: AzureMachinePool replicas count - jsonPath: .status.replicas - name: Replicas - type: string - - description: AzureMachinePool replicas count - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VMSS provisioning state - jsonPath: .status.provisioningState - name: State - type: string - - description: Cluster to which this AzureMachinePool belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: MachinePool object to which this AzureMachinePool belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="MachinePool")].name - name: MachinePool - priority: 1 - type: string - - description: Azure VMSS ID - jsonPath: .spec.providerID - name: VMSS ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.template.vmSize - name: VM Size - priority: 1 - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureMachinePool is the Schema for the azuremachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachinePoolSpec defines the desired state of AzureMachinePool. - properties: - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the Azure provider. If both the AzureCluster and the AzureMachine specify the same tag name with different values, the AzureMachine's value takes precedence. - type: object - identity: - default: None - description: Identity is the type of identity used for the Virtual Machine Scale Set. The type 'SystemAssigned' is an implicitly created identity. The generated identity will be assigned a Subscription contributor role. The type 'UserAssigned' is a standalone Azure resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - location: - description: Location is the Azure region location e.g. westus2 - type: string - nodeDrainTimeout: - description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a node. The default value is 0, meaning that the node can be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' - type: string - providerID: - description: ProviderID is the identification ID of the Virtual Machine Scale Set - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine instances provided by the provider. This field must match the provider IDs as seen on the node objects corresponding to a machine pool's machine instances. - items: - type: string - type: array - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment to create for a system assigned identity. It can be any valid GUID. If not specified, a random GUID will be generated. - type: string - strategy: - default: - rollingUpdate: - deletePolicy: Oldest - maxSurge: 1 - maxUnavailable: 0 - type: RollingUpdate - description: The deployment strategy to use to replace existing AzureMachinePoolMachines with new ones. - properties: - rollingUpdate: - description: Rolling update config params. Present only if MachineDeploymentStrategyType = RollingUpdate. - properties: - deletePolicy: - default: Oldest - description: DeletePolicy defines the policy used by the MachineDeployment to identify nodes to delete when downscaling. Valid values are "Random, "Newest", "Oldest" When no value is supplied, the default is Oldest - enum: - - Random - - Newest - - Oldest - type: string - maxSurge: - anyOf: - - type: integer - - type: string - default: 1 - description: 'The maximum number of machines that can be scheduled above the desired number of machines. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 1. Example: when this is set to 30%, the new MachineSet can be scaled up immediately when the rolling update starts, such that the total number of old and new machines do not exceed 130% of desired machines. Once old machines have been killed, new MachineSet can be scaled up further, ensuring that total number of machines running at any time during the update is at most 130% of desired machines.' - x-kubernetes-int-or-string: true - maxUnavailable: - anyOf: - - type: integer - - type: string - default: 0 - description: 'The maximum number of machines that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired machines (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 0. Example: when this is set to 30%, the old MachineSet can be scaled down to 70% of desired machines immediately when the rolling update starts. Once new machines are ready, old MachineSet can be scaled down further, followed by scaling up the new MachineSet, ensuring that the total number of machines available at all times during the update is at least 70% of desired machines.' - x-kubernetes-int-or-string: true - type: object - type: - default: RollingUpdate - description: Type of deployment. Currently the only supported strategy is RollingUpdate - enum: - - RollingUpdate - type: string - type: object - template: - description: Template contains the details used to build a replica virtual machine within the Machine Pool - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated networking. If omitted, it will be set based on whether the requested VMSize supports accelerated networking. If AcceleratedNetworking is set to true with a VMSize that does not support it, Azure will return an error. - type: boolean - dataDisks: - description: DataDisks specifies the list of data disks to be created for a Virtual Machine - items: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the machine name to generate the disk name. Each disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - image: - description: Image is used to provide details of an image to use during VM creation. If image details are omitted the image will default the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - computeGallery: - description: ComputeGallery specifies an image to use from the Azure Compute Gallery - properties: - gallery: - description: Gallery specifies the name of the compute image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - plan: - description: Plan contains plan information. - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - required: - - offer - - publisher - - sku - type: object - resourceGroup: - description: ResourceGroup specifies the resource group containing the private compute gallery. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the private compute gallery. - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - version - type: object - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published by a third party publisher and a Plan will be generated for it. - type: boolean - version: - description: Version specifies the version of an image sku. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: 'SharedGallery specifies an image to use from an Azure Shared Image Gallery Deprecated: use ComputeGallery instead.' - properties: - gallery: - description: Gallery specifies the name of the shared image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that created the image. This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk contains the operating system disk information for a Virtual Machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the OS disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - securityProfile: - description: SecurityProfile specifies the Security profile settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should be enabled or disabled for a virtual machine or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine should use a Spot VM - properties: - evictionPolicy: - description: EvictionPolicy defines the behavior of the virtual machine when it is evicted. It can be either Delete or Deallocate. - enum: - - Deallocate - - Delete - type: string - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - description: SSHPublicKey is the SSH public key string base64 encoded to add to a Virtual Machine - type: string - subnetName: - description: SubnetName selects the Subnet where the VMSS will be placed - type: string - terminateNotificationTimeout: - description: TerminateNotificationTimeout enables or disables VMSS scheduled events termination notification with specified timeout allowed values are between 5 and 15 (mins) - type: integer - vmExtensions: - description: VMExtensions specifies a list of extensions to be added to the scale set. - items: - description: VMExtension specifies the parameters for a custom VM extension. - properties: - name: - description: Name is the name of the extension. - type: string - protectedSettings: - additionalProperties: - type: string - description: ProtectedSettings is a JSON formatted protected settings for the extension. - type: object - publisher: - description: Publisher is the name of the extension handler publisher. - type: string - settings: - additionalProperties: - type: string - description: Settings is a JSON formatted public settings for the extension. - type: object - version: - description: Version specifies the version of the script handler. - type: string - required: - - name - - publisher - - version - type: object - type: array - vmSize: - description: VMSize is the size of the Virtual Machine to build. See https://docs.microsoft.com/en-us/rest/api/compute/virtualmachines/createorupdate#virtualmachinesizetypes - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure identities provided by the user The lifecycle of a user-assigned identity is managed separately from the lifecycle of the AzureMachinePool. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - required: - - location - - template - type: object - status: - description: AzureMachinePoolStatus defines the observed state of AzureMachinePool. - properties: - conditions: - description: Conditions defines current service state of the AzureMachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachinePool's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the MachinePool and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the MachinePool's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of MachinePools can be added as events to the MachinePool object and/or logged in the controller's output." - type: string - image: - description: Image is the current image used in the AzureMachinePool. When the spec image is nil, this image is populated with the details of the defaulted Azure Marketplace "capi" offer. - properties: - computeGallery: - description: ComputeGallery specifies an image to use from the Azure Compute Gallery - properties: - gallery: - description: Gallery specifies the name of the compute image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - plan: - description: Plan contains plan information. - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - required: - - offer - - publisher - - sku - type: object - resourceGroup: - description: ResourceGroup specifies the resource group containing the private compute gallery. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the private compute gallery. - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - version - type: object - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published by a third party publisher and a Plan will be generated for it. - type: boolean - version: - description: Version specifies the version of an image sku. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: 'SharedGallery specifies an image to use from an Azure Shared Image Gallery Deprecated: use ComputeGallery instead.' - properties: - gallery: - description: Gallery specifies the name of the shared image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that created the image. This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - instances: - description: Instances is the VM instance status for each VM in the VMSS - items: - description: AzureMachinePoolInstanceStatus provides status information for each instance in the VMSS. - properties: - instanceID: - description: InstanceID is the identification of the Machine Instance within the VMSS - type: string - instanceName: - description: InstanceName is the name of the Machine Instance within the VMSS - type: string - latestModelApplied: - description: LatestModelApplied indicates the instance is running the most up-to-date VMSS model. A VMSS model describes the image version the VM is running. If the instance is not running the latest model, it means the instance may not be running the version of Kubernetes the Machine Pool has specified and needs to be updated. - type: boolean - providerID: - description: ProviderID is the provider identification of the VMSS Instance - type: string - provisioningState: - description: ProvisioningState is the provisioning state of the Azure virtual machine instance. - type: string - version: - description: Version defines the Kubernetes version for the VM Instance - type: string - required: - - latestModelApplied - type: object - type: array - longRunningOperationStates: - description: LongRunningOperationStates saves the state for Azure long-running operations so they can be continued on the next reconciliation loop. - items: - description: Future contains the data needed for an Azure long-running operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. Together with the service name, this forms the unique identifier for the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together with the name of the resource, this forms the unique identifier for the future. - type: string - type: - description: Type describes the type of future, such as update, create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - provisioningState: - description: ProvisioningState is the provisioning state of the Azure virtual machine. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - version: - description: Version is the Kubernetes version for the current VMSS model - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureMachine - listKind: AzureMachineList - plural: azuremachines - singular: azuremachine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: AzureMachine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VM provisioning state - jsonPath: .status.vmState - name: State - type: string - - description: Cluster to which this AzureMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: Machine object to which this AzureMachine belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Azure VM ID - jsonPath: .spec.providerID - name: VM ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.vmSize - name: VM Size - priority: 1 - type: string - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureMachine is the Schema for the azuremachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineSpec defines the desired state of AzureMachine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated networking. If omitted, it will be set based on whether the requested VMSize supports accelerated networking. If AcceleratedNetworking is set to true with a VMSize that does not support it, Azure will return an error. - type: boolean - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the Azure provider. If both the AzureCluster and the AzureMachine specify the same tag name with different values, the AzureMachine's value takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create dynamic public ips for machines where this value is true. - type: boolean - availabilityZone: - description: 'Deprecated: use FailureDomain instead' - properties: - enabled: - type: boolean - id: - type: string - type: object - dataDisks: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine. - properties: - cachingType: - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options for a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the machine name to generate the disk name. Each disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure which is required for some CNI's to send traffic from a pods on one machine to another. This is required for IpV6 with Calico in combination with User Defined Routes (set by the Azure Cloud Controller manager). Default is false for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. This relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the virtual machine. The type 'SystemAssigned' is an implicitly created identity. The generated identity will be assigned a Subscription contributor role. The type 'UserAssigned' is a standalone Azure resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image to use during VM creation. If image details are omitted the image will default the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published by a third party publisher and a Plan will be generated for it. - type: boolean - version: - description: Version specifies the version of an image sku. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from an Azure Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing the shared image gallery - minLength: 1 - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - location: - description: 'Deprecated: to support old clients, will be removed in v1alpha4/v1beta1' - type: string - osDisk: - description: OSDisk specifies the parameters for the operating system disk of the machine - properties: - cachingType: - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options for a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - osType: - type: string - required: - - diskSizeGB - - managedDisk - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified by the cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment to create for a system assigned identity. It can be any valid GUID. If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should be enabled or disabled for a virtual machine or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine should use a Spot VM. - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure identities provided by the user The lifecycle of a user-assigned identity is managed separately from the lifecycle of the AzureMachine. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmSize: - type: string - required: - - location - - osDisk - - sshPublicKey - - vmSize - type: object - status: - description: AzureMachineStatus defines the observed state of AzureMachine. - properties: - addresses: - description: Addresses contains the Azure instance associated addresses. - items: - description: NodeAddress contains information for the node's address. - properties: - address: - description: The node address. - type: string - type: - description: Node address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the AzureMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "ErrorMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "ErrorReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - vmState: - description: VMState is the provisioning state of the Azure virtual machine. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: AzureMachine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: Azure VM provisioning state - jsonPath: .status.vmState - name: State - type: string - - description: Cluster to which this AzureMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: Machine object to which this AzureMachine belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Azure VM ID - jsonPath: .spec.providerID - name: VM ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.vmSize - name: VM Size - priority: 1 - type: string - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureMachine is the Schema for the azuremachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineSpec defines the desired state of AzureMachine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated networking. If omitted, it will be set based on whether the requested VMSize supports accelerated networking. If AcceleratedNetworking is set to true with a VMSize that does not support it, Azure will return an error. - type: boolean - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the Azure provider. If both the AzureCluster and the AzureMachine specify the same tag name with different values, the AzureMachine's value takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create dynamic public ips for machines where this value is true. - type: boolean - dataDisks: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the machine name to generate the disk name. Each disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure which is required for some CNI's to send traffic from a pods on one machine to another. This is required for IpV6 with Calico in combination with User Defined Routes (set by the Azure Cloud Controller manager). Default is false for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. This relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the virtual machine. The type 'SystemAssigned' is an implicitly created identity. The generated identity will be assigned a Subscription contributor role. The type 'UserAssigned' is a standalone Azure resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image to use during VM creation. If image details are omitted the image will default the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published by a third party publisher and a Plan will be generated for it. - type: boolean - version: - description: Version specifies the version of an image sku. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from an Azure Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that created the image. This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk specifies the parameters for the operating system disk of the machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the OS disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified by the cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment to create for a system assigned identity. It can be any valid GUID. If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should be enabled or disabled for a virtual machine or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine should use a Spot VM - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - subnetName: - description: SubnetName selects the Subnet where the VM will be placed - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure identities provided by the user The lifecycle of a user-assigned identity is managed separately from the lifecycle of the AzureMachine. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmSize: - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - status: - description: AzureMachineStatus defines the observed state of AzureMachine. - properties: - addresses: - description: Addresses contains the Azure instance associated addresses. - items: - description: NodeAddress contains information for the node's address. - properties: - address: - description: The node address. - type: string - type: - description: Node address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the AzureMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "ErrorMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "ErrorReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure long-running operations so they can be continued on the next reconciliation loop. - items: - description: Future contains the data needed for an Azure long-running operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. Together with the service name, this forms the unique identifier for the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together with the name of the resource, this forms the unique identifier for the future. - type: string - type: - description: Type describes the type of future, such as update, create, delete, etc. - type: string - required: - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - vmState: - description: VMState is the provisioning state of the Azure virtual machine. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=='Ready')].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].reason - name: Reason - type: string - - jsonPath: .status.conditions[?(@.type=='Ready')].message - name: Message - priority: 1 - type: string - - description: Azure VM provisioning state - jsonPath: .status.vmState - name: State - type: string - - description: Cluster to which this AzureMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - priority: 1 - type: string - - description: Machine object to which this AzureMachine belongs - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Azure VM ID - jsonPath: .spec.providerID - name: VM ID - priority: 1 - type: string - - description: Azure VM Size - jsonPath: .spec.vmSize - name: VM Size - priority: 1 - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureMachine is the Schema for the azuremachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineSpec defines the desired state of AzureMachine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated networking. If omitted, it will be set based on whether the requested VMSize supports accelerated networking. If AcceleratedNetworking is set to true with a VMSize that does not support it, Azure will return an error. - type: boolean - additionalCapabilities: - description: AdditionalCapabilities specifies additional capabilities enabled or disabled on the virtual machine. - properties: - ultraSSDEnabled: - description: UltraSSDEnabled enables or disables Azure UltraSSD capability for the virtual machine. Defaults to true if Ultra SSD data disks are specified, otherwise it doesn't set the capability on the VM. - type: boolean - type: object - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the Azure provider. If both the AzureCluster and the AzureMachine specify the same tag name with different values, the AzureMachine's value takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create dynamic public ips for machines where this value is true. - type: boolean - dataDisks: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the machine name to generate the disk name. Each disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - dnsServers: - description: DNSServers adds a list of DNS Server IP addresses to the VM NICs. - items: - type: string - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure which is required for some CNI's to send traffic from a pods on one machine to another. This is required for IpV6 with Calico in combination with User Defined Routes (set by the Azure Cloud Controller manager). Default is false for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. This relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the virtual machine. The type 'SystemAssigned' is an implicitly created identity. The generated identity will be assigned a Subscription contributor role. The type 'UserAssigned' is a standalone Azure resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image to use during VM creation. If image details are omitted the image will default the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - computeGallery: - description: ComputeGallery specifies an image to use from the Azure Compute Gallery - properties: - gallery: - description: Gallery specifies the name of the compute image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - plan: - description: Plan contains plan information. - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - required: - - offer - - publisher - - sku - type: object - resourceGroup: - description: ResourceGroup specifies the resource group containing the private compute gallery. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the private compute gallery. - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - version - type: object - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published by a third party publisher and a Plan will be generated for it. - type: boolean - version: - description: Version specifies the version of an image sku. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: 'SharedGallery specifies an image to use from an Azure Shared Image Gallery Deprecated: use ComputeGallery instead.' - properties: - gallery: - description: Gallery specifies the name of the shared image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that created the image. This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk specifies the parameters for the operating system disk of the machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the OS disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified by the cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment to create for a system assigned identity. It can be any valid GUID. If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should be enabled or disabled for a virtual machine or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine should use a Spot VM - properties: - evictionPolicy: - description: EvictionPolicy defines the behavior of the virtual machine when it is evicted. It can be either Delete or Deallocate. - enum: - - Deallocate - - Delete - type: string - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - subnetName: - description: SubnetName selects the Subnet where the VM will be placed - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure identities provided by the user The lifecycle of a user-assigned identity is managed separately from the lifecycle of the AzureMachine. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmExtensions: - description: VMExtensions specifies a list of extensions to be added to the virtual machine. - items: - description: VMExtension specifies the parameters for a custom VM extension. - properties: - name: - description: Name is the name of the extension. - type: string - protectedSettings: - additionalProperties: - type: string - description: ProtectedSettings is a JSON formatted protected settings for the extension. - type: object - publisher: - description: Publisher is the name of the extension handler publisher. - type: string - settings: - additionalProperties: - type: string - description: Settings is a JSON formatted public settings for the extension. - type: object - version: - description: Version specifies the version of the script handler. - type: string - required: - - name - - publisher - - version - type: object - type: array - vmSize: - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - status: - description: AzureMachineStatus defines the observed state of AzureMachine. - properties: - addresses: - description: Addresses contains the Azure instance associated addresses. - items: - description: NodeAddress contains information for the node's address. - properties: - address: - description: The node address. - type: string - type: - description: Node address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the AzureMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "ErrorMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "ErrorReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure long-running operations so they can be continued on the next reconciliation loop. - items: - description: Future contains the data needed for an Azure long-running operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. Together with the service name, this forms the unique identifier for the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together with the name of the resource, this forms the unique identifier for the future. - type: string - type: - description: Type describes the type of future, such as update, create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - vmState: - description: VMState is the provisioning state of the Azure virtual machine. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - controller-gen.kubebuilder.io/version: v0.9.2 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremachinetemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capz-webhook-service - namespace: capz-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureMachineTemplate - listKind: AzureMachineTemplateList - plural: azuremachinetemplates - singular: azuremachinetemplate - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureMachineTemplate is the Schema for the azuremachinetemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineTemplateSpec defines the desired state of AzureMachineTemplate. - properties: - template: - description: AzureMachineTemplateResource describes the data needed to create an AzureMachine from a template. - properties: - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated networking. If omitted, it will be set based on whether the requested VMSize supports accelerated networking. If AcceleratedNetworking is set to true with a VMSize that does not support it, Azure will return an error. - type: boolean - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the Azure provider. If both the AzureCluster and the AzureMachine specify the same tag name with different values, the AzureMachine's value takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create dynamic public ips for machines where this value is true. - type: boolean - availabilityZone: - description: 'Deprecated: use FailureDomain instead' - properties: - enabled: - type: boolean - id: - type: string - type: object - dataDisks: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine. - properties: - cachingType: - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options for a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the machine name to generate the disk name. Each disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure which is required for some CNI's to send traffic from a pods on one machine to another. This is required for IpV6 with Calico in combination with User Defined Routes (set by the Azure Cloud Controller manager). Default is false for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. This relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the virtual machine. The type 'SystemAssigned' is an implicitly created identity. The generated identity will be assigned a Subscription contributor role. The type 'UserAssigned' is a standalone Azure resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image to use during VM creation. If image details are omitted the image will default the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published by a third party publisher and a Plan will be generated for it. - type: boolean - version: - description: Version specifies the version of an image sku. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from an Azure Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing the shared image gallery - minLength: 1 - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - location: - description: 'Deprecated: to support old clients, will be removed in v1alpha4/v1beta1' - type: string - osDisk: - description: OSDisk specifies the parameters for the operating system disk of the machine - properties: - cachingType: - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - format: int32 - type: integer - managedDisk: - description: ManagedDisk defines the managed disk options for a VM. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - required: - - storageAccountType - type: object - osType: - type: string - required: - - diskSizeGB - - managedDisk - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified by the cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment to create for a system assigned identity. It can be any valid GUID. If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should be enabled or disabled for a virtual machine or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine should use a Spot VM. - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure identities provided by the user The lifecycle of a user-assigned identity is managed separately from the lifecycle of the AzureMachine. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmSize: - type: string - required: - - location - - osDisk - - sshPublicKey - - vmSize - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureMachineTemplate is the Schema for the azuremachinetemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineTemplateSpec defines the desired state of AzureMachineTemplate. - properties: - template: - description: AzureMachineTemplateResource describes the data needed to create an AzureMachine from a template. - properties: - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated networking. If omitted, it will be set based on whether the requested VMSize supports accelerated networking. If AcceleratedNetworking is set to true with a VMSize that does not support it, Azure will return an error. - type: boolean - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the Azure provider. If both the AzureCluster and the AzureMachine specify the same tag name with different values, the AzureMachine's value takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create dynamic public ips for machines where this value is true. - type: boolean - dataDisks: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the machine name to generate the disk name. Each disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure which is required for some CNI's to send traffic from a pods on one machine to another. This is required for IpV6 with Calico in combination with User Defined Routes (set by the Azure Cloud Controller manager). Default is false for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. This relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the virtual machine. The type 'SystemAssigned' is an implicitly created identity. The generated identity will be assigned a Subscription contributor role. The type 'UserAssigned' is a standalone Azure resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image to use during VM creation. If image details are omitted the image will default the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published by a third party publisher and a Plan will be generated for it. - type: boolean - version: - description: Version specifies the version of an image sku. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: SharedGallery specifies an image to use from an Azure Shared Image Gallery - properties: - gallery: - description: Gallery specifies the name of the shared image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that created the image. This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk specifies the parameters for the operating system disk of the machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the OS disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified by the cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment to create for a system assigned identity. It can be any valid GUID. If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should be enabled or disabled for a virtual machine or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine should use a Spot VM - properties: - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - subnetName: - description: SubnetName selects the Subnet where the VM will be placed - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure identities provided by the user The lifecycle of a user-assigned identity is managed separately from the lifecycle of the AzureMachine. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmSize: - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureMachineTemplate is the Schema for the azuremachinetemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureMachineTemplateSpec defines the desired state of AzureMachineTemplate. - properties: - template: - description: AzureMachineTemplateResource describes the data needed to create an AzureMachine from a template. - properties: - metadata: - description: "ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create. This is a copy of customizable fields from metav1.ObjectMeta. \n ObjectMeta is embedded in `Machine.Spec`, `MachineDeployment.Template` and `MachineSet.Template`, which are not top-level Kubernetes objects. Given that metav1.ObjectMeta has lots of special cases and read-only fields which end up in the generated CRD validation, having it as a subset simplifies the API and some issues that can impact user experience. \n During the [upgrade to controller-tools@v2](https://github.com/kubernetes-sigs/cluster-api/pull/1054) for v1alpha2, we noticed a failure would occur running Cluster API test suite against the new CRDs, specifically `spec.metadata.creationTimestamp in body must be of type string: \"null\"`. The investigation showed that `controller-tools@v2` behaves differently than its previous version when handling types from [metav1](k8s.io/apimachinery/pkg/apis/meta/v1) package. \n In more details, we found that embedded (non-top level) types that embedded `metav1.ObjectMeta` had validation properties, including for `creationTimestamp` (metav1.Time). The `metav1.Time` type specifies a custom json marshaller that, when IsZero() is true, returns `null` which breaks validation because the field isn't marked as nullable. \n In future versions, controller-tools@v2 might allow overriding the type and validation for embedded types. When that happens, this hack should be revisited." - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - acceleratedNetworking: - description: AcceleratedNetworking enables or disables Azure accelerated networking. If omitted, it will be set based on whether the requested VMSize supports accelerated networking. If AcceleratedNetworking is set to true with a VMSize that does not support it, Azure will return an error. - type: boolean - additionalCapabilities: - description: AdditionalCapabilities specifies additional capabilities enabled or disabled on the virtual machine. - properties: - ultraSSDEnabled: - description: UltraSSDEnabled enables or disables Azure UltraSSD capability for the virtual machine. Defaults to true if Ultra SSD data disks are specified, otherwise it doesn't set the capability on the VM. - type: boolean - type: object - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to an instance, in addition to the ones added by default by the Azure provider. If both the AzureCluster and the AzureMachine specify the same tag name with different values, the AzureMachine's value takes precedence. - type: object - allocatePublicIP: - description: AllocatePublicIP allows the ability to create dynamic public ips for machines where this value is true. - type: boolean - dataDisks: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine - items: - description: DataDisk specifies the parameters that are used to add one or more data disks to the machine. - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the data disk. - format: int32 - type: integer - lun: - description: Lun Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM. The value must be between 0 and 63. - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the data disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - nameSuffix: - description: NameSuffix is the suffix to be appended to the machine name to generate the disk name. Each disk name will be in format _. - type: string - required: - - diskSizeGB - - nameSuffix - type: object - type: array - dnsServers: - description: DNSServers adds a list of DNS Server IP addresses to the VM NICs. - items: - type: string - type: array - enableIPForwarding: - description: EnableIPForwarding enables IP Forwarding in Azure which is required for some CNI's to send traffic from a pods on one machine to another. This is required for IpV6 with Calico in combination with User Defined Routes (set by the Azure Cloud Controller manager). Default is false for disabled. - type: boolean - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. This relates to an Azure Availability Zone - type: string - identity: - default: None - description: Identity is the type of identity used for the virtual machine. The type 'SystemAssigned' is an implicitly created identity. The generated identity will be assigned a Subscription contributor role. The type 'UserAssigned' is a standalone Azure resource provided by the user and assigned to the VM - enum: - - None - - SystemAssigned - - UserAssigned - type: string - image: - description: Image is used to provide details of an image to use during VM creation. If image details are omitted the image will default the Azure Marketplace "capi" offer, which is based on Ubuntu. - properties: - computeGallery: - description: ComputeGallery specifies an image to use from the Azure Compute Gallery - properties: - gallery: - description: Gallery specifies the name of the compute image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - plan: - description: Plan contains plan information. - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - required: - - offer - - publisher - - sku - type: object - resourceGroup: - description: ResourceGroup specifies the resource group containing the private compute gallery. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the private compute gallery. - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - version - type: object - id: - description: ID specifies an image to use by ID - type: string - marketplace: - description: Marketplace specifies an image to use from the Azure Marketplace - properties: - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer - minLength: 1 - type: string - publisher: - description: Publisher is the name of the organization that created the image - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter - minLength: 1 - type: string - thirdPartyImage: - default: false - description: ThirdPartyImage indicates the image is published by a third party publisher and a Plan will be generated for it. - type: boolean - version: - description: Version specifies the version of an image sku. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - offer - - publisher - - sku - - version - type: object - sharedGallery: - description: 'SharedGallery specifies an image to use from an Azure Shared Image Gallery Deprecated: use ComputeGallery instead.' - properties: - gallery: - description: Gallery specifies the name of the shared image gallery that contains the image - minLength: 1 - type: string - name: - description: Name is the name of the image - minLength: 1 - type: string - offer: - description: Offer specifies the name of a group of related images created by the publisher. For example, UbuntuServer, WindowsServer This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - publisher: - description: Publisher is the name of the organization that created the image. This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - resourceGroup: - description: ResourceGroup specifies the resource group containing the shared image gallery - minLength: 1 - type: string - sku: - description: SKU specifies an instance of an offer, such as a major release of a distribution. For example, 18.04-LTS, 2019-Datacenter This value will be used to add a `Plan` in the API request when creating the VM/VMSS resource. This is needed when the source image from which this SIG image was built requires the `Plan` to be used. - type: string - subscriptionID: - description: SubscriptionID is the identifier of the subscription that contains the shared image gallery - minLength: 1 - type: string - version: - description: Version specifies the version of the marketplace image. The allowed formats are Major.Minor.Build or 'latest'. Major, Minor, and Build are decimal numbers. Specify 'latest' to use the latest version of an image available at deploy time. Even if you use 'latest', the VM image will not automatically update after deploy time even if a new version becomes available. - minLength: 1 - type: string - required: - - gallery - - name - - resourceGroup - - subscriptionID - - version - type: object - type: object - osDisk: - description: OSDisk specifies the parameters for the operating system disk of the machine - properties: - cachingType: - description: CachingType specifies the caching requirements. - enum: - - None - - ReadOnly - - ReadWrite - type: string - diffDiskSettings: - description: DiffDiskSettings describe ephemeral disk settings for the os disk. - properties: - option: - description: Option enables ephemeral OS when set to "Local" See https://docs.microsoft.com/en-us/azure/virtual-machines/ephemeral-os-disks for full details - enum: - - Local - type: string - required: - - option - type: object - diskSizeGB: - description: DiskSizeGB is the size in GB to assign to the OS disk. Will have a default of 30GB if not provided - format: int32 - type: integer - managedDisk: - description: ManagedDisk specifies the Managed Disk parameters for the OS disk. - properties: - diskEncryptionSet: - description: DiskEncryptionSetParameters defines disk encryption options. - properties: - id: - description: ID defines resourceID for diskEncryptionSet resource. It must be in the same subscription - type: string - type: object - storageAccountType: - type: string - type: object - osType: - type: string - required: - - osType - type: object - providerID: - description: ProviderID is the unique identifier as specified by the cloud provider. - type: string - roleAssignmentName: - description: RoleAssignmentName is the name of the role assignment to create for a system assigned identity. It can be any valid GUID. If not specified, a random GUID will be generated. - type: string - securityProfile: - description: SecurityProfile specifies the Security profile settings for a virtual machine. - properties: - encryptionAtHost: - description: This field indicates whether Host Encryption should be enabled or disabled for a virtual machine or virtual machine scale set. Default is disabled. - type: boolean - type: object - spotVMOptions: - description: SpotVMOptions allows the ability to specify the Machine should use a Spot VM - properties: - evictionPolicy: - description: EvictionPolicy defines the behavior of the virtual machine when it is evicted. It can be either Delete or Deallocate. - enum: - - Deallocate - - Delete - type: string - maxPrice: - anyOf: - - type: integer - - type: string - description: MaxPrice defines the maximum price the user is willing to pay for Spot VM instances - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - sshPublicKey: - type: string - subnetName: - description: SubnetName selects the Subnet where the VM will be placed - type: string - userAssignedIdentities: - description: UserAssignedIdentities is a list of standalone Azure identities provided by the user The lifecycle of a user-assigned identity is managed separately from the lifecycle of the AzureMachine. See https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli - items: - description: UserAssignedIdentity defines the user-assigned identities provided by the user to be assigned to Azure resources. - properties: - providerID: - description: 'ProviderID is the identification ID of the user-assigned Identity, the format of an identity is: ''azure:///subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}''' - type: string - required: - - providerID - type: object - type: array - vmExtensions: - description: VMExtensions specifies a list of extensions to be added to the virtual machine. - items: - description: VMExtension specifies the parameters for a custom VM extension. - properties: - name: - description: Name is the name of the extension. - type: string - protectedSettings: - additionalProperties: - type: string - description: ProtectedSettings is a JSON formatted protected settings for the extension. - type: object - publisher: - description: Publisher is the name of the extension handler publisher. - type: string - settings: - additionalProperties: - type: string - description: Settings is a JSON formatted public settings for the extension. - type: object - version: - description: Version specifies the version of the script handler. - type: string - required: - - name - - publisher - - version - type: object - type: array - vmSize: - type: string - required: - - osDisk - - sshPublicKey - - vmSize - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremanagedclusters.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureManagedCluster - listKind: AzureManagedClusterList - plural: azuremanagedclusters - shortNames: - - amc - singular: azuremanagedcluster - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureManagedCluster is the Schema for the azuremanagedclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedClusterSpec defines the desired state of AzureManagedCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - type: object - status: - description: AzureManagedClusterStatus defines the observed state of AzureManagedCluster. - properties: - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureManagedCluster is the Schema for the azuremanagedclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedClusterSpec defines the desired state of AzureManagedCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - type: object - status: - description: AzureManagedClusterStatus defines the observed state of AzureManagedCluster. - properties: - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureManagedCluster is the Schema for the azuremanagedclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedClusterSpec defines the desired state of AzureManagedCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - type: object - status: - description: AzureManagedClusterStatus defines the observed state of AzureManagedCluster. - properties: - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremanagedcontrolplanes.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureManagedControlPlane - listKind: AzureManagedControlPlaneList - plural: azuremanagedcontrolplanes - shortNames: - - amcp - singular: azuremanagedcontrolplane - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureManagedControlPlane is the Schema for the azuremanagedcontrolplanes API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedControlPlaneSpec defines the desired state of AzureManagedControlPlane. - properties: - aadProfile: - description: AadProfile is Azure Active Directory configuration to integrate with AKS for aad authentication. - properties: - adminGroupObjectIDs: - description: AdminGroupObjectIDs - AAD group object IDs that will have admin role of the cluster. - items: - type: string - type: array - managed: - description: Managed - Whether to enable managed AAD. - type: boolean - required: - - adminGroupObjectIDs - - managed - type: object - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure resources managed by the Azure provider, in addition to the ones added by default. - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - dnsServiceIP: - description: DNSServiceIP is an IP address assigned to the Kubernetes DNS service. It must be within the Kubernetes service address range specified in serviceCidr. - type: string - loadBalancerSKU: - description: LoadBalancerSKU is the SKU of the loadBalancer to be provisioned. - enum: - - Basic - - Standard - type: string - location: - description: 'Location is a string matching one of the canonical Azure region names. Examples: "westus2", "eastus".' - type: string - networkPlugin: - description: NetworkPlugin used for building Kubernetes network. - enum: - - azure - - kubenet - type: string - networkPolicy: - description: NetworkPolicy used for building Kubernetes network. - enum: - - azure - - calico - type: string - nodeResourceGroupName: - description: NodeResourceGroupName is the name of the resource group containing cluster IaaS resources. Will be populated to default in webhook. - type: string - resourceGroupName: - description: ResourceGroupName is the name of the Azure resource group for this AKS Cluster. - type: string - sshPublicKey: - description: SSHPublicKey is a string literal containing an ssh public key base64 encoded. - type: string - subscriptionID: - description: SubscriotionID is the GUID of the Azure subscription to hold this cluster. - type: string - version: - description: Version defines the desired Kubernetes version. - minLength: 2 - type: string - virtualNetwork: - description: VirtualNetwork describes the vnet for the AKS cluster. Will be created if it does not exist. - properties: - cidrBlock: - type: string - name: - type: string - subnet: - description: ManagedControlPlaneSubnet describes a subnet for an AKS cluster. - properties: - cidrBlock: - type: string - name: - type: string - required: - - cidrBlock - - name - type: object - required: - - cidrBlock - - name - type: object - required: - - location - - nodeResourceGroupName - - resourceGroupName - - sshPublicKey - - version - type: object - status: - description: AzureManagedControlPlaneStatus defines the observed state of AzureManagedControlPlane. - properties: - initialized: - description: Initialized is true when the the control plane is available for initial contact. This may occur before the control plane is fully ready. In the AzureManagedControlPlane implementation, these are identical. - type: boolean - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureManagedControlPlane is the Schema for the azuremanagedcontrolplanes API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedControlPlaneSpec defines the desired state of AzureManagedControlPlane. - properties: - aadProfile: - description: AadProfile is Azure Active Directory configuration to integrate with AKS for aad authentication. - properties: - adminGroupObjectIDs: - description: AdminGroupObjectIDs - AAD group object IDs that will have admin role of the cluster. - items: - type: string - type: array - managed: - description: Managed - Whether to enable managed AAD. - type: boolean - required: - - adminGroupObjectIDs - - managed - type: object - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure resources managed by the Azure provider, in addition to the ones added by default. - type: object - apiServerAccessProfile: - description: APIServerAccessProfile is the access profile for AKS API server. - properties: - authorizedIPRanges: - description: AuthorizedIPRanges - Authorized IP Ranges to kubernetes API server. - items: - type: string - type: array - enablePrivateCluster: - description: EnablePrivateCluster - Whether to create the cluster as a private cluster or not. - type: boolean - enablePrivateClusterPublicFQDN: - description: EnablePrivateClusterPublicFQDN - Whether to create additional public FQDN for private cluster or not. - type: boolean - privateDNSZone: - description: PrivateDNSZone - Private dns zone mode for private cluster. - enum: - - System - - None - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - dnsServiceIP: - description: DNSServiceIP is an IP address assigned to the Kubernetes DNS service. It must be within the Kubernetes service address range specified in serviceCidr. - type: string - identityRef: - description: IdentityRef is a reference to a AzureClusterIdentity to be used when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - loadBalancerProfile: - description: LoadBalancerProfile is the profile of the cluster load balancer. - properties: - allocatedOutboundPorts: - description: AllocatedOutboundPorts - Desired number of allocated SNAT ports per VM. Allowed values must be in the range of 0 to 64000 (inclusive). The default value is 0 which results in Azure dynamically allocating ports. - format: int32 - type: integer - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes - Desired outbound flow idle timeout in minutes. Allowed values must be in the range of 4 to 120 (inclusive). The default value is 30 minutes. - format: int32 - type: integer - managedOutboundIPs: - description: ManagedOutboundIPs - Desired managed outbound IPs for the cluster load balancer. - format: int32 - type: integer - outboundIPPrefixes: - description: OutboundIPPrefixes - Desired outbound IP Prefix resources for the cluster load balancer. - items: - type: string - type: array - outboundIPs: - description: OutboundIPs - Desired outbound IP resources for the cluster load balancer. - items: - type: string - type: array - type: object - loadBalancerSKU: - description: LoadBalancerSKU is the SKU of the loadBalancer to be provisioned. - enum: - - Basic - - Standard - type: string - location: - description: 'Location is a string matching one of the canonical Azure region names. Examples: "westus2", "eastus".' - type: string - networkPlugin: - description: NetworkPlugin used for building Kubernetes network. - enum: - - azure - - kubenet - type: string - networkPolicy: - description: NetworkPolicy used for building Kubernetes network. - enum: - - azure - - calico - type: string - nodeResourceGroupName: - description: NodeResourceGroupName is the name of the resource group containing cluster IaaS resources. Will be populated to default in webhook. - type: string - resourceGroupName: - description: ResourceGroupName is the name of the Azure resource group for this AKS Cluster. - type: string - sku: - description: SKU is the SKU of the AKS to be provisioned. - properties: - tier: - description: Tier - Tier of a managed cluster SKU. - enum: - - Free - - Paid - type: string - required: - - tier - type: object - sshPublicKey: - description: SSHPublicKey is a string literal containing an ssh public key base64 encoded. - type: string - subscriptionID: - description: SubscriptionID is the GUID of the Azure subscription to hold this cluster. - type: string - version: - description: Version defines the desired Kubernetes version. - minLength: 2 - type: string - virtualNetwork: - description: VirtualNetwork describes the vnet for the AKS cluster. Will be created if it does not exist. - properties: - cidrBlock: - type: string - name: - type: string - subnet: - description: ManagedControlPlaneSubnet describes a subnet for an AKS cluster. - properties: - cidrBlock: - type: string - name: - type: string - required: - - cidrBlock - - name - type: object - required: - - cidrBlock - - name - type: object - required: - - location - - resourceGroupName - - sshPublicKey - - version - type: object - status: - description: AzureManagedControlPlaneStatus defines the observed state of AzureManagedControlPlane. - properties: - initialized: - description: Initialized is true when the the control plane is available for initial contact. This may occur before the control plane is fully ready. In the AzureManagedControlPlane implementation, these are identical. - type: boolean - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure long-running operations so they can be continued on the next reconciliation loop. - items: - description: Future contains the data needed for an Azure long-running operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. Together with the service name, this forms the unique identifier for the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together with the name of the resource, this forms the unique identifier for the future. - type: string - type: - description: Type describes the type of future, such as update, create, delete, etc. - type: string - required: - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureManagedControlPlane is the Schema for the azuremanagedcontrolplanes API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedControlPlaneSpec defines the desired state of AzureManagedControlPlane. - properties: - aadProfile: - description: AadProfile is Azure Active Directory configuration to integrate with AKS for aad authentication. - properties: - adminGroupObjectIDs: - description: AdminGroupObjectIDs - AAD group object IDs that will have admin role of the cluster. - items: - type: string - type: array - managed: - description: Managed - Whether to enable managed AAD. - type: boolean - required: - - adminGroupObjectIDs - - managed - type: object - additionalTags: - additionalProperties: - type: string - description: AdditionalTags is an optional set of tags to add to Azure resources managed by the Azure provider, in addition to the ones added by default. - type: object - addonProfiles: - description: AddonProfiles are the profiles of managed cluster add-on. - items: - description: AddonProfile represents a managed cluster add-on. - properties: - config: - additionalProperties: - type: string - description: Config - Key-value pairs for configuring the add-on. - type: object - enabled: - description: Enabled - Whether the add-on is enabled or not. - type: boolean - name: - description: Name - The name of the managed cluster add-on. - type: string - required: - - enabled - - name - type: object - type: array - apiServerAccessProfile: - description: APIServerAccessProfile is the access profile for AKS API server. - properties: - authorizedIPRanges: - description: AuthorizedIPRanges - Authorized IP Ranges to kubernetes API server. - items: - type: string - type: array - enablePrivateCluster: - description: EnablePrivateCluster - Whether to create the cluster as a private cluster or not. - type: boolean - enablePrivateClusterPublicFQDN: - description: EnablePrivateClusterPublicFQDN - Whether to create additional public FQDN for private cluster or not. - type: boolean - privateDNSZone: - description: PrivateDNSZone - Private dns zone mode for private cluster. - enum: - - System - - None - type: string - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - dnsServiceIP: - description: DNSServiceIP is an IP address assigned to the Kubernetes DNS service. It must be within the Kubernetes service address range specified in serviceCidr. - type: string - identityRef: - description: IdentityRef is a reference to a AzureClusterIdentity to be used when reconciling this cluster - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - loadBalancerProfile: - description: LoadBalancerProfile is the profile of the cluster load balancer. - properties: - allocatedOutboundPorts: - description: AllocatedOutboundPorts - Desired number of allocated SNAT ports per VM. Allowed values must be in the range of 0 to 64000 (inclusive). The default value is 0 which results in Azure dynamically allocating ports. - format: int32 - type: integer - idleTimeoutInMinutes: - description: IdleTimeoutInMinutes - Desired outbound flow idle timeout in minutes. Allowed values must be in the range of 4 to 120 (inclusive). The default value is 30 minutes. - format: int32 - type: integer - managedOutboundIPs: - description: ManagedOutboundIPs - Desired managed outbound IPs for the cluster load balancer. - format: int32 - type: integer - outboundIPPrefixes: - description: OutboundIPPrefixes - Desired outbound IP Prefix resources for the cluster load balancer. - items: - type: string - type: array - outboundIPs: - description: OutboundIPs - Desired outbound IP resources for the cluster load balancer. - items: - type: string - type: array - type: object - loadBalancerSKU: - description: LoadBalancerSKU is the SKU of the loadBalancer to be provisioned. - enum: - - Basic - - Standard - type: string - location: - description: 'Location is a string matching one of the canonical Azure region names. Examples: "westus2", "eastus".' - type: string - networkPlugin: - description: NetworkPlugin used for building Kubernetes network. - enum: - - azure - - kubenet - type: string - networkPolicy: - description: NetworkPolicy used for building Kubernetes network. - enum: - - azure - - calico - type: string - nodeResourceGroupName: - description: NodeResourceGroupName is the name of the resource group containing cluster IaaS resources. Will be populated to default in webhook. - type: string - resourceGroupName: - description: ResourceGroupName is the name of the Azure resource group for this AKS Cluster. - type: string - sku: - description: SKU is the SKU of the AKS to be provisioned. - properties: - tier: - description: Tier - Tier of a managed cluster SKU. - enum: - - Free - - Paid - type: string - required: - - tier - type: object - sshPublicKey: - description: SSHPublicKey is a string literal containing an ssh public key base64 encoded. - type: string - subscriptionID: - description: SubscriptionID is the GUID of the Azure subscription to hold this cluster. - type: string - version: - description: Version defines the desired Kubernetes version. - minLength: 2 - type: string - virtualNetwork: - description: VirtualNetwork describes the vnet for the AKS cluster. Will be created if it does not exist. - properties: - cidrBlock: - type: string - name: - type: string - resourceGroup: - description: ResourceGroup is the name of the Azure resource group for the VNet and Subnet. - type: string - subnet: - description: ManagedControlPlaneSubnet describes a subnet for an AKS cluster. - properties: - cidrBlock: - type: string - name: - type: string - serviceEndpoints: - description: ServiceEndpoints is a slice of Virtual Network service endpoints to enable for the subnets. - items: - description: ServiceEndpointSpec configures an Azure Service Endpoint. - properties: - locations: - items: - type: string - type: array - service: - type: string - required: - - locations - - service - type: object - type: array - x-kubernetes-list-map-keys: - - service - x-kubernetes-list-type: map - required: - - cidrBlock - - name - type: object - required: - - cidrBlock - - name - type: object - required: - - location - - resourceGroupName - - sshPublicKey - - version - type: object - status: - description: AzureManagedControlPlaneStatus defines the observed state of AzureManagedControlPlane. - properties: - conditions: - description: Conditions defines current service state of the AzureManagedControlPlane. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - initialized: - description: Initialized is true when the control plane is available for initial contact. This may occur before the control plane is fully ready. In the AzureManagedControlPlane implementation, these are identical. - type: boolean - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure long-running operations so they can be continued on the next reconciliation loop. - items: - description: Future contains the data needed for an Azure long-running operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. Together with the service name, this forms the unique identifier for the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together with the name of the resource, this forms the unique identifier for the future. - type: string - type: - description: Type describes the type of future, such as update, create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-azure - cluster.x-k8s.io/v1beta1: v1beta1 - name: azuremanagedmachinepools.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: AzureManagedMachinePool - listKind: AzureManagedMachinePoolList - plural: azuremanagedmachinepools - shortNames: - - ammp - singular: azuremanagedmachinepool - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: AzureManagedMachinePool is the Schema for the azuremanagedmachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedMachinePoolSpec defines the desired state of AzureManagedMachinePool. - properties: - mode: - description: 'Mode - represents mode of an agent pool. Possible values include: System, User.' - enum: - - System - - User - type: string - osDiskSizeGB: - description: OSDiskSizeGB is the disk size for every machine in this agent pool. If you specify 0, it will apply the default osDisk size according to the vmSize specified. - format: int32 - type: integer - providerIDList: - description: ProviderIDList is the unique identifier as specified by the cloud provider. - items: - type: string - type: array - sku: - description: SKU is the size of the VMs in the node pool. - type: string - required: - - mode - - sku - type: object - status: - description: AzureManagedMachinePoolStatus defines the observed state of AzureManagedMachinePool. - properties: - errorMessage: - description: Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output. - type: string - errorReason: - description: Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: AzureManagedMachinePool is the Schema for the azuremanagedmachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedMachinePoolSpec defines the desired state of AzureManagedMachinePool. - properties: - mode: - description: 'Mode - represents mode of an agent pool. Possible values include: System, User.' - enum: - - System - - User - type: string - name: - description: Name - name of the agent pool. If not specified, CAPZ uses the name of the CR as the agent pool name. - type: string - osDiskSizeGB: - description: OSDiskSizeGB is the disk size for every machine in this agent pool. If you specify 0, it will apply the default osDisk size according to the vmSize specified. - format: int32 - type: integer - providerIDList: - description: ProviderIDList is the unique identifier as specified by the cloud provider. - items: - type: string - type: array - sku: - description: SKU is the size of the VMs in the node pool. - type: string - required: - - mode - - sku - type: object - status: - description: AzureManagedMachinePoolStatus defines the observed state of AzureManagedMachinePool. - properties: - errorMessage: - description: Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output. - type: string - errorReason: - description: Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - jsonPath: .spec.mode - name: Mode - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: AzureManagedMachinePool is the Schema for the azuremanagedmachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzureManagedMachinePoolSpec defines the desired state of AzureManagedMachinePool. - properties: - availabilityZones: - description: AvailabilityZones - Availability zones for nodes. Must use VirtualMachineScaleSets AgentPoolType. - items: - type: string - type: array - enableNodePublicIP: - description: EnableNodePublicIP controls whether or not nodes in the pool each have a public IP address. - type: boolean - enableUltraSSD: - description: EnableUltraSSD enables the storage type UltraSSD_LRS for the agent pool. - type: boolean - maxPods: - description: MaxPods specifies the kubelet --max-pods configuration for the node pool. - format: int32 - type: integer - mode: - description: 'Mode - represents mode of an agent pool. Possible values include: System, User.' - enum: - - System - - User - type: string - name: - description: Name - name of the agent pool. If not specified, CAPZ uses the name of the CR as the agent pool name. - type: string - nodeLabels: - additionalProperties: - type: string - description: Node labels - labels for all of the nodes present in node pool - type: object - nodePublicIPPrefixID: - description: NodePublicIPPrefixID specifies the public IP prefix resource ID which VM nodes should use IPs from. - type: string - osDiskSizeGB: - description: OSDiskSizeGB is the disk size for every machine in this agent pool. If you specify 0, it will apply the default osDisk size according to the vmSize specified. - format: int32 - type: integer - osDiskType: - default: Managed - description: OsDiskType specifies the OS disk type for each node in the pool. Allowed values are 'Ephemeral' and 'Managed'. - enum: - - Ephemeral - - Managed - type: string - osType: - description: 'OSType specifies the virtual machine operating system. Default to Linux. Possible values include: ''Linux'', ''Windows''' - enum: - - Linux - - Windows - type: string - providerIDList: - description: ProviderIDList is the unique identifier as specified by the cloud provider. - items: - type: string - type: array - scaleSetPriority: - description: 'ScaleSetPriority specifies the ScaleSetPriority value. Default to Regular. Possible values include: ''Regular'', ''Spot''' - enum: - - Regular - - Spot - type: string - scaling: - description: Scaling specifies the autoscaling parameters for the node pool. - properties: - maxSize: - format: int32 - type: integer - minSize: - format: int32 - type: integer - type: object - sku: - description: SKU is the size of the VMs in the node pool. - type: string - taints: - description: Taints specifies the taints for nodes present in this agent pool. - items: - description: Taint represents a Kubernetes taint. - properties: - effect: - description: Effect specifies the effect for the taint - enum: - - NoSchedule - - NoExecute - - PreferNoSchedule - type: string - key: - description: Key is the key of the taint - type: string - value: - description: Value is the value of the taint - type: string - required: - - effect - - key - - value - type: object - type: array - required: - - mode - - sku - type: object - status: - description: AzureManagedMachinePoolStatus defines the observed state of AzureManagedMachinePool. - properties: - conditions: - description: Conditions defines current service state of the AzureManagedControlPlane. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - errorMessage: - description: Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output. - type: string - errorReason: - description: Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output. - type: string - longRunningOperationStates: - description: LongRunningOperationStates saves the states for Azure long-running operations so they can be continued on the next reconciliation loop. - items: - description: Future contains the data needed for an Azure long-running operation to continue across reconcile loops. - properties: - data: - description: Data is the base64 url encoded json Azure AutoRest Future. - type: string - name: - description: Name is the name of the Azure resource. Together with the service name, this forms the unique identifier for the future. - type: string - resourceGroup: - description: ResourceGroup is the Azure resource group for the resource. - type: string - serviceName: - description: ServiceName is the name of the Azure service. Together with the name of the resource, this forms the unique identifier for the future. - type: string - type: - description: Type describes the type of future, such as update, create, delete, etc. - type: string - required: - - data - - name - - serviceName - - type - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - api-approved.kubernetes.io: unapproved - controller-gen.kubebuilder.io/version: v0.5.0 - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: azurepodidentityexceptions.aadpodidentity.k8s.io -spec: - group: aadpodidentity.k8s.io - names: - kind: AzurePodIdentityException - listKind: AzurePodIdentityExceptionList - plural: azurepodidentityexceptions - singular: azurepodidentityexception - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: AzurePodIdentityException contains the pod selectors for all pods that don't require NMI to process and request token on their behalf. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AzurePodIdentityExceptionSpec matches pods with the selector defined. If request originates from a pod that matches the selector, nmi will proxy the request and send response back without any validation. - properties: - metadata: - type: object - podLabels: - additionalProperties: - type: string - type: object - type: object - status: - description: AzurePodIdentityExceptionStatus contains the status of an AzurePodIdentityException. - properties: - metadata: - type: object - status: - type: string - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-manager - namespace: capz-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-leader-election-role - namespace: capz-system -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-aad-pod-id-nmi-role -rules: -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - get - - list -- apiGroups: - - "" - resources: - - pods - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - get -- apiGroups: - - aadpodidentity.k8s.io - resources: - - azureidentitybindings - - azureidentities - - azurepodidentityexceptions - verbs: - - '*' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-manager-role -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - namespaces - verbs: - - list -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - aadpodidentity.k8s.io - resources: - - azureidentities - - azureidentities/status - verbs: - - get - - list - - watch -- apiGroups: - - aadpodidentity.k8s.io - resources: - - azureidentitybindings - - azureidentitybindings/status - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - patch - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - - machinepools/status - verbs: - - get - - list - - patch - - update - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/status - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - nodes - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azureclusteridentities - - azureclusteridentities/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azureclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azureclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachinepoolmachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachinepoolmachines/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachinepools/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachines/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremachinetemplates - - azuremachinetemplates/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedcontrolplanes - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedcontrolplanes/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedmachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - azuremanagedmachinepools/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-leader-election-rolebinding - namespace: capz-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capz-leader-election-role -subjects: -- kind: ServiceAccount - name: capz-manager - namespace: capz-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - k8s-app: capz-aad-pod-id-nmi-binding - name: capz-aad-pod-id-nmi-binding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capz-aad-pod-id-nmi-role -subjects: -- kind: ServiceAccount - name: capz-manager - namespace: capz-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capz-manager-role -subjects: -- kind: ServiceAccount - name: capz-manager - namespace: capz-system ---- -apiVersion: v1 -data: - client-id: ${AZURE_CLIENT_ID_B64:=""} - client-secret: ${AZURE_CLIENT_SECRET_B64:=""} - subscription-id: ${AZURE_SUBSCRIPTION_ID_B64:=""} - tenant-id: ${AZURE_TENANT_ID_B64:=""} -kind: Secret -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-manager-bootstrap-credentials - namespace: capz-system -type: Opaque ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-webhook-service - namespace: capz-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-azure ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - aadpodidbinding: capz-controller-aadpodidentity-selector - cluster.x-k8s.io/provider: infrastructure-azure - control-plane: capz-controller-manager - name: capz-controller-manager - namespace: capz-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-azure - control-plane: capz-controller-manager - template: - metadata: - annotations: - kubectl.kubernetes.io/default-container: manager - labels: - aadpodidbinding: capz-controller-aadpodidentity-selector - cluster.x-k8s.io/provider: infrastructure-azure - control-plane: capz-controller-manager - spec: - containers: - - args: - - --leader-elect - - --metrics-bind-addr=localhost:8080 - - --feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},AKS=${EXP_AKS:=false} - - --v=0 - env: - - name: AZURE_SUBSCRIPTION_ID - valueFrom: - secretKeyRef: - key: subscription-id - name: capz-manager-bootstrap-credentials - - name: AZURE_TENANT_ID - valueFrom: - secretKeyRef: - key: tenant-id - name: capz-manager-bootstrap-credentials - - name: AZURE_CLIENT_ID - valueFrom: - secretKeyRef: - key: client-id - name: capz-manager-bootstrap-credentials - - name: AZURE_CLIENT_SECRET - valueFrom: - secretKeyRef: - key: client-secret - name: capz-manager-bootstrap-credentials - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: HTTP_PROXY - value: ${TKG_HTTP_PROXY} - - name: HTTPS_PROXY - value: ${TKG_HTTPS_PROXY} - - name: NO_PROXY - value: ${TKG_NO_PROXY} - image: registry.tkg.vmware.run/cluster-api/cluster-api-azure-controller:${CAPZ_CONTROLLER_IMAGE_TAG} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - initialDelaySeconds: 10 - periodSeconds: 10 - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - initialDelaySeconds: 10 - periodSeconds: 10 - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - serviceAccountName: capz-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: capz-webhook-service-cert - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - component: nmi - k8s-app: aad-pod-id - tier: node - name: capz-nmi - namespace: capz-system -spec: - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-azure - component: nmi - tier: node - template: - metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - component: nmi - tier: node - spec: - containers: - - args: - - --node=$(NODE_NAME) - - --operation-mode=managed - - --forceNamespaced - - --http-probe-port=8085 - env: - - name: FORCENAMESPACED - value: "true" - - name: HOST_IP - valueFrom: - fieldRef: - fieldPath: status.podIP - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: LOG_LEVEL - value: DEBUG - image: registry.tkg.vmware.run/cluster-api/nmi:${NMI_IMAGE_TAG} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: 8085 - initialDelaySeconds: 10 - periodSeconds: 5 - name: nmi - resources: - limits: - cpu: 200m - memory: 512Mi - requests: - cpu: 100m - memory: 256Mi - securityContext: - capabilities: - add: - - DAC_READ_SEARCH - - NET_ADMIN - - NET_RAW - drop: - - ALL - runAsUser: 0 - volumeMounts: - - mountPath: /run/xtables.lock - name: iptableslock - - mountPath: /etc/default - name: default-path - readOnly: true - - mountPath: /etc/default/kubelet - name: kubelet-config - readOnly: true - dnsPolicy: ClusterFirstWithHostNet - hostNetwork: true - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: capz-manager - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - hostPath: - path: /run/xtables.lock - type: FileOrCreate - name: iptableslock - - hostPath: - path: /etc/default - type: DirectoryOrCreate - name: default-path - - hostPath: - path: /etc/default/kubelet - type: FileOrCreate - name: kubelet-config - updateStrategy: - type: RollingUpdate ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-serving-cert - namespace: capz-system -spec: - dnsNames: - - capz-webhook-service.capz-system.svc - - capz-webhook-service.capz-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capz-selfsigned-issuer - secretName: capz-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-selfsigned-issuer - namespace: capz-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azurecluster - failurePolicy: Fail - matchPolicy: Equivalent - name: default.azurecluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azureclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azureclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: default.azureclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azureclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: default.azuremachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: default.azuremachinetemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachinetemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachinepool - failurePolicy: Fail - name: default.azuremachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azuremanagedcontrolplane - failurePolicy: Fail - name: default.azuremanagedcontrolplanes.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremanagedcontrolplanes - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-azuremanagedmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: default.azuremanagedmachinepools.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremanagedmachinepools - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capz-system/capz-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-azure - name: capz-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azurecluster - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.azurecluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azureclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azureclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.azureclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azureclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.azuremachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.azuremachinetemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachinetemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachinepool - failurePolicy: Fail - name: validation.azuremachinepool.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachinepools - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremachinepoolmachine - failurePolicy: Fail - name: azuremachinepoolmachine.kb.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremachinepoolmachines - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremanagedcluster - failurePolicy: Fail - name: validation.azuremanagedclusters.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - UPDATE - resources: - - azuremanagedclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremanagedcontrolplane - failurePolicy: Fail - name: validation.azuremanagedcontrolplanes.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - azuremanagedcontrolplanes - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capz-webhook-service - namespace: capz-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-azuremanagedmachinepool - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.azuremanagedmachinepools.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - UPDATE - - DELETE - resources: - - azuremanagedmachinepools - sideEffects: None diff --git a/providers/infrastructure-azure/v1.6.3/metadata.yaml b/providers/infrastructure-azure/v1.6.3/metadata.yaml deleted file mode 100644 index a629ee576e..0000000000 --- a/providers/infrastructure-azure/v1.6.3/metadata.yaml +++ /dev/null @@ -1,32 +0,0 @@ -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -releaseSeries: -- major: 0 - minor: 3 - contract: v1alpha2 -- major: 0 - minor: 4 - contract: v1alpha3 -- major: 0 - minor: 5 - contract: v1alpha4 -- major: 1 - minor: 0 - contract: v1beta1 -- major: 1 - minor: 1 - contract: v1beta1 -- major: 1 - minor: 2 - contract: v1beta1 -- major: 1 - minor: 3 - contract: v1beta1 -- major: 1 - minor: 4 - contract: v1beta1 -- major: 1 - minor: 5 - contract: v1beta1 -- major: 1 - minor: 6 - contract: v1beta1 diff --git a/providers/infrastructure-azure/v1.6.3/ytt/base-template.yaml b/providers/infrastructure-azure/v1.6.3/ytt/base-template.yaml deleted file mode 100644 index f8d31289d3..0000000000 --- a/providers/infrastructure-azure/v1.6.3/ytt/base-template.yaml +++ /dev/null @@ -1,226 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: ${CLUSTER_NAME} - labels: - tkg.tanzu.vmware.com/cluster-name: '${ CLUSTER_NAME }' -spec: - clusterNetwork: - pods: - cidrBlocks: ["${CLUSTER_CIDR}"] - services: - cidrBlocks: ["${SERVICE_CIDR}"] - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: ${CLUSTER_NAME}-control-plane - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureCluster - name: ${CLUSTER_NAME} ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureCluster -metadata: - name: ${CLUSTER_NAME} -spec: - location: ${AZURE_LOCATION} - azureEnvironment: ${AZURE_ENVIRONMENT} - networkSpec: - vnet: - name: "${AZURE_VNET_NAME:=${CLUSTER_NAME}-vnet}" - resourceGroup: ${AZURE_VNET_RESOURCE_GROUP:=${CLUSTER_NAME}} - cidrBlock: ${AZURE_VNET_CIDR} - subnets: - - name: ${AZURE_CONTROL_PLANE_SUBNET_NAME} - role: control-plane - cidrBlock: ${AZURE_CONTROL_PLANE_SUBNET_CIDR} - - name: ${AZURE_NODE_SUBNET_NAME} - role: node - cidrBlock: ${AZURE_NODE_SUBNET_CIDR} - resourceGroup: ${AZURE_RESOURCE_GROUP:=${CLUSTER_NAME}} - subscriptionID: ${AZURE_SUBSCRIPTION_ID} ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - name: ${CLUSTER_NAME}-control-plane -spec: - kubeadmConfigSpec: - clusterConfiguration: - imageRepository: registry.tkg.vmware.run - etcd: - local: - dataDir: /var/lib/etcddisk/etcd - imageRepository: registry.tkg.vmware.run - imageTag: v3.4.3_vmware.4 - extraArgs: - quota-backend-bytes: "8589934592" - cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - dns: - imageRepository: registry.tkg.vmware.run - imageTag: v1.6.5_vmware.4 - apiServer: - extraArgs: - cloud-config: /etc/kubernetes/azure.json - cloud-provider: azure - extraVolumes: - - hostPath: /etc/kubernetes/azure.json - mountPath: /etc/kubernetes/azure.json - name: cloud-config - readOnly: true - timeoutForControlPlane: 20m - controllerManager: - extraArgs: - allocate-node-cidrs: "true" - cloud-config: /etc/kubernetes/azure.json - cloud-provider: azure - cluster-name: ${CLUSTER_NAME} - extraVolumes: - - hostPath: /etc/kubernetes/azure.json - mountPath: /etc/kubernetes/azure.json - name: cloud-config - readOnly: true - diskSetup: - filesystems: - - device: /dev/disk/azure/scsi1/lun0 - extraOpts: - - -E - - lazy_itable_init=1,lazy_journal_init=1 - filesystem: ext4 - label: etcd_disk - - device: ephemeral0.1 - filesystem: ext4 - label: ephemeral0 - replaceFS: ntfs - partitions: - - device: /dev/disk/azure/scsi1/lun0 - layout: true - overwrite: false - tableType: gpt - files: - - contentFrom: - secret: - key: control-plane-azure.json - name: ${CLUSTER_NAME}-control-plane-azure-json - owner: root:root - path: /etc/kubernetes/azure.json - permissions: "0644" - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - azure-container-registry-config: /etc/kubernetes/azure.json - cloud-config: /etc/kubernetes/azure.json - cloud-provider: azure - name: '{{ ds.meta_data["local_hostname"] }}' - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - azure-container-registry-config: /etc/kubernetes/azure.json - cloud-config: /etc/kubernetes/azure.json - cloud-provider: azure - name: '{{ ds.meta_data["local_hostname"] }}' - mounts: - - - LABEL=etcd_disk - - /var/lib/etcddisk - useExperimentalRetryJoin: true - postKubeadmCommands: [] - preKubeadmCommands: [] - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - name: ${CLUSTER_NAME}-control-plane - replicas: ${CONTROL_PLANE_MACHINE_COUNT} - version: ${KUBERNETES_VERSION} ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureMachineTemplate -metadata: - name: ${CLUSTER_NAME}-control-plane -spec: - template: - spec: - dataDisks: - - diskSizeGB: 256 - lun: 0 - nameSuffix: etcddisk - osDisk: - diskSizeGB: 128 - managedDisk: - storageAccountType: Premium_LRS - osType: Linux - sshPublicKey: ${AZURE_SSH_PUBLIC_KEY_B64:=""} - vmSize: ${AZURE_CONTROL_PLANE_MACHINE_TYPE} ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - name: ${CLUSTER_NAME}-md-0 -spec: - clusterName: ${CLUSTER_NAME} - replicas: ${WORKER_MACHINE_COUNT} - selector: - matchLabels: null - strategy: - type: RollingUpdate - template: - metadata: - labels: - node-pool: "${CLUSTER_NAME}-worker-pool" - spec: - bootstrap: - configRef: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: ${CLUSTER_NAME}-md-0 - clusterName: ${CLUSTER_NAME} - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - name: ${CLUSTER_NAME}-md-0 - version: ${KUBERNETES_VERSION} - failureDomain: "${AZURE_NODE_AZ}" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureMachineTemplate -metadata: - name: ${CLUSTER_NAME}-md-0 -spec: - template: - spec: - osDisk: - diskSizeGB: 128 - managedDisk: - storageAccountType: Premium_LRS - osType: Linux - sshPublicKey: ${AZURE_SSH_PUBLIC_KEY_B64:=""} - vmSize: ${AZURE_NODE_MACHINE_TYPE} ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: ${CLUSTER_NAME}-md-0 -spec: - template: - spec: - files: - - contentFrom: - secret: - key: worker-node-azure.json - name: ${CLUSTER_NAME}-md-0-azure-json - owner: root:root - path: /etc/kubernetes/azure.json - permissions: "0644" - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - azure-container-registry-config: /etc/kubernetes/azure.json - cloud-config: /etc/kubernetes/azure.json - cloud-provider: azure - name: '{{ ds.meta_data["local_hostname"] }}' - useExperimentalRetryJoin: true - preKubeadmCommands: [] diff --git a/providers/infrastructure-azure/v1.6.3/ytt/overlay.yaml b/providers/infrastructure-azure/v1.6.3/ytt/overlay.yaml deleted file mode 100644 index 4db8903c2c..0000000000 --- a/providers/infrastructure-azure/v1.6.3/ytt/overlay.yaml +++ /dev/null @@ -1,361 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:json", "json") -#@ load("@ytt:base64", "base64") - -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_azure_image", "verify_and_configure_machine_deployment_rollout_strategy") -#@ load("lib/validate.star", "validate_configuration") - -#@ validate_configuration("azure") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - -#@ def get_custom_tags(): -#@ tags = {} -#@ custom_tags = data.values.AZURE_CUSTOM_TAGS.split(",") if data.values.AZURE_CUSTOM_TAGS else [] -#@ for tag in custom_tags: -#@ tag_entry = tag.split('=', 1) -#@ tags[tag_entry[0].strip()] = tag_entry[1].strip() if len(tag_entry) >= 2 else "" -#@ end -#@ return tags -#@ end - -#@ def get_identity_name(): -#@ if data.values.TKG_CLUSTER_ROLE == "management": -#@ return data.values.AZURE_IDENTITY_NAME or "{}-identity".format(data.values.CLUSTER_NAME) -#@ end -#@ -#@ return data.values.AZURE_IDENTITY_NAME -#@ end - -#@ def get_identity_namespace(): -#@ if data.values.TKG_CLUSTER_ROLE == "management": -#@ return "tkg-system" -#@ end -#@ -#@ return data.values.AZURE_IDENTITY_NAMESPACE -#@ end - -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: #@ data.values.CLUSTER_NAME - labels: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - cluster-role.tkg.tanzu.vmware.com/(@= data.values.TKG_CLUSTER_ROLE @): "" - #@ end - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - #@overlay/match missing_ok=True - tanzuKubernetesRelease: #@ data.values.KUBERNETES_RELEASE -spec: - clusterNetwork: - #@ if data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - apiServerPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - pods: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.CLUSTER_CIDR - services: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.SERVICE_CIDR - controlPlaneRef: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - infrastructureRef: - name: #@ data.values.CLUSTER_NAME - -#@overlay/match by=overlay.subset({"kind":"AzureCluster"}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureCluster -metadata: - name: #@ data.values.CLUSTER_NAME -spec: - #@ if len(get_custom_tags()) != 0: - #@overlay/match missing_ok=True - additionalTags: #@ get_custom_tags() - #@ end - azureEnvironment: #@ data.values.AZURE_ENVIRONMENT - location: #@ data.values.AZURE_LOCATION - networkSpec: - vnet: - name: #@ data.values.AZURE_VNET_NAME or "{}-vnet".format(data.values.CLUSTER_NAME) - resourceGroup: #@ data.values.AZURE_VNET_RESOURCE_GROUP or data.values.AZURE_RESOURCE_GROUP or data.values.CLUSTER_NAME - #@overlay/remove - cidrBlock: - #@overlay/match missing_ok=True - cidrBlocks: - - #@ data.values.AZURE_VNET_CIDR - subnets: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - name: #@ data.values.AZURE_CONTROL_PLANE_SUBNET_NAME - role: control-plane - cidrBlocks: - - #@ data.values.AZURE_CONTROL_PLANE_SUBNET_CIDR - #@ if len(data.values.AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP) != 0: - #@overlay/match missing_ok=True - securityGroup: #@ data.values.AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP - #@ end - #@overlay/match by=overlay.index(1) - #@overlay/replace - - name: #@ data.values.AZURE_NODE_SUBNET_NAME - role: node - cidrBlocks: - - #@ data.values.AZURE_NODE_SUBNET_CIDR - #@ if len(data.values.AZURE_NODE_SUBNET_SECURITY_GROUP) != 0: - #@overlay/match missing_ok=True - securityGroup: #@ data.values.AZURE_NODE_SUBNET_SECURITY_GROUP - #@ end - #@ if data.values.AZURE_ENABLE_PRIVATE_CLUSTER: - #@overlay/match missing_ok=True - apiServerLB: - type: Internal - frontendIPs: - - name: #@ "lb-{}-ip-frontend".format(data.values.CLUSTER_NAME) - privateIP: #@ data.values.AZURE_FRONTEND_PRIVATE_IP - - #@ if data.values.AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB: - #@overlay/match missing_ok=True - controlPlaneOutboundLB: - frontendIPsCount: #@ data.values.AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT - #@ end - - #@ if data.values.AZURE_ENABLE_NODE_OUTBOUND_LB: - #@overlay/match missing_ok=True - nodeOutboundLB: - frontendIPsCount: #@ data.values.AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT - idleTimeoutInMinutes: #@ data.values.AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES - #@ end - - #@ end - resourceGroup: #@ data.values.AZURE_RESOURCE_GROUP or data.values.CLUSTER_NAME - subscriptionID: #@ data.values.AZURE_SUBSCRIPTION_ID - #@ if data.values.TKG_CLUSTER_ROLE == "management" or data.values.AZURE_IDENTITY_NAME: - #@overlay/match missing_ok=True - identityRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureClusterIdentity - name: #@ get_identity_name() - namespace: #@ get_identity_namespace() - #@ end - -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) -spec: - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - kubeadmConfigSpec: - initConfiguration: - #@ if data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - localAPIEndpoint: - advertiseAddress: '0.0.0.0' - bindPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - joinConfiguration: - #@ if data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - controlPlane: - localAPIEndpoint: - advertiseAddress: '0.0.0.0' - bindPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - #@ if data.values.AZURE_ENABLE_PRIVATE_CLUSTER: - #@overlay/match missing_ok=True - preKubeadmCommands: - - #@ "if [ -f /tmp/kubeadm.yaml ] || [ -f /run/kubeadm/kubeadm.yaml ]; then echo '127.0.0.1 apiserver.{}.capz.io apiserver' >> /etc/hosts; fi".format(data.values.CLUSTER_NAME) - - #@overlay/match missing_ok=True - postKubeadmCommands: - - #@ "if [ -f /tmp/kubeadm-join-config.yaml ] || [ -f /run/kubeadm/kubeadm-join-config.yaml ]; then echo '127.0.0.1 apiserver.{}.capz.io apiserver' >> /etc/hosts; fi".format(data.values.CLUSTER_NAME) - #@ end - clusterConfiguration: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.imageRepository) - etcd: - local: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local.imageRepository) - imageTag: #@ bomDataForK8sVersion.kubeadmConfigSpec.etcd.local.imageTag - #@ if getattr(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local, "extraArgs", None) != None: - #@overlay/match missing_ok=True - extraArgs: - #@ for key in bomDataForK8sVersion.kubeadmConfigSpec.etcd.local["extraArgs"]: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - (@= key @): #@ "{}".format(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local["extraArgs"][key]).lower() - #@ end - #@ end - dns: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.dns.imageRepository) - imageTag: #@ bomDataForK8sVersion.kubeadmConfigSpec.dns.imageTag - controllerManager: - extraArgs: - cluster-name: #@ data.values.CLUSTER_NAME - files: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - contentFrom: - secret: - key: control-plane-azure.json - name: #@ "{}-control-plane-azure-json".format(data.values.CLUSTER_NAME) - owner: root:root - path: /etc/kubernetes/azure.json - permissions: "0644" - replicas: #@ data.values.CONTROL_PLANE_MACHINE_COUNT - version: #@ data.values.KUBERNETES_VERSION - -#@overlay/match by=overlay.subset({"kind": "AzureMachineTemplate", "metadata":{"name": "${CLUSTER_NAME}-control-plane"}}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureMachineTemplate -metadata: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - dataDisks: - #@overlay/match by=overlay.index(0) - - diskSizeGB: #@ data.values.AZURE_CONTROL_PLANE_DATA_DISK_SIZE_GIB - lun: 0 - nameSuffix: etcddisk - osDisk: - diskSizeGB: #@ data.values.AZURE_CONTROL_PLANE_OS_DISK_SIZE_GIB - managedDisk: - storageAccountType: #@ data.values.AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE - #@overlay/match missing_ok=True - image: #@ get_azure_image(bomDataForK8sVersion) - sshPublicKey: #@ data.values.AZURE_SSH_PUBLIC_KEY_B64 - vmSize: #@ data.values.AZURE_CONTROL_PLANE_MACHINE_TYPE - -#@overlay/match by=overlay.subset({"kind":"MachineDeployment", "metadata":{"name": "${CLUSTER_NAME}-md-0"}}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT_0 - strategy: - type: #@ verify_and_configure_machine_deployment_rollout_strategy(data.values.WORKER_ROLLOUT_STRATEGY) - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - bootstrap: - configRef: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) - clusterName: #@ data.values.CLUSTER_NAME - infrastructureRef: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) - version: #@ data.values.KUBERNETES_VERSION - failureDomain: #@ data.values.AZURE_NODE_AZ or "1" - -#@overlay/match by=overlay.subset({"kind": "AzureMachineTemplate", "metadata":{"name": "${CLUSTER_NAME}-md-0"}}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureMachineTemplate -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - #@ if data.values.AZURE_ENABLE_NODE_DATA_DISK == True: - #@overlay/match missing_ok=True - dataDisks: - - diskSizeGB: #@ data.values.AZURE_NODE_DATA_DISK_SIZE_GIB - lun: 0 - nameSuffix: nodedisk - #@ end - osDisk: - diskSizeGB: #@ data.values.AZURE_NODE_OS_DISK_SIZE_GIB - managedDisk: - storageAccountType: #@ data.values.AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE - #@overlay/match missing_ok=True - image: #@ get_azure_image(bomDataForK8sVersion) - sshPublicKey: #@ data.values.AZURE_SSH_PUBLIC_KEY_B64 - vmSize: #@ data.values.AZURE_NODE_MACHINE_TYPE - -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate", "metadata":{"name": "${CLUSTER_NAME}-md-0"}}) ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - #@ if data.values.AZURE_ENABLE_NODE_DATA_DISK == True: - #@overlay/match missing_ok=True - diskSetup: - filesystems: - - device: /dev/disk/azure/scsi1/lun0 - extraOpts: - - -E - - lazy_itable_init=1,lazy_journal_init=1 - filesystem: ext4 - label: node_disk - partitions: - - device: /dev/disk/azure/scsi1/lun0 - layout: true - overwrite: false - tableType: gpt - #@overlay/match missing_ok=True - mounts: - - - LABEL=node_disk - - /var/lib/nodedisk - #@ end - files: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - contentFrom: - secret: - key: worker-node-azure.json - name: #@ "{}-md-0-azure-json".format(data.values.CLUSTER_NAME) - owner: root:root - path: /etc/kubernetes/azure.json - permissions: "0644" - -#@ if data.values.TKG_CLUSTER_ROLE == "management": ---- -apiVersion: v1 -kind: Secret -metadata: - labels: - clusterctl.cluster.x-k8s.io/move: "" - name: #@ "{}-identity-secret".format(data.values.CLUSTER_NAME) - namespace: tkg-system -type: Opaque -data: - clientSecret: #@ base64.encode(data.values.AZURE_CLIENT_SECRET) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureClusterIdentity -metadata: - labels: - clusterctl.cluster.x-k8s.io/move-hierarchy: "true" - name: #@ data.values.AZURE_IDENTITY_NAME or "{}-identity".format(data.values.CLUSTER_NAME) - namespace: tkg-system -spec: - allowedNamespaces: {} - clientID: #@ data.values.AZURE_CLIENT_ID - clientSecret: - name: #@ "{}-identity-secret".format(data.values.CLUSTER_NAME) - namespace: tkg-system - tenantID: #@ data.values.AZURE_TENANT_ID - type: ManualServicePrincipal -#@ end diff --git a/providers/infrastructure-azure/v1.6.3/yttcc/base-template.yaml b/providers/infrastructure-azure/v1.6.3/yttcc/base-template.yaml deleted file mode 100644 index 211f312d6b..0000000000 --- a/providers/infrastructure-azure/v1.6.3/yttcc/base-template.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: ${CLUSTER_NAME} - labels: - tkg.tanzu.vmware.com/cluster-name: '${ CLUSTER_NAME }' -spec: - clusterNetwork: - pods: - cidrBlocks: ["${CLUSTER_CIDR}"] - services: - cidrBlocks: ["${SERVICE_CIDR}"] - topology: - class: tkg-cluster-class-dev - version: v1.21.2 - controlPlane: - replicas: ${CONTROL_PLANE_MACHINE_COUNT} - workers: - machineDeployments: - - class: tkg-worker - name: tkg-worker-pool - replicas: ${WORKER_MACHINE_COUNT} - variables: diff --git a/providers/infrastructure-azure/v1.6.3/yttcc/overlay.yaml b/providers/infrastructure-azure/v1.6.3/yttcc/overlay.yaml deleted file mode 100644 index 7d35599d78..0000000000 --- a/providers/infrastructure-azure/v1.6.3/yttcc/overlay.yaml +++ /dev/null @@ -1,175 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:json", "json") -#@ load("@ytt:base64", "base64") - -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:struct", "struct") -#@ load("/lib/config_variable_association.star", "config_variable_association", "get_azure_vars") - -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_azure_image", "get_default_tkg_bom_data","get_tkr_version_from_tkr_name") -#@ load("lib/validate.star", "validate_configuration") - -#@ validate_configuration("azure") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - -#@ def get_custom_tags(): -#@ tags = {} -#@ custom_tags = data.values.AZURE_CUSTOM_TAGS.split(",") if data.values.AZURE_CUSTOM_TAGS else [] -#@ for tag in custom_tags: -#@ tag_entry = tag.split('=', 1) -#@ tags[tag_entry[0].strip()] = tag_entry[1].strip() if len(tag_entry) >= 2 else "" -#@ end -#@ return tags -#@ end - -#@ def get_identity_name(): -#@ if data.values.TKG_CLUSTER_ROLE == "management": -#@ return data.values.AZURE_IDENTITY_NAME or "{}-identity".format(data.values.CLUSTER_NAME) -#@ end -#@ -#@ return data.values.AZURE_IDENTITY_NAME -#@ end - -#@ def get_identity_namespace(): -#@ if data.values.TKG_CLUSTER_ROLE == "management": -#@ return "tkg-system" -#@ end -#@ -#@ return data.values.AZURE_IDENTITY_NAMESPACE -#@ end -#! -#@ def get_k8s_version_from_tkr(tkr_version): -#@ return tkr_version.split('+')[0] -#@ end - -#@ def get_azure_os_version(version): -#@ return "1804" if version == 18.04 else "2004" -#@ end - -#@ bomData = get_default_tkg_bom_data() - -#@ tkrVersion = get_tkr_version_from_tkr_name(data.values.KUBERNETES_RELEASE) - -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: #@ data.values.CLUSTER_NAME - labels: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - cluster-role.tkg.tanzu.vmware.com/(@= data.values.TKG_CLUSTER_ROLE @): "" - #@ end - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME -spec: - clusterNetwork: - #@ if data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - apiServerPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - pods: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.CLUSTER_CIDR - services: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.SERVICE_CIDR - topology: - class: #@ data.values.CLUSTER_CLASS - version: #@ tkrVersion - controlPlane: - replicas: #@ data.values.CONTROL_PLANE_MACHINE_COUNT - #@overlay/match missing_ok=True - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: #@ "os-name={},os-version={}".format(data.values.OS_NAME, get_azure_os_version(data.values.OS_VERSION)) - workers: - machineDeployments: - #@overlay/match by=overlay.index(0) - - class: tkg-worker - name: md-0 - replicas: #@ data.values.WORKER_MACHINE_COUNT_0 - #@overlay/match missing_ok=True - failureDomain: #@ str(data.values.AZURE_NODE_AZ) or "1" - #@overlay/match missing_ok=True - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: #@ "os-name={},os-version={}".format(data.values.OS_NAME, get_azure_os_version(data.values.OS_VERSION)) - #@ if data.values.CLUSTER_PLAN == "prodcc": - #@overlay/append - - class: tkg-worker - name: md-1 - replicas: #@ data.values.WORKER_MACHINE_COUNT_1 - failureDomain: #@ str(data.values.AZURE_NODE_AZ_1) or "2" - #@overlay/match missing_ok=True - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: #@ "os-name={},os-version={}".format(data.values.OS_NAME, get_azure_os_version(data.values.OS_VERSION)) - #@ if data.values.NODE_MACHINE_TYPE_1: - variables: - overrides: - - name: worker - value: - vmSize: #@ data.values.NODE_MACHINE_TYPE_1 - #@ end - #@overlay/append - - class: tkg-worker - name: md-2 - replicas: #@ data.values.WORKER_MACHINE_COUNT_2 - failureDomain: #@ str(data.values.AZURE_NODE_AZ_2) or "3" - #@overlay/match missing_ok=True - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: #@ "os-name={},os-version={}".format(data.values.OS_NAME, get_azure_os_version(data.values.OS_VERSION)) - #@ if data.values.NODE_MACHINE_TYPE_2: - variables: - overrides: - - name: worker - value: - vmSize: #@ data.values.NODE_MACHINE_TYPE_2 - #@ end - #@ end - #@overlay/match missing_ok=True - variables: - #@ vars = get_azure_vars() - #@ for configVariable in vars: - #@ if vars[configVariable] != None and configVariable in ["additionalImageRegistries","workerKubeletExtraArgs","controlPlaneKubeletExtraArgs","kubeControllerManagerExtraArgs","kubeSchedulerExtraArgs","apiServerExtraArgs","etcdExtraArgs", "location", "network", "controlPlane", "worker", "resourceGroup", "subscriptionID", "identityRef", "clusterRole", "environment", "sshPublicKey", "acceleratedNetworking", "privateCluster", "frontendPrivateIP", "imageRepository", "auditLogging", "customTags", "apiServerPort", "trust", "TKR_DATA", "proxy", "controlPlaneCertificateRotation", "podSecurityStandard", "eventRateLimitConf"]: - - name: #@ configVariable - value: #@ vars[configVariable] - #@ end - #@ end - -#@ if data.values.TKG_CLUSTER_ROLE == "management": ---- -apiVersion: v1 -kind: Secret -metadata: - labels: - clusterctl.cluster.x-k8s.io/move: "" - name: #@ "{}-identity-secret".format(data.values.CLUSTER_NAME) - namespace: tkg-system -type: Opaque -data: - clientSecret: #@ base64.encode(data.values.AZURE_CLIENT_SECRET) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureClusterIdentity -metadata: - labels: - clusterctl.cluster.x-k8s.io/move-hierarchy: "true" - name: #@ data.values.AZURE_IDENTITY_NAME or "{}-identity".format(data.values.CLUSTER_NAME) - namespace: tkg-system -spec: - allowedNamespaces: {} - clientID: #@ data.values.AZURE_CLIENT_ID - clientSecret: - name: #@ "{}-identity-secret".format(data.values.CLUSTER_NAME) - namespace: tkg-system - tenantID: #@ data.values.AZURE_TENANT_ID - type: ManualServicePrincipal -#@ end diff --git a/providers/infrastructure-azure/ytt/azure-overlay.yaml b/providers/infrastructure-azure/ytt/azure-overlay.yaml deleted file mode 100644 index c8cf43a935..0000000000 --- a/providers/infrastructure-azure/ytt/azure-overlay.yaml +++ /dev/null @@ -1,238 +0,0 @@ -#! Please add any overlays specific to Azure provider under this file. - -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_azure_image") -#@ load("lib/validate.star", "validate_configuration") - -#@ validate_configuration("azure") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - -#@ if data.values.CLUSTER_PLAN == "prod": ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT_1 - selector: - matchLabels: null - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - bootstrap: - configRef: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - clusterName: #@ data.values.CLUSTER_NAME - infrastructureRef: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - version: #@ data.values.KUBERNETES_VERSION - failureDomain: #@ data.values.AZURE_NODE_AZ_1 or "2" ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT_2 - selector: - matchLabels: null - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - bootstrap: - configRef: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - clusterName: #@ data.values.CLUSTER_NAME - infrastructureRef: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: AzureMachineTemplate - version: #@ data.values.KUBERNETES_VERSION - failureDomain: #@ data.values.AZURE_NODE_AZ_2 or "3" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureMachineTemplate -metadata: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - #@ if data.values.AZURE_ENABLE_NODE_DATA_DISK == True: - #@overlay/match missing_ok=True - dataDisks: - - diskSizeGB: #@ data.values.AZURE_NODE_DATA_DISK_SIZE_GIB - lun: 0 - nameSuffix: nodedisk - #@ end - #@overlay/match missing_ok=True - image: #@ get_azure_image(bomDataForK8sVersion) - sshPublicKey: #@ data.values.AZURE_SSH_PUBLIC_KEY_B64 - vmSize: #@ data.values.AZURE_NODE_MACHINE_TYPE - osDisk: - diskSizeGB: #@ data.values.AZURE_NODE_OS_DISK_SIZE_GIB - managedDisk: - storageAccountType: #@ data.values.AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE - osType: Linux ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AzureMachineTemplate -metadata: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - #@ if data.values.AZURE_ENABLE_NODE_DATA_DISK == True: - #@overlay/match missing_ok=True - dataDisks: - - diskSizeGB: #@ data.values.AZURE_NODE_DATA_DISK_SIZE_GIB - lun: 0 - nameSuffix: nodedisk - #@ end - #@overlay/match missing_ok=True - image: #@ get_azure_image(bomDataForK8sVersion) - sshPublicKey: #@ data.values.AZURE_SSH_PUBLIC_KEY_B64 - vmSize: #@ data.values.AZURE_NODE_MACHINE_TYPE - osDisk: - diskSizeGB: #@ data.values.AZURE_NODE_OS_DISK_SIZE_GIB - managedDisk: - storageAccountType: #@ data.values.AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE - osType: Linux ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - #@ if data.values.AZURE_ENABLE_NODE_DATA_DISK == True: - #@overlay/match missing_ok=True - diskSetup: - filesystems: - - device: /dev/disk/azure/scsi1/lun0 - extraOpts: - - -E - - lazy_itable_init=1,lazy_journal_init=1 - filesystem: ext4 - label: node_disk - partitions: - - device: /dev/disk/azure/scsi1/lun0 - layout: true - overwrite: false - tableType: gpt - #@overlay/match missing_ok=True - mounts: - - - LABEL=node_disk - - /var/lib/nodedisk - #@ end - files: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - contentFrom: - secret: - key: worker-node-azure.json - name: #@ "{}-md-1-azure-json".format(data.values.CLUSTER_NAME) - owner: root:root - path: /etc/kubernetes/azure.json - permissions: "0644" - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - cloud-config: /etc/kubernetes/azure.json - cloud-provider: azure - name: '{{ ds.meta_data["local_hostname"] }}' - useExperimentalRetryJoin: true ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - #@ if data.values.AZURE_ENABLE_NODE_DATA_DISK == True: - #@overlay/match missing_ok=True - diskSetup: - filesystems: - - device: /dev/disk/azure/scsi1/lun0 - extraOpts: - - -E - - lazy_itable_init=1,lazy_journal_init=1 - filesystem: ext4 - label: node_disk - partitions: - - device: /dev/disk/azure/scsi1/lun0 - layout: true - overwrite: false - tableType: gpt - #@overlay/match missing_ok=True - mounts: - - - LABEL=node_disk - - /var/lib/nodedisk - #@ end - files: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - contentFrom: - secret: - key: worker-node-azure.json - name: #@ "{}-md-2-azure-json".format(data.values.CLUSTER_NAME) - owner: root:root - path: /etc/kubernetes/azure.json - permissions: "0644" - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - cloud-config: /etc/kubernetes/azure.json - cloud-provider: azure - name: '{{ ds.meta_data["local_hostname"] }}' - useExperimentalRetryJoin: true -#@ end - -#@overlay/match by=overlay.subset({"kind":"AzureMachineTemplate"}),expects="1+" ---- -spec: - template: - spec: - #@overlay/match missing_ok=True - acceleratedNetworking: #@ data.values.AZURE_ENABLE_ACCELERATED_NETWORKING - -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+" ---- -spec: - #@overlay/match missing_ok=True - template: - #@overlay/match missing_ok=True - spec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #@overlay/append - - "if [ -f /etc/kubernetes/azure.json ]; then sed -i 's/\"vmType\": \"vmss\"/\"vmType\": \"standard\"/' /etc/kubernetes/azure.json; fi" - -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -spec: - #@overlay/match missing_ok=True - kubeadmConfigSpec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #@overlay/append - - "if [ -f /etc/kubernetes/azure.json ]; then sed -i 's/\"vmType\": \"vmss\"/\"vmType\": \"standard\"/' /etc/kubernetes/azure.json; fi" diff --git a/providers/infrastructure-azure/yttcc/azure-overlay.yaml b/providers/infrastructure-azure/yttcc/azure-overlay.yaml deleted file mode 100644 index d57664f885..0000000000 --- a/providers/infrastructure-azure/yttcc/azure-overlay.yaml +++ /dev/null @@ -1,209 +0,0 @@ -#! Please add any overlays specific to Azure provider under this file. - -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_azure_image") -#@ load("lib/validate.star", "validate_configuration") - -#@ validate_configuration("azure") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - -#!#@ if data.values.CLUSTER_PLAN == "prod": -#!--- -#!apiVersion: cluster.x-k8s.io/v1beta1 -#!kind: MachineDeployment -#!metadata: -#! name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -#!spec: -#! clusterName: #@ data.values.CLUSTER_NAME -#! replicas: #@ data.values.WORKER_MACHINE_COUNT_1 -#! selector: -#! matchLabels: null -#! template: -#! metadata: -#! labels: -#! node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) -#! spec: -#! bootstrap: -#! configRef: -#! name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -#! apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -#! kind: KubeadmConfigTemplate -#! clusterName: #@ data.values.CLUSTER_NAME -#! infrastructureRef: -#! name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -#! apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -#! kind: AzureMachineTemplate -#! version: #@ data.values.KUBERNETES_VERSION -#! failureDomain: #@ data.values.AZURE_NODE_AZ_1 or "2" -#!--- -#!apiVersion: cluster.x-k8s.io/v1beta1 -#!kind: MachineDeployment -#!metadata: -#! name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -#!spec: -#! clusterName: #@ data.values.CLUSTER_NAME -#! replicas: #@ data.values.WORKER_MACHINE_COUNT_2 -#! selector: -#! matchLabels: null -#! template: -#! metadata: -#! labels: -#! node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) -#! spec: -#! bootstrap: -#! configRef: -#! name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -#! apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -#! kind: KubeadmConfigTemplate -#! clusterName: #@ data.values.CLUSTER_NAME -#! infrastructureRef: -#! name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -#! apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -#! kind: AzureMachineTemplate -#! version: #@ data.values.KUBERNETES_VERSION -#! failureDomain: #@ data.values.AZURE_NODE_AZ_2 or "3" -#!--- -#!apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -#!kind: AzureMachineTemplate -#!metadata: -#! name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -#!spec: -#! template: -#! spec: -#! #@ if data.values.AZURE_ENABLE_NODE_DATA_DISK == True: -#! #@overlay/match missing_ok=True -#! dataDisks: -#! - diskSizeGB: #@ data.values.AZURE_NODE_DATA_DISK_SIZE_GIB -#! lun: 0 -#! nameSuffix: nodedisk -#! #@ end -#! #@overlay/match missing_ok=True -#! image: #@ get_azure_image(bomDataForK8sVersion) -#! sshPublicKey: #@ data.values.AZURE_SSH_PUBLIC_KEY_B64 -#! vmSize: #@ data.values.AZURE_NODE_MACHINE_TYPE -#! osDisk: -#! diskSizeGB: #@ data.values.AZURE_NODE_OS_DISK_SIZE_GIB -#! managedDisk: -#! storageAccountType: #@ data.values.AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE -#! osType: Linux -#!--- -#!apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -#!kind: AzureMachineTemplate -#!metadata: -#! name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -#!spec: -#! template: -#! spec: -#! #@ if data.values.AZURE_ENABLE_NODE_DATA_DISK == True: -#! #@overlay/match missing_ok=True -#! dataDisks: -#! - diskSizeGB: #@ data.values.AZURE_NODE_DATA_DISK_SIZE_GIB -#! lun: 0 -#! nameSuffix: nodedisk -#! #@ end -#! #@overlay/match missing_ok=True -#! image: #@ get_azure_image(bomDataForK8sVersion) -#! sshPublicKey: #@ data.values.AZURE_SSH_PUBLIC_KEY_B64 -#! vmSize: #@ data.values.AZURE_NODE_MACHINE_TYPE -#! osDisk: -#! diskSizeGB: #@ data.values.AZURE_NODE_OS_DISK_SIZE_GIB -#! managedDisk: -#! storageAccountType: #@ data.values.AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE -#! osType: Linux -#!--- -#!apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -#!kind: KubeadmConfigTemplate -#!metadata: -#! name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -#!spec: -#! template: -#! spec: -#! #@ if data.values.AZURE_ENABLE_NODE_DATA_DISK == True: -#! #@overlay/match missing_ok=True -#! diskSetup: -#! filesystems: -#! - device: /dev/disk/azure/scsi1/lun0 -#! extraOpts: -#! - -E -#! - lazy_itable_init=1,lazy_journal_init=1 -#! filesystem: ext4 -#! label: node_disk -#! partitions: -#! - device: /dev/disk/azure/scsi1/lun0 -#! layout: true -#! overwrite: false -#! tableType: gpt -#! #@overlay/match missing_ok=True -#! mounts: -#! - - LABEL=node_disk -#! - /var/lib/nodedisk -#! #@ end -#! files: -#! #@overlay/match by=overlay.index(0) -#! #@overlay/replace -#! - contentFrom: -#! secret: -#! key: worker-node-azure.json -#! name: #@ "{}-md-1-azure-json".format(data.values.CLUSTER_NAME) -#! owner: root:root -#! path: /etc/kubernetes/azure.json -#! permissions: "0644" -#! joinConfiguration: -#! nodeRegistration: -#! criSocket: /var/run/containerd/containerd.sock -#! kubeletExtraArgs: -#! cloud-config: /etc/kubernetes/azure.json -#! cloud-provider: azure -#! name: '{{ ds.meta_data["local_hostname"] }}' -#! useExperimentalRetryJoin: true -#!--- -#!apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -#!kind: KubeadmConfigTemplate -#!metadata: -#! name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -#!spec: -#! template: -#! spec: -#! #@ if data.values.AZURE_ENABLE_NODE_DATA_DISK == True: -#! #@overlay/match missing_ok=True -#! diskSetup: -#! filesystems: -#! - device: /dev/disk/azure/scsi1/lun0 -#! extraOpts: -#! - -E -#! - lazy_itable_init=1,lazy_journal_init=1 -#! filesystem: ext4 -#! label: node_disk -#! partitions: -#! - device: /dev/disk/azure/scsi1/lun0 -#! layout: true -#! overwrite: false -#! tableType: gpt -#! #@overlay/match missing_ok=True -#! mounts: -#! - - LABEL=node_disk -#! - /var/lib/nodedisk -#! #@ end -#! files: -#! #@overlay/match by=overlay.index(0) -#! #@overlay/replace -#! - contentFrom: -#! secret: -#! key: worker-node-azure.json -#! name: #@ "{}-md-2-azure-json".format(data.values.CLUSTER_NAME) -#! owner: root:root -#! path: /etc/kubernetes/azure.json -#! permissions: "0644" -#! joinConfiguration: -#! nodeRegistration: -#! criSocket: /var/run/containerd/containerd.sock -#! kubeletExtraArgs: -#! cloud-config: /etc/kubernetes/azure.json -#! cloud-provider: azure -#! name: '{{ ds.meta_data["local_hostname"] }}' -#! useExperimentalRetryJoin: true -#!#@ end - diff --git a/providers/infrastructure-docker/v1.2.7/cconly/overlay-kube-apiserver-admission.yaml b/providers/infrastructure-docker/v1.2.7/cconly/overlay-kube-apiserver-admission.yaml deleted file mode 100644 index 965c26e66d..0000000000 --- a/providers/infrastructure-docker/v1.2.7/cconly/overlay-kube-apiserver-admission.yaml +++ /dev/null @@ -1,192 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/append - - name: eventRateLimitConf - required: false - schema: - openAPIV3Schema: - type: string - default: "" - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/admission-control-config.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: admin-control-conf - hostPath: /etc/kubernetes/admission-control-config.yaml - mountPath: /etc/kubernetes/admission-control-config.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/admission-control-config.yaml - content: |- - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - {{- if and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }} - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - {{- end }} - {{- if .eventRateLimitConf }} - - name: EventRateLimit - path: eventConfig.yaml - {{- end }} - enabledIf: '{{ or (and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version)) (.eventRateLimitConf) }}' - #@overlay/append - - name: eventRateLimitConf - description: "Adds an admission configuration for EventRateLimit." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/enable-admission-plugins" - valueFrom: - template: | - {{ $containEnableAdmissionPlugin := false }} - {{- $admissionPlugins := "" }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "enable-admission-plugins" }} - {{- $containEnableAdmissionPlugin = true }} - {{- $admissionPlugins = $val }} - {{- end }} - {{- end }} - {{- if not $containEnableAdmissionPlugin }} - NodeRestriction,EventRateLimit - {{- else -}} - {{- $admissionPlugins -}},EventRateLimit - {{- end }} - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: event-conf - hostPath: /etc/kubernetes/eventConfig.yaml - mountPath: /etc/kubernetes/eventConfig.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/eventConfig.yaml - encoding: base64 - content: {{ .eventRateLimitConf}} - enabledIf: '{{ not (empty .eventRateLimitConf) }}' diff --git a/providers/infrastructure-docker/v1.2.8/cconly/base.yaml b/providers/infrastructure-docker/v1.2.8/cconly/base.yaml deleted file mode 100644 index bb877a88d2..0000000000 --- a/providers/infrastructure-docker/v1.2.8/cconly/base.yaml +++ /dev/null @@ -1,352 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - annotations: - run.tanzu.vmware.com/resolve-tkr: "" - name: #@ "tkg-docker-default-{}".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - controlPlane: - ref: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - name: #@ "tkg-docker-default-{}-kcp".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - machineInfrastructure: - ref: - kind: DockerMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-docker-default-{}-control-plane".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerClusterTemplate - name: #@ "tkg-docker-default-{}-cluster".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - workers: - machineDeployments: - - class: default-worker - template: - bootstrap: - ref: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: #@ "tkg-docker-default-{}-md-config".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerMachineTemplate - name: #@ "tkg-docker-default-{}-worker".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - variables: - - name: TKR_DATA - required: false - schema: - openAPIV3Schema: - type: object - properties: { } - - name: cni - required: true - schema: - openAPIV3Schema: - type: string - default: antrea - - name: imageRepository - required: true - schema: - openAPIV3Schema: - type: string - default: projects-stg.registry.vmware.com/tkg - example: "k8s.gcr.io" - description: "imageRepository sets the container registry to pull images from. If empty, `k8s.gcr.io` will be used by default." - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: true - description: "enabled enables the patches to enable Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - default: "baseline" - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of privileged, baseline, restricted." - audit: - type: string - default: "restricted" - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of privileged, baseline, restricted." - warn: - type: string - default: "restricted" - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of privileged, baseline, restricted." - patches: - - name: KCPT_ControlPlane_Main - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageTag - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.etcd.imageTag}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageTag - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.coredns.imageTag}}' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: curl https://get.docker.com/builds/Linux/x86_64/docker-1.12.0.tgz | tar zxOf - docker/docker > /usr/local/bin/docker;chmod +x /usr/local/bin/docker - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: peerIdx=$(ip link | grep eth0 | awk -F[@:] '{ print $3 }' | cut -c 3-);peerName=$(docker run --rm --net=host --entrypoint=/bin/ip projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 link | grep ^"$peerIdx":| awk -F[:@] '{ print $2 }' | cut -c 2-);docker run --rm --net=host --privileged --entrypoint=/usr/sbin/ethtool projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 -K "$peerName" tx off - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: sysctl -w net.ipv4.tcp_retries2=4 - - name: imageRepository - description: "Sets the imageRepository used for the KubeadmControlPlane." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository" - valueFrom: - variable: imageRepository - - name: cgroupDriver-controlPlane - description: | - Sets the cgroupDriver to cgroupfs if a Kubernetes version < v1.24 is referenced. - This is required because kind and the node images do not support the default - systemd cgroupDriver for kubernetes < v1.24. - enabledIf: '{{ semverCompare "<= v1.23" .builtin.controlPlane.version }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/cgroup-driver" - value: cgroupfs - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/cgroup-driver" - value: cgroupfs - - name: antrea-prekubeadm - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - default-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: curl https://get.docker.com/builds/Linux/x86_64/docker-1.12.0.tgz | tar zxOf - docker/docker > /usr/local/bin/docker;chmod +x /usr/local/bin/docker - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: peerIdx=$(ip link | grep eth0 | awk -F[@:] '{ print $3 }' | cut -c 3-);peerName=$(docker run --rm --net=host --entrypoint=/bin/ip projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 link | grep ^"$peerIdx":| awk -F[:@] '{ print $2 }' | cut -c 2-);docker run --rm --net=host --privileged --entrypoint=/usr/sbin/ethtool projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 -K "$peerName" tx off - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: sysctl -w net.ipv4.tcp_retries2=4 - - name: cgroupDriver-machineDeployment - description: | - Sets the cgroupDriver to cgroupfs if a Kubernetes version < v1.24 is referenced. - This is required because kind and the node images do not support the default - systemd cgroupDriver for kubernetes < v1.24. - enabledIf: '{{ semverCompare "<= v1.23" .builtin.machineDeployment.version }}' - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - default-worker - jsonPatches: - - op: add - path: "/spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/cgroup-driver" - value: cgroupfs - - name: customImage - description: "Sets the container image that is used for running dockerMachines for the controlPlane and default-worker machineDeployments." - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerMachineTemplate - matchResources: - machineDeploymentClass: - names: - - default-worker - jsonPatches: - - op: add - path: "/spec/template/spec/customImage" - value: projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/customImage" - value: projects-stg.registry.vmware.com/tkg/kind/node:v1.23.8_vmware.2-tkg.1_v0.11.1 - - name: podSecurityStandard - description: "Adds an admission configuration for PodSecurity to the kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs" - value: - admission-control-config-file: "/etc/kubernetes/kube-apiserver-admission-pss.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes" - value: - - name: admission-pss - hostPath: /etc/kubernetes/kube-apiserver-admission-pss.yaml - mountPath: /etc/kubernetes/kube-apiserver-admission-pss.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files" - valueFrom: - template: | - - content: | - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ .podSecurityStandard.enforce }}" - enforce-version: "latest" - audit: "{{ .podSecurityStandard.audit }}" - audit-version: "latest" - warn: "{{ .podSecurityStandard.warn }}" - warn-version: "latest" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [kube-system] - path: /etc/kubernetes/kube-apiserver-admission-pss.yaml - enabledIf: "{{ .podSecurityStandard.enabled }}" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerClusterTemplate -metadata: - name: #@ "tkg-docker-default-{}-cluster".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: {} ---- -kind: KubeadmControlPlaneTemplate -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -metadata: - name: #@ "tkg-docker-default-{}-kcp".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - kubeadmConfigSpec: - preKubeadmCommands: - - echo "running preKubeadmCommands..." - clusterConfiguration: - controllerManager: - extraArgs: { enable-hostpath-provisioner: 'true' } - apiServer: - certSANs: [localhost, 127.0.0.1, 0.0.0.0, host.docker.internal] - dns: - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - extraArgs: - cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - imageRepository: dummy.registry.vmware.com - initConfiguration: - nodeRegistration: - criSocket: unix:///var/run/containerd/containerd.sock - kubeletExtraArgs: - eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%' - joinConfiguration: - nodeRegistration: - criSocket: unix:///var/run/containerd/containerd.sock - kubeletExtraArgs: - eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%' ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerMachineTemplate -metadata: - name: #@ "tkg-docker-default-{}-control-plane".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - extraMounts: - - containerPath: "/var/run/docker.sock" - hostPath: "/var/run/docker.sock" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerMachineTemplate -metadata: - name: #@ "tkg-docker-default-{}-worker".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - extraMounts: - - containerPath: "/var/run/docker.sock" - hostPath: "/var/run/docker.sock" ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "tkg-docker-default-{}-md-config".format(data.values.DOCKER_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - preKubeadmCommands: - - echo "running preKubeadmCommands..." - joinConfiguration: - nodeRegistration: - criSocket: unix:///var/run/containerd/containerd.sock - kubeletExtraArgs: - eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%' diff --git a/providers/infrastructure-docker/v1.2.8/cconly/overlay-pod-security-admission.yaml b/providers/infrastructure-docker/v1.2.8/cconly/overlay-pod-security-admission.yaml deleted file mode 100644 index 754c1ce0aa..0000000000 --- a/providers/infrastructure-docker/v1.2.8/cconly/overlay-pod-security-admission.yaml +++ /dev/null @@ -1,134 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for PodSecurity to the kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/kube-apiserver-admission-pss.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - value: - name: admission-pss - hostPath: /etc/kubernetes/kube-apiserver-admission-pss.yaml - mountPath: /etc/kubernetes/kube-apiserver-admission-pss.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - content: |- - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - path: /etc/kubernetes/kube-apiserver-admission-pss.yaml - enabledIf: '{{ and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }}' diff --git a/providers/infrastructure-docker/v1.2.8/cconly/overlay.yaml b/providers/infrastructure-docker/v1.2.8/cconly/overlay.yaml deleted file mode 100644 index e85fd269f8..0000000000 --- a/providers/infrastructure-docker/v1.2.8/cconly/overlay.yaml +++ /dev/null @@ -1,80 +0,0 @@ -#! This overlay is adds a patch as first element in the patches to create an empty -#! dict at the apiservers extraArgs definition. -#! With this other patches are able to insert into the now existing dictionary. -#! Otherwise the dict would not exist and the patches would fail. -#! Empty dictionaries get dropped due to omitEmpty set at the CRD level. -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -spec: - controlPlane: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_CONTROL_PLANE: - #@overlay/match missing_ok=True - machineHealthCheck: - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_CONTROL_PLANE - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - workers: - machineDeployments: - #@overlay/match by="class" - - class: default-worker - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - #@overlay/match missing_ok=True - machineHealthCheck: - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - patches: - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs - value: {} - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: CAPD_KCP_INIT_EMPTY_APISERVER_EXTRAARGS - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: CAPD_KCP_INIT_EMPTY_FILES_ARRAY - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: KCP_INIT_APISERVER_EMPTY_EXTRAVOLUMES_ARRAY diff --git a/providers/infrastructure-docker/v1.2.8/cluster-template-definition-dev.yaml b/providers/infrastructure-docker/v1.2.8/cluster-template-definition-dev.yaml deleted file mode 100644 index 3e9b7687f5..0000000000 --- a/providers/infrastructure-docker/v1.2.8/cluster-template-definition-dev.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-docker/v1.2.8/ytt - - path: providers/infrastructure-docker/ytt - - path: providers/ytt - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-docker/v1.2.8/cluster-template-definition-devcc.yaml b/providers/infrastructure-docker/v1.2.8/cluster-template-definition-devcc.yaml deleted file mode 100644 index 29c015a308..0000000000 --- a/providers/infrastructure-docker/v1.2.8/cluster-template-definition-devcc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/yttcb - - path: providers/infrastructure-docker/v1.2.8/yttcc - - path: providers/infrastructure-docker/yttcc - - path: providers/yttcc - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-docker/v1.2.8/cluster-template-definition-prod.yaml b/providers/infrastructure-docker/v1.2.8/cluster-template-definition-prod.yaml deleted file mode 100644 index 3e9b7687f5..0000000000 --- a/providers/infrastructure-docker/v1.2.8/cluster-template-definition-prod.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-docker/v1.2.8/ytt - - path: providers/infrastructure-docker/ytt - - path: providers/ytt - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-docker/v1.2.8/cluster-template-definition-prodcc.yaml b/providers/infrastructure-docker/v1.2.8/cluster-template-definition-prodcc.yaml deleted file mode 100644 index 29c015a308..0000000000 --- a/providers/infrastructure-docker/v1.2.8/cluster-template-definition-prodcc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/yttcb - - path: providers/infrastructure-docker/v1.2.8/yttcc - - path: providers/infrastructure-docker/yttcc - - path: providers/yttcc - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-docker/v1.2.8/clusterclass-tkg-docker-default.yaml b/providers/infrastructure-docker/v1.2.8/clusterclass-tkg-docker-default.yaml deleted file mode 100644 index 6657fa24f2..0000000000 --- a/providers/infrastructure-docker/v1.2.8/clusterclass-tkg-docker-default.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-docker/v1.2.8/cconly - - path: providers/config_default.yaml diff --git a/providers/infrastructure-docker/v1.2.8/infrastructure-components.yaml b/providers/infrastructure-docker/v1.2.8/infrastructure-components.yaml deleted file mode 100644 index e9b34b0802..0000000000 --- a/providers/infrastructure-docker/v1.2.8/infrastructure-components.yaml +++ /dev/null @@ -1,2091 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - control-plane: controller-manager - pod-security.kubernetes.io/enforce: privileged - pod-security.kubernetes.io/warn: privileged - pod-security.kubernetes.io/audit: privileged - name: capd-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: infrastructure-docker - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: dockerclusters.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capd-webhook-service - namespace: capd-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: DockerCluster - listKind: DockerClusterList - plural: dockerclusters - singular: dockercluster - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: DockerCluster is the Schema for the dockerclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server is serving. - type: string - port: - description: Port is the port on which the API server is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are not usulaly defined on the spec. The docker provider is special since failure domains don't mean anything in a local docker environment. Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API controllers to do what they will with the defined failure domains. - type: object - type: object - status: - description: DockerClusterStatus defines the observed state of DockerCluster. - properties: - conditions: - description: Conditions defines current service state of the DockerCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains don't mean much in CAPD since it's all local, but we can see how the rest of cluster API will use this if we populate it. - type: object - ready: - description: Ready denotes that the docker cluster (infrastructure) is ready. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerCluster - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: DockerCluster is the Schema for the dockerclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server is serving. - type: string - port: - description: Port is the port on which the API server is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are not usulaly defined on the spec. The docker provider is special since failure domains don't mean anything in a local docker environment. Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API controllers to do what they will with the defined failure domains. - type: object - loadBalancer: - description: LoadBalancer allows defining configurations for the cluster load balancer. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull the haproxy image from. if not set, "kindest" will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the haproxy image. if not set, "v20210715-a6da3463" will be used instead. - type: string - type: object - type: object - status: - description: DockerClusterStatus defines the observed state of DockerCluster. - properties: - conditions: - description: Conditions defines current service state of the DockerCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains don't mean much in CAPD since it's all local, but we can see how the rest of cluster API will use this if we populate it. - type: object - ready: - description: Ready denotes that the docker cluster (infrastructure) is ready. - type: boolean - required: - - ready - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .metadata.labels['cluster\.x-k8s\.io/cluster-name'] - name: Cluster - type: string - - description: Time duration since creation of DockerCluster - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: DockerCluster is the Schema for the dockerclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server is serving. - type: string - port: - description: Port is the port on which the API server is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are usually not defined in the spec. The docker provider is special since failure domains don't mean anything in a local docker environment. Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API controllers to do what they will with the defined failure domains. - type: object - loadBalancer: - description: LoadBalancer allows defining configurations for the cluster load balancer. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull the haproxy image from. if not set, "kindest" will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the haproxy image. if not set, "v20210715-a6da3463" will be used instead. - type: string - type: object - type: object - status: - description: DockerClusterStatus defines the observed state of DockerCluster. - properties: - conditions: - description: Conditions defines current service state of the DockerCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains don't mean much in CAPD since it's all local, but we can see how the rest of cluster API will use this if we populate it. - type: object - ready: - description: Ready denotes that the docker cluster (infrastructure) is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: infrastructure-docker - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: dockerclustertemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capd-webhook-service - namespace: capd-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - kind: DockerClusterTemplate - listKind: DockerClusterTemplateList - plural: dockerclustertemplates - singular: dockerclustertemplate - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Time duration since creation of DockerClusterTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: DockerClusterTemplate is the Schema for the dockerclustertemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterTemplateSpec defines the desired state of DockerClusterTemplate. - properties: - template: - description: DockerClusterTemplateResource describes the data needed to create a DockerCluster from a template. - properties: - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server is serving. - type: string - port: - description: Port is the port on which the API server is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are not usulaly defined on the spec. The docker provider is special since failure domains don't mean anything in a local docker environment. Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API controllers to do what they will with the defined failure domains. - type: object - loadBalancer: - description: LoadBalancer allows defining configurations for the cluster load balancer. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull the haproxy image from. if not set, "kindest" will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the haproxy image. if not set, "v20210715-a6da3463" will be used instead. - type: string - type: object - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerClusterTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: DockerClusterTemplate is the Schema for the dockerclustertemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerClusterTemplateSpec defines the desired state of DockerClusterTemplate. - properties: - template: - description: DockerClusterTemplateResource describes the data needed to create a DockerCluster from a template. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: DockerClusterSpec defines the desired state of DockerCluster. - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: Host is the hostname on which the API server is serving. - type: string - port: - description: Port is the port on which the API server is serving. - type: integer - required: - - host - - port - type: object - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains are usually not defined in the spec. The docker provider is special since failure domains don't mean anything in a local docker environment. Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API controllers to do what they will with the defined failure domains. - type: object - loadBalancer: - description: LoadBalancer allows defining configurations for the cluster load balancer. - properties: - imageRepository: - description: ImageRepository sets the container registry to pull the haproxy image from. if not set, "kindest" will be used instead. - type: string - imageTag: - description: ImageTag allows to specify a tag for the haproxy image. if not set, "v20210715-a6da3463" will be used instead. - type: string - type: object - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: infrastructure-docker - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: dockermachinepools.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capd-webhook-service - namespace: capd-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: DockerMachinePool - listKind: DockerMachinePoolList - plural: dockermachinepools - singular: dockermachinepool - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: DockerMachinePool is the Schema for the dockermachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachinePoolSpec defines the desired state of DockerMachinePool. - properties: - providerID: - description: ProviderID is the identification ID of the Machine Pool - type: string - providerIDList: - description: ProviderIDList is the list of identification IDs of machine instances managed by this Machine Pool - items: - type: string - type: array - template: - description: Template contains the details used to build a replica machine within the Machine Pool - properties: - customImage: - description: CustomImage allows customizing the container image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath doesn't exist, then runtimes should report error. If the hostpath is a symbolic link, runtimes should follow the symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created machine. This can be used to speed up tests by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - type: object - type: object - status: - description: DockerMachinePoolStatus defines the observed state of DockerMachinePool. - properties: - conditions: - description: Conditions defines current service state of the DockerMachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - instances: - description: Instances contains the status for each instance in the pool - items: - description: DockerMachinePoolInstanceStatus contains status information about a DockerMachinePool. - properties: - addresses: - description: Addresses contains the associated addresses for the docker machine. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has been run against this machine - type: boolean - instanceName: - description: InstanceName is the identification of the Machine Instance within the Machine Pool - type: string - providerID: - description: ProviderID is the provider identification of the Machine Pool Instance - type: string - ready: - description: Ready denotes that the machine (docker container) is ready - type: boolean - version: - description: Version defines the Kubernetes version for the Machine Instance - type: string - type: object - type: array - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - ready: - description: Ready denotes that the machine pool is ready - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerMachinePool - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: DockerMachinePool is the Schema for the dockermachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachinePoolSpec defines the desired state of DockerMachinePool. - properties: - providerID: - description: ProviderID is the identification ID of the Machine Pool - type: string - providerIDList: - description: ProviderIDList is the list of identification IDs of machine instances managed by this Machine Pool - items: - type: string - type: array - template: - description: Template contains the details used to build a replica machine within the Machine Pool - properties: - customImage: - description: CustomImage allows customizing the container image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath doesn't exist, then runtimes should report error. If the hostpath is a symbolic link, runtimes should follow the symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created machine. This can be used to speed up tests by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - type: object - type: object - status: - description: DockerMachinePoolStatus defines the observed state of DockerMachinePool. - properties: - conditions: - description: Conditions defines current service state of the DockerMachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - instances: - description: Instances contains the status for each instance in the pool - items: - description: DockerMachinePoolInstanceStatus contains status information about a DockerMachinePool. - properties: - addresses: - description: Addresses contains the associated addresses for the docker machine. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has been run against this machine - type: boolean - instanceName: - description: InstanceName is the identification of the Machine Instance within the Machine Pool - type: string - providerID: - description: ProviderID is the provider identification of the Machine Pool Instance - type: string - ready: - description: Ready denotes that the machine (docker container) is ready - type: boolean - version: - description: Version defines the Kubernetes version for the Machine Instance - type: string - type: object - type: array - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - ready: - description: Ready denotes that the machine pool is ready - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerMachinePool - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: DockerMachinePool is the Schema for the dockermachinepools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachinePoolSpec defines the desired state of DockerMachinePool. - properties: - providerID: - description: ProviderID is the identification ID of the Machine Pool - type: string - providerIDList: - description: ProviderIDList is the list of identification IDs of machine instances managed by this Machine Pool - items: - type: string - type: array - template: - description: Template contains the details used to build a replica machine within the Machine Pool - properties: - customImage: - description: CustomImage allows customizing the container image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath doesn't exist, then runtimes should report error. If the hostpath is a symbolic link, runtimes should follow the symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created machine. This can be used to speed up tests by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - type: object - type: object - status: - description: DockerMachinePoolStatus defines the observed state of DockerMachinePool. - properties: - conditions: - description: Conditions defines current service state of the DockerMachinePool. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - instances: - description: Instances contains the status for each instance in the pool - items: - description: DockerMachinePoolInstanceStatus contains status information about a DockerMachinePool. - properties: - addresses: - description: Addresses contains the associated addresses for the docker machine. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has been run against this machine - type: boolean - instanceName: - description: InstanceName is the identification of the Machine Instance within the Machine Pool - type: string - providerID: - description: ProviderID is the provider identification of the Machine Pool Instance - type: string - ready: - description: Ready denotes that the machine (docker container) is ready - type: boolean - version: - description: Version defines the Kubernetes version for the Machine Instance - type: string - type: object - type: array - observedGeneration: - description: The generation observed by the deployment controller. - format: int64 - type: integer - ready: - description: Ready denotes that the machine pool is ready - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas. - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: infrastructure-docker - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: dockermachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capd-webhook-service - namespace: capd-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: DockerMachine - listKind: DockerMachineList - plural: dockermachines - singular: dockermachine - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: DockerMachine is the Schema for the dockermachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineSpec defines the desired state of DockerMachine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath doesn't exist, then runtimes should report error. If the hostpath is a symbolic link, runtimes should follow the symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created machine. This can be used to speed up tests by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID format (docker:////) - type: string - type: object - status: - description: DockerMachineStatus defines the observed state of DockerMachine. - properties: - addresses: - description: Addresses contains the associated addresses for the docker machine. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the DockerMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - loadBalancerConfigured: - description: LoadBalancerConfigured denotes that the machine has been added to the load balancer - type: boolean - ready: - description: Ready denotes that the machine (docker container) is ready - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerMachine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: DockerMachine is the Schema for the dockermachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineSpec defines the desired state of DockerMachine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath doesn't exist, then runtimes should report error. If the hostpath is a symbolic link, runtimes should follow the symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created machine. This can be used to speed up tests by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID format (docker:////) - type: string - type: object - status: - description: DockerMachineStatus defines the observed state of DockerMachine. - properties: - addresses: - description: Addresses contains the associated addresses for the docker machine. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the DockerMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - loadBalancerConfigured: - description: LoadBalancerConfigured denotes that the machine has been added to the load balancer - type: boolean - ready: - description: Ready denotes that the machine (docker container) is ready - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster - jsonPath: .metadata.labels['cluster\.x-k8s\.io/cluster-name'] - name: Cluster - type: string - - description: Time duration since creation of DockerMachine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: DockerMachine is the Schema for the dockermachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineSpec defines the desired state of DockerMachine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath doesn't exist, then runtimes should report error. If the hostpath is a symbolic link, runtimes should follow the symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created machine. This can be used to speed up tests by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID format (docker:////) - type: string - type: object - status: - description: DockerMachineStatus defines the observed state of DockerMachine. - properties: - addresses: - description: Addresses contains the associated addresses for the docker machine. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the DockerMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - loadBalancerConfigured: - description: LoadBalancerConfigured denotes that the machine has been added to the load balancer - type: boolean - ready: - description: Ready denotes that the machine (docker container) is ready - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - controller-gen.kubebuilder.io/version: v0.9.1 - labels: - cluster.x-k8s.io/provider: infrastructure-docker - cluster.x-k8s.io/v1alpha3: v1alpha3 - cluster.x-k8s.io/v1alpha4: v1alpha4 - cluster.x-k8s.io/v1beta1: v1beta1 - name: dockermachinetemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capd-webhook-service - namespace: capd-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: DockerMachineTemplate - listKind: DockerMachineTemplateList - plural: dockermachinetemplates - singular: dockermachinetemplate - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: DockerMachineTemplate is the Schema for the dockermachinetemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineTemplateSpec defines the desired state of DockerMachineTemplate. - properties: - template: - description: DockerMachineTemplateResource describes the data needed to create a DockerMachine from a template. - properties: - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath doesn't exist, then runtimes should report error. If the hostpath is a symbolic link, runtimes should follow the symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created machine. This can be used to speed up tests by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID format (docker:////) - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - additionalPrinterColumns: - - description: Time duration since creation of DockerMachineTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: DockerMachineTemplate is the Schema for the dockermachinetemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineTemplateSpec defines the desired state of DockerMachineTemplate. - properties: - template: - description: DockerMachineTemplateResource describes the data needed to create a DockerMachine from a template. - properties: - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath doesn't exist, then runtimes should report error. If the hostpath is a symbolic link, runtimes should follow the symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created machine. This can be used to speed up tests by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID format (docker:////) - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - subresources: {} - - additionalPrinterColumns: - - description: Time duration since creation of DockerMachineTemplate - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: DockerMachineTemplate is the Schema for the dockermachinetemplates API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: DockerMachineTemplateSpec defines the desired state of DockerMachineTemplate. - properties: - template: - description: DockerMachineTemplateResource describes the data needed to create a DockerMachine from a template. - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - bootstrapped: - description: Bootstrapped is true when the kubeadm bootstrapping has been run against this machine - type: boolean - customImage: - description: CustomImage allows customizing the container image that is used for running the machine - type: string - extraMounts: - description: ExtraMounts describes additional mount points for the node container These may be used to bind a hostPath - items: - description: Mount specifies a host volume to mount into a container. This is a simplified version of kind v1alpha4.Mount types. - properties: - containerPath: - description: Path of the mount within the container. - type: string - hostPath: - description: Path of the mount on the host. If the hostPath doesn't exist, then runtimes should report error. If the hostpath is a symbolic link, runtimes should follow the symlink and mount the real destination to container. - type: string - readOnly: - description: If set, the mount is read-only. - type: boolean - type: object - type: array - preLoadImages: - description: PreLoadImages allows to pre-load images in a newly created machine. This can be used to speed up tests by avoiding e.g. to download CNI images on all the containers. - items: - type: string - type: array - providerID: - description: ProviderID will be the container name in ProviderID format (docker:////) - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true - subresources: {} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-manager - namespace: capd-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-leader-election-role - namespace: capd-system -rules: -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-manager-role -rules: -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - machines - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - - machinepools/status - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockerclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockerclusters/finalizers - - dockerclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockermachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockermachinepools/finalizers - - dockermachinepools/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockermachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - dockermachines/finalizers - - dockermachines/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-leader-election-rolebinding - namespace: capd-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capd-leader-election-role -subjects: -- kind: ServiceAccount - name: capd-manager - namespace: capd-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capd-manager-role -subjects: -- kind: ServiceAccount - name: capd-manager - namespace: capd-system ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-webhook-service - namespace: capd-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-docker ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - control-plane: controller-manager - name: capd-controller-manager - namespace: capd-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-docker - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --metrics-bind-addr=localhost:8080 - - --feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},ClusterTopology=${CLUSTER_TOPOLOGY:=true} - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_UID - valueFrom: - fieldRef: - fieldPath: metadata.uid - image: registry.tkg.vmware.run/cluster-api/capd-manager:${CAPD_CONTROLLER_IMAGE_TAG} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - securityContext: - privileged: true - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - - mountPath: /var/run/docker.sock - name: dockersock - serviceAccountName: capd-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - secretName: capd-webhook-service-cert - - hostPath: - path: /var/run/docker.sock - name: dockersock ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-serving-cert - namespace: capd-system -spec: - dnsNames: - - capd-webhook-service.capd-system.svc - - capd-webhook-service.capd-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capd-selfsigned-issuer - secretName: capd-webhook-service-cert - subject: - organizations: - - k8s-sig-cluster-lifecycle ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-selfsigned-issuer - namespace: capd-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capd-webhook-service - namespace: capd-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-dockercluster - failurePolicy: Fail - matchPolicy: Equivalent - name: default.dockercluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - dockerclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capd-webhook-service - namespace: capd-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-dockerclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: default.dockerclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - dockerclustertemplates - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capd-system/capd-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-docker - name: capd-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capd-webhook-service - namespace: capd-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-dockercluster - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.dockercluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - dockerclusters - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capd-webhook-service - namespace: capd-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-dockerclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.dockerclustertemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - dockerclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capd-webhook-service - namespace: capd-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-dockermachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.dockermachinetemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - dockermachinetemplates - sideEffects: None diff --git a/providers/infrastructure-docker/v1.2.8/metadata.yaml b/providers/infrastructure-docker/v1.2.8/metadata.yaml deleted file mode 100644 index 6957197b7b..0000000000 --- a/providers/infrastructure-docker/v1.2.8/metadata.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: -- major: 1 - minor: 2 - contract: v1beta1 -- major: 1 - minor: 1 - contract: v1beta1 -- major: 1 - minor: 0 - contract: v1beta1 -- major: 0 - minor: 4 - contract: v1alpha4 -- major: 0 - minor: 3 - contract: v1alpha3 diff --git a/providers/infrastructure-docker/v1.2.8/ytt/base-template.yaml b/providers/infrastructure-docker/v1.2.8/ytt/base-template.yaml deleted file mode 100644 index e3da69df97..0000000000 --- a/providers/infrastructure-docker/v1.2.8/ytt/base-template.yaml +++ /dev/null @@ -1,152 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: "${CLUSTER_NAME}" - labels: - tkg.tanzu.vmware.com/cluster-name: '${CLUSTER_NAME}' -spec: - clusterNetwork: - services: - cidrBlocks: ['${SERVICE_CIDR}'] - pods: - cidrBlocks: ['${CLUSTER_CIDR}'] - serviceDomain: '${SERVICE_DOMAIN}' - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerCluster - name: "${CLUSTER_NAME}" - controlPlaneRef: - kind: KubeadmControlPlane - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - name: "${CLUSTER_NAME}-control-plane" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerCluster -metadata: - name: "${CLUSTER_NAME}" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerMachineTemplate -metadata: - name: "${CLUSTER_NAME}-control-plane" -spec: - template: - spec: - customImage: '${DOCKER_MACHINE_TEMPLATE_IMAGE}' - extraMounts: - - containerPath: "/var/run/docker.sock" - hostPath: "/var/run/docker.sock" ---- -kind: KubeadmControlPlane -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -metadata: - name: "${CLUSTER_NAME}-control-plane" -spec: - replicas: ${CONTROL_PLANE_MACHINE_COUNT} - machineTemplate: - infrastructureRef: - kind: DockerMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: "${CLUSTER_NAME}-control-plane" - kubeadmConfigSpec: - clusterConfiguration: - controllerManager: - extraArgs: {enable-hostpath-provisioner: 'true'} - apiServer: - certSANs: [localhost, 127.0.0.1] - imageRepository: '${_TKG_K8S_IMAGE_REPOSITORY}' - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: '${_TKG_ETCD_IMAGE_REPOSITORY}' - imageTag: '${_TKG_ETCD_IMAGE_TAG}' - dns: - imageRepository: '${_TKG_COREDNS_IMAGE_REPOSITORY}' - imageTag: '${_TKG_COREDNS_IMAGE_TAG}' - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - # We have to pin the cgroupDriver to cgroupfs as kubeadm >=1.21 defaults to systemd - # kind will implement systemd support in: https://github.com/kubernetes-sigs/kind/issues/1726 - cgroup-driver: cgroupfs - eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%' - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - # We have to pin the cgroupDriver to cgroupfs as kubeadm >=1.21 defaults to systemd - # kind will implement systemd support in: https://github.com/kubernetes-sigs/kind/issues/1726 - cgroup-driver: cgroupfs - eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%' - preKubeadmCommands: [] - files: [] - version: "${KUBERNETES_VERSION}" ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerMachineTemplate -metadata: - name: "${CLUSTER_NAME}-md-0" -spec: - template: - spec: - customImage: '${DOCKER_MACHINE_TEMPLATE_IMAGE}' - extraMounts: - - containerPath: "/var/run/docker.sock" - hostPath: "/var/run/docker.sock" ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: "${CLUSTER_NAME}-md-0" -spec: - template: - spec: - preKubeadmCommands: [] - files: [] - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - # We have to pin the cgroupDriver to cgroupfs as kubeadm >=1.21 defaults to systemd - # kind will implement systemd support in: https://github.com/kubernetes-sigs/kind/issues/1726 - cgroup-driver: cgroupfs - eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%' - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - # We have to pin the cgroupDriver to cgroupfs as kubeadm >=1.21 defaults to systemd - # kind will implement systemd support in: https://github.com/kubernetes-sigs/kind/issues/1726 - cgroup-driver: cgroupfs - eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%' ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - name: "${CLUSTER_NAME}-md-0" - labels: - cluster.x-k8s.io/cluster-name: "${CLUSTER_NAME}" -spec: - clusterName: "${CLUSTER_NAME}" - replicas: ${WORKER_MACHINE_COUNT} - selector: - matchLabels: - cluster.x-k8s.io/cluster-name: "${CLUSTER_NAME}" - template: - metadata: - labels: - cluster.x-k8s.io/cluster-name: '${CLUSTER_NAME}' - node-pool: "${CLUSTER_NAME}-worker-pool" - spec: - clusterName: "${CLUSTER_NAME}" - version: "${KUBERNETES_VERSION}" - bootstrap: - configRef: - name: "${CLUSTER_NAME}-md-0" - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - infrastructureRef: - name: "${CLUSTER_NAME}-md-0" - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerMachineTemplate diff --git a/providers/infrastructure-docker/v1.2.8/ytt/overlay.yaml b/providers/infrastructure-docker/v1.2.8/ytt/overlay.yaml deleted file mode 100644 index 7977c76f95..0000000000 --- a/providers/infrastructure-docker/v1.2.8/ytt/overlay.yaml +++ /dev/null @@ -1,198 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_image_repo_for_component", "disable_cgroupdriver_cgroupfs") -#@ load("@ytt:yaml", "yaml") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - -#@ def get_kind_image(): -#@ kind = bomDataForK8sVersion.components["kubernetes-sigs_kind"][0] -#@ return "{}/{}:{}".format(get_image_repo_for_component(kind.images.kindNodeImage), kind.images.kindNodeImage.imagePath, kind.images.kindNodeImage.tag) -#@ end - -#@ def construct_pre_kubeadm_command(): -#@ return "peerIdx=$(ip link | grep eth0 | awk -F[@:] '{ print $3 }' | cut -c 3-);peerName=$(docker run --rm --net=host --entrypoint=/bin/ip " + get_kind_image() + """ link | grep ^"$peerIdx":| awk -F[:@] '{ print $2 }' | cut -c 2-);docker run --rm --net=host --privileged --entrypoint=/usr/sbin/ethtool """ + get_kind_image() + """ -K "$peerName" tx off""" -#@ end - -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: #@ data.values.CLUSTER_NAME - labels: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - cluster-role.tkg.tanzu.vmware.com/(@= data.values.TKG_CLUSTER_ROLE @): "" - #@ end - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - #@overlay/match missing_ok=True - tanzuKubernetesRelease: #@ data.values.KUBERNETES_RELEASE -spec: - infrastructureRef: - name: #@ data.values.CLUSTER_NAME - controlPlaneRef: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - clusterNetwork: - pods: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.CLUSTER_CIDR - services: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.SERVICE_CIDR - serviceDomain: #@ data.values.SERVICE_DOMAIN - -#@overlay/match by=overlay.subset({"kind":"DockerCluster"}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerCluster -metadata: - name: #@ data.values.CLUSTER_NAME - -#@overlay/match by=overlay.subset({"kind": "DockerMachineTemplate", "metadata":{"name": "${CLUSTER_NAME}-control-plane"}}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerMachineTemplate -metadata: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - customImage: #@ data.values.DOCKER_MACHINE_TEMPLATE_IMAGE - -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) -spec: - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: DockerMachineTemplate - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - kubeadmConfigSpec: - initConfiguration: - nodeRegistration: - kubeletExtraArgs: - #@ if disable_cgroupdriver_cgroupfs(): - #@overlay/remove - cgroup-driver: cgroupfs - #@ end - joinConfiguration: - nodeRegistration: - kubeletExtraArgs: - #@ if disable_cgroupdriver_cgroupfs(): - #@overlay/remove - cgroup-driver: cgroupfs - #@ end - clusterConfiguration: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.imageRepository) - etcd: - local: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local.imageRepository) - imageTag: #@ bomDataForK8sVersion.kubeadmConfigSpec.etcd.local.imageTag - #@ if getattr(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local, "extraArgs", None) != None: - #@overlay/match missing_ok=True - extraArgs: - #@ for key in bomDataForK8sVersion.kubeadmConfigSpec.etcd.local["extraArgs"]: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - (@= key @): #@ "{}".format(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local["extraArgs"][key]).lower() - #@ end - #@ end - dns: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.dns.imageRepository) - imageTag: #@ bomDataForK8sVersion.kubeadmConfigSpec.dns.imageTag - #@ if data.values.CNI == "antrea": - preKubeadmCommands: - #! disable TX hardware checksum offload for the veth interface of each Kind Node - #! https://github.com/vmware-tanzu/antrea/blob/master/docs/kind.md#why-is-the-yaml-manifest-different-when-using-kind - #@overlay/append - - curl https://get.docker.com/builds/Linux/x86_64/docker-1.12.0.tgz | tar zxOf - docker/docker > /usr/local/bin/docker;chmod +x /usr/local/bin/docker - #@overlay/append - - #@ construct_pre_kubeadm_command() - #@overlay/append - - sysctl -w net.ipv4.tcp_retries2=4 - #@ end - replicas: #@ data.values.CONTROL_PLANE_MACHINE_COUNT - version: #@ data.values.KUBERNETES_VERSION - -#@overlay/match by=overlay.subset({"kind": "DockerMachineTemplate", "metadata":{"name": "${CLUSTER_NAME}-md-0"}}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: DockerMachineTemplate -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - customImage: #@ data.values.DOCKER_MACHINE_TEMPLATE_IMAGE - -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate", "metadata":{"name": "${CLUSTER_NAME}-md-0"}}) ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - initConfiguration: - nodeRegistration: - kubeletExtraArgs: - #@ if disable_cgroupdriver_cgroupfs(): - #@overlay/remove - cgroup-driver: cgroupfs - #@ end - joinConfiguration: - nodeRegistration: - kubeletExtraArgs: - #@ if disable_cgroupdriver_cgroupfs(): - #@overlay/remove - cgroup-driver: cgroupfs - #@ end - #@ if data.values.CNI == "antrea": - preKubeadmCommands: - #! disable TX hardware checksum offload for the veth interface of each Kind Node - #! https://github.com/vmware-tanzu/antrea/blob/master/docs/kind.md#why-is-the-yaml-manifest-different-when-using-kind - #@overlay/append - - curl https://get.docker.com/builds/Linux/x86_64/docker-1.12.0.tgz | tar zxOf - docker/docker > /usr/local/bin/docker;chmod +x /usr/local/bin/docker - #@overlay/append - - #@ construct_pre_kubeadm_command() - #@overlay/append - - sysctl -w net.ipv4.tcp_retries2=4 - #@ end - - -#@overlay/match by=overlay.subset({"kind":"MachineDeployment"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT - selector: - matchLabels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - template: - metadata: - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - bootstrap: - configRef: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) - clusterName: #@ data.values.CLUSTER_NAME - infrastructureRef: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) - version: #@ data.values.KUBERNETES_VERSION diff --git a/providers/infrastructure-docker/v1.2.8/yttcc/base-template.yaml b/providers/infrastructure-docker/v1.2.8/yttcc/base-template.yaml deleted file mode 100644 index 0a790cb0f3..0000000000 --- a/providers/infrastructure-docker/v1.2.8/yttcc/base-template.yaml +++ /dev/null @@ -1,35 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: ${CLUSTER_NAME} - labels: - tkg.tanzu.vmware.com/cluster-name: '${ CLUSTER_NAME }' - run.tanzu.vmware.com/tkr: v1.23.8---vmware.2-tkg.2-zshippable - annotations: - run.tanzu.vmware.com/resolve-tkr: "" -spec: - clusterNetwork: - pods: - cidrBlocks: - - 100.96.0.0/11 - serviceDomain: null - services: - cidrBlocks: - - 100.64.0.0/13 - topology: - class: tkg-docker-default - version: v1.22.4 - controlPlane: - replicas: 1 - metadata: - labels: - annotations: - workers: - machineDeployments: - - class: default-worker - name: md-0 - replicas: 1 - metadata: - labels: - annotations: - variables: diff --git a/providers/infrastructure-docker/v1.2.8/yttcc/overlay.yaml b/providers/infrastructure-docker/v1.2.8/yttcc/overlay.yaml deleted file mode 100644 index 0c99095024..0000000000 --- a/providers/infrastructure-docker/v1.2.8/yttcc/overlay.yaml +++ /dev/null @@ -1,64 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_default_tkg_bom_data") -#@ load("lib/validate.star", "validate_configuration") -#@ load("/lib/config_variable_association.star", "config_variable_association", "get_cluster_variables") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - -#@ def get_k8s_version_from_tkr(tkr_version): -#@ return tkr_version.split('+')[0] -#@ end - -#@ bomData = get_default_tkg_bom_data() - -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: #@ data.values.CLUSTER_NAME - labels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - run.tanzu.vmware.com/tkr: v1.23.8---vmware.2-tkg.2-zshippable -spec: - topology: - class: #@ data.values.CLUSTER_CLASS - version: #@ data.values.KUBERNETES_VERSION - #@overlay/match missing_ok=True - controlPlane: - replicas: #@ data.values.CONTROL_PLANE_MACHINE_COUNT - metadata: - annotations: - #! VVV TODO(vui) os-name handling - run.tanzu.vmware.com/resolve-os-image: os-name=ubuntu - workers: - machineDeployments: - #@overlay/match by=overlay.index(0) - - class: default-worker - name: md-0 - replicas: #@ data.values.WORKER_MACHINE_COUNT_0 - metadata: - annotations: - #! VVV TODO(tenczar) os-version handling (also handle empty values?) - run.tanzu.vmware.com/resolve-os-image: os-name=ubuntu - variables: - #@overlay/append - - name: TKR_DATA - value: - v1.23.8+vmware.2: #! this comes from the clusterclt for testing - kubernetesSpec: - version: v1.23.8+vmware.2 - coredns: - imageTag: v1.8.6_vmware.7 - etcd: - imageTag: v3.5.4_vmware.6 - imageRepository: projects-stg.registry.vmware.com/tkg - pause: - imageTag: "3.6" - labels: - os-name: ubuntu - os-type: linux - os-arch: amd64 - os-version: "2004" - run.tanzu.vmware.com/tkr: v1.23.8---vmware.2-tkg.2-zshippable diff --git a/providers/infrastructure-docker/ytt/docker-overlay.yaml b/providers/infrastructure-docker/ytt/docker-overlay.yaml deleted file mode 100644 index 4b88c7abf0..0000000000 --- a/providers/infrastructure-docker/ytt/docker-overlay.yaml +++ /dev/null @@ -1 +0,0 @@ -#! Please add any overlays specific to docker provider under this file. diff --git a/providers/infrastructure-docker/yttcc/docker-overlay.yaml b/providers/infrastructure-docker/yttcc/docker-overlay.yaml deleted file mode 100644 index 1fed920ab2..0000000000 --- a/providers/infrastructure-docker/yttcc/docker-overlay.yaml +++ /dev/null @@ -1,6 +0,0 @@ -#! Please add any overlays specific to Docker provider under this file. -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_az_from_region") - -#@ bomData = get_bom_data_for_tkr_name() diff --git a/providers/infrastructure-ipam-in-cluster/v0.1.0/ipam-components.yaml b/providers/infrastructure-ipam-in-cluster/v0.1.0/ipam-components.yaml deleted file mode 100644 index ac50b12409..0000000000 --- a/providers/infrastructure-ipam-in-cluster/v0.1.0/ipam-components.yaml +++ /dev/null @@ -1,513 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - control-plane: controller-manager - name: caip-in-cluster-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: inclusterippools.ipam.cluster.x-k8s.io -spec: - group: ipam.cluster.x-k8s.io - names: - kind: InClusterIPPool - listKind: InClusterIPPoolList - plural: inclusterippools - singular: inclusterippool - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Subnet to allocate IPs from - jsonPath: .spec.subnet - name: Subnet - type: string - - description: First address of the range to allocate from - jsonPath: .spec.first - name: First - type: string - - description: Last address of the range to allocate from - jsonPath: .spec.last - name: Last - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: InClusterIPPool is the Schema for the inclusterippools API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: InClusterIPPoolSpec defines the desired state of InClusterIPPool. - properties: - end: - description: Last is the last address that can be assigned. Must come - after first and needs to fit into a common subnet. If unset, the - second last address of subnet will be used. - type: string - gateway: - description: Gateway - type: string - prefix: - description: Prefix is the network prefix to use. If unset the prefix - from the subnet will be used. - maximum: 128 - type: integer - start: - description: First is the first address that can be assigned. If unset, - the second address of subnet will be used. - type: string - subnet: - description: Subnet is the subnet to assign IP addresses from. Can - be omitted if first, last and prefix are set. - type: string - type: object - status: - description: InClusterIPPoolStatus defines the observed state of InClusterIPPool. - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-controller-manager - namespace: caip-in-cluster-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-leader-election-role - namespace: caip-in-cluster-system -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-manager-role -rules: -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - inclusterippools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - inclusterippools/finalizers - verbs: - - update -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - inclusterippools/status - verbs: - - get - - patch - - update -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddressclaims - verbs: - - get - - list - - patch - - update - - watch -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddressclaims/status - - ipaddresses/finalizers - verbs: - - update -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddressclaims/status - - ipaddresses/status - verbs: - - get - - patch - - update -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddresses - verbs: - - create - - delete - - get - - list - - patch - - update - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-metrics-reader -rules: -- nonResourceURLs: - - /metrics - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-proxy-role -rules: -- apiGroups: - - authentication.k8s.io - resources: - - tokenreviews - verbs: - - create -- apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-leader-election-rolebinding - namespace: caip-in-cluster-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: caip-in-cluster-leader-election-role -subjects: -- kind: ServiceAccount - name: caip-in-cluster-controller-manager - namespace: caip-in-cluster-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: caip-in-cluster-manager-role -subjects: -- kind: ServiceAccount - name: caip-in-cluster-controller-manager - namespace: caip-in-cluster-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-proxy-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: caip-in-cluster-proxy-role -subjects: -- kind: ServiceAccount - name: caip-in-cluster-controller-manager - namespace: caip-in-cluster-system ---- -apiVersion: v1 -data: - controller_manager_config.yaml: | - apiVersion: controller-runtime.sigs.k8s.io/v1alpha1 - kind: ControllerManagerConfig - health: - healthProbeBindAddress: :8081 - metrics: - bindAddress: 127.0.0.1:8080 - webhook: - port: 9443 - leaderElection: - leaderElect: true - resourceName: 7bb7acb4.ipam.cluster.x-k8s.io -kind: ConfigMap -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-manager-config - namespace: caip-in-cluster-system ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - control-plane: controller-manager - name: caip-in-cluster-controller-manager-metrics-service - namespace: caip-in-cluster-system -spec: - ports: - - name: https - port: 8443 - protocol: TCP - targetPort: https - selector: - cluster.x-k8s.io/provider: ipam-in-cluster - control-plane: controller-manager ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-webhook-service - namespace: caip-in-cluster-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: ipam-in-cluster ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - control-plane: controller-manager - name: caip-in-cluster-controller-manager - namespace: caip-in-cluster-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: ipam-in-cluster - control-plane: controller-manager - template: - metadata: - annotations: - kubectl.kubernetes.io/default-container: manager - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - command: - - /manager - image: registry.tkg.vmware.run/cluster-api/cluster-api-ipam-provider-in-cluster:${CAPI_IPAM_PROVIDER_IN_CLUSTER_IMAGE_TAG} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: 8081 - initialDelaySeconds: 15 - periodSeconds: 20 - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 10 - resources: - limits: - cpu: 500m - memory: 128Mi - requests: - cpu: 10m - memory: 64Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - serviceAccountName: caip-in-cluster-controller-manager - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault - terminationGracePeriodSeconds: 10 - volumes: - - name: cert - secret: - secretName: caip-in-cluster-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-serving-cert - namespace: caip-in-cluster-system -spec: - dnsNames: - - caip-in-cluster-webhook-service.caip-in-cluster-system.svc - - caip-in-cluster-webhook-service.caip-in-cluster-system.svc.cluster.local - issuerRef: - kind: Issuer - name: caip-in-cluster-selfsigned-issuer - secretName: caip-in-cluster-webhook-service-cert - subject: - organizations: - - k8s-sig-cluster-lifecycle ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-selfsigned-issuer - namespace: caip-in-cluster-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: caip-in-cluster-system/caip-in-cluster-serving-cert - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: caip-in-cluster-webhook-service - namespace: caip-in-cluster-system - path: /mutate-ipam-cluster-x-k8s-io-v1alpha1-inclusterippool - failurePolicy: Fail - matchPolicy: Equivalent - name: default.inclusterippool.ipam.cluster.x-k8s.io - rules: - - apiGroups: - - ipam.cluster.x-k8s.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - inclusterippools - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: caip-in-cluster-system/caip-in-cluster-serving-cert - labels: - cluster.x-k8s.io/provider: ipam-in-cluster - name: caip-in-cluster-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: caip-in-cluster-webhook-service - namespace: caip-in-cluster-system - path: /validate-ipam-cluster-x-k8s-io-v1alpha1-inclusterippool - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.inclusterippool.ipam.cluster.x-k8s.io - rules: - - apiGroups: - - ipam.cluster.x-k8s.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - inclusterippools - sideEffects: None diff --git a/providers/infrastructure-ipam-in-cluster/v0.1.0/metadata.yaml b/providers/infrastructure-ipam-in-cluster/v0.1.0/metadata.yaml deleted file mode 100644 index 11facb297c..0000000000 --- a/providers/infrastructure-ipam-in-cluster/v0.1.0/metadata.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: - - major: 0 - minor: 1 - contract: v1beta1 diff --git a/providers/infrastructure-oci/v0.4.0/cconly/base.yaml b/providers/infrastructure-oci/v0.4.0/cconly/base.yaml deleted file mode 100644 index f1cf4f694c..0000000000 --- a/providers/infrastructure-oci/v0.4.0/cconly/base.yaml +++ /dev/null @@ -1,1049 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:data", "data") - -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - name: tkg-oci-default - namespace: #@ data.values.NAMESPACE -spec: - controlPlane: - ref: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - name: tkg-oci-kcp - machineInfrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - name: tkg-controlplane-oci-template - workers: - machineDeployments: - - class: tkg-worker - template: - bootstrap: - ref: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: tkg-oci-bootstrap-template - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - name: tkg-oci-worker-template - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - name: oci-cluster-template - variables: - - name: sshKey - required: false - schema: - openAPIV3Schema: - type: string - default: default - - name: privateServiceSubnetId - required: false - schema: - openAPIV3Schema: - type: string - default: "" - - name: compartmentId - required: true - schema: - openAPIV3Schema: - type: string - - name: externalVCNId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalControlPlaneEndpointNSGId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalControlPlaneNSGId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalWorkerNSGId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalControlPlaneEndpointSubnetId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalControlPlaneSubnetId - required: false - schema: - openAPIV3Schema: - type: string - - name: externalWorkerSubnetId - required: false - schema: - openAPIV3Schema: - type: string - - name: nodeMachineShape - required: false - schema: - openAPIV3Schema: - type: string - default: VM.Standard.E4.Flex - - name: nodeMachineOcpus - required: false - schema: - openAPIV3Schema: - type: string - default: "1" - - name: controlPlaneMachineShape - required: false - schema: - openAPIV3Schema: - type: string - default: VM.Standard.E4.Flex - - name: controlPlaneMachineOcpus - required: false - schema: - openAPIV3Schema: - type: string - default: "1" - - name: nodePvTransitEncryption - required: false - schema: - openAPIV3Schema: - type: boolean - default: true - - name: controlPlanePvTransitEncryption - required: false - schema: - openAPIV3Schema: - type: boolean - default: true - - name: imageRepository - required: false - schema: - openAPIV3Schema: - type: object - properties: - host: - type: string - tlsCertificateValidation: - type: boolean - default: true - - name: cni - required: true - schema: - openAPIV3Schema: - type: string - #@ if data.values.CNI: - default: #@ data.values.CNI - #@ else: - default: "" - #@ end - - name: trust - required: false - schema: - openAPIV3Schema: - type: object - properties: - additionalTrustedCAs: - type: array - items: - type: object - properties: - name: - type: string - data: - type: string - required: - - name - - data - - name: auditLogging - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: false - required: - - enabled - default: - enabled: false - - name: TKR_DATA - required: false - schema: - openAPIV3Schema: - type: object - properties: {} - - name: controlPlaneCertificateRotation - required: false - schema: - openAPIV3Schema: - type: object - properties: - activate: - type: boolean - default: true - daysBefore: - type: integer - format: int32 - minimum: 7 - default: 90 - default: - activate: true - daysBefore: 90 - - name: etcdExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: apiServerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: kubeSchedulerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: kubeControllerManagerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: controlPlaneKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: workerKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: { } - - name: tlsCipherSuites - required: false - schema: - openAPIV3Schema: - type: string - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - patches: - - name: etcdExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .etcdExtraArgs }} - {{- if eq $key "cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: apiServerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - {{- end }} - - name: kubeSchedulerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/scheduler/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .kubeSchedulerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: kubeControllerManagerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .kubeControllerManagerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: controlPlaneKubeletExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{ $containProviderId := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "provider-id" }} - {{- $containProviderId = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - {{- if not $containProviderId }} - provider-id: oci://{{ ds["id"] }} - {{- end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{ $containProviderId := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "provider-id" }} - {{- $containProviderId = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - {{- if not $containProviderId }} - provider-id: oci://{{ ds["id"] }} - {{- end }} - - name: workerKubeletExtraArgs - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - "tkg-worker" - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{ $containProviderId := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{- if eq $key "provider-id" }} - {{- $containProviderId = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - {{- if not $containProviderId }} - provider-id: oci://{{ ds["id"] }} - {{- end }} - - name: compartmentId - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: "/spec/template/spec/compartmentId" - valueFrom: - variable: compartmentId - #! JSON Patches for externally managed cluster infrastructure - #! these patches are only enabled if a non-empty externalVCNId variable is specified - - name: skipNetworkManagement - enabledIf: '{{ not (empty .externalVCNId) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: "/spec/template/spec/networkSpec/skipNetworkManagement" - value: true - - name: externalVCNId - enabledIf: '{{ not (empty .externalVCNId) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: "/spec/template/spec/networkSpec/vcn/id" - valueFrom: - variable: externalVCNId - - name: externalNetworkSecurityGroups - enabledIf: '{{ not (empty .externalVCNId) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: replace - path: "/spec/template/spec/networkSpec/vcn/networkSecurityGroups" - valueFrom: - template: | - - id: {{ .externalControlPlaneEndpointNSGId }} - role: control-plane-endpoint - name: control-plane-endpoint - - id: {{ .externalWorkerNSGId }} - role: worker - name: worker - - id: {{ .externalControlPlaneNSGId }} - role: control-plane - name: control-plane - - name: externalSubnets - enabledIf: '{{ not (empty .externalVCNId) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: "/spec/template/spec/networkSpec/vcn/subnets" - valueFrom: - template: | - - id: {{ .externalControlPlaneEndpointSubnetId }} - role: control-plane-endpoint - name: control-plane-endpoint - - id: {{ .externalWorkerSubnetId }} - role: worker - name: worker - - id: {{ .externalControlPlaneSubnetId }} - role: control-plane - name: control-plane - - name: sshAuthorizedKeys - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - controlPlane: true - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: "/spec/template/spec/metadata/ssh_authorized_keys" - valueFrom: - variable: sshKey - - name: nodeShape - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: replace - path: "/spec/template/spec/shape" - valueFrom: - variable: nodeMachineShape - - name: controlPlaneMachineShape - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/shape" - valueFrom: - variable: controlPlaneMachineShape - - name: controlPlaneImageId - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/imageId" - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).osImageRef.id }}' - - name: workerImageId - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: "/spec/template/spec/imageId" - valueFrom: - template: '{{ (index .TKR_DATA .builtin.machineDeployment.version).osImageRef.id }}' - - name: nodeIsPvEncryptionInTransitEnabled - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: "/spec/template/spec/isPvEncryptionInTransitEnabled" - valueFrom: - variable: nodePvTransitEncryption - - name: controlPlaneIsPvEncryptionInTransitEnabled - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/isPvEncryptionInTransitEnabled" - valueFrom: - variable: controlPlanePvTransitEncryption - - name: nodeOcpus - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/shapeConfig/ocpus - valueFrom: - variable: nodeMachineOcpus - - name: controlPlaneOcpus - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: OCIMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/shapeConfig/ocpus - valueFrom: - variable: controlPlaneMachineOcpus - - name: apiServerBindPort - enabledIf: '{{ not (empty .apiServerPort) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/localAPIEndpoint - valueFrom: - template: | - advertiseAddress: '0.0.0.0' - bindPort: {{ .apiServerPort }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/controlPlane - valueFrom: - template: | - localAPIEndpoint: - advertiseAddress: '0.0.0.0' - bindPort: {{ .apiServerPort }} - - name: OCI_KCPT - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.etcd.imageTag }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageRepository - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository }}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageTag - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.coredns.imageTag }}' - - name: customizedImageRepo - enabledIf: '{{ not (empty .imageRepository.host) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - name: kcptCertificateRotation - enabledIf: '{{ .controlPlaneCertificateRotation.activate }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/rolloutBefore - valueFrom: - template: | - certificatesExpiryDays: {{ .controlPlaneCertificateRotation.daysBefore }} ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: OCIClusterTemplate -metadata: - name: oci-cluster-template - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - networkSpec: - vcn: - cidr: "10.0.0.0/16" - subnets: - networkSecurityGroups: - - egressRules: - - egressRule: - description: Control Plane Nodes access to Internet - destination: 0.0.0.0/0 - destinationType: CIDR_BLOCK - isStateless: false - protocol: all - ingressRules: - - ingressRule: - description: Kubernetes API endpoint to Kubernetes control plane node(apiserver - port) communication - isStateless: false - protocol: "6" - source: 10.0.0.8/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 6443 - min: 6443 - - ingressRule: - description: Control plane node to control plane node(apiserver port) - communication - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 6443 - min: 6443 - - ingressRule: - description: Worker Node to Kubernetes control plane node(apiserver port) - communication - isStateless: false - protocol: "6" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 6443 - min: 6443 - - ingressRule: - description: etcd client communication - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 2379 - min: 2379 - - ingressRule: - description: etcd peer - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 2380 - min: 2380 - - ingressRule: - description: Antrea Service - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 10349 - min: 10349 - - ingressRule: - description: Antrea Service - isStateless: false - protocol: "6" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 10349 - min: 10349 - - ingressRule: - description: Geneve Service - isStateless: false - protocol: "17" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - udpOptions: - destinationPortRange: - max: 6081 - min: 6081 - - ingressRule: - description: Geneve Service - isStateless: false - protocol: "17" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - udpOptions: - destinationPortRange: - max: 6081 - min: 6081 - - ingressRule: - description: Path discovery - icmpOptions: - code: 3 - type: 3 - isStateless: false - protocol: "1" - source: 10.0.0.0/16 - sourceType: CIDR_BLOCK - - ingressRule: - description: Inbound SSH traffic to control plane nodes - isStateless: false - protocol: "6" - source: 0.0.0.0/0 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 22 - min: 22 - - ingressRule: - description: Control Plane to Control Plane Kubelet Communication - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 10250 - min: 10250 - name: control-plane - role: control-plane - - egressRules: - - egressRule: - description: Worker Nodes access to Internet - destination: 0.0.0.0/0 - destinationType: CIDR_BLOCK - isStateless: false - protocol: all - ingressRules: - - ingressRule: - description: Inbound SSH traffic to worker nodes - isStateless: false - protocol: "6" - source: 0.0.0.0/0 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 22 - min: 22 - - ingressRule: - description: Path discovery - icmpOptions: - code: 3 - type: 3 - isStateless: false - protocol: "1" - source: 10.0.0.0/16 - sourceType: CIDR_BLOCK - - ingressRule: - description: Control plane nodes to worker node Kubelet Communication - isStateless: false - protocol: "6" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 10250 - min: 10250 - - ingressRule: - description: Worker nodes to worker node Kubelet Communication - isStateless: false - protocol: "6" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 10250 - min: 10250 - - ingressRule: - description: Geneve Service - isStateless: false - protocol: "17" - source: 10.0.0.0/29 - sourceType: CIDR_BLOCK - udpOptions: - destinationPortRange: - max: 6081 - min: 6081 - - ingressRule: - description: Geneve Service - isStateless: false - protocol: "17" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - udpOptions: - destinationPortRange: - max: 6081 - min: 6081 - - ingressRule: - description: Worker node to default NodePort ingress communication - isStateless: false - protocol: "6" - source: 10.0.64.0/20 - sourceType: CIDR_BLOCK - tcpOptions: - destinationPortRange: - max: 32767 - min: 30000 - name: worker - role: worker ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlaneTemplate -metadata: - name: tkg-oci-kcp - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - kubeadmConfigSpec: - files: [] - preKubeadmCommands: - #! Ensure a non-empty preKubeadmCommands array is present to facilitate patching - - echo "running preKubeadmCommands..." - useExperimentalRetryJoin: true - clusterConfiguration: - apiServer: - timeoutForControlPlane: "8m0s" - extraVolumes: [] - extraArgs: {} - controllerManager: - extraArgs: {} - dns: - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - extraArgs: {} - imageRepository: dummy.registry.vmware.com - scheduler: - extraArgs: {} - initConfiguration: - nodeRegistration: - name: '{{ ds["hostname"] }}' - kubeletExtraArgs: {} - joinConfiguration: - nodeRegistration: - name: '{{ ds["hostname"] }}' - kubeletExtraArgs: {} ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: OCIMachineTemplate -metadata: - name: tkg-controlplane-oci-template - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - #! will be replaced by shape variable defined above - shape: VM.Standard.E4.Flex - metadata: {} - shapeConfig: {} - ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: OCIMachineTemplate -metadata: - name: tkg-oci-worker-template - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - #! will be replaced by shape variable defined above - shape: VM.Standard.E4.Flex - metadata: {} - shapeConfig: {} ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: tkg-oci-bootstrap-template - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - joinConfiguration: - nodeRegistration: - kubeletExtraArgs: {} - preKubeadmCommands: [] - files: [] diff --git a/providers/infrastructure-oci/v0.4.0/cconly/overlay-kube-apiserver-admission.yaml b/providers/infrastructure-oci/v0.4.0/cconly/overlay-kube-apiserver-admission.yaml deleted file mode 100644 index 965c26e66d..0000000000 --- a/providers/infrastructure-oci/v0.4.0/cconly/overlay-kube-apiserver-admission.yaml +++ /dev/null @@ -1,192 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/append - - name: eventRateLimitConf - required: false - schema: - openAPIV3Schema: - type: string - default: "" - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/admission-control-config.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: admin-control-conf - hostPath: /etc/kubernetes/admission-control-config.yaml - mountPath: /etc/kubernetes/admission-control-config.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/admission-control-config.yaml - content: |- - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - {{- if and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }} - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - {{- end }} - {{- if .eventRateLimitConf }} - - name: EventRateLimit - path: eventConfig.yaml - {{- end }} - enabledIf: '{{ or (and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version)) (.eventRateLimitConf) }}' - #@overlay/append - - name: eventRateLimitConf - description: "Adds an admission configuration for EventRateLimit." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/enable-admission-plugins" - valueFrom: - template: | - {{ $containEnableAdmissionPlugin := false }} - {{- $admissionPlugins := "" }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "enable-admission-plugins" }} - {{- $containEnableAdmissionPlugin = true }} - {{- $admissionPlugins = $val }} - {{- end }} - {{- end }} - {{- if not $containEnableAdmissionPlugin }} - NodeRestriction,EventRateLimit - {{- else -}} - {{- $admissionPlugins -}},EventRateLimit - {{- end }} - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: event-conf - hostPath: /etc/kubernetes/eventConfig.yaml - mountPath: /etc/kubernetes/eventConfig.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/eventConfig.yaml - encoding: base64 - content: {{ .eventRateLimitConf}} - enabledIf: '{{ not (empty .eventRateLimitConf) }}' diff --git a/providers/infrastructure-oci/v0.4.0/cconly/overlay.yaml b/providers/infrastructure-oci/v0.4.0/cconly/overlay.yaml deleted file mode 100644 index 6efd795148..0000000000 --- a/providers/infrastructure-oci/v0.4.0/cconly/overlay.yaml +++ /dev/null @@ -1,66 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - controlPlane: - #@overlay/match missing_ok=True - machineHealthCheck: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_CONTROL_PLANE: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_CONTROL_PLANE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - workers: - machineDeployments: - #@overlay/match by=overlay.index(0) - - class: tkg-worker - #@overlay/match missing_ok=True - machineHealthCheck: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - patches: - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: CAPOCI_KCP_INIT_EMPTY_FILES_ARRAY - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: KCP_INIT_APISERVER_EMPTY_EXTRAVOLUMES_ARRAY diff --git a/providers/infrastructure-oci/v0.4.0/cluster-template-definition-devcc.yaml b/providers/infrastructure-oci/v0.4.0/cluster-template-definition-devcc.yaml deleted file mode 100644 index a2969cb45c..0000000000 --- a/providers/infrastructure-oci/v0.4.0/cluster-template-definition-devcc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/yttcb - - path: providers/infrastructure-oci/v0.4.0/yttcc - - path: providers/infrastructure-oci/yttcc - - path: providers/yttcc - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-oci/v0.4.0/cluster-template-definition-prodcc.yaml b/providers/infrastructure-oci/v0.4.0/cluster-template-definition-prodcc.yaml deleted file mode 100644 index a2969cb45c..0000000000 --- a/providers/infrastructure-oci/v0.4.0/cluster-template-definition-prodcc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/yttcb - - path: providers/infrastructure-oci/v0.4.0/yttcc - - path: providers/infrastructure-oci/yttcc - - path: providers/yttcc - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-oci/v0.4.0/clusterclass-tkg-oci-default.yaml b/providers/infrastructure-oci/v0.4.0/clusterclass-tkg-oci-default.yaml deleted file mode 100644 index 119885b309..0000000000 --- a/providers/infrastructure-oci/v0.4.0/clusterclass-tkg-oci-default.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-oci/v0.4.0/cconly - - path: providers/config_default.yaml diff --git a/providers/infrastructure-oci/v0.4.0/infrastructure-components.yaml b/providers/infrastructure-oci/v0.4.0/infrastructure-components.yaml deleted file mode 100644 index b93b3dd3ab..0000000000 --- a/providers/infrastructure-oci/v0.4.0/infrastructure-components.yaml +++ /dev/null @@ -1,3303 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager - name: cluster-api-provider-oci-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: cluster-api-provider-oci-system/capoci-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-oci - cluster.x-k8s.io/v1beta1: v1beta1 - name: ociclusters.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - service: - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - kind: OCICluster - listKind: OCIClusterList - plural: ociclusters - singular: ocicluster - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: OCICluster is the Schema for the ociclusters API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OCIClusterSpec defines the desired state of OciCluster - properties: - compartmentId: - description: Compartment to create the cluster network. - type: string - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to - communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - definedTags: - additionalProperties: - additionalProperties: - type: string - type: object - description: 'Defined tags for this resource. Each key is predefined - and scoped to a namespace. For more information, see Resource Tags - (https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm). - Example: `{"Operations": {"CostCenter": "42"}}`' - type: object - freeformTags: - additionalProperties: - type: string - description: Free-form tags for this resource. - type: object - networkSpec: - description: NetworkSpec encapsulates all things related to OCI network. - properties: - apiServerLoadBalancer: - description: API Server LB configuration. - properties: - loadBalancerId: - description: ID of Load Balancer. - type: string - name: - description: LoadBalancer Name. - type: string - type: object - skipNetworkManagement: - description: SkipNetworkManagement defines if the networking spec(VCN - related) specified by the user needs to be reconciled(actioned-upon) - or used as it is. APIServerLB will still be reconciled. - type: boolean - vcn: - description: VCN configuration. - properties: - cidr: - description: VCN CIDR. - type: string - id: - description: VCN OCID. - type: string - internetGatewayId: - description: ID of Internet Gateway. - type: string - name: - description: VCN Name. - type: string - natGatewayId: - description: ID of Nat Gateway. - type: string - networkSecurityGroups: - description: NetworkSecurityGroups is the configuration for - the Network Security Groups required in the VCN. - items: - description: NSG defines configuration for a Network Security - Group. https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/networksecuritygroups.htm - properties: - egressRules: - description: EgressRules on the NSG. - items: - description: EgressSecurityRuleForNSG is EgressSecurityRule - for NSG. - properties: - egressRule: - description: EgressSecurityRule A rule for allowing - outbound IP packets. - properties: - description: - description: An optional description of your - choice for the rule. - type: string - destination: - description: 'Conceptually, this is the range - of IP addresses that a packet originating - from the instance can go to. Allowed values: * - IP address range in CIDR notation. For example: - `192.168.1.0/24` or `2001:0db8:0123:45::/56` Note - that IPv6 addressing is currently supported - only in certain regions. See IPv6 Addresses - (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, if - you''re setting up a security list rule - for traffic destined for a particular `Service` - through a service gateway. For example: - `oci-phx-objectstorage`.' - type: string - destinationType: - description: 'Type of destination for the - rule. The default is `CIDR_BLOCK`. Allowed - values: * `CIDR_BLOCK`: If the rule''s - `destination` is an IP address range in - CIDR notation. * `SERVICE_CIDR_BLOCK`: - If the rule''s `destination` is the `cidrBlock` - value for a Service (the rule is for - traffic destined for a particular `Service` - through a service gateway).' - type: string - icmpOptions: - description: 'IcmpOptions Optional and valid - only for ICMP and ICMPv6. Use to specify - a particular ICMP type and code as defined - in: - ICMP Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as the protocol - but omit this object, then all ICMP types - and codes are allowed. If you do provide - this object, the type is required and the - code is optional. To enable MTU negotiation - for ingress internet traffic via IPv4, make - sure to allow type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and Don''t - Fragment was Set"). If you need to specify - multiple codes for a single type, create - a separate security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows traffic - in one direction. Remember to add a corresponding - stateless rule in the other direction if - you need to support bidirectional traffic. - For example, if egress traffic allows TCP - destination port 80, there should be an - ingress rule to allow TCP source port 80. - Defaults to false, which means the rule - is stateful and a corresponding rule is - not necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. Specify - either `all` or an IPv4 protocol number - as defined in Protocol Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP ("1"), - TCP ("6"), UDP ("17"), and ICMPv6 ("58"). - type: string - tcpOptions: - description: TcpOptions Optional and valid - only for TCP. Use to specify particular - destination ports for TCP rules. If you - specify TCP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and valid - only for UDP. Use to specify particular - destination ports for UDP rules. If you - specify UDP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - type: object - id: - description: 'EgressSecurityRule ID for NSG. Deprecated: - this field is not populated and used during - reconciliation' - type: string - type: object - type: array - id: - description: NSG OCID. - type: string - ingressRules: - description: IngressRules on the NSG. - items: - description: IngressSecurityRuleForNSG is IngressSecurityRule - for NSG - properties: - id: - description: 'IngressSecurityRule ID for NSG. - Deprecated: this field is not populated and - used during reconciliation' - type: string - ingressRule: - description: IngressSecurityRule A rule for allowing - inbound IP packets. - properties: - description: - description: An optional description of your - choice for the rule. - type: string - icmpOptions: - description: 'IcmpOptions Optional and valid - only for ICMP and ICMPv6. Use to specify - a particular ICMP type and code as defined - in: - ICMP Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as the protocol - but omit this object, then all ICMP types - and codes are allowed. If you do provide - this object, the type is required and the - code is optional. To enable MTU negotiation - for ingress internet traffic via IPv4, make - sure to allow type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and Don''t - Fragment was Set"). If you need to specify - multiple codes for a single type, create - a separate security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows traffic - in one direction. Remember to add a corresponding - stateless rule in the other direction if - you need to support bidirectional traffic. - For example, if ingress traffic allows TCP - destination port 80, there should be an - egress rule to allow TCP source port 80. - Defaults to false, which means the rule - is stateful and a corresponding rule is - not necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. Specify - either `all` or an IPv4 protocol number - as defined in Protocol Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP ("1"), - TCP ("6"), UDP ("17"), and ICMPv6 ("58"). - type: string - source: - description: 'Conceptually, this is the range - of IP addresses that a packet coming into - the instance can come from. Allowed values: * - IP address range in CIDR notation. For example: - `192.168.1.0/24` or `2001:0db8:0123:45::/56`. IPv6 - addressing is supported for all commercial - and government regions. See IPv6 Addresses - (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, if - you''re setting up a security list rule - for traffic coming from a particular `Service` - through a service gateway. For example: - `oci-phx-objectstorage`.' - type: string - sourceType: - description: 'Type of source for the rule. - The default is `CIDR_BLOCK`. * `CIDR_BLOCK`: - If the rule''s `source` is an IP address - range in CIDR notation. * `SERVICE_CIDR_BLOCK`: - If the rule''s `source` is the `cidrBlock` - value for a Service (the rule is for - traffic coming from a particular `Service` - through a service gateway).' - type: string - tcpOptions: - description: TcpOptions Optional and valid - only for TCP. Use to specify particular - destination ports for TCP rules. If you - specify TCP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and valid - only for UDP. Use to specify particular - destination ports for UDP rules. If you - specify UDP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - type: object - type: object - type: array - name: - description: NSG Name. - type: string - role: - description: Role defines the NSG role (eg. control-plane, - control-plane-endpoint, service-lb, worker). - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - privateRouteTableId: - description: ID of Private Route Table. - type: string - publicRouteTableId: - description: ID of Public Route Table. - type: string - serviceGatewayId: - description: ID of Service Gateway. - type: string - subnets: - description: Subnets is the configuration for subnets required - in the VCN. - items: - description: Subnet defines the configuration for a network's - subnet https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/managingVCNs_topic-Overview_of_VCNs_and_Subnets.htm#Overview - properties: - cidr: - description: Subnet CIDR. - type: string - id: - description: Subnet OCID. - type: string - name: - description: Subnet Name. - type: string - role: - description: Role defines the subnet role (eg. control-plane, - control-plane-endpoint, service-lb, worker). - type: string - securityList: - description: The security list associated with Subnet. - properties: - egressRules: - description: EgressRules on the SecurityList. - items: - description: EgressSecurityRule A rule for allowing - outbound IP packets. - properties: - description: - description: An optional description of your - choice for the rule. - type: string - destination: - description: 'Conceptually, this is the range - of IP addresses that a packet originating - from the instance can go to. Allowed values: * - IP address range in CIDR notation. For example: - `192.168.1.0/24` or `2001:0db8:0123:45::/56` Note - that IPv6 addressing is currently supported - only in certain regions. See IPv6 Addresses - (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, if - you''re setting up a security list rule - for traffic destined for a particular `Service` - through a service gateway. For example: - `oci-phx-objectstorage`.' - type: string - destinationType: - description: 'Type of destination for the - rule. The default is `CIDR_BLOCK`. Allowed - values: * `CIDR_BLOCK`: If the rule''s - `destination` is an IP address range in - CIDR notation. * `SERVICE_CIDR_BLOCK`: - If the rule''s `destination` is the `cidrBlock` - value for a Service (the rule is for - traffic destined for a particular `Service` - through a service gateway).' - type: string - icmpOptions: - description: 'IcmpOptions Optional and valid - only for ICMP and ICMPv6. Use to specify - a particular ICMP type and code as defined - in: - ICMP Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as the protocol - but omit this object, then all ICMP types - and codes are allowed. If you do provide - this object, the type is required and the - code is optional. To enable MTU negotiation - for ingress internet traffic via IPv4, make - sure to allow type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and Don''t - Fragment was Set"). If you need to specify - multiple codes for a single type, create - a separate security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows traffic - in one direction. Remember to add a corresponding - stateless rule in the other direction if - you need to support bidirectional traffic. - For example, if egress traffic allows TCP - destination port 80, there should be an - ingress rule to allow TCP source port 80. - Defaults to false, which means the rule - is stateful and a corresponding rule is - not necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. Specify - either `all` or an IPv4 protocol number - as defined in Protocol Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP ("1"), - TCP ("6"), UDP ("17"), and ICMPv6 ("58"). - type: string - tcpOptions: - description: TcpOptions Optional and valid - only for TCP. Use to specify particular - destination ports for TCP rules. If you - specify TCP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and valid - only for UDP. Use to specify particular - destination ports for UDP rules. If you - specify UDP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - type: object - type: array - id: - description: ID of the SecurityList. - type: string - ingressRules: - description: IngressRules on the SecurityList. - items: - description: IngressSecurityRule A rule for allowing - inbound IP packets. - properties: - description: - description: An optional description of your - choice for the rule. - type: string - icmpOptions: - description: 'IcmpOptions Optional and valid - only for ICMP and ICMPv6. Use to specify - a particular ICMP type and code as defined - in: - ICMP Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as the protocol - but omit this object, then all ICMP types - and codes are allowed. If you do provide - this object, the type is required and the - code is optional. To enable MTU negotiation - for ingress internet traffic via IPv4, make - sure to allow type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and Don''t - Fragment was Set"). If you need to specify - multiple codes for a single type, create - a separate security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows traffic - in one direction. Remember to add a corresponding - stateless rule in the other direction if - you need to support bidirectional traffic. - For example, if ingress traffic allows TCP - destination port 80, there should be an - egress rule to allow TCP source port 80. - Defaults to false, which means the rule - is stateful and a corresponding rule is - not necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. Specify - either `all` or an IPv4 protocol number - as defined in Protocol Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP ("1"), - TCP ("6"), UDP ("17"), and ICMPv6 ("58"). - type: string - source: - description: 'Conceptually, this is the range - of IP addresses that a packet coming into - the instance can come from. Allowed values: * - IP address range in CIDR notation. For example: - `192.168.1.0/24` or `2001:0db8:0123:45::/56`. IPv6 - addressing is supported for all commercial - and government regions. See IPv6 Addresses - (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, if - you''re setting up a security list rule - for traffic coming from a particular `Service` - through a service gateway. For example: - `oci-phx-objectstorage`.' - type: string - sourceType: - description: 'Type of source for the rule. - The default is `CIDR_BLOCK`. * `CIDR_BLOCK`: - If the rule''s `source` is an IP address - range in CIDR notation. * `SERVICE_CIDR_BLOCK`: - If the rule''s `source` is the `cidrBlock` - value for a Service (the rule is for - traffic coming from a particular `Service` - through a service gateway).' - type: string - tcpOptions: - description: TcpOptions Optional and valid - only for TCP. Use to specify particular - destination ports for TCP rules. If you - specify TCP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and valid - only for UDP. Use to specify particular - destination ports for UDP rules. If you - specify UDP as the protocol but omit this - object, then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port number, - which must not be less than the - minimum port number. To specify - a single port number, set both the - min and max to the same value. - type: integer - min: - description: The minimum port number, - which must not be greater than the - maximum port number. - type: integer - type: object - type: object - type: object - type: array - name: - description: SecurityList Name. - type: string - type: object - type: - description: Type defines the subnet type (e.g. public, - private). - type: string - required: - - name - - role - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - vcnPeering: - description: VCNPeering configuration. - properties: - drg: - description: DRG configuration refers to the DRG which has - to be created if required. If management cluster and workload - cluster shares the same DRG, this fields is not required - to be specified. - properties: - id: - description: ID is the OCID for the created DRG. - type: string - manage: - description: Manage defines whether the DRG has to be - managed(including create). If set to false(the default) - the ID has to be specified by the user to a valid DRG - ID to which the VCN has to be attached. - type: boolean - name: - description: Name is the name of the created DRG. - type: string - vcnAttachmentId: - description: VcnAttachmentId is the ID of the VCN attachment - of the DRG. The workload cluster VCN can be attached - to either the management cluster VCN if they are sharing - the same DRG or to the workload cluster DRG. - type: string - type: object - peerRouteRules: - description: PeerRouteRules defines the routing rules which - will be added to the private route tables of the workload - cluster VCN. The routes defined here will be directed to - DRG. - items: - description: PeerRouteRule defines a Route Rule to be routed - via a DRG. - properties: - vcnCIDRRange: - description: VCNCIDRRange is the CIDR Range of peer - VCN to which the workload cluster VCN will be peered. - The CIDR range is required to add the route rule in - the workload cluster VCN, the route rule will forward - any traffic to the CIDR to the DRG. - type: string - type: object - type: array - remotePeeringConnections: - description: RemotePeeringConnections defines the RPC connections - which be established with the workload cluster DRG. - items: - description: RemotePeeringConnection is used to peer VCNs - residing in different regions(typically). Remote VCN Peering - is explained here - https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/remoteVCNpeering.htm - properties: - managePeerRPC: - description: ManagePeerRPC will define if the Peer VCN - needs to be managed. If set to true a Remote Peering - Connection will be created in the Peer DRG and the - connection will be created between local and peer - RPC. - type: boolean - peerDRGId: - description: PeerDRGId defines the DRG ID of the peer. - type: string - peerRPCConnectionId: - description: PeerRPCConnectionId defines the RPC ID - of peer. If ManagePeerRPC is set to true this will - be created by Cluster API Provider for OCI, otherwise - this has be defined by the user. - type: string - peerRegionName: - description: PeerRegionName defined the region name - of Peer VCN. - type: string - rpcConnectionId: - description: RPCConnectionId is the connection ID of - the connection between peer and local RPC. - type: string - type: object - type: array - type: object - type: object - ociResourceIdentifier: - description: The unique ID which will be used to tag all the resources - created by this Cluster. The tag will be used to identify resources - belonging to this cluster. this will be auto-generated and should - not be set by the user. - type: string - region: - description: Region the cluster operates in. It must be one of available - regions in Region Identifier format. See https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm - type: string - type: object - status: - description: OCIClusterStatus defines the observed state of OCICluster - properties: - availabilityDomains: - additionalProperties: - description: OCIAvailabilityDomain contains information about an - Availability Domain (AD). - properties: - faultDomains: - description: 'FaultDomains a list of fault domain (FD) names. - Example: ["FAULT-DOMAIN-1"]' - items: - type: string - type: array - name: - description: 'Name is the AD''s full name. Example: Uocm:PHX-AD-1' - type: string - type: object - description: AvailabilityDomains encapsulates the clusters Availability - Domain (AD) information in a map where the map key is the AD name - and the struct is details about the AD. - type: object - conditions: - description: NetworkSpec encapsulates all things related to OCI network. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure - domains. It allows controllers to understand how many failure - domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an - infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain - is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a slice of FailureDomains. - type: object - ready: - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-oci - cluster.x-k8s.io/v1beta1: v1beta1 - name: ociclustertemplates.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: OCIClusterTemplate - listKind: OCIClusterTemplateList - plural: ociclustertemplates - singular: ociclustertemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: OCIClusterTemplate is the Schema for the ociclustertemplates - API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OCIClusterTemplateSpec defines the desired state of OCIClusterTemplate. - properties: - template: - description: OCIClusterTemplateResource describes the data needed - to create an OCICluster from a template. - properties: - spec: - description: OCIClusterSpec defines the desired state of OciCluster - properties: - compartmentId: - description: Compartment to create the cluster network. - type: string - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint - used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - definedTags: - additionalProperties: - additionalProperties: - type: string - type: object - description: 'Defined tags for this resource. Each key is - predefined and scoped to a namespace. For more information, - see Resource Tags (https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm). - Example: `{"Operations": {"CostCenter": "42"}}`' - type: object - freeformTags: - additionalProperties: - type: string - description: Free-form tags for this resource. - type: object - networkSpec: - description: NetworkSpec encapsulates all things related to - OCI network. - properties: - apiServerLoadBalancer: - description: API Server LB configuration. - properties: - loadBalancerId: - description: ID of Load Balancer. - type: string - name: - description: LoadBalancer Name. - type: string - type: object - skipNetworkManagement: - description: SkipNetworkManagement defines if the networking - spec(VCN related) specified by the user needs to be - reconciled(actioned-upon) or used as it is. APIServerLB - will still be reconciled. - type: boolean - vcn: - description: VCN configuration. - properties: - cidr: - description: VCN CIDR. - type: string - id: - description: VCN OCID. - type: string - internetGatewayId: - description: ID of Internet Gateway. - type: string - name: - description: VCN Name. - type: string - natGatewayId: - description: ID of Nat Gateway. - type: string - networkSecurityGroups: - description: NetworkSecurityGroups is the configuration - for the Network Security Groups required in the - VCN. - items: - description: NSG defines configuration for a Network - Security Group. https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/networksecuritygroups.htm - properties: - egressRules: - description: EgressRules on the NSG. - items: - description: EgressSecurityRuleForNSG is EgressSecurityRule - for NSG. - properties: - egressRule: - description: EgressSecurityRule A rule - for allowing outbound IP packets. - properties: - description: - description: An optional description - of your choice for the rule. - type: string - destination: - description: 'Conceptually, this is - the range of IP addresses that a - packet originating from the instance - can go to. Allowed values: * IP - address range in CIDR notation. - For example: `192.168.1.0/24` or - `2001:0db8:0123:45::/56` Note - that IPv6 addressing is currently - supported only in certain regions. - See IPv6 Addresses (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, - if you''re setting up a security - list rule for traffic destined for - a particular `Service` through a - service gateway. For example: `oci-phx-objectstorage`.' - type: string - destinationType: - description: 'Type of destination - for the rule. The default is `CIDR_BLOCK`. - Allowed values: * `CIDR_BLOCK`: - If the rule''s `destination` is - an IP address range in CIDR notation. * - `SERVICE_CIDR_BLOCK`: If the rule''s - `destination` is the `cidrBlock` - value for a Service (the rule - is for traffic destined for a particular - `Service` through a service gateway).' - type: string - icmpOptions: - description: 'IcmpOptions Optional - and valid only for ICMP and ICMPv6. - Use to specify a particular ICMP - type and code as defined in: - ICMP - Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as - the protocol but omit this object, - then all ICMP types and codes are - allowed. If you do provide this - object, the type is required and - the code is optional. To enable - MTU negotiation for ingress internet - traffic via IPv4, make sure to allow - type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and - Don''t Fragment was Set"). If you - need to specify multiple codes for - a single type, create a separate - security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows - traffic in one direction. Remember - to add a corresponding stateless - rule in the other direction if you - need to support bidirectional traffic. - For example, if egress traffic allows - TCP destination port 80, there should - be an ingress rule to allow TCP - source port 80. Defaults to false, - which means the rule is stateful - and a corresponding rule is not - necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. - Specify either `all` or an IPv4 - protocol number as defined in Protocol - Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP - ("1"), TCP ("6"), UDP ("17"), and - ICMPv6 ("58"). - type: string - tcpOptions: - description: TcpOptions Optional and - valid only for TCP. Use to specify - particular destination ports for - TCP rules. If you specify TCP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and - valid only for UDP. Use to specify - particular destination ports for - UDP rules. If you specify UDP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - type: object - id: - description: 'EgressSecurityRule ID for - NSG. Deprecated: this field is not populated - and used during reconciliation' - type: string - type: object - type: array - id: - description: NSG OCID. - type: string - ingressRules: - description: IngressRules on the NSG. - items: - description: IngressSecurityRuleForNSG is - IngressSecurityRule for NSG - properties: - id: - description: 'IngressSecurityRule ID for - NSG. Deprecated: this field is not populated - and used during reconciliation' - type: string - ingressRule: - description: IngressSecurityRule A rule - for allowing inbound IP packets. - properties: - description: - description: An optional description - of your choice for the rule. - type: string - icmpOptions: - description: 'IcmpOptions Optional - and valid only for ICMP and ICMPv6. - Use to specify a particular ICMP - type and code as defined in: - ICMP - Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as - the protocol but omit this object, - then all ICMP types and codes are - allowed. If you do provide this - object, the type is required and - the code is optional. To enable - MTU negotiation for ingress internet - traffic via IPv4, make sure to allow - type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and - Don''t Fragment was Set"). If you - need to specify multiple codes for - a single type, create a separate - security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows - traffic in one direction. Remember - to add a corresponding stateless - rule in the other direction if you - need to support bidirectional traffic. - For example, if ingress traffic - allows TCP destination port 80, - there should be an egress rule to - allow TCP source port 80. Defaults - to false, which means the rule is - stateful and a corresponding rule - is not necessary for bidirectional - traffic. - type: boolean - protocol: - description: The transport protocol. - Specify either `all` or an IPv4 - protocol number as defined in Protocol - Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP - ("1"), TCP ("6"), UDP ("17"), and - ICMPv6 ("58"). - type: string - source: - description: 'Conceptually, this is - the range of IP addresses that a - packet coming into the instance - can come from. Allowed values: * - IP address range in CIDR notation. - For example: `192.168.1.0/24` or - `2001:0db8:0123:45::/56`. IPv6 - addressing is supported for all - commercial and government regions. - See IPv6 Addresses (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, - if you''re setting up a security - list rule for traffic coming from - a particular `Service` through a - service gateway. For example: `oci-phx-objectstorage`.' - type: string - sourceType: - description: 'Type of source for the - rule. The default is `CIDR_BLOCK`. * - `CIDR_BLOCK`: If the rule''s `source` - is an IP address range in CIDR notation. * - `SERVICE_CIDR_BLOCK`: If the rule''s - `source` is the `cidrBlock` value - for a Service (the rule is for - traffic coming from a particular - `Service` through a service gateway).' - type: string - tcpOptions: - description: TcpOptions Optional and - valid only for TCP. Use to specify - particular destination ports for - TCP rules. If you specify TCP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and - valid only for UDP. Use to specify - particular destination ports for - UDP rules. If you specify UDP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - type: object - type: object - type: array - name: - description: NSG Name. - type: string - role: - description: Role defines the NSG role (eg. - control-plane, control-plane-endpoint, service-lb, - worker). - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - privateRouteTableId: - description: ID of Private Route Table. - type: string - publicRouteTableId: - description: ID of Public Route Table. - type: string - serviceGatewayId: - description: ID of Service Gateway. - type: string - subnets: - description: Subnets is the configuration for subnets - required in the VCN. - items: - description: Subnet defines the configuration for - a network's subnet https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/managingVCNs_topic-Overview_of_VCNs_and_Subnets.htm#Overview - properties: - cidr: - description: Subnet CIDR. - type: string - id: - description: Subnet OCID. - type: string - name: - description: Subnet Name. - type: string - role: - description: Role defines the subnet role (eg. - control-plane, control-plane-endpoint, service-lb, - worker). - type: string - securityList: - description: The security list associated with - Subnet. - properties: - egressRules: - description: EgressRules on the SecurityList. - items: - description: EgressSecurityRule A rule - for allowing outbound IP packets. - properties: - description: - description: An optional description - of your choice for the rule. - type: string - destination: - description: 'Conceptually, this is - the range of IP addresses that a - packet originating from the instance - can go to. Allowed values: * IP - address range in CIDR notation. - For example: `192.168.1.0/24` or - `2001:0db8:0123:45::/56` Note - that IPv6 addressing is currently - supported only in certain regions. - See IPv6 Addresses (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, - if you''re setting up a security - list rule for traffic destined for - a particular `Service` through a - service gateway. For example: `oci-phx-objectstorage`.' - type: string - destinationType: - description: 'Type of destination - for the rule. The default is `CIDR_BLOCK`. - Allowed values: * `CIDR_BLOCK`: - If the rule''s `destination` is - an IP address range in CIDR notation. * - `SERVICE_CIDR_BLOCK`: If the rule''s - `destination` is the `cidrBlock` - value for a Service (the rule - is for traffic destined for a particular - `Service` through a service gateway).' - type: string - icmpOptions: - description: 'IcmpOptions Optional - and valid only for ICMP and ICMPv6. - Use to specify a particular ICMP - type and code as defined in: - ICMP - Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as - the protocol but omit this object, - then all ICMP types and codes are - allowed. If you do provide this - object, the type is required and - the code is optional. To enable - MTU negotiation for ingress internet - traffic via IPv4, make sure to allow - type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and - Don''t Fragment was Set"). If you - need to specify multiple codes for - a single type, create a separate - security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows - traffic in one direction. Remember - to add a corresponding stateless - rule in the other direction if you - need to support bidirectional traffic. - For example, if egress traffic allows - TCP destination port 80, there should - be an ingress rule to allow TCP - source port 80. Defaults to false, - which means the rule is stateful - and a corresponding rule is not - necessary for bidirectional traffic. - type: boolean - protocol: - description: The transport protocol. - Specify either `all` or an IPv4 - protocol number as defined in Protocol - Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP - ("1"), TCP ("6"), UDP ("17"), and - ICMPv6 ("58"). - type: string - tcpOptions: - description: TcpOptions Optional and - valid only for TCP. Use to specify - particular destination ports for - TCP rules. If you specify TCP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and - valid only for UDP. Use to specify - particular destination ports for - UDP rules. If you specify UDP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - type: object - type: array - id: - description: ID of the SecurityList. - type: string - ingressRules: - description: IngressRules on the SecurityList. - items: - description: IngressSecurityRule A rule - for allowing inbound IP packets. - properties: - description: - description: An optional description - of your choice for the rule. - type: string - icmpOptions: - description: 'IcmpOptions Optional - and valid only for ICMP and ICMPv6. - Use to specify a particular ICMP - type and code as defined in: - ICMP - Parameters (http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) - - ICMPv6 Parameters (https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml) - If you specify ICMP or ICMPv6 as - the protocol but omit this object, - then all ICMP types and codes are - allowed. If you do provide this - object, the type is required and - the code is optional. To enable - MTU negotiation for ingress internet - traffic via IPv4, make sure to allow - type 3 ("Destination Unreachable") - code 4 ("Fragmentation Needed and - Don''t Fragment was Set"). If you - need to specify multiple codes for - a single type, create a separate - security list rule for each.' - properties: - code: - description: The ICMP code (optional). - type: integer - type: - description: The ICMP type. - type: integer - type: object - isStateless: - description: A stateless rule allows - traffic in one direction. Remember - to add a corresponding stateless - rule in the other direction if you - need to support bidirectional traffic. - For example, if ingress traffic - allows TCP destination port 80, - there should be an egress rule to - allow TCP source port 80. Defaults - to false, which means the rule is - stateful and a corresponding rule - is not necessary for bidirectional - traffic. - type: boolean - protocol: - description: The transport protocol. - Specify either `all` or an IPv4 - protocol number as defined in Protocol - Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml). - Options are supported only for ICMP - ("1"), TCP ("6"), UDP ("17"), and - ICMPv6 ("58"). - type: string - source: - description: 'Conceptually, this is - the range of IP addresses that a - packet coming into the instance - can come from. Allowed values: * - IP address range in CIDR notation. - For example: `192.168.1.0/24` or - `2001:0db8:0123:45::/56`. IPv6 - addressing is supported for all - commercial and government regions. - See IPv6 Addresses (https://docs.cloud.oracle.com/iaas/Content/Network/Concepts/ipv6.htm). * - The `cidrBlock` value for a Service, - if you''re setting up a security - list rule for traffic coming from - a particular `Service` through a - service gateway. For example: `oci-phx-objectstorage`.' - type: string - sourceType: - description: 'Type of source for the - rule. The default is `CIDR_BLOCK`. * - `CIDR_BLOCK`: If the rule''s `source` - is an IP address range in CIDR notation. * - `SERVICE_CIDR_BLOCK`: If the rule''s - `source` is the `cidrBlock` value - for a Service (the rule is for - traffic coming from a particular - `Service` through a service gateway).' - type: string - tcpOptions: - description: TcpOptions Optional and - valid only for TCP. Use to specify - particular destination ports for - TCP rules. If you specify TCP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - udpOptions: - description: UdpOptions Optional and - valid only for UDP. Use to specify - particular destination ports for - UDP rules. If you specify UDP as - the protocol but omit this object, - then all destination ports are allowed. - properties: - destinationPortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - sourcePortRange: - description: PortRange The representation - of PortRange. - properties: - max: - description: The maximum port - number, which must not be - less than the minimum port - number. To specify a single - port number, set both the - min and max to the same - value. - type: integer - min: - description: The minimum port - number, which must not be - greater than the maximum - port number. - type: integer - type: object - type: object - type: object - type: array - name: - description: SecurityList Name. - type: string - type: object - type: - description: Type defines the subnet type (e.g. - public, private). - type: string - required: - - name - - role - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - type: object - vcnPeering: - description: VCNPeering configuration. - properties: - drg: - description: DRG configuration refers to the DRG which - has to be created if required. If management cluster - and workload cluster shares the same DRG, this fields - is not required to be specified. - properties: - id: - description: ID is the OCID for the created DRG. - type: string - manage: - description: Manage defines whether the DRG has - to be managed(including create). If set to false(the - default) the ID has to be specified by the user - to a valid DRG ID to which the VCN has to be - attached. - type: boolean - name: - description: Name is the name of the created DRG. - type: string - vcnAttachmentId: - description: VcnAttachmentId is the ID of the - VCN attachment of the DRG. The workload cluster - VCN can be attached to either the management - cluster VCN if they are sharing the same DRG - or to the workload cluster DRG. - type: string - type: object - peerRouteRules: - description: PeerRouteRules defines the routing rules - which will be added to the private route tables - of the workload cluster VCN. The routes defined - here will be directed to DRG. - items: - description: PeerRouteRule defines a Route Rule - to be routed via a DRG. - properties: - vcnCIDRRange: - description: VCNCIDRRange is the CIDR Range - of peer VCN to which the workload cluster - VCN will be peered. The CIDR range is required - to add the route rule in the workload cluster - VCN, the route rule will forward any traffic - to the CIDR to the DRG. - type: string - type: object - type: array - remotePeeringConnections: - description: RemotePeeringConnections defines the - RPC connections which be established with the workload - cluster DRG. - items: - description: RemotePeeringConnection is used to - peer VCNs residing in different regions(typically). - Remote VCN Peering is explained here - https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/remoteVCNpeering.htm - properties: - managePeerRPC: - description: ManagePeerRPC will define if the - Peer VCN needs to be managed. If set to true - a Remote Peering Connection will be created - in the Peer DRG and the connection will be - created between local and peer RPC. - type: boolean - peerDRGId: - description: PeerDRGId defines the DRG ID of - the peer. - type: string - peerRPCConnectionId: - description: PeerRPCConnectionId defines the - RPC ID of peer. If ManagePeerRPC is set to - true this will be created by Cluster API Provider - for OCI, otherwise this has be defined by - the user. - type: string - peerRegionName: - description: PeerRegionName defined the region - name of Peer VCN. - type: string - rpcConnectionId: - description: RPCConnectionId is the connection - ID of the connection between peer and local - RPC. - type: string - type: object - type: array - type: object - type: object - ociResourceIdentifier: - description: The unique ID which will be used to tag all the - resources created by this Cluster. The tag will be used - to identify resources belonging to this cluster. this will - be auto-generated and should not be set by the user. - type: string - region: - description: Region the cluster operates in. It must be one - of available regions in Region Identifier format. See https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-oci - cluster.x-k8s.io/v1beta1: v1beta1 - name: ocimachinepools.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - kind: OCIMachinePool - listKind: OCIMachinePoolList - plural: ocimachinepools - singular: ocimachinepool - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OCIMachinePoolSpec defines the desired state of OCIMachinePool - properties: - imageId: - description: OCID of the image to be used to launch the instance. - type: string - instanceConfiguration: - properties: - instanceConfigurationId: - type: string - instanceDetails: - properties: - shape: - type: string - type: object - type: object - metadata: - additionalProperties: - type: string - description: Custom metadata key/value pairs that you provide, such - as the SSH public key required to connect to the instance. - type: object - ocid: - description: OCID is the OCID of the associated InstancePool - type: string - placementDetails: - items: - properties: - availabilityDomain: - description: The availability domain to place instances. - type: integer - required: - - availabilityDomain - type: object - type: array - providerID: - description: ProviderID is the OCID of the associated InstancePool - in a provider format - type: string - providerIDList: - description: ProviderIDList are the identification IDs of machine - instances provided by the provider. This field must match the provider - IDs as seen on the node objects corresponding to a machine pool's - machine instances. - items: - type: string - type: array - shapeConfig: - description: The shape configuration of the instance, applicable for - flex instances. - properties: - baselineOcpuUtilization: - description: 'The baseline OCPU utilization for a subcore burstable - VM instance. Leave this attribute blank for a non-burstable - instance, or explicitly specify non-burstable with `BASELINE_1_1`. - The following values are supported: - `BASELINE_1_8` - baseline - usage is 1/8 of an OCPU. - `BASELINE_1_2` - baseline usage is - 1/2 of an OCPU. - `BASELINE_1_1` - baseline usage is an entire - OCPU. This represents a non-burstable instance.' - type: string - memoryInGBs: - description: The total amount of memory available to the instance, - in gigabytes. - type: string - ocpus: - description: The total number of OCPUs available to the instance. - type: string - type: object - vnicAssignPublicIp: - default: false - description: Whether the VNIC should be assigned a public IP address. - type: boolean - type: object - status: - description: OCIMachinePoolStatus defines the observed state of OCIMachinePool - properties: - conditions: - description: Conditions defines current service state of the OCIMachinePool. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - type: string - failureReason: - description: MachineStatusError defines errors states for Machine - objects. - type: string - ready: - description: Ready is true when the provider resource is ready. - type: boolean - replicas: - description: Replicas is the most recently observed number of replicas - format: int32 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: cluster-api-provider-oci-system/capoci-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-oci - cluster.x-k8s.io/v1beta1: v1beta1 - name: ocimachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - service: - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - kind: OCIMachine - listKind: OCIMachineList - plural: ocimachines - singular: ocimachine - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: OCIMachine is the Schema for the ocimachines API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OCIMachineSpec defines the desired state of OCIMachine Please - read the API https://docs.oracle.com/en-us/iaas/api/#/en/iaas/20160918/Instance/LaunchInstance - for more information about the parameters below - properties: - bootVolumeSizeInGBs: - description: The size of boot volume. Please see https://docs.oracle.com/en-us/iaas/Content/Block/Tasks/extendingbootpartition.htm - to extend the boot volume size. - type: string - compartmentId: - description: Compartment to launch the instance in. - type: string - definedTags: - additionalProperties: - additionalProperties: - type: string - type: object - description: 'Defined tags for this resource. Each key is predefined - and scoped to a namespace. For more information, see Resource Tags - (https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm). - Example: `{"Operations": {"CostCenter": "42"}}`' - type: object - freeformTags: - additionalProperties: - type: string - description: Free-form tags for this resource. - type: object - imageId: - description: OCID of the image to be used to launch the instance. - type: string - instanceId: - description: OCID of launched compute instance. - type: string - isPvEncryptionInTransitEnabled: - default: true - description: Is in transit encryption of volumes required. - type: boolean - metadata: - additionalProperties: - type: string - description: Custom metadata key/value pairs that you provide, such - as the SSH public key required to connect to the instance. - type: object - networkDetails: - description: PrimaryNetworkInterface is required to specify subnet. - properties: - assignPublicIp: - type: boolean - nsgId: - type: string - subnetId: - type: string - subnetName: - type: string - type: object - nsgName: - description: The name of NSG to use. The name here refers to the NSGs - defined in the OCICluster Spec. Optional, only if multiple NSGs - of a type is defined, else the first element is used. - type: string - providerID: - description: Provider ID of the instance, this will be set by Cluster - API provider itself, users should not set this parameter. - type: string - shape: - description: Shape of the instance. - type: string - shapeConfig: - description: The shape configuration of rhe instance, applicable for - flex instances. - properties: - baselineOcpuUtilization: - description: 'The baseline OCPU utilization for a subcore burstable - VM instance. Leave this attribute blank for a non-burstable - instance, or explicitly specify non-burstable with `BASELINE_1_1`. - The following values are supported: - `BASELINE_1_8` - baseline - usage is 1/8 of an OCPU. - `BASELINE_1_2` - baseline usage is - 1/2 of an OCPU. - `BASELINE_1_1` - baseline usage is an entire - OCPU. This represents a non-burstable instance.' - type: string - memoryInGBs: - description: The total amount of memory available to the instance, - in gigabytes. - type: string - ocpus: - description: The total number of OCPUs available to the instance. - type: string - type: object - subnetName: - description: The name of the subnet to use. The name here refers to - the subnets defined in the OCICluster Spec. Optional, only if multiple - subnets of a type is defined, else the first element is used. - type: string - type: object - status: - description: OCIMachineStatus defines the observed state of OCIMachine. - properties: - addresses: - description: Addresses contains the addresses of the associated OCI - instance. - items: - description: MachineAddress contains information for the node's - address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP - or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the OCIMachine. - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - createBackendWorkRequestId: - description: Create Backend OPC work request ID for the machine backend. - type: string - deleteBackendWorkRequestId: - description: Delete Backend OPC work request ID for the machine backend. - type: string - failureMessage: - description: The error message corresponding to the error on the machine. - type: string - failureReason: - description: Error status on the machine. - type: string - launchInstanceWorkRequestId: - description: Launch instance work request ID. - type: string - ready: - description: Flag set to true when machine is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-oci - cluster.x-k8s.io/v1beta1: v1beta1 - name: ocimachinetemplates.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: OCIMachineTemplate - listKind: OCIMachineTemplateList - plural: ocimachinetemplates - singular: ocimachinetemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: OCIMachineTemplate is the schema for the OCI compute instance - machine template. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: OCIMachineTemplateSpec defines the desired state of OCIMachineTemplate. - properties: - template: - description: OCIMachineTemplateResource describes the data needed - to create an OCIMachine from a template. - properties: - spec: - description: Spec is the specification of the desired behavior - of the machine. - properties: - bootVolumeSizeInGBs: - description: The size of boot volume. Please see https://docs.oracle.com/en-us/iaas/Content/Block/Tasks/extendingbootpartition.htm - to extend the boot volume size. - type: string - compartmentId: - description: Compartment to launch the instance in. - type: string - definedTags: - additionalProperties: - additionalProperties: - type: string - type: object - description: 'Defined tags for this resource. Each key is - predefined and scoped to a namespace. For more information, - see Resource Tags (https://docs.cloud.oracle.com/iaas/Content/General/Concepts/resourcetags.htm). - Example: `{"Operations": {"CostCenter": "42"}}`' - type: object - freeformTags: - additionalProperties: - type: string - description: Free-form tags for this resource. - type: object - imageId: - description: OCID of the image to be used to launch the instance. - type: string - instanceId: - description: OCID of launched compute instance. - type: string - isPvEncryptionInTransitEnabled: - default: true - description: Is in transit encryption of volumes required. - type: boolean - metadata: - additionalProperties: - type: string - description: Custom metadata key/value pairs that you provide, - such as the SSH public key required to connect to the instance. - type: object - networkDetails: - description: PrimaryNetworkInterface is required to specify - subnet. - properties: - assignPublicIp: - type: boolean - nsgId: - type: string - subnetId: - type: string - subnetName: - type: string - type: object - nsgName: - description: The name of NSG to use. The name here refers - to the NSGs defined in the OCICluster Spec. Optional, only - if multiple NSGs of a type is defined, else the first element - is used. - type: string - providerID: - description: Provider ID of the instance, this will be set - by Cluster API provider itself, users should not set this - parameter. - type: string - shape: - description: Shape of the instance. - type: string - shapeConfig: - description: The shape configuration of rhe instance, applicable - for flex instances. - properties: - baselineOcpuUtilization: - description: 'The baseline OCPU utilization for a subcore - burstable VM instance. Leave this attribute blank for - a non-burstable instance, or explicitly specify non-burstable - with `BASELINE_1_1`. The following values are supported: - - `BASELINE_1_8` - baseline usage is 1/8 of an OCPU. - - `BASELINE_1_2` - baseline usage is 1/2 of an OCPU. - - `BASELINE_1_1` - baseline usage is an entire OCPU. - This represents a non-burstable instance.' - type: string - memoryInGBs: - description: The total amount of memory available to the - instance, in gigabytes. - type: string - ocpus: - description: The total number of OCPUs available to the - instance. - type: string - type: object - subnetName: - description: The name of the subnet to use. The name here - refers to the subnets defined in the OCICluster Spec. Optional, - only if multiple subnets of a type is defined, else the - first element is used. - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-controller-manager - namespace: cluster-api-provider-oci-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-leader-election-role - namespace: cluster-api-provider-oci-system -rules: - - apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete - - apiGroups: - - "" - resources: - - events - verbs: - - create - - patch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-manager-role -rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ociclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - update - - watch - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ociclusters/finalizers - verbs: - - update - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ociclusters/status - verbs: - - get - - patch - - update - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachines/finalizers - verbs: - - update - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachines/status - verbs: - - get - - patch - - update - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachinepools - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachinepools - - ocimachinepools/status - verbs: - - get - - list - - watch - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachinepools/status - verbs: - - get - - patch - - update - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - ocimachinepools/status - verbs: - - get - - patch - - update - - apiGroups: - - cluster.x-k8s.io - resources: - - machines - - machines/status - verbs: - - get - - list - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinepools - - machinepools/status - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-metrics-reader -rules: - - nonResourceURLs: - - /metrics - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-proxy-role -rules: - - apiGroups: - - authentication.k8s.io - resources: - - tokenreviews - verbs: - - create - - apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-leader-election-rolebinding - namespace: cluster-api-provider-oci-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capoci-leader-election-role -subjects: - - kind: ServiceAccount - name: capoci-controller-manager - namespace: cluster-api-provider-oci-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capoci-manager-role -subjects: - - kind: ServiceAccount - name: capoci-controller-manager - namespace: cluster-api-provider-oci-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-proxy-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capoci-proxy-role -subjects: - - kind: ServiceAccount - name: capoci-controller-manager - namespace: cluster-api-provider-oci-system ---- -apiVersion: v1 -data: - controller_manager_config.yaml: | - apiVersion: controller-runtime.sigs.k8s.io/v1alpha1 - kind: ControllerManagerConfig - health: - healthProbeBindAddress: :8081 - metrics: - bindAddress: 127.0.0.1:8080 - webhook: - port: 9443 - leaderElection: - leaderElect: true - resourceName: 237d8a8a.cluster.x-k8s.io -kind: ConfigMap -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-manager-config - namespace: cluster-api-provider-oci-system ---- -apiVersion: v1 -data: - fingerprint: ${OCI_CREDENTIALS_FINGERPRINT_B64:=""} - key: ${OCI_CREDENTIALS_KEY_B64:=""} - passphrase: ${OCI_CREDENTIALS_PASSPHRASE_B64:=""} - region: ${OCI_REGION_B64:=""} - tenancy: ${OCI_TENANCY_ID_B64:=""} - useInstancePrincipal: ${USE_INSTANCE_PRINCIPAL_B64:="ZmFsc2U="} - user: ${OCI_USER_ID_B64:=""} -kind: Secret -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-auth-config - namespace: cluster-api-provider-oci-system -type: Opaque ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager - name: capoci-controller-manager-metrics-service - namespace: cluster-api-provider-oci-system -spec: - ports: - - name: https - port: 8443 - targetPort: https - selector: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-oci ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager - name: capoci-controller-manager - namespace: cluster-api-provider-oci-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - control-plane: controller-manager - spec: - affinity: - nodeAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - preference: - matchExpressions: - - key: ${K8S_CP_LABEL:=node-role.kubernetes.io/control-plane} - operator: Exists - weight: 10 - - preference: - matchExpressions: - - key: node-role.kubernetes.io/master - operator: Exists - weight: 10 - containers: - - args: - - --leader-elect - - --feature-gates=MachinePool=${EXP_MACHINE_POOL:=false} - - --metrics-bind-address=127.0.0.1:8080 - - --logging-format=${LOG_FORMAT:=text} - command: - - /manager - env: - - name: AUTH_CONFIG_DIR - value: /etc/oci - - name: HTTP_PROXY - value: ${TKG_HTTP_PROXY} - - name: HTTPS_PROXY - value: ${TKG_HTTPS_PROXY} - - name: NO_PROXY - value: ${TKG_NO_PROXY} - image: ghcr.io/oracle/cluster-api-oci-controller:${CAPOCI_CONTROLLER_IMAGE_TAG} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: 8081 - initialDelaySeconds: 15 - periodSeconds: 20 - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 10 - securityContext: - allowPrivilegeEscalation: false - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - - mountPath: /etc/oci - name: auth-config-dir - readOnly: true - serviceAccountName: capoci-controller-manager - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: capoci-webhook-service-cert - - name: auth-config-dir - secret: - secretName: capoci-auth-config ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-serving-cert - namespace: cluster-api-provider-oci-system -spec: - dnsNames: - - capoci-webhook-service.cluster-api-provider-oci-system.svc - - capoci-webhook-service.cluster-api-provider-oci-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capoci-selfsigned-issuer - secretName: capoci-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-selfsigned-issuer - namespace: cluster-api-provider-oci-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: cluster-api-provider-oci-system/capoci-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-mutating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-ocicluster - failurePolicy: Fail - matchPolicy: Equivalent - name: default.ocicluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - ociclusters - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: cluster-api-provider-oci-system/capoci-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-oci - name: capoci-validating-webhook-configuration -webhooks: - - admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-ocicluster - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.ocicluster.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - ociclusters - sideEffects: None - - admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capoci-webhook-service - namespace: cluster-api-provider-oci-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-ocimachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.ocimachinetemplate.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - ocimachinetemplates - sideEffects: None diff --git a/providers/infrastructure-oci/v0.4.0/metadata.yaml b/providers/infrastructure-oci/v0.4.0/metadata.yaml deleted file mode 100644 index 5a9463aa5b..0000000000 --- a/providers/infrastructure-oci/v0.4.0/metadata.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# maps release series of major.minor to cluster-api contract version -# the contract version may change between minor or major versions, but *not* -# between patch versions. -# -# update this file only when a new major or minor version is released -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -releaseSeries: - - major: 0 - minor: 4 - contract: v1beta1 diff --git a/providers/infrastructure-oci/v0.4.0/yttcc/base-template.yaml b/providers/infrastructure-oci/v0.4.0/yttcc/base-template.yaml deleted file mode 100644 index 77f5d4a77b..0000000000 --- a/providers/infrastructure-oci/v0.4.0/yttcc/base-template.yaml +++ /dev/null @@ -1,29 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: ${CLUSTER_NAME} - labels: - tkg.tanzu.vmware.com/cluster-name: '${ CLUSTER_NAME }' - annotations: - run.tanzu.vmware.com/resolve-tkr: "" -spec: - clusterNetwork: - pods: - cidrBlocks: ["${CLUSTER_CIDR}"] - services: - cidrBlocks: ["${SERVICE_CIDR}"] - topology: - class: tkg-cluster-class-dev - version: v1.21.2 - controlPlane: - replicas: ${CONTROL_PLANE_MACHINE_COUNT} - metadata: - annotations: - workers: - machineDeployments: - - class: tkg-worker - name: tkg-worker-pool - replicas: ${WORKER_MACHINE_COUNT} - metadata: - annotations: - variables: diff --git a/providers/infrastructure-oci/v0.4.0/yttcc/overlay.yaml b/providers/infrastructure-oci/v0.4.0/yttcc/overlay.yaml deleted file mode 100644 index 98614a693f..0000000000 --- a/providers/infrastructure-oci/v0.4.0/yttcc/overlay.yaml +++ /dev/null @@ -1,97 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:json", "json") -#@ load("@ytt:base64", "base64") - -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:struct", "struct") -#@ load("/lib/config_variable_association.star", "config_variable_association", "get_oci_vars", "oci_var_keys") - -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "kubeadm_image_repo", "get_default_tkg_bom_data","get_tkr_version_from_tkr_name") -#@ load("lib/validate.star", "validate_configuration") - -#@ validate_configuration("oci") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - -#@ bomData = get_default_tkg_bom_data() - -#@ tkrVersion = get_tkr_version_from_tkr_name(data.values.KUBERNETES_RELEASE) - -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: #@ data.values.CLUSTER_NAME - labels: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - cluster-role.tkg.tanzu.vmware.com/(@= data.values.TKG_CLUSTER_ROLE @): "" - #@ end - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME -spec: - clusterNetwork: - #@ if data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - apiServerPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - pods: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.CLUSTER_CIDR - services: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.SERVICE_CIDR - topology: - class: #@ data.values.CLUSTER_CLASS - version: #@ tkrVersion - controlPlane: - replicas: #@ data.values.CONTROL_PLANE_MACHINE_COUNT - metadata: - annotations: - #! VVV TODO(vui) os-name handling - run.tanzu.vmware.com/resolve-os-image: #@ "oci-region={},os-name=ubuntu".format(data.values.OCI_REGION) - workers: - machineDeployments: - #@overlay/match by=overlay.index(0) - - class: tkg-worker - name: md-0 - replicas: #@ data.values.WORKER_MACHINE_COUNT_0 - #@overlay/match missing_ok=True - failureDomain: "1" - metadata: - annotations: - #! VVV TODO(vui) os-name handling - run.tanzu.vmware.com/resolve-os-image: #@ "oci-region={},os-name=ubuntu".format(data.values.OCI_REGION) - #@ if data.values.CLUSTER_PLAN == "prodcc": - #@overlay/append - - class: tkg-worker - name: md-1 - replicas: #@ data.values.WORKER_MACHINE_COUNT_1 - failureDomain: #@ "2" - metadata: - annotations: - #! VVV TODO(vui) os-name handling - run.tanzu.vmware.com/resolve-os-image: #@ "oci-region={},os-name=ubuntu".format(data.values.OCI_REGION) - #@overlay/append - - class: tkg-worker - name: md-2 - replicas: #@ data.values.WORKER_MACHINE_COUNT_2 - failureDomain: #@ "3" - metadata: - annotations: - #! VVV TODO(vui) os-name handling - run.tanzu.vmware.com/resolve-os-image: #@ "oci-region={},os-name=ubuntu".format(data.values.OCI_REGION) - #@ end - #@overlay/match missing_ok=True - variables: - #@ vars = get_oci_vars() - #@ for configVariable in vars: - #@ if vars[configVariable] != None and configVariable in oci_var_keys: - - name: #@ configVariable - value: #@ vars[configVariable] - #@ end - #@ end diff --git a/providers/infrastructure-oci/ytt/oci-overlay.yaml b/providers/infrastructure-oci/ytt/oci-overlay.yaml deleted file mode 100644 index ab5973e474..0000000000 --- a/providers/infrastructure-oci/ytt/oci-overlay.yaml +++ /dev/null @@ -1 +0,0 @@ -#! Please add any overlays specific to Oracle provider under this file. diff --git a/providers/infrastructure-oci/yttcc/oci-overlay.yaml b/providers/infrastructure-oci/yttcc/oci-overlay.yaml deleted file mode 100644 index c4324027d3..0000000000 --- a/providers/infrastructure-oci/yttcc/oci-overlay.yaml +++ /dev/null @@ -1 +0,0 @@ -#! Please add any overlays specific to OCI provider under this file. diff --git a/providers/infrastructure-tkg-service-vsphere/v1.1.0/cluster-template-definition-dev.yaml b/providers/infrastructure-tkg-service-vsphere/v1.1.0/cluster-template-definition-dev.yaml deleted file mode 100644 index 8fe57aaef7..0000000000 --- a/providers/infrastructure-tkg-service-vsphere/v1.1.0/cluster-template-definition-dev.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-tkg-service-vsphere/v1.1.0/ytt - - path: providers/ytt - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-tkg-service-vsphere/v1.1.0/cluster-template-definition-prod.yaml b/providers/infrastructure-tkg-service-vsphere/v1.1.0/cluster-template-definition-prod.yaml deleted file mode 100644 index 8fe57aaef7..0000000000 --- a/providers/infrastructure-tkg-service-vsphere/v1.1.0/cluster-template-definition-prod.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-tkg-service-vsphere/v1.1.0/ytt - - path: providers/ytt - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-tkg-service-vsphere/v1.1.0/ytt/base-template.yaml b/providers/infrastructure-tkg-service-vsphere/v1.1.0/ytt/base-template.yaml deleted file mode 100644 index 722b4b0b80..0000000000 --- a/providers/infrastructure-tkg-service-vsphere/v1.1.0/ytt/base-template.yaml +++ /dev/null @@ -1,41 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha2 -kind: TanzuKubernetesCluster -metadata: - name: ${CLUSTER_NAME} - namespace: ${NAMESPACE} - labels: - tkg.tanzu.vmware.com/cluster-name: '${ CLUSTER_NAME }' -spec: - settings: - network: - cni: - name: calico - pods: - cidrBlocks: - - ${CLUSTER_CIDR} #! CIDR block used by Calico - serviceDomain: ${SERVICE_DOMAIN} - services: - cidrBlocks: - - ${SERVICE_CIDR} #! CIDR block used by Calico - storage: - classes: [] - defaultClass: "${DEFAULT_STORAGE_CLASS}" - - topology: - controlPlane: - vmClass: ${CONTROL_PLANE_VM_CLASS} - replicas: ${CONTROL_PLANE_MACHINE_COUNT} - storageClass: ${CONTROL_PLANE_STORAGE_CLASS} - tkr: - reference: - name: ${KUBERNETES_RELEASE} - nodePools: - - name: ${NODE_POOL_0_NAME} - labels: {} - taints: [] - vmClass: ${WORKER_VM_CLASS} - replicas: ${WORKER_MACHINE_COUNT} - storageClass: ${WORKER_STORAGE_CLASS} - tkr: - reference: - name: ${KUBERNETES_RELEASE} diff --git a/providers/infrastructure-tkg-service-vsphere/v1.1.0/ytt/overlay.yaml b/providers/infrastructure-tkg-service-vsphere/v1.1.0/ytt/overlay.yaml deleted file mode 100644 index 70f2991a82..0000000000 --- a/providers/infrastructure-tkg-service-vsphere/v1.1.0/ytt/overlay.yaml +++ /dev/null @@ -1,87 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:assert", "assert") -#@ load("lib/validate.star", "validate_configuration") -#@ load("lib/helpers.star","get_labels_map_from_string") - -#@ validate_configuration("tkgs") - -#@ def get_taints_list_from_string(taintsString): -#@ for val in taintsString.split(','): -#@ kv = val.split('=') -#@ if len(kv) != 2: -#@ assert.fail("given labels string \""+taintsString+"\" must be in the \"key1=value1:effect1,key2=value2:effect2\" format ") -#@ end -#@ ve = kv[1].split(":") -#@ if len(ve) != 2: -#@ assert.fail("given labels string \""+taintsString+"\" must be in the \"key1=value1:effect1,key2=value2:effect2\" format ") -#@ end -- key: #@ kv[0] - value: #@ ve[0] - effect: #@ ve[1] -#@ end -#@ end - -#@overlay/match by=overlay.subset({"kind":"TanzuKubernetesCluster"}) ---- -apiVersion: run.tanzu.vmware.com/v1alpha2 -kind: TanzuKubernetesCluster -metadata: - name: #@ data.values.CLUSTER_NAME - namespace: #@ data.values.NAMESPACE - labels: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - cluster-role.tkg.tanzu.vmware.com/(@= data.values.TKG_CLUSTER_ROLE @): "" - #@ end - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME -spec: - settings: - network: - cni: - name: #@ data.values.CNI - pods: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.CLUSTER_CIDR - serviceDomain: #@ data.values.SERVICE_DOMAIN - services: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.SERVICE_CIDR - storage: -#@ if data.values.STORAGE_CLASSES != "" and data.values.STORAGE_CLASSES != None: - #@overlay/replace - classes: -#@ storage_classes = data.values.STORAGE_CLASSES.split(',') -#@ for sc in storage_classes: - - #@ sc -#@ end -#@ end - defaultClass: #@ data.values.DEFAULT_STORAGE_CLASS - topology: - controlPlane: - vmClass: #@ data.values.CONTROL_PLANE_VM_CLASS - replicas: #@ data.values.CONTROL_PLANE_MACHINE_COUNT - storageClass: #@ data.values.CONTROL_PLANE_STORAGE_CLASS - tkr: - reference: - name: #@ data.values.KUBERNETES_RELEASE - nodePools: - #@overlay/match by=overlay.index(0) - - name: #@ data.values.NODE_POOL_0_NAME -#@ if data.values.NODE_POOL_0_LABELS != "" and data.values.NODE_POOL_0_LABELS != None: - #@overlay/replace - labels: #@ get_labels_map_from_string(data.values.NODE_POOL_0_LABELS) -#@ end -#@ if data.values.NODE_POOL_0_TAINTS != "" and data.values.NODE_POOL_0_TAINTS != None: - #@overlay/replace - taints: #@ get_taints_list_from_string(data.values.NODE_POOL_0_TAINTS) -#@ end - vmClass: #@ data.values.WORKER_VM_CLASS - replicas: #@ data.values.WORKER_MACHINE_COUNT - storageClass: #@ data.values.WORKER_STORAGE_CLASS - tkr: - reference: - name: #@ data.values.KUBERNETES_RELEASE diff --git a/providers/infrastructure-tkg-service-vsphere/ytt/tkg-service-vsphere-overlay.yaml b/providers/infrastructure-tkg-service-vsphere/ytt/tkg-service-vsphere-overlay.yaml deleted file mode 100644 index a5ab30addb..0000000000 --- a/providers/infrastructure-tkg-service-vsphere/ytt/tkg-service-vsphere-overlay.yaml +++ /dev/null @@ -1 +0,0 @@ -#! Please add any overlays specific to 'TKG Service for vSphere' provider under this file. diff --git a/providers/infrastructure-vsphere/v1.5.3/cconly/base.yaml b/providers/infrastructure-vsphere/v1.5.3/cconly/base.yaml deleted file mode 100644 index 190da804f8..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/cconly/base.yaml +++ /dev/null @@ -1,2413 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:regexp", "regexp") - -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereClusterTemplate -metadata: - name: #@ "tkg-vsphere-default-{}-cluster".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - server: #@ data.values.VSPHERE_SERVER - thumbprint: #@ data.values.VSPHERE_TLS_THUMBPRINT ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: #@ "tkg-vsphere-default-{}-control-plane".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - cloneMode: #@ data.values.VSPHERE_CLONE_MODE - datacenter: #@ data.values.VSPHERE_DATACENTER - datastore: #@ data.values.VSPHERE_DATASTORE - storagePolicyName: #@ data.values.VSPHERE_STORAGE_POLICY_ID - diskGiB: #@ data.values.VSPHERE_CONTROL_PLANE_DISK_GIB - folder: #@ data.values.VSPHERE_FOLDER - memoryMiB: #@ data.values.VSPHERE_CONTROL_PLANE_MEM_MIB - network: - devices: - - dhcp4: true - networkName: #@ data.values.VSPHERE_NETWORK - numCPUs: #@ data.values.VSPHERE_CONTROL_PLANE_NUM_CPUS - resourcePool: #@ data.values.VSPHERE_RESOURCE_POOL - server: #@ data.values.VSPHERE_SERVER - template: #@ data.values.VSPHERE_TEMPLATE ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: #@ "tkg-vsphere-default-{}-worker".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - cloneMode: #@ data.values.VSPHERE_CLONE_MODE - datacenter: #@ data.values.VSPHERE_DATACENTER - datastore: #@ data.values.VSPHERE_DATASTORE - storagePolicyName: #@ data.values.VSPHERE_STORAGE_POLICY_ID - diskGiB: #@ data.values.VSPHERE_WORKER_DISK_GIB - folder: #@ data.values.VSPHERE_FOLDER - memoryMiB: #@ data.values.VSPHERE_WORKER_MEM_MIB - network: - devices: - - dhcp4: true - networkName: #@ data.values.VSPHERE_NETWORK - numCPUs: #@ data.values.VSPHERE_WORKER_NUM_CPUS - resourcePool: #@ data.values.VSPHERE_RESOURCE_POOL - server: #@ data.values.VSPHERE_SERVER - template: #@ data.values.VSPHERE_TEMPLATE ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlaneTemplate -metadata: - name: #@ "tkg-vsphere-default-{}-kcp".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - kubeadmConfigSpec: - useExperimentalRetryJoin: true - clusterConfiguration: - imageRepository: dummy.registry.vmware.com - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - extraArgs: {} - dns: - imageRepository: dummy.registry.vmware.com - imageTag: 1.8.4_dummy.5 - apiServer: - timeoutForControlPlane: "8m0s" - extraVolumes: [] - extraArgs: {} - controllerManager: - extraArgs: {} - scheduler: - extraArgs: {} - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data.hostname }}' - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data.hostname }}' - preKubeadmCommands: - - hostname "{{ ds.meta_data.hostname }}" - - echo "::1 ipv6-localhost ipv6-loopback" >/etc/hosts - - echo "127.0.0.1 localhost" >>/etc/hosts - - echo "127.0.0.1 {{ ds.meta_data.hostname }}" >>/etc/hosts - - echo "{{ ds.meta_data.hostname }}" >/etc/hostname - users: - - name: capv - sshAuthorizedKeys: - - #@ data.values.VSPHERE_SSH_AUTHORIZED_KEY - sudo: ALL=(ALL) NOPASSWD:ALL ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "tkg-vsphere-default-{}-md-config".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE -spec: - template: - spec: - useExperimentalRetryJoin: true - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: {} - name: '{{ ds.meta_data.hostname }}' - preKubeadmCommands: - - hostname "{{ ds.meta_data.hostname }}" - - echo "::1 ipv6-localhost ipv6-loopback" >/etc/hosts - - echo "127.0.0.1 localhost" >>/etc/hosts - - echo "127.0.0.1 {{ ds.meta_data.hostname }}" >>/etc/hosts - - echo "{{ ds.meta_data.hostname }}" >/etc/hostname - postKubeadmCommands: - - echo "running postKubeadmCommands..." - files: - - path: /tmp/empty.txt - owner: "root:root" - permissions: "0600" - content: | - default file - users: - - name: capv - sshAuthorizedKeys: - - #@ data.values.VSPHERE_SSH_AUTHORIZED_KEY - sudo: ALL=(ALL) NOPASSWD:ALL ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - name: #@ "tkg-vsphere-default-{}".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - annotations: - run.tanzu.vmware.com/resolve-tkr: "" -spec: - controlPlane: - ref: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - name: #@ "tkg-vsphere-default-{}-kcp".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - machineInfrastructure: - ref: - kind: VSphereMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-vsphere-default-{}-control-plane".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereClusterTemplate - name: #@ "tkg-vsphere-default-{}-cluster".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - workers: - machineDeployments: - - class: tkg-worker - template: - bootstrap: - ref: - kind: KubeadmConfigTemplate - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-vsphere-default-{}-md-config".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - kind: VSphereMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-vsphere-default-{}-worker".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - - class: tkg-worker-windows - template: - bootstrap: - ref: - kind: KubeadmConfigTemplate - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-vsphere-default-{}-md-config".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - infrastructure: - ref: - kind: VSphereMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: #@ "tkg-vsphere-default-{}-worker".format(data.values.VSPHERE_CLUSTER_CLASS_VERSION) - namespace: #@ data.values.NAMESPACE - variables: - - name: vcenter - required: true - schema: - openAPIV3Schema: - type: object - properties: - cloneMode: - type: string - default: fullClone - network: - type: string - default: VMNetwork - datacenter: - type: string - default: "" - datastore: - type: string - default: "" - folder: - type: string - default: "" - resourcePool: - type: string - default: "" - storagePolicyID: - type: string - default: "" - server: - type: string - default: "" - tlsThumbprint: - type: string - default: "" - template: - type: string - default: "" - required: - - datacenter - - datastore - - folder - - resourcePool - - server - - name: VSPHERE_WINDOWS_TEMPLATE - required: false - schema: - openAPIV3Schema: - type: string - default: "" - - name: vipNetworkInterface - required: true - schema: - openAPIV3Schema: - type: string - default: eth0 - - name: cni - required: true - schema: - openAPIV3Schema: - type: string - #@ if data.values.CNI: - default: #@ data.values.CNI - #@ else: - default: "none" - #@ end - - name: network - required: false - schema: - openAPIV3Schema: - type: object - properties: - ipv6Primary: - type: boolean - default: false - addressesFromPools: - type: array - items: - type: object - properties: - apiGroup: - type: string - kind: - type: string - name: - type: string - required: - - apiGroup - - kind - - name - default: [] - default: - ipv6Primary: false - - name: proxy - required: false - schema: - openAPIV3Schema: - type: object - properties: - httpProxy: - type: string - httpsProxy: - type: string - noProxy: - type: array - items: - type: string - default: [] - systemWide: - type: boolean - default: false - required: - - httpProxy - - httpsProxy - - name: imageRepository - required: false - schema: - openAPIV3Schema: - type: object - properties: - host: - type: string - tlsCertificateValidation: - type: boolean - default: true - - name: aviAPIServerHAProvider - required: false - schema: - openAPIV3Schema: - type: boolean - default: false - - name: apiServerEndpoint - required: false - schema: - openAPIV3Schema: - type: string - default: "" - - name: apiServerPort - required: false - schema: - openAPIV3Schema: - type: integer - - name: kubeVipLoadBalancerProvider - required: false - schema: - openAPIV3Schema: - type: boolean - default: false - - name: trust - required: false - schema: - openAPIV3Schema: - type: object - properties: - additionalTrustedCAs: - type: array - items: - type: object - properties: - name: - type: string - data: - type: string - required: - - name - - data - - name: additionalImageRegistries - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - required: - - host - properties: - host: - type: string - skipTlsVerify: - type: boolean - default: false - caCert: - type: string - - name: auditLogging - required: false - schema: - openAPIV3Schema: - type: object - properties: - enabled: - type: boolean - default: false - default: - enabled: false - - name: user - required: false - schema: - openAPIV3Schema: - type: object - properties: - sshAuthorizedKeys: - type: array - items: - type: string - default: [] - - name: controlPlane - required: true - schema: - openAPIV3Schema: - type: object - properties: - machine: - type: object - properties: - numCPUs: - type: integer - default: 2 - diskGiB: - type: integer - default: 40 - memoryMiB: - type: integer - default: 8192 - customVMXKeys: - type: object - additionalProperties: - type: string - default: {} - network: - type: object - properties: - nameservers: - type: array - items: - type: string - default: [] - searchDomains: - type: array - items: - type: string - default: [] - nodeLabels: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: worker - required: false - schema: - openAPIV3Schema: - type: object - properties: - machine: - type: object - properties: - numCPUs: - type: integer - default: 2 - diskGiB: - type: integer - default: 40 - memoryMiB: - type: integer - default: 4096 - customVMXKeys: - type: object - additionalProperties: - type: string - default: {} - network: - type: object - properties: - nameservers: - type: array - items: - type: string - default: [] - searchDomains: - type: array - items: - type: string - default: [] - - name: nodePoolLabels - required: false - schema: - openAPIV3Schema: - type: array - items: - type: object - properties: - key: - type: string - value: - type: string - default: [] - - name: ntpServers - required: false - schema: - openAPIV3Schema: - type: array - items: - type: string - default: [] - - name: additionalFQDN - required: false - schema: - openAPIV3Schema: - type: array - items: - type: string - default: [] - - name: TKR_DATA - required: false - schema: - openAPIV3Schema: - type: object - properties: {} - - name: controlPlaneTaint - required: false - schema: - openAPIV3Schema: - type: boolean - default: true - - name: etcdExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: apiServerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeSchedulerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: kubeControllerManagerExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: controlPlaneKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: workerKubeletExtraArgs - required: false - schema: - openAPIV3Schema: - type: object - additionalProperties: - type: string - default: {} - - name: tlsCipherSuites - required: false - schema: - openAPIV3Schema: - type: string - default: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - - name: identityRef - required: false - schema: - openAPIV3Schema: - type: object - properties: - name: - type: string - kind: - type: string - required: - - name - - kind - - name: controlPlaneCertificateRotation - required: false - schema: - openAPIV3Schema: - type: object - properties: - activate: - type: boolean - default: true - daysBefore: - type: integer - format: int32 - minimum: 7 - default: 90 - default: - activate: true - daysBefore: 90 - - name: customTDNFRepository - required: false - schema: - openAPIV3Schema: - type: object - properties: - certificate: - type: string - - name: pci - required: false - schema: - openAPIV3Schema: - type: object - properties: - worker: - type: object - properties: - devices: - type: array - items: - type: object - properties: - vendorId: - type: number - deviceId: - type: number - required: - - deviceId - - vendorId - default: [] - hardwareVersion: - type: string - default: vmx-15 - controlPlane: - type: object - properties: - devices: - type: array - items: - type: object - properties: - vendorId: - type: number - deviceId: - type: number - required: - - deviceId - - vendorId - default: [] - hardwareVersion: - type: string - default: vmx-15 - patches: - - name: etcdExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .etcdExtraArgs }} - {{- if eq $key "cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: apiServerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - - name: kubeSchedulerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/scheduler/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{- range $key, $val := .kubeSchedulerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - - name: kubeControllerManagerExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .kubeControllerManagerExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - - name: controlPlaneKubeletExtraArgs - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .controlPlaneKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - - name: workerKubeletExtraArgs - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - - tkg-worker-windows - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs - valueFrom: - template: | - {{ $containCipherSuites := false }} - {{ $containCloudProvider := false }} - {{- range $key, $val := .workerKubeletExtraArgs }} - {{- if eq $key "tls-cipher-suites" }} - {{- $containCipherSuites = true }} - {{- end }} - {{- if eq $key "cloud-provider" }} - {{- $containCloudProvider = true }} - {{- end }} - {{ $key -}} : "{{ $val }}" - {{- end }} - {{- if not $containCipherSuites }} - tls-cipher-suites: "{{ .tlsCipherSuites }}" - {{- end }} - {{- if not $containCloudProvider }} - cloud-provider: external - {{- end }} - - name: vsphereClusterTemplate - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/controlPlaneEndpoint - valueFrom: - template: | - host: '{{ .apiServerEndpoint }}' - port: 6443 - - op: replace - path: /spec/template/spec/thumbprint - valueFrom: - variable: vcenter.tlsThumbprint - - op: replace - path: /spec/template/spec/server - valueFrom: - variable: vcenter.server - - name: vSphereClusterIdentityRef - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: add - path: /spec/template/spec/identityRef - valueFrom: - template: | - {{ if .identityRef -}} - kind: {{ .identityRef.kind }} - name: {{ .identityRef.name }} - {{- else -}} - kind: Secret - name: '{{ .builtin.cluster.name }}' - {{- end }} - - name: controlPlaneMachineTemplate - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/numCPUs - valueFrom: - variable: controlPlane.machine.numCPUs - - op: replace - path: /spec/template/spec/diskGiB - valueFrom: - variable: controlPlane.machine.diskGiB - - op: replace - path: /spec/template/spec/memoryMiB - valueFrom: - variable: controlPlane.machine.memoryMiB - - op: replace - path: /spec/template/spec/cloneMode - valueFrom: - variable: vcenter.cloneMode - - op: replace - path: /spec/template/spec/network - valueFrom: - variable: vcenter.network - - op: replace - path: /spec/template/spec/datacenter - valueFrom: - variable: vcenter.datacenter - - op: replace - path: /spec/template/spec/datastore - valueFrom: - variable: vcenter.datastore - - op: replace - path: /spec/template/spec/folder - valueFrom: - variable: vcenter.folder - - op: replace - path: /spec/template/spec/resourcePool - valueFrom: - variable: vcenter.resourcePool - - op: replace - path: /spec/template/spec/storagePolicyName - valueFrom: - variable: vcenter.storagePolicyID - - op: replace - path: /spec/template/spec/server - valueFrom: - variable: vcenter.server - - op: replace - path: /spec/template/spec/template - valueFrom: - template: '{{ (index .TKR_DATA .builtin.controlPlane.version).osImageRef.template }}' - - name: workerMachineTemplate - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - - tkg-worker-windows - jsonPatches: - - op: replace - path: /spec/template/spec/numCPUs - valueFrom: - variable: worker.machine.numCPUs - - op: replace - path: /spec/template/spec/diskGiB - valueFrom: - variable: worker.machine.diskGiB - - op: replace - path: /spec/template/spec/memoryMiB - valueFrom: - variable: worker.machine.memoryMiB - - op: replace - path: /spec/template/spec/cloneMode - valueFrom: - variable: vcenter.cloneMode - - op: replace - path: /spec/template/spec/network - valueFrom: - variable: vcenter.network - - op: replace - path: /spec/template/spec/datacenter - valueFrom: - variable: vcenter.datacenter - - op: replace - path: /spec/template/spec/datastore - valueFrom: - variable: vcenter.datastore - - op: replace - path: /spec/template/spec/folder - valueFrom: - variable: vcenter.folder - - op: replace - path: /spec/template/spec/resourcePool - valueFrom: - variable: vcenter.resourcePool - - op: replace - path: /spec/template/spec/storagePolicyName - valueFrom: - variable: vcenter.storagePolicyID - - op: replace - path: /spec/template/spec/server - valueFrom: - variable: vcenter.server - - op: replace - path: /spec/template/spec/template - valueFrom: - template: '{{ (index .TKR_DATA .builtin.machineDeployment.version).osImageRef.template }}' - - name: kubeadmControlPlaneTemplate - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/users - valueFrom: - template: | - - name: capv - sshAuthorizedKeys: - {{- range .user.sshAuthorizedKeys }} - - ' {{- . -}} ' - {{- end }} - sudo: ALL=(ALL) NOPASSWD:ALL - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/etcd/local/imageTag - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.etcd.imageTag}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageRepository - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}' - - op: replace - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/dns/imageTag - valueFrom: - template: '{{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.coredns.imageTag}}' - - name: KubeadmConfigTemplate - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: replace - path: /spec/template/spec/users - valueFrom: - template: | - - name: capv - sshAuthorizedKeys: - {{- range .user.sshAuthorizedKeys }} - - ' {{- . -}} ' - {{- end }} - sudo: ALL=(ALL) NOPASSWD:ALL - - name: kubeVIPPod - enabledIf: '{{ not .aviAPIServerHAProvider }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - owner: root:root - path: /etc/kubernetes/manifests/kube-vip.yaml - content: | - --- - apiVersion: v1 - kind: Pod - metadata: - creationTimestamp: null - name: kube-vip - namespace: kube-system - spec: - containers: - - args: - - manager - env: - - name: cp_enable - value: "true" - - name: svc_enable - value: "{{ .kubeVipLoadBalancerProvider }}" - - name: vip_arp - value: "true" - - name: vip_leaderelection - value: "true" - - name: address - value: {{ .apiServerEndpoint }} - {{- if and (not .aviControlPlaneHAProvider) .apiServerPort }} - - name: port - value: "{{ .apiServerPort }}" - {{- end }} - - name: vip_interface - value: {{ .vipNetworkInterface }} - - name: vip_leaseduration - value: "30" - - name: vip_renewdeadline - value: "20" - - name: vip_retryperiod - value: "4" - image: {{(index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository}}/kube-vip:{{(index (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec "kube-vip").imageTag}} - imagePullPolicy: IfNotPresent - name: kube-vip - resources: {} - securityContext: - capabilities: - add: - - NET_ADMIN - - NET_RAW - volumeMounts: - - mountPath: /etc/kubernetes/admin.conf - name: kubeconfig - hostNetwork: true - hostAliases: - - hostnames: - - kubernetes - ip: 127.0.0.1 - volumes: - - hostPath: - path: /etc/kubernetes/admin.conf - type: FileOrCreate - name: kubeconfig - status: {} - - name: networkConfiguration - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: replace - path: /spec/template/spec/network - valueFrom: - template: | - devices: - - networkName: {{ .vcenter.network }} - {{ if .controlPlane.network.nameservers -}} - nameservers: - {{- range .controlPlane.network.nameservers }} - - {{ . }} - {{- end }} - {{- end }} - {{ if .controlPlane.network.searchDomains -}} - searchDomains: - {{- range .controlPlane.network.searchDomains }} - - {{ . }} - {{- end }} - {{- end }} - {{ if list "IPv4" "DualStack" | has .builtin.cluster.network.ipFamily | and (empty .network.addressesFromPools) -}} - dhcp4: true - {{ if .controlPlane.network.nameservers -}} - dhcp4Overrides: - useDNS: false - {{- end }} - {{- end }} - {{ if list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily | and (empty .network.addressesFromPools) -}} - dhcp6: true - {{ if .controlPlane.network.nameservers -}} - dhcp6Overrides: - useDNS: false - {{- end }} - {{- end }} - {{ if .network.addressesFromPools -}} - addressesFromPools: - {{- range .network.addressesFromPools }} - - apiGroup: {{ .apiGroup }} - kind: {{ .kind }} - name: {{ .name }} - {{- end }} - {{- end }} - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - - tkg-worker-windows - jsonPatches: - - op: add - path: /spec/template/spec/network - valueFrom: - template: | - devices: - - networkName: {{ .vcenter.network }} - {{ if .worker.network.nameservers -}} - nameservers: - {{- range .worker.network.nameservers }} - - {{ . }} - {{- end }} - {{- end }} - {{ if .controlPlane.network.searchDomains -}} - searchDomains: - {{- range .controlPlane.network.searchDomains }} - - {{ . }} - {{- end }} - {{- end }} - {{ if list "IPv4" "DualStack" | has .builtin.cluster.network.ipFamily | and (empty .network.addressesFromPools) -}} - dhcp4: true - {{ if .worker.network.nameservers -}} - dhcp4Overrides: - useDNS: false - {{- end }} - {{- end }} - {{ if list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily | and (empty .network.addressesFromPools) -}} - dhcp6: true - {{ if .worker.network.nameservers -}} - dhcp6Overrides: - useDNS: false - {{- end }} - {{- end }} - {{ if .network.addressesFromPools -}} - addressesFromPools: - {{- range .network.addressesFromPools }} - - apiGroup: {{ .apiGroup }} - kind: {{ .kind }} - name: {{ .name }} - {{- end }} - {{- end }} - - name: ipv6localhost - enabledIf: '{{ list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: echo "::1 localhost" >> /etc/hosts - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: echo "::1 localhost" >> /etc/hosts - - name: clusterApiServerPort - enabledIf: '{{ not (empty .apiServerPort) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereClusterTemplate - matchResources: - infrastructureCluster: true - jsonPatches: - - op: replace - path: /spec/template/spec/controlPlaneEndpoint/port - valueFrom: - variable: apiServerPort - - name: apiServerEndpointConfiguration - enabledIf: '{{ and (not .aviAPIServerHAProvider) (not (empty .apiServerPort)) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/localAPIEndpoint - valueFrom: - template: | - {{ if .builtin.cluster.network.ipFamily | eq "IPv6" | or (.builtin.cluster.network.ipFamily | eq "DualStack" | and (.network.ipv6Primary | default false)) -}} - advertiseAddress: '::/0' - {{- else -}} - advertiseAddress: '0.0.0.0' - {{- end }} - bindPort: {{ .apiServerPort }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/controlPlane - valueFrom: - template: | - localAPIEndpoint: - {{ if .builtin.cluster.network.ipFamily | eq "IPv6" | or (.builtin.cluster.network.ipFamily | eq "DualStack" | and (.network.ipv6Primary | default false)) -}} - advertiseAddress: '::/0' - {{- else -}} - advertiseAddress: '0.0.0.0' - {{- end }} - bindPort: {{ .apiServerPort }} - - name: bindAddressConfiguration - enabledIf: '{{ .builtin.cluster.network.ipFamily | eq "DualStack" | and (.network.ipv6Primary | default false) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/node-ip - value: "::" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-ip - value: "::" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/advertise-address - valueFrom: - variable: apiServerEndpoint - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/bind-address - value: "::" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/controllerManager/extraArgs/bind-address - value: "::" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/scheduler/extraArgs/bind-address - value: "::" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-ip - value: "::" - - name: ipv6KubeletNodeIPConfiguration - enabledIf: '{{ and (.builtin.cluster.network.ipFamily | eq "IPv6" | or (.builtin.cluster.network.ipFamily | eq "DualStack" | and (.network.ipv6Primary | default false))) (not .aviAPIServerHAProvider) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - value: - content: "" - owner: root:root - path: /etc/sysconfig/kubelet - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: "echo \"$(ip -6 -json addr show dev eth0 scope global | jq -r .[0].addr_info[0].local) $(hostname)\" >> /etc/hosts" - - name: nodeLabels - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if regexMatch "^(?:[a-zA-z])(?:[-\\w\\.]*[a-zA-z])$" $val }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.controlPlane.version).labels }} - {{- if regexMatch "^(?:[a-zA-z])(?:[-\\w\\.]*[a-zA-z])$" $val }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end }} - {{- end }} - {{- if .controlPlane.nodeLabels -}} - {{- if (index .TKR_DATA .builtin.controlPlane.version).labels -}} - , - {{- end -}} - {{- $first := true }} - {{- range .controlPlane.nodeLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - - tkg-worker-windows - jsonPatches: - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/node-labels - valueFrom: - template: | - {{ $first := true }} - {{- range $key, $val := (index .TKR_DATA .builtin.machineDeployment.version).labels }} - {{- if regexMatch "^(?:[a-zA-z])(?:[-\\w\\.]*[a-zA-z])$" $val }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- $key -}} = {{- $val }} - {{- end }} - {{- end }} - {{- if .nodePoolLabels -}} - , - {{- $first := true }} - {{- range .nodePoolLabels }} - {{- if $first }} - {{- $first = false }} - {{- else -}} - , - {{- end }} - {{- .key -}} = {{- .value -}} - {{ end }} - {{ end }} - - name: httpProxy - enabledIf: '{{ not (empty .proxy) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &containerdProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /etc/systemd/system/containerd.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &kubeletProxyConf | - content: | - [Service] - Environment="HTTP_PROXY= {{- .proxy.httpProxy -}} " - Environment="HTTPS_PROXY= {{- .proxy.httpsProxy -}} " - Environment="NO_PROXY= {{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," -}} " - owner: root:root - path: /usr/lib/systemd/system/kubelet.service.d/http-proxy.conf - permissions: "0640" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPProxy | - export HTTP_PROXY= {{- .proxy.httpProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportHTTPSProxy | - export HTTPS_PROXY= {{- .proxy.httpsProxy }} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: &exportNoProxy | - export NO_PROXY= {{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *containerdProxyConf - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *kubeletProxyConf - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl daemon-reload - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportHTTPSProxy - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: *exportNoProxy - - name: httpProxyCACert - enabledIf: '{{ $hasProxyCert := false }} {{- range .trust.additionalTrustedCAs }} {{- if .name | eq "proxy" }} {{- $hasProxyCert = true }} {{- end }} {{- end }} {{- $hasProxyCert }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/ssl/certs/tkg-custom-ca.pem - {{- $proxy := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- end }} - content: {{ $proxy }} - encoding: base64 - permissions: "0444" - - name: customizedImageRepo - enabledIf: '{{ not (empty .imageRepository.host) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - sed -i 's|".*/pause|" {{- or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository -}} /pause|' /etc/containerd/config.toml - - name: registryCACert - enabledIf: '{{ not (empty .trust.additionalTrustedCAs) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - path: /etc/containerd/ {{- index (or .imageRepository.host (index .TKR_DATA .builtin.controlPlane.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} .crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 -}} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs." {{- $host -}} ".tls]' >> /etc/containerd/config.toml - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - {{- $host := index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }} - {{- $val := list "ca_file = \"/etc/containerd/" $host ".crt\"" | join "" }} - {{- with .imageRepository }} - {{- if .tlsCertificateValidation | eq false }} - {{- $val = "insecure_skip_verify = true" }} - {{- end }} - {{- end -}} - {{- define "echo" -}} - echo ' {{ . -}} ' >> /etc/containerd/config.toml - {{- end }} - {{- template "echo" $val -}} - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - path: /etc/containerd/{{ index (or .imageRepository.host (index .TKR_DATA .builtin.machineDeployment.version).kubernetesSpec.imageRepository | splitList "/") 0 }}.crt - {{- $proxy := "" }} - {{- $image := "" }} - {{- range .trust.additionalTrustedCAs }} - {{- if eq .name "proxy" }} - {{- $proxy = .data }} - {{- end }} - {{- if eq .name "imageRepository" }} - {{- $image = .data }} - {{- end }} - {{- end }} - content: {{or $proxy $image}} - encoding: base64 - permissions: "0444" - - name: additionalRegistryCACerts - enabledIf: '{{ not (empty .additionalImageRegistries) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: &insertCAScript | - path: /tmp/insert_registry_ca_certs.sh - content: | - #!/bin/bash - set -e - {{- range .additionalImageRegistries }} - {{- if eq .skipTlsVerify false }} - echo '{{ .caCert }}' | base64 -d > /etc/containerd/{{ .host }}.crt - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo ' ca_file = "/etc/containerd/{{ .host }}.crt"' >> /etc/containerd/config.toml - {{- else }} - echo '[plugins."io.containerd.grpc.v1.cri".registry.configs."{{ .host }}".tls]' >> /etc/containerd/config.toml - echo " insecure_skip_verify = true" >> /etc/containerd/config.toml - {{- end }} - {{- end }} - permissions: "0755" - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: /tmp/insert_registry_ca_certs.sh - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: *insertCAScript - - name: auditLogging - enabledIf: '{{ .auditLogging.enabled }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-path - value: /var/log/kubernetes/audit.log - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-policy-file - value: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxage - value: "30" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxbackup - value: "10" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/audit-log-maxsize - value: "100" - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-policy - hostPath: /etc/kubernetes/audit-policy.yaml - mountPath: /etc/kubernetes/audit-policy.yaml - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/- - value: - name: audit-logs - hostPath: /var/log/kubernetes - mountPath: /var/log/kubernetes - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - value: - path: /etc/kubernetes/audit-policy.yaml - owner: "root:root" - permissions: "0600" - content: | - --- - apiVersion: audit.k8s.io/v1 - kind: Policy - rules: - #! The following requests were manually identified as high-volume and low-risk, - #! so drop them. - - level: None - users: ["system:serviceaccount:kube-system:kube-proxy"] - verbs: ["watch"] - resources: - - group: "" #! core - resources: ["endpoints", "services", "services/status"] - - level: None - userGroups: ["system:nodes"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["nodes", "nodes/status"] - - level: None - users: - - system:kube-controller-manager - - system:kube-scheduler - - system:serviceaccount:kube-system:endpoint-controller - verbs: ["get", "update"] - namespaces: ["kube-system"] - resources: - - group: "" #! core - resources: ["endpoints"] - - level: None - users: ["system:apiserver"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["namespaces", "namespaces/status", "namespaces/finalize"] - #! Don't log HPA fetching metrics. - - level: None - users: - - system:kube-controller-manager - verbs: ["get", "list"] - resources: - - group: "metrics.k8s.io" - #! Don't log these read-only URLs. - - level: None - nonResourceURLs: - - /healthz* - - /version - - /swagger* - #! Don't log events requests. - - level: None - resources: - - group: "" #! core - resources: ["events"] - #! Don't log TMC service account performing read operations because they are high-volume. - - level: None - userGroups: ["system:serviceaccounts:vmware-system-tmc"] - verbs: ["get", "list", "watch"] - #! Don't log read requests from garbage collector because they are high-volume. - - level: None - users: ["system:serviceaccount:kube-system:generic-garbage-collector"] - verbs: ["get", "list", "watch"] - #! node and pod status calls from nodes are high-volume and can be large, don't log responses for expected updates from nodes - - level: Request - userGroups: ["system:nodes"] - verbs: ["update","patch"] - resources: - - group: "" #! core - resources: ["nodes/status", "pods/status"] - omitStages: - - "RequestReceived" - #! deletecollection calls can be large, don't log responses for expected namespace deletions - - level: Request - users: ["system:serviceaccount:kube-system:namespace-controller"] - verbs: ["deletecollection"] - omitStages: - - "RequestReceived" - #! Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data, - #! so only log at the Metadata level. - - level: Metadata - resources: - - group: "" #! core - resources: ["secrets", "configmaps"] - - group: authentication.k8s.io - resources: ["tokenreviews"] - omitStages: - - "RequestReceived" - #! Get repsonses can be large; skip them. - - level: Request - verbs: ["get", "list", "watch"] - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for known APIs - - level: RequestResponse - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for all other requests. - - level: Metadata - omitStages: - - "RequestReceived" - - name: controlPlaneTaint - enabledIf: '{{ not .controlPlaneTaint }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/initConfiguration/nodeRegistration/taints - value: [] - - op: add - path: /spec/template/spec/kubeadmConfigSpec/joinConfiguration/nodeRegistration/taints - value: [] - - name: kcptCertificateRotation - enabledIf: '{{ .controlPlaneCertificateRotation.activate }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/rolloutBefore - valueFrom: - template: | - certificatesExpiryDays: {{ .controlPlaneCertificateRotation.daysBefore }} - - name: windows - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker-windows - jsonPatches: - - op: remove - path: /spec/template/spec/useExperimentalRetryJoin - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/criSocket - value: npipe:////./pipe/containerd-containerd - - op: remove - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/tls-cipher-suites - - op: add - path: /spec/template/spec/joinConfiguration/nodeRegistration/kubeletExtraArgs/register-with-taints - value: os=windows:NoSchedule - - op: replace - path: /spec/template/spec/joinConfiguration/nodeRegistration/name - value: '{{ ds.meta_data.hostname }}' - - op: replace - path: /spec/template/spec/preKubeadmCommands - valueFrom: - template: | - - echo | set /p="::1 ipv6-localhost ipv6-loopback localhost6 localhost6.localdomain6" > C:\etc\hosts & echo. >> C:\etc\hosts - - echo | set /p="127.0.0.1 {{" {{ ds.meta_data.hostname }} "}} localhost localhost.localdomain localhost4 localhost4.localdomain4" >> C:\etc\hosts - - op: add - path: /spec/template/spec/files/- - value: - path: 'C:\k\prevent_windows_updates.ps1' - content: | - Set-Service -Name "wuauserv" -StartupType Disabled -Status Stopped - - op: add - path: /spec/template/spec/files/- - value: - content: | - # Disable firewall for SSH and OVS access - Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False - path: C:\k\disable_firewall.ps1 - - op: add - path: /spec/template/spec/postKubeadmCommands/- - value: powershell c:/k/prevent_windows_updates.ps1 -ExecutionPolicy Bypass - - op: add - path: /spec/template/spec/postKubeadmCommands/- - value: powershell c:/k/disable_firewall.ps1 - - op: replace - path: /spec/template/spec/users - valueFrom: - template: | - - name: capv - groups: Administrators - sshAuthorizedKeys: - {{- range .user.sshAuthorizedKeys }} - - ' {{- . -}} ' - {{- end }} - sudo: ALL=(ALL) NOPASSWD:ALL - - name: windows-antrea - enabledIf: '{{ .cni | eq "antrea" }}' - definitions: - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker-windows - jsonPatches: - - op: add - path: /spec/template/spec/files/- - value: - path: 'C:\Temp\antrea.ps1' - content: | - function WaitForSaToken($KubeCfgFile, $ServiceAcctName) { - $SaToken = $null - $LoopCount = 400 - do { - $LoopCount = $LoopCount - 1 - if ($LoopCount -eq 0) { - break - } - sleep 5 - $SaToken=$(kubectl --kubeconfig=$KubeCfgFile get secrets -n kube-system -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='$ServiceAcctName')].data.token}") - } while ($SaToken -eq $null) - return $SaToken - } - - $TempFolder = 'C:\programdata\temp' - $AntreaInTempFolder = "$TempFolder\antrea-windows-advanced.zip" - $KubeproxyInTempFolder = "$TempFolder\kube-proxy.exe" - - # Create Folders - $folders = @('C:\k\antrea', 'C:\var\log\antrea', 'C:\k\antrea\bin', 'C:\var\log\kube-proxy', 'C:\opt\cni\bin', 'C:\etc\cni\net.d') - foreach ($f in $folders) { - New-Item -ItemType Directory -Force -Path $f - } - - # Add Windows Defender Options - $avexceptions = @('C:\program files\containerd\ctr.exe', 'C:\program files\containerd\containerd.exe') - foreach ($e in $avexceptions) { - Add-MpPreference -ExclusionProcess $e - } - - # Extract Antrea, Antrea binary should be packed into windows OVA already - $antreaZipFile = 'C:\k\antrea\antrea-windows-advanced.zip' - if (!(Test-Path $antreaZipFile)) { - cp $AntreaInTempFolder $antreaZipFile - } - Expand-Archive -Force -Path $antreaZipFile -DestinationPath C:\k\antrea - cp C:\k\antrea\bin\antrea-cni.exe C:\opt\cni\bin\antrea.exe -Force - cp C:\k\antrea\bin\host-local.exe C:\opt\cni\bin\host-local.exe -Force - cp C:\k\antrea\etc\antrea-cni.conflist C:\etc\cni\net.d\10-antrea.conflist -Force - - # Get HostIP and set in kubeadm-flags.env - [Environment]::SetEnvironmentVariable("NODE_NAME", (hostname).ToLower()) - $env:HostIP = ( - Get-NetIPConfiguration | - Where-Object { - $_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.Status -ne "Disconnected" - } - ).IPv4Address.IPAddress - $file = 'C:\var\lib\kubelet\kubeadm-flags.env' - $newstr = "--node-ip=" + $env:HostIP - $raw = Get-Content -Path $file -TotalCount 1 - $raw = $raw -replace ".$" - $new = "$($raw) $($newstr)`"" - Set-Content $file $new - - $KubeConfigFile = 'C:\etc\kubernetes\kubelet.conf' - - # Wait for antrea-agent token to be ready, the token will be used by Install-AntreaAgent - $AntreaAgentToken = (WaitForSaToken $KubeConfigFile 'antrea-agent') - - # Setup Kube-Proxy config file - $KubeProxyToken = (WaitForSaToken $KubeConfigFile 'kube-proxy-windows') - $KubeProxyConfig = 'C:\k\antrea\etc\kube-proxy.conf' - $KubeAPIServer = $(kubectl --kubeconfig=$KubeConfigFile config view -o jsonpath='{.clusters[0].cluster.server}') - $KubeProxyToken = $([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($KubeProxyToken))) - kubectl config --kubeconfig=$KubeProxyConfig set-cluster kubernetes --server=$KubeAPIServer --insecure-skip-tls-verify - kubectl config --kubeconfig=$KubeProxyConfig set-credentials kube-proxy-windows --token=$KubeProxyToken - kubectl config --kubeconfig=$KubeProxyConfig set-context kube-proxy-windows@kubernetes --cluster=kubernetes --user=kube-proxy-windows - kubectl config --kubeconfig=$KubeProxyConfig use-context kube-proxy-windows@kubernetes - - # kube-proxy.exe should be packed into windows OVA - if (!(Test-Path 'C:\k\kube-proxy.exe')) { - cp $KubeproxyInTempFolder 'C:\k\kube-proxy.exe' - } - - # Install antrea-agent & OVS - Import-Module C:\k\antrea\helper.psm1 - & Install-AntreaAgent -KubernetesHome "C:\k" -KubeConfig "C:\etc\kubernetes\kubelet.conf" -AntreaHome "C:\k\antrea" -AntreaVersion "1.7.1" - New-KubeProxyServiceInterface - & C:\k\antrea\Install-OVS.ps1 -ImportCertificate $false -LocalFile C:\k\antrea\ovs-win64.zip - - # Setup Services - $nssm = (Get-Command nssm).Source - & $nssm set kubelet start SERVICE_AUTO_START - & $nssm install kube-proxy "C:\k\kube-proxy.exe" "--proxy-mode=userspace --kubeconfig=$KubeProxyConfig --log-dir=C:\var\log\kube-proxy --logtostderr=false --alsologtostderr" - & $nssm install antrea-agent "C:\k\antrea\bin\antrea-agent.exe" "--config=C:\k\antrea\etc\antrea-agent.conf --logtostderr=false --log_dir=C:\var\log\antrea --alsologtostderr --log_file_max_size=100 --log_file_max_num=4" - & $nssm set antrea-agent DependOnService kube-proxy ovs-vswitchd - & $nssm set antrea-agent Start SERVICE_AUTO_START - - # Start Services - start-service kubelet - start-service kube-proxy - start-service antrea-agent - - op: add - path: /spec/template/spec/postKubeadmCommands/- - value: powershell C:/Temp/antrea.ps1 -ExecutionPolicy Bypass - - name: ntpServers - enabledIf: '{{ not (empty .ntpServers) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/ntp - valueFrom: - template: | - enabled: true - servers: - {{- range .ntpServers }} - - {{ . }} - {{- end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/ntp - valueFrom: - template: | - enabled: true - servers: - {{- range .ntpServers }} - - {{ . }} - {{- end }} - - name: additionalFQDN - enabledIf: '{{ not (empty .additionalFQDN) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/certSANs - valueFrom: - template: | - {{- range .additionalFQDN }} - - {{ . }} - {{- end }} - - name: addCustomTDNFRepository - enabledIf: '{{ not (empty .customTDNFRepository) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: 'rm -rf /etc/yum.repos.d/*' - - op: add - path: /spec/template/spec/kubeadmConfigSpec/files/- - valueFrom: - template: | - {{ if .customTDNFRepository.certificate -}} - path: /etc/ssl/certs/private-tdnf-repository-ca.pem - content: {{.customTDNFRepository.certificate}} - encoding: base64 - permissions: "0444" - {{- end }} - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: 'rm -rf /etc/yum.repos.d/*' - - op: add - path: /spec/template/spec/files/- - valueFrom: - template: | - {{ if .customTDNFRepository.certificate -}} - path: /etc/ssl/certs/private-tdnf-repository-ca.pem - content: {{.customTDNFRepository.certificate}} - encoding: base64 - permissions: "0444" - {{- end }} - - name: systemWideProxy - enabledIf: '{{ .proxy.systemWide }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTP_PROXY={{- .proxy.httpProxy }}" >> /etc/profile - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTPS_PROXY= {{- .proxy.httpsProxy }}" >> /etc/profile - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo 'export NO_PROXY={{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }}' >> /etc/profile - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTP_PROXY={{- .proxy.httpProxy }}" >> /etc/environment - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTPS_PROXY= {{- .proxy.httpsProxy }}" >> /etc/environment - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - valueFrom: - template: | - echo 'export NO_PROXY={{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }}' >> /etc/environment - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTP_PROXY={{- .proxy.httpProxy }}" >> /etc/profile - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTPS_PROXY= {{- .proxy.httpsProxy }}" >> /etc/profile - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo 'export NO_PROXY={{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }}' >> /etc/profile - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTP_PROXY={{- .proxy.httpProxy }}" >> /etc/environment - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo "export HTTPS_PROXY= {{- .proxy.httpsProxy }}" >> /etc/environment - - op: add - path: /spec/template/spec/preKubeadmCommands/- - valueFrom: - template: | - echo 'export NO_PROXY={{- list "localhost" "127.0.0.1" ".svc" ".svc.cluster.local" ((list "IPv6" "DualStack" | has .builtin.cluster.network.ipFamily) | ternary "::1" nil) | concat .proxy.noProxy .builtin.cluster.network.services .builtin.cluster.network.pods | uniq | sortAlpha | join "," }}' >> /etc/environment - - name: pciWorker - enabledIf: '{{ not (empty .pci.worker.devices) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/pciDevices - valueFrom: - template: | - {{- range .pci.worker.devices}} - - deviceId: {{ .deviceId }} - vendorId: {{ .vendorId }} - {{- end }} - - op: add - path: /spec/template/spec/hardwareVersion - valueFrom: - variable: pci.worker.hardwareVersion - - name: pciControlPlane - enabledIf: '{{ not (empty .pci.controlPlane.devices) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/pciDevices - valueFrom: - template: | - {{- range .pci.controlPlane.devices}} - - deviceId: {{ .deviceId }} - vendorId: {{ .vendorId }} - {{- end }} - - op: add - path: /spec/template/spec/hardwareVersion - valueFrom: - variable: pci.controlPlane.hardwareVersion - - name: workerVMCustomizations - enabledIf: '{{ not (empty .worker.machine.customVMXKeys) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/customVMXKeys - valueFrom: - template: | - {{- range $key, $val := .worker.machine.customVMXKeys}} - {{ $key }} : "{{ $val }}" - {{- end }} - - name: controlPlaneVMCustomizations - enabledIf: '{{ not (empty .controlPlane.machine.customVMXKeys) }}' - definitions: - - selector: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/customVMXKeys - valueFrom: - template: | - {{- range $key, $val := .controlPlane.machine.customVMXKeys}} - {{ $key }} : "{{ $val }}" - {{- end }} diff --git a/providers/infrastructure-vsphere/v1.5.3/cconly/overlay-kube-apiserver-admission.yaml b/providers/infrastructure-vsphere/v1.5.3/cconly/overlay-kube-apiserver-admission.yaml deleted file mode 100644 index 965c26e66d..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/cconly/overlay-kube-apiserver-admission.yaml +++ /dev/null @@ -1,192 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -spec: - #@overlay/match missing_ok=True - variables: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - required: false - schema: - openAPIV3Schema: - type: object - default: {} - properties: - deactivated: - type: boolean - description: "deactivated disables the patches for Pod Security Standard via AdmissionConfiguration." - enforce: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "enforce sets the level for the enforce PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - enforceVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "enforceVersion sets the version for the enforce PodSecurityConfiguration mode." - audit: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "audit sets the level for the audit PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - auditVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "auditVersion sets the version for the audit PodSecurityConfiguration mode." - warn: - type: string - enum: ["", "privileged", "baseline", "restricted"] - description: "warn sets the level for the warn PodSecurityConfiguration mode. One of \"\", privileged, baseline, restricted." - nullable: true - warnVersion: - type: string - #! Version defaults to v1.24 for now. When v1.25 is part of tanzu-framework, the defaulting should be done - #! by a defaulting webhook instead for extended logic. - default: "v1.24" - description: "warnVersion sets the version for the warn PodSecurityConfiguration mode." - exemptions: - type: object - description: "exemption configuration for the PodSecurityConfiguration." - properties: - namespaces: - type: array - items: - type: string - description: "namespaces excluded to apply PodSecurityConfiguration Admission." - #@overlay/append - - name: eventRateLimitConf - required: false - schema: - openAPIV3Schema: - type: string - default: "" - #@overlay/match missing_ok=True - patches: - #@overlay/remove - #@overlay/match by=overlay.map_key("name"),missing_ok=True - - name: podSecurityStandard - #@overlay/append - - name: podSecurityStandard - description: "Adds an admission configuration for kube-apiserver." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/admission-control-config-file" - value: "/etc/kubernetes/admission-control-config.yaml" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: admin-control-conf - hostPath: /etc/kubernetes/admission-control-config.yaml - mountPath: /etc/kubernetes/admission-control-config.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/admission-control-config.yaml - content: |- - apiVersion: apiserver.config.k8s.io/v1 - kind: AdmissionConfiguration - plugins: - {{- if and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version) }} - {{ $namespace_exemptions := printf "%q, %q" "kube-system" "tkg-system" -}} - {{ $defaultWarnAudit := "baseline" }} - {{- if .podSecurityStandard.exemptions.namespaces -}} - {{ range $namespace := .podSecurityStandard.exemptions.namespaces -}} - {{ $namespace_exemptions = printf "%s, %q" $namespace_exemptions $namespace -}} - {{- end -}} - {{- end -}} - - name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "{{ if .podSecurityStandard.enforce -}} - {{ .podSecurityStandard.enforce }} - {{- end }}" - enforce-version: "{{ .podSecurityStandard.enforceVersion -}}" - audit: "{{ if .podSecurityStandard.audit -}} - {{ .podSecurityStandard.audit }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - audit-version: "{{ .podSecurityStandard.auditVersion -}}" - warn: "{{ if .podSecurityStandard.warn -}} - {{ .podSecurityStandard.warn }} - {{- else -}} - {{ $defaultWarnAudit }} - {{- end }}" - warn-version: "{{ .podSecurityStandard.warnVersion -}}" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: [{{ $namespace_exemptions }}] - {{- end }} - {{- if .eventRateLimitConf }} - - name: EventRateLimit - path: eventConfig.yaml - {{- end }} - enabledIf: '{{ or (and (not .podSecurityStandard.deactivated) (semverCompare ">= v1.24" .builtin.controlPlane.version)) (.eventRateLimitConf) }}' - #@overlay/append - - name: eventRateLimitConf - description: "Adds an admission configuration for EventRateLimit." - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraArgs/enable-admission-plugins" - valueFrom: - template: | - {{ $containEnableAdmissionPlugin := false }} - {{- $admissionPlugins := "" }} - {{- range $key, $val := .apiServerExtraArgs }} - {{- if eq $key "enable-admission-plugins" }} - {{- $containEnableAdmissionPlugin = true }} - {{- $admissionPlugins = $val }} - {{- end }} - {{- end }} - {{- if not $containEnableAdmissionPlugin }} - NodeRestriction,EventRateLimit - {{- else -}} - {{- $admissionPlugins -}},EventRateLimit - {{- end }} - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes/-" - valueFrom: - template: | - name: event-conf - hostPath: /etc/kubernetes/eventConfig.yaml - mountPath: /etc/kubernetes/eventConfig.yaml - readOnly: true - pathType: "File" - - op: add - path: "/spec/template/spec/kubeadmConfigSpec/files/-" - valueFrom: - template: |- - path: /etc/kubernetes/eventConfig.yaml - encoding: base64 - content: {{ .eventRateLimitConf}} - enabledIf: '{{ not (empty .eventRateLimitConf) }}' diff --git a/providers/infrastructure-vsphere/v1.5.3/cconly/overlay.yaml b/providers/infrastructure-vsphere/v1.5.3/cconly/overlay.yaml deleted file mode 100644 index 3638492bd7..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/cconly/overlay.yaml +++ /dev/null @@ -1,95 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind":"ClusterClass"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: ClusterClass -metadata: - namespace: #@ data.values.NAMESPACE -spec: - controlPlane: - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_CONTROL_PLANE: - #@overlay/match missing_ok=True - machineHealthCheck: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_CONTROL_PLANE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - workers: - machineDeployments: - #@overlay/match by="class" - - class: tkg-worker - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - #@overlay/match missing_ok=True - machineHealthCheck: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - - #@overlay/match by="class", missing_ok=True - - class: tkg-worker-windows - #@ if data.values.ENABLE_MHC or data.values.ENABLE_MHC_WORKER_NODE: - #@overlay/match missing_ok=True - machineHealthCheck: - maxUnhealthy: #@ data.values.MHC_MAX_UNHEALTHY_WORKER_NODE - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - unhealthyConditions: - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT - #@ end - patches: - #@overlay/match by=overlay.index(0) - #@overlay/insert before=True - - definitions: - - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/clusterConfiguration/apiServer/extraVolumes - value: [] - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - name: KCP_INIT_APISERVER_EMPTY_EXTRAVOLUMES_ARRAY - #@overlay/append - - name: restartContainerdService - enabledIf: '{{ not (and (empty .proxy) (empty .trust.additionalTrustedCAs) (empty .imageRepository.host) (empty .additionalImageRegistries)) }}' - definitions: - - selector: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlaneTemplate - matchResources: - controlPlane: true - jsonPatches: - - op: add - path: /spec/template/spec/kubeadmConfigSpec/preKubeadmCommands/- - value: systemctl restart containerd - - selector: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - matchResources: - machineDeploymentClass: - names: - - tkg-worker - jsonPatches: - - op: add - path: /spec/template/spec/preKubeadmCommands/- - value: systemctl restart containerd diff --git a/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-dev.yaml b/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-dev.yaml deleted file mode 100644 index 981d3152a3..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-dev.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-vsphere/v1.5.3/ytt - - path: providers/infrastructure-vsphere/ytt - - path: providers/ytt - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-devcc.yaml b/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-devcc.yaml deleted file mode 100644 index a719a920c6..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-devcc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/yttcb - - path: providers/infrastructure-vsphere/v1.5.3/yttcc - - path: providers/infrastructure-vsphere/yttcc - - path: providers/yttcc - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-prod.yaml b/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-prod.yaml deleted file mode 100644 index 981d3152a3..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-prod.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-vsphere/v1.5.3/ytt - - path: providers/infrastructure-vsphere/ytt - - path: providers/ytt - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-prodcc.yaml b/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-prodcc.yaml deleted file mode 100644 index a719a920c6..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/cluster-template-definition-prodcc.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/yttcb - - path: providers/infrastructure-vsphere/v1.5.3/yttcc - - path: providers/infrastructure-vsphere/yttcc - - path: providers/yttcc - - path: bom - filemark: text-plain - - path: providers/config_default.yaml diff --git a/providers/infrastructure-vsphere/v1.5.3/clusterclass-tkg-vsphere-default.yaml b/providers/infrastructure-vsphere/v1.5.3/clusterclass-tkg-vsphere-default.yaml deleted file mode 100644 index 5c5fa324ad..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/clusterclass-tkg-vsphere-default.yaml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: providers.tanzu.vmware.com/v1alpha1 -kind: TemplateDefinition -spec: - paths: - - path: providers/infrastructure-vsphere/v1.5.3/cconly - - path: providers/config_default.yaml diff --git a/providers/infrastructure-vsphere/v1.5.3/infrastructure-components-supervisor.yaml b/providers/infrastructure-vsphere/v1.5.3/infrastructure-components-supervisor.yaml deleted file mode 100644 index 1bb2ca6917..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/infrastructure-components-supervisor.yaml +++ /dev/null @@ -1,1587 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: providerserviceaccounts.vmware.infrastructure.cluster.x-k8s.io -spec: - group: vmware.infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: ProviderServiceAccount - listKind: ProviderServiceAccountList - plural: providerserviceaccounts - singular: providerserviceaccount - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .spec.ref.name - name: VSphereCluster - type: string - - jsonPath: .spec.targetNamespace - name: TargetNamespace - type: string - - jsonPath: .spec.targetSecretName - name: TargetSecretName - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: ProviderServiceAccount is the schema for the ProviderServiceAccount API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ProviderServiceAccountSpec defines the desired state of ProviderServiceAccount. - properties: - ref: - description: Ref specifies the reference to the VSphereCluster for which the ProviderServiceAccount needs to be realized. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - rules: - description: Rules specifies the privileges that need to be granted to the service account. - items: - description: PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to. - properties: - apiGroups: - description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. - items: - type: string - type: array - nonResourceURLs: - description: NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. - items: - type: string - type: array - resourceNames: - description: ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. - items: - type: string - type: array - resources: - description: Resources is a list of resources this rule applies to. '*' represents all resources. - items: - type: string - type: array - verbs: - description: Verbs is a list of Verbs that apply to ALL the ResourceKinds contained in this rule. '*' represents all verbs. - items: - type: string - type: array - required: - - verbs - type: object - type: array - targetNamespace: - description: TargetNamespace is the namespace in the target cluster where the secret containing the generated service account token needs to be created. - type: string - targetSecretName: - description: TargetSecretName is the name of the secret in the target cluster that contains the generated service account token. - type: string - required: - - ref - - rules - - targetNamespace - - targetSecretName - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vsphereclusters.vmware.infrastructure.cluster.x-k8s.io -spec: - group: vmware.infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereCluster - listKind: VSphereClusterList - plural: vsphereclusters - singular: vspherecluster - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereCluster is the Schema for the VSphereClusters API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - controlPlaneEndpoint: - description: APIEndpoint represents a reachable Kubernetes API endpoint. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - required: - - controlPlaneEndpoint - type: object - status: - description: VSphereClusterStatus defines the observed state of VSphereClusterSpec - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a list of failure domain objects synced from the infrastructure provider. - type: object - ready: - description: Ready indicates the infrastructure required to deploy this cluster is ready. - type: boolean - resourcePolicyName: - description: ResourcePolicyName is the name of the VirtualMachineSetResourcePolicy for the cluster, if one exists - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vsphereclustertemplates.vmware.infrastructure.cluster.x-k8s.io -spec: - group: vmware.infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereClusterTemplate - listKind: VSphereClusterTemplateList - plural: vsphereclustertemplates - singular: vsphereclustertemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereClusterTemplate is the Schema for the vsphereclustertemplates API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterTemplateSpec defines the desired state of VSphereClusterTemplate - properties: - template: - properties: - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - controlPlaneEndpoint: - description: APIEndpoint represents a reachable Kubernetes API endpoint. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - required: - - controlPlaneEndpoint - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspheremachines.vmware.infrastructure.cluster.x-k8s.io -spec: - group: vmware.infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereMachine - listKind: VSphereMachineList - plural: vspheremachines - singular: vspheremachine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Zone - jsonPath: .spec.failureDomain - name: Zone - type: string - - description: Provider ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: IP address - jsonPath: .status.vmIp - name: IPAddr - type: string - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereMachine is the Schema for the vspheremachines API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineSpec defines the desired state of VSphereMachine - properties: - className: - description: ClassName is the name of the class used when specifying the underlying virtual machine - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - imageName: - description: ImageName is the name of the base image used when specifying the underlying virtual machine - type: string - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated as vsphere://12345678-1234-1234-1234-123456789abc. This is required at runtime by CAPI. Do not remove this field. - type: string - storageClass: - description: StorageClass is the name of the storage class used when specifying the underlying virtual machine. - type: string - volumes: - description: Volumes is the set of PVCs to be created and attached to the VSphereMachine - items: - description: VSphereMachineVolume defines a PVC attachment - properties: - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Capacity is the PVC capacity - type: object - name: - description: 'Name is suffix used to name this PVC as: VSphereMachine.Name + "-" + Name' - type: string - storageClass: - description: StorageClass defaults to VSphereMachineSpec.StorageClass - type: string - required: - - capacity - - name - type: object - type: array - required: - - className - - imageName - type: object - status: - description: VSphereMachineStatus defines the observed state of VSphereMachine - properties: - addresses: - description: Addresses contains the instance associated addresses. - items: - description: NodeAddress contains information for the node's address. - properties: - address: - description: The node address. - type: string - type: - description: Node address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - ready: - description: Ready is true when the provider resource is ready. This is required at runtime by CAPI. Do not remove this field. - type: boolean - vmID: - description: ID is used to identify the virtual machine. - type: string - vmIp: - description: IPAddr is the IP address used to access the virtual machine. - type: string - vmstatus: - description: VMStatus is used to identify the virtual machine status. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspheremachinetemplates.vmware.infrastructure.cluster.x-k8s.io -spec: - group: vmware.infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereMachineTemplate - listKind: VSphereMachineTemplateList - plural: vspheremachinetemplates - singular: vspheremachinetemplate - scope: Namespaced - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereMachineTemplate is the Schema for the vspheremachinetemplates API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineTemplateSpec defines the desired state of VSphereMachineTemplate - properties: - template: - description: VSphereMachineTemplateResource describes the data needed to create a VSphereMachine from a template - properties: - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - className: - description: ClassName is the name of the class used when specifying the underlying virtual machine - type: string - failureDomain: - description: FailureDomain is the failure domain the machine will be created in. Must match a key in the FailureDomains map stored on the cluster object. - type: string - imageName: - description: ImageName is the name of the base image used when specifying the underlying virtual machine - type: string - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated as vsphere://12345678-1234-1234-1234-123456789abc. This is required at runtime by CAPI. Do not remove this field. - type: string - storageClass: - description: StorageClass is the name of the storage class used when specifying the underlying virtual machine. - type: string - volumes: - description: Volumes is the set of PVCs to be created and attached to the VSphereMachine - items: - description: VSphereMachineVolume defines a PVC attachment - properties: - capacity: - additionalProperties: - anyOf: - - type: integer - - type: string - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - description: Capacity is the PVC capacity - type: object - name: - description: 'Name is suffix used to name this PVC as: VSphereMachine.Name + "-" + Name' - type: string - storageClass: - description: StorageClass defaults to VSphereMachineSpec.StorageClass - type: string - required: - - capacity - - name - type: object - type: array - required: - - className - - imageName - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-leader-election-role - namespace: capv-system -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -aggregationRule: - clusterRoleSelectors: - - matchLabels: - capv.infrastucture.cluster.x-k8s.io/aggregate-to-manager: "true" -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-aggregated-manager-role -rules: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - capv.infrastucture.cluster.x-k8s.io/aggregate-to-manager: "true" - cluster.x-k8s.io/aggregate-to-manager: "true" - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - kubeadm.controlplane.cluster.x-k8s.io/aggregate-to-manager: "true" - name: capv-manager-role -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - configmaps - - events - - nodes - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - patch - - update -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims - verbs: - - create - - delete - - get - - list - - update - - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims/status - verbs: - - get - - patch - - update -- apiGroups: - - "" - resources: - - secrets - verbs: - - get -- apiGroups: - - "" - resources: - - serviceaccounts - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - services - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - services/status - verbs: - - get -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - machines - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - - machinesets - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - verbs: - - get - - list - - patch - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines/status - verbs: - - get - - list - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - kubeadmcontrolplanes - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - nodes - verbs: - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusteridentities - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusteridentities/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheredeploymentzones - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheredeploymentzones/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherefailuredomains - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachines/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherevms - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherevms/status - verbs: - - get - - patch - - update -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddressclaims - verbs: - - create - - get - - list - - update - - watch -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddresses - verbs: - - get - - list - - watch -- apiGroups: - - netoperator.vmware.com - resources: - - networks - verbs: - - get - - list - - watch -- apiGroups: - - rbac.authorization.k8s.io - resources: - - rolebindings - - roles - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - topology.tanzu.vmware.com - resources: - - availabilityzones - verbs: - - get - - list - - watch -- apiGroups: - - topology.tanzu.vmware.com - resources: - - availabilityzones/status - verbs: - - get - - list - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachineimages - - virtualmachineimages/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachineservices - - virtualmachineservices/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachinesetresourcepolicies - - virtualmachinesetresourcepolicies/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.com - resources: - - virtualnetworks - - virtualnetworks/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - providerserviceaccounts - verbs: - - get - - list - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - providerserviceaccounts/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclustertemplates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachines/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-leader-election-rolebinding - namespace: capv-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capv-leader-election-role -subjects: -- kind: ServiceAccount - name: default - namespace: capv-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capv-aggregated-manager-role -subjects: -- kind: ServiceAccount - name: default - namespace: capv-system ---- -apiVersion: v1 -kind: Secret -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-manager-bootstrap-credentials - namespace: capv-system -stringData: - credentials.yaml: |- - username: '${VSPHERE_USERNAME}' - password: '${VSPHERE_PASSWORD}' -type: Opaque ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-webhook-service - namespace: capv-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - control-plane: controller-manager - name: capv-controller-manager - namespace: capv-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --logtostderr - - --v=4 - - --feature-gates=NodeAntiAffinity=${EXP_NODE_ANTI_AFFINITY:=true},NodeLabeling=${EXP_NODE_LABELING:=true} - env: - - name: SERVICE_ACCOUNTS_CM_NAMESPACE - value: ${SERVICE_ACCOUNTS_CM_NAMESPACE} - - name: SERVICE_ACCOUNTS_CM_NAME - value: ${SERVICE_ACCOUNTS_CM_NAME} - - name: HTTP_PROXY - value: ${TKG_HTTP_PROXY} - - name: HTTPS_PROXY - value: ${TKG_HTTPS_PROXY} - - name: NO_PROXY - value: ${TKG_NO_PROXY} - image: registry.tkg.vmware.run/cluster-api/cluster-api-vsphere-controller:${CAPV_CONTROLLER_IMAGE_TAG} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - - mountPath: /etc/capv - name: manager-bootstrap-credentials - readOnly: true - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: capv-webhook-service-cert - - name: manager-bootstrap-credentials - secret: - secretName: capv-manager-bootstrap-credentials - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-serving-cert - namespace: capv-system -spec: - dnsNames: - - capv-webhook-service.capv-system.svc - - capv-webhook-service.capv-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capv-selfsigned-issuer - secretName: capv-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-selfsigned-issuer - namespace: capv-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspheredeploymentzone - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspheredeploymentzone.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheredeploymentzones - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspherefailuredomain - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspherefailuredomain.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherefailuredomains - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspheremachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachines - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspherevm - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspherevm.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherevms - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: capv-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vsphereclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vsphereclustertemplate.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vsphereclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspherefailuredomain - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspherefailuredomain.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherefailuredomains - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspheremachine.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachines - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspheremachinetemplate.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachinetemplates - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspherevm - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspherevm.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherevms - sideEffects: None diff --git a/providers/infrastructure-vsphere/v1.5.3/infrastructure-components.yaml b/providers/infrastructure-vsphere/v1.5.3/infrastructure-components.yaml deleted file mode 100644 index c2be71ed66..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/infrastructure-components.yaml +++ /dev/null @@ -1,5566 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vsphereclusteridentities.infrastructure.cluster.x-k8s.io -spec: - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereClusterIdentity - listKind: VSphereClusterIdentityList - plural: vsphereclusteridentities - singular: vsphereclusteridentity - scope: Cluster - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereClusterIdentity defines the account to be used for reconciling clusters - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces are allowed to use this account. Namespaces can be selected with a label selector. If this object is nil, no namespaces will be allowed - properties: - selector: - description: Selector is a standard Kubernetes LabelSelector. A label query over a set of resources. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - type: object - secretName: - description: SecretName references a Secret inside the controller namespace with the credentials to use - minLength: 1 - type: string - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - ready: - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereClusterIdentity defines the account to be used for reconciling clusters - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces are allowed to use this account. Namespaces can be selected with a label selector. If this object is nil, no namespaces will be allowed - properties: - selector: - description: Selector is a standard Kubernetes LabelSelector. A label query over a set of resources. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - type: object - secretName: - description: SecretName references a Secret inside the controller namespace with the credentials to use - minLength: 1 - type: string - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - ready: - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereClusterIdentity defines the account to be used for reconciling clusters - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - allowedNamespaces: - description: AllowedNamespaces is used to identify which namespaces are allowed to use this account. Namespaces can be selected with a label selector. If this object is nil, no namespaces will be allowed - properties: - selector: - description: Selector is a standard Kubernetes LabelSelector. A label query over a set of resources. - properties: - matchExpressions: - description: matchExpressions is a list of label selector requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. - properties: - key: - description: key is the label key that the selector applies to. - type: string - operator: - description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. - type: object - type: object - type: object - secretName: - description: SecretName references a Secret inside the controller namespace with the credentials to use - minLength: 1 - type: string - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - ready: - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vsphereclusters.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereCluster - listKind: VSphereClusterList - plural: vsphereclusters - singular: vspherecluster - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster infrastructure is ready for VSphereMachine - jsonPath: .status.ready - name: Ready - type: string - - description: Server is the address of the vSphere endpoint - jsonPath: .spec.server - name: Server - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint[0] - name: ControlPlaneEndpoint - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereCluster is the Schema for the vsphereclusters API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - cloudProviderConfiguration: - description: 'CloudProviderConfiguration holds the cluster-wide configuration for the DEPRECATED: will be removed in v1alpha4 vSphere cloud provider.' - properties: - disk: - description: Disk is the vSphere cloud provider's disk configuration. - properties: - scsiControllerType: - description: SCSIControllerType defines SCSI controller to be used. - type: string - type: object - global: - description: Global is the vSphere cloud provider's global configuration. - properties: - apiBindPort: - description: APIBindPort configures the vSphere cloud controller manager API port. Defaults to 43001. - type: string - apiDisable: - description: APIDisable disables the vSphere cloud controller manager API. Defaults to true. - type: boolean - caFile: - description: CAFile Specifies the path to a CA certificate in PEM format. If not configured, the system's CA certificates will be used. - type: string - datacenters: - description: Datacenters is a CSV string of the datacenters in which VMs are located. - type: string - insecure: - description: Insecure is a flag that disables TLS peer verification. - type: boolean - password: - description: Password is the password used to access a vSphere endpoint. - type: string - port: - description: Port is the port on which the vSphere endpoint is listening. Defaults to 443. - type: string - roundTripperCount: - description: RoundTripperCount specifies the SOAP round tripper count (retries = RoundTripper - 1) - format: int32 - type: integer - secretName: - description: SecretName is the name of the Kubernetes secret in which the vSphere credentials are located. - type: string - secretNamespace: - description: SecretNamespace is the namespace for SecretName. - type: string - secretsDirectory: - description: 'SecretsDirectory is a directory in which secrets may be found. This may used in the event that: 1. It is not desirable to use the K8s API to watch changes to secrets 2. The cloud controller manager is not running in a K8s environment, such as DC/OS. For example, the container storage interface (CSI) is container orcehstrator (CO) agnostic, and should support non-K8s COs. Defaults to /etc/cloud/credentials.' - type: string - serviceAccount: - description: ServiceAccount is the Kubernetes service account used to launch the cloud controller manager. Defaults to cloud-controller-manager. - type: string - thumbprint: - description: Thumbprint is the cryptographic thumbprint of the vSphere endpoint's certificate. - type: string - username: - description: Username is the username used to access a vSphere endpoint. - type: string - type: object - labels: - description: Labels is the vSphere cloud provider's zone and region configuration. - properties: - region: - description: Region is the region in which VMs are created/located. - type: string - zone: - description: Zone is the zone in which VMs are created/located. - type: string - type: object - network: - description: Network is the vSphere cloud provider's network configuration. - properties: - name: - description: Name is the name of the network to which VMs are connected. - type: string - type: object - providerConfig: - description: CPIProviderConfig contains extra information used to configure the vSphere cloud provider. - properties: - cloud: - properties: - controllerImage: - type: string - extraArgs: - additionalProperties: - type: string - description: ExtraArgs passes through extra arguments to the cloud provider. The arguments here are passed to the cloud provider daemonset specification - type: object - type: object - storage: - properties: - attacherImage: - type: string - controllerImage: - type: string - livenessProbeImage: - type: string - metadataSyncerImage: - type: string - nodeDriverImage: - type: string - provisionerImage: - type: string - registrarImage: - type: string - type: object - type: object - virtualCenter: - additionalProperties: - description: CPIVCenterConfig is a vSphere cloud provider's vCenter configuration. - properties: - datacenters: - description: Datacenters is a CSV string of the datacenters in which VMs are located. - type: string - password: - description: Password is the password used to access a vSphere endpoint. - type: string - port: - description: Port is the port on which the vSphere endpoint is listening. Defaults to 443. - type: string - roundTripperCount: - description: RoundTripperCount specifies the SOAP round tripper count (retries = RoundTripper - 1) - format: int32 - type: integer - thumbprint: - description: Thumbprint is the cryptographic thumbprint of the vSphere endpoint's certificate. - type: string - username: - description: Username is the username used to access a vSphere endpoint. - type: string - type: object - description: VCenter is a list of vCenter configurations. - type: object - workspace: - description: Workspace is the vSphere cloud provider's workspace configuration. - properties: - datacenter: - description: Datacenter is the datacenter in which VMs are created/located. - type: string - datastore: - description: Datastore is the datastore in which VMs are created/located. - type: string - folder: - description: Folder is the folder in which VMs are created/located. - type: string - resourcePool: - description: ResourcePool is the resource pool in which VMs are created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere endpoint. - type: string - type: object - type: object - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to either a Secret or VSphereClusterIdentity that contains the identity to use when reconciling the cluster. - properties: - kind: - description: Kind of the identity. Can either be VSphereClusterIdentity or Secret - enum: - - VSphereClusterIdentity - - Secret - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - insecure: - description: 'Insecure is a flag that controls whether or not to validate the vSphere server''s certificate. DEPRECATED: will be removed in v1alpha4' - type: boolean - loadBalancerRef: - description: 'LoadBalancerRef may be used to enable a control plane load balancer for this cluster. When a LoadBalancerRef is provided, the VSphereCluster.Status.Ready field will not be true until the referenced resource is Status.Ready and has a non-empty Status.Address value. DEPRECATED: will be removed in v1alpha4' - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate When provided, Insecure should not be set to true - type: string - type: object - status: - description: VSphereClusterStatus defines the observed state of VSphereClusterSpec - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a list of failure domain objects synced from the infrastructure provider. - type: object - ready: - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster infrastructure is ready for VSphereMachine - jsonPath: .status.ready - name: Ready - type: string - - description: Server is the address of the vSphere endpoint - jsonPath: .spec.server - name: Server - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint[0] - name: ControlPlaneEndpoint - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereCluster is the Schema for the vsphereclusters API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to either a Secret or VSphereClusterIdentity that contains the identity to use when reconciling the cluster. - properties: - kind: - description: Kind of the identity. Can either be VSphereClusterIdentity or Secret - enum: - - VSphereClusterIdentity - - Secret - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate - type: string - type: object - status: - description: VSphereClusterStatus defines the observed state of VSphereClusterSpec - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a list of failure domain objects synced from the infrastructure provider. - type: object - ready: - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster infrastructure is ready for VSphereMachine - jsonPath: .status.ready - name: Ready - type: string - - description: Server is the address of the vSphere endpoint. - jsonPath: .spec.server - name: Server - type: string - - description: API Endpoint - jsonPath: .spec.controlPlaneEndpoint[0] - name: ControlPlaneEndpoint - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereCluster is the Schema for the vsphereclusters API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - clusterModules: - description: ClusterModules hosts information regarding the anti-affinity vSphere constructs for each of the objects responsible for creation of VM objects belonging to the cluster. - items: - description: ClusterModule holds the anti affinity construct `ClusterModule` identifier in use by the VMs owned by the object referred by the TargetObjectName field. - properties: - controlPlane: - description: ControlPlane indicates whether the referred object is responsible for control plane nodes. Currently, only the KubeadmControlPlane objects have this flag set to true. Only a single object in the slice can have this value set to true. - type: boolean - moduleUUID: - description: ModuleUUID is the unique identifier of the `ClusterModule` used by the object. - type: string - targetObjectName: - description: TargetObjectName points to the object that uses the Cluster Module information to enforce anti-affinity amongst its descendant VM objects. - type: string - required: - - controlPlane - - moduleUUID - - targetObjectName - type: object - type: array - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to either a Secret or VSphereClusterIdentity that contains the identity to use when reconciling the cluster. - properties: - kind: - description: Kind of the identity. Can either be VSphereClusterIdentity or Secret - enum: - - VSphereClusterIdentity - - Secret - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate - type: string - type: object - status: - description: VSphereClusterStatus defines the observed state of VSphereClusterSpec - properties: - conditions: - description: Conditions defines current service state of the VSphereCluster. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureDomains: - additionalProperties: - description: FailureDomainSpec is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. - properties: - attributes: - additionalProperties: - type: string - description: Attributes is a free form map of attributes an infrastructure provider might use or require. - type: object - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - type: object - description: FailureDomains is a list of failure domain objects synced from the infrastructure provider. - type: object - ready: - type: boolean - vCenterVersion: - description: VCenterVersion defines the version of the vCenter server defined in the spec. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vsphereclustertemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereClusterTemplate - listKind: VSphereClusterTemplateList - plural: vsphereclustertemplates - singular: vsphereclustertemplate - scope: Namespaced - versions: - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereClusterTemplate is the Schema for the vsphereclustertemplates API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterTemplateSpec defines the desired state of VSphereClusterTemplate - properties: - template: - properties: - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to either a Secret or VSphereClusterIdentity that contains the identity to use when reconciling the cluster. - properties: - kind: - description: Kind of the identity. Can either be VSphereClusterIdentity or Secret - enum: - - VSphereClusterIdentity - - Secret - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereClusterTemplate is the Schema for the vsphereclustertemplates API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereClusterTemplateSpec defines the desired state of VSphereClusterTemplate - properties: - template: - properties: - spec: - description: VSphereClusterSpec defines the desired state of VSphereCluster - properties: - clusterModules: - description: ClusterModules hosts information regarding the anti-affinity vSphere constructs for each of the objects responsible for creation of VM objects belonging to the cluster. - items: - description: ClusterModule holds the anti affinity construct `ClusterModule` identifier in use by the VMs owned by the object referred by the TargetObjectName field. - properties: - controlPlane: - description: ControlPlane indicates whether the referred object is responsible for control plane nodes. Currently, only the KubeadmControlPlane objects have this flag set to true. Only a single object in the slice can have this value set to true. - type: boolean - moduleUUID: - description: ModuleUUID is the unique identifier of the `ClusterModule` used by the object. - type: string - targetObjectName: - description: TargetObjectName points to the object that uses the Cluster Module information to enforce anti-affinity amongst its descendant VM objects. - type: string - required: - - controlPlane - - moduleUUID - - targetObjectName - type: object - type: array - controlPlaneEndpoint: - description: ControlPlaneEndpoint represents the endpoint used to communicate with the control plane. - properties: - host: - description: The hostname on which the API server is serving. - type: string - port: - description: The port on which the API server is serving. - format: int32 - type: integer - required: - - host - - port - type: object - identityRef: - description: IdentityRef is a reference to either a Secret or VSphereClusterIdentity that contains the identity to use when reconciling the cluster. - properties: - kind: - description: Kind of the identity. Can either be VSphereClusterIdentity or Secret - enum: - - VSphereClusterIdentity - - Secret - type: string - name: - description: Name of the identity. - minLength: 1 - type: string - required: - - kind - - name - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate - type: string - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspheredeploymentzones.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereDeploymentZone - listKind: VSphereDeploymentZoneList - plural: vspheredeploymentzones - singular: vspheredeploymentzone - scope: Cluster - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereDeploymentZone is the Schema for the vspheredeploymentzones API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereDeploymentZoneSpec defines the desired state of VSphereDeploymentZone - properties: - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - failureDomain: - description: failureDomain is the name of the VSphereFailureDomain used for this VSphereDeploymentZone - type: string - placementConstraint: - description: PlacementConstraint encapsulates the placement constraints used within this deployment zone. - properties: - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - required: - - placementConstraint - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - ready: - description: Ready is true when the VSphereDeploymentZone resource is ready. If set to false, it will be ignored by VSphereClusters - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereDeploymentZone is the Schema for the vspheredeploymentzones API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereDeploymentZoneSpec defines the desired state of VSphereDeploymentZone - properties: - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - failureDomain: - description: FailureDomain is the name of the VSphereFailureDomain used for this VSphereDeploymentZone - type: string - placementConstraint: - description: PlacementConstraint encapsulates the placement constraints used within this deployment zone. - properties: - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - required: - - placementConstraint - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - ready: - description: Ready is true when the VSphereDeploymentZone resource is ready. If set to false, it will be ignored by VSphereClusters - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereDeploymentZone is the Schema for the vspheredeploymentzones API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereDeploymentZoneSpec defines the desired state of VSphereDeploymentZone - properties: - controlPlane: - description: ControlPlane determines if this failure domain is suitable for use by control plane machines. - type: boolean - failureDomain: - description: FailureDomain is the name of the VSphereFailureDomain used for this VSphereDeploymentZone - type: string - placementConstraint: - description: PlacementConstraint encapsulates the placement constraints used within this deployment zone. - properties: - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - type: object - server: - description: Server is the address of the vSphere endpoint. - type: string - required: - - placementConstraint - type: object - status: - properties: - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - ready: - description: Ready is true when the VSphereDeploymentZone resource is ready. If set to false, it will be ignored by VSphereClusters - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspherefailuredomains.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereFailureDomain - listKind: VSphereFailureDomainList - plural: vspherefailuredomains - singular: vspherefailuredomain - scope: Cluster - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereFailureDomain is the Schema for the vspherefailuredomains API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereFailureDomainSpec defines the desired state of VSphereFailureDomain - properties: - region: - description: Region defines the name and type of a region - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in the Topology - type: boolean - name: - description: Name is the name of the tag that represents this failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - topology: - description: Topology is the what describes a given failure domain using vSphere constructs - properties: - computeCluster: - description: ComputeCluster as the failure domain - type: string - datacenter: - description: The underlying infrastructure for this failure domain Datacenter as the failure domain - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - hosts: - description: Hosts has information required for placement of machines on VSphere hosts. - properties: - hostGroupName: - description: HostGroupName is the name of the Host group - type: string - vmGroupName: - description: VMGroupName is the name of the VM group - type: string - required: - - hostGroupName - - vmGroupName - type: object - networks: - description: Networks is the list of networks within this failure domain - items: - type: string - type: array - required: - - datacenter - type: object - zone: - description: Zone defines the name and type of a zone - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in the Topology - type: boolean - name: - description: Name is the name of the tag that represents this failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - required: - - region - - topology - - zone - type: object - type: object - served: true - storage: false - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereFailureDomain is the Schema for the vspherefailuredomains API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereFailureDomainSpec defines the desired state of VSphereFailureDomain - properties: - region: - description: Region defines the name and type of a region - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in the Topology - type: boolean - name: - description: Name is the name of the tag that represents this failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - topology: - description: Topology describes a given failure domain using vSphere constructs - properties: - computeCluster: - description: ComputeCluster as the failure domain - type: string - datacenter: - description: The underlying infrastructure for this failure domain Datacenter as the failure domain - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - hosts: - description: Hosts has information required for placement of machines on VSphere hosts. - properties: - hostGroupName: - description: HostGroupName is the name of the Host group - type: string - vmGroupName: - description: VMGroupName is the name of the VM group - type: string - required: - - hostGroupName - - vmGroupName - type: object - networks: - description: Networks is the list of networks within this failure domain - items: - type: string - type: array - required: - - datacenter - type: object - zone: - description: Zone defines the name and type of a zone - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in the Topology - type: boolean - name: - description: Name is the name of the tag that represents this failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - required: - - region - - topology - - zone - type: object - type: object - served: true - storage: false - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereFailureDomain is the Schema for the vspherefailuredomains API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereFailureDomainSpec defines the desired state of VSphereFailureDomain - properties: - region: - description: Region defines the name and type of a region - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in the Topology - type: boolean - name: - description: Name is the name of the tag that represents this failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - topology: - description: Topology describes a given failure domain using vSphere constructs - properties: - computeCluster: - description: ComputeCluster as the failure domain - type: string - datacenter: - description: Datacenter as the failure domain. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - hosts: - description: Hosts has information required for placement of machines on VSphere hosts. - properties: - hostGroupName: - description: HostGroupName is the name of the Host group - type: string - vmGroupName: - description: VMGroupName is the name of the VM group - type: string - required: - - hostGroupName - - vmGroupName - type: object - networks: - description: Networks is the list of networks within this failure domain - items: - type: string - type: array - required: - - datacenter - type: object - zone: - description: Zone defines the name and type of a zone - properties: - autoConfigure: - description: AutoConfigure tags the Type which is specified in the Topology - type: boolean - name: - description: Name is the name of the tag that represents this failure domain - type: string - tagCategory: - description: TagCategory is the category used for the tag - type: string - type: - description: Type is the type of failure domain, the current values are "Datacenter", "ComputeCluster" and "HostGroup" - enum: - - Datacenter - - ComputeCluster - - HostGroup - type: string - required: - - name - - tagCategory - - type - type: object - required: - - region - - topology - - zone - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspheremachines.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereMachine - listKind: VSphereMachineList - plural: vspheremachines - singular: vspheremachine - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Cluster to which this VSphereMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: VSphereMachine instance ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine object which owns this VSphereMachine - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereMachine is the Schema for the vspheremachines API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineSpec defines the desired state of VSphereMachine - properties: - cloneMode: - description: CloneMode specifies the type of clone operation. The LinkedClone mode is only support for templates that have at least one snapshot. If the template has no snapshots, then CloneMode defaults to FullClone. When LinkedClone mode is enabled the DiskGiB field is ignored as it is not possible to expand disks of linked clones. Defaults to LinkedClone, but fails gracefully to FullClone if the source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. For this infrastructure provider, the name is equivalent to the name of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, in MiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's VM. - properties: - devices: - description: Devices is the list of network devices used by the virtual machine. TODO(akutz) Make sure at least one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly assign a name to the network device as it exists in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not to use DHCP for IPv4 on this device. If true then IPAddrs should not contain any IPv4 addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether or not to use DHCP for IPv6 on this device. If true then IPAddrs should not contain any IPv6 addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or IPv6 addresses to assign to this device. Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. It is generally a good idea to omit this field and allow a MAC address to be generated. Please note that this value must use the VMware OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses used as DNS nameservers. Please note that Linux allows only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes applied to the device. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute CPUs in this virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create a linked clone. This field is ignored if LinkedClone is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this Virtual Machine - type: string - template: - description: Template is the name or inventory path of the template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate When this is set to empty, this VirtualMachine would be created without TLS certificate validation of the communication between Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereMachineStatus defines the observed state of VSphereMachine - properties: - addresses: - description: Addresses contains the VSphere instance associated addresses. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - network: - description: Network returns the network status for each of the machine's configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's networks. - properties: - connected: - description: Connected is a flag that indicates whether this network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this VSphereMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: VSphereMachine instance ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine object which owns this VSphereMachine - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereMachine is the Schema for the vspheremachines API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineSpec defines the desired state of VSphereMachine - properties: - cloneMode: - description: CloneMode specifies the type of clone operation. The LinkedClone mode is only support for templates that have at least one snapshot. If the template has no snapshots, then CloneMode defaults to FullClone. When LinkedClone mode is enabled the DiskGiB field is ignored as it is not possible to expand disks of linked clones. Defaults to LinkedClone, but fails gracefully to FullClone if the source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. For this infrastructure provider, the name is equivalent to the name of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, in MiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's VM. - properties: - devices: - description: Devices is the list of network devices used by the virtual machine. TODO(akutz) Make sure at least one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly assign a name to the network device as it exists in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not to use DHCP for IPv4 on this device. If true then IPAddrs should not contain any IPv4 addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether or not to use DHCP for IPv6 on this device. If true then IPAddrs should not contain any IPv6 addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or IPv6 addresses to assign to this device. Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. It is generally a good idea to omit this field and allow a MAC address to be generated. Please note that this value must use the VMware OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses used as DNS nameservers. Please note that Linux allows only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes applied to the device. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute CPUs in this virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create a linked clone. This field is ignored if LinkedClone is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this Virtual Machine - type: string - template: - description: Template is the name or inventory path of the template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate When this is set to empty, this VirtualMachine would be created without TLS certificate validation of the communication between Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereMachineStatus defines the observed state of VSphereMachine - properties: - addresses: - description: Addresses contains the VSphere instance associated addresses. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - network: - description: Network returns the network status for each of the machine's configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's networks. - properties: - connected: - description: Connected is a flag that indicates whether this network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: false - subresources: - status: {} - - additionalPrinterColumns: - - description: Cluster to which this VSphereMachine belongs - jsonPath: .metadata.labels.cluster\.x-k8s\.io/cluster-name - name: Cluster - type: string - - description: Machine ready status - jsonPath: .status.ready - name: Ready - type: string - - description: VSphereMachine instance ID - jsonPath: .spec.providerID - name: ProviderID - type: string - - description: Machine object which owns with this VSphereMachine - jsonPath: .metadata.ownerReferences[?(@.kind=="Machine")].name - name: Machine - priority: 1 - type: string - - description: Time duration since creation of Machine - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereMachine is the Schema for the vspheremachines API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineSpec defines the desired state of VSphereMachine - properties: - additionalDisksGiB: - description: AdditionalDisksGiB holds the sizes of additional disks of the virtual machine, in GiB Defaults to the eponymous property value in the template from which the virtual machine is cloned. - items: - format: int32 - type: integer - type: array - cloneMode: - description: CloneMode specifies the type of clone operation. The LinkedClone mode is only support for templates that have at least one snapshot. If the template has no snapshots, then CloneMode defaults to FullClone. When LinkedClone mode is enabled the DiskGiB field is ignored as it is not possible to expand disks of linked clones. Defaults to LinkedClone, but fails gracefully to FullClone if the source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter in which the virtual machine is created/located. Defaults to * which selects the default datacenter. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. For this infrastructure provider, the name is equivalent to the name of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - hardwareVersion: - description: HardwareVersion is the hardware version of the virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. Check the compatibility with the ESXi version before setting the value. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, in MiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's VM. - properties: - devices: - description: Devices is the list of network devices used by the virtual machine. TODO(akutz) Make sure at least one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration for a virtual machine's network device. - properties: - addressesFromPools: - description: AddressesFromPools is a list of IPAddressPools that should be assigned to IPAddressClaims. The machine's cloud-init metadata will be populated with IPAddresses fulfilled by an IPAM provider. - items: - description: TypedLocalObjectReference contains enough information to let you locate the typed referenced object inside the same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - type: array - deviceName: - description: DeviceName may be used to explicitly assign a name to the network device as it exists in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not to use DHCP for IPv4 on this device. If true then IPAddrs should not contain any IPv4 addresses. - type: boolean - dhcp4Overrides: - description: DHCP4Overrides allows for the control over several DHCP behaviors. Overrides will only be applied when the corresponding DHCP flag is set. Only configured values will be sent, omitted values will default to distribution defaults. Dependent on support in the network stack for your distribution. For more information see the netplan reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will be sent to the DHCP server instead of the machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize routes for devices. A lower metric for an interface will have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers in the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values `true`, `false`, or `route`. When `true`, the domain name from the DHCP server will be used as the DNS search domain for this device. When `route`, the domain name from the DHCP response will be used for routing DNS only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname from the DHCP server will be set as the transient hostname of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from the DHCP server will be set as the MTU of the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers from the DHCP server will be used by systemd-timesyncd and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes from the DHCP server will be installed in the routing table. - type: string - type: object - dhcp6: - description: DHCP6 is a flag that indicates whether or not to use DHCP for IPv6 on this device. If true then IPAddrs should not contain any IPv6 addresses. - type: boolean - dhcp6Overrides: - description: DHCP6Overrides allows for the control over several DHCP behaviors. Overrides will only be applied when the corresponding DHCP flag is set. Only configured values will be sent, omitted values will default to distribution defaults. Dependent on support in the network stack for your distribution. For more information see the netplan reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will be sent to the DHCP server instead of the machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize routes for devices. A lower metric for an interface will have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers in the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values `true`, `false`, or `route`. When `true`, the domain name from the DHCP server will be used as the DNS search domain for this device. When `route`, the domain name from the DHCP response will be used for routing DNS only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname from the DHCP server will be set as the transient hostname of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from the DHCP server will be set as the MTU of the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers from the DHCP server will be used by systemd-timesyncd and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes from the DHCP server will be installed in the routing table. - type: string - type: object - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or IPv6 addresses to assign to this device. Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. It is generally a good idea to omit this field and allow a MAC address to be generated. Please note that this value must use the VMware OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses used as DNS nameservers. Please note that Linux allows only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes applied to the device. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute CPUs in this virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - os: - description: OS is the Operating System of the virtual machine Defaults to Linux - type: string - pciDevices: - description: PciDevices is the list of pci devices used by the virtual machine. - items: - description: PCIDeviceSpec defines virtual machine's PCI configuration - properties: - deviceId: - description: DeviceID is the device ID of a virtual machine's PCI, in integer. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - vendorId: - description: VendorId is the vendor ID of a virtual machine's PCI, in integer. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - type: object - type: array - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create a linked clone. This field is ignored if LinkedClone is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this Virtual Machine - type: string - tagIDs: - description: TagIDs is an optional set of tags to add to an instance. Specified tagIDs must use URN-notation instead of display names. - items: - type: string - type: array - template: - description: Template is the name or inventory path of the template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate When this is set to empty, this VirtualMachine would be created without TLS certificate validation of the communication between Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereMachineStatus defines the observed state of VSphereMachine - properties: - addresses: - description: Addresses contains the VSphere instance associated addresses. - items: - description: MachineAddress contains information for the node's address. - properties: - address: - description: The machine address. - type: string - type: - description: Machine address type, one of Hostname, ExternalIP or InternalIP. - type: string - required: - - address - - type - type: object - type: array - conditions: - description: Conditions defines current service state of the VSphereMachine. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the Machine and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the Machine and will contain a succinct value suitable for machine interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the Machine's spec or the configuration of the controller, and that manual intervention is required. Examples of terminal errors would be invalid combinations of settings in the spec, values that are unsupported by the controller, or the responsible controller itself being critically misconfigured. \n Any transient errors that occur during the reconciliation of Machines can be added as events to the Machine object and/or logged in the controller's output." - type: string - network: - description: Network returns the network status for each of the machine's configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's networks. - properties: - connected: - description: Connected is a flag that indicates whether this network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. - type: boolean - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspheremachinetemplates.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - categories: - - cluster-api - kind: VSphereMachineTemplate - listKind: VSphereMachineTemplateList - plural: vspheremachinetemplates - singular: vspheremachinetemplate - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereMachineTemplate is the Schema for the vspheremachinetemplates API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineTemplateSpec defines the desired state of VSphereMachineTemplate - properties: - template: - description: VSphereMachineTemplateResource describes the data needed to create a VSphereMachine from a template - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - generateName: - description: "GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server. \n If this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header). \n Applied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - name: - description: "Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - namespace: - description: "Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty. \n Must be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces \n Deprecated: This field has no function and is going to be removed in a next release." - type: string - ownerReferences: - description: "List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller. \n Deprecated: This field has no function and is going to be removed in a next release." - items: - description: OwnerReference contains enough information to let you identify an owning object. An owning object must be in the same namespace as the dependent, or be cluster-scoped, so there is no namespace field. - properties: - apiVersion: - description: API version of the referent. - type: string - blockOwnerDeletion: - description: If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. See https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion for how the garbage collector interacts with this field and enforces the foreground deletion. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned. - type: boolean - controller: - description: If true, this reference points to the managing controller. - type: boolean - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names' - type: string - uid: - description: 'UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids' - type: string - required: - - apiVersion - - kind - - name - - uid - type: object - type: array - type: object - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - cloneMode: - description: CloneMode specifies the type of clone operation. The LinkedClone mode is only support for templates that have at least one snapshot. If the template has no snapshots, then CloneMode defaults to FullClone. When LinkedClone mode is enabled the DiskGiB field is ignored as it is not possible to expand disks of linked clones. Defaults to LinkedClone, but fails gracefully to FullClone if the source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. For this infrastructure provider, the name is equivalent to the name of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, in MiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's VM. - properties: - devices: - description: Devices is the list of network devices used by the virtual machine. TODO(akutz) Make sure at least one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly assign a name to the network device as it exists in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not to use DHCP for IPv4 on this device. If true then IPAddrs should not contain any IPv4 addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether or not to use DHCP for IPv6 on this device. If true then IPAddrs should not contain any IPv6 addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or IPv6 addresses to assign to this device. Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. It is generally a good idea to omit this field and allow a MAC address to be generated. Please note that this value must use the VMware OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses used as DNS nameservers. Please note that Linux allows only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes applied to the device. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute CPUs in this virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create a linked clone. This field is ignored if LinkedClone is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this Virtual Machine - type: string - template: - description: Template is the name or inventory path of the template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate When this is set to empty, this VirtualMachine would be created without TLS certificate validation of the communication between Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereMachineTemplate is the Schema for the vspheremachinetemplates API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineTemplateSpec defines the desired state of VSphereMachineTemplate - properties: - template: - description: VSphereMachineTemplateResource describes the data needed to create a VSphereMachine from a template - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - cloneMode: - description: CloneMode specifies the type of clone operation. The LinkedClone mode is only support for templates that have at least one snapshot. If the template has no snapshots, then CloneMode defaults to FullClone. When LinkedClone mode is enabled the DiskGiB field is ignored as it is not possible to expand disks of linked clones. Defaults to LinkedClone, but fails gracefully to FullClone if the source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. For this infrastructure provider, the name is equivalent to the name of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, in MiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's VM. - properties: - devices: - description: Devices is the list of network devices used by the virtual machine. TODO(akutz) Make sure at least one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly assign a name to the network device as it exists in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not to use DHCP for IPv4 on this device. If true then IPAddrs should not contain any IPv4 addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether or not to use DHCP for IPv6 on this device. If true then IPAddrs should not contain any IPv6 addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or IPv6 addresses to assign to this device. Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. It is generally a good idea to omit this field and allow a MAC address to be generated. Please note that this value must use the VMware OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses used as DNS nameservers. Please note that Linux allows only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes applied to the device. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute CPUs in this virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create a linked clone. This field is ignored if LinkedClone is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this Virtual Machine - type: string - template: - description: Template is the name or inventory path of the template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate When this is set to empty, this VirtualMachine would be created without TLS certificate validation of the communication between Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: false - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereMachineTemplate is the Schema for the vspheremachinetemplates API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereMachineTemplateSpec defines the desired state of VSphereMachineTemplate - properties: - template: - description: VSphereMachineTemplateResource describes the data needed to create a VSphereMachine from a template - properties: - metadata: - description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object - spec: - description: Spec is the specification of the desired behavior of the machine. - properties: - additionalDisksGiB: - description: AdditionalDisksGiB holds the sizes of additional disks of the virtual machine, in GiB Defaults to the eponymous property value in the template from which the virtual machine is cloned. - items: - format: int32 - type: integer - type: array - cloneMode: - description: CloneMode specifies the type of clone operation. The LinkedClone mode is only support for templates that have at least one snapshot. If the template has no snapshots, then CloneMode defaults to FullClone. When LinkedClone mode is enabled the DiskGiB field is ignored as it is not possible to expand disks of linked clones. Defaults to LinkedClone, but fails gracefully to FullClone if the source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter in which the virtual machine is created/located. Defaults to * which selects the default datacenter. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - failureDomain: - description: FailureDomain is the failure domain unique identifier this Machine should be attached to, as defined in Cluster API. For this infrastructure provider, the name is equivalent to the name of the VSphereDeploymentZone. - type: string - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - hardwareVersion: - description: HardwareVersion is the hardware version of the virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. Check the compatibility with the ESXi version before setting the value. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, in MiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's VM. - properties: - devices: - description: Devices is the list of network devices used by the virtual machine. TODO(akutz) Make sure at least one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration for a virtual machine's network device. - properties: - addressesFromPools: - description: AddressesFromPools is a list of IPAddressPools that should be assigned to IPAddressClaims. The machine's cloud-init metadata will be populated with IPAddresses fulfilled by an IPAM provider. - items: - description: TypedLocalObjectReference contains enough information to let you locate the typed referenced object inside the same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - type: array - deviceName: - description: DeviceName may be used to explicitly assign a name to the network device as it exists in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not to use DHCP for IPv4 on this device. If true then IPAddrs should not contain any IPv4 addresses. - type: boolean - dhcp4Overrides: - description: DHCP4Overrides allows for the control over several DHCP behaviors. Overrides will only be applied when the corresponding DHCP flag is set. Only configured values will be sent, omitted values will default to distribution defaults. Dependent on support in the network stack for your distribution. For more information see the netplan reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will be sent to the DHCP server instead of the machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize routes for devices. A lower metric for an interface will have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers in the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values `true`, `false`, or `route`. When `true`, the domain name from the DHCP server will be used as the DNS search domain for this device. When `route`, the domain name from the DHCP response will be used for routing DNS only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname from the DHCP server will be set as the transient hostname of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from the DHCP server will be set as the MTU of the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers from the DHCP server will be used by systemd-timesyncd and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes from the DHCP server will be installed in the routing table. - type: string - type: object - dhcp6: - description: DHCP6 is a flag that indicates whether or not to use DHCP for IPv6 on this device. If true then IPAddrs should not contain any IPv6 addresses. - type: boolean - dhcp6Overrides: - description: DHCP6Overrides allows for the control over several DHCP behaviors. Overrides will only be applied when the corresponding DHCP flag is set. Only configured values will be sent, omitted values will default to distribution defaults. Dependent on support in the network stack for your distribution. For more information see the netplan reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will be sent to the DHCP server instead of the machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize routes for devices. A lower metric for an interface will have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers in the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values `true`, `false`, or `route`. When `true`, the domain name from the DHCP server will be used as the DNS search domain for this device. When `route`, the domain name from the DHCP response will be used for routing DNS only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname from the DHCP server will be set as the transient hostname of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from the DHCP server will be set as the MTU of the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers from the DHCP server will be used by systemd-timesyncd and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes from the DHCP server will be installed in the routing table. - type: string - type: object - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or IPv6 addresses to assign to this device. Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. It is generally a good idea to omit this field and allow a MAC address to be generated. Please note that this value must use the VMware OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses used as DNS nameservers. Please note that Linux allows only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes applied to the device. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute CPUs in this virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - os: - description: OS is the Operating System of the virtual machine Defaults to Linux - type: string - pciDevices: - description: PciDevices is the list of pci devices used by the virtual machine. - items: - description: PCIDeviceSpec defines virtual machine's PCI configuration - properties: - deviceId: - description: DeviceID is the device ID of a virtual machine's PCI, in integer. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - vendorId: - description: VendorId is the vendor ID of a virtual machine's PCI, in integer. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - type: object - type: array - providerID: - description: ProviderID is the virtual machine's BIOS UUID formated as vsphere://12345678-1234-1234-1234-123456789abc - type: string - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create a linked clone. This field is ignored if LinkedClone is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this Virtual Machine - type: string - tagIDs: - description: TagIDs is an optional set of tags to add to an instance. Specified tagIDs must use URN-notation instead of display names. - items: - type: string - type: array - template: - description: Template is the name or inventory path of the template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate When this is set to empty, this VirtualMachine would be created without TLS certificate validation of the communication between Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - required: - - spec - type: object - required: - - template - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - controller-gen.kubebuilder.io/version: v0.7.0 - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - cluster.x-k8s.io/v1beta1: v1beta1 - name: vspherevms.infrastructure.cluster.x-k8s.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - caBundle: Cg== - service: - name: capv-webhook-service - namespace: capv-system - path: /convert - conversionReviewVersions: - - v1 - - v1beta1 - group: infrastructure.cluster.x-k8s.io - names: - kind: VSphereVM - listKind: VSphereVMList - plural: vspherevms - singular: vspherevm - scope: Namespaced - versions: - - name: v1alpha3 - schema: - openAPIV3Schema: - description: VSphereVM is the Schema for the vspherevms API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereVMSpec defines the desired state of VSphereVM. - properties: - biosUUID: - description: BiosUUID is the the VM's BIOS UUID that is assigned at runtime after the VM has been created. This field is required at runtime for other controllers that read this CRD as unstructured data. - type: string - bootstrapRef: - description: BootstrapRef is a reference to a bootstrap provider-specific resource that holds configuration details. This field is optional in case no bootstrap data is required to create a VM. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - cloneMode: - description: CloneMode specifies the type of clone operation. The LinkedClone mode is only support for templates that have at least one snapshot. If the template has no snapshots, then CloneMode defaults to FullClone. When LinkedClone mode is enabled the DiskGiB field is ignored as it is not possible to expand disks of linked clones. Defaults to LinkedClone, but fails gracefully to FullClone if the source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, in MiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's VM. - properties: - devices: - description: Devices is the list of network devices used by the virtual machine. TODO(akutz) Make sure at least one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly assign a name to the network device as it exists in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not to use DHCP for IPv4 on this device. If true then IPAddrs should not contain any IPv4 addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether or not to use DHCP for IPv6 on this device. If true then IPAddrs should not contain any IPv6 addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or IPv6 addresses to assign to this device. Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. It is generally a good idea to omit this field and allow a MAC address to be generated. Please note that this value must use the VMware OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses used as DNS nameservers. Please note that Linux allows only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes applied to the device. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute CPUs in this virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create a linked clone. This field is ignored if LinkedClone is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this Virtual Machine - type: string - template: - description: Template is the name or inventory path of the template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate When this is set to empty, this VirtualMachine would be created without TLS certificate validation of the communication between Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereVMStatus defines the observed state of VSphereVM - properties: - addresses: - description: Addresses is a list of the VM's IP addresses. This field is required at runtime for other controllers that read this CRD as unstructured data. - items: - type: string - type: array - cloneMode: - description: CloneMode is the type of clone operation used to clone this VM. Since LinkedMode is the default but fails gracefully if the source of the clone has no snapshots, this field may be used to determine the actual type of clone operation used to create this VM. - type: string - conditions: - description: Conditions defines current service state of the VSphereVM. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the vspherevm and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the vm. \n Any transient errors that occur during the reconciliation of vspherevms can be added as events to the vspherevm object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the vspherevm and will contain a succinct value suitable for vm interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the vm. \n Any transient errors that occur during the reconciliation of vspherevms can be added as events to the vspherevm object and/or logged in the controller's output." - type: string - network: - description: Network returns the network status for each of the machine's configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's networks. - properties: - connected: - description: Connected is a flag that indicates whether this network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. This field is required at runtime for other controllers that read this CRD as unstructured data. - type: boolean - retryAfter: - description: RetryAfter tracks the time we can retry queueing a task - format: date-time - type: string - snapshot: - description: Snapshot is the name of the snapshot from which the VM was cloned if LinkedMode is enabled. - type: string - taskRef: - description: TaskRef is a managed object reference to a Task related to the machine. This value is set automatically at runtime and should not be set or modified by users. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1alpha4 - schema: - openAPIV3Schema: - description: VSphereVM is the Schema for the vspherevms API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereVMSpec defines the desired state of VSphereVM. - properties: - biosUUID: - description: BiosUUID is the the VM's BIOS UUID that is assigned at runtime after the VM has been created. This field is required at runtime for other controllers that read this CRD as unstructured data. - type: string - bootstrapRef: - description: BootstrapRef is a reference to a bootstrap provider-specific resource that holds configuration details. This field is optional in case no bootstrap data is required to create a VM. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - cloneMode: - description: CloneMode specifies the type of clone operation. The LinkedClone mode is only support for templates that have at least one snapshot. If the template has no snapshots, then CloneMode defaults to FullClone. When LinkedClone mode is enabled the DiskGiB field is ignored as it is not possible to expand disks of linked clones. Defaults to LinkedClone, but fails gracefully to FullClone if the source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter in which the virtual machine is created/located. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, in MiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's VM. - properties: - devices: - description: Devices is the list of network devices used by the virtual machine. TODO(akutz) Make sure at least one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration for a virtual machine's network device. - properties: - deviceName: - description: DeviceName may be used to explicitly assign a name to the network device as it exists in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not to use DHCP for IPv4 on this device. If true then IPAddrs should not contain any IPv4 addresses. - type: boolean - dhcp6: - description: DHCP6 is a flag that indicates whether or not to use DHCP for IPv6 on this device. If true then IPAddrs should not contain any IPv6 addresses. - type: boolean - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or IPv6 addresses to assign to this device. Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. It is generally a good idea to omit this field and allow a MAC address to be generated. Please note that this value must use the VMware OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses used as DNS nameservers. Please note that Linux allows only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes applied to the device. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute CPUs in this virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create a linked clone. This field is ignored if LinkedClone is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this Virtual Machine - type: string - template: - description: Template is the name or inventory path of the template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate When this is set to empty, this VirtualMachine would be created without TLS certificate validation of the communication between Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereVMStatus defines the observed state of VSphereVM - properties: - addresses: - description: Addresses is a list of the VM's IP addresses. This field is required at runtime for other controllers that read this CRD as unstructured data. - items: - type: string - type: array - cloneMode: - description: CloneMode is the type of clone operation used to clone this VM. Since LinkedMode is the default but fails gracefully if the source of the clone has no snapshots, this field may be used to determine the actual type of clone operation used to create this VM. - type: string - conditions: - description: Conditions defines current service state of the VSphereVM. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the vspherevm and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the vm. \n Any transient errors that occur during the reconciliation of vspherevms can be added as events to the vspherevm object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the vspherevm and will contain a succinct value suitable for vm interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the vm. \n Any transient errors that occur during the reconciliation of vspherevms can be added as events to the vspherevm object and/or logged in the controller's output." - type: string - network: - description: Network returns the network status for each of the machine's configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's networks. - properties: - connected: - description: Connected is a flag that indicates whether this network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. This field is required at runtime for other controllers that read this CRD as unstructured data. - type: boolean - retryAfter: - description: RetryAfter tracks the time we can retry queueing a task - format: date-time - type: string - snapshot: - description: Snapshot is the name of the snapshot from which the VM was cloned if LinkedMode is enabled. - type: string - taskRef: - description: TaskRef is a managed object reference to a Task related to the machine. This value is set automatically at runtime and should not be set or modified by users. - type: string - type: object - type: object - served: true - storage: false - subresources: - status: {} - - name: v1beta1 - schema: - openAPIV3Schema: - description: VSphereVM is the Schema for the vspherevms API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: VSphereVMSpec defines the desired state of VSphereVM. - properties: - additionalDisksGiB: - description: AdditionalDisksGiB holds the sizes of additional disks of the virtual machine, in GiB Defaults to the eponymous property value in the template from which the virtual machine is cloned. - items: - format: int32 - type: integer - type: array - biosUUID: - description: BiosUUID is the the VM's BIOS UUID that is assigned at runtime after the VM has been created. This field is required at runtime for other controllers that read this CRD as unstructured data. - type: string - bootstrapRef: - description: BootstrapRef is a reference to a bootstrap provider-specific resource that holds configuration details. This field is optional in case no bootstrap data is required to create a VM. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - cloneMode: - description: CloneMode specifies the type of clone operation. The LinkedClone mode is only support for templates that have at least one snapshot. If the template has no snapshots, then CloneMode defaults to FullClone. When LinkedClone mode is enabled the DiskGiB field is ignored as it is not possible to expand disks of linked clones. Defaults to LinkedClone, but fails gracefully to FullClone if the source of the clone operation has no snapshots. - type: string - customVMXKeys: - additionalProperties: - type: string - description: CustomVMXKeys is a dictionary of advanced VMX options that can be set on VM Defaults to empty map - type: object - datacenter: - description: Datacenter is the name or inventory path of the datacenter in which the virtual machine is created/located. Defaults to * which selects the default datacenter. - type: string - datastore: - description: Datastore is the name or inventory path of the datastore in which the virtual machine is created/located. - type: string - diskGiB: - description: DiskGiB is the size of a virtual machine's disk, in GiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - folder: - description: Folder is the name or inventory path of the folder in which the virtual machine is created/located. - type: string - hardwareVersion: - description: HardwareVersion is the hardware version of the virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. Check the compatibility with the ESXi version before setting the value. - type: string - memoryMiB: - description: MemoryMiB is the size of a virtual machine's memory, in MiB. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int64 - type: integer - network: - description: Network is the network configuration for this machine's VM. - properties: - devices: - description: Devices is the list of network devices used by the virtual machine. TODO(akutz) Make sure at least one network matches the ClusterSpec.CloudProviderConfiguration.Network.Name - items: - description: NetworkDeviceSpec defines the network configuration for a virtual machine's network device. - properties: - addressesFromPools: - description: AddressesFromPools is a list of IPAddressPools that should be assigned to IPAddressClaims. The machine's cloud-init metadata will be populated with IPAddresses fulfilled by an IPAM provider. - items: - description: TypedLocalObjectReference contains enough information to let you locate the typed referenced object inside the same namespace. - properties: - apiGroup: - description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. - type: string - kind: - description: Kind is the type of resource being referenced - type: string - name: - description: Name is the name of resource being referenced - type: string - required: - - kind - - name - type: object - type: array - deviceName: - description: DeviceName may be used to explicitly assign a name to the network device as it exists in the guest operating system. - type: string - dhcp4: - description: DHCP4 is a flag that indicates whether or not to use DHCP for IPv4 on this device. If true then IPAddrs should not contain any IPv4 addresses. - type: boolean - dhcp4Overrides: - description: DHCP4Overrides allows for the control over several DHCP behaviors. Overrides will only be applied when the corresponding DHCP flag is set. Only configured values will be sent, omitted values will default to distribution defaults. Dependent on support in the network stack for your distribution. For more information see the netplan reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will be sent to the DHCP server instead of the machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize routes for devices. A lower metric for an interface will have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers in the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values `true`, `false`, or `route`. When `true`, the domain name from the DHCP server will be used as the DNS search domain for this device. When `route`, the domain name from the DHCP response will be used for routing DNS only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname from the DHCP server will be set as the transient hostname of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from the DHCP server will be set as the MTU of the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers from the DHCP server will be used by systemd-timesyncd and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes from the DHCP server will be installed in the routing table. - type: string - type: object - dhcp6: - description: DHCP6 is a flag that indicates whether or not to use DHCP for IPv6 on this device. If true then IPAddrs should not contain any IPv6 addresses. - type: boolean - dhcp6Overrides: - description: DHCP6Overrides allows for the control over several DHCP behaviors. Overrides will only be applied when the corresponding DHCP flag is set. Only configured values will be sent, omitted values will default to distribution defaults. Dependent on support in the network stack for your distribution. For more information see the netplan reference (https://netplan.io/reference#dhcp-overrides) - properties: - hostname: - description: Hostname is the name which will be sent to the DHCP server instead of the machine's hostname. - type: string - routeMetric: - description: RouteMetric is used to prioritize routes for devices. A lower metric for an interface will have a higher priority. - type: integer - sendHostname: - description: SendHostname when `true`, the hostname of the machine will be sent to the DHCP server. - type: boolean - useDNS: - description: UseDNS when `true`, the DNS servers in the DHCP server will be used and take precedence. - type: boolean - useDomains: - description: UseDomains can take the values `true`, `false`, or `route`. When `true`, the domain name from the DHCP server will be used as the DNS search domain for this device. When `route`, the domain name from the DHCP response will be used for routing DNS only, not for searching. - type: string - useHostname: - description: UseHostname when `true`, the hostname from the DHCP server will be set as the transient hostname of the machine. - type: boolean - useMTU: - description: UseMTU when `true`, the MTU from the DHCP server will be set as the MTU of the device. - type: boolean - useNTP: - description: UseNTP when `true`, the NTP servers from the DHCP server will be used by systemd-timesyncd and take precedence. - type: boolean - useRoutes: - description: UseRoutes when `true`, the routes from the DHCP server will be installed in the routing table. - type: string - type: object - gateway4: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP4 is false. - type: string - gateway6: - description: Gateway4 is the IPv4 gateway used by this device. Required when DHCP6 is false. - type: string - ipAddrs: - description: IPAddrs is a list of one or more IPv4 and/or IPv6 addresses to assign to this device. Required when DHCP4 and DHCP6 are both false. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address used by this device. It is generally a good idea to omit this field and allow a MAC address to be generated. Please note that this value must use the VMware OUI to work with the in-tree vSphere cloud provider. - type: string - mtu: - description: MTU is the device’s Maximum Transmission Unit size in bytes. - format: int64 - type: integer - nameservers: - description: Nameservers is a list of IPv4 and/or IPv6 addresses used as DNS nameservers. Please note that Linux allows only three nameservers (https://linux.die.net/man/5/resolv.conf). - items: - type: string - type: array - networkName: - description: NetworkName is the name of the vSphere network to which the device will be connected. - type: string - routes: - description: Routes is a list of optional, static routes applied to the device. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - searchDomains: - description: SearchDomains is a list of search domains used when resolving IP addresses with DNS. - items: - type: string - type: array - required: - - networkName - type: object - type: array - preferredAPIServerCidr: - description: PreferredAPIServeCIDR is the preferred CIDR for the Kubernetes API server endpoint on this machine - type: string - routes: - description: Routes is a list of optional, static routes applied to the virtual machine. - items: - description: NetworkRouteSpec defines a static network route. - properties: - metric: - description: Metric is the weight/priority of the route. - format: int32 - type: integer - to: - description: To is an IPv4 or IPv6 address. - type: string - via: - description: Via is an IPv4 or IPv6 address. - type: string - required: - - metric - - to - - via - type: object - type: array - required: - - devices - type: object - numCPUs: - description: NumCPUs is the number of virtual processors in a virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - numCoresPerSocket: - description: NumCPUs is the number of cores among which to distribute CPUs in this virtual machine. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - os: - description: OS is the Operating System of the virtual machine Defaults to Linux - type: string - pciDevices: - description: PciDevices is the list of pci devices used by the virtual machine. - items: - description: PCIDeviceSpec defines virtual machine's PCI configuration - properties: - deviceId: - description: DeviceID is the device ID of a virtual machine's PCI, in integer. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - vendorId: - description: VendorId is the vendor ID of a virtual machine's PCI, in integer. Defaults to the eponymous property value in the template from which the virtual machine is cloned. - format: int32 - type: integer - type: object - type: array - resourcePool: - description: ResourcePool is the name or inventory path of the resource pool in which the virtual machine is created/located. - type: string - server: - description: Server is the IP address or FQDN of the vSphere server on which the virtual machine is created/located. - type: string - snapshot: - description: Snapshot is the name of the snapshot from which to create a linked clone. This field is ignored if LinkedClone is not enabled. Defaults to the source's current snapshot. - type: string - storagePolicyName: - description: StoragePolicyName of the storage policy to use with this Virtual Machine - type: string - tagIDs: - description: TagIDs is an optional set of tags to add to an instance. Specified tagIDs must use URN-notation instead of display names. - items: - type: string - type: array - template: - description: Template is the name or inventory path of the template used to clone the virtual machine. - minLength: 1 - type: string - thumbprint: - description: Thumbprint is the colon-separated SHA-1 checksum of the given vCenter server's host certificate When this is set to empty, this VirtualMachine would be created without TLS certificate validation of the communication between Cluster API Provider vSphere and the VMware vCenter server. - type: string - required: - - network - - template - type: object - status: - description: VSphereVMStatus defines the observed state of VSphereVM - properties: - addresses: - description: Addresses is a list of the VM's IP addresses. This field is required at runtime for other controllers that read this CRD as unstructured data. - items: - type: string - type: array - cloneMode: - description: CloneMode is the type of clone operation used to clone this VM. Since LinkedMode is the default but fails gracefully if the source of the clone has no snapshots, this field may be used to determine the actual type of clone operation used to create this VM. - type: string - conditions: - description: Conditions defines current service state of the VSphereVM. - items: - description: Condition defines an observation of a Cluster API resource operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition in CamelCase. The specific API may choose whether or not this field is considered a guaranteed API. This field may not be empty. - type: string - severity: - description: Severity provides an explicit classification of Reason code, so the users or machines can immediately understand the current situation and act accordingly. The Severity field MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - failureMessage: - description: "FailureMessage will be set in the event that there is a terminal problem reconciling the vspherevm and will contain a more verbose string suitable for logging and human consumption. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the vm. \n Any transient errors that occur during the reconciliation of vspherevms can be added as events to the vspherevm object and/or logged in the controller's output." - type: string - failureReason: - description: "FailureReason will be set in the event that there is a terminal problem reconciling the vspherevm and will contain a succinct value suitable for vm interpretation. \n This field should not be set for transitive errors that a controller faces that are expected to be fixed automatically over time (like service outages), but instead indicate that something is fundamentally wrong with the vm. \n Any transient errors that occur during the reconciliation of vspherevms can be added as events to the vspherevm object and/or logged in the controller's output." - type: string - host: - description: Host describes the hostname or IP address of the infrastructure host that the VSphereVM is residing on. - type: string - moduleUUID: - description: ModuleUUID is the unique identifier for the vCenter cluster module construct which is used to configure anti-affinity. Objects with the same ModuleUUID will be anti-affined, meaning that the vCenter DRS will best effort schedule the VMs on separate hosts. - type: string - network: - description: Network returns the network status for each of the machine's configured network interfaces. - items: - description: NetworkStatus provides information about one of a VM's networks. - properties: - connected: - description: Connected is a flag that indicates whether this network is currently connected to the VM. - type: boolean - ipAddrs: - description: IPAddrs is one or more IP addresses reported by vm-tools. - items: - type: string - type: array - macAddr: - description: MACAddr is the MAC address of the network device. - type: string - networkName: - description: NetworkName is the name of the network. - type: string - required: - - macAddr - type: object - type: array - ready: - description: Ready is true when the provider resource is ready. This field is required at runtime for other controllers that read this CRD as unstructured data. - type: boolean - retryAfter: - description: RetryAfter tracks the time we can retry queueing a task - format: date-time - type: string - snapshot: - description: Snapshot is the name of the snapshot from which the VM was cloned if LinkedMode is enabled. - type: string - taskRef: - description: TaskRef is a managed object reference to a Task related to the machine. This value is set automatically at runtime and should not be set or modified by users. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-leader-election-role - namespace: capv-system -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -aggregationRule: - clusterRoleSelectors: - - matchLabels: - capv.infrastucture.cluster.x-k8s.io/aggregate-to-manager: "true" -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-aggregated-manager-role -rules: [] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - capv.infrastucture.cluster.x-k8s.io/aggregate-to-manager: "true" - cluster.x-k8s.io/aggregate-to-manager: "true" - cluster.x-k8s.io/provider: infrastructure-vsphere - kubeadm.controlplane.cluster.x-k8s.io/aggregate-to-manager: "true" - name: capv-manager-role -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - configmaps - - events - - nodes - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - patch - - update -- apiGroups: - - "" - resources: - - events - verbs: - - create - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims - verbs: - - create - - delete - - get - - list - - update - - watch -- apiGroups: - - "" - resources: - - persistentvolumeclaims/status - verbs: - - get - - patch - - update -- apiGroups: - - "" - resources: - - secrets - verbs: - - get -- apiGroups: - - "" - resources: - - serviceaccounts - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - services - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - services/status - verbs: - - get -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - machines - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - - machinesets - verbs: - - get - - list - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines - verbs: - - get - - list - - patch - - watch -- apiGroups: - - cluster.x-k8s.io - resources: - - machines/status - verbs: - - get - - list - - watch -- apiGroups: - - controlplane.cluster.x-k8s.io - resources: - - kubeadmcontrolplanes - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - nodes - verbs: - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusteridentities - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusteridentities/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheredeploymentzones - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheredeploymentzones/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherefailuredomains - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachines/status - verbs: - - get - - patch - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates - verbs: - - get - - list - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherevms - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - vspherevms/status - verbs: - - get - - patch - - update -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddressclaims - verbs: - - create - - get - - list - - update - - watch -- apiGroups: - - ipam.cluster.x-k8s.io - resources: - - ipaddresses - verbs: - - get - - list - - watch -- apiGroups: - - netoperator.vmware.com - resources: - - networks - verbs: - - get - - list - - watch -- apiGroups: - - rbac.authorization.k8s.io - resources: - - rolebindings - - roles - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - topology.tanzu.vmware.com - resources: - - availabilityzones - verbs: - - get - - list - - watch -- apiGroups: - - topology.tanzu.vmware.com - resources: - - availabilityzones/status - verbs: - - get - - list - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachineimages - - virtualmachineimages/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachineservices - - virtualmachineservices/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmoperator.vmware.com - resources: - - virtualmachinesetresourcepolicies - - virtualmachinesetresourcepolicies/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.com - resources: - - virtualnetworks - - virtualnetworks/status - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - providerserviceaccounts - verbs: - - get - - list - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - providerserviceaccounts/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclusters/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vsphereclustertemplates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachines - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachines/status - verbs: - - get - - patch - - update -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - vmware.infrastructure.cluster.x-k8s.io - resources: - - vspheremachinetemplates/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-leader-election-rolebinding - namespace: capv-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: capv-leader-election-role -subjects: -- kind: ServiceAccount - name: default - namespace: capv-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: capv-aggregated-manager-role -subjects: -- kind: ServiceAccount - name: default - namespace: capv-system ---- -apiVersion: v1 -kind: Secret -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-manager-bootstrap-credentials - namespace: capv-system -stringData: - credentials.yaml: |- - username: '${VSPHERE_USERNAME}' - password: '${VSPHERE_PASSWORD}' -type: Opaque ---- -apiVersion: v1 -kind: Service -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-webhook-service - namespace: capv-system -spec: - ports: - - port: 443 - targetPort: webhook-server - selector: - cluster.x-k8s.io/provider: infrastructure-vsphere ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - control-plane: controller-manager - name: capv-controller-manager - namespace: capv-system -spec: - replicas: 1 - selector: - matchLabels: - cluster.x-k8s.io/provider: infrastructure-vsphere - control-plane: controller-manager - template: - metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - control-plane: controller-manager - spec: - containers: - - args: - - --leader-elect - - --logtostderr - - --v=4 - - --feature-gates=NodeAntiAffinity=${EXP_NODE_ANTI_AFFINITY:=true},NodeLabeling=${EXP_NODE_LABELING:=true} - image: registry.tkg.vmware.run/cluster-api/cluster-api-vsphere-controller:${CAPV_CONTROLLER_IMAGE_TAG} - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9443 - name: webhook-server - protocol: TCP - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - volumeMounts: - - mountPath: /tmp/k8s-webhook-server/serving-certs - name: cert - readOnly: true - - mountPath: /etc/capv - name: manager-bootstrap-credentials - readOnly: true - env: - - name: HTTP_PROXY - value: ${TKG_HTTP_PROXY} - - name: HTTPS_PROXY - value: ${TKG_HTTPS_PROXY} - - name: NO_PROXY - value: ${TKG_NO_PROXY} - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - volumes: - - name: cert - secret: - defaultMode: 420 - secretName: capv-webhook-service-cert - - name: manager-bootstrap-credentials - secret: - secretName: capv-manager-bootstrap-credentials - securityContext: - runAsNonRoot: true - seccompProfile: - type: RuntimeDefault ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-serving-cert - namespace: capv-system -spec: - dnsNames: - - capv-webhook-service.capv-system.svc - - capv-webhook-service.capv-system.svc.cluster.local - issuerRef: - kind: Issuer - name: capv-selfsigned-issuer - secretName: capv-webhook-service-cert ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-selfsigned-issuer - namespace: capv-system -spec: - selfSigned: {} ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-mutating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspheredeploymentzone - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspheredeploymentzone.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheredeploymentzones - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspherefailuredomain - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspherefailuredomain.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherefailuredomains - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspheremachine.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachines - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /mutate-infrastructure-cluster-x-k8s-io-v1beta1-vspherevm - failurePolicy: Fail - matchPolicy: Equivalent - name: default.vspherevm.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherevms - sideEffects: None ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - annotations: - cert-manager.io/inject-ca-from: capv-system/capv-serving-cert - labels: - cluster.x-k8s.io/provider: infrastructure-vsphere - name: capv-validating-webhook-configuration -webhooks: -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vsphereclustertemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vsphereclustertemplate.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vsphereclustertemplates - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspherefailuredomain - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspherefailuredomain.infrastructure.cluster.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherefailuredomains - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachine - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspheremachine.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachines - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspheremachinetemplate - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspheremachinetemplate.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspheremachinetemplates - sideEffects: None -- admissionReviewVersions: - - v1beta1 - clientConfig: - service: - name: capv-webhook-service - namespace: capv-system - path: /validate-infrastructure-cluster-x-k8s-io-v1beta1-vspherevm - failurePolicy: Fail - matchPolicy: Equivalent - name: validation.vspherevm.infrastructure.x-k8s.io - rules: - - apiGroups: - - infrastructure.cluster.x-k8s.io - apiVersions: - - v1beta1 - operations: - - CREATE - - UPDATE - resources: - - vspherevms - sideEffects: None diff --git a/providers/infrastructure-vsphere/v1.5.3/metadata.yaml b/providers/infrastructure-vsphere/v1.5.3/metadata.yaml deleted file mode 100644 index fdb9e6fbaa..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/metadata.yaml +++ /dev/null @@ -1,39 +0,0 @@ -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: -- major: 0 - minor: 4 - contract: v1alpha2 -- major: 0 - minor: 5 - contract: v1alpha2 -- major: 0 - minor: 6 - contract: v1alpha3 -- major: 0 - minor: 7 - contract: v1alpha3 -- major: 0 - minor: 8 - contract: v1alpha4 -- major: 1 - minor: 0 - contract: v1beta1 -- major: 1 - minor: 1 - contract: v1beta1 -- major: 1 - minor: 2 - contract: v1beta1 -- major: 1 - minor: 3 - contract: v1beta1 -- major: 1 - minor: 4 - contract: v1beta1 -- major: 1 - minor: 5 - contract: v1beta1 -- major: 1 - minor: 1 - contract: v1beta1 diff --git a/providers/infrastructure-vsphere/v1.5.3/ytt/base-template.yaml b/providers/infrastructure-vsphere/v1.5.3/ytt/base-template.yaml deleted file mode 100644 index 0a98ab40df..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/ytt/base-template.yaml +++ /dev/null @@ -1,279 +0,0 @@ ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: '${ CLUSTER_NAME }' - namespace: '${ NAMESPACE }' - labels: - tkg.tanzu.vmware.com/cluster-name: '${ CLUSTER_NAME }' -spec: - clusterNetwork: - pods: - cidrBlocks: - - '${ CLUSTER_CIDR}' - services: - cidrBlocks: - - '${ SERVICE_CIDR }' - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1beta1 - kind: KubeadmControlPlane - name: '${ CLUSTER_NAME }-control-plane' - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereCluster - name: '${ CLUSTER_NAME }' ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: '${ CLUSTER_NAME }' - namespace: '${ NAMESPACE }' -spec: - controlPlaneEndpoint: - host: '${ VSPHERE_CONTROL_PLANE_ENDPOINT }' - port: 6443 - identityRef: - kind: Secret - name: '${ CLUSTER_NAME }' - thumbprint: '${ VSPHERE_TLS_THUMBPRINT }' - server: '${ VSPHERE_SERVER }' ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: '${ CLUSTER_NAME }-control-plane' - namespace: '${ NAMESPACE }' - annotations: - vmTemplateMoid: '${ VSPHERE_TEMPLATE_MOID }' -spec: - template: - spec: - cloneMode: '${ VSPHERE_CLONE_MODE }' - datacenter: '${ VSPHERE_DATACENTER }' - datastore: '${ VSPHERE_DATASTORE }' - storagePolicyName: '${ VSPHERE_STORAGE_POLICY_ID }' - diskGiB: ${VSPHERE_CONTROL_PLANE_DISK_GIB} - folder: '${ VSPHERE_FOLDER }' - memoryMiB: ${VSPHERE_CONTROL_PLANE_MEM_MIB} - network: - devices: - - dhcp4: true - networkName: '${ VSPHERE_NETWORK }' - numCPUs: ${ VSPHERE_CONTROL_PLANE_NUM_CPUS } - resourcePool: '${ VSPHERE_RESOURCE_POOL }' - server: '${ VSPHERE_SERVER }' - template: '${ VSPHERE_TEMPLATE }' ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: '${ CLUSTER_NAME }-worker' - namespace: '${ NAMESPACE }' - annotations: - vmTemplateMoid: '${ VSPHERE_TEMPLATE_MOID }' -spec: - template: - spec: - cloneMode: '${ VSPHERE_CLONE_MODE }' - datacenter: '${ VSPHERE_DATACENTER }' - datastore: '${ VSPHERE_DATASTORE }' - storagePolicyName: '${ VSPHERE_STORAGE_POLICY_ID }' - diskGiB: ${VSPHERE_WORKER_DISK_GIB} - folder: '${ VSPHERE_FOLDER }' - memoryMiB: ${VSPHERE_WORKER_MEM_MIB} - network: - devices: - - dhcp4: true - networkName: '${ VSPHERE_NETWORK }' - numCPUs: ${ VSPHERE_WORKER_NUM_CPUS } - resourcePool: '${ VSPHERE_RESOURCE_POOL }' - server: '${ VSPHERE_SERVER }' - template: '${ VSPHERE_TEMPLATE }' ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - name: '${ CLUSTER_NAME }-control-plane' - namespace: '${ NAMESPACE }' -spec: - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: '${ CLUSTER_NAME }-control-plane' - kubeadmConfigSpec: - useExperimentalRetryJoin: true - clusterConfiguration: - imageRepository: '${ _TKG_K8S_IMAGE_REPOSITORY }' - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: '${ _TKG_ETCD_IMAGE_REPOSITORY }' - imageTag: '${ _TKG_ETCD_IMAGE_TAG }' - extraArgs: - cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - dns: - imageRepository: '${ _TKG_COREDNS_IMAGE_REPOSITORY }' - imageTag: '${ _TKG_COREDNS_IMAGE_TAG }' - apiServer: - timeoutForControlPlane: "8m0s" - extraArgs: - cloud-provider: external - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - controllerManager: - extraArgs: - cloud-provider: external - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - scheduler: - extraArgs: - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - files: - - content: | - apiVersion: v1 - kind: Pod - metadata: - creationTimestamp: null - name: kube-vip - namespace: kube-system - spec: - containers: - - args: - - manager - env: - - name: cp_enable - value: "true" - - name: vip_arp - value: "true" - - name: vip_leaderelection - value: "true" - - name: address - value: '${ VSPHERE_CONTROL_PLANE_ENDPOINT }' - - name: vip_interface - value: '${ VIP_NETWORK_INTERFACE }' - - name: vip_leaseduration - value: "30" - - name: vip_renewdeadline - value: "20" - - name: vip_retryperiod - value: "4" - image: '${ _TKG_KUBE_VIP_IMAGE }' - imagePullPolicy: IfNotPresent - name: kube-vip - resources: {} - securityContext: - capabilities: - add: - - NET_ADMIN - - NET_RAW - volumeMounts: - - mountPath: /etc/kubernetes/admin.conf - name: kubeconfig - hostNetwork: true - hostAliases: - - hostnames: - - kubernetes - ip: 127.0.0.1 - volumes: - - hostPath: - path: /etc/kubernetes/admin.conf - type: FileOrCreate - name: kubeconfig - status: {} - owner: root:root - path: /etc/kubernetes/manifests/kube-vip.yaml - initConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - cloud-provider: external - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - name: '{{ ds.meta_data.hostname }}' - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - cloud-provider: external - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - name: '{{ ds.meta_data.hostname }}' - preKubeadmCommands: - - hostname "{{ ds.meta_data.hostname }}" - - echo "::1 ipv6-localhost ipv6-loopback" >/etc/hosts - - echo "127.0.0.1 localhost" >>/etc/hosts - - echo "127.0.0.1 {{ ds.meta_data.hostname }}" >>/etc/hosts - - echo "{{ ds.meta_data.hostname }}" >/etc/hostname - users: - - name: capv - sshAuthorizedKeys: - - '${ VSPHERE_SSH_AUTHORIZED_KEY }' - sudo: ALL=(ALL) NOPASSWD:ALL - replicas: ${ CONTROL_PLANE_MACHINE_COUNT } - version: '${ KUBERNETES_VERSION }' ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: '${ CLUSTER_NAME }-md-0' - namespace: '${ NAMESPACE }' -spec: - template: - spec: - useExperimentalRetryJoin: true - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - cloud-provider: external - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - name: '{{ ds.meta_data.hostname }}' - preKubeadmCommands: - - hostname "{{ ds.meta_data.hostname }}" - - echo "::1 ipv6-localhost ipv6-loopback" >/etc/hosts - - echo "127.0.0.1 localhost" >>/etc/hosts - - echo "127.0.0.1 {{ ds.meta_data.hostname }}" >>/etc/hosts - - echo "{{ ds.meta_data.hostname }}" >/etc/hostname - files: [] - users: - - name: capv - sshAuthorizedKeys: - - '${ VSPHERE_SSH_AUTHORIZED_KEY }' - sudo: ALL=(ALL) NOPASSWD:ALL ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - labels: - cluster.x-k8s.io/cluster-name: '${ CLUSTER_NAME }' - name: '${ CLUSTER_NAME }-md-0' - namespace: '${ NAMESPACE }' -spec: - clusterName: '${ CLUSTER_NAME }' - replicas: ${ WORKER_MACHINE_COUNT } - selector: - matchLabels: {} - strategy: - type: RollingUpdate - template: - metadata: - labels: - node-pool: "${CLUSTER_NAME}-worker-pool" - spec: - bootstrap: - configRef: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: '${ CLUSTER_NAME }-md-0' - clusterName: '${ CLUSTER_NAME }' - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: '${ CLUSTER_NAME }-worker' - version: '${ KUBERNETES_VERSION }' ---- -apiVersion: v1 -kind: Secret -metadata: - name: '${ CLUSTER_NAME }' - namespace: '${ NAMESPACE }' -stringData: - username: '${ VSPHERE_USERNAME }' - password: '${ VSPHERE_PASSWORD }' diff --git a/providers/infrastructure-vsphere/v1.5.3/ytt/overlay-windows.yaml b/providers/infrastructure-vsphere/v1.5.3/ytt/overlay-windows.yaml deleted file mode 100644 index ef114c0f9e..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/ytt/overlay-windows.yaml +++ /dev/null @@ -1,570 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "get_default_tkg_bom_data", "kubeadm_image_repo", "get_image_repo_for_component", "get_vsphere_thumbprint") -#@ load("lib/validate.star", "validate_configuration") -#@ load("@ytt:yaml", "yaml") -#@ validate_configuration("vsphere") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - -#@ bomData = get_default_tkg_bom_data() - -#@ if data.values.IS_WINDOWS_WORKLOAD_CLUSTER: - -#@ def kube_vip_pod(): ---- -apiVersion: v1 -kind: Pod -metadata: - creationTimestamp: null - name: kube-vip - namespace: kube-system -spec: - containers: - - args: - - manager - env: - - name: cp_enable - value: "true" - - name: vip_arp - value: "true" - - name: vip_leaderelection - value: "true" - - name: address - value: #@ data.values.VSPHERE_CONTROL_PLANE_ENDPOINT - #@ if (not data.values.AVI_CONTROL_PLANE_HA_PROVIDER) and data.values.CLUSTER_API_SERVER_PORT: - - name: port - value: #@ "{}".format(data.values.CLUSTER_API_SERVER_PORT) - #@ end - - name: vip_interface - value: #@ data.values.VIP_NETWORK_INTERFACE - - name: vip_leaseduration - value: "15" - - name: vip_renewdeadline - value: "10" - - name: vip_retryperiod - value: "2" - image: #@ "{}/{}:{}".format(get_image_repo_for_component(bomData.components["kube-vip"][0].images.kubeVipImage), bomData.components["kube-vip"][0].images.kubeVipImage.imagePath, bomData.components["kube-vip"][0].images.kubeVipImage.tag) - imagePullPolicy: IfNotPresent - name: kube-vip - resources: {} - securityContext: - capabilities: - add: - - NET_ADMIN - - NET_RAW - volumeMounts: - - mountPath: /etc/kubernetes/admin.conf - name: kubeconfig - hostNetwork: true - hostAliases: - - hostnames: - - kubernetes - ip: 127.0.0.1 - volumes: - - hostPath: - path: /etc/kubernetes/admin.conf - type: FileOrCreate - name: kubeconfig -status: {} -#@ end - -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: #@ data.values.CLUSTER_NAME - #@ if data.values.VSPHERE_CONTROL_PLANE_ENDPOINT: - #@overlay/match missing_ok=True - annotations: - tkg.tanzu.vmware.com/cluster-controlplane-endpoint: #@ data.values.VSPHERE_CONTROL_PLANE_ENDPOINT - #@ end - labels: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - cluster-role.tkg.tanzu.vmware.com/(@= data.values.TKG_CLUSTER_ROLE @): "" - #@ end - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - #@overlay/match missing_ok=True - tanzuKubernetesRelease: #@ data.values.KUBERNETES_RELEASE -spec: - infrastructureRef: - name: #@ data.values.CLUSTER_NAME - controlPlaneRef: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - clusterNetwork: - #@ if (not data.values.AVI_CONTROL_PLANE_HA_PROVIDER) and data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - apiServerPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - pods: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.CLUSTER_CIDR - services: - cidrBlocks: - #@overlay/match by=overlay.index(0) - - #@ data.values.SERVICE_CIDR - -#@overlay/match by=overlay.subset({"kind":"VSphereCluster"}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: #@ data.values.CLUSTER_NAME -spec: - #@ if not data.values.AVI_CONTROL_PLANE_HA_PROVIDER: - controlPlaneEndpoint: - host: #@ data.values.VSPHERE_CONTROL_PLANE_ENDPOINT - #@ if data.values.CLUSTER_API_SERVER_PORT: - port: #@ data.values.CLUSTER_API_SERVER_PORT - #@ else: - port: 6443 - #@ end - #@ else: - #@overlay/remove - controlPlaneEndpoint: - #@ end - thumbprint: #@ get_vsphere_thumbprint() - server: #@ data.values.VSPHERE_SERVER - identityRef: - kind: Secret - name: #@ data.values.CLUSTER_NAME - -#@overlay/match by=overlay.subset({"kind": "VSphereMachineTemplate", "metadata":{"name": "${ CLUSTER_NAME }-control-plane"}}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - #@overlay/match missing_ok=True - annotations: - vmTemplateMoid: #@ data.values.VSPHERE_TEMPLATE_MOID -spec: - template: - spec: - cloneMode: #@ data.values.VSPHERE_CLONE_MODE - datacenter: #@ data.values.VSPHERE_DATACENTER - datastore: #@ data.values.VSPHERE_DATASTORE - storagePolicyName: #@ data.values.VSPHERE_STORAGE_POLICY_ID - diskGiB: #@ data.values.VSPHERE_CONTROL_PLANE_DISK_GIB - folder: #@ data.values.VSPHERE_FOLDER - memoryMiB: #@ data.values.VSPHERE_CONTROL_PLANE_MEM_MIB - network: - devices: - #@ if data.values.TKG_IP_FAMILY == "ipv6": - #@overlay/match by=overlay.index(0) - #@overlay/replace - - dhcp6: true - networkName: #@ data.values.VSPHERE_NETWORK - #@ else: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - dhcp4: true - networkName: #@ data.values.VSPHERE_NETWORK - #@ end - numCPUs: #@ data.values.VSPHERE_CONTROL_PLANE_NUM_CPUS - resourcePool: #@ data.values.VSPHERE_RESOURCE_POOL - server: #@ data.values.VSPHERE_SERVER - template: #@ data.values.VSPHERE_TEMPLATE -#@overlay/match by=overlay.subset({"kind": "VSphereMachineTemplate", "metadata":{"name": "${ CLUSTER_NAME }-worker"}}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: #@ "{}-windows-containerd".format(data.values.CLUSTER_NAME) - #@overlay/match missing_ok=True - annotations: - vmTemplateMoid: #@ data.values.VSPHERE_TEMPLATE_MOID -spec: - template: - spec: - cloneMode: #@ data.values.VSPHERE_CLONE_MODE - datacenter: #@ data.values.VSPHERE_DATACENTER - datastore: #@ data.values.VSPHERE_DATASTORE - storagePolicyName: #@ data.values.VSPHERE_STORAGE_POLICY_ID - diskGiB: 80 - folder: #@ data.values.VSPHERE_FOLDER - memoryMiB: #@ data.values.VSPHERE_WORKER_MEM_MIB - network: - devices: - #@ if data.values.TKG_IP_FAMILY == "ipv6": - #@overlay/match by=overlay.index(0) - #@overlay/replace - - dhcp6: true - networkName: #@ data.values.VSPHERE_NETWORK - #@ else: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - dhcp4: true - networkName: #@ data.values.VSPHERE_NETWORK - #@ end - numCPUs: #@ data.values.VSPHERE_WORKER_NUM_CPUS - resourcePool: #@ data.values.VSPHERE_RESOURCE_POOL - server: #@ data.values.VSPHERE_SERVER - template: #@ data.values.VSPHERE_WINDOWS_TEMPLATE - -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) -spec: - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - kubeadmConfigSpec: - initConfiguration: - #@ if (not data.values.AVI_CONTROL_PLANE_HA_PROVIDER) and data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - localAPIEndpoint: - #@ if data.values.TKG_IP_FAMILY in ["ipv6", "ipv6,ipv4"]: - advertiseAddress: '::/0' - #@ else: - advertiseAddress: '0.0.0.0' - #@ end - bindPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - joinConfiguration: - #@ if (not data.values.AVI_CONTROL_PLANE_HA_PROVIDER) and data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - controlPlane: - localAPIEndpoint: - #@ if data.values.TKG_IP_FAMILY in ["ipv6", "ipv6,ipv4"]: - advertiseAddress: '::/0' - #@ else: - advertiseAddress: '0.0.0.0' - #@ end - bindPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - clusterConfiguration: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.imageRepository) - etcd: - local: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local.imageRepository) - imageTag: #@ bomDataForK8sVersion.kubeadmConfigSpec.etcd.local.imageTag - #@ if getattr(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local, "extraArgs", None) != None: - #@overlay/match missing_ok=True - extraArgs: - #@ for key in bomDataForK8sVersion.kubeadmConfigSpec.etcd.local["extraArgs"]: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - (@= key @): #@ "{}".format(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local["extraArgs"][key]).lower() - #@ end - #@ end - dns: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.dns.imageRepository) - imageTag: #@ bomDataForK8sVersion.kubeadmConfigSpec.dns.imageTag - files: - #@ if not data.values.AVI_CONTROL_PLANE_HA_PROVIDER: - #@overlay/match by=overlay.index(0) - - content: #@ yaml.encode(kube_vip_pod()) - #@ else: - #@overlay/match by=overlay.index(0) - #@overlay/remove - - content: - #@ end - users: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - name: capv - sshAuthorizedKeys: - - #@ data.values.VSPHERE_SSH_AUTHORIZED_KEY - sudo: ALL=(ALL) NOPASSWD:ALL - replicas: #@ data.values.CONTROL_PLANE_MACHINE_COUNT - version: #@ data.values.KUBERNETES_VERSION - -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate", "metadata":{"name": "${ CLUSTER_NAME }-md-0"}}) ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-0-windows-containerd".format(data.values.CLUSTER_NAME) -#@overlay/replace -spec: - template: - spec: - joinConfiguration: - nodeRegistration: - criSocket: npipe:////./pipe/containerd-containerd - kubeletExtraArgs: - cloud-provider: external - register-with-taints: os=windows:NoSchedule - name: '{{ ds.meta_data.hostname }}' - files: - - path: 'C:\Temp\antrea.ps1' - content: | - function WaitForSaToken($KubeCfgFile, $ServiceAcctName) { - $SaToken = $null - $LoopCount = 400 - do { - $LoopCount = $LoopCount - 1 - if ($LoopCount -eq 0) { - break - } - sleep 5 - $SaToken=$(kubectl --kubeconfig=$KubeCfgFile get secrets -n kube-system -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='$ServiceAcctName')].data.token}") - } while ($SaToken -eq $null) - return $SaToken - } - - # Disable firewall temporarily for SSH and other internal ports access - Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False - - $TempFolder = 'C:\programdata\temp' - $AntreaInTempFolder = "$TempFolder\antrea-windows-advanced.zip" - $KubeproxyInTempFolder = "$TempFolder\kube-proxy.exe" - - # Create Folders - $folders = @('C:\k\antrea', 'C:\var\log\antrea', 'C:\k\antrea\bin', 'C:\var\log\kube-proxy', 'C:\opt\cni\bin', 'C:\etc\cni\net.d') - foreach ($f in $folders) { - New-Item -ItemType Directory -Force -Path $f - } - - # Add Windows Defender Options - $avexceptions = @('C:\program files\containerd\ctr.exe', 'C:\program files\containerd\containerd.exe') - foreach ($e in $avexceptions) { - Add-MpPreference -ExclusionProcess $e - } - - # Extract Antrea, Antrea binary should be packed into windows OVA already - $antreaZipFile = 'C:\k\antrea\antrea-windows-advanced.zip' - if (!(Test-Path $antreaZipFile)) { - cp $AntreaInTempFolder $antreaZipFile - } - Expand-Archive -Force -Path $antreaZipFile -DestinationPath C:\k\antrea - cp C:\k\antrea\bin\antrea-cni.exe C:\opt\cni\bin\antrea.exe -Force - cp C:\k\antrea\bin\host-local.exe C:\opt\cni\bin\host-local.exe -Force - cp C:\k\antrea\etc\antrea-cni.conflist C:\etc\cni\net.d\10-antrea.conflist -Force - - # Get HostIP and set in kubeadm-flags.env - [Environment]::SetEnvironmentVariable("NODE_NAME", (hostname).ToLower()) - $env:HostIP = ( - Get-NetIPConfiguration | - Where-Object { - $_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.Status -ne "Disconnected" - } - ).IPv4Address.IPAddress - $file = 'C:\var\lib\kubelet\kubeadm-flags.env' - $newstr = "--node-ip=" + $env:HostIP - $raw = Get-Content -Path $file -TotalCount 1 - $raw = $raw -replace ".$" - $new = "$($raw) $($newstr)`"" - Set-Content $file $new - - $KubeConfigFile = 'C:\etc\kubernetes\kubelet.conf' - - # Wait for antrea-agent token to be ready, the token will be used by Install-AntreaAgent - $AntreaAgentToken = (WaitForSaToken $KubeConfigFile 'antrea-agent') - - # Setup kubo-proxy config file - $KubeProxyToken = (WaitForSaToken $KubeConfigFile 'kube-proxy-windows') - $KubeProxyConfig = 'C:\k\antrea\etc\kube-proxy.conf' - $KubeAPIServer = $(kubectl --kubeconfig=$KubeConfigFile config view -o jsonpath='{.clusters[0].cluster.server}') - $KubeProxyToken = $([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($KubeProxyToken))) - kubectl config --kubeconfig=$KubeProxyConfig set-cluster kubernetes --server=$KubeAPIServer --insecure-skip-tls-verify - kubectl config --kubeconfig=$KubeProxyConfig set-credentials kube-proxy-windows --token=$KubeProxyToken - kubectl config --kubeconfig=$KubeProxyConfig set-context kube-proxy-windows@kubernetes --cluster=kubernetes --user=kube-proxy-windows - kubectl config --kubeconfig=$KubeProxyConfig use-context kube-proxy-windows@kubernetes - - # kube-proxy.exe should be packed into windows OVA - if (!(Test-Path 'C:\k\kube-proxy.exe')) { - cp $KubeproxyInTempFolder 'C:\k\kube-proxy.exe' - } - - # Install antrea-agent & ovs - # TODO: - # Install-AntreaAgent is too heavy, since Kubernetes and Antrea binaries have already been pre-installed, we don't - # depend on Install-AntreaAgent to downloading them, KubernetesVersion and AntreaVersion are not used anymore, will - # refine the invoke of Install-AntreaAgent in the future. Keep AntreaVersion for 1.7.1, guessing latest from the script - # on this version is breaking the installation. - Import-Module C:\k\antrea\helper.psm1 - & Install-AntreaAgent -KubernetesHome "C:\k" -KubeConfig "C:\etc\kubernetes\kubelet.conf" -AntreaHome "C:\k\antrea" -AntreaVersion "v1.7.1" - New-KubeProxyServiceInterface - & C:\k\antrea\Install-OVS.ps1 -ImportCertificate $false -LocalFile C:\k\antrea\ovs-win64.zip - - # Setup Services - $nssm = (Get-Command nssm).Source - & $nssm set kubelet start SERVICE_AUTO_START - & $nssm install kube-proxy "C:\k\kube-proxy.exe" "--proxy-mode=userspace --kubeconfig=$KubeProxyConfig --log-dir=C:\var\log\kube-proxy --logtostderr=false --alsologtostderr" - & $nssm install antrea-agent "C:\k\antrea\bin\antrea-agent.exe" "--config=C:\k\antrea\etc\antrea-agent.conf --logtostderr=false --log_dir=C:\var\log\antrea --alsologtostderr --log_file_max_size=100 --log_file_max_num=4" - & $nssm set antrea-agent DependOnService kube-proxy ovs-vswitchd - & $nssm set antrea-agent Start SERVICE_AUTO_START - - # Start Services - start-service kubelet - start-service kube-proxy - start-service antrea-agent - postKubeadmCommands: - - powershell C:/Temp/antrea.ps1 -ExecutionPolicy Bypass - users: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - name: capv - groups: Administrators - sshAuthorizedKeys: - - #@ data.values.VSPHERE_SSH_AUTHORIZED_KEY - sudo: ALL=(ALL) NOPASSWD:ALL - -#@overlay/match by=overlay.subset({"kind":"MachineDeployment", "metadata":{"name": "${ CLUSTER_NAME }-md-0"}}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - name: #@ "{}-md-0-windows-containerd".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT - selector: - matchLabels: {} - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - bootstrap: - configRef: - name: #@ "{}-md-0-windows-containerd".format(data.values.CLUSTER_NAME) - clusterName: #@ data.values.CLUSTER_NAME - infrastructureRef: - name: #@ "{}-windows-containerd".format(data.values.CLUSTER_NAME) - version: #@ data.values.KUBERNETES_VERSION -#@overlay/match by=overlay.subset({"kind": "Secret", "metadata":{"name": "${ CLUSTER_NAME }"}}) ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ data.values.CLUSTER_NAME -stringData: - username: #@ data.values.VSPHERE_USERNAME - password: #@ data.values.VSPHERE_PASSWORD ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - annotations: - tkg.tanzu.vmware.com/addon-type: metadata/tkg - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - name: #@ "{}-tkg-antrea-cls-init".format(data.values.CLUSTER_NAME) - namespace: default -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - kind: ConfigMap - name: tkg-antrea-rc-init ---- -#! The following are windows specific configuration / account data -#! that allow antrea cni and kube-proxy to communicate with the APIServer -apiVersion: v1 -kind: ConfigMap -metadata: - name: tkg-antrea-rc-init - namespace: default -data: - data: | - apiVersion: rbac.authorization.k8s.io/v1 - kind: Role - metadata: - namespace: kube-system - name: node:antrea-read-secrets - rules: - - apiGroups: [""] - resources: ["serviceaccounts"] - resourceNames: ["antrea-agent"] - verbs: ["get"] - - apiGroups: [""] - resources: ["secrets"] - verbs: ["list","get"] - --- - apiVersion: rbac.authorization.k8s.io/v1 - kind: RoleBinding - metadata: - name: node:read-antrea-sa - namespace: kube-system - subjects: - - kind: Group - name: system:nodes - apiGroup: rbac.authorization.k8s.io - roleRef: - kind: Role - name: node:antrea-read-secrets - apiGroup: rbac.authorization.k8s.io - --- - apiVersion: rbac.authorization.k8s.io/v1 - kind: ClusterRole - metadata: - name: node:kube-proxy - rules: - - apiGroups: - - "" - resources: - - endpoints - - services - verbs: - - get - - list - - watch - - apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - events - verbs: - - get - - list - - watch - - create - --- - apiVersion: rbac.authorization.k8s.io/v1 - kind: ClusterRoleBinding - metadata: - name: node:kube-proxy - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: node:kube-proxy - subjects: - - kind: Group - name: system:nodes - apiGroup: rbac.authorization.k8s.io - - kind: ServiceAccount - name: kube-proxy-windows - namespace: kube-system - --- - apiVersion: v1 - kind: ServiceAccount - metadata: - labels: - app: kube-proxy - name: kube-proxy-windows - namespace: kube-system - --- - apiVersion: v1 - kind: Secret - metadata: - annotations: - kubernetes.io/service-account.name: kube-proxy-windows - name: kube-proxy-windows-token - namespace: kube-system - type: kubernetes.io/service-account-token - --- -#@ end diff --git a/providers/infrastructure-vsphere/v1.5.3/ytt/overlay.yaml b/providers/infrastructure-vsphere/v1.5.3/ytt/overlay.yaml deleted file mode 100644 index 0e7b45a93d..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/ytt/overlay.yaml +++ /dev/null @@ -1,491 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:regexp", "regexp") -#@ load("@ytt:assert", "assert") - -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "get_default_tkg_bom_data", "kubeadm_image_repo", "get_image_repo_for_component", "get_vsphere_thumbprint", "get_tkr_version_from_tkr_name", "verify_and_configure_machine_deployment_rollout_strategy", "map") - -#@ load("lib/validate.star", "validate_configuration") -#@ load("@ytt:yaml", "yaml") -#@ validate_configuration("vsphere") - -#@ def get_custom_keys(keyValueString): -#@ customKeys = dict() -#@ for val in keyValueString.split(','): -#@ kv = val.split('=') -#@ if len(kv) != 2: -#@ assert.fail("Given input is not in correct format") -#@ end -#@ customKeys[kv[0]] = kv[1] -#@ end -#@ return customKeys -#@ end - -#! The compare_semver_versions function compares the major, minor, patch -#! numbers of two versions. It returns 1 if a > b, 0 if a == b, -1 if a < b. -#! Anything after the patch number is ignored. a and b must be in the -#! form of v..[+build-info] -#@ def compare_semver_versions(a, b): -#@ a_array = regexp.replace("v?(\d+\.\d+\.\d+).*", a, "$1").split(".") -#@ b_array = regexp.replace("v?(\d+\.\d+\.\d+).*", b, "$1").split(".") -#@ for i in range(len(a_array)): -#@ if int(a_array[i]) > int(b_array[i]): -#@ return 1 -#@ elif int(a_array[i]) < int(b_array[i]): -#@ return -1 -#@ end -#@ end -#@ return 0 -#@ end - - -#@ valid_pci_devices = [[0x10DE,0x1EB8]] - -#@ def valid_pci_devices_list(): -#@ return ",".join(map(lambda x: "0x%X:0x%X" % (x[0], x[1]), valid_pci_devices)) -#@ end - -#@ def get_pci_devices(pci_devices_string, pci_ignore_device_validation): -#@ pci_devices = list() -#@ help_error = "VSPHERE_CONTROL_PLANE_PCI_DEVICES \"" + pci_devices_string + "\" must be in the \"0x:0x,0x:0x,..\" format." -#@ for val in pci_devices_string.split(","): -#@ if len(val) <= 0: -#@ assert.fail(help_error) -#@ end -#@ kv = val.split(":") -#@ if len(kv) != 2: -#@ assert.fail(help_error) -#@ end -#@ id_pair = dict() -#! No try-catch or exception support unfortunately (https://github.com/google/skylark/issues/125). -#! If this fails, e.g. user wrote "0zsomething", user's just going to get an "invalid literal with base 16" error. -#! This will need to be covered in documentation. -#@ vendor_id = int(kv[0], 16) -#@ device_id = int(kv[1], 16) -#@ if not pci_ignore_device_validation: -#@. matchesAny = False -#@ for x in valid_pci_devices: -#@ if vendor_id == x[0] and device_id == x[1]: -#@ matchesAny = True -#@ end -#@ end -#@ if not matchesAny: -#@ assert.fail("Device 0x%X:0x%X is not supported. Supported devices are: %s. Set VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST to ignore this check." % (vendor_id, device_id, valid_pci_devices_list())) -#@ end -#@ end -#@ id_pair["vendorId"] = vendor_id -#@ id_pair["deviceId"] = device_id -#@ pci_devices.append(id_pair) -#@ end -#@ return pci_devices -#@ end - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() -#@ bomData = get_default_tkg_bom_data() -#@ tkrVersion = get_tkr_version_from_tkr_name(data.values.KUBERNETES_RELEASE) - -#@ if not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: - -#@ def kube_vip_pod(): ---- -apiVersion: v1 -kind: Pod -metadata: - creationTimestamp: null - name: kube-vip - namespace: kube-system -spec: - containers: - - args: - - manager - env: - - name: cp_enable - value: "true" - - name: vip_arp - value: "true" - - name: vip_leaderelection - value: "true" - - name: address - value: #@ data.values.VSPHERE_CONTROL_PLANE_ENDPOINT - #@ if (not data.values.AVI_CONTROL_PLANE_HA_PROVIDER) and data.values.CLUSTER_API_SERVER_PORT: - - name: port - value: #@ "{}".format(data.values.CLUSTER_API_SERVER_PORT) - #@ end - - name: vip_interface - value: #@ data.values.VIP_NETWORK_INTERFACE - - name: vip_leaseduration - value: "30" - - name: vip_renewdeadline - value: "20" - - name: vip_retryperiod - value: "4" - image: #@ "{}/{}:{}".format(get_image_repo_for_component(bomData.components["kube-vip"][0].images.kubeVipImage), bomData.components["kube-vip"][0].images.kubeVipImage.imagePath, bomData.components["kube-vip"][0].images.kubeVipImage.tag) - imagePullPolicy: IfNotPresent - name: kube-vip - resources: {} - securityContext: - capabilities: - add: - - NET_ADMIN - - NET_RAW - volumeMounts: - - mountPath: /etc/kubernetes/admin.conf - name: kubeconfig - hostNetwork: true - hostAliases: - - hostnames: - - kubernetes - ip: 127.0.0.1 - volumes: - - hostPath: - path: /etc/kubernetes/admin.conf - type: FileOrCreate - name: kubeconfig -status: {} -#@ end - -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: #@ data.values.CLUSTER_NAME - #@ if data.values.VSPHERE_CONTROL_PLANE_ENDPOINT: - #@overlay/match missing_ok=True - annotations: - tkg.tanzu.vmware.com/cluster-controlplane-endpoint: #@ data.values.VSPHERE_CONTROL_PLANE_ENDPOINT - #@ end - labels: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - cluster-role.tkg.tanzu.vmware.com/(@= data.values.TKG_CLUSTER_ROLE @): "" - #@ end - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - #@overlay/match missing_ok=True - tanzuKubernetesRelease: #@ data.values.KUBERNETES_RELEASE -spec: - infrastructureRef: - name: #@ data.values.CLUSTER_NAME - controlPlaneRef: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - clusterNetwork: - #@ if (not data.values.AVI_CONTROL_PLANE_HA_PROVIDER) and data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - apiServerPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - pods: - #@overlay/replace - cidrBlocks: #@ data.values.CLUSTER_CIDR.split(",") - services: - #@overlay/replace - cidrBlocks: #@ data.values.SERVICE_CIDR.split(",") - -#@overlay/match by=overlay.subset({"kind":"VSphereCluster"}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: #@ data.values.CLUSTER_NAME -spec: - #@ if not data.values.AVI_CONTROL_PLANE_HA_PROVIDER: - controlPlaneEndpoint: - host: #@ data.values.VSPHERE_CONTROL_PLANE_ENDPOINT - #@ if data.values.CLUSTER_API_SERVER_PORT: - port: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - #@ else: - #@overlay/remove - controlPlaneEndpoint: - #@ end - thumbprint: #@ get_vsphere_thumbprint() - server: #@ data.values.VSPHERE_SERVER - identityRef: - kind: Secret - name: #@ data.values.CLUSTER_NAME - -#@overlay/match by=overlay.subset({"kind": "VSphereMachineTemplate", "metadata":{"name": "${ CLUSTER_NAME }-control-plane"}}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - #@overlay/match missing_ok=True - annotations: - vmTemplateMoid: #@ data.values.VSPHERE_TEMPLATE_MOID -spec: - template: - spec: - cloneMode: #@ data.values.VSPHERE_CLONE_MODE - datacenter: #@ data.values.VSPHERE_DATACENTER - datastore: #@ data.values.VSPHERE_DATASTORE - storagePolicyName: #@ data.values.VSPHERE_STORAGE_POLICY_ID - diskGiB: #@ data.values.VSPHERE_CONTROL_PLANE_DISK_GIB - folder: #@ data.values.VSPHERE_FOLDER - memoryMiB: #@ data.values.VSPHERE_CONTROL_PLANE_MEM_MIB - network: - devices: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - networkName: #@ data.values.VSPHERE_NETWORK - #@ if data.values.CONTROL_PLANE_NODE_NAMESERVERS: - nameservers: #@ data.values.CONTROL_PLANE_NODE_NAMESERVERS.replace(" ", "").split(",") - #@ end - #@ if data.values.TKG_IP_FAMILY == "ipv6": - dhcp6: true - #@ elif data.values.TKG_IP_FAMILY in ["ipv4,ipv6", "ipv6,ipv4"]: - dhcp4: true - dhcp6: true - #@ else: - dhcp4: true - #@ end - numCPUs: #@ data.values.VSPHERE_CONTROL_PLANE_NUM_CPUS -#@ if data.values.VSPHERE_CONTROL_PLANE_PCI_DEVICES != "" and data.values.VSPHERE_CONTROL_PLANE_PCI_DEVICES != None: - #@overlay/match missing_ok=True - pciDevices: #@ get_pci_devices(data.values.VSPHERE_CONTROL_PLANE_PCI_DEVICES, data.values.VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST) -#@ end -#@ if data.values.VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS != "" and data.values.VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS != None: - #@overlay/match missing_ok=True - customVMXKeys: #@ get_custom_keys(data.values.VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS) -#@ end - resourcePool: #@ data.values.VSPHERE_RESOURCE_POOL - server: #@ data.values.VSPHERE_SERVER - template: #@ data.values.VSPHERE_TEMPLATE -#@ if data.values.VSPHERE_CONTROL_PLANE_HARDWARE_VERSION != "" and data.values.VSPHERE_CONTROL_PLANE_HARDWARE_VERSION != None: - #@overlay/match missing_ok=True - hardwareVersion: #@ data.values.VSPHERE_CONTROL_PLANE_HARDWARE_VERSION -#@ end - -#@overlay/match by=overlay.subset({"kind": "VSphereMachineTemplate", "metadata":{"name": "${ CLUSTER_NAME }-worker"}}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: #@ "{}-worker".format(data.values.CLUSTER_NAME) - #@overlay/match missing_ok=True - annotations: - vmTemplateMoid: #@ data.values.VSPHERE_TEMPLATE_MOID -spec: - template: - spec: - cloneMode: #@ data.values.VSPHERE_CLONE_MODE - datacenter: #@ data.values.VSPHERE_DATACENTER - datastore: #@ data.values.VSPHERE_DATASTORE - storagePolicyName: #@ data.values.VSPHERE_STORAGE_POLICY_ID - diskGiB: #@ data.values.VSPHERE_WORKER_DISK_GIB - folder: #@ data.values.VSPHERE_FOLDER - memoryMiB: #@ data.values.VSPHERE_WORKER_MEM_MIB - network: - devices: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - networkName: #@ data.values.VSPHERE_NETWORK - #@ if data.values.WORKER_NODE_NAMESERVERS: - nameservers: #@ data.values.WORKER_NODE_NAMESERVERS.replace(" ", "").split(",") - #@ end - #@ if data.values.TKG_IP_FAMILY == "ipv6": - dhcp6: true - #@ elif data.values.TKG_IP_FAMILY in ["ipv4,ipv6", "ipv6,ipv4"]: - dhcp4: true - dhcp6: true - #@ else: - dhcp4: true - #@ end - numCPUs: #@ data.values.VSPHERE_WORKER_NUM_CPUS -#@ if data.values.VSPHERE_WORKER_PCI_DEVICES != "" and data.values.VSPHERE_WORKER_PCI_DEVICES != None: - #@overlay/match missing_ok=True - pciDevices: #@ get_pci_devices(data.values.VSPHERE_WORKER_PCI_DEVICES, data.values.VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST) -#@ end -#@ if data.values.VSPHERE_WORKER_CUSTOM_VMX_KEYS != "" and data.values.VSPHERE_WORKER_CUSTOM_VMX_KEYS != None: - #@overlay/match missing_ok=True - customVMXKeys: #@ get_custom_keys(data.values.VSPHERE_WORKER_CUSTOM_VMX_KEYS) -#@ end - resourcePool: #@ data.values.VSPHERE_RESOURCE_POOL - server: #@ data.values.VSPHERE_SERVER - template: #@ data.values.VSPHERE_TEMPLATE -#@ if data.values.VSPHERE_WORKER_HARDWARE_VERSION != "" and data.values.VSPHERE_WORKER_HARDWARE_VERSION != None: - #@overlay/match missing_ok=True - hardwareVersion: #@ data.values.VSPHERE_WORKER_HARDWARE_VERSION -#@ end - -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -metadata: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) -spec: - machineTemplate: - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) - kubeadmConfigSpec: - initConfiguration: - #@ if (not data.values.AVI_CONTROL_PLANE_HA_PROVIDER) and data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - localAPIEndpoint: - #@ if data.values.TKG_IP_FAMILY in ["ipv6", "ipv6,ipv4"]: - advertiseAddress: '::/0' - #@ else: - advertiseAddress: '0.0.0.0' - #@ end - bindPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - joinConfiguration: - #@ if (not data.values.AVI_CONTROL_PLANE_HA_PROVIDER) and data.values.CLUSTER_API_SERVER_PORT: - #@overlay/match missing_ok=True - controlPlane: - localAPIEndpoint: - #@ if data.values.TKG_IP_FAMILY in ["ipv6", "ipv6,ipv4"]: - advertiseAddress: '::/0' - #@ else: - advertiseAddress: '0.0.0.0' - #@ end - bindPort: #@ data.values.CLUSTER_API_SERVER_PORT - #@ end - clusterConfiguration: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.imageRepository) - etcd: - local: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local.imageRepository) - imageTag: #@ bomDataForK8sVersion.kubeadmConfigSpec.etcd.local.imageTag - #@ if getattr(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local, "extraArgs", None) != None: - #@overlay/match missing_ok=True - extraArgs: - #@ for key in bomDataForK8sVersion.kubeadmConfigSpec.etcd.local["extraArgs"]: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - (@= key @): #@ "{}".format(bomDataForK8sVersion.kubeadmConfigSpec.etcd.local["extraArgs"][key]).lower() - #@ end - #@ end - dns: - imageRepository: #@ kubeadm_image_repo(bomDataForK8sVersion.kubeadmConfigSpec.dns.imageRepository) - imageTag: #@ bomDataForK8sVersion.kubeadmConfigSpec.dns.imageTag - #@ if data.values.TKG_IP_FAMILY == "ipv6,ipv4": - apiServer: - extraArgs: - #@overlay/match missing_ok=True - advertise-address: #@ data.values.VSPHERE_CONTROL_PLANE_ENDPOINT - #@overlay/match missing_ok=True - bind-address: "::" - controllerManager: - extraArgs: - #@overlay/match missing_ok=True - bind-address: "::" - scheduler: - extraArgs: - #@overlay/match missing_ok=True - bind-address: "::" - #@ end - files: - #@ if not data.values.AVI_CONTROL_PLANE_HA_PROVIDER: - #@overlay/match by=overlay.index(0) - - content: #@ yaml.encode(kube_vip_pod()) - #@ else: - #@overlay/match by=overlay.index(0) - #@overlay/remove - - content: - #@ end - #@ if data.values.TKG_IP_FAMILY in ["ipv6", "ipv6,ipv4"] and compare_semver_versions(tkrVersion, "v1.22.8") >= 0: - #@overlay/append - - content: "" - owner: root:root - path: /etc/sysconfig/kubelet - permissions: "0640" - #@ end - users: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - name: capv - sshAuthorizedKeys: - - #@ data.values.VSPHERE_SSH_AUTHORIZED_KEY - sudo: ALL=(ALL) NOPASSWD:ALL - #! When using kube-vip as the control plane endpoint provider with IPv6 as - #! the primary IP family, set the node ip in /etc/hosts for kubelet to - #! discover so so that host network pods do not get the kube-vip address as - #! their pod IP. - #! See: https://github.com/vmware-tanzu/tanzu-framework/issues/2098 - #@ if data.values.TKG_IP_FAMILY in ["ipv6", "ipv6,ipv4"]: - preKubeadmCommands: - - echo "::1 localhost" >> /etc/hosts - #@ if not data.values.AVI_CONTROL_PLANE_HA_PROVIDER and compare_semver_versions(tkrVersion, "v1.22.8") >= 0: - #@overlay/append - - "echo \"$(ip -6 -json addr show dev eth0 scope global | jq -r .[0].addr_info[0].local) $(hostname)\" >> /etc/hosts" - #@ end - #@ end - replicas: #@ data.values.CONTROL_PLANE_MACHINE_COUNT - version: #@ data.values.KUBERNETES_VERSION - -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate", "metadata":{"name": "${ CLUSTER_NAME }-md-0"}}) ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - template: - spec: - #@ if data.values.TKG_IP_FAMILY == "ipv6,ipv4": - joinConfiguration: - nodeRegistration: - kubeletExtraArgs: - #@overlay/match missing_ok=True - node-ip: "::" - #@ end - users: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - name: capv - sshAuthorizedKeys: - - #@ data.values.VSPHERE_SSH_AUTHORIZED_KEY - sudo: ALL=(ALL) NOPASSWD:ALL - #@ if data.values.TKG_IP_FAMILY in ["ipv6", "ipv6,ipv4"]: - preKubeadmCommands: - - echo "::1 localhost" >> /etc/hosts - #@ end - -#@overlay/match by=overlay.subset({"kind":"MachineDeployment", "metadata":{"name": "${ CLUSTER_NAME }-md-0"}}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT - selector: - matchLabels: {} - #@ if data.values.WORKER_ROLLOUT_STRATEGY: - strategy: - type: #@ verify_and_configure_machine_deployment_rollout_strategy(data.values.WORKER_ROLLOUT_STRATEGY) - #@ end - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - bootstrap: - configRef: - name: #@ "{}-md-0".format(data.values.CLUSTER_NAME) - clusterName: #@ data.values.CLUSTER_NAME - infrastructureRef: - name: #@ "{}-worker".format(data.values.CLUSTER_NAME) - version: #@ data.values.KUBERNETES_VERSION - #@overlay/match missing_ok=True - #@ if data.values.VSPHERE_AZ_0: - failureDomain: #@ data.values.VSPHERE_AZ_0 - #@ end - -#@overlay/match by=overlay.subset({"kind": "Secret", "metadata":{"name": "${ CLUSTER_NAME }"}}) ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ data.values.CLUSTER_NAME -stringData: - username: #@ data.values.VSPHERE_USERNAME - password: #@ data.values.VSPHERE_PASSWORD -#@ end diff --git a/providers/infrastructure-vsphere/v1.5.3/yttcc/base-template.yaml b/providers/infrastructure-vsphere/v1.5.3/yttcc/base-template.yaml deleted file mode 100644 index ab90625c27..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/yttcc/base-template.yaml +++ /dev/null @@ -1,33 +0,0 @@ -#@ load("@ytt:data", "data") ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ data.values.CLUSTER_NAME -stringData: - username: #@ data.values.VSPHERE_USERNAME - password: #@ data.values.VSPHERE_PASSWORD ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: ${CLUSTER_NAME} - labels: - tkg.tanzu.vmware.com/cluster-name: '${ CLUSTER_NAME }' -spec: - clusterNetwork: - pods: - cidrBlocks: ["${CLUSTER_CIDR}"] - services: - cidrBlocks: ["${SERVICE_CIDR}"] - topology: - class: tkg-cluster-class-dev - version: v1.21.2 - controlPlane: - replicas: ${CONTROL_PLANE_MACHINE_COUNT} - workers: - machineDeployments: - - class: tkg-worker - name: tkg-worker-pool - replicas: ${WORKER_MACHINE_COUNT} - variables: diff --git a/providers/infrastructure-vsphere/v1.5.3/yttcc/overlay.yaml b/providers/infrastructure-vsphere/v1.5.3/yttcc/overlay.yaml deleted file mode 100644 index 3185557ae4..0000000000 --- a/providers/infrastructure-vsphere/v1.5.3/yttcc/overlay.yaml +++ /dev/null @@ -1,145 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "get_default_tkg_bom_data", "kubeadm_image_repo", "get_image_repo_for_component", "get_vsphere_thumbprint","get_tkr_version_from_tkr_name") - -#@ load("lib/validate.star", "validate_configuration") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/config_variable_association.star", "config_variable_association", "get_vsphere_vars") -#@ validate_configuration("vsphere") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() -#@ bomData = get_default_tkg_bom_data() -#@ tkrVersion = get_tkr_version_from_tkr_name(data.values.KUBERNETES_RELEASE) - -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: #@ data.values.CLUSTER_NAME - #@ if data.values.VSPHERE_CONTROL_PLANE_ENDPOINT: - #@overlay/match missing_ok=True - annotations: - tkg.tanzu.vmware.com/cluster-controlplane-endpoint: #@ data.values.VSPHERE_CONTROL_PLANE_ENDPOINT - #@ end - labels: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - cluster-role.tkg.tanzu.vmware.com/(@= data.values.TKG_CLUSTER_ROLE @): "" - #@ end - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME -spec: - clusterNetwork: - pods: - #@overlay/replace - cidrBlocks: #@ data.values.CLUSTER_CIDR.split(",") - services: - #@overlay/replace - cidrBlocks: #@ data.values.SERVICE_CIDR.split(",") - topology: - class: #@ data.values.CLUSTER_CLASS - version: #@ tkrVersion - controlPlane: - replicas: #@ data.values.CONTROL_PLANE_MACHINE_COUNT - #@overlay/match missing_ok=True - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: #@ "image-type=ova,os-name={}".format(data.values.OS_NAME) - workers: - machineDeployments: - #@ if not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: - #@overlay/match by=overlay.index(0) - - class: tkg-worker - name: md-0 - #@overlay/match missing_ok=True - #@ if data.values.CLUSTER_PLAN == "prodcc": - replicas: #@ data.values.WORKER_MACHINE_COUNT_0 - #@ else: - replicas: #@ data.values.WORKER_MACHINE_COUNT - #@ end - #@overlay/match missing_ok=True - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: #@ "image-type=ova,os-name={}".format(data.values.OS_NAME) - #@ if data.values.VSPHERE_AZ_0: - #@overlay/match missing_ok=True - failureDomain: #@ data.values.VSPHERE_AZ_0 - #@ end - #@ if data.values.CLUSTER_PLAN == "prodcc": - #@overlay/append - - class: tkg-worker - name: md-1 - replicas: #@ data.values.WORKER_MACHINE_COUNT_1 - #@overlay/match missing_ok=True - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: #@ "image-type=ova,os-name={}".format(data.values.OS_NAME) - #@ if data.values.VSPHERE_AZ_1: - failureDomain: #@ data.values.VSPHERE_AZ_1 - #@ end - #@overlay/append - - class: tkg-worker - name: md-2 - replicas: #@ data.values.WORKER_MACHINE_COUNT_2 - #@overlay/match missing_ok=True - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: #@ "image-type=ova,os-name={}".format(data.values.OS_NAME) - #@ if data.values.VSPHERE_AZ_2: - failureDomain: #@ data.values.VSPHERE_AZ_2 - #@ end - #@ end - #@ else: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - class: tkg-worker-windows - name: md-0 - #@overlay/match missing_ok=True - #@ if data.values.CLUSTER_PLAN == "prodcc": - replicas: #@ data.values.WORKER_MACHINE_COUNT_0 - #@ else: - replicas: #@ data.values.WORKER_MACHINE_COUNT - #@ end - #@overlay/match missing_ok=True - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: image-type=ova,os-name=windows - #@ if data.values.VSPHERE_AZ_0: - #@overlay/match missing_ok=True - failureDomain: #@ data.values.VSPHERE_AZ_0 - #@ end - #@ if data.values.CLUSTER_PLAN == "prodcc": - #@overlay/append - - class: tkg-worker-windows - name: md-1 - replicas: #@ data.values.WORKER_MACHINE_COUNT_1 - #@overlay/match missing_ok=True - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: image-type=ova,os-name=windows - #@ if data.values.VSPHERE_AZ_1: - failureDomain: #@ data.values.VSPHERE_AZ_1 - #@ end - #@overlay/append - - class: tkg-worker-windows - name: md-2 - replicas: #@ data.values.WORKER_MACHINE_COUNT_2 - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: image-type=ova,os-name=windows - #@ if data.values.VSPHERE_AZ_2: - failureDomain: #@ data.values.VSPHERE_AZ_2 - #@ end - #@ end - #@ end - #@overlay/match missing_ok=True - variables: - #@ vars = get_vsphere_vars() - #@ for configVariable in vars: - #@ if vars[configVariable] != None and configVariable in ["additionalImageRegistries","workerKubeletExtraArgs","controlPlaneKubeletExtraArgs","kubeControllerManagerExtraArgs","kubeSchedulerExtraArgs","apiServerExtraArgs","etcdExtraArgs", "apiServerPort", "controlPlane", "worker", "vcenter", "VSPHERE_WINDOWS_TEMPLATE", "cni", "apiServerEndpoint", "network", "imageRepository", "trust", "user", "auditLogging", "aviAPIServerHAProvider", "ntpServers", "TKR_DATA", "proxy", "kubeVipLoadBalancerProvider", "additionalFQDN", "controlPlaneCertificateRotation", "podSecurityStandard", "eventRateLimitConf", "customTDNFRepository", "pci"]: - - name: #@ configVariable - value: #@ vars[configVariable] - #@ end - #@ end diff --git a/providers/infrastructure-vsphere/ytt/vsphere-overlay.yaml b/providers/infrastructure-vsphere/ytt/vsphere-overlay.yaml deleted file mode 100644 index 01912c1d48..0000000000 --- a/providers/infrastructure-vsphere/ytt/vsphere-overlay.yaml +++ /dev/null @@ -1,224 +0,0 @@ -#! Please add any overlays specific to vSphere provider under this file. -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - - -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "get_default_tkg_bom_data", "kubeadm_image_repo", "get_image_repo_for_component", "get_vsphere_thumbprint") - -#@ load("lib/validate.star", "validate_configuration") -#@ load("@ytt:yaml", "yaml") -#@ validate_configuration("vsphere") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - -#@ if data.values.CLUSTER_PLAN == "prod" and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: -#@overlay/match by=overlay.subset({"kind":"VSphereCluster"}) ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereCluster -metadata: - name: #@ data.values.CLUSTER_NAME -spec: - thumbprint: #@ get_vsphere_thumbprint() - server: #@ data.values.VSPHERE_SERVER - identityRef: - kind: Secret - name: #@ data.values.CLUSTER_NAME ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) - #@overlay/match missing_ok=True - annotations: - vmTemplateMoid: #@ data.values.VSPHERE_TEMPLATE_MOID -spec: - template: - spec: - cloneMode: #@ data.values.VSPHERE_CLONE_MODE - datacenter: #@ data.values.VSPHERE_DATACENTER - datastore: #@ data.values.VSPHERE_DATASTORE - storagePolicyName: #@ data.values.VSPHERE_STORAGE_POLICY_ID - diskGiB: #@ data.values.VSPHERE_WORKER_DISK_GIB - folder: #@ data.values.VSPHERE_FOLDER - memoryMiB: #@ data.values.VSPHERE_WORKER_MEM_MIB - network: - devices: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - networkName: #@ data.values.VSPHERE_NETWORK - #@ if data.values.WORKER_NODE_NAMESERVERS: - nameservers: #@ data.values.WORKER_NODE_NAMESERVERS.replace(" ", "").split(",") - #@ end - #@ if data.values.TKG_IP_FAMILY == "ipv6": - dhcp6: true - #@ elif data.values.TKG_IP_FAMILY in ["ipv4,ipv6", "ipv6,ipv4"]: - dhcp4: true - dhcp6: true - #@ else: - dhcp4: true - #@ end - numCPUs: #@ data.values.VSPHERE_WORKER_NUM_CPUS - resourcePool: #@ data.values.VSPHERE_RESOURCE_POOL - server: #@ data.values.VSPHERE_SERVER - template: #@ data.values.VSPHERE_TEMPLATE ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: VSphereMachineTemplate -metadata: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) - #@overlay/match missing_ok=True - annotations: - vmTemplateMoid: #@ data.values.VSPHERE_TEMPLATE_MOID -spec: - template: - spec: - cloneMode: #@ data.values.VSPHERE_CLONE_MODE - datacenter: #@ data.values.VSPHERE_DATACENTER - datastore: #@ data.values.VSPHERE_DATASTORE - storagePolicyName: #@ data.values.VSPHERE_STORAGE_POLICY_ID - diskGiB: #@ data.values.VSPHERE_WORKER_DISK_GIB - folder: #@ data.values.VSPHERE_FOLDER - memoryMiB: #@ data.values.VSPHERE_WORKER_MEM_MIB - network: - devices: - #@overlay/match by=overlay.index(0) - #@overlay/replace - - networkName: #@ data.values.VSPHERE_NETWORK - #@ if data.values.WORKER_NODE_NAMESERVERS: - nameservers: #@ data.values.WORKER_NODE_NAMESERVERS.replace(" ", "").split(",") - #@ end - #@ if data.values.TKG_IP_FAMILY == "ipv6": - dhcp6: true - #@ elif data.values.TKG_IP_FAMILY in ["ipv4,ipv6", "ipv6,ipv4"]: - dhcp4: true - dhcp6: true - #@ else: - dhcp4: true - #@ end - numCPUs: #@ data.values.VSPHERE_WORKER_NUM_CPUS - resourcePool: #@ data.values.VSPHERE_RESOURCE_POOL - server: #@ data.values.VSPHERE_SERVER - template: #@ data.values.VSPHERE_TEMPLATE ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT_1 - selector: - matchLabels: {} - template: - metadata: - labels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - bootstrap: - configRef: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) - clusterName: #@ data.values.CLUSTER_NAME - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) - version: #@ data.values.KUBERNETES_VERSION - #@ if data.values.VSPHERE_AZ_1: - failureDomain: #@ data.values.VSPHERE_AZ_1 - #@ end ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - replicas: #@ data.values.WORKER_MACHINE_COUNT_2 - selector: - matchLabels: {} - template: - metadata: - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - spec: - bootstrap: - configRef: - apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 - kind: KubeadmConfigTemplate - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) - clusterName: #@ data.values.CLUSTER_NAME - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - kind: VSphereMachineTemplate - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) - version: #@ data.values.KUBERNETES_VERSION - #@ if data.values.VSPHERE_AZ_2: - failureDomain: #@ data.values.VSPHERE_AZ_2 - #@ end ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-1".format(data.values.CLUSTER_NAME) - namespace: '${ NAMESPACE }' -spec: - template: - spec: - useExperimentalRetryJoin: true - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - cloud-provider: external - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - name: '{{ ds.meta_data.hostname }}' - preKubeadmCommands: - - hostname "{{ ds.meta_data.hostname }}" - - echo "::1 ipv6-localhost ipv6-loopback" >/etc/hosts - - echo "127.0.0.1 localhost" >>/etc/hosts - - echo "127.0.0.1 {{ ds.meta_data.hostname }}" >>/etc/hosts - - echo "{{ ds.meta_data.hostname }}" >/etc/hostname - files: [] - users: - - name: capv - sshAuthorizedKeys: - - #@ data.values.VSPHERE_SSH_AUTHORIZED_KEY - sudo: ALL=(ALL) NOPASSWD:ALL ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -metadata: - name: #@ "{}-md-2".format(data.values.CLUSTER_NAME) - namespace: '${ NAMESPACE }' -spec: - template: - spec: - useExperimentalRetryJoin: true - joinConfiguration: - nodeRegistration: - criSocket: /var/run/containerd/containerd.sock - kubeletExtraArgs: - cloud-provider: external - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - name: '{{ ds.meta_data.hostname }}' - preKubeadmCommands: - - hostname "{{ ds.meta_data.hostname }}" - - echo "::1 ipv6-localhost ipv6-loopback" >/etc/hosts - - echo "127.0.0.1 localhost" >>/etc/hosts - - echo "127.0.0.1 {{ ds.meta_data.hostname }}" >>/etc/hosts - - echo "{{ ds.meta_data.hostname }}" >/etc/hostname - files: [] - users: - - name: capv - sshAuthorizedKeys: - - #@ data.values.VSPHERE_SSH_AUTHORIZED_KEY - sudo: ALL=(ALL) NOPASSWD:ALL -#@ end diff --git a/providers/infrastructure-vsphere/yttcc/vsphere-overlay.yaml b/providers/infrastructure-vsphere/yttcc/vsphere-overlay.yaml deleted file mode 100644 index 41ae083c67..0000000000 --- a/providers/infrastructure-vsphere/yttcc/vsphere-overlay.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#! Please add any overlays specific to vSphere provider under this file. -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - - -#@ load("lib/helpers.star", "get_bom_data_for_tkr_name", "get_default_tkg_bom_data", "kubeadm_image_repo", "get_image_repo_for_component", "get_vsphere_thumbprint") - -#@ load("lib/validate.star", "validate_configuration") -#@ load("@ytt:yaml", "yaml") -#@ validate_configuration("vsphere") - -#@ bomDataForK8sVersion = get_bom_data_for_tkr_name() - diff --git a/providers/kapp-controller-values/datavalues.yaml b/providers/kapp-controller-values/datavalues.yaml deleted file mode 100644 index b9d07e5223..0000000000 --- a/providers/kapp-controller-values/datavalues.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#@ load("@ytt:template", "template") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("kapp-controller_data.lib.yaml", "kappcontrollerdatavalues") - ---- #@ template.replace(kappcontrollerdatavalues()) - diff --git a/providers/kapp-controller-values/helpers.star b/providers/kapp-controller-values/helpers.star deleted file mode 100644 index 2283d11d30..0000000000 --- a/providers/kapp-controller-values/helpers.star +++ /dev/null @@ -1,57 +0,0 @@ -#! This file implements helper function needed to create kapp-controller-values file. -#! Note: This is file implements/copies function implemented in ytt/lib/helpers.star file -#! Any changes affecting this helper functions need to be done at both the places - -load("@ytt:data", "data") -load("@ytt:regexp", "regexp") - -def tkg_image_repo_customized(): - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY != "" -end - -def tkg_image_repo_skip_tls_verify(): - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY == True and tkg_image_repo_customized() -end - -def tkg_image_repo_ca_cert(): - return data.values.TKG_PROXY_CA_CERT if data.values.TKG_PROXY_CA_CERT else data.values.TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE -end - -def tkg_custom_image_repo_hostname(): - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY.split("/")[0] -end - -def get_no_proxy(): - if data.values.TKG_HTTP_PROXY != "": - full_no_proxy_list = [] - if data.values.TKG_NO_PROXY != "": - # trim space in the no_proxy list - full_no_proxy_list = regexp.replace(" ", data.values.TKG_NO_PROXY, "").split(",") - end - if data.values.PROVIDER_TYPE == "aws": - if data.values.AWS_VPC_CIDR != "": - full_no_proxy_list.append(data.values.AWS_VPC_CIDR) - end - full_no_proxy_list.append("169.254.0.0/16") - end - if data.values.PROVIDER_TYPE == "azure": - if data.values.AZURE_VNET_CIDR != "": - full_no_proxy_list.append(data.values.AZURE_VNET_CIDR) - end - full_no_proxy_list.append("169.254.0.0/16") - full_no_proxy_list.append("168.63.129.16") - end - full_no_proxy_list.append(data.values.SERVICE_CIDR) - full_no_proxy_list.append(data.values.CLUSTER_CIDR) - full_no_proxy_list.append("localhost") - full_no_proxy_list.append("127.0.0.1") - if data.values.TKG_IP_FAMILY in ["ipv6", "ipv4,ipv6", "ipv6,ipv4"]: - full_no_proxy_list.append("::1") - end - full_no_proxy_list.append(".svc") - full_no_proxy_list.append(".svc.cluster.local") - populated_no_proxy = ",".join(list(set(full_no_proxy_list))) - return populated_no_proxy - end - return "" -end diff --git a/providers/kapp-controller-values/kapp-controller_data.lib.yaml b/providers/kapp-controller-values/kapp-controller_data.lib.yaml deleted file mode 100644 index f307a7192c..0000000000 --- a/providers/kapp-controller-values/kapp-controller_data.lib.yaml +++ /dev/null @@ -1,53 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:base64", "base64") -#@ load("helpers.star", "get_no_proxy", "tkg_image_repo_ca_cert", "tkg_image_repo_skip_tls_verify", "tkg_custom_image_repo_hostname") - -#@ def kappcontrollerdatavalues(): ---- -namespace: tkg-system -nodeSelector: - node-role.kubernetes.io/control-plane: "" -deployment: - updateStrategy: null - rollingUpdate: - maxUnavailable: null - maxSurge: null -daemonset: - updateStrategy: null -kappController: - namespace: tkg-system - createNamespace: true - globalNamespace: tkg-system - deployment: - concurrency: 4 - coreDNSIP: #@ data.values.CORE_DNS_IP - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - config: - #@ if tkg_image_repo_ca_cert(): - caCerts: #@ base64.decode(tkg_image_repo_ca_cert()) - #@ end - #@ if data.values.TKG_HTTP_PROXY: - httpProxy: #@ data.values.TKG_HTTP_PROXY - httpsProxy: #@ data.values.TKG_HTTPS_PROXY - noProxy: #@ get_no_proxy() - #@ end - #@ if tkg_image_repo_skip_tls_verify(): - dangerousSkipTLSVerify: #@ tkg_custom_image_repo_hostname() - #@ end -#@ end diff --git a/providers/kapp-controller-values/values.yaml b/providers/kapp-controller-values/values.yaml deleted file mode 100644 index 9606ac4bfa..0000000000 --- a/providers/kapp-controller-values/values.yaml +++ /dev/null @@ -1,20 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -CORE_DNS_IP: - -TKG_HTTP_PROXY: -TKG_HTTPS_PROXY: -TKG_NO_PROXY: -TKG_PROXY_CA_CERT: - -TKG_CUSTOM_IMAGE_REPOSITORY: -TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: -TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: - -PROVIDER_TYPE: -AWS_VPC_CIDR: -AZURE_VNET_CIDR: -SERVICE_CIDR: -CLUSTER_CIDR: -TKG_IP_FAMILY: diff --git a/providers/providers.sha256sum b/providers/providers.sha256sum deleted file mode 100644 index 23df36bdf1..0000000000 --- a/providers/providers.sha256sum +++ /dev/null @@ -1 +0,0 @@ -4c734180264195e22c59e938fe558a66aa3bf80c8fe151d5a401dc431488aa1d diff --git a/providers/tests/README.md b/providers/tests/README.md deleted file mode 100644 index a67646b971..0000000000 --- a/providers/tests/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Tests for YTT Cluster templates - -This directory is a standalone toolkit for validating the cluster templates that are generated by tanzu-framework. - -Validating these YTT templates generally involves: - -- using `clustergen` to compare a broad range of parametric variations for regressions in the expected behaviour after configuration changes that isn't explicitly tested. - -- using the newer, unit test module, which specifically can test your cluster's generation with YTT inputs and bespoke configurations in a unified way. - -## Clustergen tests - -These tests run automatically for you in CI, changing many different types of parameters, storing resulting cluster templates, and then comparing how your new framework PR modifies cluster Yaml compared with the previous commit. These generally can give you hints at unintended changes you made, for more details, look in the clustergen directory. - -## Unit tests - -The unit tests in this repository can be run like so: - -```bash -cd providers/tests/ -go test -timeout 30s -run ^TestUnit$ github.com/vmware-tanzu/tanzu-framework/providers/tests/unit/matchers -``` - -You can write an end to end unit test by: - -- Importing YTT values required for your cluster overlay. - -- Invoking the various YTT files required to make a cluster, simulating the normal behaviour of tanzu cli. - -## Input tkr and tkg boms - -There are TKR and TKG bom files that are inluded in this directory for isolated testing purposes. -They may need periodic updates, in a manner similar to that of the `config_variable_association.star` files in other parts of this repository. - -### Examples - -- For a "full cluster template" test, see the windows_test.go, which generates a full windows cluster from YTT and then verifies the top level topology of CAPI components. -- For a more targeted test example of how a specific YTT module is behaving, see the ip_family tests, which verify the behaviour of YTT transformations that occur for various networking related functionality. diff --git a/providers/tests/clustergen/README.md b/providers/tests/clustergen/README.md deleted file mode 100644 index d50cc9ecb8..0000000000 --- a/providers/tests/clustergen/README.md +++ /dev/null @@ -1,183 +0,0 @@ -# Cluster Generation Compliance Tests - -## Introduction - -The purpose of these tests is to verify that CLI / cluster template changes -produces the desired effect on the generated TKG cluster YAML docset. - -This is done by comparing the generated output of each cluster creation attempt -in the dataset against their expected results. - -The dataset corresponds to a collection of "tkg config cluster ...." commands -with various arguments. - -A reasonably small dataset generated via the pairwise combinatorial testing -tool (PICT) provides good coverage of all supported configuration variables and -command line options across each provider version. - -## Prerequisite - -Install PyYAML: - -```sh -pip3 install PyYAML -``` - -## Running tests - -Run cluster generation tests - -```sh -make generate-testcases cluster-generation-tests -``` - -This will build a test binary capable of generating cluster configuration. This -binary will then be used to produce cluster configurations using various test data -These outputs, saved in testdata/generatd, can now be review for -discrepancies. - -## Running A/B comparison tests - -The above test workflow is the basis for comparing cluster generation outputs -produced by different commits of the repository. -Suppose you have a local branch with changes rebased off the top of origin/main - -from the top level directory of the repository, do: - -```sh -export CLUSTERGEN_BASE=`git ref-parse origin/main` -make clustergen -``` - -This will: - -- generate a set of test configurations using the latest model files in HEAD -- build two test binaries, one off HEAD and one off commit set to -${CLUSTERGEN_BASE}, and produce cluster configuration based on the set of test -onfigurations with each binary. -- produce a diff between the two sets of cluster configuration outputs - -One can use this approach to review the effect of changes in one's local branch -on how cluster configurations are affected, and is usually more effective than -reviewing the outputs from ```make cluster-generation-tests``` directly. - -## Checklist when making changes affecting user visible changes to cluster creation - -These changes can be: - -1. Updates to the cluster generation logic in tkg (these should be uncommon) -1. Provider template additions/changes - -### Dealing with cluster creation code and template changes - -Under some circumstances to get proper coverage on these changes, an updated -(most likely expanded) set of test cases should be generated with -[PICT](https://github.com/microsoft/pict) along with these changes. - -You can build pict from the github source, or download a copy from - -1. [MacOS](https://storage.googleapis.com/clustergen-tools/pict/pict.darwin) -1. [Linux](https://storage.googleapis.com/clustergen-tools/pict/pict.linux) - -```sh -make generate-testcases -``` - -if PICT tool is not in PATH, - -```sh -make PICT=location_of_pict_binary generate-testcases -``` - -What test cases are generated is determined by the contents of the model -files in the param_models/ directory. See "Updating Parameter Model Files" -for more details. - -### Updating Parameter Model Files - -Full documentation on the format and capabilities of the model files are in -[the PICT docs](https://github.com/Microsoft/pict/blob/master/doc/pict.md). - -To partition the test cases by provider type, a file per provider is provided -in the param_models/ directory. During "make generate-testcase" PICT processes -every file. The outputs of these runs are cleansed into a parsable CSV format. - -Each line in the CSV files is turned into a DDDDDDDD.case test case file -containing the command line args and config values to use during the cluster -config generation. Some "special" values in the model files encodes specific -situations, namely: - -```sh ---X: "NOTPROVIDED" -``` - -if a value is assign as NOTPROVIDED for a CLI arg --X, --X will not be provided -in the command line invocation. - -```sh -VAR: "''" -``` - -if a value is assign as '' - -```sh -VAR: '' -``` - -will be written to the tkg config file used in the cluster generation - -```sh -VAR: "NA" -``` - -if a value is assign as NA, the VAR configuration value will not be present in -the tkg config file used in the cluster generation. - -```sh -VAR: "80" -VAR: "443" -``` - -Note numeric values should be quoted in the model file as well. - -### Additional notes/tips - -Since ytt-based templates has a potential to make cross-version, even -cross-provider changes, pay special attention to whether the changes affected -the expected number of providers and versions. - -### Balancing test coverage with the number of test cases - -When introducing **optional** args/config variables, one should avoid modifying -the main set of param model files (those name cluster_(infratype).model), which -are responsible for the bulk of the test cases generated. The reasoning here is -that any working configuration among the test cases generated from these will -continue to work precisely because these new args/config variables are -optional. Outputs from these existing test cases will in fact highlight the -differences caused by the upcoming change handling these new settings using -default values because none are specified. (We suggest reviewing these changes -first before proceeding to creating/modifying test cases.) - -Next, new test cases can then be generated from more targeted model files (an -example of which is cluster_optional.model). The purpose of these files are to - -1. introduce different values for the new options to be tested -1. keep variation in the configuration aspects that are already thoroughly - covered by the test cases generated from the main model files to an absolute - minimum -1. provide mostly legitimate values for all non-optional parameters for all - target infrastructures if the changes being tested are infra-agnostic - -Combine testing of multiple sets of optional args when possible to further -reduce the number of test cases while promoting the testing of cross-feature -interaction. When not possible, new model files can be used for other test -scenarios. The only requirement is that these files are placed in param_models/ -and are named cluster_[a-zA-Z_]+.model - -In some cases, when several config variables introduced have interdependencies, -constraint statements may have to be introduced in the model file to minimize -the likelihood of incompatible combinations of values being generated. - -Using these separate model files has the effect of providing more targeted -testing of the new features without altering too many existing test cases or -generating too many new ones. diff --git a/providers/tests/clustergen/README_ccgen.md b/providers/tests/clustergen/README_ccgen.md deleted file mode 100644 index 522ffc18bd..0000000000 --- a/providers/tests/clustergen/README_ccgen.md +++ /dev/null @@ -1,56 +0,0 @@ -# Cluster-Class Cluster Generation Comparison System - -## Introduction - -The clustergen tool has been augmented with the ability to generate cluster -resources using the old (pure client-side ytt-processing) and the new -(clusterclass-based using dryrun functionality) from the same set of cluster -configuration file - -```text -make clustergen -``` - -produces two sets of outputs for each set of cluster configuration cases, -cleanses and normalizes the yaml, then generates diffs between the two sets of -outputs. This is used to gauge the degree to compatibility of the -clusterclass-based generation compared to the old outputs as we iterate on the -clusterclass authoring. - -Note: the tool requires a modified version of clusterctl CLI that includes -a 'alpha topology-dryrun' and a new 'alpha generate-normalized-topology' -commands, buildable with `make clustectl` from - -The branch will be periodically updated to bring in any relevant changes -upstream. The customizations allows for output that is more deterministic and -diff-friendly and compared against old outputs. - -To limit the set of test cases to run this tool with, the CASES envvar can be -set to a space delimited set of dddddddd.case names found in the testdata/ -directory. - -e.g. this picks the first 10 cases using the azure infra -export CASES=$(for i in `grep azure:v1. testdata/*.case | \ - cut -d: -f1 | uniq | cut -d/ -f7 | head -10`; do echo -n "$i "; done; echo) - -## Details on dry-run generation of ClusterClass-based configuration - -Since the clustergen tests are expected to generate configuration entirely -client-side, we need a means to generate cluster resources that would be as -close an approximation of what the server will generate for a CC-based Cluster -configuration, without standing up the server at all! - -To do this we need to do the following only during the running of clustergen: - -1. access the cluster class definition and templates client side -2. simulate any server-side data injection into the Cluster object that any - CC patches would need to access - -Item 1 is done by adding the cconly/ directory into the list of locations used -generation of clusterclass resources locally via the ytt processor. The -processor accomplishes this via processing the clusterclass-tkg-(infra)-default.yaml -template. Note that this is a reason why CC-specific files that are already -bundled into a Carvel package are still present in the providers/ directory) - -Item 2 is accomplished via hard-coding some values for the Cluster's TKR_DATA -variable (in run_tests.sh) diff --git a/providers/tests/clustergen/bom/tkg-bom-v1.3.1-zlatest.yaml b/providers/tests/clustergen/bom/tkg-bom-v1.3.1-zlatest.yaml deleted file mode 100644 index 56829f77ad..0000000000 --- a/providers/tests/clustergen/bom/tkg-bom-v1.3.1-zlatest.yaml +++ /dev/null @@ -1,388 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha1 -default: - k8sVersion: v1.20.5+vmware.1-tkg.1-zlatest -release: - version: v1.3.1-zlatest -components: - aad-pod-identity: - - version: v1.6.3+vmware.1 - images: - micImage: - imagePath: cluster-api/mic - tag: v1.6.3_vmware.1 - nmiImage: - imagePath: cluster-api/nmi - tag: v1.6.3_vmware.1 - ako-operator: - - version: v1.3.1+vmware.1 - images: - akoOperatorImage: - imagePath: ako-operator - tag: v1.3.1_vmware.1 - alertmanager: - - version: v0.20.0+vmware.1 - images: - alertmanagerImage: - imagePath: prometheus/alertmanager - tag: v0.20.0_vmware.1 - cadvisor: - - version: v0.36.0+vmware.1 - images: - cadvisorImage: - imagePath: prometheus/cadvisor - tag: v0.36.0_vmware.1 - cloud-provider-azure: - - version: v0.5.1+vmware.2 - images: - ccmAzureControllerImage: - imagePath: azure-cloud-controller-manager - tag: v0.5.1_vmware.2 - ccmAzureNodeImage: - imagePath: azure-cloud-node-manager - tag: v0.5.1_vmware.2 - cluster-api-provider-azure: - - version: v0.4.10+vmware.1 - images: - capzControllerImage: - imagePath: cluster-api/cluster-api-azure-controller - tag: v0.4.10_vmware.1 - cluster_api: - - version: v0.3.19+vmware.1 - images: - cabpkControllerImage: - imagePath: cluster-api/kubeadm-bootstrap-controller - tag: v0.3.19_vmware.1 - capdManagerImage: - imagePath: cluster-api/capd-manager - tag: v0.3.19_vmware.1 - capiControllerImage: - imagePath: cluster-api/cluster-api-controller - tag: v0.3.19_vmware.1 - kcpControllerImage: - imagePath: cluster-api/kubeadm-control-plane-controller - tag: v0.3.19_vmware.1 - cluster_api_aws: - - version: v0.6.4+vmware.1 - images: - capaControllerImage: - imagePath: cluster-api/cluster-api-aws-controller - tag: v0.6.4_vmware.1 - cluster_api_vsphere: - - version: v0.7.7+vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/cluster-api-vsphere-controller - tag: v0.7.7_vmware.1 - configmap-reload: - - version: v0.3.0+vmware.1 - images: - configmapReloadImage: - imagePath: prometheus/configmap-reload - tag: v0.3.0_vmware.1 - contour: - - version: v1.12.0+vmware.1 - images: - contourImage: - imagePath: contour - tag: v1.12.0_vmware.1 - crash-diagnostics: - - version: v0.3.2+vmware.3 - envoy: - - version: v1.17.0+vmware.1 - images: - envoyImage: - imagePath: envoy - tag: v1.17.0_vmware.1 - external-dns: - - version: v0.7.4+vmware.1 - images: - externalDNSImage: - imagePath: external-dns - tag: v0.7.4_vmware.1 - fluent-bit: - - version: v1.6.9+vmware.1 - images: - fluentBitImage: - imagePath: fluent-bit - tag: v1.6.9_vmware.1 - gangway: - - version: v3.2.0+vmware.2 - images: - gangwayImage: - imagePath: gangway - tag: v3.2.0_vmware.2 - grafana: - - version: v7.3.5+vmware.2 - images: - grafanaImage: - imagePath: grafana/grafana - tag: v7.3.5_vmware.2 - harbor: - - version: v2.1.3+vmware.1 - images: - harborChartMuseumImage: - imagePath: harbor/chartmuseum-photon - tag: v2.1.3_vmware.1 - harborClairAdapterImage: - imagePath: harbor/clair-adapter-photon - tag: v2.1.3_vmware.1 - harborClairImage: - imagePath: harbor/clair-photon - tag: v2.1.3_vmware.1 - harborCoreImage: - imagePath: harbor/harbor-core - tag: v2.1.3_vmware.1 - harborDatabaseImage: - imagePath: harbor/harbor-db - tag: v2.1.3_vmware.1 - harborJobServiceImage: - imagePath: harbor/harbor-jobservice - tag: v2.1.3_vmware.1 - harborLogImage: - imagePath: harbor/harbor-log - tag: v2.1.3_vmware.1 - harborNginxImage: - imagePath: harbor/nginx-photon - tag: v2.1.3_vmware.1 - harborNotaryServerImage: - imagePath: harbor/notary-server-photon - tag: v2.1.3_vmware.1 - harborNotarySignerImage: - imagePath: harbor/notary-signer-photon - tag: v2.1.3_vmware.1 - harborPortalImage: - imagePath: harbor/harbor-portal - tag: v2.1.3_vmware.1 - harborPrepareImage: - imagePath: harbor/prepare - tag: v2.1.3_vmware.1 - harborRedisImage: - imagePath: harbor/redis-photon - tag: v2.1.3_vmware.1 - harborRegistryCtlImage: - imagePath: harbor/harbor-registryctl - tag: v2.1.3_vmware.1 - harborRegistryImage: - imagePath: harbor/registry-photon - tag: v2.1.3_vmware.1 - harborTrivyAdapterImage: - imagePath: harbor/trivy-adapter-photon - tag: v2.1.3_vmware.1 - imgpkg: - - version: v0.5.0+vmware.1 - jetstack_cert-manager: - - version: v0.16.1+vmware.1 - images: - certMgrControllerImage: - imagePath: cert-manager-controller - tag: v0.16.1_vmware.1 - certMgrInjectorImage: - imagePath: cert-manager-cainjector - tag: v0.16.1_vmware.1 - certMgrWebhookImage: - imagePath: cert-manager-webhook - tag: v0.16.1_vmware.1 - k8s-sidecar: - - version: v0.1.144+vmware.2 - images: - k8sSidecarImage: - imagePath: grafana/k8s-sidecar - tag: v0.1.144_vmware.2 - k14s_kapp: - - version: v0.36.0+vmware.1 - k14s_ytt: - - version: v0.31.0+vmware.1 - kbld: - - version: v0.28.0+vmware.1 - kube-state-metrics: - - version: v1.9.5+vmware.2 - images: - kubeStateMetricsImage: - imagePath: prometheus/kube-state-metrics - tag: v1.9.5_vmware.2 - kube-vip: - - version: v0.3.3+vmware.1 - images: - kubeVipImage: - imagePath: kube-vip - tag: v0.3.3_vmware.1 - kube_rbac_proxy: - - version: v0.4.1+vmware.2 - images: - kubeRbacProxyControllerImage: - imagePath: kube-rbac-proxy - tag: v0.8.0_vmware.1 - kubeRbacProxyControllerImageCapi: - imagePath: cluster-api/kube-rbac-proxy - tag: v0.8.0_vmware.1 - kubernetes-sigs_kind: - - version: v1.20.5+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.20.5_vmware.1 - kubernetes_autoscaler: - - version: v1.20.0+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.20.0_vmware.1 - metadata: - k8sversion: v1.20.4+vmware.1 - - version: v1.19.1+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.19.1_vmware.1 - metadata: - k8sversion: v1.19.8+vmware.1 - - version: v1.18.3+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.18.3_vmware.1 - metadata: - k8sversion: v1.18.16+vmware.1 - - version: v1.17.4+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.17.4_vmware.1 - metadata: - k8sversion: v1.17.16+vmware.2 - load-balancer-and-ingress-service: - - version: v1.3.2+vmware.1 - images: - loadBalancerAndIngressServiceImage: - imagePath: ako - tag: v1.3.2_vmware.1 - prometheus: - - version: v2.18.1+vmware.1 - images: - prometheusImage: - imagePath: prometheus/prometheus - tag: v2.18.1_vmware.1 - prometheus_node_exporter: - - version: v0.18.1+vmware.1 - images: - prometheusNodeExporterImage: - imagePath: prometheus/prometheus_node_exporter - tag: v0.18.1_vmware.1 - pushgateway: - - version: v1.2.0+vmware.2 - images: - pushgatewayImage: - imagePath: prometheus/pushgateway - tag: v1.2.0_vmware.2 - sonobuoy: - - version: v0.20.0+vmware.1 - images: - sonobuoyImage: - imagePath: sonobuoy - tag: v0.20.0_vmware.1 - tanzu_core: - - version: v1.3.1-zlatest - images: - tkrImage: - imagePath: tanzu_core/tkr/tkr-controller-manager - tag: v1.3.1-zlatest - tkg-bom: - - version: v1.3.1-zlatest - images: - tkgBomImage: - imagePath: tkg-bom - tag: v1.3.1-zlatest - tkg_extensions: - - version: v1.3.1+vmware.1 - images: - tkgExtensionsTemplatesImage: - imagePath: tkg-extensions-templates - tag: v1.3.1_vmware.1 - tkg_telemetry: - - version: v1.3.0+vmware.1 - images: - tkgTelemetryImage: - imagePath: tkg-telemetry - tag: v1.3.0_vmware.1 - velero: - - version: v1.5.4+vmware.1 - images: - veleroImage: - imagePath: velero/velero - tag: v1.5.4_vmware.1 - veleroResticRestoreHelperImage: - imagePath: velero/velero-restic-restore-helper - tag: v1.5.4_vmware.1 - velero-plugin-for-aws: - - version: v1.1.0+vmware.1 - images: - veleroPluginForAwsImage: - imagePath: velero/velero-plugin-for-aws - tag: v1.1.0_vmware.1 - velero-plugin-for-microsoft-azure: - - version: v1.1.0+vmware.1 - images: - veleroPluginForMicrosoftAzureImage: - imagePath: velero/velero-plugin-for-microsoft-azure - tag: v1.1.0_vmware.1 - velero-plugin-for-vsphere: - - version: v1.1.0+vmware.1 - images: - veleroBackupDriverImage: - imagePath: velero/backup-driver - tag: v1.1.0_vmware.1 - veleroDataManagerForPluginImage: - imagePath: velero/data-manager-for-plugin - tag: v1.1.0_vmware.1 - veleroPluginForVsphereImage: - imagePath: velero/velero-plugin-for-vsphere - tag: v1.1.0_vmware.1 - vendir: - - version: v0.18.0+vmware.1 -kindKubeadmConfigSpec: - - "kind: Cluster" - - "apiVersion: kind.x-k8s.io/v1alpha4" - - "kubeadmConfigPatches:" - - "- |" - - " apiVersion: kubeadm.k8s.io/v1beta2" - - " kind: ClusterConfiguration" - - " imageRepository: projects.registry.vmware.com/tkg" - - " etcd:" - - " local:" - - " imageRepository: projects.registry.vmware.com/tkg" - - " imageTag: v3.4.13_vmware.7" - - " dns:" - - " type: CoreDNS" - - " imageRepository: projects.registry.vmware.com/tkg" - - " imageTag: v1.7.0_vmware.8" -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -extensions: - contour: - clusterTypes: - - workload - managedBy: user - dex: - clusterTypes: - - management - managedBy: user - fluent-bit: - clusterTypes: - - workload - managedBy: user - gangway: - clusterTypes: - - workload - managedBy: user - harbor: - clusterTypes: - - workload - managedBy: user - prometheus: - clusterTypes: - - workload - managedBy: user -tkr-bom: - imagePath: tkr-bom -tkr-compatibility: - imagePath: v2-v1.3.1-zlatest/tkr-compatibility diff --git a/providers/tests/clustergen/bom/tkr-bom-v1.20.5+vmware.1-tkg.1-zlatest.yaml b/providers/tests/clustergen/bom/tkr-bom-v1.20.5+vmware.1-tkg.1-zlatest.yaml deleted file mode 100644 index b8bec69b2b..0000000000 --- a/providers/tests/clustergen/bom/tkr-bom-v1.20.5+vmware.1-tkg.1-zlatest.yaml +++ /dev/null @@ -1,525 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha1 -release: - version: v1.20.5+vmware.1-tkg.1-zlatest -components: - ako-operator: - - version: v1.3.1+vmware.1 - images: - akoOperatorImage: - imagePath: ako-operator - tag: v1.3.1_vmware.1 - load-balancer-and-ingress-service: - - version: v1.3.2+vmware.1 - images: - loadBalancerAndIngressServiceImage: - imagePath: ako - tag: v1.3.2_vmware.1 - antrea: - - version: v0.11.3+vmware.2 - images: - antreaImage: - imagePath: antrea/antrea-debian - tag: v0.11.3_vmware.2 - calico_all: - - version: v3.11.3+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni-plugin - tag: v3.11.3_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.11.3_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.11.3_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon - tag: v3.11.3_vmware.1 - cloud_provider_vsphere: - - version: v1.18.1+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.18.1_vmware.1 - cni_plugins: - - version: v0.8.7+vmware.6 - containerd: - - version: v1.4.3+vmware.1 - coredns: - - version: v1.7.0+vmware.8 - images: - coredns: - imagePath: coredns - tag: v1.7.0_vmware.8 - cri_tools: - - version: v1.19.0+vmware.3 - csi_attacher: - - version: v3.0.0+vmware.1 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v3.0.0_vmware.1 - csi_livenessprobe: - - version: v2.1.0+vmware.1 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v2.1.0_vmware.1 - csi_node_driver_registrar: - - version: v2.0.1+vmware.1 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v2.0.1_vmware.1 - csi_provisioner: - - version: v2.0.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v2.0.0_vmware.1 - dex: - - version: v2.27.0+vmware.1 - images: - dexImage: - imagePath: dex - tag: v2.27.0_vmware.1 - etcd: - - version: v3.4.13+vmware.7 - images: - etcd: - imagePath: etcd - tag: v3.4.13_vmware.7 - kapp-controller: - - version: v0.18.0+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.18.0_vmware.1 - kubernetes: - - version: v1.20.5+vmware.1 - images: - kubeAPIServer: - imagePath: kube-apiserver - tag: v1.20.5_vmware.1 - kubeControllerManager: - imagePath: kube-controller-manager - tag: v1.20.5_vmware.1 - kubeE2e: - imagePath: e2e-test - tag: v1.20.5_vmware.1 - kubeProxy: - imagePath: kube-proxy - tag: v1.20.5_vmware.1 - kubeScheduler: - imagePath: kube-scheduler - tag: v1.20.5_vmware.1 - pause: - imagePath: pause - tag: "3.2" - kubernetes-csi_external-resizer: - - version: v1.0.0+vmware.1 - images: - csiExternalResizer: - imagePath: kubernetes-csi_external-resizer - tag: v1.0.0_vmware.1 - kubernetes-sigs_kind: - - version: v1.20.5+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.20.5_vmware.1 - metrics-server: - - version: v0.4.0+vmware.1 - images: - metricsServerImage: - imagePath: metrics-server - tag: v0.4.0_vmware.1 - pinniped: - - version: v0.4.1+vmware.1 - images: - pinnipedImage: - imagePath: pinniped - tag: v0.4.1_vmware.1 - tanzu_core_addons: - - version: v1.3.1+vmware.1 - images: - antreaTemplatesImage: - imagePath: tanzu_core/antrea-templates - tag: v1.3.1_vmware.1 - calicoTemplatesImage: - imagePath: tanzu_core/calico-templates - tag: v1.3.1_vmware.1 - kappControllerTemplatesImage: - imagePath: tanzu_core/kapp-controller-templates - tag: v1.3.1_vmware.1 - metricsServerTemplatesImage: - imagePath: tanzu_core/metrics-server-templates - tag: v1.3.1_vmware.1 - pinnipedTemplatesImage: - imagePath: tanzu_core/pinniped-templates - tag: v1.3.1_vmware.1 - tanzuAddonsManagerImage: - imagePath: tanzu_core/tanzu-addons-manager - tag: v1.3.1_vmware.1 - tanzuAddonsManagerTemplatesImage: - imagePath: tanzu_core/tanzu-addons-manager-templates - tag: v1.3.1_vmware.1 - tkgPinnipedPostDeployImage: - imagePath: tanzu_core/tkg-pinniped-post-deploy - tag: v1.3.1_vmware.1 - vsphereCpiTemplatesImage: - imagePath: tanzu_core/vsphere-cpi-templates - tag: v1.3.1_vmware.1 - vsphereCsiTemplatesImage: - imagePath: tanzu_core/vsphere-csi-templates - tag: v1.3.1_vmware.1 - vsphere_csi_driver: - - version: v2.1.0+vmware.1 - images: - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.1.0_vmware.1 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.1.0_vmware.1 -kubeadmConfigSpec: - apiVersion: kubeadm.k8s.io/v1beta2 - kind: ClusterConfiguration - imageRepository: projects.registry.vmware.com/tkg - kubernetesVersion: v1.20.5+vmware.1 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: projects.registry.vmware.com/tkg - imageTag: v3.4.13_vmware.7 - dns: - type: CoreDNS - imageRepository: projects.registry.vmware.com/tkg - imageTag: v1.7.0_vmware.8 -ova: -- name: ova-photon-3 - osinfo: - name: photon - version: "3" - arch: amd64 - version: v1.20.5+vmware.1-tkg.1-15494591720319458065 -- name: ova-ubuntu-2004 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - version: v1.20.5+vmware.1-tkg.1-16555584836258482890 -ami: - ap-northeast-1: - - id: ami-004bfb0561ac9f948 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0f9a502482c89b4c4 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-northeast-2: - - id: ami-0b46783d8a5c6a1ae - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0800192dda71783d8 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-south-1: - - id: ami-0c46f22f0cfbccfd4 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0b63a7125e6003256 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-southeast-1: - - id: ami-068c83e7b31f80e80 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0e48b04e72cd410ee - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-southeast-2: - - id: ami-07d7880ac179d7325 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-08f52ab5cce3e1d85 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-central-1: - - id: ami-0936add11804118c1 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0a2169502f58b4bce - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-1: - - id: ami-0b2ab817821fcd487 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0d641ed2f3f4afd86 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-2: - - id: ami-0f4b71348dd7055e7 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0a7dc6f8d67f5413d - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-3: - - id: ami-0c78211071ba3b893 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0070016947f71d153 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - sa-east-1: - - id: ami-0cd023fa0f54c0f3d - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-099e20147c308a3be - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-east-1: - - id: ami-010e209639e016e60 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0352020ce32fe2a67 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-east-2: - - id: ami-0cb5417c5c9ddbf2b - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0b653a47b0f814fe0 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-gov-east-1: - - id: ami-0139f751a3fb7ec58 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0a9fb40d16f95649d - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-gov-west-1: - - id: ami-0eb2edb682faf2303 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0a131787a78527e50 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-west-2: - - id: ami-0e6bac92abe2cbcf1 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0247eab6f03299f45 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 -azure: -- sku: k8s-1dot20dot5-ubuntu-1804 - publisher: vmware-inc - offer: tkg-capi - version: 2021.04.13 - thirdPartyImage: true - osinfo: - name: ubuntu - version: "18.04" - arch: amd64 -- sku: k8s-1dot20dot5-ubuntu-2004 - publisher: vmware-inc - offer: tkg-capi - version: 2021.04.13 - thirdPartyImage: true - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -addons: - antrea: - category: cni - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - antreaTemplatesImage - addonContainerImages: - - componentRef: antrea - imageRefs: - - antreaImage - calico: - category: cni - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - calicoTemplatesImage - addonContainerImages: - - componentRef: calico_all - imageRefs: - - calicoCniImage - - calicoKubecontrollerImage - - calicoNodeImage - - calicoPodDaemonImage - kapp-controller: - category: addons-management - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - kappControllerTemplatesImage - addonContainerImages: - - componentRef: kapp-controller - imageRefs: - - kappControllerImage - metrics-server: - category: metrics - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - metricsServerTemplatesImage - addonContainerImages: - - componentRef: metrics-server - imageRefs: - - metricsServerImage - pinniped: - category: authentication - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - pinnipedTemplatesImage - addonContainerImages: - - componentRef: tanzu_core_addons - imageRefs: - - tkgPinnipedPostDeployImage - - componentRef: pinniped - imageRefs: - - pinnipedImage - tanzu-addons-manager: - category: addons-management - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - tanzuAddonsManagerTemplatesImage - addonContainerImages: - - componentRef: tanzu_core_addons - imageRefs: - - tanzuAddonsManagerImage - vsphere-cpi: - category: cpi - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - vsphereCpiTemplatesImage - addonContainerImages: - - componentRef: cloud_provider_vsphere - imageRefs: - - ccmControllerImage - vsphere-csi: - category: csi - clusterTypes: - - management - - workload - addonTemplatesImage: - - componentRef: tanzu_core_addons - imageRefs: - - vsphereCsiTemplatesImage - addonContainerImages: - - componentRef: vsphere_csi_driver - imageRefs: - - csiControllerImage - - csiMetaDataSyncerImage - - componentRef: csi_attacher - imageRefs: - - csiAttacherImage - - componentRef: csi_livenessprobe - imageRefs: - - csiLivenessProbeImage - - componentRef: csi_node_driver_registrar - imageRefs: - - csiNodeDriverRegistrarImage - - componentRef: csi_provisioner - imageRefs: - - csiProvisonerImage - - componentRef: kubernetes-csi_external-resizer - imageRefs: - - csiExternalResizer diff --git a/providers/tests/clustergen/diffcluster/example/demo.sh b/providers/tests/clustergen/diffcluster/example/demo.sh deleted file mode 100755 index eb9a9af422..0000000000 --- a/providers/tests/clustergen/diffcluster/example/demo.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# shellcheck disable=SC1091 -. ../helpers.sh - -normalize original.yaml src -normalize generated.yaml dst - -#vimdiff src dst -kapp tools diff -c --file2 dst --file src diff --git a/providers/tests/clustergen/diffcluster/example/dst b/providers/tests/clustergen/diffcluster/example/dst deleted file mode 100644 index afbbde6cfc..0000000000 --- a/providers/tests/clustergen/diffcluster/example/dst +++ /dev/null @@ -1,867 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: Cluster -metadata: - name: testcluster -spec: - clusterNetwork: - pods: - cidrBlocks: - - 100.96.0.0/11 - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSCluster - name: testcluster - controlPlaneRef: - kind: KubeadmControlPlane - apiVersion: controlplane.cluster.x-k8s.io/v1alpha3 - name: testcluster-control-plane ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSCluster -metadata: - name: testcluster -spec: - region: us-east-1 - sshKeyName: vui_aws - bastion: - enabled: "true" - networkSpec: - vpc: - cidrBlock: 10.0.0.0/16 - id: "" - subnets: - - availabilityZone: us-east-1a - cidrBlock: 10.0.1.0/24 - isPublic: true - id: "" - - availabilityZone: us-east-1a - cidrBlock: 10.0.0.0/24 - id: "" ---- -kind: KubeadmControlPlane -apiVersion: controlplane.cluster.x-k8s.io/v1alpha3 -metadata: - name: testcluster-control-plane -spec: - replicas: 1 - infrastructureTemplate: - kind: AWSMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - name: testcluster-control-plane - kubeadmConfigSpec: - useExperimentalRetryJoin: true - initConfiguration: - nodeRegistration: - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - clusterConfiguration: - imageRepository: registry.tkg.vmware.run - kubernetesVersion: v1.18.3+vmware.1 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: registry.tkg.vmware.run - imageTag: v3.4.3_vmware.5 - extraArgs: - cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - dns: - type: CoreDNS - imageRepository: registry.tkg.vmware.run - imageTag: v1.6.7_vmware.1 - apiServer: - timeoutForControlPlane: 8m0s - extraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - controllerManager: - extraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - scheduler: - extraArgs: - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - joinConfiguration: - nodeRegistration: - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - version: v1.18.3+vmware.1 ---- -kind: AWSMachineTemplate -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -metadata: - name: testcluster-control-plane -spec: - template: - spec: - instanceType: t3.small - iamInstanceProfile: control-plane.cluster-api-provider-aws.sigs.k8s.io - sshKeyName: vui_aws - ami: - id: ami-0466130a9694af4bd - rootVolume: - size: 80 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSMachineTemplate -metadata: - name: testcluster-md-0 -spec: - template: - spec: - instanceType: m5.large - iamInstanceProfile: nodes.cluster-api-provider-aws.sigs.k8s.io - sshKeyName: vui_aws - ami: - id: ami-0466130a9694af4bd - rootVolume: - size: 80 ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 -kind: KubeadmConfigTemplate -metadata: - name: testcluster-md-0 -spec: - template: - spec: - useExperimentalRetryJoin: true - joinConfiguration: - nodeRegistration: - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineDeployment -metadata: - name: testcluster-md-0 -spec: - clusterName: testcluster - replicas: 1 - selector: - matchLabels: testcluster - template: - metadata: - labels: - node-pool: testcluster-worker-pool - spec: - clusterName: testcluster - version: v1.18.3+vmware.1 - bootstrap: - configRef: - name: testcluster-md-0 - apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 - kind: KubeadmConfigTemplate - infrastructureRef: - name: testcluster-md-0 - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSMachineTemplate ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineHealthCheck -metadata: - name: testcluster -spec: - clusterName: testcluster - nodeStartupTimeout: 20m - selector: - matchLabels: - node-pool: testcluster-worker-pool - unhealthyConditions: - - type: Ready - status: Unknown - timeout: 4m32s - - type: Ready - status: "False" - timeout: 2m22s ---- -apiVersion: v1 -kind: Secret -metadata: - name: testcluster-postcreate -stringData: - calicoYaml: | - kind: ConfigMap - apiVersion: v1 - metadata: - name: calico-config - namespace: kube-system - data: - typha_service_name: none - calico_backend: bird - veth_mtu: "1440" - cni_network_config: |- - { - "name": "k8s-pod-network", - "cniVersion": "0.3.1", - "plugins": [ - { - "type": "calico", - "log_level": "info", - "datastore_type": "kubernetes", - "nodename": "__KUBERNETES_NODE_NAME__", - "mtu": __CNI_MTU__, - "ipam": { - "type": "calico-ipam" - }, - "policy": { - "type": "k8s" - }, - "kubernetes": { - "kubeconfig": "__KUBECONFIG_FILEPATH__" - } - }, - { - "type": "portmap", - "snat": true, - "capabilities": {"portMappings": true} - } - ] - } - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: felixconfigurations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: FelixConfiguration - plural: felixconfigurations - singular: felixconfiguration - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: ipamblocks.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMBlock - plural: ipamblocks - singular: ipamblock - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: blockaffinities.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BlockAffinity - plural: blockaffinities - singular: blockaffinity - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: ipamhandles.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMHandle - plural: ipamhandles - singular: ipamhandle - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: ipamconfigs.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMConfig - plural: ipamconfigs - singular: ipamconfig - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: bgppeers.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BGPPeer - plural: bgppeers - singular: bgppeer - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: bgpconfigurations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BGPConfiguration - plural: bgpconfigurations - singular: bgpconfiguration - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: ippools.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPPool - plural: ippools - singular: ippool - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: hostendpoints.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: HostEndpoint - plural: hostendpoints - singular: hostendpoint - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: clusterinformations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: ClusterInformation - plural: clusterinformations - singular: clusterinformation - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: globalnetworkpolicies.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: GlobalNetworkPolicy - plural: globalnetworkpolicies - singular: globalnetworkpolicy - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: globalnetworksets.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: GlobalNetworkSet - plural: globalnetworksets - singular: globalnetworkset - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: networkpolicies.crd.projectcalico.org - spec: - scope: Namespaced - group: crd.projectcalico.org - version: v1 - names: - kind: NetworkPolicy - plural: networkpolicies - singular: networkpolicy - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: networksets.crd.projectcalico.org - spec: - scope: Namespaced - group: crd.projectcalico.org - version: v1 - names: - kind: NetworkSet - plural: networksets - singular: networkset - --- - kind: ClusterRole - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-kube-controllers - rules: - - apiGroups: - - "" - resources: - - nodes - verbs: - - watch - - list - - get - - apiGroups: - - "" - resources: - - pods - verbs: - - get - - apiGroups: - - crd.projectcalico.org - resources: - - ippools - verbs: - - list - - apiGroups: - - crd.projectcalico.org - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - - apiGroups: - - crd.projectcalico.org - resources: - - clusterinformations - verbs: - - get - - create - - update - --- - kind: ClusterRoleBinding - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-kube-controllers - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-kube-controllers - subjects: - - kind: ServiceAccount - name: calico-kube-controllers - namespace: kube-system - --- - kind: ClusterRole - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-node - rules: - - apiGroups: - - "" - resources: - - pods - - nodes - - namespaces - verbs: - - get - - apiGroups: - - "" - resources: - - endpoints - - services - verbs: - - watch - - list - - get - - apiGroups: - - "" - resources: - - nodes/status - verbs: - - patch - - update - - apiGroups: - - networking.k8s.io - resources: - - networkpolicies - verbs: - - watch - - list - - apiGroups: - - "" - resources: - - pods - - namespaces - - serviceaccounts - verbs: - - list - - watch - - apiGroups: - - "" - resources: - - pods/status - verbs: - - patch - - apiGroups: - - crd.projectcalico.org - resources: - - globalfelixconfigs - - felixconfigurations - - bgppeers - - globalbgpconfigs - - bgpconfigurations - - ippools - - ipamblocks - - globalnetworkpolicies - - globalnetworksets - - networkpolicies - - networksets - - clusterinformations - - hostendpoints - - blockaffinities - verbs: - - get - - list - - watch - - apiGroups: - - crd.projectcalico.org - resources: - - ippools - - felixconfigurations - - clusterinformations - verbs: - - create - - update - - apiGroups: - - "" - resources: - - nodes - verbs: - - get - - list - - watch - - apiGroups: - - crd.projectcalico.org - resources: - - bgpconfigurations - - bgppeers - verbs: - - create - - update - - apiGroups: - - crd.projectcalico.org - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - - apiGroups: - - crd.projectcalico.org - resources: - - ipamconfigs - verbs: - - get - - apiGroups: - - crd.projectcalico.org - resources: - - blockaffinities - verbs: - - watch - - apiGroups: - - apps - resources: - - daemonsets - verbs: - - get - --- - apiVersion: rbac.authorization.k8s.io/v1 - kind: ClusterRoleBinding - metadata: - name: calico-node - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-node - subjects: - - kind: ServiceAccount - name: calico-node - namespace: kube-system - --- - kind: DaemonSet - apiVersion: apps/v1 - metadata: - name: calico-node - namespace: kube-system - labels: - k8s-app: calico-node - spec: - selector: - matchLabels: - k8s-app: calico-node - updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 1 - template: - metadata: - labels: - k8s-app: calico-node - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - spec: - nodeSelector: - beta.kubernetes.io/os: linux - hostNetwork: true - tolerations: - - effect: NoSchedule - operator: Exists - - key: CriticalAddonsOnly - operator: Exists - - effect: NoExecute - operator: Exists - serviceAccountName: calico-node - terminationGracePeriodSeconds: 0 - priorityClassName: system-node-critical - initContainers: - - name: upgrade-ipam - image: registry.tkg.vmware.run/calico-all/cni-plugin:v3.11.2_vmware.1 - command: - - /opt/cni/bin/calico-ipam - - -upgrade - env: - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - volumeMounts: - - mountPath: /var/lib/cni/networks - name: host-local-net-dir - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - securityContext: - privileged: true - - name: install-cni - image: registry.tkg.vmware.run/calico-all/cni-plugin:v3.11.2_vmware.1 - command: - - /install-cni.sh - env: - - name: CNI_CONF_NAME - value: 10-calico.conflist - - name: CNI_NETWORK_CONFIG - valueFrom: - configMapKeyRef: - name: calico-config - key: cni_network_config - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CNI_MTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - - name: SLEEP - value: "false" - volumeMounts: - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - - mountPath: /host/etc/cni/net.d - name: cni-net-dir - securityContext: - privileged: true - - name: flexvol-driver - image: registry.tkg.vmware.run/calico-all/pod2daemon:v3.11.2_vmware.1 - volumeMounts: - - name: flexvol-driver-host - mountPath: /host/driver - securityContext: - privileged: true - containers: - - name: calico-node - image: registry.tkg.vmware.run/calico-all/node:v3.11.2_vmware.1 - env: - - name: DATASTORE_TYPE - value: kubernetes - - name: WAIT_FOR_DATASTORE - value: "true" - - name: NODENAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - - name: CLUSTER_TYPE - value: k8s,bgp - - name: IP - value: autodetect - - name: CALICO_IPV4POOL_IPIP - value: Always - - name: FELIX_IPINIPMTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - - name: CALICO_IPV4POOL_CIDR - value: 100.96.0.0/11 - - name: CALICO_DISABLE_FILE_LOGGING - value: "true" - - name: FELIX_DEFAULTENDPOINTTOHOSTACTION - value: ACCEPT - - name: FELIX_IPV6SUPPORT - value: "false" - - name: FELIX_LOGSEVERITYSCREEN - value: info - - name: FELIX_HEALTHENABLED - value: "true" - securityContext: - privileged: true - resources: - requests: - cpu: 250m - livenessProbe: - exec: - command: - - /bin/calico-node - - -felix-live - - -bird-live - periodSeconds: 10 - initialDelaySeconds: 10 - failureThreshold: 6 - readinessProbe: - exec: - command: - - /bin/calico-node - - -felix-ready - - -bird-ready - periodSeconds: 10 - volumeMounts: - - mountPath: /lib/modules - name: lib-modules - readOnly: true - - mountPath: /run/xtables.lock - name: xtables-lock - readOnly: false - - mountPath: /var/run/calico - name: var-run-calico - readOnly: false - - mountPath: /var/lib/calico - name: var-lib-calico - readOnly: false - - name: policysync - mountPath: /var/run/nodeagent - volumes: - - name: lib-modules - hostPath: - path: /lib/modules - - name: var-run-calico - hostPath: - path: /var/run/calico - - name: var-lib-calico - hostPath: - path: /var/lib/calico - - name: xtables-lock - hostPath: - path: /run/xtables.lock - type: FileOrCreate - - name: cni-bin-dir - hostPath: - path: /opt/cni/bin - - name: cni-net-dir - hostPath: - path: /etc/cni/net.d - - name: host-local-net-dir - hostPath: - path: /var/lib/cni/networks - - name: policysync - hostPath: - type: DirectoryOrCreate - path: /var/run/nodeagent - - name: flexvol-driver-host - hostPath: - type: DirectoryOrCreate - path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds - --- - apiVersion: v1 - kind: ServiceAccount - metadata: - name: calico-node - namespace: kube-system - --- - apiVersion: apps/v1 - kind: Deployment - metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers - spec: - replicas: 1 - selector: - matchLabels: - k8s-app: calico-kube-controllers - strategy: - type: Recreate - template: - metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - spec: - nodeSelector: - beta.kubernetes.io/os: linux - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - key: node-role.kubernetes.io/master - effect: NoSchedule - serviceAccountName: calico-kube-controllers - priorityClassName: system-cluster-critical - containers: - - name: calico-kube-controllers - image: registry.tkg.vmware.run/calico-all/kube-controllers:v3.11.2_vmware.1 - env: - - name: ENABLED_CONTROLLERS - value: node - - name: DATASTORE_TYPE - value: kubernetes - readinessProbe: - exec: - command: - - /usr/bin/check-status - - -r - --- - apiVersion: v1 - kind: ServiceAccount - metadata: - name: calico-kube-controllers - namespace: kube-system diff --git a/providers/tests/clustergen/diffcluster/example/generated.yaml b/providers/tests/clustergen/diffcluster/example/generated.yaml deleted file mode 100644 index 3ca5248137..0000000000 --- a/providers/tests/clustergen/diffcluster/example/generated.yaml +++ /dev/null @@ -1,867 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: Cluster -metadata: - name: testcluster -spec: - clusterNetwork: - pods: - cidrBlocks: - - 100.96.0.0/11 - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSCluster - name: testcluster - controlPlaneRef: - kind: KubeadmControlPlane - apiVersion: controlplane.cluster.x-k8s.io/v1alpha3 - name: testcluster-control-plane ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSCluster -metadata: - name: testcluster -spec: - region: us-east-1 - sshKeyName: vui_aws - bastion: - enabled: "true" - networkSpec: - vpc: - cidrBlock: 10.0.0.0/16 - id: "" - subnets: - - availabilityZone: us-east-1a - cidrBlock: 10.0.1.0/24 - isPublic: true - id: "" - - availabilityZone: us-east-1a - cidrBlock: 10.0.0.0/24 - id: "" ---- -kind: KubeadmControlPlane -apiVersion: controlplane.cluster.x-k8s.io/v1alpha3 -metadata: - name: testcluster-control-plane -spec: - replicas: 1 - infrastructureTemplate: - kind: AWSMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - name: testcluster-control-plane - kubeadmConfigSpec: - useExperimentalRetryJoin: true - initConfiguration: - nodeRegistration: - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - clusterConfiguration: - imageRepository: registry.tkg.vmware.run - kubernetesVersion: v1.18.3+vmware.1 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: registry.tkg.vmware.run - imageTag: v3.4.3_vmware.5 - extraArgs: - cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - dns: - type: CoreDNS - imageRepository: registry.tkg.vmware.run - imageTag: v1.6.7_vmware.1 - apiServer: - timeoutForControlPlane: 8m0s - extraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - controllerManager: - extraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - scheduler: - extraArgs: - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - joinConfiguration: - nodeRegistration: - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - version: v1.18.3+vmware.1 ---- -kind: AWSMachineTemplate -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -metadata: - name: testcluster-control-plane -spec: - template: - spec: - instanceType: t3.small - iamInstanceProfile: control-plane.cluster-api-provider-aws.sigs.k8s.io - sshKeyName: vui_aws - ami: - id: ami-0466130a9694af4bd - rootVolume: - size: 80 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSMachineTemplate -metadata: - name: testcluster-md-0 -spec: - template: - spec: - instanceType: m5.large - iamInstanceProfile: nodes.cluster-api-provider-aws.sigs.k8s.io - sshKeyName: vui_aws - ami: - id: ami-0466130a9694af4bd - rootVolume: - size: 80 ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 -kind: KubeadmConfigTemplate -metadata: - name: testcluster-md-0 -spec: - template: - spec: - useExperimentalRetryJoin: true - joinConfiguration: - nodeRegistration: - name: '{{ ds.meta_data.local_hostname }}' - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineDeployment -metadata: - name: testcluster-md-0 -spec: - clusterName: testcluster - replicas: 1 - selector: - matchLabels: testcluster - template: - metadata: - labels: - node-pool: testcluster-worker-pool - spec: - clusterName: testcluster - version: v1.18.3+vmware.1 - bootstrap: - configRef: - name: testcluster-md-0 - apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 - kind: KubeadmConfigTemplate - infrastructureRef: - name: testcluster-md-0 - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSMachineTemplate ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineHealthCheck -metadata: - name: testcluster -spec: - clusterName: testcluster - nodeStartupTimeout: 20m - selector: - matchLabels: - node-pool: testcluster-worker-pool - unhealthyConditions: - - type: Ready - status: Unknown - timeout: 4m32s - - type: Ready - status: "False" - timeout: 2m22s ---- -apiVersion: v1 -kind: Secret -metadata: - name: testcluster-postcreate -stringData: - calicoYaml: | - kind: ConfigMap - apiVersion: v1 - metadata: - name: calico-config - namespace: kube-system - data: - typha_service_name: none - calico_backend: bird - veth_mtu: "1440" - cni_network_config: |- - { - "name": "k8s-pod-network", - "cniVersion": "0.3.1", - "plugins": [ - { - "type": "calico", - "log_level": "info", - "datastore_type": "kubernetes", - "nodename": "__KUBERNETES_NODE_NAME__", - "mtu": __CNI_MTU__, - "ipam": { - "type": "calico-ipam" - }, - "policy": { - "type": "k8s" - }, - "kubernetes": { - "kubeconfig": "__KUBECONFIG_FILEPATH__" - } - }, - { - "type": "portmap", - "snat": true, - "capabilities": {"portMappings": true} - } - ] - } - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: felixconfigurations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: FelixConfiguration - plural: felixconfigurations - singular: felixconfiguration - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: ipamblocks.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMBlock - plural: ipamblocks - singular: ipamblock - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: blockaffinities.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BlockAffinity - plural: blockaffinities - singular: blockaffinity - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: ipamhandles.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMHandle - plural: ipamhandles - singular: ipamhandle - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: ipamconfigs.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMConfig - plural: ipamconfigs - singular: ipamconfig - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: bgppeers.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BGPPeer - plural: bgppeers - singular: bgppeer - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: bgpconfigurations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BGPConfiguration - plural: bgpconfigurations - singular: bgpconfiguration - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: ippools.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPPool - plural: ippools - singular: ippool - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: hostendpoints.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: HostEndpoint - plural: hostendpoints - singular: hostendpoint - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: clusterinformations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: ClusterInformation - plural: clusterinformations - singular: clusterinformation - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: globalnetworkpolicies.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: GlobalNetworkPolicy - plural: globalnetworkpolicies - singular: globalnetworkpolicy - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: globalnetworksets.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: GlobalNetworkSet - plural: globalnetworksets - singular: globalnetworkset - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: networkpolicies.crd.projectcalico.org - spec: - scope: Namespaced - group: crd.projectcalico.org - version: v1 - names: - kind: NetworkPolicy - plural: networkpolicies - singular: networkpolicy - --- - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: networksets.crd.projectcalico.org - spec: - scope: Namespaced - group: crd.projectcalico.org - version: v1 - names: - kind: NetworkSet - plural: networksets - singular: networkset - --- - kind: ClusterRole - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-kube-controllers - rules: - - apiGroups: - - "" - resources: - - nodes - verbs: - - watch - - list - - get - - apiGroups: - - "" - resources: - - pods - verbs: - - get - - apiGroups: - - crd.projectcalico.org - resources: - - ippools - verbs: - - list - - apiGroups: - - crd.projectcalico.org - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - - apiGroups: - - crd.projectcalico.org - resources: - - clusterinformations - verbs: - - get - - create - - update - --- - kind: ClusterRoleBinding - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-kube-controllers - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-kube-controllers - subjects: - - kind: ServiceAccount - name: calico-kube-controllers - namespace: kube-system - --- - kind: ClusterRole - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-node - rules: - - apiGroups: - - "" - resources: - - pods - - nodes - - namespaces - verbs: - - get - - apiGroups: - - "" - resources: - - endpoints - - services - verbs: - - watch - - list - - get - - apiGroups: - - "" - resources: - - nodes/status - verbs: - - patch - - update - - apiGroups: - - networking.k8s.io - resources: - - networkpolicies - verbs: - - watch - - list - - apiGroups: - - "" - resources: - - pods - - namespaces - - serviceaccounts - verbs: - - list - - watch - - apiGroups: - - "" - resources: - - pods/status - verbs: - - patch - - apiGroups: - - crd.projectcalico.org - resources: - - globalfelixconfigs - - felixconfigurations - - bgppeers - - globalbgpconfigs - - bgpconfigurations - - ippools - - ipamblocks - - globalnetworkpolicies - - globalnetworksets - - networkpolicies - - networksets - - clusterinformations - - hostendpoints - - blockaffinities - verbs: - - get - - list - - watch - - apiGroups: - - crd.projectcalico.org - resources: - - ippools - - felixconfigurations - - clusterinformations - verbs: - - create - - update - - apiGroups: - - "" - resources: - - nodes - verbs: - - get - - list - - watch - - apiGroups: - - crd.projectcalico.org - resources: - - bgpconfigurations - - bgppeers - verbs: - - create - - update - - apiGroups: - - crd.projectcalico.org - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - - apiGroups: - - crd.projectcalico.org - resources: - - ipamconfigs - verbs: - - get - - apiGroups: - - crd.projectcalico.org - resources: - - blockaffinities - verbs: - - watch - - apiGroups: - - apps - resources: - - daemonsets - verbs: - - get - --- - apiVersion: rbac.authorization.k8s.io/v1 - kind: ClusterRoleBinding - metadata: - name: calico-node - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-node - subjects: - - kind: ServiceAccount - name: calico-node - namespace: kube-system - --- - kind: DaemonSet - apiVersion: apps/v1 - metadata: - name: calico-node - namespace: kube-system - labels: - k8s-app: calico-node - spec: - selector: - matchLabels: - k8s-app: calico-node - updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 1 - template: - metadata: - labels: - k8s-app: calico-node - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - spec: - nodeSelector: - beta.kubernetes.io/os: linux - hostNetwork: true - tolerations: - - effect: NoSchedule - operator: Exists - - key: CriticalAddonsOnly - operator: Exists - - effect: NoExecute - operator: Exists - serviceAccountName: calico-node - terminationGracePeriodSeconds: 0 - priorityClassName: system-node-critical - initContainers: - - name: upgrade-ipam - image: registry.tkg.vmware.run/calico-all/cni-plugin:v3.11.2_vmware.1 - command: - - /opt/cni/bin/calico-ipam - - -upgrade - env: - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - volumeMounts: - - mountPath: /var/lib/cni/networks - name: host-local-net-dir - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - securityContext: - privileged: true - - name: install-cni - image: registry.tkg.vmware.run/calico-all/cni-plugin:v3.11.2_vmware.1 - command: - - /install-cni.sh - env: - - name: CNI_CONF_NAME - value: 10-calico.conflist - - name: CNI_NETWORK_CONFIG - valueFrom: - configMapKeyRef: - name: calico-config - key: cni_network_config - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CNI_MTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - - name: SLEEP - value: "false" - volumeMounts: - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - - mountPath: /host/etc/cni/net.d - name: cni-net-dir - securityContext: - privileged: true - - name: flexvol-driver - image: registry.tkg.vmware.run/calico-all/pod2daemon:v3.11.2_vmware.1 - volumeMounts: - - name: flexvol-driver-host - mountPath: /host/driver - securityContext: - privileged: true - containers: - - name: calico-node - image: registry.tkg.vmware.run/calico-all/node:v3.11.2_vmware.1 - env: - - name: DATASTORE_TYPE - value: kubernetes - - name: WAIT_FOR_DATASTORE - value: "true" - - name: NODENAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - - name: CLUSTER_TYPE - value: k8s,bgp - - name: IP - value: autodetect - - name: CALICO_IPV4POOL_IPIP - value: Always - - name: FELIX_IPINIPMTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - - name: CALICO_IPV4POOL_CIDR - value: 100.96.0.0/11 - - name: CALICO_DISABLE_FILE_LOGGING - value: "true" - - name: FELIX_DEFAULTENDPOINTTOHOSTACTION - value: ACCEPT - - name: FELIX_IPV6SUPPORT - value: "false" - - name: FELIX_LOGSEVERITYSCREEN - value: info - - name: FELIX_HEALTHENABLED - value: "true" - securityContext: - privileged: true - resources: - requests: - cpu: 250m - livenessProbe: - exec: - command: - - /bin/calico-node - - -felix-live - - -bird-live - periodSeconds: 10 - initialDelaySeconds: 10 - failureThreshold: 6 - readinessProbe: - exec: - command: - - /bin/calico-node - - -felix-ready - - -bird-ready - periodSeconds: 10 - volumeMounts: - - mountPath: /lib/modules - name: lib-modules - readOnly: true - - mountPath: /run/xtables.lock - name: xtables-lock - readOnly: false - - mountPath: /var/run/calico - name: var-run-calico - readOnly: false - - mountPath: /var/lib/calico - name: var-lib-calico - readOnly: false - - name: policysync - mountPath: /var/run/nodeagent - volumes: - - name: lib-modules - hostPath: - path: /lib/modules - - name: var-run-calico - hostPath: - path: /var/run/calico - - name: var-lib-calico - hostPath: - path: /var/lib/calico - - name: xtables-lock - hostPath: - path: /run/xtables.lock - type: FileOrCreate - - name: cni-bin-dir - hostPath: - path: /opt/cni/bin - - name: cni-net-dir - hostPath: - path: /etc/cni/net.d - - name: host-local-net-dir - hostPath: - path: /var/lib/cni/networks - - name: policysync - hostPath: - type: DirectoryOrCreate - path: /var/run/nodeagent - - name: flexvol-driver-host - hostPath: - type: DirectoryOrCreate - path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds - --- - apiVersion: v1 - kind: ServiceAccount - metadata: - name: calico-node - namespace: kube-system - --- - apiVersion: apps/v1 - kind: Deployment - metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers - spec: - replicas: 1 - selector: - matchLabels: - k8s-app: calico-kube-controllers - strategy: - type: Recreate - template: - metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - spec: - nodeSelector: - beta.kubernetes.io/os: linux - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - key: node-role.kubernetes.io/master - effect: NoSchedule - serviceAccountName: calico-kube-controllers - priorityClassName: system-cluster-critical - containers: - - name: calico-kube-controllers - image: registry.tkg.vmware.run/calico-all/kube-controllers:v3.11.2_vmware.1 - env: - - name: ENABLED_CONTROLLERS - value: node - - name: DATASTORE_TYPE - value: kubernetes - readinessProbe: - exec: - command: - - /usr/bin/check-status - - -r - --- - apiVersion: v1 - kind: ServiceAccount - metadata: - name: calico-kube-controllers - namespace: kube-system diff --git a/providers/tests/clustergen/diffcluster/example/original.yaml b/providers/tests/clustergen/diffcluster/example/original.yaml deleted file mode 100644 index a02aa63767..0000000000 --- a/providers/tests/clustergen/diffcluster/example/original.yaml +++ /dev/null @@ -1,977 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: Cluster -metadata: - name: testcluster -spec: - clusterNetwork: - pods: - cidrBlocks: - - 100.96.0.0/11 - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1alpha3 - kind: KubeadmControlPlane - name: testcluster-control-plane - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSCluster - name: testcluster ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSCluster -metadata: - name: testcluster -spec: - bastion: - enabled: true - networkSpec: - subnets: - - availabilityZone: us-east-1a - cidrBlock: 10.0.1.0/24 - id: "" - isPublic: true - - availabilityZone: us-east-1a - cidrBlock: 10.0.0.0/24 - id: "" - vpc: - cidrBlock: 10.0.0.0/16 - id: "" - region: us-east-1 - sshKeyName: vui_aws ---- -apiVersion: controlplane.cluster.x-k8s.io/v1alpha3 -kind: KubeadmControlPlane -metadata: - name: testcluster-control-plane -spec: - infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSMachineTemplate - name: testcluster-control-plane - kubeadmConfigSpec: - clusterConfiguration: - apiServer: - extraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - timeoutForControlPlane: 8m0s - controllerManager: - extraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - dns: - imageRepository: registry.tkg.vmware.run - imageTag: v1.6.7_vmware.1 - type: CoreDNS - etcd: - local: - dataDir: /var/lib/etcd - extraArgs: - cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - imageRepository: registry.tkg.vmware.run - imageTag: v3.4.3_vmware.5 - imageRepository: registry.tkg.vmware.run - kubernetesVersion: v1.18.2+vmware.2 - scheduler: - extraArgs: - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - initConfiguration: - nodeRegistration: - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - name: '{{ ds.meta_data.local_hostname }}' - joinConfiguration: - nodeRegistration: - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - name: '{{ ds.meta_data.local_hostname }}' - useExperimentalRetryJoin: true - replicas: 1 - version: v1.18.2+vmware.2 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSMachineTemplate -metadata: - name: testcluster-control-plane -spec: - template: - spec: - ami: - id: ami-0f44ed42a1afd5623 - iamInstanceProfile: control-plane.cluster-api-provider-aws.sigs.k8s.io - instanceType: t3.small - rootVolume: - size: 80 - sshKeyName: vui_aws ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSMachineTemplate -metadata: - name: testcluster-md-0 -spec: - template: - spec: - ami: - id: ami-0f44ed42a1afd5623 - iamInstanceProfile: nodes.cluster-api-provider-aws.sigs.k8s.io - instanceType: m5.large - rootVolume: - size: 80 - sshKeyName: vui_aws ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 -kind: KubeadmConfigTemplate -metadata: - name: testcluster-md-0 -spec: - template: - spec: - joinConfiguration: - nodeRegistration: - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - name: '{{ ds.meta_data.local_hostname }}' - useExperimentalRetryJoin: true ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineDeployment -metadata: - name: testcluster-md-0 -spec: - clusterName: testcluster - replicas: 1 - selector: - matchLabels: null - template: - metadata: - labels: - node-pool: testcluster-worker-pool - spec: - bootstrap: - configRef: - apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 - kind: KubeadmConfigTemplate - name: testcluster-md-0 - clusterName: testcluster - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSMachineTemplate - name: testcluster-md-0 - version: v1.18.2+vmware.2 ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineHealthCheck -metadata: - name: testcluster -spec: - clusterName: testcluster - nodeStartupTimeout: 20m - selector: - matchLabels: - node-pool: testcluster-worker-pool - unhealthyConditions: - - status: Unknown - timeout: 5m - type: Ready - - status: "False" - timeout: 5m - type: Ready ---- -apiVersion: v1 -kind: Secret -metadata: - name: testcluster-postcreate -stringData: - calicoYaml: | - --- - # Source: calico/templates/calico-config.yaml - # This ConfigMap is used to configure a self-hosted Calico installation. - kind: ConfigMap - apiVersion: v1 - metadata: - name: calico-config - namespace: kube-system - data: - # Typha is disabled. - typha_service_name: "none" - # Configure the backend to use. - calico_backend: "bird" - - # Configure the MTU to use - veth_mtu: "1440" - - # The CNI network configuration to install on each node. The special - # values in this config will be automatically populated. - cni_network_config: |- - { - "name": "k8s-pod-network", - "cniVersion": "0.3.1", - "plugins": [ - { - "type": "calico", - "log_level": "info", - "datastore_type": "kubernetes", - "nodename": "__KUBERNETES_NODE_NAME__", - "mtu": __CNI_MTU__, - "ipam": { - "type": "calico-ipam" - }, - "policy": { - "type": "k8s" - }, - "kubernetes": { - "kubeconfig": "__KUBECONFIG_FILEPATH__" - } - }, - { - "type": "portmap", - "snat": true, - "capabilities": {"portMappings": true} - } - ] - } - - --- - # Source: calico/templates/kdd-crds.yaml - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: felixconfigurations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: FelixConfiguration - plural: felixconfigurations - singular: felixconfiguration - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: ipamblocks.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMBlock - plural: ipamblocks - singular: ipamblock - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: blockaffinities.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BlockAffinity - plural: blockaffinities - singular: blockaffinity - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: ipamhandles.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMHandle - plural: ipamhandles - singular: ipamhandle - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: ipamconfigs.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMConfig - plural: ipamconfigs - singular: ipamconfig - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: bgppeers.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BGPPeer - plural: bgppeers - singular: bgppeer - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: bgpconfigurations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BGPConfiguration - plural: bgpconfigurations - singular: bgpconfiguration - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: ippools.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPPool - plural: ippools - singular: ippool - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: hostendpoints.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: HostEndpoint - plural: hostendpoints - singular: hostendpoint - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: clusterinformations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: ClusterInformation - plural: clusterinformations - singular: clusterinformation - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: globalnetworkpolicies.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: GlobalNetworkPolicy - plural: globalnetworkpolicies - singular: globalnetworkpolicy - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: globalnetworksets.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: GlobalNetworkSet - plural: globalnetworksets - singular: globalnetworkset - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: networkpolicies.crd.projectcalico.org - spec: - scope: Namespaced - group: crd.projectcalico.org - version: v1 - names: - kind: NetworkPolicy - plural: networkpolicies - singular: networkpolicy - - --- - - apiVersion: apiextensions.k8s.io/v1beta1 - kind: CustomResourceDefinition - metadata: - name: networksets.crd.projectcalico.org - spec: - scope: Namespaced - group: crd.projectcalico.org - version: v1 - names: - kind: NetworkSet - plural: networksets - singular: networkset - --- - # Source: calico/templates/rbac.yaml - - # Include a clusterrole for the kube-controllers component, - # and bind it to the calico-kube-controllers serviceaccount. - kind: ClusterRole - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-kube-controllers - rules: - # Nodes are watched to monitor for deletions. - - apiGroups: [""] - resources: - - nodes - verbs: - - watch - - list - - get - # Pods are queried to check for existence. - - apiGroups: [""] - resources: - - pods - verbs: - - get - # IPAM resources are manipulated when nodes are deleted. - - apiGroups: ["crd.projectcalico.org"] - resources: - - ippools - verbs: - - list - - apiGroups: ["crd.projectcalico.org"] - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - # Needs access to update clusterinformations. - - apiGroups: ["crd.projectcalico.org"] - resources: - - clusterinformations - verbs: - - get - - create - - update - --- - kind: ClusterRoleBinding - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-kube-controllers - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-kube-controllers - subjects: - - kind: ServiceAccount - name: calico-kube-controllers - namespace: kube-system - --- - # Include a clusterrole for the calico-node DaemonSet, - # and bind it to the calico-node serviceaccount. - kind: ClusterRole - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-node - rules: - # The CNI plugin needs to get pods, nodes, and namespaces. - - apiGroups: [""] - resources: - - pods - - nodes - - namespaces - verbs: - - get - - apiGroups: [""] - resources: - - endpoints - - services - verbs: - # Used to discover service IPs for advertisement. - - watch - - list - # Used to discover Typhas. - - get - - apiGroups: [""] - resources: - - nodes/status - verbs: - # Needed for clearing NodeNetworkUnavailable flag. - - patch - # Calico stores some configuration information in node annotations. - - update - # Watch for changes to Kubernetes NetworkPolicies. - - apiGroups: ["networking.k8s.io"] - resources: - - networkpolicies - verbs: - - watch - - list - # Used by Calico for policy information. - - apiGroups: [""] - resources: - - pods - - namespaces - - serviceaccounts - verbs: - - list - - watch - # The CNI plugin patches pods/status. - - apiGroups: [""] - resources: - - pods/status - verbs: - - patch - # Calico monitors various CRDs for config. - - apiGroups: ["crd.projectcalico.org"] - resources: - - globalfelixconfigs - - felixconfigurations - - bgppeers - - globalbgpconfigs - - bgpconfigurations - - ippools - - ipamblocks - - globalnetworkpolicies - - globalnetworksets - - networkpolicies - - networksets - - clusterinformations - - hostendpoints - - blockaffinities - verbs: - - get - - list - - watch - # Calico must create and update some CRDs on startup. - - apiGroups: ["crd.projectcalico.org"] - resources: - - ippools - - felixconfigurations - - clusterinformations - verbs: - - create - - update - # Calico stores some configuration information on the node. - - apiGroups: [""] - resources: - - nodes - verbs: - - get - - list - - watch - # These permissions are only required for upgrade from v2.6, and can - # be removed after upgrade or on fresh installations. - - apiGroups: ["crd.projectcalico.org"] - resources: - - bgpconfigurations - - bgppeers - verbs: - - create - - update - # These permissions are required for Calico CNI to perform IPAM allocations. - - apiGroups: ["crd.projectcalico.org"] - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - - apiGroups: ["crd.projectcalico.org"] - resources: - - ipamconfigs - verbs: - - get - # Block affinities must also be watchable by confd for route aggregation. - - apiGroups: ["crd.projectcalico.org"] - resources: - - blockaffinities - verbs: - - watch - # The Calico IPAM migration needs to get daemonsets. These permissions can be - # removed if not upgrading from an installation using host-local IPAM. - - apiGroups: ["apps"] - resources: - - daemonsets - verbs: - - get - --- - apiVersion: rbac.authorization.k8s.io/v1 - kind: ClusterRoleBinding - metadata: - name: calico-node - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-node - subjects: - - kind: ServiceAccount - name: calico-node - namespace: kube-system - - --- - # Source: calico/templates/calico-node.yaml - # This manifest installs the calico-node container, as well - # as the CNI plugins and network config on - # each master and worker node in a Kubernetes cluster. - kind: DaemonSet - apiVersion: apps/v1 - metadata: - name: calico-node - namespace: kube-system - labels: - k8s-app: calico-node - spec: - selector: - matchLabels: - k8s-app: calico-node - updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 1 - template: - metadata: - labels: - k8s-app: calico-node - annotations: - # This, along with the CriticalAddonsOnly toleration below, - # marks the pod as a critical add-on, ensuring it gets - # priority scheduling and that its resources are reserved - # if it ever gets evicted. - scheduler.alpha.kubernetes.io/critical-pod: '' - spec: - nodeSelector: - beta.kubernetes.io/os: linux - hostNetwork: true - tolerations: - # Make sure calico-node gets scheduled on all nodes. - - effect: NoSchedule - operator: Exists - # Mark the pod as a critical add-on for rescheduling. - - key: CriticalAddonsOnly - operator: Exists - - effect: NoExecute - operator: Exists - serviceAccountName: calico-node - # Minimize downtime during a rolling upgrade or deletion; tell Kubernetes to do a "force - # deletion": https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods. - terminationGracePeriodSeconds: 0 - priorityClassName: system-node-critical - initContainers: - # This container performs upgrade from host-local IPAM to calico-ipam. - # It can be deleted if this is a fresh installation, or if you have already - # upgraded to use calico-ipam. - - name: upgrade-ipam - image: 'registry.tkg.vmware.run/calico-all/cni-plugin:v3.11.2_vmware.1' - command: ["/opt/cni/bin/calico-ipam", "-upgrade"] - env: - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - volumeMounts: - - mountPath: /var/lib/cni/networks - name: host-local-net-dir - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - securityContext: - privileged: true - # This container installs the CNI binaries - # and CNI network config file on each node. - - name: install-cni - image: 'registry.tkg.vmware.run/calico-all/cni-plugin:v3.11.2_vmware.1' - command: ["/install-cni.sh"] - env: - # Name of the CNI config file to create. - - name: CNI_CONF_NAME - value: "10-calico.conflist" - # The CNI network config to install on each node. - - name: CNI_NETWORK_CONFIG - valueFrom: - configMapKeyRef: - name: calico-config - key: cni_network_config - # Set the hostname based on the k8s node name. - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - # CNI MTU Config variable - - name: CNI_MTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - # Prevents the container from sleeping forever. - - name: SLEEP - value: "false" - volumeMounts: - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - - mountPath: /host/etc/cni/net.d - name: cni-net-dir - securityContext: - privileged: true - # Adds a Flex Volume Driver that creates a per-pod Unix Domain Socket to allow Dikastes - # to communicate with Felix over the Policy Sync API. - - name: flexvol-driver - image: 'registry.tkg.vmware.run/calico-all/pod2daemon:v3.11.2_vmware.1' - volumeMounts: - - name: flexvol-driver-host - mountPath: /host/driver - securityContext: - privileged: true - containers: - # Runs calico-node container on each Kubernetes node. This - # container programs network policy and routes on each - # host. - - name: calico-node - image: 'registry.tkg.vmware.run/calico-all/node:v3.11.2_vmware.1' - env: - # Use Kubernetes API as the backing datastore. - - name: DATASTORE_TYPE - value: "kubernetes" - # Wait for the datastore. - - name: WAIT_FOR_DATASTORE - value: "true" - # Set based on the k8s node name. - - name: NODENAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - # Choose the backend to use. - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - # Cluster type to identify the deployment type - - name: CLUSTER_TYPE - value: "k8s,bgp" - # Auto-detect the BGP IP address. - - name: IP - value: "autodetect" - # Enable IPIP - - name: CALICO_IPV4POOL_IPIP - value: "Always" - # Set MTU for tunnel device used if ipip is enabled - - name: FELIX_IPINIPMTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - # The default IPv4 pool to create on startup if none exists. Pod IPs will be - # chosen from this range. Changing this value after installation will have - # no effect. This should fall within `--cluster-cidr`. - - name: CALICO_IPV4POOL_CIDR - value: "100.96.0.0/11" - # Disable file logging so `kubectl logs` works. - - name: CALICO_DISABLE_FILE_LOGGING - value: "true" - # Set Felix endpoint to host default action to ACCEPT. - - name: FELIX_DEFAULTENDPOINTTOHOSTACTION - value: "ACCEPT" - # Disable IPv6 on Kubernetes. - - name: FELIX_IPV6SUPPORT - value: "false" - # Set Felix logging to "info" - - name: FELIX_LOGSEVERITYSCREEN - value: "info" - - name: FELIX_HEALTHENABLED - value: "true" - securityContext: - privileged: true - resources: - requests: - cpu: 250m - livenessProbe: - exec: - command: - - /bin/calico-node - - -felix-live - - -bird-live - periodSeconds: 10 - initialDelaySeconds: 10 - failureThreshold: 6 - readinessProbe: - exec: - command: - - /bin/calico-node - - -felix-ready - - -bird-ready - periodSeconds: 10 - volumeMounts: - - mountPath: /lib/modules - name: lib-modules - readOnly: true - - mountPath: /run/xtables.lock - name: xtables-lock - readOnly: false - - mountPath: /var/run/calico - name: var-run-calico - readOnly: false - - mountPath: /var/lib/calico - name: var-lib-calico - readOnly: false - - name: policysync - mountPath: /var/run/nodeagent - volumes: - # Used by calico-node. - - name: lib-modules - hostPath: - path: /lib/modules - - name: var-run-calico - hostPath: - path: /var/run/calico - - name: var-lib-calico - hostPath: - path: /var/lib/calico - - name: xtables-lock - hostPath: - path: /run/xtables.lock - type: FileOrCreate - # Used to install CNI. - - name: cni-bin-dir - hostPath: - path: /opt/cni/bin - - name: cni-net-dir - hostPath: - path: /etc/cni/net.d - # Mount in the directory for host-local IPAM allocations. This is - # used when upgrading from host-local to calico-ipam, and can be removed - # if not using the upgrade-ipam init container. - - name: host-local-net-dir - hostPath: - path: /var/lib/cni/networks - # Used to create per-pod Unix Domain Sockets - - name: policysync - hostPath: - type: DirectoryOrCreate - path: /var/run/nodeagent - # Used to install Flex Volume Driver - - name: flexvol-driver-host - hostPath: - type: DirectoryOrCreate - path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds - --- - - apiVersion: v1 - kind: ServiceAccount - metadata: - name: calico-node - namespace: kube-system - - --- - # Source: calico/templates/calico-kube-controllers.yaml - - # See https://github.com/projectcalico/kube-controllers - apiVersion: apps/v1 - kind: Deployment - metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers - spec: - # The controllers can only have a single active instance. - replicas: 1 - selector: - matchLabels: - k8s-app: calico-kube-controllers - strategy: - type: Recreate - template: - metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers - annotations: - scheduler.alpha.kubernetes.io/critical-pod: '' - spec: - nodeSelector: - beta.kubernetes.io/os: linux - tolerations: - # Mark the pod as a critical add-on for rescheduling. - - key: CriticalAddonsOnly - operator: Exists - - key: node-role.kubernetes.io/master - effect: NoSchedule - serviceAccountName: calico-kube-controllers - priorityClassName: system-cluster-critical - containers: - - name: calico-kube-controllers - image: 'registry.tkg.vmware.run/calico-all/kube-controllers:v3.11.2_vmware.1' - env: - # Choose which controllers to run. - - name: ENABLED_CONTROLLERS - value: node - - name: DATASTORE_TYPE - value: kubernetes - readinessProbe: - exec: - command: - - /usr/bin/check-status - - -r - - --- - - apiVersion: v1 - kind: ServiceAccount - metadata: - name: calico-kube-controllers - namespace: kube-system - --- - # Source: calico/templates/calico-etcd-secrets.yaml - - --- - # Source: calico/templates/calico-typha.yaml - - --- - # Source: calico/templates/configure-canal.yaml diff --git a/providers/tests/clustergen/diffcluster/example/src b/providers/tests/clustergen/diffcluster/example/src deleted file mode 100644 index 3fd81b62cd..0000000000 --- a/providers/tests/clustergen/diffcluster/example/src +++ /dev/null @@ -1,871 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: Cluster -metadata: - name: testcluster -spec: - clusterNetwork: - pods: - cidrBlocks: - - 100.96.0.0/11 - controlPlaneRef: - apiVersion: controlplane.cluster.x-k8s.io/v1alpha3 - kind: KubeadmControlPlane - name: testcluster-control-plane - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSCluster - name: testcluster ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSCluster -metadata: - name: testcluster -spec: - bastion: - enabled: true - networkSpec: - subnets: - - availabilityZone: us-east-1a - cidrBlock: 10.0.1.0/24 - id: "" - isPublic: true - - availabilityZone: us-east-1a - cidrBlock: 10.0.0.0/24 - id: "" - vpc: - cidrBlock: 10.0.0.0/16 - id: "" - region: us-east-1 - sshKeyName: vui_aws ---- -apiVersion: controlplane.cluster.x-k8s.io/v1alpha3 -kind: KubeadmControlPlane -metadata: - name: testcluster-control-plane -spec: - infrastructureTemplate: - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSMachineTemplate - name: testcluster-control-plane - kubeadmConfigSpec: - clusterConfiguration: - apiServer: - extraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - timeoutForControlPlane: 8m0s - controllerManager: - extraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - dns: - imageRepository: registry.tkg.vmware.run - imageTag: v1.6.7_vmware.1 - type: CoreDNS - etcd: - local: - dataDir: /var/lib/etcd - extraArgs: - cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - imageRepository: registry.tkg.vmware.run - imageTag: v3.4.3_vmware.5 - imageRepository: registry.tkg.vmware.run - kubernetesVersion: v1.18.2+vmware.2 - scheduler: - extraArgs: - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - initConfiguration: - nodeRegistration: - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - name: '{{ ds.meta_data.local_hostname }}' - joinConfiguration: - nodeRegistration: - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - name: '{{ ds.meta_data.local_hostname }}' - useExperimentalRetryJoin: true - replicas: 1 - version: v1.18.2+vmware.2 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSMachineTemplate -metadata: - name: testcluster-control-plane -spec: - template: - spec: - ami: - id: ami-0f44ed42a1afd5623 - iamInstanceProfile: control-plane.cluster-api-provider-aws.sigs.k8s.io - instanceType: t3.small - rootVolume: - size: 80 - sshKeyName: vui_aws ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 -kind: AWSMachineTemplate -metadata: - name: testcluster-md-0 -spec: - template: - spec: - ami: - id: ami-0f44ed42a1afd5623 - iamInstanceProfile: nodes.cluster-api-provider-aws.sigs.k8s.io - instanceType: m5.large - rootVolume: - size: 80 - sshKeyName: vui_aws ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 -kind: KubeadmConfigTemplate -metadata: - name: testcluster-md-0 -spec: - template: - spec: - joinConfiguration: - nodeRegistration: - kubeletExtraArgs: - cloud-provider: aws - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - name: '{{ ds.meta_data.local_hostname }}' - useExperimentalRetryJoin: true ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineDeployment -metadata: - name: testcluster-md-0 -spec: - clusterName: testcluster - replicas: 1 - selector: - matchLabels: null - template: - metadata: - labels: - node-pool: testcluster-worker-pool - spec: - bootstrap: - configRef: - apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 - kind: KubeadmConfigTemplate - name: testcluster-md-0 - clusterName: testcluster - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSMachineTemplate - name: testcluster-md-0 - version: v1.18.2+vmware.2 ---- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: MachineHealthCheck -metadata: - name: testcluster -spec: - clusterName: testcluster - nodeStartupTimeout: 20m - selector: - matchLabels: - node-pool: testcluster-worker-pool - unhealthyConditions: - - status: Unknown - timeout: 5m - type: Ready - - status: "False" - timeout: 5m - type: Ready ---- -apiVersion: v1 -kind: Secret -metadata: - name: testcluster-postcreate -stringData: - calicoYaml: | - --- - kind: ConfigMap - apiVersion: v1 - metadata: - name: calico-config - namespace: kube-system - data: - typha_service_name: none - calico_backend: bird - veth_mtu: "1440" - cni_network_config: |- - { - "name": "k8s-pod-network", - "cniVersion": "0.3.1", - "plugins": [ - { - "type": "calico", - "log_level": "info", - "datastore_type": "kubernetes", - "nodename": "__KUBERNETES_NODE_NAME__", - "mtu": __CNI_MTU__, - "ipam": { - "type": "calico-ipam" - }, - "policy": { - "type": "k8s" - }, - "kubernetes": { - "kubeconfig": "__KUBECONFIG_FILEPATH__" - } - }, - { - "type": "portmap", - "snat": true, - "capabilities": {"portMappings": true} - } - ] - } - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: felixconfigurations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: FelixConfiguration - plural: felixconfigurations - singular: felixconfiguration - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: ipamblocks.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMBlock - plural: ipamblocks - singular: ipamblock - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: blockaffinities.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BlockAffinity - plural: blockaffinities - singular: blockaffinity - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: ipamhandles.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMHandle - plural: ipamhandles - singular: ipamhandle - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: ipamconfigs.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPAMConfig - plural: ipamconfigs - singular: ipamconfig - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: bgppeers.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BGPPeer - plural: bgppeers - singular: bgppeer - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: bgpconfigurations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: BGPConfiguration - plural: bgpconfigurations - singular: bgpconfiguration - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: ippools.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: IPPool - plural: ippools - singular: ippool - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: hostendpoints.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: HostEndpoint - plural: hostendpoints - singular: hostendpoint - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: clusterinformations.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: ClusterInformation - plural: clusterinformations - singular: clusterinformation - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: globalnetworkpolicies.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: GlobalNetworkPolicy - plural: globalnetworkpolicies - singular: globalnetworkpolicy - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: globalnetworksets.crd.projectcalico.org - spec: - scope: Cluster - group: crd.projectcalico.org - version: v1 - names: - kind: GlobalNetworkSet - plural: globalnetworksets - singular: globalnetworkset - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: networkpolicies.crd.projectcalico.org - spec: - scope: Namespaced - group: crd.projectcalico.org - version: v1 - names: - kind: NetworkPolicy - plural: networkpolicies - singular: networkpolicy - --- - apiVersion: apiextensions.k8s.io/v1 - kind: CustomResourceDefinition - metadata: - name: networksets.crd.projectcalico.org - spec: - scope: Namespaced - group: crd.projectcalico.org - version: v1 - names: - kind: NetworkSet - plural: networksets - singular: networkset - --- - kind: ClusterRole - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-kube-controllers - rules: - - apiGroups: - - "" - resources: - - nodes - verbs: - - watch - - list - - get - - apiGroups: - - "" - resources: - - pods - verbs: - - get - - apiGroups: - - crd.projectcalico.org - resources: - - ippools - verbs: - - list - - apiGroups: - - crd.projectcalico.org - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - - apiGroups: - - crd.projectcalico.org - resources: - - clusterinformations - verbs: - - get - - create - - update - --- - kind: ClusterRoleBinding - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-kube-controllers - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-kube-controllers - subjects: - - kind: ServiceAccount - name: calico-kube-controllers - namespace: kube-system - --- - kind: ClusterRole - apiVersion: rbac.authorization.k8s.io/v1 - metadata: - name: calico-node - rules: - - apiGroups: - - "" - resources: - - pods - - nodes - - namespaces - verbs: - - get - - apiGroups: - - "" - resources: - - endpoints - - services - verbs: - - watch - - list - - get - - apiGroups: - - "" - resources: - - nodes/status - verbs: - - patch - - update - - apiGroups: - - networking.k8s.io - resources: - - networkpolicies - verbs: - - watch - - list - - apiGroups: - - "" - resources: - - pods - - namespaces - - serviceaccounts - verbs: - - list - - watch - - apiGroups: - - "" - resources: - - pods/status - verbs: - - patch - - apiGroups: - - crd.projectcalico.org - resources: - - globalfelixconfigs - - felixconfigurations - - bgppeers - - globalbgpconfigs - - bgpconfigurations - - ippools - - ipamblocks - - globalnetworkpolicies - - globalnetworksets - - networkpolicies - - networksets - - clusterinformations - - hostendpoints - - blockaffinities - verbs: - - get - - list - - watch - - apiGroups: - - crd.projectcalico.org - resources: - - ippools - - felixconfigurations - - clusterinformations - verbs: - - create - - update - - apiGroups: - - "" - resources: - - nodes - verbs: - - get - - list - - watch - - apiGroups: - - crd.projectcalico.org - resources: - - bgpconfigurations - - bgppeers - verbs: - - create - - update - - apiGroups: - - crd.projectcalico.org - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - - apiGroups: - - crd.projectcalico.org - resources: - - ipamconfigs - verbs: - - get - - apiGroups: - - crd.projectcalico.org - resources: - - blockaffinities - verbs: - - watch - - apiGroups: - - apps - resources: - - daemonsets - verbs: - - get - --- - apiVersion: rbac.authorization.k8s.io/v1 - kind: ClusterRoleBinding - metadata: - name: calico-node - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-node - subjects: - - kind: ServiceAccount - name: calico-node - namespace: kube-system - --- - kind: DaemonSet - apiVersion: apps/v1 - metadata: - name: calico-node - namespace: kube-system - labels: - k8s-app: calico-node - spec: - selector: - matchLabels: - k8s-app: calico-node - updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 1 - template: - metadata: - labels: - k8s-app: calico-node - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - spec: - nodeSelector: - beta.kubernetes.io/os: linux - hostNetwork: true - tolerations: - - effect: NoSchedule - operator: Exists - - key: CriticalAddonsOnly - operator: Exists - - effect: NoExecute - operator: Exists - serviceAccountName: calico-node - terminationGracePeriodSeconds: 0 - priorityClassName: system-node-critical - initContainers: - - name: upgrade-ipam - image: registry.tkg.vmware.run/calico-all/cni-plugin:v3.11.2_vmware.1 - command: - - /opt/cni/bin/calico-ipam - - -upgrade - env: - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - volumeMounts: - - mountPath: /var/lib/cni/networks - name: host-local-net-dir - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - securityContext: - privileged: true - - name: install-cni - image: registry.tkg.vmware.run/calico-all/cni-plugin:v3.11.2_vmware.1 - command: - - /install-cni.sh - env: - - name: CNI_CONF_NAME - value: 10-calico.conflist - - name: CNI_NETWORK_CONFIG - valueFrom: - configMapKeyRef: - name: calico-config - key: cni_network_config - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CNI_MTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - - name: SLEEP - value: "false" - volumeMounts: - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - - mountPath: /host/etc/cni/net.d - name: cni-net-dir - securityContext: - privileged: true - - name: flexvol-driver - image: registry.tkg.vmware.run/calico-all/pod2daemon:v3.11.2_vmware.1 - volumeMounts: - - name: flexvol-driver-host - mountPath: /host/driver - securityContext: - privileged: true - containers: - - name: calico-node - image: registry.tkg.vmware.run/calico-all/node:v3.11.2_vmware.1 - env: - - name: DATASTORE_TYPE - value: kubernetes - - name: WAIT_FOR_DATASTORE - value: "true" - - name: NODENAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - - name: CLUSTER_TYPE - value: k8s,bgp - - name: IP - value: autodetect - - name: CALICO_IPV4POOL_IPIP - value: Always - - name: FELIX_IPINIPMTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - - name: CALICO_IPV4POOL_CIDR - value: 100.96.0.0/11 - - name: CALICO_DISABLE_FILE_LOGGING - value: "true" - - name: FELIX_DEFAULTENDPOINTTOHOSTACTION - value: ACCEPT - - name: FELIX_IPV6SUPPORT - value: "false" - - name: FELIX_LOGSEVERITYSCREEN - value: info - - name: FELIX_HEALTHENABLED - value: "true" - securityContext: - privileged: true - resources: - requests: - cpu: 250m - livenessProbe: - exec: - command: - - /bin/calico-node - - -felix-live - - -bird-live - periodSeconds: 10 - initialDelaySeconds: 10 - failureThreshold: 6 - readinessProbe: - exec: - command: - - /bin/calico-node - - -felix-ready - - -bird-ready - periodSeconds: 10 - volumeMounts: - - mountPath: /lib/modules - name: lib-modules - readOnly: true - - mountPath: /run/xtables.lock - name: xtables-lock - readOnly: false - - mountPath: /var/run/calico - name: var-run-calico - readOnly: false - - mountPath: /var/lib/calico - name: var-lib-calico - readOnly: false - - name: policysync - mountPath: /var/run/nodeagent - volumes: - - name: lib-modules - hostPath: - path: /lib/modules - - name: var-run-calico - hostPath: - path: /var/run/calico - - name: var-lib-calico - hostPath: - path: /var/lib/calico - - name: xtables-lock - hostPath: - path: /run/xtables.lock - type: FileOrCreate - - name: cni-bin-dir - hostPath: - path: /opt/cni/bin - - name: cni-net-dir - hostPath: - path: /etc/cni/net.d - - name: host-local-net-dir - hostPath: - path: /var/lib/cni/networks - - name: policysync - hostPath: - type: DirectoryOrCreate - path: /var/run/nodeagent - - name: flexvol-driver-host - hostPath: - type: DirectoryOrCreate - path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds - --- - apiVersion: v1 - kind: ServiceAccount - metadata: - name: calico-node - namespace: kube-system - --- - apiVersion: apps/v1 - kind: Deployment - metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers - spec: - replicas: 1 - selector: - matchLabels: - k8s-app: calico-kube-controllers - strategy: - type: Recreate - template: - metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - spec: - nodeSelector: - beta.kubernetes.io/os: linux - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - key: node-role.kubernetes.io/master - effect: NoSchedule - serviceAccountName: calico-kube-controllers - priorityClassName: system-cluster-critical - containers: - - name: calico-kube-controllers - image: registry.tkg.vmware.run/calico-all/kube-controllers:v3.11.2_vmware.1 - env: - - name: ENABLED_CONTROLLERS - value: node - - name: DATASTORE_TYPE - value: kubernetes - readinessProbe: - exec: - command: - - /usr/bin/check-status - - -r - --- - apiVersion: v1 - kind: ServiceAccount - metadata: - name: calico-kube-controllers - namespace: kube-system - --- - --- - --- diff --git a/providers/tests/clustergen/diffcluster/helpers.sh b/providers/tests/clustergen/diffcluster/helpers.sh deleted file mode 100644 index da01c7bb91..0000000000 --- a/providers/tests/clustergen/diffcluster/helpers.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -SCRIPT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" || exit; pwd)" -YTT=${YTT:-ytt} - -normalize() { -echo "---" > /tmp/norm.yaml -${YTT} -f "${SCRIPT_ROOT}"/normalize.yaml -f "$1" >> /tmp/norm.yaml - -# ytt found to output documents in different order under some circumstances. -# order the yaml documents by their content before comparing/committing them so we can get -# deterministic outputs every time. -# -# starting with start record pattern ---, accumulate lines until next ---, replacing newlines with -# stand-in string _^_, sort results, output result after replacing stand-in back to newline -awk '/^---/{if(s){print s}s=$0} !/^---/{s=s"_^_"$0}END{print s}' /tmp/norm.yaml | sort | sed $'s/_\^_/\\\n/g' > "$2" -} - -# eliminate extraneous metadata and status from dryrun resources that shows up -# as diff noise when comparing against legacy ytt-generated outputs -denoise_dryrun() { -echo "---" > "$2" -${YTT} -f "${SCRIPT_ROOT}"/normalize_cc.yaml -f "$1" >> "$2" -} diff --git a/providers/tests/clustergen/diffcluster/normalize.yaml b/providers/tests/clustergen/diffcluster/normalize.yaml deleted file mode 100644 index f2f11c6958..0000000000 --- a/providers/tests/clustergen/diffcluster/normalize.yaml +++ /dev/null @@ -1,83 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") - -#! Normalize the representation of stringified yaml by decoding and encoding it -#! back. Works with stringified yaml docsets as well. -#@ def normalize_yaml_string(left, right): -#@ docs = left.split("---\n") -#@ return "---\n".join([x for x in [yaml.encode(yaml.decode(d)) for d in docs] if x != ""]) -#@ end - - -#@ remove_secret_data_matching_list = ["cert-manager"] - -#! secret_metadata_name_match: returns true if the "kind":"Secret" -#! and resource name (metadata.name) contains anything from matching_list -#! if matching_list is empty, then remove_secret_data_matching_list is used -#! -#@ def secret_metadata_name_match(x, l, r, matching_list=None): -#@ if not ("kind" in l and l["kind"] == "Secret"): -#@ return False -#@ end -#@ -#@ if not ("metadata" in l and "name" in l["metadata"]): -#@ return False -#@ end -#@ -#@ if not matching_list: -#@ matching_list = remove_secret_data_matching_list -#@ end -#@ -#@ for val in matching_list: -#@ if not (l["metadata"]["name"].find(val) == -1): -#@ return True -#@ end -#@ end -#@ -#@ return False -#@ end - -#@ def tkg_metadata_configmap_match(x, l, r): -#@ return secret_metadata_name_match(x, l, r, ["tkg-metadata-configmap"]) -#@ end - -#! Replacing tkg version to fixed value because -#! we dont want to update the expected output whenever tkg version changes -#@ def replace_tkg_version(left, right): -#@ metadataConfigMap = yaml.decode(left) -#@ metadata = yaml.decode(metadataConfigMap["data"]["metadata.yaml"]) -#@ metadata["cluster"]["tkgVersion"] = right -#@ metadataYaml = yaml.encode(metadata) -#@ metadataConfigMap["data"]["metadata.yaml"] = metadataYaml -#@ return yaml.encode(metadataConfigMap) -#@ end - -#@ def tkg_metadata_bom_configmap_match(x, l, r): -#@ return secret_metadata_name_match(x, l, r, ["tkg-metadata-bom-configmap"]) -#@ end - -#! Replacing tkg bom to fixed value because -#! we dont want to change the expected output when bom changes -#@ def replace_tkg_bom(left, right): -#@ bomConfigMap = yaml.decode(left) -#@ bomConfigMap["data"]["bom.yaml"] = yaml.encode(right) -#@ return yaml.encode(bomConfigMap) -#@ end - -#@overlay/match by=secret_metadata_name_match,expects="0+" ---- -stringData: - #@overlay/replace - value: (removed for brevity) - -#@overlay/match by=tkg_metadata_configmap_match,expects="0+" ---- -stringData: - #@overlay/replace via=replace_tkg_version - value: (removed for brevity) - -#@overlay/match by=tkg_metadata_bom_configmap_match,expects="0+" ---- -stringData: - #@overlay/replace via=replace_tkg_bom - value: (removed for brevity) diff --git a/providers/tests/clustergen/diffcluster/normalize_cc.yaml b/providers/tests/clustergen/diffcluster/normalize_cc.yaml deleted file mode 100644 index 12ce203cf3..0000000000 --- a/providers/tests/clustergen/diffcluster/normalize_cc.yaml +++ /dev/null @@ -1,67 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@overlay/match by=lambda _,l,r: "annotations" in l["metadata"],expects="0+" ---- -metadata: - #@overlay/match-child-defaults missing_ok=True - annotations: - #@overlay/remove - cluster.x-k8s.io/cloned-from-groupkind: - #@overlay/remove - cluster.x-k8s.io/cloned-from-name: - #@overlay/remove - topology.cluster.x-k8s.io/managed-field-paths: - -#@overlay/match by=lambda _,l,r: "labels" in l["metadata"],expects="0+" ---- -metadata: - #@overlay/match-child-defaults missing_ok=True - labels: - #@overlay/remove - topology.cluster.x-k8s.io/deployment-name: - #@overlay/remove - topology.cluster.x-k8s.io/owned: - -#@overlay/match by=lambda _,l,r: "labels" in l["metadata"] and l["kind"] != "ClusterResourceSet", expects="0+" ---- -metadata: - #@overlay/match-child-defaults missing_ok=True - labels: - #@overlay/remove - cluster.x-k8s.io/cluster-name: - -#@overlay/match by=lambda _,l,r: "ownerReferences" in l["metadata"],expects="0+" ---- -metadata: - #@overlay/remove - ownerReferences: - -#@overlay/match by=lambda _,l,r: "resourceVersion" in l["metadata"],expects="0+" ---- -metadata: - #@overlay/remove - resourceVersion: - - -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -#@overlay/match missing_ok=True -#@overlay/remove -status: - - -#@overlay/match by=lambda _,l,r: "labels" in l["metadata"] and len(l["metadata"]["labels"]) == 0 ,expects="0+" ---- -metadata: - #@overlay/remove - labels: - -#@overlay/match by=lambda _,l,r: "annotations" in l["metadata"] and len(l["metadata"]["annotations"]) == 0 ,expects="0+" ---- -metadata: - #@overlay/remove - annotations: - -#@overlay/match by=overlay.subset({"kind": "Secret"}), expects="0+" -#@overlay/remove ---- diff --git a/providers/tests/clustergen/gen_duplicate_bom_azure.py b/providers/tests/clustergen/gen_duplicate_bom_azure.py deleted file mode 100755 index 40274bca16..0000000000 --- a/providers/tests/clustergen/gen_duplicate_bom_azure.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2020 The TKG Contributors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# In TKG 1.2, we provided a way for users to customize the Azure VM images by editing the BOM. - -# This script is used to duplicate BOM files for a given k8s version which are populated with various test configurations -# which further can be used in clustergen tests. - -import os -import yaml -import sys - -def get_bom_dir(): - return os.path.join(sys.argv[1], "bom") - -def get_default_tkr_bom(): - bomDir = get_bom_dir() - for bomFile in os.listdir(bomDir): - if(bomFile.startswith("tkr-bom")): - return bomFile - return None - -def main(): - bomFile = get_default_tkr_bom() - bomDir = get_bom_dir() - bomFilePath = os.path.join(bomDir, bomFile) - with open(bomFilePath) as file: - bom = yaml.safe_load(file) - osInfo = bom["azure"][0]["osinfo"] - - # Create a file with no azure VM image info in BOM - del bom["azure"] - bom["release"]["version"] = "v0.0.0+no-azure-image" - with open(os.path.join(bomDir, "bom-clustergen-no-azure-image-test.yaml"), 'w') as file: - documents = yaml.dump(bom, file) - - # Create a file with marketplace azure VM image info in BOM - bom["azure"] = [{ - "publisher": "bom-image-publisher", - "offer":"bom-image-offer", - "sku":"bom-image-sku", - "version":"bom-image-version", - "thirdPartyImage":True, - "osinfo": osInfo - }] - bom["release"]["version"] = "v0.0.0+marketplace-image" - with open(os.path.join(bomDir, "bom-clustergen-marketplace-image-test.yaml"), 'w') as file: - documents = yaml.dump(bom, file) - - # Create a file with marketplace azure VM image(no thirdPartyImage flag) info in BOM - bom["azure"] = [{ - "publisher": "bom-image-publisher", - "offer":"bom-image-offer", - "sku":"bom-image-sku", - "version":"bom-image-version", - "osinfo": osInfo - }] - bom["release"]["version"] = "v0.0.0+marketplace-image-no-thirdpartyimage" - with open(os.path.join(bomDir, "bom-clustergen-marketplace-no-thirdparty-image-test.yaml"), 'w') as file: - documents = yaml.dump(bom, file) - - # Create a file with shared gallery azure VM image info in BOM - bom["azure"] = [{ - "resourceGroup": "bom-resource-group", - "name":"bom-image-name", - "subscriptionID":"bom-subscription-id", - "version":"bom-image-version", - "gallery":"bom-image-gallery", - "osinfo": osInfo - }] - bom["release"]["version"] = "v0.0.0+shared-gallery-image" - with open(os.path.join(bomDir, "bom-clustergen-shared-gallery-image-test.yaml"), 'w') as file: - documents = yaml.dump(bom, file) - -if __name__ == "__main__": - main() diff --git a/providers/tests/clustergen/gen_testcases.sh b/providers/tests/clustergen/gen_testcases.sh deleted file mode 100755 index 1f2b45caa1..0000000000 --- a/providers/tests/clustergen/gen_testcases.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# alternate location of the pict (https://github.com/microsoft/pict) binary if not in PATH -PICT=${PICT:=pict} - -SCRIPT=$(realpath "${BASH_SOURCE[0]}") -TESTROOT=$(dirname "$SCRIPT") -PARAMS_CSV=${TESTROOT}/gencluster_params.csv -TESTDATA=${TESTDATA:-testdata} -RUNPICT=${RUNPICT:-true} - -#shellcheck disable=SC2164,SC2086,SC2035,SC2012 -infras=$(cd ${TESTROOT}/param_models; ls -1 *.model | cut -d. -f1 | cut -d_ -f2-) - -rm -rf "${TESTDATA:?}"/*.case - -for infra in ${infras}; do - PARAMS_CSV=${TESTROOT}/gencluster_params_${infra}.csv - - if [ "${RUNPICT}" = true ]; then - echo -n >"${PARAMS_CSV}" - model=${TESTROOT}/param_models/cluster_"$infra".model - echo processing "$model" ... - ${PICT} "$model" /s - echo ${PICT} "$model" to /tmp/pict.gen."$infra" - ${PICT} "$model" >/tmp/pict.gen."$infra" - echo "${PARAMS_CSV}" - # pict's output is padded to tabular form. Cleanse it into csv with no spaces between values - perl -pe 's/"\s+"/","/g; s/([-A-Z0-9_])\s+([-A-Z0-9_])/$1,$2/g; s/@@/,/g' /tmp/pict.gen."${infra}" >>"${PARAMS_CSV}" - else - echo "(skipped) parameter generation with pict" - fi - - echo "Generating test cases for cluster creation from ${PARAMS_CSV} ..." - "${TESTROOT}"/gencluster_params.py "${PARAMS_CSV}" "${TESTDATA}" -done diff --git a/providers/tests/clustergen/gencluster_params.py b/providers/tests/clustergen/gencluster_params.py deleted file mode 100755 index 78248cca7b..0000000000 --- a/providers/tests/clustergen/gencluster_params.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2020 The TKG Contributors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import csv -import os -import sys -import hashlib - - -def write_test_cases(params_file, test_dir): - test_num = 0 - with open(params_file, 'r') as file: - my_reader = csv.DictReader(file, delimiter=',') - for var_dict in my_reader: - test_num+=1 - cmd_args = [] - cfg_args = [] - dict_contents = "" - for k, v in sorted(var_dict.items()): - dict_contents += '{}{}'.format(k, v) - if k == "_CNAME": - cmd_args.insert(0, v) - elif k == "_PLAN": - cmd_args.append('{} {}'.format("--plan", v)) - elif k == "_INFRA": - cmd_args.append('{} {}'.format("-i", v)) - - if k.startswith('--'): - if v != "NOTPROVIDED": - k = k.lower() - if k.startswith('--enable-'): - cmd_args.append('{}={}'.format(k, v)) - else: - cmd_args.append('{} {}'.format(k, v)) - else: - # hack to workaround the problem with pict where there is - # no escape char for comma and double quote. - # sets "AZURE_CUSTOM_TAGS" to "tagKey1=tagValue1, tagKey2=tagValue2" - - if k == "AZURE_CUSTOM_TAGS" and v.startswith('tagKey1='): - cfg_args.append('{}: {}'.format(k, 'tagKey1=tagValue1, tagKey2=tagValue2')) - elif v != "NA": - cfg_args.append('{}: {}'.format(k, v.replace("", ",").replace("", "\""))) - - testid = int(hashlib.sha256(dict_contents.encode('utf-8')).hexdigest(), 16) % 10**8 - filename = "%8.8d.case" % (testid) - with open(os.path.join(test_dir, filename), "w") as w: - w.write('#! ({}) EXE: {}\n\n'.format("%4.4d" % test_num, " ".join(cmd_args))) - w.write('{}\n'.format("\n".join(cfg_args))) - -def main(): - if len(sys.argv) != 3: - print("Usage {} csv_params_file test_data_dir".format(sys.argv[0])) - sys.exit(1) - else: - write_test_cases(sys.argv[1], sys.argv[2]) - -if __name__ == "__main__": - main() diff --git a/providers/tests/clustergen/param_models/cluster_aws.model b/providers/tests/clustergen/param_models/cluster_aws.model deleted file mode 100644 index 61e5280641..0000000000 --- a/providers/tests/clustergen/param_models/cluster_aws.model +++ /dev/null @@ -1,138 +0,0 @@ ---CONTROLPLANE-MACHINE-COUNT: "NOTPROVIDED", "1","3","5" ---WORKER-MACHINE-COUNT: "NOTPROVIDED", "3" ---CONTROLPLANE-SIZE: "NOTPROVIDED", "i3.xlarge" ---TKR: "NOTPROVIDED", "v1.23.8+vmware.2-tkg.1-zshippable" ---NAMESPACE: "NOTPROVIDED", "default", "test" ---SIZE: "NOTPROVIDED", "t3.medium" ---WORKER-SIZE: "NOTPROVIDED", "m5.xlarge" ---CNI: "NOTPROVIDED", "antrea", "calico", "none" - -CONTROL_PLANE_MACHINE_COUNT: "NA","1","3","5" -WORKER_MACHINE_COUNT: "NA","1","3","5" -CONTROL_PLANE_MACHINE_TYPE: "NA","t3.small" -NODE_MACHINE_TYPE: "NA","m5.large" - -_CNAME: "testcluster", "c1" -_PLAN: "dev", "prod" -_INFRA: "aws:v2.0.2" - -BASTION_HOST_ENABLED: "true" -NODE_STARTUP_TIMEOUT: "20m" - -SIZE: "NA","i3.xlarge","r4.8xlarge" -CP_SIZE: "NA","i3.xlarge","r4.8xlarge" -WORKER_SIZE: "NA","i3.xlarge","r4.8xlarge" - -CLUSTER_CIDR: "100.96.0.0/11", "10.10.10.10/18" -SERVICE_CIDR: "100.64.0.0/18", "10.10.10.10/16" -NAMESPACE: "NA", "default", "test" -CLUSTER_API_SERVER_PORT: "NA","443" - -AWS_ACCESS_KEY_ID: "" -AWS_REGION: "us-east-1", "us-west-2" -AWS_NODE_AZ: "us-east-1a", "us-west-2b" -AWS_SECRET_ACCESS_KEY: "" -AWS_B64ENCODED_CREDENTIALS: "W2RlZmF1bHRdCmF3c19hY2Nlc3Nfa2V5X2lkID0gQUtJQVVZZZ" -AWS_SSH_KEY_NAME: "default", "test" -AWS_VPC_ID: "NA", "vpc-123456" -AWS_VPC_CIDR: "NA", "10.0.0.0/16" -AWS_PRIVATE_NODE_CIDR: "NA", "10.0.0.0/24" -AWS_PUBLIC_NODE_CIDR: "NA", "10.0.1.0/24" -AWS_PRIVATE_SUBNET_ID: "NA", "subnet-private-1" -AWS_PUBLIC_SUBNET_ID: "NA", "subnet-public-1" -AWS_LOAD_BALANCER_SCHEME_INTERNAL: "true", "false" - -AWS_NODE_AZ_1: "NA", "us-east-1b", "us-west-2b" -AWS_PRIVATE_NODE_CIDR_1: "NA", "10.0.2.0/24" -AWS_PUBLIC_NODE_CIDR_1: "NA", "10.0.3.0/24" -AWS_PRIVATE_SUBNET_ID_1: "NA", "subnet-private-2" -AWS_PUBLIC_SUBNET_ID_1: "NA", "subnet-public-2" - -AWS_NODE_AZ_2: "NA", "us-east-1c", "us-west-2c" -AWS_PRIVATE_NODE_CIDR_2: "NA", "10.0.4.0/24" -AWS_PUBLIC_NODE_CIDR_2: "NA", "10.0.5.0/24" -AWS_PRIVATE_SUBNET_ID_2: "NA", "subnet-private-3" -AWS_PUBLIC_SUBNET_ID_2: "NA", "subnet-public-3" - -WORKER_MACHINE_COUNT_0: "NA", "1", "2" -WORKER_MACHINE_COUNT_1: "NA", "1", "2" -WORKER_MACHINE_COUNT_2: "NA", "1", "2" - -AWS_IDENTITY_REF_KIND: "AWSClusterRoleIdentity", "AWSClusterStaticIdentity", "" -AWS_IDENTITY_REF_NAME: "", "test" -AWS_SECURITY_GROUP_APISERVER_LB: "sg-12345", "" -AWS_SECURITY_GROUP_BASTION: "sg-12345", "" -AWS_SECURITY_GROUP_CONTROLPLANE: "sg-12345", "" -AWS_SECURITY_GROUP_LB: "sg-12345", "" -AWS_SECURITY_GROUP_NODE: "sg-12345", "" -AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB: "80", "90", "" -AWS_NODE_OS_DISK_SIZE_GIB: "80", "90", "" - -OS_NAME: "NA", "ubuntu", "amazon" -OS_VERSION: "NA", "20.04", "2", "3" - -BUILD_EDITION: "tkg", "tce" - -IF [OS_NAME] = "\"NA\"" THEN [OS_VERSION] = "\"NA\""; -IF [OS_NAME] = "\"ubuntu\"" THEN [OS_VERSION] = "\"20.04\""; -IF [OS_NAME] = "\"amazon\"" THEN [OS_VERSION] = "\"2\""; - -IF [AWS_REGION] = "\"us-east-1\"" THEN [AWS_NODE_AZ] = "\"us-east-1a\""; -IF [AWS_REGION] = "\"us-east-1\"" THEN [AWS_NODE_AZ_1] <> "\"us-west-2b\""; -IF [AWS_REGION] = "\"us-east-1\"" THEN [AWS_NODE_AZ_2] <> "\"us-west-2c\""; -IF [AWS_REGION] = "\"us-west-2\"" THEN [AWS_NODE_AZ_1] <> "\"us-east-1b\""; -IF [AWS_REGION] = "\"us-west-2\"" THEN [AWS_NODE_AZ_2] <> "\"us-east-1c\""; - -# if new VPC -IF [AWS_VPC_ID] = "\"NA\"" THEN [AWS_VPC_CIDR] <> "\"NA\""; -IF [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PRIVATE_NODE_CIDR] <> "\"NA\""; -IF [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PUBLIC_NODE_CIDR] <> "\"NA\""; -IF [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PRIVATE_SUBNET_ID] = "\"NA\""; -IF [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PUBLIC_SUBNET_ID] = "\"NA\""; -# if existing VPC -IF [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_VPC_CIDR] = "\"NA\""; -IF [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PRIVATE_SUBNET_ID] <> "\"NA\""; -IF [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PUBLIC_SUBNET_ID] <> "\"NA\""; -IF [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PRIVATE_NODE_CIDR] = "\"NA\""; -IF [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PUBLIC_NODE_CIDR] = "\"NA\""; - -# if plan is prod -IF [_PLAN] = "\"prod\"" THEN [AWS_NODE_AZ_1] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" THEN [AWS_NODE_AZ_2] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [WORKER_MACHINE_COUNT_0] = "\"NA\"" THEN [WORKER_MACHINE_COUNT_1] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [WORKER_MACHINE_COUNT_0] = "\"NA\"" THEN [WORKER_MACHINE_COUNT_2] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [WORKER_MACHINE_COUNT_0] <> "\"NA\"" THEN [WORKER_MACHINE_COUNT_1] = "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [WORKER_MACHINE_COUNT_0] <> "\"NA\"" THEN [WORKER_MACHINE_COUNT_2] = "\"NA\""; -# if prod and new VPC -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PRIVATE_NODE_CIDR_1] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PUBLIC_NODE_CIDR_1] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PRIVATE_NODE_CIDR_2] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PUBLIC_NODE_CIDR_2] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PRIVATE_SUBNET_ID_1] = "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PUBLIC_SUBNET_ID_1] = "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PRIVATE_SUBNET_ID_2] = "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] = "\"NA\"" THEN [AWS_PUBLIC_SUBNET_ID_2] = "\"NA\""; -# if prod and existing VPC -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PRIVATE_SUBNET_ID_1] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PUBLIC_SUBNET_ID_1] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PRIVATE_SUBNET_ID_2] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PUBLIC_SUBNET_ID_2] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PRIVATE_NODE_CIDR_1] = "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PUBLIC_NODE_CIDR_1] = "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PRIVATE_NODE_CIDR_2] = "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [AWS_VPC_ID] <> "\"NA\"" THEN [AWS_PUBLIC_NODE_CIDR_2] = "\"NA\""; - -# if plan is dev -IF [_PLAN] = "\"dev\"" THEN [AWS_NODE_AZ_1] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [AWS_NODE_AZ_2] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [AWS_PRIVATE_NODE_CIDR_1] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [AWS_PUBLIC_NODE_CIDR_1] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [AWS_PRIVATE_NODE_CIDR_2] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [AWS_PUBLIC_NODE_CIDR_2] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [AWS_PRIVATE_SUBNET_ID_1] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [AWS_PUBLIC_SUBNET_ID_1] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [AWS_PRIVATE_SUBNET_ID_2] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [AWS_PUBLIC_SUBNET_ID_2] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [WORKER_MACHINE_COUNT_0] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [WORKER_MACHINE_COUNT_1] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [WORKER_MACHINE_COUNT_2] = "\"NA\""; diff --git a/providers/tests/clustergen/param_models/cluster_azure.model b/providers/tests/clustergen/param_models/cluster_azure.model deleted file mode 100644 index bc4084979b..0000000000 --- a/providers/tests/clustergen/param_models/cluster_azure.model +++ /dev/null @@ -1,169 +0,0 @@ ---CONTROLPLANE-MACHINE-COUNT: "NOTPROVIDED", "1","3","5" ---WORKER-MACHINE-COUNT: "NOTPROVIDED", "3" ---CONTROLPLANE-SIZE: "NOTPROVIDED", "i3.xlarge" ---TKR: "NOTPROVIDED", "v1.23.8+vmware.2-tkg.1-zshippable", "v0.0.0+no-azure-image", "v0.0.0+marketplace-image", "v0.0.0+marketplace-image-no-thirdpartyimage", "v0.0.0+shared-gallery-image" ---NAMESPACE: "NOTPROVIDED", "default", "test" ---SIZE: "NOTPROVIDED", "t3.medium" ---WORKER-SIZE: "NOTPROVIDED", "m5.xlarge" ---CNI: "''", "antrea", "calico", "none" - -CONTROL_PLANE_MACHINE_COUNT: "NA","1","3","5" -WORKER_MACHINE_COUNT: "NA","1","3","5" - -_CNAME: "testcluster" -_PLAN: "dev", "prod" -_INFRA: "azure:v1.4.0" - -NODE_STARTUP_TIMEOUT: "20m" - -CLUSTER_CIDR: "100.96.0.0/11", "10.10.10.10/18" -SERVICE_CIDR: "100.64.0.0/18", "10.10.10.10/16" -NAMESPACE: "NA", "default", "test", "namespace with spaces" -CLUSTER_API_SERVER_PORT: "NA","443" - -AZURE_LOCATION: "eastus", "westus" -AZURE_SUBSCRIPTION_ID: "6c2a2ce1-649f-9d9k-a19c-c729h3cf6126" -AZURE_TENANT_ID: "b39138ca-7jk2-4b4a-a4d6-cd8hjliyd62f0" -AZURE_CLIENT_ID: "" -AZURE_CLIENT_SECRET: "" -AZURE_ENVIRONMENT: "AzurePublicCloud" - -AZURE_SSH_PUBLIC_KEY_B64: "c3NoLXJzYSBB", "c3NoLXJzYSBC" -AZURE_CONTROL_PLANE_MACHINE_TYPE: "Standard_B2s", "Standard_Dv2s" -AZURE_NODE_MACHINE_TYPE: "Standard_B2s", "Standard_Dv2s" - -AZURE_ENABLE_ACCELERATED_NETWORKING: "NA", "true", "false" - -AZURE_RESOURCE_GROUP: "NA", "azure-resource-group" -AZURE_VNET_RESOURCE_GROUP: "NA", "azure-vnet-resource-group" -AZURE_VNET_NAME: "NA", "azure-vnet-name" -AZURE_VNET_CIDR: "NA", "10.0.0.0/8" -AZURE_CONTROL_PLANE_SUBNET_NAME: "NA", "azure-control-plane-subnet" -AZURE_CONTROL_PLANE_SUBNET_CIDR: "NA", "10.0.0.0/16" -AZURE_NODE_SUBNET_NAME: "NA", "azure-node-subnet" -AZURE_NODE_SUBNET_CIDR: "NA", "10.1.0.0/16" - -# Azure VM Image configuration -AZURE_IMAGE_RESOURCE_GROUP: "NA", "image_resource_group" -AZURE_IMAGE_NAME: "NA", "image_name" -AZURE_IMAGE_SUBSCRIPTION_ID: "NA", "image_subscription_id" -AZURE_IMAGE_GALLERY: "NA", "image_gallery" - -AZURE_IMAGE_PUBLISHER: "NA", "image_publisher" -AZURE_IMAGE_OFFER: "NA", "image_offer" -AZURE_IMAGE_SKU: "NA", "image_sku" -AZURE_IMAGE_THIRD_PARTY: "NA", "true", "false" - -AZURE_IMAGE_VERSION: "NA", "image_version" - -AZURE_IMAGE_ID: "NA", "image_id" - -AZURE_VM_IMAGE: "NA", "BYOI", "MARKETPLACE", "IMAGE_ID" - -AZURE_NODE_AZ: "1" -AZURE_NODE_AZ_1: "NA", "2" -AZURE_NODE_AZ_2: "NA", "3" - -WORKER_MACHINE_COUNT_0: "NA", "1", "2" -WORKER_MACHINE_COUNT_1: "NA", "1", "2" -WORKER_MACHINE_COUNT_2: "NA", "1", "2" - -AZURE_CUSTOM_TAGS: "NA", "tagKey=tagValue", "tagKey1=tagValue2" - -AZURE_ENABLE_PRIVATE_CLUSTER: "true", "false" -AZURE_FRONTEND_PRIVATE_IP: "20.20.20.20", "22.22.22.22" -AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB: "true", "false" -AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT: "1", "3" -AZURE_ENABLE_NODE_OUTBOUND_LB: "true", "false" -AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT: "1", "3" -AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES: "4", "8" - -AZURE_CONTROL_PLANE_OS_DISK_SIZE: "NA", "128", "256" -AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE: "NA", "Premium_LRS" -AZURE_NODE_OS_DISK_SIZE: "NA", "128", "256" -AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE: "NA", "Premium_LRS" - -AZURE_CONTROL_PLANE_DATA_DISK_SIZE: "NA", "256", "512" -AZURE_ENABLE_NODE_DATA_DISK: "NA", "true", "false" -AZURE_NODE_DATA_DISK_SIZE: "NA", "256", "512" - -AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP: "NA", "SecurityGroup" -AZURE_NODE_SUBNET_SECURITY_GROUP: "NA", "SecurityGroup" - -AZURE_IDENTITY_NAME: "NA", "test-identity1", "test-identity2" -AZURE_IDENTITY_NAMESPACE: "NA", "default", "test-ns1" - -OS_NAME: "NA", "photon", "ubuntu" -OS_VERSION: "NA", "20.04", "3" - -BUILD_EDITION: "tkg", "tce" - -IF [OS_NAME] = "\"NA\"" THEN [OS_VERSION] = "\"NA\""; -IF [--TKR] <> "\"v1.20.5---vmware.1-tkg.1-zlatest\"" THEN [OS_NAME] = "\"NA\""; -IF [--TKR] <> "\"v1.20.5---vmware.1-tkg.1-zlatest\"" THEN [OS_VERSION] = "\"NA\""; -IF [OS_NAME] = "\"NA\"" THEN [OS_VERSION] = "\"NA\""; -IF [OS_NAME] = "\"photon\"" THEN [OS_VERSION] = "\"3\""; - - -# Azure VM Image info in BOM -IF [AZURE_VM_IMAGE] = "\"NA\"" THEN [AZURE_IMAGE_RESOURCE_GROUP] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"NA\"" THEN [AZURE_IMAGE_NAME] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"NA\"" THEN [AZURE_IMAGE_SUBSCRIPTION_ID] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"NA\"" THEN [AZURE_IMAGE_GALLERY] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"NA\"" THEN [AZURE_IMAGE_PUBLISHER] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"NA\"" THEN [AZURE_IMAGE_SKU] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"NA\"" THEN [AZURE_IMAGE_THIRD_PARTY] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"NA\"" THEN [AZURE_IMAGE_OFFER] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"NA\"" THEN [AZURE_IMAGE_VERSION] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"NA\"" THEN [AZURE_IMAGE_ID] = "\"NA\""; - -# Azure VM Image(Marketplace) info in config -IF [AZURE_VM_IMAGE] = "\"BYOI\"" THEN [AZURE_IMAGE_RESOURCE_GROUP] <> "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"BYOI\"" THEN [AZURE_IMAGE_NAME] <> "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"BYOI\"" THEN [AZURE_IMAGE_SUBSCRIPTION_ID] <> "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"BYOI\"" THEN [AZURE_IMAGE_GALLERY] <> "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"BYOI\"" THEN [AZURE_IMAGE_PUBLISHER] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"BYOI\"" THEN [AZURE_IMAGE_SKU] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"BYOI\"" THEN [AZURE_IMAGE_THIRD_PARTY] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"BYOI\"" THEN [AZURE_IMAGE_OFFER] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"BYOI\"" THEN [AZURE_IMAGE_ID] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"BYOI\"" THEN [AZURE_IMAGE_VERSION] <> "\"NA\""; - -# Azure VM Image(Shared image gallery) info in config -IF [AZURE_VM_IMAGE] = "\"MARKETPLACE\"" THEN [AZURE_IMAGE_RESOURCE_GROUP] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"MARKETPLACE\"" THEN [AZURE_IMAGE_NAME] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"MARKETPLACE\"" THEN [AZURE_IMAGE_SUBSCRIPTION_ID] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"MARKETPLACE\"" THEN [AZURE_IMAGE_GALLERY] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"MARKETPLACE\"" THEN [AZURE_IMAGE_PUBLISHER] <> "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"MARKETPLACE\"" THEN [AZURE_IMAGE_SKU] <> "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"MARKETPLACE\"" THEN [AZURE_IMAGE_THIRD_PARTY] <> "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"MARKETPLACE\"" THEN [AZURE_IMAGE_OFFER] <> "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"MARKETPLACE\"" THEN [AZURE_IMAGE_VERSION] <> "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"MARKETPLACE\"" THEN [AZURE_IMAGE_ID] = "\"NA\""; - -# Azure image ID -IF [AZURE_VM_IMAGE] = "\"IMAGE_ID\"" THEN [AZURE_IMAGE_RESOURCE_GROUP] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"IMAGE_ID\"" THEN [AZURE_IMAGE_NAME] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"IMAGE_ID\"" THEN [AZURE_IMAGE_SUBSCRIPTION_ID] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"IMAGE_ID\"" THEN [AZURE_IMAGE_GALLERY] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"IMAGE_ID\"" THEN [AZURE_IMAGE_PUBLISHER] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"IMAGE_ID\"" THEN [AZURE_IMAGE_SKU] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"IMAGE_ID\"" THEN [AZURE_IMAGE_THIRD_PARTY] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"IMAGE_ID\"" THEN [AZURE_IMAGE_OFFER] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"IMAGE_ID\"" THEN [AZURE_IMAGE_VERSION] = "\"NA\""; -IF [AZURE_VM_IMAGE] = "\"IMAGE_ID\"" THEN [AZURE_IMAGE_ID] <> "\"NA\""; - -# if plan is prod -IF [_PLAN] = "\"prod\"" THEN [AZURE_NODE_AZ_1] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" THEN [AZURE_NODE_AZ_2] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [WORKER_MACHINE_COUNT_0] = "\"NA\"" THEN [WORKER_MACHINE_COUNT_1] = "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [WORKER_MACHINE_COUNT_0] = "\"NA\"" THEN [WORKER_MACHINE_COUNT_2] = "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [WORKER_MACHINE_COUNT_0] <> "\"NA\"" THEN [WORKER_MACHINE_COUNT_1] <> "\"NA\""; -IF [_PLAN] = "\"prod\"" AND [WORKER_MACHINE_COUNT_0] <> "\"NA\"" THEN [WORKER_MACHINE_COUNT_2] <> "\"NA\""; - -# if plan is dev -IF [_PLAN] = "\"dev\"" THEN [AZURE_NODE_AZ_1] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [AZURE_NODE_AZ_2] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [WORKER_MACHINE_COUNT_0] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [WORKER_MACHINE_COUNT_1] = "\"NA\""; -IF [_PLAN] = "\"dev\"" THEN [WORKER_MACHINE_COUNT_2] = "\"NA\""; diff --git a/providers/tests/clustergen/param_models/cluster_optional.model b/providers/tests/clustergen/param_models/cluster_optional.model deleted file mode 100644 index aca615a756..0000000000 --- a/providers/tests/clustergen/param_models/cluster_optional.model +++ /dev/null @@ -1,211 +0,0 @@ ---CONTROLPLANE-MACHINE-COUNT: "NOTPROVIDED" ---WORKER-MACHINE-COUNT: "NOTPROVIDED" ---CONTROLPLANE-SIZE: "NOTPROVIDED" ---TKR: "NOTPROVIDED", "v1.23.8+vmware.2-tkg.1-zshippable" ---NAMESPACE: "NOTPROVIDED" ---SIZE: "NOTPROVIDED" ---WORKER-SIZE: "NOTPROVIDED" ---CNI: "NOTPROVIDED" ---ENABLE-CLUSTER-OPTIONS: "NOTPROVIDED", "autoscaler", "oidc" ---VSPHERE-CONTROLPLANE-ENDPOINT: "NOTPROVIDED", "10.10.10.10" - -CONTROL_PLANE_MACHINE_COUNT: "NA" -WORKER_MACHINE_COUNT: "NA" -CONTROL_PLANE_MACHINE_TYPE: "NA" -NODE_MACHINE_TYPE: "NA" - -_TKG_CLUSTER_FORCE_ROLE: "NA", "management" - -_CNAME: "testcluster" -_INFRA: "vsphere:v1.5.3", "aws:v2.0.2" -_PLAN: "dev", "prod" -CNI: "", "calico", "antrea", "none" - -NODE_STARTUP_TIMEOUT: "20m" - -SIZE: "NA" -CP_SIZE: "NA" -WORKER_SIZE: "NA" - -CLUSTER_CIDR: "NA", "100.96.0.0/11", "fd00:100:96::/48", "100.96.0.0/11fd00:100:96::/48", "fd00:100:96::/48100.96.0.0/11" -SERVICE_CIDR: "100.64.0.0/18", "fd00:100:64::/108", "100.64.0.0/18fd00:100:64::/108", "fd00:100:64::/108100.64.0.0/18" - -NAMESPACE: "NA" - -VSPHERE_SSH_AUTHORIZED_KEY: "ssh-rsa A" -VSPHERE_NETWORK: "VM Network" -VSPHERE_TEMPLATE: "photon-3-v1.19.3+vmware.1" -VSPHERE_USERNAME: "administrator@vsphere.local" -VSPHERE_PASSWORD: "" -VSPHERE_DATASTORE: "ds1" -VSPHERE_FOLDER: "vm0" -VSPHERE_DISK_GIB: "40" -VSPHERE_NUM_CPUS: "2" -VSPHERE_SERVER: "10.184.90.80" -VSPHERE_DATACENTER: "/dc0" -VSPHERE_RESOURCE_POOL: "rp0" -VSPHERE_MEM_MIB: "4096" -_VSPHERE_CONTROL_PLANE_ENDPOINT: "10.10.10.10" -VSPHERE_TLS_THUMBPRINT : "dummythumbprint" - -#! NSX-T specific configurations for enabling NSX-T routable pods -NSXT_POD_ROUTING_ENABLED: "true", "false" -NSXT_ROUTER_PATH: "NA", "/infra/tier-1s/test-router" -NSXT_USERNAME: "NA", "admin@nsxmanager.pks.vmware.local" -NSXT_PASSWORD: "NA", "nsxt-password", "nsxt-password2" -NSXT_MANAGER_HOST: "NA", "127.0.0.0" -NSXT_ALLOW_UNVERIFIED_SSL: "true", "false" -NSXT_REMOTE_AUTH: "true", "false" -NSXT_VMC_ACCESS_TOKEN: "NA", "nsxt-vmc-access-token" -NSXT_VMC_AUTH_HOST: "nsxt-vmc-auth-host" -NSXT_CLIENT_CERT_KEY_DATA: "client-cert-key-data" -NSXT_CLIENT_CERT_DATA: "NA", "client-cert-data" -NSXT_ROOT_CA_DATA_B64: "NA", "root-ca-data" -NSXT_SECRET_NAME: "NA", "cloud-provider-vsphere-nsxt-credentials" -NSXT_SECRET_NAMESPACE: "NA", "kube-system" - -OIDC_ISSUER_URL: "http://10.20.30.40:30167" -OIDC_USERNAME_CLAIM: "email" -OIDC_GROUPS_CLAIM: "group" -OIDC_DEX_CA: "H4sIAIZqKl8AA7ue+wMAY5WyFAMAAAA" - -BASTION_HOST_ENABLED: "true" - -AWS_ACCESS_KEY_ID: "" -AWS_REGION: "us-east-1" -AWS_NODE_AZ: "us-east-1a" -AWS_SECRET_ACCESS_KEY: "" -AWS_B64ENCODED_CREDENTIALS: "W2RlZmF1bHRdCmF3c19hY2Nlc3Nfa2V5X2lkID0gQUtJQVVZZZ" -AWS_SSH_KEY_NAME: "default" -#AWS_VPC_ID: "", "vpc-123456" -AWS_VPC_ID: "" -AWS_VPC_CIDR: "10.0.0.0/16" -AWS_PRIVATE_NODE_CIDR: "10.0.0.0/24" -AWS_PUBLIC_NODE_CIDR: "10.0.1.0/24" -AWS_PRIVATE_SUBNET_ID: "''" -AWS_PUBLIC_SUBNET_ID: "''" - -# storage class -ENABLE_DEFAULT_STORAGE_CLASS: "true", "false" -VSPHERE_STORAGE_POLICY_ID: "", "test-policy-name" -VSPHERE_CLONE_MODE: "fullClone","linkedClone" - -# http proxy (too many "NA" leads to overwhelmingly negative cases) -TKG_HTTP_PROXY: "http://10.0.200.100", "http://[fc00:f853:ccd:e793::1]:3128" -TKG_HTTPS_PROXY: "NA", "http://10.0.200.100", "http://[fc00:f853:ccd:e793::1]:3128" -TKG_NO_PROXY: "NA", "10.0.200.1/24", "10.184.90.80 10.0.0.1/24" -TKG_PROXY_CA_CERT: "NA", "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tClBST1hZIENBIENFUlQ=" -TKG_HTTP_PROXY_ENABLED: "true" -TKG_NODE_SYSTEM_WIDE_PROXY: "true", "false" - -# ip family -TKG_IP_FAMILY: "NA", "", "ipv4", "ipv6" - -# audit logging -ENABLE_AUDIT_LOGGING: "true", "false" -OS_NAME: "photon", "ubuntu", "amazon" - -# pod security standards -POD_SECURITY_STANDARD_DEACTIVATED: "true", "false" - -POD_SECURITY_STANDARD_AUDIT: "", "baseline", "restricted", "enforce" -POD_SECURITY_STANDARD_WARN: "", "baseline", "restricted", "enforce" -POD_SECURITY_STANDARD_ENFORCE: "", "baseline", "restricted", "enforce" - -# autoscaler -AUTOSCALER_MIN_SIZE_0: "NA", "2" -AUTOSCALER_MAX_SIZE_0: "NA", "5" -AUTOSCALER_MIN_SIZE_1: "NA", "3" -AUTOSCALER_MAX_SIZE_1: "NA", "6" -AUTOSCALER_MIN_SIZE_2: "NA", "4" -AUTOSCALER_MAX_SIZE_2: "NA", "7" -AUTOSCALER_SCALE_DOWN_DELAY_AFTER_ADD: "NA", "20s" -AUTOSCALER_SCALE_DOWN_DELAY_AFTER_DELETE: "NA", "30s" -AUTOSCALER_SCALE_DOWN_DELAY_AFTER_FAILURE: "NA", "40s" -AUTOSCALER_SCALE_DOWN_UNNEEDED_TIME: "NA", "50s" -AUTOSCALER_MAX_NODE_PROVISION_TIME: "NA", "5m" -AUTOSCALER_MAX_NODES_TOTAL: "NA", "10", "50", "0" - -# Antrea settings -ANTREA_NO_SNAT: "false", "true" -ANTREA_TRAFFIC_ENCAP_MODE: "encap", "noEncap", "hybrid", "networkPolicyOnly" -ANTREA_PROXY: "false", "true" -ANTREA_ENDPOINTSLICE: "false", "true" -ANTREA_POLICY: "false", "true" -ANTREA_NODEPORTLOCAL: "false", "true" -ANTREA_TRACEFLOW: "false", "true" -ANTREA_EGRESS: "false", "true" -ANTREA_IPAM: "false", "true" -ANTREA_FLOWEXPORTER: "false", "true" -ANTREA_DISABLE_UDP_TUNNEL_OFFLOAD: "false", "true" -ANTREA_FLOWEXPORTER: "false", "true" -ANTREA_SERVICE_EXTERNALIP: "false", "true" -ANTREA_MULTICAST: "false", "true" -ANTREA_MULTICLUSTER: "false", "true" -ANTREA_SECONDARY_NETWORK: "false", "true" -ANTREA_TRAFFIC_CONTROL: "false", "true" -ANTREA_TOPOLOGY_AWARE_HINTS: "false", "true" - - -ANTREA_EGRESS_EXCEPT_CIDRS: "10.0.0.0/6,10.0.0.0/12", "" -ANTREA_NODEPORTLOCAL_ENABLED: "true", "false" -ANTREA_NODEPORTLOCAL_PORTRANGE: "61000-62000" -ANTREA_PROXY_ALL: "true", "false" -ANTREA_PROXY_NODEPORT_ADDRS: "kubernetes/default", "" -ANTREA_PROXY_SKIP_SERVICES: "10.0.0.1,10.10.0.2", "" -ANTREA_PROXY_LOAD_BALANCER_IPS: "true", "false" -ANTREA_FLOWEXPORTER_COLLECTOR_ADDRESS: "svc:8080" -ANTREA_FLOWEXPORTER_POLL_INTERVAL: "10s" -ANTREA_FLOWEXPORTER_ACTIVE_TIMEOUT: "20s" -ANTREA_FLOWEXPORTER_IDLE_TIMEOUT: "20s" -ANTREA_KUBE_APISERVER_OVERRIDE: "192.168.0.1:6443", "" -ANTREA_TRANSPORT_INTERFACE: "eth0", "" -ANTREA_TRANSPORT_INTERFACE_CIDRS: "10.0.0.2/24", "" -ANTREA_MULTICAST_INTERFACES: "eth0", "" -ANTREA_MULTICAST_IGMPQUERY_INTERVAL: "125s" -ANTREA_MULTICLUSTER_NAMESPACE: "" -ANTREA_MULTICLUSTER_ENABLE: "false", "true" -ANTREA_TUNNEL_TYPE: "geneve" -ANTREA_TUNNEL_PORT: 0 -ANTREA_TUNNEL_CSUM: "false", "true" -ANTREA_TRAFFIC_ENCRYPTION_MODE: "none", "wireGuard" -ANTREA_WIREGUARD_PORT: 51820 -ANTREA_ENABLE_USAGE_REPORTING: "true", "false" -ANTREA_DNS_SERVER_OVERRIDE: "" -ANTREA_DISABLE_TXCHECKSUM_OFFLOAD: "false", "true" -ANTREA_ENABLE_BRIDGING_MODE: "false", "true" - - -VSPHERE_WORKER_PCI_DEVICES: "" -VSPHERE_CONTROL_PLANE_PCI_DEVICES: "" -VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST: "" -WORKER_ROLLOUT_STRATEGY: "" -VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS: "" -VSPHERE_WORKER_CUSTOM_VMX_KEYS: "" -VSPHERE_CONTROL_PLANE_HARDWARE_VERSION: "" -VSPHERE_WORKER_HARDWARE_VERSION: "" - -KUBEVIP_LOADBALANCER_ENABLE: "false", "true" -KUBEVIP_LOADBALANCER_IP_RANGES: "", "10.0.0.1-10.0.0.2" -KUBEVIP_LOADBALANCER_CIDRS: "", "10.0.0.1/23" - -CUSTOM_TDNF_REPOSITORY_CERTIFICATE: "NA", "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tClBST1hZIENBIENFUlQ=" - -BUILD_EDITION: "tkg", "tce" - -# identity management -IDENTITY_MANAGEMENT_TYPE: "none", "oidc", "ldap" - -# pass --VSPHERE-CONTROLPLANE-ENDPOINT flag only for vSphere provider -IF [_INFRA] LIKE "\"vsphere:*" THEN [--VSPHERE-CONTROLPLANE-ENDPOINT] = "\"10.10.10.10\""; -IF [_INFRA] NOT LIKE "\"vsphere:*" THEN [--VSPHERE-CONTROLPLANE-ENDPOINT] = "\"NOTPROVIDED\""; - -IF [_INFRA] NOT LIKE "\"vsphere:*" THEN [OS_NAME] <> "\"photon\""; - -IF [TKG_HTTP_PROXY] = "\"http://10.0.200.100\"" THEN [TKG_HTTPS_PROXY] = "\"http://10.0.200.100\""; -IF [TKG_HTTP_PROXY] LIKE "\"http://[fc00*" THEN [TKG_HTTPS_PROXY] <> "\"http://10.0.200.100\""; -IF [TKG_IP_FAMILY] = "\"ipv6\"" THEN [SERVICE_CIDR] = "\"fd00:100:64::/108\""; -IF [TKG_IP_FAMILY] IN { "\"NA\"", "\"\"", "\"ipv4\"" } THEN [SERVICE_CIDR] = "\"100.64.0.0/18\""; -IF [TKG_IP_FAMILY] IN { "\"NA\"", "\"\"", "\"ipv4\"" } THEN [TKG_HTTPS_PROXY] <> "\"http://[fc00:f853:ccd:e793::1]:3128\""; -IF [TKG_IP_FAMILY] IN { "\"NA\"", "\"\"", "\"ipv4\"" } THEN [TKG_HTTP_PROXY] = "\"http://10.0.200.100\""; -IF [TKG_IP_FAMILY] IN { "\"NA\"", "\"\"", "\"ipv4\"" } THEN [CLUSTER_CIDR] <> "\"fd00:100:96::/48\""; diff --git a/providers/tests/clustergen/param_models/cluster_vsphere.model b/providers/tests/clustergen/param_models/cluster_vsphere.model deleted file mode 100644 index d0d4f79d5d..0000000000 --- a/providers/tests/clustergen/param_models/cluster_vsphere.model +++ /dev/null @@ -1,115 +0,0 @@ ---CONTROLPLANE-MACHINE-COUNT: "NOTPROVIDED", "1","3","5" ---WORKER-MACHINE-COUNT: "NOTPROVIDED", "3" ---CONTROLPLANE-SIZE: "NOTPROVIDED", "medium" ---TKR: "NOTPROVIDED" ---NAMESPACE: "NOTPROVIDED", "default", "test" ---SIZE: "NOTPROVIDED", "medium" ---WORKER-SIZE: "NOTPROVIDED", "large" ---CNI: "antrea", "calico", "none" ---VSPHERE-CONTROLPLANE-ENDPOINT: "NOTPROVIDED", "10.10.10.10", "cluster.local" - -CONTROL_PLANE_MACHINE_COUNT: "NA","1","3","5" -WORKER_MACHINE_COUNT: "NA","1","3","5" -CONTROL_PLANE_MACHINE_TYPE: "NA","t3.small" -NODE_MACHINE_TYPE: "NA","m5.large" - -_TKG_CLUSTER_FORCE_ROLE: "NA", "management" -_CNAME: "testcluster", "c1", "really-long-cluster-name-with-hyphen" -_PLAN: "dev", "prod" -_INFRA: "vsphere:v1.5.3" - -BASTION_HOST_ENABLED: "true" -NODE_STARTUP_TIMEOUT: "20m" - -SIZE: "NA", "small", "medium", "large", "extra-large" -CP_SIZE: "NA", "small", "medium", "large", "extra-large" -WORKER_SIZE: "NA", "small", "medium", "large", "extra-large" - -CLUSTER_CIDR: "100.96.0.0/11", "10.10.10.10/18" -SERVICE_CIDR: "100.64.0.0/18", "10.10.10.10/16" -NAMESPACE: "NA", "default", "test", "namespace with spaces" -CLUSTER_API_SERVER_PORT: "NA","443" - -#VSPHERE_SSH_KEY: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsbzCr6KZZZZ", "'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsbzCr6KZZZZ'" -VSPHERE_SSH_AUTHORIZED_KEY: "ssh-rsa A", "'ssh-rsa BB'" -VSPHERE_NETWORK: "VM Network", "TESTNETWORK" -VSPHERE_TEMPLATE: "photon-3-v1.19.3+vmware.1" -VSPHERE_TEMPLATE_MOID: "vm-1" -VSPHERE_USERNAME: "administrator@vsphere.local", "admin@vmc.local" -VSPHERE_PASSWORD: "" -VSPHERE_REGION: "NA", "default-region" -VSPHERE_ZONE: "NA", "default-zone" -VSPHERE_DATASTORE: "ds1" -VSPHERE_FOLDER: "vm0" -VSPHERE_DISK_GIB: "NA", "40" -VSPHERE_NUM_CPUS: "2" -VSPHERE_SERVER: "10.184.90.80", "some.fqdn.com", "somehostname" -VSPHERE_DATACENTER: "/dc0" -VSPHERE_RESOURCE_POOL: "rp0", "/dc0/host/cluster0/Resources/rp0" -VSPHERE_MEM_MIB: "4096" -_VSPHERE_CONTROL_PLANE_ENDPOINT: "NA", "10.10.10.10", "cluster.local" -VSPHERE_CONTROL_PLANE_ENDPOINT_PORT: "6443", "443" -VSPHERE_TLS_THUMBPRINT: "dummythumbprint" -VSPHERE_VERSION: "NA", "7.0.0" -VSPHERE_INSECURE: "true" - -AVI_ENABLE: "false", "true" - -AVI_NAMESPACE: "tkg-system-networking" -AVI_DISABLE_INGRESS_CLASS: "true" -AVI_AKO_IMAGE_PULL_POLICY: "IfNotPresent" -AVI_ADMIN_CREDENTIAL_NAME: "avi-controller-credentials" -AVI_CA_NAME: "avi-controller-ca" - -AVI_CONTROLLER: "192.167.110" -AVI_USERNAME: "admin" -AVI_PASSWORD: "admin123" -AVI_CLOUD_NAME: "Default-Cloud" -AVI_SERVICE_ENGINE_GROUP: "test-se-group" -AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP: "NA", "test-mc-se-group" -AVI_DATA_NETWORK: "WorkloadCluster-Network-data-plane" -AVI_DATA_NETWORK_CIDR: "10.161.136.0/24" -AVI_NSXT_T1LR: "", "/infra/tier-1s/test-tier1" - -# These values might be empty when user grade to the tkg 1.5 version, other they will always contain values -AVI_CONTROL_PLANE_NETWORK: "", "WorkloadCluster-Network-control-plane" -AVI_CONTROL_PLANE_NETWORK_CIDR: "", "10.161.137.0/24" -AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME: "", "ManagementCluster-Network-data-plane" -AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR: "", "10.161.138.0/20" -AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR: "", "10.161.139.0/20" -AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME: "", "ManagementCluster-Network-control-plane" - - -AVI_CA_DATA_B64: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tQ2dBd0lCQWdJQkFUQU5CLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" -AVI_LABELS: "", "{foo: 'bar'}" - -AVI_DISABLE_STATIC_ROUTE_SYNC: "true", "false" -AVI_INGRESS_DEFAULT_INGRESS_CONTROLLER: "false" -AVI_INGRESS_SHARD_VS_SIZE: "" -AVI_INGRESS_SERVICE_TYPE: "" -AVI_INGRESS_NODE_NETWORK_LIST: "NA" - -AVI_CONTROL_PLANE_HA_PROVIDER: "false", "true" - -# custom docker registry -TKG_CUSTOM_IMAGE_REPOSITORY: "NA", "harbor.mydomain.com/library" -TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: "NA", "true" -TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: "NA", "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCkNBIENFUlQ=" - -TKG_PROXY_CA_CERT: "NA", "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tClBST1hZIENBIENFUlQ=" - -BUILD_EDITION: "tkg", "tce" - -### Windows overlay parameters... -IS_WINDOWS_WORKLOAD_CLUSTER: "false", "true" -VSPHERE_WINDOWS_TEMPLATE: "windows-2019-kube-1.21.2" - -VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST: "NA", "true", "false" -VSPHERE_WORKER_PCI_DEVICES: "NA", "0x10DE:0x1EB8", "0x10DF:0x1EB8", "nvidia;T4" -VSPHERE_CONTROL_PLANE_PCI_DEVICES: "NA", "0x10DE:0x1EB8", "0x10DF:0x1EB8", "nvidia;T4" -WORKER_ROLLOUT_STRATEGY: "OnDelete", "RollingUpdate" -VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS: "NA", "pciPassthru.a=bpciPassthru.c=d" -VSPHERE_WORKER_CUSTOM_VMX_KEYS: "NA", "pciPassthru.a=bpciPassthru.c=d" - -IF [VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST] in {"\"false\"", "\"NA\""} THEN [VSPHERE_WORKER_PCI_DEVICES] = "\"0x10DE:0x1EB8\""; -IF [VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST] in {"\"false\"", "\"NA\""} THEN [VSPHERE_CONTROL_PLANE_PCI_DEVICES] = "\"0x10DE:0x1EB8\""; diff --git a/providers/tests/clustergen/run_tests.sh b/providers/tests/clustergen/run_tests.sh deleted file mode 100755 index af9201adac..0000000000 --- a/providers/tests/clustergen/run_tests.sh +++ /dev/null @@ -1,263 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -SCRIPT=$(realpath "${BASH_SOURCE[0]}") -TESTROOT=$(dirname "$SCRIPT") -TKG=${TKG:-${TESTROOT}/../../bin/tkg-darwin-amd64} -CLUSTERCTL=${CLUSTERCTL:-~/cluster-api/bin/clusterctl} -TESTDATA=${TESTDATA:-testdata} -CASES=${CASES:-*.case} -BUILDER_IMAGE=gcr.io/eminent-nation-87317/tkg-go-ci:latest -YQ4=${YQ4:-yq} - -SUPPORTED_INFRAS="AWS AZURE VSPHERE" -TESTED_INFRAS=${TESTED_INFRAS:-${SUPPORTED_INFRAS}} -MAX_CASES_PER_INFRA=${MAX_CASES_PER_INFRA:-20} - -TKG_CONFIG_DIR="/tmp/test_tkg_config_dir" -rm -rf $TKG_CONFIG_DIR -mkdir -p $TKG_CONFIG_DIR - -# shellcheck source=tests/clustergen/diffcluster/helpers.sh -. "${TESTROOT}"/diffcluster/helpers.sh - -# initialize the CLI, set up providers, boms, etc -$TKG get mc --configdir ${TKG_CONFIG_DIR} - -generate_cluster_configurations() { - local infra=$1 - local outputdir=$2 - local outputdircc=$3 - pushd "${TESTDATA}" - - matched_cases=$(for i in `grep -H EXE: ${CASES} | grep -i ${infra}:v | cut -d: -f1 | uniq | cut -d/ -f1 | head -${MAX_CASES_PER_INFRA}`; do echo -n "$i "; done; echo) - echo "MATCHED CASES = ($matched_cases)" - - $TKG get mc --configdir ${TKG_CONFIG_DIR} - docker run -t --rm -v ${TKG_CONFIG_DIR}:${TKG_CONFIG_DIR} -v ${TESTROOT}:/clustergen -w /clustergen -e TKG_CONFIG_DIR=${TKG_CONFIG_DIR} ${BUILDER_IMAGE} /bin/bash -c "./gen_duplicate_bom_azure.py $TKG_CONFIG_DIR" - RESULT=$? - if [[ ! $RESULT -eq 0 ]]; then - exit 1 - fi - - echo "# results" >${outputdir}/results_${infra}.txt - echo "Running $TKG config cluster ..." - for t in $matched_cases; do - cmdargs=() - read -r -a cmdargs < <(grep EXE: "$t" | cut -d: -f2-) - cp "$t" /tmp/test_tkg_config - echo $TKG --file /tmp/test_tkg_config --configdir ${TKG_CONFIG_DIR} --log_file /tmp/"$t".log config cluster "${cmdargs[@]}" - $TKG --file /tmp/test_tkg_config --configdir ${TKG_CONFIG_DIR} --log_file /tmp/"$t".log config cluster "${cmdargs[@]}" 2>/tmp/err.txt 1>/tmp/expected.yaml - RESULT=$? - if [[ $RESULT -eq 0 ]]; then - echo "$t":POS >>${outputdir}/results_${infra}.txt - # normalize should not modify the yaml node trees, so doing so before saving to expected to - # reduce the chance of generating diffs due to template formatting differences in the future. - normalize /tmp/expected.yaml ${outputdir}/"$t".output - if [ ! -z "$outputdircc" ]; then - ${CLUSTERCTL} alpha generate-normalized-topology -r -f /tmp/expected.yaml > ${outputdircc}/"$t".norm.output - fi - echo -n "$t (POS) : " - # saves the TKR used for this test case to be used on to generated the - # CC-based output later - TKR_USED=$(grep tanzuKubernetesRelease: /tmp/expected.yaml | cut -d: -f2 | cut -b2- | perl -pe 's/---/+/') - else - # failure to generate a working configuration can be due to a variety of reasons. They are - # represented as a NEGative test case. The output of the failed command is captured and is part - # of the compliance dataset. - cp "$t" /tmp/test_tkg_config - $TKG --file /tmp/test_tkg_config --configdir ${TKG_CONFIG_DIR} --log_file /tmp/"$t".log config cluster "${cmdargs[@]}" &>${outputdir}/"$t".output - echo "$t":NEG >>${outputdir}/results_${infra}.txt - echo -n "$t (NEG) : " - fi - echo "${cmdargs[@]}" - - if [ ! -z "$outputdircc" ]; then - if [[ $RESULT -eq 0 ]]; then - # XXX fixup plan, hard code cluster class - cat "$t" | perl -pe 's/--plan (\S+)/--plan $1cc/; s/_PLAN: (\S+)/_PLAN: $1cc/' > /tmp/test_tkg_config_cc - echo "CLUSTER_CLASS: tkg-${infra}-default" >> /tmp/test_tkg_config_cc - read -r -a cmdargs < <(grep EXE: /tmp/test_tkg_config_cc | cut -d: -f2-) - - if [[ "${infra}" == "aws" ]]; then - cat <<- EOF >> /tmp/test_tkg_config_cc -TKR_DATA: |- - ${TKR_USED}: - v1.23.5+vmware.1: - kubernetesSpec: - version: ${TKR_USED} - imageRepository: projects-stg.registry.vmware.com - etcd: - imageTag: v1.0.0-test - coredns: - imageTag: v1.1.0-test - kube-vip: - imageTag: v2.0.0-test - labels: - os-name: ubuntu - os-type: linux - os-arch: amd64 - osImageRef: - id: test-ami-id - region: test-region -EOF - fi - if [[ "${infra}" == "vsphere" ]]; then - cat <<- EOF >> /tmp/test_tkg_config_cc -TKR_DATA: |- - ${TKR_USED}: - kubernetesSpec: - version: ${TKR_USED} - imageRepository: projects-stg.registry.vmware.com - etcd: - imageTag: v1.0.0-test - coredns: - imageTag: v1.1.0-test - kube-vip: - imageTag: v2.0.0-test - labels: - os-name: ubuntu - os-type: linux - os-arch: amd64 -EOF - fi - if [[ "${infra}" == "azure" ]]; then - if grep -q "AZURE_IMAGE_GALLERY" /tmp/test_tkg_config_cc; then - cat <<- EOF >> /tmp/test_tkg_config_cc -TKR_DATA: |- - ${TKR_USED}: - kubernetesSpec: - version: ${TKR_USED}: - imageRepository: projects-stg.registry.vmware.com - etcd: - imageTag: v1.0.0-test - coredns: - imageTag: v1.1.0-test - labels: - os-name: ubuntu - os-type: linux - os-arch: amd64 - osImageRef: - version: test-version - gallery: test-gallery - name: test-name - resourceGroup: test-resource-group - subscriptionID: test-subscription-id -EOF - else - cat <<- EOF >> /tmp/test_tkg_config_cc -TKR_DATA: |- - ${TKR_USED}: - kubernetesSpec: - version: ${TKR_USED}: - imageRepository: projects-stg.registry.vmware.com - etcd: - imageTag: v1.0.0-test - coredns: - imageTag: v1.1.0-test - labels: - os-name: ubuntu - os-type: linux - os-arch: amd64 - osImageRef: - sku: test-sku - publisher: test-publisher - offer: test-offer - version: test-version - thirdPartyImage: test-third-party-image -EOF - fi - fi - - echo $TKG --file /tmp/test_tkg_config_cc --configdir ${TKG_CONFIG_DIR} --log_file /tmp/"$t"_cc.log config cluster "${cmdargs[@]}" - $TKG --file /tmp/test_tkg_config_cc --configdir ${TKG_CONFIG_DIR} --log_file /tmp/"$t"_cc.log config cluster "${cmdargs[@]}" 2>/tmp/err_cc.txt 1>/tmp/expected_cc.yaml - #normalize_cc /tmp/expected_cc.yaml ${outputdir}/"$t".cc.output - cp /tmp/expected_cc.yaml ${outputdir}/"$t".cc.output - ${CLUSTERCTL} alpha generate-normalized-topology -p -f ${outputdir}/"$t".cc.output > /tmp/"$t".cc.gnt.yaml - denoise_dryrun /tmp/"$t".cc.gnt.yaml ${outputdircc}/"$t".cc.norm.output - - echo generate_diff_summary "${outputdircc}","$t" - generate_diff_summary ${outputdircc} $t - fi - fi - done - popd - rm -rf $HOME/.tkg/bom/bom-clustergen-* -} - -generate_diff_summary() { - local dir=$1 - local t=$2 - - ${YQ4} e '. | select(.kind != "Secret")' ${dir}/"$t".norm.output > ${dir}/legacy/"$t".norm.yaml - ${YQ4} e '. | select(.kind != "Secret")' ${dir}/"$t".cc.norm.output > ${dir}/cclass/"$t".norm.yaml - - diff -U10 ${dir}/legacy/"$t".norm.yaml ${dir}/cclass/"$t".norm.yaml > ${dir}/"$t".u10.diff - wdiff -s ${dir}/legacy/"$t".norm.yaml ${dir}/cclass/"$t".norm.yaml | tail -2 | head -1 > ${dir}/"$t".diff_stats - cat ${dir}/"$t".diff_stats -} - -diffcluster() { - diff "$1" "$2" - # TODO : update to use more yaml-aware diff - # kapp tools diff -c --line-numbers=false --summary=false --file $1 --file2 $2 -} - -check_generated() { - # flag new files generated - untracked=$(git ls-files -o --directory --exclude-standard .) - num_untracked=$(echo -n "${untracked}" | wc -l) - if [ "$num_untracked" -ne 0 ]; then - echo "New entries found:" - #echo "$untracked" - echo "" - echo "The above are new entries from the last test. If these changes are expected, commit them and retry." - exit 1 - fi - - deleted=$(git status -s | grep ' D ' || true) - num_deleted=$(echo -n "${deleted}" | wc -l) - if [ "$num_deleted" -ne 0 ]; then - echo "Deleted entries found:" - echo "$deleted" - echo "" - echo "The above entries have been deleted. If the changes are expected, commit the removal (e.g. git add -u) and retry." - exit 1 - fi - - relpath=$(git rev-parse --show-prefix) - modified=$(git status -s expected/*.yaml | grep ' M ' | cut -c4-) - for m in $modified; do - git show HEAD:"${relpath}""$m" >/tmp/orig.yaml - normalize /tmp/orig.yaml /tmp/orig.normalized.yaml - diffcluster /tmp/orig.normalized.yaml "$m" - done -} - -export SUPPRESS_PROVIDERS_UPDATE=1 -export CLUSTERCTL_SKIP_UNIQUE_NAMESPACE=true -export CLUSTERCTL_SKIP_FETCH_CC=true -export UNRANDOMIZE=true - -outputdir=$1 -mkdir -p ${TESTDATA}/${outputdir} || true -rm -rf ${TESTDATA}/${outputdir}/* - -outputdircc= -if [ ! -z "$2" ]; then -outputdircc=$2 -mkdir -p ${TESTDATA}/${outputdircc} || true -rm -rf ${TESTDATA}/${outputdircc}/* -mkdir -p ${TESTDATA}/${outputdircc}/cclass -mkdir -p ${TESTDATA}/${outputdircc}/legacy -fi - -for infra in ${TESTED_INFRAS}; do - infra_lc=`echo "$infra" | awk '{ print tolower($1) }'` - generate_cluster_configurations $infra_lc $outputdir $outputdircc -done - -set -e -check_generated diff --git a/providers/tests/clustergen/summarize_diff_scores.py b/providers/tests/clustergen/summarize_diff_scores.py deleted file mode 100755 index 5f66532ea2..0000000000 --- a/providers/tests/clustergen/summarize_diff_scores.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2022 Tanzu Framework Contributors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import csv -import os -import sys -import hashlib - -infras = ["AWS", "AZURE", "VSPHERE"] -val_types = ["MIN", "AVG", "MAX"] -scores = {"AWS": [0,0,0], - "AZURE": [0,0,0], - "VSPHERE": [0,0,0]} - -def summarize_diff_scores(test_dir, output_file): - test_num = 0 - for infra in infras: - csv_file = '{}/{}_diff_summary.csv'.format(test_dir, infra) - same_percentages = [] - try: - with open(csv_file, 'r') as file: - my_reader = csv.DictReader(file, delimiter=',') - for var_dict in my_reader: - cfg_args = [] - for k, v in sorted(var_dict.items()): - same_percentages.append(int(var_dict["SAME"])) - if len(same_percentages) > 0: - scores[infra] = [min(same_percentages), - int(sum(same_percentages)/len(same_percentages)), - max(same_percentages)] - except: - print("Error processing {}, skipped".format(csv_file)) - pass - - print("scores = {}".format(scores)) - headers = [] - vals = [] - for infra in infras: - for t in val_types: - headers.append("{}_{}".format(infra, t)) - vals.extend(scores[infra]) - - with open(output_file, "w+") as w: - w.write("{}\n{}\n".format(",".join(headers), ",".join([str(x) for x in vals]))) - -def main(): - if len(sys.argv) != 3: - print("Usage {} test_data_dir output_file_path".format(sys.argv[0])) - sys.exit(1) - else: - summarize_diff_scores(sys.argv[1], sys.argv[2]) - -if __name__ == "__main__": - main() diff --git a/providers/tests/clustergen/testdata/README.md b/providers/tests/clustergen/testdata/README.md deleted file mode 100644 index 199ada7b88..0000000000 --- a/providers/tests/clustergen/testdata/README.md +++ /dev/null @@ -1 +0,0 @@ -# location of generated test cases and the cluster configuration generated from them diff --git a/providers/tests/go.mod b/providers/tests/go.mod deleted file mode 100644 index 7ba4374600..0000000000 --- a/providers/tests/go.mod +++ /dev/null @@ -1,79 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/providers/tests - -go 1.18 - -require ( - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - github.com/vmware-tanzu/tanzu-framework/test/pkg v0.0.0-00010101000000-000000000000 - gopkg.in/yaml.v3 v3.0.1 - sigs.k8s.io/cluster-api v1.2.8 -) - -require ( - github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-logr/logr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/swag v0.19.14 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/gnostic v0.5.7-v3refs // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // 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/nxadm/tail v1.4.8 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/time v0.3.0 // indirect - gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/api v0.24.2 // indirect - k8s.io/apiextensions-apiserver v0.24.2 // indirect - k8s.io/apimachinery v0.24.2 // indirect - k8s.io/client-go v0.24.2 // indirect - k8s.io/component-base v0.24.2 // indirect - k8s.io/klog/v2 v2.60.1 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect - sigs.k8s.io/controller-runtime v0.12.3 // indirect - sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) - -replace github.com/vmware-tanzu/tanzu-framework/test/pkg => ../../test/pkg diff --git a/providers/tests/go.sum b/providers/tests/go.sum deleted file mode 100644 index 6415a97bd3..0000000000 --- a/providers/tests/go.sum +++ /dev/null @@ -1,989 +0,0 @@ -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 h1:aRd8M7HJVZOqn/vhOzrGcQH0lNAMkqMn+pXUYkatmcA= -github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -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.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.4 h1:GNapqRSid3zijZ9H77KrgVG4/8KqiyRsxcSxe+7ApXY= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= -github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.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.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -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= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= -k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= -k8s.io/apiextensions-apiserver v0.24.2 h1:/4NEQHKlEz1MlaK/wHT5KMKC9UKYz6NZz6JE6ov4G6k= -k8s.io/apiextensions-apiserver v0.24.2/go.mod h1:e5t2GMFVngUEHUd0wuCJzw8YDwZoqZfJiGOW6mm2hLQ= -k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= -k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.24.2/go.mod h1:pSuKzr3zV+L+MWqsEo0kHHYwCo77AT5qXbFXP2jbvFI= -k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= -k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= -k8s.io/code-generator v0.24.2/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.24.2 h1:kwpQdoSfbcH+8MPN4tALtajLDfSfYxBDYlXobNWI6OU= -k8s.io/component-base v0.24.2/go.mod h1:ucHwW76dajvQ9B7+zecZAP3BVqvrHoOxm8olHEg0nmM= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/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.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -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= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/providers/tests/unit/avi_test.go b/providers/tests/unit/avi_test.go deleted file mode 100644 index b34712ee37..0000000000 --- a/providers/tests/unit/avi_test.go +++ /dev/null @@ -1,416 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "io" - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -type yttValues map[string]interface{} - -func (v yttValues) toReader() io.Reader { - return strings.NewReader(createDataValues(v)) -} - -func (v yttValues) Set(key string, value interface{}) { - v[key] = value -} - -func (v yttValues) Delete(key string) { - delete(v, key) -} - -func (v yttValues) DeepCopy() yttValues { - other := make(yttValues) - for key, value := range v { - other[key] = value - } - return other -} - -func assertNotFound(docs []string, err error) { - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(0)) -} - -func assertFoundOne(docs []string, err error) { - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) -} - -const ( - AviUsername = "admin" - AviPassword = "pass_1234" - AviCaName = "avi-controller-ca" - AviCaDataB64 = "LS0tLS1CR...LS0tLQo=" - AviAdminCredentialName = "avi-controller-credentials" -) - -func NoAVIRelatedObjects(output string) { - assertNotFound(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Secret", - "$.metadata.name": "avi-secret", - })) - assertNotFound(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ServiceAccount", - "$.metadata.name": "ako-sa", - })) - assertNotFound(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ConfigMap", - "$.metadata.name": "ako-sa", - })) - assertNotFound(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ClusterRole", - "$.metadata.name": "ako-cr", - })) - assertNotFound(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ClusterRoleBinding", - "$.metadata.name": "ako-crb", - })) - assertNotFound(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "StatefulSet", - "$.metadata.name": "ako", - })) - assertNotFound(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ClusterRole", - "$.metadata.name": "ako-operator-manager-bootstrap", - })) - assertNotFound(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ClusterRoleBinding", - "$.metadata.name": "ako-operator-bootstrap-rolebinding", - })) - assertNotFound(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "StatefulSet", - "$.metadata.name": "ako-operator-controller-manager", - })) - assertNotFound(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Secret", - "$.metadata.name": AviAdminCredentialName, - })) - assertNotFound(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Secret", - "$.metadata.name": AviCaName, - })) -} - -func AllAVIRelatedObjects(output string) { - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Secret", - "$.metadata.name": "avi-secret", - })) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ServiceAccount", - "$.metadata.name": "ako-sa", - })) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ConfigMap", - "$.metadata.name": "avi-k8s-config", - })) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ClusterRole", - "$.metadata.name": "ako-cr", - })) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ClusterRoleBinding", - "$.metadata.name": "ako-crb", - })) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "StatefulSet", - "$.metadata.name": "ako", - })) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ClusterRole", - "$.metadata.name": "ako-operator-manager-bootstrap", - })) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ClusterRoleBinding", - "$.metadata.name": "ako-operator-bootstrap-rolebinding", - })) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Deployment", - "$.metadata.name": "ako-operator-controller-manager", - })) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Secret", - "$.metadata.name": AviAdminCredentialName, - })) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Secret", - "$.metadata.name": AviCaName, - })) -} - -var _ = Describe("AKO-operator Ytt Templating", func() { - - var paths []string - var baseVal yttValues - - BeforeEach(func() { - paths = []string{ - filepath.Join(yamlRoot, "config_default.yaml"), - filepath.Join(yamlRoot, "infrastructure-vsphere", capvVersion, "ytt", "overlay.yaml"), - filepath.Join(yamlRoot, "infrastructure-vsphere", capvVersion, "ytt", "base-template.yaml"), - filepath.Join("./fixtures/tkr-bom-v1.21.1.yaml"), - filepath.Join("./fixtures/tkg-bom-v1.4.0.yaml"), - filepath.Join(yamlRoot, "ytt"), - } - - baseVal = map[string]interface{}{ - // required fields - "TKG_DEFAULT_BOM": "tkg-bom-v1.4.0.yaml", - "KUBERNETES_RELEASE": "v1.21.2---vmware.1-tkg.1", - "CLUSTER_NAME": "test-cluster", - - // required fields to enable AVI - "PROVIDER_TYPE": "vsphere", - "TKG_CLUSTER_ROLE": "management", - "AVI_ENABLE": "true", - "AVI_CONTROL_PLANE_HA_PROVIDER": "true", - - // required vsphere configurations - "VSPHERE_USERNAME": "user_blah", - "VSPHERE_PASSWORD": "pass_1234", - "VSPHERE_SERVER": "vmware-tanzu.com", - "VSPHERE_DATACENTER": "vmware-tanzu-dc.com", - "VSPHERE_RESOURCE_POOL": "myrp", - "VSPHERE_FOLDER": "ds0", - "VSPHERE_SSH_AUTHORIZED_KEY": "ssh-rsa AAAA...+M7Q== vmware-tanzu.local", - "VSPHERE_INSECURE": "true", - "CLUSTER_CIDR": "192.168.1.0/16", - - // required by CAPV - "TKG_IP_FAMILY": "ipv4", - "SERVICE_CIDR": "5.5.5.5/16", - - // required avi related values - "AVI_USERNAME": AviUsername, - "AVI_PASSWORD": AviPassword, - "AVI_CA_NAME": AviCaName, - "AVI_CA_DATA_B64": AviCaDataB64, - "AVI_ADMIN_CREDENTIAL_NAME": AviAdminCredentialName, - } - }) - - When("basic values are provided", func() { - It("renders without error", func() { - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, baseVal.toReader()) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - When("use public cloud aws", func() { - var value yttValues - BeforeEach(func() { - value = baseVal.DeepCopy() - value.Set("PROVIDER_TYPE", "aws") - }) - - When("avi enabled", func() { - It("does not render avi objects as multi-cloud is not yet implemented", func() { - value.Set("AVI_ENABLE", "true") - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - NoAVIRelatedObjects(output) - }) - }) - - When("avi disabled", func() { - It("does not render avi objects as avi is disabled", func() { - value.Set("AVI_ENABLE", "false") - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - NoAVIRelatedObjects(output) - }) - }) - }) - - When("use vsphere", func() { - var value yttValues - BeforeEach(func() { - value = baseVal.DeepCopy() - value.Set("PROVIDER_TYPE", "vsphere") - }) - - When("enable avi", func() { - BeforeEach(func() { - value.Set("AVI_ENABLE", "true") - }) - - When("avi as HA provider", func() { - BeforeEach(func() { - value.Set("AVI_CONTROL_PLANE_HA_PROVIDER", "true") - }) - - It("render all avi related objects", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - AllAVIRelatedObjects(output) - }) - - When("AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP is not empty", func() { - const ( - mgmtSEG = "mgmt-seg" - aviSEG = "seg" - ) - It("prefer AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP as SEG name", func() { - value.Set("AVI_SERVICE_ENGINE_GROUP", aviSEG) - value.Set("AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP", mgmtSEG) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ConfigMap", - "$.metadata.name": "avi-k8s-config", - "$.data.serviceEngineGroupName": mgmtSEG, - })) - }) - }) - - When("AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP is empty", func() { - const ( - mgmtSEG = "" - aviSEG = "seg" - ) - It("fallback to AVI_SERVICE_ENGINE_GROUP as SEG name", func() { - value.Set("AVI_SERVICE_ENGINE_GROUP", aviSEG) - value.Set("AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP", mgmtSEG) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - assertFoundOne(matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ConfigMap", - "$.metadata.name": "avi-k8s-config", - "$.data.serviceEngineGroupName": aviSEG, - })) - }) - }) - }) - - When("avi is not HA provider", func() { - It("does not render avi objects as avi is not control plane HA provider", func() { - value.Set("AVI_CONTROL_PLANE_HA_PROVIDER", "false") - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - NoAVIRelatedObjects(output) - }) - }) - - Context("network separation feature", func() { - getAVIK8sConfig := func(v yttValues) string { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, v.toReader()) - Expect(err).NotTo(HaveOccurred()) - cm, err := matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "ConfigMap", - "$.metadata.name": "avi-k8s-config", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(cm).To(HaveLen(1)) - return cm[0] - } - - BeforeEach(func() { - value.Set("AVI_DATA_NETWORK", "data-network") - value.Set("AVI_DATA_NETWORK_CIDR", "10.0.1.0/24") - }) - - It("render data network as vip network", func() { - Expect(getAVIK8sConfig(value)).To(ContainSubstring("[{\"cidr\":\"10.0.1.0/24\",\"networkName\":\"data-network\"}]")) - }) - - When("mc vip is provided", func() { - BeforeEach(func() { - value.Set("AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME", "mc-network") - value.Set("AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR", "10.0.2.0/24") - }) - - It("render mc network as vip network", func() { - Expect(getAVIK8sConfig(value)).To(ContainSubstring("[{\"cidr\":\"10.0.2.0/24\",\"networkName\":\"mc-network\"}]")) - }) - - When("mc control plane vip is provided", func() { - BeforeEach(func() { - value.Set("AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME", "mc-control-plane-network") - value.Set("AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR", "10.0.3.0/24") - }) - - It("render mc control plane as vip network", func() { - Expect(getAVIK8sConfig(value)).To(ContainSubstring("[{\"cidr\":\"10.0.3.0/24\",\"networkName\":\"mc-control-plane-network\"}]")) - }) - }) - }) - }) - - Context("setting AVI_LABELS feature", func() { - BeforeEach(func() { - value.Set("AVI_LABELS", map[string]string{ - "foo1": "bar1", - "foo2": "bar2", - }) - }) - When("management cluster", func() { - BeforeEach(func() { - value.Set("TKG_CLUSTER_ROLE", "management") - }) - - It("adds labelSelector for install-ako-for-all", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - docs, err := matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Secret", - "$.metadata.name": "test-cluster-ako-operator-addon", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(ContainSubstring("avi_labels: '{\"foo1\":\"bar1\",\"foo2\":\"bar2\"}'")) - }) - }) - - When("workload cluster", func() { - BeforeEach(func() { - value.Set("TKG_CLUSTER_ROLE", "workload") - }) - - It("labels the workload cluster", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - docs, err := matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Cluster", - "$.metadata.name": "test-cluster", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(docs).To(HaveLen(1)) - Expect(docs[0]).To(ContainSubstring(" foo1: bar1\n foo2: bar2")) - }) - }) - - }) - - When("workload cluster and AVI_LABELS not provided", func() { - BeforeEach(func() { - value.Set("TKG_CLUSTER_ROLE", "workload") - }) - - It("should render without error", func() { - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - When("disable avi", func() { - It("does not render avi objects as it is disabled", func() { - value.Set("AVI_ENABLE", "false") - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - NoAVIRelatedObjects(output) - }) - }) - }) -}) diff --git a/providers/tests/unit/custom_nameservers_test.go b/providers/tests/unit/custom_nameservers_test.go deleted file mode 100644 index b9a6372531..0000000000 --- a/providers/tests/unit/custom_nameservers_test.go +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -var _ = Describe("Control Plane/Workload Node Nameserver Ytt Templating", func() { - var paths []string - BeforeEach(func() { - paths = []string{ - filepath.Join("fixtures", "yttmocks"), - filepath.Join("..", "..", "infrastructure-vsphere", capvVersion, "ytt", "overlay.yaml"), - filepath.Join("..", "..", "infrastructure-vsphere", capvVersion, "ytt", "base-template.yaml"), - filepath.Join("..", "..", "config_default.yaml"), - } - }) - - When("TKG_IP_FAMILY is ipv4", func() { - var values string - BeforeEach(func() { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "KUBERNETES_RELEASE": "v1.22.11---vmware.1-tkg.1", - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv4", - "CONTROL_PLANE_NODE_NAMESERVERS": "1.1.1.1,2.2.2.2", - "WORKER_NODE_NAMESERVERS": "3.3.3.3,4.4.4.4", - "SERVICE_CIDR": "5.5.5.5/16", - "CLUSTER_CIDR": "6.6.6.6/16", - }) - }) - - It("renders the control plane VSphereMachineTemplate with the custom control plane node nameservers", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplate, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "foo-control-plane", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(vsphereMachineTemplate).To(HaveLen(1)) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[0]", "1.1.1.1")) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[1]", "2.2.2.2")) - }) - - It("renders the worker VSphereMachineTemplate with the custom worker node nameservers", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplate, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "foo-worker", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(vsphereMachineTemplate).To(HaveLen(1)) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[0]", "3.3.3.3")) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[1]", "4.4.4.4")) - }) - }) - - When("TKG_IP_FAMILY is ipv6", func() { - var values string - BeforeEach(func() { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "KUBERNETES_RELEASE": "v1.22.11---vmware.1-tkg.1", - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv6", - "CONTROL_PLANE_NODE_NAMESERVERS": "fd00::1,fd00::2", - "WORKER_NODE_NAMESERVERS": "fd00::3,fd00::4", - "SERVICE_CIDR": "5.5.5.5/16", - "CLUSTER_CIDR": "6.6.6.6/16", - }) - }) - - It("renders the control plane VSphereMachineTemplate with the custom control plane node nameservers", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplate, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "foo-control-plane", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(vsphereMachineTemplate).To(HaveLen(1)) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[0]", "fd00::1")) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[1]", "fd00::2")) - }) - - It("renders the worker VSphereMachineTemplate with the custom worker node nameservers", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplate, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "foo-worker", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(vsphereMachineTemplate).To(HaveLen(1)) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[0]", "fd00::3")) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[1]", "fd00::4")) - }) - }) - - When("TKG_IP_FAMILY is ipv4,ipv6", func() { - var values string - BeforeEach(func() { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "KUBERNETES_RELEASE": "v1.22.11---vmware.1-tkg.1", - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv4,ipv6", - "CONTROL_PLANE_NODE_NAMESERVERS": "1.1.1.1,fd00::2", - "WORKER_NODE_NAMESERVERS": "3.3.3.3,fd00::4", - "SERVICE_CIDR": "5.5.5.5/16", - "CLUSTER_CIDR": "6.6.6.6/16", - }) - }) - - It("renders the control plane VSphereMachineTemplate with the custom control plane node nameservers", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplate, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "foo-control-plane", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(vsphereMachineTemplate).To(HaveLen(1)) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[0]", "1.1.1.1")) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[1]", "fd00::2")) - }) - - It("renders the worker VSphereMachineTemplate with the custom worker node nameservers", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplate, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "foo-worker", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(vsphereMachineTemplate).To(HaveLen(1)) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[0]", "3.3.3.3")) - Expect(vsphereMachineTemplate[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].nameservers[1]", "fd00::4")) - }) - }) -}) diff --git a/providers/tests/unit/fixtures/antrea_data_values.yaml b/providers/tests/unit/fixtures/antrea_data_values.yaml deleted file mode 100644 index e0b45200ee..0000000000 --- a/providers/tests/unit/fixtures/antrea_data_values.yaml +++ /dev/null @@ -1,4 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("/antrea_addon_data.lib.yaml", "antreadatavalues") - -data: #@ antreadatavalues() diff --git a/providers/tests/unit/fixtures/tkg-bom-v1.4.0.yaml b/providers/tests/unit/fixtures/tkg-bom-v1.4.0.yaml deleted file mode 100644 index 93fa90e360..0000000000 --- a/providers/tests/unit/fixtures/tkg-bom-v1.4.0.yaml +++ /dev/null @@ -1,389 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha2 -default: - k8sVersion: v1.21.2+vmware.1-tkg.1 -release: - version: v1.4.0 -components: - aad-pod-identity: - - version: v1.6.3+vmware.2 - images: - micImage: - imagePath: cluster-api/mic - tag: v1.6.3_vmware.2 - nmiImage: - imagePath: cluster-api/nmi - tag: v1.6.3_vmware.2 - alertmanager: - - version: v0.22.2+vmware.1 - images: - alertmanagerImage: - imagePath: prometheus/alertmanager - tag: v0.22.2_vmware.1 - cadvisor: - - version: v0.39.1+vmware.1 - images: - cadvisorImage: - imagePath: prometheus/cadvisor - tag: v0.39.1_vmware.1 - cloud-provider-azure: - - version: v0.7.4+vmware.1 - images: - ccmAzureControllerImage: - imagePath: azure-cloud-controller-manager - tag: v0.7.4_vmware.1 - ccmAzureNodeImage: - imagePath: azure-cloud-node-manager - tag: v0.7.4_vmware.1 - cluster-api-provider-azure: - - version: v0.4.15+vmware.1 - images: - capzControllerImage: - imagePath: cluster-api/cluster-api-azure-controller - tag: v0.4.15_vmware.1 - cluster_api: - - version: v0.3.23+vmware.1 - images: - cabpkControllerImage: - imagePath: cluster-api/kubeadm-bootstrap-controller - tag: v0.3.23_vmware.1 - capdManagerImage: - imagePath: cluster-api/capd-manager - tag: v0.3.23_vmware.1 - capiControllerImage: - imagePath: cluster-api/cluster-api-controller - tag: v0.3.23_vmware.1 - kcpControllerImage: - imagePath: cluster-api/kubeadm-control-plane-controller - tag: v0.3.23_vmware.1 - cluster_api_aws: - - version: v0.6.6+vmware.1 - images: - capaControllerImage: - imagePath: cluster-api/cluster-api-aws-controller - tag: v0.6.6_vmware.1 - cluster_api_vsphere: - - version: v0.7.10+vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/cluster-api-vsphere-controller - tag: v0.7.10_vmware.1 - configmap-reload: - - version: v0.5.0+vmware.1 - images: - configmapReloadImage: - imagePath: prometheus/configmap-reload - tag: v0.5.0_vmware.1 - contour: - - version: v1.17.1+vmware.1 - images: - contourImage: - imagePath: contour - tag: v1.17.1_vmware.1 - crash-diagnostics: - - version: v0.3.3+vmware.1 - envoy: - - version: v1.18.3+vmware.1 - images: - envoyImage: - imagePath: envoy - tag: v1.18.3_vmware.1 - external-dns: - - version: v0.8.0+vmware.1 - images: - externalDNSImage: - imagePath: external-dns - tag: v0.8.0_vmware.1 - fluent-bit: - - version: v1.7.5+vmware.1 - images: - fluentBitImage: - imagePath: fluent-bit - tag: v1.7.5_vmware.1 - gangway: - - version: v3.2.0+vmware.2 - images: - gangwayImage: - imagePath: gangway - tag: v3.2.0_vmware.2 - grafana: - - version: v7.5.7+vmware.1 - images: - grafanaImage: - imagePath: grafana/grafana - tag: v7.5.7_vmware.1 - harbor: - - version: v2.2.3+vmware.1 - images: - harborChartMuseumImage: - imagePath: harbor/chartmuseum-photon - tag: v2.2.3_vmware.1 - harborCoreImage: - imagePath: harbor/harbor-core - tag: v2.2.3_vmware.1 - harborDatabaseImage: - imagePath: harbor/harbor-db - tag: v2.2.3_vmware.1 - harborExporterImage: - imagePath: harbor/harbor-exporter - tag: v2.2.3_vmware.1 - harborJobServiceImage: - imagePath: harbor/harbor-jobservice - tag: v2.2.3_vmware.1 - harborLogImage: - imagePath: harbor/harbor-log - tag: v2.2.3_vmware.1 - harborNginxImage: - imagePath: harbor/nginx-photon - tag: v2.2.3_vmware.1 - harborNotaryServerImage: - imagePath: harbor/notary-server-photon - tag: v2.2.3_vmware.1 - harborNotarySignerImage: - imagePath: harbor/notary-signer-photon - tag: v2.2.3_vmware.1 - harborPortalImage: - imagePath: harbor/harbor-portal - tag: v2.2.3_vmware.1 - harborPrepareImage: - imagePath: harbor/prepare - tag: v2.2.3_vmware.1 - harborRedisImage: - imagePath: harbor/redis-photon - tag: v2.2.3_vmware.1 - harborRegistryCtlImage: - imagePath: harbor/harbor-registryctl - tag: v2.2.3_vmware.1 - harborRegistryImage: - imagePath: harbor/registry-photon - tag: v2.2.3_vmware.1 - harborTrivyAdapterImage: - imagePath: harbor/trivy-adapter-photon - tag: v2.2.3_vmware.1 - image-builder: - - version: v0.1.9+vmware.1 - images: - imagebuilder-tar: - imagePath: image-builder - tag: v0.1.9_vmware.1 - imgpkg: - - version: v0.10.0+vmware.1 - jetstack_cert-manager: - - version: v1.1.0+vmware.1 - images: - certMgrControllerImage: - imagePath: cert-manager-controller - tag: v1.1.0_vmware.1 - certMgrInjectorImage: - imagePath: cert-manager-cainjector - tag: v1.1.0_vmware.1 - certMgrWebhookImage: - imagePath: cert-manager-webhook - tag: v1.1.0_vmware.1 - k8s-sidecar: - - version: v1.12.1+vmware.1 - images: - k8sSidecarImage: - imagePath: grafana/k8s-sidecar - tag: v1.12.1_vmware.1 - k14s_kapp: - - version: v0.37.0+vmware.1 - k14s_ytt: - - version: v0.34.0+vmware.1 - kbld: - - version: v0.30.0+vmware.1 - kube-state-metrics: - - version: v1.9.8+vmware.1 - images: - kubeStateMetricsImage: - imagePath: prometheus/kube-state-metrics - tag: v1.9.8_vmware.1 - kube-vip: - - version: v0.3.3+vmware.1 - images: - kubeVipImage: - imagePath: kube-vip - tag: v0.3.3_vmware.1 - kube_rbac_proxy: - - version: v0.8.0+vmware.1 - images: - kubeRbacProxyControllerImage: - imagePath: kube-rbac-proxy - tag: v0.8.0_vmware.1 - kubeRbacProxyControllerImageCapi: - imagePath: cluster-api/kube-rbac-proxy - tag: v0.8.0_vmware.1 - kubernetes-sigs_kind: - - version: v1.21.2+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.21.2_vmware.1 - kubernetes_autoscaler: - - version: v1.21.0+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.21.0_vmware.1 - metadata: - k8sversion: v1.21.1+vmware.1 - - version: v1.20.0+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.20.0_vmware.1 - metadata: - k8sversion: v1.20.4+vmware.1 - - version: v1.19.1+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.19.1_vmware.1 - metadata: - k8sversion: v1.19.8+vmware.1 - multus-cni: - - version: v3.7.1+vmware.1 - images: - multusCniImage: - imagePath: multus-cni - tag: v3.7.1_vmware.1 - prometheus: - - version: v2.27.0+vmware.1 - images: - prometheusImage: - imagePath: prometheus/prometheus - tag: v2.27.0_vmware.1 - prometheus_node_exporter: - - version: v1.1.2+vmware.1 - images: - prometheusNodeExporterImage: - imagePath: prometheus/prometheus_node_exporter - tag: v1.1.2_vmware.1 - pushgateway: - - version: v1.4.0+vmware.1 - images: - pushgatewayImage: - imagePath: prometheus/pushgateway - tag: v1.4.0_vmware.1 - sonobuoy: - - version: v0.20.0+vmware.1 - images: - sonobuoyImage: - imagePath: sonobuoy - tag: v0.20.0_vmware.1 - tanzu-framework: - - version: v1.4.0 - images: - capabilitiesImage: - imagePath: tanzu_core/capabilities/capabilities-controller-manager - tag: v1.4.0 - providerTemplateImage: - imagePath: tanzu_core/provider/provider-templates - tag: v1.4.0 - tkrImage: - imagePath: tanzu_core/tkr/tkr-controller-manager - tag: v1.4.0 - tkg-bom: - - version: v1.4.0 - images: - tkgBomImage: - imagePath: tkg-bom - tag: v1.4.0 - tkg-standard-packages: - - version: v1.4.0 - images: - cert-manager.tanzu.vmware.com: - imagePath: packages/standard/cert-manager - tag: v1.1.0_vmware.1-tkg.2 - contour.tanzu.vmware.com: - imagePath: packages/standard/contour - tag: v1.17.1_vmware.1-tkg.1 - external-dns.tanzu.vmware.com: - imagePath: packages/standard/external-dns - tag: v0.8.0_vmware.1-tkg.1 - fluent-bit.tanzu.vmware.com: - imagePath: packages/standard/fluent-bit - tag: v1.7.5_vmware.1-tkg.1 - grafana.tanzu.vmware.com: - imagePath: packages/standard/grafana - tag: v7.5.7_vmware.1-tkg.1 - harbor.tanzu.vmware.com: - imagePath: packages/standard/harbor - tag: v2.2.3_vmware.1-tkg.1 - multus-cni.tanzu.vmware.com: - imagePath: packages/standard/multus-cni - tag: v3.7.1_vmware.1-tkg.1 - prometheus.tanzu.vmware.com: - imagePath: packages/standard/prometheus - tag: v2.27.0_vmware.1-tkg.1 - tanzuStandardPackageRepositoryImage: - imagePath: packages/standard/repo - tag: v1.4.0 - tanzu-framework-management-packages: - - version: v0.11.0-dev-25-g4ed8343e - images: - tanzuFrameworkManagementPackageRepositoryImage: - imagePath: sandbox/packages/management/repo - tag: v0.11.0-dev-25-g4ed8343e - tkg_telemetry: - - version: v1.4.0+vmware.1 - images: - tkgTelemetryImage: - imagePath: tkg-telemetry - tag: v1.4.0_vmware.1 - velero: - - version: v1.6.2+vmware.1 - images: - veleroImage: - imagePath: velero/velero - tag: v1.6.2_vmware.1 - veleroResticRestoreHelperImage: - imagePath: velero/velero-restic-restore-helper - tag: v1.6.2_vmware.1 - velero-plugin-for-aws: - - version: v1.2.1+vmware.1 - images: - veleroPluginForAwsImage: - imagePath: velero/velero-plugin-for-aws - tag: v1.2.1_vmware.1 - velero-plugin-for-microsoft-azure: - - version: v1.2.1+vmware.1 - images: - veleroPluginForMicrosoftAzureImage: - imagePath: velero/velero-plugin-for-microsoft-azure - tag: v1.2.1_vmware.1 - velero-plugin-for-vsphere: - - version: v1.1.1+vmware.1 - images: - veleroBackupDriverImage: - imagePath: velero/backup-driver - tag: v1.1.1_vmware.1 - veleroDataManagerForPluginImage: - imagePath: velero/data-manager-for-plugin - tag: v1.1.1_vmware.1 - veleroPluginForVsphereImage: - imagePath: velero/velero-plugin-for-vsphere - tag: v1.1.1_vmware.1 - vendir: - - version: v0.21.1+vmware.1 -kindKubeadmConfigSpec: -- 'kind: Cluster' -- 'apiVersion: kind.x-k8s.io/v1alpha4' -- 'kubeadmConfigPatches:' -- '- |' -- ' apiVersion: kubeadm.k8s.io/v1beta2' -- ' kind: ClusterConfiguration' -- ' imageRepository: projects.registry.vmware.com/tkg' -- ' etcd:' -- ' local:' -- ' imageRepository: projects.registry.vmware.com/tkg' -- ' imageTag: v3.4.13_vmware.15' -- ' dns:' -- ' type: CoreDNS' -- ' imageRepository: projects.registry.vmware.com/tkg' -- ' imageTag: v1.8.0_vmware.5' -imageConfig: - imageRepository: projects.registry.vmware.com/tkg -tkr-bom: - imagePath: tkr-bom -tkr-compatibility: - imagePath: tkr-compatibility diff --git a/providers/tests/unit/fixtures/tkr-bom-v1.21.1.yaml b/providers/tests/unit/fixtures/tkr-bom-v1.21.1.yaml deleted file mode 100644 index 65a8a41a52..0000000000 --- a/providers/tests/unit/fixtures/tkr-bom-v1.21.1.yaml +++ /dev/null @@ -1,483 +0,0 @@ -# taken from tkr-bom-v1.21.2+vmware.1-tkg.2-20210924-539f8b15.yaml 9/29/2021 -apiVersion: run.tanzu.vmware.com/v1alpha2 -release: - version: v1.21.2+vmware.1-tkg.1 -components: - ako-operator: - - version: v1.4.0+vmware.1 - images: - akoOperatorImage: - imagePath: ako-operator - tag: v1.4.0_vmware.1 - antrea: - - version: v0.13.3+vmware.1 - images: - antreaImage: - imagePath: antrea/antrea-debian - tag: v0.13.3_vmware.1 - calico_all: - - version: v3.11.3+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni-plugin - tag: v3.11.3_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.11.3_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.11.3_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon - tag: v3.11.3_vmware.1 - cloud_provider_vsphere: - - version: v1.21.0+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.21.0_vmware.1 - cni_plugins: - - version: v0.8.7+vmware.14 - containerd: - - version: v1.4.6+vmware.1 - coredns: - - version: v1.8.0+vmware.5 - images: - coredns: - imagePath: coredns - tag: v1.8.0_vmware.5 - cri_tools: - - version: v1.20.0+vmware.3 - csi_attacher: - - version: v3.2.0+vmware.1 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v3.2.0_vmware.1 - csi_livenessprobe: - - version: v2.2.0+vmware.1 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v2.2.0_vmware.1 - csi_node_driver_registrar: - - version: v2.1.0+vmware.1 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v2.1.0_vmware.1 - csi_provisioner: - - version: v2.2.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v2.2.0_vmware.1 - dex: - - version: v2.27.0+vmware.1 - images: - dexImage: - imagePath: dex - tag: v2.27.0_vmware.1 - etcd: - - version: v3.4.13+vmware.15 - images: - etcd: - imagePath: etcd - tag: v3.4.13_vmware.15 - kapp-controller: - - version: v0.23.0+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.23.0_vmware.1 - kubernetes: - - version: v1.21.2+vmware.1 - images: - kubeAPIServer: - imagePath: kube-apiserver - tag: v1.21.2_vmware.1 - kubeControllerManager: - imagePath: kube-controller-manager - tag: v1.21.2_vmware.1 - kubeE2e: - imagePath: e2e-test - tag: v1.21.2_vmware.1 - kubeProxy: - imagePath: kube-proxy - tag: v1.21.2_vmware.1 - kubeScheduler: - imagePath: kube-scheduler - tag: v1.21.2_vmware.1 - pause: - imagePath: pause - tag: 3.4.1 - pause_windows_1809: - imagePath: pause - tag: 3.4.1-windows-amd64 - pause_windows_1903: - imagePath: pause - tag: 3.4.1-windows-amd64-1903 - pause_windows_1909: - imagePath: pause - tag: 3.4.1-windows-amd64-1909 - pause_windows_2004: - imagePath: pause - tag: 3.4.1-windows-amd64-2004 - kubernetes-csi_external-resizer: - - version: v1.1.0+vmware.1 - images: - csiExternalResizer: - imagePath: kubernetes-csi_external-resizer - tag: v1.1.0_vmware.1 - kubernetes-sigs_kind: - - version: v1.21.2+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.21.2_vmware.1 - load-balancer-and-ingress-service: - - version: v1.4.3+vmware.1 - images: - loadBalancerAndIngressServiceImage: - imagePath: ako - tag: v1.4.3_vmware.1 - metrics-server: - - version: v0.4.0+vmware.1 - images: - metricsServerImage: - imagePath: metrics-server - tag: v0.4.0_vmware.1 - pinniped: - - version: v0.4.4+vmware.1 - images: - pinnipedImage: - imagePath: pinniped - tag: v0.4.4_vmware.1 - tanzu-framework-addons: - - version: v0.3.0-15-g539f8b15 - images: - tanzuAddonsManagerImage: - imagePath: tanzu_core/addons/tanzu-addons-manager - tag: v0.3.0-15-g539f8b15 - tkgPinnipedPostDeployImage: - imagePath: tanzu_core/addons/tkg-pinniped-post-deploy - tag: v0.3.0-15-g539f8b15 - tkg-core-packages: - - version: v1.21.2+vmware.1-tkg.2-20210924-539f8b15 - images: - addons-manager.tanzu.vmware.com: - imagePath: packages/core/addons-manager - tag: v1.4.0_vmware.1-tkg.2-20210924-539f8b15 - ako-operator.tanzu.vmware.com: - imagePath: packages/core/ako-operator - tag: v1.4.0_vmware.1-tkg.2-20210924-539f8b15 - antrea.tanzu.vmware.com: - imagePath: packages/core/antrea - tag: v0.13.3_vmware.1-tkg.2-20210924-539f8b15 - calico.tanzu.vmware.com: - imagePath: packages/core/calico - tag: v3.11.3_vmware.1-tkg.2-20210924-539f8b15 - kapp-controller.tanzu.vmware.com: - imagePath: packages/core/kapp-controller - tag: v0.23.0_vmware.1-tkg.2-20210924-539f8b15 - load-balancer-and-ingress-service.tanzu.vmware.com: - imagePath: packages/core/load-balancer-and-ingress-service - tag: v1.4.3_vmware.1-tkg.2-20210924-539f8b15 - metrics-server.tanzu.vmware.com: - imagePath: packages/core/metrics-server - tag: v0.4.0_vmware.1-tkg.2-20210924-539f8b15 - pinniped.tanzu.vmware.com: - imagePath: packages/core/pinniped - tag: v0.4.4_vmware.1-tkg.2-20210924-539f8b15 - tanzuCorePackageRepositoryImage: - imagePath: packages/core/repo - tag: v1.21.2_vmware.1-tkg.2-20210924-539f8b15 - vsphere-cpi.tanzu.vmware.com: - imagePath: packages/core/vsphere-cpi - tag: v1.21.0_vmware.1-tkg.2-20210924-539f8b15 - vsphere-csi.tanzu.vmware.com: - imagePath: packages/core/vsphere-csi - tag: v2.3.0_vmware.1-tkg.3-20210924-539f8b15 - vsphere_csi_driver: - - version: v2.3.0+vmware.1 - images: - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.3.0_vmware.1 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.3.0_vmware.1 -kubeadmConfigSpec: - apiVersion: kubeadm.k8s.io/v1beta2 - kind: ClusterConfiguration - imageRepository: projects.registry.vmware.com/tkg - kubernetesVersion: v1.21.2+vmware.1 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: projects.registry.vmware.com/tkg - imageTag: v3.4.13_vmware.15 - dns: - type: CoreDNS - imageRepository: projects.registry.vmware.com/tkg - imageTag: v1.8.0_vmware.5 -ova: -- name: ova-photon-3 - osinfo: - name: photon - version: "3" - arch: amd64 - version: v1.21.2+vmware.1-tkg.2-12816990095845873721 -- name: ova-ubuntu-2004 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - version: v1.21.2+vmware.1-tkg.1-7832907791984498322 -ami: - ap-northeast-1: - - id: ami-041d8c130eb62b7fb - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-023fcdb5c85ad99f4 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-northeast-2: - - id: ami-08ffa58c8953cfcb8 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0bd75bd3a331b2d2a - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-south-1: - - id: ami-0e2f03d1d1aff04f3 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0ac318b67b7fd2172 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-southeast-1: - - id: ami-0c888954efee38899 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-096c004b38406c15e - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - ap-southeast-2: - - id: ami-0b84a436eaf66708a - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-040f3dc7e1af3baa3 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-central-1: - - id: ami-05d17b752ff2bd1f0 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0c2b92b3daa41420a - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-1: - - id: ami-0f210a57e0be8c9ef - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-08e4426e266ae1051 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-2: - - id: ami-0a1ea980dc0e677e2 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-02096b4f9a0558a2a - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - eu-west-3: - - id: ami-0f3d847bbc5a04d19 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0fc1686196a449cbe - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - sa-east-1: - - id: ami-09bc44413b656c232 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-018113cf5656b3102 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-east-1: - - id: ami-0f0f0bb6426dfbe79 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0af8ffc12535aa02d - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-east-2: - - id: ami-08f4095e19c367152 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0fbe031f9d19aeac7 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-gov-east-1: - - id: ami-0112cb5e809e4284d - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0383eb866523be1f5 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-gov-west-1: - - id: ami-059061a8a5f3868cb - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-08c2d07dfdbc4beb3 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 - us-west-2: - - id: ami-0293f31158f5c72f3 - osinfo: - name: amazon - version: "2" - arch: amd64 - - id: ami-0c687784b0671fc49 - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 -azure: -- sku: k8s-1dot21dot2-ubuntu-1804 - publisher: vmware-inc - offer: tkg-capi - version: 2021.06.28 - thirdPartyImage: true - osinfo: - name: ubuntu - version: "18.04" - arch: amd64 -- sku: k8s-1dot21dot2-ubuntu-2004 - publisher: vmware-inc - offer: tkg-capi - version: 2021.06.28 - thirdPartyImage: true - osinfo: - name: ubuntu - version: "20.04" - arch: amd64 -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -addons: - ako-operator: - category: networking - clusterTypes: - - management - packageName: ako-operator.tanzu.vmware.com - antrea: - category: cni - clusterTypes: - - management - - workload - packageName: antrea.tanzu.vmware.com - calico: - category: cni - clusterTypes: - - management - - workload - packageName: calico.tanzu.vmware.com - kapp-controller: - category: addons-management - clusterTypes: - - management - - workload - packageName: kapp-controller.tanzu.vmware.com - load-balancer-and-ingress-service: - category: networking - clusterTypes: - - management - - workload - packageName: load-balancer-and-ingress-service.tanzu.vmware.com - metrics-server: - category: metrics - clusterTypes: - - management - - workload - packageName: metrics-server.tanzu.vmware.com - pinniped: - category: authentication - clusterTypes: - - management - - workload - packageName: pinniped.tanzu.vmware.com - tanzu-addons-manager: - category: addons-management - clusterTypes: - - management - - workload - packageName: addons-manager.tanzu.vmware.com - vsphere-cpi: - category: cpi - clusterTypes: - - management - - workload - packageName: vsphere-cpi.tanzu.vmware.com - vsphere-csi: - category: csi - clusterTypes: - - management - - workload - packageName: vsphere-csi.tanzu.vmware.com diff --git a/providers/tests/unit/fixtures/vsphere_cpi_ip_family.yaml b/providers/tests/unit/fixtures/vsphere_cpi_ip_family.yaml deleted file mode 100644 index e36ea25464..0000000000 --- a/providers/tests/unit/fixtures/vsphere_cpi_ip_family.yaml +++ /dev/null @@ -1,4 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("cpi_addon_data.lib.yaml", "vsphere_cpi_data_values") - -data: #@ vsphere_cpi_data_values() diff --git a/providers/tests/unit/fixtures/yttmocks/lib/helpers.star b/providers/tests/unit/fixtures/yttmocks/lib/helpers.star deleted file mode 100644 index 7f422f4ea6..0000000000 --- a/providers/tests/unit/fixtures/yttmocks/lib/helpers.star +++ /dev/null @@ -1,92 +0,0 @@ -load("@ytt:struct", "struct") -load("@ytt:assert", "assert") - -valid_md_rollout_strategy_types = ["OnDelete", "RollingUpdate"] - -# verify_and_configure_machine_deployment_rollout_strategy, verify strategy type input against allowed type and return type if correct. -def verify_and_configure_machine_deployment_rollout_strategy(strategy_type): - if strategy_type not in valid_md_rollout_strategy_types: - strs = ", ".join(valid_md_rollout_strategy_types) - assert.fail("Invalid Strategy type, Allowed values: \""+strs+"\"") - end - return strategy_type -end - -def get_bom_data_for_tkr_name(): - return struct.encode({ - "components": { - "antrea": [{ - "images": { - "antreaImage": { - "imagePath": "fake-antrea-image" - } - } - }], - "cloud_provider_vsphere": [{ - "images": { - "ccmControllerImage": { - "imagePath": "fake-ccm-image", - "tag": "fake-ccm-tag" - } - } - }] - }, - "kubeadmConfigSpec": { - "imageRepository": "fake-kubeadm-image-repo", - "etcd": { - "local": { - "imageRepository": "fake-etcd-image-repo", - "imageTag": "fake-etcd-image-tag" - } - }, - "dns": { - "imageRepository": "fake-dns-image-repo", - "imageTag": "fake-dns-image-tag" - }, - } - }) -end - -def tkg_image_repo(): - return "fake-tkg-image-repo" -end - -def get_image_repo_for_component(image): - return "fake-image-repo" -end - -def get_default_tkg_bom_data(): - return struct.encode({ - "components": { - "kube-vip": [{ - "images": { - "kubeVipImage": { - "imagePath": "fake-kube-vip-image-path", - "tag": "fake-kube-vip-tag" - } - } - }] - } - }) -end - -def kubeadm_image_repo(image_repo): - return "fake-kubeadm-image-repo" -end - -def get_vsphere_thumbprint(): - return "fake-thumbprint" -end - -def get_no_proxy(): - return "fake-no-proxy" -end - -def get_tkr_version_from_tkr_name(tkr_name): - strs = tkr_name.split("---") - return strs[0] + "+" + strs[1] -end - -def map(f, list): - return [f(x) for x in list] -end \ No newline at end of file diff --git a/providers/tests/unit/fixtures/yttmocks/lib/validate.star b/providers/tests/unit/fixtures/yttmocks/lib/validate.star deleted file mode 100644 index 5a9fb01002..0000000000 --- a/providers/tests/unit/fixtures/yttmocks/lib/validate.star +++ /dev/null @@ -1,3 +0,0 @@ -def validate_configuration(provider): - return -end diff --git a/providers/tests/unit/hardware_version_upgrade_test.go b/providers/tests/unit/hardware_version_upgrade_test.go deleted file mode 100644 index 1813e35d11..0000000000 --- a/providers/tests/unit/hardware_version_upgrade_test.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "fmt" - "path/filepath" - - "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -var _ = Describe("Hardware version upgrade", func() { - var paths []string - var baseVal yttValues - - BeforeEach(func() { - paths = []string{ - filepath.Join(yamlRoot, "config_default.yaml"), - filepath.Join(yamlRoot, "infrastructure-vsphere", capvVersion, "ytt", "overlay.yaml"), - filepath.Join(yamlRoot, "infrastructure-vsphere", capvVersion, "ytt", "base-template.yaml"), - filepath.Join("./fixtures/tkr-bom-v1.21.1.yaml"), - filepath.Join("./fixtures/tkg-bom-v1.4.0.yaml"), - filepath.Join(yamlRoot, "ytt"), - } - - baseVal = map[string]interface{}{ - // required fields - "TKG_DEFAULT_BOM": "tkg-bom-v1.4.0.yaml", - "KUBERNETES_RELEASE": "v1.21.2---vmware.1-tkg.1", - "CLUSTER_NAME": "test-cluster", - - // required fields for CAPV - "PROVIDER_TYPE": "vsphere", - "TKG_CLUSTER_ROLE": "management", - "TKG_IP_FAMILY": "ipv4", - "SERVICE_CIDR": "5.5.5.5/16", - - // required vsphere configurations - "VSPHERE_USERNAME": "user_blah", - "VSPHERE_PASSWORD": "pass_1234", - "VSPHERE_SERVER": "vmware-tanzu.com", - "VSPHERE_DATACENTER": "vmware-tanzu-dc.com", - "VSPHERE_RESOURCE_POOL": "myrp", - "VSPHERE_FOLDER": "ds0", - "VSPHERE_SSH_AUTHORIZED_KEY": "ssh-rsa AAAA...+M7Q== vmware-tanzu.local", - "VSPHERE_INSECURE": "true", - "CLUSTER_CIDR": "192.168.1.0/16", - } - }) - - When("VSPHERE_WORKER_HARDWARE_VERSION and VSPHERE_CONTROL_PLANE_HARDWARE_VERSION are set", func() { - var value yttValues - BeforeEach(func() { - value = baseVal.DeepCopy() - }) - - It("sets the hardware version on the worker VSphereMachineTemplate object", func() { - value.Set("VSPHERE_WORKER_HARDWARE_VERSION", "vmx-17") - - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplates, err := matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "test-cluster-worker", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(len(vsphereMachineTemplates)).To(Equal(1)) - Expect(vsphereMachineTemplates[0]).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.hardwareVersion", "vmx-17")) - }) - - It("sets the hardware version on the control plane VSphereMachineTemplate object", func() { - value.Set("VSPHERE_CONTROL_PLANE_HARDWARE_VERSION", "vmx-18") - - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplates, err := matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "test-cluster-control-plane", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(len(vsphereMachineTemplates)).To(Equal(1)) - Expect(vsphereMachineTemplates[0]).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.hardwareVersion", "vmx-18")) - }) - }) - - When("VSPHERE_WORKER_HARDWARE_VERSION and VSPHERE_CONTROL_PLANE_HARDWARE_VERSION are unset", func() { - var value yttValues - BeforeEach(func() { - value = baseVal.DeepCopy() - }) - - It("does not set the hardware version on the VSphereMachineTemplate objects", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - - clusterTypes := []string{"worker", "control-plane"} - for _, clusterType := range clusterTypes { - vsphereMachineTemplates, err := matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": fmt.Sprintf("test-cluster-%s", clusterType), - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(len(vsphereMachineTemplates)).NotTo(Equal(0)) - - for _, vsphereMachineTemplate := range vsphereMachineTemplates { - Expect(vsphereMachineTemplate).NotTo(matchers.HaveYAMLPath("$.spec.template.spec.hardwareVersion")) - } - } - }) - }) -}) diff --git a/providers/tests/unit/ip_family_test.go b/providers/tests/unit/ip_family_test.go deleted file mode 100644 index 980b7579ae..0000000000 --- a/providers/tests/unit/ip_family_test.go +++ /dev/null @@ -1,887 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/extensions/table" - . "github.com/onsi/gomega" - "gopkg.in/yaml.v3" - - . "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -const ( - capvVersion = "v1.5.3" - yamlRoot = "../../" -) - -var _ = Describe("TKG_IP_FAMILY Ytt Templating", func() { - Describe("IP family ytt validations", func() { - var paths []string - BeforeEach(func() { - paths = []string{ - // assumes that ../../ is where the yaml templates live - filepath.Join(yamlRoot, "config_default.yaml"), - filepath.Join(yamlRoot, "ytt", "03_customizations", "ip_family.yaml"), - } - }) - - It("allows undefined", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - - It("allows ipv4", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "ipv4", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - - When("an unsupported ip family is set", func() { - It("does not allow dual", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "dual", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(HaveOccurred()) - }) - - It("does not allow garbage", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "garbage", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(HaveOccurred()) - }) - }) - - When("provider type is vsphere", func() { - It("allows ipv6", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "ipv6", - "PROVIDER_TYPE": "vsphere", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - - It("allows ipv4,ipv6", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "ipv4,ipv6", - "PROVIDER_TYPE": "vsphere", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - - It("allows ipv6,ipv4", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "ipv6,ipv4", - "PROVIDER_TYPE": "vsphere", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - When("provider type is not vsphere", func() { - It("does not allow ipv6", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "ipv6", - "PROVIDER_TYPE": "aws", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(HaveOccurred()) - }) - - It("does not allow ipv4,ipv6", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "ipv4,ipv6", - "PROVIDER_TYPE": "azure", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(HaveOccurred()) - }) - - It("does not allow ipv6,ipv4", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "ipv6,ipv4", - "PROVIDER_TYPE": "azure", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(HaveOccurred()) - }) - }) - - When("workload cluster is windows on vsphere", func() { - It("does not allow ipv6", func() { - values := createDataValues(map[string]interface{}{ - "IS_WINDOWS_WORKLOAD_CLUSTER": "true", - "TKG_IP_FAMILY": "ipv6", - "PROVIDER_TYPE": "vsphere", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(MatchError(ContainSubstring("IS_WINDOWS_WORKLOAD_CLUSTER is not compatible with TKG_IP_FAMLY values of \"ipv6\", \"ipv4,ipv6\" or \"ipv6,ipv4\""))) - }) - It("allows ipv4", func() { - values := createDataValues(map[string]interface{}{ - "IS_WINDOWS_WORKLOAD_CLUSTER": "true", - "TKG_IP_FAMILY": "ipv4", - "PROVIDER_TYPE": "vsphere", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - It("does not allow ipv4,ipv6", func() { - values := createDataValues(map[string]interface{}{ - "IS_WINDOWS_WORKLOAD_CLUSTER": "true", - "TKG_IP_FAMILY": "ipv4,ipv6", - "PROVIDER_TYPE": "vsphere", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(MatchError(ContainSubstring("IS_WINDOWS_WORKLOAD_CLUSTER is not compatible with TKG_IP_FAMLY values of \"ipv6\", \"ipv4,ipv6\" or \"ipv6,ipv4\""))) - }) - It("does not allow ipv6,ipv4", func() { - values := createDataValues(map[string]interface{}{ - "IS_WINDOWS_WORKLOAD_CLUSTER": "true", - "TKG_IP_FAMILY": "ipv4,ipv6", - "PROVIDER_TYPE": "vsphere", - }) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(MatchError(ContainSubstring("IS_WINDOWS_WORKLOAD_CLUSTER is not compatible with TKG_IP_FAMLY values of \"ipv6\", \"ipv4,ipv6\" or \"ipv6,ipv4\""))) - }) - }) - }) - Describe("antrea_addon_data.lib.yaml", func() { - var paths []string - BeforeEach(func() { - paths = []string{ - filepath.Join("fixtures", "yttmocks"), - filepath.Join("fixtures", "antrea_data_values.yaml"), - filepath.Join("..", "..", "ytt", "02_addons", "cni", "antrea", "antrea_addon_data.lib.yaml"), - filepath.Join("..", "..", "config_default.yaml"), - } - }) - - It("renders antrea yaml with ipv4,ipv6 dual stack settings", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "ipv4,ipv6", - "SERVICE_CIDR": "1.2.3.4/16,fd00::/48", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue("$.data.antrea.config.serviceCIDR", "1.2.3.4/16")) - Expect(output).To(HaveYAMLPathWithValue("$.data.antrea.config.serviceCIDRv6", "fd00::/48")) - }) - - It("renders antrea yaml with ipv6,ipv4 dual stack settings", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "ipv6,ipv4", - "SERVICE_CIDR": "fd00::/48,1.2.3.4/16", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue("$.data.antrea.config.serviceCIDR", "1.2.3.4/16")) - Expect(output).To(HaveYAMLPathWithValue("$.data.antrea.config.serviceCIDRv6", "fd00::/48")) - }) - - It("renders antrea yaml with ipv4 single stack settings", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "ipv4", - "SERVICE_CIDR": "1.2.3.4/16", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue("$.data.antrea.config.serviceCIDR", "1.2.3.4/16")) - Expect(output).NotTo(HaveYAMLPath("$.data.antrea.config.serviceCIDRv6")) - }) - - It("renders antrea yaml with ipv6 single stack settings", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "ipv6", - "SERVICE_CIDR": "fd00::/48", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue("$.data.antrea.config.serviceCIDR", "fd00::/48")) - Expect(output).NotTo(HaveYAMLPath("$.data.antrea.config.serviceCIDRv6")) - }) - - It("renders antrea yaml with ipv4 single stack settings with undefined TKG_IP_FAMILY", func() { - values := createDataValues(map[string]interface{}{ - "SERVICE_CIDR": "1.2.3.4/16", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue("$.data.antrea.config.serviceCIDR", "1.2.3.4/16")) - Expect(output).NotTo(HaveYAMLPath("$.data.antrea.config.serviceCIDRv6")) - }) - - It("renders antrea yaml with ipv4 single stack settings with an empty TKG_IP_FAMILY", func() { - values := createDataValues(map[string]interface{}{ - "TKG_IP_FAMILY": "", - "SERVICE_CIDR": "1.2.3.4/16", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue("$.data.antrea.config.serviceCIDR", "1.2.3.4/16")) - Expect(output).NotTo(HaveYAMLPath("$.data.antrea.config.serviceCIDRv6")) - }) - }) - - Describe("infrastructure-vsphere overlay.yaml", func() { - var paths []string - BeforeEach(func() { - paths = []string{ - filepath.Join("fixtures", "yttmocks"), - filepath.Join("..", "..", "infrastructure-vsphere", capvVersion, "ytt", "overlay.yaml"), - filepath.Join("..", "..", "infrastructure-vsphere", capvVersion, "ytt", "base-template.yaml"), - filepath.Join("..", "..", "config_default.yaml"), - } - }) - - Describe("cluster cidr blocks", func() { - var values string - When("cluster cidr and service cidr have multiple values", func() { - BeforeEach(func() { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "KUBERNETES_RELEASE": "v1.22.11---vmware.1-tkg.1", - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv4,ipv6", - "CLUSTER_CIDR": "100.96.0.0/11,fd00:100:96::/48", - "SERVICE_CIDR": "100.64.0.0/18,fd00:100:64::/108", - }) - }) - - It("renders the cluster with the pod and service cidrs with dual stack settings", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - clusterDoc, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Cluster", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(clusterDoc).To(HaveLen(1)) - Expect(clusterDoc[0]).To(HaveYAMLPathWithValue("$.spec.clusterNetwork.pods.cidrBlocks[0]", "100.96.0.0/11")) - Expect(clusterDoc[0]).To(HaveYAMLPathWithValue("$.spec.clusterNetwork.pods.cidrBlocks[1]", "fd00:100:96::/48")) - Expect(clusterDoc[0]).To(HaveYAMLPathWithValue("$.spec.clusterNetwork.services.cidrBlocks[0]", "100.64.0.0/18")) - Expect(clusterDoc[0]).To(HaveYAMLPathWithValue("$.spec.clusterNetwork.services.cidrBlocks[1]", "fd00:100:64::/108")) - }) - }) - When("cluster cidr and service cidr have a single value", func() { - BeforeEach(func() { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "KUBERNETES_RELEASE": "v1.22.11---vmware.1-tkg.1", - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv4", - "CLUSTER_CIDR": "100.96.0.0/11", - "SERVICE_CIDR": "100.64.0.0/18", - }) - }) - - It("renders the cluster with the pod and service cidrs with single stack settings", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - clusterDoc, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "Cluster", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(clusterDoc).To(HaveLen(1)) - Expect(clusterDoc[0]).To(HaveYAMLPathWithValue("$.spec.clusterNetwork.pods.cidrBlocks[0]", "100.96.0.0/11")) - Expect(clusterDoc[0]).NotTo(HaveYAMLPath("$.spec.clusterNetwork.pods.cidrBlocks[1]")) - Expect(clusterDoc[0]).To(HaveYAMLPathWithValue("$.spec.clusterNetwork.services.cidrBlocks[0]", "100.64.0.0/18")) - Expect(clusterDoc[0]).NotTo(HaveYAMLPath("$.spec.clusterNetwork.services.cidrBlocks[1]")) - }) - }) - }) - - Describe("vsphere machine templates", func() { - var values string - When("data values are set to single stack IPv4 settings", func() { - BeforeEach(func() { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "KUBERNETES_RELEASE": "v1.22.11---vmware.1-tkg.1", - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv4", - "CLUSTER_CIDR": "100.96.0.0/11", - "SERVICE_CIDR": "100.64.0.0/18", - "CLUSTER_API_SERVER_PORT": "443", - }) - }) - It("renders control plane and worker templates each with an ipv4 single stack network device", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplateDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(vsphereMachineTemplateDocs).To(HaveLen(2)) - for _, machineDoc := range vsphereMachineTemplateDocs { - Expect(machineDoc).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].dhcp4", "true")) - Expect(machineDoc).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].networkName", "VM Network")) - Expect(machineDoc).NotTo(HaveYAMLPath("$.spec.template.spec.network.devices[0].dhcp6")) - Expect(machineDoc).NotTo(HaveYAMLPath("$.spec.template.spec.network.devices[1]")) - } - }) - It("renders control plane template to bind the local apiServer endpoint to '0.0.0.0' as the node IP and port to custom api server port configured", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.initConfiguration.localAPIEndpoint.advertiseAddress", "0.0.0.0")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.initConfiguration.localAPIEndpoint.bindPort", "443")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.joinConfiguration.controlPlane.localAPIEndpoint.advertiseAddress", "0.0.0.0")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.joinConfiguration.controlPlane.localAPIEndpoint.bindPort", "443")) - }) - It("does not configure node ip in KUBELET_EXTRA_ARGS in /etc/sysconfig/kubelet", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.files[1]")) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.preKubeadmCommands[6]")) - }) - }) - - When("data values are set to single stack IPv6 settings", func() { - BeforeEach(func() { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "KUBERNETES_RELEASE": "v1.22.11---vmware.1-tkg.1", - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv6", - "CLUSTER_CIDR": "fd00:100:96::/48", - "SERVICE_CIDR": "fd00:100:64::/108", - "CLUSTER_API_SERVER_PORT": "443", - }) - }) - It("renders control plane and worker templates each with an ipv6 single stack network device", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplateDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(vsphereMachineTemplateDocs).To(HaveLen(2)) - for _, machineDoc := range vsphereMachineTemplateDocs { - Expect(machineDoc).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].dhcp6", "true")) - Expect(machineDoc).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].networkName", "VM Network")) - Expect(machineDoc).NotTo(HaveYAMLPath("$.spec.template.spec.network.devices[0].dhcp4")) - Expect(machineDoc).NotTo(HaveYAMLPath("$.spec.template.spec.network.devices[1]")) - } - }) - It("renders control plane template to bind the local apiServer endpoint to '::/0' as the node IP and port to custom api server port configured", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.initConfiguration.localAPIEndpoint.advertiseAddress", "::/0")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.initConfiguration.localAPIEndpoint.bindPort", "443")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.joinConfiguration.controlPlane.localAPIEndpoint.advertiseAddress", "::/0")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.joinConfiguration.controlPlane.localAPIEndpoint.bindPort", "443")) - }) - DescribeTable("configures node-ip on the control plane nodes by echoing the detected node ip into KUBELET_EXTRA_ARGS in /etc/sysconfig/kubelet when the tkr is >= 1.22.8", func(kubernetesRelease string) { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "KUBERNETES_RELEASE": kubernetesRelease, - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv6", - "CLUSTER_CIDR": "fd00:100:96::/48", - "SERVICE_CIDR": "fd00:100:64::/108", - "CLUSTER_API_SERVER_PORT": "443", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.files[1].content", "")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.files[1].owner", "root:root")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.files[1].path", "/etc/sysconfig/kubelet")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.files[1].permissions", "0640")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.preKubeadmCommands[6]", "echo \"$(ip -6 -json addr show dev eth0 scope global | jq -r .[0].addr_info[0].local) $(hostname)\" >> /etc/hosts")) - }, - Entry("when the tkr is 1.22.8", "v1.22.8---vmware.1-tkg.1"), - Entry("when the tkr is 1.22.11", "v1.22.11---vmware.1-tkg.1"), - Entry("when the tkr is 1.22.12", "v1.22.12---vmware.1-tkg.1"), - Entry("when the tkr is 1.22.40", "v1.22.40---vmware.1-tkg.1"), - Entry("when the tkr is 1.23.7", "v1.23.7---vmware.1-tkg.1"), - Entry("when the tkr is 1.23.10", "v1.23.10---vmware.1-tkg.1"), - ) - DescribeTable("does not configure node-ip on the control plane into KUBELET_EXTRA_ARGS in /etc/sysconfig/kubelet when the tkr is < 1.22.8", func(kubernetesRelease string) { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "KUBERNETES_RELEASE": kubernetesRelease, - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv6", - "CLUSTER_CIDR": "fd00:100:96::/48", - "SERVICE_CIDR": "fd00:100:64::/108", - "CLUSTER_API_SERVER_PORT": "443", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.files[1]")) - Expect(kubeadmControlPlaneDocs[0]).NotTo(ContainSubstring("echo \"$(ip -6 -json addr show dev eth0 scope global | jq -r .[0].addr_info[0].local) $(hostname)\" >> /etc/hosts")) - }, - Entry("when the tkr is 1.22.7", "v1.22.7---vmware.1-tkg.1"), - Entry("when the tkr is 1.21.20", "v1.21.20---vmware.1-tkg.1"), - Entry("when the tkr is 1.21.8", "v1.21.8---vmware.1-tkg.1"), - Entry("when the tkr is 1.20.15", "v1.20.15---vmware.1-tkg.1"), - Entry("when the tkr is 1.20.3", "v1.20.3---vmware.1-tkg.1"), - Entry("when the tkr is 1.6.0", "v1.6.0---vmware.1-tkg.1"), - ) - }) - - When("data values are set to ipv4,ipv6 dual stack settings", func() { - BeforeEach(func() { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "KUBERNETES_RELEASE": "v1.22.11---vmware.1-tkg.1", - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv4,ipv6", - "CLUSTER_CIDR": "100.96.0.0/11,fd00:100:96::/48", - "SERVICE_CIDR": "100.64.0.0/18,fd00:100:64::/108", - "CLUSTER_API_SERVER_PORT": "443", - }) - }) - It("renders control plane and worker templates each with a dual stack network device", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplateDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(vsphereMachineTemplateDocs).To(HaveLen(2)) - for _, machineDoc := range vsphereMachineTemplateDocs { - Expect(machineDoc).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].dhcp4", "true")) - Expect(machineDoc).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].dhcp6", "true")) - Expect(machineDoc).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].networkName", "VM Network")) - Expect(machineDoc).NotTo(HaveYAMLPath("$.spec.template.spec.network.devices[1]")) - } - }) - It("renders control plane template to bind the local apiServer endpoint to '0.0.0.0' as the node IP and port to custom api server port configured", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.initConfiguration.localAPIEndpoint.advertiseAddress", "0.0.0.0")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.initConfiguration.localAPIEndpoint.bindPort", "443")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.joinConfiguration.controlPlane.localAPIEndpoint.advertiseAddress", "0.0.0.0")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.joinConfiguration.controlPlane.localAPIEndpoint.bindPort", "443")) - }) - It("does not render bind-address field", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.clusterConfiguration.apiServer.extraArgs.bind-address")) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.clusterConfiguration.controllerManager.extraArgs.bind-address")) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.clusterConfiguration.scheduler.extraArgs.bind-address")) - }) - It("does not render advertise-address field", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.clusterConfiguration.apiServer.extraArgs.advertise-address")) - }) - It("does not render node-ip field", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.initConfiguration.nodeRegistration.kubeletExtraArgs.node-ip")) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.joinConfiguration.nodeRegistration.kubeletExtraArgs.node-ip")) - - kubeadmConfigTemplateDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmConfigTemplate", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmConfigTemplateDocs).To(HaveLen(1)) - Expect(kubeadmConfigTemplateDocs[0]).NotTo(HaveYAMLPath("$.spec.template.spec.joinConfiguration.nodeRegistration.kubeletExtraArgs.node-ip")) - }) - It("does not configure node ip in KUBELET_EXTRA_ARGS in /etc/sysconfig/kubelet", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.files[1]")) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.preKubeadmCommands[6]")) - }) - }) - - When("data values are set to ipv6,ipv4 dual stack settings", func() { - BeforeEach(func() { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "KUBERNETES_RELEASE": "v1.22.11---vmware.1-tkg.1", - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv6,ipv4", - "CLUSTER_CIDR": "fd00:100:96::/48,100.96.0.0/11", - "SERVICE_CIDR": "fd00:100:64::/108,100.64.0.0/18", - "VSPHERE_CONTROL_PLANE_ENDPOINT": "2001:db8::2", - "CLUSTER_API_SERVER_PORT": "443", - }) - }) - It("renders a control plane and worker template each with a dual stack network device", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplateDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(vsphereMachineTemplateDocs).To(HaveLen(2)) - for _, machineDoc := range vsphereMachineTemplateDocs { - Expect(machineDoc).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].dhcp4", "true")) - Expect(machineDoc).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].dhcp6", "true")) - Expect(machineDoc).To(HaveYAMLPathWithValue("$.spec.template.spec.network.devices[0].networkName", "VM Network")) - Expect(machineDoc).NotTo(HaveYAMLPath("$.spec.template.spec.network.devices[1]")) - } - }) - It("renders control plane template to bind the apiServer, controllerManager, and scheduler to all ipv6 interfaces", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.clusterConfiguration.apiServer.extraArgs.bind-address", "::")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.clusterConfiguration.controllerManager.extraArgs.bind-address", "::")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.clusterConfiguration.scheduler.extraArgs.bind-address", "::")) - }) - It("renders control plane template to bind the local apiServer endpoint to '::/0' as the node IP and port to custom api server port configured", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.initConfiguration.localAPIEndpoint.advertiseAddress", "::/0")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.initConfiguration.localAPIEndpoint.bindPort", "443")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.joinConfiguration.controlPlane.localAPIEndpoint.advertiseAddress", "::/0")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.joinConfiguration.controlPlane.localAPIEndpoint.bindPort", "443")) - }) - It("renders control plane template to advertise control plane endpoint on the apiServer", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.clusterConfiguration.apiServer.extraArgs.advertise-address", "2001:db8::2")) - }) - It("does not render node-ip field for control plane nodes", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.initConfiguration.nodeRegistration.kubeletExtraArgs.node-ip")) - Expect(kubeadmControlPlaneDocs[0]).NotTo(HaveYAMLPath("$.spec.kubeadmConfigSpec.joinConfiguration.nodeRegistration.kubeletExtraArgs.node-ip")) - }) - It("configures kubelet on the worker nodes with '::' as the node IP", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmConfigTemplateDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmConfigTemplate", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmConfigTemplateDocs).To(HaveLen(1)) - Expect(kubeadmConfigTemplateDocs[0]).To(HaveYAMLPathWithValue("$.spec.template.spec.joinConfiguration.nodeRegistration.kubeletExtraArgs.node-ip", "::")) - }) - It("configures node-ip on the control plane nodes by echoing the detected node ip into KUBELET_EXTRA_ARGS in /etc/sysconfig/kubelet", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.files[1].content", "")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.files[1].owner", "root:root")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.files[1].path", "/etc/sysconfig/kubelet")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.files[1].permissions", "0640")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.preKubeadmCommands[6]", "echo \"$(ip -6 -json addr show dev eth0 scope global | jq -r .[0].addr_info[0].local) $(hostname)\" >> /etc/hosts")) - }) - }) - }) - - }) - Describe("infrastructure-vsphere windows overlay.yaml", func() { - var paths []string - BeforeEach(func() { - paths = []string{ - filepath.Join("fixtures", "yttmocks"), - filepath.Join("..", "..", "infrastructure-vsphere", capvVersion, "ytt", "overlay-windows.yaml"), - filepath.Join("..", "..", "infrastructure-vsphere", capvVersion, "ytt", "base-template.yaml"), - filepath.Join("..", "..", "config_default.yaml"), - } - }) - - Describe("cluster api server port configuration", func() { - var values string - When("ip family is configured to ipv4", func() { - BeforeEach(func() { - values = createDataValues(map[string]interface{}{ - "CLUSTER_NAME": "foo", - "TKG_CLUSTER_ROLE": "workload", - "TKG_IP_FAMILY": "ipv4", - "CLUSTER_CIDR": "10.0.0.0/16", - "SERVICE_CIDR": "10.0.0.0/18", - "CLUSTER_API_SERVER_PORT": "443", - "IS_WINDOWS_WORKLOAD_CLUSTER": "true", - }) - }) - - It("renders control plane template to bind the local apiServer endpoint to '0.0.0.0' as the node IP and port to custom api server port configured", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - kubeadmControlPlaneDocs, err := FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "KubeadmControlPlane", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(kubeadmControlPlaneDocs).To(HaveLen(1)) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.initConfiguration.localAPIEndpoint.advertiseAddress", "0.0.0.0")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.initConfiguration.localAPIEndpoint.bindPort", "443")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.joinConfiguration.controlPlane.localAPIEndpoint.advertiseAddress", "0.0.0.0")) - Expect(kubeadmControlPlaneDocs[0]).To(HaveYAMLPathWithValue("$.spec.kubeadmConfigSpec.joinConfiguration.controlPlane.localAPIEndpoint.bindPort", "443")) - }) - }) - }) - }) - - Describe("vsphere cpi", func() { - var paths []string - Describe("vsphere cpi data values", func() { - var ipFamilyPath = "$.data.vsphereCPI.ipFamily" - BeforeEach(func() { - paths = []string{ - filepath.Join("fixtures", "yttmocks"), - filepath.Join("fixtures", "vsphere_cpi_ip_family.yaml"), - filepath.Join("..", "..", "ytt", "02_addons", "cpi", "cpi_addon_data.lib.yaml"), - filepath.Join("..", "..", "config_default.yaml"), - } - }) - When("TKG_IP_FAMILY is unset", func() { - It("does not configure the CPI ip family", func() { - values := createDataValues(map[string]interface{}{ - "PROVIDER_TYPE": "vsphere", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).NotTo(HaveYAMLPath(ipFamilyPath)) - }) - }) - When("TKG_IP_FAMILY is ipv4", func() { - It("configure the CPI for ipv4 only", func() { - values := createDataValues(map[string]interface{}{ - "PROVIDER_TYPE": "vsphere", - "TKG_IP_FAMILY": "ipv4", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue(ipFamilyPath, "ipv4")) - }) - }) - When("TKG_IP_FAMILY is ipv6", func() { - It("configure the CPI for ipv6 only", func() { - values := createDataValues(map[string]interface{}{ - "PROVIDER_TYPE": "vsphere", - "TKG_IP_FAMILY": "ipv6", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue(ipFamilyPath, "ipv6")) - }) - }) - When("TKG_IP_FAMILY is ipv4,ipv6", func() { - It("configure the CPI for ipv4 and ipv6", func() { - values := createDataValues(map[string]interface{}{ - "PROVIDER_TYPE": "vsphere", - "TKG_IP_FAMILY": "ipv4,ipv6", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue(ipFamilyPath, "ipv4,ipv6")) - }) - }) - When("TKG_IP_FAMILY is ipv6,ipv4", func() { - It("configure the CPI for ipv6 and ipv4", func() { - values := createDataValues(map[string]interface{}{ - "PROVIDER_TYPE": "vsphere", - "TKG_IP_FAMILY": "ipv6,ipv4", - }) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue(ipFamilyPath, "ipv6,ipv4")) - }) - }) - Context("exclude the vsphere control plane endpoint from node ip selection", func() { - var excludeInternalNetworkSubnetCidr = "$.data.vsphereCPI.vmExcludeInternalNetworkSubnetCidr" - var excludeExternalNetworkSubnetCidr = "$.data.vsphereCPI.vmExcludeExternalNetworkSubnetCidr" - When("VSPHERE_CONTROL_PLANE_ENDPOINT is ipv4", func() { - It("excludes it as a CIDR from both external and internal node ip selection", func() { - values := createDataValues(map[string]interface{}{ - "PROVIDER_TYPE": "vsphere", - "TKG_IP_FAMILY": "ipv4", - "VSPHERE_CONTROL_PLANE_ENDPOINT": "192.168.0.1", - }) - - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue(excludeInternalNetworkSubnetCidr, "192.168.0.1/32")) - Expect(output).To(HaveYAMLPathWithValue(excludeExternalNetworkSubnetCidr, "192.168.0.1/32")) - }) - }) - When("VSPHERE_CONTROL_PLANE_ENDPOINT is ipv6", func() { - It("excludes it as a CIDR from both external and internal node ip selection", func() { - values := createDataValues(map[string]interface{}{ - "PROVIDER_TYPE": "vsphere", - "TKG_IP_FAMILY": "ipv6", - "VSPHERE_CONTROL_PLANE_ENDPOINT": "fd00:100:64::1", - }) - - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue(excludeInternalNetworkSubnetCidr, "fd00:100:64::1/128")) - Expect(output).To(HaveYAMLPathWithValue(excludeExternalNetworkSubnetCidr, "fd00:100:64::1/128")) - }) - }) - When("VSPHERE_CONTROL_PLANE_ENDPOINT is a hostname", func() { - It("excludes no ips from internal and external node ip selection", func() { - values := createDataValues(map[string]interface{}{ - "PROVIDER_TYPE": "vsphere", - "TKG_IP_FAMILY": "ipv6", - "VSPHERE_CONTROL_PLANE_ENDPOINT": "cluster.local", - }) - - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - - Expect(output).To(HaveYAMLPathWithValue(excludeInternalNetworkSubnetCidr, "")) - Expect(output).To(HaveYAMLPathWithValue(excludeExternalNetworkSubnetCidr, "")) - }) - }) - }) - }) - }) -}) - -func createDataValues(values map[string]interface{}) string { - dataValues := "#@data/values\n---\n" - bytes, err := yaml.Marshal(values) - if err != nil { - return "" - } - valuesStr := string(bytes) - valuesStr = strings.ReplaceAll(valuesStr, "\"true\"", "true") - valuesStr = strings.ReplaceAll(valuesStr, "\"false\"", "false") - return dataValues + valuesStr -} diff --git a/providers/tests/unit/pci_passthrough_test.go b/providers/tests/unit/pci_passthrough_test.go deleted file mode 100644 index 89f5a75282..0000000000 --- a/providers/tests/unit/pci_passthrough_test.go +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "fmt" - "path/filepath" - - "github.com/vmware-tanzu/tanzu-framework/test/pkg/matchers" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -var _ = Describe("PCI Passthrough", func() { - var paths []string - var baseVal yttValues - - BeforeEach(func() { - paths = []string{ - filepath.Join(yamlRoot, "config_default.yaml"), - filepath.Join(yamlRoot, "infrastructure-vsphere", capvVersion, "ytt", "overlay.yaml"), - filepath.Join(yamlRoot, "infrastructure-vsphere", capvVersion, "ytt", "base-template.yaml"), - filepath.Join("./fixtures/tkr-bom-v1.21.1.yaml"), - filepath.Join("./fixtures/tkg-bom-v1.4.0.yaml"), - filepath.Join(yamlRoot, "ytt"), - } - - baseVal = map[string]interface{}{ - // required fields - "TKG_DEFAULT_BOM": "tkg-bom-v1.4.0.yaml", - "KUBERNETES_RELEASE": "v1.21.2---vmware.1-tkg.1", - "CLUSTER_NAME": "test-cluster", - - // required fields for CAPV - "PROVIDER_TYPE": "vsphere", - "TKG_CLUSTER_ROLE": "management", - "TKG_IP_FAMILY": "ipv4", - "SERVICE_CIDR": "5.5.5.5/16", - - // required vsphere configurations - "VSPHERE_USERNAME": "user_blah", - "VSPHERE_PASSWORD": "pass_1234", - "VSPHERE_SERVER": "vmware-tanzu.com", - "VSPHERE_DATACENTER": "vmware-tanzu-dc.com", - "VSPHERE_RESOURCE_POOL": "myrp", - "VSPHERE_FOLDER": "ds0", - "VSPHERE_SSH_AUTHORIZED_KEY": "ssh-rsa AAAA...+M7Q== vmware-tanzu.local", - "VSPHERE_INSECURE": "true", - "CLUSTER_CIDR": "192.168.1.0/16", - } - }) - - When("VSPHERE_WORKER_PCI_DEVICES and VSPHERE_CONTROL_PLANE_PCI_DEVICES are set", func() { - var value yttValues - BeforeEach(func() { - value = baseVal.DeepCopy() - }) - - It("throws error when the input format is invalid", func() { - invalidValues := []string{"a:b;c;d", "sometext", "1001:1001,2000:2001;400:300"} - - for _, invalidValueTestCase := range invalidValues { - value.Set("VSPHERE_WORKER_PCI_DEVICES", invalidValueTestCase) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).To(HaveOccurred()) - } - }) - - It("throws error when the vendor devices are invalid", func() { - value.Set("VSPHERE_WORKER_PCI_DEVICES", "a:b") - value.Set("VSPHERE CONTROL_PLANE_PCI_DEVICES", "c:d") - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).To(HaveOccurred()) - }) - - It("throws error when the vendor is NVidia but an invalid device", func() { - value.Set("VSPHERE_WORKER_PCI_DEVICES", "0x10DE:0x1EC8") - value.Set("VSPHERE CONTROL_PLANE_PCI_DEVICES", "c:d") - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).To(HaveOccurred()) - }) - - It("succeeds when the vendor devices are valid", func() { - value.Set("VSPHERE_WORKER_PCI_DEVICES", "0x10DE:0x1EB8") - value.Set("VSPHERE_CONTROL_PLANE_PCI_DEVICES", "0x10de:0x1eb8") - - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - - clusterTypes := []string{"worker", "control-plane"} - for _, clusterType := range clusterTypes { - vsphereMachineTemplates, err := matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": fmt.Sprintf("test-cluster-%s", clusterType), - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(len(vsphereMachineTemplates)).NotTo(Equal(0)) - - for _, vsphereMachineTemplate := range vsphereMachineTemplates { - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.pciDevices[0].vendorId", "4318")) - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.pciDevices[0].deviceId", "7864")) - } - } - }) - - When("VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST is true", func() { - It("succeeds even when the vendor devices are not valid", func() { - value.Set("VSPHERE_WORKER_PCI_DEVICES", "0xa:0xb,0xc:0xd") - value.Set("VSPHERE_CONTROL_PLANE_PCI_DEVICES", "0xe:0xf,0xa:0xb") - value.Set("VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST", true) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplates, err := matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "test-cluster-worker", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(len(vsphereMachineTemplates)).NotTo(Equal(0)) - - for _, vsphereMachineTemplate := range vsphereMachineTemplates { - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.pciDevices[0].vendorId", "10")) - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.pciDevices[0].deviceId", "11")) - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.pciDevices[1].vendorId", "12")) - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.pciDevices[1].deviceId", "13")) - } - - vsphereMachineTemplates, err = matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "test-cluster-control-plane", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(len(vsphereMachineTemplates)).NotTo(Equal(0)) - - for _, vsphereMachineTemplate := range vsphereMachineTemplates { - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.pciDevices[0].vendorId", "14")) - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.pciDevices[0].deviceId", "15")) - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.pciDevices[1].vendorId", "10")) - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.pciDevices[1].deviceId", "11")) - } - }) - }) - - }) - - When("WORKER_ROLLOUT_STRATEGY is set", func() { - var value yttValues - BeforeEach(func() { - value = baseVal.DeepCopy() - }) - - It("should return validation error if the input is invalid", func() { - value.Set("WORKER_ROLLOUT_STRATEGY", "somerandomvalue") - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).To(HaveOccurred()) - }) - - It("should set MachineDeployment strategy type to correct value", func() { - validValues := []string{"OnDelete", "RollingUpdate"} - for _, validValue := range validValues { - value.Set("WORKER_ROLLOUT_STRATEGY", validValue) - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - - machineDeploymentTemplates, err := matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "MachineDeployment", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(len(machineDeploymentTemplates)).NotTo(Equal(0)) - - for _, machineDeploymentTemplate := range machineDeploymentTemplates { - Expect(machineDeploymentTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.strategy.type", validValue)) - } - } - }) - }) - - When("WORKER_ROLLOUT_STRATEGY is not set", func() { - var value yttValues - BeforeEach(func() { - value = baseVal.DeepCopy() - }) - - It("defaults to rolling update", func() { - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - - machineDeploymentTemplates, err := matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "MachineDeployment", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(len(machineDeploymentTemplates)).NotTo(Equal(0)) - - for _, machineDeploymentTemplate := range machineDeploymentTemplates { - Expect(machineDeploymentTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.strategy.type", "RollingUpdate")) - } - }) - }) - - When("VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS and VSPHERE_WORKER_CUSTOM_VMX_KEYS are set", func() { - var value yttValues - BeforeEach(func() { - value = baseVal.DeepCopy() - }) - - It("Should throw error if the VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS is not in correct format", func() { - value.Set("VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS", "a,b,c") - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).To(HaveOccurred()) - }) - - It("Should throw error if the VSPHERE_WORKER_CUSTOM_VMX_KEYS is not in correct format", func() { - value.Set("VSPHERE_WORKER_CUSTOM_VMX_KEYS", "a,b,c") - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).To(HaveOccurred()) - }) - - It("Should populate CustomVMXKeys if inputs are valid", func() { - value.Set("VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS", "a=b,c=d") - value.Set("VSPHERE_WORKER_CUSTOM_VMX_KEYS", "e=f,g=h") - - output, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, value.toReader()) - Expect(err).NotTo(HaveOccurred()) - - vsphereMachineTemplates, err := matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "test-cluster-worker", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(len(vsphereMachineTemplates)).NotTo(Equal(0)) - - for _, vsphereMachineTemplate := range vsphereMachineTemplates { - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.customVMXKeys.e", "f")) - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.customVMXKeys.g", "h")) - } - - vsphereMachineTemplates, err = matchers.FindDocsMatchingYAMLPath(output, map[string]string{ - "$.kind": "VSphereMachineTemplate", - "$.metadata.name": "test-cluster-control-plane", - }) - - Expect(err).NotTo(HaveOccurred()) - Expect(len(vsphereMachineTemplates)).NotTo(Equal(0)) - - for _, vsphereMachineTemplate := range vsphereMachineTemplates { - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.customVMXKeys.a", "b")) - Expect(vsphereMachineTemplate).To(matchers.HaveYAMLPathWithValue("$.spec.template.spec.customVMXKeys.c", "d")) - } - }) - }) -}) diff --git a/providers/tests/unit/pod_security_standard_test.go b/providers/tests/unit/pod_security_standard_test.go deleted file mode 100644 index a29dc5b0a6..0000000000 --- a/providers/tests/unit/pod_security_standard_test.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -var _ = Describe("POD_SECURITY_STANDARD Ytt Templating", func() { - Describe("Pod Security Standard ytt validations", func() { - var paths []string - var baseVal yttValues - BeforeEach(func() { - paths = []string{ - // Map item (key 'infraProvider') on line stdin.yml:8: - filepath.Join(yamlRoot, "config_default.yaml"), - "./fixtures/tkr-bom-v1.21.1.yaml", - "./fixtures/tkg-bom-v1.4.0.yaml", - filepath.Join(yamlRoot, "infrastructure-vsphere", capvVersion, "ytt", "base-template.yaml"), - filepath.Join(yamlRoot, "infrastructure-vsphere", capvVersion, "ytt", "overlay-windows.yaml"), - filepath.Join(yamlRoot, "ytt"), // lib/helpers.star, lib/config_variable_association.star, lib/validate.star - - filepath.Join(yamlRoot, "ytt", "03_customizations", "pod_security_standard"), - } - - baseVal = map[string]interface{}{ - "VSPHERE_INSECURE": "true", - "PROVIDER_TYPE": "vsphere", - "IS_WINDOWS_WORKLOAD_CLUSTER": "true", - "TKG_CLUSTER_ROLE": "management", - "VSPHERE_USERNAME": "user_blah", - "VSPHERE_PASSWORD": "pass_1234", - "VSPHERE_SERVER": "vmware-tanzu.com", - "VSPHERE_DATACENTER": "vmware-tanzu-dc.com", - "VSPHERE_RESOURCE_POOL": "myrp", - "VSPHERE_FOLDER": "ds0", - "VSPHERE_SSH_AUTHORIZED_KEY": "ssh-rsa AAAA...+M7Q== vmware-tanzu.local", - "TKG_DEFAULT_BOM": "tkg-bom-v1.4.0.yaml", - "KUBERNETES_RELEASE": "v1.21.2---vmware.1-tkg.1", - "CORE_DNS_IP": "10.64.0.10", - "CLUSTER_CIDR": "192.168.1.0/16", - } - }) - - When("Configuring POD_SECURITY_STANDARD_DEACTIVATED", func() { - It("allows undefined", func() { - baseVal["POD_SECURITY_STANDARD_DEACTIVATED"] = "" - values := createDataValues(baseVal) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - - It("does not allow garbage", func() { - baseVal["POD_SECURITY_STANDARD_DEACTIVATED"] = "garbage" - values := createDataValues(baseVal) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(HaveOccurred()) - }) - - It("does allow true", func() { - baseVal["POD_SECURITY_STANDARD_DEACTIVATED"] = "true" - values := createDataValues(baseVal) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - - It("does allow false", func() { - baseVal["POD_SECURITY_STANDARD_DEACTIVATED"] = "false" - values := createDataValues(baseVal) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - When("Configuring POD_SECURITY_STANDARD_* to different values", func() { - It("does allow baseline", func() { - baseline := "baseline" - baseVal["POD_SECURITY_STANDARD_WARN"] = baseline - baseVal["POD_SECURITY_STANDARD_AUDIT"] = baseline - baseVal["POD_SECURITY_STANDARD_ENFORCE"] = baseline - values := createDataValues(baseVal) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - It("does allow restricted", func() { - restricted := "restricted" - baseVal["POD_SECURITY_STANDARD_WARN"] = restricted - baseVal["POD_SECURITY_STANDARD_AUDIT"] = restricted - baseVal["POD_SECURITY_STANDARD_ENFORCE"] = restricted - values := createDataValues(baseVal) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - It("does allow privileged", func() { - privileged := "privileged" - baseVal["POD_SECURITY_STANDARD_WARN"] = privileged - baseVal["POD_SECURITY_STANDARD_AUDIT"] = privileged - baseVal["POD_SECURITY_STANDARD_ENFORCE"] = privileged - values := createDataValues(baseVal) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred()) - }) - It("does not allow to misconfigure POD_SECURITY_STANDARD_WARN", func() { - baseVal["POD_SECURITY_STANDARD_WARN"] = "this" - values := createDataValues(baseVal) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(HaveOccurred()) - }) - It("does not allow to misconfigure POD_SECURITY_STANDARD_AUDIT", func() { - baseVal["POD_SECURITY_STANDARD_AUDIT"] = "is" - values := createDataValues(baseVal) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(HaveOccurred()) - }) - It("does not allow to misconfigure POD_SECURITY_STANDARD_ENFORCE", func() { - baseVal["POD_SECURITY_STANDARD_ENFORCE"] = "misconfigured" - values := createDataValues(baseVal) - _, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).To(HaveOccurred()) - }) - }) - - }) -}) diff --git a/providers/tests/unit/unit_suite_test.go b/providers/tests/unit/unit_suite_test.go deleted file mode 100644 index 481bd826b2..0000000000 --- a/providers/tests/unit/unit_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestUnit(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Ytt Rendering Unit Test Suite") -} diff --git a/providers/tests/unit/windows_test.go b/providers/tests/unit/windows_test.go deleted file mode 100644 index df6ca5ef7e..0000000000 --- a/providers/tests/unit/windows_test.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package unit - -import ( - "fmt" - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - utilyaml "sigs.k8s.io/cluster-api/util/yaml" - - "github.com/vmware-tanzu/tanzu-framework/test/pkg/ytt" -) - -var _ = Describe("Windows Ytt Templating", func() { - var paths []string - BeforeEach(func() { - paths = []string{ - // Map item (key 'infraProvider') on line stdin.yml:8: - filepath.Join(yamlRoot, "config_default.yaml"), - filepath.Join("./fixtures/tkr-bom-v1.21.1.yaml"), - filepath.Join("./fixtures/tkg-bom-v1.4.0.yaml"), - filepath.Join(yamlRoot, "infrastructure-vsphere", capvVersion, "ytt", "base-template.yaml"), - filepath.Join(yamlRoot, "infrastructure-vsphere", capvVersion, "ytt", "overlay-windows.yaml"), - filepath.Join(yamlRoot, "ytt", "02_addons", "cni", "antrea", "antrea_addon_data.lib.yaml"), - filepath.Join(yamlRoot, "ytt", "02_addons", "cpi", "cpi_addon_data.lib.yaml"), - filepath.Join(yamlRoot, "ytt", "03_customizations", "02_avi", "ako-deployment.lib.yaml"), - //filepath.Join(YAML_ROOT, "provider-bundle", "providers", "ytt", "02_addons", "cpi", "cpi_addon_data.lib.yaml"), - filepath.Join(yamlRoot, "ytt", "03_customizations", "03_windows"), - filepath.Join(yamlRoot, "ytt"), // lib/helpers.star, lib/config_variable_association.star, lib/validate.star - } - }) - It("Has a windows overlay", func() { - values := createDataValues(map[string]interface{}{ - "VSPHERE_INSECURE": "true", - "PROVIDER_TYPE": "vsphere", - "IS_WINDOWS_WORKLOAD_CLUSTER": "true", - "TKG_CLUSTER_ROLE": "management", - "VSPHERE_USERNAME": "user_blah", - "VSPHERE_PASSWORD": "pass_1234", - "VSPHERE_SERVER": "vmware-tanzu.com", - "VSPHERE_DATACENTER": "vmware-tanzu-dc.com", - "VSPHERE_RESOURCE_POOL": "myrp", - "VSPHERE_FOLDER": "ds0", - "VSPHERE_SSH_AUTHORIZED_KEY": "ssh-rsa AAAA...+M7Q== vmware-tanzu.local", - "TKG_DEFAULT_BOM": "tkg-bom-v1.4.0.yaml", - "KUBERNETES_RELEASE": "v1.21.2---vmware.1-tkg.1", - "CORE_DNS_IP": "10.64.0.10", - "CLUSTER_CIDR": "192.168.1.0/16", - }) - - // useful debugging information that we don't actually need for day-to-day testing - rawClusterAPIYaml, err := ytt.RenderYTTTemplate(ytt.CommandOptions{}, paths, strings.NewReader(values)) - Expect(err).NotTo(HaveOccurred(), values) - - // Test 1: Making sure that we have a few basic ClusterAPI objects in the windows templates... - - // clusterAPIComponents is a list of all the 'kind' objects that we want to see. - // for windows, the most important thing to confirm is that we have 2 VsphereMachineTemplates, - // since there are obviously going to be linux as well as windows machine types. - clusterAPIComponents := map[string]int{ - "Cluster": 1, - "VSphereCluster": 1, - "VSphereMachineTemplate": 2, - } - seen, err := countCapiCompKinds(rawClusterAPIYaml) - Expect(err).NotTo(HaveOccurred()) - for k, v := range clusterAPIComponents { - val, ok := seen[k] - Expect(ok).To(BeTrue()) - Expect(val).To(Equal(v), fmt.Sprintf("Of type %s", k)) - } - - // TODO add more validations for things like the antrea installation contents etc... - }) -}) - -// countCapiCompKinds counts up the number of different api types in the final YAML output -func countCapiCompKinds(rawClusterAPIYaml string) (map[string]int, error) { - kinds := make(map[string]int) - - objs, err := utilyaml.ToUnstructured([]byte(rawClusterAPIYaml)) - if err != nil { - return nil, err - } - - for _, obj := range objs { - kinds[obj.GetKind()] = kinds[obj.GetKind()] + 1 - } - - return kinds, nil -} - -/** -Adopted from this hacky string... -/usr/local/bin/ytt ---ignore-unknown-comments ---data-value=infraProvider=vsphere ---data-value=TKG_CLUSTER_ROLE=management ---data-value=IS_WINDOWS_WORKLOAD_CLUSTER=true ---data-value=VSPHERE_USERNAME=a ---data-value=VSPHERE_PASSWORD=a ---data-value=VSPHERE_SERVER=a ---data-value=VSPHERE_DATACENTER=a ---data-value=VSPHERE_RESOURCE_POOL=a ---data-value=VSPHERE_FOLDER=a, ---data-value=VSPHERE_SSH_AUTHORIZED_KEY="a" --f tkr-bom-v1.21.1.yaml --f tkg-bom-v1.4.0.yaml --f config.yaml ---data-value=TKG_DEFAULT_BOM=tkg-bom-v1.4.0.yaml ---data-value=KUBERNETES_RELEASE=v1.21.2---vmware.1-tkg.2-20210924-539f8b15 --f ../../config_default.yaml --f ../../infrastructure-vsphere/v0.7.10/ytt/base-template.yaml --f ../../infrastructure-vsphere/v0.7.10/ytt/overlay-windows.yaml --f ../..//ytt/02_addons/cni/antrea/antrea_addon_data.lib.yaml --f ../../ytt/02_addons/cpi/cpi_addon_data.lib.yaml --f ../../provider-bundle/providers/ytt/02_addons/cpi/cpi_addon_data.lib.yaml --f ./ytt_libs_4_test/ -*/ diff --git a/providers/vendir.lock.yml b/providers/vendir.lock.yml deleted file mode 100644 index a1378900ee..0000000000 --- a/providers/vendir.lock.yml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -directories: -- contents: - - git: - commitTitle: Adds Contour 1.22.3 (#5603)... - sha: 95ef4138317d8777ca29730a156cb229333811a9 - tags: - - v0.13.0-dev.2-521-g95ef4138 - path: . - path: ytt/vendir/vsphere_cpi/_ytt_lib -- contents: - - git: - commitTitle: Add antrea 1.7.2 package (#5627)... - sha: 71dd9381be1a4f075a64f404ca262f860e769a68 - tags: - - v0.13.0-dev.2-544-g71dd9381 - path: . - path: ytt/vendir/cni/_ytt_lib -- contents: - - git: - commitTitle: Bump kapp-controller to version 0.41.6 (#5651) - sha: 4fbb0772dd529bf0dc113e306ac1597266c90fca - tags: - - v0.13.0-dev.2-554-g4fbb0772 - path: . - path: ytt/vendir/kapp-controller/_ytt_lib -kind: LockConfig diff --git a/providers/vendir.yml b/providers/vendir.yml deleted file mode 100644 index eef637a938..0000000000 --- a/providers/vendir.yml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: vendir.k14s.io/v1alpha1 -kind: Config -directories: -- path: ytt/vendir/vsphere_cpi/_ytt_lib - contents: - - path: . - git: - url: git@github.com:vmware-tanzu/community-edition.git - ref: 95ef4138317d8777ca29730a156cb229333811a9 - includePaths: - - addons/packages/vsphere-cpi/1.24.3/bundle/config/**/* -- path: ytt/vendir/cni/_ytt_lib - contents: - - path: . - git: - url: git@github.com:vmware-tanzu/community-edition.git - ref: 71dd9381be1a4f075a64f404ca262f860e769a68 - includePaths: - - addons/packages/calico/3.24.1/bundle/config/**/* -- path: ytt/vendir/kapp-controller/_ytt_lib - contents: - - path: . - git: - url: git@github.com:vmware-tanzu/community-edition.git - ref: 4fbb0772dd529bf0dc113e306ac1597266c90fca - includePaths: - - addons/packages/kapp-controller/0.41.6/bundle/config/**/* diff --git a/providers/ytt/01_plans/dev.yaml b/providers/ytt/01_plans/dev.yaml deleted file mode 100644 index 0a6cc41f55..0000000000 --- a/providers/ytt/01_plans/dev.yaml +++ /dev/null @@ -1,26 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ if data.values.CLUSTER_PLAN == "dev": -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - tkg/plan: dev - #! possible other customizations specific to the dev plan.... - -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"TanzuKubernetesCluster"}) ---- -apiVersion: run.tanzu.vmware.com/v1alpha2 -kind: TanzuKubernetesCluster -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - tkg/plan: dev - #! possible other customizations specific to the dev plan.... -#@ end diff --git a/providers/ytt/01_plans/oidc.yaml b/providers/ytt/01_plans/oidc.yaml deleted file mode 100644 index 374c8249e4..0000000000 --- a/providers/ytt/01_plans/oidc.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("/lib/helpers.star", "validate") - -#@ if data.values.ENABLE_OIDC and validate(): -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -spec: - kubeadmConfigSpec: - clusterConfiguration: - apiServer: - extraArgs: - #@overlay/match missing_ok=True - oidc-client-id: #@ data.values.CLUSTER_NAME - #@overlay/match missing_ok=True - oidc-issuer-url: #@ data.values.OIDC_ISSUER_URL - #@overlay/match missing_ok=True - oidc-username-claim: #@ data.values.OIDC_USERNAME_CLAIM - #@overlay/match missing_ok=True - oidc-groups-claim: #@ data.values.OIDC_GROUPS_CLAIM - #@overlay/match missing_ok=True - oidc-ca-file: /etc/tkg/pki/dex-ca.crt - #@overlay/match missing_ok=True - extraVolumes: - #@overlay/append - - name: dex-ca - hostPath: /etc/tkg/pki - mountPath: /etc/tkg/pki - readOnly: true - pathType: DirectoryOrCreate - #@overlay/match missing_ok=True - files: - #@overlay/append - - path: /etc/tkg/pki/dex-ca.crt - encoding: "gzip+base64" - #! kubectl get secret dex-cert-tls -n tanzu-system-auth -o 'go-template={{ index .data "ca.crt" }}' | base64 -D | gzip | base64 - content: #@ data.values.OIDC_DEX_CA -#@ end diff --git a/providers/ytt/01_plans/prod.yaml b/providers/ytt/01_plans/prod.yaml deleted file mode 100644 index bd2b28d4d5..0000000000 --- a/providers/ytt/01_plans/prod.yaml +++ /dev/null @@ -1,27 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ if data.values.CLUSTER_PLAN == "prod": -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - tkg/plan: prod - #! possible other customizations specific to the prod plan.... - -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"TanzuKubernetesCluster"}) ---- -apiVersion: run.tanzu.vmware.com/v1alpha2 -kind: TanzuKubernetesCluster -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - tkg/plan: prod - #! possible other customizations specific to the prod plan.... - -#@ end diff --git a/providers/ytt/02_addons/auth/pinniped_addon_secret.lib.yaml b/providers/ytt/02_addons/auth/pinniped_addon_secret.lib.yaml deleted file mode 100644 index c4e55a6434..0000000000 --- a/providers/ytt/02_addons/auth/pinniped_addon_secret.lib.yaml +++ /dev/null @@ -1,206 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("/lib/helpers.star", "get_no_proxy") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "get_image_repo_for_component") - -#! These default names have been around since 1.3.0, and we want to keep them the same for backwards stability. -#@ supervisor_service_name = "pinniped-supervisor" -#@ dex_service_name = "dexsvc" - -#@ def getServiceValuesForMC(name): -name: #@ name -#@ if data.values.PROVIDER_TYPE != "vsphere": -type: LoadBalancer -#@ elif data.values.AVI_ENABLE: -type: LoadBalancer -#@ else: -type: NodePort -#@ end -#@ end - -#@ def getOIDCValuesForMC(): ---- -infrastructure_provider: #@ data.values.PROVIDER_TYPE -tkg_cluster_role: #@ data.values.TKG_CLUSTER_ROLE -custom_cluster_issuer: "" #! provide if user wants to use a custom ClusterIssuer for both Pinniped and Dex certificates -custom_tls_secret: "" #! provide if user wants to use a custom TLS secret for both Pinniped and Dex, will override the ClusterIssuer above if specified -http_proxy: #@ data.values.TKG_HTTP_PROXY -https_proxy: #@ data.values.TKG_HTTPS_PROXY -no_proxy: #@ get_no_proxy() -identity_management_type: #@ data.values.IDENTITY_MANAGEMENT_TYPE -pinniped: - cert_duration: #@ data.values.CERT_DURATION - cert_renew_before: #@ data.values.CERT_RENEW_BEFORE - supervisor_svc_endpoint: "https://0.0.0.0:31234" #! Do not change. Will be updated by post-deployment job. This is used to configure jwtAuthenticator - supervisor_ca_bundle_data: "ca_bundle_data_of_supervisor_svc" #! Do not change. Will be updated by post-deployment job. This is used to configure jwtAuthenticator to communicate with supervisor svc - supervisor_svc_external_ip: "0.0.0.0" #! provide if the node IP or LB IP of Pinniped supervisor service is known, otherwise leave it as is. e.g. 10.165.123.84 - supervisor_svc_external_dns: null #! provide if the LB DNS of Pinniped supervisor service is known, otherwise leave it as is. e.g pinniped-svc.us-west-2a.com - upstream_oidc_client_id: #@ data.values.OIDC_IDENTITY_PROVIDER_CLIENT_ID - upstream_oidc_client_secret: #@ data.values.OIDC_IDENTITY_PROVIDER_CLIENT_SECRET - upstream_oidc_issuer_url: #@ data.values.OIDC_IDENTITY_PROVIDER_ISSUER_URL - upstream_oidc_tls_ca_data: "" #! This tls ca data is used to communicate with upstream_oidc_issuer_url - upstream_oidc_additional_scopes: - #@ for val in data.values.OIDC_IDENTITY_PROVIDER_SCOPES.split(","): - #@overlay/append - - #@ val - #@ end - upstream_oidc_claims: #! required. If no claims, put {} - username: #@ data.values.OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM - groups: #@ data.values.OIDC_IDENTITY_PROVIDER_GROUPS_CLAIM - supervisor: - service: #@ getServiceValuesForMC(supervisor_service_name) -#@ end - -#@ def getLDAPValuesForMC(): ---- -infrastructure_provider: #@ data.values.PROVIDER_TYPE -tkg_cluster_role: #@ data.values.TKG_CLUSTER_ROLE -custom_cluster_issuer: "" #! provide if user wants to use a custom ClusterIssuer for both Pinniped and Dex certificates -custom_tls_secret: "" #! provide if user wants to use a custom TLS secret for both Pinniped and Dex, will override the ClusterIssuer above if specified -http_proxy: #@ data.values.TKG_HTTP_PROXY -https_proxy: #@ data.values.TKG_HTTPS_PROXY -no_proxy: #@ get_no_proxy() -identity_management_type: #@ data.values.IDENTITY_MANAGEMENT_TYPE -pinniped: - cert_duration: #@ data.values.CERT_DURATION - cert_renew_before: #@ data.values.CERT_RENEW_BEFORE - supervisor_svc_endpoint: "https://0.0.0.0:31234" #! Do not change. Will be updated by post-deployment job. This is used to configure jwtAuthenticator - supervisor_ca_bundle_data: "ca_bundle_data_of_supervisor_svc" #! Do not change. Will be updated by post-deployment job. This is used to configure jwtAuthenticator to communicate with supervisor svc - supervisor_svc_external_ip: "0.0.0.0" #! provide if the node IP or LB IP of Pinniped supervisor service is known, otherwise leave it as is. e.g. 10.165.123.84 - supervisor_svc_external_dns: null #! provide if the LB DNS of Pinniped supervisor service is known, otherwise leave it as is. e.g pinniped-svc.us-west-2a.com - upstream_oidc_client_id: "" #! Do not change. Will be updated by post-deployment job. The client secret used to talk to Dex - upstream_oidc_client_secret: "" #! Do not change. Will be updated by post-deployment job. This is the client secret used to talk to Dex - upstream_oidc_issuer_url: "https://0.0.0.0:30167" #! Do not change. Will be updated by post-deployment job. This is the upstream oidc issuer url. It should be pointed to Dex service, since Dex is deployed as the upstream of Pinniped. e.g https://endpoint-points-to-dex:5443 !!! - upstream_oidc_tls_ca_data: "ca_bundle_data_of_dex_svc" #! Do not change. Will be updated by post-deployment job. This tls ca data is used to communicate with upstream_oidc_issuer_url - upstream_oidc_additional_scopes: #! Do not change. This values are static for Pinniped + Dex use cases. - - email - - profile - - groups - upstream_oidc_claims: #! required. If no claims, put {} - username: name - groups: groups - supervisor: - service: #@ getServiceValuesForMC(supervisor_service_name) -dex: - app: dex #! required - create_namespace: true #! required - namespace: tanzu-system-auth #! required - organization: vmware #! required - commonname: tkg-dex #! required - config: - connector: ldap - frontend: - theme: tkg - web: - https: 0.0.0.0:5556 - tlsCert: /etc/dex/tls/tls.crt - tlsKey: /etc/dex/tls/tls.key - expiry: - signingKeys: 9h - idTokens: 5m - authRequests: 90m - deviceRequests: 5m - refreshTokens: - absoluteLifetime: 9h - logger: - level: info - format: json - staticClients: - - id: "pinniped" #! Do not change. Will be updated by post-deployment job - redirectURIs: - - https://0.0.0.0/callback #! Do not change. Will be updated by post-deployment job - name: "pinniped" #! Do not change. Will be updated by post-deployment job - secret: "dummyvalue" #! Do not change. Will be updated by post-deployment job - ldap: - host: #@ data.values.LDAP_HOST - insecureNoSSL: false - startTLS: null - rootCA: null #! or if required when LDAP host is using self signed certificate. Path to the CA file - rootCAData: #@ data.values.LDAP_ROOT_CA_DATA_B64 - bindDN: #@ data.values.LDAP_BIND_DN - BIND_PW_ENV_VAR: #@ data.values.LDAP_BIND_PASSWORD - usernamePrompt: LDAP Username - insecureSkipVerify: false - userSearch: - baseDN: #@ data.values.LDAP_USER_SEARCH_BASE_DN - filter: #@ data.values.LDAP_USER_SEARCH_FILTER - username: #@ data.values.LDAP_USER_SEARCH_USERNAME - idAttr: #@ data.values.LDAP_USER_SEARCH_ID_ATTRIBUTE - emailAttr: #@ data.values.LDAP_USER_SEARCH_EMAIL_ATTRIBUTE - nameAttr: #@ data.values.LDAP_USER_SEARCH_NAME_ATTRIBUTE - scope: sub - groupSearch: - baseDN: #@ data.values.LDAP_GROUP_SEARCH_BASE_DN - filter: #@ data.values.LDAP_GROUP_SEARCH_FILTER - nameAttr: #@ data.values.LDAP_GROUP_SEARCH_NAME_ATTRIBUTE - scope: sub - userMatchers: #! Add more matchers if necessary - - userAttr: #@ data.values.LDAP_GROUP_SEARCH_USER_ATTRIBUTE - groupAttr: #@ data.values.LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE - oauth2: - skipApprovalScreen: true - responseTypes: - - "code" - storage: - type: kubernetes - config: - inCluster: true - enablePasswordDB: false - service: #@ getServiceValuesForMC(dex_service_name) - deployment: - replicas: 1 - certificate: #! required - duration: #@ data.values.CERT_DURATION - renewBefore: #@ data.values.CERT_RENEW_BEFORE - dns: #! required - vsphere: - dnsNames: - - tkg-dex.com - ipAddresses: [ 0.0.0.0 ] #! Do not change. Will be updated by post-deployment job - aws: - dnsNames: - - tkg-dex.com - DEX_SVC_LB_HOSTNAME: example.com #! is required for AWS - azure: - dnsNames: - - tkg-dex.com - DEX_SVC_LB_HOSTNAME: dex.example.com #! is required for azure -#@ end - -#@ def getValuesForWC(): -#@ bomData = get_bom_data_for_tkr_name() -#@ pinnipedImage = bomData.components["pinniped"][0].images.pinnipedImage -#@ postDeployPinnipedImage = bomData.components["tanzu-framework-addons"][0].images.tkgPinnipedPostDeployImage ---- -infrastructure_provider: #@ data.values.PROVIDER_TYPE -tkg_cluster_role: #@ data.values.TKG_CLUSTER_ROLE -identity_management_type: #@ data.values.IDENTITY_MANAGEMENT_TYPE -pinniped: - cert_duration: #@ data.values.CERT_DURATION - cert_renew_before: #@ data.values.CERT_RENEW_BEFORE - supervisor_svc_endpoint: #@ data.values.SUPERVISOR_ISSUER_URL - supervisor_ca_bundle_data: #@ data.values.SUPERVISOR_ISSUER_CA_BUNDLE_DATA_B64 - image: #! For backwards compatibility. i.e. C.1 mgmt cluster creates a C.0 wlc with older addon templates. - name: #@ pinnipedImage.imagePath - tag: #@ pinnipedImage.tag - repository: #@ get_image_repo_for_component(pinnipedImage) - pull_policy: IfNotPresent - post_deploy_job_image: #! For backwards compatibility. i.e. C.1 mgmt cluster creates a C.0 wlc with older addon templates. - name: #@ postDeployPinnipedImage.imagePath - tag: #@ postDeployPinnipedImage.tag - repository: #@ get_image_repo_for_component(postDeployPinnipedImage) - pull_policy: IfNotPresent - -#@ end - -#@ def getPinnipedDataValues(): -#@ if data.values.TKG_CLUSTER_ROLE == "management": -#@ if data.values.IDENTITY_MANAGEMENT_TYPE == "oidc": -#@ return getOIDCValuesForMC() -#@ end -#@ if data.values.IDENTITY_MANAGEMENT_TYPE == "ldap": -#@ return getLDAPValuesForMC() -#@ end -#@ else: -#@ return getValuesForWC() -#@ end -#@ end diff --git a/providers/ytt/02_addons/auth/pinniped_addon_secret.yaml b/providers/ytt/02_addons/auth/pinniped_addon_secret.yaml deleted file mode 100644 index a7c055f9f2..0000000000 --- a/providers/ytt/02_addons/auth/pinniped_addon_secret.yaml +++ /dev/null @@ -1,22 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("pinniped_addon_secret.lib.yaml", "getPinnipedDataValues") -#@ load("/lib/helpers.star", "ValuesFormatStr") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere" and data.values.IDENTITY_MANAGEMENT_TYPE != "none": ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-pinniped-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: pinniped - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - clusterctl.cluster.x-k8s.io/move: "" - annotations: - tkg.tanzu.vmware.com/addon-type: "authentication/pinniped" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(getPinnipedDataValues())) -#@ end diff --git a/providers/ytt/02_addons/avi/ako_operator_secret.yaml b/providers/ytt/02_addons/avi/ako_operator_secret.yaml deleted file mode 100644 index 9206d7133f..0000000000 --- a/providers/ytt/02_addons/avi/ako_operator_secret.yaml +++ /dev/null @@ -1,104 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:json", "json") -#@ load("/lib/helpers.star", "ValuesFormatStr") - -#@ def avi_node_network_list(): -#@ if data.values.AVI_INGRESS_NODE_NETWORK_LIST: -#@ return json.encode(data.values.AVI_INGRESS_NODE_NETWORK_LIST) -#@ else: -#@ network_pathes = data.values.VSPHERE_NETWORK.split("/") -#@ network = network_pathes[len(network_pathes)-1] -#@ return json.encode([{"networkName":"{}".format(network)}]) -#@ end -#@ end - -#@ def ako_operator_config(): ---- -akoOperator: - avi_enable: #@ data.values.AVI_ENABLE - namespace: #@ data.values.AVI_NAMESPACE - cluster_name: #@ data.values.CLUSTER_NAME - config: - avi_disable_ingress_class: #@ data.values.AVI_DISABLE_INGRESS_CLASS - avi_ingress_default_ingress_controller: #@ data.values.AVI_INGRESS_DEFAULT_INGRESS_CONTROLLER - avi_ingress_shard_vs_size: #@ data.values.AVI_INGRESS_SHARD_VS_SIZE - avi_ingress_service_type: #@ data.values.AVI_INGRESS_SERVICE_TYPE - avi_ingress_node_network_list: #@ avi_node_network_list() - avi_admin_credential_name: #@ data.values.AVI_ADMIN_CREDENTIAL_NAME - avi_ca_name: #@ data.values.AVI_CA_NAME - avi_controller: #@ data.values.AVI_CONTROLLER - avi_username: #@ data.values.AVI_USERNAME - avi_password: #@ data.values.AVI_PASSWORD - avi_cloud_name: #@ data.values.AVI_CLOUD_NAME - avi_service_engine_group: #@ data.values.AVI_SERVICE_ENGINE_GROUP - #@ if data.values.AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP: - avi_management_cluster_service_engine_group: #@ data.values.AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP - #@ else: - avi_management_cluster_service_engine_group: #@ data.values.AVI_SERVICE_ENGINE_GROUP - #@ end - avi_data_network: #@ data.values.AVI_DATA_NETWORK - avi_data_network_cidr: #@ data.values.AVI_DATA_NETWORK_CIDR - - #@ if data.values.AVI_CONTROL_PLANE_NETWORK and data.values.AVI_CONTROL_PLANE_NETWORK_CIDR: - avi_control_plane_network: #@ data.values.AVI_CONTROL_PLANE_NETWORK - avi_control_plane_network_cidr: #@ data.values.AVI_CONTROL_PLANE_NETWORK_CIDR - #@ else: - #@ if data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME and data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR: - avi_control_plane_network: #@ data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME - avi_control_plane_network_cidr: #@ data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR - #@ else: - avi_control_plane_network: #@ data.values.AVI_DATA_NETWORK - avi_control_plane_network_cidr: #@ data.values.AVI_DATA_NETWORK_CIDR - #@ end - #@ end - - avi_ca_data_b64: #@ data.values.AVI_CA_DATA_B64 - avi_labels: #@ json.encode(data.values.AVI_LABELS) - avi_disable_static_route_sync: #@ data.values.AVI_DISABLE_STATIC_ROUTE_SYNC - avi_cni_plugin: #@ data.values.CNI - avi_control_plane_ha_provider: #@ data.values.AVI_CONTROL_PLANE_HA_PROVIDER - #@ if data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME and data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR: - avi_management_cluster_vip_network_name: #@ data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME - avi_management_cluster_vip_network_cidr: #@ data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR - #@ else: - avi_management_cluster_vip_network_name: #@ data.values.AVI_DATA_NETWORK - avi_management_cluster_vip_network_cidr: #@ data.values.AVI_DATA_NETWORK_CIDR - #@ end - - #@ if data.values.AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME and data.values.AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR: - avi_management_cluster_control_plane_vip_network_name: #@ data.values.AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME - avi_management_cluster_control_plane_vip_network_cidr: #@ data.values.AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR - #@ else: - #@ if data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME and data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR: - avi_management_cluster_control_plane_vip_network_name: #@ data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME - avi_management_cluster_control_plane_vip_network_cidr: #@ data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR - #@ else: - avi_management_cluster_control_plane_vip_network_name: #@ data.values.AVI_DATA_NETWORK - avi_management_cluster_control_plane_vip_network_cidr: #@ data.values.AVI_DATA_NETWORK_CIDR - #@ end - #@ end - - avi_control_plane_endpoint_port: #@ data.values.VSPHERE_CONTROL_PLANE_ENDPOINT_PORT - #@ if data.values.AVI_NSXT_T1LR: - avi_nsxt_t1_lr: #@ data.values.AVI_NSXT_T1LR - #@ end -#@ end - -#@ if data.values.PROVIDER_TYPE == "vsphere" and data.values.TKG_CLUSTER_ROLE != "workload" and data.values.AVI_ENABLE: ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-ako-operator-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: ako-operator - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - clusterctl.cluster.x-k8s.io/move: "" - annotations: - tkg.tanzu.vmware.com/addon-type: "networking/ako-operator" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(ako_operator_config())) -#@ end diff --git a/providers/ytt/02_addons/cni/add_cni.yaml b/providers/ytt/02_addons/cni/add_cni.yaml deleted file mode 100644 index 38152913ad..0000000000 --- a/providers/ytt/02_addons/cni/add_cni.yaml +++ /dev/null @@ -1,184 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:struct", "struct") -#@ load("/lib/helpers.star", "ValuesFormatStr") - -#@ def removeKappConfigCR(): -#@overlay/match by=overlay.subset({"apiVersion":"kapp.k14s.io/v1alpha1","kind":"Config"}) -#@overlay/remove ---- -#@ end - -#! skip generation of CNI for TKGs and on cluster upgrade -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": - -#! FILTER_BY_ADDON_TYPE is used to indicate INSTALL or UPGRADE case. -#! FILTER_BY_ADDON_TYPE is empty during INSTALL and set to "kapp-controller, tanzu-addons-manager, tkr-controller" during UPGRADE. -#! The below check ensures this ytt template is run during INSTALL or when "cni/calico" is set in FILTER_BY_ADDON_TYPE. -#! "cni/calico" is never set by tanzu cli code and only set manually if anyone wants to register calico addon. - -#@ if data.values.CNI == "calico" and (not data.values.FILTER_BY_ADDON_TYPE or "cni/calico" in data.values.FILTER_BY_ADDON_TYPE): -#@ load("/vendir/cni/cni.lib.yaml", "cni_calico_lib") - -#@ load("calico/calico_addon_data.lib.yaml", "calicodatavalues") -#@ load("calico/calico_overlay.lib.yaml", "updatecalicoimage") - -#! skip generation of CNI for workload clusters -#@ if data.values.TKG_CLUSTER_ROLE != "workload": ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-calico".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "cni/calico" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-calico-crs".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-calico-crs".format(data.values.CLUSTER_NAME) - annotations: - tkg.tanzu.vmware.com/addon-type: "cni/calico" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(overlay.apply(cni_calico_lib.with_data_values(calicodatavalues()).eval(), updatecalicoimage())) - -#@ end - -#! Add ingress rules to AWS cluster for Calico ports. -#! Add ingress rules to AWS cluster for kapp controller API port -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"AWSCluster"}) ---- -kind: AWSCluster -spec: - network: - #@overlay/match missing_ok=True - cni: - cniIngressRules: - - description: bgp (calico) - fromPort: 179 - protocol: tcp - toPort: 179 - - description: IP-in-IP (calico) - fromPort: -1 - protocol: "4" - toPort: 65535 - - description: kapp-controller - fromPort: 10100 - protocol: tcp - toPort: 10100 - ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-calico-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: "calico" - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - clusterctl.cluster.x-k8s.io/move: "" - annotations: - tkg.tanzu.vmware.com/addon-type: "cni/calico" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(calicodatavalues())) - -#@ end - -#! FILTER_BY_ADDON_TYPE is used to indicate INSTALL or UPGRADE case. -#! FILTER_BY_ADDON_TYPE is empty during INSTALL and set to "kapp-controller, tanzu-addons-manager, tkr-controller" during UPGRADE. -#! The below check ensures this ytt template is run during INSTALL or when "cni/antrea" is set in FILTER_BY_ADDON_TYPE. -#! "cni/antrea" is never set by tanzu cli code and only set manually if anyone wants to register antrea addon. - -#@ if data.values.CNI == "antrea" and (not data.values.FILTER_BY_ADDON_TYPE or "cni/antrea" in data.values.FILTER_BY_ADDON_TYPE): -#@ load("/vendir/cni/cni.lib.yaml", "cni_antrea_lib") -#@ load("antrea/antrea_addon_data.lib.yaml", "antreadatavalues") -#@ load("antrea/antrea_overlay.lib.yaml", "updateantreaimage") - -#! skip generation of CNI for workload clusters -#@ if data.values.TKG_CLUSTER_ROLE != "workload": ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-antrea".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "cni/antrea" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-antrea-crs".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-antrea-crs".format(data.values.CLUSTER_NAME) - annotations: - tkg.tanzu.vmware.com/addon-type: "cni/antrea" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(overlay.apply(cni_antrea_lib.with_data_values(antreadatavalues()).eval(), removeKappConfigCR(), updateantreaimage())) -#@ end - ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-antrea-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: "antrea" - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - clusterctl.cluster.x-k8s.io/move: "" - annotations: - tkg.tanzu.vmware.com/addon-type: "cni/antrea" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(antreadatavalues())) - -#! Add CNI ingress rules to AWS cluster incase of CNI=antrea to allow traffic -#! to antrea-controller API port and geneve overlay port -#! Add ingress rules to AWS cluster for kapp controller API port -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"AWSCluster"}) ---- -kind: AWSCluster -spec: - network: - #@overlay/match missing_ok=True - cni: - cniIngressRules: - - description: antrea1 - fromPort: 10349 - protocol: tcp - toPort: 10349 - - description: genev - fromPort: 6081 - protocol: udp - toPort: 6081 - - description: kapp-controller - fromPort: 10100 - protocol: tcp - toPort: 10100 - - -#@ end - -#@ end diff --git a/providers/ytt/02_addons/cni/antrea/antrea_addon_data.lib.yaml b/providers/ytt/02_addons/cni/antrea/antrea_addon_data.lib.yaml deleted file mode 100644 index 3d14efc392..0000000000 --- a/providers/ytt/02_addons/cni/antrea/antrea_addon_data.lib.yaml +++ /dev/null @@ -1,127 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "tkg_image_repo", "get_image_repo_for_component") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ antreaImage = get_bom_data_for_tkr_name().components["antrea"][0].images.antreaImage -#@ end - -#@ def split_comma_values(value): -#@ return value.split(",") if value else [] -#@ end - -#@ def is_dualstack(): -#@ return data.values.TKG_IP_FAMILY in ["ipv4,ipv6", "ipv6,ipv4"] -#@ end - -#@ def get_ipv4_service_cidr(): -#@ if not is_dualstack(): -#@ return data.values.SERVICE_CIDR -#@ end -#@ if data.values.TKG_IP_FAMILY.startswith("ipv4"): -#@ return data.values.SERVICE_CIDR.split(",")[0] -#@ end -#@ if data.values.TKG_IP_FAMILY.startswith("ipv6"): -#@ return data.values.SERVICE_CIDR.split(",")[1] -#@ end -#@ end - -#@ def get_ipv6_service_cidr(): -#@ if not is_dualstack(): -#@ return data.values.SERVICE_CIDR -#@ end -#@ if data.values.TKG_IP_FAMILY.startswith("ipv6"): -#@ return data.values.SERVICE_CIDR.split(",")[0] -#@ end -#@ if data.values.TKG_IP_FAMILY.startswith("ipv4"): -#@ return data.values.SERVICE_CIDR.split(",")[1] -#@ end -#@ end - -#@ def antreadatavalues(): -infraProvider: #@ data.values.PROVIDER_TYPE -antrea: - config: - egress: - exceptCIDRs: #@ split_comma_values(data.values.ANTREA_EGRESS_EXCEPT_CIDRS) - nodePortLocal: - enabled: #@ data.values.ANTREA_NODEPORTLOCAL_ENABLED - portRange: #@ data.values.ANTREA_NODEPORTLOCAL_PORTRANGE - antreaProxy: - proxyAll: #@ data.values.ANTREA_PROXY_ALL - nodePortAddresses: #@ split_comma_values(data.values.ANTREA_PROXY_NODEPORT_ADDRS) - skipServices: #@ split_comma_values(data.values.ANTREA_PROXY_SKIP_SERVICES) - proxyLoadBalancerIPs: #@ data.values.ANTREA_PROXY_LOAD_BALANCER_IPS - flowExporter: - collectorAddress: #@ data.values.ANTREA_FLOWEXPORTER_COLLECTOR_ADDRESS - pollInterval: #@ data.values.ANTREA_FLOWEXPORTER_POLL_INTERVAL - activeFlowTimeout: #@ data.values.ANTREA_FLOWEXPORTER_ACTIVE_TIMEOUT - idleFlowTimeout: #@ data.values.ANTREA_FLOWEXPORTER_IDLE_TIMEOUT - kubeAPIServerOverride: #@ data.values.ANTREA_KUBE_APISERVER_OVERRIDE - transportInterface: #@ data.values.ANTREA_TRANSPORT_INTERFACE - transportInterfaceCIDRs: #@ split_comma_values(data.values.ANTREA_TRANSPORT_INTERFACE_CIDRS) - multicastInterfaces: #@ split_comma_values(data.values.ANTREA_MULTICAST_INTERFACES) - tunnelType: #@ data.values.ANTREA_TUNNEL_TYPE - tunnelPort: #@ data.values.ANTREA_TUNNEL_PORT - tunnelCsum: #@ data.values.ANTREA_TUNNEL_CSUM - trafficEncryptionMode: #@ data.values.ANTREA_TRAFFIC_ENCRYPTION_MODE - enableUsageReporting: #@ data.values.ANTREA_ENABLE_USAGE_REPORTING - wireGuard: - port: #@ data.values.ANTREA_WIREGUARD_PORT - #@ if is_dualstack(): - serviceCIDR: #@ get_ipv4_service_cidr() - #@overlay/match missing_ok=True - serviceCIDRv6: #@ get_ipv6_service_cidr() - #@ else: - serviceCIDR: #@ data.values.SERVICE_CIDR - #@ end - #@ if data.values.NSXT_POD_ROUTING_ENABLED: - trafficEncapMode: "noEncap" - noSNAT: true - #@ else: - trafficEncapMode: #@ data.values.ANTREA_TRAFFIC_ENCAP_MODE - noSNAT: #@ data.values.ANTREA_NO_SNAT - #@ end - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - disableUdpTunnelOffload: #@ data.values.ANTREA_DISABLE_UDP_TUNNEL_OFFLOAD - enableBridgingMode: #@ data.values.ANTREA_ENABLE_BRIDGING_MODE - disableTXChecksumOffload: #@ data.values.ANTREA_DISABLE_TXCHECKSUM_OFFLOAD - dnsServerOverride: #@ data.values.ANTREA_DNS_SERVER_OVERRIDE - multicast: - igmpQueryInterval: #@ data.values.ANTREA_MULTICAST_IGMPQUERY_INTERVAL - multicluster: - enable: #@ data.values.ANTREA_MULTICLUSTER_ENABLE - namespace: #@ data.values.ANTREA_MULTICLUSTER_NAMESPACE - featureGates: - #@ if data.values.NSXT_POD_ROUTING_ENABLED: - AntreaProxy: true - #@ else: - AntreaProxy: #@ data.values.ANTREA_PROXY - #@ end - EndpointSlice: #@ data.values.ANTREA_ENDPOINTSLICE - AntreaPolicy: #@ data.values.ANTREA_POLICY - AntreaTraceflow: #@ data.values.ANTREA_TRACEFLOW - NodePortLocal: #@ data.values.ANTREA_NODEPORTLOCAL - NetworkPolicyStats: #@ data.values.ANTREA_NETWORKPOLICY_STATS - Egress: #@ data.values.ANTREA_EGRESS - AntreaIPAM: #@ data.values.ANTREA_IPAM - FlowExporter: #@ data.values.ANTREA_FLOWEXPORTER - ServiceExternalIP: #@ data.values.ANTREA_SERVICE_EXTERNALIP - Multicast: #@ data.values.ANTREA_MULTICAST - Multicluster: #@ data.values.ANTREA_MULTICLUSTER - SecondaryNetwork: #@ data.values.ANTREA_SECONDARY_NETWORK - TrafficControl: #@ data.values.ANTREA_TRAFFIC_CONTROL - TopologyAwareHints: #@ data.values.ANTREA_TOPOLOGY_AWARE_HINTS - - - - -#@ if data.values.TKG_CLUSTER_ROLE == "workload": #! For backwards compatibility. i.e. C.1 mgmt cluster creates a C.0 wlc with older addon templates. - image: - repository: #@ get_image_repo_for_component(antreaImage) - path: #@ antreaImage.imagePath - tag: #@ antreaImage.tag - pullPolicy: IfNotPresent -#@ end - -#@ end diff --git a/providers/ytt/02_addons/cni/antrea/antrea_overlay.lib.yaml b/providers/ytt/02_addons/cni/antrea/antrea_overlay.lib.yaml deleted file mode 100644 index 697014680d..0000000000 --- a/providers/ytt/02_addons/cni/antrea/antrea_overlay.lib.yaml +++ /dev/null @@ -1,47 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:regexp", "regexp") -#@ load("@ytt:data", "data") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "get_image_repo_for_component") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ antreaImage = get_bom_data_for_tkr_name().components["antrea"][0].images.antreaImage -#@ antreaImageRepo = get_image_repo_for_component(antreaImage) -#@ end - -#@ def antrea_config_regex_match(x, l, r): -#@ if not ("metadata" in l and "name" in l["metadata"]): -#@ return False -#@ end -#@ return regexp.match("antrea-config-*", l["metadata"]["name"]) -#@ end - -#@ def updateantreaimage(): - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "antrea-controller"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name":"antrea-controller"}) - - image: #@ "{}/{}:{}".format(antreaImageRepo, antreaImage.imagePath, antreaImage.tag) - - -#@overlay/match by=overlay.subset({"kind":"DaemonSet","metadata":{"name": "antrea-agent"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name":"antrea-agent"}) - - image: #@ "{}/{}:{}".format(antreaImageRepo, antreaImage.imagePath, antreaImage.tag) - #@overlay/match by=overlay.subset({"name":"antrea-ovs"}) - - image: #@ "{}/{}:{}".format(antreaImageRepo, antreaImage.imagePath, antreaImage.tag) - - initContainers: - #@overlay/match by=overlay.subset({"name":"install-cni"}) - - image: #@ "{}/{}:{}".format(antreaImageRepo, antreaImage.imagePath, antreaImage.tag) - #@overlay/match by=overlay.subset({"name":"antrea-agent-tweaker"}) - - image: #@ "{}/{}:{}".format(antreaImageRepo, antreaImage.imagePath, antreaImage.tag) - -#@ end diff --git a/providers/ytt/02_addons/cni/calico/calico_addon_data.lib.yaml b/providers/ytt/02_addons/cni/calico/calico_addon_data.lib.yaml deleted file mode 100644 index c774306ee6..0000000000 --- a/providers/ytt/02_addons/cni/calico/calico_addon_data.lib.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "tkg_image_repo", "get_image_repo_for_component") - -#@ def calicodatavalues(): -infraProvider: #@ data.values.PROVIDER_TYPE -ipFamily: #@ data.values.TKG_IP_FAMILY -calico: - config: - clusterCIDR: #@ data.values.CLUSTER_CIDR - #@ if/end data.values.PROVIDER_TYPE != "docker": - skipCNIBinaries: true -#@ end diff --git a/providers/ytt/02_addons/cni/calico/calico_overlay.lib.yaml b/providers/ytt/02_addons/cni/calico/calico_overlay.lib.yaml deleted file mode 100644 index d6411a18e3..0000000000 --- a/providers/ytt/02_addons/cni/calico/calico_overlay.lib.yaml +++ /dev/null @@ -1,46 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "get_image_repo_for_component") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ calicoImages = get_bom_data_for_tkr_name().components["calico_all"][0].images -#@ end - -#@ def updatecalicoimage(): - -#@overlay/match by=overlay.subset({"kind":"DaemonSet"}) ---- -spec: - template: - spec: - initContainers: - #@overlay/match by=overlay.subset({"name":"upgrade-ipam"}) - - image: #@ "{}/{}:{}".format(get_image_repo_for_component(calicoImages.calicoCniImage), calicoImages.calicoCniImage.imagePath, calicoImages.calicoCniImage.tag) - #@overlay/match missing_ok=True - imagePullPolicy: IfNotPresent - #@overlay/match by=overlay.subset({"name":"install-cni"}) - - image: #@ "{}/{}:{}".format(get_image_repo_for_component(calicoImages.calicoCniImage), calicoImages.calicoCniImage.imagePath, calicoImages.calicoCniImage.tag) - #@overlay/match missing_ok=True - imagePullPolicy: IfNotPresent - #@overlay/match by=overlay.subset({"name":"mount-bpffs"}) - - image: #@ "{}/{}:{}".format(get_image_repo_for_component(calicoImages.calicoNodeImage), calicoImages.calicoNodeImage.imagePath, calicoImages.calicoNodeImage.tag) - #@overlay/match missing_ok=True - imagePullPolicy: IfNotPresent - containers: - #@overlay/match by=overlay.subset({"name":"calico-node"}) - - image: #@ "{}/{}:{}".format(get_image_repo_for_component(calicoImages.calicoNodeImage), calicoImages.calicoNodeImage.imagePath, calicoImages.calicoNodeImage.tag) - #@overlay/match missing_ok=True - imagePullPolicy: IfNotPresent - -#@overlay/match by=overlay.subset({"kind":"Deployment"}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name":"calico-kube-controllers"}) - - image: #@ "{}/{}:{}".format(get_image_repo_for_component(calicoImages.calicoKubecontrollerImage), calicoImages.calicoKubecontrollerImage.imagePath, calicoImages.calicoKubecontrollerImage.tag) - #@overlay/match missing_ok=True - imagePullPolicy: IfNotPresent - -#@ end diff --git a/providers/ytt/02_addons/cpi/cpi_addon_data.lib.yaml b/providers/ytt/02_addons/cpi/cpi_addon_data.lib.yaml deleted file mode 100644 index 8f1cd8f443..0000000000 --- a/providers/ytt/02_addons/cpi/cpi_addon_data.lib.yaml +++ /dev/null @@ -1,60 +0,0 @@ -#@ load("@ytt:assert", "assert") -#@ load("@ytt:data", "data") -#@ load("@ytt:ip", "ip") -#@ load("/lib/helpers.star", "tkg_image_repo", "get_image_repo_for_component", "get_vsphere_thumbprint", "get_bom_data_for_tkr_name", "get_no_proxy") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ cpiImage = get_bom_data_for_tkr_name().components["cloud_provider_vsphere"][0].images.ccmControllerImage -#@ end - -#@ vsphereControlPlaneEndpointAsCidr = "" -#@ if data.values.VSPHERE_CONTROL_PLANE_ENDPOINT: -#@ vsphereControlPlaneEndpoint, err = assert.try_to(lambda : ip.parse_addr(data.values.VSPHERE_CONTROL_PLANE_ENDPOINT)) -#@ if err == None: -#@ if vsphereControlPlaneEndpoint.is_ipv4(): -#@ vsphereControlPlaneEndpointAsCidr = vsphereControlPlaneEndpoint.string() + "/32" -#@ end -#@ if vsphereControlPlaneEndpoint.is_ipv6(): -#@ vsphereControlPlaneEndpointAsCidr = vsphereControlPlaneEndpoint.string() + "/128" -#@ end -#@ end -#@ end - -#@ def vsphere_cpi_data_values(): -vsphereCPI: - tlsThumbprint: #@ get_vsphere_thumbprint() - server: #@ data.values.VSPHERE_SERVER - datacenter: #@ data.values.VSPHERE_DATACENTER - username: #@ data.values.VSPHERE_USERNAME - password: #@ data.values.VSPHERE_PASSWORD - region: #@ data.values.VSPHERE_REGION - zone: #@ data.values.VSPHERE_ZONE - insecureFlag: #@ data.values.VSPHERE_INSECURE -#@ if data.values.TKG_IP_FAMILY: - ipFamily: #@ data.values.TKG_IP_FAMILY -#@ end - vmExcludeInternalNetworkSubnetCidr: #@ vsphereControlPlaneEndpointAsCidr - vmExcludeExternalNetworkSubnetCidr: #@ vsphereControlPlaneEndpointAsCidr - cloudProviderExtraArgs: - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - nsxt: - podRoutingEnabled: #@ data.values.NSXT_POD_ROUTING_ENABLED - routes: - routerPath: #@ data.values.NSXT_ROUTER_PATH - clusterCidr: #@ data.values.CLUSTER_CIDR - username: #@ data.values.NSXT_USERNAME - password: #@ data.values.NSXT_PASSWORD - host: #@ data.values.NSXT_MANAGER_HOST - insecureFlag: #@ data.values.NSXT_ALLOW_UNVERIFIED_SSL - remoteAuth: #@ data.values.NSXT_REMOTE_AUTH - vmcAccessToken: #@ data.values.NSXT_VMC_ACCESS_TOKEN - vmcAuthHost: #@ data.values.NSXT_VMC_AUTH_HOST - clientCertKeyData: #@ data.values.NSXT_CLIENT_CERT_KEY_DATA - clientCertData: #@ data.values.NSXT_CLIENT_CERT_DATA - rootCAData: #@ data.values.NSXT_ROOT_CA_DATA_B64 - secretName: #@ data.values.NSXT_SECRET_NAME - secretNamespace: #@ data.values.NSXT_SECRET_NAMESPACE - http_proxy: #@ data.values.TKG_HTTP_PROXY - https_proxy: #@ data.values.TKG_HTTPS_PROXY - no_proxy: #@ get_no_proxy() -#@ end diff --git a/providers/ytt/02_addons/cpi/cpi_app.lib.yaml b/providers/ytt/02_addons/cpi/cpi_app.lib.yaml deleted file mode 100644 index 11286211d8..0000000000 --- a/providers/ytt/02_addons/cpi/cpi_app.lib.yaml +++ /dev/null @@ -1,39 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "get_image_repo_for_component", "ValuesFormatStr", "get_bom_data_for_tkr_name") -#@ load("cpi_addon_data.lib.yaml", "vsphere_cpi_data_values") - - -#@ def vsphere_app(): -#@ vsphereCpiTemplatesImage = get_bom_data_for_tkr_name().components["tanzu-framework-addons"][0].images.vsphereCpiTemplatesImage ---- -apiVersion: kappctrl.k14s.io/v1alpha1 -kind: App -metadata: - name: vsphere-cpi - namespace: tkg-system -spec: - serviceAccountName: tanzu-addons-app-sa - fetch: - - image: - url: #@ "{}/{}:{}".format(get_image_repo_for_component(vsphereCpiTemplatesImage), vsphereCpiTemplatesImage.imagePath, vsphereCpiTemplatesImage.tag) - template: - - ytt: - ignoreUnknownComments: true - inline: - pathsFrom: - - secretRef: - name: vsphere-cpi-data-values - deploy: - - kapp: {} ---- -apiVersion: v1 -kind: Secret -metadata: - name: vsphere-cpi-data-values - namespace: tkg-system -type: Opaque -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(vsphere_cpi_data_values())) - -#@ end diff --git a/providers/ytt/02_addons/cpi/cpi_overlay.lib.yaml b/providers/ytt/02_addons/cpi/cpi_overlay.lib.yaml deleted file mode 100644 index 4684277e92..0000000000 --- a/providers/ytt/02_addons/cpi/cpi_overlay.lib.yaml +++ /dev/null @@ -1,22 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "get_image_repo_for_component") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ cpiImage = get_bom_data_for_tkr_name().components["cloud_provider_vsphere"][0].images.ccmControllerImage -#@ cpiImageRepo = get_image_repo_for_component(cpiImage) -#@ end - -#@ def update_vsphere_cpi_image(): - -#@overlay/match by=overlay.subset({"kind": "DaemonSet", "metadata": {"name": "vsphere-cloud-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name": "vsphere-cloud-controller-manager"}) - - image: #@ "{}/{}:{}".format(cpiImageRepo, cpiImage.imagePath, cpiImage.tag) - #@overlay/match missing_ok=True - imagePullPolicy: IfNotPresent -#@ end diff --git a/providers/ytt/02_addons/cpi/cpi_secret.yaml b/providers/ytt/02_addons/cpi/cpi_secret.yaml deleted file mode 100644 index 7b2357faed..0000000000 --- a/providers/ytt/02_addons/cpi/cpi_secret.yaml +++ /dev/null @@ -1,22 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "ValuesFormatStr",) -#@ load("cpi_addon_data.lib.yaml", "vsphere_cpi_data_values") - -#@ if data.values.PROVIDER_TYPE == "vsphere" and data.values.TKG_CLUSTER_ROLE == "workload": ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-vsphere-cpi-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: "vsphere-cpi" - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "cloud-provider/vsphere-cpi" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(vsphere_cpi_data_values())) - -#@ end diff --git a/providers/ytt/02_addons/cpi/cpi_secret_crs.yaml b/providers/ytt/02_addons/cpi/cpi_secret_crs.yaml deleted file mode 100644 index c4caeb1117..0000000000 --- a/providers/ytt/02_addons/cpi/cpi_secret_crs.yaml +++ /dev/null @@ -1,60 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:struct", "struct") - -#@ load("/lib/helpers.star", "ValuesFormatStr") -#@ load("cpi_addon_data.lib.yaml", "vsphere_cpi_data_values") -#@ load("cpi_overlay.lib.yaml", "update_vsphere_cpi_image") -#@ load("/vendir/vsphere_cpi/vsphere_cpi.lib.yaml", "vsphere_cpi_lib") - -#! FILTER_BY_ADDON_TYPE is used to indicate INSTALL or UPGRADE case. -#! FILTER_BY_ADDON_TYPE is empty during INSTALL and set to "kapp-controller, tanzu-addons-manager, tkr-controller" during UPGRADE. -#! The below check ensures this ytt template is run during INSTALL or when "cloud-provider/vsphere-cpi" is set in FILTER_BY_ADDON_TYPE. -#! "cloud-provider/vsphere-cpi" is never set by tanzu cli code and only set manually if anyone wants to register vsphere-cpi addon. - -#@ if data.values.PROVIDER_TYPE == "vsphere" and data.values.TKG_CLUSTER_ROLE != "workload" and (not data.values.FILTER_BY_ADDON_TYPE or "cloud-provider/vsphere-cpi" in data.values.FILTER_BY_ADDON_TYPE): ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-vsphere-cpi-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: "vsphere-cpi" - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - clusterctl.cluster.x-k8s.io/move: "" - annotations: - tkg.tanzu.vmware.com/addon-type: "cloud-provider/vsphere-cpi" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(vsphere_cpi_data_values())) - ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-vsphere-cpi".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "cloud-provider/vsphere-cpi" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-vsphere-cpi-crs".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-vsphere-cpi-crs".format(data.values.CLUSTER_NAME) - annotations: - tkg.tanzu.vmware.com/addon-type: "cloud-provider/vsphere-cpi" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(overlay.apply(vsphere_cpi_lib.with_data_values(vsphere_cpi_data_values()).eval(), update_vsphere_cpi_image())) -#@ end diff --git a/providers/ytt/02_addons/csi/csi_addon_data.lib.yaml b/providers/ytt/02_addons/csi/csi_addon_data.lib.yaml deleted file mode 100644 index 4e3f884e15..0000000000 --- a/providers/ytt/02_addons/csi/csi_addon_data.lib.yaml +++ /dev/null @@ -1,88 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:assert", "assert") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "get_image_repo_for_component", "get_vsphere_thumbprint", "get_no_proxy") - - -#! `topology-catogories` label is only available in CSI 2.4 and newer -#! Set enableTopologyCatogories to be true for TKR 1.22 and newer -#@ def enableTopologyCatogories(): -#@ bomData = get_bom_data_for_tkr_name() -#@ elements = bomData.release.version.split(".") -#@ if len(elements) < 3 or not elements[0].startswith("v"): -#@ assert.fail("Failed to parse TKR version for CSI package") -#@ end -#@ major = int(elements[0][1:]) -#@ minor = int(elements[1]) -#@ if major > 1: -#@ return True -#@ end -#@ if major == 1 and minor >= 22: -#@ return True -#@ end -#@ return False -#@ end - -#@ def vsphere_csi_data_values(): -#@ bomData = get_bom_data_for_tkr_name() -#@ csiAttacherImage = bomData.components.csi_attacher[0].images.csiAttacherImage -#@ csiControllerImage = bomData.components.vsphere_csi_driver[0].images.csiControllerImage -#@ csiLivenessProbeImage = bomData.components.csi_livenessprobe[0].images.csiLivenessProbeImage -#@ csiSyncerImage = bomData.components.vsphere_csi_driver[0].images.csiMetaDataSyncerImage -#@ csiProvisionerImage = bomData.components.csi_provisioner[0].images.csiProvisonerImage -#@ csiDriverRegistrarImage = bomData.components.csi_node_driver_registrar[0].images.csiNodeDriverRegistrarImage ---- -vsphereCSI: -#@ if data.values.TKG_CLUSTER_ROLE == "workload": #! For backwards compatibility. i.e. C.1 mgmt cluster creates a C.0 wlc with older addon templates. - CSIAttacherImage: - repository: #@ get_image_repo_for_component(csiAttacherImage) - path: #@ csiAttacherImage.imagePath - tag: #@ csiAttacherImage.tag - pullPolicy: "IfNotPresent" - vsphereCSIControllerImage: - repository: #@ get_image_repo_for_component(csiControllerImage) - path: #@ csiControllerImage.imagePath - tag: #@ csiControllerImage.tag - pullPolicy: "IfNotPresent" - livenessProbeImage: - repository: #@ get_image_repo_for_component(csiLivenessProbeImage) - path: #@ csiLivenessProbeImage.imagePath - tag: #@ csiLivenessProbeImage.tag - pullPolicy: "IfNotPresent" - vsphereSyncerImage: - repository: #@ get_image_repo_for_component(csiSyncerImage) - path: #@ csiSyncerImage.imagePath - tag: #@ csiSyncerImage.tag - pullPolicy: "IfNotPresent" - CSIProvisionerImage: - repository: #@ get_image_repo_for_component(csiProvisionerImage) - path: #@ csiProvisionerImage.imagePath - tag: #@ csiProvisionerImage.tag - pullPolicy: "IfNotPresent" - CSINodeDriverRegistrarImage: - repository: #@ get_image_repo_for_component(csiDriverRegistrarImage) - path: #@ csiDriverRegistrarImage.imagePath - tag: #@ csiDriverRegistrarImage.tag - pullPolicy: "IfNotPresent" -#@ end - namespace: kube-system - clusterName: #@ data.values.CLUSTER_NAME - tlsThumbprint: #@ get_vsphere_thumbprint() - server: #@ data.values.VSPHERE_SERVER - datacenter: #@ data.values.VSPHERE_DATACENTER - publicNetwork: #@ data.values.VSPHERE_NETWORK - username: #@ data.values.VSPHERE_USERNAME - password: #@ data.values.VSPHERE_PASSWORD - region: #@ data.values.VSPHERE_REGION - zone: #@ data.values.VSPHERE_ZONE - insecureFlag: #@ data.values.VSPHERE_INSECURE - vSphereVersion: #@ data.values.VSPHERE_VERSION - http_proxy: #@ data.values.TKG_HTTP_PROXY - https_proxy: #@ data.values.TKG_HTTPS_PROXY - no_proxy: #@ get_no_proxy() - useTopologyCategories: #@ enableTopologyCatogories() - #@ if data.values.CLUSTER_PLAN == "dev": - deployment_replicas: 1 - #@ else: - deployment_replicas: 3 - #@ end -#@ end diff --git a/providers/ytt/02_addons/csi/csi_secret.yaml b/providers/ytt/02_addons/csi/csi_secret.yaml deleted file mode 100644 index ae433124f2..0000000000 --- a/providers/ytt/02_addons/csi/csi_secret.yaml +++ /dev/null @@ -1,24 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "ValuesFormatStr",) -#@ load("csi_addon_data.lib.yaml", "vsphere_csi_data_values") - -#@ if data.values.PROVIDER_TYPE == "vsphere" and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-vsphere-csi-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: "vsphere-csi" - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - clusterctl.cluster.x-k8s.io/move: "" - #@ end - annotations: - tkg.tanzu.vmware.com/addon-type: "csi/vsphere-csi" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(vsphere_csi_data_values())) -#@ end diff --git a/providers/ytt/02_addons/kapp-controller/add_kapp-controller.yaml b/providers/ytt/02_addons/kapp-controller/add_kapp-controller.yaml deleted file mode 100644 index 95eb46d918..0000000000 --- a/providers/ytt/02_addons/kapp-controller/add_kapp-controller.yaml +++ /dev/null @@ -1,66 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:template", "template") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "ValuesFormatStr") -#@ load("kapp-controller_overlay.lib.yaml", "kappcontrolleroverlay") -#@ load("kapp-controller_addon_data.lib.yaml", "kappcontrollerdatavalues") -#@ load("/vendir/kapp-controller/kapp-controller.lib.yaml", "kapp_controller_lib") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere" and data.values.TKG_CLUSTER_ROLE != "workload": - -#@ if data.values.DISABLE_CRS_FOR_ADDON_TYPE and "addons-management/kapp-controller" in data.values.DISABLE_CRS_FOR_ADDON_TYPE: ---- #@ template.replace(overlay.apply(kapp_controller_lib.with_data_values(kappcontrollerdatavalues()).eval(), kappcontrolleroverlay())) - -#@ else: ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-kapp-controller".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/kapp-controller" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-kapp-controller-crs".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-kapp-controller-crs".format(data.values.CLUSTER_NAME) - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/kapp-controller" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(overlay.apply(kapp_controller_lib.with_data_values(kappcontrollerdatavalues()).eval(), kappcontrolleroverlay())) - -#@ end -#@ end - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere" and data.values.TKG_CLUSTER_ROLE == "workload": - ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-kapp-controller-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: "kapp-controller" - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - clusterctl.cluster.x-k8s.io/move: "" - annotations: - tkg.tanzu.vmware.com/remote-app: "true" - tkg.tanzu.vmware.com/addon-type: "addons-management/kapp-controller" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(kappcontrollerdatavalues())) - -#@ end diff --git a/providers/ytt/02_addons/kapp-controller/kapp-controller_addon_data.lib.yaml b/providers/ytt/02_addons/kapp-controller/kapp-controller_addon_data.lib.yaml deleted file mode 100644 index fd77d709bd..0000000000 --- a/providers/ytt/02_addons/kapp-controller/kapp-controller_addon_data.lib.yaml +++ /dev/null @@ -1,55 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:base64", "base64") -#@ load("/lib/helpers.star", "get_no_proxy") -#@ load("/lib/helpers.star", "tkg_image_repo", "tkg_image_repo_customized", "tkg_image_repo_ca_cert", "tkg_image_repo_skip_tls_verify", "tkg_image_repo_hostname") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "get_image_repo_for_component") - -#@ def kappcontrollerdatavalues(): -#@ bomData = get_bom_data_for_tkr_name() -#@ kappControllerImage = bomData.components["kapp-controller"][0].images.kappControllerImage -kappController: - namespace: tkg-system - createNamespace: true - globalNamespace: tanzu-package-repo-global -#@ if data.values.TKG_CLUSTER_ROLE == "workload": #! For backwards compatibility. i.e. C.1 mgmt cluster creates a C.0 wlc with older addon templates. - image: #! For backwards compatibility. i.e. C.1 mgmt cluster creates a C.0 wlc with older addon templates. - repository: #@ get_image_repo_for_component(kappControllerImage) - path: #@ kappControllerImage.imagePath - tag: #@ kappControllerImage.tag - pullPolicy: IfNotPresent -#@ end - deployment: - concurrency: 4 - coreDNSIP: #@ data.values.CORE_DNS_IP - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" -#@ if data.values.TKG_CLUSTER_ROLE == "workload": #! For mgmt cluster tolerations needs to be added using overlay due to ytt's array handling behavior - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" -#@ end - config: - #@ if tkg_image_repo_ca_cert(): - caCerts: #@ base64.decode(tkg_image_repo_ca_cert()) - #@ end - #@ if data.values.TKG_HTTP_PROXY: - httpProxy: #@ data.values.TKG_HTTP_PROXY - httpsProxy: #@ data.values.TKG_HTTPS_PROXY - noProxy: #@ get_no_proxy() - #@ end - #@ if tkg_image_repo_skip_tls_verify(): - dangerousSkipTLSVerify: #@ tkg_image_repo_hostname() - #@ end -#@ end diff --git a/providers/ytt/02_addons/kapp-controller/kapp-controller_overlay.lib.yaml b/providers/ytt/02_addons/kapp-controller/kapp-controller_overlay.lib.yaml deleted file mode 100644 index ae5afe96b0..0000000000 --- a/providers/ytt/02_addons/kapp-controller/kapp-controller_overlay.lib.yaml +++ /dev/null @@ -1,54 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:base64", "base64") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "get_image_repo_for_component") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ bomData = get_bom_data_for_tkr_name() -#@ end - -#@ def kappcontrolleroverlay(): - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "kapp-controller"}}) ---- -metadata: - annotations: - #@overlay/remove - kbld.k14s.io/images: "" -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name":"kapp-controller"}) - - image: #@ "{}/{}:{}".format(get_image_repo_for_component(bomData.components["kapp-controller"][0].images.kappControllerImage), bomData.components["kapp-controller"][0].images.kappControllerImage.imagePath, bomData.components["kapp-controller"][0].images.kappControllerImage.tag) - #@overlay/match by=overlay.subset({"name":"kapp-controller-sidecarexec"}) - - image: #@ "{}/{}:{}".format(get_image_repo_for_component(bomData.components["kapp-controller"][0].images.kappControllerImage), bomData.components["kapp-controller"][0].images.kappControllerImage.imagePath, bomData.components["kapp-controller"][0].images.kappControllerImage.tag) - #@overlay/match missing_ok=True - initContainers: - #@overlay/match by=overlay.subset({"name":"init-kapp-controller"}), missing_ok=True - - image: #@ "{}/{}:{}".format(get_image_repo_for_component(bomData.components["kapp-controller"][0].images.kappControllerImage), bomData.components["kapp-controller"][0].images.kappControllerImage.imagePath, bomData.components["kapp-controller"][0].images.kappControllerImage.tag) - #@overlay/match missing_ok=True - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - -#@overlay/match by=overlay.all,expects="1+" ---- -#@overlay/match missing_ok=True -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - tkg.tanzu.vmware.com/addon-type: "addons-management/kapp-controller" - -#@ end diff --git a/providers/ytt/02_addons/management-packages/add_management_package_repo.yaml b/providers/ytt/02_addons/management-packages/add_management_package_repo.yaml deleted file mode 100644 index 0d22f75ec6..0000000000 --- a/providers/ytt/02_addons/management-packages/add_management_package_repo.yaml +++ /dev/null @@ -1,52 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "get_default_tkg_bom_data", "get_image_repo_for_component") - -#@ def management_package_repo(): -#@ management_package_repo_bundle = get_default_tkg_bom_data().components["tanzu-framework-management-packages"][0].images.tanzuFrameworkManagementPackageRepositoryImage -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageRepository -metadata: - name: tanzu-management - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package-repo" -spec: - fetch: - imgpkgBundle: - image: #@ "{}/{}:{}".format(get_image_repo_for_component(management_package_repo_bundle), management_package_repo_bundle.imagePath, management_package_repo_bundle.tag) -#@ end - -#@ if data.values.TKG_CLUSTER_ROLE != "workload" and data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ if data.values.DISABLE_CRS_FOR_ADDON_TYPE and "packages/management-package-repo" in data.values.DISABLE_CRS_FOR_ADDON_TYPE: ---- #@ management_package_repo() -#@ else: ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-management-package-repository".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package-repo" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-management-package-repository-crs".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-management-package-repository-crs".format(data.values.CLUSTER_NAME) - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package-repo" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(management_package_repo()) -#@ end -#@ end diff --git a/providers/ytt/02_addons/management-packages/core-management-plugins/add_core_management_plugins_package.yaml b/providers/ytt/02_addons/management-packages/core-management-plugins/add_core_management_plugins_package.yaml deleted file mode 100644 index 497f25d814..0000000000 --- a/providers/ytt/02_addons/management-packages/core-management-plugins/add_core_management_plugins_package.yaml +++ /dev/null @@ -1,112 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:template", "template") - -#@ def core_management_plugins_package_install_definition(): ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tanzu-core-management-plugins-package-sa - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-core-management-plugins-package-cluster-role - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" -rules: - - apiGroups: - - "" - resources: - - configmaps - verbs: - - create - - update - - get - - apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - create - - update - - get - - apiGroups: - - cli.tanzu.vmware.com - resources: - - cliplugins - verbs: - - create - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-core-management-plugins-package-cluster-rolebinding - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-core-management-plugins-package-cluster-role -subjects: - - kind: ServiceAccount - name: tanzu-core-management-plugins-package-sa - namespace: tkg-system ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tanzu-core-management-plugins - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" -spec: - serviceAccountName: tanzu-core-management-plugins-package-sa - packageRef: - refName: core-management-plugins.tanzu.vmware.com - versionSelection: - prereleases: {} ---- -#@ end - -#@ if data.values.TKG_CLUSTER_ROLE != "workload" and data.values.PROVIDER_TYPE != "tkg-service-vsphere": - -#@ if data.values.DISABLE_CRS_FOR_ADDON_TYPE and "packages/management-package-repo" in data.values.DISABLE_CRS_FOR_ADDON_TYPE: ---- #@ template.replace(core_management_plugins_package_install_definition()) -#@ else: ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-core-management-plugins-package".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-core-management-plugins-package-crs".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-core-management-plugins-package-crs".format(data.values.CLUSTER_NAME) - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(core_management_plugins_package_install_definition()) -#@ end -#@ end diff --git a/providers/ytt/02_addons/management-packages/featuregates/add_featuregates_package.yaml b/providers/ytt/02_addons/management-packages/featuregates/add_featuregates_package.yaml deleted file mode 100644 index 1f1f5c527d..0000000000 --- a/providers/ytt/02_addons/management-packages/featuregates/add_featuregates_package.yaml +++ /dev/null @@ -1,246 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:template", "template") - -#@ def featuregates_package_install_definition(): ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tanzu-featuregates-package-sa - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-featuregates-package-cluster-role - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" -rules: - - apiGroups: - - "" - resources: - - configmaps - - serviceaccounts - - services - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - apps - resources: - - deployments - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - cert-manager.io - resources: - - issuers - - certificates - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - admissionregistration.k8s.io - resources: - - validatingwebhookconfigurations - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - rbac.authorization.k8s.io - resources: - - clusterroles - - clusterrolebindings - verbs: - - create - - update - - get - - list - - delete - - apiGroups: - - config.tanzu.vmware.com - resources: - - featuregates - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - config.tanzu.vmware.com - resources: - - featuregates/status - verbs: - - get - - patch - - update - - apiGroups: - - config.tanzu.vmware.com - resources: - - features - verbs: - - get - - list - - watch - - apiGroups: - - config.tanzu.vmware.com - resources: - - features/status - verbs: - - get - - patch - - update - - apiGroups: - - "" - resources: - - namespaces - verbs: - - get - - list - - watch - - apiGroups: - - core.tanzu.vmware.com - resources: - - featuregates - verbs: - - get - - list - - patch - - update - - watch - - apiGroups: - - core.tanzu.vmware.com - resources: - - featuregates/status - verbs: - - get - - patch - - update - - apiGroups: - - core.tanzu.vmware.com - resources: - - features - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - core.tanzu.vmware.com - resources: - - features/status - verbs: - - get - - patch - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-featuregates-package-cluster-rolebinding - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-featuregates-package-cluster-role -subjects: - - kind: ServiceAccount - name: tanzu-featuregates-package-sa - namespace: tkg-system ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tanzu-featuregates - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" -spec: - serviceAccountName: tanzu-featuregates-package-sa - packageRef: - refName: featuregates.tanzu.vmware.com - versionSelection: - prereleases: {} - values: - - secretRef: - name: tanzu-featuregates-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: tanzu-featuregates-values - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" -type: Opaque -stringData: - values.yaml: | - namespace: tkg-system -#@ end - -#@ if data.values.TKG_CLUSTER_ROLE != "workload" and data.values.PROVIDER_TYPE != "tkg-service-vsphere" : -#@ if data.values.DISABLE_CRS_FOR_ADDON_TYPE and "packages/management-package" in data.values.DISABLE_CRS_FOR_ADDON_TYPE: ---- #@ template.replace(featuregates_package_install_definition()) -#@ else: ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-featuregates-package".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-featuregates-package-crs".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-featuregates-package-crs".format(data.values.CLUSTER_NAME) - annotations: - tkg.tanzu.vmware.com/addon-type: "packages/management-package" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(featuregates_package_install_definition()) -#@ end -#@ end diff --git a/providers/ytt/02_addons/metadata/add_cluster_metadata.yaml b/providers/ytt/02_addons/metadata/add_cluster_metadata.yaml deleted file mode 100644 index 0f6c2147e4..0000000000 --- a/providers/ytt/02_addons/metadata/add_cluster_metadata.yaml +++ /dev/null @@ -1,182 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:template", "template") -#@ load("/lib/helpers.star", "get_default_tkg_bom_data", "get_provider", "get_kubernetes_provider") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": - -#@ def tkgmetadataoverlay(): - -#@overlay/match by=overlay.all,expects="1+" ---- -#@overlay/match missing_ok=True -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - tkg.tanzu.vmware.com/addon-type: "metadata/tkg" - -#@ end - - -#@ def get_bom_configmap(): ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: tkg-bom - namespace: tkg-system-public -data: - bom.yaml: #@ yaml.encode(get_default_tkg_bom_data()) -#@ end - -#@ def get_metadata(): ---- -cluster: - name: #@ data.values.CLUSTER_NAME - type: #@ data.values.TKG_CLUSTER_ROLE - plan: #@ data.values.CLUSTER_PLAN - kubernetesProvider: #@ get_kubernetes_provider() - tkgVersion: #@ data.values.TKG_VERSION - edition: #@ data.values.BUILD_EDITION - infrastructure: - provider: #@ get_provider() -bom: - configmapRef: - name: tkg-bom -#@ end - -#@ def get_metadata_configmap(): ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: tkg-metadata - namespace: tkg-system-public -data: - metadata.yaml: #@ yaml.encode(get_metadata()) -#@ end - - -#@ def get_metadata_namespace_role(): ---- -apiVersion: v1 -kind: Namespace -metadata: - name: tkg-system-public ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: tkg-metadata-reader - namespace: tkg-system-public -rules: -- apiGroups: - - "" - resourceNames: - - tkg-metadata - - tkg-bom - resources: - - configmaps - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: tkg-metadata-reader - namespace: tkg-system-public -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: tkg-metadata-reader -subjects: -- apiGroup: rbac.authorization.k8s.io - kind: Group - name: system:authenticated -#@ end - -#@ def get_metadata_crs_name(): -#@ return "{}-tkg-metadata".format(data.values.CLUSTER_NAME) -#@ end - - -#@ def get_metadata_crs_secret_namespace_role_name(): -#@ return "{}-namespace-role".format(get_metadata_crs_name()) -#@ end - -#@ def get_metadata_crs_secret_configmap_name(): -#@ return "{}-configmap".format(get_metadata_crs_name()) -#@ end - -#@ def get_metadata_crs_secret_bom_configmap_name(): -#@ return "{}-bom-configmap".format(get_metadata_crs_name()) -#@ end - -#@ if data.values.DISABLE_CRS_FOR_ADDON_TYPE and "metadata/tkg" in data.values.DISABLE_CRS_FOR_ADDON_TYPE: ---- #@ template.replace(overlay.apply(get_metadata_namespace_role(),tkgmetadataoverlay())) ---- #@ template.replace(overlay.apply(get_metadata_configmap(),tkgmetadataoverlay())) ---- #@ template.replace(overlay.apply(get_bom_configmap(),tkgmetadataoverlay())) - -#@ else: - ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ get_metadata_crs_secret_namespace_role_name() - annotations: - tkg.tanzu.vmware.com/addon-type: "metadata/tkg" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(overlay.apply(get_metadata_namespace_role(),tkgmetadataoverlay())) - ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ get_metadata_crs_secret_configmap_name() - annotations: - tkg.tanzu.vmware.com/addon-type: "metadata/tkg" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(overlay.apply(get_metadata_configmap(),tkgmetadataoverlay())) - ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ get_metadata_crs_secret_bom_configmap_name() - annotations: - tkg.tanzu.vmware.com/addon-type: "metadata/tkg" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(overlay.apply(get_bom_configmap(),tkgmetadataoverlay())) - ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ get_metadata_crs_name() - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "metadata/tkg" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ get_metadata_crs_secret_namespace_role_name() - kind: Secret - - name: #@ get_metadata_crs_secret_configmap_name() - kind: Secret - - name: #@ get_metadata_crs_secret_bom_configmap_name() - kind: Secret -#@ end - -#@ end diff --git a/providers/ytt/02_addons/metrics-server/metrics_server_secret.yaml b/providers/ytt/02_addons/metrics-server/metrics_server_secret.yaml deleted file mode 100644 index f236a26e42..0000000000 --- a/providers/ytt/02_addons/metrics-server/metrics_server_secret.yaml +++ /dev/null @@ -1,51 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "get_image_repo_for_component", "ValuesFormatStr") - -#@ def metrics_server_config(): -#@ bomData = get_bom_data_for_tkr_name() -#@ metricsServerImage = bomData.components["metrics-server"][0].images.metricsServerImage ---- -metricsServer: - namespace: kube-system - createNamespace: false - config: - args: [] #! Add any command args here - probe: - failureThreshold: 3 - periodSeconds: 10 - apiServiceInsecureTLS: true -#@ if data.values.TKG_CLUSTER_ROLE == "workload": #! For backwards compatibility. i.e. C.1 mgmt cluster creates a C.0 wlc with older addon templates. -#@ if data.values.IS_WINDOWS_WORKLOAD_CLUSTER: #! For Windows we need to allow the metric-server to run on the control plane nodes - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane -#@ end - image: - name: #@ metricsServerImage.imagePath - tag: #@ metricsServerImage.tag - repository: #@ get_image_repo_for_component(metricsServerImage) - pullPolicy: IfNotPresent -#@ end - -#@ end - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-metrics-server-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: metrics-server - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - clusterctl.cluster.x-k8s.io/move: "" - annotations: - tkg.tanzu.vmware.com/addon-type: "metrics/metrics-server" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(metrics_server_config())) -#@ end diff --git a/providers/ytt/02_addons/package-repos/add_package-repos.yaml b/providers/ytt/02_addons/package-repos/add_package-repos.yaml deleted file mode 100644 index 69874cb410..0000000000 --- a/providers/ytt/02_addons/package-repos/add_package-repos.yaml +++ /dev/null @@ -1,63 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "get_image_repo_for_component") - -#! This file contains the logic to install package repos on clusters. We need to install core package repo when provision -#! a management cluster or workload clusters. The installation of PackageRepository CR is done by CRS, CRS will retry -#! in the case if the PackageRepository CRD does not exist. PackageRepository CRD will be created as part of the deployment -#! of kapp-controller, but we could not guarantee kapp-controller could be deployed prior to this. - -#@ def core_package_repo(): -#! The reason to have bomData.components["tkg-core-packages"] instead of bomData.components.tkg-core-packages is because -#! YTT does not allow - to be used as .tkg-core-packages. -#@ core_package_repo_bundle = get_bom_data_for_tkr_name().components["tkg-core-packages"][0].images.tanzuCorePackageRepositoryImage -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageRepository -metadata: - #! The core package repository name is hardcoded internally under core/addons/constants/constants.go - #! Addons Manager will read it and reconcile. - name: tanzu-core - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/core-package-repo" -spec: - fetch: - imgpkgBundle: - image: #@ "{}/{}:{}".format(get_image_repo_for_component(core_package_repo_bundle), core_package_repo_bundle.imagePath, core_package_repo_bundle.tag) -#@ end - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#! We need to install core package repository on both mgmt cluster and workload clusters because it contains the bundles -#! for all core addons which are needed on all clusters. -#@ if data.values.DISABLE_CRS_FOR_ADDON_TYPE and "addons-management/core-package-repo" in data.values.DISABLE_CRS_FOR_ADDON_TYPE: ---- #@ core_package_repo() -#@ else: ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-core-package-repository".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/core-package-repo" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-core-package-repository-crs".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-core-package-repository-crs".format(data.values.CLUSTER_NAME) - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/core-package-repo" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(core_package_repo()) -#@ end -#@ end diff --git a/providers/ytt/02_addons/public-cloud-csi/add_aws_csi_driver.yaml b/providers/ytt/02_addons/public-cloud-csi/add_aws_csi_driver.yaml deleted file mode 100644 index dc65f13685..0000000000 --- a/providers/ytt/02_addons/public-cloud-csi/add_aws_csi_driver.yaml +++ /dev/null @@ -1,24 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "ValuesFormatStr") -#@ load("ebs/aws-ebs-csi-driver_data.lib.yaml", "ebsdatavalues") - -#@ if data.values.PROVIDER_TYPE == "aws" and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-aws-ebs-csi-driver-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: "aws-ebs-csi-driver" - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - clusterctl.cluster.x-k8s.io/move: "" - #@ end - annotations: - tkg.tanzu.vmware.com/addon-type: "csi/aws-ebs-csi-driver" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(ebsdatavalues())) -#@ end diff --git a/providers/ytt/02_addons/public-cloud-csi/add_azure_csi_driver.yaml b/providers/ytt/02_addons/public-cloud-csi/add_azure_csi_driver.yaml deleted file mode 100644 index 67dafe4fec..0000000000 --- a/providers/ytt/02_addons/public-cloud-csi/add_azure_csi_driver.yaml +++ /dev/null @@ -1,24 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "ValuesFormatStr") -#@ load("disk/azuredisk-csi-driver_data.lib.yaml", "diskdatavalues") - -#@ if data.values.PROVIDER_TYPE == "azure" and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-azuredisk-csi-driver-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: "azuredisk-csi-driver" - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - clusterctl.cluster.x-k8s.io/move: "" - #@ end - annotations: - tkg.tanzu.vmware.com/addon-type: "csi/azuredisk-csi-driver" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(diskdatavalues())) -#@ end diff --git a/providers/ytt/02_addons/public-cloud-csi/add_azurefile_csi_driver.yaml b/providers/ytt/02_addons/public-cloud-csi/add_azurefile_csi_driver.yaml deleted file mode 100644 index 27d043992b..0000000000 --- a/providers/ytt/02_addons/public-cloud-csi/add_azurefile_csi_driver.yaml +++ /dev/null @@ -1,24 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "ValuesFormatStr") -#@ load("file/azurefile-csi-driver_data.lib.yaml", "filedatavalues") - -#@ if data.values.PROVIDER_TYPE == "azure" and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-azurefile-csi-driver-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: "azurefile-csi-driver" - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - clusterctl.cluster.x-k8s.io/move: "" - #@ end - annotations: - tkg.tanzu.vmware.com/addon-type: "csi/azurefile-csi-driver" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(filedatavalues())) -#@ end diff --git a/providers/ytt/02_addons/public-cloud-csi/disk/azuredisk-csi-driver_data.lib.yaml b/providers/ytt/02_addons/public-cloud-csi/disk/azuredisk-csi-driver_data.lib.yaml deleted file mode 100644 index 1d73cccf98..0000000000 --- a/providers/ytt/02_addons/public-cloud-csi/disk/azuredisk-csi-driver_data.lib.yaml +++ /dev/null @@ -1,16 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "get_no_proxy") - -#@ def diskdatavalues(): -azureDiskCSIDriver: - namespace: kube-system - http_proxy: #@ data.values.TKG_HTTP_PROXY - https_proxy: #@ data.values.TKG_HTTPS_PROXY - no_proxy: #@ get_no_proxy() - #@ if data.values.CLUSTER_PLAN == "dev": - deployment_replicas: 1 - #@ else: - deployment_replicas: 3 - #@ end -#@ end diff --git a/providers/ytt/02_addons/public-cloud-csi/ebs/aws-ebs-csi-driver_data.lib.yaml b/providers/ytt/02_addons/public-cloud-csi/ebs/aws-ebs-csi-driver_data.lib.yaml deleted file mode 100644 index dfec6c80aa..0000000000 --- a/providers/ytt/02_addons/public-cloud-csi/ebs/aws-ebs-csi-driver_data.lib.yaml +++ /dev/null @@ -1,16 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "get_no_proxy") - -#@ def ebsdatavalues(): -awsEBSCSIDriver: - namespace: kube-system - http_proxy: #@ data.values.TKG_HTTP_PROXY - https_proxy: #@ data.values.TKG_HTTPS_PROXY - no_proxy: #@ get_no_proxy() - #@ if data.values.CLUSTER_PLAN == "dev": - deployment_replicas: 1 - #@ else: - deployment_replicas: 3 - #@ end -#@ end diff --git a/providers/ytt/02_addons/public-cloud-csi/file/azurefile-csi-driver_data.lib.yaml b/providers/ytt/02_addons/public-cloud-csi/file/azurefile-csi-driver_data.lib.yaml deleted file mode 100644 index b4c3deacef..0000000000 --- a/providers/ytt/02_addons/public-cloud-csi/file/azurefile-csi-driver_data.lib.yaml +++ /dev/null @@ -1,16 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "get_no_proxy") - -#@ def filedatavalues(): -azureFileCSIDriver: - namespace: kube-system - http_proxy: #@ data.values.TKG_HTTP_PROXY - https_proxy: #@ data.values.TKG_HTTPS_PROXY - no_proxy: #@ get_no_proxy() - #@ if data.values.CLUSTER_PLAN == "dev": - deployment_replicas: 1 - #@ else: - deployment_replicas: 3 - #@ end -#@ end diff --git a/providers/ytt/02_addons/secretgen-controller/add_secretgen-controller.yaml b/providers/ytt/02_addons/secretgen-controller/add_secretgen-controller.yaml deleted file mode 100644 index 15064ff49c..0000000000 --- a/providers/ytt/02_addons/secretgen-controller/add_secretgen-controller.yaml +++ /dev/null @@ -1,25 +0,0 @@ -#@ load("@ytt:template", "template") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "ValuesFormatStr") -#@ load("secretgen-controller_addon_data.lib.yaml", "secretgencontrollerdatavalues") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere" and data.values.SECRETGEN_CONTROLLER_ENABLE and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-secretgen-controller-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: "secretgen-controller" - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - #@ if data.values.TKG_CLUSTER_ROLE != "workload": - clusterctl.cluster.x-k8s.io/move: "" - #@ end - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/secretgen-controller" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(secretgencontrollerdatavalues())) -#@ end diff --git a/providers/ytt/02_addons/secretgen-controller/secretgen-controller_addon_data.lib.yaml b/providers/ytt/02_addons/secretgen-controller/secretgen-controller_addon_data.lib.yaml deleted file mode 100644 index e73aed1080..0000000000 --- a/providers/ytt/02_addons/secretgen-controller/secretgen-controller_addon_data.lib.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#@ load("@ytt:yaml", "yaml") - -#@ def secretgencontrollerdatavalues(): -secretgenController: - namespace: tanzu-system - createNamespace: true -#@ end diff --git a/providers/ytt/02_addons/standard-repo/add_standard_repo.yaml b/providers/ytt/02_addons/standard-repo/add_standard_repo.yaml deleted file mode 100644 index 1fec44d8c1..0000000000 --- a/providers/ytt/02_addons/standard-repo/add_standard_repo.yaml +++ /dev/null @@ -1,58 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "get_default_tkg_bom_data", "get_image_repo_for_component") - -#! This file contains the logic to install standard package repo on clusters. We need to install standard package repo when provisioning -#! a management cluster or workload clusters. The installation of PackageRepository CR is done by CRS, CRS will retry -#! in the case if the PackageRepository CRD does not exist. PackageRepository CRD will be created as part of the deployment -#! of kapp-controller, but we could not guarantee kapp-controller could be deployed prior to this. - -#@ def standard_package_repo(): -#! The reason to have bomData.components["tkg-standard-packages"] instead of bomData.components.tkg-standard-packages is because -#! YTT does not allow - to be used as .tkg-standard-packages -#@ standard_package_repo_bundle = get_default_tkg_bom_data().components["tkg-standard-packages"][0].images.tanzuStandardPackageRepositoryImage -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageRepository -metadata: - name: tanzu-standard - namespace: tanzu-package-repo-global - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/standard-package-repo" - tanzu.vmware.com/owner: "tkg" -spec: - fetch: - imgpkgBundle: - image: #@ "{}/{}:{}".format(get_image_repo_for_component(standard_package_repo_bundle), standard_package_repo_bundle.imagePath, standard_package_repo_bundle.tag) -#@ end - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere" and data.values.BUILD_EDITION == "tkg": -#! We need to install standard package repository on both management cluster and workload clusters because it contains the bundles -#! for all standard addons which can be optionally installed. ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-standard-package-repository".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/standard-package-repo" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-standard-package-repository-crs".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-standard-package-repository-crs".format(data.values.CLUSTER_NAME) - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/standard-package-repo" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(standard_package_repo()) -#@ end diff --git a/providers/ytt/02_addons/tanzu-addons-manager/add_tanzu-addons-manager.yaml b/providers/ytt/02_addons/tanzu-addons-manager/add_tanzu-addons-manager.yaml deleted file mode 100644 index 6783ac7669..0000000000 --- a/providers/ytt/02_addons/tanzu-addons-manager/add_tanzu-addons-manager.yaml +++ /dev/null @@ -1,61 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:template", "template") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "ValuesFormatStr") -#@ load("tanzu-addons-manager_package.lib.yaml", "tanzuaddonsmanagerpackageyaml") -#@ load("tanzu-addons-manager_addon_data.lib.yaml", "tanzuaddonsmanagerdatavalues") -#@ load("tanzu-addons-manager_overlay.lib.yaml", "tanzuaddonsmanageroverlay") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere" and data.values.TKG_CLUSTER_ROLE != "workload": - -#@ if data.values.DISABLE_CRS_FOR_ADDON_TYPE and "addons-management/tanzu-addons-manager" in data.values.DISABLE_CRS_FOR_ADDON_TYPE: ---- #@ template.replace(overlay.apply(tanzuaddonsmanagerpackageyaml(), tanzuaddonsmanageroverlay())) - -#@ else: ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-tanzu-addons-manager-package".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/tanzu-addons-manager" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-tanzu-addons-manager-package-crs".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-tanzu-addons-manager-package-crs".format(data.values.CLUSTER_NAME) - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/tanzu-addons-manager" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(overlay.apply(tanzuaddonsmanagerpackageyaml(), tanzuaddonsmanageroverlay())) - -#@ end ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-tanzu-addons-manager-addon".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: "tanzu-addons-manager" - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - clusterctl.cluster.x-k8s.io/move: "" - annotations: - tkg.tanzu.vmware.com/addon-type: "addons-management/tanzu-addons-manager" -type: tkg.tanzu.vmware.com/addon -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(tanzuaddonsmanagerdatavalues())) - -#@ end diff --git a/providers/ytt/02_addons/tanzu-addons-manager/tanzu-addons-manager_addon_data.lib.yaml b/providers/ytt/02_addons/tanzu-addons-manager/tanzu-addons-manager_addon_data.lib.yaml deleted file mode 100644 index b23bfb145f..0000000000 --- a/providers/ytt/02_addons/tanzu-addons-manager/tanzu-addons-manager_addon_data.lib.yaml +++ /dev/null @@ -1,39 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "tkg_image_repo") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ tanzuAddonsManagerImage = get_bom_data_for_tkr_name().components["tanzu-framework-addons"][0].images.tanzuAddonsManagerImage -#@ end - -#@ def tanzuaddonsmanagerdatavalues(): - ---- -tanzuAddonsManager: - namespace: tkg-system - createNamespace: false - deployment: - hostNetwork: true - priorityClassName: system-cluster-critical - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - featureGates: - clusterBootstrapController: false -#@ end - - -#@ def tanzuaddonsmanagerimageinfodatavalues(): ---- -imageInfo: - imageRepository: #@ tkg_image_repo() - imagePullPolicy: IfNotPresent - images: - tanzuAddonsManagerImage: - imagePath: #@ tanzuAddonsManagerImage.imagePath - tag: #@ tanzuAddonsManagerImage.tag - -#@ end diff --git a/providers/ytt/02_addons/tanzu-addons-manager/tanzu-addons-manager_overlay.lib.yaml b/providers/ytt/02_addons/tanzu-addons-manager/tanzu-addons-manager_overlay.lib.yaml deleted file mode 100644 index 067da1be25..0000000000 --- a/providers/ytt/02_addons/tanzu-addons-manager/tanzu-addons-manager_overlay.lib.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#@ load("@ytt:overlay", "overlay") - -#@ def tanzuaddonsmanageroverlay(): - -#@overlay/match by=overlay.all,expects="1+" ---- -#@overlay/match missing_ok=True -metadata: - #@overlay/match missing_ok=True - annotations: - ext.packaging.carvel.dev/ytt-data-values-overlays: "tanzu-addons-manager-data-values" - tkg.tanzu.vmware.com/addon-type: "addons-management/tanzu-addons-manager" - -#@ end diff --git a/providers/ytt/02_addons/tanzu-addons-manager/tanzu-addons-manager_package.lib.yaml b/providers/ytt/02_addons/tanzu-addons-manager/tanzu-addons-manager_package.lib.yaml deleted file mode 100644 index 7a352f22e4..0000000000 --- a/providers/ytt/02_addons/tanzu-addons-manager/tanzu-addons-manager_package.lib.yaml +++ /dev/null @@ -1,69 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "get_bom_data_for_tkr_name", "get_image_repo_for_component", "ValuesFormatStr") -#@ load("tanzu-addons-manager_addon_data.lib.yaml", "tanzuaddonsmanagerdatavalues", "tanzuaddonsmanagerimageinfodatavalues") - -#@ def tanzuaddonsmanagerpackageyaml(): -#@ tanzuAddonsManagerPackageBundle = get_bom_data_for_tkr_name().components["tkg-core-packages"][0].images["addons-manager.tanzu.vmware.com"] ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tanzu-addons-package-sa - namespace: tkg-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-addons-package-cluster-role -rules: -- apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-addons-package-cluster-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-addons-package-cluster-role -subjects: -- kind: ServiceAccount - name: tanzu-addons-package-sa - namespace: tkg-system ---- -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: tanzu-addons-manager - namespace: tkg-system -spec: - serviceAccountName: tanzu-addons-package-sa - packageRef: - #! PackageName is available in TKR BOM under the particular path listed below. We do not have to validate the key existence - #! is because YTT will throw error if any struct is None or keys are missing, we expect to see those error and templating - #! will be exit immediately. - refName: #@ get_bom_data_for_tkr_name().addons["tanzu-addons-manager"].packageName - #! In alpha9 release, kapp-controller's implementation shows this field is optional, - #! however InstalledPackage CR has error status if not provide versionSelection. - #! It complains about "Unsupported version selection type (currently supported: semver)" from this CR. - #! To workaround, we add versionSelection and use the tag from TKR Bom as version constraints, and this is also aligned - #! with what package CLI plugin does. - versionSelection: - prereleases: {} - values: - - secretRef: - name: tanzu-addons-manager-data-values ---- -apiVersion: v1 -kind: Secret -metadata: - name: tanzu-addons-manager-data-values - namespace: tkg-system -type: Opaque -stringData: - values.yaml: #@ ValuesFormatStr.format(yaml.encode(tanzuaddonsmanagerdatavalues())) - -#@ end diff --git a/providers/ytt/03_customizations/01_tkr/add_tkr.yaml b/providers/ytt/03_customizations/01_tkr/add_tkr.yaml deleted file mode 100644 index 149ad1dcd6..0000000000 --- a/providers/ytt/03_customizations/01_tkr/add_tkr.yaml +++ /dev/null @@ -1,45 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:template", "template") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("tkr.lib.yaml", "tkryaml") -#@ load("tkr_overlay.lib.yaml", "tkroverlay") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere" and data.values.TKG_CLUSTER_ROLE != "workload": - -#@ if data.values.DISABLE_CRS_FOR_ADDON_TYPE and "tkr/tkr-controller" in data.values.DISABLE_CRS_FOR_ADDON_TYPE: ---- #@ template.replace(overlay.apply(tkryaml(), tkroverlay())) - -#@ else: - ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-tkr".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "tkr/tkr-controller" -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-tkr".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-tkr".format(data.values.CLUSTER_NAME) - annotations: - tkg.tanzu.vmware.com/addon-type: "tkr/tkr-controller" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(overlay.apply(tkryaml(), tkroverlay())) - -#@ end - -#@ end diff --git a/providers/ytt/03_customizations/01_tkr/tkr.lib.yaml b/providers/ytt/03_customizations/01_tkr/tkr.lib.yaml deleted file mode 100644 index c38d30615b..0000000000 --- a/providers/ytt/03_customizations/01_tkr/tkr.lib.yaml +++ /dev/null @@ -1,363 +0,0 @@ -#@ def tkryaml(): ---- -apiVersion: v1 -kind: Namespace -metadata: - labels: - control-plane: controller-manager - name: tkr-system ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: tkr-controller-config - namespace: tkr-system -data: - caCerts: "" - imageRepository: "" ---- - -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.7.0 - creationTimestamp: null - name: tanzukubernetesreleases.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: TanzuKubernetesRelease - listKind: TanzuKubernetesReleaseList - plural: tanzukubernetesreleases - shortNames: - - tkr - singular: tanzukubernetesrelease - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .status.conditions[?(@.type=='Compatible')].status - name: Compatible - type: string - - jsonPath: .metadata.creationTimestamp - name: Created - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: TanzuKubernetesRelease is the schema for the tanzukubernetesreleases - API. TanzuKubernetesRelease objects represent Kubernetes releases available - via TKG, which can be used to create TanzuKubernetesCluster instances. TKRs - are immutable to end-users. They are created and managed by TKG to provide - discovery of Kubernetes releases to TKG users. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: TanzuKubernetesReleaseSpec defines the desired state of TanzuKubernetesRelease - properties: - images: - description: Images is the list of (other than Kubernetes core) essential - container images shipped by this TKR (e.g. coredns, etcd). - items: - description: ContainerImage is a struct representing a single fully - qualified container image name, constructed as `{Repository}/{Name}:{Tag}`. - properties: - name: - description: Name is the container image name without the repository - prefix. It MUST be a valid URI path, MAY contain zero or more - '/', and SHOULD NOT start or end with '/'. - type: string - repository: - description: Repository is the container image repository used - by this image. It MUST be a DNS-compatible name. - type: string - tag: - description: Tag is the container image version tag. It is the - suffix coming after ':' in a fully qualified image name. - type: string - required: - - name - type: object - type: array - kubernetesVersion: - description: KubernetesVersion is the fully qualified Semantic Versioning - conformant version of Kubernetes shipped by this TKR. The same KubernetesVersion - MAY be shipped by different TKRs. - type: string - nodeImageRef: - description: NodeImageRef refers to an object representing the image - used to create TKC nodes (e.g. VirtualMachineImage). - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - repository: - description: Repository is the container image repository for Kubernetes - core images, such as kube-apiserver, kube-proxy, etc. It MUST be - a DNS-compatible name. - type: string - version: - description: Version is the fully qualified Semantic Versioning conformant - version of the TanzuKubernetesRelease. Version MUST be unique across - all TanzuKubernetesRelease objects. - type: string - required: - - version - type: object - status: - description: TanzuKubernetesReleaseStatus defines the observed state of - TanzuKubernetesRelease - properties: - conditions: - items: - description: Condition defines an observation of a Cluster API resource - operational state. - properties: - lastTransitionTime: - description: Last time the condition transitioned from one status - to another. This should be when the underlying condition changed. - If that is not known, then using the time when the API field - changed is acceptable. - format: date-time - type: string - message: - description: A human readable message indicating details about - the transition. This field may be empty. - type: string - reason: - description: The reason for the condition's last transition - in CamelCase. The specific API may choose whether or not this - field is considered a guaranteed API. This field may not be - empty. - type: string - severity: - description: Severity provides an explicit classification of - Reason code, so the users or machines can immediately understand - the current situation and act accordingly. The Severity field - MUST be set only when Status=False. - type: string - status: - description: Status of the condition, one of True, False, Unknown. - type: string - type: - description: Type of condition in CamelCase or in foo.example.com/CamelCase. - Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. - type: string - required: - - lastTransitionTime - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: tkr-leader-election-role - namespace: tkr-system -rules: -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - "" - resources: - - configmaps/status - verbs: - - get - - update - - patch -- apiGroups: - - "" - resources: - - events - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - creationTimestamp: null - name: tkr-manager-role -rules: -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - verbs: - - create - - delete - - get - - list - - patch - - update - - watch -- apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases/status - verbs: - - get - - patch - - update -- apiGroups: - - cluster.x-k8s.io - resources: - - clusters - - clusters/status - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - configmaps - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create - - get - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: tkr-leader-election-rolebinding - namespace: tkr-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: tkr-leader-election-role -subjects: -- kind: ServiceAccount - name: default - namespace: tkr-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tkr-manager-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tkr-manager-role -subjects: -- kind: ServiceAccount - name: default - namespace: tkr-system ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - control-plane: controller-manager - name: tkr-controller-manager - namespace: tkr-system -spec: - replicas: 1 - selector: - matchLabels: - control-plane: controller-manager - template: - metadata: - labels: - control-plane: controller-manager - spec: - containers: - - args: - - --enable-leader-election - command: - - /manager -#! The prod registry does not use a latest tag, but the image tag will be overlayed based on the BoM file being used - image: projects.registry.vmware.com/tkg/tanzu_core/tkr/tkr-controller-manager:latest - imagePullPolicy: Always - name: manager - resources: - limits: - cpu: 100m - memory: 100Mi - requests: - cpu: 100m - memory: 20Mi - terminationGracePeriodSeconds: 10 -#@ end diff --git a/providers/ytt/03_customizations/01_tkr/tkr_overlay.lib.yaml b/providers/ytt/03_customizations/01_tkr/tkr_overlay.lib.yaml deleted file mode 100644 index 978af7cc7e..0000000000 --- a/providers/ytt/03_customizations/01_tkr/tkr_overlay.lib.yaml +++ /dev/null @@ -1,74 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:base64", "base64") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:regexp", "regexp") -#@ load("/lib/helpers.star", "get_default_tkg_bom_data", "tkg_image_repo", "get_image_repo_for_component","get_no_proxy","tkg_image_repo_skip_tls_verify","tkg_image_repo_ca_cert","tkg_image_repo_customized") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ bomData = get_default_tkg_bom_data() -#@ bomImagePath = getattr(bomData, "tkr-bom").imagePath -#@ bomImageRepo = get_image_repo_for_component(getattr(bomData, "tkr-bom")) -#@ compatibilityImagePath = getattr(bomData, "tkr-compatibility").imagePath -#@ compatibilityImageRepo = get_image_repo_for_component(getattr(bomData, "tkr-compatibility")) -#@ end - -#@ def tkroverlay(): - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "tkr-controller-manager"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name":"manager"}) - #! TODO: Consume image from BOM - - image: #@ "{}/{}:{}".format(get_image_repo_for_component(bomData.components["tanzu-framework"][0].images.tkrImage), bomData.components["tanzu-framework"][0].images.tkrImage.imagePath, bomData.components["tanzu-framework"][0].images.tkrImage.tag) - args: - #! TODO: Consume bom-image-path from BOM - #@overlay/append - - #@ "--bom-image-path={}/{}".format(bomImageRepo,bomImagePath) - #! TODO: Consume bom-metadata-image-path from BOM - #@overlay/append - - #@ "--bom-metadata-image-path={}/{}".format(compatibilityImageRepo, compatibilityImagePath) - #@overlay/append - - #@ "--skip-verify-registry-cert={}".format(tkg_image_repo_skip_tls_verify()) - #@overlay/append - - #@ "--continuous-discover-frequency={}".format(data.values.TKR_DISCOVER_FREQUENCY) - #@ if data.values.TKG_HTTP_PROXY != "": - #@overlay/match missing_ok=True - env: - - name: http_proxy - value: #@ data.values.TKG_HTTP_PROXY - - name: HTTP_PROXY - value: #@ data.values.TKG_HTTP_PROXY - - name: https_proxy - value: #@ data.values.TKG_HTTPS_PROXY - - name: HTTPS_PROXY - value: #@ data.values.TKG_HTTPS_PROXY - - name: no_proxy - value: #@ get_no_proxy() - - name: NO_PROXY - value: #@ get_no_proxy() - #@ end - -#@overlay/match by=overlay.subset({"kind":"ConfigMap","metadata":{"name": "tkr-controller-config"}}) ---- -data: - #@ if tkg_image_repo_ca_cert(): - caCerts: #@ base64.decode(tkg_image_repo_ca_cert()) - #@ end - #@ if tkg_image_repo_customized(): - imageRepository: #@ tkg_image_repo() - #@ end - -#@overlay/match by=overlay.all,expects="1+" ---- -#@overlay/match missing_ok=True -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - tkg.tanzu.vmware.com/addon-type: "tkr/tkr-controller" - -#@ end diff --git a/providers/ytt/03_customizations/02_avi/add-ako.yaml b/providers/ytt/03_customizations/02_avi/add-ako.yaml deleted file mode 100644 index 97f24d06c7..0000000000 --- a/providers/ytt/03_customizations/02_avi/add-ako.yaml +++ /dev/null @@ -1,17 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:json", "json") - -#! render the ako artifacts -#@ if data.values.PROVIDER_TYPE == "vsphere" and data.values.TKG_CLUSTER_ROLE != "workload" and data.values.AVI_ENABLE and data.values.AVI_CONTROL_PLANE_HA_PROVIDER: - -#@ load("ako-deployment.lib.yaml", "avi_secret", "ako_serviceaccount", -#@ "ako_configmap", "ako_clusterrole", "ako_clusterrolebinding", -#@ "ako_statefulset") - ---- #@ avi_secret() ---- #@ ako_serviceaccount() ---- #@ ako_configmap() ---- #@ ako_clusterrole() ---- #@ ako_clusterrolebinding() ---- #@ ako_statefulset() -#@ end diff --git a/providers/ytt/03_customizations/02_avi/add-avi-labels.yaml b/providers/ytt/03_customizations/02_avi/add-avi-labels.yaml deleted file mode 100644 index c68aa12584..0000000000 --- a/providers/ytt/03_customizations/02_avi/add-avi-labels.yaml +++ /dev/null @@ -1,20 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:json", "json") -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:template", "template") - - -#! Label workload cluster if AVI_LABELS is specified - -#@ if data.values.PROVIDER_TYPE == "vsphere" and data.values.TKG_CLUSTER_ROLE != "management" and data.values.AVI_LABELS: -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - #@overlay/match-child-defaults missing_ok=True - labels: - _: #@ template.replace(data.values.AVI_LABELS) -#@ end - - diff --git a/providers/ytt/03_customizations/02_avi/add_akoo.yaml b/providers/ytt/03_customizations/02_avi/add_akoo.yaml deleted file mode 100644 index c7b4dc8737..0000000000 --- a/providers/ytt/03_customizations/02_avi/add_akoo.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:json", "json") - -#@ if data.values.PROVIDER_TYPE == "vsphere" and data.values.TKG_CLUSTER_ROLE != "workload" and data.values.AVI_ENABLE and data.values.AVI_CONTROL_PLANE_HA_PROVIDER: -#@ load("rbac.lib.yaml", "role", "role_binding") -#@ load("ako-operator-deployment.lib.yaml", "akoo_deployment", "avi_credentials", "avi_certificate") - ---- #@ role() ---- #@ role_binding() ---- #@ akoo_deployment() ---- #@ avi_credentials() ---- #@ avi_certificate() -#@ end diff --git a/providers/ytt/03_customizations/02_avi/ako-deployment.lib.yaml b/providers/ytt/03_customizations/02_avi/ako-deployment.lib.yaml deleted file mode 100644 index 3d96512a0b..0000000000 --- a/providers/ytt/03_customizations/02_avi/ako-deployment.lib.yaml +++ /dev/null @@ -1,271 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:base64", "base64") -#@ load("@ytt:json", "json") -#@ load("/lib/helpers.star", "get_default_tkr_bom_data", "get_default_tkg_bom_data", "tkg_image_repo") - -#@ akoRepo = get_default_tkr_bom_data().components["load-balancer-and-ingress-service"][0] - -#@ def ako_image_with_tag(): -#@ return "{}/{}:{}".format(tkg_image_repo(), akoRepo.images.loadBalancerAndIngressServiceImage.imagePath, akoRepo.images.loadBalancerAndIngressServiceImage.tag) -#@ end - -#@ def cluster_namespaced_name(): -#@ return "{}-{}".format("tkg-system", data.values.CLUSTER_NAME) -#@ end - -#@ def ako_name(): -#@ return "ako-{}".format(cluster_namespaced_name()) -#@ end - -#! input cidr example 10.0.0.0/24 -#! output "10.0.0.0" and "24" -#@ def network_cidr(): -#@ if data.values.AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME and data.values.AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR: -#@ cidr = data.values.AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR -#@ else: -#@ if data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME and data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR: -#@ cidr = data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR -#@ else: -#@ cidr = data.values.AVI_DATA_NETWORK_CIDR -#@ end -#@ end -#@ return cidr -#@ end - -#@ def network_name(): -#@ if data.values.AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME and data.values.AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR: -#@ name = data.values.AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME -#@ else: -#@ if data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME and data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR: -#@ name = data.values.AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME -#@ else: -#@ name = data.values.AVI_DATA_NETWORK -#@ end -#@ end -#@ return name -#@ end - -#@ def vip_network(): -#@ return json.encode([{ "networkName": network_name(), "cidr": network_cidr() }]) -#@ end - -#@ def avi_secret(): -apiVersion: v1 -kind: Secret -metadata: - name: avi-secret - namespace: tkg-system -type: Opaque -data: - username: #@ base64.encode(data.values.AVI_USERNAME) - password: #@ base64.encode(data.values.AVI_PASSWORD) - certificateAuthorityData: #@ data.values.AVI_CA_DATA_B64 -#@ end - - -#@ def ako_serviceaccount(): -apiVersion: v1 -kind: ServiceAccount -metadata: - name: ako-sa - namespace: tkg-system -#@ end - -#@ def ako_configmap(): -apiVersion: v1 -kind: ConfigMap -metadata: - name: avi-k8s-config - namespace: tkg-system -data: - controllerIP: #@ data.values.AVI_CONTROLLER - cniPlugin: #@ data.values.CNI - fullSyncFrequency: "1800" - cloudName: #@ data.values.AVI_CLOUD_NAME - clusterName: #@ cluster_namespaced_name() - disableStaticRouteSync: #@ "{}".format(data.values.AVI_DISABLE_STATIC_ROUTE_SYNC).lower() - defaultIngController: #@ "{}".format(data.values.AVI_INGRESS_DEFAULT_INGRESS_CONTROLLER).lower() - logLevel: "WARN" - deleteConfig: "false" - serviceType: NodePort -#@ if data.values.AVI_NSXT_T1LR: - nsxtT1LR: #@ data.values.AVI_NSXT_T1LR -#@ end -#@ if data.values.AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP: - serviceEngineGroupName: #@ data.values.AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP -#@ else: - serviceEngineGroupName: #@ data.values.AVI_SERVICE_ENGINE_GROUP -#@ end - vipNetworkList: #@ vip_network() - apiServerPort: "8080" -#@ end - -#@ def ako_clusterrole(): -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: ako-cr -rules: - - apiGroups: [""] - resources: ["*"] - verbs: ['get', 'watch', 'list'] - - apiGroups: ["apps"] - resources: ["statefulsets"] - verbs: ["get","watch","list"] - - apiGroups: ["apps"] - resources: ["statefulsets/status"] - verbs: ["get","watch","list","patch", "update"] - - apiGroups: ["extensions", "networking.k8s.io"] - resources: ["ingresses", "ingresses/status", "ingressclasses"] - verbs: ["get","watch","list","patch", "update"] - - apiGroups: [""] - resources: ["services", "services/status", "secrets"] - verbs: ["get","watch","list","patch", "update"] - - apiGroups: [""] - resources: ["services"] - verbs: ["get", "watch", "list", "patch"] - - apiGroups: ["crd.projectcalico.org"] - resources: ["blockaffinities"] - verbs: ["get", "watch", "list"] - - apiGroups: ["network.openshift.io"] - resources: ["hostsubnets"] - verbs: ["get", "watch", "list"] - - apiGroups: ["route.openshift.io"] - resources: ["routes", "routes/status"] - verbs: ["get", "watch", "list", "patch", "update"] - - apiGroups: ["ako.vmware.com"] - resources: ["hostrules", "hostrules/status", "httprules", "httprules/status", "aviinfrasettings", "aviinfrasettings/status"] - verbs: ["get","watch","list","patch", "update"] - - apiGroups: ["networking.x-k8s.io"] - resources: ["gateways", "gateways/status", "gatewayclasses", "gatewayclasses/status"] - verbs: ["get","watch","list","patch", "update"] -#@ end - -#@ def ako_clusterrolebinding(): -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: ako-crb -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: ako-cr -subjects: - - kind: ServiceAccount - name: ako-sa - namespace: tkg-system -#@ end - - -#@ def ako_statefulset(): -apiVersion: apps/v1 -kind: StatefulSet -metadata: - name: ako - namespace: tkg-system - labels: - app.kubernetes.io/name: #@ ako_name() - app.kubernetes.io/version: #@ akoRepo.images.loadBalancerAndIngressServiceImage.tag -spec: - replicas: 1 - serviceName: ako - selector: - matchLabels: - app.kubernetes.io/name: #@ ako_name() - template: - metadata: - labels: - app.kubernetes.io/name: #@ ako_name() - spec: - serviceAccountName: ako-sa - securityContext: {} - containers: - - name: #@ ako_name() - securityContext: null - image: #@ ako_image_with_tag() - imagePullPolicy: #@ data.values.AVI_AKO_IMAGE_PULL_POLICY - env: - - name: CTRL_IPADDRESS - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: controllerIP - - name: CNI_PLUGIN - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: cniPlugin - - name: FULL_SYNC_INTERVAL - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: fullSyncFrequency - - name: CLOUD_NAME - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: cloudName - - name: CLUSTER_NAME - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: clusterName - - name: DISABLE_STATIC_ROUTE_SYNC - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: disableStaticRouteSync - - name: DEFAULT_ING_CONTROLLER - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: defaultIngController - - name: SEG_NAME - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: serviceEngineGroupName - - name: VIP_NETWORK_LIST - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: vipNetworkList - - name: AKO_API_PORT - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: apiServerPort - - name: SERVICE_TYPE - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: serviceType - #@ if data.values.AVI_NSXT_T1LR: - - name: NSXT_T1_LR - valueFrom: - configMapKeyRef: - name: avi-k8s-config - key: nsxtT1LR - #@ end - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - resources: - limits: - cpu: "350m" - memory: "400Mi" - requests: - cpu: "50m" - memory: "50Mi" - livenessProbe: - httpGet: - path: /api/status - port: 8080 - initialDelaySeconds: 10 - periodSeconds: 10 -#@ end diff --git a/providers/ytt/03_customizations/02_avi/ako-operator-deployment.lib.yaml b/providers/ytt/03_customizations/02_avi/ako-operator-deployment.lib.yaml deleted file mode 100644 index 380d78a5e4..0000000000 --- a/providers/ytt/03_customizations/02_avi/ako-operator-deployment.lib.yaml +++ /dev/null @@ -1,82 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:base64", "base64") -#@ load("/lib/helpers.star", "get_default_tkr_bom_data", "get_default_tkg_bom_data", "tkg_image_repo") - -#@ akooRepo = get_default_tkr_bom_data().components["ako-operator"][0] -#@ akoRepo = get_default_tkr_bom_data().components["load-balancer-and-ingress-service"][0] - -#@ def labels(): -app: tanzu-ako-operator -#@ end - -#@ def ako_operator_image(): -#@ return "{}/{}:{}".format(tkg_image_repo(), akooRepo.images.akoOperatorImage.imagePath, akooRepo.images.akoOperatorImage.tag) -#@ end - -#@ def ako_image(): -#@ return "{}/{}".format(tkg_image_repo(), akoRepo.images.loadBalancerAndIngressServiceImage.imagePath) -#@ end - -#@ def avi_credentials(): -apiVersion: v1 -kind: Secret -metadata: - name: #@ data.values.AVI_ADMIN_CREDENTIAL_NAME - namespace: tkg-system -type: Opaque -data: - username: #@ base64.encode(data.values.AVI_USERNAME) - password: #@ base64.encode(data.values.AVI_PASSWORD) -#@ end - -#@ def avi_certificate(): -apiVersion: v1 -kind: Secret -metadata: - name: #@ data.values.AVI_CA_NAME - namespace: tkg-system -type: Opaque -data: - certificateAuthorityData: #@ data.values.AVI_CA_DATA_B64 -#@ end - -#@ def akoo_deployment(): -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: #@ labels() - name: ako-operator-controller-manager - namespace: #@ data.values.AVI_NAMESPACE -spec: - replicas: 1 - selector: - matchLabels: #@ labels() - template: - metadata: - labels: #@ labels() - spec: - containers: - - args: - - --metrics-addr=127.0.0.1:8080 - command: - - /manager - image: #@ ako_operator_image() - name: manager - env: - - name: bootstrap_cluster - value: "True" - - name: avi_control_plane_ha_provider - value: #@ "{}".format(data.values.AVI_CONTROL_PLANE_HA_PROVIDER) - - name: tkg_management_cluster_name - value: #@ data.values.CLUSTER_NAME - - name: control_plane_endpoint_port - value: #@ "{}".format(data.values.VSPHERE_CONTROL_PLANE_ENDPOINT_PORT) - resources: - limits: - cpu: 100m - memory: 300Mi - requests: - cpu: 50m - memory: 20Mi - terminationGracePeriodSeconds: 10 -#@ end diff --git a/providers/ytt/03_customizations/02_avi/rbac.lib.yaml b/providers/ytt/03_customizations/02_avi/rbac.lib.yaml deleted file mode 100644 index 5acafc2607..0000000000 --- a/providers/ytt/03_customizations/02_avi/rbac.lib.yaml +++ /dev/null @@ -1,81 +0,0 @@ -#! RBAC for AKO Operator in bootstrap cluster -#@ def role(): -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: tanzu-ako-operator - name: ako-operator-manager-bootstrap -rules: - - apiGroups: [""] - resources: ["*"] - verbs: ["create", "delete", "update", "get", "watch", "patch", "list"] - - apiGroups: ["apps"] - resources: ["statefulsets"] - verbs: ["create", "delete", "update", "get","watch","list"] - - apiGroups: ["apps"] - resources: ["statefulsets/status"] - verbs: ["create", "delete", "update", "get","watch","list","patch", "update"] - - apiGroups: ["apiextensions.k8s.io"] - resources: ["customresourcedefinitions"] - verbs: ["create", "delete", "update", "get", "watch", "list"] - - apiGroups: ["rbac.authorization.k8s.io"] - resources: ["clusterroles","clusterrolebindings"] - verbs: ["create", "delete", "update", "get", "watch", "list"] - - apiGroups: ["cluster.x-k8s.io"] - resources: ["clusters", "clusters/status", "machines", "machines/status"] - verbs: ["create", "delete", "update", "get","watch","list", "patch"] - - apiGroups: ["networking.tkg.tanzu.vmware.com"] - resources: ["akodeploymentconfigs"] - verbs: ["create", "delete", "update", "get","watch","list", "patch"] - - apiGroups: ["networking.tkg.tanzu.vmware.com"] - resources: ["akodeploymentconfigs/status"] - verbs: ["update", "get","watch", "patch"] - - apiGroups: ["extensions", "networking.k8s.io"] - resources: ["ingresses", "ingresses/status"] - verbs: ["get","watch","list","patch", "update"] - - apiGroups: [""] - resources: ["services/status"] - verbs: ["get","watch","list","patch", "update"] - - apiGroups: ["crd.projectcalico.org"] - resources: ["blockaffinities"] - verbs: ["get", "watch", "list"] - - apiGroups: ["network.openshift.io"] - resources: ["hostsubnets"] - verbs: ["get", "watch", "list"] - - apiGroups: ["route.openshift.io"] - resources: ["routes", "routes/status"] - verbs: ["get", "watch", "list", "patch", "update"] - - apiGroups: ["ako.vmware.com"] - resources: ["aviinfrasettings", "aviinfrasettings/status", "hostrules", "hostrules/status", "httprules", "httprules/status"] - verbs: ["get", "watch", "list", "patch", "update"] - - apiGroups: ["networking.x-k8s.io"] - resources: ["gateways", "gateways/status", "gatewayclasses", "gatewayclasses/status"] - verbs: ["get","watch","list","patch", "update"] - - apiGroups: - - policy - - extensions - resources: - - podsecuritypolicies - verbs: - - use - resourceNames: - - "*" -#@ end - -#@ def role_binding(): -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app: tanzu-ako-operator - name: ako-operator-bootstrap-rolebinding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: ako-operator-manager-bootstrap -subjects: - - kind: ServiceAccount - name: default - namespace: tkg-system -#@ end diff --git a/providers/ytt/03_customizations/03_windows/prevent_windows_updates.yaml b/providers/ytt/03_customizations/03_windows/prevent_windows_updates.yaml deleted file mode 100644 index c3ed487331..0000000000 --- a/providers/ytt/03_customizations/03_windows/prevent_windows_updates.yaml +++ /dev/null @@ -1,19 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#! TODO: This should be moved into a windows-compatible cluster class template -#@ if data.values.IS_WINDOWS_WORKLOAD_CLUSTER: -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}), expects="1+" ---- -spec: - template: - spec: - files: - #@overlay/append - - path: c:\k\prevent_windows_updates.ps1 - content: | - Set-Service -Name "wuauserv" -StartupType Disabled -Status Stopped - postKubeadmCommands: - #@overlay/append - - powershell c:/k/prevent_windows_updates.ps1 -ExecutionPolicy Bypass -#@ end diff --git a/providers/ytt/03_customizations/03_windows/register_antrea_cleanup.yaml b/providers/ytt/03_customizations/03_windows/register_antrea_cleanup.yaml deleted file mode 100644 index 18e76ffe83..0000000000 --- a/providers/ytt/03_customizations/03_windows/register_antrea_cleanup.yaml +++ /dev/null @@ -1,64 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#! TODO: This should be moved into a windows-compatible cluster class template -#@ if data.values.IS_WINDOWS_WORKLOAD_CLUSTER: -#@ if data.values.CNI == "antrea": -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}), expects="1+" ---- -spec: - template: - spec: - files: - #@overlay/append - - path: C:\k\antrea_cleanup.ps1 - content: | - stop-service antrea-agent -ErrorAction SilentlyContinue - C:\k\antrea\Clean-AntreaNetwork.ps1 - #@overlay/append - - path: C:\k\register_antrea_cleanup.ps1 - content: | - $methodScript = "C:\k\antrea\Clean-AntreaNetwork.ps1" - if (Test-Path "$methodScript") { - $cleanScriptPath = "C:\k\antrea_cleanup.ps1" - $method = "Shutdown" - $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy" - $RegScriptsPath = "$RegPath\Scripts\$method\0" - $RegSmScriptsPath = "$RegPath\State\Machine\Scripts\$method\0" - # Create the path if not exist - $gpoPath = "$ENV:systemRoot\System32\GroupPolicy\Machine" - $methodPath = "$gpoPath\Scripts\$method" - if (-not (Test-Path $methodPath)) { - New-Item -path $methodPath -itemType Directory - } - # Create sub-path - $items = @("$RegScriptsPath\0", "$RegSmScriptsPath\0") - foreach ($item in $items) { - if (-not (Test-Path $item)) { - New-Item -path $item -force - } - } - # Register callback script to GPO - $items = @("$RegScriptsPath", "$RegSmScriptsPath") - foreach ($item in $items) { - New-ItemProperty -path "$item" -name DisplayName -propertyType String -value "Local Group Policy" -force - New-ItemProperty -path "$item" -name FileSysPath -propertyType String -value "$gpoPath" -force - New-ItemProperty -path "$item" -name GPO-ID -propertyType String -value "LocalGPO" -force - New-ItemProperty -path "$item" -name GPOName -propertyType String -value "Local Group Policy" -force - New-ItemProperty -path "$item" -name PSScriptOrder -propertyType DWord -value 2 -force - New-ItemProperty -path "$item" -name SOM-ID -propertyType String -value "Local" -force - } - $BinaryString = "00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00" - $ExecTime = $BinaryString.Split(',') | ForEach-Object {"0x$_"} - $items = @("$RegScriptsPath\0", "$RegSmScriptsPath\0") - foreach ($item in $items) { - New-ItemProperty -path "$item" -name Script -propertyType String -value $cleanScriptPath -force - New-ItemProperty -path "$item" -name Parameters -propertyType String -value $method -force - New-ItemProperty -path "$item" -name IsPowershell -propertyType DWord -value 1 -force - New-ItemProperty -path "$item" -name ExecTime -propertyType Binary -value ([byte[]]$ExecTime) -force - } - } - postKubeadmCommands: - #@overlay/append - - powershell C:/k/register_antrea_cleanup.ps1 -ExecutionPolicy Bypass -#@ end -#@ end diff --git a/providers/ytt/03_customizations/add_certificate_rotation.yaml b/providers/ytt/03_customizations/add_certificate_rotation.yaml deleted file mode 100644 index eeb8e2c80f..0000000000 --- a/providers/ytt/03_customizations/add_certificate_rotation.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ if data.values.CONTROLPLANE_CERTIFICATE_ROTATION_ENABLED: -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -spec: - #@overlay/match missing_ok=True - rolloutBefore: - #@overlay/match missing_ok=True - certificatesExpiryDays: #@ data.values.CONTROLPLANE_CERTIFICATE_ROTATION_DAYS_BEFORE -#@ end diff --git a/providers/ytt/03_customizations/add_mhc.yaml b/providers/ytt/03_customizations/add_mhc.yaml deleted file mode 100644 index b80aec6210..0000000000 --- a/providers/ytt/03_customizations/add_mhc.yaml +++ /dev/null @@ -1,49 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ if (data.values.ENABLE_MHC != False and data.values.ENABLE_MHC_WORKER_NODE) or data.values.ENABLE_MHC: ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineHealthCheck -metadata: - name: #@ data.values.CLUSTER_NAME -spec: - clusterName: #@ data.values.CLUSTER_NAME - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - selector: - matchLabels: - node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME) - unhealthyConditions: - #@overlay/match by=overlay.map_key("status") - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - #@overlay/match by=overlay.map_key("status") - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT -#@ end ---- -#@ if (data.values.ENABLE_MHC != False and data.values.ENABLE_MHC_CONTROL_PLANE) or data.values.ENABLE_MHC: -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineHealthCheck -metadata: - name: #@ "{}-control-plane".format(data.values.CLUSTER_NAME) -spec: - clusterName: #@ data.values.CLUSTER_NAME - nodeStartupTimeout: #@ data.values.NODE_STARTUP_TIMEOUT - selector: - matchLabels: - cluster.x-k8s.io/control-plane: "" - unhealthyConditions: - #@overlay/match by=overlay.map_key("status") - - type: Ready - status: Unknown - timeout: #@ data.values.MHC_UNKNOWN_STATUS_TIMEOUT - #@overlay/match by=overlay.map_key("status") - - type: Ready - status: "False" - timeout: #@ data.values.MHC_FALSE_STATUS_TIMEOUT -#@ end -#@ end diff --git a/providers/ytt/03_customizations/add_sc.yaml b/providers/ytt/03_customizations/add_sc.yaml deleted file mode 100644 index b3a6bf4e75..0000000000 --- a/providers/ytt/03_customizations/add_sc.yaml +++ /dev/null @@ -1,129 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("/lib/helpers.star", "enable_csi_driver") - - -#@ def aws_storage_class(): ---- -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: default - annotations: - storageclass.kubernetes.io/is-default-class: "true" -#@ if enable_csi_driver(): -provisioner: ebs.csi.aws.com -#@ else: -provisioner: kubernetes.io/aws-ebs -#@ end -allowVolumeExpansion: true -#@ end - - -#@ def vsphere_storage_class(): ---- -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: default - annotations: - storageclass.kubernetes.io/is-default-class: "true" -provisioner: csi.vsphere.vmware.com -allowVolumeExpansion: true -#@ if data.values.VSPHERE_STORAGE_POLICY_ID != "": -parameters: - storagepolicyname: #@ data.values.VSPHERE_STORAGE_POLICY_ID -#@ end -#@ end - - -#@ def azure_storage_class(): ---- -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: default - annotations: - storageclass.kubernetes.io/is-default-class: "true" - labels: - kubernetes.io/cluster-service: "true" -#@ if enable_csi_driver(): -provisioner: disk.csi.azure.com -#@ else: -provisioner: kubernetes.io/azure-disk -#@ end -allowVolumeExpansion: true -parameters: - kind: Managed - storageaccounttype: Standard_LRS - cachingmode: ReadOnly -volumeBindingMode: WaitForFirstConsumer -#@ end - -#@ def azurefile_storage_class(): ---- -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: default - annotations: - storageclass.kubernetes.io/is-default-class: "true" - labels: - kubernetes.io/cluster-service: "true" -#@ if enable_csi_driver(): -provisioner: file.csi.azure.com -#@ else: -provisioner: kubernetes.io/azure-file -#@ end -allowVolumeExpansion: true -mountOptions: - - dir_mode=0777 - - file_mode=0777 - - uid=0 - - gid=0 - - mfsymlinks - - cache=strict - - actimeo=30 -parameters: - skuName: Premium_LRS -#@ end - - -#@ if data.values.TKG_CLUSTER_ROLE == "workload" and data.values.ENABLE_DEFAULT_STORAGE_CLASS and data.values.PROVIDER_TYPE != "tkg-service-vsphere" and data.values.PROVIDER_TYPE != "docker": ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-default-storage-class".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-default-storage-class".format(data.values.CLUSTER_NAME) - kind: Secret - ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-default-storage-class".format(data.values.CLUSTER_NAME) -type: addons.cluster.x-k8s.io/resource-set -stringData: -#@ if data.values.PROVIDER_TYPE == "vsphere": - value: #@ yaml.encode(vsphere_storage_class()) -#@ end - -#@ if data.values.PROVIDER_TYPE == "aws": - value: #@ yaml.encode(aws_storage_class()) -#@ end - -#@ if data.values.PROVIDER_TYPE == "azure": - value: #@ yaml.encode(azure_storage_class()) -#@ end -#@ end - diff --git a/providers/ytt/03_customizations/annotate_os_info.yaml b/providers/ytt/03_customizations/annotate_os_info.yaml deleted file mode 100644 index 06b3c8dd97..0000000000 --- a/providers/ytt/03_customizations/annotate_os_info.yaml +++ /dev/null @@ -1,12 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - osInfo: #@ "{},{},{}".format(data.values.OS_NAME, data.values.OS_VERSION, data.values.OS_ARCH) diff --git a/providers/ytt/03_customizations/audit-logging/audit_logging.yaml b/providers/ytt/03_customizations/audit-logging/audit_logging.yaml deleted file mode 100644 index 8e28ee8d85..0000000000 --- a/providers/ytt/03_customizations/audit-logging/audit_logging.yaml +++ /dev/null @@ -1,179 +0,0 @@ -#@ load("@ytt:assert", "assert") -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:base64", "base64") -#@ load("@ytt:yaml", "yaml") - -#@ def audit_policy(): -apiVersion: audit.k8s.io/v1 -kind: Policy -rules: - #! The following requests were manually identified as high-volume and low-risk, - #! so drop them. - - level: None - users: ["system:serviceaccount:kube-system:kube-proxy"] - verbs: ["watch"] - resources: - - group: "" #! core - resources: ["endpoints", "services", "services/status"] - - level: None - userGroups: ["system:nodes"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["nodes", "nodes/status"] - - level: None - users: - - system:kube-controller-manager - - system:kube-scheduler - - system:serviceaccount:kube-system:endpoint-controller - verbs: ["get", "update"] - namespaces: ["kube-system"] - resources: - - group: "" #! core - resources: ["endpoints"] - - level: None - users: ["system:apiserver"] - verbs: ["get"] - resources: - - group: "" #! core - resources: ["namespaces", "namespaces/status", "namespaces/finalize"] - #! Don't log HPA fetching metrics. - - level: None - users: - - system:kube-controller-manager - verbs: ["get", "list"] - resources: - - group: "metrics.k8s.io" - #! Don't log these read-only URLs. - - level: None - nonResourceURLs: - - /healthz* - - /version - - /swagger* - #! Don't log events requests. - - level: None - resources: - - group: "" #! core - resources: ["events"] - #! Don't log TMC service account performing read operations because they are high-volume. - - level: None - userGroups: ["system:serviceaccounts:vmware-system-tmc"] - verbs: ["get", "list", "watch"] - #! Don't log read requests from garbage collector because they are high-volume. - - level: None - users: ["system:serviceaccount:kube-system:generic-garbage-collector"] - verbs: ["get", "list", "watch"] - #! node and pod status calls from nodes are high-volume and can be large, don't log responses for expected updates from nodes - - level: Request - userGroups: ["system:nodes"] - verbs: ["update","patch"] - resources: - - group: "" #! core - resources: ["nodes/status", "pods/status"] - omitStages: - - "RequestReceived" - #! deletecollection calls can be large, don't log responses for expected namespace deletions - - level: Request - users: ["system:serviceaccount:kube-system:namespace-controller"] - verbs: ["deletecollection"] - omitStages: - - "RequestReceived" - #! Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data, - #! so only log at the Metadata level. - - level: Metadata - resources: - - group: "" #! core - resources: ["secrets", "configmaps"] - - group: authentication.k8s.io - resources: ["tokenreviews"] - omitStages: - - "RequestReceived" - #! Get repsonses can be large; skip them. - - level: Request - verbs: ["get", "list", "watch"] - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for known APIs - - level: RequestResponse - resources: - - group: "" #! core - - group: "admissionregistration.k8s.io" - - group: "apiextensions.k8s.io" - - group: "apiregistration.k8s.io" - - group: "apps" - - group: "authentication.k8s.io" - - group: "authorization.k8s.io" - - group: "autoscaling" - - group: "batch" - - group: "certificates.k8s.io" - - group: "extensions" - - group: "metrics.k8s.io" - - group: "networking.k8s.io" - - group: "policy" - - group: "rbac.authorization.k8s.io" - - group: "settings.k8s.io" - - group: "storage.k8s.io" - omitStages: - - "RequestReceived" - #! Default level for all other requests. - - level: Metadata - omitStages: - - "RequestReceived" - -#@ end - -#@ if data.values.ENABLE_AUDIT_LOGGING: -#@ if data.values.PROVIDER_TYPE in ["vsphere", "aws", "azure", "docker"]: -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -spec: - #@overlay/match-child-defaults missing_ok=True - kubeadmConfigSpec: - clusterConfiguration: - apiServer: - extraArgs: - audit-log-path: /var/log/kubernetes/audit.log - audit-policy-file: /etc/kubernetes/audit-policy.yaml - audit-log-maxage: "30" - audit-log-maxbackup: "10" - audit-log-maxsize: "100" - extraVolumes: - #@overlay/append - - name: audit-policy - hostPath: /etc/kubernetes/audit-policy.yaml - mountPath: /etc/kubernetes/audit-policy.yaml - #@overlay/append - - name: audit-logs - hostPath: /var/log/kubernetes - mountPath: /var/log/kubernetes - - files: - #@overlay/append - - path: /etc/kubernetes/audit-policy.yaml - owner: "root:root" - permissions: "0600" - encoding: base64 - #! See "audit-config.yaml" for reference, this is just that file base64'd - content: #@ base64.encode(yaml.encode(audit_policy())) - -#@ end -#@ end diff --git a/providers/ytt/03_customizations/autoscaler/autoscaler_overlay.yaml b/providers/ytt/03_customizations/autoscaler/autoscaler_overlay.yaml deleted file mode 100644 index 4d3080d395..0000000000 --- a/providers/ytt/03_customizations/autoscaler/autoscaler_overlay.yaml +++ /dev/null @@ -1,36 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ if data.values.TKG_CLUSTER_ROLE == "workload" and data.values.ENABLE_AUTOSCALER and data.values.PROVIDER_TYPE != "tkg-service-vsphere": - -#@overlay/match by=overlay.subset({"kind":"MachineDeployment", "metadata": {"name": data.values.CLUSTER_NAME + "-md-0"}}), missing_ok=True ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - #@overlay/match missing_ok=True - annotations: - cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: #@ "{}".format(data.values.AUTOSCALER_MIN_SIZE_0 or data.values.WORKER_MACHINE_COUNT_0) - cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: #@ "{}".format(data.values.AUTOSCALER_MAX_SIZE_0 or data.values.WORKER_MACHINE_COUNT_0) - -#@overlay/match by=overlay.subset({"kind":"MachineDeployment", "metadata": {"name": data.values.CLUSTER_NAME + "-md-1"}}), missing_ok=True ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - #@overlay/match missing_ok=True - annotations: - cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: #@ "{}".format(data.values.AUTOSCALER_MIN_SIZE_1 or data.values.WORKER_MACHINE_COUNT_1) - cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: #@ "{}".format(data.values.AUTOSCALER_MAX_SIZE_1 or data.values.WORKER_MACHINE_COUNT_1) - -#@overlay/match by=overlay.subset({"kind":"MachineDeployment", "metadata": {"name": data.values.CLUSTER_NAME + "-md-2"}}), missing_ok=True ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: MachineDeployment -metadata: - #@overlay/match missing_ok=True - annotations: - cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: #@ "{}".format(data.values.AUTOSCALER_MIN_SIZE_2 or data.values.WORKER_MACHINE_COUNT_2) - cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: #@ "{}".format(data.values.AUTOSCALER_MAX_SIZE_2 or data.values.WORKER_MACHINE_COUNT_2) - -#@ end diff --git a/providers/ytt/03_customizations/autoscaler/enable_autoscaler.yaml b/providers/ytt/03_customizations/autoscaler/enable_autoscaler.yaml deleted file mode 100644 index aaed8e56ea..0000000000 --- a/providers/ytt/03_customizations/autoscaler/enable_autoscaler.yaml +++ /dev/null @@ -1,245 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("/lib/helpers.star", "get_default_tkg_bom_data", "get_image_repo_for_component") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ bomData = get_default_tkg_bom_data() -#@ end - -#@ def autoscaler_label(): -#@ return "{}-cluster-autoscaler".format(data.values.CLUSTER_NAME) -#@ end - -#@ def autoscaler_image(): -#@ if not hasattr(bomData.components, 'kubernetes_autoscaler'): -#@ fail("autoscaler is not supported for TKG version " + data.values.TKG_VERSION) -#@ end -#@ -#@ majorVersion, minorVersion, _, _ = data.values.KUBERNETES_VERSION.split(".") -#@ k8sVersionPrefix = majorVersion + "." + minorVersion -#@ -#@ for autoscaler_version in bomData.components.kubernetes_autoscaler: -#@ if autoscaler_version.version.startswith(k8sVersionPrefix): -#@ return "{}/{}:{}".format(get_image_repo_for_component(autoscaler_version.images.kubernetesAutoscalerImage), autoscaler_version.images.kubernetesAutoscalerImage.imagePath, autoscaler_version.images.kubernetesAutoscalerImage.tag) -#@ end -#@ end -#@ fail("autoscaler is not supported for k8s version " + data.values.KUBERNETES_VERSION) -#@ end - -#@ def autoscaler_volume_name(): -#@ return "{}-cluster-autoscaler-volume".format(data.values.CLUSTER_NAME) -#@ end - -#@ def autoscaler_kubeconfig_mount_path(): -#@ return "/mnt/{}-kubeconfig".format(data.values.CLUSTER_NAME) -#@ end - -#@ def autoscaler_args(): -#@ args = ["--cloud-provider=clusterapi"] -#@ args.append("--v=4") -#@ args.append("--clusterapi-cloud-config-authoritative") -#@ args.append("--kubeconfig=" + autoscaler_kubeconfig_mount_path() + "/value") -#@ args.append("--node-group-auto-discovery=clusterapi:clusterName=" + data.values.CLUSTER_NAME + ",namespace=" +data.values.NAMESPACE) -#@ args.append("--scale-down-delay-after-add=" + data.values.AUTOSCALER_SCALE_DOWN_DELAY_AFTER_ADD) -#@ args.append("--scale-down-delay-after-delete=" + data.values.AUTOSCALER_SCALE_DOWN_DELAY_AFTER_DELETE) -#@ args.append("--scale-down-delay-after-failure=" + data.values.AUTOSCALER_SCALE_DOWN_DELAY_AFTER_FAILURE) -#@ args.append("--scale-down-unneeded-time=" + data.values.AUTOSCALER_SCALE_DOWN_UNNEEDED_TIME) -#@ args.append("--max-node-provision-time=" + data.values.AUTOSCALER_MAX_NODE_PROVISION_TIME) -#@ args.append("--max-nodes-total=" + "{}".format(data.values.AUTOSCALER_MAX_NODES_TOTAL)) -#@ return args -#@ end - -#@ if data.values.TKG_CLUSTER_ROLE == "workload" and data.values.ENABLE_AUTOSCALER and data.values.PROVIDER_TYPE != "tkg-service-vsphere": ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: #@ "{}-cluster-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - app: #@ autoscaler_label() -spec: - selector: - matchLabels: - app: #@ autoscaler_label() - replicas: 1 - template: - metadata: - labels: - app: #@ autoscaler_label() - spec: - containers: - - image: #@ autoscaler_image() - name: #@ "{}-cluster-autoscaler".format(data.values.CLUSTER_NAME) - volumeMounts: - - name: #@ autoscaler_volume_name() - mountPath: #@ autoscaler_kubeconfig_mount_path() - readOnly: true - command: - - /cluster-autoscaler - args: #@ autoscaler_args() - volumes: - - name: #@ autoscaler_volume_name() - secret: - secretName: #@ "{}-kubeconfig".format(data.values.CLUSTER_NAME) - serviceAccountName: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: #@ "{}-autoscaler-workload".format(data.values.CLUSTER_NAME) -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-autoscaler-workload -subjects: -- kind: ServiceAccount - name: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: #@ "{}-autoscaler-management".format(data.values.CLUSTER_NAME) -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-autoscaler-management -subjects: -- kind: ServiceAccount - name: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE ---- -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: cluster-autoscaler-workload -rules: -- apiGroups: - - "" - resources: - - persistentvolumeclaims - - persistentvolumes - - pods - - replicationcontrollers - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - nodes - verbs: - - get - - list - - update - - watch -- apiGroups: - - "" - resources: - - pods/eviction - verbs: - - create -- apiGroups: - - policy - resources: - - poddisruptionbudgets - verbs: - - list - - watch -- apiGroups: - - storage.k8s.io - resources: - - csinodes - - storageclasses - verbs: - - get - - list - - watch -- apiGroups: - - batch - resources: - - jobs - verbs: - - list - - watch -- apiGroups: - - apps - resources: - - daemonsets - - replicasets - - statefulsets - verbs: - - list - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch -- apiGroups: - - "" - resources: - - configmaps - verbs: - - create - - delete - - get - - update -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create - - get - - update ---- -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: cluster-autoscaler-management -rules: -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - - machines - - machinesets - verbs: - - get - - list - - update - - watch - - patch -- apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments/scale - - machinesets/scale - verbs: - - get - - update -- apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - '*' - verbs: - - get - - list - -#@ end diff --git a/providers/ytt/03_customizations/capabilities/add_capabilities.yaml b/providers/ytt/03_customizations/capabilities/add_capabilities.yaml deleted file mode 100644 index d1b17b93c2..0000000000 --- a/providers/ytt/03_customizations/capabilities/add_capabilities.yaml +++ /dev/null @@ -1,1173 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:template", "template") -#@ load("/lib/helpers.star", "get_default_tkg_bom_data", "get_image_repo_for_component") - -#@ bomData = get_default_tkg_bom_data() - -#@ def capabilityDefinitions(): ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.8.0 - tkg.tanzu.vmware.com/addon-type: "capabilities/capabilities-controller" - creationTimestamp: null - name: capabilities.run.tanzu.vmware.com -spec: - group: run.tanzu.vmware.com - names: - kind: Capability - listKind: CapabilityList - plural: capabilities - singular: capability - scope: Namespaced - versions: - - deprecated: true - deprecationWarning: Capabilities API in run API group is deprecated, use Capabilities - API in core API group - name: v1alpha1 - schema: - openAPIV3Schema: - description: Capability is the Schema for the capabilities API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec is the capability spec that has cluster queries. - properties: - queries: - description: Queries specifies set of queries that are evaluated. - items: - description: Query is a logical grouping of GVR, Object and PartialSchema - queries. - properties: - groupVersionResources: - description: GroupVersionResources evaluates a slice of GVR - queries. - items: - description: QueryGVR queries for an API group with the optional - ability to check for API versions and resource. - properties: - group: - description: Group is the API group to check for in the - cluster. - type: string - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - resource: - description: Resource is the API resource to check for - given an API group and a slice of versions. Specifying - a Resource requires at least one version to be specified - in Versions. - type: string - versions: - description: Versions is the slice of versions to check - for in the specified API group. - items: - type: string - type: array - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objects: - description: Objects evaluates a slice of Object queries. - items: - description: QueryObject represents any runtime.Object that - could exist in a cluster with the ability to check for annotations. - properties: - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objectReference: - description: ObjectReference is the ObjectReference to - check for in the cluster. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - withAnnotations: - additionalProperties: - type: string - description: WithAnnotations are the annotations whose - presence is checked in the object. The query succeeds - only if all the annotations specified exists. - type: object - withoutAnnotations: - additionalProperties: - type: string - description: WithAnnotations are the annotations whose - absence is checked in the object. The query succeeds - only if all the annotations specified do not exist. - type: object - required: - - name - - objectReference - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - partialSchemas: - description: PartialSchemas evaluates a slice of PartialSchema - queries. - items: - description: QueryPartialSchema queries for any OpenAPI schema - that may exist on a cluster. - properties: - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - partialSchema: - description: PartialSchema is the partial OpenAPI schema - that will be matched in a cluster. - minLength: 1 - type: string - required: - - name - - partialSchema - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - serviceAccountName: - description: ServiceAccountName is the name of the service account - with which requests are made to the API server for evaluating queries. - Service account should exist in the same namespace as this resource. - When this field is not specified, a default service account with - only the ability to execute GVR queries is used. - type: string - required: - - queries - type: object - status: - description: Status is the capability status that has results of cluster - queries. - properties: - results: - description: Results represents the results of all the queries specified - in the spec. - items: - description: Result represents the results of queries in Query. - properties: - groupVersionResources: - description: GroupVersionResources represents results of GVR - queries in spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objects: - description: Objects represents results of Object queries in - spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - partialSchemas: - description: PartialSchemas represents results of PartialSchema - queries in spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - results - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.9.2 - tkg.tanzu.vmware.com/addon-type: "capabilities/capabilities-controller" - creationTimestamp: null - name: capabilities.core.tanzu.vmware.com -spec: - group: core.tanzu.vmware.com - names: - kind: Capability - listKind: CapabilityList - plural: capabilities - singular: capability - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - description: Capability is the Schema for the capabilities API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec is the capability spec that has cluster queries. - properties: - queries: - description: Queries specifies set of queries that are evaluated. - items: - description: Query is a logical grouping of GVR, Object and PartialSchema - queries. - properties: - groupVersionResources: - description: GroupVersionResources evaluates a slice of GVR - queries. - items: - description: QueryGVR queries for an API group with the optional - ability to check for API versions and resource. - properties: - group: - description: Group is the API group to check for in the - cluster. - type: string - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - resource: - description: Resource is the API resource to check for - given an API group and a slice of versions. Specifying - a Resource requires at least one version to be specified - in Versions. - type: string - versions: - description: Versions is the slice of versions to check - for in the specified API group. - items: - type: string - type: array - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objects: - description: Objects evaluates a slice of Object queries. - items: - description: QueryObject represents any runtime.Object that - could exist in a cluster with the ability to check for annotations. - properties: - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objectReference: - description: ObjectReference is the ObjectReference to - check for in the cluster. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - withAnnotations: - additionalProperties: - type: string - description: WithAnnotations are the annotations whose - presence is checked in the object. The query succeeds - only if all the annotations specified exists. - type: object - withoutAnnotations: - additionalProperties: - type: string - description: WithAnnotations are the annotations whose - absence is checked in the object. The query succeeds - only if all the annotations specified do not exist. - type: object - required: - - name - - objectReference - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - partialSchemas: - description: PartialSchemas evaluates a slice of PartialSchema - queries. - items: - description: QueryPartialSchema queries for any OpenAPI schema - that may exist on a cluster. - properties: - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - partialSchema: - description: PartialSchema is the partial OpenAPI schema - that will be matched in a cluster. - minLength: 1 - type: string - required: - - name - - partialSchema - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - serviceAccountName: - description: ServiceAccountName is the name of the service account - with which requests are made to the API server for evaluating queries. - Service account should exist in the same namespace as this resource. - When this field is not specified, a default service account with - only the ability to execute GVR queries is used. - type: string - required: - - queries - type: object - status: - description: Status is the capability status that has results of cluster - queries. - properties: - results: - description: Results represents the results of all the queries specified - in the spec. - items: - description: Result represents the results of queries in Query. - properties: - groupVersionResources: - description: GroupVersionResources represents results of GVR - queries in spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objects: - description: Objects represents results of Object queries in - spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - partialSchemas: - description: PartialSchemas represents results of PartialSchema - queries in spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - results - type: object - type: object - served: false - storage: false - subresources: - status: {} - - name: v1alpha2 - schema: - openAPIV3Schema: - description: Capability is the Schema for the capabilities API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: Spec is the capability spec that has cluster queries. - properties: - queries: - description: Queries specifies set of queries that are evaluated. - items: - description: Query is a logical grouping of GVR, Object and PartialSchema - queries. - properties: - groupVersionResources: - description: GroupVersionResources evaluates a slice of GVR - queries. - items: - description: QueryGVR queries for an API group with the optional - ability to check for API versions and resource. - properties: - group: - description: Group is the API group to check for in the - cluster. - type: string - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - resource: - description: Resource is the API resource to check for - given an API group and a slice of versions. Specifying - a Resource requires at least one version to be specified - in Versions. - type: string - versions: - description: Versions is the slice of versions to check - for in the specified API group. - items: - type: string - type: array - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objects: - description: Objects evaluates a slice of Object queries. - items: - description: QueryObject represents any runtime.Object that - could exist in a cluster with the ability to check for annotations. - properties: - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objectReference: - description: ObjectReference is the ObjectReference to - check for in the cluster. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - x-kubernetes-map-type: atomic - withAnnotations: - additionalProperties: - type: string - description: WithAnnotations are the annotations whose - presence is checked in the object. The query succeeds - only if all the annotations specified exists. - type: object - withoutAnnotations: - additionalProperties: - type: string - description: WithAnnotations are the annotations whose - absence is checked in the object. The query succeeds - only if all the annotations specified do not exist. - type: object - required: - - name - - objectReference - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - partialSchemas: - description: PartialSchemas evaluates a slice of PartialSchema - queries. - items: - description: QueryPartialSchema queries for any OpenAPI schema - that may exist on a cluster. - properties: - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - partialSchema: - description: PartialSchema is the partial OpenAPI schema - that will be matched in a cluster. - minLength: 1 - type: string - required: - - name - - partialSchema - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - serviceAccountName: - description: ServiceAccountName is the name of the service account - with which requests are made to the API server for evaluating queries. - Service account should exist in the same namespace as this resource. - When this field is not specified, a default service account with - only the ability to execute GVR queries is used. - type: string - required: - - queries - type: object - status: - description: Status is the capability status that has results of cluster - queries. - properties: - results: - description: Results represents the results of all the queries specified - in the spec. - items: - description: Result represents the results of queries in Query. - properties: - groupVersionResources: - description: GroupVersionResources represents results of GVR - queries in spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - name: - description: Name is the unique name of the query. - minLength: 1 - type: string - objects: - description: Objects represents results of Object queries in - spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - partialSchemas: - description: PartialSchemas represents results of PartialSchema - queries in spec. - items: - description: QueryResult represents the result of a single - query. - properties: - error: - description: Error indicates if an error occurred while - processing the query. - type: boolean - errorDetail: - description: ErrorDetail represents the error detail, - if an error occurred. - type: string - found: - description: Found is a boolean which indicates if the - query condition succeeded. - type: boolean - name: - description: Name is the name of the query in spec whose - result this struct represents. - minLength: 1 - type: string - notFoundReason: - description: NotFoundReason provides the reason if the - query condition fails. This is non-empty when Found - is false. - type: string - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - name - type: object - type: array - x-kubernetes-list-map-keys: - - name - x-kubernetes-list-type: map - required: - - results - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: tanzu-capabilities-manager - name: tanzu-capabilities-manager-sa - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/addon-type: "capabilities/capabilities-controller" ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: tanzu-capabilities-manager-clusterrole - annotations: - tkg.tanzu.vmware.com/addon-type: "capabilities/capabilities-controller" -rules: - - apiGroups: - - run.tanzu.vmware.com - resources: - - capabilities - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - run.tanzu.vmware.com - resources: - - capabilities/status - verbs: - - get - - patch - - update - - apiGroups: - - core.tanzu.vmware.com - resources: - - capabilities - verbs: - - create - - delete - - get - - list - - patch - - update - - watch - - apiGroups: - - core.tanzu.vmware.com - resources: - - capabilities/status - verbs: - - get - - patch - - update - - apiGroups: - - run.tanzu.vmware.com - resources: - - tanzukubernetesreleases - - tanzukubernetesreleases/status - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - serviceaccounts - - secrets - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: tanzu-capabilities-manager-clusterrolebinding - annotations: - tkg.tanzu.vmware.com/addon-type: "capabilities/capabilities-controller" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tanzu-capabilities-manager-clusterrole -subjects: - - kind: ServiceAccount - name: tanzu-capabilities-manager-sa - namespace: tkg-system ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: tanzu-capabilities-manager - name: tanzu-capabilities-manager-default-sa - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/addon-type: "capabilities/capabilities-controller" ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: tanzu-capabilities-manager - name: tanzu-capabilities-controller-manager - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/addon-type: "capabilities/capabilities-controller" -spec: - replicas: 1 - selector: - matchLabels: - app: tanzu-capabilities-manager - template: - metadata: - labels: - app: tanzu-capabilities-manager - spec: - containers: - - image: #@ "{}/{}:{}".format(get_image_repo_for_component(bomData.components["tanzu-framework"][0].images.capabilitiesImage), bomData.components["tanzu-framework"][0].images.capabilitiesImage.imagePath, bomData.components["tanzu-framework"][0].images.capabilitiesImage.tag) - imagePullPolicy: IfNotPresent - name: manager - resources: - limits: - cpu: 100m - memory: 30Mi - requests: - cpu: 100m - memory: 20Mi - serviceAccount: tanzu-capabilities-manager-sa - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane -#@ end - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ if data.values.DISABLE_CRS_FOR_ADDON_TYPE and "capabilities/capabilities-controller" in data.values.DISABLE_CRS_FOR_ADDON_TYPE: ---- #@ template.replace(capabilityDefinitions()) -#@ else: ---- -apiVersion: addons.cluster.x-k8s.io/v1beta1 -kind: ClusterResourceSet -metadata: - name: #@ "{}-capabilities".format(data.values.CLUSTER_NAME) - labels: - cluster.x-k8s.io/cluster-name: #@ data.values.CLUSTER_NAME - annotations: - tkg.tanzu.vmware.com/addon-type: "capabilities/capabilities-controller" - namespace: tkg-system -spec: - strategy: "ApplyOnce" - clusterSelector: - matchLabels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - resources: - - name: #@ "{}-capabilities".format(data.values.CLUSTER_NAME) - kind: Secret ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-capabilities".format(data.values.CLUSTER_NAME) - namespace: tkg-system - annotations: - tkg.tanzu.vmware.com/addon-type: "capabilities/capabilities-controller" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(capabilityDefinitions()) -#@ end -#@ end diff --git a/providers/ytt/03_customizations/http_proxy.lib.txt b/providers/ytt/03_customizations/http_proxy.lib.txt deleted file mode 100644 index 140d7cb5ba..0000000000 --- a/providers/ytt/03_customizations/http_proxy.lib.txt +++ /dev/null @@ -1,6 +0,0 @@ -(@- def http_proxy_unit_file(http_proxy, https_proxy, no_proxy): -@) -[Service] -Environment="HTTP_PROXY=(@=http_proxy @)" -Environment="HTTPS_PROXY=(@=https_proxy @)" -Environment="NO_PROXY=(@=no_proxy @)" -(@ end -@) diff --git a/providers/ytt/03_customizations/http_proxy.yaml b/providers/ytt/03_customizations/http_proxy.yaml deleted file mode 100644 index b8be5fac53..0000000000 --- a/providers/ytt/03_customizations/http_proxy.yaml +++ /dev/null @@ -1,95 +0,0 @@ -#@ load("@ytt:assert", "assert") -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") -#@ load("http_proxy.lib.txt", "http_proxy_unit_file") -#@ load("/lib/helpers.star", "get_no_proxy") - -#! Validate proxy settings -#@ if (data.values.TKG_HTTP_PROXY == "") != (data.values.TKG_HTTPS_PROXY == ""): -#@ assert.fail("TKG_HTTP_PROXY and TKG_HTTPS_PROXY should both be set or left as empty") -#@ end - -#! Populate service/pod CIDRs -#@ if data.values.TKG_HTTP_PROXY != "": -#@ POPULATED_NO_PROXY = get_no_proxy() -#@ end - -#@ def exportEnvvar(key, val): -#@ return "export {}='{}'".format(key, val) -#@ end - -#@ if data.values.TKG_HTTP_PROXY != "": -#@ if data.values.PROVIDER_TYPE in ["vsphere", "aws", "azure", "docker"]: -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -spec: - #@overlay/match-child-defaults missing_ok=True - kubeadmConfigSpec: - files: - #@overlay/append - - content: #@ http_proxy_unit_file(data.values.TKG_HTTP_PROXY, data.values.TKG_HTTPS_PROXY, POPULATED_NO_PROXY) - owner: root:root - path: /etc/systemd/system/containerd.service.d/http-proxy.conf - permissions: "0640" - #@overlay/append - - content: #@ http_proxy_unit_file(data.values.TKG_HTTP_PROXY, data.values.TKG_HTTPS_PROXY, POPULATED_NO_PROXY) - owner: root:root - path: /usr/lib/systemd/system/kubelet.service.d/http-proxy.conf - permissions: "0640" - preKubeadmCommands: - #@overlay/append - - systemctl daemon-reload - #@overlay/append - - systemctl stop containerd - #@overlay/append - - systemctl start containerd - #@overlay/append - - #@ exportEnvvar("HTTP_PROXY", data.values.TKG_HTTP_PROXY) - #@overlay/append - - #@ exportEnvvar("HTTPS_PROXY", data.values.TKG_HTTPS_PROXY) - #@overlay/append - - #@ exportEnvvar("NO_PROXY", POPULATED_NO_PROXY) - -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+" ---- -spec: - template: - #@overlay/match-child-defaults missing_ok=True - spec: - files: - #@overlay/append - - content: #@ http_proxy_unit_file(data.values.TKG_HTTP_PROXY, data.values.TKG_HTTPS_PROXY, POPULATED_NO_PROXY) - owner: root:root - path: /etc/systemd/system/containerd.service.d/http-proxy.conf - permissions: "0640" - #@overlay/append - - content: #@ http_proxy_unit_file(data.values.TKG_HTTP_PROXY, data.values.TKG_HTTPS_PROXY, POPULATED_NO_PROXY) - owner: root:root - path: /usr/lib/systemd/system/kubelet.service.d/http-proxy.conf - permissions: "0640" - preKubeadmCommands: - #@overlay/append - - systemctl daemon-reload - #@overlay/append - - systemctl restart containerd - #@overlay/append - - #@ exportEnvvar("HTTP_PROXY", data.values.TKG_HTTP_PROXY) - #@overlay/append - - #@ exportEnvvar("HTTPS_PROXY", data.values.TKG_HTTPS_PROXY) - #@overlay/append - - #@ exportEnvvar("NO_PROXY", POPULATED_NO_PROXY) -#@ end - -#@ if data.values.PROVIDER_TYPE == "tkg-service-vsphere": -#@overlay/match by=overlay.subset({"kind":"TanzuKubernetesCluster"}) ---- -spec: - settings: - #@overlay/match-child-defaults missing_ok=True - network: - proxy: - httpProxy: #@ data.values.TKG_HTTP_PROXY - httpsProxy: #@ data.values.TKG_HTTPS_PROXY - noProxy: #@ POPULATED_NO_PROXY.split(",") -#@ end -#@ end diff --git a/providers/ytt/03_customizations/http_proxy_ca_cert.yaml b/providers/ytt/03_customizations/http_proxy_ca_cert.yaml deleted file mode 100644 index a0d11bcafe..0000000000 --- a/providers/ytt/03_customizations/http_proxy_ca_cert.yaml +++ /dev/null @@ -1,62 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("/lib/helpers.star", "tkg_image_repo_customized", "tkg_image_repo_hostname", "tkg_image_repo_ca_cert", "tkg_image_repo_skip_tls_verify") - -#! This ytt overlay adds proxy certificate on TKG cluster nodes, so containerd and other tools trust these CA certificates. -#! It works when using Photon or Ubuntu or Amazon linux 2 as the TKG node template on all TKG infrastructure providers. - -#@ if data.values.TKG_PROXY_CA_CERT != "": -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -spec: - kubeadmConfigSpec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #! For Photon OS - #@overlay/append - - '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - #! For Ubuntu - #@overlay/append - - '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - #! For Amazon - #@overlay/append - - '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - #@overlay/append - - systemctl restart containerd - #@overlay/match missing_ok=True - files: - #@overlay/append - - path: /etc/ssl/certs/tkg-custom-ca.pem - content: #@ tkg_image_repo_ca_cert() - encoding: "base64" - permissions: "0444" -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+" ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -spec: - template: - spec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #! For Photon OS - #@overlay/append - - '! which rehash_ca_certificates.sh 2>/dev/null || rehash_ca_certificates.sh' - #! For Ubuntu - #@overlay/append - - '! which update-ca-certificates 2>/dev/null || (mv /etc/ssl/certs/tkg-custom-ca.pem /usr/local/share/ca-certificates/tkg-custom-ca.crt && update-ca-certificates)' - #! For Amazon - #@overlay/append - - '! which update-ca-trust 2>/dev/null || (update-ca-trust force-enable && mv /etc/ssl/certs/tkg-custom-ca.pem /etc/pki/ca-trust/source/anchors/tkg-custom-ca.crt && update-ca-trust extract)' - #@overlay/append - - systemctl restart containerd - #@overlay/match missing_ok=True - files: - #@overlay/append - - path: /etc/ssl/certs/tkg-custom-ca.pem - content: #@ tkg_image_repo_ca_cert() - encoding: "base64" - permissions: "0444" -#@ end diff --git a/providers/ytt/03_customizations/ip_family.yaml b/providers/ytt/03_customizations/ip_family.yaml deleted file mode 100644 index 5670029ffc..0000000000 --- a/providers/ytt/03_customizations/ip_family.yaml +++ /dev/null @@ -1,17 +0,0 @@ - -#@ load("@ytt:assert", "assert") -#@ load("@ytt:data", "data") - -#! Validate TKG_IP_FAMILY values - -#@ if data.values.TKG_IP_FAMILY not in ["ipv6", "ipv4", "ipv4,ipv6", "ipv6,ipv4", "", None]: -#@ assert.fail("TKG_IP_FAMILY value must be \"ipv6\", \"ipv4\", \"ipv4,ipv6\", \"ipv6,ipv4\", or unset") -#@ end - -#@ if data.values.TKG_IP_FAMILY in ["ipv6", "ipv4,ipv6", "ipv6,ipv4"] and data.values.PROVIDER_TYPE != "vsphere": -#@ assert.fail("TKG_IP_FAMILY value contains \"ipv6\". IPv6 is only compatible with PROVIDER_TYPE \"vsphere\". Please set INFRASTRUCTURE_PROVIDER to a compatible value.") -#@ end - -#@ if data.values.TKG_IP_FAMILY in ["ipv6", "ipv6,ipv4", "ipv4,ipv6"] and data.values.IS_WINDOWS_WORKLOAD_CLUSTER: -#@ assert.fail("IS_WINDOWS_WORKLOAD_CLUSTER is not compatible with TKG_IP_FAMLY values of \"ipv6\", \"ipv4,ipv6\" or \"ipv6,ipv4\"") -#@ end diff --git a/providers/ytt/03_customizations/nameservers.yaml b/providers/ytt/03_customizations/nameservers.yaml deleted file mode 100644 index 4c24dd4f7d..0000000000 --- a/providers/ytt/03_customizations/nameservers.yaml +++ /dev/null @@ -1,16 +0,0 @@ -#@ load("@ytt:assert", "assert") -#@ load("@ytt:data", "data") - -#! Validate CONTROL_PLANE_NODE_NAMESERVERS and WORKER_NODE_NAMESERVERS values - -#@ if data.values.CONTROL_PLANE_NODE_NAMESERVERS not in ["", None]: -#@ if data.values.PROVIDER_TYPE != "vsphere": -#@ assert.fail("CONTROL_PLANE_NODE_NAMESERVERS is only compatible with PROVIDER_TYPE \"vsphere\". Please set INFRASTRUCTURE_PROVIDER to a compatible value.") -#@ end -#@ end - -#@ if data.values.WORKER_NODE_NAMESERVERS not in ["", None]: -#@ if data.values.PROVIDER_TYPE != "vsphere": -#@ assert.fail("WORKER_NODE_NAMESERVERS is only compatible with PROVIDER_TYPE \"vsphere\". Please set INFRASTRUCTURE_PROVIDER to a compatible value.") -#@ end -#@ end diff --git a/providers/ytt/03_customizations/pod_security_standard/pod_security_standard.yaml b/providers/ytt/03_customizations/pod_security_standard/pod_security_standard.yaml deleted file mode 100644 index db0096696f..0000000000 --- a/providers/ytt/03_customizations/pod_security_standard/pod_security_standard.yaml +++ /dev/null @@ -1,57 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:base64", "base64") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:version", "version") -#@ load("/lib/helpers.star", "activate_pod_security_standard") - -#@ def kube_apiserver_admission_pss(): -apiVersion: apiserver.config.k8s.io/v1 -kind: AdmissionConfiguration -plugins: -- name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: #@ data.values.POD_SECURITY_STANDARD_ENFORCE - enforce-version: "v1.24" - audit: #@ data.values.POD_SECURITY_STANDARD_AUDIT - audit-version: "v1.24" - warn: #@ data.values.POD_SECURITY_STANDARD_WARN - warn-version: "v1.24" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: ["kube-system","tkg-system"] -#@ end - -#@ if activate_pod_security_standard(): -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -spec: - kubeadmConfigSpec: - clusterConfiguration: - apiServer: - #@overlay/match missing_ok=True - extraArgs: - #@overlay/match missing_ok=True - admission-control-config-file: "/etc/kubernetes/kube-apiserver-admission-pss.yaml" - #@overlay/match missing_ok=True - extraVolumes: - #@overlay/append - - name: admission-pss - hostPath: /etc/kubernetes/kube-apiserver-admission-pss.yaml - mountPath: /etc/kubernetes/kube-apiserver-admission-pss.yaml - readOnly: true - pathType: "File" - #@overlay/match missing_ok=True - files: - #@overlay/append - - path: "/etc/kubernetes/kube-apiserver-admission-pss.yaml" - content: #@ base64.encode("{}".format(yaml.encode(kube_apiserver_admission_pss()))) - encoding: "base64" - permissions: "0444" -#@ end diff --git a/providers/ytt/03_customizations/pod_security_standard/validation.yaml b/providers/ytt/03_customizations/pod_security_standard/validation.yaml deleted file mode 100644 index 6c2e1b3007..0000000000 --- a/providers/ytt/03_customizations/pod_security_standard/validation.yaml +++ /dev/null @@ -1,21 +0,0 @@ - -#@ load("@ytt:assert", "assert") -#@ load("@ytt:data", "data") - -#! Validate POD_SECURITY_STANDARD_* values - -#@ if data.values.POD_SECURITY_STANDARD_DEACTIVATED not in [True, False, "", None]: -#@ assert.fail("POD_SECURITY_STANDARD_DEACTIVATED value must be true, false or unset") -#@ end - -#@ if data.values.POD_SECURITY_STANDARD_ENFORCE not in ["baseline", "restricted", "privileged", "", None]: -#@ assert.fail("POD_SECURITY_STANDARD_ENFORCE value must be \"baseline\", \"restricted\", \"privileged\" or unset") -#@ end - -#@ if data.values.POD_SECURITY_STANDARD_WARN not in ["baseline", "restricted", "privileged", "", None]: -#@ assert.fail("POD_SECURITY_STANDARD_WARN value must be \"baseline\", \"restricted\", \"privileged\" or unset") -#@ end - -#@ if data.values.POD_SECURITY_STANDARD_AUDIT not in ["baseline", "restricted", "privileged", "", None]: -#@ assert.fail("POD_SECURITY_STANDARD_AUDIT value must be \"baseline\", \"restricted\", \"privileged\" or unset") -#@ end diff --git a/providers/ytt/03_customizations/registry_ca_cert.yaml b/providers/ytt/03_customizations/registry_ca_cert.yaml deleted file mode 100644 index 43259a0c3e..0000000000 --- a/providers/ytt/03_customizations/registry_ca_cert.yaml +++ /dev/null @@ -1,50 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("/lib/helpers.star", "tkg_image_repo_customized", "tkg_image_repo_hostname", "tkg_image_repo_ca_cert", "tkg_image_repo_skip_tls_verify") - -#@ if tkg_image_repo_ca_cert() and not tkg_image_repo_skip_tls_verify(): -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -spec: - kubeadmConfigSpec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #@overlay/append - - #@ "echo '[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"" + tkg_image_repo_hostname() + "\".tls]' >> /etc/containerd/config.toml" - #@overlay/append - - #@ "echo ' ca_file = \"/etc/containerd/" + tkg_image_repo_hostname() + ".crt\"' >> /etc/containerd/config.toml" - #@overlay/append - - systemctl restart containerd - #@overlay/match missing_ok=True - files: - #@overlay/append - - path: #@ "/etc/containerd/" + tkg_image_repo_hostname() + ".crt" - content: #@ tkg_image_repo_ca_cert() - encoding: "base64" - permissions: "0444" - -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+" ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -spec: - template: - spec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #@overlay/append - - #@ "echo '[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"" + tkg_image_repo_hostname() + "\".tls]' >> /etc/containerd/config.toml" - #@overlay/append - - #@ "echo ' ca_file = \"/etc/containerd/" + tkg_image_repo_hostname() + ".crt\"' >> /etc/containerd/config.toml" - #@overlay/append - - systemctl restart containerd - #@overlay/match missing_ok=True - files: - #@overlay/append - - path: #@ "/etc/containerd/" + tkg_image_repo_hostname() + ".crt" - content: #@ tkg_image_repo_ca_cert() - encoding: "base64" - permissions: "0444" -#@ end diff --git a/providers/ytt/03_customizations/registry_skip_tls_verify.yaml b/providers/ytt/03_customizations/registry_skip_tls_verify.yaml deleted file mode 100644 index 740d16d00a..0000000000 --- a/providers/ytt/03_customizations/registry_skip_tls_verify.yaml +++ /dev/null @@ -1,46 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("/lib/helpers.star", "tkg_image_repo_customized", "tkg_image_repo_skip_tls_verify", "tkg_image_repo", "tkg_image_repo_hostname") - -#@ if tkg_image_repo_customized() and data.values.PROVIDER_TYPE in ["vsphere", "aws", "azure", "docker"]: -#@overlay/match by=overlay.subset({"kind":"KubeadmControlPlane"}) ---- -apiVersion: controlplane.cluster.x-k8s.io/v1beta1 -kind: KubeadmControlPlane -spec: - kubeadmConfigSpec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #@overlay/append - - #@ "sed -i 's|\".*/pause|\"" + tkg_image_repo() + "/pause|' /etc/containerd/config.toml" - #@ if tkg_image_repo_skip_tls_verify(): - #@overlay/append - - #@ "echo '[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"" + tkg_image_repo_hostname() + "\".tls]' >> /etc/containerd/config.toml" - #@overlay/append - - echo ' insecure_skip_verify = true' >> /etc/containerd/config.toml - #@ end - #@overlay/append - - systemctl restart containerd - -#@ if not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: -#@overlay/match by=overlay.subset({"kind":"KubeadmConfigTemplate"}),expects="1+" ---- -apiVersion: bootstrap.cluster.x-k8s.io/v1beta1 -kind: KubeadmConfigTemplate -spec: - template: - spec: - #@overlay/match missing_ok=True - preKubeadmCommands: - #@overlay/append - - #@ "sed -i 's|\".*/pause|\"" + tkg_image_repo() + "/pause|' /etc/containerd/config.toml" - #@ if tkg_image_repo_skip_tls_verify(): - #@overlay/append - - #@ "echo '[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"" + tkg_image_repo_hostname() + "\".tls]' >> /etc/containerd/config.toml" - #@overlay/append - - echo ' insecure_skip_verify = true' >> /etc/containerd/config.toml - #@ end - #@overlay/append - - systemctl restart containerd -#@ end -#@ end diff --git a/providers/ytt/04_user_customizations/README.md b/providers/ytt/04_user_customizations/README.md deleted file mode 100644 index 2f1057bc0e..0000000000 --- a/providers/ytt/04_user_customizations/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# User Customizations - -ytt traverses directories in alphabetical order and overwrites duplicate settings. You can create template files here to contain configurations that take precedence over any in lower-numbered ytt subdirectories. diff --git a/providers/ytt/09_miscellaneous/08_store_data_values.yaml b/providers/ytt/09_miscellaneous/08_store_data_values.yaml deleted file mode 100644 index deb5afbfd2..0000000000 --- a/providers/ytt/09_miscellaneous/08_store_data_values.yaml +++ /dev/null @@ -1,49 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:struct", "struct") -#@ load("/lib/config_variable_association.star", "config_variable_association") -#@ load("@ytt:regexp", "regexp") - -#@ list_skip_variable_from_storing = [ -#@ "VSPHERE_PASSWORD", -#@ "AWS_ACCESS_KEY_ID", -#@ "AWS_SECRET_ACCESS_KEY", -#@ "AZURE_CLIENT_ID", -#@ "AZURE_CLIENT_SECRET", -#@ "NSXT_PASSWORD", -#@ "OIDC_IDENTITY_PROVIDER_CLIENT_SECRET", -#@ "LDAP_BIND_PASSWORD", -#@ "AVI_PASSWORD", -#@ ] - -#@ def getConfigKeyValues(): -#@ kvs = config_variable_association() - -#@ for configVariable in kvs: - - -#@ if configVariable not in list_skip_variable_from_storing and data.values.PROVIDER_TYPE in kvs[configVariable]: -#@ value = data.values[configVariable] -#@ if configVariable == "TKG_NO_PROXY": -#@ no_proxy_list = regexp.replace(" ", data.values.TKG_NO_PROXY, "").split(",") -#@ value = ",".join(list(set(no_proxy_list))) -#@ end - -#@yaml/text-templated-strings -(@= configVariable @): #@ value -#@ end - -#@ end -#@ end - ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ "{}-config-values".format(data.values.CLUSTER_NAME) - labels: - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - clusterctl.cluster.x-k8s.io/move: "" -type: addons.cluster.x-k8s.io/resource-set -stringData: - value: #@ yaml.encode(getConfigKeyValues()) diff --git a/providers/ytt/09_miscellaneous/09_filter.yaml b/providers/ytt/09_miscellaneous/09_filter.yaml deleted file mode 100644 index 57411da88a..0000000000 --- a/providers/ytt/09_miscellaneous/09_filter.yaml +++ /dev/null @@ -1,32 +0,0 @@ -#! This file should be processed very last as it removes some specific components from the cluster template -#! that can be needed by some other overlay file that is trying to apply specific overlays to certain objects -#! Processing the file at the very end makes sure that we are removing the objects after they are processed. - -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ if data.values.FILTER_BY_ADDON_TYPE: - -#@ def filter_addons_objects_by_type(x, l, r): -#@ -#@ if not ("metadata" in l and "annotations" in l["metadata"] and "tkg.tanzu.vmware.com/addon-type" in l["metadata"]["annotations"]): -#@ return True -#@ end -#@ -#@ if (l["metadata"]["annotations"]["tkg.tanzu.vmware.com/addon-type"] in data.values.FILTER_BY_ADDON_TYPE.split(",")): -#@ if (data.values.REMOVE_CRS_FOR_ADDON_TYPE and l["metadata"]["annotations"]["tkg.tanzu.vmware.com/addon-type"] in data.values.REMOVE_CRS_FOR_ADDON_TYPE.split(",")): -#@ if (l["kind"] == "ClusterResourceSet" or (l["kind"] == "Secret" and l["type"] == "addons.cluster.x-k8s.io/resource-set")): -#@ return True -#@ end -#@ end -#@ return False -#@ end -#@ -#@ return True -#@ end - -#@overlay/match by=filter_addons_objects_by_type,expects="0+" ---- -#@overlay/remove - -#@ end diff --git a/providers/ytt/lib/config_variable_association.star b/providers/ytt/lib/config_variable_association.star deleted file mode 100644 index 1d95f5ca3d..0000000000 --- a/providers/ytt/lib/config_variable_association.star +++ /dev/null @@ -1,335 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:overlay", "overlay") -load("@ytt:yaml", "yaml") -load("/lib/helpers.star", "get_default_tkg_bom_data") - -#! This file contains function 'config_variable_association' which specifies all configuration variables -#! mentioned in 'config_default.yaml' and describes association of each configuration variable with -#! the corresponding infrastructure providers. -#! Please make sure to add config variable to this file if you add new config variable to 'config_default.yaml' - -def config_variable_association(): - -return { -"CLUSTER_NAME": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker"], -"CLUSTER_PLAN": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker"], -"NAMESPACE": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker"], -"INFRASTRUCTURE_PROVIDER": ["vsphere", "aws", "azure", "docker"], -"IS_WINDOWS_WORKLOAD_CLUSTER": ["vsphere"], - -"SIZE": ["vsphere", "aws", "azure", "docker"], -"CONTROLPLANE_SIZE": ["vsphere", "aws", "azure", "docker"], -"WORKER_SIZE": ["vsphere", "aws", "azure", "docker"], -"CONTROLPLANE_CERTIFICATE_ROTATION_ENABLED": ["vsphere", "aws", "azure", "docker"], -"CONTROLPLANE_CERTIFICATE_ROTATION_DAYS_BEFORE": ["vsphere", "aws", "azure", "docker"], - -"ENABLE_CEIP_PARTICIPATION": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker"], -"DEPLOY_TKG_ON_VSPHERE7": ["vsphere"], -"ENABLE_TKGS_ON_VSPHERE7": ["vsphere"], - -"VSPHERE_NUM_CPUS": ["vsphere"], -"VSPHERE_DISK_GIB": ["vsphere"], -"VSPHERE_MEM_MIB": ["vsphere"], -"VSPHERE_CONTROL_PLANE_NUM_CPUS": ["vsphere"], -"VSPHERE_CONTROL_PLANE_DISK_GIB": ["vsphere"], -"VSPHERE_CONTROL_PLANE_MEM_MIB": ["vsphere"], -"VSPHERE_WORKER_NUM_CPUS": ["vsphere"], -"VSPHERE_WORKER_DISK_GIB": ["vsphere"], -"VSPHERE_WORKER_MEM_MIB": ["vsphere"], -"VSPHERE_CLONE_MODE": ["vsphere"], -"VSPHERE_NETWORK": ["vsphere"], -"VSPHERE_TEMPLATE": ["vsphere"], -"VSPHERE_WINDOWS_TEMPLATE": ["windows-vsphere"], -"VIP_NETWORK_INTERFACE": ["vsphere"], -"VSPHERE_SSH_AUTHORIZED_KEY": ["vsphere"], -"VSPHERE_USERNAME": ["vsphere"], -"VSPHERE_PASSWORD": ["vsphere"], -"VSPHERE_REGION": ["vsphere"], -"VSPHERE_ZONE": ["vsphere"], -"VSPHERE_SERVER": ["vsphere"], -"VSPHERE_DATACENTER": ["vsphere"], -"VSPHERE_RESOURCE_POOL": ["vsphere"], -"VSPHERE_DATASTORE": ["vsphere"], -"VSPHERE_FOLDER": ["vsphere"], -"VSPHERE_STORAGE_POLICY_ID": ["vsphere"], -"VSPHERE_TLS_THUMBPRINT": ["vsphere"], -"VSPHERE_INSECURE": ["vsphere"], -"VSPHERE_CONTROL_PLANE_ENDPOINT": ["vsphere"], -"VSPHERE_CONTROL_PLANE_ENDPOINT_PORT": ["vsphere"], - -"NSXT_POD_ROUTING_ENABLED": ["vsphere"], -"NSXT_ROUTER_PATH": ["vsphere"], -"NSXT_USERNAME": ["vsphere"], -"NSXT_PASSWORD": ["vsphere"], -"NSXT_MANAGER_HOST": ["vsphere"], -"NSXT_ALLOW_UNVERIFIED_SSL": ["vsphere"], -"NSXT_REMOTE_AUTH": ["vsphere"], -"NSXT_VMC_ACCESS_TOKEN": ["vsphere"], -"NSXT_VMC_AUTH_HOST": ["vsphere"], -"NSXT_CLIENT_CERT_KEY_DATA": ["vsphere"], -"NSXT_CLIENT_CERT_DATA": ["vsphere"], -"NSXT_ROOT_CA_DATA_B64": ["vsphere"], -"NSXT_SECRET_NAME": ["vsphere"], -"NSXT_SECRET_NAMESPACE": ["vsphere"], - -"NODE_IPAM_IP_POOL_NAME": ["vsphere"], - -"AWS_REGION": ["aws"], -"AWS_NODE_AZ": ["aws"], -"AWS_NODE_AZ_1": ["aws"], -"AWS_NODE_AZ_2": ["aws"], -"AWS_VPC_ID": ["aws"], -"AWS_PRIVATE_SUBNET_ID": ["aws"], -"AWS_PUBLIC_SUBNET_ID": ["aws"], -"AWS_PUBLIC_SUBNET_ID_1": ["aws"], -"AWS_PRIVATE_SUBNET_ID_1": ["aws"], -"AWS_PUBLIC_SUBNET_ID_2": ["aws"], -"AWS_PRIVATE_SUBNET_ID_2": ["aws"], -"AWS_VPC_CIDR": ["aws"], -"AWS_PRIVATE_NODE_CIDR": ["aws"], -"AWS_PUBLIC_NODE_CIDR": ["aws"], -"AWS_PRIVATE_NODE_CIDR_1": ["aws"], -"AWS_PUBLIC_NODE_CIDR_1": ["aws"], -"AWS_PRIVATE_NODE_CIDR_2": ["aws"], -"AWS_PUBLIC_NODE_CIDR_2": ["aws"], -"AWS_SECURITY_GROUP_APISERVER_LB": ["aws"], -"AWS_SECURITY_GROUP_BASTION": ["aws"], -"AWS_SECURITY_GROUP_CONTROLPLANE": ["aws"], -"AWS_SECURITY_GROUP_LB": ["aws"], -"AWS_SECURITY_GROUP_NODE": ["aws"], -"AWS_IDENTITY_REF_KIND": ["aws"], -"AWS_IDENTITY_REF_NAME": ["aws"], -"AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB": ["aws"], -"AWS_NODE_OS_DISK_SIZE_GIB": ["aws"], -"CONTROL_PLANE_MACHINE_TYPE": ["aws"], -"NODE_MACHINE_TYPE": ["aws"], -"NODE_MACHINE_TYPE_1": ["aws"], -"NODE_MACHINE_TYPE_2": ["aws"], -"AWS_SSH_KEY_NAME": ["aws"], -"BASTION_HOST_ENABLED": ["aws"], -"AWS_LOAD_BALANCER_SCHEME_INTERNAL": ["aws"], - -"CONTROL_PLANE_STORAGE_CLASS": ["tkg-service-vsphere"], -"CONTROL_PLANE_VM_CLASS": ["tkg-service-vsphere"], -"DEFAULT_STORAGE_CLASS": ["tkg-service-vsphere"], -"SERVICE_DOMAIN": ["tkg-service-vsphere"], -"STORAGE_CLASSES": ["tkg-service-vsphere"], -"WORKER_STORAGE_CLASS": ["tkg-service-vsphere"], -"WORKER_VM_CLASS": ["tkg-service-vsphere"], -"KUBERNETES_RELEASE": ["tkg-service-vsphere"], -"NODE_POOL_0_NAME": ["tkg-service-vsphere"], -"NODE_POOL_0_LABELS": ["tkg-service-vsphere"], -"NODE_POOL_0_TAINTS": ["tkg-service-vsphere"], - -"AZURE_ENVIRONMENT": ["azure"], -"AZURE_TENANT_ID": ["azure"], -"AZURE_SUBSCRIPTION_ID": ["azure"], -"AZURE_CLIENT_ID": ["azure"], -"AZURE_CLIENT_SECRET": ["azure"], -"AZURE_LOCATION": ["azure"], -"AZURE_SSH_PUBLIC_KEY_B64": ["azure"], -"AZURE_CONTROL_PLANE_MACHINE_TYPE": ["azure"], -"AZURE_NODE_MACHINE_TYPE": ["azure"], -"AZURE_ENABLE_ACCELERATED_NETWORKING": ["azure"], -"AZURE_RESOURCE_GROUP": ["azure"], -"AZURE_VNET_RESOURCE_GROUP": ["azure"], -"AZURE_VNET_NAME": ["azure"], -"AZURE_VNET_CIDR": ["azure"], -"AZURE_CONTROL_PLANE_SUBNET_NAME": ["azure"], -"AZURE_CONTROL_PLANE_SUBNET_CIDR": ["azure"], -"AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP": ["azure"], -"AZURE_NODE_SUBNET_NAME": ["azure"], -"AZURE_NODE_SUBNET_CIDR": ["azure"], -"AZURE_NODE_SUBNET_SECURITY_GROUP": ["azure"], -"AZURE_NODE_AZ": ["azure"], -"AZURE_NODE_AZ_1": ["azure"], -"AZURE_NODE_AZ_2": ["azure"], -"AZURE_CUSTOM_TAGS": ["azure"], -"AZURE_CONTROL_PLANE_OS_DISK_SIZE_GIB": ["azure"], -"AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE": ["azure"], -"AZURE_NODE_OS_DISK_SIZE_GIB": ["azure"], -"AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE": ["azure"], -"AZURE_CONTROL_PLANE_DATA_DISK_SIZE_GIB": ["azure"], -"AZURE_ENABLE_NODE_DATA_DISK": ["azure"], -"AZURE_NODE_DATA_DISK_SIZE_GIB": ["azure"], -"AZURE_ENABLE_PRIVATE_CLUSTER": ["azure"], -"AZURE_FRONTEND_PRIVATE_IP": ["azure"], -"AZURE_IMAGE_ID": ["azure"], -"AZURE_IMAGE_RESOURCE_GROUP": ["azure"], -"AZURE_IMAGE_NAME": ["azure"], -"AZURE_IMAGE_SUBSCRIPTION_ID": ["azure"], -"AZURE_IMAGE_GALLERY": ["azure"], -"AZURE_IMAGE_PUBLISHER": ["azure"], -"AZURE_IMAGE_OFFER": ["azure"], -"AZURE_IMAGE_SKU": ["azure"], -"AZURE_IMAGE_THIRD_PARTY": ["azure"], -"AZURE_IMAGE_VERSION": ["azure"], -"AZURE_IDENTITY_NAME": ["azure"], -"AZURE_IDENTITY_NAMESPACE": ["azure"], -"AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT": ["azure"], -"AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB": ["azure"], -"AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT": ["azure"], -"AZURE_ENABLE_NODE_OUTBOUND_LB": ["azure"], -"AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES": ["azure"], -"ENABLE_OIDC": ["vsphere", "aws", "azure", "docker"], -"OIDC_ISSUER_URL": ["vsphere", "aws", "azure", "docker"], -"OIDC_USERNAME_CLAIM": ["vsphere", "aws", "azure", "docker"], -"OIDC_GROUPS_CLAIM": ["vsphere", "aws", "azure", "docker"], -"OIDC_DEX_CA": ["vsphere", "aws", "azure", "docker"], - -"ENABLE_MHC": ["vsphere", "aws", "azure", "docker"], -"ENABLE_MHC_WORKER_NODE": ["vsphere", "aws", "azure", "docker"], -"ENABLE_MHC_CONTROL_PLANE": ["vsphere", "aws", "azure", "docker"], -"MHC_UNKNOWN_STATUS_TIMEOUT": ["vsphere", "aws", "azure", "docker"], -"MHC_FALSE_STATUS_TIMEOUT": ["vsphere", "aws", "azure", "docker"], - -"TKG_CUSTOM_IMAGE_REPOSITORY": ["vsphere", "aws", "azure", "docker"], -"TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY": ["vsphere", "aws", "azure", "docker"], -"TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE": ["vsphere", "aws", "azure", "docker"], - -"TKG_HTTP_PROXY": ["vsphere", "aws", "azure", "docker"], -"TKG_HTTPS_PROXY": ["vsphere", "aws", "azure", "docker"], -"TKG_NO_PROXY": ["vsphere", "aws", "azure", "docker"], -"TKG_PROXY_CA_CERT": ["vsphere", "aws", "azure", "docker"], - -"TKG_IP_FAMILY": ["vsphere", "aws", "azure", "docker"], - -"ENABLE_AUDIT_LOGGING": ["vsphere", "aws", "azure", "docker"], - -"ENABLE_DEFAULT_STORAGE_CLASS": ["vsphere", "aws", "azure", "docker"], - -"CLUSTER_CIDR": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker"], -"SERVICE_CIDR": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker"], -"NODE_STARTUP_TIMEOUT": ["vsphere", "aws", "azure", "docker"], - -"CONTROL_PLANE_MACHINE_COUNT": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker"], -"WORKER_MACHINE_COUNT": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker"], -"WORKER_MACHINE_COUNT_0": ["vsphere", "aws", "azure", "docker"], -"WORKER_MACHINE_COUNT_1": ["vsphere", "aws", "azure", "docker"], -"WORKER_MACHINE_COUNT_2": ["vsphere", "aws", "azure", "docker"], - -"OS_NAME": ["vsphere", "aws", "azure", "docker"], -"OS_VERSION": ["vsphere", "aws", "azure", "docker"], -"OS_ARCH": ["vsphere", "aws", "azure", "docker"], - -"ENABLE_AUTOSCALER": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_MAX_NODES_TOTAL": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_SCALE_DOWN_DELAY_AFTER_ADD": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_SCALE_DOWN_DELAY_AFTER_DELETE": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_SCALE_DOWN_DELAY_AFTER_FAILURE": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_SCALE_DOWN_UNNEEDED_TIME": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_MAX_NODE_PROVISION_TIME": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_MIN_SIZE_0": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_MAX_SIZE_0": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_MIN_SIZE_1": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_MAX_SIZE_1": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_MIN_SIZE_2": ["vsphere", "aws", "azure", "docker"], -"AUTOSCALER_MAX_SIZE_2": ["vsphere", "aws", "azure", "docker"], - -"DOCKER_MACHINE_TEMPLATE_IMAGE": ["docker"], - -"IDENTITY_MANAGEMENT_TYPE": ["vsphere", "aws", "azure", "docker"], -"CERT_DURATION": ["vsphere", "aws", "azure", "docker"], -"CERT_RENEW_BEFORE": ["vsphere", "aws", "azure", "docker"], -"OIDC_IDENTITY_PROVIDER_NAME": ["vsphere", "aws", "azure", "docker"], -"OIDC_IDENTITY_PROVIDER_ISSUER_URL": ["vsphere", "aws", "azure", "docker"], -"OIDC_IDENTITY_PROVIDER_CLIENT_ID": ["vsphere", "aws", "azure", "docker"], -"OIDC_IDENTITY_PROVIDER_CLIENT_SECRET": ["vsphere", "aws", "azure", "docker"], -"OIDC_IDENTITY_PROVIDER_SCOPES": ["vsphere", "aws", "azure", "docker"], -"OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM": ["vsphere", "aws", "azure", "docker"], -"OIDC_IDENTITY_PROVIDER_GROUPS_CLAIM": ["vsphere", "aws", "azure", "docker"], -"SUPERVISOR_ISSUER_URL": ["vsphere", "aws", "azure", "docker"], -"SUPERVISOR_ISSUER_CA_BUNDLE_DATA_B64": ["vsphere", "aws", "azure", "docker"], -"LDAP_BIND_DN": ["vsphere", "aws", "azure", "docker"], -"LDAP_BIND_PASSWORD": ["vsphere", "aws", "azure", "docker"], -"LDAP_HOST": ["vsphere", "aws", "azure", "docker"], -"LDAP_USER_SEARCH_BASE_DN": ["vsphere", "aws", "azure", "docker"], -"LDAP_USER_SEARCH_FILTER": ["vsphere", "aws", "azure", "docker"], -"LDAP_USER_SEARCH_USERNAME": ["vsphere", "aws", "azure", "docker"], -"LDAP_USER_SEARCH_ID_ATTRIBUTE": ["vsphere", "aws", "azure", "docker"], -"LDAP_USER_SEARCH_EMAIL_ATTRIBUTE": ["vsphere", "aws", "azure", "docker"], -"LDAP_USER_SEARCH_NAME_ATTRIBUTE": ["vsphere", "aws", "azure", "docker"], -"LDAP_GROUP_SEARCH_BASE_DN": ["vsphere", "aws", "azure", "docker"], -"LDAP_GROUP_SEARCH_FILTER": ["vsphere", "aws", "azure", "docker"], -"LDAP_GROUP_SEARCH_USER_ATTRIBUTE": ["vsphere", "aws", "azure", "docker"], -"LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE": ["vsphere", "aws", "azure", "docker"], -"LDAP_GROUP_SEARCH_NAME_ATTRIBUTE": ["vsphere", "aws", "azure", "docker"], -"LDAP_ROOT_CA_DATA_B64": ["vsphere", "aws", "azure", "docker"], - -"AVI_ENABLE": ["vsphere"], -"AVI_NAMESPACE": ["vsphere"], -"AVI_DISABLE_INGRESS_CLASS": ["vsphere"], -"AVI_AKO_IMAGE_PULL_POLICY": ["vsphere"], -"AVI_ADMIN_CREDENTIAL_NAME": ["vsphere"], -"AVI_CA_NAME": ["vsphere"], -"AVI_CONTROLLER": ["vsphere"], -"AVI_USERNAME": ["vsphere"], -"AVI_PASSWORD": ["vsphere"], -"AVI_CLOUD_NAME": ["vsphere"], -"AVI_SERVICE_ENGINE_GROUP": ["vsphere"], -"AVI_DATA_NETWORK": ["vsphere"], -"AVI_DATA_NETWORK_CIDR": ["vsphere"], -"AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME": ["vsphere"], -"AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR": ["vsphere"], -"AVI_CA_DATA_B64": ["vsphere"], -"AVI_LABELS": ["vsphere"], -"AVI_DISABLE_STATIC_ROUTE_SYNC": ["vsphere"], -"AVI_INGRESS_DEFAULT_INGRESS_CONTROLLER": ["vsphere"], -"AVI_INGRESS_SHARD_VS_SIZE": ["vsphere"], -"AVI_INGRESS_SERVICE_TYPE": ["vsphere"], -"AVI_INGRESS_NODE_NETWORK_LIST": ["vsphere"], -"AVI_CONTROL_PLANE_HA_PROVIDER": ["vsphere"], - -"ANTREA_NO_SNAT": ["vsphere", "aws", "azure", "docker"], -"ANTREA_TRAFFIC_ENCAP_MODE": ["vsphere", "aws", "azure", "docker"], -"ANTREA_PROXY": ["vsphere", "aws", "azure", "docker"], -"ANTREA_ENDPOINTSLICE": ["vsphere", "aws", "azure", "docker"], -"ANTREA_POLICY": ["vsphere", "aws", "azure", "docker"], -"ANTREA_NODEPORTLOCAL": ["vsphere", "aws", "azure", "docker"], -"ANTREA_TRACEFLOW": ["vsphere", "aws", "azure", "docker"], -"ANTREA_EGRESS": ["vsphere", "aws", "azure", "docker"], -"ANTREA_FLOWEXPORTER": ["vsphere", "aws", "azure", "docker"], -"ANTREA_DISABLE_UDP_TUNNEL_OFFLOAD": ["vsphere", "aws", "azure", "docker"], - -"POD_SECURITY_STANDARD_DEACTIVATED": ["vsphere", "aws", "azure", "docker"], -"POD_SECURITY_STANDARD_AUDIT": ["vsphere", "aws", "azure", "docker"], -"POD_SECURITY_STANDARD_WARN": ["vsphere", "aws", "azure", "docker"], -"POD_SECURITY_STANDARD_ENFORCE": ["vsphere", "aws", "azure", "docker"], - -"PROVIDER_TYPE": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker"], -"TKG_CLUSTER_ROLE": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker"], -"TKG_VERSION": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker"], -"CNI": ["vsphere", "aws", "azure", "docker"], -"VSPHERE_VERSION": ["vsphere"], -} - -end - -def get_cluster_variables(): - vars = {} - kvs = config_variable_association() - for configVariable in kvs: - if data.values.PROVIDER_TYPE in kvs[configVariable]: - if data.values[configVariable] != None: - vars[configVariable] = data.values[configVariable] - else: - continue - end - if configVariable == "TKG_HTTP_PROXY": - if vars["TKG_HTTP_PROXY"] != "": - vars["proxy"] = { - "httpProxy": vars["TKG_HTTP_PROXY"], - "httpsProxy": data.values["TKG_HTTPS_PROXY"], - "noProxy": data.values["TKG_NO_PROXY"].split(",") - } - else: - vars["proxy"] = None - end - end - if configVariable == "TKG_CUSTOM_IMAGE_REPOSITORY": - vars["TKG_CUSTOM_IMAGE_REPOSITORY_HOSTNAME"] = vars[configVariable].split("/")[0] - end - end - end - return vars -end diff --git a/providers/ytt/lib/helpers.star b/providers/ytt/lib/helpers.star deleted file mode 100644 index 0e3c7b421a..0000000000 --- a/providers/ytt/lib/helpers.star +++ /dev/null @@ -1,392 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:assert", "assert") -load("@ytt:regexp", "regexp") - -TKGSProductName = "VMware Tanzu Kubernetes Grid Service for vSphere" -TKGProductName = "VMware Tanzu Kubernetes Grid" -# kapp-controller requires the data values for addons to have this header to indicate its a data value -ValuesFormatStr = "#@data/values\n#@overlay/match-child-defaults missing_ok=True\n---\n{}" - -valid_md_rollout_strategy_types = ["OnDelete", "RollingUpdate"] - -# verify_and_configure_machine_deployment_rollout_strategy, verify strategy type input against allowed type and return type if correct. -def verify_and_configure_machine_deployment_rollout_strategy(strategy_type): - if strategy_type not in valid_md_rollout_strategy_types: - strs = ", ".join(valid_md_rollout_strategy_types) - assert.fail("Invalid Strategy type, Allowed values: \""+strs+"\"") - end - return strategy_type -end - -def get_tkr_name_from_k8s_version(k8s_version): - strs = k8s_version.split("+") - return strs[0] + "---" + strs[1] -end - -def get_tkr_version_from_tkr_name(tkr_name): - strs = tkr_name.split("---") - return strs[0] + "+" + strs[1] -end - -def get_default_tkg_bom_data(): - for bom_entry in data.values.boms: - if bom_entry.bom_name == data.values.TKG_DEFAULT_BOM: - return bom_entry.bom_data - end - end - assert.fail("unable to find the default BOM file: " + data.values.TKG_DEFAULT_BOM) -end - - -def get_default_tkr_bom_data(): - default_tkg_bom = get_default_tkg_bom_data() - k8s_version = default_tkg_bom.default.k8sVersion - - for bom_entry in data.values.boms: - if bom_entry.bom_data.release.version == k8s_version: - return bom_entry.bom_data - end - end - assert.fail("unable to get TanzuKubernetesRelease BoM file for TKG version: "+k8s_version +" " + default_tkg_bom.release.version) -end - -def get_bom_data_for_tkr_name(): - for bom_entry in data.values.boms: - tkr_version = get_tkr_version_from_tkr_name(data.values.KUBERNETES_RELEASE) - if bom_entry.bom_data.release.version == tkr_version: - return bom_entry.bom_data - end - end - assert.fail("unable to get BoM file for the TanzuKubernetesRelease version: " + bom_entry.bom_data.release.version + " " + data.values.KUBERNETES_RELEASE ) -end - -tkgBomData = get_default_tkg_bom_data() -if data.values.PROVIDER_TYPE != "tkg-service-vsphere": - tkrBomData = get_bom_data_for_tkr_name() -end - -def kubeadm_image_repo(default_repo): - if data.values.TKG_CUSTOM_IMAGE_REPOSITORY: - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY - end - - # if downstream images are not available for Azure, change the kubeadm image repository to the staging repository name(global 'imageRepository' in BOM) - if data.values.PROVIDER_TYPE == "azure": - if hasattr(tkrBomData, 'azure') and hasattr(tkrBomData.azure[0], 'thirdPartyImage') and tkrBomData.azure[0].thirdPartyImage == True: - return default_repo - else: - # when downstream image not available - return tkrBomData.kubeadmConfigSpec.imageRepository - end - end - - return default_repo -end - -def tkg_image_repo_customized(): - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY != "" -end - -#! XXX: until all overlays are refactored to account for cluster class, any -#! scenario involving cc will be processed via supplying a plan name that -#! adheres to the convention of ending in "cc". Any overlay not meant to be used -#! scenario should be guarded by calling this helper. -def tkg_use_clusterclass(): - return data.values.CLUSTER_PLAN != "" and data.values.CLUSTER_PLAN.endswith("cc") -end - -def tkg_image_repo(): - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY if data.values.TKG_CUSTOM_IMAGE_REPOSITORY else tkgBomData.imageConfig.imageRepository -end - -def get_image_repo_for_component(image): - # if custom image repo is specified use that repo - if data.values.TKG_CUSTOM_IMAGE_REPOSITORY: - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY - end - - # if imageRepo is specified for the component with image.imageRepository - # than use image.imageRepository else use default imageRepo from BoM file - if hasattr(image, 'imageRepository'): - return image.imageRepository - else: - return tkgBomData.imageConfig.imageRepository - end -end - -def tkg_image_repo_skip_tls_verify(): - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY == True and tkg_image_repo_customized() -end - -def tkg_image_repo_ca_cert(): - return data.values.TKG_PROXY_CA_CERT if data.values.TKG_PROXY_CA_CERT else data.values.TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE -end - -def tkg_image_repo_hostname(): - return tkg_image_repo().split("/")[0] -end - -def get_provider(): - if data.values.PROVIDER_TYPE == "tkg-service-vsphere": - return "vsphere" - end - return data.values.PROVIDER_TYPE -end - -def get_kubernetes_provider(): - return TKGSProductName if data.values.PROVIDER_TYPE == "tkg-service-vsphere" else TKGProductName -end - -def get_az_from_region(region, az, suffix): - regionWithSuffix = "" - if region != "" and region != None: - regionWithSuffix = region + suffix - end - return az if az != "" else regionWithSuffix -end - -def validate(): - validate_funcs = [validate_oidc] - for fn in validate_funcs: - fn() - end - return True -end - -def validate_oidc(): - if data.values.ENABLE_OIDC : - data.values.OIDC_ISSUER_URL or assert.fail("oidc enabled, oidc issuer url should be provided") - data.values.OIDC_USERNAME_CLAIM or assert.fail("oidc enabled, oidc username claim should be provided") - data.values.OIDC_GROUPS_CLAIM or assert.fail("oidc enabled, oidc groups claim should be provided") - data.values.OIDC_DEX_CA or assert.fail("oidc enabled, oidc dex ca should be provided.") - end -end - -def get_azure_image(tkrBomData): - image = get_azure_image_from_config() - if image != None: - return image - end - - return get_azure_image_from_bom(tkrBomData) -end - -def get_azure_image_from_config(): - if data.values.AZURE_IMAGE_ID: - return { - "id": data.values.AZURE_IMAGE_ID - } - end - - if data.values.AZURE_IMAGE_RESOURCE_GROUP: - sharedGallery = { - "resourceGroup": data.values.AZURE_IMAGE_RESOURCE_GROUP, - "name": data.values.AZURE_IMAGE_NAME, - "subscriptionID": data.values.AZURE_IMAGE_SUBSCRIPTION_ID, - "gallery": data.values.AZURE_IMAGE_GALLERY, - "version": data.values.AZURE_IMAGE_VERSION - } - return { - "sharedGallery": sharedGallery - } - end - - if data.values.AZURE_IMAGE_PUBLISHER: - marketplace = { - "publisher": data.values.AZURE_IMAGE_PUBLISHER, - "offer": data.values.AZURE_IMAGE_OFFER, - "sku": data.values.AZURE_IMAGE_SKU, - "version": data.values.AZURE_IMAGE_VERSION, - "thirdPartyImage": data.values.AZURE_IMAGE_THIRD_PARTY - } - - return { - "marketplace": marketplace - } - end - - return None -end - -def get_azure_image_from_bom(tkrBomData): - - if not hasattr(tkrBomData, 'azure'): - fail("no image information in BOM") - end - - sharedGallery = get_shared_gallery_image(tkrBomData) - if sharedGallery != None: - return sharedGallery - end - - marketplace = get_marketplace_image(tkrBomData) - if marketplace != None: - return marketplace - end - - fail("invalid image information in BOM") -end - - -def get_shared_gallery_image(tkrBomData): - keysRequired = ['resourceGroup', 'name', 'subscriptionID', 'gallery', 'version', 'osinfo', 'metadata'] - keysFromBom = dir(tkrBomData.azure[0]) - keysFromBom.append('osinfo') - keysFromBom.append('metadata') - - if set(keysRequired) == set(keysFromBom): - sharedGallery = { - "resourceGroup": tkrBomData.azure[0].resourceGroup, - "name": tkrBomData.azure[0].name, - "subscriptionID": tkrBomData.azure[0].subscriptionID, - "gallery": tkrBomData.azure[0].gallery, - "version": tkrBomData.azure[0].version - } - return { - "sharedGallery": sharedGallery - } - else: - return None - end -end - -def get_marketplace_image(tkrBomData): - keysRequired = ['publisher', 'offer', 'sku', 'version', 'thirdPartyImage', 'osinfo', 'metadata'] - keysFromBom = dir(tkrBomData.azure[0]) - keysFromBom.append('thirdPartyImage') - keysFromBom.append('osinfo') - keysFromBom.append('metadata') - - if set(keysRequired) == set(keysFromBom): - marketplace = { - "publisher": tkrBomData.azure[0].publisher, - "offer": tkrBomData.azure[0].offer, - "sku": tkrBomData.azure[0].sku, - "version": tkrBomData.azure[0].version, - "thirdPartyImage": False - } - - if hasattr(tkrBomData.azure[0], 'thirdPartyImage'): - marketplace["thirdPartyImage"] = tkrBomData.azure[0].thirdPartyImage - end - - return { - "marketplace": marketplace - } - else: - return None - end -end - -def get_vsphere_thumbprint(): - if data.values.VSPHERE_INSECURE: - return "" - end - return data.values.VSPHERE_TLS_THUMBPRINT -end - -#! Change done in this function needs to be done in `kapp-controller-values/helper.star` as well. -def get_no_proxy(): - if data.values.TKG_HTTP_PROXY != "": - full_no_proxy_list = [] - if data.values.TKG_NO_PROXY != "": - # trim space in the no_proxy list - full_no_proxy_list = regexp.replace(" ", data.values.TKG_NO_PROXY, "").split(",") - end - if data.values.PROVIDER_TYPE == "aws": - if data.values.AWS_VPC_CIDR != "": - full_no_proxy_list.append(data.values.AWS_VPC_CIDR) - end - full_no_proxy_list.append("169.254.0.0/16") - end - if data.values.PROVIDER_TYPE == "azure": - if data.values.AZURE_VNET_CIDR != "": - full_no_proxy_list.append(data.values.AZURE_VNET_CIDR) - end - full_no_proxy_list.append("169.254.0.0/16") - full_no_proxy_list.append("168.63.129.16") - end - full_no_proxy_list.append(data.values.SERVICE_CIDR) - full_no_proxy_list.append(data.values.CLUSTER_CIDR) - full_no_proxy_list.append("localhost") - full_no_proxy_list.append("127.0.0.1") - if data.values.TKG_IP_FAMILY in ["ipv6", "ipv4,ipv6", "ipv6,ipv4"]: - full_no_proxy_list.append("::1") - end - full_no_proxy_list.append(".svc") - full_no_proxy_list.append(".svc.cluster.local") - populated_no_proxy = ",".join(list(set(full_no_proxy_list))) - return populated_no_proxy - end - return "" -end - -def validate_proxy_bypass_vsphere_host(): - if data.values.PROVIDER_TYPE == "vsphere" and not data.values.VSPHERE_INSECURE: - no_proxy_list = [] - if data.values.TKG_NO_PROXY != "": - no_proxy_list = data.values.TKG_NO_PROXY.split(",") - if data.values.VSPHERE_SERVER not in no_proxy_list: - assert.fail("unable to proxy traffic to vSphere host in security connection, either set VSPHERE_INSECURE to true or add VSPHERE_SERVER to TKG_NO_PROXY") - end - end - end -end - -# get_labels_map_from_string constructs a map from given string of the format "key1=label1,key2=label2" -def get_labels_map_from_string(labelString): - labelMap = {} - for val in regexp.replace(" ", labelString, "").split(','): - kv = val.split('=') - if len(kv) != 2: - assert.fail("given labels string \""+labelString+"\" must be in the \"key1=label1,key2=label2\" format ") - end - labelMap.update({kv[0]: kv[1]}) - end - return labelMap -end - -def compare_semver_versions(a, b): - a_array = regexp.replace("v?(\d+\.\d+\.\d+).*", a, "$1").split(".") - b_array = regexp.replace("v?(\d+\.\d+\.\d+).*", b, "$1").split(".") - for i in range(len(a_array)): - if int(a_array[i]) > int(b_array[i]): - return 1 - elif int(a_array[i]) < int(b_array[i]): - return -1 - end - end - return 0 -end - -def enable_csi_driver(): - tkrVersion = get_tkr_version_from_tkr_name(data.values.KUBERNETES_RELEASE) - if compare_semver_versions(tkrVersion, "v1.23.0") >= 0: - return True - end - return False -end - -def disable_cgroupdriver_cgroupfs(): - tkrVersion = get_tkr_version_from_tkr_name(data.values.KUBERNETES_RELEASE) - if compare_semver_versions(tkrVersion, "v1.24.0") >= 0: - return True - end - return False -end - -def activate_pod_security_standard(): - # disable if pod security is explicitly disabled - if data.values.POD_SECURITY_STANDARD_DEACTIVATED: - return False - end - tkrVersion = get_tkr_version_from_tkr_name(data.values.KUBERNETES_RELEASE) - if compare_semver_versions(tkrVersion, "v1.24.0") >= 0: - return True - end - return False -end - -def map(f, list): - return [f(x) for x in list] -end \ No newline at end of file diff --git a/providers/ytt/lib/validate.star b/providers/ytt/lib/validate.star deleted file mode 100644 index f87f510f31..0000000000 --- a/providers/ytt/lib/validate.star +++ /dev/null @@ -1,117 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:assert", "assert") -load("/lib/helpers.star", "validate_proxy_bypass_vsphere_host") - -required_variable_list_vsphere = [ - "VSPHERE_USERNAME", - "VSPHERE_PASSWORD", - "VSPHERE_SERVER", - "VSPHERE_DATACENTER", - "VSPHERE_RESOURCE_POOL", - "VSPHERE_FOLDER", - "VSPHERE_SSH_AUTHORIZED_KEY"] - -required_variable_list_aws = [ - "AWS_REGION", - "AWS_SSH_KEY_NAME"] - -required_variable_list_azure = [ - "AZURE_SUBSCRIPTION_ID", - "AZURE_LOCATION", - "AZURE_SSH_PUBLIC_KEY_B64"] - -required_variable_list_oci = [ - "OCI_COMPARTMENT_ID", - "OCI_IMAGE_ID"] - -required_variable_list_tkgs = [ - "CONTROL_PLANE_STORAGE_CLASS", - "CONTROL_PLANE_VM_CLASS", - "SERVICE_DOMAIN", - "WORKER_STORAGE_CLASS", - "WORKER_VM_CLASS", - "NODE_POOL_0_NAME"] - -def validate_configuration(provider): - #! skip validation when only employing the template to generate - #! addon resources (which is doable without a complete set of - #! config data values). - if data.values.FILTER_BY_ADDON_TYPE: - return - end - - validate_kcp_certificate_rotation_config() - - if provider == "vsphere": - flag_missing_variable_error(required_variable_list_vsphere) - if data.values.NSXT_POD_ROUTING_ENABLED == True: - validate_nsxt_config() - end - #! known issue for govc: https://github.com/vmware/govmomi/issues/2494 - #! TODO: remove the validation once the issue is resolved - if data.values.TKG_HTTP_PROXY != "": - validate_proxy_bypass_vsphere_host() - end - elif provider == "aws": - flag_missing_variable_error(required_variable_list_aws) - elif provider == "azure": - flag_missing_variable_error(required_variable_list_azure) - elif provider == "oci": - flag_missing_variable_error(required_variable_list_oci) - elif provider == "tkgs": - flag_missing_variable_error(required_variable_list_tkgs) - end -end - -def flag_missing_variable_error(variables_list): - missing_variable_str = "" - for variable in variables_list: - value = getattr(data.values, variable, None) - if value == None or value == "": - missing_variable_str = missing_variable_str + variable + ", " - end - end - if missing_variable_str != "": - assert.fail("missing configuration variables: " + missing_variable_str[:-2]) - end -end - -def validate_nsxt_config(): - if data.values.NSXT_VMC_ACCESS_TOKEN != "": - if data.values.NSXT_VMC_AUTH_HOST == "": - assert.fail("vmc auth host must be provided if access token is provided") - end - elif data.values.NSXT_USERNAME != "": - if data.values.NSXT_PASSWORD == "" or data.values.NSXT_PASSWORD == "None": - assert.fail("password is reqruied if username is provided") - end - if data.values.NSXT_SECRET_NAME == "" or data.values.NSXT_SECRET_NAMESPACE == "": - assert.fail("secretName and secretNamespace should not be empty if username and password are provided") - end - elif data.values.NSXT_CLIENT_CERT_KEY_DATA != "": - if data.values.NSXT_CLIENT_CERT_DATA == "": - assert.fail("client cert data is required if client cert key data is provided") - end - elif data.values.NSXT_CLIENT_CERT_DATA != "": - if data.values.NSXT_CLIENT_CERT_KEY_DATA == "": - assert.fail("client cert key data is required if client cert data is provided") - end - elif data.values.NSXT_SECRET_NAME != "": - if data.values.NSXT_SECRET_NAMESPACE == "": - assert.fail("secret namespace is required if secret name is provided") - end - elif data.values.NSXT_SECRET_NAMESPACE != "": - if data.values.NSXT_SECRET_NAME == "": - assert.fail("secret name is required if secret namespace is provided") - end - else: - assert.fail("user/password or vmc access token or client certificates must be set") - end - data.values.NSXT_MANAGER_HOST != "" or assert.fail("missing configuration variables: NSXT_MANAGER_HOST") -end - -def validate_kcp_certificate_rotation_config(): - if data.values.CONTROLPLANE_CERTIFICATE_ROTATION_DAYS_BEFORE < 7 : - assert.fail("certificatesExpiryDays must be set as integer with a minimum value of 7 when certificate automatic renewal is enabled") - end -end diff --git a/providers/ytt/vendir/cni/_ytt_lib/LICENSE b/providers/ytt/vendir/cni/_ytt_lib/LICENSE deleted file mode 100644 index 68c771a099..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/LICENSE +++ /dev/null @@ -1,176 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - diff --git a/providers/ytt/vendir/cni/_ytt_lib/NOTICE b/providers/ytt/vendir/cni/_ytt_lib/NOTICE deleted file mode 100644 index df374c7ac0..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/NOTICE +++ /dev/null @@ -1,182 +0,0 @@ -Tanzu Community Edition -Copyright 2020 VMware, Inc. - -The Apache 2.0 license (the "License") set forth below applies to all parts of the Tanzu Community Edition project. You may not use this file except in compliance with the License. - -Apache License - -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, -and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the -copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other -entities that control, are controlled by, or are under common control -with that entity. For the purposes of this definition, "control" means -(i) the power, direct or indirect, to cause the direction or management -of such entity, whether by contract or otherwise, or (ii) ownership -of fifty percent (50%) or more of the outstanding shares, or (iii) -beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation source, -and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation -or translation of a Source form, including but not limited to compiled -object code, generated documentation, and conversions to other media -types. - -"Work" shall mean the work of authorship, whether in Source or -Object form, made available under the License, as indicated by a copyright -notice that is included in or attached to the work (an example is provided -in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, -that is based on (or derived from) the Work and for which the editorial -revisions, annotations, elaborations, or other modifications represent, -as a whole, an original work of authorship. For the purposes of this -License, Derivative Works shall not include works that remain separable -from, or merely link (or bind by name) to the interfaces of, the Work -and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the -original version of the Work and any modifications or additions to -that Work or Derivative Works thereof, that is intentionally submitted -to Licensor for inclusion in the Work by the copyright owner or by an -individual or Legal Entity authorized to submit on behalf of the copyright -owner. For the purposes of this definition, "submitted" means any form of -electronic, verbal, or written communication sent to the Licensor or its -representatives, including but not limited to communication on electronic -mailing lists, source code control systems, and issue tracking systems -that are managed by, or on behalf of, the Licensor for the purpose of -discussing and improving the Work, but excluding communication that is -conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity -on behalf of whom a Contribution has been received by Licensor and -subsequently incorporated within the Work. - -2. Grant of Copyright License. -Subject to the terms and conditions of this License, each Contributor -hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable copyright license to reproduce, prepare -Derivative Works of, publicly display, publicly perform, sublicense, and -distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. -Subject to the terms and conditions of this License, each Contributor -hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty- free, irrevocable (except as stated in this section) patent -license to make, have made, use, offer to sell, sell, import, and -otherwise transfer the Work, where such license applies only to those -patent claims licensable by such Contributor that are necessarily -infringed by their Contribution(s) alone or by combination of -their Contribution(s) with the Work to which such Contribution(s) -was submitted. If You institute patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Work or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses granted -to You under this License for that Work shall terminate as of the date -such litigation is filed. - -4. Redistribution. -You may reproduce and distribute copies of the Work or Derivative Works -thereof in any medium, with or without modifications, and in Source or -Object form, provided that You meet the following conditions: - - a. You must give any other recipients of the Work or Derivative Works - a copy of this License; and - - b. You must cause any modified files to carry prominent notices stating - that You changed the files; and - - c. You must retain, in the Source form of any Derivative Works that - You distribute, all copyright, patent, trademark, and attribution - notices from the Source form of the Work, excluding those notices - that do not pertain to any part of the Derivative Works; and - - d. If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one of - the following places: within a NOTICE text file distributed as part - of the Derivative Works; within the Source form or documentation, - if provided along with the Derivative Works; or, within a display - generated by the Derivative Works, if and wherever such third-party - notices normally appear. The contents of the NOTICE file are for - informational purposes only and do not modify the License. You - may add Your own attribution notices within Derivative Works that - You distribute, alongside or as an addendum to the NOTICE text - from the Work, provided that such additional attribution notices - cannot be construed as modifying the License. You may add Your own - copyright statement to Your modifications and may provide additional - or different license terms and conditions for use, reproduction, or - distribution of Your modifications, or for any such Derivative Works - as a whole, provided Your use, reproduction, and distribution of the - Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. -Unless You explicitly state otherwise, any Contribution intentionally -submitted for inclusion in the Work by You to the Licensor shall be -under the terms and conditions of this License, without any additional -terms or conditions. Notwithstanding the above, nothing herein shall -supersede or modify the terms of any separate license agreement you may -have executed with Licensor regarding such Contributions. - -6. Trademarks. -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. -Unless required by applicable law or agreed to in writing, Licensor -provides the Work (and each Contributor provides its Contributions) on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either -express or implied, including, without limitation, any warranties or -conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR -A PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any risks -associated with Your exercise of permissions under this License. - -8. Limitation of Liability. -In no event and under no legal theory, whether in tort (including -negligence), contract, or otherwise, unless required by applicable law -(such as deliberate and grossly negligent acts) or agreed to in writing, -shall any Contributor be liable to You for damages, including any direct, -indirect, special, incidental, or consequential damages of any character -arising as a result of this License or out of the use or inability to -use the Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all other -commercial damages or losses), even if such Contributor has been advised -of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. -While redistributing the Work or Derivative Works thereof, You may -choose to offer, and charge a fee for, acceptance of support, warranty, -indemnity, or other liability obligations and/or rights consistent with -this License. However, in accepting such obligations, You may act only -on Your own behalf and on Your sole responsibility, not on behalf of -any other Contributor, and only if You agree to indemnify, defend, and -hold each Contributor harmless for any liability incurred by, or claims -asserted against, such Contributor by reason of your accepting any such -warranty or additional liability. - -END OF TERMS AND CONDITIONS - - - diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/kapp-config.yaml b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/kapp-config.yaml deleted file mode 100644 index 4d382c657f..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/kapp-config.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: kapp.k14s.io/v1alpha1 -kind: Config -rebaseRules: -- path: [data] - type: copy - sources: [existing, new] - resourceMatchers: - - kindNamespaceNameMatcher: {kind: ConfigMap, namespace: kube-system, name: antrea-ca} - -- path: [spec, caBundle] - type: copy - sources: [existing, new] - resourceMatchers: - - anyMatcher: - matchers: - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1alpha1.stats.antrea.io} - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1alpha1.stats.antrea.tanzu.vmware.com} - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1beta1.system.antrea.io} - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1beta1.system.antrea.tanzu.vmware.com} - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1beta2.controlplane.antrea.io} - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1beta2.controlplane.antrea.tanzu.vmware.com} diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/overlay/antrea-overlay.yaml b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/overlay/antrea-overlay.yaml deleted file mode 100644 index dfd68baab1..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/overlay/antrea-overlay.yaml +++ /dev/null @@ -1,460 +0,0 @@ -#! antrea-overlay.yaml - -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("/values.star", "values") - -#@ def antrea_agent_conf(): - -#! FeatureGates is a map of feature names to bools that enable or disable experimental features. -featureGates: - #! Enable AntreaProxy which provides ServiceLB for in-cluster Services in antrea-agent. - #! It should be enabled on Windows, otherwise NetworkPolicy will not take effect on - #! Service traffic. - AntreaProxy: #@ values.antrea.config.featureGates.AntreaProxy - - #! Enable EndpointSlice support in AntreaProxy. Don't enable this feature unless that EndpointSlice - #! API version v1beta1 is supported and set as enabled in Kubernetes. If AntreaProxy is not enabled, - #! this flag will not take effect. - EndpointSlice: #@ values.antrea.config.featureGates.EndpointSlice - - #! Enable TopologyAwareHints in AntreaProxy. This requires AntreaProxy and EndpointSlice to be - #! enabled, otherwise this flag will not take effect. - TopologyAwareHints: #@ values.antrea.config.featureGates.TopologyAwareHints - - #! Enable traceflow which provides packet tracing feature to diagnose network issue. - Traceflow: #@ values.antrea.config.featureGates.AntreaTraceflow - - #! Enable NodePortLocal feature to make the pods reachable externally through NodePort - NodePortLocal: #@ values.antrea.config.featureGates.NodePortLocal - - #! Enable Antrea ClusterNetworkPolicy feature to complement K8s NetworkPolicy for cluster admins - #! to define security policies which apply to the entire cluster, and Antrea NetworkPolicy - #! feature that supports priorities, rule actions and externalEntities in the future. - AntreaPolicy: #@ values.antrea.config.featureGates.AntreaPolicy - - #! Enable flowexporter which exports polled conntrack connections as IPFIX flow records from each - #! agent to a configured collector. - FlowExporter: #@ values.antrea.config.featureGates.FlowExporter - - #! Enable collecting and exposing NetworkPolicy statistics. - NetworkPolicyStats: #@ values.antrea.config.featureGates.NetworkPolicyStats - - #! Enable controlling SNAT IPs of Pod egress traffic. - Egress: #@ values.antrea.config.featureGates.Egress - - #! Enable flexible IPAM mode for Antrea. This mode allows to assign IP Ranges to Namespaces, - #! Deployments and StatefulSets via IP Pool annotation. - AntreaIPAM: #@ values.antrea.config.featureGates.AntreaIPAM - - #! Enable multicast traffic. This feature is supported only with noEncap mode. - Multicast: #@ values.antrea.config.featureGates.Multicast - - #! Enable Antrea Multi-cluster Gateway to support cross-cluster traffic. - #! This feature is supported only with encap mode. - Multicluster: #@ values.antrea.config.featureGates.Multicluster - - #! Enable support for provisioning secondary network interfaces for Pods (using Pod annotations). - #! At the moment, Antrea can only create secondary network interfaces using SR-IOV VFs on baremetal Nodes. - SecondaryNetwork: #@ values.antrea.config.featureGates.SecondaryNetwork - - #! Enable managing external IPs of Services of LoadBalancer type. - ServiceExternalIP: #@ values.antrea.config.featureGates.ServiceExternalIP - - #! Enable mirroring or redirecting the traffic Pods send or receive. - TrafficControl: #@ values.antrea.config.featureGates.TrafficControl - -#! Name of the OpenVSwitch bridge antrea-agent will create and use. -#! Make sure it doesn't conflict with your existing OpenVSwitch bridges. -#!ovsBridge: br-int - -#! Datapath type to use for the OpenVSwitch bridge created by Antrea. Supported values are: -#! - system -#! - netdev -#! 'system' is the default value and corresponds to the kernel datapath. Use 'netdev' to run -#! OVS in userspace mode. Userspace mode requires the tun device driver to be available. -#@ if values.infraProvider == "docker": -ovsDatapathType: netdev -#@ end - -#! Name of the interface antrea-agent will create and use for host <--> pod communication. -#! Make sure it doesn't conflict with your existing interfaces. -#!hostGateway: antrea-gw0 - -#! Determines how traffic is encapsulated. It has the following options: -#! encap(default): Inter-node Pod traffic is always encapsulated and Pod to external network -#! traffic is SNAT'd. -#! noEncap: Inter-node Pod traffic is not encapsulated; Pod to external network traffic is -#! SNAT'd if noSNAT is not set to true. Underlying network must be capable of -#! supporting Pod traffic across IP subnets. -#! hybrid: noEncap if source and destination Nodes are on the same subnet, otherwise encap. -#! networkPolicyOnly: Antrea enforces NetworkPolicy only, and utilizes CNI chaining and delegates Pod -#! IPAM and connectivity to the primary CNI. -#! -trafficEncapMode: #@ values.antrea.config.trafficEncapMode - -#! Whether or not to SNAT (using the Node IP) the egress traffic from a Pod to the external network. -#! This option is for the noEncap traffic mode only, and the default value is false. In the noEncap -#! mode, if the cluster's Pod CIDR is reachable from the external network, then the Pod traffic to -#! the external network needs not be SNAT'd. In the networkPolicyOnly mode, antrea-agent never -#! performs SNAT and this option will be ignored; for other modes it must be set to false. -noSNAT: #@ values.antrea.config.noSNAT - -#! Tunnel protocols used for encapsulating traffic across Nodes. Supported values: -#! - geneve (default) -#! - vxlan -#! - gre -#! - stt -tunnelType: #@ values.antrea.config.tunnelType - -#! TunnelPort is the destination port for UDP and TCP based tunnel protocols (Geneve, VXLAN, and STT). -#! If zero, it will use the assigned IANA port for the protocol, i.e. 6081 for Geneve, 4789 for VXLAN, -#! and 7471 for STT. -tunnelPort: #@ values.antrea.config.tunnelPort - -#! TunnelCsum determines whether to compute UDP encapsulation header (Geneve or VXLAN) checksums on outgoing -#! packets. For Linux kernel before Mar 2021, UDP checksum must be present to trigger GRO on the receiver for better -#! performance of Geneve and VXLAN tunnels. The issue has been fixed by -#! https://github.com/torvalds/linux/commit/89e5c58fc1e2857ccdaae506fb8bc5fed57ee063, thus computing UDP checksum is -#! no longer necessary. -#! It should only be set to true when you are using an unpatched Linux kernel and observing poor transfer performance. -tunnelCsum: #@ values.antrea.config.tunnelCsum - -#! Determines how tunnel traffic is encrypted. Currently encryption only works with encap mode. -#! It has the following options: -#! - none (default): Inter-node Pod traffic will not be encrypted. -#! - ipsec: Enable IPsec (ESP) encryption for Pod traffic across Nodes. Antrea uses -#! Preshared Key (PSK) for IKE authentication. When IPsec tunnel is enabled, -#! the PSK value must be passed to Antrea Agent through an environment -#! variable: ANTREA_IPSEC_PSK. -#! - wireGuard: Enable WireGuard for tunnel traffic encryption. -trafficEncryptionMode: #@ values.antrea.config.trafficEncryptionMode - -#! Enable bridging mode of Pod network on Nodes, in which the Node's transport interface is connected -#! to the OVS bridge, and cross-Node/VLAN traffic of AntreaIPAM Pods (Pods whose IP addresses are -#! allocated by AntreaIPAM from IPPools) is sent to the underlay network, and forwarded/routed by the -#! underlay network. -#! This option requires the `AntreaIPAM` feature gate to be enabled. At this moment, it supports only -#! IPv4 and Linux Nodes, and can be enabled only when `ovsDatapathType` is `system`, -#! `trafficEncapMode` is `noEncap`, and `noSNAT` is true. -enableBridgingMode: #@ values.antrea.config.enableBridgingMode - -#! Disable TX checksum offloading for container network interfaces. It's supposed to be set to true when the -#! datapath doesn't support TX checksum offloading, which causes packets to be dropped due to bad checksum. -#! It affects Pods running on Linux Nodes only. -disableTXChecksumOffload: #@ values.antrea.config.disableTXChecksumOffload - - -#! Default MTU to use for the host gateway interface and the network interface of each Pod. -#! If omitted, antrea-agent will discover the MTU of the Node's primary interface and -#! also adjust MTU to accommodate for tunnel encapsulation overhead (if applicable). -#@ if/end values.antrea.config.defaultMTU: -defaultMTU: #@ values.antrea.config.defaultMTU - -#! wireGuard specifies WireGuard related configurations. -wireGuard: -#@ if values.antrea.config.wireGuard: - #! The port for WireGuard to receive traffic. - port: #@ values.antrea.config.wireGuard.port -#@ end - -egress: -#@ if values.antrea.config.featureGates.Egress: - #! exceptCIDRs is the CIDR ranges to which outbound Pod traffic will not be SNAT'd by Egresses. - exceptCIDRs: #@ values.antrea.config.egress.exceptCIDRs -#@ end - -#! ClusterIP CIDR range for Services. It's required when AntreaProxy is not enabled, and should be -#! set to the same value as the one specified by --service-cluster-ip-range for kube-apiserver. When -#! AntreaProxy is enabled, this parameter is not needed and will be ignored if provided. -serviceCIDR: #@ values.antrea.config.serviceCIDR - -#! ClusterIP CIDR range for IPv6 Services. It's required when using kube-proxy to provide IPv6 Service in a Dual-Stack -#! cluster or an IPv6 only cluster. The value should be the same as the configuration for kube-apiserver specified by -#! --service-cluster-ip-range. When AntreaProxy is enabled, this parameter is not needed. -#! No default value for this field. -#@ if/end values.antrea.config.serviceCIDRv6: -serviceCIDRv6: #@ values.antrea.config.serviceCIDRv6 - -#! The port for the antrea-agent APIServer to serve on. -#! Note that if it's set to another value, the `containerPort` of the `api` port of the -#! `antrea-agent` container must be set to the same value. -#!apiPort: 10350 - -#! Enable metrics exposure via Prometheus. Initializes Prometheus metrics listener. -#!enablePrometheusMetrics: true - -#! Provide the IPFIX collector address as a string with format :[][:]. -#! HOST can either be the DNS name or the IP of the Flow Collector. For example, -#! "flow-aggregator.flow-aggregator.svc" can be provided as DNS name to connect -#! to the Antrea Flow Aggregator service. If IP, it can be either IPv4 or IPv6. -#! However, IPv6 address should be wrapped with []. -#! If PORT is empty, we default to 4739, the standard IPFIX port. -#! If no PROTO is given, we consider "tls" as default. We support "tls", "tcp" and -#! "udp" protocols. "tls" is used for securing communication between flow exporter and -#! flow aggregator. -#@ if/end values.antrea.config.featureGates.FlowExporter: -flowCollectorAddr: #@ values.antrea.config.flowExporter.collectorAddress - -#! Provide flow poll interval as a duration string. This determines how often the flow exporter dumps connections from the conntrack module. -#! Flow poll interval should be greater than or equal to 1s (one second). -#! Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". -#@ if/end values.antrea.config.featureGates.FlowExporter: -flowPollInterval: #@ values.antrea.config.flowExporter.pollInterval - -#! Provide the active flow export timeout, which is the timeout after which a flow -#! record is sent to the collector for active flows. Thus, for flows with a continuous -#! stream of packets, a flow record will be exported to the collector once the elapsed -#! time since the last export event is equal to the value of this timeout. -#! Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". -#@ if/end values.antrea.config.featureGates.FlowExporter: -activeFlowExportTimeout: #@ values.antrea.config.flowExporter.activeFlowTimeout - -#! Provide the idle flow export timeout, which is the timeout after which a flow -#! record is sent to the collector for idle flows. A flow is considered idle if no -#! packet matching this flow has been observed since the last export event. -#! Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". -#@ if/end values.antrea.config.featureGates.FlowExporter: -idleFlowExportTimeout: #@ values.antrea.config.flowExporter.idleFlowTimeout - -nodePortLocal: -#@ if values.antrea.config.featureGates.NodePortLocal: - #! Enable NodePortLocal, a feature used to make Pods reachable using port forwarding on the host. To - #! enable this feature, you need to set "enable" to true, and ensure that the NodePortLocal feature - #! gate is also enabled (which is the default). - enable: #@ values.antrea.config.nodePortLocal.enabled - #! Provide the port range used by NodePortLocal. When the NodePortLocal feature is enabled, a port - #! from that range will be assigned whenever a Pod's container defines a specific port to be exposed - #! (each container can define a list of ports as pod.spec.containers[].ports), and all Node traffic - #! directed to that port will be forwarded to the Pod. - portRange: #@ values.antrea.config.nodePortLocal.portRange -#@ end - -#! Provide the address of Kubernetes apiserver, to override any value provided in kubeconfig or InClusterConfig. -#! Defaults to "". It must be a host string, a host:port pair, or a URL to the base of the apiserver. -#@ if/end values.antrea.config.kubeAPIServerOverride: -kubeAPIServerOverride: #@ values.antrea.config.kubeAPIServerOverride - -#! Provide the address of DNS server, to override the kube-dns service. It's used to resolve hostname in FQDN policy. -#! Defaults to "". It must be a host string or a host:port pair of the DNS server (e.g. 10.96.0.10, 10.96.0.10:53, -#! [fd00:10:96::a]:53). -#@ if/end values.antrea.config.dnsServerOverride: -dnsServerOverride: #@ values.antrea.config.dnsServerOverride - - -#! Comma-separated list of Cipher Suites. If omitted, the default Go Cipher Suites will be used. -#! https://golang.org/pkg/crypto/tls/#pkg-constants -#! Note that TLS1.3 Cipher Suites cannot be added to the list. But the apiserver will always -#! prefer TLS1.3 Cipher Suites whenever possible. -tlsCipherSuites: #@ values.antrea.config.tlsCipherSuites - -#! TLS min version from: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13. -#!tlsMinVersion: - -#! The name of the interface on Node which is used for tunneling or routing the traffic across Nodes. -#! If there are multiple IP addresses configured on the interface, the first one is used. The IP -#! address used for tunneling or routing traffic to remote Nodes is decided in the following order of -#! preference (from highest to lowest): -#! 1. transportInterface -#! 2. transportInterfaceCIDRs -#! 3. The Node IP -#@ if/end values.antrea.config.transportInterface: -transportInterface: #@ values.antrea.config.transportInterface - -multicast: -#@ if values.antrea.config.featureGates.Multicast: - #! The names of the interfaces on Nodes that are used to forward multicast traffic. - #! Defaults to transport interface if not set. - #@ if/end values.antrea.config.multicastInterfaces: - multicastInterfaces: #@ values.antrea.config.multicastInterfaces - - #! The interval at which the antrea-agent sends IGMP queries to Pods. - #! Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". - igmpQueryInterval: #@ values.antrea.config.multicast.igmpQueryInterval -#@ end - -#! The network CIDRs of the interface on Node which is used for tunneling or routing the traffic across -#! Nodes. If there are multiple interfaces configured the same network CIDR, the first one is used. The -#! IP address used for tunneling or routing traffic to remote Nodes is decided in the following order of -#! preference (from highest to lowest): -#! 1. transportInterface -#! 2. transportInterfaceCIDRs -#! 3. The Node IP -#@ if/end values.antrea.config.transportInterfaceCIDRs: -transportInterfaceCIDRs: #@ values.antrea.config.transportInterfaceCIDRs - -#! Option antreaProxy contains AntreaProxy related configuration options. -antreaProxy: -#@ if values.antrea.config.featureGates.AntreaProxy: - #! ProxyAll tells antrea-agent to proxy all Service traffic, including NodePort, LoadBalancer, and ClusterIP traffic, - #! regardless of where they come from. Therefore, running kube-proxy is no longer required. This requires the AntreaProxy - #! feature to be enabled. - #! Note that this option is experimental. If kube-proxy is removed, option kubeAPIServerOverride must be used to access - #! apiserver directly. - proxyAll: #@ values.antrea.config.antreaProxy.proxyAll - #! A string array of values which specifies the host IPv4/IPv6 addresses for NodePort. Values can be valid IP blocks. - #! (e.g. 1.2.3.0/24, 1.2.3.4/32). An empty string slice is meant to select all host IPv4/IPv6 addresses. - #! Note that the option is only valid when proxyAll is true. - nodePortAddresses: #@ values.antrea.config.antreaProxy.nodePortAddresses - #! An array of string values to specify a list of Services which should be ignored by AntreaProxy (traffic to these - #! Services will not be load-balanced). Values can be a valid ClusterIP (e.g. 10.11.1.2) or a Service name - #! with Namespace (e.g. kube-system/kube-dns) - skipServices: #@ values.antrea.config.antreaProxy.skipServices - #! When ProxyLoadBalancerIPs is set to false, AntreaProxy no longer load-balances traffic destined to the - #! External IPs of LoadBalancer Services. This is useful when the external LoadBalancer provides additional - #! capabilities (e.g. TLS termination) and it is desirable for Pod-to-ExternalIP traffic to be sent to the - #! external LoadBalancer instead of being load-balanced to an Endpoint directly by AntreaProxy. - #! Note that setting ProxyLoadBalancerIPs to false usually only makes sense when ProxyAll is set to true and - #! kube-proxy is removed from the cluser, otherwise kube-proxy will still load-balance this traffic. - proxyLoadBalancerIPs: #@ values.antrea.config.antreaProxy.proxyLoadBalancerIPs -#@ end - - -multicluster: -#@ if values.antrea.config.featureGates.Multicluster: - #! Enable Antrea Multi-cluster Gateway to support cross-cluster traffic. - #! This feature is supported only with encap mode. - enable: #@ values.antrea.config.multicluster.enable - #! The Namespace where Antrea Multi-cluster Controller is running. - #! The default is antrea-agent's Namespace. - #@ if/end values.antrea.config.multicluster.namespace: - namespace: #@ values.antrea.config.multicluster.namespace -#@ end - -#@ end - - -#@ def antrea_controller_conf(): - -#! FeatureGates is a map of feature names to bools that enable or disable experimental features. -featureGates: - #! Enable traceflow which provides packet tracing feature to diagnose network issue. - Traceflow: #@ values.antrea.config.featureGates.AntreaTraceflow - - #! Enable Antrea ClusterNetworkPolicy feature to complement K8s NetworkPolicy for cluster admins - #! to define security policies which apply to the entire cluster, and Antrea NetworkPolicy - #! feature that supports priorities, rule actions and externalEntities in the future. - AntreaPolicy: #@ values.antrea.config.featureGates.AntreaPolicy - - #! Enable collecting and exposing NetworkPolicy statistics. - NetworkPolicyStats: #@ values.antrea.config.featureGates.NetworkPolicyStats - - #! Enable multicast traffic. This feature is supported only with noEncap mode. - Multicast: #@ values.antrea.config.featureGates.Multicast - - #! Enable controlling SNAT IPs of Pod egress traffic. - Egress: #@ values.antrea.config.featureGates.Egress - - #! Enable flexible IPAM mode for Antrea. This mode allows to assign IP Ranges to Namespaces, - #! Deployments and StatefulSets via IP Pool annotation. - AntreaIPAM: #@ values.antrea.config.featureGates.AntreaIPAM - - #! Enable managing external IPs of Services of LoadBalancer type. - ServiceExternalIP: #@ values.antrea.config.featureGates.ServiceExternalIP - -#! The port for the antrea-controller APIServer to serve on. -#! Note that if it's set to another value, the `containerPort` of the `api` port of the -#! `antrea-controller` container must be set to the same value. -#!apiPort: 10349 - -#! Enable metrics exposure via Prometheus. Initializes Prometheus metrics listener. -#!enablePrometheusMetrics: true - -#! Indicates whether to use auto-generated self-signed TLS certificate. -#! If false, A Secret named "antrea-controller-tls" must be provided with the following keys: -#! ca.crt: -#! tls.crt: -#! tls.key: -#! And the Secret must be mounted to directory "/var/run/antrea/antrea-controller-tls" of the -#! antrea-controller container. -#! selfSignedCert: true - -#! Comma-separated list of Cipher Suites. If omitted, the default Go Cipher Suites will be used. -#! https://golang.org/pkg/crypto/tls/#pkg-constants -#! Note that TLS1.3 Cipher Suites cannot be added to the list. But the apiserver will always -#! prefer TLS1.3 Cipher Suites whenever possible. -tlsCipherSuites: #@ values.antrea.config.tlsCipherSuites - -#! TLS min version from: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13. -#!tlsMinVersion: - -#! If Antrea is upgraded from version <= v0.13 and legacy CRDs are used, this option should be -#! enabled, otherwise the CRDs created with the legacy API groups will not take any effect and -#! work as expected. When the mirroring is enabled, if a legacy CRD is created with legacy API -#! groups, mirroring-controller will create a new CRD with the Spec and Labels from the legacy -#! CRD. Afterwards, the modification of Spec and Label in legacy CRD will be synchronized to new -#! CRD automatically. In addition, the modification of Status in new CRD will also be synchronized -#! to legacy CRD automatically. If a legacy CRD is deleted, the corresponding new CRD will be deleted. -#! Note that: to decouple a new CRD from the corresponding legacy CRD, the legacy CRD should be -#! annotated with "crd.antrea.io/stop-mirror". Afterwards, updates to the legacy CRDs will no -#! longer be reflected in the new CRD, and all CRUD operations should be done through the new -#! API groups. After adding the annotation, legacy CRDs can be deleted safely without impacting -#! new CRDs. -#! legacyCRDMirroring: true - -nodeIPAM: -#! Enable the integrated Node IPAM controller within the Antrea controller. -#! enableNodeIPAM: #@ values.antrea.config.nodeIPAM - -#! CIDR ranges for Pods in cluster. String array containing single CIDR range, or multiple ranges. -#! The CIDRs could be either IPv4 or IPv6. At most one CIDR may be specified for each IP family. -#! Value ignored when enableNodeIPAM is false. -#! clusterCIDRs: [] - -#! CIDR ranges for Services in cluster. It is not necessary to specify it when there is no overlap with clusterCIDRs. -#! Value ignored when enableNodeIPAM is false. -#! serviceCIDR: -#! serviceCIDRv6: - -#! Mask size for IPv6 Node CIDR in IPv6 or dual-stack cluster. Value ignored when enableNodeIPAM is false -#! or when IPv6 Pod CIDR is not configured. Valid range is 64 to 126. -#! nodeCIDRMaskSizeIPv6: 64 - - -#! Enable usage reporting (telemetry) to VMware. -#@ if/end values.antrea.config.enableUsageReporting: -enableUsageReporting: #@ values.antrea.config.enableUsageReporting -#@ end - - -#@ def antrea_agent_tweaker_conf(): -#! Enable disableUdpTunnelOffload will disable udp tunnel offloading feature on kubernetes node's default interface. -#! By default, no actions will be taken. -disableUdpTunnelOffload: #@ values.antrea.config.disableUdpTunnelOffload -#@ end - - -#! Antrea agent and controller configuration -#@overlay/match by=overlay.subset({"kind":"ConfigMap","metadata":{"name": "antrea-config"}}) ---- -kind: ConfigMap -data: - antrea-agent.conf: #@ yaml.encode(antrea_agent_conf()) - antrea-controller.conf: #@ yaml.encode(antrea_controller_conf()) - - -#! Antrea agent tweaker configuration -#@overlay/match by=overlay.subset({"kind":"ConfigMap","metadata":{"name": "antrea-agent-tweaker"}}) ---- -kind: ConfigMap -data: - antrea-agent-tweaker.conf: #@ yaml.encode(antrea_agent_tweaker_conf()) - - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "antrea-controller"}}) ---- -kind: Deployment -metadata: - name: antrea-controller - #@overlay/match missing_ok=True - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" - - -#@overlay/match by=overlay.subset({"kind":"DaemonSet","metadata":{"name": "antrea-agent"}}) ---- -kind: DaemonSet -metadata: - #@overlay/match missing_ok=True - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/overlay/update-strategy-overlay.yaml b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/overlay/update-strategy-overlay.yaml deleted file mode 100644 index fa14644c77..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/overlay/update-strategy-overlay.yaml +++ /dev/null @@ -1,50 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#! We are adding this overlay in the package to accommodate the need from vSphere supervisor cluster: -#! `deployment.spec.strategy.type` is configured to `RollingUpdate` -#! `deployment.spec.strategy.rollingUpdate.maxUnavailable` is set to `0`. -#! `deployment.spec.strategy.rollingUpdate.maxSurge` is set to `1`. -#! `deployment.spec.template.spec.nodeSelector`is set to target only `Nodes` -#! `daemonset.spec.updateStrategy.type` is configured to `OnDelete` -#! This overlay makes configuring the above parameters possible -#! Reference: https://github.com/vmware-tanzu/tanzu-framework/issues/1850 - -#@overlay/match expects="0+",by=overlay.subset({"kind":"Deployment"}) ---- -kind: Deployment -spec: - #@ if data.values.deployment.updateStrategy != None: - #@overlay/match missing_ok=True - strategy: - type: #@ data.values.deployment.updateStrategy - #@overlay/match missing_ok=True - #@ if data.values.deployment.updateStrategy == "RollingUpdate": - rollingUpdate: - #@ if/end data.values.deployment.rollingUpdate.maxUnavailable != None: - maxUnavailable: #@ data.values.deployment.rollingUpdate.maxUnavailable - #@ if/end data.values.deployment.rollingUpdate.maxSurge != None: - maxSurge: #@ data.values.deployment.rollingUpdate.maxSurge - #@ end - #@ end - #@ if data.values.nodeSelector != None: - template: - spec: - #@overlay/match missing_ok=True - nodeSelector: - #@ for key in data.values.nodeSelector: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - (@= key @): #@ data.values.nodeSelector[key] - #@ end - #@ end - -#@overlay/match expects="0+",by=overlay.subset({"kind":"DaemonSet"}) ---- -kind: DaemonSet -spec: - #@ if data.values.daemonset.updateStrategy: - #@overlay/match missing_ok=True - updateStrategy: - type: #@ data.values.daemonset.updateStrategy - #@ end diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/schema.yaml b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/schema.yaml deleted file mode 100644 index 5c3982f3e3..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/schema.yaml +++ /dev/null @@ -1,163 +0,0 @@ -#! schema.yaml - -#@data/values-schema -#@schema/desc "OpenAPIv3 Schema for antrea" ---- -#@schema/desc "The cloud provider in use. One of the following options => aws, azure, vsphere, docker" -infraProvider: vsphere -#@schema/desc "NodeSelector configuration applied to all the deployments" -#@schema/type any=True -nodeSelector: -deployment: - #@schema/desc "Update strategy of deployments" - #@schema/nullable - updateStrategy: "" - rollingUpdate: - #@schema/desc "The maxUnavailable of rollingUpdate. Applied only if RollingUpdate is used as updateStrategy" - #@schema/nullable - maxUnavailable: 1 - #@schema/desc "The maxSurge of rollingUpdate. Applied only if RollingUpdate is used as updateStrategy" - #@schema/nullable - maxSurge: 0 -daemonset: - #@schema/desc "Update strategy of daemonsets" - #@schema/nullable - updateStrategy: "" -antrea: - #@schema/desc "Configuration for antrea" - config: - #@schema/desc "Control SNAT IPs of Pod egress traffic." - egress: - #@schema/desc "The CIDR ranges to which outbound Pod traffic will not be SNAT'd by Egresses." - exceptCIDRs: - - "" - nodePortLocal: - #@schema/desc "Enable NodePortLocal feature." - enabled: false - #@schema/desc "Provide the port range used by NodePortLocal." - portRange: "" - #@schema/desc "AntreaProxy related configuration options." - antreaProxy: - #@schema/desc "ProxyAll tells antrea-agent to proxy all Service traffic." - proxyAll: false - #@schema/desc "Specifies the host IPv4/IPv6 addresses for NodePort." - nodePortAddresses: - - "" - #@schema/desc "List of Services which should be ignored by AntreaProxy." - skipServices: - - "" - #@schema/desc "Load-balance traffic destined to the External IPs of LoadBalancer services." - proxyLoadBalancerIPs: false - #@schema/desc "FlowExporter related configuration options." - flowExporter: - #@schema/desc "Provide the IPFIX collector address as a string." - collectorAddress: "" - #@schema/desc "Provide flow poll interval as a duration string." - pollInterval: "" - #@schema/desc "Provide the active flow export timeout." - activeFlowTimeout: "" - #@schema/desc "Provide the idle flow export timeout." - idleFlowTimeout: "" - #@schema/desc "Provide the address of Kubernetes apiserver." - #@schema/nullable - kubeAPIServerOverride: "" - #@schema/desc "The name of the interface on Node which is used for tunneling or routing the traffic." - #@schema/nullable - transportInterface: "" - #@schema/desc "The network CIDRs of the interface on Node which is used for tunneling or routing the traffic." - transportInterfaceCIDRs: - - "" - #@schema/desc "Tunnel protocols used for encapsulating traffic across Nodes. One of the following options => geneve, vxlan, gre, stt" - tunnelType: none - #@schema/desc "TunnelPort is the destination port for UDP and TCP based tunnel protocols (Geneve, VXLAN, and STT)." - tunnelPort: 0 - #@schema/desc "TunnelCsum determines whether to compute UDP encapsulation header (Geneve or VXLAN) checksums on outgoing packets." - tunnelCsum: false - #@schema/desc "Determines how tunnel traffic is encrypted. One of the following options => none, ipsec, wireGuard" - trafficEncryptionMode: none - #@schema/desc "WireGuard related configurations." - wireGuard: - #@schema/desc "The port for WireGuard to receive traffic." - port: 51820 - #@schema/desc "Enable usage reporting (telemetry) to VMware." - enableUsageReporting: false - #@schema/desc "ClusterIP CIDR range for IPv4 Services" - #@schema/nullable - serviceCIDR: 10.96.0.0/12 - #@schema/desc "ClusterIP CIDR range for IPv6 Services" - #@schema/nullable - serviceCIDRv6: "" - #@schema/desc "The traffic encapsulation mode. One of the following options => encap, noEncap, hybrid, networkPolicyOnly" - trafficEncapMode: encap - #@schema/desc "Flag to enable/disable SNAT for the egress traffic from a Pod to the external network" - noSNAT: false - #@schema/desc "Disable UDP tunnel offload feature on default NIC" - disableUdpTunnelOffload: false - #@schema/desc "Default MTU to use for the host gateway interface and the network interface of each Pod" - #@schema/nullable - defaultMTU: "" - #@schema/desc "List of allowed cipher suites. If omitted, the default Go Cipher Suites will be used" - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - #@schema/desc "Enable bridging mode of Pod network on Nodes." - enableBridgingMode: false - #@schema/desc "Disable TX checksum offloading for container network interfaces" - disableTXChecksumOffload: false - #@schema/desc "Provide the address of DNS server, to override the kube-dns service" - #@schema/nullable - dnsServerOverride: "" - #@schema/desc "The names of the interfaces on Nodes that are used to forward multicast traffic." - multicastInterfaces: - - "" - #@schema/desc "Multicast related configuration options" - multicast: - #@schema/desc "The interval at which the antrea-agent sends IGMP queries to Pods." - igmpQueryInterval: "125s" - #@schema/desc "Multicluster related configurations" - multicluster: - #@schema/desc "Enable Antrea Multi-cluster Gateway to support cross-cluster traffic." - enable: false - #@schema/desc "The Namespace where Antrea Multi-cluster Controller is running.Default is antrea-agent's Namespace" - #@schema/nullable - namespace: "" - #@schema/desc "FeatureGates is a map of feature names to flags that enable or disable experimental features" - featureGates: - #@schema/desc "Flag to enable/disable antrea proxy" - AntreaProxy: true - #@schema/desc "Flag to enable/disable EndpointSlice support in AntreaProxy. If AntreaProxy is not enabled, this flag will not take effect" - EndpointSlice: false - #@schema/desc "Flag to enable/disable antrea traceflow" - AntreaTraceflow: true - #@schema/desc "Flag to enable/disable NodePortLocal feature to make the pods reachable externally through NodePort" - NodePortLocal: true - #@schema/desc "Flag to enable/disable antrea policy" - AntreaPolicy: true - #@schema/desc "Flag to enable/disable flow exporter" - FlowExporter: false - #@schema/desc "Flag to enable/disable network policy stats" - NetworkPolicyStats: false - #@schema/desc "Flag to enable/disable SNAT IPs of Pod egress traffic" - Egress: true - #@schema/desc "Flag to enable/disable flexible IPAM mode" - AntreaIPAM: false - #@schema/desc "Flag to enable/disable managing external IPs for Load balancers services" - ServiceExternalIP: false - #@schema/desc "Flag to enable/disable multicast traffic" - Multicast: false - #@schema/desc "Enable Antrea Multi-cluster Gateway to support cross-cluster traffic.This feature is supported only with encap mode." - Multicluster: false - #@schema/desc "Enable support for provisioning secondary network interfaces for Pods (using Pod annotations)." - SecondaryNetwork: false - #@schema/desc "Enable mirroring or redirecting the traffic Pods send or receive." - TrafficControl: false - #@schema/desc "Enable TopologyAwareHints in AntreaProxy. This requires AntreaProxy and EndpointSlice to be enabled." - TopologyAwareHints: false - #! Deprecated. Kept for backward compatibility - image: - #@schema/desc "The repository of antrea image" - repository: "" - #@schema/desc "The path of image" - path: "" - #@schema/desc "The image tag" - tag: "" - #@schema/desc "The pull policy of image" - pullPolicy: IfNotPresent diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/upstream/antrea.yaml b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/upstream/antrea.yaml deleted file mode 100644 index a87da7f066..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/upstream/antrea.yaml +++ /dev/null @@ -1,4853 +0,0 @@ ---- -# Source: crds/antreaagentinfo.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: antreaagentinfos.crd.antrea.io - labels: - app: antrea -spec: - group: crd.antrea.io - versions: - - name: v1beta1 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - description: Health status of this Agent - jsonPath: ".agentConditions[?(@.type=='AgentHealthy')].status" - name: Healthy - type: string - - description: Last time the Healthy Condition was updated - jsonPath: ".agentConditions[?(@.type=='AgentHealthy')].lastHeartbeatTime" - name: Last Heartbeat - type: date - - description: Version of this Agent - jsonPath: ".version" - name: Version - type: string - priority: 1 - - description: Node on which this Agent is running - jsonPath: ".nodeRef.name" - name: Node - type: string - priority: 1 - - description: Number of local Pods managed by this Agent - jsonPath: ".localPodNum" - name: Num Pods - type: integer - priority: 2 - - description: Subnets used by this Agent for Pod IPAM - jsonPath: ".nodeSubnets" - name: Subnets - type: string - priority: 2 - scope: Cluster - names: - plural: antreaagentinfos - singular: antreaagentinfo - kind: AntreaAgentInfo - shortNames: - - aai - ---- -# Source: crds/antreacontrollerinfo.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: antreacontrollerinfos.crd.antrea.io - labels: - app: antrea -spec: - group: crd.antrea.io - versions: - - name: v1beta1 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - x-kubernetes-preserve-unknown-fields: true - additionalPrinterColumns: - - description: Health status of the Controller - jsonPath: ".controllerConditions[?(@.type=='ControllerHealthy')].status" - name: Healthy - type: string - - description: Last time the Healthy Condition was updated - jsonPath: ".controllerConditions[?(@.type=='ControllerHealthy')].lastHeartbeatTime" - name: Last Heartbeat - type: date - - description: Version of the Controller - jsonPath: ".version" - name: Version - type: string - priority: 1 - - description: Number of Agents connected to the Controller - jsonPath: ".connectedAgentNum" - name: Connected Agents - type: integer - priority: 1 - - description: Node on which the Controller is running - jsonPath: ".nodeRef.name" - name: Node - type: string - priority: 1 - - description: Number of Network Policies computed by Controller - jsonPath: ".networkPolicyControllerInfo.networkPolicyNum" - name: Num Network Policies - type: integer - priority: 2 - scope: Cluster - names: - plural: antreacontrollerinfos - singular: antreacontrollerinfo - kind: AntreaControllerInfo - shortNames: - - aci - ---- -# Source: crds/clusternetworkpolicy.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: clusternetworkpolicies.crd.antrea.io - labels: - app: antrea -spec: - group: crd.antrea.io - versions: - - name: v1alpha1 - served: true - storage: true - additionalPrinterColumns: - - name: Tier - type: string - description: The Tier to which this ClusterNetworkPolicy belongs to. - jsonPath: .spec.tier - - name: Priority - type: number - format: float - description: The Priority of this ClusterNetworkPolicy relative to other policies. - jsonPath: .spec.priority - - name: Desired Nodes - type: number - format: int32 - description: The total number of Nodes that should realize the NetworkPolicy. - jsonPath: .status.desiredNodesRealized - - name: Current Nodes - type: number - format: int32 - description: The number of Nodes that have realized the NetworkPolicy. - jsonPath: .status.currentNodesRealized - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - schema: - openAPIV3Schema: - type: object - properties: - spec: - # Ensure that Spec.Priority field is set - required: - - priority - type: object - properties: - tier: - type: string - priority: - type: number - format: float - # Ensure that Spec.Priority field is between 1 and 10000 - minimum: 1.0 - maximum: 10000.0 - appliedTo: - type: array - items: - type: object - # Ensure that Spec.AppliedTo does not allow IPBlock field - properties: - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - group: - type: string - serviceAccount: - type: object - properties: - name: - type: string - namespace: - type: string - required: - - name - - namespace - service: - type: object - properties: - name: - type: string - namespace: - type: string - required: - - name - - namespace - ingress: - type: array - items: - type: object - required: - - action - properties: - appliedTo: - type: array - items: - type: object - # Ensure that rule AppliedTo does not allow IPBlock field - properties: - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - group: - type: string - serviceAccount: - type: object - properties: - name: - type: string - namespace: - type: string - required: - - name - - namespace - service: - type: object - properties: - name: - type: string - namespace: - type: string - required: - - name - - namespace - # Ensure that Action field allows only ALLOW, DROP, REJECT and PASS values - action: - type: string - enum: ['Allow', 'Drop', 'Reject', 'Pass'] - ports: - type: array - items: - type: object - properties: - protocol: - type: string - enum: ['TCP', 'UDP', 'SCTP'] - port: - x-kubernetes-int-or-string: true - endPort: - type: integer - protocols: - type: array - items: - type: object - oneOf: - - required: [icmp] - - required: [igmp] - properties: - icmp: - type: object - properties: - icmpType: - type: integer - minimum: 0 - maximum: 255 - icmpCode: - type: integer - minimum: 0 - maximum: 255 - igmp: - type: object - properties: - igmpType: - type: integer - # Only IGMP query (0x11) is valid igmpType in ingress rules. - enum: [ 0x11 ] - groupAddress: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - from: - type: array - items: - type: object - properties: - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaces: - type: object - properties: - match: - enum: - - Self - type: string - ipBlock: - type: object - properties: - cidr: - type: string - format: cidr - group: - type: string - serviceAccount: - type: object - properties: - name: - type: string - namespace: - type: string - required: - - name - - namespace - nodeSelector: - type: object - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - name: - type: string - enableLogging: - type: boolean - egress: - type: array - items: - type: object - required: - - action - properties: - appliedTo: - type: array - items: - type: object - # Ensure that rule AppliedTo does not allow IPBlock field - properties: - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - group: - type: string - serviceAccount: - type: object - properties: - name: - type: string - namespace: - type: string - required: - - name - - namespace - # Ensure that Action field allows only ALLOW, DROP, REJECT and PASS values - action: - type: string - enum: ['Allow', 'Drop', 'Reject', 'Pass'] - ports: - type: array - items: - type: object - properties: - protocol: - type: string - enum: ['TCP', 'UDP', 'SCTP'] - port: - x-kubernetes-int-or-string: true - endPort: - type: integer - protocols: - type: array - items: - type: object - oneOf: - - required: [icmp] - - required: [igmp] - properties: - icmp: - type: object - properties: - icmpType: - type: integer - minimum: 0 - maximum: 255 - icmpCode: - type: integer - minimum: 0 - maximum: 255 - igmp: - type: object - properties: - igmpType: - type: integer - # Only IGMP reports are igmpType in egress rules, - # 0x12 is IGMP report V1, 0x16 is IGMP report v2, 0x22 is IGMP report v3. - # It will match all IGMP report types if igmpType is not set. - enum: [ 0x12, 0x16, 0x22 ] - groupAddress: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - to: - type: array - items: - type: object - properties: - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaces: - type: object - properties: - match: - enum: - - Self - type: string - ipBlock: - type: object - properties: - cidr: - type: string - format: cidr - group: - type: string - fqdn: - type: string - serviceAccount: - type: object - properties: - name: - type: string - namespace: - type: string - required: - - name - - namespace - nodeSelector: - type: object - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - toServices: - type: array - items: - type: object - required: - - name - - namespace - properties: - name: - type: string - namespace: - type: string - name: - type: string - enableLogging: - type: boolean - status: - type: object - properties: - phase: - type: string - observedGeneration: - type: integer - currentNodesRealized: - type: integer - desiredNodesRealized: - type: integer - conditions: - type: array - items: - type: object - properties: - type: - type: string - status: - type: string - lastTransitionTime: - type: string - reason: - type: string - message: - type: string - subresources: - status: {} - scope: Cluster - names: - plural: clusternetworkpolicies - singular: clusternetworkpolicy - kind: ClusterNetworkPolicy - shortNames: - - acnp - ---- -# Source: crds/egress.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: egresses.crd.antrea.io - labels: - app: antrea -spec: - group: crd.antrea.io - versions: - - name: v1alpha2 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - required: - - spec - properties: - spec: - type: object - required: - - appliedTo - anyOf: - - required: - - egressIP - - required: - - externalIPPool - properties: - appliedTo: - type: object - properties: - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - egressIP: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - externalIPPool: - type: string - status: - type: object - properties: - egressNode: - type: string - additionalPrinterColumns: - - description: Specifies the SNAT IP address for the selected workloads. - jsonPath: .spec.egressIP - name: EgressIP - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: The Owner Node of egress IP - jsonPath: .status.egressNode - name: Node - type: string - subresources: - status: {} - scope: Cluster - names: - plural: egresses - singular: egress - kind: Egress - shortNames: - - eg - ---- -# Source: crds/externalentity.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: externalentities.crd.antrea.io - labels: - app: antrea -spec: - group: crd.antrea.io - versions: - - name: v1alpha2 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - properties: - endpoints: - type: array - items: - type: object - properties: - ip: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - name: - type: string - ports: - type: array - items: - type: object - properties: - protocol: - type: string - enum: ['TCP', 'UDP', 'SCTP'] - port: - x-kubernetes-int-or-string: true - name: - type: string - externalNode: - type: string - - name: v1alpha1 - served: false - storage: false - schema: - openAPIV3Schema: - type: object - scope: Namespaced - names: - plural: externalentities - singular: externalentity - kind: ExternalEntity - shortNames: - - ee - ---- -# Source: crds/externalippool.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: externalippools.crd.antrea.io - labels: - app: antrea -spec: - group: crd.antrea.io - versions: - - name: v1alpha2 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - required: - - spec - properties: - spec: - type: object - required: - - ipRanges - - nodeSelector - properties: - ipRanges: - type: array - items: - type: object - oneOf: - - required: - - cidr - - required: - - start - - end - properties: - cidr: - type: string - format: cidr - start: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - end: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - nodeSelector: - type: object - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - status: - type: object - properties: - usage: - type: object - properties: - total: - type: integer - used: - type: integer - additionalPrinterColumns: - - description: The number of total IPs - jsonPath: .status.usage.total - name: Total - type: integer - - description: The number of allocated IPs - jsonPath: .status.usage.used - name: Used - type: integer - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - subresources: - status: {} - scope: Cluster - names: - plural: externalippools - singular: externalippool - kind: ExternalIPPool - shortNames: - - eip - ---- -# Source: crds/externalnode.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: externalnodes.crd.antrea.io -spec: - group: crd.antrea.io - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - type: object - required: - - spec - properties: - spec: - type: object - required: - - interfaces - properties: - interfaces: - type: array - minItems: 1 - maxItems: 1 - required: - - ips - items: - type: object - properties: - ips: - type: array - minItems: 1 - items: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - name: - type: string - served: true - storage: true - scope: Namespaced - names: - kind: ExternalNode - plural: externalnodes - shortNames: - - en - singular: externalnode ---- -# Source: crds/ippool.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: ippools.crd.antrea.io - labels: - app: antrea -spec: - group: crd.antrea.io - versions: - - name: v1alpha2 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - required: - - spec - properties: - spec: - required: - - ipVersion - - ipRanges - type: object - properties: - ipVersion: - type: integer - enum: [ 4, 6 ] - ipRanges: - items: - oneOf: - - required: - - cidr - - gateway - - prefixLength - - required: - - start - - end - - gateway - - prefixLength - properties: - cidr: - format: cidr - type: string - start: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - end: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - gateway: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - prefixLength: - type: integer - minimum: 1 - maximum: 128 - vlan: - type: integer - minimum: 0 - maximum: 4094 - type: object - type: array - status: - properties: - ipAddresses: - items: - properties: - ipAddress: - type: string - owner: - properties: - pod: - properties: - name: - type: string - namespace: - type: string - containerID: - type: string - ifName: - type: string - type: object - statefulSet: - properties: - name: - type: string - namespace: - type: string - index: - type: integer - type: object - type: object - phase: - type: string - type: object - type: array - usage: - properties: - used: - type: integer - total: - type: integer - type: object - type: object - additionalPrinterColumns: - - description: The number of total IPs - jsonPath: .status.usage.total - name: Total - type: integer - - description: The number of allocated IPs - jsonPath: .status.usage.used - name: Used - type: integer - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - subresources: - status: {} - scope: Cluster - names: - plural: ippools - singular: ippool - kind: IPPool - shortNames: - - ipp - ---- -# Source: crds/networkpolicy.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: networkpolicies.crd.antrea.io - labels: - app: antrea -spec: - group: crd.antrea.io - versions: - - name: v1alpha1 - served: true - storage: true - additionalPrinterColumns: - - name: Tier - type: string - description: The Tier to which this Antrea NetworkPolicy belongs to. - jsonPath: .spec.tier - - name: Priority - type: number - format: float - description: The Priority of this Antrea NetworkPolicy relative to other policies. - jsonPath: .spec.priority - - name: Desired Nodes - type: number - format: int32 - description: The total number of Nodes that should realize the NetworkPolicy. - jsonPath: .status.desiredNodesRealized - - name: Current Nodes - type: number - format: int32 - description: The number of Nodes that have realized the NetworkPolicy. - jsonPath: .status.currentNodesRealized - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - schema: - openAPIV3Schema: - type: object - properties: - spec: - # Ensure that Spec.Priority field is set - required: - - priority - type: object - properties: - tier: - type: string - priority: - type: number - format: float - # Ensure that Spec.Priority field is between 1 and 10000 - minimum: 1.0 - maximum: 10000.0 - appliedTo: - type: array - items: - type: object - # Ensure that Spec.AppliedTo does not allow NamespaceSelector/IPBlock field - properties: - externalEntitySelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - group: - type: string - ingress: - type: array - items: - type: object - required: - - action - properties: - appliedTo: - type: array - items: - type: object - # Ensure that rule AppliedTo does not allow NamespaceSelector/IPBlock field - properties: - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - group: - type: string - # Ensure that Action field allows only ALLOW, DROP, REJECT and PASS values - action: - type: string - enum: ['Allow', 'Drop', 'Reject', 'Pass'] - ports: - type: array - items: - type: object - properties: - protocol: - type: string - enum: ['TCP', 'UDP', 'SCTP'] - port: - x-kubernetes-int-or-string: true - endPort: - type: integer - protocols: - type: array - items: - type: object - oneOf: - - required: [icmp] - - required: [igmp] - properties: - icmp: - type: object - properties: - icmpType: - type: integer - minimum: 0 - maximum: 255 - icmpCode: - type: integer - minimum: 0 - maximum: 255 - igmp: - type: object - properties: - igmpType: - type: integer - # Only IGMP query (0x11) is valid igmpType in ingress rules. - enum: [ 0x11 ] - groupAddress: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - from: - type: array - items: - type: object - properties: - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - externalEntitySelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - ipBlock: - type: object - properties: - cidr: - type: string - format: cidr - nodeSelector: - type: object - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - group: - type: string - name: - type: string - enableLogging: - type: boolean - egress: - type: array - items: - type: object - required: - - action - properties: - appliedTo: - type: array - items: - type: object - # Ensure that rule AppliedTo does not allow NamespaceSelector/IPBlock field - properties: - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - group: - type: string - # Ensure that Action field allows only ALLOW, DROP, REJECT and PASS values - action: - type: string - enum: ['Allow', 'Drop', 'Reject', 'Pass'] - ports: - type: array - items: - type: object - properties: - protocol: - type: string - enum: ['TCP', 'UDP', 'SCTP'] - port: - x-kubernetes-int-or-string: true - endPort: - type: integer - protocols: - type: array - items: - type: object - oneOf: - - required: [icmp] - - required: [igmp] - properties: - icmp: - type: object - properties: - icmpType: - type: integer - minimum: 0 - maximum: 255 - icmpCode: - type: integer - minimum: 0 - maximum: 255 - igmp: - type: object - properties: - igmpType: - type: integer - # Only IGMP reports are igmpType in egress rules, - # 0x12 is IGMP report V1, 0x16 is IGMP report v2, 0x22 is IGMP report v3. - # It will match all IGMP report types if igmpType is not set. - enum: [ 0x12, 0x16, 0x22 ] - groupAddress: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - to: - type: array - items: - type: object - properties: - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - externalEntitySelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - ipBlock: - type: object - properties: - cidr: - type: string - format: cidr - fqdn: - type: string - nodeSelector: - type: object - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - group: - type: string - toServices: - type: array - items: - type: object - required: - - name - properties: - name: - type: string - namespace: - type: string - name: - type: string - enableLogging: - type: boolean - status: - type: object - properties: - phase: - type: string - observedGeneration: - type: integer - currentNodesRealized: - type: integer - desiredNodesRealized: - type: integer - conditions: - type: array - items: - type: object - properties: - type: - type: string - status: - type: string - lastTransitionTime: - type: string - reason: - type: string - message: - type: string - subresources: - status: {} - scope: Namespaced - names: - plural: networkpolicies - singular: networkpolicy - kind: NetworkPolicy - shortNames: - - anp - ---- -# Source: crds/supportbundlecollection.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: supportbundlecollections.crd.antrea.io -spec: - group: crd.antrea.io - versions: - - name: v1alpha1 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - required: - - fileServer - - authentication - anyOf: - - required: - - nodes - - required: - - externalNodes - properties: - nodes: - type: object - properties: - nodeNames: - type: array - items: - type: string - nodeSelector: - type: object - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - externalNodes: - type: object - required: - - namespace - properties: - namespace: - type: string - nodeNames: - type: array - items: - type: string - nodeSelector: - type: object - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - expirationMinutes: - type: integer - default: 60 - sinceTime: - type: string - format: duration - fileServer: - type: object - properties: - url: - type: string - authentication: - type: object - properties: - authType: - type: string - enum: ["BearerToken", "APIKey"] - authSecret: - type: object - properties: - name: - type: string - namespace: - type: string - status: - type: object - properties: - collectedNodes: - type: integer - desiredNodes: - type: integer - conditions: - type: array - items: - type: object - properties: - type: - type: string - status: - type: string - lastTransitionTime: - type: string - reason: - type: string - message: - type: string - subresources: - status: {} - scope: Cluster - names: - plural: supportbundlecollections - singular: supportbundlecollection - kind: SupportBundleCollection - shortNames: - - sbc - ---- -# Source: crds/tier.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: tiers.crd.antrea.io - labels: - app: antrea -spec: - group: crd.antrea.io - versions: - - name: v1alpha1 - served: true - storage: true - additionalPrinterColumns: - - name: Priority - type: integer - description: The Priority of this Tier relative to other Tiers. - jsonPath: .spec.priority - - name: Age - type: date - jsonPath: .metadata.creationTimestamp - schema: - openAPIV3Schema: - type: object - properties: - spec: - required: - - priority - type: object - properties: - priority: - type: integer - minimum: 0 - maximum: 255 - description: - type: string - scope: Cluster - names: - plural: tiers - singular: tier - kind: Tier - shortNames: - - tr - ---- -# Source: crds/traceflow.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: traceflows.crd.antrea.io - labels: - app: antrea -spec: - group: crd.antrea.io - versions: - - name: v1alpha1 - served: true - storage: true - additionalPrinterColumns: - - jsonPath: .status.phase - description: The phase of the Traceflow. - name: Phase - type: string - - jsonPath: .spec.source.pod - description: The name of the source Pod. - name: Source-Pod - type: string - priority: 10 - - jsonPath: .spec.destination.pod - description: The name of the destination Pod. - name: Destination-Pod - type: string - priority: 10 - - jsonPath: .spec.destination.ip - description: The IP address of the destination. - name: Destination-IP - type: string - priority: 10 - - jsonPath: .spec.liveTraffic - description: Trace live traffic. - name: Live-Traffic - type: boolean - priority: 10 - - jsonPath: .spec.droppedOnly - description: Capture only the dropped packet. - name: Dropped-Only - type: boolean - priority: 10 - - jsonPath: .spec.timeout - description: Timeout in seconds. - name: Timeout - type: integer - priority: 10 - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - schema: - openAPIV3Schema: - type: object - required: - - spec - properties: - spec: - type: object - properties: - source: - type: object - properties: - pod: - type: string - namespace: - type: string - ip: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - destination: - type: object - properties: - pod: - type: string - service: - type: string - namespace: - type: string - ip: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - packet: - type: object - properties: - ipHeader: - type: object - properties: - srcIP: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - protocol: - type: integer - ttl: - type: integer - flags: - type: integer - ipv6Header: - type: object - properties: - srcIP: - type: string - format: ipv6 - nextHeader: - type: integer - hopLimit: - type: integer - transportHeader: - type: object - properties: - icmp: - type: object - properties: - id: - type: integer - sequence: - type: integer - udp: - type: object - properties: - srcPort: - type: integer - dstPort: - type: integer - tcp: - type: object - properties: - srcPort: - type: integer - dstPort: - type: integer - flags: - type: integer - liveTraffic: - type: boolean - droppedOnly: - type: boolean - timeout: - type: integer - status: - type: object - properties: - reason: - type: string - dataplaneTag: - type: integer - phase: - type: string - startTime: - type: string - results: - type: array - items: - type: object - properties: - node: - type: string - role: - type: string - timestamp: - type: integer - observations: - type: array - items: - type: object - properties: - component: - type: string - componentInfo: - type: string - action: - type: string - pod: - type: string - dstMAC: - type: string - networkPolicy: - type: string - ttl: - type: integer - translatedSrcIP: - type: string - translatedDstIP: - type: string - tunnelDstIP: - type: string - capturedPacket: - properties: - srcIP: - type: string - dstIP: - type: string - length: - type: integer - ipHeader: - properties: - flags: - type: integer - protocol: - type: integer - ttl: - type: integer - type: object - ipv6Header: - properties: - hopLimit: - type: integer - nextHeader: - type: integer - type: object - transportHeader: - properties: - tcp: - properties: - dstPort: - type: integer - srcPort: - type: integer - flags: - type: integer - type: object - udp: - properties: - dstPort: - type: integer - srcPort: - type: integer - type: object - icmp: - properties: - id: - type: integer - sequence: - type: integer - type: object - type: object - type: object - subresources: - status: {} - scope: Cluster - names: - plural: traceflows - singular: traceflow - kind: Traceflow - shortNames: - - tf - ---- -# Source: crds/trafficcontrol.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: trafficcontrols.crd.antrea.io -spec: - group: crd.antrea.io - versions: - - name: v1alpha2 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - required: - - spec - properties: - spec: - type: object - required: - - appliedTo - - direction - - action - - targetPort - properties: - appliedTo: - type: object - properties: - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - direction: - type: string - enum: - - Ingress - - Egress - - Both - action: - type: string - enum: - - Mirror - - Redirect - targetPort: - type: object - oneOf: - - required: [ovsInternal] - - required: [device] - - required: [geneve] - - required: [vxlan] - - required: [gre] - - required: [erspan] - properties: - ovsInternal: - type: object - required: - - name - properties: - name: - type: string - device: - type: object - required: - - name - properties: - name: - type: string - geneve: - type: object - required: - - remoteIP - properties: - remoteIP: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - vni: - type: integer - minimum: 0 - maximum: 16777215 - destinationPort: - type: integer - minimum: 1 - maximum: 65535 - vxlan: - type: object - required: - - remoteIP - properties: - remoteIP: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - vni: - type: integer - minimum: 0 - maximum: 16777215 - destinationPort: - type: integer - minimum: 1 - maximum: 65535 - gre: - type: object - required: - - remoteIP - properties: - remoteIP: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - key: - type: integer - minimum: 0 - maximum: 4294967295 - erspan: - type: object - required: - - remoteIP - - version - properties: - remoteIP: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - sessionID: - type: integer - minimum: 0 - maximum: 1023 - version: - type: integer - enum: - - 1 - - 2 - index: - type: integer - dir: - type: integer - enum: - - 0 - - 1 - hardwareID: - type: integer - returnPort: - type: object - oneOf: - - required: [ovsInternal] - - required: [device] - - required: [geneve] - - required: [vxlan] - - required: [gre] - properties: - ovsInternal: - type: object - required: - - name - properties: - name: - type: string - device: - type: object - required: - - name - properties: - name: - type: string - geneve: - type: object - required: - - remoteIP - properties: - remoteIP: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - vni: - type: integer - minimum: 0 - maximum: 16777215 - destinationPort: - type: integer - minimum: 1 - maximum: 65535 - vxlan: - type: object - required: - - remoteIP - properties: - remoteIP: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - vni: - type: integer - minimum: 0 - maximum: 16777215 - destinationPort: - type: integer - minimum: 1 - maximum: 65535 - gre: - type: object - required: - - remoteIP - properties: - remoteIP: - type: string - oneOf: - - format: ipv4 - - format: ipv6 - key: - type: integer - minimum: 0 - maximum: 4294967295 - additionalPrinterColumns: - - description: Specifies the direction of traffic that should be matched. - jsonPath: .spec.direction - name: Direction - type: string - - description: Specifies the action that should be taken for the traffic. - jsonPath: .spec.action - name: Action - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - subresources: - status: {} - scope: Cluster - names: - plural: trafficcontrols - singular: trafficcontrol - kind: TrafficControl - shortNames: - - tc - ---- -# Source: antrea/templates/agent/serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: antrea-agent - namespace: kube-system - labels: - app: antrea ---- -# Source: antrea/templates/antctl/serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: antctl - namespace: kube-system - labels: - app: antrea ---- -# Source: antrea/templates/controller/serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: antrea-controller - namespace: kube-system - labels: - app: antrea ---- -# Source: antrea/templates/agent/secret.yaml -apiVersion: v1 -kind: Secret -metadata: - name: antrea-agent-service-account-token - namespace: kube-system - annotations: - kubernetes.io/service-account.name: antrea-agent -type: kubernetes.io/service-account-token ---- -# Source: antrea/templates/antctl/secret.yaml -apiVersion: v1 -kind: Secret -metadata: - name: antctl-service-account-token - namespace: kube-system - annotations: - kubernetes.io/service-account.name: antctl -type: kubernetes.io/service-account-token ---- -# Source: antrea/templates/agent/tweakerconfigmap.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: antrea-agent-tweaker - namespace: kube-system - labels: - app: antrea -data: - antrea-agent-tweaker.conf: |- - # Enable disableUdpTunnelOffload will disable udp tunnel offloading feature on kubernetes node's default interface. - # By default, no actions will be taken. - disableUdpTunnelOffload: false ---- -# Source: antrea/templates/configmap.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: antrea-config - namespace: kube-system - labels: - app: antrea -data: - antrea-agent.conf: | - # FeatureGates is a map of feature names to bools that enable or disable experimental features. - featureGates: - # AllAlpha is a global toggle for alpha features. Per-feature key values override the default set by AllAlpha. - # AllAlpha: false - - # AllBeta is a global toggle for beta features. Per-feature key values override the default set by AllBeta. - # AllBeta: false - - # Enable AntreaProxy which provides ServiceLB for in-cluster Services in antrea-agent. - # It should be enabled on Windows, otherwise NetworkPolicy will not take effect on - # Service traffic. - # AntreaProxy: true - - # Enable EndpointSlice support in AntreaProxy. Don't enable this feature unless that EndpointSlice - # API version v1 is supported and set as enabled in Kubernetes. If AntreaProxy is not enabled, - # this flag will not take effect. - # EndpointSlice: false - - # Enable TopologyAwareHints in AntreaProxy. This requires AntreaProxy and EndpointSlice to be - # enabled, otherwise this flag will not take effect. - # TopologyAwareHints: false - - # Enable traceflow which provides packet tracing feature to diagnose network issue. - # Traceflow: true - - # Enable NodePortLocal feature to make the Pods reachable externally through NodePort - # NodePortLocal: true - - # Enable Antrea ClusterNetworkPolicy feature to complement K8s NetworkPolicy for cluster admins - # to define security policies which apply to the entire cluster, and Antrea NetworkPolicy - # feature that supports priorities, rule actions and externalEntities in the future. - # AntreaPolicy: true - - # Enable flowexporter which exports polled conntrack connections as IPFIX flow records from each - # agent to a configured collector. - # FlowExporter: false - - # Enable collecting and exposing NetworkPolicy statistics. - # NetworkPolicyStats: true - - # Enable controlling SNAT IPs of Pod egress traffic. - # Egress: true - - # Enable AntreaIPAM, which can allocate IP addresses from IPPools. AntreaIPAM is required by the - # bridging mode and allocates IPs to Pods in bridging mode. It is also required to use Antrea for - # IPAM when configuring secondary network interfaces with Multus. - # AntreaIPAM: false - - # Enable multicast traffic. - # Multicast: false - - # Enable Antrea Multi-cluster Gateway to support cross-cluster traffic. - # This feature is supported only with encap mode. - # Multicluster: false - - # Enable support for provisioning secondary network interfaces for Pods (using - # Pod annotations). At the moment, Antrea can only create secondary network - # interfaces using SR-IOV VFs on baremetal Nodes. - # SecondaryNetwork: false - - # Enable managing external IPs of Services of LoadBalancer type. - # ServiceExternalIP: false - - # Enable mirroring or redirecting the traffic Pods send or receive. - # TrafficControl: false - - # Enable certificated-based authentication for IPsec. - # IPsecCertAuth: false - - # Name of the OpenVSwitch bridge antrea-agent will create and use. - # Make sure it doesn't conflict with your existing OpenVSwitch bridges. - ovsBridge: "br-int" - - # Datapath type to use for the OpenVSwitch bridge created by Antrea. At the moment, the only - # supported value is 'system', which corresponds to the kernel datapath. - #ovsDatapathType: system - - # Name of the interface antrea-agent will create and use for host <--> pod communication. - # Make sure it doesn't conflict with your existing interfaces. - hostGateway: "antrea-gw0" - - # Determines how traffic is encapsulated. It has the following options: - # encap(default): Inter-node Pod traffic is always encapsulated and Pod to external network - # traffic is SNAT'd. - # noEncap: Inter-node Pod traffic is not encapsulated; Pod to external network traffic is - # SNAT'd if noSNAT is not set to true. Underlying network must be capable of - # supporting Pod traffic across IP subnets. - # hybrid: noEncap if source and destination Nodes are on the same subnet, otherwise encap. - # networkPolicyOnly: Antrea enforces NetworkPolicy only, and utilizes CNI chaining and delegates Pod - # IPAM and connectivity to the primary CNI. - # - trafficEncapMode: "encap" - - # Whether or not to SNAT (using the Node IP) the egress traffic from a Pod to the external network. - # This option is for the noEncap traffic mode only, and the default value is false. In the noEncap - # mode, if the cluster's Pod CIDR is reachable from the external network, then the Pod traffic to - # the external network needs not be SNAT'd. In the networkPolicyOnly mode, antrea-agent never - # performs SNAT and this option will be ignored; for other modes it must be set to false. - noSNAT: false - - # Tunnel protocols used for encapsulating traffic across Nodes. If WireGuard is enabled in trafficEncryptionMode, - # this option will not take effect. Supported values: - # - geneve (default) - # - vxlan - # - gre - # - stt - # Note that "gre" is not supported for IPv6 clusters (IPv6-only or dual-stack clusters). - tunnelType: "geneve" - - # TunnelPort is the destination port for UDP and TCP based tunnel protocols (Geneve, VXLAN, and STT). - # If zero, it will use the assigned IANA port for the protocol, i.e. 6081 for Geneve, 4789 for VXLAN, - # and 7471 for STT. - tunnelPort: 0 - - # TunnelCsum determines whether to compute UDP encapsulation header (Geneve or VXLAN) checksums on outgoing - # packets. For Linux kernel before Mar 2021, UDP checksum must be present to trigger GRO on the receiver for better - # performance of Geneve and VXLAN tunnels. The issue has been fixed by - # https://github.com/torvalds/linux/commit/89e5c58fc1e2857ccdaae506fb8bc5fed57ee063, thus computing UDP checksum is - # no longer necessary. - # It should only be set to true when you are using an unpatched Linux kernel and observing poor transfer performance. - tunnelCsum: false - - # Determines how tunnel traffic is encrypted. Currently encryption only works with encap mode. - # It has the following options: - # - none (default): Inter-node Pod traffic will not be encrypted. - # - ipsec: Enable IPsec (ESP) encryption for Pod traffic across Nodes. Antrea uses - # Preshared Key (PSK) for IKE authentication. When IPsec tunnel is enabled, - # the PSK value must be passed to Antrea Agent through an environment - # variable: ANTREA_IPSEC_PSK. - # - wireGuard: Enable WireGuard for tunnel traffic encryption. - trafficEncryptionMode: "none" - - # Enable bridging mode of Pod network on Nodes, in which the Node's transport interface is connected - # to the OVS bridge, and cross-Node/VLAN traffic of AntreaIPAM Pods (Pods whose IP addresses are - # allocated by AntreaIPAM from IPPools) is sent to the underlay network, and forwarded/routed by the - # underlay network. - # This option requires the `AntreaIPAM` feature gate to be enabled. At this moment, it supports only - # IPv4 and Linux Nodes, and can be enabled only when `ovsDatapathType` is `system`, - # `trafficEncapMode` is `noEncap`, and `noSNAT` is true. - enableBridgingMode: false - - # Disable TX checksum offloading for container network interfaces. It's supposed to be set to true when the - # datapath doesn't support TX checksum offloading, which causes packets to be dropped due to bad checksum. - # It affects Pods running on Linux Nodes only. - disableTXChecksumOffload: false - - # Default MTU to use for the host gateway interface and the network interface of each Pod. - # If omitted, antrea-agent will discover the MTU of the Node's primary interface and - # also adjust MTU to accommodate for tunnel encapsulation overhead (if applicable). - defaultMTU: 0 - - # wireGuard specifies WireGuard related configurations. - wireGuard: - # The port for WireGuard to receive traffic. - port: 51820 - - egress: - # exceptCIDRs is the CIDR ranges to which outbound Pod traffic will not be SNAT'd by Egresses. - exceptCIDRs: - - # ClusterIP CIDR range for Services. It's required when AntreaProxy is not enabled, and should be - # set to the same value as the one specified by --service-cluster-ip-range for kube-apiserver. When - # AntreaProxy is enabled, this parameter is not needed and will be ignored if provided. - serviceCIDR: "" - - # ClusterIP CIDR range for IPv6 Services. It's required when using kube-proxy to provide IPv6 Service in a Dual-Stack - # cluster or an IPv6 only cluster. The value should be the same as the configuration for kube-apiserver specified by - # --service-cluster-ip-range. When AntreaProxy is enabled, this parameter is not needed. - # No default value for this field. - serviceCIDRv6: "" - - # The port for the antrea-agent APIServer to serve on. - # Note that if it's set to another value, the `containerPort` of the `api` port of the - # `antrea-agent` container must be set to the same value. - apiPort: 10350 - - # Enable metrics exposure via Prometheus. Initializes Prometheus metrics listener. - enablePrometheusMetrics: true - - # Provide the IPFIX collector address as a string with format :[][:]. - # HOST can either be the DNS name or the IP of the Flow Collector. For example, - # "flow-aggregator.flow-aggregator.svc" can be provided as DNS name to connect - # to the Antrea Flow Aggregator service. If IP, it can be either IPv4 or IPv6. - # However, IPv6 address should be wrapped with []. - # If PORT is empty, we default to 4739, the standard IPFIX port. - # If no PROTO is given, we consider "tls" as default. We support "tls", "tcp" and - # "udp" protocols. "tls" is used for securing communication between flow exporter and - # flow aggregator. - flowCollectorAddr: "flow-aggregator.flow-aggregator.svc:4739:tls" - - # Provide flow poll interval as a duration string. This determines how often the - # flow exporter dumps connections from the conntrack module. Flow poll interval - # should be greater than or equal to 1s (one second). - # Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". - flowPollInterval: "5s" - - # Provide the active flow export timeout, which is the timeout after which a flow - # record is sent to the collector for active flows. Thus, for flows with a continuous - # stream of packets, a flow record will be exported to the collector once the elapsed - # time since the last export event is equal to the value of this timeout. - # Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". - activeFlowExportTimeout: "5s" - - # Provide the idle flow export timeout, which is the timeout after which a flow - # record is sent to the collector for idle flows. A flow is considered idle if no - # packet matching this flow has been observed since the last export event. - # Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". - idleFlowExportTimeout: "15s" - - nodePortLocal: - # Enable NodePortLocal, a feature used to make Pods reachable using port forwarding on the host. To - # enable this feature, you need to set "enable" to true, and ensure that the NodePortLocal feature - # gate is also enabled (which is the default). - enable: true - # Provide the port range used by NodePortLocal. When the NodePortLocal feature is enabled, a port - # from that range will be assigned whenever a Pod's container defines a specific port to be exposed - # (each container can define a list of ports as pod.spec.containers[].ports), and all Node traffic - # directed to that port will be forwarded to the Pod. - portRange: "61000-62000" - - # Provide the address of Kubernetes apiserver, to override any value provided in kubeconfig or InClusterConfig. - # Defaults to "". It must be a host string, a host:port pair, or a URL to the base of the apiserver. - kubeAPIServerOverride: "" - - # Provide the address of DNS server, to override the kube-dns service. It's used to resolve hostname in FQDN policy. - # Defaults to "". It must be a host string or a host:port pair of the DNS server (e.g. 10.96.0.10, 10.96.0.10:53, - # [fd00:10:96::a]:53). - dnsServerOverride: "" - - # Comma-separated list of Cipher Suites. If omitted, the default Go Cipher Suites will be used. - # https://golang.org/pkg/crypto/tls/#pkg-constants - # Note that TLS1.3 Cipher Suites cannot be added to the list. But the apiserver will always - # prefer TLS1.3 Cipher Suites whenever possible. - tlsCipherSuites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384" - - # TLS min version from: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13. - tlsMinVersion: "" - - # The name of the interface on Node which is used for tunneling or routing the traffic across Nodes. - # If there are multiple IP addresses configured on the interface, the first one is used. The IP - # address used for tunneling or routing traffic to remote Nodes is decided in the following order of - # preference (from highest to lowest): - # 1. transportInterface - # 2. transportInterfaceCIDRs - # 3. The Node IP - transportInterface: "" - - multicast: - # The names of the interfaces on Nodes that are used to forward multicast traffic. - # Defaults to transport interface if not set. - multicastInterfaces: - - # The interval at which the antrea-agent sends IGMP queries to Pods. - # Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". - igmpQueryInterval: "125s" - - # The network CIDRs of the interface on Node which is used for tunneling or routing the traffic across - # Nodes. If there are multiple interfaces configured the same network CIDR, the first one is used. The - # IP address used for tunneling or routing traffic to remote Nodes is decided in the following order of - # preference (from highest to lowest): - # 1. transportInterface - # 2. transportInterfaceCIDRs - # 3. The Node IP - transportInterfaceCIDRs: - - # Option antreaProxy contains AntreaProxy related configuration options. - antreaProxy: - # ProxyAll tells antrea-agent to proxy all Service traffic, including NodePort, LoadBalancer, and ClusterIP traffic, - # regardless of where they come from. Therefore, running kube-proxy is no longer required. This requires the AntreaProxy - # feature to be enabled. - # Note that this option is experimental. If kube-proxy is removed, option kubeAPIServerOverride must be used to access - # apiserver directly. - proxyAll: false - # A string array of values which specifies the host IPv4/IPv6 addresses for NodePort. Values can be valid IP blocks. - # (e.g. 1.2.3.0/24, 1.2.3.4/32). An empty string slice is meant to select all host IPv4/IPv6 addresses. - # Note that the option is only valid when proxyAll is true. - nodePortAddresses: - # An array of string values to specify a list of Services which should be ignored by AntreaProxy (traffic to these - # Services will not be load-balanced). Values can be a valid ClusterIP (e.g. 10.11.1.2) or a Service name - # with Namespace (e.g. kube-system/kube-dns) - skipServices: - # When ProxyLoadBalancerIPs is set to false, AntreaProxy no longer load-balances traffic destined to the - # External IPs of LoadBalancer Services. This is useful when the external LoadBalancer provides additional - # capabilities (e.g. TLS termination) and it is desirable for Pod-to-ExternalIP traffic to be sent to the - # external LoadBalancer instead of being load-balanced to an Endpoint directly by AntreaProxy. - # Note that setting ProxyLoadBalancerIPs to false usually only makes sense when ProxyAll is set to true and - # kube-proxy is removed from the cluser, otherwise kube-proxy will still load-balance this traffic. - proxyLoadBalancerIPs: true - - # IPsec tunnel related configurations. - ipsec: - # The authentication mode of IPsec tunnel. It has the following options: - # - psk (default): Use pre-shared key (PSK) for IKE authentication. - # - cert: Use CA-signed certificates for IKE authentication. This option requires the `IPsecCertAuth` - # feature gate to be enabled. - authenticationMode: "psk" - - multicluster: - # Enable Antrea Multi-cluster Gateway to support cross-cluster traffic. - # This feature is supported only with encap mode. - enable: false - # The Namespace where Antrea Multi-cluster Controller is running. - # The default is antrea-agent's Namespace. - namespace: "" - antrea-cni.conflist: | - { - "cniVersion":"0.3.0", - "name": "antrea", - "plugins": [ - { - "type": "antrea", - "ipam": { - "type": "host-local" - } - } - , - { - "type": "portmap", - "capabilities": {"portMappings": true} - } - , - { - "type": "bandwidth", - "capabilities": {"bandwidth": true} - } - ] - } - antrea-controller.conf: | - # FeatureGates is a map of feature names to bools that enable or disable experimental features. - featureGates: - # AllAlpha is a global toggle for alpha features. Per-feature key values override the default set by AllAlpha. - # AllAlpha: false - - # AllBeta is a global toggle for beta features. Per-feature key values override the default set by AllBeta. - # AllBeta: false - - # Enable traceflow which provides packet tracing feature to diagnose network issue. - # Traceflow: true - - # Enable Antrea ClusterNetworkPolicy feature to complement K8s NetworkPolicy for cluster admins - # to define security policies which apply to the entire cluster, and Antrea NetworkPolicy - # feature that supports priorities, rule actions and externalEntities in the future. - # AntreaPolicy: true - - # Enable collecting and exposing NetworkPolicy statistics. - # NetworkPolicyStats: true - - # Enable multicast traffic. - # Multicast: false - - # Enable controlling SNAT IPs of Pod egress traffic. - # Egress: true - - # Run Kubernetes NodeIPAMController with Antrea. - # NodeIPAM: false - - # Enable AntreaIPAM, which can allocate IP addresses from IPPools. AntreaIPAM is required by the - # bridging mode and allocates IPs to Pods in bridging mode. It is also required to use Antrea for - # IPAM when configuring secondary network interfaces with Multus. - # AntreaIPAM: false - - # Enable managing external IPs of Services of LoadBalancer type. - # ServiceExternalIP: false - - # Enable certificated-based authentication for IPsec. - # IPsecCertAuth: false - - # Enable managing ExternalNode for unmanaged VM/BM. - # ExternalNode: false - - # The port for the antrea-controller APIServer to serve on. - # Note that if it's set to another value, the `containerPort` of the `api` port of the - # `antrea-controller` container must be set to the same value. - apiPort: 10349 - - # Enable metrics exposure via Prometheus. Initializes Prometheus metrics listener. - enablePrometheusMetrics: true - - # Indicates whether to use auto-generated self-signed TLS certificate. - # If false, a Secret named "antrea-controller-tls" must be provided with the following keys: - # ca.crt: - # tls.crt: - # tls.key: - selfSignedCert: true - - # Comma-separated list of Cipher Suites. If omitted, the default Go Cipher Suites will be used. - # https://golang.org/pkg/crypto/tls/#pkg-constants - # Note that TLS1.3 Cipher Suites cannot be added to the list. But the apiserver will always - # prefer TLS1.3 Cipher Suites whenever possible. - tlsCipherSuites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384" - - # TLS min version from: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13. - tlsMinVersion: "" - - nodeIPAM: - # Enable the integrated Node IPAM controller within the Antrea controller. - enableNodeIPAM: false - # CIDR ranges for Pods in cluster. String array containing single CIDR range, or multiple ranges. - # The CIDRs could be either IPv4 or IPv6. At most one CIDR may be specified for each IP family. - # Value ignored when enableNodeIPAM is false. - clusterCIDRs: - # CIDR ranges for Services in cluster. It is not necessary to specify it when there is no overlap with clusterCIDRs. - # Value ignored when enableNodeIPAM is false. - serviceCIDR: "" - serviceCIDRv6: "" - # Mask size for IPv4 Node CIDR in IPv4 or dual-stack cluster. Value ignored when enableNodeIPAM is false - # or when IPv4 Pod CIDR is not configured. Valid range is 16 to 30. - nodeCIDRMaskSizeIPv4: 24 - # Mask size for IPv6 Node CIDR in IPv6 or dual-stack cluster. Value ignored when enableNodeIPAM is false - # or when IPv6 Pod CIDR is not configured. Valid range is 64 to 126. - nodeCIDRMaskSizeIPv6: 64 - - ipsecCSRSigner: - # Determines the auto-approve policy of Antrea CSR signer for IPsec certificates management. - # If enabled, Antrea will auto-approve the CertificateSingingRequest (CSR) if its subject and x509 extensions - # are permitted, and the requestor can be validated. If K8s `BoundServiceAccountTokenVolume` feature is enabled, - # the Pod identity will also be validated to provide maximum security. - # If set to false, Antrea will not auto-approve CertificateSingingRequests and they need to be approved - # manually by `kubectl certificate approve`. - autoApprove: true - # Indicates whether to use auto-generated self-signed CA certificate. - # If false, a Secret named "antrea-ipsec-ca" must be provided with the following keys: - # tls.crt: - # tls.key: - selfSignedCA: true - - # Indicates whether to enable usage reporting or not. - enableUsageReporting: false - - # Indicates whether to enable Antrea advanced features or not. - enterpriseAntrea: true ---- -# Source: antrea/templates/crds/clustergroup.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: clustergroups.crd.antrea.io - labels: - app: antrea -spec: - group: crd.antrea.io - versions: - - name: v1alpha2 - served: true - storage: false - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - properties: - childGroups: - type: array - items: - type: string - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - externalEntitySelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - ipBlock: - type: object - properties: - cidr: - type: string - format: cidr - ipBlocks: - type: array - items: - type: object - properties: - cidr: - type: string - format: cidr - serviceReference: - type: object - properties: - name: - type: string - namespace: - type: string - status: - type: object - properties: - conditions: - type: array - items: - type: object - properties: - type: - type: string - status: - type: string - lastTransitionTime: - type: string - - name: v1alpha3 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - properties: - childGroups: - type: array - items: - type: string - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - externalEntitySelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - pattern: "^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$" - matchLabels: - x-kubernetes-preserve-unknown-fields: true - ipBlocks: - type: array - items: - type: object - properties: - cidr: - type: string - format: cidr - serviceReference: - type: object - properties: - name: - type: string - namespace: - type: string - status: - type: object - properties: - conditions: - type: array - items: - type: object - properties: - type: - type: string - status: - type: string - lastTransitionTime: - type: string - subresources: - status: {} - conversion: - strategy: Webhook - webhook: - conversionReviewVersions: ["v1", "v1beta1"] - clientConfig: - service: - name: "antrea" - namespace: "kube-system" - path: "/convert/clustergroup" - scope: Cluster - names: - plural: clustergroups - singular: clustergroup - kind: ClusterGroup - shortNames: - - cg ---- -# Source: antrea/templates/crds/group.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: groups.crd.antrea.io -spec: - group: crd.antrea.io - versions: - - name: v1alpha3 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - type: object - properties: - childGroups: - type: array - items: - type: string - podSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - matchLabels: - x-kubernetes-preserve-unknown-fields: true - namespaceSelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - matchLabels: - x-kubernetes-preserve-unknown-fields: true - externalEntitySelector: - type: object - properties: - matchExpressions: - type: array - items: - type: object - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - type: array - items: - type: string - matchLabels: - x-kubernetes-preserve-unknown-fields: true - ipBlocks: - type: array - items: - type: object - properties: - cidr: - type: string - format: cidr - serviceReference: - type: object - properties: - name: - type: string - namespace: - type: string - status: - type: object - properties: - conditions: - type: array - items: - type: object - properties: - type: - type: string - status: - type: string - lastTransitionTime: - type: string - subresources: - status: {} - scope: Namespaced - names: - plural: groups - singular: group - kind: Group - shortNames: - - grp ---- -# Source: antrea/templates/crds/tierentitlement.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: tierentitlements.crd.antrea.tanzu.vmware.com - labels: - app: antrea -spec: - group: crd.antrea.tanzu.vmware.com - versions: - - name: v1alpha1 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - required: - - permission - - tiers - type: object - properties: - permission: - type: string - enum: ['edit'] - tiers: - type: array - items: - type: string - scope: Cluster - names: - plural: tierentitlements - singular: tierentitlement - kind: TierEntitlement - shortNames: - - te ---- -# Source: antrea/templates/crds/tierentitlementbinding.yml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: tierentitlementbindings.crd.antrea.tanzu.vmware.com - labels: - app: antrea -spec: - group: crd.antrea.tanzu.vmware.com - versions: - - name: v1alpha1 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - properties: - spec: - required: - - tierEntitlement - - subjects - type: object - properties: - tierEntitlement: - type: string - subjects: - type: array - items: - type: object - properties: - kind: - type: string - enum: ['User', 'Group', 'ServiceAccount'] - apiGroup: - type: string - enum: ['rbac.authorization.k8s.io'] - name: - type: string - namespace: - type: string - scope: Cluster - names: - plural: tierentitlementbindings - singular: tierentitlementbinding - kind: TierEntitlementBinding - shortNames: - - teb ---- -# Source: antrea/templates/agent/clusterrole.yaml -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: antrea-agent - labels: - app: antrea -rules: - - apiGroups: - - "" - resources: - - nodes - verbs: - - get - - watch - - list - - apiGroups: - - "" - resources: - - nodes/status - verbs: - - patch - - apiGroups: - - "" - resources: - - pods - verbs: - - get - - watch - - list - - apiGroups: - - "" - resources: - - pods/status - verbs: - - patch - - apiGroups: - - "" - resources: - - endpoints - - services - - namespaces - verbs: - - get - - watch - - list - - apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: - - get - - watch - - list - - apiGroups: - - crd.antrea.io - resources: - - antreaagentinfos - verbs: - - get - - update - - apiGroups: - - controlplane.antrea.io - resources: - - networkpolicies - - appliedtogroups - - addressgroups - verbs: - - get - - watch - - list - - apiGroups: - - controlplane.antrea.io - resources: - - egressgroups - verbs: - - get - - watch - - list - - apiGroups: - - controlplane.antrea.io - resources: - - nodestatssummaries - verbs: - - create - - apiGroups: - - controlplane.antrea.io - resources: - - networkpolicies/status - verbs: - - create - - get - - apiGroups: - - authentication.k8s.io - resources: - - tokenreviews - verbs: - - create - - apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create - # This is the content of built-in role kube-system/extension-apiserver-authentication-reader. - # But it doesn't have list/watch permission before K8s v1.17.0 so the extension apiserver (antrea-agent) will - # have permission issue after bumping up apiserver library to a version that supports dynamic authentication. - # See https://github.com/kubernetes/kubernetes/pull/85375 - # To support K8s clusters older than v1.17.0, we grant the required permissions directly instead of relying on - # the extension-apiserver-authentication role. - - apiGroups: - - "" - resourceNames: - - extension-apiserver-authentication - resources: - - configmaps - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - configmaps - resourceNames: - - antrea-ca - verbs: - - get - - watch - - list - - apiGroups: - - crd.antrea.io - resources: - - traceflows - - traceflows/status - verbs: - - get - - watch - - list - - update - - patch - - create - - delete - - apiGroups: - - crd.antrea.io - resources: - - egresses - verbs: - - get - - watch - - list - - apiGroups: - - crd.antrea.io - resources: - - egresses/status - verbs: - - update - - apiGroups: - - crd.antrea.io - resources: - - externalippools - - ippools - - trafficcontrols - verbs: - - get - - watch - - list - - apiGroups: - - crd.antrea.io - resources: - - ippools/status - verbs: - - update - - apiGroups: - - k8s.cni.cncf.io - resources: - - network-attachment-definitions - verbs: - - get - - list - - watch - - apiGroups: - - certificates.k8s.io - resources: - - certificatesigningrequests - verbs: - - get - - watch - - list - - create - - apiGroups: - - multicluster.crd.antrea.io - resources: - - gateways - verbs: - - get - - list - - watch - - apiGroups: - - multicluster.crd.antrea.io - resources: - - clusterinfoimports - verbs: - - get - - list - - watch ---- -# Source: antrea/templates/antctl/clusterrole.yaml -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: antctl - labels: - app: antrea -rules: - - apiGroups: - - controlplane.antrea.io - resources: - - networkpolicies - - appliedtogroups - - addressgroups - verbs: - - get - - list - - apiGroups: - - stats.antrea.io - resources: - - networkpolicystats - - antreaclusternetworkpolicystats - - antreanetworkpolicystats - verbs: - - get - - list - - apiGroups: - - system.antrea.io - resources: - - controllerinfos - - agentinfos - verbs: - - get - - apiGroups: - - system.antrea.io - resources: - - supportbundles - verbs: - - get - - post - - apiGroups: - - system.antrea.io - resources: - - supportbundles/download - verbs: - - get - - nonResourceURLs: - - /agentinfo - - /addressgroups - - /appliedtogroups - - /loglevel - - /networkpolicies - - /ovsflows - - /ovstracing - - /podinterfaces - - /featuregates - - /serviceexternalip - verbs: - - get ---- -# Source: antrea/templates/cluster-identity-reader/clusterrolebinding.yaml -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: antrea-cluster-identity-reader - labels: - app: antrea -rules: - - apiGroups: - - "" - resources: - - configmaps - resourceNames: - - antrea-cluster-identity - verbs: - - get ---- -# Source: antrea/templates/controller/clusterrole.yaml -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: antrea-controller - labels: - app: antrea -rules: - - apiGroups: - - "" - resources: - - pods - - services - - namespaces - - configmaps - verbs: - - get - - watch - - list - - apiGroups: - - "" - resources: - - nodes - verbs: - - get - - watch - - list - - patch - - apiGroups: - - "" - resources: - - services/status - verbs: - - update - - apiGroups: - - networking.k8s.io - resources: - - networkpolicies - verbs: - - get - - watch - - list - - apiGroups: - - authentication.k8s.io - resources: - - tokenreviews - verbs: - - create - - apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create - - apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - get - - update - # This is the content of built-in role kube-system/extension-apiserver-authentication-reader. - # But it doesn't have list/watch permission before K8s v1.17.0 so the extension apiserver (antrea-controller) will - # have permission issue after bumping up apiserver library to a version that supports dynamic authentication. - # See https://github.com/kubernetes/kubernetes/pull/85375 - # To support K8s clusters older than v1.17.0, we grant the required permissions directly instead of relying on - # the extension-apiserver-authentication role. - - apiGroups: - - "" - resourceNames: - - extension-apiserver-authentication - resources: - - configmaps - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - configmaps - resourceNames: - - antrea-ca - - antrea-ipsec-ca - - antrea-cluster-identity - verbs: - - get - - update - - apiGroups: - - "" - resources: - - secrets - resourceNames: - - antrea-ipsec-ca - verbs: - - get - - update - - watch - - apiGroups: - - "" - resources: - - configmaps - - secrets - verbs: - - create - - apiGroups: - - "" - resources: - - configmaps - resourceNames: - - antrea-config - verbs: - - get - - apiGroups: - - apiregistration.k8s.io - resources: - - apiservices - resourceNames: - - v1alpha1.stats.antrea.io - - v1beta1.system.antrea.io - - v1beta2.controlplane.antrea.io - verbs: - - get - - update - - apiGroups: - - apiregistration.k8s.io - resources: - - apiservices - resourceNames: - - v1beta1.networking.antrea.tanzu.vmware.com - - v1beta1.controlplane.antrea.tanzu.vmware.com - - v1alpha1.stats.antrea.tanzu.vmware.com - - v1beta1.system.antrea.tanzu.vmware.com - - v1beta2.controlplane.antrea.tanzu.vmware.com - verbs: - - delete - - apiGroups: - - admissionregistration.k8s.io - resources: - - mutatingwebhookconfigurations - - validatingwebhookconfigurations - resourceNames: - # always give permissions for labelsmutator.antrea.io, even when the - # feature is disabled, to avoid errors in antrea-controller when updating - # the CA cert. - - labelsmutator.antrea.io - - crdmutator.antrea.io - - crdvalidator.antrea.io - verbs: - - get - - update - - apiGroups: - - certificates.k8s.io - resources: - - certificatesigningrequests - verbs: - - get - - list - - watch - - apiGroups: - - certificates.k8s.io - resources: - - certificatesigningrequests/approval - - certificatesigningrequests/status - verbs: - - update - - apiGroups: - - certificates.k8s.io - resources: - - signers - resourceNames: - - antrea.io/antrea-agent-ipsec-tunnel - verbs: - - approve - - sign - - apiGroups: - - crd.antrea.io - resources: - - antreacontrollerinfos - verbs: - - get - - create - - update - - delete - - apiGroups: - - crd.antrea.io - resources: - - antreaagentinfos - verbs: - - list - - create - - delete - - apiGroups: - - crd.antrea.io - resources: - - clusternetworkpolicies - - networkpolicies - verbs: - - get - - watch - - list - - update - - patch - - create - - delete - - apiGroups: - - crd.antrea.io - resources: - - clusternetworkpolicies/status - - networkpolicies/status - verbs: - - update - - apiGroups: - - crd.antrea.io - resources: - - tiers - verbs: - - get - - watch - - list - - update - - patch - - create - - delete - - apiGroups: - - crd.antrea.io - resources: - - traceflows - - traceflows/status - verbs: - - get - - watch - - list - - update - - patch - - create - - delete - - apiGroups: - - crd.antrea.io - resources: - - externalentities - - clustergroups - - groups - verbs: - - get - - watch - - list - - update - - patch - - create - - delete - - apiGroups: - - crd.antrea.io - resources: - - clustergroups/status - - groups/status - verbs: - - update - - apiGroups: - - crd.antrea.io - resources: - - egresses - verbs: - - get - - watch - - list - - update - - patch - - apiGroups: - - crd.antrea.io - resources: - - externalippools - - ippools - verbs: - - get - - watch - - list - - apiGroups: - - crd.antrea.io - resources: - - externalippools/status - - ippools/status - verbs: - - update - - patch - - apiGroups: - - crd.antrea.io - resources: - - externalnodes - verbs: - - get - - watch - - list - - apiGroups: - - apps - resources: - - statefulsets - verbs: - - get - - list - - watch - - apiGroups: - - crd.antrea.tanzu.vmware.com - resources: - - tierentitlements - - tierentitlementbindings - verbs: - - get - - watch - - list ---- -# Source: antrea/templates/crds-rbac/clusterroles.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: aggregate-antrea-policies-edit - labels: - app: antrea - # Add these permissions to the "admin" and "edit" default roles. - rbac.authorization.k8s.io/aggregate-to-admin: "true" - rbac.authorization.k8s.io/aggregate-to-edit: "true" -rules: -- apiGroups: ["crd.antrea.io"] - resources: ["clusternetworkpolicies", "networkpolicies"] - verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] ---- -# Source: antrea/templates/crds-rbac/clusterroles.yaml -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: aggregate-antrea-policies-view - labels: - app: antrea - # Add these permissions to the "view" default role. - rbac.authorization.k8s.io/aggregate-to-view: "true" -rules: -- apiGroups: ["crd.antrea.io"] - resources: ["clusternetworkpolicies", "networkpolicies"] - verbs: ["get", "list", "watch"] ---- -# Source: antrea/templates/crds-rbac/clusterroles.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: aggregate-traceflows-edit - labels: - app: antrea - # Add these permissions to the "admin" and "edit" default roles. - rbac.authorization.k8s.io/aggregate-to-admin: "true" - rbac.authorization.k8s.io/aggregate-to-edit: "true" -rules: -- apiGroups: ["crd.antrea.io"] - resources: ["traceflows"] - verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] ---- -# Source: antrea/templates/crds-rbac/clusterroles.yaml -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: aggregate-traceflows-view - labels: - app: antrea - # Add these permissions to the "view" default role. - rbac.authorization.k8s.io/aggregate-to-view: "true" -rules: -- apiGroups: ["crd.antrea.io"] - resources: ["traceflows"] - verbs: ["get", "list", "watch"] ---- -# Source: antrea/templates/crds-rbac/clusterroles.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: aggregate-antrea-clustergroups-edit - labels: - app: antrea - # Add these permissions to the "admin" and "edit" default roles. - rbac.authorization.k8s.io/aggregate-to-admin: "true" - rbac.authorization.k8s.io/aggregate-to-edit: "true" -rules: -- apiGroups: ["crd.antrea.io"] - resources: ["clustergroups"] - verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] ---- -# Source: antrea/templates/crds-rbac/clusterroles.yaml -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: aggregate-antrea-clustergroups-view - labels: - app: antrea - # Add these permissions to the "view" default role. - rbac.authorization.k8s.io/aggregate-to-view: "true" -rules: -- apiGroups: ["crd.antrea.io"] - resources: ["clustergroups"] - verbs: ["get", "list", "watch"] ---- -# Source: antrea/templates/agent/clusterrolebinding.yaml -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: antrea-agent - labels: - app: antrea -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: antrea-agent -subjects: - - kind: ServiceAccount - name: antrea-agent - namespace: kube-system ---- -# Source: antrea/templates/antctl/clusterrolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app: antrea - name: antctl -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: antctl -subjects: - - kind: ServiceAccount - name: antctl - namespace: kube-system ---- -# Source: antrea/templates/controller/clusterrolebinding.yaml -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: antrea-controller - labels: - app: antrea -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: antrea-controller -subjects: - - kind: ServiceAccount - name: antrea-controller - namespace: kube-system ---- -# Source: antrea/templates/controller/service.yaml -apiVersion: v1 -kind: Service -metadata: - name: antrea - namespace: kube-system - labels: - app: antrea -spec: - ports: - - port: 443 - protocol: TCP - targetPort: api - selector: - app: antrea - component: antrea-controller ---- -# Source: antrea/templates/agent/daemonset.yaml -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: antrea-agent - namespace: kube-system - labels: - app: antrea - component: antrea-agent -spec: - selector: - matchLabels: - app: antrea - component: antrea-agent - updateStrategy: - type: RollingUpdate - template: - metadata: - annotations: - # Starting with v1.21, Kubernetes supports default container annotation. - # Using "kubectl logs/exec/attach/cp" doesn't have to specify "-c antrea-agent" when troubleshooting. - kubectl.kubernetes.io/default-container: antrea-agent - # Automatically restart Pods with a RollingUpdate if the ConfigMap changes - # See https://helm.sh/docs/howto/charts_tips_and_tricks/#automatically-roll-deployments - checksum/config: ee2e9a832afaaf5f44ea0095d47e03dfcb1dbf8d9a879784244a078fd501b21d - checksum/tweaker-config: 2d2c4693a82ee4f18de916ab3a50276d064eb8058a673f7e6b7719b9e5c21190 - labels: - app: antrea - component: antrea-agent - spec: - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet - priorityClassName: system-node-critical - nodeSelector: - kubernetes.io/os: linux - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - operator: Exists - - effect: NoExecute - operator: Exists - serviceAccountName: antrea-agent - initContainers: - - name: antrea-agent-tweaker - image: "antrea/antrea-ubuntu:v1.9.0" - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 100m - command: ["antrea-agent-tweaker"] - args: ["--config", "/etc/antrea/antrea-agent-tweaker.conf"] - env: - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - securityContext: - capabilities: - add: - - NET_ADMIN - volumeMounts: - - name: antrea-agent-tweaker-config - mountPath: /etc/antrea/antrea-agent-tweaker.conf - subPath: antrea-agent-tweaker.conf - - name: install-cni - image: "antrea/antrea-ubuntu:v1.9.0" - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 100m - command: ["install_cni"] - securityContext: - capabilities: - add: - # SYS_MODULE is required to load the OVS kernel module. - - SYS_MODULE - env: - # SKIP_CNI_BINARIES takes in values as a comma separated list of - # binaries that need to be skipped for installation, e.g. "portmap, bandwidth". - - name: SKIP_CNI_BINARIES - value: "" - volumeMounts: - - name: antrea-config - mountPath: /etc/antrea/antrea-cni.conflist - subPath: antrea-cni.conflist - readOnly: true - - name: host-cni-conf - mountPath: /host/etc/cni/net.d - - name: host-cni-bin - mountPath: /host/opt/cni/bin - # For loading the OVS kernel module. - - name: host-lib-modules - mountPath: /lib/modules - readOnly: true - # For changing the default permissions of the run directory. - - name: host-var-run-antrea - mountPath: /var/run/antrea - containers: - - name: antrea-agent - image: "antrea/antrea-ubuntu:v1.9.0" - imagePullPolicy: IfNotPresent - command: ["antrea-agent"] - # Log to both "/var/log/antrea/" and stderr (so "kubectl logs" can work).- - args: - - "--config=/etc/antrea/antrea-agent.conf" - - "--logtostderr=false" - - "--log_dir=/var/log/antrea" - - "--alsologtostderr" - - "--log_file_max_size=100" - - "--log_file_max_num=4" - env: - # Provide pod and node information for clusterinformation CRD. - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - resources: - requests: - cpu: 200m - ports: - - containerPort: 10350 - name: api - protocol: TCP - livenessProbe: - httpGet: - host: localhost - path: /livez - port: api - scheme: HTTPS - initialDelaySeconds: 10 - timeoutSeconds: 5 - periodSeconds: 10 - failureThreshold: 5 - readinessProbe: - httpGet: - host: localhost - path: /readyz - port: api - scheme: HTTPS - initialDelaySeconds: 5 - timeoutSeconds: 5 - periodSeconds: 10 - # In large-scale clusters, it may take up to 40~50 seconds for the antrea-agent to reconnect to the antrea - # Service after the antrea-controller restarts. The antrea-agent shouldn't be reported as NotReady in this - # scenario, otherwise the DaemonSet controller would restart all agents at once, as opposed to performing a - # rolling update. Set failureThreshold to 8 so it can tolerate 70s of disconnection. - failureThreshold: 8 - securityContext: - # antrea-agent needs to perform sysctl configuration. - privileged: true - volumeMounts: - - name: antrea-config - mountPath: /etc/antrea/antrea-agent.conf - subPath: antrea-agent.conf - readOnly: true - - name: host-var-run-antrea - mountPath: /var/run/antrea - - name: host-var-run-antrea - mountPath: /var/run/openvswitch - subPath: openvswitch - # host-local IPAM stores allocated IP addresses as files in /var/lib/cni/networks/$NETWORK_NAME. - # Mount a sub-directory of host-var-run-antrea to it for persistence of IP allocation. - - name: host-var-run-antrea - mountPath: /var/lib/cni - subPath: cni - # We need to mount both the /proc directory and the /var/run/netns directory so that - # antrea-agent can open the network namespace path when setting up Pod - # networking. Different container runtimes may use /proc or /var/run/netns when invoking - # the CNI commands. Docker uses /proc and containerd uses /var/run/netns. - - name: host-var-log-antrea - mountPath: /var/log/antrea - - name: host-proc - mountPath: /host/proc - readOnly: true - - name: host-var-run-netns - mountPath: /host/var/run/netns - readOnly: true - # When a container is created, a mount point for the network namespace is added under - # /var/run/netns on the host, which needs to be propagated to the antrea-agent container. - mountPropagation: HostToContainer - - name: xtables-lock - mountPath: /run/xtables.lock - - name: antrea-ovs - image: "antrea/antrea-ubuntu:v1.9.0" - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 200m - command: ["start_ovs"] - args: - - "--log_file_max_size=100" - - "--log_file_max_num=4" - securityContext: - # capabilities required by OVS daemons - capabilities: - add: - - SYS_NICE - - NET_ADMIN - - SYS_ADMIN - - IPC_LOCK - livenessProbe: - exec: - # docker CRI doesn't honor timeoutSeconds, add "timeout" to the command as a workaround. - # https://github.com/kubernetes/kubernetes/issues/51901 - command: - - /bin/sh - - -c - - timeout 10 container_liveness_probe ovs - initialDelaySeconds: 5 - timeoutSeconds: 10 - periodSeconds: 10 - failureThreshold: 5 - volumeMounts: - - name: host-var-run-antrea - mountPath: /var/run/openvswitch - subPath: openvswitch - - name: host-var-log-antrea - mountPath: /var/log/openvswitch - subPath: openvswitch - volumes: - - name: antrea-config - configMap: - name: antrea-config - - name: antrea-agent-tweaker-config - configMap: - name: antrea-agent-tweaker - - name: host-cni-conf - hostPath: - path: /etc/cni/net.d - - name: host-cni-bin - hostPath: - path: /opt/cni/bin - - name: host-proc - hostPath: - path: /proc - - name: host-var-run-netns - hostPath: - path: /var/run/netns - - name: host-var-run-antrea - hostPath: - path: /var/run/antrea - # we use subPath to create run subdirectories for different component (e.g. OVS) and - # subPath requires the base volume to exist - type: DirectoryOrCreate - - name: host-var-log-antrea - hostPath: - path: /var/log/antrea - # we use subPath to create logging subdirectories for different component (e.g. OVS) - type: DirectoryOrCreate - - name: host-lib-modules - hostPath: - path: /lib/modules - - name: xtables-lock - hostPath: - path: /run/xtables.lock - type: FileOrCreate ---- -# Source: antrea/templates/controller/deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - name: antrea-controller - namespace: kube-system - labels: - app: antrea - component: antrea-controller -spec: - strategy: - # Ensure the existing Pod is stopped before the new one is created. - type: Recreate - selector: - matchLabels: - app: antrea - component: antrea-controller - replicas: 1 - template: - metadata: - annotations: - # Automatically restart Pod if the ConfigMap changes - # See https://helm.sh/docs/howto/charts_tips_and_tricks/#automatically-roll-deployments - checksum/config: ee2e9a832afaaf5f44ea0095d47e03dfcb1dbf8d9a879784244a078fd501b21d - labels: - app: antrea - component: antrea-controller - spec: - nodeSelector: - kubernetes.io/os: linux - hostNetwork: true - priorityClassName: system-cluster-critical - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - serviceAccountName: antrea-controller - containers: - - name: antrea-controller - image: "antrea/antrea-ubuntu:v1.9.0" - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 200m - command: ["antrea-controller"] - # Log to both "/var/log/antrea/" and stderr (so "kubectl logs" can work). - args: - - "--config=/etc/antrea/antrea-controller.conf" - - "--logtostderr=false" - - "--log_dir=/var/log/antrea" - - "--alsologtostderr" - - "--log_file_max_size=100" - - "--log_file_max_num=4" - env: - # Provide pod and node information for clusterinformation CRD. - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - # Provide ServiceAccount name for validation webhook. - - name: SERVICEACCOUNT_NAME - valueFrom: - fieldRef: - fieldPath: spec.serviceAccountName - - name: ANTREA_CONFIG_MAP_NAME - value: antrea-config - ports: - - containerPort: 10349 - name: api - protocol: TCP - readinessProbe: - httpGet: - host: localhost - path: /readyz - port: api - scheme: HTTPS - initialDelaySeconds: 5 - timeoutSeconds: 5 - periodSeconds: 10 - failureThreshold: 5 - livenessProbe: - httpGet: - host: localhost - path: /livez - port: api - scheme: HTTPS - timeoutSeconds: 5 - periodSeconds: 10 - failureThreshold: 5 - volumeMounts: - - name: antrea-config - mountPath: /etc/antrea/antrea-controller.conf - subPath: antrea-controller.conf - readOnly: true - - name: antrea-controller-tls - mountPath: /var/run/antrea/antrea-controller-tls - - name: host-var-log-antrea - mountPath: /var/log/antrea - volumes: - - name: antrea-config - configMap: - name: antrea-config - # Make it optional as we only read it when selfSignedCert=false. - - name: antrea-controller-tls - secret: - secretName: "antrea-controller-tls" - defaultMode: 0400 - optional: true - - name: host-var-log-antrea - hostPath: - path: /var/log/antrea - type: DirectoryOrCreate ---- -# Source: antrea/templates/controller/apiservices.yaml -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - name: v1beta2.controlplane.antrea.io - labels: - app: antrea -spec: - group: controlplane.antrea.io - groupPriorityMinimum: 100 - version: v1beta2 - versionPriority: 100 - service: - name: antrea - namespace: kube-system ---- -# Source: antrea/templates/controller/apiservices.yaml -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - name: v1beta1.system.antrea.io - labels: - app: antrea -spec: - group: system.antrea.io - groupPriorityMinimum: 100 - version: v1beta1 - versionPriority: 100 - service: - name: antrea - namespace: kube-system ---- -# Source: antrea/templates/controller/apiservices.yaml -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - name: v1alpha1.stats.antrea.io - labels: - app: antrea -spec: - group: stats.antrea.io - groupPriorityMinimum: 100 - version: v1alpha1 - versionPriority: 100 - service: - name: antrea - namespace: kube-system ---- -# Source: antrea/templates/webhooks/mutating/crdmutator.yaml -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - name: "crdmutator.antrea.io" - labels: - app: antrea -webhooks: - - name: "acnpmutator.antrea.io" - clientConfig: - service: - name: "antrea" - namespace: kube-system - path: "/mutate/acnp" - rules: - - operations: ["CREATE", "UPDATE"] - apiGroups: ["crd.antrea.io"] - apiVersions: ["v1alpha1"] - resources: ["clusternetworkpolicies"] - scope: "Cluster" - admissionReviewVersions: ["v1", "v1beta1"] - sideEffects: None - timeoutSeconds: 5 - - name: "anpmutator.antrea.io" - clientConfig: - service: - name: "antrea" - namespace: kube-system - path: "/mutate/anp" - rules: - - operations: ["CREATE", "UPDATE"] - apiGroups: ["crd.antrea.io"] - apiVersions: ["v1alpha1"] - resources: ["networkpolicies"] - scope: "Namespaced" - admissionReviewVersions: ["v1", "v1beta1"] - sideEffects: None - timeoutSeconds: 5 ---- -# Source: antrea/templates/webhooks/validating/crdvalidator.yaml -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - name: "crdvalidator.antrea.io" - labels: - app: antrea -webhooks: - - name: "tiervalidator.antrea.io" - clientConfig: - service: - name: "antrea" - namespace: kube-system - path: "/validate/tier" - rules: - - operations: ["CREATE", "UPDATE", "DELETE"] - apiGroups: ["crd.antrea.io"] - apiVersions: ["v1alpha1"] - resources: ["tiers"] - scope: "Cluster" - admissionReviewVersions: ["v1", "v1beta1"] - sideEffects: None - timeoutSeconds: 5 - - name: "acnpvalidator.antrea.io" - clientConfig: - service: - name: "antrea" - namespace: kube-system - path: "/validate/acnp" - rules: - - operations: ["CREATE", "UPDATE", "DELETE"] - apiGroups: ["crd.antrea.io"] - apiVersions: ["v1alpha1"] - resources: ["clusternetworkpolicies"] - scope: "Cluster" - admissionReviewVersions: ["v1", "v1beta1"] - sideEffects: None - timeoutSeconds: 5 - - name: "anpvalidator.antrea.io" - clientConfig: - service: - name: "antrea" - namespace: kube-system - path: "/validate/anp" - rules: - - operations: ["CREATE", "UPDATE", "DELETE"] - apiGroups: ["crd.antrea.io"] - apiVersions: ["v1alpha1"] - resources: ["networkpolicies"] - scope: "Namespaced" - admissionReviewVersions: ["v1", "v1beta1"] - sideEffects: None - timeoutSeconds: 5 - - name: "clustergroupvalidator.antrea.io" - clientConfig: - service: - name: "antrea" - namespace: kube-system - path: "/validate/clustergroup" - rules: - - operations: ["CREATE", "UPDATE"] - apiGroups: ["crd.antrea.io"] - apiVersions: ["v1alpha3", "v1alpha2"] - resources: ["clustergroups"] - scope: "Cluster" - admissionReviewVersions: ["v1", "v1beta1"] - sideEffects: None - timeoutSeconds: 5 - - name: "groupvalidator.antrea.io" - clientConfig: - service: - name: "antrea" - namespace: "kube-system" - path: "/validate/group" - rules: - - operations: [ "CREATE", "UPDATE" ] - apiGroups: [ "crd.antrea.io" ] - apiVersions: [ "v1alpha3" ] - resources: [ "groups" ] - scope: "Namespaced" - admissionReviewVersions: [ "v1", "v1beta1" ] - sideEffects: None - timeoutSeconds: 5 - - name: "externalippoolvalidator.antrea.io" - clientConfig: - service: - name: "antrea" - namespace: kube-system - path: "/validate/externalippool" - rules: - - operations: ["UPDATE"] - apiGroups: ["crd.antrea.io"] - apiVersions: ["v1alpha2"] - resources: ["externalippools"] - scope: "Cluster" - admissionReviewVersions: ["v1", "v1beta1"] - sideEffects: None - timeoutSeconds: 5 - - name: "egressvalidator.antrea.io" - clientConfig: - service: - name: "antrea" - namespace: kube-system - path: "/validate/egress" - rules: - - operations: ["CREATE", "UPDATE"] - apiGroups: ["crd.antrea.io"] - apiVersions: ["v1alpha2"] - resources: ["egresses"] - scope: "Cluster" - admissionReviewVersions: ["v1", "v1beta1"] - sideEffects: None - timeoutSeconds: 5 - - name: "ippoolvalidator.antrea.io" - clientConfig: - service: - name: "antrea" - namespace: kube-system - path: "/validate/ippool" - rules: - - operations: ["CREATE", "UPDATE", "DELETE"] - apiGroups: ["crd.antrea.io"] - apiVersions: ["v1alpha2"] - resources: ["ippools"] - scope: "Cluster" - admissionReviewVersions: ["v1", "v1beta1"] - sideEffects: None - timeoutSeconds: 5 diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/values.star b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/values.star deleted file mode 100644 index 6646f4a763..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/values.star +++ /dev/null @@ -1,12 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:assert", "assert") - -def validate_antrea(): - data.values.infraProvider or assert.fail("Infrastructure provider should be provided") -end - -# export data.values -values = data.values - -# validate antrea configuration -validate_antrea() diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/values.yaml b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/values.yaml deleted file mode 100644 index a975a84db4..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/antrea/1.9.0/bundle/config/values.yaml +++ /dev/null @@ -1,75 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True - ---- -infraProvider: vsphere -nodeSelector: null -deployment: - updateStrategy: null - rollingUpdate: - maxUnavailable: null - maxSurge: null -daemonset: - updateStrategy: null - -antrea: - config: - egress: - exceptCIDRs: [] - nodePortLocal: - enabled: true - portRange: 61000-62000 - antreaProxy: - proxyAll: false - nodePortAddresses: [] - skipServices: [] - proxyLoadBalancerIPs: false - flowExporter: - collectorAddress: "flow-aggregator.flow-aggregator.svc:4739:tls" - pollInterval: "5s" - activeFlowTimeout: "30s" - idleFlowTimeout: "15s" - kubeAPIServerOverride: null - transportInterface: null - transportInterfaceCIDRs: [] - tunnelType: geneve - tunnelPort: 0 - tunnelCsum: false - trafficEncryptionMode: none - wireGuard: - port: 51820 - serviceCIDR: 10.96.0.0/12 - serviceCIDRv6: null - enableUsageReporting: false - trafficEncapMode: encap - noSNAT: false - disableUdpTunnelOffload: false - #! Setting defaultMTU to null since antrea-agent will discover the MTU of the Node's primary interface and - #! also adjust MTU to accommodate for tunnel encapsulation overhead. - defaultMTU: null - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - enableBridgingMode: false - disableTXChecksumOffload: false - dnsServerOverride: null - multicastInterfaces: [] - multicast: - igmpQueryInterval: "125s" - multicluster: - enable: false - namespace: null - featureGates: - AntreaProxy: true - EndpointSlice: false - AntreaTraceflow: true - NodePortLocal: true - AntreaPolicy: true - FlowExporter: false - NetworkPolicyStats: false - Egress: true - AntreaIPAM: false - ServiceExternalIP: false - Multicast: false - Multicluster: false - SecondaryNetwork: false - TrafficControl: false - TopologyAwareHints: false diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/overlay/calico-overlay.yaml b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/overlay/calico-overlay.yaml deleted file mode 100644 index 71a7a5e0eb..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/overlay/calico-overlay.yaml +++ /dev/null @@ -1,158 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("/values.star", "values") -#@ load("@ytt:json", "json") - -#@ def startswith(index, left, right): -#@ return left.startswith(right) -#@ end - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "calico-kube-controllers"}}) ---- -kind: Deployment -metadata: - name: calico-kube-controllers - #@overlay/match missing_ok=True - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" - kapp.k14s.io/update-strategy: fallback-on-replace - -#@overlay/match by=overlay.subset({"kind":"DaemonSet", "metadata": {"name": "calico-node"}}) ---- -kind: DaemonSet -metadata: - #@overlay/match missing_ok=True - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" - kapp.k14s.io/update-strategy: fallback-on-replace -spec: - template: - spec: - initContainers: - #@overlay/match by=overlay.subset({"name":"install-cni"}) - - name: install-cni - env: - #@ if hasattr(values.calico.config, 'skipCNIBinaries') and values.calico.config.skipCNIBinaries == True: - #@overlay/merge - - name: SKIP_CNI_BINARIES - value: "bandwidth,flannel,host-local,loopback,portmap,tuning" - #@ end - containers: - #@overlay/match by=overlay.subset({"name":"calico-node"}) - - name: calico-node - env: - #@ if values.ipFamily == "ipv6": - #@overlay/match by=overlay.subset({"name":"IP"}) - - value: none - #@overlay/match by=overlay.subset({"name":"FELIX_IPV6SUPPORT"}) - - value: "true" - #@overlay/match by=overlay.subset({"name":"CALICO_IPV4POOL_IPIP"}) - #@overlay/remove - - {} - #@overlay/match by=overlay.subset({"name":"CALICO_IPV4POOL_VXLAN"}) - #@overlay/remove - - {} - #! The cluster CIDR is only appended when configured in values. - #@ if values.calico.config.clusterCIDR: - #@overlay/append - - name: CALICO_IPV6POOL_CIDR - value: #@ values.calico.config.clusterCIDR - #@ end - #@overlay/append - - name: IP6 - value: autodetect - #@overlay/append - - name: CALICO_ROUTER_ID - value: hash - #@overlay/append - - name: CALICO_IPV6POOL_NAT_OUTGOING - value: "true" - #@ elif values.ipFamily in ["ipv4,ipv6", "ipv6,ipv4"]: - #@overlay/match by=overlay.subset({"name":"FELIX_IPV6SUPPORT"}) - - value: "true" - #! The cluster CIDR is only appended when configured in values. - #@ if values.calico.config.clusterCIDR: - #@overlay/append - - name: CALICO_IPV4POOL_CIDR - #@ if values.ipFamily == "ipv4,ipv6": - value: #@ values.calico.config.clusterCIDR.split(",")[0] - #@ else: - value: #@ values.calico.config.clusterCIDR.split(",")[1] - #@ end - #@overlay/append - - name: CALICO_IPV6POOL_CIDR - #@ if values.ipFamily == "ipv4,ipv6": - value: #@ values.calico.config.clusterCIDR.split(",")[1] - #@ else: - value: #@ values.calico.config.clusterCIDR.split(",")[0] - #@ end - #@ end - #@overlay/append - - name: IP6 - value: autodetect - #@overlay/append - - name: CALICO_IPV6POOL_NAT_OUTGOING - value: "true" - #! default case where ipFamily == ipv4 - #@ elif values.calico.config.clusterCIDR: - #@overlay/append - - name: CALICO_IPV4POOL_CIDR - value: #@ values.calico.config.clusterCIDR - #@ end - #@ if values.infraProvider == "azure": - #@overlay/match by=overlay.subset({"name":"CALICO_IPV4POOL_IPIP"}) - #@overlay/merge - - name: CALICO_IPV4POOL_IPIP - value: Never - #@overlay/match by=overlay.subset({"name":"CALICO_IPV4POOL_VXLAN"}) - #@overlay/merge - - name: CALICO_IPV4POOL_VXLAN - value: Always - #@overlay/match by=overlay.subset({"name":"FELIX_IPINIPMTU"}) - #@overlay/remove - - name: FELIX_IPINIPMTU - livenessProbe: - exec: - command: - #@overlay/remove - #@overlay/match by=startswith - - -bird-live - readinessProbe: - exec: - command: - #@overlay/remove - #@overlay/match by=startswith - - -bird-ready - #@ end - -#! configure_ipam_by_ip_family configures the ipam section of -#! cni_network_config based on the ipFamily. Note: cni_network_config json is -#! not valid json because of the __CNI_MTU__ placeholder. To inject the ipam -#! configuration with the json decoder, the function temporarily replaces the -#! __CNI_MTU__ placeholder with a quoted ! placeholder. -#@ def configure_ipam_by_ip_family(cni_json_str, _): -#@ if values.ipFamily not in ["ipv6", "ipv4,ipv6", "ipv6,ipv4"]: -#@ return cni_json_str -#@ end -#@ quoted_placeholder = '"TEMP_QUOTED_PLACEHOLDER"' -#@ unquoted_cni_mtu_value = "__CNI_MTU__" -#@ json_str = cni_json_str.replace(unquoted_cni_mtu_value, quoted_placeholder) -#@ cni_json = json.decode(json_str) -#@ cni_json["plugins"][0]["ipam"]["assign_ipv6"] = "true" -#@ if values.ipFamily in ["ipv4,ipv6", "ipv6,ipv4"]: -#@ cni_json["plugins"][0]["ipam"]["assign_ipv4"] = "true" -#@ else: -#@ cni_json["plugins"][0]["ipam"]["assign_ipv4"] = "false" -#@ end -#@ updated_json_str = json.encode(cni_json) -#@ return updated_json_str.replace(quoted_placeholder, unquoted_cni_mtu_value) -#@ end - -#@overlay/match by=overlay.subset({"kind":"ConfigMap"}) ---- -data: - #@ if/end values.infraProvider == "azure": - calico_backend: "vxlan" - #@ if/end hasattr(values.calico.config, 'vethMTU') and values.calico.config.vethMTU: - veth_mtu: #@ values.calico.config.vethMTU - #@overlay/replace via=configure_ipam_by_ip_family - cni_network_config: diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/overlay/update-strategy-overlay.yaml b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/overlay/update-strategy-overlay.yaml deleted file mode 100644 index fa14644c77..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/overlay/update-strategy-overlay.yaml +++ /dev/null @@ -1,50 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#! We are adding this overlay in the package to accommodate the need from vSphere supervisor cluster: -#! `deployment.spec.strategy.type` is configured to `RollingUpdate` -#! `deployment.spec.strategy.rollingUpdate.maxUnavailable` is set to `0`. -#! `deployment.spec.strategy.rollingUpdate.maxSurge` is set to `1`. -#! `deployment.spec.template.spec.nodeSelector`is set to target only `Nodes` -#! `daemonset.spec.updateStrategy.type` is configured to `OnDelete` -#! This overlay makes configuring the above parameters possible -#! Reference: https://github.com/vmware-tanzu/tanzu-framework/issues/1850 - -#@overlay/match expects="0+",by=overlay.subset({"kind":"Deployment"}) ---- -kind: Deployment -spec: - #@ if data.values.deployment.updateStrategy != None: - #@overlay/match missing_ok=True - strategy: - type: #@ data.values.deployment.updateStrategy - #@overlay/match missing_ok=True - #@ if data.values.deployment.updateStrategy == "RollingUpdate": - rollingUpdate: - #@ if/end data.values.deployment.rollingUpdate.maxUnavailable != None: - maxUnavailable: #@ data.values.deployment.rollingUpdate.maxUnavailable - #@ if/end data.values.deployment.rollingUpdate.maxSurge != None: - maxSurge: #@ data.values.deployment.rollingUpdate.maxSurge - #@ end - #@ end - #@ if data.values.nodeSelector != None: - template: - spec: - #@overlay/match missing_ok=True - nodeSelector: - #@ for key in data.values.nodeSelector: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - (@= key @): #@ data.values.nodeSelector[key] - #@ end - #@ end - -#@overlay/match expects="0+",by=overlay.subset({"kind":"DaemonSet"}) ---- -kind: DaemonSet -spec: - #@ if data.values.daemonset.updateStrategy: - #@overlay/match missing_ok=True - updateStrategy: - type: #@ data.values.daemonset.updateStrategy - #@ end diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/schema.yaml b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/schema.yaml deleted file mode 100644 index f35fcbdd7e..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/schema.yaml +++ /dev/null @@ -1,83 +0,0 @@ -#! schema.yaml - -#@data/values-schema -#@schema/desc "OpenAPIv3 Schema for calico" ---- -#@schema/deprecated "Kept for backward compatibility" -#@schema/desc "The namespace in which calico is deployed" -#@schema/nullable -namespace: kube-system -#@schema/desc "Infrastructure provider in use" -infraProvider: vsphere -#@schema/desc "NodeSelector configuration applied to all the deployments" -#@schema/type any=True -nodeSelector: -deployment: - #@schema/desc "Update strategy of deployments" - #@schema/nullable - updateStrategy: "" - rollingUpdate: - #@schema/desc "The maxUnavailable of rollingUpdate. Applied only if RollingUpdate is used as updateStrategy" - #@schema/nullable - maxUnavailable: 1 - #@schema/desc "The maxSurge of rollingUpdate. Applied only if RollingUpdate is used as updateStrategy" - #@schema/nullable - maxSurge: 0 -daemonset: - #@schema/desc "Update strategy of daemonsets" - #@schema/nullable - updateStrategy: "" -#@schema/desc "The IP family calico should be configured with" -#@schema/nullable -ipFamily: "ipv4,ipv6" -#@schema/desc "The calico specific configurations" -calico: - #@schema/desc "Configuration for calico" - config: - #@schema/desc "The CIDR pool used to assign IP addresses to the pods in the cluster" - #@schema/nullable - clusterCIDR: "192.168.0.0/16,fd00:100:96::/48" - #@schema/desc "Maximum transmission unit setting" - vethMTU: "0" - #@schema/desc "Skip the cni plugin binaries installation" - skipCNIBinaries: false - #@schema/deprecated "Kept for backward compatibility" - #@schema/desc "The image repo and its pull policy" - #@schema/nullable - image: - #@schema/nullable - repository: "" - #@schema/nullable - pullPolicy: IfNotPresent - #@schema/deprecated "Kept for backward compatibility" - #@schema/desc "The calico cni image path and tag" - #@schema/nullable - cniImage: - #@schema/nullable - path: "" - #@schema/nullable - tag: "" - #@schema/deprecated "Kept for backward compatibility" - #@schema/desc "The calico node image path and tag" - #@schema/nullable - nodeImage: - #@schema/nullable - path: "" - #@schema/nullable - tag: "" - #@schema/deprecated "Kept for backward compatibility" - #@schema/desc "The calico pod2daemon image path and tag" - #@schema/nullable - podDaemonImage: - #@schema/nullable - path: "" - #@schema/nullable - tag: "" - #@schema/deprecated "Kept for backward compatibility" - #@schema/desc "The calico kube controllers image path and tag" - #@schema/nullable - kubeControllerImage: - #@schema/nullable - path: "" - #@schema/nullable - tag: "" diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/upstream/calico.yaml b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/upstream/calico.yaml deleted file mode 100644 index 0fbb0a15b9..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/upstream/calico.yaml +++ /dev/null @@ -1,4724 +0,0 @@ ---- -# Source: calico/templates/calico-kube-controllers.yaml -# This manifest creates a Pod Disruption Budget for Controller to allow K8s Cluster Autoscaler to evict - -apiVersion: policy/v1 -kind: PodDisruptionBudget -metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers -spec: - maxUnavailable: 1 - selector: - matchLabels: - k8s-app: calico-kube-controllers ---- -# Source: calico/templates/calico-kube-controllers.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: calico-kube-controllers - namespace: kube-system ---- -# Source: calico/templates/calico-node.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: calico-node - namespace: kube-system ---- -# Source: calico/templates/calico-config.yaml -# This ConfigMap is used to configure a self-hosted Calico installation. -kind: ConfigMap -apiVersion: v1 -metadata: - name: calico-config - namespace: kube-system -data: - # Typha is disabled. - typha_service_name: "none" - # Configure the backend to use. - calico_backend: "bird" - - # Configure the MTU to use for workload interfaces and tunnels. - # By default, MTU is auto-detected, and explicitly setting this field should not be required. - # You can override auto-detection by providing a non-zero value. - veth_mtu: "0" - - # The CNI network configuration to install on each node. The special - # values in this config will be automatically populated. - cni_network_config: |- - { - "name": "k8s-pod-network", - "cniVersion": "0.3.1", - "plugins": [ - { - "type": "calico", - "log_level": "info", - "log_file_path": "/var/log/calico/cni/cni.log", - "datastore_type": "kubernetes", - "nodename": "__KUBERNETES_NODE_NAME__", - "mtu": __CNI_MTU__, - "ipam": { - "type": "calico-ipam" - }, - "policy": { - "type": "k8s" - }, - "kubernetes": { - "kubeconfig": "__KUBECONFIG_FILEPATH__" - } - }, - { - "type": "portmap", - "snat": true, - "capabilities": {"portMappings": true} - }, - { - "type": "bandwidth", - "capabilities": {"bandwidth": true} - } - ] - } ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: bgpconfigurations.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: BGPConfiguration - listKind: BGPConfigurationList - plural: bgpconfigurations - singular: bgpconfiguration - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: BGPConfiguration contains the configuration for any BGP routing. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: BGPConfigurationSpec contains the values of the BGP configuration. - properties: - asNumber: - description: 'ASNumber is the default AS number used by a node. [Default: - 64512]' - format: int32 - type: integer - bindMode: - description: BindMode indicates whether to listen for BGP connections - on all addresses (None) or only on the node's canonical IP address - Node.Spec.BGP.IPvXAddress (NodeIP). Default behaviour is to listen - for BGP connections on all addresses. - type: string - communities: - description: Communities is a list of BGP community values and their - arbitrary names for tagging routes. - items: - description: Community contains standard or large community value - and its name. - properties: - name: - description: Name given to community value. - type: string - value: - description: Value must be of format `aa:nn` or `aa:nn:mm`. - For standard community use `aa:nn` format, where `aa` and - `nn` are 16 bit number. For large community use `aa:nn:mm` - format, where `aa`, `nn` and `mm` are 32 bit number. Where, - `aa` is an AS Number, `nn` and `mm` are per-AS identifier. - pattern: ^(\d+):(\d+)$|^(\d+):(\d+):(\d+)$ - type: string - type: object - type: array - listenPort: - description: ListenPort is the port where BGP protocol should listen. - Defaults to 179 - maximum: 65535 - minimum: 1 - type: integer - logSeverityScreen: - description: 'LogSeverityScreen is the log severity above which logs - are sent to the stdout. [Default: INFO]' - type: string - nodeMeshMaxRestartTime: - description: Time to allow for software restart for node-to-mesh peerings. When - specified, this is configured as the graceful restart timeout. When - not specified, the BIRD default of 120s is used. This field can - only be set on the default BGPConfiguration instance and requires - that NodeMesh is enabled - type: string - nodeMeshPassword: - description: Optional BGP password for full node-to-mesh peerings. - This field can only be set on the default BGPConfiguration instance - and requires that NodeMesh is enabled - properties: - secretKeyRef: - description: Selects a key of a secret in the node pod's namespace. - properties: - key: - description: The key of the secret to select from. Must be - a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be - defined - type: boolean - required: - - key - type: object - type: object - nodeToNodeMeshEnabled: - description: 'NodeToNodeMeshEnabled sets whether full node to node - BGP mesh is enabled. [Default: true]' - type: boolean - prefixAdvertisements: - description: PrefixAdvertisements contains per-prefix advertisement - configuration. - items: - description: PrefixAdvertisement configures advertisement properties - for the specified CIDR. - properties: - cidr: - description: CIDR for which properties should be advertised. - type: string - communities: - description: Communities can be list of either community names - already defined in `Specs.Communities` or community value - of format `aa:nn` or `aa:nn:mm`. For standard community use - `aa:nn` format, where `aa` and `nn` are 16 bit number. For - large community use `aa:nn:mm` format, where `aa`, `nn` and - `mm` are 32 bit number. Where,`aa` is an AS Number, `nn` and - `mm` are per-AS identifier. - items: - type: string - type: array - type: object - type: array - serviceClusterIPs: - description: ServiceClusterIPs are the CIDR blocks from which service - cluster IPs are allocated. If specified, Calico will advertise these - blocks, as well as any cluster IPs within them. - items: - description: ServiceClusterIPBlock represents a single allowed ClusterIP - CIDR block. - properties: - cidr: - type: string - type: object - type: array - serviceExternalIPs: - description: ServiceExternalIPs are the CIDR blocks for Kubernetes - Service External IPs. Kubernetes Service ExternalIPs will only be - advertised if they are within one of these blocks. - items: - description: ServiceExternalIPBlock represents a single allowed - External IP CIDR block. - properties: - cidr: - type: string - type: object - type: array - serviceLoadBalancerIPs: - description: ServiceLoadBalancerIPs are the CIDR blocks for Kubernetes - Service LoadBalancer IPs. Kubernetes Service status.LoadBalancer.Ingress - IPs will only be advertised if they are within one of these blocks. - items: - description: ServiceLoadBalancerIPBlock represents a single allowed - LoadBalancer IP CIDR block. - properties: - cidr: - type: string - type: object - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: bgppeers.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: BGPPeer - listKind: BGPPeerList - plural: bgppeers - singular: bgppeer - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: BGPPeerSpec contains the specification for a BGPPeer resource. - properties: - asNumber: - description: The AS Number of the peer. - format: int32 - type: integer - keepOriginalNextHop: - description: Option to keep the original nexthop field when routes - are sent to a BGP Peer. Setting "true" configures the selected BGP - Peers node to use the "next hop keep;" instead of "next hop self;"(default) - in the specific branch of the Node on "bird.cfg". - type: boolean - maxRestartTime: - description: Time to allow for software restart. When specified, - this is configured as the graceful restart timeout. When not specified, - the BIRD default of 120s is used. - type: string - node: - description: The node name identifying the Calico node instance that - is targeted by this peer. If this is not set, and no nodeSelector - is specified, then this BGP peer selects all nodes in the cluster. - type: string - nodeSelector: - description: Selector for the nodes that should have this peering. When - this is set, the Node field must be empty. - type: string - numAllowedLocalASNumbers: - description: Maximum number of local AS numbers that are allowed in - the AS path for received routes. This removes BGP loop prevention - and should only be used if absolutely necesssary. - format: int32 - type: integer - password: - description: Optional BGP password for the peerings generated by this - BGPPeer resource. - properties: - secretKeyRef: - description: Selects a key of a secret in the node pod's namespace. - properties: - key: - description: The key of the secret to select from. Must be - a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be - defined - type: boolean - required: - - key - type: object - type: object - peerIP: - description: The IP address of the peer followed by an optional port - number to peer with. If port number is given, format should be `[]:port` - or `:` for IPv4. If optional port number is not set, - and this peer IP and ASNumber belongs to a calico/node with ListenPort - set in BGPConfiguration, then we use that port to peer. - type: string - peerSelector: - description: Selector for the remote nodes to peer with. When this - is set, the PeerIP and ASNumber fields must be empty. For each - peering between the local node and selected remote nodes, we configure - an IPv4 peering if both ends have NodeBGPSpec.IPv4Address specified, - and an IPv6 peering if both ends have NodeBGPSpec.IPv6Address specified. The - remote AS number comes from the remote node's NodeBGPSpec.ASNumber, - or the global default if that is not set. - type: string - sourceAddress: - description: Specifies whether and how to configure a source address - for the peerings generated by this BGPPeer resource. Default value - "UseNodeIP" means to configure the node IP as the source address. "None" - means not to configure a source address. - type: string - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: blockaffinities.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: BlockAffinity - listKind: BlockAffinityList - plural: blockaffinities - singular: blockaffinity - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: BlockAffinitySpec contains the specification for a BlockAffinity - resource. - properties: - cidr: - type: string - deleted: - description: Deleted indicates that this block affinity is being deleted. - This field is a string for compatibility with older releases that - mistakenly treat this field as a string. - type: string - node: - type: string - state: - type: string - required: - - cidr - - deleted - - node - - state - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: (devel) - creationTimestamp: null - name: caliconodestatuses.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: CalicoNodeStatus - listKind: CalicoNodeStatusList - plural: caliconodestatuses - singular: caliconodestatus - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: CalicoNodeStatusSpec contains the specification for a CalicoNodeStatus - resource. - properties: - classes: - description: Classes declares the types of information to monitor - for this calico/node, and allows for selective status reporting - about certain subsets of information. - items: - type: string - type: array - node: - description: The node name identifies the Calico node instance for - node status. - type: string - updatePeriodSeconds: - description: UpdatePeriodSeconds is the period at which CalicoNodeStatus - should be updated. Set to 0 to disable CalicoNodeStatus refresh. - Maximum update period is one day. - format: int32 - type: integer - type: object - status: - description: CalicoNodeStatusStatus defines the observed state of CalicoNodeStatus. - No validation needed for status since it is updated by Calico. - properties: - agent: - description: Agent holds agent status on the node. - properties: - birdV4: - description: BIRDV4 represents the latest observed status of bird4. - properties: - lastBootTime: - description: LastBootTime holds the value of lastBootTime - from bird.ctl output. - type: string - lastReconfigurationTime: - description: LastReconfigurationTime holds the value of lastReconfigTime - from bird.ctl output. - type: string - routerID: - description: Router ID used by bird. - type: string - state: - description: The state of the BGP Daemon. - type: string - version: - description: Version of the BGP daemon - type: string - type: object - birdV6: - description: BIRDV6 represents the latest observed status of bird6. - properties: - lastBootTime: - description: LastBootTime holds the value of lastBootTime - from bird.ctl output. - type: string - lastReconfigurationTime: - description: LastReconfigurationTime holds the value of lastReconfigTime - from bird.ctl output. - type: string - routerID: - description: Router ID used by bird. - type: string - state: - description: The state of the BGP Daemon. - type: string - version: - description: Version of the BGP daemon - type: string - type: object - type: object - bgp: - description: BGP holds node BGP status. - properties: - numberEstablishedV4: - description: The total number of IPv4 established bgp sessions. - type: integer - numberEstablishedV6: - description: The total number of IPv6 established bgp sessions. - type: integer - numberNotEstablishedV4: - description: The total number of IPv4 non-established bgp sessions. - type: integer - numberNotEstablishedV6: - description: The total number of IPv6 non-established bgp sessions. - type: integer - peersV4: - description: PeersV4 represents IPv4 BGP peers status on the node. - items: - description: CalicoNodePeer contains the status of BGP peers - on the node. - properties: - peerIP: - description: IP address of the peer whose condition we are - reporting. - type: string - since: - description: Since the state or reason last changed. - type: string - state: - description: State is the BGP session state. - type: string - type: - description: Type indicates whether this peer is configured - via the node-to-node mesh, or via en explicit global or - per-node BGPPeer object. - type: string - type: object - type: array - peersV6: - description: PeersV6 represents IPv6 BGP peers status on the node. - items: - description: CalicoNodePeer contains the status of BGP peers - on the node. - properties: - peerIP: - description: IP address of the peer whose condition we are - reporting. - type: string - since: - description: Since the state or reason last changed. - type: string - state: - description: State is the BGP session state. - type: string - type: - description: Type indicates whether this peer is configured - via the node-to-node mesh, or via en explicit global or - per-node BGPPeer object. - type: string - type: object - type: array - required: - - numberEstablishedV4 - - numberEstablishedV6 - - numberNotEstablishedV4 - - numberNotEstablishedV6 - type: object - lastUpdated: - description: LastUpdated is a timestamp representing the server time - when CalicoNodeStatus object last updated. It is represented in - RFC3339 form and is in UTC. - format: date-time - nullable: true - type: string - routes: - description: Routes reports routes known to the Calico BGP daemon - on the node. - properties: - routesV4: - description: RoutesV4 represents IPv4 routes on the node. - items: - description: CalicoNodeRoute contains the status of BGP routes - on the node. - properties: - destination: - description: Destination of the route. - type: string - gateway: - description: Gateway for the destination. - type: string - interface: - description: Interface for the destination - type: string - learnedFrom: - description: LearnedFrom contains information regarding - where this route originated. - properties: - peerIP: - description: If sourceType is NodeMesh or BGPPeer, IP - address of the router that sent us this route. - type: string - sourceType: - description: Type of the source where a route is learned - from. - type: string - type: object - type: - description: Type indicates if the route is being used for - forwarding or not. - type: string - type: object - type: array - routesV6: - description: RoutesV6 represents IPv6 routes on the node. - items: - description: CalicoNodeRoute contains the status of BGP routes - on the node. - properties: - destination: - description: Destination of the route. - type: string - gateway: - description: Gateway for the destination. - type: string - interface: - description: Interface for the destination - type: string - learnedFrom: - description: LearnedFrom contains information regarding - where this route originated. - properties: - peerIP: - description: If sourceType is NodeMesh or BGPPeer, IP - address of the router that sent us this route. - type: string - sourceType: - description: Type of the source where a route is learned - from. - type: string - type: object - type: - description: Type indicates if the route is being used for - forwarding or not. - type: string - type: object - type: array - type: object - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: clusterinformations.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: ClusterInformation - listKind: ClusterInformationList - plural: clusterinformations - singular: clusterinformation - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: ClusterInformation contains the cluster specific information. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterInformationSpec contains the values of describing - the cluster. - properties: - calicoVersion: - description: CalicoVersion is the version of Calico that the cluster - is running - type: string - clusterGUID: - description: ClusterGUID is the GUID of the cluster - type: string - clusterType: - description: ClusterType describes the type of the cluster - type: string - datastoreReady: - description: DatastoreReady is used during significant datastore migrations - to signal to components such as Felix that it should wait before - accessing the datastore. - type: boolean - variant: - description: Variant declares which variant of Calico should be active. - type: string - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: felixconfigurations.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: FelixConfiguration - listKind: FelixConfigurationList - plural: felixconfigurations - singular: felixconfiguration - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: Felix Configuration contains the configuration for Felix. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: FelixConfigurationSpec contains the values of the Felix configuration. - properties: - allowIPIPPacketsFromWorkloads: - description: 'AllowIPIPPacketsFromWorkloads controls whether Felix - will add a rule to drop IPIP encapsulated traffic from workloads - [Default: false]' - type: boolean - allowVXLANPacketsFromWorkloads: - description: 'AllowVXLANPacketsFromWorkloads controls whether Felix - will add a rule to drop VXLAN encapsulated traffic from workloads - [Default: false]' - type: boolean - awsSrcDstCheck: - description: 'Set source-destination-check on AWS EC2 instances. Accepted - value must be one of "DoNothing", "Enable" or "Disable". [Default: - DoNothing]' - enum: - - DoNothing - - Enable - - Disable - type: string - bpfConnectTimeLoadBalancingEnabled: - description: 'BPFConnectTimeLoadBalancingEnabled when in BPF mode, - controls whether Felix installs the connection-time load balancer. The - connect-time load balancer is required for the host to be able to - reach Kubernetes services and it improves the performance of pod-to-service - connections. The only reason to disable it is for debugging purposes. [Default: - true]' - type: boolean - bpfDataIfacePattern: - description: BPFDataIfacePattern is a regular expression that controls - which interfaces Felix should attach BPF programs to in order to - catch traffic to/from the network. This needs to match the interfaces - that Calico workload traffic flows over as well as any interfaces - that handle incoming traffic to nodeports and services from outside - the cluster. It should not match the workload interfaces (usually - named cali...). - type: string - bpfDisableUnprivileged: - description: 'BPFDisableUnprivileged, if enabled, Felix sets the kernel.unprivileged_bpf_disabled - sysctl to disable unprivileged use of BPF. This ensures that unprivileged - users cannot access Calico''s BPF maps and cannot insert their own - BPF programs to interfere with Calico''s. [Default: true]' - type: boolean - bpfEnabled: - description: 'BPFEnabled, if enabled Felix will use the BPF dataplane. - [Default: false]' - type: boolean - bpfEnforceRPF: - description: 'BPFEnforceRPF enforce strict RPF on all interfaces with - BPF programs regardless of what is the per-interfaces or global - setting. Possible values are Disabled or Strict. [Default: Strict]' - type: string - bpfExtToServiceConnmark: - description: 'BPFExtToServiceConnmark in BPF mode, control a 32bit - mark that is set on connections from an external client to a local - service. This mark allows us to control how packets of that connection - are routed within the host and how is routing interpreted by RPF - check. [Default: 0]' - type: integer - bpfExternalServiceMode: - description: 'BPFExternalServiceMode in BPF mode, controls how connections - from outside the cluster to services (node ports and cluster IPs) - are forwarded to remote workloads. If set to "Tunnel" then both - request and response traffic is tunneled to the remote node. If - set to "DSR", the request traffic is tunneled but the response traffic - is sent directly from the remote node. In "DSR" mode, the remote - node appears to use the IP of the ingress node; this requires a - permissive L2 network. [Default: Tunnel]' - type: string - bpfKubeProxyEndpointSlicesEnabled: - description: BPFKubeProxyEndpointSlicesEnabled in BPF mode, controls - whether Felix's embedded kube-proxy accepts EndpointSlices or not. - type: boolean - bpfKubeProxyIptablesCleanupEnabled: - description: 'BPFKubeProxyIptablesCleanupEnabled, if enabled in BPF - mode, Felix will proactively clean up the upstream Kubernetes kube-proxy''s - iptables chains. Should only be enabled if kube-proxy is not running. [Default: - true]' - type: boolean - bpfKubeProxyMinSyncPeriod: - description: 'BPFKubeProxyMinSyncPeriod, in BPF mode, controls the - minimum time between updates to the dataplane for Felix''s embedded - kube-proxy. Lower values give reduced set-up latency. Higher values - reduce Felix CPU usage by batching up more work. [Default: 1s]' - type: string - bpfLogLevel: - description: 'BPFLogLevel controls the log level of the BPF programs - when in BPF dataplane mode. One of "Off", "Info", or "Debug". The - logs are emitted to the BPF trace pipe, accessible with the command - `tc exec bpf debug`. [Default: Off].' - type: string - bpfMapSizeConntrack: - description: 'BPFMapSizeConntrack sets the size for the conntrack - map. This map must be large enough to hold an entry for each active - connection. Warning: changing the size of the conntrack map can - cause disruption.' - type: integer - bpfMapSizeIPSets: - description: BPFMapSizeIPSets sets the size for ipsets map. The IP - sets map must be large enough to hold an entry for each endpoint - matched by every selector in the source/destination matches in network - policy. Selectors such as "all()" can result in large numbers of - entries (one entry per endpoint in that case). - type: integer - bpfMapSizeIfState: - description: BPFMapSizeIfState sets the size for ifstate map. The - ifstate map must be large enough to hold an entry for each device - (host + workloads) on a host. - type: integer - bpfMapSizeNATAffinity: - type: integer - bpfMapSizeNATBackend: - description: BPFMapSizeNATBackend sets the size for nat back end map. - This is the total number of endpoints. This is mostly more than - the size of the number of services. - type: integer - bpfMapSizeNATFrontend: - description: BPFMapSizeNATFrontend sets the size for nat front end - map. FrontendMap should be large enough to hold an entry for each - nodeport, external IP and each port in each service. - type: integer - bpfMapSizeRoute: - description: BPFMapSizeRoute sets the size for the routes map. The - routes map should be large enough to hold one entry per workload - and a handful of entries per host (enough to cover its own IPs and - tunnel IPs). - type: integer - bpfPSNATPorts: - anyOf: - - type: integer - - type: string - description: 'BPFPSNATPorts sets the range from which we randomly - pick a port if there is a source port collision. This should be - within the ephemeral range as defined by RFC 6056 (1024–65535) and - preferably outside the ephemeral ranges used by common operating - systems. Linux uses 32768–60999, while others mostly use the IANA - defined range 49152–65535. It is not necessarily a problem if this - range overlaps with the operating systems. Both ends of the range - are inclusive. [Default: 20000:29999]' - pattern: ^.* - x-kubernetes-int-or-string: true - bpfPolicyDebugEnabled: - description: BPFPolicyDebugEnabled when true, Felix records detailed - information about the BPF policy programs, which can be examined - with the calico-bpf command-line tool. - type: boolean - chainInsertMode: - description: 'ChainInsertMode controls whether Felix hooks the kernel''s - top-level iptables chains by inserting a rule at the top of the - chain or by appending a rule at the bottom. insert is the safe default - since it prevents Calico''s rules from being bypassed. If you switch - to append mode, be sure that the other rules in the chains signal - acceptance by falling through to the Calico rules, otherwise the - Calico policy will be bypassed. [Default: insert]' - type: string - dataplaneDriver: - description: DataplaneDriver filename of the external dataplane driver - to use. Only used if UseInternalDataplaneDriver is set to false. - type: string - dataplaneWatchdogTimeout: - description: 'DataplaneWatchdogTimeout is the readiness/liveness timeout - used for Felix''s (internal) dataplane driver. Increase this value - if you experience spurious non-ready or non-live events when Felix - is under heavy load. Decrease the value to get felix to report non-live - or non-ready more quickly. [Default: 90s]' - type: string - debugDisableLogDropping: - type: boolean - debugMemoryProfilePath: - type: string - debugSimulateCalcGraphHangAfter: - type: string - debugSimulateDataplaneHangAfter: - type: string - defaultEndpointToHostAction: - description: 'DefaultEndpointToHostAction controls what happens to - traffic that goes from a workload endpoint to the host itself (after - the traffic hits the endpoint egress policy). By default Calico - blocks traffic from workload endpoints to the host itself with an - iptables "DROP" action. If you want to allow some or all traffic - from endpoint to host, set this parameter to RETURN or ACCEPT. Use - RETURN if you have your own rules in the iptables "INPUT" chain; - Calico will insert its rules at the top of that chain, then "RETURN" - packets to the "INPUT" chain once it has completed processing workload - endpoint egress policy. Use ACCEPT to unconditionally accept packets - from workloads after processing workload endpoint egress policy. - [Default: Drop]' - type: string - deviceRouteProtocol: - description: This defines the route protocol added to programmed device - routes, by default this will be RTPROT_BOOT when left blank. - type: integer - deviceRouteSourceAddress: - description: This is the IPv4 source address to use on programmed - device routes. By default the source address is left blank, leaving - the kernel to choose the source address used. - type: string - deviceRouteSourceAddressIPv6: - description: This is the IPv6 source address to use on programmed - device routes. By default the source address is left blank, leaving - the kernel to choose the source address used. - type: string - disableConntrackInvalidCheck: - type: boolean - endpointReportingDelay: - type: string - endpointReportingEnabled: - type: boolean - externalNodesList: - description: ExternalNodesCIDRList is a list of CIDR's of external-non-calico-nodes - which may source tunnel traffic and have the tunneled traffic be - accepted at calico nodes. - items: - type: string - type: array - failsafeInboundHostPorts: - description: 'FailsafeInboundHostPorts is a list of UDP/TCP ports - and CIDRs that Felix will allow incoming traffic to host endpoints - on irrespective of the security policy. This is useful to avoid - accidentally cutting off a host with incorrect configuration. For - back-compatibility, if the protocol is not specified, it defaults - to "tcp". If a CIDR is not specified, it will allow traffic from - all addresses. To disable all inbound host ports, use the value - none. The default value allows ssh access and DHCP. [Default: tcp:22, - udp:68, tcp:179, tcp:2379, tcp:2380, tcp:6443, tcp:6666, tcp:6667]' - items: - description: ProtoPort is combination of protocol, port, and CIDR. - Protocol and port must be specified. - properties: - net: - type: string - port: - type: integer - protocol: - type: string - required: - - port - - protocol - type: object - type: array - failsafeOutboundHostPorts: - description: 'FailsafeOutboundHostPorts is a list of UDP/TCP ports - and CIDRs that Felix will allow outgoing traffic from host endpoints - to irrespective of the security policy. This is useful to avoid - accidentally cutting off a host with incorrect configuration. For - back-compatibility, if the protocol is not specified, it defaults - to "tcp". If a CIDR is not specified, it will allow traffic from - all addresses. To disable all outbound host ports, use the value - none. The default value opens etcd''s standard ports to ensure that - Felix does not get cut off from etcd as well as allowing DHCP and - DNS. [Default: tcp:179, tcp:2379, tcp:2380, tcp:6443, tcp:6666, - tcp:6667, udp:53, udp:67]' - items: - description: ProtoPort is combination of protocol, port, and CIDR. - Protocol and port must be specified. - properties: - net: - type: string - port: - type: integer - protocol: - type: string - required: - - port - - protocol - type: object - type: array - featureDetectOverride: - description: FeatureDetectOverride is used to override the feature - detection. Values are specified in a comma separated list with no - spaces, example; "SNATFullyRandom=true,MASQFullyRandom=false,RestoreSupportsLock=". - "true" or "false" will force the feature, empty or omitted values - are auto-detected. - type: string - floatingIPs: - description: FloatingIPs configures whether or not Felix will program - floating IP addresses. - enum: - - Enabled - - Disabled - type: string - genericXDPEnabled: - description: 'GenericXDPEnabled enables Generic XDP so network cards - that don''t support XDP offload or driver modes can use XDP. This - is not recommended since it doesn''t provide better performance - than iptables. [Default: false]' - type: boolean - healthEnabled: - type: boolean - healthHost: - type: string - healthPort: - type: integer - interfaceExclude: - description: 'InterfaceExclude is a comma-separated list of interfaces - that Felix should exclude when monitoring for host endpoints. The - default value ensures that Felix ignores Kubernetes'' IPVS dummy - interface, which is used internally by kube-proxy. If you want to - exclude multiple interface names using a single value, the list - supports regular expressions. For regular expressions you must wrap - the value with ''/''. For example having values ''/^kube/,veth1'' - will exclude all interfaces that begin with ''kube'' and also the - interface ''veth1''. [Default: kube-ipvs0]' - type: string - interfacePrefix: - description: 'InterfacePrefix is the interface name prefix that identifies - workload endpoints and so distinguishes them from host endpoint - interfaces. Note: in environments other than bare metal, the orchestrators - configure this appropriately. For example our Kubernetes and Docker - integrations set the ''cali'' value, and our OpenStack integration - sets the ''tap'' value. [Default: cali]' - type: string - interfaceRefreshInterval: - description: InterfaceRefreshInterval is the period at which Felix - rescans local interfaces to verify their state. The rescan can be - disabled by setting the interval to 0. - type: string - ipipEnabled: - description: 'IPIPEnabled overrides whether Felix should configure - an IPIP interface on the host. Optional as Felix determines this - based on the existing IP pools. [Default: nil (unset)]' - type: boolean - ipipMTU: - description: 'IPIPMTU is the MTU to set on the tunnel device. See - Configuring MTU [Default: 1440]' - type: integer - ipsetsRefreshInterval: - description: 'IpsetsRefreshInterval is the period at which Felix re-checks - all iptables state to ensure that no other process has accidentally - broken Calico''s rules. Set to 0 to disable iptables refresh. [Default: - 90s]' - type: string - iptablesBackend: - description: IptablesBackend specifies which backend of iptables will - be used. The default is legacy. - type: string - iptablesFilterAllowAction: - type: string - iptablesLockFilePath: - description: 'IptablesLockFilePath is the location of the iptables - lock file. You may need to change this if the lock file is not in - its standard location (for example if you have mapped it into Felix''s - container at a different path). [Default: /run/xtables.lock]' - type: string - iptablesLockProbeInterval: - description: 'IptablesLockProbeInterval is the time that Felix will - wait between attempts to acquire the iptables lock if it is not - available. Lower values make Felix more responsive when the lock - is contended, but use more CPU. [Default: 50ms]' - type: string - iptablesLockTimeout: - description: 'IptablesLockTimeout is the time that Felix will wait - for the iptables lock, or 0, to disable. To use this feature, Felix - must share the iptables lock file with all other processes that - also take the lock. When running Felix inside a container, this - requires the /run directory of the host to be mounted into the calico/node - or calico/felix container. [Default: 0s disabled]' - type: string - iptablesMangleAllowAction: - type: string - iptablesMarkMask: - description: 'IptablesMarkMask is the mask that Felix selects its - IPTables Mark bits from. Should be a 32 bit hexadecimal number with - at least 8 bits set, none of which clash with any other mark bits - in use on the system. [Default: 0xff000000]' - format: int32 - type: integer - iptablesNATOutgoingInterfaceFilter: - type: string - iptablesPostWriteCheckInterval: - description: 'IptablesPostWriteCheckInterval is the period after Felix - has done a write to the dataplane that it schedules an extra read - back in order to check the write was not clobbered by another process. - This should only occur if another application on the system doesn''t - respect the iptables lock. [Default: 1s]' - type: string - iptablesRefreshInterval: - description: 'IptablesRefreshInterval is the period at which Felix - re-checks the IP sets in the dataplane to ensure that no other process - has accidentally broken Calico''s rules. Set to 0 to disable IP - sets refresh. Note: the default for this value is lower than the - other refresh intervals as a workaround for a Linux kernel bug that - was fixed in kernel version 4.11. If you are using v4.11 or greater - you may want to set this to, a higher value to reduce Felix CPU - usage. [Default: 10s]' - type: string - ipv6Support: - description: IPv6Support controls whether Felix enables support for - IPv6 (if supported by the in-use dataplane). - type: boolean - kubeNodePortRanges: - description: 'KubeNodePortRanges holds list of port ranges used for - service node ports. Only used if felix detects kube-proxy running - in ipvs mode. Felix uses these ranges to separate host and workload - traffic. [Default: 30000:32767].' - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - logDebugFilenameRegex: - description: LogDebugFilenameRegex controls which source code files - have their Debug log output included in the logs. Only logs from - files with names that match the given regular expression are included. The - filter only applies to Debug level logs. - type: string - logFilePath: - description: 'LogFilePath is the full path to the Felix log. Set to - none to disable file logging. [Default: /var/log/calico/felix.log]' - type: string - logPrefix: - description: 'LogPrefix is the log prefix that Felix uses when rendering - LOG rules. [Default: calico-packet]' - type: string - logSeverityFile: - description: 'LogSeverityFile is the log severity above which logs - are sent to the log file. [Default: Info]' - type: string - logSeverityScreen: - description: 'LogSeverityScreen is the log severity above which logs - are sent to the stdout. [Default: Info]' - type: string - logSeveritySys: - description: 'LogSeveritySys is the log severity above which logs - are sent to the syslog. Set to None for no logging to syslog. [Default: - Info]' - type: string - maxIpsetSize: - type: integer - metadataAddr: - description: 'MetadataAddr is the IP address or domain name of the - server that can answer VM queries for cloud-init metadata. In OpenStack, - this corresponds to the machine running nova-api (or in Ubuntu, - nova-api-metadata). A value of none (case insensitive) means that - Felix should not set up any NAT rule for the metadata path. [Default: - 127.0.0.1]' - type: string - metadataPort: - description: 'MetadataPort is the port of the metadata server. This, - combined with global.MetadataAddr (if not ''None''), is used to - set up a NAT rule, from 169.254.169.254:80 to MetadataAddr:MetadataPort. - In most cases this should not need to be changed [Default: 8775].' - type: integer - mtuIfacePattern: - description: MTUIfacePattern is a regular expression that controls - which interfaces Felix should scan in order to calculate the host's - MTU. This should not match workload interfaces (usually named cali...). - type: string - natOutgoingAddress: - description: NATOutgoingAddress specifies an address to use when performing - source NAT for traffic in a natOutgoing pool that is leaving the - network. By default the address used is an address on the interface - the traffic is leaving on (ie it uses the iptables MASQUERADE target) - type: string - natPortRange: - anyOf: - - type: integer - - type: string - description: NATPortRange specifies the range of ports that is used - for port mapping when doing outgoing NAT. When unset the default - behavior of the network stack is used. - pattern: ^.* - x-kubernetes-int-or-string: true - netlinkTimeout: - type: string - openstackRegion: - description: 'OpenstackRegion is the name of the region that a particular - Felix belongs to. In a multi-region Calico/OpenStack deployment, - this must be configured somehow for each Felix (here in the datamodel, - or in felix.cfg or the environment on each compute node), and must - match the [calico] openstack_region value configured in neutron.conf - on each node. [Default: Empty]' - type: string - policySyncPathPrefix: - description: 'PolicySyncPathPrefix is used to by Felix to communicate - policy changes to external services, like Application layer policy. - [Default: Empty]' - type: string - prometheusGoMetricsEnabled: - description: 'PrometheusGoMetricsEnabled disables Go runtime metrics - collection, which the Prometheus client does by default, when set - to false. This reduces the number of metrics reported, reducing - Prometheus load. [Default: true]' - type: boolean - prometheusMetricsEnabled: - description: 'PrometheusMetricsEnabled enables the Prometheus metrics - server in Felix if set to true. [Default: false]' - type: boolean - prometheusMetricsHost: - description: 'PrometheusMetricsHost is the host that the Prometheus - metrics server should bind to. [Default: empty]' - type: string - prometheusMetricsPort: - description: 'PrometheusMetricsPort is the TCP port that the Prometheus - metrics server should bind to. [Default: 9091]' - type: integer - prometheusProcessMetricsEnabled: - description: 'PrometheusProcessMetricsEnabled disables process metrics - collection, which the Prometheus client does by default, when set - to false. This reduces the number of metrics reported, reducing - Prometheus load. [Default: true]' - type: boolean - prometheusWireGuardMetricsEnabled: - description: 'PrometheusWireGuardMetricsEnabled disables wireguard - metrics collection, which the Prometheus client does by default, - when set to false. This reduces the number of metrics reported, - reducing Prometheus load. [Default: true]' - type: boolean - removeExternalRoutes: - description: Whether or not to remove device routes that have not - been programmed by Felix. Disabling this will allow external applications - to also add device routes. This is enabled by default which means - we will remove externally added routes. - type: boolean - reportingInterval: - description: 'ReportingInterval is the interval at which Felix reports - its status into the datastore or 0 to disable. Must be non-zero - in OpenStack deployments. [Default: 30s]' - type: string - reportingTTL: - description: 'ReportingTTL is the time-to-live setting for process-wide - status reports. [Default: 90s]' - type: string - routeRefreshInterval: - description: 'RouteRefreshInterval is the period at which Felix re-checks - the routes in the dataplane to ensure that no other process has - accidentally broken Calico''s rules. Set to 0 to disable route refresh. - [Default: 90s]' - type: string - routeSource: - description: 'RouteSource configures where Felix gets its routing - information. - WorkloadIPs: use workload endpoints to construct - routes. - CalicoIPAM: the default - use IPAM data to construct routes.' - type: string - routeSyncDisabled: - description: RouteSyncDisabled will disable all operations performed - on the route table. Set to true to run in network-policy mode only. - type: boolean - routeTableRange: - description: Deprecated in favor of RouteTableRanges. Calico programs - additional Linux route tables for various purposes. RouteTableRange - specifies the indices of the route tables that Calico should use. - properties: - max: - type: integer - min: - type: integer - required: - - max - - min - type: object - routeTableRanges: - description: Calico programs additional Linux route tables for various - purposes. RouteTableRanges specifies a set of table index ranges - that Calico should use. Deprecates`RouteTableRange`, overrides `RouteTableRange`. - items: - properties: - max: - type: integer - min: - type: integer - required: - - max - - min - type: object - type: array - serviceLoopPrevention: - description: 'When service IP advertisement is enabled, prevent routing - loops to service IPs that are not in use, by dropping or rejecting - packets that do not get DNAT''d by kube-proxy. Unless set to "Disabled", - in which case such routing loops continue to be allowed. [Default: - Drop]' - type: string - sidecarAccelerationEnabled: - description: 'SidecarAccelerationEnabled enables experimental sidecar - acceleration [Default: false]' - type: boolean - usageReportingEnabled: - description: 'UsageReportingEnabled reports anonymous Calico version - number and cluster size to projectcalico.org. Logs warnings returned - by the usage server. For example, if a significant security vulnerability - has been discovered in the version of Calico being used. [Default: - true]' - type: boolean - usageReportingInitialDelay: - description: 'UsageReportingInitialDelay controls the minimum delay - before Felix makes a report. [Default: 300s]' - type: string - usageReportingInterval: - description: 'UsageReportingInterval controls the interval at which - Felix makes reports. [Default: 86400s]' - type: string - useInternalDataplaneDriver: - description: UseInternalDataplaneDriver, if true, Felix will use its - internal dataplane programming logic. If false, it will launch - an external dataplane driver and communicate with it over protobuf. - type: boolean - vxlanEnabled: - description: 'VXLANEnabled overrides whether Felix should create the - VXLAN tunnel device for VXLAN networking. Optional as Felix determines - this based on the existing IP pools. [Default: nil (unset)]' - type: boolean - vxlanMTU: - description: 'VXLANMTU is the MTU to set on the IPv4 VXLAN tunnel - device. See Configuring MTU [Default: 1410]' - type: integer - vxlanMTUV6: - description: 'VXLANMTUV6 is the MTU to set on the IPv6 VXLAN tunnel - device. See Configuring MTU [Default: 1390]' - type: integer - vxlanPort: - type: integer - vxlanVNI: - type: integer - wireguardEnabled: - description: 'WireguardEnabled controls whether Wireguard is enabled - for IPv4 (encapsulating IPv4 traffic over an IPv4 underlay network). - [Default: false]' - type: boolean - wireguardEnabledV6: - description: 'WireguardEnabledV6 controls whether Wireguard is enabled - for IPv6 (encapsulating IPv6 traffic over an IPv6 underlay network). - [Default: false]' - type: boolean - wireguardHostEncryptionEnabled: - description: 'WireguardHostEncryptionEnabled controls whether Wireguard - host-to-host encryption is enabled. [Default: false]' - type: boolean - wireguardInterfaceName: - description: 'WireguardInterfaceName specifies the name to use for - the IPv4 Wireguard interface. [Default: wireguard.cali]' - type: string - wireguardInterfaceNameV6: - description: 'WireguardInterfaceNameV6 specifies the name to use for - the IPv6 Wireguard interface. [Default: wg-v6.cali]' - type: string - wireguardKeepAlive: - description: 'WireguardKeepAlive controls Wireguard PersistentKeepalive - option. Set 0 to disable. [Default: 0]' - type: string - wireguardListeningPort: - description: 'WireguardListeningPort controls the listening port used - by IPv4 Wireguard. [Default: 51820]' - type: integer - wireguardListeningPortV6: - description: 'WireguardListeningPortV6 controls the listening port - used by IPv6 Wireguard. [Default: 51821]' - type: integer - wireguardMTU: - description: 'WireguardMTU controls the MTU on the IPv4 Wireguard - interface. See Configuring MTU [Default: 1440]' - type: integer - wireguardMTUV6: - description: 'WireguardMTUV6 controls the MTU on the IPv6 Wireguard - interface. See Configuring MTU [Default: 1420]' - type: integer - wireguardRoutingRulePriority: - description: 'WireguardRoutingRulePriority controls the priority value - to use for the Wireguard routing rule. [Default: 99]' - type: integer - workloadSourceSpoofing: - description: WorkloadSourceSpoofing controls whether pods can use - the allowedSourcePrefixes annotation to send traffic with a source - IP address that is not theirs. This is disabled by default. When - set to "Any", pods can request any prefix. - type: string - xdpEnabled: - description: 'XDPEnabled enables XDP acceleration for suitable untracked - incoming deny rules. [Default: true]' - type: boolean - xdpRefreshInterval: - description: 'XDPRefreshInterval is the period at which Felix re-checks - all XDP state to ensure that no other process has accidentally broken - Calico''s BPF maps or attached programs. Set to 0 to disable XDP - refresh. [Default: 90s]' - type: string - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: globalnetworkpolicies.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: GlobalNetworkPolicy - listKind: GlobalNetworkPolicyList - plural: globalnetworkpolicies - singular: globalnetworkpolicy - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - applyOnForward: - description: ApplyOnForward indicates to apply the rules in this policy - on forward traffic. - type: boolean - doNotTrack: - description: DoNotTrack indicates whether packets matched by the rules - in this policy should go through the data plane's connection tracking, - such as Linux conntrack. If True, the rules in this policy are - applied before any data plane connection tracking, and packets allowed - by this policy are marked as not to be tracked. - type: boolean - egress: - description: The ordered set of egress rules. Each rule contains - a set of packet match criteria and a corresponding action to apply. - items: - description: "A Rule encapsulates a set of match criteria and an - action. Both selector-based security Policy and security Profiles - reference rules - separated out as a list of rules for both ingress - and egress packet matching. \n Each positive match criteria has - a negated version, prefixed with \"Not\". All the match criteria - within a rule must be satisfied for a packet to match. A single - rule can contain the positive and negative version of a match - and both must be satisfied for the rule to match." - properties: - action: - type: string - destination: - description: Destination contains the match criteria that apply - to destination entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and another selector are defined on the same rule, then - only workload endpoints that are matched by both selectors - will be selected by the rule. \n For NetworkPolicy, an - empty NamespaceSelector implies that the Selector is limited - to selecting only workload endpoints in the same namespace - as the NetworkPolicy. \n For NetworkPolicy, `global()` - NamespaceSelector implies that the Selector is limited - to selecting only GlobalNetworkSet or HostEndpoint. \n - For GlobalNetworkPolicy, an empty NamespaceSelector implies - the Selector applies to workload endpoints across all - namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - services: - description: "Services is an optional field that contains - options for matching Kubernetes Services. If specified, - only traffic that originates from or terminates at endpoints - within the selected service(s) will be matched, and only - to/from each endpoint's port. \n Services cannot be specified - on the same rule as Selector, NotSelector, NamespaceSelector, - Nets, NotNets or ServiceAccounts. \n Ports and NotPorts - can only be specified with Services on ingress rules." - properties: - name: - description: Name specifies the name of a Kubernetes - Service to match. - type: string - namespace: - description: Namespace specifies the namespace of the - given Service. If left empty, the rule will match - within this policy's namespace. - type: string - type: object - type: object - http: - description: HTTP contains match criteria that apply to HTTP - requests. - properties: - methods: - description: Methods is an optional field that restricts - the rule to apply only to HTTP requests that use one of - the listed HTTP Methods (e.g. GET, PUT, etc.) Multiple - methods are OR'd together. - items: - type: string - type: array - paths: - description: 'Paths is an optional field that restricts - the rule to apply to HTTP requests that use one of the - listed HTTP Paths. Multiple paths are OR''d together. - e.g: - exact: /foo - prefix: /bar NOTE: Each entry may - ONLY specify either a `exact` or a `prefix` match. The - validator will check for it.' - items: - description: 'HTTPPath specifies an HTTP path to match. - It may be either of the form: exact: : which matches - the path exactly or prefix: : which matches - the path prefix' - properties: - exact: - type: string - prefix: - type: string - type: object - type: array - type: object - icmp: - description: ICMP is an optional field that restricts the rule - to apply to a specific type and code of ICMP traffic. This - should only be specified if the Protocol field is set to "ICMP" - or "ICMPv6". - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - ipVersion: - description: IPVersion is an optional field that restricts the - rule to only match a specific IP version. - type: integer - metadata: - description: Metadata contains additional information for this - rule - properties: - annotations: - additionalProperties: - type: string - description: Annotations is a set of key value pairs that - give extra information about the rule - type: object - type: object - notICMP: - description: NotICMP is the negated version of the ICMP field. - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - notProtocol: - anyOf: - - type: integer - - type: string - description: NotProtocol is the negated version of the Protocol - field. - pattern: ^.* - x-kubernetes-int-or-string: true - protocol: - anyOf: - - type: integer - - type: string - description: "Protocol is an optional field that restricts the - rule to only apply to traffic of a specific IP protocol. Required - if any of the EntityRules contain Ports (because ports only - apply to certain protocols). \n Must be one of these string - values: \"TCP\", \"UDP\", \"ICMP\", \"ICMPv6\", \"SCTP\", - \"UDPLite\" or an integer in the range 1-255." - pattern: ^.* - x-kubernetes-int-or-string: true - source: - description: Source contains the match criteria that apply to - source entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and another selector are defined on the same rule, then - only workload endpoints that are matched by both selectors - will be selected by the rule. \n For NetworkPolicy, an - empty NamespaceSelector implies that the Selector is limited - to selecting only workload endpoints in the same namespace - as the NetworkPolicy. \n For NetworkPolicy, `global()` - NamespaceSelector implies that the Selector is limited - to selecting only GlobalNetworkSet or HostEndpoint. \n - For GlobalNetworkPolicy, an empty NamespaceSelector implies - the Selector applies to workload endpoints across all - namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - services: - description: "Services is an optional field that contains - options for matching Kubernetes Services. If specified, - only traffic that originates from or terminates at endpoints - within the selected service(s) will be matched, and only - to/from each endpoint's port. \n Services cannot be specified - on the same rule as Selector, NotSelector, NamespaceSelector, - Nets, NotNets or ServiceAccounts. \n Ports and NotPorts - can only be specified with Services on ingress rules." - properties: - name: - description: Name specifies the name of a Kubernetes - Service to match. - type: string - namespace: - description: Namespace specifies the namespace of the - given Service. If left empty, the rule will match - within this policy's namespace. - type: string - type: object - type: object - required: - - action - type: object - type: array - ingress: - description: The ordered set of ingress rules. Each rule contains - a set of packet match criteria and a corresponding action to apply. - items: - description: "A Rule encapsulates a set of match criteria and an - action. Both selector-based security Policy and security Profiles - reference rules - separated out as a list of rules for both ingress - and egress packet matching. \n Each positive match criteria has - a negated version, prefixed with \"Not\". All the match criteria - within a rule must be satisfied for a packet to match. A single - rule can contain the positive and negative version of a match - and both must be satisfied for the rule to match." - properties: - action: - type: string - destination: - description: Destination contains the match criteria that apply - to destination entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and another selector are defined on the same rule, then - only workload endpoints that are matched by both selectors - will be selected by the rule. \n For NetworkPolicy, an - empty NamespaceSelector implies that the Selector is limited - to selecting only workload endpoints in the same namespace - as the NetworkPolicy. \n For NetworkPolicy, `global()` - NamespaceSelector implies that the Selector is limited - to selecting only GlobalNetworkSet or HostEndpoint. \n - For GlobalNetworkPolicy, an empty NamespaceSelector implies - the Selector applies to workload endpoints across all - namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - services: - description: "Services is an optional field that contains - options for matching Kubernetes Services. If specified, - only traffic that originates from or terminates at endpoints - within the selected service(s) will be matched, and only - to/from each endpoint's port. \n Services cannot be specified - on the same rule as Selector, NotSelector, NamespaceSelector, - Nets, NotNets or ServiceAccounts. \n Ports and NotPorts - can only be specified with Services on ingress rules." - properties: - name: - description: Name specifies the name of a Kubernetes - Service to match. - type: string - namespace: - description: Namespace specifies the namespace of the - given Service. If left empty, the rule will match - within this policy's namespace. - type: string - type: object - type: object - http: - description: HTTP contains match criteria that apply to HTTP - requests. - properties: - methods: - description: Methods is an optional field that restricts - the rule to apply only to HTTP requests that use one of - the listed HTTP Methods (e.g. GET, PUT, etc.) Multiple - methods are OR'd together. - items: - type: string - type: array - paths: - description: 'Paths is an optional field that restricts - the rule to apply to HTTP requests that use one of the - listed HTTP Paths. Multiple paths are OR''d together. - e.g: - exact: /foo - prefix: /bar NOTE: Each entry may - ONLY specify either a `exact` or a `prefix` match. The - validator will check for it.' - items: - description: 'HTTPPath specifies an HTTP path to match. - It may be either of the form: exact: : which matches - the path exactly or prefix: : which matches - the path prefix' - properties: - exact: - type: string - prefix: - type: string - type: object - type: array - type: object - icmp: - description: ICMP is an optional field that restricts the rule - to apply to a specific type and code of ICMP traffic. This - should only be specified if the Protocol field is set to "ICMP" - or "ICMPv6". - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - ipVersion: - description: IPVersion is an optional field that restricts the - rule to only match a specific IP version. - type: integer - metadata: - description: Metadata contains additional information for this - rule - properties: - annotations: - additionalProperties: - type: string - description: Annotations is a set of key value pairs that - give extra information about the rule - type: object - type: object - notICMP: - description: NotICMP is the negated version of the ICMP field. - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - notProtocol: - anyOf: - - type: integer - - type: string - description: NotProtocol is the negated version of the Protocol - field. - pattern: ^.* - x-kubernetes-int-or-string: true - protocol: - anyOf: - - type: integer - - type: string - description: "Protocol is an optional field that restricts the - rule to only apply to traffic of a specific IP protocol. Required - if any of the EntityRules contain Ports (because ports only - apply to certain protocols). \n Must be one of these string - values: \"TCP\", \"UDP\", \"ICMP\", \"ICMPv6\", \"SCTP\", - \"UDPLite\" or an integer in the range 1-255." - pattern: ^.* - x-kubernetes-int-or-string: true - source: - description: Source contains the match criteria that apply to - source entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and another selector are defined on the same rule, then - only workload endpoints that are matched by both selectors - will be selected by the rule. \n For NetworkPolicy, an - empty NamespaceSelector implies that the Selector is limited - to selecting only workload endpoints in the same namespace - as the NetworkPolicy. \n For NetworkPolicy, `global()` - NamespaceSelector implies that the Selector is limited - to selecting only GlobalNetworkSet or HostEndpoint. \n - For GlobalNetworkPolicy, an empty NamespaceSelector implies - the Selector applies to workload endpoints across all - namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - services: - description: "Services is an optional field that contains - options for matching Kubernetes Services. If specified, - only traffic that originates from or terminates at endpoints - within the selected service(s) will be matched, and only - to/from each endpoint's port. \n Services cannot be specified - on the same rule as Selector, NotSelector, NamespaceSelector, - Nets, NotNets or ServiceAccounts. \n Ports and NotPorts - can only be specified with Services on ingress rules." - properties: - name: - description: Name specifies the name of a Kubernetes - Service to match. - type: string - namespace: - description: Namespace specifies the namespace of the - given Service. If left empty, the rule will match - within this policy's namespace. - type: string - type: object - type: object - required: - - action - type: object - type: array - namespaceSelector: - description: NamespaceSelector is an optional field for an expression - used to select a pod based on namespaces. - type: string - order: - description: Order is an optional field that specifies the order in - which the policy is applied. Policies with higher "order" are applied - after those with lower order. If the order is omitted, it may be - considered to be "infinite" - i.e. the policy will be applied last. Policies - with identical order will be applied in alphanumerical order based - on the Policy "Name". - type: number - preDNAT: - description: PreDNAT indicates to apply the rules in this policy before - any DNAT. - type: boolean - selector: - description: "The selector is an expression used to pick pick out - the endpoints that the policy should be applied to. \n Selector - expressions follow this syntax: \n \tlabel == \"string_literal\" - \ -> comparison, e.g. my_label == \"foo bar\" \tlabel != \"string_literal\" - \ -> not equal; also matches if label is not present \tlabel in - { \"a\", \"b\", \"c\", ... } -> true if the value of label X is - one of \"a\", \"b\", \"c\" \tlabel not in { \"a\", \"b\", \"c\", - ... } -> true if the value of label X is not one of \"a\", \"b\", - \"c\" \thas(label_name) -> True if that label is present \t! expr - -> negation of expr \texpr && expr -> Short-circuit and \texpr - || expr -> Short-circuit or \t( expr ) -> parens for grouping \tall() - or the empty selector -> matches all endpoints. \n Label names are - allowed to contain alphanumerics, -, _ and /. String literals are - more permissive but they do not support escape characters. \n Examples - (with made-up labels): \n \ttype == \"webserver\" && deployment - == \"prod\" \ttype in {\"frontend\", \"backend\"} \tdeployment != - \"dev\" \t! has(label_name)" - type: string - serviceAccountSelector: - description: ServiceAccountSelector is an optional field for an expression - used to select a pod based on service accounts. - type: string - types: - description: "Types indicates whether this policy applies to ingress, - or to egress, or to both. When not explicitly specified (and so - the value on creation is empty or nil), Calico defaults Types according - to what Ingress and Egress rules are present in the policy. The - default is: \n - [ PolicyTypeIngress ], if there are no Egress rules - (including the case where there are also no Ingress rules) \n - - [ PolicyTypeEgress ], if there are Egress rules but no Ingress - rules \n - [ PolicyTypeIngress, PolicyTypeEgress ], if there are - both Ingress and Egress rules. \n When the policy is read back again, - Types will always be one of these values, never empty or nil." - items: - description: PolicyType enumerates the possible values of the PolicySpec - Types field. - type: string - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: globalnetworksets.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: GlobalNetworkSet - listKind: GlobalNetworkSetList - plural: globalnetworksets - singular: globalnetworkset - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: GlobalNetworkSet contains a set of arbitrary IP sub-networks/CIDRs - that share labels to allow rules to refer to them via selectors. The labels - of GlobalNetworkSet are not namespaced. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: GlobalNetworkSetSpec contains the specification for a NetworkSet - resource. - properties: - nets: - description: The list of IP networks that belong to this set. - items: - type: string - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: hostendpoints.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: HostEndpoint - listKind: HostEndpointList - plural: hostendpoints - singular: hostendpoint - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: HostEndpointSpec contains the specification for a HostEndpoint - resource. - properties: - expectedIPs: - description: "The expected IP addresses (IPv4 and IPv6) of the endpoint. - If \"InterfaceName\" is not present, Calico will look for an interface - matching any of the IPs in the list and apply policy to that. Note: - \tWhen using the selector match criteria in an ingress or egress - security Policy \tor Profile, Calico converts the selector into - a set of IP addresses. For host \tendpoints, the ExpectedIPs field - is used for that purpose. (If only the interface \tname is specified, - Calico does not learn the IPs of the interface for use in match - \tcriteria.)" - items: - type: string - type: array - interfaceName: - description: "Either \"*\", or the name of a specific Linux interface - to apply policy to; or empty. \"*\" indicates that this HostEndpoint - governs all traffic to, from or through the default network namespace - of the host named by the \"Node\" field; entering and leaving that - namespace via any interface, including those from/to non-host-networked - local workloads. \n If InterfaceName is not \"*\", this HostEndpoint - only governs traffic that enters or leaves the host through the - specific interface named by InterfaceName, or - when InterfaceName - is empty - through the specific interface that has one of the IPs - in ExpectedIPs. Therefore, when InterfaceName is empty, at least - one expected IP must be specified. Only external interfaces (such - as \"eth0\") are supported here; it isn't possible for a HostEndpoint - to protect traffic through a specific local workload interface. - \n Note: Only some kinds of policy are implemented for \"*\" HostEndpoints; - initially just pre-DNAT policy. Please check Calico documentation - for the latest position." - type: string - node: - description: The node name identifying the Calico node instance. - type: string - ports: - description: Ports contains the endpoint's named ports, which may - be referenced in security policy rules. - items: - properties: - name: - type: string - port: - type: integer - protocol: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - required: - - name - - port - - protocol - type: object - type: array - profiles: - description: A list of identifiers of security Profile objects that - apply to this endpoint. Each profile is applied in the order that - they appear in this list. Profile rules are applied after the selector-based - security policy. - items: - type: string - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: ipamblocks.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: IPAMBlock - listKind: IPAMBlockList - plural: ipamblocks - singular: ipamblock - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: IPAMBlockSpec contains the specification for an IPAMBlock - resource. - properties: - affinity: - description: Affinity of the block, if this block has one. If set, - it will be of the form "host:". If not set, this block - is not affine to a host. - type: string - allocations: - description: Array of allocations in-use within this block. nil entries - mean the allocation is free. For non-nil entries at index i, the - index is the ordinal of the allocation within this block and the - value is the index of the associated attributes in the Attributes - array. - items: - type: integer - # TODO: This nullable is manually added in. We should update controller-gen - # to handle []*int properly itself. - nullable: true - type: array - attributes: - description: Attributes is an array of arbitrary metadata associated - with allocations in the block. To find attributes for a given allocation, - use the value of the allocation's entry in the Allocations array - as the index of the element in this array. - items: - properties: - handle_id: - type: string - secondary: - additionalProperties: - type: string - type: object - type: object - type: array - cidr: - description: The block's CIDR. - type: string - deleted: - description: Deleted is an internal boolean used to workaround a limitation - in the Kubernetes API whereby deletion will not return a conflict - error if the block has been updated. It should not be set manually. - type: boolean - sequenceNumber: - default: 0 - description: We store a sequence number that is updated each time - the block is written. Each allocation will also store the sequence - number of the block at the time of its creation. When releasing - an IP, passing the sequence number associated with the allocation - allows us to protect against a race condition and ensure the IP - hasn't been released and re-allocated since the release request. - format: int64 - type: integer - sequenceNumberForAllocation: - additionalProperties: - format: int64 - type: integer - description: Map of allocated ordinal within the block to sequence - number of the block at the time of allocation. Kubernetes does not - allow numerical keys for maps, so the key is cast to a string. - type: object - strictAffinity: - description: StrictAffinity on the IPAMBlock is deprecated and no - longer used by the code. Use IPAMConfig StrictAffinity instead. - type: boolean - unallocated: - description: Unallocated is an ordered list of allocations which are - free in the block. - items: - type: integer - type: array - required: - - allocations - - attributes - - cidr - - strictAffinity - - unallocated - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: ipamconfigs.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: IPAMConfig - listKind: IPAMConfigList - plural: ipamconfigs - singular: ipamconfig - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: IPAMConfigSpec contains the specification for an IPAMConfig - resource. - properties: - autoAllocateBlocks: - type: boolean - maxBlocksPerHost: - description: MaxBlocksPerHost, if non-zero, is the max number of blocks - that can be affine to each host. - maximum: 2147483647 - minimum: 0 - type: integer - strictAffinity: - type: boolean - required: - - autoAllocateBlocks - - strictAffinity - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: ipamhandles.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: IPAMHandle - listKind: IPAMHandleList - plural: ipamhandles - singular: ipamhandle - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: IPAMHandleSpec contains the specification for an IPAMHandle - resource. - properties: - block: - additionalProperties: - type: integer - type: object - deleted: - type: boolean - handleID: - type: string - required: - - block - - handleID - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: ippools.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: IPPool - listKind: IPPoolList - plural: ippools - singular: ippool - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: IPPoolSpec contains the specification for an IPPool resource. - properties: - allowedUses: - description: AllowedUse controls what the IP pool will be used for. If - not specified or empty, defaults to ["Tunnel", "Workload"] for back-compatibility - items: - type: string - type: array - blockSize: - description: The block size to use for IP address assignments from - this pool. Defaults to 26 for IPv4 and 122 for IPv6. - type: integer - cidr: - description: The pool CIDR. - type: string - disableBGPExport: - description: 'Disable exporting routes from this IP Pool''s CIDR over - BGP. [Default: false]' - type: boolean - disabled: - description: When disabled is true, Calico IPAM will not assign addresses - from this pool. - type: boolean - ipip: - description: 'Deprecated: this field is only used for APIv1 backwards - compatibility. Setting this field is not allowed, this field is - for internal use only.' - properties: - enabled: - description: When enabled is true, ipip tunneling will be used - to deliver packets to destinations within this pool. - type: boolean - mode: - description: The IPIP mode. This can be one of "always" or "cross-subnet". A - mode of "always" will also use IPIP tunneling for routing to - destination IP addresses within this pool. A mode of "cross-subnet" - will only use IPIP tunneling when the destination node is on - a different subnet to the originating node. The default value - (if not specified) is "always". - type: string - type: object - ipipMode: - description: Contains configuration for IPIP tunneling for this pool. - If not specified, then this is defaulted to "Never" (i.e. IPIP tunneling - is disabled). - type: string - nat-outgoing: - description: 'Deprecated: this field is only used for APIv1 backwards - compatibility. Setting this field is not allowed, this field is - for internal use only.' - type: boolean - natOutgoing: - description: When nat-outgoing is true, packets sent from Calico networked - containers in this pool to destinations outside of this pool will - be masqueraded. - type: boolean - nodeSelector: - description: Allows IPPool to allocate for a specific node by label - selector. - type: string - vxlanMode: - description: Contains configuration for VXLAN tunneling for this pool. - If not specified, then this is defaulted to "Never" (i.e. VXLAN - tunneling is disabled). - type: string - required: - - cidr - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: (devel) - creationTimestamp: null - name: ipreservations.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: IPReservation - listKind: IPReservationList - plural: ipreservations - singular: ipreservation - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: IPReservationSpec contains the specification for an IPReservation - resource. - properties: - reservedCIDRs: - description: ReservedCIDRs is a list of CIDRs and/or IP addresses - that Calico IPAM will exclude from new allocations. - items: - type: string - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: kubecontrollersconfigurations.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: KubeControllersConfiguration - listKind: KubeControllersConfigurationList - plural: kubecontrollersconfigurations - singular: kubecontrollersconfiguration - preserveUnknownFields: false - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeControllersConfigurationSpec contains the values of the - Kubernetes controllers configuration. - properties: - controllers: - description: Controllers enables and configures individual Kubernetes - controllers - properties: - namespace: - description: Namespace enables and configures the namespace controller. - Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform reconciliation - with the Calico datastore. [Default: 5m]' - type: string - type: object - node: - description: Node enables and configures the node controller. - Enabled by default, set to nil to disable. - properties: - hostEndpoint: - description: HostEndpoint controls syncing nodes to host endpoints. - Disabled by default, set to nil to disable. - properties: - autoCreate: - description: 'AutoCreate enables automatic creation of - host endpoints for every node. [Default: Disabled]' - type: string - type: object - leakGracePeriod: - description: 'LeakGracePeriod is the period used by the controller - to determine if an IP address has been leaked. Set to 0 - to disable IP garbage collection. [Default: 15m]' - type: string - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform reconciliation - with the Calico datastore. [Default: 5m]' - type: string - syncLabels: - description: 'SyncLabels controls whether to copy Kubernetes - node labels to Calico nodes. [Default: Enabled]' - type: string - type: object - policy: - description: Policy enables and configures the policy controller. - Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform reconciliation - with the Calico datastore. [Default: 5m]' - type: string - type: object - serviceAccount: - description: ServiceAccount enables and configures the service - account controller. Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform reconciliation - with the Calico datastore. [Default: 5m]' - type: string - type: object - workloadEndpoint: - description: WorkloadEndpoint enables and configures the workload - endpoint controller. Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform reconciliation - with the Calico datastore. [Default: 5m]' - type: string - type: object - type: object - debugProfilePort: - description: DebugProfilePort configures the port to serve memory - and cpu profiles on. If not specified, profiling is disabled. - format: int32 - type: integer - etcdV3CompactionPeriod: - description: 'EtcdV3CompactionPeriod is the period between etcdv3 - compaction requests. Set to 0 to disable. [Default: 10m]' - type: string - healthChecks: - description: 'HealthChecks enables or disables support for health - checks [Default: Enabled]' - type: string - logSeverityScreen: - description: 'LogSeverityScreen is the log severity above which logs - are sent to the stdout. [Default: Info]' - type: string - prometheusMetricsPort: - description: 'PrometheusMetricsPort is the TCP port that the Prometheus - metrics server should bind to. Set to 0 to disable. [Default: 9094]' - type: integer - required: - - controllers - type: object - status: - description: KubeControllersConfigurationStatus represents the status - of the configuration. It's useful for admins to be able to see the actual - config that was applied, which can be modified by environment variables - on the kube-controllers process. - properties: - environmentVars: - additionalProperties: - type: string - description: EnvironmentVars contains the environment variables on - the kube-controllers that influenced the RunningConfig. - type: object - runningConfig: - description: RunningConfig contains the effective config that is running - in the kube-controllers pod, after merging the API resource with - any environment variables. - properties: - controllers: - description: Controllers enables and configures individual Kubernetes - controllers - properties: - namespace: - description: Namespace enables and configures the namespace - controller. Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform - reconciliation with the Calico datastore. [Default: - 5m]' - type: string - type: object - node: - description: Node enables and configures the node controller. - Enabled by default, set to nil to disable. - properties: - hostEndpoint: - description: HostEndpoint controls syncing nodes to host - endpoints. Disabled by default, set to nil to disable. - properties: - autoCreate: - description: 'AutoCreate enables automatic creation - of host endpoints for every node. [Default: Disabled]' - type: string - type: object - leakGracePeriod: - description: 'LeakGracePeriod is the period used by the - controller to determine if an IP address has been leaked. - Set to 0 to disable IP garbage collection. [Default: - 15m]' - type: string - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform - reconciliation with the Calico datastore. [Default: - 5m]' - type: string - syncLabels: - description: 'SyncLabels controls whether to copy Kubernetes - node labels to Calico nodes. [Default: Enabled]' - type: string - type: object - policy: - description: Policy enables and configures the policy controller. - Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform - reconciliation with the Calico datastore. [Default: - 5m]' - type: string - type: object - serviceAccount: - description: ServiceAccount enables and configures the service - account controller. Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform - reconciliation with the Calico datastore. [Default: - 5m]' - type: string - type: object - workloadEndpoint: - description: WorkloadEndpoint enables and configures the workload - endpoint controller. Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform - reconciliation with the Calico datastore. [Default: - 5m]' - type: string - type: object - type: object - debugProfilePort: - description: DebugProfilePort configures the port to serve memory - and cpu profiles on. If not specified, profiling is disabled. - format: int32 - type: integer - etcdV3CompactionPeriod: - description: 'EtcdV3CompactionPeriod is the period between etcdv3 - compaction requests. Set to 0 to disable. [Default: 10m]' - type: string - healthChecks: - description: 'HealthChecks enables or disables support for health - checks [Default: Enabled]' - type: string - logSeverityScreen: - description: 'LogSeverityScreen is the log severity above which - logs are sent to the stdout. [Default: Info]' - type: string - prometheusMetricsPort: - description: 'PrometheusMetricsPort is the TCP port that the Prometheus - metrics server should bind to. Set to 0 to disable. [Default: - 9094]' - type: integer - required: - - controllers - type: object - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: networkpolicies.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: NetworkPolicy - listKind: NetworkPolicyList - plural: networkpolicies - singular: networkpolicy - preserveUnknownFields: false - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - egress: - description: The ordered set of egress rules. Each rule contains - a set of packet match criteria and a corresponding action to apply. - items: - description: "A Rule encapsulates a set of match criteria and an - action. Both selector-based security Policy and security Profiles - reference rules - separated out as a list of rules for both ingress - and egress packet matching. \n Each positive match criteria has - a negated version, prefixed with \"Not\". All the match criteria - within a rule must be satisfied for a packet to match. A single - rule can contain the positive and negative version of a match - and both must be satisfied for the rule to match." - properties: - action: - type: string - destination: - description: Destination contains the match criteria that apply - to destination entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and another selector are defined on the same rule, then - only workload endpoints that are matched by both selectors - will be selected by the rule. \n For NetworkPolicy, an - empty NamespaceSelector implies that the Selector is limited - to selecting only workload endpoints in the same namespace - as the NetworkPolicy. \n For NetworkPolicy, `global()` - NamespaceSelector implies that the Selector is limited - to selecting only GlobalNetworkSet or HostEndpoint. \n - For GlobalNetworkPolicy, an empty NamespaceSelector implies - the Selector applies to workload endpoints across all - namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - services: - description: "Services is an optional field that contains - options for matching Kubernetes Services. If specified, - only traffic that originates from or terminates at endpoints - within the selected service(s) will be matched, and only - to/from each endpoint's port. \n Services cannot be specified - on the same rule as Selector, NotSelector, NamespaceSelector, - Nets, NotNets or ServiceAccounts. \n Ports and NotPorts - can only be specified with Services on ingress rules." - properties: - name: - description: Name specifies the name of a Kubernetes - Service to match. - type: string - namespace: - description: Namespace specifies the namespace of the - given Service. If left empty, the rule will match - within this policy's namespace. - type: string - type: object - type: object - http: - description: HTTP contains match criteria that apply to HTTP - requests. - properties: - methods: - description: Methods is an optional field that restricts - the rule to apply only to HTTP requests that use one of - the listed HTTP Methods (e.g. GET, PUT, etc.) Multiple - methods are OR'd together. - items: - type: string - type: array - paths: - description: 'Paths is an optional field that restricts - the rule to apply to HTTP requests that use one of the - listed HTTP Paths. Multiple paths are OR''d together. - e.g: - exact: /foo - prefix: /bar NOTE: Each entry may - ONLY specify either a `exact` or a `prefix` match. The - validator will check for it.' - items: - description: 'HTTPPath specifies an HTTP path to match. - It may be either of the form: exact: : which matches - the path exactly or prefix: : which matches - the path prefix' - properties: - exact: - type: string - prefix: - type: string - type: object - type: array - type: object - icmp: - description: ICMP is an optional field that restricts the rule - to apply to a specific type and code of ICMP traffic. This - should only be specified if the Protocol field is set to "ICMP" - or "ICMPv6". - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - ipVersion: - description: IPVersion is an optional field that restricts the - rule to only match a specific IP version. - type: integer - metadata: - description: Metadata contains additional information for this - rule - properties: - annotations: - additionalProperties: - type: string - description: Annotations is a set of key value pairs that - give extra information about the rule - type: object - type: object - notICMP: - description: NotICMP is the negated version of the ICMP field. - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - notProtocol: - anyOf: - - type: integer - - type: string - description: NotProtocol is the negated version of the Protocol - field. - pattern: ^.* - x-kubernetes-int-or-string: true - protocol: - anyOf: - - type: integer - - type: string - description: "Protocol is an optional field that restricts the - rule to only apply to traffic of a specific IP protocol. Required - if any of the EntityRules contain Ports (because ports only - apply to certain protocols). \n Must be one of these string - values: \"TCP\", \"UDP\", \"ICMP\", \"ICMPv6\", \"SCTP\", - \"UDPLite\" or an integer in the range 1-255." - pattern: ^.* - x-kubernetes-int-or-string: true - source: - description: Source contains the match criteria that apply to - source entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and another selector are defined on the same rule, then - only workload endpoints that are matched by both selectors - will be selected by the rule. \n For NetworkPolicy, an - empty NamespaceSelector implies that the Selector is limited - to selecting only workload endpoints in the same namespace - as the NetworkPolicy. \n For NetworkPolicy, `global()` - NamespaceSelector implies that the Selector is limited - to selecting only GlobalNetworkSet or HostEndpoint. \n - For GlobalNetworkPolicy, an empty NamespaceSelector implies - the Selector applies to workload endpoints across all - namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - services: - description: "Services is an optional field that contains - options for matching Kubernetes Services. If specified, - only traffic that originates from or terminates at endpoints - within the selected service(s) will be matched, and only - to/from each endpoint's port. \n Services cannot be specified - on the same rule as Selector, NotSelector, NamespaceSelector, - Nets, NotNets or ServiceAccounts. \n Ports and NotPorts - can only be specified with Services on ingress rules." - properties: - name: - description: Name specifies the name of a Kubernetes - Service to match. - type: string - namespace: - description: Namespace specifies the namespace of the - given Service. If left empty, the rule will match - within this policy's namespace. - type: string - type: object - type: object - required: - - action - type: object - type: array - ingress: - description: The ordered set of ingress rules. Each rule contains - a set of packet match criteria and a corresponding action to apply. - items: - description: "A Rule encapsulates a set of match criteria and an - action. Both selector-based security Policy and security Profiles - reference rules - separated out as a list of rules for both ingress - and egress packet matching. \n Each positive match criteria has - a negated version, prefixed with \"Not\". All the match criteria - within a rule must be satisfied for a packet to match. A single - rule can contain the positive and negative version of a match - and both must be satisfied for the rule to match." - properties: - action: - type: string - destination: - description: Destination contains the match criteria that apply - to destination entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and another selector are defined on the same rule, then - only workload endpoints that are matched by both selectors - will be selected by the rule. \n For NetworkPolicy, an - empty NamespaceSelector implies that the Selector is limited - to selecting only workload endpoints in the same namespace - as the NetworkPolicy. \n For NetworkPolicy, `global()` - NamespaceSelector implies that the Selector is limited - to selecting only GlobalNetworkSet or HostEndpoint. \n - For GlobalNetworkPolicy, an empty NamespaceSelector implies - the Selector applies to workload endpoints across all - namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - services: - description: "Services is an optional field that contains - options for matching Kubernetes Services. If specified, - only traffic that originates from or terminates at endpoints - within the selected service(s) will be matched, and only - to/from each endpoint's port. \n Services cannot be specified - on the same rule as Selector, NotSelector, NamespaceSelector, - Nets, NotNets or ServiceAccounts. \n Ports and NotPorts - can only be specified with Services on ingress rules." - properties: - name: - description: Name specifies the name of a Kubernetes - Service to match. - type: string - namespace: - description: Namespace specifies the namespace of the - given Service. If left empty, the rule will match - within this policy's namespace. - type: string - type: object - type: object - http: - description: HTTP contains match criteria that apply to HTTP - requests. - properties: - methods: - description: Methods is an optional field that restricts - the rule to apply only to HTTP requests that use one of - the listed HTTP Methods (e.g. GET, PUT, etc.) Multiple - methods are OR'd together. - items: - type: string - type: array - paths: - description: 'Paths is an optional field that restricts - the rule to apply to HTTP requests that use one of the - listed HTTP Paths. Multiple paths are OR''d together. - e.g: - exact: /foo - prefix: /bar NOTE: Each entry may - ONLY specify either a `exact` or a `prefix` match. The - validator will check for it.' - items: - description: 'HTTPPath specifies an HTTP path to match. - It may be either of the form: exact: : which matches - the path exactly or prefix: : which matches - the path prefix' - properties: - exact: - type: string - prefix: - type: string - type: object - type: array - type: object - icmp: - description: ICMP is an optional field that restricts the rule - to apply to a specific type and code of ICMP traffic. This - should only be specified if the Protocol field is set to "ICMP" - or "ICMPv6". - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - ipVersion: - description: IPVersion is an optional field that restricts the - rule to only match a specific IP version. - type: integer - metadata: - description: Metadata contains additional information for this - rule - properties: - annotations: - additionalProperties: - type: string - description: Annotations is a set of key value pairs that - give extra information about the rule - type: object - type: object - notICMP: - description: NotICMP is the negated version of the ICMP field. - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - notProtocol: - anyOf: - - type: integer - - type: string - description: NotProtocol is the negated version of the Protocol - field. - pattern: ^.* - x-kubernetes-int-or-string: true - protocol: - anyOf: - - type: integer - - type: string - description: "Protocol is an optional field that restricts the - rule to only apply to traffic of a specific IP protocol. Required - if any of the EntityRules contain Ports (because ports only - apply to certain protocols). \n Must be one of these string - values: \"TCP\", \"UDP\", \"ICMP\", \"ICMPv6\", \"SCTP\", - \"UDPLite\" or an integer in the range 1-255." - pattern: ^.* - x-kubernetes-int-or-string: true - source: - description: Source contains the match criteria that apply to - source entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and another selector are defined on the same rule, then - only workload endpoints that are matched by both selectors - will be selected by the rule. \n For NetworkPolicy, an - empty NamespaceSelector implies that the Selector is limited - to selecting only workload endpoints in the same namespace - as the NetworkPolicy. \n For NetworkPolicy, `global()` - NamespaceSelector implies that the Selector is limited - to selecting only GlobalNetworkSet or HostEndpoint. \n - For GlobalNetworkPolicy, an empty NamespaceSelector implies - the Selector applies to workload endpoints across all - namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - services: - description: "Services is an optional field that contains - options for matching Kubernetes Services. If specified, - only traffic that originates from or terminates at endpoints - within the selected service(s) will be matched, and only - to/from each endpoint's port. \n Services cannot be specified - on the same rule as Selector, NotSelector, NamespaceSelector, - Nets, NotNets or ServiceAccounts. \n Ports and NotPorts - can only be specified with Services on ingress rules." - properties: - name: - description: Name specifies the name of a Kubernetes - Service to match. - type: string - namespace: - description: Namespace specifies the namespace of the - given Service. If left empty, the rule will match - within this policy's namespace. - type: string - type: object - type: object - required: - - action - type: object - type: array - order: - description: Order is an optional field that specifies the order in - which the policy is applied. Policies with higher "order" are applied - after those with lower order. If the order is omitted, it may be - considered to be "infinite" - i.e. the policy will be applied last. Policies - with identical order will be applied in alphanumerical order based - on the Policy "Name". - type: number - selector: - description: "The selector is an expression used to pick pick out - the endpoints that the policy should be applied to. \n Selector - expressions follow this syntax: \n \tlabel == \"string_literal\" - \ -> comparison, e.g. my_label == \"foo bar\" \tlabel != \"string_literal\" - \ -> not equal; also matches if label is not present \tlabel in - { \"a\", \"b\", \"c\", ... } -> true if the value of label X is - one of \"a\", \"b\", \"c\" \tlabel not in { \"a\", \"b\", \"c\", - ... } -> true if the value of label X is not one of \"a\", \"b\", - \"c\" \thas(label_name) -> True if that label is present \t! expr - -> negation of expr \texpr && expr -> Short-circuit and \texpr - || expr -> Short-circuit or \t( expr ) -> parens for grouping \tall() - or the empty selector -> matches all endpoints. \n Label names are - allowed to contain alphanumerics, -, _ and /. String literals are - more permissive but they do not support escape characters. \n Examples - (with made-up labels): \n \ttype == \"webserver\" && deployment - == \"prod\" \ttype in {\"frontend\", \"backend\"} \tdeployment != - \"dev\" \t! has(label_name)" - type: string - serviceAccountSelector: - description: ServiceAccountSelector is an optional field for an expression - used to select a pod based on service accounts. - type: string - types: - description: "Types indicates whether this policy applies to ingress, - or to egress, or to both. When not explicitly specified (and so - the value on creation is empty or nil), Calico defaults Types according - to what Ingress and Egress are present in the policy. The default - is: \n - [ PolicyTypeIngress ], if there are no Egress rules (including - the case where there are also no Ingress rules) \n - [ PolicyTypeEgress - ], if there are Egress rules but no Ingress rules \n - [ PolicyTypeIngress, - PolicyTypeEgress ], if there are both Ingress and Egress rules. - \n When the policy is read back again, Types will always be one - of these values, never empty or nil." - items: - description: PolicyType enumerates the possible values of the PolicySpec - Types field. - type: string - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/kdd-crds.yaml -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: networksets.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: NetworkSet - listKind: NetworkSetList - plural: networksets - singular: networkset - preserveUnknownFields: false - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: NetworkSet is the Namespaced-equivalent of the GlobalNetworkSet. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: NetworkSetSpec contains the specification for a NetworkSet - resource. - properties: - nets: - description: The list of IP networks that belong to this set. - items: - type: string - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -# Source: calico/templates/calico-kube-controllers-rbac.yaml -# Include a clusterrole for the kube-controllers component, -# and bind it to the calico-kube-controllers serviceaccount. -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: calico-kube-controllers -rules: - # Nodes are watched to monitor for deletions. - - apiGroups: [""] - resources: - - nodes - verbs: - - watch - - list - - get - # Pods are watched to check for existence as part of IPAM controller. - - apiGroups: [""] - resources: - - pods - verbs: - - get - - list - - watch - # IPAM resources are manipulated in response to node and block updates, as well as periodic triggers. - - apiGroups: ["crd.projectcalico.org"] - resources: - - ipreservations - verbs: - - list - - apiGroups: ["crd.projectcalico.org"] - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - - watch - # Pools are watched to maintain a mapping of blocks to IP pools. - - apiGroups: ["crd.projectcalico.org"] - resources: - - ippools - verbs: - - list - - watch - # kube-controllers manages hostendpoints. - - apiGroups: ["crd.projectcalico.org"] - resources: - - hostendpoints - verbs: - - get - - list - - create - - update - - delete - # Needs access to update clusterinformations. - - apiGroups: ["crd.projectcalico.org"] - resources: - - clusterinformations - verbs: - - get - - list - - create - - update - - watch - # KubeControllersConfiguration is where it gets its config - - apiGroups: ["crd.projectcalico.org"] - resources: - - kubecontrollersconfigurations - verbs: - # read its own config - - get - # create a default if none exists - - create - # update status - - update - # watch for changes - - watch ---- -# Source: calico/templates/calico-node-rbac.yaml -# Include a clusterrole for the calico-node DaemonSet, -# and bind it to the calico-node serviceaccount. -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: calico-node -rules: - # Used for creating service account tokens to be used by the CNI plugin - - apiGroups: [""] - resources: - - serviceaccounts/token - resourceNames: - - calico-node - verbs: - - create - # The CNI plugin needs to get pods, nodes, and namespaces. - - apiGroups: [""] - resources: - - pods - - nodes - - namespaces - verbs: - - get - # EndpointSlices are used for Service-based network policy rule - # enforcement. - - apiGroups: ["discovery.k8s.io"] - resources: - - endpointslices - verbs: - - watch - - list - - apiGroups: [""] - resources: - - endpoints - - services - verbs: - # Used to discover service IPs for advertisement. - - watch - - list - # Used to discover Typhas. - - get - # Pod CIDR auto-detection on kubeadm needs access to config maps. - - apiGroups: [""] - resources: - - configmaps - verbs: - - get - - apiGroups: [""] - resources: - - nodes/status - verbs: - # Needed for clearing NodeNetworkUnavailable flag. - - patch - # Calico stores some configuration information in node annotations. - - update - # Watch for changes to Kubernetes NetworkPolicies. - - apiGroups: ["networking.k8s.io"] - resources: - - networkpolicies - verbs: - - watch - - list - # Used by Calico for policy information. - - apiGroups: [""] - resources: - - pods - - namespaces - - serviceaccounts - verbs: - - list - - watch - # The CNI plugin patches pods/status. - - apiGroups: [""] - resources: - - pods/status - verbs: - - patch - # Calico monitors various CRDs for config. - - apiGroups: ["crd.projectcalico.org"] - resources: - - globalfelixconfigs - - felixconfigurations - - bgppeers - - globalbgpconfigs - - bgpconfigurations - - ippools - - ipreservations - - ipamblocks - - globalnetworkpolicies - - globalnetworksets - - networkpolicies - - networksets - - clusterinformations - - hostendpoints - - blockaffinities - - caliconodestatuses - verbs: - - get - - list - - watch - # Calico must create and update some CRDs on startup. - - apiGroups: ["crd.projectcalico.org"] - resources: - - ippools - - felixconfigurations - - clusterinformations - verbs: - - create - - update - # Calico must update some CRDs. - - apiGroups: [ "crd.projectcalico.org" ] - resources: - - caliconodestatuses - verbs: - - update - # Calico stores some configuration information on the node. - - apiGroups: [""] - resources: - - nodes - verbs: - - get - - list - - watch - # These permissions are only required for upgrade from v2.6, and can - # be removed after upgrade or on fresh installations. - - apiGroups: ["crd.projectcalico.org"] - resources: - - bgpconfigurations - - bgppeers - verbs: - - create - - update - # These permissions are required for Calico CNI to perform IPAM allocations. - - apiGroups: ["crd.projectcalico.org"] - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - # The CNI plugin and calico/node need to be able to create a default - # IPAMConfiguration - - apiGroups: ["crd.projectcalico.org"] - resources: - - ipamconfigs - verbs: - - get - - create - # Block affinities must also be watchable by confd for route aggregation. - - apiGroups: ["crd.projectcalico.org"] - resources: - - blockaffinities - verbs: - - watch - # The Calico IPAM migration needs to get daemonsets. These permissions can be - # removed if not upgrading from an installation using host-local IPAM. - - apiGroups: ["apps"] - resources: - - daemonsets - verbs: - - get ---- -# Source: calico/templates/calico-kube-controllers-rbac.yaml -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: calico-kube-controllers -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-kube-controllers -subjects: -- kind: ServiceAccount - name: calico-kube-controllers - namespace: kube-system ---- -# Source: calico/templates/calico-node-rbac.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: calico-node -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-node -subjects: -- kind: ServiceAccount - name: calico-node - namespace: kube-system ---- -# Source: calico/templates/calico-node.yaml -# This manifest installs the calico-node container, as well -# as the CNI plugins and network config on -# each master and worker node in a Kubernetes cluster. -kind: DaemonSet -apiVersion: apps/v1 -metadata: - name: calico-node - namespace: kube-system - labels: - k8s-app: calico-node -spec: - selector: - matchLabels: - k8s-app: calico-node - updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 1 - template: - metadata: - labels: - k8s-app: calico-node - spec: - nodeSelector: - kubernetes.io/os: linux - hostNetwork: true - tolerations: - # Make sure calico-node gets scheduled on all nodes. - - effect: NoSchedule - operator: Exists - # Mark the pod as a critical add-on for rescheduling. - - key: CriticalAddonsOnly - operator: Exists - - effect: NoExecute - operator: Exists - serviceAccountName: calico-node - # Minimize downtime during a rolling upgrade or deletion; tell Kubernetes to do a "force - # deletion": https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods. - terminationGracePeriodSeconds: 0 - priorityClassName: system-node-critical - initContainers: - # This container performs upgrade from host-local IPAM to calico-ipam. - # It can be deleted if this is a fresh installation, or if you have already - # upgraded to use calico-ipam. - - name: upgrade-ipam - image: docker.io/calico/cni:v3.24.1 - imagePullPolicy: IfNotPresent - command: ["/opt/cni/bin/calico-ipam", "-upgrade"] - envFrom: - - configMapRef: - # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode. - name: kubernetes-services-endpoint - optional: true - env: - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - volumeMounts: - - mountPath: /var/lib/cni/networks - name: host-local-net-dir - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - securityContext: - privileged: true - # This container installs the CNI binaries - # and CNI network config file on each node. - - name: install-cni - image: docker.io/calico/cni:v3.24.1 - imagePullPolicy: IfNotPresent - command: ["/opt/cni/bin/install"] - envFrom: - - configMapRef: - # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode. - name: kubernetes-services-endpoint - optional: true - env: - # Name of the CNI config file to create. - - name: CNI_CONF_NAME - value: "10-calico.conflist" - # The CNI network config to install on each node. - - name: CNI_NETWORK_CONFIG - valueFrom: - configMapKeyRef: - name: calico-config - key: cni_network_config - # Set the hostname based on the k8s node name. - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - # CNI MTU Config variable - - name: CNI_MTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - # Prevents the container from sleeping forever. - - name: SLEEP - value: "false" - volumeMounts: - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - - mountPath: /host/etc/cni/net.d - name: cni-net-dir - securityContext: - privileged: true - # This init container mounts the necessary filesystems needed by the BPF data plane - # i.e. bpf at /sys/fs/bpf and cgroup2 at /run/calico/cgroup. Calico-node initialisation is executed - # in best effort fashion, i.e. no failure for errors, to not disrupt pod creation in iptable mode. - - name: "mount-bpffs" - image: docker.io/calico/node:v3.24.1 - imagePullPolicy: IfNotPresent - command: ["calico-node", "-init", "-best-effort"] - volumeMounts: - - mountPath: /sys/fs - name: sys-fs - # Bidirectional is required to ensure that the new mount we make at /sys/fs/bpf propagates to the host - # so that it outlives the init container. - mountPropagation: Bidirectional - - mountPath: /var/run/calico - name: var-run-calico - # Bidirectional is required to ensure that the new mount we make at /run/calico/cgroup propagates to the host - # so that it outlives the init container. - mountPropagation: Bidirectional - # Mount /proc/ from host which usually is an init program at /nodeproc. It's needed by mountns binary, - # executed by calico-node, to mount root cgroup2 fs at /run/calico/cgroup to attach CTLB programs correctly. - - mountPath: /nodeproc - name: nodeproc - readOnly: true - securityContext: - privileged: true - containers: - # Runs calico-node container on each Kubernetes node. This - # container programs network policy and routes on each - # host. - - name: calico-node - image: docker.io/calico/node:v3.24.1 - imagePullPolicy: IfNotPresent - envFrom: - - configMapRef: - # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode. - name: kubernetes-services-endpoint - optional: true - env: - # Use Kubernetes API as the backing datastore. - - name: DATASTORE_TYPE - value: "kubernetes" - # Wait for the datastore. - - name: WAIT_FOR_DATASTORE - value: "true" - # Set based on the k8s node name. - - name: NODENAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - # Choose the backend to use. - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - # Cluster type to identify the deployment type - - name: CLUSTER_TYPE - value: "k8s,bgp" - # Auto-detect the BGP IP address. - - name: IP - value: "autodetect" - # Enable IPIP - - name: CALICO_IPV4POOL_IPIP - value: "Always" - # Enable or Disable VXLAN on the default IP pool. - - name: CALICO_IPV4POOL_VXLAN - value: "Never" - # Enable or Disable VXLAN on the default IPv6 IP pool. - - name: CALICO_IPV6POOL_VXLAN - value: "Never" - # Set MTU for tunnel device used if ipip is enabled - - name: FELIX_IPINIPMTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - # Set MTU for the VXLAN tunnel device. - - name: FELIX_VXLANMTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - # Set MTU for the Wireguard tunnel device. - - name: FELIX_WIREGUARDMTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - # The default IPv4 pool to create on startup if none exists. Pod IPs will be - # chosen from this range. Changing this value after installation will have - # no effect. This should fall within `--cluster-cidr`. - # - name: CALICO_IPV4POOL_CIDR - # value: "192.168.0.0/16" - # Disable file logging so `kubectl logs` works. - - name: CALICO_DISABLE_FILE_LOGGING - value: "true" - # Set Felix endpoint to host default action to ACCEPT. - - name: FELIX_DEFAULTENDPOINTTOHOSTACTION - value: "ACCEPT" - # Disable IPv6 on Kubernetes. - - name: FELIX_IPV6SUPPORT - value: "false" - - name: FELIX_HEALTHENABLED - value: "true" - securityContext: - privileged: true - resources: - requests: - cpu: 250m - lifecycle: - preStop: - exec: - command: - - /bin/calico-node - - -shutdown - livenessProbe: - exec: - command: - - /bin/calico-node - - -felix-live - - -bird-live - periodSeconds: 10 - initialDelaySeconds: 10 - failureThreshold: 6 - timeoutSeconds: 10 - readinessProbe: - exec: - command: - - /bin/calico-node - - -felix-ready - - -bird-ready - periodSeconds: 10 - timeoutSeconds: 10 - volumeMounts: - # For maintaining CNI plugin API credentials. - - mountPath: /host/etc/cni/net.d - name: cni-net-dir - readOnly: false - - mountPath: /lib/modules - name: lib-modules - readOnly: true - - mountPath: /run/xtables.lock - name: xtables-lock - readOnly: false - - mountPath: /var/run/calico - name: var-run-calico - readOnly: false - - mountPath: /var/lib/calico - name: var-lib-calico - readOnly: false - - name: policysync - mountPath: /var/run/nodeagent - # For eBPF mode, we need to be able to mount the BPF filesystem at /sys/fs/bpf so we mount in the - # parent directory. - - name: bpffs - mountPath: /sys/fs/bpf - - name: cni-log-dir - mountPath: /var/log/calico/cni - readOnly: true - volumes: - # Used by calico-node. - - name: lib-modules - hostPath: - path: /lib/modules - - name: var-run-calico - hostPath: - path: /var/run/calico - - name: var-lib-calico - hostPath: - path: /var/lib/calico - - name: xtables-lock - hostPath: - path: /run/xtables.lock - type: FileOrCreate - - name: sys-fs - hostPath: - path: /sys/fs/ - type: DirectoryOrCreate - - name: bpffs - hostPath: - path: /sys/fs/bpf - type: Directory - # mount /proc at /nodeproc to be used by mount-bpffs initContainer to mount root cgroup2 fs. - - name: nodeproc - hostPath: - path: /proc - # Used to install CNI. - - name: cni-bin-dir - hostPath: - path: /opt/cni/bin - - name: cni-net-dir - hostPath: - path: /etc/cni/net.d - # Used to access CNI logs. - - name: cni-log-dir - hostPath: - path: /var/log/calico/cni - # Mount in the directory for host-local IPAM allocations. This is - # used when upgrading from host-local to calico-ipam, and can be removed - # if not using the upgrade-ipam init container. - - name: host-local-net-dir - hostPath: - path: /var/lib/cni/networks - # Used to create per-pod Unix Domain Sockets - - name: policysync - hostPath: - type: DirectoryOrCreate - path: /var/run/nodeagent ---- -# Source: calico/templates/calico-kube-controllers.yaml -# See https://github.com/projectcalico/kube-controllers -apiVersion: apps/v1 -kind: Deployment -metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers -spec: - # The controllers can only have a single active instance. - replicas: 1 - selector: - matchLabels: - k8s-app: calico-kube-controllers - strategy: - type: Recreate - template: - metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers - spec: - nodeSelector: - kubernetes.io/os: linux - tolerations: - # Mark the pod as a critical add-on for rescheduling. - - key: CriticalAddonsOnly - operator: Exists - - key: node-role.kubernetes.io/master - effect: NoSchedule - - key: node-role.kubernetes.io/control-plane - effect: NoSchedule - serviceAccountName: calico-kube-controllers - priorityClassName: system-cluster-critical - containers: - - name: calico-kube-controllers - image: docker.io/calico/kube-controllers:v3.24.1 - imagePullPolicy: IfNotPresent - env: - # Choose which controllers to run. - - name: ENABLED_CONTROLLERS - value: node - - name: DATASTORE_TYPE - value: kubernetes - livenessProbe: - exec: - command: - - /usr/bin/check-status - - -l - periodSeconds: 10 - initialDelaySeconds: 10 - failureThreshold: 6 - timeoutSeconds: 10 - readinessProbe: - exec: - command: - - /usr/bin/check-status - - -r - periodSeconds: 10 diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/values.star b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/values.star deleted file mode 100644 index b5032ec35a..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/values.star +++ /dev/null @@ -1,12 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:assert", "assert") - -def validate_calico(): - data.values.infraProvider or assert.fail("Infrastructure provider should be provided") -end - -#export -values = data.values - -# validate -validate_calico() diff --git a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/values.yaml b/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/values.yaml deleted file mode 100644 index b723fbf843..0000000000 --- a/providers/ytt/vendir/cni/_ytt_lib/addons/packages/calico/3.24.1/bundle/config/values.yaml +++ /dev/null @@ -1,19 +0,0 @@ -#@data/values ---- - -infraProvider: vsphere -nodeSelector: null -deployment: - updateStrategy: null - rollingUpdate: - maxUnavailable: null - maxSurge: null -daemonset: - updateStrategy: null -ipFamily: null -calico: - config: - clusterCIDR: null - #! "0" as default means MTU will be auto detected - vethMTU: "0" - skipCNIBinaries: false diff --git a/providers/ytt/vendir/cni/cni.lib.yaml b/providers/ytt/vendir/cni/cni.lib.yaml deleted file mode 100644 index 67fb0c3265..0000000000 --- a/providers/ytt/vendir/cni/cni.lib.yaml +++ /dev/null @@ -1,4 +0,0 @@ -#@ load("@ytt:library", "library") - -#@ cni_antrea_lib = library.get("addons/packages/antrea/1.9.0/bundle/config") -#@ cni_calico_lib = library.get("addons/packages/calico/3.24.1/bundle/config") diff --git a/providers/ytt/vendir/kapp-controller/_ytt_lib/LICENSE b/providers/ytt/vendir/kapp-controller/_ytt_lib/LICENSE deleted file mode 100644 index 68c771a099..0000000000 --- a/providers/ytt/vendir/kapp-controller/_ytt_lib/LICENSE +++ /dev/null @@ -1,176 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - diff --git a/providers/ytt/vendir/kapp-controller/_ytt_lib/NOTICE b/providers/ytt/vendir/kapp-controller/_ytt_lib/NOTICE deleted file mode 100644 index df374c7ac0..0000000000 --- a/providers/ytt/vendir/kapp-controller/_ytt_lib/NOTICE +++ /dev/null @@ -1,182 +0,0 @@ -Tanzu Community Edition -Copyright 2020 VMware, Inc. - -The Apache 2.0 license (the "License") set forth below applies to all parts of the Tanzu Community Edition project. You may not use this file except in compliance with the License. - -Apache License - -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, -and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the -copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other -entities that control, are controlled by, or are under common control -with that entity. For the purposes of this definition, "control" means -(i) the power, direct or indirect, to cause the direction or management -of such entity, whether by contract or otherwise, or (ii) ownership -of fifty percent (50%) or more of the outstanding shares, or (iii) -beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation source, -and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation -or translation of a Source form, including but not limited to compiled -object code, generated documentation, and conversions to other media -types. - -"Work" shall mean the work of authorship, whether in Source or -Object form, made available under the License, as indicated by a copyright -notice that is included in or attached to the work (an example is provided -in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, -that is based on (or derived from) the Work and for which the editorial -revisions, annotations, elaborations, or other modifications represent, -as a whole, an original work of authorship. For the purposes of this -License, Derivative Works shall not include works that remain separable -from, or merely link (or bind by name) to the interfaces of, the Work -and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the -original version of the Work and any modifications or additions to -that Work or Derivative Works thereof, that is intentionally submitted -to Licensor for inclusion in the Work by the copyright owner or by an -individual or Legal Entity authorized to submit on behalf of the copyright -owner. For the purposes of this definition, "submitted" means any form of -electronic, verbal, or written communication sent to the Licensor or its -representatives, including but not limited to communication on electronic -mailing lists, source code control systems, and issue tracking systems -that are managed by, or on behalf of, the Licensor for the purpose of -discussing and improving the Work, but excluding communication that is -conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity -on behalf of whom a Contribution has been received by Licensor and -subsequently incorporated within the Work. - -2. Grant of Copyright License. -Subject to the terms and conditions of this License, each Contributor -hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable copyright license to reproduce, prepare -Derivative Works of, publicly display, publicly perform, sublicense, and -distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. -Subject to the terms and conditions of this License, each Contributor -hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty- free, irrevocable (except as stated in this section) patent -license to make, have made, use, offer to sell, sell, import, and -otherwise transfer the Work, where such license applies only to those -patent claims licensable by such Contributor that are necessarily -infringed by their Contribution(s) alone or by combination of -their Contribution(s) with the Work to which such Contribution(s) -was submitted. If You institute patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Work or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses granted -to You under this License for that Work shall terminate as of the date -such litigation is filed. - -4. Redistribution. -You may reproduce and distribute copies of the Work or Derivative Works -thereof in any medium, with or without modifications, and in Source or -Object form, provided that You meet the following conditions: - - a. You must give any other recipients of the Work or Derivative Works - a copy of this License; and - - b. You must cause any modified files to carry prominent notices stating - that You changed the files; and - - c. You must retain, in the Source form of any Derivative Works that - You distribute, all copyright, patent, trademark, and attribution - notices from the Source form of the Work, excluding those notices - that do not pertain to any part of the Derivative Works; and - - d. If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one of - the following places: within a NOTICE text file distributed as part - of the Derivative Works; within the Source form or documentation, - if provided along with the Derivative Works; or, within a display - generated by the Derivative Works, if and wherever such third-party - notices normally appear. The contents of the NOTICE file are for - informational purposes only and do not modify the License. You - may add Your own attribution notices within Derivative Works that - You distribute, alongside or as an addendum to the NOTICE text - from the Work, provided that such additional attribution notices - cannot be construed as modifying the License. You may add Your own - copyright statement to Your modifications and may provide additional - or different license terms and conditions for use, reproduction, or - distribution of Your modifications, or for any such Derivative Works - as a whole, provided Your use, reproduction, and distribution of the - Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. -Unless You explicitly state otherwise, any Contribution intentionally -submitted for inclusion in the Work by You to the Licensor shall be -under the terms and conditions of this License, without any additional -terms or conditions. Notwithstanding the above, nothing herein shall -supersede or modify the terms of any separate license agreement you may -have executed with Licensor regarding such Contributions. - -6. Trademarks. -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. -Unless required by applicable law or agreed to in writing, Licensor -provides the Work (and each Contributor provides its Contributions) on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either -express or implied, including, without limitation, any warranties or -conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR -A PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any risks -associated with Your exercise of permissions under this License. - -8. Limitation of Liability. -In no event and under no legal theory, whether in tort (including -negligence), contract, or otherwise, unless required by applicable law -(such as deliberate and grossly negligent acts) or agreed to in writing, -shall any Contributor be liable to You for damages, including any direct, -indirect, special, incidental, or consequential damages of any character -arising as a result of this License or out of the use or inability to -use the Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all other -commercial damages or losses), even if such Contributor has been advised -of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. -While redistributing the Work or Derivative Works thereof, You may -choose to offer, and charge a fee for, acceptance of support, warranty, -indemnity, or other liability obligations and/or rights consistent with -this License. However, in accepting such obligations, You may act only -on Your own behalf and on Your sole responsibility, not on behalf of -any other Contributor, and only if You agree to indemnify, defend, and -hold each Contributor harmless for any liability incurred by, or claims -asserted against, such Contributor by reason of your accepting any such -warranty or additional liability. - -END OF TERMS AND CONDITIONS - - - diff --git a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/change-namespace.yaml b/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/change-namespace.yaml deleted file mode 100644 index c8baac716e..0000000000 --- a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/change-namespace.yaml +++ /dev/null @@ -1,64 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("/values.star", "values", "kappNamespace") -#@ load("@ytt:yaml", "yaml") - -#@ if values.kappController.createNamespace: -#@overlay/match by=overlay.subset({"kind":"Namespace","metadata":{"name": "kapp-controller"}}),expects="1+" ---- -metadata: - name: #@ kappNamespace -#@ else: -#@overlay/match by=overlay.subset({"kind":"Namespace","metadata":{"name": "kapp-controller"}}),expects="1+" -#@overlay/remove ---- -#@ end - -#@overlay/match by=overlay.subset({"kind": "ServiceAccount","metadata": {"name": "kapp-controller-sa"}}),expects="1+" ---- -metadata: - namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind": "ClusterRoleBinding","metadata": {"name": "kapp-controller-cluster-role-binding"}}),expects="1+" ---- -subjects: -#@overlay/match by=overlay.subset({"kind": "ServiceAccount"}),expects="1+" -- namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind": "ClusterRoleBinding","metadata": {"name": "pkg-apiserver:system:auth-delegator"}}),expects="1+" ---- -subjects: -#@overlay/match by=overlay.subset({"kind": "ServiceAccount"}),expects="1+" -- namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind": "RoleBinding","metadata": {"name": "pkgserver-auth-reader"}}),expects="1+" ---- -subjects: -#@overlay/match by=overlay.subset({"kind": "ServiceAccount"}),expects="1+" -- namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "kapp-controller"}}) ---- -metadata: - namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind":"Service","metadata":{"name": "packaging-api"}}) ---- -metadata: - namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind":"APIService","metadata":{"name": "v1alpha1.data.packaging.carvel.dev"}}) ---- -spec: - service: - namespace: #@ kappNamespace - -#@ if values.kappController.createNamespace: -#@overlay/match by=overlay.subset({"kind":"Namespace","metadata":{"name": "kapp-controller-packaging-global"}}),expects=1 ---- -metadata: - name: #@ values.kappController.globalNamespace -#@ else: -#@overlay/match by=overlay.subset({"kind":"Namespace","metadata":{"name": "kapp-controller-packaging-global"}}),expects=1 -#@overlay/remove ---- -#@ end diff --git a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-configmap.yaml b/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-configmap.yaml deleted file mode 100644 index f5f0e26f36..0000000000 --- a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-configmap.yaml +++ /dev/null @@ -1,17 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("/values.star", "values", "kappNamespace") - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "kapp-controller"}}) -#@overlay/insert before=True ---- -#! This optional ConfigMap must be created before the kapp-controller pod launches in order to read it. -apiVersion: v1 -kind: ConfigMap -metadata: - #! Name must be `kapp-controller-config` for kapp controller to pick it up - name: kapp-controller-config - #! Namespace must match the namespace kapp-controller is deployed to - namespace: #@ kappNamespace - annotations: - kapp.k14s.io/change-group: "apps.kappctrl.k14s.io/kapp-controller-config" -data: #@ values.kappController.config diff --git a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-crds.yaml b/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-crds.yaml deleted file mode 100644 index 63fee7c920..0000000000 --- a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-crds.yaml +++ /dev/null @@ -1,9 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("/values.star", "values") - -#@overlay/match by=overlay.subset({"kind":"CustomResourceDefinition","metadata":{"name": "packagerepositories.packaging.carvel.dev"}}) ---- -metadata: - annotations: - #@overlay/match missing_ok=True - packaging.carvel.dev/global-namespace: #@ values.kappController.globalNamespace diff --git a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-deployment.yaml b/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-deployment.yaml deleted file mode 100644 index 2dfa58e529..0000000000 --- a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-deployment.yaml +++ /dev/null @@ -1,87 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("/values.star", "values", "generateBashCmdForDNS") -#@ load("@ytt:yaml", "yaml") - -#@ def is_toleration_specified(toleration): -#@ return toleration in yaml.decode(yaml.encode(values.kappController.deployment.tolerations)) -#@ end - -#@ default_tolerations = [] -#@ is_master_specified = is_toleration_specified({"effect":"NoSchedule", "key":"node-role.kubernetes.io/master"}) -#@ is_control_specified = is_toleration_specified({"effect":"NoSchedule", "key":"node-role.kubernetes.io/control-plane"}) - -#@ if is_master_specified and not is_control_specified: -#@ default_tolerations += [{"effect":"NoSchedule", "key":"node-role.kubernetes.io/control-plane"}] -#@ end - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "kapp-controller"}}) ---- -metadata: - annotations: - #@overlay/match missing_ok=True - kapp.k14s.io/change-rule: "upsert after upserting apps.kappctrl.k14s.io/kapp-controller-config" -spec: - template: - #@overlay/match-child-defaults missing_ok=True - spec: - containers: - #@overlay/match by=overlay.subset({"name":"kapp-controller"}) - - args: - #@overlay/match by=overlay.subset("-packaging-global-namespace=kapp-controller-packaging-global") - - #@ "-packaging-global-namespace={}".format(values.kappController.globalNamespace) - #@overlay/match by=overlay.subset("-tls-cipher-suites=") - - #@ "-tls-cipher-suites={}".format(values.kappController.deployment.tlsCipherSuites) - #@overlay/append - - #@ "-concurrency={}".format(values.kappController.deployment.concurrency) - #@overlay/append - - #@ "-metrics-bind-address={}".format(values.kappController.deployment.metricsBindAddress) - ports: - #@overlay/match by="name" - - name: api - containerPort: #@ values.kappController.deployment.apiPort - env: - #@overlay/match by="name" - - name: KAPPCTRL_API_PORT - value: #@ str(values.kappController.deployment.apiPort) - - #@overlay/match by=overlay.subset({"name":"kapp-controller-sidecarexec"}) - - - #@ if/end values.kappController.deployment.coreDNSIP: - volumeMounts: - - mountPath: /etc - name: etc - - #@ if values.kappController.deployment.coreDNSIP: - #! Using init container bypasses the restriction of not having root access in main container - #! It modifies /etc/resolv.conf which is shared to main container - initContainers: - - args: - - -c - - #@ generateBashCmdForDNS(values.kappController.deployment.coreDNSIP) - command: - - /bin/sh - #! Beware, update this image with each version bump!!!!!!! - #! This image needs to be the same as the image used in basefile - image: ghcr.io/carvel-dev/kapp-controller@sha256:b197aba8be9b5634ae2995a8058d1642648e61857960e05f7433d9d793e18a5c - name: init-kapp-controller - securityContext: - allowPrivilegeEscalation: false - runAsUser: 0 - volumeMounts: - - mountPath: /kapp-etc - name: etc - #@ end - #@ if/end values.kappController.deployment.hostNetwork: - hostNetwork: #@ values.kappController.deployment.hostNetwork - #@ if/end values.kappController.deployment.priorityClassName: - priorityClassName: #@ values.kappController.deployment.priorityClassName - #@ if hasattr(values.kappController.deployment, 'tolerations') and values.kappController.deployment.tolerations: - tolerations: #@ default_tolerations + values.kappController.deployment.tolerations - #@ end - #@ if values.kappController.deployment.coreDNSIP: - volumes: - #@overlay/append - - emptyDir: - medium: Memory - name: etc - #@ end diff --git a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-strategy-overlay.yaml b/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-strategy-overlay.yaml deleted file mode 100644 index 85565092bc..0000000000 --- a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/overlays/update-strategy-overlay.yaml +++ /dev/null @@ -1,72 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ def matcher(): -kind: Deployment -metadata: - name: kapp-controller -spec: - template: - spec: - nodeSelector: - node-role.kubernetes.io/master: "" -#@ end - -#! We are adding this overlay in the package to accomandate the need from vSphere supervisor cluster: -#! `deployment.spec.strategy.type` is configured to `RollingUpdate` -#! `deployment.spec.strategy.rollingUpdate.maxUnavailable` is set to `0`. -#! `deployment.spec.strategy.rollingUpdate.maxSurge` is set to `1`. -#! `deployment.spec.template.spec.nodeSelector`is set to target only `Nodes` -#! `daemonset.spec.updateStrategy.type` is configured to `OnDelete` -#! This overlay makes configuring the above parameters possible -#! Reference: https://github.com/vmware-tanzu/tanzu-framework/issues/1850 - -#@overlay/match expects="0+",by=overlay.subset({"kind":"Deployment"}) ---- -kind: Deployment -spec: - #@ if data.values.deployment.updateStrategy != None: - #@overlay/match missing_ok=True - strategy: - type: #@ data.values.deployment.updateStrategy - #@overlay/match missing_ok=True - #@ if data.values.deployment.updateStrategy == "RollingUpdate": - rollingUpdate: - #@ if/end data.values.deployment.rollingUpdate.maxUnavailable != None: - maxUnavailable: #@ data.values.deployment.rollingUpdate.maxUnavailable - #@ if/end data.values.deployment.rollingUpdate.maxSurge != None: - maxSurge: #@ data.values.deployment.rollingUpdate.maxSurge - #@ end - #@ end - #@ if data.values.nodeSelector != None: - template: - spec: - #@overlay/match missing_ok=True - nodeSelector: - #@ for key in data.values.nodeSelector: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - (@= key @): #@ data.values.nodeSelector[key] - #@ end - #@ end - -#@overlay/match expects="0+",by=overlay.subset({"kind":"DaemonSet"}) ---- -kind: DaemonSet -spec: - #@ if data.values.daemonset.updateStrategy: - #@overlay/match missing_ok=True - updateStrategy: - type: #@ data.values.daemonset.updateStrategy - #@ end - -#@overlay/match by=overlay.subset(matcher()) , when=1 ---- -spec: - template: - spec: - nodeSelector: - #@overlay/remove - node-role.kubernetes.io/master: - #@overlay/match missing_ok=True - node-role.kubernetes.io/control-plane: "" diff --git a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/upstream/kapp-controller.yaml b/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/upstream/kapp-controller.yaml deleted file mode 100644 index 375861baa0..0000000000 --- a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/upstream/kapp-controller.yaml +++ /dev/null @@ -1,2660 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: kapp-controller ---- -apiVersion: v1 -kind: Namespace -metadata: - name: kapp-controller-packaging-global ---- -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - name: v1alpha1.data.packaging.carvel.dev -spec: - group: data.packaging.carvel.dev - groupPriorityMinimum: 100 - service: - name: packaging-api - namespace: kapp-controller - version: v1alpha1 - versionPriority: 100 ---- -apiVersion: v1 -kind: Service -metadata: - name: packaging-api - namespace: kapp-controller -spec: - ports: - - port: 443 - protocol: TCP - targetPort: api - selector: - app: kapp-controller ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: internalpackagemetadatas.internal.packaging.carvel.dev -spec: - group: internal.packaging.carvel.dev - names: - kind: InternalPackageMetadata - listKind: InternalPackageMetadataList - plural: internalpackagemetadatas - singular: internalpackagemetadata - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - categories: - description: Classifiers of the package (optional; Array of strings) - items: - type: string - type: array - displayName: - description: Human friendly name of the package (optional; string) - type: string - iconSVGBase64: - description: Base64 encoded icon (optional; string) - type: string - longDescription: - description: Long description of the package (optional; string) - type: string - maintainers: - description: List of maintainer info for the package. Currently only - supports the name key. (optional; array of maintner info) - items: - properties: - name: - type: string - type: object - type: array - providerName: - description: Name of the entity distributing the package (optional; - string) - type: string - shortDescription: - description: Short desription of the package (optional; string) - type: string - supportDescription: - description: Description of the support available for the package - (optional; string) - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: internalpackages.internal.packaging.carvel.dev -spec: - group: internal.packaging.carvel.dev - names: - kind: InternalPackage - listKind: InternalPackageList - plural: internalpackages - singular: internalpackage - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - capacityRequirementsDescription: - description: 'System requirements needed to install the package. Note: - these requirements will not be verified by kapp-controller on installation. - (optional; string)' - type: string - includedSoftware: - description: IncludedSoftware can be used to show the software contents - of a Package. This is especially useful if the underlying versions - do not match the Package version - items: - description: IncludedSoftware contains the underlying Software Contents - of a Package - properties: - description: - type: string - displayName: - type: string - version: - type: string - type: object - type: array - kappControllerVersionSelection: - description: KappControllerVersionSelection specifies the versions - of kapp-controller which can install this package - properties: - constraints: - type: string - type: object - kubernetesVersionSelection: - description: KubernetesVersionSelection specifies the versions of - k8s which this package can be installed on - properties: - constraints: - type: string - type: object - licenses: - description: Description of the licenses that apply to the package - software (optional; Array of strings) - items: - type: string - type: array - refName: - description: The name of the PackageMetadata associated with this - version Must be a valid PackageMetadata name (see PackageMetadata - CR for details) Cannot be empty - type: string - releaseNotes: - description: Version release notes (optional; string) - type: string - releasedAt: - description: Timestamp of release (iso8601 formatted string; optional) - format: date-time - nullable: true - type: string - template: - properties: - spec: - properties: - canceled: - description: Cancels current and future reconciliations (optional; - default=false) - type: boolean - cluster: - description: Specifies that app should be deployed to destination - cluster; by default, cluster is same as where this resource - resides (optional; v0.5.0+) - properties: - kubeconfigSecretRef: - description: Specifies secret containing kubeconfig (required) - properties: - key: - description: Specifies key that contains kubeconfig - (optional) - type: string - name: - description: Specifies secret name within app's namespace - (required) - type: string - type: object - namespace: - description: Specifies namespace in destination cluster - (optional) - type: string - type: object - deploy: - items: - properties: - kapp: - description: Use kapp to deploy resources - properties: - delete: - description: Configuration for delete command (optional) - properties: - rawOptions: - description: Pass through options to kapp delete - (optional) - items: - type: string - type: array - type: object - inspect: - description: 'Configuration for inspect command - (optional) as of kapp-controller v0.31.0, inspect - is disabled by default add rawOptions or use an - empty inspect config like `inspect: {}` to enable' - properties: - rawOptions: - description: Pass through options to kapp inspect - (optional) - items: - type: string - type: array - type: object - intoNs: - description: Override namespace for all resources - (optional) - type: string - mapNs: - description: Provide custom namespace override mapping - (optional) - items: - type: string - type: array - rawOptions: - description: Pass through options to kapp deploy - (optional) - items: - type: string - type: array - type: object - type: object - type: array - fetch: - items: - properties: - git: - description: Uses git to clone repository - properties: - lfsSkipSmudge: - description: Skip lfs download (optional) - type: boolean - ref: - description: Branch, tag, commit; origin is the - name of the remote (optional) - type: string - refSelection: - description: Specifies a strategy to resolve to - an explicit ref (optional; v0.24.0+) - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - secretRef: - description: 'Secret with auth details. allowed - keys: ssh-privatekey, ssh-knownhosts, username, - password (optional) (if ssh-knownhosts is not - specified, git will not perform strict host checking)' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - subPath: - description: Grab only portion of repository (optional) - type: string - url: - description: http or ssh urls are supported (required) - type: string - type: object - helmChart: - description: Uses helm fetch to fetch specified chart - properties: - name: - description: 'Example: stable/redis' - type: string - repository: - properties: - secretRef: - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - url: - description: Repository url; scheme of oci:// - will fetch experimental helm oci chart (v0.19.0+) - (required) - type: string - type: object - version: - type: string - type: object - http: - description: Uses http library to fetch file - properties: - secretRef: - description: 'Secret to provide auth details (optional) - Secret may include one or more keys: username, - password' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - sha256: - description: Checksum to verify after download (optional) - type: string - subPath: - description: Grab only portion of download (optional) - type: string - url: - description: 'URL can point to one of following - formats: text, tgz, zip http and https url are - supported; plain file, tgz and tar types are supported - (required)' - type: string - type: object - image: - description: Pulls content from Docker/OCI registry - properties: - secretRef: - description: 'Secret may include one or more keys: - username, password, token. By default anonymous - access is used for authentication.' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - subPath: - description: Grab only portion of image (optional) - type: string - tagSelection: - description: Specifies a strategy to choose a tag - (optional; v0.24.0+) if specified, do not include - a tag in url key - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - url: - description: 'Docker image url; unqualified, tagged, - or digest references supported (required) Example: - username/app1-config:v0.1.0' - type: string - type: object - imgpkgBundle: - description: Pulls imgpkg bundle from Docker/OCI registry - (v0.17.0+) - properties: - image: - description: Docker image url; unqualified, tagged, - or digest references supported (required) - type: string - secretRef: - description: 'Secret may include one or more keys: - username, password, token. By default anonymous - access is used for authentication.' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - tagSelection: - description: Specifies a strategy to choose a tag - (optional; v0.24.0+) if specified, do not include - a tag in url key - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - type: object - inline: - description: Pulls content from within this resource; - or other resources in the cluster - properties: - paths: - additionalProperties: - type: string - description: Specifies mapping of paths to their - content; not recommended for sensitive values - as CR is not encrypted (optional) - type: object - pathsFrom: - description: Specifies content via secrets and config - maps; data values are recommended to be placed - in secrets (optional) - items: - properties: - configMapRef: - properties: - directoryPath: - description: Specifies where to place - files found in secret (optional) - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - description: Specifies where to place - files found in secret (optional) - type: string - name: - type: string - type: object - type: object - type: array - type: object - path: - description: Relative path to place the fetched artifacts - type: string - type: object - type: array - noopDelete: - description: Deletion requests for the App will result in - the App CR being deleted, but its associated resources will - not be deleted (optional; default=false; v0.18.0+) - type: boolean - paused: - description: Pauses _future_ reconciliation; does _not_ affect - currently running reconciliation (optional; default=false) - type: boolean - serviceAccountName: - description: Specifies that app should be deployed authenticated - via given service account, found in this namespace (optional; - v0.6.0+) - type: string - syncPeriod: - description: Specifies the length of time to wait, in time - + unit format, before reconciling. Always >= 30s. If value - below 30s is specified, 30s will be used. (optional; v0.9.0+; - default=30s) - type: string - template: - items: - properties: - cue: - properties: - inputExpression: - description: Cue expression for single path component, - can be used to unify ValuesFrom into a given field - (optional) - type: string - outputExpression: - description: Cue expression to output, default will - export all visible fields (optional) - type: string - paths: - description: Explicit list of files/directories - (optional) - items: - type: string - type: array - valuesFrom: - description: Provide values (optional) - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - downwardAPI: - properties: - items: - items: - properties: - fieldPath: - description: 'Required: Selects - a field of the app: only annotations, - labels, uid, name and namespace - are supported.' - type: string - kappControllerVersion: - description: 'Optional: Get running - KappController version, defaults - (empty) to retrieving the current - running version.. Can be manually - supplied instead.' - properties: - version: - type: string - type: object - kubernetesAPIs: - description: 'Optional: Get running - KubernetesAPIs from cluster, defaults - (empty) to retrieving the APIs - from the cluster. Can be manually - supplied instead, e.g ["group/version", - "group2/version2"]' - properties: - groupVersions: - items: - type: string - type: array - type: object - kubernetesVersion: - description: 'Optional: Get running - Kubernetes version from cluster, - defaults (empty) to retrieving - the version from the cluster. - Can be manually supplied instead.' - properties: - version: - type: string - type: object - name: - type: string - type: object - type: array - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - helmTemplate: - description: Use helm template command to render helm - chart - properties: - kubernetesAPIs: - description: 'Optional: Use kubernetes group/versions - resources available in the live cluster' - properties: - groupVersions: - items: - type: string - type: array - type: object - kubernetesVersion: - description: 'Optional: Get Kubernetes version, - defaults (empty) to retrieving the version from - the cluster. Can be manually overridden to a value - instead.' - properties: - version: - type: string - type: object - name: - description: Set name explicitly, default is App - CR's name (optional; v0.13.0+) - type: string - namespace: - description: Set namespace explicitly, default is - App CR's namespace (optional; v0.13.0+) - type: string - path: - description: Path to chart (optional; v0.13.0+) - type: string - valuesFrom: - description: One or more secrets, config maps, paths - that provide values (optional) - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - downwardAPI: - properties: - items: - items: - properties: - fieldPath: - description: 'Required: Selects - a field of the app: only annotations, - labels, uid, name and namespace - are supported.' - type: string - kappControllerVersion: - description: 'Optional: Get running - KappController version, defaults - (empty) to retrieving the current - running version.. Can be manually - supplied instead.' - properties: - version: - type: string - type: object - kubernetesAPIs: - description: 'Optional: Get running - KubernetesAPIs from cluster, defaults - (empty) to retrieving the APIs - from the cluster. Can be manually - supplied instead, e.g ["group/version", - "group2/version2"]' - properties: - groupVersions: - items: - type: string - type: array - type: object - kubernetesVersion: - description: 'Optional: Get running - Kubernetes version from cluster, - defaults (empty) to retrieving - the version from the cluster. - Can be manually supplied instead.' - properties: - version: - type: string - type: object - name: - type: string - type: object - type: array - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - jsonnet: - description: TODO implement jsonnet - type: object - kbld: - description: Use kbld to resolve image references to - use digests - properties: - paths: - items: - type: string - type: array - type: object - kustomize: - description: TODO implement kustomize - type: object - sops: - description: Use sops to decrypt *.sops.yml files (optional; - v0.11.0+) - properties: - age: - properties: - privateKeysSecretRef: - description: Secret with private armored PGP - private keys (required) - properties: - name: - type: string - type: object - type: object - paths: - description: Lists paths to decrypt explicitly (optional; - v0.13.0+) - items: - type: string - type: array - pgp: - description: Use PGP to decrypt files (required) - properties: - privateKeysSecretRef: - description: Secret with private armored PGP - private keys (required) - properties: - name: - type: string - type: object - type: object - type: object - ytt: - description: Use ytt to template configuration - properties: - fileMarks: - description: Control metadata about input files - passed to ytt (optional; v0.18.0+) see https://carvel.dev/ytt/docs/latest/file-marks/ - for more details - items: - type: string - type: array - ignoreUnknownComments: - description: Ignores comments that ytt doesn't recognize - (optional; default=false) - type: boolean - inline: - description: Specify additional files, including - data values (optional) - properties: - paths: - additionalProperties: - type: string - description: Specifies mapping of paths to their - content; not recommended for sensitive values - as CR is not encrypted (optional) - type: object - pathsFrom: - description: Specifies content via secrets and - config maps; data values are recommended to - be placed in secrets (optional) - items: - properties: - configMapRef: - properties: - directoryPath: - description: Specifies where to place - files found in secret (optional) - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - description: Specifies where to place - files found in secret (optional) - type: string - name: - type: string - type: object - type: object - type: array - type: object - paths: - description: Lists paths to provide to ytt explicitly - (optional) - items: - type: string - type: array - strict: - description: Forces strict mode https://github.com/k14s/ytt/blob/develop/docs/strict.md - (optional; default=false) - type: boolean - valuesFrom: - description: Provide values via ytt's --data-values-file - (optional; v0.19.0-alpha.9) - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - downwardAPI: - properties: - items: - items: - properties: - fieldPath: - description: 'Required: Selects - a field of the app: only annotations, - labels, uid, name and namespace - are supported.' - type: string - kappControllerVersion: - description: 'Optional: Get running - KappController version, defaults - (empty) to retrieving the current - running version.. Can be manually - supplied instead.' - properties: - version: - type: string - type: object - kubernetesAPIs: - description: 'Optional: Get running - KubernetesAPIs from cluster, defaults - (empty) to retrieving the APIs - from the cluster. Can be manually - supplied instead, e.g ["group/version", - "group2/version2"]' - properties: - groupVersions: - items: - type: string - type: array - type: object - kubernetesVersion: - description: 'Optional: Get running - Kubernetes version from cluster, - defaults (empty) to retrieving - the version from the cluster. - Can be manually supplied instead.' - properties: - version: - type: string - type: object - name: - type: string - type: object - type: array - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - type: object - type: array - type: object - required: - - spec - type: object - valuesSchema: - description: valuesSchema can be used to show template values that - can be configured by users when a Package is installed in an OpenAPI - schema format. - properties: - openAPIv3: - nullable: true - type: object - x-kubernetes-preserve-unknown-fields: true - type: object - version: - description: Package version; Referenced by PackageInstall; Must be - valid semver (required) Cannot be empty - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: apps.kappctrl.k14s.io -spec: - group: kappctrl.k14s.io - names: - categories: - - carvel - kind: App - listKind: AppList - plural: apps - singular: app - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Friendly description - jsonPath: .status.friendlyDescription - name: Description - type: string - - description: Last time app started being deployed. Does not mean anything was - changed. - jsonPath: .status.deploy.startedAt - name: Since-Deploy - type: date - - description: Time since creation - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: 'An App is a set of Kubernetes resources. These resources could - span any number of namespaces or could be cluster-wide (e.g. CRDs). An App - is represented in kapp-controller using a App CR. The App CR comprises of - three main sections: spec.fetch – declare source for fetching configuration - and OCI images spec.template – declare templating tool and values spec.deploy - – declare deployment tool and any deploy specific configuration' - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - canceled: - description: Cancels current and future reconciliations (optional; - default=false) - type: boolean - cluster: - description: Specifies that app should be deployed to destination - cluster; by default, cluster is same as where this resource resides - (optional; v0.5.0+) - properties: - kubeconfigSecretRef: - description: Specifies secret containing kubeconfig (required) - properties: - key: - description: Specifies key that contains kubeconfig (optional) - type: string - name: - description: Specifies secret name within app's namespace - (required) - type: string - type: object - namespace: - description: Specifies namespace in destination cluster (optional) - type: string - type: object - deploy: - items: - properties: - kapp: - description: Use kapp to deploy resources - properties: - delete: - description: Configuration for delete command (optional) - properties: - rawOptions: - description: Pass through options to kapp delete (optional) - items: - type: string - type: array - type: object - inspect: - description: 'Configuration for inspect command (optional) - as of kapp-controller v0.31.0, inspect is disabled by - default add rawOptions or use an empty inspect config - like `inspect: {}` to enable' - properties: - rawOptions: - description: Pass through options to kapp inspect (optional) - items: - type: string - type: array - type: object - intoNs: - description: Override namespace for all resources (optional) - type: string - mapNs: - description: Provide custom namespace override mapping (optional) - items: - type: string - type: array - rawOptions: - description: Pass through options to kapp deploy (optional) - items: - type: string - type: array - type: object - type: object - type: array - fetch: - items: - properties: - git: - description: Uses git to clone repository - properties: - lfsSkipSmudge: - description: Skip lfs download (optional) - type: boolean - ref: - description: Branch, tag, commit; origin is the name of - the remote (optional) - type: string - refSelection: - description: Specifies a strategy to resolve to an explicit - ref (optional; v0.24.0+) - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - secretRef: - description: 'Secret with auth details. allowed keys: ssh-privatekey, - ssh-knownhosts, username, password (optional) (if ssh-knownhosts - is not specified, git will not perform strict host checking)' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - subPath: - description: Grab only portion of repository (optional) - type: string - url: - description: http or ssh urls are supported (required) - type: string - type: object - helmChart: - description: Uses helm fetch to fetch specified chart - properties: - name: - description: 'Example: stable/redis' - type: string - repository: - properties: - secretRef: - properties: - name: - description: Object is expected to be within same - namespace - type: string - type: object - url: - description: Repository url; scheme of oci:// will fetch - experimental helm oci chart (v0.19.0+) (required) - type: string - type: object - version: - type: string - type: object - http: - description: Uses http library to fetch file - properties: - secretRef: - description: 'Secret to provide auth details (optional) - Secret may include one or more keys: username, password' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - sha256: - description: Checksum to verify after download (optional) - type: string - subPath: - description: Grab only portion of download (optional) - type: string - url: - description: 'URL can point to one of following formats: - text, tgz, zip http and https url are supported; plain - file, tgz and tar types are supported (required)' - type: string - type: object - image: - description: Pulls content from Docker/OCI registry - properties: - secretRef: - description: 'Secret may include one or more keys: username, - password, token. By default anonymous access is used for - authentication.' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - subPath: - description: Grab only portion of image (optional) - type: string - tagSelection: - description: Specifies a strategy to choose a tag (optional; - v0.24.0+) if specified, do not include a tag in url key - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - url: - description: 'Docker image url; unqualified, tagged, or - digest references supported (required) Example: username/app1-config:v0.1.0' - type: string - type: object - imgpkgBundle: - description: Pulls imgpkg bundle from Docker/OCI registry (v0.17.0+) - properties: - image: - description: Docker image url; unqualified, tagged, or digest - references supported (required) - type: string - secretRef: - description: 'Secret may include one or more keys: username, - password, token. By default anonymous access is used for - authentication.' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - tagSelection: - description: Specifies a strategy to choose a tag (optional; - v0.24.0+) if specified, do not include a tag in url key - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - type: object - inline: - description: Pulls content from within this resource; or other - resources in the cluster - properties: - paths: - additionalProperties: - type: string - description: Specifies mapping of paths to their content; - not recommended for sensitive values as CR is not encrypted - (optional) - type: object - pathsFrom: - description: Specifies content via secrets and config maps; - data values are recommended to be placed in secrets (optional) - items: - properties: - configMapRef: - properties: - directoryPath: - description: Specifies where to place files found - in secret (optional) - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - description: Specifies where to place files found - in secret (optional) - type: string - name: - type: string - type: object - type: object - type: array - type: object - path: - description: Relative path to place the fetched artifacts - type: string - type: object - type: array - noopDelete: - description: Deletion requests for the App will result in the App - CR being deleted, but its associated resources will not be deleted - (optional; default=false; v0.18.0+) - type: boolean - paused: - description: Pauses _future_ reconciliation; does _not_ affect currently - running reconciliation (optional; default=false) - type: boolean - serviceAccountName: - description: Specifies that app should be deployed authenticated via - given service account, found in this namespace (optional; v0.6.0+) - type: string - syncPeriod: - description: Specifies the length of time to wait, in time + unit - format, before reconciling. Always >= 30s. If value below 30s is - specified, 30s will be used. (optional; v0.9.0+; default=30s) - type: string - template: - items: - properties: - cue: - properties: - inputExpression: - description: Cue expression for single path component, can - be used to unify ValuesFrom into a given field (optional) - type: string - outputExpression: - description: Cue expression to output, default will export - all visible fields (optional) - type: string - paths: - description: Explicit list of files/directories (optional) - items: - type: string - type: array - valuesFrom: - description: Provide values (optional) - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - downwardAPI: - properties: - items: - items: - properties: - fieldPath: - description: 'Required: Selects a field - of the app: only annotations, labels, - uid, name and namespace are supported.' - type: string - kappControllerVersion: - description: 'Optional: Get running KappController - version, defaults (empty) to retrieving - the current running version.. Can be manually - supplied instead.' - properties: - version: - type: string - type: object - kubernetesAPIs: - description: 'Optional: Get running KubernetesAPIs - from cluster, defaults (empty) to retrieving - the APIs from the cluster. Can be manually - supplied instead, e.g ["group/version", - "group2/version2"]' - properties: - groupVersions: - items: - type: string - type: array - type: object - kubernetesVersion: - description: 'Optional: Get running Kubernetes - version from cluster, defaults (empty) - to retrieving the version from the cluster. - Can be manually supplied instead.' - properties: - version: - type: string - type: object - name: - type: string - type: object - type: array - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - helmTemplate: - description: Use helm template command to render helm chart - properties: - kubernetesAPIs: - description: 'Optional: Use kubernetes group/versions resources - available in the live cluster' - properties: - groupVersions: - items: - type: string - type: array - type: object - kubernetesVersion: - description: 'Optional: Get Kubernetes version, defaults - (empty) to retrieving the version from the cluster. Can - be manually overridden to a value instead.' - properties: - version: - type: string - type: object - name: - description: Set name explicitly, default is App CR's name - (optional; v0.13.0+) - type: string - namespace: - description: Set namespace explicitly, default is App CR's - namespace (optional; v0.13.0+) - type: string - path: - description: Path to chart (optional; v0.13.0+) - type: string - valuesFrom: - description: One or more secrets, config maps, paths that - provide values (optional) - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - downwardAPI: - properties: - items: - items: - properties: - fieldPath: - description: 'Required: Selects a field - of the app: only annotations, labels, - uid, name and namespace are supported.' - type: string - kappControllerVersion: - description: 'Optional: Get running KappController - version, defaults (empty) to retrieving - the current running version.. Can be manually - supplied instead.' - properties: - version: - type: string - type: object - kubernetesAPIs: - description: 'Optional: Get running KubernetesAPIs - from cluster, defaults (empty) to retrieving - the APIs from the cluster. Can be manually - supplied instead, e.g ["group/version", - "group2/version2"]' - properties: - groupVersions: - items: - type: string - type: array - type: object - kubernetesVersion: - description: 'Optional: Get running Kubernetes - version from cluster, defaults (empty) - to retrieving the version from the cluster. - Can be manually supplied instead.' - properties: - version: - type: string - type: object - name: - type: string - type: object - type: array - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - jsonnet: - description: TODO implement jsonnet - type: object - kbld: - description: Use kbld to resolve image references to use digests - properties: - paths: - items: - type: string - type: array - type: object - kustomize: - description: TODO implement kustomize - type: object - sops: - description: Use sops to decrypt *.sops.yml files (optional; - v0.11.0+) - properties: - age: - properties: - privateKeysSecretRef: - description: Secret with private armored PGP private - keys (required) - properties: - name: - type: string - type: object - type: object - paths: - description: Lists paths to decrypt explicitly (optional; - v0.13.0+) - items: - type: string - type: array - pgp: - description: Use PGP to decrypt files (required) - properties: - privateKeysSecretRef: - description: Secret with private armored PGP private - keys (required) - properties: - name: - type: string - type: object - type: object - type: object - ytt: - description: Use ytt to template configuration - properties: - fileMarks: - description: Control metadata about input files passed to - ytt (optional; v0.18.0+) see https://carvel.dev/ytt/docs/latest/file-marks/ - for more details - items: - type: string - type: array - ignoreUnknownComments: - description: Ignores comments that ytt doesn't recognize - (optional; default=false) - type: boolean - inline: - description: Specify additional files, including data values - (optional) - properties: - paths: - additionalProperties: - type: string - description: Specifies mapping of paths to their content; - not recommended for sensitive values as CR is not - encrypted (optional) - type: object - pathsFrom: - description: Specifies content via secrets and config - maps; data values are recommended to be placed in - secrets (optional) - items: - properties: - configMapRef: - properties: - directoryPath: - description: Specifies where to place files - found in secret (optional) - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - description: Specifies where to place files - found in secret (optional) - type: string - name: - type: string - type: object - type: object - type: array - type: object - paths: - description: Lists paths to provide to ytt explicitly (optional) - items: - type: string - type: array - strict: - description: Forces strict mode https://github.com/k14s/ytt/blob/develop/docs/strict.md - (optional; default=false) - type: boolean - valuesFrom: - description: Provide values via ytt's --data-values-file - (optional; v0.19.0-alpha.9) - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - downwardAPI: - properties: - items: - items: - properties: - fieldPath: - description: 'Required: Selects a field - of the app: only annotations, labels, - uid, name and namespace are supported.' - type: string - kappControllerVersion: - description: 'Optional: Get running KappController - version, defaults (empty) to retrieving - the current running version.. Can be manually - supplied instead.' - properties: - version: - type: string - type: object - kubernetesAPIs: - description: 'Optional: Get running KubernetesAPIs - from cluster, defaults (empty) to retrieving - the APIs from the cluster. Can be manually - supplied instead, e.g ["group/version", - "group2/version2"]' - properties: - groupVersions: - items: - type: string - type: array - type: object - kubernetesVersion: - description: 'Optional: Get running Kubernetes - version from cluster, defaults (empty) - to retrieving the version from the cluster. - Can be manually supplied instead.' - properties: - version: - type: string - type: object - name: - type: string - type: object - type: array - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - type: object - type: array - type: object - status: - properties: - conditions: - items: - properties: - message: - description: Human-readable message indicating details about - last transition. - type: string - reason: - description: Unique, this should be a short, machine understandable - string that gives the reason for condition's last transition. - If it reports "ResizeStarted" that means the underlying persistent - volume is being resized. - type: string - status: - type: string - type: - description: ConditionType represents reconciler state - type: string - required: - - status - - type - type: object - type: array - consecutiveReconcileFailures: - type: integer - consecutiveReconcileSuccesses: - type: integer - deploy: - properties: - error: - type: string - exitCode: - type: integer - finished: - type: boolean - kapp: - description: KappDeployStatus contains the associated AppCR deployed - resources - properties: - associatedResources: - description: AssociatedResources contains the associated App - label, namespaces and GKs - properties: - groupKinds: - items: - description: GroupKind specifies a Group and a Kind, - but does not force a version. This is useful for - identifying concepts during lookup stages without - having partially valid types - properties: - group: - type: string - kind: - type: string - required: - - group - - kind - type: object - type: array - label: - type: string - namespaces: - items: - type: string - type: array - type: object - type: object - startedAt: - format: date-time - type: string - stderr: - type: string - stdout: - type: string - updatedAt: - format: date-time - type: string - type: object - fetch: - properties: - error: - type: string - exitCode: - type: integer - startedAt: - format: date-time - type: string - stderr: - type: string - stdout: - type: string - updatedAt: - format: date-time - type: string - type: object - friendlyDescription: - type: string - inspect: - properties: - error: - type: string - exitCode: - type: integer - stderr: - type: string - stdout: - type: string - updatedAt: - format: date-time - type: string - type: object - managedAppName: - type: string - observedGeneration: - description: Populated based on metadata.generation when controller - observes a change to the resource; if this value is out of data, - other status fields do not reflect latest state - format: int64 - type: integer - template: - properties: - error: - type: string - exitCode: - type: integer - stderr: - type: string - updatedAt: - format: date-time - type: string - type: object - usefulErrorMessage: - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: packageinstalls.packaging.carvel.dev -spec: - group: packaging.carvel.dev - names: - categories: - - carvel - kind: PackageInstall - listKind: PackageInstallList - plural: packageinstalls - shortNames: - - pkgi - singular: packageinstall - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: PackageMetadata name - jsonPath: .spec.packageRef.refName - name: Package name - type: string - - description: PackageMetadata version - jsonPath: .status.version - name: Package version - type: string - - description: Friendly description - jsonPath: .status.friendlyDescription - name: Description - type: string - - description: Time since creation - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - description: A Package Install is an actual installation of a package and - its underlying resources on a Kubernetes cluster. It is represented in kapp-controller - by a PackageInstall CR. A PackageInstall CR must reference a Package CR. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - canceled: - description: Canceled when set to true will stop all active changes - type: boolean - cluster: - description: Specifies that Package should be deployed to destination - cluster; by default, cluster is same as where this resource resides - (optional) - properties: - kubeconfigSecretRef: - description: Specifies secret containing kubeconfig (required) - properties: - key: - description: Specifies key that contains kubeconfig (optional) - type: string - name: - description: Specifies secret name within app's namespace - (required) - type: string - type: object - namespace: - description: Specifies namespace in destination cluster (optional) - type: string - type: object - noopDelete: - description: When NoopDelete set to true, PackageInstall deletion - should delete PackageInstall/App CR but preserve App's associated - resources. - type: boolean - packageRef: - description: Specifies the name of the package to install (required) - properties: - refName: - type: string - versionSelection: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - paused: - description: Paused when set to true will ignore all pending changes, - once it set back to false, pending changes will be applied - type: boolean - serviceAccountName: - description: Specifies service account that will be used to install - underlying package contents - type: string - syncPeriod: - description: Controls frequency of App reconciliation in time + unit - format. Always >= 30s. If value below 30s is specified, 30s will - be used. - type: string - values: - description: Values to be included in package's templating step (currently - only included in the first templating step) (optional) - items: - properties: - secretRef: - properties: - key: - type: string - name: - type: string - type: object - type: object - type: array - type: object - status: - properties: - conditions: - items: - properties: - message: - description: Human-readable message indicating details about - last transition. - type: string - reason: - description: Unique, this should be a short, machine understandable - string that gives the reason for condition's last transition. - If it reports "ResizeStarted" that means the underlying persistent - volume is being resized. - type: string - status: - type: string - type: - description: ConditionType represents reconciler state - type: string - required: - - status - - type - type: object - type: array - friendlyDescription: - type: string - lastAttemptedVersion: - description: LastAttemptedVersion specifies what version was last - attempted to be installed. It does _not_ indicate it was successfully - installed. - type: string - observedGeneration: - description: Populated based on metadata.generation when controller - observes a change to the resource; if this value is out of data, - other status fields do not reflect latest state - format: int64 - type: integer - usefulErrorMessage: - type: string - version: - description: TODO this is desired resolved version (not actually deployed) - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - packaging.carvel.dev/global-namespace: kapp-controller-packaging-global - name: packagerepositories.packaging.carvel.dev -spec: - group: packaging.carvel.dev - names: - categories: - - carvel - kind: PackageRepository - listKind: PackageRepositoryList - plural: packagerepositories - shortNames: - - pkgr - singular: packagerepository - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Time since creation - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Friendly description - jsonPath: .status.friendlyDescription - name: Description - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - description: A package repository is a collection of packages and their metadata. - Similar to a maven repository or a rpm repository, adding a package repository - to a cluster gives users of that cluster the ability to install any of the - packages from that repository. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - fetch: - properties: - git: - description: Uses git to clone repository containing package list - properties: - lfsSkipSmudge: - description: Skip lfs download (optional) - type: boolean - ref: - description: Branch, tag, commit; origin is the name of the - remote (optional) - type: string - refSelection: - description: Specifies a strategy to resolve to an explicit - ref (optional; v0.24.0+) - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - secretRef: - description: 'Secret with auth details. allowed keys: ssh-privatekey, - ssh-knownhosts, username, password (optional) (if ssh-knownhosts - is not specified, git will not perform strict host checking)' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - subPath: - description: Grab only portion of repository (optional) - type: string - url: - description: http or ssh urls are supported (required) - type: string - type: object - http: - description: Uses http library to fetch file containing packages - properties: - secretRef: - description: 'Secret to provide auth details (optional) Secret - may include one or more keys: username, password' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - sha256: - description: Checksum to verify after download (optional) - type: string - subPath: - description: Grab only portion of download (optional) - type: string - url: - description: 'URL can point to one of following formats: text, - tgz, zip http and https url are supported; plain file, tgz - and tar types are supported (required)' - type: string - type: object - image: - description: Image url; unqualified, tagged, or digest references - supported (required) - properties: - secretRef: - description: 'Secret may include one or more keys: username, - password, token. By default anonymous access is used for - authentication.' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - subPath: - description: Grab only portion of image (optional) - type: string - tagSelection: - description: Specifies a strategy to choose a tag (optional; - v0.24.0+) if specified, do not include a tag in url key - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - url: - description: 'Docker image url; unqualified, tagged, or digest - references supported (required) Example: username/app1-config:v0.1.0' - type: string - type: object - imgpkgBundle: - description: Pulls imgpkg bundle from Docker/OCI registry - properties: - image: - description: Docker image url; unqualified, tagged, or digest - references supported (required) - type: string - secretRef: - description: 'Secret may include one or more keys: username, - password, token. By default anonymous access is used for - authentication.' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - tagSelection: - description: Specifies a strategy to choose a tag (optional; - v0.24.0+) if specified, do not include a tag in url key - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - type: object - inline: - description: Pull content from within this resource; or other - resources in the cluster - properties: - paths: - additionalProperties: - type: string - description: Specifies mapping of paths to their content; - not recommended for sensitive values as CR is not encrypted - (optional) - type: object - pathsFrom: - description: Specifies content via secrets and config maps; - data values are recommended to be placed in secrets (optional) - items: - properties: - configMapRef: - properties: - directoryPath: - description: Specifies where to place files found - in secret (optional) - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - description: Specifies where to place files found - in secret (optional) - type: string - name: - type: string - type: object - type: object - type: array - type: object - type: object - paused: - description: Paused when set to true will ignore all pending changes, - once it set back to false, pending changes will be applied - type: boolean - syncPeriod: - description: Controls frequency of PackageRepository reconciliation - type: string - required: - - fetch - type: object - status: - properties: - conditions: - items: - properties: - message: - description: Human-readable message indicating details about - last transition. - type: string - reason: - description: Unique, this should be a short, machine understandable - string that gives the reason for condition's last transition. - If it reports "ResizeStarted" that means the underlying persistent - volume is being resized. - type: string - status: - type: string - type: - description: ConditionType represents reconciler state - type: string - required: - - status - - type - type: object - type: array - consecutiveReconcileFailures: - type: integer - consecutiveReconcileSuccesses: - type: integer - deploy: - properties: - error: - type: string - exitCode: - type: integer - finished: - type: boolean - kapp: - description: KappDeployStatus contains the associated AppCR deployed - resources - properties: - associatedResources: - description: AssociatedResources contains the associated App - label, namespaces and GKs - properties: - groupKinds: - items: - description: GroupKind specifies a Group and a Kind, - but does not force a version. This is useful for - identifying concepts during lookup stages without - having partially valid types - properties: - group: - type: string - kind: - type: string - required: - - group - - kind - type: object - type: array - label: - type: string - namespaces: - items: - type: string - type: array - type: object - type: object - startedAt: - format: date-time - type: string - stderr: - type: string - stdout: - type: string - updatedAt: - format: date-time - type: string - type: object - fetch: - properties: - error: - type: string - exitCode: - type: integer - startedAt: - format: date-time - type: string - stderr: - type: string - stdout: - type: string - updatedAt: - format: date-time - type: string - type: object - friendlyDescription: - type: string - observedGeneration: - description: Populated based on metadata.generation when controller - observes a change to the resource; if this value is out of data, - other status fields do not reflect latest state - format: int64 - type: integer - template: - properties: - error: - type: string - exitCode: - type: integer - stderr: - type: string - updatedAt: - format: date-time - type: string - type: object - usefulErrorMessage: - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - annotations: - kapp-controller.carvel.dev/version: v0.41.6 - kbld.k14s.io/images: | - - origins: - - local: - path: /home/runner/work/kapp-controller/kapp-controller - - git: - dirty: false - remoteURL: https://github.com/carvel-dev/kapp-controller - sha: 2699cedad95584bf76ccd2a7a675962f6fe5b33c - tags: - - v0.41.6 - url: ghcr.io/carvel-dev/kapp-controller@sha256:b197aba8be9b5634ae2995a8058d1642648e61857960e05f7433d9d793e18a5c - name: kapp-controller - namespace: kapp-controller -spec: - replicas: 1 - revisionHistoryLimit: 0 - selector: - matchLabels: - app: kapp-controller - template: - metadata: - labels: - app: kapp-controller - spec: - containers: - - args: - - -packaging-global-namespace=kapp-controller-packaging-global - - -enable-api-priority-and-fairness=True - - -tls-cipher-suites= - env: - - name: KAPPCTRL_MEM_TMP_DIR - value: /etc/kappctrl-mem-tmp - - name: KAPPCTRL_SIDECAREXEC_SOCK - value: /etc/kappctrl-mem-tmp/sidecarexec.sock - - name: KAPPCTRL_SYSTEM_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: KAPPCTRL_API_PORT - value: "10350" - image: ghcr.io/carvel-dev/kapp-controller@sha256:b197aba8be9b5634ae2995a8058d1642648e61857960e05f7433d9d793e18a5c - name: kapp-controller - ports: - - containerPort: 10350 - name: api - protocol: TCP - resources: - requests: - cpu: 120m - memory: 100Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - all - readOnlyRootFilesystem: true - runAsNonRoot: true - volumeMounts: - - mountPath: /etc/kappctrl-mem-tmp - name: template-fs - - mountPath: /home/kapp-controller - name: home - - args: - - --sidecarexec - env: - - name: KAPPCTRL_SIDECAREXEC_SOCK - value: /etc/kappctrl-mem-tmp/sidecarexec.sock - image: ghcr.io/carvel-dev/kapp-controller@sha256:b197aba8be9b5634ae2995a8058d1642648e61857960e05f7433d9d793e18a5c - name: kapp-controller-sidecarexec - resources: - requests: - cpu: 120m - memory: 100Mi - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - all - readOnlyRootFilesystem: false - runAsNonRoot: true - volumeMounts: - - mountPath: /etc/kappctrl-mem-tmp - name: template-fs - - mountPath: /home/kapp-controller - name: home - - mountPath: /var/run/secrets/kubernetes.io/serviceaccount - name: empty-sa - serviceAccount: kapp-controller-sa - volumes: - - emptyDir: - medium: Memory - name: template-fs - - emptyDir: - medium: Memory - name: home - - emptyDir: {} - name: empty-sa ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: kapp-controller-sa - namespace: kapp-controller ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: kapp-controller-cluster-role -rules: -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - get - - list - - watch -- apiGroups: - - "" - resources: - - serviceaccounts - verbs: - - get -- apiGroups: - - "" - resources: - - serviceaccounts/token - verbs: - - create -- apiGroups: - - kappctrl.k14s.io - resources: - - apps - - apps/status - verbs: - - '*' -- apiGroups: - - packaging.carvel.dev - resources: - - packageinstalls - - packageinstalls/status - - packageinstalls/finalizers - verbs: - - '*' -- apiGroups: - - packaging.carvel.dev - resources: - - packagerepositories - - packagerepositories/status - verbs: - - '*' -- apiGroups: - - internal.packaging.carvel.dev - resources: - - internalpackagemetadatas - verbs: - - '*' -- apiGroups: - - data.packaging.carvel.dev - resources: - - packagemetadatas - - packagemetadatas/status - verbs: - - '*' -- apiGroups: - - internal.packaging.carvel.dev - resources: - - internalpackages - verbs: - - '*' -- apiGroups: - - data.packaging.carvel.dev - resources: - - packages - - packages/status - verbs: - - '*' -- apiGroups: - - "" - resources: - - configmaps - verbs: - - '*' -- apiGroups: - - apiregistration.k8s.io - resources: - - apiservices - verbs: - - update - - get -- apiGroups: - - "" - resources: - - namespaces - verbs: - - list - - watch - - get - - update -- apiGroups: - - admissionregistration.k8s.io - resources: - - mutatingwebhookconfigurations - verbs: - - list - - watch -- apiGroups: - - admissionregistration.k8s.io - resources: - - validatingwebhookconfigurations - verbs: - - list - - watch -- apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create -- apiGroups: - - flowcontrol.apiserver.k8s.io - resources: - - prioritylevelconfigurations - - flowschemas - verbs: - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: kapp-controller-user-role -rules: -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - get - - list - - watch -- apiGroups: - - "" - resources: - - serviceaccounts - verbs: - - get -- apiGroups: - - "" - resources: - - serviceaccounts/token - verbs: - - create -- apiGroups: - - kappctrl.k14s.io - resources: - - apps - - apps/status - verbs: - - '*' -- apiGroups: - - packaging.carvel.dev - resources: - - packageinstalls - - packageinstalls/status - - packageinstalls/finalizers - verbs: - - '*' -- apiGroups: - - "" - resources: - - configmaps - verbs: - - '*' -- apiGroups: - - packaging.carvel.dev - resources: - - packagerepositories - - packagerepositories/status - verbs: - - get - - list - - watch -- apiGroups: - - internal.packaging.carvel.dev - resources: - - internalpackagemetadatas - verbs: - - get - - list - - watch -- apiGroups: - - data.packaging.carvel.dev - resources: - - packagemetadatas - - packagemetadatas/status - verbs: - - get - - list - - watch -- apiGroups: - - internal.packaging.carvel.dev - resources: - - internalpackages - verbs: - - get - - list - - watch -- apiGroups: - - data.packaging.carvel.dev - resources: - - packages - - packages/status - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: kapp-controller-cluster-role-binding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: kapp-controller-cluster-role -subjects: -- kind: ServiceAccount - name: kapp-controller-sa - namespace: kapp-controller ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: pkg-apiserver:system:auth-delegator -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: system:auth-delegator -subjects: -- kind: ServiceAccount - name: kapp-controller-sa - namespace: kapp-controller ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: pkgserver-auth-reader - namespace: kube-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: extension-apiserver-authentication-reader -subjects: -- kind: ServiceAccount - name: kapp-controller-sa - namespace: kapp-controller diff --git a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/values.star b/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/values.star deleted file mode 100644 index 8b21b1fe13..0000000000 --- a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/values.star +++ /dev/null @@ -1,18 +0,0 @@ -load("@ytt:data", "data") - -#export -values = data.values -kappNamespace = "" -if hasattr(values.kappController, 'namespace') and values.kappController.namespace: - kappNamespace = values.kappController.namespace -else: - kappNamespace = values.namespace -end - -def generateBashCmdForDNS(coreDNSIP): - # This command added the coreDNS IP as the first entry of resolv.conf - # In this way, Kapp Controller will have cluster IP access, - # and still able to resolve enternal urls when core DNS is unavailable - - return "cp /etc/resolv.conf /etc/resolv.conf.bak; sed '1 i nameserver " + coreDNSIP + "' /etc/resolv.conf.bak > /etc/resolv.conf; rm /etc/resolv.conf.bak; cp -R /etc/* /kapp-etc; chmod g+w /kapp-etc/pki/tls/certs/" -end diff --git a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/values.yaml b/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/values.yaml deleted file mode 100644 index fa485defa0..0000000000 --- a/providers/ytt/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.41.6/bundle/config/values.yaml +++ /dev/null @@ -1,32 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -namespace: kapp-controller -nodeSelector: null -deployment: - updateStrategy: null - rollingUpdate: - maxUnavailable: null - maxSurge: null -daemonset: - updateStrategy: null -kappController: - namespace: null - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - #! The coreDNSIP will be injected into /etc/resolv.conf of kapp-controller pod - coreDNSIP: null - hostNetwork: false - priorityClassName: null - concurrency: 4 - tolerations: [] - apiPort: 10350 - metricsBindAddress: ":8080" - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - config: - caCerts: "" - httpProxy: "" - httpsProxy: "" - noProxy: "" - dangerousSkipTLSVerify: "" diff --git a/providers/ytt/vendir/kapp-controller/kapp-controller.lib.yaml b/providers/ytt/vendir/kapp-controller/kapp-controller.lib.yaml deleted file mode 100644 index 48133b0d05..0000000000 --- a/providers/ytt/vendir/kapp-controller/kapp-controller.lib.yaml +++ /dev/null @@ -1,3 +0,0 @@ -#@ load("@ytt:library", "library") - -#@ kapp_controller_lib = library.get("addons/packages/kapp-controller/0.41.6/bundle/config") diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/LICENSE b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/LICENSE deleted file mode 100644 index 68c771a099..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/LICENSE +++ /dev/null @@ -1,176 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/NOTICE b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/NOTICE deleted file mode 100644 index df374c7ac0..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/NOTICE +++ /dev/null @@ -1,182 +0,0 @@ -Tanzu Community Edition -Copyright 2020 VMware, Inc. - -The Apache 2.0 license (the "License") set forth below applies to all parts of the Tanzu Community Edition project. You may not use this file except in compliance with the License. - -Apache License - -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, -and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the -copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other -entities that control, are controlled by, or are under common control -with that entity. For the purposes of this definition, "control" means -(i) the power, direct or indirect, to cause the direction or management -of such entity, whether by contract or otherwise, or (ii) ownership -of fifty percent (50%) or more of the outstanding shares, or (iii) -beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation source, -and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation -or translation of a Source form, including but not limited to compiled -object code, generated documentation, and conversions to other media -types. - -"Work" shall mean the work of authorship, whether in Source or -Object form, made available under the License, as indicated by a copyright -notice that is included in or attached to the work (an example is provided -in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, -that is based on (or derived from) the Work and for which the editorial -revisions, annotations, elaborations, or other modifications represent, -as a whole, an original work of authorship. For the purposes of this -License, Derivative Works shall not include works that remain separable -from, or merely link (or bind by name) to the interfaces of, the Work -and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the -original version of the Work and any modifications or additions to -that Work or Derivative Works thereof, that is intentionally submitted -to Licensor for inclusion in the Work by the copyright owner or by an -individual or Legal Entity authorized to submit on behalf of the copyright -owner. For the purposes of this definition, "submitted" means any form of -electronic, verbal, or written communication sent to the Licensor or its -representatives, including but not limited to communication on electronic -mailing lists, source code control systems, and issue tracking systems -that are managed by, or on behalf of, the Licensor for the purpose of -discussing and improving the Work, but excluding communication that is -conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity -on behalf of whom a Contribution has been received by Licensor and -subsequently incorporated within the Work. - -2. Grant of Copyright License. -Subject to the terms and conditions of this License, each Contributor -hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable copyright license to reproduce, prepare -Derivative Works of, publicly display, publicly perform, sublicense, and -distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. -Subject to the terms and conditions of this License, each Contributor -hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty- free, irrevocable (except as stated in this section) patent -license to make, have made, use, offer to sell, sell, import, and -otherwise transfer the Work, where such license applies only to those -patent claims licensable by such Contributor that are necessarily -infringed by their Contribution(s) alone or by combination of -their Contribution(s) with the Work to which such Contribution(s) -was submitted. If You institute patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Work or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses granted -to You under this License for that Work shall terminate as of the date -such litigation is filed. - -4. Redistribution. -You may reproduce and distribute copies of the Work or Derivative Works -thereof in any medium, with or without modifications, and in Source or -Object form, provided that You meet the following conditions: - - a. You must give any other recipients of the Work or Derivative Works - a copy of this License; and - - b. You must cause any modified files to carry prominent notices stating - that You changed the files; and - - c. You must retain, in the Source form of any Derivative Works that - You distribute, all copyright, patent, trademark, and attribution - notices from the Source form of the Work, excluding those notices - that do not pertain to any part of the Derivative Works; and - - d. If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one of - the following places: within a NOTICE text file distributed as part - of the Derivative Works; within the Source form or documentation, - if provided along with the Derivative Works; or, within a display - generated by the Derivative Works, if and wherever such third-party - notices normally appear. The contents of the NOTICE file are for - informational purposes only and do not modify the License. You - may add Your own attribution notices within Derivative Works that - You distribute, alongside or as an addendum to the NOTICE text - from the Work, provided that such additional attribution notices - cannot be construed as modifying the License. You may add Your own - copyright statement to Your modifications and may provide additional - or different license terms and conditions for use, reproduction, or - distribution of Your modifications, or for any such Derivative Works - as a whole, provided Your use, reproduction, and distribution of the - Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. -Unless You explicitly state otherwise, any Contribution intentionally -submitted for inclusion in the Work by You to the Licensor shall be -under the terms and conditions of this License, without any additional -terms or conditions. Notwithstanding the above, nothing herein shall -supersede or modify the terms of any separate license agreement you may -have executed with Licensor regarding such Contributions. - -6. Trademarks. -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. -Unless required by applicable law or agreed to in writing, Licensor -provides the Work (and each Contributor provides its Contributions) on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either -express or implied, including, without limitation, any warranties or -conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR -A PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any risks -associated with Your exercise of permissions under this License. - -8. Limitation of Liability. -In no event and under no legal theory, whether in tort (including -negligence), contract, or otherwise, unless required by applicable law -(such as deliberate and grossly negligent acts) or agreed to in writing, -shall any Contributor be liable to You for damages, including any direct, -indirect, special, incidental, or consequential damages of any character -arising as a result of this License or out of the use or inability to -use the Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all other -commercial damages or losses), even if such Contributor has been advised -of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. -While redistributing the Work or Derivative Works thereof, You may -choose to offer, and charge a fee for, acceptance of support, warranty, -indemnity, or other liability obligations and/or rights consistent with -this License. However, in accepting such obligations, You may act only -on Your own behalf and on Your sole responsibility, not on behalf of -any other Contributor, and only if You agree to indemnify, defend, and -hold each Contributor harmless for any liability incurred by, or claims -asserted against, such Contributor by reason of your accepting any such -warranty or additional liability. - -END OF TERMS AND CONDITIONS - - - diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/update-strategy-overlay.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/update-strategy-overlay.yaml deleted file mode 100644 index fa14644c77..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/update-strategy-overlay.yaml +++ /dev/null @@ -1,50 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#! We are adding this overlay in the package to accommodate the need from vSphere supervisor cluster: -#! `deployment.spec.strategy.type` is configured to `RollingUpdate` -#! `deployment.spec.strategy.rollingUpdate.maxUnavailable` is set to `0`. -#! `deployment.spec.strategy.rollingUpdate.maxSurge` is set to `1`. -#! `deployment.spec.template.spec.nodeSelector`is set to target only `Nodes` -#! `daemonset.spec.updateStrategy.type` is configured to `OnDelete` -#! This overlay makes configuring the above parameters possible -#! Reference: https://github.com/vmware-tanzu/tanzu-framework/issues/1850 - -#@overlay/match expects="0+",by=overlay.subset({"kind":"Deployment"}) ---- -kind: Deployment -spec: - #@ if data.values.deployment.updateStrategy != None: - #@overlay/match missing_ok=True - strategy: - type: #@ data.values.deployment.updateStrategy - #@overlay/match missing_ok=True - #@ if data.values.deployment.updateStrategy == "RollingUpdate": - rollingUpdate: - #@ if/end data.values.deployment.rollingUpdate.maxUnavailable != None: - maxUnavailable: #@ data.values.deployment.rollingUpdate.maxUnavailable - #@ if/end data.values.deployment.rollingUpdate.maxSurge != None: - maxSurge: #@ data.values.deployment.rollingUpdate.maxSurge - #@ end - #@ end - #@ if data.values.nodeSelector != None: - template: - spec: - #@overlay/match missing_ok=True - nodeSelector: - #@ for key in data.values.nodeSelector: - #@overlay/match missing_ok=True - #@yaml/text-templated-strings - (@= key @): #@ data.values.nodeSelector[key] - #@ end - #@ end - -#@overlay/match expects="0+",by=overlay.subset({"kind":"DaemonSet"}) ---- -kind: DaemonSet -spec: - #@ if data.values.daemonset.updateStrategy: - #@overlay/match missing_ok=True - updateStrategy: - type: #@ data.values.daemonset.updateStrategy - #@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/add-secret.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/add-secret.yaml deleted file mode 100644 index 095aedca5f..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/add-secret.yaml +++ /dev/null @@ -1,34 +0,0 @@ -#@ load("/values.star", "values") - -#@ if values.vsphereCPI.mode == "vsphereCPI" or not values.vsphereCPI.mode: - -#@ if values.vsphereCPI.nsxt.podRoutingEnabled and values.vsphereCPI.nsxt.secretName != "" and values.vsphereCPI.nsxt.secretNamespace != "" and values.vsphereCPI.nsxt.username != "" and values.vsphereCPI.nsxt.password != "" : ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ values.vsphereCPI.nsxt.secretName - namespace: #@ values.vsphereCPI.nsxt.secretNamespace -stringData: - username: #@ values.vsphereCPI.nsxt.username - password: #@ values.vsphereCPI.nsxt.password -type: Opaque -#@ end - -#@ if values.vsphereCPI.nsxt.podRoutingEnabled and values.vsphereCPI.nsxt.clientCertData != "" and values.vsphereCPI.nsxt.clientCertKeyData != "" : ---- -apiVersion: v1 -kind: Secret -metadata: - name: nsxt-tls-certificates - namespace: kube-system -type: kubernetes.io/tls -data: - tls.crt: #@ values.vsphereCPI.nsxt.clientCertData - tls.key: #@ values.vsphereCPI.nsxt.clientCertKeyData - #@ if values.vsphereCPI.nsxt.rootCAData != "" : - tls.ca: #@ values.vsphereCPI.nsxt.rootCAData - #@ end -#@ end - -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/update-config.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/update-config.yaml deleted file mode 100644 index 9f5c31cd3f..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/update-config.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("/values.star", "values") -#@ load("@ytt:overlay", "overlay") -#@ load("/vsphereconf.lib.txt", "vsphere_conf") - -#@ if values.vsphereCPI.mode == "vsphereCPI" or not values.vsphereCPI.mode: - -#@overlay/match by=overlay.subset({"kind": "ConfigMap", "metadata": {"name": "vsphere-cloud-config"}}) ---- -#@overlay/replace -data: - vsphere.conf: #@ vsphere_conf(values) - -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/update-daemonset.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/update-daemonset.yaml deleted file mode 100644 index 413fef6040..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/update-daemonset.yaml +++ /dev/null @@ -1,68 +0,0 @@ -#@ load("/values.star", "values") -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:struct", "struct") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:sha256", "sha256") - -#@ if values.vsphereCPI.mode == "vsphereCPI" or not values.vsphereCPI.mode: - -#@overlay/match by=overlay.subset({"kind": "DaemonSet", "metadata": {"name": "vsphere-cloud-controller-manager"}}) ---- -metadata: - #@overlay/match missing_ok=True - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" - kapp.k14s.io/update-strategy: fallback-on-replace - -spec: - template: - metadata: - #@overlay/match missing_ok=True - annotations: - vsphere-cpi/data-values-hash: #@ "h-{}".format(sha256.sum(yaml.encode(values))[:7]) - spec: - containers: - #@overlay/match by=overlay.subset({"name": "vsphere-cloud-controller-manager"}) - - args: - #@ if values.vsphereCPI.nsxt.podRoutingEnabled: - #@overlay/append - - --configure-cloud-routes=true - #@overlay/append - - --allocate-node-cidrs=true - #@overlay/append - - #@ "--cluster-cidr=" + values.vsphereCPI.nsxt.routes.clusterCidr - #@ end - #@overlay/append - #@yaml/text-templated-strings - #@ for arg in struct.decode(values.vsphereCPI.cloudProviderExtraArgs): - - --(@=arg @)=(@=struct.decode(values.vsphereCPI.cloudProviderExtraArgs)[arg]@) - #@ end - #@overlay/match by=overlay.subset({"name": "vsphere-cloud-controller-manager"}) - #@overlay/match-child-defaults missing_ok=True - - env: - - name: "ENABLE_ALPHA_DUAL_STACK" - value: "true" - #@ if values.vsphereCPI.http_proxy != "" : - - name: "HTTP_PROXY" - value: #@ values.vsphereCPI.http_proxy - - name: "HTTPS_PROXY" - value: #@ values.vsphereCPI.https_proxy - - name: "NO_PROXY" - value: #@ values.vsphereCPI.no_proxy - #@ end - #@ if values.vsphereCPI.nsxt.podRoutingEnabled and values.vsphereCPI.nsxt.clientCertData != "" and values.vsphereCPI.nsxt.clientCertKeyData != "" : - #@overlay/match by=overlay.subset({"name": "vsphere-cloud-controller-manager"}) - - volumeMounts: - #@overlay/append - - mountPath: /etc/cloud/nsxt - name: nsxt-certificates-volume - readOnly: true - volumes: - #@overlay/match by=overlay.subset({"name": "vsphere-cloud-controller-manager"}) - #@overlay/append - - secret: - secretName: nsxt-tls-certificates - name: nsxt-certificates-volume - #@ end - -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/update-secret.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/update-secret.yaml deleted file mode 100644 index 5a6d3e1dee..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-cpi/update-secret.yaml +++ /dev/null @@ -1,14 +0,0 @@ -#@ load("/values.star", "values") -#@ load("@ytt:overlay", "overlay") - -#@ if values.vsphereCPI.mode == "vsphereCPI" or not values.vsphereCPI.mode: - -#@overlay/match by=overlay.subset({"kind": "Secret", "metadata": {"name": "cloud-provider-vsphere-credentials"}}) -#@yaml/text-templated-strings ---- -#@overlay/replace -stringData: - (@=values.vsphereCPI.server@).username: (@=values.vsphereCPI.username@) - (@=values.vsphereCPI.server@).password: (@=values.vsphereCPI.password@) - -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-paravirtual-cpi/update-deployment.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-paravirtual-cpi/update-deployment.yaml deleted file mode 100644 index 24460f65b1..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/overlays/vsphere-paravirtual-cpi/update-deployment.yaml +++ /dev/null @@ -1,27 +0,0 @@ -#@ load("/values.star", "values") -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:struct", "struct") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:sha256", "sha256") - -#@ if values.vsphereCPI.mode == "vsphereParavirtualCPI": -#@ if values.vsphereCPI.antreaNSXPodRoutingEnabled: - -#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "guest-cluster-cloud-provider"}}) ---- -spec: - template: - spec: - containers: - #@overlay/match by=overlay.all - - args: - - --controllers=route - - --configure-cloud-routes=true - - --allocate-node-cidrs=true - #! Note: This 'cluster-cidr' value is a workaround for RoutablePod feature. - #! Route controller needs to verify whether deleted route is within its authority. - #! But Cluster CIDR value is assigned by NCP after the cloud provider is deployed. - #! So use this wide range to make sure NCP allocated CIDR is covered in this. - - --cluster-cidr=0.0.0.0/0 -#@ end -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/schema.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/schema.yaml deleted file mode 100644 index cd74101152..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/schema.yaml +++ /dev/null @@ -1,142 +0,0 @@ -#! schema.yaml - -#@data/values-schema -#@schema/desc "OpenAPIv3 Schema for vsphere-cpi" ---- -#@schema/desc "NodeSelector configuration applied to all the deployments" -#@schema/type any=True -nodeSelector: -deployment: - #@schema/desc "Update strategy of deployments" - #@schema/nullable - updateStrategy: "" - rollingUpdate: - #@schema/desc "The maxUnavailable of rollingUpdate. Applied only if RollingUpdate is used as updateStrategy" - #@schema/nullable - maxUnavailable: 1 - #@schema/desc "The maxSurge of rollingUpdate. Applied only if RollingUpdate is used as updateStrategy" - #@schema/nullable - maxSurge: 0 -daemonset: - #@schema/desc "Update strategy of daemonsets" - #@schema/nullable - updateStrategy: "" -#@schema/desc "Configurations for vsphere-cpi" -vsphereCPI: - #@schema/desc "The vSphere mode. Either vsphereCPI or vsphereParavirtualCPI. Default value is vsphereCPI" - mode: vsphereCPI - #@schema/desc "The cryptographic thumbprint of the vSphere endpoint's certificate" - #@schema/nullable - tlsThumbprint: "" - #@schema/desc "The IP address or FQDN of the vSphere endpoint" - #@schema/nullable - server: "" - #@schema/desc "The datacenter in which VMs are created/located" - #@schema/nullable - datacenter: "" - #@schema/desc "Username used to access a vSphere endpoint" - #@schema/nullable - username: "" - #@schema/desc "Password used to access a vSphere endpoint" - #@schema/nullable - password: "" - #@schema/desc "The region used by vSphere multi-AZ feature" - #@schema/nullable - region: "" - #@schema/desc "The zone used by vSphere multi-AZ feature" - #@schema/nullable - zone: "" - #@schema/desc "The flag that disables TLS peer verification" - #@schema/nullable - insecureFlag: False - #@schema/desc "The IP family configuration" - #@schema/nullable - ipFamily: "" - #@schema/desc "Internal VM network name" - #@schema/nullable - vmInternalNetwork: "" - #@schema/desc "External VM network name" - #@schema/nullable - vmExternalNetwork: "" - #@schema/desc "Comma separated list of internal network subnets to exclude from node IP selection." - #@schema/nullable - vmExcludeInternalNetworkSubnetCidr: "" - #@schema/desc "Comma separated list of external network subnets to exclude from node IP selection." - #@schema/nullable - vmExcludeExternalNetworkSubnetCidr: "" - #@schema/desc "Extra arguments for the cloud-provider-vsphere." - #@schema/nullable - cloudProviderExtraArgs: - #@schema/desc "External arguments for cloud provider" - tls-cipher-suites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" - #@schema/nullable - nsxt: - #@schema/desc "A flag that enables pod routing" - podRoutingEnabled: false - routes: - #@schema/desc "NSX-T T0/T1 logical router path" - routerPath: "" - #@schema/desc "Cluster CIDR" - clusterCidr: "" - #@schema/desc "The username used to access NSX-T" - username: "" - #@schema/desc "The password used to access NSX-T" - password: "" - #@schema/desc "The NSX-T server" - #@schema/nullable - host: "" - #@schema/desc "(Deprecated. For backward compatibiility. Will be replaced by insecure. If both set, result is insecureFlag || insecure) InsecureFlag is to be set to true if NSX-T uses self-signed cert" - insecureFlag: "false" - #@schema/desc "(Deprecated. For backward compatibiility. Will be replaced by removeAuthEnabled. If both set, result is remoteAuth || remoteAuthEnabled). RemoteAuth is to be set to true if NSX-T uses remote authentication (authentication done through the vIDM)" - remoteAuth: "false" - #@schema/desc "Insecure is to be set to true if NSX-T uses self-signed cert" - insecure: false - #@schema/desc "RemoteAuthEnabled is to be set to true if NSX-T uses remote authentication (authentication done through the vIDM)" - remoteAuthEnabled: false - #@schema/desc "VMCAccessToken is VMC access token for token based authentification" - vmcAccessToken: "" - #@schema/desc "VMCAuthHost is VMC verification host for token based authentification" - vmcAuthHost: "" - #@schema/desc "Client certificate key for NSX-T" - clientCertKeyData: "" - #@schema/desc "Client certificate data for NSX-T" - clientCertData: "" - #@schema/desc "The certificate authority for the server certificate for locally signed certificates" - rootCAData: "" - #@schema/desc "The name of secret that stores CPI configuration" - secretName: "cloud-provider-vsphere-nsxt-credentials" - #@schema/desc "The namespace of secret that stores CPI configuration" - secretNamespace: "kube-system" - #@schema/desc "HTTP proxy setting" - #@schema/nullable - http_proxy: "" - #@schema/desc "HTTPS proxy setting" - #@schema/nullable - https_proxy: "" - #@schema/desc "No-proxy setting" - #@schema/nullable - no_proxy: "" - #@schema/desc "Used in vsphereParavirtual mode, defines the Cluster API versions. Default: cluster.x-k8s.io/v1beta1." - clusterAPIVersion: "cluster.x-k8s.io/v1beta1" - #@schema/desc "Used in vsphereParavirtual mode, defines the Cluster kind. Default: Cluster." - clusterKind: "Cluster" - #@schema/desc "Used in vsphereParavirtual mode, defines the Cluster name. Default: ''." - clusterName: "" - #@schema/desc "Used in vsphereParavirtual mode, defines the Cluster UID. Default: ''" - clusterUID: "" - #@schema/desc "Used in vsphereParavirtual mode, the endpoint IP of supervisor cluster's API server. Default: ''" - supervisorMasterEndpointIP: "" - #@schema/desc "Used in vsphereParavirtual mode, the endpoint port of supervisor cluster's API server port. Default: ''" - supervisorMasterPort: "" - #@schema/desc "Enable pod routing with Antrea NSX" - antreaNSXPodRoutingEnabled: false - #! Deprecated. Kept for backward compatibility - image: - #@schema/desc "The repository of CPI image" - repository: "" - #@schema/desc "The path of image" - path: "" - #@schema/desc "The image tag" - tag: "" - #@schema/desc "The pull policy of image" - pullPolicy: "" diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/01-rbac.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/01-rbac.yaml deleted file mode 100644 index e2136b5812..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/01-rbac.yaml +++ /dev/null @@ -1,128 +0,0 @@ -#@ load("/values.star", "values") - -#@ if values.vsphereCPI.mode == "vsphereCPI" or not values.vsphereCPI.mode: -apiVersion: v1 -kind: ServiceAccount -metadata: - name: cloud-controller-manager - namespace: kube-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: system:cloud-controller-manager -rules: - - apiGroups: - - "" - resources: - - events - verbs: - - create - - patch - - update - - apiGroups: - - "" - resources: - - nodes - verbs: - - '*' - - apiGroups: - - "" - resources: - - nodes/status - verbs: - - patch - - apiGroups: - - "" - resources: - - services - verbs: - - list - - patch - - update - - watch - - apiGroups: - - "" - resources: - - services/status - verbs: - - patch - - apiGroups: - - "" - resources: - - serviceaccounts - verbs: - - create - - get - - list - - watch - - update - - apiGroups: - - "" - resources: - - persistentvolumes - verbs: - - get - - list - - update - - watch - - apiGroups: - - "" - resources: - - endpoints - verbs: - - create - - get - - list - - watch - - update - - apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch - - apiGroups: - - "coordination.k8s.io" - resources: - - leases - verbs: - - get - - list - - watch - - create - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: system:cloud-controller-manager -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: system:cloud-controller-manager -subjects: - - kind: ServiceAccount - name: cloud-controller-manager - namespace: kube-system - - kind: User - name: cloud-controller-manager ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: servicecatalog.k8s.io:apiserver-authentication-reader - namespace: kube-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: extension-apiserver-authentication-reader -subjects: - - kind: ServiceAccount - name: cloud-controller-manager - namespace: kube-system - - kind: User - name: cloud-controller-manager -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/02-config.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/02-config.yaml deleted file mode 100644 index ff0e393cae..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/02-config.yaml +++ /dev/null @@ -1,26 +0,0 @@ -#@ load("/values.star", "values") - -#@ if values.vsphereCPI.mode == "vsphereCPI" or not values.vsphereCPI.mode: -apiVersion: v1 -kind: ConfigMap -metadata: - name: vsphere-cloud-config - namespace: kube-system -data: - vsphere.conf: |+ - [Global] - secret-name = "cloud-provider-vsphere-credentials" - secret-namespace = "kube-system" - thumbprint = "${VSPHERE_TLS_THUMBPRINT}" - [VirtualCenter "${VSPHERE_SERVER}"] - datacenters = "${VSPHERE_DATACENTER}" - thumbprint = "${VSPHERE_TLS_THUMBPRINT}" - [Network] - public-network = "${VSPHERE_NETWORK}" - [Workspace] - server = "${VSPHERE_SERVER}" - datacenter = "${VSPHERE_DATACENTER}" - folder = "${VSPHERE_FOLDER}" - default-datastore = "${VSPHERE_DATASTORE}" - resourcepool-path = "${VSPHERE_RESOURCE_POOL}" -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/03-secret.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/03-secret.yaml deleted file mode 100644 index 30c62e3d6a..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/03-secret.yaml +++ /dev/null @@ -1,13 +0,0 @@ -#@ load("/values.star", "values") - -#@ if values.vsphereCPI.mode == "vsphereCPI" or not values.vsphereCPI.mode: -apiVersion: v1 -kind: Secret -metadata: - name: cloud-provider-vsphere-credentials - namespace: kube-system -stringData: - ${VSPHERE_SERVER}.password: ${VSPHERE_PASSWORD} - ${VSPHERE_SERVER}.username: ${VSPHERE_USERNAME} -type: Opaque -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/04-daemonset.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/04-daemonset.yaml deleted file mode 100644 index abf83154eb..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-cpi/04-daemonset.yaml +++ /dev/null @@ -1,66 +0,0 @@ -#@ load("/values.star", "values") - -#@ if values.vsphereCPI.mode == "vsphereCPI" or not values.vsphereCPI.mode: -apiVersion: apps/v1 -kind: DaemonSet -metadata: - labels: - k8s-app: vsphere-cloud-controller-manager - name: vsphere-cloud-controller-manager - namespace: kube-system -spec: - selector: - matchLabels: - k8s-app: vsphere-cloud-controller-manager - template: - metadata: - labels: - k8s-app: vsphere-cloud-controller-manager - spec: - priorityClassName: system-node-critical - containers: - - args: - - --v=2 - - --cloud-provider=vsphere - - --cloud-config=/etc/cloud/vsphere.conf - image: gcr.io/cloud-provider-vsphere/cpi/release/manager:v1.24.3 - imagePullPolicy: IfNotPresent - name: vsphere-cloud-controller-manager - resources: - requests: - cpu: 200m - volumeMounts: - - mountPath: /etc/cloud - name: vsphere-config-volume - readOnly: true - hostNetwork: true - serviceAccountName: cloud-controller-manager - tolerations: - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - #! remove once usage of this tolerations is removed from Kuberenetes - - effect: NoSchedule - key: node-role.kubernetes.io/master - volumes: - - configMap: - name: vsphere-cloud-config - name: vsphere-config-volume - #! use affinity instead of node selector since node selector only accepts single value - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: node-role.kubernetes.io/control-plane - operator: Exists - - matchExpressions: - - key: node-role.kubernetes.io/master - operator: Exists - updateStrategy: - type: RollingUpdate -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-paravirtual-cpi/01-rbac.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-paravirtual-cpi/01-rbac.yaml deleted file mode 100644 index 6813ad2991..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-paravirtual-cpi/01-rbac.yaml +++ /dev/null @@ -1,108 +0,0 @@ -#@ load("/values.star", "values") - -#@ if values.vsphereCPI.mode == "vsphereParavirtualCPI": -apiVersion: v1 -kind: Namespace -metadata: - name: vmware-system-cloud-provider ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: cloud-provider-svc-account - namespace: vmware-system-cloud-provider ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cloud-provider-cluster-role -rules: - - apiGroups: - - "" - resources: - - configmaps - - services - - nodes - - endpoints - - secrets - verbs: - - get - - watch - - list - - apiGroups: - - policy - resources: - - podsecuritypolicies - verbs: - - use - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cloud-provider-patch-cluster-role -rules: - - apiGroups: - - "" - resources: - - endpoints - - events - verbs: - - create - - update - - replace - - patch - - apiGroups: - - "" - resources: - - services/status - verbs: - - patch - - apiGroups: - - "" - resources: - - nodes - - nodes/status - verbs: - - update - - patch - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cloud-provider-cluster-role-binding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cloud-provider-cluster-role -subjects: - - kind: ServiceAccount - name: cloud-provider-svc-account - namespace: vmware-system-cloud-provider ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cloud-provider-patch-cluster-role-binding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cloud-provider-patch-cluster-role -subjects: - - kind: ServiceAccount - name: cloud-provider-svc-account - namespace: vmware-system-cloud-provider ---- -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-paravirtual-cpi/02-config.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-paravirtual-cpi/02-config.yaml deleted file mode 100644 index ff7c064f1d..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-paravirtual-cpi/02-config.yaml +++ /dev/null @@ -1,24 +0,0 @@ -#@ load("/values.star", "values") - -#@ if values.vsphereCPI.mode == "vsphereParavirtualCPI": -apiVersion: v1 -data: - cloud-config: "" -kind: ConfigMap -metadata: - name: ccm-cloud-config - namespace: vmware-system-cloud-provider ---- -apiVersion: v1 -data: - #@yaml/text-templated-strings - owner-reference: | - {"apiVersion": "(@= values.vsphereCPI.clusterAPIVersion @)", - "kind": "(@= values.vsphereCPI.clusterKind @)", - "name": "(@= values.vsphereCPI.clusterName @)", - "uid": "(@= values.vsphereCPI.clusterUID @)"} -kind: ConfigMap -metadata: - name: ccm-owner-reference - namespace: vmware-system-cloud-provider -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-paravirtual-cpi/03-deployment.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-paravirtual-cpi/03-deployment.yaml deleted file mode 100644 index 32ee3fe83d..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/upstream/vsphere-paravirtual-cpi/03-deployment.yaml +++ /dev/null @@ -1,105 +0,0 @@ -#@ load("/values.star", "values") - -#@ if values.vsphereCPI.mode == "vsphereParavirtualCPI": -apiVersion: apps/v1 -kind: Deployment -metadata: - name: guest-cluster-cloud-provider - namespace: vmware-system-cloud-provider - annotations: - cloud-provider: vsphere-paravirtual -spec: - selector: - matchLabels: - name: guest-cluster-cloud-provider - template: - metadata: - labels: - name: guest-cluster-cloud-provider - spec: - hostNetwork: true - priorityClassName: system-cluster-critical - containers: - - args: - - --controllers=service - - --controllers=cloud-node - - --cloud-config=/config/cloud-config - #@yaml/text-templated-strings - - --cluster-name=(@= values.vsphereCPI.clusterName @) - - --cloud-provider=vsphere-paravirtual - env: - - name: SUPERVISOR_APISERVER_ENDPOINT_IP - value: #@ values.vsphereCPI.supervisorMasterEndpointIP - - name: SUPERVISOR_APISERVER_PORT - value: #@ values.vsphereCPI.supervisorMasterPort - image: gcr.io/cloud-provider-vsphere/cpi/release/manager:v1.24.3 - imagePullPolicy: IfNotPresent - name: guest-cluster-cloud-provider - volumeMounts: - - mountPath: /config - name: ccm-config - readOnly: true - - mountPath: /etc/kubernetes/guestclusters/tanzukubernetescluster - name: ccm-owner-reference - readOnly: true - - mountPath: /etc/cloud/ccm-provider - name: ccm-provider - readOnly: true - serviceAccountName: cloud-provider-svc-account - tolerations: - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - #! remove once usage of this tolerations is removed from Kuberenetes - - effect: NoSchedule - key: node-role.kubernetes.io/master - #! use affinity instead of node selector since node selector only accepts single value - affinity: - nodeAffinity: - preferredDuringSchedulingIgnoredDuringExecution: - - weight: 10 - preference: - matchExpressions: - - key: node-role.kubernetes.io/control-plane - operator: Exists - #! remove once usage of node-role.kubernetes.io/master is removed from Kubernetes - - weight: 10 - preference: - matchExpressions: - - key: node-role.kubernetes.io/master - operator: Exists - volumes: - - name: ccm-config - projected: - sources: - - configMap: - items: - - key: cloud-config - path: cloud-config - name: ccm-cloud-config - - name: ccm-owner-reference - projected: - sources: - - configMap: - items: - - key: owner-reference - path: ownerref.json - name: ccm-owner-reference - - name: ccm-provider - projected: - sources: - - secret: - items: - - key: ca.crt - path: ca.crt - - key: token - path: token - - key: namespace - path: namespace - name: cloud-provider-creds - -#@ end diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/values.star b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/values.star deleted file mode 100644 index d52f14b508..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/values.star +++ /dev/null @@ -1,80 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:assert", "assert") - -def validate_vsphereCPI(): - data.values.vsphereCPI.server != "" or assert.fail("vsphereCPI server should be provided") - data.values.vsphereCPI.datacenter != "" or assert.fail("vsphereCPI datacenter should be provided") - data.values.vsphereCPI.username != "" or assert.fail("vsphereCPI username should be provided") - data.values.vsphereCPI.password != "" or assert.fail("vsphereCPI password should be provided") - if not data.values.vsphereCPI.insecureFlag: - data.values.vsphereCPI.tlsThumbprint or assert.fail("vsphereCPI tlsThumbprint should be provided when insecureFlag is False") - end - if data.values.vsphereCPI.ipFamily and (data.values.vsphereCPI.ipFamily not in ["ipv4", "ipv6", "ipv4,ipv6", "ipv6,ipv4"]): - assert.fail("vsphereCPI ipFamily should be one of \"ipv4\", \"ipv6\", \"ipv4,ipv6\", or \"ipv6,ipv4\" if provided") - end -end - -def validate_vsphereParavirtualCPI(): - data.values.vsphereCPI.clusterName or assert.fail("vsphereParavirtualCPI name of cluster should be provided") - data.values.vsphereCPI.clusterUID or assert.fail("vsphereParavirtualCPI UID of cluster should be provided") - data.values.vsphereCPI.supervisorMasterEndpointIP or assert.fail("vsphereParavirtualCPI supervisorMasterEndpointIP of cluster should be provided") - data.values.vsphereCPI.supervisorMasterPort or assert.fail("vsphereParavirtualCPI supervisorMasterPort of cluster should be provided") - data.values.vsphereCPI.clusterName != "" or assert.fail("vsphereParavirtualCPI cluster name should be provided") - data.values.vsphereCPI.clusterUID != "" or assert.fail("vsphereParavirtualCPI cluster UID should be provided") -end - -def validate_nsxt_config(): - if validate_nsxt_username_password() == False and validate_nsxt_secret() == False and validate_nsxt_token() == False and validate_nsxt_cert() == False: - assert.fail("Invalid NSX-T credentials: username/password or vmc access token or client certificates must be set") - end - data.values.vsphereCPI.nsxt.host or assert.fail("vsphereCPI nsxtHost should be provided") - data.values.vsphereCPI.nsxt.routes.clusterCidr or assert.fail("vsphereCPI nsxt routes clusterCidr should be provided") -end - -def validate_nsxt_token(): - if data.values.vsphereCPI.nsxt.vmcAccessToken == "" or data.values.vsphereCPI.nsxt.vmcAuthHost == "": - return False - end - return True -end - -def validate_nsxt_cert(): - if data.values.vsphereCPI.nsxt.clientCertKeyData == "" or data.values.vsphereCPI.nsxt.clientCertData == "": - return False - end - return True -end - -def validate_nsxt_secret(): - if data.values.vsphereCPI.nsxt.secretName == "" or data.values.vsphereCPI.nsxt.secretNamespace == "": - return False - end - return True -end - -def validate_nsxt_username_password(): - if data.values.vsphereCPI.nsxt.username == "" or data.values.vsphereCPI.nsxt.password == "": - return False - end - return True -end - -# export -values = data.values - -# validate - -def validate(): - if not data.values.vsphereCPI.mode or data.values.vsphereCPI.mode == "vsphereCPI": - validate_vsphereCPI() - if data.values.vsphereCPI.nsxt.podRoutingEnabled: - validate_nsxt_config() - end - elif data.values.vsphereCPI.mode == "vsphereParavirtualCPI": - validate_vsphereParavirtualCPI() - else: - assert.fail("vsphereCPI mode should be either vsphereCPI or vsphereParavirtualCPI") - end -end - -validate() diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/values.yaml b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/values.yaml deleted file mode 100644 index 717d77e8a0..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/values.yaml +++ /dev/null @@ -1,58 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True - ---- -nodeSelector: null -deployment: - updateStrategy: null - rollingUpdate: - maxUnavailable: null - maxSurge: null -daemonset: - updateStrategy: null -vsphereCPI: - mode: vsphereCPI - tlsThumbprint: "" - server: "" - datacenter: "" - username: "" - password: "" - region: null - zone: null - insecureFlag: False - ipFamily: null - vmInternalNetwork: null - vmExternalNetwork: null - vmExcludeInternalNetworkSubnetCidr: null - vmExcludeExternalNetworkSubnetCidr: null - cloudProviderExtraArgs: - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - nsxt: - podRoutingEnabled: false - routes: - routerPath: "" - clusterCidr: "" - username: "" - password: "" - host: null - insecureFlag: "false" - insecure: false - remoteAuth: "false" - remoteAuthEnabled: false - vmcAccessToken: "" - vmcAuthHost: "" - clientCertKeyData: "" - clientCertData: "" - rootCAData: "" - secretName: "cloud-provider-vsphere-nsxt-credentials" - secretNamespace: "kube-system" - http_proxy: "" - https_proxy: "" - no_proxy: "" - clusterAPIVersion: "cluster.x-k8s.io/v1beta1" - clusterKind: "Cluster" - clusterName: "" - clusterUID: "" - supervisorMasterEndpointIP: "" - supervisorMasterPort: "" - antreaNSXPodRoutingEnabled: false diff --git a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/vsphereconf.lib.txt b/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/vsphereconf.lib.txt deleted file mode 100644 index f4d04f3fb2..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/_ytt_lib/addons/packages/vsphere-cpi/1.24.3/bundle/config/vsphereconf.lib.txt +++ /dev/null @@ -1,82 +0,0 @@ - -(@ def vsphere_conf(values): -@) -[Global] -secret-name = "cloud-provider-vsphere-credentials" -secret-namespace = "kube-system" -(@ if values.vsphereCPI.insecureFlag: -@) -insecure-flag = "1" -(@ else: -@) -thumbprint = "(@=values.vsphereCPI.tlsThumbprint @)" -(@ end -@) -[VirtualCenter "(@=values.vsphereCPI.server @)"] -datacenters = "(@=values.vsphereCPI.datacenter @)" -(@ if values.vsphereCPI.ipFamily: -@) -ip-family = "(@=values.vsphereCPI.ipFamily @)" -(@ end -@) -(@ if values.vsphereCPI.insecureFlag: -@) -insecure-flag = "1" -(@ else: -@) -thumbprint = "(@=values.vsphereCPI.tlsThumbprint @)" -(@ end -@) -(@ if values.vsphereCPI.region or values.vsphereCPI.zone: -@) -[Labels] -(@ if values.vsphereCPI.region: -@) -region = "(@=values.vsphereCPI.region @)" -(@ end -@) -(@ if values.vsphereCPI.zone: -@) -zone = "(@=values.vsphereCPI.zone @)" -(@ end -@) -(@ end -@) -(@ if values.vsphereCPI.vmInternalNetwork or values.vsphereCPI.vmExternalNetwork or values.vsphereCPI.vmExcludeInternalNetworkSubnetCidr or values.vsphereCPI.vmExcludeExternalNetworkSubnetCidr: -@) -[Nodes] -(@ if values.vsphereCPI.vmInternalNetwork: -@) -internal-vm-network-name = "(@=values.vsphereCPI.vmInternalNetwork @)" -(@ end -@) -(@ if values.vsphereCPI.vmExternalNetwork: -@) -external-vm-network-name = "(@=values.vsphereCPI.vmExternalNetwork @)" -(@ end -@) -(@ if values.vsphereCPI.vmExcludeInternalNetworkSubnetCidr: -@) -exclude-internal-network-subnet-cidr = "(@=values.vsphereCPI.vmExcludeInternalNetworkSubnetCidr @)" -(@ end -@) -(@ if values.vsphereCPI.vmExcludeExternalNetworkSubnetCidr: -@) -exclude-external-network-subnet-cidr = "(@=values.vsphereCPI.vmExcludeExternalNetworkSubnetCidr @)" -(@ end -@) -(@ end -@) -(@ if values.vsphereCPI.nsxt.podRoutingEnabled : -@) -[Route] -router-path = "(@=values.vsphereCPI.nsxt.routes.routerPath @)" -[NSXT] -host = "(@=values.vsphereCPI.nsxt.host @)" -(@ if values.vsphereCPI.nsxt.insecure or str(values.vsphereCPI.nsxt.insecureFlag).lower() == "true" : -@) -insecure-flag = true -(@ else: -@) -insecure-flag = false -(@ end -@) -(@ if values.vsphereCPI.nsxt.remoteAuthEnabled or str(values.vsphereCPI.nsxt.remoteAuth).lower() == "true" : -@) -remote-auth = true -(@ else: -@) -remote-auth = false -(@ end -@) -(@ if values.vsphereCPI.nsxt.secretName and values.vsphereCPI.nsxt.secretNamespace : -@) -secret-name = "(@=values.vsphereCPI.nsxt.secretName @)" -secret-namespace = "(@=values.vsphereCPI.nsxt.secretNamespace @)" -(@ end -@) -(@ if values.vsphereCPI.nsxt.clientCertData and values.vsphereCPI.nsxt.clientCertKeyData : -@) -client-auth-cert-file = "/etc/cloud/nsxt/tls.crt" -client-auth-key-file = "/etc/cloud/nsxt/tls.key" -(@ if values.vsphereCPI.nsxt.rootCAData : -@) -ca-file = "/etc/cloud/nsxt/tls.ca" -(@ end -@) -(@ end -@) -(@ if values.vsphereCPI.nsxt.vmcAccessToken and values.vsphereCPI.nsxt.vmcAuthHost : -@) -vmc-access-token = "(@=values.vsphereCPI.nsxt.vmcAccessToken @)" -vmc-auth-host = "(@=values.vsphereCPI.nsxt.vmcAuthHost @)" -(@ end -@) -(@ if values.vsphereCPI.nsxt.secretName == '' or values.vsphereCPI.nsxt.secretNamespace == '' : -@) -(@ if values.vsphereCPI.nsxt.username and values.vsphereCPI.nsxt.password : -@) -user = "(@=values.vsphereCPI.nsxt.username @)" -password = "(@=values.vsphereCPI.nsxt.password @)" -(@ end -@) -(@ end -@) -(@ end -@) -(@ end -@) diff --git a/providers/ytt/vendir/vsphere_cpi/vsphere_cpi.lib.yaml b/providers/ytt/vendir/vsphere_cpi/vsphere_cpi.lib.yaml deleted file mode 100644 index cf13fe298d..0000000000 --- a/providers/ytt/vendir/vsphere_cpi/vsphere_cpi.lib.yaml +++ /dev/null @@ -1,3 +0,0 @@ -#@ load("@ytt:library", "library") - -#@ vsphere_cpi_lib = library.get("addons/packages/vsphere-cpi/1.24.3/bundle/config") diff --git a/providers/yttcb/clusterbootstrap.yaml b/providers/yttcb/clusterbootstrap.yaml deleted file mode 100644 index 35f527f9a2..0000000000 --- a/providers/yttcb/clusterbootstrap.yaml +++ /dev/null @@ -1,519 +0,0 @@ -#@ load("@ytt:assert", "assert") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") -#@ load("@ytt:ip", "ip") - -#@ load("pinniped_addon_secret.lib.yaml", "getPinnipedDataValuesForMC") - -#@ vsphereControlPlaneEndpointAsCidr = "" -#@ if data.values.PROVIDER_TYPE == "vsphere" and data.values.VSPHERE_CONTROL_PLANE_ENDPOINT and not data.values.AVI_CONTROL_PLANE_HA_PROVIDER: -#@ vsphereControlPlaneEndpoint, err = assert.try_to(lambda : ip.parse_addr(data.values.VSPHERE_CONTROL_PLANE_ENDPOINT)) -#@ if err == None: -#@ if vsphereControlPlaneEndpoint.is_ipv4(): -#@ vsphereControlPlaneEndpointAsCidr = vsphereControlPlaneEndpoint.string() + "/32" -#@ end -#@ if vsphereControlPlaneEndpoint.is_ipv6(): -#@ vsphereControlPlaneEndpointAsCidr = vsphereControlPlaneEndpoint.string() + "/128" -#@ end -#@ end -#@ end - -#@ def pinniped_configs_exist(): -#@ return data.values.IDENTITY_MANAGEMENT_TYPE == "oidc" or data.values.IDENTITY_MANAGEMENT_TYPE == "ldap" -#@ end - -#@ def is_management_cluster(): -#@ return data.values.TKG_CLUSTER_ROLE == "management" -#@ end - -#@ def split_comma_values(value): -#@ return value.split(",") if value else [] -#@ end - -#@ def antrea_config_customized(): -#@ return (data.values.NSXT_POD_ROUTING_ENABLED or -#@ not data.values.ANTREA_PROXY or -#@ not data.values.ANTREA_ENDPOINTSLICE or -#@ not data.values.ANTREA_POLICY or -#@ not data.values.ANTREA_TRACEFLOW or -#@ not data.values.ANTREA_NODEPORTLOCAL or -#@ data.values.ANTREA_NETWORKPOLICY_STATS or -#@ not data.values.ANTREA_EGRESS or -#@ data.values.ANTREA_IPAM or -#@ data.values.ANTREA_FLOWEXPORTER or -#@ data.values.ANTREA_SERVICE_EXTERNALIP or -#@ data.values.ANTREA_MULTICLUSTER or -#@ data.values.ANTREA_SECONDARY_NETWORK or -#@ data.values.ANTREA_TRAFFIC_CONTROL or -#@ data.values.ANTREA_TOPOLOGY_AWARE_HINTS or -#@ data.values.ANTREA_MULTICAST or -#@ data.values.ANTREA_NO_SNAT or -#@ data.values.ANTREA_DISABLE_UDP_TUNNEL_OFFLOAD or -#@ data.values.ANTREA_TRAFFIC_ENCAP_MODE != "encap" or -#@ data.values.ANTREA_EGRESS_EXCEPT_CIDRS != "" or -#@ not data.values.ANTREA_NODEPORTLOCAL_ENABLED or -#@ data.values.ANTREA_NODEPORTLOCAL_PORTRANGE != "61000-62000" or -#@ data.values.ANTREA_PROXY_ALL or -#@ data.values.ANTREA_PROXY_NODEPORT_ADDRS != "" or -#@ data.values.ANTREA_PROXY_SKIP_SERVICES != "" or -#@ data.values.ANTREA_PROXY_LOAD_BALANCER_IPS or -#@ data.values.ANTREA_FLOWEXPORTER_COLLECTOR_ADDRESS != "flow-aggregator.flow-aggregator.svc:4739:tls" or -#@ data.values.ANTREA_FLOWEXPORTER_POLL_INTERVAL != "5s" or -#@ data.values.ANTREA_FLOWEXPORTER_ACTIVE_TIMEOUT != "30s" or -#@ data.values.ANTREA_FLOWEXPORTER_IDLE_TIMEOUT != "15s" or -#@ data.values.ANTREA_KUBE_APISERVER_OVERRIDE != None or -#@ data.values.ANTREA_TRANSPORT_INTERFACE != None or -#@ data.values.ANTREA_TRANSPORT_INTERFACE_CIDRS != "" or -#@ data.values.ANTREA_MULTICAST_INTERFACES != "" or -#@ data.values.ANTREA_MULTICAST_IGMPQUERY_INTERVAL != "125s" or -#@ data.values.ANTREA_TUNNEL_TYPE != "geneve" or -#@ data.values.ANTREA_TUNNEL_PORT != 0 or -#@ data.values.ANTREA_TUNNEL_CSUM or -#@ data.values.ANTREA_TRAFFIC_ENCRYPTION_MODE != "none" or -#@ data.values.ANTREA_WIREGUARD_PORT != 51820 or -#@ data.values.ANTREA_ENABLE_USAGE_REPORTING or -#@ data.values.ANTREA_ENABLE_BRIDGING_MODE or -#@ data.values.ANTREA_DISABLE_TXCHECKSUM_OFFLOAD or -#@ data.values.ANTREA_DNS_SERVER_OVERRIDE != "" or -#@ data.values.ANTREA_MULTICLUSTER_ENABLE or -#@ data.values.ANTREA_MULTICLUSTER_NAMESPACE != "") -#@ end - -#@ def vspherecpi_configs_exist(): -#@ return data.values.PROVIDER_TYPE == "vsphere" and (data.values.TKG_IP_FAMILY or data.values.VSPHERE_REGION or data.values.VSPHERE_ZONE or data.values.NSXT_MANAGER_HOST or -#@ not data.values.AVI_CONTROL_PLANE_HA_PROVIDER or (data.values.TKG_HTTP_PROXY != "" or -#@ data.values.TKG_HTTPS_PROXY != "" or -#@ data.values.TKG_NO_PROXY != "")) -#@ end - -#@ def vspherecsi_configs_exist(): -#@ return data.values.PROVIDER_TYPE == "vsphere" and ((not data.values.VSPHERE_INSECURE or -#@ data.values.USE_TOPOLOGY_CATEGORIES) or (data.values.TKG_HTTP_PROXY != "" or -#@ data.values.TKG_HTTPS_PROXY != "" or -#@ data.values.TKG_NO_PROXY != "")) -#@ end - -#@ def azurediskcsi_configs_exist(): -#@ return data.values.PROVIDER_TYPE == "azure" and (data.values.TKG_HTTP_PROXY != "" or -#@ data.values.TKG_HTTPS_PROXY != "" or -#@ data.values.TKG_NO_PROXY != "") -#@ end - -#@ def storage_class_customized(): -#@ return not data.values.ENABLE_DEFAULT_STORAGE_CLASS or data.values.VSPHERE_STORAGE_POLICY_ID != "" -#@ end - -#@ def azurefilecsi_configs_exist(): -#@ return data.values.PROVIDER_TYPE == "azure" and (data.values.TKG_HTTP_PROXY != "" or -#@ data.values.TKG_HTTPS_PROXY != "" or -#@ data.values.TKG_NO_PROXY != "") -#@ end - -#@ def awsebscsi_configs_exist(): -#@ return data.values.PROVIDER_TYPE == "aws" and (data.values.TKG_HTTP_PROXY != "" or -#@ data.values.TKG_HTTPS_PROXY != "" or -#@ data.values.TKG_NO_PROXY != "") -#@ end - -#@ def should_create_clusterbootstrap(): -#@ return data.values.CNI != "antrea" or antrea_config_customized() or vspherecsi_configs_exist() or vspherecpi_configs_exist() or awsebscsi_configs_exist() or storage_class_customized() or azurediskcsi_configs_exist() or azurefilecsi_configs_exist() or pinniped_configs_exist() -#@ end - -#@ def kubevipcpiconfig_exist(): -#@ return data.values.PROVIDER_TYPE == "vsphere" and data.values.TKG_CLUSTER_ROLE == "workload" and data.values.KUBEVIP_LOADBALANCER_ENABLE and (data.values.KUBEVIP_LOADBALANCER_CIDRS != "" or data.values.KUBEVIP_LOADBALANCER_IP_RANGES != "") -#@ end - -#@ if is_management_cluster(): ---- -#! In order to maintain a consistent UX, the pinniped secret for a management cluster will always be created. This is -#! to ensure that a user can provide the --dry-run flag to "tanzu management-cluster create" whether they are -#! configuring or disabling Pinniped. -#! If data.values.IDENTITY_MANAGEMENT_TYPE is provided with values "ldap" or "oidc" then a secret with -#! user provided configuration will be generated. If another unsupported value or no value is provided, then a default -#! generic secret will be created which will result in pinniped being disabled. -#! This secret will never be generated for workload clusters so that the default Secret from the ClusterBootstrapTemplate -#! may always be used (and that Secret contains identity_management_type "none" to disable Pinniped). -#! For workload clusters, the tanzu-auth-controller-manager's v3_cascade_controller will -#! watch that default Secret or every cluster and will edit its contents to keep it up to date with the management cluster's -#! pinniped-info configmap. The pinniped-info configmap contains the relevant Pinniped settings for workload clusters, -#! created by the Pinniped package on the management cluster and updated by the Pinniped package's post-deploy-job on -#! the management cluster. Note that when Pinniped was not configured on the management cluster, then the pinniped-info -#! configmap will not exist, in which case the controller will edit the default Secret to give it the appropriate values -#! to disable Pinniped on all the workload clusters too. -apiVersion: v1 -kind: Secret -metadata: - #! This is the same name which is the default used by the ClusterBootstrap below. - #! If this Secret is generated, then the cluster will use it instead of creating - #! a default version of this Secret. - name: #@ "{}-pinniped-package".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - tkg.tanzu.vmware.com/addon-name: pinniped - tkg.tanzu.vmware.com/cluster-name: #@ data.values.CLUSTER_NAME - clusterctl.cluster.x-k8s.io/move: "" - annotations: - tkg.tanzu.vmware.com/addon-type: "authentication/pinniped" -type: clusterbootstrap-secret -stringData: - values.yaml: #@ yaml.encode(getPinnipedDataValuesForMC()) -#@ end -#@ if antrea_config_customized(): ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: #@ data.values.CLUSTER_NAME - namespace: #@ data.values.NAMESPACE -spec: - antrea: - config: - egress: - exceptCIDRs: #@ split_comma_values(data.values.ANTREA_EGRESS_EXCEPT_CIDRS) - nodePortLocal: - enabled: #@ data.values.ANTREA_NODEPORTLOCAL_ENABLED - portRange: #@ data.values.ANTREA_NODEPORTLOCAL_PORTRANGE - antreaProxy: - proxyAll: #@ data.values.ANTREA_PROXY_ALL - nodePortAddresses: #@ split_comma_values(data.values.ANTREA_PROXY_NODEPORT_ADDRS) - skipServices: #@ split_comma_values(data.values.ANTREA_PROXY_SKIP_SERVICES) - proxyLoadBalancerIPs: #@ data.values.ANTREA_PROXY_LOAD_BALANCER_IPS - flowExporter: - collectorAddress: #@ data.values.ANTREA_FLOWEXPORTER_COLLECTOR_ADDRESS - pollInterval: #@ data.values.ANTREA_FLOWEXPORTER_POLL_INTERVAL - activeFlowTimeout: #@ data.values.ANTREA_FLOWEXPORTER_ACTIVE_TIMEOUT - idleFlowTimeout: #@ data.values.ANTREA_FLOWEXPORTER_IDLE_TIMEOUT - kubeAPIServerOverride: #@ data.values.ANTREA_KUBE_APISERVER_OVERRIDE - transportInterface: #@ data.values.ANTREA_TRANSPORT_INTERFACE - transportInterfaceCIDRs: #@ split_comma_values(data.values.ANTREA_TRANSPORT_INTERFACE_CIDRS) - multicastInterfaces: #@ split_comma_values(data.values.ANTREA_MULTICAST_INTERFACES) - tunnelType: #@ data.values.ANTREA_TUNNEL_TYPE - tunnelPort: #@ data.values.ANTREA_TUNNEL_PORT - tunnelCsum: #@ data.values.ANTREA_TUNNEL_CSUM - trafficEncryptionMode: #@ data.values.ANTREA_TRAFFIC_ENCRYPTION_MODE - enableUsageReporting: #@ data.values.ANTREA_ENABLE_USAGE_REPORTING - wireGuard: - port: #@ data.values.ANTREA_WIREGUARD_PORT - serviceCIDR: #@ data.values.SERVICE_CIDR - #@ if data.values.NSXT_POD_ROUTING_ENABLED: - trafficEncapMode: "noEncap" - noSNAT: true - #@ else: - trafficEncapMode: #@ data.values.ANTREA_TRAFFIC_ENCAP_MODE - noSNAT: #@ data.values.ANTREA_NO_SNAT - #@ end - disableUdpTunnelOffload: #@ data.values.ANTREA_DISABLE_UDP_TUNNEL_OFFLOAD - enableBridgingMode: #@data.values.ANTREA_ENABLE_BRIDGING_MODE - disableTXChecksumOffload: #@ data.values.ANTREA_DISABLE_TXCHECKSUM_OFFLOAD - dnsServerOverride: #@ data.values.ANTREA_DNS_SERVER_OVERRIDE - multicast: - igmpQueryInterval: #@ data.values.ANTREA_MULTICAST_IGMPQUERY_INTERVAL - multicluster: - enable: #@ data.values.ANTREA_MULTICLUSTER_ENABLE - namespace: #@ data.values.ANTREA_MULTICLUSTER_NAMESPACE - featureGates: - #@ if data.values.NSXT_POD_ROUTING_ENABLED: - AntreaProxy: true - #@ else: - AntreaProxy: #@ data.values.ANTREA_PROXY - #@ end - EndpointSlice: #@ data.values.ANTREA_ENDPOINTSLICE - AntreaTraceflow: #@ data.values.ANTREA_TRACEFLOW - NodePortLocal: #@ data.values.ANTREA_NODEPORTLOCAL - AntreaPolicy: #@ data.values.ANTREA_POLICY - FlowExporter: #@ data.values.ANTREA_FLOWEXPORTER - NetworkPolicyStats: #@ data.values.ANTREA_NETWORKPOLICY_STATS - Egress: #@ data.values.ANTREA_EGRESS - AntreaIPAM: #@ data.values.ANTREA_IPAM - ServiceExternalIP: #@ data.values.ANTREA_SERVICE_EXTERNALIP - Multicast: #@ data.values.ANTREA_MULTICAST - Multicluster: #@ data.values.ANTREA_MULTICLUSTER - SecondaryNetwork: #@ data.values.ANTREA_SECONDARY_NETWORK - TrafficControl: #@ data.values.ANTREA_TRAFFIC_CONTROL - TopologyAwareHints: #@ data.values.ANTREA_TOPOLOGY_AWARE_HINTS - -#@ end ---- -#@ if data.values.CNI == "calico": -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: #@ data.values.CLUSTER_NAME - namespace: #@ data.values.NAMESPACE -spec: - calico: - config: - vethMTU: 0 - #@ if/end data.values.PROVIDER_TYPE != "docker": - skipCNIBinaries: true -#@ end ---- -#@ if vspherecpi_configs_exist() and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: -#@ if data.values.NSXT_USERNAME or data.values.NSXT_PASSWORD: ---- -apiVersion: v1 -kind: Secret -metadata: - name: #@ data.values.CLUSTER_NAME + "-nsxt-credential" - namespace: #@ data.values.NAMESPACE -stringData: - username: #@ data.values.NSXT_USERNAME - password: #@ data.values.NSXT_PASSWORD -#@ end ---- -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: VSphereCPIConfig -metadata: - name: #@ data.values.CLUSTER_NAME - namespace: #@ data.values.NAMESPACE -spec: - vsphereCPI: - mode: vsphereCPI - #@ if data.values.VSPHERE_REGION: - region: #@ data.values.VSPHERE_REGION - #@ end - #@ if data.values.VSPHERE_ZONE: - zone: #@ data.values.VSPHERE_ZONE - #@ end - #@ if data.values.TKG_IP_FAMILY: - ipFamily: #@ data.values.TKG_IP_FAMILY - #@ end - #@ if not data.values.AVI_CONTROL_PLANE_HA_PROVIDER: - vmNetwork: - excludeInternalSubnetCidr: #@ vsphereControlPlaneEndpointAsCidr - excludeExternalSubnetCidr: #@ vsphereControlPlaneEndpointAsCidr - #@ end - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - #@ if data.values.NSXT_USERNAME or data.values.NSXT_PASSWORD: - nsxt: - podRoutingEnabled: #@ data.values.NSXT_POD_ROUTING_ENABLED - route: - routerPath: #@ data.values.NSXT_ROUTER_PATH - credentialLocalObjRef: - kind: Secret - name: #@ data.values.CLUSTER_NAME + "-nsxt-credential" - apiHost: #@ data.values.NSXT_MANAGER_HOST - insecure: #@ bool(data.values.NSXT_ALLOW_UNVERIFIED_SSL) - remoteAuth: #@ bool(data.values.NSXT_REMOTE_AUTH) - vmcAccessToken: #@ data.values.NSXT_VMC_ACCESS_TOKEN - vmcAuthHost: #@ data.values.NSXT_VMC_AUTH_HOST - clientCertKeyData: #@ data.values.NSXT_CLIENT_CERT_KEY_DATA - clientCertData: #@ data.values.NSXT_CLIENT_CERT_DATA - rootCAData: #@ data.values.NSXT_ROOT_CA_DATA_B64 - #@ end - #@ if data.values.TKG_HTTP_PROXY: - proxy: - http_proxy: #@ data.values.TKG_HTTP_PROXY - https_proxy: #@ data.values.TKG_HTTPS_PROXY - no_proxy: #@ data.values.TKG_NO_PROXY - #@ end -#@ end ---- -#@ if vspherecsi_configs_exist() and data.values.PROVIDER_TYPE == "vsphere" and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: VSphereCSIConfig -metadata: - name: #@ data.values.CLUSTER_NAME - namespace: #@ data.values.NAMESPACE -spec: - vsphereCSI: - mode: vsphereCSI - config: - #@ if data.values.VSPHERE_INSECURE: - insecureFlag: #@ data.values.VSPHERE_INSECURE - #@ else: - tlsThumbprint: #@ data.values.VSPHERE_TLS_THUMBPRINT - #@ end - datacenter: #@ data.values.VSPHERE_DATACENTER - zone: #@ data.values.VSPHERE_ZONE - region: #@ data.values.VSPHERE_REGION - useTopologyCategories: #@ data.values.USE_TOPOLOGY_CATEGORIES - httpProxy: #@ data.values.TKG_HTTP_PROXY - httpsProxy: #@ data.values.TKG_HTTPS_PROXY - noProxy: #@ data.values.TKG_NO_PROXY -#@ end - -#@ def vsphere_storage_class(): -infraProvider: vsphere -#@ if data.values.VSPHERE_STORAGE_POLICY_ID != "": -VSPHERE_STORAGE_POLICY_ID: #@ data.values.VSPHERE_STORAGE_POLICY_ID -#@ end -#@ end - -#@ def no_storage_class(): -infraProvider: "" -#@ end - ---- -#@ if azurediskcsi_configs_exist(): -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AzureDiskCSIConfig -metadata: - name: #@ data.values.CLUSTER_NAME - namespace: #@ data.values.NAMESPACE -spec: - azureDiskCSIDriver: - namespace: kube-system - #@ if data.values.CLUSTER_PLAN == "prod" or data.values.CLUSTER_PLAN == "prodcc": - deploymentReplicas: 3 - #@ else: - deploymentReplicas: 1 - #@ end - httpProxy: #@ data.values.TKG_HTTP_PROXY - httpsProxy: #@ data.values.TKG_HTTPS_PROXY - noProxy: #@ data.values.TKG_NO_PROXY -#@ end ---- -#@ if azurefilecsi_configs_exist(): -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AzureFileCSIConfig -metadata: - name: #@ data.values.CLUSTER_NAME - namespace: #@ data.values.NAMESPACE -spec: - azureFileCSIDriver: - namespace: kube-system - #@ if data.values.CLUSTER_PLAN == "prod" or data.values.CLUSTER_PLAN == "prodcc": - deploymentReplicas: 3 - #@ else: - deploymentReplicas: 1 - #@ end - httpProxy: #@ data.values.TKG_HTTP_PROXY - httpsProxy: #@ data.values.TKG_HTTPS_PROXY - noProxy: #@ data.values.TKG_NO_PROXY -#@ end ---- -#@ if awsebscsi_configs_exist(): -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AwsEbsCSIConfig -metadata: - name: #@ data.values.CLUSTER_NAME - namespace: #@ data.values.NAMESPACE -spec: - awsEBSCSIDriver: - namespace: kube-system - #@ if data.values.CLUSTER_PLAN == "prod" or data.values.CLUSTER_PLAN == "prodcc": - deploymentReplicas: 3 - #@ else: - deploymentReplicas: 1 - #@ end - httpProxy: #@ data.values.TKG_HTTP_PROXY - httpsProxy: #@ data.values.TKG_HTTPS_PROXY - noProxy: #@ data.values.TKG_NO_PROXY -#@ end - ---- -#@ if kubevipcpiconfig_exist() and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: -apiVersion: cpi.tanzu.vmware.com/v1alpha1 -kind: KubevipCPIConfig -metadata: - name: #@ data.values.CLUSTER_NAME - namespace: #@ data.values.NAMESPACE -spec: - #@ if data.values.KUBEVIP_LOADBALANCER_CIDRS != "": - loadbalancerCIDRs: #@ data.values.KUBEVIP_LOADBALANCER_CIDRS - #@ end - #@ if data.values.KUBEVIP_LOADBALANCER_IP_RANGES != "": - loadbalancerIPRanges: #@ data.values.KUBEVIP_LOADBALANCER_IP_RANGES - #@ end -#@ end - ---- -#@ if should_create_clusterbootstrap(): -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - name: #@ data.values.CLUSTER_NAME - namespace: #@ data.values.NAMESPACE - annotations: - tkg.tanzu.vmware.com/add-missing-fields-from-tkr: #@ data.values.KUBERNETES_RELEASE - #@ if/end data.values.CNI == "none": - tkg.tanzu.vmware.com/unmanaged-cni: "" -spec: - #@ if data.values.CNI == "antrea" and antrea_config_customized(): - cni: - refName: antrea* - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: #@ data.values.CLUSTER_NAME - #@ elif data.values.CNI == "calico": - cni: - refName: calico* - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: CalicoConfig - name: #@ data.values.CLUSTER_NAME - #@ end - #@ if vspherecpi_configs_exist() and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: - cpi: - refName: vsphere-cpi* - valuesFrom: - providerRef: - apiGroup: cpi.tanzu.vmware.com - kind: VSphereCPIConfig - name: #@ data.values.CLUSTER_NAME - #@ end - #@ if vspherecsi_configs_exist() and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: - csi: - refName: vsphere-csi* - valuesFrom: - providerRef: - apiGroup: csi.tanzu.vmware.com - kind: VSphereCSIConfig - name: #@ data.values.CLUSTER_NAME - #@ end - #@ if awsebscsi_configs_exist() and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: - csi: - refName: aws-ebs-csi* - valuesFrom: - providerRef: - apiGroup: csi.tanzu.vmware.com - kind: AwsEbsCSIConfig - name: #@ data.values.CLUSTER_NAME - #@ end - #@ if azurediskcsi_configs_exist() and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: - csi: - refName: azuredisk-csi* - valuesFrom: - providerRef: - apiGroup: csi.tanzu.vmware.com - kind: AzureDiskCSIConfig - name: #@ data.values.CLUSTER_NAME - #@ end - kapp: - refName: kapp-controller* - additionalPackages: - - refName: metrics-server* - - refName: secretgen-controller* - - refName: pinniped* - #@ if/end data.values.IS_WINDOWS_WORKLOAD_CLUSTER: - - refName: tkg-windows* - #@ if storage_class_customized(): - - refName: tkg-storageclass* - valuesFrom: - #@ if not data.values.ENABLE_DEFAULT_STORAGE_CLASS: - inline: #@ no_storage_class() - #@ elif data.values.VSPHERE_STORAGE_POLICY_ID != "": - inline: #@ vsphere_storage_class() - #@ end - #@ end - #@ if azurefilecsi_configs_exist() and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: - - refName: azurefile-csi* - valuesFrom: - providerRef: - apiGroup: csi.tanzu.vmware.com - kind: AzureFileCSIConfig - name: #@ data.values.CLUSTER_NAME - #@ end - #@ if kubevipcpiconfig_exist() and not data.values.IS_WINDOWS_WORKLOAD_CLUSTER: - - refName: kube-vip-cloud-provider* - valuesFrom: - providerRef: - apiGroup: cpi.tanzu.vmware.com - kind: KubevipCPIConfig - name: #@ data.values.CLUSTER_NAME - #@ end -#@ end diff --git a/providers/yttcb/clusterbootstraphelpers.star b/providers/yttcb/clusterbootstraphelpers.star deleted file mode 100644 index b0a1a68ee7..0000000000 --- a/providers/yttcb/clusterbootstraphelpers.star +++ /dev/null @@ -1,38 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:regexp", "regexp") - -#! Change done in this function needs to be done in `kapp-controller-values/helper.star` as well. -def get_no_proxy(): - if data.values.TKG_HTTP_PROXY != "": - full_no_proxy_list = [] - if data.values.TKG_NO_PROXY != "": - # trim space in the no_proxy list - full_no_proxy_list = regexp.replace(" ", data.values.TKG_NO_PROXY, "").split(",") - end - if data.values.PROVIDER_TYPE == "aws": - if data.values.AWS_VPC_CIDR != "": - full_no_proxy_list.append(data.values.AWS_VPC_CIDR) - end - full_no_proxy_list.append("169.254.0.0/16") - end - if data.values.PROVIDER_TYPE == "azure": - if data.values.AZURE_VNET_CIDR != "": - full_no_proxy_list.append(data.values.AZURE_VNET_CIDR) - end - full_no_proxy_list.append("169.254.0.0/16") - full_no_proxy_list.append("168.63.129.16") - end - full_no_proxy_list.append(data.values.SERVICE_CIDR) - full_no_proxy_list.append(data.values.CLUSTER_CIDR) - full_no_proxy_list.append("localhost") - full_no_proxy_list.append("127.0.0.1") - if data.values.TKG_IP_FAMILY in ["ipv6", "ipv4,ipv6", "ipv6,ipv4"]: - full_no_proxy_list.append("::1") - end - full_no_proxy_list.append(".svc") - full_no_proxy_list.append(".svc.cluster.local") - populated_no_proxy = ",".join(list(set(full_no_proxy_list))) - return populated_no_proxy - end - return "" -end diff --git a/providers/yttcb/pinniped_addon_secret.lib.yaml b/providers/yttcb/pinniped_addon_secret.lib.yaml deleted file mode 100644 index 812dea2350..0000000000 --- a/providers/yttcb/pinniped_addon_secret.lib.yaml +++ /dev/null @@ -1,185 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("clusterbootstraphelpers.star", "get_no_proxy") - -#! These default names have been around since 1.3.0, and we want to keep them the same for backwards stability. -#@ supervisor_service_name = "pinniped-supervisor" -#@ dex_service_name = "dexsvc" - -#@ def getServiceValuesForMC(name): -name: #@ name -#@ if data.values.PROVIDER_TYPE != "vsphere": -type: LoadBalancer -#@ elif data.values.AVI_ENABLE: -type: LoadBalancer -#@ else: -type: NodePort -#@ end -#@ end - -#@ def getDefaultValuesForMC(): ---- -infrastructure_provider: #@ data.values.PROVIDER_TYPE -#! Unfortunately we are not interpolating data.values.TKG_CLUSTER_ROLE. This must be "workload" in order to disable pinniped due -#! to a ytt template validation requirement in the TCE upstream package. -tkg_cluster_role: workload -identity_management_type: #@ data.values.IDENTITY_MANAGEMENT_TYPE -#@ end - -#@ def getOIDCValuesForMC(): ---- -infrastructure_provider: #@ data.values.PROVIDER_TYPE -tkg_cluster_role: #@ data.values.TKG_CLUSTER_ROLE -custom_cluster_issuer: "" #! provide if user wants to use a custom ClusterIssuer for both Pinniped and Dex certificates -custom_tls_secret: "" #! provide if user wants to use a custom TLS secret for both Pinniped and Dex, will override the ClusterIssuer above if specified -http_proxy: #@ data.values.TKG_HTTP_PROXY -https_proxy: #@ data.values.TKG_HTTPS_PROXY -no_proxy: #@ get_no_proxy() -identity_management_type: #@ data.values.IDENTITY_MANAGEMENT_TYPE -pinniped: - cert_duration: #@ data.values.CERT_DURATION - cert_renew_before: #@ data.values.CERT_RENEW_BEFORE - supervisor_svc_endpoint: "https://0.0.0.0:31234" #! Do not change. Will be updated by post-deployment job. This is used to configure jwtAuthenticator - supervisor_ca_bundle_data: "ca_bundle_data_of_supervisor_svc" #! Do not change. Will be updated by post-deployment job. This is used to configure jwtAuthenticator to communicate with supervisor svc - supervisor_svc_external_ip: "0.0.0.0" #! provide if the node IP or LB IP of Pinniped supervisor service is known, otherwise leave it as is. e.g. 10.165.123.84 - supervisor_svc_external_dns: null #! provide if the LB DNS of Pinniped supervisor service is known, otherwise leave it as is. e.g pinniped-svc.us-west-2a.com - upstream_oidc_client_id: #@ data.values.OIDC_IDENTITY_PROVIDER_CLIENT_ID - upstream_oidc_client_secret: #@ data.values.OIDC_IDENTITY_PROVIDER_CLIENT_SECRET - upstream_oidc_issuer_url: #@ data.values.OIDC_IDENTITY_PROVIDER_ISSUER_URL - upstream_oidc_tls_ca_data: "" #! This tls ca data is used to communicate with upstream_oidc_issuer_url - upstream_oidc_additional_scopes: - #@ for val in data.values.OIDC_IDENTITY_PROVIDER_SCOPES.split(","): - #@overlay/append - - #@ val - #@ end - upstream_oidc_claims: #! required. If no claims, put {} - username: #@ data.values.OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM - groups: #@ data.values.OIDC_IDENTITY_PROVIDER_GROUPS_CLAIM - supervisor: - service: #@ getServiceValuesForMC(supervisor_service_name) -#@ end - -#@ def getLDAPValuesForMC(): ---- -infrastructure_provider: #@ data.values.PROVIDER_TYPE -tkg_cluster_role: #@ data.values.TKG_CLUSTER_ROLE -custom_cluster_issuer: "" #! provide if user wants to use a custom ClusterIssuer for both Pinniped and Dex certificates -custom_tls_secret: "" #! provide if user wants to use a custom TLS secret for both Pinniped and Dex, will override the ClusterIssuer above if specified -http_proxy: #@ data.values.TKG_HTTP_PROXY -https_proxy: #@ data.values.TKG_HTTPS_PROXY -no_proxy: #@ get_no_proxy() -identity_management_type: #@ data.values.IDENTITY_MANAGEMENT_TYPE -pinniped: - cert_duration: #@ data.values.CERT_DURATION - cert_renew_before: #@ data.values.CERT_RENEW_BEFORE - supervisor_svc_endpoint: "https://0.0.0.0:31234" #! Do not change. Will be updated by post-deployment job. This is used to configure jwtAuthenticator - supervisor_ca_bundle_data: "ca_bundle_data_of_supervisor_svc" #! Do not change. Will be updated by post-deployment job. This is used to configure jwtAuthenticator to communicate with supervisor svc - supervisor_svc_external_ip: "0.0.0.0" #! provide if the node IP or LB IP of Pinniped supervisor service is known, otherwise leave it as is. e.g. 10.165.123.84 - supervisor_svc_external_dns: null #! provide if the LB DNS of Pinniped supervisor service is known, otherwise leave it as is. e.g pinniped-svc.us-west-2a.com - upstream_oidc_client_id: "" #! Do not change. Will be updated by post-deployment job. The client secret used to talk to Dex - upstream_oidc_client_secret: "" #! Do not change. Will be updated by post-deployment job. This is the client secret used to talk to Dex - upstream_oidc_issuer_url: "https://0.0.0.0:30167" #! Do not change. Will be updated by post-deployment job. This is the upstream oidc issuer url. It should be pointed to Dex service, since Dex is deployed as the upstream of Pinniped. e.g https://endpoint-points-to-dex:5443 !!! - upstream_oidc_tls_ca_data: "ca_bundle_data_of_dex_svc" #! Do not change. Will be updated by post-deployment job. This tls ca data is used to communicate with upstream_oidc_issuer_url - upstream_oidc_additional_scopes: #! Do not change. This values are static for Pinniped + Dex use cases. - - email - - profile - - groups - upstream_oidc_claims: #! required. If no claims, put {} - username: name - groups: groups - supervisor: - service: #@ getServiceValuesForMC(supervisor_service_name) -dex: - app: dex #! required - create_namespace: true #! required - namespace: tanzu-system-auth #! required - organization: vmware #! required - commonname: tkg-dex #! required - config: - connector: ldap - frontend: - theme: tkg - web: - https: 0.0.0.0:5556 - tlsCert: /etc/dex/tls/tls.crt - tlsKey: /etc/dex/tls/tls.key - expiry: - signingKeys: 9h - idTokens: 5m - authRequests: 90m - deviceRequests: 5m - refreshTokens: - absoluteLifetime: 9h - logger: - level: info - format: json - staticClients: - - id: "pinniped" #! Do not change. Will be updated by post-deployment job - redirectURIs: - - https://0.0.0.0/callback #! Do not change. Will be updated by post-deployment job - name: "pinniped" #! Do not change. Will be updated by post-deployment job - secret: "dummyvalue" #! Do not change. Will be updated by post-deployment job - ldap: - host: #@ data.values.LDAP_HOST - insecureNoSSL: false - startTLS: null - rootCA: null #! or if required when LDAP host is using self signed certificate. Path to the CA file - rootCAData: #@ data.values.LDAP_ROOT_CA_DATA_B64 - bindDN: #@ data.values.LDAP_BIND_DN - BIND_PW_ENV_VAR: #@ data.values.LDAP_BIND_PASSWORD - usernamePrompt: LDAP Username - insecureSkipVerify: false - userSearch: - baseDN: #@ data.values.LDAP_USER_SEARCH_BASE_DN - filter: #@ data.values.LDAP_USER_SEARCH_FILTER - username: #@ data.values.LDAP_USER_SEARCH_USERNAME - idAttr: #@ data.values.LDAP_USER_SEARCH_ID_ATTRIBUTE - emailAttr: #@ data.values.LDAP_USER_SEARCH_EMAIL_ATTRIBUTE - nameAttr: #@ data.values.LDAP_USER_SEARCH_NAME_ATTRIBUTE - scope: sub - groupSearch: - baseDN: #@ data.values.LDAP_GROUP_SEARCH_BASE_DN - filter: #@ data.values.LDAP_GROUP_SEARCH_FILTER - nameAttr: #@ data.values.LDAP_GROUP_SEARCH_NAME_ATTRIBUTE - scope: sub - userMatchers: #! Add more matchers if necessary - - userAttr: #@ data.values.LDAP_GROUP_SEARCH_USER_ATTRIBUTE - groupAttr: #@ data.values.LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE - oauth2: - skipApprovalScreen: true - responseTypes: - - "code" - storage: - type: kubernetes - config: - inCluster: true - enablePasswordDB: false - service: #@ getServiceValuesForMC(dex_service_name) - deployment: - replicas: 1 - certificate: #! required - duration: #@ data.values.CERT_DURATION - renewBefore: #@ data.values.CERT_RENEW_BEFORE - dns: #! required - vsphere: - dnsNames: - - tkg-dex.com - ipAddresses: [ 0.0.0.0 ] #! Do not change. Will be updated by post-deployment job - aws: - dnsNames: - - tkg-dex.com - DEX_SVC_LB_HOSTNAME: example.com #! is required for AWS - azure: - dnsNames: - - tkg-dex.com - DEX_SVC_LB_HOSTNAME: dex.example.com #! is required for azure -#@ end - -#@ def getPinnipedDataValuesForMC(): -#@ if data.values.IDENTITY_MANAGEMENT_TYPE == "oidc": -#@ return getOIDCValuesForMC() -#@ end -#@ if data.values.IDENTITY_MANAGEMENT_TYPE == "ldap": -#@ return getLDAPValuesForMC() -#@ end -#@ return getDefaultValuesForMC() -#@ end diff --git a/providers/yttcc/01_plans/dev.yaml b/providers/yttcc/01_plans/dev.yaml deleted file mode 100644 index 4d65a30d76..0000000000 --- a/providers/yttcc/01_plans/dev.yaml +++ /dev/null @@ -1,26 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ if data.values.CLUSTER_PLAN == "dev" or data.values.CLUSTER_PLAN == "devcc": -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - tkg/plan: dev - #! possible other customizations specific to the dev plan.... - -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"TanzuKubernetesCluster"}) ---- -apiVersion: run.tanzu.vmware.com/v1alpha2 -kind: TanzuKubernetesCluster -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - tkg/plan: dev - #! possible other customizations specific to the dev plan.... -#@ end diff --git a/providers/yttcc/01_plans/prod.yaml b/providers/yttcc/01_plans/prod.yaml deleted file mode 100644 index a90b640bbb..0000000000 --- a/providers/yttcc/01_plans/prod.yaml +++ /dev/null @@ -1,26 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ if data.values.CLUSTER_PLAN == "prod" or data.values.CLUSTER_PLAN == "prodcc": -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - tkg/plan: prod - #! possible other customizations specific to the prod plan.... - -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"TanzuKubernetesCluster"}) ---- -apiVersion: run.tanzu.vmware.com/v1alpha2 -kind: TanzuKubernetesCluster -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - tkg/plan: prod - #! possible other customizations specific to the prod plan.... -#@ end diff --git a/providers/yttcc/02_customizations/add_avi_labels.yaml b/providers/yttcc/02_customizations/add_avi_labels.yaml deleted file mode 100644 index 5d3840b0fc..0000000000 --- a/providers/yttcc/02_customizations/add_avi_labels.yaml +++ /dev/null @@ -1,17 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:template", "template") - - -#! Label workload cluster if AVI_LABELS is specified - -#@ if data.values.PROVIDER_TYPE == "vsphere" and data.values.TKG_CLUSTER_ROLE != "management" and data.values.AVI_LABELS: -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - #@overlay/match-child-defaults missing_ok=True - labels: - _: #@ template.replace(data.values.AVI_LABELS) -#@ end diff --git a/providers/yttcc/02_customizations/annotate_os_info.yaml b/providers/yttcc/02_customizations/annotate_os_info.yaml deleted file mode 100644 index 06b3c8dd97..0000000000 --- a/providers/yttcc/02_customizations/annotate_os_info.yaml +++ /dev/null @@ -1,12 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match missing_ok=True,by=overlay.subset({"kind":"Cluster"}) ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - #@overlay/match missing_ok=True - annotations: - #@overlay/match missing_ok=True - osInfo: #@ "{},{},{}".format(data.values.OS_NAME, data.values.OS_VERSION, data.values.OS_ARCH) diff --git a/providers/yttcc/02_customizations/autoscaler/enable_autoscaler.yaml b/providers/yttcc/02_customizations/autoscaler/enable_autoscaler.yaml deleted file mode 100644 index 82d6e19e26..0000000000 --- a/providers/yttcc/02_customizations/autoscaler/enable_autoscaler.yaml +++ /dev/null @@ -1,245 +0,0 @@ -#@ load("@ytt:data", "data") -#@ load("/lib/helpers.star", "get_default_tkg_bom_data", "get_image_repo_for_component") - -#@ if data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@ bomData = get_default_tkg_bom_data() -#@ end - -#@ def autoscaler_label(): -#@ return "{}-cluster-autoscaler".format(data.values.CLUSTER_NAME) -#@ end - -#@ def autoscaler_image(): -#@ if not hasattr(bomData.components, 'kubernetes_autoscaler'): -#@ fail("autoscaler is not supported for TKG version " + data.values.TKG_VERSION) -#@ end -#@ -#@ majorVersion, minorVersion, _, _ = data.values.KUBERNETES_VERSION.split(".") -#@ k8sVersionPrefix = majorVersion + "." + minorVersion -#@ -#@ for autoscaler_version in bomData.components.kubernetes_autoscaler: -#@ if autoscaler_version.version.startswith(k8sVersionPrefix): -#@ return "{}/{}:{}".format(get_image_repo_for_component(autoscaler_version.images.kubernetesAutoscalerImage), autoscaler_version.images.kubernetesAutoscalerImage.imagePath, autoscaler_version.images.kubernetesAutoscalerImage.tag) -#@ end -#@ end -#@ fail("autoscaler is not supported for k8s version " + data.values.KUBERNETES_VERSION) -#@ end - -#@ def autoscaler_volume_name(): -#@ return "{}-cluster-autoscaler-volume".format(data.values.CLUSTER_NAME) -#@ end - -#@ def autoscaler_kubeconfig_mount_path(): -#@ return "/mnt/{}-kubeconfig".format(data.values.CLUSTER_NAME) -#@ end - -#@ def autoscaler_args(): -#@ args = ["--cloud-provider=clusterapi"] -#@ args.append("--v=4") -#@ args.append("--clusterapi-cloud-config-authoritative") -#@ args.append("--kubeconfig=" + autoscaler_kubeconfig_mount_path() + "/value") -#@ args.append("--node-group-auto-discovery=clusterapi:clusterName=" + data.values.CLUSTER_NAME +",namespace=" +data.values.NAMESPACE) -#@ args.append("--scale-down-delay-after-add=" + data.values.AUTOSCALER_SCALE_DOWN_DELAY_AFTER_ADD) -#@ args.append("--scale-down-delay-after-delete=" + data.values.AUTOSCALER_SCALE_DOWN_DELAY_AFTER_DELETE) -#@ args.append("--scale-down-delay-after-failure=" + data.values.AUTOSCALER_SCALE_DOWN_DELAY_AFTER_FAILURE) -#@ args.append("--scale-down-unneeded-time=" + data.values.AUTOSCALER_SCALE_DOWN_UNNEEDED_TIME) -#@ args.append("--max-node-provision-time=" + data.values.AUTOSCALER_MAX_NODE_PROVISION_TIME) -#@ args.append("--max-nodes-total=" + "{}".format(data.values.AUTOSCALER_MAX_NODES_TOTAL)) -#@ return args -#@ end - -#@ if data.values.TKG_CLUSTER_ROLE == "workload" and data.values.ENABLE_AUTOSCALER and data.values.PROVIDER_TYPE != "tkg-service-vsphere": ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: #@ "{}-cluster-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE - labels: - app: #@ autoscaler_label() -spec: - selector: - matchLabels: - app: #@ autoscaler_label() - replicas: 1 - template: - metadata: - labels: - app: #@ autoscaler_label() - spec: - containers: - - image: #@ autoscaler_image() - name: #@ "{}-cluster-autoscaler".format(data.values.CLUSTER_NAME) - volumeMounts: - - name: #@ autoscaler_volume_name() - mountPath: #@ autoscaler_kubeconfig_mount_path() - readOnly: true - command: - - /cluster-autoscaler - args: #@ autoscaler_args() - volumes: - - name: #@ autoscaler_volume_name() - secret: - secretName: #@ "{}-kubeconfig".format(data.values.CLUSTER_NAME) - serviceAccountName: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - terminationGracePeriodSeconds: 10 - tolerations: - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: #@ "{}-autoscaler-workload".format(data.values.CLUSTER_NAME) -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-autoscaler-workload -subjects: - - kind: ServiceAccount - name: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: #@ "{}-autoscaler-management".format(data.values.CLUSTER_NAME) -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-autoscaler-management -subjects: - - kind: ServiceAccount - name: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: #@ "{}-autoscaler".format(data.values.CLUSTER_NAME) - namespace: #@ data.values.NAMESPACE ---- -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: cluster-autoscaler-workload -rules: - - apiGroups: - - "" - resources: - - persistentvolumeclaims - - persistentvolumes - - pods - - replicationcontrollers - verbs: - - get - - list - - watch - - apiGroups: - - "" - resources: - - nodes - verbs: - - get - - list - - update - - watch - - apiGroups: - - "" - resources: - - pods/eviction - verbs: - - create - - apiGroups: - - policy - resources: - - poddisruptionbudgets - verbs: - - list - - watch - - apiGroups: - - storage.k8s.io - resources: - - csinodes - - storageclasses - verbs: - - get - - list - - watch - - apiGroups: - - batch - resources: - - jobs - verbs: - - list - - watch - - apiGroups: - - apps - resources: - - daemonsets - - replicasets - - statefulsets - verbs: - - list - - watch - - apiGroups: - - "" - resources: - - events - verbs: - - create - - patch - - apiGroups: - - "" - resources: - - configmaps - verbs: - - create - - delete - - get - - update - - apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - create - - get - - update ---- -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: cluster-autoscaler-management -rules: - - apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments - - machines - - machinesets - verbs: - - get - - list - - update - - watch - - patch - - apiGroups: - - cluster.x-k8s.io - resources: - - machinedeployments/scale - - machinesets/scale - verbs: - - get - - update - - apiGroups: - - infrastructure.cluster.x-k8s.io - resources: - - '*' - verbs: - - get - - list - -#@ end diff --git a/providers/yttcc/02_customizations/autoscaler/overlay_cluster.yaml b/providers/yttcc/02_customizations/autoscaler/overlay_cluster.yaml deleted file mode 100644 index 67ab50d786..0000000000 --- a/providers/yttcc/02_customizations/autoscaler/overlay_cluster.yaml +++ /dev/null @@ -1,40 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ if data.values.TKG_CLUSTER_ROLE == "workload" and data.values.ENABLE_AUTOSCALER and data.values.PROVIDER_TYPE != "tkg-service-vsphere": -#@overlay/match by=overlay.subset({"kind":"Cluster"}) ---- -#@overlay/match-child-defaults missing_ok=True -spec: - topology: - workers: - machineDeployments: - #@overlay/match by=overlay.index(0) - - class: tkg-worker - name: md-0 - #@overlay/remove - replicas: - metadata: - annotations: - cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: #@ "{}".format(data.values.AUTOSCALER_MIN_SIZE_0 or data.values.WORKER_MACHINE_COUNT_0) - cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: #@ "{}".format(data.values.AUTOSCALER_MAX_SIZE_0 or data.values.WORKER_MACHINE_COUNT_0) - #@ if data.values.CLUSTER_PLAN == "prodcc": - #@overlay/match by=overlay.index(1) - - class: tkg-worker - name: md-1 - #@overlay/remove - replicas: - metadata: - annotations: - cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: #@ "{}".format(data.values.AUTOSCALER_MIN_SIZE_1 or data.values.WORKER_MACHINE_COUNT_1) - cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: #@ "{}".format(data.values.AUTOSCALER_MAX_SIZE_1 or data.values.WORKER_MACHINE_COUNT_1) - #@overlay/match by=overlay.index(2) - - class: tkg-worker - name: md-2 - #@overlay/remove - replicas: - metadata: - annotations: - cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: #@ "{}".format(data.values.AUTOSCALER_MIN_SIZE_2 or data.values.WORKER_MACHINE_COUNT_2) - cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: #@ "{}".format(data.values.AUTOSCALER_MAX_SIZE_2 or data.values.WORKER_MACHINE_COUNT_2) - #@ end -#@ end diff --git a/providers/yttcc/09_miscellaneous/09_filter.yaml b/providers/yttcc/09_miscellaneous/09_filter.yaml deleted file mode 100644 index c8be01e380..0000000000 --- a/providers/yttcc/09_miscellaneous/09_filter.yaml +++ /dev/null @@ -1,31 +0,0 @@ -#! This file should be processed very last as it removes some specific components from the cluster template -#! that can be needed by some other overlay file that is trying to apply specific overlays to certain objects -#! Processing the file at the very end makes sure that we are removing the objects after they are processed. -#! -#! The job of this overlay is to allow the following command to keep working for classy clusters: -#! `FILTER_BY_ADDON_TYPE="authentication/pinniped" tanzu management-cluster create --dry-run ...` -#! This is the documented method for end users to generate or update Pinniped configuration for an already existing cluster. - -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@ if data.values.FILTER_BY_ADDON_TYPE: - -#@ def filter_addons_objects_by_type(x, l, r): -#@ -#@ if not ("metadata" in l and "annotations" in l["metadata"] and "tkg.tanzu.vmware.com/addon-type" in l["metadata"]["annotations"]): -#@ return True -#@ end -#@ -#@ if (l["metadata"]["annotations"]["tkg.tanzu.vmware.com/addon-type"] in data.values.FILTER_BY_ADDON_TYPE.split(",")): -#@ return False -#@ end -#@ -#@ return True -#@ end - -#@overlay/match by=filter_addons_objects_by_type,expects="0+" ---- -#@overlay/remove - -#@ end diff --git a/providers/yttcc/lib/config_variable_association.star b/providers/yttcc/lib/config_variable_association.star deleted file mode 100644 index d91564f2e8..0000000000 --- a/providers/yttcc/lib/config_variable_association.star +++ /dev/null @@ -1,1102 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:overlay", "overlay") -load("@ytt:yaml", "yaml") -load("/lib/helpers.star", "get_default_tkg_bom_data", "get_labels_array_from_string", "get_extra_args_map_from_string") -load("/lib/helpers.star", "get_custom_keys", "valid_pci_devices_list", "get_pci_devices", "get_image_registry") - -#! This file contains function 'config_variable_association' which specifies all configuration variables -#! mentioned in 'config_default.yaml' and describes association of each configuration variable with -#! the corresponding infrastructure providers. -#! Please make sure to add config variable to this file if you add new config variable to 'config_default.yaml' - -def config_variable_association(): - -return { -"CLUSTER_NAME": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker", "oci"], -"CLUSTER_PLAN": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker", "oci"], -"NAMESPACE": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker", "oci"], -"INFRASTRUCTURE_PROVIDER": ["vsphere", "aws", "azure", "docker", "oci"], -"IS_WINDOWS_WORKLOAD_CLUSTER": ["vsphere"], - -"CLUSTER_API_SERVER_PORT": ["vsphere", "aws", "azure", "oci"], - -"SIZE": ["vsphere", "aws", "azure", "docker", "oci"], -"CONTROLPLANE_SIZE": ["vsphere", "aws", "azure", "docker", "oci"], -"WORKER_SIZE": ["vsphere", "aws", "azure", "docker", "oci"], -"CONTROLPLANE_CERTIFICATE_ROTATION_ENABLED": ["vsphere", "aws", "azure", "docker", "oci"], -"CONTROLPLANE_CERTIFICATE_ROTATION_DAYS_BEFORE": ["vsphere", "aws", "azure", "docker", "oci"], - -"ENABLE_CEIP_PARTICIPATION": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker", "oci"], -"DEPLOY_TKG_ON_VSPHERE7": ["vsphere"], -"ENABLE_TKGS_ON_VSPHERE7": ["vsphere"], - -"VSPHERE_NUM_CPUS": ["vsphere"], -"VSPHERE_DISK_GIB": ["vsphere"], -"VSPHERE_MEM_MIB": ["vsphere"], -"VSPHERE_CONTROL_PLANE_NUM_CPUS": ["vsphere"], -"VSPHERE_CONTROL_PLANE_DISK_GIB": ["vsphere"], -"VSPHERE_CONTROL_PLANE_MEM_MIB": ["vsphere"], -"VSPHERE_WORKER_NUM_CPUS": ["vsphere"], -"VSPHERE_WORKER_DISK_GIB": ["vsphere"], -"VSPHERE_WORKER_MEM_MIB": ["vsphere"], -"VSPHERE_CLONE_MODE": ["vsphere"], -"VSPHERE_NETWORK": ["vsphere"], -"VSPHERE_TEMPLATE": ["vsphere"], -"VSPHERE_WINDOWS_TEMPLATE": ["windows-vsphere"], -"VIP_NETWORK_INTERFACE": ["vsphere"], -"VSPHERE_SSH_AUTHORIZED_KEY": ["vsphere"], -"VSPHERE_USERNAME": ["vsphere"], -"VSPHERE_PASSWORD": ["vsphere"], -"VSPHERE_REGION": ["vsphere"], -"VSPHERE_ZONE": ["vsphere"], -"VSPHERE_SERVER": ["vsphere"], -"VSPHERE_DATACENTER": ["vsphere"], -"VSPHERE_RESOURCE_POOL": ["vsphere"], -"VSPHERE_DATASTORE": ["vsphere"], -"VSPHERE_FOLDER": ["vsphere"], -"VSPHERE_STORAGE_POLICY_ID": ["vsphere"], -"VSPHERE_TLS_THUMBPRINT": ["vsphere"], -"VSPHERE_INSECURE": ["vsphere"], -"VSPHERE_CONTROL_PLANE_ENDPOINT": ["vsphere"], -"VSPHERE_CONTROL_PLANE_ENDPOINT_PORT": ["vsphere"], -"VSPHERE_WORKER_PCI_DEVICES": ["vsphere"], -"VSPHERE_CONTROL_PLANE_PCI_DEVICES": ["vsphere"], -"VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST": ["vsphere"], -"VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS": ["vsphere"], -"VSPHERE_WORKER_CUSTOM_VMX_KEYS": ["vsphere"], -"VSPHERE_CONTROL_PLANE_HARDWARE_VERSION": ["vsphere"], -"VSPHERE_WORKER_HARDWARE_VERSION": ["vsphere"], - -"NSXT_POD_ROUTING_ENABLED": ["vsphere"], -"NSXT_ROUTER_PATH": ["vsphere"], -"NSXT_USERNAME": ["vsphere"], -"NSXT_PASSWORD": ["vsphere"], -"NSXT_MANAGER_HOST": ["vsphere"], -"NSXT_ALLOW_UNVERIFIED_SSL": ["vsphere"], -"NSXT_REMOTE_AUTH": ["vsphere"], -"NSXT_VMC_ACCESS_TOKEN": ["vsphere"], -"NSXT_VMC_AUTH_HOST": ["vsphere"], -"NSXT_CLIENT_CERT_KEY_DATA": ["vsphere"], -"NSXT_CLIENT_CERT_DATA": ["vsphere"], -"NSXT_ROOT_CA_DATA_B64": ["vsphere"], -"NSXT_SECRET_NAME": ["vsphere"], -"NSXT_SECRET_NAMESPACE": ["vsphere"], - -"NODE_IPAM_IP_POOL_NAME": ["vsphere"], - -"AWS_REGION": ["aws"], -"AWS_NODE_AZ": ["aws"], -"AWS_NODE_AZ_1": ["aws"], -"AWS_NODE_AZ_2": ["aws"], -"AWS_VPC_ID": ["aws"], -"AWS_PRIVATE_SUBNET_ID": ["aws"], -"AWS_PUBLIC_SUBNET_ID": ["aws"], -"AWS_PUBLIC_SUBNET_ID_1": ["aws"], -"AWS_PRIVATE_SUBNET_ID_1": ["aws"], -"AWS_PUBLIC_SUBNET_ID_2": ["aws"], -"AWS_PRIVATE_SUBNET_ID_2": ["aws"], -"AWS_VPC_CIDR": ["aws"], -"AWS_PRIVATE_NODE_CIDR": ["aws"], -"AWS_PUBLIC_NODE_CIDR": ["aws"], -"AWS_PRIVATE_NODE_CIDR_1": ["aws"], -"AWS_PUBLIC_NODE_CIDR_1": ["aws"], -"AWS_PRIVATE_NODE_CIDR_2": ["aws"], -"AWS_PUBLIC_NODE_CIDR_2": ["aws"], -"AWS_SECURITY_GROUP_APISERVER_LB": ["aws"], -"AWS_SECURITY_GROUP_BASTION": ["aws"], -"AWS_SECURITY_GROUP_CONTROLPLANE": ["aws"], -"AWS_SECURITY_GROUP_LB": ["aws"], -"AWS_SECURITY_GROUP_NODE": ["aws"], -"AWS_IDENTITY_REF_KIND": ["aws"], -"AWS_IDENTITY_REF_NAME": ["aws"], -"AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB": ["aws"], -"AWS_NODE_OS_DISK_SIZE_GIB": ["aws"], -"CONTROL_PLANE_MACHINE_TYPE": ["aws"], -"NODE_MACHINE_TYPE": ["aws"], -"NODE_MACHINE_TYPE_1": ["aws"], -"NODE_MACHINE_TYPE_2": ["aws"], -"AWS_SSH_KEY_NAME": ["aws"], -"BASTION_HOST_ENABLED": ["aws"], -"AWS_LOAD_BALANCER_SCHEME_INTERNAL": ["aws"], - -"CONTROL_PLANE_STORAGE_CLASS": ["tkg-service-vsphere"], -"CONTROL_PLANE_VM_CLASS": ["tkg-service-vsphere"], -"DEFAULT_STORAGE_CLASS": ["tkg-service-vsphere"], -"SERVICE_DOMAIN": ["tkg-service-vsphere"], -"STORAGE_CLASSES": ["tkg-service-vsphere"], -"WORKER_STORAGE_CLASS": ["tkg-service-vsphere"], -"WORKER_VM_CLASS": ["tkg-service-vsphere"], -"KUBERNETES_RELEASE": ["tkg-service-vsphere"], -"NODE_POOL_0_NAME": ["tkg-service-vsphere"], -"NODE_POOL_0_LABELS": ["tkg-service-vsphere"], -"NODE_POOL_0_TAINTS": ["tkg-service-vsphere"], -"CONTROL_PLANE_NODE_LABELS": ["vsphere", "aws", "azure"], -"ETCD_EXTRA_ARGS": ["vsphere", "aws", "azure", "oci"], -"APISERVER_EXTRA_ARGS": ["vsphere", "aws", "azure", "oci"], -"KUBE_SCHEDULER_EXTRA_ARGS": ["vsphere", "aws", "azure", "oci"], -"KUBE_CONTROLLER_MANAGER_EXTRA_ARGS": ["vsphere", "aws", "azure", "oci"], -"CONTROLPLANE_KUBELET_EXTRA_ARGS": ["vsphere", "aws", "azure", "oci"], -"WORKER_KUBELET_EXTRA_ARGS": ["vsphere", "aws", "azure", "oci"], - -"AZURE_ENVIRONMENT": ["azure"], -"AZURE_TENANT_ID": ["azure"], -"AZURE_SUBSCRIPTION_ID": ["azure"], -"AZURE_CLIENT_ID": ["azure"], -"AZURE_CLIENT_SECRET": ["azure"], -"AZURE_LOCATION": ["azure"], -"AZURE_SSH_PUBLIC_KEY_B64": ["azure"], -"AZURE_CONTROL_PLANE_MACHINE_TYPE": ["azure"], -"AZURE_NODE_MACHINE_TYPE": ["azure"], -"AZURE_ENABLE_ACCELERATED_NETWORKING": ["azure"], -"AZURE_RESOURCE_GROUP": ["azure"], -"AZURE_VNET_RESOURCE_GROUP": ["azure"], -"AZURE_VNET_NAME": ["azure"], -"AZURE_VNET_CIDR": ["azure"], -"AZURE_CONTROL_PLANE_SUBNET_NAME": ["azure"], -"AZURE_CONTROL_PLANE_SUBNET_CIDR": ["azure"], -"AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP": ["azure"], -"AZURE_NODE_SUBNET_NAME": ["azure"], -"AZURE_NODE_SUBNET_CIDR": ["azure"], -"AZURE_NODE_SUBNET_SECURITY_GROUP": ["azure"], -"AZURE_NODE_AZ": ["azure"], -"AZURE_NODE_AZ_1": ["azure"], -"AZURE_NODE_AZ_2": ["azure"], -"AZURE_CUSTOM_TAGS": ["azure"], -"AZURE_CONTROL_PLANE_OS_DISK_SIZE_GIB": ["azure"], -"AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE": ["azure"], -"AZURE_NODE_OS_DISK_SIZE_GIB": ["azure"], -"AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE": ["azure"], -"AZURE_CONTROL_PLANE_DATA_DISK_SIZE_GIB": ["azure"], -"AZURE_ENABLE_NODE_DATA_DISK": ["azure"], -"AZURE_NODE_DATA_DISK_SIZE_GIB": ["azure"], -"AZURE_ENABLE_PRIVATE_CLUSTER": ["azure"], -"AZURE_FRONTEND_PRIVATE_IP": ["azure"], -"AZURE_IMAGE_ID": ["azure"], -"AZURE_IMAGE_RESOURCE_GROUP": ["azure"], -"AZURE_IMAGE_NAME": ["azure"], -"AZURE_IMAGE_SUBSCRIPTION_ID": ["azure"], -"AZURE_IMAGE_GALLERY": ["azure"], -"AZURE_IMAGE_PUBLISHER": ["azure"], -"AZURE_IMAGE_OFFER": ["azure"], -"AZURE_IMAGE_SKU": ["azure"], -"AZURE_IMAGE_THIRD_PARTY": ["azure"], -"AZURE_IMAGE_VERSION": ["azure"], -"AZURE_IDENTITY_NAME": ["azure"], -"AZURE_IDENTITY_NAMESPACE": ["azure"], -"AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT": ["azure"], -"AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB": ["azure"], -"AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT": ["azure"], -"AZURE_ENABLE_NODE_OUTBOUND_LB": ["azure"], -"AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES": ["azure"], -"ENABLE_OIDC": ["vsphere", "aws", "azure", "docker"], -"OIDC_ISSUER_URL": ["vsphere", "aws", "azure", "docker"], -"OIDC_USERNAME_CLAIM": ["vsphere", "aws", "azure", "docker"], -"OIDC_GROUPS_CLAIM": ["vsphere", "aws", "azure", "docker"], -"OIDC_DEX_CA": ["vsphere", "aws", "azure", "docker"], - -"ENABLE_MHC": ["vsphere", "aws", "azure", "docker", "oci"], -"ENABLE_MHC_WORKER_NODE": ["vsphere", "aws", "azure", "docker", "oci"], -"ENABLE_MHC_CONTROL_PLANE": ["vsphere", "aws", "azure", "docker", "oci"], -"MHC_UNKNOWN_STATUS_TIMEOUT": ["vsphere", "aws", "azure", "docker", "oci"], -"MHC_FALSE_STATUS_TIMEOUT": ["vsphere", "aws", "azure", "docker", "oci"], -"MHC_MAX_UNHEALTHY_CONTROL_PLANE": ["vsphere", "aws", "azure", "docker", "oci"], -"MHC_MAX_UNHEALTHY_WORKER_NODE": ["vsphere", "aws", "azure", "docker", "oci"], - -"TKG_CUSTOM_IMAGE_REPOSITORY": ["vsphere", "aws", "azure", "docker", "oci"], -"TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY": ["vsphere", "aws", "azure", "docker", "oci"], -"TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE": ["vsphere", "aws", "azure", "docker", "oci"], - -"ADDITIONAL_IMAGE_REGISTRY_1": ["vsphere", "aws", "azure", "docker"], -"ADDITIONAL_IMAGE_REGISTRY_1_SKIP_TLS_VERIFY": ["vsphere", "aws", "azure", "docker"], -"ADDITIONAL_IMAGE_REGISTRY_1_CA_CERTIFICATE": ["vsphere", "aws", "azure", "docker"], -"ADDITIONAL_IMAGE_REGISTRY_2": ["vsphere", "aws", "azure", "docker"], -"ADDITIONAL_IMAGE_REGISTRY_2_SKIP_TLS_VERIFY": ["vsphere", "aws", "azure", "docker"], -"ADDITIONAL_IMAGE_REGISTRY_2_CA_CERTIFICATE": ["vsphere", "aws", "azure", "docker"], -"ADDITIONAL_IMAGE_REGISTRY_3": ["vsphere", "aws", "azure", "docker"], -"ADDITIONAL_IMAGE_REGISTRY_3_SKIP_TLS_VERIFY": ["vsphere", "aws", "azure", "docker"], -"ADDITIONAL_IMAGE_REGISTRY_3_CA_CERTIFICATE": ["vsphere", "aws", "azure", "docker"], - -"TKG_HTTP_PROXY": ["vsphere", "aws", "azure", "docker", "oci"], -"TKG_HTTPS_PROXY": ["vsphere", "aws", "azure", "docker", "oci"], -"TKG_NO_PROXY": ["vsphere", "aws", "azure", "docker", "oci"], -"TKG_PROXY_CA_CERT": ["vsphere", "aws", "azure", "docker", "oci"], -"TKG_NODE_SYSTEM_WIDE_PROXY": ["vsphere"], - -"CUSTOM_TDNF_REPOSITORY_CERTIFICATE": ["vsphere"], - -"TKG_IP_FAMILY": ["vsphere", "aws", "azure", "docker", "oci"], - -"ENABLE_AUDIT_LOGGING": ["vsphere", "aws", "azure", "docker", "oci"], - -"ENABLE_DEFAULT_STORAGE_CLASS": ["vsphere", "aws", "azure", "docker", "oci"], - -"CLUSTER_CIDR": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker", "oci"], -"SERVICE_CIDR": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker", "oci"], -"NODE_STARTUP_TIMEOUT": ["vsphere", "aws", "azure", "docker", "oci"], - -"CONTROL_PLANE_MACHINE_COUNT": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker", "oci"], -"WORKER_MACHINE_COUNT": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker", "oci"], -"WORKER_MACHINE_COUNT_0": ["vsphere", "aws", "azure", "docker", "oci"], -"WORKER_MACHINE_COUNT_1": ["vsphere", "aws", "azure", "docker", "oci"], -"WORKER_MACHINE_COUNT_2": ["vsphere", "aws", "azure", "docker", "oci"], - -"OS_NAME": ["vsphere", "aws", "azure", "docker", "oci"], -"OS_VERSION": ["vsphere", "aws", "azure", "docker", "oci"], -"OS_ARCH": ["vsphere", "aws", "azure", "docker", "oci"], - -"ENABLE_AUTOSCALER": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_MAX_NODES_TOTAL": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_SCALE_DOWN_DELAY_AFTER_ADD": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_SCALE_DOWN_DELAY_AFTER_DELETE": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_SCALE_DOWN_DELAY_AFTER_FAILURE": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_SCALE_DOWN_UNNEEDED_TIME": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_MAX_NODE_PROVISION_TIME": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_MIN_SIZE_0": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_MAX_SIZE_0": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_MIN_SIZE_1": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_MAX_SIZE_1": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_MIN_SIZE_2": ["vsphere", "aws", "azure", "docker", "oci"], -"AUTOSCALER_MAX_SIZE_2": ["vsphere", "aws", "azure", "docker", "oci"], - -"DOCKER_MACHINE_TEMPLATE_IMAGE": ["docker"], - -"IDENTITY_MANAGEMENT_TYPE": ["vsphere", "aws", "azure", "docker", "oci"], -"CERT_DURATION": ["vsphere", "aws", "azure", "docker", "oci"], -"CERT_RENEW_BEFORE": ["vsphere", "aws", "azure", "docker", "oci"], -"OIDC_IDENTITY_PROVIDER_NAME": ["vsphere", "aws", "azure", "docker", "oci"], -"OIDC_IDENTITY_PROVIDER_ISSUER_URL": ["vsphere", "aws", "azure", "docker", "oci"], -"OIDC_IDENTITY_PROVIDER_CLIENT_ID": ["vsphere", "aws", "azure", "docker", "oci"], -"OIDC_IDENTITY_PROVIDER_CLIENT_SECRET": ["vsphere", "aws", "azure", "docker", "oci"], -"OIDC_IDENTITY_PROVIDER_SCOPES": ["vsphere", "aws", "azure", "docker", "oci"], -"OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM": ["vsphere", "aws", "azure", "docker", "oci"], -"OIDC_IDENTITY_PROVIDER_GROUPS_CLAIM": ["vsphere", "aws", "azure", "docker", "oci"], -"SUPERVISOR_ISSUER_URL": ["vsphere", "aws", "azure", "docker", "oci"], -"SUPERVISOR_ISSUER_CA_BUNDLE_DATA_B64": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_BIND_DN": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_BIND_PASSWORD": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_HOST": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_USER_SEARCH_BASE_DN": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_USER_SEARCH_FILTER": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_USER_SEARCH_USERNAME": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_USER_SEARCH_ID_ATTRIBUTE": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_USER_SEARCH_EMAIL_ATTRIBUTE": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_USER_SEARCH_NAME_ATTRIBUTE": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_GROUP_SEARCH_BASE_DN": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_GROUP_SEARCH_FILTER": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_GROUP_SEARCH_USER_ATTRIBUTE": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_GROUP_SEARCH_NAME_ATTRIBUTE": ["vsphere", "aws", "azure", "docker", "oci"], -"LDAP_ROOT_CA_DATA_B64": ["vsphere", "aws", "azure", "docker", "oci"], - -"AVI_ENABLE": ["vsphere"], -"AVI_NAMESPACE": ["vsphere"], -"AVI_DISABLE_INGRESS_CLASS": ["vsphere"], -"AVI_AKO_IMAGE_PULL_POLICY": ["vsphere"], -"AVI_ADMIN_CREDENTIAL_NAME": ["vsphere"], -"AVI_CA_NAME": ["vsphere"], -"AVI_CONTROLLER": ["vsphere"], -"AVI_USERNAME": ["vsphere"], -"AVI_PASSWORD": ["vsphere"], -"AVI_CLOUD_NAME": ["vsphere"], -"AVI_SERVICE_ENGINE_GROUP": ["vsphere"], -"AVI_DATA_NETWORK": ["vsphere"], -"AVI_DATA_NETWORK_CIDR": ["vsphere"], -"AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME": ["vsphere"], -"AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR": ["vsphere"], -"AVI_CA_DATA_B64": ["vsphere"], -"AVI_LABELS": ["vsphere"], -"AVI_DISABLE_STATIC_ROUTE_SYNC": ["vsphere"], -"AVI_INGRESS_DEFAULT_INGRESS_CONTROLLER": ["vsphere"], -"AVI_INGRESS_SHARD_VS_SIZE": ["vsphere"], -"AVI_INGRESS_SERVICE_TYPE": ["vsphere"], -"AVI_INGRESS_NODE_NETWORK_LIST": ["vsphere"], -"AVI_CONTROL_PLANE_HA_PROVIDER": ["vsphere"], - -"ANTREA_NO_SNAT": ["vsphere", "aws", "azure", "docker", "oci"], -"ANTREA_TRAFFIC_ENCAP_MODE": ["vsphere", "aws", "azure", "docker", "oci"], -"ANTREA_PROXY": ["vsphere", "aws", "azure", "docker", "oci"], -"ANTREA_ENDPOINTSLICE": ["vsphere", "aws", "azure", "docker", "oci"], -"ANTREA_POLICY": ["vsphere", "aws", "azure", "docker", "oci"], -"ANTREA_NODEPORTLOCAL": ["vsphere", "aws", "azure", "docker", "oci"], -"ANTREA_TRACEFLOW": ["vsphere", "aws", "azure", "docker", "oci"], -"ANTREA_DISABLE_UDP_TUNNEL_OFFLOAD": ["vsphere", "aws", "azure", "docker", "oci"], - -"OCI_IMAGE_ID": ["oci"], -"OCI_REGION": ["oci"], -"OCI_COMPARTMENT_ID": ["oci"], -"OCI_NODE_MACHINE_TYPE": ["oci"], -"OCI_NODE_MACHINE_TYPE_OCPUS": ["oci"], -"OCI_SSH_KEY": ["oci"], -"OCI_NODE_PV_TRANSIT_ENCRYPTION": ["oci"], -"OCI_CONTROL_PLANE_MACHINE_TYPE": ["oci"], -"OCI_CONTROL_PLANE_MACHINE_TYPE_OCPUS": ["oci"], -"OCI_CONTROL_PLANE_PV_TRANSIT_ENCRYPTION": ["oci"], - -"KUBEVIP_LOADBALANCER_ENABLE": ["vsphere"], -"KUBEVIP_LOADBALANCER_CIDRS": ["vsphere"], -"KUBEVIP_LOADBALANCER_IP_RANGES": ["vsphere"], - -"POD_SECURITY_STANDARD_DEACTIVATED": ["vsphere", "aws", "azure", "docker", "oci"], -"POD_SECURITY_STANDARD_AUDIT": ["vsphere", "aws", "azure", "docker", "oci"], -"POD_SECURITY_STANDARD_WARN": ["vsphere", "aws", "azure", "docker", "oci"], -"POD_SECURITY_STANDARD_ENFORCE": ["vsphere", "aws", "azure", "docker", "oci"], - -"PROVIDER_TYPE": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker", "oci"], -"TKG_CLUSTER_ROLE": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker", "oci"], -"TKG_VERSION": ["vsphere", "aws", "azure", "tkg-service-vsphere", "docker", "oci"], -"CNI": ["vsphere", "aws", "azure", "docker", "oci"], -"VSPHERE_VERSION": ["vsphere"], - -"APISERVER_EVENT_RATE_LIMIT_CONF_BASE64": ["vsphere", "aws", "azure", "docker", "oci"] -} - -end - -def get_cluster_variables(): - vars = {} - kvs = config_variable_association() - - for configVariable in kvs: - if data.values.PROVIDER_TYPE in kvs[configVariable]: - if data.values[configVariable] != None: - vars[configVariable] = data.values[configVariable] - else: - continue - end - if configVariable == "TKG_HTTP_PROXY": - if data.values["TKG_HTTP_PROXY"] != "": - vars["proxy"] = { - "httpProxy": data.values["TKG_HTTP_PROXY"], - "httpsProxy": data.values["TKG_HTTPS_PROXY"], - "noProxy": data.values["TKG_NO_PROXY"].split(","), - "systemWide": data.values["TKG_NODE_SYSTEM_WIDE_PROXY"], - } - end - end - end - end - - network = {} - if data.values["TKG_IP_FAMILY"] == "ipv6,ipv4": - network["ipv6Primary"] = True - end - - if data.values["NODE_IPAM_IP_POOL_NAME"] != "": - network["addressesFromPools"] = [{ - "apiGroup": "ipam.cluster.x-k8s.io", - "kind": "InClusterIPPool", - "name": data.values["NODE_IPAM_IP_POOL_NAME"], - }] - end - - if network != {}: - vars["network"] = network - end - - vars["cni"] = data.values["CNI"] - - customControlPlaneCertificateRotation = {} - if data.values["CONTROLPLANE_CERTIFICATE_ROTATION_ENABLED"] != "": - customControlPlaneCertificateRotation["activate"] = data.values["CONTROLPLANE_CERTIFICATE_ROTATION_ENABLED"] - end - if data.values["CONTROLPLANE_CERTIFICATE_ROTATION_DAYS_BEFORE"] != "": - customControlPlaneCertificateRotation["daysBefore"] = data.values["CONTROLPLANE_CERTIFICATE_ROTATION_DAYS_BEFORE"] - end - if customControlPlaneCertificateRotation != {}: - vars["controlPlaneCertificateRotation"] = customControlPlaneCertificateRotation - end - - customImageRepository = {} - if data.values["TKG_CUSTOM_IMAGE_REPOSITORY"] != "": - customImageRepository["host"] = data.values["TKG_CUSTOM_IMAGE_REPOSITORY"] - end - if data.values["TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY"] != False: - customImageRepository["tlsCertificateValidation"] = not data.values["TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY"] - end - - if customImageRepository != {}: - vars["imageRepository"] = customImageRepository - end - - additionalImageRegistries = [] - imageRegistry1 = get_image_registry(data.values["ADDITIONAL_IMAGE_REGISTRY_1"], data.values["ADDITIONAL_IMAGE_REGISTRY_1_SKIP_TLS_VERIFY"], data.values["ADDITIONAL_IMAGE_REGISTRY_1_CA_CERTIFICATE"]) - if imageRegistry1 != None: - additionalImageRegistries.append(imageRegistry1) - end - imageRegistry2 = get_image_registry(data.values["ADDITIONAL_IMAGE_REGISTRY_2"], data.values["ADDITIONAL_IMAGE_REGISTRY_2_SKIP_TLS_VERIFY"], data.values["ADDITIONAL_IMAGE_REGISTRY_2_CA_CERTIFICATE"]) - if imageRegistry2 != None: - additionalImageRegistries.append(imageRegistry2) - end - imageRegistry3 = get_image_registry(data.values["ADDITIONAL_IMAGE_REGISTRY_3"], data.values["ADDITIONAL_IMAGE_REGISTRY_3_SKIP_TLS_VERIFY"], data.values["ADDITIONAL_IMAGE_REGISTRY_3_CA_CERTIFICATE"]) - if imageRegistry3 != None: - additionalImageRegistries.append(imageRegistry3) - end - if len(additionalImageRegistries) > 0: - vars["additionalImageRegistries"] = additionalImageRegistries - end - - if data.values["TKG_CLUSTER_ROLE"] != "": - vars["clusterRole"] = data.values["TKG_CLUSTER_ROLE"] - end - - if data.values["ENABLE_AUDIT_LOGGING"] != "": - vars["auditLogging"] = { - "enabled": data.values["ENABLE_AUDIT_LOGGING"] - } - end - - if data.values["ETCD_EXTRA_ARGS"] != None and data.values["ETCD_EXTRA_ARGS"] != "": - vars["etcdExtraArgs"] = get_extra_args_map_from_string(data.values["ETCD_EXTRA_ARGS"]) - end - if data.values["APISERVER_EXTRA_ARGS"] != None and data.values["APISERVER_EXTRA_ARGS"] != "": - vars["apiServerExtraArgs"] = get_extra_args_map_from_string(data.values["APISERVER_EXTRA_ARGS"]) - end - if data.values["KUBE_SCHEDULER_EXTRA_ARGS"] != None and data.values["KUBE_SCHEDULER_EXTRA_ARGS"] != "": - vars["kubeSchedulerExtraArgs"] = get_extra_args_map_from_string(data.values["KUBE_SCHEDULER_EXTRA_ARGS"]) - end - if data.values["KUBE_CONTROLLER_MANAGER_EXTRA_ARGS"] != None and data.values["KUBE_CONTROLLER_MANAGER_EXTRA_ARGS"] != "": - vars["kubeControllerManagerExtraArgs"] = get_extra_args_map_from_string(data.values["KUBE_CONTROLLER_MANAGER_EXTRA_ARGS"]) - end - if data.values["CONTROLPLANE_KUBELET_EXTRA_ARGS"] != None and data.values["CONTROLPLANE_KUBELET_EXTRA_ARGS"] != "": - vars["controlPlaneKubeletExtraArgs"] = get_extra_args_map_from_string(data.values["CONTROLPLANE_KUBELET_EXTRA_ARGS"]) - end - if data.values["WORKER_KUBELET_EXTRA_ARGS"] != None and data.values["WORKER_KUBELET_EXTRA_ARGS"] != "": - vars["workerKubeletExtraArgs"] = get_extra_args_map_from_string(data.values["WORKER_KUBELET_EXTRA_ARGS"]) - end - - additionalTrustedCAs = [] - #! TKG_PROXY_CA_CERT has higher priority than TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE - if data.values["TKG_PROXY_CA_CERT"] != "": - additionalTrustedCAs.append({ - "name": "proxy", - "data": data.values["TKG_PROXY_CA_CERT"] - }) - elif data.values["TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE"] != "": - additionalTrustedCAs.append({ - "name": "imageRepository", - "data": data.values["TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE"] - }) - end - if len(additionalTrustedCAs) > 0: - trust = {} - trust["additionalTrustedCAs"] = additionalTrustedCAs - vars["trust"] = trust - end - - if data.values["CLUSTER_API_SERVER_PORT"] != None: - vars["apiServerPort"] = data.values["CLUSTER_API_SERVER_PORT"] - end - - if data.values["TKR_DATA"] != "": - vars["TKR_DATA"] = data.values["TKR_DATA"] - end - - podSecurityStandard = {} - if data.values["POD_SECURITY_STANDARD_DEACTIVATED"] != "": - podSecurityStandard["deactivated"] = data.values["POD_SECURITY_STANDARD_DEACTIVATED"] - end - if data.values["POD_SECURITY_STANDARD_AUDIT"] != "": - podSecurityStandard["audit"] = data.values["POD_SECURITY_STANDARD_AUDIT"] - end - if data.values["POD_SECURITY_STANDARD_WARN"] != "": - podSecurityStandard["warn"] = data.values["POD_SECURITY_STANDARD_WARN"] - end - if data.values["POD_SECURITY_STANDARD_ENFORCE"] != "": - podSecurityStandard["enforce"] = data.values["POD_SECURITY_STANDARD_ENFORCE"] - end - if podSecurityStandard != {}: - vars["podSecurityStandard"] = podSecurityStandard - end - if data.values["APISERVER_EVENT_RATE_LIMIT_CONF_BASE64"] != "": - vars["eventRateLimitConf"] = data.values["APISERVER_EVENT_RATE_LIMIT_CONF_BASE64"] - end - - return vars -end - -def get_aws_vars(): - simpleMapping = {} - simpleMapping["AWS_REGION"] = "region" - simpleMapping["AWS_SSH_KEY_NAME"] = "sshKeyName" - simpleMapping["AWS_LOAD_BALANCER_SCHEME_INTERNAL"] = "loadBalancerSchemeInternal" - - vars = get_cluster_variables() - - for key in simpleMapping: - if data.values[key] != None: - vars[simpleMapping[key]] = data.values[key] - end - end - - - vars["bastion"] = { - "enabled": data.values["BASTION_HOST_ENABLED"] - } - - if vars.get("network") == None: - vars["network"] = {} - end - - identityRef = {} - if data.values["AWS_IDENTITY_REF_NAME"] != "": - identityRef["name"] = data.values["AWS_IDENTITY_REF_NAME"] - end - if data.values["AWS_IDENTITY_REF_KIND"] != "": - identityRef["kind"] = data.values["AWS_IDENTITY_REF_KIND"] - end - vars["identityRef"] = identityRef - - vpc = {} - if data.values["AWS_VPC_ID"]: - vpc["existingID"] = data.values["AWS_VPC_ID"] - end - if data.values["AWS_VPC_CIDR"]: - vpc["cidr"] = data.values["AWS_VPC_CIDR"] - end - vars["network"]["vpc"] = vpc - - securityGroup = {} - if data.values["AWS_SECURITY_GROUP_BASTION"] != "": - securityGroup["bastion"] = data.values["AWS_SECURITY_GROUP_BASTION"] - end - if data.values["AWS_SECURITY_GROUP_APISERVER_LB"] != "": - securityGroup["apiServerLB"] = data.values["AWS_SECURITY_GROUP_APISERVER_LB"] - end - if data.values["AWS_SECURITY_GROUP_LB"] != "": - securityGroup["lb"] = data.values["AWS_SECURITY_GROUP_LB"] - end - if data.values["AWS_SECURITY_GROUP_CONTROLPLANE"] != "": - securityGroup["controlPlane"] = data.values["AWS_SECURITY_GROUP_CONTROLPLANE"] - end - if data.values["AWS_SECURITY_GROUP_NODE"] != "": - securityGroup["node"] = data.values["AWS_SECURITY_GROUP_NODE"] - end - - if securityGroup != {}: - vars["network"]["securityGroupOverrides"] = securityGroup - end - - subnets = [] - - private0 = {} - if data.values["AWS_PRIVATE_NODE_CIDR"] != "": - private0["cidr"] = data.values["AWS_PRIVATE_NODE_CIDR"] - end - if data.values["AWS_PRIVATE_SUBNET_ID"] != "": - private0["id"] = data.values["AWS_PRIVATE_SUBNET_ID"] - end - public0 = {} - if data.values["AWS_PUBLIC_NODE_CIDR"] != "": - public0["cidr"] = data.values["AWS_PUBLIC_NODE_CIDR"] - end - if data.values["AWS_PUBLIC_SUBNET_ID"] != "": - public0["id"] = data.values["AWS_PUBLIC_SUBNET_ID"] - end - - subnet0 = {} - if private0 != {}: - subnet0["private"] = private0 - end - if public0 != {}: - subnet0["public"] = public0 - end - if data.values["AWS_NODE_AZ"] != None: - subnet0["az"] = data.values["AWS_NODE_AZ"] - end - if subnet0 != {}: - subnets.append(subnet0) - end - - if data.values["CLUSTER_PLAN"] == "prodcc": - private1 = {} - if data.values["AWS_PRIVATE_NODE_CIDR_1"] != "": - private1["cidr"] = data.values["AWS_PRIVATE_NODE_CIDR_1"] - end - if data.values["AWS_PRIVATE_SUBNET_ID_1"] != "": - private1["id"] = data.values["AWS_PRIVATE_SUBNET_ID_1"] - end - public1 = {} - if data.values["AWS_PUBLIC_NODE_CIDR_1"] != "": - public1["cidr"] = data.values["AWS_PUBLIC_NODE_CIDR_1"] - end - if data.values["AWS_PUBLIC_SUBNET_ID_1"] != "": - public1["id"] = data.values["AWS_PUBLIC_SUBNET_ID_1"] - end - - subnet1 = {} - if private1 != {}: - subnet1["private"] = private1 - end - if public1 != {}: - subnet1["public"] = public1 - end - if data.values["AWS_NODE_AZ_1"] != "": - subnet1["az"] = data.values["AWS_NODE_AZ_1"] - end - - if subnet1 != {}: - subnets.append(subnet1) - end - - private2 = {} - if data.values["AWS_PRIVATE_NODE_CIDR_2"] != "": - private2["cidr"] = data.values["AWS_PRIVATE_NODE_CIDR_2"] - end - if data.values["AWS_PRIVATE_SUBNET_ID_2"] != "": - private2["id"] = data.values["AWS_PRIVATE_SUBNET_ID_2"] - end - public2 = {} - if data.values["AWS_PUBLIC_NODE_CIDR_2"] != "": - public2["cidr"] = data.values["AWS_PUBLIC_NODE_CIDR_2"] - end - if data.values["AWS_PUBLIC_SUBNET_ID_2"] != "": - public2["id"] = data.values["AWS_PUBLIC_SUBNET_ID_2"] - end - - subnet2 = {} - if private2 != {}: - subnet2["private"] = private2 - end - if public2 != {}: - subnet2["public"] = public2 - end - if data.values["AWS_NODE_AZ_2"] != "": - subnet2["az"] = data.values["AWS_NODE_AZ_2"] - end - - if subnet2 != {}: - subnets.append(subnet2) - end - end - - vars["network"]["subnets"] = subnets - - worker = {} - if data.values["NODE_MACHINE_TYPE"] != None: - worker["instanceType"] = data.values["NODE_MACHINE_TYPE"] - end - if data.values["AWS_NODE_OS_DISK_SIZE_GIB"] != None: - rootVolume = {} - rootVolume["sizeGiB"] = data.values["AWS_NODE_OS_DISK_SIZE_GIB"] - worker["rootVolume"] = rootVolume - end - - vars["worker"] = worker - - controlPlane = {} - if data.values["CONTROL_PLANE_MACHINE_TYPE"] != None: - controlPlane["instanceType"] = data.values["CONTROL_PLANE_MACHINE_TYPE"] - end - if data.values["AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB"] != None: - rootVolume = {} - rootVolume["sizeGiB"] = data.values["AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB"] - controlPlane["rootVolume"] = rootVolume - end - - if data.values["CONTROL_PLANE_NODE_LABELS"] != None: - controlPlane["nodeLabels"] = get_labels_array_from_string(data.values["CONTROL_PLANE_NODE_LABELS"]) - end - - vars["controlPlane"] = controlPlane - - return vars -end - -def get_azure_vars(): - simpleMapping = {} - simpleMapping["AZURE_LOCATION"] = "location" - simpleMapping["AZURE_RESOURCE_GROUP"] = "resourceGroup" - simpleMapping["AZURE_SUBSCRIPTION_ID"] = "subscriptionID" - simpleMapping["AZURE_ENVIRONMENT"] = "environment" - simpleMapping["AZURE_SSH_PUBLIC_KEY_B64"] = "sshPublicKey" - simpleMapping["AZURE_FRONTEND_PRIVATE_IP"] = "frontendPrivateIP" - simpleMapping["AZURE_CUSTOM_TAGS"] = "customTags" - vars = get_cluster_variables() - - for key in simpleMapping: - if data.values[key] != None: - vars[simpleMapping[key]] = data.values[key] - end - end - - if data.values["AZURE_ENABLE_ACCELERATED_NETWORKING"] != "": - vars["acceleratedNetworking"] = { - "enabled": data.values["AZURE_ENABLE_ACCELERATED_NETWORKING"] - } - end - if data.values["AZURE_ENABLE_PRIVATE_CLUSTER"] != "": - vars["privateCluster"] = { - "enabled": data.values["AZURE_ENABLE_PRIVATE_CLUSTER"] - } - end - - if vars.get("network") == None: - vars["network"] = {} - end - - vnet = {} - if data.values["AZURE_VNET_NAME"] != "": - vnet["name"] = data.values["AZURE_VNET_NAME"] - end - if data.values["AZURE_VNET_CIDR"] != "": - vnet["cidrBlocks"] = [ - data.values["AZURE_VNET_CIDR"] - ] - end - if data.values["AZURE_VNET_RESOURCE_GROUP"] != "": - vnet["resourceGroup"] = data.values["AZURE_VNET_RESOURCE_GROUP"] - end - if vnet != {}: - vars["network"]["vnet"] = vnet - end - - identity = {} - if data.values["AZURE_IDENTITY_NAME"] != "": - identity["name"] = data.values["AZURE_IDENTITY_NAME"] - end - if data.values["AZURE_IDENTITY_NAMESPACE"] != "": - identity["namespace"] = data.values["AZURE_IDENTITY_NAMESPACE"] - end - if identity != {}: - vars["identityRef"] = identity - end - - controlPlane = {} - if data.values["AZURE_CONTROL_PLANE_MACHINE_TYPE"] != "": - controlPlane["vmSize"] = data.values["AZURE_CONTROL_PLANE_MACHINE_TYPE"] - end - - osDisk = {} - if data.values["AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE"] != "": - osDisk["storageAccountType"] = data.values["AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE"] - end - if data.values["AZURE_CONTROL_PLANE_OS_DISK_SIZE_GIB"] != "": - osDisk["sizeGiB"] = data.values["AZURE_CONTROL_PLANE_OS_DISK_SIZE_GIB"] - end - if osDisk != {}: - controlPlane["osDisk"] = osDisk - end - - dataDisk = {} - if data.values["AZURE_CONTROL_PLANE_DATA_DISK_SIZE_GIB"] != "": - dataDisk["sizeGiB"] = data.values["AZURE_CONTROL_PLANE_DATA_DISK_SIZE_GIB"] - controlPlane["dataDisks"] = [dataDisk] - end - - subnet = {} - if data.values["AZURE_CONTROL_PLANE_SUBNET_NAME"] != "": - subnet["name"] = data.values["AZURE_CONTROL_PLANE_SUBNET_NAME"] - end - if data.values["AZURE_CONTROL_PLANE_SUBNET_CIDR"] != "": - subnet["cidr"] = data.values["AZURE_CONTROL_PLANE_SUBNET_CIDR"] - end - if data.values["AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP"] != "": - subnet["securityGroup"] = data.values["AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP"] - end - if subnet != {}: - controlPlane["subnet"] = subnet - end - - outboundLB = {} - if data.values["AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB"] != False: - outboundLB["enabled"] = data.values["AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB"] - end - if data.values["AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT"] != "": - outboundLB["frontendIPCount"] = data.values["AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT"] - end - if outboundLB != {}: - controlPlane["outboundLB"] = outboundLB - end - - if data.values["CONTROL_PLANE_NODE_LABELS"] != None: - controlPlane["nodeLabels"] = get_labels_array_from_string(data.values["CONTROL_PLANE_NODE_LABELS"]) - end - - if controlPlane != {}: - vars["controlPlane"] = controlPlane - end - - worker = {} - if data.values["AZURE_NODE_MACHINE_TYPE"] != "": - worker["vmSize"] = data.values["AZURE_NODE_MACHINE_TYPE"] - end - - osDisk = {} - if data.values["AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE"] != "": - osDisk["storageAccountType"] = data.values["AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE"] - end - if data.values["AZURE_NODE_OS_DISK_SIZE_GIB"] != "": - osDisk["sizeGiB"] = data.values["AZURE_NODE_OS_DISK_SIZE_GIB"] - end - if osDisk != {}: - worker["osDisk"] = osDisk - end - - dataDisk = {} - if data.values["AZURE_ENABLE_NODE_DATA_DISK"] != False: - worker["dataDisks"] = [dataDisk] - end - if data.values["AZURE_NODE_DATA_DISK_SIZE_GIB"] != "": - dataDisk["sizeGiB"] = data.values["AZURE_NODE_DATA_DISK_SIZE_GIB"] - end - - subnet = {} - if data.values["AZURE_NODE_SUBNET_NAME"] != "": - subnet["name"] = data.values["AZURE_NODE_SUBNET_NAME"] - end - if data.values["AZURE_NODE_SUBNET_CIDR"] != "": - subnet["cidr"] = data.values["AZURE_NODE_SUBNET_CIDR"] - end - if data.values["AZURE_NODE_SUBNET_SECURITY_GROUP"] != "": - subnet["securityGroup"] = data.values["AZURE_NODE_SUBNET_SECURITY_GROUP"] - end - if subnet != {}: - worker["subnet"] = subnet - end - - outboundLB = {} - if data.values["AZURE_ENABLE_NODE_OUTBOUND_LB"] != False: - outboundLB["enabled"] = data.values["AZURE_ENABLE_NODE_OUTBOUND_LB"] - end - if data.values["AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT"] != "": - outboundLB["frontendIPCount"] = data.values["AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT"] - end - if data.values["AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES"] != "": - outboundLB["idleTimeoutInMinutes"] = data.values["AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES"] - end - if outboundLB != {}: - worker["outboundLB"] = outboundLB - end - - if worker != {}: - vars["worker"] = worker - end - - return vars -end - -def get_vsphere_vars(): - simpleMapping = {} - simpleMapping["VSPHERE_CONTROL_PLANE_ENDPOINT"] = "apiServerEndpoint" - simpleMapping["VIP_NETWORK_INTERFACE"] = "vipNetworkInterface" - simpleMapping["AVI_CONTROL_PLANE_HA_PROVIDER"] = "aviAPIServerHAProvider" - - vars = get_cluster_variables() - - for key in simpleMapping: - if data.values[key] != None: - vars[simpleMapping[key]] = data.values[key] - end - end - - vcenter = {} - vcenterMapping = {} - vcenterMapping["VSPHERE_CLONE_MODE"] = "cloneMode" - vcenterMapping["VSPHERE_NETWORK"] = "network" - vcenterMapping["VSPHERE_DATACENTER"] = "datacenter" - vcenterMapping["VSPHERE_DATASTORE"] = "datastore" - vcenterMapping["VSPHERE_FOLDER"] = "folder" - vcenterMapping["VSPHERE_RESOURCE_POOL"] = "resourcePool" - vcenterMapping["VSPHERE_STORAGE_POLICY_ID"] = "storagePolicyID" - vcenterMapping["VSPHERE_SERVER"] = "server" - vcenterMapping["VSPHERE_TLS_THUMBPRINT"] = "tlsThumbprint" - vcenterMapping["VSPHERE_TEMPLATE"] = "template" - - for key in vcenterMapping: - if data.values[key] != None: - vcenter[vcenterMapping[key]] = data.values[key] - end - end - - if vcenter != {}: - vars["vcenter"] = vcenter - end - - if data.values["VSPHERE_SSH_AUTHORIZED_KEY"] != None: - vars["user"] = { - "sshAuthorizedKeys": [data.values["VSPHERE_SSH_AUTHORIZED_KEY"]] - } - end - - controlPlane = {} - machine = {} - if data.values["VSPHERE_CONTROL_PLANE_NUM_CPUS"] != "": - machine["numCPUs"] = data.values["VSPHERE_CONTROL_PLANE_NUM_CPUS"] - end - if data.values["VSPHERE_CONTROL_PLANE_DISK_GIB"] != "": - machine["diskGiB"] = data.values["VSPHERE_CONTROL_PLANE_DISK_GIB"] - end - if data.values["VSPHERE_CONTROL_PLANE_MEM_MIB"] != "": - machine["memoryMiB"] = data.values["VSPHERE_CONTROL_PLANE_MEM_MIB"] - end - if data.values["VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS"] != None and data.values["VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS"] != "": - machine["customVMXKeys"] = get_custom_keys(data.values["VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS"]) - end - if machine != {}: - controlPlane["machine"] = machine - end - - network = {} - if data.values["CONTROL_PLANE_NODE_NAMESERVERS"] != None: - network["nameservers"] = data.values["CONTROL_PLANE_NODE_NAMESERVERS"].replace(" ", "").split(",") - end - if data.values["CONTROL_PLANE_NODE_SEARCH_DOMAINS"] != None: - network["searchDomains"] = data.values["CONTROL_PLANE_NODE_SEARCH_DOMAINS"].replace(" ", "").split(",") - end - if network != {}: - controlPlane["network"] = network - end - - if data.values["CONTROL_PLANE_NODE_LABELS"] != None: - controlPlane["nodeLabels"] = get_labels_array_from_string(data.values["CONTROL_PLANE_NODE_LABELS"]) - end - - if controlPlane != {}: - vars["controlPlane"] = controlPlane - end - - worker = {} - if data.values["WORKER_MACHINE_COUNT"] != "": - worker["count"] = data.values["WORKER_MACHINE_COUNT"] - end - machine = {} - if data.values["VSPHERE_WORKER_NUM_CPUS"] != "": - machine["numCPUs"] = data.values["VSPHERE_WORKER_NUM_CPUS"] - end - if data.values["VSPHERE_WORKER_DISK_GIB"] != "": - machine["diskGiB"] = data.values["VSPHERE_WORKER_DISK_GIB"] - end - if data.values["VSPHERE_WORKER_MEM_MIB"] != "": - machine["memoryMiB"] = data.values["VSPHERE_WORKER_MEM_MIB"] - end - if data.values["VSPHERE_WORKER_CUSTOM_VMX_KEYS"] != None and data.values["VSPHERE_WORKER_CUSTOM_VMX_KEYS"] != "": - machine["customVMXKeys"] = get_custom_keys(data.values["VSPHERE_WORKER_CUSTOM_VMX_KEYS"]) - end - if machine != {}: - worker["machine"] = machine - end - - network = {} - if data.values["WORKER_NODE_NAMESERVERS"] != None: - network["nameservers"] = data.values["WORKER_NODE_NAMESERVERS"].replace(" ", "").split(",") - end - if data.values["WORKER_NODE_SEARCH_DOMAINS"] != None: - network["searchDomains"] = data.values["WORKER_NODE_SEARCH_DOMAINS"].replace(" ", "").split(",") - end - if network != {}: - worker["network"] = network - end - - if worker != {}: - vars["worker"] = worker - end - - if data.values["NTP_SERVERS"] != None: - vars["ntpServers"] = data.values["NTP_SERVERS"].replace(" ", "").split(",") - end - - if data.values["KUBEVIP_LOADBALANCER_ENABLE"]: - vars["kubeVipLoadBalancerProvider"] = True - end - - if data.values["VSPHERE_ADDITIONAL_FQDN"] != None: - vars["additionalFQDN"] = data.values["VSPHERE_ADDITIONAL_FQDN"].replace(" ", "").split(",") - end - - customTDNFRepository = {} - if data.values["CUSTOM_TDNF_REPOSITORY_CERTIFICATE"] != "": - customTDNFRepository["certificate"] = data.values["CUSTOM_TDNF_REPOSITORY_CERTIFICATE"] - end - if customTDNFRepository != {}: - vars["customTDNFRepository"] = customTDNFRepository - end - - pci = {} - pciControlPlane = {} - if data.values["VSPHERE_CONTROL_PLANE_PCI_DEVICES"] != None and data.values["VSPHERE_CONTROL_PLANE_PCI_DEVICES"] != "": - pciControlPlane["devices"] = get_pci_devices(data.values["VSPHERE_CONTROL_PLANE_PCI_DEVICES"], data.values["VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST"]) - end - if data.values["VSPHERE_CONTROL_PLANE_HARDWARE_VERSION"] != None and data.values["VSPHERE_CONTROL_PLANE_HARDWARE_VERSION"] != "": - pciControlPlane["hardwareVersion"] = data.values["VSPHERE_CONTROL_PLANE_HARDWARE_VERSION"] - end - if pciControlPlane != {}: - pci["controlPlane"] = pciControlPlane - end - - pciWorker = {} - if data.values["VSPHERE_WORKER_PCI_DEVICES"] != None and data.values["VSPHERE_WORKER_PCI_DEVICES"] != "": - pciWorker["devices"] = get_pci_devices(data.values["VSPHERE_WORKER_PCI_DEVICES"], data.values["VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST"]) - end - if data.values["VSPHERE_WORKER_HARDWARE_VERSION"] != None and data.values["VSPHERE_WORKER_HARDWARE_VERSION"] != "": - pciWorker["hardwareVersion"] = data.values["VSPHERE_WORKER_HARDWARE_VERSION"] - end - if pciWorker != {}: - pci["worker"] = pciWorker - end - - if pci != {}: - vars["pci"] = pci - end - - return vars -end - -def get_oci_vars(): - - simpleMapping = {} - simpleMapping["OCI_COMPARTMENT_ID"] = "compartmentId" - simpleMapping["OCI_SSH_KEY"] = "sshKey" - simpleMapping["OCI_NODE_MACHINE_TYPE"] = "nodeMachineShape" - simpleMapping["OCI_NODE_MACHINE_TYPE_OCPUS"] = "nodeMachineOcpus" - simpleMapping["OCI_NODE_PV_TRANSIT_ENCRYPTION"] = "nodePvTransitEncryption" - simpleMapping["OCI_CONTROL_PLANE_MACHINE_TYPE"] = "controlPlaneMachineShape" - simpleMapping["OCI_CONTROL_PLANE_MACHINE_TYPE_OCPUS"] = "controlPlaneMachineOcpus" - simpleMapping["OCI_CONTROL_PLANE_PV_TRANSIT_ENCRYPTION"] = "controlPlanePvTransitEncryption" - - simpleMapping["OCI_PRIVATE_SERVICE_SUBNET_ID"] = "privateServiceSubnetId" - simpleMapping["OCI_EXTERNAL_VCN_ID"] = "externalVCNId" - simpleMapping["OCI_EXTERNAL_CONTROL_PLANE_EP_NSG_ID"] = "externalControlPlaneEndpointNSGId" - simpleMapping["OCI_EXTERNAL_CONTROL_PLANE_NSG_ID"] = "externalControlPlaneNSGId" - simpleMapping["OCI_EXTERNAL_WORKER_NSG_ID"] = "externalWorkerNSGId" - simpleMapping["OCI_EXTERNAL_CONTROL_PLANE_EP_SUBNET_ID"] = "externalControlPlaneEndpointSubnetId" - simpleMapping["OCI_EXTERNAL_CONTROL_PLANE_SUBNET_ID"] = "externalControlPlaneSubnetId" - simpleMapping["OCI_EXTERNAL_WORKER_SUBNET_ID"] = "externalWorkerSubnetId" - - vars = get_cluster_variables() - - if data.values["ETCD_EXTRA_ARGS"] != None: - vars["etcdExtraArgs"] = get_extra_args_map_from_string(data.values["ETCD_EXTRA_ARGS"]) - end - if data.values["APISERVER_EXTRA_ARGS"] != None: - vars["apiServerExtraArgs"] = get_extra_args_map_from_string(data.values["APISERVER_EXTRA_ARGS"]) - end - if data.values["KUBE_SCHEDULER_EXTRA_ARGS"] != None: - vars["kubeSchedulerExtraArgs"] = get_extra_args_map_from_string(data.values["KUBE_SCHEDULER_EXTRA_ARGS"]) - end - if data.values["KUBE_CONTROLLER_MANAGER_EXTRA_ARGS"] != None: - vars["kubeControllerManagerExtraArgs"] = get_extra_args_map_from_string(data.values["KUBE_CONTROLLER_MANAGER_EXTRA_ARGS"]) - end - if data.values["CONTROLPLANE_KUBELET_EXTRA_ARGS"] != None: - vars["controlPlaneKubeletExtraArgs"] = get_extra_args_map_from_string(data.values["CONTROLPLANE_KUBELET_EXTRA_ARGS"]) - end - if data.values["WORKER_KUBELET_EXTRA_ARGS"] != None: - vars["workerKubeletExtraArgs"] = get_extra_args_map_from_string(data.values["WORKER_KUBELET_EXTRA_ARGS"]) - end - - for key in simpleMapping: - if data.values[key] != None: - vars[simpleMapping[key]] = data.values[key] - end - end - return vars -end - -oci_var_keys = ["compartmentId", "sshKey", "nodeMachineShape", "nodeMachineOcpus", - "privateServiceSubnetId", "externalVCNId", - "externalControlPlaneEndpointNSGId", "externalControlPlaneNSGId", "externalWorkerNSGId", - "externalControlPlaneEndpointSubnetId", "externalControlPlaneSubnetId", "externalWorkerSubnetId", - "nodePvTransitEncryption", "controlPlaneMachineShape", "controlPlaneMachineOcpus", - "controlPlanePvTransitEncryption", - "imageRepository", "trust", "auditLogging", "cni", "TKR_DATA", - "controlPlaneCertificateRotation", "podSecurityStandard", "workerKubeletExtraArgs", "controlPlaneKubeletExtraArgs", - "kubeControllerManagerExtraArgs", "kubeSchedulerExtraArgs", "apiServerExtraArgs", "etcdExtraArgs", "eventRateLimitConf"] diff --git a/providers/yttcc/lib/helpers.star b/providers/yttcc/lib/helpers.star deleted file mode 100644 index 6f46f4b4aa..0000000000 --- a/providers/yttcc/lib/helpers.star +++ /dev/null @@ -1,436 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:assert", "assert") -load("@ytt:regexp", "regexp") - -TKGSProductName = "VMware Tanzu Kubernetes Grid Service for vSphere" -TKGProductName = "VMware Tanzu Kubernetes Grid" -# kapp-controller requires the data values for addons to have this header to indicate its a data value -ValuesFormatStr = "#@data/values\n#@overlay/match-child-defaults missing_ok=True\n---\n{}" - -def get_tkr_name_from_k8s_version(k8s_version): - strs = k8s_version.split("+") - return strs[0] + "---" + strs[1] -end - -def get_tkr_version_from_tkr_name(tkr_name): - strs = tkr_name.split("---") - return strs[0] + "+" + strs[1] -end - -def get_default_tkg_bom_data(): - for bom_entry in data.values.boms: - if bom_entry.bom_name == data.values.TKG_DEFAULT_BOM: - return bom_entry.bom_data - end - end - assert.fail("unable to find the default BOM file: " + data.values.TKG_DEFAULT_BOM) -end - - -def get_default_tkr_bom_data(): - default_tkg_bom = get_default_tkg_bom_data() - k8s_version = default_tkg_bom.default.k8sVersion - - for bom_entry in data.values.boms: - if bom_entry.bom_data.release.version == k8s_version: - return bom_entry.bom_data - end - end - assert.fail("unable to get TanzuKubernetesRelease BoM file for TKG version: "+k8s_version +" " + default_tkg_bom.release.version) -end - -def get_bom_data_for_tkr_name(): - for bom_entry in data.values.boms: - tkr_version = get_tkr_version_from_tkr_name(data.values.KUBERNETES_RELEASE) - if bom_entry.bom_data.release.version == tkr_version: - return bom_entry.bom_data - end - end - assert.fail("unable to get BoM file for the TanzuKubernetesRelease version: " + bom_entry.bom_data.release.version + " " + data.values.KUBERNETES_RELEASE ) -end - -tkgBomData = get_default_tkg_bom_data() -if data.values.PROVIDER_TYPE != "tkg-service-vsphere": - tkrBomData = get_bom_data_for_tkr_name() -end - -def kubeadm_image_repo(default_repo): - if data.values.TKG_CUSTOM_IMAGE_REPOSITORY: - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY - end - - # if downstream images are not available for Azure, change the kubeadm image repository to the staging repository name(global 'imageRepository' in BOM) - if data.values.PROVIDER_TYPE == "azure": - if hasattr(tkrBomData, 'azure') and hasattr(tkrBomData.azure[0], 'thirdPartyImage') and tkrBomData.azure[0].thirdPartyImage == True: - return default_repo - else: - # when downstream image not available - return tkrBomData.kubeadmConfigSpec.imageRepository - end - end - - return default_repo -end - -def tkg_image_repo_customized(): - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY != "" -end - -#! XXX: until all overlays are refactored to account for cluster class, any -#! scenario involving cc will be processed via supplying a plan name that -#! adheres to the convention of ending in "cc". Any overlay not meant to be used -#! scenario should be guarded by calling this helper. -def tkg_use_clusterclass(): - return data.values.CLUSTER_PLAN != "" and data.values.CLUSTER_PLAN.endswith("cc") -end - -def tkg_image_repo(): - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY if data.values.TKG_CUSTOM_IMAGE_REPOSITORY else tkgBomData.imageConfig.imageRepository -end - -def get_image_repo_for_component(image): - # if custom image repo is specified use that repo - if data.values.TKG_CUSTOM_IMAGE_REPOSITORY: - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY - end - - # if imageRepo is specified for the component with image.imageRepository - # than use image.imageRepository else use default imageRepo from BoM file - if hasattr(image, 'imageRepository'): - return image.imageRepository - else: - return tkgBomData.imageConfig.imageRepository - end -end - -def tkg_image_repo_skip_tls_verify(): - return data.values.TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY == True and tkg_image_repo_customized() -end - -def tkg_image_repo_ca_cert(): - return data.values.TKG_PROXY_CA_CERT if data.values.TKG_PROXY_CA_CERT else data.values.TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE -end - -def tkg_image_repo_hostname(): - return tkg_image_repo().split("/")[0] -end - -def get_provider(): - if data.values.PROVIDER_TYPE == "tkg-service-vsphere": - return "vsphere" - end - return data.values.PROVIDER_TYPE -end - -def get_kubernetes_provider(): - return TKGSProductName if data.values.PROVIDER_TYPE == "tkg-service-vsphere" else TKGProductName -end - -def get_az_from_region(region, az, suffix): - regionWithSuffix = "" - if region != "" and region != None: - regionWithSuffix = region + suffix - end - return az if az != "" else regionWithSuffix -end - -def validate(): - validate_funcs = [validate_oidc] - for fn in validate_funcs: - fn() - end - return True -end - -def validate_oidc(): - if data.values.ENABLE_OIDC : - data.values.OIDC_ISSUER_URL or assert.fail("oidc enabled, oidc issuer url should be provided") - data.values.OIDC_USERNAME_CLAIM or assert.fail("oidc enabled, oidc username claim should be provided") - data.values.OIDC_GROUPS_CLAIM or assert.fail("oidc enabled, oidc groups claim should be provided") - data.values.OIDC_DEX_CA or assert.fail("oidc enabled, oidc dex ca should be provided.") - end -end - -def get_azure_image(tkrBomData): - image = get_azure_image_from_config() - if image != None: - return image - end - - return get_azure_image_from_bom(tkrBomData) -end - -def get_azure_image_from_config(): - if data.values.AZURE_IMAGE_ID: - return { - "id": data.values.AZURE_IMAGE_ID - } - end - - if data.values.AZURE_IMAGE_RESOURCE_GROUP: - sharedGallery = { - "resourceGroup": data.values.AZURE_IMAGE_RESOURCE_GROUP, - "name": data.values.AZURE_IMAGE_NAME, - "subscriptionID": data.values.AZURE_IMAGE_SUBSCRIPTION_ID, - "gallery": data.values.AZURE_IMAGE_GALLERY, - "version": data.values.AZURE_IMAGE_VERSION - } - return { - "sharedGallery": sharedGallery - } - end - - if data.values.AZURE_IMAGE_PUBLISHER: - marketplace = { - "publisher": data.values.AZURE_IMAGE_PUBLISHER, - "offer": data.values.AZURE_IMAGE_OFFER, - "sku": data.values.AZURE_IMAGE_SKU, - "version": data.values.AZURE_IMAGE_VERSION, - "thirdPartyImage": data.values.AZURE_IMAGE_THIRD_PARTY - } - - return { - "marketplace": marketplace - } - end - - return None -end - -def get_azure_image_from_bom(tkrBomData): - - if not hasattr(tkrBomData, 'azure'): - fail("no image information in BOM") - end - - sharedGallery = get_shared_gallery_image(tkrBomData) - if sharedGallery != None: - return sharedGallery - end - - marketplace = get_marketplace_image(tkrBomData) - if marketplace != None: - return marketplace - end - - fail("invalid image information in BOM") -end - - -def get_shared_gallery_image(tkrBomData): - keysRequired = ['resourceGroup', 'name', 'subscriptionID', 'gallery', 'version', 'osinfo', 'metadata'] - keysFromBom = dir(tkrBomData.azure[0]) - keysFromBom.append('osinfo') - keysFromBom.append('metadata') - - if set(keysRequired) == set(keysFromBom): - sharedGallery = { - "resourceGroup": tkrBomData.azure[0].resourceGroup, - "name": tkrBomData.azure[0].name, - "subscriptionID": tkrBomData.azure[0].subscriptionID, - "gallery": tkrBomData.azure[0].gallery, - "version": tkrBomData.azure[0].version - } - return { - "sharedGallery": sharedGallery - } - else: - return None - end -end - -def get_marketplace_image(tkrBomData): - keysRequired = ['publisher', 'offer', 'sku', 'version', 'thirdPartyImage', 'osinfo', 'metadata'] - keysFromBom = dir(tkrBomData.azure[0]) - keysFromBom.append('thirdPartyImage') - keysFromBom.append('osinfo') - keysFromBom.append('metadata') - - if set(keysRequired) == set(keysFromBom): - marketplace = { - "publisher": tkrBomData.azure[0].publisher, - "offer": tkrBomData.azure[0].offer, - "sku": tkrBomData.azure[0].sku, - "version": tkrBomData.azure[0].version, - "thirdPartyImage": False - } - - if hasattr(tkrBomData.azure[0], 'thirdPartyImage'): - marketplace["thirdPartyImage"] = tkrBomData.azure[0].thirdPartyImage - end - - return { - "marketplace": marketplace - } - else: - return None - end -end - -def get_vsphere_thumbprint(): - if data.values.VSPHERE_INSECURE: - return "" - end - return data.values.VSPHERE_TLS_THUMBPRINT -end - -def get_no_proxy(): - if data.values.TKG_HTTP_PROXY != "": - full_no_proxy_list = [] - if data.values.TKG_NO_PROXY != "": - # trim space in the no_proxy list - full_no_proxy_list = regexp.replace(" ", data.values.TKG_NO_PROXY, "").split(",") - end - if data.values.PROVIDER_TYPE == "aws": - if data.values.AWS_VPC_CIDR != "": - full_no_proxy_list.append(data.values.AWS_VPC_CIDR) - end - full_no_proxy_list.append("169.254.0.0/16") - end - if data.values.PROVIDER_TYPE == "azure": - if data.values.AZURE_VNET_CIDR != "": - full_no_proxy_list.append(data.values.AZURE_VNET_CIDR) - end - full_no_proxy_list.append("169.254.0.0/16") - full_no_proxy_list.append("168.63.129.16") - end - full_no_proxy_list.append(data.values.SERVICE_CIDR) - full_no_proxy_list.append(data.values.CLUSTER_CIDR) - full_no_proxy_list.append("localhost") - full_no_proxy_list.append("127.0.0.1") - if data.values.TKG_IP_FAMILY in ["ipv6", "ipv4,ipv6", "ipv6,ipv4"]: - full_no_proxy_list.append("::1") - end - full_no_proxy_list.append(".svc") - full_no_proxy_list.append(".svc.cluster.local") - populated_no_proxy = ",".join(list(set(full_no_proxy_list))) - return populated_no_proxy - end - return "" -end - -def validate_proxy_bypass_vsphere_host(): - if data.values.PROVIDER_TYPE == "vsphere" and not data.values.VSPHERE_INSECURE: - no_proxy_list = [] - if data.values.TKG_NO_PROXY != "": - no_proxy_list = data.values.TKG_NO_PROXY.split(",") - if data.values.VSPHERE_SERVER not in no_proxy_list: - assert.fail("unable to proxy traffic to vSphere host in security connection, either set VSPHERE_INSECURE to true or add VSPHERE_SERVER to TKG_NO_PROXY") - end - end - end -end - -# get_labels_map_from_string constructs a map from given string of the format "key1=label1,key2=label2" -def get_labels_map_from_string(labelString): - return get_map_from_string(labelString, ',') -end - -# get_extra_args_map_from_string constructs a map from given string of the format "key1=label1,key2=label2" -def get_extra_args_map_from_string(labelString): - return get_map_from_string(labelString, ';') -end - -# get_map_from_string constructs a map from given string of the format "key1=label1key2=label2" -def get_map_from_string(argsString, delimiter): - argsMap = {} - for val in argsString.split(delimiter): - kv = val.split('=', 1) - if len(kv) != 2: - assert.fail("given args string \""+argsString+"\" must be in the \"key1=label1"+delimiter+"key2=label2\" format ") - end - argsMap.update({kv[0]: kv[1]}) - end - return argsMap -end - -# get_labels_array_from_string constructs an array from given string of the format "key1=label1,key2=label2" -def get_labels_array_from_string(labelString): - labelArray = [] - for val in labelString.split(','): - kv = val.split('=') - if len(kv) != 2: - assert.fail("given labels string \""+labelString+"\" must be in the \"key1=label1,key2=label2\" format ") - end - labelMap = {} - labelMap["key"] = kv[0] - labelMap["value"] = kv[1] - labelArray.append(labelMap) - end - return labelArray -end - -def get_custom_keys(keyValueString): - customKeys = dict() - for val in keyValueString.split(','): - kv = val.split('=') - if len(kv) != 2: - assert.fail("Given input is not in correct format") - end - customKeys[kv[0]] = kv[1] - end - return customKeys -end - -valid_pci_devices = [[0x10DE,0x1EB8]] - -def valid_pci_devices_list(): - return ",".join(map(lambda x: "0x%X:0x%X" % (x[0], x[1]), valid_pci_devices)) -end - -def get_pci_devices(pci_devices_string, pci_ignore_device_validation): - pci_devices = list() - help_error = "VSPHERE_CONTROL_PLANE_PCI_DEVICES \"" + pci_devices_string + "\" must be in the \"0x:0x,0x:0x,..\" format." - for val in pci_devices_string.split(","): - if len(val) <= 0: - assert.fail(help_error) - end - kv = val.split(":") - if len(kv) != 2: - assert.fail(help_error) - end - id_pair = dict() - # No try-catch or exception support unfortunately (https://github.com/google/skylark/issues/125). - # If this fails, e.g. user wrote "0zsomething", user's just going to get an "invalid literal with base 16" error. - # This will need to be covered in documentation. - vendor_id = int(kv[0], 16) - device_id = int(kv[1], 16) - if not pci_ignore_device_validation: - matchesAny = False - for x in valid_pci_devices: - if vendor_id == x[0] and device_id == x[1]: - matchesAny = True - end - end - if not matchesAny: - assert.fail("Device 0x%X:0x%X is not supported. Supported devices are: %s. Set VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST to ignore this check." % (vendor_id, device_id, valid_pci_devices_list())) - end - end - id_pair["vendorId"] = vendor_id - id_pair["deviceId"] = device_id - pci_devices.append(id_pair) - end - return pci_devices -end - -def get_image_registry(host, skipTlsVerify, caCert): - if host != None and host != "": - imageRegistry = {} - imageRegistry["host"] = host - imageRegistry["skipTlsVerify"] = skipTlsVerify - if skipTlsVerify == False: - if caCert != None and caCert != "": - imageRegistry["caCert"] = caCert - else: - assert.fail("Must provide CA for host " + host) - end - end - return imageRegistry - else: - return None - end -end - -def map(f, list): - return [f(x) for x in list] -end diff --git a/providers/yttcc/lib/validate.star b/providers/yttcc/lib/validate.star deleted file mode 100644 index 6cab52b1b6..0000000000 --- a/providers/yttcc/lib/validate.star +++ /dev/null @@ -1,103 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:assert", "assert") -load("/lib/helpers.star", "validate_proxy_bypass_vsphere_host") - -required_variable_list_vsphere = [ - "VSPHERE_USERNAME", - "VSPHERE_PASSWORD", - "VSPHERE_SERVER", - "VSPHERE_DATACENTER", - "VSPHERE_RESOURCE_POOL", - "VSPHERE_FOLDER", - "VSPHERE_SSH_AUTHORIZED_KEY"] - -required_variable_list_aws = [ - "AWS_REGION", - "AWS_SSH_KEY_NAME"] - -required_variable_list_azure = [ - "AZURE_SUBSCRIPTION_ID", - "AZURE_LOCATION", - "AZURE_SSH_PUBLIC_KEY_B64"] - -required_variable_list_tkgs = [ - "CONTROL_PLANE_STORAGE_CLASS", - "CONTROL_PLANE_VM_CLASS", - "SERVICE_DOMAIN", - "WORKER_STORAGE_CLASS", - "WORKER_VM_CLASS", - "NODE_POOL_0_NAME"] - -def validate_configuration(provider): - #! skip validation when only employing the template to generate - #! addon resources (which is doable without a complete set of - #! config data values). - if data.values.FILTER_BY_ADDON_TYPE: - return - end - - if provider == "vsphere": - flag_missing_variable_error(required_variable_list_vsphere) - if data.values.NSXT_POD_ROUTING_ENABLED == True: - validate_nsxt_config() - end - #! known issue for govc: https://github.com/vmware/govmomi/issues/2494 - #! TODO: remove the validation once the issue is resolved - if data.values.TKG_HTTP_PROXY != "": - validate_proxy_bypass_vsphere_host() - end - elif provider == "aws": - flag_missing_variable_error(required_variable_list_aws) - elif provider == "azure": - flag_missing_variable_error(required_variable_list_azure) - elif provider == "tkgs": - flag_missing_variable_error(required_variable_list_tkgs) - end -end - -def flag_missing_variable_error(variables_list): - missing_variable_str = "" - for variable in variables_list: - value = getattr(data.values, variable, None) - if value == None or value == "": - missing_variable_str = missing_variable_str + variable + ", " - end - end - if missing_variable_str != "": - assert.fail("missing configuration variables: " + missing_variable_str[:-2]) - end -end - -def validate_nsxt_config(): - if data.values.NSXT_VMC_ACCESS_TOKEN != "": - if data.values.NSXT_VMC_AUTH_HOST == "": - assert.fail("vmc auth host must be provided if access token is provided") - end - elif data.values.NSXT_USERNAME != "": - if data.values.NSXT_PASSWORD == "" or data.values.NSXT_PASSWORD == "None": - assert.fail("password is reqruied if username is provided") - end - if data.values.NSXT_SECRET_NAME == "" or data.values.NSXT_SECRET_NAMESPACE == "": - assert.fail("secretName and secretNamespace should not be empty if username and password are provided") - end - elif data.values.NSXT_CLIENT_CERT_KEY_DATA != "": - if data.values.NSXT_CLIENT_CERT_DATA == "": - assert.fail("client cert data is required if client cert key data is provided") - end - elif data.values.NSXT_CLIENT_CERT_DATA != "": - if data.values.NSXT_CLIENT_CERT_KEY_DATA == "": - assert.fail("client cert key data is required if client cert data is provided") - end - elif data.values.NSXT_SECRET_NAME != "": - if data.values.NSXT_SECRET_NAMESPACE == "": - assert.fail("secret namespace is required if secret name is provided") - end - elif data.values.NSXT_SECRET_NAMESPACE != "": - if data.values.NSXT_SECRET_NAME == "": - assert.fail("secret name is required if secret namespace is provided") - end - else: - assert.fail("user/password or vmc access token or client certificates must be set") - end - data.values.NSXT_MANAGER_HOST != "" or assert.fail("missing configuration variables: NSXT_MANAGER_HOST") -end diff --git a/providers/yttcc/vendir/cni/_ytt_lib/LICENSE b/providers/yttcc/vendir/cni/_ytt_lib/LICENSE deleted file mode 100644 index 68c771a099..0000000000 --- a/providers/yttcc/vendir/cni/_ytt_lib/LICENSE +++ /dev/null @@ -1,176 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - diff --git a/providers/yttcc/vendir/cni/_ytt_lib/NOTICE b/providers/yttcc/vendir/cni/_ytt_lib/NOTICE deleted file mode 100644 index df374c7ac0..0000000000 --- a/providers/yttcc/vendir/cni/_ytt_lib/NOTICE +++ /dev/null @@ -1,182 +0,0 @@ -Tanzu Community Edition -Copyright 2020 VMware, Inc. - -The Apache 2.0 license (the "License") set forth below applies to all parts of the Tanzu Community Edition project. You may not use this file except in compliance with the License. - -Apache License - -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, -and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the -copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other -entities that control, are controlled by, or are under common control -with that entity. For the purposes of this definition, "control" means -(i) the power, direct or indirect, to cause the direction or management -of such entity, whether by contract or otherwise, or (ii) ownership -of fifty percent (50%) or more of the outstanding shares, or (iii) -beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation source, -and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation -or translation of a Source form, including but not limited to compiled -object code, generated documentation, and conversions to other media -types. - -"Work" shall mean the work of authorship, whether in Source or -Object form, made available under the License, as indicated by a copyright -notice that is included in or attached to the work (an example is provided -in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, -that is based on (or derived from) the Work and for which the editorial -revisions, annotations, elaborations, or other modifications represent, -as a whole, an original work of authorship. For the purposes of this -License, Derivative Works shall not include works that remain separable -from, or merely link (or bind by name) to the interfaces of, the Work -and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the -original version of the Work and any modifications or additions to -that Work or Derivative Works thereof, that is intentionally submitted -to Licensor for inclusion in the Work by the copyright owner or by an -individual or Legal Entity authorized to submit on behalf of the copyright -owner. For the purposes of this definition, "submitted" means any form of -electronic, verbal, or written communication sent to the Licensor or its -representatives, including but not limited to communication on electronic -mailing lists, source code control systems, and issue tracking systems -that are managed by, or on behalf of, the Licensor for the purpose of -discussing and improving the Work, but excluding communication that is -conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity -on behalf of whom a Contribution has been received by Licensor and -subsequently incorporated within the Work. - -2. Grant of Copyright License. -Subject to the terms and conditions of this License, each Contributor -hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable copyright license to reproduce, prepare -Derivative Works of, publicly display, publicly perform, sublicense, and -distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. -Subject to the terms and conditions of this License, each Contributor -hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty- free, irrevocable (except as stated in this section) patent -license to make, have made, use, offer to sell, sell, import, and -otherwise transfer the Work, where such license applies only to those -patent claims licensable by such Contributor that are necessarily -infringed by their Contribution(s) alone or by combination of -their Contribution(s) with the Work to which such Contribution(s) -was submitted. If You institute patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Work or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses granted -to You under this License for that Work shall terminate as of the date -such litigation is filed. - -4. Redistribution. -You may reproduce and distribute copies of the Work or Derivative Works -thereof in any medium, with or without modifications, and in Source or -Object form, provided that You meet the following conditions: - - a. You must give any other recipients of the Work or Derivative Works - a copy of this License; and - - b. You must cause any modified files to carry prominent notices stating - that You changed the files; and - - c. You must retain, in the Source form of any Derivative Works that - You distribute, all copyright, patent, trademark, and attribution - notices from the Source form of the Work, excluding those notices - that do not pertain to any part of the Derivative Works; and - - d. If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one of - the following places: within a NOTICE text file distributed as part - of the Derivative Works; within the Source form or documentation, - if provided along with the Derivative Works; or, within a display - generated by the Derivative Works, if and wherever such third-party - notices normally appear. The contents of the NOTICE file are for - informational purposes only and do not modify the License. You - may add Your own attribution notices within Derivative Works that - You distribute, alongside or as an addendum to the NOTICE text - from the Work, provided that such additional attribution notices - cannot be construed as modifying the License. You may add Your own - copyright statement to Your modifications and may provide additional - or different license terms and conditions for use, reproduction, or - distribution of Your modifications, or for any such Derivative Works - as a whole, provided Your use, reproduction, and distribution of the - Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. -Unless You explicitly state otherwise, any Contribution intentionally -submitted for inclusion in the Work by You to the Licensor shall be -under the terms and conditions of this License, without any additional -terms or conditions. Notwithstanding the above, nothing herein shall -supersede or modify the terms of any separate license agreement you may -have executed with Licensor regarding such Contributions. - -6. Trademarks. -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. -Unless required by applicable law or agreed to in writing, Licensor -provides the Work (and each Contributor provides its Contributions) on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either -express or implied, including, without limitation, any warranties or -conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR -A PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any risks -associated with Your exercise of permissions under this License. - -8. Limitation of Liability. -In no event and under no legal theory, whether in tort (including -negligence), contract, or otherwise, unless required by applicable law -(such as deliberate and grossly negligent acts) or agreed to in writing, -shall any Contributor be liable to You for damages, including any direct, -indirect, special, incidental, or consequential damages of any character -arising as a result of this License or out of the use or inability to -use the Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all other -commercial damages or losses), even if such Contributor has been advised -of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. -While redistributing the Work or Derivative Works thereof, You may -choose to offer, and charge a fee for, acceptance of support, warranty, -indemnity, or other liability obligations and/or rights consistent with -this License. However, in accepting such obligations, You may act only -on Your own behalf and on Your sole responsibility, not on behalf of -any other Contributor, and only if You agree to indemnify, defend, and -hold each Contributor harmless for any liability incurred by, or claims -asserted against, such Contributor by reason of your accepting any such -warranty or additional liability. - -END OF TERMS AND CONDITIONS - - - diff --git a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/kapp-config.yaml b/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/kapp-config.yaml deleted file mode 100644 index 69b5cbe0ad..0000000000 --- a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/kapp-config.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: kapp.k14s.io/v1alpha1 -kind: Config -rebaseRules: -- path: [data] - type: copy - sources: [existing, new] - resourceMatchers: - - kindNamespaceNameMatcher: {kind: ConfigMap, namespace: kube-system, name: antrea-ca} - -- path: [spec, caBundle] - type: copy - sources: [existing, new] - resourceMatchers: - - anyMatcher: - matchers: - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1alpha1.stats.antrea.io} - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1alpha1.stats.antrea.tanzu.vmware.com} - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1beta1.controlplane.antrea.tanzu.vmware.com} - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1beta1.system.antrea.io} - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1beta1.system.antrea.tanzu.vmware.com} - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1beta2.controlplane.antrea.io} - - kindNamespaceNameMatcher: {kind: APIService, namespace: kube-system, name: v1beta2.controlplane.antrea.tanzu.vmware.com} diff --git a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/overlay/antrea_overlay.yaml b/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/overlay/antrea_overlay.yaml deleted file mode 100644 index 1828d4c7c6..0000000000 --- a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/overlay/antrea_overlay.yaml +++ /dev/null @@ -1,298 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:yaml", "yaml") -#@ load("/values.star", "values") - -#@ def antrea_agent_conf(): - -#! FeatureGates is a map of feature names to bools that enable or disable experimental features. -featureGates: -#! Enable AntreaProxy which provides ServiceLB for in-cluster Services in antrea-agent. -#! It should be enabled on Windows, otherwise NetworkPolicy will not take effect on -#! Service traffic. - AntreaProxy: #@ values.antrea.config.featureGates.AntreaProxy - -#! Enable EndpointSlice support in AntreaProxy. Don't enable this feature unless that EndpointSlice -#! API version v1beta1 is supported and set as enabled in Kubernetes. If AntreaProxy is not enabled, -#! this flag will not take effect. - EndpointSlice: #@ values.antrea.config.featureGates.EndpointSlice - -#! Enable traceflow which provides packet tracing feature to diagnose network issue. - Traceflow: #@ values.antrea.config.featureGates.AntreaTraceflow - -#! Enable NodePortLocal feature to make the pods reachable externally through NodePort - NodePortLocal: #@ values.antrea.config.featureGates.NodePortLocal - -#! Enable Antrea ClusterNetworkPolicy feature to complement K8s NetworkPolicy for cluster admins -#! to define security policies which apply to the entire cluster, and Antrea NetworkPolicy -#! feature that supports priorities, rule actions and externalEntities in the future. - AntreaPolicy: #@ values.antrea.config.featureGates.AntreaPolicy - -#! Enable flowexporter which exports polled conntrack connections as IPFIX flow records from each -#! agent to a configured collector. - FlowExporter: #@ values.antrea.config.featureGates.FlowExporter - -#! Enable collecting and exposing NetworkPolicy statistics. - NetworkPolicyStats: #@ values.antrea.config.featureGates.NetworkPolicyStats - -#! Enable controlling SNAT IPs of Pod egress traffic. - Egress: #@ values.antrea.config.featureGates.Egress - -#! Name of the OpenVSwitch bridge antrea-agent will create and use. -#! Make sure it doesn't conflict with your existing OpenVSwitch bridges. -#!ovsBridge: br-int - -#! Datapath type to use for the OpenVSwitch bridge created by Antrea. Supported values are: -#! - system -#! - netdev -#! 'system' is the default value and corresponds to the kernel datapath. Use 'netdev' to run -#! OVS in userspace mode. Userspace mode requires the tun device driver to be available. -#@ if values.infraProvider == "docker": -ovsDatapathType: netdev -#@ end - -#! Name of the interface antrea-agent will create and use for host <--> pod communication. -#! Make sure it doesn't conflict with your existing interfaces. -#!hostGateway: antrea-gw0 - -#! Determines how traffic is encapsulated. It has the following options: -#! encap(default): Inter-node Pod traffic is always encapsulated and Pod to external network -#! traffic is SNAT'd. -#! noEncap: Inter-node Pod traffic is not encapsulated; Pod to external network traffic is -#! SNAT'd if noSNAT is not set to true. Underlying network must be capable of -#! supporting Pod traffic across IP subnets. -#! hybrid: noEncap if source and destination Nodes are on the same subnet, otherwise encap. -#! networkPolicyOnly: Antrea enforces NetworkPolicy only, and utilizes CNI chaining and delegates Pod -#! IPAM and connectivity to the primary CNI. -#! -trafficEncapMode: #@ values.antrea.config.trafficEncapMode - -#! Whether or not to SNAT (using the Node IP) the egress traffic from a Pod to the external network. -#! This option is for the noEncap traffic mode only, and the default value is false. In the noEncap -#! mode, if the cluster's Pod CIDR is reachable from the external network, then the Pod traffic to -#! the external network needs not be SNAT'd. In the networkPolicyOnly mode, antrea-agent never -#! performs SNAT and this option will be ignored; for other modes it must be set to false. -noSNAT: #@ values.antrea.config.noSNAT - -#! Tunnel protocols used for encapsulating traffic across Nodes. Supported values: -#! - geneve (default) -#! - vxlan -#! - gre -#! - stt -#!tunnelType: geneve - -#! Default MTU to use for the host gateway interface and the network interface of each Pod. -#! If omitted, antrea-agent will discover the MTU of the Node's primary interface and -#! also adjust MTU to accommodate for tunnel encapsulation overhead (if applicable). -#@ if/end values.antrea.config.defaultMTU: -defaultMTU: #@ values.antrea.config.defaultMTU - -#! Whether or not to enable IPsec encryption of tunnel traffic. IPsec encryption is only supported -#! for the GRE tunnel type. -#!enableIPSecTunnel: false - -#! ClusterIP CIDR range for Services. It's required when AntreaProxy is not enabled, and should be -#! set to the same value as the one specified by --service-cluster-ip-range for kube-apiserver. When -#! AntreaProxy is enabled, this parameter is not needed and will be ignored if provided. -#!serviceCIDR: 10.96.0.0/12 -serviceCIDR: #@ values.antrea.config.serviceCIDR - -#! ClusterIP CIDR range for IPv6 Services. It's required when using kube-proxy to provide IPv6 Service in a Dual-Stack -#! cluster or an IPv6 only cluster. The value should be the same as the configuration for kube-apiserver specified by -#! --service-cluster-ip-range. When AntreaProxy is enabled, this parameter is not needed. -#! No default value for this field. -#@ if/end values.antrea.config.serviceCIDRv6: -serviceCIDRv6: #@ values.antrea.config.serviceCIDRv6 - -#! The port for the antrea-agent APIServer to serve on. -#! Note that if it's set to another value, the `containerPort` of the `api` port of the -#! `antrea-agent` container must be set to the same value. -#!apiPort: 10350 - -#! Enable metrics exposure via Prometheus. Initializes Prometheus metrics listener. -#!enablePrometheusMetrics: true - -#! Provide the IPFIX collector address as a string with format :[][:]. -#! HOST can either be the DNS name or the IP of the Flow Collector. For example, -#! "flow-aggregator.flow-aggregator.svc" can be provided as DNS name to connect -#! to the Antrea Flow Aggregator service. If IP, it can be either IPv4 or IPv6. -#! However, IPv6 address should be wrapped with []. -#! If PORT is empty, we default to 4739, the standard IPFIX port. -#! If no PROTO is given, we consider "tls" as default. We support "tls", "tcp" and -#! "udp" protocols. "tls" is used for securing communication between flow exporter and -#! flow aggregator. -#!flowCollectorAddr: "flow-aggregator.flow-aggregator.svc:4739:tls" - -#! Provide flow poll interval as a duration string. This determines how often the flow exporter dumps connections from the conntrack module. -#! Flow poll interval should be greater than or equal to 1s (one second). -#! Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". -#!flowPollInterval: "5s" - -#! Provide the active flow export timeout, which is the timeout after which a flow -#! record is sent to the collector for active flows. Thus, for flows with a continuous -#! stream of packets, a flow record will be exported to the collector once the elapsed -#! time since the last export event is equal to the value of this timeout. -#! Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". -#!activeFlowExportTimeout: "30s" - -#! Provide the idle flow export timeout, which is the timeout after which a flow -#! record is sent to the collector for idle flows. A flow is considered idle if no -#! packet matching this flow has been observed since the last export event. -#! Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". -#!idleFlowExportTimeout: "15s" - -#! Provide the port range used by NodePortLocal. When the NodePortLocal feature is enabled, a port from that range will be assigned -#! whenever a Pod's container defines a specific port to be exposed (each container can define a list of ports as pod.spec.containers[].ports), -#! and all Node traffic directed to that port will be forwarded to the Pod. -#!nplPortRange: 40000-41000 - -#! Provide the address of Kubernetes apiserver, to override any value provided in kubeconfig or InClusterConfig. -#! Defaults to "". It must be a host string, a host:port pair, or a URL to the base of the apiserver. -#!kubeAPIServerOverride: "" - -#! Comma-separated list of Cipher Suites. If omitted, the default Go Cipher Suites will be used. -#! https://golang.org/pkg/crypto/tls/#pkg-constants -#! Note that TLS1.3 Cipher Suites cannot be added to the list. But the apiserver will always -#! prefer TLS1.3 Cipher Suites whenever possible. -tlsCipherSuites: #@ values.antrea.config.tlsCipherSuites - -#! TLS min version from: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13. -#!tlsMinVersion: -#@ end - - -#@ def antrea_controller_conf(): - -#! FeatureGates is a map of feature names to bools that enable or disable experimental features. -featureGates: -#! Enable traceflow which provides packet tracing feature to diagnose network issue. - Traceflow: #@ values.antrea.config.featureGates.AntreaTraceflow - -#! Enable Antrea ClusterNetworkPolicy feature to complement K8s NetworkPolicy for cluster admins -#! to define security policies which apply to the entire cluster, and Antrea NetworkPolicy -#! feature that supports priorities, rule actions and externalEntities in the future. - AntreaPolicy: #@ values.antrea.config.featureGates.AntreaPolicy - -#! Enable collecting and exposing NetworkPolicy statistics. - NetworkPolicyStats: #@ values.antrea.config.featureGates.NetworkPolicyStats - -#! Enable controlling SNAT IPs of Pod egress traffic. - Egress: #@ values.antrea.config.featureGates.Egress - -#! The port for the antrea-controller APIServer to serve on. -#! Note that if it's set to another value, the `containerPort` of the `api` port of the -#! `antrea-controller` container must be set to the same value. -#!apiPort: 10349 - -#! Enable metrics exposure via Prometheus. Initializes Prometheus metrics listener. -#!enablePrometheusMetrics: true - -#! Indicates whether to use auto-generated self-signed TLS certificate. -#! If false, A Secret named "antrea-controller-tls" must be provided with the following keys: -#! ca.crt: -#! tls.crt: -#! tls.key: -#! And the Secret must be mounted to directory "/var/run/antrea/antrea-controller-tls" of the -#! antrea-controller container. -selfSignedCert: true - -#! Comma-separated list of Cipher Suites. If omitted, the default Go Cipher Suites will be used. -#! https://golang.org/pkg/crypto/tls/#pkg-constants -#! Note that TLS1.3 Cipher Suites cannot be added to the list. But the apiserver will always -#! prefer TLS1.3 Cipher Suites whenever possible. -tlsCipherSuites: #@ values.antrea.config.tlsCipherSuites - -#! TLS min version from: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13. -#!tlsMinVersion: - -#! If Antrea is upgraded from version <= v0.13 and legacy CRDs are used, this option should be -#! enabled, otherwise the CRDs created with the legacy API groups will not take any effect and -#! work as expected. When the mirroring is enabled, if a legacy CRD is created with legacy API -#! groups, mirroring-controller will create a new CRD with the Spec and Labels from the legacy -#! CRD. Afterwards, the modification of Spec and Label in legacy CRD will be synchronized to new -#! CRD automatically. In addition, the modification of Status in new CRD will also be synchronized -#! to legacy CRD automatically. If a legacy CRD is deleted, the corresponding new CRD will be deleted. -#! Note that: to decouple a new CRD from the corresponding legacy CRD, the legacy CRD should be -#! annotated with "crd.antrea.io/stop-mirror". Afterwards, updates to the legacy CRDs will no -#! longer be reflected in the new CRD, and all CRUD operations should be done through the new -#! API groups. After adding the annotation, legacy CRDs can be deleted safely without impacting -#! new CRDs. -#! legacyCRDMirroring: true -#@ end - - -#@ def antrea_agent_tweaker_conf(): - -#! Enable disableUdpTunnelOffload will disable udp tunnel offloading feature on kubernetes node's default interface. -#! By default, no actions will be taken. -disableUdpTunnelOffload: #@ values.antrea.config.disableUdpTunnelOffload -#@ end - - -#! Antrea agent and controller configuration -#@overlay/match by=overlay.subset({"kind":"ConfigMap","metadata":{"name": "antrea-config-822fk25299"}}) ---- -kind: ConfigMap -data: - antrea-agent.conf: #@ yaml.encode(antrea_agent_conf()) - antrea-controller.conf: #@ yaml.encode(antrea_controller_conf()) - - -#! Antrea agent tweaker configuration -#@overlay/match by=overlay.subset({"kind":"ConfigMap","metadata":{"name": "antrea-agent-tweaker-g56hc6fh8t"}}) ---- -kind: ConfigMap -data: - antrea-agent-tweaker.conf: #@ yaml.encode(antrea_agent_tweaker_conf()) - - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "antrea-controller"}}) ---- -kind: Deployment -metadata: - name: antrea-controller - #@overlay/match missing_ok=True - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" - - -#@overlay/match by=overlay.subset({"kind":"DaemonSet","metadata":{"name": "antrea-agent"}}) ---- -kind: DaemonSet -metadata: - #@overlay/match missing_ok=True - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" -spec: - template: - spec: - containers: - #@ if values.infraProvider == "docker": - #@overlay/match by=overlay.subset({"name":"antrea-ovs"}) - - command: - #@overlay/match by=overlay.subset("start_ovs") - #@overlay/replace - - start_ovs_netdev - - #@overlay/match by=overlay.subset({"name":"antrea-ovs"}) - - volumeMounts: - #@overlay/append - - mountPath: /dev/net/tun - name: dev-tun - #@ end - - initContainers: - #@ if values.infraProvider == "docker": - #@overlay/match by=overlay.subset({"name":"install-cni"}) - - command: - #@overlay/match by=overlay.subset("install_cni") - #@overlay/replace - - install_cni_kind - #@ end - volumes: - #@ if values.infraProvider == "docker": - #@overlay/append - - hostPath: - path: /dev/net/tun - type: CharDevice - name: dev-tun - #@ end diff --git a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/upstream/antrea.yaml b/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/upstream/antrea.yaml deleted file mode 100644 index f696c8e3d9..0000000000 --- a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/upstream/antrea.yaml +++ /dev/null @@ -1,4872 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: antreaagentinfos.clusterinformation.antrea.tanzu.vmware.com -spec: - group: clusterinformation.antrea.tanzu.vmware.com - names: - kind: AntreaAgentInfo - plural: antreaagentinfos - shortNames: - - laai - singular: antreaagentinfo - scope: Cluster - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - type: object - x-kubernetes-preserve-unknown-fields: true - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: antreaagentinfos.crd.antrea.io -spec: - group: crd.antrea.io - names: - kind: AntreaAgentInfo - plural: antreaagentinfos - shortNames: - - aai - singular: antreaagentinfo - scope: Cluster - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - type: object - x-kubernetes-preserve-unknown-fields: true - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: antreacontrollerinfos.clusterinformation.antrea.tanzu.vmware.com -spec: - group: clusterinformation.antrea.tanzu.vmware.com - names: - kind: AntreaControllerInfo - plural: antreacontrollerinfos - shortNames: - - laci - singular: antreacontrollerinfo - scope: Cluster - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - type: object - x-kubernetes-preserve-unknown-fields: true - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: antreacontrollerinfos.crd.antrea.io -spec: - group: crd.antrea.io - names: - kind: AntreaControllerInfo - plural: antreacontrollerinfos - shortNames: - - aci - singular: antreacontrollerinfo - scope: Cluster - versions: - - name: v1beta1 - schema: - openAPIV3Schema: - type: object - x-kubernetes-preserve-unknown-fields: true - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: clustergroups.core.antrea.tanzu.vmware.com -spec: - group: core.antrea.tanzu.vmware.com - names: - kind: ClusterGroup - plural: clustergroups - shortNames: - - lcg - singular: group - scope: Cluster - versions: - - name: v1alpha2 - schema: - openAPIV3Schema: - properties: - spec: - properties: - childGroups: - items: - type: string - type: array - externalEntitySelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - ipBlock: - properties: - cidr: - format: cidr - type: string - type: object - ipBlocks: - items: - properties: - cidr: - format: cidr - type: string - type: object - type: array - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - serviceReference: - properties: - name: - type: string - namespace: - type: string - type: object - type: object - status: - properties: - conditions: - items: - properties: - lastTransitionTime: - type: string - status: - type: string - type: - type: string - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: clustergroups.crd.antrea.io -spec: - conversion: - strategy: Webhook - webhook: - clientConfig: - service: - name: antrea - namespace: kube-system - path: /convert/clustergroup - conversionReviewVersions: - - v1 - - v1beta1 - group: crd.antrea.io - names: - kind: ClusterGroup - plural: clustergroups - shortNames: - - cg - singular: group - scope: Cluster - versions: - - name: v1alpha2 - schema: - openAPIV3Schema: - properties: - spec: - properties: - childGroups: - items: - type: string - type: array - externalEntitySelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - ipBlock: - properties: - cidr: - format: cidr - type: string - type: object - ipBlocks: - items: - properties: - cidr: - format: cidr - type: string - type: object - type: array - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - serviceReference: - properties: - name: - type: string - namespace: - type: string - type: object - type: object - status: - properties: - conditions: - items: - properties: - lastTransitionTime: - type: string - status: - type: string - type: - type: string - type: object - type: array - type: object - type: object - served: true - storage: false - - name: v1alpha3 - schema: - openAPIV3Schema: - properties: - spec: - properties: - childGroups: - items: - type: string - type: array - externalEntitySelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - ipBlocks: - items: - properties: - cidr: - format: cidr - type: string - type: object - type: array - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - serviceReference: - properties: - name: - type: string - namespace: - type: string - type: object - type: object - status: - properties: - conditions: - items: - properties: - lastTransitionTime: - type: string - status: - type: string - type: - type: string - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: clusternetworkpolicies.crd.antrea.io -spec: - group: crd.antrea.io - names: - kind: ClusterNetworkPolicy - plural: clusternetworkpolicies - shortNames: - - acnp - singular: clusternetworkpolicy - scope: Cluster - versions: - - additionalPrinterColumns: - - description: The Tier to which this ClusterNetworkPolicy belongs to. - jsonPath: .spec.tier - name: Tier - type: string - - description: The Priority of this ClusterNetworkPolicy relative to other policies. - format: float - jsonPath: .spec.priority - name: Priority - type: number - - description: The total number of Nodes that should realize the NetworkPolicy. - format: int32 - jsonPath: .status.desiredNodesRealized - name: Desired Nodes - type: number - - description: The number of Nodes that have realized the NetworkPolicy. - format: int32 - jsonPath: .status.currentNodesRealized - name: Current Nodes - type: number - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - spec: - properties: - appliedTo: - items: - properties: - group: - type: string - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - egress: - items: - properties: - action: - enum: - - Allow - - Drop - - Reject - type: string - appliedTo: - items: - properties: - group: - type: string - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - enableLogging: - type: boolean - name: - type: string - ports: - items: - properties: - endPort: - type: integer - port: - x-kubernetes-int-or-string: true - protocol: - type: string - type: object - type: array - to: - items: - properties: - fqdn: - type: string - group: - type: string - ipBlock: - properties: - cidr: - format: cidr - type: string - type: object - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - namespaces: - properties: - match: - type: string - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - required: - - action - type: object - type: array - ingress: - items: - properties: - action: - enum: - - Allow - - Drop - - Reject - type: string - appliedTo: - items: - properties: - group: - type: string - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - enableLogging: - type: boolean - from: - items: - properties: - group: - type: string - ipBlock: - properties: - cidr: - format: cidr - type: string - type: object - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - namespaces: - properties: - match: - type: string - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - name: - type: string - ports: - items: - properties: - endPort: - type: integer - port: - x-kubernetes-int-or-string: true - protocol: - type: string - type: object - type: array - required: - - action - type: object - type: array - priority: - format: float - maximum: 10000 - minimum: 1 - type: number - tier: - type: string - required: - - priority - type: object - status: - properties: - currentNodesRealized: - type: integer - desiredNodesRealized: - type: integer - observedGeneration: - type: integer - phase: - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: clusternetworkpolicies.security.antrea.tanzu.vmware.com -spec: - group: security.antrea.tanzu.vmware.com - names: - kind: ClusterNetworkPolicy - plural: clusternetworkpolicies - shortNames: - - lacnp - singular: clusternetworkpolicy - scope: Cluster - versions: - - additionalPrinterColumns: - - description: The Tier to which this ClusterNetworkPolicy belongs to. - jsonPath: .spec.tier - name: Tier - type: string - - description: The Priority of this ClusterNetworkPolicy relative to other policies. - format: float - jsonPath: .spec.priority - name: Priority - type: number - - description: The total number of Nodes that should realize the NetworkPolicy. - format: int32 - jsonPath: .status.desiredNodesRealized - name: Desired Nodes - type: number - - description: The number of Nodes that have realized the NetworkPolicy. - format: int32 - jsonPath: .status.currentNodesRealized - name: Current Nodes - type: number - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - spec: - properties: - appliedTo: - items: - properties: - group: - type: string - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - egress: - items: - properties: - action: - enum: - - Allow - - Drop - - Reject - type: string - appliedTo: - items: - properties: - group: - type: string - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - enableLogging: - type: boolean - name: - type: string - ports: - items: - properties: - endPort: - type: integer - port: - x-kubernetes-int-or-string: true - protocol: - type: string - type: object - type: array - to: - items: - properties: - group: - type: string - ipBlock: - properties: - cidr: - format: cidr - type: string - type: object - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - namespaces: - properties: - match: - type: string - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - required: - - action - type: object - type: array - ingress: - items: - properties: - action: - enum: - - Allow - - Drop - - Reject - type: string - appliedTo: - items: - properties: - group: - type: string - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - enableLogging: - type: boolean - from: - items: - properties: - group: - type: string - ipBlock: - properties: - cidr: - format: cidr - type: string - type: object - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - namespaces: - properties: - match: - type: string - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - name: - type: string - ports: - items: - properties: - endPort: - type: integer - port: - x-kubernetes-int-or-string: true - protocol: - type: string - type: object - type: array - required: - - action - type: object - type: array - priority: - format: float - maximum: 10000 - minimum: 1 - type: number - tier: - type: string - required: - - priority - type: object - status: - properties: - currentNodesRealized: - type: integer - desiredNodesRealized: - type: integer - observedGeneration: - type: integer - phase: - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: egresses.crd.antrea.io -spec: - group: crd.antrea.io - names: - kind: Egress - plural: egresses - shortNames: - - eg - singular: egress - scope: Cluster - versions: - - additionalPrinterColumns: - - description: Specifies the SNAT IP address for the selected workloads. - jsonPath: .spec.egressIP - name: EgressIP - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: The Owner Node of egress IP - jsonPath: .status.egressNode - name: Node - type: string - name: v1alpha2 - schema: - openAPIV3Schema: - properties: - spec: - anyOf: - - required: - - egressIP - - required: - - externalIPPool - properties: - appliedTo: - properties: - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - egressIP: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - externalIPPool: - type: string - required: - - appliedTo - type: object - status: - properties: - egressNode: - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: externalentities.core.antrea.tanzu.vmware.com -spec: - group: core.antrea.tanzu.vmware.com - names: - kind: ExternalEntity - plural: externalentities - shortNames: - - lee - singular: externalentity - scope: Namespaced - versions: - - name: v1alpha2 - schema: - openAPIV3Schema: - properties: - spec: - properties: - endpoints: - items: - properties: - ip: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - name: - type: string - type: object - type: array - externalNode: - type: string - ports: - items: - properties: - name: - type: string - port: - x-kubernetes-int-or-string: true - protocol: - type: string - type: object - type: array - type: object - type: object - served: true - storage: true - - name: v1alpha1 - schema: - openAPIV3Schema: - type: object - served: false - storage: false ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: externalentities.crd.antrea.io -spec: - group: crd.antrea.io - names: - kind: ExternalEntity - plural: externalentities - shortNames: - - ee - singular: externalentity - scope: Namespaced - versions: - - name: v1alpha2 - schema: - openAPIV3Schema: - properties: - spec: - properties: - endpoints: - items: - properties: - ip: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - name: - type: string - type: object - type: array - externalNode: - type: string - ports: - items: - properties: - name: - type: string - port: - x-kubernetes-int-or-string: true - protocol: - type: string - type: object - type: array - type: object - type: object - served: true - storage: true - - name: v1alpha1 - schema: - openAPIV3Schema: - type: object - served: false - storage: false ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: externalippools.crd.antrea.io -spec: - group: crd.antrea.io - names: - kind: ExternalIPPool - plural: externalippools - shortNames: - - eip - singular: externalippool - scope: Cluster - versions: - - name: v1alpha2 - schema: - openAPIV3Schema: - properties: - spec: - properties: - ipRanges: - items: - oneOf: - - required: - - cidr - - required: - - start - - end - properties: - cidr: - format: cidr - type: string - end: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - start: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - type: object - type: array - nodeSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - required: - - ipRanges - - nodeSelector - type: object - required: - - spec - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: networkpolicies.crd.antrea.io -spec: - group: crd.antrea.io - names: - kind: NetworkPolicy - plural: networkpolicies - shortNames: - - anp - singular: networkpolicy - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The Tier to which this Antrea NetworkPolicy belongs to. - jsonPath: .spec.tier - name: Tier - type: string - - description: The Priority of this Antrea NetworkPolicy relative to other policies. - format: float - jsonPath: .spec.priority - name: Priority - type: number - - description: The total number of Nodes that should realize the NetworkPolicy. - format: int32 - jsonPath: .status.desiredNodesRealized - name: Desired Nodes - type: number - - description: The number of Nodes that have realized the NetworkPolicy. - format: int32 - jsonPath: .status.currentNodesRealized - name: Current Nodes - type: number - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - spec: - properties: - appliedTo: - items: - properties: - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - egress: - items: - properties: - action: - enum: - - Allow - - Drop - - Reject - type: string - appliedTo: - items: - properties: - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - enableLogging: - type: boolean - name: - type: string - ports: - items: - properties: - endPort: - type: integer - port: - x-kubernetes-int-or-string: true - protocol: - type: string - type: object - type: array - to: - items: - properties: - externalEntitySelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - fqdn: - type: string - ipBlock: - properties: - cidr: - format: cidr - type: string - type: object - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - required: - - action - type: object - type: array - ingress: - items: - properties: - action: - enum: - - Allow - - Drop - - Reject - type: string - appliedTo: - items: - properties: - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - enableLogging: - type: boolean - from: - items: - properties: - externalEntitySelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - ipBlock: - properties: - cidr: - format: cidr - type: string - type: object - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - name: - type: string - ports: - items: - properties: - endPort: - type: integer - port: - x-kubernetes-int-or-string: true - protocol: - type: string - type: object - type: array - required: - - action - type: object - type: array - priority: - format: float - maximum: 10000 - minimum: 1 - type: number - tier: - type: string - required: - - priority - type: object - status: - properties: - currentNodesRealized: - type: integer - desiredNodesRealized: - type: integer - observedGeneration: - type: integer - phase: - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: networkpolicies.security.antrea.tanzu.vmware.com -spec: - group: security.antrea.tanzu.vmware.com - names: - kind: NetworkPolicy - plural: networkpolicies - shortNames: - - lanp - singular: networkpolicy - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: The Tier to which this Antrea NetworkPolicy belongs to. - jsonPath: .spec.tier - name: Tier - type: string - - description: The Priority of this Antrea NetworkPolicy relative to other policies. - format: float - jsonPath: .spec.priority - name: Priority - type: number - - description: The total number of Nodes that should realize the NetworkPolicy. - format: int32 - jsonPath: .status.desiredNodesRealized - name: Desired Nodes - type: number - - description: The number of Nodes that have realized the NetworkPolicy. - format: int32 - jsonPath: .status.currentNodesRealized - name: Current Nodes - type: number - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - spec: - properties: - appliedTo: - items: - properties: - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - egress: - items: - properties: - action: - enum: - - Allow - - Drop - - Reject - type: string - appliedTo: - items: - properties: - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - enableLogging: - type: boolean - name: - type: string - ports: - items: - properties: - endPort: - type: integer - port: - x-kubernetes-int-or-string: true - protocol: - type: string - type: object - type: array - to: - items: - properties: - externalEntitySelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - ipBlock: - properties: - cidr: - format: cidr - type: string - type: object - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - required: - - action - type: object - type: array - ingress: - items: - properties: - action: - enum: - - Allow - - Drop - - Reject - type: string - appliedTo: - items: - properties: - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - enableLogging: - type: boolean - from: - items: - properties: - externalEntitySelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - ipBlock: - properties: - cidr: - format: cidr - type: string - type: object - namespaceSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - podSelector: - properties: - matchExpressions: - items: - properties: - key: - type: string - operator: - enum: - - In - - NotIn - - Exists - - DoesNotExist - type: string - values: - items: - type: string - type: array - type: object - type: array - matchLabels: - x-kubernetes-preserve-unknown-fields: true - type: object - type: object - type: array - name: - type: string - ports: - items: - properties: - endPort: - type: integer - port: - x-kubernetes-int-or-string: true - protocol: - type: string - type: object - type: array - required: - - action - type: object - type: array - priority: - format: float - maximum: 10000 - minimum: 1 - type: number - tier: - type: string - required: - - priority - type: object - status: - properties: - currentNodesRealized: - type: integer - desiredNodesRealized: - type: integer - observedGeneration: - type: integer - phase: - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: tierentitlementbindings.crd.antrea.tanzu.vmware.com -spec: - group: crd.antrea.tanzu.vmware.com - names: - kind: TierEntitlementBinding - plural: tierentitlementbindings - shortNames: - - teb - singular: tierentitlementbinding - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - spec: - properties: - subjects: - items: - properties: - apiGroup: - enum: - - rbac.authorization.k8s.io - type: string - kind: - enum: - - User - - Group - - ServiceAccount - type: string - name: - type: string - namespace: - type: string - type: object - type: array - tierEntitlement: - type: string - required: - - tierEntitlement - - subjects - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: tierentitlements.crd.antrea.tanzu.vmware.com -spec: - group: crd.antrea.tanzu.vmware.com - names: - kind: TierEntitlement - plural: tierentitlements - shortNames: - - te - singular: tierentitlement - scope: Cluster - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - spec: - properties: - permission: - enum: - - edit - - read - type: string - tiers: - items: - type: string - type: array - required: - - permission - - tiers - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: tiers.crd.antrea.io -spec: - group: crd.antrea.io - names: - kind: Tier - plural: tiers - shortNames: - - tr - singular: tier - scope: Cluster - versions: - - additionalPrinterColumns: - - description: The Priority of this Tier relative to other Tiers. - jsonPath: .spec.priority - name: Priority - type: integer - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - spec: - properties: - description: - type: string - priority: - maximum: 255 - minimum: 0 - type: integer - required: - - priority - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: tiers.security.antrea.tanzu.vmware.com -spec: - group: security.antrea.tanzu.vmware.com - names: - kind: Tier - plural: tiers - shortNames: - - ltr - singular: tier - scope: Cluster - versions: - - additionalPrinterColumns: - - description: The Priority of this Tier relative to other Tiers. - jsonPath: .spec.priority - name: Priority - type: integer - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - spec: - properties: - description: - type: string - priority: - maximum: 255 - minimum: 0 - type: integer - required: - - priority - type: object - type: object - served: true - storage: true ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: traceflows.crd.antrea.io -spec: - group: crd.antrea.io - names: - kind: Traceflow - plural: traceflows - shortNames: - - tf - singular: traceflow - scope: Cluster - versions: - - additionalPrinterColumns: - - description: The phase of the Traceflow. - jsonPath: .status.phase - name: Phase - type: string - - description: The name of the source Pod. - jsonPath: .spec.source.pod - name: Source-Pod - priority: 10 - type: string - - description: The name of the destination Pod. - jsonPath: .spec.destination.pod - name: Destination-Pod - priority: 10 - type: string - - description: The IP address of the destination. - jsonPath: .spec.destination.ip - name: Destination-IP - priority: 10 - type: string - - description: Trace live traffic. - jsonPath: .spec.liveTraffic - name: Live-Traffic - priority: 10 - type: boolean - - description: Capture only the dropped packet. - jsonPath: .spec.droppedOnly - name: Dropped-Only - priority: 10 - type: boolean - - description: Timeout in seconds. - jsonPath: .spec.timeout - name: Timeout - priority: 10 - type: integer - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - spec: - properties: - destination: - properties: - ip: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - namespace: - type: string - pod: - type: string - service: - type: string - type: object - droppedOnly: - type: boolean - liveTraffic: - type: boolean - packet: - properties: - ipHeader: - properties: - flags: - type: integer - protocol: - type: integer - srcIP: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - ttl: - type: integer - type: object - ipv6Header: - properties: - hopLimit: - type: integer - nextHeader: - type: integer - srcIP: - format: ipv6 - type: string - type: object - transportHeader: - properties: - icmp: - properties: - id: - type: integer - sequence: - type: integer - type: object - tcp: - properties: - dstPort: - type: integer - flags: - type: integer - srcPort: - type: integer - type: object - udp: - properties: - dstPort: - type: integer - srcPort: - type: integer - type: object - type: object - type: object - source: - properties: - ip: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - namespace: - type: string - pod: - type: string - type: object - timeout: - type: integer - type: object - status: - properties: - capturedPacket: - properties: - dstIP: - type: string - ipHeader: - properties: - flags: - type: integer - protocol: - type: integer - ttl: - type: integer - type: object - ipv6Header: - properties: - hopLimit: - type: integer - nextHeader: - type: integer - type: object - length: - type: integer - srcIP: - type: string - transportHeader: - properties: - icmp: - properties: - id: - type: integer - sequence: - type: integer - type: object - tcp: - properties: - dstPort: - type: integer - flags: - type: integer - srcPort: - type: integer - type: object - udp: - properties: - dstPort: - type: integer - srcPort: - type: integer - type: object - type: object - type: object - dataplaneTag: - type: integer - phase: - type: string - reason: - type: string - results: - items: - properties: - node: - type: string - observations: - items: - properties: - action: - type: string - component: - type: string - componentInfo: - type: string - dstMAC: - type: string - networkPolicy: - type: string - pod: - type: string - translatedDstIP: - type: string - translatedSrcIP: - type: string - ttl: - type: integer - tunnelDstIP: - type: string - type: object - type: array - role: - type: string - timestamp: - type: integer - type: object - type: array - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - labels: - app: antrea - name: traceflows.ops.antrea.tanzu.vmware.com -spec: - group: ops.antrea.tanzu.vmware.com - names: - kind: Traceflow - plural: traceflows - shortNames: - - ltf - singular: traceflow - scope: Cluster - versions: - - additionalPrinterColumns: - - description: The phase of the Traceflow. - jsonPath: .status.phase - name: Phase - type: string - - description: The name of the source Pod. - jsonPath: .spec.source.pod - name: Source-Pod - priority: 10 - type: string - - description: The name of the destination Pod. - jsonPath: .spec.destination.pod - name: Destination-Pod - priority: 10 - type: string - - description: The IP address of the destination. - jsonPath: .spec.destination.ip - name: Destination-IP - priority: 10 - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - spec: - properties: - destination: - properties: - ip: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - namespace: - type: string - pod: - type: string - service: - type: string - type: object - packet: - properties: - ipHeader: - properties: - flags: - type: integer - protocol: - type: integer - srcIP: - oneOf: - - format: ipv4 - - format: ipv6 - type: string - ttl: - type: integer - type: object - ipv6Header: - properties: - hopLimit: - type: integer - nextHeader: - type: integer - srcIP: - format: ipv6 - type: string - type: object - transportHeader: - properties: - icmp: - properties: - id: - type: integer - sequence: - type: integer - type: object - tcp: - properties: - dstPort: - type: integer - flags: - type: integer - srcPort: - type: integer - type: object - udp: - properties: - dstPort: - type: integer - srcPort: - type: integer - type: object - type: object - type: object - source: - properties: - namespace: - type: string - pod: - type: string - required: - - pod - - namespace - type: object - required: - - source - type: object - status: - properties: - dataplaneTag: - type: integer - phase: - type: string - reason: - type: string - results: - items: - properties: - node: - type: string - observations: - items: - properties: - action: - type: string - component: - type: string - componentInfo: - type: string - dstMAC: - type: string - networkPolicy: - type: string - pod: - type: string - translatedDstIP: - type: string - translatedSrcIP: - type: string - ttl: - type: integer - tunnelDstIP: - type: string - type: object - type: array - role: - type: string - timestamp: - type: integer - type: object - type: array - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: antrea - name: antctl - namespace: kube-system ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: antrea - name: antrea-agent - namespace: kube-system ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: antrea - name: antrea-controller - namespace: kube-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: antrea - rbac.authorization.k8s.io/aggregate-to-admin: "true" - rbac.authorization.k8s.io/aggregate-to-edit: "true" - name: aggregate-antrea-clustergroups-edit -rules: -- apiGroups: - - core.antrea.tanzu.vmware.com - resources: - - clustergroups - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - crd.antrea.io - resources: - - clustergroups - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: antrea - rbac.authorization.k8s.io/aggregate-to-view: "true" - name: aggregate-antrea-clustergroups-view -rules: -- apiGroups: - - core.antrea.tanzu.vmware.com - resources: - - clustergroups - verbs: - - get - - list - - watch -- apiGroups: - - crd.antrea.io - resources: - - clustergroups - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: antrea - rbac.authorization.k8s.io/aggregate-to-admin: "true" - rbac.authorization.k8s.io/aggregate-to-edit: "true" - name: aggregate-antrea-policies-edit -rules: -- apiGroups: - - security.antrea.tanzu.vmware.com - resources: - - clusternetworkpolicies - - networkpolicies - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - crd.antrea.io - resources: - - clusternetworkpolicies - - networkpolicies - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: antrea - rbac.authorization.k8s.io/aggregate-to-view: "true" - name: aggregate-antrea-policies-view -rules: -- apiGroups: - - security.antrea.tanzu.vmware.com - resources: - - clusternetworkpolicies - - networkpolicies - verbs: - - get - - list - - watch -- apiGroups: - - crd.antrea.io - resources: - - clusternetworkpolicies - - networkpolicies - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: antrea - rbac.authorization.k8s.io/aggregate-to-admin: "true" - rbac.authorization.k8s.io/aggregate-to-edit: "true" - name: aggregate-traceflows-edit -rules: -- apiGroups: - - ops.antrea.tanzu.vmware.com - resources: - - traceflows - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - crd.antrea.io - resources: - - traceflows - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: antrea - rbac.authorization.k8s.io/aggregate-to-view: "true" - name: aggregate-traceflows-view -rules: -- apiGroups: - - ops.antrea.tanzu.vmware.com - resources: - - traceflows - verbs: - - get - - list - - watch -- apiGroups: - - crd.antrea.io - resources: - - traceflows - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: antrea - name: antctl -rules: -- apiGroups: - - controlplane.antrea.tanzu.vmware.com - - controlplane.antrea.io - resources: - - networkpolicies - - appliedtogroups - - addressgroups - verbs: - - get - - list -- apiGroups: - - stats.antrea.tanzu.vmware.com - - stats.antrea.io - resources: - - networkpolicystats - - antreaclusternetworkpolicystats - - antreanetworkpolicystats - verbs: - - get - - list -- apiGroups: - - system.antrea.tanzu.vmware.com - - system.antrea.io - resources: - - controllerinfos - - agentinfos - verbs: - - get -- apiGroups: - - system.antrea.tanzu.vmware.com - - system.antrea.io - resources: - - supportbundles - verbs: - - get - - post -- apiGroups: - - system.antrea.tanzu.vmware.com - - system.antrea.io - resources: - - supportbundles/download - verbs: - - get -- nonResourceURLs: - - /agentinfo - - /addressgroups - - /appliedtogroups - - /loglevel - - /networkpolicies - - /ovsflows - - /ovstracing - - /podinterfaces - - /featuregates - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: antrea - name: antrea-agent -rules: -- apiGroups: - - "" - resources: - - nodes - verbs: - - get - - watch - - list - - patch -- apiGroups: - - "" - resources: - - pods - verbs: - - get - - watch - - list - - patch -- apiGroups: - - "" - resources: - - endpoints - - services - verbs: - - get - - watch - - list -- apiGroups: - - discovery.k8s.io - resources: - - endpointslices - verbs: - - get - - watch - - list -- apiGroups: - - clusterinformation.antrea.tanzu.vmware.com - - crd.antrea.io - resources: - - antreaagentinfos - verbs: - - get - - create - - update - - delete -- apiGroups: - - controlplane.antrea.tanzu.vmware.com - - controlplane.antrea.io - resources: - - networkpolicies - - appliedtogroups - - addressgroups - verbs: - - get - - watch - - list -- apiGroups: - - controlplane.antrea.io - resources: - - egressgroups - verbs: - - get - - watch - - list -- apiGroups: - - controlplane.antrea.tanzu.vmware.com - - controlplane.antrea.io - resources: - - nodestatssummaries - verbs: - - create -- apiGroups: - - controlplane.antrea.tanzu.vmware.com - - controlplane.antrea.io - resources: - - networkpolicies/status - verbs: - - create - - get -- apiGroups: - - authentication.k8s.io - resources: - - tokenreviews - verbs: - - create -- apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create -- apiGroups: - - "" - resourceNames: - - extension-apiserver-authentication - resources: - - configmaps - verbs: - - get - - list - - watch -- apiGroups: - - "" - resourceNames: - - antrea-ca - resources: - - configmaps - verbs: - - get - - watch - - list -- apiGroups: - - ops.antrea.tanzu.vmware.com - - crd.antrea.io - resources: - - traceflows - - traceflows/status - verbs: - - get - - watch - - list - - update - - patch - - create - - delete -- apiGroups: - - crd.antrea.io - resources: - - egresses - verbs: - - get - - watch - - list -- apiGroups: - - crd.antrea.io - resources: - - egresses/status - verbs: - - update -- apiGroups: - - crd.antrea.io - resources: - - externalippools - verbs: - - get - - watch - - list ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: antrea - name: antrea-cluster-identity-reader -rules: -- apiGroups: - - "" - resourceNames: - - antrea-cluster-identity - resources: - - configmaps - verbs: - - get ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app: antrea - name: antrea-controller -rules: -- apiGroups: - - "" - resources: - - pods - - namespaces - - services - - configmaps - verbs: - - get - - watch - - list -- apiGroups: - - "" - resources: - - nodes - verbs: - - get - - watch - - list - - patch -- apiGroups: - - networking.k8s.io - resources: - - networkpolicies - verbs: - - get - - watch - - list -- apiGroups: - - authentication.k8s.io - resources: - - tokenreviews - verbs: - - create -- apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create -- apiGroups: - - apiextensions.k8s.io - resources: - - customresourcedefinitions - verbs: - - get - - update -- apiGroups: - - "" - resourceNames: - - extension-apiserver-authentication - resources: - - configmaps - verbs: - - get - - list - - watch -- apiGroups: - - "" - resourceNames: - - antrea-ca - - antrea-cluster-identity - resources: - - configmaps - verbs: - - get - - update -- apiGroups: - - "" - resources: - - configmaps - verbs: - - create -- apiGroups: - - "" - resourceNames: - - antrea-config-822fk25299 - resources: - - configmaps - verbs: - - get -- apiGroups: - - apiregistration.k8s.io - resourceNames: - - v1alpha1.stats.antrea.tanzu.vmware.com - - v1beta1.system.antrea.tanzu.vmware.com - - v1beta2.controlplane.antrea.tanzu.vmware.com - - v1beta1.controlplane.antrea.tanzu.vmware.com - - v1alpha1.stats.antrea.io - - v1beta1.system.antrea.io - - v1beta2.controlplane.antrea.io - resources: - - apiservices - verbs: - - get - - update -- apiGroups: - - apiregistration.k8s.io - resourceNames: - - v1beta1.networking.antrea.tanzu.vmware.com - resources: - - apiservices - verbs: - - delete -- apiGroups: - - admissionregistration.k8s.io - resourceNames: - - crdmutator.antrea.tanzu.vmware.com - - crdvalidator.antrea.tanzu.vmware.com - - labelsmutator.antrea.io - - crdmutator.antrea.io - - crdvalidator.antrea.io - resources: - - mutatingwebhookconfigurations - - validatingwebhookconfigurations - verbs: - - get - - update -- apiGroups: - - crd.antrea.io - resources: - - antreacontrollerinfos - verbs: - - get - - create - - update - - delete -- apiGroups: - - crd.antrea.io - resources: - - antreaagentinfos - verbs: - - list - - delete -- apiGroups: - - crd.antrea.io - resources: - - clusternetworkpolicies - - networkpolicies - verbs: - - get - - watch - - list - - update - - patch - - create - - delete -- apiGroups: - - crd.antrea.io - resources: - - clusternetworkpolicies/status - - networkpolicies/status - verbs: - - update -- apiGroups: - - crd.antrea.io - resources: - - tiers - verbs: - - get - - watch - - list - - update - - patch - - create - - delete -- apiGroups: - - crd.antrea.io - resources: - - traceflows - - traceflows/status - verbs: - - get - - watch - - list - - update - - patch - - create - - delete -- apiGroups: - - crd.antrea.io - resources: - - externalentities - - clustergroups - verbs: - - get - - watch - - list - - update - - patch - - create - - delete -- apiGroups: - - crd.antrea.io - resources: - - clustergroups/status - verbs: - - update -- apiGroups: - - crd.antrea.io - resources: - - egresses - verbs: - - get - - watch - - list - - update - - patch -- apiGroups: - - crd.antrea.io - resources: - - externalippools - verbs: - - get - - watch - - list -- apiGroups: - - clusterinformation.antrea.tanzu.vmware.com - resources: - - antreacontrollerinfos - verbs: - - get - - create - - update - - delete -- apiGroups: - - clusterinformation.antrea.tanzu.vmware.com - resources: - - antreaagentinfos - verbs: - - list - - delete -- apiGroups: - - security.antrea.tanzu.vmware.com - resources: - - clusternetworkpolicies - - networkpolicies - verbs: - - get - - watch - - list - - update - - patch - - create - - delete -- apiGroups: - - security.antrea.tanzu.vmware.com - resources: - - clusternetworkpolicies/status - - networkpolicies/status - verbs: - - update -- apiGroups: - - security.antrea.tanzu.vmware.com - resources: - - tiers - verbs: - - get - - watch - - list - - update - - patch - - create - - delete -- apiGroups: - - crd.antrea.tanzu.vmware.com - resources: - - tierentitlements - - tierentitlementbindings - verbs: - - get - - watch - - list -- apiGroups: - - ops.antrea.tanzu.vmware.com - resources: - - traceflows - - traceflows/status - verbs: - - get - - watch - - list - - update - - patch - - create - - delete -- apiGroups: - - core.antrea.tanzu.vmware.com - resources: - - externalentities - - clustergroups - verbs: - - get - - watch - - list - - update - - patch - - create - - delete -- apiGroups: - - core.antrea.tanzu.vmware.com - resources: - - clustergroups/status - verbs: - - update ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app: antrea - name: antctl - namespace: kube-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: antctl -subjects: -- kind: ServiceAccount - name: antctl - namespace: kube-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app: antrea - name: antrea-agent -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: antrea-agent -subjects: -- kind: ServiceAccount - name: antrea-agent - namespace: kube-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app: antrea - name: antrea-controller -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: antrea-controller -subjects: -- kind: ServiceAccount - name: antrea-controller - namespace: kube-system ---- -apiVersion: v1 -data: - antrea-agent-tweaker.conf: |- - # Enable disableUdpTunnelOffload will disable udp tunnel offloading feature on kubernetes node's default interface. - # By default, no actions will be taken. - disableUdpTunnelOffload: false -kind: ConfigMap -metadata: - labels: - app: antrea - name: antrea-agent-tweaker-g56hc6fh8t - namespace: kube-system ---- -apiVersion: v1 -data: - antrea-agent.conf: | - # FeatureGates is a map of feature names to bools that enable or disable experimental features. - featureGates: - # Enable AntreaProxy which provides ServiceLB for in-cluster Services in antrea-agent. - # It should be enabled on Windows, otherwise NetworkPolicy will not take effect on - # Service traffic. - # AntreaProxy: true - - # Enable EndpointSlice support in AntreaProxy. Don't enable this feature unless that EndpointSlice - # API version v1beta1 is supported and set as enabled in Kubernetes. If AntreaProxy is not enabled, - # this flag will not take effect. - # EndpointSlice: false - - # Enable traceflow which provides packet tracing feature to diagnose network issue. - # Traceflow: true - - # Enable NodePortLocal feature to make the pods reachable externally through NodePort - # NodePortLocal: false - - # Enable Antrea ClusterNetworkPolicy feature to complement K8s NetworkPolicy for cluster admins - # to define security policies which apply to the entire cluster, and Antrea NetworkPolicy - # feature that supports priorities, rule actions and externalEntities in the future. - # AntreaPolicy: true - - # Enable flowexporter which exports polled conntrack connections as IPFIX flow records from each - # agent to a configured collector. - # FlowExporter: false - - # Enable collecting and exposing NetworkPolicy statistics. - # NetworkPolicyStats: true - - # Enable controlling SNAT IPs of Pod egress traffic. - # Egress: false - - # Name of the OpenVSwitch bridge antrea-agent will create and use. - # Make sure it doesn't conflict with your existing OpenVSwitch bridges. - #ovsBridge: br-int - - # Datapath type to use for the OpenVSwitch bridge created by Antrea. Supported values are: - # - system - # - netdev - # 'system' is the default value and corresponds to the kernel datapath. Use 'netdev' to run - # OVS in userspace mode. Userspace mode requires the tun device driver to be available. - #ovsDatapathType: system - - # Name of the interface antrea-agent will create and use for host <--> pod communication. - # Make sure it doesn't conflict with your existing interfaces. - #hostGateway: antrea-gw0 - - # Determines how traffic is encapsulated. It has the following options: - # encap(default): Inter-node Pod traffic is always encapsulated and Pod to external network - # traffic is SNAT'd. - # noEncap: Inter-node Pod traffic is not encapsulated; Pod to external network traffic is - # SNAT'd if noSNAT is not set to true. Underlying network must be capable of - # supporting Pod traffic across IP subnets. - # hybrid: noEncap if source and destination Nodes are on the same subnet, otherwise encap. - # networkPolicyOnly: Antrea enforces NetworkPolicy only, and utilizes CNI chaining and delegates Pod - # IPAM and connectivity to the primary CNI. - # - #trafficEncapMode: encap - - # Whether or not to SNAT (using the Node IP) the egress traffic from a Pod to the external network. - # This option is for the noEncap traffic mode only, and the default value is false. In the noEncap - # mode, if the cluster's Pod CIDR is reachable from the external network, then the Pod traffic to - # the external network needs not be SNAT'd. In the networkPolicyOnly mode, antrea-agent never - # performs SNAT and this option will be ignored; for other modes it must be set to false. - #noSNAT: false - - # Tunnel protocols used for encapsulating traffic across Nodes. Supported values: - # - geneve (default) - # - vxlan - # - gre - # - stt - #tunnelType: geneve - - # Default MTU to use for the host gateway interface and the network interface of each Pod. - # If omitted, antrea-agent will discover the MTU of the Node's primary interface and - # also adjust MTU to accommodate for tunnel encapsulation overhead (if applicable). - #defaultMTU: 0 - - # Whether or not to enable IPsec encryption of tunnel traffic. - #enableIPSecTunnel: false - - # ClusterIP CIDR range for Services. It's required when AntreaProxy is not enabled, and should be - # set to the same value as the one specified by --service-cluster-ip-range for kube-apiserver. When - # AntreaProxy is enabled, this parameter is not needed and will be ignored if provided. - #serviceCIDR: 10.96.0.0/12 - - # ClusterIP CIDR range for IPv6 Services. It's required when using kube-proxy to provide IPv6 Service in a Dual-Stack - # cluster or an IPv6 only cluster. The value should be the same as the configuration for kube-apiserver specified by - # --service-cluster-ip-range. When AntreaProxy is enabled, this parameter is not needed. - # No default value for this field. - #serviceCIDRv6: - - # The port for the antrea-agent APIServer to serve on. - # Note that if it's set to another value, the `containerPort` of the `api` port of the - # `antrea-agent` container must be set to the same value. - #apiPort: 10350 - - # Enable metrics exposure via Prometheus. Initializes Prometheus metrics listener. - #enablePrometheusMetrics: true - - # Provide the IPFIX collector address as a string with format :[][:]. - # HOST can either be the DNS name or the IP of the Flow Collector. For example, - # "flow-aggregator.flow-aggregator.svc" can be provided as DNS name to connect - # to the Antrea Flow Aggregator service. If IP, it can be either IPv4 or IPv6. - # However, IPv6 address should be wrapped with []. - # If PORT is empty, we default to 4739, the standard IPFIX port. - # If no PROTO is given, we consider "tls" as default. We support "tls", "tcp" and - # "udp" protocols. "tls" is used for securing communication between flow exporter and - # flow aggregator. - #flowCollectorAddr: "flow-aggregator.flow-aggregator.svc:4739:tls" - - # Provide flow poll interval as a duration string. This determines how often the - # flow exporter dumps connections from the conntrack module. Flow poll interval - # should be greater than or equal to 1s (one second). - # Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". - #flowPollInterval: "5s" - - # Provide the active flow export timeout, which is the timeout after which a flow - # record is sent to the collector for active flows. Thus, for flows with a continuous - # stream of packets, a flow record will be exported to the collector once the elapsed - # time since the last export event is equal to the value of this timeout. - # Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". - #activeFlowExportTimeout: "30s" - - # Provide the idle flow export timeout, which is the timeout after which a flow - # record is sent to the collector for idle flows. A flow is considered idle if no - # packet matching this flow has been observed since the last export event. - # Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". - #idleFlowExportTimeout: "15s" - - # Provide the port range used by NodePortLocal. When the NodePortLocal feature is enabled, a port from that range will be assigned - # whenever a Pod's container defines a specific port to be exposed (each container can define a list of ports as pod.spec.containers[].ports), - # and all Node traffic directed to that port will be forwarded to the Pod. - #nplPortRange: 61000-62000 - - # Provide the address of Kubernetes apiserver, to override any value provided in kubeconfig or InClusterConfig. - # Defaults to "". It must be a host string, a host:port pair, or a URL to the base of the apiserver. - #kubeAPIServerOverride: "" - - # Comma-separated list of Cipher Suites. If omitted, the default Go Cipher Suites will be used. - # https://golang.org/pkg/crypto/tls/#pkg-constants - # Note that TLS1.3 Cipher Suites cannot be added to the list. But the apiserver will always - # prefer TLS1.3 Cipher Suites whenever possible. - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - # TLS min version from: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13. - #tlsMinVersion: - antrea-cni.conflist: | - { - "cniVersion":"0.3.0", - "name": "antrea", - "plugins": [ - { - "type": "antrea", - "ipam": { - "type": "host-local" - } - }, - { - "type": "portmap", - "capabilities": {"portMappings": true} - }, - { - "type": "bandwidth", - "capabilities": {"bandwidth": true} - } - ] - } - antrea-controller.conf: | - # FeatureGates is a map of feature names to bools that enable or disable experimental features. - featureGates: - # Enable traceflow which provides packet tracing feature to diagnose network issue. - # Traceflow: true - - # Enable Antrea ClusterNetworkPolicy feature to complement K8s NetworkPolicy for cluster admins - # to define security policies which apply to the entire cluster, and Antrea NetworkPolicy - # feature that supports priorities, rule actions and externalEntities in the future. - # AntreaPolicy: true - - # Enable collecting and exposing NetworkPolicy statistics. - # NetworkPolicyStats: true - - # Enable controlling SNAT IPs of Pod egress traffic. - # Egress: false - - # Run Kubernetes NodeIPAMController with Antrea. - # NodeIPAM: false - - # The port for the antrea-controller APIServer to serve on. - # Note that if it's set to another value, the `containerPort` of the `api` port of the - # `antrea-controller` container must be set to the same value. - #apiPort: 10349 - - # Enable metrics exposure via Prometheus. Initializes Prometheus metrics listener. - #enablePrometheusMetrics: true - - # Indicates whether to use auto-generated self-signed TLS certificate. - # If false, A Secret named "antrea-controller-tls" must be provided with the following keys: - # ca.crt: - # tls.crt: - # tls.key: - # And the Secret must be mounted to directory "/var/run/antrea/antrea-controller-tls" of the - # antrea-controller container. - #selfSignedCert: true - - # Comma-separated list of Cipher Suites. If omitted, the default Go Cipher Suites will be used. - # https://golang.org/pkg/crypto/tls/#pkg-constants - # Note that TLS1.3 Cipher Suites cannot be added to the list. But the apiserver will always - # prefer TLS1.3 Cipher Suites whenever possible. - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - - # TLS min version from: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13. - #tlsMinVersion: - - # If Antrea is upgraded from version <= v0.13 and legacy CRDs are used, this option should be - # enabled, otherwise the CRDs created with the legacy API groups will not take any effect and - # work as expected. When the mirroring is enabled, if a legacy CRD is created with legacy API - # groups, mirroring-controller will create a new CRD with the Spec and Labels from the legacy - # CRD. Afterwards, the modification of Spec and Label in legacy CRD will be synchronized to new - # CRD automatically. In addition, the modification of Status in new CRD will also be synchronized - # to legacy CRD automatically. If a legacy CRD is deleted, the corresponding new CRD will be deleted. - # Note that: to decouple a new CRD from the corresponding legacy CRD, the legacy CRD should be - # annotated with "crd.antrea.io/stop-mirror". Afterwards, updates to the legacy CRDs will no - # longer be reflected in the new CRD, and all CRUD operations should be done through the new - # API groups. After adding the annotation, legacy CRDs can be deleted safely without impacting - # new CRDs. - #legacyCRDMirroring: true - - # Enable usage reporting (telemetry) to VMware. - #enableUsageReporting: false - nodeIPAM: - # Enable the integrated Node IPAM controller within the Antrea controller. - # enableNodeIPAM: false - - # CIDR Ranges for Pods in cluster. String array containing single CIDR range, or multiple ranges. - # The CIDRs could be either IPv4 or IPv6. Value ignored when enableNodeIPAM is false. - # clusterCIDRs: [] - - # CIDR Ranges for Services in cluster. It is not necessary to specify it when there is no overlap with clusterCIDRs. - # Value ignored when enableNodeIPAM is false. - # serviceCIDR: - # serviceCIDRv6: - - # Mask size for IPv4 Node CIDR in IPv4 or dual-stack cluster. Value ignored when enableNodeIPAM is false - # or when IPv4 Pod CIDR is not configured. Valid range is 16 to 30. - # nodeCIDRMaskSizeIPv4: 24 - - # Mask size for IPv6 Node CIDR in IPv6 or dual-stack cluster. Value ignored when enableNodeIPAM is false - # or when IPv6 Pod CIDR is not configured. Valid range is 64 to 126. - # nodeCIDRMaskSizeIPv6: 64 - - enterpriseAntrea: true -kind: ConfigMap -metadata: - annotations: {} - labels: - app: antrea - name: antrea-config-822fk25299 - namespace: kube-system ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app: antrea - name: antrea - namespace: kube-system -spec: - ports: - - port: 443 - protocol: TCP - targetPort: api - selector: - app: antrea - component: antrea-controller ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: antrea - component: antrea-controller - name: antrea-controller - namespace: kube-system -spec: - replicas: 1 - selector: - matchLabels: - app: antrea - component: antrea-controller - strategy: - type: Recreate - template: - metadata: - labels: - app: antrea - component: antrea-controller - spec: - containers: - - args: - - --config - - /etc/antrea/antrea-controller.conf - - --logtostderr=false - - --log_dir=/var/log/antrea - - --alsologtostderr - - --log_file_max_size=100 - - --log_file_max_num=4 - - --v=0 - command: - - antrea-controller - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: SERVICEACCOUNT_NAME - valueFrom: - fieldRef: - fieldPath: spec.serviceAccountName - - name: ANTREA_CONFIG_MAP_NAME - value: antrea-config-822fk25299 - image: antrea/antrea-ubuntu:v1.2.3 - imagePullPolicy: IfNotPresent - livenessProbe: - failureThreshold: 5 - httpGet: - host: localhost - path: /livez - port: api - scheme: HTTPS - periodSeconds: 10 - timeoutSeconds: 5 - name: antrea-controller - ports: - - containerPort: 10349 - name: api - protocol: TCP - readinessProbe: - failureThreshold: 5 - httpGet: - host: localhost - path: /readyz - port: api - scheme: HTTPS - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 5 - resources: - requests: - cpu: 200m - volumeMounts: - - mountPath: /etc/antrea/antrea-controller.conf - name: antrea-config - readOnly: true - subPath: antrea-controller.conf - - mountPath: /var/run/antrea/antrea-controller-tls - name: antrea-controller-tls - - mountPath: /var/log/antrea - name: host-var-log-antrea - hostNetwork: true - nodeSelector: - kubernetes.io/os: linux - priorityClassName: system-cluster-critical - serviceAccountName: antrea-controller - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/master - volumes: - - configMap: - name: antrea-config-822fk25299 - name: antrea-config - - name: antrea-controller-tls - secret: - defaultMode: 256 - optional: true - secretName: antrea-controller-tls - - hostPath: - path: /var/log/antrea - type: DirectoryOrCreate - name: host-var-log-antrea ---- -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - labels: - app: antrea - name: v1alpha1.stats.antrea.io -spec: - group: stats.antrea.io - groupPriorityMinimum: 100 - service: - name: antrea - namespace: kube-system - version: v1alpha1 - versionPriority: 100 ---- -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - labels: - app: antrea - name: v1alpha1.stats.antrea.tanzu.vmware.com -spec: - group: stats.antrea.tanzu.vmware.com - groupPriorityMinimum: 100 - service: - name: antrea - namespace: kube-system - version: v1alpha1 - versionPriority: 100 ---- -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - labels: - app: antrea - name: v1beta1.controlplane.antrea.tanzu.vmware.com -spec: - group: controlplane.antrea.tanzu.vmware.com - groupPriorityMinimum: 100 - service: - name: antrea - namespace: kube-system - version: v1beta1 - versionPriority: 100 ---- -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - labels: - app: antrea - name: v1beta1.system.antrea.io -spec: - group: system.antrea.io - groupPriorityMinimum: 100 - service: - name: antrea - namespace: kube-system - version: v1beta1 - versionPriority: 100 ---- -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - labels: - app: antrea - name: v1beta1.system.antrea.tanzu.vmware.com -spec: - group: system.antrea.tanzu.vmware.com - groupPriorityMinimum: 100 - service: - name: antrea - namespace: kube-system - version: v1beta1 - versionPriority: 100 ---- -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - labels: - app: antrea - name: v1beta2.controlplane.antrea.io -spec: - group: controlplane.antrea.io - groupPriorityMinimum: 100 - service: - name: antrea - namespace: kube-system - version: v1beta2 - versionPriority: 100 ---- -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - labels: - app: antrea - name: v1beta2.controlplane.antrea.tanzu.vmware.com -spec: - group: controlplane.antrea.tanzu.vmware.com - groupPriorityMinimum: 100 - service: - name: antrea - namespace: kube-system - version: v1beta2 - versionPriority: 100 ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - labels: - app: antrea - component: antrea-agent - name: antrea-agent - namespace: kube-system -spec: - selector: - matchLabels: - app: antrea - component: antrea-agent - template: - metadata: - annotations: - kubectl.kubernetes.io/default-container: antrea-agent - labels: - app: antrea - component: antrea-agent - spec: - containers: - - args: - - --config - - /etc/antrea/antrea-agent.conf - - --logtostderr=false - - --log_dir=/var/log/antrea - - --alsologtostderr - - --log_file_max_size=100 - - --log_file_max_num=4 - - --v=0 - command: - - antrea-agent - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - image: antrea/antrea-ubuntu:v1.2.3 - imagePullPolicy: IfNotPresent - livenessProbe: - exec: - command: - - /bin/sh - - -c - - container_liveness_probe agent - failureThreshold: 5 - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 5 - name: antrea-agent - ports: - - containerPort: 10350 - name: api - protocol: TCP - readinessProbe: - failureThreshold: 8 - httpGet: - host: localhost - path: /readyz - port: api - scheme: HTTPS - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 5 - resources: - requests: - cpu: 200m - securityContext: - privileged: true - volumeMounts: - - mountPath: /etc/antrea/antrea-agent.conf - name: antrea-config - readOnly: true - subPath: antrea-agent.conf - - mountPath: /var/run/antrea - name: host-var-run-antrea - - mountPath: /var/run/openvswitch - name: host-var-run-antrea - subPath: openvswitch - - mountPath: /var/lib/cni - name: host-var-run-antrea - subPath: cni - - mountPath: /var/log/antrea - name: host-var-log-antrea - - mountPath: /host/proc - name: host-proc - readOnly: true - - mountPath: /host/var/run/netns - mountPropagation: HostToContainer - name: host-var-run-netns - readOnly: true - - mountPath: /run/xtables.lock - name: xtables-lock - - args: - - --log_file_max_size=100 - - --log_file_max_num=4 - command: - - start_ovs - image: antrea/antrea-ubuntu:v1.2.3 - imagePullPolicy: IfNotPresent - livenessProbe: - exec: - command: - - /bin/sh - - -c - - timeout 10 container_liveness_probe ovs - failureThreshold: 5 - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 10 - name: antrea-ovs - resources: - requests: - cpu: 200m - securityContext: - capabilities: - add: - - SYS_NICE - - NET_ADMIN - - SYS_ADMIN - - IPC_LOCK - volumeMounts: - - mountPath: /var/run/openvswitch - name: host-var-run-antrea - subPath: openvswitch - - mountPath: /var/log/openvswitch - name: host-var-log-antrea - subPath: openvswitch - dnsPolicy: ClusterFirstWithHostNet - hostNetwork: true - initContainers: - - command: - - install_cni - image: antrea/antrea-ubuntu:v1.2.3 - imagePullPolicy: IfNotPresent - name: install-cni - resources: - requests: - cpu: 100m - securityContext: - capabilities: - add: - - SYS_MODULE - volumeMounts: - - mountPath: /etc/antrea/antrea-cni.conflist - name: antrea-config - readOnly: true - subPath: antrea-cni.conflist - - mountPath: /host/etc/cni/net.d - name: host-cni-conf - - mountPath: /host/opt/cni/bin - name: host-cni-bin - - mountPath: /lib/modules - name: host-lib-modules - readOnly: true - - mountPath: /var/run/antrea - name: host-var-run-antrea - - args: - - --config - - /etc/antrea/antrea-agent-tweaker.conf - command: - - antrea-agent-tweaker - env: - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - image: antrea/antrea-ubuntu:v1.2.3 - name: antrea-agent-tweaker - resources: - requests: - cpu: 100m - securityContext: - capabilities: - add: - - NET_ADMIN - volumeMounts: - - mountPath: /etc/antrea/antrea-agent-tweaker.conf - name: antrea-agent-tweaker-config - subPath: antrea-agent-tweaker.conf - nodeSelector: - kubernetes.io/os: linux - priorityClassName: system-node-critical - serviceAccountName: antrea-agent - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - operator: Exists - - effect: NoExecute - operator: Exists - volumes: - - configMap: - name: antrea-config-822fk25299 - name: antrea-config - - configMap: - name: antrea-agent-tweaker-g56hc6fh8t - name: antrea-agent-tweaker-config - - hostPath: - path: /etc/cni/net.d - name: host-cni-conf - - hostPath: - path: /opt/cni/bin - name: host-cni-bin - - hostPath: - path: /proc - name: host-proc - - hostPath: - path: /var/run/netns - name: host-var-run-netns - - hostPath: - path: /var/run/antrea - type: DirectoryOrCreate - name: host-var-run-antrea - - hostPath: - path: /var/log/antrea - type: DirectoryOrCreate - name: host-var-log-antrea - - hostPath: - path: /lib/modules - name: host-lib-modules - - hostPath: - path: /run/xtables.lock - type: FileOrCreate - name: xtables-lock - updateStrategy: - type: RollingUpdate ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - labels: - app: antrea - name: crdmutator.antrea.io -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /mutate/acnp - name: acnpmutator.antrea.io - rules: - - apiGroups: - - crd.antrea.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - clusternetworkpolicies - scope: Cluster - sideEffects: None - timeoutSeconds: 5 -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /mutate/anp - name: anpmutator.antrea.io - rules: - - apiGroups: - - crd.antrea.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - networkpolicies - scope: Namespaced - sideEffects: None - timeoutSeconds: 5 ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: MutatingWebhookConfiguration -metadata: - labels: - app: antrea - name: crdmutator.antrea.tanzu.vmware.com -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /mutate/acnp - name: acnpmutator.antrea.tanzu.vmware.com - rules: - - apiGroups: - - security.antrea.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - clusternetworkpolicies - scope: Cluster - sideEffects: None - timeoutSeconds: 5 -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /mutate/anp - name: anpmutator.antrea.tanzu.vmware.com - rules: - - apiGroups: - - security.antrea.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - networkpolicies - scope: Namespaced - sideEffects: None - timeoutSeconds: 5 ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - labels: - app: antrea - name: crdvalidator.antrea.io -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /validate/tier - name: tiervalidator.antrea.io - rules: - - apiGroups: - - crd.antrea.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - tiers - scope: Cluster - sideEffects: None - timeoutSeconds: 5 -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /validate/acnp - name: acnpvalidator.antrea.io - rules: - - apiGroups: - - crd.antrea.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - clusternetworkpolicies - scope: Cluster - sideEffects: None - timeoutSeconds: 5 -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /validate/anp - name: anpvalidator.antrea.io - rules: - - apiGroups: - - crd.antrea.io - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - networkpolicies - scope: Namespaced - sideEffects: None - timeoutSeconds: 5 -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /validate/clustergroup - name: clustergroupvalidator.antrea.io - rules: - - apiGroups: - - crd.antrea.io - apiVersions: - - v1alpha3 - - v1alpha2 - operations: - - CREATE - - UPDATE - resources: - - clustergroups - scope: Cluster - sideEffects: None - timeoutSeconds: 5 -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /validate/externalippool - name: externalippoolvalidator.antrea.io - rules: - - apiGroups: - - crd.antrea.io - apiVersions: - - v1alpha2 - operations: - - UPDATE - resources: - - externalippools - scope: Cluster - sideEffects: None - timeoutSeconds: 5 -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /validate/egress - name: egressvalidator.antrea.io - rules: - - apiGroups: - - crd.antrea.io - apiVersions: - - v1alpha2 - operations: - - CREATE - - UPDATE - resources: - - egresses - scope: Cluster - sideEffects: None - timeoutSeconds: 5 ---- -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - labels: - app: antrea - name: crdvalidator.antrea.tanzu.vmware.com -webhooks: -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /validate/tier - name: tiervalidator.antrea.tanzu.vmware.com - rules: - - apiGroups: - - security.antrea.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - tiers - scope: Cluster - sideEffects: None - timeoutSeconds: 5 -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /validate/acnp - name: acnpvalidator.antrea.tanzu.vmware.com - rules: - - apiGroups: - - security.antrea.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - clusternetworkpolicies - scope: Cluster - sideEffects: None - timeoutSeconds: 5 -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /validate/anp - name: anpvalidator.antrea.tanzu.vmware.com - rules: - - apiGroups: - - security.antrea.tanzu.vmware.com - apiVersions: - - v1alpha1 - operations: - - CREATE - - UPDATE - resources: - - networkpolicies - scope: Namespaced - sideEffects: None - timeoutSeconds: 5 -- admissionReviewVersions: - - v1 - - v1beta1 - clientConfig: - service: - name: antrea - namespace: kube-system - path: /validate/clustergroup - name: clustergroupvalidator.antrea.tanzu.vmware.com - rules: - - apiGroups: - - core.antrea.tanzu.vmware.com - apiVersions: - - v1alpha2 - operations: - - CREATE - - UPDATE - - DELETE - resources: - - clustergroups - scope: Cluster - sideEffects: None - timeoutSeconds: 5 diff --git a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/values.star b/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/values.star deleted file mode 100644 index 516c5be8c7..0000000000 --- a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/values.star +++ /dev/null @@ -1,12 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:assert", "assert") - -def validate_antrea(): - data.values.infraProvider or assert.fail("Infrastructure provider should be provided") -end - -#export -values = data.values - -# validate -validate_antrea() diff --git a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/values.yaml b/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/values.yaml deleted file mode 100644 index cb01e1644e..0000000000 --- a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/antrea/1.2.3/bundle/config/values.yaml +++ /dev/null @@ -1,25 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True - ---- -infraProvider: vsphere -antrea: - config: - serviceCIDR: 10.96.0.0/12 - serviceCIDRv6: null - trafficEncapMode: encap - noSNAT: false - disableUdpTunnelOffload: false - #! Setting defaultMTU to null since antrea-agent will discover the MTU of the Node's primary interface and - #! also adjust MTU to accommodate for tunnel encapsulation overhead. - defaultMTU: null - tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384 - featureGates: - AntreaProxy: true - EndpointSlice: false - AntreaPolicy: true - FlowExporter: false - Egress: false - NodePortLocal: false - AntreaTraceflow: true - NetworkPolicyStats: false diff --git a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/overlay/calico_overlay.yaml b/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/overlay/calico_overlay.yaml deleted file mode 100644 index 4b81805f53..0000000000 --- a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/overlay/calico_overlay.yaml +++ /dev/null @@ -1,150 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("/values.star", "values") -#@ load("@ytt:json", "json") - -#@ def startswith(index, left, right): -#@ return left.startswith(right) -#@ end - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "calico-kube-controllers"}}) ---- -kind: Deployment -metadata: - name: calico-kube-controllers - #@overlay/match missing_ok=True - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" - kapp.k14s.io/update-strategy: always-replace - -#@overlay/match by=overlay.subset({"kind":"DaemonSet", "metadata": {"name": "calico-node"}}) ---- -kind: DaemonSet -metadata: - #@overlay/match missing_ok=True - annotations: - kapp.k14s.io/disable-default-label-scoping-rules: "" -spec: - template: - spec: - containers: - #@overlay/match by=overlay.subset({"name":"calico-node"}) - - name: calico-node - env: - #@ if values.ipFamily == "ipv6": - #@overlay/match by=overlay.subset({"name":"IP"}) - - value: none - #@overlay/match by=overlay.subset({"name":"FELIX_IPV6SUPPORT"}) - - value: "true" - #@overlay/match by=overlay.subset({"name":"CALICO_IPV4POOL_IPIP"}) - #@overlay/remove - - {} - #@overlay/match by=overlay.subset({"name":"CALICO_IPV4POOL_VXLAN"}) - #@overlay/remove - - {} - #! Calico v3.19.1 support cluster CIDR auto-detect. - #! So the cluster CIDR is only appended when configured in values. - #@ if values.calico.config.clusterCIDR: - #@overlay/append - - name: CALICO_IPV6POOL_CIDR - value: #@ values.calico.config.clusterCIDR - #@ end - #@overlay/append - - name: IP6 - value: autodetect - #@overlay/append - - name: CALICO_ROUTER_ID - value: hash - #@overlay/append - - name: CALICO_IPV6POOL_NAT_OUTGOING - value: "true" - #@ elif values.ipFamily in ["ipv4,ipv6", "ipv6,ipv4"]: - #@overlay/match by=overlay.subset({"name":"FELIX_IPV6SUPPORT"}) - - value: "true" - #! Calico v3.19.1 support cluster CIDR auto-detect. - #! So the cluster CIDR is only appended when configured in values. - #@ if values.calico.config.clusterCIDR: - #@overlay/append - - name: CALICO_IPV4POOL_CIDR - #@ if values.ipFamily == "ipv4,ipv6": - value: #@ values.calico.config.clusterCIDR.split(",")[0] - #@ else: - value: #@ values.calico.config.clusterCIDR.split(",")[1] - #@ end - #@overlay/append - - name: CALICO_IPV6POOL_CIDR - #@ if values.ipFamily == "ipv4,ipv6": - value: #@ values.calico.config.clusterCIDR.split(",")[1] - #@ else: - value: #@ values.calico.config.clusterCIDR.split(",")[0] - #@ end - #@ end - #@overlay/append - - name: IP6 - value: autodetect - #@overlay/append - - name: CALICO_IPV6POOL_NAT_OUTGOING - value: "true" - #! default case where ipFamily == ipv4 - #@ elif values.calico.config.clusterCIDR: - #@overlay/append - - name: CALICO_IPV4POOL_CIDR - value: #@ values.calico.config.clusterCIDR - #@ end - #@ if values.infraProvider == "azure": - #@overlay/match by=overlay.subset({"name":"CALICO_IPV4POOL_IPIP"}) - #@overlay/merge - - name: CALICO_IPV4POOL_IPIP - value: Never - #@overlay/match by=overlay.subset({"name":"CALICO_IPV4POOL_VXLAN"}) - #@overlay/merge - - name: CALICO_IPV4POOL_VXLAN - value: Always - #@overlay/match by=overlay.subset({"name":"FELIX_IPINIPMTU"}) - #@overlay/remove - - name: FELIX_IPINIPMTU - livenessProbe: - exec: - command: - #@overlay/remove - #@overlay/match by=startswith - - -bird-live - readinessProbe: - exec: - command: - #@overlay/remove - #@overlay/match by=startswith - - -bird-ready - #@ end - -#! configure_ipam_by_ip_family configures the ipam section of -#! cni_network_config based on the ipFamily. Note: cni_network_config json is -#! not valid json because of the __CNI_MTU__ placeholder. To inject the ipam -#! configuration with the json decoder, the function temporarily replaces the -#! __CNI_MTU__ placeholder with a quoted ! placeholder. -#@ def configure_ipam_by_ip_family(cni_json_str, _): -#@ if values.ipFamily not in ["ipv6", "ipv4,ipv6", "ipv6,ipv4"]: -#@ return cni_json_str -#@ end -#@ quoted_placeholder = '"TEMP_QUOTED_PLACEHOLDER"' -#@ unquoted_cni_mtu_value = "__CNI_MTU__" -#@ json_str = cni_json_str.replace(unquoted_cni_mtu_value, quoted_placeholder) -#@ cni_json = json.decode(json_str) -#@ cni_json["plugins"][0]["ipam"]["assign_ipv6"] = "true" -#@ if values.ipFamily in ["ipv4,ipv6", "ipv6,ipv4"]: -#@ cni_json["plugins"][0]["ipam"]["assign_ipv4"] = "true" -#@ else: -#@ cni_json["plugins"][0]["ipam"]["assign_ipv4"] = "false" -#@ end -#@ updated_json_str = json.encode(cni_json) -#@ return updated_json_str.replace(quoted_placeholder, unquoted_cni_mtu_value) -#@ end - -#@overlay/match by=overlay.subset({"kind":"ConfigMap"}) ---- -data: - #@ if/end values.infraProvider == "azure": - calico_backend: "vxlan" - #@ if/end hasattr(values.calico.config, 'vethMTU'): - veth_mtu: #@ values.calico.config.vethMTU - #@overlay/replace via=configure_ipam_by_ip_family - cni_network_config: diff --git a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/upstream/calico.yaml b/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/upstream/calico.yaml deleted file mode 100644 index 49edf4db45..0000000000 --- a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/upstream/calico.yaml +++ /dev/null @@ -1,3887 +0,0 @@ ---- -# Source: calico/templates/calico-config.yaml -# This ConfigMap is used to configure a self-hosted Calico installation. -kind: ConfigMap -apiVersion: v1 -metadata: - name: calico-config - namespace: kube-system -data: - # Typha is disabled. - typha_service_name: "none" - # Configure the backend to use. - calico_backend: "bird" - - # Configure the MTU to use for workload interfaces and tunnels. - # By default, MTU is auto-detected, and explicitly setting this field should not be required. - # You can override auto-detection by providing a non-zero value. - veth_mtu: "0" - - # The CNI network configuration to install on each node. The special - # values in this config will be automatically populated. - cni_network_config: |- - { - "name": "k8s-pod-network", - "cniVersion": "0.3.1", - "plugins": [ - { - "type": "calico", - "log_level": "info", - "log_file_path": "/var/log/calico/cni/cni.log", - "datastore_type": "kubernetes", - "nodename": "__KUBERNETES_NODE_NAME__", - "mtu": __CNI_MTU__, - "ipam": { - "type": "calico-ipam" - }, - "policy": { - "type": "k8s" - }, - "kubernetes": { - "kubeconfig": "__KUBECONFIG_FILEPATH__" - } - }, - { - "type": "portmap", - "snat": true, - "capabilities": {"portMappings": true} - }, - { - "type": "bandwidth", - "capabilities": {"bandwidth": true} - } - ] - } - ---- -# Source: calico/templates/kdd-crds.yaml - -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: bgpconfigurations.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: BGPConfiguration - listKind: BGPConfigurationList - plural: bgpconfigurations - singular: bgpconfiguration - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: BGPConfiguration contains the configuration for any BGP routing. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: BGPConfigurationSpec contains the values of the BGP configuration. - properties: - asNumber: - description: 'ASNumber is the default AS number used by a node. [Default: - 64512]' - format: int32 - type: integer - communities: - description: Communities is a list of BGP community values and their - arbitrary names for tagging routes. - items: - description: Community contains standard or large community value - and its name. - properties: - name: - description: Name given to community value. - type: string - value: - description: Value must be of format `aa:nn` or `aa:nn:mm`. - For standard community use `aa:nn` format, where `aa` and - `nn` are 16 bit number. For large community use `aa:nn:mm` - format, where `aa`, `nn` and `mm` are 32 bit number. Where, - `aa` is an AS Number, `nn` and `mm` are per-AS identifier. - pattern: ^(\d+):(\d+)$|^(\d+):(\d+):(\d+)$ - type: string - type: object - type: array - listenPort: - description: ListenPort is the port where BGP protocol should listen. - Defaults to 179 - maximum: 65535 - minimum: 1 - type: integer - logSeverityScreen: - description: 'LogSeverityScreen is the log severity above which logs - are sent to the stdout. [Default: INFO]' - type: string - nodeToNodeMeshEnabled: - description: 'NodeToNodeMeshEnabled sets whether full node to node - BGP mesh is enabled. [Default: true]' - type: boolean - prefixAdvertisements: - description: PrefixAdvertisements contains per-prefix advertisement - configuration. - items: - description: PrefixAdvertisement configures advertisement properties - for the specified CIDR. - properties: - cidr: - description: CIDR for which properties should be advertised. - type: string - communities: - description: Communities can be list of either community names - already defined in `Specs.Communities` or community value - of format `aa:nn` or `aa:nn:mm`. For standard community use - `aa:nn` format, where `aa` and `nn` are 16 bit number. For - large community use `aa:nn:mm` format, where `aa`, `nn` and - `mm` are 32 bit number. Where,`aa` is an AS Number, `nn` and - `mm` are per-AS identifier. - items: - type: string - type: array - type: object - type: array - serviceClusterIPs: - description: ServiceClusterIPs are the CIDR blocks from which service - cluster IPs are allocated. If specified, Calico will advertise these - blocks, as well as any cluster IPs within them. - items: - description: ServiceClusterIPBlock represents a single allowed ClusterIP - CIDR block. - properties: - cidr: - type: string - type: object - type: array - serviceExternalIPs: - description: ServiceExternalIPs are the CIDR blocks for Kubernetes - Service External IPs. Kubernetes Service ExternalIPs will only be - advertised if they are within one of these blocks. - items: - description: ServiceExternalIPBlock represents a single allowed - External IP CIDR block. - properties: - cidr: - type: string - type: object - type: array - serviceLoadBalancerIPs: - description: ServiceLoadBalancerIPs are the CIDR blocks for Kubernetes - Service LoadBalancer IPs. Kubernetes Service status.LoadBalancer.Ingress - IPs will only be advertised if they are within one of these blocks. - items: - description: ServiceLoadBalancerIPBlock represents a single allowed - LoadBalancer IP CIDR block. - properties: - cidr: - type: string - type: object - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: bgppeers.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: BGPPeer - listKind: BGPPeerList - plural: bgppeers - singular: bgppeer - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: BGPPeerSpec contains the specification for a BGPPeer resource. - properties: - asNumber: - description: The AS Number of the peer. - format: int32 - type: integer - keepOriginalNextHop: - description: Option to keep the original nexthop field when routes - are sent to a BGP Peer. Setting "true" configures the selected BGP - Peers node to use the "next hop keep;" instead of "next hop self;"(default) - in the specific branch of the Node on "bird.cfg". - type: boolean - node: - description: The node name identifying the Calico node instance that - is targeted by this peer. If this is not set, and no nodeSelector - is specified, then this BGP peer selects all nodes in the cluster. - type: string - nodeSelector: - description: Selector for the nodes that should have this peering. When - this is set, the Node field must be empty. - type: string - password: - description: Optional BGP password for the peerings generated by this - BGPPeer resource. - properties: - secretKeyRef: - description: Selects a key of a secret in the node pod's namespace. - properties: - key: - description: The key of the secret to select from. Must be - a valid secret key. - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - TODO: Add other useful fields. apiVersion, kind, uid?' - type: string - optional: - description: Specify whether the Secret or its key must be - defined - type: boolean - required: - - key - type: object - type: object - peerIP: - description: The IP address of the peer followed by an optional port - number to peer with. If port number is given, format should be `[]:port` - or `:` for IPv4. If optional port number is not set, - and this peer IP and ASNumber belongs to a calico/node with ListenPort - set in BGPConfiguration, then we use that port to peer. - type: string - peerSelector: - description: Selector for the remote nodes to peer with. When this - is set, the PeerIP and ASNumber fields must be empty. For each - peering between the local node and selected remote nodes, we configure - an IPv4 peering if both ends have NodeBGPSpec.IPv4Address specified, - and an IPv6 peering if both ends have NodeBGPSpec.IPv6Address specified. The - remote AS number comes from the remote node's NodeBGPSpec.ASNumber, - or the global default if that is not set. - type: string - sourceAddress: - description: Specifies whether and how to configure a source address - for the peerings generated by this BGPPeer resource. Default value - "UseNodeIP" means to configure the node IP as the source address. "None" - means not to configure a source address. - type: string - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: blockaffinities.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: BlockAffinity - listKind: BlockAffinityList - plural: blockaffinities - singular: blockaffinity - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: BlockAffinitySpec contains the specification for a BlockAffinity - resource. - properties: - cidr: - type: string - deleted: - description: Deleted indicates that this block affinity is being deleted. - This field is a string for compatibility with older releases that - mistakenly treat this field as a string. - type: string - node: - type: string - state: - type: string - required: - - cidr - - deleted - - node - - state - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: clusterinformations.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: ClusterInformation - listKind: ClusterInformationList - plural: clusterinformations - singular: clusterinformation - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: ClusterInformation contains the cluster specific information. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ClusterInformationSpec contains the values of describing - the cluster. - properties: - calicoVersion: - description: CalicoVersion is the version of Calico that the cluster - is running - type: string - clusterGUID: - description: ClusterGUID is the GUID of the cluster - type: string - clusterType: - description: ClusterType describes the type of the cluster - type: string - datastoreReady: - description: DatastoreReady is used during significant datastore migrations - to signal to components such as Felix that it should wait before - accessing the datastore. - type: boolean - variant: - description: Variant declares which variant of Calico should be active. - type: string - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: felixconfigurations.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: FelixConfiguration - listKind: FelixConfigurationList - plural: felixconfigurations - singular: felixconfiguration - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: Felix Configuration contains the configuration for Felix. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: FelixConfigurationSpec contains the values of the Felix configuration. - properties: - allowIPIPPacketsFromWorkloads: - description: 'AllowIPIPPacketsFromWorkloads controls whether Felix - will add a rule to drop IPIP encapsulated traffic from workloads - [Default: false]' - type: boolean - allowVXLANPacketsFromWorkloads: - description: 'AllowVXLANPacketsFromWorkloads controls whether Felix - will add a rule to drop VXLAN encapsulated traffic from workloads - [Default: false]' - type: boolean - awsSrcDstCheck: - description: 'Set source-destination-check on AWS EC2 instances. Accepted - value must be one of "DoNothing", "Enabled" or "Disabled". [Default: - DoNothing]' - enum: - - DoNothing - - Enable - - Disable - type: string - bpfConnectTimeLoadBalancingEnabled: - description: 'BPFConnectTimeLoadBalancingEnabled when in BPF mode, - controls whether Felix installs the connection-time load balancer. The - connect-time load balancer is required for the host to be able to - reach Kubernetes services and it improves the performance of pod-to-service - connections. The only reason to disable it is for debugging purposes. [Default: - true]' - type: boolean - bpfDataIfacePattern: - description: BPFDataIfacePattern is a regular expression that controls - which interfaces Felix should attach BPF programs to in order to - catch traffic to/from the network. This needs to match the interfaces - that Calico workload traffic flows over as well as any interfaces - that handle incoming traffic to nodeports and services from outside - the cluster. It should not match the workload interfaces (usually - named cali...). - type: string - bpfDisableUnprivileged: - description: 'BPFDisableUnprivileged, if enabled, Felix sets the kernel.unprivileged_bpf_disabled - sysctl to disable unprivileged use of BPF. This ensures that unprivileged - users cannot access Calico''s BPF maps and cannot insert their own - BPF programs to interfere with Calico''s. [Default: true]' - type: boolean - bpfEnabled: - description: 'BPFEnabled, if enabled Felix will use the BPF dataplane. - [Default: false]' - type: boolean - bpfExtToServiceConnmark: - description: 'BPFExtToServiceConnmark in BPF mode, control a 32bit - mark that is set on connections from an external client to a local - service. This mark allows us to control how packets of that connection - are routed within the host and how is routing intepreted by RPF - check. [Default: 0]' - type: integer - bpfExternalServiceMode: - description: 'BPFExternalServiceMode in BPF mode, controls how connections - from outside the cluster to services (node ports and cluster IPs) - are forwarded to remote workloads. If set to "Tunnel" then both - request and response traffic is tunneled to the remote node. If - set to "DSR", the request traffic is tunneled but the response traffic - is sent directly from the remote node. In "DSR" mode, the remote - node appears to use the IP of the ingress node; this requires a - permissive L2 network. [Default: Tunnel]' - type: string - bpfKubeProxyEndpointSlicesEnabled: - description: BPFKubeProxyEndpointSlicesEnabled in BPF mode, controls - whether Felix's embedded kube-proxy accepts EndpointSlices or not. - type: boolean - bpfKubeProxyIptablesCleanupEnabled: - description: 'BPFKubeProxyIptablesCleanupEnabled, if enabled in BPF - mode, Felix will proactively clean up the upstream Kubernetes kube-proxy''s - iptables chains. Should only be enabled if kube-proxy is not running. [Default: - true]' - type: boolean - bpfKubeProxyMinSyncPeriod: - description: 'BPFKubeProxyMinSyncPeriod, in BPF mode, controls the - minimum time between updates to the dataplane for Felix''s embedded - kube-proxy. Lower values give reduced set-up latency. Higher values - reduce Felix CPU usage by batching up more work. [Default: 1s]' - type: string - bpfLogLevel: - description: 'BPFLogLevel controls the log level of the BPF programs - when in BPF dataplane mode. One of "Off", "Info", or "Debug". The - logs are emitted to the BPF trace pipe, accessible with the command - `tc exec bpf debug`. [Default: Off].' - type: string - chainInsertMode: - description: 'ChainInsertMode controls whether Felix hooks the kernel''s - top-level iptables chains by inserting a rule at the top of the - chain or by appending a rule at the bottom. insert is the safe default - since it prevents Calico''s rules from being bypassed. If you switch - to append mode, be sure that the other rules in the chains signal - acceptance by falling through to the Calico rules, otherwise the - Calico policy will be bypassed. [Default: insert]' - type: string - dataplaneDriver: - type: string - debugDisableLogDropping: - type: boolean - debugMemoryProfilePath: - type: string - debugSimulateCalcGraphHangAfter: - type: string - debugSimulateDataplaneHangAfter: - type: string - defaultEndpointToHostAction: - description: 'DefaultEndpointToHostAction controls what happens to - traffic that goes from a workload endpoint to the host itself (after - the traffic hits the endpoint egress policy). By default Calico - blocks traffic from workload endpoints to the host itself with an - iptables "DROP" action. If you want to allow some or all traffic - from endpoint to host, set this parameter to RETURN or ACCEPT. Use - RETURN if you have your own rules in the iptables "INPUT" chain; - Calico will insert its rules at the top of that chain, then "RETURN" - packets to the "INPUT" chain once it has completed processing workload - endpoint egress policy. Use ACCEPT to unconditionally accept packets - from workloads after processing workload endpoint egress policy. - [Default: Drop]' - type: string - deviceRouteProtocol: - description: This defines the route protocol added to programmed device - routes, by default this will be RTPROT_BOOT when left blank. - type: integer - deviceRouteSourceAddress: - description: This is the source address to use on programmed device - routes. By default the source address is left blank, leaving the - kernel to choose the source address used. - type: string - disableConntrackInvalidCheck: - type: boolean - endpointReportingDelay: - type: string - endpointReportingEnabled: - type: boolean - externalNodesList: - description: ExternalNodesCIDRList is a list of CIDR's of external-non-calico-nodes - which may source tunnel traffic and have the tunneled traffic be - accepted at calico nodes. - items: - type: string - type: array - failsafeInboundHostPorts: - description: 'FailsafeInboundHostPorts is a list of UDP/TCP ports - and CIDRs that Felix will allow incoming traffic to host endpoints - on irrespective of the security policy. This is useful to avoid - accidentally cutting off a host with incorrect configuration. For - back-compatibility, if the protocol is not specified, it defaults - to "tcp". If a CIDR is not specified, it will allow traffic from - all addresses. To disable all inbound host ports, use the value - none. The default value allows ssh access and DHCP. [Default: tcp:22, - udp:68, tcp:179, tcp:2379, tcp:2380, tcp:6443, tcp:6666, tcp:6667]' - items: - description: ProtoPort is combination of protocol, port, and CIDR. - Protocol and port must be specified. - properties: - net: - type: string - port: - type: integer - protocol: - type: string - required: - - port - - protocol - type: object - type: array - failsafeOutboundHostPorts: - description: 'FailsafeOutboundHostPorts is a list of UDP/TCP ports - and CIDRs that Felix will allow outgoing traffic from host endpoints - to irrespective of the security policy. This is useful to avoid - accidentally cutting off a host with incorrect configuration. For - back-compatibility, if the protocol is not specified, it defaults - to "tcp". If a CIDR is not specified, it will allow traffic from - all addresses. To disable all outbound host ports, use the value - none. The default value opens etcd''s standard ports to ensure that - Felix does not get cut off from etcd as well as allowing DHCP and - DNS. [Default: tcp:179, tcp:2379, tcp:2380, tcp:6443, tcp:6666, - tcp:6667, udp:53, udp:67]' - items: - description: ProtoPort is combination of protocol, port, and CIDR. - Protocol and port must be specified. - properties: - net: - type: string - port: - type: integer - protocol: - type: string - required: - - port - - protocol - type: object - type: array - featureDetectOverride: - description: FeatureDetectOverride is used to override the feature - detection. Values are specified in a comma separated list with no - spaces, example; "SNATFullyRandom=true,MASQFullyRandom=false,RestoreSupportsLock=". - "true" or "false" will force the feature, empty or omitted values - are auto-detected. - type: string - genericXDPEnabled: - description: 'GenericXDPEnabled enables Generic XDP so network cards - that don''t support XDP offload or driver modes can use XDP. This - is not recommended since it doesn''t provide better performance - than iptables. [Default: false]' - type: boolean - healthEnabled: - type: boolean - healthHost: - type: string - healthPort: - type: integer - interfaceExclude: - description: 'InterfaceExclude is a comma-separated list of interfaces - that Felix should exclude when monitoring for host endpoints. The - default value ensures that Felix ignores Kubernetes'' IPVS dummy - interface, which is used internally by kube-proxy. If you want to - exclude multiple interface names using a single value, the list - supports regular expressions. For regular expressions you must wrap - the value with ''/''. For example having values ''/^kube/,veth1'' - will exclude all interfaces that begin with ''kube'' and also the - interface ''veth1''. [Default: kube-ipvs0]' - type: string - interfacePrefix: - description: 'InterfacePrefix is the interface name prefix that identifies - workload endpoints and so distinguishes them from host endpoint - interfaces. Note: in environments other than bare metal, the orchestrators - configure this appropriately. For example our Kubernetes and Docker - integrations set the ''cali'' value, and our OpenStack integration - sets the ''tap'' value. [Default: cali]' - type: string - interfaceRefreshInterval: - description: InterfaceRefreshInterval is the period at which Felix - rescans local interfaces to verify their state. The rescan can be - disabled by setting the interval to 0. - type: string - ipipEnabled: - type: boolean - ipipMTU: - description: 'IPIPMTU is the MTU to set on the tunnel device. See - Configuring MTU [Default: 1440]' - type: integer - ipsetsRefreshInterval: - description: 'IpsetsRefreshInterval is the period at which Felix re-checks - all iptables state to ensure that no other process has accidentally - broken Calico''s rules. Set to 0 to disable iptables refresh. [Default: - 90s]' - type: string - iptablesBackend: - description: IptablesBackend specifies which backend of iptables will - be used. The default is legacy. - type: string - iptablesFilterAllowAction: - type: string - iptablesLockFilePath: - description: 'IptablesLockFilePath is the location of the iptables - lock file. You may need to change this if the lock file is not in - its standard location (for example if you have mapped it into Felix''s - container at a different path). [Default: /run/xtables.lock]' - type: string - iptablesLockProbeInterval: - description: 'IptablesLockProbeInterval is the time that Felix will - wait between attempts to acquire the iptables lock if it is not - available. Lower values make Felix more responsive when the lock - is contended, but use more CPU. [Default: 50ms]' - type: string - iptablesLockTimeout: - description: 'IptablesLockTimeout is the time that Felix will wait - for the iptables lock, or 0, to disable. To use this feature, Felix - must share the iptables lock file with all other processes that - also take the lock. When running Felix inside a container, this - requires the /run directory of the host to be mounted into the calico/node - or calico/felix container. [Default: 0s disabled]' - type: string - iptablesMangleAllowAction: - type: string - iptablesMarkMask: - description: 'IptablesMarkMask is the mask that Felix selects its - IPTables Mark bits from. Should be a 32 bit hexadecimal number with - at least 8 bits set, none of which clash with any other mark bits - in use on the system. [Default: 0xff000000]' - format: int32 - type: integer - iptablesNATOutgoingInterfaceFilter: - type: string - iptablesPostWriteCheckInterval: - description: 'IptablesPostWriteCheckInterval is the period after Felix - has done a write to the dataplane that it schedules an extra read - back in order to check the write was not clobbered by another process. - This should only occur if another application on the system doesn''t - respect the iptables lock. [Default: 1s]' - type: string - iptablesRefreshInterval: - description: 'IptablesRefreshInterval is the period at which Felix - re-checks the IP sets in the dataplane to ensure that no other process - has accidentally broken Calico''s rules. Set to 0 to disable IP - sets refresh. Note: the default for this value is lower than the - other refresh intervals as a workaround for a Linux kernel bug that - was fixed in kernel version 4.11. If you are using v4.11 or greater - you may want to set this to, a higher value to reduce Felix CPU - usage. [Default: 10s]' - type: string - ipv6Support: - type: boolean - kubeNodePortRanges: - description: 'KubeNodePortRanges holds list of port ranges used for - service node ports. Only used if felix detects kube-proxy running - in ipvs mode. Felix uses these ranges to separate host and workload - traffic. [Default: 30000:32767].' - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - logFilePath: - description: 'LogFilePath is the full path to the Felix log. Set to - none to disable file logging. [Default: /var/log/calico/felix.log]' - type: string - logPrefix: - description: 'LogPrefix is the log prefix that Felix uses when rendering - LOG rules. [Default: calico-packet]' - type: string - logSeverityFile: - description: 'LogSeverityFile is the log severity above which logs - are sent to the log file. [Default: Info]' - type: string - logSeverityScreen: - description: 'LogSeverityScreen is the log severity above which logs - are sent to the stdout. [Default: Info]' - type: string - logSeveritySys: - description: 'LogSeveritySys is the log severity above which logs - are sent to the syslog. Set to None for no logging to syslog. [Default: - Info]' - type: string - maxIpsetSize: - type: integer - metadataAddr: - description: 'MetadataAddr is the IP address or domain name of the - server that can answer VM queries for cloud-init metadata. In OpenStack, - this corresponds to the machine running nova-api (or in Ubuntu, - nova-api-metadata). A value of none (case insensitive) means that - Felix should not set up any NAT rule for the metadata path. [Default: - 127.0.0.1]' - type: string - metadataPort: - description: 'MetadataPort is the port of the metadata server. This, - combined with global.MetadataAddr (if not ''None''), is used to - set up a NAT rule, from 169.254.169.254:80 to MetadataAddr:MetadataPort. - In most cases this should not need to be changed [Default: 8775].' - type: integer - mtuIfacePattern: - description: MTUIfacePattern is a regular expression that controls - which interfaces Felix should scan in order to calculate the host's - MTU. This should not match workload interfaces (usually named cali...). - type: string - natOutgoingAddress: - description: NATOutgoingAddress specifies an address to use when performing - source NAT for traffic in a natOutgoing pool that is leaving the - network. By default the address used is an address on the interface - the traffic is leaving on (ie it uses the iptables MASQUERADE target) - type: string - natPortRange: - anyOf: - - type: integer - - type: string - description: NATPortRange specifies the range of ports that is used - for port mapping when doing outgoing NAT. When unset the default - behavior of the network stack is used. - pattern: ^.* - x-kubernetes-int-or-string: true - netlinkTimeout: - type: string - openstackRegion: - description: 'OpenstackRegion is the name of the region that a particular - Felix belongs to. In a multi-region Calico/OpenStack deployment, - this must be configured somehow for each Felix (here in the datamodel, - or in felix.cfg or the environment on each compute node), and must - match the [calico] openstack_region value configured in neutron.conf - on each node. [Default: Empty]' - type: string - policySyncPathPrefix: - description: 'PolicySyncPathPrefix is used to by Felix to communicate - policy changes to external services, like Application layer policy. - [Default: Empty]' - type: string - prometheusGoMetricsEnabled: - description: 'PrometheusGoMetricsEnabled disables Go runtime metrics - collection, which the Prometheus client does by default, when set - to false. This reduces the number of metrics reported, reducing - Prometheus load. [Default: true]' - type: boolean - prometheusMetricsEnabled: - description: 'PrometheusMetricsEnabled enables the Prometheus metrics - server in Felix if set to true. [Default: false]' - type: boolean - prometheusMetricsHost: - description: 'PrometheusMetricsHost is the host that the Prometheus - metrics server should bind to. [Default: empty]' - type: string - prometheusMetricsPort: - description: 'PrometheusMetricsPort is the TCP port that the Prometheus - metrics server should bind to. [Default: 9091]' - type: integer - prometheusProcessMetricsEnabled: - description: 'PrometheusProcessMetricsEnabled disables process metrics - collection, which the Prometheus client does by default, when set - to false. This reduces the number of metrics reported, reducing - Prometheus load. [Default: true]' - type: boolean - removeExternalRoutes: - description: Whether or not to remove device routes that have not - been programmed by Felix. Disabling this will allow external applications - to also add device routes. This is enabled by default which means - we will remove externally added routes. - type: boolean - reportingInterval: - description: 'ReportingInterval is the interval at which Felix reports - its status into the datastore or 0 to disable. Must be non-zero - in OpenStack deployments. [Default: 30s]' - type: string - reportingTTL: - description: 'ReportingTTL is the time-to-live setting for process-wide - status reports. [Default: 90s]' - type: string - routeRefreshInterval: - description: 'RouteRefreshInterval is the period at which Felix re-checks - the routes in the dataplane to ensure that no other process has - accidentally broken Calico''s rules. Set to 0 to disable route refresh. - [Default: 90s]' - type: string - routeSource: - description: 'RouteSource configures where Felix gets its routing - information. - WorkloadIPs: use workload endpoints to construct - routes. - CalicoIPAM: the default - use IPAM data to construct routes.' - type: string - routeTableRange: - description: Calico programs additional Linux route tables for various - purposes. RouteTableRange specifies the indices of the route tables - that Calico should use. - properties: - max: - type: integer - min: - type: integer - required: - - max - - min - type: object - serviceLoopPrevention: - description: 'When service IP advertisement is enabled, prevent routing - loops to service IPs that are not in use, by dropping or rejecting - packets that do not get DNAT''d by kube-proxy. Unless set to "Disabled", - in which case such routing loops continue to be allowed. [Default: - Drop]' - type: string - sidecarAccelerationEnabled: - description: 'SidecarAccelerationEnabled enables experimental sidecar - acceleration [Default: false]' - type: boolean - usageReportingEnabled: - description: 'UsageReportingEnabled reports anonymous Calico version - number and cluster size to projectcalico.org. Logs warnings returned - by the usage server. For example, if a significant security vulnerability - has been discovered in the version of Calico being used. [Default: - true]' - type: boolean - usageReportingInitialDelay: - description: 'UsageReportingInitialDelay controls the minimum delay - before Felix makes a report. [Default: 300s]' - type: string - usageReportingInterval: - description: 'UsageReportingInterval controls the interval at which - Felix makes reports. [Default: 86400s]' - type: string - useInternalDataplaneDriver: - type: boolean - vxlanEnabled: - type: boolean - vxlanMTU: - description: 'VXLANMTU is the MTU to set on the tunnel device. See - Configuring MTU [Default: 1440]' - type: integer - vxlanPort: - type: integer - vxlanVNI: - type: integer - wireguardEnabled: - description: 'WireguardEnabled controls whether Wireguard is enabled. - [Default: false]' - type: boolean - wireguardInterfaceName: - description: 'WireguardInterfaceName specifies the name to use for - the Wireguard interface. [Default: wg.calico]' - type: string - wireguardListeningPort: - description: 'WireguardListeningPort controls the listening port used - by Wireguard. [Default: 51820]' - type: integer - wireguardMTU: - description: 'WireguardMTU controls the MTU on the Wireguard interface. - See Configuring MTU [Default: 1420]' - type: integer - wireguardRoutingRulePriority: - description: 'WireguardRoutingRulePriority controls the priority value - to use for the Wireguard routing rule. [Default: 99]' - type: integer - xdpEnabled: - description: 'XDPEnabled enables XDP acceleration for suitable untracked - incoming deny rules. [Default: true]' - type: boolean - xdpRefreshInterval: - description: 'XDPRefreshInterval is the period at which Felix re-checks - all XDP state to ensure that no other process has accidentally broken - Calico''s BPF maps or attached programs. Set to 0 to disable XDP - refresh. [Default: 90s]' - type: string - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: globalnetworkpolicies.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: GlobalNetworkPolicy - listKind: GlobalNetworkPolicyList - plural: globalnetworkpolicies - singular: globalnetworkpolicy - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - applyOnForward: - description: ApplyOnForward indicates to apply the rules in this policy - on forward traffic. - type: boolean - doNotTrack: - description: DoNotTrack indicates whether packets matched by the rules - in this policy should go through the data plane's connection tracking, - such as Linux conntrack. If True, the rules in this policy are - applied before any data plane connection tracking, and packets allowed - by this policy are marked as not to be tracked. - type: boolean - egress: - description: The ordered set of egress rules. Each rule contains - a set of packet match criteria and a corresponding action to apply. - items: - description: "A Rule encapsulates a set of match criteria and an - action. Both selector-based security Policy and security Profiles - reference rules - separated out as a list of rules for both ingress - and egress packet matching. \n Each positive match criteria has - a negated version, prefixed with \"Not\". All the match criteria - within a rule must be satisfied for a packet to match. A single - rule can contain the positive and negative version of a match - and both must be satisfied for the rule to match." - properties: - action: - type: string - destination: - description: Destination contains the match criteria that apply - to destination entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and Selector are defined on the same rule, then only workload - endpoints that are matched by both selectors will be selected - by the rule. \n For NetworkPolicy, an empty NamespaceSelector - implies that the Selector is limited to selecting only - workload endpoints in the same namespace as the NetworkPolicy. - \n For NetworkPolicy, `global()` NamespaceSelector implies - that the Selector is limited to selecting only GlobalNetworkSet - or HostEndpoint. \n For GlobalNetworkPolicy, an empty - NamespaceSelector implies the Selector applies to workload - endpoints across all namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - type: object - http: - description: HTTP contains match criteria that apply to HTTP - requests. - properties: - methods: - description: Methods is an optional field that restricts - the rule to apply only to HTTP requests that use one of - the listed HTTP Methods (e.g. GET, PUT, etc.) Multiple - methods are OR'd together. - items: - type: string - type: array - paths: - description: 'Paths is an optional field that restricts - the rule to apply to HTTP requests that use one of the - listed HTTP Paths. Multiple paths are OR''d together. - e.g: - exact: /foo - prefix: /bar NOTE: Each entry may - ONLY specify either a `exact` or a `prefix` match. The - validator will check for it.' - items: - description: 'HTTPPath specifies an HTTP path to match. - It may be either of the form: exact: : which matches - the path exactly or prefix: : which matches - the path prefix' - properties: - exact: - type: string - prefix: - type: string - type: object - type: array - type: object - icmp: - description: ICMP is an optional field that restricts the rule - to apply to a specific type and code of ICMP traffic. This - should only be specified if the Protocol field is set to "ICMP" - or "ICMPv6". - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - ipVersion: - description: IPVersion is an optional field that restricts the - rule to only match a specific IP version. - type: integer - metadata: - description: Metadata contains additional information for this - rule - properties: - annotations: - additionalProperties: - type: string - description: Annotations is a set of key value pairs that - give extra information about the rule - type: object - type: object - notICMP: - description: NotICMP is the negated version of the ICMP field. - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - notProtocol: - anyOf: - - type: integer - - type: string - description: NotProtocol is the negated version of the Protocol - field. - pattern: ^.* - x-kubernetes-int-or-string: true - protocol: - anyOf: - - type: integer - - type: string - description: "Protocol is an optional field that restricts the - rule to only apply to traffic of a specific IP protocol. Required - if any of the EntityRules contain Ports (because ports only - apply to certain protocols). \n Must be one of these string - values: \"TCP\", \"UDP\", \"ICMP\", \"ICMPv6\", \"SCTP\", - \"UDPLite\" or an integer in the range 1-255." - pattern: ^.* - x-kubernetes-int-or-string: true - source: - description: Source contains the match criteria that apply to - source entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and Selector are defined on the same rule, then only workload - endpoints that are matched by both selectors will be selected - by the rule. \n For NetworkPolicy, an empty NamespaceSelector - implies that the Selector is limited to selecting only - workload endpoints in the same namespace as the NetworkPolicy. - \n For NetworkPolicy, `global()` NamespaceSelector implies - that the Selector is limited to selecting only GlobalNetworkSet - or HostEndpoint. \n For GlobalNetworkPolicy, an empty - NamespaceSelector implies the Selector applies to workload - endpoints across all namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - type: object - required: - - action - type: object - type: array - ingress: - description: The ordered set of ingress rules. Each rule contains - a set of packet match criteria and a corresponding action to apply. - items: - description: "A Rule encapsulates a set of match criteria and an - action. Both selector-based security Policy and security Profiles - reference rules - separated out as a list of rules for both ingress - and egress packet matching. \n Each positive match criteria has - a negated version, prefixed with \"Not\". All the match criteria - within a rule must be satisfied for a packet to match. A single - rule can contain the positive and negative version of a match - and both must be satisfied for the rule to match." - properties: - action: - type: string - destination: - description: Destination contains the match criteria that apply - to destination entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and Selector are defined on the same rule, then only workload - endpoints that are matched by both selectors will be selected - by the rule. \n For NetworkPolicy, an empty NamespaceSelector - implies that the Selector is limited to selecting only - workload endpoints in the same namespace as the NetworkPolicy. - \n For NetworkPolicy, `global()` NamespaceSelector implies - that the Selector is limited to selecting only GlobalNetworkSet - or HostEndpoint. \n For GlobalNetworkPolicy, an empty - NamespaceSelector implies the Selector applies to workload - endpoints across all namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - type: object - http: - description: HTTP contains match criteria that apply to HTTP - requests. - properties: - methods: - description: Methods is an optional field that restricts - the rule to apply only to HTTP requests that use one of - the listed HTTP Methods (e.g. GET, PUT, etc.) Multiple - methods are OR'd together. - items: - type: string - type: array - paths: - description: 'Paths is an optional field that restricts - the rule to apply to HTTP requests that use one of the - listed HTTP Paths. Multiple paths are OR''d together. - e.g: - exact: /foo - prefix: /bar NOTE: Each entry may - ONLY specify either a `exact` or a `prefix` match. The - validator will check for it.' - items: - description: 'HTTPPath specifies an HTTP path to match. - It may be either of the form: exact: : which matches - the path exactly or prefix: : which matches - the path prefix' - properties: - exact: - type: string - prefix: - type: string - type: object - type: array - type: object - icmp: - description: ICMP is an optional field that restricts the rule - to apply to a specific type and code of ICMP traffic. This - should only be specified if the Protocol field is set to "ICMP" - or "ICMPv6". - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - ipVersion: - description: IPVersion is an optional field that restricts the - rule to only match a specific IP version. - type: integer - metadata: - description: Metadata contains additional information for this - rule - properties: - annotations: - additionalProperties: - type: string - description: Annotations is a set of key value pairs that - give extra information about the rule - type: object - type: object - notICMP: - description: NotICMP is the negated version of the ICMP field. - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - notProtocol: - anyOf: - - type: integer - - type: string - description: NotProtocol is the negated version of the Protocol - field. - pattern: ^.* - x-kubernetes-int-or-string: true - protocol: - anyOf: - - type: integer - - type: string - description: "Protocol is an optional field that restricts the - rule to only apply to traffic of a specific IP protocol. Required - if any of the EntityRules contain Ports (because ports only - apply to certain protocols). \n Must be one of these string - values: \"TCP\", \"UDP\", \"ICMP\", \"ICMPv6\", \"SCTP\", - \"UDPLite\" or an integer in the range 1-255." - pattern: ^.* - x-kubernetes-int-or-string: true - source: - description: Source contains the match criteria that apply to - source entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and Selector are defined on the same rule, then only workload - endpoints that are matched by both selectors will be selected - by the rule. \n For NetworkPolicy, an empty NamespaceSelector - implies that the Selector is limited to selecting only - workload endpoints in the same namespace as the NetworkPolicy. - \n For NetworkPolicy, `global()` NamespaceSelector implies - that the Selector is limited to selecting only GlobalNetworkSet - or HostEndpoint. \n For GlobalNetworkPolicy, an empty - NamespaceSelector implies the Selector applies to workload - endpoints across all namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - type: object - required: - - action - type: object - type: array - namespaceSelector: - description: NamespaceSelector is an optional field for an expression - used to select a pod based on namespaces. - type: string - order: - description: Order is an optional field that specifies the order in - which the policy is applied. Policies with higher "order" are applied - after those with lower order. If the order is omitted, it may be - considered to be "infinite" - i.e. the policy will be applied last. Policies - with identical order will be applied in alphanumerical order based - on the Policy "Name". - type: number - preDNAT: - description: PreDNAT indicates to apply the rules in this policy before - any DNAT. - type: boolean - selector: - description: "The selector is an expression used to pick pick out - the endpoints that the policy should be applied to. \n Selector - expressions follow this syntax: \n \tlabel == \"string_literal\" - \ -> comparison, e.g. my_label == \"foo bar\" \tlabel != \"string_literal\" - \ -> not equal; also matches if label is not present \tlabel in - { \"a\", \"b\", \"c\", ... } -> true if the value of label X is - one of \"a\", \"b\", \"c\" \tlabel not in { \"a\", \"b\", \"c\", - ... } -> true if the value of label X is not one of \"a\", \"b\", - \"c\" \thas(label_name) -> True if that label is present \t! expr - -> negation of expr \texpr && expr -> Short-circuit and \texpr - || expr -> Short-circuit or \t( expr ) -> parens for grouping \tall() - or the empty selector -> matches all endpoints. \n Label names are - allowed to contain alphanumerics, -, _ and /. String literals are - more permissive but they do not support escape characters. \n Examples - (with made-up labels): \n \ttype == \"webserver\" && deployment - == \"prod\" \ttype in {\"frontend\", \"backend\"} \tdeployment != - \"dev\" \t! has(label_name)" - type: string - serviceAccountSelector: - description: ServiceAccountSelector is an optional field for an expression - used to select a pod based on service accounts. - type: string - types: - description: "Types indicates whether this policy applies to ingress, - or to egress, or to both. When not explicitly specified (and so - the value on creation is empty or nil), Calico defaults Types according - to what Ingress and Egress rules are present in the policy. The - default is: \n - [ PolicyTypeIngress ], if there are no Egress rules - (including the case where there are also no Ingress rules) \n - - [ PolicyTypeEgress ], if there are Egress rules but no Ingress - rules \n - [ PolicyTypeIngress, PolicyTypeEgress ], if there are - both Ingress and Egress rules. \n When the policy is read back again, - Types will always be one of these values, never empty or nil." - items: - description: PolicyType enumerates the possible values of the PolicySpec - Types field. - type: string - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: globalnetworksets.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: GlobalNetworkSet - listKind: GlobalNetworkSetList - plural: globalnetworksets - singular: globalnetworkset - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - description: GlobalNetworkSet contains a set of arbitrary IP sub-networks/CIDRs - that share labels to allow rules to refer to them via selectors. The labels - of GlobalNetworkSet are not namespaced. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: GlobalNetworkSetSpec contains the specification for a NetworkSet - resource. - properties: - nets: - description: The list of IP networks that belong to this set. - items: - type: string - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: hostendpoints.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: HostEndpoint - listKind: HostEndpointList - plural: hostendpoints - singular: hostendpoint - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: HostEndpointSpec contains the specification for a HostEndpoint - resource. - properties: - expectedIPs: - description: "The expected IP addresses (IPv4 and IPv6) of the endpoint. - If \"InterfaceName\" is not present, Calico will look for an interface - matching any of the IPs in the list and apply policy to that. Note: - \tWhen using the selector match criteria in an ingress or egress - security Policy \tor Profile, Calico converts the selector into - a set of IP addresses. For host \tendpoints, the ExpectedIPs field - is used for that purpose. (If only the interface \tname is specified, - Calico does not learn the IPs of the interface for use in match - \tcriteria.)" - items: - type: string - type: array - interfaceName: - description: "Either \"*\", or the name of a specific Linux interface - to apply policy to; or empty. \"*\" indicates that this HostEndpoint - governs all traffic to, from or through the default network namespace - of the host named by the \"Node\" field; entering and leaving that - namespace via any interface, including those from/to non-host-networked - local workloads. \n If InterfaceName is not \"*\", this HostEndpoint - only governs traffic that enters or leaves the host through the - specific interface named by InterfaceName, or - when InterfaceName - is empty - through the specific interface that has one of the IPs - in ExpectedIPs. Therefore, when InterfaceName is empty, at least - one expected IP must be specified. Only external interfaces (such - as \"eth0\") are supported here; it isn't possible for a HostEndpoint - to protect traffic through a specific local workload interface. - \n Note: Only some kinds of policy are implemented for \"*\" HostEndpoints; - initially just pre-DNAT policy. Please check Calico documentation - for the latest position." - type: string - node: - description: The node name identifying the Calico node instance. - type: string - ports: - description: Ports contains the endpoint's named ports, which may - be referenced in security policy rules. - items: - properties: - name: - type: string - port: - type: integer - protocol: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - required: - - name - - port - - protocol - type: object - type: array - profiles: - description: A list of identifiers of security Profile objects that - apply to this endpoint. Each profile is applied in the order that - they appear in this list. Profile rules are applied after the selector-based - security policy. - items: - type: string - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: ipamblocks.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: IPAMBlock - listKind: IPAMBlockList - plural: ipamblocks - singular: ipamblock - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: IPAMBlockSpec contains the specification for an IPAMBlock - resource. - properties: - affinity: - type: string - allocations: - items: - type: integer - # TODO: This nullable is manually added in. We should update controller-gen - # to handle []*int properly itself. - nullable: true - type: array - attributes: - items: - properties: - handle_id: - type: string - secondary: - additionalProperties: - type: string - type: object - type: object - type: array - cidr: - type: string - deleted: - type: boolean - strictAffinity: - type: boolean - unallocated: - items: - type: integer - type: array - required: - - allocations - - attributes - - cidr - - strictAffinity - - unallocated - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: ipamconfigs.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: IPAMConfig - listKind: IPAMConfigList - plural: ipamconfigs - singular: ipamconfig - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: IPAMConfigSpec contains the specification for an IPAMConfig - resource. - properties: - autoAllocateBlocks: - type: boolean - maxBlocksPerHost: - description: MaxBlocksPerHost, if non-zero, is the max number of blocks - that can be affine to each host. - type: integer - strictAffinity: - type: boolean - required: - - autoAllocateBlocks - - strictAffinity - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: ipamhandles.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: IPAMHandle - listKind: IPAMHandleList - plural: ipamhandles - singular: ipamhandle - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: IPAMHandleSpec contains the specification for an IPAMHandle - resource. - properties: - block: - additionalProperties: - type: integer - type: object - deleted: - type: boolean - handleID: - type: string - required: - - block - - handleID - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: ippools.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: IPPool - listKind: IPPoolList - plural: ippools - singular: ippool - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: IPPoolSpec contains the specification for an IPPool resource. - properties: - blockSize: - description: The block size to use for IP address assignments from - this pool. Defaults to 26 for IPv4 and 112 for IPv6. - type: integer - cidr: - description: The pool CIDR. - type: string - disabled: - description: When disabled is true, Calico IPAM will not assign addresses - from this pool. - type: boolean - ipip: - description: 'Deprecated: this field is only used for APIv1 backwards - compatibility. Setting this field is not allowed, this field is - for internal use only.' - properties: - enabled: - description: When enabled is true, ipip tunneling will be used - to deliver packets to destinations within this pool. - type: boolean - mode: - description: The IPIP mode. This can be one of "always" or "cross-subnet". A - mode of "always" will also use IPIP tunneling for routing to - destination IP addresses within this pool. A mode of "cross-subnet" - will only use IPIP tunneling when the destination node is on - a different subnet to the originating node. The default value - (if not specified) is "always". - type: string - type: object - ipipMode: - description: Contains configuration for IPIP tunneling for this pool. - If not specified, then this is defaulted to "Never" (i.e. IPIP tunneling - is disabled). - type: string - nat-outgoing: - description: 'Deprecated: this field is only used for APIv1 backwards - compatibility. Setting this field is not allowed, this field is - for internal use only.' - type: boolean - natOutgoing: - description: When nat-outgoing is true, packets sent from Calico networked - containers in this pool to destinations outside of this pool will - be masqueraded. - type: boolean - nodeSelector: - description: Allows IPPool to allocate for a specific node by label - selector. - type: string - vxlanMode: - description: Contains configuration for VXLAN tunneling for this pool. - If not specified, then this is defaulted to "Never" (i.e. VXLAN - tunneling is disabled). - type: string - required: - - cidr - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: kubecontrollersconfigurations.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: KubeControllersConfiguration - listKind: KubeControllersConfigurationList - plural: kubecontrollersconfigurations - singular: kubecontrollersconfiguration - scope: Cluster - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KubeControllersConfigurationSpec contains the values of the - Kubernetes controllers configuration. - properties: - controllers: - description: Controllers enables and configures individual Kubernetes - controllers - properties: - namespace: - description: Namespace enables and configures the namespace controller. - Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform reconciliation - with the Calico datastore. [Default: 5m]' - type: string - type: object - node: - description: Node enables and configures the node controller. - Enabled by default, set to nil to disable. - properties: - hostEndpoint: - description: HostEndpoint controls syncing nodes to host endpoints. - Disabled by default, set to nil to disable. - properties: - autoCreate: - description: 'AutoCreate enables automatic creation of - host endpoints for every node. [Default: Disabled]' - type: string - type: object - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform reconciliation - with the Calico datastore. [Default: 5m]' - type: string - syncLabels: - description: 'SyncLabels controls whether to copy Kubernetes - node labels to Calico nodes. [Default: Enabled]' - type: string - type: object - policy: - description: Policy enables and configures the policy controller. - Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform reconciliation - with the Calico datastore. [Default: 5m]' - type: string - type: object - serviceAccount: - description: ServiceAccount enables and configures the service - account controller. Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform reconciliation - with the Calico datastore. [Default: 5m]' - type: string - type: object - workloadEndpoint: - description: WorkloadEndpoint enables and configures the workload - endpoint controller. Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform reconciliation - with the Calico datastore. [Default: 5m]' - type: string - type: object - type: object - etcdV3CompactionPeriod: - description: 'EtcdV3CompactionPeriod is the period between etcdv3 - compaction requests. Set to 0 to disable. [Default: 10m]' - type: string - healthChecks: - description: 'HealthChecks enables or disables support for health - checks [Default: Enabled]' - type: string - logSeverityScreen: - description: 'LogSeverityScreen is the log severity above which logs - are sent to the stdout. [Default: Info]' - type: string - prometheusMetricsPort: - description: 'PrometheusMetricsPort is the TCP port that the Prometheus - metrics server should bind to. Set to 0 to disable. [Default: 9094]' - type: integer - required: - - controllers - type: object - status: - description: KubeControllersConfigurationStatus represents the status - of the configuration. It's useful for admins to be able to see the actual - config that was applied, which can be modified by environment variables - on the kube-controllers process. - properties: - environmentVars: - additionalProperties: - type: string - description: EnvironmentVars contains the environment variables on - the kube-controllers that influenced the RunningConfig. - type: object - runningConfig: - description: RunningConfig contains the effective config that is running - in the kube-controllers pod, after merging the API resource with - any environment variables. - properties: - controllers: - description: Controllers enables and configures individual Kubernetes - controllers - properties: - namespace: - description: Namespace enables and configures the namespace - controller. Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform - reconciliation with the Calico datastore. [Default: - 5m]' - type: string - type: object - node: - description: Node enables and configures the node controller. - Enabled by default, set to nil to disable. - properties: - hostEndpoint: - description: HostEndpoint controls syncing nodes to host - endpoints. Disabled by default, set to nil to disable. - properties: - autoCreate: - description: 'AutoCreate enables automatic creation - of host endpoints for every node. [Default: Disabled]' - type: string - type: object - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform - reconciliation with the Calico datastore. [Default: - 5m]' - type: string - syncLabels: - description: 'SyncLabels controls whether to copy Kubernetes - node labels to Calico nodes. [Default: Enabled]' - type: string - type: object - policy: - description: Policy enables and configures the policy controller. - Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform - reconciliation with the Calico datastore. [Default: - 5m]' - type: string - type: object - serviceAccount: - description: ServiceAccount enables and configures the service - account controller. Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform - reconciliation with the Calico datastore. [Default: - 5m]' - type: string - type: object - workloadEndpoint: - description: WorkloadEndpoint enables and configures the workload - endpoint controller. Enabled by default, set to nil to disable. - properties: - reconcilerPeriod: - description: 'ReconcilerPeriod is the period to perform - reconciliation with the Calico datastore. [Default: - 5m]' - type: string - type: object - type: object - etcdV3CompactionPeriod: - description: 'EtcdV3CompactionPeriod is the period between etcdv3 - compaction requests. Set to 0 to disable. [Default: 10m]' - type: string - healthChecks: - description: 'HealthChecks enables or disables support for health - checks [Default: Enabled]' - type: string - logSeverityScreen: - description: 'LogSeverityScreen is the log severity above which - logs are sent to the stdout. [Default: Info]' - type: string - prometheusMetricsPort: - description: 'PrometheusMetricsPort is the TCP port that the Prometheus - metrics server should bind to. Set to 0 to disable. [Default: - 9094]' - type: integer - required: - - controllers - type: object - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: networkpolicies.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: NetworkPolicy - listKind: NetworkPolicyList - plural: networkpolicies - singular: networkpolicy - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - egress: - description: The ordered set of egress rules. Each rule contains - a set of packet match criteria and a corresponding action to apply. - items: - description: "A Rule encapsulates a set of match criteria and an - action. Both selector-based security Policy and security Profiles - reference rules - separated out as a list of rules for both ingress - and egress packet matching. \n Each positive match criteria has - a negated version, prefixed with \"Not\". All the match criteria - within a rule must be satisfied for a packet to match. A single - rule can contain the positive and negative version of a match - and both must be satisfied for the rule to match." - properties: - action: - type: string - destination: - description: Destination contains the match criteria that apply - to destination entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and Selector are defined on the same rule, then only workload - endpoints that are matched by both selectors will be selected - by the rule. \n For NetworkPolicy, an empty NamespaceSelector - implies that the Selector is limited to selecting only - workload endpoints in the same namespace as the NetworkPolicy. - \n For NetworkPolicy, `global()` NamespaceSelector implies - that the Selector is limited to selecting only GlobalNetworkSet - or HostEndpoint. \n For GlobalNetworkPolicy, an empty - NamespaceSelector implies the Selector applies to workload - endpoints across all namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - type: object - http: - description: HTTP contains match criteria that apply to HTTP - requests. - properties: - methods: - description: Methods is an optional field that restricts - the rule to apply only to HTTP requests that use one of - the listed HTTP Methods (e.g. GET, PUT, etc.) Multiple - methods are OR'd together. - items: - type: string - type: array - paths: - description: 'Paths is an optional field that restricts - the rule to apply to HTTP requests that use one of the - listed HTTP Paths. Multiple paths are OR''d together. - e.g: - exact: /foo - prefix: /bar NOTE: Each entry may - ONLY specify either a `exact` or a `prefix` match. The - validator will check for it.' - items: - description: 'HTTPPath specifies an HTTP path to match. - It may be either of the form: exact: : which matches - the path exactly or prefix: : which matches - the path prefix' - properties: - exact: - type: string - prefix: - type: string - type: object - type: array - type: object - icmp: - description: ICMP is an optional field that restricts the rule - to apply to a specific type and code of ICMP traffic. This - should only be specified if the Protocol field is set to "ICMP" - or "ICMPv6". - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - ipVersion: - description: IPVersion is an optional field that restricts the - rule to only match a specific IP version. - type: integer - metadata: - description: Metadata contains additional information for this - rule - properties: - annotations: - additionalProperties: - type: string - description: Annotations is a set of key value pairs that - give extra information about the rule - type: object - type: object - notICMP: - description: NotICMP is the negated version of the ICMP field. - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - notProtocol: - anyOf: - - type: integer - - type: string - description: NotProtocol is the negated version of the Protocol - field. - pattern: ^.* - x-kubernetes-int-or-string: true - protocol: - anyOf: - - type: integer - - type: string - description: "Protocol is an optional field that restricts the - rule to only apply to traffic of a specific IP protocol. Required - if any of the EntityRules contain Ports (because ports only - apply to certain protocols). \n Must be one of these string - values: \"TCP\", \"UDP\", \"ICMP\", \"ICMPv6\", \"SCTP\", - \"UDPLite\" or an integer in the range 1-255." - pattern: ^.* - x-kubernetes-int-or-string: true - source: - description: Source contains the match criteria that apply to - source entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and Selector are defined on the same rule, then only workload - endpoints that are matched by both selectors will be selected - by the rule. \n For NetworkPolicy, an empty NamespaceSelector - implies that the Selector is limited to selecting only - workload endpoints in the same namespace as the NetworkPolicy. - \n For NetworkPolicy, `global()` NamespaceSelector implies - that the Selector is limited to selecting only GlobalNetworkSet - or HostEndpoint. \n For GlobalNetworkPolicy, an empty - NamespaceSelector implies the Selector applies to workload - endpoints across all namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - type: object - required: - - action - type: object - type: array - ingress: - description: The ordered set of ingress rules. Each rule contains - a set of packet match criteria and a corresponding action to apply. - items: - description: "A Rule encapsulates a set of match criteria and an - action. Both selector-based security Policy and security Profiles - reference rules - separated out as a list of rules for both ingress - and egress packet matching. \n Each positive match criteria has - a negated version, prefixed with \"Not\". All the match criteria - within a rule must be satisfied for a packet to match. A single - rule can contain the positive and negative version of a match - and both must be satisfied for the rule to match." - properties: - action: - type: string - destination: - description: Destination contains the match criteria that apply - to destination entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and Selector are defined on the same rule, then only workload - endpoints that are matched by both selectors will be selected - by the rule. \n For NetworkPolicy, an empty NamespaceSelector - implies that the Selector is limited to selecting only - workload endpoints in the same namespace as the NetworkPolicy. - \n For NetworkPolicy, `global()` NamespaceSelector implies - that the Selector is limited to selecting only GlobalNetworkSet - or HostEndpoint. \n For GlobalNetworkPolicy, an empty - NamespaceSelector implies the Selector applies to workload - endpoints across all namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - type: object - http: - description: HTTP contains match criteria that apply to HTTP - requests. - properties: - methods: - description: Methods is an optional field that restricts - the rule to apply only to HTTP requests that use one of - the listed HTTP Methods (e.g. GET, PUT, etc.) Multiple - methods are OR'd together. - items: - type: string - type: array - paths: - description: 'Paths is an optional field that restricts - the rule to apply to HTTP requests that use one of the - listed HTTP Paths. Multiple paths are OR''d together. - e.g: - exact: /foo - prefix: /bar NOTE: Each entry may - ONLY specify either a `exact` or a `prefix` match. The - validator will check for it.' - items: - description: 'HTTPPath specifies an HTTP path to match. - It may be either of the form: exact: : which matches - the path exactly or prefix: : which matches - the path prefix' - properties: - exact: - type: string - prefix: - type: string - type: object - type: array - type: object - icmp: - description: ICMP is an optional field that restricts the rule - to apply to a specific type and code of ICMP traffic. This - should only be specified if the Protocol field is set to "ICMP" - or "ICMPv6". - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - ipVersion: - description: IPVersion is an optional field that restricts the - rule to only match a specific IP version. - type: integer - metadata: - description: Metadata contains additional information for this - rule - properties: - annotations: - additionalProperties: - type: string - description: Annotations is a set of key value pairs that - give extra information about the rule - type: object - type: object - notICMP: - description: NotICMP is the negated version of the ICMP field. - properties: - code: - description: Match on a specific ICMP code. If specified, - the Type value must also be specified. This is a technical - limitation imposed by the kernel's iptables firewall, - which Calico uses to enforce the rule. - type: integer - type: - description: Match on a specific ICMP type. For example - a value of 8 refers to ICMP Echo Request (i.e. pings). - type: integer - type: object - notProtocol: - anyOf: - - type: integer - - type: string - description: NotProtocol is the negated version of the Protocol - field. - pattern: ^.* - x-kubernetes-int-or-string: true - protocol: - anyOf: - - type: integer - - type: string - description: "Protocol is an optional field that restricts the - rule to only apply to traffic of a specific IP protocol. Required - if any of the EntityRules contain Ports (because ports only - apply to certain protocols). \n Must be one of these string - values: \"TCP\", \"UDP\", \"ICMP\", \"ICMPv6\", \"SCTP\", - \"UDPLite\" or an integer in the range 1-255." - pattern: ^.* - x-kubernetes-int-or-string: true - source: - description: Source contains the match criteria that apply to - source entity. - properties: - namespaceSelector: - description: "NamespaceSelector is an optional field that - contains a selector expression. Only traffic that originates - from (or terminates at) endpoints within the selected - namespaces will be matched. When both NamespaceSelector - and Selector are defined on the same rule, then only workload - endpoints that are matched by both selectors will be selected - by the rule. \n For NetworkPolicy, an empty NamespaceSelector - implies that the Selector is limited to selecting only - workload endpoints in the same namespace as the NetworkPolicy. - \n For NetworkPolicy, `global()` NamespaceSelector implies - that the Selector is limited to selecting only GlobalNetworkSet - or HostEndpoint. \n For GlobalNetworkPolicy, an empty - NamespaceSelector implies the Selector applies to workload - endpoints across all namespaces." - type: string - nets: - description: Nets is an optional field that restricts the - rule to only apply to traffic that originates from (or - terminates at) IP addresses in any of the given subnets. - items: - type: string - type: array - notNets: - description: NotNets is the negated version of the Nets - field. - items: - type: string - type: array - notPorts: - description: NotPorts is the negated version of the Ports - field. Since only some protocols have ports, if any ports - are specified it requires the Protocol match in the Rule - to be set to "TCP" or "UDP". - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - notSelector: - description: NotSelector is the negated version of the Selector - field. See Selector field for subtleties with negated - selectors. - type: string - ports: - description: "Ports is an optional field that restricts - the rule to only apply to traffic that has a source (destination) - port that matches one of these ranges/values. This value - is a list of integers or strings that represent ranges - of ports. \n Since only some protocols have ports, if - any ports are specified it requires the Protocol match - in the Rule to be set to \"TCP\" or \"UDP\"." - items: - anyOf: - - type: integer - - type: string - pattern: ^.* - x-kubernetes-int-or-string: true - type: array - selector: - description: "Selector is an optional field that contains - a selector expression (see Policy for sample syntax). - \ Only traffic that originates from (terminates at) endpoints - matching the selector will be matched. \n Note that: in - addition to the negated version of the Selector (see NotSelector - below), the selector expression syntax itself supports - negation. The two types of negation are subtly different. - One negates the set of matched endpoints, the other negates - the whole match: \n \tSelector = \"!has(my_label)\" matches - packets that are from other Calico-controlled \tendpoints - that do not have the label \"my_label\". \n \tNotSelector - = \"has(my_label)\" matches packets that are not from - Calico-controlled \tendpoints that do have the label \"my_label\". - \n The effect is that the latter will accept packets from - non-Calico sources whereas the former is limited to packets - from Calico-controlled endpoints." - type: string - serviceAccounts: - description: ServiceAccounts is an optional field that restricts - the rule to only apply to traffic that originates from - (or terminates at) a pod running as a matching service - account. - properties: - names: - description: Names is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account whose name is in the list. - items: - type: string - type: array - selector: - description: Selector is an optional field that restricts - the rule to only apply to traffic that originates - from (or terminates at) a pod running as a service - account that matches the given label selector. If - both Names and Selector are specified then they are - AND'ed. - type: string - type: object - type: object - required: - - action - type: object - type: array - order: - description: Order is an optional field that specifies the order in - which the policy is applied. Policies with higher "order" are applied - after those with lower order. If the order is omitted, it may be - considered to be "infinite" - i.e. the policy will be applied last. Policies - with identical order will be applied in alphanumerical order based - on the Policy "Name". - type: number - selector: - description: "The selector is an expression used to pick pick out - the endpoints that the policy should be applied to. \n Selector - expressions follow this syntax: \n \tlabel == \"string_literal\" - \ -> comparison, e.g. my_label == \"foo bar\" \tlabel != \"string_literal\" - \ -> not equal; also matches if label is not present \tlabel in - { \"a\", \"b\", \"c\", ... } -> true if the value of label X is - one of \"a\", \"b\", \"c\" \tlabel not in { \"a\", \"b\", \"c\", - ... } -> true if the value of label X is not one of \"a\", \"b\", - \"c\" \thas(label_name) -> True if that label is present \t! expr - -> negation of expr \texpr && expr -> Short-circuit and \texpr - || expr -> Short-circuit or \t( expr ) -> parens for grouping \tall() - or the empty selector -> matches all endpoints. \n Label names are - allowed to contain alphanumerics, -, _ and /. String literals are - more permissive but they do not support escape characters. \n Examples - (with made-up labels): \n \ttype == \"webserver\" && deployment - == \"prod\" \ttype in {\"frontend\", \"backend\"} \tdeployment != - \"dev\" \t! has(label_name)" - type: string - serviceAccountSelector: - description: ServiceAccountSelector is an optional field for an expression - used to select a pod based on service accounts. - type: string - types: - description: "Types indicates whether this policy applies to ingress, - or to egress, or to both. When not explicitly specified (and so - the value on creation is empty or nil), Calico defaults Types according - to what Ingress and Egress are present in the policy. The default - is: \n - [ PolicyTypeIngress ], if there are no Egress rules (including - the case where there are also no Ingress rules) \n - [ PolicyTypeEgress - ], if there are Egress rules but no Ingress rules \n - [ PolicyTypeIngress, - PolicyTypeEgress ], if there are both Ingress and Egress rules. - \n When the policy is read back again, Types will always be one - of these values, never empty or nil." - items: - description: PolicyType enumerates the possible values of the PolicySpec - Types field. - type: string - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: networksets.crd.projectcalico.org -spec: - group: crd.projectcalico.org - names: - kind: NetworkSet - listKind: NetworkSetList - plural: networksets - singular: networkset - scope: Namespaced - versions: - - name: v1 - schema: - openAPIV3Schema: - description: NetworkSet is the Namespaced-equivalent of the GlobalNetworkSet. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: NetworkSetSpec contains the specification for a NetworkSet - resource. - properties: - nets: - description: The list of IP networks that belong to this set. - items: - type: string - type: array - type: object - type: object - served: true - storage: true -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- ---- -# Source: calico/templates/calico-kube-controllers-rbac.yaml - -# Include a clusterrole for the kube-controllers component, -# and bind it to the calico-kube-controllers serviceaccount. -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: calico-kube-controllers -rules: - # Nodes are watched to monitor for deletions. - - apiGroups: [""] - resources: - - nodes - verbs: - - watch - - list - - get - # Pods are queried to check for existence. - - apiGroups: [""] - resources: - - pods - verbs: - - get - # IPAM resources are manipulated when nodes are deleted. - - apiGroups: ["crd.projectcalico.org"] - resources: - - ippools - verbs: - - list - - apiGroups: ["crd.projectcalico.org"] - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - - watch - # kube-controllers manages hostendpoints. - - apiGroups: ["crd.projectcalico.org"] - resources: - - hostendpoints - verbs: - - get - - list - - create - - update - - delete - # Needs access to update clusterinformations. - - apiGroups: ["crd.projectcalico.org"] - resources: - - clusterinformations - verbs: - - get - - create - - update - # KubeControllersConfiguration is where it gets its config - - apiGroups: ["crd.projectcalico.org"] - resources: - - kubecontrollersconfigurations - verbs: - # read its own config - - get - # create a default if none exists - - create - # update status - - update - # watch for changes - - watch ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: calico-kube-controllers -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-kube-controllers -subjects: -- kind: ServiceAccount - name: calico-kube-controllers - namespace: kube-system ---- - ---- -# Source: calico/templates/calico-node-rbac.yaml -# Include a clusterrole for the calico-node DaemonSet, -# and bind it to the calico-node serviceaccount. -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: calico-node -rules: - # The CNI plugin needs to get pods, nodes, and namespaces. - - apiGroups: [""] - resources: - - pods - - nodes - - namespaces - verbs: - - get - - apiGroups: [""] - resources: - - endpoints - - services - verbs: - # Used to discover service IPs for advertisement. - - watch - - list - # Used to discover Typhas. - - get - # Pod CIDR auto-detection on kubeadm needs access to config maps. - - apiGroups: [""] - resources: - - configmaps - verbs: - - get - - apiGroups: [""] - resources: - - nodes/status - verbs: - # Needed for clearing NodeNetworkUnavailable flag. - - patch - # Calico stores some configuration information in node annotations. - - update - # Watch for changes to Kubernetes NetworkPolicies. - - apiGroups: ["networking.k8s.io"] - resources: - - networkpolicies - verbs: - - watch - - list - # Used by Calico for policy information. - - apiGroups: [""] - resources: - - pods - - namespaces - - serviceaccounts - verbs: - - list - - watch - # The CNI plugin patches pods/status. - - apiGroups: [""] - resources: - - pods/status - verbs: - - patch - # Calico monitors various CRDs for config. - - apiGroups: ["crd.projectcalico.org"] - resources: - - globalfelixconfigs - - felixconfigurations - - bgppeers - - globalbgpconfigs - - bgpconfigurations - - ippools - - ipamblocks - - globalnetworkpolicies - - globalnetworksets - - networkpolicies - - networksets - - clusterinformations - - hostendpoints - - blockaffinities - verbs: - - get - - list - - watch - # Calico must create and update some CRDs on startup. - - apiGroups: ["crd.projectcalico.org"] - resources: - - ippools - - felixconfigurations - - clusterinformations - verbs: - - create - - update - # Calico stores some configuration information on the node. - - apiGroups: [""] - resources: - - nodes - verbs: - - get - - list - - watch - # These permissions are only required for upgrade from v2.6, and can - # be removed after upgrade or on fresh installations. - - apiGroups: ["crd.projectcalico.org"] - resources: - - bgpconfigurations - - bgppeers - verbs: - - create - - update - # These permissions are required for Calico CNI to perform IPAM allocations. - - apiGroups: ["crd.projectcalico.org"] - resources: - - blockaffinities - - ipamblocks - - ipamhandles - verbs: - - get - - list - - create - - update - - delete - - apiGroups: ["crd.projectcalico.org"] - resources: - - ipamconfigs - verbs: - - get - # Block affinities must also be watchable by confd for route aggregation. - - apiGroups: ["crd.projectcalico.org"] - resources: - - blockaffinities - verbs: - - watch - # The Calico IPAM migration needs to get daemonsets. These permissions can be - # removed if not upgrading from an installation using host-local IPAM. - - apiGroups: ["apps"] - resources: - - daemonsets - verbs: - - get - ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: calico-node -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: calico-node -subjects: -- kind: ServiceAccount - name: calico-node - namespace: kube-system - ---- -# Source: calico/templates/calico-node.yaml -# This manifest installs the calico-node container, as well -# as the CNI plugins and network config on -# each master and worker node in a Kubernetes cluster. -kind: DaemonSet -apiVersion: apps/v1 -metadata: - name: calico-node - namespace: kube-system - labels: - k8s-app: calico-node -spec: - selector: - matchLabels: - k8s-app: calico-node - updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 1 - template: - metadata: - labels: - k8s-app: calico-node - spec: - nodeSelector: - kubernetes.io/os: linux - hostNetwork: true - tolerations: - # Make sure calico-node gets scheduled on all nodes. - - effect: NoSchedule - operator: Exists - # Mark the pod as a critical add-on for rescheduling. - - key: CriticalAddonsOnly - operator: Exists - - effect: NoExecute - operator: Exists - serviceAccountName: calico-node - # Minimize downtime during a rolling upgrade or deletion; tell Kubernetes to do a "force - # deletion": https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods. - terminationGracePeriodSeconds: 0 - priorityClassName: system-node-critical - initContainers: - # This container performs upgrade from host-local IPAM to calico-ipam. - # It can be deleted if this is a fresh installation, or if you have already - # upgraded to use calico-ipam. - - name: upgrade-ipam - image: docker.io/calico/cni:v3.19.1 - command: ["/opt/cni/bin/calico-ipam", "-upgrade"] - envFrom: - - configMapRef: - # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode. - name: kubernetes-services-endpoint - optional: true - env: - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - volumeMounts: - - mountPath: /var/lib/cni/networks - name: host-local-net-dir - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - securityContext: - privileged: true - # This container installs the CNI binaries - # and CNI network config file on each node. - - name: install-cni - image: docker.io/calico/cni:v3.19.1 - command: ["/opt/cni/bin/install"] - envFrom: - - configMapRef: - # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode. - name: kubernetes-services-endpoint - optional: true - env: - # Name of the CNI config file to create. - - name: CNI_CONF_NAME - value: "10-calico.conflist" - # The CNI network config to install on each node. - - name: CNI_NETWORK_CONFIG - valueFrom: - configMapKeyRef: - name: calico-config - key: cni_network_config - # Set the hostname based on the k8s node name. - - name: KUBERNETES_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - # CNI MTU Config variable - - name: CNI_MTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - # Prevents the container from sleeping forever. - - name: SLEEP - value: "false" - volumeMounts: - - mountPath: /host/opt/cni/bin - name: cni-bin-dir - - mountPath: /host/etc/cni/net.d - name: cni-net-dir - securityContext: - privileged: true - # Adds a Flex Volume Driver that creates a per-pod Unix Domain Socket to allow Dikastes - # to communicate with Felix over the Policy Sync API. - - name: flexvol-driver - image: docker.io/calico/pod2daemon-flexvol:v3.19.1 - volumeMounts: - - name: flexvol-driver-host - mountPath: /host/driver - securityContext: - privileged: true - containers: - # Runs calico-node container on each Kubernetes node. This - # container programs network policy and routes on each - # host. - - name: calico-node - image: docker.io/calico/node:v3.19.1 - envFrom: - - configMapRef: - # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode. - name: kubernetes-services-endpoint - optional: true - env: - # Use Kubernetes API as the backing datastore. - - name: DATASTORE_TYPE - value: "kubernetes" - # Wait for the datastore. - - name: WAIT_FOR_DATASTORE - value: "true" - # Set based on the k8s node name. - - name: NODENAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - # Choose the backend to use. - - name: CALICO_NETWORKING_BACKEND - valueFrom: - configMapKeyRef: - name: calico-config - key: calico_backend - # Cluster type to identify the deployment type - - name: CLUSTER_TYPE - value: "k8s,bgp" - # Auto-detect the BGP IP address. - - name: IP - value: "autodetect" - # Enable IPIP - - name: CALICO_IPV4POOL_IPIP - value: "Always" - # Enable or Disable VXLAN on the default IP pool. - - name: CALICO_IPV4POOL_VXLAN - value: "Never" - # Set MTU for tunnel device used if ipip is enabled - - name: FELIX_IPINIPMTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - # Set MTU for the VXLAN tunnel device. - - name: FELIX_VXLANMTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - # Set MTU for the Wireguard tunnel device. - - name: FELIX_WIREGUARDMTU - valueFrom: - configMapKeyRef: - name: calico-config - key: veth_mtu - # The default IPv4 pool to create on startup if none exists. Pod IPs will be - # chosen from this range. Changing this value after installation will have - # no effect. This should fall within `--cluster-cidr`. - # - name: CALICO_IPV4POOL_CIDR - # value: "192.168.0.0/16" - # Disable file logging so `kubectl logs` works. - - name: CALICO_DISABLE_FILE_LOGGING - value: "true" - # Set Felix endpoint to host default action to ACCEPT. - - name: FELIX_DEFAULTENDPOINTTOHOSTACTION - value: "ACCEPT" - # Disable IPv6 on Kubernetes. - - name: FELIX_IPV6SUPPORT - value: "false" - - name: FELIX_HEALTHENABLED - value: "true" - securityContext: - privileged: true - resources: - requests: - cpu: 250m - livenessProbe: - exec: - command: - - /bin/calico-node - - -felix-live - - -bird-live - periodSeconds: 10 - initialDelaySeconds: 10 - failureThreshold: 6 - readinessProbe: - exec: - command: - - /bin/calico-node - - -felix-ready - - -bird-ready - periodSeconds: 10 - volumeMounts: - - mountPath: /lib/modules - name: lib-modules - readOnly: true - - mountPath: /run/xtables.lock - name: xtables-lock - readOnly: false - - mountPath: /var/run/calico - name: var-run-calico - readOnly: false - - mountPath: /var/lib/calico - name: var-lib-calico - readOnly: false - - name: policysync - mountPath: /var/run/nodeagent - # For eBPF mode, we need to be able to mount the BPF filesystem at /sys/fs/bpf so we mount in the - # parent directory. - - name: sysfs - mountPath: /sys/fs/ - # Bidirectional means that, if we mount the BPF filesystem at /sys/fs/bpf it will propagate to the host. - # If the host is known to mount that filesystem already then Bidirectional can be omitted. - mountPropagation: Bidirectional - - name: cni-log-dir - mountPath: /var/log/calico/cni - readOnly: true - volumes: - # Used by calico-node. - - name: lib-modules - hostPath: - path: /lib/modules - - name: var-run-calico - hostPath: - path: /var/run/calico - - name: var-lib-calico - hostPath: - path: /var/lib/calico - - name: xtables-lock - hostPath: - path: /run/xtables.lock - type: FileOrCreate - - name: sysfs - hostPath: - path: /sys/fs/ - type: DirectoryOrCreate - # Used to install CNI. - - name: cni-bin-dir - hostPath: - path: /opt/cni/bin - - name: cni-net-dir - hostPath: - path: /etc/cni/net.d - # Used to access CNI logs. - - name: cni-log-dir - hostPath: - path: /var/log/calico/cni - # Mount in the directory for host-local IPAM allocations. This is - # used when upgrading from host-local to calico-ipam, and can be removed - # if not using the upgrade-ipam init container. - - name: host-local-net-dir - hostPath: - path: /var/lib/cni/networks - # Used to create per-pod Unix Domain Sockets - - name: policysync - hostPath: - type: DirectoryOrCreate - path: /var/run/nodeagent - # Used to install Flex Volume Driver - - name: flexvol-driver-host - hostPath: - type: DirectoryOrCreate - path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds ---- - -apiVersion: v1 -kind: ServiceAccount -metadata: - name: calico-node - namespace: kube-system - ---- -# Source: calico/templates/calico-kube-controllers.yaml -# See https://github.com/projectcalico/kube-controllers -apiVersion: apps/v1 -kind: Deployment -metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers -spec: - # The controllers can only have a single active instance. - replicas: 1 - selector: - matchLabels: - k8s-app: calico-kube-controllers - strategy: - type: Recreate - template: - metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers - spec: - nodeSelector: - kubernetes.io/os: linux - tolerations: - # Mark the pod as a critical add-on for rescheduling. - - key: CriticalAddonsOnly - operator: Exists - - key: node-role.kubernetes.io/master - effect: NoSchedule - serviceAccountName: calico-kube-controllers - priorityClassName: system-cluster-critical - containers: - - name: calico-kube-controllers - image: docker.io/calico/kube-controllers:v3.19.1 - env: - # Choose which controllers to run. - - name: ENABLED_CONTROLLERS - value: node - - name: DATASTORE_TYPE - value: kubernetes - livenessProbe: - exec: - command: - - /usr/bin/check-status - - -l - periodSeconds: 10 - initialDelaySeconds: 10 - failureThreshold: 6 - readinessProbe: - exec: - command: - - /usr/bin/check-status - - -r - periodSeconds: 10 - ---- - -apiVersion: v1 -kind: ServiceAccount -metadata: - name: calico-kube-controllers - namespace: kube-system - ---- - -# This manifest creates a Pod Disruption Budget for Controller to allow K8s Cluster Autoscaler to evict - -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: calico-kube-controllers - namespace: kube-system - labels: - k8s-app: calico-kube-controllers -spec: - maxUnavailable: 1 - selector: - matchLabels: - k8s-app: calico-kube-controllers - ---- -# Source: calico/templates/calico-etcd-secrets.yaml - ---- -# Source: calico/templates/calico-typha.yaml - ---- -# Source: calico/templates/configure-canal.yaml diff --git a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/values.star b/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/values.star deleted file mode 100644 index b5032ec35a..0000000000 --- a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/values.star +++ /dev/null @@ -1,12 +0,0 @@ -load("@ytt:data", "data") -load("@ytt:assert", "assert") - -def validate_calico(): - data.values.infraProvider or assert.fail("Infrastructure provider should be provided") -end - -#export -values = data.values - -# validate -validate_calico() diff --git a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/values.yaml b/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/values.yaml deleted file mode 100644 index 6395582ea5..0000000000 --- a/providers/yttcc/vendir/cni/_ytt_lib/addons/packages/calico/3.19.1/bundle/config/values.yaml +++ /dev/null @@ -1,11 +0,0 @@ -#@data/values ---- - -namespace: kube-system -infraProvider: vsphere -ipFamily: null -calico: - config: - clusterCIDR: null - #! "0" as default means MTU will be auto detected - vethMTU: "0" diff --git a/providers/yttcc/vendir/cni/cni.lib.yaml b/providers/yttcc/vendir/cni/cni.lib.yaml deleted file mode 100644 index 74ea2fe408..0000000000 --- a/providers/yttcc/vendir/cni/cni.lib.yaml +++ /dev/null @@ -1,4 +0,0 @@ -#@ load("@ytt:library", "library") - -#@ cni_antrea_lib = library.get("addons/packages/antrea/1.2.3/bundle/config") -#@ cni_calico_lib = library.get("addons/packages/calico/3.19.1/bundle/config") diff --git a/providers/yttcc/vendir/kapp-controller/_ytt_lib/LICENSE b/providers/yttcc/vendir/kapp-controller/_ytt_lib/LICENSE deleted file mode 100644 index 68c771a099..0000000000 --- a/providers/yttcc/vendir/kapp-controller/_ytt_lib/LICENSE +++ /dev/null @@ -1,176 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - diff --git a/providers/yttcc/vendir/kapp-controller/_ytt_lib/NOTICE b/providers/yttcc/vendir/kapp-controller/_ytt_lib/NOTICE deleted file mode 100644 index df374c7ac0..0000000000 --- a/providers/yttcc/vendir/kapp-controller/_ytt_lib/NOTICE +++ /dev/null @@ -1,182 +0,0 @@ -Tanzu Community Edition -Copyright 2020 VMware, Inc. - -The Apache 2.0 license (the "License") set forth below applies to all parts of the Tanzu Community Edition project. You may not use this file except in compliance with the License. - -Apache License - -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, -and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the -copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other -entities that control, are controlled by, or are under common control -with that entity. For the purposes of this definition, "control" means -(i) the power, direct or indirect, to cause the direction or management -of such entity, whether by contract or otherwise, or (ii) ownership -of fifty percent (50%) or more of the outstanding shares, or (iii) -beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation source, -and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation -or translation of a Source form, including but not limited to compiled -object code, generated documentation, and conversions to other media -types. - -"Work" shall mean the work of authorship, whether in Source or -Object form, made available under the License, as indicated by a copyright -notice that is included in or attached to the work (an example is provided -in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, -that is based on (or derived from) the Work and for which the editorial -revisions, annotations, elaborations, or other modifications represent, -as a whole, an original work of authorship. For the purposes of this -License, Derivative Works shall not include works that remain separable -from, or merely link (or bind by name) to the interfaces of, the Work -and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the -original version of the Work and any modifications or additions to -that Work or Derivative Works thereof, that is intentionally submitted -to Licensor for inclusion in the Work by the copyright owner or by an -individual or Legal Entity authorized to submit on behalf of the copyright -owner. For the purposes of this definition, "submitted" means any form of -electronic, verbal, or written communication sent to the Licensor or its -representatives, including but not limited to communication on electronic -mailing lists, source code control systems, and issue tracking systems -that are managed by, or on behalf of, the Licensor for the purpose of -discussing and improving the Work, but excluding communication that is -conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity -on behalf of whom a Contribution has been received by Licensor and -subsequently incorporated within the Work. - -2. Grant of Copyright License. -Subject to the terms and conditions of this License, each Contributor -hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable copyright license to reproduce, prepare -Derivative Works of, publicly display, publicly perform, sublicense, and -distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. -Subject to the terms and conditions of this License, each Contributor -hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty- free, irrevocable (except as stated in this section) patent -license to make, have made, use, offer to sell, sell, import, and -otherwise transfer the Work, where such license applies only to those -patent claims licensable by such Contributor that are necessarily -infringed by their Contribution(s) alone or by combination of -their Contribution(s) with the Work to which such Contribution(s) -was submitted. If You institute patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Work or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses granted -to You under this License for that Work shall terminate as of the date -such litigation is filed. - -4. Redistribution. -You may reproduce and distribute copies of the Work or Derivative Works -thereof in any medium, with or without modifications, and in Source or -Object form, provided that You meet the following conditions: - - a. You must give any other recipients of the Work or Derivative Works - a copy of this License; and - - b. You must cause any modified files to carry prominent notices stating - that You changed the files; and - - c. You must retain, in the Source form of any Derivative Works that - You distribute, all copyright, patent, trademark, and attribution - notices from the Source form of the Work, excluding those notices - that do not pertain to any part of the Derivative Works; and - - d. If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one of - the following places: within a NOTICE text file distributed as part - of the Derivative Works; within the Source form or documentation, - if provided along with the Derivative Works; or, within a display - generated by the Derivative Works, if and wherever such third-party - notices normally appear. The contents of the NOTICE file are for - informational purposes only and do not modify the License. You - may add Your own attribution notices within Derivative Works that - You distribute, alongside or as an addendum to the NOTICE text - from the Work, provided that such additional attribution notices - cannot be construed as modifying the License. You may add Your own - copyright statement to Your modifications and may provide additional - or different license terms and conditions for use, reproduction, or - distribution of Your modifications, or for any such Derivative Works - as a whole, provided Your use, reproduction, and distribution of the - Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. -Unless You explicitly state otherwise, any Contribution intentionally -submitted for inclusion in the Work by You to the Licensor shall be -under the terms and conditions of this License, without any additional -terms or conditions. Notwithstanding the above, nothing herein shall -supersede or modify the terms of any separate license agreement you may -have executed with Licensor regarding such Contributions. - -6. Trademarks. -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. -Unless required by applicable law or agreed to in writing, Licensor -provides the Work (and each Contributor provides its Contributions) on -an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either -express or implied, including, without limitation, any warranties or -conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR -A PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any risks -associated with Your exercise of permissions under this License. - -8. Limitation of Liability. -In no event and under no legal theory, whether in tort (including -negligence), contract, or otherwise, unless required by applicable law -(such as deliberate and grossly negligent acts) or agreed to in writing, -shall any Contributor be liable to You for damages, including any direct, -indirect, special, incidental, or consequential damages of any character -arising as a result of this License or out of the use or inability to -use the Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all other -commercial damages or losses), even if such Contributor has been advised -of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. -While redistributing the Work or Derivative Works thereof, You may -choose to offer, and charge a fee for, acceptance of support, warranty, -indemnity, or other liability obligations and/or rights consistent with -this License. However, in accepting such obligations, You may act only -on Your own behalf and on Your sole responsibility, not on behalf of -any other Contributor, and only if You agree to indemnify, defend, and -hold each Contributor harmless for any liability incurred by, or claims -asserted against, such Contributor by reason of your accepting any such -warranty or additional liability. - -END OF TERMS AND CONDITIONS - - - diff --git a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/change-namespace.yaml b/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/change-namespace.yaml deleted file mode 100644 index 745d746036..0000000000 --- a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/change-namespace.yaml +++ /dev/null @@ -1,58 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("/values.star", "values", "kappNamespace") -#@ load("@ytt:yaml", "yaml") - -#@ if values.kappController.createNamespace: -#@overlay/match by=overlay.subset({"kind":"Namespace","metadata":{"name": "kapp-controller"}}),expects="1+" ---- -metadata: - name: #@ kappNamespace -#@ else: -#@overlay/match by=overlay.subset({"kind":"Namespace","metadata":{"name": "kapp-controller"}}),expects="1+" -#@overlay/remove ---- -#@ end - -#@overlay/match by=overlay.subset({"kind": "ServiceAccount","metadata": {"name": "kapp-controller-sa"}}),expects="1+" ---- -metadata: - namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind": "ClusterRoleBinding","metadata": {"name": "kapp-controller-cluster-role-binding"}}),expects="1+" ---- -subjects: -#@overlay/match by=overlay.subset({"kind": "ServiceAccount"}),expects="1+" -- namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind": "ClusterRoleBinding","metadata": {"name": "pkg-apiserver:system:auth-delegator"}}),expects="1+" ---- -subjects: -#@overlay/match by=overlay.subset({"kind": "ServiceAccount"}),expects="1+" -- namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind": "RoleBinding","metadata": {"name": "pkgserver-auth-reader"}}),expects="1+" ---- -subjects: -#@overlay/match by=overlay.subset({"kind": "ServiceAccount"}),expects="1+" -- namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "kapp-controller"}}) ---- -metadata: - namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind":"Service","metadata":{"name": "packaging-api"}}) ---- -metadata: - namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind":"APIService","metadata":{"name": "v1alpha1.data.packaging.carvel.dev"}}) ---- -spec: - service: - namespace: #@ kappNamespace - -#@overlay/match by=overlay.subset({"kind":"Namespace","metadata":{"name": "kapp-controller-packaging-global"}}),expects=1 ---- -metadata: - name: #@ values.kappController.globalNamespace diff --git a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/update-configmap.yaml b/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/update-configmap.yaml deleted file mode 100644 index f5f0e26f36..0000000000 --- a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/update-configmap.yaml +++ /dev/null @@ -1,17 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("/values.star", "values", "kappNamespace") - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "kapp-controller"}}) -#@overlay/insert before=True ---- -#! This optional ConfigMap must be created before the kapp-controller pod launches in order to read it. -apiVersion: v1 -kind: ConfigMap -metadata: - #! Name must be `kapp-controller-config` for kapp controller to pick it up - name: kapp-controller-config - #! Namespace must match the namespace kapp-controller is deployed to - namespace: #@ kappNamespace - annotations: - kapp.k14s.io/change-group: "apps.kappctrl.k14s.io/kapp-controller-config" -data: #@ values.kappController.config diff --git a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/update-crds.yaml b/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/update-crds.yaml deleted file mode 100644 index 63fee7c920..0000000000 --- a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/update-crds.yaml +++ /dev/null @@ -1,9 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("/values.star", "values") - -#@overlay/match by=overlay.subset({"kind":"CustomResourceDefinition","metadata":{"name": "packagerepositories.packaging.carvel.dev"}}) ---- -metadata: - annotations: - #@overlay/match missing_ok=True - packaging.carvel.dev/global-namespace: #@ values.kappController.globalNamespace diff --git a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/update-deployment.yaml b/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/update-deployment.yaml deleted file mode 100644 index 67202b90c3..0000000000 --- a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/overlays/update-deployment.yaml +++ /dev/null @@ -1,70 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("/values.star", "values", "generateBashCmdForDNS") -#@ load("@ytt:yaml", "yaml") - -#@overlay/match by=overlay.subset({"kind":"Deployment","metadata":{"name": "kapp-controller"}}) ---- -metadata: - annotations: - #@overlay/match missing_ok=True - kapp.k14s.io/change-rule: "upsert after upserting apps.kappctrl.k14s.io/kapp-controller-config" -spec: - template: - #@overlay/match-child-defaults missing_ok=True - spec: - containers: - #@overlay/match by=overlay.subset({"name":"kapp-controller"}) - - args: - #@overlay/match by=overlay.subset("-packaging-global-namespace=kapp-controller-packaging-global") - - #@ "-packaging-global-namespace={}".format(values.kappController.globalNamespace) - #@overlay/append - - #@ "-concurrency={}".format(values.kappController.deployment.concurrency) - #@overlay/append - - #@ "-metrics-bind-address={}".format(values.kappController.deployment.metricsBindAddress) - ports: - #@overlay/match by="name" - - name: api - containerPort: #@ values.kappController.deployment.apiPort - env: - #@overlay/match by="name" - - name: KAPPCTRL_API_PORT - value: #@ str(values.kappController.deployment.apiPort) - #@ if values.kappController.deployment.coreDNSIP: - volumeMounts: - - mountPath: /etc - name: etc - #@ end - #@ if values.kappController.deployment.coreDNSIP: - #! Using init container bypasses the restriction of not having root access in main container - #! It modifies /etc/resolv.conf which is shared to main container - initContainers: - - args: - - -c - - #@ generateBashCmdForDNS(values.kappController.deployment.coreDNSIP) - command: - - /bin/sh - #! Beware, update this image with each version bump!!!!!!! - #! This image needs to be the same as the image used in basefile - image: ghcr.io/vmware-tanzu/carvel-kapp-controller@sha256:4141b93108b1f3431e786638a115a7e0876d756e7a13acfddd7aaa3bae41e202 - name: init-kapp-controller - securityContext: - allowPrivilegeEscalation: false - runAsUser: 0 - volumeMounts: - - mountPath: /kapp-etc - name: etc - #@ end - #@ if/end values.kappController.deployment.hostNetwork: - hostNetwork: #@ values.kappController.deployment.hostNetwork - #@ if/end values.kappController.deployment.priorityClassName: - priorityClassName: #@ values.kappController.deployment.priorityClassName - #@ if hasattr(values.kappController.deployment, 'tolerations') and values.kappController.deployment.tolerations: - tolerations: #@ values.kappController.deployment.tolerations - #@ end - #@ if values.kappController.deployment.coreDNSIP: - volumes: - #@overlay/append - - emptyDir: - medium: Memory - name: etc - #@ end diff --git a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/upstream/kapp-controller.yaml b/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/upstream/kapp-controller.yaml deleted file mode 100644 index f8449c5f21..0000000000 --- a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/upstream/kapp-controller.yaml +++ /dev/null @@ -1,1682 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: kapp-controller ---- -apiVersion: v1 -kind: Namespace -metadata: - name: kapp-controller-packaging-global ---- -apiVersion: apiregistration.k8s.io/v1 -kind: APIService -metadata: - name: v1alpha1.data.packaging.carvel.dev -spec: - group: data.packaging.carvel.dev - groupPriorityMinimum: 100 - service: - name: packaging-api - namespace: kapp-controller - version: v1alpha1 - versionPriority: 100 ---- -apiVersion: v1 -kind: Service -metadata: - name: packaging-api - namespace: kapp-controller -spec: - ports: - - port: 443 - protocol: TCP - targetPort: api - selector: - app: kapp-controller ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: internalpackagemetadatas.internal.packaging.carvel.dev -spec: - group: internal.packaging.carvel.dev - names: - kind: InternalPackageMetadata - listKind: InternalPackageMetadataList - plural: internalpackagemetadatas - singular: internalpackagemetadata - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - categories: - items: - type: string - type: array - displayName: - type: string - iconSVGBase64: - type: string - longDescription: - type: string - maintainers: - items: - properties: - name: - type: string - type: object - type: array - providerName: - type: string - shortDescription: - type: string - supportDescription: - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: internalpackages.internal.packaging.carvel.dev -spec: - group: internal.packaging.carvel.dev - names: - kind: InternalPackage - listKind: InternalPackageList - plural: internalpackages - singular: internalpackage - scope: Namespaced - versions: - - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - capacityRequirementsDescription: - type: string - licenses: - items: - type: string - type: array - refName: - type: string - releaseNotes: - type: string - releasedAt: - format: date-time - nullable: true - type: string - template: - properties: - spec: - properties: - canceled: - description: Canceled when set to true will stop all active - changes - type: boolean - cluster: - properties: - kubeconfigSecretRef: - properties: - key: - type: string - name: - type: string - type: object - namespace: - type: string - type: object - deploy: - items: - properties: - kapp: - properties: - delete: - properties: - rawOptions: - items: - type: string - type: array - type: object - inspect: - properties: - rawOptions: - items: - type: string - type: array - type: object - intoNs: - type: string - mapNs: - items: - type: string - type: array - rawOptions: - items: - type: string - type: array - type: object - type: object - type: array - fetch: - items: - properties: - git: - description: TODO implement git - properties: - lfsSkipSmudge: - type: boolean - ref: - type: string - refSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - secretRef: - description: 'Secret may include one or more keys: - ssh-privatekey, ssh-knownhosts' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - subPath: - type: string - url: - type: string - type: object - helmChart: - properties: - name: - description: 'Example: stable/redis' - type: string - repository: - properties: - secretRef: - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - url: - type: string - type: object - version: - type: string - type: object - http: - properties: - secretRef: - description: 'Secret may include one or more keys: - username, password' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - sha256: - type: string - subPath: - type: string - url: - description: 'URL can point to one of following - formats: text, tgz, zip' - type: string - type: object - image: - properties: - secretRef: - description: 'Secret may include one or more keys: - username, password, token. By default anonymous - access is used for authentication. TODO support - docker config formated secret' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - subPath: - type: string - tagSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - url: - description: 'Example: username/app1-config:v0.1.0' - type: string - type: object - imgpkgBundle: - properties: - image: - type: string - secretRef: - description: 'Secret may include one or more keys: - username, password, token. By default anonymous - access is used for authentication. TODO support - docker config formated secret' - properties: - name: - description: Object is expected to be within - same namespace - type: string - type: object - tagSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - type: object - inline: - properties: - paths: - additionalProperties: - type: string - type: object - pathsFrom: - items: - properties: - configMapRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - type: object - type: array - type: object - type: object - type: array - noopDelete: - description: When NoopDeletion set to true, App deletion should - delete App CR but preserve App's associated resources - type: boolean - paused: - description: Paused when set to true will ignore all pending - changes, once it set back to false, pending changes will - be applied - type: boolean - serviceAccountName: - type: string - syncPeriod: - description: Controls frequency of app reconciliation - type: string - template: - items: - properties: - helmTemplate: - properties: - name: - type: string - namespace: - type: string - path: - type: string - valuesFrom: - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - jsonnet: - description: TODO implement jsonnet - type: object - kbld: - properties: - paths: - items: - type: string - type: array - type: object - kustomize: - description: TODO implement kustomize - type: object - sops: - properties: - age: - properties: - privateKeysSecretRef: - properties: - name: - type: string - type: object - type: object - paths: - items: - type: string - type: array - pgp: - properties: - privateKeysSecretRef: - properties: - name: - type: string - type: object - type: object - type: object - ytt: - properties: - fileMarks: - items: - type: string - type: array - ignoreUnknownComments: - type: boolean - inline: - properties: - paths: - additionalProperties: - type: string - type: object - pathsFrom: - items: - properties: - configMapRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - type: object - type: array - type: object - paths: - items: - type: string - type: array - strict: - type: boolean - valuesFrom: - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - type: object - type: array - type: object - required: - - spec - type: object - valuesSchema: - description: valuesSchema can be used to show template values that - can be configured by users when a Package is installed in an OpenAPI - schema format. - properties: - openAPIv3: - nullable: true - type: object - x-kubernetes-preserve-unknown-fields: true - type: object - version: - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: apps.kappctrl.k14s.io -spec: - group: kappctrl.k14s.io - names: - kind: App - listKind: AppList - plural: apps - singular: app - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Friendly description - jsonPath: .status.friendlyDescription - name: Description - type: string - - description: Last time app started being deployed. Does not mean anything was - changed. - jsonPath: .status.deploy.startedAt - name: Since-Deploy - type: date - - description: Time since creation - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - canceled: - description: Canceled when set to true will stop all active changes - type: boolean - cluster: - properties: - kubeconfigSecretRef: - properties: - key: - type: string - name: - type: string - type: object - namespace: - type: string - type: object - deploy: - items: - properties: - kapp: - properties: - delete: - properties: - rawOptions: - items: - type: string - type: array - type: object - inspect: - properties: - rawOptions: - items: - type: string - type: array - type: object - intoNs: - type: string - mapNs: - items: - type: string - type: array - rawOptions: - items: - type: string - type: array - type: object - type: object - type: array - fetch: - items: - properties: - git: - description: TODO implement git - properties: - lfsSkipSmudge: - type: boolean - ref: - type: string - refSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - secretRef: - description: 'Secret may include one or more keys: ssh-privatekey, - ssh-knownhosts' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - subPath: - type: string - url: - type: string - type: object - helmChart: - properties: - name: - description: 'Example: stable/redis' - type: string - repository: - properties: - secretRef: - properties: - name: - description: Object is expected to be within same - namespace - type: string - type: object - url: - type: string - type: object - version: - type: string - type: object - http: - properties: - secretRef: - description: 'Secret may include one or more keys: username, - password' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - sha256: - type: string - subPath: - type: string - url: - description: 'URL can point to one of following formats: - text, tgz, zip' - type: string - type: object - image: - properties: - secretRef: - description: 'Secret may include one or more keys: username, - password, token. By default anonymous access is used for - authentication. TODO support docker config formated secret' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - subPath: - type: string - tagSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - url: - description: 'Example: username/app1-config:v0.1.0' - type: string - type: object - imgpkgBundle: - properties: - image: - type: string - secretRef: - description: 'Secret may include one or more keys: username, - password, token. By default anonymous access is used for - authentication. TODO support docker config formated secret' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - tagSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - type: object - inline: - properties: - paths: - additionalProperties: - type: string - type: object - pathsFrom: - items: - properties: - configMapRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - type: object - type: array - type: object - type: object - type: array - noopDelete: - description: When NoopDeletion set to true, App deletion should delete - App CR but preserve App's associated resources - type: boolean - paused: - description: Paused when set to true will ignore all pending changes, - once it set back to false, pending changes will be applied - type: boolean - serviceAccountName: - type: string - syncPeriod: - description: Controls frequency of app reconciliation - type: string - template: - items: - properties: - helmTemplate: - properties: - name: - type: string - namespace: - type: string - path: - type: string - valuesFrom: - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - jsonnet: - description: TODO implement jsonnet - type: object - kbld: - properties: - paths: - items: - type: string - type: array - type: object - kustomize: - description: TODO implement kustomize - type: object - sops: - properties: - age: - properties: - privateKeysSecretRef: - properties: - name: - type: string - type: object - type: object - paths: - items: - type: string - type: array - pgp: - properties: - privateKeysSecretRef: - properties: - name: - type: string - type: object - type: object - type: object - ytt: - properties: - fileMarks: - items: - type: string - type: array - ignoreUnknownComments: - type: boolean - inline: - properties: - paths: - additionalProperties: - type: string - type: object - pathsFrom: - items: - properties: - configMapRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - secretRef: - properties: - directoryPath: - type: string - name: - type: string - type: object - type: object - type: array - type: object - paths: - items: - type: string - type: array - strict: - type: boolean - valuesFrom: - items: - properties: - configMapRef: - properties: - name: - type: string - type: object - path: - type: string - secretRef: - properties: - name: - type: string - type: object - type: object - type: array - type: object - type: object - type: array - type: object - status: - properties: - conditions: - items: - description: TODO rename to Condition - properties: - message: - description: Human-readable message indicating details about - last transition. - type: string - reason: - description: Unique, this should be a short, machine understandable - string that gives the reason for condition's last transition. - If it reports "ResizeStarted" that means the underlying persistent - volume is being resized. - type: string - status: - type: string - type: - type: string - required: - - status - - type - type: object - type: array - consecutiveReconcileFailures: - type: integer - consecutiveReconcileSuccesses: - type: integer - deploy: - properties: - error: - type: string - exitCode: - type: integer - finished: - type: boolean - startedAt: - format: date-time - type: string - stderr: - type: string - stdout: - type: string - updatedAt: - format: date-time - type: string - type: object - fetch: - properties: - error: - type: string - exitCode: - type: integer - startedAt: - format: date-time - type: string - stderr: - type: string - stdout: - type: string - updatedAt: - format: date-time - type: string - type: object - friendlyDescription: - type: string - inspect: - properties: - error: - type: string - exitCode: - type: integer - stderr: - type: string - stdout: - type: string - updatedAt: - format: date-time - type: string - type: object - managedAppName: - type: string - observedGeneration: - format: int64 - type: integer - template: - properties: - error: - type: string - exitCode: - type: integer - stderr: - type: string - updatedAt: - format: date-time - type: string - type: object - usefulErrorMessage: - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: packageinstalls.packaging.carvel.dev -spec: - group: packaging.carvel.dev - names: - kind: PackageInstall - listKind: PackageInstallList - plural: packageinstalls - shortNames: - - pkgi - singular: packageinstall - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: PackageMetadata name - jsonPath: .spec.packageRef.refName - name: Package name - type: string - - description: PackageMetadata version - jsonPath: .status.version - name: Package version - type: string - - description: Friendly description - jsonPath: .status.friendlyDescription - name: Description - type: string - - description: Time since creation - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - canceled: - description: Canceled when set to true will stop all active changes - type: boolean - cluster: - properties: - kubeconfigSecretRef: - properties: - key: - type: string - name: - type: string - type: object - namespace: - type: string - type: object - noopDelete: - description: When NoopDelete set to true, PackageInstall deletion - should delete PackageInstall/App CR but preserve App's associated - resources. - type: boolean - packageRef: - properties: - refName: - type: string - versionSelection: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - paused: - description: Paused when set to true will ignore all pending changes, - once it set back to false, pending changes will be applied - type: boolean - serviceAccountName: - type: string - syncPeriod: - description: Controls frequency of App reconciliation in time + unit - format. Always >= 30s. If value below 30s is specified, 30s will - be used. - type: string - values: - items: - properties: - secretRef: - properties: - key: - type: string - name: - type: string - type: object - type: object - type: array - type: object - status: - properties: - conditions: - items: - description: TODO rename to Condition - properties: - message: - description: Human-readable message indicating details about - last transition. - type: string - reason: - description: Unique, this should be a short, machine understandable - string that gives the reason for condition's last transition. - If it reports "ResizeStarted" that means the underlying persistent - volume is being resized. - type: string - status: - type: string - type: - type: string - required: - - status - - type - type: object - type: array - friendlyDescription: - type: string - lastAttemptedVersion: - description: LastAttemptedVersion specifies what version was last - attempted to be installed. It does _not_ indicate it was successfully - installed. - type: string - observedGeneration: - format: int64 - type: integer - usefulErrorMessage: - type: string - version: - description: TODO this is desired resolved version (not actually deployed) - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - packaging.carvel.dev/global-namespace: kapp-controller-packaging-global - name: packagerepositories.packaging.carvel.dev -spec: - group: packaging.carvel.dev - names: - kind: PackageRepository - listKind: PackageRepositoryList - plural: packagerepositories - shortNames: - - pkgr - singular: packagerepository - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Time since creation - jsonPath: .metadata.creationTimestamp - name: Age - type: date - - description: Friendly description - jsonPath: .status.friendlyDescription - name: Description - type: string - name: v1alpha1 - schema: - openAPIV3Schema: - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - properties: - fetch: - properties: - git: - description: TODO implement git - properties: - lfsSkipSmudge: - type: boolean - ref: - type: string - refSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - secretRef: - description: 'Secret may include one or more keys: ssh-privatekey, - ssh-knownhosts' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - subPath: - type: string - url: - type: string - type: object - http: - properties: - secretRef: - description: 'Secret may include one or more keys: username, - password' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - sha256: - type: string - subPath: - type: string - url: - description: 'URL can point to one of following formats: text, - tgz, zip' - type: string - type: object - image: - properties: - secretRef: - description: 'Secret may include one or more keys: username, - password, token. By default anonymous access is used for - authentication. TODO support docker config formated secret' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - subPath: - type: string - tagSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - url: - description: 'Example: username/app1-config:v0.1.0' - type: string - type: object - imgpkgBundle: - properties: - image: - type: string - secretRef: - description: 'Secret may include one or more keys: username, - password, token. By default anonymous access is used for - authentication. TODO support docker config formated secret' - properties: - name: - description: Object is expected to be within same namespace - type: string - type: object - tagSelection: - properties: - semver: - properties: - constraints: - type: string - prereleases: - properties: - identifiers: - items: - type: string - type: array - type: object - type: object - type: object - type: object - type: object - paused: - description: Paused when set to true will ignore all pending changes, - once it set back to false, pending changes will be applied - type: boolean - syncPeriod: - description: Controls frequency of PackageRepository reconciliation - type: string - required: - - fetch - type: object - status: - properties: - conditions: - items: - description: TODO rename to Condition - properties: - message: - description: Human-readable message indicating details about - last transition. - type: string - reason: - description: Unique, this should be a short, machine understandable - string that gives the reason for condition's last transition. - If it reports "ResizeStarted" that means the underlying persistent - volume is being resized. - type: string - status: - type: string - type: - type: string - required: - - status - - type - type: object - type: array - consecutiveReconcileFailures: - type: integer - consecutiveReconcileSuccesses: - type: integer - deploy: - properties: - error: - type: string - exitCode: - type: integer - finished: - type: boolean - startedAt: - format: date-time - type: string - stderr: - type: string - stdout: - type: string - updatedAt: - format: date-time - type: string - type: object - fetch: - properties: - error: - type: string - exitCode: - type: integer - startedAt: - format: date-time - type: string - stderr: - type: string - stdout: - type: string - updatedAt: - format: date-time - type: string - type: object - friendlyDescription: - type: string - observedGeneration: - format: int64 - type: integer - template: - properties: - error: - type: string - exitCode: - type: integer - stderr: - type: string - updatedAt: - format: date-time - type: string - type: object - usefulErrorMessage: - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - annotations: - kapp-controller.carvel.dev/version: v0.30.1 - kbld.k14s.io/images: | - - origins: - - local: - path: /home/runner/work/carvel-kapp-controller/carvel-kapp-controller - - git: - dirty: false - remoteURL: https://github.com/vmware-tanzu/carvel-kapp-controller - sha: 7c57c00dd9f4b82a7a8252fa2e5316399bb2bf05 - url: ghcr.io/vmware-tanzu/carvel-kapp-controller@sha256:4141b93108b1f3431e786638a115a7e0876d756e7a13acfddd7aaa3bae41e202 - name: kapp-controller - namespace: kapp-controller -spec: - replicas: 1 - revisionHistoryLimit: 0 - selector: - matchLabels: - app: kapp-controller - template: - metadata: - labels: - app: kapp-controller - spec: - containers: - - args: - - -packaging-global-namespace=kapp-controller-packaging-global - env: - - name: KAPPCTRL_MEM_TMP_DIR - value: /etc/kappctrl-mem-tmp - - name: KAPPCTRL_SYSTEM_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: KAPPCTRL_API_PORT - value: "10350" - image: ghcr.io/vmware-tanzu/carvel-kapp-controller@sha256:4141b93108b1f3431e786638a115a7e0876d756e7a13acfddd7aaa3bae41e202 - name: kapp-controller - ports: - - containerPort: 10350 - name: api - protocol: TCP - resources: - requests: - cpu: 120m - memory: 100Mi - securityContext: - runAsGroup: 2000 - runAsUser: 1000 - volumeMounts: - - mountPath: /etc/kappctrl-mem-tmp - name: template-fs - securityContext: - fsGroup: 3000 - serviceAccount: kapp-controller-sa - volumes: - - emptyDir: - medium: Memory - name: template-fs ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: kapp-controller-sa - namespace: kapp-controller ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: kapp-controller-cluster-role -rules: -- apiGroups: - - "" - resources: - - secrets - verbs: - - create - - get - - list - - watch -- apiGroups: - - "" - resources: - - serviceaccounts - verbs: - - get -- apiGroups: - - kappctrl.k14s.io - resources: - - apps - - apps/status - verbs: - - '*' -- apiGroups: - - packaging.carvel.dev - resources: - - packageinstalls - - packageinstalls/status - verbs: - - '*' -- apiGroups: - - packaging.carvel.dev - resources: - - packagerepositories - - packagerepositories/status - verbs: - - '*' -- apiGroups: - - internal.packaging.carvel.dev - resources: - - internalpackagemetadatas - verbs: - - '*' -- apiGroups: - - data.packaging.carvel.dev - resources: - - packagemetadatas - - packagemetadatas/status - verbs: - - '*' -- apiGroups: - - internal.packaging.carvel.dev - resources: - - internalpackages - verbs: - - '*' -- apiGroups: - - data.packaging.carvel.dev - resources: - - packages - - packages/status - verbs: - - '*' -- apiGroups: - - "" - resources: - - configmaps - verbs: - - '*' -- apiGroups: - - apiregistration.k8s.io - resources: - - apiservices - verbs: - - update - - get -- apiGroups: - - "" - resources: - - namespaces - verbs: - - list - - watch - - get - - update -- apiGroups: - - admissionregistration.k8s.io - resources: - - mutatingwebhookconfigurations - verbs: - - list - - watch -- apiGroups: - - admissionregistration.k8s.io - resources: - - validatingwebhookconfigurations - verbs: - - list - - watch -- apiGroups: - - authorization.k8s.io - resources: - - subjectaccessreviews - verbs: - - create ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: kapp-controller-cluster-role-binding -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: kapp-controller-cluster-role -subjects: -- kind: ServiceAccount - name: kapp-controller-sa - namespace: kapp-controller ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: pkg-apiserver:system:auth-delegator -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: system:auth-delegator -subjects: -- kind: ServiceAccount - name: kapp-controller-sa - namespace: kapp-controller ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: pkgserver-auth-reader - namespace: kube-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: extension-apiserver-authentication-reader -subjects: -- kind: ServiceAccount - name: kapp-controller-sa - namespace: kapp-controller diff --git a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/values.star b/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/values.star deleted file mode 100644 index 6513841b39..0000000000 --- a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/values.star +++ /dev/null @@ -1,18 +0,0 @@ -load("@ytt:data", "data") - -#export -values = data.values -kappNamespace = "" -if hasattr(values.kappController, 'namespace') and values.kappController.namespace: - kappNamespace = values.kappController.namespace -else: - kappNamespace = values.namespace -end - -def generateBashCmdForDNS(coreDNSIP): - # This command added the coreDNS IP as the first entry of resolv.conf - # In this way, Kapp Controller will have cluster IP access, - # and still able to resolve enternal urls when core DNS is unavailable - - return "cp /etc/resolv.conf /etc/resolv.conf.bak; sed '1 i nameserver " + coreDNSIP + "' /etc/resolv.conf.bak > /etc/resolv.conf; rm /etc/resolv.conf.bak; cp -R /etc/* /kapp-etc; chmod g+w /kapp-etc/pki/tls/certs/ca-bundle.crt && chgrp 2000 /kapp-etc/pki/tls/certs/ca-bundle.crt" -end diff --git a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/values.yaml b/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/values.yaml deleted file mode 100644 index 75071657e1..0000000000 --- a/providers/yttcc/vendir/kapp-controller/_ytt_lib/addons/packages/kapp-controller/0.30.1/bundle/config/values.yaml +++ /dev/null @@ -1,23 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -namespace: kapp-controller -kappController: - namespace: null - createNamespace: true - globalNamespace: tanzu-package-repo-global - deployment: - #! The coreDNSIP will be injected into /etc/resolv.conf of kapp-controller pod - coreDNSIP: null - hostNetwork: false - priorityClassName: null - concurrency: 4 - tolerations: [] - apiPort: 10350 - metricsBindAddress: ":8080" - config: - caCerts: "" - httpProxy: "" - httpsProxy: "" - noProxy: "" - dangerousSkipTLSVerify: "" diff --git a/providers/yttcc/vendir/kapp-controller/kapp-controller.lib.yaml b/providers/yttcc/vendir/kapp-controller/kapp-controller.lib.yaml deleted file mode 100644 index 16f608655d..0000000000 --- a/providers/yttcc/vendir/kapp-controller/kapp-controller.lib.yaml +++ /dev/null @@ -1,3 +0,0 @@ -#@ load("@ytt:library", "library") - -#@ kapp_controller_lib = library.get("addons/packages/kapp-controller/0.30.1/bundle/config") diff --git a/test/cli/mock/plugin-alt/corge/README.md b/test/cli/mock/plugin-alt/corge/README.md deleted file mode 100644 index 2bd493bd7b..0000000000 --- a/test/cli/mock/plugin-alt/corge/README.md +++ /dev/null @@ -1 +0,0 @@ -# Mock plugin \ No newline at end of file diff --git a/test/cli/mock/plugin-alt/corge/main.go b/test/cli/mock/plugin-alt/corge/main.go deleted file mode 100644 index 2729b8f0c2..0000000000 --- a/test/cli/mock/plugin-alt/corge/main.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "corge", - Description: "Corge commands", - Version: "v0.0.3", - Group: cliapi.BuildCmdGroup, -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/test/cli/mock/plugin-alt/corge/test/main.go b/test/cli/mock/plugin-alt/corge/test/main.go deleted file mode 100644 index 629ca51f0a..0000000000 --- a/test/cli/mock/plugin-alt/corge/test/main.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("corge") - -func main() { - defer Cleanup() - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} - -// Cleanup the test. -func Cleanup() {} diff --git a/test/cli/mock/plugin-alt/qux/README.md b/test/cli/mock/plugin-alt/qux/README.md deleted file mode 100644 index 2bd493bd7b..0000000000 --- a/test/cli/mock/plugin-alt/qux/README.md +++ /dev/null @@ -1 +0,0 @@ -# Mock plugin \ No newline at end of file diff --git a/test/cli/mock/plugin-alt/qux/main.go b/test/cli/mock/plugin-alt/qux/main.go deleted file mode 100644 index 4571119e1d..0000000000 --- a/test/cli/mock/plugin-alt/qux/main.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "qux", - Description: "Qux commands", - Version: "v0.0.3", - Group: cliapi.BuildCmdGroup, -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/test/cli/mock/plugin-alt/qux/test/main.go b/test/cli/mock/plugin-alt/qux/test/main.go deleted file mode 100644 index 6ff469c3da..0000000000 --- a/test/cli/mock/plugin-alt/qux/test/main.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("qux") - -func main() { - defer Cleanup() - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} - -// Cleanup the test. -func Cleanup() {} diff --git a/test/cli/mock/plugin-new/bar/README.md b/test/cli/mock/plugin-new/bar/README.md deleted file mode 100644 index 2bd493bd7b..0000000000 --- a/test/cli/mock/plugin-new/bar/README.md +++ /dev/null @@ -1 +0,0 @@ -# Mock plugin \ No newline at end of file diff --git a/test/cli/mock/plugin-new/bar/main.go b/test/cli/mock/plugin-new/bar/main.go deleted file mode 100644 index e0723d858e..0000000000 --- a/test/cli/mock/plugin-new/bar/main.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "bar", - Description: "Bar commands", - Version: "v0.0.3", - Group: cliapi.BuildCmdGroup, -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/test/cli/mock/plugin-new/bar/test/main.go b/test/cli/mock/plugin-new/bar/test/main.go deleted file mode 100644 index 705b6fd1c2..0000000000 --- a/test/cli/mock/plugin-new/bar/test/main.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("bar") - -func main() { - defer Cleanup() - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} - -// Cleanup the test. -func Cleanup() {} diff --git a/test/cli/mock/plugin-new/baz/README.md b/test/cli/mock/plugin-new/baz/README.md deleted file mode 100644 index 2bd493bd7b..0000000000 --- a/test/cli/mock/plugin-new/baz/README.md +++ /dev/null @@ -1 +0,0 @@ -# Mock plugin \ No newline at end of file diff --git a/test/cli/mock/plugin-new/baz/main.go b/test/cli/mock/plugin-new/baz/main.go deleted file mode 100644 index 369ac0fa5d..0000000000 --- a/test/cli/mock/plugin-new/baz/main.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "baz", - Description: "Baz commands", - Version: "v0.0.4", - Group: cliapi.ManageCmdGroup, -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/test/cli/mock/plugin-new/baz/test/main.go b/test/cli/mock/plugin-new/baz/test/main.go deleted file mode 100644 index 8bbe28b672..0000000000 --- a/test/cli/mock/plugin-new/baz/test/main.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("baz") - -func main() { - defer Cleanup() - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} - -// Cleanup the test. -func Cleanup() {} diff --git a/test/cli/mock/plugin-new/foo/README.md b/test/cli/mock/plugin-new/foo/README.md deleted file mode 100644 index 2bd493bd7b..0000000000 --- a/test/cli/mock/plugin-new/foo/README.md +++ /dev/null @@ -1 +0,0 @@ -# Mock plugin \ No newline at end of file diff --git a/test/cli/mock/plugin-new/foo/main.go b/test/cli/mock/plugin-new/foo/main.go deleted file mode 100644 index eda2a43c6d..0000000000 --- a/test/cli/mock/plugin-new/foo/main.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "foo", - Description: "Foo commands", - Version: "v0.0.3", - Group: cliapi.BuildCmdGroup, -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/test/cli/mock/plugin-new/foo/test/main.go b/test/cli/mock/plugin-new/foo/test/main.go deleted file mode 100644 index 9dcad81c27..0000000000 --- a/test/cli/mock/plugin-new/foo/test/main.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("foo") - -func main() { - defer Cleanup() - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} - -// Cleanup the test. -func Cleanup() {} diff --git a/test/cli/mock/plugin-old/bar/README.md b/test/cli/mock/plugin-old/bar/README.md deleted file mode 100644 index 2bd493bd7b..0000000000 --- a/test/cli/mock/plugin-old/bar/README.md +++ /dev/null @@ -1 +0,0 @@ -# Mock plugin \ No newline at end of file diff --git a/test/cli/mock/plugin-old/bar/main.go b/test/cli/mock/plugin-old/bar/main.go deleted file mode 100644 index 236bee76f6..0000000000 --- a/test/cli/mock/plugin-old/bar/main.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "bar", - Description: "Bar commands", - Version: "v0.0.2", - Group: cliapi.BuildCmdGroup, -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/test/cli/mock/plugin-old/bar/test/main.go b/test/cli/mock/plugin-old/bar/test/main.go deleted file mode 100644 index 705b6fd1c2..0000000000 --- a/test/cli/mock/plugin-old/bar/test/main.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("bar") - -func main() { - defer Cleanup() - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} - -// Cleanup the test. -func Cleanup() {} diff --git a/test/cli/mock/plugin-old/baz/README.md b/test/cli/mock/plugin-old/baz/README.md deleted file mode 100644 index 2bd493bd7b..0000000000 --- a/test/cli/mock/plugin-old/baz/README.md +++ /dev/null @@ -1 +0,0 @@ -# Mock plugin \ No newline at end of file diff --git a/test/cli/mock/plugin-old/baz/main.go b/test/cli/mock/plugin-old/baz/main.go deleted file mode 100644 index 29d134090b..0000000000 --- a/test/cli/mock/plugin-old/baz/main.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "baz", - Description: "Baz commands", - Version: "v0.0.3", - Group: cliapi.ManageCmdGroup, -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/test/cli/mock/plugin-old/baz/test/main.go b/test/cli/mock/plugin-old/baz/test/main.go deleted file mode 100644 index 8bbe28b672..0000000000 --- a/test/cli/mock/plugin-old/baz/test/main.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("baz") - -func main() { - defer Cleanup() - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} - -// Cleanup the test. -func Cleanup() {} diff --git a/test/cli/mock/plugin-old/foo/README.md b/test/cli/mock/plugin-old/foo/README.md deleted file mode 100644 index 2bd493bd7b..0000000000 --- a/test/cli/mock/plugin-old/foo/README.md +++ /dev/null @@ -1 +0,0 @@ -# Mock plugin \ No newline at end of file diff --git a/test/cli/mock/plugin-old/foo/main.go b/test/cli/mock/plugin-old/foo/main.go deleted file mode 100644 index abf1bc7dfb..0000000000 --- a/test/cli/mock/plugin-old/foo/main.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "github.com/aunum/log" - - cliapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/cli/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" -) - -var descriptor = cliapi.PluginDescriptor{ - Name: "foo", - Description: "Foo commands", - Version: "v0.0.1", - Group: cliapi.BuildCmdGroup, -} - -func main() { - p, err := plugin.NewPlugin(&descriptor) - if err != nil { - log.Fatal(err) - } - if err := p.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/test/cli/mock/plugin-old/foo/test/main.go b/test/cli/mock/plugin-old/foo/test/main.go deleted file mode 100644 index 9dcad81c27..0000000000 --- a/test/cli/mock/plugin-old/foo/test/main.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "log" - "os" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/plugin" - clitest "github.com/vmware-tanzu/tanzu-framework/cli/runtime/test" -) - -var descriptor = clitest.NewTestFor("foo") - -func main() { - defer Cleanup() - p, err := plugin.NewPlugin(descriptor) - if err != nil { - log.Fatal(err) - } - p.Cmd.RunE = test - if err := p.Execute(); err != nil { - os.Exit(1) - } -} - -func test(c *cobra.Command, _ []string) error { - return nil -} - -// Cleanup the test. -func Cleanup() {} diff --git a/test/pkg/go.mod b/test/pkg/go.mod deleted file mode 100644 index 2b9899de77..0000000000 --- a/test/pkg/go.mod +++ /dev/null @@ -1,22 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/test/pkg - -go 1.18 - -require ( - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.19.0 - github.com/vmware-labs/yaml-jsonpath v0.3.2 - gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e - k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 -) - -require ( - github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 // indirect - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/nxadm/tail v1.4.8 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect -) diff --git a/test/pkg/go.sum b/test/pkg/go.sum deleted file mode 100644 index 2141875765..0000000000 --- a/test/pkg/go.sum +++ /dev/null @@ -1,116 +0,0 @@ -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/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960 h1:aRd8M7HJVZOqn/vhOzrGcQH0lNAMkqMn+pXUYkatmcA= -github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -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/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= -github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -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/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -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-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -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/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.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e h1:3i3ny04XV6HbZ2N1oIBw1UBYATHAOpo4tfTF83JM3Z0= -gopkg.in/yaml.v3 v3.0.0-20220521103104-8f96da9f5d5e/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= diff --git a/test/pkg/matchers/matchers_suite_test.go b/test/pkg/matchers/matchers_suite_test.go deleted file mode 100644 index e175db77de..0000000000 --- a/test/pkg/matchers/matchers_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package matchers - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestUnit(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Matchers Suite") -} diff --git a/test/pkg/matchers/yaml_path_matchers.go b/test/pkg/matchers/yaml_path_matchers.go deleted file mode 100644 index f3daa6e97a..0000000000 --- a/test/pkg/matchers/yaml_path_matchers.go +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package matchers provides custom gomega matchers for tests. -package matchers - -import ( - "fmt" - "reflect" - "regexp" - - "github.com/vmware-labs/yaml-jsonpath/pkg/yamlpath" - "gopkg.in/yaml.v3" - - "github.com/onsi/gomega/format" - "github.com/onsi/gomega/matchers" - "github.com/onsi/gomega/types" -) - -type pathWithValue struct { - path *yamlpath.Path - value string -} - -// FindDocsMatchingYAMLPath finds yaml documents that match all paths with values provided. -func FindDocsMatchingYAMLPath(yamlString string, pathsWithValues map[string]string) ([]string, error) { - re := regexp.MustCompile("(?m)^---$") - docStrings := re.Split(yamlString, -1) - - var yamlPathWithValues []pathWithValue - for path, value := range pathsWithValues { - newPath, err := yamlpath.NewPath(path) - if err != nil { - return nil, fmt.Errorf("invalid yaml path %q err: %s", path, err) - } - yamlPathWithValues = append(yamlPathWithValues, pathWithValue{newPath, value}) - } - - var docsToReturn []string - for _, doc := range docStrings { - var node yaml.Node - err := yaml.Unmarshal([]byte(doc), &node) - if err != nil { - fmt.Println(doc) - return nil, err - } - - if matchesAllPaths(&node, yamlPathWithValues) { - docsToReturn = append(docsToReturn, fmt.Sprintf("---%s", doc)) - } - } - return docsToReturn, nil -} - -func matchesAllPaths(node *yaml.Node, pathWithValues []pathWithValue) bool { - for _, pathWithValue := range pathWithValues { - results, err := pathWithValue.path.Find(node) - if err != nil { - panic("Find currently never returns an error, if we're getting this we need to handle these") - } - - if len(results) == 0 { - return false - } - - for _, result := range results { - if result.Value != pathWithValue.value { - return false - } - } - } - return true -} - -// HaveYAMLPath searches the *first* document in actual for a path -func HaveYAMLPath(path string) types.GomegaMatcher { - return &HaveYAMLPathMatcher{ - Path: path, - } -} - -// HaveYAMLPathMatcher is the matcher returned by HaveYAMLPath. -type HaveYAMLPathMatcher struct { - Path string -} - -// Match returns true and no error if actual has a matching path, else it -// returns false. -func (matcher *HaveYAMLPathMatcher) Match(actual interface{}) (bool, error) { - if actual == nil { - return false, nil - } - - if reflect.TypeOf(actual).Kind() != reflect.String { - return false, fmt.Errorf("matcher HaveYAMLPathWithValue expects a string. Got: %s", format.Object(actual, 1)) - } - - yamlString := reflect.ValueOf(actual).String() - - var node yaml.Node - err := yaml.Unmarshal([]byte(yamlString), &node) - if err != nil { - return false, fmt.Errorf("matcher HaveYAMLPathWithValue failed to unmarshal actual yaml with:\n%s%s", format.Indent, err.Error()) - } - - path, err := yamlpath.NewPath(matcher.Path) - if err != nil { - return false, fmt.Errorf("matcher HaveYAMLPathWithValue failed with:\n%s%s", format.Indent, err.Error()) - } - - q, err := path.Find(&node) - if err != nil { // this should never occur, according to current path.Find documentation - return false, fmt.Errorf("matcher HaveYAMLPathWithValue failed with:\n%s%s", format.Indent, err.Error()) - } - - return len(q) > 0, nil -} - -// FailureMessage returns a human-readable failure message if Match returns false. -func (matcher *HaveYAMLPathMatcher) FailureMessage(actual interface{}) string { - message := fmt.Sprintf("at path %q to exist\n", matcher.Path) - return format.Message(actual, message) -} - -// NegatedFailureMessage returns a human-readable negated failure message when NotTo Match fails. -func (matcher *HaveYAMLPathMatcher) NegatedFailureMessage(actual interface{}) string { - message := fmt.Sprintf("at path %q not to exist\n", matcher.Path) - return format.Message(actual, message) -} - -// HaveYAMLPathWithValue searches the *first* document in actual for a path with value. -func HaveYAMLPathWithValue(path string, value interface{}) types.GomegaMatcher { - return &HaveYAMLPathWithValueMatcher{ - Path: path, - Value: value, - } -} - -// HaveYAMLPathWithValueMatcher is the Matcher returned by HaveYAMLPathWithValue. -type HaveYAMLPathWithValueMatcher struct { - Path string - Value interface{} - actualValue interface{} -} - -// Match returns true and no error if actual has a matching path with value, -// else it returns false. -func (matcher *HaveYAMLPathWithValueMatcher) Match(actual interface{}) (bool, error) { - if actual == nil { - return false, nil - } - - if reflect.TypeOf(actual).Kind() != reflect.String { - return false, fmt.Errorf("matcher HaveYAMLPathWithValue expects a string. Got: %s", format.Object(actual, 1)) - } - - valueMatcher := &matchers.EqualMatcher{Expected: matcher.Value} - - yamlString := reflect.ValueOf(actual).String() - - var node yaml.Node - err := yaml.Unmarshal([]byte(yamlString), &node) - if err != nil { - return false, fmt.Errorf("matcher HaveYAMLPathWithValue failed to unmarshal actual yaml with:\n%s%s", format.Indent, err.Error()) - } - - path, err := yamlpath.NewPath(matcher.Path) - if err != nil { - return false, fmt.Errorf("matcher HaveYAMLPathWithValue failed with:\n%s%s", format.Indent, err.Error()) - } - - q, err := path.Find(&node) - if err != nil { // this should never occur, according to current path.Find documentation - return false, fmt.Errorf("matcher HaveYAMLPathWithValue failed with:\n%s%s", format.Indent, err.Error()) - } - - if len(q) != 1 { - return false, fmt.Errorf("matcher HaveYAMLPathWithValue expected to find one node at path %q, found: %d node(s)", matcher.Path, len(q)) - } - matcher.actualValue = q[0].Value - - success, err := valueMatcher.Match(q[0].Value) - if err != nil { - return false, fmt.Errorf("matcher HaveYAMLPathWithValue failed with:\n%s%s", format.Indent, err.Error()) - } - - return success, nil -} - -// FailureMessage returns a human-readable failure message if Match returns false. -func (matcher *HaveYAMLPathWithValueMatcher) FailureMessage(actual interface{}) string { - message := fmt.Sprintf("at path %q to have value\n%s\nGot:", matcher.Path, format.Object(matcher.Value, 1)) - return format.Message(actual, message, matcher.actualValue) -} - -// NegatedFailureMessage returns a human-readable negated failure message when NotTo Match fails. -func (matcher *HaveYAMLPathWithValueMatcher) NegatedFailureMessage(actual interface{}) string { - message := fmt.Sprintf("at path %q not to have value\n%s\nGot:", matcher.Path, format.Object(matcher.Value, 1)) - return format.Message(actual, message, matcher.actualValue) -} diff --git a/test/pkg/matchers/yaml_path_matchers_test.go b/test/pkg/matchers/yaml_path_matchers_test.go deleted file mode 100644 index 4690f2f150..0000000000 --- a/test/pkg/matchers/yaml_path_matchers_test.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package matchers - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var _ = Describe("FindDocsMatchingYAMLPath", func() { - It("finds the doc matching the supplied path", func() { - docs := `--- -foo: bar ---- -baz: bing ---- -blarg: thing -` - nodes, err := FindDocsMatchingYAMLPath(docs, map[string]string{ - "$.baz": "bing", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(nodes).To(HaveLen(1)) - Expect(nodes[0]).To(Equal(`--- -baz: bing -`)) - }) - - It("finds multiple docs matching the supplied path", func() { - docs := `--- -foo: bar ---- -baz: bing ---- -foo: bar -` - nodes, err := FindDocsMatchingYAMLPath(docs, map[string]string{ - "$.foo": "bar", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(nodes).To(HaveLen(2)) - Expect(nodes[0]).To(Equal(`--- -foo: bar -`)) - Expect(nodes[1]).To(Equal(`--- -foo: bar -`)) - }) - - It("finds doc matching multiple supplied paths", func() { - docs := `--- -foo: bar -namespace: a ---- -baz: bing ---- -foo: bar -namespace: b -` - nodes, err := FindDocsMatchingYAMLPath(docs, map[string]string{ - "$.foo": "bar", - "$.namespace": "b", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(nodes).To(HaveLen(1)) - Expect(nodes[0]).To(Equal(`--- -foo: bar -namespace: b -`)) - }) - - It("returns an error when given an invalid yaml path", func() { - docs := `--- -foo: bar -namespace: a -` - _, err := FindDocsMatchingYAMLPath(docs, map[string]string{ - "foo bar": "bar", - }) - Expect(err).To(MatchError("invalid yaml path \"foo bar\" err: invalid character ' ' at position 3, following \"foo\"")) - }) - - Describe("a path describes multiple nodes", func() { - When("all found nodes match value", func() { - It("returns the doc", func() { - docs := `--- -a: - foo: bar -b: - foo: bar -` - nodes, err := FindDocsMatchingYAMLPath(docs, map[string]string{ - "$..foo": "bar", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(nodes).To(HaveLen(1)) - Expect(nodes[0]).To(Equal(`--- -a: - foo: bar -b: - foo: bar -`)) - }) - }) - - When("all found nodes do not match value", func() { - It("does not return the doc", func() { - docs := `--- -a: - foo: bar -b: - foo: baz -` - nodes, err := FindDocsMatchingYAMLPath(docs, map[string]string{ - "$..foo": "bar", - }) - Expect(err).NotTo(HaveOccurred()) - Expect(nodes).To(HaveLen(0)) - }) - }) - }) -}) diff --git a/tkg/Makefile b/tkg/Makefile deleted file mode 100644 index 1c2e274c6d..0000000000 --- a/tkg/Makefile +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -ROOT_DIR := $(shell git rev-parse --show-toplevel) -MODULE_ROOT_DIR := $(ROOT_DIR)/tkg - -# Golang specific variables -GOOS ?= $(shell go env GOOS) -GOARCH ?= $(shell go env GOARCH) -GOHOSTOS ?= $(shell go env GOHOSTOS) -GOHOSTARCH ?= $(shell go env GOHOSTARCH) -# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) -ifeq (,$(shell go env GOBIN)) -GOBIN=$(shell go env GOPATH)/bin -else -GOBIN=$(shell go env GOBIN) -endif -GO := go - -# Directories -TOOLS_DIR := $(abspath $(MODULE_ROOT_DIR)/hack/tools) -TOOLS_BIN_DIR := $(TOOLS_DIR)/bin - -# Add tooling binaries here and in hack/tools/Makefile -GOIMPORTS := $(TOOLS_BIN_DIR)/goimports -TOOLING_BINARIES := $(GOIMPORTS) - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help (default) - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[0-9a-zA-Z_-]+:.*?##/ { printf " \033[36m%-28s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m\033[32m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -## -------------------------------------- -## All -## -------------------------------------- - -.PHONY: all -all: test ## Tests the library - -## -------------------------------------- -## Testing -## -------------------------------------- - -.PHONY: test -test: fmt vet ## Run Tests - ${GO} test -timeout 60m -coverprofile coverage.txt -v `go list ./... | grep -Ev '(github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl)'` - -.PHONY: vet -vet: ## Vet codebase - ${GO} vet ./... - -fmt: $(GOIMPORTS) ## Run goimports - $(GOIMPORTS) -w -local github.com/vmware-tanzu ./ - -## -------------------------------------- -## Tooling Binaries -## -------------------------------------- - -tools: $(TOOLING_BINARIES) ## Build tooling binaries -.PHONY: $(TOOLING_BINARIES) -$(TOOLING_BINARIES): - make -C $(TOOLS_DIR) $(@F) - -## -------------------------------------- -##@ Generate files -## -------------------------------------- - -COUNTERFEITER := $(TOOLS_BIN_DIR)/counterfeiter -$(COUNTERFEITER): $(TOOLS_BIN_DIR) - $(GO) build -tags=tools -o $@ github.com/maxbrunsfeld/counterfeiter/v6 - -generate-fakes: $(COUNTERFEITER) ## Generate fakes for unit tests - PATH=$(TOOLS_BIN_DIR):"$(PATH)" $(GO) generate ./... - $(MAKE) fmt diff --git a/tkg/api/providers/v1alpha1/groupversion_info.go b/tkg/api/providers/v1alpha1/groupversion_info.go deleted file mode 100644 index 1e844d37bb..0000000000 --- a/tkg/api/providers/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 ... -// +kubebuilder:object:generate=true -// +groupName=providers.tanzu.vmware.com -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "providers.tanzu.vmware.com", Version: "v1alpha1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/tkg/api/providers/v1alpha1/templatedefinition_types.go b/tkg/api/providers/v1alpha1/templatedefinition_types.go deleted file mode 100644 index e6f9495e5c..0000000000 --- a/tkg/api/providers/v1alpha1/templatedefinition_types.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// PathInfo contains path information -type PathInfo struct { - Path string `json:"path" yaml:"path"` - FileMark string `json:"filemark,omitempty" yaml:"filemark,omitempty"` -} - -// TemplateDefinitionSpec defines state of template definition file and path information -type TemplateDefinitionSpec struct { - Paths []PathInfo `json:"paths" yaml:"paths"` -} - -// +kubebuilder:object:root=true - -// TemplateDefinition is a schema for template definition file -type TemplateDefinition struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec TemplateDefinitionSpec `json:"spec,omitempty"` -} - -func init() { - SchemeBuilder.Register(&TemplateDefinition{}) -} diff --git a/tkg/api/providers/v1alpha1/zz_generated.deepcopy.go b/tkg/api/providers/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 5d579c2e4e..0000000000 --- a/tkg/api/providers/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PathInfo) DeepCopyInto(out *PathInfo) { - *out = *in -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PathInfo. -func (in *PathInfo) DeepCopy() *PathInfo { - if in == nil { - return nil - } - out := new(PathInfo) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TemplateDefinition) DeepCopyInto(out *TemplateDefinition) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Spec.DeepCopyInto(&out.Spec) -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateDefinition. -func (in *TemplateDefinition) DeepCopy() *TemplateDefinition { - if in == nil { - return nil - } - out := new(TemplateDefinition) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *TemplateDefinition) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *TemplateDefinitionSpec) DeepCopyInto(out *TemplateDefinitionSpec) { - *out = *in - if in.Paths != nil { - in, out := &in.Paths, &out.Paths - *out = make([]PathInfo, len(*in)) - copy(*out, *in) - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateDefinitionSpec. -func (in *TemplateDefinitionSpec) DeepCopy() *TemplateDefinitionSpec { - if in == nil { - return nil - } - out := new(TemplateDefinitionSpec) - in.DeepCopyInto(out) - return out -} diff --git a/tkg/api/tmc/v1alpha1/groupversion_info.go b/tkg/api/tmc/v1alpha1/groupversion_info.go deleted file mode 100644 index 3c1748f16d..0000000000 --- a/tkg/api/tmc/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 ... -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/scheme" -) - -var ( - // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "clusters.tmc.cloud.vmware.com", Version: "v1alpha1"} - - // SchemeBuilder is used to add go types to the GroupVersionKind scheme - SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} - - // AddToScheme adds the types in this group-version to the given scheme. - AddToScheme = SchemeBuilder.AddToScheme -) diff --git a/tkg/api/tmc/v1alpha1/tmc_extension_types.go b/tkg/api/tmc/v1alpha1/tmc_extension_types.go deleted file mode 100644 index 236a4f14fa..0000000000 --- a/tkg/api/tmc/v1alpha1/tmc_extension_types.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package v1alpha1 ... -package v1alpha1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// ExtensionSpec defines the desired state of Extension -type ExtensionSpec struct { - Version string `json:"version"` - - Name string `json:"name"` - - // +optional - Description string `json:"description,omitempty"` - - // Raw JSON/YAML of extension equivalent to kubernetes 'Unstructured' type. - Objects string `json:"objects"` -} - -// +genclient -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// Extension is the Schema for the extensions API -// +k8s:openapi-gen=true -// +kubebuilder:subresource:status -type Extension struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` - - Spec ExtensionSpec `json:"spec,omitempty"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// ExtensionList contains a list of Extension -type ExtensionList struct { - metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` - Items []Extension `json:"items"` -} - -func init() { - SchemeBuilder.Register(&Extension{}, &ExtensionList{}) -} diff --git a/tkg/api/tmc/v1alpha1/zz_generated.deepcopy.go b/tkg/api/tmc/v1alpha1/zz_generated.deepcopy.go deleted file mode 100644 index 62b261589b..0000000000 --- a/tkg/api/tmc/v1alpha1/zz_generated.deepcopy.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by controller-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Extension) DeepCopyInto(out *Extension) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - out.Spec = in.Spec -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Extension. -func (in *Extension) DeepCopy() *Extension { - if in == nil { - return nil - } - out := new(Extension) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *Extension) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ExtensionList) DeepCopyInto(out *ExtensionList) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ListMeta.DeepCopyInto(&out.ListMeta) - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]Extension, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtensionList. -func (in *ExtensionList) DeepCopy() *ExtensionList { - if in == nil { - return nil - } - out := new(ExtensionList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ExtensionList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} diff --git a/tkg/auth/doc.go b/tkg/auth/doc.go deleted file mode 100644 index 5eb7de0c2d..0000000000 --- a/tkg/auth/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package auth provides TKG authentication functions. -package auth diff --git a/tkg/auth/kube_config.go b/tkg/auth/kube_config.go deleted file mode 100644 index 994153d20b..0000000000 --- a/tkg/auth/kube_config.go +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright 2021-2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package auth - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "os" - "path/filepath" - "time" - - "github.com/pkg/errors" - "k8s.io/client-go/discovery" - clientauthenticationv1beta1 "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" - tkgclient "github.com/vmware-tanzu/tanzu-framework/tkg/client" - tkgutils "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -const ( - // ConciergeAuthenticatorType is the pinniped concierge authenticator type - ConciergeAuthenticatorType = "jwt" - - // ConciergeAuthenticatorName is the pinniped concierge authenticator object name - ConciergeAuthenticatorName = "tkg-jwt-authenticator" - - // PinnipedOIDCScopes are the scopes of pinniped oidc - PinnipedOIDCScopes = "offline_access,openid,pinniped:request-audience" - - // TanzuLocalKubeDir is the local config directory - TanzuLocalKubeDir = ".kube-tanzu" - - // TanzuKubeconfigFile is the name the of the kubeconfig file - TanzuKubeconfigFile = "config" - - // DefaultPinnipedLoginTimeout is the default login timeout - DefaultPinnipedLoginTimeout = time.Minute - - // DefaultClusterInfoConfigMap is the default ConfigMap looked up in the kube-public namespace when generating a kubeconfig. - DefaultClusterInfoConfigMap = "cluster-info" -) - -// KubeConfigOptions contains the kubeconfig options -type KubeConfigOptions struct { - MergeFilePath string -} - -// A DiscoveryStrategy contains information about how various discovery -// information should be looked up from an endpoint when setting up a -// kubeconfig. -type DiscoveryStrategy struct { - DiscoveryPort *int - ClusterInfoConfigMap string -} - -// KubeconfigWithPinnipedAuthLoginPlugin prepares the kubeconfig with tanzu pinniped-auth login as client-go exec plugin -func KubeconfigWithPinnipedAuthLoginPlugin(endpoint string, options *KubeConfigOptions, discoveryStrategy DiscoveryStrategy) (mergeFilePath, currentContext string, err error) { - clusterInfo, err := tkgutils.GetClusterInfoFromCluster(endpoint, discoveryStrategy.ClusterInfoConfigMap) - if err != nil { - err = errors.Wrap(err, "failed to get cluster-info") - return - } - - pinnipedInfo, err := tkgutils.GetPinnipedInfoFromCluster(clusterInfo, discoveryStrategy.DiscoveryPort) - if err != nil { - err = errors.Wrap(err, "failed to get pinniped-info") - return - } - - if pinnipedInfo == nil { - err = errors.New("failed to get pinniped-info from cluster") - return - } - - config, err := GetPinnipedKubeconfig(clusterInfo, pinnipedInfo, pinnipedInfo.ClusterName, pinnipedInfo.Issuer) - if err != nil { - err = errors.Wrap(err, "unable to get the kubeconfig") - return - } - - kubeconfigBytes, err := json.Marshal(config) - if err != nil { - err = errors.Wrap(err, "unable to marshall the kubeconfig") - return - } - - mergeFilePath = "" - if options != nil && options.MergeFilePath != "" { - mergeFilePath = options.MergeFilePath - } else { - mergeFilePath, err = TanzuLocalKubeConfigPath() - if err != nil { - err = errors.Wrap(err, "unable to get the Tanzu local kubeconfig path") - return - } - } - - err = tkgclient.MergeKubeConfigWithoutSwitchContext(kubeconfigBytes, mergeFilePath) - if err != nil { - err = errors.Wrap(err, "unable to merge cluster kubeconfig to the Tanzu local kubeconfig path") - return - } - currentContext = config.CurrentContext - return mergeFilePath, currentContext, err -} - -// GetServerKubernetesVersion uses the kubeconfig to get the server k8s version. -func GetServerKubernetesVersion(kubeconfigPath, context string) (string, error) { - var discoveryClient discovery.DiscoveryInterface - kubeConfigBytes, err := loadKubeconfigAndEnsureContext(kubeconfigPath, context) - if err != nil { - return "", errors.Errorf("unable to read kubeconfig") - } - - restConfig, err := clientcmd.RESTConfigFromKubeConfig(kubeConfigBytes) - if err != nil { - return "", errors.Errorf("Unable to set up rest config due to : %v", err) - } - // set the timeout to give user sufficient time to enter the login credentials - restConfig.Timeout = DefaultPinnipedLoginTimeout - - discoveryClient, err = discovery.NewDiscoveryClientForConfig(restConfig) - if err != nil { - return "", errors.Errorf("Error getting discovery client due to : %v", err) - } - - if _, err := discoveryClient.ServerVersion(); err != nil { - return "", errors.Errorf("Failed to invoke API on cluster : %v", err) - } - - return "", nil -} - -func loadKubeconfigAndEnsureContext(kubeConfigPath, context string) ([]byte, error) { - config, err := clientcmd.LoadFromFile(kubeConfigPath) - - if err != nil { - return []byte{}, err - } - if context != "" { - config.CurrentContext = context - } - - return clientcmd.Write(*config) -} - -// GetPinnipedKubeconfig generate kubeconfig given cluster-info and pinniped-info and the requested audience -func GetPinnipedKubeconfig(cluster *clientcmdapi.Cluster, pinnipedInfo *pinnipedinfo.PinnipedInfo, clustername, audience string) (*clientcmdapi.Config, error) { - execConfig := clientcmdapi.ExecConfig{ - APIVersion: clientauthenticationv1beta1.SchemeGroupVersion.String(), - Args: []string{}, - Env: []clientcmdapi.ExecEnvVar{}, - } - - execConfig.Command = "tanzu" - execConfig.Args = append([]string{"pinniped-auth", "login"}, execConfig.Args...) - - conciergeEndpoint := cluster.Server - if pinnipedInfo.ConciergeEndpoint != "" { - conciergeEndpoint = pinnipedInfo.ConciergeEndpoint - } - - // configure concierge - execConfig.Args = append(execConfig.Args, - "--enable-concierge", - "--concierge-authenticator-name="+ConciergeAuthenticatorName, - "--concierge-authenticator-type="+ConciergeAuthenticatorType, - "--concierge-endpoint="+conciergeEndpoint, - "--concierge-ca-bundle-data="+base64.StdEncoding.EncodeToString(cluster.CertificateAuthorityData), - "--issuer="+pinnipedInfo.Issuer, // configure OIDC - "--scopes="+PinnipedOIDCScopes, - "--ca-bundle-data="+pinnipedInfo.IssuerCABundleData, - "--request-audience="+audience, - ) - - if os.Getenv("TANZU_CLI_PINNIPED_AUTH_LOGIN_SKIP_BROWSER") != "" { - execConfig.Args = append(execConfig.Args, "--skip-browser") - } - - username := "tanzu-cli-" + clustername - contextName := fmt.Sprintf("%s@%s", username, clustername) - - return &clientcmdapi.Config{ - Kind: "Config", - APIVersion: clientcmdapi.SchemeGroupVersion.Version, - Clusters: map[string]*clientcmdapi.Cluster{clustername: cluster}, - AuthInfos: map[string]*clientcmdapi.AuthInfo{username: {Exec: &execConfig}}, - Contexts: map[string]*clientcmdapi.Context{contextName: {Cluster: clustername, AuthInfo: username}}, - CurrentContext: contextName, - }, nil -} - -// TanzuLocalKubeConfigPath returns the local tanzu kubeconfig path -func TanzuLocalKubeConfigPath() (path string, err error) { - home, err := os.UserHomeDir() - if err != nil { - return path, errors.Wrap(err, "could not locate local tanzu dir") - } - path = filepath.Join(home, TanzuLocalKubeDir) - // create tanzu kubeconfig directory - if _, err := os.Stat(path); os.IsNotExist(err) { - err = os.MkdirAll(path, 0755) - if err != nil { - return "", err - } - } else if err != nil { - return "", err - } - - configFilePath := filepath.Join(path, TanzuKubeconfigFile) - - return configFilePath, nil -} diff --git a/tkg/auth/kube_config_test.go b/tkg/auth/kube_config_test.go deleted file mode 100644 index 4a1ab1d7f3..0000000000 --- a/tkg/auth/kube_config_test.go +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package auth_test - -import ( - "crypto/x509" - "encoding/base64" - "encoding/pem" - "fmt" - "net/http" - "os" - "path/filepath" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/ghttp" - clientauthenticationv1beta1 "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" - tkgauth "github.com/vmware-tanzu/tanzu-framework/tkg/auth" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" -) - -var testingDir string - -func TestTkgAuth(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Tkg Auth Suite") -} - -var _ = Describe("Unit tests for tkg auth", func() { - var ( - err error - endpoint string - tlsserver *ghttp.Server - servCert *x509.Certificate - ) - - const ( - clustername = "fake-cluster" - issuer = "https://fakeissuer.com" - issuerCA = "fakeCAData" - ) - - Describe("Kubeconfig for Management cluster", func() { - BeforeEach(func() { - tlsserver = ghttp.NewTLSServer() - servCert = tlsserver.HTTPTestServer.Certificate() - endpoint = tlsserver.URL() - err = createTempDirectory("kubeconfig-test") - Expect(err).ToNot(HaveOccurred()) - }) - AfterEach(func() { - tlsserver.Close() - deleteTempDirectory() - }) - Context("When the configMap 'cluster-info' is not present in kube-public namespace", func() { - BeforeEach(func() { - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - _, _, err = tkgauth.KubeconfigWithPinnipedAuthLoginPlugin(endpoint, nil, tkgauth.DiscoveryStrategy{ClusterInfoConfigMap: tkgauth.DefaultClusterInfoConfigMap}) - }) - It("should return the error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("failed to get cluster-info")) - }) - }) - Context("When the configMap 'pinniped-info' is not present in kube-public namespace", func() { - BeforeEach(func() { - clusterInfo := GetFakeClusterInfo(endpoint, servCert) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusOK, clusterInfo), - ), - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - _, _, err = tkgauth.KubeconfigWithPinnipedAuthLoginPlugin(endpoint, nil, tkgauth.DiscoveryStrategy{ClusterInfoConfigMap: tkgauth.DefaultClusterInfoConfigMap}) - }) - It("should return the error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("failed to get pinniped-info")) - }) - }) - Context("When the configMap 'pinniped-info' is present in kube-public namespace", func() { - var kubeConfigPath, kubeContext, kubeconfigMergeFilePath string - BeforeEach(func() { - var clusterInfo, pinnipedInfo string - clusterInfo = GetFakeClusterInfo(endpoint, servCert) - pinnipedInfo = helper.GetFakePinnipedInfo( - pinnipedinfo.PinnipedInfo{ - ClusterName: clustername, - Issuer: issuer, - IssuerCABundleData: issuerCA, - }) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusOK, clusterInfo), - ), - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusOK, pinnipedInfo), - ), - ) - kubeconfigMergeFilePath = testingDir + "/config" - options := &tkgauth.KubeConfigOptions{ - MergeFilePath: kubeconfigMergeFilePath, - } - kubeConfigPath, kubeContext, err = tkgauth.KubeconfigWithPinnipedAuthLoginPlugin(endpoint, options, tkgauth.DiscoveryStrategy{ClusterInfoConfigMap: tkgauth.DefaultClusterInfoConfigMap}) - }) - It("should generate the kubeconfig and merge the kubeconfig to given path", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(kubeConfigPath).Should(Equal(kubeconfigMergeFilePath)) - Expect(len(kubeContext)).Should(Not(Equal(0))) - config, err := clientcmd.LoadFromFile(kubeConfigPath) - Expect(err).ToNot(HaveOccurred()) - gotClusterName := config.Contexts[kubeContext].Cluster - cluster := config.Clusters[config.Contexts[kubeContext].Cluster] - user := config.AuthInfos[config.Contexts[kubeContext].AuthInfo] - Expect(cluster.Server).To(Equal(endpoint)) - Expect(gotClusterName).To(Equal(clustername)) - expectedExecConf := getExpectedExecConfig(endpoint, issuer, issuerCA, servCert) - Expect(*user.Exec).To(Equal(*expectedExecConf)) - }) - }) - Describe("Get Tanzu local Kubeconfig path", func() { - var localPath string - Context("When TanzuLocalKubeConfigPath() is called", func() { - BeforeEach(func() { - localPath, err = tkgauth.TanzuLocalKubeConfigPath() - }) - It("should return the tanzu local kubeconfig path", func() { - Expect(err).ToNot(HaveOccurred()) - home, err := os.UserHomeDir() - Expect(err).ToNot(HaveOccurred()) - Expect(localPath).Should(Equal(filepath.Join(home, tkgauth.TanzuLocalKubeDir, tkgauth.TanzuKubeconfigFile))) - }) - }) - }) - - }) -}) - -func GetFakeClusterInfo(server string, cert *x509.Certificate) string { - clusterInfoJSON := ` - { - "kind": "ConfigMap", - "apiVersion": "v1", - "data": { - "kubeconfig": "apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: %s\n server: %s\n name: \"\"\ncontexts: null\ncurrent-context: \"\"\nkind: Config\npreferences: {}\nusers: null\n" - }, - "metadata": { - "name": "cluster-info", - "namespace": "kube-public" - } - }` - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: cert.Raw}) - clusterInfoJSON = fmt.Sprintf(clusterInfoJSON, base64.StdEncoding.EncodeToString(certBytes), server) - - return clusterInfoJSON -} - -func getExpectedExecConfig(endpoint string, issuer string, issuerCA string, servCert *x509.Certificate) *clientcmdapi.ExecConfig { - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - args := []string{ - "pinniped-auth", "login", - "--enable-concierge", - "--concierge-authenticator-name=" + tkgauth.ConciergeAuthenticatorName, - "--concierge-authenticator-type=" + tkgauth.ConciergeAuthenticatorType, - "--concierge-endpoint=" + endpoint, - "--concierge-ca-bundle-data=" + base64.StdEncoding.EncodeToString(certBytes), - "--issuer=" + issuer, - "--scopes=" + tkgauth.PinnipedOIDCScopes, - "--ca-bundle-data=" + issuerCA, - "--request-audience=" + issuer, - } - - execConfig := &clientcmdapi.ExecConfig{ - APIVersion: clientauthenticationv1beta1.SchemeGroupVersion.String(), - Args: args, - Env: []clientcmdapi.ExecEnvVar{}, - Command: "tanzu", - InteractiveMode: "IfAvailable", - } - return execConfig -} - -func createTempDirectory(prefix string) error { - var err error - testingDir, err = os.MkdirTemp("", prefix) - if err != nil { - fmt.Println("Error TempDir: ", err.Error()) - return err - } - return nil -} -func deleteTempDirectory() { - os.Remove(testingDir) -} diff --git a/tkg/avi/client.go b/tkg/avi/client.go deleted file mode 100644 index ee9cfbfb80..0000000000 --- a/tkg/avi/client.go +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package avi - -import ( - "crypto/tls" - "crypto/x509" - "net/http" - "strconv" - "strings" - "time" - - "github.com/avinetworks/sdk/go/clients" - "github.com/avinetworks/sdk/go/models" - "github.com/avinetworks/sdk/go/session" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - avi_models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// AviSessionTimeout is timeout for avi session -const AviSessionTimeout = 60 -const pageSizeMax = "200" -const aviDefaultTenant = "admin" // Per TKG-5862 -// TODO:(xudongl) avi min support version need to be review and update for each TKG release -const aviMinSupportVersion = "21.1.5" // 2.2.0 min supported AVI controller version - -type client struct { - ControllerParams *avi_models.AviControllerParams - Cloud MiniCloudClient - ServiceEngineGroup MiniServiceEngineGroupClient - Network MiniNetworkClient -} - -// New creates an AVI controller REST API client -func New() Client { - return &client{ - ControllerParams: nil, - Cloud: nil, - ServiceEngineGroup: nil, - Network: nil, - } -} - -// VerifyAccount verifies if the credentials are correct -// It also setup the Cloud and SerivceEngineGroup services for later use -// upon a successful authentication -func (c *client) VerifyAccount(params *avi_models.AviControllerParams) (bool, error) { - var aviClient *clients.AviClient - var err error - - if params.CAData == "" { - aviClient, err = clients.NewAviClient(params.Host, params.Username, - session.SetPassword(params.Password), - session.SetTenant(aviDefaultTenant)) - } else { - var transport *http.Transport - caCertPool := x509.NewCertPool() - caCertPool.AppendCertsFromPEM([]byte(params.CAData)) - transport = &http.Transport{ - TLSClientConfig: &tls.Config{ //nolint:gosec - RootCAs: caCertPool, - }, - } - - options := []func(*session.AviSession) error{ - session.SetPassword(params.Password), - session.SetTenant(aviDefaultTenant), - session.SetControllerStatusCheckLimits(1, 1), - session.DisableControllerStatusCheckOnFailure(true), - session.SetTimeout(AviSessionTimeout * time.Second), - session.SetTransport(transport), - } - - aviClient, err = clients.NewAviClient(params.Host, params.Username, options...) - } - - if err != nil { - return false, errors.Wrap(err, "unable to create API client using the credentials provided") - } - - apiVersion, err := aviClient.AviSession.GetControllerVersion() - if err != nil { - return false, errors.Wrap(err, "unable to get API version") - } - - if utils.CompareVersions(apiVersion, "<", aviMinSupportVersion) { - return false, errors.Errorf("current TKG version is not supported for the Avi version %s, Avi must be %s or more", apiVersion, aviMinSupportVersion) - } - - SetVersion := session.SetVersion(apiVersion) - if err := SetVersion(aviClient.AviSession); err != nil { - return false, errors.Wrap(err, "unable to set API version") - } - - c.ControllerParams = params - c.Cloud = aviClient.Cloud - c.ServiceEngineGroup = aviClient.ServiceEngineGroup - c.Network = aviClient.Network - - return true, nil -} - -// GetClouds retrieves a cloud list from AVI controller through the REST API -// This function depends on the presence of "Cloud" service that is -// made available upon authentication with a Avi controller. -func (c *client) GetClouds() ([]*avi_models.AviCloud, error) { - if c.Cloud == nil { - return nil, errors.Errorf("unable to make API calls before authentication") - } - - var page = 1 - clouds := make([]*avi_models.AviCloud, 0) - for { - all, err := c.Cloud.GetAll(session.SetParams(map[string]string{"fields": "name,uuid", "page": strconv.Itoa(page), "page_size": pageSizeMax})) - if err != nil { - if page == 1 { - return nil, errors.Wrap(err, "unable to get all clouds from avi controller due to error") - } - break // end of result set reached - } - - for _, c := range all { - clouds = append(clouds, &avi_models.AviCloud{ - UUID: *c.UUID, - Name: *c.Name, - Location: *c.URL, - }) - } - - page++ - } - - return clouds, nil -} - -// GetServiceEngineGroups retrieves a Service Engine Group list from AVI controller through the REST API -// This function depends on the presence of "ServiceEngineGroup" service that is -// made available upon authentication with a Avi controller. -func (c *client) GetServiceEngineGroups() ([]*avi_models.AviServiceEngineGroup, error) { - if c.ServiceEngineGroup == nil { - return nil, errors.Errorf("unable to make API calls before authentication") - } - - var page = 1 - serviceEngineGroups := make([]*avi_models.AviServiceEngineGroup, 0) - - for { - all, err := c.ServiceEngineGroup.GetAll(session.SetParams(map[string]string{"fields": "name,uuid,cloud_ref", "page": strconv.Itoa(page), "page_size": pageSizeMax})) - if err != nil { - if page == 1 { - return nil, errors.Wrap(err, "unable to get all Service Engine Groups from avi controller due to error") - } - break - } - - for _, seg := range all { - serviceEngineGroups = append(serviceEngineGroups, &avi_models.AviServiceEngineGroup{ - UUID: *seg.UUID, - Name: *seg.Name, - Location: c.getCloudID(*seg.CloudRef), - }) - } - - page++ - } - return serviceEngineGroups, nil -} - -// GetVipNetworks retrieves a Service Engine Group list from AVI controller through the REST API -// This function depends on the presence of "ServiceEngineGroup" service that is -// made available upon authentication with a Avi controller. -func (c *client) GetVipNetworks() ([]*avi_models.AviVipNetwork, error) { - if c.Network == nil { - return nil, errors.Errorf("unable to make API calls before authentication") - } - - var page = 1 - networks := make([]*avi_models.AviVipNetwork, 0) - for { - all, err := c.Network.GetAll(session.SetParams(map[string]string{"fields": "name,uuid,cloud_ref,configured_subnets", "page": strconv.Itoa(page), "page_size": pageSizeMax})) - if err != nil { - if page == 1 { - return nil, errors.Wrap(err, "unable to get all Networks from avi controller due to error") - } - break - } - - for _, seg := range all { - subnets := make([]*avi_models.AviSubnet, 0) - for _, temp := range seg.ConfiguredSubnets { - subnets = append(subnets, &avi_models.AviSubnet{ - Subnet: *temp.Prefix.IPAddr.Addr + "/" + strconv.Itoa(int(*temp.Prefix.Mask)), - Family: *temp.Prefix.IPAddr.Type, - }) - } - - network := &avi_models.AviVipNetwork{ - UUID: *seg.UUID, - Name: *seg.Name, - Cloud: c.getCloudID(*seg.CloudRef), - ConfigedSubnets: subnets, - } - - networks = append(networks, network) - } - - page++ - } - return networks, nil -} - -func (c *client) GetCloudByName(name string) (*models.Cloud, error) { - return c.Cloud.GetByName(name) -} - -func (c *client) GetServiceEngineGroupByName(name string) (*models.ServiceEngineGroup, error) { - return c.ServiceEngineGroup.GetByName(name) -} - -func (c *client) GetVipNetworkByName(name string) (*models.Network, error) { - return c.Network.GetByName(name) -} - -// getCloudID extracts the cloud UUID from the cloudRef string, -// which would be in the format of "https://10.78.115.106/api/cloud/cloud-e8b6d313-ecac-40f8-b38c-440e84c6d731", -// whereas the last part of the URL is the cloud UUID that the Service Engine Group belongs to. -// cloudRef is guarrantted to to be a valid string as indicated below when called in the context. -func (c *client) getCloudID(cloudRef string) string { - parts := strings.Split(cloudRef, "/") - return parts[len(parts)-1] -} diff --git a/tkg/avi/client_integration_test.go b/tkg/avi/client_integration_test.go deleted file mode 100644 index 7b6e1ecf68..0000000000 --- a/tkg/avi/client_integration_test.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package avi - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - avi_models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -var realClient Client - -// TestClient tests the methods of a Client object -func TestRealClient(t *testing.T) { - RegisterFailHandler(Fail) - realClient = New() - RunSpecs(t, "AVI Integration Test") -} - -var _ = Describe("AVI Real Client", func() { - - BeforeEach(func() { - Skip("Skip integration tests for AVI client ") - }) - - Describe("Verify credentials", func() { - Context("When incorrect credentials provided", func() { - It("should fail", func() { - cp := &avi_models.AviControllerParams{ - Username: "admin", - Password: "CHANGE_BEFORE_USE", - Host: "10.92.195.49", - Tenant: "admin", - } - - authend, err := realClient.VerifyAccount(cp) - Expect(err).To(HaveOccurred()) - Expect(authend).To(BeFalse()) - }) - }) - - Context("When correct credentials provided", func() { - It("should succeed", func() { - cp := &avi_models.AviControllerParams{ - Username: "admin", - Password: "CHANGE_BEFORE_USE", - Host: "10.92.195.49", - Tenant: "admin", - } - - authend, err := realClient.VerifyAccount(cp) - Expect(err).ToNot(HaveOccurred()) - Expect(authend).To(BeTrue()) - }) - }) - - Context("When correct credentials inand correct CA data provided", func() { - It("should fail", func() { - cp := &avi_models.AviControllerParams{ - Username: "admin", - Password: "CHANGE_BEFORE_USE", - Host: "10.92.195.49", - Tenant: "admin", - CAData: `-----BEGIN CERTIFICATE----- -MIICxjCCAa6gAwIBAgITXtXf4r9uE4SvqdBVzxII1DF/0zANBgkqhkiG9w0BAQsF -ADATMREwDwYDVQQDDAhlMmUtdGVzdDAeFw0yMTAyMjUyMTIxMTRaFw0yMjAyMjUy -MTIxMTRaMBMxETAPBgNVBAMMCGUyZS10ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAreSdOowJ6cNwhPGz1juzNQlTv6ky1bwpg0hrhOUBoPZpBrFp -XbfIVOXabXOAEHzmsM9QjEk1ly+IcgC/zlAz8ej3y2Ww5n6ApdpYgNIsM/27Z8Cs -l/3w1pS5fTYxQiSEIOm4f9C6GAgDYx3TNRA8K1DCqR5OlvkR47sTrP8wCGl9UloK -HuS3ooHq/EctfbmbgPBC5kOh7zmUlRij2dbHElwTaQo+M0rdLkyfsQV2age362Ud -a2NnlMA2TXarXt9HVIdptu88BEWx0hcFopG+6Wb7Rv7ual2lKP7puksSIe7BlyVI -mkNiaSEGNZjbPcZuvCvS+jKgcJCDmUnLMZ+YmwIDAQABoxMwETAPBgNVHREECDAG -hwQKwSerMA0GCSqGSIb3DQEBCwUAA4IBAQA1OC8V84j7bghh8VnJgAUdcScf7nEw -Mov7lBeTgoFGL5oMSCcwlYZXZidOfXfkxmaM0jGxu3DEGgp8XAk0MU8+YtKivG8e -FRAjDPLaOja0FBk52EvgGxDTCKafLnXOMB8/MHDe3gQw5NoJv+wEdU8wnmubgTxR -U2pTZ8EsCsv1l+neJ3oZiPsYhVgV4rw+uM7I5744JTOQCukZsBgoFVppfodjXWU1 -SEEDY/GmvD0f1Q7i1Sewxoiuxv1e/ZI6oTQEQ6w+xSYlaV4wcCIiN3nJg77VuCKr -S7PlMtE24mmPhGhgoZ1kK8dCsXz66WcvPX7HMzDz041SgvbBQVKLQZ/p ------END CERTIFICATE----- -`, - } - - authend, err := realClient.VerifyAccount(cp) - Expect(err).To(HaveOccurred()) - Expect(authend).To(BeFalse()) - }) - }) - - Context("When correct credentials and CA data provided", func() { - It("should succeed", func() { - cp := &avi_models.AviControllerParams{ - Username: "admin", - Password: "CHANGE_BEFORE_USE", - Host: "10.92.195.49", - Tenant: "admin", - CAData: `-----BEGIN CERTIFICATE----- -MIICvzCCAaegAwIBAgIUENYz/IDqKKPkI6XWROAfUTv7lpgwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEdGVzdDAeFw0yMTA1MjEwMzUxMTJaFw0yMjA1MjEwMzUx -MTJaMA8xDTALBgNVBAMMBHRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQDEZQGJjCqy6ISLiIkr8OmiRBLSzQ8+fXRfzs/0UFMy47m7Bsdc+H8H+XRU -AsPdawJ0SaTzNFFas5URqjKO1iN6GgB+L1ivn8BAJoOGHeqcf684rPFtoSOfIvDi -FXiX0uJOC8czkG/iYSxmy0WWic8AOTwyINt0Ospjg/wwK1KZRJVB75lgQfkd3zT9 -iTeUMlG/rk+UWC2+OHImoL37sbg7c2hVH14QNoyb0T45TNpE1q2k6+8p104WHxbk -xbRDSIgfdupTPSjZIi+Mq5YbMCGsMCxm3uI12dh0kIAhNHC48/1IB69CB2Ks4qQb -kX1w2WoWINVl0hajFT2qZEwqRopJAgMBAAGjEzARMA8GA1UdEQQIMAaHBApcwzEw -DQYJKoZIhvcNAQELBQADggEBAMNj3piaZqawx7kBGv8Vew6LXFgVHO/zoX9d+/x0 -sPgMqgX3rMs+RNtPT7bJvsYtrMF0KeVujv7Opx/bQfH38DCt7IhGRt+q+C+3mMV8 -eao8j94vw3dkQ6476pJG6HaGqN0l0ADWZIpDpwWbgauzrnhMCUVDU5FAVy4xFt3u -dsDJ0l3mDTDDv1O3VFxB/CaQCfVT+gGmoK7xd+cFVRdJF3MCtqGK4UwaIjejHJk0 -vejPF4Eq7ue7B2NJREhAJjyeM22AS7EYfUVHOJzDdLWEFF3HGFJaO2LX0TnkSAts -NZl6xLnQEOlZzdx0Eq2ElNgPwxMRfrysU8Q+MusiMCRxMeE= ------END CERTIFICATE-----`, - } - - authend, err := realClient.VerifyAccount(cp) - Expect(err).ToNot(HaveOccurred()) - Expect(authend).To(BeTrue()) - }) - }) - }) - - Describe("APIs", func() { - BeforeEach(func() { - cp := &avi_models.AviControllerParams{ - Username: "admin", - Password: "CHANGE_BEFORE_USE", - Host: "10.92.195.49", - Tenant: "admin", - CAData: `-----BEGIN CERTIFICATE----- -MIICvzCCAaegAwIBAgIUENYz/IDqKKPkI6XWROAfUTv7lpgwDQYJKoZIhvcNAQEL -BQAwDzENMAsGA1UEAwwEdGVzdDAeFw0yMTA1MjEwMzUxMTJaFw0yMjA1MjEwMzUx -MTJaMA8xDTALBgNVBAMMBHRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQDEZQGJjCqy6ISLiIkr8OmiRBLSzQ8+fXRfzs/0UFMy47m7Bsdc+H8H+XRU -AsPdawJ0SaTzNFFas5URqjKO1iN6GgB+L1ivn8BAJoOGHeqcf684rPFtoSOfIvDi -FXiX0uJOC8czkG/iYSxmy0WWic8AOTwyINt0Ospjg/wwK1KZRJVB75lgQfkd3zT9 -iTeUMlG/rk+UWC2+OHImoL37sbg7c2hVH14QNoyb0T45TNpE1q2k6+8p104WHxbk -xbRDSIgfdupTPSjZIi+Mq5YbMCGsMCxm3uI12dh0kIAhNHC48/1IB69CB2Ks4qQb -kX1w2WoWINVl0hajFT2qZEwqRopJAgMBAAGjEzARMA8GA1UdEQQIMAaHBApcwzEw -DQYJKoZIhvcNAQELBQADggEBAMNj3piaZqawx7kBGv8Vew6LXFgVHO/zoX9d+/x0 -sPgMqgX3rMs+RNtPT7bJvsYtrMF0KeVujv7Opx/bQfH38DCt7IhGRt+q+C+3mMV8 -eao8j94vw3dkQ6476pJG6HaGqN0l0ADWZIpDpwWbgauzrnhMCUVDU5FAVy4xFt3u -dsDJ0l3mDTDDv1O3VFxB/CaQCfVT+gGmoK7xd+cFVRdJF3MCtqGK4UwaIjejHJk0 -vejPF4Eq7ue7B2NJREhAJjyeM22AS7EYfUVHOJzDdLWEFF3HGFJaO2LX0TnkSAts -NZl6xLnQEOlZzdx0Eq2ElNgPwxMRfrysU8Q+MusiMCRxMeE= ------END CERTIFICATE-----`, - } - - _, err := realClient.VerifyAccount(cp) - - if err != nil { - panic(err) - } - }) - - It("should return a valid Client object", func() { - Expect(realClient).ToNot(BeNil()) - }) - - It("should return a collection of Cloud", func() { - clouds, err := realClient.GetClouds() - Expect(err).ToNot(HaveOccurred()) - Expect(len(clouds)).ToNot(Equal(0)) - }) - - It("should return a collection of Service Engine Group", func() { - segs, err := realClient.GetServiceEngineGroups() - Expect(err).ToNot(HaveOccurred()) - Expect(len(segs)).ToNot(Equal(0)) - }) - - It("should return a collection of Vip networks", func() { - vipNets, err := realClient.GetVipNetworks() - Expect(err).ToNot(HaveOccurred()) - Expect(len(vipNets)).ToNot(Equal(0)) - }) - - }) - -}) diff --git a/tkg/avi/interface.go b/tkg/avi/interface.go deleted file mode 100644 index fb4c44763d..0000000000 --- a/tkg/avi/interface.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package avi defines client to connect to the avi server -package avi - -import ( - "github.com/avinetworks/sdk/go/models" - "github.com/avinetworks/sdk/go/session" - - avi_models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// Client defines methods to access AVI controller via its REST API -type Client interface { - VerifyAccount(params *avi_models.AviControllerParams) (bool, error) - GetClouds() ([]*avi_models.AviCloud, error) - GetServiceEngineGroups() ([]*avi_models.AviServiceEngineGroup, error) - GetVipNetworks() ([]*avi_models.AviVipNetwork, error) - - GetCloudByName(name string) (*models.Cloud, error) - GetServiceEngineGroupByName(name string) (*models.ServiceEngineGroup, error) - GetVipNetworkByName(name string) (*models.Network, error) -} - -// MiniCloudClient defines a subset of the methods implemented by Cloud -type MiniCloudClient interface { - GetAll(options ...session.ApiOptionsParams) ([]*models.Cloud, error) - GetByName(name string, options ...session.ApiOptionsParams) (*models.Cloud, error) -} - -// MiniServiceEngineGroupClient defines a subset of the methods implemented by Cloud -type MiniServiceEngineGroupClient interface { - GetAll(options ...session.ApiOptionsParams) ([]*models.ServiceEngineGroup, error) - GetByName(name string, options ...session.ApiOptionsParams) (*models.ServiceEngineGroup, error) -} - -// MiniNetworkClient defines a subset of the methods implemented by Network -type MiniNetworkClient interface { - GetAll(options ...session.ApiOptionsParams) ([]*models.Network, error) - GetByName(name string, options ...session.ApiOptionsParams) (*models.Network, error) -} diff --git a/tkg/avi/mocks/mock_client.go b/tkg/avi/mocks/mock_client.go deleted file mode 100644 index f32e14fbbb..0000000000 --- a/tkg/avi/mocks/mock_client.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/vmware-tanzu/tanzu-framework/tkg/avi (interfaces: Client) - -// Package avi is a generated GoMock package. -package avi - -import ( - reflect "reflect" - - models "github.com/avinetworks/sdk/go/models" - gomock "github.com/golang/mock/gomock" - - models0 "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// MockClient is a mock of Client interface -type MockClient struct { - ctrl *gomock.Controller - recorder *MockClientMockRecorder -} - -// MockClientMockRecorder is the mock recorder for MockClient -type MockClientMockRecorder struct { - mock *MockClient -} - -// NewMockClient creates a new mock instance -func NewMockClient(ctrl *gomock.Controller) *MockClient { - mock := &MockClient{ctrl: ctrl} - mock.recorder = &MockClientMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use -func (m *MockClient) EXPECT() *MockClientMockRecorder { - return m.recorder -} - -// VerifyAccount mocks base method -func (m *MockClient) VerifyAccount(params *models0.AviControllerParams) (bool, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "VerifyAccount", params) - ret0, _ := ret[0].(bool) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// VerifyAccount indicates an expected call of VerifyAccount -func (mr *MockClientMockRecorder) VerifyAccount(params interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "VerifyAccount", reflect.TypeOf((*MockClient)(nil).VerifyAccount), params) -} - -// GetClouds mocks base method -func (m *MockClient) GetClouds() ([]*models0.AviCloud, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetClouds") - ret0, _ := ret[0].([]*models0.AviCloud) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetClouds indicates an expected call of GetClouds -func (mr *MockClientMockRecorder) GetClouds() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetClouds", reflect.TypeOf((*MockClient)(nil).GetClouds)) -} - -// GetServiceEngineGroups mocks base method -func (m *MockClient) GetServiceEngineGroups() ([]*models0.AviServiceEngineGroup, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetServiceEngineGroups") - ret0, _ := ret[0].([]*models0.AviServiceEngineGroup) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetServiceEngineGroups indicates an expected call of GetServiceEngineGroups -func (mr *MockClientMockRecorder) GetServiceEngineGroups() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetServiceEngineGroups", reflect.TypeOf((*MockClient)(nil).GetServiceEngineGroups)) -} - -// GetVipNetworks mocks base method -func (m *MockClient) GetVipNetworks() ([]*models0.AviVipNetwork, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetVipNetworks") - ret0, _ := ret[0].([]*models0.AviVipNetwork) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetVipNetworks indicates an expected call of GetVipNetworks -func (mr *MockClientMockRecorder) GetVipNetworks() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVipNetworks", reflect.TypeOf((*MockClient)(nil).GetVipNetworks)) -} - -// GetCloudByName mocks base method -func (m *MockClient) GetCloudByName(name string) (*models.Cloud, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetCloudByName", name) - ret0, _ := ret[0].(*models.Cloud) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetCloudByName indicates an expected call of GetCloudByName -func (mr *MockClientMockRecorder) GetCloudByName(name interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCloudByName", reflect.TypeOf((*MockClient)(nil).GetCloudByName), name) -} - -// GetServiceEngineGroupByName mocks base method -func (m *MockClient) GetServiceEngineGroupByName(name string) (*models.ServiceEngineGroup, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetServiceEngineGroupByName", name) - ret0, _ := ret[0].(*models.ServiceEngineGroup) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetServiceEngineGroupByName indicates an expected call of GetServiceEngineGroupByName -func (mr *MockClientMockRecorder) GetServiceEngineGroupByName(name interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetServiceEngineGroupByName", reflect.TypeOf((*MockClient)(nil).GetServiceEngineGroupByName), name) -} - -// GetVipNetworkByName mocks base method -func (m *MockClient) GetVipNetworkByName(name string) (*models.Network, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetVipNetworkByName", name) - ret0, _ := ret[0].(*models.Network) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetVipNetworkByName indicates an expected call of GetVipNetworkByName -func (mr *MockClientMockRecorder) GetVipNetworkByName(name interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVipNetworkByName", reflect.TypeOf((*MockClient)(nil).GetVipNetworkByName), name) -} diff --git a/tkg/avi/mocks/mock_mini_cloud_client.go b/tkg/avi/mocks/mock_mini_cloud_client.go deleted file mode 100644 index 47f7eae466..0000000000 --- a/tkg/avi/mocks/mock_mini_cloud_client.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/vmware-tanzu/tanzu-framework/tkg/avi (interfaces: MiniCloudClient) - -// Package avi is a generated GoMock package. -package avi - -import ( - reflect "reflect" - - models "github.com/avinetworks/sdk/go/models" - session "github.com/avinetworks/sdk/go/session" - gomock "github.com/golang/mock/gomock" -) - -// MockMiniCloudClient is a mock of MiniCloudClient interface -type MockMiniCloudClient struct { - ctrl *gomock.Controller - recorder *MockMiniCloudClientMockRecorder -} - -// MockMiniCloudClientMockRecorder is the mock recorder for MockMiniCloudClient -type MockMiniCloudClientMockRecorder struct { - mock *MockMiniCloudClient -} - -// NewMockMiniCloudClient creates a new mock instance -func NewMockMiniCloudClient(ctrl *gomock.Controller) *MockMiniCloudClient { - mock := &MockMiniCloudClient{ctrl: ctrl} - mock.recorder = &MockMiniCloudClientMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use -func (m *MockMiniCloudClient) EXPECT() *MockMiniCloudClientMockRecorder { - return m.recorder -} - -// GetAll mocks base method -func (m *MockMiniCloudClient) GetAll(arg0 ...session.ApiOptionsParams) ([]*models.Cloud, error) { - m.ctrl.T.Helper() - varargs := []interface{}{} - for _, a := range arg0 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetAll", varargs...) - ret0, _ := ret[0].([]*models.Cloud) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetAll indicates an expected call of GetAll -func (mr *MockMiniCloudClientMockRecorder) GetAll(arg0 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAll", reflect.TypeOf((*MockMiniCloudClient)(nil).GetAll), arg0...) -} - -// GetByName mocks base method -func (m *MockMiniCloudClient) GetByName(name string, options ...session.ApiOptionsParams) (*models.Cloud, error) { - m.ctrl.T.Helper() - varargs := []interface{}{name} - for _, a := range options { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetByName", varargs...) - ret0, _ := ret[0].(*models.Cloud) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetByName indicates an expected call of GetByName -func (mr *MockMiniCloudClientMockRecorder) GetByName(name interface{}, options ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{name}, options...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByName", reflect.TypeOf((*MockMiniCloudClient)(nil).GetByName), varargs...) -} diff --git a/tkg/avi/mocks/mock_mini_network_client.go b/tkg/avi/mocks/mock_mini_network_client.go deleted file mode 100644 index d8c2613265..0000000000 --- a/tkg/avi/mocks/mock_mini_network_client.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/vmware-tanzu/tanzu-framework/tkg/avi (interfaces: MiniNetworkClient) - -// Package avi is a generated GoMock package. -package avi - -import ( - reflect "reflect" - - models "github.com/avinetworks/sdk/go/models" - session "github.com/avinetworks/sdk/go/session" - gomock "github.com/golang/mock/gomock" -) - -// MockMiniNetworkClient is a mock of MiniNetworkClient interface -type MockMiniNetworkClient struct { - ctrl *gomock.Controller - recorder *MockMiniNetworkClientMockRecorder -} - -// MockMiniNetworkClientMockRecorder is the mock recorder for MockMiniNetworkClient -type MockMiniNetworkClientMockRecorder struct { - mock *MockMiniNetworkClient -} - -// NewMockMiniNetworkClient creates a new mock instance -func NewMockMiniNetworkClient(ctrl *gomock.Controller) *MockMiniNetworkClient { - mock := &MockMiniNetworkClient{ctrl: ctrl} - mock.recorder = &MockMiniNetworkClientMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use -func (m *MockMiniNetworkClient) EXPECT() *MockMiniNetworkClientMockRecorder { - return m.recorder -} - -// GetAll mocks base method -func (m *MockMiniNetworkClient) GetAll(arg0 ...session.ApiOptionsParams) ([]*models.Network, error) { - m.ctrl.T.Helper() - varargs := []interface{}{} - for _, a := range arg0 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetAll", varargs...) - ret0, _ := ret[0].([]*models.Network) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetAll indicates an expected call of GetAll -func (mr *MockMiniNetworkClientMockRecorder) GetAll(arg0 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAll", reflect.TypeOf((*MockMiniNetworkClient)(nil).GetAll), arg0...) -} - -// GetByName mocks base method -func (m *MockMiniNetworkClient) GetByName(name string, options ...session.ApiOptionsParams) (*models.Network, error) { - m.ctrl.T.Helper() - varargs := []interface{}{name} - for _, a := range options { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetByName", varargs...) - ret0, _ := ret[0].(*models.Network) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetByName indicates an expected call of GetByName -func (mr *MockMiniNetworkClientMockRecorder) GetByName(name interface{}, options ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{name}, options...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByName", reflect.TypeOf((*MockMiniNetworkClient)(nil).GetByName), varargs...) -} diff --git a/tkg/avi/mocks/mock_mini_service_engine_client.go b/tkg/avi/mocks/mock_mini_service_engine_client.go deleted file mode 100644 index f5954c0f84..0000000000 --- a/tkg/avi/mocks/mock_mini_service_engine_client.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/vmware-tanzu/tanzu-framework/tkg/avi (interfaces: MiniServiceEngineGroupClient) - -// Package avi is a generated GoMock package. -package avi - -import ( - reflect "reflect" - - models "github.com/avinetworks/sdk/go/models" - session "github.com/avinetworks/sdk/go/session" - gomock "github.com/golang/mock/gomock" -) - -// MockMiniServiceEngineGroupClient is a mock of MiniServiceEngineGroupClient interface -type MockMiniServiceEngineGroupClient struct { - ctrl *gomock.Controller - recorder *MockMiniServiceEngineGroupClientMockRecorder -} - -// MockMiniServiceEngineGroupClientMockRecorder is the mock recorder for MockMiniServiceEngineGroupClient -type MockMiniServiceEngineGroupClientMockRecorder struct { - mock *MockMiniServiceEngineGroupClient -} - -// NewMockMiniServiceEngineGroupClient creates a new mock instance -func NewMockMiniServiceEngineGroupClient(ctrl *gomock.Controller) *MockMiniServiceEngineGroupClient { - mock := &MockMiniServiceEngineGroupClient{ctrl: ctrl} - mock.recorder = &MockMiniServiceEngineGroupClientMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use -func (m *MockMiniServiceEngineGroupClient) EXPECT() *MockMiniServiceEngineGroupClientMockRecorder { - return m.recorder -} - -// GetAll mocks base method -func (m *MockMiniServiceEngineGroupClient) GetAll(arg0 ...session.ApiOptionsParams) ([]*models.ServiceEngineGroup, error) { - m.ctrl.T.Helper() - varargs := []interface{}{} - for _, a := range arg0 { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetAll", varargs...) - ret0, _ := ret[0].([]*models.ServiceEngineGroup) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetAll indicates an expected call of GetAll -func (mr *MockMiniServiceEngineGroupClientMockRecorder) GetAll(arg0 ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAll", reflect.TypeOf((*MockMiniServiceEngineGroupClient)(nil).GetAll), arg0...) -} - -// GetByName mocks base method -func (m *MockMiniServiceEngineGroupClient) GetByName(name string, options ...session.ApiOptionsParams) (*models.ServiceEngineGroup, error) { - m.ctrl.T.Helper() - varargs := []interface{}{name} - for _, a := range options { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "GetByName", varargs...) - ret0, _ := ret[0].(*models.ServiceEngineGroup) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetByName indicates an expected call of GetByName -func (mr *MockMiniServiceEngineGroupClientMockRecorder) GetByName(name interface{}, options ...interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]interface{}{name}, options...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByName", reflect.TypeOf((*MockMiniServiceEngineGroupClient)(nil).GetByName), varargs...) -} diff --git a/tkg/aws/client.go b/tkg/aws/client.go deleted file mode 100644 index d0b80f09bc..0000000000 --- a/tkg/aws/client.go +++ /dev/null @@ -1,593 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package aws - -import ( - "strings" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/session" - cfn "github.com/aws/aws-sdk-go/service/cloudformation" - "github.com/aws/aws-sdk-go/service/ec2" - "github.com/pkg/errors" - utilpointer "k8s.io/utils/pointer" - "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/cloudformation/bootstrap" - cloudformation "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/cloudformation/service" - "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/configreader" - awscreds "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/credentials" - iamv1 "sigs.k8s.io/cluster-api-provider-aws/v2/iam/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -const ( - defaultNodeMinMemoryInGB = 8 - defaultNodeMinCPU = 2 - cpuArm64 = "arm64" - tanzuMissionControlPoliciesSID = "tmccloudvmwarecom" - tanzuEBSCSIPoliciesSID = "tanzuebscsi" -) - -type client struct { - credentials awscreds.AWSCredentials - session *session.Session -} - -const ( - // DefaultCloudFormationBootstrapUserName is the default username of boostrap user - DefaultCloudFormationBootstrapUserName = "bootstrapper.tkg.cloud.vmware.com" - // DefaultCloudFormationNameSuffix is the default cloudformation suffix - DefaultCloudFormationNameSuffix = ".tkg.cloud.vmware.com" - // DefaultCloudFormationStackName is the default cloudformtation stack name - DefaultCloudFormationStackName = "tkg-cloud-vmware-com" - // KeyAWSRegion is the aws region key - KeyAWSRegion = "region" - // KeyAWSAccessKeyID is the aws_access_key_id key - KeyAWSAccessKeyID = "aws_access_key_id" - // KeyAWSSecretAccessKey is the aws_secret_access_key key - KeyAWSSecretAccessKey = "aws_secret_access_key" // #nosec - // KeyAWSSessionToken is the aws_session_token key - KeyAWSSessionToken = "aws_session_token" // #nosec -) - -// NewFromEncodedCrendentials creates an AWS Client from encoded credentials -func NewFromEncodedCrendentials(creds string) (Client, error) { - awsCreds := awscreds.AWSCredentials{} - - credLines := strings.Split(creds, "\n") - - for _, line := range credLines { - strs := strings.Split(line, " = ") - - if len(strs) != 2 { - continue - } - - if strs[0] == KeyAWSRegion { - awsCreds.Region = strs[1] - } - - if strs[0] == KeyAWSAccessKeyID { - awsCreds.AccessKeyID = strs[1] - } - - if strs[0] == KeyAWSSecretAccessKey { - awsCreds.SecretAccessKey = strs[1] - } - - if strs[0] == KeyAWSSessionToken { - awsCreds.SessionToken = strs[1] - } - } - - if awsCreds.Region == "" || awsCreds.AccessKeyID == "" || awsCreds.SecretAccessKey == "" { - return nil, errors.New("the AWS credentials are not valid") - } - - return New(awsCreds) -} - -// New creates an AWS client -func New(creds awscreds.AWSCredentials) (Client, error) { - sess, err := session.NewSession(&aws.Config{ - Region: aws.String(creds.Region), - Credentials: credentials.NewStaticCredentials( - creds.AccessKeyID, - creds.SecretAccessKey, - creds.SessionToken, - ), - }) - if err != nil { - return nil, errors.Wrap(err, "failed to create aws session") - } - - return &client{session: sess, credentials: creds}, nil -} - -func (c *client) VerifyAccount() error { - if c.session == nil { - return errors.New("uninitialized aws client") - } - // check if the user credentials are correct by calling ListRegions api - svc := ec2.New(c.session) - - _, err := svc.DescribeInstances(&ec2.DescribeInstancesInput{}) - - return err -} - -func (c *client) ListVPCs() ([]*models.Vpc, error) { - if c.session == nil { - return nil, errors.New("uninitialized aws client") - } - svc := ec2.New(c.session) - - results, err := svc.DescribeVpcs(&ec2.DescribeVpcsInput{}) - if err != nil { - return nil, errors.Wrap(err, "cannot get the list of vpcs under current account") - } - - vpcs := []*models.Vpc{} - - for _, r := range results.Vpcs { - obj := &models.Vpc{ID: *r.VpcId, Cidr: *r.CidrBlock} - vpcs = append(vpcs, obj) - } - - return vpcs, nil -} - -func (c *client) EncodeCredentials() (string, error) { - return c.credentials.RenderBase64EncodedAWSDefaultProfile() -} - -func (c *client) ListAvailabilityZones() ([]*models.AWSAvailabilityZone, error) { - azs := []*models.AWSAvailabilityZone{} - if c.session == nil { - return nil, errors.New("uninitialized aws client") - } - svc := ec2.New(c.session) - - results, err := svc.DescribeAvailabilityZones(&ec2.DescribeAvailabilityZonesInput{}) - if err != nil { - return nil, errors.Wrapf(err, "cannot get availability zones under region %s", c.credentials.Region) - } - - for _, r := range results.AvailabilityZones { - obj := &models.AWSAvailabilityZone{ID: *r.ZoneId, Name: *r.ZoneName} - azs = append(azs, obj) - } - return azs, nil -} - -func (c *client) ListRegionsByUser() ([]string, error) { - regions := []string{} - - if c.session == nil { - return regions, errors.New("uninitialized aws client") - } - svc := ec2.New(c.session) - - results, err := svc.DescribeRegions(&ec2.DescribeRegionsInput{}) - if err != nil { - return nil, errors.Wrapf(err, "cannot get availability zones under region %s", c.credentials.Region) - } - - for _, r := range results.Regions { - regions = append(regions, *r.RegionName) - } - return regions, nil -} - -func (c *client) GetSubnetGatewayAssociations(vpcID string) (map[string]bool, error) { - subnetGatewayMap := map[string]bool{} - if c.session == nil { - return nil, errors.New("uninitialized aws client") - } - svc := ec2.New(c.session) - - results, err := svc.DescribeRouteTables(&ec2.DescribeRouteTablesInput{ - Filters: []*ec2.Filter{{ - Name: aws.String("vpc-id"), Values: []*string{aws.String(vpcID)}, - }}, - }) - if err != nil { - return nil, errors.Wrapf(err, "cannot get subnets for vpc %s", vpcID) - } - - for _, routeTable := range results.RouteTables { - var isPublic bool - for _, route := range routeTable.Routes { - if route.GatewayId != nil && strings.HasPrefix(*route.GatewayId, "igw") { - isPublic = true - } - } - - for _, association := range routeTable.Associations { - if association.SubnetId != nil && isPublic { - subnetGatewayMap[*association.SubnetId] = true - } - } - } - - return subnetGatewayMap, nil -} - -func (c *client) ListSubnets(vpcID string) ([]*models.AWSSubnet, error) { - subnets := []*models.AWSSubnet{} - if c.session == nil { - return nil, errors.New("uninitialized aws client") - } - svc := ec2.New(c.session) - - subnetGatewayMap, routeErr := c.GetSubnetGatewayAssociations(vpcID) - - if routeErr != nil { - return nil, errors.Wrapf(routeErr, "cannot get subnets for vpc %s", vpcID) - } - - results, err := svc.DescribeSubnets(&ec2.DescribeSubnetsInput{ - Filters: []*ec2.Filter{{ - Name: aws.String("vpc-id"), - Values: []*string{aws.String(vpcID)}, - }}, - }) - if err != nil { - return nil, errors.Wrapf(err, "cannot get subnets for vpc %s", vpcID) - } - - for _, r := range results.Subnets { - _, hasKey := subnetGatewayMap[*r.SubnetId] - obj := &models.AWSSubnet{ - AvailabilityZoneID: *r.AvailabilityZoneId, - AvailabilityZoneName: *r.AvailabilityZone, - Cidr: *r.CidrBlock, - ID: *r.SubnetId, - State: *r.State, - VpcID: *r.VpcId, - IsPublic: &hasKey, - } - subnets = append(subnets, obj) - } - return subnets, nil -} - -func (c *client) CreateCloudFormationStack() error { - template, err := c.GenerateBootstrapTemplate(GenerateBootstrapTemplateInput{}) - if err != nil { - return err - } - return c.CreateCloudFormationStackWithTemplate(template) -} - -func (c *client) CreateCloudFormationStackWithTemplate(template *bootstrap.Template) error { - cfnSvc := cloudformation.NewService(cfn.New(c.session)) - if err := cfnSvc.ReconcileBootstrapStack(template.Spec.StackName, *template.RenderCloudFormation(), nil); err != nil { - return err - } - return cfnSvc.ShowStackResources(template.Spec.StackName) -} - -// GenerateBootstrapTemplateInput is the input to the GenerateBootstrapTemplate func -type GenerateBootstrapTemplateInput struct { - // BootstrapConfigFile is the path to a CAPA bootstrapv1 configuration file that can be used - // to customize IAM policies - BootstrapConfigFile string - // DisableTanzuMissionControlPermissions if true will remove IAM permissions for use by Tanzu Mission Control - // from all nodes - DisableTanzuMissionControlPermissions bool -} - -// GenerateBootstrapTemplate generates a wrapped CAPA bootstrapv1 configuration specification that controls -// the generation of CloudFormation stacks -func (c *client) GenerateBootstrapTemplate(i GenerateBootstrapTemplateInput) (*bootstrap.Template, error) { - template := bootstrap.NewTemplate() - if i.BootstrapConfigFile != "" { - spec, err := configreader.LoadConfigFile(i.BootstrapConfigFile) - if err != nil { - return nil, err - } - template.Spec = &spec.Spec - } - setDefaultsBootstrapTemplate(&template) - if !i.DisableTanzuMissionControlPermissions { - ensureTanzuMissionControlPermissions(&template) - } - ensureEBSCSiPermissions(&template) - return &template, nil -} - -func ensureEBSCSiPermissions(t *bootstrap.Template) { - // WA https://github.com/kubernetes-sigs/cluster-api-provider-aws/issues/3527 - // t.Spec.ControlPlane.EnableCSIPolicy = true not work - t.Spec.ControlPlane.ExtraStatements = ensureTanzuEBSCSIPermissionsForRole(t.Spec.ControlPlane.ExtraStatements) -} - -func ensureTanzuEBSCSIPermissionsForRole(statements []iamv1.StatementEntry) []iamv1.StatementEntry { - ebscsiStatementEntry := iamv1.StatementEntry{ - Sid: tanzuEBSCSIPoliciesSID, - Effect: iamv1.EffectAllow, - Resource: iamv1.Resources{iamv1.Any}, - Action: iamv1.Actions{ - "ec2:AttachVolume", - "ec2:CreateSnapshot", - "ec2:CreateTags", - "ec2:CreateVolume", - "ec2:DeleteSnapshot", - "ec2:DeleteTags", - "ec2:DeleteVolume", - "ec2:DescribeAvailabilityZones", - "ec2:DescribeInstances", - "ec2:DescribeSnapshots", - "ec2:DescribeTags", - "ec2:DescribeVolumes", - "ec2:DescribeVolumesModifications", - "ec2:DetachVolume", - "ec2:ModifyVolume", - }, - } - for i, statementEntry := range statements { - if statementEntry.Sid == tanzuEBSCSIPoliciesSID { - statements[i] = ebscsiStatementEntry - return statements - } - } - statements = append(statements, ebscsiStatementEntry) - return statements -} - -func ensureTanzuMissionControlPermissions(t *bootstrap.Template) { - t.Spec.Nodes.ExtraStatements = ensureTanzuMissionControlPermissionsForRole(t.Spec.Nodes.ExtraStatements) - t.Spec.ControlPlane.ExtraStatements = ensureTanzuMissionControlPermissionsForRole(t.Spec.ControlPlane.ExtraStatements) -} - -func ensureTanzuMissionControlPermissionsForRole(statements []iamv1.StatementEntry) []iamv1.StatementEntry { - tmcStatementEntry := iamv1.StatementEntry{ - Sid: tanzuMissionControlPoliciesSID, - Effect: iamv1.EffectAllow, - Action: iamv1.Actions{ - "ec2:DescribeKeyPairs", - "ec2:DescribeInstanceTypeOfferings", - "ec2:DescribeInstanceTypes", - "ec2:DescribeAvailabilityZones", - "ec2:DescribeSubnets", - "ec2:DescribeRouteTables", - "ec2:DescribeVpcs", - "ec2:DescribeNatGateways", - "ec2:DescribeAddresses", - "elasticloadbalancing:DescribeLoadBalancers", - "servicequotas:ListServiceQuotas", - "iam:GetPolicy", - "iam:ListAttachedRolePolicies", - "iam:GetPolicyVersion", - "iam:ListRoleTags", - }, - Resource: iamv1.Resources{iamv1.Any}, - } - for i, statementEntry := range statements { - if statementEntry.Sid == tanzuMissionControlPoliciesSID { - statements[i] = tmcStatementEntry - return statements - } - } - statements = append(statements, tmcStatementEntry) - return statements -} - -func setDefaultsBootstrapTemplate(t *bootstrap.Template) { - t.Spec.NameSuffix = utilpointer.StringPtr(DefaultCloudFormationNameSuffix) - t.Spec.StackName = DefaultCloudFormationStackName - t.Spec.BootstrapUser.UserName = DefaultCloudFormationBootstrapUserName - // Experimental EKS support in CAPA graduated and is enabled by default. - // Explicitly disabling it since TKG doesn't support creating EKS clusters. - t.Spec.EKS.Disable = true -} - -func (c *client) ListInstanceTypes(optionalAZName string) ([]string, error) { - if c.session == nil { - return nil, errors.New("uninitialized aws client") - } - svc := ec2.New(c.session) - - azs, err := svc.DescribeAvailabilityZones(&ec2.DescribeAvailabilityZonesInput{}) - if err != nil { - return nil, errors.Wrap(err, "cannot get availability zones under region") - } - - // Return instance types for a single AZ if the AZ name is specified - if optionalAZName != "" { - filters := []*ec2.Filter{ - { - Name: aws.String("location"), - Values: []*string{&optionalAZName}, - }, - } - filter := &ec2.DescribeInstanceTypeOfferingsInput{Filters: filters, LocationType: aws.String(ec2.LocationTypeAvailabilityZone)} - // retrieve instance type offered for particular availability zone - instances, err := getInstanceTypeOffering(svc, filter) - if err != nil { - return nil, err - } - candidates, err := getInstanceTypes(svc) - if err != nil { - return nil, err - } - // filter and build a list of unsupported instance types - unsupportedInstances := getUnsupportedInstanceTypes(candidates) - diffInstancesPerAz := getSetDifference(instances, unsupportedInstances) - - return diffInstancesPerAz, nil - } - - candidates, err := getInstanceTypes(svc) - if err != nil { - return nil, err - } - - // filter and build a list of unsupported instance types - unsupportedInstances := getUnsupportedInstanceTypes(candidates) - var res []string - for i, az := range azs.AvailabilityZones { - filters := []*ec2.Filter{ - { - Name: aws.String("location"), - Values: []*string{az.ZoneName}, - }, - } - filter := &ec2.DescribeInstanceTypeOfferingsInput{Filters: filters, LocationType: aws.String(ec2.LocationTypeAvailabilityZone)} - // retrieve instance type offered for particular availability zone - instances, err := getInstanceTypeOffering(svc, filter) - - // Do the set difference operation to filter out the unsupported instances - diffInstancesPerAz := getSetDifference(instances, unsupportedInstances) - if err != nil { - return nil, err - } - - if i == 0 { - res = diffInstancesPerAz - } else { - res = union(res, diffInstancesPerAz) - } - } - return res, nil -} - -// meetsNodeMinimumRequirements checks if the instance type meets the minimum requirements of the target node -func meetsNodeMinimumRequirements(instanceInfo *ec2.InstanceTypeInfo) bool { - return ((*instanceInfo.MemoryInfo.SizeInMiB / 1024) >= defaultNodeMinMemoryInGB) && - (*instanceInfo.VCpuInfo.DefaultVCpus >= defaultNodeMinCPU) -} - -// isSupportedInstance checks feature flag to determine if CPU supported architecture filters should be applied -func isSupportedInstance(instanceInfo *ec2.InstanceTypeInfo) bool { - if config.IsFeatureActivated(constants.FeatureFlagAwsInstanceTypesExcludeArm) { - // feature flag is active; apply filtering - return isSupportedCPUArchitecture(instanceInfo) - } - return true -} - -// isSupportedCPUArchitecture checks if the node includes unsupported CPU architecture -func isSupportedCPUArchitecture(instanceInfo *ec2.InstanceTypeInfo) bool { - // SupportedArchitectures []*string is a list of CPU architectures which are supported in the instance type - // if arm64 is present then exclude this instance type - for _, cpu := range instanceInfo.ProcessorInfo.SupportedArchitectures { - if *cpu == cpuArm64 { - return false - } - } - return true -} - -func getInstanceTypes(svc *ec2.EC2) ([]*ec2.InstanceTypeInfo, error) { - var descInstanceTypeOps []*ec2.DescribeInstanceTypesOutput - - err := svc.DescribeInstanceTypesPages(nil, - func(page *ec2.DescribeInstanceTypesOutput, lastPage bool) bool { - descInstanceTypeOps = append(descInstanceTypeOps, page) - return true - }) - if err != nil { - return nil, err - } - // iterate over all pages of the response and create a single array - res := []*ec2.InstanceTypeInfo{} - for _, descInstanceTypeOp := range descInstanceTypeOps { - res = append(res, descInstanceTypeOp.InstanceTypes...) - } - return res, err -} - -func getInstanceTypeOffering(svc *ec2.EC2, filter *ec2.DescribeInstanceTypeOfferingsInput) ([]string, error) { - var instanceTypeOfferingOps []*ec2.DescribeInstanceTypeOfferingsOutput - - err := svc.DescribeInstanceTypeOfferingsPages(filter, - func(page *ec2.DescribeInstanceTypeOfferingsOutput, lastPage bool) bool { - instanceTypeOfferingOps = append(instanceTypeOfferingOps, page) - return true - }) - if err != nil { - return nil, err - } - var res []string - - // iterate over all pages of the response and create a single array - for _, instanceTypeOfferingOp := range instanceTypeOfferingOps { - for _, t := range instanceTypeOfferingOp.InstanceTypeOfferings { - res = append(res, *t.InstanceType) - } - } - - return res, err -} - -func getSetDifference(a, b []string) (diff []string) { - m := make(map[string]bool) - - for _, item := range b { - m[item] = true - } - - for _, item := range a { - if _, ok := m[item]; !ok { - diff = append(diff, item) - } - } - return diff -} - -// getUnsupportedInstanceTypes generates list of unsupported instance types -func getUnsupportedInstanceTypes(instanceTypes []*ec2.InstanceTypeInfo) (ret []string) { - for _, instanceTypeObj := range instanceTypes { - // using node requirements as the criteria to filter the unsupported instance type - supportedInstanceType := meetsNodeMinimumRequirements(instanceTypeObj) && isSupportedInstance(instanceTypeObj) - if !supportedInstanceType { - ret = append(ret, aws.StringValue(instanceTypeObj.InstanceType)) - } - } - return -} - -func union(a, b []string) (c []string) { - m := make(map[string]bool) - - for _, item := range a { - m[item] = true - c = append(c, item) - } - - for _, item := range b { - if _, ok := m[item]; !ok { - c = append(c, item) - } - } - return c -} - -func (c *client) ListCloudFormationStacks() ([]string, error) { - res := []string{} - if c.session == nil { - return res, errors.New("uninitialized aws client") - } - - svc := cfn.New(c.session) - - stacks, err := svc.DescribeStacks(&cfn.DescribeStacksInput{}) - if err != nil { - return res, errors.Wrap(err, "cannot get list of CloudFormation Stacks") - } - - for _, stack := range stacks.Stacks { - if stack.StackName == nil { - continue - } - res = append(res, *stack.StackName) - } - - return res, nil -} diff --git a/tkg/aws/client_test.go b/tkg/aws/client_test.go deleted file mode 100644 index d80808086d..0000000000 --- a/tkg/aws/client_test.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package aws_test - -import ( - "fmt" - "os" - "path" - "testing" - - "github.com/awslabs/goformation/v4/cloudformation" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/sergi/go-diff/diffmatchpatch" - "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/cloudformation/bootstrap" - awscreds "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/credentials" - "sigs.k8s.io/yaml" - - "github.com/vmware-tanzu/tanzu-framework/tkg/aws" -) - -func TestClient(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "AWS Client Suite") -} - -const ( - // encoded credentials generated manually by running "clusterawsadm alpha bootstrap encode-aws-credentials" - //nolint:gosec - awsEncodedCredentials = "W2RlZmF1bHRdCmF3c19hY2Nlc3Nfa2V5X2lkID0gZmFrZS1hY2Nlc3Mva2V5K2lkCmF3c19zZWNyZXRfYWNjZXNzX2tleSA9IGZha2Utc2VjcmV0LWFjY2Vzcy1rZXkKcmVnaW9uID0gZmFrZS1yZWdpb24KCg==" - - fakeRegion = "fake-region" - fakeAccessKeyID = "fake-access/key+id" - fakeSecretAccessKey = "fake-secret-access-key" // #nosec -) - -var _ = Describe("Unit tests for aws client", func() { - var ( - err error - region string - accessKeyID string - secretAccessKey string - awsClient aws.Client - ) - - Describe("Encode aws credentials", func() { - var encodedCreds string - JustBeforeEach(func() { - awsCreds := awscreds.AWSCredentials{ - AccessKeyID: accessKeyID, - SecretAccessKey: secretAccessKey, - Region: region, - } - awsClient, err = aws.New(awsCreds) - Expect(err).ToNot(HaveOccurred()) - encodedCreds, err = awsClient.EncodeCredentials() - }) - - Context("When the same credentials are provided", func() { - BeforeEach(func() { - region = fakeRegion - accessKeyID = fakeAccessKeyID - secretAccessKey = fakeSecretAccessKey - }) - It("should return the same encoded string for the same credentials", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(encodedCreds).To(Equal(awsEncodedCredentials)) - }) - }) - - Context("When different credentials are provided", func() { - BeforeEach(func() { - region = "another-fake-region" - accessKeyID = fakeAccessKeyID - secretAccessKey = fakeSecretAccessKey - }) - It("should return the different encoded string for the same credentials", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(encodedCreds).ToNot(Equal(awsEncodedCredentials)) - }) - }) - }) - - Describe("Generating Cloudformation", func() { - BeforeEach(func() { - awsClient, err = aws.New(awscreds.AWSCredentials{ - AccessKeyID: fakeRegion, - SecretAccessKey: fakeAccessKeyID, - Region: fakeSecretAccessKey, - }) - Expect(err).ToNot(HaveOccurred()) - }) - - It("Defaults", func() { - template, err := awsClient.GenerateBootstrapTemplate(aws.GenerateBootstrapTemplateInput{}) - Expect(err).NotTo(HaveOccurred()) - testBootstrapTemplate("default", template) - }) - - It("With TMC Permissions Disabled", func() { - template, err := awsClient.GenerateBootstrapTemplate(aws.GenerateBootstrapTemplateInput{ - DisableTanzuMissionControlPermissions: true, - }) - Expect(err).NotTo(HaveOccurred()) - testBootstrapTemplate("tmc-disabled", template) - }) - }) -}) - -func testBootstrapTemplate(name string, template *bootstrap.Template) { - defer GinkgoRecover() - cfn := cloudformation.Template{} - data, err := os.ReadFile(path.Join("fixtures", "cloudformation-"+name+".yaml")) - Expect(err).ToNot(HaveOccurred()) - err = yaml.Unmarshal(data, cfn) - Expect(err).ToNot(HaveOccurred()) - tData, err := template.RenderCloudFormation().YAML() - Expect(err).ToNot(HaveOccurred()) - err = os.WriteFile("/tmp/tmp1", tData, 0600) - Expect(err).ToNot(HaveOccurred()) - dmp := diffmatchpatch.New() - diffs := dmp.DiffMain(string(tData), string(data), false) - out := dmp.DiffPrettyText(diffs) - Expect(string(tData)).To(Equal(string(data)), fmt.Sprintf("Differing output (%s):\n%s\nfixture:\n%s\ngenerated:\n%s", name, out, data, tData)) -} diff --git a/tkg/aws/fixtures/cloudformation-default.yaml b/tkg/aws/fixtures/cloudformation-default.yaml deleted file mode 100644 index 8dc458d21b..0000000000 --- a/tkg/aws/fixtures/cloudformation-default.yaml +++ /dev/null @@ -1,385 +0,0 @@ -AWSTemplateFormatVersion: 2010-09-09 -Resources: - AWSIAMInstanceProfileControlPlane: - Properties: - InstanceProfileName: control-plane.tkg.cloud.vmware.com - Roles: - - Ref: AWSIAMRoleControlPlane - Type: AWS::IAM::InstanceProfile - AWSIAMInstanceProfileControllers: - Properties: - InstanceProfileName: controllers.tkg.cloud.vmware.com - Roles: - - Ref: AWSIAMRoleControllers - Type: AWS::IAM::InstanceProfile - AWSIAMInstanceProfileNodes: - Properties: - InstanceProfileName: nodes.tkg.cloud.vmware.com - Roles: - - Ref: AWSIAMRoleNodes - Type: AWS::IAM::InstanceProfile - AWSIAMManagedPolicyCloudProviderControlPlane: - Properties: - Description: For the Kubernetes Cloud Provider AWS Control Plane - ManagedPolicyName: control-plane.tkg.cloud.vmware.com - PolicyDocument: - Statement: - - Action: - - autoscaling:DescribeAutoScalingGroups - - autoscaling:DescribeLaunchConfigurations - - autoscaling:DescribeTags - - ec2:AssignIpv6Addresses - - ec2:DescribeInstances - - ec2:DescribeImages - - ec2:DescribeRegions - - ec2:DescribeRouteTables - - ec2:DescribeSecurityGroups - - ec2:DescribeSubnets - - ec2:DescribeVolumes - - ec2:CreateSecurityGroup - - ec2:CreateTags - - ec2:CreateVolume - - ec2:ModifyInstanceAttribute - - ec2:ModifyVolume - - ec2:AttachVolume - - ec2:AuthorizeSecurityGroupIngress - - ec2:CreateRoute - - ec2:DeleteRoute - - ec2:DeleteSecurityGroup - - ec2:DeleteVolume - - ec2:DetachVolume - - ec2:RevokeSecurityGroupIngress - - ec2:DescribeVpcs - - elasticloadbalancing:AddTags - - elasticloadbalancing:AttachLoadBalancerToSubnets - - elasticloadbalancing:ApplySecurityGroupsToLoadBalancer - - elasticloadbalancing:CreateLoadBalancer - - elasticloadbalancing:CreateLoadBalancerPolicy - - elasticloadbalancing:CreateLoadBalancerListeners - - elasticloadbalancing:ConfigureHealthCheck - - elasticloadbalancing:DeleteLoadBalancer - - elasticloadbalancing:DeleteLoadBalancerListeners - - elasticloadbalancing:DescribeLoadBalancers - - elasticloadbalancing:DescribeLoadBalancerAttributes - - elasticloadbalancing:DetachLoadBalancerFromSubnets - - elasticloadbalancing:DeregisterInstancesFromLoadBalancer - - elasticloadbalancing:ModifyLoadBalancerAttributes - - elasticloadbalancing:RegisterInstancesWithLoadBalancer - - elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer - - elasticloadbalancing:CreateListener - - elasticloadbalancing:CreateTargetGroup - - elasticloadbalancing:DeleteListener - - elasticloadbalancing:DeleteTargetGroup - - elasticloadbalancing:DeregisterTargets - - elasticloadbalancing:DescribeListeners - - elasticloadbalancing:DescribeLoadBalancerPolicies - - elasticloadbalancing:DescribeTargetGroups - - elasticloadbalancing:DescribeTargetHealth - - elasticloadbalancing:ModifyListener - - elasticloadbalancing:ModifyTargetGroup - - elasticloadbalancing:RegisterTargets - - elasticloadbalancing:SetLoadBalancerPoliciesOfListener - - iam:CreateServiceLinkedRole - - kms:DescribeKey - Effect: Allow - Resource: - - '*' - Version: 2012-10-17 - Roles: - - Ref: AWSIAMRoleControlPlane - Type: AWS::IAM::ManagedPolicy - AWSIAMManagedPolicyCloudProviderNodes: - Properties: - Description: For the Kubernetes Cloud Provider AWS nodes - ManagedPolicyName: nodes.tkg.cloud.vmware.com - PolicyDocument: - Statement: - - Action: - - ec2:AssignIpv6Addresses - - ec2:DescribeInstances - - ec2:DescribeRegions - - ec2:CreateTags - - ec2:DescribeTags - - ec2:DescribeNetworkInterfaces - - ec2:DescribeInstanceTypes - - ecr:GetAuthorizationToken - - ecr:BatchCheckLayerAvailability - - ecr:GetDownloadUrlForLayer - - ecr:GetRepositoryPolicy - - ecr:DescribeRepositories - - ecr:ListImages - - ecr:BatchGetImage - Effect: Allow - Resource: - - '*' - - Action: - - secretsmanager:DeleteSecret - - secretsmanager:GetSecretValue - Effect: Allow - Resource: - - arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/* - - Action: - - ssm:UpdateInstanceInformation - - ssmmessages:CreateControlChannel - - ssmmessages:CreateDataChannel - - ssmmessages:OpenControlChannel - - ssmmessages:OpenDataChannel - - s3:GetEncryptionConfiguration - Effect: Allow - Resource: - - '*' - Version: 2012-10-17 - Roles: - - Ref: AWSIAMRoleControlPlane - - Ref: AWSIAMRoleNodes - Type: AWS::IAM::ManagedPolicy - AWSIAMManagedPolicyControllers: - Properties: - Description: For the Kubernetes Cluster API Provider AWS Controllers - ManagedPolicyName: controllers.tkg.cloud.vmware.com - PolicyDocument: - Statement: - - Action: - - ec2:AttachNetworkInterface - - ec2:DetachNetworkInterface - - ec2:AllocateAddress - - ec2:AssignIpv6Addresses - - ec2:AssignPrivateIpAddresses - - ec2:UnassignPrivateIpAddresses - - ec2:AssociateRouteTable - - ec2:AttachInternetGateway - - ec2:AuthorizeSecurityGroupIngress - - ec2:CreateInternetGateway - - ec2:CreateEgressOnlyInternetGateway - - ec2:CreateNatGateway - - ec2:CreateNetworkInterface - - ec2:CreateRoute - - ec2:CreateRouteTable - - ec2:CreateSecurityGroup - - ec2:CreateSubnet - - ec2:CreateTags - - ec2:CreateVpc - - ec2:ModifyVpcAttribute - - ec2:DeleteInternetGateway - - ec2:DeleteEgressOnlyInternetGateway - - ec2:DeleteNatGateway - - ec2:DeleteRouteTable - - ec2:ReplaceRoute - - ec2:DeleteSecurityGroup - - ec2:DeleteSubnet - - ec2:DeleteTags - - ec2:DeleteVpc - - ec2:DescribeAccountAttributes - - ec2:DescribeAddresses - - ec2:DescribeAvailabilityZones - - ec2:DescribeInstances - - ec2:DescribeInternetGateways - - ec2:DescribeEgressOnlyInternetGateways - - ec2:DescribeInstanceTypes - - ec2:DescribeImages - - ec2:DescribeNatGateways - - ec2:DescribeNetworkInterfaces - - ec2:DescribeNetworkInterfaceAttribute - - ec2:DescribeRouteTables - - ec2:DescribeSecurityGroups - - ec2:DescribeSubnets - - ec2:DescribeVpcs - - ec2:DescribeVpcAttribute - - ec2:DescribeVolumes - - ec2:DescribeTags - - ec2:DetachInternetGateway - - ec2:DisassociateRouteTable - - ec2:DisassociateAddress - - ec2:ModifyInstanceAttribute - - ec2:ModifyNetworkInterfaceAttribute - - ec2:ModifySubnetAttribute - - ec2:ReleaseAddress - - ec2:RevokeSecurityGroupIngress - - ec2:RunInstances - - ec2:TerminateInstances - - tag:GetResources - - elasticloadbalancing:AddTags - - elasticloadbalancing:CreateLoadBalancer - - elasticloadbalancing:ConfigureHealthCheck - - elasticloadbalancing:DeleteLoadBalancer - - elasticloadbalancing:DeleteTargetGroup - - elasticloadbalancing:DescribeLoadBalancers - - elasticloadbalancing:DescribeLoadBalancerAttributes - - elasticloadbalancing:ApplySecurityGroupsToLoadBalancer - - elasticloadbalancing:DescribeTags - - elasticloadbalancing:ModifyLoadBalancerAttributes - - elasticloadbalancing:RegisterInstancesWithLoadBalancer - - elasticloadbalancing:DeregisterInstancesFromLoadBalancer - - elasticloadbalancing:RemoveTags - - autoscaling:DescribeAutoScalingGroups - - autoscaling:DescribeInstanceRefreshes - - ec2:CreateLaunchTemplate - - ec2:CreateLaunchTemplateVersion - - ec2:DescribeLaunchTemplates - - ec2:DescribeLaunchTemplateVersions - - ec2:DeleteLaunchTemplate - - ec2:DeleteLaunchTemplateVersions - - ec2:DescribeKeyPairs - Effect: Allow - Resource: - - '*' - - Action: - - autoscaling:CreateAutoScalingGroup - - autoscaling:UpdateAutoScalingGroup - - autoscaling:CreateOrUpdateTags - - autoscaling:StartInstanceRefresh - - autoscaling:DeleteAutoScalingGroup - - autoscaling:DeleteTags - Effect: Allow - Resource: - - arn:*:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/* - - Action: - - iam:CreateServiceLinkedRole - Condition: - StringLike: - iam:AWSServiceName: autoscaling.amazonaws.com - Effect: Allow - Resource: - - arn:*:iam::*:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling - - Action: - - iam:CreateServiceLinkedRole - Condition: - StringLike: - iam:AWSServiceName: elasticloadbalancing.amazonaws.com - Effect: Allow - Resource: - - arn:*:iam::*:role/aws-service-role/elasticloadbalancing.amazonaws.com/AWSServiceRoleForElasticLoadBalancing - - Action: - - iam:CreateServiceLinkedRole - Condition: - StringLike: - iam:AWSServiceName: spot.amazonaws.com - Effect: Allow - Resource: - - arn:*:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot - - Action: - - iam:PassRole - Effect: Allow - Resource: - - arn:*:iam::*:role/*.tkg.cloud.vmware.com - - Action: - - secretsmanager:CreateSecret - - secretsmanager:DeleteSecret - - secretsmanager:TagResource - Effect: Allow - Resource: - - arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/* - Version: 2012-10-17 - Roles: - - Ref: AWSIAMRoleControllers - - Ref: AWSIAMRoleControlPlane - Type: AWS::IAM::ManagedPolicy - AWSIAMRoleControlPlane: - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: - - sts:AssumeRole - Effect: Allow - Principal: - Service: - - ec2.amazonaws.com - Version: 2012-10-17 - Policies: - - PolicyDocument: - Statement: - - Action: - - ec2:DescribeKeyPairs - - ec2:DescribeInstanceTypeOfferings - - ec2:DescribeInstanceTypes - - ec2:DescribeAvailabilityZones - - ec2:DescribeSubnets - - ec2:DescribeRouteTables - - ec2:DescribeVpcs - - ec2:DescribeNatGateways - - ec2:DescribeAddresses - - elasticloadbalancing:DescribeLoadBalancers - - servicequotas:ListServiceQuotas - - iam:GetPolicy - - iam:ListAttachedRolePolicies - - iam:GetPolicyVersion - - iam:ListRoleTags - Effect: Allow - Resource: - - '*' - Sid: tmccloudvmwarecom - - Action: - - ec2:AttachVolume - - ec2:CreateSnapshot - - ec2:CreateTags - - ec2:CreateVolume - - ec2:DeleteSnapshot - - ec2:DeleteTags - - ec2:DeleteVolume - - ec2:DescribeAvailabilityZones - - ec2:DescribeInstances - - ec2:DescribeSnapshots - - ec2:DescribeTags - - ec2:DescribeVolumes - - ec2:DescribeVolumesModifications - - ec2:DetachVolume - - ec2:ModifyVolume - Effect: Allow - Resource: - - '*' - Sid: tanzuebscsi - Version: 2012-10-17 - PolicyName: tkg-cloud-vmware-com - RoleName: control-plane.tkg.cloud.vmware.com - Type: AWS::IAM::Role - AWSIAMRoleControllers: - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: - - sts:AssumeRole - Effect: Allow - Principal: - Service: - - ec2.amazonaws.com - Version: 2012-10-17 - RoleName: controllers.tkg.cloud.vmware.com - Type: AWS::IAM::Role - AWSIAMRoleNodes: - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: - - sts:AssumeRole - Effect: Allow - Principal: - Service: - - ec2.amazonaws.com - Version: 2012-10-17 - Policies: - - PolicyDocument: - Statement: - - Action: - - ec2:DescribeKeyPairs - - ec2:DescribeInstanceTypeOfferings - - ec2:DescribeInstanceTypes - - ec2:DescribeAvailabilityZones - - ec2:DescribeSubnets - - ec2:DescribeRouteTables - - ec2:DescribeVpcs - - ec2:DescribeNatGateways - - ec2:DescribeAddresses - - elasticloadbalancing:DescribeLoadBalancers - - servicequotas:ListServiceQuotas - - iam:GetPolicy - - iam:ListAttachedRolePolicies - - iam:GetPolicyVersion - - iam:ListRoleTags - Effect: Allow - Resource: - - '*' - Sid: tmccloudvmwarecom - Version: 2012-10-17 - PolicyName: tkg-cloud-vmware-com - RoleName: nodes.tkg.cloud.vmware.com - Type: AWS::IAM::Role diff --git a/tkg/aws/fixtures/cloudformation-tmc-disabled.yaml b/tkg/aws/fixtures/cloudformation-tmc-disabled.yaml deleted file mode 100644 index a4a9caab66..0000000000 --- a/tkg/aws/fixtures/cloudformation-tmc-disabled.yaml +++ /dev/null @@ -1,340 +0,0 @@ -AWSTemplateFormatVersion: 2010-09-09 -Resources: - AWSIAMInstanceProfileControlPlane: - Properties: - InstanceProfileName: control-plane.tkg.cloud.vmware.com - Roles: - - Ref: AWSIAMRoleControlPlane - Type: AWS::IAM::InstanceProfile - AWSIAMInstanceProfileControllers: - Properties: - InstanceProfileName: controllers.tkg.cloud.vmware.com - Roles: - - Ref: AWSIAMRoleControllers - Type: AWS::IAM::InstanceProfile - AWSIAMInstanceProfileNodes: - Properties: - InstanceProfileName: nodes.tkg.cloud.vmware.com - Roles: - - Ref: AWSIAMRoleNodes - Type: AWS::IAM::InstanceProfile - AWSIAMManagedPolicyCloudProviderControlPlane: - Properties: - Description: For the Kubernetes Cloud Provider AWS Control Plane - ManagedPolicyName: control-plane.tkg.cloud.vmware.com - PolicyDocument: - Statement: - - Action: - - autoscaling:DescribeAutoScalingGroups - - autoscaling:DescribeLaunchConfigurations - - autoscaling:DescribeTags - - ec2:AssignIpv6Addresses - - ec2:DescribeInstances - - ec2:DescribeImages - - ec2:DescribeRegions - - ec2:DescribeRouteTables - - ec2:DescribeSecurityGroups - - ec2:DescribeSubnets - - ec2:DescribeVolumes - - ec2:CreateSecurityGroup - - ec2:CreateTags - - ec2:CreateVolume - - ec2:ModifyInstanceAttribute - - ec2:ModifyVolume - - ec2:AttachVolume - - ec2:AuthorizeSecurityGroupIngress - - ec2:CreateRoute - - ec2:DeleteRoute - - ec2:DeleteSecurityGroup - - ec2:DeleteVolume - - ec2:DetachVolume - - ec2:RevokeSecurityGroupIngress - - ec2:DescribeVpcs - - elasticloadbalancing:AddTags - - elasticloadbalancing:AttachLoadBalancerToSubnets - - elasticloadbalancing:ApplySecurityGroupsToLoadBalancer - - elasticloadbalancing:CreateLoadBalancer - - elasticloadbalancing:CreateLoadBalancerPolicy - - elasticloadbalancing:CreateLoadBalancerListeners - - elasticloadbalancing:ConfigureHealthCheck - - elasticloadbalancing:DeleteLoadBalancer - - elasticloadbalancing:DeleteLoadBalancerListeners - - elasticloadbalancing:DescribeLoadBalancers - - elasticloadbalancing:DescribeLoadBalancerAttributes - - elasticloadbalancing:DetachLoadBalancerFromSubnets - - elasticloadbalancing:DeregisterInstancesFromLoadBalancer - - elasticloadbalancing:ModifyLoadBalancerAttributes - - elasticloadbalancing:RegisterInstancesWithLoadBalancer - - elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer - - elasticloadbalancing:CreateListener - - elasticloadbalancing:CreateTargetGroup - - elasticloadbalancing:DeleteListener - - elasticloadbalancing:DeleteTargetGroup - - elasticloadbalancing:DeregisterTargets - - elasticloadbalancing:DescribeListeners - - elasticloadbalancing:DescribeLoadBalancerPolicies - - elasticloadbalancing:DescribeTargetGroups - - elasticloadbalancing:DescribeTargetHealth - - elasticloadbalancing:ModifyListener - - elasticloadbalancing:ModifyTargetGroup - - elasticloadbalancing:RegisterTargets - - elasticloadbalancing:SetLoadBalancerPoliciesOfListener - - iam:CreateServiceLinkedRole - - kms:DescribeKey - Effect: Allow - Resource: - - '*' - Version: 2012-10-17 - Roles: - - Ref: AWSIAMRoleControlPlane - Type: AWS::IAM::ManagedPolicy - AWSIAMManagedPolicyCloudProviderNodes: - Properties: - Description: For the Kubernetes Cloud Provider AWS nodes - ManagedPolicyName: nodes.tkg.cloud.vmware.com - PolicyDocument: - Statement: - - Action: - - ec2:AssignIpv6Addresses - - ec2:DescribeInstances - - ec2:DescribeRegions - - ec2:CreateTags - - ec2:DescribeTags - - ec2:DescribeNetworkInterfaces - - ec2:DescribeInstanceTypes - - ecr:GetAuthorizationToken - - ecr:BatchCheckLayerAvailability - - ecr:GetDownloadUrlForLayer - - ecr:GetRepositoryPolicy - - ecr:DescribeRepositories - - ecr:ListImages - - ecr:BatchGetImage - Effect: Allow - Resource: - - '*' - - Action: - - secretsmanager:DeleteSecret - - secretsmanager:GetSecretValue - Effect: Allow - Resource: - - arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/* - - Action: - - ssm:UpdateInstanceInformation - - ssmmessages:CreateControlChannel - - ssmmessages:CreateDataChannel - - ssmmessages:OpenControlChannel - - ssmmessages:OpenDataChannel - - s3:GetEncryptionConfiguration - Effect: Allow - Resource: - - '*' - Version: 2012-10-17 - Roles: - - Ref: AWSIAMRoleControlPlane - - Ref: AWSIAMRoleNodes - Type: AWS::IAM::ManagedPolicy - AWSIAMManagedPolicyControllers: - Properties: - Description: For the Kubernetes Cluster API Provider AWS Controllers - ManagedPolicyName: controllers.tkg.cloud.vmware.com - PolicyDocument: - Statement: - - Action: - - ec2:AttachNetworkInterface - - ec2:DetachNetworkInterface - - ec2:AllocateAddress - - ec2:AssignIpv6Addresses - - ec2:AssignPrivateIpAddresses - - ec2:UnassignPrivateIpAddresses - - ec2:AssociateRouteTable - - ec2:AttachInternetGateway - - ec2:AuthorizeSecurityGroupIngress - - ec2:CreateInternetGateway - - ec2:CreateEgressOnlyInternetGateway - - ec2:CreateNatGateway - - ec2:CreateNetworkInterface - - ec2:CreateRoute - - ec2:CreateRouteTable - - ec2:CreateSecurityGroup - - ec2:CreateSubnet - - ec2:CreateTags - - ec2:CreateVpc - - ec2:ModifyVpcAttribute - - ec2:DeleteInternetGateway - - ec2:DeleteEgressOnlyInternetGateway - - ec2:DeleteNatGateway - - ec2:DeleteRouteTable - - ec2:ReplaceRoute - - ec2:DeleteSecurityGroup - - ec2:DeleteSubnet - - ec2:DeleteTags - - ec2:DeleteVpc - - ec2:DescribeAccountAttributes - - ec2:DescribeAddresses - - ec2:DescribeAvailabilityZones - - ec2:DescribeInstances - - ec2:DescribeInternetGateways - - ec2:DescribeEgressOnlyInternetGateways - - ec2:DescribeInstanceTypes - - ec2:DescribeImages - - ec2:DescribeNatGateways - - ec2:DescribeNetworkInterfaces - - ec2:DescribeNetworkInterfaceAttribute - - ec2:DescribeRouteTables - - ec2:DescribeSecurityGroups - - ec2:DescribeSubnets - - ec2:DescribeVpcs - - ec2:DescribeVpcAttribute - - ec2:DescribeVolumes - - ec2:DescribeTags - - ec2:DetachInternetGateway - - ec2:DisassociateRouteTable - - ec2:DisassociateAddress - - ec2:ModifyInstanceAttribute - - ec2:ModifyNetworkInterfaceAttribute - - ec2:ModifySubnetAttribute - - ec2:ReleaseAddress - - ec2:RevokeSecurityGroupIngress - - ec2:RunInstances - - ec2:TerminateInstances - - tag:GetResources - - elasticloadbalancing:AddTags - - elasticloadbalancing:CreateLoadBalancer - - elasticloadbalancing:ConfigureHealthCheck - - elasticloadbalancing:DeleteLoadBalancer - - elasticloadbalancing:DeleteTargetGroup - - elasticloadbalancing:DescribeLoadBalancers - - elasticloadbalancing:DescribeLoadBalancerAttributes - - elasticloadbalancing:ApplySecurityGroupsToLoadBalancer - - elasticloadbalancing:DescribeTags - - elasticloadbalancing:ModifyLoadBalancerAttributes - - elasticloadbalancing:RegisterInstancesWithLoadBalancer - - elasticloadbalancing:DeregisterInstancesFromLoadBalancer - - elasticloadbalancing:RemoveTags - - autoscaling:DescribeAutoScalingGroups - - autoscaling:DescribeInstanceRefreshes - - ec2:CreateLaunchTemplate - - ec2:CreateLaunchTemplateVersion - - ec2:DescribeLaunchTemplates - - ec2:DescribeLaunchTemplateVersions - - ec2:DeleteLaunchTemplate - - ec2:DeleteLaunchTemplateVersions - - ec2:DescribeKeyPairs - Effect: Allow - Resource: - - '*' - - Action: - - autoscaling:CreateAutoScalingGroup - - autoscaling:UpdateAutoScalingGroup - - autoscaling:CreateOrUpdateTags - - autoscaling:StartInstanceRefresh - - autoscaling:DeleteAutoScalingGroup - - autoscaling:DeleteTags - Effect: Allow - Resource: - - arn:*:autoscaling:*:*:autoScalingGroup:*:autoScalingGroupName/* - - Action: - - iam:CreateServiceLinkedRole - Condition: - StringLike: - iam:AWSServiceName: autoscaling.amazonaws.com - Effect: Allow - Resource: - - arn:*:iam::*:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling - - Action: - - iam:CreateServiceLinkedRole - Condition: - StringLike: - iam:AWSServiceName: elasticloadbalancing.amazonaws.com - Effect: Allow - Resource: - - arn:*:iam::*:role/aws-service-role/elasticloadbalancing.amazonaws.com/AWSServiceRoleForElasticLoadBalancing - - Action: - - iam:CreateServiceLinkedRole - Condition: - StringLike: - iam:AWSServiceName: spot.amazonaws.com - Effect: Allow - Resource: - - arn:*:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot - - Action: - - iam:PassRole - Effect: Allow - Resource: - - arn:*:iam::*:role/*.tkg.cloud.vmware.com - - Action: - - secretsmanager:CreateSecret - - secretsmanager:DeleteSecret - - secretsmanager:TagResource - Effect: Allow - Resource: - - arn:*:secretsmanager:*:*:secret:aws.cluster.x-k8s.io/* - Version: 2012-10-17 - Roles: - - Ref: AWSIAMRoleControllers - - Ref: AWSIAMRoleControlPlane - Type: AWS::IAM::ManagedPolicy - AWSIAMRoleControlPlane: - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: - - sts:AssumeRole - Effect: Allow - Principal: - Service: - - ec2.amazonaws.com - Version: 2012-10-17 - Policies: - - PolicyDocument: - Statement: - - Action: - - ec2:AttachVolume - - ec2:CreateSnapshot - - ec2:CreateTags - - ec2:CreateVolume - - ec2:DeleteSnapshot - - ec2:DeleteTags - - ec2:DeleteVolume - - ec2:DescribeAvailabilityZones - - ec2:DescribeInstances - - ec2:DescribeSnapshots - - ec2:DescribeTags - - ec2:DescribeVolumes - - ec2:DescribeVolumesModifications - - ec2:DetachVolume - - ec2:ModifyVolume - Effect: Allow - Resource: - - '*' - Sid: tanzuebscsi - Version: 2012-10-17 - PolicyName: tkg-cloud-vmware-com - RoleName: control-plane.tkg.cloud.vmware.com - Type: AWS::IAM::Role - AWSIAMRoleControllers: - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: - - sts:AssumeRole - Effect: Allow - Principal: - Service: - - ec2.amazonaws.com - Version: 2012-10-17 - RoleName: controllers.tkg.cloud.vmware.com - Type: AWS::IAM::Role - AWSIAMRoleNodes: - Properties: - AssumeRolePolicyDocument: - Statement: - - Action: - - sts:AssumeRole - Effect: Allow - Principal: - Service: - - ec2.amazonaws.com - Version: 2012-10-17 - RoleName: nodes.tkg.cloud.vmware.com - Type: AWS::IAM::Role diff --git a/tkg/aws/ini/ast.go b/tkg/aws/ini/ast.go deleted file mode 100644 index f0aaa7f89f..0000000000 --- a/tkg/aws/ini/ast.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -// ASTKind represents different states in the parse table -// and the type of AST that is being constructed -type ASTKind int - -const ( - // NoneString defines string constant none - NoneString = "none" - // CommentString defines tring constant comment - CommentString = "comment" -) - -// ASTKind* is used in the parse table to transition between -// the different states -const ( - ASTKindNone = ASTKind(iota) - ASTKindStart - ASTKindExpr - ASTKindEqualExpr - ASTKindStatement - ASTKindSkipStatement - ASTKindExprStatement - ASTKindSectionStatement - ASTKindNestedSectionStatement - ASTKindCompletedNestedSectionStatement - ASTKindCommentStatement - ASTKindCompletedSectionStatement -) - -func (k ASTKind) String() string { - switch k { - case ASTKindNone: - return NoneString - case ASTKindStart: - return "start" - case ASTKindExpr: - return "expr" - case ASTKindStatement: - return "stmt" - case ASTKindSectionStatement: - return "section_stmt" - case ASTKindExprStatement: - return "expr_stmt" - case ASTKindCommentStatement: - return CommentString - case ASTKindNestedSectionStatement: - return "nested_section_stmt" - case ASTKindCompletedSectionStatement: - return "completed_stmt" - case ASTKindSkipStatement: - return "skip" - default: - return "" - } -} - -// AST interface allows us to determine what kind of node we -// are on and casting may not need to be necessary. -// -// The root is always the first node in Children -type AST struct { - Kind ASTKind - Root Token - RootToken bool - Children []AST -} - -func newAST(kind ASTKind, root *AST, children ...AST) AST { //nolint:unparam - return AST{ - Kind: kind, - Children: append([]AST{*root}, children...), - } -} - -func newASTWithRootToken(kind ASTKind, root Token, children ...AST) AST { - return AST{ - Kind: kind, - Root: root, - RootToken: true, - Children: children, - } -} - -// AppendChild will append to the list of children an AST has. -func (a *AST) AppendChild(child *AST) { - a.Children = append(a.Children, *child) -} - -// GetRoot will return the root AST which can be the first entry -// in the children list or a token. -func (a *AST) GetRoot() AST { - if a.RootToken { - return *a - } - - if len(a.Children) == 0 { - return AST{} - } - - return a.Children[0] -} - -// GetChildren will return the current AST's list of children -func (a *AST) GetChildren() []AST { - if len(a.Children) == 0 { - return []AST{} - } - - if a.RootToken { - return a.Children - } - - return a.Children[1:] -} - -// SetChildren will set and override all children of the AST. -func (a *AST) SetChildren(children []AST) { - if a.RootToken { - a.Children = children - } else { - a.Children = append(a.Children[:1], children...) - } -} - -// Start is used to indicate the starting state of the parse table. -var Start = newAST(ASTKindStart, &AST{}) diff --git a/tkg/aws/ini/comma_token.go b/tkg/aws/ini/comma_token.go deleted file mode 100644 index d495e10f1a..0000000000 --- a/tkg/aws/ini/comma_token.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -var commaRunes = []rune(",") - -func isComma(b rune) bool { - return b == ',' -} - -func newCommaToken() Token { - return newToken(TokenComma, commaRunes, NoneType) -} diff --git a/tkg/aws/ini/comment_token.go b/tkg/aws/ini/comment_token.go deleted file mode 100644 index 90e574f43a..0000000000 --- a/tkg/aws/ini/comment_token.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -// isComment will return whether or not the next byte(s) is a -// comment. -func isComment(b []rune) bool { - if len(b) == 0 { - return false - } - - switch b[0] { - case ';': - return true - case '#': - return true - } - - return false -} - -// newCommentToken will create a comment token and -// return how many bytes were read. -func newCommentToken(b []rune) (Token, int) { - i := 0 - for ; i < len(b); i++ { - if b[i] == '\n' { - break - } - - if len(b)-i > 2 && b[i] == '\r' && b[i+1] == '\n' { - break - } - } - - return newToken(TokenComment, b[:i], NoneType), i -} diff --git a/tkg/aws/ini/doc.go b/tkg/aws/ini/doc.go deleted file mode 100644 index 5703400440..0000000000 --- a/tkg/aws/ini/doc.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package ini is an LL(1) parser for configuration files. -// -// Example: -// sections, err := ini.OpenFile("/path/to/file") -// if err != nil { -// panic(err) -// } -// -// profile := "foo" -// section, ok := sections.GetSection(profile) -// if !ok { -// fmt.Printf("section %q could not be found", profile) -// } -// -// Below is the BNF that describes this parser -// -// Grammar: -// stmt -> value stmt' -// stmt' -> epsilon | op stmt -// value -> number | string | boolean | quoted_string -// -// section -> [ section' -// section' -> value section_close -// section_close -> ] -// -// SkipState will skip (NL WS)+ -// -// comment -> # comment' | ; comment' -// comment' -> epsilon | value -package ini diff --git a/tkg/aws/ini/empty_token.go b/tkg/aws/ini/empty_token.go deleted file mode 100644 index f6b1e9e71d..0000000000 --- a/tkg/aws/ini/empty_token.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -// emptyToken is used to satisfy the Token interface -var emptyToken = newToken(TokenNone, []rune{}, NoneType) diff --git a/tkg/aws/ini/expression.go b/tkg/aws/ini/expression.go deleted file mode 100644 index 76d75fab12..0000000000 --- a/tkg/aws/ini/expression.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -// newExpression will return an expression AST. -// Expr represents an expression -// -// grammar: -// expr -> string | number -func newExpression(tok Token) AST { - return newASTWithRootToken(ASTKindExpr, tok) -} - -func newEqualExpr(left *AST, tok Token) AST { - return newASTWithRootToken(ASTKindEqualExpr, tok, *left) -} - -// EqualExprKey will return a LHS value in the equal expr -func EqualExprKey(ast *AST) string { - children := ast.GetChildren() - if len(children) == 0 || ast.Kind != ASTKindEqualExpr { - return "" - } - - return string(children[0].Root.Raw()) -} diff --git a/tkg/aws/ini/fuzz.go b/tkg/aws/ini/fuzz.go deleted file mode 100644 index eb7cbf81f6..0000000000 --- a/tkg/aws/ini/fuzz.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//go:build gofuzz -// +build gofuzz - -package ini - -import ( - "bytes" -) - -// Fuzz defines fuzz -func Fuzz(data []byte) int { // nolint:docStub - b := bytes.NewReader(data) - - if _, err := Parse(b); err != nil { - return 0 - } - - return 1 -} diff --git a/tkg/aws/ini/ini.go b/tkg/aws/ini/ini.go deleted file mode 100644 index 1249c17468..0000000000 --- a/tkg/aws/ini/ini.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package ini is an internal package originally copied from aws-cli package -package ini - -import ( - "io" - "os" - - "github.com/aws/aws-sdk-go/aws/awserr" -) - -// OpenFile takes a path to a given file, and will open and parse -// that file. -func OpenFile(path string) (Sections, error) { - f, err := os.Open(path) - if err != nil { - return Sections{}, awserr.New(ErrCodeUnableToReadFile, "unable to open file", err) - } - defer f.Close() - - return Parse(f) -} - -// Parse will parse the given file using the shared config -// visitor. -func Parse(f io.Reader) (Sections, error) { - tree, err := ParseAST(f) - if err != nil { - return Sections{}, err - } - - v := NewDefaultVisitor() - if err := Walk(tree, v); err != nil { - return Sections{}, err - } - - return v.Sections, nil -} - -// ParseBytes will parse the given bytes and return the parsed sections. -func ParseBytes(b []byte) (Sections, error) { - tree, err := ParseASTBytes(b) - if err != nil { - return Sections{}, err - } - - v := NewDefaultVisitor() - if err := Walk(tree, v); err != nil { - return Sections{}, err - } - - return v.Sections, nil -} diff --git a/tkg/aws/ini/ini_lexer.go b/tkg/aws/ini/ini_lexer.go deleted file mode 100644 index 64c47e24b3..0000000000 --- a/tkg/aws/ini/ini_lexer.go +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -import ( - "bytes" - "io" - - "github.com/aws/aws-sdk-go/aws/awserr" -) - -const ( - // ErrCodeUnableToReadFile is used when a file is failed to be - // opened or read from. - ErrCodeUnableToReadFile = "FailedRead" -) - -// TokenType represents the various different tokens types -type TokenType int - -func (t TokenType) String() string { - switch t { - case TokenNone: - return NoneString - case TokenLit: - return "literal" - case TokenSep: - return "sep" - case TokenOp: - return "op" - case TokenWS: - return "ws" - case TokenNL: - return "newline" - case TokenComment: - return CommentString - case TokenComma: - return "comma" - default: - return "" - } -} - -// TokenType enums -const ( - TokenNone = TokenType(iota) - TokenLit - TokenSep - TokenComma - TokenOp - TokenWS - TokenNL - TokenComment -) - -type iniLexer struct{} - -// Tokenize will return a list of tokens during lexical analysis of the -// io.Reader. -func (l *iniLexer) Tokenize(r io.Reader) ([]Token, error) { - b, err := io.ReadAll(r) - if err != nil { - return nil, awserr.New(ErrCodeUnableToReadFile, "unable to read file", err) - } - - return l.tokenize(b) -} - -func (l *iniLexer) tokenize(b []byte) ([]Token, error) { - runes := bytes.Runes(b) - var err error - n := 0 - tokenAmount := countTokens(runes) - tokens := make([]Token, tokenAmount) - count := 0 - - for len(runes) > 0 && count < tokenAmount { - switch { - case isWhitespace(runes[0]): - tokens[count], n = newWSToken(runes) - case isComma(runes[0]): - tokens[count], n = newCommaToken(), 1 - case isComment(runes): - tokens[count], n = newCommentToken(runes) - case isNewline(runes): - tokens[count], n, err = newNewlineToken(runes) - case isSep(runes): - tokens[count], n, err = newSepToken(runes) - case isOp(runes): - tokens[count], n, err = newOpToken(runes) - default: - tokens[count], n, err = newLitToken(runes) - } - - if err != nil { - return nil, err - } - - count++ - - runes = runes[n:] - } - - return tokens[:count], nil -} - -func countTokens(runes []rune) int { - count, n := 0, 0 - var err error - - for len(runes) > 0 { - switch { - case isWhitespace(runes[0]): - _, n = newWSToken(runes) - case isComma(runes[0]): - _, n = newCommaToken(), 1 - case isComment(runes): - _, n = newCommentToken(runes) - case isNewline(runes): - _, n, err = newNewlineToken(runes) - case isSep(runes): - _, n, err = newSepToken(runes) - case isOp(runes): - _, n, err = newOpToken(runes) - default: - _, n, err = newLitToken(runes) - } - - if err != nil { - return 0 - } - - count++ - runes = runes[n:] - } - - return count + 1 -} - -// Token indicates a metadata about a given value. -type Token struct { - t TokenType - ValueType ValueType - base int - raw []rune -} - -func newToken(t TokenType, raw []rune, v ValueType) Token { - return Token{ - t: t, - raw: raw, - ValueType: v, - } -} - -// Raw return the raw runes that were consumed -func (tok Token) Raw() []rune { - return tok.raw -} - -// Type returns the token type -func (tok Token) Type() TokenType { - return tok.t -} diff --git a/tkg/aws/ini/ini_parser.go b/tkg/aws/ini/ini_parser.go deleted file mode 100644 index f5d9045500..0000000000 --- a/tkg/aws/ini/ini_parser.go +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -import ( - "fmt" - "io" -) - -// State enums for the parse table -const ( - InvalidState = iota - // stmt -> value stmt' - StatementState - // stmt' -> MarkComplete | op stmt - StatementPrimeState - // value -> number | string | boolean | quoted_string - ValueState - // section -> [ section' - OpenScopeState - // section' -> value section_close - SectionState - // section_close -> ] - CloseScopeState - // SkipState will skip (NL WS)+ - SkipState - // SkipTokenState will skip any token and push the previous - // state onto the stack. - SkipTokenState - // comment -> # comment' | ; comment' - // comment' -> MarkComplete | value - CommentState - // MarkComplete state will complete statements and move that - // to the completed AST list - MarkCompleteState - // TerminalState signifies that the tokens have been fully parsed - TerminalState -) - -// parseTable is a state machine to dictate the grammar above. -var parseTable = map[ASTKind]map[TokenType]int{ - ASTKindStart: { - TokenLit: StatementState, - TokenSep: OpenScopeState, - TokenWS: SkipTokenState, - TokenNL: SkipTokenState, - TokenComment: CommentState, - TokenNone: TerminalState, - }, - ASTKindCommentStatement: { - TokenLit: StatementState, - TokenSep: OpenScopeState, - TokenWS: SkipTokenState, - TokenNL: SkipTokenState, - TokenComment: CommentState, - TokenNone: MarkCompleteState, - }, - ASTKindExpr: { - TokenOp: StatementPrimeState, - TokenLit: ValueState, - TokenSep: OpenScopeState, - TokenWS: ValueState, - TokenNL: SkipState, - TokenComment: CommentState, - TokenNone: MarkCompleteState, - }, - ASTKindEqualExpr: { - TokenLit: ValueState, - TokenWS: SkipTokenState, - TokenNL: SkipState, - TokenNone: SkipState, - }, - ASTKindStatement: { - TokenLit: SectionState, - TokenSep: CloseScopeState, - TokenWS: SkipTokenState, - TokenNL: SkipTokenState, - TokenComment: CommentState, - TokenNone: MarkCompleteState, - }, - ASTKindExprStatement: { - TokenLit: ValueState, - TokenSep: OpenScopeState, - TokenOp: ValueState, - TokenWS: ValueState, - TokenNL: MarkCompleteState, - TokenComment: CommentState, - TokenNone: TerminalState, - TokenComma: SkipState, - }, - ASTKindSectionStatement: { - TokenLit: SectionState, - TokenOp: SectionState, - TokenSep: CloseScopeState, - TokenWS: SectionState, - TokenNL: SkipTokenState, - }, - ASTKindCompletedSectionStatement: { - TokenWS: SkipTokenState, - TokenNL: SkipTokenState, - TokenLit: StatementState, - TokenSep: OpenScopeState, - TokenComment: CommentState, - TokenNone: MarkCompleteState, - }, - ASTKindSkipStatement: { - TokenLit: StatementState, - TokenSep: OpenScopeState, - TokenWS: SkipTokenState, - TokenNL: SkipTokenState, - TokenComment: CommentState, - TokenNone: TerminalState, - }, -} - -// ParseAST will parse input from an io.Reader using -// an LL(1) parser. -func ParseAST(r io.Reader) ([]AST, error) { - lexer := iniLexer{} - tokens, err := lexer.Tokenize(r) - if err != nil { - return []AST{}, err - } - - return parse(tokens) -} - -// ParseASTBytes will parse input from a byte slice using -// an LL(1) parser. -func ParseASTBytes(b []byte) ([]AST, error) { - lexer := iniLexer{} - tokens, err := lexer.tokenize(b) - if err != nil { - return []AST{}, err - } - - return parse(tokens) -} - -func parse(tokens []Token) ([]AST, error) { //nolint:gocyclo,funlen - start := Start - stack := newParseStack(3, len(tokens)) - - stack.Push(&start) - s := newSkipper() - -loop: - for stack.Len() > 0 { - k := stack.Pop() - - var tok Token - if len(tokens) == 0 { - // this occurs when all the tokens have been processed - // but reduction of what's left on the stack needs to - // occur. - tok = emptyToken - } else { - tok = tokens[0] - } - - step := parseTable[k.Kind][tok.Type()] - if s.ShouldSkip(tok) { - // being in a skip state with no tokens will break out of - // the parse loop since there is nothing left to process. - if len(tokens) == 0 { - break loop - } - // if should skip is true, we skip the tokens until should skip is set to false. - step = SkipTokenState - } - - switch step { - case TerminalState: - // Finished parsing. Push what should be the last - // statement to the stack. If there is anything left - // on the stack, an error in parsing has occurred. - if k.Kind != ASTKindStart { - stack.MarkComplete(&k) - } - break loop - case SkipTokenState: - // When skipping a token, the previous state was popped off the stack. - // To maintain the correct state, the previous state will be pushed - // onto the stack. - stack.Push(&k) - case StatementState: - if k.Kind != ASTKindStart { - stack.MarkComplete(&k) - } - expr := newExpression(tok) - stack.Push(&expr) - case StatementPrimeState: - if tok.Type() != TokenOp { - stack.MarkComplete(&k) - continue - } - - if k.Kind != ASTKindExpr { - return nil, NewParseError( - fmt.Sprintf("invalid expression: expected Expr type, but found %T type", k), - ) - } - - k = trimSpaces(&k) - expr := newEqualExpr(&k, tok) - stack.Push(&expr) - case ValueState: - // ValueState requires the previous state to either be an equal expression - // or an expression statement. - // - // This grammar occurs when the RHS is a number, word, or quoted string. - // equal_expr -> lit op equal_expr' - // equal_expr' -> number | string | quoted_string - // quoted_string -> " quoted_string' - // quoted_string' -> string quoted_string_end - // quoted_string_end -> " - // - // otherwise - // expr_stmt -> equal_expr (expr_stmt')* - // expr_stmt' -> ws S | op S | MarkComplete - // S -> equal_expr' expr_stmt' - switch k.Kind { - case ASTKindEqualExpr: - // assigning a value to some key - ast := newExpression(tok) - k.AppendChild(&ast) - stmt := newExprStatement(&k) - stack.Push(&stmt) - case ASTKindExpr: - k.Root.raw = append(k.Root.raw, tok.Raw()...) - stack.Push(&k) - case ASTKindExprStatement: - root := k.GetRoot() - children := root.GetChildren() - if len(children) == 0 { - return nil, NewParseError( - fmt.Sprintf("invalid expression: AST contains no children %s", k.Kind), - ) - } - - rhs := children[len(children)-1] - - if rhs.Root.ValueType != QuotedStringType { - rhs.Root.ValueType = StringType - rhs.Root.raw = append(rhs.Root.raw, tok.Raw()...) - } - - children[len(children)-1] = rhs - k.SetChildren(children) - - stack.Push(&k) - } - case OpenScopeState: - if !runeCompare(tok.Raw(), openBrace) { - return nil, NewParseError("expected '['") - } - // If OpenScopeState is not at the start, we must mark the previous ast as complete - // - // for example: if previous ast was a skip statement; - // we should mark it as complete before we create a new statement - if k.Kind != ASTKindStart { - stack.MarkComplete(&k) - } - - stmt := newStatement() - stack.Push(&stmt) - case CloseScopeState: - if !runeCompare(tok.Raw(), closeBrace) { - return nil, NewParseError("expected ']'") - } - - k = trimSpaces(&k) - stmt := newCompletedSectionStatement(&k) - stack.Push(&stmt) - case SectionState: - var stmt AST - - switch k.Kind { - case ASTKindStatement: - // If there are multiple literals inside of a scope declaration, - // then the current token's raw value will be appended to the Name. - // - // This handles cases like [ profile default ] - // - // k will represent a SectionStatement with the children representing - // the label of the section - stmt = newSectionStatement(tok) - case ASTKindSectionStatement: - k.Root.raw = append(k.Root.raw, tok.Raw()...) - stmt = k - default: - return nil, NewParseError( - fmt.Sprintf("invalid statement: expected statement: %v", k.Kind), - ) - } - - stack.Push(&stmt) - case MarkCompleteState: - if k.Kind != ASTKindStart { - stack.MarkComplete(&k) - } - - if stack.Len() == 0 { - stack.Push(&start) - } - case SkipState: - stmt := newSkipStatement(&k) - stack.Push(&stmt) - s.Skip() - case CommentState: - if k.Kind == ASTKindStart { - stack.Push(&k) - } else { - stack.MarkComplete(&k) - } - - stmt := newCommentStatement(tok) - stack.Push(&stmt) - default: - return nil, NewParseError( - fmt.Sprintf("invalid state with ASTKind %v and TokenType %v", - k, tok.Type())) - } - - if len(tokens) > 0 { - tokens = tokens[1:] - } - } - - // this occurs when a statement has not been completed - if stack.top > 1 { - return nil, NewParseError("incomplete ini expression") - } - - // returns a sublist which excludes the start symbol - return stack.List(), nil -} - -// trimSpaces will trim spaces on the left and right hand side of -// the literal. -func trimSpaces(k *AST) AST { - // trim left hand side of spaces - for i := 0; i < len(k.Root.raw); i++ { - if !isWhitespace(k.Root.raw[i]) { - break - } - - k.Root.raw = k.Root.raw[1:] - i-- - } - - // trim right hand side of spaces - for i := len(k.Root.raw) - 1; i >= 0; i-- { - if !isWhitespace(k.Root.raw[i]) { - break - } - - k.Root.raw = k.Root.raw[:len(k.Root.raw)-1] - } - - return *k -} diff --git a/tkg/aws/ini/literal_tokens.go b/tkg/aws/ini/literal_tokens.go deleted file mode 100644 index b7bc4ee658..0000000000 --- a/tkg/aws/ini/literal_tokens.go +++ /dev/null @@ -1,326 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -import ( - "fmt" - "strconv" - "strings" -) - -var ( - runesTrue = []rune("true") - runesFalse = []rune("false") -) - -var literalValues = [][]rune{ - runesTrue, - runesFalse, -} - -func isBoolValue(b []rune) bool { - for _, lv := range literalValues { - if isLitValue(lv, b) { - return true - } - } - return false -} - -func isLitValue(want, have []rune) bool { - if len(have) < len(want) { - return false - } - - for i := 0; i < len(want); i++ { - if want[i] != have[i] { - return false - } - } - - return true -} - -// isNumberValue will return whether not the leading characters in -// a byte slice is a number. A number is delimited by whitespace or -// the newline token. -// -// A number is defined to be in a binary, octal, decimal (int | float), hex format, -// or in scientific notation. -func isNumberValue(b []rune) bool { //nolint - negativeIndex := 0 - helper := numberHelper{} - needDigit := false - - for i := 0; i < len(b); i++ { - negativeIndex++ - - switch b[i] { - case '-': - if helper.IsNegative() || negativeIndex != 1 { - return false - } - _ = helper.Determine(b[i]) - needDigit = true - continue - case 'e', 'E': - if err := helper.Determine(b[i]); err != nil { - return false - } - negativeIndex = 0 - needDigit = true - continue - case 'b': - if helper.numberFormat == hex { - break - } - fallthrough - case 'o', 'x': - if i == 0 { - return false - } - - fallthrough - case '.': - if err := helper.Determine(b[i]); err != nil { - return false - } - needDigit = true - continue - } - - if i > 0 && (isNewline(b[i:]) || isWhitespace(b[i])) { - return !needDigit - } - - if !helper.CorrectByte(b[i]) { - return false - } - needDigit = false - } - - return !needDigit -} - -func isValid(b []rune) (bool, int) { - if len(b) == 0 { - // TODO: should probably return an error - return false, 0 - } - - return isValidRune(b[0]), 1 -} - -func isValidRune(r rune) bool { - return r != ':' && r != '=' && r != '[' && r != ']' && r != ' ' && r != '\n' -} - -// ValueType is an enum that will signify what type -// the Value is -type ValueType int - -func (v ValueType) String() string { - switch v { - case NoneType: - return "NONE" - case DecimalType: - return "FLOAT" - case IntegerType: - return "INT" - case StringType: - return "STRING" - case BoolType: - return "BOOL" - } - - return "" -} - -// ValueType enums -const ( - NoneType = ValueType(iota) - DecimalType - IntegerType - StringType - QuotedStringType - BoolType -) - -// Value is a union container -type Value struct { - Type ValueType - raw []rune - - integer int64 - decimal float64 - boolean bool - str string -} - -func newValue(t ValueType, base int, raw []rune) (Value, error) { - v := Value{ - Type: t, - raw: raw, - } - var err error - - switch t { - case DecimalType: - v.decimal, err = strconv.ParseFloat(string(raw), 64) - case IntegerType: - if base != 10 { - raw = raw[2:] - } - - v.integer, err = strconv.ParseInt(string(raw), base, 64) - case StringType: - v.str = string(raw) - case QuotedStringType: - v.str = string(raw[1 : len(raw)-1]) - case BoolType: - v.boolean = runeCompare(v.raw, runesTrue) - } - - // issue 2253 - // - // if the value trying to be parsed is too large, then we will use - // the 'StringType' and raw value instead. - if nerr, ok := err.(*strconv.NumError); ok && nerr.Err == strconv.ErrRange { - v.Type = StringType - v.str = string(raw) - err = nil - } - - return v, err -} - -// Append will append values and change the type to a string -// type. -func (v *Value) Append(tok Token) { - r := tok.Raw() - if v.Type != QuotedStringType { - v.Type = StringType - r = tok.raw[1 : len(tok.raw)-1] - } - if tok.Type() != TokenLit { - v.raw = append(v.raw, tok.Raw()...) - } else { - v.raw = append(v.raw, r...) - } -} - -func (v Value) String() string { - switch v.Type { - case DecimalType: - return fmt.Sprintf("decimal: %f", v.decimal) - case IntegerType: - return fmt.Sprintf("integer: %d", v.integer) - case StringType: - return fmt.Sprintf("string: %s", string(v.raw)) - case QuotedStringType: - return fmt.Sprintf("quoted string: %s", string(v.raw)) - case BoolType: - return fmt.Sprintf("bool: %t", v.boolean) - default: - return "union not set" - } -} - -func newLitToken(b []rune) (Token, int, error) { - n := 0 - var err error - - token := Token{} - if b[0] == '"' { - n, err = getStringValue(b) - if err != nil { - return token, n, err - } - - token = newToken(TokenLit, b[:n], QuotedStringType) - } else if isNumberValue(b) { - var base int - base, n, err = getNumericalValue(b) - if err != nil { - return token, 0, err - } - - value := b[:n] - vType := IntegerType - if contains(value, '.') || hasExponent(value) { - vType = DecimalType - } - token = newToken(TokenLit, value, vType) - token.base = base - } else if isBoolValue(b) { - n, err = getBoolValue(b) - - token = newToken(TokenLit, b[:n], BoolType) - } else { - n = getValue(b) - token = newToken(TokenLit, b[:n], StringType) - } - - return token, n, err -} - -// IntValue returns an integer value -func (v Value) IntValue() int64 { - return v.integer -} - -// FloatValue returns a float value -func (v Value) FloatValue() float64 { - return v.decimal -} - -// BoolValue returns a bool value -func (v Value) BoolValue() bool { - return v.boolean -} - -func isTrimmable(r rune) bool { - switch r { - case '\n', ' ': - return true - } - return false -} - -// StringValue returns the string value -func (v Value) StringValue() string { - switch v.Type { - case StringType: - return strings.TrimFunc(string(v.raw), isTrimmable) - case QuotedStringType: - // preserve all characters in the quotes - return string(removeEscapedCharacters(v.raw[1 : len(v.raw)-1])) - default: - return strings.TrimFunc(string(v.raw), isTrimmable) - } -} - -func contains(runes []rune, c rune) bool { - for i := 0; i < len(runes); i++ { - if runes[i] == c { - return true - } - } - - return false -} - -func runeCompare(v1, v2 []rune) bool { - if len(v1) != len(v2) { - return false - } - - for i := 0; i < len(v1); i++ { - if v1[i] != v2[i] { - return false - } - } - - return true -} diff --git a/tkg/aws/ini/newline_token.go b/tkg/aws/ini/newline_token.go deleted file mode 100644 index 9ffa9dad3a..0000000000 --- a/tkg/aws/ini/newline_token.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -func isNewline(b []rune) bool { - if len(b) == 0 { - return false - } - - if b[0] == '\n' { - return true - } - - if len(b) < 2 { - return false - } - - return b[0] == '\r' && b[1] == '\n' -} - -func newNewlineToken(b []rune) (Token, int, error) { - i := 1 - if b[0] == '\r' && isNewline(b[1:]) { - i++ - } - - if !isNewline(b[:i]) { - return emptyToken, 0, NewParseError("invalid new line token") - } - - return newToken(TokenNL, b[:i], NoneType), i, nil -} diff --git a/tkg/aws/ini/number_helper.go b/tkg/aws/ini/number_helper.go deleted file mode 100644 index 004048a722..0000000000 --- a/tkg/aws/ini/number_helper.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -import ( - "bytes" - "fmt" - "strconv" -) - -const ( - none = numberFormat(iota) - binary - octal - decimal - hex - exponent -) - -type numberFormat int - -// numberHelper is used to dictate what format a number is in -// and what to do for negative values. Since -1e-4 is a valid -// number, we cannot just simply check for duplicate negatives. -type numberHelper struct { - numberFormat numberFormat - - negative bool - negativeExponent bool -} - -func (b numberHelper) Exists() bool { - return b.numberFormat != none -} - -func (b numberHelper) IsNegative() bool { - return b.negative || b.negativeExponent -} - -func (b *numberHelper) Determine(c rune) error { - if b.Exists() { - return NewParseError(fmt.Sprintf("multiple number formats: 0%v", string(c))) - } - - switch c { - case 'b': - b.numberFormat = binary - case 'o': - b.numberFormat = octal - case 'x': - b.numberFormat = hex - case 'e', 'E': - b.numberFormat = exponent - case '-': - if b.numberFormat != exponent { - b.negative = true - } else { - b.negativeExponent = true - } - case '.': - b.numberFormat = decimal - default: - return NewParseError(fmt.Sprintf("invalid number character: %v", string(c))) - } - - return nil -} - -func (b numberHelper) CorrectByte(c rune) bool { //nolint - switch { - case b.numberFormat == binary: - if !isBinaryByte(c) { - return false - } - case b.numberFormat == octal: - if !isOctalByte(c) { - return false - } - case b.numberFormat == hex: - if !isHexByte(c) { - return false - } - case b.numberFormat == decimal: - if !isDigit(c) { - return false - } - case b.numberFormat == exponent: - if !isDigit(c) { - return false - } - case b.negativeExponent: - if !isDigit(c) { - return false - } - case b.negative: - if !isDigit(c) { - return false - } - default: - if !isDigit(c) { - return false - } - } - - return true -} - -func (b numberHelper) Base() int { - switch b.numberFormat { - case binary: - return 2 - case octal: - return 8 - case hex: - return 16 - default: - return 10 - } -} - -func (b numberHelper) String() string { - buf := bytes.Buffer{} - i := 0 - - switch b.numberFormat { - case binary: - i++ - buf.WriteString(strconv.Itoa(i) + ": binary format\n") - case octal: - i++ - buf.WriteString(strconv.Itoa(i) + ": octal format\n") - case hex: - i++ - buf.WriteString(strconv.Itoa(i) + ": hex format\n") - case exponent: - i++ - buf.WriteString(strconv.Itoa(i) + ": exponent format\n") - default: - i++ - buf.WriteString(strconv.Itoa(i) + ": integer format\n") - } - - if b.negative { - i++ - buf.WriteString(strconv.Itoa(i) + ": negative format\n") - } - - if b.negativeExponent { - i++ - buf.WriteString(strconv.Itoa(i) + ": negative exponent format\n") - } - - return buf.String() -} diff --git a/tkg/aws/ini/op_tokens.go b/tkg/aws/ini/op_tokens.go deleted file mode 100644 index 1996c6c519..0000000000 --- a/tkg/aws/ini/op_tokens.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -import ( - "fmt" -) - -var ( - equalOp = []rune("=") - equalColonOp = []rune(":") -) - -func isOp(b []rune) bool { - if len(b) == 0 { - return false - } - - switch b[0] { - case '=': - return true - case ':': - return true - default: - return false - } -} - -func newOpToken(b []rune) (Token, int, error) { - tok := Token{} - - switch b[0] { - case '=': - tok = newToken(TokenOp, equalOp, NoneType) - case ':': - tok = newToken(TokenOp, equalColonOp, NoneType) - default: - return tok, 0, NewParseError(fmt.Sprintf("unexpected op type, %v", b[0])) - } - return tok, 1, nil -} diff --git a/tkg/aws/ini/parse_error.go b/tkg/aws/ini/parse_error.go deleted file mode 100644 index 7dc8f86b35..0000000000 --- a/tkg/aws/ini/parse_error.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -import "fmt" - -const ( - // ErrCodeParseError is returned when a parsing error - // has occurred. - ErrCodeParseError = "INIParseError" -) - -// ParseError is an error which is returned during any part of -// the parsing process. -type ParseError struct { - msg string -} - -// NewParseError will return a new ParseError where message -// is the description of the error. -func NewParseError(message string) *ParseError { - return &ParseError{ - msg: message, - } -} - -// Code will return the ErrCodeParseError -func (err *ParseError) Code() string { - return ErrCodeParseError -} - -// Message returns the error's message -func (err *ParseError) Message() string { - return err.msg -} - -// OrigError return nothing since there will never be any -// original error. -func (err *ParseError) OrigError() error { - return nil -} - -func (err *ParseError) Error() string { - return fmt.Sprintf("%s: %s", err.Code(), err.Message()) -} diff --git a/tkg/aws/ini/parse_stack.go b/tkg/aws/ini/parse_stack.go deleted file mode 100644 index f3cc84e9b4..0000000000 --- a/tkg/aws/ini/parse_stack.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -import ( - "bytes" - "fmt" -) - -// ParseStack is a stack that contains a container, the stack portion, -// and the list which is the list of ASTs that have been successfully -// parsed. -type ParseStack struct { - top int - container []AST - list []AST - index int -} - -func newParseStack(sizeContainer, sizeList int) ParseStack { - return ParseStack{ - container: make([]AST, sizeContainer), - list: make([]AST, sizeList), - } -} - -// Pop will return and truncate the last container element. -func (s *ParseStack) Pop() AST { - s.top-- - return s.container[s.top] -} - -// Push will add the new AST to the container -func (s *ParseStack) Push(ast *AST) { - s.container[s.top] = *ast - s.top++ -} - -// MarkComplete will append the AST to the list of completed statements -func (s *ParseStack) MarkComplete(ast *AST) { - s.list[s.index] = *ast - s.index++ -} - -// List will return the completed statements -func (s ParseStack) List() []AST { - return s.list[:s.index] -} - -// Len will return the length of the container -func (s *ParseStack) Len() int { - return s.top -} - -func (s ParseStack) String() string { - buf := bytes.Buffer{} - for i, node := range s.list { - buf.WriteString(fmt.Sprintf("%d: %v\n", i+1, node)) - } - - return buf.String() -} diff --git a/tkg/aws/ini/sep_tokens.go b/tkg/aws/ini/sep_tokens.go deleted file mode 100644 index 788d2565a8..0000000000 --- a/tkg/aws/ini/sep_tokens.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -import ( - "fmt" -) - -func isSep(b []rune) bool { - if len(b) == 0 { - return false - } - - switch b[0] { - case '[', ']': - return true - default: - return false - } -} - -var ( - openBrace = []rune("[") - closeBrace = []rune("]") -) - -func newSepToken(b []rune) (Token, int, error) { - tok := Token{} - - switch b[0] { - case '[': - tok = newToken(TokenSep, openBrace, NoneType) - case ']': - tok = newToken(TokenSep, closeBrace, NoneType) - default: - return tok, 0, NewParseError(fmt.Sprintf("unexpected sep type, %v", b[0])) - } - return tok, 1, nil -} diff --git a/tkg/aws/ini/skipper.go b/tkg/aws/ini/skipper.go deleted file mode 100644 index abcfed9682..0000000000 --- a/tkg/aws/ini/skipper.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -// skipper is used to skip certain blocks of an ini file. -// Currently skipper is used to skip nested blocks of ini -// files. See example below -// -// [ foo ] -// nested = ; this section will be skipped -// a=b -// c=d -// bar=baz ; this will be included -type skipper struct { - shouldSkip bool - TokenSet bool - prevTok Token -} - -func newSkipper() skipper { - return skipper{ - prevTok: emptyToken, - } -} - -func (s *skipper) ShouldSkip(tok Token) bool { - // should skip state will be modified only if previous token was new line (NL); - // and the current token is not WhiteSpace (WS). - if s.shouldSkip && - s.prevTok.Type() == TokenNL && - tok.Type() != TokenWS { - s.Continue() - return false - } - s.prevTok = tok - return s.shouldSkip -} - -func (s *skipper) Skip() { - s.shouldSkip = true -} - -func (s *skipper) Continue() { - s.shouldSkip = false - // empty token is assigned as we return to default state, when should skip is false - s.prevTok = emptyToken -} diff --git a/tkg/aws/ini/statement.go b/tkg/aws/ini/statement.go deleted file mode 100644 index 9198e2e00c..0000000000 --- a/tkg/aws/ini/statement.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -// Statement is an empty AST mostly used for transitioning states. -func newStatement() AST { - return newAST(ASTKindStatement, &AST{}) -} - -// SectionStatement represents a section AST -func newSectionStatement(tok Token) AST { - return newASTWithRootToken(ASTKindSectionStatement, tok) -} - -// ExprStatement represents a completed expression AST -func newExprStatement(ast *AST) AST { - return newAST(ASTKindExprStatement, ast) -} - -// CommentStatement represents a comment in the ini definition. -// -// grammar: -// comment -> #comment' | ;comment' -// comment' -> epsilon | value -func newCommentStatement(tok Token) AST { - ast := newExpression(tok) - return newAST(ASTKindCommentStatement, &ast) -} - -// CompletedSectionStatement represents a completed section -func newCompletedSectionStatement(ast *AST) AST { - return newAST(ASTKindCompletedSectionStatement, ast) -} - -// SkipStatement is used to skip whole statements -func newSkipStatement(ast *AST) AST { - return newAST(ASTKindSkipStatement, ast) -} diff --git a/tkg/aws/ini/value_util.go b/tkg/aws/ini/value_util.go deleted file mode 100644 index 19e6e93e71..0000000000 --- a/tkg/aws/ini/value_util.go +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -import ( - "fmt" -) - -// getStringValue will return a quoted string and the amount -// of bytes read -// -// an error will be returned if the string is not properly formatted -func getStringValue(b []rune) (int, error) { - if b[0] != '"' { - return 0, NewParseError("strings must start with '\"'") - } - - endQuote := false - i := 1 - - for ; i < len(b) && !endQuote; i++ { - if escaped := isEscaped(b[:i], b[i]); b[i] == '"' && !escaped { - endQuote = true - break - } else if escaped { - continue - } - } - - if !endQuote { - return 0, NewParseError("missing '\"' in string value") - } - - return i + 1, nil -} - -// getBoolValue will return a boolean and the amount -// of bytes read -// -// an error will be returned if the boolean is not of a correct -// value -func getBoolValue(b []rune) (int, error) { - if len(b) < 4 { - return 0, NewParseError("invalid boolean value") - } - - n := 0 - for _, lv := range literalValues { - if len(lv) > len(b) { - continue - } - - if isLitValue(lv, b) { - n = len(lv) - } - } - - if n == 0 { - return 0, NewParseError("invalid boolean value") - } - - return n, nil -} - -// getNumericalValue will return a numerical string, the amount -// of bytes read, and the base of the number -// -// an error will be returned if the number is not of a correct -// value -func getNumericalValue(b []rune) (int, int, error) { //nolint - if !isDigit(b[0]) { - return 0, 0, NewParseError("invalid digit value") - } - - i := 0 - helper := numberHelper{} - -loop: - for negativeIndex := 0; i < len(b); i++ { - negativeIndex++ - - if !isDigit(b[i]) { - switch b[i] { - case '-': - if helper.IsNegative() || negativeIndex != 1 { - return 0, 0, NewParseError("parse error '-'") - } - - n := getNegativeNumber(b[i:]) - i += (n - 1) - _ = helper.Determine(b[i]) - continue - case '.': - if err := helper.Determine(b[i]); err != nil { - return 0, 0, err - } - case 'e', 'E': - if err := helper.Determine(b[i]); err != nil { - return 0, 0, err - } - - negativeIndex = 0 - case 'b': - if helper.numberFormat == hex { - break - } - fallthrough - case 'o', 'x': - if i == 0 && b[i] != '0' { - return 0, 0, NewParseError("incorrect base format, expected leading '0'") - } - - if i != 1 { - return 0, 0, NewParseError(fmt.Sprintf("incorrect base format found %s at %d index", string(b[i]), i)) - } - - if err := helper.Determine(b[i]); err != nil { - return 0, 0, err - } - default: - if isWhitespace(b[i]) { - break loop - } - - if isNewline(b[i:]) { - break loop - } - - if !(helper.numberFormat == hex && isHexByte(b[i])) { - if i+2 < len(b) && !isNewline(b[i:i+2]) { - return 0, 0, NewParseError("invalid numerical character") - } else if !isNewline([]rune{b[i]}) { - return 0, 0, NewParseError("invalid numerical character") - } - - break loop - } - } - } - } - - return helper.Base(), i, nil -} - -// isDigit will return whether or not something is an integer -func isDigit(b rune) bool { - return b >= '0' && b <= '9' -} - -func hasExponent(v []rune) bool { - return contains(v, 'e') || contains(v, 'E') -} - -func isBinaryByte(b rune) bool { - switch b { - case '0', '1': - return true - default: - return false - } -} - -func isOctalByte(b rune) bool { - switch b { - case '0', '1', '2', '3', '4', '5', '6', '7': - return true - default: - return false - } -} - -func isHexByte(b rune) bool { - if isDigit(b) { - return true - } - return (b >= 'A' && b <= 'F') || - (b >= 'a' && b <= 'f') -} - -func getValue(b []rune) int { - i := 0 - - for i < len(b) { - if isNewline(b[i:]) { - break - } - - if isOp(b[i:]) { - break - } - - valid, n := isValid(b[i:]) - if !valid { - break - } - - i += n - } - - return i -} - -// getNegativeNumber will return a negative number from a -// byte slice. This will iterate through all characters until -// a non-digit has been found. -func getNegativeNumber(b []rune) int { - if b[0] != '-' { - return 0 - } - - i := 1 - for ; i < len(b); i++ { - if !isDigit(b[i]) { - return i - } - } - - return i -} - -// isEscaped will return whether or not the character is an escaped -// character. -func isEscaped(value []rune, b rune) bool { - if len(value) == 0 { - return false - } - - switch b { - case '\'': // single quote - case '"': // quote - case 'n': // newline - case 't': // tab - case '\\': // backslash - default: - return false - } - - return value[len(value)-1] == '\\' -} - -func getEscapedByte(b rune) (rune, error) { - switch b { - case '\'': // single quote - return '\'', nil - case '"': // quote - return '"', nil - case 'n': // newline - return '\n', nil - case 't': // table - return '\t', nil - case '\\': // backslash - return '\\', nil - default: - return b, NewParseError(fmt.Sprintf("invalid escaped character %c", b)) - } -} - -func removeEscapedCharacters(b []rune) []rune { - for i := 0; i < len(b); i++ { - if !isEscaped(b[:i], b[i]) { - continue - } - c, err := getEscapedByte(b[i]) - if err != nil { - return b - } - - b[i-1] = c - b = append(b[:i], b[i+1:]...) - i-- - } - - return b -} diff --git a/tkg/aws/ini/visitor.go b/tkg/aws/ini/visitor.go deleted file mode 100644 index 6ae2dcb68c..0000000000 --- a/tkg/aws/ini/visitor.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -import ( - "fmt" - "sort" -) - -// Visitor is an interface used by walkers that will -// traverse an array of ASTs. -type Visitor interface { - VisitExpr(*AST) error - VisitStatement(*AST) error -} - -// DefaultVisitor is used to visit statements and expressions -// and ensure that they are both of the correct format. -// In addition, upon visiting this will build sections and populate -// the Sections field which can be used to retrieve profile -// configuration. -type DefaultVisitor struct { - scope string - Sections Sections -} - -// NewDefaultVisitor return a DefaultVisitor -func NewDefaultVisitor() *DefaultVisitor { - return &DefaultVisitor{ - Sections: Sections{ - container: map[string]Section{}, - }, - } -} - -// VisitExpr visits expressions... -func (v *DefaultVisitor) VisitExpr(expr *AST) error { - t := v.Sections.container[v.scope] - if t.values == nil { - t.values = values{} - } - - switch expr.Kind { - case ASTKindExprStatement: - opExpr := expr.GetRoot() - switch opExpr.Kind { - case ASTKindEqualExpr: - children := opExpr.GetChildren() - if len(children) <= 1 { - return NewParseError("unexpected token type") - } - - rhs := children[1] - - if rhs.Root.Type() != TokenLit { - return NewParseError("unexpected token type") - } - - key := EqualExprKey(&opExpr) - v, err := newValue(rhs.Root.ValueType, rhs.Root.base, rhs.Root.Raw()) - if err != nil { - return err - } - - t.values[key] = v - default: - return NewParseError(fmt.Sprintf("unsupported expression %v", expr)) - } - default: - return NewParseError(fmt.Sprintf("unsupported expression %v", expr)) - } - - v.Sections.container[v.scope] = t - return nil -} - -// VisitStatement visits statements... -func (v *DefaultVisitor) VisitStatement(stmt *AST) error { - switch stmt.Kind { - case ASTKindCompletedSectionStatement: - child := stmt.GetRoot() - if child.Kind != ASTKindSectionStatement { - return NewParseError(fmt.Sprintf("unsupported child statement: %T", child)) - } - - name := string(child.Root.Raw()) - v.Sections.container[name] = Section{} - v.scope = name - default: - return NewParseError(fmt.Sprintf("unsupported statement: %s", stmt.Kind)) - } - - return nil -} - -// Sections is a map of Section structures that represent -// a configuration. -type Sections struct { - container map[string]Section -} - -// GetSection will return section p. If section p does not exist, -// false will be returned in the second parameter. -func (t Sections) GetSection(p string) (Section, bool) { - v, ok := t.container[p] - return v, ok -} - -// values represents a map of union values. -type values map[string]Value - -// List will return a list of all sections that were successfully -// parsed. -func (t Sections) List() []string { - keys := make([]string, len(t.container)) - i := 0 - for k := range t.container { - keys[i] = k - i++ - } - - sort.Strings(keys) - return keys -} - -// Section contains a name and values. This represent -// a sectioned entry in a configuration file. -type Section struct { - Name string - values values -} - -// Has will return whether or not an entry exists in a given section -func (t Section) Has(k string) bool { - _, ok := t.values[k] - return ok -} - -// ValueType will returned what type the union is set to. If -// k was not found, the NoneType will be returned. -func (t Section) ValueType(k string) (ValueType, bool) { - v, ok := t.values[k] - return v.Type, ok -} - -// Bool returns a bool value at k -func (t Section) Bool(k string) bool { - return t.values[k].BoolValue() -} - -// Int returns an integer value at k -func (t Section) Int(k string) int64 { - return t.values[k].IntValue() -} - -// Float64 returns a float value at k -func (t Section) Float64(k string) float64 { - return t.values[k].FloatValue() -} - -// String returns the string value at k -func (t Section) String(k string) string { - _, ok := t.values[k] - if !ok { - return "" - } - return t.values[k].StringValue() -} diff --git a/tkg/aws/ini/walker.go b/tkg/aws/ini/walker.go deleted file mode 100644 index 172bc583bb..0000000000 --- a/tkg/aws/ini/walker.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -// Walk will traverse the AST using the v, the Visitor. -func Walk(tree []AST, v Visitor) error { - for i := range tree { - switch tree[i].Kind { - case ASTKindExpr, - ASTKindExprStatement: - - if err := v.VisitExpr(&tree[i]); err != nil { - return err - } - case ASTKindStatement, - ASTKindCompletedSectionStatement, - ASTKindNestedSectionStatement, - ASTKindCompletedNestedSectionStatement: - - if err := v.VisitStatement(&tree[i]); err != nil { - return err - } - } - } - - return nil -} diff --git a/tkg/aws/ini/ws_token.go b/tkg/aws/ini/ws_token.go deleted file mode 100644 index db9524f052..0000000000 --- a/tkg/aws/ini/ws_token.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ini - -import ( - "unicode" -) - -// isWhitespace will return whether or not the character is -// a whitespace character. -// -// Whitespace is defined as a space or tab. -func isWhitespace(c rune) bool { - return unicode.IsSpace(c) && c != '\n' && c != '\r' -} - -func newWSToken(b []rune) (Token, int) { - i := 0 - for ; i < len(b); i++ { - if !isWhitespace(b[i]) { - break - } - } - - return newToken(TokenWS, b[:i], NoneType), i -} diff --git a/tkg/aws/interface.go b/tkg/aws/interface.go deleted file mode 100644 index 8bd25b09f2..0000000000 --- a/tkg/aws/interface.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package aws defines functions to connect to the AWS cloud provider -package aws - -import ( - "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/cloudformation/bootstrap" - - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -//go:generate counterfeiter -o ../fakes/awsclient.go --fake-name AWSClient . Client - -// Client defines methods to access AWS inventory -type Client interface { - VerifyAccount() error - ListVPCs() ([]*models.Vpc, error) - EncodeCredentials() (string, error) - ListAvailabilityZones() ([]*models.AWSAvailabilityZone, error) - ListRegionsByUser() ([]string, error) - GetSubnetGatewayAssociations(vpcID string) (map[string]bool, error) - ListSubnets(vpcID string) ([]*models.AWSSubnet, error) - CreateCloudFormationStack() error - CreateCloudFormationStackWithTemplate(template *bootstrap.Template) error - GenerateBootstrapTemplate(i GenerateBootstrapTemplateInput) (*bootstrap.Template, error) - ListInstanceTypes(optionalAZName string) ([]string, error) - ListCloudFormationStacks() ([]string, error) -} diff --git a/tkg/aws/profiles.go b/tkg/aws/profiles.go deleted file mode 100644 index 420fdd5463..0000000000 --- a/tkg/aws/profiles.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package aws - -import ( - "os" - "path/filepath" - "runtime" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/aws/ini" -) - -func getCredentialSections(filename string) (ini.Sections, error) { - if filename == "" { - filename = credentialsFilename() - } - return ini.OpenFile(filename) -} - -// ListCredentialProfiles lists the name of all profiles in the credential files -func ListCredentialProfiles(filename string) ([]string, error) { - config, err := getCredentialSections(filename) - if err != nil { - return []string{}, errors.Wrap(err, "failed to load shared credentials file") - } - return config.List(), nil -} - -func credentialsFilename() string { - if filename := os.Getenv("AWS_SHARED_CREDENTIALS_FILE"); filename != "" { - return filename - } - - return filepath.Join(userHomeDir(), ".aws", "credentials") -} - -func userHomeDir() string { - if runtime.GOOS == "windows" { // Windows - return os.Getenv("USERPROFILE") - } - - // *nix - return os.Getenv("HOME") -} diff --git a/tkg/aws/profiles_test.go b/tkg/aws/profiles_test.go deleted file mode 100644 index e420dfd09c..0000000000 --- a/tkg/aws/profiles_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package aws_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -var _ = Describe("ListCredentialProfiles", func() { - var ( - err error - fileName string - result []string - ) - - JustBeforeEach(func() { - result, err = aws.ListCredentialProfiles(fileName) - }) - - Context("when the filename is specified", func() { - BeforeEach(func() { - fileName = "../fakes/config/aws_credentials" - }) - It("should return the correct list of profile names", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(len(result)).To(Equal(2)) - Expect(result).To(ConsistOf([]string{constants.DefaultNamespace, "test"})) - }) - }) -}) diff --git a/tkg/azure/client.go b/tkg/azure/client.go deleted file mode 100644 index 77799c8e50..0000000000 --- a/tkg/azure/client.go +++ /dev/null @@ -1,342 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package azure - -//nolint:staticcheck -import ( - "context" - "strings" - - "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute" - "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute/computeapi" - "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-11-01/network" - "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-11-01/network/networkapi" - "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-05-01/resources" - "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-05-01/resources/resourcesapi" - "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-11-01/subscriptions" - "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-11-01/subscriptions/subscriptionsapi" - - "github.com/Azure/go-autorest/autorest" - "github.com/Azure/go-autorest/autorest/azure" - "github.com/Azure/go-autorest/autorest/azure/auth" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -const ( - // ResourceTypeVirtualMachine defines virtualMachines resource type - ResourceTypeVirtualMachine = "virtualMachines" -) - -const ( - // ChinaCloud defines China cloud - ChinaCloud = "AzureChinaCloud" - // GermanCloud defines German cloud - GermanCloud = "AzureGermanCloud" - // PublicCloud defines Public cloud - PublicCloud = "AzurePublicCloud" - // USGovernmentCloud defines US Government cloud - USGovernmentCloud = "AzureUSGovernmentCloud" -) - -// Supported Azure VM family types -var supportedVMFamilyTypes = map[string]bool{ - "standardDSv3Family": true, - "standardFSv2Family": true, -} - -type client struct { - SubscriptionID string - Authorizer autorest.Authorizer - ResourceGroupsClient resourcesapi.GroupsClientAPI - VirtualNetworksClient networkapi.VirtualNetworksClientAPI - ResourceSkusClient computeapi.ResourceSkusClientAPI - SubscriptionsClient subscriptionsapi.ClientAPI -} - -// Credentials defines azure credentials -type Credentials struct { - SubscriptionID string - ClientID string - ClientSecret string - TenantID string - AzureCloud string -} - -// New creates an Azure client -func New(creds *Credentials) (Client, error) { - if creds.AzureCloud == "" { - creds.AzureCloud = PublicCloud - } - - clientCredentialsConfig := auth.NewClientCredentialsConfig(creds.ClientID, creds.ClientSecret, creds.TenantID) - if err := setActiveDirectoryEndpoint(&clientCredentialsConfig, creds.AzureCloud); err != nil { - return nil, err - } - - authorizer, err := clientCredentialsConfig.Authorizer() - if err != nil { - return nil, err - } - - // Initialize resourceGroup client - resourceGroupsClient := resources.NewGroupsClientWithBaseURI(clientCredentialsConfig.Resource, creds.SubscriptionID) - resourceGroupsClient.Authorizer = authorizer - - // Initialize virtualNetwork client - virtualNetworkClient := network.NewVirtualNetworksClientWithBaseURI(clientCredentialsConfig.Resource, creds.SubscriptionID) - virtualNetworkClient.Authorizer = authorizer - - // Initialize resourceSkus client - skuClient := compute.NewResourceSkusClientWithBaseURI(clientCredentialsConfig.Resource, creds.SubscriptionID) - skuClient.Authorizer = authorizer - - // Initialize subscription client - subscriptionClient := subscriptions.NewClientWithBaseURI(clientCredentialsConfig.Resource) - subscriptionClient.Authorizer = authorizer - - return &client{ - SubscriptionID: creds.SubscriptionID, - Authorizer: authorizer, - ResourceGroupsClient: resourceGroupsClient, - VirtualNetworksClient: virtualNetworkClient, - ResourceSkusClient: skuClient, - SubscriptionsClient: subscriptionClient, - }, nil -} - -func setActiveDirectoryEndpoint(config *auth.ClientCredentialsConfig, azureCloud string) error { - switch azureCloud { - case USGovernmentCloud: - config.Resource = azure.USGovernmentCloud.ResourceManagerEndpoint - config.AADEndpoint = azure.USGovernmentCloud.ActiveDirectoryEndpoint - case ChinaCloud: - config.Resource = azure.ChinaCloud.ResourceManagerEndpoint - config.AADEndpoint = azure.ChinaCloud.ActiveDirectoryEndpoint - case GermanCloud: - config.Resource = azure.GermanCloud.ResourceManagerEndpoint - config.AADEndpoint = azure.GermanCloud.ActiveDirectoryEndpoint - case PublicCloud: - config.Resource = azure.PublicCloud.ResourceManagerEndpoint - config.AADEndpoint = azure.PublicCloud.ActiveDirectoryEndpoint - default: - return errors.Errorf("%q is not a supported cloud in Azure. Supported clouds are AzurePublicCloud, AzureUSGovernmentCloud, AzureGermanCloud, AzureChinaCloud", azureCloud) - } - return nil -} - -// verifies azure credentials by fetching the list of resource groups available -func (c *client) VerifyAccount(ctx context.Context) error { - // fetching just one resource group for efficiency - var resultCount int32 = 1 - _, err := c.ResourceGroupsClient.ListComplete(ctx, "", &resultCount) - return err -} - -// List all the resource groups -func (c *client) ListResourceGroups(ctx context.Context, location string) ([]*models.AzureResourceGroup, error) { - var resourceGroups []*models.AzureResourceGroup - - rg, err := c.ResourceGroupsClient.ListComplete(ctx, "", nil) - if err != nil { - return nil, errors.Wrap(err, "unable to fetch resource groups") - } - - for rg.NotDone() { - resourceGroup := &models.AzureResourceGroup{ - ID: *rg.Value().ID, - Location: rg.Value().Location, - Name: rg.Value().Name, - } - - // Filter resource groups based on location if it not empty - if location == "" || *resourceGroup.Location == location { - resourceGroups = append(resourceGroups, resourceGroup) - } - if err := rg.NextWithContext(ctx); err != nil { - return nil, errors.Wrap(err, "unable to fetch resource groups") - } - } - return resourceGroups, nil -} - -// Create a resource group -func (c *client) CreateResourceGroup(ctx context.Context, resourceGroupName, location string) error { - rgParameters := resources.Group{ - Location: &location, - } - - _, err := c.ResourceGroupsClient.CreateOrUpdate(ctx, resourceGroupName, rgParameters) - return err -} - -// List all virtual networks in a resource group -func (c *client) ListVirtualNetworks(ctx context.Context, resourceGroup, location string) ([]*models.AzureVirtualNetwork, error) { - var virtualNetworks []*models.AzureVirtualNetwork - vnet, err := c.VirtualNetworksClient.ListComplete(ctx, resourceGroup) - if err != nil { - return nil, errors.Wrap(err, "unable to fetch virtual networks") - } - - for ; vnet.NotDone(); err = vnet.NextWithContext(ctx) { - if err != nil { - return nil, errors.Wrap(err, "unable to fetch virtual networks") - } - - // Filter virtual networks based on location if it not empty - if location != "" && *vnet.Value().Location != location { - continue - } - - virtualNetwork := &models.AzureVirtualNetwork{ - ID: *vnet.Value().ID, - Location: vnet.Value().Location, - Name: vnet.Value().Name, - } - - if vnet.Value().Subnets != nil { - var azureSubnets []*models.AzureSubnet - for _, s := range *vnet.Value().Subnets { - azureSubnet := models.AzureSubnet{ - Name: *s.Name, - Cidr: *s.AddressPrefix, - } - azureSubnets = append(azureSubnets, &azureSubnet) - } - virtualNetwork.Subnets = azureSubnets - } - - virtualNetworks = append(virtualNetworks, virtualNetwork) - } - return virtualNetworks, nil -} - -// Create a virtual network -func (c *client) CreateVirtualNetwork(ctx context.Context, resourceGroupName, virtualNetworkName, cidrBlock, location string) error { - vnetClient := network.NewVirtualNetworksClient(c.SubscriptionID) - vnetClient.Authorizer = c.Authorizer - - addressPrefixes := []string{cidrBlock} - vnetParams := network.VirtualNetwork{ - VirtualNetworkPropertiesFormat: &network.VirtualNetworkPropertiesFormat{ - AddressSpace: &network.AddressSpace{ - AddressPrefixes: &addressPrefixes, - }, - }, - Location: &location, - } - future, err := vnetClient.CreateOrUpdate(ctx, resourceGroupName, virtualNetworkName, vnetParams) - if err != nil { - return err - } - - err = future.WaitForCompletionRef(ctx, vnetClient.Client) - return err -} - -func (c *client) GetAzureRegions(ctx context.Context) ([]*models.AzureLocation, error) { - regions := make(map[string]string) - result := make([]*models.AzureLocation, 0) - - // list all available locations - locationsResult, err := c.SubscriptionsClient.ListLocations(ctx, c.SubscriptionID) - if err != nil { - return nil, errors.Wrap(err, "unable to fetch Azure regions") - } - - for _, location := range *locationsResult.Value { - regions[strings.ToLower(*location.Name)] = *location.DisplayName - } - - sku, err := c.ResourceSkusClient.ListComplete(ctx, "") - if err != nil { - return nil, errors.Wrap(err, "unable to fetch Azure regions") - } - - for sku.NotDone() { - if *sku.Value().ResourceType == ResourceTypeVirtualMachine { - if _, ok := supportedVMFamilyTypes[*sku.Value().Family]; ok { - for _, locationInfo := range *sku.Value().LocationInfo { - includeRegion := true - if *sku.Value().Restrictions != nil { - for _, restriction := range *sku.Value().Restrictions { - if restriction.Type == compute.Location { - includeRegion = false - break - } - } - } - - // don't include restricted regions - if !includeRegion { - continue - } - - location := strings.ToLower(*locationInfo.Location) - if displayName, ok := regions[location]; ok { - result = append(result, &models.AzureLocation{ - Name: location, - DisplayName: displayName, - }) - delete(regions, location) - } - } - } - } - - if err := sku.NextWithContext(ctx); err != nil { - return nil, errors.Wrap(err, "unable to fetch Azure regions") - } - } - - return result, nil -} - -// List all instance types for a region -func (c *client) GetAzureInstanceTypesForRegion(ctx context.Context, region string) ([]*models.AzureInstanceType, error) { - filter := "location eq '" + region + "'" - sku, err := c.ResourceSkusClient.ListComplete(ctx, filter) - if err != nil { - return nil, errors.Wrap(err, "unable to fetch Azure regions") - } - - var instanceTypes []*models.AzureInstanceType - - for sku.NotDone() { - if *sku.Value().ResourceType == ResourceTypeVirtualMachine { - if _, ok := supportedVMFamilyTypes[*sku.Value().Family]; ok { - for _, locationInfo := range *sku.Value().LocationInfo { - instanceType := &models.AzureInstanceType{ - Family: *sku.Value().Family, - Name: *sku.Value().Name, - Size: *sku.Value().Size, - Tier: *sku.Value().Tier, - Zones: *locationInfo.Zones, - } - - includeInstanceType := true - if *sku.Value().Restrictions != nil { - for _, restriction := range *sku.Value().Restrictions { - if restriction.Type == compute.Location { - includeInstanceType = false - break - } - } - } - - // don't include restricted instance types - if includeInstanceType { - instanceTypes = append(instanceTypes, instanceType) - } - } - } - } - - if err := sku.NextWithContext(ctx); err != nil { - return nil, errors.Wrap(err, "unable to fetch Azure regions") - } - } - return instanceTypes, nil -} diff --git a/tkg/azure/client_test.go b/tkg/azure/client_test.go deleted file mode 100644 index 681eac82e5..0000000000 --- a/tkg/azure/client_test.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package azure - -//nolint:staticcheck -import ( - "context" - "errors" - "testing" - - "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute" - "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-11-01/network" - "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-05-01/resources" - "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-11-01/subscriptions" - autorest "github.com/Azure/go-autorest/autorest/azure" - "github.com/Azure/go-autorest/autorest/azure/auth" - "github.com/golang/mock/gomock" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - azure "github.com/vmware-tanzu/tanzu-framework/tkg/azure/mocks" -) - -var ( - ctrl *gomock.Controller - mockGroupsClient *azure.MockGroupsClientAPI - mockVnetsClient *azure.MockVirtualNetworksClientAPI - mockResourceSkusClient *azure.MockResourceSkusClientAPI - mockSubscriptionClient *azure.MockClientAPI - azureClient client -) - -func TestKind(t *testing.T) { - RegisterFailHandler(Fail) - ctrl = gomock.NewController(t) - RunSpecs(t, "Azure client Suite") -} - -var _ = Describe("Azure client", func() { - BeforeSuite(func() { - mockGroupsClient = azure.NewMockGroupsClientAPI(ctrl) - mockVnetsClient = azure.NewMockVirtualNetworksClientAPI(ctrl) - mockResourceSkusClient = azure.NewMockResourceSkusClientAPI(ctrl) - mockSubscriptionClient = azure.NewMockClientAPI(ctrl) - azureClient = client{ - ResourceGroupsClient: mockGroupsClient, - VirtualNetworksClient: mockVnetsClient, - ResourceSkusClient: mockResourceSkusClient, - SubscriptionsClient: mockSubscriptionClient, - } - }) - - Describe("Verifying Azure account", func() { - groupListResultPage := resources.GroupListResultPage{} - groupListIterator := resources.NewGroupListResultIterator(groupListResultPage) - - Context("with correct credentials", func() { - It("shoud not return error", func() { - mockGroupsClient.EXPECT().ListComplete(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(groupListIterator, nil) - - err := azureClient.VerifyAccount(context.Background()) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("with incorrect credentials", func() { - It("should return error", func() { - mockGroupsClient.EXPECT().ListComplete(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(groupListIterator, errors.New("failed")) - - err := azureClient.VerifyAccount(context.Background()) - Expect(err).To(HaveOccurred()) - }) - }) - }) - - Describe("List all resource groups", func() { - groupListResultPage := resources.GroupListResultPage{} - groupListIterator := resources.NewGroupListResultIterator(groupListResultPage) - - Context("with successful response from server", func() { - It("should not return error", func() { - mockGroupsClient.EXPECT().ListComplete(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(groupListIterator, nil) - - resourceGroups, err := azureClient.ListResourceGroups(context.Background(), "uswest2") - Expect(err).ToNot(HaveOccurred()) - Expect(len(resourceGroups)).To(Equal(0)) - }) - }) - }) - - Describe("Create resource group", func() { - Context("with successful response from server", func() { - It("should not return error", func() { - group := resources.Group{} - mockGroupsClient.EXPECT().CreateOrUpdate(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(group, nil) - - err := azureClient.CreateResourceGroup(context.Background(), "ResourceGroup", "uswest2") - Expect(err).ToNot(HaveOccurred()) - }) - }) - }) - - Describe("List all virtual networks", func() { - vnetListResultPage := network.VirtualNetworkListResultPage{} - vnetListIterator := network.NewVirtualNetworkListResultIterator(vnetListResultPage) - - Context("with successful response from server", func() { - It("should not return error", func() { - mockVnetsClient.EXPECT().ListComplete(gomock.Any(), gomock.Any()).Times(1).Return(vnetListIterator, nil) - - vnets, err := azureClient.ListVirtualNetworks(context.Background(), "ResourceGroup", "uswest2") - Expect(err).ToNot(HaveOccurred()) - Expect(len(vnets)).To(Equal(0)) - }) - }) - }) - - Describe("Get Azure regions", func() { - resourceSkuResultPage := compute.ResourceSkusResultPage{} - resourceSkuIterator := compute.NewResourceSkusResultIterator(resourceSkuResultPage) - - locations := []subscriptions.Location{} - locationListResult := subscriptions.LocationListResult{ - Value: &locations, - } - Context("with successful response from server", func() { - It("should not return error", func() { - mockResourceSkusClient.EXPECT().ListComplete(gomock.Any(), gomock.Any()).Times(1).Return(resourceSkuIterator, nil) - mockSubscriptionClient.EXPECT().ListLocations(gomock.Any(), gomock.Any()).Times(1).Return(locationListResult, nil) - - regions, err := azureClient.GetAzureRegions(context.Background()) - Expect(err).ToNot(HaveOccurred()) - Expect(len(regions)).To(Equal(0)) - }) - }) - }) - - Describe("Get Azure Instance Types", func() { - resourceSkuResultPage := compute.ResourceSkusResultPage{} - resourceSkuIterator := compute.NewResourceSkusResultIterator(resourceSkuResultPage) - - Context("with successful response from server", func() { - It("should not return error", func() { - mockResourceSkusClient.EXPECT().ListComplete(gomock.Any(), gomock.Any()).Times(1).Return(resourceSkuIterator, nil) - - instanceTypes, err := azureClient.GetAzureInstanceTypesForRegion(context.Background(), "uswest2") - Expect(err).ToNot(HaveOccurred()) - Expect(len(instanceTypes)).To(Equal(0)) - }) - }) - }) - - Describe("setActiveDirectoryEndpoint", func() { - Context("with azureCloud set to 'dummy'", func() { - It("should return error", func() { - err := setActiveDirectoryEndpoint(nil, "dummy") - Expect(err).To(HaveOccurred()) - }) - }) - - Context("with azureCloud set to 'AzureUSGovernmentCloud'", func() { - It("should not return error", func() { - config := &auth.ClientCredentialsConfig{} - err := setActiveDirectoryEndpoint(config, "AzureUSGovernmentCloud") - Expect(err).ToNot(HaveOccurred()) - - Expect(config.Resource).To(Equal(autorest.USGovernmentCloud.ResourceManagerEndpoint)) - Expect(config.AADEndpoint).To(Equal(autorest.USGovernmentCloud.ActiveDirectoryEndpoint)) - }) - }) - - Context("with azureCloud set to 'AzurePublicCloud'", func() { - It("should not return error", func() { - config := &auth.ClientCredentialsConfig{} - err := setActiveDirectoryEndpoint(config, "AzurePublicCloud") - Expect(err).ToNot(HaveOccurred()) - - Expect(config.Resource).To(Equal(autorest.PublicCloud.ResourceManagerEndpoint)) - Expect(config.AADEndpoint).To(Equal(autorest.PublicCloud.ActiveDirectoryEndpoint)) - }) - }) - }) -}) diff --git a/tkg/azure/interface.go b/tkg/azure/interface.go deleted file mode 100644 index 6acec78947..0000000000 --- a/tkg/azure/interface.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package azure defines client to connect to Azure cloud -package azure - -import ( - "context" - - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// Client defines methods to access Azure inventory -type Client interface { - VerifyAccount(ctx context.Context) error - ListResourceGroups(ctx context.Context, location string) ([]*models.AzureResourceGroup, error) - ListVirtualNetworks(ctx context.Context, resourceGroup string, location string) ([]*models.AzureVirtualNetwork, error) - CreateResourceGroup(ctx context.Context, resourceGroupName string, location string) error - CreateVirtualNetwork(ctx context.Context, resourceGroupName string, virtualNetworkName string, cidrBlock string, location string) error - GetAzureRegions(ctx context.Context) ([]*models.AzureLocation, error) - GetAzureInstanceTypesForRegion(ctx context.Context, region string) ([]*models.AzureInstanceType, error) -} diff --git a/tkg/azure/mocks/azure_mock.go b/tkg/azure/mocks/azure_mock.go deleted file mode 100644 index 151052427b..0000000000 --- a/tkg/azure/mocks/azure_mock.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by MockGen. DO NOT EDIT. -// Source: ./pkg/azure/interface.go - -// Package azure is a generated GoMock package. -package azure - -import ( - context "context" - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// MockClient is a mock of Client interface. -type MockClient struct { - ctrl *gomock.Controller - recorder *MockClientMockRecorder -} - -// MockClientMockRecorder is the mock recorder for MockClient. -type MockClientMockRecorder struct { - mock *MockClient -} - -// NewMockClient creates a new mock instance. -func NewMockClient(ctrl *gomock.Controller) *MockClient { - mock := &MockClient{ctrl: ctrl} - mock.recorder = &MockClientMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockClient) EXPECT() *MockClientMockRecorder { - return m.recorder -} - -// VerifyAccount mocks base method. -func (m *MockClient) VerifyAccount(ctx context.Context) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "VerifyAccount", ctx) - ret0, _ := ret[0].(error) - return ret0 -} - -// VerifyAccount indicates an expected call of VerifyAccount. -func (mr *MockClientMockRecorder) VerifyAccount(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "VerifyAccount", reflect.TypeOf((*MockClient)(nil).VerifyAccount), ctx) -} - -// ListResourceGroups mocks base method. -func (m *MockClient) ListResourceGroups(ctx context.Context, location string) ([]*models.AzureResourceGroup, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListResourceGroups", ctx, location) - ret0, _ := ret[0].([]*models.AzureResourceGroup) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListResourceGroups indicates an expected call of ListResourceGroups. -func (mr *MockClientMockRecorder) ListResourceGroups(ctx, location interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListResourceGroups", reflect.TypeOf((*MockClient)(nil).ListResourceGroups), ctx, location) -} - -// ListVirtualNetworks mocks base method. -func (m *MockClient) ListVirtualNetworks(ctx context.Context, resourceGroup, location string) ([]*models.AzureVirtualNetwork, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListVirtualNetworks", ctx, resourceGroup, location) - ret0, _ := ret[0].([]*models.AzureVirtualNetwork) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListVirtualNetworks indicates an expected call of ListVirtualNetworks. -func (mr *MockClientMockRecorder) ListVirtualNetworks(ctx, resourceGroup, location interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListVirtualNetworks", reflect.TypeOf((*MockClient)(nil).ListVirtualNetworks), ctx, resourceGroup, location) -} - -// CreateResourceGroup mocks base method. -func (m *MockClient) CreateResourceGroup(ctx context.Context, resourceGroupName, location string) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateResourceGroup", ctx, resourceGroupName, location) - ret0, _ := ret[0].(error) - return ret0 -} - -// CreateResourceGroup indicates an expected call of CreateResourceGroup. -func (mr *MockClientMockRecorder) CreateResourceGroup(ctx, resourceGroupName, location interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateResourceGroup", reflect.TypeOf((*MockClient)(nil).CreateResourceGroup), ctx, resourceGroupName, location) -} - -// CreateVirtualNetwork mocks base method. -func (m *MockClient) CreateVirtualNetwork(ctx context.Context, resourceGroupName, virtualNetworkName, cidrBlock, location string) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateVirtualNetwork", ctx, resourceGroupName, virtualNetworkName, cidrBlock, location) - ret0, _ := ret[0].(error) - return ret0 -} - -// CreateVirtualNetwork indicates an expected call of CreateVirtualNetwork. -func (mr *MockClientMockRecorder) CreateVirtualNetwork(ctx, resourceGroupName, virtualNetworkName, cidrBlock, location interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateVirtualNetwork", reflect.TypeOf((*MockClient)(nil).CreateVirtualNetwork), ctx, resourceGroupName, virtualNetworkName, cidrBlock, location) -} - -// GetAzureRegions mocks base method. -func (m *MockClient) GetAzureRegions(ctx context.Context) ([]*models.AzureLocation, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetAzureRegions", ctx) - ret0, _ := ret[0].([]*models.AzureLocation) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetAzureRegions indicates an expected call of GetAzureRegions. -func (mr *MockClientMockRecorder) GetAzureRegions(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAzureRegions", reflect.TypeOf((*MockClient)(nil).GetAzureRegions), ctx) -} - -// GetAzureInstanceTypesForRegion mocks base method. -func (m *MockClient) GetAzureInstanceTypesForRegion(ctx context.Context, region string) ([]*models.AzureInstanceType, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetAzureInstanceTypesForRegion", ctx, region) - ret0, _ := ret[0].([]*models.AzureInstanceType) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetAzureInstanceTypesForRegion indicates an expected call of GetAzureInstanceTypesForRegion. -func (mr *MockClientMockRecorder) GetAzureInstanceTypesForRegion(ctx, region interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAzureInstanceTypesForRegion", reflect.TypeOf((*MockClient)(nil).GetAzureInstanceTypesForRegion), ctx, region) -} diff --git a/tkg/azure/mocks/groups_mock.go b/tkg/azure/mocks/groups_mock.go deleted file mode 100644 index b181c65733..0000000000 --- a/tkg/azure/mocks/groups_mock.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-05-01/resources/resourcesapi (interfaces: GroupsClientAPI) - -// Package azure is a generated GoMock package. -package azure - -import ( - context "context" - reflect "reflect" - - resources "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-05-01/resources" - autorest "github.com/Azure/go-autorest/autorest" - gomock "github.com/golang/mock/gomock" -) - -// MockGroupsClientAPI is a mock of GroupsClientAPI interface. -type MockGroupsClientAPI struct { - ctrl *gomock.Controller - recorder *MockGroupsClientAPIMockRecorder -} - -// MockGroupsClientAPIMockRecorder is the mock recorder for MockGroupsClientAPI. -type MockGroupsClientAPIMockRecorder struct { - mock *MockGroupsClientAPI -} - -// NewMockGroupsClientAPI creates a new mock instance. -func NewMockGroupsClientAPI(ctrl *gomock.Controller) *MockGroupsClientAPI { - mock := &MockGroupsClientAPI{ctrl: ctrl} - mock.recorder = &MockGroupsClientAPIMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockGroupsClientAPI) EXPECT() *MockGroupsClientAPIMockRecorder { - return m.recorder -} - -// CheckExistence mocks base method. -func (m *MockGroupsClientAPI) CheckExistence(arg0 context.Context, arg1 string) (autorest.Response, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CheckExistence", arg0, arg1) - ret0, _ := ret[0].(autorest.Response) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CheckExistence indicates an expected call of CheckExistence. -func (mr *MockGroupsClientAPIMockRecorder) CheckExistence(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckExistence", reflect.TypeOf((*MockGroupsClientAPI)(nil).CheckExistence), arg0, arg1) -} - -// CreateOrUpdate mocks base method. -func (m *MockGroupsClientAPI) CreateOrUpdate(arg0 context.Context, arg1 string, arg2 resources.Group) (resources.Group, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateOrUpdate", arg0, arg1, arg2) - ret0, _ := ret[0].(resources.Group) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CreateOrUpdate indicates an expected call of CreateOrUpdate. -func (mr *MockGroupsClientAPIMockRecorder) CreateOrUpdate(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdate", reflect.TypeOf((*MockGroupsClientAPI)(nil).CreateOrUpdate), arg0, arg1, arg2) -} - -// Delete mocks base method. -func (m *MockGroupsClientAPI) Delete(arg0 context.Context, arg1 string) (resources.GroupsDeleteFuture, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Delete", arg0, arg1) - ret0, _ := ret[0].(resources.GroupsDeleteFuture) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Delete indicates an expected call of Delete. -func (mr *MockGroupsClientAPIMockRecorder) Delete(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockGroupsClientAPI)(nil).Delete), arg0, arg1) -} - -// ExportTemplate mocks base method. -func (m *MockGroupsClientAPI) ExportTemplate(arg0 context.Context, arg1 string, arg2 resources.ExportTemplateRequest) (resources.GroupExportResult, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ExportTemplate", arg0, arg1, arg2) - ret0, _ := ret[0].(resources.GroupExportResult) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ExportTemplate indicates an expected call of ExportTemplate. -func (mr *MockGroupsClientAPIMockRecorder) ExportTemplate(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExportTemplate", reflect.TypeOf((*MockGroupsClientAPI)(nil).ExportTemplate), arg0, arg1, arg2) -} - -// Get mocks base method. -func (m *MockGroupsClientAPI) Get(arg0 context.Context, arg1 string) (resources.Group, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", arg0, arg1) - ret0, _ := ret[0].(resources.Group) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockGroupsClientAPIMockRecorder) Get(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockGroupsClientAPI)(nil).Get), arg0, arg1) -} - -// List mocks base method. -func (m *MockGroupsClientAPI) List(arg0 context.Context, arg1 string, arg2 *int32) (resources.GroupListResultPage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "List", arg0, arg1, arg2) - ret0, _ := ret[0].(resources.GroupListResultPage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// List indicates an expected call of List. -func (mr *MockGroupsClientAPIMockRecorder) List(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockGroupsClientAPI)(nil).List), arg0, arg1, arg2) -} - -// ListComplete mocks base method. -func (m *MockGroupsClientAPI) ListComplete(arg0 context.Context, arg1 string, arg2 *int32) (resources.GroupListResultIterator, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListComplete", arg0, arg1, arg2) - ret0, _ := ret[0].(resources.GroupListResultIterator) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListComplete indicates an expected call of ListComplete. -func (mr *MockGroupsClientAPIMockRecorder) ListComplete(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListComplete", reflect.TypeOf((*MockGroupsClientAPI)(nil).ListComplete), arg0, arg1, arg2) -} - -// Update mocks base method. -func (m *MockGroupsClientAPI) Update(arg0 context.Context, arg1 string, arg2 resources.GroupPatchable) (resources.Group, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Update", arg0, arg1, arg2) - ret0, _ := ret[0].(resources.Group) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Update indicates an expected call of Update. -func (mr *MockGroupsClientAPIMockRecorder) Update(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockGroupsClientAPI)(nil).Update), arg0, arg1, arg2) -} diff --git a/tkg/azure/mocks/resourceskus_mock.go b/tkg/azure/mocks/resourceskus_mock.go deleted file mode 100644 index f4ef1223ec..0000000000 --- a/tkg/azure/mocks/resourceskus_mock.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute/computeapi (interfaces: ResourceSkusClientAPI) - -// Package azure is a generated GoMock package. -package azure - -import ( - context "context" - reflect "reflect" - - compute "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-12-01/compute" - gomock "github.com/golang/mock/gomock" -) - -// MockResourceSkusClientAPI is a mock of ResourceSkusClientAPI interface. -type MockResourceSkusClientAPI struct { - ctrl *gomock.Controller - recorder *MockResourceSkusClientAPIMockRecorder -} - -// MockResourceSkusClientAPIMockRecorder is the mock recorder for MockResourceSkusClientAPI. -type MockResourceSkusClientAPIMockRecorder struct { - mock *MockResourceSkusClientAPI -} - -// NewMockResourceSkusClientAPI creates a new mock instance. -func NewMockResourceSkusClientAPI(ctrl *gomock.Controller) *MockResourceSkusClientAPI { - mock := &MockResourceSkusClientAPI{ctrl: ctrl} - mock.recorder = &MockResourceSkusClientAPIMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockResourceSkusClientAPI) EXPECT() *MockResourceSkusClientAPIMockRecorder { - return m.recorder -} - -// List mocks base method. -func (m *MockResourceSkusClientAPI) List(arg0 context.Context, arg1 string) (compute.ResourceSkusResultPage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "List", arg0, arg1) - ret0, _ := ret[0].(compute.ResourceSkusResultPage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// List indicates an expected call of List. -func (mr *MockResourceSkusClientAPIMockRecorder) List(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockResourceSkusClientAPI)(nil).List), arg0, arg1) -} - -// ListComplete mocks base method. -func (m *MockResourceSkusClientAPI) ListComplete(arg0 context.Context, arg1 string) (compute.ResourceSkusResultIterator, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListComplete", arg0, arg1) - ret0, _ := ret[0].(compute.ResourceSkusResultIterator) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListComplete indicates an expected call of ListComplete. -func (mr *MockResourceSkusClientAPIMockRecorder) ListComplete(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListComplete", reflect.TypeOf((*MockResourceSkusClientAPI)(nil).ListComplete), arg0, arg1) -} diff --git a/tkg/azure/mocks/subscriptions_mock.go b/tkg/azure/mocks/subscriptions_mock.go deleted file mode 100644 index bc02a88311..0000000000 --- a/tkg/azure/mocks/subscriptions_mock.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-11-01/subscriptions/subscriptionsapi (interfaces: ClientAPI) - -// Package azure is a generated GoMock package. -package azure - -import ( - context "context" - reflect "reflect" - - subscriptions "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2019-11-01/subscriptions" - gomock "github.com/golang/mock/gomock" -) - -// MockClientAPI is a mock of ClientAPI interface. -type MockClientAPI struct { - ctrl *gomock.Controller - recorder *MockClientAPIMockRecorder -} - -// MockClientAPIMockRecorder is the mock recorder for MockClientAPI. -type MockClientAPIMockRecorder struct { - mock *MockClientAPI -} - -// NewMockClientAPI creates a new mock instance. -func NewMockClientAPI(ctrl *gomock.Controller) *MockClientAPI { - mock := &MockClientAPI{ctrl: ctrl} - mock.recorder = &MockClientAPIMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockClientAPI) EXPECT() *MockClientAPIMockRecorder { - return m.recorder -} - -// Get mocks base method. -func (m *MockClientAPI) Get(arg0 context.Context, arg1 string) (subscriptions.Subscription, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", arg0, arg1) - ret0, _ := ret[0].(subscriptions.Subscription) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockClientAPIMockRecorder) Get(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockClientAPI)(nil).Get), arg0, arg1) -} - -// List mocks base method. -func (m *MockClientAPI) List(arg0 context.Context) (subscriptions.ListResultPage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "List", arg0) - ret0, _ := ret[0].(subscriptions.ListResultPage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// List indicates an expected call of List. -func (mr *MockClientAPIMockRecorder) List(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockClientAPI)(nil).List), arg0) -} - -// ListComplete mocks base method. -func (m *MockClientAPI) ListComplete(arg0 context.Context) (subscriptions.ListResultIterator, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListComplete", arg0) - ret0, _ := ret[0].(subscriptions.ListResultIterator) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListComplete indicates an expected call of ListComplete. -func (mr *MockClientAPIMockRecorder) ListComplete(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListComplete", reflect.TypeOf((*MockClientAPI)(nil).ListComplete), arg0) -} - -// ListLocations mocks base method. -func (m *MockClientAPI) ListLocations(arg0 context.Context, arg1 string) (subscriptions.LocationListResult, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListLocations", arg0, arg1) - ret0, _ := ret[0].(subscriptions.LocationListResult) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListLocations indicates an expected call of ListLocations. -func (mr *MockClientAPIMockRecorder) ListLocations(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListLocations", reflect.TypeOf((*MockClientAPI)(nil).ListLocations), arg0, arg1) -} diff --git a/tkg/azure/mocks/virtualnetworks_mock.go b/tkg/azure/mocks/virtualnetworks_mock.go deleted file mode 100644 index 617962a5db..0000000000 --- a/tkg/azure/mocks/virtualnetworks_mock.go +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-11-01/network/networkapi (interfaces: VirtualNetworksClientAPI) - -// Package azure is a generated GoMock package. -package azure - -import ( - context "context" - reflect "reflect" - - network "github.com/Azure/azure-sdk-for-go/services/network/mgmt/2019-11-01/network" - gomock "github.com/golang/mock/gomock" -) - -// MockVirtualNetworksClientAPI is a mock of VirtualNetworksClientAPI interface. -type MockVirtualNetworksClientAPI struct { - ctrl *gomock.Controller - recorder *MockVirtualNetworksClientAPIMockRecorder -} - -// MockVirtualNetworksClientAPIMockRecorder is the mock recorder for MockVirtualNetworksClientAPI. -type MockVirtualNetworksClientAPIMockRecorder struct { - mock *MockVirtualNetworksClientAPI -} - -// NewMockVirtualNetworksClientAPI creates a new mock instance. -func NewMockVirtualNetworksClientAPI(ctrl *gomock.Controller) *MockVirtualNetworksClientAPI { - mock := &MockVirtualNetworksClientAPI{ctrl: ctrl} - mock.recorder = &MockVirtualNetworksClientAPIMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockVirtualNetworksClientAPI) EXPECT() *MockVirtualNetworksClientAPIMockRecorder { - return m.recorder -} - -// CheckIPAddressAvailability mocks base method. -func (m *MockVirtualNetworksClientAPI) CheckIPAddressAvailability(arg0 context.Context, arg1, arg2, arg3 string) (network.IPAddressAvailabilityResult, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CheckIPAddressAvailability", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(network.IPAddressAvailabilityResult) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CheckIPAddressAvailability indicates an expected call of CheckIPAddressAvailability. -func (mr *MockVirtualNetworksClientAPIMockRecorder) CheckIPAddressAvailability(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckIPAddressAvailability", reflect.TypeOf((*MockVirtualNetworksClientAPI)(nil).CheckIPAddressAvailability), arg0, arg1, arg2, arg3) -} - -// CreateOrUpdate mocks base method. -func (m *MockVirtualNetworksClientAPI) CreateOrUpdate(arg0 context.Context, arg1, arg2 string, arg3 network.VirtualNetwork) (network.VirtualNetworksCreateOrUpdateFuture, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateOrUpdate", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(network.VirtualNetworksCreateOrUpdateFuture) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// CreateOrUpdate indicates an expected call of CreateOrUpdate. -func (mr *MockVirtualNetworksClientAPIMockRecorder) CreateOrUpdate(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOrUpdate", reflect.TypeOf((*MockVirtualNetworksClientAPI)(nil).CreateOrUpdate), arg0, arg1, arg2, arg3) -} - -// Delete mocks base method. -func (m *MockVirtualNetworksClientAPI) Delete(arg0 context.Context, arg1, arg2 string) (network.VirtualNetworksDeleteFuture, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Delete", arg0, arg1, arg2) - ret0, _ := ret[0].(network.VirtualNetworksDeleteFuture) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Delete indicates an expected call of Delete. -func (mr *MockVirtualNetworksClientAPIMockRecorder) Delete(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockVirtualNetworksClientAPI)(nil).Delete), arg0, arg1, arg2) -} - -// Get mocks base method. -func (m *MockVirtualNetworksClientAPI) Get(arg0 context.Context, arg1, arg2, arg3 string) (network.VirtualNetwork, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(network.VirtualNetwork) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Get indicates an expected call of Get. -func (mr *MockVirtualNetworksClientAPIMockRecorder) Get(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockVirtualNetworksClientAPI)(nil).Get), arg0, arg1, arg2, arg3) -} - -// List mocks base method. -func (m *MockVirtualNetworksClientAPI) List(arg0 context.Context, arg1 string) (network.VirtualNetworkListResultPage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "List", arg0, arg1) - ret0, _ := ret[0].(network.VirtualNetworkListResultPage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// List indicates an expected call of List. -func (mr *MockVirtualNetworksClientAPIMockRecorder) List(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockVirtualNetworksClientAPI)(nil).List), arg0, arg1) -} - -// ListAll mocks base method. -func (m *MockVirtualNetworksClientAPI) ListAll(arg0 context.Context) (network.VirtualNetworkListResultPage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListAll", arg0) - ret0, _ := ret[0].(network.VirtualNetworkListResultPage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListAll indicates an expected call of ListAll. -func (mr *MockVirtualNetworksClientAPIMockRecorder) ListAll(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAll", reflect.TypeOf((*MockVirtualNetworksClientAPI)(nil).ListAll), arg0) -} - -// ListAllComplete mocks base method. -func (m *MockVirtualNetworksClientAPI) ListAllComplete(arg0 context.Context) (network.VirtualNetworkListResultIterator, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListAllComplete", arg0) - ret0, _ := ret[0].(network.VirtualNetworkListResultIterator) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListAllComplete indicates an expected call of ListAllComplete. -func (mr *MockVirtualNetworksClientAPIMockRecorder) ListAllComplete(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAllComplete", reflect.TypeOf((*MockVirtualNetworksClientAPI)(nil).ListAllComplete), arg0) -} - -// ListComplete mocks base method. -func (m *MockVirtualNetworksClientAPI) ListComplete(arg0 context.Context, arg1 string) (network.VirtualNetworkListResultIterator, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListComplete", arg0, arg1) - ret0, _ := ret[0].(network.VirtualNetworkListResultIterator) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListComplete indicates an expected call of ListComplete. -func (mr *MockVirtualNetworksClientAPIMockRecorder) ListComplete(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListComplete", reflect.TypeOf((*MockVirtualNetworksClientAPI)(nil).ListComplete), arg0, arg1) -} - -// ListUsage mocks base method. -func (m *MockVirtualNetworksClientAPI) ListUsage(arg0 context.Context, arg1, arg2 string) (network.VirtualNetworkListUsageResultPage, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListUsage", arg0, arg1, arg2) - ret0, _ := ret[0].(network.VirtualNetworkListUsageResultPage) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListUsage indicates an expected call of ListUsage. -func (mr *MockVirtualNetworksClientAPIMockRecorder) ListUsage(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListUsage", reflect.TypeOf((*MockVirtualNetworksClientAPI)(nil).ListUsage), arg0, arg1, arg2) -} - -// ListUsageComplete mocks base method. -func (m *MockVirtualNetworksClientAPI) ListUsageComplete(arg0 context.Context, arg1, arg2 string) (network.VirtualNetworkListUsageResultIterator, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ListUsageComplete", arg0, arg1, arg2) - ret0, _ := ret[0].(network.VirtualNetworkListUsageResultIterator) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ListUsageComplete indicates an expected call of ListUsageComplete. -func (mr *MockVirtualNetworksClientAPIMockRecorder) ListUsageComplete(arg0, arg1, arg2 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListUsageComplete", reflect.TypeOf((*MockVirtualNetworksClientAPI)(nil).ListUsageComplete), arg0, arg1, arg2) -} - -// UpdateTags mocks base method. -func (m *MockVirtualNetworksClientAPI) UpdateTags(arg0 context.Context, arg1, arg2 string, arg3 network.TagsObject) (network.VirtualNetwork, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateTags", arg0, arg1, arg2, arg3) - ret0, _ := ret[0].(network.VirtualNetwork) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// UpdateTags indicates an expected call of UpdateTags. -func (mr *MockVirtualNetworksClientAPIMockRecorder) UpdateTags(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateTags", reflect.TypeOf((*MockVirtualNetworksClientAPI)(nil).UpdateTags), arg0, arg1, arg2, arg3) -} diff --git a/tkg/buildinfo/metadata.go b/tkg/buildinfo/metadata.go deleted file mode 100644 index b3e3a79de2..0000000000 --- a/tkg/buildinfo/metadata.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package buildinfo - -// IsOfficialBuild is the flag that gets set to True if it is an official build being released, it is set with the go linker's -X flag. -var IsOfficialBuild string diff --git a/tkg/buildinfo/version.go b/tkg/buildinfo/version.go deleted file mode 100644 index aa2c3e9a77..0000000000 --- a/tkg/buildinfo/version.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package buildinfo ... -package buildinfo - -var ( - // Date is the date the binary was built. - // Set by go build -ldflags "-X" flag - Date string - - // SHA is the git commit SHA the binary was built with. - // Set by go build -ldflags "-X" flag - SHA string - - // Version is the version the binary was built with. - // Set by go build -ldflags "-X" flag - Version string - - // Commit is the actual commit that is being built, set with the go linker's -X flag. - // Deprecated: use github.com/vmware-tanzu/tanzu-framework/tkg/buildinfo.SHA - Commit = SHA -) diff --git a/tkg/carvelhelpers/kbld.go b/tkg/carvelhelpers/kbld.go deleted file mode 100644 index ae9f736d50..0000000000 --- a/tkg/carvelhelpers/kbld.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package carvelhelpers implements wrapper functions to use carvel tooling -package carvelhelpers - -import ( - "bytes" - "os" - - "github.com/cppforlife/go-cli-ui/ui" - "github.com/k14s/kbld/pkg/kbld/cmd" - "github.com/pkg/errors" -) - -// ResolveImagesInPackage resolves the images using kbld tool -// Implements similar functionality as `kbld -f -f ` -func ResolveImagesInPackage(files []string) ([]byte, error) { - var outputBuf, errorBuf bytes.Buffer - writerUI := ui.NewWriterUI(&outputBuf, &errorBuf, nil) - kbldResolveOptions := cmd.NewResolveOptions(writerUI) - kbldResolveOptions.FileFlags = cmd.FileFlags{Files: files} - kbldResolveOptions.BuildConcurrency = 1 - - // backup and reset stderr to avoid kbld to write anything to stderr - stdErr := os.Stderr - os.Stderr = nil - err := kbldResolveOptions.Run() - os.Stderr = stdErr - - if err != nil { - return nil, errors.Wrapf(err, "error while resolving images") - } - return outputBuf.Bytes(), nil -} diff --git a/tkg/carvelhelpers/kbld_test.go b/tkg/carvelhelpers/kbld_test.go deleted file mode 100644 index 01b78be144..0000000000 --- a/tkg/carvelhelpers/kbld_test.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_ResolveImagesInPackage_Success(t *testing.T) { - assert := assert.New(t) - - input := `--- -apiVersion: imgpkg.carvel.dev/v1alpha1 -images: -- annotations: - kbld.carvel.dev/id: test-tanzu-cli-plugins/foo-darwin-amd64:latest - image: localhost:5000/tanzu-plugins/standalone-plugins@sha256:443df31fec8f78b55ea25ac1ba55907567fbdf05301a752e9f6adefe3c37e11d -- annotations: - kbld.carvel.dev/id: test-tanzu-cli-plugins/foo-linux-amd64:latest - image: localhost:5000/tanzu-plugins/standalone-plugins@sha256:53fb40d45e6a1267713cfdd6b561a65457cd5a575c6813fbdae06380b48e5e1f -kind: ImagesLock ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: Foo -metadata: - name: foo-test -spec: - artifacts: - - image: test-tanzu-cli-plugins/foo-darwin-amd64:latest - - image: test-tanzu-cli-plugins/foo-linux-amd64:latest - description: contains artifacts -` - - output := `--- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: Foo -metadata: - name: foo-test -spec: - artifacts: - - image: localhost:5000/tanzu-plugins/standalone-plugins@sha256:443df31fec8f78b55ea25ac1ba55907567fbdf05301a752e9f6adefe3c37e11d - - image: localhost:5000/tanzu-plugins/standalone-plugins@sha256:53fb40d45e6a1267713cfdd6b561a65457cd5a575c6813fbdae06380b48e5e1f - description: contains artifacts -` - - f, err := os.CreateTemp("", "kbld_test") - assert.Nil(err) - defer os.Remove(f.Name()) - err = os.WriteFile(f.Name(), []byte(input), 0644) - assert.Nil(err) - - bytes, err := ResolveImagesInPackage([]string{f.Name()}) - assert.Nil(err) - assert.NotNil(bytes) - assert.Equal(output, string(bytes)) -} - -func Test_ResolveImagesInPackage_When_Image_Not_Present_In_ImageLock(t *testing.T) { - assert := assert.New(t) - - input1 := `--- -apiVersion: imgpkg.carvel.dev/v1alpha1 -images: -- annotations: - kbld.carvel.dev/id: test-tanzu-cli-plugins/foo-darwin-amd64:latest - image: localhost:5000/tanzu-plugins/standalone-plugins@sha256:443df31fec8f78b55ea25ac1ba55907567fbdf05301a752e9f6adefe3c37e11d -kind: ImagesLock ---- -apiVersion: cli.tanzu.vmware.com/v1alpha1 -kind: Foo -metadata: - name: foo-test -spec: - artifacts: - - image: test-tanzu-cli-plugins/foo-darwin-amd64:latest - - image: test-tanzu-cli-plugins/foo-linux-amd64:latest - description: contains artifacts -` - - f, err := os.CreateTemp("", "kbld_test") - assert.Nil(err) - defer os.Remove(f.Name()) - err = os.WriteFile(f.Name(), []byte(input1), 0644) - assert.Nil(err) - - bytes, err := ResolveImagesInPackage([]string{f.Name()}) - assert.NotNil(err) - assert.Contains(err.Error(), "error while resolving images:") - assert.Nil(bytes) -} diff --git a/tkg/carvelhelpers/package.go b/tkg/carvelhelpers/package.go deleted file mode 100644 index 5a0bef0d1e..0000000000 --- a/tkg/carvelhelpers/package.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers - -import ( - "os" - "path/filepath" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -// ProcessCarvelPackage processes a carvel package and returns a configuration YAML -// Downloads package to temporary directory and processes the package by -// implementing equivalent functionality as the command: `ytt -f [-f ] | kbld -f -` -func ProcessCarvelPackage(image string, valuesFiles ...string) ([]byte, error) { - pkgDir, err := DownloadImageBundleAndSaveFilesToTempDir(image) - if err != nil { - return nil, errors.Wrap(err, "failed to get resource files from discovery") - } - defer os.RemoveAll(pkgDir) - return CarvelPackageProcessor(pkgDir, image, valuesFiles...) -} - -// CarvelPackageProcessor processes a carvel package and returns a configuration YAML file -func CarvelPackageProcessor(pkgDir, image string, valuesFiles ...string) ([]byte, error) { - // Each package contains `config` and `.imgpkg` directory - // `config` directory contains ytt files - // `.imgpkg` directory contains ImageLock configuration for ImageResolution - configDir := filepath.Join(pkgDir, "config") - files := append([]string{configDir}, valuesFiles...) - bytes, err := ProcessYTTPackage(files...) - if err != nil { - return nil, errors.Wrap(err, "error while running ytt") - } - - f, err := os.CreateTemp("", "ytt-processed") - if err != nil { - return nil, errors.Wrap(err, "error while creating temp directory") - } - defer os.Remove(f.Name()) - - err = utils.SaveFile(f.Name(), bytes) - if err != nil { - return nil, errors.Wrap(err, "error while saving file") - } - - inputFilesForImageResolution := []string{f.Name()} - - // Use `.imgpkg` directory if exists for ImageResolution - imgpkgDir := filepath.Join(pkgDir, ".imgpkg") - if utils.PathExists(imgpkgDir) { - inputFilesForImageResolution = append(inputFilesForImageResolution, imgpkgDir) - } - - return ResolveImagesInPackage(inputFilesForImageResolution) -} diff --git a/tkg/carvelhelpers/package_test.go b/tkg/carvelhelpers/package_test.go deleted file mode 100644 index 3a9b1ea65c..0000000000 --- a/tkg/carvelhelpers/package_test.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers_test - -import ( - "os" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/carvelhelpers" -) - -func TestClient(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "CarvelHelper Suite") -} - -var _ = Describe("Unit tests for CarvelPackageProcessor", func() { - var ( - configBytes []byte - err error - packageDownloadDir string - image string - outputFilePath string - ) - - JustBeforeEach(func() { - configBytes, err = CarvelPackageProcessor(packageDownloadDir, image) - }) - - Context("When processing test package1 which includes .imgpkg dir", func() { - BeforeEach(func() { - packageDownloadDir = "./test/package1/input" - outputFilePath = "./test/package1/output.yaml" - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(string(configBytes)).To(Equal(readFile(outputFilePath))) - }) - }) - - Context("When processing test package2 which does not include .imgpkg dir", func() { - BeforeEach(func() { - packageDownloadDir = "./test/package2/input" - outputFilePath = "./test/package2/output.yaml" - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(string(configBytes)).To(Equal(readFile(outputFilePath))) - }) - }) -}) - -func readFile(path string) string { - data, err := os.ReadFile(path) - Expect(err).NotTo(HaveOccurred()) - return string(data) -} diff --git a/tkg/carvelhelpers/registry.go b/tkg/carvelhelpers/registry.go deleted file mode 100644 index d2d6851aee..0000000000 --- a/tkg/carvelhelpers/registry.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers - -import ( - "os" - "runtime" - "strings" - - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/cli/clientconfighelpers" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/registry" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" -) - -// GetFilesMapFromImage returns map of files metadata -// It takes os environment variables for custom repository and proxy -// configuration into account while downloading image from repository -func GetFilesMapFromImage(imageWithTag string) (map[string][]byte, error) { - reg, err := newRegistry() - if err != nil { - return nil, errors.Wrapf(err, "unable to initialize registry") - } - return reg.GetFiles(imageWithTag) -} - -// DownloadImageBundleAndSaveFilesToDir reads OCI image and saves file to the specified directory -func DownloadImageBundleAndSaveFilesToDir(imageWithTag, dir string) error { - reg, err := newRegistry() - if err != nil { - return errors.Wrapf(err, "unable to initialize registry") - } - err = reg.DownloadBundle(imageWithTag, dir) - if err != nil { - return errors.Wrap(err, "error downloading bundle") - } - return nil -} - -// DownloadImageBundleAndSaveFilesToTempDir reads OCI image and saves file to temp dir -// returns temp configuration dir with downloaded imgpkg bundle -func DownloadImageBundleAndSaveFilesToTempDir(imageWithTag string) (string, error) { - tmpDir, err := os.MkdirTemp("", "oci_image") - if err != nil { - return "", errors.Wrap(err, "error creating temporary directory") - } - if err := DownloadImageBundleAndSaveFilesToDir(imageWithTag, tmpDir); err != nil { - return "", err - } - return tmpDir, nil -} - -// newRegistry returns a new registry object by also -// taking into account for any custom registry or proxy -// environment variable provided by the user -func newRegistry() (registry.Registry, error) { - verifyCerts := true - skipVerifyCerts := os.Getenv(constants.ConfigVariableCustomImageRepositorySkipTLSVerify) - if strings.EqualFold(skipVerifyCerts, "true") { - verifyCerts = false - } - - registryOpts := &ctlimg.Opts{ - VerifyCerts: verifyCerts, - Anon: true, - } - - if runtime.GOOS == "windows" { - err := clientconfighelpers.AddRegistryTrustedRootCertsFileForWindows(registryOpts) - if err != nil { - return nil, err - } - } - - caCertBytes, err := clientconfighelpers.GetCustomRepositoryCaCertificateForClient(nil) - if err == nil && len(caCertBytes) != 0 { - filePath, err := tkgconfigpaths.GetRegistryCertFile() - if err != nil { - return nil, err - } - err = os.WriteFile(filePath, caCertBytes, 0o644) - if err != nil { - return nil, errors.Wrapf(err, "failed to write the custom image registry CA cert to file '%s'", filePath) - } - registryOpts.CACertPaths = append(registryOpts.CACertPaths, filePath) - } - - return registry.New(registryOpts) -} diff --git a/tkg/carvelhelpers/test/package1/input/.imgpkg/images.yaml b/tkg/carvelhelpers/test/package1/input/.imgpkg/images.yaml deleted file mode 100644 index 7720f421b0..0000000000 --- a/tkg/carvelhelpers/test/package1/input/.imgpkg/images.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -apiVersion: imgpkg.carvel.dev/v1alpha1 -images: -- annotations: - kbld.carvel.dev/id: carvel-kapp-controller:latest - image: test.fake.repo/tkg/kapp-controller@sha256:d11c017b151bb08c8a9699715495589ee64158ff0d79dba08a06a121de732a75 -kind: ImagesLock diff --git a/tkg/carvelhelpers/test/package1/input/config/overlay.yaml b/tkg/carvelhelpers/test/package1/input/config/overlay.yaml deleted file mode 100644 index cbbadd8264..0000000000 --- a/tkg/carvelhelpers/test/package1/input/config/overlay.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind": "Pod","metadata": {"name": "test"}}),expects="1+" ---- -metadata: - namespace: #@ data.values.NAMESPACE diff --git a/tkg/carvelhelpers/test/package1/input/config/pod.yaml b/tkg/carvelhelpers/test/package1/input/config/pod.yaml deleted file mode 100644 index 69320a0f29..0000000000 --- a/tkg/carvelhelpers/test/package1/input/config/pod.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: v1 -kind: Pod -metadata: - name: test - namespace: default -spec: - containers: - - args: - - manager - image: carvel-kapp-controller:latest - name: nginx - resources: {} diff --git a/tkg/carvelhelpers/test/package1/input/config/values.yaml b/tkg/carvelhelpers/test/package1/input/config/values.yaml deleted file mode 100644 index 7fe6e159cd..0000000000 --- a/tkg/carvelhelpers/test/package1/input/config/values.yaml +++ /dev/null @@ -1,4 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -NAMESPACE: fake-namespace diff --git a/tkg/carvelhelpers/test/package1/output.yaml b/tkg/carvelhelpers/test/package1/output.yaml deleted file mode 100644 index 87d1f826ed..0000000000 --- a/tkg/carvelhelpers/test/package1/output.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: v1 -kind: Pod -metadata: - name: test - namespace: fake-namespace -spec: - containers: - - args: - - manager - image: test.fake.repo/tkg/kapp-controller@sha256:d11c017b151bb08c8a9699715495589ee64158ff0d79dba08a06a121de732a75 - name: nginx - resources: {} diff --git a/tkg/carvelhelpers/test/package2/input/config/overlay.yaml b/tkg/carvelhelpers/test/package2/input/config/overlay.yaml deleted file mode 100644 index cbbadd8264..0000000000 --- a/tkg/carvelhelpers/test/package2/input/config/overlay.yaml +++ /dev/null @@ -1,7 +0,0 @@ -#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") - -#@overlay/match by=overlay.subset({"kind": "Pod","metadata": {"name": "test"}}),expects="1+" ---- -metadata: - namespace: #@ data.values.NAMESPACE diff --git a/tkg/carvelhelpers/test/package2/input/config/pod.yaml b/tkg/carvelhelpers/test/package2/input/config/pod.yaml deleted file mode 100644 index d25e14f39b..0000000000 --- a/tkg/carvelhelpers/test/package2/input/config/pod.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: v1 -kind: Pod -metadata: - name: test - namespace: default -spec: - containers: - - args: - - manager - image: test.fake.repo/tkg/kapp-controller@sha256:abcd017b151bb08c8a9699715495589ee64158ff0d79dba08a06a121de732a75 - name: nginx - resources: {} diff --git a/tkg/carvelhelpers/test/package2/input/config/values.yaml b/tkg/carvelhelpers/test/package2/input/config/values.yaml deleted file mode 100644 index 7fe6e159cd..0000000000 --- a/tkg/carvelhelpers/test/package2/input/config/values.yaml +++ /dev/null @@ -1,4 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -NAMESPACE: fake-namespace diff --git a/tkg/carvelhelpers/test/package2/output.yaml b/tkg/carvelhelpers/test/package2/output.yaml deleted file mode 100644 index 33428f5e27..0000000000 --- a/tkg/carvelhelpers/test/package2/output.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -apiVersion: v1 -kind: Pod -metadata: - name: test - namespace: fake-namespace -spec: - containers: - - args: - - manager - image: test.fake.repo/tkg/kapp-controller@sha256:abcd017b151bb08c8a9699715495589ee64158ff0d79dba08a06a121de732a75 - name: nginx - resources: {} diff --git a/tkg/carvelhelpers/ytt.go b/tkg/carvelhelpers/ytt.go deleted file mode 100644 index 93034653e2..0000000000 --- a/tkg/carvelhelpers/ytt.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers - -import ( - "io" - - yttui "github.com/vmware-tanzu/carvel-ytt/pkg/cmd/ui" - "github.com/vmware-tanzu/carvel-ytt/pkg/files" - "github.com/vmware-tanzu/carvel-ytt/pkg/workspace" - "github.com/vmware-tanzu/carvel-ytt/pkg/workspace/datavalues" -) - -// ProcessYTTPackage processes configuration directory with ytt tool -// Implements similar functionality as `ytt -f ` -func ProcessYTTPackage(configDirs ...string) ([]byte, error) { - yttFiles, err := files.NewSortedFilesFromPaths(configDirs, files.SymlinkAllowOpts{}) - if err != nil { - return nil, err - } - - lib := workspace.NewRootLibrary(yttFiles) - libCtx := workspace.LibraryExecutionContext{Current: lib, Root: lib} - libExecFact := workspace.NewLibraryExecutionFactory(&NoopUI{}, workspace.TemplateLoaderOpts{}) - loader := libExecFact.New(libCtx) - - valuesDoc, libraryValueDoc, err := loader.Values([]*datavalues.Envelope{}, datavalues.NewNullSchema()) - if err != nil { - return nil, err - } - result, err := loader.Eval(valuesDoc, libraryValueDoc, []*datavalues.SchemaEnvelope{}) - if err != nil { - return nil, err - } - return result.DocSet.AsBytes() -} - -// NoopUI implement noop interface for logging used with carvel tooling -type NoopUI struct{} - -var _ yttui.UI = NoopUI{} - -// Printf noop print -func (ui NoopUI) Printf(str string, args ...interface{}) {} - -// Debugf noop debug -func (ui NoopUI) Debugf(str string, args ...interface{}) {} - -// Warnf noop warn -func (ui NoopUI) Warnf(str string, args ...interface{}) {} - -// DebugWriter noop debug writer -func (ui NoopUI) DebugWriter() io.Writer { - return noopWriter{} -} - -type noopWriter struct{} - -func (n noopWriter) Write(p []byte) (int, error) { - return 0, nil -} - -var _ io.Writer = noopWriter{} diff --git a/tkg/carvelhelpers/ytt_test.go b/tkg/carvelhelpers/ytt_test.go deleted file mode 100644 index 209752f4dc..0000000000 --- a/tkg/carvelhelpers/ytt_test.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package carvelhelpers - -import ( - "os" - "path/filepath" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -var dataValues = `#@data/values -#@overlay/match-child-defaults missing_ok=True - ---- -FOO_NAME: bar -` - -var template = `--- -apiVersion: foo.x-k8s.io/v1alpha3 -kind: Foo -metadata: - name: "${FOO_NAME}" - labels: - tkg.tanzu.vmware.com/label: '${FOO_NAME}' -` - -var overlay = `#@ load("@ytt:overlay", "overlay") -#@ load("@ytt:data", "data") -#@ load("@ytt:yaml", "yaml") - -#@overlay/match by=overlay.subset({"kind":"Foo"}) ---- -metadata: - name: #@ data.values.FOO_NAME - labels: - tkg.tanzu.vmware.com/label: #@ data.values.FOO_NAME -` - -var expectedOutput = `apiVersion: foo.x-k8s.io/v1alpha3 -kind: Foo -metadata: - name: bar - labels: - tkg.tanzu.vmware.com/label: bar -` - -func Test_ProcessYTTPackage(t *testing.T) { - assert := assert.New(t) - - testDir := setupTestDir(dataValues, template, overlay) - defer os.RemoveAll(testDir) - - bytes, err := ProcessYTTPackage(testDir) - assert.Nil(err) - assert.NotNil(bytes) - assert.Equal(expectedOutput, string(bytes)) -} - -func Test_ProcessYTTPackage_When_Error(t *testing.T) { - assert := assert.New(t) - - overlayUpdated := strings.ReplaceAll(overlay, "FOO_NAME", "FAKE_NAME") - testDir := setupTestDir(dataValues, template, overlayUpdated) - defer os.RemoveAll(testDir) - - _, err := ProcessYTTPackage(testDir) - assert.NotNil(err) - assert.Contains(err.Error(), "struct has no .FAKE_NAME field or method ") -} - -func setupTestDir(datavalues, overlay, template string) string { - tempDir, _ := os.MkdirTemp("", "ytt_test") - - _ = utils.SaveFile(filepath.Join(tempDir, "datavalues.yaml"), []byte(datavalues)) - _ = utils.SaveFile(filepath.Join(tempDir, "overlay.yaml"), []byte(overlay)) - _ = utils.SaveFile(filepath.Join(tempDir, "template.yaml"), []byte(template)) - return tempDir -} diff --git a/tkg/cli/clientconfighelpers/helpers.go b/tkg/cli/clientconfighelpers/helpers.go deleted file mode 100644 index c87bcd6f82..0000000000 --- a/tkg/cli/clientconfighelpers/helpers.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package clientconfighelpers implements helper function -// related to client configurations -package clientconfighelpers - -import ( - "encoding/base64" - "os" - - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" -) - -// GetCustomRepositoryCaCertificateForClient returns CA certificate to use with cli client -// This function reads the CA certificate from following variables in decreasing order of precedence: -// 1. PROXY_CA_CERT -// 2. TKG_PROXY_CA_CERT -// 3. TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE -func GetCustomRepositoryCaCertificateForClient(tkgconfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) ([]byte, error) { - caCert := "" - var errProxyCACert, errTkgProxyCACertValue, errCustomImageRepoCACert error - var proxyCACertValue, tkgProxyCACertValue, customImageRepoCACert string - - // Get the proxy configuration from tkgconfigreaderwriter if not nil - // otherwise get the same proxy configuration from os environment variable - if tkgconfigReaderWriter != nil { - proxyCACertValue, errProxyCACert = tkgconfigReaderWriter.Get(constants.ProxyCACert) - tkgProxyCACertValue, errTkgProxyCACertValue = tkgconfigReaderWriter.Get(constants.TKGProxyCACert) - customImageRepoCACert, errCustomImageRepoCACert = tkgconfigReaderWriter.Get(constants.ConfigVariableCustomImageRepositoryCaCertificate) - } else { - proxyCACertValue = os.Getenv(constants.ProxyCACert) - tkgProxyCACertValue = os.Getenv(constants.TKGProxyCACert) - customImageRepoCACert = os.Getenv(constants.ConfigVariableCustomImageRepositoryCaCertificate) - } - - if errProxyCACert == nil && proxyCACertValue != "" { - caCert = proxyCACertValue - } else if errTkgProxyCACertValue == nil && tkgProxyCACertValue != "" { - caCert = tkgProxyCACertValue - } else if errCustomImageRepoCACert == nil && customImageRepoCACert != "" { - caCert = customImageRepoCACert - } else { - // return empty content when none is specified - return []byte{}, nil - } - - decoded, err := base64.StdEncoding.DecodeString(caCert) - if err != nil { - return nil, errors.Wrap(err, "unable to decode the base64-encoded custom registry CA certificate string") - } - return decoded, nil -} - -// AddRegistryTrustedRootCertsFileForWindows adds CA certificate to registry options for windows environments -func AddRegistryTrustedRootCertsFileForWindows(registryOpts *ctlimg.Opts) error { - filePath, err := tkgconfigpaths.GetRegistryTrustedCACertFileForWindows() - if err != nil { - return err - } - err = os.WriteFile(filePath, projectsRegistryCA, constants.ConfigFilePermissions) - if err != nil { - return errors.Wrapf(err, "failed to write the registry trusted CA cert to file '%s'", filePath) - } - registryOpts.CACertPaths = append(registryOpts.CACertPaths, filePath) - return nil -} diff --git a/tkg/cli/clientconfighelpers/windows_trusted_ca.go b/tkg/cli/clientconfighelpers/windows_trusted_ca.go deleted file mode 100644 index 75e2f6f321..0000000000 --- a/tkg/cli/clientconfighelpers/windows_trusted_ca.go +++ /dev/null @@ -1,3553 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clientconfighelpers - -// The embedded CA bundle is fetched from https://wiki.mozilla.org/CA/Included_Certificates -// The exact URL from where the bundle is downloaded from - https://ccadb-public.secure.force.com/mozilla/IncludedRootsPEMTxt?TrustBitsInclude=Websites -// TODO: This bundle has to be updated periodically -var projectsRegistryCA = []byte(` ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw -gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL -Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg -MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw -BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 -MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 -c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ -bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ -2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E -T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j -5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM -C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T -DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX -wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A -2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm -nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 -dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl -N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj -c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS -5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS -Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr -hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ -B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI -AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw -H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ -b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk -2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol -IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk -5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY -n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD -VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU -ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH -MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO -MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv -Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz -f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO -8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq -d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM -tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt -Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB -o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x -PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM -wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d -GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH -6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby -RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG -EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo -bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ -TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s -b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 -WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS -fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB -zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq -hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB -CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD -+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG -A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg -SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v -dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ -BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ -HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH -3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH -GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c -xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 -aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq -TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 -/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 -kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG -YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT -+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo -WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG -EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx -IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND -IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci -MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti -sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O -BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB -Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c -3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J -0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV -BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g -Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ -BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ -R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF -dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw -vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ -uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp -n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs -cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW -xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P -rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF -DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx -DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy -LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C -eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ -d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq -kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC -b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl -qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 -OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c -NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk -ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO -pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj -03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk -PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE -1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX -QRBdJ3NghVdJIgc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 -MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc -tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd -IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j -b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC -AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw -ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m -iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF -Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ -hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P -Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE -EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV -1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t -CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR -5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw -f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 -ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK -GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG -SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN -FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w -DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw -CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh -DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw -CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x -ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 -c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx -OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI -SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI -b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn -swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu -7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 -1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW -80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP -JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l -RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw -hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 -coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc -BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n -twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud -DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W -0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe -uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q -lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB -aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE -sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT -MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe -qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh -VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 -h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 -EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK -yeC2nOnOcXHebD8WpHk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD -VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf -BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 -YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x -NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G -A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 -d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF -Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB -BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ -j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF -1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G -A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 -AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC -MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu -Sw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw -CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw -FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S -Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 -MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL -DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS -QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH -sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK -Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu -SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC -MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy -v+c= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL -BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x -FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx -MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s -THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc -IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU -AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ -GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 -8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH -flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt -J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim -0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN -pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ -UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW -OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB -AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet -8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd -nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j -bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM -Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv -TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS -S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr -I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 -b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB -UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P -Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven -sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw -RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY -BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz -MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u -LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 -v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd -e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw -V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA -AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG -GJTO ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa -Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 -YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw -qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv -Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 -lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz -Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ -KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK -FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj -HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr -y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ -/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM -a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 -fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG -SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi -7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc -SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza -ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc -XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg -iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho -L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF -Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr -kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ -vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU -YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV -BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk -LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv -b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ -BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg -THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v -IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv -xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H -Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB -eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo -jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ -+efcMQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG -A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw -FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx -MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u -aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b -RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z -YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 -QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw -yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ -BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ -SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH -r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 -4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me -dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw -q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 -nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu -H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA -VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC -XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd -6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf -+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi -kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 -wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB -TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C -MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn -4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I -aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy -qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB -8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy -dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 -YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 -dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh -IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD -LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG -EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g -KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD -ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu -bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg -ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R -85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm -4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV -HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd -QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t -lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB -o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 -opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo -dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW -ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN -AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y -/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k -SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy -Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS -Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl -nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 -MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub -j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo -U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b -u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ -bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er -fF6adulZkMV8gzURZVE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA -MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD -VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy -MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt -c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ -OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG -vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud -316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo -0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE -y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF -zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE -+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN -I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs -x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa -ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC -4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 -7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg -JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti -2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk -pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF -FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt -rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk -ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 -u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP -4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 -N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 -vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx -CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD -ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw -MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex -HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq -R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd -yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ -7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 -+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNV -BAUTCUc2MzI4NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlk -YWQgZGUgQ2VydGlmaWNhY2lvbjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNV -BAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3QgQ0EwHhcNMTkwOTA0MTAwMDM4WhcN -MzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEwMQswCQYDVQQGEwJF -UzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQwEgYD -VQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9v -dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCj -cqQZAZ2cC4Ffc0m6p6zzBE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9q -yGFOtibBTI3/TO80sh9l2Ll49a2pcbnvT1gdpd50IJeh7WhM3pIXS7yr/2WanvtH -2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcvB2VSAKduyK9o7PQUlrZX -H1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXsezx76W0OL -zc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyR -p1RMVwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQz -W7i1o0TJrH93PB0j7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/ -SiOL9V8BY9KHcyi1Swr1+KuCLH5zJTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJn -LNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe8TZBAQIvfXOn3kLMTOmJDVb3 -n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVOHj1tyRRM4y5B -u8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj -o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC -AgEATh65isagmD9uw2nAalxJUqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L -9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzxj6ptBZNscsdW699QIyjlRRA96Gej -rw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDtdD+4E5UGUcjohybK -pFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM5gf0 -vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjq -OknkJjCb5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ -/zo1PqVUSlJZS2Db7v54EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ9 -2zg/LFis6ELhDtjTO0wugumDLmsx2d1Hhk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI -+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGyg77FGr8H6lnco4g175x2 -MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3r5+qPeoo -tt7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw -NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv -b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD -VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F -VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 -7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X -Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ -/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs -81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm -dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe -Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu -sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 -pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs -slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ -arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD -VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG -9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl -dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj -TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed -Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 -Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI -OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 -vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW -t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn -HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx -SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL -BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg -Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv -b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG -EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u -IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ -n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd -2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF -VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ -GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF -li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU -r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 -eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb -MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg -jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB -7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW -5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE -ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 -90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z -xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu -QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 -FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH -22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP -xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn -dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 -Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b -nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ -CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH -u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj -d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 -NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC -/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD -wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 -OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA -y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb -gfM0agPnIjhQW+0ZT0MW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y -IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig -RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb -3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA -BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 -3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou -owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ -wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF -ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf -BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv -civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 -AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F -hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 -soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI -WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi -tJ/X5g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV -BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw -IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy -dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig -Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk -MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg -Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD -VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy -dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ -QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq -1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp -2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK -DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape -az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF -3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 -oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM -g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 -mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh -8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd -BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U -nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw -DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX -dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ -MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL -/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX -CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa -ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW -2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 -N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 -Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB -As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp -5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu -1uwJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs -MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg -Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL -MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl -YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv -b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l -mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE -4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv -a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M -pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw -Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b -LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY -AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB -AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq -E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr -W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ -CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU -X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 -f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja -H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP -JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P -zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt -jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 -/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT -BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 -aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW -xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU -63ZTGI0RmLo= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw -CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh -cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v -dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG -A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj -aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg -Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 -KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y -STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD -AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw -SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN -nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD -VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk -MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U -cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y -IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB -pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h -IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG -A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU -cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid -RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V -seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme -9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV -EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW -hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ -DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD -ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I -/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf -ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ -yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts -L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN -zl/HHk484IkzlQsPpTLWPFp5LBk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw -CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg -R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 -MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT -ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW -+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 -ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI -zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW -tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 -/q4AaOeMSQ+2b1tbFfLn ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y -MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg -TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS -b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS -M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC -UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d -Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p -rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l -pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb -j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC -KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS -/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X -cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH -1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP -px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 -MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u -2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS -v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC -wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy -CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e -vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 -Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa -Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL -eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 -FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc -7uzXLg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 -cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs -IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz -dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy -NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu -dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt -dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 -aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T -RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN -cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW -wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 -U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 -jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN -BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ -jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v -1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R -nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH -VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG -A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 -d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu -dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq -RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy -MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD -VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 -L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g -Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi -A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt -ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH -Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC -R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX -hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw -CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw -JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT -EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 -WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT -LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX -BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE -KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm -Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 -EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J -UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn -nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6 -MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu -MScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNV -BAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwHhcNMTgwMzE2MTIxMDEzWhcNNDMw -MzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEg -U3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZ -n0EGze2jusDbCSzBfN8pfktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/q -p1x4EaTByIVcJdPTsuclzxFUl6s1wB52HO8AU5853BSlLCIls3Jy/I2z5T4IHhQq -NwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2fJmItdUDmj0VDT06qKhF -8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGtg/BKEiJ3 -HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGa -mqi4NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi -7VdNIuJGmj8PkTQkfVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSF -ytKAQd8FqKPVhJBPC/PgP5sZ0jeJP/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0P -qafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSYnjYJdmZm/Bo/6khUHL4wvYBQ -v3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHKHRzQ+8S1h9E6 -Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 -vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQAD -ggIBAEii1QALLtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4 -WxmB82M+w85bj/UvXgF2Ez8sALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvo -zMrnadyHncI013nR03e4qllY/p0m+jiGPp2Kh2RX5Rc64vmNueMzeMGQ2Ljdt4NR -5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8CYyqOhNf6DR5UMEQ -GfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA4kZf -5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq -0Uc9NneoWWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7D -P78v3DSk+yshzWePS/Tj6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTM -qJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmTOPQD8rv7gmsHINFSH5pkAnuYZttcTVoP -0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZckbxJF0WddCajJFdr60qZf -E2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx -CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE -AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 -NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ -MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq -AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 -vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 -lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD -n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT -7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o -6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC -TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 -WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R -DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI -pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj -YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy -rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ -8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi -0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM -A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS -SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K -TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF -6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er -3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt -Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT -VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW -ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA -rBPuUBQemMc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP -Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr -ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL -MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 -yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr -VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ -nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG -XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj -vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt -Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g -N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC -nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz -dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL -MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp -cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y -YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua -kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL -QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp -6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG -yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i -QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ -KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO -tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu -QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ -Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u -olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 -x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE -BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz -dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG -A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U -cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf -qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ -JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ -+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS -s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 -HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 -70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG -V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S -qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S -5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia -C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX -OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE -FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 -KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B -8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ -MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc -0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ -u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF -u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH -YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 -GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO -RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e -KeC2uAloGRwYQw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC -VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ -cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ -BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt -VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D -0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 -ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G -A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs -aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I -flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE -AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG -EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM -FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC -REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp -Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM -VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ -SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ -4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L -cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi -eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG -A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 -DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j -vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP -DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc -maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D -lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv -KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL -BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ -SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n -a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5 -NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT -CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u -Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO -dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI -VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV -9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY -2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY -vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt -bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb -x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+ -l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK -TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj -Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e -i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw -DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG -7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk -MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr -gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk -GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS -3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm -Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+ -l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c -JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP -L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa -LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG -mpv0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM -BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG -T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx -CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD -b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA -iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH -38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE -HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz -kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP -szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq -vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf -nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG -YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo -0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a -CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K -AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I -36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN -qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj -cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm -+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL -hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe -lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 -p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 -piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR -LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX -5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO -dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul -9XXeifdy ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi -QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR -HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D -9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 -p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo -27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w -Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw -TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl -qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH -szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 -Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk -MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 -wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p -aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN -VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb -C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe -QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy -h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 -7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J -ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef -MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ -Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT -6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ -0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm -2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb -bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt -nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY -6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu -MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k -RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg -f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV -+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo -dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW -Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa -G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq -gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H -vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 -0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC -B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u -NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg -yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev -HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 -xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR -TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg -JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV -7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl -6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G -jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 -4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 -VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm -ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD -VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw -MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g -UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT -BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx -uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV -HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ -+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 -bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD -VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw -MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV -UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy -b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR -ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb -hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 -FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV -L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB -iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl -MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw -NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG -EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N -aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ -Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 -ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 -HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm -gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ -jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc -aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG -YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 -W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K -UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH -+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q -W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC -LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC -gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 -tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh -SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 -TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 -pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR -xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp -GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 -dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN -AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB -RA+GsCyRxj3qrg+E ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 -NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS -zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 -QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ -VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW -wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV -dWNbFJWcHwHP2NVypw87 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ -FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F -uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX -kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs -ewv4n4Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu -hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l -xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 -CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx -sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM -f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX -mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 -zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P -fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc -vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 -Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp -zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO -Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW -k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ -DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF -lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW -Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z -XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR -gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 -d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv -J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg -DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM -+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy -F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 -SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws -E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv -CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg -GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu -XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd -re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu -PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 -mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K -8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj -x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR -nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 -kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok -twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp -8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT -vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT -z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA -pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb -pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB -R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R -RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk -0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC -5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF -izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn -yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout -736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A -DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk -fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA -njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- -`) diff --git a/tkg/client/activate_deactivate_tkr.go b/tkg/client/activate_deactivate_tkr.go deleted file mode 100644 index 43bb35ad87..0000000000 --- a/tkg/client/activate_deactivate_tkr.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "time" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -// ActivateTanzuKubernetesReleases activates TKr -func (c *TkgClient) ActivateTanzuKubernetesReleases(tkrName string) error { - regionalClusterClient, err := c.getRegionalClusterClient() - if err != nil { - return errors.Wrap(err, "failed to get management cluster client") - } - - return regionalClusterClient.ActivateTanzuKubernetesReleases(tkrName) -} - -// DeactivateTanzuKubernetesReleases deactivates TKR -func (c *TkgClient) DeactivateTanzuKubernetesReleases(tkrName string) error { - regionalClusterClient, err := c.getRegionalClusterClient() - if err != nil { - return errors.Wrap(err, "failed to get management cluster client") - } - - return regionalClusterClient.DeactivateTanzuKubernetesReleases(tkrName) -} - -func (c *TkgClient) getRegionalClusterClient() (clusterclient.Client, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return nil, errors.Wrap(err, "cannot get current management cluster context") - } - - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get cluster client") - } - return regionalClusterClient, nil -} diff --git a/tkg/client/admission_upgrade_helper.go b/tkg/client/admission_upgrade_helper.go deleted file mode 100644 index c0cb409975..0000000000 --- a/tkg/client/admission_upgrade_helper.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - corev1 "k8s.io/api/core/v1" - capibootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -const ( - admissionPodSecurityConfigFilePath = "/etc/kubernetes/kube-apiserver-admission-pss.yaml" - admissionPodSecurityConfigFileData = `apiVersion: apiserver.config.k8s.io/v1 -kind: AdmissionConfiguration -plugins: -- name: PodSecurity - configuration: - apiVersion: pod-security.admission.config.k8s.io/v1beta1 - kind: PodSecurityConfiguration - defaults: - enforce: "" - enforce-version: "" - audit: "baseline" - audit-version: "v1.24" - warn: "baseline" - warn-version: "v1.24" - exemptions: - usernames: [] - runtimeClasses: [] - namespaces: ["kube-system","tkg-system"] -` - admissionPodSecurityConfigFlagName = "admission-control-config-file" -) - -func (c *TkgClient) configurePodSecurityStandard(old *controlplanev1.KubeadmControlPlane) *controlplanev1.KubeadmControlPlane { - - fileExists := false - for _, f := range old.Spec.KubeadmConfigSpec.Files { - if f.Path == admissionPodSecurityConfigFilePath { - fileExists = true - break - } - } - - volumeMountExists := false - if old.Spec.KubeadmConfigSpec.ClusterConfiguration != nil { - for _, m := range old.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.ExtraVolumes { - if m.HostPath == admissionPodSecurityConfigFilePath { - volumeMountExists = true - break - } - } - } - - if old.Spec.KubeadmConfigSpec.ClusterConfiguration != nil && old.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.ExtraArgs != nil { - if _, flagExists := old.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.ExtraArgs[admissionPodSecurityConfigFlagName]; flagExists { - log.Warningf("Skipping to enable Pod Security Standard for KCP: flag %q already exists", admissionPodSecurityConfigFlagName) - return nil - } - } - - kcp := old.DeepCopy() - - if !fileExists { - kcp.Spec.KubeadmConfigSpec.Files = append(kcp.Spec.KubeadmConfigSpec.Files, - capibootstrapv1.File{ - Path: admissionPodSecurityConfigFilePath, - Content: admissionPodSecurityConfigFileData, - }, - ) - } - - if !volumeMountExists { - if kcp.Spec.KubeadmConfigSpec.ClusterConfiguration == nil { - kcp.Spec.KubeadmConfigSpec.ClusterConfiguration = &capibootstrapv1.ClusterConfiguration{} - } - - kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.ExtraVolumes = append(kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.ExtraVolumes, - capibootstrapv1.HostPathMount{ - Name: "admission-pss", - HostPath: admissionPodSecurityConfigFilePath, - MountPath: admissionPodSecurityConfigFilePath, - ReadOnly: true, - PathType: corev1.HostPathFile, - }, - ) - } - - if kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.ExtraArgs == nil { - kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.ExtraArgs = map[string]string{} - } - kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.ExtraArgs[admissionPodSecurityConfigFlagName] = admissionPodSecurityConfigFilePath - - return kcp -} diff --git a/tkg/client/admission_upgrade_helper_test.go b/tkg/client/admission_upgrade_helper_test.go deleted file mode 100644 index 2dc9c5c2c2..0000000000 --- a/tkg/client/admission_upgrade_helper_test.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "reflect" - "testing" - - corev1 "k8s.io/api/core/v1" - capibootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" -) - -func TestTkgClient_configurePodSecurityStandard(t *testing.T) { - c := &TkgClient{} - - kcpFlagOnly := &controlplanev1.KubeadmControlPlane{ - Spec: controlplanev1.KubeadmControlPlaneSpec{ - KubeadmConfigSpec: capibootstrapv1.KubeadmConfigSpec{ - ClusterConfiguration: &capibootstrapv1.ClusterConfiguration{ - APIServer: capibootstrapv1.APIServer{ - ControlPlaneComponent: capibootstrapv1.ControlPlaneComponent{ - ExtraArgs: map[string]string{ - admissionPodSecurityConfigFlagName: admissionPodSecurityConfigFilePath, - }, - }, - }, - }, - }, - }, - } - kcp := kcpFlagOnly.DeepCopy() - kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.APIServer.ExtraVolumes = []capibootstrapv1.HostPathMount{ - { - Name: "admission-pss", - HostPath: admissionPodSecurityConfigFilePath, - MountPath: admissionPodSecurityConfigFilePath, - ReadOnly: true, - PathType: corev1.HostPathFile, - }, - } - kcp.Spec.KubeadmConfigSpec.Files = []capibootstrapv1.File{ - { - Path: admissionPodSecurityConfigFilePath, - Content: admissionPodSecurityConfigFileData, - }, - } - - tests := []struct { - name string - old *controlplanev1.KubeadmControlPlane - want *controlplanev1.KubeadmControlPlane - }{ - { - "nil pointer check + apply patch", - &controlplanev1.KubeadmControlPlane{}, - kcp.DeepCopy(), - }, - { - "no-op", - kcp.DeepCopy(), - nil, - }, - { - "no-op if flag already set", - kcpFlagOnly.DeepCopy(), - nil, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := c.configurePodSecurityStandard(tt.old); !reflect.DeepEqual(got, tt.want) { - t.Errorf("TkgClient.configurePodSecurityStandard() = %v, want %v", got, tt.want) - } - }) - } -} diff --git a/tkg/client/audit_upgrade_helper.go b/tkg/client/audit_upgrade_helper.go deleted file mode 100644 index 7c7f5b0e9c..0000000000 --- a/tkg/client/audit_upgrade_helper.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "encoding/base64" - "strings" - - "github.com/pkg/errors" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" -) - -const ( - auditConfigFilePath = "/etc/kubernetes/audit-policy.yaml" - apiVersionV1Alpha1 = "apiVersion: audit.k8s.io/v1alpha1" - apiVersionV1Beta1 = "apiVersion: audit.k8s.io/v1beta1" - apiVersionV1 = "apiVersion: audit.k8s.io/v1" -) - -func (c *TkgClient) configureAuditVersion(old *controlplanev1.KubeadmControlPlane) (*controlplanev1.KubeadmControlPlane, error) { - for i, f := range old.Spec.KubeadmConfigSpec.Files { - if f.Path == auditConfigFilePath { - decodedstr := "" - if f.Encoding == "base64" || f.Encoding == "" { - decoded, err := base64.StdEncoding.DecodeString(f.Content) - if err != nil { - return nil, err - } - decodedstr = string(decoded) - } else if f.Encoding == "gzip" || f.Encoding == "gzip+base64" { - // TODO we only have base64 at the moment in legacy cluster's yaml, do nothing here in case do has different encodings - return nil, nil - } else { - return nil, errors.Errorf("unknown audit content encoding %s", f.Encoding) - } - - if strings.Contains(decodedstr, apiVersionV1Alpha1) || strings.Contains(decodedstr, apiVersionV1Beta1) { - kcp := old.DeepCopy() - newFile := f.DeepCopy() - newContent := strings.ReplaceAll(decodedstr, apiVersionV1Beta1, apiVersionV1) - newContent = strings.ReplaceAll(newContent, apiVersionV1Alpha1, apiVersionV1) - newFile.Content = base64.StdEncoding.EncodeToString([]byte(newContent)) - kcp.Spec.KubeadmConfigSpec.Files[i] = *newFile - return kcp, nil - } else { - return nil, nil - } - } - } - return nil, nil -} diff --git a/tkg/client/audit_upgrade_helper_test.go b/tkg/client/audit_upgrade_helper_test.go deleted file mode 100644 index ee00bf3a3f..0000000000 --- a/tkg/client/audit_upgrade_helper_test.go +++ /dev/null @@ -1,420 +0,0 @@ -// Copyright 2023 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "encoding/base64" - "fmt" - "reflect" - "testing" - - corev1 "k8s.io/api/core/v1" - capibootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" -) - -const ( - auditConfigFileString = ` - apiVersion: %s - kind: Policy - rules: - - level: None - users: - - system:serviceaccount:kube-system:kube-proxy - verbs: - - watch - resources: - - group: "" - resources: - - endpoints - - services - - services/status - - level: None - userGroups: - - system:nodes - verbs: - - get - resources: - - group: "" - resources: - - nodes - - nodes/status - - level: None - users: - - system:kube-controller-manager - - system:kube-scheduler - - system:serviceaccount:kube-system:endpoint-controller - verbs: - - get - - update - namespaces: - - kube-system - resources: - - group: "" - resources: - - endpoints - - level: None - users: - - system:apiserver - verbs: - - get - resources: - - group: "" - resources: - - namespaces - - namespaces/status - - namespaces/finalize - - level: None - users: - - system:kube-controller-manager - verbs: - - get - - list - resources: - - group: metrics.k8s.io - - level: None - nonResourceURLs: - - /healthz* - - /version - - /swagger* - - level: None - resources: - - group: "" - resources: - - events - - level: None - userGroups: - - system:serviceaccounts:vmware-system-tmc - verbs: - - get - - list - - watch - - level: None - users: - - system:serviceaccount:kube-system:generic-garbage-collector - verbs: - - get - - list - - watch - - level: Request - userGroups: - - system:nodes - verbs: - - update - - patch - resources: - - group: "" - resources: - - nodes/status - - pods/status - omitStages: - - RequestReceived - - level: Request - users: - - system:serviceaccount:kube-system:namespace-controller - verbs: - - deletecollection - omitStages: - - RequestReceived - - level: Metadata - resources: - - group: "" - resources: - - secrets - - configmaps - - group: authentication.k8s.io - resources: - - tokenreviews - omitStages: - - RequestReceived - - level: Request - verbs: - - get - - list - - watch - resources: - - group: "" - - group: admissionregistration.k8s.io - - group: apiextensions.k8s.io - - group: apiregistration.k8s.io - - group: apps - - group: authentication.k8s.io - - group: authorization.k8s.io - - group: autoscaling - - group: batch - - group: certificates.k8s.io - - group: extensions - - group: metrics.k8s.io - - group: networking.k8s.io - - group: policy - - group: rbac.authorization.k8s.io - - group: settings.k8s.io - - group: storage.k8s.io - omitStages: - - RequestReceived - - level: RequestResponse - resources: - - group: "" - - group: admissionregistration.k8s.io - - group: apiextensions.k8s.io - - group: apiregistration.k8s.io - - group: apps - - group: authentication.k8s.io - - group: authorization.k8s.io - - group: autoscaling - - group: batch - - group: certificates.k8s.io - - group: extensions - - group: metrics.k8s.io - - group: networking.k8s.io - - group: policy - - group: rbac.authorization.k8s.io - - group: settings.k8s.io - - group: storage.k8s.io - omitStages: - - RequestReceived - - level: Metadata - omitStages: - - RequestReceived - ` -) - -func TestTkgClient_updateAuditConfig(t *testing.T) { - c := &TkgClient{} - - auditContentV1Alpha1 := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf(auditConfigFileString, "audit.k8s.io/v1alpha1"))) - kcp_v1aplha1 := &controlplanev1.KubeadmControlPlane{ - Spec: controlplanev1.KubeadmControlPlaneSpec{ - KubeadmConfigSpec: capibootstrapv1.KubeadmConfigSpec{ - ClusterConfiguration: &capibootstrapv1.ClusterConfiguration{ - APIServer: capibootstrapv1.APIServer{ - ControlPlaneComponent: capibootstrapv1.ControlPlaneComponent{ - ExtraArgs: map[string]string{ - admissionPodSecurityConfigFlagName: admissionPodSecurityConfigFilePath, - }, - ExtraVolumes: []capibootstrapv1.HostPathMount{ - { - Name: "audit-policy", - HostPath: auditConfigFilePath, - MountPath: auditConfigFilePath, - ReadOnly: true, - PathType: corev1.HostPathFile, - }, - }, - }, - }, - }, - Files: []capibootstrapv1.File{ - { - Path: auditConfigFilePath, - Content: auditContentV1Alpha1, - Encoding: "base64", - }, - }, - }, - }, - } - - auditContentV1Beta1 := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf(auditConfigFileString, "audit.k8s.io/v1beta1"))) - kcp_v1beta1 := &controlplanev1.KubeadmControlPlane{ - Spec: controlplanev1.KubeadmControlPlaneSpec{ - KubeadmConfigSpec: capibootstrapv1.KubeadmConfigSpec{ - ClusterConfiguration: &capibootstrapv1.ClusterConfiguration{ - APIServer: capibootstrapv1.APIServer{ - ControlPlaneComponent: capibootstrapv1.ControlPlaneComponent{ - ExtraArgs: map[string]string{ - admissionPodSecurityConfigFlagName: admissionPodSecurityConfigFilePath, - }, - ExtraVolumes: []capibootstrapv1.HostPathMount{ - { - Name: "audit-policy", - HostPath: auditConfigFilePath, - MountPath: auditConfigFilePath, - ReadOnly: true, - PathType: corev1.HostPathFile, - }, - }, - }, - }, - }, - Files: []capibootstrapv1.File{ - { - Path: auditConfigFilePath, - Content: auditContentV1Beta1, - Encoding: "base64", - }, - }, - }, - }, - } - - auditContentV1 := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf(auditConfigFileString, "audit.k8s.io/v1"))) - kcp_v1 := &controlplanev1.KubeadmControlPlane{ - Spec: controlplanev1.KubeadmControlPlaneSpec{ - KubeadmConfigSpec: capibootstrapv1.KubeadmConfigSpec{ - ClusterConfiguration: &capibootstrapv1.ClusterConfiguration{ - APIServer: capibootstrapv1.APIServer{ - ControlPlaneComponent: capibootstrapv1.ControlPlaneComponent{ - ExtraArgs: map[string]string{ - admissionPodSecurityConfigFlagName: admissionPodSecurityConfigFilePath, - }, - ExtraVolumes: []capibootstrapv1.HostPathMount{ - { - Name: "audit-policy", - HostPath: auditConfigFilePath, - MountPath: auditConfigFilePath, - ReadOnly: true, - PathType: corev1.HostPathFile, - }, - }, - }, - }, - }, - Files: []capibootstrapv1.File{ - { - Path: auditConfigFilePath, - Content: auditContentV1, - Encoding: "base64", - }, - }, - }, - }, - } - - kcp_more_cases := &controlplanev1.KubeadmControlPlane{ - Spec: controlplanev1.KubeadmControlPlaneSpec{ - KubeadmConfigSpec: capibootstrapv1.KubeadmConfigSpec{ - ClusterConfiguration: &capibootstrapv1.ClusterConfiguration{ - APIServer: capibootstrapv1.APIServer{ - ControlPlaneComponent: capibootstrapv1.ControlPlaneComponent{ - ExtraArgs: map[string]string{ - admissionPodSecurityConfigFlagName: admissionPodSecurityConfigFilePath, - }, - ExtraVolumes: []capibootstrapv1.HostPathMount{ - { - Name: "audit-policy", - HostPath: auditConfigFilePath, - MountPath: auditConfigFilePath, - ReadOnly: true, - PathType: corev1.HostPathFile, - }, - }, - }, - }, - }, - }, - }, - } - - tests := []struct { - name string - old *controlplanev1.KubeadmControlPlane - want *controlplanev1.KubeadmControlPlane - }{ - { - "v1alpha1 replace check", - kcp_v1aplha1.DeepCopy(), - kcp_v1.DeepCopy(), - }, - { - "v1beta1 replace check", - kcp_v1beta1.DeepCopy(), - kcp_v1.DeepCopy(), - }, - { - "no-op", - kcp_v1.DeepCopy(), - nil, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := c.configureAuditVersion(tt.old) - if err != nil { - t.Errorf("TkgClient.TestTkgClient_updateAuditConfig() has error %v", err.Error()) - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("TkgClient.TestTkgClient_updateAuditConfig() = %v, want %v", got, tt.want) - } - }) - } - - kcp_more_cases.Spec.KubeadmConfigSpec.Files = []capibootstrapv1.File{ - { - Path: auditConfigFilePath, - Content: "12345", - Encoding: "base64", - }, - } - t.Run("bad audit content", func(t *testing.T) { - got, err := c.configureAuditVersion(kcp_more_cases) - if err == nil || got != nil { - t.Errorf("TkgClient.TestTkgClient_updateAuditConfig() bad content in audit should return nil kcp and give error") - } - }) - - kcp_more_cases.Spec.KubeadmConfigSpec.Files = []capibootstrapv1.File{ - { - Path: auditConfigFilePath, - Content: auditContentV1, - Encoding: "encoding_not_exists", - }, - } - t.Run("bad audit content encoding type", func(t *testing.T) { - got, err := c.configureAuditVersion(kcp_more_cases) - if err == nil || got != nil { - t.Errorf("TkgClient.TestTkgClient_updateAuditConfig() bad content encoding type in audit should return nil kcp and give error") - } - }) - - kcp_more_cases.Spec.KubeadmConfigSpec.Files = []capibootstrapv1.File{ - { - Path: auditConfigFilePath, - Content: auditContentV1, - Encoding: "gzip", - }, - } - t.Run("gzip audit content encoding", func(t *testing.T) { - got, err := c.configureAuditVersion(kcp_more_cases) - if err != nil || got != nil { - t.Errorf("TkgClient.TestTkgClient_updateAuditConfig() gzip content encoding in audit should return nil kcp and give no error") - } - }) - - kcp_more_cases.Spec.KubeadmConfigSpec.Files = []capibootstrapv1.File{} - t.Run("empty files array", func(t *testing.T) { - got, err := c.configureAuditVersion(kcp_more_cases) - if err != nil || got != nil { - t.Errorf("TkgClient.TestTkgClient_updateAuditConfig() empty files array should return nil kcp and give no error") - } - }) - - kcp_more_cases.Spec.KubeadmConfigSpec.Files = []capibootstrapv1.File{ - { - Path: "/etc/kubernetes/anotherfile.yaml", - Content: auditContentV1, - Encoding: "base64", - }, - } - t.Run("have files but not audit file", func(t *testing.T) { - got, err := c.configureAuditVersion(kcp_more_cases) - if err != nil || got != nil { - t.Errorf("TkgClient.TestTkgClient_updateAuditConfig() files do not have audit file path should return nil kcp and give no error") - } - }) - - kcp_more_cases.Spec.KubeadmConfigSpec.Files = []capibootstrapv1.File{ - { - Path: "/etc/kubernetes/anotherfile.yaml", - Content: auditContentV1, - Encoding: "encoding_not_exists", - }, - } - t.Run("have none audit file with not existed encoding", func(t *testing.T) { - got, err := c.configureAuditVersion(kcp_more_cases) - if err != nil || got != nil { - t.Errorf("TkgClient.TestTkgClient_updateAuditConfig() should skip file content check that is not audit yaml") - } - }) -} diff --git a/tkg/client/ceip.go b/tkg/client/ceip.go deleted file mode 100644 index 40f9a0eb7f..0000000000 --- a/tkg/client/ceip.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "time" - - "github.com/pkg/errors" - "golang.org/x/mod/semver" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" -) - -// ClusterCeipInfo is the cmd object for outputting the CEIP status of a clsuter -type ClusterCeipInfo struct { - ClusterName string `json:"name" yaml:"name"` - CeipStatus string `json:"ceipOptIn" yaml:"ceipOptIn"` -} - -// CeipOptOutStatus and CeipOptInStatus are constants for the CEIP opt-in/out verbiage -const ( - CeipOptInStatus = "Opt-in" - CeipOptOutStatus = "Opt-out" - CeipPacificCluster = "N/A" -) - -// SetCEIPParticipation sets CEIP participation -func (c *TkgClient) SetCEIPParticipation(ceipOptIn bool, isProd, labels string) error { - context, err := c.GetCurrentRegionContext() - if err != nil { - return errors.Wrap(err, "current management cluster context could not be found") - } - - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - - clusterClient, err := clusterclient.NewClient(context.SourceFilePath, context.ContextName, clusterclientOptions) - if err != nil { - return errors.Wrap(err, "unable to get cluster client while setting CEIP participation") - } - - ok, err := c.ShouldManageCEIP(clusterClient, context) - if err != nil { - return err - } - - if ok { - err = c.DoSetCEIPParticipation(clusterClient, context, ceipOptIn, isProd, labels) - if err != nil { - return err - } - } - - return nil -} - -// DoSetCEIPParticipation performs steps to set CEIP participation -func (c *TkgClient) DoSetCEIPParticipation(clusterClient clusterclient.Client, context region.RegionContext, ceipOptIn bool, isProd, labels string) error { - isPacific, err := clusterClient.IsPacificRegionalCluster() - if err == nil && isPacific { - return errors.Errorf("cannot change CEIP settings for a supervisor cluster which is on vSphere with Tanzu. Please change your CEIP settings within vSphere") - } - clusterName, err := clusterClient.GetCurrentClusterName(context.ContextName) - if err != nil { - return errors.Wrap(err, "unable to get cluster name") - } - - optStatus := "" - if ceipOptIn { - optStatus = CeipOptInStatus - provider, err := clusterClient.GetRegionalClusterDefaultProviderName(clusterctlv1.InfrastructureProviderType) - if err != nil { - return errors.Wrap(err, "unable to get cluster provider name") - } - providerName, _, err := ParseProviderName(provider) - if err != nil { - return errors.Wrap(err, "unable to parse provider name") - } - bomConfig, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return errors.Wrapf(err, "failed to get default bom configuration") - } - - httpProxy, httpsProxy, noProxy := "", "", "" - if httpProxy, err = c.TKGConfigReaderWriter().Get(constants.TKGHTTPProxy); err == nil && httpProxy != "" { - httpsProxy, _ = c.TKGConfigReaderWriter().Get(constants.TKGHTTPSProxy) - noProxy, err = c.getFullTKGNoProxy(providerName) - if err != nil { - return err - } - } - - err = clusterClient.AddCEIPTelemetryJob(clusterName, providerName, bomConfig, isProd, labels, httpProxy, httpsProxy, noProxy) - if err != nil { - return errors.Wrapf(err, "failed to add CEIP component to management cluster '%s'", clusterName) - } - } else { - optStatus = CeipOptOutStatus - err = clusterClient.RemoveCEIPTelemetryJob(clusterName) - if err != nil { - return errors.Wrapf(err, "failed to remove CEIP component to management cluster '%s'", clusterName) - } - } - log.Infof("Successfully changed CEIP settings of management cluster '%s' to: '%s'\n", clusterName, optStatus) - return nil -} - -// GetCEIPParticipation get CEIP participation details -func (c *TkgClient) GetCEIPParticipation() (ClusterCeipInfo, error) { - status := ClusterCeipInfo{} - context, err := c.GetCurrentRegionContext() - if err != nil { - return status, errors.Wrap(err, "current management cluster context could not be found") - } - - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - - clusterClient, err := clusterclient.NewClient(context.SourceFilePath, context.ContextName, clusterclientOptions) - if err != nil { - return status, errors.Wrap(err, "unable to get cluster client") - } - - status, err = c.DoGetCEIPParticipation(clusterClient, context.ClusterName) - if err != nil { - return status, err - } - - return status, nil -} - -// DoGetCEIPParticipation get CEIP participation details -func (c *TkgClient) DoGetCEIPParticipation(clusterClient clusterclient.Client, clusterName string) (ClusterCeipInfo, error) { - ceipStatus := CeipOptInStatus - - isPacific, err := clusterClient.IsPacificRegionalCluster() - if err == nil && isPacific { - ceipStatus = CeipPacificCluster - } else { - hasCeip, err := clusterClient.HasCEIPTelemetryJob(clusterName) - if err != nil { - return ClusterCeipInfo{}, errors.Wrapf(err, "failed to check if CEIP is enabled on cluster '%s'", clusterName) - } - if !hasCeip { - ceipStatus = CeipOptOutStatus - } - } - - return ClusterCeipInfo{ - ClusterName: clusterName, - CeipStatus: ceipStatus, - }, nil -} - -// ShouldManageCEIP determines if TKG should be managing CEIP -// starting in TKG v1.6.0, the telemetry cron job will be configured by the tanzu telemetry plugin, and not the CEIP command -// the telemetry cron job will now also actively check CEIP participation status, and must always be installed -// the CEIP command will still be used to fix clusters v1.6.0+ that are in a bad state and are missing the cron job -func (c *TkgClient) ShouldManageCEIP(clusterClient clusterclient.Client, ctx region.RegionContext) (bool, error) { - clusterName, err := clusterClient.GetCurrentClusterName(ctx.ContextName) - if err != nil { - return false, errors.Wrap(err, "unable to get cluster name") - } - ver, err := clusterClient.GetManagementClusterTKGVersion(clusterName, TKGsystemNamespace) - if err != nil { - return false, errors.Wrap(err, "unable to get management cluster version") - } - CEIPJobExists, err := clusterClient.HasCEIPTelemetryJob(clusterName) - if err != nil { - return false, errors.Wrap(err, "unable to determine if telemetry cron job is installed already") - } - - if semver.Compare(ver, "v1.6.0") >= 0 && CEIPJobExists { - log.Info("tanzu management-cluster ceip-participation is deprecated on TKG 1.6 and beyond - please use tanzu telemetry update --ceip-opt-out/in to manage CEIP settings") - return false, nil - } - return true, nil -} diff --git a/tkg/client/ceip_test.go b/tkg/client/ceip_test.go deleted file mode 100644 index 4787ca6d6e..0000000000 --- a/tkg/client/ceip_test.go +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" -) - -var _ = Describe("Unit tests for ceip", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - tkgClient *TkgClient - clusterName string - ceipStatus ClusterCeipInfo - context region.RegionContext - ) - - BeforeEach(func() { - context = region.RegionContext{ - ClusterName: "fake-cluster", - ContextName: "fake-cluster-admin@fake-cluster", - } - regionalClusterClient = &fakes.ClusterClient{} - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - clusterName = "fake-cluster" - }) - - Describe("SetCEIP", func() { - BeforeEach(func() { - regionalClusterClient.RemoveCEIPTelemetryJobReturns(nil) - regionalClusterClient.AddCEIPTelemetryJobReturns(nil) - regionalClusterClient.GetRegionalClusterDefaultProviderNameReturns("aws:v0.5.5", nil) - regionalClusterClient.GetManagementClusterTKGVersionReturns("v1.5.0", nil) - }) - - Context("When opt-ing out of CEIP", func() { - JustBeforeEach(func() { - regionalClusterClient.IsPacificRegionalClusterReturns(false, nil) - err = tkgClient.DoSetCEIPParticipation(regionalClusterClient, context, false, "true", "") - }) - It("should not error", func() { - Expect(err).To(Not(HaveOccurred())) - }) - It("should have called RemoveCEIPTelemetryJob", func() { - Expect(regionalClusterClient.RemoveCEIPTelemetryJobCallCount()).To(Equal(1)) - }) - }) - - Context("When opt-ing in to CEIP on prod environment", func() { - JustBeforeEach(func() { - regionalClusterClient.IsPacificRegionalClusterReturns(false, nil) - err = tkgClient.DoSetCEIPParticipation(regionalClusterClient, context, true, "true", "") - }) - It("should not error", func() { - Expect(err).To(Not(HaveOccurred())) - }) - It("should have called AddCEIPTelemetryJob", func() { - Expect(regionalClusterClient.AddCEIPTelemetryJobCallCount()).To(Equal(1)) - }) - }) - - Context("When opt-ing in to CEIP on non-prod environment", func() { - JustBeforeEach(func() { - regionalClusterClient.IsPacificRegionalClusterReturns(false, nil) - err = tkgClient.DoSetCEIPParticipation(regionalClusterClient, context, true, "true", "") - }) - It("should not error", func() { - Expect(err).To(Not(HaveOccurred())) - }) - It("should have called AddCEIPTelemetryJob", func() { - Expect(regionalClusterClient.AddCEIPTelemetryJobCallCount()).To(Equal(1)) - }) - }) - - Context("When cluster is a pacific cluster", func() { - JustBeforeEach(func() { - regionalClusterClient.IsPacificRegionalClusterReturns(true, nil) - err = tkgClient.DoSetCEIPParticipation(regionalClusterClient, context, true, "true", "") - }) - It("should error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cannot change CEIP settings for a supervisor cluster which is on vSphere with Tanzu. Please change your CEIP settings within vSphere")) - }) - }) - - Context("When cluster is ipv6", func() { - JustBeforeEach(func() { - regionalClusterClient.IsPacificRegionalClusterReturns(false, nil) - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableIPFamily, "ipv6") - tkgClient.TKGConfigReaderWriter().Set(constants.TKGHTTPProxy, "fe80::") - err = tkgClient.DoSetCEIPParticipation(regionalClusterClient, context, true, "true", "") - }) - It("should add ::1 to noProxy", func() { - _, _, _, _, _, _, _, noProxy := regionalClusterClient.AddCEIPTelemetryJobArgsForCall(0) - Expect(noProxy).To(ContainSubstring("::1")) - }) - }) - - Context("When cluster is ipv4", func() { - JustBeforeEach(func() { - regionalClusterClient.IsPacificRegionalClusterReturns(false, nil) - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableIPFamily, "ipv4") - tkgClient.TKGConfigReaderWriter().Set(constants.TKGHTTPProxy, "1.2.3.4") - err = tkgClient.DoSetCEIPParticipation(regionalClusterClient, context, true, "true", "") - }) - It("should not add ::1 to noProxy", func() { - _, _, _, _, _, _, _, noProxy := regionalClusterClient.AddCEIPTelemetryJobArgsForCall(0) - Expect(noProxy).NotTo(ContainSubstring("::1")) - }) - }) - }) - - Describe("GetCEIP", func() { - BeforeEach(func() { - }) - - Context("When cluster is opt'd in", func() { - JustBeforeEach(func() { - regionalClusterClient.IsPacificRegionalClusterReturns(false, nil) - regionalClusterClient.HasCEIPTelemetryJobReturns(true, nil) - ceipStatus, err = tkgClient.DoGetCEIPParticipation(regionalClusterClient, clusterName) - }) - It("should not error", func() { - Expect(err).To(Not(HaveOccurred())) - }) - It("should have called HasCEIPTelemetryJob", func() { - Expect(regionalClusterClient.HasCEIPTelemetryJobCallCount()).To(Equal(1)) - }) - It("should return correct status", func() { - Expect(ceipStatus.CeipStatus).To(Equal(CeipOptInStatus)) - Expect(ceipStatus.ClusterName).To(Equal(clusterName)) - }) - }) - - Context("When cluster is opt'd out", func() { - JustBeforeEach(func() { - regionalClusterClient.IsPacificRegionalClusterReturns(false, nil) - regionalClusterClient.HasCEIPTelemetryJobReturns(false, nil) - ceipStatus, err = tkgClient.DoGetCEIPParticipation(regionalClusterClient, clusterName) - }) - It("should not error", func() { - Expect(err).To(Not(HaveOccurred())) - }) - It("should have called HasCEIPTelemetryJob", func() { - Expect(regionalClusterClient.HasCEIPTelemetryJobCallCount()).To(Equal(1)) - }) - It("should return correct status", func() { - Expect(ceipStatus.CeipStatus).To(Equal(CeipOptOutStatus)) - Expect(ceipStatus.ClusterName).To(Equal(clusterName)) - }) - }) - - Context("When cluster is a pacific cluster", func() { - JustBeforeEach(func() { - regionalClusterClient.IsPacificRegionalClusterReturns(true, nil) - regionalClusterClient.HasCEIPTelemetryJobReturns(false, nil) - ceipStatus, err = tkgClient.DoGetCEIPParticipation(regionalClusterClient, clusterName) - }) - It("should not error", func() { - Expect(err).To(Not(HaveOccurred())) - }) - It("should return correct status", func() { - Expect(ceipStatus.CeipStatus).To(Equal(CeipPacificCluster)) - Expect(ceipStatus.ClusterName).To(Equal(clusterName)) - }) - }) - }) - - Describe("ShouldManageCEIP", func() { - BeforeEach(func() { - regionalClusterClient.GetRegionalClusterDefaultProviderNameReturns("aws:v0.5.5", nil) - regionalClusterClient.IsPacificRegionalClusterReturns(false, nil) - }) - - Context("When cluster version is v1.6.0", func() { - BeforeEach(func() { - regionalClusterClient.GetManagementClusterTKGVersionReturns("v1.6.0", nil) - }) - - Context("cluster has the telemetry cron job already installed", func() { - JustBeforeEach(func() { - regionalClusterClient.GetResourceReturns(nil) - regionalClusterClient.HasCEIPTelemetryJobReturns(true, nil) - }) - - It("should not interact with the telemetry job", func() { - shouldManage, err := tkgClient.ShouldManageCEIP(regionalClusterClient, context) - Expect(err).NotTo(HaveOccurred()) - Expect(shouldManage).To(BeFalse()) - }) - }) - - Context("cluster is missing the telemetry cron job", func() { - JustBeforeEach(func() { - regionalClusterClient.HasCEIPTelemetryJobReturns(false, nil) - }) - - It("should manage the telemetry job", func() { - shouldManage, err := tkgClient.ShouldManageCEIP(regionalClusterClient, context) - Expect(err).NotTo(HaveOccurred()) - Expect(shouldManage).To(BeTrue()) - }) - }) - }) - - Context("When cluster version is newer than v1.6.0", func() { - BeforeEach(func() { - regionalClusterClient.GetManagementClusterTKGVersionReturns("v1.6.0", nil) - }) - - Context("cluster has the telemetry cron job already installed", func() { - JustBeforeEach(func() { - regionalClusterClient.GetResourceReturns(nil) - regionalClusterClient.HasCEIPTelemetryJobReturns(true, nil) - }) - - It("should not interact with the telemetry job", func() { - shouldManage, err := tkgClient.ShouldManageCEIP(regionalClusterClient, context) - Expect(err).NotTo(HaveOccurred()) - Expect(shouldManage).To(BeFalse()) - }) - }) - - Context("cluster is missing the telemetry cron job", func() { - JustBeforeEach(func() { - regionalClusterClient.HasCEIPTelemetryJobReturns(false, nil) - }) - - It("should manage the telemetry job", func() { - shouldManage, err := tkgClient.ShouldManageCEIP(regionalClusterClient, context) - Expect(err).NotTo(HaveOccurred()) - Expect(shouldManage).To(BeTrue()) - }) - }) - }) - - Context("When cluster version is older than v1.6.0", func() { - BeforeEach(func() { - regionalClusterClient.GetManagementClusterTKGVersionReturns("v1.5.2", nil) - }) - - Context("cluster has the telemetry cron job already installed", func() { - JustBeforeEach(func() { - regionalClusterClient.GetResourceReturns(nil) - regionalClusterClient.HasCEIPTelemetryJobReturns(true, nil) - }) - - It("should not interact with the telemetry job", func() { - shouldManage, err := tkgClient.ShouldManageCEIP(regionalClusterClient, context) - Expect(err).NotTo(HaveOccurred()) - Expect(shouldManage).To(BeTrue()) - }) - }) - - Context("cluster is missing the telemetry cron job", func() { - JustBeforeEach(func() { - regionalClusterClient.HasCEIPTelemetryJobReturns(false, nil) - }) - - It("should add the job to the cluster", func() { - shouldManage, err := tkgClient.ShouldManageCEIP(regionalClusterClient, context) - Expect(err).NotTo(HaveOccurred()) - Expect(shouldManage).To(BeTrue()) - }) - }) - }) - }) -}) diff --git a/tkg/client/cleanup_core_repo.go b/tkg/client/cleanup_core_repo.go deleted file mode 100644 index e5eb18f300..0000000000 --- a/tkg/client/cleanup_core_repo.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "github.com/pkg/errors" - apierrors "k8s.io/apimachinery/pkg/api/errors" - - pkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -const ( - tanzuCorePackageRepoName = "tanzu-core" - tanzuCorePackageRepoNamespace = "tkg-system" -) - -func (c *TkgClient) CleanupCorePackageRepo(clusterClient clusterclient.Client) error { - found, err := findCorePackageRepo(clusterClient) - if err != nil { - return errors.Wrap(err, "unable to find the core package repository") - } - if !found { - log.Info("Core package repository not found, no need to cleanup") - return nil - } - - err = deleteCorePackageRepo(clusterClient) - if err != nil { - return errors.Wrap(err, "unable to delete the core package repository") - } - return nil -} - -func findCorePackageRepo(clusterClient clusterclient.Client) (bool, error) { - packageRepo := &pkgiv1alpha1.PackageRepository{} - err := clusterClient.GetResource(packageRepo, tanzuCorePackageRepoName, tanzuCorePackageRepoNamespace, nil, nil) - if err != nil && apierrors.IsNotFound(err) { - return false, nil - } else if err != nil { - return false, errors.Wrap(err, "unable to get PackageRepositories") - } - return true, nil -} - -func deleteCorePackageRepo(clusterClient clusterclient.Client) error { - log.Info("Deleting core package repository") - packageRepo := &pkgiv1alpha1.PackageRepository{} - packageRepo.Name = tanzuCorePackageRepoName - packageRepo.Namespace = tanzuCorePackageRepoNamespace - err := clusterClient.DeleteResource(packageRepo) - if err != nil && apierrors.IsNotFound(err) { - return nil - } else if err != nil { - return errors.Wrap(err, "failed to delete core package repository") - } - return nil -} diff --git a/tkg/client/cleanup_core_repo_test.go b/tkg/client/cleanup_core_repo_test.go deleted file mode 100644 index 869a05d257..0000000000 --- a/tkg/client/cleanup_core_repo_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "errors" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime/schema" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit tests for core package repository cleanup", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - tkgClient *TkgClient - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Millisecond) - Expect(err).NotTo(HaveOccurred()) - }) - - Describe("When cleanup core package repository", func() { - JustBeforeEach(func() { - err = tkgClient.CleanupCorePackageRepo(regionalClusterClient) - }) - Context("When the core package repository is not found", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceReturns(apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource")) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - Context("When unable to find the core package repository", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceReturns(errors.New("unable to find the resource")) - }) - It("should not return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to find the resource")) - }) - }) - Context("When unable to delete the core package repository", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceReturns(nil) - regionalClusterClient.DeleteResourceReturns(errors.New("unable to delete the resource")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to delete the resource")) - }) - }) - Context("When the core package repository is not found for deleting", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceReturns(nil) - regionalClusterClient.DeleteResourceReturns(apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource")) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - Context("When the core package repository is deleted successfully", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceReturns(nil) - regionalClusterClient.DeleteResourceReturns(nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - }) -}) diff --git a/tkg/client/client.go b/tkg/client/client.go deleted file mode 100644 index f335816936..0000000000 --- a/tkg/client/client.go +++ /dev/null @@ -1,308 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package client implements core functionality of the tkg client -package client - -import ( - "time" - - "github.com/pkg/errors" - capiv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - clusterctl "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - clusterctltree "sigs.k8s.io/cluster-api/cmd/clusterctl/client/tree" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - - clusterctlconfig "sigs.k8s.io/cluster-api/cmd/clusterctl/client/config" - "sigs.k8s.io/cluster-api/cmd/clusterctl/client/repository" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/features" - "github.com/vmware-tanzu/tanzu-framework/tkg/kind" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigproviders" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigupdater" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -type ( - // Provider CAPI provider interface - Provider clusterctlconfig.Provider - // Components CAPI repostory components interface - Components repository.Components -) - -// ClusterConfigOptions contains options required to generate a cluster configuration -type ClusterConfigOptions clusterctl.GetClusterTemplateOptions - -// CreateClusterOptions contains options required to create a cluster -type CreateClusterOptions struct { - ClusterConfigOptions - TKRVersion string - NodeSizeOptions NodeSizeOptions - CniType string - ClusterOptionsEnableList []string - VsphereControlPlaneEndpoint string - SkipValidation bool - IsWindowsWorkloadCluster bool - ClusterType TKGClusterType - Edition string - IsInputFileClusterClassBased bool - ClusterConfigFile string -} - -// InitRegionOptions contains options supported by InitRegion -type InitRegionOptions struct { - NodeSizeOptions NodeSizeOptions - ClusterConfigFile string - Kubeconfig string - Plan string - ClusterName string - CoreProvider string - BootstrapProvider string - InfrastructureProvider string - ControlPlaneProvider string - IPAMProvider string - Namespace string - CniType string - VsphereControlPlaneEndpoint string - Edition string - AdditionalTKGManifests string - Annotations map[string]string - Labels map[string]string - FeatureFlags map[string]string - LaunchUI bool - CeipOptIn bool - UseExistingCluster bool - IsInputFileClusterClassBased bool - GenerateOnly bool -} - -// DeleteRegionOptions contains options supported by DeleteRegion -type DeleteRegionOptions struct { - Kubeconfig string - ClusterName string - Force bool - UseExistingCluster bool -} - -//go:generate counterfeiter -o ../fakes/featureflagclient.go --fake-name FeatureFlagClient . FeatureFlagClient - -// FeatureFlagClient is used to check if a feature is active -type FeatureFlagClient interface { - IsConfigFeatureActivated(featurePath string) (bool, error) -} - -//go:generate counterfeiter -o ../fakes/client.go --fake-name Client . Client - -// Client is used to interact with the tkg client library -type Client interface { - // InitRegion creates and initializes a management cluster via a - // self-provisioned bootstrap cluster if necessary - InitRegion(options *InitRegionOptions) error - // InitRegionDryRun generates the management cluster manifest that would be - // used by InitRegion to provision a new cluster - InitRegionDryRun(options *InitRegionOptions) ([]byte, error) - // GetClusterConfiguration returns a cluster configuration generated with - // parameters provided in the set of provided template options - GetClusterConfiguration(options *CreateClusterOptions) ([]byte, error) - // ConfigureAndValidateTkrVersion takes tkrVersion, if empty fetches default tkr & k8s version from config - // and validates k8s version format is valid semantic version - ConfigureAndValidateTkrVersion(tkrVersion string) (string, string, error) - // CreateCluster creates a workload cluster based on a cluster template - // generated from the provided options. Returns whether cluster creation was attempted - // information along with error information - CreateCluster(options *CreateClusterOptions, waitForCluster bool) (attempedClusterCreation bool, err error) - // CreateAWSCloudFormationStack create aws cloud formation stack - CreateAWSCloudFormationStack() error - // DeleteRegion deletes management cluster via a self-provisioned kind cluster - DeleteRegion(options DeleteRegionOptions) error - // VerifyRegion checks if the kube context points to a management clusters, - VerifyRegion(kubeConfigPath string) (region.RegionContext, error) - // AddRegionContext adds a management cluster context to tkg config file - AddRegionContext(region region.RegionContext, overwrite bool, useDirectReference bool) error - // GetRegionContexts gets all tkg managed management cluster context context - GetRegionContexts(clusterName string) ([]region.RegionContext, error) - // SetRegionContext sets a management cluster context to be current context - SetRegionContext(clusterName string, contextName string) error - // GenerateAWSCloudFormationTemplate generates a CloudFormation YAML template - GenerateAWSCloudFormationTemplate() (string, error) - // GetCurrentRegionContext() gets the current management cluster context - GetCurrentRegionContext() (region.RegionContext, error) - // GetWorkloadClusterCredentials merges workload cluster credentials into kubeconfig path - GetWorkloadClusterCredentials(options GetWorkloadClusterCredentialsOptions) (string, string, error) - // ListTKGClusters lists workload clusters managed by the management cluster - ListTKGClusters(options ListTKGClustersOptions) ([]ClusterInfo, error) - // DeleteWorkloadCluster deletes a workload cluster managed by the management cluster - DeleteWorkloadCluster(options DeleteWorkloadClusterOptions) error - // ScaleCluster scales the cluster - ScaleCluster(options ScaleClusterOptions) error - // UpgradeCluster upgrades tkg cluster to specific kubernetes version - UpgradeCluster(options *UpgradeClusterOptions) error - // ConfigureAndValidateManagementClusterConfiguration validates the management cluster configuration - // User is expected to validate the configuration before creating management cluster using init operation - ConfigureAndValidateManagementClusterConfiguration(options *InitRegionOptions, skipValidation bool) *ValidationError - // UpgradeManagementCluster upgrades tkg cluster to specific kubernetes version - UpgradeManagementCluster(options *UpgradeClusterOptions) error - // Opt-in/out to CEIP on Management Cluster - SetCEIPParticipation(ceipOptIn bool, isProd string, labels string) error - // Get opt-in/out status for CEIP on all Management Clusters - GetCEIPParticipation() (ClusterCeipInfo, error) - // DeleteMachineHealthCheck deletes MachineHealthCheck for the given cluster - DeleteMachineHealthCheck(options MachineHealthCheckOptions) error - // ListMachineHealthChecks lists all the machine health check - GetMachineHealthChecks(options MachineHealthCheckOptions) ([]MachineHealthCheck, error) - // IsPacificManagementCluster checks if the cluster pointed to by kubeconfig is Pacific management cluster(supervisor) - IsPacificManagementCluster() (bool, error) - // SetMachineHealthCheck create or update a machine health check object - SetMachineHealthCheck(options *SetMachineHealthCheckOptions) error - // GetMachineDeployments gets a list of MachineDeployments for a cluster - GetMachineDeployments(options GetMachineDeploymentOptions) ([]capi.MachineDeployment, error) - // GetPacificMachineDeployments gets machine deployments from a Pacific cluster - // Note: This would be soon deprecated after TKGS and TKGm adopt the clusterclass - GetPacificMachineDeployments(options GetMachineDeploymentOptions) ([]capiv1alpha3.MachineDeployment, error) - // SetMachineDeployment create machine deployment in a cluster - SetMachineDeployment(options *SetMachineDeploymentOptions) error - // DeleteMachineDeployment deletes a machine deployment in a cluster - DeleteMachineDeployment(options DeleteMachineDeploymentOptions) error - // GetKubernetesVersions returns the supported k8s versions for workload cluster - GetKubernetesVersions() (*KubernetesVersionsInfo, error) - // ParseHiddenArgsAsFeatureFlags adds the hidden flags from InitRegionOptions as enabled feature flags - ParseHiddenArgsAsFeatureFlags(options *InitRegionOptions) - // SaveFeatureFlags saves the feature flags to the config file via featuresClient - SaveFeatureFlags(featureFlags map[string]string) error - // ValidatePrerequisites validates prerequisites for init command - ValidatePrerequisites(validateDocker, validateKubectl bool) error - // ValidateDockerResourcePrerequisites validates resource prerequisites for docker - ValidateDockerResourcePrerequisites() error - // GetVSphereEndpoint creates the vSphere client using the credentials from the management cluster if cluster client is provided, - // otherwise, the vSphere client will be created from the credentials set in the user's environment. - GetVSphereEndpoint(client clusterclient.Client) (vc.Client, error) - // ConfigureTimeout updates/configures timeout already set in the tkgClient - ConfigureTimeout(timeout time.Duration) - // TKGConfigReaderWriter returns tkgConfigReaderWriter client - TKGConfigReaderWriter() tkgconfigreaderwriter.TKGConfigReaderWriter - // UpdateManagementCluster updates a management cluster - UpdateCredentialsRegion(options *UpdateCredentialsOptions) error - // UpdateCredentialsCluster updates a workload cluster - UpdateCredentialsCluster(options *UpdateCredentialsOptions) error - // GetClusterPinnipedInfo returns the cluster and pinniped info - GetClusterPinnipedInfo(options GetClusterPinnipedInfoOptions) (*ClusterPinnipedInfo, error) - // DescribeCluster describes all the objects in the Cluster - DescribeCluster(options DescribeTKGClustersOptions) (*clusterctltree.ObjectTree, *capi.Cluster, *clusterctlv1.ProviderList, error) - // DescribeProvider describes all the installed providers - DescribeProvider() (*clusterctlv1.ProviderList, error) - // DownloadBomFile downloads BomFile from management cluster's config map - DownloadBomFile(tkrName string) error - // IsManagementClusterAKindCluster determines if the creation of management cluster is successful - IsManagementClusterAKindCluster(clusterName string) (bool, error) - // GetTanzuKubernetesReleases returns the available TanzuKubernetesReleases - // Deprecated: This would not be supported from TKR API version v1alpha3, - // user can use go client to get TKR - GetTanzuKubernetesReleases(tkrName string) ([]runv1alpha1.TanzuKubernetesRelease, error) - // ActivateTanzuKubernetesReleases activates TanzuKubernetesRelease - // Deprecated: This would not be supported from TKR API version v1alpha3, - // user can use go client to set the labels to activate/deactivate the TKR - ActivateTanzuKubernetesReleases(tkrName string) error - // DeactivateTanzuKubernetesReleases deactivates TanzuKubernetesRelease - // Deprecated: This would not be supported from TKR API version v1alpha3, - // user can use go client to set the labels to activate/deactivate the TKR - DeactivateTanzuKubernetesReleases(tkrName string) error - // IsPacificRegionalCluster checks if the cluster pointed to by kubeconfig is Pacific management cluster(supervisor) - IsPacificRegionalCluster() (bool, error) - // GetPacificClusterObject gets Pacific cluster object - GetPacificClusterObject(clusterName, namespace string) (*tkgsv1alpha2.TanzuKubernetesCluster, error) - // IsFeatureActivated checks if a given feature flag is active - IsFeatureActivated(feature string) bool -} - -// TkgClient implements Client. -type TkgClient struct { - clusterctlClient clusterctl.Client - kindClient kind.Client - readerwriterConfigClient tkgconfigreaderwriter.Client - regionManager region.Manager - tkgConfigDir string - timeout time.Duration - featuresClient features.Client - tkgConfigProvidersClient tkgconfigproviders.Client - tkgBomClient tkgconfigbom.Client - tkgConfigUpdaterClient tkgconfigupdater.Client - tkgConfigPathsClient tkgconfigpaths.Client - clusterKubeConfig *types.ClusterKubeConfig - clusterClientFactory clusterclient.ClusterClientFactory - vcClientFactory vc.VcClientFactory - featureFlagClient FeatureFlagClient -} - -// Options new client options -type Options struct { - ClusterCtlClient clusterctl.Client - ReaderWriterConfigClient tkgconfigreaderwriter.Client - RegionManager region.Manager - TKGConfigDir string - Timeout time.Duration - FeaturesClient features.Client - TKGConfigProvidersClient tkgconfigproviders.Client - TKGBomClient tkgconfigbom.Client - TKGConfigUpdater tkgconfigupdater.Client - TKGPathsClient tkgconfigpaths.Client - ClusterKubeConfig *types.ClusterKubeConfig - ClusterClientFactory clusterclient.ClusterClientFactory - VcClientFactory vc.VcClientFactory - FeatureFlagClient FeatureFlagClient -} - -// ensure tkgClient implements Client. -var _ Client = &TkgClient{} - -// New returns a tkgClient. -func New(options Options) (*TkgClient, error) { // nolint:gocritic - err := options.TKGConfigUpdater.DecodeCredentialsInViper() - if err != nil { - return nil, errors.Wrap(err, "unable to update encoded credentials") - } - - // Set default configuration - options.TKGConfigUpdater.SetDefaultConfiguration() - - return &TkgClient{ - clusterctlClient: options.ClusterCtlClient, - kindClient: nil, - readerwriterConfigClient: options.ReaderWriterConfigClient, - regionManager: options.RegionManager, - tkgConfigDir: options.TKGConfigDir, - timeout: options.Timeout, - featuresClient: options.FeaturesClient, - tkgConfigProvidersClient: options.TKGConfigProvidersClient, - tkgBomClient: options.TKGBomClient, - tkgConfigUpdaterClient: options.TKGConfigUpdater, - tkgConfigPathsClient: options.TKGPathsClient, - clusterKubeConfig: options.ClusterKubeConfig, - clusterClientFactory: options.ClusterClientFactory, - vcClientFactory: options.VcClientFactory, - featureFlagClient: options.FeatureFlagClient, - }, nil -} - -// TKGConfigReaderWriter returns tkgConfigReaderWriter client -func (c *TkgClient) TKGConfigReaderWriter() tkgconfigreaderwriter.TKGConfigReaderWriter { - return c.readerwriterConfigClient.TKGConfigReaderWriter() -} - -// IsFeatureActivated checkes if a feature flag is set to "true" -func (c *TkgClient) IsFeatureActivated(feature string) bool { - result, err := c.featureFlagClient.IsConfigFeatureActivated(feature) - if err != nil { - return false - } - return result -} diff --git a/tkg/client/client_suite_test.go b/tkg/client/client_suite_test.go deleted file mode 100644 index 9b6a4ebe5e..0000000000 --- a/tkg/client/client_suite_test.go +++ /dev/null @@ -1,1867 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "context" - "encoding/base64" - "fmt" - "os" - "os/exec" - "path/filepath" - "testing" - "time" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - - azure "github.com/vmware-tanzu/tanzu-framework/tkg/azure/mocks" - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clientcreator" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigproviders" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigupdater" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" - - "github.com/golang/mock/gomock" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - capav1beta2 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" - capzv1beta1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capiv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctlv1alpha3 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" -) - -var ( - testingDir string - ctrl *gomock.Controller - defaultTKGBoMFileForTesting = "../fakes/config/bom/tkg-bom-v1.3.1.yaml" - defaultTKRBoMFileForTesting = "../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml" - configFile = "../fakes/config/config.yaml" - configFile2 = "../fakes/config/config2.yaml" - configFile3 = "../fakes/config/config3.yaml" - configFile4 = "../fakes/config/config4.yaml" - configFile7 = "../fakes/config/config7.yaml" -) - -func TestClient(t *testing.T) { - RegisterFailHandler(Fail) - ctrl = gomock.NewController(t) - RunSpecs(t, "Client Suite") -} - -var scheme = runtime.NewScheme() - -func init() { - _ = capi.AddToScheme(scheme) - _ = capiv1alpha3.AddToScheme(scheme) - _ = corev1.AddToScheme(scheme) - _ = appsv1.AddToScheme(scheme) - _ = rbacv1.AddToScheme(scheme) - _ = controlplanev1.AddToScheme(scheme) - _ = tkgsv1alpha2.AddToScheme(scheme) - _ = capav1beta2.AddToScheme(scheme) - _ = capzv1beta1.AddToScheme(scheme) - _ = capvv1beta1.AddToScheme(scheme) - _ = clusterctlv1alpha3.AddToScheme(scheme) -} - -var _ = Describe("CheckInfrastructureVersion", func() { - BeforeSuite((func() { - testingDir = fakehelper.CreateTempTestingDirectory() - })) - - AfterSuite((func() { - fakehelper.DeleteTempTestingDirectory(testingDir) - })) - - var ( - err error - providerName string - configPath string - - result string - ) - - JustBeforeEach(func() { - setupTestingFiles(configPath, testingDir, defaultTKGBoMFileForTesting) - var tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - tkgConfigReaderWriter, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - result, err = tkgconfigupdater.New(testingDir, nil, tkgConfigReaderWriter).CheckInfrastructureVersion(providerName) - log.Infof("testingDir: %s", testingDir) - }) - - Context("when provider version is not provided, but multiple version is found in tkg config", func() { - BeforeEach(func() { - providerName = constants.InfrastructureProviderVSphere - configPath = configFile - }) - - It("should return errors indicating multple version for the provider are found", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("when provider version is not provided, but tkg config file has no record for the provider", func() { - BeforeEach(func() { - providerName = "some-provider" - configPath = configFile - }) - - It("should return errors indicating no version for the provider is found", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("when provider version is not provided, and the provider only has one record in tkg config file", func() { - BeforeEach(func() { - providerName = constants.InfrastructureProviderAWS - configPath = configFile - }) - - It("should appends the version after the provider name", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal("aws:v0.5.1")) - }) - }) - - Context("when provider version is provided in wrong format", func() { - BeforeEach(func() { - providerName = "vsphere:latest" - configPath = configFile - }) - - It("should return errors indicating the provider version is not valid", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("when provider version is provided in correct format", func() { - BeforeEach(func() { - providerName = "vsphere:v0.6.2" - configPath = configFile - }) - - It("should return original provider name", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(providerName)) - }) - }) -}) - -var _ = Describe("ValidateVSphereVersion", func() { - var ( - err *ValidationError - vcClient = &fakes.VCClient{} - ) - - JustBeforeEach(func() { - err = ValidateVSphereVersion(vcClient) - }) - - Context("When vsphere has a version equal or greater than 7.0 with out pacific management cluster", func() { - BeforeEach(func() { - vcClient.GetVSphereVersionReturns("7.0.0", "1", nil) - vcClient.DetectPacificReturns(false, nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Code).To(Equal(PacificNotInVC7ErrorCode)) - }) - }) - - Context("When vsphere has a version equal or greater than 7.0 with pacific management cluster deployed", func() { - BeforeEach(func() { - vcClient.GetVSphereVersionReturns("7.0.0", "1", nil) - vcClient.DetectPacificReturns(true, nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Code).To(Equal(PacificInVC7ErrorCode)) - }) - }) - - Context("When vsphere has a lower major version than the minimum requirement", func() { - BeforeEach(func() { - vcClient.GetVSphereVersionReturns("5.0.0", "0", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Code).To(Equal(ValidationErrorCode)) - }) - }) - - Context("When vsphere has a lower minor version than the minimum requirement", func() { - BeforeEach(func() { - vcClient.GetVSphereVersionReturns("6.5.0", "14367737", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When vsphere has a lower release version", func() { - BeforeEach(func() { - vcClient.GetVSphereVersionReturns("6.7.0", "1", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Code).To(Equal(ValidationErrorCode)) - }) - }) - - Context("When vsphere version meets the minimum requirement", func() { - BeforeEach(func() { - vcClient.GetVSphereVersionReturns("6.7.0", "6.7.0", nil) - }) - It("should not return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Code).To(Equal(ValidationErrorCode)) - }) - }) - - Context("When vsphere version is higher than minimum requirement", func() { - BeforeEach(func() { - vcClient.GetVSphereVersionReturns("6.9.0", "1", nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) - -var _ = Describe("ValidateVsphereResources", func() { - var ( - vcClient = &fakes.VCClient{} - tkgClient *TkgClient - err error - - dc = "dc0" - dcMoid = "dcMoid" - dcPath = "/dc0" - network = "VM Network" - networkMoid = "networkMoid" - networkPath = "/dc0/network/VM Network" - resourcePool = "cluster0/Resources" - resourcePoolMoid = "resourcePoolMoid" - resourcePoolPath = "/dc0/host/cluster0/Resources" - datastore = "sharedVmfs-1" - datastoreMoid = "datastoreMoid" - datastorePath = "/dc0/datastore/sharedVmfs-1" - folder = "vm" - folderMoid = "folderMoid" - folderPath = "/dc0/vm" - ) - - Context("When multiple datacenters matching the given name are present", func() { - BeforeEach(func() { - vcClient = &fakes.VCClient{} - tkgClient, err = CreateTKGClient(configFile, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - - vcClient.FindDataCenterReturns("", fmt.Errorf("path '%s' resolves to multiple %ss", dc, "datacenter")) - os.Setenv(constants.ConfigVariableVsphereDatacenter, dc) - - err = tkgClient.ValidateVsphereResources(vcClient, dc) - }) - - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("path 'dc0' resolves to multiple datacenters")) - }) - }) - - Context("When no datastores matching the given name are present", func() { - BeforeEach(func() { - vcClient = &fakes.VCClient{} - tkgClient, err = CreateTKGClient(configFile, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - - vcClient.FindDatastoreReturns("", fmt.Errorf("%s '%s' not found", "datastore", datastore)) - os.Setenv(constants.ConfigVariableVsphereDatastore, datastore) - - err = tkgClient.ValidateVsphereResources(vcClient, dc) - }) - - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("datastore 'sharedVmfs-1' not found")) - }) - }) - - Context("When vSphere resource names are passed in instead of resource paths", func() { - BeforeEach(func() { - vcClient = &fakes.VCClient{} - tkgClient, err = CreateTKGClient(configFile, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - - vcClient.FindDataCenterReturns(dcMoid, nil) - vcClient.GetPathReturnsOnCall(0, dcPath, nil, nil) - - vcClient.FindNetworkReturns(networkMoid, nil) - vcClient.GetPathReturnsOnCall(1, networkPath, nil, nil) - - vcClient.FindResourcePoolReturns(resourcePoolMoid, nil) - vcClient.GetPathReturnsOnCall(2, resourcePoolPath, nil, nil) - - vcClient.FindDatastoreReturns(datastoreMoid, nil) - vcClient.GetPathReturnsOnCall(3, datastorePath, nil, nil) - - vcClient.FindFolderReturns(folderMoid, nil) - vcClient.GetPathReturnsOnCall(4, folderPath, nil, nil) - - os.Setenv(constants.ConfigVariableVsphereDatacenter, dc) - os.Setenv(constants.ConfigVariableVsphereNetwork, network) - os.Setenv(constants.ConfigVariableVsphereResourcePool, resourcePool) - os.Setenv(constants.ConfigVariableVsphereDatastore, datastore) - os.Setenv(constants.ConfigVariableVsphereFolder, folder) - - err = tkgClient.ValidateVsphereResources(vcClient, dc) - }) - - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - - actualDcPath, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereDatacenter) - Expect(err).NotTo(HaveOccurred()) - Expect(dcPath).To(Equal(actualDcPath)) - - actualDcNetworkPath, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereNetwork) - Expect(err).NotTo(HaveOccurred()) - Expect(networkPath).To(Equal(actualDcNetworkPath)) - - actualResourcePoolPath, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereResourcePool) - Expect(err).NotTo(HaveOccurred()) - Expect(resourcePoolPath).To(Equal(actualResourcePoolPath)) - - actualDataStorePath, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereDatastore) - Expect(err).NotTo(HaveOccurred()) - Expect(datastorePath).To(Equal(actualDataStorePath)) - - actualFolderPath, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereFolder) - Expect(err).NotTo(HaveOccurred()) - Expect(folderPath).To(Equal(actualFolderPath)) - }) - }) -}) - -var _ = Describe("ValidateVSphereControlPlaneEndpointIP", func() { - var ( - tkgClient *TkgClient - err error - clusterclient = &fakes.ClusterClient{} - vip = "" - ) - - JustBeforeEach(func() { - clusterclient.ListClustersReturns([]capi.Cluster{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "my-cluster", - }, - Spec: capi.ClusterSpec{ - ControlPlaneEndpoint: capi.APIEndpoint{ - Host: "10.0.0.0", - }, - }, - }, - }, nil) - err = tkgClient.ValidateVsphereVipWorkloadCluster(clusterclient, vip, false) - }) - - Context("When vsphere --vsphere-controlplane-endpoint is provided with IP that is already used", func() { - BeforeEach(func() { - vip = "10.0.0.0" - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("control plane endpoint '10.0.0.0' already in use by cluster 'my-cluster' and cannot be reused")) - }) - }) - - Context("When vsphere --vsphere-controlplane-endpoint is provided with valid IP", func() { - BeforeEach(func() { - vip = "10.0.0.1" - }) - It("should not error", func() { - Expect(err).To(Not(HaveOccurred())) - }) - }) -}) - -var _ = Describe("EncodeAzureCredentialsAndGetClient", func() { - var ( - tkgConfigPath string - err error - tkgClient *TkgClient - ) - - subscriptionID := "Subscription ID" - tenantID := "Tenant ID" - clientID := "Client ID" - clientSecret := "Client Secret" - - BeforeEach(func() { - os.Setenv(constants.ConfigVariableAzureSubscriptionID, subscriptionID) - os.Setenv(constants.ConfigVariableAzureTenantID, tenantID) - os.Setenv(constants.ConfigVariableAzureClientID, clientID) - os.Setenv(constants.ConfigVariableAzureClientSecret, clientSecret) - }) - - JustBeforeEach(func() { - tkgClient, err = CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).ToNot(HaveOccurred()) - _, err = tkgClient.EncodeAzureCredentialsAndGetClient(nil) - }) - - Context("When the AZURE_TENANT_ID is not found from tkg config or environment variable", func() { - BeforeEach(func() { - tkgConfigPath = configFile - - os.Unsetenv(constants.ConfigVariableAzureTenantID) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When the AZURE_CLIENT_ID is not found from tkg config or environment variable", func() { - BeforeEach(func() { - tkgConfigPath = configFile - - os.Unsetenv(constants.ConfigVariableAzureClientID) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When the AZURE_CLIENT_SECRET is not found from tkg config or environment variable", func() { - BeforeEach(func() { - tkgConfigPath = configFile - - os.Unsetenv(constants.ConfigVariableAzureClientSecret) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When the AZURE_SUBSCRIPTION_ID is not found from tkg config or environment variable", func() { - BeforeEach(func() { - tkgConfigPath = configFile - - os.Unsetenv(constants.ConfigVariableAzureSubscriptionID) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When Azure credentials are set in the tkg config or set as environment variables", func() { - BeforeEach(func() { - tkgConfigPath = configFile - }) - - It("should Base64 encode the Azure credentials and set them", func() { - Expect(err).ToNot(HaveOccurred()) - - subscriptionIDB64 := base64.StdEncoding.EncodeToString([]byte(subscriptionID)) - subscriptionIDB64Actual, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureSubscriptionIDB64) - Expect(err).NotTo(HaveOccurred()) - Expect(subscriptionIDB64).To(Equal(subscriptionIDB64Actual)) - - tenandIDB64 := base64.StdEncoding.EncodeToString([]byte(tenantID)) - tenandIDB64Actual, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureTenantIDB64) - Expect(err).NotTo(HaveOccurred()) - Expect(tenandIDB64).To(Equal(tenandIDB64Actual)) - - clientIDB64 := base64.StdEncoding.EncodeToString([]byte(clientID)) - clientIDIDB64Actual, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureClientIDB64) - Expect(err).NotTo(HaveOccurred()) - Expect(clientIDB64).To(Equal(clientIDIDB64Actual)) - - clientSecretB64 := base64.StdEncoding.EncodeToString([]byte(clientSecret)) - clientSecretB64Actual, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureClientSecretB64) - Expect(err).NotTo(HaveOccurred()) - Expect(clientSecretB64).To(Equal(clientSecretB64Actual)) - }) - }) -}) - -var _ = Describe("validateAzurePublicSSHKey", func() { - var ( - tkgConfigPath string - err error - tkgClient *TkgClient - ) - - JustBeforeEach(func() { - tkgClient, err = CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).ToNot(HaveOccurred()) - err = tkgClient.ValidateAzurePublicSSHKey() - }) - - Context("When Azure ssh public key is not base64 encoded", func() { - BeforeEach(func() { - tkgConfigPath = configFile - - os.Setenv(constants.ConfigVariableAzureSSHPublicKeyB64, "ssh key not base 64 encoded") - }) - - It("should throw error", func() { - Skip("Azure BYOI") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("config variable AZURE_SSH_PUBLIC_KEY_B64 was not properly base64 encoded")) - }) - }) - - Context("When the AZURE_SSH_PUBLIC_KEY_B64 is not found from tkg config or environment variable", func() { - BeforeEach(func() { - tkgConfigPath = configFile - - os.Unsetenv(constants.ConfigVariableAzureSSHPublicKeyB64) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When AZURE_SSH_PUBLIC_KEY_B64 is base64 encoded", func() { - BeforeEach(func() { - tkgConfigPath = configFile - - os.Setenv(constants.ConfigVariableAzureSSHPublicKeyB64, "c3NoIGtleSBiYXNlIDY0IGVuY29kZWQ=") - }) - - It("should not throw error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) - -var _ = Describe("OverrideAzureNodeSizeWithOptions", func() { - var ( - tkgConfigPath string - err error - tkgClient *TkgClient - mockAzureClient *azure.MockClient - nodeSizeOptions NodeSizeOptions - ) - - JustBeforeEach(func() { - os.Setenv(constants.ConfigVariableAzureLocation, "eastus") - - tkgClient, err = CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).ToNot(HaveOccurred()) - mediumInstanceType := models.AzureInstanceType{ - Name: "Standard_D2_v3", - } - instanceTypes := []*models.AzureInstanceType{&mediumInstanceType} - - mockAzureClient = azure.NewMockClient(ctrl) - mockAzureClient.EXPECT().GetAzureInstanceTypesForRegion(context.Background(), "eastus").Return(instanceTypes, nil).MaxTimes(1) - err = tkgClient.OverrideAzureNodeSizeWithOptions(mockAzureClient, nodeSizeOptions, false) - }) - - Context("When the AZURE_LOCATION is not found from tkg config or environment variable", func() { - BeforeEach(func() { - tkgConfigPath = configFile - os.Unsetenv(constants.ConfigVariableAzureLocation) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("When valid size is passed in options", func() { - BeforeEach(func() { - tkgConfigPath = configFile - nodeSizeOptions = NodeSizeOptions{ - Size: "Standard_D2_v3", - } - }) - - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - - controlPlaneMachineTypeActual, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureCPMachineType) - Expect(err).NotTo(HaveOccurred()) - Expect(controlPlaneMachineTypeActual).To(Equal("Standard_D2_v3")) - - nodeMachineTypeActual, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureNodeMachineType) - Expect(err).NotTo(HaveOccurred()) - Expect(nodeMachineTypeActual).To(Equal("Standard_D2_v3")) - }) - }) - - Context("When invalid size is passed in options", func() { - BeforeEach(func() { - tkgConfigPath = configFile - nodeSizeOptions = NodeSizeOptions{ - Size: "invalid", - } - }) - - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When ControlPlaneSize and Worker Size are set in options", func() { - BeforeEach(func() { - tkgConfigPath = configFile - nodeSizeOptions = NodeSizeOptions{ - ControlPlaneSize: "Standard_D2_v3", - WorkerSize: "Standard_D2_v3", - } - }) - - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - - controlPlaneMachineTypeActual, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureCPMachineType) - Expect(err).NotTo(HaveOccurred()) - Expect(controlPlaneMachineTypeActual).To(Equal("Standard_D2_v3")) - - nodeMachineTypeActual, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureNodeMachineType) - Expect(err).NotTo(HaveOccurred()) - Expect(nodeMachineTypeActual).To(Equal("Standard_D2_v3")) - }) - }) -}) - -var _ = Describe("ValidateAWSConfig", func() { - var ( - tkgConfigPath string - err error - tkrVersion string - bomFile string - ) - - BeforeEach(func() { - bomFile = "../fakes/config/bom/tkg-bom-v1.3.0.yaml" - tkrVersion = "v1.19.3+vmware.1-tkg.1" - os.Unsetenv(constants.ConfigVariableAWSRegion) - }) - - JustBeforeEach(func() { - tkgClient, cerr := CreateTKGClient(tkgConfigPath, testingDir, bomFile, 2*time.Second) - Expect(cerr).ToNot(HaveOccurred()) - err = tkgClient.ConfigureAndValidateAwsConfig(tkrVersion, 1, false) - }) - - Context("When the AWS_REGION is not found from tkg config or environment variable", func() { - BeforeEach(func() { - tkgConfigPath = configFile - - listBoMFiles := []string{ - "../fakes/config/bom/tkg-bom-v1.3.0.yaml", - "../fakes/config/bom/tkr-bom-v1.19.3+vmware.1-tkg.1.yaml", - } - copyAllBoMFilesToTestingDir(listBoMFiles, testingDir) - }) - It("should not return an error, a later step will throw out error about missing variables", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("When the AWS_REGION and AWS_NODE_AZ are mismatched", func() { - BeforeEach(func() { - tkgConfigPath = configFile2 - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When kubernetes version does not exist in any bom file", func() { - BeforeEach(func() { - tkgConfigPath = configFile4 - tkrVersion = "v1.10.0+vmware.1-tkg.1" - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When bom file exists for k8s version but region does not exist", func() { - BeforeEach(func() { - bomFile = defaultTKGBoMFileForTesting - tkgConfigPath = configFile4 - tkrVersion = "v1.18.0+vmware.1-tkg.2" // nolint:goconst - os.Setenv(constants.ConfigVariableAWSRegion, "us-gov-1") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When the AWS_AMI_ID matches the aws region and kubernetes version", func() { - BeforeEach(func() { - bomFile = defaultTKGBoMFileForTesting - tkgConfigPath = configFile4 - tkrVersion = "v1.18.0+vmware.1-tkg.2" - - listBoMFiles := []string{ - defaultTKGBoMFileForTesting, - defaultTKRBoMFileForTesting, - } - copyAllBoMFilesToTestingDir(listBoMFiles, testingDir) - }) - - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) - -var _ = Describe("ValidateK8sVersionFormat", func() { - var ( - tkgConfigPath string - err error - tkrVersion string - version string - ) - - JustBeforeEach(func() { - tkgConfigPath = configFile4 - listBoMFiles := []string{ - defaultTKGBoMFileForTesting, - defaultTKRBoMFileForTesting, - } - copyAllBoMFilesToTestingDir(listBoMFiles, testingDir) - tkgClient, cerr := CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(cerr).ToNot(HaveOccurred()) - version, tkrVersion, err = tkgClient.ConfigureAndValidateTkrVersion(tkrVersion) - }) - - Context("When Kubernetes version is not passed via cli", func() { - BeforeEach(func() { - tkrVersion = "" - }) - It("should retrieve the Kubernetes version from the BOM file", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(version).To(Equal("v1.18.0+vmware.1")) - }) - }) - - Context("When Kubernetes version without build metadata is passed", func() { - BeforeEach(func() { - tkrVersion = "v1.14.3+vmware.1-tkg.1" - }) - It("returns error when no matching bom files are present", func() { - Expect(err).To(HaveOccurred()) - }) - }) -}) - -var _ = Describe("SetVsphereNodeSize", func() { - var ( - tkgConfigPath string - errWorkerMem error - errCPMem error - testVarWorkerMem string - testVarCPMem string - ) - JustBeforeEach(func() { - tkgClient, cerr := CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(cerr).ToNot(HaveOccurred()) - tkgClient.SetVsphereNodeSize() - testVarWorkerMem, errWorkerMem = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereWorkerMemMib) - testVarCPMem, errCPMem = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereCPMemMib) - }) - - Context("When both base node size and customized node sizes are missing", func() { - BeforeEach(func() { - tkgConfigPath = configFile - }) - It("should not set the customized node size in viper", func() { - Expect(errWorkerMem).To(HaveOccurred()) - Expect(errCPMem).To(HaveOccurred()) - }) - }) - - Context("When base node sizes and some of the customized node sizes are specified", func() { - BeforeEach(func() { - tkgConfigPath = configFile3 - }) - It("should only set the missing customized node sizes", func() { - Expect(errWorkerMem).ToNot(HaveOccurred()) - Expect(errCPMem).ToNot(HaveOccurred()) - Expect(testVarWorkerMem).To(Equal("2048")) - Expect(testVarCPMem).To(Equal("1024")) - }) - }) - - Context("When only the base node sizes are specified", func() { - BeforeEach(func() { - tkgConfigPath = configFile2 - }) - It("should set all the customized node sizes in viper", func() { - Expect(errWorkerMem).ToNot(HaveOccurred()) - Expect(errCPMem).ToNot(HaveOccurred()) - Expect(testVarWorkerMem).To(Equal("2048")) - Expect(testVarCPMem).To(Equal("2048")) - }) - }) -}) - -var _ = Describe("TrimVsphereSSHKey", func() { - var ( - tkgConfigPath string - errSSH error - testVarSSH string - ) - JustBeforeEach(func() { - tkgClient, cerr := CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(cerr).ToNot(HaveOccurred()) - tkgClient.TrimVsphereSSHKey() - testVarSSH, errSSH = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereSSHAuthorizedKey) - }) - - Context("Should maintain ssh input if no comment supplied", func() { - BeforeEach(func() { - tkgConfigPath = configFile3 - }) - It("Should maintain ssh input if no comment supplied", func() { - Expect(errSSH).ToNot(HaveOccurred()) - Expect(testVarSSH).To(Equal("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCs1kKExApUX5sQy6DKfO5bP79ynG2LtKqc8N9m/wC9jswSVAmEpSAna8NJaY0LIla/Lov7NRAvot1P9ITNnjbsVwSZe0w/aclLHctzsjpGtgYchW+PWQRreFW2as4zfRqQHAlsIB3+xgZTsgFa4v1/xWv6a2yGsa8Yf4bchGgqzrpuUI97peqoFQdNbdpnKAc4x+1AaBvvVE3wP5NbnLjVprQjgkCgidr9RUhQLxZMZOV3Y3b8CiPOXnbNn9BIER36ka3u83so+zC4dc194woTHgyM4ebAMFDvVfvTCNTsYGJ4kelC5E6QwX+Z3tNQw8HuR8GgfkdFvZAZrfFlcEV6QaT8NJ332yyJrplczalbaWPq3VQchCDx0KNCda4JCyopDzqzYAneCfYk2VCvDagZWO32ZQr4qcBYWb+iR52QxMBlm5QCdP2EaspDKBZCirEcBJNT/gJ3PhTSZ3RtchjLd9O6MQ7l0z65UKfzGddAJKwAWPFNHRp5oJyv/aJa6BCLwZGy0ct4ykwHfJ+CpewJwCHoaCToPBTmdSbDYJbalWv0NNc5gR7Q8cXriDKSaY+QXVao8kOuxhNj/cI9TAPid7Mp7sHFVKM+/7osdzL9Lwn53JGvaOWCm0pwh78GSfyEgePcQOpzqcYm5OUOTkQPGlg7k0NKtYsXKnIM2kVSpQ==")) - }) - }) - - Context("Should ignore SSH comment when it is present in the input", func() { - BeforeEach(func() { - tkgConfigPath = configFile2 - }) - It("Should ignore SSH comment when it is present in the input", func() { - Expect(errSSH).ToNot(HaveOccurred()) - Expect(testVarSSH).To(Equal("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCs1kKExApUX5sQy6DKfO5bP79ynG2LtKqc8N9m/wC9jswSVAmEpSAna8NJaY0LIla/Lov7NRAvot1P9ITNnjbsVwSZe0w/aclLHctzsjpGtgYchW+PWQRreFW2as4zfRqQHAlsIB3+xgZTsgFa4v1/xWv6a2yGsa8Yf4bchGgqzrpuUI97peqoFQdNbdpnKAc4x+1AaBvvVE3wP5NbnLjVprQjgkCgidr9RUhQLxZMZOV3Y3b8CiPOXnbNn9BIER36ka3u83so+zC4dc194woTHgyM4ebAMFDvVfvTCNTsYGJ4kelC5E6QwX+Z3tNQw8HuR8GgfkdFvZAZrfFlcEV6QaT8NJ332yyJrplczalbaWPq3VQchCDx0KNCda4JCyopDzqzYAneCfYk2VCvDagZWO32ZQr4qcBYWb+iR52QxMBlm5QCdP2EaspDKBZCirEcBJNT/gJ3PhTSZ3RtchjLd9O6MQ7l0z65UKfzGddAJKwAWPFNHRp5oJyv/aJa6BCLwZGy0ct4ykwHfJ+CpewJwCHoaCToPBTmdSbDYJbalWv0NNc5gR7Q8cXriDKSaY+QXVao8kOuxhNj/cI9TAPid7Mp7sHFVKM+/7osdzL9Lwn53JGvaOWCm0pwh78GSfyEgePcQOpzqcYm5OUOTkQPGlg7k0NKtYsXKnIM2kVSpQ==")) - }) - }) -}) - -var _ = Describe("SetDefaultAWSVPCConfiguration", func() { - var ( - tkgConfigPath string - tkgClient *TkgClient - cerr error - err error - useExistingVPC bool - useProdFlavor bool - az1 string - az2 string - vpcID string - vpcCidr string - subnetID string - subnetCidr string - subnet2ID string - subnet2Cidr string - awsClient *fakes.AWSClient - skipValidation bool - ) - JustBeforeEach(func() { - tkgClient, cerr = CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(cerr).ToNot(HaveOccurred()) - useExistingVPC, err = tkgClient.SetAndValidateDefaultAWSVPCConfiguration(useProdFlavor, awsClient, skipValidation) - }) - - Context("When vpc id is set in tkgconfig using dev flavor, and unnecessary variables for using existing vpc are missing", func() { - BeforeEach(func() { - tkgConfigPath = configFile - useProdFlavor = false - skipValidation = true - os.Setenv(constants.ConfigVariableAWSPrivateSubnetID, "private-subnet-id-0") - os.Setenv(constants.ConfigVariableAWSPublicSubnetID, "public-subnet-id-0") - }) - It("should return true and set unnecessary missing vpc config variables to empty string", func() { - az1, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSNodeAz) - vpcID, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSVPCID) - subnetID, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPrivateSubnetID) - subnetCidr, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPrivateNodeCIDR) - Expect(err).ToNot(HaveOccurred()) - Expect(useExistingVPC).To(Equal(true)) - Expect(az1).To(Equal("")) - Expect(vpcID).To(Equal("VPC-XXXXXXX")) - Expect(subnetID).To(Equal("private-subnet-id-0")) - Expect(subnetCidr).To(Equal("")) - }) - }) - - Context("When vpc id is set in tkgconfig using dev flavor, but AWS private subnet id is not set", func() { - BeforeEach(func() { - tkgConfigPath = configFile - useProdFlavor = false - skipValidation = true - os.Setenv(constants.ConfigVariableAWSPublicSubnetID, "public-subnet-id-0") - os.Unsetenv(constants.ConfigVariableAWSPrivateSubnetID) - }) - It("should return true and error on the missing priviate subnet id variable", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("configuration variable(s) AWS_PRIVATE_SUBNET_ID not set")) - Expect(useExistingVPC).To(Equal(true)) - }) - }) - - Context("When vpc id is set in tkgconfig using dev flavor, but AWS private subnet id is not found in the vpc", func() { - BeforeEach(func() { - tkgConfigPath = configFile - useProdFlavor = false - skipValidation = false - os.Setenv(constants.ConfigVariableAWSPublicSubnetID, "public-subnet-id-0") - os.Setenv(constants.ConfigVariableAWSPrivateSubnetID, "private-subnet-id-0") - awsClient = &fakes.AWSClient{} - awsClient.ListSubnetsReturns([]*models.AWSSubnet{ - {ID: "public-subnet-id-0"}, - }, nil) - }) - It("should return true and error on private subnet id not found", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("cannot find subnet(s) private-subnet-id-0 in VPC VPC-XXXXXXX")) - Expect(useExistingVPC).To(Equal(true)) - }) - }) - - Context("When vpc id is set in tkgconfig using dev flavor, and AWS subnet ids can be found in the vpc", func() { - BeforeEach(func() { - tkgConfigPath = configFile - useProdFlavor = false - skipValidation = false - os.Setenv(constants.ConfigVariableAWSPublicSubnetID, "public-subnet-id-0") - os.Setenv(constants.ConfigVariableAWSPrivateSubnetID, "private-subnet-id-0") - awsClient = &fakes.AWSClient{} - awsClient.ListSubnetsReturns([]*models.AWSSubnet{ - {ID: "public-subnet-id-0"}, - {ID: "private-subnet-id-0"}, - }, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(useExistingVPC).To(Equal(true)) - }) - }) - - Context("When vpc id is not set in tkgconfig using dev flavor", func() { - BeforeEach(func() { - tkgConfigPath = configFile4 - useProdFlavor = false - skipValidation = true - os.Unsetenv(constants.ConfigVariableAWSPublicSubnetID) - os.Unsetenv(constants.ConfigVariableAWSPrivateSubnetID) - }) - It("should return false, and default the aws vpc id to empty string", func() { - az1, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSNodeAz) - vpcCidr, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSVPCCIDR) - subnetCidr, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPrivateNodeCIDR) - subnetID, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPrivateSubnetID) - Expect(err).ToNot(HaveOccurred()) - Expect(useExistingVPC).To(Equal(false)) - Expect(az1).To(Equal("us-east-2a")) - Expect(vpcCidr).To(Equal("10.0.0.0/16")) - Expect(subnetCidr).To(Equal("10.0.0.0/24")) - Expect(subnetID).To(Equal("")) - }) - }) - - Context("When vpc id is set in tkgconfig using prod flavor, and unnecessary variables for using existing vpc are missing", func() { - BeforeEach(func() { - tkgConfigPath = configFile - useProdFlavor = true - skipValidation = true - os.Setenv(constants.ConfigVariableAWSPrivateSubnetID, "private-subnet-id-0") - os.Setenv(constants.ConfigVariableAWSPublicSubnetID, "public-subnet-id-0") - os.Setenv(constants.ConfigVariableAWSPrivateSubnetID1, "private-subnet-id-1") - os.Setenv(constants.ConfigVariableAWSPublicSubnetID1, "public-subnet-id-1") - os.Setenv(constants.ConfigVariableAWSPrivateSubnetID2, "private-subnet-id-2") - os.Setenv(constants.ConfigVariableAWSPublicSubnetID2, "public-subnet-id-2") - }) - It("should return true and set unnecessary missing vpc config variables to empty string", func() { - az1, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSNodeAz) - vpcID, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSVPCID) - subnetID, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPrivateSubnetID) - az2, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSNodeAz1) - subnet2ID, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPrivateSubnetID1) - vpcCidr, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSVPCCIDR) - subnetCidr, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPrivateNodeCIDR) - Expect(err).ToNot(HaveOccurred()) - Expect(useExistingVPC).To(Equal(true)) - Expect(az1).To(Equal("")) - Expect(vpcID).To(Equal("VPC-XXXXXXX")) - Expect(az2).To(Equal("")) - Expect(vpcCidr).To(Equal("")) - Expect(subnetCidr).To(Equal("")) - Expect(subnet2ID).To(Equal("private-subnet-id-1")) - }) - }) - - Context("When vpc id is set in tkgconfig using prod flavor, and AWS_PRIVATE_SUBNET_ID_2 is missing", func() { - BeforeEach(func() { - tkgConfigPath = configFile - useProdFlavor = true - skipValidation = true - os.Setenv(constants.ConfigVariableAWSPrivateSubnetID, "private-subnet-id-0") - os.Setenv(constants.ConfigVariableAWSPublicSubnetID, "public-subnet-id-0") - os.Setenv(constants.ConfigVariableAWSPrivateSubnetID1, "private-subnet-id-1") - os.Setenv(constants.ConfigVariableAWSPublicSubnetID1, "public-subnet-id-1") - os.Unsetenv(constants.ConfigVariableAWSPrivateSubnetID2) - os.Setenv(constants.ConfigVariableAWSPublicSubnetID2, "public-subnet-id-2") - }) - It("should return true and error on missing the AWS_PRIVATE_SUBNET_ID_2 config variable", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("configuration variable(s) AWS_PRIVATE_SUBNET_ID_2 not set")) - Expect(useExistingVPC).To(Equal(true)) - }) - }) - - Context("When vpc id is set in tkgconfig using prod flavor, and AWS_PRIVATE_SUBNET_ID_2 is not in the vpc", func() { - BeforeEach(func() { - tkgConfigPath = configFile - useProdFlavor = true - skipValidation = false - os.Setenv(constants.ConfigVariableAWSPrivateSubnetID, "private-subnet-id-0") - os.Setenv(constants.ConfigVariableAWSPublicSubnetID, "public-subnet-id-0") - os.Setenv(constants.ConfigVariableAWSPrivateSubnetID1, "private-subnet-id-1") - os.Setenv(constants.ConfigVariableAWSPublicSubnetID1, "public-subnet-id-1") - os.Setenv(constants.ConfigVariableAWSPrivateSubnetID2, "private-subnet-id-2") - os.Setenv(constants.ConfigVariableAWSPublicSubnetID2, "public-subnet-id-2") - awsClient = &fakes.AWSClient{} - awsClient.ListSubnetsReturns([]*models.AWSSubnet{ - {ID: "public-subnet-id-0"}, - {ID: "private-subnet-id-0"}, - {ID: "public-subnet-id-1"}, - {ID: "private-subnet-id-1"}, - {ID: "public-subnet-id-2"}, - }, nil) - }) - It("should return true and error on AWS_PRIVATE_SUBNET_ID_2 is not found in vpc", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("cannot find subnet(s) private-subnet-id-2 in VPC VPC-XXXXXXX")) - Expect(useExistingVPC).To(Equal(true)) - }) - }) - - Context("When vpc id is not set in tkgconfig using prod flavor", func() { - BeforeEach(func() { - tkgConfigPath = configFile7 - useProdFlavor = true - skipValidation = true - }) - It("should return false, and default the aws vpc id to empty string", func() { - az1, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSNodeAz) - vpcCidr, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSVPCCIDR) - subnetCidr, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPrivateNodeCIDR) - az2, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSNodeAz1) - subnet2Cidr, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPrivateNodeCIDR1) - Expect(err).ToNot(HaveOccurred()) - Expect(useExistingVPC).To(Equal(false)) - Expect(az1).To(Equal("us-east-2a")) - Expect(vpcCidr).To(Equal("10.0.0.0/16")) - Expect(az2).To(Equal("us-east-2b")) - Expect(subnetCidr).To(Equal("10.0.0.0/24")) - Expect(subnet2Cidr).To(Equal("10.0.2.0/24")) - }) - }) -}) - -var _ = Describe("ValidateVsphereNodeSize", func() { - var ( - tkgConfigPath string - err error - ) - - JustBeforeEach(func() { - tkgClient, cerr := CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(cerr).ToNot(HaveOccurred()) - err = tkgClient.ValidateVsphereNodeSize() - }) - - Context("When some node sizes do not meet the minimum requirements", func() { - BeforeEach(func() { - tkgConfigPath = configFile3 - }) - It("should return validation error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When all node sizes meet the minimum requirements", func() { - BeforeEach(func() { - tkgConfigPath = configFile4 - }) - It("should return not validation error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) - -var _ = Describe("OverrideAWSNodeSizeWithOptions", func() { - var ( - tkgConfigPath string - nodeSizeOptions NodeSizeOptions - err error - tkgClient *TkgClient - awsClient *fakes.AWSClient - ) - - BeforeEach(func() { - tmpConfig, err := os.CreateTemp("", "example") - Expect(err).ToNot(HaveOccurred()) - tkgConfigPath = tmpConfig.Name() - err = os.WriteFile(tkgConfigPath, []byte("CONTROL_PLANE_MACHINE_TYPE: t3.small"), constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) - - awsClient = &fakes.AWSClient{} - awsClient.ListInstanceTypesReturns([]string{"t3.small", "t3.medium", "t3.large", "t3.xlarge", "m5.large"}, nil) - }) - - JustBeforeEach(func() { - os.Setenv(constants.ConfigVariableAWSRegion, "us-east-2") - tkgClient, err = CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - err = tkgClient.OverrideAWSNodeSizeWithOptions(nodeSizeOptions, awsClient, false) - }) - - Context("when --size option is specified with unknown value", func() { - BeforeEach(func() { - nodeSizeOptions = NodeSizeOptions{ - Size: "large", - } - }) - It("should return an error, indicating the size in unknown", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("instance type large is not supported in region us-east-2")) - }) - }) - - Context("when --size option is specified with defined value", func() { - BeforeEach(func() { - nodeSizeOptions = NodeSizeOptions{ - Size: "t3.small", - } - }) - It("should set all node size to the given value", func() { - Expect(err).ToNot(HaveOccurred()) - val, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableNodeMachineType) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal("t3.small")) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCPMachineType) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal("t3.small")) - }) - }) - - Context("when --size and --work-size options are specified at the same time", func() { - BeforeEach(func() { - nodeSizeOptions = NodeSizeOptions{ - Size: "t3.small", - WorkerSize: "m5.large", - } - }) - It("should set the worker node size with the value of --worker-size, and control plane size with the value of --size", func() { - Expect(err).ToNot(HaveOccurred()) - val, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableNodeMachineType) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal("m5.large")) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCPMachineType) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal("t3.small")) - }) - }) - - Context("when --worker-size option is specified with unknown type", func() { - BeforeEach(func() { - nodeSizeOptions = NodeSizeOptions{ - WorkerSize: "large", - } - }) - It("should return an error, indicating size is unknown", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("instance type large is not supported in region us-east-2")) - }) - }) - - Context("when --worker-size option is specified with correct value", func() { - BeforeEach(func() { - nodeSizeOptions = NodeSizeOptions{ - WorkerSize: "m5.large", - } - }) - It("should set the correct value to the viper", func() { - Expect(err).ToNot(HaveOccurred()) - val, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableNodeMachineType) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal("m5.large")) - }) - }) - - Context("when --controlplane-size option is specified with correct value", func() { - BeforeEach(func() { - nodeSizeOptions = NodeSizeOptions{ - ControlPlaneSize: "t3.large", - WorkerSize: "t3.large", - } - }) - It("should override the original value in the tkgconfig", func() { - Expect(err).ToNot(HaveOccurred()) - val, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCPMachineType) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal("t3.large")) - }) - }) - - AfterEach(func() { - os.Remove(tkgConfigPath) - os.Unsetenv(constants.ConfigVariableAWSRegion) - }) -}) - -var _ = Describe("OverrideVsphereNodeSizeWithOptions", func() { - var ( - tkgConfigPath string - nodeSizeOptions NodeSizeOptions - err error - tkgClient *TkgClient - ) - - BeforeEach(func() { - tmpConfig, err := os.CreateTemp("", "example") - Expect(err).ToNot(HaveOccurred()) - tkgConfigPath = tmpConfig.Name() - - configContent := ` - VSPHERE_CONTROL_PLANE_MEM_MIB: "2048" - VSPHERE_CONTROL_PLANE_NUM_CPUS: "1" - SPHERE_CONTROL_PLANE_DISK_GIB: "20" - ` - - err = os.WriteFile(tkgConfigPath, []byte(configContent), constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) - }) - - JustBeforeEach(func() { - tkgClient, err = CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - err = tkgClient.OverrideVsphereNodeSizeWithOptions(nodeSizeOptions) - }) - - Context("When --size is passed in with an unknown vsphere node type", func() { - BeforeEach(func() { - nodeSizeOptions = NodeSizeOptions{ - Size: "t3.large", - } - It("should return an error, indicating the node type is not supported by tkg", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("node size t3.large is not defined, please select among [small, medium, large, extra-large]")) - }) - }) - }) - - Context("When --size is passed in with defined node type", func() { - BeforeEach(func() { - nodeSizeOptions = NodeSizeOptions{ - Size: "medium", - } - It("should override the values in tkg config, and set missing values", func() { - Expect(err).ToNot(HaveOccurred()) - sizes := tkgconfigproviders.NodeTypes["medium"] - - val, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereCPNumCpus) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Cpus)) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereCPMemMib) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Memory)) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereCPDiskGib) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Disk)) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereWorkerNumCpus) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Cpus)) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereWorkerMemMib) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Memory)) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereWorkerDiskGib) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Disk)) - }) - }) - }) - - Context("When --worker-size is passed in with defined node type", func() { - BeforeEach(func() { - nodeSizeOptions = NodeSizeOptions{ - WorkerSize: "medium", - } - It("should set worker node size values without impacting other node sizes", func() { - Expect(err).ToNot(HaveOccurred()) - sizes := tkgconfigproviders.NodeTypes["medium"] - - val, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereCPNumCpus) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal("1")) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereCPMemMib) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal("2048")) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereCPDiskGib) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal("20")) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereWorkerNumCpus) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Cpus)) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereWorkerMemMib) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Memory)) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereWorkerDiskGib) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Disk)) - }) - }) - }) - - Context("When --worker-size and --size options are passed at the same time", func() { - BeforeEach(func() { - nodeSizeOptions = NodeSizeOptions{ - WorkerSize: "medium", - Size: "large", - } - It("should set worker node size by the --worker-size option", func() { - Expect(err).ToNot(HaveOccurred()) - sizes := tkgconfigproviders.NodeTypes["medium"] - - val, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereWorkerNumCpus) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Cpus)) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereWorkerMemMib) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Memory)) - - val, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereWorkerDiskGib) - Expect(err).ToNot(HaveOccurred()) - Expect(val).To(Equal(sizes.Disk)) - }) - }) - }) - - AfterEach(func() { - os.Remove(tkgConfigPath) - }) -}) - -var _ = Describe("ValidateCNIConfig", func() { - var ( - tkgConfigPath string - cniType string - err error - tkgClient *TkgClient - ) - - BeforeEach(func() { - tmpConfig, err := os.CreateTemp("", "example") - Expect(err).ToNot(HaveOccurred()) - tkgConfigPath = tmpConfig.Name() - }) - - JustBeforeEach(func() { - tkgClient, err = CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - err = tkgClient.ConfigureAndValidateCNIType(cniType) - }) - - Context("when --cni option is specified with antrea", func() { - BeforeEach(func() { - cniType = "antrea" - }) - It("should use antrea as cni provider", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCNI)).To(Equal("antrea")) - }) - }) - - Context("when --cni option is specified with calico", func() { - BeforeEach(func() { - cniType = "calico" - }) - It("should use calico as cni provider", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCNI)).To(Equal("calico")) - }) - }) - - Context("when --cni option is specified with none", func() { - BeforeEach(func() { - cniType = "none" - }) - It("should use none as cni provider", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCNI)).To(Equal("none")) - }) - }) - - Context("when --cni option is specified with an unknown value", func() { - BeforeEach(func() { - cniType = "fake-cni" - }) - It("should use throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("provided CNI type 'fake-cni' is not in the available options: antrea, calico, none")) - }) - }) - - Context("when --cni option is not specified", func() { - BeforeEach(func() { - cniType = "" - }) - It("should use calico as cni provider", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCNI)).To(Equal("antrea")) - }) - }) - - Context("when --cni option is not specified but CNI is set in config", func() { - BeforeEach(func() { - cniType = "" - err = os.WriteFile(tkgConfigPath, []byte("CNI: calico"), constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) - }) - It("should use calico as cni provider", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCNI)).To(Equal("calico")) - }) - }) - - AfterEach(func() { - os.Remove(tkgConfigPath) - }) -}) - -var _ = Describe("DistributeMachineDeploymentWorkers", func() { - var ( - workerMachineCount int64 - isProdConfig bool - isManagementCluster bool - infraProviderName string - workerCounts []int - tkgConfigPath string - tmpTkgConfigPath string - err error - tkgClient *TkgClient - ) - - BeforeEach(func() { - tmpConfig, err := os.CreateTemp("", "example") - Expect(err).ToNot(HaveOccurred()) - tmpTkgConfigPath = tmpConfig.Name() - tkgConfigPath = tmpTkgConfigPath - }) - - JustBeforeEach(func() { - tkgClient, err = CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - workerCounts, err = tkgClient.DistributeMachineDeploymentWorkers(workerMachineCount, isProdConfig, isManagementCluster, infraProviderName) - }) - - Context("when not aws and azure", func() { - BeforeEach(func() { - workerMachineCount = 3 - isProdConfig = true - isManagementCluster = false - infraProviderName = constants.InfrastructureProviderVSphere - }) - It("should distribute evenly", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(workerCounts[0]).To(Equal(1)) - Expect(workerCounts[1]).To(Equal(1)) - Expect(workerCounts[2]).To(Equal(1)) - }) - }) - - Context("when dev plan", func() { - BeforeEach(func() { - workerMachineCount = 3 - isProdConfig = false - isManagementCluster = false - infraProviderName = constants.InfrastructureProviderAWS - }) - It("should put all workers in first MD", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(workerCounts[0]).To(Equal(3)) - Expect(workerCounts[1]).To(Equal(0)) - Expect(workerCounts[2]).To(Equal(0)) - }) - }) - - Context("when aws prod plan and odd worker count", func() { - BeforeEach(func() { - workerMachineCount = 3 - isProdConfig = true - isManagementCluster = false - infraProviderName = constants.InfrastructureProviderAWS - }) - It("should distribute evenly", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(workerCounts[0]).To(Equal(1)) - Expect(workerCounts[1]).To(Equal(1)) - Expect(workerCounts[2]).To(Equal(1)) - }) - }) - - Context("when aws prod plan and even worker count", func() { - BeforeEach(func() { - workerMachineCount = 5 - isProdConfig = true - isManagementCluster = false - infraProviderName = constants.InfrastructureProviderAWS - }) - It("should distribute nodes evenly across all 3 azs", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(workerCounts[0]).To(Equal(2)) - Expect(workerCounts[1]).To(Equal(2)) - Expect(workerCounts[2]).To(Equal(1)) - }) - }) - - Context("when aws prod plan and worker count < 3", func() { - BeforeEach(func() { - workerMachineCount = 2 - isProdConfig = true - isManagementCluster = false - infraProviderName = constants.InfrastructureProviderAWS - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("prod plan requires at least 3 workers")) - }) - }) - - Context("when worker counts defined in config", func() { - BeforeEach(func() { - workerMachineCount = 5 - isProdConfig = true - isManagementCluster = false - infraProviderName = constants.InfrastructureProviderAWS - tkgConfigPath = configFile7 - }) - It("should distribute according to values in config", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(workerCounts[0]).To(Equal(2)) - Expect(workerCounts[1]).To(Equal(1)) - Expect(workerCounts[2]).To(Equal(3)) - }) - }) - - Context("when worker counts defined in config and dev plan", func() { - BeforeEach(func() { - workerMachineCount = 1 - isProdConfig = false - isManagementCluster = false - infraProviderName = constants.InfrastructureProviderAWS - tkgConfigPath = configFile7 - }) - It("should distribute according to values in config", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(workerCounts[0]).To(Equal(2)) - Expect(workerCounts[1]).To(Equal(0)) - Expect(workerCounts[2]).To(Equal(0)) - }) - }) - - Context("when aws prod plan and is management cluster", func() { - BeforeEach(func() { - workerMachineCount = 1 - isProdConfig = true - isManagementCluster = true - infraProviderName = constants.InfrastructureProviderAWS - }) - It("should put worker node in first az", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(workerCounts[0]).To(Equal(1)) - Expect(workerCounts[1]).To(Equal(0)) - Expect(workerCounts[2]).To(Equal(0)) - }) - }) - - Context("when aws prod plan and is workload cluster", func() { - BeforeEach(func() { - workerMachineCount = 1 - isProdConfig = true - isManagementCluster = false - infraProviderName = constants.InfrastructureProviderAWS - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("prod plan requires at least 3 workers")) - }) - }) - - Context("when azure prod plan and odd worker count", func() { - BeforeEach(func() { - workerMachineCount = 3 - isProdConfig = true - isManagementCluster = false - infraProviderName = constants.InfrastructureProviderAzure - }) - It("should distribute evenly", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(workerCounts[0]).To(Equal(1)) - Expect(workerCounts[1]).To(Equal(1)) - Expect(workerCounts[2]).To(Equal(1)) - }) - }) - - Context("when azure prod plan and even worker count", func() { - BeforeEach(func() { - workerMachineCount = 5 - isProdConfig = true - isManagementCluster = false - infraProviderName = constants.InfrastructureProviderAzure - }) - It("should distribute nodes evenly across all 3 azs", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(workerCounts[0]).To(Equal(2)) - Expect(workerCounts[1]).To(Equal(2)) - Expect(workerCounts[2]).To(Equal(1)) - }) - }) - - Context("when worker counts defined in config for azure", func() { - BeforeEach(func() { - workerMachineCount = 5 - isProdConfig = true - isManagementCluster = false - infraProviderName = constants.InfrastructureProviderAzure - tkgConfigPath = configFile7 - }) - It("should distribute according to values in config", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(workerCounts[0]).To(Equal(2)) - Expect(workerCounts[1]).To(Equal(1)) - Expect(workerCounts[2]).To(Equal(3)) - }) - }) - - Context("when docker prod plan and is mgmt cluster", func() { - BeforeEach(func() { - workerMachineCount = 5 - isProdConfig = true - isManagementCluster = true - infraProviderName = constants.InfrastructureProviderDocker - tkgConfigPath = configFile7 - }) - It("should have first worker count as total machine count ", func() { - Expect(err).To(Not(HaveOccurred())) - Expect(workerCounts[0]).To(Equal(5)) - Expect(workerCounts[1]).To(Equal(0)) - Expect(workerCounts[2]).To(Equal(0)) - }) - }) - - AfterEach(func() { - os.Remove(tmpTkgConfigPath) - }) -}) - -var _ = Describe("ApplyClusterBootstrap()", func() { - var ( - bootstrapClusterClient *fakes.ClusterClient - mgmtClusterClient *fakes.ClusterClient - - applyClusterBootstrapError error - tkgConfigPath string - tkgClient *TkgClient - getResourceError error - applyError error - tkrError error - tkr *v1alpha3.TanzuKubernetesRelease - ) - - BeforeEach(func() { - bootstrapClusterClient = &fakes.ClusterClient{} - mgmtClusterClient = &fakes.ClusterClient{} - tkgConfigPath = "../fakes/config/config_custom_clusterbootstrap.yaml" - - tkr = &v1alpha3.TanzuKubernetesRelease{ - ObjectMeta: metav1.ObjectMeta{ - Name: "1.24", - Namespace: constants.TkrNamespace, - }, - } - applyClusterBootstrapError = nil - tkrError = nil - getResourceError = nil - applyError = nil - }) - - JustBeforeEach(func() { - rw, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile("", tkgConfigPath) - Expect(err).NotTo(HaveOccurred()) - tkgClient, err = CreateTKGClientWithConfigReaderWriter(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second, rw) - Expect(err).NotTo(HaveOccurred()) - - bootstrapClusterClient.GetClusterResolvedTanzuKubernetesReleaseReturns(tkr, tkrError) - mgmtClusterClient.GetResourceReturns(getResourceError) - mgmtClusterClient.ApplyReturns(applyError) - - applyClusterBootstrapError = tkgClient.ApplyClusterBootstrapObjects(bootstrapClusterClient, mgmtClusterClient) - }) - - Describe("there is custom clusterbootstrap to apply on management cluster", func() { - Context("Apply clusterbootstrap without error", func() { - It("Should apply custom clusterbootstrap on mgmt cluster", func() { - Expect(applyClusterBootstrapError).NotTo(HaveOccurred()) - }) - }) - Context("Apply clusterbootstrap with error", func() { - When("unable to determine tkr on bootstrap cluster", func() { - BeforeEach(func() { - tkrError = fmt.Errorf("Unable to determine tkr") - }) - It("Fails to apply custom clusterbootstrap", func() { - Expect(applyClusterBootstrapError).To(HaveOccurred()) - }) - }) - When("tkr is not available on mgmt cluster", func() { - BeforeEach(func() { - getResourceError = fmt.Errorf("Failed to get 1.24 tkr") - }) - It("Fails to apply custom clusterbootstrap", func() { - Expect(applyClusterBootstrapError).To(HaveOccurred()) - }) - }) - When("apply failed on mgmt cluster", func() { - BeforeEach(func() { - applyError = fmt.Errorf("Failed to apply clusterbootstrap") - }) - It("Fails to apply custom clsuterbootstrap", func() { - Expect(applyClusterBootstrapError).To(HaveOccurred()) - }) - }) - }) - }) -}) - -func CreateTKGClient(clusterConfigFile string, configDir string, defaultBomFile string, timeout time.Duration) (*TkgClient, error) { - return CreateTKGClientOpts(clusterConfigFile, configDir, defaultBomFile, timeout, func(options Options) Options { return options }, nil) -} - -func CreateTKGClientWithConfigReaderWriter(clusterConfigFile string, configDir string, defaultBomFile string, timeout time.Duration, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) (*TkgClient, error) { - return CreateTKGClientOpts(clusterConfigFile, configDir, defaultBomFile, timeout, func(options Options) Options { return options }, tkgConfigReaderWriter) -} - -func CreateTKGClientOpts(clusterConfigFile string, configDir string, defaultBomFile string, timeout time.Duration, optMutator func(options Options) Options, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) (*TkgClient, error) { - setupTestingFiles(clusterConfigFile, configDir, defaultBomFile) - appConfig := types.AppConfig{ - TKGConfigDir: configDir, - CustomizerOptions: types.CustomizerOptions{ - RegionManagerFactory: region.NewFactory(), - }, - } - allClients, err := clientcreator.CreateAllClients(appConfig, tkgConfigReaderWriter) - if err != nil { - return nil, err - } - - return New(optMutator(Options{ - ClusterCtlClient: allClients.ClusterCtlClient, - ReaderWriterConfigClient: allClients.ConfigClient, - RegionManager: allClients.RegionManager, - TKGConfigDir: configDir, - Timeout: timeout, - FeaturesClient: allClients.FeaturesClient, - TKGConfigProvidersClient: allClients.TKGConfigProvidersClient, - TKGBomClient: allClients.TKGBomClient, - TKGConfigUpdater: allClients.TKGConfigUpdaterClient, - TKGPathsClient: allClients.TKGConfigPathsClient, - })) -} - -var testTKGCompatibilityFileFmt = ` -version: v1 -managementClusterPluginVersions: -- version: %s - supportedTKGBomVersions: - - imagePath: tkg-bom - tag: %s -` - -func setupTestingFiles(clusterConfigFile string, configDir string, defaultBomFile string) { - testClusterConfigFile := filepath.Join(configDir, "config.yaml") - err := utils.CopyFile(clusterConfigFile, testClusterConfigFile) - Expect(err).ToNot(HaveOccurred()) - - bomDir, err := tkgconfigpaths.New(configDir).GetTKGBoMDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - err = os.MkdirAll(bomDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - err = utils.CopyFile(defaultBomFile, filepath.Join(bomDir, filepath.Base(defaultBomFile))) - Expect(err).ToNot(HaveOccurred()) - - compatibilityDir, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(compatibilityDir); os.IsNotExist(err) { - err = os.MkdirAll(compatibilityDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - defaultBomFileTag := utils.GetTKGBoMTagFromFileName(filepath.Base(defaultBomFile)) - testTKGCompatabilityFileContent := fmt.Sprintf(testTKGCompatibilityFileFmt, tkgconfigpaths.TKGManagementClusterPluginVersion, defaultBomFileTag) - - compatibilityConfigFile, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityConfigPath() - Expect(err).ToNot(HaveOccurred()) - err = os.WriteFile(compatibilityConfigFile, []byte(testTKGCompatabilityFileContent), constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) - - providersDir, err := tkgconfigpaths.New(configDir).GetTKGProvidersDirectory() - Expect(err).NotTo(HaveOccurred()) - if _, err := os.Stat(providersDir); os.IsNotExist(err) { - err := exec.Command("cp", "-r", "../../providers", filepath.Dir(providersDir)).Run() - Expect(err).NotTo(HaveOccurred()) - } -} -func updateDefaultBoMFileName(configDir string, defaultBomFile string) { - compatibilityDir, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(compatibilityDir); os.IsNotExist(err) { - err = os.MkdirAll(compatibilityDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - defaultBomFileTag := utils.GetTKGBoMTagFromFileName(filepath.Base(defaultBomFile)) - testTKGCompatabilityFileContent := fmt.Sprintf(testTKGCompatibilityFileFmt, tkgconfigpaths.TKGManagementClusterPluginVersion, defaultBomFileTag) - - compatibilityConfigFile, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityConfigPath() - Expect(err).ToNot(HaveOccurred()) - err = os.WriteFile(compatibilityConfigFile, []byte(testTKGCompatabilityFileContent), constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) -} diff --git a/tkg/client/cluster.go b/tkg/client/cluster.go deleted file mode 100644 index d588d35f71..0000000000 --- a/tkg/client/cluster.go +++ /dev/null @@ -1,1055 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "bytes" - "fmt" - "io" - "os" - "path/filepath" - "strconv" - "strings" - "time" - - "gopkg.in/yaml.v3" - - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/version" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - clusterctlclient "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - "sigs.k8s.io/cluster-api/cmd/clusterctl/client/cluster" - "sigs.k8s.io/cluster-api/cmd/clusterctl/client/repository" - addonsv1 "sigs.k8s.io/cluster-api/exp/addons/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfighelper" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/util/topology" -) - -const ( - // PacificProviderName tkgs provider name - PacificProviderName = "tkg-service-vsphere" - // VSphereProviderName vsphere provider name - VSphereProviderName = "vsphere" - // AWSProviderName aws provider name - AWSProviderName = "aws" - // AzureProviderName azure provider name - AzureProviderName = "azure" - // DockerProviderName docker provider name - DockerProviderName = "docker" - // OracleProviderName oracle infrastructure cloud provider name - OracleProviderName = "oci" - - defaultPacificProviderVersion = "v1.1.0" -) - -const ( - // TkgLabelClusterRolePrefix cluster-role label prefix - TkgLabelClusterRolePrefix = "cluster-role.tkg.tanzu.vmware.com/" - // TkgLabelClusterRoleManagement cluster-role management label - TkgLabelClusterRoleManagement = "management" - // TkgLabelClusterRoleWorkload cluster-role workload label - TkgLabelClusterRoleWorkload = "workload" -) - -type waitForAddonsOptions struct { - regionalClusterClient clusterclient.Client - workloadClusterClient clusterclient.Client - clusterName string - namespace string - waitForCNI bool - isTKGSCluster bool -} - -// TKGSupportedClusterOptions is the comma separated list of cluster options that could be enabled by user -// !!!NOTE this is set during the build time. -// Only the cluster options mentioned in "AllowedEnableOptions" could be enabled by user through command line option("enable-cluster-options"), -// if TKGSupportedClusterOptions is set to ""(for development purpose) the check would be deactivated -var TKGSupportedClusterOptions string - -// CreateCluster creates a workload cluster based on a cluster template -// generated from the provided options. Returns whether cluster creation was attempted -// information along with error information -func (c *TkgClient) CreateCluster(options *CreateClusterOptions, waitForCluster bool) (bool, error) { //nolint:gocyclo,funlen - if err := CheckClusterNameFormat(options.ClusterName, options.ProviderRepositorySource.InfrastructureProvider); err != nil { - return false, NewValidationError(ValidationErrorCode, err.Error()) - } - log.Info("Validating configuration...") - // validate kubectl only since we need only kubectl for create cluster - if err := c.ValidatePrerequisites(false, true); err != nil { - return false, err - } - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return false, errors.Wrap(err, "cannot get current management cluster context") - } - - options.Kubeconfig = clusterctlclient.Kubeconfig{Path: currentRegion.SourceFilePath, Context: currentRegion.ContextName} - if options.ProviderRepositorySource.InfrastructureProvider != "" { - options.ProviderRepositorySource.InfrastructureProvider, err = c.tkgConfigUpdaterClient.CheckInfrastructureVersion(options.ProviderRepositorySource.InfrastructureProvider) - if err != nil { - return false, errors.Wrap(err, "unable to check infrastructure provider version") - } - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - OperationTimeout: c.timeout, - } - regionalClusterClient, err := c.clusterClientFactory.NewClient(options.Kubeconfig.Path, options.Kubeconfig.Context, clusterclientOptions) - if err != nil { - return false, errors.Wrap(err, "unable to get cluster client while creating cluster") - } - - isPacific, err := regionalClusterClient.IsPacificRegionalCluster() - if err != nil { - return false, errors.Wrap(err, "error determining Tanzu Kubernetes Cluster service for vSphere management cluster ") - } - if isPacific { - return true, c.createPacificCluster(options, waitForCluster) - } - - // Validate management cluster version - err = c.ValidateManagementClusterVersionWithCLI(regionalClusterClient) - if err != nil { - return false, errors.Wrap(err, "validation failed") - } - - var bytes []byte - var configFilePath string - isManagementCluster := false - if options.KubernetesVersion, options.TKRVersion, err = c.ConfigureAndValidateTkrVersion(options.TKRVersion); err != nil { - return false, err - } - if customImageRepo, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepository); err != nil && customImageRepo != "" && tkgconfighelper.IsCustomRepository(customImageRepo) { - log.Infof("Using custom image repository: %s", customImageRepo) - } - - if err := c.ConfigureAndValidateWorkloadClusterConfiguration(options, regionalClusterClient, false); err != nil { - return false, errors.Wrap(err, "workload cluster configuration validation failed") - } - infraProvider, err := regionalClusterClient.GetRegionalClusterDefaultProviderName(clusterctlv1.InfrastructureProviderType) - if err != nil { - return false, errors.Wrap(err, "failed to get cluster provider information.") - } - infraProviderName, _, err := ParseProviderName(infraProvider) - if err != nil { - return false, err - } - - if options.IsInputFileClusterClassBased { - bytes, err = getContentFromInputFile(options.ClusterConfigFile) - if err != nil { - return false, errors.Wrap(err, "unable to get cluster configuration") - } - - err = validateConfigForSingleNodeCluster(bytes, options, c) - if err != nil { - return false, err - } - } else { - bytes, err = c.getClusterConfigurationBytes(&options.ClusterConfigOptions, infraProviderName, isManagementCluster) - if err != nil { - return false, errors.Wrap(err, "unable to get cluster configuration") - } - - allowLegacyCluster, err := c.allowLegacyCluster() - if err != nil { - return false, err - } - if !allowLegacyCluster { - clusterConfigDir, err := c.tkgConfigPathsClient.GetClusterConfigurationDirectory() - if err != nil { - return false, err - } - configFilePath = filepath.Join(clusterConfigDir, fmt.Sprintf("%s.yaml", options.ClusterName)) - err = utils.SaveFile(configFilePath, bytes) - if err != nil { - return false, err - } - - log.Warningf("\nLegacy configuration file detected. The inputs from said file have been converted into the new Cluster configuration as '%v'", configFilePath) - - // If `features.cluster.auto-apply-generated-clusterclass-based-configuration` feature-flag is not activated - // log command to use to create cluster using ClusterClass based config file and return - if !c.IsFeatureActivated(constants.FeatureFlagAutoApplyGeneratedClusterClassBasedConfiguration) { - log.Warningf("\nTo create a cluster with it, please use the following command together with all customized flags set in the last step. e.g. --tkr, -v") - log.Warningf(" tanzu cluster create --file %v", configFilePath) - return false, nil - } - - log.Warningf("\nUsing this new Cluster configuration '%v' to create the cluster.\n", configFilePath) - } - } - - log.Infof("creating workload cluster '%s'...", options.ClusterName) - err = c.DoCreateCluster(regionalClusterClient, options.ClusterName, options.TargetNamespace, string(bytes)) - if err != nil { - return false, errors.Wrap(err, "unable to create cluster") - } - // If user opts not to wait for the cluster to be provisioned, return - if !waitForCluster { - return false, nil - } - return true, c.waitForClusterCreation(regionalClusterClient, options) -} - -func (c *TkgClient) allowLegacyCluster() (bool, error) { - allowLegacyCluster, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAllowLegacyCluster) - if err != nil { - log.V(6).Infof("failed getting variable ALLOW_LEGACY_CLUSTER, %s", err.Error()) - return false, err - } - - return strconv.ParseBool(allowLegacyCluster) -} - -// getClusterConfigurationBytes returns cluster configuration by taking into consideration of legacy vs clusterclass based cluster creation -func (c *TkgClient) getClusterConfigurationBytes(options *ClusterConfigOptions, infraProviderName string, isManagementCluster bool) ([]byte, error) { - deployClusterClassBasedCluster, err := c.ShouldDeployClusterClassBasedCluster(isManagementCluster) - if err != nil { - return nil, err - } - - // If ClusterClass based cluster creation is feasible update the plan to use ClusterClass based plan - if deployClusterClassBasedCluster { - plan, err := getCCPlanFromLegacyPlan(options.ProviderRepositorySource.Flavor) - if err != nil { - return nil, err - } - options.ProviderRepositorySource.Flavor = plan - } - - // Get the cluster configuration yaml bytes - return c.getClusterConfiguration(options, isManagementCluster, infraProviderName) -} - -func getContentFromInputFile(fileName string) ([]byte, error) { - content, err := os.ReadFile(fileName) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("error while reading input file %v : ", fileName)) - } - return content, nil -} - -func (c *TkgClient) waitForClusterCreation(regionalClusterClient clusterclient.Client, options *CreateClusterOptions) error { - log.Info("waiting for cluster to be initialized...") - kubeConfigBytes, err := c.WaitForClusterInitializedAndGetKubeConfig(regionalClusterClient, options.ClusterName, options.TargetNamespace) - if err != nil { - return errors.Wrap(err, "unable to wait for cluster and get the cluster kubeconfig") - } - - workloadClusterKubeconfigPath, err := getTKGKubeConfigPath(false) - if err != nil { - return errors.Wrap(err, "unable to save workload cluster kubeconfig to temporary path") - } - defer func() { - _ = utils.DeleteFile(workloadClusterKubeconfigPath) - }() - - kubeContext, err := MergeKubeConfigAndSwitchContext(kubeConfigBytes, workloadClusterKubeconfigPath) - if err != nil { - return errors.Wrap(err, "unable to save management cluster kubeconfig to TKG managed kubeconfig") - } - - log.Info("waiting for cluster nodes to be available...") - if err := c.WaitForClusterReadyAfterCreate(regionalClusterClient, options.ClusterName, options.TargetNamespace); err != nil { - return errors.Wrap(err, "unable to wait for cluster nodes to be available") - } - - isClusterClassBased, err := regionalClusterClient.IsClusterClassBased(options.ClusterName, options.TargetNamespace) - if err != nil { - return errors.Wrap(err, "error while checking workload cluster type") - } - - c.WaitForAutoscalerDeployment(regionalClusterClient, options.ClusterName, options.TargetNamespace, isClusterClassBased) - workloadClusterClient, err := clusterclient.NewClient(workloadClusterKubeconfigPath, kubeContext, clusterclient.Options{OperationTimeout: 15 * time.Minute}) - if err != nil { - return errors.Wrap(err, "unable to create workload cluster client") - } - - isTKGSCluster, err := regionalClusterClient.IsPacificRegionalCluster() - if err != nil { - return err - } - if isClusterClassBased { - log.Info("waiting for addons core packages installation...") - if err := c.WaitForAddonsCorePackagesInstallation(waitForAddonsOptions{ - regionalClusterClient: regionalClusterClient, - workloadClusterClient: workloadClusterClient, - clusterName: options.ClusterName, - namespace: options.TargetNamespace, - waitForCNI: true, - isTKGSCluster: isTKGSCluster, - }); err != nil { - return errors.Wrap(err, "error waiting for addons to get installed") - } - } else { - log.Info("waiting for addons installation...") - if err := c.WaitForAddons(waitForAddonsOptions{ - regionalClusterClient: regionalClusterClient, - workloadClusterClient: workloadClusterClient, - clusterName: options.ClusterName, - namespace: options.TargetNamespace, - waitForCNI: true, - }); err != nil { - return errors.Wrap(err, "error waiting for addons to get installed") - } - log.Info("waiting for packages to be up and running...") - if err := c.WaitForPackages(regionalClusterClient, workloadClusterClient, options.ClusterName, options.TargetNamespace, false); err != nil { - log.Warningf("warning: Cluster is created successfully, but some packages are failing. %v", err) - } - } - return nil -} - -func (c *TkgClient) getValueForAutoscalerDeploymentConfig() bool { - var autoscalerEnabled string - var isEnabled bool - var err error - - // swallowing the error when the value for config variable 'ENABLE_AUTOSCALER' is not set - if autoscalerEnabled, err = c.TKGConfigReaderWriter().Get(constants.ConfigVariableEnableAutoscaler); err != nil { - return false - } - - if isEnabled, err = strconv.ParseBool(autoscalerEnabled); err != nil { - log.Warningf("unable to parse the value of config variable %q. reason: %v", constants.ConfigVariableEnableAutoscaler, err) - return false - } - - return isEnabled -} - -// WaitForAutoscalerDeployment waits for autoscaler deployment if enabled -func (c *TkgClient) WaitForAutoscalerDeployment(regionalClusterClient clusterclient.Client, clusterName, targetNamespace string, isClusterClassBased bool) { - isEnabled := false - autoscalerDeploymentName := clusterName + constants.AutoscalerDeploymentNameSuffix - if isClusterClassBased { - autoscalerDeployment, err := regionalClusterClient.GetDeployment(autoscalerDeploymentName, targetNamespace) - if autoscalerDeployment.Name == "" || err != nil { - log.Warning("unable to get the autoscaler deployment, maybe it is not exist") - return - } - isEnabled = true - } else { - isEnabled = c.getValueForAutoscalerDeploymentConfig() - } - if isEnabled { - log.Warning("Waiting for cluster autoscaler to be available...") - if err := regionalClusterClient.WaitForAutoscalerDeployment(autoscalerDeploymentName, targetNamespace); err != nil { - log.Warningf("Unable to wait for autoscaler deployment to be ready. reason: %v", err) - } - } -} - -// DoCreateCluster performs steps to create cluster -func (c *TkgClient) DoCreateCluster(clusterClient clusterclient.Client, name, namespace, manifest string) error { - var err error - - if name == "" { - return errors.New("invalid cluster name") - } - if manifest == "" { - return errors.New("invalid cluster manifest") - } - - err = clusterClient.Apply(manifest) - if err != nil { - return errors.Wrap(err, "unable to apply cluster configuration") - } - - err = clusterClient.PatchClusterWithOperationStartedStatus(name, namespace, clusterclient.OperationTypeCreate, c.timeout) - if err != nil { - log.V(6).Infof("unable to patch cluster object with operation status, %s", err.Error()) - } - - return nil -} - -// WaitForClusterInitializedAndGetKubeConfig wait for cluster initialization and once initialized get kubeconfig -func (c *TkgClient) WaitForClusterInitializedAndGetKubeConfig(clusterClient clusterclient.Client, name, targetNamespace string) ([]byte, error) { - var err error - var kubeConfigBytes []byte - - err = clusterClient.WaitForClusterInitialized(name, targetNamespace) - if err != nil { - return kubeConfigBytes, errors.Wrap(err, "error waiting for cluster to be provisioned (this may take a few minutes)") - } - - kubeConfigBytes, err = clusterClient.GetKubeConfigForCluster(name, targetNamespace, nil) - if err != nil { - return kubeConfigBytes, errors.Wrapf(err, "unable to extract kube config for cluster %s", name) - } - - // Wait for the cluster to actually answer. This ensure that the LB/DNS are effectively in place - - return kubeConfigBytes, nil -} - -// WaitForClusterReadyForMove wait for cluster to be ready for move operation -func (c *TkgClient) WaitForClusterReadyForMove(clusterClient clusterclient.Client, name, targetNamespace string) error { - return clusterClient.WaitForClusterReady(name, targetNamespace, true) -} - -// WaitForClusterReadyAfterCreate wait for cluster to be ready after creation -func (c *TkgClient) WaitForClusterReadyAfterCreate(clusterClient clusterclient.Client, name, targetNamespace string) error { - // For now we use the same waiting logic to wait for workload cluster creation. As an enhancement we may - // want to be less stringent or more adaptive to the parameters used to create the cluster (wait longer when - // worker size is big, or wait for fewer nodes, etc) - return clusterClient.WaitForClusterReady(name, targetNamespace, true) -} - -// WaitForClusterReadyAfterReverseMove Called when relocating cluster-api objects out from the management cluster to the cleanup cluster. -func (c *TkgClient) WaitForClusterReadyAfterReverseMove(clusterClient clusterclient.Client, name, targetNamespace string) error { - // The cluster checker should not get hung up on cluster not having its full inventory of worker and - // control plane replicas - checkReplicas := false - - // Nb. After move we are required to wait for the ClusterAPi objects to get reconciled before doing delete. - // this is required because delete will fail if the object does not have the status field properly set. - // This is achieved by testing the cluster & machine status reports ready (as it was before move). - return clusterClient.WaitForClusterReady(name, targetNamespace, checkReplicas) -} - -// WaitForAddons wait for addons to be installed -func (c *TkgClient) WaitForAddons(options waitForAddonsOptions) error { - if err := c.waitForCRS(options); err != nil { - return err - } - if options.waitForCNI { - if err := c.waitForCNI(options); err != nil { - return err - } - } - return nil -} - -func (c *TkgClient) waitForCNI(options waitForAddonsOptions) error { - cni, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableCNI) - if err != nil { - log.Info("Warning: unable to get CNI, skipping CNI installation verification") - } - - if cni == "antrea" { - if err := options.workloadClusterClient.WaitForDeployment( - constants.AntreaDeploymentName, - constants.AntreaDeploymentNamespace); err != nil { - return errors.Wrap(err, "timeout waiting for antrea cni to start") - } - } else if cni == "calico" { - if err := options.workloadClusterClient.WaitForDeployment( - constants.CalicoDeploymentName, - constants.CalicoDeploymentNamespace); err != nil { - return errors.Wrap(err, "timeout waiting for calico cni to start") - } - } - return nil -} - -func (c *TkgClient) waitForCRS(options waitForAddonsOptions) error { - crsList := &addonsv1.ClusterResourceSetList{} - err := options.regionalClusterClient.GetResourceList(crsList, - options.clusterName, - options.namespace, - clusterclient.VerifyCRSAppliedSuccessfully, - &clusterclient.PollOptions{Interval: clusterclient.CheckClusterInterval, Timeout: c.timeout}) - if err != nil { - return errors.Wrap(err, "error waiting for ClusterResourceSet object to be applied for the cluster") - } - - return nil -} - -// WaitForAddonsCorePackagesInstallation gets ClusterBootstrap and collects list of addons core packages, and monitors the kapp controller package installation in management cluster and rest of core packages installation in workload cluster -func (c *TkgClient) WaitForAddonsCorePackagesInstallation(options waitForAddonsOptions) error { - clusterBootstrap, err := GetClusterBootstrap(options.regionalClusterClient, options.clusterName, options.namespace) - if err != nil { - return errors.Wrap(err, fmt.Sprintf("error while getting ClusterBootstrap object for workload cluster: %v", options.clusterName)) - } - var corePackagesNamespace string - if options.isTKGSCluster { - corePackagesNamespace = constants.CorePackagesNamespaceInTKGS - } else { - corePackagesNamespace = constants.CorePackagesNamespaceInTKGM - } - packages, err := GetCorePackagesFromClusterBootstrap(options.regionalClusterClient, options.workloadClusterClient, clusterBootstrap, corePackagesNamespace, options.clusterName) - if err != nil { - return err - } - return MonitorAddonsCorePackageInstallation(options.regionalClusterClient, options.workloadClusterClient, packages, c.getPackageInstallTimeoutFromConfig()) -} - -func (c *TkgClient) createPacificCluster(options *CreateClusterOptions, waitForCluster bool) (err error) { - // get the configuration - var configYaml []byte - var clusterName, namespace string - - if options.NodeSizeOptions.Size != "" || options.NodeSizeOptions.ControlPlaneSize != "" || options.NodeSizeOptions.WorkerSize != "" { - return errors.New("creating Tanzu Kubernetes Cluster is not compatible with the node size options: --size, --controlplane-size, and --worker-size") - } - - if options.IsInputFileClusterClassBased { - configYaml, err = getContentFromInputFile(options.ClusterConfigFile) - if err != nil { - return errors.Wrap(err, "unable to get cluster configuration") - } - } else { - configYaml, err = c.getPacificClusterConfiguration(options) - if err != nil { - return errors.Wrap(err, "failed to create Tanzu Kubernetes Cluster service for vSphere workload cluster") - } - } - - clusterName, namespace, err = c.getClusterNameAndNameSpace() - if err != nil { - return errors.Wrap(err, "failed to get cluster name and namespace") - } - - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - OperationTimeout: c.timeout, - } - clusterClient, err := clusterclient.NewClient(options.Kubeconfig.Path, options.Kubeconfig.Context, clusterclientOptions) - if err != nil { - return errors.Wrap(err, "unable to get cluster client") - } - // Apply the template(with variables subsitituted) to the supervisor cluster - if err := clusterClient.Apply(string(configYaml)); err != nil { - return errors.Wrap(err, "failed to apply the cluster configuration") - } - // If user opts not to wait for the cluster to be provisioned, return - if !waitForCluster { - return nil - } - - log.V(3).Infof("Waiting for the Tanzu Kubernetes Cluster service for vSphere workload cluster\n") - if options.IsInputFileClusterClassBased { - err = c.waitForClusterCreation(clusterClient, options) - } else { - err = clusterClient.WaitForPacificCluster(clusterName, namespace) - } - if err != nil { - return errors.Wrap(err, "failed waiting for workload cluster") - } - return nil -} - -func (c *TkgClient) getPacificClusterConfiguration(options *CreateClusterOptions) ([]byte, error) { - if options.ProviderRepositorySource.InfrastructureProvider == "" { - options.ProviderRepositorySource.InfrastructureProvider = PacificProviderName - } - - // parse the abbreviated syntax for name[:version] - name, providerVersion, err := ParseProviderName(options.ProviderRepositorySource.InfrastructureProvider) - if err != nil { - return nil, err - } - - if providerVersion == "" { - // TODO: should be changed once we get APIs from Pacific to determine the version, for now using "1.1.0" - providerVersion = defaultPacificProviderVersion - } - - // Set CLUSTER_PLAN to viper configuration - c.SetPlan(options.ProviderRepositorySource.Flavor) - c.SetProviderType(name) - c.SetTKGClusterRole(WorkloadCluster) - c.SetTKGVersion() - tkrName := utils.GetTkrNameFromTkrVersion(options.TKRVersion) - if !strings.HasPrefix(tkrName, "v") { - tkrName = "v" + tkrName - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableTkrName, tkrName) - err = c.ConfigureAndValidateCNIType(options.CniType) - if err != nil { - return nil, errors.Wrap(err, "unable to validate CNI") - } - - clusterCtlConfigClient := c.readerwriterConfigClient.ClusterConfigClient() - providerConfig, err := clusterCtlConfigClient.Providers().Get(name, clusterctlv1.InfrastructureProviderType) - if err != nil { - return nil, err - } - - kubeconfig := cluster.Kubeconfig{Path: options.Kubeconfig.Path, Context: options.Kubeconfig.Context} - clusterClient := cluster.New(kubeconfig, clusterCtlConfigClient) - - // If the option specifying the targetNamespace is empty, try to detect it. - if options.TargetNamespace == "" { - currentNamespace, err := clusterClient.Proxy().CurrentNamespace() - if err != nil { - return nil, err - } - options.TargetNamespace = currentNamespace - } - - // Inject some of the templateOptions into the configClient so they can be consumed as a variables from the template. - if err := c.templateOptionsToVariables(&options.ClusterConfigOptions); err != nil { - return nil, err - } - repo, err := repository.New(providerConfig, clusterCtlConfigClient, repository.InjectYamlProcessor(options.YamlProcessor)) - if err != nil { - return nil, errors.Wrap(err, "unable to create repository Client for getting Tanzu Kubernetes Cluster service for vSphere cluster plan") - } - - template, err := repo.Templates(providerVersion).Get(options.ProviderRepositorySource.Flavor, options.TargetNamespace, false) - if err != nil { - return nil, err - } - yaml, err := template.Yaml() - if err != nil { - return nil, errors.Wrap(err, "error generating yaml file to create cluster") - } - return yaml, nil -} - -// templateOptionsToVariables injects some of the templateOptions to the configClient so they can be consumed as a variables from the template. -func (c *TkgClient) templateOptionsToVariables(options *ClusterConfigOptions) error { - if options.TargetNamespace != "" { - // the TargetNamespace, if valid, can be used in templates using the ${ NAMESPACE } variable. - if err := validateDNS1123Label(options.TargetNamespace); err != nil { - return errors.Wrapf(err, "invalid target-namespace") - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableNamespace, options.TargetNamespace) - } - - if options.ClusterName != "" { - // the ClusterName, if valid, can be used in templates using the ${ CLUSTER_NAME } variable. - if err := validateDNS1123Label(options.ClusterName); err != nil { - return errors.Wrapf(err, "invalid cluster name") - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterName, options.ClusterName) - } - - // the KubernetesVersion, if valid, can be used in templates using the ${ KUBERNETES_VERSION } variable. - // NB. in case the KubernetesVersion from the templateOptions is empty, we are not setting any values so the - // configClient is going to search into os env variables/the clusterctl config file as a fallback options. - if options.KubernetesVersion != "" { - if _, err := version.ParseSemantic(options.KubernetesVersion); err != nil { - return errors.Errorf("invalid KubernetesVersion. Please use a semantic version number") - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableKubernetesVersion, options.KubernetesVersion) - } - - // the ControlPlaneMachineCount, if valid, can be used in templates using the ${ CONTROL_PLANE_MACHINE_COUNT } variable. - if *options.ControlPlaneMachineCount < 1 { - return errors.Errorf("invalid ControlPlaneMachineCount. Please use a number greater or equal than 1") - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableControlPlaneMachineCount, strconv.Itoa(int(*options.ControlPlaneMachineCount))) - - // the WorkerMachineCount, if valid, can be used in templates using the ${ WORKER_MACHINE_COUNT } variable. - if *options.WorkerMachineCount < 0 { - return errors.Errorf("invalid WorkerMachineCount. Please use a number greater or equal than 0") - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableWorkerMachineCount, strconv.Itoa(int(*options.WorkerMachineCount))) - return nil -} - -func (c *TkgClient) getClusterNameAndNameSpace() (string, string, error) { - var err error - clusterName := "" - if clusterName, err = c.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterName); err != nil { - return "", "", errors.Wrap(err, "failed to get the cluster name") - } - namespace := "" - if namespace, err = c.TKGConfigReaderWriter().Get(constants.ConfigVariableNamespace); err != nil { - return "", "", errors.Wrap(err, "failed to get the namespace") - } - return clusterName, namespace, err -} - -// ConfigureAndValidateWorkloadClusterConfiguration configures and validates workload cluster configuration -func (c *TkgClient) ConfigureAndValidateWorkloadClusterConfiguration(options *CreateClusterOptions, clusterClient clusterclient.Client, skipValidation bool) error { // nolint:gocyclo - var err error - - err = c.ValidateAndConfigureClusterOptions(options) - if err != nil { - return errors.Wrap(err, "unable to configure the cluster options") - } - infraProvider := options.ProviderRepositorySource.InfrastructureProvider - if infraProvider == "" { - if infraProvider, err = clusterClient.GetRegionalClusterDefaultProviderName(clusterctlv1.InfrastructureProviderType); err != nil { - return err - } - } - - providerName, _, err := ParseProviderName(infraProvider) - if err != nil { - return err - } - - if err = c.ConfigureAndValidateHTTPProxyConfiguration(providerName); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if options.ClusterType == "" { - options.ClusterType = WorkloadCluster - } - // BUILD_EDITION is the Tanzu Edition, the plugin should be built for. Its value is supposed be constructed from - // cmd/cli/plugin/managementcluster/create.go. So empty value at this point is not expected. - if options.Edition == "" { - return NewValidationError(ValidationErrorCode, "required config variable 'edition' is not set") - } - c.SetBuildEdition(options.Edition) - c.SetTKGClusterRole(options.ClusterType) - c.SetTKGVersion() - if !skipValidation { - // Get the Pinniped information required for workload cluster from management cluster - // NOTE: Not blocking the workload cluster deployment if the pinniped information is not available on management cluster - pinnipedIssuerURL, pinnipedIssuerCAData, err := clusterClient.GetPinnipedIssuerURLAndCA() - if err != nil { - log.Warningf("Warning: Pinniped configuration not found; Authentication via Pinniped will not be set up in this cluster. If you wish to set up Pinniped after the cluster is created, please refer to the documentation.") - } else { - c.SetPinnipedConfigForWorkloadCluster(pinnipedIssuerURL, pinnipedIssuerCAData) - } - } - - err = c.ConfigureAndValidateCNIType(options.CniType) - if err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "unable to validate CNI type").Error()) - } - - if err = c.configureAndValidateIPFamilyConfiguration(TkgLabelClusterRoleWorkload); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.configureAndValidateCoreDNSIP(); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.validateServiceCIDRNetmask(); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.ConfigureAndValidateNameserverConfiguration(TkgLabelClusterRoleWorkload); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err := c.configureAndValidateProviderConfig(providerName, options, clusterClient, skipValidation); err != nil { - return err - } - - if err = c.ValidateExtraArgs(); err != nil { - return err - } - - if err = c.ValidateKubeVipLBConfiguration(TkgLabelClusterRoleWorkload); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.ValidateAviMaxAllowedClusterNameLength(TkgLabelClusterRoleWorkload, options.ClusterName, clusterClient, skipValidation); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - return c.ValidateSupportOfK8sVersionForManagmentCluster(clusterClient, options.KubernetesVersion, skipValidation) -} - -func (c *TkgClient) ValidateExtraArgs() error { - supportedList := []string{ - constants.ConfigVariableEtcdExtraArgs, - constants.ConfigVariableAPIServerExtraArgs, - constants.ConfigVariableKubeSchedulerExtraArgs, - constants.ConfigVariableKubeControllerManagerExtraArgs, - constants.ConfigVariableControlPlaneKubeletExtraArgs, - constants.ConfigVariableWorkerKubeletExtraArgs, - } - for _, extraArgsName := range supportedList { - if args, err := c.TKGConfigReaderWriter().Get(extraArgsName); err != nil { - c.TKGConfigReaderWriter().Set(extraArgsName, "") - } else if args != "" { - argList := strings.Split(args, ";") - for _, arg := range argList { - if index := strings.Index(arg, "="); index >= 0 { - key := arg[0:index] - if strings.TrimSpace(key) == "" { - return errors.New(fmt.Sprintf("%s contains empty keys: %s", extraArgsName, args)) - } - } else { - return errors.New(fmt.Sprintf("%s is not format key1=value1;key2=value2: %s", extraArgsName, args)) - } - } - } - } - return nil -} - -// ValidateProviderConfig configure and validate based on provider -func (c *TkgClient) configureAndValidateProviderConfig(providerName string, options *CreateClusterOptions, clusterClient clusterclient.Client, skipValidation bool) error { - isProdPlan := IsProdPlan(options.ClusterConfigOptions.ProviderRepositorySource.Flavor) - switch providerName { - case AWSProviderName: - if err := c.ConfigureAndValidateAWSConfig(options.TKRVersion, options.NodeSizeOptions, skipValidation, - isProdPlan, *options.WorkerMachineCount, clusterClient, false); err != nil { - return errors.Wrap(err, "AWS config validation failed") - } - case VSphereProviderName: - if err := c.ConfigureAndValidateVsphereConfig(options.TKRVersion, options.NodeSizeOptions, options.VsphereControlPlaneEndpoint, skipValidation, nil); err != nil { - return errors.Wrap(err, "vSphere config validation failed") - } - if err := c.ValidateVsphereVipWorkloadCluster(clusterClient, options.VsphereControlPlaneEndpoint, skipValidation); err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "vSphere control plane endpoint IP validation failed").Error()) - } - case AzureProviderName: - if err := c.ConfigureAndValidateAzureConfig(options.TKRVersion, options.NodeSizeOptions, skipValidation, clusterClient); err != nil { - return errors.Wrap(err, "Azure config validation failed") - } - case DockerProviderName: - if err := c.ConfigureAndValidateDockerConfig(options.TKRVersion, options.NodeSizeOptions, skipValidation); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - } - - workerCounts, err := c.DistributeMachineDeploymentWorkers(*options.WorkerMachineCount, isProdPlan, false, providerName) - if err != nil { - return errors.Wrap(err, "failed to distribute machine deployments") - } - c.SetMachineDeploymentWorkerCounts(workerCounts, *options.WorkerMachineCount, isProdPlan) - - return nil -} - -// ValidateSupportOfK8sVersionForManagmentCluster validate k8s version support for management cluster -func (c *TkgClient) ValidateSupportOfK8sVersionForManagmentCluster(regionalClusterClient clusterclient.Client, kubernetesVersion string, skipValidation bool) error { - if skipValidation { - return nil - } - - mgmtClusterName, mgmtClusterNamespace, err := c.getRegionalClusterNameAndNamespace(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "unable to get name and namespace of current management cluster") - } - - mgmtClusterTkgVersion, err := regionalClusterClient.GetManagementClusterTKGVersion(mgmtClusterName, mgmtClusterNamespace) - if err != nil { - return errors.Wrap(err, "unable to get tkg version of management clusters") - } - - return tkgconfighelper.ValidateK8sVersionSupport(mgmtClusterTkgVersion, kubernetesVersion) -} - -// IsPacificManagementCluster check if management cluster is TKGS cluster -func (c *TkgClient) IsPacificManagementCluster() (bool, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return false, errors.Wrap(err, "cannot get current management cluster context") - } - - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - OperationTimeout: c.timeout, - } - - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return false, errors.Wrap(err, "unable to get management cluster client") - } - - isPacific, err := regionalClusterClient.IsPacificRegionalCluster() - if err != nil { - return false, errors.Wrap(err, "error while determining infrastructure provider type") - } - return isPacific, nil -} - -// ValidateAndConfigureClusterOptions validates and configures the cluster options user want to enable -// through command line options -func (c *TkgClient) ValidateAndConfigureClusterOptions(options *CreateClusterOptions) error { - if options.ClusterOptionsEnableList == nil || len(options.ClusterOptionsEnableList) == 0 { - return nil - } - clusterOptions, err := getClusterOptionsEnableList(options.ClusterOptionsEnableList) - if err != nil { - return errors.Wrap(err, "cluster options validation failed") - } - - supportedOptionsMap := make(map[string]bool) - supportedOptions := []string{} - - if TKGSupportedClusterOptions != "" { - supportedOptions = strings.Split(TKGSupportedClusterOptions, ",") - log.V(9).Infof("List of cluster options supported are :%v", supportedOptions) - for _, option := range supportedOptions { - supportedOptionsMap[option] = true - } - } - // set the config value using viper, so that ytt can access these values - for _, option := range clusterOptions { - // for development, this would be empty which implies there is no restriction imposed - if len(supportedOptions) != 0 { - if _, exist := supportedOptionsMap[option]; !exist { - return errors.Errorf("cluster option '%s' is not supported in this release. Supported cluster options are %v", option, supportedOptions) - } - } - // convert to upper case and replace hypens with underscore and prefix with "ENABLE_" - opt := "ENABLE_" + strings.ToUpper(strings.ReplaceAll(option, "-", "_")) - c.TKGConfigReaderWriter().Set(opt, strconv.FormatBool(true)) - } - return nil -} - -// ValidateManagementClusterVersionWithCLI validate management cluster version with cli version -func (c *TkgClient) ValidateManagementClusterVersionWithCLI(regionalClusterClient clusterclient.Client) error { - mgmtClusterName, mgmtClusterNamespace, err := c.getRegionalClusterNameAndNamespace(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "unable to get name and namespace of current management cluster") - } - - mgmtClusterTkgVersion, err := regionalClusterClient.GetManagementClusterTKGVersion(mgmtClusterName, mgmtClusterNamespace) - if err != nil { - return errors.Wrap(err, "unable to get tkg version of management clusters") - } - - defaultTKGVersion, err := c.tkgBomClient.GetDefaultTKGReleaseVersion() - if err != nil { - return errors.Wrap(err, "unable to get default TKG version") - } - - curMCSemVersion, err := version.ParseSemantic(mgmtClusterTkgVersion) - if err != nil { - return errors.Wrapf(err, "unable to parse management cluster version %s", mgmtClusterTkgVersion) - } - - defaultTKGSemVersion, err := version.ParseSemantic(defaultTKGVersion) - if err != nil { - return errors.Wrapf(err, "unable to parse TKG version %s", defaultTKGVersion) - } - - if curMCSemVersion.Major() != defaultTKGSemVersion.Major() || - curMCSemVersion.Minor() != defaultTKGSemVersion.Minor() { - return errors.Errorf("version mismatch between management cluster and cli version. Please upgrade your management cluster to the latest to continue") - } - - return nil -} - -// ValidateKubeVipLBConfiguration validates the configuration inputs of Kubevip Loadbalancer related variables -func (c *TkgClient) ValidateKubeVipLBConfiguration(clusterRole string) error { - kvlbEnabled, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableKubevipLoadbalancerEnable) - kblbCIDRs, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableKubevipLoadbalancerCIDRs) - kvlbIPRanges, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableKubevipLoadbalancerIPRanges) - - if (kvlbEnabled == "true" || kblbCIDRs != "" || kvlbIPRanges != "") && clusterRole == TkgLabelClusterRoleManagement { - return errors.Errorf("%s or %s or %s is set but kubevip loadbalancer is not supported on management cluster so far", constants.ConfigVariableKubevipLoadbalancerEnable, constants.ConfigVariableKubevipLoadbalancerCIDRs, constants.ConfigVariableKubevipLoadbalancerIPRanges) - } - - // ignoring error because AVI_ENABLE is an optional configuration - if kvlbEnabled == "" || kvlbEnabled == "false" { - if kblbCIDRs != "" || kvlbIPRanges != "" { - return errors.Errorf("%s is disabled but %s or %s is not empty", constants.ConfigVariableKubevipLoadbalancerEnable, constants.ConfigVariableKubevipLoadbalancerCIDRs, constants.ConfigVariableKubevipLoadbalancerIPRanges) - } - return nil - } - if kblbCIDRs == "" && kvlbIPRanges == "" { - return errors.Errorf("%s is enabled, either %s or %s has to be set", constants.ConfigVariableKubevipLoadbalancerEnable, constants.ConfigVariableKubevipLoadbalancerCIDRs, constants.ConfigVariableKubevipLoadbalancerIPRanges) - } - - return nil -} - -// ValidateAviMaxAllowedClusterNameLength validates if AVI enabled cluster's name has no more than 25 characters -func (c *TkgClient) ValidateAviMaxAllowedClusterNameLength(clusterRole, clusterName string, regionalClusterClient clusterclient.Client, skipValidation bool) error { - aviLabels, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviLabels) - kvlbEnabled, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableKubevipLoadbalancerEnable) - - // skip when: - // 1. cluster is management cluster, that check has already been done in ConfigureAndValidateAviConfiguration func - // 2. workload cluster doesn't enable avi - // 3. skip validation - if clusterRole != TkgLabelClusterRoleWorkload || kvlbEnabled == "true" || skipValidation { - return nil - } - - mgmtClusterName, _, err := c.getRegionalClusterNameAndNamespace(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "unable to get name and namespace of current management cluster") - } - akooAddonSecretValues, found, err := GetAKOOAddonSecretValues(regionalClusterClient, mgmtClusterName, true) - if err != nil { - return errors.Wrap(err, "unable to get akoo addon secret values") - } - - if found { - configValues := make(map[string]interface{}) - if err = RetrieveAKOOVariablesFromAddonSecretValues(mgmtClusterName, configValues, akooAddonSecretValues); err != nil { - return errors.Wrap(err, "unable to handle the akoo specific variables") - } - // mgmt avi labels is specified & workload cluster avi labels not specify, workload cluster doesn't enable Avi, skip - if !utils.IsAviInputEmpty(configValues[constants.ConfigVariableAviLabels]) && aviLabels == "" { - return nil - } - if len(clusterName) > constants.AkoMaxAllowedClusterNameLen { - return errors.Errorf("%s contains more than %d character, which will cause AKO package deployment failure", clusterName, constants.AkoMaxAllowedClusterNameLen) - } - } - return nil -} - -// validateConfigForSingleNodeCluster validates that the controlPlaneTaint CC variable is not set for the single node workload cluster, otherwise returns error -func validateConfigForSingleNodeCluster(stream []byte, options *CreateClusterOptions, tkgClient *TkgClient) error { - cluster, err := getClusterObjectFromYaml(stream) - if err != nil { - return err - } - - if !topology.IsSingleNodeCluster(cluster) { - return nil - } - - controlPlaneTaint := true - err = topology.GetVariable(cluster, "controlPlaneTaint", &controlPlaneTaint) - if err != nil { - return errors.Wrap(err, "failed to get CC variable controlPlaneTaint") - } - - // Do not allow the creation of single node clusters without the feature gate. - if !tkgClient.IsFeatureActivated(constants.FeatureFlagSingleNodeClusters) { - return errors.New("Worker count cannot be 0, minimum worker count required is 1") - } - - if controlPlaneTaint { - return errors.New(fmt.Sprintf("unable to create single node cluster %s as control plane node has taint", options.ClusterName)) - } - - return nil -} - -func getClusterObjectFromYaml(stream []byte) (*capi.Cluster, error) { - clusterYaml, err := findClusterDefinitionIn(stream) - if err != nil { - return nil, err - } - - cluster := &capi.Cluster{} - err = runtime.DefaultUnstructuredConverter.FromUnstructured(clusterYaml, cluster) - if err != nil { - return nil, errors.Wrap(err, "unable to convert yaml to structured format") - } - return cluster, nil -} - -func findClusterDefinitionIn(stream []byte) (map[string]interface{}, error) { - clusterYaml := make(map[string]interface{}) - decoder := yaml.NewDecoder(bytes.NewBufferString(string(stream))) - for { - if err := decoder.Decode(&clusterYaml); err != nil { - if err == io.EOF { - break - } - return clusterYaml, errors.Wrap(err, "unable to read cluster yaml") - } - if clusterYaml["kind"] == constants.KindCluster { - break - } - } - return clusterYaml, nil -} diff --git a/tkg/client/cluster_test.go b/tkg/client/cluster_test.go deleted file mode 100644 index 6a720ab2ee..0000000000 --- a/tkg/client/cluster_test.go +++ /dev/null @@ -1,519 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package client_test - -import ( - "bytes" - "fmt" - "io" - "os" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/utils/pointer" - - "sigs.k8s.io/cluster-api/api/v1alpha3" - clusterctl "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - "sigs.k8s.io/cluster-api/cmd/clusterctl/client/repository" - "sigs.k8s.io/cluster-api/cmd/clusterctl/client/yamlprocessor" - "sigs.k8s.io/controller-runtime/pkg/client" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" -) - -type MockClusterctlClient struct { - clusterctl.Client -} - -func (m *MockClusterctlClient) GetClusterTemplate(options clusterctl.GetClusterTemplateOptions) (clusterctl.Template, error) { - templateMapYaml := []byte("cluster.x-k8s.io/v1alpha3\n" + - "kind: Cluster\n" + - "metadata:\n" + - fmt.Sprintf(" name: ${%s}\n", "foobar") + - "spec:\n" + - " clusterNetwork:\n" + - " pods:\n" + - " cidrBlocks:\n" + - " - 192.168.0.0/16\n" + - " infrastructureRef:\n" + - " apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3\n" + - " kind: vSphereCluster\n" + - " name: tkg-region-vSphere-11111111111111") - - targetNamespace := options.TargetNamespace - return repository.NewTemplate(repository.TemplateInput{ - RawArtifact: templateMapYaml, - ConfigVariablesClient: nil, - Processor: yamlprocessor.NewSimpleProcessor(), - TargetNamespace: targetNamespace, - SkipTemplateProcess: true, - }) -} - -var _ = Describe("ValidateManagementClusterVersionWithCLI", func() { - const ( - clusterName = "test-cluster" - v140 = "v1.4.0" - v141 = "v1.4.1" - v150 = "v1.5.0" - ) - var ( - regionalClient fakes.ClusterClient - tkgBomClient fakes.TKGConfigBomClient - regionManager fakes.RegionManager - c *TkgClient - err error - ) - JustBeforeEach(func() { - err = c.ValidateManagementClusterVersionWithCLI(®ionalClient) - }) - BeforeEach(func() { - regionManager = fakes.RegionManager{} - regionManager.GetCurrentContextReturns(region.RegionContext{ - ClusterName: clusterName, - Status: region.Success, - }, nil) - - regionalClient = fakes.ClusterClient{} - regionalClient.ListResourcesStub = func(i interface{}, lo ...client.ListOption) error { - list := i.(*v1alpha3.ClusterList) - *list = v1alpha3.ClusterList{ - Items: []v1alpha3.Cluster{ - { - ObjectMeta: v1.ObjectMeta{ - Name: clusterName, - Namespace: "default", - }, - }, - }, - } - return nil - } - - c, err = New(Options{ - TKGConfigUpdater: &fakes.TKGConfigUpdaterClient{}, - TKGBomClient: &tkgBomClient, - RegionManager: ®ionManager, - }) - }) - Context("v1.4.0 management cluster", func() { - BeforeEach(func() { - regionalClient.GetManagementClusterTKGVersionReturns(v140, nil) - }) - - When("management cluster version matches cli version", func() { - BeforeEach(func() { - tkgBomClient = fakes.TKGConfigBomClient{} - tkgBomClient.GetDefaultTKGReleaseVersionReturns(v140, nil) - }) - It("should validate without error", func() { - Expect(err).To(BeNil()) - }) - }) - - When("cli version is a patch version ahead of management cluster", func() { - BeforeEach(func() { - tkgBomClient = fakes.TKGConfigBomClient{} - tkgBomClient.GetDefaultTKGReleaseVersionReturns(v141, nil) - }) - It("should validate without error", func() { - Expect(err).To(BeNil()) - }) - }) - - When("cli version is a minor version ahead of management cluster", func() { - BeforeEach(func() { - tkgBomClient = fakes.TKGConfigBomClient{} - tkgBomClient.GetDefaultTKGReleaseVersionReturns(v150, nil) - }) - It("should return an error", func() { - Expect(err).Should(MatchError("version mismatch between management cluster and cli version. Please upgrade your management cluster to the latest to continue")) - }) - }) - }) - -}) - -var _ = Describe("CreateCluster", func() { - const ( - clusterName = "regional-cluster-2" - ) - var ( - tkgClient *TkgClient - clusterClientFactory *fakes.ClusterClientFactory - clusterClient *fakes.ClusterClient - featureFlagClient *fakes.FeatureFlagClient - tkgBomClient *fakes.TKGConfigBomClient - tkgConfigUpdaterClient *fakes.TKGConfigUpdaterClient - tkgConfigReaderWriter *fakes.TKGConfigReaderWriter - tkgConfigReaderWriterClient *fakes.TKGConfigReaderWriterClient - vcClientFactory *fakes.VcClientFactory - vcClient *fakes.VCClient - options CreateClusterOptions - clusterCtlClient *MockClusterctlClient - ) - - BeforeEach(func() { - clusterClientFactory = &fakes.ClusterClientFactory{} - clusterClient = &fakes.ClusterClient{} - clusterClientFactory.NewClientReturns(clusterClient, nil) - featureFlagClient = &fakes.FeatureFlagClient{} - tkgBomClient = &fakes.TKGConfigBomClient{} - tkgConfigUpdaterClient = &fakes.TKGConfigUpdaterClient{} - tkgConfigReaderWriterClient = &fakes.TKGConfigReaderWriterClient{} - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - vcClientFactory = &fakes.VcClientFactory{} - vcClient = &fakes.VCClient{} - clusterCtlClient = &MockClusterctlClient{} - - tkgConfigReaderWriterClient.TKGConfigReaderWriterReturns(tkgConfigReaderWriter) - vcClientFactory.NewClientReturns(vcClient, nil) - - tkgClient, err = CreateTKGClientOptsMutator(configFile2, testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Second, func(o Options) Options { - o.ClusterClientFactory = clusterClientFactory - o.FeatureFlagClient = featureFlagClient - o.TKGBomClient = tkgBomClient - o.TKGConfigUpdater = tkgConfigUpdaterClient - o.ReaderWriterConfigClient = tkgConfigReaderWriterClient - o.VcClientFactory = vcClientFactory - o.ClusterCtlClient = clusterCtlClient - return o - }) - Expect(err).NotTo(HaveOccurred()) - - tkgBomConfigData := ` -ova: [] -` - tkgBomConfig := &tkgconfigbom.BOMConfiguration{} - err = yaml.Unmarshal([]byte(tkgBomConfigData), tkgBomConfig) - Expect(err).NotTo(HaveOccurred()) - tkgBomClient.GetBOMConfigurationFromTkrVersionReturns(tkgBomConfig, nil) - tkgBomClient.GetDefaultTkgBOMConfigurationReturns(&tkgconfigbom.BOMConfiguration{ - Release: &tkgconfigbom.ReleaseInfo{Version: "v1.23"}, - }, nil) - - clusterClient.GetManagementClusterTKGVersionReturns("v1.2.1-rc.1", nil) - clusterClient.GetRegionalClusterDefaultProviderNameReturns(VSphereProviderName, nil) - tkgBomClient.GetDefaultTKGReleaseVersionReturns("v1.2.1-rc.1", nil) - tkgBomClient.GetDefaultTkrBOMConfigurationReturns(&tkgconfigbom.BOMConfiguration{ - Release: &tkgconfigbom.ReleaseInfo{Version: "v1.3"}, - Components: map[string][]*tkgconfigbom.ComponentInfo{ - "kubernetes": {{Version: "v1.18.0+vmware.2"}}, - }, - }, nil) - clusterClient.ListResourcesCalls(func(clusterList interface{}, options ...client.ListOption) error { - if clusterList, ok := clusterList.(*v1alpha3.ClusterList); ok { - clusterList.Items = []v1alpha3.Cluster{ - { - ObjectMeta: v1.ObjectMeta{ - Name: clusterName, - Namespace: constants.DefaultNamespace, - }, - }, - } - return nil - } - return nil - }) - clusterClient.IsPacificRegionalClusterReturns(false, nil) - - tkgConfigReaderWriter.GetCalls(func(key string) (string, error) { - configMap := populateConfigMap() - if val, ok := configMap[key]; ok { - return val, nil - } - return "192.168.2.1/16", nil - }) - }) - - Context("ValidateConfigForSingleNodeCluster", func() { - When("Feature gate is enabled", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedStub = func(featureFlagName string) (bool, error) { - if featureFlagName == constants.FeatureFlagSingleNodeClusters { - return true, nil - } - return true, nil - } - }) - - It("Should fail reading the cluster yaml", func() { - options = createClusterOptions(clusterName, "../fakes/config/invalid_config.yaml") - _, err := tkgClient.CreateCluster(&options, false) - Expect(err.Error()).To(ContainSubstring("unable to read cluster yaml")) - }) - - It("Should fail if cluster is single node and controlPlaneTaint exists", func() { - options = createClusterOptions(clusterName, "../fakes/config/cluster_vsphere_snc_cp_taint_true.yaml") - _, err := tkgClient.CreateCluster(&options, false) - - Expect(err).To(MatchError(fmt.Sprintf("unable to create single node cluster %s as control plane node has taint", clusterName))) - Expect(clusterClient.ApplyCallCount()).To(BeZero()) - }) - - It("Should fail validation if control plane taint is invalid", func() { - options = createClusterOptions(clusterName, "../fakes/config/cluster_vsphere_snc_invalid_cp_taint.yaml") - _, err := tkgClient.CreateCluster(&options, false) - - Expect(err).To(MatchError("failed to get CC variable controlPlaneTaint: unmarshalling from JSON into value: json: cannot unmarshal string into Go value of type bool")) - Expect(clusterClient.ApplyCallCount()).To(BeZero()) - }) - - It("Should fail if cluster is single node with workers nil and controlPlaneTaint are set", func() { - options = createClusterOptions(clusterName, "../fakes/config/cluster_vsphere_snc_omit_workers.yaml") - _, err := tkgClient.CreateCluster(&options, false) - Expect(err).To(MatchError(fmt.Sprintf("unable to create single node cluster %s as control plane node has taint", clusterName))) - Expect(clusterClient.ApplyCallCount()).To(BeZero()) - }) - - It("Should successfully create a single node cluster", func() { - options = createClusterOptions(clusterName, "../fakes/config/cluster_vsphere_snc.yaml") - _, err := tkgClient.CreateCluster(&options, false) - Expect(err).ToNot(HaveOccurred()) - Expect(clusterClient.ApplyCallCount()).To(Equal(1)) - }) - - It("Should successfully create a multi node cluster", func() { - options = createClusterOptions(clusterName, "../fakes/config/cluster_vsphere.yaml") - _, err := tkgClient.CreateCluster(&options, false) - Expect(err).ToNot(HaveOccurred()) - Expect(clusterClient.ApplyCallCount()).To(Equal(1)) - }) - }) - When("Feature gate is disabled", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedStub = func(featureFlagName string) (bool, error) { - if featureFlagName == constants.FeatureFlagSingleNodeClusters { - return false, nil - } - return true, nil - } - }) - It("Should fail if cluster is single node", func() { - options = createClusterOptions(clusterName, "../fakes/config/cluster_vsphere_snc.yaml") - _, err := tkgClient.CreateCluster(&options, false) - - Expect(err).To(MatchError("Worker count cannot be 0, minimum worker count required is 1")) - Expect(clusterClient.ApplyCallCount()).To(BeZero()) - }) - It("Should successfully create a multi node cluster", func() { - options = createClusterOptions(clusterName, "../fakes/config/cluster_vsphere.yaml") - _, err := tkgClient.CreateCluster(&options, false) - Expect(err).ToNot(HaveOccurred()) - Expect(clusterClient.ApplyCallCount()).To(Equal(1)) - }) - - }) - }) - - Context("ValidateFeatureFlagAllowLegacyClusterWhenCreateCluster", func() { - When("Feature gate is enabled", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedStub = func(featureFlagName string) (bool, error) { - if featureFlagName == constants.FeatureFlagForceDeployClusterWithClusterClass { - return false, nil - } - return true, nil - } - tkgConfigUpdaterClient.GetProvidersChecksumStub = func() (string, error) { - return "FakeFileShaIsSame", nil - } - tkgConfigUpdaterClient.GetPopulatedProvidersChecksumFromFileStub = func() (string, error) { - return "FakeFileShaIsSame", nil - } - tkgConfigReaderWriter.GetCalls(func(key string) (string, error) { - configMap := populateConfigMap() - if val, ok := configMap[key]; ok { - return val, nil - } - if key == constants.ConfigVariableAllowLegacyCluster { - return "true", nil - } - return "192.168.2.1/16", nil - }) - }) - - It("Should go to create a legacy based workload cluster directly", func() { - options = createClusterOptions(clusterName, "../fakes/config/config.yaml") - options.IsInputFileClusterClassBased = false - Expect(err).ToNot(HaveOccurred()) - - result := captureOutput(*tkgClient, options, false) - Expect(result).To(ContainSubstring(constants.YTTBasedClusterWarning)) - Expect(result).To(ContainSubstring("creating workload cluster")) - }) - - }) - - When("Feature gate is disabled", func() { - BeforeEach(func() { - tkgConfigUpdaterClient.GetProvidersChecksumStub = func() (string, error) { - return "FakeFileShaIsSame", nil - } - tkgConfigUpdaterClient.GetPopulatedProvidersChecksumFromFileStub = func() (string, error) { - return "FakeFileShaIsSame", nil - } - tkgConfigReaderWriter.GetCalls(func(key string) (string, error) { - configMap := populateConfigMap() - if val, ok := configMap[key]; ok { - return val, nil - } - if key == constants.ConfigVariableAllowLegacyCluster { - return "false", nil - } - return "192.168.2.1/16", nil - }) - }) - - It("Should go to create a classy based workload cluster directly", func() { - featureFlagClient.IsConfigFeatureActivatedStub = func(featureFlagName string) (bool, error) { - if featureFlagName == constants.FeatureFlagAllowLegacyCluster { - return false, nil - } - return true, nil - } - options = createClusterOptions(clusterName, "../fakes/config/config.yaml") - options.IsInputFileClusterClassBased = false - Expect(err).ToNot(HaveOccurred()) - - result := captureOutput(*tkgClient, options, false) - Expect(result).To(ContainSubstring("Legacy configuration file detected. The inputs from said file have been converted into the new Cluster configuration")) - Expect(result).To(ContainSubstring(fmt.Sprintf("Using this new Cluster configuration '%v", testingDir))) - Expect(result).To(ContainSubstring("creating workload cluster")) - }) - - It("Should return create a classy based workload cluster command", func() { - featureFlagClient.IsConfigFeatureActivatedStub = func(featureFlagName string) (bool, error) { - if featureFlagName == constants.FeatureFlagAllowLegacyCluster || featureFlagName == constants.FeatureFlagAutoApplyGeneratedClusterClassBasedConfiguration { - return false, nil - } - return true, nil - } - options = createClusterOptions(clusterName, "../fakes/config/config.yaml") - options.IsInputFileClusterClassBased = false - Expect(err).ToNot(HaveOccurred()) - - result := captureOutput(*tkgClient, options, false) - Expect(result).To(ContainSubstring("Legacy configuration file detected. The inputs from said file have been converted into the new Cluster configuration")) - Expect(result).To(ContainSubstring("To create a cluster with it, please use the following command together with all customized flags set in the last step. e.g. --tkr, -v")) - }) - - }) - - When("ALLOW_LEGACY_CLUSTER is failed to set", func() { - BeforeEach(func() { - tkgConfigReaderWriter.GetCalls(func(key string) (string, error) { - configMap := populateConfigMap() - if val, ok := configMap[key]; ok { - return val, nil - } - if key == constants.ConfigVariableAllowLegacyCluster { - return "false", errors.Errorf("fake error") - } - return "192.168.2.1/16", nil - }) - - featureFlagClient.IsConfigFeatureActivatedStub = func(featureFlagName string) (bool, error) { - if featureFlagName == constants.FeatureFlagAllowLegacyCluster { - return false, nil - } - return true, nil - } - - tkgConfigUpdaterClient.GetProvidersChecksumStub = func() (string, error) { - return "FakeFileShaIsSame", nil - } - tkgConfigUpdaterClient.GetPopulatedProvidersChecksumFromFileStub = func() (string, error) { - return "FakeFileShaIsSame", nil - } - }) - - It("Should return an error", func() { - options = createClusterOptions(clusterName, "../fakes/config/config.yaml") - options.IsInputFileClusterClassBased = false - Expect(err).ToNot(HaveOccurred()) - result := captureOutput(*tkgClient, options, false) - Expect(result).To(ContainSubstring("failed getting variable ALLOW_LEGACY_CLUSTER")) - }) - }) - }) - -}) - -// captureOutput will capture logs and warnings -func captureOutput(tkgClient TkgClient, options CreateClusterOptions, isManagementCluster bool) string { - r, w, err := os.Pipe() - if err != nil { - panic(err) - } - - // stdout := os.Stdout - // os.Stdout = w - // defer func() { - // os.Stdout = stdout - // }() - - stderr := os.Stderr - os.Stderr = w - defer func() { - os.Stderr = stderr - }() - - _, _ = tkgClient.CreateCluster(&options, isManagementCluster) - w.Close() - var buf bytes.Buffer - io.Copy(&buf, r) - - return buf.String() -} - -func populateConfigMap() map[string]string { - configMap := make(map[string]string, 0) - configMap[constants.ConfigVariableCNI] = "antrea" - configMap[constants.ConfigVariableControlPlaneNodeNameservers] = "8.8.8.8" - configMap[constants.ConfigVariableWorkerNodeNameservers] = "8.8.8.8" - configMap[VsphereNodeCPUVarName[0]] = "2" - configMap[VsphereNodeCPUVarName[1]] = "2" - configMap[VsphereNodeMemVarName[0]] = "4098" - configMap[VsphereNodeMemVarName[1]] = "4098" - configMap[VsphereNodeDiskVarName[0]] = "20" - configMap[VsphereNodeDiskVarName[1]] = "20" - configMap[constants.ConfigVariableVsphereServer] = "10.0.0.1" - configMap[constants.ConfigVariableWorkerMachineCount0] = "0" - configMap[constants.ConfigVariableWorkerMachineCount1] = "0" - configMap[constants.ConfigVariableWorkerMachineCount2] = "0" - configMap[constants.ConfigVariableEtcdExtraArgs] = "" - configMap[constants.ConfigVariableAPIServerExtraArgs] = "" - configMap[constants.ConfigVariableKubeSchedulerExtraArgs] = "" - configMap[constants.ConfigVariableKubeControllerManagerExtraArgs] = "" - configMap[constants.ConfigVariableControlPlaneKubeletExtraArgs] = "" - configMap[constants.ConfigVariableWorkerKubeletExtraArgs] = "" - return configMap -} - -func createClusterOptions(clusterName, configFile string) CreateClusterOptions { - options := CreateClusterOptions{ - ClusterConfigOptions: ClusterConfigOptions{ - KubernetesVersion: "v1.18.0+vmware.2", - ClusterName: clusterName, - TargetNamespace: constants.DefaultNamespace, - ProviderRepositorySource: &clusterctl.ProviderRepositorySourceOptions{ - InfrastructureProvider: VSphereProviderName, - Flavor: "dev", - }, - WorkerMachineCount: pointer.Int64Ptr(0), - }, - IsInputFileClusterClassBased: true, - ClusterConfigFile: configFile, - } - options.Edition = "some edition" - return options -} diff --git a/tkg/client/common.go b/tkg/client/common.go deleted file mode 100644 index 592ed3f20d..0000000000 --- a/tkg/client/common.go +++ /dev/null @@ -1,382 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "bytes" - "encoding/json" - "fmt" - "os" - "os/exec" - "strconv" - "strings" - "time" - - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/apimachinery/pkg/util/version" - apimachineryversion "k8s.io/apimachinery/pkg/version" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" -) - -var vsphereVersionMinimumRequirement = []int{6, 7, 0} - -// vSphere 6.7u3 GA build number -var vsphereBuildMinimumRequirement = 14367737 - -type kubectlVersion struct { //nolint - ClientVersion *apimachineryversion.Info `json:"clientVersion,omitempty"` - ServerVersion *apimachineryversion.Info `json:"serverVersion,omitempty"` -} - -type ClusterClassSelector interface { - Select(config tkgconfigreaderwriter.TKGConfigReaderWriter) string -} - -type GivenClusterClassSelector struct{} -type ProviderBasedClusterClassSelector struct{} - -func (GivenClusterClassSelector) Select(rw tkgconfigreaderwriter.TKGConfigReaderWriter) string { - ret, _ := rw.Get(constants.ConfigVariableClusterClass) - - return ret -} - -func (ProviderBasedClusterClassSelector) Select(rw tkgconfigreaderwriter.TKGConfigReaderWriter) string { - if provider, err := rw.Get(constants.ConfigVariableProviderType); err == nil && provider != "" { - // TODO: The ClusterClass version should be retrieved from TKR bom metadata, see https://jira.eng.vmware.com/browse/TKG-13296. - // For Glasgow.X, hardcode it to v1.0.0. From Halifax, all infra providers will start from version v1.0.1 and have their own releases. - return fmt.Sprintf("tkg-%s-default-%s", provider, constants.DefaultClusterClassVersion) - } - - return "" -} - -// ParseProviderName defines a utility function that parses the abbreviated syntax for name[:version] -func ParseProviderName(provider string) (name, providerVersion string, err error) { - t := strings.Split(strings.ToLower(provider), ":") - if len(t) > 2 { - return "", "", errors.Errorf("invalid provider name %q. Provider name should be in the form name[:version]", provider) - } - - if t[0] == "" { - return "", "", errors.Errorf("invalid provider name %q. Provider name should be in the form name[:version] and name cannot be empty", provider) - } - - name = t[0] - if err := validateDNS1123Label(name); err != nil { - return "", "", errors.Wrapf(err, "invalid provider name %q. Provider name should be in the form name[:version] and the name should be valid", provider) - } - - providerVersion = "" - if len(t) > 1 { - if t[1] == "" { - return "", "", errors.Errorf("invalid provider name %q. Provider name should be in the form name[:version] and version cannot be empty", provider) - } - providerVersion = t[1] - } - - return name, providerVersion, nil -} - -func validateDNS1123Label(label string) error { - errs := validation.IsDNS1123Label(label) - if len(errs) != 0 { - return errors.New(strings.Join(errs, "; ")) - } - return nil -} - -func checkDockerDaemonIsRunning() (bool, error) { - path, err := exec.LookPath("docker") - if err != nil { - return false, errors.Wrap(err, "failed to check if docker is installed") - } - // docker is not installed - if path == "" { - return false, nil - } - cmd := exec.Command("docker", "info") - if err = cmd.Run(); err != nil { - // cmd exited with exit code !=0 - if _, ok := err.(*exec.ExitError); ok { - return false, nil - } - return false, err - } - return true, nil -} - -func checkDockerResource(resource string) (int, error) { - var resourceValue int - var stdout []byte - - path, err := exec.LookPath("docker") - if err != nil { - return 0, errors.Wrap(err, "failed to check if docker is installed") - } - // docker is not installed - if path == "" { - return 0, nil - } - - cmd := exec.Command("docker", "system", "info", "--format", "'{{."+resource+"}}'") // nolint:gosec - if stdout, err = cmd.Output(); err != nil { - return 0, errors.Wrap(err, "failed to get docker resource value") - } - - resourceValue, err = strconv.Atoi(strings.Trim(strings.TrimSuffix(string(stdout), "\n"), "'")) - - if err != nil { - return 0, errors.Wrap(err, "failed to convert docker resource value to integer") - } - - return resourceValue, nil -} - -func checkKubectlInstalled() (bool, error) { //nolint - path, err := exec.LookPath("kubectl") - if err != nil { - return false, err - } - - if path != "" { - return true, nil - } - - return false, nil -} - -func getKubectlVersion() (string, error) { //nolint - var stdout bytes.Buffer - var kv kubectlVersion - var kubectlClientVersion string - - cmd := exec.Command("kubectl", "version", "--client", "-o", "json") - cmd.Stdout = &stdout - - if err := cmd.Run(); err != nil { - return "", errors.Wrap(err, "failed to get kubectl version") - } - - if err := json.Unmarshal(stdout.Bytes(), &kv); err != nil { - return "", errors.Wrap(err, "failed to unmarshal kubectl version") - } - - if kv.ClientVersion != nil { - kubectlClientVersion = kv.ClientVersion.String() - } - - return kubectlClientVersion, nil -} - -// ValidatePrerequisites validate docker and kubectl commands -func (c *TkgClient) ValidatePrerequisites(validateDocker, validateKubectl bool) error { - // Note: Kind cluster also support podman apart from docker, so if we decide - // to support podman in future we need to change this method. - if validateDocker { - if err := c.validateDockerPrerequisites(); err != nil { - return errors.Wrap(err, "Docker prerequisites validation failed") - } - } - - return nil -} - -func (c *TkgClient) validateDockerPrerequisites() error { - var isDockerDaemonRunning bool - var err error - - if isDockerDaemonRunning, err = checkDockerDaemonIsRunning(); err != nil { - return errors.Wrap(err, "Unable to check DockerDaemon is running ") - } - if !isDockerDaemonRunning { - return errors.New("docker daemon is not running, Please make sure Docker daemon is up and running") - } - - return nil -} - -// ValidateDockerResourcePrerequisites validates docker number CPU and memory resource settings -func (c *TkgClient) ValidateDockerResourcePrerequisites() error { - const numberCPU string = "NCPU" - const totalMemory string = "MemTotal" - var dockerResourceCpus, dockerResourceTotalMemory int - var err error - - // validate docker allocated CPU and memory against recommended minimums - if dockerResourceCpus, err = checkDockerResource(numberCPU); err != nil { - return errors.Wrap(err, "Failed to check docker minimum number of CPUs") - } - - minimumDockerCPUs := 4 - if dockerResourceCpus < minimumDockerCPUs { - return errors.Errorf("Docker resources have %d CPUs allocated; less than minimum recommended number of %d CPUs", dockerResourceCpus, minimumDockerCPUs) - } - - if dockerResourceTotalMemory, err = checkDockerResource(totalMemory); err != nil { - return errors.Wrap(err, "Failed to check docker minimum total memory") - } - - dockerResourceTotalMemFormatted := dockerResourceTotalMemory / (1024 * 1000000) - - minimumDockerTotalMem := 6 - if dockerResourceTotalMemFormatted < minimumDockerTotalMem { - return errors.Errorf("Docker resources have %dGB Total Memory allocated; less than minimum recommended number of %dGB Total Memory", dockerResourceTotalMemFormatted, minimumDockerTotalMem) - } - - return nil -} - -func (c *TkgClient) validateKubectlPrerequisites() error { //nolint - var isKubectlInstalled bool - var kubectlClientVersion string - var kubectlClientSemVersion, k8sMinSemVersion, kubectlClientMinSemVersion *version.Version - var err error - - if isKubectlInstalled, err = checkKubectlInstalled(); err != nil || !isKubectlInstalled { - return errors.Wrap(err, "Unable to find kubectl") - } - - if kubectlClientVersion, err = getKubectlVersion(); err != nil { - return errors.Wrap(err, "Unable to get kubectl client version") - } - - if kubectlClientSemVersion, err = version.ParseSemantic(kubectlClientVersion); err != nil { - return errors.Wrap(err, "Failed to parse kubectl client version") - } - // use the management k8s version to determine the k8s version skew - defaultK8sVersion, err := c.tkgBomClient.GetDefaultK8sVersion() - if err != nil { - return errors.Wrap(err, "unable to get default kubernetes version") - } - - if k8sMinSemVersion, err = version.ParseSemantic(defaultK8sVersion); err != nil { - return errors.Wrap(err, "Failed to parse k8s minimum version") - } - - // kubectl client version skew is k8s minor version minus 1. - // e.g. If k8s version is 1.17, kubectl version can be >= 1.16 - kubectlClientMinSemVersion = kubectlClientSemVersion.WithMinor(k8sMinSemVersion.Minor() - 1).WithPatch(0) - - if !kubectlClientSemVersion.AtLeast(kubectlClientMinSemVersion) { - return errors.Errorf("kubectl client version %s is less than minimum supported kubectl client version %s", - kubectlClientVersion, kubectlClientMinSemVersion.String()) - } - - return nil -} - -// ConfigureTimeout updates/configures timeout already set in the tkgClient -func (c *TkgClient) ConfigureTimeout(timeout time.Duration) { - c.timeout = timeout -} - -// SetClusterClass sets the value of CLUSTER_CLASS based on an array of selectors. -// Uses the first non empty name provided by a selector. -func SetClusterClass(rw tkgconfigreaderwriter.TKGConfigReaderWriter) { - clusterClassSelectors := []ClusterClassSelector{ - GivenClusterClassSelector{}, - ProviderBasedClusterClassSelector{}, - } - - for _, selector := range clusterClassSelectors { - if name := selector.Select(rw); name != "" { - rw.Set(constants.ConfigVariableClusterClass, name) - break - } - } -} - -func (c *TkgClient) isCustomOverlayPresent() (bool, error) { - var providersChecksum, prePopulatedChecksumFromFile string - var err error - - if providersChecksum, err = c.tkgConfigUpdaterClient.GetProvidersChecksum(); err != nil { - return false, err - } - - if prePopulatedChecksumFromFile, err = c.tkgConfigUpdaterClient.GetPopulatedProvidersChecksumFromFile(); err != nil { - return false, err - } - - return providersChecksum == "" || providersChecksum != prePopulatedChecksumFromFile, nil -} - -// Sets the appropriate AllowLegacyCluster configuration unless it has been explicitly overridden -func (c *TkgClient) SetAllowLegacyClusterConfiguration() string { - var allowLegacyCluster string - value, err := c.allowLegacyCluster() - if err != nil { - // ALLOW_LEGACY_CLUSTER doesn't be explicitly set in cluster config file - if !c.IsFeatureActivated(constants.FeatureFlagAllowLegacyCluster) { - // FeatureFlagAllowLegacyCluster disabled causes a cluster class cluster is created - allowLegacyCluster = "false" - } else { - // FeatureFlagAllowLegacyCluster enabled causes a legacy cluster is created - allowLegacyCluster = "true" - } - log.V(6).Infof("Setting %v to %q", constants.ConfigVariableAllowLegacyCluster, allowLegacyCluster) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAllowLegacyCluster, allowLegacyCluster) - } else { - // ALLOW_LEGACY_CLUSTER is explicitly set in cluster config file - log.V(6).Infof("Info: %v configuration already set to %q", constants.ConfigVariableAllowLegacyCluster, value) - allowLegacyCluster = strconv.FormatBool(value) - } - - return allowLegacyCluster -} - -func (c *TkgClient) ShouldDeployClusterClassBasedCluster(isManagementCluster bool) (bool, error) { - var isCustomOverlayPresent bool - var allowLegacyClusterCreated string - var err error - - if isCustomOverlayPresent, err = c.isCustomOverlayPresent(); err != nil { - return false, err - } - - // If deploying management cluster and `package-based-cc` featureflag is enabled - // Always use ClusterClass based Cluster deployment - if isManagementCluster { - if isCustomOverlayPresent { - log.Warning("Warning: It seems like you have done some customizations to the template overlays. However, CLI might ignore those customizations when creating management-cluster.") - } - - if !c.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - return false, nil - } - return true, nil - } - - // Ignore the checksum check if config variable 'SUPPRESS_PROVIDERS_UPDATE' is set. - isSuppressProvidersUpdateSet := os.Getenv(constants.SuppressProvidersUpdate) != "" - - allowLegacyClusterCreated = c.SetAllowLegacyClusterConfiguration() - if allowLegacyClusterCreated == "false" { - // Return error if user has customized template overlays - // but the feature gate FeatureFlagAllowLegacyCluster or ALLOW_LEGACY_CLUSTER parameter is disabled for workload cluster - if isCustomOverlayPresent && !isSuppressProvidersUpdateSet { - return false, errors.Errorf("It seems like you have done some customizations to the template overlays. However, the feature gate %v is %v. Please enabe it and try again", constants.FeatureFlagAllowLegacyCluster, allowLegacyClusterCreated) - } else { - // Deploy clusterclass based workload cluster when template overlays don't be customized - // and feature gate FeatureFlagAllowLegacyCluster or ALLOW_LEGACY_CLUSTER parameter is disabled - return true, nil - } - } else { - // Remind users the legacy mode will be deprecated in the feature, - // although we can create legacy based cluster, now. - log.Warning(constants.YTTBasedClusterWarning) - } - - if c.IsFeatureActivated(constants.FeatureFlagForceDeployClusterWithClusterClass) { - return true, nil - } else { - return false, nil - } - -} diff --git a/tkg/client/common_test.go b/tkg/client/common_test.go deleted file mode 100644 index 4fe46a9cac..0000000000 --- a/tkg/client/common_test.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package client_test - -import ( - "fmt" - "os" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" -) - -var _ = Describe("SetClusterClass", func() { - var ( - config *fakes.TKGConfigReaderWriter - ) - - BeforeEach(func() { - config = &fakes.TKGConfigReaderWriter{} - }) - - JustBeforeEach(func() { - client.SetClusterClass(config) - }) - - Context("User provides a cluster class name", func() { - BeforeEach(func() { - config.GetReturns("my-cluster-class", nil) - }) - It("should apply the user provided cluster class name", func() { - Expect(config.GetCallCount()).To(Equal(1)) - Expect(config.SetCallCount()).To(Equal(1)) - varName, varValue := config.SetArgsForCall(0) - Expect(varName).To(Equal("CLUSTER_CLASS")) - Expect(varValue).To(Equal("my-cluster-class")) - }) - }) - - Context("Determine cluster class name by provider", func() { - BeforeEach(func() { - config.GetReturnsOnCall(0, "", nil) - config.GetReturnsOnCall(1, "vsphere", nil) - }) - It("should set the name based on the provider", func() { - Expect(config.GetCallCount()).To(Equal(2)) - Expect(config.SetCallCount()).To(Equal(1)) - varName, varValue := config.SetArgsForCall(0) - Expect(varName).To(Equal("CLUSTER_CLASS")) - // TODO: fix below with TKG-13296. - Expect(varValue).To(Equal(fmt.Sprintf("tkg-vsphere-default-%s", constants.DefaultClusterClassVersion))) - }) - }) -}) - -type MockFeatureFlag struct { - FeatureFlags map[string]bool -} - -func (m *MockFeatureFlag) IsConfigFeatureActivated(featurePath string) (bool, error) { - if val, ok := m.FeatureFlags[featurePath]; ok { - return val, nil - } - return false, errors.Errorf("missing key %s\n", featurePath) -} - -var _ = Describe("ensureAllowLegacyClusterConfiguration", func() { - var ( - err error - tkgClient *client.TkgClient - featureFlagClient *MockFeatureFlag - value string - testingDir string - values []string - ) - - BeforeEach(func() { - testingDir = helper.CreateTempTestingDirectory() - featureFlagClient = &MockFeatureFlag{map[string]bool{}} - tkgClient, err = client.CreateTKGClientOptsMutator("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Second, func(o client.Options) client.Options { - o.FeatureFlagClient = featureFlagClient - return o - }) - Expect(err).NotTo(HaveOccurred()) - }) - - AfterEach((func() { - helper.DeleteTempTestingDirectory(testingDir) - })) - - Context("when ALLOW_LEGACY_CLUSTER is not previously set", func() { - It("ALLOW_LEGACY_CLUSTER should keep consistent with FeatureFlagAllowLegacyCluster (false)", func() { - featureFlagClient.FeatureFlags[constants.FeatureFlagAllowLegacyCluster] = false - _ = tkgClient.SetAllowLegacyClusterConfiguration() - value, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAllowLegacyCluster) - Expect(err).NotTo(HaveOccurred()) - Expect(value).To(Equal("false")) - }) - - It("ALLOW_LEGACY_CLUSTER should keep consistent with FeatureFlagAllowLegacyCluster (true)", func() { - featureFlagClient.FeatureFlags[constants.FeatureFlagAllowLegacyCluster] = true - _ = tkgClient.SetAllowLegacyClusterConfiguration() - value, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAllowLegacyCluster) - Expect(err).NotTo(HaveOccurred()) - Expect(value).To(Equal("true")) - }) - }) - - Context("when ALLOW_LEGACY_CLUSTER is explicitly overridden with a valid value", func() { - values = []string{"true", "false"} - It("Retain the value", func() { - for _, v := range values { - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableAllowLegacyCluster, v) - _ = tkgClient.SetAllowLegacyClusterConfiguration() - value, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAllowLegacyCluster) - Expect(err).NotTo(HaveOccurred()) - Expect(value).To(Equal(v)) - } - }) - }) - - Context("when ALLOW_LEGACY_CLUSTER is explicitly overridden with an invalid value", func() { - It("Should return true value", func() { - featureFlagClient.FeatureFlags[constants.FeatureFlagAllowLegacyCluster] = true - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableAllowLegacyCluster, "invalid value") - _ = tkgClient.SetAllowLegacyClusterConfiguration() - value, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAllowLegacyCluster) - Expect(err).ToNot(HaveOccurred()) - Expect(value).To(Equal("true")) - }) - - It("Should return false value", func() { - featureFlagClient.FeatureFlags[constants.FeatureFlagAllowLegacyCluster] = false - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableAllowLegacyCluster, "invalid value") - _ = tkgClient.SetAllowLegacyClusterConfiguration() - value, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAllowLegacyCluster) - Expect(err).ToNot(HaveOccurred()) - Expect(value).To(Equal("false")) - }) - }) - -}) - -var _ = Describe("shouldDeployClusterClass", func() { - var ( - err error - tkgClient *client.TkgClient - featureFlagClient *MockFeatureFlag - tkgConfigUpdaterClient *fakes.TKGConfigUpdaterClient - testingDir string - isManagementCluster bool - ) - - BeforeEach(func() { - testingDir = helper.CreateTempTestingDirectory() - featureFlagClient = &MockFeatureFlag{map[string]bool{}} - tkgConfigUpdaterClient = &fakes.TKGConfigUpdaterClient{} - tkgClient, err = client.CreateTKGClientOptsMutator("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Second, func(o client.Options) client.Options { - o.FeatureFlagClient = featureFlagClient - o.TKGConfigUpdater = tkgConfigUpdaterClient - return o - }) - Expect(err).NotTo(HaveOccurred()) - }) - - AfterEach((func() { - helper.DeleteTempTestingDirectory(testingDir) - })) - - Context("When cluster is mgmt cluster", func() { - BeforeEach(func() { - isManagementCluster = true - tkgConfigUpdaterClient.GetProvidersChecksumStub = func() (string, error) { - return "fakeFileSumIsSame", nil - } - tkgConfigUpdaterClient.GetPopulatedProvidersChecksumFromFileStub = func() (string, error) { - return "fakeFileSumIsDifferent", nil - } - }) - - It("Should deploy classy based cluster with FeatureFlagPackageBasedCC is enabled", func() { - featureFlagClient.FeatureFlags[constants.FeatureFlagPackageBasedCC] = true - result, err := tkgClient.ShouldDeployClusterClassBasedCluster(isManagementCluster) - Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(true)) - }) - - It("Should return false with FeatureFlagPackageBasedCC is disabled", func() { - featureFlagClient.FeatureFlags[constants.FeatureFlagPackageBasedCC] = false - result, err := tkgClient.ShouldDeployClusterClassBasedCluster(isManagementCluster) - Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(false)) - }) - - It("Should return false when checkOverlay fails", func() { - tkgConfigUpdaterClient.GetProvidersChecksumStub = func() (string, error) { - return "fakeFileSumIsSame", errors.Errorf("fake error") - } - result, err := tkgClient.ShouldDeployClusterClassBasedCluster(isManagementCluster) - Expect(err.Error()).To(Equal("fake error")) - Expect(result).To(Equal(false)) - }) - }) - - Context("When cluster is workload cluster", func() { - BeforeEach(func() { - isManagementCluster = false - tkgConfigUpdaterClient.GetProvidersChecksumStub = func() (string, error) { - return "fakeFileSumIsSame", nil - } - tkgConfigUpdaterClient.GetPopulatedProvidersChecksumFromFileStub = func() (string, error) { - return "fakeFileSumIsDifferent", nil - } - }) - - It("Should return false and error with AllowLeagcyCluster is false when customization exists", func() { - result, err := tkgClient.ShouldDeployClusterClassBasedCluster(isManagementCluster) - Expect(err.Error()).To(ContainSubstring("It seems like you have done some customizations to the template overlays")) - Expect(result).To(Equal(false)) - }) - - It("Should return true with AllowLeagcyCluster is false when customization doesn't exist", func() { - tkgConfigUpdaterClient.GetPopulatedProvidersChecksumFromFileStub = func() (string, error) { - return "fakeFileSumIsSame", nil - } - result, err := tkgClient.ShouldDeployClusterClassBasedCluster(isManagementCluster) - Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(true)) - }) - - It("Should return true and with AllowLeagcyCluster and ForceDeployClassyCluster are true", func() { - featureFlagClient.FeatureFlags[constants.FeatureFlagAllowLegacyCluster] = true - featureFlagClient.FeatureFlags[constants.FeatureFlagForceDeployClusterWithClusterClass] = true - result, err := tkgClient.ShouldDeployClusterClassBasedCluster(isManagementCluster) - Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(true)) - }) - - It("Should return false and with AllowLeagcyCluster is true and ForceDeployClassyCluster is false", func() { - featureFlagClient.FeatureFlags[constants.FeatureFlagAllowLegacyCluster] = true - featureFlagClient.FeatureFlags[constants.FeatureFlagForceDeployClusterWithClusterClass] = false - result, err := tkgClient.ShouldDeployClusterClassBasedCluster(isManagementCluster) - Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(false)) - }) - - It("Should return true when AllowLeagcyCluster is false and SUPPRESS_PROVIDERS_UPDATE is set", func() { - os.Setenv("SUPPRESS_PROVIDERS_UPDATE", "1") - featureFlagClient.FeatureFlags[constants.FeatureFlagAllowLegacyCluster] = false - result, err := tkgClient.ShouldDeployClusterClassBasedCluster(isManagementCluster) - Expect(err).ToNot(HaveOccurred()) - Expect(result).To(Equal(true)) - os.Unsetenv("SUPPRESS_PROVIDERS_UPDATE") - }) - }) -}) diff --git a/tkg/client/config.go b/tkg/client/config.go deleted file mode 100644 index ad998f9b48..0000000000 --- a/tkg/client/config.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "time" - - "github.com/pkg/errors" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - clusterctlclient "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// GetClusterConfiguration gets cluster configuration -func (c *TkgClient) GetClusterConfiguration(options *CreateClusterOptions) ([]byte, error) { // nolint:gocyclo - // check if user provided both infra provider name and version, so that user doesn't have to - // have a management cluster created before he generates work load cluster config, else follow the usual path - if options.ProviderRepositorySource.InfrastructureProvider != "" { - provider, version, err := ParseProviderName(options.ProviderRepositorySource.InfrastructureProvider) - if err != nil { - return nil, errors.Wrap(err, "failed to parse the provider name") - } - - // clusterctl doesn't connect to Management cluster if user provides BOTH infrastructure provider name and version - // given that tkg stores the providers templates locally, - // Note: If namespace is not provided in options, it defaults to constants.DefaultNamespace namespace - if provider != "" && version != "" { - if provider == PacificProviderName { - if options.NodeSizeOptions.Size != "" || options.NodeSizeOptions.ControlPlaneSize != "" || options.NodeSizeOptions.WorkerSize != "" { - return nil, errors.New("creating Tanzu Kubernetes Cluster is not compatible with the node size options: --size, --controlplane-size, and --worker-size") - } - return c.getPacificClusterConfiguration(options) - } - - // Skip the validation when infrastructure name and version is passed - // As '-i' is hidden option, while creating workload cluster template - // this option is passed for quick verification and testing purpose only - if err := c.configureAndValidateConfiguration(options, nil, true); err != nil { - return nil, err - } - return c.getClusterConfiguration(&options.ClusterConfigOptions, false, provider) - } - } - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return nil, errors.Wrap(err, "cannot get current management cluster context") - } - - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get cluster client while getting cluster config") - } - - isPacific, err := regionalClusterClient.IsPacificRegionalCluster() - if err != nil { - return nil, errors.Wrap(err, "error determining Tanzu Kubernetes Cluster service for vSphere management cluster ") - } - if isPacific { - if options.NodeSizeOptions.Size != "" || options.NodeSizeOptions.ControlPlaneSize != "" || options.NodeSizeOptions.WorkerSize != "" { - return nil, errors.New("creating Tanzu Kubernetes Cluster is not compatible with the node size options: --size, --controlplane-size, and --worker-size") - } - return c.getPacificClusterConfiguration(options) - } - - options.Kubeconfig = clusterctlclient.Kubeconfig{Path: currentRegion.SourceFilePath, Context: currentRegion.ContextName} - - if err := c.configureAndValidateConfiguration(options, regionalClusterClient, options.SkipValidation); err != nil { - return nil, err - } - - infraProvider, err := regionalClusterClient.GetRegionalClusterDefaultProviderName(clusterctlv1.InfrastructureProviderType) - if err != nil { - return nil, errors.Wrap(err, "failed to get cluster provider information.") - } - infraProviderName, _, err := ParseProviderName(infraProvider) - if err != nil { - return nil, err - } - - return c.getClusterConfigurationBytes(&options.ClusterConfigOptions, infraProviderName, false) -} - -func (c *TkgClient) configureAndValidateConfiguration(options *CreateClusterOptions, regionalClusterClient clusterclient.Client, skipValidation bool) error { - var err error - if options.KubernetesVersion, options.TKRVersion, err = c.ConfigureAndValidateTkrVersion(options.TKRVersion); err != nil { - return err - } - - if err := c.ConfigureAndValidateWorkloadClusterConfiguration(options, regionalClusterClient, skipValidation); err != nil { - return errors.Wrap(err, "workload cluster configuration validation failed") - } - return nil -} - -func (c *TkgClient) getClusterConfiguration(options *ClusterConfigOptions, isManagementCluster bool, infraProvider string) ([]byte, error) { - // Set CLUSTER_PLAN to viper configuration - c.SetPlan(options.ProviderRepositorySource.Flavor) - - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableFeatureFlagPackageBasedCC, "true") - } - - infraProviderName, _, err := ParseProviderName(infraProvider) - if err != nil { - return nil, err - } - - // Sets cluster class value. - SetClusterClass(c.TKGConfigReaderWriter()) - - // need to provide clusterctl the worker count for md0 and not the full worker-machine-count value. - workerCounts, err := c.DistributeMachineDeploymentWorkers(*options.WorkerMachineCount, options.ProviderRepositorySource.Flavor == constants.PlanProd, isManagementCluster, infraProviderName) - if err != nil { - return nil, errors.Wrap(err, "failed to distribute machine deployments") - } - c.SetMachineDeploymentWorkerCounts(workerCounts, *options.WorkerMachineCount, options.ProviderRepositorySource.Flavor == constants.PlanProd) - md0WorkerCount := int64(workerCounts[0]) - options.WorkerMachineCount = &md0WorkerCount - - template, err := c.clusterctlClient.GetClusterTemplate(clusterctlclient.GetClusterTemplateOptions(*options)) - if err != nil { - return nil, errors.Wrap(err, "unable to get template") - } - return template.Yaml() -} - -// SetPlan saves the plan name -func (c *TkgClient) SetPlan(planName string) { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterPlan, planName) -} - -// SetProviderType saves the provider type -func (c *TkgClient) SetProviderType(providerType string) { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableProviderType, providerType) -} - -// SetVsphereVersion saves the vsphere version -func (c *TkgClient) SetVsphereVersion(vsphereVersion string) { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereVersion, vsphereVersion) -} - -// SetBuildEdition saves the build edition -func (c *TkgClient) SetBuildEdition(buildEdition string) { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableBuildEdition, buildEdition) -} - -// SetTKGVersion saves the tkg version based on Default BoM file -func (c *TkgClient) SetTKGVersion() { - bomConfig, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - log.Info("unable to get default BoM file...") - return - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableTKGVersion, bomConfig.Release.Version) -} - -// SetPinnipedConfigForWorkloadCluster sets the pinniped configuration(concierge) for workload cluster -func (c *TkgClient) SetPinnipedConfigForWorkloadCluster(issuerURL, issuerCA string) { - c.TKGConfigReaderWriter().Set(constants.ConfigVariablePinnipedSupervisorIssuerURL, issuerURL) - c.TKGConfigReaderWriter().Set(constants.ConfigVariablePinnipedSupervisorIssuerCABundleData, issuerCA) -} diff --git a/tkg/client/config_permission.go b/tkg/client/config_permission.go deleted file mode 100644 index a2696be9ba..0000000000 --- a/tkg/client/config_permission.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "os" - "strings" - - "github.com/vmware-tanzu/tanzu-framework/tkg/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - - "github.com/pkg/errors" - - "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/cloudformation/bootstrap" - "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/credentials" -) - -const awsCredentialError = "failed to gather credentials for operation that requires client-side access to AWS account. Provide credentials for the relevant AWS account using either AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN environment variables, configuration variables (not for delete) or set up a profile using the AWS CLI https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html and use the AWS_PROFILE environment variable when running this command." - -// CreateAWSCloudFormationStack create aws cloud formation stack -func (c *TkgClient) CreateAWSCloudFormationStack() error { - log.SendProgressUpdate(statusRunning, StepConfigPrerequisite, InitRegionSteps) - log.Info("Creating AWS CloudFormation Stack") - template, err := c.generateAWSBootstrapTemplate() - - if err != nil { - return errors.Wrap(err, "failed to generate template") - } - - creds, err := c.GetAWSCreds() - if err != nil { - return errors.Wrap(err, "unable to retrieve AWS credentials") - } - - awsClient, err := aws.New(*creds) - if err != nil { - return errors.Wrap(err, "failed create AWS client") - } - - err = awsClient.CreateCloudFormationStackWithTemplate(template) - if err != nil { - return errors.Wrap(err, "failed to create aws CloudFormation stack") - } - return nil -} - -// GenerateAWSCloudFormationTemplate produces the CloudFormation template YAML -func (c *TkgClient) GenerateAWSCloudFormationTemplate() (string, error) { - template, err := c.generateAWSBootstrapTemplate() - if err != nil { - return "", err - } - cfnTemplate := template.RenderCloudFormation() - dat, err := cfnTemplate.YAML() - if err != nil { - return "", err - } - return string(dat), nil -} - -func (c *TkgClient) generateAWSBootstrapTemplate() (*bootstrap.Template, error) { - // Don't need a full client - awsClient, err := aws.New(credentials.AWSCredentials{}) - if err != nil { - return nil, errors.Wrap(err, "failed create AWS client") - } - - tmcDisablement := false - - tmcDisablementVar, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableDisableTMCCloudPermissions) - if err == nil && strings.EqualFold(tmcDisablementVar, "true") { - tmcDisablement = true - } - - template, err := awsClient.GenerateBootstrapTemplate(aws.GenerateBootstrapTemplateInput{ - DisableTanzuMissionControlPermissions: tmcDisablement, - }) - if err != nil { - return nil, err - } - return template, nil -} - -// GetAWSCreds get aws credentials -func (c *TkgClient) GetAWSCreds() (*credentials.AWSCredentials, error) { - region, err := c.getAWSRegion() - if err != nil { - return &credentials.AWSCredentials{}, err - } - - creds, err := c.getAWSCredFromConfig(region) - if err == nil { - return creds, nil - } - - if profile, err := c.readerwriterConfigClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSProfile); err == nil && profile != "" { - os.Setenv(constants.ConfigVariableAWSProfile, profile) - } - - // find AWS Credentials in default chain if they are not in tkgconfig or set as environment variables - creds, err = credentials.NewAWSCredentialFromDefaultChain(region) - if err != nil { - log.V(3).Error(err, "AWS SDK unable to resolve credential provider chain") - return nil, errors.New(awsCredentialError) - } - return creds, nil -} - -func (c *TkgClient) getAWSCredFromConfig(region string) (*credentials.AWSCredentials, error) { - var err error - - accessKeyID, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSAccessKeyID) - if err != nil || accessKeyID == "" { - return &credentials.AWSCredentials{}, errors.Wrapf(err, "failed to get %s", constants.ConfigVariableAWSAccessKeyID) - } - - secretAccessKey, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSSecretAccessKey) - if err != nil || secretAccessKey == "" { - return &credentials.AWSCredentials{}, errors.Wrapf(err, "failed to get %s", constants.ConfigVariableAWSSecretAccessKey) - } - sessionToken, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSSessionToken) - - return &credentials.AWSCredentials{Region: region, AccessKeyID: accessKeyID, SecretAccessKey: secretAccessKey, SessionToken: sessionToken}, nil -} - -func (c *TkgClient) getAWSRegion() (string, error) { - region, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSRegion) - if err != nil || region == "" { - return "", errors.New("cannot find AWS region. If using the CLI, set the AWS_REGION environment variable appropriately") - } - return region, nil -} diff --git a/tkg/client/config_permission_test.go b/tkg/client/config_permission_test.go deleted file mode 100644 index c66e1f8cad..0000000000 --- a/tkg/client/config_permission_test.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "fmt" - "os" - "path/filepath" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/credentials" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -var err error - -var _ = Describe("Unit tests for get AWS credentials", func() { - var ( - tkgConfigPath string - err error - creds *credentials.AWSCredentials - client *TkgClient - curHome string - curUserProfile string - ) - BeforeEach(func() { - createTempDirectory("template_test") - curHome = os.Getenv("HOME") - curUserProfile = os.Getenv("USERPROFILE") - _ = os.Setenv("HOME", testingDir) - _ = os.Setenv("USERPROFILE", testingDir) - }) - - JustBeforeEach(func() { - client, err = CreateTKGClient(tkgConfigPath, testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).ToNot(HaveOccurred()) - creds, err = client.GetAWSCreds() - }) - - Context("When AWS_REGION is not set in the environment variable nor tkgconfig", func() { - BeforeEach(func() { - tkgConfigPath = configFile - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cannot find AWS region")) - }) - }) - - Context("When credentials are set in tkgconfig", func() { - BeforeEach(func() { - tkgConfigPath = "../fakes/config/config4.yaml" - }) - It("should get the credentials without error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(creds.Region).To(Equal("us-east-2")) - Expect(creds.AccessKeyID).To(Equal("QWRETYUIOPLKJHGFDSAZ")) - Expect(creds.SecretAccessKey).To(Equal("uNncCatIvWu1e$rqwerkg35qU7dswfEa4rdXJk/E")) - }) - }) - - Context("When credentials are not set in tkgconfig and default aws cred chain", func() { - BeforeEach(func() { - tkgConfigPath = configFile - os.Setenv(constants.ConfigVariableAWSRegion, "us-east-2") - os.Unsetenv(constants.ConfigVariableAWSAccessKeyID) - os.Unsetenv(constants.ConfigVariableAWSSecretAccessKey) - os.Unsetenv(constants.ConfigVariableAWSSessionToken) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("failed to gather credentials")) - }) - }) - - Context("When credentials are not set in tkgconfig and but in default aws cred chain", func() { - BeforeEach(func() { - tkgConfigPath = configFile - os.Setenv(constants.ConfigVariableAWSRegion, "us-east-2") - os.Unsetenv(constants.ConfigVariableAWSAccessKeyID) - os.Unsetenv(constants.ConfigVariableAWSSecretAccessKey) - os.Unsetenv(constants.ConfigVariableAWSSessionToken) - err = os.Mkdir(filepath.Join(testingDir, ".aws"), os.ModePerm) - - Expect(err).ToNot(HaveOccurred()) - - input, err := os.ReadFile("../fakes/config/aws_credentials") - Expect(err).ToNot(HaveOccurred()) - dest := filepath.Join(testingDir, ".aws", "credentials") - err = os.WriteFile(dest, input, 0o644) - Expect(err).ToNot(HaveOccurred()) - }) - It("should get the credentials without error ", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(creds.Region).To(Equal("us-east-2")) - Expect(creds.AccessKeyID).To(Equal("my_aws_access_key_id")) - Expect(creds.SecretAccessKey).To(Equal("my_aws_secret_access_key")) - }) - }) - - AfterEach(func() { - deleteTempDirectory() - _ = os.Setenv("HOME", curHome) - _ = os.Setenv("USERPROFILE", curUserProfile) - }) -}) - -func createTempDirectory(prefix string) { - testingDir, err = os.MkdirTemp("", prefix) - if err != nil { - fmt.Println("Error TempDir: ", err.Error()) - } -} - -func deleteTempDirectory() { - os.Remove(testingDir) -} diff --git a/tkg/client/create_test.go b/tkg/client/create_test.go deleted file mode 100644 index 44eb3938e4..0000000000 --- a/tkg/client/create_test.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "os" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - appsv1 "k8s.io/api/apps/v1" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit tests for create cluster", func() { - var ( - err error - clusterClient *fakes.ClusterClient - kubeConfigBytes []byte - tkgClient *TkgClient - name string - namespace string - manifest string - autoscalerDeploy *appsv1.Deployment - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - name = "testClusterName" - autoscalerDeploy = &appsv1.Deployment{} - autoscalerDeploy.Name = constants.AutoscalerDeploymentNameSuffix - manifest = `--- -apiVersion: cluster.x-k8s.io/v1alpha3 -kind: Cluster -metadata: - name: tkg-region-aws-11111111111111 - namespace: default -spec: - clusterNetwork: - pods: - cidrBlocks: - - 192.168.0.0/16 - infrastructureRef: - apiVersion: infrastructure.cluster.x-k8s.io/v1alpha3 - kind: AWSCluster - name: tkg-region-aws-11111111111111 -` - }) - - Describe("When creating cluster", func() { - JustBeforeEach(func() { - namespace = "fake-namespace" - err = tkgClient.DoCreateCluster(clusterClient, name, namespace, manifest) - }) - Context("When cluster name is invalid", func() { - BeforeEach(func() { - name = "" - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("invalid cluster name")) - }) - }) - Context("When manifest is invalid", func() { - BeforeEach(func() { - manifest = "" - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("invalid cluster manifest")) - }) - }) - Context("When apply manifest fails", func() { - BeforeEach(func() { - clusterClient.ApplyReturns(errors.New("fake-apply-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("unable to apply cluster configuration")) - }) - }) - }) - Describe("testing WaitingForClusterAndGetKubeConfig method ", func() { - JustBeforeEach(func() { - kubeConfigBytes, err = tkgClient.WaitForClusterInitializedAndGetKubeConfig(clusterClient, name, constants.DefaultNamespace) - }) - Context("When waiting for cluster fails", func() { - BeforeEach(func() { - clusterClient.WaitForClusterInitializedReturns(errors.New("fake-wait-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("error waiting for cluster to be provisioned")) - }) - }) - Context("When get kube config fails", func() { - BeforeEach(func() { - clusterClient.GetKubeConfigForClusterReturns(kubeConfigBytes, errors.New("fake-getkubeconfig-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("unable to extract kube config for cluster")) - }) - }) - Context("With get kube config succeeds", func() { - BeforeEach(func() { - clusterClient.GetKubeConfigForClusterReturns([]byte("fake kubeconfig data"), nil) - }) - It("kube config bytes are returned", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(kubeConfigBytes).To(Equal([]byte("fake kubeconfig data"))) - }) - }) - }) - - Describe("WaitForAutoscalerDeployment by legacy mod", func() { - JustBeforeEach(func() { - tkgClient.WaitForAutoscalerDeployment(clusterClient, name, constants.DefaultNamespace, false) - }) - - Context("When the value for config variable 'ENABLE_AUTOSCALER' is not set", func() { - It("should not wait for autoscaler deployment", func() { - Expect(clusterClient.WaitForAutoscalerDeploymentCallCount()).To(Equal(0)) - }) - }) - - Context("When the value for config variable 'ENABLE_AUTOSCALER' is set to 'false'", func() { - BeforeEach(func() { - os.Setenv(constants.ConfigVariableEnableAutoscaler, "false") - }) - - It("should not wait for autoscaler deployment", func() { - Expect(clusterClient.WaitForAutoscalerDeploymentCallCount()).To(Equal(0)) - }) - }) - - Context("When the value for config variable 'ENABLE_AUTOSCALER' is set to 'true'", func() { - BeforeEach(func() { - os.Setenv(constants.ConfigVariableEnableAutoscaler, "true") - }) - - It("should wait for autoscaler deployment", func() { - Expect(clusterClient.WaitForAutoscalerDeploymentCallCount()).To(Equal(1)) - }) - }) - }) - - Describe("WaitForAutoscalerDeployment by clusterclass mod", func() { - JustBeforeEach(func() { - tkgClient.WaitForAutoscalerDeployment(clusterClient, name, constants.DefaultNamespace, true) - }) - - Context("When the deployment of autoscaler not exsits in mgmt cluster", func() { - BeforeEach(func() { - clusterClient.GetDeploymentReturns(appsv1.Deployment{}, errors.New("can't get resource of autoscaler deployment")) - }) - - It("should not wait for autoscaler deployment", func() { - Expect(clusterClient.WaitForAutoscalerDeploymentCallCount()).To(Equal(0)) - }) - }) - - Context("When the deployment of autoscaler exsits in mgmt cluster", func() { - BeforeEach(func() { - clusterClient.GetDeploymentReturns(*autoscalerDeploy, nil) - }) - - It("should wait for autoscaler deployment", func() { - Expect(clusterClient.WaitForAutoscalerDeploymentCallCount()).To(Equal(1)) - }) - }) - }) -}) diff --git a/tkg/client/delete_region.go b/tkg/client/delete_region.go deleted file mode 100644 index f135b33270..0000000000 --- a/tkg/client/delete_region.go +++ /dev/null @@ -1,531 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "fmt" - "path/filepath" - "strings" - "time" - - "gopkg.in/yaml.v3" - - v1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - - "github.com/pkg/errors" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -// Error message constants -const ( - ErrorMissingRegionalClusterObject = "management cluster object is not present in given management cluster" - ErrorNoClusterObject = "no Cluster object present in the given management cluster" - ErrorGettingClusterObjects = "unable to get cluster resources, %s. Are you sure the cluster you are using is a management cluster?" - ErrorDeleteAbort = `Deletion is aborted because management cluster is currently managing the following workload clusters: - -%s - -You need to delete these clusters first before deleting the management cluster. - -Alternatively, you can use the --force flag to force the deletion of the management cluster but doing so will orphan the above-mentioned clusters and leave them unmanaged.` -) - -// DeleteRegion delete management cluster -func (c *TkgClient) DeleteRegion(options DeleteRegionOptions) error { //nolint:funlen,gocyclo - var err error - var isSuccessful = false - var isStartedRegionalClusterDeletion = false - var isCleanupClusterCreated = false - var cleanupClusterName string - var cleanupClusterKubeconfigPath string - - defer func() { - // if management cluster deletion is not being started and kind cluster is already created - if !isSuccessful && isStartedRegionalClusterDeletion { - c.displayHelpTextOnDeleteRegionFailure(cleanupClusterKubeconfigPath, isCleanupClusterCreated, cleanupClusterName, options.ClusterName) - return - } - - if isCleanupClusterCreated { - if err := c.teardownKindCluster(cleanupClusterName, cleanupClusterKubeconfigPath, options.UseExistingCluster); err != nil { - log.Warning(err.Error()) - } - } - - _ = utils.DeleteFile(cleanupClusterKubeconfigPath) - }() - - if err := c.ValidatePrerequisites(!options.UseExistingCluster, true); err != nil { - return err - } - - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 5 * time.Second, - GetClientTimeout: 10 * time.Second, - OperationTimeout: c.timeout, - } - - contexts, err := c.GetRegionContexts(options.ClusterName) - if err != nil || len(contexts) == 0 { - return errors.Errorf("management cluster %s not found", options.ClusterName) - } - regionContext := contexts[0] - - regionalClusterClient, err := clusterclient.NewClient(regionContext.SourceFilePath, regionContext.ContextName, clusterclientOptions) - if err != nil { - return errors.Wrap(err, "unable to create cluster client for management cluster") - } - - log.Info("Verifying management cluster...") - // Verify presence of workload cluster and return management cluster name and namespace - regionalClusterNamespace, err := c.verifyDeleteRegion(regionalClusterClient, options) - if err != nil { - return err - } - - err = c.RetrieveRegionalClusterConfiguration(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "failed to set configurations for deletion") - } - - isClusterClassBased, err := regionalClusterClient.IsClusterClassBased(options.ClusterName, regionalClusterNamespace) - if err != nil { - return errors.Wrap(err, "error while checking bootstrap cluster type") - } - - isFailure, err := c.IsManagementClusterAKindCluster(options.ClusterName) - if err != nil { - return err - } - - if !isFailure { - cleanupClusterKubeconfigPath, err = getTKGKubeConfigPath(false) - if err != nil { - return errors.Wrap(err, "cannot get cleanup cluster kubeconfig path ") - } - - // configure variables required to deploy providers - if err := c.configureVariablesForProvidersInstallation(regionalClusterClient); err != nil { - return errors.Wrap(err, "unable to configure variables for provider installation") - } - - // Get the kubeconfig and initOptions for cleanup cluster - log.V(1).Infof("Using cleanup cluster kubeconfig from path: %v", cleanupClusterKubeconfigPath) - initOptionsForCleanupCluster, err := c.getCleanupClusterOptions(regionalClusterClient, cleanupClusterKubeconfigPath) - if err != nil { - return err - } - - log.Info("Setting up cleanup cluster...") - - // Create cleanup kind cluster and backup the kubeconfig under ./kube-tkg/tmp/ - if cleanupClusterName, err = c.ensureKindCluster(options.Kubeconfig, options.UseExistingCluster, cleanupClusterKubeconfigPath); err != nil { - return errors.Wrap(err, "unable to create cleanup cluster") - } - - isCleanupClusterCreated = true - - cleanupClusterClient, err := clusterclient.NewClient(cleanupClusterKubeconfigPath, "", clusterclientOptions) - if err != nil { - return errors.Wrap(err, "cannot create cleanup cluster client") - } - - if config.IsFeatureActivated(constants.FeatureFlagManagementClusterDeployInClusterIPAMProvider) { - providerName, _, err := ParseProviderName(initOptionsForCleanupCluster.InfrastructureProvider) - if err != nil { - return errors.Wrap(err, "unable to parse provider name") - } - - if providerName == constants.InfrastructureProviderVSphere { - ipamProvider, err := c.tkgConfigUpdaterClient.CheckInfrastructureVersion("ipam-in-cluster") - if err != nil { - return err - } - initOptionsForCleanupCluster.IPAMProvider = ipamProvider - } - } - - log.Info("Installing providers to cleanup cluster...") - // Initialize cleanup cluster using same provider name and version from management cluster - if err = c.InitializeProviders(&initOptionsForCleanupCluster, cleanupClusterClient, cleanupClusterKubeconfigPath); err != nil { - return errors.Wrap(err, "unable to initialize providers") - } - - isStartedRegionalClusterDeletion = true - - log.Info("Moving TKR and Cluster API objects from management cluster to cleanup cluster...") - regionalClusterKubeConfigPath, err := regionalClusterClient.ExportCurrentKubeconfigToFile() - if err != nil { - return errors.Wrap(err, "unable to export management cluster's kubeconfig") - } - defer func() { - _ = utils.DeleteFile(regionalClusterKubeConfigPath) - }() - - // Copy coresponding TKR and OSImages from management cluster to cleanup cluster for all namespaces - if err = c.CopyNeededTKRAndOSImages(regionalClusterClient, cleanupClusterClient); err != nil { - return errors.Wrap(err, "unable to copy coresponding TKR and OSImages from management cluster to cleanup cluster") - } - - // Move all Cluster API objects from management cluster to cleanup cluster for all namespaces - if err = c.MoveObjects(regionalClusterKubeConfigPath, cleanupClusterKubeconfigPath, regionalClusterNamespace); err != nil { - return errors.Wrap(err, "unable to move Cluster API objects from management cluster to cleanup cluster") - } - - log.Info("Waiting for the Cluster API objects to get ready after move...") - if err := c.WaitForClusterReadyAfterReverseMove(cleanupClusterClient, options.ClusterName, regionalClusterNamespace); err != nil { - return errors.Wrap(err, "unable to wait for cluster getting ready for move") - } - - // Clean up avi resources in management cluster - if err = c.cleanUpAVIResourcesInManagementCluster(regionalClusterClient, isFailure, isClusterClassBased, options.ClusterName, regionalClusterNamespace); err != nil { - return errors.Wrap(err, "unable to clean up avi resource") - } - } else { // remove a management cluster whose deploymentStatus is 'Failed' - cleanupClusterKubeconfigPath = regionContext.SourceFilePath - cleanupClusterName = strings.TrimLeft(regionContext.ContextName, "kind-") - isCleanupClusterCreated = true - isStartedRegionalClusterDeletion = true - - // Clean up avi resources in bootstrap cluster - if err = c.cleanUpAVIResourcesInManagementCluster(regionalClusterClient, isFailure, isClusterClassBased, options.ClusterName, regionalClusterNamespace); err != nil { - return errors.Wrap(err, "unable to clean up avi resource") - } - - } - - log.Info("Deleting management cluster...") - // Delete management cluster, this will start process of deleting cluster and its underlying resources - if err = c.deleteCluster(cleanupClusterKubeconfigPath, options.ClusterName, regionalClusterNamespace); err != nil { - return errors.Wrap(err, "unable to delete management cluster") - } - - // management cluster deletion happens in background and we cannot teardown the cleanup kind cluster until the management cluster is deleted successfully - if err = c.waitForClusterDeletion(cleanupClusterKubeconfigPath, options.ClusterName, regionalClusterNamespace); err != nil { - return errors.Wrapf(err, "error waiting for management cluster '%s' to be deleted", options.ClusterName) - } - lock, err := utils.GetFileLockWithTimeOut(filepath.Join(c.tkgConfigDir, constants.LocalTanzuFileLock), utils.DefaultLockTimeout) - if err != nil { - return errors.Wrap(err, "cannot acquire lock for deleting region context") - } - - defer func() { - if err := lock.Unlock(); err != nil { - log.Warningf("cannot release lock for deleting region context, reason: %v", err) - } - }() - err = c.regionManager.DeleteRegionContext(options.ClusterName) - if err != nil { - log.Warningf("Failed to delete management cluster %s context from tkg config file", options.ClusterName) - } - - log.Infof("Management cluster '%s' deleted.", options.ClusterName) - - // delete management cluster config from default kubeconfig file - if regionContext.Status != region.Failed { - userKubeconfigPath := getDefaultKubeConfigFile() - log.Infof("Deleting the management cluster context from the kubeconfig file '%s'", userKubeconfigPath) - if err = DeleteContextFromKubeConfig(userKubeconfigPath, regionContext.ContextName); err != nil { - log.Warningf("Failed to delete management cluster context from the kubeconfig file '%s'", userKubeconfigPath) - } - } - - isSuccessful = true - - return nil -} - -// IsManagementClusterAKindCluster Determining if the management cluster creation is successful based on the presence of Annotation 'TKGVERSION: '. -// -// Management clusters are annotated with the TKG version if they are successful. -// If the annotation is not present, the cluster is determined to be failed management cluster (kind cluster) with some un-deleted infrastructure resources -func (c *TkgClient) IsManagementClusterAKindCluster(clusterName string) (bool, error) { - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 5 * time.Second, - GetClientTimeout: 10 * time.Second, - OperationTimeout: c.timeout, - } - - contexts, err := c.GetRegionContexts(clusterName) - if err != nil || len(contexts) == 0 { - return false, errors.Errorf("management cluster %s not found", clusterName) - } - regionContext := contexts[0] - - regionalClusterClient, err := clusterclient.NewClient(regionContext.SourceFilePath, regionContext.ContextName, clusterclientOptions) - if err != nil { - return false, errors.Wrap(err, "unable to create cluster client for management cluster") - } - - mcObject := &capi.Cluster{} - err = regionalClusterClient.GetResource(mcObject, clusterName, "tkg-system", nil, nil) - if err != nil { - return false, errors.Wrapf(err, "unable to get the cluster object for cluster %q", clusterName) - } - _, exists := mcObject.Annotations[clusterclient.TKGVersionKey] - return !exists, nil -} - -func (c *TkgClient) getCleanupClusterOptions(regionalClusterClient clusterclient.Client, cleanupClusterKubeconfigPath string) (InitRegionOptions, error) { - // Get installed providers list and configuration - initOptionsForCleanupCluster, err := c.getInitOptionsFromExistingCluster(regionalClusterClient) - if err != nil { - return initOptionsForCleanupCluster, errors.Wrap(err, "unable to get management cluster provider information") - } - initOptionsForCleanupCluster.Kubeconfig = cleanupClusterKubeconfigPath - return initOptionsForCleanupCluster, nil -} - -func (c *TkgClient) deleteCluster(kubeconfig, clusterName, clusterNamespace string) error { - var err error - clusterClient, err := clusterclient.NewClient(kubeconfig, "", clusterclient.Options{}) - if err != nil { - return err - } - - clusterObject := &capi.Cluster{} - clusterObject.Name = clusterName - clusterObject.Namespace = clusterNamespace - - return clusterClient.DeleteResource(clusterObject) -} - -func (c *TkgClient) waitForClusterDeletion(kubeconfig, clusterName, clusterNamespace string) error { - var err error - clusterClient, err := clusterclient.NewClient(kubeconfig, "", clusterclient.Options{OperationTimeout: c.timeout}) - if err != nil { - return errors.Wrap(err, "unable to get cluster client while waiting for deletion of cluster") - } - return clusterClient.WaitForClusterDeletion(clusterName, clusterNamespace) -} - -func (c *TkgClient) verifyDeleteRegion(clusterClient clusterclient.Client, options DeleteRegionOptions) (string, error) { - var errMsg string - var regionalClusterNamespace string - - isPacific, err := clusterClient.IsPacificRegionalCluster() - if err != nil { - return "", errors.Wrap(err, "error determining 'Tanzu Kubernetes Cluster service for vSphere' management cluster") - } - if isPacific { - return "", errors.New("deleting 'Tanzu Kubernetes Cluster service for vSphere' management cluster is not yet supported") - } - - // Get the all the cluster objects - clusters := &capi.ClusterList{} - err = clusterClient.ListResources(clusters, &crtclient.ListOptions{}) - if err != nil { - return regionalClusterNamespace, errors.Errorf(ErrorGettingClusterObjects, err.Error()) - } - - if len(clusters.Items) == 0 { - return regionalClusterNamespace, errors.New(ErrorNoClusterObject) - } - regionalClusterObjectPresent := false - var workloadClusters string - for i := range clusters.Items { - if clusters.Items[i].Name == options.ClusterName { - regionalClusterObjectPresent = true - regionalClusterNamespace = clusters.Items[i].Namespace - } else { - workloadClusters += "- " + clusters.Items[i].Name + "\n" - } - } - - if !regionalClusterObjectPresent { - return regionalClusterNamespace, errors.New(ErrorMissingRegionalClusterObject) - } - - if len(workloadClusters) > 0 { - errMsg = fmt.Sprintf(ErrorDeleteAbort, workloadClusters) - } - - if !options.Force && errMsg != "" { - return regionalClusterNamespace, errors.New(errMsg) - } - - return regionalClusterNamespace, nil -} - -func (c *TkgClient) getInitOptionsFromExistingCluster(regionalClusterClient clusterclient.Client) (InitRegionOptions, error) { - initOptions := InitRegionOptions{} - - // Get the all the installed provider info - installedProviders := &clusterctlv1.ProviderList{} - err := regionalClusterClient.ListResources(installedProviders, &crtclient.ListOptions{}) - if err != nil { - return initOptions, errors.Wrap(err, "cannot get installed provider config") - } - - // installedProviderNamespaces is a map to store installed providers namespaces - installedProviderNamespaces := make(map[string]struct{}) - installedProviderWatchingNamespaces := make(map[string]struct{}) - - for i := range installedProviders.Items { - installedProviderNamespaces[installedProviders.Items[i].Namespace] = struct{}{} - - if len(installedProviders.Items[i].WatchedNamespace) > 0 { - installedProviderWatchingNamespaces[installedProviders.Items[i].WatchedNamespace] = struct{}{} - } - - if clusterctlv1.ProviderType(installedProviders.Items[i].Type) == clusterctlv1.InfrastructureProviderType { - defaultProviderVersion, err := c.tkgConfigUpdaterClient.GetDefaultInfrastructureVersion(installedProviders.Items[i].ProviderName) - if err != nil { - return initOptions, errors.Wrap(err, "cannot get default infrastructure provider version from config file") - } - if err = c.verifyProviderConfigVariablesExists(installedProviders.Items[i].ProviderName); err != nil { - return initOptions, errors.Wrap(err, "error verifying config variables") - } - initOptions.InfrastructureProvider = installedProviders.Items[i].ProviderName + ":" + defaultProviderVersion - } - } - - initOptions.CoreProvider, initOptions.BootstrapProvider, initOptions.ControlPlaneProvider, err = c.tkgBomClient.GetDefaultClusterAPIProviders() - if err != nil { - return initOptions, errors.Wrap(err, "unable to get default cluster api provider info") - } - - // Check if installed Providers namespace is same or not, if same means cluster was - // deployment with --target-namespace parameter, else each provider is using - // it's default namespace in this case leave targetNamespace empty - if len(installedProviderNamespaces) != 1 { - initOptions.Namespace = "" - } else { - for targetNamespace := range installedProviderNamespaces { - initOptions.Namespace = targetNamespace - } - } - - return initOptions, nil -} - -func (c *TkgClient) displayHelpTextOnDeleteRegionFailure(cleanupClusterKubeconfigPath string, - isCleanupClusterCreated bool, cleanupClusterName string, clusterName string) { - - log.Warningf("\n\nFailure while deleting management cluster. Here are some steps to investigate the cause:\n") - log.Warningf("\nDebug:") - log.Warningf(" kubectl get po,deploy,cluster,kubeadmcontrolplane,machine,machinedeployment -A --kubeconfig %s", cleanupClusterKubeconfigPath) - log.Warningf(" kubectl logs deployment.apps/ -n manager --kubeconfig %s", cleanupClusterKubeconfigPath) - - if isCleanupClusterCreated { - log.Warningf("\nThe cleanup cluster is still running") - log.Warningf("\nRun docker ps | grep %s to verify that the cleanup cluster is still running", cleanupClusterName) - log.Warningf("\nTo delete the cleanup cluster and free up resources locally:") - log.Warningf(" docker rm -v %s-control-plane -f", cleanupClusterName) - } - - log.Warningf("\nIf you want to remove the management-cluster entry from the existing server list, run 'tanzu config server delete %s'", clusterName) -} - -func (c *TkgClient) verifyProviderConfigVariablesExists(providerName string) error { - var missingVariables []string - if providerName == VSphereProviderName { - if _, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereUsername); err != nil { - missingVariables = append(missingVariables, constants.ConfigVariableVsphereUsername) - } - if _, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVspherePassword); err != nil { - missingVariables = append(missingVariables, constants.ConfigVariableVspherePassword) - } - } else if providerName == AWSProviderName { - if _, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSB64Credentials); err != nil { - missingVariables = append(missingVariables, constants.ConfigVariableAWSB64Credentials) - _, errEncode := c.EncodeAWSCredentialsAndGetClient(nil) - // EncodeAWSCredentialsAndGetClient function may set ConfigVariableAWSB64Credentials in configStore - // So, verify the existence of ConfigVariableAWSB64Credentials again - _, errReadVar := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSB64Credentials) - if errEncode != nil || errReadVar != nil { - missingVariables = append(missingVariables, constants.ConfigVariableAWSB64Credentials) - } - } - } - - if len(missingVariables) == 0 { - return nil - } - - return errors.Errorf("value for variables [%s] is not set. Please set the value using os environment variables or the tkg config file", strings.Join(missingVariables, ",")) -} - -func (c *TkgClient) cleanUpAVIResourcesInManagementCluster(regionalClusterClient clusterclient.Client, isFailure, isClusterClassBased bool, clusterName, clusterNamespace string) error { - akoAddonSecret := &corev1.Secret{} - - // Ako addon secret name is different between legacy cluster and classy cluster - // Ako addon secret name depends on if management cluster is successfully created - akoAddonSecretName := constants.AkoAddonName + "-data-values" - if isFailure { - akoAddonSecretName = constants.AkoAddonName + "-addon" - } - - if isClusterClassBased { - akoAddonSecretName = clusterName + "-" + akoAddonSecretName - } - - if err := regionalClusterClient.GetResource(akoAddonSecret, akoAddonSecretName, clusterNamespace, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - return nil - } - return errors.Wrapf(err, "unable to get ako add-on secret") - } - log.Info("Cleaning up AVI Resources...") - akoAddonSecretData := akoAddonSecret.Data["values.yaml"] - var values map[string]interface{} - err := yaml.Unmarshal(akoAddonSecretData, &values) - if err != nil { - return err - } - akoInfo, ok := values["loadBalancerAndIngressService"].(map[string]interface{}) - if !ok { - return errors.Errorf("management cluster %s ako add-on secret yaml data parse error", clusterName) - } - akoConfig, ok := akoInfo["config"].(map[string]interface{}) - if !ok { - return errors.Errorf("management cluster %s ako add-on secret yaml data parse error", clusterName) - } - akoSetting, ok := akoConfig["ako_settings"].(map[string]interface{}) - if !ok { - return errors.Errorf("management cluster %s ako add-on secret yaml data parse error", clusterName) - } - akoSetting["delete_config"] = trueStr - akoAddonSecretData, err = yaml.Marshal(&values) - if err != nil { - return err - } - // Add header to ako addon secret when the cluster is legacy - akoAddonSecretStr := string(akoAddonSecretData) - if !isClusterClassBased { - akoAddonSecretStr = constants.TKGDataValueFormatString + akoAddonSecretStr - } - akoAddonSecret.Data["values.yaml"] = []byte(akoAddonSecretStr) - if err := regionalClusterClient.UpdateResource(akoAddonSecret, akoAddonSecretName, clusterNamespace); err != nil { - return errors.Wrapf(err, "unable to update ako add-on secret") - } - return c.waitForAVIResourceCleanup(regionalClusterClient) -} - -func (c *TkgClient) waitForAVIResourceCleanup(regionalClusterClient clusterclient.Client) error { - akoStatefulSet := &v1.StatefulSet{} - if err := regionalClusterClient.GetResource(akoStatefulSet, constants.AkoStatefulSetName, constants.AkoNamespace, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - return nil - } - log.Warning("unable to get ako statefulset") - } - if err := regionalClusterClient.WaitForAVIResourceCleanUp(constants.AkoStatefulSetName, constants.AkoNamespace); err != nil { - if !strings.Contains(err.Error(), "dial tcp") { - log.Error(err, "clean up AVI resources error") - } - } - return nil -} diff --git a/tkg/client/describe_cluster.go b/tkg/client/describe_cluster.go deleted file mode 100644 index ec8497a1ec..0000000000 --- a/tkg/client/describe_cluster.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "context" - "time" - - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/runtime" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - clusterctltree "sigs.k8s.io/cluster-api/cmd/clusterctl/client/tree" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -// Scheme runtime scheme -var Scheme = runtime.NewScheme() - -// DescribeTKGClustersOptions contains options supported by DescribeCluster -type DescribeTKGClustersOptions struct { - ClusterName string - Namespace string - ShowOtherConditions string - ShowDetails bool - ShowGroupMembers bool - IsManagementCluster bool -} - -// DescribeCluster describes cluster details and status -func (c *TkgClient) DescribeCluster(options DescribeTKGClustersOptions) (*clusterctltree.ObjectTree, *clusterv1.Cluster, *clusterctlv1.ProviderList, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return nil, nil, nil, errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return nil, nil, nil, errors.Wrap(err, "unable to get cluster client while listing tkg clusters") - } - - ctx := context.Background() - - cluster := &clusterv1.Cluster{} - clusterKey := client.ObjectKey{ - Namespace: options.Namespace, - Name: options.ClusterName, - } - - f := regionalClusterClient.GetClientSet() - - if err := f.Get(ctx, clusterKey, cluster); err != nil { - return nil, nil, nil, err - } - - objs, err := clusterctltree.Discovery(ctx, f, options.Namespace, options.ClusterName, clusterctltree.DiscoverOptions{ - ShowOtherConditions: options.ShowOtherConditions, - Echo: options.ShowDetails, - Grouping: options.ShowGroupMembers, - }) - if err != nil { - return nil, nil, nil, err - } - - if options.IsManagementCluster { - installedProviders := &clusterctlv1.ProviderList{} - err = regionalClusterClient.ListResources(installedProviders, &client.ListOptions{}) - if err != nil { - return nil, nil, nil, err - } - return objs, cluster, installedProviders, nil - } - - return objs, cluster, nil, nil -} - -// DescribeProvider describes provider information -func (c *TkgClient) DescribeProvider() (*clusterctlv1.ProviderList, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return nil, errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get cluster client while listing tkg clusters") - } - - installedProviders := &clusterctlv1.ProviderList{} - err = regionalClusterClient.ListResources(installedProviders, &client.ListOptions{}) - if err != nil { - return nil, err - } - return installedProviders, nil -} diff --git a/tkg/client/get_cluster.go b/tkg/client/get_cluster.go deleted file mode 100644 index 9672bc476e..0000000000 --- a/tkg/client/get_cluster.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "time" - - "github.com/pkg/errors" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -// ListTKGClustersOptions contains options supported by ListClusters -type ListTKGClustersOptions struct { - Namespace string - IncludeMC bool - IsTKGSClusterClassFeatureActivated bool -} - -// ClusterInfo defines the fields of get cluster output -type ClusterInfo struct { - Name string `json:"name" yaml:"name"` - Namespace string `json:"namespace" yaml:"namespace"` - Status string `json:"status" yaml:"status"` - Plan string `json:"plan" yaml:"plan"` - ControlPlaneCount string `json:"controlplane" yaml:"controlplane"` - WorkerCount string `json:"workers" yaml:"workers"` - K8sVersion string `json:"kubernetes" yaml:"kubernetes"` - Roles []string `json:"roles" yaml:"roles"` - TKR string `json:"tkr" yaml:"tkr"` - Labels map[string]string `json:"labels" yaml:"labels"` -} - -// ListTKGClusters lists tkg cluster information -func (c *TkgClient) ListTKGClusters(options ListTKGClustersOptions) ([]ClusterInfo, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return nil, errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get cluster client while listing tkg clusters") - } - - listOptions := &crtclient.ListOptions{} - if options.Namespace != "" { - listOptions.Namespace = options.Namespace - } - - isPacific, err := regionalClusterClient.IsPacificRegionalCluster() - if err != nil { - return nil, errors.Wrap(err, "error determining 'Tanzu Kubernetes Cluster service for vSphere' management cluster") - } - - if isPacific && !options.IsTKGSClusterClassFeatureActivated { - return c.GetClusterObjectsForPacific(regionalClusterClient, "", listOptions) - } - - return c.GetClusterObjects(regionalClusterClient, listOptions, currentRegion.ClusterName, options.IncludeMC) -} - -// GetClusterObjects gets cluster objects -func (c *TkgClient) GetClusterObjects(clusterClient clusterclient.Client, listOptions *crtclient.ListOptions, - managementClusterName string, includeMC bool) ([]ClusterInfo, error) { - - clusterInfoMap, err := getClusterObjectsMap(clusterClient, listOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to retrieve combined cluster info") - } - - clusters := []ClusterInfo{} - - for _, clusterInfo := range clusterInfoMap { - if clusterInfo == nil || (clusterInfo.cluster.Name == managementClusterName && !includeMC) { - continue - } - - cluster := ClusterInfo{} - cluster.Name = clusterInfo.cluster.Name - cluster.Namespace = clusterInfo.cluster.Namespace - cluster.Status = string(getClusterStatus(clusterInfo)) - cluster.Plan = getClusterPlan(clusterInfo) - cluster.ControlPlaneCount = getClusterControlPlaneCount(clusterInfo) - cluster.WorkerCount = getClusterWorkerCount(clusterInfo) - cluster.K8sVersion = getClusterK8sVersion(clusterInfo) - cluster.Roles = getClusterRoles(clusterInfo.cluster.Labels) - cluster.Labels = clusterInfo.cluster.Labels - cluster.TKR = getClusterTKR(clusterInfo.cluster.Labels) - clusters = append(clusters, cluster) - } - - return clusters, nil -} - -// GetClusterObjectsForPacific get cluster objects for TKGS clusters -func (c *TkgClient) GetClusterObjectsForPacific(clusterClient clusterclient.Client, apiVersion string, listOptions *crtclient.ListOptions) ([]ClusterInfo, error) { - clusterInfoMap, err := getClusterObjectsMapForPacific(clusterClient, listOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to retrieve combined cluster info") - } - - clusters := []ClusterInfo{} - - for _, clusterInfo := range clusterInfoMap { - if clusterInfo == nil { - continue - } - - cluster := ClusterInfo{} - cluster.Name = clusterInfo.cluster.Name - cluster.Namespace = clusterInfo.cluster.Namespace - cluster.Roles = getClusterRoles(clusterInfo.cluster.Labels) - cluster.Status = string(clusterInfo.cluster.Status.Phase) - cluster.Plan = getClusterPlanForPacific(clusterInfo) - cluster.ControlPlaneCount = getClusterControlPlaneCountForPacific(clusterInfo) - cluster.WorkerCount = getClusterWorkerCountForPacific(clusterInfo) - cluster.K8sVersion = clusterInfo.cluster.Spec.Distribution.Version - cluster.Labels = clusterInfo.cluster.Labels - cluster.TKR = getClusterTKR(clusterInfo.cluster.Labels) - clusters = append(clusters, cluster) - } - - return clusters, nil -} diff --git a/tkg/client/get_cluster_helper.go b/tkg/client/get_cluster_helper.go deleted file mode 100644 index e0828feace..0000000000 --- a/tkg/client/get_cluster_helper.go +++ /dev/null @@ -1,391 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "encoding/json" - "fmt" - "strings" - "time" - - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - - "github.com/pkg/errors" - capiv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -const ( - // TKGPlanAnnotation plan annotation - TKGPlanAnnotation = "tkg/plan" - LegacyClusterTKRLabel = "tanzuKubernetesRelease" -) - -type clusterObjects struct { - cluster capi.Cluster - kcp controlplanev1.KubeadmControlPlane - mds []capi.MachineDeployment - machines []capi.Machine -} - -type clusterObjectsForPacific struct { - cluster tkgsv1alpha2.TanzuKubernetesCluster - mds []capiv1alpha3.MachineDeployment - machines []capiv1alpha3.Machine -} - -// ################### Helpers for Pacific ################## - -func getRunningCPMachineCountForPacific(clusterInfo *clusterObjectsForPacific) int { - cpMachineCount := 0 - for i := range clusterInfo.machines { - if _, labelExists := clusterInfo.machines[i].GetLabels()[capiv1alpha3.MachineControlPlaneLabelName]; labelExists && strings.EqualFold(clusterInfo.machines[i].Status.Phase, "running") { - cpMachineCount++ - } - } - return cpMachineCount -} - -func getClusterControlPlaneCountForPacific(clusterInfo *clusterObjectsForPacific) string { - if clusterInfo.cluster.Spec.Topology.ControlPlane.Replicas == nil { - return "" - } - cpReplicas := fmt.Sprintf("%v/%v", getRunningCPMachineCountForPacific(clusterInfo), *clusterInfo.cluster.Spec.Topology.ControlPlane.Replicas) - return cpReplicas -} - -func getClusterObjectsMapForPacific(clusterClient clusterclient.Client, listOptions *crtclient.ListOptions) (map[string]*clusterObjectsForPacific, error) { - var tkcObjList tkgsv1alpha2.TanzuKubernetesClusterList - err := clusterClient.ListResources(&tkcObjList, listOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get list of clusters") - } - - var mdList capiv1alpha3.MachineDeploymentList - err = clusterClient.ListResources(&mdList, listOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get list of MachineDeployment objects") - } - - var machineList capiv1alpha3.MachineList - err = clusterClient.ListResources(&machineList, listOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get list of Machine objects") - } - - clusterInfoMap := make(map[string]*clusterObjectsForPacific) - - for idx := range tkcObjList.Items { - cl := tkcObjList.Items[idx] - clusterObjectCombined := clusterObjectsForPacific{cluster: cl} - key := cl.Name + "-" + cl.Namespace - clusterInfoMap[key] = &clusterObjectCombined - } - - for i := range mdList.Items { - clusterName, labelExists := mdList.Items[i].GetLabels()[capi.ClusterLabelName] - if !labelExists { - continue - } - key := clusterName + "-" + mdList.Items[i].Namespace - clusterObjectCombined, clusterExists := clusterInfoMap[key] - if !clusterExists { - continue - } - clusterObjectCombined.mds = append(clusterObjectCombined.mds, mdList.Items[i]) - } - - for i := range machineList.Items { - clusterName, labelExists := machineList.Items[i].GetLabels()[capi.ClusterLabelName] - if !labelExists { - continue - } - key := clusterName + "-" + machineList.Items[i].Namespace - clusterObjectCombined, clusterExists := clusterInfoMap[key] - if !clusterExists { - continue - } - clusterObjectCombined.machines = append(clusterObjectCombined.machines, machineList.Items[i]) - } - - return clusterInfoMap, nil -} - -func getClusterWorkerCountForPacific(clusterInfo *clusterObjectsForPacific) string { - var desiredReplicasCount int32 - nodePools := clusterInfo.cluster.Spec.Topology.NodePools - for idx := range nodePools { - if nodePools[idx].Replicas != nil { - desiredReplicasCount += *nodePools[idx].Replicas - } - } - - var readyReplicasCount int32 - for idx := range clusterInfo.mds { - readyReplicasCount += clusterInfo.mds[idx].Status.ReadyReplicas - } - return fmt.Sprintf("%v/%v", readyReplicasCount, desiredReplicasCount) -} - -func getClusterPlanForPacific(clusterInfo *clusterObjectsForPacific) string { - plan, exists := clusterInfo.cluster.GetAnnotations()[TKGPlanAnnotation] - if !exists { - return "" - } - return plan -} - -// ################### Helpers for Non-Pacific cluster info ################## - -func getClusterObjectsMap(clusterClient clusterclient.Client, listOptions *crtclient.ListOptions) (map[string]*clusterObjects, error) { // nolint:funlen - var clusters capi.ClusterList - err := clusterClient.ListResources(&clusters, listOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get list of clusters") - } - - var kcpList controlplanev1.KubeadmControlPlaneList - err = clusterClient.ListResources(&kcpList, listOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get list of KubeadmControlPlane objects") - } - - var mdList capi.MachineDeploymentList - err = clusterClient.ListResources(&mdList, listOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get list of MachineDeployment objects") - } - - var machineList capi.MachineList - err = clusterClient.ListResources(&machineList, listOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get list of Machine objects") - } - - clusterInfoMap := make(map[string]*clusterObjects) - - for i := range clusters.Items { - clusterObjectCombined := clusterObjects{cluster: clusters.Items[i]} - key := clusters.Items[i].Name + "-" + clusters.Items[i].Namespace - clusterInfoMap[key] = &clusterObjectCombined - } - - for i := range kcpList.Items { - clusterName, labelExists := kcpList.Items[i].GetLabels()[capi.ClusterLabelName] - if !labelExists { - continue - } - key := clusterName + "-" + kcpList.Items[i].Namespace - clusterObjectCombined, clusterExists := clusterInfoMap[key] - if !clusterExists { - log.V(3).Infof("unable to find cluster object '%s' for KubeadmControlPlane object '%s'", clusterName, kcpList.Items[i].Name) - continue - } - clusterObjectCombined.kcp = kcpList.Items[i] - } - - for i := range mdList.Items { - clusterName, labelExists := mdList.Items[i].GetLabels()[capi.ClusterLabelName] - if !labelExists { - continue - } - key := clusterName + "-" + mdList.Items[i].Namespace - clusterObjectCombined, clusterExists := clusterInfoMap[key] - if !clusterExists { - log.V(3).Infof("unable to find cluster object '%s' for MachineDeployment object '%s'", clusterName, mdList.Items[i].Name) - continue - } - clusterObjectCombined.mds = append(clusterObjectCombined.mds, mdList.Items[i]) - } - - for i := range machineList.Items { - clusterName, labelExists := machineList.Items[i].GetLabels()[capi.ClusterLabelName] - if !labelExists { - continue - } - key := clusterName + "-" + machineList.Items[i].Namespace - clusterObjectCombined, clusterExists := clusterInfoMap[key] - if !clusterExists { - log.V(3).Infof("unable to find cluster object '%s' for Machine object '%s'", clusterName, machineList.Items[i].Name) - continue - } - clusterObjectCombined.machines = append(clusterObjectCombined.machines, machineList.Items[i]) - } - - return clusterInfoMap, nil -} - -func getClusterPlan(clusterInfo *clusterObjects) string { - plan, exists := clusterInfo.cluster.GetAnnotations()[TKGPlanAnnotation] - if !exists { - return "" - } - return plan -} - -func getClusterControlPlaneCount(clusterInfo *clusterObjects) string { - if clusterInfo.kcp.Spec.Replicas == nil { - return "" - } - cpReplicas := fmt.Sprintf("%v/%v", clusterInfo.kcp.Status.ReadyReplicas, *clusterInfo.kcp.Spec.Replicas) - return cpReplicas -} - -func getClusterWorkerCount(clusterInfo *clusterObjects) string { - readyReplicas, specReplicas, _, _ := getClusterReplicas(clusterInfo.mds) - // return empty string if specReplicas are not yet set - if specReplicas == 0 { - return "" - } - cpReplicas := fmt.Sprintf("%v/%v", readyReplicas, specReplicas) - return cpReplicas -} - -func getClusterReplicas(mds []capi.MachineDeployment) (int32, int32, int32, int32) { - var readyReplicas int32 - var specReplicas int32 - var replicas int32 - var updatedReplicas int32 - for i := range mds { - readyReplicas += mds[i].Status.ReadyReplicas - replicas += mds[i].Status.Replicas - updatedReplicas += mds[i].Status.UpdatedReplicas - if mds[i].Spec.Replicas != nil { - specReplicas += *mds[i].Spec.Replicas - } - } - return readyReplicas, specReplicas, replicas, updatedReplicas -} - -func getClusterK8sVersion(clusterInfo *clusterObjects) string { - return clusterInfo.kcp.Spec.Version -} - -func getClusterRoles(clusterLabels map[string]string) []string { - clusterRoles := make([]string, 0) - for labelKey := range clusterLabels { - if !strings.HasPrefix(labelKey, TkgLabelClusterRolePrefix) { - continue - } - - clusterRole := strings.TrimPrefix(labelKey, TkgLabelClusterRolePrefix) - clusterRoles = append(clusterRoles, clusterRole) - } - - return clusterRoles -} - -func getClusterTKR(clusterLabels map[string]string) string { - var clusterTKR string - if tkrName, exists := clusterLabels[LegacyClusterTKRLabel]; exists { - clusterTKR = tkrName - } - if tkrName, exists := clusterLabels[runv1.LabelTKR]; exists { - clusterTKR = tkrName - } - return clusterTKR -} - -// ################### Helpers for determining Cluster Status ################## - -func getClusterStatus(clusterInfo *clusterObjects) TKGClusterPhase { - if strings.EqualFold(clusterInfo.cluster.Status.Phase, string(TKGClusterPhaseDeleting)) { - return TKGClusterPhaseDeleting - } - - readyReplicas, specReplicas, replicas, updatedReplicas := getClusterReplicas(clusterInfo.mds) - - creationCompleteCondition := clusterInfo.cluster.Status.InfrastructureReady && - clusterInfo.cluster.Status.ControlPlaneReady && - clusterInfo.kcp.Status.ReadyReplicas > 0 && - // readyReplicas check will only happen in case the replicas in MD is > 0 such that ClusterStatus is `CREATED` in case of SNC. - (replicas == 0 || readyReplicas > 0) - - if !creationCompleteCondition { - return getClusterStatusWhileCreating(clusterInfo) - } - - runningCondition := clusterInfo.cluster.Status.ControlPlaneReady && - *clusterInfo.kcp.Spec.Replicas == clusterInfo.kcp.Status.Replicas && - *clusterInfo.kcp.Spec.Replicas == clusterInfo.kcp.Status.ReadyReplicas && - *clusterInfo.kcp.Spec.Replicas == clusterInfo.kcp.Status.UpdatedReplicas && - specReplicas == replicas && - specReplicas == readyReplicas && - specReplicas == updatedReplicas && - !isUpgradeInProgress(clusterInfo) - - if runningCondition { - return TKGClusterPhaseRunning - } - - return getClusterStatusWhileUpdating(clusterInfo) -} - -func getClusterStatusWhileCreating(clusterInfo *clusterObjects) TKGClusterPhase { - if isOperationStalled(clusterclient.OperationTypeCreate, clusterInfo) { - return TKGClusterPhaseCreationStalled - } - return TKGClusterPhaseCreating -} - -func isUpgradeInProgress(clusterInfo *clusterObjects) bool { - // check k8s version of all machine objects version with kcp.Spec.Version - // to determine this is scaling operation or upgrade operation - for i := range clusterInfo.machines { - if clusterInfo.machines[i].Spec.Version != nil && *clusterInfo.machines[i].Spec.Version != clusterInfo.kcp.Spec.Version { - return true - } - } - return false -} - -func getClusterStatusWhileUpdating(clusterInfo *clusterObjects) TKGClusterPhase { - // if not upgrade opeation then it has to be scaling operation return updating status directly - if !isUpgradeInProgress(clusterInfo) { - return TKGClusterPhaseUpdating - } - - if isOperationStalled(clusterclient.OperationTypeUpgrade, clusterInfo) { - return TKGClusterPhaseUpdateStalled - } - - return TKGClusterPhaseUpdating -} - -func isOperationStalled(operationType string, clusterInfo *clusterObjects) bool { - operationString, exists := clusterInfo.cluster.Annotations[clusterclient.TKGOperationInfoKey] - if !exists { - return false - } - - lastObservedTimestamp, exists := clusterInfo.cluster.Annotations[clusterclient.TKGOperationLastObservedTimestampKey] - if !exists { - return false - } - - operationString = strings.ReplaceAll(operationString, "\\\"", "\"") - operationStatusObject := &clusterclient.OperationStatus{} - err := json.Unmarshal([]byte(operationString), operationStatusObject) - if err != nil { - return false - } - - if operationStatusObject.Operation != operationType { - return false - } - - t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", lastObservedTimestamp) - if err != nil { - return false - } - - return time.Since(t).Seconds() > float64(operationStatusObject.OperationTimeout) -} diff --git a/tkg/client/get_cluster_pinniped_info.go b/tkg/client/get_cluster_pinniped_info.go deleted file mode 100644 index f44aefebf4..0000000000 --- a/tkg/client/get_cluster_pinniped_info.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2021-2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "encoding/json" - "fmt" - "time" - - "github.com/aunum/log" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -// GetClusterPinnipedInfoOptions contains options supported by GetClusterPinnipedInfo -type GetClusterPinnipedInfoOptions struct { - ClusterName string - Namespace string - IsManagementCluster bool -} - -// ClusterPinnipedInfo defines the fields of cluster pinniped info -type ClusterPinnipedInfo struct { - ClusterName string - ClusterInfo *clientcmdapi.Cluster - ClusterAudience *string - PinnipedInfo *pinnipedinfo.PinnipedInfo -} - -// GetClusterPinnipedInfo gets pinniped information from cluster -func (c *TkgClient) GetClusterPinnipedInfo(options GetClusterPinnipedInfoOptions) (*ClusterPinnipedInfo, error) { - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - - curRegion, err := c.GetCurrentRegionContext() - if err != nil { - return nil, errors.Wrap(err, "unable to get current management cluster configuration") - } - - regionalClusterClient, err := clusterclient.NewClient(curRegion.SourceFilePath, curRegion.ContextName, clusterclientOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get cluster client while getting cluster pinniped info of tkg clusters") - } - - isPacific, err := regionalClusterClient.IsPacificRegionalCluster() - if err != nil { - return nil, errors.Wrap(err, "error determining 'Tanzu Kubernetes Cluster service for vSphere' management cluster") - } - if isPacific && options.IsManagementCluster { - return nil, errors.New("getting pinniped information not supported for 'Tanzu Kubernetes Cluster service for vSphere' management cluster") - } - - if options.IsManagementCluster { - return c.GetMCClusterPinnipedInfo(regionalClusterClient, curRegion, options) - } - - // Check if the cluster is a ClusterClass cluster, which would include TKG 1.7+ "classy" clusters. - isClusterClassBased, err := regionalClusterClient.IsClusterClassBased(options.ClusterName, options.Namespace) - if err != nil { - return nil, errors.Wrap(err, "failed to determine if workload cluster is ClusterClass based") - } - - return c.GetWCClusterPinnipedInfo(regionalClusterClient, curRegion, options, isPacific, isClusterClassBased) -} - -// GetWCClusterPinnipedInfo gets pinniped information for workload cluster -func (c *TkgClient) GetWCClusterPinnipedInfo( - regionalClusterClient clusterclient.Client, - _ region.RegionContext, - options GetClusterPinnipedInfoOptions, - isPacific bool, - isClusterClassBased bool) (*ClusterPinnipedInfo, error) { - - wcClusterInfo, err := getClusterInfo(regionalClusterClient, options.ClusterName, options.Namespace) - if err != nil { - return nil, errors.Wrap(err, "failed to get workload cluster information") - } - - // The existing PinnipedInfoConfigMap struct is a marshaled form of a - // ConfigMap. Marshal and unmarshal the raw CM into that struct so we can - // use it. - // TODO(mayankbh) This is a shorter term approach. The _right_ thing might - // be to significantly refactor the PinnipedConfigMapInfo struct so it can - // be constructed from an existing ConfigMap. - configMap := corev1.ConfigMap{} - - if err := regionalClusterClient.GetResource(&configMap, utils.PinnipedInfoConfigMapName, utils.KubePublicNamespace, nil, nil); err != nil { - return nil, errors.New("failed to get pinniped-info from management cluster") - } - - log.Debugf("Management cluster pinniped ConfigMap: %+v", configMap) - - marshalledCM, err := json.Marshal(configMap.Data) - if err != nil { - return nil, errors.New("failed to marshal pinniped-info from management cluster") - } - - managementClusterPinnipedInfo := &pinnipedinfo.PinnipedInfo{} - - // Really, this should never fail unless we're doing something silly like - // marshaling a channel/function. Which we aren't. - if err := json.Unmarshal(marshalledCM, &managementClusterPinnipedInfo); err != nil { - return nil, errors.New("failed to unmarshal pinniped-info from management cluster") - } - - log.Debugf("Management cluster pinniped info: %+v", managementClusterPinnipedInfo) - - // For clusters that use a TKr API version newer than v1alpha1, we use the cluster name + UID as the audience. - // Do this on pacific clusters and TKG "classy" clusters, but not on TKG legacy (non-classy) clusters. - var audience *string - if isPacific || isClusterClassBased { - var cluster capi.Cluster - if err := regionalClusterClient.GetResource( - &cluster, - options.ClusterName, - options.Namespace, - nil, - nil, - ); err != nil { - return nil, errors.Wrap(err, "get cluster") - } - if _, ok := cluster.Labels[LegacyClusterTKRLabel]; !ok { - audience = stringPtr(fmt.Sprintf("%s-%s", cluster.Name, cluster.UID)) - } - } - - if isPacific { - // Pacific uses a different Concierge endpoint. Ignore it when fetching - // a kubeconfig for a workload cluster since we use the workload - // cluster APIserver as the concierge endpoint. - managementClusterPinnipedInfo.ConciergeEndpoint = "" - } - - return &ClusterPinnipedInfo{ - ClusterName: options.ClusterName, - ClusterAudience: audience, - ClusterInfo: wcClusterInfo, - PinnipedInfo: managementClusterPinnipedInfo, - }, nil -} - -// GetMCClusterPinnipedInfo get pinniped information for management cluster -func (c *TkgClient) GetMCClusterPinnipedInfo(regionalClusterClient clusterclient.Client, - curRegion region.RegionContext, options GetClusterPinnipedInfoOptions) (*ClusterPinnipedInfo, error) { - // it is expected that user would call get cluster pinnedInfo of the same management cluster - clusterInfo, err := getClusterInfo(regionalClusterClient, options.ClusterName, options.Namespace) - if err != nil { - return nil, errors.Wrap(err, "failed to get cluster information") - } - pinnipedInfo, err := utils.GetPinnipedInfoFromCluster(clusterInfo, nil) - if err != nil { - return nil, errors.Wrap(err, "failed to get pinniped-info from cluster") - } - - if pinnipedInfo == nil { - return nil, errors.New("failed to get pinniped-info from cluster") - } - - return &ClusterPinnipedInfo{ - ClusterName: options.ClusterName, - ClusterInfo: clusterInfo, - PinnipedInfo: pinnipedInfo, - }, nil -} - -func getClusterInfo( - regionalClusterClient clusterclient.Client, - clusterName, clusterNamespace string, -) (*clientcmdapi.Cluster, error) { - - kubeconfigData, err := regionalClusterClient.GetKubeConfigForCluster(clusterName, clusterNamespace, nil) - if err != nil { - return nil, fmt.Errorf("failed to get kubeconfig for cluster %s/%s: %w", clusterNamespace, clusterName, err) - } - - config, err := clientcmd.Load(kubeconfigData) - if err != nil { - return nil, errors.Wrap(err, "failed to load the kubeconfig") - } - - if len(config.Clusters) == 0 { - return nil, errors.New("failed to get cluster information") - } - - // since it is a map with one cluster object, get the first entry - var cluster *clientcmdapi.Cluster - for _, cluster = range config.Clusters { - break - } - - return cluster, nil -} - -func stringPtr(s string) *string { return &s } diff --git a/tkg/client/get_cluster_pinniped_info_test.go b/tkg/client/get_cluster_pinniped_info_test.go deleted file mode 100644 index 507971a7f5..0000000000 --- a/tkg/client/get_cluster_pinniped_info_test.go +++ /dev/null @@ -1,466 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "crypto/x509" - "encoding/pem" - "fmt" - "net" - "net/http" - "net/url" - "os" - "strconv" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/ghttp" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" // nolint:staticcheck,nolintlint - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" -) - -var _ = Describe("Unit tests for get cluster pinniped info", func() { - var ( - err error - regionalClusterClient clusterclient.Client - tkgClient *TkgClient - crtClientFactory *fakes.CrtClientFactory - mgmtClusterName string - clusterClientOptions clusterclient.Options - fakeClientSet crtclient.Client - searchNamespace string - kubeconfig string - wlKubeconfig string - endpoint string - wlClusterEndpoint string - tlsServer *ghttp.Server - tlsServerWLCluster *ghttp.Server - issuer string - issuerCA string - servCert *x509.Certificate - clusterPinnipedInfo *ClusterPinnipedInfo - isPacific bool - isClusterClassBased bool - ) - - var ( - fakeIssuer = "https://fakeissuer.com" - fakeCAData = "fakeCAData" - ) - - const ( - wlClusterName = "fake-workload-cluster" - ) - - BeforeEach(func() { - tlsServer = ghttp.NewTLSServer() - servCert = tlsServer.HTTPTestServer.Certificate() - servCertPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - endpoint = tlsServer.URL() - - tlsServerWLCluster = ghttp.NewTLSServer() - wlClusterEndpoint = tlsServerWLCluster.URL() - wlServCert := tlsServer.HTTPTestServer.Certificate() - wlServCertPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: wlServCert.Raw}) - - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - crtClientFactory = &fakes.CrtClientFactory{} - mgmtClusterName = fakeManagementClusterName - searchNamespace = "tkg-system" - clusterClientOptions = clusterclient.NewOptions(getFakePoller(), crtClientFactory, getFakeDiscoveryFactory(), nil) - - // generate fake kubeconfig with testserver url for workload cluster - kubeconfig, err = getFakeKubeConfigFilePathWithServer(testingDir, endpoint, mgmtClusterName, servCertPEM) - Expect(err).NotTo(HaveOccurred()) - wlKubeconfig, err = getFakeKubeConfigFilePathWithServer(testingDir, wlClusterEndpoint, wlClusterName, wlServCertPEM) - Expect(err).NotTo(HaveOccurred()) - }) - - AfterEach(func() { - tlsServer.Close() - tlsServerWLCluster.Close() - }) - - Describe("Get cluster pinniped info for management cluster", func() { - JustBeforeEach(func() { - crtClientFactory.NewClientReturns(fakeClientSet, nil) - regionalClusterClient, err = clusterclient.NewClient(kubeconfig, "dummy-context", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - region := region.RegionContext{ - ContextName: "dummy-context", - } - options := GetClusterPinnipedInfoOptions{ - ClusterName: mgmtClusterName, - Namespace: searchNamespace, - } - clusterPinnipedInfo, err = tkgClient.GetMCClusterPinnipedInfo(regionalClusterClient, region, options) - }) - - Context("When cluster is not found", func() { - BeforeEach(func() { - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).Build() - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal(`failed to get cluster information: failed to get kubeconfig for cluster tkg-system/fake-mgmt-cluster: secrets "fake-mgmt-cluster-kubeconfig" not found`)) - }) - }) - - Context("When cluster kubeconfig is invalid", func() { - BeforeEach(func() { - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects( - createFakeClusterRefObjects(mgmtClusterName, searchNamespace, "some-uid", endpoint, "invalid kubeconfig")...).Build() - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("failed to get cluster information: failed to load the kubeconfig: couldn't get version/kind; json parse error")) - }) - }) - - Context("When pinniped-info is not found in kube-public namespace", func() { - BeforeEach(func() { - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects( - createFakeClusterRefObjects(mgmtClusterName, searchNamespace, "some-uid", endpoint, readFile(kubeconfig))...).Build() - tlsServer.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("failed to get pinniped-info from cluster")) - }) - }) - - Context("When cluster-info and pinniped-info configmap are present in kube-public namespace", func() { - BeforeEach(func() { - var pinnipedInfo string - issuer = fakeIssuer - issuerCA = fakeCAData - pinnipedInfo = fakehelper.GetFakePinnipedInfo(pinnipedinfo.PinnipedInfo{ - ClusterName: mgmtClusterName, - Issuer: issuer, - IssuerCABundleData: issuerCA, - }) - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects( - createFakeClusterRefObjects(mgmtClusterName, searchNamespace, "some-uid", endpoint, readFile(kubeconfig))...).Build() - tlsServer.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusOK, pinnipedInfo), - ), - ) - }) - It("should return the cluster pinniped information successfully", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(clusterPinnipedInfo.ClusterName).To(Equal(mgmtClusterName)) - Expect(clusterPinnipedInfo.ClusterAudience).To(BeNil()) - Expect(clusterPinnipedInfo.ClusterInfo.Server).To(Equal(endpoint)) - Expect(clusterPinnipedInfo.PinnipedInfo.Issuer).To(Equal(issuer)) - Expect(clusterPinnipedInfo.PinnipedInfo.IssuerCABundleData).To(Equal(issuerCA)) - }) - }) - }) - - Describe("Get cluster pinniped info for workload cluster", func() { - JustBeforeEach(func() { - crtClientFactory.NewClientReturns(fakeClientSet, nil) - - regionalClusterClient, err = clusterclient.NewClient(kubeconfig, "dummy-context", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - options := GetClusterPinnipedInfoOptions{ - ClusterName: wlClusterName, - Namespace: constants.DefaultNamespace, - IsManagementCluster: false, - } - clusterPinnipedInfo, err = tkgClient.GetWCClusterPinnipedInfo(regionalClusterClient, region.RegionContext{}, options, isPacific, isClusterClassBased) - }) - - Context("When workload cluster is not found", func() { - BeforeEach(func() { - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).Build() - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal(`failed to get workload cluster information: failed to get kubeconfig for cluster default/fake-workload-cluster: secrets "fake-workload-cluster-kubeconfig" not found`)) - }) - }) - - Context("When workload cluster kubeconfig is invalid", func() { - BeforeEach(func() { - searchNamespace = constants.DefaultNamespace - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects( - createFakeClusterRefObjects("fake-workload-cluster", searchNamespace, "some-uid", endpoint, "invalid kubeconfig")...).Build() - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("failed to get workload cluster information: failed to load the kubeconfig: couldn't get version/kind; json parse error")) - }) - }) - - Context("When management cluster pinniped-info configmap is not present in kube-public namespace", func() { - BeforeEach(func() { - var clusterRefs []runtime.Object - clusterRefs = append(clusterRefs, createFakeClusterRefObjects(wlClusterName, "default", "some-uid", wlClusterEndpoint, readFile(wlKubeconfig))...) - clusterRefs = append(clusterRefs, createFakeClusterRefObjects(mgmtClusterName, "some-uid", searchNamespace, endpoint, readFile(kubeconfig))...) - searchNamespace = constants.DefaultNamespace - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(clusterRefs...).Build() - tlsServer.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("failed to get pinniped-info from management cluster")) - }) - }) - - Context("When WL cluster pinniped-info configmap is not present in kube-public namespace", func() { - BeforeEach(func() { - var clusterRefs []runtime.Object - clusterRefs = append(clusterRefs, createFakeClusterRefObjects(wlClusterName, "default", "some-uid", wlClusterEndpoint, readFile(wlKubeconfig))...) - clusterRefs = append(clusterRefs, createFakeClusterRefObjects(mgmtClusterName, searchNamespace, "some-uid", endpoint, readFile(kubeconfig))...) - pinnipedInfoCM := pinnipedinfo.PinnipedInfo{ - ClusterName: mgmtClusterName, - Issuer: fakeIssuer, - IssuerCABundleData: fakeCAData, - } - // Put fake pinniped-info in management cluster. - pinnipedInfoConfigMap := getPinnipedInfoConfigMapObjectFromPinnipedInfo(pinnipedInfoCM) - - clusterRefs = append(clusterRefs, pinnipedInfoConfigMap) - - searchNamespace = constants.DefaultNamespace - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(clusterRefs...).Build() - - tlsServerWLCluster.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - }) - It("should not return an error and utilize management cluster pinniped info", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(clusterPinnipedInfo.ClusterName).To(Equal(wlClusterName)) - Expect(clusterPinnipedInfo.ClusterAudience).To(BeNil()) - Expect(clusterPinnipedInfo.ClusterInfo.Server).To(Equal(wlClusterEndpoint)) - Expect(clusterPinnipedInfo.PinnipedInfo.Issuer).To(Equal(fakeIssuer)) - Expect(clusterPinnipedInfo.PinnipedInfo.IssuerCABundleData).To(Equal(fakeCAData)) - }) - }) - - Context("When cluster-info and pinniped-info configmap are present in kube-public namespace", func() { - BeforeEach(func() { - var clusterRefs []runtime.Object - clusterRefs = append(clusterRefs, createFakeClusterRefObjects(wlClusterName, "default", "some-uid", wlClusterEndpoint, readFile(wlKubeconfig))...) - clusterRefs = append(clusterRefs, createFakeClusterRefObjects(mgmtClusterName, searchNamespace, "some-uid", endpoint, readFile(kubeconfig))...) - issuer = fakeIssuer - issuerCA = fakeCAData - pinnipedInfoCM := pinnipedinfo.PinnipedInfo{ - ClusterName: mgmtClusterName, - Issuer: issuer, - IssuerCABundleData: issuerCA, - } - clusterRefs = append(clusterRefs, getPinnipedInfoConfigMapObjectFromPinnipedInfo(pinnipedInfoCM)) - - searchNamespace = constants.DefaultNamespace - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(clusterRefs...).Build() - }) - It("should return the cluster pinniped information successfully", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(clusterPinnipedInfo.ClusterName).To(Equal(wlClusterName)) - Expect(clusterPinnipedInfo.ClusterAudience).To(BeNil()) - Expect(clusterPinnipedInfo.ClusterInfo.Server).To(Equal(wlClusterEndpoint)) - Expect(clusterPinnipedInfo.PinnipedInfo.Issuer).To(Equal(issuer)) - Expect(clusterPinnipedInfo.PinnipedInfo.IssuerCABundleData).To(Equal(issuerCA)) - }) - }) - - Context("When we are talking to a pacific cluster", func() { - const wlClusterUID = "some-pacific-cluster-uid" - - BeforeEach(func() { - isPacific = true - - var clusterRefs []runtime.Object - clusterRefs = append(clusterRefs, createFakeClusterRefObjects(wlClusterName, "default", wlClusterUID, wlClusterEndpoint, readFile(wlKubeconfig))...) - clusterRefs = append(clusterRefs, createFakeClusterRefObjects(mgmtClusterName, searchNamespace, "some-uid", endpoint, readFile(kubeconfig))...) - issuer = fakeIssuer - issuerCA = fakeCAData - pinnipedInfoCM := pinnipedinfo.PinnipedInfo{ - ClusterName: mgmtClusterName, - Issuer: issuer, - IssuerCABundleData: issuerCA, - } - clusterRefs = append(clusterRefs, getPinnipedInfoConfigMapObjectFromPinnipedInfo(pinnipedInfoCM)) - - searchNamespace = constants.DefaultNamespace - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(clusterRefs...).Build() - }) - It("should return the cluster pinniped information successfully with a special audience", func() { - wantClusterAudience := fmt.Sprintf("%s-%s", wlClusterName, wlClusterUID) - Expect(err).ToNot(HaveOccurred()) - Expect(clusterPinnipedInfo.ClusterName).To(Equal(wlClusterName)) - Expect(clusterPinnipedInfo.ClusterAudience).To(Equal(&wantClusterAudience)) - Expect(clusterPinnipedInfo.ClusterInfo.Server).To(Equal(wlClusterEndpoint)) - Expect(clusterPinnipedInfo.PinnipedInfo.Issuer).To(Equal(issuer)) - Expect(clusterPinnipedInfo.PinnipedInfo.IssuerCABundleData).To(Equal(issuerCA)) - }) - }) - - Context("When the workload cluster is ClusterClass based", func() { - const wlClusterUID = "some-classy-cluster-uid" - - BeforeEach(func() { - isClusterClassBased = true - - var clusterRefs []runtime.Object - clusterRefs = append(clusterRefs, createFakeClusterRefObjects(wlClusterName, "default", wlClusterUID, wlClusterEndpoint, readFile(wlKubeconfig))...) - clusterRefs = append(clusterRefs, createFakeClusterRefObjects(mgmtClusterName, searchNamespace, "some-uid", endpoint, readFile(kubeconfig))...) - issuer = fakeIssuer - issuerCA = fakeCAData - pinnipedInfoCM := pinnipedinfo.PinnipedInfo{ - ClusterName: mgmtClusterName, - Issuer: issuer, - IssuerCABundleData: issuerCA, - } - clusterRefs = append(clusterRefs, getPinnipedInfoConfigMapObjectFromPinnipedInfo(pinnipedInfoCM)) - - searchNamespace = constants.DefaultNamespace - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(clusterRefs...).Build() - }) - It("should return the cluster pinniped information successfully with a special audience", func() { - wantClusterAudience := fmt.Sprintf("%s-%s", wlClusterName, wlClusterUID) - Expect(err).ToNot(HaveOccurred()) - Expect(clusterPinnipedInfo.ClusterName).To(Equal(wlClusterName)) - Expect(clusterPinnipedInfo.ClusterAudience).To(Equal(&wantClusterAudience)) - Expect(clusterPinnipedInfo.ClusterInfo.Server).To(Equal(wlClusterEndpoint)) - Expect(clusterPinnipedInfo.PinnipedInfo.Issuer).To(Equal(issuer)) - Expect(clusterPinnipedInfo.PinnipedInfo.IssuerCABundleData).To(Equal(issuerCA)) - }) - }) - }) -}) - -func getFakeKubeConfigFilePathWithServer(testingDir, endpoint, clustername string, caData []byte) (string, error) { - kubeconfig := &clientcmdapi.Config{ - Kind: "Config", - APIVersion: clientcmdapi.SchemeGroupVersion.Version, - Clusters: map[string]*clientcmdapi.Cluster{clustername: {Server: endpoint, CertificateAuthorityData: caData}}, //nolint:gofmt - Contexts: map[string]*clientcmdapi.Context{"dummy-context": {Cluster: clustername}}, - CurrentContext: "dummy-context", - } - f, err := os.CreateTemp(testingDir, "kube-*") - if err != nil { - fmt.Println("Error creating TempFile: ", err.Error()) - return "", err - } - err = clientcmd.WriteToFile(*kubeconfig, f.Name()) - if err != nil { - return "", err - } - return f.Name(), nil -} - -// TODO: Should be merged to pkg/fakes/helpers/fakeobjectcreator.go -func createFakeClusterRefObjects(name, namespace, uid, endpoint, kubeconfig string) []runtime.Object { - u, _ := url.Parse(endpoint) - host, port, _ := net.SplitHostPort(u.Host) - portInt32, _ := strconv.ParseInt(port, 10, 32) - - // create a cluster object - cluster := &capi.Cluster{ - TypeMeta: metav1.TypeMeta{ - Kind: "Cluster", - APIVersion: capi.GroupVersion.String(), - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - UID: types.UID(uid), - }, - - Spec: capi.ClusterSpec{ - ControlPlaneEndpoint: capi.APIEndpoint{ - Host: host, - Port: int32(portInt32), - }, - }, - } - - kcp := &controlplanev1.KubeadmControlPlane{ - TypeMeta: metav1.TypeMeta{ - Kind: "KubeadmControlPlane", - APIVersion: controlplanev1.GroupVersion.String(), - }, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - Labels: map[string]string{capi.ClusterLabelName: name}, - }, - } - - kubeconfigSecret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{Namespace: namespace, Name: name + "-kubeconfig"}, - Data: map[string][]byte{"value": []byte(kubeconfig)}, - } - - return []runtime.Object{cluster, kcp, kubeconfigSecret} -} - -func readFile(path string) string { - data, err := os.ReadFile(path) - ExpectWithOffset(1, err).NotTo(HaveOccurred()) - return string(data) -} - -func getPinnipedInfoConfigMapObjectFromPinnipedInfo(pinnipedInfoCM pinnipedinfo.PinnipedInfo) *corev1.ConfigMap { - return &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: "kube-public", - Name: "pinniped-info", - }, - Data: map[string]string{ - "cluster_name": pinnipedInfoCM.ClusterName, - "issuer": pinnipedInfoCM.Issuer, - "issuer_ca_bundle_data": pinnipedInfoCM.IssuerCABundleData, - }, - } -} diff --git a/tkg/client/get_cluster_test.go b/tkg/client/get_cluster_test.go deleted file mode 100644 index 81cf671b9a..0000000000 --- a/tkg/client/get_cluster_test.go +++ /dev/null @@ -1,1049 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "fmt" - "time" - - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "k8s.io/apimachinery/pkg/runtime" - - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" // nolint:staticcheck,nolintlint - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" -) - -var fakeManagementClusterName = "fake-mgmt-cluster" -var fakeTKRName = "v1.1.1---faketkr.1-tkg1" - -var _ = Describe("Unit tests for get clusters", func() { - var ( - err error - regionalClusterClient clusterclient.Client - tkgClient *TkgClient - listOptions *crtclient.ListOptions - crtClientFactory *fakes.CrtClientFactory - includeMC bool - mgmtClusterName string - clusterClientOptions clusterclient.Options - fakeClientSet crtclient.Client - createClusterOptions fakehelper.TestAllClusterComponentOptions - testClusters []runtime.Object - searchNamespace string - kubeconfig string - - clusterInfo []ClusterInfo - ) - - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - crtClientFactory = &fakes.CrtClientFactory{} - includeMC = false - mgmtClusterName = fakeManagementClusterName - kubeconfig = fakehelper.GetFakeKubeConfigFilePath(testingDir, "../fakes/config/kubeconfig/config1.yaml") - - clusterClientOptions = clusterclient.NewOptions(getFakePoller(), crtClientFactory, getFakeDiscoveryFactory(), nil) - }) - - Describe("get clusters tests for CP, Worker count, and Cluster Status", func() { - JustBeforeEach(func() { - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(fakehelper.GetAllCAPIClusterObjects(createClusterOptions)...).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - - regionalClusterClient, err = clusterclient.NewClient(kubeconfig, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - listOptions = &crtclient.ListOptions{} - if searchNamespace != "" { - listOptions.Namespace = searchNamespace - } - clusterInfo, err = tkgClient.GetClusterObjects(regionalClusterClient, listOptions, mgmtClusterName, includeMC) - }) - - Context("When cluster is in deleting state", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - LegacyClusterTKRLabel: fakeTKRName, - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "deleting", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 1, - ReadyReplicas: 1, - UpdatedReplicas: 1, - Replicas: 1, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 1, - ReadyReplicas: 1, - UpdatedReplicas: 1, - Replicas: 1, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseDeleting))) - Expect(clusterInfo[0].TKR).To(Equal(fakeTKRName)) - }) - }) - - Context("When cluster is in creating state: InfrastructureReady=false", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - runv1.LabelTKR: fakeTKRName, - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioning", - InfrastructureReady: false, - ControlPlaneInitialized: false, - ControlPlaneReady: false, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 1, - ReadyReplicas: 0, - UpdatedReplicas: 0, - Replicas: 0, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 1, - ReadyReplicas: 0, - UpdatedReplicas: 0, - Replicas: 0, - }), - MachineOptions: []fakehelper.TestMachineOptions{}, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseCreating))) - Expect(clusterInfo[0].TKR).To(Equal(fakeTKRName)) - }) - }) - - Context("When cluster is in creating state: InfrastructureReady=true ControlPlaneInitialized=false", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioning", - InfrastructureReady: true, - ControlPlaneInitialized: false, - ControlPlaneReady: false, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 1, - ReadyReplicas: 0, - UpdatedReplicas: 0, - Replicas: 0, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 1, - ReadyReplicas: 0, - UpdatedReplicas: 0, - Replicas: 0, - }), - MachineOptions: []fakehelper.TestMachineOptions{}, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseCreating))) - Expect(clusterInfo[0].TKR).To(Equal("")) - }) - }) - - Context("When cluster is in creating state: InfrastructureReady=true ControlPlaneInitialized=true MD.Status.ReadyReplicas=0", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: false, - - OperationType: clusterclient.OperationTypeCreate, - OperationtTimeout: 30 * 60, // 30 minutes - StartTimestamp: time.Now().UTC().Add(-2 * time.Hour).String(), - // Subtract 15 minutes from current time - // indicates more then 30m has not passed from last observed time - // so should still return creating state - LastObservedTimestamp: time.Now().UTC().Add(-15 * time.Minute).String(), - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 1, - UpdatedReplicas: 1, - Replicas: 1, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 0, - UpdatedReplicas: 0, - Replicas: 0, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseCreating))) - }) - }) - - Context("When cluster is in running state: #CP=1 #Worker=1", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - - OperationType: clusterclient.OperationTypeCreate, - OperationtTimeout: 30 * 60, // 30 minutes - StartTimestamp: time.Now().UTC().Add(-2 * time.Hour).String(), - // when cluster is in running state opeationType & lastObserved state - // should not matter even if more then timout time has elapsed - LastObservedTimestamp: time.Now().UTC().Add(-1 * time.Hour).String(), - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 1, - ReadyReplicas: 1, - UpdatedReplicas: 1, - Replicas: 1, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 1, - ReadyReplicas: 1, - UpdatedReplicas: 1, - Replicas: 1, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseRunning))) - }) - }) - - Context("When cluster is in running state: #CP=1 #Worker=0", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - - OperationType: clusterclient.OperationTypeCreate, - OperationtTimeout: 30 * 60, // 30 minutes - StartTimestamp: time.Now().UTC().Add(-2 * time.Hour).String(), - // when cluster is in running state opeationType & lastObserved state - // should not matter even if more then timout time has elapsed - LastObservedTimestamp: time.Now().UTC().Add(-1 * time.Hour).String(), - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 1, - ReadyReplicas: 1, - UpdatedReplicas: 1, - Replicas: 1, - K8sVersion: "v1.18.2+vmware.1", - }, - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal("")) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseRunning))) - }) - }) - - Context("When cluster is in running state #CP=3 #Worker=3", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseRunning))) - }) - }) - - Context("If creation is in stalled state", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - - OperationType: clusterclient.OperationTypeCreate, - OperationtTimeout: 30 * 60, // 30 minutes - StartTimestamp: time.Now().UTC().Add(-2 * time.Hour).String(), - // Subtract 1 hour from current time - // indicates more then 30m has passed from last observed time - LastObservedTimestamp: time.Now().UTC().Add(-time.Hour).String(), - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 0, - UpdatedReplicas: 0, - Replicas: 0, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 0, - UpdatedReplicas: 0, - Replicas: 0, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "provisioning", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseCreationStalled))) - }) - }) - - Context("When cluster is in updating state. All controlplane & worker nodes are not ready", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneReady: false, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 2, - UpdatedReplicas: 2, - Replicas: 2, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 1, - UpdatedReplicas: 1, - Replicas: 1, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseCreating))) - }) - }) - - Context("When cluster is in updating state. Controlplane is ready but worker nodes are not ready", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 1, - UpdatedReplicas: 1, - Replicas: 1, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseUpdating))) - }) - }) - - Context("When cluster is in updating state. Controlplane is ready, All worker machine objects are there but not in running state", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 2, - UpdatedReplicas: 2, - Replicas: 2, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "provisioning", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseUpdating))) - }) - }) - - Context("When cluster is in updating state. Upgrade is under progress. KCP.K8sVersion != Machine.K8sVersion, start of upgrade", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - K8sVersion: "v1.18.3+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: true}, // upgrading - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseUpdating))) - }) - }) - - Context("When cluster is in updating state. Upgrade is under progress. KCP.K8sVersion != Machine.K8sVersion, end Phase of upgrade", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - K8sVersion: "v1.18.3+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 4, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, // old k8s version machine still present - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseUpdating))) - }) - }) - - Context("After upgrade is complete. Cluster should be in running state", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - K8sVersion: "v1.18.3+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.3+vmware.1", IsCP: false}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseRunning))) - }) - }) - - Context("If upgrade is in stalled state, should return status as updateStalled", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - - OperationType: clusterclient.OperationTypeUpgrade, - OperationtTimeout: 30 * 60, // 30 minutes - StartTimestamp: time.Now().UTC().Add(-2 * time.Hour).String(), - // Subtract 1 hour from current time - // indicates more then 30m has passed from last observed time - LastObservedTimestamp: time.Now().UTC().Add(-time.Hour).String(), - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - K8sVersion: "v1.18.3+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "provisioning", K8sVersion: "v1.18.3+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseUpdateStalled))) - Expect(clusterInfo[0].Labels).Should(Equal(createClusterOptions.Labels)) - }) - }) - - Context("When cluster is in running state and Cluster Role label is missing", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{}, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.CPOptions.ReadyReplicas, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Roles).To(Equal([]string{})) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseRunning))) - }) - }) - }) - - Describe("get clusters tests for name and Namespace", func() { - JustBeforeEach(func() { - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(testClusters...).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - regionalClusterClient, err = clusterclient.NewClient(kubeconfig, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - listOptions = &crtclient.ListOptions{} - if searchNamespace != "" { - listOptions.Namespace = searchNamespace - } - clusterInfo, err = tkgClient.GetClusterObjects(regionalClusterClient, listOptions, mgmtClusterName, includeMC) - }) - - Context("When there are 3 clusters in different Namespace and no Namespace is specified", func() { - BeforeEach(func() { - cluster1Objects := fakehelper.CreateDummyClusterObjects("cluster-1", constants.DefaultNamespace) - cluster2Objects := fakehelper.CreateDummyClusterObjects("cluster-2", "test") - mgmtObjects := fakehelper.CreateDummyClusterObjects(mgmtClusterName, "tkg-system") - testClusters = []runtime.Object{} - testClusters = append(testClusters, cluster1Objects...) - testClusters = append(testClusters, cluster2Objects...) - testClusters = append(testClusters, mgmtObjects...) - searchNamespace = "" - }) - It("should not return an error and 2 clusters should be returned and management cluster should not be returned", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(2)) - }) - }) - - Context("When there are 3 clusters in different Namespace and Namespace is specified as test", func() { - BeforeEach(func() { - cluster1Objects := fakehelper.CreateDummyClusterObjects("cluster-1", constants.DefaultNamespace) - cluster2Objects := fakehelper.CreateDummyClusterObjects("cluster-2", "test") - mgmtObjects := fakehelper.CreateDummyClusterObjects(mgmtClusterName, "tkg-system") - testClusters = []runtime.Object{} - testClusters = append(testClusters, cluster1Objects...) - testClusters = append(testClusters, cluster2Objects...) - testClusters = append(testClusters, mgmtObjects...) - searchNamespace = "test" - }) - It("should not return an error and only 1 clusters should be returned and management cluster should not be returned", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - }) - }) - - Context("When there are 3 clusters in different Namespace and Namespace is specified as test", func() { - BeforeEach(func() { - cluster1Objects := fakehelper.CreateDummyClusterObjects("cluster-1", constants.DefaultNamespace) - cluster2Objects := fakehelper.CreateDummyClusterObjects("cluster-2", "test") - mgmtObjects := fakehelper.CreateDummyClusterObjects(mgmtClusterName, "tkg-system") - testClusters = []runtime.Object{} - testClusters = append(testClusters, cluster1Objects...) - testClusters = append(testClusters, cluster2Objects...) - testClusters = append(testClusters, mgmtObjects...) - searchNamespace = "" - includeMC = true - }) - It("should not return an error and 3 clusters should be returned including management cluster", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(3)) - }) - }) - }) - - Describe("get clusters tests for Pacific", func() { - JustBeforeEach(func() { - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(fakehelper.GetAllPacificClusterObjects(createClusterOptions)...).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - regionalClusterClient, err = clusterclient.NewClient(kubeconfig, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - listOptions = &crtclient.ListOptions{} - if searchNamespace != "" { - listOptions.Namespace = searchNamespace - } - clusterInfo, err = tkgClient.GetClusterObjectsForPacific(regionalClusterClient, constants.DefaultPacificClusterAPIVersion, listOptions) - }) - - Context("When cluster is in running state", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - runv1.LabelTKR: fakeTKRName, - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "running", - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 1, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 1, - ReadyReplicas: 1, - }), - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", 1, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseRunning))) - Expect(clusterInfo[0].Labels).Should(Equal(createClusterOptions.Labels)) - Expect(clusterInfo[0].TKR).To(Equal(fakeTKRName)) - }) - }) - - Context("When cluster is in creating state: InfrastructureReady=false", func() { - BeforeEach(func() { - createClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "creating", - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 1, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 1, - ReadyReplicas: 0, - }), - MachineOptions: []fakehelper.TestMachineOptions{}, - } - }) - It("should not return an error and all status should be correct", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(clusterInfo)).To(Equal(1)) - Expect(clusterInfo[0].Name).To(Equal(createClusterOptions.ClusterName)) - Expect(clusterInfo[0].Namespace).To(Equal(createClusterOptions.Namespace)) - Expect(clusterInfo[0].Roles).To(Equal([]string{TkgLabelClusterRoleWorkload})) - Expect(clusterInfo[0].ControlPlaneCount).To(Equal(fmt.Sprintf("%v/%v", 0, createClusterOptions.CPOptions.SpecReplicas))) - Expect(clusterInfo[0].WorkerCount).To(Equal(fmt.Sprintf("%v/%v", createClusterOptions.ListMDOptions[0].ReadyReplicas, createClusterOptions.ListMDOptions[0].SpecReplicas))) - Expect(clusterInfo[0].K8sVersion).To(Equal(createClusterOptions.CPOptions.K8sVersion)) - Expect(clusterInfo[0].Status).To(Equal(string(TKGClusterPhaseCreating))) - Expect(clusterInfo[0].TKR).To(Equal("")) - }) - }) - }) -}) - -// ###################### Test suits initial configuration helper ###################### - -func getFakePoller() *fakes.Poller { - poller := &fakes.Poller{} - poller.PollImmediateWithGetterCalls(func(interval, timeout time.Duration, getterFunc clusterclient.GetterFunc) (interface{}, error) { - return getterFunc() - }) - poller.PollImmediateInfiniteWithGetterCalls(func(interval time.Duration, getterFunc clusterclient.GetterFunc) error { - _, errGetter := getterFunc() - return errGetter - }) - return poller -} - -func getFakeDiscoveryFactory() *fakes.DiscoveryClientFactory { - discoveryClient := &fakes.DiscoveryClient{} - discoveryClientFactory := &fakes.DiscoveryClientFactory{} - discoveryClientFactory.NewDiscoveryClientForConfigReturns(discoveryClient, nil) - return discoveryClientFactory -} diff --git a/tkg/client/get_kubernetes_versions.go b/tkg/client/get_kubernetes_versions.go deleted file mode 100644 index be4da2dffd..0000000000 --- a/tkg/client/get_kubernetes_versions.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "time" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -// KubernetesVersionsInfo kubernetes version info struct -type KubernetesVersionsInfo struct { - Versions []string `json:"versions" yaml:"versions"` -} - -// GetKubernetesVersions get kubernetes version info -func (c *TkgClient) GetKubernetesVersions() (*KubernetesVersionsInfo, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return nil, errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get cluster client") - } - - return c.DoGetTanzuKubernetesReleases(regionalClusterClient) -} - -// DoGetTanzuKubernetesReleases gets TKr -func (c *TkgClient) DoGetTanzuKubernetesReleases(regionalClusterClient clusterclient.Client) (*KubernetesVersionsInfo, error) { - isPacific, err := regionalClusterClient.IsPacificRegionalCluster() - if err == nil && isPacific { - availablek8sVersions, err := regionalClusterClient.GetPacificTanzuKubernetesReleases() - if err != nil { - return nil, errors.Wrap(err, "failed to get supported kubernetes release versions for vSphere with Kubernetes clusters") - } - return &KubernetesVersionsInfo{ - Versions: availablek8sVersions, - }, nil - } - availablek8sVersions, err := c.tkgBomClient.GetAvailableK8sVersionsFromBOMFiles() - if err != nil { - return nil, errors.Wrap(err, "failed to get supported kubernetes version from BOM files") - } - return &KubernetesVersionsInfo{ - Versions: availablek8sVersions, - }, nil -} diff --git a/tkg/client/get_kubernetes_versions_test.go b/tkg/client/get_kubernetes_versions_test.go deleted file mode 100644 index 8aa3152357..0000000000 --- a/tkg/client/get_kubernetes_versions_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "os" - "path/filepath" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -var _ = Describe("Unit tests for GetTanzuKubernetesReleases", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - tkgClient *TkgClient - tkrInfo *KubernetesVersionsInfo - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - }) - - Describe("When management cluster is vSphere with Kubernetes", func() { - BeforeEach(func() { - regionalClusterClient.IsPacificRegionalClusterReturns(true, nil) - }) - Context("When vSphere with Kubernetes TKC API version is not supported", func() { - JustBeforeEach(func() { - regionalClusterClient.GetPacificTanzuKubernetesReleasesReturns(nil, errors.New("fake-error")) - regionalClusterClient.GetPacificTKCAPIVersionReturns("fake-api-versions", nil) - tkrInfo, err = tkgClient.DoGetTanzuKubernetesReleases(regionalClusterClient) - }) - /* - TODO: (chandrareddyp) we need revisit below API Version validation, for now we disabled it. - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("Only %q Tanzu Kubernetes Cluster API version is supported by current version of Tanzu CLI", constants.DefaultPacificClusterAPIVersion))) - }) - */ - }) - Context("When vSphere with Kubernetes does not support tanzukuberenetesrelease objects", func() { - JustBeforeEach(func() { - regionalClusterClient.GetPacificTanzuKubernetesReleasesReturns(nil, errors.New("fake-error")) - regionalClusterClient.GetPacificTKCAPIVersionReturns(constants.DefaultPacificClusterAPIVersion, nil) - tkrInfo, err = tkgClient.DoGetTanzuKubernetesReleases(regionalClusterClient) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to get supported kubernetes release versions for vSphere with Kubernetes clusters")) - }) - }) - - Context("When vSphere with Kubernetes supports tanzukuberenetesrelease objects", func() { - versions := []string{"v1.17.0", "v1.18.1"} - JustBeforeEach(func() { - regionalClusterClient.GetPacificTanzuKubernetesReleasesReturns(versions, nil) - regionalClusterClient.GetPacificTKCAPIVersionReturns(constants.DefaultPacificClusterAPIVersion, nil) - tkrInfo, err = tkgClient.DoGetTanzuKubernetesReleases(regionalClusterClient) - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - It("should correct kubernetes vesions", func() { - Expect(tkrInfo.Versions).To(Equal(versions)) - }) - }) - }) -}) - -func copyAllBoMFilesToTestingDir(listBoMFiles []string, configDir string) { - bomDir, err := tkgconfigpaths.New(configDir).GetTKGBoMDirectory() - Expect(err).ToNot(HaveOccurred()) - err = os.RemoveAll(bomDir) - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - err = os.MkdirAll(bomDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - for _, bomFile := range listBoMFiles { - destFile := filepath.Join(bomDir, filepath.Base(bomFile)) - err = utils.CopyFile(bomFile, destFile) - Expect(err).ToNot(HaveOccurred()) - } -} diff --git a/tkg/client/get_tkrs.go b/tkg/client/get_tkrs.go deleted file mode 100644 index ee4bdbf269..0000000000 --- a/tkg/client/get_tkrs.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "time" - - "github.com/pkg/errors" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -// GetTanzuKubernetesReleases returns TKr list -func (c *TkgClient) GetTanzuKubernetesReleases(tkrName string) ([]runv1alpha1.TanzuKubernetesRelease, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return nil, errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get cluster client") - } - - return regionalClusterClient.GetTanzuKubernetesReleases(tkrName) -} diff --git a/tkg/client/init.go b/tkg/client/init.go deleted file mode 100644 index f6dd07ab32..0000000000 --- a/tkg/client/init.go +++ /dev/null @@ -1,1017 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "fmt" - "os" - "path/filepath" - "strings" - "sync" - "time" - - "github.com/go-openapi/swag" - "github.com/juju/fslock" - "github.com/pkg/errors" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime/schema" - kerrors "k8s.io/apimachinery/pkg/util/errors" - capav1beta2 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" - capzv1beta1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - clusterctl "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/carvelhelpers" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/kind" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfighelper" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/yamlprocessor" -) - -const ( - regionalClusterNamePrefix = "tkg-mgmt" - defaultTkgNamespace = "tkg-system" -) - -const ( - editionAnnotationKey = "edition" - statusRunning = "running" - statusFailed = "failed" - statusSuccessful = "successful" - vsphereVersionError = "the minimum vSphere version supported by Tanzu Kubernetes Grid is vSphere 6.7u3, please upgrade vSphere and try again" -) - -// management cluster init step constants -const ( - StepConfigPrerequisite = "Configure prerequisite" - StepValidateConfiguration = "Validate configuration" - StepGenerateClusterConfiguration = "Generate cluster configuration" - StepSetupBootstrapCluster = "Setup bootstrap cluster" - StepInstallProvidersOnBootstrapCluster = "Install providers on bootstrap cluster" - StepCreateManagementCluster = "Create management cluster" - StepInstallProvidersOnRegionalCluster = "Install providers on management cluster" - StepMoveClusterAPIObjects = "Move cluster-api objects from bootstrap cluster to management cluster" -) - -const ( - cniFeatureFlag = "cni" - editionFeatureFlag = "edition" -) - -// InitRegionSteps management cluster init step sequence -var InitRegionSteps = []string{ - StepConfigPrerequisite, - StepValidateConfiguration, - StepGenerateClusterConfiguration, - StepSetupBootstrapCluster, - StepInstallProvidersOnBootstrapCluster, - StepCreateManagementCluster, - StepInstallProvidersOnRegionalCluster, - StepMoveClusterAPIObjects, -} - -// InitRegionDryRun run management cluster dry-run -func (c *TkgClient) InitRegionDryRun(options *InitRegionOptions) ([]byte, error) { - var ( - regionalConfigBytes []byte - err error - ) - // Obtain management cluster configuration of a provided flavor - if regionalConfigBytes, options.ClusterName, _, err = c.BuildRegionalClusterConfiguration(options); err != nil { - return nil, errors.Wrap(err, "unable to build management cluster configuration") - } - - return regionalConfigBytes, nil -} - -// InitRegion create management cluster -func (c *TkgClient) InitRegion(options *InitRegionOptions) error { //nolint:funlen,gocyclo - var err error - var regionalConfigBytes []byte - var isSuccessful = false - var isStartedRegionalClusterCreation = false - var isBootstrapClusterCreated = false - var bootstrapClusterName string - var regionContext region.RegionContext - var filelock *fslock.Lock - var configFilePath string - - bootstrapClusterKubeconfigPath, err := getTKGKubeConfigPath(false) - if err != nil { - return err - } - - log.SendProgressUpdate(statusRunning, StepValidateConfiguration, InitRegionSteps) - - log.Info("Validating configuration...") - defer func() { - if regionContext != (region.RegionContext{}) { - filelock, err = utils.GetFileLockWithTimeOut(filepath.Join(c.tkgConfigDir, constants.LocalTanzuFileLock), utils.DefaultLockTimeout) - if err != nil { - log.Warningf("cannot acquire lock for updating management cluster configuration, %s", err.Error()) - } - err := c.regionManager.SaveRegionContext(regionContext) - if err != nil { - log.Warningf("Unable to persist management cluster %s info to tkg config", regionContext.ClusterName) - } - - err = c.regionManager.SetCurrentContext(regionContext.ClusterName, regionContext.ContextName) - if err != nil { - log.Warningf("Unable to use context %s as current tkg context", regionContext.ContextName) - } - if err := filelock.Unlock(); err != nil { - log.Warningf("unable to release lock for updating management cluster configuration, %s", err.Error()) - } - } - - if isSuccessful { - log.SendProgressUpdate(statusSuccessful, "", InitRegionSteps) - } else { - log.SendProgressUpdate(statusFailed, "", InitRegionSteps) - } - - // if management cluster creation failed after bootstrap kind cluster was successfully created - if !isSuccessful && isStartedRegionalClusterCreation { - c.displayHelpTextOnFailure(options, isBootstrapClusterCreated, bootstrapClusterKubeconfigPath) - return - } - - if isBootstrapClusterCreated { - if err := c.teardownKindCluster(bootstrapClusterName, bootstrapClusterKubeconfigPath, options.UseExistingCluster); err != nil { - log.Warning(err.Error()) - } - } - _ = utils.DeleteFile(bootstrapClusterKubeconfigPath) - }() - - if customImageRepo, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepository); err != nil && customImageRepo != "" && tkgconfighelper.IsCustomRepository(customImageRepo) { - log.Infof("Using custom image repository: %s", customImageRepo) - } - - c.ensureClusterTopologyConfiguration() - - providerName, _, err := ParseProviderName(options.InfrastructureProvider) - if err != nil { - return errors.Wrap(err, "unable to parse provider name") - } - - // validate docker only if user is not using an existing cluster - // Note: Validating in client code as well to cover the usecase where users use client code instead of command line. - - if err := c.ValidatePrerequisites(!options.UseExistingCluster, true); err != nil { - return err - } - - // validate docker resources if provider is docker - if providerName == "docker" { - if err := c.ValidateDockerResourcePrerequisites(); err != nil { - return err - } - } - - log.Infof("Using infrastructure provider %s", options.InfrastructureProvider) - log.SendProgressUpdate(statusRunning, StepGenerateClusterConfiguration, InitRegionSteps) - log.Info("Generating cluster configuration...") - - log.SendProgressUpdate(statusRunning, StepSetupBootstrapCluster, InitRegionSteps) - log.Info("Setting up bootstrapper...") - // Ensure bootstrap cluster and copy boostrap cluster kubeconfig to ~/kube-tkg directory - if bootstrapClusterName, err = c.ensureKindCluster(options.Kubeconfig, options.UseExistingCluster, bootstrapClusterKubeconfigPath); err != nil { - return errors.Wrap(err, "unable to create bootstrap cluster") - } - - // Configure kubeconfig as part of options as bootstrap cluster kubeconfig - options.Kubeconfig = bootstrapClusterKubeconfigPath - - isBootstrapClusterCreated = true - log.Infof("Bootstrapper created. Kubeconfig: %s", bootstrapClusterKubeconfigPath) - bootStrapClusterClient, err := clusterclient.NewClient(bootstrapClusterKubeconfigPath, "", clusterclient.Options{OperationTimeout: c.timeout}) - if err != nil { - return errors.Wrap(err, "unable to get bootstrap cluster client") - } - bootstrapPkgClient, err := packageclient.NewPackageClientForContext(bootstrapClusterKubeconfigPath, "") - if err != nil { - return errors.Wrap(err, "unable to get a PackageClient") - } - - // configure variables required to deploy providers - if err := c.configureVariablesForProvidersInstallation(nil); err != nil { - return errors.Wrap(err, "unable to configure variables for provider installation") - } - - // If clusterclass feature flag is enabled then deploy kapp-controller - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - log.Info("Installing kapp-controller on bootstrap cluster...") - if err = c.InstallOrUpgradeKappController(bootStrapClusterClient, constants.OperationTypeInstall, false); err != nil { - return errors.Wrap(err, "unable to install kapp-controller to bootstrap cluster") - } - } - - if config.IsFeatureActivated(constants.FeatureFlagManagementClusterDeployInClusterIPAMProvider) && providerName == constants.InfrastructureProviderVSphere { - ipamProvider, err := c.tkgConfigUpdaterClient.CheckInfrastructureVersion("ipam-in-cluster") - if err != nil { - return err - } - options.IPAMProvider = ipamProvider - } - - log.SendProgressUpdate(statusRunning, StepInstallProvidersOnBootstrapCluster, InitRegionSteps) - log.Info("Installing providers on bootstrapper...") - // Initialize bootstrap cluster with providers - if err = c.InitializeProviders(options, bootStrapClusterClient, bootstrapClusterKubeconfigPath); err != nil { - return errors.Wrap(err, "unable to initialize providers") - } - - // If clusterclass feature flag is enabled then deploy management components - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - if err = c.InstallOrUpgradeManagementComponents(bootStrapClusterClient, bootstrapPkgClient, "", false); err != nil { - return errors.Wrap(err, "unable to install management components to bootstrap cluster") - } - - akoRequired, err := c.isAKORequiredInBootstrapCluster() - if err != nil { - return errors.Wrap(err, "unable to check whether avi ha is enabled") - } - if akoRequired { - log.Info("Installing AKO on bootstrapper...") - if err = c.InstallAKO(bootStrapClusterClient); err != nil { - return errors.Wrap(err, "unable to install ako") - } - } - } - - if options.AdditionalTKGManifests != "" { - log.Infof("Apply additional manifests %s for the bootstrap cluster in tkg-system", options.AdditionalTKGManifests) - if err = bootStrapClusterClient.ApplyFileRecursively(options.AdditionalTKGManifests, "tkg-system"); err != nil { - return errors.Wrap(err, "unable to apply additional manifests") - } - } - - // Obtain management cluster configuration of a provided flavor - if regionalConfigBytes, options.ClusterName, configFilePath, err = c.BuildRegionalClusterConfiguration(options); err != nil { - return errors.Wrap(err, "unable to build management cluster configuration") - } - log.Infof("Management cluster config file has been generated and stored at: '%v'", configFilePath) - - isStartedRegionalClusterCreation = true - - targetClusterNamespace := defaultTkgNamespace - if options.Namespace != "" { - targetClusterNamespace = options.Namespace - } - - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - // for cc based cluster, check if tkr/cbt is reconciled to avoid package not found error by addons-controller - tkrName, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableTkrName) - if err != nil { - return errors.Wrap(err, "unable to get tkr name for cluster") - } - log.Infof("Checking Tkr %s in bootstrap cluster...", tkrName) - - pollOptions := &clusterclient.PollOptions{Interval: clusterclient.CheckResourceInterval, Timeout: clusterclient.PackageInstallTimeout} - if err := bootStrapClusterClient.GetResource(&v1alpha3.TanzuKubernetesRelease{}, tkrName, "", nil, pollOptions); err != nil { - return errors.Wrap(err, "unable to check tkr in bootstrap cluster") - } - } - - log.SendProgressUpdate(statusRunning, StepCreateManagementCluster, InitRegionSteps) - log.Info("Start creating management cluster...") - err = c.DoCreateCluster(bootStrapClusterClient, options.ClusterName, targetClusterNamespace, string(regionalConfigBytes)) - if err != nil { - return errors.Wrap(err, "unable to create management cluster") - } - - // save this context to tkg config incase the management cluster creation fails - bootstrapClusterContext := "kind-" + bootstrapClusterName - if options.UseExistingCluster { - bootstrapClusterContext, err = getCurrentContextFromDefaultKubeConfig() - if err != nil { - return err - } - } - regionContext = region.RegionContext{ClusterName: options.ClusterName, ContextName: bootstrapClusterContext, SourceFilePath: bootstrapClusterKubeconfigPath, Status: region.Failed} - - err = bootStrapClusterClient.WaitForControlPlaneAvailable(options.ClusterName, targetClusterNamespace) - if err != nil { - return errors.Wrap(err, "unable to wait for cluster control plane available") - } - log.Info("Management cluster control plane is available, means API server is ready to receive requests") - - kubeConfigBytes, err := bootStrapClusterClient.GetKubeConfigForCluster(options.ClusterName, targetClusterNamespace, nil) - if err != nil { - return errors.Wrapf(err, "unable to extract kube config for cluster %s", options.ClusterName) - } - - regionalClusterKubeconfigPath, err := getTKGKubeConfigPath(true) - if err != nil { - return err - } - // put a filelock to ensure mutual exclusion on updating kubeconfig - filelock, err = utils.GetFileLockWithTimeOut(filepath.Join(c.tkgConfigDir, constants.LocalTanzuFileLock), utils.DefaultLockTimeout) - if err != nil { - return errors.Wrap(err, "cannot acquire lock for updating management cluster kubeconfig") - } - - mergeFile := getDefaultKubeConfigFile() - log.Infof("Saving management cluster kubeconfig into %s", mergeFile) - // merge the management cluster kubeconfig into user input kubeconfig path/default kubeconfig path - err = MergeKubeConfigWithoutSwitchContext(kubeConfigBytes, mergeFile) - if err != nil { - return errors.Wrap(err, "unable to merge management cluster kubeconfig") - } - - // merge the management cluster kubeconfig into tkg managed kubeconfig - kubeContext, err := MergeKubeConfigAndSwitchContext(kubeConfigBytes, regionalClusterKubeconfigPath) - if err != nil { - return errors.Wrap(err, "unable to save management cluster kubeconfig to TKG managed kubeconfig") - } - - if err := filelock.Unlock(); err != nil { - log.Warningf("cannot acquire lock for updating management cluster kubeconfigconfig, reason: %v", err) - } - - regionalClusterClient, err := clusterclient.NewClient(regionalClusterKubeconfigPath, kubeContext, clusterclient.Options{OperationTimeout: c.timeout}) - if err != nil { - return errors.Wrap(err, "unable to get management cluster client") - } - regionalPkgClient, err := packageclient.NewPackageClientForContext(regionalClusterKubeconfigPath, kubeContext) - if err != nil { - return errors.Wrap(err, "unable to get a PackageClient") - } - - // If clusterclass feature flag is enabled then deploy kapp-controller - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - log.Info("Installing kapp-controller on management cluster...") - if err = c.InstallOrUpgradeKappController(regionalClusterClient, constants.OperationTypeInstall, false); err != nil { - return errors.Wrap(err, "unable to install kapp-controller to management cluster") - } - } - - if config.IsFeatureActivated(constants.FeatureFlagManagementClusterDeployInClusterIPAMProvider) && providerName == constants.InfrastructureProviderVSphere { - ipamProvider, err := c.tkgConfigUpdaterClient.CheckInfrastructureVersion("ipam-in-cluster") - if err != nil { - return err - } - options.IPAMProvider = ipamProvider - } - - err = bootStrapClusterClient.WaitForClusterInitialized(options.ClusterName, targetClusterNamespace) - if err != nil { - return errors.Wrap(err, "error waiting for cluster to be provisioned (this may take a few minutes)") - } - - log.SendProgressUpdate(statusRunning, StepInstallProvidersOnRegionalCluster, InitRegionSteps) - log.Info("Installing providers on management cluster...") - if err = c.InitializeProviders(options, regionalClusterClient, regionalClusterKubeconfigPath); err != nil { - return errors.Wrap(err, "unable to initialize providers on management cluster") - } - - if err := regionalClusterClient.PatchClusterAPIAWSControllersToUseEC2Credentials(); err != nil { - return err - } - - // If clusterclass feature flag is enabled then deploy management components to the cluster - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - if err = c.InstallOrUpgradeManagementComponents(regionalClusterClient, regionalPkgClient, kubeContext, false); err != nil { - return errors.Wrap(err, "unable to install management components to management cluster") - } - } - - log.Info("Waiting for the management cluster to get ready for move...") - if err := c.WaitForClusterReadyForMove(bootStrapClusterClient, options.ClusterName, targetClusterNamespace); err != nil { - return errors.Wrap(err, "unable to wait for cluster getting ready for move") - } - - log.Info("Waiting for addons installation...") - if err := c.WaitForAddons(waitForAddonsOptions{ - regionalClusterClient: bootStrapClusterClient, - workloadClusterClient: regionalClusterClient, - clusterName: options.ClusterName, - namespace: options.Namespace, - waitForCNI: true, - }); err != nil { - return errors.Wrap(err, "error waiting for addons to get installed") - } - - if options.AdditionalTKGManifests != "" { - log.Infof("Apply additional manifests %s for the management cluster in %s", options.AdditionalTKGManifests, defaultTkgNamespace) - if err = regionalClusterClient.ApplyFileRecursively(options.AdditionalTKGManifests, defaultTkgNamespace); err != nil { - return errors.Wrap(err, "unable to apply additional manifests") - } - } - - // Applying ClusterBootstrap and its associated resources on the management cluster - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - log.Infof("Applying ClusterBootstrap and its associated resources on management cluster") - if err := c.ApplyClusterBootstrapObjects(bootStrapClusterClient, regionalClusterClient); err != nil { - return errors.Wrap(err, "Unable to apply ClusterBootstarp and its associated resources on management cluster") - } - } - - log.SendProgressUpdate(statusRunning, StepMoveClusterAPIObjects, InitRegionSteps) - log.Info("Moving all Cluster API objects from bootstrap cluster to management cluster...") - // Move all Cluster API objects from bootstrap cluster to created to management cluster for all namespaces - if err = c.MoveObjects(bootstrapClusterKubeconfigPath, regionalClusterKubeconfigPath, targetClusterNamespace); err != nil { - return errors.Wrap(err, "unable to move Cluster API objects from bootstrap cluster to management cluster") - } - - regionContext = region.RegionContext{ClusterName: options.ClusterName, ContextName: kubeContext, SourceFilePath: regionalClusterKubeconfigPath, Status: region.Success} - - err = c.PatchClusterInitOperations(regionalClusterClient, options, targetClusterNamespace) - if err != nil { - return errors.Wrap(err, "unable to patch cluster object") - } - - if err != nil { - return errors.Wrap(err, "unable to parse provider name") - } - - // start CEIP telemetry cronjob if cluster is opt-in - if options.CeipOptIn { - bomConfig, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return errors.Wrapf(err, "failed to get default bom configuration") - } - - httpProxy, httpsProxy, noProxy := "", "", "" - if httpProxy, err = c.TKGConfigReaderWriter().Get(constants.TKGHTTPProxy); err == nil && httpProxy != "" { - httpsProxy, _ = c.TKGConfigReaderWriter().Get(constants.TKGHTTPSProxy) - noProxy, err = c.getFullTKGNoProxy(providerName) - if err != nil { - return err - } - } - - if err = regionalClusterClient.AddCEIPTelemetryJob(options.ClusterName, providerName, bomConfig, "", "", httpProxy, httpsProxy, noProxy); err != nil { - log.Error(err, "Failed to start CEIP telemetry job on management cluster") - - log.Warningf("\nTo have this cluster participate in VMware CEIP:") - log.Warningf("\ttanzu management-cluster ceip-participation set true") - } - } - - if !config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - log.Info("Waiting for additional components to be up and running...") - if err := c.WaitForAddonsDeployments(regionalClusterClient); err != nil { - return err - } - } - - // Wait for packages if the feature-flag is disabled - // We do not need to wait for packages as we have already installed and waited for all - // packages to be deployed during tkg package installation - if !config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - log.Info("Waiting for packages to be up and running...") - if err := c.WaitForPackages(regionalClusterClient, regionalClusterClient, options.ClusterName, targetClusterNamespace, true); err != nil { - log.Warningf("Warning: Management cluster is created successfully, but some packages are failing. %v", err) - } - } - - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - log.Info("Creating tkg-bom versioned ConfigMaps...") - if err := c.CreateOrUpdateVerisionedTKGBom(regionalClusterClient); err != nil { - log.Warningf("Warning: Management cluster is created successfully, but the tkg-bom versioned ConfigMaps creation is failing. %v", err) - } - } - - log.Infof("You can now access the management cluster %s by running 'kubectl config use-context %s'", options.ClusterName, kubeContext) - isSuccessful = true - return nil -} - -// PatchClusterInitOperations Patches cluster -func (c *TkgClient) PatchClusterInitOperations(regionalClusterClient clusterclient.Client, options *InitRegionOptions, targetClusterNamespace string) error { - // Patch management cluster with the TKG version - err := regionalClusterClient.PatchClusterObjectWithTKGVersion(options.ClusterName, targetClusterNamespace, c.tkgBomClient.GetCurrentTKGVersion()) - if err != nil { - return errors.Wrap(err, "unable to patch TKG Version") - } - - // Patch management cluster with the edition used to bootstrap it (e.g. tce or community-edition) - _, err = regionalClusterClient.PatchClusterObjectWithOptionalMetadata(options.ClusterName, targetClusterNamespace, "annotations", map[string]string{editionAnnotationKey: options.Edition}) - if err != nil { - return errors.Wrap(err, "unable to patch edition under annotations") - } - - // Patch management cluster with the provided optional metadata - _, err = regionalClusterClient.PatchClusterObjectWithOptionalMetadata(options.ClusterName, targetClusterNamespace, "annotations", options.Annotations) - if err != nil { - return errors.Wrap(err, "unable to patch optional metadata under annotations") - } - - // Patch management cluster with the provided optional labels - _, err = regionalClusterClient.PatchClusterObjectWithOptionalMetadata(options.ClusterName, targetClusterNamespace, "labels", options.Labels) - if err != nil { - return errors.Wrap(err, "unable to patch optional metadata under labels") - } - - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - // Patch and remove kapp-controller labels from clusterclass resources - err = c.removeKappControllerLabelsFromClusterClassResources(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "unable to remove kapp-controller labels from the clusterclass resources") - } - } - return err -} - -// MoveObjects moves all the Cluster API objects from all the namespaces to a target management cluster. -func (c *TkgClient) MoveObjects(fromKubeconfigPath, toKubeconfigPath, namespace string) error { - moveOptions := clusterctl.MoveOptions{ - FromKubeconfig: clusterctl.Kubeconfig{Path: fromKubeconfigPath}, - ToKubeconfig: clusterctl.Kubeconfig{Path: toKubeconfigPath}, - Namespace: namespace, - } - return c.clusterctlClient.Move(moveOptions) -} - -// ApplyClusterBootstrapObjects renders the ClusterBootstrap and its associated objects from templates and applies them to a target management cluster. -func (c *TkgClient) ApplyClusterBootstrapObjects(fromClusterClient, toClusterClient clusterclient.Client) error { - path, err := c.tkgConfigPathsClient.GetTKGProvidersDirectory() - if err != nil { - return err - } - clusterBootstrapTemplatesDirPath := filepath.Join(path, "yttcb") - configDefaultPath := filepath.Join(path, "config_default.yaml") - - userConfigValuesFile, err := c.getUserConfigVariableValueMapFile(toClusterClient, false) - if err != nil { - return err - } - - defer func() { - // Remove intermediate config files if err is empty - if err == nil { - os.Remove(userConfigValuesFile) - } - }() - - log.V(6).Infof("User ConfigValues File: %v", userConfigValuesFile) - - clusterBootstrapBytes, err := carvelhelpers.ProcessYTTPackage(clusterBootstrapTemplatesDirPath, configDefaultPath, userConfigValuesFile) - if err != nil { - return err - } - - clusterBootstrapString := string(clusterBootstrapBytes) - if len(clusterBootstrapString) > 0 { - - // Before applying ClusterBootstrap need to check if TKR is available. Sometimes it takes some time for the - // TKr to be available. Hence checking for TKr availability before applying ClusterBootstrap - tkr, err := fromClusterClient.GetClusterResolvedTanzuKubernetesRelease() - if tkr == nil || err != nil { - return err // error occurs or management cluster does not have resolved TKR - } - - var toClusterTKR v1alpha3.TanzuKubernetesRelease - pollOptions := &clusterclient.PollOptions{Interval: clusterclient.CheckResourceInterval, Timeout: clusterclient.PackageInstallTimeout} - log.V(6).Infof("Checking if TKr %s is created on management cluster", tkr.Name) - if err := toClusterClient.GetResource(&toClusterTKR, tkr.Name, tkr.Namespace, nil, pollOptions); err != nil { - return err - } - - log.V(6).Infof("Applying ClusterBootstrap: %v", clusterBootstrapString) - if err := toClusterClient.Apply(clusterBootstrapString); err != nil { - return err - } - } - - return nil -} - -// CopyNeededTKRAndOSImages moves the resolved TKR and associated OSImage CR for a Cluster resource -// from namespaceto a target management -func (c *TkgClient) CopyNeededTKRAndOSImages(fromClusterClient, toClusterClient clusterclient.Client) error { - tkr, err := fromClusterClient.GetClusterResolvedTanzuKubernetesRelease() - if tkr == nil { - return err // error occurs or management cluster does not have resolved TKR - } - osImages, err := fromClusterClient.GetClusterResolvedOSImagesFromTKR(tkr) - if err != nil { - return err - } - - // copy the solved TKR if not presented in the cleanup cluster - var toClusterTKR v1alpha3.TanzuKubernetesRelease - if err = toClusterClient.GetResource(&toClusterTKR, tkr.Name, tkr.Namespace, nil, nil); apierrors.IsNotFound(err) { - tkr.SetResourceVersion("") - if err := toClusterClient.CreateResource(tkr, tkr.Name, tkr.Namespace); err != nil { - return err - } - } - - // copy the solved OSImage(s) if not presented in the cleanup cluster - for _, osImage := range osImages { - var toClusterOSImage v1alpha3.OSImage - if err = toClusterClient.GetResource(&toClusterOSImage, osImage.Name, osImage.Namespace, nil, nil); apierrors.IsNotFound(err) { - osImage.SetResourceVersion("") - if err := toClusterClient.CreateResource(&osImage, osImage.Name, osImage.Namespace); err != nil { - return err - } - } - } - return nil -} - -func (c *TkgClient) ensureKindCluster(kubeconfig string, useExistingCluster bool, backupPath string) (string, error) { - // skip if using existing cluster - if useExistingCluster { - if kubeconfig == "" { - kubeconfig = getDefaultKubeConfigFile() - } - - content, err := os.ReadFile(kubeconfig) - if err != nil { - return "", err - } - - err = os.WriteFile(backupPath, content, constants.ConfigFilePermissions) - if err != nil { - return "", err - } - return "", nil - } - - bomConfig, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return "", err - } - - c.kindClient = kind.New(&kind.KindClusterOptions{ - KubeConfigPath: backupPath, - TKGConfigDir: c.tkgConfigDir, - Readerwriter: c.TKGConfigReaderWriter(), - DefaultImageRepo: bomConfig.ImageConfig.ImageRepository, - }) - - // Create kind cluster which will be used to deploy management cluster - clusterName, err := c.kindClient.CreateKindCluster() - if err != nil { - return "", err - } - return clusterName, nil -} - -func (c *TkgClient) teardownKindCluster(clusterName, kubeconfig string, useExistingCluster bool) error { - // skip if using existing cluster - if useExistingCluster { - err := c.clusterctlClient.Delete(clusterctl.DeleteOptions{ - Kubeconfig: clusterctl.Kubeconfig{ - Path: kubeconfig, - }, - DeleteAll: true, - IncludeNamespace: true, - IncludeCRDs: true, - }) - log.V(3).Error(err, "Failed to delete resources from bootstrap cluster") - return nil - } - - bomConfig, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return err - } - - if c.kindClient == nil { - c.kindClient = kind.New(&kind.KindClusterOptions{ - KubeConfigPath: kubeconfig, - ClusterName: clusterName, - TKGConfigDir: c.tkgConfigDir, - DefaultImageRepo: bomConfig.ImageConfig.ImageRepository, - }) - } - - // Delete kind cluster - err = c.kindClient.DeleteKindCluster() - if err != nil { - return err - } - return nil -} - -// InitializeProviders initializes providers -func (c *TkgClient) InitializeProviders(options *InitRegionOptions, clusterClient clusterclient.Client, kubeconfigPath string) error { - infrastructureProviders := []string{options.InfrastructureProvider} - if options.IPAMProvider != "" { - infrastructureProviders = append(infrastructureProviders, options.IPAMProvider) - } - - clusterctlClientInitOptions := clusterctl.InitOptions{ - Kubeconfig: clusterctl.Kubeconfig{Path: kubeconfigPath}, - InfrastructureProviders: infrastructureProviders, - ControlPlaneProviders: []string{options.ControlPlaneProvider}, - BootstrapProviders: []string{options.BootstrapProvider}, - CoreProvider: options.CoreProvider, - TargetNamespace: options.Namespace, - } - - componentsList, err := c.clusterctlClient.Init(clusterctlClientInitOptions) - if err != nil { - return errors.Errorf("%s, this can be possible because of the outbound connectivity issue. Please check deployed nodes for outbound connectivity.", err.Error()) - } - - for _, components := range componentsList { - log.V(3).Info("installed", " Component=", components.Name(), " Type=", components.Type(), " Version=", components.Version()) - } - - if err = clusterClient.CreateNamespace(defaultTkgNamespace); err != nil { - return errors.Wrapf(err, "Unable to create default namespace %s", defaultTkgNamespace) - } - - // Wait for installed providers to get up and running - waitOptions := waitForProvidersOptions{ - Kubeconfig: options.Kubeconfig, - TargetNamespace: options.Namespace, - } - err = c.WaitForProviders(clusterClient, waitOptions) - if err != nil { - return errors.Wrap(err, "error waiting for provider components to be up and running") - } - - return nil -} - -func (c *TkgClient) configureImageTagsForProviderInstallation() error { - // configure image tags by reading BoM file - tkgBoMConfig, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return errors.Wrap(err, "unable to get default BoM configuration") - } - configImageTag := func(configVariable, componentName, imageName string) { - component, exists := tkgBoMConfig.Components[componentName] - if !exists { - log.Warningf("Warning: unable to find component '%s' under BoM", componentName) - return - } - if len(component) == 0 { - log.Warningf("Warning: component '%s' is empty", componentName) - return - } - - image, exists := component[0].Images[imageName] - if !exists { - log.Warningf("Warning: component '%s' does not have image '%s'", componentName, imageName) - return - } - c.TKGConfigReaderWriter().Set(configVariable, image.Tag) - } - - configImageTag(constants.ConfigVariableInternalKubeRBACProxyImageTag, "kube_rbac_proxy", "kubeRbacProxyControllerImageCapi") - configImageTag(constants.ConfigVariableInternalCABPKControllerImageTag, "cluster_api", "cabpkControllerImage") - configImageTag(constants.ConfigVariableInternalCAPIControllerImageTag, "cluster_api", "capiControllerImage") - configImageTag(constants.ConfigVariableInternalKCPControllerImageTag, "cluster_api", "kcpControllerImage") - configImageTag(constants.ConfigVariableInternalCAPDManagerImageTag, "cluster_api", "capdManagerImage") - configImageTag(constants.ConfigVariableInternalCAPAManagerImageTag, "cluster_api_aws", "capaControllerImage") - configImageTag(constants.ConfigVariableInternalCAPVManagerImageTag, "cluster_api_vsphere", "capvControllerImage") - configImageTag(constants.ConfigVariableInternalCAPZManagerImageTag, "cluster-api-provider-azure", "capzControllerImage") - configImageTag(constants.ConfigVariableInternalCAPOCIManagerImageTag, "cluster-api-provider-oci", "capociControllerImage") - configImageTag(constants.ConfigVariableInternalCAPIIPAMProviderInClusterImageTag, "cluster-api-ipam-provider-in-cluster", "capiIPAMProviderInClusterControllerImage") - configImageTag(constants.ConfigVariableInternalNMIImageTag, "aad-pod-identity", "nmiImage") - - return nil -} - -func generateRegionalClusterName(infrastructureProvider, kubeContext string) string { - infra := strings.Split(infrastructureProvider, ":")[0] - - if kubeContext != "" { - return fmt.Sprintf("%s-%s-%s", regionalClusterNamePrefix, infra, kubeContext) - } - - t := time.Now() - return fmt.Sprintf("%s-%s-%s", regionalClusterNamePrefix, infra, t.Format("20060102150405")) -} - -// BuildRegionalClusterConfiguration build management cluster configuration -// returns cluster-configuration bytes, clustername, configFilePath, error if present -func (c *TkgClient) BuildRegionalClusterConfiguration(options *InitRegionOptions) ([]byte, string, string, error) { - var bytes []byte - var err error - var configFilePath string - - if options.ClusterName == "" { - options.ClusterName = generateRegionalClusterName(options.InfrastructureProvider, "") - } - - namespace := options.Namespace - if namespace == "" { - namespace = defaultTkgNamespace - } - - SetClusterClass(c.TKGConfigReaderWriter()) - - controlPlaneMachineCount, workerMachineCount := c.getMachineCountForMC(options.Plan) - - providerRepositorySource := &clusterctl.ProviderRepositorySourceOptions{ - InfrastructureProvider: options.InfrastructureProvider, - Flavor: options.Plan, - } - - clusterConfigOptions := ClusterConfigOptions{ - Kubeconfig: clusterctl.Kubeconfig{Path: options.Kubeconfig}, - ProviderRepositorySource: providerRepositorySource, - TargetNamespace: namespace, - ClusterName: options.ClusterName, - ControlPlaneMachineCount: swag.Int64(int64(controlPlaneMachineCount)), - WorkerMachineCount: swag.Int64(int64(workerMachineCount)), - YamlProcessor: yamlprocessor.NewYttProcessorWithConfigDir(c.tkgConfigDir), - } - - if options.IsInputFileClusterClassBased { - bytes, err = getContentFromInputFile(options.ClusterConfigFile) - } else { - // if dryRunMode is legacy && filterByAddonType is not null, dry run result will be legacy - dryRunMode, _ := c.readerwriterConfigClient.TKGConfigReaderWriter().Get(constants.ConfigVariableDryRunMode) - filter, _ := c.readerwriterConfigClient.TKGConfigReaderWriter().Get(constants.ConfigVariableFilterByAddonType) - if options.GenerateOnly && dryRunMode == "legacy" && filter != "" { - bytes, err = c.getClusterConfiguration(&clusterConfigOptions, true, clusterConfigOptions.ProviderRepositorySource.InfrastructureProvider) - } else { - bytes, err = c.getClusterConfigurationBytes(&clusterConfigOptions, clusterConfigOptions.ProviderRepositorySource.InfrastructureProvider, true) - } - if err != nil { - return bytes, options.ClusterName, "", err - } - clusterConfigDir, err := c.tkgConfigPathsClient.GetClusterConfigurationDirectory() - if err != nil { - return bytes, options.ClusterName, "", err - } - configFilePath = filepath.Join(clusterConfigDir, fmt.Sprintf("%s.yaml", options.ClusterName)) - err = utils.SaveFile(configFilePath, bytes) - if err != nil { - return bytes, options.ClusterName, "", err - } - } - - return bytes, options.ClusterName, configFilePath, err -} - -type waitForProvidersOptions struct { - Kubeconfig string - TargetNamespace string -} - -// WaitForProviders checks and waits for each provider components to be up and running -func (c *TkgClient) WaitForProviders(clusterClient clusterclient.Client, options waitForProvidersOptions) error { - var err error - - if clusterClient == nil { - clusterClient, err = clusterclient.NewClient(options.Kubeconfig, "", clusterclient.Options{OperationTimeout: c.timeout}) - if err != nil { - return errors.Wrap(err, "unable to get deletion cluster client") - } - } - - // Get the all the installed provider info - providers := &clusterctlv1.ProviderList{} - err = clusterClient.ListResources(providers, &crtclient.ListOptions{}) - if err != nil { - return errors.Wrap(err, "cannot get installed provider config") - } - // Wait for each provider(core-provider, bootstrap-provider, infrastructure-providers) to be up and running - var wg sync.WaitGroup - results := make(chan error, len(providers.Items)) - for i := range providers.Items { - wg.Add(1) - go func(wg *sync.WaitGroup, provider clusterctlv1.Provider) { - defer wg.Done() - t, err := TimedExecution(func() error { - log.V(3).Infof("Waiting for provider %s", provider.Name) - providerNameVersion := provider.ProviderName + ":" + provider.Version - return c.waitForProvider(clusterClient, providerNameVersion, provider.Type, options.TargetNamespace) - }) - if err != nil { - log.V(3).Warningf("Failed waiting for provider %v after %v", provider.Name, t) - results <- err - } else { - log.V(3).Infof("Passed waiting on provider %s after %v", provider.Name, t) - } - }(&wg, providers.Items[i]) - } - - wg.Wait() - close(results) - for err := range results { - log.Warning("Failed waiting for at least one provider, check logs for more detail.") - return err - } - log.V(3).Info("Success waiting on all providers.") - return nil -} - -func (c *TkgClient) waitForProvider(clusterClient clusterclient.Client, name, providerType, targetNamespace string) error { - providerOptions := clusterctl.ComponentsOptions{TargetNamespace: targetNamespace} - // get the provider component from clusterctl - providerComponents, err := c.clusterctlClient.GetProviderComponents(name, clusterctlv1.ProviderType(providerType), providerOptions) - if err != nil { - return errors.Wrap(err, "Error getting provider component") - } - - var controllerName string - var namespace string - - // get the deployment name and namespace from the provider - for _, object := range providerComponents.Objs() { - if object.GetKind() == "Deployment" { - controllerName = object.GetName() - namespace = object.GetNamespace() - - err := clusterClient.WaitForDeployment(controllerName, namespace) - if err != nil { - return err - } - } - } - return nil -} - -func (c *TkgClient) displayHelpTextOnFailure(options *InitRegionOptions, - isBootstrapClusterCreated bool, bootstrapClusterKubeconfigPath string) { - - log.Warningf("\n\nFailure while deploying management cluster, Here are some steps to investigate the cause:\n") - log.Warningf("\nDebug:") - log.Warningf(" kubectl get po,deploy,cluster,kubeadmcontrolplane,machine,machinedeployment -A --kubeconfig %s", bootstrapClusterKubeconfigPath) - log.Warningf(" kubectl logs deployment.apps/ -n manager --kubeconfig %s", bootstrapClusterKubeconfigPath) - - if !options.UseExistingCluster && isBootstrapClusterCreated { - log.Warningf("\nTo clean up the resources created by the management cluster:") - log.Warningf(" tanzu management-cluster delete") - } -} - -// ParseHiddenArgsAsFeatureFlags adds the hidden flags from InitRegionOptions as enabled feature flags -func (c *TkgClient) ParseHiddenArgsAsFeatureFlags(options *InitRegionOptions) { - if options.CniType != "" { - options.FeatureFlags = c.safelyAddFeatureFlag(options.FeatureFlags, cniFeatureFlag, options.CniType) - } - if options.Edition != "" { - options.FeatureFlags = c.safelyAddFeatureFlag(options.FeatureFlags, editionFeatureFlag, options.Edition) - } -} - -// SaveFeatureFlags saves the feature flags to the config file via featuresClient -func (c *TkgClient) SaveFeatureFlags(featureFlags map[string]string) error { - err := c.featuresClient.WriteFeatureFlags(featureFlags) - if err != nil { - return errors.Wrap(err, "failed to write feature flags") - } - return nil -} - -// safelyAddFeatureFlag adds an entry to the feature flag map and handles if map is nil -func (c *TkgClient) safelyAddFeatureFlag(featureFlags map[string]string, feature, value string) map[string]string { - if featureFlags != nil { - featureFlags[feature] = value - } else { - featureFlags = map[string]string{feature: value} - } - return featureFlags -} - -// removeKappControllerLabelsFromClusterClassResources removes kapp-controller labels from clusterclass resources -func (c *TkgClient) removeKappControllerLabelsFromClusterClassResources(regionalClusterClient clusterclient.Client) error { - errList := []error{} - labelsToBeDeleted := []string{constants.KappControllerAppLabel, constants.KappControllerAssociationLabel} - gvkToResourcesMap := map[schema.GroupVersionKind]string{ - capi.GroupVersion.WithKind(constants.KindClusterClass): constants.ResourceClusterClass, - controlplanev1.GroupVersion.WithKind(constants.KindKubeadmControlPlaneTemplate): constants.ResourceKubeadmControlPlaneTemplate, - bootstrapv1.GroupVersion.WithKind(constants.KindKubeadmConfigTemplate): constants.ResourceKubeadmConfigTemplate, - capav1beta2.GroupVersion.WithKind(constants.KindAWSClusterTemplate): constants.ResourceAWSClusterTemplate, - capav1beta2.GroupVersion.WithKind(constants.KindAWSMachineTemplate): constants.ResourceAWSMachineTemplate, - capzv1beta1.GroupVersion.WithKind(constants.KindAzureClusterTemplate): constants.ResourceAzureClusterTemplate, - capzv1beta1.GroupVersion.WithKind(constants.KindAzureMachineTemplate): constants.ResourceAzureMachineTemplate, - capvv1beta1.GroupVersion.WithKind(constants.KindVSphereClusterTemplate): constants.ResourceVSphereClusterTemplate, - capvv1beta1.GroupVersion.WithKind(constants.KindVSphereMachineTemplate): constants.ResourceVSphereMachineTemplate, - } - - for gvk, resourceName := range gvkToResourcesMap { - if exists, err := regionalClusterClient.VerifyExistenceOfCRD(resourceName, gvk.Group); err != nil || !exists { - continue - } - errList = append(errList, regionalClusterClient.RemoveMatchingMetadataFromResources(gvk, constants.TkgNamespace, "labels", labelsToBeDeleted)) - } - - return kerrors.NewAggregate(errList) -} - -// isAKORequiredInBootstrapCluster return whether AVI_CONTROL_PLANE_HA_PROVIDER is enabled -func (c *TkgClient) isAKORequiredInBootstrapCluster() (bool, error) { - log.V(5).Info("Get AVI_CONTROL_PLANE_HA_PROVIDER from user config ") - - if p, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereHaProvider); err == nil && p == trueString { - return true, nil - } - return false, nil -} diff --git a/tkg/client/kubevip_update_helper.go b/tkg/client/kubevip_update_helper.go deleted file mode 100644 index fcb12146a8..0000000000 --- a/tkg/client/kubevip_update_helper.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" - - "k8s.io/apimachinery/pkg/runtime" - apimachineryjson "k8s.io/apimachinery/pkg/runtime/serializer/json" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - capikubeadmv1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -const ( - kubeVipName = "kube-vip" - vipLeaseDurationKey = "VIP_LEASEDURATION" - vipRenewDeadlineKey = "VIP_RENEWDEADLINE" - vipRetryPeriodKey = "VIP_RETRYPERIOD" - vipLeaseDuration = "vip_leaseduration" - vipRenewDeadline = "vip_renewdeadline" - vipRetryPeriod = "vip_retryperiod" - defaultLeaseDuration = "15" - defaultRenewDeadline = "10" - defaultRetryPeriod = "2" - defaultNewLeaseDuration = "30" - defaultNewRenewDeadline = "20" - defaultNewRetryPeriod = "4" - kubeVipCpEnableFlag = "cp_enable" - kubeVipArgManager = "manager" - kubeVipCapabilitySysTime = "SYS_TIME" - kubeVipCapabilityNetRaw = "NET_RAW" - kubeVipLocalHost = "127.0.0.1" - kubeVipHostAlias = "kubernetes" - kubeVipConfigPath = "/etc/kubernetes/manifests/kube-vip.yaml" -) - -var ( - ErrUnableToFindKubeVipPodManifest = errors.New("unable to find the kube-vip pod manifest from kcp") -) - -func upgradeKubeVipPodSpec(envVars []corev1.EnvVar, currentKubeVipPod *corev1.Pod, fullImagePath, imageTag string) *corev1.Pod { - envVar := corev1.EnvVar{Name: kubeVipCpEnableFlag, Value: "true"} - envVars = append(envVars, envVar) - currentKubeVipPod.Spec.Containers[0].Env = envVars - // replace arg "start" with "manager" - for index, arg := range currentKubeVipPod.Spec.Containers[0].Args { - if arg == "start" { - currentKubeVipPod.Spec.Containers[0].Args[index] = kubeVipArgManager - } - } - - // Replace capability SYS_TIME with NET_RAW - for index, capability := range currentKubeVipPod.Spec.Containers[0].SecurityContext.Capabilities.Add { - if capability == kubeVipCapabilitySysTime { - currentKubeVipPod.Spec.Containers[0].SecurityContext.Capabilities.Add[index] = kubeVipCapabilityNetRaw - } - } - currentKubeVipPod.Spec.HostAliases = []corev1.HostAlias{ - { - IP: kubeVipLocalHost, - Hostnames: []string{kubeVipHostAlias}, - }, - } - - currentKubeVipPod.Spec.Containers[0].Image = fmt.Sprintf("%s:%s", fullImagePath, imageTag) - - return currentKubeVipPod -} - -func modifyKubeVipTimeout(currentKubeVipPod *corev1.Pod, newLeaseDuration, newRenewDeadline, newRetryPeriod string) ([]corev1.EnvVar, *corev1.Pod) { - var envVars []corev1.EnvVar - for _, envVar := range currentKubeVipPod.Spec.Containers[0].Env { - if envVar.Name == vipLeaseDuration && envVar.Value == defaultLeaseDuration { - log.Infof("Updating Lease Duration") - envVar.Value = newLeaseDuration - } - if envVar.Name == vipRenewDeadline && envVar.Value == defaultRenewDeadline { - log.Infof("Updating Renew Deadline") - envVar.Value = newRenewDeadline - } - if envVar.Name == vipRetryPeriod && envVar.Value == defaultRetryPeriod { - log.Infof("Updating Retry Period") - envVar.Value = newRetryPeriod - } - envVars = append(envVars, envVar) - } - return envVars, currentKubeVipPod -} - -// ModifyKubeVipAndSerialize modifies the time-out and lease duration parameters and serializes it to a string that can be patched -func ModifyKubeVipAndSerialize(currentKubeVipPod *corev1.Pod, newLeaseDuration, newRenewDeadline, newRetryPeriod, fullImagePath, imageTag string) (string, error) { - envVars, currentKubeVipPod := modifyKubeVipTimeout(currentKubeVipPod, newLeaseDuration, newRenewDeadline, newRetryPeriod) - currentKubeVipPod = upgradeKubeVipPodSpec(envVars, currentKubeVipPod, fullImagePath, imageTag) - - log.V(6).Infof("Marshaling kube-vip pod into a byte array") - - var kcpPodByte bytes.Buffer - sc := runtime.NewScheme() - _ = corev1.AddToScheme(sc) - - s := apimachineryjson.NewSerializerWithOptions(apimachineryjson.DefaultMetaFactory, sc, sc, - apimachineryjson.SerializerOptions{Yaml: true, Pretty: false, Strict: false}) - err := s.Encode(currentKubeVipPod, &kcpPodByte) - - if err != nil { - return "", errors.Wrap(err, "unable to marshal modified pod to byte array") - } - - log.V(6).Infof("Modified KCP POD: %s", kcpPodByte.String()) - return kcpPodByte.String(), nil -} - -func (c *TkgClient) getNewKubeVipParameters() (string, string, string) { - newLeaseDuration := defaultNewLeaseDuration - newRenewDeadline := defaultNewRenewDeadline - newRetryPeriod := defaultNewRetryPeriod - - leaseDuration, err := c.TKGConfigReaderWriter().Get(vipLeaseDurationKey) - if err == nil { - newLeaseDuration = leaseDuration - } - - renewDeadline, err := c.TKGConfigReaderWriter().Get(vipRenewDeadlineKey) - if err == nil { - newRenewDeadline = renewDeadline - } - - retryPeriod, err := c.TKGConfigReaderWriter().Get(vipRetryPeriodKey) - if err == nil { - newRetryPeriod = retryPeriod - } - - return newLeaseDuration, newRenewDeadline, newRetryPeriod -} - -// UpdateKubeVipConfigInKCP updates the kube-vip parameters and image tag within the contents of the file inside the KCP -func (c *TkgClient) UpdateKubeVipConfigInKCP(currentKCP *capikubeadmv1beta1.KubeadmControlPlane, upgradeComponentInfo ComponentInfo) (*capikubeadmv1beta1.KubeadmControlPlane, error) { - log.V(6).Info("Updating Kube-vip manifest") - newKCP := currentKCP.DeepCopy() - - currentKubeVipPod, err := c.DecodeKubevipPodManifestFromKCP(currentKCP) - if err != nil { - return nil, errors.Wrap(err, "unable to decode kube-vip manifest from KCP") - } - - log.V(6).Infof("KubeVipPod Name: %s", currentKubeVipPod.Name) - newLeaseDuration, newRenewDeadline, newRetryPeriod := c.getNewKubeVipParameters() - log.V(6).Infof("New Lease Duration %s, New Renew Deadline %s, New Retry Period %s, New Image Tag %s", newLeaseDuration, newRenewDeadline, newRetryPeriod, upgradeComponentInfo.KubeVipTag) - newKCPPod, err := ModifyKubeVipAndSerialize(currentKubeVipPod, newLeaseDuration, newRenewDeadline, newRetryPeriod, upgradeComponentInfo.KubeVipFullImagePath, upgradeComponentInfo.KubeVipTag) - if err != nil { - return nil, errors.Wrap(err, "unable to update kube-vip timeouts") - } - - for i, newFile := range newKCP.Spec.KubeadmConfigSpec.Files { - if newFile.Path == kubeVipConfigPath { - newKCP.Spec.KubeadmConfigSpec.Files[i].Content = newKCPPod - break - } - } - - newKCPByte, err := json.Marshal(&newKCP) - if err != nil { - return nil, errors.Wrap(err, "unable to marshal new KCP to byte array") - } - log.V(6).Info("KCP content after modifying kube-vip config") - log.V(6).Infof(string(newKCPByte)) - - return newKCP, nil -} - -func (c *TkgClient) IsKubevipManifestInKCP(kcp *capikubeadmv1beta1.KubeadmControlPlane) bool { - log.V(6).Infof("Try find kube-vip content from KCP") - for _, curFile := range kcp.Spec.KubeadmConfigSpec.Files { - if curFile.Path == kubeVipConfigPath { - return true - } - } - log.V(6).Infof("Kube-vip manifest not found, assume it's AVI") - return false -} - -func (c *TkgClient) DecodeKubevipPodManifestFromKCP(kcp *capikubeadmv1beta1.KubeadmControlPlane) (*corev1.Pod, error) { - var currentKubeVipPod corev1.Pod - for _, curFile := range kcp.Spec.KubeadmConfigSpec.Files { - log.V(6).Infof("Current KCP Pod: %s", curFile.Content) - log.V(6).Infof("Current KCP Pod Path: %s", curFile.Path) - sc := runtime.NewScheme() - _ = corev1.AddToScheme(sc) - - // kube-vip pod spec has a specific config path - if curFile.Path == kubeVipConfigPath { - log.V(6).Infof("found kube-vip pod manifest") - // it should be one kube-vip pod manifest in each kubeadmControlPlane - s := apimachineryjson.NewSerializerWithOptions(apimachineryjson.DefaultMetaFactory, sc, sc, - apimachineryjson.SerializerOptions{Yaml: true, Pretty: false, Strict: false}) - _, _, err := s.Decode([]byte(curFile.Content), nil, ¤tKubeVipPod) - if err != nil { - return nil, errors.Wrap(err, "unable to unmarshal content to kube-vip pod spec") - } - if currentKubeVipPod.Name != kubeVipName { - return nil, errors.New("pod name is not kube-vip") - } - - return ¤tKubeVipPod, nil - } - } - - return nil, ErrUnableToFindKubeVipPodManifest -} - -func (c *TkgClient) GetKubevipImageAndTag(kcp *capikubeadmv1beta1.KubeadmControlPlane) (string, string, error) { - log.V(6).Infof("get kube-vip pod image and tag from kcp") - kubeVipManifest, err := c.DecodeKubevipPodManifestFromKCP(kcp) - if err != nil { - return "", "", errors.Wrap(err, "failed to get kube-vip manifest") - } - if len(kubeVipManifest.Spec.Containers) != 1 { - return "", "", errors.New("kube-vip pod container should be exact 1") - } - - image := kubeVipManifest.Spec.Containers[0].Image - // only check the last :, since there are case like docker.io/kube-vip:0.3 and 127.0.0.1:8443/kube-vip:0.3 - lastInd := strings.LastIndex(image, ":") - return image[:lastInd], image[lastInd+1:], nil -} diff --git a/tkg/client/kubevip_update_helper_test.go b/tkg/client/kubevip_update_helper_test.go deleted file mode 100644 index 2b64ff468e..0000000000 --- a/tkg/client/kubevip_update_helper_test.go +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "fmt" - "time" - - "sigs.k8s.io/yaml" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - capibootstrapkubeadmv1beta1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" - capikubeadmv1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -var ( - tkgClient *TkgClient - kubeVipImage = "gcr.io/kube-vip" - KubeVipTag = "3.1" - kubevipPodManifest string - kcpManifest *capikubeadmv1beta1.KubeadmControlPlane -) -var _ = Describe("Unit tests for upgrading legacy cluster", func() { - - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Millisecond) - }) - Describe(" Validate DoLegacyClusterUpgrade() block Kubernetes version downgrade", func() { - Context("When image path is from vmware registry", func() { - BeforeEach(func() { - kubeVipImage = "projects.registry.vmware.com/tkg/kube-vip" - KubeVipTag = "v0.3.3_vmware.1" - kubevipPodManifest = getKubevipPodManifest(kubeVipImage, KubeVipTag) - }) - It("succeeds", func() { - imagePath, imageTag, err := tkgClient.GetKubevipImageAndTag(getDummyKCPWithKubevipManifest(constants.KindVSphereMachineTemplate, kubevipPodManifest)) - Expect(err).NotTo(HaveOccurred()) - Expect(kubeVipImage).To(Equal(imagePath)) - Expect(KubeVipTag).To(Equal(imageTag)) - }) - }) - - Context("When image path is from a private registry with port", func() { - BeforeEach(func() { - kubeVipImage = "10.0.0.1:8443/tkg/kube-vip" - KubeVipTag = "v0.3.3_vmware.1" - kubevipPodManifest = getKubevipPodManifest(kubeVipImage, KubeVipTag) - }) - It("succeeds", func() { - imagePath, imageTag, err := tkgClient.GetKubevipImageAndTag(getDummyKCPWithKubevipManifest(constants.KindVSphereMachineTemplate, kubevipPodManifest)) - Expect(err).NotTo(HaveOccurred()) - Expect(kubeVipImage).To(Equal(imagePath)) - Expect(KubeVipTag).To(Equal(imageTag)) - }) - }) - - }) - - Describe("DecodeKubevipPodManifestFromKCP", func() { - - Context("kubevip manifest is correct", func() { - BeforeEach(func() { - kubevipPodManifest = getKubevipPodManifest(kubeVipImage, KubeVipTag) - kcpManifest = getDummyKCPWithKubevipManifest(constants.KindVSphereMachineTemplate, kubevipPodManifest) - }) - It("returns succeeds", func() { - pod, err := tkgClient.DecodeKubevipPodManifestFromKCP(kcpManifest) - Expect(err).NotTo(HaveOccurred()) - Expect(len(pod.Spec.Containers)).To(Equal(1)) - Expect(pod.Spec.Containers[0].Image).To(Equal(fmt.Sprintf("%s:%s", kubeVipImage, KubeVipTag))) - }) - }) - - Context("kubevip manifest is incorrect", func() { - BeforeEach(func() { - kcpManifest = getDummyKCPWithKubevipManifest(constants.KindVSphereMachineTemplate, "wrong") - }) - It("returns an error", func() { - _, err := tkgClient.DecodeKubevipPodManifestFromKCP(kcpManifest) - Expect(err).To(HaveOccurred()) - }) - }) - - Context("avi as control plane ha", func() { - BeforeEach(func() { - kcpManifest = getDummyKCPWithoutKubevip(constants.KindVSphereMachineTemplate) - }) - It("returns an error", func() { - _, err := tkgClient.DecodeKubevipPodManifestFromKCP(kcpManifest) - Expect(err).To(HaveOccurred()) - Expect(err).To(Equal(ErrUnableToFindKubeVipPodManifest)) - }) - }) - }) - - Describe("IsKubevipManifestInKCP", func() { - Context("kube-vip as control plane HA provider", func() { - BeforeEach(func() { - kubevipPodManifest = getKubevipPodManifest(kubeVipImage, KubeVipTag) - kcpManifest = getDummyKCPWithKubevipManifest(constants.KindVSphereMachineTemplate, kubevipPodManifest) - }) - It("returns true", func() { - Expect(tkgClient.IsKubevipManifestInKCP(kcpManifest)).To(BeTrue()) - }) - }) - - Context("avi as control plane HA provider", func() { - BeforeEach(func() { - kcpManifest = getDummyKCPWithoutKubevip(constants.KindVSphereMachineTemplate) - }) - It("returns false", func() { - Expect(tkgClient.IsKubevipManifestInKCP(kcpManifest)).To(BeFalse()) - }) - }) - }) - - Describe("UpdateKubeVipConfigInKCP", func() { - var ( - kcpManifest *capikubeadmv1beta1.KubeadmControlPlane - upgradeComponentInfo ComponentInfo - newKubevipImage = "docker.io/kube-vip" - newKubevipTag = "0.5.7.vmware" - ) - Context("new upgradeComponentInfo contains new image path", func() { - BeforeEach(func() { - upgradeComponentInfo = ComponentInfo{ - KubernetesVersion: "v1.18.0+vmware.2", - KubeVipFullImagePath: newKubevipImage, - KubeVipTag: newKubevipTag, - } - kubevipPodManifest = getKubevipPodManifest(kubeVipImage, KubeVipTag) - kcpManifest = getDummyKCPWithKubevipManifest(constants.KindVSphereMachineTemplate, kubevipPodManifest) - }) - It("succeeds and contains new image and new config", func() { - newKCP, err := tkgClient.UpdateKubeVipConfigInKCP(kcpManifest, upgradeComponentInfo) - Expect(err).To(BeNil()) - Expect(len(newKCP.Spec.KubeadmConfigSpec.Files)).To(Equal(1)) - Expect(newKCP.Spec.KubeadmConfigSpec.Files[0].Content).To(ContainSubstring("value: \"30\"")) - Expect(newKCP.Spec.KubeadmConfigSpec.Files[0].Content).To(ContainSubstring("name: cp_enable")) - Expect(newKCP.Spec.KubeadmConfigSpec.Files[0].Content).To(ContainSubstring("NET_RAW")) - Expect(newKCP.Spec.KubeadmConfigSpec.Files[0].Content).To(ContainSubstring(fmt.Sprintf("%s:%s", newKubevipImage, newKubevipTag))) - }) - }) - }) - - Describe("ModifyKubeVipAndSerialize", func() { - Context("kubevip manifest is correct", func() { - BeforeEach(func() { - kubevipPodManifest = getKubevipPodManifest(kubeVipImage, KubeVipTag) - }) - It("modifies the kube-vip parameters", func() { - pod := corev1.Pod{} - err := yaml.Unmarshal([]byte(kubevipPodManifest), &pod) - Expect(err).To(BeNil()) - - newPodString, err := ModifyKubeVipAndSerialize(&pod, "30", "20", "4", kubeVipImage, KubeVipTag) - Expect(err).To(BeNil()) - - Expect(newPodString).ToNot(BeNil()) - Expect(newPodString).To(ContainSubstring("value: \"30\"")) - Expect(newPodString).To(ContainSubstring("name: cp_enable")) - Expect(newPodString).To(ContainSubstring("NET_RAW")) - }) - }) - }) -}) - -func getDummyKCPWithKubevipManifest(machineTemplateKind, kubevipPodManifest string) *capikubeadmv1beta1.KubeadmControlPlane { - file := capibootstrapkubeadmv1beta1.File{Content: kubevipPodManifest, Path: "/etc/kubernetes/manifests/kube-vip.yaml", Owner: "root:root"} - kcp := &capikubeadmv1beta1.KubeadmControlPlane{} - kcp.Name = "fake-kcp-name" - kcp.Namespace = "fake-kcp-namespace" - kcp.Spec.Version = currentK8sVersion - - kcp.Spec.KubeadmConfigSpec = capibootstrapkubeadmv1beta1.KubeadmConfigSpec{ - ClusterConfiguration: &capibootstrapkubeadmv1beta1.ClusterConfiguration{ - ImageRepository: "fake-image-repo", - DNS: capibootstrapkubeadmv1beta1.DNS{ - ImageMeta: capibootstrapkubeadmv1beta1.ImageMeta{ - ImageRepository: "fake-dns-image-repo", - ImageTag: "fake-dns-image-tag", - }, - }, - Etcd: capibootstrapkubeadmv1beta1.Etcd{ - Local: &capibootstrapkubeadmv1beta1.LocalEtcd{ - ImageMeta: capibootstrapkubeadmv1beta1.ImageMeta{ - ImageRepository: "fake-etcd-image-repo", - ImageTag: "fake-etcd-image-tag", - }, - DataDir: "fake-etcd-data-dir", - }, - }, - }, - Files: []capibootstrapkubeadmv1beta1.File{ - file, - }, - } - - kcp.Spec.MachineTemplate.InfrastructureRef = corev1.ObjectReference{ - Name: "fake-infra-template-name", - Namespace: "fake-infra-template-namespace", - Kind: machineTemplateKind, - } - return kcp -} - -func getKubevipPodManifest(imagePath, imageTag string) string { - kubevipPod := ` -apiVersion: v1 -kind: Pod -metadata: - creationTimestamp: ~ - name: kube-vip - namespace: kube-system -spec: - containers: - - - args: - - start - env: - - - name: vip_arp - value: "true" - - - name: vip_leaderelection - value: "true" - - - name: address - value: "10.180.122.23" - - - name: vip_interface - value: eth0 - - - name: vip_leaseduration - value: "15" - - - name: vip_renewdeadline - value: "10" - - - name: vip_retryperiod - value: "2" - image: "%s:%s" - imagePullPolicy: IfNotPresent - name: kube-vip - resources: {} - securityContext: - capabilities: - add: - - NET_ADMIN - - SYS_TIME - volumeMounts: - - - mountPath: /etc/kubernetes/admin.conf - name: kubeconfig - hostNetwork: true - volumes: - - - hostPath: - path: /etc/kubernetes/admin.conf - type: FileOrCreate - name: kubeconfig -status: {}` - return fmt.Sprintf(kubevipPod, imagePath, imageTag) -} diff --git a/tkg/client/machine_deployment.go b/tkg/client/machine_deployment.go deleted file mode 100644 index 46e1f454d8..0000000000 --- a/tkg/client/machine_deployment.go +++ /dev/null @@ -1,783 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "encoding/json" - "fmt" - "regexp" - "sort" - "strings" - "time" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" - aws "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" - azure "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" - vsphere "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capiv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" - docker "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta1" - - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - "github.com/vmware-tanzu/tanzu-framework/util/topology" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// GetMachineDeploymentOptions a struct describing options for retrieving MachineDeployments -type GetMachineDeploymentOptions struct { - ClusterName string - Name string - Namespace string -} - -// SetMachineDeploymentOptions a struct describing options for creating/updating MachineDeployments -type SetMachineDeploymentOptions struct { - ClusterName string - Namespace string - NodePool -} - -// DeleteMachineDeploymentOptions a struct describing options for DeleteMachineDeployments -type DeleteMachineDeploymentOptions struct { - ClusterName string - Name string - Namespace string -} - -// NodePool a struct describing a node pool -type NodePool struct { - Name string `yaml:"name"` - Replicas *int32 `yaml:"replicas,omitempty"` - AZ string `yaml:"az,omitempty"` - NodeMachineType string `yaml:"nodeMachineType,omitempty"` - WorkerClass string `yaml:"workerClass,omitempty"` - Labels *map[string]string `yaml:"labels,omitempty"` - VSphere VSphereNodePool `yaml:"vsphere,omitempty"` - Taints *[]corev1.Taint `yaml:"taints,omitempty"` - VMClass string `yaml:"vmClass,omitempty"` - StorageClass string `yaml:"storageClass,omitempty"` - TKRResolver string `yaml:"tkrResolver,omitempty"` - Volumes *[]tkgsv1alpha2.Volume `yaml:"volumes,omitempty"` - TKR tkgsv1alpha2.TKRReference `yaml:"tkr,omitempty"` - NodeDrainTimeout *metav1.Duration `yaml:"nodeDrainTimeout,omitempty"` - BaseMachineDeployment string `yaml:"baseMachineDeployment,omitempty"` -} - -// VSphereNodePool a struct describing properties necessary for a node pool on vSphere -type VSphereNodePool struct { - CloneMode string `yaml:"cloneMode,omitempty"` - Datacenter string `yaml:"datacenter,omitempty"` - Datastore string `yaml:"datastore,omitempty"` - StoragePolicyName string `yaml:"storagePolicyName,omitempty"` - Folder string `yaml:"folder,omitempty"` - Network string `yaml:"network,omitempty"` - Nameservers []string `yaml:"nameservers,omitempty"` - TKGIPFamily string `yaml:"tkgIPFamily,omitempty"` - ResourcePool string `yaml:"resourcePool,omitempty"` - VCIP string `yaml:"vcIP,omitempty"` - Template string `yaml:"template,omitempty"` - MemoryMiB int64 `yaml:"memoryMiB,omitempty"` - DiskGiB int32 `yaml:"diskGiB,omitempty"` - NumCPUs int32 `yaml:"numCPUs,omitempty"` -} - -const deploymentNameLabelKey = "cluster.x-k8s.io/deployment-name" - -// SetMachineDeployment sets a MachineDeployment on a cluster. -func (c *TkgClient) SetMachineDeployment(options *SetMachineDeploymentOptions) error { - clusterClient, err := c.getClusterClient() - if err != nil { - return errors.Wrap(err, "Unable to create clusterclient") - } - - ccBased, err := clusterClient.IsClusterClassBased(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrap(err, "unable to determine if cluster is clusterclass based") - } - - if ccBased { - cluster := &capi.Cluster{} - if err := clusterClient.GetResource(cluster, options.ClusterName, options.Namespace, nil, nil); err != nil { - return errors.Wrap(err, "Unable to retrieve cluster resource") - } - skip, err := skipMDCreation(clusterClient, c, cluster, options) - if err != nil { - return err - } - if skip { - return nil - } - return DoSetMachineDeploymentCC(clusterClient, cluster, options) - } - - isPacific, err := clusterClient.IsPacificRegionalCluster() - if err != nil { - return errors.Wrap(err, "error determining Tanzu Kubernetes Cluster service for vSphere management cluster ") - } - if isPacific { - return c.SetNodePoolsForPacificCluster(clusterClient, options) - } - - return DoSetMachineDeployment(clusterClient, options) -} - -// DoSetMachineDeployment sets a MachineDeployment on a cluster given a regional cluster client -func DoSetMachineDeployment(clusterClient clusterclient.Client, options *SetMachineDeploymentOptions) error { //nolint:funlen,gocyclo - workerMDs, err := clusterClient.GetMDObjectForCluster(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrap(err, "error retrieving worker machine deployments") - } - - if len(workerMDs) == 0 { - return apierrors.NewNotFound(schema.GroupResource{Resource: "MachineDeployment"}, "") - } - - baseMD := workerMDs[0] - update := false - for i := range workerMDs { - if workerMDs[i].Name == options.Name { - baseMD = workerMDs[i] - update = true - break - } - if workerMDs[i].Name == options.BaseMachineDeployment { - baseMD = workerMDs[i] - } - } - if !update { - for i := range workerMDs { - if workerMDs[i].Name == options.ClusterName+"-"+options.Name { - baseMD = workerMDs[i] - update = true - break - } - if workerMDs[i].Name == options.BaseMachineDeployment { - baseMD = workerMDs[i] - } - } - } - - if !update && (options.BaseMachineDeployment != "" && baseMD.Name != options.BaseMachineDeployment) { - return errors.Errorf("unable to find base machine deployment with name %s", options.BaseMachineDeployment) - } - - baseMD.Annotations = map[string]string{} - if options.Replicas != nil { - baseMD.Spec.Replicas = options.Replicas - } - - if options.Labels != nil { - for k, v := range *options.Labels { - baseMD.Spec.Template.Labels[k] = v - } - } - - if !update { - if options.BaseMachineDeployment == "" { - log.Warningf("Using machine deployment %s as baseline for new node pool", baseMD.Name) - } - - kcTemplateName := baseMD.Spec.Template.Spec.Bootstrap.ConfigRef.Name - kcTemplate, err := retrieveKubeadmConfigTemplate(clusterClient, kcTemplateName, options.Namespace) - if err != nil { - return errors.Wrap(err, "unable to retrieve kubeadmconfigtemplate") - } - kcTemplate.Annotations = map[string]string{} - kcTemplate.ResourceVersion = "" - - options.Name = fmt.Sprintf("%s-%s", options.ClusterName, options.Name) - machineTemplateName := fmt.Sprintf("%s-mt", options.Name) - kcTemplate.Name = fmt.Sprintf("%s-kct", options.Name) - updateAzureSecret(kcTemplate, machineTemplateName) - - var labelsArg []string - if options.Labels != nil { - for k, v := range *options.Labels { - labelsArg = append(labelsArg, fmt.Sprintf("%s=%s", k, v)) - } - } - sort.Strings(labelsArg) - kcTemplate.Spec.Template.Spec.JoinConfiguration. - NodeRegistration.KubeletExtraArgs["node-labels"] = strings.Join(labelsArg, ",") - if err = clusterClient.CreateResource(kcTemplate, kcTemplate.Name, options.Namespace); err != nil { - return errors.Wrap(err, "could not create kubeadmconfigtemplate") - } - - switch iaasType := baseMD.Spec.Template.Spec.InfrastructureRef.Kind; iaasType { - case constants.KindVSphereMachineTemplate: - err = createVSphereMachineTemplate(clusterClient, &baseMD.Spec.Template.Spec.InfrastructureRef, machineTemplateName, options) - case constants.KindAWSMachineTemplate: - err = createAWSMachineTemplate(clusterClient, &baseMD.Spec.Template.Spec.InfrastructureRef, machineTemplateName, options) - case constants.KindAzureMachineTemplate: - err = createAzureMachineTemplate(clusterClient, &baseMD.Spec.Template.Spec.InfrastructureRef, machineTemplateName, options) - case constants.KindDockerMachineTemplate: - err = createDockerMachineTemplate(clusterClient, &baseMD.Spec.Template.Spec.InfrastructureRef, machineTemplateName, options) - default: - return errors.Errorf("unable to match MachineTemplate type: %s", iaasType) - } - if err != nil { - return err - } - - baseMD.Name = options.Name - baseMD.ResourceVersion = "" - baseMD.Spec.Template.Labels[deploymentNameLabelKey] = options.Name - baseMD.Spec.Selector.MatchLabels[deploymentNameLabelKey] = options.Name - baseMD.Spec.Template.Spec.Bootstrap.ConfigRef.Name = kcTemplate.Name - baseMD.Spec.Template.Spec.InfrastructureRef.Name = machineTemplateName - if options.AZ != "" { - baseMD.Spec.Template.Spec.FailureDomain = &options.AZ - } - - err = clusterClient.CreateResource(&baseMD, baseMD.Name, options.Namespace) - return errors.Wrap(err, "failed to create machinedeployment") - } - - err = clusterClient.UpdateResource(&baseMD, baseMD.Name, options.Namespace) - return errors.Wrap(err, "failed to update machinedeployment") -} - -// SetNodePoolsForPacificCluster sets nodepool for Pacific cluster -func (c *TkgClient) SetNodePoolsForPacificCluster(clusterClient clusterclient.Client, options *SetMachineDeploymentOptions) error { - tkc, err := clusterClient.GetPacificClusterObject(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to get TKC object %q in namespace %q", options.ClusterName, options.Namespace) - } - - nodePools := tkc.Spec.Topology.NodePools - update := false - nodePool := tkgsv1alpha2.NodePool{} - for idx := range nodePools { - if nodePools[idx].Name == options.Name { - nodePool = nodePools[idx] - update = true - } - } - setTKCNodePool(options, &nodePool) - if update { - for idx := range tkc.Spec.Topology.NodePools { - if tkc.Spec.Topology.NodePools[idx].Name == options.Name { - tkc.Spec.Topology.NodePools[idx] = nodePool - break - } - } - err = clusterClient.UpdateResource(tkc, tkc.Name, options.Namespace) - if err != nil { - return errors.Wrapf(err, "failed to update the nodepool %q of TKC %q in namespace %q", options.Name, tkc.Name, options.Namespace) - } - } else { - tkc.Spec.Topology.NodePools = append(tkc.Spec.Topology.NodePools, nodePool) - err = clusterClient.UpdateResource(tkc, tkc.Name, options.Namespace) - if err != nil { - return errors.Wrapf(err, "failed to add the nodepool %q of TKC %q in namespace %q", options.Name, tkc.Name, options.Namespace) - } - } - - return nil -} - -func setTKCNodePool(options *SetMachineDeploymentOptions, nodepool *tkgsv1alpha2.NodePool) { - nodepool.Name = options.Name - if options.Labels != nil { - nodepool.Labels = *options.Labels - } - if options.Taints != nil { - nodepool.Taints = *options.Taints - } - if options.Replicas != nil { - nodepool.Replicas = options.Replicas - } - if options.StorageClass != "" { - nodepool.StorageClass = options.StorageClass - } - if options.VMClass != "" { - nodepool.VMClass = options.VMClass - } - if options.TKR.Reference != nil && options.TKR.Reference.Name != "" { - nodepool.TKR = options.TKR - } - if options.Volumes != nil { - nodepool.Volumes = *options.Volumes - } - if options.NodeDrainTimeout != nil { - nodepool.NodeDrainTimeout = options.NodeDrainTimeout - } -} - -// DeleteMachineDeployment deletes a machine deployment -func (c *TkgClient) DeleteMachineDeployment(options DeleteMachineDeploymentOptions) error { - clusterClient, err := c.getClusterClient() - if err != nil { - return errors.Wrap(err, "Unable to create clusterclient") - } - - ccBased, err := clusterClient.IsClusterClassBased(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrap(err, "unable to determine if cluster is clusterclass based") - } - if ccBased { - var cluster capi.Cluster - if err = clusterClient.GetResource(&cluster, options.ClusterName, options.Namespace, nil, nil); err != nil { - return errors.Wrap(err, "Unable to retrieve cluster resource") - } - return DoDeleteMachineDeploymentCC(clusterClient, &cluster, &options) - } - - isPacific, err := clusterClient.IsPacificRegionalCluster() - if err != nil { - return errors.Wrap(err, "error determining Tanzu Kubernetes Cluster service for vSphere management cluster ") - } - if isPacific { - return c.DeleteNodePoolForPacificCluster(clusterClient, options) - } - - return DoDeleteMachineDeployment(clusterClient, &options) -} - -// DoDeleteMachineDeployment deletes a machine deployment -func DoDeleteMachineDeployment(clusterClient clusterclient.Client, options *DeleteMachineDeploymentOptions) error { //nolint:funlen,gocyclo - workerMDs, err := clusterClient.GetMDObjectForCluster(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrap(err, "unable to get worker machine deployments") - } - - if len(workerMDs) < 2 { - return apierrors.NewBadRequest("cannot delete last worker node pool in cluster") - } - - var toDelete capi.MachineDeployment - var matched bool - for i := range workerMDs { - if workerMDs[i].Name == options.Name { - matched = true - toDelete = workerMDs[i] - break - } - } - if !matched { - for i := range workerMDs { - if workerMDs[i].Name == options.ClusterName+"-"+options.Name { - matched = true - toDelete = workerMDs[i] - break - } - } - } - - if !matched { - return errors.Errorf("could not find node pool %s to delete", options.Name) - } - - kcTemplateName := toDelete.Spec.Template.Spec.Bootstrap.ConfigRef.Name - kcTemplate, err := retrieveKubeadmConfigTemplate(clusterClient, kcTemplateName, options.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to retrieve kubeadmconfigtemplate %s", kcTemplateName) - } - - var deleteCmd func() error - var infraTemplateName string - switch machineKind := toDelete.Spec.Template.Spec.InfrastructureRef.Kind; machineKind { - case constants.KindVSphereMachineTemplate: - var machineTemplate vsphere.VSphereMachineTemplate - infraTemplateName = toDelete.Spec.Template.Spec.InfrastructureRef.Name - err = retrieveMachineTemplate(clusterClient, infraTemplateName, options.Namespace, &machineTemplate) - if err != nil { - return errors.Wrapf(err, "unable to retrieve machine template %s", infraTemplateName) - } - deleteCmd = func() error { - return clusterClient.DeleteResource(&machineTemplate) - } - case constants.KindAWSMachineTemplate: - var machineTemplate aws.AWSMachineTemplate - infraTemplateName = toDelete.Spec.Template.Spec.InfrastructureRef.Name - err = retrieveMachineTemplate(clusterClient, infraTemplateName, options.Namespace, &machineTemplate) - if err != nil { - return errors.Wrap(err, "unable to retrieve machine template") - } - deleteCmd = func() error { - return clusterClient.DeleteResource(&machineTemplate) - } - case constants.KindAzureMachineTemplate: - var machineTemplate azure.AzureMachineTemplate - infraTemplateName = toDelete.Spec.Template.Spec.InfrastructureRef.Name - err = retrieveMachineTemplate(clusterClient, infraTemplateName, options.Namespace, &machineTemplate) - if err != nil { - return errors.Wrap(err, "unable to retrieve machine template") - } - deleteCmd = func() error { - return clusterClient.DeleteResource(&machineTemplate) - } - case constants.KindDockerMachineTemplate: - var machineTemplate docker.DockerMachineTemplate - infraTemplateName = toDelete.Spec.Template.Spec.InfrastructureRef.Name - err = retrieveMachineTemplate(clusterClient, infraTemplateName, options.Namespace, &machineTemplate) - if err != nil { - return errors.Wrapf(err, "unable to retrieve machine template %s", infraTemplateName) - } - deleteCmd = func() error { - return clusterClient.DeleteResource(&machineTemplate) - } - default: - return errors.Errorf("unable to match MachineTemplate type: %s", machineKind) - } - - err = clusterClient.DeleteResource(&toDelete) - if err != nil { - return errors.Wrapf(err, "unable to delete machine deployment %s", toDelete.Name) - } - err = deleteCmd() - if err != nil { - return errors.Wrapf(err, "unable to delete machine template %s", infraTemplateName) - } - err = clusterClient.DeleteResource(kcTemplate) - return errors.Wrapf(err, "unable to delete kubeadmconfigtemplate %s", kcTemplateName) -} - -// DeleteNodePoolForPacificCluster deletes a machine deployment -func (c *TkgClient) DeleteNodePoolForPacificCluster(clusterClient clusterclient.Client, options DeleteMachineDeploymentOptions) error { - tkc, err := clusterClient.GetPacificClusterObject(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to get TKC object %q in namespace %q", options.ClusterName, options.Namespace) - } - - nodePools := tkc.Spec.Topology.NodePools - matched := false - toDeleteNodepolIndex := -1 - for idx := range nodePools { - if nodePools[idx].Name == options.Name { - toDeleteNodepolIndex = idx - matched = true - } - } - - if !matched { - return errors.Errorf("could not find node pool %q to delete", options.Name) - } - - if len(nodePools) < 2 { - return errors.New("cannot delete last worker node pool in cluster") - } - - nodepoolPatch := []clusterclient.JSONPatch{ - { - Op: "remove", - Path: fmt.Sprintf("/spec/topology/nodePools/%d", toDeleteNodepolIndex), - }, - } - - payloadBytes, err := json.Marshal(nodepoolPatch) - if err != nil { - return errors.Wrap(err, "unable to generate json patch") - } - log.V(3).Infof("Applying TanzuKubernetesCluster node pool delete patch: %s", string(payloadBytes)) - err = clusterClient.PatchResource(tkc, options.ClusterName, options.Namespace, string(payloadBytes), types.JSONPatchType, nil) - if err != nil { - return errors.Wrap(err, "unable to apply node pool delete patch for tkc object") - } - - return nil -} - -// GetMachineDeployments retrieves machine deployments for a cluster -func (c *TkgClient) GetMachineDeployments(options GetMachineDeploymentOptions) ([]capi.MachineDeployment, error) { - clusterClient, err := c.getClusterClient() - if err != nil { - return nil, errors.Wrap(err, "Unable to create clusterclient") - } - - ccBased, err := clusterClient.IsClusterClassBased(options.ClusterName, options.Namespace) - if err != nil { - return nil, errors.Wrap(err, "unable to determine if cluster is clusterclass based") - } - if ccBased { - var cluster capi.Cluster - if err = clusterClient.GetResource(&cluster, options.ClusterName, options.Namespace, nil, nil); err != nil { - return nil, errors.Wrap(err, "Unable to retrieve cluster resources") - } - return DoGetMachineDeploymentsCC(clusterClient, &cluster, &options) - } - - isPacific, err := clusterClient.IsPacificRegionalCluster() - if err != nil { - return nil, errors.Wrap(err, "error determining Tanzu Kubernetes Cluster service for vSphere management cluster ") - } - if isPacific { - pacificMds, err := c.GetPacificMachineDeployments(options) - if err != nil { - return nil, err - } - - var mds []capi.MachineDeployment - for i := range pacificMds { - newMd := capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: getNodePoolNameFromMDName(options.ClusterName, pacificMds[i].Name), - Namespace: pacificMds[i].Namespace, - }, - Status: capi.MachineDeploymentStatus{ - Replicas: pacificMds[i].Status.Replicas, - UpdatedReplicas: pacificMds[i].Status.UpdatedReplicas, - ReadyReplicas: pacificMds[i].Status.ReadyReplicas, - AvailableReplicas: pacificMds[i].Status.AvailableReplicas, - UnavailableReplicas: pacificMds[i].Status.UnavailableReplicas, - Phase: pacificMds[i].Status.Phase, - }, - } - mds = append(mds, newMd) - } - return mds, nil - } - - return DoGetMachineDeployments(clusterClient, &options) -} - -// DoGetMachineDeployments retrieves machine deployments for a cluster given a regional cluster client -func DoGetMachineDeployments(clusterClient clusterclient.Client, options *GetMachineDeploymentOptions) ([]capi.MachineDeployment, error) { - workers, err := clusterClient.GetMDObjectForCluster(options.ClusterName, options.Namespace) - if err != nil { - return nil, errors.Wrap(err, "error retrieving machine deployments") - } - - workers, err = NormalizeNodePoolName(workers, options.ClusterName) - if err != nil { - return nil, errors.Wrap(err, "failed to normalize node pool names") - } - - return workers, nil -} - -// GetPacificMachineDeployments retrieves machine deployments for a Pacific(TKGS) cluster -// This is defined separately for Pacific (TKGS) provider because the TKGS and TKGm CAPI versions could be different -// and this should be deprecated after clusterclass is adopted by both TKGm and TKGS -func (c *TkgClient) GetPacificMachineDeployments(options GetMachineDeploymentOptions) ([]capiv1alpha3.MachineDeployment, error) { - clusterClient, err := c.getClusterClient() - if err != nil { - return nil, errors.Wrap(err, "Unable to create clusterclient") - } - - mdList := &capiv1alpha3.MachineDeploymentList{} - if err := clusterClient.GetResourceList(mdList, options.ClusterName, options.Namespace, nil, nil); err != nil { - return nil, errors.Wrap(err, "unable to get machine deployment for the given cluster") - } - if len(mdList.Items) == 0 { - return nil, errors.New("no machine deployment objects found for the given cluster") - } - return mdList.Items, nil -} - -func createVSphereMachineTemplate(clusterClient clusterclient.Client, infraTemplate *corev1.ObjectReference, machineTemplateName string, options *SetMachineDeploymentOptions) error { - var vSphereMachineTemplate vsphere.VSphereMachineTemplate - err := retrieveMachineTemplate(clusterClient, infraTemplate.Name, options.Namespace, &vSphereMachineTemplate) - if err != nil { - return err - } - vSphereMachineTemplate.Annotations = map[string]string{} - vSphereMachineTemplate.Name = machineTemplateName - vSphereMachineTemplate.ResourceVersion = "" - populateVSphereMachineTemplate(&vSphereMachineTemplate, options) - if err = clusterClient.CreateResource(&vSphereMachineTemplate, machineTemplateName, options.Namespace); err != nil { - return errors.Wrap(err, "could not create machine template") - } - return nil -} - -func createAWSMachineTemplate(clusterClient clusterclient.Client, infraTemplate *corev1.ObjectReference, machineTemplateName string, options *SetMachineDeploymentOptions) error { - var awsMachineTemplate aws.AWSMachineTemplate - err := retrieveMachineTemplate(clusterClient, infraTemplate.Name, options.Namespace, &awsMachineTemplate) - if err != nil { - return err - } - awsMachineTemplate.Annotations = map[string]string{} - awsMachineTemplate.Name = machineTemplateName - awsMachineTemplate.ResourceVersion = "" - if options.NodeMachineType != "" { - awsMachineTemplate.Spec.Template.Spec.InstanceType = options.NodeMachineType - } - if err = clusterClient.CreateResource(&awsMachineTemplate, machineTemplateName, options.Namespace); err != nil { - return errors.Wrap(err, "could not create machine template") - } - return nil -} - -func createAzureMachineTemplate(clusterClient clusterclient.Client, infraTemplate *corev1.ObjectReference, machineTemplateName string, options *SetMachineDeploymentOptions) error { - var azureMachineTemplate azure.AzureMachineTemplate - err := retrieveMachineTemplate(clusterClient, infraTemplate.Name, options.Namespace, &azureMachineTemplate) - if err != nil { - return err - } - if options.NodeMachineType != "" { - azureMachineTemplate.Spec.Template.Spec.VMSize = options.NodeMachineType - } - azureMachineTemplate.Name = machineTemplateName - azureMachineTemplate.Annotations = map[string]string{} - azureMachineTemplate.ResourceVersion = "" - - if err = clusterClient.CreateResource(&azureMachineTemplate, machineTemplateName, options.Namespace); err != nil { - return errors.Wrap(err, "could not create machine template") - } - return nil -} - -func createDockerMachineTemplate(clusterClient clusterclient.Client, infraTemplate *corev1.ObjectReference, machineTemplateName string, options *SetMachineDeploymentOptions) error { - var dockerMachineTemplate docker.DockerMachineTemplate - err := retrieveMachineTemplate(clusterClient, infraTemplate.Name, options.Namespace, &dockerMachineTemplate) - if err != nil { - return err - } - dockerMachineTemplate.Annotations = map[string]string{} - dockerMachineTemplate.Name = machineTemplateName - dockerMachineTemplate.ResourceVersion = "" - if err = clusterClient.CreateResource(&dockerMachineTemplate, machineTemplateName, options.Namespace); err != nil { - return errors.Wrap(err, "could not create machine template") - } - return nil -} - -func retrieveMachineTemplate(clusterClient clusterclient.Client, infraTemplateName, infraTemplateNamespace string, machineTemplate interface{}) error { - err := clusterClient.GetResource(machineTemplate, infraTemplateName, infraTemplateNamespace, nil, nil) - if err != nil { - return err - } - - return nil -} - -func retrieveKubeadmConfigTemplate(clusterClient clusterclient.Client, kcTemplateName, kcTemplateNamespace string) (*v1beta1.KubeadmConfigTemplate, error) { - var kcTemplate v1beta1.KubeadmConfigTemplate - err := clusterClient.GetResource(&kcTemplate, kcTemplateName, kcTemplateNamespace, nil, nil) - if err != nil { - return nil, err - } - - return &kcTemplate, nil -} - -func populateVSphereMachineTemplate(machineTemplate *vsphere.VSphereMachineTemplate, options *SetMachineDeploymentOptions) { //nolint: gocyclo - if options.VSphere.CloneMode != "" { - machineTemplate.Spec.Template.Spec.CloneMode = vsphere.CloneMode(options.VSphere.CloneMode) - } - if options.VSphere.Datacenter != "" { - machineTemplate.Spec.Template.Spec.Datacenter = options.VSphere.Datacenter - } - if options.VSphere.Datastore != "" { - machineTemplate.Spec.Template.Spec.Datastore = options.VSphere.Datastore - } - if options.VSphere.DiskGiB != 0 { - machineTemplate.Spec.Template.Spec.DiskGiB = options.VSphere.DiskGiB - } - if options.VSphere.Folder != "" { - machineTemplate.Spec.Template.Spec.Folder = options.VSphere.Folder - } - if options.VSphere.MemoryMiB != 0 { - machineTemplate.Spec.Template.Spec.MemoryMiB = options.VSphere.MemoryMiB - } - if options.VSphere.NumCPUs != 0 { - machineTemplate.Spec.Template.Spec.NumCPUs = options.VSphere.NumCPUs - } - if options.VSphere.ResourcePool != "" { - machineTemplate.Spec.Template.Spec.ResourcePool = options.VSphere.ResourcePool - } - if options.VSphere.VCIP != "" { - machineTemplate.Spec.Template.Spec.Server = options.VSphere.VCIP - } - if options.VSphere.Template != "" { - machineTemplate.Spec.Template.Spec.Template = options.VSphere.Template - } - if options.VSphere.Network != "" { - machineTemplate.Spec.Template.Spec.Network = vsphere.NetworkSpec{ - Devices: []vsphere.NetworkDeviceSpec{ - { - NetworkName: options.VSphere.Network, - }, - }, - } - if len(options.VSphere.Nameservers) > 0 { - machineTemplate.Spec.Template.Spec.Network.Devices[0].Nameservers = options.VSphere.Nameservers - } - if strings.Contains(options.VSphere.TKGIPFamily, "ipv4") { - machineTemplate.Spec.Template.Spec.Network.Devices[0].DHCP4 = true - } - if strings.Contains(options.VSphere.TKGIPFamily, "ipv6") { - machineTemplate.Spec.Template.Spec.Network.Devices[0].DHCP6 = true - } - // default to ipv4 if no valid value was provided - if !machineTemplate.Spec.Template.Spec.Network.Devices[0].DHCP4 && - !machineTemplate.Spec.Template.Spec.Network.Devices[0].DHCP6 { - machineTemplate.Spec.Template.Spec.Network.Devices[0].DHCP4 = true - } - } -} - -func (c *TkgClient) getClusterClient() (clusterclient.Client, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return nil, errors.Wrap(err, "not a valid management cluster") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - clusterClient, err := c.clusterClientFactory.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return nil, errors.Wrap(err, "Unable to create clusterclient") - } - return clusterClient, nil -} - -// NormalizeNodePoolName takes a list of machine deployments and strips the cluster name prepend from the name if present -func NormalizeNodePoolName(workers []capi.MachineDeployment, clusterName string) ([]capi.MachineDeployment, error) { - nameMatcher, err := regexp.Compile(fmt.Sprintf("(?:(?:%s)?-)?(?P<0>.*)", regexp.QuoteMeta(clusterName))) - if err != nil { - return nil, err - } - for i := range workers { - groups := nameMatcher.FindStringSubmatch(workers[i].Name) - if len(groups) == 2 { - workers[i].Name = groups[1] - } - } - - return workers, nil -} - -func getNodePoolNameFromMDName(clusterName, mdName string) string { - // Pacific(TKGS) creates a corresponding MachineDeployment for a nodepool in - // the format {tkc-clustername}-{nodepool-name}-{randomstring} - trimmedName := strings.TrimPrefix(mdName, fmt.Sprintf("%s-", clusterName)) - lastHypenIdx := strings.LastIndex(trimmedName, "-") - if lastHypenIdx == -1 { - return "" - } - nodepoolName := trimmedName[:lastHypenIdx] - return nodepoolName -} - -func updateAzureSecret(kcTemplate *v1beta1.KubeadmConfigTemplate, machineTemplateName string) { - if kcTemplate.Spec.Template.Spec.Files != nil && len(kcTemplate.Spec.Template.Spec.Files) > 0 { - for i := range kcTemplate.Spec.Template.Spec.Files { - if kcTemplate.Spec.Template.Spec.Files[i].Path == "/etc/kubernetes/azure.json" { - kcTemplate.Spec.Template.Spec.Files[i].ContentFrom.Secret.Name = machineTemplateName + "-azure-json" - } - } - } -} - -func skipMDCreation(clusterClient clusterclient.Client, c *TkgClient, cluster *capi.Cluster, options *SetMachineDeploymentOptions) (bool, error) { - if topology.IsSingleNodeCluster(cluster) && c.IsFeatureActivated(constants.FeatureFlagSingleNodeClusters) { - return true, nil - } else if topology.HasWorkerNodes(cluster) { - return false, errors.New("cluster topology workers are not set. please repair your cluster before trying again") - } - - return false, nil -} diff --git a/tkg/client/machine_deployment_cc.go b/tkg/client/machine_deployment_cc.go deleted file mode 100644 index a0ab9a48b2..0000000000 --- a/tkg/client/machine_deployment_cc.go +++ /dev/null @@ -1,374 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "bytes" - "encoding/json" - "fmt" - - capi "sigs.k8s.io/cluster-api/api/v1beta1" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/util/topology" -) - -const ( - NodePoolLabelsName string = "nodePoolLabels" - NodePoolTaintsName string = "nodePoolTaints" -) - -//nolint:funlen,gocyclo -func DoSetMachineDeploymentCC(clusterClient clusterclient.Client, cluster *capi.Cluster, options *SetMachineDeploymentOptions) error { - var update *capi.MachineDeploymentTopology - var base *capi.MachineDeploymentTopology - - mdIndex := -1 - for i := range cluster.Spec.Topology.Workers.MachineDeployments { - if cluster.Spec.Topology.Workers.MachineDeployments[i].Name == options.Name { - update = &cluster.Spec.Topology.Workers.MachineDeployments[i] - mdIndex = i - } - if cluster.Spec.Topology.Workers.MachineDeployments[i].Name == options.BaseMachineDeployment { - base = cluster.Spec.Topology.Workers.MachineDeployments[i].DeepCopy() - } - } - - if update != nil && base != nil { - return errors.New("can not specify a base machine deployment when updating a node pool") - } - - if update != nil { - base = update - } else { - if base == nil { - if options.NodePool.WorkerClass == "" || options.TKRResolver == "" { - return errors.New("workerClass and tkrResolver are required for new node pools without a baseMachineDeployment") - } - base = &capi.MachineDeploymentTopology{ - Metadata: capi.ObjectMeta{ - Annotations: map[string]string{}, - }, - } - if options.Replicas == nil { - base.Replicas = func(i int32) *int32 { return &i }(1) // default new node pool to 1 replica if not specified - } - } - - cluster.Spec.Topology.Workers.MachineDeployments = append(cluster.Spec.Topology.Workers.MachineDeployments, *base) - base = &cluster.Spec.Topology.Workers.MachineDeployments[len(cluster.Spec.Topology.Workers.MachineDeployments)-1] - mdIndex = len(cluster.Spec.Topology.Workers.MachineDeployments) - 1 - } - - base.Name = options.Name - - if options.Replicas != nil { - base.Replicas = options.Replicas - } - - if options.WorkerClass != "" { - base.Class = options.WorkerClass - } - - if options.TKRResolver != "" { - base.Metadata.Annotations["run.tanzu.vmware.com/resolve-os-image"] = options.TKRResolver - } - - if base.Variables == nil { - base.Variables = &capi.MachineDeploymentVariables{} - } - - if base.Variables.Overrides == nil { - base.Variables.Overrides = make([]capi.ClusterVariable, 0, 5) - } - - if options.Labels != nil { - var labels []map[string]string - if err := topology.GetMDVariable(cluster, mdIndex, NodePoolLabelsName, &labels); err != nil { - return errors.Errorf("unable to find or marshal variable with name %s", NodePoolLabelsName) - } - - for k, v := range *options.Labels { - labels = append(labels, map[string]string{ - "key": k, - "value": v, - }) - } - - if err := topology.SetMDVariable(cluster, mdIndex, NodePoolLabelsName, labels); err != nil { - return errors.Errorf("unable to set variable with name %s", NodePoolLabelsName) - } - } - - if options.Taints != nil { - if err := topology.SetMDVariable(cluster, mdIndex, NodePoolTaintsName, &options.Taints); err != nil { - return errors.Errorf("unable to set variable with name %s", NodePoolTaintsName) - } - } - - if update != nil { - return clusterClient.UpdateResource(cluster, options.ClusterName, options.Namespace) - } - - return createNewMachineDeployment(clusterClient, cluster, options, base) -} - -//nolint:gocyclo -func createNewMachineDeployment(clusterClient clusterclient.Client, cluster *capi.Cluster, options *SetMachineDeploymentOptions, base *capi.MachineDeploymentTopology) error { - if options.NodeMachineType != "" { - var workerVariable = getClusterVariableByName("worker", base.Variables.Overrides) - if workerVariable == nil { - workerVariable = getClusterVariableByName("worker", cluster.Spec.Topology.Variables).DeepCopy() - base.Variables.Overrides = append(base.Variables.Overrides, *workerVariable) - workerVariable = &base.Variables.Overrides[len(base.Variables.Overrides)-1] - } - - var worker map[string]interface{} - if err := json.NewDecoder(bytes.NewBuffer(workerVariable.Value.Raw)).Decode(&worker); err != nil { - return errors.New("unable to unmarshal worker") - } - - if _, ok := worker["instanceType"]; ok { - worker["instanceType"] = options.NodeMachineType - } else if _, ok := worker["vmSize"]; ok { - worker["vmSize"] = options.NodeMachineType - } - - output, _ := json.Marshal(worker) - workerVariable.Value.Raw = output - } - - if options.AZ != "" { - base.FailureDomain = &options.AZ - } - - if options.VMClass != "" { - var vmClassVariable = getClusterVariableByName("vmClass", base.Variables.Overrides) - if vmClassVariable == nil { - vmClassVariable = getClusterVariableByName("vmClass", cluster.Spec.Topology.Variables).DeepCopy() - base.Variables.Overrides = append(base.Variables.Overrides, *vmClassVariable) - vmClassVariable = &base.Variables.Overrides[len(base.Variables.Overrides)-1] - } - - output, _ := json.Marshal(options.VMClass) - vmClassVariable.Value.Raw = output - } - - if options.StorageClass != "" { - var storageClassVariable = getClusterVariableByName("storageClass", base.Variables.Overrides) - if storageClassVariable == nil { - storageClassVariable = getClusterVariableByName("storageClass", cluster.Spec.Topology.Variables).DeepCopy() - base.Variables.Overrides = append(base.Variables.Overrides, *storageClassVariable) - storageClassVariable = &base.Variables.Overrides[len(base.Variables.Overrides)-1] - } - - output, _ := json.Marshal(options.StorageClass) - storageClassVariable.Value.Raw = output - } - - if options.Volumes != nil { - var volumesVariable = getClusterVariableByName("nodePoolVolumes", base.Variables.Overrides) - if volumesVariable == nil { - volumesVariable = getClusterVariableByName("nodePoolVolumes", cluster.Spec.Topology.Variables).DeepCopy() - base.Variables.Overrides = append(base.Variables.Overrides, *volumesVariable) - volumesVariable = &base.Variables.Overrides[len(base.Variables.Overrides)-1] - } - - var volumes []map[string]interface{} - - for _, vol := range *options.Volumes { - volumes = append(volumes, map[string]interface{}{ - "mountPath": vol.MountPath, - "name": vol.Name, - "capacity": map[string]interface{}{ - "storage": vol.Capacity.Storage(), - }, - }) - } - - output, _ := json.Marshal(volumes) - volumesVariable.Value.Raw = output - } - - if err := setVSphereWorkerOptions(options, base, cluster); err != nil { - return err - } - - if err := setVSphereVCenterOptions(options, base, cluster); err != nil { - return err - } - - return clusterClient.UpdateResource(cluster, options.ClusterName, options.Namespace) -} - -//nolint:gocyclo -func setVSphereVCenterOptions(options *SetMachineDeploymentOptions, base *capi.MachineDeploymentTopology, cluster *capi.Cluster) error { - if options.VSphere.CloneMode != "" || options.VSphere.Datacenter != "" || options.VSphere.Datastore != "" || - options.VSphere.Folder != "" || options.VSphere.Network != "" || options.VSphere.ResourcePool != "" || - options.VSphere.StoragePolicyName != "" || options.VSphere.VCIP != "" { - var vcenterVariable = getClusterVariableByName("vcenter", base.Variables.Overrides) - if vcenterVariable == nil { - vcenterVariable = getClusterVariableByName("vcenter", cluster.Spec.Topology.Variables).DeepCopy() - base.Variables.Overrides = append(base.Variables.Overrides, *vcenterVariable) - vcenterVariable = &base.Variables.Overrides[len(base.Variables.Overrides)-1] - } - - var vcenter map[string]interface{} - if err := json.NewDecoder(bytes.NewBuffer(vcenterVariable.Value.Raw)).Decode(&vcenter); err != nil { - return errors.New("unable to unmarshal vcenter") - } - - if options.VSphere.CloneMode != "" { - vcenter["cloneMode"] = options.VSphere.CloneMode - } - - if options.VSphere.Datacenter != "" { - vcenter["datacenter"] = options.VSphere.Datacenter - } - - if options.VSphere.Datastore != "" { - vcenter["datastore"] = options.VSphere.Datastore - } - - if options.VSphere.Folder != "" { - vcenter["folder"] = options.VSphere.Folder - } - - if options.VSphere.Network != "" { - vcenter["network"] = options.VSphere.Network - } - - if options.VSphere.ResourcePool != "" { - vcenter["resourcePool"] = options.VSphere.ResourcePool - } - - if options.VSphere.StoragePolicyName != "" { - vcenter["storagePolicyName"] = options.VSphere.StoragePolicyName - } - - if options.VSphere.VCIP != "" { - vcenter["server"] = options.VSphere.VCIP - } - - output, _ := json.Marshal(vcenter) - vcenterVariable.Value.Raw = output - } - - return nil -} - -func setVSphereWorkerOptions(options *SetMachineDeploymentOptions, base *capi.MachineDeploymentTopology, cluster *capi.Cluster) error { - if options.VSphere.NumCPUs > 0 || options.VSphere.DiskGiB > 0 || options.VSphere.MemoryMiB > 0 || len(options.VSphere.Nameservers) > 0 { - var workerVariable = getClusterVariableByName("worker", base.Variables.Overrides) - if workerVariable == nil { - workerVariable = getClusterVariableByName("worker", cluster.Spec.Topology.Variables).DeepCopy() - base.Variables.Overrides = append(base.Variables.Overrides, *workerVariable) - workerVariable = &base.Variables.Overrides[len(base.Variables.Overrides)-1] - } - - var worker map[string]interface{} - if err := json.NewDecoder(bytes.NewBuffer(workerVariable.Value.Raw)).Decode(&worker); err != nil { - return errors.New("unable to unmarshal worker") - } - - if machineInterface, ok := worker["machine"]; ok { - if machine, ok := machineInterface.(map[string]interface{}); ok { - if options.VSphere.NumCPUs > 0 { - machine["numCPUs"] = options.VSphere.NumCPUs - } - if options.VSphere.DiskGiB > 0 { - machine["diskGiB"] = options.VSphere.DiskGiB - } - if options.VSphere.MemoryMiB > 0 { - machine["memoryMiB"] = options.VSphere.MemoryMiB - } - worker["machine"] = machine - } - } - - if networkInterface, ok := worker["network"]; ok { - if network, ok := networkInterface.(map[string]interface{}); ok { - if len(options.VSphere.Nameservers) > 0 { - network["nameservers"] = options.VSphere.Nameservers - } - worker["network"] = network - } - } - - output, _ := json.Marshal(worker) - workerVariable.Value.Raw = output - } - - return nil -} - -func DoDeleteMachineDeploymentCC(clusterClient clusterclient.Client, cluster *capi.Cluster, options *DeleteMachineDeploymentOptions) error { - var mds []capi.MachineDeploymentTopology - for _, machineDeployment := range cluster.Spec.Topology.Workers.MachineDeployments { - if machineDeployment.Name != options.Name { - mds = append(mds, machineDeployment) - } - } - - if len(mds) == 0 { - return errors.New("unable to delete last node pool") - } - - if len(mds) == len(cluster.Spec.Topology.Workers.MachineDeployments) { - return fmt.Errorf("could not find node pool %s to delete", options.Name) - } - - cluster.Spec.Topology.Workers.MachineDeployments = mds - - if err := clusterClient.UpdateResource(cluster, cluster.Name, cluster.Namespace); err != nil { - return fmt.Errorf("unable to delete node pools on cluster %s", options.ClusterName) - } - - return nil -} - -func DoGetMachineDeploymentsCC(clusterClient clusterclient.Client, cluster *capi.Cluster, options *GetMachineDeploymentOptions) ([]capi.MachineDeployment, error) { - workers, err := clusterClient.GetMDObjectForCluster(options.ClusterName, options.Namespace) - if err != nil { - return nil, errors.New("error retrieving node pools") - } - - mds := make([]capi.MachineDeployment, 0, len(workers)) - for i := range workers { - for _, md := range cluster.Spec.Topology.Workers.MachineDeployments { - if workers[i].Spec.Template.Labels["topology.cluster.x-k8s.io/deployment-name"] == md.Name { - workers[i].Name = md.Name - mds = append(mds, workers[i]) - } - } - } - - if options.Name != "" { - for i := range mds { - if mds[i].Name == options.Name { - return []capi.MachineDeployment{ - mds[i], - }, nil - } - } - - return nil, fmt.Errorf("node pool named %s not found", options.Name) - } - - return mds, nil -} - -func getClusterVariableByName(name string, variables []capi.ClusterVariable) *capi.ClusterVariable { - var variable *capi.ClusterVariable - for i := range variables { - if variables[i].Name == name { - variable = &variables[i] - break - } - } - - return variable -} diff --git a/tkg/client/machine_deployment_cc_test.go b/tkg/client/machine_deployment_cc_test.go deleted file mode 100644 index 7d478e799f..0000000000 --- a/tkg/client/machine_deployment_cc_test.go +++ /dev/null @@ -1,861 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "encoding/json" - "errors" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - "k8s.io/utils/pointer" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -const ( - md0Name = "md-0" - md1Name = "md-1" - unknownName = "unknown" - osNameUbuntu = "os-name=ubuntu" - tkgWorker = "tkg-worker" -) - -var _ = Describe("GetMachineDeploymentCC", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - cluster capi.Cluster - options GetMachineDeploymentOptions - mds []capi.MachineDeployment - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - options = GetMachineDeploymentOptions{ - ClusterName: "test-cluster", - Namespace: "default", - } - }) - - AfterEach(func() { - clusterName, namespace := regionalClusterClient.GetMDObjectForClusterArgsForCall(0) - Expect(clusterName).To(Equal(options.ClusterName)) - Expect(namespace).To(Equal(options.Namespace)) - }) - - JustBeforeEach(func() { - mds, err = DoGetMachineDeploymentsCC(regionalClusterClient, &cluster, &options) - }) - - When("There is one MachineDeployment for each defined in the cluster topology", func() { - BeforeEach(func() { - regionalClusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{ - { - Spec: capi.MachineDeploymentSpec{ - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "topology.cluster.x-k8s.io/deployment-name": md0Name, - }, - }, - }, - }, - }, - { - Spec: capi.MachineDeploymentSpec{ - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "topology.cluster.x-k8s.io/deployment-name": md1Name, - }, - }, - }, - }, - }, - }, nil) - - cluster = capi.Cluster{ - Spec: capi.ClusterSpec{ - Topology: &capi.Topology{ - Workers: &capi.WorkersTopology{ - MachineDeployments: []capi.MachineDeploymentTopology{ - { - Name: md0Name, - }, - { - Name: md1Name, - }, - }, - }, - }, - }, - } - }) - - It("should return a list of all the MachineDeployments", func() { - Expect(err).To(BeNil()) - Expect(len(mds)).To(Equal(2)) - Expect(mds[0].Name).To(Equal(md0Name)) - Expect(mds[1].Name).To(Equal(md1Name)) - }) - }) - - When("a node pool name is passed in options", func() { - BeforeEach(func() { - regionalClusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{ - { - Spec: capi.MachineDeploymentSpec{ - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "topology.cluster.x-k8s.io/deployment-name": md0Name, - }, - }, - }, - }, - }, - { - Spec: capi.MachineDeploymentSpec{ - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "topology.cluster.x-k8s.io/deployment-name": md1Name, - }, - }, - }, - }, - }, - }, nil) - - cluster = capi.Cluster{ - Spec: capi.ClusterSpec{ - Topology: &capi.Topology{ - Workers: &capi.WorkersTopology{ - MachineDeployments: []capi.MachineDeploymentTopology{ - { - Name: md0Name, - }, - { - Name: md1Name, - }, - }, - }, - }, - }, - } - - options.Name = md1Name - }) - - It("should return a list of the named node pool", func() { - Expect(err).To(BeNil()) - Expect(len(mds)).To(Equal(1)) - Expect(mds[0].Name).To(Equal(md1Name)) - }) - }) - - When("a node pool name is passed in options", func() { - BeforeEach(func() { - regionalClusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{ - { - Spec: capi.MachineDeploymentSpec{ - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "topology.cluster.x-k8s.io/deployment-name": md0Name, - }, - }, - }, - }, - }, - { - Spec: capi.MachineDeploymentSpec{ - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "topology.cluster.x-k8s.io/deployment-name": md1Name, - }, - }, - }, - }, - }, - }, nil) - - cluster = capi.Cluster{ - Spec: capi.ClusterSpec{ - Topology: &capi.Topology{ - Workers: &capi.WorkersTopology{ - MachineDeployments: []capi.MachineDeploymentTopology{ - { - Name: md0Name, - }, - { - Name: md1Name, - }, - }, - }, - }, - }, - } - - options.Name = md1Name - }) - - When("the node pool name is found", func() { - It("should return a list of the named node pool", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(len(mds)).To(Equal(1)) - Expect(mds[0].Name).To(Equal(md1Name)) - }) - }) - - When("The node pool name is not found", func() { - BeforeEach(func() { - options.Name = unknownName - }) - - It("Should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("node pool named unknown not found")) - }) - }) - }) - - When("There are more MachineDeployments than defined in the cluster topology", func() { - BeforeEach(func() { - regionalClusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{ - { - Spec: capi.MachineDeploymentSpec{ - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "topology.cluster.x-k8s.io/deployment-name": md0Name, - }, - }, - }, - }, - }, - { - Spec: capi.MachineDeploymentSpec{ - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "topology.cluster.x-k8s.io/deployment-name": md1Name, - }, - }, - }, - }, - }, - }, nil) - - cluster = capi.Cluster{ - Spec: capi.ClusterSpec{ - Topology: &capi.Topology{ - Workers: &capi.WorkersTopology{ - MachineDeployments: []capi.MachineDeploymentTopology{ - { - Name: md0Name, - }, - }, - }, - }, - }, - } - }) - - It("should only show the MachineDeployments defined in the cluster toplogy", func() { - Expect(err).To(BeNil()) - Expect(len(mds)).To(Equal(1)) - Expect(mds[0].Name).To(Equal(md0Name)) - }) - }) - - When("there is an error retrieving MachineDeployments", func() { - BeforeEach(func() { - regionalClusterClient.GetMDObjectForClusterReturns(nil, errors.New("error retrieving mds")) - }) - - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("error retrieving node pools")) - }) - }) -}) - -var _ = Describe("DeleteMachineDeploymentCC", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - cluster capi.Cluster - options DeleteMachineDeploymentOptions - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - options = DeleteMachineDeploymentOptions{ - ClusterName: "test-cluster", - Namespace: "default", - } - }) - - JustBeforeEach(func() { - err = DoDeleteMachineDeploymentCC(regionalClusterClient, &cluster, &options) - }) - - When("the MachineDeployment is found", func() { - BeforeEach(func() { - cluster = capi.Cluster{ - Spec: capi.ClusterSpec{ - Topology: &capi.Topology{ - Workers: &capi.WorkersTopology{ - MachineDeployments: []capi.MachineDeploymentTopology{ - { - Name: md0Name, - }, - }, - }, - }, - }, - } - options.Name = md0Name - }) - - Context("and it is the last remaining MachineDeployment", func() { - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("unable to delete last node pool")) - }) - }) - - Context("and it is successfully deleted", func() { - BeforeEach(func() { - cluster.Spec.Topology.Workers.MachineDeployments = append(cluster.Spec.Topology.Workers.MachineDeployments, - capi.MachineDeploymentTopology{ - Name: md1Name, - }) - }) - - It("should delete the named node pool", func() { - Expect(err).ToNot(HaveOccurred()) - clusterInterface, _, _, _ := regionalClusterClient.UpdateResourceArgsForCall(0) - cluster, ok := clusterInterface.(*capi.Cluster) - Expect(ok).To(BeTrue()) - Expect(len(cluster.Spec.Topology.Workers.MachineDeployments)).To(Equal(1)) - Expect(cluster.Spec.Topology.Workers.MachineDeployments[0].Name).To(Equal(md1Name)) - }) - }) - - Context("and updating the cluster returns an error", func() { - BeforeEach(func() { - cluster.Spec.Topology.Workers.MachineDeployments = append(cluster.Spec.Topology.Workers.MachineDeployments, - capi.MachineDeploymentTopology{ - Name: md1Name, - }) - - regionalClusterClient.UpdateResourceReturns(errors.New("unable to update resource")) - }) - - It("return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("unable to delete node pools on cluster test-cluster")) - clusterInterface, _, _, _ := regionalClusterClient.UpdateResourceArgsForCall(0) - actual, ok := clusterInterface.(*capi.Cluster) - Expect(ok).To(BeTrue()) - Expect(len(actual.Spec.Topology.Workers.MachineDeployments)).To(Equal(1)) - Expect(actual.Spec.Topology.Workers.MachineDeployments[0].Name).To(Equal(md1Name)) - }) - }) - }) - - When("the MachineDeployment is not found", func() { - BeforeEach(func() { - cluster = capi.Cluster{ - Spec: capi.ClusterSpec{ - Topology: &capi.Topology{ - Workers: &capi.WorkersTopology{ - MachineDeployments: []capi.MachineDeploymentTopology{ - { - Name: md0Name, - }, - }, - }, - }, - }, - } - - options.Name = unknownName - }) - - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("could not find node pool unknown to delete")) - }) - }) -}) - -var _ = Describe("SetMachineDeploymentCC", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - cluster capi.Cluster - options SetMachineDeploymentOptions - worker0Raw []byte - worker1Raw []byte - worker2Raw []byte - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - options = SetMachineDeploymentOptions{ - ClusterName: "test-cluster", - Namespace: "default", - NodePool: NodePool{ - Labels: &map[string]string{ - "os": "ubuntu", - "arch": "amd64", - }, - Replicas: func(i int32) *int32 { return &i }(3), - }, - } - }) - - JustBeforeEach(func() { - err = DoSetMachineDeploymentCC(regionalClusterClient, &cluster, &options) - Expect(err).ToNot(HaveOccurred()) - }) - - Context("adding a new MachineDeployment", func() { - BeforeEach(func() { - worker0Raw, _ = json.Marshal(map[string]interface{}{ - "instanceType": "m5.large", - }) - worker1Raw, _ = json.Marshal(map[string]interface{}{ - "vmSize": "Standard_D2s_v3", - }) - cluster = capi.Cluster{ - Spec: capi.ClusterSpec{ - Topology: &capi.Topology{ - Workers: &capi.WorkersTopology{ - MachineDeployments: []capi.MachineDeploymentTopology{ - { - Name: md0Name, - Replicas: func(i int32) *int32 { return &i }(1), - Class: tkgWorker, - Variables: &capi.MachineDeploymentVariables{ - Overrides: []capi.ClusterVariable{ - { - Name: "worker", - Value: v1.JSON{ - Raw: worker0Raw, - }, - }, - }, - }, - }, - { - Name: md1Name, - Replicas: func(i int32) *int32 { return &i }(2), - Class: tkgWorker, - Variables: &capi.MachineDeploymentVariables{ - Overrides: []capi.ClusterVariable{ - { - Name: "worker", - Value: v1.JSON{ - Raw: worker1Raw, - }, - }, - }, - }, - }, - }, - }, - Variables: []capi.ClusterVariable{ - { - Name: "worker", - Value: v1.JSON{ - Raw: worker0Raw, - }, - }, - }, - }, - }, - } - - options.Name = "md-2" - }) - - Context("using a known base machine deployment", func() { - BeforeEach(func() { - options.BaseMachineDeployment = md1Name - options.NodeMachineType = "Standard_D3s_v3" - }) - - It("should populate the machine deployment", func() { - Expect(err).ToNot(HaveOccurred()) - expected, _ := json.Marshal(map[string]interface{}{ - "vmSize": "Standard_D3s_v3", - }) - clusterInterface, _, _, _ := regionalClusterClient.UpdateResourceArgsForCall(0) - actual, ok := clusterInterface.(*capi.Cluster) - Expect(ok).To(BeTrue()) - Expect(len(actual.Spec.Topology.Variables)).To(Equal(2)) - - emptyArr, _ := json.Marshal([]interface{}{}) - Expect(actual.Spec.Topology.Variables[1].Name).To(Equal("nodePoolLabels")) - Expect(actual.Spec.Topology.Variables[1].Value.Raw).To(Equal(emptyArr)) - Expect(len(actual.Spec.Topology.Workers.MachineDeployments)).To(Equal(3)) - Expect(actual.Spec.Topology.Workers.MachineDeployments[2].Variables.Overrides[0].Value.Raw).To(Equal(expected)) - }) - }) - - Context("without a base machine deployment", func() { - BeforeEach(func() { - options.NodeMachineType = "t3.large" - options.WorkerClass = tkgWorker - options.TKRResolver = osNameUbuntu - }) - - It("should populate the machine deployment", func() { - Expect(err).ToNot(HaveOccurred()) - expected, _ := json.Marshal(map[string]interface{}{ - "instanceType": "t3.large", - }) - clusterInterface, _, _, _ := regionalClusterClient.UpdateResourceArgsForCall(0) - actual, ok := clusterInterface.(*capi.Cluster) - Expect(ok).To(BeTrue()) - Expect(len(actual.Spec.Topology.Workers.MachineDeployments)).To(Equal(3)) - Expect(actual.Spec.Topology.Workers.MachineDeployments[2].Variables.Overrides[1].Value.Raw).To(Equal(expected)) - }) - }) - - Context("with a vsphere machine type", func() { - BeforeEach(func() { - worker2Raw, _ = json.Marshal(map[string]interface{}{ - "machine": map[string]interface{}{ - "numCPUs": 2, - "diskGiB": 40, - "memoryMiB": 8, - }, - "network": map[string]interface{}{ - "nameservers": []string{ - "8.8.8.8", - }, - }, - }) - cluster.Spec.Topology.Variables[0].Value.Raw = worker2Raw - vcenterRaw, _ := json.Marshal(map[string]interface{}{}) - cluster.Spec.Topology.Variables = append(cluster.Spec.Topology.Variables, capi.ClusterVariable{ - Name: "vcenter", - Value: v1.JSON{ - Raw: vcenterRaw, - }, - }) - - options.NodeMachineType = "" - options.VSphere.DiskGiB = 160 - options.VSphere.MemoryMiB = 16 - options.VSphere.NumCPUs = 8 - options.VSphere.Nameservers = []string{ - "8.8.8.8", - "8.8.4.4", - } - - options.VSphere.CloneMode = "fullClone" - options.VSphere.Datacenter = "dc-0" - options.VSphere.Datastore = "iscsi-0" - options.VSphere.Folder = "folder-1" - options.VSphere.ResourcePool = "rp-1" - options.VSphere.Network = "VMNetwork" - options.VSphere.StoragePolicyName = "policy" - options.VSphere.VCIP = "1.1.1.1" - - options.WorkerClass = tkgWorker - options.TKRResolver = osNameUbuntu - }) - - It("should populate the vsphere machine", func() { - Expect(err).ToNot(HaveOccurred()) - expected, _ := json.Marshal(map[string]interface{}{ - "machine": map[string]interface{}{ - "numCPUs": 8, - "memoryMiB": 16, - "diskGiB": 160, - }, - "network": map[string]interface{}{ - "nameservers": []string{ - "8.8.8.8", - "8.8.4.4", - }, - }, - }) - clusterInterface, _, _, _ := regionalClusterClient.UpdateResourceArgsForCall(0) - actual, ok := clusterInterface.(*capi.Cluster) - Expect(ok).To(BeTrue()) - Expect(len(actual.Spec.Topology.Workers.MachineDeployments)).To(Equal(3)) - Expect(len(actual.Spec.Topology.Workers.MachineDeployments[2].Variables.Overrides)).To(Equal(3)) - var actualLabels []map[string]string - err = json.Unmarshal(actual.Spec.Topology.Workers.MachineDeployments[2].Variables.Overrides[0].Value.Raw, &actualLabels) - Expect(err).ToNot(HaveOccurred()) - Expect(len(actualLabels)).To(Equal(2)) - Expect(actual.Spec.Topology.Workers.MachineDeployments[2].Variables.Overrides[1].Value.Raw).To(Equal(expected)) - - expectedVcenter, _ := json.Marshal(map[string]interface{}{ - "cloneMode": "fullClone", - "datacenter": "dc-0", - "datastore": "iscsi-0", - "folder": "folder-1", - "resourcePool": "rp-1", - "network": "VMNetwork", - "storagePolicyName": "policy", - "server": "1.1.1.1", - }) - - Expect(actual.Spec.Topology.Workers.MachineDeployments[2].Variables.Overrides[2].Value.Raw).To(Equal(expectedVcenter)) - }) - }) - }) - - Context("updating a machine deployment", func() { - BeforeEach(func() { - cluster = capi.Cluster{ - Spec: capi.ClusterSpec{ - Topology: &capi.Topology{ - Workers: &capi.WorkersTopology{ - MachineDeployments: []capi.MachineDeploymentTopology{ - { - Name: md0Name, - Replicas: func(i int32) *int32 { return &i }(1), - Class: tkgWorker, - }, - { - Name: md1Name, - Replicas: func(i int32) *int32 { return &i }(2), - Class: tkgWorker, - }, - }, - }, - }, - }, - } - - options.Name = md0Name - }) - - It("should update the machine deployment", func() { - Expect(err).ToNot(HaveOccurred()) - clusterInterface, _, _, _ := regionalClusterClient.UpdateResourceArgsForCall(0) - actual, ok := clusterInterface.(*capi.Cluster) - Expect(ok).To(BeTrue()) - Expect(len(actual.Spec.Topology.Workers.MachineDeployments)).To(Equal(2)) - Expect(actual.Spec.Topology.Workers.MachineDeployments[0].Name).To(Equal(md0Name)) - Expect(len(actual.Spec.Topology.Workers.MachineDeployments[0].Variables.Overrides)).To(Equal(1)) - Expect(actual.Spec.Topology.Workers.MachineDeployments[0].Variables.Overrides[0].Name).To(Equal("nodePoolLabels")) - Expect(*actual.Spec.Topology.Workers.MachineDeployments[0].Replicas).To(Equal(int32(3))) - }) - }) -}) - -var _ = Describe("SetMachineDeploymentCC", func() { - Context("SetMachineDeployment", func() { - Context("When Cluster Class is enabled", func() { - var ( - clusterClientFactory *fakes.ClusterClientFactory - clusterClient *fakes.ClusterClient - featureFlagClient *fakes.FeatureFlagClient - options *SetMachineDeploymentOptions - tkgClient *TkgClient - ) - - BeforeEach(func() { - clusterClientFactory = &fakes.ClusterClientFactory{} - clusterClient = &fakes.ClusterClient{} - clusterClientFactory.NewClientReturns(clusterClient, nil) - clusterClient.IsClusterClassBasedReturns(true, nil) - featureFlagClient = &fakes.FeatureFlagClient{} - options = &SetMachineDeploymentOptions{ - ClusterName: "test-cluster", - Namespace: "default", - } - tkgClient, err = CreateTKGClientOptsMutator("../fakes/config/config2.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Second, func(o Options) Options { - o.ClusterClientFactory = clusterClientFactory - o.FeatureFlagClient = featureFlagClient - return o - }) - Expect(err).NotTo(HaveOccurred()) - }) - - Context("When feature toggle is enabled", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedStub = func(featureFlagName string) (bool, error) { - if featureFlagName == constants.FeatureFlagSingleNodeClusters { - return true, nil - } - return false, nil - } - }) - - It("Should not create machine deployment when creating a single node cluster", func() { - clusterClient.GetResourceCalls(func(c interface{}, name, namespace string, pv clusterclient.PostVerifyrFunc, opt *clusterclient.PollOptions) error { - cc := c.(*capi.Cluster) - fc := singleNodeCluster() - fc.Spec.Topology.Workers = nil - *cc = *fc - return nil - }) - - err = tkgClient.SetMachineDeployment(options) - Expect(err).ToNot(HaveOccurred()) - - Expect(clusterClient.GetResourceCallCount()).To(Equal(1)) - Expect(clusterClient.UpdateResourceCallCount()).To(BeZero()) - - obj, _, _, _, _ := clusterClient.GetResourceArgsForCall(0) - cluster := obj.(*capi.Cluster) - Expect(*cluster.Spec.Topology.ControlPlane.Replicas).To(Equal(int32(1))) - Expect(cluster.Spec.Topology.Workers).To(BeNil()) - }) - - It("Should create machine deployment when creating a multi node cluster", func() { - clusterClient.GetResourceCalls(func(c interface{}, name, namespace string, pv clusterclient.PostVerifyrFunc, opt *clusterclient.PollOptions) error { - cc := c.(*capi.Cluster) - fc := multiNodeCluster() - *cc = *fc - return nil - }) - - err = tkgClient.SetMachineDeployment(multiNodeOptions(options)) - Expect(err).ToNot(HaveOccurred()) - - Expect(clusterClient.GetResourceCallCount()).To(Equal(1)) - Expect(clusterClient.UpdateResourceCallCount()).To(Equal(1)) - obj, _, _, _, _ := clusterClient.GetResourceArgsForCall(0) - cluster := obj.(*capi.Cluster) - Expect(*cluster.Spec.Topology.ControlPlane.Replicas).To(Equal(int32(1))) - Expect(*cluster.Spec.Topology.Workers.MachineDeployments[0].Replicas).To(Equal(int32(1))) - }) - }) - - Context("When feature toggle is disabled", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedStub = func(featureFlagName string) (bool, error) { - if featureFlagName == constants.FeatureFlagSingleNodeClusters { - return false, nil - } - return false, nil - } - }) - - It("Should create machine deployment", func() { - clusterClient.GetResourceCalls(func(c interface{}, name, namespace string, pv clusterclient.PostVerifyrFunc, opt *clusterclient.PollOptions) error { - cc := c.(*capi.Cluster) - fc := multiNodeCluster() - *cc = *fc - return nil - }) - - err = tkgClient.SetMachineDeployment(multiNodeOptions(options)) - Expect(err).ToNot(HaveOccurred()) - - Expect(clusterClient.GetResourceCallCount()).To(Equal(1)) - Expect(clusterClient.UpdateResourceCallCount()).To(Equal(1)) - obj, _, _, _, _ := clusterClient.GetResourceArgsForCall(0) - cluster := obj.(*capi.Cluster) - Expect(*cluster.Spec.Topology.ControlPlane.Replicas).To(Equal(int32(1))) - Expect(*cluster.Spec.Topology.Workers.MachineDeployments[0].Replicas).To(Equal(int32(1))) - }) - - It("Should return error when trying to create a single node cluster", func() { - clusterClient.GetResourceCalls(func(c interface{}, name, namespace string, pv clusterclient.PostVerifyrFunc, opt *clusterclient.PollOptions) error { - cc := c.(*capi.Cluster) - fc := singleNodeCluster() - fc.Spec.Topology.Workers = nil - *cc = *fc - return nil - }) - - err = tkgClient.SetMachineDeployment(options) - Expect(err).To(MatchError("cluster topology workers are not set. please repair your cluster before trying again")) - - Expect(clusterClient.GetResourceCallCount()).To(Equal(1)) - Expect(clusterClient.UpdateResourceCallCount()).To(BeZero()) - - obj, _, _, _, _ := clusterClient.GetResourceArgsForCall(0) - cluster := obj.(*capi.Cluster) - Expect(*cluster.Spec.Topology.ControlPlane.Replicas).To(Equal(int32(1))) - Expect(cluster.Spec.Topology.Workers).To(BeNil()) - }) - }) - }) - }) -}) - -func singleNodeCluster() *capi.Cluster { - return &capi.Cluster{ - Spec: capi.ClusterSpec{ - Topology: &capi.Topology{ - ControlPlane: capi.ControlPlaneTopology{ - Replicas: pointer.Int32(1), - }, - Workers: &capi.WorkersTopology{ - MachineDeployments: []capi.MachineDeploymentTopology{}, - }, - }, - }, - } -} - -func multiNodeCluster() *capi.Cluster { - worker0Raw, _ := json.Marshal(map[string]interface{}{ - "instanceType": "m5.large", - }) - - return &capi.Cluster{ - Spec: capi.ClusterSpec{ - Topology: &capi.Topology{ - ControlPlane: capi.ControlPlaneTopology{ - Replicas: pointer.Int32(1), - }, - Workers: &capi.WorkersTopology{ - MachineDeployments: []capi.MachineDeploymentTopology{ - { - Name: md0Name, - Replicas: pointer.Int32(1), - Class: tkgWorker, - Variables: &capi.MachineDeploymentVariables{ - Overrides: []capi.ClusterVariable{ - { - Name: "worker", - Value: v1.JSON{ - Raw: worker0Raw, - }, - }, - }, - }, - }, - }, - }, - }, - }, - } -} - -func multiNodeOptions(options *SetMachineDeploymentOptions) *SetMachineDeploymentOptions { - options.NodePool = NodePool{ - Labels: &map[string]string{ - "os": "ubuntu", - "arch": "amd64", - }, - Replicas: pointer.Int32(1), - WorkerClass: tkgWorker, - TKRResolver: osNameUbuntu, - } - return options -} diff --git a/tkg/client/machine_deployment_test.go b/tkg/client/machine_deployment_test.go deleted file mode 100644 index 15f7df8c99..0000000000 --- a/tkg/client/machine_deployment_test.go +++ /dev/null @@ -1,1684 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "fmt" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - aws "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" - azure "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" - vsphere "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" - docker "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta1" - - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("GetMachineDeployments", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - tkgClient *TkgClient - setDeploymentOptions *SetMachineDeploymentOptions - replicas int32 - tkc tkgsv1alpha2.TanzuKubernetesCluster - gotTkc *tkgsv1alpha2.TanzuKubernetesCluster - testClusterName = "my-cluster" - ) - - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - regionalClusterClient = &fakes.ClusterClient{} - }) - Context("When the regional cluster is Pacific", func() { - var retError error - JustBeforeEach(func() { - regionalClusterClient.GetPacificClusterObjectReturns(&tkc, retError) - err = tkgClient.SetNodePoolsForPacificCluster(regionalClusterClient, setDeploymentOptions) - }) - - Context("When the TKC cluster doesn't exist", func() { - BeforeEach(func() { - retError = errors.Errorf("fake-tkg-get-error") - tkc = GetDummyPacificCluster() - - replicas = 1 - setDeploymentOptions = &SetMachineDeploymentOptions{ - ClusterName: testClusterName, - Namespace: "dummy-namespace", - NodePool: NodePool{ - Name: "fake-nodepool", - Replicas: &replicas, - VMClass: "fake-vm-class", - StorageClass: "fake-storage-class", - TKR: tkgsv1alpha2.TKRReference{ - Reference: &corev1.ObjectReference{ - Name: "dummy-tkr", - }, - }, - }} - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(`unable to get TKC object "my-cluster" in namespace "dummy-namespace": fake-tkg-get-error`)) - }) - }) - Context("When the TKC cluster exist and TKC resource update failed when new node-pool is to be added", func() { - BeforeEach(func() { - retError = nil - tkc = GetDummyPacificCluster() - tkc.Name = testClusterName - - replicas = 1 - setDeploymentOptions = &SetMachineDeploymentOptions{ - ClusterName: testClusterName, - Namespace: "dummy-namespace", - NodePool: NodePool{ - Name: "fake-new-nodepool", - Replicas: &replicas, - VMClass: "fake-vm-class", - StorageClass: "fake-storage-class", - TKR: tkgsv1alpha2.TKRReference{ - Reference: &corev1.ObjectReference{ - Name: "dummy-tkr", - }, - }, - }} - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - return errors.Errorf("fake-update-resource-error") - }) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(`failed to add the nodepool "fake-new-nodepool" of TKC "my-cluster" in namespace "dummy-namespace": fake-update-resource-error`)) - }) - }) - Context("When the TKC cluster exist and a new node-pool is added successfully", func() { - BeforeEach(func() { - retError = nil - tkc = GetDummyPacificCluster() - - replicas = 1 - setDeploymentOptions = &SetMachineDeploymentOptions{ - ClusterName: testClusterName, - Namespace: "dummy-namespace", - NodePool: NodePool{ - Name: "fake-new-nodepool", - Replicas: &replicas, - VMClass: "fake-vm-class", - StorageClass: "fake-storage-class", - TKR: tkgsv1alpha2.TKRReference{ - Reference: &corev1.ObjectReference{ - Name: "dummy-tkr", - }, - }, - }} - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - gotTkc = obj.(*tkgsv1alpha2.TanzuKubernetesCluster) - return nil - }) - }) - It("should not return error and TKC should show newly added nodepool", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(len(gotTkc.Spec.Topology.NodePools)).To(Equal(3)) - Expect(gotTkc.Spec.Topology.NodePools[2].Name).To(Equal("fake-new-nodepool")) - }) - }) - Context("When the TKC cluster exist and a node-pool is to be updated", func() { - BeforeEach(func() { - retError = nil - tkc = GetDummyPacificCluster() - - replicas = 3 - setDeploymentOptions = &SetMachineDeploymentOptions{ - ClusterName: testClusterName, - Namespace: "dummy-namespace", - NodePool: NodePool{ - Name: "nodepool-1", - Replicas: &replicas, - VMClass: "fake-vm-class", - StorageClass: "fake-storage-class", - TKR: tkgsv1alpha2.TKRReference{ - Reference: &corev1.ObjectReference{ - Name: "dummy-tkr", - }, - }, - }} - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - gotTkc = obj.(*tkgsv1alpha2.TanzuKubernetesCluster) - return nil - }) - }) - It("should update the existing node pool of TKC", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(len(gotTkc.Spec.Topology.NodePools)).To(Equal(2)) - Expect(gotTkc.Spec.Topology.NodePools[0].Name).To(Equal("nodepool-1")) - Expect(*gotTkc.Spec.Topology.NodePools[0].Replicas).To(Equal(int32(3))) - Expect(gotTkc.Spec.Topology.NodePools[0].VMClass).To(Equal("fake-vm-class")) - - }) - }) - }) -}) - -var _ = Describe("DeleteMachineDeployments", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - tkgClient *TkgClient - deleteDeploymentOptions DeleteMachineDeploymentOptions - tkc tkgsv1alpha2.TanzuKubernetesCluster - testClusterName = "my-cluster" - ) - - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - regionalClusterClient = &fakes.ClusterClient{} - }) - Context("When the regional cluster is Pacific", func() { - var retError error - JustBeforeEach(func() { - regionalClusterClient.GetPacificClusterObjectReturns(&tkc, retError) - err = tkgClient.DeleteNodePoolForPacificCluster(regionalClusterClient, deleteDeploymentOptions) - }) - - Context("When the TKC cluster doesn't exist", func() { - BeforeEach(func() { - retError = errors.Errorf("fake-tkg-get-error") - tkc = GetDummyPacificCluster() - - deleteDeploymentOptions = DeleteMachineDeploymentOptions{ - ClusterName: testClusterName, - Namespace: "dummy-namespace", - Name: "fake-nodepool", - } - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(`unable to get TKC object "my-cluster" in namespace "dummy-namespace": fake-tkg-get-error`)) - }) - }) - Context("When the TKC cluster exist and node-pool to be deleted doesn't exist", func() { - BeforeEach(func() { - retError = nil - tkc = GetDummyPacificCluster() - tkc.Name = testClusterName - - deleteDeploymentOptions = DeleteMachineDeploymentOptions{ - ClusterName: testClusterName, - Namespace: "dummy-namespace", - Name: "invalid-nodepool", - } - regionalClusterClient.PatchResourceReturns(nil) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(`could not find node pool "invalid-nodepool" to delete`)) - }) - }) - Context("When the TKC cluster exist, and updating the TKC object failed", func() { - BeforeEach(func() { - retError = nil - tkc = GetDummyPacificCluster() - tkc.Name = "my-cluster" - - deleteDeploymentOptions = DeleteMachineDeploymentOptions{ - ClusterName: "my-cluster", - Namespace: "dummy-namespace", - Name: "nodepool-1", - } - regionalClusterClient.PatchResourceReturns(errors.Errorf("fake-patch-error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(`unable to apply node pool delete patch for tkc object: fake-patch-error`)) - }) - }) - Context("When the TKC cluster exist and nodepool is successfully deleted", func() { - gotJSONPatchString := "" - gotTKCName := "" - gotNameSpace := "" - BeforeEach(func() { - retError = nil - tkc = GetDummyPacificCluster() - tkc.Name = testClusterName - - deleteDeploymentOptions = DeleteMachineDeploymentOptions{ - ClusterName: testClusterName, - Namespace: "dummy-namespace", - Name: "nodepool-1", - } - regionalClusterClient.PatchResourceCalls(func(obj interface{}, resourceName string, namespace string, patchJSONString string, patchType types.PatchType, pollOptions *clusterclient.PollOptions) error { - gotJSONPatchString = patchJSONString - gotTKCName = resourceName - gotNameSpace = namespace - return nil - }) - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotTKCName).To(Equal("my-cluster")) - Expect(gotNameSpace).To(Equal("dummy-namespace")) - wantJSONPatchStrig := `{"op":"remove","path":"/spec/topology/nodePools/0","value":""}` - Expect(gotJSONPatchString).To(ContainSubstring(wantJSONPatchStrig)) - }) - }) - }) -}) - -func GetDummyPacificCluster() tkgsv1alpha2.TanzuKubernetesCluster { - var controlPlaneReplicas int32 = 1 - var nodepoolReplicase int32 = 2 - controlPlane := tkgsv1alpha2.TopologySettings{ - Replicas: &controlPlaneReplicas, - TKR: tkgsv1alpha2.TKRReference{ - Reference: &corev1.ObjectReference{ - Name: "dummy-tkr", - }, - }, - } - nodepools := []tkgsv1alpha2.NodePool{ - {Name: "nodepool-1", - TopologySettings: tkgsv1alpha2.TopologySettings{ - Replicas: &nodepoolReplicase, - TKR: tkgsv1alpha2.TKRReference{ - Reference: &corev1.ObjectReference{ - Name: "dummy-tkr", - }, - }, - }, - }, - {Name: "nodepool-2", - TopologySettings: tkgsv1alpha2.TopologySettings{ - Replicas: &nodepoolReplicase, - TKR: tkgsv1alpha2.TKRReference{ - Reference: &corev1.ObjectReference{ - Name: "dummy-tkr", - }, - }, - }, - }, - } - - tkc := tkgsv1alpha2.TanzuKubernetesCluster{} - tkc.Name = "DummyTKC" - tkc.Spec.Topology.ControlPlane = controlPlane - tkc.Spec.Topology.NodePools = nodepools - return tkc -} - -var _ = Describe("NormalizeNodePoolName", func() { - var ( - workers []capi.MachineDeployment - err error - mds []capi.MachineDeployment - ) - const ( - prependMDName1 = "test-cluster-md-0" - prependMDName2 = "test-cluster-md-1" - md1Name = "md-0" - md2Name = "md-1" - clusterName = "test-cluster" - ) - - JustBeforeEach(func() { - workers, err = NormalizeNodePoolName(mds, clusterName) - Expect(err).ToNot(HaveOccurred()) - }) - When("Machine Deployment names aren't prepended with cluster name", func() { - BeforeEach(func() { - mds = []capi.MachineDeployment{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: md1Name, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: md2Name, - }, - }, - } - }) - It("should do keep the machine deployment names the same", func() { - Expect(workers[0].Name).To(Equal(md1Name)) - Expect(workers[1].Name).To(Equal(md2Name)) - }) - }) - When("Machine Deployment names are prepended with the cluster name", func() { - BeforeEach(func() { - mds = []capi.MachineDeployment{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: prependMDName1, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: prependMDName2, - }, - }, - } - }) - It("should strip the cluster name prepend", func() { - Expect(workers[0].Name).To(Equal(md1Name)) - Expect(workers[1].Name).To(Equal(md2Name)) - }) - }) -}) - -var _ = Describe("Machine Deployment", func() { - const ( - clusterName = "test-cluster" - np1Name = "np-1" - md1Name = "test-cluster-np-1" - md2Name = "test-cluster-np-2" - md3Name = "test-cluster-np-3" - ) - var ( - clusterClient fakes.ClusterClient - err error - md1 capi.MachineDeployment - md2 capi.MachineDeployment - md3 capi.MachineDeployment - ) - BeforeEach(func() { - clusterClient = fakes.ClusterClient{} - }) - Context("DoDeleteMachineDeployment", func() { - var options DeleteMachineDeploymentOptions - BeforeEach(func() { - options = DeleteMachineDeploymentOptions{ - ClusterName: clusterName, - Name: np1Name, - } - }) - JustBeforeEach(func() { - err = DoDeleteMachineDeployment(&clusterClient, &options) - }) - When("there is an error retrieving machine deployments", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns(nil, errors.New("")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("machine deployments exist", func() { - BeforeEach(func() { - md1 = capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: md1Name, - }, - Spec: capi.MachineDeploymentSpec{ - Template: capi.MachineTemplateSpec{ - Spec: capi.MachineSpec{ - Bootstrap: capi.Bootstrap{ - ConfigRef: &corev1.ObjectReference{ - Name: "test-cluster-np-1-kct", - }, - }, - InfrastructureRef: corev1.ObjectReference{ - Kind: constants.KindVSphereMachineTemplate, - Name: "test-cluster-np-1-mt", - }, - }, - }, - }, - } - md2 = capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: md2Name, - }, - Spec: capi.MachineDeploymentSpec{ - Template: capi.MachineTemplateSpec{ - Spec: capi.MachineSpec{ - Bootstrap: capi.Bootstrap{ - ConfigRef: &corev1.ObjectReference{ - Name: "test-cluster-np-2-kct", - }, - }, - InfrastructureRef: corev1.ObjectReference{ - Kind: constants.KindVSphereMachineTemplate, - Name: "test-cluster-np-2-mt", - }, - }, - }, - }, - } - md3 = capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: md3Name, - }, - Spec: capi.MachineDeploymentSpec{ - Template: capi.MachineTemplateSpec{ - Spec: capi.MachineSpec{ - Bootstrap: capi.Bootstrap{ - ConfigRef: &corev1.ObjectReference{ - Name: "test-cluster-np-3-kct", - }, - }, - InfrastructureRef: corev1.ObjectReference{ - Kind: constants.KindVSphereMachineTemplate, - Name: "test-cluster-np-3-mt", - }, - }, - }, - }, - } - }) - When("there is only one machine deployment", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1}, nil) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError("cannot delete last worker node pool in cluster")) - }) - }) - When("the named machine deployment is not found", func() { - BeforeEach(func() { - options.Name = "not-found" - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("could not find node pool %s to delete", options.Name))) - }) - }) - When("the kubeadmconfigtemplate is not found", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - clusterClient.GetResourceReturns(errors.New("")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to retrieve kubeadmconfigtemplate %s-%s-kct: ", options.ClusterName, options.Name))) - - _, name, namespace, _, _ := clusterClient.GetResourceArgsForCall(0) - Expect(name).To(Equal("test-cluster-np-1-kct")) - Expect(namespace).To(Equal("")) - }) - }) - Context("with vSphere Machine Templates", func() { - When("the vsphere machine template can't be found", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - callIndex++ - return errors.New("") - } - return nil - } - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to retrieve machine template %s-%s-mt: ", options.ClusterName, options.Name))) - }) - }) - When("there is an error deleting the machine deployment", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*vsphere.VSphereMachineTemplate) - *mt = vsphere.VSphereMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturns(errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete machine deployment %s-%s: ", options.ClusterName, options.Name))) - }) - When("there is an error deleting the machine template", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*vsphere.VSphereMachineTemplate) - *mt = vsphere.VSphereMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete machine template %s-%s-mt: ", options.ClusterName, options.Name))) - }) - }) - When("Deleting a node pool with a name that is a subset of another node pool name", func() { - BeforeEach(func() { - md2.Name = "np-1" - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - clusterClient.DeleteResourceReturns(nil) - }) - It("should delete the machine deployment with the exact matching name", func() { - Expect(clusterClient.DeleteResourceCallCount()).To(Equal(3)) - mdObj := clusterClient.DeleteResourceArgsForCall(0) - md, ok := mdObj.(*capi.MachineDeployment) - Expect(ok).To(BeTrue()) - Expect(md.Name).To(Equal("np-1")) - }) - }) - When("there is an error deleting the kubeadmconfig template", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*vsphere.VSphereMachineTemplate) - *mt = vsphere.VSphereMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, nil) - clusterClient.DeleteResourceReturnsOnCall(2, errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete kubeadmconfigtemplate %s-%s-kct: ", options.ClusterName, options.Name))) - }) - }) - When("the node pool deletes successfully", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*vsphere.VSphereMachineTemplate) - *mt = vsphere.VSphereMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, nil) - clusterClient.DeleteResourceReturnsOnCall(2, nil) - }) - It("should return successfully", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - }) - Context("with AWS Machine Templates", func() { - When("the AWS machine template can't be found", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - callIndex++ - return errors.New("") - } - return nil - } - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to retrieve machine template %s-%s-mt: ", options.ClusterName, options.Name))) - }) - }) - When("there is an error deleting the machine deployment", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindAWSMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*aws.AWSMachineTemplate) - *mt = aws.AWSMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturns(errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete machine deployment %s-%s: ", options.ClusterName, options.Name))) - }) - }) - When("there is an error deleting the machine template", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindAWSMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*aws.AWSMachineTemplate) - *mt = aws.AWSMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete machine template %s-%s-mt: ", options.ClusterName, options.Name))) - }) - }) - When("there is an error deleting the kubeadmconfig template", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindAWSMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*aws.AWSMachineTemplate) - *mt = aws.AWSMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, nil) - clusterClient.DeleteResourceReturnsOnCall(2, errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete kubeadmconfigtemplate %s-%s-kct: ", options.ClusterName, options.Name))) - }) - }) - When("the node pool is deleted successfully", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindAWSMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*aws.AWSMachineTemplate) - *mt = aws.AWSMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, nil) - clusterClient.DeleteResourceReturnsOnCall(2, nil) - }) - It("should return successfully", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - }) - Context("with Azure Machine Templates", func() { - When("the Azure machine template can't be found", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - callIndex++ - return errors.New("") - } - return nil - } - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to retrieve machine template %s-%s-mt: ", options.ClusterName, options.Name))) - }) - }) - When("there is an error deleting the machine deployment", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindAzureMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*azure.AzureMachineTemplate) - *mt = azure.AzureMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturns(errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete machine deployment %s-%s: ", options.ClusterName, options.Name))) - }) - }) - When("there is an error deleting the machine template", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindAzureMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*azure.AzureMachineTemplate) - *mt = azure.AzureMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete machine template %s-%s-mt: ", options.ClusterName, options.Name))) - }) - }) - When("there is an error deleting the kubeadmconfig template", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindAzureMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*azure.AzureMachineTemplate) - *mt = azure.AzureMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, nil) - clusterClient.DeleteResourceReturnsOnCall(2, errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete kubeadmconfigtemplate %s-%s-kct: ", options.ClusterName, options.Name))) - }) - }) - When("the node pool is deleted successfully", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindAzureMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*azure.AzureMachineTemplate) - *mt = azure.AzureMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, nil) - clusterClient.DeleteResourceReturnsOnCall(2, nil) - }) - It("should return successfully", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - }) - Context("with Docker Machine Templates", func() { - When("the docker machine template can't be found", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - callIndex++ - return errors.New("") - } - return nil - } - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to retrieve machine template %s-%s-mt: ", options.ClusterName, options.Name))) - }) - }) - When("there is an error deleting the machine deployment", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindDockerMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*docker.DockerMachineTemplate) - *mt = docker.DockerMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturns(errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete machine deployment %s-%s: ", options.ClusterName, options.Name))) - }) - }) - When("there is an error deleting the machine template", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindDockerMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*docker.DockerMachineTemplate) - *mt = docker.DockerMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete machine template %s-%s-mt: ", options.ClusterName, options.Name))) - }) - }) - When("there is an error deleting the kubeadmconfig template", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindDockerMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*docker.DockerMachineTemplate) - *mt = docker.DockerMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, nil) - clusterClient.DeleteResourceReturnsOnCall(2, errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError(fmt.Sprintf("unable to delete kubeadmconfigtemplate %s-%s-kct: ", options.ClusterName, options.Name))) - }) - }) - When("the node pool is deleted successfully", func() { - BeforeEach(func() { - md1.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindDockerMachineTemplate - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - callIndex := 0 - clusterClient.GetResourceStub = func(obj interface{}, name, namespace string, postVerifyFn clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := obj.(*v1beta1.KubeadmConfigTemplate) - *kct = v1beta1.KubeadmConfigTemplate{} - callIndex++ - return nil - } - if callIndex == 1 { - mt := obj.(*docker.DockerMachineTemplate) - *mt = docker.DockerMachineTemplate{} - callIndex++ - return nil - } - return nil - } - clusterClient.DeleteResourceReturnsOnCall(0, nil) - clusterClient.DeleteResourceReturnsOnCall(1, nil) - clusterClient.DeleteResourceReturnsOnCall(2, nil) - }) - It("should return successfully", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - }) - }) - }) - Context("DoGetMachineDeployment", func() { - var ( - options GetMachineDeploymentOptions - machineDeployments []capi.MachineDeployment - ) - BeforeEach(func() { - options = GetMachineDeploymentOptions{ - ClusterName: clusterName, - Name: np1Name, - } - }) - JustBeforeEach(func() { - machineDeployments, err = DoGetMachineDeployments(&clusterClient, &options) - }) - When("there is an error retrieving machine deployments", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns(nil, errors.New("")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - When("machine deployments are found", func() { - BeforeEach(func() { - md1 = capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-cluster-np-1", - }, - } - md2 = capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "np-2", - }, - } - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2}, nil) - }) - It("normalize the node pool names", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(len(machineDeployments)).To(Equal(2)) - Expect(machineDeployments[0].Name).To(Equal("np-1")) - Expect(machineDeployments[1].Name).To(Equal("np-2")) - }) - }) - }) - Context("DoSetMachineDeployment", func() { - var ( - options SetMachineDeploymentOptions - ) - BeforeEach(func() { - newReplicas := int32(3) - options = SetMachineDeploymentOptions{ - ClusterName: clusterName, - NodePool: NodePool{ - Name: np1Name, - Replicas: &newReplicas, - Labels: &map[string]string{ - "key1": "value1", - "key2": "value2", - }, - }, - } - }) - JustBeforeEach(func() { - err = DoSetMachineDeployment(&clusterClient, &options) - }) - When("there is an error retrieving machine deployments", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns(nil, errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError("error retrieving worker machine deployments: ")) - }) - }) - When("no machine deployments are found", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{}, nil) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("Update Existing MachineDeployment", func() { - BeforeEach(func() { - existingReplicas := int32(1) - md1 = capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-cluster-np-1", - Annotations: map[string]string{ - "key1": "value1", - "key2": "value2", - }, - }, - Spec: capi.MachineDeploymentSpec{ - Replicas: &existingReplicas, - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "oldkey": "oldvalue", - }, - }, - }, - }, - } - md2 = capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-cluster-np-1", - Annotations: map[string]string{ - "key1": "value1", - "key2": "value2", - }, - }, - Spec: capi.MachineDeploymentSpec{ - Replicas: &existingReplicas, - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "oldkey": "oldvalue", - }, - }, - }, - }, - } - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1}, nil) - }) - When("updating the machine deployment hits an error", func() { - BeforeEach(func() { - clusterClient.UpdateResourceReturns(errors.New("")) - }) - It("should throw an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).Should(MatchError("failed to update machinedeployment: ")) - }) - }) - When("setting a node pool with a name that is a subset of another node pool name", func() { - BeforeEach(func() { - md2.Name = np1Name - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md2, md3}, nil) - clusterClient.UpdateResourceReturns(nil) - }) - It("should update the machine deployment with the exact matching name", func() { - Expect(clusterClient.UpdateResourceCallCount()).To(Equal(1)) - mdObj, _, _, _ := clusterClient.UpdateResourceArgsForCall(0) - md, ok := mdObj.(*capi.MachineDeployment) - Expect(ok).To(BeTrue()) - Expect(md.Name).To(Equal("np-1")) - }) - }) - When("the machine deployment updates successfully", func() { - BeforeEach(func() { - clusterClient.UpdateResourceReturns(nil) - }) - It("should update replicas and labels", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(clusterClient.UpdateResourceCallCount()).To(Equal(1)) - obj, name, namespace, _ := clusterClient.UpdateResourceArgsForCall(0) - Expect(name).To(Equal("test-cluster-np-1")) - Expect(namespace).To(Equal("")) - md := obj.(*capi.MachineDeployment) - - Expect(md.Name).To(Equal("test-cluster-np-1")) - Expect(md.Annotations).To(Equal(map[string]string{})) - Expect(*md.Spec.Replicas).To(Equal(int32(3))) - Expect(md.Spec.Template.Labels).To(HaveKeyWithValue("oldkey", "oldvalue")) - Expect(md.Spec.Template.Labels).To(HaveKeyWithValue("key1", "value1")) - Expect(md.Spec.Template.Labels).To(HaveKeyWithValue("key2", "value2")) - }) - }) - }) - Context("Create MachineDeployment", func() { - var ( - kubeadmConfigTemplate v1beta1.KubeadmConfigTemplate - joinConfig v1beta1.JoinConfiguration - ) - BeforeEach(func() { - options.Name = "np-2" - joinConfig = v1beta1.JoinConfiguration{ - NodeRegistration: v1beta1.NodeRegistrationOptions{ - KubeletExtraArgs: map[string]string{}, - }, - } - kubeadmConfigTemplate = v1beta1.KubeadmConfigTemplate{ - Spec: v1beta1.KubeadmConfigTemplateSpec{ - Template: v1beta1.KubeadmConfigTemplateResource{ - Spec: v1beta1.KubeadmConfigSpec{ - JoinConfiguration: &joinConfig, - Files: []v1beta1.File{ - { - Path: "/etc/kubernetes/azure.json", - ContentFrom: &v1beta1.FileSource{ - Secret: v1beta1.SecretFileSource{ - Name: "md-0-azure-secret", - }, - }, - }, - { - Path: "/not/azure", - ContentFrom: nil, - }, - }, - }, - }, - }, - } - }) - When("the user selected machine deployment doesn't exist", func() { - BeforeEach(func() { - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1}, nil) - options.BaseMachineDeployment = "test-cluster-md-3" - }) - It("should return an error", func() { - Expect(err).Should(MatchError("unable to find base machine deployment with name test-cluster-md-3")) - }) - }) - Context("vSphere machine deployment", func() { - var vSphereMachineTemplate vsphere.VSphereMachineTemplate - BeforeEach(func() { - existingReplicas := int32(1) - md1 = capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-cluster-np-1", - Annotations: map[string]string{ - "key1": "value1", - "key2": "value2", - }, - }, - Spec: capi.MachineDeploymentSpec{ - Replicas: &existingReplicas, - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "oldkey": "oldvalue", - }, - }, - Spec: capi.MachineSpec{ - Bootstrap: capi.Bootstrap{ - ConfigRef: &corev1.ObjectReference{ - Name: "test-cluster-np-1-kct", - }, - }, - InfrastructureRef: corev1.ObjectReference{ - Name: "test-cluster-np-1-mt", - Kind: constants.KindVSphereMachineTemplate, - }, - }, - }, - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{}, - }, - }, - } - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1}, nil) - vSphereMachineTemplate = vsphere.VSphereMachineTemplate{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-cluster-np-1-mt", - }, - Spec: vsphere.VSphereMachineTemplateSpec{ - Template: vsphere.VSphereMachineTemplateResource{ - Spec: vsphere.VSphereMachineSpec{ - VirtualMachineCloneSpec: vsphere.VirtualMachineCloneSpec{ - Template: "template0", - CloneMode: "old", - Datacenter: "dc0", - Folder: "folder0", - Datastore: "ds0", - StoragePolicyName: "policy0", - ResourcePool: "rp0", - NumCPUs: 4, - MemoryMiB: 4096, - DiskGiB: 16384, - }, - }, - }, - }, - } - options.NodePool.VSphere = VSphereNodePool{ - CloneMode: "new", - Datacenter: "dc1", - Datastore: "ds1", - StoragePolicyName: "policy1", - Folder: "folder1", - Network: "network1", - Nameservers: []string{ - "8.8.8.8", - "8.8.4.4", - }, - TKGIPFamily: "ipv4,ipv6", - ResourcePool: "rp1", - VCIP: "0.0.0.2", - Template: "template1", - MemoryMiB: 8192, - DiskGiB: 65536, - NumCPUs: 8, - } - - callIndex := 0 - clusterClient.GetResourceStub = func(i interface{}, s1, s2 string, pvf clusterclient.PostVerifyrFunc, po *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := i.(*v1beta1.KubeadmConfigTemplate) - *kct = kubeadmConfigTemplate - callIndex++ - return nil - } - if callIndex == 1 { - mt := i.(*vsphere.VSphereMachineTemplate) - *mt = vSphereMachineTemplate - callIndex++ - return nil - } - return nil - } - }) - clusterClient.CreateResourceReturnsOnCall(0, nil) - clusterClient.CreateResourceReturnsOnCall(1, nil) - clusterClient.CreateNamespaceReturnsOnCall(2, nil) - When("Machine Deployment creates successfully", func() { - It("should properly set all values for created resources", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(clusterClient.CreateResourceCallCount()).To(Equal(3)) - - obj, _, _, _ := clusterClient.CreateResourceArgsForCall(0) - kct := obj.(*v1beta1.KubeadmConfigTemplate) - Expect(kct.Annotations).To(Equal(map[string]string{})) - Expect(kct.ResourceVersion).To(Equal("")) - Expect(kct.Name).To(Equal("test-cluster-np-2-kct")) - Expect(kct.Spec.Template.Spec.JoinConfiguration.NodeRegistration.KubeletExtraArgs["node-labels"]).To(Equal("key1=value1,key2=value2")) - - obj, _, _, _ = clusterClient.CreateResourceArgsForCall(1) - mt := obj.(*vsphere.VSphereMachineTemplate) - Expect(mt.Name).To(Equal("test-cluster-np-2-mt")) - Expect(mt.Annotations).To(Equal(map[string]string{})) - Expect(mt.ResourceVersion).To(Equal("")) - Expect(mt.Spec.Template.Spec.CloneMode).To(Equal(vsphere.CloneMode(options.VSphere.CloneMode))) - Expect(mt.Spec.Template.Spec.Datacenter).To(Equal(options.VSphere.Datacenter)) - Expect(mt.Spec.Template.Spec.Datastore).To(Equal(options.VSphere.Datastore)) - Expect(mt.Spec.Template.Spec.DiskGiB).To(Equal(options.VSphere.DiskGiB)) - Expect(mt.Spec.Template.Spec.Folder).To(Equal(options.VSphere.Folder)) - Expect(mt.Spec.Template.Spec.MemoryMiB).To(Equal(options.VSphere.MemoryMiB)) - Expect(mt.Spec.Template.Spec.NumCPUs).To(Equal(options.VSphere.NumCPUs)) - Expect(mt.Spec.Template.Spec.ResourcePool).To(Equal(options.VSphere.ResourcePool)) - Expect(mt.Spec.Template.Spec.Server).To(Equal(options.VSphere.VCIP)) - Expect(mt.Spec.Template.Spec.Template).To(Equal(options.VSphere.Template)) - Expect(mt.Spec.Template.Spec.Network.Devices[0].NetworkName).To(Equal(options.VSphere.Network)) - Expect(mt.Spec.Template.Spec.Network.Devices[0].DHCP4).To(Equal(true)) - Expect(mt.Spec.Template.Spec.Network.Devices[0].DHCP6).To(Equal(true)) - Expect(mt.Spec.Template.Spec.Network.Devices[0].Nameservers).To(Equal(options.VSphere.Nameservers)) - - obj, _, _, _ = clusterClient.CreateResourceArgsForCall(2) - md := obj.(*capi.MachineDeployment) - Expect(md.Name).To(Equal("test-cluster-np-2")) - Expect(md.Annotations).To(Equal(map[string]string{})) - Expect(md.ResourceVersion).To(Equal("")) - Expect(md.Spec.Replicas).To(Equal(options.Replicas)) - }) - }) - }) - Context("AWS machine deployment", func() { - var awsMachineTemplate aws.AWSMachineTemplate - BeforeEach(func() { - az := "us-west-1" - existingReplicas := int32(1) - md1 = capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-cluster-np-1", - Annotations: map[string]string{ - "key1": "value1", - "key2": "value2", - }, - }, - Spec: capi.MachineDeploymentSpec{ - Replicas: &existingReplicas, - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "oldkey": "oldvalue", - }, - }, - Spec: capi.MachineSpec{ - Bootstrap: capi.Bootstrap{ - ConfigRef: &corev1.ObjectReference{ - Name: "test-cluster-np-1-kct", - }, - }, - InfrastructureRef: corev1.ObjectReference{ - Name: "test-cluster-np-1-mt", - Kind: constants.KindAWSMachineTemplate, - }, - FailureDomain: &az, - }, - }, - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{}, - }, - }, - } - md3.Spec.Template.Labels = map[string]string{ - "existing": "md3", - } - md3.Spec.Template.Spec.InfrastructureRef.Kind = constants.KindAWSMachineTemplate - md3.Spec.Selector.MatchLabels = map[string]string{} - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1, md3}, nil) - awsMachineTemplate = aws.AWSMachineTemplate{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-cluster-np-1-mt", - }, - Spec: aws.AWSMachineTemplateSpec{ - Template: aws.AWSMachineTemplateResource{ - Spec: aws.AWSMachineSpec{ - InstanceType: "t3.large", - }, - }, - }, - } - options.AZ = "us-west-2" - options.NodeMachineType = "t3.xlarge" - - callIndex := 0 - clusterClient.GetResourceStub = func(i interface{}, s1, s2 string, pvf clusterclient.PostVerifyrFunc, po *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := i.(*v1beta1.KubeadmConfigTemplate) - *kct = kubeadmConfigTemplate - callIndex++ - return nil - } - if callIndex == 1 { - mt := i.(*aws.AWSMachineTemplate) - *mt = awsMachineTemplate - callIndex++ - return nil - } - return nil - } - }) - clusterClient.CreateResourceReturnsOnCall(0, nil) - clusterClient.CreateResourceReturnsOnCall(1, nil) - clusterClient.CreateNamespaceReturnsOnCall(2, nil) - When("Machine Deployment creates successfully from default md", func() { - It("should properly set all values for created resources", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(clusterClient.CreateResourceCallCount()).To(Equal(3)) - - obj, _, _, _ := clusterClient.CreateResourceArgsForCall(0) - kct := obj.(*v1beta1.KubeadmConfigTemplate) - Expect(kct.Annotations).To(Equal(map[string]string{})) - Expect(kct.ResourceVersion).To(Equal("")) - Expect(kct.Name).To(Equal("test-cluster-np-2-kct")) - Expect(kct.Spec.Template.Spec.JoinConfiguration.NodeRegistration.KubeletExtraArgs["node-labels"]).To(Equal("key1=value1,key2=value2")) - - obj, _, _, _ = clusterClient.CreateResourceArgsForCall(1) - mt := obj.(*aws.AWSMachineTemplate) - Expect(mt.Name).To(Equal("test-cluster-np-2-mt")) - Expect(mt.Annotations).To(Equal(map[string]string{})) - Expect(mt.ResourceVersion).To(Equal("")) - Expect(mt.Spec.Template.Spec.InstanceType).To(Equal(options.NodeMachineType)) - - obj, _, _, _ = clusterClient.CreateResourceArgsForCall(2) - md := obj.(*capi.MachineDeployment) - Expect(md.Name).To(Equal("test-cluster-np-2")) - Expect(md.Annotations).To(Equal(map[string]string{})) - Expect(md.ResourceVersion).To(Equal("")) - Expect(*md.Spec.Template.Spec.FailureDomain).To(Equal(options.AZ)) - Expect(md.Spec.Replicas).To(Equal(options.Replicas)) - }) - }) - When("Machine Deployment creates successfully from user selected md", func() { - BeforeEach(func() { - options.BaseMachineDeployment = "test-cluster-np-3" - }) - It("should properly set all values for created resources", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(clusterClient.CreateResourceCallCount()).To(Equal(3)) - - obj, _, _, _ := clusterClient.CreateResourceArgsForCall(0) - kct := obj.(*v1beta1.KubeadmConfigTemplate) - Expect(kct.Annotations).To(Equal(map[string]string{})) - Expect(kct.ResourceVersion).To(Equal("")) - Expect(kct.Name).To(Equal("test-cluster-np-2-kct")) - Expect(kct.Spec.Template.Spec.JoinConfiguration.NodeRegistration.KubeletExtraArgs["node-labels"]).To(Equal("key1=value1,key2=value2")) - - obj, _, _, _ = clusterClient.CreateResourceArgsForCall(1) - mt := obj.(*aws.AWSMachineTemplate) - Expect(mt.Name).To(Equal("test-cluster-np-2-mt")) - Expect(mt.Annotations).To(Equal(map[string]string{})) - Expect(mt.ResourceVersion).To(Equal("")) - Expect(mt.Spec.Template.Spec.InstanceType).To(Equal(options.NodeMachineType)) - - obj, _, _, _ = clusterClient.CreateResourceArgsForCall(2) - md := obj.(*capi.MachineDeployment) - Expect(md.Name).To(Equal("test-cluster-np-2")) - Expect(md.Annotations).To(Equal(map[string]string{})) - Expect(md.ResourceVersion).To(Equal("")) - Expect(*md.Spec.Template.Spec.FailureDomain).To(Equal(options.AZ)) - Expect(md.Spec.Replicas).To(Equal(options.Replicas)) - Expect(md.Spec.Template.Labels).To(HaveKeyWithValue("existing", "md3")) - }) - }) - }) - Context("Azure machine deployment", func() { - var azureMachineTemplate azure.AzureMachineTemplate - BeforeEach(func() { - az := "1" - existingReplicas := int32(1) - md1 = capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-cluster-np-1", - Annotations: map[string]string{ - "key1": "value1", - "key2": "value2", - }, - }, - Spec: capi.MachineDeploymentSpec{ - Replicas: &existingReplicas, - Template: capi.MachineTemplateSpec{ - ObjectMeta: capi.ObjectMeta{ - Labels: map[string]string{ - "oldkey": "oldvalue", - }, - }, - Spec: capi.MachineSpec{ - Bootstrap: capi.Bootstrap{ - ConfigRef: &corev1.ObjectReference{ - Name: "test-cluster-np-1-kct", - }, - }, - InfrastructureRef: corev1.ObjectReference{ - Name: "test-cluster-np-1-mt", - Kind: constants.KindAzureMachineTemplate, - }, - FailureDomain: &az, - }, - }, - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{}, - }, - }, - } - clusterClient.GetMDObjectForClusterReturns([]capi.MachineDeployment{md1}, nil) - azureMachineTemplate = azure.AzureMachineTemplate{ - ObjectMeta: metav1.ObjectMeta{ - Name: "test-cluster-np-1-mt", - }, - Spec: azure.AzureMachineTemplateSpec{ - Template: azure.AzureMachineTemplateResource{ - Spec: azure.AzureMachineSpec{ - VMSize: "Standard_D3s", - }, - }, - }, - } - options.AZ = "2" - options.NodeMachineType = "Standard_B2s" - - callIndex := 0 - clusterClient.GetResourceStub = func(i interface{}, s1, s2 string, pvf clusterclient.PostVerifyrFunc, po *clusterclient.PollOptions) error { - if callIndex == 0 { - kct := i.(*v1beta1.KubeadmConfigTemplate) - *kct = kubeadmConfigTemplate - callIndex++ - return nil - } - if callIndex == 1 { - mt := i.(*azure.AzureMachineTemplate) - *mt = azureMachineTemplate - callIndex++ - return nil - } - return nil - } - }) - clusterClient.CreateResourceReturnsOnCall(0, nil) - clusterClient.CreateResourceReturnsOnCall(1, nil) - clusterClient.CreateNamespaceReturnsOnCall(2, nil) - When("Machine Deployment creates successfully", func() { - It("should properly set all values for created resources", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(clusterClient.CreateResourceCallCount()).To(Equal(3)) - - obj, _, _, _ := clusterClient.CreateResourceArgsForCall(0) - kct := obj.(*v1beta1.KubeadmConfigTemplate) - Expect(kct.Annotations).To(Equal(map[string]string{})) - Expect(kct.ResourceVersion).To(Equal("")) - Expect(kct.Name).To(Equal("test-cluster-np-2-kct")) - Expect(kct.Spec.Template.Spec.JoinConfiguration.NodeRegistration.KubeletExtraArgs["node-labels"]).To(Equal("key1=value1,key2=value2")) - Expect(kct.Spec.Template.Spec.Files[0].ContentFrom.Secret.Name).To(Equal("test-cluster-np-2-mt-azure-json")) - - obj, _, _, _ = clusterClient.CreateResourceArgsForCall(1) - mt := obj.(*azure.AzureMachineTemplate) - Expect(mt.Name).To(Equal("test-cluster-np-2-mt")) - Expect(mt.Annotations).To(Equal(map[string]string{})) - Expect(mt.ResourceVersion).To(Equal("")) - Expect(mt.Spec.Template.Spec.VMSize).To(Equal(options.NodeMachineType)) - - obj, _, _, _ = clusterClient.CreateResourceArgsForCall(2) - md := obj.(*capi.MachineDeployment) - Expect(md.Name).To(Equal("test-cluster-np-2")) - Expect(md.Annotations).To(Equal(map[string]string{})) - Expect(md.ResourceVersion).To(Equal("")) - Expect(*md.Spec.Template.Spec.FailureDomain).To(Equal(options.AZ)) - Expect(md.Spec.Replicas).To(Equal(options.Replicas)) - }) - }) - }) - }) - }) -}) diff --git a/tkg/client/machine_health_check.go b/tkg/client/machine_health_check.go deleted file mode 100644 index b33882055a..0000000000 --- a/tkg/client/machine_health_check.go +++ /dev/null @@ -1,409 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "encoding/json" - "fmt" - "strings" - "time" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// machinehealthcheck related default and constants -const ( - DefaulUnhealthyConditionTimeout = "5m" - DefaultNodeStartupTimeout = "20m" - DefaultNodePoolSuffix = "worker-pool" - NodePoolKey = "node-pool" -) - -// UnhealthyConditions unhealthy condition map -var UnhealthyConditions = map[string]bool{ - string(corev1.NodeReady): true, - string(corev1.NodeMemoryPressure): true, - string(corev1.NodeDiskPressure): true, - string(corev1.NodePIDPressure): true, - string(corev1.NodeNetworkUnavailable): true, -} - -// ConditionStatus condition status map -var ConditionStatus = map[string]bool{ - string(corev1.ConditionTrue): true, - string(corev1.ConditionFalse): true, - string(corev1.ConditionUnknown): true, -} - -// MachineHealthCheckOptions machinehealthcheck options -type MachineHealthCheckOptions struct { - ClusterName string - MachineHealthCheckName string - Namespace string - MatchLabel string -} - -// SetMachineHealthCheckOptions machinehealthcheck setter options -type SetMachineHealthCheckOptions struct { - ClusterName string - Namespace string - MachineHealthCheckName string - MatchLables []string - UnhealthyConditions []string - NodeStartupTimeout string -} - -// MachineHealthCheck object -type MachineHealthCheck struct { - Name string `json:"name"` - Namespace string `json:"namespace"` - Spec capi.MachineHealthCheckSpec `json:"spec"` - Status capi.MachineHealthCheckStatus `json:"status"` -} - -// DeleteMachineHealthCheck delete machinehealthcheck -func (c *TkgClient) DeleteMachineHealthCheck(options MachineHealthCheckOptions) error { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - clusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return errors.Wrap(err, "unable to get cluster client") - } - - cluster, err := findCluster(clusterClient, options.ClusterName, options.Namespace) - if err != nil { - return err - } - - if cluster.Spec.Topology != nil { - return errors.New("deleting machine health checks on clusterclass based clusters is not supported") - } - - if options.Namespace == "" { - options.Namespace = cluster.Namespace - log.Infof("use %s as default namespace", options.Namespace) - } - - return c.DeleteMachineHealthCheckWithClusterClient(clusterClient, options) -} - -// DeleteMachineHealthCheckWithClusterClient delete machinehealthcheck with client -func (c *TkgClient) DeleteMachineHealthCheckWithClusterClient(clusterClient clusterclient.Client, options MachineHealthCheckOptions) error { - candidates, err := getMachineHealthCheckCandidates(clusterClient, options.ClusterName, options.Namespace, options.MachineHealthCheckName, options.MatchLabel) - if err != nil { - return errors.Wrap(err, "unable to get the MachineHealthCheck object") - } - - if len(candidates) == 0 { - return errors.Errorf("MachineHealthCheck not found for cluster %s in namespace %s", options.ClusterName, options.Namespace) - } - - if len(candidates) > 1 { - return errors.Errorf("multiple MachineHealthCheck found for cluster %s in namespace %s", options.ClusterName, options.Namespace) - } - - mhc := &capi.MachineHealthCheck{} - mhc.Name = candidates[0].Name - mhc.Namespace = candidates[0].Namespace - return clusterClient.DeleteResource(mhc) -} - -// GetMachineHealthChecks gets machinehealthcheck -func (c *TkgClient) GetMachineHealthChecks(options MachineHealthCheckOptions) ([]MachineHealthCheck, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return []MachineHealthCheck{}, errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - clusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return []MachineHealthCheck{}, errors.Wrap(err, "unable to get cluster client while getting machine health checks") - } - - _, err = findCluster(clusterClient, options.ClusterName, options.Namespace) - if err != nil { - return []MachineHealthCheck{}, err - } - - return c.GetMachineHealthChecksWithClusterClient(clusterClient, options) -} - -// GetMachineHealthChecksWithClusterClient gets machinehealthcheck with client -func (c *TkgClient) GetMachineHealthChecksWithClusterClient(clusterClient clusterclient.Client, options MachineHealthCheckOptions) ([]MachineHealthCheck, error) { - res := []MachineHealthCheck{} - - candidates, err := getMachineHealthCheckCandidates(clusterClient, options.ClusterName, options.Namespace, options.MachineHealthCheckName, options.MatchLabel) - if err != nil { - return res, nil - } - - for i := range candidates { - obj := MachineHealthCheck{ - Name: candidates[i].ObjectMeta.Name, - Namespace: candidates[i].ObjectMeta.Namespace, - Spec: candidates[i].Spec, - Status: candidates[i].Status, - } - res = append(res, obj) - } - - return res, nil -} - -func getMachineHealthCheckCandidates(clusterClient clusterclient.Client, clusterName, namespace, mhcName, matchLabel string) ([]capi.MachineHealthCheck, error) { - mhcList := &capi.MachineHealthCheckList{} - err := clusterClient.ListResources(mhcList, &crtclient.ListOptions{Namespace: namespace}) - if err != nil { - return []capi.MachineHealthCheck{}, err - } - - candidates := []capi.MachineHealthCheck{} - - for i := range mhcList.Items { - if mhcList.Items[i].Spec.ClusterName == clusterName && - (namespace == "" || namespace == mhcList.Items[i].Namespace) && - (mhcName == "" || mhcName == mhcList.Items[i].Name) { - _, ok := mhcList.Items[i].Spec.Selector.MatchLabels[matchLabel] - if matchLabel == "" || ok { - candidates = append(candidates, mhcList.Items[i]) - } - } - } - - return candidates, nil -} - -func findCluster(clusterClient clusterclient.Client, clusterName, namespace string) (capi.Cluster, error) { - var result capi.Cluster - clusters, err := clusterClient.ListClusters(namespace) - if err != nil { - return result, err - } - - count := 0 - for i := range clusters { - if clusters[i].Name == clusterName { - count++ - result = clusters[i] - } - } - - if count > 1 { - return result, errors.Errorf("found multiple clusters with name %s, please specify a namespace", clusterName) - } - if count == 0 { - return result, errors.Errorf("cluster %s not found", clusterName) - } - - return result, nil -} - -// SetMachineHealthCheck sets machinehealthcheck -func (c *TkgClient) SetMachineHealthCheck(options *SetMachineHealthCheckOptions) error { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - clusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return errors.Wrap(err, "unable to get cluster client") - } - - cluster, err := findCluster(clusterClient, options.ClusterName, options.Namespace) - if err != nil { - return err - } - - if cluster.Spec.Topology != nil { - return errors.New("setting machine health checks on clusterclass based clusters is not supported") - } - - if options.Namespace == "" { - options.Namespace = cluster.Namespace - log.Infof("use %s as default namespace", options.Namespace) - } - - candidates, err := getMachineHealthCheckCandidates(clusterClient, options.ClusterName, options.Namespace, options.MachineHealthCheckName, "") - if err != nil { - return err - } - if len(candidates) == 0 { - return c.CreateMachineHealthCheck(clusterClient, options) - } - - if len(candidates) > 1 { - return errors.Errorf("multiple MachineHealthCheck found for cluster %s in namespace %s", options.ClusterName, options.Namespace) - } - return c.UpdateMachineHealthCheck(&candidates[0], clusterClient, options) -} - -// CreateMachineHealthCheck creates machinehealthchecks -func (c *TkgClient) CreateMachineHealthCheck(clusterClient clusterclient.Client, options *SetMachineHealthCheckOptions) error { - var mhc capi.MachineHealthCheck - err := setDefaultSetMachineHealthCheckOptions(options) - if err != nil { - return err - } - - mhc.Name = options.MachineHealthCheckName - mhc.Namespace = options.Namespace - mhc.Spec.ClusterName = options.ClusterName - - err = setNodeStartupTimeout(&mhc, options.NodeStartupTimeout) - if err != nil { - return err - } - - for _, uhc := range options.UnhealthyConditions { - condition, err := getUnhealthConditions(uhc) - if err != nil { - return err - } - item := condition - mhc.Spec.UnhealthyConditions = append(mhc.Spec.UnhealthyConditions, item) - } - - err = setMatchLabels(&mhc, options.MatchLables) - if err != nil { - return err - } - - return clusterClient.CreateResource(&mhc, mhc.Name, mhc.Namespace) -} - -func setDefaultSetMachineHealthCheckOptions(options *SetMachineHealthCheckOptions) error { - if options.MachineHealthCheckName == "" { - options.MachineHealthCheckName = options.ClusterName - } - - if len(options.MatchLables) == 0 { - options.MatchLables = append(options.MatchLables, fmt.Sprintf("%s:%s-%s", NodePoolKey, options.ClusterName, DefaultNodePoolSuffix)) - } - - if options.NodeStartupTimeout == "" { - options.NodeStartupTimeout = DefaultNodeStartupTimeout - } - - if len(options.UnhealthyConditions) == 0 { - options.UnhealthyConditions = append(options.UnhealthyConditions, fmt.Sprintf("%s:%s:%s", string(corev1.NodeReady), string(corev1.ConditionFalse), DefaulUnhealthyConditionTimeout), fmt.Sprintf("%s:%s:%s", string(corev1.NodeReady), string(corev1.ConditionUnknown), DefaulUnhealthyConditionTimeout)) - } - - return nil -} - -// UpdateMachineHealthCheck updates machinehealthcheck -func (c *TkgClient) UpdateMachineHealthCheck(candidate *capi.MachineHealthCheck, clusterClient clusterclient.Client, options *SetMachineHealthCheckOptions) error { - oldMHC := candidate - newMHC := capi.MachineHealthCheck{} - newMHC.Spec = *oldMHC.Spec.DeepCopy() - - err := setMatchLabels(&newMHC, options.MatchLables) - if err != nil { - return err - } - - for _, newCondition := range options.UnhealthyConditions { - condition, err := getUnhealthConditions(newCondition) - if err != nil { - return err - } - - exist := false - for i, oldCondition := range oldMHC.Spec.UnhealthyConditions { - if oldCondition.Type == condition.Type && oldCondition.Status == condition.Status { - newMHC.Spec.UnhealthyConditions[i].Timeout = condition.Timeout - exist = true - } - } - - if !exist { - item := condition - newMHC.Spec.UnhealthyConditions = append(newMHC.Spec.UnhealthyConditions, item) - } - } - - if options.NodeStartupTimeout != "" { - err = setNodeStartupTimeout(&newMHC, options.NodeStartupTimeout) - if err != nil { - return err - } - } - - bytes, err := json.Marshal(newMHC) - if err != nil { - return err - } - - return clusterClient.PatchResource(oldMHC, oldMHC.Name, oldMHC.Namespace, string(bytes), types.MergePatchType, nil) -} - -func getUnhealthConditions(condition string) (capi.UnhealthyCondition, error) { - strs := strings.Split(condition, ":") - if len(strs) != 3 { - return capi.UnhealthyCondition{}, errors.New("please specify the unhealthConditions using the following format: NodeConditionType:ConditionStatus:Timeout") - } - - if _, ok := UnhealthyConditions[strs[0]]; !ok { - return capi.UnhealthyCondition{}, errors.Errorf("NodeConditionType %s is not supported", strs[0]) - } - - if _, ok := ConditionStatus[strs[1]]; !ok { - return capi.UnhealthyCondition{}, errors.Errorf("ConditionStatus %s is not supported", strs[1]) - } - - d, err := time.ParseDuration(strs[2]) - if err != nil { - return capi.UnhealthyCondition{}, errors.Wrap(err, "cannot parse the timeout value") - } - - return capi.UnhealthyCondition{ - Type: corev1.NodeConditionType(strings.TrimSpace(strs[0])), - Status: corev1.ConditionStatus(strings.TrimSpace(strs[1])), - Timeout: metav1.Duration{Duration: d}, - }, nil -} - -func setMatchLabels(mhc *capi.MachineHealthCheck, labels []string) error { - if mhc.Spec.Selector.MatchLabels == nil { - mhc.Spec.Selector.MatchLabels = make(map[string]string) - } - for _, label := range labels { - strs := strings.Split(label, ":") - if len(strs) != 2 { - return errors.New("please specify the matchLabels using the following format: label-key:label-value") - } - mhc.Spec.Selector.MatchLabels[strings.TrimSpace(strs[0])] = strings.TrimSpace(strs[1]) - } - return nil -} - -func setNodeStartupTimeout(mhc *capi.MachineHealthCheck, timeout string) error { - d, err := time.ParseDuration(timeout) - if err != nil { - return errors.Wrap(err, "cannot parse the timeout value") - } - mhc.Spec.NodeStartupTimeout = &metav1.Duration{Duration: d} - return nil -} diff --git a/tkg/client/management_components.go b/tkg/client/management_components.go deleted file mode 100644 index c2fece003e..0000000000 --- a/tkg/client/management_components.go +++ /dev/null @@ -1,583 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "fmt" - "os" - "path/filepath" - "regexp" - "strings" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" - kerrors "k8s.io/apimachinery/pkg/util/errors" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" - "github.com/vmware-tanzu/tanzu-framework/tkg/carvelhelpers" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/managementcomponents" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -func (c *TkgClient) InstallOrUpgradeKappController(clusterClient clusterclient.Client, operationType constants.OperationType, upgrade bool) error { - // Get kapp-controller configuration file - kappControllerConfigFile, err := c.getKappControllerConfigFile(clusterClient, upgrade) - if err != nil { - return err - } - - kappControllerOptions := managementcomponents.KappControllerOptions{ - KappControllerConfigFile: kappControllerConfigFile, - KappControllerInstallNamespace: constants.TkgNamespace, - } - err = managementcomponents.InstallKappController(clusterClient, kappControllerOptions, operationType) - - // Remove intermediate config files if err is empty - if err == nil { - os.Remove(kappControllerConfigFile) - } - return err -} - -// RemoveObsoleteManagementComponents lists and removes management cluster components that are obsoleted by new -// management packages, e.g. the tkr-controller-manager deployment in tkr-system namespace. -func RemoveObsoleteManagementComponents(clusterClient clusterclient.Client) error { - objectsToDelete, err := listObjectsToDelete(clusterClient) - if err != nil { - return err - } - - for _, object := range objectsToDelete { - err := clusterClient.DeleteResource(object) - if kerrors.FilterOut(err, apierrors.IsNotFound) != nil { - return errors.Wrapf(err, "unable to delete resource %s: '%s/%s'", - object.GetObjectKind().GroupVersionKind(), object.GetNamespace(), object.GetName()) - } - } - return nil -} - -func listObjectsToDelete(clusterClient clusterclient.Client) ([]client.Object, error) { - var objectsToDelete []client.Object - - kindsOfObjectsToDelete := map[schema.GroupVersionKind][]client.ListOption{ - { - Group: "addons.cluster.x-k8s.io", - Version: "v1beta1", - Kind: "ClusterResourceSet", - }: {client.InNamespace(constants.TkrNamespace)}, - { - Group: "apps", - Version: "v1", - Kind: "Deployment", - }: {client.InNamespace(constants.TkrNamespace)}, - } - - for gvk, listOptions := range kindsOfObjectsToDelete { - objectList := &unstructured.UnstructuredList{} - objectList.SetGroupVersionKind(gvk) - - if err := clusterClient.ListResources(objectList, listOptions...); err != nil { - return nil, errors.Wrapf(err, "unable to list resources: %s", gvk.String()) - } - - for i := range objectList.Items { - objectsToDelete = append(objectsToDelete, &objectList.Items[i]) - } - } - - return objectsToDelete, nil -} - -// InstallOrUpgradeManagementComponents install management components to the cluster -func (c *TkgClient) InstallOrUpgradeManagementComponents(mcClient clusterclient.Client, pkgClient packageclient.PackageClient, kubecontext string, upgrade bool) error { - managementPackageRepoImage, err := c.tkgBomClient.GetManagementPackageRepositoryImage() - if err != nil { - return errors.Wrap(err, "unable to get management package repository image") - } - - managementPackageVersion := "" - - // Override management package repository image if specified as part of below environment variable - // NOTE: this override is only for testing purpose and we don't expect this to be used in production scenario - mprImage := os.Getenv("_MANAGEMENT_PACKAGE_REPO_IMAGE") - if mprImage != "" { - managementPackageRepoImage = mprImage - } - - // Override the version to use for management packages if specified as part of below environment variable - // NOTE: this override is only for testing purpose and we don't expect this to be used in production scenario - mpVersion := os.Getenv("_MANAGEMENT_PACKAGE_VERSION") - if mpVersion != "" { - managementPackageVersion = mpVersion - } - - managementPackageVersion = strings.TrimLeft(managementPackageVersion, "v") - - var addonsManagerPackageVersion string - if upgrade { - addonsManagerPackageVersion, err = c.GetAddonsManagerPackageversion(managementPackageVersion) - if err != nil { - return err - } - } else { - addonsManagerPackageVersion = managementPackageVersion - envDefinedVersion := os.Getenv("_ADDONS_MANAGER_PACKAGE_VERSION") - if envDefinedVersion != "" { - addonsManagerPackageVersion = strings.TrimLeft(envDefinedVersion, "v") - } - } - - onBootstrapCluster := true - if kubecontext != "" { - onBootstrapCluster = false - } - - // Get TKG package's values file - tkgPackageValuesFile, err := c.getTKGPackageConfigValuesFile(mcClient, managementPackageVersion, addonsManagerPackageVersion, upgrade, onBootstrapCluster) - if err != nil { - return err - } - - managementcomponentsInstallOptions := managementcomponents.ManagementComponentsInstallOptions{ - ClusterOptions: managementcomponents.ClusterOptions{ - Kubecontext: kubecontext, - }, - ManagementPackageRepositoryOptions: managementcomponents.ManagementPackageRepositoryOptions{ - ManagementPackageRepoImage: managementPackageRepoImage, - TKGPackageValuesFile: tkgPackageValuesFile, - PackageVersion: managementPackageVersion, - PackageInstallTimeout: c.getPackageInstallTimeoutFromConfig(), - }, - } - - err = managementcomponents.InstallManagementComponents(mcClient, pkgClient, &managementcomponentsInstallOptions) - - // Remove intermediate config files if err is empty - if err == nil { - os.Remove(tkgPackageValuesFile) - } - - return err -} - -// InstallAKO install AKO to the cluster -func (c *TkgClient) InstallAKO(mcClient clusterclient.Client) error { - // Get AKO file - akoPackageInstallFile, err := c.getAKOPackageInstallFile(mcClient) - if err != nil { - return err - } - - // Apply ako packageinstall configuration - if err := mcClient.ApplyFile(akoPackageInstallFile); err != nil { - return errors.Wrapf(err, "error installing %s", constants.AKODeploymentName) - } - // Remove intermediate config files if err is empty - if err == nil { - os.Remove(akoPackageInstallFile) - } - // no need to wait for AKO packageInstall to be ready. It will be ready once the AKOO - // creates the secret for it when a cluster is created. - // this is to workaround a bug that AKO might allocate control plane HA IP to pinniped service - return err -} - -// GetAddonsManagerPackageversion returns a addons manager package version -func (c *TkgClient) GetAddonsManagerPackageversion(managementPackageVersion string) (string, error) { - envDefinedVersion := os.Getenv("_ADDONS_MANAGER_PACKAGE_VERSION") - if envDefinedVersion != "" { - return strings.TrimLeft(envDefinedVersion, "v"), nil - } - packageVersion := managementPackageVersion - var err error - if packageVersion == "" { - packageVersion, err = c.tkgBomClient.GetManagementPackagesVersion() - if err != nil { - return "", err - } - } - packageVersion = strings.TrimLeft(packageVersion, "v") - // the following is done to address https://github.com/vmware-tanzu/tanzu-framework/issues/3894 - match, _ := regexp.MatchString("\\+vmware.\\d+$", packageVersion) - if !match { - packageVersion = packageVersion + "+vmware.1" - } - return packageVersion, nil -} - -func (c *TkgClient) getTKGPackageConfigValuesFile(mcClient clusterclient.Client, managementPackageVersion, addonsManagerPackageVersion string, upgrade, onBootstrapCluster bool) (string, error) { - var userProviderConfigValues map[string]interface{} - var err error - - if upgrade { - userProviderConfigValues, err = c.getUserConfigVariableValueMapFromSecret(mcClient) - } else { - userProviderConfigValues, err = c.getUserConfigVariableValueMap() - } - - if err != nil { - return "", err - } - - tkgBomConfig, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return "", err - } - - valuesFile, err := managementcomponents.GetTKGPackageConfigValuesFileFromUserConfig(managementPackageVersion, addonsManagerPackageVersion, userProviderConfigValues, tkgBomConfig, c.TKGConfigReaderWriter(), onBootstrapCluster) - if err != nil { - return "", err - } - - return valuesFile, nil -} - -func (c *TkgClient) getUserConfigVariableValueMap() (map[string]interface{}, error) { - path, err := c.tkgConfigPathsClient.GetConfigDefaultsFilePath() - if err != nil { - return nil, err - } - - return c.GetUserConfigVariableValueMap(path, c.TKGConfigReaderWriter()) -} - -func (c *TkgClient) getUserConfigVariableValueMapFromSecret(clusterClient clusterclient.Client) (map[string]interface{}, error) { - pollOptions := &clusterclient.PollOptions{Interval: clusterclient.CheckResourceInterval, Timeout: 3 * clusterclient.CheckResourceInterval} - configValues := make(map[string]interface{}) - // In ClusterClass based cluster, the user config variables can be retrieved from the tkg-pkg package data values secret directly - bytes, err := clusterClient.GetSecretValue(fmt.Sprintf(packagedatamodel.SecretName, constants.TKGManagementPackageInstallName, constants.TkgNamespace), constants.TKGPackageValuesFile, constants.TkgNamespace, pollOptions) - if err == nil { - var tkgPackageConfig managementcomponents.TKGPackageConfig - - err = yaml.Unmarshal(bytes, &tkgPackageConfig) - if err != nil { - return nil, errors.Wrapf(err, "unable to unmarshal configuration from secret: %v-%v-values, namespace: %v", constants.TKGManagementPackageInstallName, constants.TkgNamespace, constants.TkgNamespace) - } - configValues = tkgPackageConfig.ConfigValues - - } else if err != nil && apierrors.IsNotFound(err) { - // Handle the upgrade from legacy (non-package-based-cc) management cluster as - // legacy (non-package-based-cc) management cluster will not have the secret tkg-pkg-tkg-system-values - // defined on the cluster. Github issue: https://github.com/vmware-tanzu/tanzu-framework/issues/2147 - clusterName, _, err := c.getRegionalClusterNameAndNamespace(clusterClient) - if err != nil { - return nil, errors.Wrap(err, "failed to get management cluster name and namespace") - } - // So we retrieve the user config variables from the -config-values secret - // which was managed in legacy ytt template providers/ytt/09_miscellaneous - bytes, err := clusterClient.GetSecretValue(fmt.Sprintf("%s-config-values", clusterName), "value", constants.TkgNamespace, pollOptions) - if err != nil { - return nil, errors.Wrapf(err, "unable to get the %s-config-values secret", clusterName) - } - - err = yaml.Unmarshal(bytes, &configValues) - if err != nil { - return nil, errors.Wrapf(err, "unable to yaml unmashal the data.value of %s-config-values secret", clusterName) - } - - // retrieve the akoo variables from legacy addon secret. - akooAddonSecretValues, found, err := GetAKOOAddonSecretValues(clusterClient, clusterName, false) - if err != nil { - return nil, errors.Wrap(err, "unable to get akoo addon secret values") - } - - if found { - err = RetrieveAKOOVariablesFromAddonSecretValues(clusterName, configValues, akooAddonSecretValues) - if err != nil { - return nil, errors.Wrap(err, "unable to handle the akoo specific variables") - } - } - - } else { - return nil, errors.Wrapf(err, "unable to get the secret %v-%v-values, namespace: %v", constants.TKGManagementPackageInstallName, constants.TkgNamespace, constants.TkgNamespace) - } - - err = c.mutateUserConfigVariableValueMap(configValues) - if err != nil { - return nil, errors.Wrap(err, "unable to mapping the current configuration variables to the cluster's existing configuration") - } - - return configValues, nil -} - -// mutateUserConfigVariableValueMap get user config variables to overwrite the existing config variables that -// retrieved from the cluster. This is mainly for mutating during cluster upgrading. -func (c *TkgClient) mutateUserConfigVariableValueMap(configValues map[string]interface{}) error { - userProvidedConfigValues, err := c.getUserConfigVariableValueMap() - if err != nil { - return err - } - for k, v := range userProvidedConfigValues { - configValues[k] = v - } - return nil -} - -func (c *TkgClient) getUserConfigVariableValueMapFile(mcClient clusterclient.Client, upgrade bool) (string, error) { - var userConfigValues map[string]interface{} - var err error - - if upgrade { - userConfigValues, err = c.getUserConfigVariableValueMapFromSecret(mcClient) - } else { - userConfigValues, err = c.getUserConfigVariableValueMap() - } - if err != nil { - return "", err - } - - configBytes, err := yaml.Marshal(userConfigValues) - if err != nil { - return "", err - } - - prefix := []byte(`#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -`) - configBytes = append(prefix, configBytes...) - - configFile, err := utils.CreateTempFile("", "*.yaml") - if err != nil { - return "", err - } - err = utils.WriteToFile(configFile, configBytes) - if err != nil { - return "", err - } - return configFile, nil -} - -func (c *TkgClient) getKappControllerConfigFile(mcClient clusterclient.Client, upgrade bool) (string, error) { - kappControllerPackageImage, err := c.tkgBomClient.GetKappControllerPackageImage() - if err != nil { - return "", err - } - - path, err := c.tkgConfigPathsClient.GetTKGProvidersDirectory() - if err != nil { - return "", err - } - kappControllerValuesDirPath := filepath.Join(path, "kapp-controller-values") - - userConfigValuesFile, err := c.getUserConfigVariableValueMapFile(mcClient, upgrade) - if err != nil { - return "", err - } - - defer func() { - // Remove intermediate config files if err is empty - if err == nil { - os.Remove(userConfigValuesFile) - } - }() - - log.V(6).Infof("User ConfigValues File: %v", userConfigValuesFile) - - kappControllerConfigFile, err := ProcessKappControllerPackage(kappControllerPackageImage, userConfigValuesFile, kappControllerValuesDirPath) - if err != nil { - return "", err - } - - return kappControllerConfigFile, nil -} - -func ProcessKappControllerPackage(kappControllerPackageImage, userConfigValuesFile, kappControllerValuesDirPath string) (string, error) { - kappControllerValuesFile, err := GetKappControllerConfigValuesFile(userConfigValuesFile, kappControllerValuesDirPath) - if err != nil { - return "", err - } - - defer func() { - // Remove intermediate config files if err is empty - if err == nil { - os.Remove(kappControllerValuesFile) - } - }() - - log.V(6).Infof("Kapp-controller values-file: %v", kappControllerValuesFile) - - configBytes, err := carvelhelpers.ProcessCarvelPackage(kappControllerPackageImage, kappControllerValuesFile) - if err != nil { - return "", err - } - - configFile, err := utils.CreateTempFile("", "") - if err != nil { - return "", err - } - err = utils.WriteToFile(configFile, configBytes) - if err != nil { - return "", err - } - - log.V(6).Infof("Kapp-controller configuration file: %v", configFile) - return configFile, nil -} - -func GetKappControllerConfigValuesFile(userConfigValuesFile, kappControllerValuesDir string) (string, error) { - kappControllerValuesBytes, err := carvelhelpers.ProcessYTTPackage(kappControllerValuesDir, userConfigValuesFile) - if err != nil { - return "", err - } - - prefix := []byte(`#@data/values -#@overlay/match-child-defaults missing_ok=True -#@overlay/replace ---- -`) - kappControllerValuesBytes = append(prefix, kappControllerValuesBytes...) - kappControllerValuesFile, err := utils.CreateTempFile("", "*.yaml") - if err != nil { - return "", err - } - err = utils.WriteToFile(kappControllerValuesFile, kappControllerValuesBytes) - if err != nil { - return "", err - } - - return kappControllerValuesFile, nil -} - -// GetUserConfigVariableValueMap is a specific implementation expecting to use a flat key-value -// file to provide a source of keys to filter for the valid user provided values. -// For example, this function uses config_default.yaml filepath to find relevant config variables -// and returns the config map of user provided variable among all applicable config variables -func (c *TkgClient) GetUserConfigVariableValueMap(configDefaultFilePath string, rw tkgconfigreaderwriter.TKGConfigReaderWriter) (map[string]interface{}, error) { - bytes, err := os.ReadFile(configDefaultFilePath) - if err != nil { - return nil, err - } - - variables, err := GetConfigVariableListFromYamlData(bytes) - if err != nil { - return nil, err - } - - userProvidedConfigValues := map[string]interface{}{} - for _, k := range variables { - if v, e := rw.Get(k); e == nil { - userProvidedConfigValues[k] = utils.Convert(v) - } - } - - return userProvidedConfigValues, nil -} - -func GetConfigVariableListFromYamlData(bytes []byte) ([]string, error) { - configValues := map[string]interface{}{} - err := yaml.Unmarshal(bytes, &configValues) - if err != nil { - return nil, errors.Wrap(err, "error while unmarshaling") - } - - keys := make([]string, 0, len(configValues)) - for k := range configValues { - keys = append(keys, k) - } - - return keys, nil -} - -func (c *TkgClient) getAKOPackageInstallFile(mcClient clusterclient.Client) (string, error) { - path, err := c.tkgConfigPathsClient.GetTKGProvidersDirectory() - if err != nil { - return "", err - } - akoPackageInstallTemplateDir := filepath.Join(path, "ako") - - userConfigValuesFile, err := c.getUserConfigVariableValueMapFile(mcClient, false) - if err != nil { - return "", err - } - - akoPackageInstallFile, err := ProcessAKOPackageInstallFile(akoPackageInstallTemplateDir, userConfigValuesFile) - if err != nil { - return "", err - } - - return akoPackageInstallFile, nil -} - -func ProcessAKOPackageInstallFile(akoPackageInstallTemplateDir, userConfigValuesFile string) (string, error) { - akoPackageInstallContent, err := carvelhelpers.ProcessYTTPackage(akoPackageInstallTemplateDir, userConfigValuesFile) - if err != nil { - return "", err - } - - akoPackageInstallFile, err := utils.CreateTempFile("", "*.yaml") - if err != nil { - return "", err - } - - if err := utils.WriteToFile(akoPackageInstallFile, akoPackageInstallContent); err != nil { - return "", err - } - - return akoPackageInstallFile, nil -} - -func GetAKOOAddonSecretValues(clusterClient clusterclient.Client, clusterName string, isClusterClassBased bool) ([]byte, bool, error) { - akoOperatorAddonName := fmt.Sprintf("%s-%s-addon", clusterName, constants.AkoOperatorName) - if isClusterClassBased { - akoOperatorAddonName = fmt.Sprintf("%s-v2-values", constants.AkoOperatorName) - } - pollOptions := &clusterclient.PollOptions{Interval: clusterclient.CheckResourceInterval, Timeout: 3 * clusterclient.CheckResourceInterval} - log.V(6).Infof("trying to fetch akoo addon secret %s/%s", constants.TkgNamespace, akoOperatorAddonName) - bytes, err := clusterClient.GetSecretValue(akoOperatorAddonName, "values.yaml", constants.TkgNamespace, pollOptions) - if err != nil && apierrors.IsNotFound(err) { - log.V(6).Infof("akoo addon secret %s/%s not found, akoo was not installed on this management cluster", constants.TkgNamespace, akoOperatorAddonName) - return []byte{}, false, nil - } else if err != nil { - return []byte{}, false, err - } - return bytes, true, nil -} - -func RetrieveAKOOVariablesFromAddonSecretValues(clusterName string, configValues map[string]interface{}, secretValues []byte) error { - if len(secretValues) == 0 { - log.V(6).Info("akoo addon secret content is empty") - return nil - } - - akoOperatorPackage := &managementcomponents.AkoOperatorPackage{} - err := yaml.Unmarshal(secretValues, akoOperatorPackage) - if err != nil { - return errors.Wrap(err, "failed to unmarshal the akoo addon secret values.yaml") - } - - configValues[constants.ConfigVariableAviEnable] = akoOperatorPackage.AkoOperatorPackageValues.AviEnable - configValues[constants.ConfigVariableAviControllerAddress] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviControllerAddress - configValues[constants.ConfigVariableAviControllerUsername] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviControllerUsername - configValues[constants.ConfigVariableAviControllerPassword] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviControllerPassword - configValues[constants.ConfigVariableAviControllerCA] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviControllerCA - configValues[constants.ConfigVariableAviCloudName] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviCloudName - configValues[constants.ConfigVariableAviServiceEngineGroup] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviServiceEngineGroup - configValues[constants.ConfigVariableAviManagementClusterServiceEngineGroup] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviManagementClusterServiceEngineGroup - configValues[constants.ConfigVariableAviDataPlaneNetworkName] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviDataPlaneNetworkName - configValues[constants.ConfigVariableAviDataPlaneNetworkCIDR] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviDataPlaneNetworkCIDR - configValues[constants.ConfigVariableAviControlPlaneNetworkName] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviControlPlaneNetworkName - configValues[constants.ConfigVariableAviControlPlaneNetworkCIDR] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviControlPlaneNetworkCIDR - configValues[constants.ConfigVariableAviManagementClusterDataPlaneNetworkName] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviManagementClusterDataPlaneNetworkName - configValues[constants.ConfigVariableAviManagementClusterDataPlaneNetworkCIDR] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviManagementClusterDataPlaneNetworkCIDR - configValues[constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkName] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviManagementClusterControlPlaneVipNetworkName - configValues[constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkCIDR] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviManagementClusterControlPlaneVipNetworkCIDR - configValues[constants.ConfigVariableVsphereHaProvider] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviControlPlaneHaProvider - configValues[constants.ConfigVariableAviIngressNodeNetworkList] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviIngressNodeNetworkList - configValues[constants.ConfigVariableClusterName] = clusterName - configValues[constants.ConfigVariableAviLabels] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviLabels - configValues[constants.ConfigVariableAviNSXTT1Router] = akoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig.AviNSXTT1Router - - return nil -} diff --git a/tkg/client/management_components_test.go b/tkg/client/management_components_test.go deleted file mode 100644 index 57176cc5f7..0000000000 --- a/tkg/client/management_components_test.go +++ /dev/null @@ -1,499 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "context" - "fmt" - "os" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/rand" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -var _ = Describe("Unit tests for GetUserConfigVariableValueMap", func() { - var ( - err error - tkgClient *TkgClient - configFilePath string - configFileData string - userProviderConfigValues map[string]interface{} - rw tkgconfigreaderwriter.TKGConfigReaderWriter - ) - - sampleConfigFileData1 := ` -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -ABC: -PQR: "" -Test1: -Test2: -Test3: -Test4: -` - sampleConfigFileData2 := `` - - BeforeEach(func() { - rw, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile("", "../fakes/config/config.yaml") - Expect(err).NotTo(HaveOccurred()) - }) - - JustBeforeEach(func() { - configFilePath = writeConfigFileData(configFileData) - userProviderConfigValues, err = tkgClient.GetUserConfigVariableValueMap(configFilePath, rw) - }) - - Context("When only one data value is provided by user", func() { - BeforeEach(func() { - configFileData = sampleConfigFileData1 - rw.Set("ABC", "abc-value") - rw.Set("Test1", "true") - rw.Set("Test2", "null") - rw.Set("Test3", "1") - rw.Set("Test4", "1.2") - }) - It("returns userProviderConfigValues with ABC", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(userProviderConfigValues)).To(Equal(5)) - Expect(userProviderConfigValues["ABC"]).To(Equal("abc-value")) - Expect(userProviderConfigValues["Test1"]).To(Equal(true)) - Expect(userProviderConfigValues["Test2"]).To(BeNil()) - Expect(userProviderConfigValues["Test3"]).To(Equal(uint64(1))) - Expect(userProviderConfigValues["Test4"]).To(Equal(1.2)) - }) - }) - - Context("When all data value is provided by user", func() { - BeforeEach(func() { - configFileData = sampleConfigFileData1 - rw.Set("ABC", "abc-value") - rw.Set("PQR", "pqr-value") - rw.Set("TEST", "test-value") - }) - It("returns userProviderConfigValues with ABC and PQR", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(userProviderConfigValues)).To(Equal(2)) - Expect(userProviderConfigValues["ABC"]).To(Equal("abc-value")) - Expect(userProviderConfigValues["PQR"]).To(Equal("pqr-value")) - }) - }) - - Context("When no config variables are defined in config default", func() { - BeforeEach(func() { - configFileData = sampleConfigFileData2 - rw.Set("TEST", "test-value") - }) - It("returns empty map", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(userProviderConfigValues)).To(Equal(0)) - }) - }) -}) - -var _ = Describe("Unit tests for GetKappControllerConfigValuesFile", func() { - var ( - err error - kappControllerValuesYttDir = "../../providers/kapp-controller-values" - inputDataValuesFile string - processedKappControllerValuesFile string - outputKappControllerValuesFile string - ) - - validateResult := func() { - Expect(err).NotTo(HaveOccurred()) - Expect(processedKappControllerValuesFile).NotTo(BeEmpty()) - filedata1, err := readFileData(processedKappControllerValuesFile) - Expect(err).NotTo(HaveOccurred()) - filedata2, err := readFileData(outputKappControllerValuesFile) - Expect(err).NotTo(HaveOccurred()) - if strings.Compare(filedata1, filedata2) != 0 { - log.Infof("Processed Output: %v", filedata1) - log.Infof("Expected Output: %v", filedata2) - } - Expect(filedata1).To(Equal(filedata2)) - } - - JustBeforeEach(func() { - processedKappControllerValuesFile, err = GetKappControllerConfigValuesFile(inputDataValuesFile, kappControllerValuesYttDir) - }) - - Context("When no config variables are defined by user", func() { - BeforeEach(func() { - inputDataValuesFile = "test/kapp-controller-values/testcase1/uservalues.yaml" - outputKappControllerValuesFile = "test/kapp-controller-values/testcase1/output.yaml" - }) - It("should match the output file", func() { - validateResult() - }) - }) - - Context("When codedns, provider type and cidr variables are defined by user", func() { - BeforeEach(func() { - inputDataValuesFile = "test/kapp-controller-values/testcase2/uservalues.yaml" - outputKappControllerValuesFile = "test/kapp-controller-values/testcase2/output.yaml" - }) - It("should match the output file", func() { - validateResult() - }) - }) - - Context("When custom image repository variables are defined by user", func() { - BeforeEach(func() { - inputDataValuesFile = "test/kapp-controller-values/testcase3/uservalues.yaml" - outputKappControllerValuesFile = "test/kapp-controller-values/testcase3/output.yaml" - }) - It("should match the output file", func() { - validateResult() - }) - }) - -}) - -var _ = Describe("Unit test for GetAddonsManagerPackageversion", func() { - var testClient TkgClient - const EXPECTEDPACKAGEVERSION = "someRandome Version string" - When("_ADDONS_MANAGER_PACKAGE_VERSION is set", func() { - It("should return the value of _ADDONS_MANAGER_PACKAGE_VERSION, and nil error regardless of managementPackageVersion", func() { - - os.Setenv("_ADDONS_MANAGER_PACKAGE_VERSION", EXPECTEDPACKAGEVERSION) - foundPackageVersion, err := testClient.GetAddonsManagerPackageversion("any string") - Expect(err).ToNot(HaveOccurred()) - Expect(foundPackageVersion).To(Equal(EXPECTEDPACKAGEVERSION)) - }) - }) - When("_ADDONS_MANAGER_PACKAGE_VERSION is not set", func() { - const ( - BADBOMCLIENTVERSION = "someversion-here" - GOODBOMCLIENTVERSION = "something-here.+vmware.1" - ) - - BeforeEach(func() { - os.Unsetenv("_ADDONS_MANAGER_PACKAGE_VERSION") - }) - It("returns value based on bomclient", func() { - fakeBomClient := fakes.TKGConfigBomClient{} - fakeBomClient.GetManagementPackagesVersionReturns(BADBOMCLIENTVERSION, nil) - fakeTKGConfigUpdater := fakes.TKGConfigUpdaterClient{} - options := Options{ - TKGBomClient: &fakeBomClient, - TKGConfigUpdater: &fakeTKGConfigUpdater, - } - testClient, err := New(options) - Expect(err).ToNot(HaveOccurred()) - packageVersion, err := testClient.GetAddonsManagerPackageversion("") - Expect(err).ToNot(HaveOccurred()) - Expect(packageVersion).To(Equal(BADBOMCLIENTVERSION + "+vmware.1")) - - fakeBomClient.GetManagementPackagesVersionReturns(GOODBOMCLIENTVERSION, nil) - options.TKGConfigUpdater = &fakeTKGConfigUpdater - testClient, err = New(options) - packageVersion, err = testClient.GetAddonsManagerPackageversion("") - Expect(packageVersion).To(Equal(GOODBOMCLIENTVERSION)) - - }) - It("returns value based on managementPackageVersion ", func() { - managementPackageVersion := "management_package_version" - addonsManagerPackageVersion, err := testClient.GetAddonsManagerPackageversion(managementPackageVersion) - Expect(err).ToNot(HaveOccurred()) - Expect(addonsManagerPackageVersion).To(Equal(managementPackageVersion + "+vmware.1")) - - }) - }) - -}) - -var _ = Describe("RemoveObsoleteManagementComponents()", func() { - var ( - clusterClient *fakes.ClusterClient - fakeClient client.Client - objects []client.Object - ) - - JustBeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - fakeClient = fake.NewClientBuilder().WithScheme(scheme).WithObjects(objects...).Build() - }) - - When("there is stuff to clean up", func() { - BeforeEach(func() { - objects = []client.Object{ - &unstructured.Unstructured{ - Object: map[string]interface{}{ - "apiVersion": "addons.cluster.x-k8s.io/v1beta1", - "kind": "ClusterResourceSet", - "metadata": map[string]interface{}{ - "namespace": constants.TkrNamespace, - "name": rand.String(10), - }, - }, - }, - &unstructured.Unstructured{ - Object: map[string]interface{}{ - "apiVersion": "apps/v1", - "kind": "Deployment", - "metadata": map[string]interface{}{ - "namespace": constants.TkrNamespace, - "name": constants.TkrControllerDeploymentName, - }, - }, - }, - } - }) - - JustBeforeEach(func() { - clusterClient.ListResourcesStub = func(o interface{}, listOptions ...client.ListOption) error { - return fakeClient.List(context.Background(), o.(client.ObjectList), listOptions...) - } - clusterClient.DeleteResourceStub = func(o interface{}) error { - return fakeClient.Delete(context.Background(), o.(client.Object)) - } - }) - - It("should clean it up", func() { - deployment := &unstructured.Unstructured{ - Object: map[string]interface{}{ - "apiVersion": "apps/v1", - "kind": "Deployment", - }, - } - - Expect(fakeClient.Get(context.Background(), types.NamespacedName{ - Namespace: constants.TkrNamespace, - Name: constants.TkrControllerDeploymentName, - }, deployment)).To(Succeed()) - - Expect(RemoveObsoleteManagementComponents(clusterClient)).To(Succeed()) - - err := fakeClient.Get(context.Background(), types.NamespacedName{ - Namespace: constants.TkrNamespace, - Name: constants.TkrControllerDeploymentName, - }, deployment) - Expect(err).To(HaveOccurred()) - Expect(apierrors.IsNotFound(err)).To(BeTrue()) - }) - }) -}) - -func writeConfigFileData(configconfigFileData string) string { - tmpFile, _ := utils.CreateTempFile("", "") - _ = utils.WriteToFile(tmpFile, []byte(configconfigFileData)) - return tmpFile -} - -func readFileData(filePath string) (string, error) { - data, err := os.ReadFile(filePath) - return string(data), err -} - -var _ = Describe("Unit tests for processAKOPackageInstallFile", func() { - var ( - err error - inputDataValuesFile string - processedAKOPackageInstallFile string - outputAKOPackageInstallFile string - akoDir string - AKOPackageInstallTemplateDir = "../../providers/ako" - ) - - validateResult := func() { - Expect(err).NotTo(HaveOccurred()) - Expect(processedAKOPackageInstallFile).NotTo(BeEmpty()) - filedata1, err := readFileData(processedAKOPackageInstallFile) - Expect(err).NotTo(HaveOccurred()) - filedata2, err := readFileData(outputAKOPackageInstallFile) - Expect(err).NotTo(HaveOccurred()) - if strings.Compare(filedata1, filedata2) != 0 { - log.Infof("Processed Output: %v\n", filedata1) - log.Infof("Expected Output: %v\n", filedata2) - } - Expect(filedata1).To(Equal(filedata2)) - } - - JustBeforeEach(func() { - processedAKOPackageInstallFile, err = ProcessAKOPackageInstallFile(AKOPackageInstallTemplateDir, inputDataValuesFile) - Expect(err).NotTo(HaveOccurred()) - }) - - AfterEach(func() { - // Remove intermediate config files if err is empty - if err == nil { - os.RemoveAll(akoDir) - } - }) - - Context("When cluster_name is inside user's config are defined by user", func() { - BeforeEach(func() { - inputDataValuesFile = "test/ako-packageinstall/testcase1/uservalues.yaml" - outputAKOPackageInstallFile = "test/ako-packageinstall/testcase1/output.yaml" - }) - It("should match the output file", func() { - validateResult() - }) - }) - -}) - -var _ = Describe("Unit tests for GetAKOOAddonSecretValues", func() { - var ( - err error - clusterClient *fakes.ClusterClient - clusterName string - secretContent string - bytes []byte - found bool - ) - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - clusterName = "fake-cluster" - secretContent = "foo" - }) - JustBeforeEach(func() { - bytes, found, err = GetAKOOAddonSecretValues(clusterClient, clusterName, false) - }) - Describe("When the ako-operator addon secret is not found", func() { - BeforeEach(func() { - clusterClient.GetSecretValueReturns(nil, apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource")) - }) - It("should return not found with no errors", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(found).To(BeFalse()) - Expect(len(bytes)).To(Equal(0)) - }) - }) - - Describe("When failed to get the ako-operator addon secret", func() { - BeforeEach(func() { - clusterClient.GetSecretValueReturns(nil, errors.New("cannot get the secret")) - }) - It("should return the error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("cannot get the secret")) - Expect(found).To(BeFalse()) - Expect(len(bytes)).To(Equal(0)) - }) - }) - - Describe("When the ako-operator addon secret is found", func() { - BeforeEach(func() { - clusterClient.GetSecretValueCalls(func(secretName string, secretField string, secretNamespace string, pollOptions *clusterclient.PollOptions) ([]byte, error) { - if secretName == fmt.Sprintf("%s-%s-addon", clusterName, constants.AkoOperatorName) && - secretNamespace == constants.TkgNamespace && - secretField == "values.yaml" { - return []byte(secretContent), nil - } - return nil, errors.New("Not expected input") - }) - }) - It("should get the content of the addon secret", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(found).To(BeTrue()) - Expect(len(bytes)).ToNot(Equal(0)) - Expect(string(bytes)).To(Equal(secretContent)) - }) - }) - -}) - -var _ = Describe("Unit tests for RetrieveAKOOVariablesFromAddonSecretValues", func() { - var ( - err error - configValues map[string]interface{} - clusterName string - secretContent string - invalidSecretContent string - secretValues []byte - ) - - BeforeEach(func() { - configValues = map[string]interface{}{} - clusterName = "fake-cluster" - secretContent = ` -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -akoOperator: - avi_enable: true - cluster_name: tkg-mgmt-vc - config: - avi_controller: 10.180.111.173 - avi_username: fakeUserName - avi_password: fakePW - avi_ca_data_b64: fakeCA - avi_cloud_name: Default-Cloud - avi_service_engine_group: Default-Group - avi_management_cluster_service_engine_group: Default-Group - avi_data_network: VM Network - avi_data_network_cidr: 10.180.96.0/20 - avi_control_plane_network: VM Network - avi_control_plane_network_cidr: 10.180.96.0/20 - avi_management_cluster_vip_network_name: VM Network - avi_management_cluster_vip_network_cidr: 10.180.96.0/20 - avi_management_cluster_control_plane_vip_network_name: VM Network - avi_management_cluster_control_plane_vip_network_cidr: 10.180.96.0/20 - avi_control_plane_ha_provider: false -` - invalidSecretContent = "invalid" - }) - - JustBeforeEach(func() { - err = RetrieveAKOOVariablesFromAddonSecretValues(clusterName, configValues, secretValues) - }) - - Describe("When failed to yaml unmashall the ako-operator addon contents", func() { - BeforeEach(func() { - secretValues = []byte(invalidSecretContent) - }) - It("should update the config based on the addon secret", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("cannot unmarshal")) - }) - }) - - Describe("When the ako-operator addon secret content is valid", func() { - BeforeEach(func() { - secretValues = []byte(secretContent) - }) - It("should update the config based on the addon secret", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(configValues[constants.ConfigVariableAviEnable].(bool)).To(Equal(true)) - Expect(configValues[constants.ConfigVariableAviControllerAddress].(string)).To(Equal("10.180.111.173")) - Expect(configValues[constants.ConfigVariableAviControllerUsername].(string)).To(Equal("fakeUserName")) - Expect(configValues[constants.ConfigVariableAviControllerPassword].(string)).To(Equal("fakePW")) - Expect(configValues[constants.ConfigVariableAviControllerCA].(string)).To(Equal("fakeCA")) - Expect(configValues[constants.ConfigVariableAviCloudName].(string)).To(Equal("Default-Cloud")) - Expect(configValues[constants.ConfigVariableAviServiceEngineGroup].(string)).To(Equal("Default-Group")) - Expect(configValues[constants.ConfigVariableAviManagementClusterServiceEngineGroup].(string)).To(Equal("Default-Group")) - Expect(configValues[constants.ConfigVariableAviDataPlaneNetworkName].(string)).To(Equal("VM Network")) - Expect(configValues[constants.ConfigVariableAviDataPlaneNetworkCIDR].(string)).To(Equal("10.180.96.0/20")) - Expect(configValues[constants.ConfigVariableAviControlPlaneNetworkName].(string)).To(Equal("VM Network")) - Expect(configValues[constants.ConfigVariableAviControlPlaneNetworkCIDR].(string)).To(Equal("10.180.96.0/20")) - Expect(configValues[constants.ConfigVariableAviManagementClusterDataPlaneNetworkName].(string)).To(Equal("VM Network")) - Expect(configValues[constants.ConfigVariableAviManagementClusterDataPlaneNetworkCIDR].(string)).To(Equal("10.180.96.0/20")) - Expect(configValues[constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkName].(string)).To(Equal("VM Network")) - Expect(configValues[constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkCIDR].(string)).To(Equal("10.180.96.0/20")) - Expect(configValues[constants.ConfigVariableVsphereHaProvider].(bool)).To(Equal(false)) - Expect(configValues[constants.ConfigVariableClusterName].(string)).To(Equal(clusterName)) - }) - }) -}) diff --git a/tkg/client/mhc_test.go b/tkg/client/mhc_test.go deleted file mode 100644 index 6ef6300968..0000000000 --- a/tkg/client/mhc_test.go +++ /dev/null @@ -1,783 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" // nolint:staticcheck,nolintlint - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" -) - -var _ = Describe("GetMachineHealthChecks", func() { - var ( - err error - regionalClusterClient clusterclient.Client - tkgClient *TkgClient - - crtClientFactory *fakes.CrtClientFactory - - clusterClientOptions clusterclient.Options - fakeClientSet crtclient.Client - kubeconfig string - - results []MachineHealthCheck - desiredResult []MachineHealthCheck - options MachineHealthCheckOptions - - objects []runtime.Object - ) - - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - - crtClientFactory = &fakes.CrtClientFactory{} - - kubeconfig = fakehelper.GetFakeKubeConfigFilePath(testingDir, "../fakes/config/kubeconfig/config1.yaml") - - clusterClientOptions = clusterclient.NewOptions(getFakePoller(), crtClientFactory, getFakeDiscoveryFactory(), nil) - }) - - JustBeforeEach(func() { - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - - regionalClusterClient, err = clusterclient.NewClient(kubeconfig, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - results, err = tkgClient.GetMachineHealthChecksWithClusterClient(regionalClusterClient, options) - }) - - Context("When the cluster has multiple MachineHealthChecks enabled", func() { - BeforeEach(func() { - mhc1 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc1", Namespace: "namespace-1", ClusterName: "my-cluster"}) - mhc2 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc2", Namespace: "namespace-1", ClusterName: "my-cluster"}) - - mhcList := &capi.MachineHealthCheckList{ - Items: []capi.MachineHealthCheck{*mhc1, *mhc2}, - } - - objects = []runtime.Object{mhcList} - options = MachineHealthCheckOptions{ClusterName: "my-cluster"} - - desiredResult = []MachineHealthCheck{ - { - Name: "mhc1", - Namespace: "namespace-1", - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{}, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - { - Name: "mhc2", - Namespace: "namespace-1", - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{}, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - }) - It("should return both MachineHealthCheck associated with the cluster", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(results).To(ConsistOf(desiredResult)) - }) - }) - - Context("When getting a cluster's MachineHealthCheck object by name", func() { - BeforeEach(func() { - mhc1 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc1", Namespace: "namespace-1", ClusterName: "my-cluster"}) - mhc2 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc2", Namespace: "namespace-1", ClusterName: "my-cluster"}) - - mhcList := &capi.MachineHealthCheckList{ - Items: []capi.MachineHealthCheck{*mhc1, *mhc2}, - } - - objects = []runtime.Object{mhcList} - options = MachineHealthCheckOptions{ClusterName: "my-cluster", MachineHealthCheckName: "mhc1"} - desiredResult = []MachineHealthCheck{ - { - Name: "mhc1", - Namespace: "namespace-1", - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{}, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - }) - It("should return the MachineHealthCheck associated with the cluster", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(results).To(ConsistOf(desiredResult)) - }) - }) - - Context("When retrieving MachineHealthCheck by namespace", func() { - BeforeEach(func() { - mhc1 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc1", Namespace: "namespace-1", ClusterName: "my-cluster"}) - mhc2 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc2", Namespace: "namespace-2", ClusterName: "my-cluster"}) - - mhcList := &capi.MachineHealthCheckList{ - Items: []capi.MachineHealthCheck{*mhc1, *mhc2}, - } - - objects = []runtime.Object{mhcList} - options = MachineHealthCheckOptions{ClusterName: "my-cluster", Namespace: "namespace-2"} - desiredResult = []MachineHealthCheck{ - { - Name: "mhc2", - Namespace: "namespace-2", - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{}, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - }) - It("should return the MachineHealthCheck associated with the cluster", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(results).To(ConsistOf(desiredResult)) - }) - }) -}) - -var _ = Describe("DeleteMachineHealthCheck", func() { - var ( - err error - regionalClusterClient clusterclient.Client - tkgClient *TkgClient - - crtClientFactory *fakes.CrtClientFactory - - clusterClientOptions clusterclient.Options - fakeClientSet crtclient.Client - kubeconfig string - - options MachineHealthCheckOptions - - objects []runtime.Object - ) - - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - - crtClientFactory = &fakes.CrtClientFactory{} - - kubeconfig = fakehelper.GetFakeKubeConfigFilePath(testingDir, "../fakes/config/kubeconfig/config1.yaml") - - clusterClientOptions = clusterclient.NewOptions(getFakePoller(), crtClientFactory, getFakeDiscoveryFactory(), nil) - }) - - JustBeforeEach(func() { - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - - regionalClusterClient, err = clusterclient.NewClient(kubeconfig, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - err = tkgClient.DeleteMachineHealthCheckWithClusterClient(regionalClusterClient, options) - }) - - Context("When there are multiple MachineHealthCheck associated with the cluster and none is referenced by name ", func() { - BeforeEach(func() { - mhc1 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc1", Namespace: "namespace-1", ClusterName: "my-cluster"}) - mhc2 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc2", Namespace: "namespace-1", ClusterName: "my-cluster"}) - - mhcList := &capi.MachineHealthCheckList{ - Items: []capi.MachineHealthCheck{*mhc1, *mhc2}, - } - - objects = []runtime.Object{mhcList} - options = MachineHealthCheckOptions{ClusterName: "my-cluster", Namespace: "namespace-1"} - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("multiple MachineHealthCheck found for cluster my-cluster in namespace namespace-1")) - }) - }) - - Context("When there is no MachineHealthCheck associated with the cluster ", func() { - BeforeEach(func() { - mhc1 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc1", Namespace: "namespace-1", ClusterName: "some-cluster"}) - mhc2 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc2", Namespace: "namespace-1", ClusterName: "some-cluster"}) - - mhcList := &capi.MachineHealthCheckList{ - Items: []capi.MachineHealthCheck{*mhc1, *mhc2}, - } - - objects = []runtime.Object{mhcList} - options = MachineHealthCheckOptions{ClusterName: "my-cluster", Namespace: "namespace-1"} - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("MachineHealthCheck not found for cluster my-cluster in namespace namespace-1")) - }) - }) - - Context("When there is one MachineHealthCheck associated with the cluster", func() { - BeforeEach(func() { - mhc1 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc1", Namespace: "namespace-1", ClusterName: "my-cluster"}) - mhc2 := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "mhc2", Namespace: "namespace-1", ClusterName: "my-cluster"}) - - mhcList := &capi.MachineHealthCheckList{ - Items: []capi.MachineHealthCheck{*mhc1, *mhc2}, - } - - objects = []runtime.Object{mhcList} - options = MachineHealthCheckOptions{ClusterName: "my-cluster", MachineHealthCheckName: "mhc1"} - }) - It("should delete the MachineHealthCheck associated with the cluster", func() { - Expect(err).ToNot(HaveOccurred()) - mhcs, err := tkgClient.GetMachineHealthChecksWithClusterClient(regionalClusterClient, MachineHealthCheckOptions{ClusterName: "my-cluster"}) - desiredResult := []MachineHealthCheck{ - { - Name: "mhc2", - Namespace: "namespace-1", - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{}, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - Expect(err).ToNot(HaveOccurred()) - Expect(mhcs).To(ConsistOf(desiredResult)) - }) - }) -}) - -var _ = Describe("CreateMachineHealthCheck", func() { - var ( - err error - regionalClusterClient clusterclient.Client - tkgClient *TkgClient - - crtClientFactory *fakes.CrtClientFactory - - clusterClientOptions clusterclient.Options - fakeClientSet crtclient.Client - kubeconfig string - - options SetMachineHealthCheckOptions - - objects []runtime.Object - ) - - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - - crtClientFactory = &fakes.CrtClientFactory{} - - kubeconfig = fakehelper.GetFakeKubeConfigFilePath(testingDir, "../fakes/config/kubeconfig/config1.yaml") - - clusterClientOptions = clusterclient.NewOptions(getFakePoller(), crtClientFactory, getFakeDiscoveryFactory(), nil) - }) - - JustBeforeEach(func() { - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - - regionalClusterClient, err = clusterclient.NewClient(kubeconfig, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - err = tkgClient.CreateMachineHealthCheck(regionalClusterClient, &options) - }) - - Context("When there is not customized user input", func() { - BeforeEach(func() { - options = SetMachineHealthCheckOptions{ - Namespace: "test-namespace", - ClusterName: "my-cluster", - } - }) - - It("should create a machine health check with default values", func() { - Expect(err).ToNot(HaveOccurred()) - mhcs, err := tkgClient.GetMachineHealthChecksWithClusterClient(regionalClusterClient, MachineHealthCheckOptions{ClusterName: "my-cluster"}) - - desiredResult := []MachineHealthCheck{ - { - Name: "my-cluster", - Namespace: "test-namespace", - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "node-pool": "my-cluster-worker-pool", - }, - }, - UnhealthyConditions: []capi.UnhealthyCondition{ - { - Type: "Ready", - Status: "False", - Timeout: metav1.Duration{ - Duration: 300000000000, - }, - }, - { - Type: "Ready", - Status: "Unknown", - Timeout: metav1.Duration{ - Duration: 300000000000, - }, - }, - }, - - NodeStartupTimeout: &metav1.Duration{ - Duration: 1200000000000, - }, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - Expect(err).ToNot(HaveOccurred()) - Expect(mhcs).To(ConsistOf(desiredResult)) - }) - }) - - Context("When the user specifies a customized machine health check name", func() { - BeforeEach(func() { - options = SetMachineHealthCheckOptions{ - Namespace: "test-namespace", - ClusterName: "my-cluster", - MachineHealthCheckName: "my-mhc", - } - }) - - It("should create a machine health check with the customized name", func() { - Expect(err).ToNot(HaveOccurred()) - mhcs, err := tkgClient.GetMachineHealthChecksWithClusterClient(regionalClusterClient, MachineHealthCheckOptions{ClusterName: "my-cluster"}) - - desiredResult := []MachineHealthCheck{ - { - - Name: "my-mhc", - Namespace: "test-namespace", - - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "node-pool": "my-cluster-worker-pool", - }, - }, - UnhealthyConditions: []capi.UnhealthyCondition{ - { - Type: "Ready", - Status: "False", - Timeout: metav1.Duration{ - Duration: 300000000000, - }, - }, - { - Type: "Ready", - Status: "Unknown", - Timeout: metav1.Duration{ - Duration: 300000000000, - }, - }, - }, - - NodeStartupTimeout: &metav1.Duration{ - Duration: 1200000000000, - }, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - Expect(err).ToNot(HaveOccurred()) - Expect(mhcs).To(ConsistOf(desiredResult)) - }) - }) - Context("When the user-input unhealthy condition type is not known", func() { - BeforeEach(func() { - options = SetMachineHealthCheckOptions{ - Namespace: "test-namespace", - ClusterName: "my-cluster", - MachineHealthCheckName: "my-mhc", - UnhealthyConditions: []string{"Ready:False:10m", "SomeCondition:True:5m"}, - } - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("NodeConditionType SomeCondition is not supported")) - }) - }) - - Context("When the user specifies the unhealthy conditions", func() { - BeforeEach(func() { - options = SetMachineHealthCheckOptions{ - ClusterName: "my-cluster", - MachineHealthCheckName: "my-mhc", - UnhealthyConditions: []string{"Ready:False:10m", "DiskPressure:True:5m"}, - Namespace: "test-namespace", - } - }) - - It("should create a machine health check with the customized unhealthy conditions", func() { - Expect(err).ToNot(HaveOccurred()) - mhcs, err := tkgClient.GetMachineHealthChecksWithClusterClient(regionalClusterClient, MachineHealthCheckOptions{ClusterName: "my-cluster"}) - desiredResult := []MachineHealthCheck{ - { - Name: "my-mhc", - Namespace: "test-namespace", - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "node-pool": "my-cluster-worker-pool", - }, - }, - UnhealthyConditions: []capi.UnhealthyCondition{ - { - Type: "Ready", - Status: "False", - Timeout: metav1.Duration{ - Duration: 600000000000, - }, - }, - { - Type: "DiskPressure", - Status: "True", - Timeout: metav1.Duration{ - Duration: 300000000000, - }, - }, - }, - - NodeStartupTimeout: &metav1.Duration{ - Duration: 1200000000000, - }, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - Expect(err).ToNot(HaveOccurred()) - Expect(mhcs).To(ConsistOf(desiredResult)) - }) - }) - - Context("When the user specify the node start-up timeout", func() { - BeforeEach(func() { - options = SetMachineHealthCheckOptions{ - ClusterName: "my-cluster", - MachineHealthCheckName: "my-mhc", - UnhealthyConditions: []string{"Ready:False:10m", "DiskPressure:True:5m"}, - NodeStartupTimeout: "30m", - Namespace: "test-namespace", - } - }) - - It("should create a machine health check with the customized node start-up timeout", func() { - Expect(err).ToNot(HaveOccurred()) - mhcs, err := tkgClient.GetMachineHealthChecksWithClusterClient(regionalClusterClient, MachineHealthCheckOptions{ClusterName: "my-cluster"}) - - desiredResult := []MachineHealthCheck{ - { - - Name: "my-mhc", - Namespace: "test-namespace", - - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "node-pool": "my-cluster-worker-pool", - }, - }, - UnhealthyConditions: []capi.UnhealthyCondition{ - { - Type: "Ready", - Status: "False", - Timeout: metav1.Duration{ - Duration: 600000000000, - }, - }, - { - Type: "DiskPressure", - Status: "True", - Timeout: metav1.Duration{ - Duration: 300000000000, - }, - }, - }, - - NodeStartupTimeout: &metav1.Duration{ - Duration: 1800000000000, - }, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - Expect(err).ToNot(HaveOccurred()) - Expect(mhcs).To(ConsistOf(desiredResult)) - }) - }) - - Context("When the user specify the match labels", func() { - BeforeEach(func() { - options = SetMachineHealthCheckOptions{ - ClusterName: "my-cluster", - Namespace: "test-namespace", - MachineHealthCheckName: "my-mhc", - UnhealthyConditions: []string{"Ready:False:10m", "DiskPressure:True:5m"}, - NodeStartupTimeout: "30m", - MatchLables: []string{"node-pool: my-node-pool"}, - } - }) - - It("should create a machine health check with the customized match labels", func() { - Expect(err).ToNot(HaveOccurred()) - mhcs, err := tkgClient.GetMachineHealthChecksWithClusterClient(regionalClusterClient, MachineHealthCheckOptions{ClusterName: "my-cluster"}) - - desiredResult := []MachineHealthCheck{ - { - Name: "my-mhc", - Namespace: "test-namespace", - - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "node-pool": "my-node-pool", - }, - }, - UnhealthyConditions: []capi.UnhealthyCondition{ - { - Type: "Ready", - Status: "False", - Timeout: metav1.Duration{ - Duration: 600000000000, - }, - }, - { - Type: "DiskPressure", - Status: "True", - Timeout: metav1.Duration{ - Duration: 300000000000, - }, - }, - }, - - NodeStartupTimeout: &metav1.Duration{ - Duration: 1800000000000, - }, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - Expect(err).ToNot(HaveOccurred()) - Expect(mhcs).To(ConsistOf(desiredResult)) - }) - }) -}) - -var _ = Describe("UpdateMachineHealthCheck", func() { - var ( - err error - regionalClusterClient clusterclient.Client - tkgClient *TkgClient - - crtClientFactory *fakes.CrtClientFactory - - clusterClientOptions clusterclient.Options - fakeClientSet crtclient.Client - kubeconfig string - - options SetMachineHealthCheckOptions - - objects []runtime.Object - oldMHC capi.MachineHealthCheck - ) - - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - - crtClientFactory = &fakes.CrtClientFactory{} - - kubeconfig = fakehelper.GetFakeKubeConfigFilePath(testingDir, "../fakes/config/kubeconfig/config1.yaml") - - clusterClientOptions = clusterclient.NewOptions(getFakePoller(), crtClientFactory, getFakeDiscoveryFactory(), nil) - }) - - JustBeforeEach(func() { - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(objects...).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - - regionalClusterClient, err = clusterclient.NewClient(kubeconfig, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - err = tkgClient.UpdateMachineHealthCheck(&oldMHC, regionalClusterClient, &options) - }) - - Context("When updating the node start-up timeout", func() { - BeforeEach(func() { - options = SetMachineHealthCheckOptions{ - ClusterName: "my-cluster", - NodeStartupTimeout: "30m", - } - cluster := fakehelper.NewCluster(fakehelper.TestAllClusterComponentOptions{ClusterName: options.ClusterName, Namespace: "test-namespace"}) - clusterList := &capi.ClusterList{ - Items: []capi.Cluster{*cluster}, - } - mhc := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "my-cluster", Namespace: "test-namespace", ClusterName: "my-cluster"}) - oldMHC = *mhc - mhcList := &capi.MachineHealthCheckList{ - Items: []capi.MachineHealthCheck{*mhc}, - } - - objects = []runtime.Object{clusterList, mhcList} - }) - - It("should update the node start-up timeout", func() { - Expect(err).ToNot(HaveOccurred()) - mhcs, err := tkgClient.GetMachineHealthChecksWithClusterClient(regionalClusterClient, MachineHealthCheckOptions{ClusterName: "my-cluster"}) - desiredResult := []MachineHealthCheck{ - { - Name: "my-cluster", - Namespace: "test-namespace", - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{}, - NodeStartupTimeout: &metav1.Duration{ - Duration: 1800000000000, - }, - }, - - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - Expect(err).ToNot(HaveOccurred()) - Expect(mhcs).To(ConsistOf(desiredResult)) - }) - }) - - Context("When updating the unhealthy condition", func() { - BeforeEach(func() { - options = SetMachineHealthCheckOptions{ - ClusterName: "my-cluster", - UnhealthyConditions: []string{"Ready:False:10m"}, - NodeStartupTimeout: "30m", - } - cluster := fakehelper.NewCluster(fakehelper.TestAllClusterComponentOptions{ClusterName: options.ClusterName, Namespace: "test-namespace"}) - clusterList := &capi.ClusterList{ - Items: []capi.Cluster{*cluster}, - } - mhc := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "my-cluster", Namespace: "test-namespace", ClusterName: "my-cluster"}) - oldMHC = *mhc - mhcList := &capi.MachineHealthCheckList{ - Items: []capi.MachineHealthCheck{*mhc}, - } - - objects = []runtime.Object{clusterList, mhcList} - }) - - It("should update the unhealthy conditions", func() { - Expect(err).ToNot(HaveOccurred()) - mhcs, err := tkgClient.GetMachineHealthChecksWithClusterClient(regionalClusterClient, MachineHealthCheckOptions{ClusterName: "my-cluster"}) - - desiredResult := []MachineHealthCheck{ - { - Name: "my-cluster", - Namespace: "test-namespace", - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{}, - NodeStartupTimeout: &metav1.Duration{ - Duration: 1800000000000, - }, - UnhealthyConditions: []capi.UnhealthyCondition{ - { - Type: "Ready", - Status: "False", - Timeout: metav1.Duration{ - Duration: 600000000000, - }, - }, - }, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - Expect(err).ToNot(HaveOccurred()) - Expect(mhcs).To(ConsistOf(desiredResult)) - }) - }) - - Context("When updating the match labels", func() { - BeforeEach(func() { - options = SetMachineHealthCheckOptions{ - ClusterName: "my-cluster", - UnhealthyConditions: []string{"Ready:False:10m"}, - NodeStartupTimeout: "30m", - MatchLables: []string{"node-pool:customized-worker-pool"}, - } - cluster := fakehelper.NewCluster(fakehelper.TestAllClusterComponentOptions{ClusterName: options.ClusterName, Namespace: "test-namespace"}) - clusterList := &capi.ClusterList{ - Items: []capi.Cluster{*cluster}, - } - mhc := fakehelper.NewMachineHealthCheck(fakehelper.TestMachineHealthCheckOption{Name: "my-cluster", Namespace: "test-namespace", ClusterName: "my-cluster"}) - oldMHC = *mhc - mhcList := &capi.MachineHealthCheckList{ - Items: []capi.MachineHealthCheck{*mhc}, - } - - objects = []runtime.Object{clusterList, mhcList} - }) - - It("should update the match labels timeout", func() { - Expect(err).ToNot(HaveOccurred()) - mhcs, err := tkgClient.GetMachineHealthChecksWithClusterClient(regionalClusterClient, MachineHealthCheckOptions{ClusterName: "my-cluster"}) - - desiredResult := []MachineHealthCheck{ - { - Name: "my-cluster", - Namespace: "test-namespace", - Spec: capi.MachineHealthCheckSpec{ - ClusterName: "my-cluster", - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "node-pool": "customized-worker-pool", - }, - }, - NodeStartupTimeout: &metav1.Duration{ - Duration: 1800000000000, - }, - UnhealthyConditions: []capi.UnhealthyCondition{ - { - Type: "Ready", - Status: "False", - Timeout: metav1.Duration{ - Duration: 600000000000, - }, - }, - }, - }, - Status: capi.MachineHealthCheckStatus{ExpectedMachines: 0, CurrentHealthy: 0}, - }, - } - Expect(err).ToNot(HaveOccurred()) - Expect(mhcs).To(ConsistOf(desiredResult)) - }) - }) -}) diff --git a/tkg/client/pacific_cluster.go b/tkg/client/pacific_cluster.go deleted file mode 100644 index ea5a599c7e..0000000000 --- a/tkg/client/pacific_cluster.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "time" - - "github.com/pkg/errors" - - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -// GetPacificClusterObject return Pacific cluster object -func (c *TkgClient) GetPacificClusterObject(clusterName, namespace string) (*tkgsv1alpha2.TanzuKubernetesCluster, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return nil, errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get cluster client") - } - - isPacific, err := regionalClusterClient.IsPacificRegionalCluster() - if err != nil { - return nil, errors.Wrap(err, "error determining 'Tanzu Kubernetes Cluster service for vSphere' management cluster") - } - if !isPacific { - return nil, errors.New("the management cluster is not 'Tanzu Kubernetes Cluster service for vSphere' management cluster") - } - - return regionalClusterClient.GetPacificClusterObject(clusterName, namespace) -} - -// IsPacificRegionalCluster checks if the cluster pointed to by kubeconfig is Pacific management cluster(supervisor) -func (c *TkgClient) IsPacificRegionalCluster() (bool, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return false, errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return false, errors.Wrap(err, "unable to get cluster client") - } - - return regionalClusterClient.IsPacificRegionalCluster() -} diff --git a/tkg/client/package_helper.go b/tkg/client/package_helper.go deleted file mode 100644 index 4209831a72..0000000000 --- a/tkg/client/package_helper.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "context" - "fmt" - "strings" - "time" - - "github.com/pkg/errors" - "golang.org/x/sync/errgroup" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// GetClusterBootstrap returns ClusterBootstrap object for the given clusterName in the management cluster -func GetClusterBootstrap(managementClusterClient clusterclient.Client, clusterName, namespace string) (*runtanzuv1alpha3.ClusterBootstrap, error) { - log.V(3).Infof("getting ClusterBootstrap object for cluster: %v", clusterName) - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - err := managementClusterClient.GetResource(clusterBootstrap, clusterName, namespace, nil, &clusterclient.PollOptions{Interval: clusterclient.CheckResourceInterval, Timeout: clusterclient.PackageInstallTimeout}) - return clusterBootstrap, err -} - -// GetCorePackagesFromClusterBootstrap returns addon's core packages details from the given ClusterBootstrap object -func GetCorePackagesFromClusterBootstrap(regionalClusterClient clusterclient.Client, workloadClusterClient clusterclient.Client, clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, corePackagesNamespace, clusterName string) ([]kapppkgv1alpha1.Package, error) { //nolint:gocritic - var packages []kapppkgv1alpha1.Package - // kapp package is installed in management cluster, in namespace in which workload cluster created - if isPackageExists(clusterBootstrap.Spec.Kapp) { - pkg, err := getPackage(regionalClusterClient, clusterBootstrap.Spec.Kapp.RefName, clusterBootstrap.Namespace, clusterName) - if err != nil { - return packages, err - } - packages = append(packages, *pkg) - } - - // Core packages CNI, CSI and CPI (other than Kapp) installed in workload cluster - if isPackageExists(clusterBootstrap.Spec.CNI) { - pkg, err := getPackage(workloadClusterClient, clusterBootstrap.Spec.CNI.RefName, corePackagesNamespace, clusterName) - if err != nil { - return packages, err - } - packages = append(packages, *pkg) - } - if isPackageExists(clusterBootstrap.Spec.CSI) { - pkg, err := getPackage(workloadClusterClient, clusterBootstrap.Spec.CSI.RefName, corePackagesNamespace, clusterName) - if err != nil { - return packages, err - } - packages = append(packages, *pkg) - } - if isPackageExists(clusterBootstrap.Spec.CPI) { - pkg, err := getPackage(workloadClusterClient, clusterBootstrap.Spec.CPI.RefName, corePackagesNamespace, clusterName) - if err != nil { - return packages, err - } - packages = append(packages, *pkg) - } - return packages, nil -} - -func isPackageExists(cbPackage *runtanzuv1alpha3.ClusterBootstrapPackage) bool { - return cbPackage != nil && cbPackage.ValuesFrom != nil && cbPackage.ValuesFrom.ProviderRef != nil -} - -// getPackage takes clusterclient, package name, namespace and cluster name, queries for package details and give package object (which has package name and namespace details) -func getPackage(clusterClient clusterclient.Client, packageRefName, packagesNamespace, clusterName string) (*kapppkgv1alpha1.Package, error) { - pkg := &kapppkgv1alpha1.Package{} - pkgFromCluster, err := clusterClient.GetPackage(packageRefName, packagesNamespace) - if err != nil { - return pkg, err - } - pkgName := GeneratePackageInstallName(clusterName, pkgFromCluster.Spec.RefName) - pkg = &kapppkgv1alpha1.Package{ObjectMeta: metav1.ObjectMeta{Name: pkgName, Namespace: packagesNamespace}} - return pkg, nil -} - -// GeneratePackageInstallName is the util function to generate the PackageInstall CR name in a consistent manner. -// clusterName is the name of cluster within which all resources associated with this PackageInstall CR is installed. -// It does not necessarily -// mean the PackageInstall CR will be installed in that cluster. I.e., the kapp-controller PackageInstall CR is installed -// in the management cluster but is named after "-kapp-controller". It indicates that this kapp-controller -// PackageInstall is for reconciling resources in a cluster named "". -// addonName is the short name of a Tanzu addon with which the PackageInstall CR is associated. -func GeneratePackageInstallName(clusterName, addonName string) string { - return fmt.Sprintf("%s-%s", clusterName, strings.Split(addonName, ".")[0]) -} - -// MonitorAddonsCorePackageInstallation monitors addon's core packages (kapp, cni, csi and cpi) and returns error if any while monitoring packages or any packages are not installed successfully. First it monitors kapp package in management cluster then it monitors other core packages in workload cluster. -func MonitorAddonsCorePackageInstallation(regionalClusterClient clusterclient.Client, workloadClusterClient clusterclient.Client, packages []kapppkgv1alpha1.Package, packageInstallTimeout time.Duration) error { //nolint:gocritic - if len(packages) == 0 { - return nil - } - var corePackagesOnWorkloadCluster, corePackagesOnManagementCluster []kapppkgv1alpha1.Package - for _, currentPackage := range packages { //nolint:gocritic - if strings.Contains(currentPackage.ObjectMeta.Name, "kapp-controller") { - corePackagesOnManagementCluster = append(corePackagesOnManagementCluster, currentPackage) - } else { - corePackagesOnWorkloadCluster = append(corePackagesOnWorkloadCluster, currentPackage) - } - } - err := WaitForPackagesInstallation(regionalClusterClient, corePackagesOnManagementCluster, packageInstallTimeout) - if err != nil { - return err - } - return WaitForPackagesInstallation(workloadClusterClient, corePackagesOnWorkloadCluster, packageInstallTimeout) -} - -func WaitForPackagesInstallation(clusterClient clusterclient.Client, packages []kapppkgv1alpha1.Package, packageInstallTimeout time.Duration) error { - // Start waiting for all packages in parallel using group.Wait - // Note: As PackageInstall resources are created in the cluster itself - // we are using currentClusterClient which will point to correct cluster - group, _ := errgroup.WithContext(context.Background()) - - for _, currentPackage := range packages { //nolint:gocritic - pn := currentPackage.ObjectMeta.Name - ns := currentPackage.ObjectMeta.Namespace - log.V(3).Warningf("waiting for package: '%s'", pn) - group.Go( - func() error { - err := clusterClient.WaitForPackageInstall(pn, ns, packageInstallTimeout) - if err != nil { - log.V(3).Warningf("failure while waiting for package: '%s' in namespace: '%s'", pn, ns) - } else { - log.V(3).Infof("successfully reconciled package: '%s' in namespace: '%s'", pn, ns) - } - return err - }) - } - - err := group.Wait() - if err != nil { - return errors.Wrap(err, "failure while waiting for packages to be installed") - } - return nil -} diff --git a/tkg/client/package_helper_test.go b/tkg/client/package_helper_test.go deleted file mode 100644 index 425cb714a3..0000000000 --- a/tkg/client/package_helper_test.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "fmt" - "os" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "sigs.k8s.io/yaml" - - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -const ( - bootstrapObject = "../fakes/config/clusterbootstrap.yaml" - packageNotFound = "package not found" -) - -var ( - fakeMgtClusterClient *fakes.ClusterClient - fakeWcClusterClient *fakes.ClusterClient - timeout time.Duration - clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap - pkgKapp *kapppkgv1alpha1.Package - pkgCni *kapppkgv1alpha1.Package - pkgCsi *kapppkgv1alpha1.Package - pkgCpi *kapppkgv1alpha1.Package -) - -const pkgKappObjStr = `apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -spec: - refname: kapp-controller.tanzu.vmware.com - version: 0.38.4+vmware.1-tkg.2-zshippable` -const pkgCniObjStr = `apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: -spec: - refname: antrea.tanzu.vmware.com - version: 0.38.4+vmware.1-tkg.2-zshippable` -const pkgCsiObjStr = `apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -spec: - refname: vsphere-pv-csi.tanzu.vmware.com - version: 0.38.4+vmware.1-tkg.2-zshippable` - -const pkgCpiObjStr = `apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -spec: - refname: vsphere-cpi.tanzu.vmware.com - version: 0.38.4+vmware.1-tkg.2-zshippable` - -func init() { - timeout = time.Duration(1) - bs, _ := os.ReadFile(bootstrapObject) - clusterBootstrap = &runtanzuv1alpha3.ClusterBootstrap{} - // Expect(yaml.Unmarshal(bs, clusterBootstrap)).To(Succeed(), "Failed to convert the cluster bootstrap input file to yaml") - yaml.Unmarshal(bs, clusterBootstrap) //nolint:errcheck - pkgKapp = &kapppkgv1alpha1.Package{} - yaml.Unmarshal([]byte(pkgKappObjStr), pkgKapp) //nolint:errcheck - - pkgCni = &kapppkgv1alpha1.Package{} - yaml.Unmarshal([]byte(pkgCniObjStr), pkgCni) //nolint:errcheck - - pkgCsi = &kapppkgv1alpha1.Package{} - yaml.Unmarshal([]byte(pkgCsiObjStr), pkgCsi) //nolint:errcheck - - pkgCpi = &kapppkgv1alpha1.Package{} - yaml.Unmarshal([]byte(pkgCpiObjStr), pkgCpi) //nolint:errcheck -} - -var _ = Describe("unit tests for monitor addon's packages installation", func() { - Context("get bootstrap object for workload cluster", func() { - When("bootstrap object exists should not return any error", func() { - BeforeEach(func() { - setFakeClientAndCalls() - fakeMgtClusterClient.GetResourceReturns(nil) - }) - It("should not return error", func() { - _, err := GetClusterBootstrap(fakeMgtClusterClient, "cluster1", "namespace1") - Expect(err).NotTo(HaveOccurred()) - }) - }) - When("bootstrap object not exists should return an error", func() { - resourceNotExists := "resource not exists" - BeforeEach(func() { - setFakeClientAndCalls() - fakeMgtClusterClient.GetResourceReturns(errors.New(resourceNotExists)) - }) - It("should return error", func() { - _, err := GetClusterBootstrap(fakeMgtClusterClient, "cluster1", "namespace1") - Expect(err).To(HaveOccurred()) - }) - }) - }) - Context("get packages from bootstrap object and monitor packages installation", func() { - When("package installation successful should not return error", func() { - BeforeEach(func() { - setFakeClientAndCalls() - }) - It("should not return error", func() { - packages, err := GetCorePackagesFromClusterBootstrap(fakeMgtClusterClient, fakeWcClusterClient, clusterBootstrap, constants.CorePackagesNamespaceInTKGM, clusterBootstrap.Name) - Expect(err).NotTo(HaveOccurred()) - err = MonitorAddonsCorePackageInstallation(fakeMgtClusterClient, fakeWcClusterClient, packages, timeout) - pkg, ns, _ := fakeMgtClusterClient.WaitForPackageInstallArgsForCall(0) - Expect(pkg).To(Equal(packages[0].ObjectMeta.Name)) - Expect(ns).To(Equal(packages[0].ObjectMeta.Namespace)) - pkg, ns, _ = fakeWcClusterClient.WaitForPackageInstallArgsForCall(0) - Expect([]string{packages[1].ObjectMeta.Name, packages[2].ObjectMeta.Name, packages[3].ObjectMeta.Name}).Should(ContainElements(pkg)) - Expect(ns).To(Equal(packages[1].ObjectMeta.Namespace)) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - When("GetPackage returns error then GetCorePackagesFromClusterBootstrap also should return error", func() { - errorStr := fmt.Sprintf(clusterclient.ErrUnableToGetPackage, "kapp-controller.tanzu.vmware.com.0.38.4+vmware.1-tkg.1-zshippable", clusterBootstrap.Namespace) - BeforeEach(func() { - setFakeClientAndCalls() - err := errors.New(errorStr) - fakeMgtClusterClient.GetPackageReturnsOnCall(0, pkgKapp, err) - }) - It("should return error", func() { - _, err := GetCorePackagesFromClusterBootstrap(fakeMgtClusterClient, fakeWcClusterClient, clusterBootstrap, constants.CorePackagesNamespaceInTKGM, clusterBootstrap.Name) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(errorStr)) - }) - }) - - When("package installation not successful because of MC packages error, should return error", func() { - packageNotFound := packageNotFound - BeforeEach(func() { - setFakeClientAndCalls() - fakeMgtClusterClient.WaitForPackageInstallReturns(errors.New(packageNotFound)) - }) - It("should return error", func() { - packages, err := GetCorePackagesFromClusterBootstrap(fakeMgtClusterClient, fakeWcClusterClient, clusterBootstrap, constants.CorePackagesNamespaceInTKGM, clusterBootstrap.Name) - Expect(err).NotTo(HaveOccurred()) - err = MonitorAddonsCorePackageInstallation(fakeMgtClusterClient, fakeWcClusterClient, packages, timeout) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(packageNotFound)) - }) - }) - When("package installation not successful because of WC packages error, should return error", func() { - packageNotFound := packageNotFound - BeforeEach(func() { - setFakeClientAndCalls() - fakeWcClusterClient.WaitForPackageInstallReturns(errors.New(packageNotFound)) - }) - It("should return error", func() { - packages, err := GetCorePackagesFromClusterBootstrap(fakeMgtClusterClient, fakeWcClusterClient, clusterBootstrap, constants.CorePackagesNamespaceInTKGM, clusterBootstrap.Name) - Expect(err).NotTo(HaveOccurred()) - err = MonitorAddonsCorePackageInstallation(fakeMgtClusterClient, fakeWcClusterClient, packages, timeout) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(packageNotFound)) - }) - }) - }) - -}) - -func setFakeClientAndCalls() { - fakeMgtClusterClient = &fakes.ClusterClient{} - fakeWcClusterClient = &fakes.ClusterClient{} - fakeMgtClusterClient.WaitForPackageInstallReturns(nil) - fakeMgtClusterClient.GetPackageReturnsOnCall(0, pkgKapp, nil) - fakeWcClusterClient.WaitForPackageInstallReturns(nil) - fakeWcClusterClient.GetPackageReturnsOnCall(0, pkgCni, nil) - fakeWcClusterClient.GetPackageReturnsOnCall(1, pkgCsi, nil) - fakeWcClusterClient.GetPackageReturnsOnCall(2, pkgCpi, nil) -} diff --git a/tkg/client/region.go b/tkg/client/region.go deleted file mode 100644 index d8fae3002d..0000000000 --- a/tkg/client/region.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "time" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -// VerifyRegion verifies management cluster -func (c *TkgClient) VerifyRegion(kubeConfigPath string) (region.RegionContext, error) { - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - clusterClient, err := clusterclient.NewClient(kubeConfigPath, "", clusterclientOptions) - if err != nil { - return region.RegionContext{}, errors.Wrap(err, "unable to get cluster client while verifying region") - } - - isPacific, err := clusterClient.IsPacificRegionalCluster() - if err == nil && isPacific { - return c.prepareRegionContext(clusterClient) - } - // If not pacific regional cluster, check if it is regular regional cluster - err = clusterClient.IsRegionalCluster() - if err != nil { - return region.RegionContext{}, errors.Wrap(err, "current kube context is not pointing to a valid management cluster") - } - return c.prepareRegionContext(clusterClient) -} - -func (c *TkgClient) prepareRegionContext(clusterClient clusterclient.Client) (region.RegionContext, error) { - validPath := clusterClient.GetCurrentKubeconfigFile() - context, err := clusterClient.GetCurrentKubeContext() - if err != nil { - return region.RegionContext{}, errors.Wrap(err, "cannot get management cluster context") - } - clusterName, err := clusterClient.GetCurrentClusterName("") - if err != nil { - return region.RegionContext{}, errors.Wrap(err, "cannot get management cluster name") - } - return region.RegionContext{ClusterName: clusterName, ContextName: context, SourceFilePath: validPath}, nil -} - -// AddRegionContext adds management cluster context -func (c *TkgClient) AddRegionContext(r region.RegionContext, overwrite, useDirectReference bool) error { - kubeConfigBytes, err := GetCurrentClusterKubeConfigFromFile(r.SourceFilePath) - if err != nil { - return errors.Wrap(err, "unable to get management cluster kubeconfig") - } - // Make a copy of kubeconfig unless user choose to use direct reference to the kubeconfig provided - if !useDirectReference { - path, err := getTKGKubeConfigPath(true) - if err != nil { - return errors.Wrap(err, "unable to get TKG kubeconfig path for management cluster") - } - r.SourceFilePath = path - - _, err = MergeKubeConfigAndSwitchContext(kubeConfigBytes, path) - if err != nil { - return errors.Wrap(err, "unable to merge the management cluster kubeconfig into TKG kubeconfig file") - } - } - - if overwrite { - if err = c.regionManager.UpsertRegionContext(r); err != nil { - return errors.Wrap(err, "cannot save management cluster context to kubeconfig") - } - } else { - err = c.regionManager.SaveRegionContext(r) - if err != nil { - return errors.Wrap(err, "cannot save management cluster context to kubeconfig") - } - } - return nil -} - -// GetRegionContexts returns mangement cluster contexts -func (c *TkgClient) GetRegionContexts(clusterName string) ([]region.RegionContext, error) { - regions, err := c.regionManager.ListRegionContexts() - if err != nil { - return regions, err - } - - if clusterName == "" { - return regions, nil - } - - res := []region.RegionContext{} - for _, r := range regions { - if r.ClusterName == clusterName { - res = append(res, r) - } - } - return res, nil -} - -// SetRegionContext sets management cluster contexts -func (c *TkgClient) SetRegionContext(clusterName, contextName string) error { - return c.regionManager.SetCurrentContext(clusterName, contextName) -} - -// GetCurrentRegionContext gets current management cluster contexts -func (c *TkgClient) GetCurrentRegionContext() (region.RegionContext, error) { - if c.clusterKubeConfig == nil { - return c.getCurrentRegionContext() - } - return c.getCurrentRegionContextFromGetter() -} - -func (c *TkgClient) getCurrentRegionContext() (region.RegionContext, error) { - context, err := c.regionManager.GetCurrentContext() - if err != nil { - return region.RegionContext{}, err - } - - if context.Status == region.Failed { - return region.RegionContext{}, errors.Errorf("deployment failed for management cluster %s", context.ClusterName) - } - - return context, nil -} - -func (c *TkgClient) getCurrentRegionContextFromGetter() (region.RegionContext, error) { - if c.clusterKubeConfig == nil { - return region.RegionContext{}, errors.New("error while getting current management cluster context") - } - clusterName, err := utils.GetClusterNameFromKubeconfigAndContext(c.clusterKubeConfig.File, c.clusterKubeConfig.Context) - if err != nil { - return region.RegionContext{}, errors.Wrap(err, "error while getting clustername from kubeconfig") - } - return region.RegionContext{ - ClusterName: clusterName, - SourceFilePath: c.clusterKubeConfig.File, - ContextName: c.clusterKubeConfig.Context, - }, nil -} diff --git a/tkg/client/scale.go b/tkg/client/scale.go deleted file mode 100644 index 7cee0b8283..0000000000 --- a/tkg/client/scale.go +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "strings" - "time" - - "github.com/pkg/errors" - kerrors "k8s.io/apimachinery/pkg/util/errors" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// ScaleClusterOptions defines options to scale tkg cluster -type ScaleClusterOptions struct { - Kubeconfig string - ClusterName string - Namespace string - NodePoolName string - WorkerCount int32 - ControlPlaneCount int32 -} - -// TKGsystemNamespace and DefaultNamespace are constants for setting the namespaces -const ( - TKGsystemNamespace = "tkg-system" -) - -// ScaleCluster scales cluster vertically -func (c *TkgClient) ScaleCluster(options ScaleClusterOptions) error { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return errors.Wrap(err, "not a valid management cluster") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - clusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return errors.Wrap(err, "unable to get cluster client while scaling cluster") - } - - if currentRegion.ClusterName == options.ClusterName { - options.Namespace = TKGsystemNamespace - } else if options.Namespace == "" { - options.Namespace = constants.DefaultNamespace - } - - return c.DoScaleCluster(clusterClient, &options) -} - -// DoScaleCluster performs the scale operation using the given clusterclient.Client -func (c *TkgClient) DoScaleCluster(clusterClient clusterclient.Client, options *ScaleClusterOptions) error { - ccBased, err := clusterClient.IsClusterClassBased(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrap(err, "unable to determine if cluster is clusterclass based") - } - if ccBased { - var cluster capi.Cluster - if err := clusterClient.GetResource(&cluster, options.ClusterName, options.Namespace, nil, nil); err != nil { - return errors.Wrap(err, "Unable to retrieve cluster resource") - } - return DoScaleCCCluster(clusterClient, &cluster, options) - } - - isPacific, err := clusterClient.IsPacificRegionalCluster() - if err != nil { - return errors.Wrap(err, "error determining Tanzu Kubernetes Grid service for vSphere management cluster ") - } - if isPacific { - return c.ScalePacificCluster(options, clusterClient) - } - - errList := []error{} - - controlPlaneNode, err := clusterClient.GetKCPObjectForCluster(options.ClusterName, options.Namespace) - if err != nil { - errList = append(errList, errors.Wrapf(err, "unable to find control plane node object for cluster %s", options.ClusterName)) - } - - if options.ControlPlaneCount > 0 && len(errList) == 0 { - err := clusterClient.UpdateReplicas(controlPlaneNode, controlPlaneNode.Name, controlPlaneNode.Namespace, options.ControlPlaneCount) - if err != nil { - errList = append(errList, errors.Wrapf(err, "unable to update control plane replica count for cluster %s", options.ClusterName)) - } else { - log.Infof("Successfully updated control plane replica count for cluster %s", options.ClusterName) - } - } - - if options.WorkerCount > 0 { - if options.NodePoolName == "" { - errList = append(errList, c.scaleWorkersDefault(clusterClient, options)...) - } else { - errList = append(errList, c.scaleWorkersNodePool(clusterClient, options)) - } - } - - if len(errList) == 0 { - return nil - } - return kerrors.NewAggregate(errList) -} - -// ScalePacificCluster scale TKGS cluster -func (c *TkgClient) ScalePacificCluster(options *ScaleClusterOptions, clusterClient clusterclient.Client) error { - var err error - errList := []error{} - // If the option specifying the targetNamespace is empty, try to detect it. - if options.Namespace == "" { - if options.Namespace, err = clusterClient.GetCurrentNamespace(); err != nil { - return errors.Wrap(err, "failed to get current namespace") - } - } - if options.ControlPlaneCount > 0 { - err := clusterClient.ScalePacificClusterControlPlane(options.ClusterName, options.Namespace, options.ControlPlaneCount) - if err != nil { - errList = append(errList, errors.Wrapf(err, "unable to scale control plane for workload cluster %s", options.ClusterName)) - } else { - log.Infof("Successfully scaled control plane for cluster %s", options.ClusterName) - } - } - if options.WorkerCount > 0 { - if options.NodePoolName == "" { - return errors.Errorf("unable to scale workers nodes for cluster %q in namespace %q , please specify the node pool name", options.ClusterName, options.Namespace) - } - err := c.scalePacificClusterNodePool(clusterClient, options) - if err != nil { - errList = append(errList, errors.Wrapf(err, "unable to scale workers nodes for workload cluster %s", options.ClusterName)) - } else { - log.Infof("Successfully scaled workers for cluster %s", options.ClusterName) - } - } - if len(errList) == 0 { - return nil - } - return kerrors.NewAggregate(errList) -} - -func DoScaleCCCluster(clusterClient clusterclient.Client, cluster *capi.Cluster, options *ScaleClusterOptions) error { - if options.ControlPlaneCount > 0 { - cluster.Spec.Topology.ControlPlane.Replicas = &options.ControlPlaneCount - } - - mdFound := false - if options.NodePoolName != "" && options.WorkerCount > 0 { - for i := range cluster.Spec.Topology.Workers.MachineDeployments { - if cluster.Spec.Topology.Workers.MachineDeployments[i].Name == options.NodePoolName { - cluster.Spec.Topology.Workers.MachineDeployments[i].Replicas = &options.WorkerCount - mdFound = true - break - } - } - - if !mdFound { - return errors.Errorf("Could not find node pool with name %s", options.NodePoolName) - } - } - - if options.NodePoolName == "" && options.WorkerCount > 0 { - numMachineDeployments := int32(len(cluster.Spec.Topology.Workers.MachineDeployments)) - if options.WorkerCount < numMachineDeployments { - return errors.Errorf("new worker count must be greater than or equal to the number of machine deployments. worker count: %d, machine deployment count: %d", options.WorkerCount, numMachineDeployments) - } - - workersPerMD := options.WorkerCount / numMachineDeployments - leftoverWorkers := options.WorkerCount % numMachineDeployments - // each machine deployment gets scaled to have an approx equal number of replicas - for i := int32(0); i < numMachineDeployments; i++ { - workerCount := desiredWorkerCount(workersPerMD, leftoverWorkers, i) - cluster.Spec.Topology.Workers.MachineDeployments[i].Replicas = &workerCount - } - } - - return clusterClient.UpdateResource(cluster, options.ClusterName, options.Namespace) -} - -func (c *TkgClient) scaleWorkersDefault(clusterClient clusterclient.Client, options *ScaleClusterOptions) []error { - // scale nodes across all machine deployments in the cluster - workerNodeMachineDeployments, err := clusterClient.GetMDObjectForCluster(options.ClusterName, options.Namespace) - if err != nil { - return []error{errors.Wrapf(err, "error retrieving worker node machine deployment objects for cluster %s", options.ClusterName)} - } - if len(workerNodeMachineDeployments) == 0 { - return []error{errors.Errorf("no machine deployments found in cluster %s", options.ClusterName)} - } - - numMachineDeployments := int32(len(workerNodeMachineDeployments)) - if options.WorkerCount < numMachineDeployments { - return []error{errors.Errorf("new worker count must be greater than or equal to the number of machine deployments. worker count: %d, machine deployment count: %d", options.WorkerCount, numMachineDeployments)} - } - workersPerMD := options.WorkerCount / numMachineDeployments - leftoverWorkers := options.WorkerCount % numMachineDeployments - var errList []error - // each machine deployment gets scaled to have an approx equal number of replicas - for i := int32(0); i < numMachineDeployments; i++ { - workerCount := desiredWorkerCount(workersPerMD, leftoverWorkers, i) - err := clusterClient.UpdateReplicas(&workerNodeMachineDeployments[i], workerNodeMachineDeployments[i].Name, workerNodeMachineDeployments[i].Namespace, workerCount) - if err != nil { - errList = append(errList, errors.Wrapf(err, "unable to update worker node replica count for machine deployment %s on cluster %s", workerNodeMachineDeployments[i].Name, options.ClusterName)) - } - } - - if len(errList) == 0 { - log.Infof("Successfully updated worker node machine deployment replica count for cluster %s", options.ClusterName) - } - return errList -} - -func (c *TkgClient) scaleWorkersNodePool(clusterClient clusterclient.Client, options *ScaleClusterOptions) error { - mdExists, err := c.mdExists(clusterClient, options) - if err != nil { - return err - } - if !mdExists { - return errors.Errorf("Could not find node pool with name %s", options.NodePoolName) - } - - mdOptions := prepareSetMachineDeploymentOptions(options) - if err := DoSetMachineDeployment(clusterClient, &mdOptions); err != nil { - return errors.Wrapf(err, "Unable to scale node pool %s", options.NodePoolName) - } - - return nil -} - -func desiredWorkerCount(workersPerMD, leftoverWorkers, i int32) int32 { - if i < leftoverWorkers { - return workersPerMD + 1 - } - return workersPerMD -} - -func (c *TkgClient) mdExists(clusterClient clusterclient.Client, options *ScaleClusterOptions) (bool, error) { - getOptions := GetMachineDeploymentOptions{ - ClusterName: options.ClusterName, - Namespace: options.Namespace, - Name: options.NodePoolName, - } - mds, err := DoGetMachineDeployments(clusterClient, &getOptions) - if err != nil { - return false, errors.Wrapf(err, "Failed to get node pools for cluster %s", options.ClusterName) - } - - npName := strings.Replace(options.NodePoolName, options.ClusterName+"-", "", -1) - - for i := range mds { - if mds[i].Name == npName { - return true, nil - } - } - - return false, nil -} - -func (c *TkgClient) scalePacificClusterNodePool(clusterClient clusterclient.Client, options *ScaleClusterOptions) error { - nodePoolExists, err := c.tkcNodePoolExists(clusterClient, options) - if err != nil { - return err - } - if !nodePoolExists { - return errors.Errorf("could not find node pool with name %s", options.NodePoolName) - } - - mdOptions := prepareSetMachineDeploymentOptions(options) - if err = c.SetNodePoolsForPacificCluster(clusterClient, &mdOptions); err != nil { - return errors.Wrapf(err, "unable to scale node pool %s", options.NodePoolName) - } - - return nil -} - -func (c *TkgClient) tkcNodePoolExists(clusterClient clusterclient.Client, options *ScaleClusterOptions) (bool, error) { - tkc, err := clusterClient.GetPacificClusterObject(options.ClusterName, options.Namespace) - if err != nil { - return false, errors.Wrapf(err, "unable to get TKC object %q in namespace %q", options.ClusterName, options.Namespace) - } - - nodePools := tkc.Spec.Topology.NodePools - for idx := range nodePools { - if nodePools[idx].Name == options.NodePoolName { - return true, nil - } - } - return false, nil -} - -func prepareSetMachineDeploymentOptions(options *ScaleClusterOptions) SetMachineDeploymentOptions { - return SetMachineDeploymentOptions{ - Namespace: options.Namespace, - ClusterName: options.ClusterName, - NodePool: NodePool{ - Name: options.NodePoolName, - Replicas: &options.WorkerCount, - }, - } -} diff --git a/tkg/client/scale_test.go b/tkg/client/scale_test.go deleted file mode 100644 index b9f4dc833a..0000000000 --- a/tkg/client/scale_test.go +++ /dev/null @@ -1,473 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "fmt" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - v1 "k8s.io/api/core/v1" - "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" -) - -var _ = Describe("Unit tests for scalePacificCluster", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - tkgClient *TkgClient - scaleClusterOptions ScaleClusterOptions - kubeconfig string - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - kubeconfig = fakehelper.GetFakeKubeConfigFilePath(testingDir, "../fakes/config/kubeconfig/config1.yaml") - }) - - JustBeforeEach(func() { - err = tkgClient.ScalePacificCluster(&scaleClusterOptions, regionalClusterClient) - }) - - Context("When namespace is empty", func() { - BeforeEach(func() { - regionalClusterClient.GetCurrentNamespaceReturns("", errors.New("fake-error")) - scaleClusterOptions = ScaleClusterOptions{ - ClusterName: "my-cluster", - Namespace: "", - WorkerCount: 5, - ControlPlaneCount: 10, - Kubeconfig: kubeconfig, - } - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to get current namespace")) - }) - }) - - Context("When control plane for workload cluster cannot be scaled", func() { - BeforeEach(func() { - scaleClusterOptions = ScaleClusterOptions{ - ClusterName: "my-cluster", - Namespace: "namespace-1", - WorkerCount: 0, - ControlPlaneCount: 10, - Kubeconfig: kubeconfig, - } - regionalClusterClient.ScalePacificClusterControlPlaneReturns(errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to scale control plane for workload cluster")) - }) - }) - - Context("When workers count for workload cluster is provided but nodepool name is not provided", func() { - BeforeEach(func() { - scaleClusterOptions = ScaleClusterOptions{ - ClusterName: "my-cluster", - Namespace: "namespace-1", - WorkerCount: 5, - ControlPlaneCount: 10, - Kubeconfig: kubeconfig, - NodePoolName: "", - } - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - errString := fmt.Sprintf(`unable to scale workers nodes for cluster "%s" in namespace "%s" , please specify the node pool name`, - scaleClusterOptions.ClusterName, scaleClusterOptions.Namespace) - Expect(err.Error()).To(ContainSubstring(errString)) - }) - }) - Context("When nodepool to be scaled doesn't exists in TKC", func() { - BeforeEach(func() { - scaleClusterOptions = ScaleClusterOptions{ - ClusterName: "my-cluster", - Namespace: "namespace-1", - WorkerCount: 5, - ControlPlaneCount: 10, - Kubeconfig: kubeconfig, - NodePoolName: "non-existing-nodepool", - } - tkc := GetDummyPacificCluster() - regionalClusterClient.GetPacificClusterObjectReturns(&tkc, nil) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("could not find node pool with name %s", scaleClusterOptions.NodePoolName))) - }) - }) - Context("When nodepool update operation failed", func() { - BeforeEach(func() { - scaleClusterOptions = ScaleClusterOptions{ - ClusterName: "my-cluster", - Namespace: "namespace-1", - WorkerCount: 5, - ControlPlaneCount: 10, - Kubeconfig: kubeconfig, - NodePoolName: "nodepool-1", - } - tkc := GetDummyPacificCluster() - regionalClusterClient.GetPacificClusterObjectReturns(&tkc, nil) - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - return errors.New("fake-tkc-update-error") - }) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("unable to scale node pool %s", scaleClusterOptions.NodePoolName))) - Expect(err.Error()).To(ContainSubstring("fake-tkc-update-error")) - }) - }) - Context("When scaleClusterOptions is all set and scaling controlplane and nodepools is success", func() { - var gotTkc *tkgsv1alpha2.TanzuKubernetesCluster - BeforeEach(func() { - scaleClusterOptions = ScaleClusterOptions{ - ClusterName: "my-cluster", - Namespace: "namespace-1", - WorkerCount: 5, - ControlPlaneCount: 10, - Kubeconfig: kubeconfig, - NodePoolName: "nodepool-1", - } - tkc := GetDummyPacificCluster() - regionalClusterClient.GetPacificClusterObjectReturns(&tkc, nil) - regionalClusterClient.ScalePacificClusterControlPlaneReturns(nil) - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - gotTkc = obj.(*tkgsv1alpha2.TanzuKubernetesCluster) - return nil - }) - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotTkc.Spec.Topology.NodePools[0].Name).To(Equal("nodepool-1")) - Expect(*gotTkc.Spec.Topology.NodePools[0].Replicas).To(Equal(int32(5))) - }) - }) -}) - -var _ = Describe("Scale API", func() { - Context("DoScaleCluster", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - tkgClient *TkgClient - scaleClusterOptions ScaleClusterOptions - - md1, md2, md3 v1beta1.MachineDeployment - ) - - const ( - defaultNamespaceName = "default" - md1Name = "test-cluster-md-0" - md2Name = "test-cluster-md-1" - md3Name = "test-cluster-md-2" - ) - - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - regionalClusterClient = &fakes.ClusterClient{} - regionalClusterClient.IsPacificRegionalClusterReturns(false, nil) - regionalClusterClient.GetKCPObjectForClusterReturns(nil, nil) - - scaleClusterOptions = ScaleClusterOptions{} - scaleClusterOptions.ControlPlaneCount = 0 - scaleClusterOptions.ClusterName = "test-cluster" - - md1 = v1beta1.MachineDeployment{} - md1.Name = md1Name - md1.Namespace = defaultNamespaceName - md1.Spec = v1beta1.MachineDeploymentSpec{ - Template: v1beta1.MachineTemplateSpec{ - Spec: v1beta1.MachineSpec{ - Bootstrap: v1beta1.Bootstrap{ - ConfigRef: &v1.ObjectReference{ - Name: md1Name + "-kct", - Namespace: defaultNamespaceName, - }, - }, - InfrastructureRef: v1.ObjectReference{ - Name: md1Name + "-mt", - Namespace: defaultNamespaceName, - }, - }, - }, - } - md2 = v1beta1.MachineDeployment{} - md2.Name = md2Name - md2.Namespace = defaultNamespaceName - md2.Spec = v1beta1.MachineDeploymentSpec{ - Template: v1beta1.MachineTemplateSpec{ - Spec: v1beta1.MachineSpec{ - Bootstrap: v1beta1.Bootstrap{ - ConfigRef: &v1.ObjectReference{ - Name: md2Name + "-kct", - Namespace: defaultNamespaceName, - }, - }, - InfrastructureRef: v1.ObjectReference{ - Name: md2Name + "-mt", - Namespace: defaultNamespaceName, - }, - }, - }, - } - md3 = v1beta1.MachineDeployment{} - md3.Name = md3Name - md3.Namespace = defaultNamespaceName - md3.Spec = v1beta1.MachineDeploymentSpec{ - Template: v1beta1.MachineTemplateSpec{ - Spec: v1beta1.MachineSpec{ - Bootstrap: v1beta1.Bootstrap{ - ConfigRef: &v1.ObjectReference{ - Name: md3Name + "-kct", - Namespace: defaultNamespaceName, - }, - }, - InfrastructureRef: v1.ObjectReference{ - Name: md3Name + "-mt", - Namespace: defaultNamespaceName, - }, - }, - }, - } - }) - - Context("management cluster is not a Pacific cluster", func() { - Context("and scale is not operating on a specific node pool", func() { - When("a user scales worker nodes greater than num of machine deployments", func() { - It("should update mds with the correct number of workers", func() { - regionalClusterClient.GetMDObjectForClusterReturns([]v1beta1.MachineDeployment{md1, md2, md3}, nil) - - scaleClusterOptions.WorkerCount = 4 - - err = tkgClient.DoScaleCluster(regionalClusterClient, &scaleClusterOptions) - Expect(err).ToNot(HaveOccurred()) - - Expect(regionalClusterClient.UpdateReplicasCallCount()).To(Equal(3)) - _, name, namespace, count := regionalClusterClient.UpdateReplicasArgsForCall(0) - Expect(name).To(Equal(md1.Name)) - Expect(namespace).To(Equal(md1.Namespace)) - Expect(count).To(BeEquivalentTo(2)) - - _, name, namespace, count = regionalClusterClient.UpdateReplicasArgsForCall(1) - Expect(name).To(Equal(md2.Name)) - Expect(namespace).To(Equal(md2.Namespace)) - Expect(count).To(BeEquivalentTo(1)) - - _, name, namespace, count = regionalClusterClient.UpdateReplicasArgsForCall(2) - Expect(name).To(Equal(md3.Name)) - Expect(namespace).To(Equal(md3.Namespace)) - Expect(count).To(BeEquivalentTo(1)) - }) - }) - When("a user scales worker nodes less than num of machine deployments", func() { - It("should return an error", func() { - regionalClusterClient.GetMDObjectForClusterReturns([]v1beta1.MachineDeployment{md1, md2, md3}, nil) - - scaleClusterOptions.WorkerCount = 2 - - err = tkgClient.DoScaleCluster(regionalClusterClient, &scaleClusterOptions) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("worker count must be greater than")) - }) - }) - When("a user calls ScaleCluster with a worker count less than 1", func() { - It("should not update any mds", func() { - scaleClusterOptions.WorkerCount = 0 - - err = tkgClient.DoScaleCluster(regionalClusterClient, &scaleClusterOptions) - Expect(err).ToNot(HaveOccurred()) - - Expect(regionalClusterClient.GetMDObjectForClusterCallCount()).To(Equal(0)) - Expect(regionalClusterClient.UpdateReplicasCallCount()).To(Equal(0)) - }) - }) - }) - Context("and scale is operating on a specific node pool", func() { - When("a user scales an existing node pool", func() { - It("should update the replicas of that node pool", func() { - regionalClusterClient.GetMDObjectForClusterReturnsOnCall(0, []v1beta1.MachineDeployment{md1, md2, md3}, nil) - regionalClusterClient.GetMDObjectForClusterReturnsOnCall(1, []v1beta1.MachineDeployment{md1, md2, md3}, nil) - - scaleClusterOptions.NodePoolName = md1Name - scaleClusterOptions.WorkerCount = 3 - - err = tkgClient.DoScaleCluster(regionalClusterClient, &scaleClusterOptions) - Expect(err).ToNot(HaveOccurred()) - - Expect(regionalClusterClient.GetMDObjectForClusterCallCount()).To(Equal(2)) - Expect(regionalClusterClient.UpdateResourceCallCount()).To(Equal(1)) - mdInterface, _, _, _ := regionalClusterClient.UpdateResourceArgsForCall(0) - md := mdInterface.(*v1beta1.MachineDeployment) - Expect(*md.Spec.Replicas).To(Equal(int32(3))) - }) - }) - When("an error occurs retrieving machine deployments", func() { - It("should throw an error", func() { - mdErrString := "failed retrieving mds" - regionalClusterClient.GetMDObjectForClusterReturnsOnCall(0, nil, errors.New(mdErrString)) - - scaleClusterOptions.NodePoolName = md1Name - scaleClusterOptions.WorkerCount = 3 - - err = tkgClient.DoScaleCluster(regionalClusterClient, &scaleClusterOptions) - Expect(err).Should(MatchError(fmt.Sprintf("Failed to get node pools for cluster %s: error retrieving machine deployments: %s", scaleClusterOptions.ClusterName, mdErrString))) - }) - }) - When("the named node pool can't be found", func() { - It("should throw an error", func() { - regionalClusterClient.GetMDObjectForClusterReturnsOnCall(0, nil, nil) - - scaleClusterOptions.NodePoolName = md1Name - scaleClusterOptions.WorkerCount = 3 - - err = tkgClient.DoScaleCluster(regionalClusterClient, &scaleClusterOptions) - Expect(err).Should(MatchError(fmt.Sprintf("Could not find node pool with name %s", scaleClusterOptions.NodePoolName))) - }) - }) - When("the node pool fails to be updated", func() { - It("should throw an error", func() { - mdErrString := "failed setting node pool" - regionalClusterClient.GetMDObjectForClusterReturnsOnCall(0, []v1beta1.MachineDeployment{md1, md2, md3}, nil) - regionalClusterClient.GetMDObjectForClusterReturnsOnCall(1, nil, errors.New(mdErrString)) - - scaleClusterOptions.NodePoolName = md1Name - scaleClusterOptions.WorkerCount = 3 - - err = tkgClient.DoScaleCluster(regionalClusterClient, &scaleClusterOptions) - Expect(err).Should(MatchError(fmt.Sprintf("Unable to scale node pool %s: error retrieving worker machine deployments: %s", scaleClusterOptions.NodePoolName, mdErrString))) - - Expect(regionalClusterClient.GetMDObjectForClusterCallCount()).To(Equal(2)) - }) - }) - }) - }) - }) -}) - -var _ = Describe("Scale API for ClusterClass", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - cluster *v1beta1.Cluster - options *ScaleClusterOptions - ) - - JustBeforeEach(func() { - err = DoScaleCCCluster(regionalClusterClient, cluster, options) - }) - - BeforeEach(func() { - cluster = &v1beta1.Cluster{ - Spec: v1beta1.ClusterSpec{ - Topology: &v1beta1.Topology{ - ControlPlane: v1beta1.ControlPlaneTopology{ - Replicas: func(i int32) *int32 { return &i }(1), - }, - Workers: &v1beta1.WorkersTopology{ - MachineDeployments: []v1beta1.MachineDeploymentTopology{ - { - Name: "md-0", - Replicas: func(i int32) *int32 { return &i }(1), - }, - { - Name: "md-1", - Replicas: func(i int32) *int32 { return &i }(1), - }, - { - Name: "md-2", - Replicas: func(i int32) *int32 { return &i }(1), - }, - }, - }, - }, - }, - } - regionalClusterClient = &fakes.ClusterClient{} - regionalClusterClient.IsClusterClassBasedReturns(true, nil) - }) - - When("Scaling the controlPlane", func() { - BeforeEach(func() { - options = &ScaleClusterOptions{ - ClusterName: "test-cluster", - Namespace: "test-ns", - ControlPlaneCount: 3, - } - }) - - It("Should update the control plane replica count", func() { - Expect(err).ToNot(HaveOccurred()) - - iCluster, clusterName, namespace, _ := regionalClusterClient.UpdateResourceArgsForCall(0) - Expect(clusterName).To(Equal("test-cluster")) - Expect(namespace).To(Equal("test-ns")) - - actual, ok := iCluster.(*v1beta1.Cluster) - Expect(ok).To(BeTrue()) - Expect(*actual.Spec.Topology.ControlPlane.Replicas).To(Equal(int32(3))) - }) - }) - - When("Scaling workers without a node pool name", func() { - BeforeEach(func() { - options = &ScaleClusterOptions{ - ClusterName: "test-cluster", - Namespace: "test-ns", - WorkerCount: 4, - } - }) - - It("should round robin scale the machine deployments", func() { - Expect(err).ToNot(HaveOccurred()) - - iCluster, clusterName, namespace, _ := regionalClusterClient.UpdateResourceArgsForCall(0) - Expect(clusterName).To(Equal("test-cluster")) - Expect(namespace).To(Equal("test-ns")) - - actual, ok := iCluster.(*v1beta1.Cluster) - Expect(ok).To(BeTrue()) - - Expect(*actual.Spec.Topology.Workers.MachineDeployments[0].Replicas).To(Equal(int32(2))) - }) - }) - - When("Scaling workers with a node pool name", func() { - BeforeEach(func() { - options = &ScaleClusterOptions{ - ClusterName: "test-cluster", - Namespace: "test-ns", - NodePoolName: "md-2", - WorkerCount: 4, - } - }) - - It("should update replicas on the name machine deployment", func() { - Expect(err).ToNot(HaveOccurred()) - - iCluster, clusterName, namespace, _ := regionalClusterClient.UpdateResourceArgsForCall(0) - Expect(clusterName).To(Equal("test-cluster")) - Expect(namespace).To(Equal("test-ns")) - - actual, ok := iCluster.(*v1beta1.Cluster) - Expect(ok).To(BeTrue()) - - Expect(*actual.Spec.Topology.Workers.MachineDeployments[2].Replicas).To(Equal(int32(4))) - }) - }) -}) diff --git a/tkg/client/test/ako-packageinstall/testcase1/output.yaml b/tkg/client/test/ako-packageinstall/testcase1/output.yaml deleted file mode 100644 index 13db7ae29e..0000000000 --- a/tkg/client/test/ako-packageinstall/testcase1/output.yaml +++ /dev/null @@ -1,57 +0,0 @@ -apiVersion: packaging.carvel.dev/v1alpha1 -kind: PackageInstall -metadata: - name: load-balancer-and-ingress-service - namespace: tkg-system - annotations: - kapp.k14s.io/disable-wait: "" - labels: - tkg.tanzu.vmware.com/package-type: management -spec: - packageRef: - refName: load-balancer-and-ingress-service.tanzu.vmware.com - versionSelection: - prereleases: {} - serviceAccountName: load-balancer-and-ingress-service-package-sa - values: - - secretRef: - name: test-load-balancer-and-ingress-service-addon ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: load-balancer-and-ingress-service-package-sa - namespace: tkg-system - annotations: - kapp.k14s.io/change-group: load-balancer-and-ingress-service-packageinstall/serviceaccount-0 ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: load-balancer-and-ingress-service-package-role - annotations: - kapp.k14s.io/change-group: load-balancer-and-ingress-service-packageinstall/serviceaccount-0 -rules: -- apiGroups: - - '*' - resources: - - '*' - verbs: - - '*' ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: load-balancer-and-ingress-service-package-cluster-rolebinding - annotations: - kapp.k14s.io/change-group: load-balancer-and-ingress-service-packageinstall/serviceaccount - kapp.k14s.io/change-rule.0: upsert after upserting load-balancer-and-ingress-service-packageinstall/serviceaccount-0 - kapp.k14s.io/change-rule.1: delete before deleting load-balancer-and-ingress-service-packageinstall/serviceaccount-0 -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: load-balancer-and-ingress-service-package-role -subjects: -- kind: ServiceAccount - name: load-balancer-and-ingress-service-package-sa - namespace: tkg-system diff --git a/tkg/client/test/ako-packageinstall/testcase1/uservalues.yaml b/tkg/client/test/ako-packageinstall/testcase1/uservalues.yaml deleted file mode 100644 index b9ab36201e..0000000000 --- a/tkg/client/test/ako-packageinstall/testcase1/uservalues.yaml +++ /dev/null @@ -1,4 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -CLUSTER_NAME: test diff --git a/tkg/client/test/kapp-controller-values/testcase1/output.yaml b/tkg/client/test/kapp-controller-values/testcase1/output.yaml deleted file mode 100644 index 71d2d55eac..0000000000 --- a/tkg/client/test/kapp-controller-values/testcase1/output.yaml +++ /dev/null @@ -1,38 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True -#@overlay/replace ---- -namespace: tkg-system -nodeSelector: - node-role.kubernetes.io/control-plane: "" -deployment: - updateStrategy: null - rollingUpdate: - maxUnavailable: null - maxSurge: null -daemonset: - updateStrategy: null -kappController: - namespace: tkg-system - createNamespace: true - globalNamespace: tkg-system - deployment: - concurrency: 4 - coreDNSIP: null - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - config: {} diff --git a/tkg/client/test/kapp-controller-values/testcase1/uservalues.yaml b/tkg/client/test/kapp-controller-values/testcase1/uservalues.yaml deleted file mode 100644 index 9606ac4bfa..0000000000 --- a/tkg/client/test/kapp-controller-values/testcase1/uservalues.yaml +++ /dev/null @@ -1,20 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -CORE_DNS_IP: - -TKG_HTTP_PROXY: -TKG_HTTPS_PROXY: -TKG_NO_PROXY: -TKG_PROXY_CA_CERT: - -TKG_CUSTOM_IMAGE_REPOSITORY: -TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: -TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: - -PROVIDER_TYPE: -AWS_VPC_CIDR: -AZURE_VNET_CIDR: -SERVICE_CIDR: -CLUSTER_CIDR: -TKG_IP_FAMILY: diff --git a/tkg/client/test/kapp-controller-values/testcase2/output.yaml b/tkg/client/test/kapp-controller-values/testcase2/output.yaml deleted file mode 100644 index 766479f652..0000000000 --- a/tkg/client/test/kapp-controller-values/testcase2/output.yaml +++ /dev/null @@ -1,41 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True -#@overlay/replace ---- -namespace: tkg-system -nodeSelector: - node-role.kubernetes.io/control-plane: "" -deployment: - updateStrategy: null - rollingUpdate: - maxUnavailable: null - maxSurge: null -daemonset: - updateStrategy: null -kappController: - namespace: tkg-system - createNamespace: true - globalNamespace: tkg-system - deployment: - concurrency: 4 - coreDNSIP: 10.10.10.10 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - config: - httpProxy: 5.5.5.5 - httpsProxy: 5.5.5.5 - noProxy: 20.20.0.0,169.254.0.0/16,20.20.20.10,20.20.20.11,localhost,127.0.0.1,.svc,.svc.cluster.local diff --git a/tkg/client/test/kapp-controller-values/testcase2/uservalues.yaml b/tkg/client/test/kapp-controller-values/testcase2/uservalues.yaml deleted file mode 100644 index 122a270ff5..0000000000 --- a/tkg/client/test/kapp-controller-values/testcase2/uservalues.yaml +++ /dev/null @@ -1,15 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -CORE_DNS_IP: "10.10.10.10" - -TKG_HTTP_PROXY: "5.5.5.5" -TKG_HTTPS_PROXY: "5.5.5.5" -TKG_NO_PROXY: "" -TKG_PROXY_CA_CERT: - -PROVIDER_TYPE: "aws" -AWS_VPC_CIDR: "20.20.0.0" -SERVICE_CIDR: "20.20.20.10" -CLUSTER_CIDR: "20.20.20.11" -TKG_IP_FAMILY: "ipv4" diff --git a/tkg/client/test/kapp-controller-values/testcase3/output.yaml b/tkg/client/test/kapp-controller-values/testcase3/output.yaml deleted file mode 100644 index 3f3638a096..0000000000 --- a/tkg/client/test/kapp-controller-values/testcase3/output.yaml +++ /dev/null @@ -1,40 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True -#@overlay/replace ---- -namespace: tkg-system -nodeSelector: - node-role.kubernetes.io/control-plane: "" -deployment: - updateStrategy: null - rollingUpdate: - maxUnavailable: null - maxSurge: null -daemonset: - updateStrategy: null -kappController: - namespace: tkg-system - createNamespace: true - globalNamespace: tkg-system - deployment: - concurrency: 4 - coreDNSIP: 10.10.10.10 - hostNetwork: true - priorityClassName: system-cluster-critical - apiPort: 10100 - metricsBindAddress: "0" - tolerations: - - key: CriticalAddonsOnly - operator: Exists - - effect: NoSchedule - key: node-role.kubernetes.io/control-plane - - effect: NoSchedule - key: node-role.kubernetes.io/master - - effect: NoSchedule - key: node.kubernetes.io/not-ready - - effect: NoSchedule - key: node.cloudprovider.kubernetes.io/uninitialized - value: "true" - config: - caCerts: fake-ca-cert - dangerousSkipTLSVerify: fake.custom-repo.com diff --git a/tkg/client/test/kapp-controller-values/testcase3/uservalues.yaml b/tkg/client/test/kapp-controller-values/testcase3/uservalues.yaml deleted file mode 100644 index e6d6ef4265..0000000000 --- a/tkg/client/test/kapp-controller-values/testcase3/uservalues.yaml +++ /dev/null @@ -1,8 +0,0 @@ -#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -CORE_DNS_IP: "10.10.10.10" - -TKG_CUSTOM_IMAGE_REPOSITORY: "fake.custom-repo.com" -TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: "ZmFrZS1jYS1jZXJ0" #! fake-ca-cert -TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: true diff --git a/tkg/client/test_utils.go b/tkg/client/test_utils.go deleted file mode 100644 index 4555878680..0000000000 --- a/tkg/client/test_utils.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "fmt" - "os" - "path/filepath" - "time" - - "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clientcreator" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -var testTKGCompatibilityFileFmt = ` -version: v1 -managementClusterPluginVersions: -- version: %s - supportedTKGBomVersions: - - imagePath: tkg-bom - tag: %s -` - -func copyFile(sourceFile, destFile string) { - input, _ := os.ReadFile(sourceFile) - _ = os.WriteFile(destFile, input, constants.ConfigFilePermissions) -} - -func createTKGClient(clusterConfigFile, configDir, defaultBomFile string, timeout time.Duration) (*TkgClient, error) { - return createTKGClientOpts(clusterConfigFile, configDir, defaultBomFile, timeout, func(options Options) Options { return options }) -} - -func CreateTKGClientOptsMutator(clusterConfigFile, configDir, defaultBomFile string, timeout time.Duration, optMutator func(options Options) Options) (*TkgClient, error) { - return createTKGClientOpts(clusterConfigFile, configDir, defaultBomFile, timeout, optMutator) -} - -func createTKGClientOpts(clusterConfigFile, configDir, defaultBomFile string, timeout time.Duration, optMutator func(options Options) Options) (*TkgClient, error) { - setupTestingFiles(clusterConfigFile, configDir, defaultBomFile) - appConfig := types.AppConfig{ - TKGConfigDir: configDir, - CustomizerOptions: types.CustomizerOptions{ - RegionManagerFactory: region.NewFactory(), - }, - } - allClients, err := clientcreator.CreateAllClients(appConfig, nil) - if err != nil { - return nil, err - } - - return New(optMutator(Options{ - ClusterCtlClient: allClients.ClusterCtlClient, - ReaderWriterConfigClient: allClients.ConfigClient, - RegionManager: allClients.RegionManager, - TKGConfigDir: configDir, - Timeout: timeout, - FeaturesClient: allClients.FeaturesClient, - TKGConfigProvidersClient: allClients.TKGConfigProvidersClient, - TKGBomClient: allClients.TKGBomClient, - TKGConfigUpdater: allClients.TKGConfigUpdaterClient, - TKGPathsClient: allClients.TKGConfigPathsClient, - FeatureFlagClient: &configapi.ClientConfig{}, - })) -} - -func setupTestingFiles(clusterConfigFile, configDir, defaultBomFile string) { - testClusterConfigFile := filepath.Join(configDir, "config.yaml") - err := utils.CopyFile(clusterConfigFile, testClusterConfigFile) - gomega.Expect(err).ToNot(gomega.HaveOccurred()) - - bomDir, err := tkgconfigpaths.New(configDir).GetTKGBoMDirectory() - gomega.Expect(err).ToNot(gomega.HaveOccurred()) - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - err = os.MkdirAll(bomDir, 0o700) - gomega.Expect(err).ToNot(gomega.HaveOccurred()) - } - err = utils.CopyFile(defaultBomFile, filepath.Join(bomDir, filepath.Base(defaultBomFile))) - gomega.Expect(err).ToNot(gomega.HaveOccurred()) - - compatibilityDir, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityDirectory() - gomega.Expect(err).ToNot(gomega.HaveOccurred()) - if _, err := os.Stat(compatibilityDir); os.IsNotExist(err) { - err = os.MkdirAll(compatibilityDir, 0o700) - gomega.Expect(err).ToNot(gomega.HaveOccurred()) - } - - defaultBomFileTag := utils.GetTKGBoMTagFromFileName(filepath.Base(defaultBomFile)) - testTKGCompatabilityFileContent := fmt.Sprintf(testTKGCompatibilityFileFmt, tkgconfigpaths.TKGManagementClusterPluginVersion, defaultBomFileTag) - - compatibilityConfigFile, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityConfigPath() - gomega.Expect(err).ToNot(gomega.HaveOccurred()) - err = os.WriteFile(compatibilityConfigFile, []byte(testTKGCompatabilityFileContent), constants.ConfigFilePermissions) - gomega.Expect(err).ToNot(gomega.HaveOccurred()) -} diff --git a/tkg/client/types.go b/tkg/client/types.go deleted file mode 100644 index 4f3431fa93..0000000000 --- a/tkg/client/types.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -// TKGClusterPhase is used to type the constants describing possible cluster status. -type TKGClusterPhase string - -const ( - // TKGClusterPhaseCreating means the cluster control plane is under creation, - // or that infrastructure has been created and configured but not yet with - // an initialized control plane. - TKGClusterPhaseCreating = TKGClusterPhase("creating") - - // TKGClusterPhaseCreationStalled indicates that the cluster is in the - // process of creating control plane and the process is possibly - // stalled and user intervention is required. - TKGClusterPhaseCreationStalled = TKGClusterPhase("createStalled") - - // TKGClusterPhaseRunning means that the infrastructure has been created - // and configured, and that the control plane has been fully initialized. - TKGClusterPhaseRunning = TKGClusterPhase("running") - - // TKGClusterPhaseDeleting means that the cluster is being deleted. - TKGClusterPhaseDeleting = TKGClusterPhase("deleting") - - // TKGClusterPhaseFailed means that cluster control plane - // creation failed. Possible user intervention required. - // This Phase to be used for TKC(pacific cluster). - TKGClusterPhaseFailed = TKGClusterPhase("failed") - - // TKGClusterPhaseUpdating indicates that the cluster is in the - // process of rolling out an update or scaling nodes - TKGClusterPhaseUpdating = TKGClusterPhase("updating") - - // TKGClusterPhaseUpdateFailed indicates that the cluster's - // rolling update failed and likely requires user intervention. - // This Phase to be used for TKC(pacific cluster). - TKGClusterPhaseUpdateFailed = TKGClusterPhase("updateFailed") - - // TKGClusterPhaseUpdateStalled indicates that the cluster is in the - // process of rolling out an update and the update process is possibly - // stalled and user intervention is required. - TKGClusterPhaseUpdateStalled = TKGClusterPhase("updateStalled") - - // TKGClusterPhaseEmpty is useful for the initial reconcile, - // before we even state the phase as creating. - TKGClusterPhaseEmpty = TKGClusterPhase("") -) - -// TKGClusterType specifies cluster type -type TKGClusterType string - -// cluster types -const ( - ManagementCluster TKGClusterType = "Management" - WorkloadCluster TKGClusterType = "Workload" -) diff --git a/tkg/client/update_cluster_versioned_bom.go b/tkg/client/update_cluster_versioned_bom.go deleted file mode 100644 index d2e02d30e0..0000000000 --- a/tkg/client/update_cluster_versioned_bom.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "github.com/pkg/errors" - yaml "gopkg.in/yaml.v3" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -const clusterMetadataNamespace = "tkg-system-public" -const tkgBomConfigMapName = "tkg-bom" -const clusterMetadataNamespaceRoleName = "tkg-metadata-reader" - -// CreateOrUpdateVerisionedTKGBom will create or update the tkg-bom- ConfigMap. This is required for destributing tkg-bom information -// to workload clusters. -func (c *TkgClient) CreateOrUpdateVerisionedTKGBom(regionalClusterClient clusterclient.Client) error { - bomConfiguration, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return errors.Wrapf(err, "cannot get the default bom configuration") - } - - tkgBomConfigMap := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: clusterMetadataNamespace, - Name: tkgBomConfigMapName + "-" + bomConfiguration.Release.Version, - }, - Data: make(map[string]string), - } - - bomConfigurationByte, err := yaml.Marshal(bomConfiguration) - if err != nil { - return errors.Wrap(err, "unable to yaml marshal default bom configuration") - } - tkgBomConfigMap.Data["bom.yaml"] = string(bomConfigurationByte) - - // in case the namespace and the corresponding rbac are not exists - err = createOrUpdateNamespaceRole(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "failed to create or update namespace role") - } - - // create or update tkg-bom ConfigMap - err = createOrUpdateResource(regionalClusterClient, tkgBomConfigMap, tkgBomConfigMapName, clusterMetadataNamespace) - if err != nil { - return errors.Wrap(err, "failed to create or update tkg-bom ConfigMap") - } - - return nil -} - -func createOrUpdateNamespaceRole(clusterClient clusterclient.Client) error { - err := clusterClient.CreateNamespace(clusterMetadataNamespace) - if err != nil { - return err - } - - namespaceRole := &rbacv1.Role{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterMetadataNamespaceRoleName, - Namespace: clusterMetadataNamespace, - }, - Rules: []rbacv1.PolicyRule{ - { - APIGroups: []string{ - "", - }, - ResourceNames: []string{ - "tkg-metadata", - "tkg-bom", - }, - Resources: []string{ - "configmaps", - }, - Verbs: []string{ - "get", - "list", - "watch", - }, - }, - }, - } - - namespaceRoleBinding := &rbacv1.RoleBinding{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterMetadataNamespaceRoleName, - Namespace: clusterMetadataNamespace, - }, - RoleRef: rbacv1.RoleRef{ - APIGroup: "rbac.authorization.k8s.io", - Kind: "Role", - Name: clusterMetadataNamespaceRoleName, - }, - Subjects: []rbacv1.Subject{ - { - APIGroup: "rbac.authorization.k8s.io", - Kind: "Group", - Name: "system:authenticated", - }, - }, - } - - // create or update tkg-metadata-reader Role - err = createOrUpdateResource(clusterClient, namespaceRole, clusterMetadataNamespaceRoleName, clusterMetadataNamespace) - if err != nil { - return errors.Wrap(err, "failed to create or update tkg-metadata-reader Role") - } - - // create or update tkg-metadata-reader RoleBinding - err = createOrUpdateResource(clusterClient, namespaceRoleBinding, clusterMetadataNamespaceRoleName, clusterMetadataNamespace) - if err != nil { - return errors.Wrap(err, "failed to create or update tkg-metadata-reader RoleBinding") - } - return nil -} - -func createOrUpdateResource(clusterClient clusterclient.Client, resoureReference interface{}, name string, namespace string) error { - err := clusterClient.UpdateResource(resoureReference, name, namespace) - if err != nil && apierrors.IsNotFound(err) { - err = clusterClient.CreateResource(resoureReference, name, namespace) - if err != nil { - return err - } - } else if err != nil { - return err - } - return nil -} diff --git a/tkg/client/update_cluster_versioned_bom_test.go b/tkg/client/update_cluster_versioned_bom_test.go deleted file mode 100644 index 4743093678..0000000000 --- a/tkg/client/update_cluster_versioned_bom_test.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime/schema" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" -) - -var _ = Describe("Unit tests for updating versioned tkg bom", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - tkgClient *TkgClient - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Millisecond) - Expect(err).NotTo(HaveOccurred()) - setupBomFile("../fakes/config/bom/tkg-bom-v1.3.1.yaml", testingDir) - }) - - Context("When updating versioned tkg bom", func() { - JustBeforeEach(func() { - err = tkgClient.CreateOrUpdateVerisionedTKGBom(regionalClusterClient) - }) - Context("When failed to create or update namespace", func() { - BeforeEach(func() { - regionalClusterClient.CreateNamespaceReturns(errors.New("failed to create or update namespace")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to create or update namespace")) - }) - }) - Context("When failed to update role", func() { - BeforeEach(func() { - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - _, ok := obj.(*rbacv1.Role) - if !ok { - return nil - } - return errors.New("failed to update role") - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to update role")) - }) - }) - Context("When failed to create role", func() { - BeforeEach(func() { - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - _, ok := obj.(*rbacv1.Role) - if !ok { - return nil - } - return apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource") - }) - regionalClusterClient.CreateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.CreateOption) error { - _, ok := obj.(*rbacv1.Role) - if !ok { - return nil - } - return errors.New("failed to create role") - }) - - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to create role")) - }) - }) - Context("When failed to update rolebinding", func() { - BeforeEach(func() { - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - _, ok := obj.(*rbacv1.RoleBinding) - if !ok { - return nil - } - return errors.New("failed to update rolebinding") - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to update rolebinding")) - }) - }) - Context("When failed to create rolebinding", func() { - BeforeEach(func() { - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - _, ok := obj.(*rbacv1.RoleBinding) - if !ok { - return nil - } - return apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource") - }) - regionalClusterClient.CreateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.CreateOption) error { - _, ok := obj.(*rbacv1.RoleBinding) - if !ok { - return nil - } - return errors.New("failed to create rolebinding") - }) - - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to create rolebinding")) - }) - }) - - Context("When failed to update versioned tkg bom configmap", func() { - BeforeEach(func() { - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - _, ok := obj.(*rbacv1.RoleBinding) - if !ok { - return nil - } - return errors.New("failed to update versioned tkg bom configmap") - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to update versioned tkg bom configmap")) - }) - }) - Context("When failed to create versioned tkg bom configmap", func() { - BeforeEach(func() { - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - _, ok := obj.(*corev1.ConfigMap) - if !ok { - return nil - } - return apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource") - }) - regionalClusterClient.CreateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.CreateOption) error { - _, ok := obj.(*corev1.ConfigMap) - if !ok { - return nil - } - return errors.New("failed to create versioned tkg bom configmap") - }) - - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to create versioned tkg bom configmap")) - }) - }) - - Context("When succeeded to update the versioned tkg bom configmap", func() { - BeforeEach(func() { - regionalClusterClient.UpdateResourceCalls(func(obj interface{}, objName string, namespace string, opts ...client.UpdateOption) error { - cm, ok := obj.(*corev1.ConfigMap) - if !ok { - return nil - } - Expect(cm.Name).To(Equal("tkg-bom-1.2.1-rc.1")) - Expect(cm.Namespace).To(Equal("tkg-system-public")) - bomYaml := cm.Data["bom.yaml"] - bom := &tkgconfigbom.BOMConfiguration{} - err := yaml.Unmarshal([]byte(bomYaml), bom) - Expect(err).ToNot(HaveOccurred()) - return nil - }) - - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - }) - -}) diff --git a/tkg/client/update_credentials.go b/tkg/client/update_credentials.go deleted file mode 100644 index 7925bcef80..0000000000 --- a/tkg/client/update_credentials.go +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "github.com/pkg/errors" - - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" -) - -// UpdateCredentialsOptions update credential options -type UpdateCredentialsOptions struct { - ClusterName string - Namespace string - Kubeconfig string - VSphereUpdateClusterOptions *VSphereUpdateClusterOptions - AzureUpdateClusterOptions *AzureUpdateClusterOptions - IsRegionalCluster bool - IsCascading bool -} - -// VSphereUpdateClusterOptions vsphere credential options -type VSphereUpdateClusterOptions struct { - Username string - Password string -} - -// AzureUpdateClusterOptions azure credential options -type AzureUpdateClusterOptions struct { - AzureTenantID string - AzureClientID string - AzureClientSecret string -} - -// UpdateCredentialsRegion update management cluster credentials -func (c *TkgClient) UpdateCredentialsRegion(options *UpdateCredentialsOptions) error { - if options == nil { - return errors.New("invalid update cluster options") - } - - contexts, err := c.GetRegionContexts(options.ClusterName) - if err != nil || len(contexts) == 0 { - return errors.Errorf("management cluster %s not found", options.ClusterName) - } - currentRegion := contexts[0] - options.Kubeconfig = currentRegion.SourceFilePath - - if currentRegion.Status == region.Failed { - return errors.Errorf("cannot update since deployment failed for management cluster %s", currentRegion.ClusterName) - } - - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclient.Options{OperationTimeout: c.timeout}) - if err != nil { - return errors.Wrap(err, "unable to get cluster client while upgrading management cluster") - } - - isPacific, err := regionalClusterClient.IsPacificRegionalCluster() - if err != nil { - return errors.Wrap(err, "error determining 'Tanzu Kubernetes Cluster service for vSphere' management cluster") - } - if isPacific { - return errors.New("updating 'Tanzu Kubernetes Cluster service for vSphere' management cluster is not yet supported") - } - - infraProvider, err := regionalClusterClient.GetRegionalClusterDefaultProviderName(clusterctlv1.InfrastructureProviderType) - if err != nil { - return errors.Wrap(err, "failed to get cluster provider information") - } - infraProviderName, _, err := ParseProviderName(infraProvider) - if err != nil { - return errors.Wrap(err, "failed to parse provider name") - } - - log.Infof("Updating credentials for management cluster %q", options.ClusterName) - if infraProviderName == VSphereProviderName { - if err := c.UpdateVSphereClusterCredentials(regionalClusterClient, options); err != nil { - return err - } - } else if infraProviderName == AzureProviderName { - log.Infof("Updating credentials for azure provider") - if err := c.UpdateAzureClusterCredentials(regionalClusterClient, options); err != nil { - return err - } - } else { - return errors.New("Updating '" + infraProviderName + "' cluster is not yet supported") - } - - log.Infof("Credentials for management cluster is being updated") - return nil -} - -// UpdateCredentialsCluster update cluster credentials -func (c *TkgClient) UpdateCredentialsCluster(options *UpdateCredentialsOptions) error { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return errors.Wrap(err, "cannot get current management cluster context") - } - options.Kubeconfig = currentRegion.SourceFilePath - - log.V(4).Info("Creating management cluster client...") - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclient.Options{OperationTimeout: c.timeout}) - if err != nil { - return errors.Wrap(err, "unable to get cluster client while upgrading cluster") - } - - isPacific, err := regionalClusterClient.IsPacificRegionalCluster() - if err != nil { - return errors.Wrap(err, "error determining 'Tanzu Kubernetes Cluster service for vSphere' management cluster") - } - if isPacific { - return errors.New("update operation not supported for 'Tanzu Kubernetes Service' clusters") - } - - infraProvider, err := regionalClusterClient.GetRegionalClusterDefaultProviderName(clusterctlv1.InfrastructureProviderType) - if err != nil { - return errors.Wrap(err, "failed to get cluster provider information") - } - infraProviderName, _, err := ParseProviderName(infraProvider) - if err != nil { - return errors.Wrap(err, "failed to parse provider name") - } - - log.Infof("Updating credentials for workload cluster %q", options.ClusterName) - if infraProviderName == VSphereProviderName { - if err := c.UpdateVSphereClusterCredentials(regionalClusterClient, options); err != nil { - return err - } - } else if infraProviderName == AzureProviderName { - log.V(4).Infof("Updating credentials for azure provider") - if err := c.UpdateAzureClusterCredentials(regionalClusterClient, options); err != nil { - return err - } - } else { - // update operation is supported only on vsphere and azure clusters for now - return errors.New("Updating '" + infraProviderName + "' cluster is not yet supported") - } - - log.Infof("Credentials for workload cluster is being updated") - return nil -} - -// UpdateVSphereClusterCredentials update vsphere cluster credentials -func (c *TkgClient) UpdateVSphereClusterCredentials(clusterClient clusterclient.Client, options *UpdateCredentialsOptions) error { - if options.VSphereUpdateClusterOptions.Username == "" || options.VSphereUpdateClusterOptions.Password == "" { - return errors.New("either username or password should not be empty") - } - - if err := c.updateVSphereCredentialsForCluster(clusterClient, options); err != nil { - return err - } - - if options.IsRegionalCluster { - if options.IsCascading { - log.Infof("Updating credentials for all workload clusters under management cluster %q", options.ClusterName) - clusters, err := clusterClient.ListClusters("") - if err != nil { - return errors.Wrapf(err, "unable to update credentials on workload clusters") - } - - for i := range clusters { - if clusters[i].Name == options.ClusterName { - continue - } - - log.Infof("Updating credentials for workload cluster %q ...", clusters[i].Name) - err := c.updateVSphereCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusters[i].Name, - Namespace: clusters[i].Namespace, - IsRegionalCluster: false, - VSphereUpdateClusterOptions: options.VSphereUpdateClusterOptions, - }) - if err != nil { - log.Error(err, "unable to update credentials for workload cluster") - continue - } - } - } - } - - return nil -} - -func (c *TkgClient) updateVSphereCredentialsForCluster(clusterClient clusterclient.Client, options *UpdateCredentialsOptions) error { - if options.IsRegionalCluster { - // update capv-manager-bootstrap-credentials - if err := clusterClient.UpdateCapvManagerBootstrapCredentialsSecret(options.VSphereUpdateClusterOptions.Username, options.VSphereUpdateClusterOptions.Password); err != nil { - return err - } - } - - // update cluster identityRef secret if present - if err := clusterClient.UpdateVsphereIdentityRefSecret(options.ClusterName, options.Namespace, options.VSphereUpdateClusterOptions.Username, options.VSphereUpdateClusterOptions.Password); err != nil { - return err - } - - // update cloud-provider-vsphere-credentials - if err := clusterClient.UpdateVsphereCloudProviderCredentialsSecret(options.ClusterName, options.Namespace, options.VSphereUpdateClusterOptions.Username, options.VSphereUpdateClusterOptions.Password); err != nil { - return err - } - - // update csi-vsphere-config - if err := clusterClient.UpdateVsphereCsiConfigSecret(options.ClusterName, options.Namespace, options.VSphereUpdateClusterOptions.Username, options.VSphereUpdateClusterOptions.Password); err != nil { - return err - } - - return nil -} - -// UpdateAzureClusterCredentials update azure cluster credentials -func (c *TkgClient) UpdateAzureClusterCredentials(clusterClient clusterclient.Client, options *UpdateCredentialsOptions) error { - if options.AzureUpdateClusterOptions.AzureTenantID == "" || options.AzureUpdateClusterOptions.AzureClientID == "" || options.AzureUpdateClusterOptions.AzureClientSecret == "" { - return errors.New("either tenantId, clientId or clientSecret should not be empty") - } - - if !options.IsRegionalCluster { - unifiedIdentity, err := clusterClient.CheckUnifiedAzureClusterIdentity(options.ClusterName, options.Namespace) - if err != nil { - return err - } - if unifiedIdentity { - log.Warningf("Cluster %s use the same AzureClusterIdentity from its management cluster. It cannot be updated separately.", options.ClusterName) - return nil - } - } - - if err := c.UpdateAzureCredentialsForCluster(clusterClient, options, false); err != nil { - return err - } - - if options.IsRegionalCluster { - clusters, err := clusterClient.ListClusters("") - if err != nil { - return errors.Wrapf(err, "unable to list workload clusters") - } - - for i := range clusters { - if clusters[i].Name == options.ClusterName { - continue - } - unifiedIdentity, err := clusterClient.CheckUnifiedAzureClusterIdentity(clusters[i].Name, clusters[i].Namespace) - if err != nil { - return err - } - if options.IsCascading || unifiedIdentity { - log.V(4).Infof("Updating credentials for workload cluster %q ...", clusters[i].Name) - err := c.UpdateAzureCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusters[i].Name, - Namespace: clusters[i].Namespace, - IsRegionalCluster: false, - AzureUpdateClusterOptions: options.AzureUpdateClusterOptions, - }, unifiedIdentity) - if err != nil { - return err - } - } - } - } - - return nil -} - -func (c *TkgClient) UpdateAzureCredentialsForCluster(clusterClient clusterclient.Client, options *UpdateCredentialsOptions, unifiedIdentity bool) error { - if options.IsRegionalCluster { - // update capz-manager-bootstrap-credentials - log.Infof("Updating secret capz-manager-bootstrap-credentials for management cluster %q", options.ClusterName) - if err := clusterClient.UpdateCapzManagerBootstrapCredentialsSecret(options.AzureUpdateClusterOptions.AzureTenantID, options.AzureUpdateClusterOptions.AzureClientID, options.AzureUpdateClusterOptions.AzureClientSecret); err != nil { - return err - } - - // restart capz-controller-manager pod - log.Infof("Restarting capz-controller-manager pod") - if err := c.RestartCAPZControllerManagerPod(clusterClient); err != nil { - return err - } - - // UpdateAzureClusterIdentity - log.Infof("Updating cluster %q AzureClusterIdentity", options.ClusterName) - if err := clusterClient.UpdateAzureClusterIdentity(options.ClusterName, options.Namespace, options.AzureUpdateClusterOptions.AzureTenantID, options.AzureUpdateClusterOptions.AzureClientID, options.AzureUpdateClusterOptions.AzureClientSecret); err != nil { - return err - } - } else { - if !unifiedIdentity { - // UpdateAzureClusterIdentity - log.Infof("Updating cluster %q AzureClusterIdentity", options.ClusterName) - if err := clusterClient.UpdateAzureClusterIdentity(options.ClusterName, options.Namespace, options.AzureUpdateClusterOptions.AzureTenantID, options.AzureUpdateClusterOptions.AzureClientID, options.AzureUpdateClusterOptions.AzureClientSecret); err != nil { - return err - } - } else { - log.Warningf("Cluster %s use the same AzureClusterIdentity from its management cluster. It must be updated together.", options.ClusterName) - } - } - // Recycle all KCP in the cluster - log.V(4).Infof("Updating KCP rolloutAfter for cluster %q", options.ClusterName) - if err := clusterClient.UpdateAzureKCP(options.ClusterName, options.Namespace); err != nil { - return err - } - - return nil -} - -func (c *TkgClient) RestartCAPZControllerManagerPod(clusterClient clusterclient.Client) error { - replicas, err := clusterClient.GetCAPZControllerManagerDeploymentsReplicas() - if err != nil { - return err - } - - if replicas != 0 { - log.Infof("Set capz-controller-manager deployment replicas to 0") - if err := clusterClient.UpdateCAPZControllerManagerDeploymentReplicas(int32(0)); err != nil { - return err - } - - log.Infof("Reset capz-controller-manager deployment replicas") - if err := clusterClient.UpdateCAPZControllerManagerDeploymentReplicas(replicas); err != nil { - return err - } - } - - return nil -} diff --git a/tkg/client/update_credentials_test.go b/tkg/client/update_credentials_test.go deleted file mode 100644 index ad89d5d574..0000000000 --- a/tkg/client/update_credentials_test.go +++ /dev/null @@ -1,808 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" -) - -var _ = Describe("", func() { - var ( - err error - clusterClient *fakes.ClusterClient - tkgClient *TkgClient - kubeconfig string - clusterName string - ) - - BeforeEach(func() { - clusterName = "clusterName" - clusterClient = &fakes.ClusterClient{} - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - kubeconfig = fakehelper.GetFakeKubeConfigFilePath(testingDir, "../fakes/config/kubeconfig/config1.yaml") - }) - - Context("Update VSphere credentials for workload clusters", func() { - It("Returns error when username is empty", func() { - err := tkgClient.UpdateVSphereClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - VSphereUpdateClusterOptions: &VSphereUpdateClusterOptions{ - Username: "", - Password: "password", - }, - }) - Expect(err).ToNot(BeNil()) - }) - - It("Update workload cluster credentials", func() { - err := tkgClient.UpdateVSphereClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - VSphereUpdateClusterOptions: &VSphereUpdateClusterOptions{ - Username: "username", - Password: "password", - }, - }) - Expect(err).To(BeNil()) - - Expect(clusterClient.UpdateCapvManagerBootstrapCredentialsSecretCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateVsphereCloudProviderCredentialsSecretCallCount()).To(Equal(1)) - cname, namespace, uname, pwd := clusterClient.UpdateVsphereCloudProviderCredentialsSecretArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(uname).To(Equal("username")) - Expect(pwd).To(Equal("password")) - - Expect(clusterClient.UpdateVsphereCsiConfigSecretCallCount()).To(Equal(1)) - cname, namespace, uname, pwd = clusterClient.UpdateVsphereCsiConfigSecretArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(uname).To(Equal("username")) - Expect(pwd).To(Equal("password")) - }) - }) - - Context("Update VSphere credentials for management cluster", func() { - It("Returns error when username is empty", func() { - err := tkgClient.UpdateVSphereClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - VSphereUpdateClusterOptions: &VSphereUpdateClusterOptions{ - Username: "", - Password: "password", - }, - IsRegionalCluster: true, - }) - Expect(err).ToNot(BeNil()) - }) - - It("Should successfully update management cluster credentials", func() { - err := tkgClient.UpdateVSphereClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - VSphereUpdateClusterOptions: &VSphereUpdateClusterOptions{ - Username: "username", - Password: "password", - }, - IsRegionalCluster: true, - }) - Expect(err).To(BeNil()) - - Expect(clusterClient.UpdateCapvManagerBootstrapCredentialsSecretCallCount()).To(Equal(1)) - uname, pwd := clusterClient.UpdateCapvManagerBootstrapCredentialsSecretArgsForCall(0) - Expect(uname).To(Equal("username")) - Expect(pwd).To(Equal("password")) - - Expect(clusterClient.UpdateVsphereCloudProviderCredentialsSecretCallCount()).To(Equal(1)) - cname, namespace, uname, pwd := clusterClient.UpdateVsphereCloudProviderCredentialsSecretArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(uname).To(Equal("username")) - Expect(pwd).To(Equal("password")) - - Expect(clusterClient.UpdateVsphereCsiConfigSecretCallCount()).To(Equal(1)) - cname, namespace, uname, pwd = clusterClient.UpdateVsphereCsiConfigSecretArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(uname).To(Equal("username")) - Expect(pwd).To(Equal("password")) - }) - }) - - Context("Update Azure credentials for workload clusters", func() { - It("Returns error when AzureClientID is empty", func() { - err := tkgClient.UpdateAzureClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "", - AzureClientSecret: "azureClientSecret", - }, - }) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("either tenantId, clientId or clientSecret should not be empty"))) - }) - - It("Update workload cluster credentials with different identity", func() { - clusterClient.CheckUnifiedAzureClusterIdentityReturns(false, nil) - err := tkgClient.UpdateAzureClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - }) - Expect(err).To(BeNil()) - - Expect(clusterClient.CheckUnifiedAzureClusterIdentityCallCount()).To(Equal(1)) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(0)) - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(1)) - cname, namespace, tenantID, clientID, clientSecret := clusterClient.UpdateAzureClusterIdentityArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(1)) - cname, namespace = clusterClient.UpdateAzureKCPArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - }) - - It("Update workload cluster credentials with the same identity", func() { - clusterClient.CheckUnifiedAzureClusterIdentityReturns(true, nil) - err := tkgClient.UpdateAzureClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - }) - Expect(err).To(BeNil()) - Expect(clusterClient.CheckUnifiedAzureClusterIdentityCallCount()).To(Equal(1)) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(0)) - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(0)) - }) - - It("Update workload cluster credentials with cluster query error", func() { - clusterClient.CheckUnifiedAzureClusterIdentityReturns(false, errors.New("fake-error")) - err := tkgClient.UpdateAzureClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - }) - Expect(err).ToNot(BeNil()) - - Expect(clusterClient.CheckUnifiedAzureClusterIdentityCallCount()).To(Equal(1)) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(0)) - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(0)) - }) - }) - - Context("Update Azure credentials for management cluster", func() { - BeforeEach(func() { - clusterClient.ListClustersReturns([]capi.Cluster{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "test-01", - Namespace: "np-01", - }, - Spec: capi.ClusterSpec{ - ControlPlaneEndpoint: capi.APIEndpoint{ - Host: "10.0.0.1", - }, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "test-02", - Namespace: "np-02", - }, - Spec: capi.ClusterSpec{ - ControlPlaneEndpoint: capi.APIEndpoint{ - Host: "10.0.0.2", - }, - }, - }, - }, nil) - }) - - It("Returns error when AzureClientID is empty", func() { - err := tkgClient.UpdateAzureClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: true, - }) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("either tenantId, clientId or clientSecret should not be empty"))) - }) - - It("Returns error when failing to check cluster identity", func() { - clusterClient.CheckUnifiedAzureClusterIdentityReturnsOnCall(0, false, errors.New("fake query identity error")) - err := tkgClient.UpdateAzureClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: true, - }) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("fake query identity error"))) - Expect(clusterClient.CheckUnifiedAzureClusterIdentityCallCount()).To(Equal(1)) - }) - - It("Returns error when failing to update cluster identity", func() { - clusterClient.CheckUnifiedAzureClusterIdentityReturnsOnCall(0, true, nil) - clusterClient.CheckUnifiedAzureClusterIdentityReturnsOnCall(1, true, nil) - clusterClient.UpdateAzureKCPReturnsOnCall(1, errors.New("fake update identity error")) - err := tkgClient.UpdateAzureClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: true, - }) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("fake update identity error"))) - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(2)) - }) - - It("Should successfully update management cluster credentials with cascading", func() { - clusterClient.GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(0, int32(2), nil) - clusterClient.CheckUnifiedAzureClusterIdentityReturnsOnCall(0, true, nil) - clusterClient.CheckUnifiedAzureClusterIdentityReturnsOnCall(1, false, nil) - err := tkgClient.UpdateAzureClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: true, - IsCascading: true, - }) - Expect(err).To(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(1)) - tenantID, clientID, clientSecret := clusterClient.UpdateCapzManagerBootstrapCredentialsSecretArgsForCall(0) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(1)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(2)) - replicas := clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(0) - Expect(replicas).To(Equal(int32(0))) - replicas = clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(1) - Expect(replicas).To(Equal(int32(2))) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(2)) - cname, namespace, tenantID, clientID, clientSecret := clusterClient.UpdateAzureClusterIdentityArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - cname, namespace, tenantID, clientID, clientSecret = clusterClient.UpdateAzureClusterIdentityArgsForCall(1) - Expect(cname).To(Equal("test-02")) - Expect(namespace).To(Equal("np-02")) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.CheckUnifiedAzureClusterIdentityCallCount()).To(Equal(2)) - - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(3)) - cname, namespace = clusterClient.UpdateAzureKCPArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - cname, namespace = clusterClient.UpdateAzureKCPArgsForCall(1) - Expect(cname).To(Equal("test-01")) - Expect(namespace).To(Equal("np-01")) - cname, namespace = clusterClient.UpdateAzureKCPArgsForCall(2) - Expect(cname).To(Equal("test-02")) - Expect(namespace).To(Equal("np-02")) - }) - - It("Should successfully update management cluster credentials without cascading", func() { - clusterClient.GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(0, int32(2), nil) - clusterClient.CheckUnifiedAzureClusterIdentityReturnsOnCall(0, true, nil) - clusterClient.CheckUnifiedAzureClusterIdentityReturnsOnCall(1, false, nil) - err := tkgClient.UpdateAzureClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: true, - IsCascading: false, - }) - Expect(err).To(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(1)) - tenantID, clientID, clientSecret := clusterClient.UpdateCapzManagerBootstrapCredentialsSecretArgsForCall(0) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(1)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(2)) - replicas := clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(0) - Expect(replicas).To(Equal(int32(0))) - replicas = clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(1) - Expect(replicas).To(Equal(int32(2))) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(1)) - cname, namespace, tenantID, clientID, clientSecret := clusterClient.UpdateAzureClusterIdentityArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.CheckUnifiedAzureClusterIdentityCallCount()).To(Equal(2)) - - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(2)) - cname, namespace = clusterClient.UpdateAzureKCPArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - cname, namespace = clusterClient.UpdateAzureKCPArgsForCall(1) - Expect(cname).To(Equal("test-01")) - Expect(namespace).To(Equal("np-01")) - }) - - It("Should successfully update management cluster credentials without restarting CAPZ Controller Manager Pod", func() { - clusterClient.GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(0, int32(0), nil) - clusterClient.CheckUnifiedAzureClusterIdentityReturnsOnCall(0, true, nil) - clusterClient.CheckUnifiedAzureClusterIdentityReturnsOnCall(1, false, nil) - err := tkgClient.UpdateAzureClusterCredentials(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: true, - }) - Expect(err).To(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(1)) - tenantID, clientID, clientSecret := clusterClient.UpdateCapzManagerBootstrapCredentialsSecretArgsForCall(0) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(1)) - - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(1)) - cname, namespace, tenantID, clientID, clientSecret := clusterClient.UpdateAzureClusterIdentityArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.CheckUnifiedAzureClusterIdentityCallCount()).To(Equal(2)) - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(2)) - cname, namespace = clusterClient.UpdateAzureKCPArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - cname, namespace = clusterClient.UpdateAzureKCPArgsForCall(1) - Expect(cname).To(Equal("test-01")) - Expect(namespace).To(Equal("np-01")) - }) - }) - - Context("Update Azure credentials for each cluster", func() { - It("Update management cluster credential enabling unifiedIdentity", func() { - clusterClient.GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(0, int32(2), nil) - err := tkgClient.UpdateAzureCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: true, - }, true) - - Expect(err).To(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(1)) - tenantID, clientID, clientSecret := clusterClient.UpdateCapzManagerBootstrapCredentialsSecretArgsForCall(0) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(1)) - - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(2)) - replicas := clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(0) - Expect(replicas).To(Equal(int32(0))) - replicas = clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(1) - Expect(replicas).To(Equal(int32(2))) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(1)) - cname, namespace, tenantID, clientID, clientSecret := clusterClient.UpdateAzureClusterIdentityArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(1)) - cname, namespace = clusterClient.UpdateAzureKCPArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - }) - - It("Update management cluster credential disabling unifiedIdentity", func() { - clusterClient.GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(0, int32(2), nil) - err := tkgClient.UpdateAzureCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: true, - }, false) - - Expect(err).To(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(1)) - tenantID, clientID, clientSecret := clusterClient.UpdateCapzManagerBootstrapCredentialsSecretArgsForCall(0) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(1)) - - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(2)) - replicas := clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(0) - Expect(replicas).To(Equal(int32(0))) - replicas = clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(1) - Expect(replicas).To(Equal(int32(2))) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(1)) - cname, namespace, tenantID, clientID, clientSecret := clusterClient.UpdateAzureClusterIdentityArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(1)) - cname, namespace = clusterClient.UpdateAzureKCPArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - }) - - It("Update management cluster credential with failing to update secret", func() { - clusterClient.GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(0, int32(2), nil) - clusterClient.UpdateCapzManagerBootstrapCredentialsSecretReturns(errors.New("fake-error")) - err := tkgClient.UpdateAzureCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: true, - }, false) - - Expect(err).ToNot(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(1)) - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(0)) - Expect(clusterClient.CheckUnifiedAzureClusterIdentityCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(0)) - }) - - It("Update management cluster credential with failing to update identity", func() { - clusterClient.GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(0, int32(2), nil) - clusterClient.UpdateAzureClusterIdentityReturns(errors.New("fake-error")) - err := tkgClient.UpdateAzureCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: true, - }, false) - - Expect(err).ToNot(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(1)) - tenantID, clientID, clientSecret := clusterClient.UpdateCapzManagerBootstrapCredentialsSecretArgsForCall(0) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(1)) - - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(2)) - replicas := clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(0) - Expect(replicas).To(Equal(int32(0))) - replicas = clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(1) - Expect(replicas).To(Equal(int32(2))) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(1)) - Expect(clusterClient.CheckUnifiedAzureClusterIdentityCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(0)) - }) - - It("Update management cluster credential with failing to rollout KCP", func() { - clusterClient.GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(0, int32(2), nil) - clusterClient.UpdateAzureKCPReturns(errors.New("fake-error")) - err := tkgClient.UpdateAzureCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: true, - }, false) - - Expect(err).ToNot(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(1)) - tenantID, clientID, clientSecret := clusterClient.UpdateCapzManagerBootstrapCredentialsSecretArgsForCall(0) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(1)) - - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(2)) - replicas := clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(0) - Expect(replicas).To(Equal(int32(0))) - replicas = clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(1) - Expect(replicas).To(Equal(int32(2))) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(1)) - Expect(clusterClient.CheckUnifiedAzureClusterIdentityCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(1)) - }) - - It("Update workload cluster credential enabling unifiedIdentity", func() { - err := tkgClient.UpdateAzureCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: false, - }, true) - - Expect(err).To(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(0)) - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(1)) - cname, namespace := clusterClient.UpdateAzureKCPArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - }) - - It("Update workload cluster credential enabling unifiedIdentity with KCP rollout error", func() { - clusterClient.UpdateAzureKCPReturns(errors.New("fake-error")) - err := tkgClient.UpdateAzureCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: false, - }, true) - - Expect(err).ToNot(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(0)) - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(1)) - }) - - It("Update workload cluster credential disabling unifiedIdentity", func() { - err := tkgClient.UpdateAzureCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: false, - }, false) - - Expect(err).To(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(0)) - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(1)) - cname, namespace, tenantID, clientID, clientSecret := clusterClient.UpdateAzureClusterIdentityArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(1)) - cname, namespace = clusterClient.UpdateAzureKCPArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - }) - - It("Update workload cluster credential disabling unifiedIdentity with identity error", func() { - clusterClient.UpdateAzureClusterIdentityReturns(errors.New("fake-error")) - err := tkgClient.UpdateAzureCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: false, - }, false) - - Expect(err).ToNot(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(0)) - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(1)) - - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(0)) - }) - - It("Update workload cluster credential disabling unifiedIdentity with KCP rollout error", func() { - clusterClient.UpdateAzureKCPReturns(errors.New("fake-error")) - err := tkgClient.UpdateAzureCredentialsForCluster(clusterClient, &UpdateCredentialsOptions{ - ClusterName: clusterName, - Kubeconfig: kubeconfig, - AzureUpdateClusterOptions: &AzureUpdateClusterOptions{ - AzureTenantID: "azureTenantID", - AzureClientID: "azureClientID", - AzureClientSecret: "azureClientSecret", - }, - IsRegionalCluster: false, - }, false) - - Expect(err).ToNot(BeNil()) - - Expect(clusterClient.UpdateCapzManagerBootstrapCredentialsSecretCallCount()).To(Equal(0)) - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(0)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - - Expect(clusterClient.UpdateAzureClusterIdentityCallCount()).To(Equal(1)) - cname, namespace, tenantID, clientID, clientSecret := clusterClient.UpdateAzureClusterIdentityArgsForCall(0) - Expect(cname).To(Equal(clusterName)) - Expect(namespace).To(Equal("")) - Expect(tenantID).To(Equal("azureTenantID")) - Expect(clientID).To(Equal("azureClientID")) - Expect(clientSecret).To(Equal("azureClientSecret")) - - Expect(clusterClient.UpdateAzureKCPCallCount()).To(Equal(1)) - }) - }) - - Context("Restart CAPZ Controller Manager Pod", func() { - It("return CAPZ Controller Manager Deployments Replicas successfully with value 2", func() { - clusterClient.GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(0, int32(2), nil) - err := tkgClient.RestartCAPZControllerManagerPod(clusterClient) - - Expect(err).To(BeNil()) - - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(1)) - - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(2)) - replicas := clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(0) - Expect(replicas).To(Equal(int32(0))) - replicas = clusterClient.UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(1) - Expect(replicas).To(Equal(int32(2))) - }) - - It("return CAPZ Controller Manager Deployments Replicas successfully with value 0", func() { - clusterClient.GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(0, int32(0), nil) - err := tkgClient.RestartCAPZControllerManagerPod(clusterClient) - - Expect(err).To(BeNil()) - - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(1)) - - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - }) - - It("return CAPZ Controller Manager Deployments Replicas with errors", func() { - clusterClient.GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(0, int32(0), errors.New("fake-error")) - err := tkgClient.RestartCAPZControllerManagerPod(clusterClient) - - Expect(err).ToNot(BeNil()) - - Expect(clusterClient.GetCAPZControllerManagerDeploymentsReplicasCallCount()).To(Equal(1)) - Expect(clusterClient.UpdateCAPZControllerManagerDeploymentReplicasCallCount()).To(Equal(0)) - }) - }) -}) diff --git a/tkg/client/upgrade_addon.go b/tkg/client/upgrade_addon.go deleted file mode 100644 index 6b055da63c..0000000000 --- a/tkg/client/upgrade_addon.go +++ /dev/null @@ -1,448 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "encoding/base64" - "fmt" - "net" - "strings" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - kerrors "k8s.io/apimachinery/pkg/util/errors" - - "github.com/go-openapi/swag" - "github.com/jinzhu/copier" - "github.com/pkg/errors" - capi "sigs.k8s.io/cluster-api/api/v1alpha3" - clusterctl "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/yamlprocessor" -) - -// UpgradeAddonOptions upgrade addon options -type UpgradeAddonOptions struct { - AddonNames []string - ClusterName string - Namespace string - Kubeconfig string - IsRegionalCluster bool - Edition string -} - -// UpgradeAddon upgrades addons -func (c *TkgClient) UpgradeAddon(options *UpgradeAddonOptions) error { - if options == nil { - return errors.New("invalid upgrade addon options nil") - } - - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return errors.Wrap(err, "cannot get current management cluster context") - } - options.Kubeconfig = currentRegion.SourceFilePath - - log.V(4).Info("Creating management cluster client...") - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclient.Options{OperationTimeout: c.timeout}) - if err != nil { - return errors.Wrap(err, "unable to get cluster client while upgrading addon") - } - - isPacific, err := regionalClusterClient.IsPacificRegionalCluster() - if err != nil { - return errors.Wrap(err, "error determining 'Tanzu Kubernetes Cluster service for vSphere' management cluster") - } - if isPacific { - return errors.Wrap(err, "addons upgrade for 'Tanzu Kubernetes Cluster service for vSphere' management cluster is not yet supported") - } - - // get the management cluster name and namespace in case of management cluster upgrade - if options.IsRegionalCluster { - clusterName, namespace, err := c.getRegionalClusterNameAndNamespace(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "unable to get current management cluster information") - } - options.ClusterName = clusterName - options.Namespace = namespace - } - - var currentClusterClient clusterclient.Client - if options.IsRegionalCluster { - currentClusterClient = regionalClusterClient - } else { - log.V(4).Info("Creating workload cluster client...") - currentClusterClient, err = c.getWorkloadClusterClient(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrap(err, "unable to get workload cluster client") - } - } - - return c.DoUpgradeAddon(regionalClusterClient, currentClusterClient, options, c.GetClusterConfiguration) -} - -// DoUpgradeAddon performs steps for addons upgrade -func (c *TkgClient) DoUpgradeAddon(regionalClusterClient clusterclient.Client, //nolint:funlen,gocyclo - currentClusterClient clusterclient.Client, - options *UpgradeAddonOptions, - clusterConfigurationGetter func(*CreateClusterOptions) ([]byte, error)) error { - // this is required as clusters created with old version of cli does - // not have cluster-name label applied to cluster object and this label - // is required for CRS objects - err := c.addClusterNameLabel(regionalClusterClient, options) - if err != nil { - return err - } - - k8sVersion, err := c.tkgBomClient.GetDefaultK8sVersion() - if err != nil { - return errors.Wrap(err, "unable to get default kubernetes version from BoM files") - } - - configOptions := ClusterConfigOptions{ - ClusterName: options.ClusterName, - Kubeconfig: clusterctl.Kubeconfig{Path: options.Kubeconfig}, - KubernetesVersion: k8sVersion, - ControlPlaneMachineCount: swag.Int64(int64(1)), - WorkerMachineCount: swag.Int64(int64(1)), - TargetNamespace: options.Namespace, - } - - // XXX: Using dev plan as for clusters created with old tkg cli does not store plan information anywhere - // directly for our usage. Also, this information is only used for cluster template generation - // which is independent as we are just filtering cluster metadata objects at the moment - // NOTE: Please make sure to verify dev plan is sufficient for the usecase you are trying to add in future - configOptions.ProviderRepositorySource = &clusterctl.ProviderRepositorySourceOptions{ - InfrastructureProvider: "", - Flavor: constants.PlanDev, - } - - createClusterOptions := CreateClusterOptions{ - ClusterConfigOptions: configOptions, - // Build edition is required to perform addons upgrade. The providers/ytt is referencing to build edition for the - // rendering logic. Setting build edition here is to make sure addons upgrade to work properly. - Edition: options.Edition, - } - - kcp, err := regionalClusterClient.GetKCPObjectForCluster(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to find control plane node object for cluster %s", options.ClusterName) - } - if kcp.Spec.MachineTemplate.InfrastructureRef.Kind == constants.KindVSphereMachineTemplate { - // As vSphereControlPlaneEndpointIP is required for vSphere cluster for --dry-run - // while creating workload cluster template, setting this to dummy value currently - // Note: This value will not be used for addons upgrade - createClusterOptions.VsphereControlPlaneEndpoint = "unused" - } - - createClusterOptions.YamlProcessor = yamlprocessor.NewYttProcessorWithConfigDir(c.tkgConfigDir) - - // Skip validation while creating cluster template - // As we are more interested in generating basic cluster template using default BoM file, - // we don't want to verify the credentials and other config variables mentioned in - // user's TKG config file as those are irrelevant for the usecase we are implementing - createClusterOptions.SkipValidation = true - - if options.IsRegionalCluster { - createClusterOptions.ClusterType = ManagementCluster - } else { - createClusterOptions.ClusterType = WorkloadCluster - } - - // Only upgrade of cluster metadata, kapp-controller, addons-manager and tkr-controller to the existing cluster - // during upgrade process and other addons upgrade is not yet supported - - errListAddonUpgrade := []error{} - - for _, addonName := range options.AddonNames { - crsDisabledAddon := false - ccOptions := CreateClusterOptions{} - err := copier.Copy(&ccOptions, &createClusterOptions) - if err != nil { - return errors.Wrap(err, "unable to copy createClusterOptions object") - } - - // apply the addons yaml to management cluster by default - // override this if operation needs to be performed on - // current cluster instead of management cluster - clusterClient := regionalClusterClient - - switch addonName { - case "metadata/tkg": - ccOptions.TargetNamespace = constants.TkgPublicNamespace - crsDisabledAddon = true - // As tkg metadata yaml is associated per cluster instead - // of using management cluster client, we need to use - // current cluster which will point to workload cluster - // during workload cluster upgrade and management cluster - // during management cluster upgrade - clusterClient = currentClusterClient - case "addons-management/kapp-controller": - crsDisabledAddon = true - case "addons-management/tanzu-addons-manager": - if !options.IsRegionalCluster { - return errors.Errorf("upgrade of '%s' component is only supported on management cluster", addonName) - } - crsDisabledAddon = true - case "addons-management/core-package-repo": - if !options.IsRegionalCluster { - return errors.Errorf("upgrade of '%s' component is only supported on management cluster", addonName) - } - crsDisabledAddon = true - case "addons-management/standard-package-repo": - // This ensures that CRS for standard-package-repo gets added - // for new clusters as well as upgrades. CRS for standard repo - // package resource will ensure one time create and no upgrades after - // initial create. The case is empty because we only need to set - // crsDisabledAddon = false which is the default and ensures that - // default isn't triggered. - case "tkr/tkr-controller": - if !options.IsRegionalCluster { - return errors.Errorf("upgrade of '%s' component is only supported on management cluster", addonName) - } - crsDisabledAddon = true - ccOptions.TargetNamespace = constants.TkrNamespace - case "capabilities/capabilities-controller": - if !options.IsRegionalCluster { - return errors.Errorf("upgrade of '%s' component is only supported on management cluster", addonName) - } - crsDisabledAddon = true - case "packages/management-package-repo": - if !options.IsRegionalCluster { - return errors.Errorf("upgrade of '%s' component is only supported on management cluster", addonName) - } - crsDisabledAddon = true - case "packages/management-package": - if !options.IsRegionalCluster { - return errors.Errorf("upgrade of '%s' component is only supported on management cluster", addonName) - } - crsDisabledAddon = true - default: - return errors.Errorf("upgrade of '%s' component is not supported", addonName) - } - - // This variable configuration is important to filter only specific addons objects - // with ytt templating. There is specific code written on ytt side to do the filtering - c.TKGConfigReaderWriter().Set(constants.ConfigVariableFilterByAddonType, addonName) - - if crsDisabledAddon { - // This variable configuration is used to deactivate CRS for addons and generate the raw yaml - c.TKGConfigReaderWriter().Set(constants.ConfigVaraibleDisableCRSForAddonType, addonName) - } - - if options.IsRegionalCluster { - err = c.RetrieveRegionalClusterConfiguration(regionalClusterClient) - } else { - err = c.RetrieveWorkloadClusterConfiguration(regionalClusterClient, currentClusterClient, options.ClusterName, options.Namespace) - } - if err != nil { - return errors.Wrap(err, "unable to set cluster configuration") - } - - yaml, err := clusterConfigurationGetter(&ccOptions) - if err != nil { - return errors.Wrap(err, "unable to get cluster configuration") - } - - // ensure current kapp-controller deployment on the management cluster has last-applied annotation, which is required for future apply operations - if addonName == "addons-management/kapp-controller" && options.IsRegionalCluster { - if err := clusterClient.PatchKappControllerLastAppliedAnnotation(options.Namespace); err != nil { - return errors.Wrap(err, "unable to add last-applied annotation on kapp-controller") - } - } - - log.Infof("updating additional components: '%s' ...", addonName) - - err = clusterClient.Apply(string(yaml)) - if err != nil { - errListAddonUpgrade = append(errListAddonUpgrade, errors.Wrapf(err, "error while upgrading additional component '%s'", addonName)) - } - } - - // Aggregate all errors and return error - err = kerrors.NewAggregate(errListAddonUpgrade) - if err != nil { - return err - } - - return nil -} - -// RetrieveRegionalClusterConfiguration gets TKG configurations from regional cluster and updates the in-memory config. -// this is required when we want to mutate the existing regional cluster. -func (c *TkgClient) RetrieveRegionalClusterConfiguration(regionalClusterClient clusterclient.Client) error { - if err := c.setProxyConfiguration(regionalClusterClient); err != nil { - return errors.Wrapf(err, "error while getting proxy configuration from cluster and setting it") - } - - if err := c.setCustomImageRepositoryConfiguration(regionalClusterClient); err != nil { - return errors.Wrapf(err, "error while getting custom image repository configuration from cluster and setting it") - } - - clusterName, regionalClusterNamespace, err := c.getRegionalClusterNameAndNamespace(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "unable to get name and namespace of current management cluster") - } - - if err := c.setNetworkingConfiguration(regionalClusterClient, clusterName, regionalClusterNamespace); err != nil { - return errors.Wrap(err, "error while initializing networking configuration") - } - - return nil -} - -// RetrieveWorkloadClusterConfiguration gets TKG configurations from regional cluster as well as workload cluster -// and updates the in-memory config. This is required when we want to mutate the existing workload cluster. -func (c *TkgClient) RetrieveWorkloadClusterConfiguration(regionalClusterClient, workloadClusterClient clusterclient.Client, clusterName, clusterNamespace string) error { - if err := c.setProxyConfiguration(workloadClusterClient); err != nil { - return errors.Wrapf(err, "error while getting proxy configuration from cluster and setting it") - } - - // Sets custom image repository configuration from Management Cluster even for workload cluster - // Currently, TKG does not support using different image repositories for management and workload clusters. - if err := c.setCustomImageRepositoryConfiguration(regionalClusterClient); err != nil { - return errors.Wrapf(err, "error while getting custom image repository configuration from cluster and setting it") - } - - if err := c.setNetworkingConfiguration(regionalClusterClient, clusterName, clusterNamespace); err != nil { - return errors.Wrap(err, "error while initializing networking configuration") - } - - return nil -} - -func (c *TkgClient) setProxyConfiguration(clusterClusterClient clusterclient.Client) (retErr error) { - // make sure proxy parameters are non-empty - defer func() { - if retErr == nil { - c.SetDefaultProxySettings() - } - }() - configmap := &corev1.ConfigMap{} - if err := clusterClusterClient.GetResource(configmap, constants.KappControllerConfigMapName, constants.KappControllerNamespace, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - return nil - } - return errors.Wrapf(err, "unable to get object '%v' in namespace '%v'", constants.KappControllerConfigMapName, constants.KappControllerNamespace) - } - - if configmap.Data == nil { - return nil - } - - if httpProxy := configmap.Data["httpProxy"]; httpProxy != "" { - c.TKGConfigReaderWriter().Set(constants.TKGHTTPProxy, httpProxy) - c.TKGConfigReaderWriter().Set(constants.TKGHTTPProxyEnabled, trueString) - } - - if httpsProxy := configmap.Data["httpsProxy"]; httpsProxy != "" { - c.TKGConfigReaderWriter().Set(constants.TKGHTTPSProxy, httpsProxy) - } - - if noProxy := configmap.Data["noProxy"]; noProxy != "" { - c.TKGConfigReaderWriter().Set(constants.TKGNoProxy, noProxy) - } - - return nil -} - -func (c *TkgClient) setCustomImageRepositoryConfiguration(regionalClusterClient clusterclient.Client) error { - configmap := &corev1.ConfigMap{} - if err := regionalClusterClient.GetResource(configmap, constants.TkrConfigMapName, constants.TkgNamespace, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - // read cm from tkr-system namespace if not found in tkg-system - if err := regionalClusterClient.GetResource(configmap, constants.TkrConfigMapName, constants.TkrNamespace, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - return nil - } else { - return errors.Wrapf(err, "unable to get object '%v' in namespace '%v'", constants.TkrConfigMapName, constants.TkrNamespace) - } - } - } else { - return errors.Wrapf(err, "unable to get object '%v' in namespace '%v'", constants.TkrConfigMapName, constants.TkgNamespace) - } - } - - if configmap.Data == nil { - return nil - } - - // Read TKG_CUSTOM_IMAGE_REPOSITORY from configuration first to allow user to provide different image repository during cluster deletion - if customImageRepository, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepository); err != nil || customImageRepository == "" { - if customImageRepository := configmap.Data["imageRepository"]; customImageRepository != "" { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableCustomImageRepository, customImageRepository) - } - } - - // Read TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE from configuration first to allow user to provide different image repository during cluster deletion - if customImageRepositoryCaCertificate, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepositoryCaCertificate); err != nil || customImageRepositoryCaCertificate == "" { - if customImageRepositoryCaCertificate := configmap.Data["caCerts"]; customImageRepositoryCaCertificate != "" { - customImageRepositoryCaCertificateEncoded := base64.StdEncoding.EncodeToString([]byte(customImageRepositoryCaCertificate)) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableCustomImageRepositoryCaCertificate, customImageRepositoryCaCertificateEncoded) - } - } - - return nil -} - -func (c *TkgClient) setNetworkingConfiguration(regionalClusterClient clusterclient.Client, clusterName, clusterNamespace string) error { - cluster := &capi.Cluster{} - err := regionalClusterClient.GetResource(cluster, clusterName, clusterNamespace, nil, nil) - if err != nil { - return errors.Wrapf(err, "unable to get cluster %q from namespace %q", clusterName, clusterNamespace) - } - - if cluster.Spec.ClusterNetwork != nil { - if cluster.Spec.ClusterNetwork.Pods != nil && len(cluster.Spec.ClusterNetwork.Pods.CIDRBlocks) > 0 { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterCIDR, strings.Join(cluster.Spec.ClusterNetwork.Pods.CIDRBlocks, ",")) - } - if cluster.Spec.ClusterNetwork.Services != nil && len(cluster.Spec.ClusterNetwork.Services.CIDRBlocks) > 0 { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableServiceCIDR, strings.Join(cluster.Spec.ClusterNetwork.Services.CIDRBlocks, ",")) - } - ipFamily, err := GetIPFamily(cluster) - if err != nil { - return errors.Wrapf(err, "unable to get IPFamily of %q", clusterName) - } - switch ipFamily { - case IPv4IPFamily: - c.TKGConfigReaderWriter().Set(constants.ConfigVariableIPFamily, constants.IPv4Family) - case IPv6IPFamily: - c.TKGConfigReaderWriter().Set(constants.ConfigVariableIPFamily, constants.IPv6Family) - case DualStackIPFamily: - ip, _, err := net.ParseCIDR(cluster.Spec.ClusterNetwork.Services.CIDRBlocks[0]) - if err != nil { - return fmt.Errorf("unable to detect valid IPFamily, could not parse CIDR: %s", err.Error()) - } - if ip.To4() == nil { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableIPFamily, constants.DualStackPrimaryIPv6Family) - } else { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableIPFamily, constants.DualStackPrimaryIPv4Family) - } - default: - return fmt.Errorf("unable to detect valid IPFamily, found %s", ipFamily) - } - } - - return nil -} - -func (c *TkgClient) addClusterNameLabel(regionalClusterClient clusterclient.Client, options *UpgradeAddonOptions) error { - patchFormat := ` - { - "metadata": { - "labels": { - "tkg.tanzu.vmware.com/cluster-name": "%s" - } - } - }` - patchLabel := fmt.Sprintf(patchFormat, options.ClusterName) - err := regionalClusterClient.PatchClusterObject(options.ClusterName, options.Namespace, patchLabel) - if err != nil { - return errors.Wrap(err, "unable to patch the cluster object with cluster name label") - } - return nil -} diff --git a/tkg/client/upgrade_addon_test.go b/tkg/client/upgrade_addon_test.go deleted file mode 100644 index f4554d83fb..0000000000 --- a/tkg/client/upgrade_addon_test.go +++ /dev/null @@ -1,674 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "encoding/base64" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - - capiv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - "sigs.k8s.io/controller-runtime/pkg/client" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit tests for addons upgrade", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - currentClusterClient *fakes.ClusterClient - tkgClient *TkgClient - upgradeAddonOptions *UpgradeAddonOptions - addonsToBeUpgraded []string - - clusterTemplateBytes []byte - clusterTemplateError error - clusterConfigGetter func(*CreateClusterOptions) ([]byte, error) - - isRegionalCluster bool - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - currentClusterClient = &fakes.ClusterClient{} - tkgClient, err = CreateTKGClient("../fakes/config/config2.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Millisecond) - - upgradeAddonOptions = &UpgradeAddonOptions{ - ClusterName: "test-cluster", - Namespace: constants.DefaultNamespace, - Kubeconfig: "../fakes/config/kubeconfig/config1.yaml", - IsRegionalCluster: isRegionalCluster, - } - }) - - Describe("When upgrading addons", func() { - const ( - clusterName = "regional-cluster-2" - ) - var ( - serviceCIDRs []string - podCIDRs []string - ) - BeforeEach(func() { - serviceCIDRs = []string{"1.2.3.4/16"} - podCIDRs = []string{"2.3.4.5/16"} - - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - setupBomFile("../fakes/config/bom/tkg-bom-v1.3.1.yaml", testingDir) - regionalClusterClient.PatchResourceReturns(nil) - regionalClusterClient.GetKCPObjectForClusterReturns(getDummyKCP(constants.KindDockerMachineTemplate), nil) - currentClusterClient.GetKubernetesVersionReturns(currentK8sVersion, nil) - regionalClusterClient.ListResourcesCalls(func(clusterList interface{}, options ...client.ListOption) error { - if clusterList, ok := clusterList.(*capiv1alpha3.ClusterList); ok { - clusterList.Items = []capiv1alpha3.Cluster{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: clusterName, - Namespace: constants.DefaultNamespace, - }, - }, - } - return nil - } - return nil - }) - - regionalClusterClient.GetResourceCalls(func(cluster interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if cluster, ok := cluster.(*capiv1alpha3.Cluster); ok && resourceName == clusterName && namespace == constants.DefaultNamespace { - cluster.Spec = capiv1alpha3.ClusterSpec{ - ClusterNetwork: &capiv1alpha3.ClusterNetwork{ - Services: &capiv1alpha3.NetworkRanges{ - CIDRBlocks: serviceCIDRs, - }, - Pods: &capiv1alpha3.NetworkRanges{ - CIDRBlocks: podCIDRs, - }, - }, - } - return nil - } - return nil - }) - isRegionalCluster = true - - clusterConfigGetter = func(*CreateClusterOptions) ([]byte, error) { - return clusterTemplateBytes, clusterTemplateError - } - }) - JustBeforeEach(func() { - upgradeAddonOptions.IsRegionalCluster = isRegionalCluster - upgradeAddonOptions.AddonNames = addonsToBeUpgraded - err = tkgClient.DoUpgradeAddon(regionalClusterClient, currentClusterClient, upgradeAddonOptions, clusterConfigGetter) - }) - Context("When unable to patch cluster object with cluster name label", func() { - BeforeEach(func() { - regionalClusterClient.PatchClusterObjectReturns(errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to patch the cluster object with cluster name label")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When unable to get KCP object for cluster", func() { - BeforeEach(func() { - regionalClusterClient.GetKCPObjectForClusterReturns(nil, errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to find control plane node object for cluster")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - - Context("When invalid addon name is passed", func() { - BeforeEach(func() { - addonsToBeUpgraded = []string{"invalid-name"} - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("upgrade of 'invalid-name' component is not supported")) - }) - }) - - Context("When cluster config getter returns error", func() { - BeforeEach(func() { - addonsToBeUpgraded = []string{"metadata/tkg"} - clusterTemplateError = errors.New("fake-error") - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to get cluster configuration")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - - Context("When cluster template apply returns error", func() { - BeforeEach(func() { - addonsToBeUpgraded = []string{"metadata/tkg"} - clusterTemplateError = nil - currentClusterClient.ApplyReturns(errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error while upgrading additional component")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - - Context("When cluster template apply does not return error and upgrade is successful", func() { - BeforeEach(func() { - addonsToBeUpgraded = []string{"metadata/tkg"} - clusterTemplateError = nil - currentClusterClient.ApplyReturns(nil) - }) - It("should not returns an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("When upgrading kapp-controller and it fails to add the last applied annotation", func() { - BeforeEach(func() { - addonsToBeUpgraded = []string{"addons-management/kapp-controller"} - clusterTemplateError = nil - regionalClusterClient.PatchKappControllerLastAppliedAnnotationReturns(errors.New("fake-error")) - }) - It("should not returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to add last-applied annotation on kapp-controller")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - - Context("When upgrading all addons", func() { - BeforeEach(func() { - addonsToBeUpgraded = []string{"metadata/tkg", "addons-management/kapp-controller", "addons-management/tanzu-addons-manager", "tkr/tkr-controller"} - clusterTemplateError = nil - currentClusterClient.ApplyReturns(nil) - regionalClusterClient.ApplyReturns(nil) - }) - It("should not returns an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("When trying to upgrade 'tkr/tkr-controller' on workload cluster", func() { - BeforeEach(func() { - addonsToBeUpgraded = []string{"tkr/tkr-controller"} - clusterTemplateError = nil - isRegionalCluster = false - currentClusterClient.ApplyReturns(nil) - regionalClusterClient.ApplyReturns(nil) - }) - It("should returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("upgrade of 'tkr/tkr-controller' component is only supported on management cluster")) - }) - }) - - Describe("When setting networking configuration", func() { - BeforeEach(func() { - addonsToBeUpgraded = []string{"tkr/tkr-controller"} - }) - When("the cidrs are unset", func() { - It("sets the IPFamily to ipv4", func() { - ipFamily, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableIPFamily) - Expect(err).NotTo(HaveOccurred()) - Expect(ipFamily).To(Equal("ipv4")) - }) - It("sets the cluster CIDR in the TKGConfig", func() { - clusterCIDR, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterCIDR) - Expect(err).NotTo(HaveOccurred()) - Expect(clusterCIDR).To(Equal("2.3.4.5/16")) - }) - It("sets the service CIDR in the TKGConfig", func() { - serviceCIDR, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableServiceCIDR) - Expect(err).NotTo(HaveOccurred()) - Expect(serviceCIDR).To(Equal("1.2.3.4/16")) - }) - }) - When("the cluster is ipv4", func() { - BeforeEach(func() { - serviceCIDRs = []string{"2.3.4.5/16"} - podCIDRs = []string{"1.2.3.4/16"} - }) - It("sets the IPFamily to ipv4", func() { - ipFamily, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableIPFamily) - Expect(err).NotTo(HaveOccurred()) - Expect(ipFamily).To(Equal("ipv4")) - }) - It("sets the serviceCIDRs to be ipv4", func() { - serviceCIDRs, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableServiceCIDR) - Expect(err).NotTo(HaveOccurred()) - Expect(serviceCIDRs).To(Equal("2.3.4.5/16")) - }) - It("sets the podCIDRs to be ipv4", func() { - podCIDRs, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterCIDR) - Expect(err).NotTo(HaveOccurred()) - Expect(podCIDRs).To(Equal("1.2.3.4/16")) - }) - }) - When("the cluster is ipv6", func() { - BeforeEach(func() { - serviceCIDRs = []string{"fd00::/32"} - podCIDRs = []string{"fd01::/32"} - }) - It("sets the IPFamily to ipv6", func() { - ipFamily, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableIPFamily) - Expect(err).NotTo(HaveOccurred()) - Expect(ipFamily).To(Equal("ipv6")) - }) - It("sets the serviceCIDRs to be ipv6", func() { - serviceCIDRs, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableServiceCIDR) - Expect(err).NotTo(HaveOccurred()) - Expect(serviceCIDRs).To(Equal("fd00::/32")) - }) - It("sets the podCIDRs to be ipv6", func() { - podCIDRs, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterCIDR) - Expect(err).NotTo(HaveOccurred()) - Expect(podCIDRs).To(Equal("fd01::/32")) - }) - }) - When("the cluster is dualstack and primary ipv4", func() { - BeforeEach(func() { - serviceCIDRs = []string{"1.2.3.4/16", "fd00::/32"} - podCIDRs = []string{"2.3.4.5/16", "fd01::/32"} - }) - It("sets the IPFamily to ipv4,ipv6", func() { - ipFamily, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableIPFamily) - Expect(err).NotTo(HaveOccurred()) - Expect(ipFamily).To(Equal("ipv4,ipv6")) - }) - It("sets the serviceCIDRs to be ipv4,ipv6", func() { - serviceCIDRs, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableServiceCIDR) - Expect(err).NotTo(HaveOccurred()) - Expect(serviceCIDRs).To(Equal("1.2.3.4/16,fd00::/32")) - }) - It("sets the podCIDRs to be ipv4,ipv6", func() { - podCIDRs, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterCIDR) - Expect(err).NotTo(HaveOccurred()) - Expect(podCIDRs).To(Equal("2.3.4.5/16,fd01::/32")) - }) - }) - When("the cluster is dualstack and primary ipv6", func() { - BeforeEach(func() { - serviceCIDRs = []string{"fd00::/32", "1.2.3.4/16"} - podCIDRs = []string{"fd01::/32", "2.3.4.5/16"} - }) - It("sets the IPFamily to ipv6,ipv4", func() { - ipFamily, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableIPFamily) - Expect(err).NotTo(HaveOccurred()) - Expect(ipFamily).To(Equal("ipv6,ipv4")) - }) - It("sets the serviceCIDRs to be ipv6,ipv4", func() { - serviceCIDRs, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableServiceCIDR) - Expect(err).NotTo(HaveOccurred()) - Expect(serviceCIDRs).To(Equal("fd00::/32,1.2.3.4/16")) - }) - It("sets the podCIDRs to be ipv6,ipv4", func() { - podCIDRs, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterCIDR) - Expect(err).NotTo(HaveOccurred()) - Expect(podCIDRs).To(Equal("fd01::/32,2.3.4.5/16")) - }) - }) - }) - }) -}) - -// Test RetrieveProxySettings tests a previous regression where the proxy settings -// for a workload cluster was being incorrectly inherited from the management cluster. -// Specifically, this test validates retreiving proxy settings for a workload cluster -// with different settings from the management cluster. -var _ = Describe("Test RetrieveProxySettings", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - workloadClusterClient *fakes.ClusterClient - tkgClient *TkgClient - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - workloadClusterClient = &fakes.ClusterClient{} - tkgClient, err = CreateTKGClient("../fakes/config/config2.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Millisecond) - regionalClusterClient.ListResourcesCalls(func(clusterList interface{}, options ...client.ListOption) error { - if clusterList, ok := clusterList.(*capiv1alpha3.ClusterList); ok { - clusterList.Items = []capiv1alpha3.Cluster{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "regional-cluster-2", - Namespace: constants.DefaultNamespace, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "workload-cluster", - Namespace: constants.DefaultNamespace, - }, - }, - } - return nil - } - return nil - }) - }) - - var _ = Describe("RetrieveProxySettings For Management Cluster", func() { - JustBeforeEach(func() { - err = tkgClient.RetrieveRegionalClusterConfiguration(regionalClusterClient) - }) - - Context("When proxy configuration is returned from kapp controller configmap", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceStub = func(obj interface{}, name string, namespace string, verifyFunc clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if name == constants.KappControllerConfigMapName { - cm := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.KappControllerConfigMapName, - Namespace: constants.KappControllerNamespace, - }, - Data: map[string]string{ - "httpProxy": "http://10.0.0.1:8080", - "httpsProxy": "http://10.0.0.1:8080", - "noProxy": "127.0.0.1,foo.com", - }, - } - cm.DeepCopyInto(obj.(*corev1.ConfigMap)) - } - - return nil - } - }) - It("should not return an error and proxy configuration should be configured", func() { - Expect(err).To(BeNil()) - - httpProxy, err := tkgClient.TKGConfigReaderWriter().Get(constants.TKGHTTPProxy) - Expect(httpProxy).To(Equal("http://10.0.0.1:8080")) - Expect(err).To(BeNil()) - httpsProxy, err := tkgClient.TKGConfigReaderWriter().Get(constants.TKGHTTPSProxy) - Expect(httpsProxy).To(Equal("http://10.0.0.1:8080")) - Expect(err).To(BeNil()) - noProxy, err := tkgClient.TKGConfigReaderWriter().Get(constants.TKGNoProxy) - Expect(noProxy).To(Equal("127.0.0.1,foo.com")) - Expect(err).To(BeNil()) - proxyEnabled, err := tkgClient.TKGConfigReaderWriter().Get(constants.TKGHTTPProxyEnabled) - Expect(proxyEnabled).To(Equal("true")) - Expect(err).To(BeNil()) - }) - }) - }) - - var _ = Describe("RetrieveProxySettings For Workload Cluster", func() { - JustBeforeEach(func() { - err = tkgClient.RetrieveWorkloadClusterConfiguration(regionalClusterClient, workloadClusterClient, "workload-cluster", constants.DefaultNamespace) - }) - - Context("When proxy configuration is returned from kapp controller configmap", func() { - BeforeEach(func() { - workloadClusterClient.GetResourceStub = func(obj interface{}, name string, namespace string, verifyFunc clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if name == constants.KappControllerConfigMapName { - cm := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.KappControllerConfigMapName, - Namespace: constants.KappControllerNamespace, - }, - Data: map[string]string{ - "httpProxy": "http://10.0.0.1:8081", - "httpsProxy": "http://10.0.0.1:8081", - "noProxy": "127.0.0.1,bar.com", - }, - } - cm.DeepCopyInto(obj.(*corev1.ConfigMap)) - } - - return nil - } - }) - It("should not return an error and proxy configuration should be configured", func() { - Expect(err).To(BeNil()) - - httpProxy, err := tkgClient.TKGConfigReaderWriter().Get(constants.TKGHTTPProxy) - Expect(httpProxy).To(Equal("http://10.0.0.1:8081")) - Expect(err).To(BeNil()) - httpsProxy, err := tkgClient.TKGConfigReaderWriter().Get(constants.TKGHTTPSProxy) - Expect(httpsProxy).To(Equal("http://10.0.0.1:8081")) - Expect(err).To(BeNil()) - noProxy, err := tkgClient.TKGConfigReaderWriter().Get(constants.TKGNoProxy) - Expect(noProxy).To(Equal("127.0.0.1,bar.com")) - Expect(err).To(BeNil()) - proxyEnabled, err := tkgClient.TKGConfigReaderWriter().Get(constants.TKGHTTPProxyEnabled) - Expect(proxyEnabled).To(Equal("true")) - Expect(err).To(BeNil()) - }) - }) - - Context("When proxy configuration is not returned from kapp controller configmap", func() { - BeforeEach(func() { - workloadClusterClient.GetResourceStub = func(obj interface{}, name string, namespace string, verifyFunc clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if name == constants.KappControllerConfigMapName { - cm := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.KappControllerConfigMapName, - Namespace: constants.KappControllerNamespace, - }, - Data: map[string]string{}, - } - cm.DeepCopyInto(obj.(*corev1.ConfigMap)) - } - - return nil - } - }) - It("should not return an error and proxy configuration should be empty", func() { - Expect(err).To(BeNil()) - - httpProxy, err := tkgClient.TKGConfigReaderWriter().Get(constants.TKGHTTPProxy) - Expect(httpProxy).To(Equal("")) - Expect(err).To(BeNil()) - httpsProxy, err := tkgClient.TKGConfigReaderWriter().Get(constants.TKGHTTPSProxy) - Expect(httpsProxy).To(Equal("")) - Expect(err).To(BeNil()) - noProxy, err := tkgClient.TKGConfigReaderWriter().Get(constants.TKGNoProxy) - Expect(noProxy).To(Equal("")) - Expect(err).To(BeNil()) - proxyEnabled, _ := tkgClient.TKGConfigReaderWriter().Get(constants.TKGHTTPProxyEnabled) - Expect(proxyEnabled).NotTo(Equal("true")) - }) - }) - }) -}) - -var _ = Describe("Test Retrieve CustomImageRepositoryConfiguration", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - workloadClusterClient *fakes.ClusterClient - tkgClient *TkgClient - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - workloadClusterClient = &fakes.ClusterClient{} - tkgClient, err = CreateTKGClient("../fakes/config/config2.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Millisecond) - regionalClusterClient.ListResourcesCalls(func(clusterList interface{}, options ...client.ListOption) error { - if clusterList, ok := clusterList.(*capiv1alpha3.ClusterList); ok { - clusterList.Items = []capiv1alpha3.Cluster{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "regional-cluster-2", - Namespace: constants.DefaultNamespace, - }, - }, - { - ObjectMeta: metav1.ObjectMeta{ - Name: "workload-cluster", - Namespace: constants.DefaultNamespace, - }, - }, - } - return nil - } - return nil - }) - }) - - var _ = Describe("Retrieve CustomImageRepositoryConfiguration For Management Cluster", func() { - JustBeforeEach(func() { - err = tkgClient.RetrieveRegionalClusterConfiguration(regionalClusterClient) - }) - - Context("When tkr-controller-config cm exists in tkg-system only", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceStub = func(obj interface{}, name string, namespace string, verifyFunc clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if name == constants.TkrConfigMapName { - if namespace == constants.TkgNamespace { - cm := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.TkrConfigMapName, - Namespace: constants.TkgNamespace, - }, - Data: map[string]string{ - "imageRepository": "fake-repo-1", - "caCerts": "fake-ca-1", - }, - } - cm.DeepCopyInto(obj.(*corev1.ConfigMap)) - return nil - } - - return apierrors.NewNotFound(schema.GroupResource{}, "") - } - return nil - } - }) - It("should not return an error and image repo configs should be configured", func() { - Expect(err).To(BeNil()) - - imageRepo, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepository) - Expect(imageRepo).To(Equal("fake-repo-1")) - Expect(err).To(BeNil()) - caCerts, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepositoryCaCertificate) - Expect(caCerts).To(Equal(base64.StdEncoding.EncodeToString([]byte("fake-ca-1")))) - Expect(err).To(BeNil()) - }) - }) - - Context("When tkr-controller-config cm exists in tkr-system only", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceStub = func(obj interface{}, name string, namespace string, verifyFunc clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if name == constants.TkrConfigMapName { - if namespace == constants.TkrNamespace { - cm := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.TkrConfigMapName, - Namespace: constants.TkrNamespace, - }, - Data: map[string]string{ - "imageRepository": "fake-repo-1", - "caCerts": "fake-ca-1", - }, - } - cm.DeepCopyInto(obj.(*corev1.ConfigMap)) - return nil - } - return apierrors.NewNotFound(schema.GroupResource{}, "") - } - return nil - } - }) - It("should not return an error and image repo configs should be configured", func() { - Expect(err).To(BeNil()) - - imageRepo, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepository) - Expect(imageRepo).To(Equal("fake-repo-1")) - Expect(err).To(BeNil()) - caCerts, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepositoryCaCertificate) - Expect(caCerts).To(Equal(base64.StdEncoding.EncodeToString([]byte("fake-ca-1")))) - Expect(err).To(BeNil()) - }) - }) - - Context("When tkr-controller-config cm exists in both tkg-system and tkr-system namespace", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceStub = func(obj interface{}, name string, namespace string, verifyFunc clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if name == constants.TkrConfigMapName { - if namespace == constants.TkrNamespace { - cm := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.TkrConfigMapName, - Namespace: constants.TkrNamespace, - }, - Data: map[string]string{ - "imageRepository": "fake-repo-1", - "caCerts": "fake-ca-1", - }, - } - cm.DeepCopyInto(obj.(*corev1.ConfigMap)) - return nil - } - - if namespace == constants.TkgNamespace { - cm := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: constants.TkrConfigMapName, - Namespace: constants.TkgNamespace, - }, - Data: map[string]string{ - "imageRepository": "fake-repo-2", - "caCerts": "fake-ca-2", - }, - } - cm.DeepCopyInto(obj.(*corev1.ConfigMap)) - return nil - } - - return apierrors.NewNotFound(schema.GroupResource{}, "") - } - return nil - } - }) - It("should not return an error and image repo configs should be configured from cm in tkg-system ns", func() { - Expect(err).To(BeNil()) - - imageRepo, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepository) - Expect(imageRepo).To(Equal("fake-repo-2")) - Expect(err).To(BeNil()) - caCerts, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepositoryCaCertificate) - Expect(caCerts).To(Equal(base64.StdEncoding.EncodeToString([]byte("fake-ca-2")))) - Expect(err).To(BeNil()) - }) - }) - - Context("When tkr-controller-config cm not exists", func() { - BeforeEach(func() { - workloadClusterClient.GetResourceStub = func(obj interface{}, name string, namespace string, verifyFunc clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if name == constants.TkrConfigMapName { - return apierrors.NewNotFound(schema.GroupResource{}, "") - } - return nil - } - }) - It("should not return an error and proxy configuration should be empty", func() { - Expect(err).To(BeNil()) - - imageRepo, _ := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepository) - Expect(imageRepo).To(Equal("")) - caCerts, _ := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepositoryCaCertificate) - Expect(caCerts).To(Equal("")) - }) - }) - }) -}) diff --git a/tkg/client/upgrade_cluster.go b/tkg/client/upgrade_cluster.go deleted file mode 100644 index 91dbe28a5c..0000000000 --- a/tkg/client/upgrade_cluster.go +++ /dev/null @@ -1,1505 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "encoding/json" - "fmt" - "strings" - "time" - - "github.com/pkg/errors" - "golang.org/x/mod/semver" - "k8s.io/apimachinery/pkg/types" - capav1beta2 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" - capzv1beta1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capiv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - capikubeadmv1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - capdv1beta1 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfighelper" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -const ( - upgradePatchInterval = 30 * time.Second - upgradePatchTimeout = 5 * time.Minute - vmTemplateMoidKey = "vmTemplateMoid" - DefaultKappControllerHostPort = 10100 - DefaultAddonsManagerHostPort = 9865 -) - -// UpgradeClusterOptions upgrade cluster options -type UpgradeClusterOptions struct { - ClusterName string - Namespace string - KubernetesVersion string - TkrVersion string - Kubeconfig string - VSphereTemplateName string - OSName string - OSVersion string - OSArch string - IsRegionalCluster bool - SkipAddonUpgrade bool - SkipPrompt bool - IsTKGSCluster bool - // Tanzu edition (either tce or tkg) - Edition string -} - -type mdInfastructureTemplateInfo struct { - MDInfrastructureTemplateName string - MDInfrastructureTemplateNamespace string -} - -// ComponentInfo defines cluster component related metadata used for upgrade -type ComponentInfo struct { - TkrVersion string - KubernetesVersion string - ImageRepository string - CoreDNSImageRepository string - CoreDNSImageTag string - EtcdDataDir string - EtcdImageRepository string - EtcdImageTag string - EtcdExtraArgs map[string]string - KCPInfrastructureTemplateName string - KCPInfrastructureTemplateNamespace string - MDInfastructureTemplates map[string]mdInfastructureTemplateInfo - VSphereVMTemplateName string - VSphereVMTemplateMOID string - AwsAMIID string - CAPDImageName string - CAPDImageRepo string - AwsRegionToAMIMap map[string][]tkgconfigbom.AMIInfo - AzureImage tkgconfigbom.AzureInfo - OsInfo tkgconfigbom.OSInfo - KubeVipFullImagePath string - KubeVipTag string -} - -type upgradeStatus string - -const ( - upgradeStateInitiated = "Initiated" - upgradeStateInfraTemplatesCreated = "InfraTemplatesCreated" - upgradeStateKCPPatchApplied = "KCPPatchApplied" - upgradeStateKCPUpgraded = "KCPUpgraded" - upgradeStateMDPatchApplied = "MDPatchApplied" - upgradeStateSuccess = "Success" -) - -// ClusterUpgradeInfo defines cluster upgrade metadata used during upgrade process -type ClusterUpgradeInfo struct { - UpgradeComponentInfo ComponentInfo - ActualComponentInfo ComponentInfo - - KCPObjectName string - KCPObjectNamespace string - MDObjects []capi.MachineDeployment - ClusterName string - ClusterNamespace string - - UpgradeState upgradeStatus -} - -// UpgradeCluster upgrades workload and management clusters k8s version -// Steps: -// 1. Verify k8s version -// 2. Get the Upgrade configuration by reading BOM file to get the ImageTag and ImageRepository information for CoreDNS and Etcd, -// Read AWS_AMI_ID map from BOM for AWS upgrade scenario. Also use command line argument options to fill the upgrade configuration -// 3. Create InfrastructureMachineTemplates(VSphereMachineTemplate, AWSMachineTemplate, AzureMachineTemplate) required for upgrade -// 4. Patch KCP object to upgrade control-plane nodes -// 5. Wait for k8s version to be updated for the cluster -// 6. Patch MachineDeployment object to upgrade worker nodes -// 7. Wait for k8s version to be updated for all worker nodes -func (c *TkgClient) UpgradeCluster(options *UpgradeClusterOptions) error { - if options == nil { - return errors.New("invalid upgrade cluster options nil") - } - - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return errors.Wrap(err, "cannot get current management cluster context") - } - options.Kubeconfig = currentRegion.SourceFilePath - - log.V(4).Info("Creating management cluster client...") - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclient.Options{OperationTimeout: c.timeout}) - if err != nil { - return errors.Wrap(err, "unable to get cluster client while upgrading cluster") - } - - // get the management cluster name and namespace in case of management cluster upgrade - if options.IsRegionalCluster { - clusterName, namespace, err := c.getRegionalClusterNameAndNamespace(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "unable to get current management cluster information") - } - options.ClusterName = clusterName - options.Namespace = namespace - } - - if options.Namespace == "" { - options.Namespace = constants.DefaultNamespace - } - - // Check if Cluster is ClusterClass based cluster or not - isClusterClassBased, err := regionalClusterClient.IsClusterClassBased(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrap(err, "unable to determine cluster type") - } - - // If this is TKGS cluster and using TKC API then upgrade using legacy TKC based approach - if options.IsTKGSCluster && !isClusterClassBased { - return c.DoPacificClusterUpgrade(regionalClusterClient, options) - } - - var currentClusterClient clusterclient.Client - if options.IsRegionalCluster { - currentClusterClient = regionalClusterClient - } else if !options.IsTKGSCluster { - log.V(4).Info("Creating workload cluster client...") - currentClusterClient, err = c.getWorkloadClusterClient(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrap(err, "unable to get workload cluster client") - } - } - - // If cluster is ClusterClass based cluster upgrade the cluster with different path - if isClusterClassBased { - return c.DoClassyClusterUpgrade(regionalClusterClient, currentClusterClient, options) - } - - log.Warning(constants.YTTBasedClusterWarning) - return c.DoLegacyClusterUpgrade(regionalClusterClient, currentClusterClient, options) -} - -func (c *TkgClient) DoLegacyClusterUpgrade(regionalClusterClient, currentClusterClient clusterclient.Client, options *UpgradeClusterOptions) error { - log.Info("Verifying kubernetes version...") - err := c.verifyK8sVersion(currentClusterClient, options.KubernetesVersion) - if err != nil { - return errors.Wrap(err, "kubernetes version verification failed") - } - - err = c.addKubernetesReleaseLabel(regionalClusterClient, options) - if err != nil { - return errors.Wrapf(err, "unable to patch the cluster object with TanzuKubernetesRelease label") - } - - // Upgrade/Add certain addons on old clusters during upgrade - // The addons should upgrade prior to cluster upgrade to account for forward compatibility - // i.e. some old addons may not run on the nodes with new k8s version - // We will ensure backward compatibility when shipping packages going forward - // With cluster class approach addons will be upgraded as part of management package upgrade - // and we do not need to upgrade addons with below function - if !options.SkipAddonUpgrade && !config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - err = c.upgradeAddonPreNodeUpgrade(regionalClusterClient, currentClusterClient, options.ClusterName, options.Namespace, options.IsRegionalCluster, options.Edition) - if err != nil { - return err - } - } - - err = c.DoClusterUpgrade(regionalClusterClient, currentClusterClient, options) - if err != nil { - return err - } - - // Upgrade addon metadata configmaps after the nodes are upgraded - if !options.SkipAddonUpgrade && !config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - err = c.upgradeAddonPostNodeUpgrade(regionalClusterClient, currentClusterClient, options.ClusterName, options.Namespace, options.IsRegionalCluster, options.Edition) - if err != nil { - return err - } - } - - if !options.IsRegionalCluster { - // update autoscaler deployment if enabled - err = regionalClusterClient.ApplyPatchForAutoScalerDeployment(c.tkgBomClient, options.ClusterName, options.KubernetesVersion, options.Namespace) - if err != nil { - return errors.Wrapf(err, "failed to upgrade autoscaler for cluster '%s'", options.ClusterName) - } - } - - if options.IsRegionalCluster { - if !config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - log.Info("Waiting for additional components to be up and running...") - if err := c.WaitForAddonsDeployments(regionalClusterClient); err != nil { - return err - } - } - } - - log.Info("Waiting for packages to be up and running...") - if err := c.WaitForPackages(regionalClusterClient, currentClusterClient, options.ClusterName, options.Namespace, options.IsRegionalCluster); err != nil { - log.Warningf("Warning: Cluster is upgraded successfully, but some packages are failing. %v", err) - } - - return nil -} - -// DoPacificClusterUpgrade perform TKGS cluster upgrade -func (c *TkgClient) DoPacificClusterUpgrade(regionalClusterClient clusterclient.Client, options *UpgradeClusterOptions) error { - if options.IsRegionalCluster { - return errors.New("upgrading kubernetes on 'Tanzu Kubernetes Cluster service for vSphere' management cluster is not yet supported") - } - log.Infof("Patching TanzuKubernetesCluster object with the kubernetes version %s...", options.KubernetesVersion) - if err := regionalClusterClient.PatchK8SVersionToPacificCluster(options.ClusterName, options.Namespace, options.KubernetesVersion); err != nil { - return errors.Wrap(err, "failed to update the Kubernetes version for TanzuKubernetesCluster object") - } - log.Info("Waiting for the 'Tanzu Kubernetes Cluster service for vSphere' cluster kubernetes version update and it may take a while...") - if err := regionalClusterClient.WaitForPacificClusterK8sVersionUpdate(options.ClusterName, options.Namespace, options.KubernetesVersion); err != nil { - return errors.Wrap(err, "failed waiting on updating kubernetes version for 'Tanzu Kubernetes Cluster service for vSphere' cluster") - } - - return nil -} - -// DoClusterUpgrade upgrades cluster -func (c *TkgClient) DoClusterUpgrade(regionalClusterClient clusterclient.Client, - currentClusterClient clusterclient.Client, options *UpgradeClusterOptions) error { - - if err := c.configureOSOptionsForUpgrade(regionalClusterClient, options); err != nil { - return errors.Wrap(err, "error configuring os options during upgrade") - } - - log.Info("Retrieving configuration for upgrade cluster...") - upgradeClusterConfig, err := c.getUpgradeClusterConfig(options) - if err != nil { - return errors.Wrap(err, "unable to retrieve component upgrade info") - } - - upgradeClusterConfig.UpgradeState = upgradeStateInitiated - - log.Info("Create InfrastructureTemplate for upgrade...") - err = c.createInfrastructureTemplateForUpgrade(regionalClusterClient, upgradeClusterConfig) - if err != nil { - return errors.Wrap(err, "unable to create infrastructure template for upgrade") - } - upgradeClusterConfig.UpgradeState = upgradeStateInfraTemplatesCreated - - err = c.applyPatchAndWait(regionalClusterClient, currentClusterClient, upgradeClusterConfig) - if err != nil { - return err - } - - // osInfo annotation format: "ubuntu,20.04,amd64" - osInfoString := fmt.Sprintf("%s,%s,%s", upgradeClusterConfig.UpgradeComponentInfo.OsInfo.Name, upgradeClusterConfig.UpgradeComponentInfo.OsInfo.Version, upgradeClusterConfig.UpgradeComponentInfo.OsInfo.Arch) - err = regionalClusterClient.PatchClusterObjectAnnotations(upgradeClusterConfig.ClusterName, upgradeClusterConfig.ClusterNamespace, "osInfo", osInfoString) - if err != nil { - return errors.Wrap(err, "error while patching osInfo to the cluster resource") - } - - return nil -} - -func (c *TkgClient) addKubernetesReleaseLabel(regionalClusterClient clusterclient.Client, options *UpgradeClusterOptions) error { - patchFormat := ` - { - "metadata": { - "labels": { - "tanzuKubernetesRelease": "%s" - } - } - }` - patchLabel := fmt.Sprintf(patchFormat, utils.GetTkrNameFromTkrVersion(options.TkrVersion)) - pollOptions := clusterclient.PollOptions{Interval: upgradePatchInterval, Timeout: upgradePatchTimeout} - err := regionalClusterClient.PatchClusterObjectWithPollOptions(options.ClusterName, options.Namespace, patchLabel, &pollOptions) - if err != nil { - return errors.Wrap(err, "unable to patch the cluster object with TanzuKubernetesRelease label") - } - return nil -} - -// upgradeAddonPreNodeUpgrade upgrades kapp-controller, addons-manager, tkr-controller and core packageRepository -// before control plane nodes and worker nodes are bumped to new K8S version, to take care of forward compatibility -func (c *TkgClient) upgradeAddonPreNodeUpgrade(regionalClusterClient clusterclient.Client, currentClusterClient clusterclient.Client, - clusterName string, clusterNamespace string, isRegionalCluster bool, tanzuEdition string) error { - - addonsToBeUpgraded := []string{ - "addons-management/kapp-controller", - } - // tanzu-addons-manager and tkr-controller only runs in management cluster - if isRegionalCluster { - addonsToBeUpgraded = append(addonsToBeUpgraded, - "addons-management/tanzu-addons-manager", - "tkr/tkr-controller", - "addons-management/core-package-repo", - "capabilities/capabilities-controller", - "packages/management-package-repo", - "packages/management-package") - } - upgradeClusterMetadataOptions := &UpgradeAddonOptions{ - AddonNames: addonsToBeUpgraded, - ClusterName: clusterName, - Namespace: clusterNamespace, - IsRegionalCluster: isRegionalCluster, - Edition: tanzuEdition, - } - - err := c.DoUpgradeAddon(regionalClusterClient, currentClusterClient, upgradeClusterMetadataOptions, c.GetClusterConfiguration) - if err != nil { - return errors.Wrap(err, "failed to update additional addon components") - } - - return nil -} - -// upgradeAddonPostNodeUpgrade upgrades metadata configmaps and core packageRepository after node upgrade -func (c *TkgClient) upgradeAddonPostNodeUpgrade(regionalClusterClient clusterclient.Client, currentClusterClient clusterclient.Client, - clusterName string, clusterNamespace string, isRegionalCluster bool, tanzuEdition string) error { - - addonsToBeUpgraded := []string{ - "metadata/tkg", - } - if tanzuEdition != "tce" { - addonsToBeUpgraded = append(addonsToBeUpgraded, "addons-management/standard-package-repo") - } - upgradeClusterMetadataOptions := &UpgradeAddonOptions{ - AddonNames: addonsToBeUpgraded, - ClusterName: clusterName, - Namespace: clusterNamespace, - IsRegionalCluster: isRegionalCluster, - Edition: tanzuEdition, - } - - err := c.DoUpgradeAddon(regionalClusterClient, currentClusterClient, upgradeClusterMetadataOptions, c.GetClusterConfiguration) - if err != nil { - return errors.Wrap(err, "failed to update metadata configmaps after kubernetes upgrade") - } - - return nil -} - -func (c *TkgClient) applyPatchAndWait(regionalClusterClient, currentClusterClient clusterclient.Client, upgradeClusterConfig *ClusterUpgradeInfo) error { - var err error - kubernetesVersion := upgradeClusterConfig.UpgradeComponentInfo.KubernetesVersion - - // Clusters deployed with TKG CLI version prior to v1.2 uses `beta.kubernetes.io/os: linux` nodeSelector - // for `calico-node` daemonset and `calico-kube-controller` deployment. - // As k8s v1.19.x removed the support for `beta.kubernetes.io/os: linux` node label and it requires nodes - // to have `kubernetes.io/os: linux` label, we need to patch `calico-node` daemonset's and - // `calico-kube-controller` deployment's nodeSelector to use new `kubernetes.io/os: linux` - // Reference: https://github.com/kubernetes/kubernetes/commit/54c0f8b677d0b82258f3b4df6d325cc3c0011661 - if err := currentClusterClient.PatchCalicoNodeDaemonSetWithNewNodeSelector("kubernetes.io/os", "linux"); err != nil { - return errors.Wrap(err, "unable to patch 'calico-node' daemonset") - } - if err := currentClusterClient.PatchCalicoKubeControllerDeploymentWithNewNodeSelector("kubernetes.io/os", "linux"); err != nil { - return errors.Wrap(err, "unable to patch 'calico-node' daemonset") - } - - // If user is using custom image repository, update the CoreDNS imageRepository - // in kubeadm-config ConfigMap before starting control-plane upgrade - // IMPORTANT: This change is needed to fix the clusters created with v1.0.x and v1.1.x in air-gapped case, where - // as container images are available inside node, we did not used custom image repository for KCP which user provided, - // And as 'registry.tkg.vmware.run' is not reachable in air-gapped case during upgrade, we are making this patch - // before we start actual upgrade process so coredns container image is pullable across nodes. - if tkgconfighelper.IsCustomRepository(upgradeClusterConfig.UpgradeComponentInfo.ImageRepository) && !tkgconfighelper.SkipImageReferenceUpdateOnUpgrade() { - log.Info("Configuring cluster for upgrade...") - log.V(3).Info("Updating coreDNS imageRepository in kubeadm-config ConfigMap...") - if err = currentClusterClient.PatchCoreDNSImageRepositoryInKubeadmConfigMap(upgradeClusterConfig.UpgradeComponentInfo.ImageRepository); err != nil { - return errors.Wrap(err, "unable to update the kubeadm configmap with new image repository") - } - } - - // Upgrade logic for kapp-controller related changes - if err := c.handleKappControllerUpgrade(regionalClusterClient, currentClusterClient, upgradeClusterConfig); err != nil { - return errors.Wrapf(err, "unable to apply upgrade for kapp-controller") - } - - log.Info("Upgrading control plane nodes...") - log.Infof("Patching KubeadmControlPlane with the kubernetes version %s...", kubernetesVersion) - err = c.PatchKubernetesVersionToKubeadmControlPlane(regionalClusterClient, upgradeClusterConfig) - if err != nil { - return errors.Wrap(err, "unable to patch kubernetes version to kubeadm control plane") - } - upgradeClusterConfig.UpgradeState = upgradeStateKCPPatchApplied - - // If user is using custom image repository, update the kube-proxy imageRepository - // in kube-proxy daemonset after starting control-plane upgrade - // Note: kube-proxy daemonset update is done after we patch KCP object because CAPI control-plane controller - // during reconciliation updates kube-proxy daemonset's imageRepository from KCP.Spec.ClusterConfiguration.ImageRepository - // if the upgrade process is not started, this will override the kube-proxy daemonset update if done before KCP patch - // IMPORTANT: This change is needed to fix the clusters created with v1.0.x and v1.1.x in air-gapped case, where - // as container images are available inside node, we did not used custom image repository for KCP which user provided, - // And as 'registry.tkg.vmware.run' is not reachable in air-gapped case during upgrade, we are making this patch - // before we start actual upgrade process so kubeproxy container image is pullable across nodes. - if tkgconfighelper.IsCustomRepository(upgradeClusterConfig.UpgradeComponentInfo.ImageRepository) && !tkgconfighelper.SkipImageReferenceUpdateOnUpgrade() { - log.V(3).Info("Updating imageRepository for kube-proxy daemonset...") - if err := currentClusterClient.PatchImageRepositoryInKubeProxyDaemonSet(upgradeClusterConfig.UpgradeComponentInfo.ImageRepository); err != nil { - return errors.Wrap(err, "unable to update the kube-proxy daemonset with new image repository") - } - } - - log.Info("Waiting for kubernetes version to be updated for control plane nodes") - err = regionalClusterClient.WaitK8sVersionUpdateForCPNodes(upgradeClusterConfig.ClusterName, upgradeClusterConfig.ClusterNamespace, kubernetesVersion, currentClusterClient) - if err != nil { - return errors.Wrap(err, "error waiting for kubernetes version update for kubeadm control plane") - } - upgradeClusterConfig.UpgradeState = upgradeStateKCPUpgraded - - log.Info("Upgrading worker nodes...") - log.Infof("Patching MachineDeployment with the kubernetes version %s...", kubernetesVersion) - err = c.patchKubernetesVersionToMachineDeployment(regionalClusterClient, upgradeClusterConfig) - if err != nil { - return errors.Wrap(err, "unable to patch kubernetes version to kubeadm control plane") - } - upgradeClusterConfig.UpgradeState = upgradeStateMDPatchApplied - - log.Info("Waiting for kubernetes version to be updated for worker nodes...") - err = regionalClusterClient.WaitK8sVersionUpdateForWorkerNodes(upgradeClusterConfig.ClusterName, upgradeClusterConfig.ClusterNamespace, kubernetesVersion, currentClusterClient) - if err != nil { - return errors.Wrap(err, "error waiting for kubernetes version update for worker nodes") - } - - upgradeClusterConfig.UpgradeState = upgradeStateSuccess - return nil -} - -func (c *TkgClient) getUpgradeClusterConfig(options *UpgradeClusterOptions) (*ClusterUpgradeInfo, error) { - bomConfiguration, err := c.tkgBomClient.GetBOMConfigurationFromTkrVersion(options.TkrVersion) - if err != nil { - return nil, errors.Wrap(err, "unable to read in configuration from BOM file") - } - - if tkgconfighelper.IsCustomRepository(bomConfiguration.ImageConfig.ImageRepository) { - log.Infof("Using custom image repository: %s", bomConfiguration.ImageConfig.ImageRepository) - } - - upgradeInfo := &ClusterUpgradeInfo{} - upgradeInfo.UpgradeComponentInfo.TkrVersion = bomConfiguration.Release.Version - upgradeInfo.UpgradeComponentInfo.KubernetesVersion = bomConfiguration.KubeadmConfigSpec.KubernetesVersion - upgradeInfo.UpgradeComponentInfo.CoreDNSImageTag = bomConfiguration.KubeadmConfigSpec.DNS.ImageTag - upgradeInfo.UpgradeComponentInfo.EtcdDataDir = bomConfiguration.KubeadmConfigSpec.Etcd.Local.DataDir - upgradeInfo.UpgradeComponentInfo.EtcdImageTag = bomConfiguration.KubeadmConfigSpec.Etcd.Local.ImageTag - upgradeInfo.UpgradeComponentInfo.EtcdExtraArgs = bomConfiguration.KubeadmConfigSpec.Etcd.Local.ExtraArgs - - upgradeInfo.ClusterName = options.ClusterName - upgradeInfo.ClusterNamespace = options.Namespace - - upgradeInfo.UpgradeComponentInfo.AwsRegionToAMIMap = bomConfiguration.AMI - upgradeInfo.UpgradeComponentInfo.VSphereVMTemplateName = options.VSphereTemplateName - - // get the Azure VM image info from TKG config if available and fall back to the image info from BOM if not available in TKG config file - azureVMImage, err := c.tkgConfigProvidersClient.GetAzureVMImageInfo(upgradeInfo.UpgradeComponentInfo.TkrVersion) - if err == nil && azureVMImage != nil { - // TODO: what if error is returned or azureVMImage is nil, handle that case - upgradeInfo.UpgradeComponentInfo.AzureImage = *azureVMImage - upgradeInfo.UpgradeComponentInfo.OsInfo = azureVMImage.OSInfo - } - - // get kube-vip image from bom - if com, ok := bomConfiguration.Components["kube-vip"]; ok { - if len(com) >= 1 { - if img, ok := com[0].Images["kubeVipImage"]; ok { - upgradeInfo.UpgradeComponentInfo.KubeVipTag = img.Tag - upgradeInfo.UpgradeComponentInfo.KubeVipFullImagePath = bomConfiguration.ImageConfig.ImageRepository + "/" + img.ImagePath - } else { - log.Warning("not able to find kube-vip image tag image from bom bom kubeVipImage") - } - } else { - log.Warning("not able to find kube-vip from bom components list") - } - } - - // We are hard-coding the assumption that during upgrade imageConfig.ImageRepository should take precedence - // over whatever is spelled out in the KubeAdmConfigSpec section. - // This change also implies when imageConfig.ImageRepository differs from kubeadmConfigSpec's repository, - // we will end up pulling container images from imageConfig.ImageRepository despite the same images - // associated with the latter are in possibly in the node already. - // Testcase: When doing management cluster upgrade, it was observed that once the KCP upgrade is complete and - // before the new worker nodes are up, old worker nodes are trying to pull new coredns and kubeproxy images from - // `projects.registry.vmware.com/tkg` registry and as during dev cycle, we do not publish container images to this - // repository but rather we publish it to our staging registry, it is important for us to use staging registry for - // KCP patch during cluster upgrade workflow. - upgradeInfo.UpgradeComponentInfo.ImageRepository = bomConfiguration.ImageConfig.ImageRepository - upgradeInfo.UpgradeComponentInfo.CoreDNSImageRepository = bomConfiguration.ImageConfig.ImageRepository - upgradeInfo.UpgradeComponentInfo.EtcdImageRepository = bomConfiguration.ImageConfig.ImageRepository - if bomConfiguration.ImageConfig.ImageRepository != bomConfiguration.KubeadmConfigSpec.ImageRepository { - log.V(3).Infof("Using %s registry during the upgrade process...", bomConfiguration.ImageConfig.ImageRepository) - } - - return upgradeInfo, nil -} - -// Updating VM_TEMPLATE/AWS_AMI_ID in existing template will not help as it is passed as reference and controllers will not get reconciled unless the name -// of the InfrastructureMachineTemplate is changed under KCP.Spec.InfrastructureTemplate and MD.Spec.Template.Spec.infrastructureRef -// Because of the above reason we need to create new InfrastructureTemplates and update the reference in KCP and MD object of existing cluster -func (c *TkgClient) createInfrastructureTemplateForUpgrade(regionalClusterClient clusterclient.Client, clusterUpgradeConfig *ClusterUpgradeInfo) error { - var err error - - kcp, err := regionalClusterClient.GetKCPObjectForCluster(clusterUpgradeConfig.ClusterName, clusterUpgradeConfig.ClusterNamespace) - if err != nil { - return errors.Wrapf(err, "unable to find control plane node object for cluster %s", clusterUpgradeConfig.ClusterName) - } - - machineDeploymentObjects, err := regionalClusterClient.GetMDObjectForCluster(clusterUpgradeConfig.ClusterName, clusterUpgradeConfig.ClusterNamespace) - if err != nil { - return errors.Wrapf(err, "unable to get MachineDeployment for cluster with name %s in namespace %s", clusterUpgradeConfig.ClusterName, clusterUpgradeConfig.ClusterNamespace) - } - - clusterUpgradeConfig.KCPObjectName = kcp.Name - clusterUpgradeConfig.KCPObjectNamespace = kcp.Namespace - - clusterUpgradeConfig.ActualComponentInfo.KubernetesVersion = kcp.Spec.Version - clusterUpgradeConfig.ActualComponentInfo.ImageRepository = kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.ImageRepository - clusterUpgradeConfig.ActualComponentInfo.CoreDNSImageRepository = kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.DNS.ImageRepository - clusterUpgradeConfig.ActualComponentInfo.CoreDNSImageTag = kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.DNS.ImageTag - clusterUpgradeConfig.ActualComponentInfo.EtcdDataDir = kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local.DataDir - clusterUpgradeConfig.ActualComponentInfo.EtcdImageRepository = kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local.ImageRepository - clusterUpgradeConfig.ActualComponentInfo.EtcdImageTag = kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local.ImageTag - clusterUpgradeConfig.ActualComponentInfo.EtcdExtraArgs = kcp.Spec.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local.ExtraArgs - - if kcp.Spec.MachineTemplate.InfrastructureRef.Kind == constants.KindVSphereMachineTemplate { - if c.IsKubevipManifestInKCP(kcp) { - image, tag, err := c.GetKubevipImageAndTag(kcp) - if err != nil { - return errors.Wrapf(err, "unable to extract kube-vip image") - } - clusterUpgradeConfig.ActualComponentInfo.KubeVipFullImagePath = image - clusterUpgradeConfig.ActualComponentInfo.KubeVipTag = tag - } - } - - clusterUpgradeConfig.ActualComponentInfo.KCPInfrastructureTemplateName = kcp.Spec.MachineTemplate.InfrastructureRef.Name - clusterUpgradeConfig.ActualComponentInfo.KCPInfrastructureTemplateNamespace = kcp.Spec.MachineTemplate.InfrastructureRef.Namespace - - clusterUpgradeConfig.MDObjects = machineDeploymentObjects - clusterUpgradeConfig.ActualComponentInfo.MDInfastructureTemplates = make(map[string]mdInfastructureTemplateInfo) - clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates = make(map[string]mdInfastructureTemplateInfo) - - for i := range clusterUpgradeConfig.MDObjects { - // set actual MD object information in 'clusterUpgradeConfig.ActualComponentInfo' - clusterUpgradeConfig.ActualComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name] = mdInfastructureTemplateInfo{ - MDInfrastructureTemplateName: clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.InfrastructureRef.Name, - MDInfrastructureTemplateNamespace: clusterUpgradeConfig.MDObjects[i].Namespace, - } - } - - switch kcp.Spec.MachineTemplate.InfrastructureRef.Kind { - case constants.KindVSphereMachineTemplate: - return c.createVsphereInfrastructureTemplateForUpgrade(regionalClusterClient, kcp, clusterUpgradeConfig) - case constants.KindAWSMachineTemplate: - return c.createAWSInfrastructureTemplateForUpgrade(regionalClusterClient, kcp, clusterUpgradeConfig) - case constants.KindAzureMachineTemplate: - return c.createAzureInfrastructureTemplateForUpgrade(regionalClusterClient, kcp, clusterUpgradeConfig) - case constants.KindDockerMachineTemplate: - return c.createCAPDInfrastructureTemplateForUpgrade(regionalClusterClient, kcp, clusterUpgradeConfig) - default: - return errors.New("infrastructure template associated with KubeadmControlPlane object is invalid") - } -} - -func isNewAWSTemplateRequired(machineTemplate *capav1beta2.AWSMachineTemplate, clusterUpgradeConfig *ClusterUpgradeInfo, actualK8sVersion *string) bool { - if actualK8sVersion == nil || *actualK8sVersion != clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion { - return true - } - - // If vm template given is the same as we already have in AWSMachineTemplate - if machineTemplate.Spec.Template.Spec.AMI.ID == nil || - *machineTemplate.Spec.Template.Spec.AMI.ID != clusterUpgradeConfig.UpgradeComponentInfo.AwsAMIID { - return true - } - return false -} - -func isNewDockerTemplateRequired(machineTemplate *capdv1beta1.DockerMachineTemplate, clusterUpgradeConfig *ClusterUpgradeInfo, actualK8sVersion *string) bool { - if actualK8sVersion == nil || *actualK8sVersion != clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion { - return true - } - // If machine template given is the same as we already have in DockerMachineTemplate - if machineTemplate.Spec.Template.Spec.CustomImage == "" || - machineTemplate.Spec.Template.Spec.CustomImage != clusterUpgradeConfig.UpgradeComponentInfo.CAPDImageName { - return true - } - return false -} - -func (c *TkgClient) createAWSControlPlaneMachineTemplate(regionalClusterClient clusterclient.Client, kcp *capikubeadmv1beta1.KubeadmControlPlane, clusterUpgradeConfig *ClusterUpgradeInfo) error { - var err error - awsMachineTemplate := &capav1beta2.AWSMachineTemplate{} - err = regionalClusterClient.GetResource(awsMachineTemplate, kcp.Spec.MachineTemplate.InfrastructureRef.Name, kcp.Spec.MachineTemplate.InfrastructureRef.Namespace, nil, nil) - if err != nil { - return errors.Wrapf(err, "unable to find AWSMachineTemplate with name '%s' in namespace '%s'", kcp.Spec.MachineTemplate.InfrastructureRef.Name, kcp.Spec.MachineTemplate.InfrastructureRef.Namespace) - } - - // Naming format of the template: Current naming format for AWSMachineTemplate for KCP is {CLUSTER_NAME}-control-plane-{KUBERNETES_VERSION}-{random-string} - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName = clusterUpgradeConfig.ClusterName + "-control-plane-" + - utils.ReplaceSpecialChars(clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion) + "-" + utils.GenerateRandomID(5, true) - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateNamespace = awsMachineTemplate.Namespace - - if !isNewAWSTemplateRequired(awsMachineTemplate, clusterUpgradeConfig, &kcp.Spec.Version) { - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName = awsMachineTemplate.Name - return nil - } - - awsMachineTemplateForUpgrade := &capav1beta2.AWSMachineTemplate{} - awsMachineTemplateForUpgrade.Name = clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName - awsMachineTemplateForUpgrade.Namespace = clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateNamespace - awsMachineTemplateForUpgrade.Spec = awsMachineTemplate.DeepCopy().Spec - awsMachineTemplateForUpgrade.Spec.Template.Spec.AMI.ID = &clusterUpgradeConfig.UpgradeComponentInfo.AwsAMIID // TODO(anuj): Decide on AMI-ID vs ImageLookupOrg implementation approach - - err = regionalClusterClient.CreateResource(awsMachineTemplateForUpgrade, awsMachineTemplateForUpgrade.Name, awsMachineTemplateForUpgrade.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to create AWSMachineTemplate for upgrade with name '%s' in namespace '%s'", awsMachineTemplateForUpgrade.Name, awsMachineTemplateForUpgrade.Namespace) - } - - return nil -} - -func (c *TkgClient) createAWSMachineDeploymentMachineTemplateForWorkers(regionalClusterClient clusterclient.Client, clusterUpgradeConfig *ClusterUpgradeInfo) error { - var err error - - for i := range clusterUpgradeConfig.MDObjects { - // get aws machine template for given machine deployment - awsMachineTemplateForMD := &capav1beta2.AWSMachineTemplate{} - err = regionalClusterClient.GetResource(awsMachineTemplateForMD, clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.InfrastructureRef.Name, clusterUpgradeConfig.MDObjects[i].Namespace, nil, nil) - if err != nil { - return errors.Wrapf(err, "unable to find AWSMachineTemplate with name '%s' in namespace '%s'", clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.InfrastructureRef.Name, clusterUpgradeConfig.MDObjects[i].Namespace) - } - - // if no template change required, update the clusterUpgradeConfig.UpgradeComponentInfo and return immediately - if !isNewAWSTemplateRequired(awsMachineTemplateForMD, clusterUpgradeConfig, clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.Version) { - clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name] = mdInfastructureTemplateInfo{ - MDInfrastructureTemplateName: awsMachineTemplateForMD.Name, - MDInfrastructureTemplateNamespace: awsMachineTemplateForMD.Namespace, - } - return nil - } - - // Naming format of the MD template: Current naming format for AWSMachineTemplate for MachineDeployment is {ACTUAL_TEMPLATE_NAME}-{KUBERNETES_VERSION}-{random-string} - clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name] = mdInfastructureTemplateInfo{ - MDInfrastructureTemplateName: clusterUpgradeConfig.ActualComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateName + "-" + - utils.ReplaceSpecialChars(clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion) + "-" + utils.GenerateRandomID(5, true), - MDInfrastructureTemplateNamespace: awsMachineTemplateForMD.Namespace, - } - - awsMachineTemplateMDForUpgrade := &capav1beta2.AWSMachineTemplate{} - awsMachineTemplateMDForUpgrade.Name = clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateName - awsMachineTemplateMDForUpgrade.Namespace = clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateNamespace - awsMachineTemplateMDForUpgrade.Spec = awsMachineTemplateForMD.DeepCopy().Spec - awsMachineTemplateMDForUpgrade.Spec.Template.Spec.AMI.ID = &clusterUpgradeConfig.UpgradeComponentInfo.AwsAMIID // TODO(anuj): Decide on AMI-ID vs ImageLookupOrg implementation approach - - // create template for each machine deployment object - err = regionalClusterClient.CreateResource(awsMachineTemplateMDForUpgrade, awsMachineTemplateMDForUpgrade.Name, awsMachineTemplateMDForUpgrade.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to create AWSMachineTemplate for upgrade with name '%s' in namespace '%s'", awsMachineTemplateMDForUpgrade.Name, awsMachineTemplateMDForUpgrade.Namespace) - } - } - - return nil -} - -func (c *TkgClient) createCAPDInfrastructureTemplateForUpgrade(regionalClusterClient clusterclient.Client, kcp *capikubeadmv1beta1.KubeadmControlPlane, clusterUpgradeConfig *ClusterUpgradeInfo) error { - err := c.getCAPDImageForK8sVersion(clusterUpgradeConfig) - if err != nil { - return errors.Wrap(err, "unable to get docker image for CAPD template") - } - if err := c.createCAPDControlPlaneMachineTemplate(regionalClusterClient, kcp, clusterUpgradeConfig); err != nil { - return err - } - if err := c.createCAPDMachineDeploymentMachineTemplateForWorkers(regionalClusterClient, clusterUpgradeConfig); err != nil { - return err - } - - return nil -} - -func (c *TkgClient) createAWSInfrastructureTemplateForUpgrade(regionalClusterClient clusterclient.Client, kcp *capikubeadmv1beta1.KubeadmControlPlane, clusterUpgradeConfig *ClusterUpgradeInfo) error { - err := c.getAWSAMIIDForK8sVersion(regionalClusterClient, clusterUpgradeConfig) - if err != nil { - return errors.Wrap(err, "unable to get AMIID for aws template") - } - if err := c.createAWSControlPlaneMachineTemplate(regionalClusterClient, kcp, clusterUpgradeConfig); err != nil { - return err - } - if err := c.createAWSMachineDeploymentMachineTemplateForWorkers(regionalClusterClient, clusterUpgradeConfig); err != nil { - return err - } - return nil -} - -func isNewAzureTemplateRequired(machineTemplate *capzv1beta1.AzureMachineTemplate, clusterUpgradeConfig *ClusterUpgradeInfo, actualK8sVersion *string) bool { // nolint:gocyclo - if actualK8sVersion == nil || *actualK8sVersion != clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion { - return true - } - - if machineTemplate.Spec.Template.Spec.Image == nil { - return true - } - - if isMarketplaceImage(&clusterUpgradeConfig.UpgradeComponentInfo.AzureImage) && // nolint:dupl - (machineTemplate.Spec.Template.Spec.Image.Marketplace == nil || - machineTemplate.Spec.Template.Spec.Image.Marketplace.Publisher != clusterUpgradeConfig.UpgradeComponentInfo.AzureImage.Publisher || - machineTemplate.Spec.Template.Spec.Image.Marketplace.Offer != clusterUpgradeConfig.UpgradeComponentInfo.AzureImage.Offer || - machineTemplate.Spec.Template.Spec.Image.Marketplace.SKU != clusterUpgradeConfig.UpgradeComponentInfo.AzureImage.Sku || - machineTemplate.Spec.Template.Spec.Image.Marketplace.Version != clusterUpgradeConfig.UpgradeComponentInfo.AzureImage.Version || - machineTemplate.Spec.Template.Spec.Image.Marketplace.ThirdPartyImage != clusterUpgradeConfig.UpgradeComponentInfo.AzureImage.ThirdPartyImage) { - return true - } - - if isSharedGalleryImage(&clusterUpgradeConfig.UpgradeComponentInfo.AzureImage) && //nolint:dupl - (machineTemplate.Spec.Template.Spec.Image.SharedGallery == nil || - machineTemplate.Spec.Template.Spec.Image.SharedGallery.ResourceGroup != clusterUpgradeConfig.UpgradeComponentInfo.AzureImage.ResourceGroup || - machineTemplate.Spec.Template.Spec.Image.SharedGallery.Name != clusterUpgradeConfig.UpgradeComponentInfo.AzureImage.Name || - machineTemplate.Spec.Template.Spec.Image.SharedGallery.SubscriptionID != clusterUpgradeConfig.UpgradeComponentInfo.AzureImage.SubscriptionID || - machineTemplate.Spec.Template.Spec.Image.SharedGallery.Gallery != clusterUpgradeConfig.UpgradeComponentInfo.AzureImage.Gallery || - machineTemplate.Spec.Template.Spec.Image.SharedGallery.Version != clusterUpgradeConfig.UpgradeComponentInfo.AzureImage.Version) { - return true - } - - return false -} - -func isMarketplaceImage(azureImage *tkgconfigbom.AzureInfo) bool { - return azureImage.Publisher != "" && azureImage.Offer != "" && azureImage.Sku != "" && azureImage.Version != "" -} - -func isSharedGalleryImage(azureImage *tkgconfigbom.AzureInfo) bool { - return azureImage.Name != "" && azureImage.ResourceGroup != "" && azureImage.SubscriptionID != "" && azureImage.Gallery != "" && azureImage.Version != "" -} - -func getAzureImage(azureImage *tkgconfigbom.AzureInfo) *capzv1beta1.Image { - if isMarketplaceImage(azureImage) { - return &capzv1beta1.Image{ - Marketplace: &capzv1beta1.AzureMarketplaceImage{ - ImagePlan: capzv1beta1.ImagePlan{ - Publisher: azureImage.Publisher, - Offer: azureImage.Offer, - SKU: azureImage.Sku, - }, - Version: azureImage.Version, - ThirdPartyImage: azureImage.ThirdPartyImage, - }, - } - } - - if isSharedGalleryImage(azureImage) { - return &capzv1beta1.Image{ - SharedGallery: &capzv1beta1.AzureSharedGalleryImage{ - ResourceGroup: azureImage.ResourceGroup, - Name: azureImage.Name, - SubscriptionID: azureImage.SubscriptionID, - Gallery: azureImage.Gallery, - Version: azureImage.Version, - }, - } - } - - return nil -} - -func (c *TkgClient) createAzureControlPlaneMachineTemplate(regionalClusterClient clusterclient.Client, kcp *capikubeadmv1beta1.KubeadmControlPlane, clusterUpgradeConfig *ClusterUpgradeInfo) error { - var err error - azureMachineTemplate := &capzv1beta1.AzureMachineTemplate{} - err = regionalClusterClient.GetResource(azureMachineTemplate, kcp.Spec.MachineTemplate.InfrastructureRef.Name, kcp.Spec.MachineTemplate.InfrastructureRef.Namespace, nil, nil) - if err != nil { - return errors.Wrapf(err, "unable to find AzureMachineTemplate with name %s in namespace %s", kcp.Spec.MachineTemplate.InfrastructureRef.Name, kcp.Spec.MachineTemplate.InfrastructureRef.Namespace) - } - - // Naming format of the template: Current naming format for AzureMachineTemplate for KCP is {CLUSTER_NAME}-control-plane-{KUBERNETES_VERSION}-{random-string} - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName = clusterUpgradeConfig.ClusterName + "-control-plane-" + - utils.ReplaceSpecialChars(clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion) + "-" + utils.GenerateRandomID(5, true) - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateNamespace = azureMachineTemplate.Namespace - - if !isNewAzureTemplateRequired(azureMachineTemplate, clusterUpgradeConfig, &kcp.Spec.Version) { - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName = azureMachineTemplate.Name - return nil - } - - azureMachineTemplateForUpgrade := &capzv1beta1.AzureMachineTemplate{} - azureMachineTemplateForUpgrade.Name = clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName - azureMachineTemplateForUpgrade.Namespace = clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateNamespace - azureMachineTemplateForUpgrade.Spec = azureMachineTemplate.DeepCopy().Spec - azureMachineTemplateForUpgrade.Spec.Template.Spec.Image = getAzureImage(&clusterUpgradeConfig.UpgradeComponentInfo.AzureImage) - - err = regionalClusterClient.CreateResource(azureMachineTemplateForUpgrade, azureMachineTemplateForUpgrade.Name, azureMachineTemplateForUpgrade.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to create AzureMachineTemplate for upgrade with name %s in namespace %s", azureMachineTemplateForUpgrade.Name, azureMachineTemplateForUpgrade.Namespace) - } - - return nil -} - -func (c *TkgClient) createCAPDControlPlaneMachineTemplate(regionalClusterClient clusterclient.Client, kcp *capikubeadmv1beta1.KubeadmControlPlane, clusterUpgradeConfig *ClusterUpgradeInfo) error { - var err error - dockerMachineTemplate := &capdv1beta1.DockerMachineTemplate{} - err = regionalClusterClient.GetResource(dockerMachineTemplate, kcp.Spec.MachineTemplate.InfrastructureRef.Name, kcp.Spec.MachineTemplate.InfrastructureRef.Namespace, nil, nil) - if err != nil { - return errors.Wrapf(err, "unable to find DockerMachineTemplate with name %s in namespace %s", kcp.Spec.MachineTemplate.InfrastructureRef.Name, kcp.Spec.MachineTemplate.InfrastructureRef.Namespace) - } - - // Naming format of the template: Current naming format for DockerMachineTemplate for KCP is {CLUSTER_NAME}-control-plane-{KUBERNETES_VERSION}-{random-string} - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName = clusterUpgradeConfig.ClusterName + "-control-plane-" + - utils.ReplaceSpecialChars(clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion) + "-" + utils.GenerateRandomID(5, true) - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateNamespace = dockerMachineTemplate.Namespace - - if !isNewDockerTemplateRequired(dockerMachineTemplate, clusterUpgradeConfig, &kcp.Spec.Version) { - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName = dockerMachineTemplate.Name - return nil - } - - dockerMachineTemplateForUpgrade := &capdv1beta1.DockerMachineTemplate{} - dockerMachineTemplateForUpgrade.Name = clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName - dockerMachineTemplateForUpgrade.Namespace = clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateNamespace - dockerMachineTemplateForUpgrade.Spec = dockerMachineTemplate.DeepCopy().Spec - dockerMachineTemplateForUpgrade.Spec.Template.Spec.CustomImage = clusterUpgradeConfig.UpgradeComponentInfo.CAPDImageName - - err = regionalClusterClient.CreateResource(dockerMachineTemplateForUpgrade, dockerMachineTemplateForUpgrade.Name, dockerMachineTemplateForUpgrade.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to create dockerMachineTemplate for upgrade with name %s in namespace %s", dockerMachineTemplateForUpgrade.Name, dockerMachineTemplateForUpgrade.Namespace) - } - - return nil -} - -func (c *TkgClient) createCAPDMachineDeploymentMachineTemplateForWorkers(regionalClusterClient clusterclient.Client, clusterUpgradeConfig *ClusterUpgradeInfo) error { - var err error - for i := range clusterUpgradeConfig.MDObjects { - dockerMachineTemplateForMD := &capdv1beta1.DockerMachineTemplate{} - err = regionalClusterClient.GetResource(dockerMachineTemplateForMD, clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.InfrastructureRef.Name, clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.InfrastructureRef.Namespace, nil, nil) - if err != nil { - return errors.Wrapf(err, "unable to find DockerMachineTemplate with name %s in namespace %s", clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.InfrastructureRef.Name, clusterUpgradeConfig.MDObjects[i].Namespace) - } - - if !isNewDockerTemplateRequired(dockerMachineTemplateForMD, clusterUpgradeConfig, clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.Version) { - clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name] = mdInfastructureTemplateInfo{ - MDInfrastructureTemplateName: dockerMachineTemplateForMD.Name, - MDInfrastructureTemplateNamespace: dockerMachineTemplateForMD.Namespace, - } - return nil - } - - // Naming format of the MD template: Current naming format for AzureMachineTemplate for MachineDeployment is {ACTUAL_TEMPLATE_NAME}-{KUBERNETES_VERSION}-{random-string} - clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name] = mdInfastructureTemplateInfo{ - MDInfrastructureTemplateName: clusterUpgradeConfig.ActualComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateName + "-" + - utils.ReplaceSpecialChars(clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion) + "-" + utils.GenerateRandomID(5, true), - MDInfrastructureTemplateNamespace: dockerMachineTemplateForMD.Namespace, - } - - dockerMachineTemplateMDForUpgrade := &capdv1beta1.DockerMachineTemplate{} - dockerMachineTemplateMDForUpgrade.Name = clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateName - dockerMachineTemplateMDForUpgrade.Namespace = clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateNamespace - dockerMachineTemplateMDForUpgrade.Spec = dockerMachineTemplateForMD.DeepCopy().Spec - dockerMachineTemplateMDForUpgrade.Spec.Template.Spec.CustomImage = clusterUpgradeConfig.UpgradeComponentInfo.CAPDImageName - - err = regionalClusterClient.CreateResource(dockerMachineTemplateMDForUpgrade, dockerMachineTemplateMDForUpgrade.Name, dockerMachineTemplateMDForUpgrade.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to create DockerMachineTemplate for upgrade with name %s in namespace %s", dockerMachineTemplateMDForUpgrade.Name, dockerMachineTemplateMDForUpgrade.Namespace) - } - } - - return nil -} - -func (c *TkgClient) createAzureMachineDeploymentMachineTemplateForWorkers(regionalClusterClient clusterclient.Client, clusterUpgradeConfig *ClusterUpgradeInfo) error { - var err error - - for i := range clusterUpgradeConfig.MDObjects { - azureMachineTemplateForMD := &capzv1beta1.AzureMachineTemplate{} - err = regionalClusterClient.GetResource(azureMachineTemplateForMD, clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.InfrastructureRef.Name, clusterUpgradeConfig.MDObjects[i].Namespace, nil, nil) - if err != nil { - return errors.Wrapf(err, "unable to find AzureMachineTemplate with name '%s' in namespace '%s'", clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.InfrastructureRef.Name, clusterUpgradeConfig.MDObjects[i].Namespace) - } - - if !isNewAzureTemplateRequired(azureMachineTemplateForMD, clusterUpgradeConfig, clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.Version) { - clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name] = mdInfastructureTemplateInfo{ - MDInfrastructureTemplateName: azureMachineTemplateForMD.Name, - MDInfrastructureTemplateNamespace: azureMachineTemplateForMD.Namespace, - } - return nil - } - - // Naming format of the MD template: Current naming format for AzureMachineTemplate for MachineDeployment is {ACTUAL_TEMPLATE_NAME}-{KUBERNETES_VERSION}-{random-string} - clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name] = mdInfastructureTemplateInfo{ - MDInfrastructureTemplateName: clusterUpgradeConfig.ActualComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateName + "-" + - utils.ReplaceSpecialChars(clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion) + "-" + utils.GenerateRandomID(5, true), - MDInfrastructureTemplateNamespace: azureMachineTemplateForMD.Namespace, - } - - azureMachineTemplateMDForUpgrade := &capzv1beta1.AzureMachineTemplate{} - azureMachineTemplateMDForUpgrade.Name = clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateName - azureMachineTemplateMDForUpgrade.Namespace = clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateNamespace - azureMachineTemplateMDForUpgrade.Spec = azureMachineTemplateForMD.DeepCopy().Spec - azureMachineTemplateMDForUpgrade.Spec.Template.Spec.Image = getAzureImage(&clusterUpgradeConfig.UpgradeComponentInfo.AzureImage) - - err = regionalClusterClient.CreateResource(azureMachineTemplateMDForUpgrade, azureMachineTemplateMDForUpgrade.Name, azureMachineTemplateMDForUpgrade.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to create AzureMachineTemplate for upgrade with name %s in namespace %s", azureMachineTemplateMDForUpgrade.Name, azureMachineTemplateMDForUpgrade.Namespace) - } - } - - return nil -} - -func (c *TkgClient) createAzureInfrastructureTemplateForUpgrade(regionalClusterClient clusterclient.Client, kcp *capikubeadmv1beta1.KubeadmControlPlane, clusterUpgradeConfig *ClusterUpgradeInfo) error { - if !isSharedGalleryImage(&clusterUpgradeConfig.UpgradeComponentInfo.AzureImage) && !isMarketplaceImage(&clusterUpgradeConfig.UpgradeComponentInfo.AzureImage) { - return errors.New("unable to proceed with the upgrade due to invalid azure image information") - } - if err := c.createAzureControlPlaneMachineTemplate(regionalClusterClient, kcp, clusterUpgradeConfig); err != nil { - return err - } - if err := c.createAzureMachineDeploymentMachineTemplateForWorkers(regionalClusterClient, clusterUpgradeConfig); err != nil { - return err - } - return nil -} - -func isNewVSphereTemplateRequired(machineTemplate *capvv1beta1.VSphereMachineTemplate, clusterUpgradeConfig *ClusterUpgradeInfo, actualK8sVersion *string) bool { - if actualK8sVersion == nil || *actualK8sVersion != clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion { - return true - } - // If vm moid given is not the same as we already have in VSphereMachineTemplate - if machineTemplate.Annotations[vmTemplateMoidKey] != clusterUpgradeConfig.UpgradeComponentInfo.VSphereVMTemplateMOID { - return true - } - return false -} - -func (c *TkgClient) createVSphereControlPlaneMachineTemplate(regionalClusterClient clusterclient.Client, kcp *capikubeadmv1beta1.KubeadmControlPlane, clusterUpgradeConfig *ClusterUpgradeInfo) error { - // Get the actual MachineTemplate object associated with actual KCP object - actualVsphereMachineTemplate := &capvv1beta1.VSphereMachineTemplate{} - err := regionalClusterClient.GetResource(actualVsphereMachineTemplate, kcp.Spec.MachineTemplate.InfrastructureRef.Name, kcp.Spec.MachineTemplate.InfrastructureRef.Namespace, nil, nil) - if err != nil { - return errors.Wrapf(err, "unable to find VSphereMachineTemplate with name '%s' in namespace '%s'", kcp.Spec.MachineTemplate.InfrastructureRef.Name, kcp.Spec.MachineTemplate.InfrastructureRef.Namespace) - } - - // Naming format of the template: Current naming format for vsphereTemplate for KCP is {CLUSTER_NAME}-control-plane-{KUBERNETES_VERSION}-{random-string} - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName = clusterUpgradeConfig.ClusterName + "-control-plane-" + - utils.ReplaceSpecialChars(clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion) + "-" + utils.GenerateRandomID(5, true) - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateNamespace = actualVsphereMachineTemplate.Namespace - - if !isNewVSphereTemplateRequired(actualVsphereMachineTemplate, clusterUpgradeConfig, &kcp.Spec.Version) { - clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName = actualVsphereMachineTemplate.Name - return nil - } - - vsphereMachineTemplateForUpgrade := &capvv1beta1.VSphereMachineTemplate{} - vsphereMachineTemplateForUpgrade.Name = clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName - vsphereMachineTemplateForUpgrade.Namespace = clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateNamespace - vsphereMachineTemplateForUpgrade.Spec = actualVsphereMachineTemplate.DeepCopy().Spec - vsphereMachineTemplateForUpgrade.Spec.Template.Spec.Template = clusterUpgradeConfig.UpgradeComponentInfo.VSphereVMTemplateName - vsphereMachineTemplateForUpgrade.Annotations = map[string]string{} - vsphereMachineTemplateForUpgrade.Annotations[vmTemplateMoidKey] = clusterUpgradeConfig.UpgradeComponentInfo.VSphereVMTemplateMOID - - err = regionalClusterClient.CreateResource(vsphereMachineTemplateForUpgrade, vsphereMachineTemplateForUpgrade.Name, vsphereMachineTemplateForUpgrade.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to create VSphereMachineTemplate for upgrade with name '%s' in namespace '%s'", vsphereMachineTemplateForUpgrade.Name, vsphereMachineTemplateForUpgrade.Namespace) - } - - return nil -} - -func (c *TkgClient) createVSphereMachineDeploymentMachineTemplateForWorkers(regionalClusterClient clusterclient.Client, clusterUpgradeConfig *ClusterUpgradeInfo) error { - var err error - - for i := range clusterUpgradeConfig.MDObjects { - // Get the actual MachineTemplate object associated with actual MD object - actualVsphereMachineTemplate := &capvv1beta1.VSphereMachineTemplate{} - err = regionalClusterClient.GetResource(actualVsphereMachineTemplate, clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.InfrastructureRef.Name, clusterUpgradeConfig.MDObjects[i].Namespace, nil, nil) - if err != nil { - return errors.Wrapf(err, "unable to find VSphereMachineTemplate with name '%s' in namespace '%s'", clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.InfrastructureRef.Name, clusterUpgradeConfig.MDObjects[i].Namespace) - } - - if !isNewVSphereTemplateRequired(actualVsphereMachineTemplate, clusterUpgradeConfig, clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.Version) { - clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name] = mdInfastructureTemplateInfo{ - MDInfrastructureTemplateName: actualVsphereMachineTemplate.Name, - MDInfrastructureTemplateNamespace: actualVsphereMachineTemplate.Namespace, - } - return nil - } - - // Naming format of the MD template: Current naming format for VSphereTemplate for MachineDeployment is {ACTUAL_TEMPLATE_NAME}-{KUBERNETES_VERSION}-{random-string} - clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name] = mdInfastructureTemplateInfo{ - MDInfrastructureTemplateName: clusterUpgradeConfig.ActualComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateName + "-" + - utils.ReplaceSpecialChars(clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion) + "-" + utils.GenerateRandomID(5, true), - MDInfrastructureTemplateNamespace: actualVsphereMachineTemplate.Namespace, - } - - vsphereMachineTemplateForUpgrade := &capvv1beta1.VSphereMachineTemplate{} - vsphereMachineTemplateForUpgrade.Name = clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateName - vsphereMachineTemplateForUpgrade.Namespace = clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateNamespace - vsphereMachineTemplateForUpgrade.Spec = actualVsphereMachineTemplate.DeepCopy().Spec - vsphereMachineTemplateForUpgrade.Spec.Template.Spec.Template = clusterUpgradeConfig.UpgradeComponentInfo.VSphereVMTemplateName - vsphereMachineTemplateForUpgrade.Annotations = map[string]string{} - vsphereMachineTemplateForUpgrade.Annotations[vmTemplateMoidKey] = clusterUpgradeConfig.UpgradeComponentInfo.VSphereVMTemplateMOID - - // create template for each machine deployment object - err = regionalClusterClient.CreateResource(vsphereMachineTemplateForUpgrade, vsphereMachineTemplateForUpgrade.Name, vsphereMachineTemplateForUpgrade.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to create VSphereMachineTemplate for upgrade with name '%s' in namespace '%s'", vsphereMachineTemplateForUpgrade.Name, vsphereMachineTemplateForUpgrade.Namespace) - } - } - return nil -} - -func (c *TkgClient) createVsphereInfrastructureTemplateForUpgrade(regionalClusterClient clusterclient.Client, kcp *capikubeadmv1beta1.KubeadmControlPlane, clusterUpgradeConfig *ClusterUpgradeInfo) error { - var err error - - vcClient, dcName, err := regionalClusterClient.GetVCClientAndDataCenter( - clusterUpgradeConfig.ClusterName, - clusterUpgradeConfig.ClusterNamespace, - kcp.Spec.MachineTemplate.InfrastructureRef.Name, - c.vcClientFactory) - if err != nil { - return errors.Wrap(err, "unable to create vsphere client") - } - tkrBom, err := c.tkgBomClient.GetBOMConfigurationFromTkrVersion(clusterUpgradeConfig.UpgradeComponentInfo.TkrVersion) - if err != nil { - return errors.Wrapf(err, "unable to get the BOM configuration of the TanzuKubernetesRelease %s", clusterUpgradeConfig.UpgradeComponentInfo.TkrVersion) - } - vSphereVM, err := vcClient.GetAndValidateVirtualMachineTemplate( - tkrBom.GetOVAVersions(), - clusterUpgradeConfig.UpgradeComponentInfo.TkrVersion, - clusterUpgradeConfig.UpgradeComponentInfo.VSphereVMTemplateName, - dcName, - c.TKGConfigReaderWriter(), - ) - if err != nil { - return errors.Wrap(err, "unable to get/verify vsphere template") - } - - clusterUpgradeConfig.UpgradeComponentInfo.OsInfo = tkgconfigbom.OSInfo{ - Name: vSphereVM.DistroName, - Version: vSphereVM.DistroVersion, - Arch: vSphereVM.DistroArch, - } - - clusterUpgradeConfig.UpgradeComponentInfo.VSphereVMTemplateName = vSphereVM.Name - clusterUpgradeConfig.UpgradeComponentInfo.VSphereVMTemplateMOID = vSphereVM.Moid - - if err := c.createVSphereControlPlaneMachineTemplate(regionalClusterClient, kcp, clusterUpgradeConfig); err != nil { - return err - } - if err := c.createVSphereMachineDeploymentMachineTemplateForWorkers(regionalClusterClient, clusterUpgradeConfig); err != nil { - return err - } - return nil -} - -func (c *TkgClient) PatchKubernetesVersionToKubeadmControlPlane(regionalClusterClient clusterclient.Client, clusterUpgradeConfig *ClusterUpgradeInfo) error { - log.V(6).Infof("Cluster Name: %s, Cluster Namespace %s", clusterUpgradeConfig.ClusterName, clusterUpgradeConfig.ClusterNamespace) - currentKCP, err := regionalClusterClient.GetKCPObjectForCluster(clusterUpgradeConfig.ClusterName, clusterUpgradeConfig.ClusterNamespace) - if err != nil { - return errors.Wrapf(err, "unable to get KCP object to increase the kube-vip timeouts. Continuing upgrade with old parameters. ") - } - - var newKCP *capikubeadmv1beta1.KubeadmControlPlane - // If iaas == vsphere, attempt increasing kube-vip parameters - if currentKCP.Spec.MachineTemplate.InfrastructureRef.Kind == constants.KindVSphereMachineTemplate { - if c.IsKubevipManifestInKCP(currentKCP) { - _, err := c.DecodeKubevipPodManifestFromKCP(currentKCP) - if err != nil { - return errors.Wrapf(err, "unable to decode kube-vip manifest") - - } - currentKCP, err = c.UpdateKubeVipConfigInKCP(currentKCP, clusterUpgradeConfig.UpgradeComponentInfo) - if err != nil { - return errors.Wrapf(err, "unable to update kube-vip config") - } - } - } - - // If unable to make kubevip updates, and the k8s version and the template name are unchanged, skip patching - if newKCP == nil && clusterUpgradeConfig.ActualComponentInfo.KubernetesVersion == clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion && - clusterUpgradeConfig.ActualComponentInfo.KCPInfrastructureTemplateName == clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName { - log.Infof("Skipping KubeadmControlPlane patch as kubernetes versions are already same %s", clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion) - return nil - } - - if !(clusterUpgradeConfig.ActualComponentInfo.KubernetesVersion == clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion && - clusterUpgradeConfig.ActualComponentInfo.KCPInfrastructureTemplateName == clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName) { - log.Infof("Updating the KCP object with k8s version %s", clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion) - - currentKCP.Spec.Version = clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion - currentKCP.Spec.MachineTemplate.InfrastructureRef.Name = clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateName - currentKCP.Spec.MachineTemplate.InfrastructureRef.Namespace = clusterUpgradeConfig.UpgradeComponentInfo.KCPInfrastructureTemplateNamespace - currentKCP.Spec.KubeadmConfigSpec.ClusterConfiguration.ImageRepository = clusterUpgradeConfig.UpgradeComponentInfo.ImageRepository - currentKCP.Spec.KubeadmConfigSpec.ClusterConfiguration.DNS.ImageRepository = clusterUpgradeConfig.UpgradeComponentInfo.CoreDNSImageRepository - currentKCP.Spec.KubeadmConfigSpec.ClusterConfiguration.DNS.ImageTag = clusterUpgradeConfig.UpgradeComponentInfo.CoreDNSImageTag - currentKCP.Spec.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local.ImageRepository = clusterUpgradeConfig.UpgradeComponentInfo.EtcdImageRepository - currentKCP.Spec.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local.ImageTag = clusterUpgradeConfig.UpgradeComponentInfo.EtcdImageTag - if currentKCP.Spec.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local.ExtraArgs == nil { - currentKCP.Spec.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local.ExtraArgs = map[string]string{} - } - for k, v := range clusterUpgradeConfig.UpgradeComponentInfo.EtcdExtraArgs { - currentKCP.Spec.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local.ExtraArgs[k] = v - } - } - - // audit.k8s.io/v1alpha1 and audit.k8s.io/v1beta1 are removed from 1.24.x, cluster created by 1.6.x - // will have removed api version then upgrade will fail, replace it with v1 here - // 1.22.x and 1.23.x clusters create by tanzu 2.1 will have right api version but still keep this - // logic to avoid introduce tanzu cli version check - // refresh yaml only when cluster is upgrading from 1.23.x to 1.24.x - if semver.Compare(clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion, "v1.24.0") >= 0 && - semver.Compare(clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion, "v1.25.0") < 0 && - semver.Compare(clusterUpgradeConfig.ActualComponentInfo.KubernetesVersion, "v1.23.0") >= 0 && - semver.Compare(clusterUpgradeConfig.ActualComponentInfo.KubernetesVersion, "v1.24.0") < 0 { - newKCP, err := c.configureAuditVersion(currentKCP) - if err != nil { - errors.Wrap(err, "unable to configure audit version") - } - if newKCP != nil { - log.Infof("Updating Audit APIVerison for KCP") - currentKCP = newKCP - } - } - - if semver.Compare(clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion, "v1.24.0") >= 0 { - newKCP := c.configurePodSecurityStandard(currentKCP) - if newKCP != nil { - log.Infof("Enabling Pod Security Standard for KCP") - currentKCP = newKCP - } - } - - pollOptions := &clusterclient.PollOptions{Interval: upgradePatchInterval, Timeout: upgradePatchTimeout} - kcpBytes, err := json.Marshal(currentKCP) - if err != nil { - return err - } - err = regionalClusterClient.PatchResource(&capikubeadmv1beta1.KubeadmControlPlane{}, clusterUpgradeConfig.KCPObjectName, clusterUpgradeConfig.KCPObjectNamespace, string(kcpBytes), types.MergePatchType, pollOptions) - if err != nil { - return errors.Wrap(err, "unable to patch the kubernetes version for kubeadm control plane nodes") - } - - operationTimeout := 15 * time.Minute - err = regionalClusterClient.PatchClusterWithOperationStartedStatus(clusterUpgradeConfig.ClusterName, clusterUpgradeConfig.ClusterNamespace, clusterclient.OperationTypeUpgrade, operationTimeout) - if err != nil { - log.V(6).Infof("unable to patch cluster object with operation status, %s", err.Error()) - } - - return nil -} - -func (c *TkgClient) patchKubernetesVersionToMachineDeployment(regionalClusterClient clusterclient.Client, clusterUpgradeConfig *ClusterUpgradeInfo) error { - var err error - for i := range clusterUpgradeConfig.MDObjects { - if clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.Version != nil && - clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion == *clusterUpgradeConfig.MDObjects[i].Spec.Template.Spec.Version && - clusterUpgradeConfig.ActualComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateName == clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateName { - log.Infof("Skipping MachineDeployment patch as kubernetes versions are already same %s", clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion) - return nil - } - - patchString := `{ - "spec": { - "template": { - "spec": { - "version": "%s", - "infrastructureRef": { - "name": "%s", - "namespace": "%s" - } - } - } - } - }` - - patchKubernetesVersion := fmt.Sprintf(patchString, - clusterUpgradeConfig.UpgradeComponentInfo.KubernetesVersion, - clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateName, - clusterUpgradeConfig.UpgradeComponentInfo.MDInfastructureTemplates[clusterUpgradeConfig.MDObjects[i].Name].MDInfrastructureTemplateNamespace) - - log.V(3).Infof("Applying MachineDeployment Patch: %s", patchKubernetesVersion) - - // Using polling to retry on any failed patch attempt. - pollOptions := &clusterclient.PollOptions{Interval: upgradePatchInterval, Timeout: upgradePatchTimeout} - err = regionalClusterClient.PatchResource(&capi.MachineDeployment{}, clusterUpgradeConfig.MDObjects[i].Name, clusterUpgradeConfig.MDObjects[i].Namespace, patchKubernetesVersion, types.MergePatchType, pollOptions) - if err != nil { - return errors.Wrap(err, "unable to update the kubernetes version for worker nodes") - } - } - return nil -} - -func addAWSIngressrule(regionalClusterClient clusterclient.Client, awsClusterName string, awsClusterNamespace string, newRule capav1beta2.CNIIngressRule) error { - pollOptions := &clusterclient.PollOptions{Interval: clusterclient.CheckResourceInterval, Timeout: 3 * clusterclient.CheckResourceInterval} - awsClusterObject := &capav1beta2.AWSCluster{} - if err := regionalClusterClient.GetResource(awsClusterObject, awsClusterName, awsClusterNamespace, nil, pollOptions); err != nil { - return errors.Wrapf(err, "unable to get the aws cluster %s/%s", awsClusterNamespace, awsClusterName) - } - - if awsClusterObject.Spec.NetworkSpec.SecurityGroupOverrides != nil { - log.Infof("aws cluster Spec.NetworkSpec.SecurityGroupOverrides is not nil. Will not configure aws ingress rules") - return nil - } - if err := regionalClusterClient.UpdateAWSCNIIngressRules(awsClusterName, awsClusterNamespace, newRule); err != nil { - log.Warningf("unable to update AWS CNI ingress rules for %s/%s: %s", awsClusterNamespace, awsClusterName, err.Error()) - } - return nil -} - -// HandleKappControllerUpgrade is only meant for testing handleKappControllerUpgrade -func (c *TkgClient) HandleKappControllerUpgrade(regionalClusterClient, currentClusterClient clusterclient.Client, upgradeClusterConfig *ClusterUpgradeInfo) error { - return c.handleKappControllerUpgrade(regionalClusterClient, currentClusterClient, upgradeClusterConfig) -} - -// handleKappControllerUpgrade contains upgrade logic required for kapp-controller. -func (c *TkgClient) handleKappControllerUpgrade(regionalClusterClient, currentClusterClient clusterclient.Client, upgradeClusterConfig *ClusterUpgradeInfo) error { - // In TKG version prior to v1.3, kapp-controller could have been deployed by user as part of tkg-extensions deployment. - // We need to delete the existing kapp-controller since a new kapp-controller will be installed from TKG v1.3 for addons management. - if err := currentClusterClient.DeleteExistingKappController(); err != nil { - return errors.Wrapf(err, "unable to delete existing kapp-controller") - } - - pollOptions := &clusterclient.PollOptions{Interval: clusterclient.CheckResourceInterval, Timeout: 3 * clusterclient.CheckResourceInterval} - - cluster := &capi.Cluster{} - if err := regionalClusterClient.GetResource(cluster, upgradeClusterConfig.ClusterName, upgradeClusterConfig.ClusterNamespace, nil, pollOptions); err != nil { - return errors.Wrapf(err, "unable to get the cluster %s/%s", upgradeClusterConfig.ClusterNamespace, upgradeClusterConfig.ClusterName) - } else if cluster.Spec.InfrastructureRef != nil && cluster.Spec.InfrastructureRef.Kind == constants.InfrastructureRefAWS { - kappControllerAWSIngressRule := capav1beta2.CNIIngressRule{ - Description: "kapp-controller", - Protocol: capav1beta2.SecurityGroupProtocolTCP, - FromPort: DefaultKappControllerHostPort, - ToPort: DefaultKappControllerHostPort, - } - awsClusterName := cluster.Spec.InfrastructureRef.Name - awsClusterNamespace := cluster.Spec.InfrastructureRef.Namespace - err := addAWSIngressrule(regionalClusterClient, awsClusterName, awsClusterNamespace, kappControllerAWSIngressRule) - if err != nil { - return err - } - } - return nil -} - -// PrepareAddonsManagerUpgrade is only meant for testing prepareAddonsManagerUpgrade -func (c *TkgClient) PrepareAddonsManagerUpgrade(regionalClusterClient clusterclient.Client, upgradeClusterConfig *ClusterUpgradeInfo) error { - return c.prepareAddonsManagerUpgrade(regionalClusterClient, upgradeClusterConfig) -} - -func (c *TkgClient) prepareAddonsManagerUpgrade(regionalClusterClient clusterclient.Client, upgradeClusterConfig *ClusterUpgradeInfo) error { - // handle aws management cluster - pollOptions := &clusterclient.PollOptions{Interval: clusterclient.CheckResourceInterval, Timeout: 3 * clusterclient.CheckResourceInterval} - - cluster := &capi.Cluster{} - if err := regionalClusterClient.GetResource(cluster, upgradeClusterConfig.ClusterName, upgradeClusterConfig.ClusterNamespace, nil, pollOptions); err != nil { - return errors.Wrapf(err, "unable to get the cluster %s/%s", upgradeClusterConfig.ClusterNamespace, upgradeClusterConfig.ClusterName) - } else if cluster.Spec.InfrastructureRef != nil && cluster.Spec.InfrastructureRef.Kind == constants.InfrastructureRefAWS { - addonsManagerAWSIngressRule := capav1beta2.CNIIngressRule{ - Description: "addons-manager", - Protocol: capav1beta2.SecurityGroupProtocolTCP, - FromPort: DefaultAddonsManagerHostPort, - ToPort: DefaultAddonsManagerHostPort, - } - awsClusterName := cluster.Spec.InfrastructureRef.Name - awsClusterNamespace := cluster.Spec.InfrastructureRef.Namespace - err := addAWSIngressrule(regionalClusterClient, awsClusterName, awsClusterNamespace, addonsManagerAWSIngressRule) - if err != nil { - return err - } - } - return nil -} - -func (c *TkgClient) getWorkloadClusterClient(clusterName, namespace string) (clusterclient.Client, error) { - workloadClusterKubeConfigPath, err := utils.CreateTempFile("", "workload-kubeconfig") - if err != nil { - return nil, errors.Wrap(err, "unable to create temporary file to save workload cluster kubeconfig") - } - workloadClusterCredentialsOptions := GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - ExportFile: workloadClusterKubeConfigPath, - } - context, _, err := c.GetWorkloadClusterCredentials(workloadClusterCredentialsOptions) - if err != nil { - return nil, errors.Wrap(err, "unable to get workload cluster credentials") - } - - workloadClusterClient, err := clusterclient.NewClient(workloadClusterKubeConfigPath, context, clusterclient.Options{OperationTimeout: c.timeout}) - if err != nil { - return nil, errors.Wrap(err, "unable to create workload cluster client") - } - - return workloadClusterClient, nil -} - -// verifyK8sVersion -// - verify the version format is correct -// - make sure this is an upgrade and not downgrade or the same version -func (c *TkgClient) verifyK8sVersion(clusterClient clusterclient.Client, newVersion string) error { - currentVersion, err := clusterClient.GetKubernetesVersion() - if err != nil { - return errors.New("unable to get current kubernetes version for the cluster") - } - - // Make sure this is an upgrade and not a downgrade - compareResult, err := utils.CompareVMwareVersionStrings(currentVersion, newVersion) - if err != nil { - return errors.Wrapf(err, "error while comparing kubernetes versions %s,%s", newVersion, currentVersion) - } - - if compareResult > 0 { - return errors.Errorf("attempted to upgrade kubernetes from %s to %s. Kubernetes version downgrade is not allowed.", currentVersion, newVersion) - } - - if !utils.CheckKubernetesUpgradeCompatibility(currentVersion, newVersion) { - return errors.Errorf("Upgrading Kubernetes from %s to %s is not supported", currentVersion, newVersion) - } - - return nil -} - -func listCAPIv1alpha3Clusters(clusterClient clusterclient.Client) ([]capiv1alpha3.Cluster, error) { - var clusterList capiv1alpha3.ClusterList - if err := clusterClient.ListResources(&clusterList); err != nil { - return []capiv1alpha3.Cluster{}, err - } - - return clusterList.Items, nil -} - -func (c *TkgClient) getRegionalClusterNameAndNamespace(clusterClient clusterclient.Client) (string, string, error) { - var clusterName string - var clusterNamespace string - - regionalClusterInfo, err := c.GetCurrentRegionContext() - if err != nil { - return clusterName, clusterNamespace, err - } - - clusterName = regionalClusterInfo.ClusterName - - clusters, err := listCAPIv1alpha3Clusters(clusterClient) - if err != nil { - return clusterName, clusterNamespace, err - } - - for i := range clusters { - if clusterName == clusters[i].Name { - clusterNamespace = clusters[i].Namespace - } - } - - if clusterNamespace == "" { - return clusterName, clusterNamespace, errors.Errorf("unable to find namespace of management cluster object %s", clusterName) - } - - return clusterName, clusterNamespace, nil -} - -func (c *TkgClient) getAWSAMIIDForK8sVersion(regionalClusterClient clusterclient.Client, upgradeInfo *ClusterUpgradeInfo) error { - awsClusterObject := &capav1beta2.AWSCluster{} - if err := regionalClusterClient.GetResource(awsClusterObject, upgradeInfo.ClusterName, upgradeInfo.ClusterNamespace, nil, nil); err != nil { - return errors.Wrap(err, "unable to retrieve aws cluster object to retrieve AMI settings") - } - - if ami, ok := upgradeInfo.UpgradeComponentInfo.AwsRegionToAMIMap[awsClusterObject.Spec.Region]; ok { - selectedAMI := tkgconfighelper.SelectAWSImageBasedonOSOptions(ami, c.TKGConfigReaderWriter()) - if selectedAMI == nil { - return errors.Errorf("unable to find the AMI ID for AWSTemplate for region %s and kubernetes version %s, with the provided os option", awsClusterObject.Spec.Region, upgradeInfo.UpgradeComponentInfo.KubernetesVersion) - } - upgradeInfo.UpgradeComponentInfo.AwsAMIID = selectedAMI.ID - upgradeInfo.UpgradeComponentInfo.OsInfo = selectedAMI.OSInfo - } - - if upgradeInfo.UpgradeComponentInfo.AwsAMIID == "" { - return errors.Errorf("unable to find the AMI ID for AWSTemplate for region %s and kubernetes version %s", awsClusterObject.Spec.Region, upgradeInfo.UpgradeComponentInfo.KubernetesVersion) - } - - return nil -} - -func (c *TkgClient) getCAPDImageForK8sVersion(upgradeInfo *ClusterUpgradeInfo) error { - if upgradeInfo.UpgradeComponentInfo.CAPDImageName == "" { - bomConfiguration, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return errors.Wrapf(err, "cannot get kind node image for kubernetes version %s", upgradeInfo.UpgradeComponentInfo.KubernetesVersion) - } - - // TODO: write util for taking in bomConfiguration and returning correct - // path so the replace can be tested - kindNodeImage := bomConfiguration.Components["kubernetes-sigs_kind"][0].Images["kindNodeImage"] - defaultImageRepo := bomConfiguration.ImageConfig.ImageRepository - if kindNodeImage.ImageRepository != "" { - defaultImageRepo = kindNodeImage.ImageRepository - } - - upgradeInfo.UpgradeComponentInfo.CAPDImageName = fmt.Sprintf("%s/%s:%s", defaultImageRepo, kindNodeImage.ImagePath, kindNodeImage.Tag) - } - - // we can keep everything about the image the same except for the version, - // which will be updated - - updatedVersion := strings.ReplaceAll(upgradeInfo.UpgradeComponentInfo.KubernetesVersion, "+", "_") - newImage, err := utils.ReplaceVersionInDockerImage(upgradeInfo.UpgradeComponentInfo.CAPDImageName, updatedVersion) - if err != nil { - return errors.Wrap(err, "could not replace version in kind image") - } - - upgradeInfo.UpgradeComponentInfo.CAPDImageName = newImage - - return nil -} - -func (c *TkgClient) configureOSOptionsForUpgrade(regionalClusterClient clusterclient.Client, options *UpgradeClusterOptions) error { - if options.OSName == "" && options.OSVersion == "" && options.OSArch == "" { - clusterObject := &capi.Cluster{} - if err := regionalClusterClient.GetResource(clusterObject, options.ClusterName, options.Namespace, nil, nil); err != nil { - return errors.Wrap(err, "unable to get cluster object") - } - - // Get `osInfo` annotation from cluster object to determine - // the default OS info to use during the upgrade - annotations := clusterObject.GetAnnotations() - osInfo := annotations["osInfo"] - if osInfo != "" { - osMetadataTotalValues := 3 // contains 3 values, name,version,arch - osMetadata := strings.Split(osInfo, ",") - if len(osMetadata) == osMetadataTotalValues { - options.OSName = osMetadata[0] - options.OSVersion = osMetadata[1] - options.OSArch = osMetadata[2] - log.V(3).Infof("Detected OS for cluster: %v %v %v", options.OSName, options.OSVersion, options.OSArch) - } - } - - // if this values are still empty meaning that this is old cluster created with - // TKG CLI v1.2 which does not store OS information to the cluster - // So, use TKG v1.2 Default values for OS for upgrading clusters - if options.OSName == "" && options.OSVersion == "" && options.OSArch == "" { - kcp, err := regionalClusterClient.GetKCPObjectForCluster(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrapf(err, "unable to find control plane node object for cluster %s", options.ClusterName) - } - - provider := "" - switch kcp.Spec.MachineTemplate.InfrastructureRef.Name { - case constants.KindVSphereMachineTemplate: - provider = constants.InfrastructureProviderVSphere - case constants.KindAWSMachineTemplate: - provider = constants.InfrastructureProviderAWS - case constants.KindAzureMachineTemplate: - provider = constants.InfrastructureProviderAzure - case constants.KindDockerMachineTemplate: - } - - osInfo := tkgconfighelper.GetDefaultOsOptionsForTKG12(provider) - options.OSName = osInfo.Name - options.OSVersion = osInfo.Version - options.OSArch = osInfo.Arch - log.V(3).Infof("Unable to detect current OS for the cluster. Using name:%v version:%v arch:%v", options.OSName, options.OSVersion, options.OSArch) - } - } - - log.V(3).Infof("Using OS options, name:%v version:%v arch:%v", options.OSName, options.OSVersion, options.OSArch) - - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSName, options.OSName) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSVersion, options.OSVersion) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSArch, options.OSArch) - - return nil -} diff --git a/tkg/client/upgrade_cluster_clusterclass.go b/tkg/client/upgrade_cluster_clusterclass.go deleted file mode 100644 index e6ca6be67d..0000000000 --- a/tkg/client/upgrade_cluster_clusterclass.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "fmt" - "time" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -func (c *TkgClient) DoClassyClusterUpgrade(regionalClusterClient clusterclient.Client, - currentClusterClient clusterclient.Client, options *UpgradeClusterOptions) error { - - kubernetesVersion := options.KubernetesVersion - tkrVersion := options.TkrVersion - - log.Infof("Upgrading kubernetes cluster to `%v` version, tkr version: `%s`", kubernetesVersion, tkrVersion) - patchJSONString := fmt.Sprintf(`{"spec": {"topology": {"version": "%v"}}}`, tkrVersion) - - // Timeout set to 30 minutes because the continuousTKRDiscoverFreq for tkr-source-controller's fetcher is 10 minutes. - // And kapp package reconcile frequency is 10 minutes. - // Wait time should be longer than the fetcher's frequency of pulling tkrs plus the frequency of kapp package reconciliation. - pollOptions := &clusterclient.PollOptions{Interval: upgradePatchInterval, Timeout: 30 * time.Minute} - err := regionalClusterClient.PatchClusterObjectWithPollOptions(options.ClusterName, options.Namespace, patchJSONString, pollOptions) - if err != nil { - return errors.Wrap(err, "unable to patch kubernetes version to cluster") - } - - log.Info("Waiting for kubernetes version to be updated for control plane nodes...") - err = regionalClusterClient.WaitK8sVersionUpdateForCPNodes(options.ClusterName, options.Namespace, kubernetesVersion, currentClusterClient) - if err != nil { - return errors.Wrap(err, "error waiting for kubernetes version update for kubeadm control plane") - } - - log.Info("Waiting for kubernetes version to be updated for worker nodes...") - err = regionalClusterClient.WaitK8sVersionUpdateForWorkerNodes(options.ClusterName, options.Namespace, kubernetesVersion, currentClusterClient) - if err != nil { - return errors.Wrap(err, "error waiting for kubernetes version update for worker nodes") - } - - if !options.IsRegionalCluster { - // update autoscaler deployment if enabled - err = regionalClusterClient.ApplyPatchForAutoScalerDeployment(c.tkgBomClient, options.ClusterName, options.KubernetesVersion, options.Namespace) - if err != nil { - return errors.Wrapf(err, "failed to upgrade autoscaler for cluster '%s'", options.ClusterName) - } - } - - return nil -} diff --git a/tkg/client/upgrade_cluster_test.go b/tkg/client/upgrade_cluster_test.go deleted file mode 100644 index c86aa98e48..0000000000 --- a/tkg/client/upgrade_cluster_test.go +++ /dev/null @@ -1,1343 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "fmt" - "os" - "path/filepath" - "time" - - "sigs.k8s.io/yaml" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - apitypes "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/version" - "k8s.io/client-go/discovery" - fakediscovery "k8s.io/client-go/discovery/fake" - fakeclientset "k8s.io/client-go/kubernetes/fake" - capav1beta2 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - capibootstrapkubeadmv1beta1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" - capikubeadmv1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" // nolint:staticcheck,nolintlint - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -var ( - newK8sVersion = "v1.18.0+vmware.1" - newTKRVersion = "v1.18.0+vmware.1-tkg.2" - currentK8sVersion = "v1.17.3+vmware.2" - kubeVipPodString = ` -apiVersion: v1 -kind: Pod -metadata: - creationTimestamp: ~ - name: kube-vip - namespace: kube-system -spec: - containers: - - - args: - - start - env: - - - name: vip_arp - value: "true" - - - name: vip_leaderelection - value: "true" - - - name: address - value: "10.180.122.23" - - - name: vip_interface - value: eth0 - - - name: vip_leaseduration - value: "15" - - - name: vip_renewdeadline - value: "10" - - - name: vip_retryperiod - value: "2" - image: "projects.registry.vmware.com/tkg/kube-vip:v0.3.3_vmware.1" - imagePullPolicy: IfNotPresent - name: kube-vip - resources: {} - securityContext: - capabilities: - add: - - NET_ADMIN - - SYS_TIME - volumeMounts: - - - mountPath: /etc/kubernetes/admin.conf - name: kubeconfig - hostNetwork: true - volumes: - - - hostPath: - path: /etc/kubernetes/admin.conf - type: FileOrCreate - name: kubeconfig -status: {}` - - fakeAWSClusterName = "fake-aws-cluster-name" - fakeAWSClusterNamespace = "fake-aws-cluster-namespace" -) - -var _ = Describe("Unit tests for upgrading legacy cluster", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - currentClusterClient *fakes.ClusterClient - tkgClient *TkgClient - upgradeClusterOptions UpgradeClusterOptions - vcClient *fakes.VCClient - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - currentClusterClient = &fakes.ClusterClient{} - - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Millisecond) - - vcClient = &fakes.VCClient{} - vcClient.GetAndValidateVirtualMachineTemplateReturns(&types.VSphereVirtualMachine{ - Moid: "vm-1", - }, nil) - regionalClusterClient.GetVCClientAndDataCenterReturns(vcClient, "", nil) - Expect(err).NotTo(HaveOccurred()) - - upgradeClusterOptions = UpgradeClusterOptions{ - ClusterName: "fake-cluster-name", - Namespace: "fake-namespace", - KubernetesVersion: newK8sVersion, - TkrVersion: newTKRVersion, - IsRegionalCluster: false, - SkipAddonUpgrade: true, - } - }) - Describe(" Validate DoLegacyClusterUpgrade() block Kubernetes version downgrade", func() { - BeforeEach(func() { - newK8sVersion = "v1.18.0+vmware.1" // nolint:goconst - currentK8sVersion = "v1.17.3+vmware.2" // nolint:goconst - setupBomFile("../fakes/config/bom/tkg-bom-v1.3.1.yaml", testingDir) - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - regionalClusterClient.GetResourceReturns(nil) - regionalClusterClient.PatchResourceReturns(nil) - currentClusterClient.GetKubernetesVersionReturns(currentK8sVersion, nil) - }) - JustBeforeEach(func() { - err = tkgClient.DoLegacyClusterUpgrade(regionalClusterClient, currentClusterClient, &upgradeClusterOptions) - }) - Context("When unable to get current k8s version of cluster", func() { - BeforeEach(func() { - currentClusterClient.GetKubernetesVersionReturns("", errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("kubernetes version verification failed: unable to get current kubernetes version for the cluster")) - }) - }) - Context("When get current k8s version > new version of cluster only in +vmware.", func() { - BeforeEach(func() { - upgradeClusterOptions.KubernetesVersion = "v1.18.0+vmware.1" - upgradeClusterOptions.TkrVersion = "v1.18.0+vmware.1-tkg.2" - currentClusterClient.GetKubernetesVersionReturns("v1.18.0+vmware.2", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("attempted to upgrade kubernetes from v1.18.0+vmware.2 to v1.18.0+vmware.1. Kubernetes version downgrade is not allowed.")) - }) - }) - Context("When get current k8s version > new version of cluster only in +vmware.", func() { - BeforeEach(func() { - upgradeClusterOptions.KubernetesVersion = "v1.18.0+vmware.2" // nolint:goconst - upgradeClusterOptions.TkrVersion = "v1.18.0+vmware.2-tkr.2" // nolint:goconst - currentClusterClient.GetKubernetesVersionReturns("v1.18.0+vmware.11", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("attempted to upgrade kubernetes from v1.18.0+vmware.11 to v1.18.0+vmware.2. Kubernetes version downgrade is not allowed.")) - }) - }) - Context("When get current k8s version > new version of cluster only in +vmware.", func() { - BeforeEach(func() { - upgradeClusterOptions.KubernetesVersion = "v1.18.0+vmware.2" - upgradeClusterOptions.TkrVersion = "v1.18.0+vmware.2-tkr.2" - currentClusterClient.GetKubernetesVersionReturns("v2.18.0+vmware.11", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("attempted to upgrade kubernetes from v2.18.0+vmware.11 to v1.18.0+vmware.2. Kubernetes version downgrade is not allowed.")) - }) - }) - Context("When get current k8s version < new version of cluster only in +vmware. but TKR label update failed", func() { - BeforeEach(func() { - upgradeClusterOptions.KubernetesVersion = "v1.18.0+vmware.1" - upgradeClusterOptions.TkrVersion = "v1.18.0+vmware.1-tkg.2" - currentClusterClient.GetKubernetesVersionReturns("v1.18.0+vmware.0", nil) - regionalClusterClient.PatchClusterObjectWithPollOptionsReturns(errors.New("fake TKR patch error")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake TKR patch error")) - }) - }) - }) - - Describe("When upgrading cluster", func() { - BeforeEach(func() { - newK8sVersion = "v1.18.0+vmware.1" - currentK8sVersion = "v1.17.3+vmware.2" - setupBomFile("../fakes/config/bom/tkg-bom-v1.3.1.yaml", testingDir) - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - regionalClusterClient.GetKCPObjectForClusterReturns(getDummyKCP(constants.KindVSphereMachineTemplate), nil) - regionalClusterClient.GetResourceReturns(nil) - regionalClusterClient.PatchResourceReturns(nil) - regionalClusterClient.WaitK8sVersionUpdateForWorkerNodesReturns(nil) - regionalClusterClient.WaitK8sVersionUpdateForCPNodesReturns(nil) - regionalClusterClient.GetMDObjectForClusterReturns(getDummyMD(), nil) - currentClusterClient.GetKubernetesVersionReturns(currentK8sVersion, nil) - }) - JustBeforeEach(func() { - err = tkgClient.DoClusterUpgrade(regionalClusterClient, currentClusterClient, &upgradeClusterOptions) - }) - Context("When KCP object retrival fails from management cluster", func() { - BeforeEach(func() { - regionalClusterClient.GetKCPObjectForClusterReturns(nil, errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to find control plane node object for cluster")) - }) - }) - - Context("When environment is Vsphere", func() { - BeforeEach(func() { - regionalClusterClient.GetKCPObjectForClusterReturns(getDummyKCP(constants.KindVSphereMachineTemplate), nil) - }) - - Context("When get/verification of vsphere template fails", func() { - BeforeEach(func() { - vcClient.GetAndValidateVirtualMachineTemplateReturns(nil, errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to get/verify vsphere template")) - }) - }) - Context("When get VSphereMachineTemplate fails", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceReturnsOnCall(0, nil) - regionalClusterClient.GetResourceReturns(errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to find VSphereMachineTemplate with name")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When create VSphereMachineTemplate fails", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceReturnsOnCall(0, nil) - regionalClusterClient.GetResourceReturnsOnCall(1, nil) - regionalClusterClient.GetResourceReturnsOnCall(2, errors.New("fake-error")) - regionalClusterClient.CreateResourceReturns(errors.New("fake-error-create-resource")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to create VSphereMachineTemplate for upgrade with name")) - Expect(err.Error()).To(ContainSubstring("fake-error-create-resource")) - - i, _, _, _ := regionalClusterClient.CreateResourceArgsForCall(0) - template := i.(*capvv1beta1.VSphereMachineTemplate) - Expect(template.Annotations["vmTemplateMoid"]).To(Equal("vm-1")) - }) - }) - Context("template upgrade is not required", func() { - BeforeEach(func() { - dummyKcp := getDummyKCP(constants.KindVSphereMachineTemplate) - dummyKcp.Spec.Version = newK8sVersion - regionalClusterClient.GetKCPObjectForClusterReturns(dummyKcp, nil) - dummyMd := getDummyMD() - dummyMd[0].Spec.Template.Spec.Version = &newK8sVersion - regionalClusterClient.GetMDObjectForClusterReturns(dummyMd, nil) - callIndex := 0 - regionalClusterClient.GetResourceStub = func(i interface{}, s1, s2 string, pvf clusterclient.PostVerifyrFunc, po *clusterclient.PollOptions) error { - if callIndex == 0 { - cluster := i.(*capi.Cluster) - *cluster = capi.Cluster{} - } - if callIndex == 1 || callIndex == 2 { - mt := i.(*capvv1beta1.VSphereMachineTemplate) - *mt = capvv1beta1.VSphereMachineTemplate{ - ObjectMeta: metav1.ObjectMeta{ - Annotations: map[string]string{ - "vmTemplateMoid": "vm-1", - }, - }, - } - } - callIndex++ - return nil - } - }) - It("should not create a new KubeadmConfigTemplate", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(regionalClusterClient.CreateResourceCallCount()).To(Equal(0)) - }) - }) - - Context("When kube-vip is control plane ha", func() { - Context("When kube-vip manifest in KCP is correct", func() { - BeforeEach(func() { - regionalClusterClient.GetKCPObjectForClusterReturns(getDummyKCP(constants.KindVSphereMachineTemplate), nil) - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("When kube-vip manifest in KCP is incorrect", func() { - BeforeEach(func() { - regionalClusterClient.GetKCPObjectForClusterReturns(getDummyKCPWithKubevipManifest(constants.KindVSphereMachineTemplate, "wrong"), nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - }) - - Context("When avi is control plane ha", func() { - BeforeEach(func() { - regionalClusterClient.GetKCPObjectForClusterReturns(getDummyKCPWithoutKubevip(constants.KindVSphereMachineTemplate), nil) - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Context("When environment is AWS", func() { - BeforeEach(func() { - regionalClusterClient.GetKCPObjectForClusterReturns(getDummyKCP(constants.KindAWSMachineTemplate), nil) - regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - clusterObj, ok := resourceReference.(*capav1beta2.AWSCluster) - if !ok { - return nil - } - *clusterObj = capav1beta2.AWSCluster{Spec: capav1beta2.AWSClusterSpec{Region: "us-west-2"}} - return nil - }) - }) - - Context("When get AWSCluster object fails", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceReturnsOnCall(0, nil) - regionalClusterClient.GetResourceReturnsOnCall(1, errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to retrieve aws cluster object to retrieve AMI settings")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When get AWSMachineTemplate object fails", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if regionalClusterClient.GetResourceCallCount() == 3 { - return errors.New("fake-error") - } - clusterObj, ok := resourceReference.(*capav1beta2.AWSCluster) - if !ok { - return nil - } - *clusterObj = capav1beta2.AWSCluster{Spec: capav1beta2.AWSClusterSpec{Region: "us-west-2"}} - return nil - }) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to find AWSMachineTemplate with name")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When get AWSMachineTemplate object fails", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if regionalClusterClient.GetResourceCallCount() == 3 { - return errors.New("fake-error") - } - clusterObj, ok := resourceReference.(*capav1beta2.AWSCluster) - if !ok { - return nil - } - *clusterObj = capav1beta2.AWSCluster{Spec: capav1beta2.AWSClusterSpec{Region: "us-west-2"}} - return nil - }) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to find AWSMachineTemplate with name")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When create AWSMachineTemplate fails", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if regionalClusterClient.GetResourceCallCount() == 4 { - return errors.New("fake-error") - } - clusterObj, ok := resourceReference.(*capav1beta2.AWSCluster) - if !ok { - return nil - } - *clusterObj = capav1beta2.AWSCluster{Spec: capav1beta2.AWSClusterSpec{Region: "us-west-2"}} - return nil - }) - regionalClusterClient.CreateResourceReturns(errors.New("fake-error-create-resource")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to create AWSMachineTemplate for upgrade with name")) - Expect(err.Error()).To(ContainSubstring("fake-error-create-resource")) - }) - }) - Context("When Get Cluster MachineDeployment Object fails", func() { - BeforeEach(func() { - regionalClusterClient.GetMDObjectForClusterReturns(nil, errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to get MachineDeployment for cluster with name")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When Get Cluster MachineDeployment Object fails", func() { - BeforeEach(func() { - regionalClusterClient.GetMDObjectForClusterReturns(nil, errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to get MachineDeployment for cluster with name")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - }) - - Context("When environment is Azure", func() { - BeforeEach(func() { - regionalClusterClient.GetKCPObjectForClusterReturns(getDummyKCP(constants.KindAzureMachineTemplate), nil) - regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - return nil - }) - }) - - // Context("When get AzureMachineTemplate object fails", func() { - // BeforeEach(func() { - // regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - // if regionalClusterClient.GetResourceCallCount() == 2 { - // return errors.New("fake-error") - // } - // return nil - // }) - // }) - // It("returns an error", func() { - // Expect(err).To(HaveOccurred()) - // Expect(err.Error()).To(ContainSubstring("unable to find AzureMachineTemplate with name")) - // Expect(err.Error()).To(ContainSubstring("fake-error")) - // }) - // }) - // Context("When create AzureMachineTemplate fails", func() { - // BeforeEach(func() { - // regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - // if regionalClusterClient.GetResourceCallCount() == 3 { - // return errors.New("fake-error") - // } - // return nil - // }) - // regionalClusterClient.CreateResourceReturns(errors.New("fake-error-create-resource")) - // }) - // It("returns an error", func() { - // Expect(err).To(HaveOccurred()) - // Expect(err.Error()).To(ContainSubstring("unable to create AzureMachineTemplate for upgrade with name")) - // Expect(err.Error()).To(ContainSubstring("fake-error-create-resource")) - // }) - // }) - Context("When Get Cluster MachineDeployment Object fails", func() { - BeforeEach(func() { - regionalClusterClient.GetMDObjectForClusterReturns(nil, errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to get MachineDeployment for cluster with name")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - }) - - Context("When patch KCP fails", func() { - BeforeEach(func() { - regionalClusterClient.PatchResourceReturns(errors.New("fake-error-patch-resource")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to patch the kubernetes version for kubeadm control plane nodes")) - Expect(err.Error()).To(ContainSubstring("fake-error-patch-resource")) - }) - }) - Context("When KCP patch apply succeeded but k8s version never gets updated", func() { - BeforeEach(func() { - regionalClusterClient.WaitK8sVersionUpdateForCPNodesReturns(errors.New("fake-error-wait-k8s-update")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error waiting for kubernetes version update for kubeadm control plane")) - Expect(err.Error()).To(ContainSubstring("fake-error-wait-k8s-update")) - }) - }) - Context("When GetClusterMachineDeploymentObject fails", func() { - BeforeEach(func() { - regionalClusterClient.GetMDObjectForClusterReturns(nil, errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to create infrastructure template for upgrade: unable to get MachineDeployment for cluster with name")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When patch MD fails", func() { - BeforeEach(func() { - regionalClusterClient.PatchResourceReturnsOnCall(1, errors.New("fake-error-patch-resource-md")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to update the kubernetes version for worker nodes")) - Expect(err.Error()).To(ContainSubstring("fake-error-patch-resource-md")) - }) - }) - Context("When MD patch apply succeeded but k8s version never gets updated in machine objects", func() { - BeforeEach(func() { - regionalClusterClient.WaitK8sVersionUpdateForWorkerNodesReturns(errors.New("fake-error-wait-k8s-update-worker-nodes")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error waiting for kubernetes version update for worker nodes")) - Expect(err.Error()).To(ContainSubstring("fake-error-wait-k8s-update-worker-nodes")) - }) - }) - Context("When everything is successful", func() { - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) -}) - -var _ = Describe("When upgrading cluster with fake controller runtime client", func() { - var ( - err error - regionalClusterClient clusterclient.Client - currentClusterClient clusterclient.Client - crtClientFactory *fakes.CrtClientFactory - discoveryClientFactory *fakes.DiscoveryClientFactory - tkgClient *TkgClient - upgradeClusterOptions UpgradeClusterOptions - - kubeconfig string - clusterClientOptions clusterclient.Options - fakeRegionalClusterClientSet crtclient.Client - fakeCurrentClusterClientSet crtclient.Client - fakeRegionalDiscoveryClient discovery.DiscoveryInterface - fakeCurrentDiscoveryClient discovery.DiscoveryInterface - regionalClusterOptions fakehelper.TestAllClusterComponentOptions - - verificationClientFactory *clusterclient.VerificationClientFactory - verifyKubernetesUpgradeFunc func(clusterStatusInfo *clusterclient.ClusterStatusInfo, newK8sVersion string) error - getVCClientAndDataCenter func(clusterName, clusterNamespace, vsphereMachineTemplateObjectName string) (vc.Client, string, error) - - regionalClusterK8sVersion string - currentClusterK8sVersion string - - vcClient *fakes.VCClient - fakeClusterClient *fakes.ClusterClient - ) - - getDiscoveryClient := func(k8sVersion string) *fakediscovery.FakeDiscovery { - client := fakeclientset.NewSimpleClientset() - fakeDiscovery, ok := client.Discovery().(*fakediscovery.FakeDiscovery) - Expect(ok).To(Equal(true)) - - fakeDiscovery.FakedServerVersion = &version.Info{ - GitVersion: k8sVersion, - } - return fakeDiscovery - } - - verifyKubernetesUpgradeFunc = func(clusterStatusInfo *clusterclient.ClusterStatusInfo, newK8sVersion string) error { - return nil - } - - getVCClientAndDataCenter = func(clusterName, clusterNamespace, vsphereMachineTemplateObjectName string) (vc.Client, string, error) { //nolint:unparam - return vcClient, "dc0", nil - } - - configureTKGClient := func() { - vcClient = &fakes.VCClient{} - fakeClusterClient = &fakes.ClusterClient{} - vcClient.GetAndValidateVirtualMachineTemplateReturns(&types.VSphereVirtualMachine{}, nil) - - kubeconfig = fakehelper.GetFakeKubeConfigFilePath(testingDir, "../fakes/config/kubeconfig/config1.yaml") - crtClientFactory = &fakes.CrtClientFactory{} - discoveryClientFactory = &fakes.DiscoveryClientFactory{} - - verificationClientFactory = &clusterclient.VerificationClientFactory{ - VerifyKubernetesUpgradeFunc: verifyKubernetesUpgradeFunc, - GetVCClientAndDataCenter: getVCClientAndDataCenter, - } - clusterClientOptions = clusterclient.NewOptions(getFakePoller(), crtClientFactory, discoveryClientFactory, verificationClientFactory) - - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeRegionalClusterClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(fakehelper.GetAllCAPIClusterObjects(regionalClusterOptions)...).Build() - crtClientFactory.NewClientReturns(fakeRegionalClusterClientSet, nil) - fakeRegionalDiscoveryClient = getDiscoveryClient(regionalClusterK8sVersion) - discoveryClientFactory.NewDiscoveryClientForConfigReturns(fakeRegionalDiscoveryClient, nil) - regionalClusterClient, err = clusterclient.NewClient(kubeconfig, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - // create a fake controller-runtime cluster with the []runtime.Object mentioned with createClusterOptions - fakeCurrentClusterClientSet = fake.NewClientBuilder().WithScheme(scheme).Build() - crtClientFactory.NewClientReturns(fakeCurrentClusterClientSet, nil) - fakeCurrentDiscoveryClient = getDiscoveryClient(currentClusterK8sVersion) - discoveryClientFactory.NewDiscoveryClientForConfigReturns(fakeCurrentDiscoveryClient, nil) - currentClusterClient, err = clusterclient.NewClient(kubeconfig, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Millisecond) - Expect(err).NotTo(HaveOccurred()) - } - - BeforeEach(func() { - upgradeClusterOptions = UpgradeClusterOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - KubernetesVersion: newK8sVersion, - IsRegionalCluster: false, - VSphereTemplateName: "fake-template", - SkipAddonUpgrade: true, - } - }) - Describe("When upgrading a legacy cluster with fake controller runtime client", func() { - BeforeEach(func() { - newK8sVersion = "v1.18.0+vmware.1" - currentK8sVersion = "v1.17.3+vmware.2" - setupBomFile("../fakes/config/bom/tkg-bom-v1.3.1.yaml", testingDir) - os.Setenv("SKIP_VSPHERE_TEMPLATE_VERIFICATION", "1") - regionalClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - K8sVersion: "v1.18.2+vmware.1", - InfrastructureTemplate: fakehelper.TestObject{ - Kind: constants.KindVSphereMachineTemplate, - Name: "cluster-1-control-plane", - Namespace: constants.DefaultNamespace, - }, - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - InfrastructureTemplate: fakehelper.TestObject{ - Kind: constants.KindVSphereMachineTemplate, - Name: "cluster-1-md-0", - Namespace: constants.DefaultNamespace, - }, - }), - ClusterConfigurationOptions: fakehelper.TestClusterConfiguration{ - ImageRepository: "fake.image.repository", - DNSImageRepository: "fake.image.repository", - DNSImageTag: "v1.6.7_vmware.1", - EtcdImageRepository: "fake.image.repository", - EtcdImageTag: "v3.4.3_vmware.5", - }, - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - - JustBeforeEach(func() { - configureTKGClient() - err = tkgClient.DoClusterUpgrade(regionalClusterClient, currentClusterClient, &upgradeClusterOptions) - }) - - // Context("When get current k8s version < new version of cluster only in +vmware.", func() { - // BeforeEach(func() { - // upgradeClusterOptions.KubernetesVersion = "v1.18.0+vmware.1" - // currentClusterK8sVersion = "v1.18.0+vmware.0" - // }) - // It("should not return an error", func() { - // Expect(err).NotTo(HaveOccurred()) - // }) - // }) - - // Context("When get current k8s version == new version of cluster", func() { - // BeforeEach(func() { - // upgradeClusterOptions.KubernetesVersion = "v1.18.0+vmware.1" - // currentClusterK8sVersion = "v1.18.0+vmware.1" - // }) - // It("should not return an error", func() { - // Expect(err).NotTo(HaveOccurred()) - // }) - // }) - // Context("When get current k8s version < new version of cluster", func() { - // BeforeEach(func() { - // currentClusterK8sVersion = "v1.18.0+vmware.0" - // }) - // It("should not return an error", func() { - // Expect(err).NotTo(HaveOccurred()) - // }) - // }) - - var _ = Describe("Test PatchKubernetesVersionToKubeadmControlPlane", func() { - Context("Testing EtcdExtraArgs parameter configuration", func() { - It("when EtcdExtraArgs is defined", func() { - clusterUpgradeConfig := &ClusterUpgradeInfo{ - ClusterName: "cluster-1", - ClusterNamespace: constants.DefaultNamespace, - KCPObjectName: "fake-name", - KCPObjectNamespace: "fake-namespace", - UpgradeComponentInfo: ComponentInfo{ - EtcdExtraArgs: map[string]string{"fake-arg": "fake-arg-value"}, - KubernetesVersion: "v1.18.0+vmware.2", - }, - ActualComponentInfo: ComponentInfo{ - KubernetesVersion: "v1.18.0+vmware.1", - }, - } - fakeClusterClient.GetKCPObjectForClusterReturns(getDummyKCP(constants.KindVSphereMachineTemplate), nil) - - err = tkgClient.PatchKubernetesVersionToKubeadmControlPlane(fakeClusterClient, clusterUpgradeConfig) - Expect(err).To(BeNil()) - - Expect(fakeClusterClient.GetKCPObjectForClusterCallCount()).To(Equal(1)) - cname, cspace := fakeClusterClient.GetKCPObjectForClusterArgsForCall(0) - Expect(cname).To(Equal("cluster-1")) - Expect(cspace).To(Equal(constants.DefaultNamespace)) - - Expect(fakeClusterClient.PatchResourceCallCount()).To(Equal(1)) - _, getCName, getCSpace, gotPatch, gotPatchType, _ := fakeClusterClient.PatchResourceArgsForCall(0) - Expect(getCName).To(Equal("fake-name")) - Expect(getCSpace).To(Equal("fake-namespace")) - Expect(gotPatch).To(ContainSubstring("\"extraArgs\":{\"fake-arg\":\"fake-arg-value\"}")) - Expect(gotPatchType).To(Equal(apitypes.MergePatchType)) - }) - - It("when EtcdExtraArgs is empty", func() { - clusterUpgradeConfig := &ClusterUpgradeInfo{ - ClusterName: "cluster-1", - ClusterNamespace: constants.DefaultNamespace, - KCPObjectName: "fake-name", - KCPObjectNamespace: "fake-namespace", - UpgradeComponentInfo: ComponentInfo{ - EtcdExtraArgs: map[string]string{}, - KubernetesVersion: "v1.18.0+vmware.2", - }, - ActualComponentInfo: ComponentInfo{ - KubernetesVersion: "v1.18.0+vmware.1", - }, - } - fakeClusterClient.GetKCPObjectForClusterReturns(getDummyKCP(constants.KindVSphereMachineTemplate), nil) - err = tkgClient.PatchKubernetesVersionToKubeadmControlPlane(fakeClusterClient, clusterUpgradeConfig) - Expect(err).To(BeNil()) - - Expect(fakeClusterClient.GetKCPObjectForClusterCallCount()).To(Equal(1)) - cname, cspace := fakeClusterClient.GetKCPObjectForClusterArgsForCall(0) - Expect(cname).To(Equal("cluster-1")) - Expect(cspace).To(Equal(constants.DefaultNamespace)) - - Expect(fakeClusterClient.PatchResourceCallCount()).To(Equal(1)) - _, getCName, getCSpace, gotPatch, gotPatchType, _ := fakeClusterClient.PatchResourceArgsForCall(0) - Expect(getCName).To(Equal("fake-name")) - Expect(getCSpace).To(Equal("fake-namespace")) - Expect(gotPatch).ToNot(ContainSubstring("extraArgs")) - Expect(gotPatchType).To(Equal(apitypes.MergePatchType)) - }) - }) - }) - - var _ = Describe("Test helper functions", func() { - var ( - clusterUpgradeConfig *ClusterUpgradeInfo - kubeVipImage = "gcr.io/kube-vip" - KubeVipTag = "3.1" - ) - BeforeEach(func() { - clusterUpgradeConfig = &ClusterUpgradeInfo{ - ClusterName: "cluster-1", - ClusterNamespace: constants.DefaultNamespace, - KCPObjectName: "fake-name", - KCPObjectNamespace: "fake-namespace", - UpgradeComponentInfo: ComponentInfo{ - KubernetesVersion: "v1.18.0+vmware.2", - KubeVipFullImagePath: kubeVipImage, - KubeVipTag: KubeVipTag, - }, - ActualComponentInfo: ComponentInfo{ - KubernetesVersion: "v1.18.0+vmware.1", - }, - } - }) - Context("Testing the kube-vip modifier helper function", func() { - It("modifies the kube-vip parameters", func() { - pod := corev1.Pod{} - err := yaml.Unmarshal([]byte(kubeVipPodString), &pod) - Expect(err).To(BeNil()) - - newPodString, err := ModifyKubeVipAndSerialize(&pod, "30", "20", "4", kubeVipImage, KubeVipTag) - Expect(err).To(BeNil()) - - Expect(newPodString).ToNot(BeNil()) - }) - }) - Context("Testing the KCP modifier helper function", func() { - It("Updates the KCP object with increased timeouts", func() { - currentKCP := getDummyKCP(constants.KindVSphereMachineTemplate) - newKCP, err := tkgClient.UpdateKubeVipConfigInKCP(currentKCP, clusterUpgradeConfig.UpgradeComponentInfo) - - Expect(err).To(BeNil()) - Expect(len(newKCP.Spec.KubeadmConfigSpec.Files)).To(Equal(1)) - Expect(newKCP.Spec.KubeadmConfigSpec.Files[0].Content).To(ContainSubstring("value: \"30\"")) - Expect(newKCP.Spec.KubeadmConfigSpec.Files[0].Content).To(ContainSubstring("name: cp_enable")) - Expect(newKCP.Spec.KubeadmConfigSpec.Files[0].Content).To(ContainSubstring("NET_RAW")) - Expect(newKCP.Spec.KubeadmConfigSpec.Files[0].Content).To(ContainSubstring(fmt.Sprintf("%s:%s", kubeVipImage, KubeVipTag))) - }) - - It("return error if kcp doesn't contain kube-vip since it's AVI as control plane HA", func() { - currentKCP := getDummyKCPWithoutKubevip(constants.KindVSphereMachineTemplate) - _, err := tkgClient.UpdateKubeVipConfigInKCP(currentKCP, clusterUpgradeConfig.UpgradeComponentInfo) - - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(ErrUnableToFindKubeVipPodManifest.Error())) - }) - }) - }) - }) - - Describe("When upgrading clusterclass-based cluster with fake controller runtime client", func() { - - BeforeEach(func() { - upgradeClusterOptions.KubernetesVersion = "v1.18.2+vmware.1" - upgradeClusterOptions.TkrVersion = "v1.18.2+vmware.1-tkg.1" - currentK8sVersion = "v1.17.3+vmware.2" - setupBomFile("../fakes/config/bom/tkg-bom-v1.3.1.yaml", testingDir) - os.Setenv("SKIP_VSPHERE_TEMPLATE_VERIFICATION", "1") - - regionalClusterOptions = fakehelper.TestAllClusterComponentOptions{ - ClusterName: "cluster-1", - Namespace: constants.DefaultNamespace, - Labels: map[string]string{ - TkgLabelClusterRolePrefix + TkgLabelClusterRoleWorkload: "", - }, - ClusterOptions: fakehelper.TestClusterOptions{ - Phase: "provisioned", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - }, - ClusterTopology: fakehelper.TestClusterTopology{ - Class: "test-fake-clusterclass", - Version: currentK8sVersion, - }, - CPOptions: fakehelper.TestCPOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - K8sVersion: "v1.18.2+vmware.1", - InfrastructureTemplate: fakehelper.TestObject{ - Kind: constants.KindVSphereMachineTemplate, - Name: "cluster-1-control-plane", - Namespace: constants.DefaultNamespace, - }, - }, - ListMDOptions: fakehelper.GetListMDOptionsFromMDOptions(fakehelper.TestMDOptions{ - SpecReplicas: 3, - ReadyReplicas: 3, - UpdatedReplicas: 3, - Replicas: 3, - InfrastructureTemplate: fakehelper.TestObject{ - Kind: constants.KindVSphereMachineTemplate, - Name: "cluster-1-md-0", - Namespace: constants.DefaultNamespace, - }, - }), - ClusterConfigurationOptions: fakehelper.TestClusterConfiguration{ - ImageRepository: "fake.image.repository", - DNSImageRepository: "fake.image.repository", - DNSImageTag: "v1.6.7_vmware.1", - EtcdImageRepository: "fake.image.repository", - EtcdImageTag: "v3.4.3_vmware.5", - }, - MachineOptions: []fakehelper.TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - } - }) - - Context("Verify the .spec.topology.version got updated and cluster upgrade is successful", func() { - BeforeEach(func() { - configureTKGClient() - Expect(regionalClusterClient).NotTo(BeNil()) - - err = tkgClient.DoClassyClusterUpgrade(regionalClusterClient, currentClusterClient, &upgradeClusterOptions) - }) - - It("should return an error", func() { - Expect(err).To(BeNil()) - Expect(regionalClusterClient).NotTo(BeNil()) - Expect(upgradeClusterOptions).NotTo(BeNil()) - cluster := &capi.Cluster{} - err = regionalClusterClient.GetResource(cluster, upgradeClusterOptions.ClusterName, upgradeClusterOptions.Namespace, nil, nil) - Expect(err).To(BeNil()) - Expect(cluster.Spec.Topology.Version).To(Equal(upgradeClusterOptions.TkrVersion)) - }) - }) - }) -}) - -var _ = Describe("Unit tests for clusterclass-based upgrade", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - currentClusterClient *fakes.ClusterClient - tkgClient *TkgClient - upgradeClusterOptions UpgradeClusterOptions - k8sVersionPrefix string - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - currentClusterClient = &fakes.ClusterClient{} - - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Millisecond) - - upgradeClusterOptions = UpgradeClusterOptions{ - ClusterName: "fake-cluster-name", - Namespace: "fake-namespace", - KubernetesVersion: "v1.23.5+vmware.1", - TkrVersion: newTKRVersion, - IsRegionalCluster: false, - SkipAddonUpgrade: true, - } - k8sVersionPrefix = "v1.23" - }) - - JustBeforeEach(func() { - err = tkgClient.DoClassyClusterUpgrade(regionalClusterClient, currentClusterClient, &upgradeClusterOptions) - }) - Context("When cluster patch fails", func() { - BeforeEach(func() { - regionalClusterClient.PatchClusterObjectWithPollOptionsReturns(errors.New("fake-patch-error")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to patch kubernetes version to cluster: fake-patch-error")) - }) - }) - Context("When failure happens while waiting for control-plane node upgrade", func() { - BeforeEach(func() { - regionalClusterClient.PatchClusterObjectWithPollOptionsReturns(nil) - regionalClusterClient.WaitK8sVersionUpdateForCPNodesReturns(errors.New("fake-error-kcp-upgrade")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error waiting for kubernetes version update for kubeadm control plane: fake-error-kcp-upgrade")) - }) - }) - Context("When failure happens while waiting for worker node upgrade", func() { - BeforeEach(func() { - regionalClusterClient.PatchClusterObjectWithPollOptionsReturns(nil) - regionalClusterClient.WaitK8sVersionUpdateForCPNodesReturns(nil) - regionalClusterClient.WaitK8sVersionUpdateForWorkerNodesReturns(errors.New("fake-error-worker-upgrade")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error waiting for kubernetes version update for worker nodes: fake-error-worker-upgrade")) - }) - }) - Context("When failure happens while applyPatch for autoscaler upgrade", func() { - BeforeEach(func() { - regionalClusterClient.PatchClusterObjectWithPollOptionsReturns(nil) - regionalClusterClient.WaitK8sVersionUpdateForCPNodesReturns(nil) - regionalClusterClient.WaitK8sVersionUpdateForWorkerNodesReturns(nil) - regionalClusterClient.ApplyPatchForAutoScalerDeploymentReturns(errors.Errorf("autoscaler image not available for kubernetes minor version %s", k8sVersionPrefix)) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("autoscaler image not available for kubernetes minor version %s", k8sVersionPrefix)) - }) - }) - Context("When cluster patch is successful and cluster get's upgraded successfully", func() { - BeforeEach(func() { - regionalClusterClient.PatchClusterObjectWithPollOptionsReturns(nil) - regionalClusterClient.WaitK8sVersionUpdateForCPNodesReturns(nil) - regionalClusterClient.WaitK8sVersionUpdateForWorkerNodesReturns(nil) - regionalClusterClient.ApplyPatchForAutoScalerDeploymentReturns(nil) - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Unit test for prepareAddonsManagerUpgrade", func() { - var ( - regionalClusterClient fakes.ClusterClient - upgradeClusterConfig ClusterUpgradeInfo - tkgClient TkgClient - ) - BeforeEach(func() { - regionalClusterClient = fakes.ClusterClient{} - }) - When("cannot get the Cluster", func() { - It("Should return error", func() { - regionalClusterClient.GetResourceReturns(errors.New("cluster cannot found")) - err := tkgClient.PrepareAddonsManagerUpgrade(®ionalClusterClient, &upgradeClusterConfig) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster cannot found")) - Expect(regionalClusterClient.UpdateAWSCNIIngressRulesCallCount()).To(Equal(0)) - }) - }) - When("infrastructure is not aws", func() { - It("should no return error", func() { - regionalClusterClient.GetResourceReturns(nil) - err := tkgClient.PrepareAddonsManagerUpgrade(®ionalClusterClient, &upgradeClusterConfig) - Expect(err).ToNot(HaveOccurred()) - Expect(regionalClusterClient.UpdateAWSCNIIngressRulesCallCount()).To(Equal(0)) - }) - }) - When("cannot get the AWSCluster", func() { - It("should return error", func() { - regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if cluster, ok := resourceReference.(*capi.Cluster); ok { - cluster.Spec.InfrastructureRef = &corev1.ObjectReference{ - Name: fakeAWSClusterName, - Namespace: fakeAWSClusterNamespace, - Kind: constants.InfrastructureRefAWS, - } - return nil - } - if _, ok := resourceReference.(*capav1beta2.AWSCluster); ok { - return errors.New("awscluster cannot found") - } - return nil - }) - err := tkgClient.PrepareAddonsManagerUpgrade(®ionalClusterClient, &upgradeClusterConfig) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("awscluster cannot found")) - Expect(regionalClusterClient.UpdateAWSCNIIngressRulesCallCount()).To(Equal(0)) - }) - }) - When("ingress rules should be added successfully", func() { - It("should return no error", func() { - regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if cluster, ok := resourceReference.(*capi.Cluster); ok { - cluster.Spec.InfrastructureRef = &corev1.ObjectReference{ - Name: fakeAWSClusterName, - Namespace: fakeAWSClusterNamespace, - Kind: constants.InfrastructureRefAWS, - } - return nil - } - if _, ok := resourceReference.(*capav1beta2.AWSCluster); ok { - return nil - } - return nil - }) - regionalClusterClient.UpdateAWSCNIIngressRulesReturns(nil) - err := tkgClient.PrepareAddonsManagerUpgrade(®ionalClusterClient, &upgradeClusterConfig) - Expect(err).ToNot(HaveOccurred()) - callcount := regionalClusterClient.UpdateAWSCNIIngressRulesCallCount() - Expect(callcount).To(Equal(1)) - }) - }) - When("spec.network.seucrityGroupOverrides is not nil for aws cluster", func() { - It("should return no error and should not try to add aws ingress rule", func() { - regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if cluster, ok := resourceReference.(*capi.Cluster); ok { - cluster.Spec.InfrastructureRef = &corev1.ObjectReference{ - Name: fakeAWSClusterName, - Namespace: fakeAWSClusterNamespace, - Kind: constants.InfrastructureRefAWS, - } - return nil - } - if awsCluster, ok := resourceReference.(*capav1beta2.AWSCluster); ok { - securityGroupOverride := make(map[capav1beta2.SecurityGroupRole]string) - securityGroupOverride["secgroup1"] = "secrules" - awsCluster.Spec.NetworkSpec.SecurityGroupOverrides = securityGroupOverride - return nil - } - return nil - }) - regionalClusterClient.UpdateAWSCNIIngressRulesReturns(fmt.Errorf("some-error")) - err := tkgClient.PrepareAddonsManagerUpgrade(®ionalClusterClient, &upgradeClusterConfig) - Expect(err).ToNot(HaveOccurred()) - callcount := regionalClusterClient.UpdateAWSCNIIngressRulesCallCount() - Expect(callcount).To(Equal(0)) - }) - }) -}) - -var _ = Describe("Unit test for handleKappControllerUpgrade", func() { - var ( - regionalClusterClient fakes.ClusterClient - currentClusterClient fakes.ClusterClient - upgradeClusterConfig ClusterUpgradeInfo - tkgClient TkgClient - ) - BeforeEach(func() { - regionalClusterClient = fakes.ClusterClient{} - currentClusterClient = fakes.ClusterClient{} - }) - - When("existing kapp-controller cannot be deleted", func() { - It("should return error", func() { - currentClusterClient.DeleteExistingKappControllerReturns(fmt.Errorf("some-error")) - err := tkgClient.HandleKappControllerUpgrade(®ionalClusterClient, ¤tClusterClient, &upgradeClusterConfig) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to delete existing kapp-controller")) - Expect(regionalClusterClient.UpdateAWSCNIIngressRulesCallCount()).To(Equal(0)) - }) - }) - When("cannot get the Cluster", func() { - It("Should return error", func() { - currentClusterClient.DeleteExistingKappControllerReturns(nil) - regionalClusterClient.GetResourceReturns(errors.New("cluster cannot found")) - err := tkgClient.HandleKappControllerUpgrade(®ionalClusterClient, ¤tClusterClient, &upgradeClusterConfig) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster cannot found")) - Expect(regionalClusterClient.UpdateAWSCNIIngressRulesCallCount()).To(Equal(0)) - }) - }) - When("infrastructure is not aws", func() { - It("should no return error", func() { - currentClusterClient.DeleteExistingKappControllerReturns(nil) - regionalClusterClient.GetResourceReturns(nil) - err := tkgClient.HandleKappControllerUpgrade(®ionalClusterClient, ¤tClusterClient, &upgradeClusterConfig) - Expect(err).ToNot(HaveOccurred()) - Expect(regionalClusterClient.UpdateAWSCNIIngressRulesCallCount()).To(Equal(0)) - }) - }) - When("cannot get the AWSCluster", func() { - It("should return error", func() { - currentClusterClient.DeleteExistingKappControllerReturns(nil) - regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if cluster, ok := resourceReference.(*capi.Cluster); ok { - cluster.Spec.InfrastructureRef = &corev1.ObjectReference{ - Name: fakeAWSClusterName, - Namespace: fakeAWSClusterNamespace, - Kind: constants.InfrastructureRefAWS, - } - return nil - } - if _, ok := resourceReference.(*capav1beta2.AWSCluster); ok { - return errors.New("awscluster cannot found") - } - return nil - }) - err := tkgClient.HandleKappControllerUpgrade(®ionalClusterClient, ¤tClusterClient, &upgradeClusterConfig) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("awscluster cannot found")) - Expect(regionalClusterClient.UpdateAWSCNIIngressRulesCallCount()).To(Equal(0)) - }) - }) - When("ingress rules should be added successfully", func() { - It("should return no error", func() { - currentClusterClient.DeleteExistingKappControllerReturns(nil) - regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if cluster, ok := resourceReference.(*capi.Cluster); ok { - cluster.Spec.InfrastructureRef = &corev1.ObjectReference{ - Name: fakeAWSClusterName, - Namespace: fakeAWSClusterNamespace, - Kind: constants.InfrastructureRefAWS, - } - return nil - } - if _, ok := resourceReference.(*capav1beta2.AWSCluster); ok { - return nil - } - return nil - }) - regionalClusterClient.UpdateAWSCNIIngressRulesReturns(nil) - err := tkgClient.HandleKappControllerUpgrade(®ionalClusterClient, ¤tClusterClient, &upgradeClusterConfig) - Expect(err).ToNot(HaveOccurred()) - callcount := regionalClusterClient.UpdateAWSCNIIngressRulesCallCount() - Expect(callcount).To(Equal(1)) - }) - }) - When("spec.network.seucrityGroupOverrides is not nil for aws cluster", func() { - It("should return no error and should not try to add aws ingress rule", func() { - currentClusterClient.DeleteExistingKappControllerReturns(nil) - regionalClusterClient.GetResourceCalls(func(resourceReference interface{}, resourceName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if cluster, ok := resourceReference.(*capi.Cluster); ok { - cluster.Spec.InfrastructureRef = &corev1.ObjectReference{ - Name: fakeAWSClusterName, - Namespace: fakeAWSClusterNamespace, - Kind: constants.InfrastructureRefAWS, - } - return nil - } - if awsCluster, ok := resourceReference.(*capav1beta2.AWSCluster); ok { - securityGroupOverride := make(map[capav1beta2.SecurityGroupRole]string) - securityGroupOverride["secgroup1"] = "secrules" - awsCluster.Spec.NetworkSpec.SecurityGroupOverrides = securityGroupOverride - return nil - } - return nil - }) - regionalClusterClient.UpdateAWSCNIIngressRulesReturns(fmt.Errorf("some-error")) - err := tkgClient.HandleKappControllerUpgrade(®ionalClusterClient, ¤tClusterClient, &upgradeClusterConfig) - Expect(err).ToNot(HaveOccurred()) - callcount := regionalClusterClient.UpdateAWSCNIIngressRulesCallCount() - Expect(callcount).To(Equal(0)) - }) - }) -}) - -func getDummyKCP(machineTemplateKind string) *capikubeadmv1beta1.KubeadmControlPlane { - file := capibootstrapkubeadmv1beta1.File{Content: kubeVipPodString, Path: "/etc/kubernetes/manifests/kube-vip.yaml", Owner: "root:root"} - kcp := &capikubeadmv1beta1.KubeadmControlPlane{} - kcp.Name = "fake-kcp-name" - kcp.Namespace = "fake-kcp-namespace" - kcp.Spec.Version = currentK8sVersion - - kcp.Spec.KubeadmConfigSpec = capibootstrapkubeadmv1beta1.KubeadmConfigSpec{ - ClusterConfiguration: &capibootstrapkubeadmv1beta1.ClusterConfiguration{ - ImageRepository: "fake-image-repo", - DNS: capibootstrapkubeadmv1beta1.DNS{ - ImageMeta: capibootstrapkubeadmv1beta1.ImageMeta{ - ImageRepository: "fake-dns-image-repo", - ImageTag: "fake-dns-image-tag", - }, - }, - Etcd: capibootstrapkubeadmv1beta1.Etcd{ - Local: &capibootstrapkubeadmv1beta1.LocalEtcd{ - ImageMeta: capibootstrapkubeadmv1beta1.ImageMeta{ - ImageRepository: "fake-etcd-image-repo", - ImageTag: "fake-etcd-image-tag", - }, - DataDir: "fake-etcd-data-dir", - }, - }, - }, - Files: []capibootstrapkubeadmv1beta1.File{ - file, - }, - } - - kcp.Spec.MachineTemplate.InfrastructureRef = corev1.ObjectReference{ - Name: "fake-infra-template-name", - Namespace: "fake-infra-template-namespace", - Kind: machineTemplateKind, - } - return kcp -} - -func getDummyKCPWithoutKubevip(machineTemplateKind string) *capikubeadmv1beta1.KubeadmControlPlane { - kcp := &capikubeadmv1beta1.KubeadmControlPlane{} - kcp.Name = "fake-kcp-name" - kcp.Namespace = "fake-kcp-namespace" - kcp.Spec.Version = currentK8sVersion - - kcp.Spec.KubeadmConfigSpec = capibootstrapkubeadmv1beta1.KubeadmConfigSpec{ - ClusterConfiguration: &capibootstrapkubeadmv1beta1.ClusterConfiguration{ - ImageRepository: "fake-image-repo", - DNS: capibootstrapkubeadmv1beta1.DNS{ - ImageMeta: capibootstrapkubeadmv1beta1.ImageMeta{ - ImageRepository: "fake-dns-image-repo", - ImageTag: "fake-dns-image-tag", - }, - }, - Etcd: capibootstrapkubeadmv1beta1.Etcd{ - Local: &capibootstrapkubeadmv1beta1.LocalEtcd{ - ImageMeta: capibootstrapkubeadmv1beta1.ImageMeta{ - ImageRepository: "fake-etcd-image-repo", - ImageTag: "fake-etcd-image-tag", - }, - DataDir: "fake-etcd-data-dir", - }, - }, - }, - } - - kcp.Spec.MachineTemplate.InfrastructureRef = corev1.ObjectReference{ - Name: "fake-infra-template-name", - Namespace: "fake-infra-template-namespace", - Kind: machineTemplateKind, - } - return kcp -} - -func getDummyMD() []capi.MachineDeployment { - md := capi.MachineDeployment{} - md.Name = "fake-md-name" - md.Namespace = "fake-md-namespace" - return []capi.MachineDeployment{md} -} - -func setupBomFile(defaultBomFile string, configDir string) { - bomDir, err := tkgconfigpaths.New(configDir).GetTKGBoMDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - err = os.MkdirAll(bomDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - err = utils.CopyFile(defaultBomFile, filepath.Join(bomDir, filepath.Base(defaultBomFile))) - Expect(err).ToNot(HaveOccurred()) -} diff --git a/tkg/client/upgrade_region.go b/tkg/client/upgrade_region.go deleted file mode 100644 index 75f2b844b5..0000000000 --- a/tkg/client/upgrade_region.go +++ /dev/null @@ -1,792 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "context" - "encoding/base64" - "fmt" - "strconv" - "strings" - "time" - - "github.com/pkg/errors" - "golang.org/x/sync/errgroup" - batchv1 "k8s.io/api/batch/v1" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/util/version" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - clusterctl "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" - "github.com/vmware-tanzu/tanzu-framework/tkg/avi" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/providersupgradeclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ErrorBlockUpgradeTMCIncompatible defines the error message to display during upgrade when cluster is registred to TMC and TMC does not support latest version of TKG -const ErrorBlockUpgradeTMCIncompatible = "The management cluster cannot be upgraded to Tanzu Kubernetes Grid '%v' while registered to Tanzu Mission Control. See https://via.vmw.com/tkg-14-tmc-compat for more information." - -// UpgradeManagementClusterOptions upgrade management cluster options -type UpgradeManagementClusterOptions struct { - ClusterName string - Namespace string - KubernetesVersion string - Kubeconfig string - IsRegionalCluster bool - VSphereTemplateName string - BOMFilePath string -} - -// ApplyProvidersUpgradeOptions carries the options supported by upgrade apply. -type ApplyProvidersUpgradeOptions struct { - // Kubeconfig file to use for accessing the management cluster. If empty, default discovery rules apply. - Kubeconfig clusterctl.Kubeconfig - - // Contract defines the API Version of Cluster API (contract e.g. v1alpha3) the management group should upgrade to. - // When upgrading by contract, the latest versions available will be used for all the providers; if you want - // a more granular control on upgrade, use CoreProvider, BootstrapProviders, ControlPlaneProviders, InfrastructureProviders. - // Note: For tkg we will ignore this option as tkg management cluster is opinionated and it controls version of the providers to be upgraded - Contract string - - // CoreProvider instance and version (e.g. capi-system/cluster-api:v0.3.0) to upgrade to. This field can be used as alternative to Contract. - CoreProvider string - - // BootstrapProviders instance and versions (e.g. capi-kubeadm-bootstrap-system/kubeadm:v0.3.0) to upgrade to. This field can be used as alternative to Contract. - BootstrapProviders []string - - // ControlPlaneProviders instance and versions (e.g. capi-kubeadm-control-plane-system/kubeadm:v0.3.0) to upgrade to. This field can be used as alternative to Contract. - ControlPlaneProviders []string - - // InfrastructureProviders instance and versions (e.g. capa-system/aws:v0.5.0) to upgrade to. This field can be used as alternative to Contract. - InfrastructureProviders []string -} - -type providersUpgradeInfo struct { - providers []clusterctlv1.Provider -} - -// UpgradeManagementCluster upgrades management clusters providers and k8s version -// Steps: -// 1. Upgrade providers -// a) Get the Upgrade configuration by reading BOM file to get the providers versions -// b) Get the providers information from the management cluster -// c) Prepare the providers upgrade information -// d) Call the clusterctl ApplyUpgrade() to upgrade providers -// e) Wait for providers to be up and running -// 2. call the UpgradeCluster() for upgrading the k8s version of the Management cluster -// -//nolint:gocyclo -func (c *TkgClient) UpgradeManagementCluster(options *UpgradeClusterOptions) error { - contexts, err := c.GetRegionContexts(options.ClusterName) - if err != nil || len(contexts) == 0 { - return errors.Errorf("management cluster %s not found", options.ClusterName) - } - currentRegion := contexts[0] - options.Kubeconfig = currentRegion.SourceFilePath - - if currentRegion.Status == region.Failed { - return errors.Errorf("cannot upgrade since deployment failed for management cluster %s", currentRegion.ClusterName) - } - - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclient.Options{OperationTimeout: c.timeout}) - if err != nil { - return errors.Wrap(err, "unable to get cluster client while upgrading management cluster") - } - regionalPkgClient, err := packageclient.NewPackageClientForContext(currentRegion.SourceFilePath, currentRegion.ContextName) - if err != nil { - return errors.Wrap(err, "unable to get a PackageClient") - } - - isPacific, err := regionalClusterClient.IsPacificRegionalCluster() - if err != nil { - return errors.Wrap(err, "error determining 'Tanzu Kubernetes Cluster service for vSphere' management cluster") - } - if isPacific { - return errors.New("upgrading 'Tanzu Kubernetes Cluster service for vSphere' management cluster is not yet supported") - } - - // Validate the upgrade and preconfigure required variables - err = c.validateAndconfigure(options, regionalClusterClient) - if err != nil { - return err - } - - log.Info("Upgrading management cluster providers...") - - providersUpgradeClient := providersupgradeclient.New(c.clusterctlClient) - if err = c.DoProvidersUpgrade(regionalClusterClient, currentRegion.ContextName, providersUpgradeClient, options); err != nil { - return errors.Wrap(err, "failed to upgrade management cluster providers") - } - - // Ensure Cluster API Provider AWS is running on the control plane before continuing with EC2 instance profile - if err := regionalClusterClient.PatchClusterAPIAWSControllersToUseEC2Credentials(); err != nil { - return errors.Wrap(err, "unable to patch the Cluster API Provider AWS controller to use EC2 instance profile") - } - - // Wait for installed providers to get up and running - // TODO: Currently tkg doesn't support TargetNamespace and WatchingNamespace as it's not supporting multi-tenency of providers - // If we support it in future we need to make these namespaces as command line options and use here - waitOptions := waitForProvidersOptions{ - Kubeconfig: options.Kubeconfig, - TargetNamespace: "", - } - err = c.WaitForProviders(regionalClusterClient, waitOptions) - if err != nil { - return errors.Wrap(err, "error waiting for provider components to be up and running after upgrading them") - } - - log.Info("Management cluster providers upgraded successfully...") - - // Patch management cluster with the TKG version - // The TKG version should be patched before tkr-source-controller(in tkg-pkg) upgrade. - // So that tkr-source-controller's initial fetch can download the new tkrs. - // This will prevent the circular dependency that: - // A. Tanzu CLI updates TKG version after cluster upgraded to the desired tkr. - // B. tkr-source-controller downloads the desired tkr for cluster upgrade based on the updated TKG version - err = regionalClusterClient.PatchClusterObjectWithTKGVersion(options.ClusterName, options.Namespace, c.tkgBomClient.GetCurrentTKGVersion()) - if err != nil { - return err - } - - // If clusterclass feature flag is enabled then deploy management components - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - log.Info("Preparing addons manager for upgrade") - upgradeClusterConfig, err := c.getUpgradeClusterConfig(options) - if err != nil { - return errors.Wrap(err, "unable to retrieve upgrade cluster config") - } - err = c.prepareAddonsManagerUpgrade(regionalClusterClient, upgradeClusterConfig) - if err != nil { - return errors.Wrap(err, "unable to prepare addons manage for upgrade") - } - - log.Info("Upgrading kapp-controller...") - if err = c.InstallOrUpgradeKappController(regionalClusterClient, constants.OperationTypeUpgrade, true); err != nil { - return errors.Wrap(err, "unable to upgrade kapp-controller") - } - log.Info("Removing old management components...") - if err := RemoveObsoleteManagementComponents(regionalClusterClient); err != nil { - return errors.Wrap(err, "unable to remove obsolete management components") - } - log.Info("Upgrading management components...") - if err = c.InstallOrUpgradeManagementComponents(regionalClusterClient, regionalPkgClient, currentRegion.ContextName, true); err != nil { - return errors.Wrap(err, "unable to upgrade management components") - } - - log.Info("Cleanup core packages repository...") - if err = c.CleanupCorePackageRepo(regionalClusterClient); err != nil { - return errors.Wrap(err, "unable to cleanup core package repository") - } - } - - log.Info("Upgrading management cluster kubernetes version...") - err = c.UpgradeCluster(options) - if err != nil { - return errors.Wrap(err, "unable to upgrade management cluster") - } - - err = c.upgradeTelemetryImageIfExists(regionalClusterClient, currentRegion) - if err != nil { - return err - } - - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - log.Info("Creating tkg-bom versioned ConfigMaps...") - if err := c.CreateOrUpdateVerisionedTKGBom(regionalClusterClient); err != nil { - log.Warningf("Warning: Management cluster is created successfully, but the tkg-bom versioned ConfigMaps creation is failing. %v", err) - } - } - - return nil -} - -func (c *TkgClient) validateAndconfigure(options *UpgradeClusterOptions, regionalClusterClient clusterclient.Client) error { - // Validate the compatibility before upgrading management cluster - log.Infof("Validating the compatibility before management cluster upgrade") - err := c.validateCompatibilityBeforeManagementClusterUpgrade(options, regionalClusterClient) - if err != nil { - return err - } - - // Validate required environment variables are set - log.Infof("Validating for the required environment variables to be set") - if err := c.validateEnvVariables(regionalClusterClient); err != nil { - return errors.Wrap(err, "required env variables are not set") - } - - log.Infof("Validating for the user configuration secret to be existed in the cluster") - clusterName, namespace, err := c.getRegionalClusterNameAndNamespace(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "failed to get management cluster name and namespace") - } - - pollOptions := &clusterclient.PollOptions{Interval: clusterclient.CheckResourceInterval, Timeout: 3 * clusterclient.CheckResourceInterval} - _, err = regionalClusterClient.GetSecretValue(fmt.Sprintf(packagedatamodel.SecretName, constants.TKGManagementPackageInstallName, constants.TkgNamespace), constants.TKGPackageValuesFile, constants.TkgNamespace, pollOptions) - if err != nil && apierrors.IsNotFound(err) { - log.Infof("tkg-pkg-tkg-system-values secret in tkg-system namespace not found, trying to fetch %s-config-values secret instead...", clusterName) - // Todo: Management clusters upgraded from tkg 1.3 could be missing this secret。 - // After the workaround doc is implemented, adding the doc link here. - _, err = regionalClusterClient.GetSecretValue(fmt.Sprintf("%s-config-values", clusterName), "value", constants.TkgNamespace, pollOptions) - if err != nil { - return errors.Wrapf(err, "unable to get the %s-config-values secret", clusterName) - } - } else if err != nil { - return errors.Wrapf(err, "unable to get the %s secret", fmt.Sprintf(packagedatamodel.SecretName, constants.TKGManagementPackageInstallName, constants.TkgNamespace)) - } - - if err := c.configureVariablesForProvidersInstallation(regionalClusterClient); err != nil { - return errors.Wrap(err, "unable to configure variables for provider installation") - } - - options.ClusterName = clusterName - options.Namespace = namespace - - err = c.configureOSOptionsForUpgrade(regionalClusterClient, options) - if err != nil { - return errors.Wrap(err, "unable to config os options for upgrade") - } - - providerType, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableProviderType) - if err != nil { - return errors.Wrap(err, "unable to get the infra provider type") - } - - if providerType == AWSProviderName { - err = c.ConfigureAMIID(options, regionalClusterClient) - if err != nil { - return errors.Wrap(err, "error getting ami id") - } - } - - if providerType == VSphereProviderName { - isClusterClassBased, err := regionalClusterClient.IsClusterClassBased(options.ClusterName, options.Namespace) - if err != nil { - return errors.Wrap(err, "unable to determine cluster type") - } - if akooAddonSecretValues, found, err := GetAKOOAddonSecretValues(regionalClusterClient, clusterName, isClusterClassBased); err != nil { - return errors.Wrap(err, "unable to get akoo addon secret values") - } else if found { - configValues := make(map[string]interface{}) - if err = RetrieveAKOOVariablesFromAddonSecretValues(clusterName, configValues, akooAddonSecretValues); err != nil { - return errors.Wrap(err, "unable to handle the akoo specific variables") - } - if err = c.validateCompatibilityWithAVIController(configValues); err != nil { - return err - } - } - } - return nil -} - -func (c *TkgClient) configureVariablesForProvidersInstallation(regionalClusterClient clusterclient.Client) error { - err := c.configureImageTagsForProviderInstallation() - if err != nil { - return errors.Wrap(err, "failed to configure image tags for provider installation") - } - - // If region client is not specified nothing to configure based on existing management cluster - if regionalClusterClient == nil { - return nil - } - - infraProvider, err := regionalClusterClient.GetRegionalClusterDefaultProviderName(clusterctlv1.InfrastructureProviderType) - if err != nil { - return errors.Wrap(err, "failed to get cluster provider information.") - } - infraProviderName, _, err := ParseProviderName(infraProvider) - if err != nil { - return errors.Wrap(err, "failed to parse provider name") - } - // retrieve required variables required for infrastructure component spec rendering - // set them to default values if they don't exist. - err = c.RetrieveRegionalClusterConfiguration(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "failed to set configurations for upgrade") - } - - // config CORE_DNS_IP in addition for kapp-controller update - if err := c.configureAndValidateCoreDNSIP(); err != nil { - return errors.Wrap(err, "error while initializing networking configuration") - } - - // Configure provider name to readerwriter config - c.SetProviderType(infraProviderName) - - switch infraProviderName { - case AzureProviderName: - // since the templates needs Base64 values of credentials, encode them - if _, err := c.EncodeAzureCredentialsAndGetClient(regionalClusterClient); err != nil { - return errors.Wrap(err, "failed to encode azure credentials") - } - case AWSProviderName: - if _, err := c.EncodeAWSCredentialsAndGetClient(regionalClusterClient); err != nil { - return errors.Wrap(err, "failed to encode AWS credentials") - } - case VSphereProviderName: - if err := c.configureVsphereCredentialsFromCluster(regionalClusterClient); err != nil { - return errors.Wrap(err, "failed to configure Vsphere credentials") - } - case DockerProviderName: - // no variable configuration is needed to deploy Docker provider as - // infrastructure-components.yaml for docker does not require any variable - } - return nil -} - -// DoProvidersUpgrade upgrades the providers of the management cluster -func (c *TkgClient) DoProvidersUpgrade(regionalClusterClient clusterclient.Client, ctx string, - providersUpgradeClient providersupgradeclient.Client, options *UpgradeClusterOptions) error { - // read the BOM file for latest providers version information to upgrade to - bomConfiguration, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return errors.Wrap(err, "unable to read in configuration from BOM file") - } - - pUpgradeInfo, err := c.getProvidersUpgradeInfo(regionalClusterClient, bomConfiguration) - if err != nil { - return errors.Wrap(err, "failed to get providers upgrade information") - } - if len(pUpgradeInfo.providers) == 0 { - log.Infof("All providers are up to date...") - return nil - } - - pUpgradeApplyOptions, err := c.GenerateProvidersUpgradeOptions(pUpgradeInfo) - if err != nil { - return errors.Wrap(err, "failed to generate providers upgrade apply options") - } - - // update the kubeconfig - pUpgradeApplyOptions.Kubeconfig.Path = options.Kubeconfig - pUpgradeApplyOptions.Kubeconfig.Context = ctx - - log.V(6).Infof("clusterctl upgrade apply options: %+v", *pUpgradeApplyOptions) - clusterctlUpgradeOptions := clusterctl.ApplyUpgradeOptions(*pUpgradeApplyOptions) - err = providersUpgradeClient.ApplyUpgrade(&clusterctlUpgradeOptions) - if err != nil { - return errors.Wrap(err, "failed to apply providers upgrade") - } - - return nil -} - -// GenerateProvidersUpgradeOptions generates provider upgrade options -func (c *TkgClient) GenerateProvidersUpgradeOptions(pUpgradeInfo *providersUpgradeInfo) (*clusterctl.ApplyUpgradeOptions, error) { - puo := &clusterctl.ApplyUpgradeOptions{} - puo.Contract = "v1beta1" - - for i := range pUpgradeInfo.providers { - instanceVersion := pUpgradeInfo.providers[i].Namespace + "/" + pUpgradeInfo.providers[i].ProviderName + ":" + pUpgradeInfo.providers[i].Version - switch clusterctlv1.ProviderType(pUpgradeInfo.providers[i].Type) { - case clusterctlv1.CoreProviderType: - puo.CoreProvider = instanceVersion - case clusterctlv1.BootstrapProviderType: - puo.BootstrapProviders = append(puo.BootstrapProviders, instanceVersion) - case clusterctlv1.ControlPlaneProviderType: - puo.ControlPlaneProviders = append(puo.ControlPlaneProviders, instanceVersion) - case clusterctlv1.InfrastructureProviderType: - puo.InfrastructureProviders = append(puo.InfrastructureProviders, instanceVersion) - default: - return nil, errors.Errorf("unknown provider type: %s", pUpgradeInfo.providers[i].Type) - } - } - return puo, nil -} - -// getProvidersUpgradeInfo prepares the upgrade information by comparing the provider current version with and the upgradable version -// obtained from the BOM file. -func (c *TkgClient) getProvidersUpgradeInfo(regionalClusterClient clusterclient.Client, bomConfig *tkgconfigbom.BOMConfiguration) (*providersUpgradeInfo, error) { - pUpgradeInfo := &providersUpgradeInfo{} - - // Get all the installed providers info - installedProviders := &clusterctlv1.ProviderList{} - err := regionalClusterClient.ListResources(installedProviders, &crtclient.ListOptions{}) - if err != nil { - return nil, errors.Wrap(err, "cannot get installed provider config") - } - - // get the providers Info with the version updated with the upgrade version obtained from BOM file map - upgradeProviderVersionMap := bomConfig.ProvidersVersionMap - // make a list of providers eligible for upgrade - for i := range installedProviders.Items { - // Note: provider.Name has the manifest label (eg:control-plane-kubeadm) and provider.ProviderName would not be ideal(eg:kubeadm) - // here as both bootstrap-kubeadm and control-plane-kubeadm has the same ProviderName as 'kubeadm' - latestVersion, ok := upgradeProviderVersionMap[installedProviders.Items[i].Name] - if !ok || latestVersion == "" { - log.Warningf(" %s provider's version is missing in BOM file, so it would not be upgraded ", installedProviders.Items[i].Name) - continue - } - latestSemVersion, err := version.ParseSemantic(latestVersion) - if err != nil { - log.Warningf("failed to parse %s provider's upgrade version, so it would not be upgraded ", installedProviders.Items[i].Name) - continue - } - currentSemVersion, err := version.ParseSemantic(installedProviders.Items[i].Version) - if err != nil { - return nil, errors.Wrapf(err, "failed to parse %s provider's current version", installedProviders.Items[i].Name) - } - if latestSemVersion.LessThan(currentSemVersion) { - log.V(1).Infof("%s provider's upgrade version %s is less than current version %s, so skipping it for upgrade ", - installedProviders.Items[i].ProviderName, latestVersion, installedProviders.Items[i].Version) - continue - } - // update the provider to the latest version to be upgraded - installedProviders.Items[i].Version = fmt.Sprintf("v%v.%v.%v", latestSemVersion.Major(), latestSemVersion.Minor(), latestSemVersion.Patch()) - pUpgradeInfo.providers = append(pUpgradeInfo.providers, installedProviders.Items[i]) - } - - return pUpgradeInfo, nil -} - -// WaitForAddonsDeployments wait for addons deployments -func (c *TkgClient) WaitForAddonsDeployments(clusterClient clusterclient.Client) error { - group, _ := errgroup.WithContext(context.Background()) - - group.Go( - func() error { - err := clusterClient.WaitForDeployment(constants.TkrControllerDeploymentName, constants.TkrNamespace) - if err != nil { - log.V(3).Warningf("Failed waiting for deployment %s", constants.TkrControllerDeploymentName) - } - return err - }) - - group.Go( - func() error { - err := clusterClient.WaitForDeployment(constants.KappControllerDeploymentName, constants.KappControllerNamespace) - if err != nil { - log.V(3).Warningf("Failed waiting for deployment %s", constants.KappControllerDeploymentName) - } - return err - }) - - group.Go( - func() error { - err := clusterClient.WaitForDeployment(constants.AddonsManagerDeploymentName, constants.KappControllerNamespace) - if err != nil { - log.V(3).Warningf("Failed waiting for deployment %s", constants.AddonsManagerDeploymentName) - } - return err - }) - - err := group.Wait() - if err != nil { - return errors.Wrap(err, "Failed waiting for at least one CRS deployment, check logs for more detail.") - } - return nil -} - -// WaitForPackages wait for packages to be up and running -func (c *TkgClient) WaitForPackages(regionalClusterClient, currentClusterClient clusterclient.Client, clusterName, namespace string, isRegionalCluster bool) error { - // Adding kapp-controller package to the exclude list - // For management cluster, kapp-controller is deployed using CRS and addon secret does not exist - // For workload cluster, kapp-controller is deployed by addons manager. Even though the - // addon secret for kapp-controller exists, it is not deployed using PackageInstall. - // Hence skipping it while waiting for packages. - ListExcludePackageInstallsFromWait := []string{constants.KappControllerPackageName} - - // Get the list of addons secrets - secretList := &corev1.SecretList{} - err := regionalClusterClient.ListResources(secretList, &crtclient.ListOptions{Namespace: namespace}) - if err != nil { - return errors.Wrap(err, "unable to get list of secrets") - } - - // From the addons secret get the names of package installs for each addon secret - // This is determined from the "tkg.tanzu.vmware.com/addon-name" label on the secret - var packagesInstalled []kapppkgv1alpha1.Package - - // Add tanzu-core-management-plugins packages to the list of packages to wait for management-cluster - if isRegionalCluster && !config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - packagesInstalled = append(packagesInstalled, kapppkgv1alpha1.Package{ObjectMeta: metav1.ObjectMeta{Name: constants.CoreManagementPluginsPackageName, Namespace: constants.TkgNamespace}}) - } - - for i := range secretList.Items { - if secretList.Items[i].Type == constants.AddonSecretType { - if cn, exists := secretList.Items[i].Labels[constants.ClusterNameLabel]; exists && cn == clusterName { - if addonName, exists := secretList.Items[i].Labels[constants.AddonNameLabel]; exists { - if !utils.ContainsString(ListExcludePackageInstallsFromWait, addonName) { - packagesInstalled = append(packagesInstalled, kapppkgv1alpha1.Package{ObjectMeta: metav1.ObjectMeta{Name: addonName, Namespace: constants.TkgNamespace}}) - } - } - } - } - } - return WaitForPackagesInstallation(currentClusterClient, packagesInstalled, c.getPackageInstallTimeoutFromConfig()) -} - -func (c *TkgClient) getPackageInstallTimeoutFromConfig() time.Duration { - var err error - packageInstallTimeoutStr, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariablePackageInstallTimeout) - packageInstallTimeout := time.Duration(0) - if packageInstallTimeoutStr != "" { - packageInstallTimeout, err = time.ParseDuration(packageInstallTimeoutStr) - if err != nil { - log.Infof("Unable to parse '%s: %v'", constants.ConfigVariablePackageInstallTimeout, packageInstallTimeoutStr) - } - } - return packageInstallTimeout -} - -func (c *TkgClient) validateCompatibilityBeforeManagementClusterUpgrade(options *UpgradeClusterOptions, regionalClusterClient clusterclient.Client) error { - err := c.ValidateManagementClusterUpgradeVersionCompatibility(options, regionalClusterClient) - if err != nil { - return errors.Wrap(err, "upgrade version compatibility validation failed") - } - return c.validateCompatibilityWithTMC(regionalClusterClient, options.SkipPrompt) -} - -// ValidateManagementClusterUpgradeVersionCompatibility validates the upgrade version compatibility for a management cluster -func (c *TkgClient) ValidateManagementClusterUpgradeVersionCompatibility(options *UpgradeClusterOptions, regionalClusterClient clusterclient.Client) error { - mgmtClusterSemVersion, currentTKGSemVersion, err := c.getManagementClusterAndCurrentTKGSemVersions(options, regionalClusterClient) - if err != nil { - return err - } - log.V(9).Infof("Management cluster SemVersion is %q and current TKG SemVersion(to be upgraded to) is %q", - mgmtClusterSemVersion.String(), currentTKGSemVersion.String()) - - if currentTKGSemVersion.Major() == uint(2) && (mgmtClusterSemVersion.Major() == uint(1) && mgmtClusterSemVersion.Minor() < uint(6)) { - return errors.Errorf("management cluster version must be 1.6.x to upgrade to 2.1.x") - } - - // TODO: Update this condition when TKG major version is changed - if currentTKGSemVersion.Major() > uint(2) { - return errors.Errorf("upgrading to beyond major version 2 is not yet supported.") - } - warningMsg := "" - minorGap := int(currentTKGSemVersion.Minor()) - int(mgmtClusterSemVersion.Minor()) - majorGap := int(currentTKGSemVersion.Major()) - int(mgmtClusterSemVersion.Major()) - if currentTKGSemVersion.LessThan(mgmtClusterSemVersion) { - return errors.Errorf("TKG version downgrade is not supported") - } else if majorGap == 0 && minorGap > 1 { - warningMsg = "Upgrade skipping minor version is detected and is not recommended. It could leave cluster unmanageable" - } - if warningMsg != "" { - if !options.SkipPrompt { - log.Warning(warningMsg) - if err := component.AskForConfirmation("Do you want to continue with the upgrade?"); err != nil { - return err - } - } else { - log.Infof("Warning: %v", warningMsg) - } - } - return nil -} - -func (c *TkgClient) getManagementClusterAndCurrentTKGSemVersions(options *UpgradeClusterOptions, - regionalClusterClient clusterclient.Client) (mcSemversion, currentTKGSemVersion *version.Version, err error) { - - namespace := options.Namespace - if namespace == "" { - namespace = TKGsystemNamespace - } - mgmtClusterTkgVersion, err := regionalClusterClient.GetManagementClusterTKGVersion(options.ClusterName, namespace) - if err != nil { - return mcSemversion, currentTKGSemVersion, errors.Wrapf(err, "unable to get tkg version of management cluster %q in namespace %q", options.ClusterName, options.Namespace) - } - mcSemversion, err = version.ParseSemantic(mgmtClusterTkgVersion) - if err != nil { - return mcSemversion, currentTKGSemVersion, errors.Wrapf(err, "unable to parse management cluster version %s", mgmtClusterTkgVersion) - } - currentTKGVersion := c.tkgBomClient.GetCurrentTKGVersion() - currentTKGSemVersion, err = version.ParseSemantic(currentTKGVersion) - if err != nil { - return mcSemversion, currentTKGSemVersion, errors.Wrapf(err, "unable to parse management cluster version %s", currentTKGVersion) - } - return -} - -// validateCompatibilityWithTMC validate compatibility of new TKG version with TMC if management cluster is registered with TMC -func (c *TkgClient) validateCompatibilityWithTMC(regionalClusterClient clusterclient.Client, skipPrompt bool) error { - registered, err := regionalClusterClient.IsClusterRegisteredToTMC() - if err != nil || !registered { - return nil - } - - log.Info("Management Cluster is registered with Tanzu Mission Control. Validating upgrade compatibility...") - - tkgVersion, err := c.tkgBomClient.GetDefaultTKGReleaseVersion() - if err != nil { - return err - } - - tmcInteropConfigMap := &corev1.ConfigMap{} - if err := regionalClusterClient.GetResource(tmcInteropConfigMap, "interop", constants.TmcNamespace, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - // Compatibility has to be explicitly communicated by an existing iterop ConfigMap, hence failing. - // This is because old management cluster will not have this ConfigMap created - // and TMC will add this functionality in future. - return errors.Errorf(ErrorBlockUpgradeTMCIncompatible, tkgVersion) - } - - if !skipPrompt { - log.Infof("error occurred while validating compatibility with Tanzu Mission Control, %v", err) - log.Warning("Unable to validate compatibility of new version with Tanzu Mission Control. See https://via.vmw.com/tkg-14-tmc-compat for more information.") - if err := component.AskForConfirmation("Do you want to continue with the upgrade?"); err != nil { - return err - } - } else { - log.Infof("Warning: Unable to validate compatibility of new version with Tanzu Mission Control: %v", err) - } - - return nil - } - - // Get the supported versions by TMC. Below is the 'interop' ConfigMap sample. - // Also verify the `interop-schema-version` is of version 'v1' - // - // apiVersion: v1 - // kind: ConfigMap - // metadata: - // name: interop - // namespace: vmware-system-tmc - // data: - // interop-schema-version: "v1.0" - // supported-versions: "v1.4.0;v1.4.1" - interopSchemaVersion, found := tmcInteropConfigMap.Data["interop-schema-version"] - if !found || interopSchemaVersion != "v1.0" { - return errors.Errorf(ErrorBlockUpgradeTMCIncompatible, tkgVersion) - } - supportedVersions, found := tmcInteropConfigMap.Data["supported-versions"] - if !found { - return errors.Errorf(ErrorBlockUpgradeTMCIncompatible, tkgVersion) - } - - lstSupportedVersions := strings.Split(supportedVersions, ";") - for _, sv := range lstSupportedVersions { - if utils.CompareMajorMinorPatchVersion(sv, tkgVersion) { - // If compatible version is found return nil which will allow - // user to continue the upgrade as TMC supports new version of TKG - return nil - } - } - - return errors.Errorf(ErrorBlockUpgradeTMCIncompatible, tkgVersion) -} - -// validateCompatibilityWithAVIController validates compatibility of new TKG version with current AVI controller -func (c *TkgClient) validateCompatibilityWithAVIController(configValues map[string]interface{}) error { - aviCA, err := base64.StdEncoding.DecodeString(configValues[constants.ConfigVariableAviControllerCA].(string)) - if err != nil { - return errors.Wrap(err, "unable to base64 decode avi certification") - } - aviControllerParams := &models.AviControllerParams{ - Username: configValues[constants.ConfigVariableAviControllerUsername].(string), - Password: configValues[constants.ConfigVariableAviControllerPassword].(string), - Host: configValues[constants.ConfigVariableAviControllerAddress].(string), - Tenant: "admin", - CAData: string(aviCA), - } - if authed, err := avi.New().VerifyAccount(aviControllerParams); err != nil { - return err - } else if !authed { - return errors.Errorf("unable to authenticate avi controller due to incorrect credentials") - } - return nil -} - -// upgradeTelemetryImage will upgrade the telemetry image if the management-cluster is opted into telemetry -// additional labels set by the user using the CLI will be preserved (such as: isProd or customer identification) -func (c *TkgClient) upgradeTelemetryImageIfExists(regionalClusterClient clusterclient.Client, ctx region.RegionContext) error { - CEIPJobExists, err := regionalClusterClient.HasCEIPTelemetryJob(ctx.ClusterName) - if err != nil { - return errors.Wrap(err, "unable to determine if telemetry cron job is installed already") - } - - if CEIPJobExists { - telemetryJob := &batchv1.CronJob{} - err := regionalClusterClient.GetResource(telemetryJob, "tkg-telemetry", "tkg-system-telemetry", nil, nil) - if err != nil { - return errors.Wrap(err, "Failed to determine if telemetry job is installed or not") - } - - log.Info("Upgrading management cluster telemetry image...") - // telemetry command: /tkg-telemetry - command := telemetryJob.Spec.JobTemplate.Spec.Template.Spec.Containers[0].Command - dsURL := command[2] - isProd := !strings.Contains(dsURL, "stg") - labels := strings.Split(command[3], "--labels=")[1] - err = c.DoSetCEIPParticipation(regionalClusterClient, ctx, true, strconv.FormatBool(isProd), labels) - if err != nil { - return errors.Wrap(err, "Failed to upgrade telemetry image") - } - } else { - log.Info("management cluster is opted out of telemetry - skipping telemetry image upgrade") - } - - return nil -} - -func (c *TkgClient) ConfigureAMIID(options *UpgradeClusterOptions, regionalClusterClient clusterclient.Client) error { - bomConfiguration, err := c.tkgBomClient.GetBOMConfigurationFromTkrVersion(options.TkrVersion) - if err != nil { - return errors.Wrapf(err, "unable to get bom configuration for TKr version %s", options.TkrVersion) - } - - clusterName := options.ClusterName - clusterNamespace := options.Namespace - - pollOptions := &clusterclient.PollOptions{Interval: clusterclient.CheckResourceInterval, Timeout: 3 * clusterclient.CheckResourceInterval} - - cluster := &capi.Cluster{} - err = regionalClusterClient.GetResource(cluster, clusterName, clusterNamespace, nil, pollOptions) - if err != nil { - return errors.Wrapf(err, "unable to get the cluster %q", clusterName) - } - - if cluster.Spec.InfrastructureRef == nil { - return errors.Errorf("cluster %s doest not have a InfrastructureRef", clusterName) - } - awsClusterUnstructured := &unstructured.Unstructured{} - awsClusterUnstructured.SetAPIVersion(cluster.Spec.InfrastructureRef.APIVersion) - awsClusterUnstructured.SetKind(cluster.Spec.InfrastructureRef.Kind) - err = regionalClusterClient.GetResource(awsClusterUnstructured, cluster.Spec.InfrastructureRef.Name, cluster.Spec.InfrastructureRef.Namespace, nil, pollOptions) - if err != nil { - return errors.Wrapf(err, "unable to get the awscluster %q", cluster.Spec.InfrastructureRef.Name) - } - - specObj := awsClusterUnstructured.Object[constants.SPEC] - // this should never happen - if specObj == nil { - return errors.Errorf("awscluster %q has empty spec", cluster.Spec.InfrastructureRef.Name) - } - - spec := specObj.(map[string]interface{}) - - if spec["region"] == nil || spec["region"].(string) == "" { - return errors.Errorf("awscluster %q has empty region", cluster.Spec.InfrastructureRef.Name) - } - awsRegion := spec["region"].(string) - - amiInfo, err := c.tkgConfigProvidersClient.GetAWSAMIInfo(bomConfiguration, awsRegion) - if err != nil || amiInfo == nil { - // throw error - return errors.Errorf("unable to get ami info, error: %v", err.Error()) - } - - log.V(3).Infof("using AMI '%v' for tkr version: '%v', aws-region '%v'", amiInfo.ID, bomConfiguration.Release.Version, awsRegion) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAWSAMIID, amiInfo.ID) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSName, amiInfo.OSInfo.Name) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSVersion, amiInfo.OSInfo.Version) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSArch, amiInfo.OSInfo.Arch) - return nil -} diff --git a/tkg/client/upgrade_region_test.go b/tkg/client/upgrade_region_test.go deleted file mode 100644 index 2a15146dcf..0000000000 --- a/tkg/client/upgrade_region_test.go +++ /dev/null @@ -1,508 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - clusterctl "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit tests for upgrade management cluster", func() { - var ( - err error - regionalClusterClient *fakes.ClusterClient - providerUpgradeClient *fakes.ProvidersUpgradeClient - tkgClient *TkgClient - upgradeClusterOptions UpgradeClusterOptions - context string - ) - - BeforeEach(func() { - regionalClusterClient = &fakes.ClusterClient{} - providerUpgradeClient = &fakes.ProvidersUpgradeClient{} - - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Millisecond) - Expect(err).NotTo(HaveOccurred()) - - context = "fakeContext" - upgradeClusterOptions = UpgradeClusterOptions{ - ClusterName: "fake-cluster-name", - Namespace: "fake-namespace", - KubernetesVersion: newK8sVersion, - IsRegionalCluster: true, - Kubeconfig: "../fakes/config/kubeconfig/config1.yaml", - } - }) - - Describe("When upgrading management cluster", func() { - BeforeEach(func() { - newK8sVersion = "v1.18.0+vmware.1" - currentK8sVersion = "v1.17.3+vmware.2" - setupBomFile("../fakes/config/bom/tkg-bom-v1.3.1.yaml", testingDir) - regionalClusterClient.IsPacificRegionalClusterReturns(false, nil) - }) - - Context("When upgrading management cluster providers", func() { - JustBeforeEach(func() { - err = tkgClient.DoProvidersUpgrade(regionalClusterClient, context, providerUpgradeClient, &upgradeClusterOptions) - }) - Context("When reading upgrade information from BOM file fails", func() { - BeforeEach(func() { - updateDefaultBoMFileName(testingDir, "tkg-bom-v1.3.1-fake.yaml") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to read in configuration from BOM file")) - }) - }) - Context("When getting upgrade information fails due to failure to get the current providers information", func() { - BeforeEach(func() { - regionalClusterClient.ListResourcesReturns(errors.New("fake ListResourceError")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake ListResourceError")) - }) - }) - - Context("When current providers versions are up to date", func() { - BeforeEach(func() { - regionalClusterClient.ListResourcesCalls(func(providers interface{}, options ...crtclient.ListOption) error { - installedProviders, _ := providers.(*clusterctlv1.ProviderList) - installedProviders.Items = []clusterctlv1.Provider{ - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-system", Name: "cluster-api"}, Type: "CoreProvider", Version: "v0.3.11", ProviderName: "cluster-api"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-kubeadm-bootstrap-system", Name: "bootstrap-kubeadm"}, Type: "BootstrapProvider", Version: "v0.3.11", ProviderName: "kubeadm"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-kubeadm-control-plane-system", Name: "control-plane-kubeadm"}, Type: "ControlPlaneProvider", Version: "v0.3.11", ProviderName: "kubeadm"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capv-system", Name: "infrastructure-vsphere"}, Type: "InfrastructureProvider", Version: "v0.7.1", ProviderName: "vsphere"}, - } - return nil - }) - }) - It("should not apply the providers version upgrade", func() { - Expect(providerUpgradeClient.ApplyUpgradeCallCount()).Should(Equal(1)) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("When providers version upgrade failed", func() { - BeforeEach(func() { - regionalClusterClient.ListResourcesCalls(func(providers interface{}, options ...crtclient.ListOption) error { - installedProviders, _ := providers.(*clusterctlv1.ProviderList) - installedProviders.Items = []clusterctlv1.Provider{ - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-system", Name: "cluster-api"}, Type: "CoreProvider", Version: "v0.3.3", ProviderName: "cluster-api"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-kubeadm-bootstrap-system", Name: "bootstrap-kubeadm"}, Type: "BootstrapProvider", Version: "v0.3.3", ProviderName: "kubeadm"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-kubeadm-control-plane-system", Name: "control-plane-kubeadm"}, Type: "ControlPlaneProvider", Version: "v0.3.3", ProviderName: "kubeadm"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capv-system", Name: "infrastructure-vsphere"}, Type: "InfrastructureProvider", Version: "v0.6.3", ProviderName: "vsphere"}, - } - return nil - }) - providerUpgradeClient.ApplyUpgradeReturns(errors.New("fake-providers upgrade failed")) - }) - It("should return error", func() { - Expect(providerUpgradeClient.ApplyUpgradeCallCount()).Should(Equal(1)) - Expect(err.Error()).To(ContainSubstring("fake-providers upgrade failed")) - }) - }) - Context("When providers current versions and the latest versions are same", func() { - var applyUpgradeOptionsRecvd clusterctl.ApplyUpgradeOptions - BeforeEach(func() { - regionalClusterClient.ListResourcesCalls(func(providers interface{}, options ...crtclient.ListOption) error { - installedProviders, _ := providers.(*clusterctlv1.ProviderList) - installedProviders.Items = []clusterctlv1.Provider{ - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-system", Name: "cluster-api"}, Type: "CoreProvider", Version: "v0.3.3", ProviderName: "cluster-api"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-kubeadm-bootstrap-system", Name: "bootstrap-kubeadm"}, Type: "BootstrapProvider", Version: "v0.3.3", ProviderName: "kubeadm"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-kubeadm-control-plane-system", Name: "control-plane-kubeadm"}, Type: "ControlPlaneProvider", Version: "v0.3.3", ProviderName: "kubeadm"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capv-system", Name: "infrastructure-vsphere"}, Type: "InfrastructureProvider", Version: "v0.6.3", ProviderName: "vsphere"}, - } - return nil - }) - providerUpgradeClient.ApplyUpgradeCalls(func(applyUpgradeOptions *clusterctl.ApplyUpgradeOptions) error { - applyUpgradeOptionsRecvd = *applyUpgradeOptions - return nil - }) - }) - It("should still apply the providers version upgrade to the same versions", func() { - Expect(applyUpgradeOptionsRecvd.CoreProvider).Should(Equal("capi-system/cluster-api:v0.3.11")) - Expect(applyUpgradeOptionsRecvd.BootstrapProviders[0]).Should(Equal("capi-kubeadm-bootstrap-system/kubeadm:v0.3.11")) - Expect(applyUpgradeOptionsRecvd.ControlPlaneProviders[0]).Should(Equal("capi-kubeadm-control-plane-system/kubeadm:v0.3.11")) - Expect(applyUpgradeOptionsRecvd.InfrastructureProviders[0]).Should(Equal("capv-system/vsphere:v0.7.1")) - Expect(providerUpgradeClient.ApplyUpgradeCallCount()).Should(Equal(1)) - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("When some(cluster-api, Infrastructure-vsphere) providers current versions are not up to date", func() { - var applyUpgradeOptionsRecvd clusterctl.ApplyUpgradeOptions - BeforeEach(func() { - regionalClusterClient.ListResourcesCalls(func(providers interface{}, options ...crtclient.ListOption) error { - installedProviders, _ := providers.(*clusterctlv1.ProviderList) - installedProviders.Items = []clusterctlv1.Provider{ - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-system", Name: "cluster-api"}, Type: "CoreProvider", Version: "v0.3.2", ProviderName: "cluster-api"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-kubeadm-bootstrap-system", Name: "bootstrap-kubeadm"}, Type: "BootstrapProvider", Version: "v0.3.11", ProviderName: "kubeadm"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-kubeadm-control-plane-system", Name: "control-plane-kubeadm"}, Type: "ControlPlaneProvider", Version: "v0.3.11", ProviderName: "kubeadm"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capv-system", Name: "infrastructure-vsphere"}, Type: "InfrastructureProvider", Version: "v0.6.2", ProviderName: "vsphere"}, - } - return nil - }) - providerUpgradeClient.ApplyUpgradeCalls(func(applyUpgradeOptions *clusterctl.ApplyUpgradeOptions) error { - applyUpgradeOptionsRecvd = *applyUpgradeOptions - return nil - }) - }) - It("should apply the providers version upgrade only for the outdated providers to the latest versions", func() { - Expect(applyUpgradeOptionsRecvd.CoreProvider).Should(Equal("capi-system/cluster-api:v0.3.11")) - Expect(len(applyUpgradeOptionsRecvd.BootstrapProviders)).Should(Equal(0)) - Expect(len(applyUpgradeOptionsRecvd.ControlPlaneProviders)).Should(Equal(0)) - Expect(applyUpgradeOptionsRecvd.InfrastructureProviders[0]).Should(Equal("capv-system/vsphere:v0.7.1")) - Expect(providerUpgradeClient.ApplyUpgradeCallCount()).Should(Equal(1)) - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("When providers current versions are out dated and providers upgraded successfully", func() { - var applyUpgradeOptionsRecvd clusterctl.ApplyUpgradeOptions - BeforeEach(func() { - regionalClusterClient.ListResourcesCalls(func(providers interface{}, options ...crtclient.ListOption) error { - installedProviders, _ := providers.(*clusterctlv1.ProviderList) - installedProviders.Items = []clusterctlv1.Provider{ - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-system", Name: "cluster-api"}, Type: "CoreProvider", Version: "v0.3.1", ProviderName: "cluster-api"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-kubeadm-bootstrap-system", Name: "bootstrap-kubeadm"}, Type: "BootstrapProvider", Version: "v0.3.1", ProviderName: "kubeadm"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capi-kubeadm-control-plane-system", Name: "control-plane-kubeadm"}, Type: "ControlPlaneProvider", Version: "v0.3.1", ProviderName: "kubeadm"}, - {ObjectMeta: metav1.ObjectMeta{Namespace: "capv-system", Name: "infrastructure-vsphere"}, Type: "InfrastructureProvider", Version: "v0.6.1", ProviderName: "vsphere"}, - } - return nil - }) - providerUpgradeClient.ApplyUpgradeCalls(func(applyUpgradeOptions *clusterctl.ApplyUpgradeOptions) error { - applyUpgradeOptionsRecvd = *applyUpgradeOptions - return nil - }) - }) - It("should upgrade providers to the latest versions successfully", func() { - Expect(applyUpgradeOptionsRecvd.CoreProvider).Should(Equal("capi-system/cluster-api:v0.3.11")) - Expect(applyUpgradeOptionsRecvd.BootstrapProviders[0]).Should(Equal("capi-kubeadm-bootstrap-system/kubeadm:v0.3.11")) - Expect(applyUpgradeOptionsRecvd.ControlPlaneProviders[0]).Should(Equal("capi-kubeadm-control-plane-system/kubeadm:v0.3.11")) - Expect(applyUpgradeOptionsRecvd.InfrastructureProviders[0]).Should(Equal("capv-system/vsphere:v0.7.1")) - Expect(providerUpgradeClient.ApplyUpgradeCallCount()).Should(Equal(1)) - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Context("When validating compatibility before management cluster upgrade", func() { - JustBeforeEach(func() { - err = tkgClient.ValidateManagementClusterUpgradeVersionCompatibility(&upgradeClusterOptions, regionalClusterClient) - }) - Context("When getting management cluster TKG version fails", func() { - BeforeEach(func() { - regionalClusterClient.GetManagementClusterTKGVersionReturns("", errors.New("fake GetManagementClusterTKGVersion error")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - errString := `unable to get tkg version of management cluster "fake-cluster-name" in namespace "fake-namespace": fake GetManagementClusterTKGVersion error` - Expect(err.Error()).To(ContainSubstring(errString)) - }) - }) - Context("When the management cluster TKG version is invalid ", func() { - BeforeEach(func() { - regionalClusterClient.GetManagementClusterTKGVersionReturns("InvalidTKGSemanticVersion", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to parse management cluster version InvalidTKGSemanticVersion")) - }) - }) - Context("When TKG version user trying to upgrade has major version greater than 2", func() { - BeforeEach(func() { - regionalClusterClient.GetManagementClusterTKGVersionReturns("v1.5.4", nil) - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v3.0.0.yaml", 2*time.Millisecond) - Expect(err).NotTo(HaveOccurred()) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("upgrading to beyond major version 2 is not yet supported.")) - }) - }) - Context("When the management cluster version is less than 1.6.x during v2.1.0 upgrade", func() { - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v2.1.0.yaml", 2*time.Millisecond) - Expect(err).NotTo(HaveOccurred()) - regionalClusterClient.GetManagementClusterTKGVersionReturns("v1.5.4", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("management cluster version must be 1.6.x to upgrade to 2.1.x")) - }) - }) - Context("When management cluster current TKG version greater than TKG version user trying to upgrade", func() { - BeforeEach(func() { - regionalClusterClient.GetManagementClusterTKGVersionReturns("v1.2.2-rc.1", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("TKG version downgrade is not supported")) - }) - }) - Context("When upgrading the TKG version (skipping a minor version) with skipPrompt set to true", func() { - BeforeEach(func() { - upgradeClusterOptions.SkipPrompt = true - regionalClusterClient.GetManagementClusterTKGVersionReturns("v1.0.2-rc.1", nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - Context("When the management cluster version is 1.6.x during v2.1.0 upgrade", func() { - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v2.1.0.yaml", 2*time.Millisecond) - Expect(err).NotTo(HaveOccurred()) - regionalClusterClient.GetManagementClusterTKGVersionReturns("v1.6.1", nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - }) - }) - Describe("When configuring AWS_AMI_ID for aws cluster upgrade", func() { - const ( - fakeAWSClusterName = "fakeAWSClusterName" - fakeAWSClusterNamespace = "fakeAWSClusterNamespace" - fakeAWSClusterKind = "AWSCluster" - fakeAWSAPIVersion = "infrastructure.cluster.x-k8s.io/v1beta2" - ) - BeforeEach(func() { - setupBomFile("../fakes/config/bom/tkg-bom-v1.3.1.yaml", testingDir) - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - upgradeClusterOptions.TkrVersion = "v1.18.0+vmware.1-tkg.2" - }) - JustBeforeEach(func() { - err = tkgClient.ConfigureAMIID(&upgradeClusterOptions, regionalClusterClient) - }) - Context("When failed to get the cluster", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceCalls(func(cluster interface{}, clusterName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if clusterName == upgradeClusterOptions.ClusterName && namespace == upgradeClusterOptions.Namespace { - return errors.New("failed to get the cluster") - } - return nil - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to get the cluster")) - }) - }) - - Context("When failed to get the InfrastructureRef", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceCalls(func(cluster interface{}, clusterName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if clusterName == upgradeClusterOptions.ClusterName && namespace == upgradeClusterOptions.Namespace { - clusterObj, ok := cluster.(*capi.Cluster) - if !ok { - return errors.New("not a cluster") - } - *clusterObj = capi.Cluster{ - Spec: capi.ClusterSpec{ - InfrastructureRef: nil, - }, - } - } - return nil - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("doest not have a InfrastructureRef")) - }) - }) - - Context("When failed to get the aws cluster", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceCalls(func(cluster interface{}, clusterName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if clusterName == upgradeClusterOptions.ClusterName && namespace == upgradeClusterOptions.Namespace { - clusterObj, ok := cluster.(*capi.Cluster) - if !ok { - return errors.New("not a cluster") - } - *clusterObj = capi.Cluster{ - Spec: capi.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - APIVersion: fakeAWSAPIVersion, - Kind: fakeAWSClusterKind, - Name: fakeAWSClusterName, - Namespace: fakeAWSClusterNamespace, - }, - }, - } - return nil - } else if clusterName == fakeAWSClusterName && namespace == fakeAWSClusterNamespace { - awsclusterObj, ok := cluster.(*unstructured.Unstructured) - if !ok { - return errors.New("not a unstructured aws cluster") - } - - if awsclusterObj.GetAPIVersion() == fakeAWSAPIVersion && - awsclusterObj.GetKind() == fakeAWSClusterKind { - return errors.New("failed to get aws cluster") - } - return nil - } - return errors.Errorf("invalid clusterName %s and namespace %s", clusterName, namespace) - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to get aws cluster")) - }) - }) - - Context("When failed to get the aws cluster spec", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceCalls(func(cluster interface{}, clusterName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if clusterName == upgradeClusterOptions.ClusterName && namespace == upgradeClusterOptions.Namespace { - clusterObj, ok := cluster.(*capi.Cluster) - if !ok { - return errors.New("not a cluster") - } - *clusterObj = capi.Cluster{ - Spec: capi.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - APIVersion: fakeAWSAPIVersion, - Kind: fakeAWSClusterKind, - Name: fakeAWSClusterName, - Namespace: fakeAWSClusterNamespace, - }, - }, - } - return nil - } else if clusterName == fakeAWSClusterName && namespace == fakeAWSClusterNamespace { - awsclusterObj, ok := cluster.(*unstructured.Unstructured) - if !ok { - return errors.New("not a unstructured aws cluster") - } - - if awsclusterObj.GetAPIVersion() == fakeAWSAPIVersion && - awsclusterObj.GetKind() == fakeAWSClusterKind { - awsclusterObj.Object[constants.SPEC] = nil - } - return nil - } - return errors.Errorf("invalid clusterName %s and namespace %s", clusterName, namespace) - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("has empty spec")) - }) - }) - - Context("When failed to get the aws cluster region", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceCalls(func(cluster interface{}, clusterName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if clusterName == upgradeClusterOptions.ClusterName && namespace == upgradeClusterOptions.Namespace { - clusterObj, ok := cluster.(*capi.Cluster) - if !ok { - return errors.New("not a cluster") - } - *clusterObj = capi.Cluster{ - Spec: capi.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - APIVersion: fakeAWSAPIVersion, - Kind: fakeAWSClusterKind, - Name: fakeAWSClusterName, - Namespace: fakeAWSClusterNamespace, - }, - }, - } - return nil - } else if clusterName == fakeAWSClusterName && namespace == fakeAWSClusterNamespace { - awsclusterObj, ok := cluster.(*unstructured.Unstructured) - if !ok { - return errors.New("not a unstructured aws cluster") - } - - if awsclusterObj.GetAPIVersion() == fakeAWSAPIVersion && - awsclusterObj.GetKind() == fakeAWSClusterKind { - spec := map[string]interface{}{} - awsclusterObj.Object[constants.SPEC] = spec - } - return nil - } - return errors.Errorf("invalid clusterName %s and namespace %s", clusterName, namespace) - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("has empty region")) - }) - }) - - Context("When succeeded getting the AWS_AMI_ID", func() { - BeforeEach(func() { - regionalClusterClient.GetResourceCalls(func(cluster interface{}, clusterName, namespace string, postVerify clusterclient.PostVerifyrFunc, pollOptions *clusterclient.PollOptions) error { - if clusterName == upgradeClusterOptions.ClusterName && namespace == upgradeClusterOptions.Namespace { - clusterObj, ok := cluster.(*capi.Cluster) - if !ok { - return errors.New("not a cluster") - } - *clusterObj = capi.Cluster{ - Spec: capi.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - APIVersion: fakeAWSAPIVersion, - Kind: fakeAWSClusterKind, - Name: fakeAWSClusterName, - Namespace: fakeAWSClusterNamespace, - }, - }, - } - return nil - } else if clusterName == fakeAWSClusterName && namespace == fakeAWSClusterNamespace { - awsclusterObj, ok := cluster.(*unstructured.Unstructured) - if !ok { - return errors.New("not a unstructured aws cluster") - } - - if awsclusterObj.GetAPIVersion() == fakeAWSAPIVersion && - awsclusterObj.GetKind() == fakeAWSClusterKind { - spec := map[string]interface{}{} - spec["region"] = "us-west-2" - awsclusterObj.Object[constants.SPEC] = spec - } - return nil - } - return errors.Errorf("invalid clusterName %s and namespace %s", clusterName, namespace) - }) - }) - It("should get the AWS_AMI_ID along with OS_NAME, OS_VERSION, and OS_ARCH", func() { - Expect(err).ToNot(HaveOccurred()) - amiID, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSAMIID) - Expect(err).ToNot(HaveOccurred()) - Expect(amiID).To(Equal("ami-03f483756fb3350c7")) - osName, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableOSName) - Expect(err).ToNot(HaveOccurred()) - Expect(osName).To(Equal("ubuntu")) - osVersion, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableOSVersion) - Expect(err).ToNot(HaveOccurred()) - Expect(osVersion).To(Equal("20.04")) - osArch, err := tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableOSArch) - Expect(err).ToNot(HaveOccurred()) - Expect(osArch).To(Equal("amd64")) - }) - }) - }) -}) diff --git a/tkg/client/utils.go b/tkg/client/utils.go deleted file mode 100644 index 1fddb80a46..0000000000 --- a/tkg/client/utils.go +++ /dev/null @@ -1,447 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "fmt" - "net" - "os" - "path/filepath" - "regexp" - "time" - - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfighelper" - - "github.com/imdario/mergo" - "github.com/pkg/errors" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - capi "sigs.k8s.io/cluster-api/api/v1alpha3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -var isStringDigitsHyphenAndLowerCaseChars = regexp.MustCompile(`^[a-z0-9-]*$`).MatchString - -const ( - trueStr = "true" - falseStr = "false" -) - -func getDefaultKubeConfigFile() string { - rules := clientcmd.NewDefaultClientConfigLoadingRules() - return rules.GetDefaultFilename() -} - -func getCurrentContextFromDefaultKubeConfig() (string, error) { - defaultKubeconfig := getDefaultKubeConfigFile() - configObj, err := clientcmd.LoadFromFile(defaultKubeconfig) - if err != nil { - return "", err - } - return configObj.CurrentContext, nil -} - -// MergeKubeConfigAndSwitchContext merges kubeconfig and switches the kube-context -func MergeKubeConfigAndSwitchContext(kubeConfig []byte, mergeFile string) (string, error) { - if mergeFile == "" { - mergeFile = getDefaultKubeConfigFile() - } - newConfig, err := clientcmd.Load(kubeConfig) - if err != nil { - return "", errors.Wrap(err, "unable to load kubeconfig") - } - context := newConfig.CurrentContext - if _, err := os.Stat(mergeFile); os.IsNotExist(err) { - return "", clientcmd.WriteToFile(*newConfig, mergeFile) - } - - dest, err := clientcmd.LoadFromFile(mergeFile) - if err != nil { - return "", errors.Wrap(err, "unable to load kube config") - } - err = mergo.MergeWithOverwrite(dest, newConfig) - if err != nil { - return "", errors.Wrap(err, "failed to merge config") - } - - err = clientcmd.WriteToFile(*dest, mergeFile) - if err != nil { - return "", errors.Wrapf(err, "failed to write config to %s: %s", mergeFile, err) - } - return context, nil -} - -// MergeKubeConfigWithoutSwitchContext merges kubeconfig without updating kubecontext -func MergeKubeConfigWithoutSwitchContext(kubeConfig []byte, mergeFile string) error { - if mergeFile == "" { - mergeFile = getDefaultKubeConfigFile() - } - newConfig, err := clientcmd.Load(kubeConfig) - if err != nil { - return errors.Wrap(err, "unable to load kubeconfig") - } - - if _, err := os.Stat(mergeFile); os.IsNotExist(err) { - return clientcmd.WriteToFile(*newConfig, mergeFile) - } - - dest, err := clientcmd.LoadFromFile(mergeFile) - if err != nil { - return errors.Wrap(err, "unable to load kube config") - } - - context := dest.CurrentContext - err = mergo.MergeWithOverwrite(dest, newConfig) - if err != nil { - return errors.Wrap(err, "failed to merge config") - } - dest.CurrentContext = context - - return clientcmd.WriteToFile(*dest, mergeFile) -} - -// GetCurrentClusterKubeConfigFromFile gets current cluster kubeconfig from kubeconfig file -func GetCurrentClusterKubeConfigFromFile(kubeConfigPath string) ([]byte, error) { - bytes, err := os.ReadFile(kubeConfigPath) - if err != nil { - return nil, err - } - configObj, err := clientcmd.Load(bytes) - if err != nil { - return nil, errors.Wrap(err, "unable to load kubeconfig") - } - - users := make(map[string]*clientcmdapi.AuthInfo) - clusters := make(map[string]*clientcmdapi.Cluster) - contexts := make(map[string]*clientcmdapi.Context) - - user := "" - clusterName := "" - - for k, v := range configObj.Contexts { - if k == configObj.CurrentContext { - user = v.AuthInfo - clusterName = v.Cluster - contexts[k] = v - } - } - - for k, v := range configObj.Clusters { - if k == clusterName { - clusters[k] = v - } - } - - for k, v := range configObj.AuthInfos { - if k == user { - users[k] = v - } - } - - configObj.AuthInfos = users - configObj.Clusters = clusters - configObj.Contexts = contexts - return clientcmd.Write(*configObj) -} - -func getTKGKubeConfigPath(persist bool) (string, error) { - homeDir, err := os.UserHomeDir() - if err != nil { - return "", errors.Wrapf(err, "Unable to get home directory") - } - - path := filepath.Join(homeDir, constants.TKGKubeconfigDir) - filePath := "" - - if persist { - // management cluster kubeconfig is persisted at $HOME/.kube-tkg/config - filePath = filepath.Join(path, constants.TKGKubeconfigFile) - } else { - path = filepath.Join(path, constants.TKGKubeconfigTmpDir) - // kind/workload cluster kubeconfig is persisted at $HOME/.kube-tkg/tmp/config_[random-string] - filePath = filepath.Join(path, fmt.Sprintf("config_%s", utils.GenerateRandomID(8, false))) - } - - // create tkg kubeconfig directory - if _, err := os.Stat(path); os.IsNotExist(err) { - err = os.MkdirAll(path, constants.DefaultDirectoryPermissions) - if err != nil { - return "", err - } - } else if err != nil { - return "", err - } - - // create tkg kubeconfig file - if _, err := os.Stat(filePath); os.IsNotExist(err) { - _, err := os.Create(filePath) - if err != nil { - return "", err - } - } else if err != nil { - return "", err - } - - return filePath, err -} - -// DeleteContextFromKubeConfig deletes the context and the cluster information from give kubeconfigPath -func DeleteContextFromKubeConfig(kubeconfigPath, context string) error { - confiObj, err := clientcmd.LoadFromFile(kubeconfigPath) - if err != nil { - return errors.Wrap(err, "unable to load kube config") - } - - clusterName := "" - // if the context is not present in the kubeconfigPath, nothing to do - c, ok := confiObj.Contexts[context] - if !ok { - return nil - } - clusterName = c.Cluster - - delete(confiObj.Contexts, context) - delete(confiObj.Clusters, clusterName) - - shouldWarn := false - if confiObj.CurrentContext == context { - confiObj.CurrentContext = "" - shouldWarn = true - } - err = clientcmd.WriteToFile(*confiObj, kubeconfigPath) - if err != nil { - return errors.Wrapf(err, "failed to delete the context '%s' ", context) - } - - if shouldWarn { - log.Warningf("warning: this removed your active context, use \"kubectl config use-context\" to select a different one") - } - - return nil -} - -func getClusterOptionsEnableList(enableClusterOptions []string) ([]string, error) { - if len(enableClusterOptions) == 0 { - return nil, nil - } - - optionsToBeEnabled := []string{} - incorrectFormatOptions := []string{} - for _, option := range enableClusterOptions { - if !isStringDigitsHyphenAndLowerCaseChars(option) { - incorrectFormatOptions = append(incorrectFormatOptions, option) - } - if len(incorrectFormatOptions) == 0 { - optionsToBeEnabled = append(optionsToBeEnabled, option) - } - } - if len(incorrectFormatOptions) != 0 { - return nil, errors.Errorf("cluster options %v does not meet the naming convention. Option name should contain only lower case characters, hyphen and digits", incorrectFormatOptions) - } - - return optionsToBeEnabled, nil -} - -// TimedExecution returns time taken to execure a command -func TimedExecution(command func() error) (time.Duration, error) { - start := time.Now() - err := command() - return time.Since(start), err -} - -// Once #164 is resolved we can upgrade to the v1alpha4 Cluster types and -// remove type ClusterIPFamily, func GetIPFamily, and func ipFamilyForCIDRStrings -// https://github.com/kubernetes-sigs/cluster-api/blob/c6803793164abe26b61dae2f1b9b375d4acbecf9/api/v1alpha4/cluster_types.go#L224-L291 - -// ClusterIPFamily defines the types of supported IP families. -type ClusterIPFamily int - -// Define the ClusterIPFamily constants. -const ( - InvalidIPFamily ClusterIPFamily = iota - IPv4IPFamily - IPv6IPFamily - DualStackIPFamily -) - -func (f ClusterIPFamily) String() string { - return [...]string{"InvalidIPFamily", "IPv4IPFamily", "IPv6IPFamily", "DualStackIPFamily"}[f] -} - -// GetIPFamily returns a ClusterIPFamily from the configuration provided. -func GetIPFamily(c *capi.Cluster) (ClusterIPFamily, error) { - var podCIDRs, serviceCIDRs []string - if c.Spec.ClusterNetwork != nil { - if c.Spec.ClusterNetwork.Pods != nil { - podCIDRs = c.Spec.ClusterNetwork.Pods.CIDRBlocks - } - if c.Spec.ClusterNetwork.Services != nil { - serviceCIDRs = c.Spec.ClusterNetwork.Services.CIDRBlocks - } - } - if len(podCIDRs) == 0 && len(serviceCIDRs) == 0 { - return IPv4IPFamily, nil - } - - podsIPFamily, err := ipFamilyForCIDRStrings(podCIDRs) - if err != nil { - return InvalidIPFamily, fmt.Errorf("pods: %s", err) - } - if len(serviceCIDRs) == 0 { - return podsIPFamily, nil - } - - servicesIPFamily, err := ipFamilyForCIDRStrings(serviceCIDRs) - if err != nil { - return InvalidIPFamily, fmt.Errorf("services: %s", err) - } - if len(podCIDRs) == 0 { - return servicesIPFamily, nil - } - - if podsIPFamily == DualStackIPFamily { - return DualStackIPFamily, nil - } else if podsIPFamily != servicesIPFamily { - return InvalidIPFamily, errors.New("pods and services IP family mismatch") - } - - return podsIPFamily, nil -} - -func ipFamilyForCIDRStrings(cidrs []string) (ClusterIPFamily, error) { - if len(cidrs) > 2 { - return InvalidIPFamily, errors.New("too many CIDRs specified") - } - var foundIPv4 bool - var foundIPv6 bool - for _, cidr := range cidrs { - ip, _, err := net.ParseCIDR(cidr) - if err != nil { - return InvalidIPFamily, fmt.Errorf("could not parse CIDR: %s", err) - } - if ip.To4() != nil { - foundIPv4 = true - } else { - foundIPv6 = true - } - } - switch { - case foundIPv4 && foundIPv6: - return DualStackIPFamily, nil - case foundIPv4: - return IPv4IPFamily, nil - case foundIPv6: - return IPv6IPFamily, nil - default: - return InvalidIPFamily, nil - } -} - -func (c *TkgClient) getMachineCountForMC(plan string) (int, int) { - // set controlplane and worker counts to default initially - controlPlaneMachineCount, workerMachineCount := c.getDefaultMachineCountForMC(plan) - - // override controlplane and worker counts with user configured values if they exist - if cpc, err := tkgconfighelper.GetIntegerVariableFromConfig(constants.ConfigVariableControlPlaneMachineCount, c.TKGConfigReaderWriter()); err == nil { - if cpc%2 == 1 { - controlPlaneMachineCount = cpc - } else { - log.Infof("Using default value for CONTROL_PLANE_MACHINE_COUNT = %d. Reason: Provided value is an even number", controlPlaneMachineCount) - } - } else { - log.Infof("Using default value for CONTROL_PLANE_MACHINE_COUNT = %d. Reason: %s", controlPlaneMachineCount, err.Error()) - } - if wc, err := tkgconfighelper.GetIntegerVariableFromConfig(constants.ConfigVariableWorkerMachineCount, c.TKGConfigReaderWriter()); err == nil { - workerMachineCount = wc - } else { - log.Infof("Using default value for WORKER_MACHINE_COUNT = %d. Reason: %s", workerMachineCount, err.Error()) - } - - return controlPlaneMachineCount, workerMachineCount -} - -func (c *TkgClient) getDefaultMachineCountForMC(plan string) (int, int) { - // set controlplane and worker counts to default initially - var controlPlaneMachineCount int - var workerMachineCount int - - controlPlaneMachineCount = constants.DefaultDevControlPlaneMachineCount - workerMachineCount = constants.DefaultDevWorkerMachineCount - - if IsProdPlan(plan) { - // update controlplane count for prod plan - controlPlaneMachineCount = constants.DefaultProdControlPlaneMachineCount - workerMachineCount = constants.DefaultProdWorkerMachineCount - } - - return controlPlaneMachineCount, workerMachineCount -} - -func (c *TkgClient) validateEnvVariables(regionalClusterClient clusterclient.Client) error { - infraProviderName, err := getInfraNameFromRegionContext(regionalClusterClient) - if err != nil { - return errors.Wrap(err, "Unable to get infra provider from the context") - } - - err = c.ValidateEnvVariables(infraProviderName) - if err != nil { - return errors.Wrap(err, "required env variables are not set") - } - return nil -} - -func getInfraNameFromRegionContext(regionalClusterClient clusterclient.Client) (string, error) { - infraProvider, err := regionalClusterClient.GetRegionalClusterDefaultProviderName(clusterctlv1.InfrastructureProviderType) - if err != nil { - return "", errors.Wrap(err, "failed to get cluster provider information.") - } - - infraProviderName, _, err := ParseProviderName(infraProvider) - if err != nil { - return "", errors.Wrap(err, "failed to parse provider name") - } - - return infraProviderName, nil -} - -func getCCPlanFromLegacyPlan(plan string) (string, error) { - switch plan { - case constants.PlanDev: - return constants.PlanDevCC, nil - case constants.PlanProd: - return constants.PlanProdCC, nil - case constants.PlanDevCC: - return constants.PlanDevCC, nil - case constants.PlanProdCC: - return constants.PlanProdCC, nil - } - return "", errors.Errorf("unknown plan '%v'", plan) -} - -func IsProdPlan(plan string) bool { - return plan == constants.PlanProd || plan == constants.PlanProdCC -} - -// Sets the appropriate CAPI ClusterTopology configuration unless it has been explicitly overridden -func (c *TkgClient) ensureClusterTopologyConfiguration() { - clusterTopologyValueToSet := trueStr - if !c.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - value, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterTopology) - if err != nil { - clusterTopologyValueToSet = falseStr - } else { - log.V(6).Infof("%v configuration already set to %q", constants.ConfigVariableClusterTopology, value) - return - } - } - log.V(6).Infof("Setting %v to %q", constants.ConfigVariableClusterTopology, clusterTopologyValueToSet) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterTopology, clusterTopologyValueToSet) -} diff --git a/tkg/client/utils_test.go b/tkg/client/utils_test.go deleted file mode 100644 index 38e5d37e60..0000000000 --- a/tkg/client/utils_test.go +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "os" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - "k8s.io/client-go/tools/clientcmd" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -type MockFeatureFlagClient struct { - FeatureValues map[string]bool -} - -func (m *MockFeatureFlagClient) IsConfigFeatureActivated(featurePath string) (bool, error) { - if val, ok := m.FeatureValues[featurePath]; ok { - return val, nil - } - return false, errors.Errorf("missing key %s\n", featurePath) -} - -var _ = Describe("Utils", func() { - var ( - tempKubeConfigPath string - err error - contextName string - testingDir string - ) - - BeforeEach((func() { - testingDir = fakehelper.CreateTempTestingDirectory() - })) - - AfterEach((func() { - fakehelper.DeleteTempTestingDirectory(testingDir) - })) - - Describe("DeleteContextFromKubeConfig tests", func() { - BeforeEach(func() { - f, err := os.CreateTemp("", "yaml") - Expect(err).ToNot(HaveOccurred()) - tempKubeConfigPath = f.Name() - copyFile("../fakes/config/kubeconfig/config1.yaml", tempKubeConfigPath) - }) - AfterEach(func() { - _ = utils.DeleteFile(tempKubeConfigPath) - }) - - JustBeforeEach(func() { - err = DeleteContextFromKubeConfig(tempKubeConfigPath, contextName) - }) - Context("When context to be deleted is not present in the kubeconfig file", func() { - BeforeEach(func() { - contextName = "fake-nonexisting-context" - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - Context("When context to be deleted is present in the kubeconfig file", func() { - BeforeEach(func() { - contextName = "queen-anne-context" - }) - It("should not return error and delete the context and cluster from kubeconfig file", func() { - Expect(err).ToNot(HaveOccurred()) - config, err1 := clientcmd.LoadFromFile(tempKubeConfigPath) - Expect(err1).ToNot(HaveOccurred()) - _, ok := config.Contexts[contextName] - Expect(ok).To(Equal(false)) - _, ok = config.Clusters["pig-cluster"] - Expect(ok).To(Equal(false)) - }) - }) - Context("When context to be deleted is present in the kubeconfig file and is current context", func() { - BeforeEach(func() { - contextName = "federal-context" - }) - It("should not return error and delete the context,cluster and also set the current-context to empty string", func() { - Expect(err).ToNot(HaveOccurred()) - config, err1 := clientcmd.LoadFromFile(tempKubeConfigPath) - Expect(err1).ToNot(HaveOccurred()) - _, ok := config.Contexts[contextName] - Expect(ok).To(Equal(false)) - _, ok = config.Clusters["horse-cluster"] - Expect(ok).To(Equal(false)) - Expect(config.CurrentContext).To(Equal("")) - }) - }) - }) - - Describe("Set machine counts", func() { - var ( - err error - tkgClient *TkgClient - ) - - BeforeEach(func() { - tkgClient, err = createTKGClient("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - }) - - Describe("When plan is prod", func() { - plan := "prod" - It("Get default MC machine counts", func() { - defaultCPCount, defaultWorkerCount := tkgClient.getMachineCountForMC(plan) - Expect(defaultCPCount).To(Equal(3)) - Expect(defaultWorkerCount).To(Equal(3)) - }) - - It("Override default MC machine counts", func() { - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableControlPlaneMachineCount, "5") - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableWorkerMachineCount, "7") - defaultCPCount, defaultWorkerCount := tkgClient.getMachineCountForMC(plan) - Expect(defaultCPCount).To(Equal(5)) - Expect(defaultWorkerCount).To(Equal(7)) - }) - }) - - Describe("When plan is dev", func() { - plan := "dev" - It("Get default MC machine counts", func() { - defaultCPCount, defaultWorkerCount := tkgClient.getMachineCountForMC(plan) - Expect(defaultCPCount).To(Equal(1)) - Expect(defaultWorkerCount).To(Equal(1)) - }) - - It("Override default MC machine counts", func() { - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableControlPlaneMachineCount, "5") - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableWorkerMachineCount, "7") - defaultCPCount, defaultWorkerCount := tkgClient.getMachineCountForMC(plan) - Expect(defaultCPCount).To(Equal(5)) - Expect(defaultWorkerCount).To(Equal(7)) - }) - - It("Use default default machine counts if overrides are even", func() { - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableControlPlaneMachineCount, "4") - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableWorkerMachineCount, "6") - defaultCPCount, defaultWorkerCount := tkgClient.getMachineCountForMC(plan) - Expect(defaultCPCount).To(Equal(1)) - Expect(defaultWorkerCount).To(Equal(6)) - }) - }) - }) - - Describe("GetCCPlanFromLegacyPlan", func() { - It("when dev plan is used", func() { - plan, err := getCCPlanFromLegacyPlan(constants.PlanDev) - Expect(err).ToNot(HaveOccurred()) - Expect(plan).To(Equal(constants.PlanDevCC)) - }) - It("when prod plan is used", func() { - plan, err := getCCPlanFromLegacyPlan(constants.PlanProd) - Expect(err).ToNot(HaveOccurred()) - Expect(plan).To(Equal(constants.PlanProdCC)) - }) - It("when devcc plan is used", func() { - plan, err := getCCPlanFromLegacyPlan(constants.PlanDevCC) - Expect(err).ToNot(HaveOccurred()) - Expect(plan).To(Equal(constants.PlanDevCC)) - }) - It("when prodcc plan is used", func() { - plan, err := getCCPlanFromLegacyPlan(constants.PlanProdCC) - Expect(err).ToNot(HaveOccurred()) - Expect(plan).To(Equal(constants.PlanProdCC)) - }) - It("when random plan is used", func() { - _, err := getCCPlanFromLegacyPlan("random") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("unknown plan 'random'")) - }) - }) - - Describe("ensureClusterTopologyConfiguration", func() { - var ( - err error - tkgClient *TkgClient - featureFlagClient *MockFeatureFlagClient - value string - ) - - BeforeEach(func() { - featureFlagClient = &MockFeatureFlagClient{map[string]bool{}} - tkgClient, err = createTKGClientOpts("../fakes/config/config.yaml", testingDir, "../fakes/config/bom/tkg-bom-v1.3.1.yaml", 2*time.Second, func(o Options) Options { - o.FeatureFlagClient = featureFlagClient - return o - }) - Expect(err).NotTo(HaveOccurred()) - }) - - Context("when feature flag is set to enable CC use", func() { - BeforeEach(func() { - featureFlagClient.FeatureValues[constants.FeatureFlagPackageBasedCC] = true - }) - - It("The cluster topology configuration is always set to true", func() { - tkgClient.ensureClusterTopologyConfiguration() - value, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterTopology) - Expect(err).NotTo(HaveOccurred()) - Expect(value).To(Equal("true")) - - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterTopology, "false") - tkgClient.ensureClusterTopologyConfiguration() - value, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterTopology) - Expect(err).NotTo(HaveOccurred()) - Expect(value).To(Equal("true")) - - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterTopology, "true") - tkgClient.ensureClusterTopologyConfiguration() - value, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterTopology) - Expect(err).NotTo(HaveOccurred()) - Expect(value).To(Equal("true")) - }) - }) - - Context("when feature flag is set to not enable CC use", func() { - BeforeEach(func() { - featureFlagClient.FeatureValues[constants.FeatureFlagPackageBasedCC] = false - }) - - Context("when CLUSTER_TOPOLOGY is explicitly overridden", func() { - It("The retains the value", func() { - var value string //nolint:govet - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterTopology, "false") - tkgClient.ensureClusterTopologyConfiguration() - value, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterTopology) - Expect(err).NotTo(HaveOccurred()) - Expect(value).To(Equal("false")) - - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterTopology, "true") - tkgClient.ensureClusterTopologyConfiguration() - value, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterTopology) - Expect(err).NotTo(HaveOccurred()) - Expect(value).To(Equal("true")) - }) - }) - - Context("when CLUSTER_TOPOLOGY is not previously set", func() { - It("The cluster topology configuration is set to false", func() { - tkgClient.ensureClusterTopologyConfiguration() - value, err = tkgClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterTopology) - Expect(err).NotTo(HaveOccurred()) - Expect(value).To(Equal("false")) - }) - }) - }) - - }) - -}) diff --git a/tkg/client/validate.go b/tkg/client/validate.go deleted file mode 100644 index f978a68749..0000000000 --- a/tkg/client/validate.go +++ /dev/null @@ -1,2177 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "bytes" - "context" - "encoding/base64" - "fmt" - "net" - "net/url" - "os" - "os/exec" - "path/filepath" - "regexp" - "strconv" - "strings" - "time" - - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - clusterctlclient "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - netutils "k8s.io/utils/net" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/avi" - "github.com/vmware-tanzu/tanzu-framework/tkg/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfighelper" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigproviders" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -// error code constants -const ( - ValidationErrorCode = 1 - PacificInVC7ErrorCode = 2 - PacificNotInVC7ErrorCode = 3 -) - -// AWS config variables -var ( - AWSNewVPCConfigVariables = []string{constants.ConfigVariableAWSPublicNodeCIDR, constants.ConfigVariableAWSPrivateNodeCIDR, constants.ConfigVariableAWSVPCCIDR} - AWSProdNewVPCConfigVariables = []string{constants.ConfigVariableAWSPublicNodeCIDR1, constants.ConfigVariableAWSPrivateNodeCIDR1, constants.ConfigVariableAWSPublicNodeCIDR2, constants.ConfigVariableAWSPrivateNodeCIDR2} - AWSSubnetIDConfigVariables = []string{constants.ConfigVariableAWSPrivateSubnetID, constants.ConfigVariableAWSPublicSubnetID} - AWSProdSubnetIDConfigVariables = []string{constants.ConfigVariableAWSPrivateSubnetID1, constants.ConfigVariableAWSPublicSubnetID1, constants.ConfigVariableAWSPrivateSubnetID2, constants.ConfigVariableAWSPublicSubnetID2} - VsphereNodeCPUVarName = []string{constants.ConfigVariableVsphereCPNumCpus, constants.ConfigVariableVsphereWorkerNumCpus} - VsphereNodeMemVarName = []string{constants.ConfigVariableVsphereCPMemMib, constants.ConfigVariableVsphereWorkerMemMib} - VsphereNodeDiskVarName = []string{constants.ConfigVariableVsphereCPDiskGib, constants.ConfigVariableVsphereWorkerDiskGib} - - AWSPrivateSubnetIDConfigVariables = []string{constants.ConfigVariableAWSPrivateSubnetID, constants.ConfigVariableAWSPrivateSubnetID1, constants.ConfigVariableAWSPrivateSubnetID2} - AWSPublicSubnetIDConfigVariables = []string{constants.ConfigVariableAWSPublicSubnetID, constants.ConfigVariableAWSPublicSubnetID1, constants.ConfigVariableAWSPublicSubnetID2} -) - -var trueString = "true" - -// VsphereResourceConfigKeys vsphere resource types -var VsphereResourceConfigKeys = []string{constants.ConfigVariableVsphereDatacenter, constants.ConfigVariableVsphereNetwork, constants.ConfigVariableVsphereResourcePool, constants.ConfigVariableVsphereDatastore, constants.ConfigVariableVsphereFolder} - -// CNITypes supported CNI types -var CNITypes = map[string]bool{"calico": true, "antrea": true, "none": true} - -// ValidationError defines error during config validation -type ValidationError struct { - Message string - Code int -} - -// NodeSizeOptions contains node size options specified by user -type NodeSizeOptions struct { - Size string - ControlPlaneSize string - WorkerSize string -} - -// Error returns error message from validation error -func (e *ValidationError) Error() string { - return e.Message -} - -// NewValidationError creates new validation error object -func NewValidationError(code int, text string) *ValidationError { - return &ValidationError{ - Message: text, - Code: code, - } -} - -// DownloadBomFile downloads BoM file -func (c *TkgClient) DownloadBomFile(tkrName string) error { - log.V(1).Infof("Downloading bom for TKr %q", tkrName) - - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - regionalClusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return errors.Wrap(err, "unable to get cluster client while listing tkg clusters") - } - - namespace := constants.TkrNamespace - if config.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - //TODO: After CLI fully support cluster class, "constants.TkrNamespace" should be updated to "tkg-system" - namespace = "tkg-system" - } - - tkrConfigMap := &corev1.ConfigMap{} - if err := regionalClusterClient.GetResource(tkrConfigMap, tkrName, namespace, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - return errors.Errorf("ConfigMap for TKr name %q not available to download bom", tkrName) - } - - return err - } - - bomData := tkrConfigMap.BinaryData["bomContent"] - - bomDir, err := c.tkgConfigPathsClient.GetTKGBoMDirectory() - if err != nil { - return err - } - - return os.WriteFile(filepath.Join(bomDir, "tkr-bom-"+tkrName+".yaml"), bomData, 0o600) -} - -// ConfigureAndValidateTkrVersion takes tkrVersion, if empty fetches default tkr & k8s version from config -// and validates k8s version format is valid semantic version -func (c *TkgClient) ConfigureAndValidateTkrVersion(tkrVersion string) (string, string, error) { - var k8sVersion string - var err error - - // use default BoM file if tkrVersion is not provided - if tkrVersion == "" { - tkrBoMConfig, err := c.tkgBomClient.GetDefaultTkrBOMConfiguration() - if err != nil { - return "", "", errors.Wrap(err, "unable to get default TKr bom") - } - tkrVersion = tkrBoMConfig.Release.Version - k8sVersion, err = tkgconfigbom.GetK8sVersionFromTkrBoM(tkrBoMConfig) - if err != nil { - return "", "", errors.Wrap(err, "unable to get default k8s version from TKr bom") - } - } else { - // BoM downloading should only be required if user are passing tkrName, - // otherwise we should use default config which is always present on user's machine - - // download bom if not present locally for given TKr - _, err = c.tkgBomClient.GetBOMConfigurationFromTkrVersion(tkrVersion) - if err != nil { - _, ok := err.(tkgconfigbom.BomNotPresent) - if ok { // bom not present locally - if err := c.DownloadBomFile(utils.GetTkrNameFromTkrVersion(tkrVersion)); err != nil { - return "", "", err - } - } else { - return "", "", err - } - } - k8sVersion, err = c.tkgBomClient.GetK8sVersionFromTkrVersion(tkrVersion) - if err != nil { - return "", "", err - } - } - - if !strings.HasPrefix(k8sVersion, "v") { - return "", "", errors.Errorf("unsupported KubernetesVersion: %s. Kubernetes version should have prefix v", k8sVersion) - } - - // Set tkrName and k8sVersion to the tkg config - c.TKGConfigReaderWriter().Set(constants.ConfigVariableKubernetesVersion, k8sVersion) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableTkrName, utils.GetTkrNameFromTkrVersion(tkrVersion)) - - return k8sVersion, tkrVersion, nil -} - -// ConfigureAzureVMImage configures azure image from BoM or user config file -func (c *TkgClient) ConfigureAzureVMImage(tkrVersion string) error { - azureVMImage, err := c.tkgConfigProvidersClient.GetAzureVMImageInfo(tkrVersion) - if err != nil { - return err - } - - if azureVMImage == nil { - osInfo := tkgconfighelper.GetUserProvidedOsOptions(c.TKGConfigReaderWriter()) - return errors.Errorf("unable to find the azure vm image info for TKr version: '%v' and os options: '(%v,%v,%v)'", tkrVersion, osInfo.Name, osInfo.Version, osInfo.Arch) - } - - // using image ID - if azureVMImage.ID != "" { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureImageID, azureVMImage.ID) - } - - // using shared gallery image - if isSharedGalleryImage(azureVMImage) { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureImageResourceGroup, azureVMImage.ResourceGroup) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureImageName, azureVMImage.Name) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureImageSubscriptionID, azureVMImage.SubscriptionID) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureImageGallery, azureVMImage.Gallery) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureImageVersion, azureVMImage.Version) - } - - // using market place image - if isMarketplaceImage(azureVMImage) { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureImagePublisher, azureVMImage.Publisher) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureImageOffer, azureVMImage.Offer) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureImageSku, azureVMImage.Sku) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureImageVersion, azureVMImage.Version) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureImageThirdParty, strconv.FormatBool(azureVMImage.ThirdPartyImage)) - } - - if azureVMImage.ID != "" || isSharedGalleryImage(azureVMImage) || isMarketplaceImage(azureVMImage) { - log.V(6).Infof("consuming Azure Image info: %v", *azureVMImage) - - // configure OS name, version and arch for the selected OS - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSName, azureVMImage.OSInfo.Name) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSVersion, azureVMImage.OSInfo.Version) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSArch, azureVMImage.OSInfo.Arch) - return nil - } - - return errors.Errorf("invalid azure image info: %v, for TKr version: %v", *azureVMImage, tkrVersion) -} - -// ConfigureAndValidateAzureConfig configures and validates azure configurationn -func (c *TkgClient) ConfigureAndValidateAzureConfig(tkrVersion string, nodeSizes NodeSizeOptions, skipValidation bool, clusterClient clusterclient.Client) error { - var client azure.Client - var err error - - c.SetProviderType(AzureProviderName) - - if !skipValidation { - client, err = c.EncodeAzureCredentialsAndGetClient(clusterClient) - if err != nil { - return errors.Wrapf(err, "failed to initialize Azure client") - } - - err = c.ValidateAzurePublicSSHKey() - if err != nil { - return errors.Wrapf(err, "failed to validate %s", constants.ConfigVariableAzureSSHPublicKeyB64) - } - } - - if err := c.OverrideAzureNodeSizeWithOptions(client, nodeSizes, skipValidation); err != nil { - return errors.Wrap(err, "cannot set Azure node size") - } - - if tkrVersion == "" { - return errors.New("TKr version is empty") - } - - if err := c.ConfigureAzureVMImage(tkrVersion); err != nil { - return err - } - - return nil -} - -// ConfigureAndValidateOracleConfig configures and validates oracle configurationn -func (c *TkgClient) ConfigureAndValidateOracleConfig(tkrVersion string, nodeSizes NodeSizeOptions, skipValidation bool) error { - c.SetProviderType(OracleProviderName) - - return nil -} - -// ValidateAzurePublicSSHKey validates AZURE_SSH_PUBLIC_KEY_B64 exists and is base64 encoded -func (c *TkgClient) ValidateAzurePublicSSHKey() error { - sshKey, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureSSHPublicKeyB64) - if err != nil { - return errors.Errorf("config variable %s is missing", constants.ConfigVariableAzureSSHPublicKeyB64) - } - _, errD := base64.StdEncoding.DecodeString(sshKey) - if errD != nil { - return errors.Errorf("config variable %s was not properly base64 encoded", constants.ConfigVariableAzureSSHPublicKeyB64) - } - return nil -} - -// ConfigureAndValidateDockerConfig configures and validates docker configuration -func (c *TkgClient) ConfigureAndValidateDockerConfig(tkrVersion string, nodeSizes NodeSizeOptions, skipValidation bool) error { - c.SetProviderType(DockerProviderName) - - if tkrVersion == "" { - return errors.New("TKr version is empty") - } - - bomConfiguration, err := c.tkgBomClient.GetBOMConfigurationFromTkrVersion(tkrVersion) - if err != nil { - return errors.Wrapf(err, "unable to get bom configuration for TKr version %s", tkrVersion) - } - - kindNodeImage := bomConfiguration.Components["kubernetes-sigs_kind"][0].Images["kindNodeImage"] - dockerTemplateImage := tkgconfigbom.GetFullImagePath(kindNodeImage, bomConfiguration.ImageConfig.ImageRepository) + ":" + kindNodeImage.Tag - c.TKGConfigReaderWriter().Set(constants.ConfigVariableDockerMachineTemplateImage, dockerTemplateImage) - return nil -} - -// ConfigureAndValidateAwsConfig configures and validates aws configuration -func (c *TkgClient) ConfigureAndValidateAwsConfig(tkrVersion string, workerMachineCount int64, useExistingVPC bool) error { - if tkrVersion == "" { - return errors.New("TKr version is empty") - } - - bomConfiguration, err := c.tkgBomClient.GetBOMConfigurationFromTkrVersion(tkrVersion) - if err != nil { - return errors.Wrapf(err, "unable to get bom configuration for TKr version %s", tkrVersion) - } - - awsRegion, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSRegion) - if err != nil { - // all missing variables will be handled in a later step where clusterctl generates template and catch all of the missing variables - return nil - } - - if az, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSNodeAz); err == nil && !useExistingVPC { - if !strings.HasPrefix(az, awsRegion) { - return errors.Errorf("Node availability zone %s is not part of AWS region %s. Please check the AWS_REGION environment variable for possible conflict", az, awsRegion) - } - } - - if err := c.configureAMIAndOSForAWS(bomConfiguration, awsRegion); err != nil { - return errors.Wrap(err, "unable to configure AMI and OS options") - } - - // the WorkerMachineCount, if valid, can be used in templates using the ${ WORKER_MACHINE_COUNT } variable. - if workerMachineCount < 0 { - return errors.Errorf("invalid WorkerMachineCount. Please use a number greater or equal than 0") - } - - return nil -} - -func (c *TkgClient) configureAMIAndOSForAWS(bomConfiguration *tkgconfigbom.BOMConfiguration, awsRegion string) error { - if awsAmiID, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSAMIID); awsAmiID != "" { - log.Warningf("The '%s' variable is obsolete. The correct '%s' is obtained from appropriate BoM metadata file or user settings file based on given OS options", constants.ConfigVariableAWSAMIID, constants.ConfigVariableAWSAMIID) - } - - amiInfo, err := c.tkgConfigProvidersClient.GetAWSAMIInfo(bomConfiguration, awsRegion) - if err != nil || amiInfo == nil { - // throw error - return errors.Errorf("unable to get ami info, error: %v", err.Error()) - } - - log.V(3).Infof("using AMI '%v' for tkr version: '%v', aws-region '%v'", amiInfo.ID, bomConfiguration.Release.Version, awsRegion) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAWSAMIID, amiInfo.ID) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSName, amiInfo.OSInfo.Name) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSVersion, amiInfo.OSInfo.Version) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSArch, amiInfo.OSInfo.Arch) - return nil -} - -func checkIfRequiredPermissionsPresent(awsClient aws.Client) { - stacks, err := awsClient.ListCloudFormationStacks() - if err != nil { - log.Warningf("unable to verify if the AWS CloudFormation stack %s is available in the AWS account.", aws.DefaultCloudFormationStackName) - return - } - - for _, stack := range stacks { - if stack == aws.DefaultCloudFormationStackName { - return - } - } - // TODO: should have check on whether IAM permissions are present - log.Warningf("cannot find AWS CloudFormation stack %s, which is used in the management of IAM groups and policies required by TKG. You might need to create one manually before creating a cluster", aws.DefaultCloudFormationStackName) -} - -// ConfigureAndValidateAWSConfig configures and validates aws configuration -func (c *TkgClient) ConfigureAndValidateAWSConfig(tkrVersion string, nodeSizes NodeSizeOptions, skipValidation, isProdConfig bool, workerMachineCount int64, clusterClient clusterclient.Client, isManagementCluster bool) error { - c.SetProviderType(AWSProviderName) - awsClient, err := c.EncodeAWSCredentialsAndGetClient(clusterClient) - if err != nil { - // We must have credentials present for the instantiation of the management cluster - if isManagementCluster { - return err - } - log.Warningf("unable to create AWS client. Skipping validations that require an AWS client") - return c.ConfigureAndValidateAwsConfig(tkrVersion, workerMachineCount, false) - } - - if !skipValidation { - checkIfRequiredPermissionsPresent(awsClient) - } - - if err := c.OverrideAWSNodeSizeWithOptions(nodeSizes, awsClient, skipValidation); err != nil { - log.Warningf("unable to override node size") - } - - useExistingVPC, err := c.SetAndValidateDefaultAWSVPCConfiguration(isProdConfig, awsClient, skipValidation) - if err != nil { - log.Warningf("unable to validate VPC configuration, %s", err.Error()) - } - - return c.ConfigureAndValidateAwsConfig(tkrVersion, workerMachineCount, useExistingVPC) -} - -// TrimVsphereSSHKey trim the comment part of the vsphere ssh key -func (c *TkgClient) TrimVsphereSSHKey() { - sshKeyPartsLen := 2 - sshKey, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereSSHAuthorizedKey) - if err == nil { - sshKeyParts := strings.Fields(sshKey) - if len(sshKeyParts) >= sshKeyPartsLen { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereSSHAuthorizedKey, strings.Join(sshKeyParts[0:sshKeyPartsLen], " ")) - } - } -} - -// ConfigureAndValidateVSphereTemplate validate the k8s version provided matches with VM template's k8s version -func (c *TkgClient) ConfigureAndValidateVSphereTemplate(vcClient vc.Client, tkrVersion, dc string) error { - var err error - if tkrVersion == "" { - return errors.New("TKr version is empty") - } - - templateName, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereTemplate) - - tkrBom, err := c.tkgBomClient.GetBOMConfigurationFromTkrVersion(tkrVersion) - if err != nil { - return err - } - - vsphereVM, err := vcClient.GetAndValidateVirtualMachineTemplate(tkrBom.GetOVAVersions(), tkrVersion, templateName, dc, c.TKGConfigReaderWriter()) - if err != nil || vsphereVM == nil { - return errors.Wrap(err, "unable to get or validate VM Template for given Tanzu Kubernetes release") - } - - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereTemplate, vsphereVM.Name) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSName, vsphereVM.DistroName) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSVersion, vsphereVM.DistroVersion) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableOSArch, vsphereVM.DistroArch) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereTemplateMoid, vsphereVM.Moid) - return nil -} - -// GetVSphereEndpoint gets vsphere client based on credentials set in config variables -func (c *TkgClient) GetVSphereEndpoint(clusterClient clusterclient.Client) (vc.Client, error) { - if clusterClient != nil { - regionContext, err := c.GetCurrentRegionContext() - if err != nil { - return nil, errors.Wrap(err, "failed to get current region context") - } - username, password, err := clusterClient.GetVCCredentialsFromCluster(regionContext.ClusterName, constants.TkgNamespace) - if err != nil { - return nil, err - } - - server, err := clusterClient.GetVCServer() - if err != nil { - return nil, err - } - - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereServer, server) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereUsername, username) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVspherePassword, password) - - vsphereInsecureString, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereInsecure) - vsphereInsecure := (vsphereInsecureString == trueString) - vsphereThumbprint, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereTLSThumbprint) - - return vc.GetAuthenticatedVCClient(server, username, password, vsphereThumbprint, vsphereInsecure, c.vcClientFactory) - } - - vcHost, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereServer) - if err != nil { - return nil, errors.Errorf("failed to get %s", constants.ConfigVariableVsphereServer) - } - vcUsername, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereUsername) - if err != nil { - return nil, errors.Errorf("failed to get %s", constants.ConfigVariableVsphereUsername) - } - vcPassword, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVspherePassword) - if err != nil { - return nil, errors.Errorf("failed to get %s", constants.ConfigVariableVspherePassword) - } - vsphereInsecure := false - vsphereInsecureString, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereInsecure) - if err == nil { - vsphereInsecure = (vsphereInsecureString == trueString) - } - - // If the VSPHERE_TLS_THUMBPRINT is not set, the default ssl certificate validation will be used. - thumbprint, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereTLSThumbprint) - - host := strings.TrimSpace(vcHost) - if !strings.HasPrefix(host, "http") { - host = "https://" + host - } - vcURL, err := url.Parse(host) - if err != nil { - return nil, errors.Wrap(err, "failed to parse vc host") - } - vcURL.Path = "/sdk" - vcClient, err := c.vcClientFactory.NewClient(vcURL, thumbprint, vsphereInsecure) - if err != nil { - return nil, errors.Wrap(err, "failed to create vc client") - } - _, err = vcClient.Login(context.TODO(), vcUsername, vcPassword) - if err != nil { - return nil, errors.Wrap(err, "failed to login to vSphere") - } - return vcClient, nil -} - -// ConfigureAndValidateManagementClusterConfiguration configure and validate management cluster configuration -func (c *TkgClient) ConfigureAndValidateManagementClusterConfiguration(options *InitRegionOptions, skipValidation bool) *ValidationError { // nolint:gocyclo,funlen - var err error - if options.ClusterName != "" { - if err := CheckClusterNameFormat(options.ClusterName, options.InfrastructureProvider); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - } - - regions, err := c.regionManager.ListRegionContexts() - if err != nil { - return NewValidationError(ValidationErrorCode, "unable to verify cluster name uniqueness") - } - - // Skip the same cluster name validation if dry-run - if !options.GenerateOnly { - for _, region := range regions { - if region.ClusterName == options.ClusterName { - errMsg := fmt.Sprintf("cluster name %s matches another management cluster", options.ClusterName) - return NewValidationError(ValidationErrorCode, errMsg) - } - } - } - - if options.Plan == "" { - return NewValidationError(ValidationErrorCode, "required config variable 'CLUSTER_PLAN' is not set") - } - - _, tkrVersion, err := c.ConfigureAndValidateTkrVersion("") - if err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - // BUILD_EDITION is the Tanzu Edition, the plugin should be built for. Its value is supposed be constructed from - // cmd/cli/plugin/managementcluster/create.go. So empty value at this point is not expected. - if options.Edition == "" { - return NewValidationError(ValidationErrorCode, "required config variable 'edition' is not set") - } - c.SetBuildEdition(options.Edition) - - c.SetTKGClusterRole(ManagementCluster) - c.SetTKGVersion() - - idpType, err := c.TKGConfigReaderWriter().Get("IDENTITY_MANAGEMENT_TYPE") - if err != nil || idpType == "" || idpType == "none" { - log.Warningf("Identity Provider not configured. Some authentication features won't work.") - } - - options.InfrastructureProvider, err = c.tkgConfigUpdaterClient.CheckInfrastructureVersion(options.InfrastructureProvider) - if err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "unable to check infrastructure provider version").Error()) - } - - err = c.ConfigureAndValidateCNIType(options.CniType) - if err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "unable to validate CNI type").Error()) - } - - name, _, err := ParseProviderName(options.InfrastructureProvider) - if err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.configureAndValidateIPFamilyConfiguration(TkgLabelClusterRoleManagement); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.configureAndValidateCoreDNSIP(); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.validateServiceCIDRNetmask(); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.ConfigureAndValidateHTTPProxyConfiguration(name); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.ConfigureAndValidateNameserverConfiguration(TkgLabelClusterRoleManagement); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.ConfigureAndValidateAviConfiguration(options.ClusterName); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.ValidateExtraArgs(); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - if err = c.ValidateKubeVipLBConfiguration(TkgLabelClusterRoleManagement); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - isProdPlan := IsProdPlan(options.Plan) - _, workerMachineCount := c.getMachineCountForMC(options.Plan) - - switch name { - case AWSProviderName: - err = c.ConfigureAndValidateAWSConfig(tkrVersion, options.NodeSizeOptions, skipValidation, isProdPlan, int64(workerMachineCount), nil, true) - case VSphereProviderName: - err := c.ConfigureAndValidateVsphereConfig(tkrVersion, options.NodeSizeOptions, options.VsphereControlPlaneEndpoint, skipValidation, nil) - if err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - err = c.ValidateVsphereControlPlaneEndpointIP(options.VsphereControlPlaneEndpoint) - if err != nil { - log.Warningf("WARNING: The control plane endpoint '%s' might already used by other cluster. This might affect the deployment of the cluster", options.VsphereControlPlaneEndpoint) - } - case AzureProviderName: - err = c.ConfigureAndValidateAzureConfig(tkrVersion, options.NodeSizeOptions, skipValidation, nil) - case DockerProviderName: - err = c.ConfigureAndValidateDockerConfig(tkrVersion, options.NodeSizeOptions, skipValidation) - case OracleProviderName: - err = c.ConfigureAndValidateOracleConfig(tkrVersion, options.NodeSizeOptions, skipValidation) - } - - if err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - workerCounts, err := c.DistributeMachineDeploymentWorkers(int64(workerMachineCount), isProdPlan, true, name) - if err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "failed to distribute machine deployments").Error()) - } - c.SetMachineDeploymentWorkerCounts(workerCounts, int64(workerMachineCount), isProdPlan) - - return nil -} - -// ValidateVsphereControlPlaneEndpointIP validates if the control plane endpoint has been used by another cluster in the same network -func (c *TkgClient) ValidateVsphereControlPlaneEndpointIP(endpointIP string) *ValidationError { - log.V(6).Infof("Checking if VSPHERE_CONTROL_PLANE_ENDPOINT %s is already in use", endpointIP) - currentNetwork, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereNetwork) - if err != nil { - return NewValidationError(ValidationErrorCode, "unable to read network name from the configs") - } - - currentServer, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereServer) - if err != nil { - return NewValidationError(ValidationErrorCode, "unable to read vsphere server from the configs") - } - - regions, _ := c.GetRegionContexts("") - for _, regionContext := range regions { - regionalClusterClient, err := c.getRegionClient(regionContext) - if err != nil { - log.V(6).Infof("Unable to create regionalClient") - continue - } - - vSphereMachineTemplate, err := getVsphereMachineTemplate(regionalClusterClient, regionContext.ClusterName) - if err != nil { - log.V(6).Infof("Unable to find Network name for context %s. Skipping validation for this context", regionContext.ContextName) - continue - } - - network := vSphereMachineTemplate.Spec.Template.Spec.Network.Devices[0].NetworkName - server := vSphereMachineTemplate.Spec.Template.Spec.Server - - log.V(4).Infof("Network name: %s", network) - - if currentNetwork == network && currentServer == server { - log.V(6).Infof("Network names, and server matched, validating...") - managementClusters, err := regionalClusterClient.ListClusters(TKGsystemNamespace) - if err != nil { - log.V(6).Infof("Unable to list management clusters") - } - workloadClusters, err := regionalClusterClient.ListClusters("") - if err != nil { - log.V(6).Infof("Unable to list workload clusters") - continue - } - - clusters := append(managementClusters, workloadClusters...) //nolint:gocritic - - for i := range clusters { - if clusters[i].Spec.ControlPlaneEndpoint.Host == endpointIP { - return NewValidationError(ValidationErrorCode, "Control plane endpoint already exists") - } - } - } - } - return nil -} - -func (c *TkgClient) getRegionClient(regionContext region.RegionContext) (clusterclient.Client, error) { - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - OperationTimeout: c.timeout, - } - - log.V(4).Infof("SourceFilePath: %s, ContextName: %s", regionContext.SourceFilePath, regionContext.ContextName) - currentKubeConfig := clusterctlclient.Kubeconfig{Path: regionContext.SourceFilePath, Context: regionContext.ContextName} - client, err := clusterclient.NewClient(currentKubeConfig.Path, currentKubeConfig.Context, clusterclientOptions) - if err != nil { - return nil, NewValidationError(ValidationErrorCode, "unable to get cluster client while creating cluster") - } - - return client, nil -} - -func getVsphereMachineTemplate(client clusterclient.Client, clusterName string) (*capvv1beta1.VSphereMachineTemplate, error) { - vsphereMachineTemplate := &capvv1beta1.VSphereMachineTemplate{} - nameSpace, err := client.GetCurrentNamespace() - if err != nil { - return nil, err - } - log.V(4).Infof("Namespace: %s, Cluster Name: %s", nameSpace, clusterName) - kcp, err := client.GetKCPObjectForCluster(clusterName, "tkg-system") - if err != nil { - log.V(4).Infof("Error getting KCP Object") - return nil, err - } - if err := client.GetResource(vsphereMachineTemplate, kcp.Spec.MachineTemplate.InfrastructureRef.Name, "tkg-system", nil, nil); err != nil { - return nil, err - } - return vsphereMachineTemplate, nil -} - -// ConfigureAndValidateVsphereConfig configures and validates vsphere configuration -func (c *TkgClient) ConfigureAndValidateVsphereConfig(tkrVersion string, nodeSizes NodeSizeOptions, vip string, skipValidation bool, clusterClient clusterclient.Client) *ValidationError { - if err := c.OverrideVsphereNodeSizeWithOptions(nodeSizes); err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "unable to set vSphere node size").Error()) - } - // set node size values that are still missing after overriding with user options - c.SetVsphereNodeSize() - c.SetProviderType(VSphereProviderName) - - if err := c.ValidateVsphereNodeSize(); err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "vSphere node size validation failed").Error()) - } - - // trim the ssh key in the last part of the validation step so that a trimmed key is used for payload - c.TrimVsphereSSHKey() - - // configure and validate vip for vsphere cluster - if err := c.configureAndValidateVIPForVsphereCluster(vip); err != nil { - return NewValidationError(ValidationErrorCode, err.Error()) - } - - // if skipValidation is true skip the subsequent validation of talking to VC - if skipValidation { - return nil - } - - vcClient, err := c.GetVSphereEndpoint(clusterClient) - if err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "failed to get VC client").Error()) - } - - dc, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereDatacenter) - if err != nil { - return NewValidationError(ValidationErrorCode, errors.Errorf("failed to get %s", constants.ConfigVariableVsphereDatacenter).Error()) - } - - if err := c.ConfigureAndValidateVSphereTemplate(vcClient, tkrVersion, dc); err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "vSphere template kubernetes version validation failed").Error()) - } - - if err := c.ValidateVsphereResources(vcClient, dc); err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "vSphere resources validation failed").Error()) - } - - vsphereVersion, _, err := vcClient.GetVSphereVersion() - if err != nil { - return NewValidationError(ValidationErrorCode, errors.Errorf("failed to get vSphere version from VC client").Error()) - } - - c.SetVsphereVersion(vsphereVersion) - - return nil -} - -// configure and validate vip for vsphere cluster -func (c *TkgClient) configureAndValidateVIPForVsphereCluster(vip string) error { - haProvider, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereHaProvider) - if vip != "" { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereControlPlaneEndpoint, vip) - } else { - vip, _ = c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereControlPlaneEndpoint) - } - if vip == "" && haProvider != trueString { - // for backward compatibility check _VSPHERE_CONTROL_PLANE_ENDPOINT variable as well - vip, _ = c.TKGConfigReaderWriter().Get("_VSPHERE_CONTROL_PLANE_ENDPOINT") - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereControlPlaneEndpoint, vip) - } - - if vip == "" && haProvider != trueString { - return NewValidationError(ValidationErrorCode, errors.Errorf("'%s' config variable is required for infrastructure provider vsphere", constants.ConfigVariableVsphereControlPlaneEndpoint).Error()) - } - - if vip != "" { - vsphereServer, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereServer) - if vsphereServer == vip { - return NewValidationError(ValidationErrorCode, "The vSphere Control Plane Endpoint should not match the vSphere Server address") - } - - vsphereIP := net.ParseIP(vsphereServer) - if vIP := net.ParseIP(vip); vsphereIP != nil && vIP != nil { - if vIP.Equal(vsphereIP) { - return NewValidationError(ValidationErrorCode, "vSphere Server IP should be different from the vSphere Control Plane Endpoint") - } - } - } - - return nil -} - -// ValidateVsphereVipWorkloadCluster validates that the control plane endpoint is unique -func (c *TkgClient) ValidateVsphereVipWorkloadCluster(clusterClient clusterclient.Client, vip string, skipValidation bool) error { - if skipValidation { - return nil - } - clusterList, err := clusterClient.ListClusters("") - if err != nil { - return errors.Wrapf(err, "failed to get clusters") - } - for i := range clusterList { - if clusterList[i].Spec.ControlPlaneEndpoint.Host == vip { - return errors.Errorf("control plane endpoint '%s' already in use by cluster '%s' and cannot be reused", vip, clusterList[i].ObjectMeta.Name) - } - } - return nil -} - -// ValidateVsphereResources validates vsphere resource path specified in tkgconfig -func (c *TkgClient) ValidateVsphereResources(vcClient vc.Client, dcPath string) error { - var path, resourceMoid string - var err error - - for _, vsphereResourceConfigKey := range VsphereResourceConfigKeys { - path, err = c.TKGConfigReaderWriter().Get(vsphereResourceConfigKey) - if err != nil { - continue - } - - // finder return an error when multiple vsphere resources with the same name are present - switch vsphereResourceConfigKey { - case constants.ConfigVariableVsphereDatacenter: - resourceMoid, err = vcClient.FindDataCenter(context.Background(), dcPath) - if err != nil { - return errors.Wrapf(err, "invalid %s", vsphereResourceConfigKey) - } - case constants.ConfigVariableVsphereNetwork: - resourceMoid, err = vcClient.FindNetwork(context.Background(), path, dcPath) - if err != nil { - return errors.Wrapf(err, "invalid %s", vsphereResourceConfigKey) - } - case constants.ConfigVariableVsphereResourcePool: - resourceMoid, err = vcClient.FindResourcePool(context.Background(), path, dcPath) - if err != nil { - return errors.Wrapf(err, "invalid %s", vsphereResourceConfigKey) - } - case constants.ConfigVariableVsphereDatastore: - if path != "" { - resourceMoid, err = vcClient.FindDatastore(context.Background(), path, dcPath) - if err != nil { - return errors.Wrapf(err, "invalid %s", vsphereResourceConfigKey) - } - } - case constants.ConfigVariableVsphereFolder: - resourceMoid, err = vcClient.FindFolder(context.Background(), path, dcPath) - if err != nil { - return errors.Wrapf(err, "invalid %s", vsphereResourceConfigKey) - } - - default: - return errors.Errorf("unknown vsphere resource type %s", vsphereResourceConfigKey) - } - - err = c.setFullPath(vcClient, vsphereResourceConfigKey, path, resourceMoid) - if err != nil { - return err - } - } - - return c.verifyDatastoreOrStoragePolicySet() -} - -// set full inventory path if the config variable value is not already an absolute path string or if it is not MOID -func (c *TkgClient) setFullPath(vcClient vc.Client, vsphereResourceConfigKey, path, resourceMoid string) error { - if path != "" && !strings.HasPrefix(path, "/") && !strings.Contains(path, resourceMoid) { - resourcePath, _, err := vcClient.GetPath(context.Background(), resourceMoid) - if err != nil { - return err - } - - if resourcePath != path { - log.Infof("Setting config variable %q to value %q", vsphereResourceConfigKey, resourcePath) - c.TKGConfigReaderWriter().Set(vsphereResourceConfigKey, resourcePath) - } - } - - return nil -} - -func (c *TkgClient) verifyDatastoreOrStoragePolicySet() error { - dataStore, dataStoreErr := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereDatastore) - storagePolicy, storagePolicyErr := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereStoragePolicyID) - - if (dataStoreErr != nil || dataStore == "") && (storagePolicyErr != nil || storagePolicy == "") { - return errors.Errorf("Neither %s or %s are set. At least one of them needs to be set", constants.ConfigVariableVsphereDatastore, constants.ConfigVariableVsphereStoragePolicyID) - } - - return nil -} - -// ValidateVSphereVersion validates vsphere version -func ValidateVSphereVersion(vcClient vc.Client) *ValidationError { - version, build, err := vcClient.GetVSphereVersion() - if err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "unable to verify vSphere version").Error()) - } - - if strings.HasPrefix(version, "7.") { - hasPacific, err := vcClient.DetectPacific(context.TODO()) - - if err == nil && hasPacific { - return NewValidationError(PacificInVC7ErrorCode, "the vSphere has version higher or equal to 7.0 with Management Kubernetes cluster deployed") - } - - return NewValidationError(PacificNotInVC7ErrorCode, "the vSphere has version higher or equal to 7.0") - } - - versions := strings.Split(version, ".") - for i, v := range versions { - num, err := strconv.Atoi(v) - if err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "invalid vSphere version").Error()) - } - - if num < vsphereVersionMinimumRequirement[i] { - return NewValidationError(ValidationErrorCode, vsphereVersionError) - } else if num > vsphereVersionMinimumRequirement[i] { - return nil - } - } - - buildNum, err := strconv.Atoi(build) - if err != nil { - return NewValidationError(ValidationErrorCode, errors.Wrap(err, "invalid vSphere build number").Error()) - } - - if buildNum < vsphereBuildMinimumRequirement { - return NewValidationError(ValidationErrorCode, vsphereVersionError) - } - - return nil -} - -// SetAndValidateDefaultAWSVPCConfiguration sets default value for AWS configuration variables -// Depending on whether AWS_VPC_ID is set/unset in the tkgconfig, -// values pertaining to configuring for existing/new VPC needs to be initialized to "" -// It returns whether creating cluster within existing vpc. -func (c *TkgClient) SetAndValidateDefaultAWSVPCConfiguration(isProdConfig bool, awsClient aws.Client, skipValidation bool) (bool, error) { // nolint:gocyclo - useExistingVPC := false - var err error - vpcID := "" - if vpcID, err = c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSVPCID); err != nil || vpcID == "" { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAWSVPCID, "") - for _, varName := range AWSSubnetIDConfigVariables { - if _, err := c.TKGConfigReaderWriter().Get(varName); err != nil { - c.TKGConfigReaderWriter().Set(varName, "") - } - } - - if isProdConfig { - for _, varName := range AWSProdSubnetIDConfigVariables { - if _, err := c.TKGConfigReaderWriter().Get(varName); err != nil { - c.TKGConfigReaderWriter().Set(varName, "") - } - } - } - return useExistingVPC, nil - } - - useExistingVPC = true - - for _, varName := range AWSNewVPCConfigVariables { - c.TKGConfigReaderWriter().Set(varName, "") - } - - if isProdConfig { - for _, varName := range AWSProdNewVPCConfigVariables { - c.TKGConfigReaderWriter().Set(varName, "") - } - } - - subnetIDs := make(map[string]bool) - if !skipValidation { - subnets, err := awsClient.ListSubnets(vpcID) - if err != nil { - return useExistingVPC, err - } - - for _, subnet := range subnets { - subnetIDs[subnet.ID] = true - } - } - - missingConfigVar := []string{} - - nonExistingSubnetIDs := []string{} - - for i, varName := range AWSPrivateSubnetIDConfigVariables { - if !isProdConfig && i == 1 { - break - } - if val, err := c.TKGConfigReaderWriter().Get(varName); err != nil || val == "" { - missingConfigVar = append(missingConfigVar, varName) - } else if !skipValidation { - if _, ok := subnetIDs[val]; !ok { - nonExistingSubnetIDs = append(nonExistingSubnetIDs, val) - } - } - } - - if publicSubnetID, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPublicSubnetID); err != nil || publicSubnetID != "" { - // validate public subnets when there the vpc is public facing - for i, varName := range AWSPublicSubnetIDConfigVariables { - if !isProdConfig && i == 1 { - break - } - if val, err := c.TKGConfigReaderWriter().Get(varName); err != nil || val == "" { - missingConfigVar = append(missingConfigVar, varName) - } else if !skipValidation { - if _, ok := subnetIDs[val]; !ok { - nonExistingSubnetIDs = append(nonExistingSubnetIDs, val) - } - } - } - } else { - log.Warning("public subnet ID(s) not found") - - if publicSubentID1, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPublicSubnetID1); err == nil && publicSubentID1 != "" { - return useExistingVPC, errors.Errorf("%s cannot be used without %s", constants.ConfigVariableAWSPublicSubnetID1, constants.ConfigVariableAWSPublicSubnetID) - } - - if publicSubentID2, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPublicSubnetID2); err == nil && publicSubentID2 != "" { - return useExistingVPC, errors.Errorf("%s cannot be used without %s", constants.ConfigVariableAWSPublicSubnetID2, constants.ConfigVariableAWSPublicSubnetID) - } - } - - if len(missingConfigVar) != 0 { - return useExistingVPC, errors.Errorf("configuration variable(s) %s not set", strings.Join(missingConfigVar, ",")) - } - - if len(nonExistingSubnetIDs) != 0 { - return useExistingVPC, errors.Errorf("cannot find subnet(s) %s in VPC %s", strings.Join(nonExistingSubnetIDs, ","), vpcID) - } - - return useExistingVPC, nil -} - -func (c *TkgClient) checkVsphereNodeSize(key string, minReq int) error { - var val string - var err error - - if val, err = c.TKGConfigReaderWriter().Get(key); err != nil || val == "" { - // if key cannot be found, leave to the later configration generating step to throw out error - return nil - } - - intVal, err := strconv.Atoi(val) - if err != nil { - return errors.Wrapf(err, "invalid %s", key) - } - - if intVal < minReq { - return errors.Errorf("the minimum requirement of %s is %d", key, minReq) - } - - return nil -} - -// ValidateVsphereNodeSize validates vsphere node size -func (c *TkgClient) ValidateVsphereNodeSize() error { - minReqNodeSize := tkgconfigproviders.NodeTypes["small"] - - minCPU, _ := strconv.Atoi(minReqNodeSize.Cpus) - minMem, _ := strconv.Atoi(minReqNodeSize.Memory) - minDisk, _ := strconv.Atoi(minReqNodeSize.Disk) - - for _, varName := range VsphereNodeCPUVarName { - if err := c.checkVsphereNodeSize(varName, minCPU); err != nil { - return err - } - } - - for _, varName := range VsphereNodeMemVarName { - if err := c.checkVsphereNodeSize(varName, minMem); err != nil { - return err - } - } - - for _, varName := range VsphereNodeDiskVarName { - if err := c.checkVsphereNodeSize(varName, minDisk); err != nil { - return err - } - } - - return nil -} - -// SetVsphereNodeSize sets vsphere node size -func (c *TkgClient) SetVsphereNodeSize() { - // get the base node type - cpu, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereNumCpus) - memory, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereMemMib) - disk, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereDiskGib) - - for _, varName := range VsphereNodeCPUVarName { - if val, err := c.TKGConfigReaderWriter().Get(varName); err != nil || val == "" { - if cpu != "" { - c.TKGConfigReaderWriter().Set(varName, cpu) - } - } - } - - for _, varName := range VsphereNodeMemVarName { - if val, err := c.TKGConfigReaderWriter().Get(varName); err != nil || val == "" { - if memory != "" { - c.TKGConfigReaderWriter().Set(varName, memory) - } - } - } - - for _, varName := range VsphereNodeDiskVarName { - if val, err := c.TKGConfigReaderWriter().Get(varName); err != nil || val == "" { - if disk != "" { - c.TKGConfigReaderWriter().Set(varName, disk) - } - } - } -} - -// OverrideAzureNodeSizeWithOptions overrides azure node size with options -func (c *TkgClient) OverrideAzureNodeSizeWithOptions(client azure.Client, options NodeSizeOptions, skipValidation bool) error { - location, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureLocation) - if err != nil { - return nil - } - - azureNodeTypes := map[string]bool{} - azureNodeSizeOptions := make([]string, 0) - - if !skipValidation { - instanceTypes, err := client.GetAzureInstanceTypesForRegion(context.Background(), location) - if err != nil { - return errors.Wrapf(err, "unable to list the available node size options for Azure") - } - - for _, instanceType := range instanceTypes { - azureNodeTypes[instanceType.Name] = true - azureNodeSizeOptions = append(azureNodeSizeOptions, instanceType.Name) - } - } - - if options.Size != "" { - if _, ok := azureNodeTypes[options.Size]; !skipValidation && !ok { - return errors.Errorf("node size %s cannot be used with TKG, please select among [%s]", options.Size, strings.Join(azureNodeSizeOptions, ",")) - } - - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureCPMachineType, options.Size) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureNodeMachineType, options.Size) - } - - if options.ControlPlaneSize != "" { - if _, ok := azureNodeTypes[options.ControlPlaneSize]; !skipValidation && !ok { - return errors.Errorf("node size %s cannot be used with TKG, please select among [%s]", options.Size, strings.Join(azureNodeSizeOptions, ",")) - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureCPMachineType, options.ControlPlaneSize) - } - - if options.WorkerSize != "" { - if _, ok := azureNodeTypes[options.WorkerSize]; !skipValidation && !ok { - return errors.Errorf("node size %s cannot be used with TKG, please select among [%s]", options.Size, strings.Join(azureNodeSizeOptions, ",")) - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureNodeMachineType, options.WorkerSize) - } - - return nil -} - -// OverrideAWSNodeSizeWithOptions overrides aws node size with options -func (c *TkgClient) OverrideAWSNodeSizeWithOptions(options NodeSizeOptions, awsClient aws.Client, skipValidation bool) error { - if options.Size != "" { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableCPMachineType, options.Size) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableNodeMachineType, options.Size) - } - if options.ControlPlaneSize != "" { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableCPMachineType, options.ControlPlaneSize) - } - if options.WorkerSize != "" { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableNodeMachineType, options.WorkerSize) - } - - if !skipValidation { - err := c.validateAwsInstanceTypes(awsClient) - if err != nil { - return err - } - } - - return nil -} - -func (c *TkgClient) validateAwsInstanceTypes(awsClient aws.Client) error { - awsRegion, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSRegion) - if err != nil { - return nil - } - nodeTypes, err := awsClient.ListInstanceTypes("") - if err != nil { - return err - } - nodeMap := make(map[string]bool) - for _, t := range nodeTypes { - nodeMap[t] = true - } - - controlplaneMachineType, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableCPMachineType) - if err != nil { - return err - } - if _, ok := nodeMap[controlplaneMachineType]; !ok { - return errors.Errorf("instance type %s is not supported in region %s", controlplaneMachineType, awsRegion) - } - - var nodeMachineTypes []string - nodeMachineType, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableNodeMachineType) - if err != nil { - return err - } - nodeMachineTypes = append(nodeMachineTypes, nodeMachineType) - - nodeMachineType1, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableNodeMachineType1) - if err != nil { - log.Infof("NODE_MACHINE_TYPE_1 not set, using the default NODE_MACHINE_TYPE instead") - } else if nodeMachineType1 != "" { - nodeMachineTypes = append(nodeMachineTypes, nodeMachineType1) - } - nodeMachineType2, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableNodeMachineType2) - if err != nil { - log.Infof("NODE_MACHINE_TYPE_2 not set, using the default NODE_MACHINE_TYPE instead") - } else if nodeMachineType2 != "" { - nodeMachineTypes = append(nodeMachineTypes, nodeMachineType2) - } - - for _, machineType := range nodeMachineTypes { - if _, ok := nodeMap[machineType]; !ok { - return errors.Errorf("instance type %s is not supported in region %s", nodeMachineType, awsRegion) - } - } - - return nil -} - -// OverrideVsphereNodeSizeWithOptions overrides vsphere node size with options -func (c *TkgClient) OverrideVsphereNodeSizeWithOptions(options NodeSizeOptions) error { - if options.Size != "" { - nodeSizes, ok := tkgconfigproviders.NodeTypes[options.Size] - if !ok { - return errors.Errorf("node size %s is not defined, please select among %s", options.Size, tkgconfigproviders.GetVsphereNodeSizeOptions()) - } - - for _, varName := range VsphereNodeCPUVarName { - c.TKGConfigReaderWriter().Set(varName, nodeSizes.Cpus) - } - - for _, varName := range VsphereNodeMemVarName { - c.TKGConfigReaderWriter().Set(varName, nodeSizes.Memory) - } - - for _, varName := range VsphereNodeDiskVarName { - c.TKGConfigReaderWriter().Set(varName, nodeSizes.Disk) - } - } - - if options.ControlPlaneSize != "" { - nodeSizes, ok := tkgconfigproviders.NodeTypes[options.ControlPlaneSize] - if !ok { - return errors.Errorf("node size %s is not defined, please select among %s", options.ControlPlaneSize, tkgconfigproviders.GetVsphereNodeSizeOptions()) - } - - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereCPNumCpus, nodeSizes.Cpus) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereCPMemMib, nodeSizes.Memory) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereCPDiskGib, nodeSizes.Disk) - } - - if options.WorkerSize != "" { - nodeSizes, ok := tkgconfigproviders.NodeTypes[options.WorkerSize] - if !ok { - return errors.Errorf("node size %s is not defined, please select among %s", options.WorkerSize, tkgconfigproviders.GetVsphereNodeSizeOptions()) - } - - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereWorkerNumCpus, nodeSizes.Cpus) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereWorkerMemMib, nodeSizes.Memory) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereWorkerDiskGib, nodeSizes.Disk) - } - return nil -} - -// SetTKGClusterRole sets the value of label tkg.tanzu.vmware.com/cluster-role -// for CAPI Cluster object. -func (c *TkgClient) SetTKGClusterRole(clusterType TKGClusterType) { - forceRole, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableForceRole) - if err == nil { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterRole, forceRole) - return - } - - switch clusterType { - case ManagementCluster: - c.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterRole, TkgLabelClusterRoleManagement) - case WorkloadCluster: - c.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterRole, TkgLabelClusterRoleWorkload) - default: - c.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterRole, "") - } -} - -// EncodeAzureCredentialsAndGetClient encodes azure credentials and returns azure client -func (c *TkgClient) EncodeAzureCredentialsAndGetClient(clusterClient clusterclient.Client) (azure.Client, error) { - var creds azure.Credentials - var err error - // clusterClient exists during workload cluster creation or management cluster upgrade - if clusterClient != nil { - azureClusterIdentityName, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureIdentityName) - if err != nil { - // If don't specify the AzureClusterIdentity, then use the same one with management cluster. - // Get credentials from capz-manager-bootstrap-credentials - creds, err = clusterClient.GetAzureCredentialsFromSecret() - if err != nil { - return nil, err - } - } else { - subscriptionID, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureSubscriptionID) - if err != nil { - return nil, errors.Errorf("failed to get Azure Subscription ID") - } - // If the AzureClusterIdentity is specified, then use the specified identity - azureClusterIdentityNamespace, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureIdentityNamespace) - if err != nil { - // AzureClusterIdentity will use the same namespace with AzureCluster by default - azureClusterIdentityNamespace, err = c.TKGConfigReaderWriter().Get(constants.ConfigVariableNamespace) - if err != nil { - return nil, err - } - } - // Retrive credentials from AzureClusterIdentity - creds, err = clusterClient.GetAzureCredentialsFromIdentity(azureClusterIdentityName, azureClusterIdentityNamespace) - if err != nil { - return nil, err - } - creds.SubscriptionID = subscriptionID - } - } else { - subscriptionID, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureSubscriptionID) - if err != nil { - return nil, errors.Errorf("failed to get Azure Subscription ID") - } - - tenantID, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureTenantID) - if err != nil { - return nil, errors.Errorf("failed to get Azure Tenant ID") - } - - clientID, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureClientID) - if err != nil { - return nil, errors.Errorf("failed to get Azure Client ID") - } - - clientSecret, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureClientSecret) - if err != nil { - return nil, errors.Errorf("failed to get Azure Client Secret") - } - - creds = azure.Credentials{ - SubscriptionID: subscriptionID, - ClientID: clientID, - ClientSecret: clientSecret, - TenantID: tenantID, - } - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureSubscriptionIDB64, base64.StdEncoding.EncodeToString([]byte(creds.SubscriptionID))) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureTenantIDB64, base64.StdEncoding.EncodeToString([]byte(creds.TenantID))) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureClientSecretB64, base64.StdEncoding.EncodeToString([]byte(creds.ClientSecret))) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureClientIDB64, base64.StdEncoding.EncodeToString([]byte(creds.ClientID))) - - azureCloud, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureEnvironment) - if err != nil { - log.V(6).Info("Setting config 'AZURE_ENVIRONMENT' to 'AzurePublicCloud'") - azureCloud = azure.PublicCloud - } - creds.AzureCloud = azureCloud - - azureClient, err := azure.New(&creds) - if err != nil { - return nil, err - } - - return azureClient, nil -} - -// ConfigureAndValidateCNIType configures and validates cni -func (c *TkgClient) ConfigureAndValidateCNIType(cniType string) error { - if cniType == "" { - // if CNI not provided by CLI, check config - cniType, _ = c.TKGConfigReaderWriter().Get(constants.ConfigVariableCNI) - if cniType == "" { - // if CNI not provided in config, use default - c.TKGConfigReaderWriter().Set(constants.ConfigVariableCNI, constants.DefaultCNIType) - return nil - } - } - // validate and set the provided CNI type - if _, ok := CNITypes[cniType]; !ok { - return errors.Errorf("provided CNI type '%s' is not in the available options: antrea, calico, none", cniType) - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableCNI, cniType) - return nil -} - -// DistributeMachineDeploymentWorkers distributes machine deployment for worker nodes -func (c *TkgClient) DistributeMachineDeploymentWorkers(workerMachineCount int64, isProdConfig, isManagementCluster bool, infraProviderName string) ([]int, error) { // nolint:gocyclo - workerCounts := make([]int, 3) - if infraProviderName == DockerProviderName { - workerCounts[0] = int(workerMachineCount) - return workerCounts, nil - } - workerCount1Str, err1 := c.TKGConfigReaderWriter().Get(constants.ConfigVariableWorkerMachineCount0) - workerCount2Str, err2 := c.TKGConfigReaderWriter().Get(constants.ConfigVariableWorkerMachineCount1) - workerCount3Str, err3 := c.TKGConfigReaderWriter().Get(constants.ConfigVariableWorkerMachineCount2) - predefinedDistribution := err1 == nil && err2 == nil && err3 == nil && workerCount1Str != "" && workerCount2Str != "" && workerCount3Str != "" - - if isProdConfig && !predefinedDistribution { - workersPerAz := workerMachineCount / 3 - remainder := workerMachineCount % 3 - workerCounts[0] = int(workersPerAz) - workerCounts[1] = int(workersPerAz) - workerCounts[2] = int(workersPerAz) - for remainder > 0 { - for i := range workerCounts { - if remainder == 0 { - break - } - workerCounts[i]++ - remainder-- - } - } - } else if isProdConfig { - workerCount1, e1 := strconv.Atoi(workerCount1Str) - workerCount2, e2 := strconv.Atoi(workerCount2Str) - workerCount3, e3 := strconv.Atoi(workerCount3Str) - if e1 != nil || e2 != nil || e3 != nil { - return nil, errors.Errorf("failed to parse provided WORKER_MACHINE_COUNT_0/2/3 vars as integers: %s, %s, %s", workerCount1Str, workerCount2Str, workerCount3Str) - } - workerCounts[0] = workerCount1 - workerCounts[1] = workerCount2 - workerCounts[2] = workerCount3 - } else if err1 == nil && workerCount1Str != "" { - workerCount1, err := strconv.Atoi(workerCount1Str) - if err != nil { - return nil, errors.Errorf("failed to parse provided WORKER_MACHINE_COUNT_0 var as integer: %s", workerCount1Str) - } - workerCounts[0] = workerCount1 - } else { - workerCounts[0] = int(workerMachineCount) - } - - if !isManagementCluster && isProdConfig && workerCounts[0]+workerCounts[1]+workerCounts[2] < 3 { - return nil, errors.Errorf("prod plan requires at least 3 workers") - } - - return workerCounts, nil -} - -// SetMachineDeploymentWorkerCounts sets machine deployment counts -func (c *TkgClient) SetMachineDeploymentWorkerCounts(workerCounts []int, totalWorkerMachineCount int64, isProdConfig bool) { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableWorkerMachineCount, strconv.Itoa(int(totalWorkerMachineCount))) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableWorkerMachineCount0, strconv.Itoa(workerCounts[0])) - if isProdConfig { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableWorkerMachineCount1, strconv.Itoa(workerCounts[1])) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableWorkerMachineCount2, strconv.Itoa(workerCounts[2])) - } -} - -// EncodeAWSCredentialsAndGetClient encodes aws credentials and returns aws client -func (c *TkgClient) EncodeAWSCredentialsAndGetClient(clusterClient clusterclient.Client) (aws.Client, error) { - creds, err := c.GetAWSCreds() - if err != nil { - return nil, err - } - awsClient, err := aws.New(*creds) - if err != nil { - return nil, err - } - - b64Creds, err := awsClient.EncodeCredentials() - if err != nil { - return awsClient, err - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableAWSB64Credentials, b64Creds) - - return awsClient, nil -} - -// ConfigureAndValidateHTTPProxyConfiguration configures and validates http proxy configuration -func (c *TkgClient) ConfigureAndValidateHTTPProxyConfiguration(infrastructureName string) error { - c.SetDefaultProxySettings() - proxyEnabled, err := c.TKGConfigReaderWriter().Get(constants.TKGHTTPProxyEnabled) - if err != nil || proxyEnabled != trueString { - httpProxy, err2 := c.TKGConfigReaderWriter().Get(constants.TKGHTTPProxy) - if httpProxy == "" || err2 != nil { - return nil - } - // httpProxy and httpsProxy are presents, check if the TKGHTTPProxyEnabled - return errors.Wrapf(err, "cannot get %s", constants.TKGHTTPProxyEnabled) - } - - httpProxy, err := c.TKGConfigReaderWriter().Get(constants.TKGHTTPProxy) - if err != nil || httpProxy == "" { - return errors.Wrapf(err, "cannot get %s", constants.TKGHTTPProxy) - } - - if _, err = tkgconfigproviders.CheckAndGetProxyURL("", "", httpProxy); err != nil { - return errors.Wrapf(err, "error validating %s", constants.TKGHTTPProxy) - } - - httpsProxy, _ := c.TKGConfigReaderWriter().Get(constants.TKGHTTPSProxy) - if err != nil || httpsProxy == "" { - return errors.Wrapf(err, "cannot get %s", constants.TKGHTTPSProxy) - } - if _, err = tkgconfigproviders.CheckAndGetProxyURL("", "", httpsProxy); err != nil { - return errors.Wrapf(err, "error validating %s", constants.TKGHTTPSProxy) - } - - noProxy, err := c.getFullTKGNoProxy(infrastructureName) - if err != nil { - return err - } - - c.TKGConfigReaderWriter().Set(constants.TKGNoProxy, noProxy) - - return nil -} - -// SetDefaultProxySettings is used to configure default proxy settings. -// The TKG proxy variables are required for cloud-api component templates -// rendering. Need to set them to "" if the proxy variables are not available. -func (c *TkgClient) SetDefaultProxySettings() { - if _, err := c.TKGConfigReaderWriter().Get(constants.TKGHTTPProxy); err != nil { - c.TKGConfigReaderWriter().Set(constants.TKGHTTPProxy, "") - } - if _, err := c.TKGConfigReaderWriter().Get(constants.TKGHTTPSProxy); err != nil { - c.TKGConfigReaderWriter().Set(constants.TKGHTTPSProxy, "") - } - if _, err := c.TKGConfigReaderWriter().Get(constants.TKGNoProxy); err != nil { - c.TKGConfigReaderWriter().Set(constants.TKGNoProxy, "") - } -} - -func (c *TkgClient) getFullTKGNoProxy(providerName string) (string, error) { - noProxyMap := make(map[string]bool) - - noProxyMap[constants.ServiceDNSClusterLocalSuffix] = true - noProxyMap[constants.ServiceDNSSuffix] = true - noProxyMap[constants.LocalHost] = true - noProxyMap[constants.LocalHostIP] = true - - if serviceCIDR, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableServiceCIDR); serviceCIDR != "" { - for _, np := range strings.Split(serviceCIDR, ",") { - noProxyMap[np] = true - } - } - if clusterCIDR, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterCIDR); clusterCIDR != "" { - for _, np := range strings.Split(clusterCIDR, ",") { - noProxyMap[np] = true - } - } - if ipfamily, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableIPFamily); ipfamily == constants.IPv6Family { - noProxyMap[constants.LocalHostIPv6] = true - } - - if noProxy, _ := c.TKGConfigReaderWriter().Get(constants.TKGNoProxy); noProxy != "" { - // trim space - replaceSpacePattern := regexp.MustCompile(`\s+|\t+|\n+|\r+`) - noProxy = replaceSpacePattern.ReplaceAllString(noProxy, "") - - if strings.Contains(noProxy, "*") { - return "", fmt.Errorf("invalid string '*' in %s", constants.TKGNoProxy) - } - for _, np := range strings.Split(noProxy, ",") { - noProxyMap[np] = true - } - } - // update provider specific no proxies has not been checked into tkg-cli-providers yet - err := c.updateProviderSpecificNoProxy(providerName, noProxyMap) - - noProxyList := []string{} - for np := range noProxyMap { - noProxyList = append(noProxyList, np) - } - return strings.Join(noProxyList, ","), err -} - -// updateProviderSpecificNoProxy updates provider specific no proxies to given input map -func (c *TkgClient) updateProviderSpecificNoProxy(providerName string, noProxyMap map[string]bool) error { - switch providerName { - case constants.InfrastructureProviderAWS: - if vpcCIDR, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSVPCCIDR); vpcCIDR != "" { - noProxyMap[vpcCIDR] = true - } - noProxyMap[constants.LinkLocalAddress] = true - case constants.InfrastructureProviderAzure: - if vnetCIDR, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureVnetCidr); vnetCIDR != "" { - for _, np := range strings.Split(vnetCIDR, ",") { - noProxyMap[np] = true - } - } - noProxyMap[constants.LinkLocalAddress] = true - noProxyMap[constants.AzurePublicVIP] = true - case constants.InfrastructureProviderDocker: - var dockerBridgeCidr string - var err error - if dockerBridgeCidr, err = getDockerBridgeNetworkCidr(); err != nil { - return err - } - noProxyMap[dockerBridgeCidr] = true - } - return nil -} - -func (c *TkgClient) configureVsphereCredentialsFromCluster(clusterClient clusterclient.Client) error { - regionContext, err := c.GetCurrentRegionContext() - if err != nil { - return errors.Wrap(err, "failed to get current region context") - } - vsphereUsername, vspherePassword, err := clusterClient.GetVCCredentialsFromCluster(regionContext.ClusterName, constants.TkgNamespace) - if err != nil { - return errors.Wrap(err, "unable to get vsphere credentials from secret") - } - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereUsername, vsphereUsername) - c.TKGConfigReaderWriter().Set(constants.ConfigVariableVspherePassword, vspherePassword) - return nil -} - -// CheckClusterNameFormat ensures that the cluster name is valid for the given provider -func CheckClusterNameFormat(clusterName, infrastructureProvider string) error { - var clusterNameRegex string - if infrastructureProvider == AzureProviderName { - // Azure limitation - clusterNameRegex = "^[a-z][a-z0-9-.]{0,42}[a-z0-9]$" - } else { - // k8s resource name DNS limitation - clusterNameRegex = "^[a-z0-9][a-z0-9-.]{0,61}[a-z0-9]$" - } - matched, err := regexp.MatchString(clusterNameRegex, clusterName) - if err != nil { - return errors.Wrap(err, "failed to validate cluster name") - } - if !matched { - return errors.Errorf("cluster name doesn't match regex %s, can contain only lowercase alphanumeric characters, '.' and '-'", clusterNameRegex) - } - - return nil -} - -func (c *TkgClient) configureAndValidateIPFamilyConfiguration(clusterRole string) error { - // ignoring error because IPFamily is an optional configuration - // if not set Get will return an empty string - ipFamily, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableIPFamily) - if ipFamily == "" { - ipFamily = constants.IPv4Family - } - - err := c.checkIPFamilyFeatureFlags(ipFamily, clusterRole) - if err != nil { - return err - } - - serviceCIDRs, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableServiceCIDR) - clusterCIDRs, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterCIDR) - - if serviceCIDRs == "" { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableServiceCIDR, c.defaultServiceCIDR(ipFamily)) - } else if err := c.validateCIDRsForIPFamily(constants.ConfigVariableServiceCIDR, serviceCIDRs, ipFamily); err != nil { - return err - } - if clusterCIDRs == "" { - routablePodEnabledString, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableEnableTKGSRoutablePod) - routablePodEnabled := (routablePodEnabledString == trueString) - //Skip auto-fill podcidr if tkgs routable pod feature is enabled - if routablePodEnabled != true { - c.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterCIDR, c.defaultClusterCIDR(ipFamily)) - } - } else if err := c.validateCIDRsForIPFamily(constants.ConfigVariableClusterCIDR, clusterCIDRs, ipFamily); err != nil { - return err - } - if err := c.validateIPHostnameForIPFamily(constants.TKGHTTPProxy, ipFamily); err != nil { - return err - } - if err := c.validateIPHostnameForIPFamily(constants.TKGHTTPSProxy, ipFamily); err != nil { - return err - } - return nil -} - -func (c *TkgClient) configureAndValidateCoreDNSIP() error { - // Core DNS IP is the 10th index of service CIDR subnet - // ServiceCIDR must not be empty as it should already been set by configureAndValidateIPFamilyConfiguration if it was omitted - serviceCIDR, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableServiceCIDR) - if err != nil { - return err - } - - svcSubnets, err := netutils.ParseCIDRs(strings.Split(serviceCIDR, ",")) - if err != nil { - return err - } - dnsIP, err := netutils.GetIndexedIP(svcSubnets[0], 10) - if err != nil { - return err - } - - c.TKGConfigReaderWriter().Set(constants.ConfigVariableCoreDNSIP, dnsIP.String()) - - return nil -} - -func (c *TkgClient) validateServiceCIDRNetmask() error { - // kube-apiserver requires that the service CIDR be of limited size. - // This validation avoids a case where the cluster never comes up when - // the CIDR is too large. - // https://github.com/kubernetes/kubernetes/blob/3c87c43ceff6122637c8d8070601f7271026360e/cmd/kube-apiserver/app/options/validation.go#L52 - configVariableName := constants.ConfigVariableServiceCIDR - serviceCIDRs, _ := c.TKGConfigReaderWriter().Get(configVariableName) - cidrSlice := strings.Split(serviceCIDRs, ",") - for _, cidrString := range cidrSlice { - _, cidr, err := net.ParseCIDR(cidrString) - if err != nil { - // This should never happen since CIDRs were already validated before - return errors.Errorf("invalid %s \"%s\"", configVariableName, serviceCIDRs) - } - maxCIDRBits := 20 - var ones, bits = cidr.Mask.Size() - if bits-ones > maxCIDRBits { - return errors.Errorf("invalid %s \"%s\", expected netmask to be \"/%d\" or greater", configVariableName, cidrString, bits-maxCIDRBits) - } - } - return nil -} - -func (c *TkgClient) defaultClusterCIDR(ipFamily string) string { - switch ipFamily { - case constants.DualStackPrimaryIPv4Family: - return constants.DefaultDualStackPrimaryIPv4ClusterCIDR - case constants.DualStackPrimaryIPv6Family: - return constants.DefaultDualStackPrimaryIPv6ClusterCIDR - case constants.IPv6Family: - return constants.DefaultIPv6ClusterCIDR - default: - return constants.DefaultIPv4ClusterCIDR - } -} - -func (c *TkgClient) defaultServiceCIDR(ipFamily string) string { - switch ipFamily { - case constants.DualStackPrimaryIPv4Family: - return constants.DefaultDualStackPrimaryIPv4ServiceCIDR - case constants.DualStackPrimaryIPv6Family: - return constants.DefaultDualStackPrimaryIPv6ServiceCIDR - case constants.IPv6Family: - return constants.DefaultIPv6ServiceCIDR - default: - return constants.DefaultIPv4ServiceCIDR - } -} - -func (c *TkgClient) validateIPHostnameForIPFamily(configKey, ipFamily string) error { - urlString, err := c.TKGConfigReaderWriter().Get(configKey) - if err != nil { - return nil - } - - parsedURL, err := url.Parse(urlString) - if err != nil { - return nil - } - - ip := net.ParseIP(parsedURL.Hostname()) - if ip == nil { - return nil - } - - switch ipFamily { - case constants.DualStackPrimaryIPv4Family, constants.DualStackPrimaryIPv6Family: - return nil - case constants.IPv6Family: - if ip.To4() == nil { - return nil - } - case constants.IPv4Family: - if ip.To4() != nil { - return nil - } - } - - return errors.Errorf("invalid %s \"%s\", expected to be an address of type \"%s\" (%s)", - configKey, urlString, ipFamily, constants.ConfigVariableIPFamily) -} - -func (c *TkgClient) validateCIDRsForIPFamily(configVariableName, cidrs, ipFamily string) error { - switch ipFamily { - case constants.IPv4Family: - if !isCIDRIPv4(cidrs) { - return invalidCIDRError(configVariableName, cidrs, ipFamily) - } - case constants.IPv6Family: - if !isCIDRIPv6(cidrs) { - return invalidCIDRError(configVariableName, cidrs, ipFamily) - } - case constants.DualStackPrimaryIPv4Family: - cidrSlice := strings.Split(cidrs, ",") - if len(cidrSlice) != 2 || !isCIDRIPv4(cidrSlice[0]) || !isCIDRIPv6(cidrSlice[1]) { - return fmt.Errorf(`invalid %s %q, expected to have "," for %s %q`, - configVariableName, cidrs, constants.ConfigVariableIPFamily, ipFamily) - } - case constants.DualStackPrimaryIPv6Family: - cidrSlice := strings.Split(cidrs, ",") - if len(cidrSlice) != 2 || !isCIDRIPv6(cidrSlice[0]) || !isCIDRIPv4(cidrSlice[1]) { - return fmt.Errorf(`invalid %s %q, expected to have "," for %s %q`, - configVariableName, cidrs, constants.ConfigVariableIPFamily, ipFamily) - } - } - return nil -} - -func isCIDRIPv4(cidr string) bool { - ip, _, err := net.ParseCIDR(cidr) - if err != nil { - return false - } - return ip.To4() != nil -} - -func isCIDRIPv6(cidr string) bool { - ip, _, err := net.ParseCIDR(cidr) - if err != nil { - return false - } - return ip.To4() == nil -} - -func invalidCIDRError(configKey, cidr, ipFamily string) error { - return errors.Errorf("invalid %s \"%s\", expected to be a CIDR of type \"%s\" (%s)", - configKey, cidr, ipFamily, constants.ConfigVariableIPFamily) -} - -func getDockerBridgeNetworkCidr() (string, error) { - var stdout bytes.Buffer - var networkCidr string - - cmd := exec.Command("docker", "inspect", "-f", "'{{range .IPAM.Config}}{{.Subnet}}{{end}}'", "bridge") - cmd.Stdout = &stdout - - if err := cmd.Run(); err != nil { - return "", errors.Wrap(err, "failed to fetch the Subnet CIDR for docker 'bridge' network") - } - - networkCidr = stdout.String() - networkCidr = strings.TrimSpace(networkCidr) - networkCidr = strings.Trim(networkCidr, "'") - - return networkCidr, nil -} - -// ConfigureAndValidateAviConfiguration validates the configuration inputs of Avi aka. NSX Advanced Load Balancer -func (c *TkgClient) ConfigureAndValidateAviConfiguration(clusterName string) error { - aviEnable, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviEnable) - // ignoring error because AVI_ENABLE is an optional configuration - if aviEnable == "" || aviEnable == "false" { - return nil - } - - if len(clusterName) > constants.AkoMaxAllowedClusterNameLen { - return errors.Errorf("%s contains more than %d character, which will cause AKO package deployment failure", clusterName, constants.AkoMaxAllowedClusterNameLen) - } - // init avi client - aviClient := avi.New() - // if avi is enabled, then should verify following required fields - err := c.ValidateAviControllerAccount(aviClient) - if err != nil { - return customAviConfigurationError(err, "avi controller account") - } - if err = c.ValidateAviCloud(aviClient); err != nil { - return customAviConfigurationError(err, constants.ConfigVariableAviCloudName) - } - if err = c.ValidateAviServiceEngineGroup(aviClient); err != nil { - return customAviConfigurationError(err, constants.ConfigVariableAviServiceEngineGroup) - } - if err = c.ValidateAviDataPlaneNetwork(aviClient); err != nil { - return customAviConfigurationError(err, fmt.Sprintf("<%s,%s>", constants.ConfigVariableAviDataPlaneNetworkName, constants.ConfigVariableAviDataPlaneNetworkCIDR)) - } - - // validate following optional fields if configured - if err = c.ValidateAviManagementClusterServiceEngineGroup(aviClient); err != nil { - return customAviConfigurationError(err, constants.ConfigVariableAviManagementClusterServiceEngineGroup) - } - if err = c.ValidateAviControlPlaneNetwork(aviClient); err != nil { - return customAviConfigurationError(err, fmt.Sprintf("<%s,%s>", constants.ConfigVariableAviControlPlaneNetworkName, constants.ConfigVariableAviControlPlaneNetworkCIDR)) - } - if err = c.ValidateAviManagementClusterDataPlaneNetwork(aviClient); err != nil { - return customAviConfigurationError(err, fmt.Sprintf("<%s,%s>", constants.ConfigVariableAviManagementClusterDataPlaneNetworkName, constants.ConfigVariableAviManagementClusterDataPlaneNetworkCIDR)) - } - if err = c.ValidateAviManagementClusterControlPlaneNetwork(aviClient); err != nil { - return customAviConfigurationError(err, fmt.Sprintf("<%s,%s>", constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkName, constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkCIDR)) - } - return nil -} - -// ValidateAviControllerAccount validates if provide avi credentials are able to connect to avi controller or not -func (c *TkgClient) ValidateAviControllerAccount(aviClient avi.Client) error { - aviController, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviControllerAddress) - if err != nil { - return err - } - aviUserName, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviControllerUsername) - if err != nil { - return err - } - aviPassword, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviControllerPassword) - if err != nil { - return err - } - aviCAEncoded, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviControllerCA) - if err != nil { - return err - } - aviCA, err := base64.StdEncoding.DecodeString(aviCAEncoded) - if err != nil { - return err - } - // validate avi controller account - aviControllerParams := &models.AviControllerParams{ - Username: aviUserName, - Password: aviPassword, - Host: aviController, - Tenant: "admin", - CAData: string(aviCA), - } - authed, err := aviClient.VerifyAccount(aviControllerParams) - if err != nil { - return err - } - if !authed { - return errors.Errorf("unable to authenticate avi controller due to incorrect credentials") - } - return nil -} - -// ValidateAviCloud validates if configured cloud exists or not -func (c *TkgClient) ValidateAviCloud(aviClient avi.Client) error { - aviCloud, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviCloudName) - if err != nil { - return err - } - if _, err = aviClient.GetCloudByName(aviCloud); err != nil { - return err - } - return nil -} - -// ValidateAviServiceEngineGroup validates if configured service engine group exists or not -func (c *TkgClient) ValidateAviServiceEngineGroup(aviClient avi.Client) error { - aviServiceEngineGroup, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviServiceEngineGroup) - if err != nil { - return err - } - if _, err = aviClient.GetServiceEngineGroupByName(aviServiceEngineGroup); err != nil && !isAviResourceDuplicatedNameError(err) { - return err - } - return nil -} - -// ValidateAviManagementClusterServiceEngineGroup validates if configured management cluster service engine group exists or not -func (c *TkgClient) ValidateAviManagementClusterServiceEngineGroup(aviClient avi.Client) error { - aviManagementClusterSEG, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviManagementClusterServiceEngineGroup) - // this field is optional, only validates if it has value - if aviManagementClusterSEG != "" { - if _, err := aviClient.GetServiceEngineGroupByName(aviManagementClusterSEG); err != nil && !isAviResourceDuplicatedNameError(err) { - return err - } - } - return nil -} - -// ValidateAviDataPlaneNetwork validates if workload clusters' data plane vip network is valid or not -func (c *TkgClient) ValidateAviDataPlaneNetwork(aviClient avi.Client) error { - aviDataNetworkName, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviDataPlaneNetworkName) - if err != nil { - return err - } - aviDataNetworkCIDR, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviDataPlaneNetworkCIDR) - if err != nil { - return err - } - if err := c.ValidateAviNetwork(aviDataNetworkName, aviDataNetworkCIDR, aviClient); err != nil { - return err - } - return nil -} - -// ValidateAviControlPlaneNetwork validates if workload clusters' control plane vip network is valid or not -func (c *TkgClient) ValidateAviControlPlaneNetwork(aviClient avi.Client) error { - aviControlPlaneNetworkName, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviControlPlaneNetworkName) - aviControlPlaneNetworkCIDR, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviControlPlaneNetworkCIDR) - // these field are optional, only validates if they have value - if aviControlPlaneNetworkName != "" { - if err := c.ValidateAviNetwork(aviControlPlaneNetworkName, aviControlPlaneNetworkCIDR, aviClient); err != nil { - return err - } - } - return nil -} - -// ValidateAviManagementClusterDataPlaneNetwork checks if configured management cluster data plane vip network is valid or not -func (c *TkgClient) ValidateAviManagementClusterDataPlaneNetwork(aviClient avi.Client) error { - aviManagementClusterDataPlaneNetworkName, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviManagementClusterDataPlaneNetworkName) - aviManagementClusterDataPlaneNetworkCIDR, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviManagementClusterDataPlaneNetworkCIDR) - // these field are optional, only validates if they have value - if aviManagementClusterDataPlaneNetworkName != "" { - if err := c.ValidateAviNetwork(aviManagementClusterDataPlaneNetworkName, aviManagementClusterDataPlaneNetworkCIDR, aviClient); err != nil { - return err - } - } - return nil -} - -// ValidateAviManagementClusterControlPlaneNetwork checks if configured management cluster control plane vip network is valid or not -func (c *TkgClient) ValidateAviManagementClusterControlPlaneNetwork(aviClient avi.Client) error { - aviManagementClusterControlPlaneNetworkName, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkName) - aviManagementClusterControlPlaneNetworkCIDR, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkCIDR) - // these field are optional, only validates if they have value - if aviManagementClusterControlPlaneNetworkName != "" { - if err := c.ValidateAviNetwork(aviManagementClusterControlPlaneNetworkName, aviManagementClusterControlPlaneNetworkCIDR, aviClient); err != nil { - return err - } - } - return nil -} - -// ValidateAviNetwork validates if the network can be found in AVI controller or not and the subnet CIDR format is correct or not -func (c *TkgClient) ValidateAviNetwork(networkName, networkCIDR string, aviClient avi.Client) error { - _, err := aviClient.GetVipNetworkByName(networkName) - if err != nil && !isAviResourceDuplicatedNameError(err) { - return err - } - _, _, err = net.ParseCIDR(networkCIDR) - if err != nil { - return err - } - return nil -} - -// ConfigureAndValidateNameserverConfiguration validates the configuration of the control plane node and workload node nameservers -func (c *TkgClient) ConfigureAndValidateNameserverConfiguration(clusterRole string) error { - err := c.validateNameservers(constants.ConfigVariableControlPlaneNodeNameservers, clusterRole) - if err != nil { - return err - } - - return c.validateNameservers(constants.ConfigVariableWorkerNodeNameservers, clusterRole) -} - -func (c *TkgClient) validateNameservers(nameserverConfigVariable, clusterRole string) error { - // ignoring error because IPFamily is an optional configuration - // if not set Get will return an empty string - ipFamily, _ := c.TKGConfigReaderWriter().Get(constants.ConfigVariableIPFamily) - if ipFamily == "" { - ipFamily = constants.IPv4Family - } - - nameservers, err := c.TKGConfigReaderWriter().Get(nameserverConfigVariable) - if err != nil { - return nil - } - - if clusterRole == TkgLabelClusterRoleManagement && !c.IsFeatureActivated(constants.FeatureFlagManagementClusterCustomNameservers) { - return customNameserverFeatureFlagError(nameserverConfigVariable, nameservers, constants.FeatureFlagManagementClusterCustomNameservers) - } else if clusterRole == TkgLabelClusterRoleWorkload && !c.IsFeatureActivated(constants.FeatureFlagClusterCustomNameservers) { - return customNameserverFeatureFlagError(nameserverConfigVariable, nameservers, constants.FeatureFlagClusterCustomNameservers) - } - - invalidNameservers := []string{} - for _, nameserver := range strings.Split(nameservers, ",") { - nameserver = strings.TrimSpace(nameserver) - ip := net.ParseIP(nameserver) - if ip == nil || - ipFamily == constants.IPv4Family && ip.To4() == nil || - ipFamily == constants.IPv6Family && ip.To4() != nil { - invalidNameservers = append(invalidNameservers, nameserver) - } - } - - if len(invalidNameservers) > 0 { - return fmt.Errorf("invalid %s %q, expected to be IP addresses that match TKG_IP_FAMILY %q", nameserverConfigVariable, strings.Join(invalidNameservers, ","), ipFamily) - } - return nil -} - -func (c *TkgClient) checkIPFamilyFeatureFlags(ipFamily, clusterRole string) error { - if clusterRole == TkgLabelClusterRoleManagement { - dualIPv4PrimaryEnabled := c.IsFeatureActivated(constants.FeatureFlagManagementClusterDualStackIPv4Primary) - if !dualIPv4PrimaryEnabled && ipFamily == constants.DualStackPrimaryIPv4Family { - return dualStackFeatureFlagError(ipFamily, constants.FeatureFlagManagementClusterDualStackIPv4Primary) - } - dualIPv6PrimaryEnabled := c.IsFeatureActivated(constants.FeatureFlagManagementClusterDualStackIPv6Primary) - if !dualIPv6PrimaryEnabled && ipFamily == constants.DualStackPrimaryIPv6Family { - return dualStackFeatureFlagError(ipFamily, constants.FeatureFlagManagementClusterDualStackIPv6Primary) - } - } else { - dualIPv4PrimaryEnabled := c.IsFeatureActivated(constants.FeatureFlagClusterDualStackIPv4Primary) - if !dualIPv4PrimaryEnabled && ipFamily == constants.DualStackPrimaryIPv4Family { - return dualStackFeatureFlagError(ipFamily, constants.FeatureFlagClusterDualStackIPv4Primary) - } - dualIPv6PrimaryEnabled := c.IsFeatureActivated(constants.FeatureFlagClusterDualStackIPv6Primary) - if !dualIPv6PrimaryEnabled && ipFamily == constants.DualStackPrimaryIPv6Family { - return dualStackFeatureFlagError(ipFamily, constants.FeatureFlagClusterDualStackIPv6Primary) - } - } - - return nil -} - -func isAviResourceDuplicatedNameError(err error) bool { - return strings.Contains(err.Error(), "More than one object of type ") -} - -func dualStackFeatureFlagError(ipFamily, featureFlag string) error { - return fmt.Errorf("option TKG_IP_FAMILY is set to %q, but dualstack support is not enabled (because it is under development). To enable dualstack, set %s to \"true\"", ipFamily, featureFlag) -} - -func customNameserverFeatureFlagError(configVariable, nameservers, flagName string) error { - return fmt.Errorf("option %s is set to %q, but custom nameserver support is not enabled (because it is not fully functional). To enable custom nameservers, run the command: tanzu config set %s true", - configVariable, - nameservers, - flagName) -} - -func customAviConfigurationError(err error, configVariable string) error { - return errors.Wrapf(err, "nsx advanced load balancer configuration validation error, failed to validate %s", configVariable) -} diff --git a/tkg/client/validate_test.go b/tkg/client/validate_test.go deleted file mode 100644 index 2e63c98fff..0000000000 --- a/tkg/client/validate_test.go +++ /dev/null @@ -1,1849 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - "errors" - "fmt" - "os" - "time" - - "github.com/golang/mock/gomock" - . "github.com/onsi/ginkgo" - . "github.com/onsi/ginkgo/extensions/table" - . "github.com/onsi/gomega" - clusterctl "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - - aviMock "github.com/vmware-tanzu/tanzu-framework/tkg/avi/mocks" - "github.com/vmware-tanzu/tanzu-framework/tkg/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -var _ = Describe("Validate", func() { - var ( - tkgClient *client.TkgClient - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - featureFlagClient *fakes.FeatureFlagClient - ) - BeforeEach(func() { - tkgBomClient := new(fakes.TKGConfigBomClient) - tkgBomClient.GetDefaultTkrBOMConfigurationReturns(&tkgconfigbom.BOMConfiguration{ - Release: &tkgconfigbom.ReleaseInfo{Version: "v1.3"}, - Components: map[string][]*tkgconfigbom.ComponentInfo{ - "kubernetes": {{Version: "v1.20"}}, - }, - }, nil) - tkgBomClient.GetDefaultTkgBOMConfigurationReturns(&tkgconfigbom.BOMConfiguration{ - Release: &tkgconfigbom.ReleaseInfo{Version: "v1.23"}, - }, nil) - - configDir := os.TempDir() - - configFile, err := os.CreateTemp(configDir, "cluster-config-*.yaml") - Expect(err).NotTo(HaveOccurred()) - Expect(configFile.Sync()).To(Succeed()) - Expect(configFile.Close()).To(Succeed()) - - tkgConfigReaderWriter, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configFile.Name(), configFile.Name()) - Expect(err).NotTo(HaveOccurred()) - readerWriter, err := tkgconfigreaderwriter.NewWithReaderWriter(tkgConfigReaderWriter) - Expect(err).NotTo(HaveOccurred()) - - tkgConfigUpdater := new(fakes.TKGConfigUpdaterClient) - tkgConfigUpdater.CheckInfrastructureVersionStub = func(providerName string) (string, error) { - return providerName, nil - } - - featureFlagClient = &fakes.FeatureFlagClient{} - featureFlagClient.IsConfigFeatureActivatedReturns(true, nil) - - regionManager := new(fakes.RegionManager) - regionManager.ListRegionContextsReturns([]region.RegionContext{ - { - ClusterName: "test-mc", - }, - }, nil) - - options := client.Options{ - ReaderWriterConfigClient: readerWriter, - TKGConfigUpdater: tkgConfigUpdater, - TKGBomClient: tkgBomClient, - RegionManager: regionManager, - FeatureFlagClient: featureFlagClient, - } - tkgClient, err = client.New(options) - Expect(err).NotTo(HaveOccurred()) - }) - Context("vCenter IP and vSphere Control Plane Endpoint", func() { - var ( - nodeSizeOptions client.NodeSizeOptions - err error - ) - - BeforeEach(func() { - tkgClient, err = CreateTKGClient("../fakes/config/config.yaml", testingDir, defaultTKGBoMFileForTesting, 2*time.Second) - Expect(err).NotTo(HaveOccurred()) - - nodeSizeOptions = client.NodeSizeOptions{ - Size: "medium", - ControlPlaneSize: "medium", - WorkerSize: "medium", - } - }) - - Context("When vCenter IP and vSphere Control Plane Endpoint are different", func() { - It("Should validate successfully", func() { - vip := "10.10.10.11" - err = tkgClient.ConfigureAndValidateVsphereConfig("", nodeSizeOptions, vip, true, nil) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("When vCenter IP and vSphere Control Plane Endpoint are the same", func() { - It("Should throw a validation error", func() { - vip := "10.10.10.10" - err = tkgClient.ConfigureAndValidateVsphereConfig("", nodeSizeOptions, vip, true, nil) - Expect(err).To(HaveOccurred()) - }) - }) - }) - - Context("Validate extra args", func() { - Context("When it contains multiple key=value with delimiter ;", func() { - It("should pass", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableEtcdExtraArgs, "heartbeat-interval=300;election-timeout=2000") - Expect(tkgClient.ValidateExtraArgs()).ShouldNot(HaveOccurred()) - }) - }) - Context("When it contains single key=value", func() { - It("should pass", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableKubeSchedulerExtraArgs, "profiling=false") - Expect(tkgClient.ValidateExtraArgs()).ShouldNot(HaveOccurred()) - }) - }) - Context("When arg's value also contains equal sign", func() { - It("should pass", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableKubeControllerManagerExtraArgs, "feature-gates=RotateKubeletServerCertificate=true,ReadWriteOncePod=true;enable-garbage-collector=true") - Expect(tkgClient.ValidateExtraArgs()).ShouldNot(HaveOccurred()) - }) - }) - Context("When it does not use equal sign to delimit key and value", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAPIServerExtraArgs, "tls-min-version:VersionTLS12;tls-cipher-suites:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256") - Expect(tkgClient.ValidateExtraArgs().Error()).To(ContainSubstring("APISERVER_EXTRA_ARGS is not format key1=value1;key2=value2:")) - }) - }) - Context("When it contains an empty key", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableWorkerKubeletExtraArgs, "read-only-port=0;=0") - Expect(tkgClient.ValidateExtraArgs().Error()).To(ContainSubstring("WORKER_KUBELET_EXTRA_ARGS contains empty keys:")) - }) - }) - }) - - Context("ConfigureAndValidateManagementClusterConfiguration", func() { - var ( - initRegionOptions *client.InitRegionOptions - ) - - BeforeEach(func() { - initRegionOptions = &client.InitRegionOptions{ - Plan: "dev", - InfrastructureProvider: "vsphere", - VsphereControlPlaneEndpoint: "foo.bar", - Edition: "tkg", - } - tkgConfigReaderWriter.Set(constants.ConfigVariableVsphereNetwork, "foo network") - }) - - Context("IPFamily configuration and validation", func() { - It("should allow empty IPFamily fields", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - - Context("when IPFamily is empty", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "") - }) - - Context("when SERVICE_CIDR and CLUSTER_CIDR are ipv4", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "192.168.2.1/12") - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "192.168.2.1/8") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - - Context("when SERVICE_CIDR is ipv6", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "::1/108") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid SERVICE_CIDR \"::1/108\", expected to be a CIDR of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - - Context("when CLUSTER_CIDR is ipv6", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "::1/8") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CLUSTER_CIDR \"::1/8\", expected to be a CIDR of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - - Context("HTTP(S)_PROXY variables", func() { - Context("when HTTP_PROXY and HTTPS_PROXY are ipv6 with ports", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://[::1]:3128") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://[::1]:3128") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid TKG_HTTP_PROXY \"http://[::1]:3128\", expected to be an address of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - Context("when HTTP_PROXY and HTTPS_PROXY are present without TKG_HTTP_PROXY_ENABLED set to true", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://1.2.3.4:3128") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://1.2.3.4:3128") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("cannot get TKG_HTTP_PROXY_ENABLED: Failed to get value for variable \"TKG_HTTP_PROXY_ENABLED\". Please set the variable value using os env variables or using the config file")) - }) - }) - }) - }) - - Context("when IPFamily is ipv4", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv4") - }) - - Context("when SERVICE_CIDR and CLUSTER_CIDR are ipv4", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "192.168.2.1/12") - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "192.168.2.1/8") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when SERVICE_CIDR is ipv6", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "::1/108") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid SERVICE_CIDR \"::1/108\", expected to be a CIDR of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - Context("when CLUSTER_CIDR is ipv6", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "::1/8") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CLUSTER_CIDR \"::1/8\", expected to be a CIDR of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - Context("when SERVICE_CIDR is not an actual CIDR", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "1.2.3.4") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid SERVICE_CIDR \"1.2.3.4\", expected to be a CIDR of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - Context("when CLUSTER_CIDR is not an actual CIDR", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "1.2.3.4") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CLUSTER_CIDR \"1.2.3.4\", expected to be a CIDR of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - Context("when SERVICE_CIDR is undefined", func() { - It("should set the default CIDR", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableServiceCIDR) - Expect(cidr).To(Equal("100.64.0.0/13")) - }) - }) - Context("when CLUSTER_CIDR is undefined", func() { - It("should not set the default CIDR if ConfigVariableEnableTKGSRoutablePod is enabled", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableEnableTKGSRoutablePod, "true") - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableClusterCIDR) - Expect(cidr).To(Equal("")) - }) - - It("should set the default CIDR if ConfigVariableEnableTKGSRoutablePod is not enabled", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableClusterCIDR) - Expect(cidr).To(Equal("100.96.0.0/11")) - }) - }) - Context("when SERVICE_CIDR is garbage", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "klsfda") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid SERVICE_CIDR \"klsfda\", expected to be a CIDR of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - Context("when CLUSTER_CIDR is garbage", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "aoiwnf") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CLUSTER_CIDR \"aoiwnf\", expected to be a CIDR of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - Context("when multiple CIDRs are provided to SERVICE_CIDR", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "1.2.3.4/12,1.2.3.5/12") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid SERVICE_CIDR \"1.2.3.4/12,1.2.3.5/12\", expected to be a CIDR of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - Context("when multiple CIDRs are provided to CLUSTER_CIDR", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "1.2.3.5/8,1.2.3.6/8") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CLUSTER_CIDR \"1.2.3.5/8,1.2.3.6/8\", expected to be a CIDR of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - Context("HTTP(S)_PROXY variables", func() { - Context("when HTTP_PROXY and HTTPS_PROXY are unset", func() { - It("should pass validation", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when HTTP_PROXY and HTTPS_PROXY are ipv4", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://1.2.3.4") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://1.2.3.4") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when HTTP_PROXY and HTTPS_PROXY set but not TKG_HTTP_PROXY_ENABLE is unset", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://1.2.3.4") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "http://1.2.3.4") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("cannot get TKG_HTTP_PROXY_ENABLED: Failed to get value for variable \"TKG_HTTP_PROXY_ENABLED\". Please set the variable value using os env variables or using the config file")) - }) - }) - Context("when HTTP_PROXY and HTTPS_PROXY are ipv6 with ports", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://[::1]:3128") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://[::1]:3128") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid TKG_HTTP_PROXY \"http://[::1]:3128\", expected to be an address of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - Context("when HTTP_PROXY and HTTPS_PROXY are ipv4 with ports", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://1.2.3.4:3128") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://1.2.3.4:3128") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when HTTP_PROXY and HTTPS_PROXY are domain names", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://foo.bar.com") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://foo.bar.com") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when HTTP_PROXY is ipv6", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://[::1]") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://foo.bar.com") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid TKG_HTTP_PROXY \"http://[::1]\", expected to be an address of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - Context("when HTTPS_PROXY is ipv6", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "https://foo.bar.com") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "http://[::1]") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid TKG_HTTPS_PROXY \"http://[::1]\", expected to be an address of type \"ipv4\" (TKG_IP_FAMILY)")) - }) - }) - DescribeTable("NO_PROXY validate", func(httpProxy, httpsProxy, noProxy string, hasError bool) { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, httpProxy) - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, httpsProxy) - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - tkgConfigReaderWriter.Set(constants.TKGNoProxy, noProxy) - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - if hasError { - Expect(validationError).To(HaveOccurred()) - return - } - - Expect(validationError).NotTo(HaveOccurred()) - v, err := tkgConfigReaderWriter.Get(constants.TKGNoProxy) - Expect(err).NotTo(HaveOccurred()) - Expect(v).NotTo(ContainSubstring(" ")) - Expect(v).NotTo(ContainSubstring(" ")) - Expect(v).NotTo(ContainSubstring(` - `)) - }, - Entry("No proxy has new line, trim new line", "http://1.2.3.4", "http://1.2.3.4", `10.2.1.3/23, - 10.1.3.3`, false), - Entry("No Proxy has space, trim space", "http://1.2.3.4", "http://1.2.3.4", "example.com, svc.c", false), - Entry("No Proxy has *", "http://1.2.3.4", "http://1.2.3.4", "example.com, svc.c,*.vmware.com", true), - Entry("No Proxy", "http://1.2.3.4", "http://1.2.3.4", "10.0.0.0/24", false), - ) - }) - }) - - Context("when IPFamily is ipv6", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv6") - }) - Context("when SERVICE_CIDR and CLUSTER_CIDR are ipv6", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "::1/108") - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "::1/8") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when SERVICE_CIDR is ipv4", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "1.2.3.4/16") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid SERVICE_CIDR \"1.2.3.4/16\", expected to be a CIDR of type \"ipv6\" (TKG_IP_FAMILY)")) - }) - }) - Context("when CLUSTER_CIDR is ipv4", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "1.2.3.4/16") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CLUSTER_CIDR \"1.2.3.4/16\", expected to be a CIDR of type \"ipv6\" (TKG_IP_FAMILY)")) - }) - }) - Context("when SERVICE_CIDR is not an actual CIDR", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "::1") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid SERVICE_CIDR \"::1\", expected to be a CIDR of type \"ipv6\" (TKG_IP_FAMILY)")) - }) - }) - Context("when CLUSTER_CIDR is not an actual CIDR", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "::1") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CLUSTER_CIDR \"::1\", expected to be a CIDR of type \"ipv6\" (TKG_IP_FAMILY)")) - }) - }) - Context("when SERVICE_CIDR is undefined", func() { - It("should set the default CIDR", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableServiceCIDR) - Expect(cidr).To(Equal("fd00:100:64::/108")) - }) - }) - Context("when CLUSTER_CIDR is undefined", func() { - It("should not set the default CIDR if ConfigVariableEnableTKGSRoutablePod is enabled", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableEnableTKGSRoutablePod, "true") - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableClusterCIDR) - Expect(cidr).To(Equal("")) - }) - - It("should set the default CIDR if ConfigVariableEnableTKGSRoutablePod is not enabled", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableClusterCIDR) - Expect(cidr).To(Equal("fd00:100:96::/48")) - }) - }) - Context("when SERVICE_CIDR is garbage", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "klsfda") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid SERVICE_CIDR \"klsfda\", expected to be a CIDR of type \"ipv6\" (TKG_IP_FAMILY)")) - }) - }) - Context("when CLUSTER_CIDR is garbage", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "aoiwnf") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CLUSTER_CIDR \"aoiwnf\", expected to be a CIDR of type \"ipv6\" (TKG_IP_FAMILY)")) - }) - }) - Context("when multiple CIDRs are provided to SERVICE_CIDR", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "::1/108,::2/108") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid SERVICE_CIDR \"::1/108,::2/108\", expected to be a CIDR of type \"ipv6\" (TKG_IP_FAMILY)")) - }) - }) - Context("when multiple CIDRs are provided to CLUSTER_CIDR", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "::3/8,::4/8") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CLUSTER_CIDR \"::3/8,::4/8\", expected to be a CIDR of type \"ipv6\" (TKG_IP_FAMILY)")) - }) - }) - Context("HTTP(S)_PROXY variables", func() { - Context("when HTTP_PROXY and HTTPS_PROXY are unset", func() { - It("should pass validation", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when HTTP_PROXY and HTTPS_PROXY are ipv6", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://[::1]") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://[::1]") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when HTTP_PROXY and HTTPS_PROXY set but not TKG_HTTP_PROXY_ENABLE is unset", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://[::1]") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "http://[::1]") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("cannot get TKG_HTTP_PROXY_ENABLED: Failed to get value for variable \"TKG_HTTP_PROXY_ENABLED\". Please set the variable value using os env variables or using the config file")) - }) - }) - Context("when HTTP_PROXY and HTTPS_PROXY are ipv6 with ports", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://[::1]:3128") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://[::1]:3128") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when HTTP_PROXY and HTTPS_PROXY are ipv4 with ports", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://1.2.3.4:3128") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://1.2.3.4:3128") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid TKG_HTTP_PROXY \"http://1.2.3.4:3128\", expected to be an address of type \"ipv6\" (TKG_IP_FAMILY)")) - }) - }) - Context("when HTTP_PROXY and HTTPS_PROXY are domain names", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://foo.bar.com") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://foo.bar.com") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when HTTP_PROXY is ipv4", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "http://1.2.3.4") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "https://foo.bar.com") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid TKG_HTTP_PROXY \"http://1.2.3.4\", expected to be an address of type \"ipv6\" (TKG_IP_FAMILY)")) - }) - }) - Context("when HTTPS_PROXY is ipv4", func() { - It("should fail validation", func() { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, "https://foo.bar.com") - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, "http://1.2.3.4") - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid TKG_HTTPS_PROXY \"http://1.2.3.4\", expected to be an address of type \"ipv6\" (TKG_IP_FAMILY)")) - }) - }) - }) - }) - - Context("when IPFamily is ipv4,ipv6 i.e Dual-stack Primary IPv4", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv4,ipv6") - }) - - Context("when dual-stack-ipv4-primary feature gate is false", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedReturns(false, nil) - }) - It("returns an error", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("option TKG_IP_FAMILY is set to \"ipv4,ipv6\", but dualstack support is not enabled (because it is under development). To enable dualstack, set features.management-cluster.dual-stack-ipv4-primary to \"true\"")) - }) - }) - Context("when SERVICE_CIDR and CLUSTER_CIDR are ipv4,ipv6", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "1.2.3.4/16,::1/108") - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "1.2.3.5/16,::3/8") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - - Context("when SERVICE_CIDR is undefined", func() { - It("should set the default CIDR", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableServiceCIDR) - Expect(cidr).To(Equal("100.64.0.0/13,fd00:100:64::/108")) - }) - }) - - Context("when CLUSTER_CIDR is undefined", func() { - It("should not set the default CIDR if ConfigVariableEnableTKGSRoutablePod is enabled", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableEnableTKGSRoutablePod, "true") - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableClusterCIDR) - Expect(cidr).To(Equal("")) - }) - - It("should set the default CIDR if ConfigVariableEnableTKGSRoutablePod is not enabled", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableClusterCIDR) - Expect(cidr).To(Equal("100.96.0.0/11,fd00:100:96::/48")) - }) - }) - - DescribeTable("HTTP(S)_PROXY variables", func(httpProxy, httpsProxy string) { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, httpProxy) - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, httpsProxy) - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }, - Entry("IPv6 Address", "http://[::1]", "https://[::1]"), - Entry("IPv6 Address with Ports", "http://[::1]:3128", "https://[::1]:3128"), - Entry("IPv4 Address", "http://1.2.3.4", "https://1.2.3.4"), - Entry("IPv4 Address with Ports", "http://1.2.3.4:3128", "https://1.2.3.4:3128"), - Entry("Domain Name", "http://foo.bar.com", "https://foo.bar.com"), - ) - - DescribeTable("HTTP(S)_PROXY variables without TKGHTTPProxyEnabled set to true", func(httpProxy, httpsProxy string) { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, httpProxy) - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, httpsProxy) - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("cannot get TKG_HTTP_PROXY_ENABLED: Failed to get value for variable \"TKG_HTTP_PROXY_ENABLED\". Please set the variable value using os env variables or using the config file")) - }, - Entry("IPv6 Address", "http://[::1]", "https://[::1]"), - Entry("IPv6 Address with Ports", "http://[::1]:3128", "https://[::1]:3128"), - Entry("IPv4 Address", "http://1.2.3.4", "https://1.2.3.4"), - Entry("IPv4 Address with Ports", "http://1.2.3.4:3128", "https://1.2.3.4:3128"), - Entry("Domain Name", "http://foo.bar.com", "https://foo.bar.com"), - ) - }) - - Context("when IPFamily is ipv6,ipv4 i.e Dual-stack Primary IPv6", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv6,ipv4") - }) - - Context("when dual-stack-ipv6-primary feature gate is false", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedReturns(false, nil) - }) - It("returns an error", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("option TKG_IP_FAMILY is set to \"ipv6,ipv4\", but dualstack support is not enabled (because it is under development). To enable dualstack, set features.management-cluster.dual-stack-ipv6-primary to \"true\"")) - }) - }) - - Context("when SERVICE_CIDR and CLUSTER_CIDR are ipv6,ipv4", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "::1/108,1.2.3.4/16") - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, "::3/8,1.2.3.5/16") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - - Context("when SERVICE_CIDR is undefined", func() { - It("should set the default CIDR", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableServiceCIDR) - Expect(cidr).To(Equal("fd00:100:64::/108,100.64.0.0/13")) - }) - }) - - Context("when CLUSTER_CIDR is undefined", func() { - It("should not set the default CIDR if ConfigVariableEnableTKGSRoutablePod is enabled", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableEnableTKGSRoutablePod, "true") - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableClusterCIDR) - Expect(cidr).To(Equal("")) - }) - - It("should set the default CIDR if ConfigVariableEnableTKGSRoutablePod is not enabled", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - cidr, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableClusterCIDR) - Expect(cidr).To(Equal("fd00:100:96::/48,100.96.0.0/11")) - }) - }) - - DescribeTable("HTTP(S)_PROXY variables", func(httpProxy, httpsProxy string) { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, httpProxy) - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, httpsProxy) - tkgConfigReaderWriter.Set(constants.TKGHTTPProxyEnabled, "true") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }, - Entry("IPv6 Address", "http://[::1]", "https://[::1]"), - Entry("IPv6 Address with Ports", "http://[::1]:3128", "https://[::1]:3128"), - Entry("IPv4 Address", "http://1.2.3.4", "https://1.2.3.4"), - Entry("IPv4 Address with Ports", "http://1.2.3.4:3128", "https://1.2.3.4:3128"), - Entry("Domain Name", "http://foo.bar.com", "https://foo.bar.com"), - ) - - DescribeTable("HTTP(S)_PROXY variables without TKGHTTPProxyEnabled set to true", func(httpProxy, httpsProxy string) { - tkgConfigReaderWriter.Set(constants.TKGHTTPProxy, httpProxy) - tkgConfigReaderWriter.Set(constants.TKGHTTPSProxy, httpsProxy) - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("cannot get TKG_HTTP_PROXY_ENABLED: Failed to get value for variable \"TKG_HTTP_PROXY_ENABLED\". Please set the variable value using os env variables or using the config file")) - }, - Entry("IPv6 Address", "http://[::1]", "https://[::1]"), - Entry("IPv6 Address with Ports", "http://[::1]:3128", "https://[::1]:3128"), - Entry("IPv4 Address", "http://1.2.3.4", "https://1.2.3.4"), - Entry("IPv4 Address with Ports", "http://1.2.3.4:3128", "https://1.2.3.4:3128"), - Entry("Domain Name", "http://foo.bar.com", "https://foo.bar.com"), - ) - }) - - const dualStackIPv4Primary = "ipv4,ipv6" - const dualStackIPv6Primary = "ipv6,ipv4" - const dualStackIPv4PrimaryFormatted = "," - const dualStackIPv6PrimaryFormatted = "," - - DescribeTable("Dual-stack ServiceCIDR failure cases", func(ipFamily, serviceCIDRs string) { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, ipFamily) - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, serviceCIDRs) - var expectedFormat string - switch ipFamily { - case dualStackIPv4Primary: - expectedFormat = dualStackIPv4PrimaryFormatted - case dualStackIPv6Primary: - expectedFormat = dualStackIPv6PrimaryFormatted - } - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError).To(MatchError( - fmt.Sprintf(`invalid SERVICE_CIDR %q, expected to have %q for TKG_IP_FAMILY %q`, - serviceCIDRs, - expectedFormat, - ipFamily, - ), - )) - }, - // Primary IPv4: - Entry("Primary IPv4: IPv4 CIDR only", dualStackIPv4Primary, "1.2.3.4/16"), - Entry("Primary IPv4: IPv6 CIDR only", dualStackIPv4Primary, "::1/108"), - Entry("Primary IPv4: IPv4 Address", dualStackIPv4Primary, "1.2.3.4,::1/108"), - Entry("Primary IPv4: IPv6 Address", dualStackIPv4Primary, "1.2.3.4/16,::1"), - Entry("Primary IPv4: Too many CIDRs", dualStackIPv4Primary, "1.2.3.4/16,::1/108,::2/108"), - Entry("Primary IPv4: Two IPv4 CIDRs", dualStackIPv4Primary, "1.2.3.4/16,2.3.4.5/16"), - Entry("Primary IPv4: Two IPv6 CIDRs", dualStackIPv4Primary, "::1/108,::2/108"), - Entry("Primary IPv4: Out of order", dualStackIPv4Primary, "::1/108,1.2.3.4/16"), - Entry("Primary IPv4: Garbage", dualStackIPv4Primary, "asdf,fasd"), - // Primary Ipv6: - Entry("Primary IPv6: IPv4 CIDR only", dualStackIPv6Primary, "1.2.3.4/16"), - Entry("Primary IPv6: IPv6 CIDR only", dualStackIPv6Primary, "::1/108"), - Entry("Primary IPv6: IPv4 Address", dualStackIPv6Primary, "::1/108,1.2.3.4"), - Entry("Primary IPv6: IPv6 Address", dualStackIPv6Primary, "::1,1.2.3.4/16"), - Entry("Primary IPv6: Too many CIDRs", dualStackIPv6Primary, "::1/108,::2/108,1.2.3.4/16"), - Entry("Primary IPv6: Two IPv4 CIDRs", dualStackIPv6Primary, "1.2.3.4/16,2.3.4.5/16"), - Entry("Primary IPv6: Two IPv6 CIDRs", dualStackIPv6Primary, "::1/108,::2/108"), - Entry("Primary IPv6: Out of order", dualStackIPv6Primary, "1.2.3.4/16,::1/108"), - Entry("Primary IPv6: Garbage", dualStackIPv6Primary, "asdf,fasd"), - ) - - DescribeTable("Dual Stack ClusterCIDR failure cases", func(ipFamily, clusterCIDRs string) { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, ipFamily) - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterCIDR, clusterCIDRs) - var expectedFormat string - switch ipFamily { - case dualStackIPv4Primary: - expectedFormat = dualStackIPv4PrimaryFormatted - case dualStackIPv6Primary: - expectedFormat = dualStackIPv6PrimaryFormatted - } - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError).To(MatchError( - fmt.Sprintf(`invalid CLUSTER_CIDR %q, expected to have %q for TKG_IP_FAMILY %q`, - clusterCIDRs, - expectedFormat, - ipFamily, - ), - )) - }, - // Primary IPv4: - Entry("Primary IPv4: IPv4 CIDR only", dualStackIPv4Primary, "1.2.3.4/16"), - Entry("Primary IPv4: IPv6 CIDR only", dualStackIPv4Primary, "::1/8"), - Entry("Primary IPv4: IPv4 Address", dualStackIPv4Primary, "1.2.3.4,::1/8"), - Entry("Primary IPv4: IPv6 Address", dualStackIPv4Primary, "1.2.3.4/16,::1"), - Entry("Primary IPv4: Too many CIDRs", dualStackIPv4Primary, "1.2.3.4/16,::1/8,::2/8"), - Entry("Primary IPv4: Two IPv4 CIDRs", dualStackIPv4Primary, "1.2.3.4/16,2.3.4.5/16"), - Entry("Primary IPv4: Two IPv6 CIDRs", dualStackIPv4Primary, "::1/8,::2/8"), - Entry("Primary IPv4: Out of order", dualStackIPv4Primary, "::1/8,1.2.3.4/16"), - Entry("Primary IPv4: Garbage", dualStackIPv4Primary, "asdf,fasd"), - // Primary Ipv6: - Entry("Primary IPv6: IPv4 CIDR only", dualStackIPv6Primary, "1.2.3.4/16"), - Entry("Primary IPv6: IPv6 CIDR only", dualStackIPv6Primary, "::1/8"), - Entry("Primary IPv6: IPv4 Address", dualStackIPv6Primary, "::1/8,1.2.3.4"), - Entry("Primary IPv6: IPv6 Address", dualStackIPv6Primary, "::1,1.2.3.4/16"), - Entry("Primary IPv6: Too many CIDRs", dualStackIPv6Primary, "::1/8,::2/8,1.2.3.4/16"), - Entry("Primary IPv6: Two IPv4 CIDRs", dualStackIPv6Primary, "1.2.3.4/16,2.3.4.5/16"), - Entry("Primary IPv6: Two IPv6 CIDRs", dualStackIPv6Primary, "::1/8,::2/8"), - Entry("Primary IPv6: Out of order", dualStackIPv6Primary, "1.2.3.4/16,::1/8"), - Entry("Primary IPv6: Garbage", dualStackIPv6Primary, "asdf,fasd"), - ) - }) - - DescribeTable("SERVICE_CIDR size validation - invalid cases", func(ipFamily, serviceCIDR, problematicCIDR, netmaskSizeConstraint string) { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, ipFamily) - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, serviceCIDR) - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - expectedErrorMsg := fmt.Sprintf(`invalid SERVICE_CIDR "%s", expected netmask to be "%s" or greater`, problematicCIDR, netmaskSizeConstraint) - Expect(validationError.Error()).To(ContainSubstring(expectedErrorMsg)) - }, - Entry("ipv4 cidr too large", "ipv4", "192.168.2.1/11", "192.168.2.1/11", "/12"), - Entry("ipv6 cidr too large", "ipv6", "::1/107", "::1/107", "/108"), - Entry("ipv4-primary dualstack: ipv4 cidr too large", "ipv4,ipv6", "1.2.3.4/11,::1/108", "1.2.3.4/11", "/12"), - Entry("ipv4-primary dualstack: ipv6 cidr too large", "ipv4,ipv6", "1.2.3.4/12,::1/107", "::1/107", "/108"), - Entry("ipv6-primary dualstack: ipv6 cidr too large", "ipv6,ipv4", "::1/107,1.2.3.4/12", "::1/107", "/108"), - Entry("ipv6-primary dualstack: ipv4 cidr too large", "ipv6,ipv4", "::1/108,1.2.3.4/11", "1.2.3.4/11", "/12"), - ) - - DescribeTable("SERVICE_CIDR size validation - valid cases", func(ipFamily, serviceCIDR string) { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, ipFamily) - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, serviceCIDR) - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }, - Entry("ipv4 cidr at max size", "ipv4", "192.168.2.1/12"), - Entry("ipv4 cidr at slightly smaller size", "ipv4", "192.168.2.1/13"), - Entry("ipv6 cidr at max size", "ipv6", "::1/108"), - Entry("ipv6 cidr at slightly smaller size", "ipv6", "::1/108"), - Entry("ipv4-primary dualstack: cidrs at max size", "ipv4,ipv6", "1.2.3.4/12,::1/108"), - Entry("ipv6-primary dualstack: cidrs at max size", "ipv6,ipv4", "::1/108,1.2.3.4/12"), - ) - - Context("Nameserver configuration and validation", func() { - It("should allow empty nameserver configurations", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - - Context("Control Plane Node Nameservers", func() { - Context("Custom Nameserver feature gate is false", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedReturns(false, nil) - tkgConfigReaderWriter.Set(constants.ConfigVariableControlPlaneNodeNameservers, "8.8.8.8") - }) - - It("should return an error", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("option CONTROL_PLANE_NODE_NAMESERVERS is set to \"8.8.8.8\", but custom nameserver support is not enabled (because it is not fully functional). To enable custom nameservers, run the command: tanzu config set features.management-cluster.custom-nameservers true")) - }) - }) - - Context("when CONTROL_PLANE_NODE_NAMESERVERS is a valid set of IPv4 address", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableControlPlaneNodeNameservers, "8.8.8.8,8.8.4.4") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when CONTROL_PLANE_NODE_NAMESERVERS is a valid set of IPv6 address and TKG_IP_FAMILY is ipv6", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv6") - tkgConfigReaderWriter.Set(constants.ConfigVariableControlPlaneNodeNameservers, "2001:DB8::1, 2001:DB8::2") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when CONTROL_PLANE_NODE_NAMESERVERS only contains IPv6 addresses and TKG_IP_FAMILY is ipv4,ipv6", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv4,ipv6") - tkgConfigReaderWriter.Set(constants.ConfigVariableControlPlaneNodeNameservers, "2001:DB8::1,2001:DB8::2") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when CONTROL_PLANE_NODE_NAMESERVERS only contains IPv4 addresses and TKG_IP_FAMILY is ipv4,ipv6", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv4,ipv6") - tkgConfigReaderWriter.Set(constants.ConfigVariableControlPlaneNodeNameservers, "8.8.8.8,8.8.4.4") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when CONTROL_PLANE_NODE_NAMESERVERS is a valid set of IPv4,IPv6 address and TKG_IP_FAMILY is ipv4,ipv6", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv4,ipv6") - tkgConfigReaderWriter.Set(constants.ConfigVariableControlPlaneNodeNameservers, "8.8.8.8,2001:DB8::2,8.8.4.4,2001:DB8::4") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when CONTROL_PLANE_NODE_NAMESERVERS contains multiple invalid entries", func() { - It("should return an error", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableControlPlaneNodeNameservers, "google.dns,1.2.3.4,foo.bar") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CONTROL_PLANE_NODE_NAMESERVERS \"google.dns,foo.bar\", expected to be IP addresses that match TKG_IP_FAMILY \"ipv4\"")) - }) - }) - Context("when CONTROL_PLANE_NODE_NAMESERVERS is a IPv6, but the TKG_IP_FAMILY is ipv4", func() { - It("should return an error", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableControlPlaneNodeNameservers, "2001:DB8::1") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CONTROL_PLANE_NODE_NAMESERVERS \"2001:DB8::1\", expected to be IP addresses that match TKG_IP_FAMILY \"ipv4\"")) - }) - }) - Context("when CONTROL_PLANE_NODE_NAMESERVERS is a IPv4, but the TKG_IP_FAMILY is ipv6", func() { - It("should return an error", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv6") - tkgConfigReaderWriter.Set(constants.ConfigVariableControlPlaneNodeNameservers, "8.8.8.8") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid CONTROL_PLANE_NODE_NAMESERVERS \"8.8.8.8\", expected to be IP addresses that match TKG_IP_FAMILY \"ipv6\"")) - }) - }) - }) - Context("Worker Node Nameservers", func() { - Context("Custom Nameserver feature gate is false", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedReturns(false, nil) - tkgConfigReaderWriter.Set(constants.ConfigVariableWorkerNodeNameservers, "8.8.8.8") - }) - - It("should return an error", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("option WORKER_NODE_NAMESERVERS is set to \"8.8.8.8\", but custom nameserver support is not enabled (because it is not fully functional). To enable custom nameservers, run the command: tanzu config set features.management-cluster.custom-nameservers true")) - }) - }) - - Context("when WORKER_NODE_NAMESERVERS is a valid set of IPv4 address", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableWorkerNodeNameservers, "8.8.8.8,8.8.4.4") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when WORKER_NODE_NAMESERVERS is a valid set of IPv6 address and TKG_IP_FAMILY is ipv6", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv6") - tkgConfigReaderWriter.Set(constants.ConfigVariableWorkerNodeNameservers, "2001:DB8::1, 2001:DB8::2") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when WORKER_NODE_NAMESERVERS only contains IPv6 addresses and TKG_IP_FAMILY is ipv4,ipv6", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv4,ipv6") - tkgConfigReaderWriter.Set(constants.ConfigVariableWorkerNodeNameservers, "2001:DB8::1,2001:DB8::2") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when WORKER_NODE_NAMESERVERS only contains IPv4 addresses and TKG_IP_FAMILY is ipv4,ipv6", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv4,ipv6") - tkgConfigReaderWriter.Set(constants.ConfigVariableWorkerNodeNameservers, "8.8.8.8,8.8.4.4") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when WORKER_NODE_NAMESERVERS is a valid set of IPv4,IPv6 address and TKG_IP_FAMILY is ipv4,ipv6", func() { - It("should pass validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv4,ipv6") - tkgConfigReaderWriter.Set(constants.ConfigVariableWorkerNodeNameservers, "8.8.8.8,2001:DB8::2,8.8.4.4,2001:DB8::4") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("when WORKER_NODE_NAMESERVERS contains multiple invalid entries", func() { - It("should return an error", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableWorkerNodeNameservers, "google.dns,1.2.3.4,foo.bar") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid WORKER_NODE_NAMESERVERS \"google.dns,foo.bar\", expected to be IP addresses that match TKG_IP_FAMILY \"ipv4\"")) - }) - }) - Context("when WORKER_NODE_NAMESERVERS is a IPv6, but the TKG_IP_FAMILY is ipv4", func() { - It("should return an error", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableWorkerNodeNameservers, "2001:DB8::1") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid WORKER_NODE_NAMESERVERS \"2001:DB8::1\", expected to be IP addresses that match TKG_IP_FAMILY \"ipv4\"")) - }) - }) - Context("when WORKER_NODE_NAMESERVERS is a IPv4, but the TKG_IP_FAMILY is ipv6", func() { - It("should return an error", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv6") - tkgConfigReaderWriter.Set(constants.ConfigVariableWorkerNodeNameservers, "8.8.8.8") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("invalid WORKER_NODE_NAMESERVERS \"8.8.8.8\", expected to be IP addresses that match TKG_IP_FAMILY \"ipv6\"")) - }) - }) - }) - }) - - Context("CoreDNSIP configuration and validation", func() { - Context("when SERVICE_CIDR is ipv4", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv4") - }) - - It("should have correct ipv4 coreDNSIP configured", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "10.64.0.1/13") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - - coreDNSIP, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableCoreDNSIP) - Expect(coreDNSIP).Should(Equal("10.64.0.10")) - }) - - It("should have correct ipv4 coreDNSIP configured", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "192.168.2.1/12") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - - coreDNSIP, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableCoreDNSIP) - Expect(coreDNSIP).Should(Equal("192.160.0.10")) - }) - }) - - Context("when SERVICE_CIDR is ipv6", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv6") - }) - - It("should have correct ipv6 coreDNSIP configured", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "fd00:100:64::/108") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - - coreDNSIP, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableCoreDNSIP) - Expect(coreDNSIP).Should(Equal("fd00:100:64::a")) - }) - - It("should have correct ipv6 coreDNSIP configured", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "::1/108") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - - coreDNSIP, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableCoreDNSIP) - Expect(coreDNSIP).Should(Equal("::a")) - }) - }) - - Context("when IPFamily is ipv4,ipv6 i.e Dual-stack Primary IPv4", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv4,ipv6") - }) - - It("should have correct ipv4 coreDNSIP configured", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "1.2.3.4/12,::1/108") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - - coreDNSIP, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableCoreDNSIP) - Expect(coreDNSIP).Should(Equal("1.0.0.10")) - }) - }) - - Context("when IPFamily is ipv6,ipv4 i.e Dual-stack Primary IPv6", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv6,ipv4") - }) - - It("should have correct ipv6 coreDNSIP configured", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, "::1/108,1.2.3.4/12") - - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - - coreDNSIP, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableCoreDNSIP) - Expect(coreDNSIP).Should(Equal("::a")) - }) - }) - }) - - Context("ConfigureAndValidateAviConfiguration", func() { - var ( - mockCtrl *gomock.Controller - mockClient *aviMock.MockClient - ) - BeforeEach(func() { - mockCtrl = gomock.NewController(GinkgoT()) - mockClient = aviMock.NewMockClient(mockCtrl) - }) - AfterEach(func() { - mockCtrl.Finish() - }) - When("avi is not enabled", func() { - It("should skip avi validation", func() { - err := tkgClient.ConfigureAndValidateAviConfiguration("test-mgmt") - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should skip avi validation", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviEnable, "false") - err := tkgClient.ConfigureAndValidateAviConfiguration("test-mgmt") - Expect(err).ShouldNot(HaveOccurred()) - }) - }) - - When("avi is enabled", func() { - It("should throw error if cluster name is longer than avi max allowed length", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviEnable, "true") - err := tkgClient.ConfigureAndValidateAviConfiguration("test-mgmt-abcdefghigklmnopqrstuvwxyz") - Expect(err).Should(HaveOccurred()) - }) - }) - - When("validate avi account", func() { - It("should throw error if not set AVI_CONTROLLER", func() { - err := tkgClient.ValidateAviControllerAccount(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should throw error if not set AVI_USERNAME", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerAddress, "10.10.10.1") - err := tkgClient.ValidateAviControllerAccount(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should throw error if not set AVI_PASSWORD", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerAddress, "10.10.10.1") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerUsername, "test-user") - err := tkgClient.ValidateAviControllerAccount(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should throw error if not set AVI_CA_DATA_B64", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerAddress, "10.10.10.1") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerUsername, "test-user") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerPassword, "test-password") - err := tkgClient.ValidateAviControllerAccount(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should throw error if AVI_CA_DATA_B64 format error", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerAddress, "10.10.10.1") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerUsername, "test-user") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerPassword, "test-password") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerCA, "adacad") - err := tkgClient.ValidateAviControllerAccount(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should throw error if call AVI controller API error", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerAddress, "10.10.10.1") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerUsername, "test-user") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerPassword, "test-password") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerCA, "dGVzdC1jYQ==") - aviControllerParams := &models.AviControllerParams{ - Username: "test-user", - Password: "test-password", - Host: "10.10.10.1", - Tenant: "admin", - CAData: string("test-ca"), - } - mockClient.EXPECT().VerifyAccount(aviControllerParams).Return(false, errors.New("call avi controller api issue")).Times(1) - err := tkgClient.ValidateAviControllerAccount(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should throw error if using wrong credentials", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerAddress, "10.10.10.1") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerUsername, "test-user") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerPassword, "test-wrong-password") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerCA, "dGVzdC1jYQ==") - aviControllerParams := &models.AviControllerParams{ - Username: "test-user", - Password: "test-wrong-password", - Host: "10.10.10.1", - Tenant: "admin", - CAData: string("test-ca"), - } - mockClient.EXPECT().VerifyAccount(aviControllerParams).Return(false, nil).Times(1) - err := tkgClient.ValidateAviControllerAccount(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should pass if provide correct configurations", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerAddress, "10.10.10.1") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerUsername, "test-user") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerPassword, "test-password") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControllerCA, "dGVzdC1jYQ==") - aviControllerParams := &models.AviControllerParams{ - Username: "test-user", - Password: "test-password", - Host: "10.10.10.1", - Tenant: "admin", - CAData: string("test-ca"), - } - mockClient.EXPECT().VerifyAccount(aviControllerParams).Return(true, nil).Times(1) - err := tkgClient.ValidateAviControllerAccount(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - }) - When("validate avi cloud", func() { - It("should throw error if not set AVI_CLOUD_NAME", func() { - err := tkgClient.ValidateAviCloud(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should pass if cloud exists in avi controller", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviCloudName, "test-cloud") - mockClient.EXPECT().GetCloudByName("test-cloud").Return(nil, nil).Times(1) - err := tkgClient.ValidateAviCloud(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should throw error if cloud not exists in avi controller", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviCloudName, "test-cloud") - mockClient.EXPECT().GetCloudByName("test-cloud").Return(nil, errors.New("test-cloud is not found")).Times(1) - err := tkgClient.ValidateAviCloud(mockClient) - Expect(err).Should(HaveOccurred()) - }) - }) - When("validate avi service engine group", func() { - It("should throw error if not set AVI_SERVICE_ENGINE_GROUP", func() { - err := tkgClient.ValidateAviServiceEngineGroup(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should pass if service engine group exists in avi controller", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviServiceEngineGroup, "test-seg") - mockClient.EXPECT().GetServiceEngineGroupByName("test-seg").Return(nil, nil).Times(1) - err := tkgClient.ValidateAviServiceEngineGroup(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should throw error if service engine group not exists in avi controller", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviServiceEngineGroup, "test-seg") - mockClient.EXPECT().GetServiceEngineGroupByName("test-seg").Return(nil, errors.New("test-seg is not found")).Times(1) - err := tkgClient.ValidateAviServiceEngineGroup(mockClient) - Expect(err).Should(HaveOccurred()) - }) - }) - When("validate avi management cluster service engine group", func() { - It("should just pass if not set AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP", func() { - err := tkgClient.ValidateAviManagementClusterServiceEngineGroup(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should pass if service engine group exists in avi controller", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterServiceEngineGroup, "test-mc-seg") - mockClient.EXPECT().GetServiceEngineGroupByName("test-mc-seg").Return(nil, nil).Times(1) - err := tkgClient.ValidateAviManagementClusterServiceEngineGroup(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should throw error if service engine group not exists in avi controller", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterServiceEngineGroup, "test-mc-seg") - mockClient.EXPECT().GetServiceEngineGroupByName("test-mc-seg").Return(nil, errors.New("test-mc-seg is not found")).Times(1) - err := tkgClient.ValidateAviManagementClusterServiceEngineGroup(mockClient) - Expect(err).Should(HaveOccurred()) - }) - }) - When("validate avi data plane network", func() { - It("should throw error if not set AVI_DATA_NETWORK", func() { - err := tkgClient.ValidateAviDataPlaneNetwork(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should throw error if not set AVI_DATA_NETWORK_CIDR", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviDataPlaneNetworkName, "test-data-net") - err := tkgClient.ValidateAviDataPlaneNetwork(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should pass if data plane network exists in avi controller and cidr format is valid", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviDataPlaneNetworkName, "test-data-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviDataPlaneNetworkCIDR, "10.10.10.1/24") - mockClient.EXPECT().GetVipNetworkByName("test-data-net").Return(nil, nil).Times(1) - err := tkgClient.ValidateAviDataPlaneNetwork(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should throw error if data plane network not exists in avi controller", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviDataPlaneNetworkName, "test-data-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviDataPlaneNetworkCIDR, "10.10.10.1/24") - mockClient.EXPECT().GetVipNetworkByName("test-data-net").Return(nil, errors.New("test-data-net is not found")).Times(1) - err := tkgClient.ValidateAviDataPlaneNetwork(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should throw error if data plane network CIDR format is not valid", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviDataPlaneNetworkName, "test-data-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviDataPlaneNetworkCIDR, "10.10.10/test") - mockClient.EXPECT().GetVipNetworkByName("test-data-net").Return(nil, nil).Times(1) - err := tkgClient.ValidateAviDataPlaneNetwork(mockClient) - Expect(err).Should(HaveOccurred()) - }) - }) - When("validate avi control plane network", func() { - It("should pass if not set AVI_CONTROL_PLANE_NETWORK", func() { - err := tkgClient.ValidateAviControlPlaneNetwork(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should pass if control plane network exists in avi controller and cidr format is valid", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControlPlaneNetworkName, "test-cp-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControlPlaneNetworkCIDR, "10.10.10.1/24") - mockClient.EXPECT().GetVipNetworkByName("test-cp-net").Return(nil, nil).Times(1) - err := tkgClient.ValidateAviControlPlaneNetwork(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should throw error if control plane network not exists in avi controller", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControlPlaneNetworkName, "test-cp-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControlPlaneNetworkCIDR, "10.10.10.1/24") - mockClient.EXPECT().GetVipNetworkByName("test-cp-net").Return(nil, errors.New("test-cp-net is not found")).Times(1) - err := tkgClient.ValidateAviControlPlaneNetwork(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should throw error if control plane network CIDR format is not valid", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControlPlaneNetworkName, "test-cp-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviControlPlaneNetworkCIDR, "10.10.10/test") - mockClient.EXPECT().GetVipNetworkByName("test-cp-net").Return(nil, nil).Times(1) - err := tkgClient.ValidateAviControlPlaneNetwork(mockClient) - Expect(err).Should(HaveOccurred()) - }) - }) - When("validate avi management cluster control plane network", func() { - It("should pass if not set AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME", func() { - err := tkgClient.ValidateAviManagementClusterControlPlaneNetwork(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should pass if management cluster control plane network exists in avi controller and cidr format is valid", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkName, "test-mc-cp-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkCIDR, "10.10.10.1/24") - mockClient.EXPECT().GetVipNetworkByName("test-mc-cp-net").Return(nil, nil).Times(1) - err := tkgClient.ValidateAviManagementClusterControlPlaneNetwork(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should throw error if management cluster control plane network not exists in avi controller", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkName, "test-mc-cp-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkCIDR, "10.10.10.1/24") - mockClient.EXPECT().GetVipNetworkByName("test-mc-cp-net").Return(nil, errors.New("test-mc-cp-net is not found")).Times(1) - err := tkgClient.ValidateAviManagementClusterControlPlaneNetwork(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should throw error if management cluster control plane network CIDR format is not valid", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkName, "test-mc-cp-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkCIDR, "10.10.10/test") - mockClient.EXPECT().GetVipNetworkByName("test-mc-cp-net").Return(nil, nil).Times(1) - err := tkgClient.ValidateAviManagementClusterControlPlaneNetwork(mockClient) - Expect(err).Should(HaveOccurred()) - }) - }) - When("validate avi management cluster data plane network", func() { - It("should pass if not set AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME", func() { - err := tkgClient.ValidateAviManagementClusterDataPlaneNetwork(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should pass if management cluster data plane network exists in avi controller and cidr format is valid", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterDataPlaneNetworkName, "test-mc-data-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterDataPlaneNetworkCIDR, "10.10.10.1/24") - mockClient.EXPECT().GetVipNetworkByName("test-mc-data-net").Return(nil, nil).Times(1) - err := tkgClient.ValidateAviManagementClusterDataPlaneNetwork(mockClient) - Expect(err).ShouldNot(HaveOccurred()) - }) - It("should throw error if management cluster data plane network not exists in avi controller", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterDataPlaneNetworkName, "test-mc-data-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterDataPlaneNetworkCIDR, "10.10.10.1/24") - mockClient.EXPECT().GetVipNetworkByName("test-mc-data-net").Return(nil, errors.New("test-mc-data-net is not found")).Times(1) - err := tkgClient.ValidateAviManagementClusterDataPlaneNetwork(mockClient) - Expect(err).Should(HaveOccurred()) - }) - It("should throw error if management cluster control plane network CIDR format is not valid", func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterDataPlaneNetworkName, "test-mc-data-net") - tkgConfigReaderWriter.Set(constants.ConfigVariableAviManagementClusterDataPlaneNetworkCIDR, "10.10.10/test") - mockClient.EXPECT().GetVipNetworkByName("test-mc-data-net").Return(nil, nil).Times(1) - err := tkgClient.ValidateAviManagementClusterDataPlaneNetwork(mockClient) - Expect(err).Should(HaveOccurred()) - }) - }) - }) - - Context("ConfigureAndValidateSameClusterNameConfiguration", func() { - Context("Validate the same name when dry run", func() { - BeforeEach(func() { - initRegionOptions.GenerateOnly = true - initRegionOptions.ClusterName = "test-mc" - }) - - It("should return with no error", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("Validate the same name when actually installing", func() { - BeforeEach(func() { - initRegionOptions.GenerateOnly = false - initRegionOptions.ClusterName = "test-mc" - }) - - It("should return with error", func() { - validationError := tkgClient.ConfigureAndValidateManagementClusterConfiguration(initRegionOptions, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring(fmt.Sprintf("cluster name %s matches another management cluster", "test-mc"))) - }) - }) - }) - }) - - Context("ConfigureAndValidateWorkloadClusterConfiguration", func() { - var ( - createClusterOptions *client.CreateClusterOptions - clusterClient *fakes.ClusterClient - ) - BeforeEach(func() { - workerMachineCount := int64(3) - createClusterOptions = &client.CreateClusterOptions{ - VsphereControlPlaneEndpoint: "foo.bar", - Edition: "tkg", - ClusterConfigOptions: client.ClusterConfigOptions{ - WorkerMachineCount: &workerMachineCount, - }, - } - createClusterOptions.ProviderRepositorySource = &clusterctl.ProviderRepositorySourceOptions{ - InfrastructureProvider: "vsphere", - } - - clusterClient = &fakes.ClusterClient{} - }) - Context("IPFamily configuration and validation", func() { - Context("when IPFamily is ipv4,ipv6 i.e Dual-stack Primary IPv4", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv4,ipv6") - }) - - Context("when dual-stack-ipv4-primary feature gate is false", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedReturns(false, nil) - }) - It("returns an error", func() { - validationError := tkgClient.ConfigureAndValidateWorkloadClusterConfiguration(createClusterOptions, clusterClient, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("option TKG_IP_FAMILY is set to \"ipv4,ipv6\", but dualstack support is not enabled (because it is under development). To enable dualstack, set features.cluster.dual-stack-ipv4-primary to \"true\"")) - }) - }) - Context("when dual-stack-ipv4-primary feature gate is true", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedReturns(true, nil) - }) - It("passes validation", func() { - validationError := tkgClient.ConfigureAndValidateWorkloadClusterConfiguration(createClusterOptions, clusterClient, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - }) - Context("when IPFamily is ipv6,ipv4 i.e Dual-stack Primary IPv6", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, "ipv6,ipv4") - }) - - Context("when dual-stack-ipv6-primary feature gate is false", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedReturns(false, nil) - }) - It("returns an error", func() { - validationError := tkgClient.ConfigureAndValidateWorkloadClusterConfiguration(createClusterOptions, clusterClient, true) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("option TKG_IP_FAMILY is set to \"ipv6,ipv4\", but dualstack support is not enabled (because it is under development). To enable dualstack, set features.cluster.dual-stack-ipv6-primary to \"true\"")) - }) - }) - Context("when dual-stack-ipv6-primary feature gate is true", func() { - BeforeEach(func() { - featureFlagClient.IsConfigFeatureActivatedReturns(true, nil) - }) - It("passes validation", func() { - validationError := tkgClient.ConfigureAndValidateWorkloadClusterConfiguration(createClusterOptions, clusterClient, true) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - }) - }) - - Context("Kubevip Loadbalancer validation", func() { - var ( - clusterRole string - ) - Context("when creating management cluster", func() { - BeforeEach(func() { - clusterRole = client.TkgLabelClusterRoleManagement - }) - - Context("kubevip loadbalancer enable is true", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableKubevipLoadbalancerEnable, "true") - }) - It("returns an error", func() { - validationError := tkgClient.ValidateKubeVipLBConfiguration(clusterRole) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("is set but kubevip loadbalancer is not supported on management cluster so far")) - }) - }) - - Context("kubevip loadbalancer enable is false", func() { - Context("ip range is set", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableKubevipLoadbalancerIPRanges, "10.0.0.1-10.0.0.2") - }) - It("returns an error", func() { - validationError := tkgClient.ValidateKubeVipLBConfiguration(clusterRole) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("is set but kubevip loadbalancer is not supported on management cluster so far")) - }) - }) - Context("cidrs is set", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableKubevipLoadbalancerCIDRs, "10.0.0.1/24") - }) - It("returns an error", func() { - validationError := tkgClient.ValidateKubeVipLBConfiguration(clusterRole) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("is set but kubevip loadbalancer is not supported on management cluster so far")) - }) - }) - Context("cidrs and ip range are not set", func() { - It("pass", func() { - validationError := tkgClient.ValidateKubeVipLBConfiguration(clusterRole) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - - }) - }) - - Context("when creating workload cluster", func() { - BeforeEach(func() { - clusterRole = client.TkgLabelClusterRoleWorkload - }) - - Context("kubevip loadbalancer enable is true", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableKubevipLoadbalancerEnable, "true") - }) - Context("neither cidr or ip range are set", func() { - It("returns an error", func() { - validationError := tkgClient.ValidateKubeVipLBConfiguration(clusterRole) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("is enabled, either")) - }) - }) - Context("cidr is set", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableKubevipLoadbalancerCIDRs, "10.0.0.1/24") - }) - It("returns an error", func() { - validationError := tkgClient.ValidateKubeVipLBConfiguration(clusterRole) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - Context("ip range is set", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableKubevipLoadbalancerIPRanges, "10.0.0.1-10.0.0.2") - }) - It("returns an error", func() { - validationError := tkgClient.ValidateKubeVipLBConfiguration(clusterRole) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - - Context("ip range and cird are set", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableKubevipLoadbalancerCIDRs, "10.0.0.1/24") - tkgConfigReaderWriter.Set(constants.ConfigVariableKubevipLoadbalancerIPRanges, "10.0.0.1-10.0.0.2") - }) - It("returns an error", func() { - validationError := tkgClient.ValidateKubeVipLBConfiguration(clusterRole) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - }) - - Context("kubevip loadbalancer enable is false", func() { - Context("ip range is set", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableKubevipLoadbalancerIPRanges, "10.0.0.1-10.0.0.2") - }) - It("returns an error", func() { - validationError := tkgClient.ValidateKubeVipLBConfiguration(clusterRole) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("is disabled but")) - }) - }) - Context("cidrs is set", func() { - BeforeEach(func() { - tkgConfigReaderWriter.Set(constants.ConfigVariableKubevipLoadbalancerCIDRs, "10.0.0.1/24") - }) - It("returns an error", func() { - validationError := tkgClient.ValidateKubeVipLBConfiguration(clusterRole) - Expect(validationError).To(HaveOccurred()) - Expect(validationError.Error()).To(ContainSubstring("is disabled but")) - }) - }) - Context("cidrs and ip range are not set", func() { - It("pass", func() { - validationError := tkgClient.ValidateKubeVipLBConfiguration(clusterRole) - Expect(validationError).NotTo(HaveOccurred()) - }) - }) - - }) - }) - }) - - DescribeTable("SERVICE_CIDR size validation - invalid cases", func(ipFamily, serviceCIDR, problematicCIDR, netmaskSizeConstraint string) { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, ipFamily) - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, serviceCIDR) - - validationError := tkgClient.ConfigureAndValidateWorkloadClusterConfiguration(createClusterOptions, clusterClient, true) - Expect(validationError).To(HaveOccurred()) - expectedErrorMsg := fmt.Sprintf(`invalid SERVICE_CIDR "%s", expected netmask to be "%s" or greater`, problematicCIDR, netmaskSizeConstraint) - Expect(validationError.Error()).To(ContainSubstring(expectedErrorMsg)) - }, - Entry("ipv4 cidr too large", "ipv4", "192.168.2.1/11", "192.168.2.1/11", "/12"), - Entry("ipv6 cidr too large", "ipv6", "::1/107", "::1/107", "/108"), - Entry("ipv4-primary dualstack: ipv4 cidr too large", "ipv4,ipv6", "1.2.3.4/11,::1/108", "1.2.3.4/11", "/12"), - Entry("ipv4-primary dualstack: ipv6 cidr too large", "ipv4,ipv6", "1.2.3.4/12,::1/107", "::1/107", "/108"), - Entry("ipv6-primary dualstack: ipv6 cidr too large", "ipv6,ipv4", "::1/107,1.2.3.4/12", "::1/107", "/108"), - Entry("ipv6-primary dualstack: ipv4 cidr too large", "ipv6,ipv4", "::1/108,1.2.3.4/11", "1.2.3.4/11", "/12"), - ) - - DescribeTable("SERVICE_CIDR size validation - valid cases", func(ipFamily, serviceCIDR string) { - tkgConfigReaderWriter.Set(constants.ConfigVariableIPFamily, ipFamily) - tkgConfigReaderWriter.Set(constants.ConfigVariableServiceCIDR, serviceCIDR) - - validationError := tkgClient.ConfigureAndValidateWorkloadClusterConfiguration(createClusterOptions, clusterClient, true) - Expect(validationError).NotTo(HaveOccurred()) - }, - Entry("ipv4 cidr at max size", "ipv4", "192.168.2.1/12"), - Entry("ipv4 cidr at slightly smaller size", "ipv4", "192.168.2.1/13"), - Entry("ipv6 cidr at max size", "ipv6", "::1/108"), - Entry("ipv6 cidr at slightly smaller size", "ipv6", "::1/108"), - Entry("ipv4-primary dualstack: cidrs at max size", "ipv4,ipv6", "1.2.3.4/12,::1/108"), - Entry("ipv6-primary dualstack: cidrs at max size", "ipv6,ipv4", "::1/108,1.2.3.4/12"), - ) - }) - - Context("EncodeAzureCredentialsAndGetClient", func() { - Context("Management cluster on Azure", func() { - It("should return error when Azure credentials are not set", func() { - credentialVariales := []string{constants.ConfigVariableAzureSubscriptionID, constants.ConfigVariableAzureTenantID, constants.ConfigVariableAzureClientID, constants.ConfigVariableAzureClientSecret} - for _, credential := range credentialVariales { - os.Unsetenv(credential) - _, err := tkgConfigReaderWriter.Get(credential) - Expect(err).To(HaveOccurred()) - _, err = tkgClient.EncodeAzureCredentialsAndGetClient(nil) - Expect(err).To(HaveOccurred()) - tkgConfigReaderWriter.Set(credential, "foobar") - } - _, err = tkgClient.EncodeAzureCredentialsAndGetClient(nil) - Expect(err).NotTo(HaveOccurred()) - }) - - }) - - Context("Workload cluster on Azure", func() { - var ( - clusterClient *fakes.ClusterClient - ) - BeforeEach(func() { - os.Setenv(constants.ConfigVariableNamespace, "default") - clusterClient = &fakes.ClusterClient{} - }) - AfterEach(func() { - os.Unsetenv(constants.ConfigVariableNamespace) - }) - It("should return credentials from bootstrap secret", func() { - clusterClient.GetAzureCredentialsFromSecretStub = func() (azure.Credentials, error) { - creds := azure.Credentials{ - SubscriptionID: "foo-subscriptionID", - ClientID: "foo-clientID", - ClientSecret: "foo-clientSecret", - TenantID: "foo-tenantID", - } - return creds, nil - } - _, err := tkgConfigReaderWriter.Get(constants.ConfigVariableAzureIdentityName) - Expect(err).To(HaveOccurred()) - _, err = tkgClient.EncodeAzureCredentialsAndGetClient(clusterClient) - Expect(err).NotTo(HaveOccurred()) - }) - - It("should return credentials from AzureClusterIdentity", func() { - clusterClient.GetAzureCredentialsFromIdentityStub = func(identityName, identityNamepace string) (azure.Credentials, error) { - creds := azure.Credentials{ - SubscriptionID: "foo-subscriptionID", - ClientID: "foo-clientID", - ClientSecret: "foo-clientSecret", - TenantID: "foo-tenantID", - } - return creds, nil - } - os.Unsetenv(constants.ConfigVariableAzureSubscriptionID) - tkgConfigReaderWriter.Set(constants.ConfigVariableAzureIdentityName, "foo-identity") - _, err := tkgConfigReaderWriter.Get(constants.ConfigVariableAzureSubscriptionID) - Expect(err.Error()).To(ContainSubstring("AZURE_SUBSCRIPTION_ID")) - tkgConfigReaderWriter.Set(constants.ConfigVariableAzureSubscriptionID, "foo-subscriptionID") - _, err = tkgClient.EncodeAzureCredentialsAndGetClient(clusterClient) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - }) -}) - -var _ = Describe("Cluster Name Validation", func() { - var ( - infrastructureProvider string - err error - ) - Context("Azure Cluster", func() { - BeforeEach(func() { - infrastructureProvider = "azure" - }) - When("cluster name starts with lowercase alpha and is less than 45 characters", func() { - It("should validate successfully", func() { - err = client.CheckClusterNameFormat("azure-test-cluster", infrastructureProvider) - Expect(err).NotTo(HaveOccurred()) - }) - }) - When("cluster name does not start with lowercase alpha and is more than 44 characters", func() { - It("should throw an error", func() { - err = client.CheckClusterNameFormat("1-azure-test-cluster-with-a-really-long-name-that-is-excessive", infrastructureProvider) - Expect(err).To(HaveOccurred()) - }) - }) - }) - Context("AWS/vSphere Cluster", func() { - BeforeEach(func() { - infrastructureProvider = "aws" - }) - When("cluster name starts with lowercase alphanumeric and is less than 64 characters", func() { - It("should validate successfully", func() { - err = client.CheckClusterNameFormat("1aws-test-cluster", infrastructureProvider) - Expect(err).NotTo(HaveOccurred()) - }) - }) - When("cluster name does not start with lowercase alphanumeric and is more than 63 characters", func() { - It("should throw an error", func() { - err = client.CheckClusterNameFormat("-aws-test-cluster-with-a-really-long-name-that-is-excessive-and-still-needs-to-be-longer", infrastructureProvider) - Expect(err).To(HaveOccurred()) - }) - }) - }) -}) diff --git a/tkg/client/validate_upgrade.go b/tkg/client/validate_upgrade.go deleted file mode 100644 index 1f6c909ab9..0000000000 --- a/tkg/client/validate_upgrade.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "fmt" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -var ( - azureVarsToBeValidated = []string{constants.ConfigVariableAzureClientSecret} -) - -// ValidateEnvVariables validates the presence of required environment variables for a given IaaS -func (c *TkgClient) ValidateEnvVariables(iaas string) error { - // This function only contains a validator for Azure environment variables for now - // This function can be used to add validators for environment variables pertaining to other IaaSes in the future - // as and when required - if iaas == AzureProviderName { - return c.validateAzureEnvVariables(azureVarsToBeValidated) - } - return nil -} - -func (c *TkgClient) validateAzureEnvVariables(azureEnvVars []string) error { - for _, envVar := range azureEnvVars { - _, err := c.TKGConfigReaderWriter().Get(envVar) - if err != nil { - return fmt.Errorf("config Variable %s not set", envVar) - } - } - return nil -} diff --git a/tkg/client/validate_upgrade_test.go b/tkg/client/validate_upgrade_test.go deleted file mode 100644 index d8c0a16e6c..0000000000 --- a/tkg/client/validate_upgrade_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - - "os" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" -) - -var _ = Describe("Validate", func() { - var ( - tkgClient *client.TkgClient - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - featureFlagClient *fakes.FeatureFlagClient - ) - BeforeEach(func() { - tkgBomClient := new(fakes.TKGConfigBomClient) - tkgBomClient.GetDefaultTkrBOMConfigurationReturns(&tkgconfigbom.BOMConfiguration{ - Release: &tkgconfigbom.ReleaseInfo{Version: "v1.3"}, - Components: map[string][]*tkgconfigbom.ComponentInfo{ - "kubernetes": {{Version: "v1.20"}}, - }, - }, nil) - tkgBomClient.GetDefaultTkgBOMConfigurationReturns(&tkgconfigbom.BOMConfiguration{ - Release: &tkgconfigbom.ReleaseInfo{Version: "v1.23"}, - }, nil) - - configDir := os.TempDir() - - configFile, err := os.CreateTemp(configDir, "cluster-config-*.yaml") - Expect(err).NotTo(HaveOccurred()) - Expect(configFile.Sync()).To(Succeed()) - Expect(configFile.Close()).To(Succeed()) - - tkgConfigReaderWriter, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configFile.Name(), configFile.Name()) - Expect(err).NotTo(HaveOccurred()) - readerWriter, err := tkgconfigreaderwriter.NewWithReaderWriter(tkgConfigReaderWriter) - Expect(err).NotTo(HaveOccurred()) - - tkgConfigUpdater := new(fakes.TKGConfigUpdaterClient) - tkgConfigUpdater.CheckInfrastructureVersionStub = func(providerName string) (string, error) { - return providerName, nil - } - - featureFlagClient = &fakes.FeatureFlagClient{} - featureFlagClient.IsConfigFeatureActivatedReturns(true, nil) - - options := client.Options{ - ReaderWriterConfigClient: readerWriter, - TKGConfigUpdater: tkgConfigUpdater, - TKGBomClient: tkgBomClient, - RegionManager: new(fakes.RegionManager), - FeatureFlagClient: featureFlagClient, - } - tkgClient, err = client.New(options) - Expect(err).NotTo(HaveOccurred()) - }) - Context("Validate presence of Azure env variables during upgrade", func() { - It("Azure client secret has not been set", func() { - err := os.Unsetenv(constants.ConfigVariableAzureClientSecret) - Expect(err).ToNot(HaveOccurred()) - - err = tkgClient.ValidateEnvVariables(client.AzureProviderName) - Expect(err).To(HaveOccurred()) - }) - It("Azure client secret has been set", func() { - tkgClient.TKGConfigReaderWriter().Set(constants.ConfigVariableAzureClientSecret, "foo-bar") - err := tkgClient.ValidateEnvVariables(client.AzureProviderName) - Expect(err).NotTo(HaveOccurred()) - }) - It("IaaS is AWS. This is a no-op currently", func() { - err := tkgClient.ValidateEnvVariables(client.AWSProviderName) - Expect(err).NotTo(HaveOccurred()) - }) - }) -}) diff --git a/tkg/client/workload_cluster.go b/tkg/client/workload_cluster.go deleted file mode 100644 index 6347c2c875..0000000000 --- a/tkg/client/workload_cluster.go +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package client - -import ( - "path/filepath" - "time" - - "github.com/pkg/errors" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/client-go/tools/clientcmd" - addonsv1 "sigs.k8s.io/cluster-api/exp/addons/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -// GetWorkloadClusterCredentialsOptions contains options supported by GetWorkloadClusterCredntials -type GetWorkloadClusterCredentialsOptions struct { - ClusterName string - Namespace string - ExportFile string -} - -// DeleteWorkloadClusterOptions contains options supported by DeleteWorkloadCluster -type DeleteWorkloadClusterOptions struct { - ClusterName string - Namespace string -} - -// GetWorkloadClusterCredentials gets and saves workload cluster credentials -func (c *TkgClient) GetWorkloadClusterCredentials(options GetWorkloadClusterCredentialsOptions) (string, string, error) { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return "", "", errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - clusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return "", "", errors.Wrap(err, "unable to get cluster client while getting workload cluster credentials") - } - - log.V(3).Infof("Retrieving credentials for workload cluster %s \n", options.ClusterName) - if options.Namespace == "" { - options.Namespace = constants.DefaultNamespace - } - lock, err := utils.GetFileLockWithTimeOut(filepath.Join(c.tkgConfigDir, constants.LocalTanzuFileLock), utils.DefaultLockTimeout) - if err != nil { - return "", "", errors.Wrap(err, "cannot acquire lock for merging workload cluster kubeconfig") - } - - defer func() { - if err := lock.Unlock(); err != nil { - log.Warningf("cannot release lock for merging workload cluster kubeconfig, reason: %v", err) - } - }() - getKubeconfigPollOptions := &clusterclient.PollOptions{Interval: time.Second, Timeout: 3 * time.Second} - kubeconfig, err := clusterClient.GetKubeConfigForCluster(options.ClusterName, options.Namespace, getKubeconfigPollOptions) - if err != nil { - return "", "", errors.Wrap(err, "unable to get cluster kubeconfig. Make sure the cluster name and namespace is correct") - } - - log.V(3).Infof("Merging credentials into kubeconfig file %s \n", clusterClient.GetCurrentKubeconfigFile()) - err = MergeKubeConfigWithoutSwitchContext(kubeconfig, options.ExportFile) - if err != nil { - return "", "", errors.Wrap(err, "unable to merge cluster kubeconfig into the current kubeconfig path") - } - - newConfig, err := clientcmd.Load(kubeconfig) - if err != nil { - return "", "", errors.Wrap(err, "unable to get context from kubeconfig") - } - - if options.ExportFile != "" { - return newConfig.CurrentContext, options.ExportFile, nil - } - - return newConfig.CurrentContext, "", nil -} - -// DeleteWorkloadCluster deletes workload cluster -func (c *TkgClient) DeleteWorkloadCluster(options DeleteWorkloadClusterOptions) error { - currentRegion, err := c.GetCurrentRegionContext() - if err != nil { - return errors.Wrap(err, "cannot get current management cluster context") - } - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - } - clusterClient, err := clusterclient.NewClient(currentRegion.SourceFilePath, currentRegion.ContextName, clusterclientOptions) - if err != nil { - return errors.Wrap(err, "unable to get cluster client while deleting cluster") - } - - if options.Namespace == "" { - options.Namespace = constants.DefaultNamespace - } - - isPacific, err := clusterClient.IsPacificRegionalCluster() - if err == nil && !isPacific { - err = deleteAutoscalerDeploymentIfPresent(clusterClient, options.ClusterName, options.Namespace) - if err != nil { - log.Warningf("failed to delete autoscaler resources from management cluster, reason: %v", err) - } - - err = deleteCRSObjectsIfPresent(clusterClient, options.ClusterName, options.Namespace) - if err != nil { - log.Warningf("failed to delete ClusterResourceSet objects from management cluster, reason: %v", err) - } - } - - return clusterClient.DeleteCluster(options.ClusterName, options.Namespace) -} - -func deleteAutoscalerDeploymentIfPresent(clusterClient clusterclient.Client, clusterName, namespace string) error { - var autoScalerDeployment appsv1.Deployment - autoScalerDeploymentName := clusterName + "-cluster-autoscaler" - err := clusterClient.GetResource(&autoScalerDeployment, autoScalerDeploymentName, namespace, nil, nil) - if err != nil && apierrors.IsNotFound(err) { - log.V(4).Infof("autoscaler deployment '%s' is not present on the management cluster", autoScalerDeploymentName) - return nil - } - if err != nil { - return errors.Wrapf(err, "failed to retrieve the autoscaler deployment '%s' from management cluster", autoScalerDeploymentName) - } - - err = clusterClient.DeleteResource(&autoScalerDeployment) - if err != nil { - return errors.Wrapf(err, "failed to delete autoscaler deployment '%s' from management cluster", autoScalerDeploymentName) - } - - // delete service account - autoScalerServiceAccount := &corev1.ServiceAccount{} - autoScalerServiceAccountName := clusterName + "-autoscaler" - autoScalerServiceAccount.Name = autoScalerServiceAccountName - autoScalerServiceAccount.Namespace = namespace - - err = clusterClient.DeleteResource(autoScalerServiceAccount) - if err != nil { - return errors.Wrapf(err, "failed to delete autoscaler serviceaccount '%s' from management cluster", autoScalerServiceAccountName) - } - - // delete clusterrolebinding - autoScalerManagementRoleBinding := &rbacv1.ClusterRoleBinding{} - autoScalerManagementRoleBindingName := clusterName + "-autoscaler-management" - autoScalerManagementRoleBinding.Name = autoScalerManagementRoleBindingName - - err = clusterClient.DeleteResource(autoScalerManagementRoleBinding) - if err != nil { - return errors.Wrapf(err, "failed to delete autoscaler clusterrolebinding '%s' from management cluster", autoScalerManagementRoleBindingName) - } - - autoScalerWorkloadRoleBinding := &rbacv1.ClusterRoleBinding{} - autoScalerWorkloadRoleBindingName := clusterName + "-autoscaler-workload" - autoScalerWorkloadRoleBinding.Name = autoScalerWorkloadRoleBindingName - - err = clusterClient.DeleteResource(autoScalerWorkloadRoleBinding) - if err != nil { - return errors.Wrapf(err, "failed to delete autoscaler clusterrolebinding '%s' from management cluster", autoScalerWorkloadRoleBindingName) - } - - log.Infof("successfully deleted autoscaler resources from management cluster") - return nil -} - -func deleteCRSObjectsIfPresent(clusterClient clusterclient.Client, clusterName, namespace string) error { - clusterResourceSetList := &addonsv1.ClusterResourceSetList{} - // Get list of all CRS objects for the cluster - err := clusterClient.GetResourceList(clusterResourceSetList, clusterName, namespace, nil, nil) - if err != nil { - return errors.Wrap(err, "unable to get list of ClusterResourceSet for the cluster while deleting CRS objects") - } - - // Deletes CRS objects for the cluster one by one - errorList := []error{} - for i := range clusterResourceSetList.Items { - err = clusterClient.DeleteResource(clusterResourceSetList.Items[i].DeepCopy()) - if err != nil { - errorList = append(errorList, errors.Wrapf(err, "unable to delete ClusterResourceSet '%s'", clusterResourceSetList.Items[i].Name)) - } - } - - // Throw error if any - if len(errorList) > 0 { - return kerrors.NewAggregate(errorList) - } - - log.V(3).Infof("successfully deleted ClusterResourceSet objects associated with cluster '%s'", clusterName) - return nil -} diff --git a/tkg/clientcreator/creator.go b/tkg/clientcreator/creator.go deleted file mode 100644 index a5002c5887..0000000000 --- a/tkg/clientcreator/creator.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package clientcreator defines functions to create clients. -package clientcreator - -import ( - "github.com/pkg/errors" - clusterctl "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/features" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigproviders" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigupdater" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" -) - -// Clients is a combination structure of clients -type Clients struct { - ClusterCtlClient clusterctl.Client - ConfigClient tkgconfigreaderwriter.Client - RegionManager region.Manager - FeaturesClient features.Client - TKGConfigProvidersClient tkgconfigproviders.Client - TKGBomClient tkgconfigbom.Client - TKGConfigUpdaterClient tkgconfigupdater.Client - TKGConfigPathsClient tkgconfigpaths.Client - FeatureFlagClient *configapi.ClientConfig -} - -// CreateAllClients creates all clients and returns Clients struct -func CreateAllClients(appConfig types.AppConfig, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) (Clients, error) { - var err error - tkgConfigPathsClient := tkgconfigpaths.New(appConfig.TKGConfigDir) - - tkgConfigFile := appConfig.TKGSettingsFile - if tkgConfigFile == "" { - tkgConfigFile, err = tkgConfigPathsClient.GetTKGConfigPath() - if err != nil { - return Clients{}, err - } - } - - // Create tkg configuration client, reads tkg and cluster configuration - // file and sets configuration values to viper store - var configClient tkgconfigreaderwriter.Client - if tkgConfigReaderWriter == nil { - configClient, err = tkgconfigreaderwriter.New(tkgConfigFile) - } else { - configClient, err = tkgconfigreaderwriter.NewWithReaderWriter(tkgConfigReaderWriter) - } - if err != nil { - return Clients{}, errors.Wrap(err, "unable to create tkg config Client") - } - - tkgConfigUpdaterClient := tkgconfigupdater.New(appConfig.TKGConfigDir, appConfig.ProviderGetter, configClient.TKGConfigReaderWriter()) - tkgBomClient := tkgconfigbom.New(appConfig.TKGConfigDir, configClient.TKGConfigReaderWriter()) - tkgConfigProvidersClient := tkgconfigproviders.New(appConfig.TKGConfigDir, configClient.TKGConfigReaderWriter()) - - // Create clusterctl client - clusterctlClient, err := clusterctl.New("", clusterctl.InjectConfig(configClient.ClusterConfigClient())) - if err != nil { - return Clients{}, errors.Wrap(err, "unable to initialize clusterctl client with config path") - } - - regionManager, err := appConfig.CustomizerOptions.RegionManagerFactory.CreateManager(tkgConfigFile) - if err != nil { - return Clients{}, errors.Wrap(err, "unable to initialize management cluster manager with config path") - } - - // create new features client, defaults config file path to ~/.tkg/features.yaml - // This client is used to activate/deactivate features based on this features.yaml file - featuresClient, err := features.New(appConfig.TKGConfigDir, "") - if err != nil { - return Clients{}, errors.Wrap(err, "failed to create features client") - } - - featureFlagClient, err := config.GetClientConfig() - if err != nil { - return Clients{}, errors.Wrap(err, "failed to get client config") - } - - return Clients{ - ClusterCtlClient: clusterctlClient, - ConfigClient: configClient, - FeaturesClient: featuresClient, - RegionManager: regionManager, - TKGBomClient: tkgBomClient, - TKGConfigProvidersClient: tkgConfigProvidersClient, - TKGConfigUpdaterClient: tkgConfigUpdaterClient, - TKGConfigPathsClient: tkgConfigPathsClient, - FeatureFlagClient: featureFlagClient, - }, nil -} diff --git a/tkg/clusterclient/clusterclient.go b/tkg/clusterclient/clusterclient.go deleted file mode 100644 index b206a6272a..0000000000 --- a/tkg/clusterclient/clusterclient.go +++ /dev/null @@ -1,3059 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package clusterclient implements generic functions for talking to cluster -package clusterclient - -import ( - "context" - "encoding/json" - "fmt" - "os" - "os/exec" - "reflect" - "regexp" - sysrt "runtime" - "sort" - "strconv" - "strings" - "time" - - dockerclient "github.com/docker/docker/client" - "github.com/imdario/mergo" - "github.com/pkg/errors" - "github.com/yalp/jsonpath" - "gopkg.in/yaml.v3" - appsv1 "k8s.io/api/apps/v1" - batchv1 "k8s.io/api/batch/v1" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - extensionsV1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/selection" - "k8s.io/apimachinery/pkg/types" - kerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/client-go/discovery" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - "k8s.io/client-go/util/retry" - capav1beta2 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" - capzv1beta1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capiv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - "sigs.k8s.io/cluster-api/cmd/clusterctl/client/cluster" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - addonsv1 "sigs.k8s.io/cluster-api/exp/addons/api/v1beta1" - capiexp "sigs.k8s.io/cluster-api/exp/api/v1beta1" - capdv1 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta1" - "sigs.k8s.io/cluster-api/util/conditions" - containerutil "sigs.k8s.io/cluster-api/util/container" - "sigs.k8s.io/cluster-api/util/patch" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/apiutil" - - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - cliv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - configv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/config/v1alpha1" - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - capdiscovery "github.com/vmware-tanzu/tanzu-framework/capabilities/client/pkg/discovery" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - tmcv1alpha1 "github.com/vmware-tanzu/tanzu-framework/tkg/api/tmc/v1alpha1" - azureclient "github.com/vmware-tanzu/tanzu-framework/tkg/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/docker" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - telemetrymanifests "github.com/vmware-tanzu/tanzu-framework/tkg/manifest/telemetry" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" - tkrconstants "github.com/vmware-tanzu/tanzu-framework/tkr/controller/tkr-source/constants" -) - -const ( - kubectlApplyRetryTimeout = 30 * time.Second - kubectlApplyRetryInterval = 5 * time.Second - kubectlApplyLastAppliedAnnotation = "kubectl.kubernetes.io/last-applied-configuration" - waitPeriodBeforePollingForUpgradeStatus = 60 * time.Second - ErrUnableToGetPackage = "unable to get the package: '%s' in namespace: '%s'" -) - -var ( - // Sleep implements time.Sleep and used indirectly to mock for unit tests - Sleep = time.Sleep -) - -// Client provides various aspects of interaction with a Kubernetes cluster provisioned by TKG -// -//go:generate counterfeiter -o ../fakes/clusterclient.go --fake-name ClusterClient . Client -type Client interface { - // MergeAndUseConfig takes a kubeconfig as a string, merges it into the client's kubeconfig - // path, and return current and previous kube contexts. The current context is also updated in said - // path to use the new context added. This allows other client-side tools like kubectl, and - // octant to interact with the cluster associated with the context without additional configuration. - MergeAndUseConfigForCluster(kubeConfig []byte, overrideContextName string) (string, string, error) - - // MergeConfigForCluster merges a kubeconfig into the client's kubeconfig path. - MergeConfigForCluster(kubeConfig []byte, mergeFile string) error - - // Apply applies a yaml string to a cluster - Apply(string) error - // ApplyFile runs kubectl apply on a file/url every `interval` until it succeeds or a timeout is reached. - ApplyFile(string) error - // ApplyFileRecursively runs kubectl apply recursively in certain namespace on a dir/url every `interval` until it succeeds or a timeout is reached. - ApplyFileRecursively(string, string) error - // WaitForClusterInitialized waits for a cluster to be initialized so the kubeconfig file can be fetched - WaitForClusterInitialized(clusterName string, namespace string) error - // WaitForControlPlaneAvailable wait for cluster API server is ready to receive requests - WaitForControlPlaneAvailable(clusterName string, namespace string) error - // WaitForClusterReady for a cluster to be fully provisioned and so ready to be moved - // If checkReplicas is true, will also ensure that the number of ready - // replicas matches the expected number in the cluster's spec - WaitForClusterReady(clusterName string, namespace string, checkReplicas bool) error - // WaitForClusterDeletion waits for cluster object to be deleted - WaitForClusterDeletion(clusterName string, namespace string) error - // WaitForDeployment for a deployment to be fully available - WaitForDeployment(deploymentName string, namespace string) error - // WaitForAutoscalerDeployment waits for the autoscaler deployment to be available - WaitForAutoscalerDeployment(deploymentName string, namespace string) error - // ApplyPatchForAutoScalerDeployment update autoscaler by patch image - ApplyPatchForAutoScalerDeployment(tkgBomClient tkgconfigbom.Client, clusterName string, k8sVersion string, namespace string) error - // WaitForAVIResourceCleanUp waits for the avi resource clean up finished - WaitForAVIResourceCleanUp(statefulSetName, namespace string) error - // WaitForPackageInstall waits for the package to be installed successfully - WaitForPackageInstall(packageName, namespace string, packageInstallTimeout time.Duration) error - // WaitK8sVersionUpdateForCPNodes waits for k8s version to be updated - WaitK8sVersionUpdateForCPNodes(clusterName, namespace, kubernetesVersion string, workloadClusterClient Client) error - // WaitK8sVersionUpdateForWorkerNodes waits for k8s version to be updated in all worker nodes - WaitK8sVersionUpdateForWorkerNodes(clusterName, namespace, kubernetesVersion string, workloadClusterClient Client) error - // GetKubeConfigForCluster returns the admin kube config for accessing the cluster - GetKubeConfigForCluster(clusterName string, namespace string, pollOptions *PollOptions) ([]byte, error) - // GetPackage returns the package for given package name in a given namespace - GetPackage(carvelPkgName, carvelPkgNamespace string) (*kapppkgv1alpha1.Package, error) - // GetSecretValue returns the value for a given key in a Secret - GetSecretValue(secretName, key, namespace string, pollOptions *PollOptions) ([]byte, error) - // GetCurrentNamespace returns the namespace from the current context in the kubeconfig file - GetCurrentNamespace() (string, error) - // CreateNamespace creates namespace if missing - CreateNamespace(name string) error - // UseContext updates current-context in the kubeconfig file - // also updates the clientset of clusterclient to point to correct cluster - UseContext(contextName string) error - - // GetResource gets the kubernetes resource passed as reference either directly or with polling mechanism - // resourceReference is a reference to resource struct you want to retrieve - // resourceName is name of the resource to get - // namespace is namespace in which the resource to be searched, if empty current namespace will be used - // postVerify verifies the resource with some state once it is retrieved from kubernetes, pass nil if nothing to verify - // pollOptions use this if you want to continuously poll for object if error occurs, pass nil if don't want polling - // Note: Make sure resource you are retrieving is added into Scheme with init function below - GetResource(resourceReference interface{}, resourceName, namespace string, postVerify PostVerifyrFunc, pollOptions *PollOptions) error - // GetResourceList gets the list kubernetes resources passed as reference either directly or with polling mechanism - // resourceReference is a reference to resource struct you want to retrieve - // resourceName is name of the resource to get - // namespace is namespace in which the resource to be searched, if empty current namespace will be used - // postVerify verifies the resource with some state once it is retrieved from kubernetes, pass nil if nothing to verify - // pollOptions use this if you want to continuously poll for object if error occurs, pass nil if don't want polling - // Note: Make sure resource you are retrieving is added into Scheme with init function below - GetResourceList(resourceReference interface{}, clusterName, namespace string, postVerify PostVerifyListrFunc, pollOptions *PollOptions) error - - // ListResources lists the kubernetes resources, pass reference of the object you want to get - // Note: Make sure resource you are retrieving is added into Scheme in init function below - ListResources(resourceReference interface{}, option ...crtclient.ListOption) error - // DeleteResource deletes the kubernetes resource, pass reference of the object you want to delete - DeleteResource(resourceReference interface{}) error - // PatchResource patches the kubernetes resource with procide patch string - // resourceReference is a reference to resource struct you want to retrieve - // resourceName is name of the resource to patch - // namespace is namespace in which the resource to be searched, if empty current namespace will be used - // patchJSONString is string representation of json of resource configuration - // pollOptions use this if you want to continuously poll and patch the object if error occurs, pass nil if don't want polling - PatchResource(resourceReference interface{}, resourceName, namespace, patchJSONString string, patchType types.PatchType, pollOptions *PollOptions) error - // CreateResource creates the kubernetes resource - // resourceReference is a reference to resource struct you want to create - // resourceName is name of the resource to create - // namespace is namespace in which the resource to be created, if empty current namespace will be used - // opts is options for resource creation - CreateResource(resourceReference interface{}, resourceName, namespace string, opts ...crtclient.CreateOption) error - // UpdateResource updates the kubernetes resource - // resourceReference is a reference to resource struct you want to create - // resourceName is name of the resource to create - // namespace is namespace in which the resource to be created, if empty current namespace will be used - // opts is options for resource creation - UpdateResource(resourceReference interface{}, resourceName, namespace string, opts ...crtclient.UpdateOption) error - // UpdateResourceWithPolling wraps the UpdateResource function and allows the caller to retry the function until it succeeds - UpdateResourceWithPolling(resourceReference interface{}, resourceName, namespace string, pollOptions *PollOptions, opts ...crtclient.UpdateOption) error - // ExportCurrentKubeconfigToFile saves the current kubeconfig to temporary file and returns the file - ExportCurrentKubeconfigToFile() (string, error) - // GetCurrentKubeconfigFile returns currently used kubeconfig file path based on default loading rules - GetCurrentKubeconfigFile() string - // GetCurrentClusterName returns the current clusterName based on current context from kubeconfig file - // If context parameter is not empty, then return clusterName corresponding to the context - GetCurrentClusterName(context string) (string, error) - // GetCurrentKubeContext returns the current kube context - GetCurrentKubeContext() (string, error) - // IsRegionalCluster() checks if the current kube context point to a management cluster - IsRegionalCluster() error - // GetRegionalClusterDefaultProviderName returns the default provider name of provider type - GetRegionalClusterDefaultProviderName(providerType clusterctlv1.ProviderType) (string, error) - // ListClusters lists workload cluster managed by a management cluster in a given namespace - ListClusters(namespace string) ([]capi.Cluster, error) - // DeleteCluster deletes cluster in the given namespace - DeleteCluster(clusterName string, namespace string) error - // GetKubernetesVersion gets kubernetes server version for a given cluster - GetKubernetesVersion() (string, error) - // GetDeployment gets deployment object in the specified namespace - GetDeployment(deploymentName string, namespace string) (appsv1.Deployment, error) - // GetMDObjectForCluster gets machine deployment object of worker nodes for cluster - GetMDObjectForCluster(clusterName string, namespace string) ([]capi.MachineDeployment, error) - // GetClusterControlPlaneNodeObject gets cluster control plane node for cluster - GetKCPObjectForCluster(clusterName string, namespace string) (*controlplanev1.KubeadmControlPlane, error) - // GetMachineObjectsForCluster gets control-plane machine and worker machine lists for cluster - GetMachineObjectsForCluster(clusterName string, namespace string) (map[string]capi.Machine, map[string]capi.Machine, error) - // UpdateReplicas updates the replica count for the given resource - UpdateReplicas(resourceReference interface{}, resourceName, resourceNameSpace string, replicaCount int32) error - // IsPacificRegionalCluster checks if the cluster pointed to by kubeconfig is Pacific management cluster(supervisor) - IsPacificRegionalCluster() (bool, error) - // GetPacificClusterObject gets Pacific cluster object - GetPacificClusterObject(clusterName, namespace string) (*tkgsv1alpha2.TanzuKubernetesCluster, error) - // WaitForPacificCluster waits for the Vsphere-pacific provider workload cluster to be fully provisioned - WaitForPacificCluster(clusterName string, namespace string) error - // ListPacificClusterObjects returns TanzuKubernetesClusterList object - ListPacificClusterObjects(apiVersion string, listOptions *crtclient.ListOptions) ([]interface{}, error) - // ScalePacificClusterControlPlane scales Pacific workload cluster control plane - ScalePacificClusterControlPlane(clusterName, namespace string, controlPlaneCount int32) error - // ScalePacificClusterWorkerNodes scales Pacific workload cluster worker nodes - ScalePacificClusterWorkerNodes(clusterName, namespace string, workersCount int32) error - // LoadCurrentKubeconfigBytes returns the current kubeconfig with current regional context in bytes - LoadCurrentKubeconfigBytes() ([]byte, error) - - // CloneWithTimeout returns a new client with the same attributes of the current one except for get client timeout settings - CloneWithTimeout(getClientTimeout time.Duration) Client - // GetVCClientAndDataCenter returns vsphere client and datacenter name by reading on cluster resources - GetVCClientAndDataCenter(clusterName, clusterNamespace, vsphereMachineTemplateObjectName string, vcClientFactory vc.VcClientFactory) (vc.Client, string, error) - // PatchK8SVersionToPacificCluster patches the Pacific TKC object to update the k8s version on the cluster - PatchK8SVersionToPacificCluster(clusterName, namespace string, kubernetesVersion string) error - // WaitForPacificClusterK8sVersionUpdate waits for the Pacific TKC cluster to update k8s version - WaitForPacificClusterK8sVersionUpdate(clusterName, namespace, kubernetesVersion string) error - // PatchClusterWithOperationStartedStatus applies patch to cluster objects annotations - // with operation status information which includes type of operation, start time and timeout - // This information along with operation last observed timestamp will be used to determine - // stalled state of the cluster - PatchClusterWithOperationStartedStatus(clusterName, namespace, operationType string, timeout time.Duration) error - // PatchClusterObjectWithTKGVersion applies patch to cluster objects based on given tkgVersion string - PatchClusterObjectWithTKGVersion(clusterName, clusterNamespace, tkgVersion string) error - // PatchClusterObjectAnnotations applies patch to cluster objects to update annotation with specified key:value - PatchClusterObjectAnnotations(clusterName, namespace, key, value string) error - // GetManagementClusterTKGVersion returns the TKG version of a management cluster based on the - // annotation value present in cluster object - GetManagementClusterTKGVersion(mgmtClusterName, clusterNamespace string) (string, error) - // PatchCalicoNodeDaemonSetWithNewNodeSelector patches calico daemonset with new nodeSelector - PatchCalicoNodeDaemonSetWithNewNodeSelector(selectorKey, selectorValue string) error - // PatchCalicoKubeControllerDeploymentWithNewNodeSelector patches calico-kube-controller deployment with new nodeSelector - PatchCalicoKubeControllerDeploymentWithNewNodeSelector(selectorKey, selectorValue string) error - // PatchImageRepositoryInKubeProxyDaemonSet updates kubeproxy daemonset with new/custom image repository - PatchImageRepositoryInKubeProxyDaemonSet(newImageRepository string) error - // PatchKappControllerLastAppliedAnnotation ensures the kapp-controller deployment on the cluster has last-applied annotation - PatchKappControllerLastAppliedAnnotation(namespace string) error - // PatchClusterAPIAWSControllersToUseEC2Credentials ensures that the Cluster API Provider AWS - // controller is pinned to control plane nodes and is running without static credentials such - // that Cluster API AWS runs using the EC2 instance profile attached to the control plane node. - // This is done by zeroing out the credentials secret for CAPA, causing the AWS SDK to fall back - // to the default credential provider chain. We additionally patch the deployment to ensure - // the controller has node affinity to only run on the control plane nodes. - // This should NOT be used when running Cluster API Provider AWS on managed control planes, e.g. EKS - PatchClusterAPIAWSControllersToUseEC2Credentials() error - // PatchCoreDNSImageRepositoryInKubeadmConfigMap updates kubeadm-config configMap with new/custom image repository - PatchCoreDNSImageRepositoryInKubeadmConfigMap(newImageRepository string) error - // PatchClusterObjectWithOptionalMetadata applies patch to cluster objects based on given optional metadata - // under the key provided as metadataKey (e.g. annotations, labels) where the value is in the form of a - // map[string]string (e.g. [Description]some-description) where the key is the name of the metadata property. - PatchClusterObjectWithOptionalMetadata(clusterName, clusterNamespace, metadataKey string, metadata map[string]string) (string, error) - // PatchClusterObject patches cluster object with specified json patch - PatchClusterObject(clusterName, clusterNamespace string, patchJSONString string) error - // PatchClusterObject patches cluster object with specified json patch with poll options - PatchClusterObjectWithPollOptions(clusterName, clusterNamespace, patchJSONString string, pollOptions *PollOptions) error - // DeleteExistingKappController deletes the kapp-controller that already exists in the cluster. - DeleteExistingKappController() error - // UpdateAWSCNIIngressRules updates the cniIngressRules field for the AWSCluster resource. - UpdateAWSCNIIngressRules(clusterName, clusterNamespace string, newRule capav1beta2.CNIIngressRule) error - // AddCEIPTelemetryJob creates telemetry cronjob component on cluster - AddCEIPTelemetryJob(clusterName, providerName string, bomConfig *tkgconfigbom.BOMConfiguration, isProd, labels, httpProxy, httpsProxy, noProxy string) error - // RemoveCEIPTelemetryJob deletes telemetry cronjob component on cluster - RemoveCEIPTelemetryJob(clusterName string) error - // HasCEIPTelemetryJob checks if telemetry cronjob component is on cluster - HasCEIPTelemetryJob(clusterName string) (bool, error) - // GetPacificTKCAPIVersion gets the Pacific TKC API version - GetPacificTKCAPIVersion() (string, error) - // GetPacificTanzuKubernetesReleases returns the list of TanzuKubernetesRelease versions if TKr object is available in TKGS - GetPacificTanzuKubernetesReleases() ([]string, error) - // GetVCCredentialsFromSecret gets the vSphere username and password used to deploy the cluster - // Deprecated: use GetVCCredentialsFromCluster() method instead which would use both clustername and namespace to get the VC credentials - GetVCCredentialsFromSecret(string) (string, string, error) - // GetVCCredentialsFromCluster gets the vSphere username and password used to deploy the cluster - GetVCCredentialsFromCluster(string, string) (string, string, error) - // GetVCServer gets the vSphere server that used to deploy the cluster - GetVCServer() (string, error) - // GetAWSEncodedCredentialsFromSecret gets the AWS base64 credentials used to deploy the cluster - GetAWSCredentialsFromSecret() (string, error) - // GetAzureCredentialsFromSecret gets the Azure base64 credentials used to deploy the cluster - GetAzureCredentialsFromSecret() (azureclient.Credentials, error) - // GetAzureCredentialsFromIdentity gets the Azure base64 credentials from AzureClusterIdentity - GetAzureCredentialsFromIdentity(identityName string, identityNamespace string) (azureclient.Credentials, error) - // UpdateCapvManagerBootstrapCredentialsSecret updates the vsphere creds used by the capv provider - UpdateCapvManagerBootstrapCredentialsSecret(username string, password string) error - // UpdateVsphereIdentityRefSecret updates vsphere cluster identityRef secret - UpdateVsphereIdentityRefSecret(clusterName, namespace, username, password string) error - // UpdateVsphereCloudProviderCredentialsSecret updates the vsphere creds used by the vsphere cloud provider - UpdateVsphereCloudProviderCredentialsSecret(clusterName string, namespace string, username string, password string) error - // UpdateVsphereCsiConfigSecret updates the vsphere csi config secret - UpdateVsphereCsiConfigSecret(clusterName string, namespace string, username string, password string) error - // UpdateCapzManagerBootstrapCredentialsSecret updates the azure creds used by the capz provider - UpdateCapzManagerBootstrapCredentialsSecret(tenantID string, clientID string, clientSecret string) error - // GetAzureClusterName gets AzureCluster Name and Namespace - GetAzureClusterName(clusterName string, namespace string) (string, string, error) - // GetKubeadmControlPlaneName gets KubeadmControlPlane Name and Namespace - GetKubeadmControlPlaneName(clusterName, namespace string) (string, string, error) - // UpdateAzureClusterIdentity returns whether the cluster used the same azure cluster identityRef with the management cluster - CheckUnifiedAzureClusterIdentity(clusterName string, namespace string) (bool, error) - // UpdateAzureClusterIdentity updates the azure cluster identityRef used by the capz provider - UpdateAzureClusterIdentity(clusterName string, namespace string, tenantID string, clientID string, clientSecret string) error - // GetCAPZControllerManagerDeploymentsReplicas gets current replicas for the capz-controller-manager deployment - GetCAPZControllerManagerDeploymentsReplicas() (int32, error) - // UpdateCAPZControllerManagerDeploymentReplicas update the capz-controller-manager deployment replicas - UpdateCAPZControllerManagerDeploymentReplicas(replicas int32) error - // UpdateAzureKCP recycles KCP for the azure cloud provider - UpdateAzureKCP(clusterName string, namespace string) error - // GetClientSet gets one clientset used to generate objects list - GetClientSet() CrtClient - // GetPinnipedIssuerURLAndCA fetches Pinniped supervisor IssuerURL and IssuerCA data from management cluster - GetPinnipedIssuerURLAndCA() (string, string, error) - // GetTanzuKubernetesReleases returns the TKr's with 'tkrName' prefix match. If tkrName is not provided it returns all the available TKr's - GetTanzuKubernetesReleases(tkrName string) ([]runv1alpha1.TanzuKubernetesRelease, error) - // GetBomConfigMap returns configmap associated w3ith the tkrNameLabel - GetBomConfigMap(tkrNameLabel string) (corev1.ConfigMap, error) - // GetClusterResolvedTanzuKubernetesRelease gets the resolved TKR for the management cluster - GetClusterResolvedTanzuKubernetesRelease() (*runv1alpha3.TanzuKubernetesRelease, error) - // GetClusterResolvedOSImagesFromTKR get a list of OSImage resource from the resolved TKR - GetClusterResolvedOSImagesFromTKR(*runv1alpha3.TanzuKubernetesRelease) ([]*runv1alpha3.OSImage, error) - // GetClusterInfrastructure gets cluster infrastructure name like VSphereCluster, AWSCluster, AzureCluster - GetClusterInfrastructure() (string, error) - // ActivateTanzuKubernetesReleases activates TanzuKubernetesRelease - // Deprecated: This would not be supported from TKR API version v1alpha3, - // user can use go client to set the labels to activate/deactivate the TKR - ActivateTanzuKubernetesReleases(tkrName string) error - // DeactivateTanzuKubernetesReleases deactivates TanzuKubernetesRelease - // Deprecated: This would not be supported from TKR API version v1alpha3, - // user can use go client to set the labels to activate/deactivate the TKR - DeactivateTanzuKubernetesReleases(tkrName string) error - // IsClusterRegisteredToTMC returns true if cluster is registered to Tanzu Mission Control - IsClusterRegisteredToTMC() (bool, error) - // ListCLIPluginResources lists CLIPlugin resources across all namespaces - ListCLIPluginResources() ([]cliv1alpha1.CLIPlugin, error) - // VerifyCLIPluginCRD returns true if CRD exists else return false - VerifyCLIPluginCRD() (bool, error) - // IsClusterClassBased check whether cluster is ClusterClass based or not - IsClusterClassBased(clusterName, namespace string) (bool, error) - // GetClusterStatusInfo returns the cluster status information - GetClusterStatusInfo(clusterName, namespace string, workloadClusterClient Client) ClusterStatusInfo - // GetCLIPluginImageRepositoryOverride returns map of image repository override - GetCLIPluginImageRepositoryOverride() (map[string]string, error) - // VerifyExistenceOfCRD returns true if CRD exists else return false - VerifyExistenceOfCRD(resourceName, resourceGroup string) (bool, error) - // RemoveMatchingMetadataFromResources removes matching metadata (labels or annotations) for specified resource types - RemoveMatchingMetadataFromResources(gvk schema.GroupVersionKind, namespace string, metadataKey string, keysToRemove []string) error -} - -// PollOptions is options for polling -type PollOptions struct { - Interval time.Duration - Timeout time.Duration -} - -// NewPollOptions returns new poll options -func NewPollOptions(interval, timeout time.Duration) *PollOptions { - return &PollOptions{Interval: interval, Timeout: timeout} -} - -//go:generate counterfeiter -o ../fakes/crtclusterclient.go --fake-name CRTClusterClient . CrtClient -//go:generate counterfeiter -o ../fakes/clusterclient.go --fake-name ClusterClient . Client -//go:generate counterfeiter -o ../fakes/discoveryclusterclient.go --fake-name DiscoveryClient . DiscoveryClient - -// CrtClient clientset interface -type CrtClient interface { - crtclient.Client -} - -// DiscoveryClient discovery client interface -type DiscoveryClient interface { - discovery.DiscoveryInterface -} - -type DynamicClient interface { - dynamic.Interface -} - -type client struct { - clientSet CrtClient - discoveryClient DiscoveryClient - dynamicClient DynamicClient - kubeConfigPath string - currentContext string - poller Poller - crtClientFactory CrtClientFactory - discoveryClientFactory DiscoveryClientFactory - dynamicClientFactory DynamicClientFactory - configLoadingRules *clientcmd.ClientConfigLoadingRules - getClientInterval time.Duration - getClientTimeout time.Duration - operationTimeout time.Duration - verificationClientFactory *VerificationClientFactory -} - -// constants regarding timeout and configs -const ( - upgradePatchInterval = 30 * time.Second - upgradePatchTimeout = 5 * time.Minute - operationDefaultTimeout = 30 * time.Minute - CheckResourceInterval = 5 * time.Second - CheckClusterInterval = 10 * time.Second - getClientDefaultInterval = 10 * time.Second - getClientDefaultTimeout = 5 * time.Minute - CheckAutoscalerDeploymentTimeout = 2 * time.Minute - AVIResourceCleanupTimeout = 2 * time.Minute - PackageInstallPollInterval = 10 * time.Second - PackageInstallTimeout = 10 * time.Minute - kubeConfigSecretSuffix = "kubeconfig" - kubeConfigDataField = "value" - embeddedTelemetryConfigYamlPrefix = "tkg/manifest/telemetry/config-" - telemetryBomImagesMapKey = "tkgTelemetryImage" - prodTelemetryPath = "https://scapi.vmware.com/sc/api/collectors/tkg-telemetry.v1.5.0/batch" - stageTelemetryPath = "https://scapi-stg.vmware.com/sc/api/collectors/tkg-telemetry.v1.5.0/batch" -) - -const annotationPatchFormat = ` -{ - "metadata": { - "annotations": { - "%s" : "%s" - } - } -}` - -var providerTypes = []clusterctlv1.ProviderType{ - clusterctlv1.CoreProviderType, - clusterctlv1.BootstrapProviderType, - clusterctlv1.InfrastructureProviderType, - clusterctlv1.ControlPlaneProviderType, -} - -var ( - ctx = context.Background() - scheme = runtime.NewScheme() -) - -func init() { - _ = capi.AddToScheme(scheme) - _ = capiexp.AddToScheme(scheme) - _ = capiv1alpha3.AddToScheme(scheme) - _ = corev1.AddToScheme(scheme) - _ = appsv1.AddToScheme(scheme) - _ = clusterctlv1.AddToScheme(scheme) - _ = controlplanev1.AddToScheme(scheme) - _ = tkgsv1alpha2.AddToScheme(scheme) - _ = capvv1beta1.AddToScheme(scheme) - _ = capav1beta2.AddToScheme(scheme) - _ = capzv1beta1.AddToScheme(scheme) - _ = capdv1.AddToScheme(scheme) - _ = bootstrapv1.AddToScheme(scheme) - _ = runv1alpha1.AddToScheme(scheme) - _ = batchv1.AddToScheme(scheme) - _ = tmcv1alpha1.AddToScheme(scheme) - _ = extensionsV1.AddToScheme(scheme) - _ = rbacv1.AddToScheme(scheme) - _ = addonsv1.AddToScheme(scheme) - _ = runv1alpha3.AddToScheme(scheme) - _ = kappipkg.AddToScheme(scheme) - _ = cliv1alpha1.AddToScheme(scheme) - _ = configv1alpha1.AddToScheme(scheme) - _ = kapppkgv1alpha1.AddToScheme(scheme) -} - -// ClusterStatusInfo defines the cluster status involving all main components -type ClusterStatusInfo struct { - KubernetesVersion string - ClusterObject *capi.Cluster - KCPObject *controlplanev1.KubeadmControlPlane - MDObjects []capi.MachineDeployment - CPMachineObjects map[string]capi.Machine - WorkerMachineObjects map[string]capi.Machine - RetrievalError error -} - -// JSONPatch patch used for patching of object using patch of type JSONPatchType -type JSONPatch struct { - Op string `json:"op"` - Path string `json:"path"` - Value string `json:"value"` -} - -// MergeAndUseConfigForCluster merges a provided kubeConfig byte slice and -// merge it into the client's kubeconfig path and returns previous and current contexts -func (c *client) MergeAndUseConfigForCluster(kubeConfig []byte, overrideContext string) (string, string, error) { - // TODO: Support custom kube context name when merging kube configuration of cluster - prevContext, err := c.GetCurrentKubeContext() - if err != nil { - return "", "", errors.Wrap(err, "failed to get current context before merging kubeconfig") - } - err = c.MergeConfigForCluster(kubeConfig, "") - if err != nil { - return "", "", errors.Wrapf(err, "unable to merge kubeconfig of cluster") - } - currentContext, err := getCurrentContextFromKubeConfig(kubeConfig) - if err != nil { - return "", "", errors.Wrapf(err, "unable to get current context from new kubeconfig") - } - err = c.UseContext(currentContext) - if err != nil { - return "", "", errors.Wrap(err, "unable to set context after updating kubeconfig") - } - return currentContext, prevContext, nil -} - -func (c *client) GetClientSet() CrtClient { - return c.clientSet -} - -func (c *client) GetKubeConfigPath() string { - return c.kubeConfigPath -} - -// Apply runs kubectl apply every `interval` until it succeeds or a timeout is reached. -func (c *client) Apply(yamlStr string) error { - _, err := c.poller.PollImmediateWithGetter(kubectlApplyRetryInterval, kubectlApplyRetryTimeout, func() (interface{}, error) { - return nil, c.kubectlApply(yamlStr) - }) - return err -} - -// ApplyFile runs kubectl apply on a file/url every `interval` until it succeeds or a timeout is reached. -func (c *client) ApplyFile(filePath string) error { - _, err := c.poller.PollImmediateWithGetter(kubectlApplyRetryInterval, kubectlApplyRetryTimeout, func() (interface{}, error) { - return nil, c.kubectlApplyFile(filePath) - }) - return err -} - -// ApplyFileRecursively runs kubectl apply recursively on a dir/url every `interval` until it succeeds or a timeout is reached. -func (c *client) ApplyFileRecursively(filePath, namespace string) error { - _, err := c.poller.PollImmediateWithGetter(kubectlApplyRetryInterval, kubectlApplyRetryTimeout, func() (interface{}, error) { - return nil, c.kubectlApplyFileRecursively(filePath, namespace) - }) - return err -} - -func (c *client) patchClusterWithOperationObservedTimestamp(clusterName, namespace string) { - patchAnnotations := fmt.Sprintf(annotationPatchFormat, TKGOperationLastObservedTimestampKey, time.Now().UTC().String()) - err := c.PatchClusterObject(clusterName, namespace, patchAnnotations) - if err != nil { - log.V(6).Infof("unable to patch cluster object with operation status, %s", err.Error()) - } -} - -func (c *client) WaitForClusterInitialized(clusterName, namespace string) error { - var err error - var currentClusterInfo ClusterStatusInfo - var lastClusterInfo ClusterStatusInfo - var lastReason string - unchangedCounter := 0 - interval := 15 * time.Second - // maxTimeout to time-bound wait operation to avoid indefinite wait if the cluster state keeps changing - maxTimeout := 3 * c.operationTimeout - maxTimeoutCounter := 0 - errorRetry := 0 - maxErrorRetry := 20 - - getterFunc := func() (interface{}, error) { - currentClusterInfo = c.GetClusterStatusInfo(clusterName, namespace, nil) - err = currentClusterInfo.RetrievalError - - if err == nil { - // If cluster's ReadyCondition is False and severity is Error, retry 3 times waiting for cluster ready status - // for slow I/O infrastructure or resource constrained environments. - if conditions.IsFalse(currentClusterInfo.ClusterObject, capi.ReadyCondition) && - (*conditions.GetSeverity(currentClusterInfo.ClusterObject, capi.ReadyCondition) == capi.ConditionSeverityError) { - reason := conditions.GetReason(currentClusterInfo.ClusterObject, capi.ReadyCondition) - message := conditions.GetMessage(currentClusterInfo.ClusterObject, capi.ReadyCondition) - maxTimeoutCounter++ - if interval*time.Duration(maxTimeoutCounter) > maxTimeout { - return true, errors.Errorf("timed out waiting for cluster creation, reason:'%s', message:'%s'", - reason, - message) - } - if errorRetry >= maxErrorRetry { - return true, errors.Errorf("cluster creation failed, reason:'%s', message:'%s'", - reason, - message) - } - if !(strings.Contains(message, "context deadline exceeded") || strings.Contains(message, "context canceled")) { - errorRetry++ - } - return false, errors.Errorf("cluster not ready, reason:'%s', message:'%s'", reason, message) - } - // reset errorRetry to 0 if recover from last error - errorRetry = 0 - // Could have checked cluster's ReadyCondition is True which is currently aggregation of ControlPlaneReadyCondition - // and InfrastructureReadyCondition, however in future if capi adds WorkersReadyCondition into aggregation, it would - // hold this method to wait till the workers are also ready which is not necessary for getting kubeconfig secret - err = VerifyClusterInitialized(currentClusterInfo.ClusterObject) - if err == nil { - return false, nil - } - } - - if isClusterStateChanged(&lastClusterInfo, ¤tClusterInfo) || - isClusterStateChangedForMD(&lastClusterInfo, ¤tClusterInfo) { - unchangedCounter = 0 - // Patch cluster object with updated timestamp information - // This timestamp will be used with operation timeout to determine - // stalled state of the cluster - // TODO(anuj): consider reducing the number of patches done to the cluster - // by batching a couple of those that happen close to one another. - // Even a timestamp patch spaced at least 2-3 minutes apart will not affect - // the correctness of this algo, but can potentially reduce patches by quite - // a bit if there are quite a number of changes detected during that span. - c.patchClusterWithOperationObservedTimestamp(clusterName, namespace) - } else { - unchangedCounter++ - log.V(7).Infof("cluster state is unchanged %v", unchangedCounter) - } - maxTimeoutCounter++ - - if lastReason != err.Error() { - log.Info(err.Error()) - lastReason = err.Error() - } - - lastClusterInfo = currentClusterInfo - - // if unchanged for operationTimeout(30 min default) or exceeds maxTimeout, return error - if (interval*time.Duration(unchangedCounter) > c.operationTimeout) || - (interval*time.Duration(maxTimeoutCounter) > maxTimeout) { - return true, errors.Wrap(err, "timed out waiting for cluster creation to complete") - } - - return false, err - } - - return c.poller.PollImmediateInfiniteWithGetter(interval, getterFunc) -} - -func (c *client) WaitForControlPlaneAvailable(clusterName, namespace string) error { - _, err := c.poller.PollImmediateWithGetter(CheckClusterInterval, c.operationTimeout, func() (interface{}, error) { - kcpObject, err := c.GetKCPObjectForCluster(clusterName, namespace) - if err != nil { - return false, err - } - if conditions.IsTrue(kcpObject, controlplanev1.AvailableCondition) { - return true, nil - } - - return false, errors.New("control plane is not available yet") - }) - return err -} - -func (c *client) WaitForClusterReady(clusterName, namespace string, checkAllReplicas bool) error { - if err := c.GetResource(&capi.Cluster{}, clusterName, namespace, VerifyClusterReady, &PollOptions{Interval: CheckClusterInterval, Timeout: c.operationTimeout}); err != nil { - return err - } - if checkAllReplicas { - // Check and wait for KCP replicas - if err := c.GetResourceList(&controlplanev1.KubeadmControlPlaneList{}, clusterName, namespace, VerifyKubeadmControlPlaneReplicas, &PollOptions{Interval: CheckClusterInterval, Timeout: c.operationTimeout}); err != nil { - return err - } - // Check and wait for MD replicas - if err := c.GetResourceList(&capi.MachineDeploymentList{}, clusterName, namespace, VerifyMachineDeploymentsReplicas, &PollOptions{Interval: CheckClusterInterval, Timeout: c.operationTimeout}); err != nil { - return err - } - } - if err := c.GetResourceList(&capi.MachineList{}, clusterName, namespace, VerifyMachinesReady, &PollOptions{Interval: CheckClusterInterval, Timeout: c.operationTimeout}); err != nil { - return err - } - return nil -} - -func (c *client) WaitForClusterDeletion(clusterName, namespace string) error { - return c.WaitForResourceDeletion(&capi.Cluster{}, clusterName, namespace, nil, &PollOptions{Interval: CheckClusterInterval, Timeout: c.operationTimeout}) -} - -func (c *client) WaitForResourceDeletion(resourceReference interface{}, resourceName, namespace string, postVerify PostVerifyrFunc, pollOptions *PollOptions) error { - var err error - - if pollOptions == nil { - return errors.New("missing pollOptions") - } - if namespace == "" { - if namespace, err = c.GetCurrentNamespace(); err != nil { - return err - } - } - - // get the runtime object from interface - obj, err := getRuntimeObject(resourceReference) - if err != nil { - return err - } - - log.V(4).Infof("waiting for %s resource of type %s to be deleted", resourceName, reflect.TypeOf(resourceReference)) - _, err = c.poller.PollImmediateWithGetter(pollOptions.Interval, pollOptions.Timeout, func() (interface{}, error) { - getErr := c.get(resourceName, namespace, obj, postVerify) - if getErr != nil { - // if error is not found, means the resource is deleted and stop polling - if apierrors.IsNotFound(getErr) { - return nil, nil - } - return nil, getErr - } - return nil, errors.New("resource is still present") - }) - return err -} - -func (c *client) WaitForDeployment(deploymentName, namespace string) error { - return c.GetResource(&appsv1.Deployment{}, deploymentName, namespace, VerifyDeploymentAvailable, &PollOptions{Interval: CheckResourceInterval, Timeout: c.operationTimeout}) -} - -func (c *client) WaitForAutoscalerDeployment(deploymentName, namespace string) error { - return c.GetResource(&appsv1.Deployment{}, deploymentName, namespace, VerifyAutoscalerDeploymentAvailable, &PollOptions{Interval: CheckResourceInterval, Timeout: CheckAutoscalerDeploymentTimeout}) -} - -func (c *client) ApplyPatchForAutoScalerDeployment(tkgBomClient tkgconfigbom.Client, clusterName string, k8sVersion string, namespace string) error { - var autoScalerDeployment appsv1.Deployment - autoscalerDeploymentName := clusterName + "-cluster-autoscaler" - err := c.GetResource(&autoScalerDeployment, autoscalerDeploymentName, namespace, nil, nil) - if err != nil && apierrors.IsNotFound(err) { - log.V(4).Infof("cluster autoscaler is not enabled for cluster %s", clusterName) - return nil - } - if err != nil { - return errors.Wrapf(err, "unable to get autoscaler deployment from management cluster") - } - - newAutoscalerImage, err := tkgBomClient.GetAutoscalerImageForK8sVersion(k8sVersion) - if err != nil { - return err - } - - log.Infof("Patching autoscaler deployment '%s'", autoscalerDeploymentName) - patchString := `[ - { - "op": "replace", - "path": "/spec/template/spec/containers/0/image", - "value": "%s" - } - ]` - - autoscalerDeploymentPatch := fmt.Sprintf(patchString, newAutoscalerImage) - - pollOptions := &PollOptions{Interval: upgradePatchInterval, Timeout: upgradePatchTimeout} - err = c.PatchResource(&autoScalerDeployment, autoscalerDeploymentName, namespace, autoscalerDeploymentPatch, types.JSONPatchType, pollOptions) - if err != nil { - return errors.Wrap(err, "unable to update the container image for autoscaler deployment") - } - - log.Infof("Waiting for cluster autoscaler to be patched and available...") - if err = c.WaitForAutoscalerDeployment(autoscalerDeploymentName, namespace); err != nil { - log.Warningf("Unable to wait for autoscaler deployment to be ready. reason: %v", err) - } - return nil -} - -func (c *client) WaitForAVIResourceCleanUp(statefulSetName, namespace string) error { - err := c.GetResource(&appsv1.StatefulSet{}, statefulSetName, namespace, VerifyAVIResourceCleanupFinished, &PollOptions{Interval: CheckResourceInterval, Timeout: AVIResourceCleanupTimeout}) - // retry once when network condition is poor - if apierrors.IsServiceUnavailable(err) { - return c.GetResource(&appsv1.StatefulSet{}, statefulSetName, namespace, VerifyAVIResourceCleanupFinished, &PollOptions{Interval: CheckResourceInterval, Timeout: AVIResourceCleanupTimeout}) - } - return err -} - -func (c *client) WaitForPackageInstall(packageName, namespace string, packageInstallTimeout time.Duration) error { - if packageInstallTimeout == 0 { - packageInstallTimeout = PackageInstallTimeout - } - return c.GetResource(&kappipkg.PackageInstall{}, packageName, namespace, VerifyPackageInstallReconciledSuccessfully, &PollOptions{Interval: PackageInstallPollInterval, Timeout: packageInstallTimeout}) -} - -func verifyKubernetesUpgradeForCPNodes(clusterStatusInfo *ClusterStatusInfo, newK8sVersion string) error { - if clusterStatusInfo.RetrievalError != nil { - return clusterStatusInfo.RetrievalError - } - - clusterObj := clusterStatusInfo.ClusterObject - if !conditions.IsTrue(clusterObj, capi.ControlPlaneReadyCondition) { - return errors.Errorf("control-plane is still being upgraded, reason:'%s', message:'%s' ", - conditions.GetReason(clusterObj, capi.ControlPlaneReadyCondition), conditions.GetMessage(clusterObj, capi.ControlPlaneReadyCondition)) - } - - if clusterStatusInfo.KubernetesVersion != "" && clusterStatusInfo.KubernetesVersion != newK8sVersion { - return errors.Errorf("waiting for kubernetes version update, current kubernetes version %s but expecting %s", clusterStatusInfo.KubernetesVersion, newK8sVersion) - } - - return nil -} - -func verifyKubernetesUpgradeForWorkerNodes(clusterStatusInfo *ClusterStatusInfo, newK8sVersion string) error { - if clusterStatusInfo.RetrievalError != nil { - return clusterStatusInfo.RetrievalError - } - - var desiredReplica int32 = 1 - if config.IsFeatureActivated(constants.FeatureFlagSingleNodeClusters) && len(clusterStatusInfo.WorkerMachineObjects) == 0 { - return nil - } - errList := []error{} - - for i := range clusterStatusInfo.MDObjects { - if clusterStatusInfo.MDObjects[i].Spec.Replicas != nil { - desiredReplica = *clusterStatusInfo.MDObjects[i].Spec.Replicas - } - isReplicasUpgraded := clusterStatusInfo.MDObjects[i].Status.ReadyReplicas == desiredReplica && clusterStatusInfo.MDObjects[i].Status.UpdatedReplicas == desiredReplica && clusterStatusInfo.MDObjects[i].Status.Replicas == desiredReplica - if !isReplicasUpgraded { - err := errors.Errorf("worker nodes are still being upgraded for MachineDeployment '%s', DesiredReplicas=%v Replicas=%v ReadyReplicas=%v UpdatedReplicas=%v", - clusterStatusInfo.MDObjects[i].Name, desiredReplica, clusterStatusInfo.MDObjects[i].Status.Replicas, clusterStatusInfo.MDObjects[i].Status.ReadyReplicas, clusterStatusInfo.MDObjects[i].Status.UpdatedReplicas) - errList = append(errList, err) - } - } - - if len(errList) != 0 { - return kerrors.NewAggregate(errList) - } - - unupgradedMachineList := []string{} - for i := range clusterStatusInfo.WorkerMachineObjects { - if clusterStatusInfo.WorkerMachineObjects[i].Spec.Version == nil || !strings.HasPrefix(newK8sVersion, *clusterStatusInfo.WorkerMachineObjects[i].Spec.Version) { - unupgradedMachineList = append(unupgradedMachineList, clusterStatusInfo.WorkerMachineObjects[i].Name) - } - } - - if len(unupgradedMachineList) > 0 { - sort.Strings(unupgradedMachineList) - return errors.Errorf("worker machines %v are still not upgraded", unupgradedMachineList) - } - - return nil -} - -// isClusterStateChanged functions verifies if the cluster object ready conditions(includes InfrastructureReady and ControlplaneReady) have -// any transitions since last observation -func isClusterStateChanged(lastClusterInfo, curClusterInfo *ClusterStatusInfo) bool { - if curClusterInfo.RetrievalError != nil || - lastClusterInfo.ClusterObject == nil || - curClusterInfo.ClusterObject == nil { - return false - } - - // If the ReadyCondition's lastTransitionTime is updated it implies there is some state change - if !conditions.GetLastTransitionTime(curClusterInfo.ClusterObject, capi.ReadyCondition).Equal( - conditions.GetLastTransitionTime(lastClusterInfo.ClusterObject, capi.ReadyCondition)) { - return true - } - - return false -} - -// isClusterStateChangedForKCP functions verifies if the cluster object ControlplaneReady condition has -// any transitions since last observation -func isClusterStateChangedForKCP(lastClusterInfo, curClusterInfo *ClusterStatusInfo) bool { - if curClusterInfo.RetrievalError != nil || - lastClusterInfo.ClusterObject == nil || - curClusterInfo.ClusterObject == nil { - return false - } - // If the ControlPlaneReadyCondition's lastTransitionTime is updated it implies there is some state change - if !conditions.GetLastTransitionTime(curClusterInfo.ClusterObject, capi.ControlPlaneReadyCondition).Equal( - conditions.GetLastTransitionTime(lastClusterInfo.ClusterObject, capi.ControlPlaneReadyCondition)) { - return true - } - return false -} - -func isClusterStateChangedForMD(lastClusterInfo, curClusterInfo *ClusterStatusInfo) bool { // nolint:gocyclo - if curClusterInfo.RetrievalError != nil || - lastClusterInfo.MDObjects == nil || - curClusterInfo.MDObjects == nil || - len(lastClusterInfo.WorkerMachineObjects) == 0 || - len(curClusterInfo.WorkerMachineObjects) == 0 { - return false - } - - compareMDStatus := func(lastMDObject capi.MachineDeployment, curMDObject capi.MachineDeployment) bool { - if lastMDObject.Status.Replicas != curMDObject.Status.Replicas || - lastMDObject.Status.ReadyReplicas != curMDObject.Status.ReadyReplicas || - lastMDObject.Status.UpdatedReplicas != curMDObject.Status.UpdatedReplicas || - len(lastClusterInfo.WorkerMachineObjects) != len(curClusterInfo.WorkerMachineObjects) { - return true - } - return false - } - - for i := range lastClusterInfo.MDObjects { - for j := range curClusterInfo.MDObjects { - if lastClusterInfo.MDObjects[i].Name == curClusterInfo.MDObjects[j].Name && compareMDStatus(lastClusterInfo.MDObjects[i], curClusterInfo.MDObjects[j]) { - return true - } - } - } - - // As machines are stored in a map as "Name-Phase" key->Machine pair - // if the key does not exist in lastClusterInfo.WorkerMachineObjects that mean - // state of the machine object is changed - for curMachineNamePhase := range curClusterInfo.WorkerMachineObjects { - if _, found := lastClusterInfo.WorkerMachineObjects[curMachineNamePhase]; !found { - return true - } - } - - return false -} - -func (c *client) PatchClusterWithOperationStartedStatus(clusterName, namespace, operationType string, timeout time.Duration) error { - currentTimestamp := time.Now().UTC().String() - operationStatus := OperationStatus{ - Operation: operationType, - OperationTimeout: int(timeout.Seconds()), - OperationStartTimestamp: currentTimestamp, - } - operationStatusBytes, err := json.Marshal(operationStatus) - if err != nil { - return err - } - operationStatusString := strings.ReplaceAll(string(operationStatusBytes), "\"", "\\\"") - - patchFormat := ` - { - "metadata": { - "annotations": { - "%s" : "%s", - "%s" : "%s" - } - } - }` - patchAnnotations := fmt.Sprintf(patchFormat, TKGOperationInfoKey, operationStatusString, TKGOperationLastObservedTimestampKey, currentTimestamp) - log.V(6).Infof("patch cluster object with operation status: %s", patchAnnotations) - err = c.PatchClusterObject(clusterName, namespace, patchAnnotations) - if err != nil { - return errors.Wrap(err, "unable to patch cluster object with operation status") - } - return nil -} - -func (c *client) WaitK8sVersionUpdateForCPNodes(clusterName, namespace, newK8sVersion string, workloadClusterClient Client) error { - return c.waitK8sVersionUpdateGeneric(clusterName, namespace, newK8sVersion, workloadClusterClient, true) -} - -func (c *client) WaitK8sVersionUpdateForWorkerNodes(clusterName, namespace, newK8sVersion string, workloadClusterClient Client) error { - return c.waitK8sVersionUpdateGeneric(clusterName, namespace, newK8sVersion, workloadClusterClient, false) -} - -func (c *client) waitK8sVersionUpdateGeneric(clusterName, namespace, newK8sVersion string, workloadClusterClient Client, isCP bool) error { - verifyKubernetesUpgradeFunc := verifyKubernetesUpgradeForCPNodes - isClusterStateChangedFunc := isClusterStateChangedForKCP - if !isCP { - verifyKubernetesUpgradeFunc = verifyKubernetesUpgradeForWorkerNodes - isClusterStateChangedFunc = isClusterStateChangedForMD - } - - // client can have additional verificationClientFactory mainly for unit testing purpose - if c.verificationClientFactory != nil && c.verificationClientFactory.VerifyKubernetesUpgradeFunc != nil { - verifyKubernetesUpgradeFunc = c.verificationClientFactory.VerifyKubernetesUpgradeFunc - } - - var err error - var curClusterInfo ClusterStatusInfo - var lastClusterInfo ClusterStatusInfo - unchangedCounter := 0 - interval := 15 * time.Second - timeout := c.operationTimeout - // maxTimeout to time-bound wait operation to avoid indefinite wait if the cluster state keeps changing - maxTimeout := 3 * c.operationTimeout - maxTimeoutCounter := 0 - errorRetry := 0 - maxErrorRetry := 20 - - getterFunc := func() (interface{}, error) { - curClusterInfo = c.GetClusterStatusInfo(clusterName, namespace, workloadClusterClient) - - // If cluster's ReadyCondition is False and severity is Error, retry 3 times waiting for cluster ready status - // for slow I/O infrastructure or resource constrained environments. - if conditions.IsFalse(curClusterInfo.ClusterObject, capi.ReadyCondition) && - (*conditions.GetSeverity(curClusterInfo.ClusterObject, capi.ReadyCondition) == capi.ConditionSeverityError) { - reason := conditions.GetReason(curClusterInfo.ClusterObject, capi.ReadyCondition) - message := conditions.GetMessage(curClusterInfo.ClusterObject, capi.ReadyCondition) - maxTimeoutCounter++ - if interval*time.Duration(maxTimeoutCounter) > maxTimeout { - return true, errors.Errorf("timed out waiting for kubernetes version update, reason:'%s', message:'%s'", - reason, - message) - } - if errorRetry >= maxErrorRetry { - return true, errors.Errorf("kubernetes version update failed, reason:'%s', message:'%s'", - reason, - message) - } - if !(strings.Contains(message, "Failed to refresh the Token for request to") || strings.Contains(message, "context deadline exceeded") || strings.Contains(message, "context canceled")) { - errorRetry++ - } - return false, errors.Errorf("cluster not ready, reason:'%s', message:'%s'", reason, message) - } - // reset errorRetry to 0 if recover from last error - errorRetry = 0 - err = verifyKubernetesUpgradeFunc(&curClusterInfo, newK8sVersion) - if err == nil { - return false, nil - } - - if isClusterStateChangedFunc(&lastClusterInfo, &curClusterInfo) { - unchangedCounter = 0 - // Patch cluster object with updated timestamp information - // This timestamp will be used with operation timeout to determine - // stalled state of the cluster - // TODO(anuj): consider reducing the number of patches done to the cluster - // by batching a couple of those that happen close to one another. - // Even a timestamp patch spaced at least 2-3 minutes apart will not affect - // the correctness of this algo, but can potentially reduce patches by quite - // a bit if there are quite a number of changes detected during that span. - c.patchClusterWithOperationObservedTimestamp(clusterName, namespace) - } else { - unchangedCounter++ - log.V(7).Infof("cluster state is unchanged %v", unchangedCounter) - } - maxTimeoutCounter++ - lastClusterInfo = curClusterInfo - - // if unchanged for operationTimeout(30 min default) or exceeds maxTimeout, return error - if (interval*time.Duration(unchangedCounter) > timeout) || - (interval*time.Duration(maxTimeoutCounter) > maxTimeout) { - return true, errors.New("timed out waiting for upgrade to complete") - } - - return false, err - } - - // Wait before we start the polling to check upgrade status - // This is done to account for the CP/MD upgrade to start rolling out - // because it was noticed that CP/MD upgrade rollout take few seconds - // to update the conditions which we rely on to check the upgrade status - // ClusterReady is already present and wait logic comes out of the poll - // loop assuming the upgrade is complete whereas the upgrade has not been - // started yet - Sleep(waitPeriodBeforePollingForUpgradeStatus) - - return c.poller.PollImmediateInfiniteWithGetter(interval, getterFunc) -} - -func (c *client) PatchClusterObjectWithPollOptions(clusterName, clusterNamespace, patchJSONString string, pollOptions *PollOptions) error { - err := c.PatchResource(&capi.Cluster{}, clusterName, clusterNamespace, patchJSONString, types.MergePatchType, pollOptions) - if err != nil { - return errors.Wrap(err, "unable to patch the cluster object") - } - return nil -} - -func (c *client) PatchClusterObject(clusterName, clusterNamespace, patchJSONString string) error { - pollOptions := &PollOptions{Interval: upgradePatchInterval, Timeout: upgradePatchTimeout} - return c.PatchClusterObjectWithPollOptions(clusterName, clusterNamespace, patchJSONString, pollOptions) -} - -func (c *client) GetClusterStatusInfo(clusterName, namespace string, workloadClusterClient Client) ClusterStatusInfo { - var err error - errList := []error{} - clusterStatusInfo := ClusterStatusInfo{} - - // not all operation will require current k8s version so workloadClusterClient value can be nil. - if workloadClusterClient != nil { - clusterStatusInfo.KubernetesVersion, err = workloadClusterClient.GetKubernetesVersion() - if err != nil { - errList = append(errList, err) - } - } - - clusterStatusInfo.ClusterObject = &capi.Cluster{} - if err := c.GetResource(clusterStatusInfo.ClusterObject, clusterName, namespace, nil, nil); err != nil { - errList = append(errList, err) - } - - if clusterStatusInfo.KCPObject, err = c.GetKCPObjectForCluster(clusterName, namespace); err != nil { - errList = append(errList, err) - } - - if clusterStatusInfo.CPMachineObjects, clusterStatusInfo.WorkerMachineObjects, err = c.GetMachineObjectsForCluster(clusterName, namespace); err != nil { - errList = append(errList, err) - } - - singleNodeCluster := len(clusterStatusInfo.CPMachineObjects) == 1 && len(clusterStatusInfo.WorkerMachineObjects) == 0 - - if !singleNodeCluster { - if clusterStatusInfo.MDObjects, err = c.GetMDObjectForCluster(clusterName, namespace); err != nil { - errList = append(errList, err) - } - } - - clusterStatusInfo.RetrievalError = kerrors.NewAggregate(errList) - - return clusterStatusInfo -} - -func (c *client) GetKCPObjectForCluster(clusterName, namespace string) (*controlplanev1.KubeadmControlPlane, error) { - kcpList := &controlplanev1.KubeadmControlPlaneList{} - if err := c.GetResourceList(kcpList, clusterName, namespace, nil, nil); err != nil { - return nil, err - } - if len(kcpList.Items) != 1 { - return nil, errors.Errorf("zero or multiple KCP objects found for the given cluster, %v %v %v", len(kcpList.Items), clusterName, namespace) - } - return &kcpList.Items[0], nil -} - -func (c *client) GetDeployment(deploymentName string, namespace string) (appsv1.Deployment, error) { - dpObject := &appsv1.Deployment{} - if err := c.GetResource(dpObject, deploymentName, namespace, nil, nil); err != nil { - return appsv1.Deployment{}, err - } - return *dpObject, nil -} - -func (c *client) GetMDObjectForCluster(clusterName, namespace string) ([]capi.MachineDeployment, error) { - mdList := &capi.MachineDeploymentList{} - if err := c.GetResourceList(mdList, clusterName, namespace, nil, nil); err != nil { - return nil, err - } - if len(mdList.Items) == 0 { - return nil, errors.New("no MachineDeployment objects found for the given cluster") - } - return mdList.Items, nil -} - -func (c *client) GetMachineObjectsForCluster(clusterName, namespace string) (map[string]capi.Machine, map[string]capi.Machine, error) { - mdList := &capi.MachineList{} - if err := c.GetResourceList(mdList, clusterName, namespace, nil, nil); err != nil { - return nil, nil, err - } - - cpMachines := make(map[string]capi.Machine) - workerMachines := make(map[string]capi.Machine) - - for i := range mdList.Items { - key := mdList.Items[i].Name + "-" + mdList.Items[i].Status.Phase - if _, labelFound := mdList.Items[i].Labels[capi.MachineControlPlaneLabelName]; labelFound { - cpMachines[key] = mdList.Items[i] - } else { - workerMachines[key] = mdList.Items[i] - } - } - - return cpMachines, workerMachines, nil -} - -func (c *client) GetKubernetesVersion() (string, error) { - versionInfo, err := c.discoveryClient.ServerVersion() - if err != nil { - return "", err - } - return versionInfo.GitVersion, nil -} - -func (c *client) PatchClusterObjectWithOptionalMetadata(clusterName, namespace, metadataKey string, metadata map[string]string) (string, error) { - if len(metadata) == 0 { - return "", nil - } - metadataFormat := "%q : %q,\n" - var metadataBuilder strings.Builder - for key, value := range metadata { - metadataBuilder.WriteString(fmt.Sprintf(metadataFormat, key, value)) - } - metadataStr := metadataBuilder.String() - // removes trailing comma, newline - metadataStr = metadataStr[:len(metadataStr)-2] - patchFormat := ` - { - "metadata": { - %q: { - %s - } - } - }` - patchAnnotations := fmt.Sprintf(patchFormat, metadataKey, metadataStr) - err := c.PatchClusterObject(clusterName, namespace, patchAnnotations) - if err != nil { - return "", errors.Wrap(err, "unable to patch the management cluster object with optional metadata") - } - return patchAnnotations, nil -} - -func (c *client) PatchClusterObjectWithTKGVersion(clusterName, namespace, tkgVersion string) error { - patchAnnotations := fmt.Sprintf(annotationPatchFormat, TKGVersionKey, tkgVersion) - err := c.PatchClusterObject(clusterName, namespace, patchAnnotations) - if err != nil { - return errors.Wrap(err, "unable to patch the management cluster object with TKG version") - } - return nil -} - -func (c *client) PatchClusterObjectAnnotations(clusterName, namespace, key, value string) error { - patchAnnotations := fmt.Sprintf(annotationPatchFormat, key, value) - err := c.PatchClusterObject(clusterName, namespace, patchAnnotations) - if err != nil { - return errors.Wrapf(err, "unable to patch the cluster object with %v", patchAnnotations) - } - return nil -} - -func (c *client) GetManagementClusterTKGVersion(mgmtClusterName, clusterNamespace string) (string, error) { - mcObject := &capiv1alpha3.Cluster{} - err := c.GetResource(mcObject, mgmtClusterName, clusterNamespace, nil, nil) - if err != nil { - return "", errors.Wrap(err, "unable to get the cluster object") - } - version, exists := mcObject.Annotations[TKGVersionKey] - // if TKGVersionKey does not exist in annotation of the management cluster object - // assume this is v1.0.0 management cluster as TKGVERSION was not patched for - // v1.0.x release - if !exists { - version = "v1.0.0" - } - - return version, nil -} - -// GetTanzuKubernetesReleases returns the list of available TanzuKubernetesReleases -func (c *client) GetTanzuKubernetesReleases(tkrName string) ([]runv1alpha1.TanzuKubernetesRelease, error) { - var tkrList runv1alpha1.TanzuKubernetesReleaseList - getTKRTimeout := 2 * CheckResourceInterval - _, err := c.poller.PollImmediateWithGetter(CheckResourceInterval, getTKRTimeout, func() (interface{}, error) { - return nil, c.ListResources(&tkrList) - }) - if err != nil { - return nil, errors.Wrap(err, "failed to list current TKr's") - } - if tkrName == "" { - return tkrList.Items, nil - } - - result := []runv1alpha1.TanzuKubernetesRelease{} - for i := range tkrList.Items { - if strings.HasPrefix(tkrList.Items[i].Name, tkrName) { - result = append(result, tkrList.Items[i]) - } - } - return result, nil -} - -// GetBomConfigMap gets the BOM ConfigMap -func (c *client) GetBomConfigMap(tkrNameLabel string) (corev1.ConfigMap, error) { - selectors := []crtclient.ListOption{ - crtclient.InNamespace(tkrconstants.TKRNamespace), - crtclient.MatchingLabels(map[string]string{tkrconstants.BomConfigMapTKRLabel: tkrNameLabel}), - } - - cmList := &corev1.ConfigMapList{} - err := c.clientSet.List(context.Background(), cmList, selectors...) - if err != nil { - return corev1.ConfigMap{}, errors.Wrap(err, "failed to list current TKr's") - } - if len(cmList.Items) != 1 { - return corev1.ConfigMap{}, errors.Wrapf(err, "failed to find the BOM ConfigMap matching the label %s: %v", tkrNameLabel, err) - } - - return cmList.Items[0], nil -} - -// getManagementCluster searches the cluster list for the one with management cluster role label -func (c *client) getManagementCluster() (*capi.Cluster, error) { - clusters := &capi.ClusterList{} - - selectors := []crtclient.ListOption{ - crtclient.MatchingLabels(map[string]string{tkrconstants.ManagementClusterRoleLabel: ""}), - } - err := c.clientSet.List(context.Background(), clusters, selectors...) - if err != nil || len(clusters.Items) != 1 { - return nil, errors.Wrap(err, "unable to get current management cluster") - } - return &clusters.Items[0], nil -} - -// GetClusterInfrastructure gets the underlying infrastructure being used -func (c *client) GetClusterInfrastructure() (string, error) { - cluster, err := c.getManagementCluster() - if err != nil { - return "", err - } - return cluster.Spec.InfrastructureRef.Kind, nil -} - -// GetClusterResolvedTanzuKubernetesRelease gets the resolved TKR for the management cluster -func (c *client) GetClusterResolvedTanzuKubernetesRelease() (*v1alpha3.TanzuKubernetesRelease, error) { - cluster, err := c.getManagementCluster() - if cluster == nil || err != nil { - return nil, err - } - tkrName, exists := cluster.Labels[runv1alpha3.LabelTKR] - if cluster.Labels == nil || !exists { - return nil, nil // the cluster doesn't have resolved TKR - } - var tkr v1alpha3.TanzuKubernetesRelease - if err := c.GetResource(&tkr, tkrName, "", nil, nil); err != nil { - return nil, err - } - return &tkr, nil -} - -// GetClusterResolvedOSImagesFromTKR get a list of OSImage resource from the resolved TKR -func (c *client) GetClusterResolvedOSImagesFromTKR(tkr *runv1alpha3.TanzuKubernetesRelease) ([]*runv1alpha3.OSImage, error) { - if tkr == nil { - return []*v1alpha3.OSImage{}, nil - } - var osImageList []*v1alpha3.OSImage - for _, osImageRef := range tkr.Spec.OSImages { - var osImage runv1alpha3.OSImage - if err := c.GetResource(&osImage, osImageRef.Name, "", nil, nil); err != nil { - return nil, errors.New("unable to get resolved OSImage " + osImage.Name) - } - osImageList = append(osImageList, &osImage) - } - return osImageList, nil -} - -// DeactivateTanzuKubernetesReleases deactivates the given TanzuKubernetesReleases -// TKr is deactivated by adding label (inactive: "" ) to the TKr resource -func (c *client) DeactivateTanzuKubernetesReleases(tkrName string) error { - var tkr runv1alpha1.TanzuKubernetesRelease - deactivateTKRTimeout := 2 * CheckResourceInterval - patchFormat := ` - { - "metadata": { - "labels": { - %q: "" - } - } - }` - patchStr := fmt.Sprintf(patchFormat, tkrconstants.TanzuKubernetesReleaseInactiveLabel) - pollOptions := &PollOptions{Interval: CheckResourceInterval, Timeout: deactivateTKRTimeout} - err := c.PatchResource(&tkr, tkrName, "", patchStr, types.MergePatchType, pollOptions) - if err != nil { - return errors.Wrap(err, "unable to patch the TKr object with inactive label") - } - - return nil -} - -// ActivateTanzuKubernetesReleases activates the given TanzuKubernetesReleases -// TKr is activated by removing the inactive label (by patching labels with inactive: null) on TKr resource -func (c *client) ActivateTanzuKubernetesReleases(tkrName string) error { - var tkr runv1alpha1.TanzuKubernetesRelease - activateTKRTimeout := 2 * CheckResourceInterval - patchFormat := ` - { - "metadata": { - "labels": { - %q: null - } - } - }` - patchStr := fmt.Sprintf(patchFormat, tkrconstants.TanzuKubernetesReleaseInactiveLabel) - pollOptions := &PollOptions{Interval: CheckResourceInterval, Timeout: activateTKRTimeout} - err := c.PatchResource(&tkr, tkrName, "", patchStr, types.MergePatchType, pollOptions) - if err != nil { - return errors.Wrap(err, "unable to patch the TKr object with inactive label") - } - - return nil -} - -// GetResource gets the kubernetes resource passed as reference either directly or with polling mechanism -// resourceReference is a reference to resource struct you want to retrieve -// resourceName is name of the resource to get -// namespace is namespace in which the resource to be searched, if empty current namespace will be used -// postVerify verifies the resource with some state once it is retrieved from kubernetes, pass nil if nothing to verify -// pollOptions use this if you want to continuously poll for object if error occurs, pass nil if don't want polling -// Note: Make sure resource you are retrieving is added into Scheme with init function below -func (c *client) GetResource(resourceReference interface{}, resourceName, namespace string, postVerify PostVerifyrFunc, pollOptions *PollOptions) error { - var err error - if namespace == "" { - if namespace, err = c.GetCurrentNamespace(); err != nil { - return err - } - } - - // get the runtime object from interface - obj, err := getRuntimeObject(resourceReference) - if err != nil { - return err - } - - // if pollOptions are provided use the polling and wait for the result/error/timeout - // else use normal get - if pollOptions != nil { - log.V(4).Infof("waiting for resource %s of type %s to be up and running", resourceName, reflect.TypeOf(resourceReference)) - _, err = c.poller.PollImmediateWithGetter(pollOptions.Interval, pollOptions.Timeout, func() (interface{}, error) { - return nil, c.get(resourceName, namespace, obj, postVerify) - }) - return err - } - - return c.get(resourceName, namespace, obj, postVerify) -} - -// GetResourceList gets the list kubernetes resources passed as reference either directly or with polling mechanism -// resourceReference is a reference to resource struct you want to retrieve -// resourceName is name of the resource to get -// namespace is namespace in which the resource to be searched, if empty current namespace will be used -// postVerify verifies the resource with some state once it is retrieved from kubernetes, pass nil if nothing to verify -// pollOptions use this if you want to continuously poll for object if error occurs, pass nil if don't want polling -// Note: Make sure resource you are retrieving is added into Scheme with init function below -func (c *client) GetResourceList(resourceReference interface{}, clusterName, namespace string, postVerify PostVerifyListrFunc, pollOptions *PollOptions) error { - var err error - if namespace == "" { - if namespace, err = c.GetCurrentNamespace(); err != nil { - return err - } - } - - // get the runtime object from interface - obj, err := getRuntimeObjectList(resourceReference) - if err != nil { - return err - } - - // if pollOptions are provided use the polling and wait for the result/error/timeout - // else use normal list - if pollOptions != nil { - log.V(4).Infof("waiting for resources type %s to be up and running", reflect.TypeOf(resourceReference)) - _, err = c.poller.PollImmediateWithGetter(pollOptions.Interval, pollOptions.Timeout, func() (interface{}, error) { - return nil, c.list(clusterName, namespace, obj, postVerify) - }) - return err - } - - return c.list(clusterName, namespace, obj, postVerify) -} - -func removeAppliedFile(f *os.File) { - filePath := f.Name() - if os.Getenv("TKG_KEEP_APPLIED_YAML") != "" { - log.Infof("Applied yaml saved at %s", filePath) - } else { - // In windows environment it is required to close the file first before remove call otherwise - // it throws error "The process cannot access the file because it is being used by another process" - _ = f.Close() - if err := os.Remove(filePath); err != nil { - log.Infof("Unable to remove file %s, Error: %s", filePath, err.Error()) - } - } -} - -// ApplyFileOptions configures a kubectl apply, whether it is recursive or not -type ApplyFileOptions struct { - url string - recursive bool - namespace string -} - -// kubectlApplyFileImpl applies the given url for kubectl apply -func (c *client) kubectlApplyFileImpl(o ApplyFileOptions) error { - args := []string{"apply"} - if c.kubeConfigPath != "" { - args = append(args, "--kubeconfig", c.kubeConfigPath) - } - - if c.currentContext != "" { - args = append(args, "--context", c.currentContext) - } - if o.recursive { - args = append(args, "--recursive") - } - if o.namespace != "" { - args = append(args, "--namespace", o.namespace) - } - args = append(args, "-f", o.url) - cmd := exec.Command("kubectl", args...) - out, err := cmd.CombinedOutput() - if err != nil { - return errors.Wrapf(err, "kubectl apply failed, output: %s", string(out)) - } - return nil -} - -// kubectlApplyFile applies the given url with kubectl non-recursively -func (c *client) kubectlApplyFile(url string) error { - return c.kubectlApplyFileImpl(ApplyFileOptions{url: url}) -} - -// kubectlApplyFileRecursively applies the given url with kubectl recursively -func (c *client) kubectlApplyFileRecursively(url, namespace string) error { - return c.kubectlApplyFileImpl(ApplyFileOptions{url: url, recursive: true, namespace: namespace}) -} - -func (c *client) kubectlApply(yaml string) error { - f, err := os.CreateTemp("", "kubeapply-") - if err != nil { - return errors.Wrap(err, "unable to create temp file") - } - defer removeAppliedFile(f) - err = os.WriteFile(f.Name(), []byte(yaml), constants.ConfigFilePermissions) - if err != nil { - return errors.Wrap(err, "unable to write temp file") - } - return c.kubectlApplyFile(f.Name()) -} - -func (c *client) kubectlApplySetLastApplied(url string) error { - args := []string{"apply", "set-last-applied", "--create-annotation=true"} - args = append(args, "-f", url) - - if c.kubeConfigPath != "" { - args = append(args, "--kubeconfig", c.kubeConfigPath) - } - - if c.currentContext != "" { - args = append(args, "--context", c.currentContext) - } - - cmd := exec.Command("kubectl", args...) - out, err := cmd.CombinedOutput() - if err != nil { - return errors.Wrapf(err, "kubectl apply set-last-applied failed, output: %s", string(out)) - } - - return nil -} - -func (c *client) kubectlExplainResource(resource string) ([]byte, error) { - args := []string{"explain"} - if c.kubeConfigPath != "" { - args = append(args, "--kubeconfig", c.kubeConfigPath) - } - - if c.currentContext != "" { - args = append(args, "--context", c.currentContext) - } - - args = append(args, resource) - cmd := exec.Command("kubectl", args...) - out, err := cmd.CombinedOutput() - if err != nil { - return nil, errors.Wrapf(err, "kubectl explain failed, output: %s", string(out)) - } - return out, nil -} - -func (c *client) kubectlGetResource(resource string, args ...string) ([]byte, error) { - getargs := []string{"get"} - if c.kubeConfigPath != "" { - getargs = append(getargs, "--kubeconfig", c.kubeConfigPath) - } - - if c.currentContext != "" { - getargs = append(getargs, "--context", c.currentContext) - } - - getargs = append(getargs, resource) - getargs = append(getargs, args...) - cmd := exec.Command("kubectl", getargs...) - out, err := cmd.CombinedOutput() - if err != nil { - return nil, errors.Wrapf(err, "kubectl get failed, output: %s", string(out)) - } - return out, nil -} - -// GetPackage returns the package for given package name in a given namespace -func (c *client) GetPackage(carvelPkgName, carvelPkgNamespace string) (*kapppkgv1alpha1.Package, error) { - pkg := &kapppkgv1alpha1.Package{} - log.V(9).Infof("getting package:%s in namespace:%s", carvelPkgName, carvelPkgNamespace) - err := c.GetResource(pkg, carvelPkgName, carvelPkgNamespace, nil, nil) - if err != nil { - return pkg, errors.Wrapf(err, ErrUnableToGetPackage, carvelPkgName, carvelPkgNamespace) - } - return pkg, nil -} - -func (c *client) GetSecretValue(secretName, key, namespace string, pollOptions *PollOptions) ([]byte, error) { - var err error - - if pollOptions == nil { - pollOptions = &PollOptions{Interval: CheckResourceInterval, Timeout: c.operationTimeout} - } - - secret := &corev1.Secret{} - err = c.GetResource(secret, secretName, namespace, nil, pollOptions) - if err != nil { - return nil, err - } - - data, ok := secret.Data[key] - if !ok { - return nil, errors.Errorf("Unable to obtain %s field from secret's data", kubeConfigDataField) - } - - return data, nil -} - -func (c *client) GetKubeConfigForCluster(clusterName, namespace string, pollOptions *PollOptions) ([]byte, error) { - log.V(4).Info("getting secret for cluster") - clusterSecretName := fmt.Sprintf("%s-%s", clusterName, kubeConfigSecretSuffix) - kubeConfigBytes, err := c.GetSecretValue(clusterSecretName, kubeConfigDataField, namespace, pollOptions) - if err != nil { - return nil, err - } - - if sysrt.GOOS == "darwin" { - // grab kcp object machine Kind to determine infrastructure provider - infraProvider, err := c.GetInfrastructureMachineKindForCluster(clusterName, namespace) - if err != nil { - return nil, errors.Wrapf(err, "Error getting infrastructure provider for cluster with name %s", clusterName) - } - - // If this does not get applied on macOS and with the docker provider then stalling occurs - if infraProvider == constants.KindDockerMachineTemplate { - // get the docker client with environment options - ctx := context.Background() - cli, err := dockerclient.NewClientWithOpts(dockerclient.FromEnv) - if err != nil { - return nil, errors.Wrapf(err, "Error getting docker client when fixing kubeconfig") - } - return utils.FixKubeConfigForMacEnvironment(ctx, cli, kubeConfigBytes) - } - } - - return kubeConfigBytes, nil -} - -// GetInfrastructureMachineKindForCluster gets the kcp object infrastructure -// template's Kind using the cluster name and namespace -// TODO(dcline) write tests for this -func (c *client) GetInfrastructureMachineKindForCluster(clusterName, namespace string) (string, error) { - kcpObject, err := c.GetKCPObjectForCluster(clusterName, namespace) - if err != nil { - return "", err - } - - return kcpObject.Spec.MachineTemplate.InfrastructureRef.Kind, nil -} - -// GetCurrentNamespace returns the namespace from the current context in the kubeconfig file -func (c *client) GetCurrentNamespace() (string, error) { - kubeconfig := cluster.Kubeconfig{Path: c.kubeConfigPath, Context: c.currentContext} - clusterclient := cluster.New(kubeconfig, nil) - return clusterclient.Proxy().CurrentNamespace() -} - -func (c *client) CreateNamespace(name string) error { - namespace := &corev1.Namespace{} - namespace.Name = name - err := c.clientSet.Create(ctx, namespace) - if apierrors.IsAlreadyExists(err) { - return nil - } - return err -} - -func (c *client) GetCurrentClusterName(ctx string) (string, error) { - config, err := clientcmd.LoadFromFile(c.kubeConfigPath) - if err != nil { - return "", errors.Wrapf(err, "failed to load kubeconfig file from %q", c.kubeConfigPath) - } - - if ctx == "" { - ctx = config.CurrentContext - } - - for contextName, ctxObj := range config.Contexts { - if contextName == ctx { - return ctxObj.Cluster, nil - } - } - return "", errors.Errorf("unable to find cluster name from kubeconfig file: %q", c.kubeConfigPath) -} - -func (c *client) GetCurrentKubeContext() (string, error) { - config, err := clientcmd.LoadFromFile(c.kubeConfigPath) - if err != nil { - return "", errors.Wrapf(err, "failed to load kubeconfig file from %q", c.kubeConfigPath) - } - - return config.CurrentContext, nil -} - -// UseContext updates current-context in the kubeconfig file -// also updates the clientset of clusterclient to point to new cluster -func (c *client) UseContext(contextName string) error { - config, err := clientcmd.LoadFromFile(c.kubeConfigPath) - if err != nil { - return errors.Wrapf(err, "failed to load kubeconfig file from %q", c.kubeConfigPath) - } - if _, ok := config.Contexts[contextName]; !ok { - return errors.Errorf("context is not defined for %q in file %q", contextName, c.kubeConfigPath) - } - config.CurrentContext = contextName - err = clientcmd.WriteToFile(*config, c.kubeConfigPath) - if err != nil { - return err - } - // update the current clientset to point to new cluster - err = c.updateK8sClients(contextName) - if err != nil { - return err - } - return nil -} - -// ExportCurrentKubeconfigToFile saves the current kubeconfig to temporary file and returns the file -func (c *client) ExportCurrentKubeconfigToFile() (string, error) { - kubeConfigBytes, err := c.LoadCurrentKubeconfigBytes() - if err != nil { - return "", errors.Wrap(err, "unable to load current kubeconfig bytes") - } - filename, err := utils.CreateTempFile("", "tmp_kubeconfig") - if err != nil { - return "", errors.Wrap(err, "unable to save kubeconfig to temporary file") - } - err = utils.WriteToFile(filename, kubeConfigBytes) - if err != nil { - return "", errors.Wrap(err, "unable to write kubeconfig to temporary file") - } - return filename, nil -} - -// GetCurrentKubeconfigFile returns currently used kubeconfig file path based on default loading rules -func (c *client) GetCurrentKubeconfigFile() string { - return c.kubeConfigPath -} - -// IsRegionalCluster() checks if the current kube context point to a management cluster -func (c *client) IsRegionalCluster() error { - var providers clusterctlv1.ProviderList - - err := c.ListResources(&providers, &crtclient.ListOptions{}) - if err != nil { - return err - } - - for _, t := range providerTypes { - found := false - for i := range providers.Items { - if clusterctlv1.ProviderType(providers.Items[i].Type) == t { - found = true - break - } - } - - if !found { - return errors.Errorf("not a valid management cluster, missing provider: %s", string(t)) - } - } - - return nil -} - -func (c *client) GetRegionalClusterDefaultProviderName(providerType clusterctlv1.ProviderType) (string, error) { - var providers clusterctlv1.ProviderList - err := c.ListResources(&providers, &crtclient.ListOptions{}) - if err != nil { - return "", err - } - names := sets.NewString() - for i := range providers.Items { - if clusterctlv1.ProviderType(providers.Items[i].Type) == providerType { - names.Insert(providers.Items[i].ProviderName) - } - } - - // At time of writing, clusterctl has no notion of IPAM providers, so the - // the IPAM provider is masquerading as a plain old Infrastructure Provider - // Upcoming versions of clusterctl have the ability to install IPAM providers. - // TODO: When clusterctl is bumped to a version with IPAM providers, this delete - // can be removed. - names.Delete("ipam-in-cluster") - - // If there is only one provider, this is the default - if names.Len() == 1 { - return names.List()[0], nil - } - // There is no provider or more than one provider of this type; in both cases, a default provider name cannot be decided. - return "", errors.New("unable to find the default provider,since there are more than 1 providers") -} - -func (c *client) ListClusters(namespace string) ([]capi.Cluster, error) { - var clusters capi.ClusterList - - err := c.ListResources(&clusters, &crtclient.ListOptions{Namespace: namespace}) - if err != nil { - return nil, err - } - return clusters.Items, nil -} - -func (c *client) DeleteCluster(clusterName, namespace string) error { - isCCBasedCluster, err := c.IsClusterClassBased(clusterName, namespace) - if err != nil { - return errors.Wrap(err, "unable to determine cluster type") - } - isPacific, err := c.IsPacificRegionalCluster() - if err == nil && isPacific && !isCCBasedCluster { - tkcObj, err := c.GetPacificClusterObject(clusterName, namespace) - if err != nil { - errString := fmt.Sprintf("failed to get cluster object for delete: %s", err.Error()) - return errors.New(errString) - } - return c.DeleteResource(tkcObj) - } - clusterObject := &capi.Cluster{} - clusterObject.Name = clusterName - clusterObject.Namespace = namespace - - return c.DeleteResource(clusterObject) -} - -func (c *client) UpdateReplicas(resourceReference interface{}, resourceName, resourceNameSpace string, replicaCount int32) error { - patchReplicaCount := fmt.Sprintf("{\"spec\":{\"replicas\": %v}}", replicaCount) - err := c.PatchResource(resourceReference, resourceName, resourceNameSpace, patchReplicaCount, types.MergePatchType, nil) - if err != nil { - return errors.Wrap(err, "unable to patch the replica count") - } - return nil -} - -func (c *client) GetPacificTKCAPIVersion() (string, error) { - yamlOutput, err := c.poller.PollImmediateWithGetter(kubectlApplyRetryInterval, kubectlApplyRetryTimeout, func() (interface{}, error) { - return c.kubectlExplainResource("tkc") - }) - if err != nil { - return "", errors.Wrap(err, "failed to get kubectl explain response for tkc resource") - } - - yamlBytes := yamlOutput.([]byte) - re := regexp.MustCompile(`VERSION:(.*)\n`) - match := re.FindStringSubmatch(string(yamlBytes)) - if len(match) == 0 || strings.TrimSpace(match[1]) == "" { - return "", errors.Wrap(err, "failed to get TKC API version") - } - return strings.TrimSpace(match[1]), nil -} - -// VerifyExistenceOfCRD returns true if CRD exists else return false -func (c *client) VerifyExistenceOfCRD(resourceName, resourceGroup string) (bool, error) { - // Since we're looking up API types via discovery, we don't need the dynamic client. - clusterQueryClient, err := capdiscovery.NewClusterQueryClient(c.dynamicClient, c.discoveryClient) - if err != nil { - return false, err - } - - var queryObject = capdiscovery.Group(resourceName, resourceGroup).WithResource(resourceName) - - // Build query client. - cqc := clusterQueryClient.Query(queryObject) - - // Execute returns combined result of all queries. - return cqc.Execute() // return (found, err) response -} - -func (c *client) IsPacificRegionalCluster() (bool, error) { - return c.isTKCCrdAvailableInTanzuRunAPIGroup() -} - -func (c *client) isTKCCrdAvailableInTanzuRunAPIGroup() (bool, error) { - // for pacific we should be able to fetch the api group "run.tanzu.vmware.com" - data, err := c.discoveryClient.RESTClient().Get().AbsPath(constants.TanzuRunAPIGroupPath).Do(context.Background()).Raw() - if err != nil { - // If the url is not available return false - if apierrors.IsNotFound(err) { - return false, nil - } - } - // fetch the groupVersion from the preferred version in api group - var groupdata interface{} - err = json.Unmarshal(data, &groupdata) - if err != nil { - return false, err - } - groupversion, err := jsonpath.Read(groupdata, "$.preferredVersion.groupVersion") - if err != nil { - return false, errors.Wrap(err, "failed to read group version") - } - - groupVersionURL := fmt.Sprintf("/apis/%s", groupversion.(string)) - data, err = c.discoveryClient.RESTClient().Get().AbsPath(groupVersionURL).Do(context.Background()).Raw() - if err != nil { - // If the url is not available return false - if apierrors.IsNotFound(err) { - return false, nil - } - return false, errors.Wrapf(err, "failed to get resources in %s", groupVersionURL) - } - - var resourceslist interface{} - err = json.Unmarshal(data, &resourceslist) - if err != nil { - return false, errors.Wrap(err, "unable to unmarshall the resources list") - } - // get all resource kinds - kinds, err := jsonpath.Read(resourceslist, "$.resources[*].kind") - if err != nil { - return false, nil - } - // check for resource of kind "TanzuKubernetesCluster" - kindlist := kinds.([]interface{}) - for _, kind := range kindlist { - if kind.(string) == "TanzuKubernetesCluster" { - return true, nil - } - } - return false, nil -} - -func (c *client) PatchK8SVersionToPacificCluster(clusterName, namespace, kubernetesVersion string) error { - tkcObj, err := c.GetPacificClusterObject(clusterName, namespace) - if err != nil { - return errors.Wrap(err, "failed to patch kubernetes version") - } - tkrName := utils.GetTkrNameFromTkrVersion(kubernetesVersion) - if !strings.HasPrefix(tkrName, "v") { - tkrName = "v" + tkrName - } - - // patch tkrName for control plane - payload := []JSONPatch{{ - Op: "replace", - Path: "/spec/topology/controlPlane/tkr/reference/name", - Value: tkrName, - }} - // patch tkrName for nodepools - numOfNodepools := len(tkcObj.Spec.Topology.NodePools) - for idx := 0; idx < numOfNodepools; idx++ { - nodepoolPatch := JSONPatch{ - Op: "replace", - Path: fmt.Sprintf("/spec/topology/nodePools/%d/tkr/reference/name", idx), - Value: tkrName, - } - payload = append(payload, nodepoolPatch) - } - - payloadBytes, err := json.Marshal(payload) - if err != nil { - return errors.Wrap(err, "unable to generate json patch") - } - log.V(3).Infof("Applying TanzuKubernetesCluster kubernetes version update patch: %s", string(payloadBytes)) - err = c.PatchResource(tkcObj, clusterName, namespace, string(payloadBytes), types.JSONPatchType, nil) - if err != nil { - return errors.Wrap(err, "unable to patch the k8s version for tkc object") - } - return nil -} - -func (c *client) ScalePacificClusterControlPlane(clusterName, namespace string, controlPlaneCount int32) error { - tkcObj, err := c.GetPacificClusterObject(clusterName, namespace) - if err != nil { - return err - } - - payloadFormatStr := `[{"op":"replace","path":"/spec/topology/controlPlane/replicas","value":%d}]` - payloadBytes := fmt.Sprintf(payloadFormatStr, controlPlaneCount) - log.V(3).Infof("Applying TanzuKubernetesCluster controlplane replicas update patch: %s", payloadBytes) - err = c.PatchResource(tkcObj, clusterName, namespace, payloadBytes, types.JSONPatchType, nil) - if err != nil { - return errors.Wrap(err, "unable to patch the cluster controlPlane count") - } - return nil -} - -func (c *client) ScalePacificClusterWorkerNodes(clusterName, namespace string, workersCount int32) error { - tkcObj, err := c.GetPacificClusterObject(clusterName, namespace) - if err != nil { - return err - } - patchPacificWorkersCount := fmt.Sprintf("{\"spec\":{ \"topology\":{\"workers\":{\"count\": %v}}}}", workersCount) - err = c.PatchResource(tkcObj, clusterName, namespace, patchPacificWorkersCount, types.MergePatchType, nil) - if err != nil { - return errors.Wrap(err, "unable to patch the cluster workers count") - } - return nil -} - -func (c *client) WaitForPacificCluster(clusterName, namespace string) error { - var err error - start := time.Now() - errcount := 0 - err = c.poller.PollImmediateInfiniteWithGetter(CheckClusterInterval, func() (interface{}, error) { - tkcObj, err := c.GetPacificClusterObject(clusterName, namespace) - if err != nil { - if CheckClusterInterval*time.Duration(errcount) > 2*time.Minute { - return true, err - } - errcount++ - return false, err - } - errcount = 0 - if utils.IsFalse(tkcObj, capiv1alpha3.ReadyCondition) && - (*utils.GetSeverity(tkcObj, capiv1alpha3.ReadyCondition) == capiv1alpha3.ConditionSeverityError) { - return true, errors.Errorf("cluster is in failed state, reason:'%s', message:'%s'", - utils.GetReason(tkcObj, capiv1alpha3.ReadyCondition), - utils.GetMessage(tkcObj, capiv1alpha3.ReadyCondition)) - } - if utils.IsTrue(tkcObj, capiv1alpha3.ReadyCondition) { - return false, nil - } - if time.Since(start) > c.operationTimeout { - return true, errors.Errorf("time out waiting for the cluster to be ready") - } - msg := utils.GetMessage(tkcObj, capiv1alpha3.ReadyCondition) - reason := utils.GetReason(tkcObj, capiv1alpha3.ReadyCondition) - return false, errors.Errorf("cluster is still not provisioned, reason:'%s', message: '%s' ", reason, msg) - }) - return err -} - -func (c *client) GetPacificClusterObject(clusterName, namespace string) (*tkgsv1alpha2.TanzuKubernetesCluster, error) { - var err error - if namespace == "" { - if namespace, err = c.GetCurrentNamespace(); err != nil { - return nil, err - } - } - tkcObj := &tkgsv1alpha2.TanzuKubernetesCluster{} - if err := c.GetResource(tkcObj, clusterName, namespace, nil, nil); err != nil { - return nil, errors.Wrapf(err, "failed to get TKC object in namespace: '%s'", namespace) - } - return tkcObj, nil -} - -// ListPacificClusterObjects returns list of TanzuKubernetesCluster as interface -func (c *client) ListPacificClusterObjects(apiVersion string, listOptions *crtclient.ListOptions) ([]interface{}, error) { - // if version is not supplied, get the pacific TKC api version - var err error - if apiVersion == "" { - apiVersion, err = c.GetPacificTKCAPIVersion() - if err != nil { - return nil, errors.Wrap(err, "unable to get TKC API Version") - } - } - - // Create TanzuKubernetesClusterList object - tkcObjList := &unstructured.UnstructuredList{} - tkcObjList.SetKind(constants.PacificClusterListKind) - tkcObjList.SetAPIVersion(apiVersion) - if err := c.clientSet.List(ctx, tkcObjList, listOptions); err != nil { - return nil, errors.Wrap(err, "failed to list TanzuKubernetesCluster objects") - } - - jsonoutput, _ := tkcObjList.MarshalJSON() - var clusterList interface{} - err = json.Unmarshal(jsonoutput, &clusterList) - if err != nil { - return nil, errors.Wrap(err, "failed to json unmarshal TanzuKubernetesClusterList object") - } - items, err := jsonpath.Read(clusterList, "$.items") - if err != nil { - return nil, errors.Wrap(err, "failed to read TanzuKubernetesClusterList with json path") - } - clusters := items.([]interface{}) - return clusters, nil -} - -func (c *client) verifyPacificK8sVersionUpdate(clusterName, namespace, newK8sVersion string) error { - workerMachines, err := c.getWorkerMachineObjectsForPacificCluster(clusterName, namespace) - if err != nil { - return errors.Wrap(err, "failed to get worker machine objects to verify k8s version update") - } - - unupgradedMachineList := []string{} - for i := range workerMachines { - if workerMachines[i].Spec.Version == nil || !strings.HasPrefix(strings.TrimPrefix(newK8sVersion, "v"), strings.TrimPrefix(*workerMachines[i].Spec.Version, "v")) { - log.V(9).Infof("worker machine '%s' is still not upgraded, current kubernetes version:'%s' but expecting :'%s'", - workerMachines[i].Name, strings.TrimPrefix(*workerMachines[i].Spec.Version, "v"), strings.TrimPrefix(newK8sVersion, "v")) - unupgradedMachineList = append(unupgradedMachineList, workerMachines[i].Name) - } - } - - if len(unupgradedMachineList) > 0 { - return errors.Errorf("worker machines %v are still not upgraded", unupgradedMachineList) - } - return nil -} - -func (c *client) getWorkerMachineObjectsForPacificCluster(clusterName, namespace string) ([]capiv1alpha3.Machine, error) { - mdList := &capiv1alpha3.MachineList{} - if err := c.GetResourceList(mdList, clusterName, namespace, nil, nil); err != nil { - return nil, err - } - - workerMachines := []capiv1alpha3.Machine{} - for i := range mdList.Items { - if _, labelFound := mdList.Items[i].Labels[capi.MachineControlPlaneLabelName]; !labelFound { - workerMachines = append(workerMachines, mdList.Items[i]) - } - } - return workerMachines, nil -} - -// WaitForPacificClusterK8sVersionUpdate waits for Pacific cluster K8s version upgrade to complete. -func (c *client) WaitForPacificClusterK8sVersionUpdate(clusterName, namespace, newK8sVersion string) error { - var err error - counter := 0 - interval := 15 * time.Second - errcount := 0 - - getterFunc := func() (interface{}, error) { - var tkcObj *tkgsv1alpha2.TanzuKubernetesCluster - tkcObj, err = c.GetPacificClusterObject(clusterName, namespace) - if err != nil { - // if control-plane API server couldn't respond to the get TKC object requests for more than 2 minutes continuously, - // break from poll with error instead of waiting for long time period - if interval*time.Duration(errcount) > 2*time.Minute { - return true, err - } - errcount++ - return false, err - } - - errcount = 0 - if utils.IsFalse(tkcObj, capiv1alpha3.ReadyCondition) && - (*utils.GetSeverity(tkcObj, capiv1alpha3.ReadyCondition) == capiv1alpha3.ConditionSeverityError) { - return true, errors.Errorf("cluster kubernetes version update failed, reason:'%s', message:'%s'", - utils.GetReason(tkcObj, capiv1alpha3.ReadyCondition), - utils.GetMessage(tkcObj, capiv1alpha3.ReadyCondition)) - } - if utils.IsTrue(tkcObj, capiv1alpha3.ReadyCondition) { - // check if the version is updated on worker nodes, if yes return - err = c.verifyPacificK8sVersionUpdate(clusterName, namespace, newK8sVersion) - if err == nil { - return false, nil - } - } else { - // any other status is still consider as upgrade still in progress - err = errors.New("cluster kubernetes version is still being upgraded") - } - // still updating, keep waiting - counter++ - // if wait time is more than operationTimeout, return error - if interval*time.Duration(counter) > c.operationTimeout { - return true, errors.New("timed out waiting for upgrade to complete. Upgrade is still in progress, you can check the status using `tanzu cluster get` command") - } - - return false, err - } - return c.poller.PollImmediateInfiniteWithGetter(interval, getterFunc) -} - -func (c *client) GetPacificTanzuKubernetesReleases() ([]string, error) { - result, err := c.poller.PollImmediateWithGetter(kubectlApplyRetryInterval, kubectlApplyRetryTimeout, func() (interface{}, error) { - return c.kubectlGetResource("tanzukubernetesrelease", "-o=custom-columns=VERSION:.spec.version", "--no-headers") - }) - if err != nil { - return nil, errors.Wrapf(err, "failed to get 'tanzukubernetesrelease' from vSphere with Kubernetes") - } - outbytes := result.([]byte) - versions := strings.Fields(string(outbytes)) - return versions, nil -} - -// PatchCalicoNodeDaemonSetWithNewNodeSelector patches calico daemonset with new nodeSelector -func (c *client) PatchCalicoNodeDaemonSetWithNewNodeSelector(selectorKey, selectorValue string) error { // nolint:dupl - ds := &appsv1.DaemonSet{} - if err := c.GetResource(ds, calicoNodeKey, metav1.NamespaceSystem, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - // if ds is missing, return without errors - return nil - } - return errors.Wrapf(err, "failed to look up '%s' daemonset", calicoNodeKey) - } - - helper, err := patch.NewHelper(ds, c.clientSet) - if err != nil { - return err - } - - // If selector already present, skip patch operation - for key, value := range ds.Spec.Template.Spec.NodeSelector { - if key == selectorKey && value == selectorValue { - log.V(3).Infof("nodeSelector '%v: %v' already present for '%v' daemonset, skipping patch operation", selectorKey, selectorValue, calicoNodeKey) - return nil - } - } - - log.V(3).Infof("Patching '%s' daemonset...", calicoNodeKey) - nodeSelectorMap := map[string]string{} - nodeSelectorMap[selectorKey] = selectorValue - ds.Spec.Template.Spec.NodeSelector = nodeSelectorMap - err = helper.Patch(ctx, ds) - if err != nil { - return errors.Wrapf(err, "unable to update the '%s' daemonset", calicoNodeKey) - } - return nil -} - -// PatchCalicoKubeControllerDeploymentWithNewNodeSelector patches calico-kube-controller deployment with new nodeSelector -func (c *client) PatchCalicoKubeControllerDeploymentWithNewNodeSelector(selectorKey, selectorValue string) error { // nolint:dupl - deployment := &appsv1.Deployment{} - if err := c.GetResource(deployment, calicoKubeControllerKey, metav1.NamespaceSystem, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - // if deployment is missing, return without errors - return nil - } - return errors.Wrapf(err, "failed to look up '%s' deployment", calicoKubeControllerKey) - } - - helper, err := patch.NewHelper(deployment, c.clientSet) - if err != nil { - return err - } - - // If selector already present, skip patch operation - for key, value := range deployment.Spec.Template.Spec.NodeSelector { - if key == selectorKey && value == selectorValue { - log.V(3).Infof("nodeSelector '%v: %v' already present for '%v' deployment, skipping patch operation", selectorKey, selectorValue, calicoKubeControllerKey) - return nil - } - } - - log.V(3).Infof("Patching '%s' deployment...", calicoKubeControllerKey) - nodeSelectorMap := map[string]string{} - nodeSelectorMap[selectorKey] = selectorValue - deployment.Spec.Template.Spec.NodeSelector = nodeSelectorMap - err = helper.Patch(ctx, deployment) - if err != nil { - return errors.Wrapf(err, "unable to update the '%s' deployment", calicoKubeControllerKey) - } - return nil -} - -// PatchImageRepositoryInKubeProxyDaemonSet updates kubeproxy daemonset with new/custom image repository -func (c *client) PatchImageRepositoryInKubeProxyDaemonSet(newImageRepository string) error { - ds := &appsv1.DaemonSet{} - if err := c.GetResource(ds, kubeProxyKey, metav1.NamespaceSystem, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - // if kube-proxy is missing, return without errors - return nil - } - return errors.Wrapf(err, "failed to look up '%s' daemonset", kubeProxyKey) - } - - findKubeProxyContainer := func(ds *appsv1.DaemonSet) *corev1.Container { - containers := ds.Spec.Template.Spec.Containers - for idx := range containers { - if containers[idx].Name == kubeProxyKey { - return &containers[idx] - } - } - return nil - } - patchKubeProxyImage := func(ds *appsv1.DaemonSet, image string) { - containers := ds.Spec.Template.Spec.Containers - for idx := range containers { - if containers[idx].Name == kubeProxyKey { - containers[idx].Image = image - } - } - } - - container := findKubeProxyContainer(ds) - if container == nil { - return nil - } - - newImageName, err := containerutil.ModifyImageRepository(container.Image, newImageRepository) - if err != nil { - return err - } - - // TODO: current image accessibility verification is based on machine where TKG CLI is used. - // It would be better to perform the image accessibility check in the target infra instead. - err = docker.VerifyImageIsAccessible(newImageName) - if err != nil { - log.Warningf("Warning: Image accessibility verification failed. Image %s is not reachable from current machine. Please make sure the image is pullable from the Kubernetes node for upgrade to complete successfully", newImageName) - } - - if container.Image != newImageName { - helper, err := patch.NewHelper(ds, c.clientSet) - if err != nil { - return err - } - patchKubeProxyImage(ds, newImageName) - err = helper.Patch(ctx, ds) - if err != nil { - return errors.Wrap(err, "unable to update the kube-proxy daemonset") - } - } - return nil -} - -// PatchKappControllerLastAppliedAnnotation ensures the kapp-controller deployment on the cluster has last-applied annotation -func (c *client) PatchKappControllerLastAppliedAnnotation(namespace string) error { - result, err := c.poller.PollImmediateWithGetter(kubectlApplyRetryInterval, kubectlApplyRetryTimeout, func() (interface{}, error) { - return c.kubectlGetResource("deployment", "kapp-controller", "-n", namespace, "-o", "yaml") - }) - if err != nil { - return errors.Wrap(err, "failed to get kapp-controller deployment from cluster") - } - kappYaml := result.([]byte) - // Skip adding last-applied annotation if already has it - if strings.Contains(string(kappYaml), kubectlApplyLastAppliedAnnotation) { - return nil - } - - f, err := os.CreateTemp("", "kubeapply-") - if err != nil { - return errors.Wrap(err, "unable to create temp file") - } - defer removeAppliedFile(f) - if err := os.WriteFile(f.Name(), kappYaml, constants.ConfigFilePermissions); err != nil { - return errors.Wrap(err, "unable to write temp file") - } - - if _, err := c.poller.PollImmediateWithGetter(kubectlApplyRetryInterval, kubectlApplyRetryTimeout, func() (interface{}, error) { - return nil, c.kubectlApplySetLastApplied(f.Name()) - }); err != nil { - return errors.Wrap(err, "failed to add last-applied annotation on kapp-controller deployment") - } - return nil -} - -// PatchClusterAPIAWSControllersToUseEC2Credentials ensures that the Cluster API Provider AWS -// controller is pinned to control plane nodes and is running without static credentials such -// that Cluster API AWS runs using the EC2 instance profile attached to the control plane node. -// This is done by zeroing out the credentials secret for CAPA, causing the AWS SDK to fall back -// to the default credential provider chain. We additionally patch the deployment to ensure -// the controller has node affinity to only run on the control plane nodes. -// This should NOT be used when running Cluster API Provider AWS on managed control planes, e.g. EKS -func (c *client) PatchClusterAPIAWSControllersToUseEC2Credentials() error { - ns := &corev1.Namespace{} - if err := c.GetResource(ns, CAPAControllerNamespace, CAPAControllerNamespace, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - // no capa-system namespace, return without errors - return nil - } - return err - } - - log.V(6).Info("Kubernetes Cluster API Provider AWS detected, attempting to zero out credentials and pivot to EC2 instance profile") - - creds := &corev1.Secret{} - if err := c.GetResource(creds, CAPACredentialsSecretName, CAPAControllerNamespace, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - // Warn if secret isn't found - log.V(4).Warningf("Could not find Kubernetes Cluster API Provider AWS credentials secret: %s/%s ", CAPAControllerNamespace, CAPACredentialsSecretName) - return nil - } - return err - } - - if creds.StringData == nil { - creds.StringData = map[string]string{} - } - creds.StringData["credentials"] = "\n" - - if err := c.clientSet.Update(ctx, creds); err != nil { - return errors.Wrap(err, "unable to update the Cluster API Provider AWS credentials secret") - } - - deployment := &appsv1.Deployment{} - if err := c.GetResource(deployment, CAPAControllerDeploymentName, CAPAControllerNamespace, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - // Warn, but do not block if controller deployment is not found - log.V(4).Warningf("Could not find Kubernetes Cluster API Provider AWS controller deployment: %s/%s ", CAPAControllerNamespace, CAPAControllerDeploymentName) - return nil - } - return err - } - - helper, err := patch.NewHelper(deployment, c.clientSet) - if err != nil { - return err - } - capaPodSpec := &deployment.Spec.Template.Spec - ensurePodSpecControlPlaneAffinity(capaPodSpec) - if err := helper.Patch(ctx, deployment); err != nil { - return errors.Wrap(err, "unable to update the Cluster API Provider AWS deployment") - } - - return nil -} - -// PatchCoreDNSImageRepositoryInKubeadmConfigMap updates kubeadm-config configMap with new/custom image repository -func (c *client) PatchCoreDNSImageRepositoryInKubeadmConfigMap(newImageRepository string) error { - if newImageRepository == "" { - return nil - } - - kubedmconfigmap := &corev1.ConfigMap{} - if err := c.GetResource(kubedmconfigmap, kubeadmConfigKey, metav1.NamespaceSystem, nil, nil); err != nil { - if apierrors.IsNotFound(err) { - // if kubeadm-config ConfigMap is missing, return without errors - return nil - } - return errors.Wrapf(err, "failed to determine if %s ConfigMap already exists", kubeadmConfigKey) - } - - if err := UpdateCoreDNSImageRepositoryInKubeadmConfigMap(kubedmconfigmap, newImageRepository); err != nil { - return err - } - - if err := c.clientSet.Update(ctx, kubedmconfigmap); err != nil { - return errors.Wrap(err, "error updating kubeadm ConfigMap") - } - return nil -} - -// GetPinnipedIssuerURLAndCA fetches Pinniped supervisor IssuerURL and IssuerCA data from management cluster -func (c *client) GetPinnipedIssuerURLAndCA() (string, string, error) { - configMap, err := c.getPinnipedInfoConfigMap() - if err != nil { - return "", "", errors.Wrap(err, "failed to get pinniped-info ConfigMap") - } - issuerURL, ok := configMap.Data["issuer"] - if !ok { - return "", "", errors.New("failed to read issuer value from the pinniped-info ConfigMap") - } - log.V(9).Infof("Pinniped issuer URL fetched from ConfigMap is : %s ", issuerURL) - - issuerCA, ok := configMap.Data["issuer_ca_bundle_data"] - if !ok || issuerCA == "" { - return "", "", errors.New("failed to get pinniped issuer CA data") - } - - return issuerURL, issuerCA, nil -} - -// getPinnipedInfoConfigMap return the pinniped-info ConfigMap -func (c *client) getPinnipedInfoConfigMap() (corev1.ConfigMap, error) { - configMap := corev1.ConfigMap{} - - pollOptions := &PollOptions{Interval: CheckResourceInterval, Timeout: 5 * CheckResourceInterval} - err := c.GetResource(&configMap, "pinniped-info", "kube-public", nil, pollOptions) - if err != nil { - return corev1.ConfigMap{}, err - } - - return configMap, nil -} - -// DeleteExistingKappController deletes kapp-controller that already exists in the cluster. -func (c *client) DeleteExistingKappController() error { - if err := c.GetResource(&appsv1.Deployment{}, kappControllerKey, kappControllerNamespace, nil, nil); err != nil { - if !apierrors.IsNotFound(err) { - return errors.Wrapf(err, "failed to determine if %s deployment already exists in %s namespace", kappControllerKey, kappControllerNamespace) - } - } else { - // If kapp-controller deployment is found in tkg-system namespace, then dont delete anything and return. - return nil - } - - deployment := &appsv1.Deployment{} - if err := c.GetResource(deployment, kappControllerKey, kappControllerOldNamespace, nil, nil); err != nil { - if !apierrors.IsNotFound(err) { - return errors.Wrapf(err, "failed to determine if %s deployment already exists in %s namespace", kappControllerKey, kappControllerOldNamespace) - } - } else { - if err := c.DeleteResource(deployment); err != nil { - return err - } - } - - clusterRoleBinding := &rbacv1.ClusterRoleBinding{} - if err := c.GetResource(clusterRoleBinding, kappControllerClusterRoleBinding, "", nil, nil); err != nil { - if !apierrors.IsNotFound(err) { - return errors.Wrapf(err, "failed to determine if %s cluster role binding already exists", kappControllerClusterRoleBinding) - } - } else { - if err := c.DeleteResource(clusterRoleBinding); err != nil { - return err - } - } - - clusterRole := &rbacv1.ClusterRole{} - if err := c.GetResource(clusterRole, kappControllerClusterRole, "", nil, nil); err != nil { - if !apierrors.IsNotFound(err) { - return errors.Wrapf(err, "failed to determine if %s cluster role already exists", kappControllerClusterRole) - } - } else { - if err := c.DeleteResource(clusterRole); err != nil { - return err - } - } - - serviceAccount := &corev1.ServiceAccount{} - if err := c.GetResource(serviceAccount, kappControllServiceAccount, kappControllerOldNamespace, nil, nil); err != nil { - if !apierrors.IsNotFound(err) { - return errors.Wrapf(err, "failed to determine if %s service account already exists in %s namesapce", kappControllServiceAccount, kappControllerOldNamespace) - } - } else { - if err := c.DeleteResource(serviceAccount); err != nil { - return err - } - } - - return nil -} - -// UpdateAWSCNIIngressRules updates the cniIngressRules for AWSCluster with the given new rule. -func (c *client) UpdateAWSCNIIngressRules(clusterName, clusterNamespace string, newRule capav1beta2.CNIIngressRule) error { - awsCluster := &capav1beta2.AWSCluster{} - if err := c.GetResource(awsCluster, clusterName, clusterNamespace, nil, nil); err != nil { - return err - } - - if awsCluster.Spec.NetworkSpec.CNI == nil { - awsCluster.Spec.NetworkSpec.CNI = &capav1beta2.CNISpec{} - } - - if awsCluster.Spec.NetworkSpec.CNI.CNIIngressRules == nil { - awsCluster.Spec.NetworkSpec.CNI.CNIIngressRules = capav1beta2.CNIIngressRules{} - } - - cniIngressRules := awsCluster.Spec.NetworkSpec.CNI.CNIIngressRules - // first check if existing ingress rules already contain the new rule - for _, ingressRule := range cniIngressRules { - if ingressRule.Description != newRule.Description { - continue - } - - if ingressRule.Protocol != newRule.Protocol { - continue - } - - if ingressRule.FromPort != newRule.FromPort || ingressRule.ToPort != newRule.ToPort { - continue - } - // If we get here it means the rule exists, so we do nothing. - return nil - } - - // rule was not found so we add it - cniIngressRules = append(cniIngressRules, newRule) - - awsCluster.Spec.NetworkSpec.CNI.CNIIngressRules = cniIngressRules - err := retry.RetryOnConflict(retry.DefaultRetry, func() error { - return c.UpdateResource(awsCluster, clusterName, clusterNamespace) - }) - - return err -} - -// RemoveCEIPTelemetryJob removes installed telemetry job -func (c *client) RemoveCEIPTelemetryJob(clusterName string) error { - hasCeip, err := c.HasCEIPTelemetryJob(clusterName) - if err != nil { - return errors.Wrap(err, "failed to find telemetry cronjob") - } - if !hasCeip { - // Don't attempt to delete cronjob if it doesn't exist - return nil - } - jobResource := &batchv1.CronJob{} - jobResource.Namespace = constants.CeipNamespace - jobResource.Name = constants.CeipJobName - err = c.DeleteResource(jobResource) - if err != nil { - return errors.Wrap(err, "failed to delete telemetry cronjob") - } - return nil -} - -func (c *client) AddCEIPTelemetryJob(clusterName, providerName string, bomConfig *tkgconfigbom.BOMConfiguration, isProd, labelsStr, httpProxy, httpsProxy, noProxy string) error { - var telemetryPath string - log.V(5).Infof("IsProd: %s", isProd) - if buildinfo.IsOfficialBuild == "True" { - telemetryPath = prodTelemetryPath - } else { - telemetryPath = stageTelemetryPath - } - - if isProd != "" { - isProdVal, _ := strconv.ParseBool(isProd) - if isProdVal { - telemetryPath = prodTelemetryPath - } else { - telemetryPath = stageTelemetryPath - } - } - log.V(5).Infof("IsOfficialBuild: %s", buildinfo.IsOfficialBuild) - - fullImagePath := tkgconfigbom.GetFullImagePath(bomConfig.Components["tkg_telemetry"][0].Images[telemetryBomImagesMapKey], bomConfig.ImageConfig.ImageRepository) - imageRepository := fullImagePath + ":" + bomConfig.Components["tkg_telemetry"][0].Images[telemetryBomImagesMapKey].Tag - - telemetryConfigFilePath := embeddedTelemetryConfigYamlPrefix + providerName + ".yaml" - telemetryConfigYaml, err := telemetrymanifests.Asset(telemetryConfigFilePath) - if err != nil { - return errors.Wrap(err, "failed to parse telemetry spec yaml") - } - log.V(5).Infof(string(telemetryConfigYaml), clusterName, imageRepository, telemetryPath, labelsStr, httpProxy, httpsProxy, noProxy) - err = c.kubectlApply(fmt.Sprintf(string(telemetryConfigYaml), clusterName, imageRepository, telemetryPath, labelsStr, httpProxy, httpsProxy, noProxy)) - if err != nil { - return errors.Wrap(err, "failed to apply telemetry spec") - } - return nil -} - -// HasCEIPTelemetryJob check whether CEIP telemetry job is present or not -func (c *client) HasCEIPTelemetryJob(clusterName string) (bool, error) { - cronJobs := &batchv1.CronJobList{} - err := c.GetResourceList(cronJobs, clusterName, constants.CeipNamespace, nil, nil) - if err != nil { - return false, errors.Wrap(err, "failed to find telemetry cronjob") - } - return len(cronJobs.Items) > 0, nil -} - -// IsClusterRegisteredToTMC() returns true if cluster is registered to Tanzu Mission Control -func (c *client) IsClusterRegisteredToTMC() (bool, error) { - restconfigClient, err := c.GetRestConfigClient() - if err != nil { - return false, err - } - clusterQueryClient, err := capdiscovery.NewClusterQueryClientForConfig(restconfigClient) - if err != nil { - return false, err - } - - // Check if 'cluster-agent' resource of type 'agents.clusters.tmc.cloud.vmware.com/v1alpha1' present - // in 'vmware-system-tmc' namespace. If present, we can say the cluster is registered to TMC - agent := &corev1.ObjectReference{ - Kind: "Agent", - Name: "cluster-agent", - Namespace: constants.TmcNamespace, - APIVersion: "clusters.tmc.cloud.vmware.com/v1alpha1", - } - var testObject = capdiscovery.Object("tmcClusterAgentObj", agent) - - // Build query client. - cqc := clusterQueryClient.Query(testObject) - - // Execute returns combined result of all queries. - return cqc.Execute() // return (found, err) response -} - -// VerifyCLIPluginCRD returns true if CRD exists else return false -func (c *client) VerifyCLIPluginCRD() (bool, error) { - // Since we're looking up API types via discovery, we don't need the dynamic client. - clusterQueryClient, err := capdiscovery.NewClusterQueryClient(c.dynamicClient, c.discoveryClient) - if err != nil { - return false, err - } - - var queryObject = capdiscovery.Group("cliPlugins", cliv1alpha1.GroupVersionKindCLIPlugin.Group).WithResource("cliplugins") - - // Build query client. - cqc := clusterQueryClient.Query(queryObject) - - // Execute returns combined result of all queries. - return cqc.Execute() // return (found, err) response -} - -// ListCLIPluginResources lists CLIPlugin resources across all namespaces -func (c *client) ListCLIPluginResources() ([]cliv1alpha1.CLIPlugin, error) { - var cliPlugins cliv1alpha1.CLIPluginList - err := c.ListResources(&cliPlugins, &crtclient.ListOptions{Namespace: ""}) - if err != nil { - return nil, err - } - return cliPlugins.Items, nil -} - -// GetCLIPluginImageRepositoryOverride returns map of image repository override -func (c *client) GetCLIPluginImageRepositoryOverride() (map[string]string, error) { - cmList := &corev1.ConfigMapList{} - - labelMatch, _ := labels.NewRequirement(constants.CLIPluginImageRepositoryOverrideLabel, selection.Exists, []string{}) - labelSelector := labels.NewSelector() - labelSelector = labelSelector.Add(*labelMatch) - - err := c.ListResources(cmList, &crtclient.ListOptions{Namespace: constants.TanzuCLISystemNamespace, LabelSelector: labelSelector}) - if err != nil { - return nil, err - } - - imageRepoMap := make(map[string]string) - - for _, cm := range cmList.Items { //nolint:gocritic - mapString, ok := cm.Data["imageRepoMap"] - if !ok { - continue - } - irm := make(map[string]string) - err = yaml.Unmarshal([]byte(mapString), &irm) //nolint:ineffassign,staticcheck - for k, v := range irm { - if _, exists := imageRepoMap[k]; exists { - return nil, errors.Errorf("multiple references of image repository %q found while doing image repository override", k) - } - imageRepoMap[k] = v - } - } - - return imageRepoMap, nil -} - -// IsClusterClassBased check whether cluster is ClusterClass based or not -func (c *client) IsClusterClassBased(clusterName, namespace string) (bool, error) { - clusterObj := &capi.Cluster{} - if err := c.GetResource(clusterObj, clusterName, namespace, nil, nil); err != nil { - return false, err - } - if clusterObj.Spec.Topology == nil || clusterObj.Spec.Topology.Class == "" { - return false, nil - } - - // Make sure that Cluster resource doesn't have ownerRef indicating that other - // resource is managing this Cluster resource. When cluster is created through - // TKC API, the cluster resource will have ownerRef set - ownerRefs := clusterObj.GetOwnerReferences() - for i := range ownerRefs { - if ownerRefs[i].Kind == constants.KindTanzuKubernetesCluster { - return false, nil - } - } - - return true, nil -} - -func (c *client) RemoveMatchingMetadataFromResources(gvk schema.GroupVersionKind, namespace string, metadataKey string, keysToRemove []string) error { - if len(keysToRemove) == 0 { - return nil - } - resource := &unstructured.UnstructuredList{} - resource.SetGroupVersionKind(schema.GroupVersionKind{ - Group: gvk.Group, - Kind: fmt.Sprintf("%sList", gvk.Kind), - Version: gvk.Version, - }) - - err := c.ListResources(resource, &crtclient.ListOptions{Namespace: namespace}) - if err != nil { - return err - } - var removePatches []string - for _, key := range keysToRemove { - removePatches = append(removePatches, fmt.Sprintf("%q: null", key)) - } - pollOptions := NewPollOptions(getClientDefaultInterval, getClientDefaultTimeout) - patchString := fmt.Sprintf(`{"metadata": {%q: {%s}}}`, metadataKey, strings.Join(removePatches, ",")) - for _, item := range resource.Items { - if err := c.PatchResource(&item, item.GetName(), namespace, patchString, types.MergePatchType, pollOptions); err != nil { - return errors.Wrapf(err, "error while removing %s %v on %s %s/%s", metadataKey, keysToRemove, item.GetKind(), item.GetName(), namespace) - } - } - return nil -} - -// Options provides way to customize creation of clusterClient -type Options struct { - poller Poller - crtClientFactory CrtClientFactory - discoveryClientFactory DiscoveryClientFactory - dynamicClientFactory DynamicClientFactory - GetClientInterval time.Duration - GetClientTimeout time.Duration - OperationTimeout time.Duration - verificationClientFactory *VerificationClientFactory -} - -// NewOptions returns new options -func NewOptions(poller Poller, crtClientFactory CrtClientFactory, discoveryClientFactory DiscoveryClientFactory, verificationClientFactory *VerificationClientFactory) Options { - return Options{ - poller: poller, - crtClientFactory: crtClientFactory, - discoveryClientFactory: discoveryClientFactory, - verificationClientFactory: verificationClientFactory, - } -} - -// NewClient creates new clusterclient from kubeconfig file and poller -// if kubeconfig path is empty it gets default path -// if options.poller is nil it creates default poller. You should only pass custom poller for unit testing -// if options.crtClientFactory is nil it creates default CrtClientFactory -func NewClient(kubeConfigPath string, context string, options Options) (Client, error) { // nolint:gocritic - var err error - var rules *clientcmd.ClientConfigLoadingRules - if kubeConfigPath == "" { - rules = clientcmd.NewDefaultClientConfigLoadingRules() - kubeConfigPath = rules.GetDefaultFilename() - } - if options.poller == nil { - options.poller = NewPoller() - } - if options.crtClientFactory == nil { - options.crtClientFactory = &crtClientFactory{} - } - if options.discoveryClientFactory == nil { - options.discoveryClientFactory = &discoveryClientFactory{} - } - - if options.dynamicClientFactory == nil { - options.dynamicClientFactory = &dynamicClientFactory{} - } - - if options.GetClientInterval.Seconds() == 0 { - options.GetClientInterval = getClientDefaultInterval - } - if options.GetClientTimeout.Seconds() == 0 { - options.GetClientTimeout = getClientDefaultTimeout - } - if options.OperationTimeout.Seconds() == 0 { - options.OperationTimeout = operationDefaultTimeout - } - - client := &client{ - kubeConfigPath: kubeConfigPath, - currentContext: context, - poller: options.poller, - crtClientFactory: options.crtClientFactory, - discoveryClientFactory: options.discoveryClientFactory, - dynamicClientFactory: options.dynamicClientFactory, - configLoadingRules: rules, - getClientInterval: options.GetClientInterval, - getClientTimeout: options.GetClientTimeout, - operationTimeout: options.OperationTimeout, - verificationClientFactory: options.verificationClientFactory, - } - err = client.updateK8sClients(context) - if err != nil { - return nil, err - } - return client, nil -} - -// CloneWithTimeout clones clusterctl client with updating timeout value -func (c *client) CloneWithTimeout(getClientTimeout time.Duration) Client { - return &client{ - clientSet: c.clientSet, - discoveryClient: c.discoveryClient, - kubeConfigPath: c.kubeConfigPath, - currentContext: c.currentContext, - poller: c.poller, - crtClientFactory: c.crtClientFactory, - discoveryClientFactory: c.discoveryClientFactory, - dynamicClientFactory: c.dynamicClientFactory, - configLoadingRules: c.configLoadingRules, - getClientInterval: c.getClientInterval, - getClientTimeout: getClientTimeout, - // copy the getClientTimeout to operationTimeout as well - operationTimeout: getClientTimeout, - } -} - -func (c *client) loadKubeconfigAndEnsureContext(ctx string) ([]byte, error) { - config, err := clientcmd.LoadFromFile(c.kubeConfigPath) - if err != nil { - return []byte{}, err - } - if ctx != "" { - config.CurrentContext = ctx - } - - return clientcmd.Write(*config) -} - -func (c *client) updateK8sClients(ctx string) error { - kubeConfigBytes, err := c.loadKubeconfigAndEnsureContext(ctx) - if err != nil { - return errors.Wrap(err, "unable to read kube config") - } - - clientSet, err := c.poller.PollImmediateWithGetter(c.getClientInterval, c.getClientTimeout, func() (interface{}, error) { - return getK8sClients(kubeConfigBytes, c.crtClientFactory, c.discoveryClientFactory, c.dynamicClientFactory) - }) - if err != nil { - return errors.Wrap(err, "unable to get client") - } - - k8sClients := clientSet.(k8ClientSet) - c.clientSet = k8sClients.crtClient - c.discoveryClient = k8sClients.discoveryClient - c.dynamicClient = k8sClients.dynamicClient - c.currentContext = ctx - - return nil -} - -func getCurrentContextFromKubeConfig(kubeConfig []byte) (string, error) { - config, err := clientcmd.Load(kubeConfig) - if err != nil { - return "", errors.Wrap(err, "unable to load kubeconfig") - } - return config.CurrentContext, nil -} - -// MergeConfigForCluster merge kubeconfig for cluster -func (c *client) MergeConfigForCluster(kubeConfig []byte, mergeFile string) error { - newConfig, err := clientcmd.Load(kubeConfig) - if err != nil { - return errors.Wrap(err, "unable to load kubeconfig") - } - - if mergeFile == "" { - mergeFile = c.kubeConfigPath - } - - if _, err := os.Stat(mergeFile); os.IsNotExist(err) { - return clientcmd.WriteToFile(*newConfig, mergeFile) - } - - dest, err := clientcmd.LoadFromFile(mergeFile) - if err != nil { - return errors.Wrap(err, "unable to load kube config") - } - - ctx := dest.CurrentContext - err = mergo.MergeWithOverwrite(dest, newConfig) - if err != nil { - return errors.Wrap(err, "failed to merge config") - } - dest.CurrentContext = ctx - - err = clientcmd.WriteToFile(*dest, mergeFile) - if err != nil { - return errors.Wrapf(err, "failed to write config to %s: %s", mergeFile, err) - } - return nil -} - -func getK8sClients(kubeConfigBytes []byte, crtClientFactory CrtClientFactory, discoveryClientFactory DiscoveryClientFactory, dynamicClientFactory DynamicClientFactory) (interface{}, error) { - var crtClient crtclient.Client - var discoveryClient discovery.DiscoveryInterface - restConfig, err := clientcmd.RESTConfigFromKubeConfig(kubeConfigBytes) - if err != nil { - return nil, errors.Errorf("Unable to set up rest config due to : %v", err) - } - // As there are many registered resources in the cluster, set the values for the maximum number of - // queries per second and the maximum burst for throttle to a high value to avoid throttling of messages - restConfig.QPS = constants.DefaultQPS - restConfig.Burst = constants.DefaultBurst - mapper, err := apiutil.NewDynamicRESTMapper(restConfig, apiutil.WithLazyDiscovery) - if err != nil { - return nil, errors.Errorf("Unable to set up rest mapper due to : %v", err) - } - - crtClient, err = crtClientFactory.NewClient(restConfig, crtclient.Options{Scheme: scheme, Mapper: mapper}) - if err != nil { - // TODO catch real errors that doesn't warrant retrying and abort - return nil, errors.Errorf("Error getting controller client due to : %v", err) - } - - discoveryClient, err = discoveryClientFactory.NewDiscoveryClientForConfig(restConfig) - if err != nil { - return nil, errors.Errorf("Error getting discovery client due to : %v", err) - } - - if _, err := discoveryClient.ServerVersion(); err != nil { - return nil, errors.Errorf("Failed to invoke API on cluster : %v", err) - } - - dynamicClient, err := dynamicClientFactory.NewDynamicClientForConfig(restConfig) - if err != nil { - return nil, errors.Errorf("Error getting dynamic client due to : %v", err) - } - - clientSet := k8ClientSet{ - crtClient: crtClient, - discoveryClient: discoveryClient, - dynamicClient: dynamicClient, - } - - return clientSet, nil -} - -type k8ClientSet struct { - crtClient crtclient.Client - discoveryClient discovery.DiscoveryInterface - dynamicClient dynamic.Interface -} - -// LoadCurrentKubeconfigBytes loads current kubeconfig bytes -func (c *client) LoadCurrentKubeconfigBytes() ([]byte, error) { - return c.loadKubeconfigAndEnsureContext(c.currentContext) -} - -func (c *client) GetRestConfigClient() (*rest.Config, error) { - kubeConfigBytes, err := c.LoadCurrentKubeconfigBytes() - if err != nil { - return nil, err - } - return clientcmd.RESTConfigFromKubeConfig(kubeConfigBytes) -} - -//go:generate counterfeiter -o ../fakes/crtclientfactory.go --fake-name CrtClientFactory . CrtClientFactory - -// CrtClientFactory is a interface to create controller runtime client -type CrtClientFactory interface { - NewClient(config *rest.Config, options crtclient.Options) (crtclient.Client, error) -} - -//go:generate counterfeiter -o ../fakes/discoveryclientfactory.go --fake-name DiscoveryClientFactory . DiscoveryClientFactory - -// DiscoveryClientFactory is a interface to create discovery client -type DiscoveryClientFactory interface { - NewDiscoveryClientForConfig(config *rest.Config) (discovery.DiscoveryInterface, error) -} - -type discoveryClientFactory struct{} - -// NewDiscoveryClientForConfig creates new discovery client factory -func (c *discoveryClientFactory) NewDiscoveryClientForConfig(restConfig *rest.Config) (discovery.DiscoveryInterface, error) { - return discovery.NewDiscoveryClientForConfig(restConfig) -} - -//go:generate counterfeiter -o ../fakes/dynamicclientfactory.go --fake-name DynamicClientFactory . DynamicClientFactory - -// DynamicClientFactory is a interface to create adynamic client -type DynamicClientFactory interface { - NewDynamicClientForConfig(config *rest.Config) (dynamic.Interface, error) -} - -type dynamicClientFactory struct{} - -// NewDynamicClientForConfig creates a new discovery client factory -func (c *dynamicClientFactory) NewDynamicClientForConfig(restConfig *rest.Config) (dynamic.Interface, error) { - return dynamic.NewForConfig(restConfig) -} - -type crtClientFactory struct{} - -// NewClient creates new clusterClient factory -func (c *crtClientFactory) NewClient(config *rest.Config, options crtclient.Options) (crtclient.Client, error) { - return crtclient.New(config, options) -} - -//go:generate counterfeiter -o ../fakes/clusterclientfactory.go --fake-name ClusterClientFactory . ClusterClientFactory - -// ClusterClientFactory a factory for creating cluster clients -type ClusterClientFactory interface { - NewClient(kubeConfigPath, context string, options Options) (Client, error) -} - -type clusterClientFactory struct{} - -// NewClient creates new clusterclient -func (c *clusterClientFactory) NewClient(kubeConfigPath, context string, options Options) (Client, error) { //nolint:gocritic - return NewClient(kubeConfigPath, context, options) -} - -// NewClusterClientFactory creates new clusterclient factory -func NewClusterClientFactory() ClusterClientFactory { - return &clusterClientFactory{} -} diff --git a/tkg/clusterclient/clusterclient_test.go b/tkg/clusterclient/clusterclient_test.go deleted file mode 100644 index 45dd9193d0..0000000000 --- a/tkg/clusterclient/clusterclient_test.go +++ /dev/null @@ -1,4090 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//nolint:gosec -package clusterclient_test - -import ( - "context" - "fmt" - "net/http" - "os" - rt "runtime" - "strings" - "testing" - "text/template" - "time" - - "github.com/go-openapi/swag" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/ghttp" - "github.com/pkg/errors" - - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/version" - "k8s.io/client-go/discovery" - restclient "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - "k8s.io/utils/pointer" - capav1beta2 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" - capzv1beta1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" - capiv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - capiexp "sigs.k8s.io/cluster-api/exp/api/v1beta1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" //nolint:staticcheck,nolintlint - "sigs.k8s.io/yaml" - - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - . "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" -) - -func TestClusterClient(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Cluster Client Suite") -} - -var ( - scheme = runtime.NewScheme() - fakeMdNameSpace = "fake-md-namespace" - csiCreds = `#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -vsphereCSI: - namespace: kube-system - clusterName: tanzu-wc2 - server: 10.170.105.244 - datacenter: dc0 - publicNetwork: VM Network - username: test@test.com - password: test!23` -) -var imageRepository = "registry.tkg.vmware.new" - -func init() { - _ = capi.AddToScheme(scheme) - _ = capiv1alpha3.AddToScheme(scheme) - _ = capiexp.AddToScheme(scheme) - _ = capav1beta2.AddToScheme(scheme) - _ = corev1.AddToScheme(scheme) - _ = controlplanev1.AddToScheme(scheme) - _ = appsv1.AddToScheme(scheme) - _ = rbacv1.AddToScheme(scheme) - _ = tkgsv1alpha2.AddToScheme(scheme) -} - -var testingDir string - -const ( - fakeTKR1Name = "fakeTKR1" - fakeTKR2Name = "fakeTKR2" - osWindows = "windows" -) - -const ( - cpiCreds = `#@data/values -#@overlay/match-child-defaults missing_ok=True ---- -vsphereCPI: - namespace: kube-system - clusterName: tanzu-wc2 - server: 10.170.105.244 - datacenter: dc0 - publicNetwork: VM Network - username: test@test.com - password: test!23` - - creds = `password: password -username: username -` - vSphereBootstrapCredentialSecret = "capv-manager-bootstrap-credentials" - defaultUserName = "username" - defaultPassword = "password" - defaultTenantID = "tenantID" - defaultClientID = "clientID" - defaultClientSecret = "clientSecret" -) - -type Replicas struct { - SpecReplica int32 - Replicas int32 - ReadyReplicas int32 - UpdatedReplicas int32 -} - -var _ = Describe("Cluster Client", func() { - var ( - clstClient Client - bomClient *fakes.TKGConfigBomClient - currentNamespace string - clientset *fakes.CRTClusterClient - discoveryClient *fakes.DiscoveryClient - featureFlagClient *fakes.FeatureFlagClient - err error - poller *fakes.Poller - kubeconfigbytes []byte - crtClientFactory *fakes.CrtClientFactory - discoveryClientFactory *fakes.DiscoveryClientFactory - prevKubeCtx string - currentKubeCtx string - clusterClientOptions Options - - mdReplicas Replicas - kcpReplicas Replicas - machineObjects []capi.Machine - v1a3machineObjects []capiv1alpha3.Machine - tkcConditions []capiv1alpha3.Condition - ) - - // Mock the sleep implementation for unit tests - Sleep = func(d time.Duration) {} - - BeforeSuite(createTempDirectory) - AfterSuite(deleteTempDirectory) - - reInitialize := func() { - poller = &fakes.Poller{} - clientset = &fakes.CRTClusterClient{} - discoveryClient = &fakes.DiscoveryClient{} - crtClientFactory = &fakes.CrtClientFactory{} - bomClient = &fakes.TKGConfigBomClient{} - crtClientFactory.NewClientReturns(clientset, nil) - discoveryClientFactory = &fakes.DiscoveryClientFactory{} - discoveryClientFactory.NewDiscoveryClientForConfigReturns(discoveryClient, nil) - featureFlagClient = &fakes.FeatureFlagClient{} - poller.PollImmediateWithGetterCalls(func(interval, timeout time.Duration, getterFunc GetterFunc) (interface{}, error) { - return getterFunc() - }) - poller.PollImmediateInfiniteWithGetterCalls(func(interval time.Duration, getterFunc GetterFunc) error { - pollMaxRetry := 40 - timeout, err := getterFunc() - for i := 0; i <= pollMaxRetry; i++ { - timeoutBool := timeout.(bool) - if timeoutBool { - return err - } - if err == nil { - return nil - } - time.Sleep(time.Second * interval) - timeout, err = getterFunc() - } - return err - }) - clusterClientOptions = NewOptions(poller, crtClientFactory, discoveryClientFactory, nil) - discoveryClient.ServerVersionReturns(&version.Info{}, nil) - } - - Describe("Create new client from kubeconfig", func() { - BeforeEach(func() { - reInitialize() - }) - Context("When kubeconfig file invalid (does not contain current-context)", func() { - BeforeEach(func() { - kubeConfigPath := getConfigFilePath("config2.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("unable to get client: Unable to set up rest config due to")) - Expect(clstClient).To(BeNil()) - }) - }) - Context("When kubeconfig file invalid (does not contain context associated with current-context)", func() { - BeforeEach(func() { - kubeConfigPath := getConfigFilePath("config3.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("unable to get client: Unable to set up rest config due to")) - }) - }) - Context("When kubeconfig file valid but server is not reachable", func() { - BeforeEach(func() { - kubeConfigPath := getConfigFilePath("config1.yaml") - discoveryClient.ServerVersionReturns(nil, errors.New("fake-error")) - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("Failed to invoke API on cluster : fake-error")) - }) - }) - - Context("When kubeconfig file is correct", func() { - BeforeEach(func() { - kubeConfigPath := getConfigFilePath("config1.yaml") - - clientset.ListReturns(nil) - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(clstClient).NotTo(Equal(nil)) - }) - }) - - Context("When KUBECONFIG environment variable is set, but the first file is invalid", func() { - BeforeEach(func() { - if rt.GOOS == osWindows { - Skip("Not compatible on platform") - } - os.Setenv("KUBECONFIG", getConfigFilePath("config3.yaml")+":"+getConfigFilePath("config1.yaml")) - clientset.ListReturns(nil) - clstClient, err = NewClient("", "", clusterClientOptions) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("unable to get client")) - }) - }) - - Context("When KUBECONFIG environment variable is set, and the first file is valid", func() { - BeforeEach(func() { - if rt.GOOS == osWindows { - Skip("Not compatible on platform") - } - os.Setenv("KUBECONFIG", getConfigFilePath("config1.yaml")+":"+getConfigFilePath("config3.yaml")) - clientset.ListReturns(nil) - clstClient, err = NewClient("", "", clusterClientOptions) - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(clstClient).NotTo(Equal(nil)) - }) - }) - }) - - Describe("Merge And Use Config For Cluster", func() { - var kubeConfigPath string - BeforeEach(func() { - reInitialize() - kubeConfigPath = getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - }) - Context("When kubeconfig bytes are incorrect", func() { - BeforeEach(func() { - kubeConfigData := []byte("invalid-kubeconfig-data") - _, _, err = clstClient.MergeAndUseConfigForCluster(kubeConfigData, "") - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to load kubeconfig")) - }) - }) - Context("When kubeconfig bytes are correct and kubeconfig file is present", func() { - BeforeEach(func() { - kubeConfigData, _ := os.ReadFile(getConfigFilePath("config5.yaml")) - currentKubeCtx, prevKubeCtx, err = clstClient.MergeAndUseConfigForCluster(kubeConfigData, "overrideContext") - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(prevKubeCtx).To(Equal("federal-context")) - config, err := clientcmd.LoadFromFile(kubeConfigPath) - Expect(err).NotTo(HaveOccurred()) - Expect(currentKubeCtx).To(Equal("default-context")) - Expect((config.Contexts["default-context"]).Cluster).To(Equal("local-server")) - }) - }) - }) - - Describe("Get current namespace", func() { - BeforeEach(func() { - reInitialize() - }) - Context("When kubeconfig file is correct and namespace is not defined", func() { - BeforeEach(func() { - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - currentNamespace, err = clstClient.GetCurrentNamespace() - }) - It("should return current namespace as default", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(currentNamespace).To(Equal(constants.DefaultNamespace)) - }) - }) - - Context("When kubeconfig file is correct and namespace is defined under context", func() { - BeforeEach(func() { - kubeConfigPath := getConfigFilePath("config4.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - currentNamespace, err = clstClient.GetCurrentNamespace() - }) - It("should return current namespace", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(currentNamespace).To(Equal("chisel-ns")) - }) - }) - }) - - Describe("UseContext for setting current namespace", func() { - BeforeEach(func() { - reInitialize() - }) - Context("When kubeconfig file is correct but context in not present for given cluster", func() { - BeforeEach(func() { - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - err = clstClient.UseContext("fake-context") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("context is not defined for")) - }) - }) - - Context("When kubeconfig file is correct and but cluster is not reachable", func() { - BeforeEach(func() { - kubeConfigPath := getConfigFilePath("config1.yaml") - clientset.ListReturns(nil) - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - discoveryClient.ServerVersionReturns(&version.Info{}, errors.New("fake-error")) - err = clstClient.UseContext("federal-context") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("Failed to invoke API on cluster : fake-error")) - }) - }) - - Context("When kubeconfig file is correct and cluster is reachable", func() { - BeforeEach(func() { - kubeConfigPath := getConfigFilePath("config1.yaml") - clientset.ListReturns(nil) - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - err = clstClient.UseContext("federal-context") - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Get KubeConfig For Cluster", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - kcpReplicas = Replicas{SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, opts ...crtclient.ListOption) error { - switch o := o.(type) { - case *capi.MachineList: - case *capi.MachineDeploymentList: - case *controlplanev1.KubeadmControlPlaneList: - o.Items = append(o.Items, getDummyKCP(kcpReplicas.SpecReplica, kcpReplicas.Replicas, kcpReplicas.ReadyReplicas, kcpReplicas.UpdatedReplicas)) - default: - return errors.New("invalid object type") - } - return nil - }) - }) - Context("When clientset api return error", func() { - JustBeforeEach(func() { - clientset.GetReturns(errors.New("fake-error")) - _, err = clstClient.GetKubeConfigForCluster("fake-clusterName", "fake-namespace", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("fake-error")) - }) - }) - - Context("When secret data does not contain value field", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, secret crtclient.Object) error { - data := map[string][]byte{ - "fake-key": []byte("fake-secret-data"), - } - secret.(*corev1.Secret).Data = data - return nil - }) - _, err = clstClient.GetKubeConfigForCluster("fake-clusterName", "fake-namespace", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("Unable to obtain value field from secret's data")) - }) - }) - - Context("When secret data does contain value field", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, secret crtclient.Object) error { - data := map[string][]byte{ - "value": []byte("fake-secret-data"), - } - secret.(*corev1.Secret).Data = data - return nil - }) - kubeconfigbytes, err = clstClient.GetKubeConfigForCluster("fake-clusterName", "fake-namespace", nil) - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(kubeconfigbytes).To(Equal([]byte("fake-secret-data"))) - }) - }) - }) - - Describe("Wait For Cluster Initialized", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - machineObjects = []capi.Machine{} - kcpReplicas = Replicas{SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - mdReplicas = Replicas{SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, opts ...crtclient.ListOption) error { - switch o := o.(type) { - case *capi.MachineList: - o.Items = append(o.Items, machineObjects...) - case *capi.MachineDeploymentList: - o.Items = append(o.Items, getDummyMD("fake-version", mdReplicas.SpecReplica, mdReplicas.Replicas, mdReplicas.ReadyReplicas, mdReplicas.UpdatedReplicas)) - case *controlplanev1.KubeadmControlPlaneList: - o.Items = append(o.Items, getDummyKCP(kcpReplicas.SpecReplica, kcpReplicas.Replicas, kcpReplicas.ReadyReplicas, kcpReplicas.UpdatedReplicas)) - default: - return errors.New("invalid object type") - } - return nil - }) - }) - Context("When clientset Get api return error", func() { - JustBeforeEach(func() { - clientset.GetReturns(errors.New("fake-error")) - err = clstClient.WaitForClusterInitialized("fake-clusterName", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When cluster object is present but the infrastructure is not yet provisioned", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.InfrastructureReadyCondition, - Status: corev1.ConditionFalse, - }) - conditions = append(conditions, capi.Condition{ - Type: capi.ReadyCondition, - Status: corev1.ConditionFalse, - Reason: "Infrastructure not ready", - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - err = clstClient.WaitForClusterInitialized("fake-clusterName", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster infrastructure is still being provisioned: Infrastructure not ready")) - }) - }) - Context("When cluster object is present but the cluster control plane is not yet initialized", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.InfrastructureReadyCondition, - Status: corev1.ConditionTrue, - }) - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionFalse, - }) - conditions = append(conditions, capi.Condition{ - Type: capi.ReadyCondition, - Status: corev1.ConditionFalse, - Reason: "Cloning @ Machine/tkg-mgmt-vc-control-plane-ds26n", - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - err = clstClient.WaitForClusterInitialized("fake-clusterName", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster control plane is still being initialized: Cloning @ Machine/tkg-mgmt-vc-control-plane-ds26n")) - }) - }) - Context("When cluster object and machine objects are present and provisioned", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.InfrastructureReadyCondition, - Status: corev1.ConditionTrue, - }) - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionTrue, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - err = clstClient.WaitForClusterReady("fake-clusterName", "fake-namespace", true) - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("Waits for single node cluster initialization", func() { - JustBeforeEach(func() { - machineObjects = append(machineObjects, getDummyMachine("fake-machine-1", "fake-new-version", true)) - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.InfrastructureReadyCondition, - Status: corev1.ConditionTrue, - }) - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionTrue, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - cluster.(*capi.Cluster).Spec.Topology = &capi.Topology{ - Workers: nil, - ControlPlane: capi.ControlPlaneTopology{ - Replicas: pointer.Int32(1), - }, - } - return nil - }) - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, opts ...crtclient.ListOption) error { - switch o := o.(type) { - case *capi.MachineList: - o.Items = append(o.Items, machineObjects...) - case *capi.MachineDeploymentList: - o.Items = []capi.MachineDeployment{} - case *controlplanev1.KubeadmControlPlaneList: - o.Items = append(o.Items, getDummyKCP(kcpReplicas.SpecReplica, kcpReplicas.Replicas, kcpReplicas.ReadyReplicas, kcpReplicas.UpdatedReplicas)) - default: - return errors.New("invalid object type") - } - return nil - }) - err = clstClient.WaitForClusterInitialized("fake-clusterName", "fake-namespace") - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Wait For Control plane available", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - kcp := controlplanev1.KubeadmControlPlane{} - kcp.Name = "fake-kcp-name" - kcp.Namespace = "fake-kcp-namespace" - kcp.Spec.Version = "fake-version" - Expect(err).NotTo(HaveOccurred()) - }) - Context("When cluster control plane is not initialized", func() { - JustBeforeEach(func() { - clientset.ListReturns(errors.New("zero or multiple KCP objects found for the given cluster")) - err = clstClient.WaitForControlPlaneAvailable("fake-clusterName", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("zero or multiple KCP objects found for the given cluster")) - }) - }) - Context("When cluster control plane is not available", func() { - JustBeforeEach(func() { - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, opts ...crtclient.ListOption) error { - switch o := o.(type) { - case *controlplanev1.KubeadmControlPlaneList: - kcp := getDummyKCP(3, 0, 1, 1) - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: controlplanev1.AvailableCondition, - Status: corev1.ConditionFalse, - }) - kcp.Status.Conditions = conditions - o.Items = append(o.Items, kcp) - default: - return errors.New("invalid object type") - } - return nil - }) - err = clstClient.WaitForControlPlaneAvailable("fake-clusterName", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("control plane is not available yet")) - }) - }) - Context("When cluster control plane is available", func() { - JustBeforeEach(func() { - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, opts ...crtclient.ListOption) error { - switch o := o.(type) { - case *controlplanev1.KubeadmControlPlaneList: - kcp := getDummyKCP(3, 1, 1, 1) - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: controlplanev1.AvailableCondition, - Status: corev1.ConditionTrue, - }) - kcp.Status.Conditions = conditions - o.Items = append(o.Items, kcp) - default: - return errors.New("invalid object type") - } - return nil - }) - err = clstClient.WaitForControlPlaneAvailable("fake-clusterName", "fake-namespace") - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Wait For Cluster Ready", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("When clientset Get api return error", func() { - JustBeforeEach(func() { - clientset.GetReturns(errors.New("fake-error")) - err = clstClient.WaitForClusterReady("fake-clusterName", "fake-namespace", true) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When cluster object is present but the infrastructure is not yet provisioned", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.InfrastructureReadyCondition, - Status: corev1.ConditionFalse, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - err = clstClient.WaitForClusterReady("fake-clusterName", "fake-namespace", true) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster infrastructure is still being provisioned")) - }) - }) - Context("When cluster object is present but the cluster control plane is not yet initialized", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.InfrastructureReadyCondition, - Status: corev1.ConditionTrue, - }) - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Severity: capi.ConditionSeverityInfo, - Status: corev1.ConditionFalse, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - err = clstClient.WaitForClusterReady("fake-clusterName", "fake-namespace", true) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster control plane is still being initialized")) - }) - }) - - Context("When KCP object is present but not yet with all the expected replicas", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.InfrastructureReadyCondition, - Status: corev1.ConditionTrue, - }) - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionTrue, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, options ...crtclient.ListOption) error { - switch o := o.(type) { - case *capi.MachineList: - case *capi.MachineDeploymentList: - case *controlplanev1.KubeadmControlPlaneList: - o.Items = append(o.Items, controlplanev1.KubeadmControlPlane{ - ObjectMeta: metav1.ObjectMeta{Name: "control-plane-0"}, - Spec: controlplanev1.KubeadmControlPlaneSpec{Replicas: pointer.Int32Ptr(1)}, - }) - default: - return errors.New("invalid object type") - } - return nil - }) - err = clstClient.WaitForClusterReady("fake-clusterName", "fake-namespace", true) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("control-plane is still creating replicas, DesiredReplicas=1 Replicas=0 ReadyReplicas=0 UpdatedReplicas=0")) - }) - }) - - Context("When KCP object is present and all the expected replicas are available", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.InfrastructureReadyCondition, - Status: corev1.ConditionTrue, - }) - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionTrue, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, options ...crtclient.ListOption) error { - switch o := o.(type) { - case *capi.MachineList: - case *capi.MachineDeploymentList: - case *controlplanev1.KubeadmControlPlaneList: - o.Items = append(o.Items, controlplanev1.KubeadmControlPlane{ - ObjectMeta: metav1.ObjectMeta{Name: "control-plane-0"}, - Spec: controlplanev1.KubeadmControlPlaneSpec{Replicas: pointer.Int32Ptr(1)}, - Status: controlplanev1.KubeadmControlPlaneStatus{ReadyReplicas: 1}, - }) - default: - return errors.New("invalid object type") - } - return nil - }) - err = clstClient.WaitForClusterReady("fake-clusterName", "fake-namespace", true) - }) - It("should return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("When MachineDeployment object is present but not yet with all the expected replicas", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.InfrastructureReadyCondition, - Status: corev1.ConditionTrue, - }) - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionTrue, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, options ...crtclient.ListOption) error { - switch o := o.(type) { - case *capi.MachineList: - case *capi.MachineDeploymentList: - o.Items = append(o.Items, capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{Name: "control-plane-0"}, - Spec: capi.MachineDeploymentSpec{Replicas: pointer.Int32Ptr(1)}, - }) - case *controlplanev1.KubeadmControlPlaneList: - default: - return errors.New("invalid object type") - } - return nil - }) - err = clstClient.WaitForClusterReady("fake-clusterName", "fake-namespace", true) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("worker nodes are still being created for MachineDeployment 'control-plane-0', DesiredReplicas=1 Replicas=0 ReadyReplicas=0 UpdatedReplicas=0")) - }) - }) - Context("When machine object is present but not yet with NodeRef", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.InfrastructureReadyCondition, - Status: corev1.ConditionTrue, - }) - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionTrue, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, options ...crtclient.ListOption) error { - switch o := o.(type) { - case *controlplanev1.KubeadmControlPlaneList: - o.Items = append(o.Items, controlplanev1.KubeadmControlPlane{ - ObjectMeta: metav1.ObjectMeta{Name: "control-plane-0"}, - Spec: controlplanev1.KubeadmControlPlaneSpec{Replicas: pointer.Int32Ptr(1)}, - Status: controlplanev1.KubeadmControlPlaneStatus{ReadyReplicas: 1}, - }) - case *capi.MachineDeploymentList: - o.Items = append(o.Items, capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{Name: "control-plane-0"}, - Spec: capi.MachineDeploymentSpec{Replicas: pointer.Int32Ptr(1)}, - Status: capi.MachineDeploymentStatus{ReadyReplicas: 1}, - }) - case *capi.MachineList: - o.Items = append(o.Items, capi.Machine{ - ObjectMeta: metav1.ObjectMeta{Name: "machine1"}, - }) - default: - return errors.New("invalid object type") - } - return nil - }) - err = clstClient.WaitForClusterReady("fake-clusterName", "fake-namespace", true) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("machine machine1 is still being provisioned")) - }) - }) - Context("When cluster object, MachineDeployment object, KubeadmControlPlane object and machine objects are present and provisioned", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.InfrastructureReadyCondition, - Status: corev1.ConditionTrue, - }) - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionTrue, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, options ...crtclient.ListOption) error { - switch o := o.(type) { - case *capi.MachineList: - o.Items = append(o.Items, capi.Machine{ - ObjectMeta: metav1.ObjectMeta{Name: "machine1"}, - Status: capi.MachineStatus{ - NodeRef: &corev1.ObjectReference{}, - }, - }) - case *capi.MachineDeploymentList: - o.Items = append(o.Items, capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{Name: "control-plane-0"}, - Spec: capi.MachineDeploymentSpec{Replicas: pointer.Int32Ptr(1)}, - Status: capi.MachineDeploymentStatus{ReadyReplicas: 1}, - }) - case *controlplanev1.KubeadmControlPlaneList: - o.Items = append(o.Items, controlplanev1.KubeadmControlPlane{ - ObjectMeta: metav1.ObjectMeta{Name: "control-plane-0"}, - Spec: controlplanev1.KubeadmControlPlaneSpec{Replicas: pointer.Int32Ptr(1)}, - Status: controlplanev1.KubeadmControlPlaneStatus{ReadyReplicas: 1}, - }) - default: - return errors.New("invalid object type") - } - return nil - }) - err = clstClient.WaitForClusterReady("fake-clusterName", "fake-namespace", true) - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("wait For Autoscaler Patch", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("If autoscaler deployment was not found", func() { - JustBeforeEach(func() { - clientset.GetReturns(apierrors.NewNotFound(schema.GroupResource{Group: "apps", Resource: "Deployment"}, "autoscaler")) - err = clstClient.ApplyPatchForAutoScalerDeployment(bomClient, "fake-clusterName", "v1.23.8_vmware.1", "default") - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("If autoscaler deployment was found but the new image was not found ", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - deploy := &appsv1.Deployment{} - deploy.Name = "fake-clusterName" + constants.AutoscalerDeploymentNameSuffix - return nil - }) - bomClient.GetAutoscalerImageForK8sVersionReturns("", errors.New("autoscaler image was not found")) - err = clstClient.ApplyPatchForAutoScalerDeployment(bomClient, "fake-clusterName", "v1.23.8_vmware.1", "default") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("autoscaler image was not found")) - }) - }) - Context("If autoscaler deployment was found and the new image also was found but patch failed", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - deploy := &appsv1.Deployment{} - deploy.Name = "fake-clusterName" + constants.AutoscalerDeploymentNameSuffix - return nil - }) - bomClient.GetAutoscalerImageForK8sVersionReturns("v1.23.0_vmware.1", nil) - clientset.PatchReturns(errors.New("patch failed")) - err = clstClient.ApplyPatchForAutoScalerDeployment(bomClient, "fake-clusterName", "v1.23.8_vmware.1", "default") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("patch failed")) - }) - }) - Context("If autoscaler deployment was found and the new image also was found and patch succeed", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, deployment crtclient.Object) error { - deploy := deployment.(*appsv1.Deployment) - deploy.Name = "fake-clusterName" + constants.AutoscalerDeploymentNameSuffix - replicas := int32(1) - deploy.Spec.Replicas = &replicas - deploy.Status.Replicas = replicas - deploy.Status.UpdatedReplicas = replicas - deploy.Status.AvailableReplicas = replicas - return nil - }) - bomClient.GetAutoscalerImageForK8sVersionReturns("v1.23.0_vmware.1", nil) - clientset.PatchCalls(func(ctx context.Context, object crtclient.Object, patch crtclient.Patch, option ...crtclient.PatchOption) error { - return nil - }) - err = clstClient.ApplyPatchForAutoScalerDeployment(bomClient, "fake-clusterName", "v1.23.8_vmware.1", "default") - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Wait For Cluster Deletion", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("When clientset Get api return error", func() { - JustBeforeEach(func() { - clientset.GetReturns(errors.New("fake-error")) - err = clstClient.WaitForClusterDeletion("fake-clusterName", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When cluster object is still present", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - return nil - }) - err = clstClient.WaitForClusterDeletion("fake-clusterName", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("resource is still present")) - }) - }) - Context("When cluster object is deleted", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - return apierrors.NewNotFound(schema.GroupResource{Group: cluster.GetObjectKind().GroupVersionKind().Group, Resource: ""}, "not found") - }) - err = clstClient.WaitForClusterDeletion("fake-clusterName", "fake-namespace") - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Delete Resource", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("When clientset Delete return error", func() { - JustBeforeEach(func() { - clientset.DeleteReturns(errors.New("fake-error")) - err = clstClient.DeleteResource(&capi.Cluster{}) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When deletion is successful and clientset Delete does not return error", func() { - JustBeforeEach(func() { - clientset.DeleteReturns(nil) - err = clstClient.DeleteResource(&capi.Cluster{}) - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Patch Resource", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("When clientset Get return error", func() { - JustBeforeEach(func() { - clientset.GetReturns(errors.New("fake-error-while-get")) - err = clstClient.PatchResource(&capi.Cluster{}, "fake-cluster-name", "fake-namespace", "fake-patch-string", types.MergePatchType, nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error reading")) - }) - }) - Context("When clientset Get is successful but Patch return error", func() { - JustBeforeEach(func() { - clientset.GetReturns(nil) - clientset.PatchReturns(errors.New("fake-error-while-patch")) - err = clstClient.PatchResource(&capi.Cluster{}, "fake-cluster-name", "fake-namespace", "fake-patch-string", types.MergePatchType, nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error while applying patch for")) - }) - }) - Context("When patch is successful", func() { - JustBeforeEach(func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - err = clstClient.PatchResource(&capi.Cluster{}, "fake-cluster-name", "fake-namespace", "fake-patch-string", types.MergePatchType, nil) - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - Describe("ScalePacificClusterControlPlane", func() { - var controlPlaneCount int32 = 1 - var clusterName = "fake-cluster-name" - var namespace = "fake-namespace" - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - JustBeforeEach(func() { - err = clstClient.ScalePacificClusterControlPlane(clusterName, namespace, controlPlaneCount) - }) - Context("When getting Pacific cluster object fails", func() { - BeforeEach(func() { - clientset.GetReturns(errors.New("fake-error-while-get")) - }) - - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(`failed to get TKC object in namespace: '%s'`, namespace))) - }) - }) - Context("When clientset Patch return error", func() { - BeforeEach(func() { - clientset.GetReturns(nil) - clientset.PatchReturns(errors.New("fake-error-while-patch")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to patch the cluster controlPlane count")) - }) - }) - Context("When clientset Get is successful but Patch return error", func() { - var gotPatch string - BeforeEach(func() { - controlPlaneCount = 5 - clientset.GetReturns(nil) - clientset.PatchCalls(func(ctx context.Context, cluster crtclient.Object, patch crtclient.Patch, patchoptions ...crtclient.PatchOption) error { - patchBytes, err := patch.Data(cluster) - Expect(err).NotTo(HaveOccurred()) - gotPatch = string(patchBytes) - return nil - }) - }) - It("should return not an error", func() { - Expect(err).ToNot(HaveOccurred()) - payloadFormatStr := `[{"op":"replace","path":"/spec/topology/controlPlane/replicas","value":%d}]` - payloadBytes := fmt.Sprintf(payloadFormatStr, controlPlaneCount) - Expect(gotPatch).To(Equal(payloadBytes)) - }) - }) - }) - Describe("DeactivateTanzuKubernetesReleases", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("When inactive label addition patch return error", func() { - JustBeforeEach(func() { - clientset.GetReturns(nil) - clientset.PatchReturns(errors.New("fake-error-while-patch")) - err = clstClient.DeactivateTanzuKubernetesReleases("fake-tkr-name") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error while applying patch for")) - }) - }) - Context("When inactive label addition patch is successful", func() { - JustBeforeEach(func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - err = clstClient.DeactivateTanzuKubernetesReleases("fake-tkr-name") - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("ActivateTanzuKubernetesReleases", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - - Context("When inactive label removal patching return error", func() { - JustBeforeEach(func() { - clientset.GetReturns(nil) - clientset.PatchReturns(errors.New("fake-error-while-patch")) - err = clstClient.ActivateTanzuKubernetesReleases("fake-tkr-name") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error while applying patch for")) - }) - }) - Context("When inactive label removal patching is successful", func() { - JustBeforeEach(func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - err = clstClient.DeactivateTanzuKubernetesReleases("fake-tkr-name") - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Get current context", func() { - BeforeEach(func() { - reInitialize() - }) - Context("When kubeconfig file is correct and current context is set", func() { - BeforeEach(func() { - kubeConfigPath := getConfigFilePath("config4.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - currentKubeCtx, err = clstClient.GetCurrentKubeContext() - }) - It("should return current context", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(currentKubeCtx).To(Equal("federal-context")) - }) - }) - }) - - Describe("IsPacificRegionalCluster", func() { - var server *ghttp.Server - var discoveryClient *discovery.DiscoveryClient - var isPacific bool - BeforeEach(func() { - reInitialize() - server = ghttp.NewServer() - discoveryClient = discovery.NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL()}) - discoveryClientFactory.NewDiscoveryClientForConfigReturns(discoveryClient, nil) - }) - AfterEach(func() { - server.Close() - }) - Context("When api group 'run.tanzu.vmware.com' doesn't exists", func() { - BeforeEach(func() { - server.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/version"), - ghttp.RespondWith(http.StatusOK, "{\"major\": \"1\",\"minor\": \"17+\"}"), - ), - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/apis/run.tanzu.vmware.com"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - discoveryClient = discovery.NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL()}) - discoveryClientFactory.NewDiscoveryClientForConfigReturns(discoveryClient, nil) - kubeConfigPath := getConfigFilePath("config4.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - isPacific, err = clstClient.IsPacificRegionalCluster() - }) - It("should return the cluster is not a pacific management cluster", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(isPacific).To(Equal(false)) - }) - }) - Context("When api group 'run.tanzu.vmware.com' exist", func() { - BeforeEach(func() { - server.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/version"), - ghttp.RespondWith(http.StatusOK, "{\"major\": \"1\",\"minor\": \"17+\"}"), - ), - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/apis/run.tanzu.vmware.com"), - ghttp.RespondWith(http.StatusOK, "{\"preferredVersion\": {\"groupVersion\": \"run.tanzu.vmware.com/v1alpha1\"}}"), - ), - ) - }) - It("should return the cluster is not a pacific management cluster, if 'TanzuKubernetesCluster' CRD doesn't exist", func() { - server.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/apis/run.tanzu.vmware.com/v1alpha1"), - ghttp.RespondWith(http.StatusOK, "{\"resources\": [ {\"kind\": \"FakeCRD\"}]}"), - ), - ) - discoveryClient = discovery.NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL()}) - discoveryClientFactory.NewDiscoveryClientForConfigReturns(discoveryClient, nil) - kubeConfigPath := getConfigFilePath("config4.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - isPacific, err = clstClient.IsPacificRegionalCluster() - - Expect(err).ToNot(HaveOccurred()) - Expect(isPacific).To(Equal(false)) - }) - It("should return the cluster is a pacific management cluster, if 'TanzuKubernetesCluster' CRD exist", func() { - server.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/apis/run.tanzu.vmware.com/v1alpha1"), - ghttp.RespondWith(http.StatusOK, "{\"resources\": [ {\"kind\": \"TanzuKubernetesCluster\"}]}"), - ), - ) - discoveryClient = discovery.NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL()}) - discoveryClientFactory.NewDiscoveryClientForConfigReturns(discoveryClient, nil) - kubeConfigPath := getConfigFilePath("config4.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - isPacific, err = clstClient.IsPacificRegionalCluster() - Expect(err).ToNot(HaveOccurred()) - Expect(isPacific).To(Equal(true)) - }) - }) - }) - - Describe("Wait for Pacific Cluster", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("When clientset Get api return error", func() { - JustBeforeEach(func() { - clientset.GetReturns(errors.New("fake-error")) - err = clstClient.WaitForPacificCluster("fake-clusterName", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to get")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When ManagedCluster(pacific cluster) object is present but is not yet provisioned", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capiv1alpha3.Conditions{} - conditions = append(conditions, capiv1alpha3.Condition{ - Type: capiv1alpha3.ReadyCondition, - Status: corev1.ConditionFalse, - Reason: "fake-reason", - Message: "fake-message", - }) - cluster.(*tkgsv1alpha2.TanzuKubernetesCluster).Status.Conditions = conditions - return nil - }) - err = clstClient.WaitForPacificCluster("fake-clusterName", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster is still not provisioned")) - }) - }) - Context("When ManagedCluster(pacific cluster) object is present and is running", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capiv1alpha3.Conditions{} - conditions = append(conditions, capiv1alpha3.Condition{ - Type: capiv1alpha3.ReadyCondition, - Status: corev1.ConditionTrue, - }) - cluster.(*tkgsv1alpha2.TanzuKubernetesCluster).Status.Conditions = conditions - return nil - }) - err = clstClient.WaitForPacificCluster("fake-clusterName", "fake-namespace") - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Patch kubernetes version for Pacific Cluster", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("When clientset Get api to get ManagedCluster(pacific cluster) object return error", func() { - JustBeforeEach(func() { - clientset.GetReturns(errors.New("fake-error")) - err = clstClient.PatchK8SVersionToPacificCluster("fake-clusterName", "fake-namespace", "fake-kubernetes-version") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to get")) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When clientset Patch api return error", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - tkc := getDummyPacificCluster() - *(cluster.(*tkgsv1alpha2.TanzuKubernetesCluster)) = tkc - return nil - }) - clientset.PatchReturns(errors.New("fake-patch-error")) - err = clstClient.PatchK8SVersionToPacificCluster("fake-clusterName", "fake-namespace", "fake-kubernetes-version") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to patch the k8s version for tkc object")) - }) - }) - Context("When clientset Patch api return success", func() { - var gotPatch string - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - tkc := getDummyPacificCluster() - *(cluster.(*tkgsv1alpha2.TanzuKubernetesCluster)) = tkc - return nil - }) - clientset.PatchCalls(func(ctx context.Context, cluster crtclient.Object, patch crtclient.Patch, patchoptions ...crtclient.PatchOption) error { - patchBytes, err := patch.Data(cluster) - Expect(err).NotTo(HaveOccurred()) - gotPatch = string(patchBytes) - return nil - }) - err = clstClient.PatchK8SVersionToPacificCluster("fake-clusterName", "fake-namespace", "1.22.10---vmware.1-tkg.1.abc") - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - controlPlaneJSONPatchString := `{"op":"replace","path":"/spec/topology/controlPlane/tkr/reference/name","value":"v1.22.10---vmware.1-tkg.1.abc"}` - nodePool0JSONPatchString := `{"op":"replace","path":"/spec/topology/nodePools/0/tkr/reference/name","value":"v1.22.10---vmware.1-tkg.1.abc"}` - nodePool1JSONPatchString := `{"op":"replace","path":"/spec/topology/nodePools/1/tkr/reference/name","value":"v1.22.10---vmware.1-tkg.1.abc"}` - Expect(gotPatch).To(ContainSubstring(controlPlaneJSONPatchString)) - Expect(gotPatch).To(ContainSubstring(nodePool0JSONPatchString)) - Expect(gotPatch).To(ContainSubstring(nodePool1JSONPatchString)) - }) - }) - }) - - Describe("Wait for Kubernetes version update for CP nodes", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - version := version.Info{GitVersion: "fake-version"} - discoveryClient.ServerVersionReturns(&version, nil) - - kcpReplicas = Replicas{SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - mdReplicas = Replicas{SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - }) - JustBeforeEach(func() { - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, opts ...crtclient.ListOption) error { - switch o := o.(type) { - case *capi.MachineList: - case *capi.MachineDeploymentList: - o.Items = append(o.Items, getDummyMD("fake-version", mdReplicas.SpecReplica, mdReplicas.Replicas, mdReplicas.ReadyReplicas, mdReplicas.UpdatedReplicas)) - case *controlplanev1.KubeadmControlPlaneList: - o.Items = append(o.Items, getDummyKCP(kcpReplicas.SpecReplica, kcpReplicas.Replicas, kcpReplicas.ReadyReplicas, kcpReplicas.UpdatedReplicas)) - default: - return errors.New("invalid object type") - } - return nil - }) - err = clstClient.WaitK8sVersionUpdateForCPNodes("fake-cluster-name", "fake-cluster-namespace", "fake-version", clstClient) - }) - - Context("When ControlPlaneReady condition is not true", func() { - BeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionFalse, - Reason: "fake-reason", - Message: "fake-message", - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("control-plane is still being upgraded, reason:'fake-reason', message:'fake-message'")) - }) - }) - - Context("When failure happens while waiting for CP nodes k8s version update", func() { - BeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.ReadyCondition, - Status: corev1.ConditionFalse, - Severity: capi.ConditionSeverityError, - Reason: "fake-reason", - Message: "fake-message", - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("kubernetes version update failed, reason:'fake-reason', message:'fake-message'")) - }) - }) - - Context("When discovery client's server version api return error", func() { - BeforeEach(func() { - discoveryClient.ServerVersionReturns(nil, errors.New("fake-error-while-getting-k8s-server-version")) - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionTrue, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-error-while-getting-k8s-server-version")) - }) - }) - Context("When discovery client's server version api return wrong/old k8s version", func() { - BeforeEach(func() { - version := version.Info{GitVersion: "fake-wrong-version"} - discoveryClient.ServerVersionReturns(&version, nil) - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionTrue, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("waiting for kubernetes version update, current kubernetes version fake-wrong-version but expecting fake-version")) - }) - }) - Context("When discovery client's server version api return correct/expected k8s version", func() { - BeforeEach(func() { - version := version.Info{GitVersion: "fake-version"} - discoveryClient.ServerVersionReturns(&version, nil) - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - conditions := capi.Conditions{} - conditions = append(conditions, capi.Condition{ - Type: capi.ControlPlaneReadyCondition, - Status: corev1.ConditionTrue, - }) - cluster.(*capi.Cluster).Status.Conditions = conditions - return nil - }) - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Wait for Kubernetes version update for worker nodes", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - version := version.Info{GitVersion: "fake-version"} - discoveryClient.ServerVersionReturns(&version, nil) - - kcpReplicas = Replicas{SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - mdReplicas = Replicas{SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - machineObjects = []capi.Machine{} - }) - JustBeforeEach(func() { - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, opts ...crtclient.ListOption) error { - switch o := o.(type) { - case *capi.MachineList: - o.Items = append(o.Items, machineObjects...) - case *capi.MachineDeploymentList: - o.Items = append(o.Items, getDummyMD("fake-version", mdReplicas.SpecReplica, mdReplicas.Replicas, mdReplicas.ReadyReplicas, mdReplicas.UpdatedReplicas)) - case *controlplanev1.KubeadmControlPlaneList: - o.Items = append(o.Items, getDummyKCP(kcpReplicas.SpecReplica, kcpReplicas.Replicas, kcpReplicas.ReadyReplicas, kcpReplicas.UpdatedReplicas)) - default: - return errors.New("invalid object type") - } - return nil - }) - err = clstClient.WaitK8sVersionUpdateForWorkerNodes("fake-cluster-name", "fake-cluster-namespace", "fake-new-version", clstClient) - }) - - Context("When replicas are not same in MD object status", func() { - Context("When status for MD has SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 2", func() { - BeforeEach(func() { - mdReplicas = Replicas{SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 2} - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("worker nodes are still being upgraded for MachineDeployment 'fake-md-name', DesiredReplicas=3 Replicas=3 ReadyReplicas=3 UpdatedReplicas=2")) - }) - }) - Context("When status for MD has SpecReplica: 2, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3", func() { - BeforeEach(func() { - mdReplicas = Replicas{SpecReplica: 2, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("worker nodes are still being upgraded for MachineDeployment 'fake-md-name', DesiredReplicas=2 Replicas=3 ReadyReplicas=3 UpdatedReplicas=3")) - }) - }) - Context("When status for MD has SpecReplica: 3, Replicas: 4, ReadyReplicas: 2, UpdatedReplicas: 2", func() { - BeforeEach(func() { - mdReplicas = Replicas{SpecReplica: 3, Replicas: 4, ReadyReplicas: 2, UpdatedReplicas: 2} - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("worker nodes are still being upgraded for MachineDeployment 'fake-md-name', DesiredReplicas=3 Replicas=4 ReadyReplicas=2 UpdatedReplicas=2")) - }) - }) - Context("When status for MD has SpecReplica: 1, Replicas: 1, ReadyReplicas: 1, UpdatedReplicas: 0", func() { - BeforeEach(func() { - mdReplicas = Replicas{SpecReplica: 1, Replicas: 1, ReadyReplicas: 1, UpdatedReplicas: 0} - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("worker nodes are still being upgraded for MachineDeployment 'fake-md-name', DesiredReplicas=1 Replicas=1 ReadyReplicas=1 UpdatedReplicas=0")) - }) - }) - }) - - Context("When k8s version is not updated in all worker machine objects", func() { - Context("When one worker machine has older k8s version", func() { - BeforeEach(func() { - machineObjects = append(machineObjects, getDummyMachine("fake-machine-1", "fake-new-version", true)) - machineObjects = append(machineObjects, getDummyMachine("fake-machine-2", "fake-new-version", false)) - machineObjects = append(machineObjects, getDummyMachine("fake-machine-3", "fake-new-version", false)) - machineObjects = append(machineObjects, getDummyMachine("fake-machine-4", "fake-old-version", false)) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("worker machines [fake-machine-4] are still not upgraded")) - }) - }) - Context("When two worker machine has older k8s version", func() { - BeforeEach(func() { - machineObjects = append(machineObjects, getDummyMachine("fake-machine-1", "fake-new-version", true)) - machineObjects = append(machineObjects, getDummyMachine("fake-machine-2", "fake-new-version", false)) - machineObjects = append(machineObjects, getDummyMachine("fake-machine-3", "fake-old-version", false)) - machineObjects = append(machineObjects, getDummyMachine("fake-machine-4", "fake-old-version", false)) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("worker machines [fake-machine-3 fake-machine-4] are still not upgraded")) - }) - }) - }) - - Context("When all replicas are upgraded and all worker machines has new k8s version", func() { - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("When no replicas of worker machines exists", func() { - It("should not return an error", func() { - mdReplicas = Replicas{SpecReplica: 0, Replicas: 0, ReadyReplicas: 0, UpdatedReplicas: 0} - machineObjects = append(machineObjects, getDummyMachine("fake-machine-1", "fake-new-version", true)) - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, opts ...crtclient.ListOption) error { - switch o := o.(type) { - case *capi.MachineList: - o.Items = append(o.Items, machineObjects...) - case *capi.MachineDeploymentList: - o.Items = []capi.MachineDeployment{} - case *controlplanev1.KubeadmControlPlaneList: - o.Items = append(o.Items, getDummyKCP(kcpReplicas.SpecReplica, kcpReplicas.Replicas, kcpReplicas.ReadyReplicas, kcpReplicas.UpdatedReplicas)) - default: - return errors.New("invalid object type") - } - return nil - }) - featureFlagClient.IsConfigFeatureActivatedStub = func(featureFlagName string) (bool, error) { - if featureFlagName == constants.FeatureFlagSingleNodeClusters { - return true, nil - } - return true, nil - } - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Wait for Pacific cluster Kubernetes version update ", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - v1a3machineObjects = []capiv1alpha3.Machine{} - }) - JustBeforeEach(func() { - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, opts ...crtclient.ListOption) error { - switch o := o.(type) { - case *capiv1alpha3.MachineList: - o.Items = append(o.Items, v1a3machineObjects...) - default: - return errors.New("invalid object type") - } - return nil - }) - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - - cluster.(*tkgsv1alpha2.TanzuKubernetesCluster).Status.Conditions = tkcConditions - return nil - }) - err = clstClient.WaitForPacificClusterK8sVersionUpdate("fake-cluster-name", "fake-cluster-namespace", "fake-new-version-xyz.1.bba948a") - }) - - Context("When cluster 'Ready` condition was 'False' and severity was set to 'Error' ", func() { - BeforeEach(func() { - tkcConditions = capiv1alpha3.Conditions{} - tkcConditions = append(tkcConditions, capiv1alpha3.Condition{ - Type: capiv1alpha3.ReadyCondition, - Status: corev1.ConditionFalse, - Severity: capiv1alpha3.ConditionSeverityError, - }) - }) - It("should return an update failed error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster kubernetes version update failed")) - }) - }) - - Context("When cluster 'Ready` condition was 'False' and severity was set to 'Warning'", func() { - BeforeEach(func() { - tkcConditions = capiv1alpha3.Conditions{} - tkcConditions = append(tkcConditions, capiv1alpha3.Condition{ - Type: capiv1alpha3.ReadyCondition, - Status: corev1.ConditionFalse, - Severity: capiv1alpha3.ConditionSeverityWarning, - }) - }) - It("should return an update in progress error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("cluster kubernetes version is still being upgraded")) - }) - }) - Context("When cluster 'Ready` condition was 'True'", func() { - Context("When some worker machine objects has old k8s version", func() { - BeforeEach(func() { - tkcConditions = capiv1alpha3.Conditions{} - tkcConditions = append(tkcConditions, capiv1alpha3.Condition{ - Type: capiv1alpha3.ReadyCondition, - Status: corev1.ConditionTrue, - }) - v1a3machineObjects = append(v1a3machineObjects, getv1alpha3DummyMachine("fake-machine-1", "fake-new-version", false)) - v1a3machineObjects = append(v1a3machineObjects, getv1alpha3DummyMachine("fake-machine-2", "fake-old-version", false)) - }) - It("should not return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("worker machines [fake-machine-2] are still not upgraded")) - }) - }) - Context("When all worker machine objects has new k8s version", func() { - BeforeEach(func() { - tkcConditions = capiv1alpha3.Conditions{} - tkcConditions = append(tkcConditions, capiv1alpha3.Condition{ - Type: capiv1alpha3.ReadyCondition, - Status: corev1.ConditionTrue, - }) - v1a3machineObjects = append(v1a3machineObjects, getv1alpha3DummyMachine("fake-machine-1", "fake-new-version", false)) - v1a3machineObjects = append(v1a3machineObjects, getv1alpha3DummyMachine("fake-machine-1", "fake-new-version", false)) - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - }) - }) - Describe("Create Resource", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("When create api return error", func() { - JustBeforeEach(func() { - clientset.CreateReturns(errors.New("fake-error")) - err = clstClient.CreateResource(&capi.Machine{}, "fake-resource", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When create api returns successfully", func() { - JustBeforeEach(func() { - clientset.CreateReturns(nil) - err = clstClient.CreateResource(&capi.Machine{}, "fake-resource", "fake-namespace") - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Update Resource", func() { - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("When update api return error", func() { - JustBeforeEach(func() { - clientset.UpdateReturns(errors.New("fake-error")) - err = clstClient.UpdateResource(&capi.Machine{}, "fake-resource", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When update api returns successfully", func() { - JustBeforeEach(func() { - clientset.UpdateReturns(nil) - err = clstClient.UpdateResource(&capi.Machine{}, "fake-resource", "fake-namespace") - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("PatchImageRepositoryInKubeProxyDaemonSet", func() { - var ( - kubeProxyDSCreateOption fakehelper.TestDaemonSetOption - newImageRepository string - fakeClientSet crtclient.Client - ) - - JustBeforeEach(func() { - reInitialize() - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(fakehelper.NewDaemonSet(kubeProxyDSCreateOption)).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - clusterClientOptions = NewOptions(poller, crtClientFactory, discoveryClientFactory, nil) - - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - err = clstClient.PatchImageRepositoryInKubeProxyDaemonSet(newImageRepository) - }) - Context("When kube-proxy daemonset object does not exist", func() { - BeforeEach(func() { - newImageRepository = imageRepository - kubeProxyDSCreateOption = fakehelper.TestDaemonSetOption{Name: "fake-daemonset", Namespace: metav1.NamespaceSystem, Image: "registry.tkg.vmware.run/kube-proxy:v1.17.3_vmware.2", IncludeContainer: true} - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("When kube-proxy daemonset object exists but container specs are missing", func() { - BeforeEach(func() { - newImageRepository = imageRepository - kubeProxyDSCreateOption = fakehelper.TestDaemonSetOption{Name: "kube-proxy", Namespace: metav1.NamespaceSystem, Image: "registry.tkg.vmware.run/kube-proxy:v1.17.3_vmware.2", IncludeContainer: false} - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("When kube-proxy patch is successful", func() { - BeforeEach(func() { - newImageRepository = imageRepository - kubeProxyDSCreateOption = fakehelper.TestDaemonSetOption{Name: "kube-proxy", Namespace: metav1.NamespaceSystem, Image: "registry.tkg.vmware.run", IncludeContainer: true} - }) - It("should not return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to parse image name")) - }) - }) - Context("When kube-proxy patch is successful", func() { - BeforeEach(func() { - newImageRepository = imageRepository - kubeProxyDSCreateOption = fakehelper.TestDaemonSetOption{Name: "kube-proxy", Namespace: metav1.NamespaceSystem, Image: "registry.tkg.vmware.run/kube-proxy:v1.17.3_vmware.2", IncludeContainer: true} - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - ds := &appsv1.DaemonSet{} - err = clstClient.GetResource(ds, "kube-proxy", metav1.NamespaceSystem, nil, nil) - Expect(err).NotTo(HaveOccurred()) - Expect(ds.Spec.Template.Spec.Containers[0].Image).To(Equal(newImageRepository + "/kube-proxy:v1.17.3_vmware.2")) - }) - }) - }) - - Describe("PatchClusterAPIAWSControllersToUseEC2Credentials", func() { - var ( - fakeClientSet crtclient.Client - ) - - JustBeforeEach(func() { - reInitialize() - }) - - Context("When Cluster API Provider AWS isn't present", func() { - BeforeEach(func() { - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - clusterClientOptions = NewOptions(poller, crtClientFactory, discoveryClientFactory, nil) - - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - - }) - It("should not return an error", func() { - Expect(clstClient.PatchClusterAPIAWSControllersToUseEC2Credentials()).To(Succeed()) - }) - }) - - Context("When Cluster API Provider AWS is present", func() { - BeforeEach(func() { - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects( - fakehelper.NewClusterAPIAWSControllerComponents()..., - ).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - clusterClientOptions = NewOptions(poller, crtClientFactory, discoveryClientFactory, nil) - - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - - }) - It("should not return an error and should have patched the bootstrap manager credentials and set affinity", func() { - Expect(clstClient.PatchClusterAPIAWSControllersToUseEC2Credentials()).To(Succeed()) - secret := &corev1.Secret{} - Expect(clstClient.GetResource(secret, "capa-manager-bootstrap-credentials", "capa-system", nil, nil)).To(Succeed()) - deployment := &appsv1.Deployment{} - Expect(clstClient.GetResource(deployment, CAPAControllerDeploymentName, CAPAControllerNamespace, nil, nil)).To(Succeed()) - // TODO: @randomvariable Uncomment when switched over from fakeclient to envtest - // Expect(secret.Data["credentials"]).To(Equal([]byte(base64.StdEncoding.EncodeToString([]byte("\n"))))) - // Expect(deployment.Spec.Template.Spec.Affinity).ToNot(BeNil()) - // Expect(deployment.Spec.Template.Spec.Affinity.NodeAffinity).ToNot(BeNil()) - // nodeAffinity := deployment.Spec.Template.Spec.Affinity.NodeAffinity - // Expect(nodeAffinity).To(Equal( - // &corev1.NodeAffinity{ - // RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ - // NodeSelectorTerms: []corev1.NodeSelectorTerm{ - // { - // MatchExpressions: []corev1.NodeSelectorRequirement{ - // { - // Key: "node-role.kubernetes.io/control-plane", - // Operator: "Exists", - // }, - // }, - // }, - // { - // MatchExpressions: []corev1.NodeSelectorRequirement{ - // { - // Key: "node-role.kubernetes.io/master", - // Operator: "Exists", - // }, - // }, - // }, - // }, - // }, - // }, - // )) - - }) - }) - }) - - Describe("PatchCoreDNSImageRepositoryInKubeadmConfigMap", func() { - var ( - newImageRepository string - fakeClientSet crtclient.Client - kubeadmconfigMap *corev1.ConfigMap - ) - - JustBeforeEach(func() { - reInitialize() - kubeadmconfigMap, err = getKubeadmConfigConfigMap("kubeadm-config1.yaml") - Expect(err).NotTo(HaveOccurred()) - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(kubeadmconfigMap).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - clusterClientOptions = NewOptions(poller, crtClientFactory, discoveryClientFactory, nil) - - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - err = clstClient.PatchCoreDNSImageRepositoryInKubeadmConfigMap(newImageRepository) - }) - - Context("When CoreDNS patch in kubeadm-config ConfigMap is successful", func() { - BeforeEach(func() { - newImageRepository = imageRepository - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - cm := &corev1.ConfigMap{} - err = clstClient.GetResource(cm, "kubeadm-config", metav1.NamespaceSystem, nil, nil) - Expect(err).NotTo(HaveOccurred()) - imageRepo, err := getCoreDNSImageRepository(cm) - Expect(err).NotTo(HaveOccurred()) - Expect(imageRepo).To(Equal(newImageRepository)) - }) - }) - }) - - Describe("PatchClusterObjectWithOptionalMetadata", func() { - var ( - metadata map[string]string - labels map[string]string - patchAnnotations string - patchLabels string - errAnnotations error - errLabels error - ) - - JustBeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - patchAnnotations, errAnnotations = clstClient.PatchClusterObjectWithOptionalMetadata("fake-clusterName", "fake-namespace", "annotations", metadata) - patchLabels, errLabels = clstClient.PatchClusterObjectWithOptionalMetadata("fake-clusterName", "fake-namespace", "labels", labels) - }) - - Context("When location metadata patch is successful", func() { - BeforeEach(func() { - metadata = map[string]string{ - "location": "fake-location", - } - }) - It("should not return an error", func() { - Expect(errAnnotations).NotTo(HaveOccurred()) - Expect(errLabels).NotTo(HaveOccurred()) - }) - It("should return location and description", func() { - Expect(strings.Join(strings.Fields(patchAnnotations), "")).To(Equal(`{"metadata":{"annotations":{"location":"fake-location"}}}`)) - }) - }) - - Context("When location & description metadata patch is successful", func() { - BeforeEach(func() { - metadata = map[string]string{ - "description": "fake-description", - "location": "fake-location", - } - }) - It("should not return an error", func() { - Expect(errAnnotations).NotTo(HaveOccurred()) - Expect(errLabels).NotTo(HaveOccurred()) - }) - It("should contain location and description", func() { - Expect(strings.Contains(strings.Join(strings.Fields(patchAnnotations), ""), `"location":"fake-location"`)).To(BeTrue()) - Expect(strings.Contains(strings.Join(strings.Fields(patchAnnotations), ""), `"description":"fake-description"`)).To(BeTrue()) - }) - }) - - Context("When labels metadata patch is successful", func() { - BeforeEach(func() { - labels = map[string]string{ - "fake-key": "fake-val", - } - }) - It("should not return an error", func() { - Expect(errAnnotations).NotTo(HaveOccurred()) - Expect(errLabels).NotTo(HaveOccurred()) - }) - It("should return the label", func() { - Expect(strings.Join(strings.Fields(patchLabels), "")).To(Equal(`{"metadata":{"labels":{"fake-key":"fake-val"}}}`)) - }) - }) - - Context("When no metadata is provided, patch is successful", func() { - BeforeEach(func() {}) - It("should not return an error", func() { - Expect(errAnnotations).NotTo(HaveOccurred()) - Expect(errLabels).NotTo(HaveOccurred()) - }) - }) - }) - - Describe("Update Vsphere Credentials", func() { - var ( - username string - password string - ) - - BeforeEach(func() { - username = defaultUserName - password = defaultPassword - - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - - Context("UpdateVsphereIdentityRefSecret", func() { - It("should not return an error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - data := map[string][]byte{ - "username": []byte(username), - "password": []byte(password), - } - secret.(*corev1.Secret).Data = data - return nil - }) - - err = clstClient.UpdateVsphereIdentityRefSecret("clusterName", "namespace", username, password) - Expect(err).To(BeNil()) - }) - - It("should not return an error when secret not present", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - return apierrors.NewNotFound(schema.GroupResource{Group: "", Resource: "Secret"}, "not found") - }) - - err = clstClient.UpdateVsphereIdentityRefSecret("clusterName", "namespace", username, password) - Expect(err).To(BeNil()) - }) - - It("should return an error when clientset patch returns an error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - return errors.New("dummy") - }) - - err = clstClient.UpdateVsphereIdentityRefSecret("clusterName", "namespace", username, password) - Expect(err).ToNot(BeNil()) - }) - }) - - Context("UpdateVsphereCloudProviderCredentialsSecret", func() { - It("should not return an error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - data := map[string][]byte{ - "values.yaml": []byte(cpiCreds), - } - secret.(*corev1.Secret).Data = data - return nil - }) - - err = clstClient.UpdateVsphereCloudProviderCredentialsSecret("clusterName", "namespace", username, password) - Expect(err).To(BeNil()) - }) - - It("should return an error if clientset patch returns error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(errors.New("dummy")) - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - data := map[string][]byte{ - "values.yaml": []byte(cpiCreds), - } - secret.(*corev1.Secret).Data = data - return nil - }) - - err = clstClient.UpdateVsphereCloudProviderCredentialsSecret("clusterName", "namespace", username, password) - Expect(err).ToNot(BeNil()) - }) - }) - - Context("UpdateCapvManagerBootstrapCredentialsSecret", func() { - It("should not return an error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - secretData := map[string][]byte{ - "credentials.yaml": []byte(creds), - } - - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, option ...crtclient.ListOption) error { - switch o := o.(type) { - case *corev1.SecretList: - o.Items = append(o.Items, getDummySecret("capv-manager-bootstrap-credentials", secretData, map[string]string{})) - } - return nil - }) - - err = clstClient.UpdateCapvManagerBootstrapCredentialsSecret(username, password) - Expect(err).To(BeNil()) - }) - - It("should return an error if clientset patch returns error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(errors.New("dummy")) - - secretData := map[string][]byte{ - "credentials.yaml": []byte(creds), - } - - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, option ...crtclient.ListOption) error { - switch o := o.(type) { - case *corev1.SecretList: - o.Items = append(o.Items, getDummySecret("capv-manager-bootstrap-credentials", secretData, map[string]string{})) - } - return nil - }) - - err = clstClient.UpdateCapvManagerBootstrapCredentialsSecret(username, password) - Expect(err).ToNot(BeNil()) - }) - - Context("UpdateVsphereCsiConfigSecret", func() { - It("should not return an error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - data := map[string][]byte{ - "values.yaml": []byte(csiCreds), - } - secret.(*corev1.Secret).Data = data - return nil - }) - err = clstClient.UpdateVsphereCsiConfigSecret("clusterName", "", username, password) - Expect(err).To(BeNil()) - }) - - It("should return an error if clientset patch returns error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(errors.New("dummy")) - - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - data := map[string][]byte{ - "values.yaml": []byte(csiCreds), - } - secret.(*corev1.Secret).Data = data - return nil - }) - - err = clstClient.UpdateVsphereCsiConfigSecret("clusterName", "", username, password) - Expect(err).ToNot(BeNil()) - }) - }) - }) - }) - Describe("Get Vsphere Credentials from cluster", func() { - var ( - username string - password string - gotUserName string - gotPassword string - ) - BeforeEach(func() { - username = defaultUserName - password = defaultPassword - - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - - Context("When the secret with cluster name in cluster's namespace exists", func() { - It("should return the credentials from the secret", func() { - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - data := map[string][]byte{ - "username": []byte(username), - "password": []byte(password), - } - secret.(*corev1.Secret).Data = data - return nil - }) - - gotUserName, gotPassword, err = clstClient.GetVCCredentialsFromCluster("clusterName", "namespace") - Expect(err).To(BeNil()) - Expect(gotUserName).To(Equal(username)) - Expect(gotPassword).To(Equal(password)) - }) - }) - Context("When the secret with cluster name in cluster's namespace exists", func() { - It("should return the credentials from the secret even if the password has special yaml character", func() { - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - password = `%pass'word` - data := map[string][]byte{ - "username": []byte(username), - "password": []byte(password), - } - secret.(*corev1.Secret).Data = data - return nil - }) - - gotUserName, gotPassword, err = clstClient.GetVCCredentialsFromCluster("clusterName", "namespace") - Expect(err).To(BeNil()) - Expect(gotUserName).To(Equal(username)) - Expect(gotPassword).To(Equal(password)) - }) - }) - Context("When the secret with cluster name in cluster's namespace doesn't exists", func() { - It("should return return error if UpdateCapvManagerBootstrapCredentialsSecret secret is not present", func() { - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - return apierrors.NewNotFound(schema.GroupResource{Group: "", Resource: "Secret"}, "not found") - }) - - gotUserName, gotPassword, err = clstClient.GetVCCredentialsFromCluster("clusterName", "namespace") - Expect(err).ToNot(BeNil()) - Expect(err.Error()).To(ContainSubstring("unable to retrieve vSphere credentials from capv-manager-bootstrap-credentials secret")) - }) - - It("should return return error if UpdateCapvManagerBootstrapCredentialsSecret secret data fails to unmarshal", func() { - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - if name.Name != vSphereBootstrapCredentialSecret { - return apierrors.NewNotFound(schema.GroupResource{Group: "", Resource: "Secret"}, "not found") - } - secretData := map[string][]byte{ - "credentials.yaml": []byte("username: 'username'\npassword: 'pass'word'\n"), // pasword value has single quote - } - secret.(*corev1.Secret).Data = secretData - return nil - }) - - gotUserName, gotPassword, err = clstClient.GetVCCredentialsFromCluster("clusterName", "namespace") - Expect(err).ToNot(BeNil()) - Expect(err.Error()).To(ContainSubstring("failed to unmarshal vSphere credentials")) - }) - It("should return return error if UpdateCapvManagerBootstrapCredentialsSecret secret data doesn't have 'credentails.yaml' data", func() { - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - if name.Name != vSphereBootstrapCredentialSecret { - return apierrors.NewNotFound(schema.GroupResource{Group: "", Resource: "Secret"}, "not found") - } - secretData := map[string][]byte{ - "non-credentials.yaml": []byte("username: 'username'\npassword: 'password'\n"), - } - secret.(*corev1.Secret).Data = secretData - return nil - }) - - gotUserName, gotPassword, err = clstClient.GetVCCredentialsFromCluster("clusterName", "namespace") - Expect(err).ToNot(BeNil()) - Expect(err.Error()).To(ContainSubstring("Unable to obtain credentials.yaml field from capv-manager-bootstrap-credentials secret's data")) - }) - It("should return the credentials from UpdateCapvManagerBootstrapCredentialsSecret secret", func() { - clientset.GetCalls(func(ctx context.Context, name types.NamespacedName, secret crtclient.Object) error { - if name.Name != vSphereBootstrapCredentialSecret { - return apierrors.NewNotFound(schema.GroupResource{Group: "", Resource: "Secret"}, "not found") - } - secretData := map[string][]byte{ - "credentials.yaml": []byte(creds), - } - secret.(*corev1.Secret).Data = secretData - return nil - }) - - gotUserName, gotPassword, err = clstClient.GetVCCredentialsFromCluster("clusterName", "namespace") - Expect(err).To(BeNil()) - Expect(gotUserName).To(Equal(username)) - Expect(gotPassword).To(Equal(password)) - }) - }) - }) - - Describe("Update Azure Credentials", func() { - var ( - tenantID string - clientID string - clientSecret string - clusterName string - identitySecretName string - identityName string - ) - - BeforeEach(func() { - tenantID = defaultTenantID - clientID = defaultClientID - clientSecret = defaultClientSecret - - clusterName = "dummy-ac" - identitySecretName = "identity-secret" - identityName = "identity" - - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - - Context("UpdateCapzManagerBootstrapCredentialsSecret", func() { - It("should not return an error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - secretData := map[string][]byte{ - "client-id": []byte(clientID), - "client-secret": []byte(clientSecret), - "tenant-id": []byte(tenantID), - } - - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, option ...crtclient.ListOption) error { - switch o := o.(type) { - case *corev1.SecretList: - o.Items = append(o.Items, getDummySecret("capz-manager-bootstrap-credentials", secretData, map[string]string{})) - } - return nil - }) - - err = clstClient.UpdateCapzManagerBootstrapCredentialsSecret(tenantID, clientID, clientSecret) - Expect(err).To(BeNil()) - }) - - It("should return an error if clientset patch returns error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(errors.New("dummy")) - - secretData := map[string][]byte{ - "client-id": []byte(clientID), - "client-secret": []byte(clientSecret), - "tenant-id": []byte(tenantID), - } - - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, option ...crtclient.ListOption) error { - switch o := o.(type) { - case *corev1.SecretList: - o.Items = append(o.Items, getDummySecret("capz-manager-bootstrap-credentials", secretData, map[string]string{})) - } - return nil - }) - - err = clstClient.UpdateCapzManagerBootstrapCredentialsSecret(tenantID, clientID, clientSecret) - Expect(err).ToNot(BeNil()) - }) - }) - - Context("GetCAPZControllerManagerDeploymentsReplicas", func() { - It("should not return an error", func() { - clientset.GetReturns(nil) - - dReplicas := Replicas{SpecReplica: 4, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - capzDeploy := getDummyCAPZDeployment(dReplicas.SpecReplica, dReplicas.Replicas, dReplicas.ReadyReplicas, dReplicas.UpdatedReplicas) - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *appsv1.Deployment: - *o = capzDeploy - } - return nil - }) - curReplicas, err := clstClient.GetCAPZControllerManagerDeploymentsReplicas() - Expect(curReplicas).To(Equal(int32(4))) - Expect(err).To(BeNil()) - }) - - It("should return an error if clientset get returns error", func() { - clientset.GetReturns(errors.New("dummy")) - - dReplicas := Replicas{SpecReplica: 4, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, option ...crtclient.ListOption) error { - switch o := o.(type) { - case *appsv1.DeploymentList: - o.Items = append(o.Items, getDummyCAPZDeployment(dReplicas.SpecReplica, dReplicas.Replicas, dReplicas.ReadyReplicas, dReplicas.UpdatedReplicas)) - } - return nil - }) - curReplicas, err := clstClient.GetCAPZControllerManagerDeploymentsReplicas() - Expect(curReplicas).To(Equal(int32(0))) - Expect(err).ToNot(BeNil()) - }) - }) - - Context("UpdateCAPZControllerManagerDeploymentReplicas", func() { - It("should not return an error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - dReplicas := Replicas{SpecReplica: 4, Replicas: 4, ReadyReplicas: 4, UpdatedReplicas: 4} - capzDeploy := getDummyCAPZDeployment(dReplicas.SpecReplica, dReplicas.Replicas, dReplicas.ReadyReplicas, dReplicas.UpdatedReplicas) - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *appsv1.Deployment: - *o = capzDeploy - } - return nil - }) - curReplicas, err := clstClient.GetCAPZControllerManagerDeploymentsReplicas() - Expect(curReplicas).To(Equal(int32(4))) - Expect(err).To(BeNil()) - - err = clstClient.UpdateCAPZControllerManagerDeploymentReplicas(int32(1)) - Expect(err).To(BeNil()) - }) - - It("should return an error if clientset get returns not found error", func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o.(type) { - case *appsv1.Deployment: - return apierrors.NewNotFound(schema.GroupResource{Group: "apps", Resource: "Deployment"}, "replicas") - } - return nil - }) - - err = clstClient.UpdateCAPZControllerManagerDeploymentReplicas(int32(0)) - Expect(err).To(BeNil()) - }) - - It("should return an error if clientset get returns error", func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o.(type) { - case *appsv1.Deployment: - return errors.New("dummy") - } - return nil - }) - - err = clstClient.UpdateCAPZControllerManagerDeploymentReplicas(int32(0)) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("failed to look up"))) - }) - - It("should return an error if clientset patch returns error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(errors.New("dummy")) - - dReplicas := Replicas{SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - - capzDeploy := getDummyCAPZDeployment(dReplicas.SpecReplica, dReplicas.Replicas, dReplicas.ReadyReplicas, dReplicas.UpdatedReplicas) - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *appsv1.Deployment: - *o = capzDeploy - } - return nil - }) - - err = clstClient.UpdateCAPZControllerManagerDeploymentReplicas(int32(0)) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("unable to rollback capz-controller-manager deployment replicas"))) - }) - - It("should return an error if failing to scale deployment", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - dReplicas := Replicas{SpecReplica: 4, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - - capzDeploy := getDummyCAPZDeployment(dReplicas.SpecReplica, dReplicas.Replicas, dReplicas.ReadyReplicas, dReplicas.UpdatedReplicas) - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *appsv1.Deployment: - *o = capzDeploy - } - return nil - }) - - err = clstClient.UpdateCAPZControllerManagerDeploymentReplicas(int32(0)) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("fail to update capz-controller-manager deployment replicas"))) - }) - }) - - Context("CheckUnifiedAzureClusterIdentity", func() { - It("should return true using different identity", func() { - clientset.GetReturns(nil) - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *capzv1beta1.AzureCluster: - *o = getDummyAzureCluster(clusterName, identityName) - case *capzv1beta1.AzureClusterIdentity: - *o = getDummyAzureClusterIdentity(identityName, identitySecretName, tenantID, clientID) - } - return nil - }) - - unified, err := clstClient.CheckUnifiedAzureClusterIdentity(clusterName, constants.DefaultNamespace) - Expect(unified).ToNot(BeTrue()) - Expect(err).To(BeNil()) - }) - - It("should return false using the same identity", func() { - clientset.GetReturns(nil) - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *capzv1beta1.AzureCluster: - *o = getDummyAzureCluster(clusterName, "") - } - return nil - }) - - unified, err := clstClient.CheckUnifiedAzureClusterIdentity(clusterName, constants.DefaultNamespace) - Expect(unified).To(BeTrue()) - Expect(err).To(BeNil()) - }) - - It("should return an error if clientset get returns error", func() { - clientset.GetReturns(errors.New("dummy")) - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *capzv1beta1.AzureCluster: - return errors.New("dummy") - } - return nil - }) - - unified, err := clstClient.CheckUnifiedAzureClusterIdentity(clusterName, constants.DefaultNamespace) - Expect(unified).ToNot(BeTrue()) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring(fmt.Sprintf("unable to retrieve azure cluster %s", clusterName)))) - }) - }) - - Context("UpdateAzureClusterIdentity", func() { - It("should not return an error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - secretData := map[string][]byte{ - "clientSecret": []byte(clientSecret), - } - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *capzv1beta1.AzureCluster: - *o = getDummyAzureCluster(clusterName, identityName) - case *capzv1beta1.AzureClusterIdentity: - *o = getDummyAzureClusterIdentity(identityName, identitySecretName, tenantID, clientID) - case *corev1.Secret: - *o = getDummySecret(identitySecretName, secretData, map[string]string{}) - } - return nil - }) - - err = clstClient.UpdateAzureClusterIdentity(clusterName, constants.DefaultNamespace, tenantID, clientID, clientSecret) - Expect(err).To(BeNil()) - }) - - It("should return an error if clientset patch returns error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(errors.New("dummy")) - - secretData := map[string][]byte{ - "clientSecret": []byte(clientSecret), - } - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *capzv1beta1.AzureCluster: - *o = getDummyAzureCluster(clusterName, identityName) - case *capzv1beta1.AzureClusterIdentity: - *o = getDummyAzureClusterIdentity(identityName, identitySecretName, tenantID, clientID) - case *corev1.Secret: - *o = getDummySecret(identitySecretName, secretData, map[string]string{}) - } - return nil - }) - - err = clstClient.UpdateAzureClusterIdentity(clusterName, constants.DefaultNamespace, tenantID, clientID, clientSecret) - Expect(err).ToNot(BeNil()) - }) - - It("should not return an error when no azure cluster identity reference", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *capzv1beta1.AzureClusterIdentity: - return errors.New("dummy") - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *capzv1beta1.AzureCluster: - *o = getDummyAzureCluster(clusterName, "") - } - return nil - }) - err = clstClient.UpdateAzureClusterIdentity(clusterName, constants.DefaultNamespace, tenantID, clientID, clientSecret) - Expect(err).To(BeNil()) - }) - - It("should return an error if azureCluster does not exist", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o.(type) { - case *capzv1beta1.AzureCluster: - return apierrors.NewNotFound(schema.GroupResource{Group: "", Resource: "AzureCluster"}, "not found") - } - return nil - }) - - err = clstClient.UpdateAzureClusterIdentity(clusterName, constants.DefaultNamespace, tenantID, clientID, clientSecret) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("unable to retrieve azure cluster"))) - }) - - It("should return an error if azureClusterIdentity does not exist", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *capzv1beta1.AzureClusterIdentity: - return apierrors.NewNotFound(schema.GroupResource{Group: "", Resource: "AzureClusterIdentity"}, "not found") - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *capzv1beta1.AzureCluster: - *o = getDummyAzureCluster(clusterName, identityName) - } - return nil - }) - - err = clstClient.UpdateAzureClusterIdentity(clusterName, constants.DefaultNamespace, tenantID, clientID, clientSecret) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("unable to retrieve AzureClusterIdentity"))) - }) - - It("should return an error if patch azureClusterIdentity failed", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - secretData := map[string][]byte{ - "clientSecret": []byte(clientSecret), - } - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *capzv1beta1.AzureCluster: - *o = getDummyAzureCluster(clusterName, identityName) - case *capzv1beta1.AzureClusterIdentity: - *o = getDummyAzureClusterIdentity(identityName, identitySecretName, tenantID, clientID) - case *corev1.Secret: - *o = getDummySecret(identitySecretName, secretData, map[string]string{}) - } - return nil - }) - - clientset.PatchCalls(func(ctx context.Context, o crtclient.Object, patch crtclient.Patch, option ...crtclient.PatchOption) error { - switch o.(type) { - case *capzv1beta1.AzureClusterIdentity: - return errors.New("dummy") - } - return nil - }) - - err = clstClient.UpdateAzureClusterIdentity(clusterName, constants.DefaultNamespace, tenantID, clientID, clientSecret) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("unable to save azure cluster identity"))) - }) - - It("should return an error if secret does not exist", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *corev1.Secret: - return apierrors.NewNotFound(schema.GroupResource{Group: "", Resource: "Secret"}, "not found") - case *capzv1beta1.AzureClusterIdentity: - *o = getDummyAzureClusterIdentity(identityName, identitySecretName, tenantID, clientID) - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *capzv1beta1.AzureCluster: - *o = getDummyAzureCluster(clusterName, identityName) - } - return nil - }) - - err = clstClient.UpdateAzureClusterIdentity(clusterName, constants.DefaultNamespace, tenantID, clientID, clientSecret) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("unable to retrieve AzureClusterIdentity Secret"))) - }) - - It("should return an error if patch azureClusterIdentity secret failed", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - - secretData := map[string][]byte{ - "clientSecret": []byte(clientSecret), - } - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *capzv1beta1.AzureCluster: - *o = getDummyAzureCluster(clusterName, identityName) - case *capzv1beta1.AzureClusterIdentity: - *o = getDummyAzureClusterIdentity(identityName, identitySecretName, tenantID, clientID) - case *corev1.Secret: - *o = getDummySecret(identitySecretName, secretData, map[string]string{}) - } - return nil - }) - - clientset.PatchCalls(func(ctx context.Context, o crtclient.Object, patch crtclient.Patch, option ...crtclient.PatchOption) error { - switch o.(type) { - case *capzv1beta1.AzureClusterIdentity: - case *corev1.Secret: - return errors.New("dummy") - } - return nil - }) - - err = clstClient.UpdateAzureClusterIdentity(clusterName, constants.DefaultNamespace, tenantID, clientID, clientSecret) - Expect(err).ToNot(BeNil()) - Expect(err).To(MatchError(ContainSubstring("unable to save secret"))) - }) - }) - - Context("UpdateAzureKCP", func() { - It("should not return an error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(nil) - kcpReplicas = Replicas{SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *controlplanev1.KubeadmControlPlane: - *o = getDummyKCP(kcpReplicas.SpecReplica, kcpReplicas.Replicas, kcpReplicas.ReadyReplicas, kcpReplicas.UpdatedReplicas) - } - return nil - }) - - err = clstClient.UpdateAzureKCP(clusterName, constants.DefaultNamespace) - Expect(err).To(BeNil()) - }) - - It("should return an error if clientset patch returns error", func() { - clientset.GetReturns(nil) - clientset.PatchReturns(errors.New("dummy")) - kcpReplicas = Replicas{SpecReplica: 3, Replicas: 3, ReadyReplicas: 3, UpdatedReplicas: 3} - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *capi.Cluster: - *o = getDummyCluster(clusterName) - case *controlplanev1.KubeadmControlPlane: - *o = getDummyKCP(kcpReplicas.SpecReplica, kcpReplicas.Replicas, kcpReplicas.ReadyReplicas, kcpReplicas.UpdatedReplicas) - } - return nil - }) - - err = clstClient.UpdateAzureKCP(clusterName, constants.DefaultNamespace) - Expect(err).ToNot(BeNil()) - }) - }) - }) - - Describe("DeleteExistingKappController", func() { - var ( - kappControllerDpCreateOption fakehelper.TestDeploymentOption - kappControllerClusterRoleBindingCreateOption fakehelper.TestClusterRoleBindingOption - kappControllerClusterRoleCreateOption fakehelper.TestClusterRoleOption - kappControllerServiceAccountCreateOption fakehelper.TestServiceAccountOption - initClientWithKappDeployment bool - fakeClientSet crtclient.Client - errDelete error - ) - - BeforeEach(func() { - reInitialize() - }) - - JustBeforeEach(func() { - if initClientWithKappDeployment { - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects( - fakehelper.NewDeployment(kappControllerDpCreateOption), - fakehelper.NewClusterRoleBinding(kappControllerClusterRoleBindingCreateOption), - fakehelper.NewClusterRole(kappControllerClusterRoleCreateOption), - fakehelper.NewServiceAccount(kappControllerServiceAccountCreateOption), - ).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - } - clusterClientOptions = NewOptions(poller, crtClientFactory, discoveryClientFactory, nil) - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - errDelete = clstClient.DeleteExistingKappController() - }) - - Context("When existing kapp-controller is present in vmware-system-tmc namespace", func() { - BeforeEach(func() { - initClientWithKappDeployment = true - kappControllerDpCreateOption = fakehelper.TestDeploymentOption{Name: "kapp-controller", Namespace: "vmware-system-tmc"} - kappControllerClusterRoleBindingCreateOption = fakehelper.TestClusterRoleBindingOption{Name: "kapp-controller-cluster-role-binding"} - kappControllerClusterRoleCreateOption = fakehelper.TestClusterRoleOption{Name: "kapp-controller-cluster-role"} - kappControllerServiceAccountCreateOption = fakehelper.TestServiceAccountOption{Name: "kapp-controller-sa", Namespace: "vmware-system-tmc"} - }) - It("should not return an error", func() { - Expect(errDelete).NotTo(HaveOccurred()) - }) - It("should have deleted the deployment", func() { - deployment := &appsv1.Deployment{} - err := clstClient.GetResource(deployment, "kapp-controller", "vmware-system-tmc", nil, nil) - Expect(apierrors.IsNotFound(err)).To(BeTrue()) - }) - It("should have deleted the cluster role binding", func() { - clusterRoleBinding := &rbacv1.ClusterRoleBinding{} - err := clstClient.GetResource(clusterRoleBinding, "kapp-controller-cluster-role-binding", "", nil, nil) - Expect(apierrors.IsNotFound(err)).To(BeTrue()) - }) - It("should have deleted the cluster-role", func() { - clusterRole := &rbacv1.ClusterRole{} - err := clstClient.GetResource(clusterRole, "kapp-controller-cluster-role", "", nil, nil) - Expect(apierrors.IsNotFound(err)).To(BeTrue()) - }) - It("should have deleted the service account", func() { - serviceAccount := &corev1.ServiceAccount{} - err := clstClient.GetResource(serviceAccount, "kapp-controller-sa", "vmware-system-tmc", nil, nil) - Expect(apierrors.IsNotFound(err)).To(BeTrue()) - }) - }) - - Context("When existing kapp-controller deployment is not present in vmware-system-tmc namespace", func() { - BeforeEach(func() { - initClientWithKappDeployment = false - }) - It("should not return an error", func() { - Expect(errDelete).NotTo(HaveOccurred()) - }) - }) - - Context("When there is error fetching existing kapp-controller deployment in vmware-system-tmc namespace", func() { - BeforeEach(func() { - initClientWithKappDeployment = false - clientset.GetReturnsOnCall(0, apierrors.NewNotFound(schema.GroupResource{Group: "apps/v1", Resource: "Deployment"}, "kapp-controller")) - clientset.GetReturnsOnCall(1, errors.New("fake-error")) - }) - It("should return an error", func() { - Expect(errDelete).To(HaveOccurred()) - }) - }) - - Context("When existing kapp-controller is present in tkg-system namespace", func() { - BeforeEach(func() { - initClientWithKappDeployment = true - kappControllerDpCreateOption = fakehelper.TestDeploymentOption{Name: "kapp-controller", Namespace: "tkg-system"} - kappControllerClusterRoleBindingCreateOption = fakehelper.TestClusterRoleBindingOption{Name: "kapp-controller-cluster-role-binding"} - kappControllerClusterRoleCreateOption = fakehelper.TestClusterRoleOption{Name: "kapp-controller-cluster-role"} - kappControllerServiceAccountCreateOption = fakehelper.TestServiceAccountOption{Name: "kapp-controller-sa", Namespace: "tkg-system"} - }) - It("should not return an error", func() { - Expect(errDelete).NotTo(HaveOccurred()) - }) - It("should not have deleted kapp-controller deployment", func() { - deployment := &appsv1.Deployment{} - err := clstClient.GetResource(deployment, "kapp-controller", "tkg-system", nil, nil) - Expect(err).NotTo(HaveOccurred()) - }) - It("should not have deleted kapp-controller cluster-role-binding", func() { - clusterRoleBinding := &rbacv1.ClusterRoleBinding{} - err := clstClient.GetResource(clusterRoleBinding, "kapp-controller-cluster-role-binding", "", nil, nil) - Expect(err).NotTo(HaveOccurred()) - }) - It("should not have deleted kapp-controller cluster-role", func() { - clusterRole := &rbacv1.ClusterRole{} - err := clstClient.GetResource(clusterRole, "kapp-controller-cluster-role", "", nil, nil) - Expect(err).NotTo(HaveOccurred()) - }) - It("should not have deleted kapp-controller service account", func() { - serviceAccount := &corev1.ServiceAccount{} - err := clstClient.GetResource(serviceAccount, "kapp-controller-sa", "tkg-system", nil, nil) - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("When there is error fetching existing kapp-controller deployment in tkg-system namespace", func() { - BeforeEach(func() { - initClientWithKappDeployment = false - clientset.GetReturnsOnCall(0, errors.New("fake-error")) - }) - It("should return an error", func() { - Expect(errDelete).To(HaveOccurred()) - }) - }) - }) - Describe("UpdateAWSCNIIngressRules", func() { - var ( - fakeClientSet crtclient.Client - antreaRule = capav1beta2.CNIIngressRule{ - Description: "antrea-controller", - Protocol: capav1beta2.SecurityGroupProtocolTCP, - FromPort: 10349, - ToPort: 10349, - } - kappControllerRule = capav1beta2.CNIIngressRule{ - Description: "kapp-controller", - Protocol: capav1beta2.SecurityGroupProtocolTCP, - FromPort: 10100, - ToPort: 10100, - } - ) - - BeforeEach(func() { - reInitialize() - - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects( - fakehelper.NewAWSCluster(fakehelper.TestAWSClusterOptions{ - Name: "fake-clusterName", - Namespace: "fake-namespace", - Region: "us-east-1", - }), - ).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - - clusterClientOptions = NewOptions(poller, crtClientFactory, discoveryClientFactory, nil) - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - - Context("When there are no existing CNI Ingress Rules", func() { - It("should add new CNI rule", func() { - err = clstClient.UpdateAWSCNIIngressRules("fake-clusterName", "fake-namespace", kappControllerRule) - Expect(err).NotTo(HaveOccurred()) - - awsCluster := &capav1beta2.AWSCluster{} - err = clstClient.GetResource(awsCluster, "fake-clusterName", "fake-namespace", nil, nil) - Expect(err).NotTo(HaveOccurred()) - - ingressRules := awsCluster.Spec.NetworkSpec.CNI.CNIIngressRules - expectedIngressRules := capav1beta2.CNIIngressRules{ - kappControllerRule, - } - Expect(ingressRules).To(Equal(expectedIngressRules)) - }) - }) - - Context("When there are existing CNI Ingress Rules", func() { - JustBeforeEach(func() { - awsCluster := &capav1beta2.AWSCluster{} - err = clstClient.GetResource(awsCluster, "fake-clusterName", "fake-namespace", nil, nil) - Expect(err).NotTo(HaveOccurred()) - - awsCluster.Spec.NetworkSpec.CNI = &capav1beta2.CNISpec{ - CNIIngressRules: capav1beta2.CNIIngressRules{ - antreaRule, - }, - } - err = clstClient.UpdateResource(awsCluster, "fake-clusterName", "fake-namespace") - Expect(err).NotTo(HaveOccurred()) - }) - - It("should add new CNI rule", func() { - err = clstClient.UpdateAWSCNIIngressRules("fake-clusterName", "fake-namespace", kappControllerRule) - Expect(err).NotTo(HaveOccurred()) - - awsCluster := &capav1beta2.AWSCluster{} - err = clstClient.GetResource(awsCluster, "fake-clusterName", "fake-namespace", nil, nil) - Expect(err).NotTo(HaveOccurred()) - - ingressRules := awsCluster.Spec.NetworkSpec.CNI.CNIIngressRules - - expectedIngressRules := capav1beta2.CNIIngressRules{ - antreaRule, - kappControllerRule, - } - Expect(ingressRules).To(Equal(expectedIngressRules)) - }) - }) - - Context("When CNI Ingress Rules already exist", func() { - JustBeforeEach(func() { - awsCluster := &capav1beta2.AWSCluster{} - err = clstClient.GetResource(awsCluster, "fake-clusterName", "fake-namespace", nil, nil) - Expect(err).NotTo(HaveOccurred()) - - awsCluster.Spec.NetworkSpec.CNI = &capav1beta2.CNISpec{ - CNIIngressRules: capav1beta2.CNIIngressRules{ - kappControllerRule, - }, - } - err = clstClient.UpdateResource(awsCluster, "fake-clusterName", "fake-namespace") - Expect(err).NotTo(HaveOccurred()) - }) - - It("should keep same rule", func() { - err = clstClient.UpdateAWSCNIIngressRules("fake-clusterName", "fake-namespace", kappControllerRule) - Expect(err).NotTo(HaveOccurred()) - - awsCluster := &capav1beta2.AWSCluster{} - err = clstClient.GetResource(awsCluster, "fake-clusterName", "fake-namespace", nil, nil) - Expect(err).NotTo(HaveOccurred()) - - ingressRules := awsCluster.Spec.NetworkSpec.CNI.CNIIngressRules - expectedIngressRules := capav1beta2.CNIIngressRules{ - kappControllerRule, - } - Expect(ingressRules).To(Equal(expectedIngressRules)) - }) - }) - - }) - Describe("Get Pinniped Issuer URL and Issuer CA", func() { - var pinnipedFederationDomainObjectReturnErr error - var issuerURL, issuerCA string - var configMapData map[string]string - BeforeEach(func() { - reInitialize() - configMapData = map[string]string{ - "issuer": "https://fake-issuer.com", - } - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - JustBeforeEach(func() { - fdoObj := getDummyPinnipedInfoConfigMap(configMapData) - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *corev1.ConfigMap: - *o = fdoObj - return pinnipedFederationDomainObjectReturnErr - } - return nil - }) - issuerURL, issuerCA, err = clstClient.GetPinnipedIssuerURLAndCA() - }) - - Context("When PinnipedInfo ConfigMap doesn't exist in management cluster", func() { - BeforeEach(func() { - pinnipedFederationDomainObjectReturnErr = errors.New("fake-pinnipedinfo-configmap-get-error") - }) - It("should return an pinniped IssuerURL get error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to get pinniped-info ConfigMap")) - }) - }) - Context("When pinniped-info configmap exists in management cluster but doesn't have ca data", func() { - BeforeEach(func() { - pinnipedFederationDomainObjectReturnErr = nil - }) - It("should return an pinniped supervisor default tls secret get error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to get pinniped issuer CA data")) - }) - }) - Context("When both Pinniped FederationDomain and Default TLS secret are present in the management cluster", func() { - BeforeEach(func() { - configMapData["issuer_ca_bundle_data"] = "ZmFrZS1jbGllbnQtY2VydGlmaWNhdGUtZGF0YS12YWx1ZQ==" - pinnipedFederationDomainObjectReturnErr = nil - }) - It("should return the IssuerURL and IssuerCA successfully", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(issuerURL).To(Equal("https://fake-issuer.com")) - Expect(issuerCA).To(Equal("ZmFrZS1jbGllbnQtY2VydGlmaWNhdGUtZGF0YS12YWx1ZQ==")) - }) - }) - }) - Describe("GetTanzuKubernetesReleases", func() { - var tkrsListReturnErr error - var tkrName string - var tkrsGot []runv1alpha1.TanzuKubernetesRelease - var tkrsToBeReturned []runv1alpha1.TanzuKubernetesRelease - - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - JustBeforeEach(func() { - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, options ...crtclient.ListOption) error { - switch o := o.(type) { - case *runv1alpha1.TanzuKubernetesReleaseList: - o.Items = tkrsToBeReturned - return tkrsListReturnErr - } - return nil - }) - tkrsGot, err = clstClient.GetTanzuKubernetesReleases(tkrName) - }) - - Context("When List api return error", func() { - BeforeEach(func() { - tkrsListReturnErr = errors.New("fake GetTanzuKubernetesRelease error") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to list current TKr's")) - Expect(err.Error()).To(ContainSubstring("fake GetTanzuKubernetesRelease error")) - }) - }) - Context("When TKR name(prefix) is not provided", func() { - BeforeEach(func() { - tkrsListReturnErr = nil - tkr1 := runv1alpha1.TanzuKubernetesRelease{} - tkr1.Name = fakeTKR1Name - tkr2 := runv1alpha1.TanzuKubernetesRelease{} - tkr2.Name = fakeTKR2Name - tkrsToBeReturned = []runv1alpha1.TanzuKubernetesRelease{ - tkr1, tkr2, - } - }) - It("should return all the TanzuKubernetesRelease objects", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(tkrsGot)).To(Equal(2)) - Expect(tkrsGot[0].Name).To(Equal(fakeTKR1Name)) - Expect(tkrsGot[1].Name).To(Equal(fakeTKR2Name)) - }) - }) - Context("When TKR name(prefix) is provided", func() { - BeforeEach(func() { - tkrsListReturnErr = nil - tkr1 := runv1alpha1.TanzuKubernetesRelease{} - tkr1.Name = fakeTKR1Name - tkr2 := runv1alpha1.TanzuKubernetesRelease{} - tkr2.Name = fakeTKR2Name - tkrsToBeReturned = []runv1alpha1.TanzuKubernetesRelease{ - tkr1, tkr2, - } - tkrName = fakeTKR2Name - }) - It("should successfully return the list of TanzuKubernetesRelease objects", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(tkrsGot)).To(Equal(1)) - Expect(tkrsGot[0].Name).To(Equal(fakeTKR2Name)) - }) - }) - }) - Describe("VerifyCLIPluginCRD", func() { - var ( - server *ghttp.Server - kubeConfigPath string - ) - BeforeEach(func() { - reInitialize() - kubeConfigPath = "" - server = ghttp.NewServer() - clusterClientOptions = Options{} - - server.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/version"), - ghttp.RespondWith(http.StatusOK, "{\"major\": \"1\",\"minor\": \"17+\"}"), - ), - ) - }) - JustBeforeEach(func() { - tmpl, err := template.New("kubeconfig").Parse(kubeconfigTemplate) - Expect(err).NotTo(HaveOccurred()) - - tmpFile, err := os.CreateTemp("", "fake-kubeconfig-cliplugin-test") - Expect(err).NotTo(HaveOccurred()) - data := struct{ Server string }{Server: server.URL()} - Expect(tmpl.ExecuteTemplate(tmpFile, "kubeconfig", data)).To(Succeed()) - tmpFile.Close() - - kubeConfigPath = tmpFile.Name() - clusterClientOptions = NewOptions(nil, nil, discoveryClientFactory, nil) - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - }) - AfterEach(func() { - if kubeConfigPath != "" { - os.Remove(kubeConfigPath) - } - }) - Context("when the API GroupVersion cli.tanzu.vmware.com exists and contains the CLIPlugin resource", func() { - BeforeEach(func() { - discoveryClient.ServerGroupsAndResourcesReturns([]*metav1.APIGroup{ - {Name: "cli.tanzu.vmware.com"}, - }, []*metav1.APIResourceList{ - {GroupVersion: "cli.tanzu.vmware.com/v1alpha1", APIResources: []metav1.APIResource{ - {Name: "cliplugins", Group: "cli.tanzu.vmware.com"}, - }}, - }, nil) - }) - It("returns true", func() { - supported, err := clstClient.VerifyCLIPluginCRD() - Expect(err).ToNot(HaveOccurred()) - - Expect(supported).To(Equal(true)) - - }) - }) - Context("when the API GroupVersion cli.tanzu.vmware.com does not exist", func() { - BeforeEach(func() { - discoveryClient.ServerGroupsAndResourcesReturns([]*metav1.APIGroup{ - {Name: "foo.tanzu.vmware.com"}, - }, []*metav1.APIResourceList{}, nil) - - }) - It("returns false", func() { - supported, err := clstClient.VerifyCLIPluginCRD() - Expect(err).ToNot(HaveOccurred()) - - Expect(supported).To(Equal(false)) - }) - }) - Context("when the API GroupVersion cli.tanzu.vmware.com exists but the CLIPlugin resource does not", func() { - BeforeEach(func() { - discoveryClient.ServerGroupsAndResourcesReturns([]*metav1.APIGroup{ - {Name: "cli.tanzu.vmware.com"}, - }, []*metav1.APIResourceList{}, nil) - - }) - It("returns false", func() { - supported, err := clstClient.VerifyCLIPluginCRD() - Expect(err).ToNot(HaveOccurred()) - - Expect(supported).To(Equal(false)) - }) - }) - }) - - Describe("Delete cluster", func() { - var server *ghttp.Server - var discoveryClient *discovery.DiscoveryClient - BeforeEach(func() { - reInitialize() - server = ghttp.NewServer() - server.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/version"), - ghttp.RespondWith(http.StatusOK, "{\"major\": \"1\",\"minor\": \"17+\"}"), - ), - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/apis/run.tanzu.vmware.com"), - ghttp.RespondWith(http.StatusOK, "{\"preferredVersion\": {\"groupVersion\": \"run.tanzu.vmware.com/v1alpha1\"}}"), - ), - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/apis/run.tanzu.vmware.com/v1alpha1"), - ghttp.RespondWith(http.StatusOK, "{\"resources\": [ {\"kind\": \"TanzuKubernetesCluster\"}]}"), - ), - ) - discoveryClient = discovery.NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL()}) - discoveryClientFactory.NewDiscoveryClientForConfigReturns(discoveryClient, nil) - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - }) - AfterEach(func() { - server.Close() - }) - - Context("When failed to determine the cluster type (IsClusterClassBased() returns error)", func() { - JustBeforeEach(func() { - clientset.GetReturns(errors.New("fake-error")) - err = clstClient.DeleteCluster("fake-clusterName", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-error")) - Expect(err.Error()).To(ContainSubstring("unable to determine cluster type")) - }) - }) - Context("When management cluster is TKGS supervisor and cluster is not ClusterClass based", func() { - var tkc tkgsv1alpha2.TanzuKubernetesCluster - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, obj crtclient.Object) error { - switch o := obj.(type) { - case *tkgsv1alpha2.TanzuKubernetesCluster: - tkc = getDummyPacificCluster() - o.DeepCopyInto(&tkc) - case *capi.Cluster: - topology := &capi.Topology{ - Class: "", - } - o.Spec.Topology = topology - } - return nil - }) - - err = clstClient.DeleteCluster("fake-clusterName", "fake-namespace") - }) - It("should not return an error and the TKC cluster object should be deleted", func() { - Expect(err).NotTo(HaveOccurred()) - _, tkcRecvd, _ := clientset.DeleteArgsForCall(0) - Expect(*tkcRecvd.(*tkgsv1alpha2.TanzuKubernetesCluster)).To(Equal(tkc)) - }) - }) - Context("When management cluster is TKGS supervisor and cluster is ClusterClass based", func() { - var tkc tkgsv1alpha2.TanzuKubernetesCluster - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, obj crtclient.Object) error { - switch o := obj.(type) { - case *tkgsv1alpha2.TanzuKubernetesCluster: - tkc = getDummyPacificCluster() - o.DeepCopyInto(&tkc) - case *capi.Cluster: - topology := &capi.Topology{ - Class: "fake-cluster-class", - } - o.Spec.Topology = topology - } - return nil - }) - - err = clstClient.DeleteCluster("fake-clusterName", "fake-namespace") - }) - It("should not return an error and the cluster object should be deleted", func() { - Expect(err).NotTo(HaveOccurred()) - _, obj, _ := clientset.DeleteArgsForCall(0) - Expect(obj.(*capi.Cluster)).ToNot(BeNil()) - }) - }) - - }) - Describe("Unit tests for IsClusterClassBased", func() { - var isClusterClassBased bool - - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("When clientset Get api return error", func() { - JustBeforeEach(func() { - clientset.GetReturns(errors.New("fake-error")) - isClusterClassBased, err = clstClient.IsClusterClassBased("fake-clusterName", "fake-namespace") - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(isClusterClassBased).To(Equal(false)) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When cluster is not using ClusterClass", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - topology := &capi.Topology{ - Class: "", - } - cluster.(*capi.Cluster).Spec.Topology = topology - return nil - }) - - isClusterClassBased, err = clstClient.IsClusterClassBased("fake-clusterName", "fake-namespace") - }) - It("should not return an error and isClusterClassBased to be false", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(isClusterClassBased).To(Equal(false)) - }) - }) - Context("When cluster is using ClusterClass", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - topology := &capi.Topology{ - Class: "fake-cluster-class", - } - cluster.(*capi.Cluster).Spec.Topology = topology - return nil - }) - isClusterClassBased, err = clstClient.IsClusterClassBased("fake-clusterName", "fake-namespace") - }) - It("should not return an error and isClusterClassBased to be true", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(isClusterClassBased).To(Equal(true)) - }) - }) - Context("When cluster has ownerReference set", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - tkcOwnerReference := metav1.OwnerReference{ - Kind: "TanzuKubernetesCluster", - } - topology := &capi.Topology{ - Class: "fake-cluster-class", - } - cluster.(*capi.Cluster).Spec.Topology = topology - cluster.(*capi.Cluster).ObjectMeta.OwnerReferences = append(cluster.(*capi.Cluster).ObjectMeta.OwnerReferences, tkcOwnerReference) - return nil - }) - isClusterClassBased, err = clstClient.IsClusterClassBased("fake-clusterName", "fake-namespace") - }) - It("should not return an error and isClusterClassBased to be false", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(isClusterClassBased).To(Equal(false)) - }) - }) - Context("When cluster.spec.topology field is not defined", func() { - JustBeforeEach(func() { - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, cluster crtclient.Object) error { - return nil - }) - isClusterClassBased, err = clstClient.IsClusterClassBased("fake-clusterName", "fake-namespace") - }) - It("should not return an error and isClusterClassBased to be false", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(isClusterClassBased).To(Equal(false)) - }) - }) - }) - - Describe("Unit tests for GetCLIPluginImageRepositoryOverride", func() { - var imageRepoMap map[string]string - - BeforeEach(func() { - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - Context("When clientset List api return error", func() { - JustBeforeEach(func() { - clientset.ListReturns(errors.New("fake-error")) - imageRepoMap, err = clstClient.GetCLIPluginImageRepositoryOverride() - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("When clientset List returns configmap", func() { - JustBeforeEach(func() { - imageRepoMapString := `staging.repo.com: stage.custom.repo.com -prod.repo.com: prod.custom.repo.com` - configMap := corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: "image-repository-override", - Namespace: constants.TanzuCLISystemNamespace, - Labels: map[string]string{ - "cli.tanzu.vmware.com/cliplugin-image-repository-override": "", - }, - }, - Data: map[string]string{ - "imageRepoMap": imageRepoMapString, - }, - } - clientset.ListCalls(func(ctx context.Context, o crtclient.ObjectList, opts ...crtclient.ListOption) error { - switch o := o.(type) { - case *corev1.ConfigMapList: - o.Items = append(o.Items, configMap) - } - return nil - }) - imageRepoMap, err = clstClient.GetCLIPluginImageRepositoryOverride() - }) - It("should not return an error and should return correct imageRepository map", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(len(imageRepoMap)).To(Equal(2)) - Expect(imageRepoMap["staging.repo.com"]).To(Equal("stage.custom.repo.com")) - Expect(imageRepoMap["prod.repo.com"]).To(Equal("prod.custom.repo.com")) - }) - }) - }) - - Describe("Unit tests for RemoveMatchingMetadataFromResources", func() { - var ( - fakeClientSet crtclient.Client - resources []runtime.Object - labelsToBeDeleted []string - ) - fakeclusterclass1 := &capi.ClusterClass{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-clusterclass-1", - Namespace: "fake-namespace", - Labels: map[string]string{ - "key-foo": "value-foo", - "key-bar": "value-bar", - }, - }, - Spec: capi.ClusterClassSpec{ - Variables: []capi.ClusterClassVariable{ - {Name: "fake-variable-1"}, - }, - }, - } - fakeclusterclass2 := &capi.ClusterClass{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-clusterclass-2", - Namespace: "fake-namespace", - Labels: map[string]string{ - "key-foo": "value-foo", - "key-bar": "value-bar", - "key-test": "value-test", - }, - }, - Spec: capi.ClusterClassSpec{ - Variables: []capi.ClusterClassVariable{ - {Name: "fake-variable-2"}, - }, - }, - } - fakeclusterclass3 := &capi.ClusterClass{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-clusterclass-3", - Namespace: "random-namespace", - Labels: map[string]string{ - "key-foo": "value-foo", - "key-bar": "value-bar", - "key-test": "value-test", - }, - }, - Spec: capi.ClusterClassSpec{ - Variables: []capi.ClusterClassVariable{ - {Name: "fake-variable-3"}, - }, - }, - } - - JustBeforeEach(func() { - reInitialize() - - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(resources...).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - - clusterClientOptions = NewOptions(poller, crtClientFactory, discoveryClientFactory, nil) - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - clusterClassGVK := schema.GroupVersionKind{Group: capi.GroupVersion.Group, Version: capi.GroupVersion.Version, Kind: "ClusterClass"} - err = clstClient.RemoveMatchingMetadataFromResources(clusterClassGVK, "fake-namespace", "labels", labelsToBeDeleted) - }) - - Context("When matching objects not found", func() { - BeforeEach(func() { - resources = []runtime.Object{} - labelsToBeDeleted = []string{"key-foo"} - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("When matching object is found and matching labels are found", func() { - BeforeEach(func() { - resources = []runtime.Object{fakeclusterclass1} - labelsToBeDeleted = []string{"key-foo"} - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - It("should remove the labels from the objects and should not update other spec of the objects", func() { - clusterClass := &capi.ClusterClass{} - err = clstClient.GetResource(clusterClass, "fake-clusterclass-1", "fake-namespace", nil, nil) - Expect(err).NotTo(HaveOccurred()) - - labels := clusterClass.GetLabels() - Expect(labels).To(HaveKey("key-bar")) - Expect(labels).NotTo(HaveKey("key-foo")) - - Expect(len(clusterClass.Spec.Variables)).To(Equal(1)) - Expect(clusterClass.Spec.Variables[0].Name).To(Equal("fake-variable-1")) - }) - }) - - Context("When multiple matching objects are found and multiple labels are provided", func() { - BeforeEach(func() { - resources = []runtime.Object{fakeclusterclass1, fakeclusterclass2, fakeclusterclass3} - labelsToBeDeleted = []string{"key-foo", "key-bar"} - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - It("should remove all provided labels from all the matching objects and should not update other spec of the objects", func() { - clusterClass := &capi.ClusterClass{} - err = clstClient.GetResource(clusterClass, "fake-clusterclass-1", "fake-namespace", nil, nil) - Expect(err).NotTo(HaveOccurred()) - labels := clusterClass.GetLabels() - Expect(labels).NotTo(HaveKey("key-bar")) - Expect(labels).NotTo(HaveKey("key-foo")) - Expect(len(clusterClass.Spec.Variables)).To(Equal(1)) - Expect(clusterClass.Spec.Variables[0].Name).To(Equal("fake-variable-1")) - - clusterClass = &capi.ClusterClass{} - err = clstClient.GetResource(clusterClass, "fake-clusterclass-2", "fake-namespace", nil, nil) - Expect(err).NotTo(HaveOccurred()) - labels = clusterClass.GetLabels() - Expect(labels).NotTo(HaveKey("key-bar")) - Expect(labels).NotTo(HaveKey("key-foo")) - Expect(labels).To(HaveKey("key-test")) - Expect(len(clusterClass.Spec.Variables)).To(Equal(1)) - Expect(clusterClass.Spec.Variables[0].Name).To(Equal("fake-variable-2")) - - clusterClass = &capi.ClusterClass{} - err = clstClient.GetResource(clusterClass, "fake-clusterclass-3", "random-namespace", nil, nil) - Expect(err).NotTo(HaveOccurred()) - labels = clusterClass.GetLabels() - Expect(labels).To(HaveKey("key-bar")) - Expect(labels).To(HaveKey("key-foo")) - Expect(labels).To(HaveKey("key-test")) - Expect(len(clusterClass.Spec.Variables)).To(Equal(1)) - Expect(clusterClass.Spec.Variables[0].Name).To(Equal("fake-variable-3")) - }) - }) - }) - - Describe("Unit tests for PatchClusterObjectAnnotations", func() { - var ( - fakeClientSet crtclient.Client - resources []runtime.Object - key, value string - ) - fakecluster1 := &capi.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: "fake-cluster-1", - Namespace: "fake-namespace", - Annotations: map[string]string{ - "key-foo": "value-foo", - "key-bar": "value-bar", - }, - }, - } - - JustBeforeEach(func() { - reInitialize() - - fakeClientSet = fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(resources...).Build() - crtClientFactory.NewClientReturns(fakeClientSet, nil) - - clusterClientOptions = NewOptions(poller, crtClientFactory, discoveryClientFactory, nil) - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - - err = clstClient.PatchClusterObjectAnnotations("fake-cluster-1", "fake-namespace", key, value) - }) - - Context("When matching cluster not found", func() { - BeforeEach(func() { - resources = []runtime.Object{} - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to patch the cluster object with")) - }) - }) - - Context("When cluster object is found and matching annotation doesn't exists", func() { - BeforeEach(func() { - resources = []runtime.Object{fakecluster1} - key = "key-fake" - value = "value-fake" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - It("should add new annotation", func() { - cluster := &capi.Cluster{} - err = clstClient.GetResource(cluster, "fake-cluster-1", "fake-namespace", nil, nil) - Expect(err).NotTo(HaveOccurred()) - annotations := cluster.GetAnnotations() - Expect(annotations).To(HaveKey("key-bar")) - Expect(annotations).To(HaveKey("key-foo")) - Expect(annotations).To(HaveKey("key-fake")) - Expect(annotations["key-bar"]).To(Equal("value-bar")) - Expect(annotations["key-foo"]).To(Equal("value-foo")) - Expect(annotations["key-fake"]).To(Equal("value-fake")) - }) - }) - - Context("When cluster object is found and matching annotation exists", func() { - BeforeEach(func() { - resources = []runtime.Object{fakecluster1} - key = "key-bar" - value = "value-bar-updated" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - It("should update existing annotation", func() { - cluster := &capi.Cluster{} - err = clstClient.GetResource(cluster, "fake-cluster-1", "fake-namespace", nil, nil) - Expect(err).NotTo(HaveOccurred()) - annotations := cluster.GetAnnotations() - Expect(annotations).To(HaveKey("key-bar")) - Expect(annotations).To(HaveKey("key-foo")) - Expect(annotations["key-bar"]).To(Equal("value-bar-updated")) - Expect(annotations["key-foo"]).To(Equal("value-foo")) - }) - }) - }) - - Describe("Unit tests for GetAzureCredentialsFromIdentity", func() { - var ( - tenantID string - clientID string - clientSecret string - identitySecretName string - identityName string - ) - - BeforeEach(func() { - tenantID = defaultTenantID - clientID = defaultClientID - clientSecret = defaultClientSecret - - identitySecretName = "foo-identitySecret" - identityName = "foo-identity" - reInitialize() - kubeConfigPath := getConfigFilePath("config1.yaml") - clstClient, err = NewClient(kubeConfigPath, "", clusterClientOptions) - Expect(err).NotTo(HaveOccurred()) - }) - It("should not return an error", func() { - clientset.GetReturns(nil) - - secretData := map[string][]byte{ - "clientSecret": []byte(clientSecret), - } - - clientset.GetCalls(func(ctx context.Context, namespace types.NamespacedName, o crtclient.Object) error { - switch o := o.(type) { - case *corev1.Secret: - *o = getDummySecret(identitySecretName, secretData, map[string]string{}) - case *capzv1beta1.AzureClusterIdentity: - *o = getDummyAzureClusterIdentity(identityName, identitySecretName, tenantID, clientID) - } - return nil - }) - - credentials, err := clstClient.GetAzureCredentialsFromIdentity(identityName, constants.DefaultNamespace) - Expect(err).NotTo(HaveOccurred()) - Expect(credentials.ClientID).To(Equal(defaultClientID)) - Expect(credentials.ClientSecret).To(Equal(defaultClientSecret)) - Expect(credentials.TenantID).To(Equal(defaultTenantID)) - }) - - It("should return an error when AzureClusterIdentity not exists", func() { - _, err = clstClient.GetAzureCredentialsFromIdentity(identityName, constants.DefaultNamespace) - Expect(err.Error()).To(ContainSubstring("unable to retrieve azure credentials from AzureClusterIdentity")) - }) - - It("should return an error when get resource failed", func() { - clientset.GetReturns(errors.New("fake list error")) - - _, err = clstClient.GetAzureCredentialsFromIdentity(identityName, constants.DefaultNamespace) - Expect(err.Error()).To(ContainSubstring("unable to retrieve AzureClusterIdentity")) - }) - }) -}) - -func createTempDirectory() { - testingDir, _ = os.MkdirTemp("", "cluster_client_test") -} - -func deleteTempDirectory() { - os.Remove(testingDir) -} - -func getConfigFilePath(filename string) string { - filePath := "../fakes/config/kubeconfig/" + filename - f, _ := os.CreateTemp(testingDir, "kube") - copyFile(filePath, f.Name()) - return f.Name() -} - -func copyFile(sourceFile, destFile string) { - input, _ := os.ReadFile(sourceFile) - _ = os.WriteFile(destFile, input, constants.ConfigFilePermissions) -} - -func getDummyPinnipedInfoConfigMap(configMapData map[string]string) corev1.ConfigMap { - fakeConfigMap := corev1.ConfigMap{} - fakeConfigMap.Data = configMapData - return fakeConfigMap -} - -func getDummyKCP(specReplica, replicas, readyReplicas, updatedReplicas int32) controlplanev1.KubeadmControlPlane { - currentK8sVersion := "fake-version" - infrastructureTemplateKind := "FakeMachine" - kcp := controlplanev1.KubeadmControlPlane{} - kcp.Name = "fake-kcp-name" - kcp.Namespace = "fake-kcp-namespace" - kcp.Spec.Version = currentK8sVersion - kcp.Spec.Replicas = swag.Int32(specReplica) - kcp.Status.Replicas = replicas - kcp.Status.ReadyReplicas = readyReplicas - kcp.Status.UpdatedReplicas = updatedReplicas - kcp.Spec.MachineTemplate.InfrastructureRef.Kind = infrastructureTemplateKind - curTime := metav1.Time{Time: time.Now()} - kcp.Spec.RolloutAfter = &curTime - return kcp -} - -func getDummyMD(currentK8sVersion string, specReplica, replicas, readyReplicas, updatedReplicas int32) capi.MachineDeployment { - md := capi.MachineDeployment{} - md.Name = "fake-md-name" - md.Namespace = fakeMdNameSpace - md.Spec.Template.Spec.Version = ¤tK8sVersion - md.Spec.Replicas = swag.Int32(specReplica) - md.Status.Replicas = replicas - md.Status.ReadyReplicas = readyReplicas - md.Status.UpdatedReplicas = updatedReplicas - return md -} - -func getDummyCAPZDeployment(specReplica, replicas, readyReplicas, updatedReplicas int32) appsv1.Deployment { - capzDeploy := appsv1.Deployment{} - capzDeploy.Name = "capz-controller-manager" - capzDeploy.Namespace = "capz-system" - capzDeploy.Spec.Replicas = swag.Int32(specReplica) - capzDeploy.Status.AvailableReplicas = readyReplicas - capzDeploy.Status.Replicas = replicas - capzDeploy.Status.ReadyReplicas = readyReplicas - capzDeploy.Status.UpdatedReplicas = updatedReplicas - return capzDeploy -} - -func getDummySecret(secretName string, secretData map[string][]byte, secretStringData map[string]string) corev1.Secret { - secret := corev1.Secret{} - secret.Name = secretName - secret.Namespace = constants.DefaultNamespace - secret.Data = secretData - secret.StringData = secretStringData - return secret -} - -func getDummyAzureClusterIdentity(identityName string, identitySecretName string, tenantID string, clientID string) capzv1beta1.AzureClusterIdentity { - azureClusterIdentity := capzv1beta1.AzureClusterIdentity{} - azureClusterIdentity.Name = identityName - azureClusterIdentity.Namespace = constants.DefaultNamespace - azureClusterIdentity.Spec.ClientID = clientID - azureClusterIdentity.Spec.TenantID = tenantID - azureClusterIdentity.Spec.ClientSecret.Name = identitySecretName - azureClusterIdentity.Spec.ClientSecret.Namespace = constants.DefaultNamespace - azureClusterIdentity.Spec.Type = "ServicePrincipal" - return azureClusterIdentity -} - -func getDummyCluster(clusterName string) capi.Cluster { - clusterSpecs := capi.ClusterSpec{ - InfrastructureRef: &corev1.ObjectReference{ - Kind: "AzureCluster", - Name: clusterName, - Namespace: constants.DefaultNamespace, - APIVersion: "infrastructure.cluster.x-k8s.io/v1beta1", - }, - ControlPlaneRef: &corev1.ObjectReference{ - APIVersion: "controlplane.cluster.x-k8s.io/v1beta1", - Kind: "KubeadmControlPlane", - Name: "fake-kcp-name", - Namespace: "fake-kcp-namespace", - }, - } - - cluster := capi.Cluster{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{ - Name: clusterName, - Namespace: constants.DefaultNamespace, - }, - Spec: clusterSpecs, - Status: capi.ClusterStatus{}, - } - - return cluster -} - -func getDummyAzureCluster(clusterName string, identityName string) capzv1beta1.AzureCluster { - ac := capzv1beta1.AzureCluster{} - ac.Name = clusterName - ac.Namespace = constants.DefaultNamespace - ac.Spec.Location = "fake-west" - ac.Spec.NetworkSpec.Vnet.Name = "fake-vnet" - ac.Spec.ResourceGroup = "fake-rg" - ac.Spec.SubscriptionID = "subscription-id" - identityRef := &corev1.ObjectReference{ - APIVersion: "infrastructure.cluster.x-k8s.io/v1beta1", - Kind: "AzureClusterIdentity", - Name: identityName, - Namespace: constants.DefaultNamespace, - } - if identityName != "" { - ac.Spec.IdentityRef = identityRef - } - return ac -} - -func getDummyMachine(name, currentK8sVersion string, isCP bool) capi.Machine { - machine := capi.Machine{} - machine.Name = name - machine.Namespace = fakeMdNameSpace - machine.Spec.Version = ¤tK8sVersion - machine.Labels = map[string]string{} - if isCP { - machine.Labels["cluster.x-k8s.io/control-plane"] = "" - } - return machine -} - -func getv1alpha3DummyMachine(name, currentK8sVersion string, isCP bool) capiv1alpha3.Machine { - // TODO: Add test cases where isCP is true, currently there are no such tests - machine := capiv1alpha3.Machine{} - machine.Name = name - machine.Namespace = fakeMdNameSpace - machine.Spec.Version = ¤tK8sVersion - machine.Labels = map[string]string{} - if isCP { - machine.Labels["cluster.x-k8s.io/control-plane"] = "" - } - return machine -} - -func getKubeadmConfigConfigMap(filename string) (*corev1.ConfigMap, error) { - configMapBytes := getConfigMapFileData(filename) - configMap := &corev1.ConfigMap{} - err := yaml.Unmarshal(configMapBytes, configMap) - return configMap, err -} - -func getDummyPacificCluster() tkgsv1alpha2.TanzuKubernetesCluster { - var controlPlaneReplicas int32 = 1 - var nodepoolReplicase int32 = 2 - controlPlane := tkgsv1alpha2.TopologySettings{ - Replicas: &controlPlaneReplicas, - TKR: tkgsv1alpha2.TKRReference{ - Reference: &corev1.ObjectReference{ - Name: "dummy-tkr", - }, - }, - } - nodepools := []tkgsv1alpha2.NodePool{ - {Name: "nodepool-1", - TopologySettings: tkgsv1alpha2.TopologySettings{ - Replicas: &nodepoolReplicase, - TKR: tkgsv1alpha2.TKRReference{ - Reference: &corev1.ObjectReference{ - Name: "dummy-tkr", - }, - }, - }, - }, - {Name: "nodepool-2", - TopologySettings: tkgsv1alpha2.TopologySettings{ - Replicas: &nodepoolReplicase, - TKR: tkgsv1alpha2.TKRReference{ - Reference: &corev1.ObjectReference{ - Name: "dummy-tkr", - }, - }, - }, - }, - } - - tkc := tkgsv1alpha2.TanzuKubernetesCluster{} - tkc.Name = "DummyTKC" - tkc.Spec.Topology.ControlPlane = controlPlane - tkc.Spec.Topology.NodePools = nodepools - return tkc -} - -const ( - kubeconfigTemplate = ` -current-context: context -apiVersion: v1 -clusters: -- cluster: - api-version: v1 - server: {{.Server}} - insecure-skip-tls-verify: true - name: current-cluster -contexts: -- context: - cluster: current-cluster - namespace: chisel-ns - user: blue-user - name: context -kind: Config -users: -- name: blue-user - user: - token: blue-token -` -) diff --git a/tkg/clusterclient/credentials.go b/tkg/clusterclient/credentials.go deleted file mode 100644 index 93b905d0d3..0000000000 --- a/tkg/clusterclient/credentials.go +++ /dev/null @@ -1,712 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clusterclient - -import ( - "encoding/base64" - "fmt" - "time" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - k8serrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/types" - capzv1beta1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - azureclient "github.com/vmware-tanzu/tanzu-framework/tkg/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// constants related to credentials -const ( - vSphereBootstrapCredentialSecret = "capv-manager-bootstrap-credentials" // #nosec - AWSBootstrapCredentialsSecret = "capa-manager-bootstrap-credentials" // #nosec - AzureBootstrapCredentialsSecret = "capz-manager-bootstrap-credentials" // #nosec - AzureControllerManagerDeploy = "capz-controller-manager" - KeyAzureClientID = "client-id" - KeyAzureSubsciptionID = "subscription-id" - KeyAzureClientSecret = "client-secret" - KeyAzureTenantID = "tenant-id" - KeyAWSCredentials = "credentials" - KeyVSphereCredentials = "credentials.yaml" - KeyVSphereCsiConfig = "values.yaml" - KeyVSphereCpiConfig = "values.yaml" - KeyCAInSecret = "ca.crt" - CapvNamespace = "capv-system" - CapzNamespace = "capz-system" -) - -func (c *client) GetVCCredentialsFromCluster(clusterName, clusterNamespace string) (string, string, error) { - //TODO: https://github.com/vmware-tanzu/tanzu-framework/issues/1833 - // Update the code to support "VSphereClusterIdentity" kind as identityRef(secret name should be read from VSphereClusterIdentity object) - username, password, err := c.getCredentialsFromSecret(clusterName, clusterNamespace) - if err != nil && !k8serrors.IsNotFound(err) { - return "", "", errors.Wrap(err, "unable to retrieve vSphere credentials") - } - if username != "" && password != "" { - return username, password, nil - } - // If cluster specific secret is not present, fallback on bootstrap credential secret - // Note: There is chance that we fail to get VC credentials if management cluster is created before identityRef(Secret or VSphereClusterIdentity kind) is being used, - // because getting credentials from "capv-manager-bootstrap-credentials" secret would fail if the vsphere's password - // contain single quote(') due to unmarshaling issue(ref: https://github.com/kubernetes-sigs/cluster-api-provider-vsphere/issues/1460) - log.Info("cluster specific secret is not present, fallback on bootstrap credential secret") - username, password, err = c.getCredentialsFromvSphereBootstrapCredentialSecret() - if err != nil { - return "", "", errors.Wrapf(err, "unable to retrieve vSphere credentials from %s secret", vSphereBootstrapCredentialSecret) - } - return username, password, nil -} - -// GetVCCredentialsFromSecret gets the VC credentials from secret -// Deprecated: use GetVCCredentialsFromCluster() method instead which would use both clustername and namespace to get the VC credentials -func (c *client) GetVCCredentialsFromSecret(clusterName string) (string, string, error) { - secretList := &corev1.SecretList{} - err := c.ListResources(secretList, &crtclient.ListOptions{}) - if err != nil { - return "", "", errors.Wrap(err, "unable to retrieve vSphere credentials") - } - - var usernameBytes []byte - var passwordBytes []byte - - for i := range secretList.Items { - if clusterName == "" { - break - } - - if secretList.Items[i].Name == clusterName { - usernameBytes = secretList.Items[i].Data["username"] - passwordBytes = secretList.Items[i].Data["password"] - - if len(usernameBytes) == 0 || len(passwordBytes) == 0 { - break - } - return string(usernameBytes), string(passwordBytes), nil - } - } - // If cluster specific secret is not present, fallback on bootstrap credential secret - log.Info("cluster specific secret is not present, fallback on bootstrap credential secret") - username, password, err := c.getCredentialsFromvSphereBootstrapCredentialSecret() - if err != nil { - return "", "", errors.Wrapf(err, "unable to retrieve vSphere credentials from %s secret", vSphereBootstrapCredentialSecret) - } - return username, password, nil -} -func (c *client) getCredentialsFromSecret(secretName, secretNamespace string) (string, string, error) { - secret := &corev1.Secret{} - if secretNamespace == "" { - secretNamespace = constants.DefaultNamespace - } - if err := c.GetResource(secret, secretName, secretNamespace, nil, nil); err != nil { - return "", "", err - } - usernameBytes := secret.Data["username"] - passwordBytes := secret.Data["password"] - return string(usernameBytes), string(passwordBytes), nil -} -func (c *client) getCredentialsFromvSphereBootstrapCredentialSecret() (string, string, error) { - var credentialBytes []byte - secret := &corev1.Secret{} - if err := c.GetResource(secret, vSphereBootstrapCredentialSecret, CapvNamespace, nil, nil); err != nil { - return "", "", errors.Wrapf(err, "unable to retrieve vSphere credentials secret %s", vSphereBootstrapCredentialSecret) - } - - ok := false - credentialBytes, ok = secret.Data[KeyVSphereCredentials] - if !ok { - return "", "", errors.Errorf("Unable to obtain %s field from %s secret's data", KeyVSphereCredentials, vSphereBootstrapCredentialSecret) - } - - if len(credentialBytes) == 0 { - return "", "", errors.Errorf("unable to retrieve vSphere credentials secret %s", vSphereBootstrapCredentialSecret) - } - - // TODO: Currently there is a upstream bug where the marshaling of vSphere credentials would fails - // if the password contains single quote('). We should update this code if upstream updates the format - // of capv-manager-bootstrap-credentials secret - var credentialMap map[string]string - if err := yaml.Unmarshal(credentialBytes, &credentialMap); err != nil { - return "", "", errors.Wrap(err, "failed to unmarshal vSphere credentials") - } - - var vsphereUsername string - var vspherePassword string - - if vsphereUsername, ok = credentialMap["username"]; !ok { - return "", "", errors.New("unable to find username") - } - if vspherePassword, ok = credentialMap["password"]; !ok { - return "", "", errors.New("unable to find password") - } - - return vsphereUsername, vspherePassword, nil -} - -func (c *client) UpdateVsphereIdentityRefSecret(clusterName, namespace, username, password string) error { - secret := &corev1.Secret{} - - err := c.GetResource(secret, clusterName, namespace, nil, nil) - if err != nil { - if k8serrors.IsNotFound(err) { - log.Info("Cluster identityRef secret not present. Skipping update...") - return nil - } - - return err - } - - var usernameBytes []byte - var passwordBytes []byte - - usernameBytes = []byte(username) - usernameBytesB64 := make([]byte, base64.StdEncoding.EncodedLen(len(usernameBytes))) - base64.StdEncoding.Encode(usernameBytesB64, usernameBytes) - - passwordBytes = []byte(password) - passwordBytesB64 := make([]byte, base64.StdEncoding.EncodedLen(len(passwordBytes))) - base64.StdEncoding.Encode(passwordBytesB64, passwordBytes) - - secret = &corev1.Secret{} - - patchString := fmt.Sprintf(`[ - { - "op": "replace", - "path": "/data/username", - "value": "%s" - }, - { - "op": "replace", - "path": "/data/password", - "value": "%s" - } - ]`, string(usernameBytesB64), string(passwordBytesB64)) - - pollOptions := &PollOptions{Interval: CheckResourceInterval, Timeout: c.operationTimeout} - if err := c.PatchResource(secret, clusterName, namespace, patchString, types.JSONPatchType, pollOptions); err != nil { - return errors.Wrap(err, "unable to save cluster identityRef secret") - } - return nil -} - -func (c *client) UpdateCapvManagerBootstrapCredentialsSecret(username, password string) error { - credentialMap := map[string]string{ - "username": username, - "password": password, - } - - credBytes, err := yaml.Marshal(credentialMap) - if err != nil { - return errors.Wrap(err, "unable to save vSphere credentials") - } - - credBytesB64 := make([]byte, base64.StdEncoding.EncodedLen(len(credBytes))) - base64.StdEncoding.Encode(credBytesB64, credBytes) - - secret := &corev1.Secret{} - - patchString := fmt.Sprintf(`[ - { - "op": "replace", - "path": "/data/credentials.yaml", - "value": "%s" - } - ]`, string(credBytesB64)) - - log.V(4).Info("Patching capv-manager bootstrap credentials") - - pollOptions := &PollOptions{Interval: CheckResourceInterval, Timeout: c.operationTimeout} - if err := c.PatchResource(secret, vSphereBootstrapCredentialSecret, CapvNamespace, patchString, types.JSONPatchType, pollOptions); err != nil { - return errors.Wrap(err, "unable to save capv-manager bootstrap credential secret") - } - return nil -} - -func updateUsernamePassword(secretConfig []byte, secretName, configName, username, password string) ([]byte, error) { - /* - The secret is a yaml with comments. We will need to preserve the comments when updating the username and password - - Eg. - #@data/values - #@overlay/match-child-defaults missing_ok=True - --- - vsphereCPI: - image: - repository: projects-stg.registry.vmware.com/tkg - path: ccm/manager - tag: v2.0.1_vmware.1 - pullPolicy: IfNotPresent - tlsThumbprint: "" - server: 10.170.105.244 - datacenter: dc0 - username: test@test.com - password: test!23 - insecureFlag: true - */ - - var addonConfigNode yaml.Node - var err error - - if err = yaml.Unmarshal(secretConfig, &addonConfigNode); err != nil { - return []byte{}, errors.Wrapf(err, "unable to unmarshal csi config secret %s", secretName) - } - - headComment := addonConfigNode.Content[0].Content[0].HeadComment - - // update username and password - var addonConfigMap map[string]interface{} - if err = addonConfigNode.Decode(&addonConfigMap); err != nil { - return []byte{}, errors.Wrapf(err, "unable to unmarshal config secret %s", secretName) - } - - csiMap, ok := addonConfigMap[configName].(map[string]interface{}) - if !ok { - return []byte{}, errors.New("unable to update secret") - } - - if username != "" { - csiMap["username"] = username - } - - if password != "" { - csiMap["password"] = password - } - - addonConfigMap[configName] = csiMap - - var addonConfig []byte - if addonConfig, err = yaml.Marshal(&addonConfigMap); err != nil { - return []byte{}, err - } - - updatedSecretConfig := headComment + "\n" + "---" + "\n" + string(addonConfig) - return []byte(updatedSecretConfig), nil -} - -func (c *client) UpdateVsphereCloudProviderCredentialsSecret(clusterName, namespace, username, password string) error { // nolint:dupl - secret := &corev1.Secret{} - vSphereCpiConfigSecretName := fmt.Sprintf("%s-vsphere-cpi-addon", clusterName) - - pollOptions := &PollOptions{Interval: CheckResourceInterval, Timeout: c.operationTimeout} - err := c.GetResource(secret, vSphereCpiConfigSecretName, namespace, nil, pollOptions) - if err != nil { - return err - } - - cpiAddonConfig, ok := secret.Data[KeyVSphereCpiConfig] - if !ok { - return errors.Wrap(err, "unable to read vSphere cpi config secret") - } - - cpiAddonConfig, err = updateUsernamePassword(cpiAddonConfig, vSphereCpiConfigSecretName, "vsphereCPI", username, password) - if err != nil { - return errors.Wrapf(err, "unable to update vSphere cpi config secret %s", vSphereCpiConfigSecretName) - } - - cpiConfigB64 := make([]byte, base64.StdEncoding.EncodedLen(len(cpiAddonConfig))) - base64.StdEncoding.Encode(cpiConfigB64, cpiAddonConfig) - patchString := fmt.Sprintf(`[ - { - "op": "replace", - "path": "/data/values.yaml", - "value": "%s" - } - ]`, string(cpiConfigB64)) - - log.V(4).Info("Patching vsphere cpi config credential secret") - - if err := c.PatchResource(secret, vSphereCpiConfigSecretName, namespace, patchString, types.JSONPatchType, pollOptions); err != nil { - return errors.Wrap(err, "unable to save vsphere cpi config credential secret") - } - return nil -} - -func (c *client) UpdateVsphereCsiConfigSecret(clusterName, namespace, username, password string) error { // nolint:dupl - secret := &corev1.Secret{} - vSphereCsiConfigSecretName := fmt.Sprintf("%s-vsphere-csi-addon", clusterName) - - pollOptions := &PollOptions{Interval: CheckResourceInterval, Timeout: c.operationTimeout} - err := c.GetResource(secret, vSphereCsiConfigSecretName, namespace, nil, pollOptions) - if err != nil { - return err - } - - csiAddonConfig, ok := secret.Data[KeyVSphereCsiConfig] - if !ok { - return errors.Wrap(err, "unable to read vSphere csi config secret") - } - - csiAddonConfig, err = updateUsernamePassword(csiAddonConfig, vSphereCsiConfigSecretName, "vsphereCSI", username, password) - if err != nil { - return errors.Wrapf(err, "unable to update vSphere csi config secret %s", vSphereCsiConfigSecretName) - } - - csiConfigB64 := make([]byte, base64.StdEncoding.EncodedLen(len(csiAddonConfig))) - base64.StdEncoding.Encode(csiConfigB64, csiAddonConfig) - patchString := fmt.Sprintf(`[ - { - "op": "replace", - "path": "/data/values.yaml", - "value": "%s" - } - ]`, string(csiConfigB64)) - - log.V(4).Info("Patching vsphere csi config credential secret") - - if err := c.PatchResource(secret, vSphereCsiConfigSecretName, namespace, patchString, types.JSONPatchType, pollOptions); err != nil { - return errors.Wrap(err, "unable to save vsphere csi config credential secret") - } - return nil -} - -func (c *client) GetVCServer() (string, error) { - clusterList := &capvv1beta1.VSphereClusterList{} - - err := c.ListResources(clusterList, &crtclient.ListOptions{}) - if err != nil { - return "", err - } - - if len(clusterList.Items) == 0 { - return "", errors.New("unable to get vSphere server") - } - - return clusterList.Items[0].Spec.Server, nil -} - -func (c *client) GetAWSCredentialsFromSecret() (string, error) { - secretList := &corev1.SecretList{} - err := c.ListResources(secretList, &crtclient.ListOptions{}) - if err != nil { - return "", errors.Wrap(err, "unable to retrieve aws credentials") - } - - var b64CredsByte []byte - ok := false - for i := range secretList.Items { - if secretList.Items[i].Name == AWSBootstrapCredentialsSecret { - b64CredsByte, ok = secretList.Items[i].Data[KeyAWSCredentials] - break - } - } - - if len(b64CredsByte) == 0 || !ok { - return "", errors.Errorf("Unable to obtain %s field from %s secret's data", KeyAWSCredentials, AWSBootstrapCredentialsSecret) - } - - return string(b64CredsByte), nil -} - -func (c *client) GetAzureCredentialsFromSecret() (azureclient.Credentials, error) { - res := azureclient.Credentials{} - secretList := &corev1.SecretList{} - err := c.ListResources(secretList, &crtclient.ListOptions{}) - if err != nil { - return res, errors.Wrap(err, "unable to retrieve azure credentials") - } - - for i := range secretList.Items { - if secretList.Items[i].Name != AzureBootstrapCredentialsSecret { - continue - } - - if clientID, ok := secretList.Items[i].Data[KeyAzureClientID]; ok { - res.ClientID = string(clientID) - } - - if clientSecret, ok := secretList.Items[i].Data[KeyAzureClientSecret]; ok { - res.ClientSecret = string(clientSecret) - } - - if subscriptionID, ok := secretList.Items[i].Data[KeyAzureSubsciptionID]; ok { - res.SubscriptionID = string(subscriptionID) - } - - if tenantID, ok := secretList.Items[i].Data[KeyAzureTenantID]; ok { - res.TenantID = string(tenantID) - } - break - } - - if res.ClientID == "" || res.ClientSecret == "" || res.SubscriptionID == "" || res.TenantID == "" { - return res, errors.New("unable to retrieve azure credentials") - } - - return res, nil -} - -func (c *client) GetAzureCredentialsFromIdentity(identityName string, identityNamespace string) (azureclient.Credentials, error) { - res := azureclient.Credentials{} - - azureClusterIdentityGet := &capzv1beta1.AzureClusterIdentity{} - err := c.GetResource(azureClusterIdentityGet, identityName, identityNamespace, nil, nil) - if err != nil { - return res, errors.Wrap(err, "unable to retrieve AzureClusterIdentity") - } - res.ClientID = azureClusterIdentityGet.Spec.ClientID - res.TenantID = azureClusterIdentityGet.Spec.TenantID - clientSecretName := azureClusterIdentityGet.Spec.ClientSecret.Name - clientSecretNamespace := azureClusterIdentityGet.Spec.ClientSecret.Namespace - - if res.ClientID == "" || res.TenantID == "" || clientSecretName == "" || clientSecretNamespace == "" { - return res, errors.New("unable to retrieve azure credentials from AzureClusterIdentity") - } - - secretGet := &corev1.Secret{} - err = c.GetResource(secretGet, clientSecretName, clientSecretNamespace, nil, nil) - if err != nil { - return res, errors.Wrap(err, "unable to retrieve secret that is referenced by AzureClusterIdentity") - } - res.ClientSecret = string(secretGet.Data["clientSecret"]) - - return res, nil -} - -func (c *client) UpdateCapzManagerBootstrapCredentialsSecret(tenantID, clientID, clientSecret string) error { - var tenantIDBytes []byte - var clientIDBytes []byte - var clientSecretBytes []byte - - clientIDBytes = []byte(clientID) - clientIDBytesB64 := make([]byte, base64.StdEncoding.EncodedLen(len(clientIDBytes))) - base64.StdEncoding.Encode(clientIDBytesB64, clientIDBytes) - - clientSecretBytes = []byte(clientSecret) - clientSecretBytesB64 := make([]byte, base64.StdEncoding.EncodedLen(len(clientSecretBytes))) - base64.StdEncoding.Encode(clientSecretBytesB64, clientSecretBytes) - - tenantIDBytes = []byte(tenantID) - tenantIDBytesB64 := make([]byte, base64.StdEncoding.EncodedLen(len(tenantIDBytes))) - base64.StdEncoding.Encode(tenantIDBytesB64, tenantIDBytes) - - secret := &corev1.Secret{} - - patchString := fmt.Sprintf(`[ - { - "op": "replace", - "path": "/data/client-id", - "value": "%s" - }, - { - "op": "replace", - "path": "/data/client-secret", - "value": "%s" - }, - { - "op": "replace", - "path": "/data/tenant-id", - "value": "%s" - } - ]`, string(clientIDBytesB64), string(clientSecretBytesB64), string(tenantIDBytesB64)) - - log.V(4).Info("Patching capz-manager bootstrap credentials") - - pollOptions := &PollOptions{Interval: CheckResourceInterval, Timeout: c.operationTimeout} - if err := c.PatchResource(secret, AzureBootstrapCredentialsSecret, CapzNamespace, patchString, types.JSONPatchType, pollOptions); err != nil { - return errors.Wrap(err, "unable to save capz-manager bootstrap credential secret") - } - - return nil -} - -func (c *client) GetCAPZControllerManagerDeploymentsReplicas() (int32, error) { - deployment := &appsv1.Deployment{} - if err := c.GetResource(deployment, AzureControllerManagerDeploy, CapzNamespace, nil, nil); err != nil { - if k8serrors.IsNotFound(err) { - // if deployment is missing, return without errors - return 0, nil - } - return 0, errors.Wrapf(err, "failed to look up '%s' deployment", AzureControllerManagerDeploy) - } - curReplicas := *deployment.Spec.Replicas - return curReplicas, nil -} - -func (c *client) UpdateCAPZControllerManagerDeploymentReplicas(replicas int32) error { - deployment := &appsv1.Deployment{} - if err := c.GetResource(deployment, AzureControllerManagerDeploy, CapzNamespace, nil, nil); err != nil { - if k8serrors.IsNotFound(err) { - // if deployment is missing, return without errors - return nil - } - return errors.Wrapf(err, "failed to look up '%s' deployment", AzureControllerManagerDeploy) - } - - log.Info("Updating CAPZ deployment replicas") - patchString := fmt.Sprintf(`[ - { - "op": "replace", - "path": "/spec/replicas", - "value": %d - } - ]`, replicas) - - pollOptions := &PollOptions{Interval: CheckResourceInterval, Timeout: c.operationTimeout} - - if err := c.PatchResource(&appsv1.Deployment{}, AzureControllerManagerDeploy, CapzNamespace, patchString, types.JSONPatchType, pollOptions); err != nil { - return errors.Wrap(err, "unable to rollback capz-controller-manager deployment replicas") - } - - if err := c.WaitForAutoscalerDeployment(AzureControllerManagerDeploy, CapzNamespace); err != nil { - return errors.Wrap(err, "fail to update capz-controller-manager deployment replicas") - } - - return nil -} - -func (c *client) GetAzureClusterName(clusterName, namespace string) (string, string, error) { - cluster := &clusterv1beta1.Cluster{} - err := c.GetResource(cluster, clusterName, namespace, nil, nil) - if err != nil { - return "", "", errors.Wrapf(err, "unable to retrieve cluster %s", clusterName) - } - - if cluster.Spec.InfrastructureRef != nil && cluster.Spec.InfrastructureRef.Kind == "AzureCluster" { - return cluster.Spec.InfrastructureRef.Name, cluster.Spec.InfrastructureRef.Namespace, nil - } - - return "", "", errors.Errorf("unable to retrieve azure cluster from cluster %s", clusterName) -} - -func (c *client) GetKubeadmControlPlaneName(clusterName, namespace string) (string, string, error) { - cluster := &clusterv1beta1.Cluster{} - err := c.GetResource(cluster, clusterName, namespace, nil, nil) - if err != nil { - return "", "", errors.Wrapf(err, "unable to retrieve cluster %s", clusterName) - } - - if cluster.Spec.ControlPlaneRef != nil && cluster.Spec.ControlPlaneRef.Kind == "KubeadmControlPlane" { - return cluster.Spec.ControlPlaneRef.Name, cluster.Spec.ControlPlaneRef.Namespace, nil - } - - return "", "", errors.Errorf("unable to retrieve KubeadmControlPlane from cluster %s", clusterName) -} - -func (c *client) CheckUnifiedAzureClusterIdentity(clusterName, namespace string) (bool, error) { - azureClusterName, azureClusterNamespace, err := c.GetAzureClusterName(clusterName, namespace) - if err != nil { - return false, err - } - - azureCluster := &capzv1beta1.AzureCluster{} - err = c.GetResource(azureCluster, azureClusterName, azureClusterNamespace, nil, nil) - if err != nil { - return false, errors.Wrapf(err, "unable to retrieve azure cluster %s", azureClusterName) - } - - if azureCluster.Spec.IdentityRef != nil { - return false, nil - } - - return true, nil -} - -func (c *client) UpdateAzureClusterIdentity(clusterName, namespace, tenantID, clientID, clientSecret string) error { - azureClusterName, azureClusterNamespace, err := c.GetAzureClusterName(clusterName, namespace) - if err != nil { - return err - } - - azureCluster := &capzv1beta1.AzureCluster{} - err = c.GetResource(azureCluster, azureClusterName, azureClusterNamespace, nil, nil) - if err != nil { - return errors.Wrapf(err, "unable to retrieve azure cluster %s", azureClusterName) - } - - pollOptions := &PollOptions{Interval: CheckResourceInterval, Timeout: c.operationTimeout} - - // find AzureCluster identityRef - if azureCluster.Spec.IdentityRef != nil { - azureClusterIdentity := &capzv1beta1.AzureClusterIdentity{} - if err := c.GetResource(azureClusterIdentity, azureCluster.Spec.IdentityRef.Name, azureCluster.Spec.IdentityRef.Namespace, nil, nil); err != nil { - return errors.Wrapf(err, "unable to retrieve AzureClusterIdentity %s", azureCluster.Spec.IdentityRef.Name) - } - - // AzureClusterIdentity name and namespace - identityName := azureClusterIdentity.Name - identityNamespace := azureClusterIdentity.Namespace - - // Secret referenced by AzureClusterIdentity - secretName := azureClusterIdentity.Spec.ClientSecret.Name - secretNamespace := azureClusterIdentity.Spec.ClientSecret.Namespace - - log.V(4).Infof("Checking and Updating AzureClusterIdentity %s", identityName) - - // Update AzureClusterIdentity - patchString := fmt.Sprintf(`[ - { - "op": "replace", - "path": "/spec/clientID", - "value": "%s" - }, - { - "op": "replace", - "path": "/spec/tenantID", - "value": "%s" - } - ]`, clientID, tenantID) - - if err := c.PatchResource(&capzv1beta1.AzureClusterIdentity{}, identityName, identityNamespace, patchString, types.JSONPatchType, pollOptions); err != nil { - return errors.Wrapf(err, "unable to save azure cluster identity %s", identityName) - } - - // find the secret - log.V(4).Infof("Checking and Updating Secret %s", secretName) - secret := &corev1.Secret{} - err := c.GetResource(secret, secretName, secretNamespace, nil, nil) - if err != nil { - return errors.Wrapf(err, "unable to retrieve AzureClusterIdentity Secret %s", secretName) - } - - clientSecretBytes := []byte(clientSecret) - clientSecretBytesB64 := make([]byte, base64.StdEncoding.EncodedLen(len(clientSecretBytes))) - base64.StdEncoding.Encode(clientSecretBytesB64, clientSecretBytes) - - patchString = fmt.Sprintf(`[ - { - "op": "replace", - "path": "/data/clientSecret", - "value": "%s" - } - ]`, string(clientSecretBytesB64)) - - if err := c.PatchResource(&corev1.Secret{}, secretName, secretNamespace, patchString, types.JSONPatchType, pollOptions); err != nil { - return errors.Wrapf(err, "unable to save secret %s", secretName) - } - } - - return nil -} - -func (c *client) UpdateAzureKCP(clusterName, namespace string) error { - kcpName, kcpNamespace, err := c.GetKubeadmControlPlaneName(clusterName, namespace) - if err != nil { - return err - } - - kcp := &controlplanev1.KubeadmControlPlane{} - curTime := time.Now() - patchString := fmt.Sprintf(`[ - { - "op": "replace", - "path": "/spec/rolloutAfter", - "value": "%s" - } - ]`, curTime.Format(time.RFC3339)) - - log.V(4).Info("Recycling azure KCP for secret updating") - - pollOptions := &PollOptions{Interval: CheckResourceInterval, Timeout: c.operationTimeout} - if err = c.PatchResource(kcp, kcpName, kcpNamespace, patchString, types.JSONPatchType, pollOptions); err != nil { - return errors.Wrapf(err, "unable to recycle azure KubeadmControlPlane %s", kcpName) - } - return nil -} diff --git a/tkg/clusterclient/helper_test.go b/tkg/clusterclient/helper_test.go deleted file mode 100644 index 25d099464e..0000000000 --- a/tkg/clusterclient/helper_test.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clusterclient_test - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "sigs.k8s.io/yaml" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -var _ = Describe("Cluster Client Helper", func() { - var ( - err error - newImageRepository string - configMap *corev1.ConfigMap - ) - - Describe("Update ImageRepository In KubeadmConfigMap", func() { - BeforeEach(func() { - configMapBytes := getConfigMapFileData("kubeadm-config1.yaml") - configMap = &corev1.ConfigMap{} - err = yaml.Unmarshal(configMapBytes, configMap) - Expect(err).NotTo(HaveOccurred()) - }) - - JustBeforeEach(func() { - newImageRepository = "tkg.testing.repo" - err = UpdateCoreDNSImageRepositoryInKubeadmConfigMap(configMap, newImageRepository) - }) - Context("coredns image repository should be updated", func() { - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - imageRepo, err := getCoreDNSImageRepository(configMap) - Expect(err).NotTo(HaveOccurred()) - Expect(imageRepo).To(Equal(newImageRepository)) - }) - }) - }) -}) - -func getConfigMapFileData(filename string) []byte { - filePath := "../fakes/config/configmap/" + filename - input, _ := os.ReadFile(filePath) - return input -} - -func getCoreDNSImageRepository(kubedmconfigmap *corev1.ConfigMap) (string, error) { - clusterConfigurationKey := "ClusterConfiguration" - data, ok := kubedmconfigmap.Data[clusterConfigurationKey] - if !ok { - return "", errors.Errorf("unable to find %q key in kubeadm ConfigMap", clusterConfigurationKey) - } - - configuration := &unstructured.Unstructured{} - err := yaml.Unmarshal([]byte(data), configuration) - if err != nil { - return "", errors.Wrapf(err, "unable to decode kubeadm ConfigMap's %q to Unstructured object", clusterConfigurationKey) - } - - currentValue, _, err := unstructured.NestedString(configuration.UnstructuredContent(), "dns", "imageRepository") - return currentValue, err -} diff --git a/tkg/clusterclient/helpers.go b/tkg/clusterclient/helpers.go deleted file mode 100644 index a82173145b..0000000000 --- a/tkg/clusterclient/helpers.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clusterclient - -import ( - "strings" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "sigs.k8s.io/yaml" -) - -var ( - controlPlaneTolerations = []corev1.Toleration{ - { - Effect: "NoSchedule", - Key: "node-role.kubernetes.io/control-plane", - }, - { - Effect: "NoSchedule", - Key: "node-role.kubernetes.io/master", - }, - } - - controlPlaneNodeSelectors = []corev1.NodeSelectorTerm{ - { - MatchExpressions: []corev1.NodeSelectorRequirement{ - { - Key: "node-role.kubernetes.io/control-plane", - Operator: "Exists", - }, - }, - }, - { - MatchExpressions: []corev1.NodeSelectorRequirement{ - { - Key: "node-role.kubernetes.io/master", - Operator: "Exists", - }, - }, - }, - } -) - -// yamlToUnstructured reads yaml bytes and converts it to *unstructured.Unstructured. -func yamlToUnstructured(rawYAML []byte) (*unstructured.Unstructured, error) { - unst := &unstructured.Unstructured{} - err := yaml.Unmarshal(rawYAML, unst) - return unst, err -} - -func updateFieldInUnstructured(configuration *unstructured.Unstructured, path []string, value string) error { - currentValue, _, err := unstructured.NestedString(configuration.UnstructuredContent(), path...) - if err != nil { - return errors.Wrapf(err, "unable to retrieve %q from unstructured configuration", strings.Join(path, ".")) - } - if currentValue != value { - if err := unstructured.SetNestedField(configuration.UnstructuredContent(), value, path...); err != nil { - return errors.Wrapf(err, "unable to update %q on unstructured configuration", strings.Join(path, ".")) - } - } - return nil -} - -// UpdateCoreDNSImageRepositoryInKubeadmConfigMap updates coredns imageRepository in kubeadm-config configMap -func UpdateCoreDNSImageRepositoryInKubeadmConfigMap(kubedmconfigmap *corev1.ConfigMap, newImageRepository string) error { - data, ok := kubedmconfigmap.Data[clusterConfigurationKey] - if !ok { - return errors.Errorf("unable to find %q key in kubeadm ConfigMap", clusterConfigurationKey) - } - - configuration, err := yamlToUnstructured([]byte(data)) - if err != nil { - return errors.Wrapf(err, "unable to decode kubeadm ConfigMap's %q to Unstructured object", clusterConfigurationKey) - } - - // Update dns.imageRepository in kubeadm-config ConfigMap - err = updateFieldInUnstructured(configuration, []string{"dns", "imageRepository"}, newImageRepository) - if err != nil { - return errors.Wrap(err, "unable to update kubeadm-config ConfigMap") - } - - updated, err := yaml.Marshal(configuration) - if err != nil { - return errors.Wrapf(err, "unable to encode kubeadm ConfigMap's %q to YAML", clusterConfigurationKey) - } - kubedmconfigmap.Data[clusterConfigurationKey] = string(updated) - return nil -} - -// ensurePodSpecControlPlaneAffinity sets tolerations and affinity on a pod spec -// to ensure that it runs on a control plane node. -func ensurePodSpecControlPlaneAffinity(spec *corev1.PodSpec) { - spec.Tolerations = ensureControlPlaneTolerations(spec.Tolerations) - spec.Affinity = &corev1.Affinity{ - NodeAffinity: &corev1.NodeAffinity{ - RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ - NodeSelectorTerms: controlPlaneNodeSelectors, - }, - }, - } -} - -// ensureControlPlaneTolerations sets the tolerations to allow a pod to run -// on a control plane node -func ensureControlPlaneTolerations(tolerations []corev1.Toleration) []corev1.Toleration { - for _, cpToleration := range controlPlaneTolerations { - if !hasToleration(cpToleration, tolerations) { - tolerations = append(tolerations, cpToleration) - } - } - return tolerations -} - -// hasToleration returns true if a slice of tolerations includes a given toleration -func hasToleration(toleration corev1.Toleration, tolerations []corev1.Toleration) bool { - for _, t := range tolerations { - if t == toleration { - return true - } - } - return false -} diff --git a/tkg/clusterclient/poller.go b/tkg/clusterclient/poller.go deleted file mode 100644 index 7e7a4e2d0f..0000000000 --- a/tkg/clusterclient/poller.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clusterclient - -import ( - "time" - - "k8s.io/apimachinery/pkg/util/wait" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// GetterFunc is a function which should be used as closure -type GetterFunc func() (interface{}, error) - -//go:generate counterfeiter -o ../fakes/poller.go --fake-name Poller . Poller - -// Poller implements polling helper functions -type Poller interface { - // PollImmediate is a wrapper on top of wait.PollImmediate - // use this function to exercise your condition function with unit tests - PollImmediate(interval, timeout time.Duration, condition wait.ConditionFunc) error - - // PollImmediateWithGetter is a generic implementation of polling mechanism - // it will periodically call getterFunc and will return error based on the getterFunc error message if any - PollImmediateWithGetter(interval, timeout time.Duration, getterFunc GetterFunc) (interface{}, error) - - // PollImmediateInfinite is a wrapper on top of wait.PollImmediateInfinite - PollImmediateInfinite(interval time.Duration, condition wait.ConditionFunc) error - - // PollImmediateInfiniteWithGetter is a generic implementation of polling mechanism - // it will periodically call getterFunc and will return error based on the getterFunc error message if any - PollImmediateInfiniteWithGetter(interval time.Duration, getterFunc GetterFunc) error -} - -type pollerProxy struct{} - -// NewPoller returns new poller -func NewPoller() Poller { - return &pollerProxy{} -} - -// PollImmediate is a wrapper on top of wait.PollImmediate -// use this function to exercise your condition function with unit tests -func (p *pollerProxy) PollImmediate(interval, timeout time.Duration, condition wait.ConditionFunc) error { - return wait.PollImmediate(interval, timeout, condition) -} - -// PollImmediateInfinite is a wrapper on top of wait.PollImmediateInfinite -func (p *pollerProxy) PollImmediateInfinite(interval time.Duration, condition wait.ConditionFunc) error { - return wait.PollImmediateInfinite(interval, condition) -} - -// PollImmediateWithGetter is a generic implementation of polling mechanism -// it will periodically call getterFunc and will return error based on the getterFunc error message if any -func (p *pollerProxy) PollImmediateWithGetter(interval, timeout time.Duration, getterFunc GetterFunc) (interface{}, error) { - var result interface{} - var err error - pollerFunc := func() (bool, error) { - result, err = getterFunc() - if err != nil { - log.V(6).Info(err.Error() + ", retrying") - return false, nil - } - return true, nil - } - - errPoll := p.PollImmediate(interval, timeout, pollerFunc) - if errPoll != nil { - // note: this function will return actual error which is thrown by getterFunc - // and will not return error of the PollImmediate call (which is always time-out...) - return nil, err - } - - return result, nil -} - -// PollImmediateInfiniteWithGetter is a generic implementation of polling mechanism -// it will periodically call getterFunc and will return error based on the getterFunc error message if any -func (p *pollerProxy) PollImmediateInfiniteWithGetter(interval time.Duration, getterFunc GetterFunc) error { - var timeout interface{} - var err error - pollerFunc := func() (bool, error) { - timeout, err = getterFunc() - timeoutBool := timeout.(bool) - if timeoutBool { - log.V(6).Info(err.Error()) - return false, err - } - if err != nil { - log.V(6).Info(err.Error() + ", retrying") - return false, nil - } - return true, nil - } - - errPoll := p.PollImmediateInfinite(interval, pollerFunc) - if errPoll != nil { - // note: this function will return actual error which is thrown by getterFunc - // and will not return error of the PollImmediateInfinite call - return err - } - return nil -} diff --git a/tkg/clusterclient/resource.go b/tkg/clusterclient/resource.go deleted file mode 100644 index ef869a9f1a..0000000000 --- a/tkg/clusterclient/resource.go +++ /dev/null @@ -1,346 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clusterclient - -import ( - "context" - "fmt" - "reflect" - - "github.com/pkg/errors" - appsv1 "k8s.io/api/apps/v1" - "k8s.io/apimachinery/pkg/types" - kerrors "k8s.io/apimachinery/pkg/util/errors" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - addonsv1 "sigs.k8s.io/cluster-api/exp/addons/api/v1beta1" - "sigs.k8s.io/cluster-api/util/conditions" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// PostVerifyrFunc is a function which should be used as closure -type PostVerifyrFunc func(obj crtclient.Object) error - -// PostVerifyListrFunc is a function which should be used as closure -type PostVerifyListrFunc func(obj crtclient.ObjectList) error - -func (c *client) ListResources(resourceReference interface{}, option ...crtclient.ListOption) error { - obj, err := getRuntimeObjectList(resourceReference) - if err != nil { - return err - } - if err := c.clientSet.List(context.TODO(), obj, option...); err != nil { - return errors.Wrapf(err, "failed to list %v", reflect.TypeOf(resourceReference)) - } - return nil -} - -func (c *client) DeleteResource(resourceReference interface{}) error { - obj, err := getRuntimeObject(resourceReference) - if err != nil { - return err - } - if err := c.clientSet.Delete(ctx, obj); err != nil { - return errors.Wrapf(err, "failed to delete %v", reflect.TypeOf(resourceReference)) - } - return nil -} - -func (c *client) CreateResource(resourceReference interface{}, resourceName, namespace string, opts ...crtclient.CreateOption) error { - obj, err := getRuntimeObject(resourceReference) - if err != nil { - return err - } - - if err := c.clientSet.Create(ctx, obj, opts...); err != nil { - return errors.Wrapf(err, "error while creating object for %q %s/%s", - obj.GetObjectKind(), namespace, resourceName) - } - return nil -} - -func (c *client) UpdateResourceWithPolling(resourceReference interface{}, resourceName, namespace string, pollOptions *PollOptions, opts ...crtclient.UpdateOption) error { - if pollOptions != nil { - log.V(6).Infof("Updating resource %s of type %s ...", resourceName, reflect.TypeOf(resourceReference)) - _, err := c.poller.PollImmediateWithGetter(pollOptions.Interval, pollOptions.Timeout, func() (interface{}, error) { - return nil, c.UpdateResource(resourceReference, resourceName, namespace, opts...) - }) - return err - } - - return c.UpdateResource(resourceReference, resourceName, namespace, opts...) -} - -func (c *client) UpdateResource(resourceReference interface{}, resourceName, namespace string, opts ...crtclient.UpdateOption) error { - obj, err := getRuntimeObject(resourceReference) - if err != nil { - return err - } - - if err := c.clientSet.Update(ctx, obj, opts...); err != nil { - return errors.Wrapf(err, "error while creating object for %q %s/%s", - obj.GetObjectKind(), namespace, resourceName) - } - return nil -} - -func (c *client) PatchResource(resourceReference interface{}, resourceName, namespace, patchJSONString string, patchType types.PatchType, pollOptions *PollOptions) error { - // if pollOptions are provided use the polling and wait for the result/error/timeout - // else use normal get - if pollOptions != nil { - log.V(6).Infof("Applying patch to resource %s of type %s ...", resourceName, reflect.TypeOf(resourceReference)) - _, err := c.poller.PollImmediateWithGetter(pollOptions.Interval, pollOptions.Timeout, func() (interface{}, error) { - return nil, c.patchResource(resourceReference, resourceName, namespace, patchJSONString, patchType) - }) - return err - } - - return c.patchResource(resourceReference, resourceName, namespace, patchJSONString, patchType) -} - -func (c *client) patchResource(resourceReference interface{}, resourceName, namespace, patchJSONString string, patchType types.PatchType) error { - patch := crtclient.RawPatch(patchType, []byte(patchJSONString)) - - obj, err := getRuntimeObject(resourceReference) - if err != nil { - return err - } - clusterObjKey := crtclient.ObjectKey{ - Namespace: namespace, - Name: resourceName, - } - - if err := c.clientSet.Get(ctx, clusterObjKey, obj); err != nil { - return errors.Wrapf(err, "error reading %q %s/%s", - obj.GetObjectKind(), namespace, resourceName) - } - - if err := c.clientSet.Patch(ctx, obj, patch); err != nil { - return errors.Wrapf(err, "error while applying patch for %q %s/%s", - obj.GetObjectKind(), namespace, resourceName) - } - return nil -} - -func (c *client) get(objectName, namespace string, o interface{}, postVerify PostVerifyrFunc) error { - obj, err := getRuntimeObject(o) - if err != nil { - return err - } - objKey := crtclient.ObjectKey{Name: objectName, Namespace: namespace} - if err := c.clientSet.Get(ctx, objKey, obj); err != nil { - return err - } - if postVerify != nil { - return postVerify(obj) - } - return nil -} - -func (c *client) list(clusterName, namespace string, o interface{}, postVerify PostVerifyListrFunc) error { - obj, err := getRuntimeObjectList(o) - if err != nil { - return err - } - - selectors := []crtclient.ListOption{ - crtclient.InNamespace(namespace), - crtclient.MatchingLabels(map[string]string{capi.ClusterLabelName: clusterName}), - } - - if err := c.clientSet.List(ctx, obj, selectors...); err != nil { - return err - } - - if postVerify != nil { - return postVerify(obj) - } - return nil -} - -func getRuntimeObject(o interface{}) (crtclient.Object, error) { - obj, ok := o.(crtclient.Object) - if !ok { - return nil, errors.New("invalid object type") - } - return obj, nil -} - -func getRuntimeObjectList(o interface{}) (crtclient.ObjectList, error) { - obj, ok := o.(crtclient.ObjectList) - if !ok { - return nil, errors.New("invalid object type") - } - return obj, nil -} - -// VerifyClusterInitialized verifies the cluster is initialized or not (this is required before reading the kubeconfig secret) -func VerifyClusterInitialized(obj crtclient.Object) error { - switch cluster := obj.(type) { - case *capi.Cluster: - errList := []error{} - if !conditions.IsTrue(cluster, capi.ControlPlaneReadyCondition) { - reason := conditions.GetReason(cluster, capi.ReadyCondition) - errList = append(errList, fmt.Errorf("cluster control plane is still being initialized: %s", reason)) - } - - // Nb. We are verifying infrastructure ready at this stage because it provides an early signal that the infrastructure provided is - // properly working, but this is not strictly required for getting the kubeconfig secret - if !conditions.IsTrue(cluster, capi.InfrastructureReadyCondition) { - reason := conditions.GetReason(cluster, capi.ReadyCondition) - errList = append(errList, fmt.Errorf("cluster infrastructure is still being provisioned: %s", reason)) - } - return kerrors.NewAggregate(errList) - default: - return errors.Errorf("invalid type: %s during VerifyClusterInitialized", reflect.TypeOf(cluster)) - } -} - -// VerifyClusterReady verifies the cluster is ready or not (this is required before starting the move operation) -func VerifyClusterReady(obj crtclient.Object) error { - // Nb. Currently there is no difference between VerifyClusterReady and VerifyClusterInitialized unless WorkersReady condition - // would be added to cluster `Ready` condition aggregation. - return VerifyClusterInitialized(obj) -} - -// VerifyMachinesReady verifies the machine are ready or not (this is required before starting the move operation) -func VerifyMachinesReady(obj crtclient.ObjectList) error { - switch machines := obj.(type) { - case *capi.MachineList: - errList := []error{} - // Checking all the machine have a NodeRef - // Nb. NodeRef is considered a better signal than InfrastructureReady, because it ensures the node in the workload cluster is up and running. - for i := range machines.Items { - if machines.Items[i].Status.NodeRef == nil { - errList = append(errList, errors.Errorf("machine %s is still being provisioned", machines.Items[i].Name)) - } - } - return kerrors.NewAggregate(errList) - default: - return errors.Errorf("invalid type: %s during VerifyMachinesReady", reflect.TypeOf(machines)) - } -} - -// VerifyKubeadmControlPlaneReplicas verifies the KubeadmControlPlane has all the required replicas (this is required before starting the move operation) -func VerifyKubeadmControlPlaneReplicas(obj crtclient.ObjectList) error { - switch kcps := obj.(type) { - case *controlplanev1.KubeadmControlPlaneList: - errList := []error{} - for i := range kcps.Items { - var desiredReplica int32 = 1 - if kcps.Items[i].Spec.Replicas != nil { - desiredReplica = *kcps.Items[i].Spec.Replicas - } - if desiredReplica != kcps.Items[i].Status.ReadyReplicas { - errList = append(errList, errors.Errorf("control-plane is still creating replicas, DesiredReplicas=%v Replicas=%v ReadyReplicas=%v UpdatedReplicas=%v", - desiredReplica, kcps.Items[i].Status.Replicas, kcps.Items[i].Status.ReadyReplicas, kcps.Items[i].Status.UpdatedReplicas)) - } - } - return kerrors.NewAggregate(errList) - default: - return errors.Errorf("invalid type: %s during VerifyKubeadmControlPlaneReplicas", reflect.TypeOf(kcps)) - } -} - -// VerifyMachineDeploymentsReplicas verifies the MachineDeployment has all the required replicas (this is required before starting the move operation) -func VerifyMachineDeploymentsReplicas(obj crtclient.ObjectList) error { - switch deployments := obj.(type) { - case *capi.MachineDeploymentList: - errList := []error{} - for i := range deployments.Items { - var desiredReplica int32 = 1 - if deployments.Items[i].Spec.Replicas != nil { - desiredReplica = *deployments.Items[i].Spec.Replicas - } - if desiredReplica != deployments.Items[i].Status.ReadyReplicas { - errList = append(errList, errors.Errorf("worker nodes are still being created for MachineDeployment '%s', DesiredReplicas=%v Replicas=%v ReadyReplicas=%v UpdatedReplicas=%v", - deployments.Items[i].Name, desiredReplica, deployments.Items[i].Status.Replicas, deployments.Items[i].Status.ReadyReplicas, deployments.Items[i].Status.UpdatedReplicas)) - } - } - return kerrors.NewAggregate(errList) - default: - return errors.Errorf("invalid type: %s during VerifyMachineDeploymentsReplicas", reflect.TypeOf(deployments)) - } -} - -// VerifyDeploymentAvailable verifies the deployment has at least one replica running under it or not -func VerifyDeploymentAvailable(obj crtclient.Object) error { - switch deployment := obj.(type) { - case *appsv1.Deployment: - if deployment.Status.AvailableReplicas < 1 { - return errors.Errorf("pods are not yet running for deployment '%s' in namespace '%s'", deployment.Name, deployment.Namespace) - } - default: - return errors.Errorf("invalid type: %s during VerifyDeploymentAvailable", reflect.TypeOf(deployment)) - } - return nil -} - -// VerifyAutoscalerDeploymentAvailable verifies autoscaler deployment's availability -func VerifyAutoscalerDeploymentAvailable(obj crtclient.Object) error { - switch deployment := obj.(type) { - case *appsv1.Deployment: - if *deployment.Spec.Replicas != deployment.Status.AvailableReplicas || *deployment.Spec.Replicas != deployment.Status.UpdatedReplicas || *deployment.Spec.Replicas != deployment.Status.Replicas { - return errors.Errorf("pods are not yet running for deployment '%s' in namespace '%s'", deployment.Name, deployment.Namespace) - } - default: - return errors.Errorf("invalid type: %s during VerifyAutoscalerDeploymentAvailable", reflect.TypeOf(deployment)) - } - return nil -} - -// VerifyCRSAppliedSuccessfully verifies that all CRS objects are applied successfully after cluster creation -func VerifyCRSAppliedSuccessfully(obj crtclient.ObjectList) error { - switch crsList := obj.(type) { - case *addonsv1.ClusterResourceSetList: - errList := []error{} - for i := range crsList.Items { - if !conditions.IsTrue(crsList.Items[i].DeepCopy(), addonsv1.ResourcesAppliedCondition) { - errList = append(errList, errors.Errorf("ClusterResourceSet %s is not yet applied", crsList.Items[i].Name)) - } - } - return kerrors.NewAggregate(errList) - default: - return errors.Errorf("invalid type: %s during VerifyCRSAppliedSuccessfully", reflect.TypeOf(crsList)) - } -} - -// VerifyAVIResourceCleanupFinished verifies that avi objects clean up finished. -func VerifyAVIResourceCleanupFinished(obj crtclient.Object) error { - switch statefulSet := obj.(type) { - case *appsv1.StatefulSet: - if statefulSet.Annotations != nil && statefulSet.Annotations[constants.AkoCleanUpAnnotationKey] == constants.AkoCleanUpFinishedStatus { - return nil - } - return errors.Errorf("AVI Resource clean up in progress") - default: - return errors.Errorf("invalid type: %s during VerifyAVIResourceCleanupFinished", reflect.TypeOf(statefulSet)) - } -} - -// VerifyPackageInstallReconciledSuccessfully verifies that packageInstall reconcile successfully -func VerifyPackageInstallReconciledSuccessfully(obj crtclient.Object) error { - switch packageInstall := obj.(type) { - case *kappipkg.PackageInstall: - - for _, cond := range packageInstall.Status.Conditions { - switch cond.Type { - case kappctrl.ReconcileSucceeded: - return nil - case kappctrl.ReconcileFailed: - return fmt.Errorf("package reconciliation failed. package: %s, reason: %s", packageInstall.Name, packageInstall.Status.UsefulErrorMessage) - } - } - - return errors.Errorf("waiting for '%s' Package to be installed", packageInstall.Name) - default: - return errors.Errorf("invalid type: %s during VerifyPackageInstallReconcilledSuccessfully", reflect.TypeOf(packageInstall)) - } -} diff --git a/tkg/clusterclient/templates.go b/tkg/clusterclient/templates.go deleted file mode 100644 index d2630d75fe..0000000000 --- a/tkg/clusterclient/templates.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clusterclient - -import ( - "github.com/pkg/errors" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -func (c *client) GetVCClientAndDataCenter(clusterName, clusterNamespace, vsphereMachineTemplateObjectName string, vcClientFactory vc.VcClientFactory) (vc.Client, string, error) { - if c.verificationClientFactory != nil && c.verificationClientFactory.GetVCClientAndDataCenter != nil { - return c.verificationClientFactory.GetVCClientAndDataCenter(clusterName, clusterNamespace, vsphereMachineTemplateObjectName) - } - - vsphereUsername, vspherePassword, err := c.GetVCCredentialsFromCluster(clusterName, clusterNamespace) - if err != nil { - return nil, "", errors.Wrap(err, "unable to retrieve vSphere credentials to retrieve VM Template") - } - - vsphereMachineTemplate := &capvv1beta1.VSphereMachineTemplate{} - if err = c.GetResource(vsphereMachineTemplate, vsphereMachineTemplateObjectName, clusterNamespace, nil, nil); err != nil { - return nil, "", errors.Wrapf(err, "unable to find VSphereMachineTemplate with name '%s' in namespace '%s' retrieve VM Template", vsphereMachineTemplateObjectName, clusterNamespace) - } - vsphereServer := vsphereMachineTemplate.Spec.Template.Spec.Server - dcName := vsphereMachineTemplate.Spec.Template.Spec.Datacenter - - // TODO: Read `vsphereInsecure`, `vsphereThumbprint` from cluster object - // if this values are not available for old cluster use Insecure 'true' by default - vsphereInsecure := true - vcClient, err := vc.GetAuthenticatedVCClient(vsphereServer, vsphereUsername, vspherePassword, "", vsphereInsecure, vcClientFactory) - if err != nil { - return nil, "", errors.Wrap(err, "unable to retrieve vSphere Client to retrieve VM Template") - } - - return vcClient, dcName, nil -} diff --git a/tkg/clusterclient/types.go b/tkg/clusterclient/types.go deleted file mode 100644 index 6630296387..0000000000 --- a/tkg/clusterclient/types.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package clusterclient - -import "github.com/vmware-tanzu/tanzu-framework/tkg/vc" - -// constants related to tkg operation info that are used for adding -// annotations to the clusters -const ( - TKGOperationInfoKey = "TKGOperationInfo" - TKGOperationLastObservedTimestampKey = "TKGOperationLastObservedTimestamp" - TKGVersionKey = "TKGVERSION" - CAPAControllerNamespace = "capa-system" - CAPACredentialsSecretName = "capa-manager-bootstrap-credentials" - CAPAControllerDeploymentName = "capa-controller-manager" -) - -// Operation type constants -const ( - OperationTypeUpgrade = "Upgrade" - OperationTypeCreate = "Create" -) - -const ( - kubeProxyKey = "kube-proxy" - calicoNodeKey = "calico-node" - calicoKubeControllerKey = "calico-kube-controllers" - kubeadmConfigKey = "kubeadm-config" - clusterConfigurationKey = "ClusterConfiguration" - kappControllerKey = "kapp-controller" - kappControllServiceAccount = "kapp-controller-sa" - kappControllerClusterRole = "kapp-controller-cluster-role" - kappControllerClusterRoleBinding = "kapp-controller-cluster-role-binding" - kappControllerOldNamespace = "vmware-system-tmc" - kappControllerNamespace = "tkg-system" -) - -// OperationStatus describes current status of running operation -// this struct is used for patching cluster object with the last -// invoked operation information. -// This information combined with TKGOperationLastObservedTimestamp -// will be used for determining stalled state of a cluster -type OperationStatus struct { - Operation string `json:"Operation"` - OperationStartTimestamp string `json:"OperationStartTimestamp"` - OperationTimeout int `json:"OperationTimeout"` -} - -// VerificationClientFactory clusterclient verification factory -// implements functions regarding verification which can be replaced with -// fake implementation for unit testing -type VerificationClientFactory struct { - VerifyKubernetesUpgradeFunc func(clusterStatusInfo *ClusterStatusInfo, newK8sVersion string) error - GetVCClientAndDataCenter func(clusterName, clusterNamespace, vsphereMachineTemplateObjectName string) (vc.Client, string, error) -} diff --git a/tkg/cmd/add.go b/tkg/cmd/add.go deleted file mode 100644 index a1b7f2c8cf..0000000000 --- a/tkg/cmd/add.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var addCmd = &cobra.Command{ - Use: "add", - Short: "Add an existing resource to the current configuration", - Long: "Add an existing resource to the current configuration", -} - -func init() { - RootCmd.AddCommand(addCmd) -} diff --git a/tkg/cmd/add_region.go b/tkg/cmd/add_region.go deleted file mode 100644 index b1246f7a65..0000000000 --- a/tkg/cmd/add_region.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type addRegionOptions struct { - overwrite bool - useDirectReference bool -} - -var ( - ar = &addRegionOptions{} - addRegionCmd = &cobra.Command{ - Use: "management-cluster", - Short: "Add an existing management cluster", - Long: "Add an existing management cluster to the config file", - Aliases: []string{"mc"}, - Run: func(cmd *cobra.Command, args []string) { - err := runAddRegion() - verifyCommandError(err) - }, - } -) - -func init() { - addRegionCmd.Flags().BoolVarP(&ar.overwrite, "overwrite", "", false, "Overwrite management cluster context if already exists") - addRegionCmd.Flags().BoolVarP(&ar.useDirectReference, "direct-reference", "", false, "reference credentials to the cluster directly via the kubeconfig provided") - addRegionCmd.Flags().MarkHidden("direct-reference") //nolint - addCmd.AddCommand(addRegionCmd) -} - -func runAddRegion() error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - addRegionOptions := tkgctl.AddRegionOptions{ - Overwrite: ar.overwrite, - UseDirectReference: ar.useDirectReference, - } - return tkgClient.AddRegion(addRegionOptions) -} diff --git a/tkg/cmd/cmd_suite_test.go b/tkg/cmd/cmd_suite_test.go deleted file mode 100644 index c33c57a009..0000000000 --- a/tkg/cmd/cmd_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestCmd(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Cmd Suite") -} diff --git a/tkg/cmd/common.go b/tkg/cmd/common.go deleted file mode 100644 index 1bfaac71f4..0000000000 --- a/tkg/cmd/common.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -func newTKGCtlClient() (tkgctl.TKGClient, error) { - tkgConfigDir, err := getTKGConfigDir() - if err != nil { - return nil, errors.Wrap(err, "unable to get default TKG config directory") - } - - logOptions := tkgctl.LoggingOptions{ - File: logFile, - Quietly: logQuietly, - Verbosity: verbosityLevel, - } - - return tkgctl.New(tkgctl.Options{ - ConfigDir: tkgConfigDir, - KubeConfig: kubeconfig, - LogOptions: logOptions, - }) -} - -func verifyCommandError(err error) { - if err != nil { - log.Error(err, "\nError: ") - if tmpLogFile == "" { - tmpLogFile = logFile - } - log.Error(errors.Errorf("\nDetailed log about the failure can be found at: %s\n", tmpLogFile), "") - os.Exit(1) - } -} - -func displayLogFileLocation() { - currentLogFile := "" - if tmpLogFile != "" { - currentLogFile = tmpLogFile - } else if logFile != "" { - currentLogFile = logFile - } - - if currentLogFile != "" { - log.ForceWriteToStdErr([]byte(fmt.Sprintf("Logs of the command execution can also be found at: %s\n", currentLogFile))) - } -} - -func getTKGConfigDir() (string, error) { - if cfgDir != "" { - return cfgDir, nil - } - homeDir, err := os.UserHomeDir() - if err != nil { - return "", errors.Wrap(err, "unable to get home directory") - } - return filepath.Join(homeDir, ".tkg"), nil -} diff --git a/tkg/cmd/config.go b/tkg/cmd/config.go deleted file mode 100644 index 3cc7201f33..0000000000 --- a/tkg/cmd/config.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var configCmd = &cobra.Command{ - Use: "config", - Short: "Generate Cluster API provider configuration", - Long: "Generate Cluster API provider configuration and cluster plans for creating Tanzu Kubernetes clusters", -} - -func init() { - RootCmd.AddCommand(configCmd) -} diff --git a/tkg/cmd/config_cluster.go b/tkg/cmd/config_cluster.go deleted file mode 100644 index dcb66181e0..0000000000 --- a/tkg/cmd/config_cluster.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" - - configlib "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -var configClusterCmd = &cobra.Command{ - Use: "cluster CLUSTER_NAME", - Short: "Generate a cluster plan for creating a workload clusters", - Long: LongDesc(` - Generates a cluster plan representing the desired state of a Tanzu Kubernetes cluster that can then be applied to a management cluster.`), - - Example: Examples(` - # Generates a yaml file for creating a development cluster with TKr v1.17.3---vmware.2-tkr.1 - tkg config cluster my-cluster --plan=dev --tkr=v1.17.3---vmware.2-tkr.1 - - # Generates a yaml file for creating a production cluster with custom number of nodes - tkg config cluster my-cluster --plan=prod --controlplane-machine-count=3 --worker-machine-count=10 - - - # Generates a yaml file for creating a production cluster on vSphere using 'medium' instance size - # for control plane nodes, and 'large' size for worker nodes. - tkg config cluster my-cluster --size medium --worker-size large -p prod - - [+] : instance size options available for vSphere are as follows: - vSphere: [extra-large,large,medium,small]`), - - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - err := runGenerateClusterConfig(args[0], configclusteroption) - verifyCommandError(err) - }, -} - -var configclusteroption = &createClusterOptions{} - -func init() { - // --------------------------------------------------------------TODO-----V - configClusterCmd.Flags().StringVarP(&configclusteroption.plan, "plan", "p", "", "The cluster plan to be used for creating the workload cluster") - if err := configClusterCmd.MarkFlagRequired("plan"); err != nil { - log.Fatal(err, "") - } - configClusterCmd.Flags().StringVarP(&configclusteroption.clusterConfigFile, "file", "", "", "The cluster configuration file (default \"$HOME/.tkg/cluster-config.yaml\")") - - configClusterCmd.Flags().StringVarP(&configclusteroption.tkrName, "tkr", "", "", "TanzuKubernetesRelease(TKr) to be used for creating the workload cluster") - configClusterCmd.Flags().IntVarP(&configclusteroption.controlPlaneMachineCount, "controlplane-machine-count", "c", 0, "The number of control plane machines to be added to the workload cluster (default 1 or 3 depending on dev or prod plan)") - configClusterCmd.Flags().IntVarP(&configclusteroption.workerMachineCount, "worker-machine-count", "w", 0, "The number of worker machines to be added to the workload cluster (default 1 or 3 depending on dev or prod plan)") - configClusterCmd.Flags().StringVarP(&configclusteroption.namespace, "namespace", "n", "", "The namespace where the cluster should be deployed. Assumes 'default' if not specified") - configClusterCmd.Flags().StringVarP(&configclusteroption.size, "size", "", "", "Specify size for all nodes including control plane and worker nodes. It can be overridden by --controlplane-size and --worker-size options. (See [+])") - configClusterCmd.Flags().StringVarP(&configclusteroption.controlPlaneSize, "controlplane-size", "", "", "Specify size for the control plane node. (See [+])") - configClusterCmd.Flags().StringVarP(&configclusteroption.workerSize, "worker-size", "", "", "Specify size of the worker node. (See [+])") - configClusterCmd.Flags().StringVarP(&configclusteroption.cniType, "cni", "", "", "Specify the CNI provider the cluster should use ['antrea' (default), 'calico', 'none'].") - configClusterCmd.Flags().StringVarP(&configclusteroption.enableClusterOptions, "enable-cluster-options", "", "", "List of comma separated cluster options to be enabled") - configClusterCmd.Flags().StringVarP(&configclusteroption.vsphereControlPlaneEndpoint, "vsphere-controlplane-endpoint", "", "", "Virtual IP address or FQDN for the cluster's control plane nodes") - // Usually not needed as they are implied from configuration of the management cluster. - configClusterCmd.Flags().StringVarP(&configclusteroption.infrastructureProvider, "infrastructure", "i", "", "The target infrastructure on which to deploy the workload cluster.") - configClusterCmd.Flags().MarkHidden("infrastructure") //nolint - - configClusterCmd.Flags().SetNormalizeFunc(aliasNormalizeFunc) - configCmd.AddCommand(configClusterCmd) -} - -func runGenerateClusterConfig(name string, options *createClusterOptions) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - tkrVersion := "" - if options.tkrName != "" { - tkrVersion = utils.GetTKRVersionFromTKRName(options.tkrName) - } - - return tkgClient.ConfigCluster(buildCreateClusterOption(name, tkrVersion, options)) -} - -func buildCreateClusterOption(name, tkrVersion string, options *createClusterOptions) tkgctl.CreateClusterOptions { - edition, _ := configlib.GetEdition() - return tkgctl.CreateClusterOptions{ - ClusterConfigFile: options.clusterConfigFile, - ClusterName: name, - Namespace: options.namespace, - Plan: options.plan, - InfrastructureProvider: options.infrastructureProvider, - TkrVersion: tkrVersion, - ControlPlaneMachineCount: options.controlPlaneMachineCount, - WorkerMachineCount: options.workerMachineCount, - GenerateOnly: options.generateOnly, - Size: options.size, - ControlPlaneSize: options.controlPlaneSize, - WorkerSize: options.workerSize, - CniType: options.cniType, - EnableClusterOptions: options.enableClusterOptions, - VsphereControlPlaneEndpoint: options.vsphereControlPlaneEndpoint, - SkipPrompt: options.unattended || skipPrompt, - Timeout: options.timeout, - Edition: edition, - } -} diff --git a/tkg/cmd/config_permission.go b/tkg/cmd/config_permission.go deleted file mode 100644 index 8eb3d68ae0..0000000000 --- a/tkg/cmd/config_permission.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var configPermissionsCmd = &cobra.Command{ - Use: "permissions", - Short: "Configure permissions on the cloud providers", - Long: "Configure permissions on the cloud providers", -} - -func init() { - configCmd.AddCommand(configPermissionsCmd) -} diff --git a/tkg/cmd/config_permission_aws.go b/tkg/cmd/config_permission_aws.go deleted file mode 100644 index 5ac64164b5..0000000000 --- a/tkg/cmd/config_permission_aws.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -type configPermissionsAWSOptions struct { - clusterConfigFile string -} - -var cpa = &configPermissionsAWSOptions{} - -var configPermissionsAWSCmd = &cobra.Command{ - Use: "aws", - Short: "Configure permissions on AWS", - Long: LongDesc(`Configure permissions on AWS. This is done via creating a new AWS CloudFormation stack with the correct IAM resources. - This command assumes that the following configuration values are set in the tkg configuration file or in the AWS default credential provider chain https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html. - AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY.`), - Example: Examples(` - # Configure permissions on AWS - tkg config permissions aws`), - Run: func(cmd *cobra.Command, args []string) { - err := runConfigPermissionsAWS() - verifyCommandError(err) - }, -} - -func init() { - configPermissionsCmd.Flags().StringVarP(&cpa.clusterConfigFile, "file", "", "", "The cluster configuration file (default \"$HOME/.tkg/cluster-config.yaml\")") - - configPermissionsCmd.AddCommand(configPermissionsAWSCmd) -} - -func runConfigPermissionsAWS() error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - return tkgClient.CreateAWSCloudFormationStack(cpa.clusterConfigFile) -} diff --git a/tkg/cmd/create.go b/tkg/cmd/create.go deleted file mode 100644 index b345a99399..0000000000 --- a/tkg/cmd/create.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var createCmd = &cobra.Command{ - Use: "create", - Short: "Create a Tanzu Kubernetes cluster", - Long: `Create a Tanzu Kubernetes cluster`, -} - -func init() { - RootCmd.AddCommand(createCmd) -} diff --git a/tkg/cmd/create_cluster.go b/tkg/cmd/create_cluster.go deleted file mode 100644 index c81d7fe869..0000000000 --- a/tkg/cmd/create_cluster.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "time" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -type createClusterOptions struct { - clusterConfigFile string - plan string - infrastructureProvider string - namespace string - tkrName string - cniType string - enableClusterOptions string - vsphereControlPlaneEndpoint string - size string - controlPlaneSize string - workerSize string - timeout time.Duration - controlPlaneMachineCount int - workerMachineCount int - unattended bool - generateOnly bool -} - -var cc = &createClusterOptions{} - -var createClusterCmd = &cobra.Command{ - Use: "cluster CLUSTER_NAME", - Short: "Create a Tanzu Kubernetes cluster", - Long: LongDesc(` - Use the management cluster to create a Tanzu Kubernetes cluster.`), - - Example: Examples(` - # Create a workload cluster with a particular plan - tkg create cluster my-cluster --plan=dev - - # Create a workload cluster with a particular plan and TKr - tkg create cluster my-cluster --plan=dev --tkr=v1.17.3---vmware.2-tkr.1 - - # Generate a cluster manifest identical to that used in the previous example - tkg create cluster -d my-cluster --plan=dev --tkr=v1.17.3---vmware.2-tkr.1 > create-my-cluster.yaml - - # Create a workload cluster using a particular plan with a custom number of control plane and worker nodes - tkg create cluster my-cluster -p prod -c 3 -w 5 - tkg create cluster my-cluster --plan=prod --controlplane-machine-count=3 --worker-machine-count=5 - - # Create a vSphere workload cluster using a particular plan using 'medium' instance size - # for control plane nodes, and 'large' size for worker nodes. - tkg create cluster my-cluster --size medium --worker-size large -p prod - - [+] : instance size options available for vSphere are as follows: - vSphere: [extra-large,large,medium,small]`), - - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - var err error - displayLogFileLocation() - err = runCreateCluster(args[0]) - verifyCommandError(err) - }, -} - -func init() { - createClusterCmd.Flags().StringVarP(&cc.clusterConfigFile, "file", "", "", "The cluster configuration file (default \"$HOME/.tkg/cluster-config.yaml\")") - - createClusterCmd.Flags().StringVarP(&cc.plan, "plan", "p", "", "The plan to be used for creating the workload cluster") - createClusterCmd.Flags().StringVarP(&cc.tkrName, "tkr", "", "", "TanzuKubernetesRelease(TKr) to be used for creating the workload cluster") - createClusterCmd.Flags().IntVarP(&cc.controlPlaneMachineCount, "controlplane-machine-count", "c", 0, "The number of control plane machines to be added to the workload cluster (default 1 or 3 depending on dev or prod plan)") - createClusterCmd.Flags().IntVarP(&cc.workerMachineCount, "worker-machine-count", "w", 0, "The number of worker machines to be added to the workload cluster (default 1 or 3 depending on dev or prod plan)") - createClusterCmd.Flags().BoolVarP(&cc.generateOnly, "dry-run", "d", false, "Does not create cluster but show the deployment YAML instead") - createClusterCmd.Flags().StringVarP(&cc.namespace, "namespace", "n", "", "The namespace where the cluster should be deployed. Assumes 'default' if not specified") - createClusterCmd.Flags().DurationVarP(&cc.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") - createClusterCmd.Flags().StringVarP(&cc.cniType, "cni", "", "", "Specify the CNI provider the workload cluster should use ['antrea' (default), 'calico', 'none'].") - - createClusterCmd.Flags().StringVarP(&cc.size, "size", "", "", "Specify size for all nodes including control plane and worker nodes. It can be overridden by --controlplane-size and --worker-size options. (See [+])") - createClusterCmd.Flags().StringVarP(&cc.controlPlaneSize, "controlplane-size", "", "", "Specify size for the control plane node. (See [+])") - createClusterCmd.Flags().StringVarP(&cc.workerSize, "worker-size", "", "", "Specify size of the worker node. (See [+])") - createClusterCmd.Flags().BoolVarP(&cc.unattended, "yes", "y", false, "Create workload cluster without asking for confirmation") - createClusterCmd.Flags().StringVarP(&cc.enableClusterOptions, "enable-cluster-options", "", "", "List of comma separated cluster options to be enabled") - - createClusterCmd.Flags().StringVarP(&cc.vsphereControlPlaneEndpoint, "vsphere-controlplane-endpoint", "", "", "Virtual IP address or FQDN for the cluster's control plane nodes") - // Usually not needed as they are implied from configuration of the management cluster. - createClusterCmd.Flags().StringVarP(&cc.infrastructureProvider, "infrastructure", "i", "", "The target infrastructure on which to deploy the workload cluster.") - createClusterCmd.Flags().MarkHidden("infrastructure") //nolint - - createClusterCmd.Flags().SetNormalizeFunc(aliasNormalizeFunc) - createCmd.AddCommand(createClusterCmd) -} - -func runCreateCluster(name string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - tkrVersion := "" - if cc.tkrName != "" { - tkrVersion = utils.GetTKRVersionFromTKRName(cc.tkrName) - } - - return tkgClient.CreateCluster(buildCreateClusterOption(name, tkrVersion, cc)) -} diff --git a/tkg/cmd/delete.go b/tkg/cmd/delete.go deleted file mode 100644 index 0411cdd8b4..0000000000 --- a/tkg/cmd/delete.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var deleteCmd = &cobra.Command{ - Use: "delete", - Short: "Delete a management cluster or Tanzu Kubernetes cluster", - Long: "Delete a management cluster or Tanzu Kubernetes cluster", -} - -func init() { - RootCmd.AddCommand(deleteCmd) -} diff --git a/tkg/cmd/delete_cluster.go b/tkg/cmd/delete_cluster.go deleted file mode 100644 index f50a62fd9e..0000000000 --- a/tkg/cmd/delete_cluster.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type deleteClustersOptions struct { - namespace string - unattended bool -} - -var dc = &deleteClustersOptions{} - -var deleteClusterCmd = &cobra.Command{ - Use: "cluster CLUSTER_NAME", - Short: "Delete a Tanzu Kubernetes cluster", - Long: `Use the management cluster to delete a Tanzu Kubernetes Cluster`, - Example: Examples(` - # Delete a workload cluster - tkg delete cluster my-cluster - - # Delete a workload cluster in particular namespace - tkg delete cluster my-cluster --namespace=dev-system`), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - err := runDeleteCluster(args[0]) - verifyCommandError(err) - }, -} - -func init() { - deleteClusterCmd.Flags().StringVarP(&dc.namespace, "namespace", "n", "", "The namespace where the workload cluster was created. Assumes 'default' if not specified.") - deleteClusterCmd.Flags().BoolVarP(&dc.unattended, "yes", "y", false, "Delete workload cluster without asking for confirmation") - - deleteCmd.AddCommand(deleteClusterCmd) -} - -func runDeleteCluster(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: dc.namespace, - SkipPrompt: dc.unattended || skipPrompt, - } - return tkgClient.DeleteCluster(options) -} diff --git a/tkg/cmd/delete_machine_health_check.go b/tkg/cmd/delete_machine_health_check.go deleted file mode 100644 index 56de24e5e0..0000000000 --- a/tkg/cmd/delete_machine_health_check.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type deleteMachineHealthCheckOptions struct { - machinehealthCheckName string - namespace string - unattended bool -} - -var deleteMHC = &deleteMachineHealthCheckOptions{} - -var deleteMachineHealthCheckCmd = &cobra.Command{ - Use: "machinehealthcheck CLUSTER_NAME", - Short: "Delete a MachineHealthCheck object", - Long: "Delete a MachineHealthCheck object for the given cluster", - Example: Examples(` - # Delete a MachineHealthCheck object of a cluster. By default, CLUSTER_NAME will be used as the name of the MachineHealthCheck - tkg delete machinehealthcheck my-cluster - - # Delete a MachineHealthCheck object when there are several MachineHealthCheck objects associated with a cluster - tkg delete machinehealthcheck my-cluster --mhc-name my-mhc`), - Aliases: []string{"mhc"}, - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - err := runDeleteMachineHealthCheck(args[0]) - verifyCommandError(err) - }, -} - -func init() { - deleteMachineHealthCheckCmd.Flags().BoolVarP(&deleteMHC.unattended, "yes", "y", false, "Delete the MachineHealthCheck object without asking for confirmation") - deleteMachineHealthCheckCmd.Flags().StringVarP(&deleteMHC.machinehealthCheckName, "mhc-name", "", "", "Name of the MachineHealthCheck object") - deleteMachineHealthCheckCmd.Flags().StringVarP(&deleteMHC.namespace, "namespace", "n", "", "The namespace where the MachineHealthCheck object was created, default to the cluster's namespace") - deleteCmd.AddCommand(deleteMachineHealthCheckCmd) -} - -func runDeleteMachineHealthCheck(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.DeleteMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: deleteMHC.namespace, - MachinehealthCheckName: deleteMHC.machinehealthCheckName, - SkipPrompt: deleteMHC.unattended || skipPrompt, - } - return tkgClient.DeleteMachineHealthCheck(options) -} diff --git a/tkg/cmd/delete_region.go b/tkg/cmd/delete_region.go deleted file mode 100644 index b7019c031e..0000000000 --- a/tkg/cmd/delete_region.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "time" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type deleteRegionOptions struct { - force bool - useExistingCluster bool - unattended bool - timeout time.Duration -} - -var dr = &deleteRegionOptions{} - -var deleteRegionCmd = &cobra.Command{ - Use: "management-cluster CLUSTER_NAME", - Short: "Delete a management cluster", - Long: `Delete a management cluster and tears down the underlying infrastructure`, - Example: Examples(` - # tkg delete management-cluster my-mc-cluster - `), - Aliases: []string{"mc"}, - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - log.UnsetStdoutStderr() - displayLogFileLocation() - err := runDeleteRegion(args[0]) - verifyCommandError(err) - }, -} - -func init() { - deleteRegionCmd.Flags().BoolVarP(&dr.force, "force", "f", false, "Force deletion of the management cluster even if it is managing active Tanzu Kubernetes clusters") - deleteRegionCmd.Flags().BoolVarP(&dr.useExistingCluster, "use-existing-cleanup-cluster", "e", false, "Use an existing cleanup cluster to delete the management cluster") - deleteRegionCmd.Flags().BoolVarP(&dr.unattended, "yes", "y", false, "Delete management cluster without asking for confirmation") - deleteRegionCmd.Flags().DurationVarP(&dr.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") - deleteCmd.AddCommand(deleteRegionCmd) -} - -func runDeleteRegion(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.DeleteRegionOptions{ - ClusterName: clusterName, - Force: dr.force, - UseExistingCluster: dr.useExistingCluster, - SkipPrompt: dr.unattended || skipPrompt, - Timeout: dr.timeout, - } - return tkgClient.DeleteRegion(options) -} diff --git a/tkg/cmd/describe.go b/tkg/cmd/describe.go deleted file mode 100644 index d55de78011..0000000000 --- a/tkg/cmd/describe.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var describeCmd = &cobra.Command{ - Use: "describe", - Short: "Describe Tanzu Kubernetes Grid resource(s)", - Long: "Describe Tanzu Kubernetes Grid resource(s)", -} - -func init() { - RootCmd.AddCommand(describeCmd) -} diff --git a/tkg/cmd/describe_cluster.go b/tkg/cmd/describe_cluster.go deleted file mode 100644 index ccf459ecc1..0000000000 --- a/tkg/cmd/describe_cluster.go +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "fmt" - "sort" - "strings" - "time" - - "github.com/fatih/color" - "github.com/gosuri/uitable" - "github.com/spf13/cobra" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/duration" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctltree "sigs.k8s.io/cluster-api/cmd/clusterctl/client/tree" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/command" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -const ( - // ClusterRoleNone defines cluster role none - ClusterRoleNone = "" - // Whilespace defines whitespace - Whilespace = " " - // TableSeparator defines table separator - TableSeparator = " " - // MessageLengthLimit defines limit on the length of the message displayed - MessageLengthLimit = 100 - // GroupItemLimit defines limit on number of groups displayed - GroupItemLimit = 2 -) - -type describeClustersOptions struct { - namespace string - showOtherConditions string - // Deprecated: Use showDetails instead. - disableNoEcho bool - // Deprecated: Use showGroupMembers instead. - disableGroupObjects bool - showDetails bool - showGroupMembers bool -} - -var cd = &describeClustersOptions{} - -var describeClustersCmd = &cobra.Command{ - Use: "cluster CLUSTER_NAME", - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - f1 := cmd.Flags().Lookup("disable-no-echo") - f1Changed := false - if f1 != nil && f1.Changed { - f1Changed = true - cd.showDetails = cd.disableNoEcho - } - f2 := cmd.Flags().Lookup("show-details") - f2Changed := false - if f2 != nil && f2.Changed { - f2Changed = true - } - if f1Changed && f2Changed { - verifyCommandError(fmt.Errorf("only one of --show-details or --disable-no-echo should be set")) - return - } - - f1 = cmd.Flags().Lookup("disable-grouping") - f1Changed = false - if f1 != nil && f1.Changed { - f1Changed = true - cd.showGroupMembers = cd.disableGroupObjects - } - f2 = cmd.Flags().Lookup("show-group-members") - f2Changed = false - if f2 != nil && f2.Changed { - f2Changed = true - } - if f1Changed && f2Changed { - verifyCommandError(fmt.Errorf("only one of --show-group-members or --disable-grouping should be set")) - } - - err := runDescribeCluster(cmd, args[0]) - - verifyCommandError(err) - }, -} - -func init() { - describeClustersCmd.Flags().StringVarP(&cd.namespace, "namespace", "n", "", "The namespace from which to get workload clusters. If not provided clusters from all namespaces will be returned") - - describeClustersCmd.Flags().StringVar(&cd.showOtherConditions, "show-all-conditions", "", " list of comma separated kind or kind/name for which we should show all the object's conditions (all to show conditions for all the objects)") - - describeCmd.Flags().BoolVar(&cd.disableNoEcho, "disable-no-echo", false, "Disable hiding of a MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object") - command.DeprecateFlagWithAlternative(describeCmd, "disable-no-echo", "1.6.0", "--show-details") - describeCmd.Flags().BoolVar(&cd.showDetails, "show-details", false, "Show details of MachineInfrastructure and BootstrapConfig when ready condition is true or it has the Status, Severity and Reason of the machine's object") - - describeCmd.Flags().BoolVar(&cd.disableGroupObjects, "disable-grouping", false, "Disable grouping machines when ready condition has the same Status, Severity and Reason") - command.DeprecateFlagWithAlternative(describeCmd, "disable-grouping", "1.6.0", "--show-group-members") - describeCmd.Flags().BoolVar(&cd.showGroupMembers, "show-group-members", false, "Expand machine groups whose ready condition has the same Status, Severity and Reason") - - describeCmd.AddCommand(describeClustersCmd) -} - -func runDescribeCluster(cmd *cobra.Command, clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - // Output the Status - describeClusterOptions := tkgctl.DescribeTKGClustersOptions{ - ClusterName: clusterName, - Namespace: cd.namespace, - ShowOtherConditions: cd.showOtherConditions, - ShowDetails: cd.showDetails, - ShowGroupMembers: cd.showGroupMembers, - } - - results, err := tkgClient.DescribeCluster(describeClusterOptions) - if err != nil { - return err - } - - t := component.NewOutputWriter(cmd.OutOrStdout(), "table", "NAME", "NAMESPACE", "STATUS", "CONTROLPLANE", "WORKERS", "KUBERNETES", "ROLES") - cl := results.ClusterInfo - clusterRoles := ClusterRoleNone - if len(cl.Roles) != 0 { - clusterRoles = strings.Join(cl.Roles, ",") - } - t.AddRow(cl.Name, cl.Namespace, cl.Status, cl.ControlPlaneCount, cl.WorkerCount, cl.K8sVersion, clusterRoles) - t.Render() - - log.Infof("\n\nDetails:\n\n") - treeView(results.Objs, results.Cluster) - - // If it is a Management Cluster, output the providers - if results.InstalledProviders != nil { - log.Infof("\n\nProviders:\n\n") - p := component.NewOutputWriter(cmd.OutOrStdout(), "table", "NAMESPACE", "NAME", "TYPE", "PROVIDERNAME", "VERSION", "WATCHNAMESPACE") - for i := range results.InstalledProviders.Items { - p.AddRow(results.InstalledProviders.Items[i].Namespace, results.InstalledProviders.Items[i].Name, results.InstalledProviders.Items[i].Type, results.InstalledProviders.Items[i].ProviderName, results.InstalledProviders.Items[i].Version, results.InstalledProviders.Items[i].WatchedNamespace) - } - p.Render() - } - - return nil -} - -const ( - firstElemPrefix = `├─` - lastElemPrefix = `└─` - pipe = `│ ` -) - -var ( - gray = color.New(color.FgHiBlack) - red = color.New(color.FgRed) - green = color.New(color.FgGreen) - yellow = color.New(color.FgYellow) - white = color.New(color.FgWhite) - cyan = color.New(color.FgCyan) -) - -// treeView prints object hierarchy to out stream. -func treeView(objs *clusterctltree.ObjectTree, obj crtclient.Object) { - tbl := uitable.New() - tbl.Separator = TableSeparator - tbl.AddRow("NAME", "READY", "SEVERITY", "REASON", "SINCE", "MESSAGE") - treeViewInner("", tbl, objs, obj) - fmt.Fprintln(color.Output, tbl) -} - -type conditions struct { - readyColor *color.Color - age string - status string - severity string - reason string - message string -} - -func getCond(c *clusterv1.Condition) conditions { - v := conditions{} - if c == nil { - return v - } - - switch c.Status { - case corev1.ConditionTrue: - v.readyColor = green - case corev1.ConditionFalse, corev1.ConditionUnknown: - switch c.Severity { - case clusterv1.ConditionSeverityError: - v.readyColor = red - case clusterv1.ConditionSeverityWarning: - v.readyColor = yellow - default: - v.readyColor = white - } - default: - v.readyColor = gray - } - - v.status = string(c.Status) - v.severity = string(c.Severity) - v.reason = c.Reason - v.message = c.Message - if len(v.message) > MessageLengthLimit { - v.message = fmt.Sprintf("%s ...", v.message[:MessageLengthLimit]) - } - v.age = duration.HumanDuration(time.Since(c.LastTransitionTime.Time)) - - return v -} - -func treeViewInner(prefix string, tbl *uitable.Table, objs *clusterctltree.ObjectTree, obj crtclient.Object) { - v := conditions{} - v.readyColor = gray - - ready := clusterctltree.GetReadyCondition(obj) - name := getName(obj) - if ready != nil { - v = getCond(ready) - } - - if clusterctltree.IsGroupObject(obj) { - name = white.Add(color.Bold).Sprintf(name) - items := strings.Split(clusterctltree.GetGroupItems(obj), clusterctltree.GroupItemsSeparator) - if len(items) <= GroupItemLimit { - v.message = gray.Sprintf("See %s", strings.Join(items, clusterctltree.GroupItemsSeparator)) - } else { - v.message = gray.Sprintf("See %s, ...", strings.Join(items[:GroupItemLimit], clusterctltree.GroupItemsSeparator)) - } - } - if !obj.GetDeletionTimestamp().IsZero() { - name = fmt.Sprintf("%s %s", red.Sprintf("!! DELETED !!"), name) - } - - tbl.AddRow( - fmt.Sprintf("%s%s", gray.Sprint(printPrefix(prefix)), name), - v.readyColor.Sprint(v.status), - v.readyColor.Sprint(v.severity), - v.readyColor.Sprint(v.reason), - v.age, - v.message) - - chs := objs.GetObjectsByParent(obj.GetUID()) - - if clusterctltree.IsShowConditionsObject(obj) { - otherConditions := clusterctltree.GetOtherConditions(obj) - for i := range otherConditions { - cond := otherConditions[i] - - p := "" - filler := strings.Repeat(Whilespace, 10) - siblingsPipe := TableSeparator - if len(chs) > 0 { - siblingsPipe = pipe - } - switch i { - case len(otherConditions) - 1: - p = prefix + siblingsPipe + filler + lastElemPrefix - default: - p = prefix + siblingsPipe + filler + firstElemPrefix - } - - v = getCond(cond) - tbl.AddRow( - fmt.Sprintf("%s%s", gray.Sprint(printPrefix(p)), cyan.Sprint(cond.Type)), - v.readyColor.Sprint(v.status), - v.readyColor.Sprint(v.severity), - v.readyColor.Sprint(v.reason), - v.age, - v.message) - } - } - - sort.Slice(chs, func(i, j int) bool { - return getName(chs[i]) < getName(chs[j]) - }) - - for i, child := range chs { - switch i { - case len(chs) - 1: - treeViewInner(prefix+lastElemPrefix, tbl, objs, child) - default: - treeViewInner(prefix+firstElemPrefix, tbl, objs, child) - } - } -} - -func getName(obj crtclient.Object) string { - if clusterctltree.IsGroupObject(obj) { - items := strings.Split(clusterctltree.GetGroupItems(obj), clusterctltree.GroupItemsSeparator) - return fmt.Sprintf("%d Machines...", len(items)) - } - - if clusterctltree.IsVirtualObject(obj) { - return obj.GetName() - } - - objName := fmt.Sprintf("%s/%s", - obj.GetObjectKind().GroupVersionKind().Kind, - color.New(color.Bold).Sprint(obj.GetName())) - - name := objName - if objectPrefix := clusterctltree.GetMetaName(obj); objectPrefix != "" { - name = fmt.Sprintf("%s - %s", objectPrefix, gray.Sprintf(name)) - } - return name -} - -func printPrefix(p string) string { - if strings.HasSuffix(p, firstElemPrefix) { - p = strings.Replace(p, firstElemPrefix, pipe, strings.Count(p, firstElemPrefix)-1) - } else { - p = strings.ReplaceAll(p, firstElemPrefix, pipe) - } - - if strings.HasSuffix(p, lastElemPrefix) { - p = strings.Replace(p, lastElemPrefix, strings.Repeat(Whilespace, len([]rune(lastElemPrefix))), strings.Count(p, lastElemPrefix)-1) - } else { - p = strings.ReplaceAll(p, lastElemPrefix, strings.Repeat(Whilespace, len([]rune(lastElemPrefix)))) - } - return p -} diff --git a/tkg/cmd/get.go b/tkg/cmd/get.go deleted file mode 100644 index c333194ca8..0000000000 --- a/tkg/cmd/get.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var getCmd = &cobra.Command{ - Use: "get", - Short: "Get Tanzu Kubernetes Grid resource(s)", - Long: "Get Tanzu Kubernetes Grid resource(s)", -} - -func init() { - RootCmd.AddCommand(getCmd) -} diff --git a/tkg/cmd/get_ceip.go b/tkg/cmd/get_ceip.go deleted file mode 100644 index 73ca1713a2..0000000000 --- a/tkg/cmd/get_ceip.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" -) - -var outputFormat string - -var getCeipCmd = &cobra.Command{ - Use: "ceip-participation", - Aliases: []string{"ceip", "ceip-participations"}, - Short: "Get the current CEIP opt-in status", - Long: "Get the current CEIP opt-in status of the current management cluster", - RunE: func(cmd *cobra.Command, args []string) error { - return runGetCEIP(cmd) - }, -} - -func init() { - getCeipCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format. Supported formats: json|yaml|table") - - getCmd.AddCommand(getCeipCmd) -} - -func runGetCEIP(cmd *cobra.Command) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - ceipStatus, err := tkgClient.GetCEIP() - if err != nil { - return err - } - var t component.OutputWriter - if outputFormat == string(component.JSONOutputType) || outputFormat == string(component.YAMLOutputType) { - t = component.NewObjectWriter(cmd.OutOrStdout(), outputFormat, ceipStatus) - } else { - t = component.NewOutputWriter(cmd.OutOrStdout(), outputFormat, "Management-Cluster-Name", "CEIP-Status") - t.AddRow(ceipStatus.ClusterName, ceipStatus.CeipStatus) - } - t.Render() - - return nil -} diff --git a/tkg/cmd/get_cluster.go b/tkg/cmd/get_cluster.go deleted file mode 100644 index ea6b26e2a0..0000000000 --- a/tkg/cmd/get_cluster.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "strings" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type getClustersOptions struct { - namespace string - includeMC bool -} - -var gco = &getClustersOptions{} - -var getClustersCmd = &cobra.Command{ - Use: "cluster", - Aliases: []string{"clusters"}, - Short: "Get Tanzu Kubernetes clusters", - Long: `Get Tanzu Kubernetes clusters managed by the active management cluster context`, - Run: func(cmd *cobra.Command, args []string) { - err := runGetClusters(cmd) - verifyCommandError(err) - }, -} - -func init() { - getClustersCmd.Flags().StringVarP(&gco.namespace, "namespace", "n", "", "The namespace from which to get workload clusters. If not provided clusters from all namespaces will be returned") - getClustersCmd.Flags().BoolVarP(&gco.includeMC, "include-management-cluster", "", false, "Show active management cluster information as well") - getClustersCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format. Supported formats: json|yaml|table") - - getCmd.AddCommand(getClustersCmd) -} - -func runGetClusters(cmd *cobra.Command) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.ListTKGClustersOptions{ - ClusterName: "", - Namespace: gco.namespace, - IncludeMC: gco.includeMC, - } - - clusters, err := tkgClient.GetClusters(options) - if err != nil { - return err - } - - var t component.OutputWriter - if outputFormat == string(component.JSONOutputType) || outputFormat == string(component.YAMLOutputType) { - t = component.NewObjectWriter(cmd.OutOrStdout(), outputFormat, clusters) - } else { - t = component.NewOutputWriter(cmd.OutOrStdout(), outputFormat, "NAME", "NAMESPACE", "STATUS", "CONTROLPLANE", "WORKERS", "KUBERNETES", "ROLES") - for i := range clusters { - clusterRoles := ClusterRoleNone - if len(clusters[i].Roles) != 0 { - clusterRoles = strings.Join(clusters[i].Roles, ",") - } - t.AddRow(clusters[i].Name, clusters[i].Namespace, clusters[i].Status, clusters[i].ControlPlaneCount, clusters[i].WorkerCount, clusters[i].K8sVersion, clusterRoles) - } - } - t.Render() - - return nil -} diff --git a/tkg/cmd/get_credentials.go b/tkg/cmd/get_credentials.go deleted file mode 100644 index 0bd0e9e398..0000000000 --- a/tkg/cmd/get_credentials.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type getCredentialsOptions struct { - namespace string - exportFile string -} - -var gc = &getCredentialsOptions{} - -var getCredentialsCmd = &cobra.Command{ - Use: "credentials CLUSTER_NAME", - Short: "Get kubeconfig of a Tanzu Kubernetes cluster", - Long: `Get kubeconfig of a Tanzu Kubernetes cluster by name and merge the context into the default kubeconfig file`, - Example: Examples(` - # Get workload cluster kubeconfig - tkg get credentials my-cluster`), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - log.UnsetStdoutStderr() - err := runGetCredentials(args[0]) - verifyCommandError(err) - }, -} - -func init() { - getCredentialsCmd.Flags().StringVarP(&gc.namespace, "namespace", "n", "", "The namespace where the workload cluster was created. Assumes 'default' if not specified.") - getCredentialsCmd.Flags().StringVarP(&gc.exportFile, "export-file", "", "", "File path to export a standalone kubeconfig for workload cluster") - - getCmd.AddCommand(getCredentialsCmd) -} - -func runGetCredentials(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: gc.namespace, - ExportFile: gc.exportFile, - } - return tkgClient.GetCredentials(options) -} diff --git a/tkg/cmd/get_kubernetes_versions.go b/tkg/cmd/get_kubernetes_versions.go deleted file mode 100644 index cc46620ee4..0000000000 --- a/tkg/cmd/get_kubernetes_versions.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "sort" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" -) - -var getkvCmd = &cobra.Command{ - Use: "kubernetesversions", - Aliases: []string{"kv", "kubernetesversion"}, - Short: "Get the list of supported kubernetes versions", - Long: "Get the list of supported kubernetes versions for workload clusters", - RunE: func(cmd *cobra.Command, args []string) error { - return runGetTKR(cmd) - }, -} - -func init() { - getkvCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format. Supported formats: json|yaml|table") - getCmd.AddCommand(getkvCmd) -} - -func runGetTKR(cmd *cobra.Command) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - tkrInfo, err := tkgClient.GetKubernetesVersions() - if err != nil { - return err - } - sort.Strings(tkrInfo.Versions) - - var t component.OutputWriter - if outputFormat == string(component.JSONOutputType) || outputFormat == string(component.YAMLOutputType) { - t = component.NewObjectWriter(cmd.OutOrStdout(), outputFormat, tkrInfo) - } else { - t = component.NewOutputWriter(cmd.OutOrStdout(), outputFormat, "Versions") - for _, k8sVersion := range tkrInfo.Versions { - t.AddRow(k8sVersion) - } - } - t.Render() - - return nil -} diff --git a/tkg/cmd/get_machine_health_check.go b/tkg/cmd/get_machine_health_check.go deleted file mode 100644 index d1f8b23406..0000000000 --- a/tkg/cmd/get_machine_health_check.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "encoding/json" - "fmt" - - "github.com/pkg/errors" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type getMachineHealthCheckOptions struct { - machinehealthCheckName string - namespace string -} - -var getMHC = &getMachineHealthCheckOptions{} - -var getMachineHealthCheckCmd = &cobra.Command{ - Use: "machinehealthcheck CLUSTER_NAME", - Short: "Get MachineHealthCheck object", - Long: "Get a MachineHealthCheck object for the given cluster", - Example: Examples("tkg get machinehealthcheck my-cluster"), - Aliases: []string{"mhc"}, - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - displayLogFileLocation() - err := runGetMachineHealthCheck(args[0]) - verifyCommandError(err) - }, -} - -func init() { - getMachineHealthCheckCmd.Flags().StringVarP(&getMHC.machinehealthCheckName, "mhc-name", "", "", "Name of the MachineHealthCheck object") - getMachineHealthCheckCmd.Flags().StringVarP(&getMHC.namespace, "namespace", "n", "", "The namespace where the MachineHealthCheck object was created.") - getCmd.AddCommand(getMachineHealthCheckCmd) -} - -func runGetMachineHealthCheck(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.GetMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: getMHC.namespace, - MachineHealthCheckName: getMHC.machinehealthCheckName, - } - - mhcList, err := tkgClient.GetMachineHealthCheck(options) - if err != nil { - return err - } - - bytes, err := json.MarshalIndent(mhcList, "", " ") - if err != nil { - return errors.Wrap(err, "error marshaling the list of MachineHealthCheck objects") - } - - fmt.Println(string(bytes)) - - return nil -} diff --git a/tkg/cmd/get_region.go b/tkg/cmd/get_region.go deleted file mode 100644 index faf7aed2f2..0000000000 --- a/tkg/cmd/get_region.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" -) - -type getRegionsOptions struct { - clusterName string - outputFormat string -} - -var gr = &getRegionsOptions{} - -var getRegionsCmd = &cobra.Command{ - Use: "management-cluster", - Aliases: []string{"mc", "management-clusters"}, - Short: "Get the currently defined management cluster contexts", - Long: "Get the currently defined management cluster contexts", - RunE: func(cmd *cobra.Command, args []string) error { - return runGetRegions(cmd) - }, -} - -func init() { - getRegionsCmd.Flags().StringVarP(&gr.clusterName, "name", "n", "", "The name of the management cluster") - getRegionsCmd.Flags().StringVarP(&gr.outputFormat, "output", "o", "", "Output format. Supported formats: json|yaml|table") - - getCmd.AddCommand(getRegionsCmd) -} - -func runGetRegions(cmd *cobra.Command) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - regions, err := tkgClient.GetRegions(gr.clusterName) - if err != nil { - return err - } - - var t component.OutputWriter - if outputFormat == string(component.JSONOutputType) || outputFormat == string(component.YAMLOutputType) { - t = component.NewObjectWriter(cmd.OutOrStdout(), outputFormat, regions) - } else { - t = component.NewOutputWriter(cmd.OutOrStderr(), gr.outputFormat, "Management-Cluster-Name", "Context-Name", "Status") - for _, r := range regions { - if r.IsCurrentContext { - t.AddRow(r.ClusterName+" *", r.ContextName, r.Status) - } else { - t.AddRow(r.ClusterName, r.ContextName, r.Status) - } - } - } - t.Render() - - return nil -} diff --git a/tkg/cmd/init.go b/tkg/cmd/init.go deleted file mode 100644 index 3b458b970f..0000000000 --- a/tkg/cmd/init.go +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "time" - - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type initRegionOptions struct { - clusterConfigFile string - plan string - clusterName string - coreProvider string - bootstrapProvider string - infrastructureProvider string - controlPlaneProvider string - targetNamespace string - watchingNamespace string - size string - controlPlaneSize string - workerSize string - ceipOptIn string - cniType string - bind string - browser string - vsphereControlPlaneEndpoint string - featureFlags map[string]string - timeout time.Duration - unattended bool - ui bool - useExistingCluster bool - enableTKGSOnVsphere7 bool - deployTKGonVsphere7 bool -} - -// Warningvsphere7WithoutPacific ... -var Warningvsphere7WithoutPacific = ` -vSphere 7.0 Environment Detected. - -You have connected to a vSphere 7.0 environment which does not have vSphere with Tanzu enabled. vSphere with Tanzu includes -an integrated Tanzu Kubernetes Grid Service which turns a vSphere cluster into a platform for running Kubernetes workloads in dedicated -resource pools. Configuring Tanzu Kubernetes Grid Service is done through vSphere HTML5 client. - -Tanzu Kubernetes Grid Service is the preferred way to consume Tanzu Kubernetes Grid in vSphere 7.0 environments. Alternatively you may -deploy a non-integrated Tanzu Kubernetes Grid instance on vSphere 7.0.` - -// Warningvsphere7WithPacific ... -var Warningvsphere7WithPacific = ` -vSphere 7.0 with Tanzu Detected. - -You have connected to a vSphere 7.0 with Tanzu environment that includes an integrated Tanzu Kubernetes Grid Service which -turns a vSphere cluster into a platform for running Kubernetes workloads in dedicated resource pools. Configuring Tanzu -Kubernetes Grid Service is done through the vSphere HTML5 Client. - -Tanzu Kubernetes Grid Service is the preferred way to consume Tanzu Kubernetes Grid in vSphere 7.0 environments. Alternatively you may -deploy a non-integrated Tanzu Kubernetes Grid instance on vSphere 7.0.` - -var iro = &initRegionOptions{} - -// InitCmd defines init command -var InitCmd = &cobra.Command{ - Use: "init", - Short: "Create a Tanzu Kubernetes Grid management cluster", - Long: LongDesc(` - Create a Tanzu Kubernetes Grid management cluster including initializing it with Cluster API components - appropriate for the target infrastructure. - `), - - Example: Examples(` - # Create a management cluster on AWS infrastructure, initializing it with - # components required to create workload clusters through it on the same infrastructure - # by bootstrapping through a self-provisioned bootstrap cluster. - tkg init --infrastructure=aws - - # Create a management cluster, but on vSphere infrastructure instead, - # using cluster plan 'prod'. - tkg init --infrastructure=vsphere --plan prod - - # Launch an interactive UI to configure the settings necessary to create a - # management cluster on vSphere infrastructure. - tkg init --infrastructure=vsphere --ui - - # Create a management cluster on AWS infrastructure by using an existing - # bootstrapper cluster. The current kube context should point to that - # of the existing bootstrap cluster. - tkg init --use-existing-bootstrap-cluster --infrastructure=aws - - # Create a management cluster on AWS using a particular plan using 'i3.large' instance size - # for control plane nodes, and 'm5.large' size for worker nodes. - tkg init --infrastructure=aws --controlplane-size i3.large --worker-size m5.large -p prod - - Note: The current cluster pointed to by the kubeconfig file will only - be used to bootstrap the creation of the management cluster if - --use-existing-bootstrap-cluster argument is supplied - - [+] : instance size options available for vSphere are as follows: - vSphere: [extra-large,large,medium,small] - - - [*] : VMware's Customer Experience Improvement Program ("CEIP") provides VMware with information that enables - VMware to improve its products and services and fix problems. By choosing to participate in CEIP, you agree that - VMware may collect technical information about your use of VMware products and services on a regular basis. This - information does not personally identify you. Set this flag to false if you choose not to participate in the program. - If this flag is not set, then the value from the cluster-config is used to determine the CEIP participation status. - CEIP participation is true by default.`), - - Run: func(cmd *cobra.Command, args []string) { - log.UnsetStdoutStderr() - displayLogFileLocation() - err := runInit() - verifyCommandError(err) - }, -} - -func init() { - InitCmd.Flags().StringVarP(&iro.clusterConfigFile, "file", "", "", "The cluster configuration file (default \"$HOME/.tkg/cluster-config.yaml\")") - - InitCmd.Flags().StringVarP(&iro.infrastructureProvider, "infrastructure", "i", "", "Infrastructure to deploy the management cluster on ['aws', 'vsphere', 'azure']") - InitCmd.Flags().BoolVarP(&iro.ui, "ui", "u", false, "Launch interactive management cluster provisioning UI") - InitCmd.Flags().StringVarP(&iro.plan, "plan", "p", constants.PlanDev, "Cluster plan to use to deploy the management cluster") - - InitCmd.Flags().BoolVarP(&iro.useExistingCluster, "use-existing-bootstrap-cluster", "e", false, "Use an existing bootstrap cluster to deploy the management cluster") - InitCmd.Flags().StringVarP(&iro.clusterName, "name", "", "", "Name of the management cluster. One will be generated if not provided") - InitCmd.Flags().DurationVarP(&iro.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") - - InitCmd.Flags().StringVarP(&iro.size, "size", "", "", "Specify size for all nodes including control plane and worker nodes. It can be overridden by --controlplane-size and --worker-size options. (See [+])") - InitCmd.Flags().StringVarP(&iro.controlPlaneSize, "controlplane-size", "", "", "Specify size for the control plane node. (See [+])") - InitCmd.Flags().StringVarP(&iro.workerSize, "worker-size", "", "", "Specify size of the worker node. (See [+])") - InitCmd.Flags().StringVarP(&iro.ceipOptIn, "ceip-participation", "", "", "Specify if this management cluster should participate in VMware CEIP. (See [*])") - InitCmd.Flags().BoolVarP(&iro.deployTKGonVsphere7, "deploy-tkg-on-vSphere7", "", false, "Deploy TKG Management cluster on vSphere 7.0 without prompt") - InitCmd.Flags().BoolVarP(&iro.enableTKGSOnVsphere7, "enable-tkgs-on-vSphere7", "", false, "Enable TKGS on vSphere 7.0 without prompt") - - InitCmd.Flags().StringVarP(&iro.bind, "bind", "b", "127.0.0.1:8080", "Specify the IP and port to bind the Kickstart UI against (e.g. 127.0.0.1:8080).") - InitCmd.Flags().StringVarP(&iro.browser, "browser", "", "", "Specify the browser to open the Kickstart UI on. Use 'none' for no browser. Defaults to OS default browser. Supported: ['chrome', 'firefox', 'safari', 'ie', 'edge', 'none']") - - InitCmd.Flags().StringVarP(&iro.vsphereControlPlaneEndpoint, "vsphere-controlplane-endpoint", "", "", "Virtual IP address or FQDN for the cluster's control plane nodes") - - InitCmd.Flags().BoolVarP(&iro.unattended, "yes", "y", false, "Create management cluster without asking for confirmation") - - // Hidden flags, mostly for development and testing - - InitCmd.Flags().StringVarP(&iro.targetNamespace, "target-namespace", "", "", "The target namespace where the providers should be deployed. If not specified, each provider will be installed in a provider's default namespace") - InitCmd.Flags().MarkHidden("target-namespace") //nolint - - InitCmd.Flags().StringVarP(&iro.cniType, "cni", "", "", "Specify the CNI provider the management cluster should use ['antrea' (default), 'calico', 'none'].") - InitCmd.Flags().MarkHidden("cni") //nolint - - InitCmd.Flags().StringToStringVarP(&iro.featureFlags, "feature-flags", "", nil, "Activate and deactivate hidden features in the form 'feature1=true,feature2=false'") - InitCmd.Flags().MarkHidden("feature-flags") //nolint - - InitCmd.Flags().SetNormalizeFunc(aliasNormalizeFunc) - RootCmd.AddCommand(InitCmd) -} - -func aliasNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName { - if name == "vsphere-controlplane-endpoint-ip" { - name = "vsphere-controlplane-endpoint" - } - return pflag.NormalizedName(name) -} - -func runInit() error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.InitRegionOptions{ - ClusterConfigFile: iro.clusterConfigFile, - Plan: iro.plan, - UI: iro.ui, - ClusterName: iro.clusterName, - UseExistingCluster: iro.useExistingCluster, - CoreProvider: iro.coreProvider, - BootstrapProvider: iro.bootstrapProvider, - InfrastructureProvider: iro.infrastructureProvider, - ControlPlaneProvider: iro.controlPlaneProvider, - Namespace: iro.targetNamespace, - WatchingNamespace: iro.watchingNamespace, - Size: iro.size, - ControlPlaneSize: iro.controlPlaneSize, - WorkerSize: iro.workerSize, - CeipOptIn: iro.ceipOptIn, - CniType: iro.cniType, - FeatureFlags: iro.featureFlags, - EnableTKGSOnVsphere7: iro.enableTKGSOnVsphere7, - DeployTKGonVsphere7: iro.deployTKGonVsphere7, - Bind: iro.bind, - Browser: iro.browser, - VsphereControlPlaneEndpoint: iro.vsphereControlPlaneEndpoint, - SkipPrompt: iro.unattended || skipPrompt, - Timeout: iro.timeout, - } - - return tkgClient.Init(options) -} diff --git a/tkg/cmd/root.go b/tkg/cmd/root.go deleted file mode 100644 index f4cad65a1c..0000000000 --- a/tkg/cmd/root.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package cmd defines commands for tkg-cli -package cmd - -import ( - "fmt" - "os" - "strings" - "time" - - "github.com/MakeNowJust/heredoc" - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -var ( - cfgFile string - cfgDir string - logFile string - kubeconfig string - tmpLogFile string - logQuietly bool - verbosityLevel int32 - skipPrompt bool -) - -// RootCmd defines root command -var RootCmd = &cobra.Command{ - Use: "tkg", - Short: "tkg : a tool for provisioning management or Tanzu Kubernetes Grid clusters", - Long: LongDesc(` - VMware Tanzu Kubernetes Grid - - Consistently deploy and operate upstream Kubernetes across a variety of infrastructure providers. - - Documentation: https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/index.html - `), -} - -// Execute executes root command -func Execute() { - if err := RootCmd.Execute(); err != nil { - // TODO: print error stack if log v>0 - // TODO: print cmd help if validation error - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func init() { - cobra.OnInitialize(initConfig) - - RootCmd.PersistentFlags().MarkHidden("master") //nolint - - RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "Path to the the TKG config file. If value is not set/empty, then env variable 'TKG_CONFIG' value would be used if set, else uses default value(default is $HOME/.tkg/config.yaml)") - RootCmd.PersistentFlags().StringVar(&cfgDir, "configdir", "", "Path to the the TKG config directory(default is $HOME/.tkg)") - RootCmd.PersistentFlags().MarkHidden("configdir") //nolint - - // Logging flags - RootCmd.PersistentFlags().StringVarP(&logFile, "log_file", "", "", "If non-empty, use this log file") - RootCmd.PersistentFlags().Int32VarP(&verbosityLevel, "v", "v", 0, "number for the log level verbosity(0-9)") - - RootCmd.PersistentFlags().BoolVarP(&logQuietly, "quiet", "q", false, "Quiet (no output)") - - RootCmd.PersistentFlags().BoolVarP(&skipPrompt, "skip-prompt", "", false, "Skips all prompts") - RootCmd.PersistentFlags().MarkHidden("skip-prompt") //nolint - - // Add kubeconfig flag - RootCmd.PersistentFlags().StringVarP(&kubeconfig, "kubeconfig", "", "", "Optional, The kubeconfig file containing the management cluster's context") -} - -func initConfig() { - // Set logfile to the writer, if user has not provided log file then - // create a temporory logfile file and show the temporory logfile to the user - // on failure. On successful run, delete the temporory log file - if logFile == "" { - var err error - fileNamePattern := "tkg-" + time.Now().Format("20060102T150405") + "*.log" - tmpLogFile, err = utils.CreateTempFile("", fileNamePattern) - if err != nil { - log.Warning("unable to create temporory log file") - } else { - log.SetFile(tmpLogFile) - } - } else { - log.SetFile(logFile) - } - log.QuietMode(logQuietly) - log.SetVerbosity(verbosityLevel) -} - -// Indentation defines an indent -const Indentation = ` ` - -// LongDesc normalizes a command's long description to follow the conventions. -func LongDesc(s string) string { - if s == "" { - return s - } - return normalizer{s}.heredoc().trim().string -} - -// Examples normalizes a command's examples to follow the conventions. -func Examples(s string) string { - if s == "" { - return s - } - return normalizer{s}.trim().indent().string -} - -type normalizer struct { - string -} - -func (s normalizer) heredoc() normalizer { - s.string = heredoc.Doc(s.string) - return s -} - -func (s normalizer) trim() normalizer { - s.string = strings.TrimSpace(s.string) - return s -} - -func (s normalizer) indent() normalizer { - var indentedLines []string - for _, line := range strings.Split(s.string, "\n") { - trimmed := strings.TrimSpace(line) - if trimmed == "" { - // don't indent lines with whitespaces only - indentedLines = append(indentedLines, "") - } else { - indented := Indentation + trimmed - indentedLines = append(indentedLines, indented) - } - } - s.string = strings.Join(indentedLines, "\n") - return s -} diff --git a/tkg/cmd/scale.go b/tkg/cmd/scale.go deleted file mode 100644 index 4bf0b450bb..0000000000 --- a/tkg/cmd/scale.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var scaleCmd = &cobra.Command{ - Use: "scale", - Short: "Scale a Tanzu Kubernetes cluster", - Long: "Scale a Tanzu Kubernetes cluster", -} - -func init() { - RootCmd.AddCommand(scaleCmd) -} diff --git a/tkg/cmd/scale_cluster.go b/tkg/cmd/scale_cluster.go deleted file mode 100644 index a3ec786bdf..0000000000 --- a/tkg/cmd/scale_cluster.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type scaleClusterOptions struct { - workerCount int32 - controlPlaneCount int32 - namespace string -} - -var sc = &scaleClusterOptions{} - -var scaleClusterCmd = &cobra.Command{ - Use: "cluster CLUSTER_NAME", - Short: "Scale a Tanzu Kubernetes Grid cluster", - Long: "Scale a Tanzu Kubernetes Grid cluster", - Example: Examples(` - # Scales the number of worker nodes of cluster named 'my-cluster' to 5 - tkg scale cluster my-cluster -w 5`), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - err := runScaleCluster(args[0]) - verifyCommandError(err) - }, -} - -func init() { - scaleClusterCmd.Flags().Int32VarP(&sc.workerCount, "worker-machine-count", "w", 0, "Number of worker nodes to scale to") - scaleClusterCmd.Flags().Int32VarP(&sc.controlPlaneCount, "controlplane-machine-count", "c", 0, "Number of control plane nodes to scale to") - scaleClusterCmd.Flags().StringVarP(&sc.namespace, "namespace", "n", "", "The namespace where the workload cluster was created. Assumes 'default' if not specified.") - - scaleCmd.AddCommand(scaleClusterCmd) -} - -func runScaleCluster(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.ScaleClusterOptions{ - ClusterName: clusterName, - ControlPlaneCount: sc.controlPlaneCount, - WorkerCount: sc.workerCount, - Namespace: sc.namespace, - } - return tkgClient.ScaleCluster(options) -} diff --git a/tkg/cmd/set.go b/tkg/cmd/set.go deleted file mode 100644 index 31f9af9795..0000000000 --- a/tkg/cmd/set.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var setCmd = &cobra.Command{ - Use: "set", - Short: "Configure some aspect of the Tanzu Kubernetes Grid CLI", - Long: "Configure some aspect of the Tanzu Kubernetes Grid CLI", -} - -func init() { - RootCmd.AddCommand(setCmd) -} diff --git a/tkg/cmd/set_ceip.go b/tkg/cmd/set_ceip.go deleted file mode 100644 index 5d3420ada0..0000000000 --- a/tkg/cmd/set_ceip.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var ( - isProd string - labels string -) - -var setCeipCmd = &cobra.Command{ - Use: "ceip-participation OPT_IN_BOOL", - Short: "Set the opt-in preference for CEIP", - Long: "Set the opt-in preference for CEIP of the current management cluster", - Aliases: []string{"ceip", "ceip-participations"}, - Args: cobra.ExactArgs(1), - Example: Examples(` - # Change current management cluster to opt-in to VMware CEIP - tkg set ceip-participation true - - # Change current management cluster to opt-out of VMware CEIP - tkg set ceip-participation false - - [*] : VMware's Customer Experience Improvement Program ("CEIP") provides VMware with information that enables - VMware to improve its products and services and fix problems. By choosing to participate in CEIP, you agree that - VMware may collect technical information about your use of VMware products and services on a regular basis. This - information does not personally identify you. - `), - Run: func(cmd *cobra.Command, args []string) { - err := runSetCeip(args[0]) - verifyCommandError(err) - }, -} - -func init() { - setCeipCmd.Flags().StringVarP(&isProd, "isProd", "", "", "use --isProd false to write telemetry data to the staging datastore") - setCeipCmd.Flags().MarkHidden("isProd") //nolint - setCeipCmd.Flags().StringVarP(&labels, "labels", "", "", "use --labels=entitlement-account-number=\"num1\",env-type=\"env\" to self-identify the customer's account number and environment") - setCmd.AddCommand(setCeipCmd) -} - -func runSetCeip(ceipOptIn string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - return tkgClient.SetCeip(ceipOptIn, isProd, labels) -} diff --git a/tkg/cmd/set_machine_health_check.go b/tkg/cmd/set_machine_health_check.go deleted file mode 100644 index bd4c916345..0000000000 --- a/tkg/cmd/set_machine_health_check.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type setMachineHealthCheckOptions struct { - machineHealthCheckName string - namespace string - matchLabels string - unhealthyConditions string - nodeStartupTimeout string -} - -var setMHC = &setMachineHealthCheckOptions{} - -var setMachineHealthCheckCmd = &cobra.Command{ - Use: "machinehealthcheck CLUSTERNAME", - Short: "Create or update a MachineHealthCheck for a cluster", - Long: "Create or update a MachineHealthCheck for a cluster", - Example: Examples(` - # Create a MachineHealthCheck with default configuration - tkg set machinehealthcheck my-cluster - - # Create or update a MachineHealthCheck with customized NodeStartupTimeout - tkg set machinehealthcheck my-custer --node-startup-timeout 10m - - # Create or update a MachineHealthCheck with customized name - tkg set machinehealthcheck my-custer --mhc-name my-mhc - - # Create or update a MachineHealthCheck with customized UnhealthyConditions - tkg set machinehealthcheck my-custer --unhealthy-conditions "Ready:False:5m,Ready:Unknown:5m" - - # Create or update a MachineHealthCheck with customized node labels - tkg set machinehealthcheck my-custer --match-labels "key1:value1,key2:value2" - `), - Aliases: []string{"mhc"}, - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - err := runCreateMachineHealthCheck(args[0]) - verifyCommandError(err) - }, -} - -func init() { - setMachineHealthCheckCmd.Flags().StringVarP(&setMHC.machineHealthCheckName, "mhc-name", "", "", "Name of the MachineHealthCheck object") - setMachineHealthCheckCmd.Flags().StringVarP(&setMHC.namespace, "namespace", "", "", "Namespace of the cluster") - setMachineHealthCheckCmd.Flags().StringVarP(&setMHC.nodeStartupTimeout, "node-startup-timeout", "", "", "Any machine being created that takes longer than this duration to join the cluster is considered to have failed and will be remediated") - setMachineHealthCheckCmd.Flags().StringVarP(&setMHC.matchLabels, "match-labels", "", "", "Label selector to match machines whose health will be exercised") - setMachineHealthCheckCmd.Flags().StringVarP(&setMHC.unhealthyConditions, "unhealthy-conditions", "", "", "A list of the conditions that determine whether a node is considered unhealthy. Available condition types: [Ready, MemoryPressure,DiskPressure,PIDPressure, NetworkUnavailable], Available condition status: [True, False, Unknown]") - setCmd.AddCommand(setMachineHealthCheckCmd) -} - -func runCreateMachineHealthCheck(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.SetMachineHealthCheckOptions{ - ClusterName: clusterName, - MachineHealthCheckName: setMHC.machineHealthCheckName, - Namespace: setMHC.namespace, - MatchLabels: setMHC.matchLabels, - UnhealthyConditions: setMHC.unhealthyConditions, - NodeStartupTimeout: setMHC.nodeStartupTimeout, - } - return tkgClient.SetMachineHealthCheck(options) -} diff --git a/tkg/cmd/set_region.go b/tkg/cmd/set_region.go deleted file mode 100644 index 21efdc386b..0000000000 --- a/tkg/cmd/set_region.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type setRegionOptions struct { - contextName string -} - -var sr = &setRegionOptions{} - -var setRegionCmd = &cobra.Command{ - Use: "management-cluster CLUSTER_NAME", - Short: "Set the current management cluster context to use", - Long: "Set the current management cluster targeted by most `tkg` commands", - Aliases: []string{"mc"}, - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - err := runSetRegion(args[0]) - verifyCommandError(err) - }, -} - -func init() { - setRegionCmd.Flags().StringVarP(&sr.contextName, "context", "c", "", "Optional, the context name of the management cluster") - - setCmd.AddCommand(setRegionCmd) -} - -func runSetRegion(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.SetRegionOptions{ - ClusterName: clusterName, - ContextName: sr.contextName, - } - return tkgClient.SetRegion(options) -} diff --git a/tkg/cmd/update_credentials.go b/tkg/cmd/update_credentials.go deleted file mode 100644 index 92a765c456..0000000000 --- a/tkg/cmd/update_credentials.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var updateCredsCommand = &cobra.Command{ - Use: "update-credentials", - Short: "Update a Tanzu Kubernetes cluster credentials", - Long: "Update a Tanzu Kubernetes cluster credentials", -} - -func init() { - RootCmd.AddCommand(updateCredsCommand) -} diff --git a/tkg/cmd/update_credentials_cluster.go b/tkg/cmd/update_credentials_cluster.go deleted file mode 100644 index 96470c7950..0000000000 --- a/tkg/cmd/update_credentials_cluster.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "time" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -var updateCredentialsClusterCmd = &cobra.Command{ - Use: "cluster CLUSTER_NAME", - Short: "Update workload cluster credentials", - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - displayLogFileLocation() - err := runUpdateCredentialsCluster(args[0]) - verifyCommandError(err) - }, -} - -type updateCredentialsClusterOptions struct { - namespace string - vsphereUser string - vspherePassword string - timeout time.Duration -} - -var updateCredentialsClusterOpts = &updateCredentialsClusterOptions{} - -func init() { - updateCredentialsClusterCmd.Flags().StringVarP(&updateCredentialsClusterOpts.namespace, "namespace", "n", "", "The namespace where the workload cluster was created. Assumes 'default' if not specified") - updateCredentialsClusterCmd.Flags().StringVarP(&updateCredentialsClusterOpts.vsphereUser, "vsphere-user", "", "", "Username for vSphere provider") - updateCredentialsClusterCmd.Flags().StringVarP(&updateCredentialsClusterOpts.vspherePassword, "vsphere-password", "", "", "Password for vSphere provider") - updateCredentialsClusterCmd.Flags().DurationVarP(&updateCredentialsClusterOpts.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") - updateCredsCommand.AddCommand(updateCredentialsClusterCmd) -} - -func runUpdateCredentialsCluster(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.UpdateCredentialsClusterOptions{ - ClusterName: clusterName, - Namespace: updateCredentialsClusterOpts.namespace, - VSphereUsername: updateCredentialsClusterOpts.vsphereUser, - VSpherePassword: updateCredentialsClusterOpts.vspherePassword, - Timeout: updateCredentialsClusterOpts.timeout, - } - return tkgClient.UpdateCredentialsCluster(options) -} diff --git a/tkg/cmd/update_credentials_region.go b/tkg/cmd/update_credentials_region.go deleted file mode 100644 index 1e81df216e..0000000000 --- a/tkg/cmd/update_credentials_region.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "time" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -var updateCredentialsRegionCmd = &cobra.Command{ - Use: "management-cluster CLUSTER_NAME", - Short: "Update management cluster credentials", - Aliases: []string{"mc"}, - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - displayLogFileLocation() - err := runUpdateCredentialsRegion(args[0]) - verifyCommandError(err) - }, -} - -type updateCredentialsRegionOptions struct { - vsphereUser string - vspherePassword string - isCascading bool - timeout time.Duration -} - -var updateCredentialsRegionOpts = &updateCredentialsRegionOptions{} - -func init() { - updateCredentialsRegionCmd.Flags().StringVarP(&updateCredentialsRegionOpts.vsphereUser, "vsphere-user", "", "", "Username for vSphere provider") - updateCredentialsRegionCmd.Flags().StringVarP(&updateCredentialsRegionOpts.vspherePassword, "vsphere-password", "", "", "Password for vSphere provider") - updateCredentialsRegionCmd.Flags().BoolVarP(&updateCredentialsRegionOpts.isCascading, "cascading", "", false, "Complete credential rotation for all workload clusters under the management cluster") - updateCredentialsRegionCmd.Flags().DurationVarP(&updateCredentialsRegionOpts.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") - updateCredsCommand.AddCommand(updateCredentialsRegionCmd) -} - -func runUpdateCredentialsRegion(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.UpdateCredentialsRegionOptions{ - ClusterName: clusterName, - VSphereUsername: updateCredentialsRegionOpts.vsphereUser, - VSpherePassword: updateCredentialsRegionOpts.vspherePassword, - IsCascading: updateCredentialsRegionOpts.isCascading, - Timeout: updateCredentialsRegionOpts.timeout, - } - return tkgClient.UpdateCredentialsRegion(options) -} diff --git a/tkg/cmd/upgrade.go b/tkg/cmd/upgrade.go deleted file mode 100644 index f3418cb2a2..0000000000 --- a/tkg/cmd/upgrade.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "github.com/spf13/cobra" -) - -var upgradeCmd = &cobra.Command{ - Use: "upgrade", - Short: "Upgrade a Tanzu Kubernetes cluster", - Long: "Upgrade a Tanzu Kubernetes cluster", -} - -func init() { - RootCmd.AddCommand(upgradeCmd) -} diff --git a/tkg/cmd/upgrade_cluster.go b/tkg/cmd/upgrade_cluster.go deleted file mode 100644 index 9389eede1f..0000000000 --- a/tkg/cmd/upgrade_cluster.go +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "time" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -// upgradeClusterCmd represents the upgrade command -var upgradeClusterCmd = &cobra.Command{ - Use: "cluster CLUSTER_NAME", - Short: "Upgrade a Tanzu Kubernetes Grid cluster", - Args: cobra.ExactArgs(1), - Example: Examples(` - # Upgrade workload cluster - tkg upgrade cluster wc-1 - - # Upgrade workload cluster with specific tkr v1.20.1---vmware.1-tkg.2 - tkg upgrade cluster wc-1 --tkr v1.20.1---vmware.1-tkg.2 - - # Upgrade workload cluster using specific os name (vsphere) - tkg upgrade cluster wc-1 --os-name photon - - # Upgrade workload cluster using specific os name and version - tkg upgrade cluster wc-1 --os-name ubuntu --os-version 20.04 - - # Upgrade workload cluster using specific os name, version and arch - tkg upgrade cluster wc-1 --os-name ubuntu --os-version 20.04 --os-arch amd64 - - [+] : Options available for: os-name, os-version, os-arch are as follows: - vSphere: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name photon --os-version 3 --os-arch amd64 - - aws: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name amazon --os-version 2 --os-arch amd64 - - azure: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name ubuntu --os-version 18.04 --os-arch amd64 -`), - - Run: func(cmd *cobra.Command, args []string) { - displayLogFileLocation() - err := runUpgradeCluster(args[0]) - verifyCommandError(err) - }, -} - -type upgradeClusterOptions struct { - namespace string - tkrName string - vSphereTemplateName string - timeout time.Duration - unattended bool - osName string - osVersion string - osArch string -} - -var uc = &upgradeClusterOptions{} - -func init() { - upgradeClusterCmd.Flags().StringVarP(&uc.tkrName, "tkr", "", "", "TanzuKubernetesRelease(TKr) to be used for creating the workload cluster") - upgradeClusterCmd.Flags().StringVarP(&uc.namespace, "namespace", "n", "", "The namespace where the workload cluster was created. Assumes 'default' if not specified") - upgradeClusterCmd.Flags().StringVarP(&uc.vSphereTemplateName, "vsphere-vm-template-name", "", "", "The vSphere VM template to be used with upgraded kubernetes version. Discovered automatically if not provided") - upgradeClusterCmd.Flags().DurationVarP(&uc.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") - upgradeClusterCmd.Flags().BoolVarP(&uc.unattended, "yes", "y", false, "Upgrade workload cluster without asking for confirmation") - - upgradeClusterCmd.Flags().StringVarP(&uc.osName, "os-name", "", "", "OS name to use during management cluster upgrade. Discovered automatically if not provided (See [+])") - upgradeClusterCmd.Flags().StringVarP(&uc.osVersion, "os-version", "", "", "OS version to use during management cluster upgrade. Discovered automatically if not provided (See [+])") - upgradeClusterCmd.Flags().StringVarP(&uc.osArch, "os-arch", "", "", "OS arch to use during management cluster upgrade. Discovered automatically if not provided (See [+])") - - upgradeCmd.AddCommand(upgradeClusterCmd) -} - -func runUpgradeCluster(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - tkrVersion := "" - if uc.tkrName != "" { - tkrVersion = utils.GetTKRVersionFromTKRName(uc.tkrName) - } - - options := tkgctl.UpgradeClusterOptions{ - ClusterName: clusterName, - Namespace: uc.namespace, - TkrVersion: tkrVersion, - VSphereTemplateName: uc.vSphereTemplateName, - SkipPrompt: uc.unattended || skipPrompt, - Timeout: uc.timeout, - OSName: uc.osName, - OSVersion: uc.osVersion, - OSArch: uc.osArch, - } - return tkgClient.UpgradeCluster(options) -} diff --git a/tkg/cmd/upgrade_region.go b/tkg/cmd/upgrade_region.go deleted file mode 100644 index 31350c555e..0000000000 --- a/tkg/cmd/upgrade_region.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "time" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -// upgradeRegionCmd represents the upgrade command -var upgradeRegionCmd = &cobra.Command{ - Use: "management-cluster CLUSTER_NAME", - Short: "Upgrade a management cluster", - Aliases: []string{"mc"}, - Args: cobra.ExactArgs(1), - Example: Examples(` - # Upgrade management cluster - tkg upgrade cluster mc-1 - - # Upgrade management cluster using specific os name (vsphere) - tkg upgrade cluster mc-1 --os-name photon - - # Upgrade management cluster using specific os name and version - tkg upgrade cluster mc-1 --os-name ubuntu --os-version 20.04 - - # Upgrade management cluster using specific os name, version and arch - tkg upgrade cluster mc-1 --os-name ubuntu --os-version 20.04 --os-arch amd64 - - [+] : Options available for: os-name, os-version, os-arch are as follows: - vSphere: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name photon --os-version 3 --os-arch amd64 - - aws: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name amazon --os-version 2 --os-arch amd64 - - azure: - --os-name ubuntu --os-version 20.04 --os-arch amd64 - --os-name ubuntu --os-version 18.04 --os-arch amd64 -`), - Run: func(cmd *cobra.Command, args []string) { - displayLogFileLocation() - err := runUpgradeRegion(args[0]) - verifyCommandError(err) - }, -} - -type upgradeRegionOptions struct { - vSphereTemplateName string - timeout time.Duration - unattended bool - osName string - osVersion string - osArch string -} - -var ur = &upgradeRegionOptions{} - -func init() { - upgradeRegionCmd.Flags().StringVarP(&ur.vSphereTemplateName, "vsphere-vm-template-name", "", "", "The vSphere VM template to be used with upgraded kubernetes version. Discovered automatically if not provided") - upgradeRegionCmd.Flags().DurationVarP(&ur.timeout, "timeout", "t", constants.DefaultLongRunningOperationTimeout, "Time duration to wait for an operation before timeout. Timeout duration in hours(h)/minutes(m)/seconds(s) units or as some combination of them (e.g. 2h, 30m, 2h30m10s)") - upgradeRegionCmd.Flags().BoolVarP(&ur.unattended, "yes", "y", false, "Upgrade management cluster without asking for confirmation") - - upgradeRegionCmd.Flags().StringVarP(&ur.osName, "os-name", "", "", "OS name to use during management cluster upgrade. Discovered automatically if not provided (See [+])") - upgradeRegionCmd.Flags().StringVarP(&ur.osVersion, "os-version", "", "", "OS version to use during management cluster upgrade. Discovered automatically if not provided (See [+])") - upgradeRegionCmd.Flags().StringVarP(&ur.osArch, "os-arch", "", "", "OS arch to use during management cluster upgrade. Discovered automatically if not provided (See [+])") - - upgradeCmd.AddCommand(upgradeRegionCmd) -} - -func runUpgradeRegion(clusterName string) error { - tkgClient, err := newTKGCtlClient() - if err != nil { - return err - } - - options := tkgctl.UpgradeRegionOptions{ - ClusterName: clusterName, - VSphereTemplateName: ur.vSphereTemplateName, - SkipPrompt: ur.unattended || skipPrompt, - Timeout: ur.timeout, - OSName: ur.osName, - OSVersion: ur.osVersion, - OSArch: ur.osArch, - } - return tkgClient.UpgradeRegion(options) -} diff --git a/tkg/cmd/version.go b/tkg/cmd/version.go deleted file mode 100644 index 654cfa107b..0000000000 --- a/tkg/cmd/version.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package cmd - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/component" - "github.com/vmware-tanzu/tanzu-framework/tkg/buildinfo" -) - -type versionInfo struct { - Version string - GitCommit string -} - -var versionCmd = &cobra.Command{ - Use: "version", - Short: "Display the version of the Tanzu Kubernetes Grid CLI", - Long: "Display the version of the Tanzu Kubernetes Grid CLI", - - RunE: func(cmd *cobra.Command, args []string) error { - return runVersion(cmd) - }, -} - -func init() { - versionCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format. Supported formats: json|yaml|table") - - RootCmd.AddCommand(versionCmd) -} - -func runVersion(cmd *cobra.Command) error { - verInfo := versionInfo{Version: buildinfo.Version, GitCommit: buildinfo.SHA} - - if outputFormat == string(component.JSONOutputType) || outputFormat == string(component.YAMLOutputType) { - output := component.NewObjectWriter(cmd.OutOrStdout(), outputFormat, verInfo) - output.Render() - return nil - } - - fmt.Fprintln(cmd.OutOrStdout(), "Client:") - fmt.Fprintf(cmd.OutOrStdout(), "\tVersion: %s\n", verInfo.Version) - fmt.Fprintf(cmd.OutOrStdout(), "\tGit commit: %s\n", verInfo.GitCommit) - - return nil -} diff --git a/tkg/constants/cluster_internal.go b/tkg/constants/cluster_internal.go deleted file mode 100644 index b9a3fdb5fc..0000000000 --- a/tkg/constants/cluster_internal.go +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package constants provides TKG constants -package constants - -// cluster related constants used internally -const ( - ClusterClassFeature = "vmware-system-tkg-clusterclass" - TKCAPIFeature = "vmware-system-tkg-tkc-api" - TKGSClusterClassNamespace = "vmware-system-tkg" - TKGSTKCAPINamespace = "vmware-system-tkg" - CorePackagesNamespaceInTKGS = "vmware-system-tkg" - CorePackagesNamespaceInTKGM = "tkg-system" - - ErrorMsgFeatureGateNotActivated = "vSphere with Tanzu environment detected, however, the feature '%v' is not activated in '%v' namespace" - ErrorMsgFeatureGateStatus = "error while checking feature '%v' status in namespace '%v'" - ErrorMsgClusterExistsAlready = "cluster with name %s already exists, please specify another name" - ErrorMsgClusterListError = "unable to get list of workload clusters managed by current management cluster" - - ErrorMsgCClassInputFeatureFlagEnabled = "input file is cluster class based but CLI feature flag '%v' is enabled, make sure its disabled to create cluster class based cluster" - - PacificGCMControllerDeployment = "vmware-system-tkg-controller-manager" - PacificGCMControllerNamespace = "vmware-system-tkg" - // PacificClusterKind vsphere-pacific provider work load cluster kind - PacificClusterKind = "TanzuKubernetesCluster" - PacificClusterListKind = "TanzuKubernetesClusterList" - DefaultPacificClusterAPIVersion = "run.tanzu.vmware.com/v1alpha2" - - CronJobKind = "CronJob" - CeipNamespace = "tkg-system-telemetry" - CeipAPIVersion = "batch/v1" - CeipJobName = "tkg-telemetry" - - AntreaDeploymentName = "antrea-controller" - AntreaDeploymentNamespace = "kube-system" - CalicoDeploymentName = "calico-kube-controllers" - CalicoDeploymentNamespace = "kube-system" - - TanzuRunAPIGroupPath = "/apis/run.tanzu.vmware.com" - - PinnipedSupervisorNameSpace = "pinniped-supervisor" - PinnipedFederationDomainObjectName = "pinniped-federation-domain" - PinnipedFederationDomainObjectKind = "FederationDomain" - PinnipedFederationDomainObjectAPIVersion = "config.supervisor.pinniped.dev/v1alpha1" - PinnipedSupervisorDefaultTLSSecretName = "pinniped-supervisor-default-tls-certificate" // #nosec - - TkgNamespace = "tkg-system" - - TkrNamespace = "tkr-system" - TkrConfigMapName = "tkr-controller-config" - TkgPublicNamespace = "tkg-system-public" - TmcNamespace = "vmware-system-tmc" - - KappControllerNamespace = "tkg-system" - KappControllerConfigMapName = "kapp-controller-config" - - AddonsManagerDeploymentName = "tanzu-addons-controller-manager" - KappControllerDeploymentName = "kapp-controller" - TkrControllerDeploymentName = "tkr-controller-manager" - KappControllerPackageName = "kapp-controller" - CoreManagementPluginsPackageName = "tanzu-core-management-plugins" - AKODeploymentName = "load-balancer-and-ingress-service(ako)" - - AkoStatefulSetName = "ako" - AkoAddonName = "load-balancer-and-ingress-service" - AkoNamespace = "avi-system" - AkoCleanUpAnnotationKey = "AviObjectDeletionStatus" - AkoCleanUpFinishedStatus = "Done" - AkoOperatorName = "ako-operator" - AkoMaxAllowedClusterNameLen = 25 - - ServiceDNSSuffix = ".svc" - ServiceDNSClusterLocalSuffix = ".svc.cluster.local" - - // TKGDataValueFormatString is required annotations for YTT data value file - TKGDataValueFormatString = "#@data/values\n#@overlay/match-child-defaults missing_ok=True\n---\n" - - CAPVClusterSelectorKey = "capv.vmware.com/cluster.name" -) - -// deployment plan constants -const ( - PlanDev = "dev" - PlanProd = "prod" - PlanDevCC = "devcc" - PlanProdCC = "prodcc" -) - -// infrastructure provider name constants -const ( - InfrastructureProviderVSphere = "vsphere" - InfrastructureProviderTkgs = "tkgs" - InfrastructureProviderAWS = "aws" - InfrastructureProviderAzure = "azure" - InfrastructureProviderDocker = "docker" - InfrastructureProviderOCI = "oci" -) - -var InfrastructureProviders = map[string]bool{ - InfrastructureProviderVSphere: true, - InfrastructureProviderTkgs: true, - InfrastructureProviderAWS: true, - InfrastructureProviderAzure: true, - InfrastructureProviderDocker: true, - InfrastructureProviderOCI: true, -} - -const ( - // InfrastructureRefVSphere is the vSphere infrastructure - InfrastructureRefVSphere = "VSphereCluster" - // InfrastructureRefAWS is the AWS infrastructure - InfrastructureRefAWS = "AWSCluster" - // InfrastructureRefAzure is the Azure infrastructure - InfrastructureRefAzure = "AzureCluster" - // InfrastructureRefDocker is the docker infrastructure - InfrastructureRefDocker = "DockerCluster" - // InfrastructureRefOCI is the Oracle Cloud infrastructure - InfrastructureRefOCI = "OCICluster" -) - -// networking constants -const ( - IPv4Family = "ipv4" - IPv6Family = "ipv6" - DualStackPrimaryIPv4Family = "ipv4,ipv6" - DualStackPrimaryIPv6Family = "ipv6,ipv4" - - LocalHost = "localhost" - LocalHostIP = "127.0.0.1" - LocalHostIPv6 = "::1" - - LinkLocalAddress = "169.254.0.0/16" - AzurePublicVIP = "168.63.129.16" -) - -// addons related constants -const ( - // AddonSecretType is the add on Secret type - AddonSecretType = "tkg.tanzu.vmware.com/addon" // nolint:gosec - // AddonNameLabel is the label on the Secret to indicate the name of addon to be installed - AddonNameLabel = "tkg.tanzu.vmware.com/addon-name" - // ClusterNameLabel is the label on the Secret to indicate the cluster on which addon is to be installed - ClusterNameLabel = "tkg.tanzu.vmware.com/cluster-name" - // ClusterPauseLabel is the label on the Cluster Object to indicate the cluster is paused by TKG - ClusterPauseLabel = "tkg.tanzu.vmware.com/paused" - // PackageTypeLabel is the label on the PackageInstall which mentions type of the package - PackageTypeLabel = "tkg.tanzu.vmware.com/package-type" - // CLIPluginImageRepositoryOverrideLabel is the label on the configmap which specifies CLIPlugin image repository override - CLIPluginImageRepositoryOverrideLabel = "cli.tanzu.vmware.com/cliplugin-image-repository-override" - // KappController labels - KappControllerAppLabel = "kapp.k14s.io/app" - KappControllerAssociationLabel = "kapp.k14s.io/association" -) - -// TKG management package related constants -const ( - TKGManagementPackageName = "tkg.tanzu.vmware.com" - TKGManagementPackageInstallName = "tkg-pkg" - TKGManagementPackageRepositoryName = "tanzu-management" - PackageTypeManagement = "management" -) - -const ( - TanzuCLISystemNamespace = "tanzu-cli-system" -) - -// Kind constants -const ( - KindCluster = "Cluster" - KindTanzuKubernetesCluster = "TanzuKubernetesCluster" - KindClusterClass = "ClusterClass" - KindKubeadmControlPlaneTemplate = "KubeadmControlPlaneTemplate" - KindKubeadmConfigTemplate = "KubeadmConfigTemplate" - KindAWSClusterTemplate = "AWSClusterTemplate" - KindAWSMachineTemplate = "AWSMachineTemplate" - KindAzureClusterTemplate = "AzureClusterTemplate" - KindAzureMachineTemplate = "AzureMachineTemplate" - KindVSphereClusterTemplate = "VSphereClusterTemplate" - KindVSphereMachineTemplate = "VSphereMachineTemplate" - KindDockerMachineTemplate = "DockerMachineTemplate" -) - -// Resources constants -const ( - ResourceClusterClass = "clusterclasses" - ResourceKubeadmControlPlaneTemplate = "kubeadmcontrolplanetemplates" - ResourceKubeadmConfigTemplate = "kubeadmconfigtemplates" - ResourceAWSClusterTemplate = "awsclustertemplates" - ResourceAWSMachineTemplate = "awsmachinetemplates" - ResourceAzureClusterTemplate = "azureclustertemplates" - ResourceAzureMachineTemplate = "azuremachinetemplates" - ResourceVSphereClusterTemplate = "vsphereclustertemplates" - ResourceVSphereMachineTemplate = "vspheremachinetemplates" -) - -type OperationType int - -const ( - OperationTypeInstall OperationType = iota - OperationTypeUpgrade -) diff --git a/tkg/constants/clusterclass_mapping.go b/tkg/constants/clusterclass_mapping.go deleted file mode 100644 index 11af8db36c..0000000000 --- a/tkg/constants/clusterclass_mapping.go +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -// ClusterAttributesToLegacyVariablesMapCommon has cluster class attributes to legacy variable names, are common for all infra providers. -var ClusterAttributesToLegacyVariablesMapCommon = map[string]string{ - "metadata.name": ConfigVariableClusterName, // CLUSTER_NAME - "metadata.namespace": ConfigVariableNamespace, // NAMESPACE - - "spec.clusterNetwork.pods.cidrBlocks": ConfigVariableClusterCIDR, // CLUSTER_CIDR - "spec.clusterNetwork.services.cidrBlocks": ConfigVariableServiceCIDR, // SERVICE_CIDR - - "spec.topology.class": ConfigVariableClusterClass, // CLUSTER_CLASS - "spec.topology.version": ConfigVariableKubernetesVersion, // KUBERNETES_VERSION - - "spec.topology.controlPlane.replicas": ConfigVariableControlPlaneMachineCount, // CONTROL_PLANE_MACHINE_COUNT - - "spec.topology.controlPlane.metadata.annotations.run.tanzu.vmware.com/resolve-os-image": "", - - "spec.topology.variables.network.ipv6Primary": TKGIPV6Primary, // TKG_IPV6_PRIMARY - "spec.topology.variables.proxy": TKGHTTPProxyEnabled, // TKG_HTTP_PROXY_ENABLED - "spec.topology.variables.proxy.httpProxy": TKGHTTPProxy, // TKG_HTTP_PROXY - "spec.topology.variables.proxy.httpsProxy": TKGHTTPSProxy, // TKG_HTTPS_PROXY - "spec.topology.variables.proxy.noProxy": TKGNoProxy, // TKG_NO_PROXY - "spec.topology.variables.proxy.systemWide": TKGSystemWideProxy, // TKG_NODE_SYSTEM_WIDE_PROXY - - "spec.topology.variables.imageRepository.host": ConfigVariableCustomImageRepository, - "spec.topology.variables.imageRepository.tlsCertificateValidation": ConfigVariableCustomImageRepositorySkipTLSVerify, - - "spec.topology.variables.clusterRole": ConfigVariableClusterRole, // TKG_CLUSTER_ROLE - - "spec.topology.variables.auditLogging.enabled": EnableAuditLogging, // ENABLE_AUDIT_LOGGING - - "spec.topology.variables.trust.additionalTrustedCAs.proxy": TKGProxyCACert, // TKG_PROXY_CA_CERT - "spec.topology.variables.trust.additionalTrustedCAs.imageRepository": ConfigVariableCustomImageRepositoryCaCertificate, // TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE - - "spec.topology.variables.apiServerPort": ConfigVariableClusterAPIServerPort, // CLUSTER_API_SERVER_PORT - - "spec.topology.variables.podSecurityStandard.deactivated": PodSecurityStandardDeactivated, // POD_SECURITY_STANDARD_DEACTIVATED - "spec.topology.variables.podSecurityStandard.audit": PodSecurityStandardAudit, // POD_SECURITY_STANDARD_AUDIT - "spec.topology.variables.podSecurityStandard.warn": PodSecurityStandardWarn, // POD_SECURITY_STANDARD_WARN - "spec.topology.variables.podSecurityStandard.enforce": PodSecurityStandardEnforce, // POD_SECURITY_STANDARD_ENFORCE -} - -// ClusterAttributesHigherPrecedenceToLowerMap has cluster class input attributes which -// has higher precedence (as key's in this map) to attribute with lower precedence (as value's in this map) -// For some properties (NODE_MACHINE_TYPE_1, NODE_MACHINE_TYPE_2, etc), Cluster YAML object may have values twice, this map holds attributes paths, key attribute path has higher -// precedence than the value attribute path. So if the Cluster object has the values for both key and value attribute paths, -// then we need to consider key attribute path (which has higher precedence). -// eg: Key: "spec.topology.workers.machineDeployments.1.variables.overrides.NODE_MACHINE_TYPE", value: "spec.topology.variables.nodes.1.machineType" -// these two key/value attribute paths mapped to NODE_MACHINE_TYPE_1 legacy variable, if these two attribute paths has values in Cluster Object -// then need to consider higher precedence attribute path value which is key of ClusterAttributesHigherPrecedenceToLowerMap. - -var ClusterAttributesHigherPrecedenceToLowerMap = map[string]string{ - "spec.topology.workers.machineDeployments.1.variables.overrides.NODE_MACHINE_TYPE": "spec.topology.variables.nodes.1.machineType", - "spec.topology.workers.machineDeployments.2.variables.overrides.NODE_MACHINE_TYPE": "spec.topology.variables.nodes.2.machineType", -} - -// ClusterAttributesToLegacyVariablesMapAws has, AWS Cluster object attributes path mapped to legacy variable names. -// spec.topology.variables.* mapped as per config_variable_association.star:get_aws_vars() -// other attributes mapped as per infrastructure-aws/v*.*.*/yttcc/overlay.yaml -var ClusterAttributesToLegacyVariablesMapAws = map[string]string{ - - "spec.topology.variables.region": ConfigVariableAWSRegion, // AWS_REGION - "spec.topology.variables.sshKeyName": ConfigVariableAWSSSHKeyName, // AWS_SSH_KEY_NAME - - "spec.topology.variables.loadBalancerSchemeInternal": ConfigVariableAWSLoadBalancerSchemeInternal, // AWS_LOAD_BALANCER_SCHEME_INTERNAL - - "spec.topology.variables.network.subnets.0.az": ConfigVariableAWSNodeAz, // AWS_NODE_AZ - "spec.topology.variables.network.subnets.0.private.cidr": ConfigVariableAWSPrivateNodeCIDR, // AWS_PRIVATE_NODE_CIDR - "spec.topology.variables.network.subnets.0.private.id": ConfigVariableAWSPrivateSubnetID, // AWS_PRIVATE_SUBNET_ID - "spec.topology.variables.network.subnets.0.public.cidr": ConfigVariableAWSPublicNodeCIDR, // AWS_PUBLIC_NODE_CIDR - "spec.topology.variables.network.subnets.0.public.id": ConfigVariableAWSPublicSubnetID, // AWS_PUBLIC_SUBNET_ID - "spec.topology.variables.network.subnets.1.az": ConfigVariableAWSNodeAz1, // AWS_NODE_AZ_1 - "spec.topology.variables.network.subnets.1.private.cidr": ConfigVariableAWSPrivateNodeCIDR1, // AWS_PRIVATE_NODE_CIDR_1 - "spec.topology.variables.network.subnets.1.private.id": ConfigVariableAWSPrivateSubnetID1, // AWS_PRIVATE_SUBNET_ID_1 - "spec.topology.variables.network.subnets.1.public.cidr": ConfigVariableAWSPublicNodeCIDR1, // AWS_PUBLIC_NODE_CIDR_1 - "spec.topology.variables.network.subnets.1.public.id": ConfigVariableAWSPublicSubnetID1, // AWS_PUBLIC_SUBNET_ID_1 - "spec.topology.variables.network.subnets.2.az": ConfigVariableAWSNodeAz2, // AWS_NODE_AZ_2 - "spec.topology.variables.network.subnets.2.private.cidr": ConfigVariableAWSPrivateNodeCIDR2, // AWS_PRIVATE_NODE_CIDR_2 - "spec.topology.variables.network.subnets.2.private.id": ConfigVariableAWSPrivateSubnetID2, // AWS_PRIVATE_SUBNET_ID_2 - "spec.topology.variables.network.subnets.2.public.cidr": ConfigVariableAWSPublicNodeCIDR2, // AWS_PUBLIC_NODE_CIDR_2 - "spec.topology.variables.network.subnets.2.public.id": ConfigVariableAWSPublicSubnetID2, // AWS_PUBLIC_SUBNET_ID_2 - - "spec.topology.variables.network.vpc.cidr": ConfigVariableAWSVPCCIDR, // AWS_VPC_CIDR - "spec.topology.variables.network.vpc.existingID": ConfigVariableAWSVPCID, // AWS_VPC_ID - - "spec.topology.variables.network.securityGroupOverrides.bastion": ConfigVariableAWSSecurityGroupBastion, // AWS_SECURITY_GROUP_BASTION - "spec.topology.variables.network.securityGroupOverrides.apiServerLB": ConfigVariableAWSSecurityGroupApiserverLb, // AWS_SECURITY_GROUP_APISERVER_LB - "spec.topology.variables.network.securityGroupOverrides.lb": ConfigVariableAWSSecurityGroupLb, // AWS_SECURITY_GROUP_LB - "spec.topology.variables.network.securityGroupOverrides.controlPlane": ConfigVariableAWSSecurityGroupControlplane, // AWS_SECURITY_GROUP_CONTROLPLANE - "spec.topology.variables.network.securityGroupOverrides.node": ConfigVariableAWSSecurityGroupNode, // AWS_SECURITY_GROUP_NODE - - "spec.topology.variables.bastion.enabled": ConfigVariableBastionHostEnabled, // BASTION_HOST_ENABLED - - "spec.topology.variables.identityRef.name": ConfigVariableAWSIdentityRefName, // AWS_IDENTITY_REF_NAME - "spec.topology.variables.identityRef.kind": ConfigVariableAWSIdentityRefKind, // AWS_IDENTITY_REF_KIND - - "spec.topology.variables.worker.instanceType": ConfigVariableNodeMachineType, // NODE_MACHINE_TYPE - "spec.topology.variables.worker.rootVolume.sizeGiB": ConfigVariableAWSNodeOsDiskSizeGib, // AWS_NODE_OS_DISK_SIZE_GIB - - "spec.topology.variables.controlPlane.instanceType": ConfigVariableControlPlaneMachineType, // CONTROL_PLANE_MACHINE_TYPE - "spec.topology.variables.controlPlane.rootVolume.sizeGiB": ConfigVariableAWSControlplaneOsDiskSizeGib, // AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB - - TopologyWorkersMachineDeploymentsClass0: "", - TopologyWorkersMachineDeploymentsName0: "", - TopologyWorkersMachineDeploymentsReplicas0: ConfigVariableWorkerMachineCount0, // WORKER_MACHINE_COUNT_0 - TopologyWorkersMachineDeploymentsFailureDomain0: "", // AWS_NODE_AZ_0, - - "spec.topology.workers.machineDeployments.0.metadata.annotations.run.tanzu.vmware.com/resolve-os-image": "", - - TopologyWorkersMachineDeploymentsClass1: "", - TopologyWorkersMachineDeploymentsName1: "", - TopologyWorkersMachineDeploymentsReplicas1: ConfigVariableWorkerMachineCount1, // WORKER_MACHINE_COUNT_1 - TopologyWorkersMachineDeploymentsFailureDomain1: "", // AWS_NODE_AZ_1 - - "spec.topology.workers.machineDeployments.1.variables.overrides.worker.instanceType": ConfigVariableNodeMachineType1, // NODE_MACHINE_TYPE_1 - - TopologyWorkersMachineDeploymentsClass2: "", - TopologyWorkersMachineDeploymentsName2: "", - TopologyWorkersMachineDeploymentsReplicas2: ConfigVariableWorkerMachineCount2, // WORKER_MACHINE_COUNT_2 - TopologyWorkersMachineDeploymentsFailureDomain2: "", // AWS_NODE_AZ_2 - - "spec.topology.workers.machineDeployments.2.variables.overrides.worker.instanceType": ConfigVariableNodeMachineType2, // NODE_MACHINE_TYPE_2 - -} - -// ClusterAttributesToLegacyVariablesMapAzure has, Azure Cluster object attributes path mapped to legacy variable names. -// spec.topology.variables.* mapped as per config_variable_association.star:get_azure_vars() -// other attributes mapped as per infrastructure-azure/v*.*.*/yttcc/overlay.yaml -var ClusterAttributesToLegacyVariablesMapAzure = map[string]string{ - - "spec.topology.variables.network.vnet.cidrBlocks": ConfigVariableAzureVnetCidr, // AZURE_VNET_CIDR - "spec.topology.variables.network.vnet.name": ConfigVariableAzureVnetName, // AZURE_VNET_NAME - "spec.topology.variables.network.vnet.resourceGroup": ConfigVariableAzureVnetResourceGroup, // AZURE_VNET_RESOURCE_GROUP - - "spec.topology.variables.location": ConfigVariableAzureLocation, // AZURE_LOCATION - "spec.topology.variables.resourceGroup": ConfigVariableAzureResourceGroup, // AZURE_RESOURCE_GROUP - "spec.topology.variables.subscriptionID": ConfigVariableAzureSubscriptionID, // AZURE_SUBSCRIPTION_ID - "spec.topology.variables.environment": ConfigVariableAzureEnvironment, // AZURE_ENVIRONMENT - "spec.topology.variables.sshPublicKey": ConfigVariableAzureSSHPublicKeyB64, // AZURE_SSH_PUBLIC_KEY_B64 - "spec.topology.variables.frontendPrivateIP": ConfigVariableAzureFrontendPrivateIP, // AZURE_FRONTEND_PRIVATE_IP - "spec.topology.variables.customTags": ConfigVariableAzureCustomTags, // AZURE_CUSTOM_TAGS - - "spec.topology.variables.acceleratedNetworking.enabled": ConfigVariableAzureEnableAcceleratedNetworking, // AZURE_ENABLE_ACCELERATED_NETWORKING - "spec.topology.variables.privateCluster.enabled": ConfigVariableAzureEnablePrivateCluster, // AZURE_ENABLE_PRIVATE_CLUSTER - - "spec.topology.variables.identityRef.name": ConfigVariableAzureIdentityName, // AZURE_IDENTITY_NAME - "spec.topology.variables.identityRef.namespace": ConfigVariableAzureIdentityNamespace, // AZURE_IDENTITY_NAMESPACE - - "spec.topology.variables.controlPlane.vmSize": ConfigVariableAzureCPMachineType, // AZURE_CONTROL_PLANE_MACHINE_TYPE - "spec.topology.variables.controlPlane.dataDisks.sizeGiB": ConfigVariableAzureControlPlaneDataDiskSizeGib, // AZURE_CONTROL_PLANE_DATA_DISK_SIZE_GIB - - "spec.topology.variables.controlPlane.osDisk.sizeGiB": ConfigVariableAzureControlPlaneOsDiskSizeGib, // AZURE_CONTROL_PLANE_OS_DISK_SIZE_GIB - "spec.topology.variables.controlPlane.osDisk.storageAccountType": ConfigVariableAzureControlPlaneOsDiskStorageAccountType, // AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE - - "spec.topology.variables.controlPlane.subnet.name": ConfigVariableAzureControlPlaneSubnetName, // AZURE_CONTROL_PLANE_SUBNET_NAME - "spec.topology.variables.controlPlane.subnet.cidr": ConfigVariableAzureControlPlaneSubnetCidr, // AZURE_CONTROL_PLANE_SUBNET_CIDR - "spec.topology.variables.controlPlane.subnet.securityGroup": ConfigVariableAzureControlPlaneSubnetSecurityGroup, // AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP - - "spec.topology.variables.controlPlane.outboundLB.enabled": ConfigVariableAzureControlPlaneOutboundLb, // AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB - "spec.topology.variables.controlPlane.outboundLB.frontendIPCount": ConfigVariableAzureControlPlaneOutboundLbFrontendIPCount, // AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT - - "spec.topology.variables.worker.vmSize": ConfigVariableAzureNodeMachineType, // AZURE_NODE_MACHINE_TYPE - "spec.topology.variables.worker.osDisk.sizeGiB": ConfigVariableAzureNodeOsDiskSizeGib, // AZURE_NODE_OS_DISK_SIZE_GIB - "spec.topology.variables.worker.osDisk.storageAccountType": ConfigVariableAzureNodeOsDiskStorageAccountType, // AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE - "spec.topology.variables.worker.dataDisks.sizeGiB": ConfigVariableAzureNodeDataDiskSizeGib, // AZURE_NODE_DATA_DISK_SIZE_GIB - - "spec.topology.variables.worker.subnet.cidr": ConfigVariableAzureWorkerNodeSubnetCidr, // AZURE_NODE_SUBNET_CIDR - "spec.topology.variables.worker.subnet.name": ConfigVariableAzureWorkerSubnetName, // AZURE_NODE_SUBNET_NAME - "spec.topology.variables.worker.subnet.securityGroup": ConfigVariableAzureNodeSubnetSecurityGroup, // AZURE_NODE_SUBNET_SECURITY_GROUP - - "spec.topology.variables.worker.outboundLB.enabled": ConfigVariableAzureEnableNodeOutboundLb, // AZURE_ENABLE_NODE_OUTBOUND_LB - "spec.topology.variables.worker.outboundLB.frontendIPCount": ConfigVariableAzureNodeOutboundLbFrontendIPCount, // AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT - "spec.topology.variables.worker.outboundLB.idleTimeoutInMinutes": ConfigVariableAzureNodeOutboundLbIdleTimeoutInMinutes, // AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES - - TopologyWorkersMachineDeploymentsClass0: "", - TopologyWorkersMachineDeploymentsName0: "", - TopologyWorkersMachineDeploymentsReplicas0: ConfigVariableWorkerMachineCount0, - TopologyWorkersMachineDeploymentsFailureDomain0: ConfigVariableAzureAZ, - - "spec.topology.workers.machineDeployments.0.metadata.annotations.run.tanzu.vmware.com/resolve-os-image": "", - - TopologyWorkersMachineDeploymentsClass1: "", - TopologyWorkersMachineDeploymentsName1: "", - TopologyWorkersMachineDeploymentsReplicas1: ConfigVariableWorkerMachineCount1, - TopologyWorkersMachineDeploymentsFailureDomain1: ConfigVariableAzureAZ1, - - "spec.topology.workers.machineDeployments.1.variables.overrides.worker.vmSize": ConfigVariableNodeMachineType1, - - TopologyWorkersMachineDeploymentsClass2: "", - TopologyWorkersMachineDeploymentsName2: "", - TopologyWorkersMachineDeploymentsReplicas2: ConfigVariableWorkerMachineCount2, - TopologyWorkersMachineDeploymentsFailureDomain2: ConfigVariableAzureAZ2, - - "spec.topology.workers.machineDeployments.2.variables.overrides.worker.vmSize": ConfigVariableNodeMachineType2, -} - -// ClusterAttributesToLegacyVariablesMapVsphere has, Vsphere Cluster object attributes path mapped to legacy variable names. -// spec.topology.variables.* mapped as per config_variable_association.star:get_vsphere_vars() -// other attributes mapped as per infrastructure-vsphere/v*.*.*/yttcc/overlay.yaml -var ClusterAttributesToLegacyVariablesMapVsphere = map[string]string{ - "spec.topology.variables.network.addressesFromPools.apiGroup": "", - "spec.topology.variables.network.addressesFromPools.kind": "", - "spec.topology.variables.network.addressesFromPools.name": ConfigVariableNodeIPAMIPPoolName, // NODE_IPAM_IP_POOL_NAME - - "spec.topology.variables.apiServerEndpoint": ConfigVariableVsphereControlPlaneEndpoint, // VSPHERE_CONTROL_PLANE_ENDPOINT - "spec.topology.variables.vipNetworkInterface": ConfigVariableVipNetworkInterface, // VIP_NETWORK_INTERFACE - "spec.topology.variables.aviAPIServerHAProvider": ConfigVariableVsphereHaProvider, // AVI_CONTROL_PLANE_HA_PROVIDER - - "spec.topology.variables.vcenter.cloneMode": ConfigVariableVsphereCloneMode, // VSPHERE_CLONE_MODE - "spec.topology.variables.vcenter.network": ConfigVariableVsphereNetwork, // VSPHERE_NETWORK - "spec.topology.variables.vcenter.resourcePool": ConfigVariableVsphereResourcePool, // VSPHERE_RESOURCE_POOL - "spec.topology.variables.vcenter.template": ConfigVariableVsphereTemplate, // VSPHERE_TEMPLATE - "spec.topology.variables.vcenter.tlsThumbprint": ConfigVariableVsphereTLSThumbprint, // VSPHERE_TLS_THUMBPRINT - "spec.topology.variables.vcenter.datacenter": ConfigVariableVsphereDatacenter, // VSPHERE_DATACENTER - "spec.topology.variables.vcenter.datastore": ConfigVariableVsphereDatastore, // VSPHERE_DATASTORE - "spec.topology.variables.vcenter.folder": ConfigVariableVsphereFolder, // VSPHERE_FOLDER - "spec.topology.variables.vcenter.server": ConfigVariableVsphereServer, // VSPHERE_SERVER - "spec.topology.variables.vcenter.insecure": ConfigVariableVsphereInsecure, // VSPHERE_INSECURE this variable doesn't exist in clusterclass, will be infer from tlsThumbprint - - "spec.topology.variables.user.sshAuthorizedKeys": ConfigVariableVsphereSSHAuthorizedKey, // VSPHERE_SSH_AUTHORIZED_KEY - - "spec.topology.variables.controlPlane.machine.diskGiB": ConfigVariableVsphereCPDiskGib, // VSPHERE_CONTROL_PLANE_DISK_GIB - "spec.topology.variables.controlPlane.machine.memoryMiB": ConfigVariableVsphereCPMemMib, // VSPHERE_CONTROL_PLANE_MEM_MIB - "spec.topology.variables.controlPlane.machine.numCPUs": ConfigVariableVsphereCPNumCpus, // VSPHERE_CONTROL_PLANE_NUM_CPUS - "spec.topology.variables.controlPlane.network.nameservers": ConfigVariableControlPlaneNodeNameservers, // CONTROL_PLANE_NODE_NAMESERVERS - - "spec.topology.variables.worker.machine.diskGiB": ConfigVariableVsphereWorkerDiskGib, // VSPHERE_WORKER_DISK_GIB - "spec.topology.variables.worker.machine.memoryMiB": ConfigVariableVsphereWorkerMemMib, // VSPHERE_WORKER_MEM_MIB - "spec.topology.variables.worker.machine.numCPUs": ConfigVariableVsphereWorkerNumCpus, // VSPHERE_WORKER_NUM_CPUS - "spec.topology.variables.worker.network.nameservers": ConfigVariableWorkerNodeNameservers, // WORKER_NODE_NAMESERVERS - - "spec.topology.variables.pci.controlPlane.hardwareVersion": ConfigVariableVSphereControlPlaneHardwareVersion, // VSPHERE_CONTROL_PLANE_HARDWARE_VERSION - "spec.topology.variables.pci.worker.hardwareVersion": ConfigVariableVSphereWorkerHardwareVersion, // VSPHERE_WORKER_HARDWARE_VERSION - - TopologyWorkersMachineDeploymentsClass0: "", - TopologyWorkersMachineDeploymentsName0: "", - TopologyWorkersMachineDeploymentsReplicas0: ConfigVariableWorkerMachineCount, - TopologyWorkersMachineDeploymentsFailureDomain0: ConfigVariableVsphereAz0, - - TopologyWorkersMachineDeploymentsClass1: "", - TopologyWorkersMachineDeploymentsName1: "", - TopologyWorkersMachineDeploymentsReplicas1: ConfigVariableWorkerMachineCount1, - TopologyWorkersMachineDeploymentsFailureDomain1: ConfigVariableVsphereAz1, - - TopologyWorkersMachineDeploymentsClass2: "", - TopologyWorkersMachineDeploymentsName2: "", - TopologyWorkersMachineDeploymentsReplicas2: ConfigVariableWorkerMachineCount2, - TopologyWorkersMachineDeploymentsFailureDomain2: ConfigVariableVsphereAz2, - - "spec.topology.variables.customTDNFRepository.certificate": ConfigVariableCustomTDNFRepositoryCertificate, -} - -// ClusterAttributesToLegacyVariablesMapDocker has, Docker Cluster object attributes path mapped to legacy variable names. -var ClusterAttributesToLegacyVariablesMapDocker = map[string]string{} - -// ClusterAttributesWithArrayTypeValue has, list of Cluster attributes paths, which value type is array list -var ClusterAttributesWithArrayTypeValue = map[string]bool{ - "spec.clusterNetwork.pods.cidrBlocks": true, - "spec.clusterNetwork.services.cidrBlocks": true, - "spec.topology.variables.proxy.noProxy": true, - "spec.topology.variables.user.sshAuthorizedKeys": true, - "spec.topology.variables.network.vnet.cidrBlocks": true, -} - -// Cluster class variables constants -const ( - RegexpMachineDeploymentsOverrides = `spec.topology.workers.machineDeployments.[0-9].variables.overrides` - RegexpTopologyClassValue = `tkg-(aws|azure|vsphere)-default` - - TopologyVariablesNetworkSubnets = "spec.topology.variables.network.subnets" - TopologyVariablesNodes = "spec.topology.variables.nodes" - TopologyVariablesTrust = "spec.topology.variables.trust" - TopologyWorkersMachineDeployments = "spec.topology.workers.machineDeployments" - TopologyClass = "spec.topology.class" - TopologyVariables = "spec.topology.variables" - - TopologyWorkersMachineDeploymentsClass0 = "spec.topology.workers.machineDeployments.0.class" - TopologyWorkersMachineDeploymentsName0 = "spec.topology.workers.machineDeployments.0.name" - TopologyWorkersMachineDeploymentsReplicas0 = "spec.topology.workers.machineDeployments.0.replicas" - TopologyWorkersMachineDeploymentsFailureDomain0 = "spec.topology.workers.machineDeployments.0.failureDomain" - - TopologyWorkersMachineDeploymentsClass1 = "spec.topology.workers.machineDeployments.1.class" - TopologyWorkersMachineDeploymentsName1 = "spec.topology.workers.machineDeployments.1.name" - TopologyWorkersMachineDeploymentsReplicas1 = "spec.topology.workers.machineDeployments.1.replicas" - TopologyWorkersMachineDeploymentsFailureDomain1 = "spec.topology.workers.machineDeployments.1.failureDomain" - - TopologyWorkersMachineDeploymentsClass2 = "spec.topology.workers.machineDeployments.2.class" - TopologyWorkersMachineDeploymentsName2 = "spec.topology.workers.machineDeployments.2.name" - TopologyWorkersMachineDeploymentsReplicas2 = "spec.topology.workers.machineDeployments.2.replicas" - TopologyWorkersMachineDeploymentsFailureDomain2 = "spec.topology.workers.machineDeployments.2.failureDomain" - - SPEC = "spec" - - TopologyClassIncorrectValueErrMsg = "input cluster class file, attribute spec.topology.class has no value or incorrect value or not following correct naming convention" - ClusterResourceWithoutTopologyNotSupportedErrMsg = "input file contains Cluster resource which doesn't have ClusterClass specified. Passing Cluster resource without ClusterClass specification is not supported" -) - -// InfrastructureSpecificVariableMappingMap has, infra name to variable mapping map, which makes easy to get infra specific mapping map -var InfrastructureSpecificVariableMappingMap = map[string]map[string]string{ - InfrastructureProviderVSphere: ClusterAttributesToLegacyVariablesMapVsphere, - InfrastructureProviderAWS: ClusterAttributesToLegacyVariablesMapAws, - InfrastructureProviderAzure: ClusterAttributesToLegacyVariablesMapAzure, - InfrastructureProviderDocker: ClusterAttributesToLegacyVariablesMapDocker, -} - -// During initialization, combine common map to infra specific map's, which reduces code where we use infra maps -func init() { - for key, value := range ClusterAttributesToLegacyVariablesMapCommon { - ClusterAttributesToLegacyVariablesMapAws[key] = value - ClusterAttributesToLegacyVariablesMapAzure[key] = value - ClusterAttributesToLegacyVariablesMapVsphere[key] = value - ClusterAttributesToLegacyVariablesMapDocker[key] = value - } -} diff --git a/tkg/constants/config_keys.go b/tkg/constants/config_keys.go deleted file mode 100644 index 9fcc486bbd..0000000000 --- a/tkg/constants/config_keys.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -// config key name constants -const ( - // OverrideFolderKey key for overrides folder to override the default overrides directory($HOME/.cluster-api/overrides) - OverrideFolderKey = "overridesFolder" - ImagesConfigKey = "images" - ReleaseKey = "release" - ProvidersConfigKey = "providers" - CertManagerConfigKey = "cert-manager" - InfrastructureProviderType = "InfrastructureProvider" - - KeyTkg = "tkg" - KeyRegions = "regions" - KeyRegionName = "name" - KeyCurrentRegionContext = "current-region-context" - KeyRegionContext = "context" - - KeyCertManagerTimeout = "cert-manager-timeout" -) diff --git a/tkg/constants/config_variables.go b/tkg/constants/config_variables.go deleted file mode 100644 index 59588dbb8a..0000000000 --- a/tkg/constants/config_variables.go +++ /dev/null @@ -1,307 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -// Configuration variable name constants -const ( - ConfigVariableDefaultBomFile = "TKG_DEFAULT_BOM" - ConfigVariableCustomImageRepository = "TKG_CUSTOM_IMAGE_REPOSITORY" - ConfigVariableDevImageRepository = "TKG_DEV_IMAGE_REPOSITORY" - ConfigVariableCompatibilityCustomImagePath = "TKG_CUSTOM_COMPATIBILITY_IMAGE_PATH" - ConfigVariableCustomImageRepositorySkipTLSVerify = "TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY" - ConfigVariableCustomImageRepositoryCaCertificate = "TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE" - ConfigVariableDefaultStandaloneDiscoveryImagePath = "TKG_DEFAULT_STANDALONE_DISCOVERY_IMAGE_PATH" - ConfigVariableDefaultStandaloneDiscoveryImageTag = "TKG_DEFAULT_STANDALONE_DISCOVERY_IMAGE_TAG" - ConfigVariableDefaultStandaloneDiscoveryType = "TKG_DEFAULT_STANDALONE_DISCOVERY_TYPE" - ConfigVariableDefaultStandaloneDiscoveryLocalPath = "TKG_DEFAULT_STANDALONE_DISCOVERY_LOCAL_PATH" - ConfigVariableClusterAPIServerPort = "CLUSTER_API_SERVER_PORT" - ConfigVariableBastionHostEnabled = "BASTION_HOST_ENABLED" - ConfigVariableVipNetworkInterface = "VIP_NETWORK_INTERFACE" - ConfigVariableEtcdExtraArgs = "ETCD_EXTRA_ARGS" - ConfigVariableAPIServerExtraArgs = "APISERVER_EXTRA_ARGS" - ConfigVariableKubeSchedulerExtraArgs = "KUBE_SCHEDULER_EXTRA_ARGS" - ConfigVariableKubeControllerManagerExtraArgs = "KUBE_CONTROLLER_MANAGER_EXTRA_ARGS" - ConfigVariableControlPlaneKubeletExtraArgs = "CONTROLPLANE_KUBELET_EXTRA_ARGS" - ConfigVariableWorkerKubeletExtraArgs = "WORKER_KUBELET_EXTRA_ARGS" - - ConfigVariableAWSRegion = "AWS_REGION" - ConfigVariableAWSSecretAccessKey = "AWS_SECRET_ACCESS_KEY" //nolint:gosec - ConfigVariableAWSAccessKeyID = "AWS_ACCESS_KEY_ID" //nolint:gosec - ConfigVariableAWSSessionToken = "AWS_SESSION_TOKEN" //nolint:gosec - ConfigVariableAWSProfile = "AWS_PROFILE" - ConfigVariableAWSB64Credentials = "AWS_B64ENCODED_CREDENTIALS" //nolint:gosec - ConfigVariableAWSVPCID = "AWS_VPC_ID" - ConfigVariableAWSSSHKeyName = "AWS_SSH_KEY_NAME" - - ConfigVariableAWSPublicNodeCIDR = "AWS_PUBLIC_NODE_CIDR" - ConfigVariableAWSPrivateNodeCIDR = "AWS_PRIVATE_NODE_CIDR" - ConfigVariableAWSPublicNodeCIDR1 = "AWS_PUBLIC_NODE_CIDR_1" - ConfigVariableAWSPrivateNodeCIDR1 = "AWS_PRIVATE_NODE_CIDR_1" - ConfigVariableAWSPublicNodeCIDR2 = "AWS_PUBLIC_NODE_CIDR_2" - ConfigVariableAWSPrivateNodeCIDR2 = "AWS_PRIVATE_NODE_CIDR_2" - ConfigVariableAWSPublicSubnetID = "AWS_PUBLIC_SUBNET_ID" - ConfigVariableAWSPrivateSubnetID = "AWS_PRIVATE_SUBNET_ID" - ConfigVariableAWSPublicSubnetID1 = "AWS_PUBLIC_SUBNET_ID_1" - ConfigVariableAWSPrivateSubnetID1 = "AWS_PRIVATE_SUBNET_ID_1" - ConfigVariableAWSPublicSubnetID2 = "AWS_PUBLIC_SUBNET_ID_2" - ConfigVariableAWSPrivateSubnetID2 = "AWS_PRIVATE_SUBNET_ID_2" - ConfigVariableAWSVPCCIDR = "AWS_VPC_CIDR" - ConfigVariableAWSNodeAz = "AWS_NODE_AZ" - ConfigVariableAWSNodeAz1 = "AWS_NODE_AZ_1" - ConfigVariableAWSNodeAz2 = "AWS_NODE_AZ_2" - ConfigVariableAWSAMIID = "AWS_AMI_ID" - ConfigVariableAWSLoadBalancerSchemeInternal = "AWS_LOAD_BALANCER_SCHEME_INTERNAL" - ConfigVariableAWSNodeOsDiskSizeGib = "AWS_NODE_OS_DISK_SIZE_GIB" - - ConfigVariableAWSIdentityRefKind = "AWS_IDENTITY_REF_KIND" - ConfigVariableAWSIdentityRefName = "AWS_IDENTITY_REF_NAME" - ConfigVariableAWSSecurityGroupNode = "AWS_SECURITY_GROUP_NODE" - ConfigVariableAWSSecurityGroupApiserverLb = "AWS_SECURITY_GROUP_APISERVER_LB" - ConfigVariableAWSSecurityGroupBastion = "AWS_SECURITY_GROUP_BASTION" - ConfigVariableAWSSecurityGroupControlplane = "AWS_SECURITY_GROUP_CONTROLPLANE" - ConfigVariableAWSSecurityGroupLb = "AWS_SECURITY_GROUP_LB" - ConfigVariableAWSControlplaneOsDiskSizeGib = "AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB" - - ConfigVariableVsphereAz0 = "VSPHERE_AZ_0" - ConfigVariableVsphereAz1 = "VSPHERE_AZ_1" - ConfigVariableVsphereAz2 = "VSPHERE_AZ_2" - ConfigVariableVsphereCloneMode = "VSPHERE_CLONE_MODE" - ConfigVariableVsphereControlPlaneEndpoint = "VSPHERE_CONTROL_PLANE_ENDPOINT" - ConfigVariableVsphereServer = "VSPHERE_SERVER" - ConfigVariableVsphereUsername = "VSPHERE_USERNAME" - ConfigVariableVspherePassword = "VSPHERE_PASSWORD" - ConfigVariableVsphereTLSThumbprint = "VSPHERE_TLS_THUMBPRINT" - ConfigVariableVsphereSSHAuthorizedKey = "VSPHERE_SSH_AUTHORIZED_KEY" - ConfigVariableVsphereTemplate = "VSPHERE_TEMPLATE" - ConfigVariableVsphereTemplateMoid = "VSPHERE_TEMPLATE_MOID" - ConfigVariableVsphereDatacenter = "VSPHERE_DATACENTER" - ConfigVariableVsphereResourcePool = "VSPHERE_RESOURCE_POOL" - ConfigVariableVsphereStoragePolicyID = "VSPHERE_STORAGE_POLICY_ID" - ConfigVariableVsphereDatastore = "VSPHERE_DATASTORE" - ConfigVariableVsphereFolder = "VSPHERE_FOLDER" - ConfigVariableVsphereWorkerpciDevices = "VSPHERE_WORKER_PCI_DEVICES" - ConfigVariableVsphereControlPlanepciDevices = "VSPHERE_CONTROL_PLANE_PCI_DEVICES" - ConfigVariableVsphereControlPlaneCustomVMXKeys = "VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS" - ConfigVariableVsphereWorkerCustomVMXKeys = "VSPHERE_WORKER_CUSTOM_VMX_KEYS" - ConfigVariableVsphereIgnorepciDevicesAllowList = "VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST" - ConfigVariableVsphereWorkerRolloutStrategy = "WORKER_ROLLOUT_STRATEGY" - ConfigVariableVsphereNumCpus = "VSPHERE_NUM_CPUS" - ConfigVariableVsphereMemMib = "VSPHERE_MEM_MIB" - ConfigVariableVsphereDiskGib = "VSPHERE_DISK_GIB" - ConfigVariableVsphereWorkerNumCpus = "VSPHERE_WORKER_NUM_CPUS" - ConfigVariableVsphereWorkerMemMib = "VSPHERE_WORKER_MEM_MIB" - ConfigVariableVsphereWorkerDiskGib = "VSPHERE_WORKER_DISK_GIB" - ConfigVariableVsphereCPNumCpus = "VSPHERE_CONTROL_PLANE_NUM_CPUS" - ConfigVariableVsphereCPMemMib = "VSPHERE_CONTROL_PLANE_MEM_MIB" - ConfigVariableVsphereCPDiskGib = "VSPHERE_CONTROL_PLANE_DISK_GIB" - ConfigVariableVsphereInsecure = "VSPHERE_INSECURE" // VCInsecure decides if the vc connection will skip the ssl validation or not. - ConfigVariableVsphereVersion = "VSPHERE_VERSION" - ConfigVariableVsphereNetwork = "VSPHERE_NETWORK" - ConfigVariableVSphereControlPlaneHardwareVersion = "VSPHERE_CONTROL_PLANE_HARDWARE_VERSION" - ConfigVariableVSphereWorkerHardwareVersion = "VSPHERE_WORKER_HARDWARE_VERSION" - ConfigVariableVsphereHaProvider = "AVI_CONTROL_PLANE_HA_PROVIDER" - - ConfigVariableAzureControlPlaneSubnet = "AZURE_CONTROL_PLANE_SUBNET_NAME" - ConfigVariableAzureControlPlaneSubnetName = "AZURE_CONTROL_PLANE_SUBNET_NAME" - ConfigVariableAzureControlPlaneSubnetCidr = "AZURE_CONTROL_PLANE_SUBNET_CIDR" - ConfigVariableAzureCPMachineType = "AZURE_CONTROL_PLANE_MACHINE_TYPE" - ConfigVariableAzureControlPlaneDataDiskSizeGib = "AZURE_CONTROL_PLANE_DATA_DISK_SIZE_GIB" - ConfigVariableAzureControlPlaneOsDiskStorageAccountType = "AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE" - ConfigVariableAzureControlPlaneOsDiskSizeGib = "AZURE_CONTROL_PLANE_OS_DISK_SIZE_GIB" - ConfigVariableAzureControlPlaneOutboundLbFrontendIPCount = "AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT" - ConfigVariableAzureControlPlaneOutboundLb = "AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB" - ConfigVariableAzureControlPlaneSubnetSecurityGroup = "AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP" - - ConfigVariableAzureCustomTags = "AZURE_CUSTOM_TAGS" - ConfigVariableAzureEnableAcceleratedNetworking = "AZURE_ENABLE_ACCELERATED_NETWORKING" - ConfigVariableAzureEnablePrivateCluster = "AZURE_ENABLE_PRIVATE_CLUSTER" - ConfigVariableAzureFrontendPrivateIP = "AZURE_FRONTEND_PRIVATE_IP" - ConfigVariableAzureLocation = "AZURE_LOCATION" - ConfigVariableAzureIdentityName = "AZURE_IDENTITY_NAME" - ConfigVariableAzureIdentityNamespace = "AZURE_IDENTITY_NAMESPACE" - ConfigVariableAzureImageID = "AZURE_IMAGE_ID" - ConfigVariableAzureImagePublisher = "AZURE_IMAGE_PUBLISHER" - ConfigVariableAzureImageOffer = "AZURE_IMAGE_OFFER" - ConfigVariableAzureImageSku = "AZURE_IMAGE_SKU" - ConfigVariableAzureImageVersion = "AZURE_IMAGE_VERSION" - ConfigVariableAzureImageThirdParty = "AZURE_IMAGE_THIRD_PARTY" - ConfigVariableAzureImageResourceGroup = "AZURE_IMAGE_RESOURCE_GROUP" - ConfigVariableAzureImageName = "AZURE_IMAGE_NAME" - ConfigVariableAzureImageSubscriptionID = "AZURE_IMAGE_SUBSCRIPTION_ID" - ConfigVariableAzureImageGallery = "AZURE_IMAGE_GALLERY" - ConfigVariableAzureSubscriptionIDB64 = "AZURE_SUBSCRIPTION_ID_B64" - ConfigVariableAzureTenantIDB64 = "AZURE_TENANT_ID_B64" - ConfigVariableAzureClientSecretB64 = "AZURE_CLIENT_SECRET_B64" //nolint:gosec - ConfigVariableAzureClientIDB64 = "AZURE_CLIENT_ID_B64" - ConfigVariableAzureSubscriptionID = "AZURE_SUBSCRIPTION_ID" - ConfigVariableAzureTenantID = "AZURE_TENANT_ID" - ConfigVariableAzureClientSecret = "AZURE_CLIENT_SECRET" //nolint:gosec - ConfigVariableAzureClientID = "AZURE_CLIENT_ID" - ConfigVariableAzureResourceGroup = "AZURE_RESOURCE_GROUP" - ConfigVariableAzureVnetName = "AZURE_VNET_NAME" - ConfigVariableAzureVnetResourceGroup = "AZURE_VNET_RESOURCE_GROUP" - ConfigVariableAzureVnetCidr = "AZURE_VNET_CIDR" - - ConfigVariableAzureWorkerSubnet = "AZURE_NODE_SUBNET_NAME" - ConfigVariableAzureWorkerSubnetName = "AZURE_NODE_SUBNET_NAME" - ConfigVariableAzureAZ = "AZURE_NODE_AZ" - ConfigVariableAzureAZ1 = "AZURE_NODE_AZ_1" - ConfigVariableAzureAZ2 = "AZURE_NODE_AZ_2" - ConfigVariableAzureNodeOsDiskSizeGib = "AZURE_NODE_OS_DISK_SIZE_GIB" - ConfigVariableAzureNodeOsDiskStorageAccountType = "AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE" - ConfigVariableAzureEnableNodeDataDisk = "AZURE_ENABLE_NODE_DATA_DISK" - ConfigVariableAzureNodeDataDiskSizeGib = "AZURE_NODE_DATA_DISK_SIZE_GIB" - ConfigVariableAzureNodeSubnetSecurityGroup = "AZURE_NODE_SUBNET_SECURITY_GROUP" - ConfigVariableAzureEnableNodeOutboundLb = "AZURE_ENABLE_NODE_OUTBOUND_LB" - ConfigVariableAzureNodeOutboundLbFrontendIPCount = "AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT" - ConfigVariableAzureNodeOutboundLbIdleTimeoutInMinutes = "AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES" - ConfigVariableAzureWorkerNodeSubnetCidr = "AZURE_NODE_SUBNET_CIDR" - ConfigVariableAzureSSHPublicKeyB64 = "AZURE_SSH_PUBLIC_KEY_B64" - ConfigVariableAzureNodeMachineType = "AZURE_NODE_MACHINE_TYPE" - ConfigVariableAzureEnvironment = "AZURE_ENVIRONMENT" - - ConfigVariableDockerMachineTemplateImage = "DOCKER_MACHINE_TEMPLATE_IMAGE" - - ConfigVariablePinnipedSupervisorIssuerURL = "SUPERVISOR_ISSUER_URL" - ConfigVariablePinnipedSupervisorIssuerCABundleData = "SUPERVISOR_ISSUER_CA_BUNDLE_DATA_B64" - - ConfigVariableClusterRole = "TKG_CLUSTER_ROLE" - ConfigVariableForceRole = "_TKG_CLUSTER_FORCE_ROLE" - ConfigVariableProviderType = "PROVIDER_TYPE" - ConfigVariableTKGVersion = "TKG_VERSION" - ConfigVariableBuildEdition = "BUILD_EDITION" - ConfigVariableFilterByAddonType = "FILTER_BY_ADDON_TYPE" - ConfigVaraibleDisableCRSForAddonType = "DISABLE_CRS_FOR_ADDON_TYPE" - ConfigVariableEnableAutoscaler = "ENABLE_AUTOSCALER" - ConfigVariableDisableTMCCloudPermissions = "DISABLE_TMC_CLOUD_PERMISSIONS" - AutoscalerDeploymentNameSuffix = "-cluster-autoscaler" - ConfigVariableDryRunMode = "DRY_RUN_MODE" - - ConfigVariableControlPlaneMachineCount = "CONTROL_PLANE_MACHINE_COUNT" - ConfigVariableControlPlaneMachineType = "CONTROL_PLANE_MACHINE_TYPE" - - ConfigVariableWorkerMachineCount = "WORKER_MACHINE_COUNT" - ConfigVariableWorkerMachineCount0 = "WORKER_MACHINE_COUNT_0" - ConfigVariableWorkerMachineCount1 = "WORKER_MACHINE_COUNT_1" - ConfigVariableWorkerMachineCount2 = "WORKER_MACHINE_COUNT_2" - ConfigVariableNodeMachineType = "NODE_MACHINE_TYPE" - ConfigVariableNodeMachineType1 = "NODE_MACHINE_TYPE_1" - ConfigVariableNodeMachineType2 = "NODE_MACHINE_TYPE_2" - ConfigVariableCPMachineType = "CONTROL_PLANE_MACHINE_TYPE" - - ConfigVariableNamespace = "NAMESPACE" - ConfigVariableEnableClusterOptions = "ENABLE_CLUSTER_OPTIONS" - - TKGHTTPProxy = "TKG_HTTP_PROXY" - TKGHTTPSProxy = "TKG_HTTPS_PROXY" - TKGHTTPProxyEnabled = "TKG_HTTP_PROXY_ENABLED" - TKGNoProxy = "TKG_NO_PROXY" - TKGProxyCACert = "TKG_PROXY_CA_CERT" - TKGSystemWideProxy = "TKG_NODE_SYSTEM_WIDE_PROXY" - EnableAuditLogging = "ENABLE_AUDIT_LOGGING" - TKGIPFamily = "TKG_IP_FAMILY" - - PodSecurityStandardDeactivated = "POD_SECURITY_STANDARD_DEACTIVATED" - PodSecurityStandardAudit = "POD_SECURITY_STANDARD_AUDIT" - PodSecurityStandardWarn = "POD_SECURITY_STANDARD_WARN" - PodSecurityStandardEnforce = "POD_SECURITY_STANDARD_ENFORCE" - - ConfigVariableOSName = "OS_NAME" - ConfigVariableOSVersion = "OS_VERSION" - ConfigVariableOSArch = "OS_ARCH" - - ConfigVariableClusterCIDR = "CLUSTER_CIDR" - ConfigVariableServiceCIDR = "SERVICE_CIDR" - - ConfigVariableCoreDNSIP = "CORE_DNS_IP" - - ConfigVariableIPFamily = "TKG_IP_FAMILY" - TKGIPV6Primary = "TKG_IPV6_PRIMARY" - - ConfigVariableNodeIPAMIPPoolName = "NODE_IPAM_IP_POOL_NAME" - - ConfigVariableControlPlaneNodeNameservers = "CONTROL_PLANE_NODE_NAMESERVERS" - ConfigVariableWorkerNodeNameservers = "WORKER_NODE_NAMESERVERS" - - // Below config variables are added based on init and create command flags - - ConfigVariableClusterPlan = "CLUSTER_PLAN" - ConfigVariableClusterName = "CLUSTER_NAME" - ConfigVariableClusterClass = "CLUSTER_CLASS" - ConfigVariableInfraProvider = "INFRASTRUCTURE_PROVIDER" - ConfigVariableTkrName = "KUBERNETES_RELEASE" - ConfigVariableKubernetesVersion = "KUBERNETES_VERSION" - ConfigVariableCNI = "CNI" - ConfigVariableEnableCEIPParticipation = "ENABLE_CEIP_PARTICIPATION" - ConfigVariableDeployTKGOnVsphere7 = "DEPLOY_TKG_ON_VSPHERE7" - ConfigVariableEnableTKGSonVsphere7 = "ENABLE_TKGS_ON_VSPHERE7" - ConfigVariableSize = "SIZE" - ConfigVariableControlPlaneSize = "CONTROLPLANE_SIZE" - ConfigVariableWorkerSize = "WORKER_SIZE" - - // Config variable for passwords and secrets - - ConfigVariableNsxtPassword = "NSXT_PASSWORD" - ConfigVariableAviPassword = "AVI_PASSWORD" - ConfigVariableLDAPBindPassword = "LDAP_BIND_PASSWORD" //nolint:gosec - ConfigVariableOIDCIdentiryProviderClientSecret = "OIDC_IDENTITY_PROVIDER_CLIENT_SECRET" //nolint:gosec - - // Config variables for image tags used for provider installation - ConfigVariableInternalKubeRBACProxyImageTag = "KUBE_RBAC_PROXY_IMAGE_TAG" - ConfigVariableInternalCABPKControllerImageTag = "CABPK_CONTROLLER_IMAGE_TAG" - ConfigVariableInternalCAPIControllerImageTag = "CAPI_CONTROLLER_IMAGE_TAG" - ConfigVariableInternalKCPControllerImageTag = "KCP_CONTROLLER_IMAGE_TAG" - ConfigVariableInternalCAPDManagerImageTag = "CAPD_CONTROLLER_IMAGE_TAG" - ConfigVariableInternalCAPAManagerImageTag = "CAPA_CONTROLLER_IMAGE_TAG" - ConfigVariableInternalCAPVManagerImageTag = "CAPV_CONTROLLER_IMAGE_TAG" - ConfigVariableInternalCAPZManagerImageTag = "CAPZ_CONTROLLER_IMAGE_TAG" - ConfigVariableInternalCAPOCIManagerImageTag = "CAPOCI_CONTROLLER_IMAGE_TAG" - ConfigVariableInternalCAPIIPAMProviderInClusterImageTag = "CAPI_IPAM_PROVIDER_IN_CLUSTER_IMAGE_TAG" - ConfigVariableInternalNMIImageTag = "NMI_IMAGE_TAG" - - // Other variables related to provider installation - ConfigVariableClusterTopology = "CLUSTER_TOPOLOGY" - ConfigVariableAllowLegacyCluster = "ALLOW_LEGACY_CLUSTER" - - ConfigVariablePackageInstallTimeout = "PACKAGE_INSTALL_TIMEOUT" - - // Windows specific variables - ConfigVariableIsWindowsWorkloadCluster = "IS_WINDOWS_WORKLOAD_CLUSTER" - - // AVI aka. NSX Advanced Load Balancer specific variables - ConfigVariableAviEnable = "AVI_ENABLE" - - ConfigVariableAviControllerAddress = "AVI_CONTROLLER" - ConfigVariableAviControllerVersion = "AVI_CONTROLLER_VERSION" - ConfigVariableAviControllerUsername = "AVI_USERNAME" - ConfigVariableAviControllerPassword = "AVI_PASSWORD" - ConfigVariableAviControllerCA = "AVI_CA_DATA_B64" - - ConfigVariableAviCloudName = "AVI_CLOUD_NAME" - ConfigVariableAviServiceEngineGroup = "AVI_SERVICE_ENGINE_GROUP" - ConfigVariableAviManagementClusterServiceEngineGroup = "AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP" - ConfigVariableAviLabels = "AVI_LABELS" - ConfigVariableAviNSXTT1Router = "AVI_NSXT_T1LR" - - ConfigVariableAviDataPlaneNetworkName = "AVI_DATA_NETWORK" - ConfigVariableAviDataPlaneNetworkCIDR = "AVI_DATA_NETWORK_CIDR" - ConfigVariableAviControlPlaneNetworkName = "AVI_CONTROL_PLANE_NETWORK" - ConfigVariableAviControlPlaneNetworkCIDR = "AVI_CONTROL_PLANE_NETWORK_CIDR" - ConfigVariableAviIngressNodeNetworkList = "AVI_INGRESS_NODE_NETWORK_LIST" - - ConfigVariableAviManagementClusterDataPlaneNetworkName = "AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME" - ConfigVariableAviManagementClusterDataPlaneNetworkCIDR = "AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR" - ConfigVariableAviManagementClusterControlPlaneVipNetworkName = "AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME" - ConfigVariableAviManagementClusterControlPlaneVipNetworkCIDR = "AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR" - - ConfigVariableKubevipLoadbalancerEnable = "KUBEVIP_LOADBALANCER_ENABLE" - ConfigVariableKubevipLoadbalancerCIDRs = "KUBEVIP_LOADBALANCER_CIDRS" - ConfigVariableKubevipLoadbalancerIPRanges = "KUBEVIP_LOADBALANCER_IP_RANGES" - ConfigVariableFeatureFlagPackageBasedCC = "FEATURE_FLAG_PACKAGE_BASED_CC" - - ConfigVariableCustomTDNFRepositoryCertificate = "CUSTOM_TDNF_REPOSITORY_CERTIFICATE" - - // Config variable for enabling tkgs routable pod feature - ConfigVariableEnableTKGSRoutablePod = "ENABLE_TKGS_ROUTABLE_POD" -) diff --git a/tkg/constants/defaults.go b/tkg/constants/defaults.go deleted file mode 100644 index 691a181944..0000000000 --- a/tkg/constants/defaults.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -import ( - "time" -) - -// default value constants -const ( - DefaultCNIType = "antrea" - - DefaultDevControlPlaneMachineCount = 1 - DefaultProdControlPlaneMachineCount = 3 - DefaultDevWorkerMachineCount = 1 - DefaultProdWorkerMachineCount = 3 - - DefaultOperationTimeout = 30 * time.Second - DefaultLongRunningOperationTimeout = 30 * time.Minute - - DefaultCertmanagerDeploymentTimeout = 40 * time.Minute - - DefaultNamespace = "default" - - // de-facto defaults initially chosen by kops: https://github.com/kubernetes/kops - DefaultIPv4ClusterCIDR = "100.96.0.0/11" - DefaultIPv4ServiceCIDR = "100.64.0.0/13" - - // chosen to match our IPv4 defaults - // use /48 for cluster CIDR because each node gets a /64 by default in IPv6 - DefaultIPv6ClusterCIDR = "fd00:100:96::/48" - // use /108 is the max allowed for IPv6 - DefaultIPv6ServiceCIDR = "fd00:100:64::/108" - - // dual stack IPv4,IPv6 defaults - DefaultDualStackPrimaryIPv4ClusterCIDR = DefaultIPv4ClusterCIDR + "," + DefaultIPv6ClusterCIDR - DefaultDualStackPrimaryIPv4ServiceCIDR = DefaultIPv4ServiceCIDR + "," + DefaultIPv6ServiceCIDR - - DefaultDualStackPrimaryIPv6ClusterCIDR = DefaultIPv6ClusterCIDR + "," + DefaultIPv4ClusterCIDR - DefaultDualStackPrimaryIPv6ServiceCIDR = DefaultIPv6ServiceCIDR + "," + DefaultIPv4ServiceCIDR - // DefaultIsWindowsWorkloadCluster is false, indicating that the normal thing to do is, is to make linux clusters. - DefaultIsWindowsWorkloadCluster = false - - // Default maximum query per second for the rest config - DefaultQPS = 200 - // Default maximum burst for throttle for the rest config - DefaultBurst = 200 - // Default ClusterClass version - DefaultClusterClassVersion = "v1.0.0" -) diff --git a/tkg/constants/env_variables.go b/tkg/constants/env_variables.go deleted file mode 100644 index d2ed2a8102..0000000000 --- a/tkg/constants/env_variables.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -// environment variables for http proxy -const ( - NoProxy = "NO_PROXY" - HTTPProxy = "HTTP_PROXY" - HTTPSProxy = "HTTPS_PROXY" - ProxyCACert = "PROXY_CA_CERT" -) - -// environment variables for internal development use -const ( - SuppressProvidersUpdate = "SUPPRESS_PROVIDERS_UPDATE" -) - -const ( - AllowedRegistries = "ALLOWED_REGISTRY" -) diff --git a/tkg/constants/featureflags.go b/tkg/constants/featureflags.go deleted file mode 100644 index 11fa1684af..0000000000 --- a/tkg/constants/featureflags.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -// This block is for global feature constants, to allow them to be used more broadly -const ( - - // DualStack feature flags determine whether it is permitted to create - // clusters with a dualstack TKG_IP_FAMILY. There are separate flags for - // each primary, "ipv4,ipv6" vs "ipv6,ipv4", and flags for management vs - // workload cluster plugins. - FeatureFlagManagementClusterDualStackIPv4Primary = "features.management-cluster.dual-stack-ipv4-primary" - FeatureFlagManagementClusterDualStackIPv6Primary = "features.management-cluster.dual-stack-ipv6-primary" - FeatureFlagClusterDualStackIPv4Primary = "features.cluster.dual-stack-ipv4-primary" - FeatureFlagClusterDualStackIPv6Primary = "features.cluster.dual-stack-ipv6-primary" - // Custom Nameserver feature flags determine whether it is permitted to - // provide the CONTROL_PLANE_NODE_NAMESERVERS and WORKER_NODE_NAMESERVERS - // when creating a cluster. - FeatureFlagManagementClusterCustomNameservers = "features.management-cluster.custom-nameservers" - FeatureFlagClusterCustomNameservers = "features.cluster.custom-nameservers" - // AWS Instance Types Exclude ARM feature flags determine whether instance types with processor architecture - // support of ARM should be included when discovering available AWS instance types. Setting feature flag to true - // filters out ARM supporting instance types; false allows ARM instance types to be included in results. - FeatureFlagAwsInstanceTypesExcludeArm = "features.management-cluster.aws-instance-types-exclude-arm" - // PackageBasedCC feature flag determines whether to use package based lifecycle management of management component - // or legacy way of managing management components. This is also used for clusterclass based management cluster provisioning - FeatureFlagPackageBasedCC = "features.management-cluster.package-based-cc" - // FeatureFlagAutoApplyGeneratedClusterClassBasedConfiguration feature flag determines whether to auto-apply the generated ClusterClass - // based configuration after converting legacy configration to ClusterClass based config or not - // Note: This is a hidden feature-flag that doesn't get persisted to config.yaml by default - FeatureFlagAutoApplyGeneratedClusterClassBasedConfiguration = "features.cluster.auto-apply-generated-clusterclass-based-configuration" - // FeatureFlagForceDeployClusterWithClusterClass if this feature flag is set CLI will try to deploy ClusterClass - // based cluster even if user has done any customization to the provider templates - // Note: This is a hidden feature-flag that doesn't get persisted to config.yaml by default - FeatureFlagForceDeployClusterWithClusterClass = "features.cluster.force-deploy-cluster-with-clusterclass" - // FeatureFlagSingleNodeClusters is to enable Single Node Cluster deployment via tanzu CLI. - // Setting the feature flag to true will allow the creation of Single Node Clusters. - FeatureFlagSingleNodeClusters = "features.cluster.single-node-clusters" - // FeatureFlagManagementClusterDeployInClusterIPAMProvider feature flag - // determines whether to apply the In-Cluster IPAM provider to the - // management cluster. - FeatureFlagManagementClusterDeployInClusterIPAMProvider = "features.management-cluster.deploy-in-cluster-ipam-provider" - // FeatureFlagAllowLegacyCluster is used to decide the workload cluster is clusterclass based or legayc based. - // By default, it's false. If it's true, then workload cluster is legacy based. - FeatureFlagAllowLegacyCluster = "features.cluster.allow-legacy-cluster" -) diff --git a/tkg/constants/files.go b/tkg/constants/files.go deleted file mode 100644 index 22888d6883..0000000000 --- a/tkg/constants/files.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -// ConfigFilePermissions defines the permissions of the config file -const ( - ConfigFilePermissions = 0o600 - DefaultDirectoryPermissions = 0o700 -) - -// File name related constants -const ( - LocalProvidersFolderName = "providers" - LocalProvidersZipFileName = "providers.zip" - LocalTanzuFileLock = ".tanzu.lock" - - LocalProvidersConfigFileName = "config.yaml" - LocalBOMsFolderName = "bom" - LocalCompatibilityFolderName = "compatibility" - - LocalProvidersChecksumFileName = "providers.sha256sum" - OverrideFolder = "overrides" - - TKGKubeconfigDir = ".kube-tkg" - TKGKubeconfigFile = "config" - TKGKubeconfigTmpDir = "tmp" - - TKGConfigFileName = "config.yaml" - TKGDefaultClusterConfigFileName = "cluster-config.yaml" - TKGCompatibilityFileName = "tkg-compatibility.yaml" - TKGConfigDefaultFileName = "config_default.yaml" - - TKGClusterConfigFileDirForUI = "clusterconfigs" - TKGRegistryCertFile = "registry_certs" - TKGRegistryTrustedRootCAFileForWindows = ".registry_trusted_root_certs_win" - - LogFolderName = "logs" - - TKGPackageValuesFile = "tkgpackagevalues.yaml" -) diff --git a/tkg/constants/messages.go b/tkg/constants/messages.go deleted file mode 100644 index 7e868379d1..0000000000 --- a/tkg/constants/messages.go +++ /dev/null @@ -1,6 +0,0 @@ -package constants - -// messages for log, warning and error -const ( - YTTBasedClusterWarning = "Warning: Use of ytt based cluster templates will be deprecated in favor of ClusterClass templates in a future version of TKG. Please work to move your workloads to a ClusterClass enabled cluster." -) diff --git a/tkg/constants/registry.go b/tkg/constants/registry.go deleted file mode 100644 index 55e2f109f0..0000000000 --- a/tkg/constants/registry.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package constants - -// registry related constants -const ( - TKGRegistryContains = "registry.vmware.com/tkg" -) diff --git a/tkg/docker/utils.go b/tkg/docker/utils.go deleted file mode 100644 index 3f99af1988..0000000000 --- a/tkg/docker/utils.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package docker ... -package docker - -import ( - "context" - - "github.com/docker/docker/client" - "github.com/pkg/errors" -) - -// VerifyImageIsAccessible verifies the docker image is accessible -func VerifyImageIsAccessible(image string) error { - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - return errors.Wrap(err, "unable to create docker client") - } - - _, err = cli.DistributionInspect(context.Background(), image, "") - if err != nil { - return errors.Wrap(err, "DistributionInspect error") - } - return nil -} diff --git a/tkg/fakes/awsclient.go b/tkg/fakes/awsclient.go deleted file mode 100644 index 38ad799713..0000000000 --- a/tkg/fakes/awsclient.go +++ /dev/null @@ -1,910 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/cloudformation/bootstrap" - - "github.com/vmware-tanzu/tanzu-framework/tkg/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -type AWSClient struct { - CreateCloudFormationStackStub func() error - createCloudFormationStackMutex sync.RWMutex - createCloudFormationStackArgsForCall []struct { - } - createCloudFormationStackReturns struct { - result1 error - } - createCloudFormationStackReturnsOnCall map[int]struct { - result1 error - } - CreateCloudFormationStackWithTemplateStub func(*bootstrap.Template) error - createCloudFormationStackWithTemplateMutex sync.RWMutex - createCloudFormationStackWithTemplateArgsForCall []struct { - arg1 *bootstrap.Template - } - createCloudFormationStackWithTemplateReturns struct { - result1 error - } - createCloudFormationStackWithTemplateReturnsOnCall map[int]struct { - result1 error - } - EncodeCredentialsStub func() (string, error) - encodeCredentialsMutex sync.RWMutex - encodeCredentialsArgsForCall []struct { - } - encodeCredentialsReturns struct { - result1 string - result2 error - } - encodeCredentialsReturnsOnCall map[int]struct { - result1 string - result2 error - } - GenerateBootstrapTemplateStub func(aws.GenerateBootstrapTemplateInput) (*bootstrap.Template, error) - generateBootstrapTemplateMutex sync.RWMutex - generateBootstrapTemplateArgsForCall []struct { - arg1 aws.GenerateBootstrapTemplateInput - } - generateBootstrapTemplateReturns struct { - result1 *bootstrap.Template - result2 error - } - generateBootstrapTemplateReturnsOnCall map[int]struct { - result1 *bootstrap.Template - result2 error - } - GetSubnetGatewayAssociationsStub func(string) (map[string]bool, error) - getSubnetGatewayAssociationsMutex sync.RWMutex - getSubnetGatewayAssociationsArgsForCall []struct { - arg1 string - } - getSubnetGatewayAssociationsReturns struct { - result1 map[string]bool - result2 error - } - getSubnetGatewayAssociationsReturnsOnCall map[int]struct { - result1 map[string]bool - result2 error - } - ListAvailabilityZonesStub func() ([]*models.AWSAvailabilityZone, error) - listAvailabilityZonesMutex sync.RWMutex - listAvailabilityZonesArgsForCall []struct { - } - listAvailabilityZonesReturns struct { - result1 []*models.AWSAvailabilityZone - result2 error - } - listAvailabilityZonesReturnsOnCall map[int]struct { - result1 []*models.AWSAvailabilityZone - result2 error - } - ListCloudFormationStacksStub func() ([]string, error) - listCloudFormationStacksMutex sync.RWMutex - listCloudFormationStacksArgsForCall []struct { - } - listCloudFormationStacksReturns struct { - result1 []string - result2 error - } - listCloudFormationStacksReturnsOnCall map[int]struct { - result1 []string - result2 error - } - ListInstanceTypesStub func(string) ([]string, error) - listInstanceTypesMutex sync.RWMutex - listInstanceTypesArgsForCall []struct { - arg1 string - } - listInstanceTypesReturns struct { - result1 []string - result2 error - } - listInstanceTypesReturnsOnCall map[int]struct { - result1 []string - result2 error - } - ListRegionsByUserStub func() ([]string, error) - listRegionsByUserMutex sync.RWMutex - listRegionsByUserArgsForCall []struct { - } - listRegionsByUserReturns struct { - result1 []string - result2 error - } - listRegionsByUserReturnsOnCall map[int]struct { - result1 []string - result2 error - } - ListSubnetsStub func(string) ([]*models.AWSSubnet, error) - listSubnetsMutex sync.RWMutex - listSubnetsArgsForCall []struct { - arg1 string - } - listSubnetsReturns struct { - result1 []*models.AWSSubnet - result2 error - } - listSubnetsReturnsOnCall map[int]struct { - result1 []*models.AWSSubnet - result2 error - } - ListVPCsStub func() ([]*models.Vpc, error) - listVPCsMutex sync.RWMutex - listVPCsArgsForCall []struct { - } - listVPCsReturns struct { - result1 []*models.Vpc - result2 error - } - listVPCsReturnsOnCall map[int]struct { - result1 []*models.Vpc - result2 error - } - VerifyAccountStub func() error - verifyAccountMutex sync.RWMutex - verifyAccountArgsForCall []struct { - } - verifyAccountReturns struct { - result1 error - } - verifyAccountReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *AWSClient) CreateCloudFormationStack() error { - fake.createCloudFormationStackMutex.Lock() - ret, specificReturn := fake.createCloudFormationStackReturnsOnCall[len(fake.createCloudFormationStackArgsForCall)] - fake.createCloudFormationStackArgsForCall = append(fake.createCloudFormationStackArgsForCall, struct { - }{}) - stub := fake.CreateCloudFormationStackStub - fakeReturns := fake.createCloudFormationStackReturns - fake.recordInvocation("CreateCloudFormationStack", []interface{}{}) - fake.createCloudFormationStackMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *AWSClient) CreateCloudFormationStackCallCount() int { - fake.createCloudFormationStackMutex.RLock() - defer fake.createCloudFormationStackMutex.RUnlock() - return len(fake.createCloudFormationStackArgsForCall) -} - -func (fake *AWSClient) CreateCloudFormationStackCalls(stub func() error) { - fake.createCloudFormationStackMutex.Lock() - defer fake.createCloudFormationStackMutex.Unlock() - fake.CreateCloudFormationStackStub = stub -} - -func (fake *AWSClient) CreateCloudFormationStackReturns(result1 error) { - fake.createCloudFormationStackMutex.Lock() - defer fake.createCloudFormationStackMutex.Unlock() - fake.CreateCloudFormationStackStub = nil - fake.createCloudFormationStackReturns = struct { - result1 error - }{result1} -} - -func (fake *AWSClient) CreateCloudFormationStackReturnsOnCall(i int, result1 error) { - fake.createCloudFormationStackMutex.Lock() - defer fake.createCloudFormationStackMutex.Unlock() - fake.CreateCloudFormationStackStub = nil - if fake.createCloudFormationStackReturnsOnCall == nil { - fake.createCloudFormationStackReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.createCloudFormationStackReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *AWSClient) CreateCloudFormationStackWithTemplate(arg1 *bootstrap.Template) error { - fake.createCloudFormationStackWithTemplateMutex.Lock() - ret, specificReturn := fake.createCloudFormationStackWithTemplateReturnsOnCall[len(fake.createCloudFormationStackWithTemplateArgsForCall)] - fake.createCloudFormationStackWithTemplateArgsForCall = append(fake.createCloudFormationStackWithTemplateArgsForCall, struct { - arg1 *bootstrap.Template - }{arg1}) - stub := fake.CreateCloudFormationStackWithTemplateStub - fakeReturns := fake.createCloudFormationStackWithTemplateReturns - fake.recordInvocation("CreateCloudFormationStackWithTemplate", []interface{}{arg1}) - fake.createCloudFormationStackWithTemplateMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *AWSClient) CreateCloudFormationStackWithTemplateCallCount() int { - fake.createCloudFormationStackWithTemplateMutex.RLock() - defer fake.createCloudFormationStackWithTemplateMutex.RUnlock() - return len(fake.createCloudFormationStackWithTemplateArgsForCall) -} - -func (fake *AWSClient) CreateCloudFormationStackWithTemplateCalls(stub func(*bootstrap.Template) error) { - fake.createCloudFormationStackWithTemplateMutex.Lock() - defer fake.createCloudFormationStackWithTemplateMutex.Unlock() - fake.CreateCloudFormationStackWithTemplateStub = stub -} - -func (fake *AWSClient) CreateCloudFormationStackWithTemplateArgsForCall(i int) *bootstrap.Template { - fake.createCloudFormationStackWithTemplateMutex.RLock() - defer fake.createCloudFormationStackWithTemplateMutex.RUnlock() - argsForCall := fake.createCloudFormationStackWithTemplateArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *AWSClient) CreateCloudFormationStackWithTemplateReturns(result1 error) { - fake.createCloudFormationStackWithTemplateMutex.Lock() - defer fake.createCloudFormationStackWithTemplateMutex.Unlock() - fake.CreateCloudFormationStackWithTemplateStub = nil - fake.createCloudFormationStackWithTemplateReturns = struct { - result1 error - }{result1} -} - -func (fake *AWSClient) CreateCloudFormationStackWithTemplateReturnsOnCall(i int, result1 error) { - fake.createCloudFormationStackWithTemplateMutex.Lock() - defer fake.createCloudFormationStackWithTemplateMutex.Unlock() - fake.CreateCloudFormationStackWithTemplateStub = nil - if fake.createCloudFormationStackWithTemplateReturnsOnCall == nil { - fake.createCloudFormationStackWithTemplateReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.createCloudFormationStackWithTemplateReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *AWSClient) EncodeCredentials() (string, error) { - fake.encodeCredentialsMutex.Lock() - ret, specificReturn := fake.encodeCredentialsReturnsOnCall[len(fake.encodeCredentialsArgsForCall)] - fake.encodeCredentialsArgsForCall = append(fake.encodeCredentialsArgsForCall, struct { - }{}) - stub := fake.EncodeCredentialsStub - fakeReturns := fake.encodeCredentialsReturns - fake.recordInvocation("EncodeCredentials", []interface{}{}) - fake.encodeCredentialsMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *AWSClient) EncodeCredentialsCallCount() int { - fake.encodeCredentialsMutex.RLock() - defer fake.encodeCredentialsMutex.RUnlock() - return len(fake.encodeCredentialsArgsForCall) -} - -func (fake *AWSClient) EncodeCredentialsCalls(stub func() (string, error)) { - fake.encodeCredentialsMutex.Lock() - defer fake.encodeCredentialsMutex.Unlock() - fake.EncodeCredentialsStub = stub -} - -func (fake *AWSClient) EncodeCredentialsReturns(result1 string, result2 error) { - fake.encodeCredentialsMutex.Lock() - defer fake.encodeCredentialsMutex.Unlock() - fake.EncodeCredentialsStub = nil - fake.encodeCredentialsReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *AWSClient) EncodeCredentialsReturnsOnCall(i int, result1 string, result2 error) { - fake.encodeCredentialsMutex.Lock() - defer fake.encodeCredentialsMutex.Unlock() - fake.EncodeCredentialsStub = nil - if fake.encodeCredentialsReturnsOnCall == nil { - fake.encodeCredentialsReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.encodeCredentialsReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *AWSClient) GenerateBootstrapTemplate(arg1 aws.GenerateBootstrapTemplateInput) (*bootstrap.Template, error) { - fake.generateBootstrapTemplateMutex.Lock() - ret, specificReturn := fake.generateBootstrapTemplateReturnsOnCall[len(fake.generateBootstrapTemplateArgsForCall)] - fake.generateBootstrapTemplateArgsForCall = append(fake.generateBootstrapTemplateArgsForCall, struct { - arg1 aws.GenerateBootstrapTemplateInput - }{arg1}) - stub := fake.GenerateBootstrapTemplateStub - fakeReturns := fake.generateBootstrapTemplateReturns - fake.recordInvocation("GenerateBootstrapTemplate", []interface{}{arg1}) - fake.generateBootstrapTemplateMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *AWSClient) GenerateBootstrapTemplateCallCount() int { - fake.generateBootstrapTemplateMutex.RLock() - defer fake.generateBootstrapTemplateMutex.RUnlock() - return len(fake.generateBootstrapTemplateArgsForCall) -} - -func (fake *AWSClient) GenerateBootstrapTemplateCalls(stub func(aws.GenerateBootstrapTemplateInput) (*bootstrap.Template, error)) { - fake.generateBootstrapTemplateMutex.Lock() - defer fake.generateBootstrapTemplateMutex.Unlock() - fake.GenerateBootstrapTemplateStub = stub -} - -func (fake *AWSClient) GenerateBootstrapTemplateArgsForCall(i int) aws.GenerateBootstrapTemplateInput { - fake.generateBootstrapTemplateMutex.RLock() - defer fake.generateBootstrapTemplateMutex.RUnlock() - argsForCall := fake.generateBootstrapTemplateArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *AWSClient) GenerateBootstrapTemplateReturns(result1 *bootstrap.Template, result2 error) { - fake.generateBootstrapTemplateMutex.Lock() - defer fake.generateBootstrapTemplateMutex.Unlock() - fake.GenerateBootstrapTemplateStub = nil - fake.generateBootstrapTemplateReturns = struct { - result1 *bootstrap.Template - result2 error - }{result1, result2} -} - -func (fake *AWSClient) GenerateBootstrapTemplateReturnsOnCall(i int, result1 *bootstrap.Template, result2 error) { - fake.generateBootstrapTemplateMutex.Lock() - defer fake.generateBootstrapTemplateMutex.Unlock() - fake.GenerateBootstrapTemplateStub = nil - if fake.generateBootstrapTemplateReturnsOnCall == nil { - fake.generateBootstrapTemplateReturnsOnCall = make(map[int]struct { - result1 *bootstrap.Template - result2 error - }) - } - fake.generateBootstrapTemplateReturnsOnCall[i] = struct { - result1 *bootstrap.Template - result2 error - }{result1, result2} -} - -func (fake *AWSClient) GetSubnetGatewayAssociations(arg1 string) (map[string]bool, error) { - fake.getSubnetGatewayAssociationsMutex.Lock() - ret, specificReturn := fake.getSubnetGatewayAssociationsReturnsOnCall[len(fake.getSubnetGatewayAssociationsArgsForCall)] - fake.getSubnetGatewayAssociationsArgsForCall = append(fake.getSubnetGatewayAssociationsArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetSubnetGatewayAssociationsStub - fakeReturns := fake.getSubnetGatewayAssociationsReturns - fake.recordInvocation("GetSubnetGatewayAssociations", []interface{}{arg1}) - fake.getSubnetGatewayAssociationsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *AWSClient) GetSubnetGatewayAssociationsCallCount() int { - fake.getSubnetGatewayAssociationsMutex.RLock() - defer fake.getSubnetGatewayAssociationsMutex.RUnlock() - return len(fake.getSubnetGatewayAssociationsArgsForCall) -} - -func (fake *AWSClient) GetSubnetGatewayAssociationsCalls(stub func(string) (map[string]bool, error)) { - fake.getSubnetGatewayAssociationsMutex.Lock() - defer fake.getSubnetGatewayAssociationsMutex.Unlock() - fake.GetSubnetGatewayAssociationsStub = stub -} - -func (fake *AWSClient) GetSubnetGatewayAssociationsArgsForCall(i int) string { - fake.getSubnetGatewayAssociationsMutex.RLock() - defer fake.getSubnetGatewayAssociationsMutex.RUnlock() - argsForCall := fake.getSubnetGatewayAssociationsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *AWSClient) GetSubnetGatewayAssociationsReturns(result1 map[string]bool, result2 error) { - fake.getSubnetGatewayAssociationsMutex.Lock() - defer fake.getSubnetGatewayAssociationsMutex.Unlock() - fake.GetSubnetGatewayAssociationsStub = nil - fake.getSubnetGatewayAssociationsReturns = struct { - result1 map[string]bool - result2 error - }{result1, result2} -} - -func (fake *AWSClient) GetSubnetGatewayAssociationsReturnsOnCall(i int, result1 map[string]bool, result2 error) { - fake.getSubnetGatewayAssociationsMutex.Lock() - defer fake.getSubnetGatewayAssociationsMutex.Unlock() - fake.GetSubnetGatewayAssociationsStub = nil - if fake.getSubnetGatewayAssociationsReturnsOnCall == nil { - fake.getSubnetGatewayAssociationsReturnsOnCall = make(map[int]struct { - result1 map[string]bool - result2 error - }) - } - fake.getSubnetGatewayAssociationsReturnsOnCall[i] = struct { - result1 map[string]bool - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListAvailabilityZones() ([]*models.AWSAvailabilityZone, error) { - fake.listAvailabilityZonesMutex.Lock() - ret, specificReturn := fake.listAvailabilityZonesReturnsOnCall[len(fake.listAvailabilityZonesArgsForCall)] - fake.listAvailabilityZonesArgsForCall = append(fake.listAvailabilityZonesArgsForCall, struct { - }{}) - stub := fake.ListAvailabilityZonesStub - fakeReturns := fake.listAvailabilityZonesReturns - fake.recordInvocation("ListAvailabilityZones", []interface{}{}) - fake.listAvailabilityZonesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *AWSClient) ListAvailabilityZonesCallCount() int { - fake.listAvailabilityZonesMutex.RLock() - defer fake.listAvailabilityZonesMutex.RUnlock() - return len(fake.listAvailabilityZonesArgsForCall) -} - -func (fake *AWSClient) ListAvailabilityZonesCalls(stub func() ([]*models.AWSAvailabilityZone, error)) { - fake.listAvailabilityZonesMutex.Lock() - defer fake.listAvailabilityZonesMutex.Unlock() - fake.ListAvailabilityZonesStub = stub -} - -func (fake *AWSClient) ListAvailabilityZonesReturns(result1 []*models.AWSAvailabilityZone, result2 error) { - fake.listAvailabilityZonesMutex.Lock() - defer fake.listAvailabilityZonesMutex.Unlock() - fake.ListAvailabilityZonesStub = nil - fake.listAvailabilityZonesReturns = struct { - result1 []*models.AWSAvailabilityZone - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListAvailabilityZonesReturnsOnCall(i int, result1 []*models.AWSAvailabilityZone, result2 error) { - fake.listAvailabilityZonesMutex.Lock() - defer fake.listAvailabilityZonesMutex.Unlock() - fake.ListAvailabilityZonesStub = nil - if fake.listAvailabilityZonesReturnsOnCall == nil { - fake.listAvailabilityZonesReturnsOnCall = make(map[int]struct { - result1 []*models.AWSAvailabilityZone - result2 error - }) - } - fake.listAvailabilityZonesReturnsOnCall[i] = struct { - result1 []*models.AWSAvailabilityZone - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListCloudFormationStacks() ([]string, error) { - fake.listCloudFormationStacksMutex.Lock() - ret, specificReturn := fake.listCloudFormationStacksReturnsOnCall[len(fake.listCloudFormationStacksArgsForCall)] - fake.listCloudFormationStacksArgsForCall = append(fake.listCloudFormationStacksArgsForCall, struct { - }{}) - stub := fake.ListCloudFormationStacksStub - fakeReturns := fake.listCloudFormationStacksReturns - fake.recordInvocation("ListCloudFormationStacks", []interface{}{}) - fake.listCloudFormationStacksMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *AWSClient) ListCloudFormationStacksCallCount() int { - fake.listCloudFormationStacksMutex.RLock() - defer fake.listCloudFormationStacksMutex.RUnlock() - return len(fake.listCloudFormationStacksArgsForCall) -} - -func (fake *AWSClient) ListCloudFormationStacksCalls(stub func() ([]string, error)) { - fake.listCloudFormationStacksMutex.Lock() - defer fake.listCloudFormationStacksMutex.Unlock() - fake.ListCloudFormationStacksStub = stub -} - -func (fake *AWSClient) ListCloudFormationStacksReturns(result1 []string, result2 error) { - fake.listCloudFormationStacksMutex.Lock() - defer fake.listCloudFormationStacksMutex.Unlock() - fake.ListCloudFormationStacksStub = nil - fake.listCloudFormationStacksReturns = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListCloudFormationStacksReturnsOnCall(i int, result1 []string, result2 error) { - fake.listCloudFormationStacksMutex.Lock() - defer fake.listCloudFormationStacksMutex.Unlock() - fake.ListCloudFormationStacksStub = nil - if fake.listCloudFormationStacksReturnsOnCall == nil { - fake.listCloudFormationStacksReturnsOnCall = make(map[int]struct { - result1 []string - result2 error - }) - } - fake.listCloudFormationStacksReturnsOnCall[i] = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListInstanceTypes(arg1 string) ([]string, error) { - fake.listInstanceTypesMutex.Lock() - ret, specificReturn := fake.listInstanceTypesReturnsOnCall[len(fake.listInstanceTypesArgsForCall)] - fake.listInstanceTypesArgsForCall = append(fake.listInstanceTypesArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ListInstanceTypesStub - fakeReturns := fake.listInstanceTypesReturns - fake.recordInvocation("ListInstanceTypes", []interface{}{arg1}) - fake.listInstanceTypesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *AWSClient) ListInstanceTypesCallCount() int { - fake.listInstanceTypesMutex.RLock() - defer fake.listInstanceTypesMutex.RUnlock() - return len(fake.listInstanceTypesArgsForCall) -} - -func (fake *AWSClient) ListInstanceTypesCalls(stub func(string) ([]string, error)) { - fake.listInstanceTypesMutex.Lock() - defer fake.listInstanceTypesMutex.Unlock() - fake.ListInstanceTypesStub = stub -} - -func (fake *AWSClient) ListInstanceTypesArgsForCall(i int) string { - fake.listInstanceTypesMutex.RLock() - defer fake.listInstanceTypesMutex.RUnlock() - argsForCall := fake.listInstanceTypesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *AWSClient) ListInstanceTypesReturns(result1 []string, result2 error) { - fake.listInstanceTypesMutex.Lock() - defer fake.listInstanceTypesMutex.Unlock() - fake.ListInstanceTypesStub = nil - fake.listInstanceTypesReturns = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListInstanceTypesReturnsOnCall(i int, result1 []string, result2 error) { - fake.listInstanceTypesMutex.Lock() - defer fake.listInstanceTypesMutex.Unlock() - fake.ListInstanceTypesStub = nil - if fake.listInstanceTypesReturnsOnCall == nil { - fake.listInstanceTypesReturnsOnCall = make(map[int]struct { - result1 []string - result2 error - }) - } - fake.listInstanceTypesReturnsOnCall[i] = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListRegionsByUser() ([]string, error) { - fake.listRegionsByUserMutex.Lock() - ret, specificReturn := fake.listRegionsByUserReturnsOnCall[len(fake.listRegionsByUserArgsForCall)] - fake.listRegionsByUserArgsForCall = append(fake.listRegionsByUserArgsForCall, struct { - }{}) - stub := fake.ListRegionsByUserStub - fakeReturns := fake.listRegionsByUserReturns - fake.recordInvocation("ListRegionsByUser", []interface{}{}) - fake.listRegionsByUserMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *AWSClient) ListRegionsByUserCallCount() int { - fake.listRegionsByUserMutex.RLock() - defer fake.listRegionsByUserMutex.RUnlock() - return len(fake.listRegionsByUserArgsForCall) -} - -func (fake *AWSClient) ListRegionsByUserCalls(stub func() ([]string, error)) { - fake.listRegionsByUserMutex.Lock() - defer fake.listRegionsByUserMutex.Unlock() - fake.ListRegionsByUserStub = stub -} - -func (fake *AWSClient) ListRegionsByUserReturns(result1 []string, result2 error) { - fake.listRegionsByUserMutex.Lock() - defer fake.listRegionsByUserMutex.Unlock() - fake.ListRegionsByUserStub = nil - fake.listRegionsByUserReturns = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListRegionsByUserReturnsOnCall(i int, result1 []string, result2 error) { - fake.listRegionsByUserMutex.Lock() - defer fake.listRegionsByUserMutex.Unlock() - fake.ListRegionsByUserStub = nil - if fake.listRegionsByUserReturnsOnCall == nil { - fake.listRegionsByUserReturnsOnCall = make(map[int]struct { - result1 []string - result2 error - }) - } - fake.listRegionsByUserReturnsOnCall[i] = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListSubnets(arg1 string) ([]*models.AWSSubnet, error) { - fake.listSubnetsMutex.Lock() - ret, specificReturn := fake.listSubnetsReturnsOnCall[len(fake.listSubnetsArgsForCall)] - fake.listSubnetsArgsForCall = append(fake.listSubnetsArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ListSubnetsStub - fakeReturns := fake.listSubnetsReturns - fake.recordInvocation("ListSubnets", []interface{}{arg1}) - fake.listSubnetsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *AWSClient) ListSubnetsCallCount() int { - fake.listSubnetsMutex.RLock() - defer fake.listSubnetsMutex.RUnlock() - return len(fake.listSubnetsArgsForCall) -} - -func (fake *AWSClient) ListSubnetsCalls(stub func(string) ([]*models.AWSSubnet, error)) { - fake.listSubnetsMutex.Lock() - defer fake.listSubnetsMutex.Unlock() - fake.ListSubnetsStub = stub -} - -func (fake *AWSClient) ListSubnetsArgsForCall(i int) string { - fake.listSubnetsMutex.RLock() - defer fake.listSubnetsMutex.RUnlock() - argsForCall := fake.listSubnetsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *AWSClient) ListSubnetsReturns(result1 []*models.AWSSubnet, result2 error) { - fake.listSubnetsMutex.Lock() - defer fake.listSubnetsMutex.Unlock() - fake.ListSubnetsStub = nil - fake.listSubnetsReturns = struct { - result1 []*models.AWSSubnet - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListSubnetsReturnsOnCall(i int, result1 []*models.AWSSubnet, result2 error) { - fake.listSubnetsMutex.Lock() - defer fake.listSubnetsMutex.Unlock() - fake.ListSubnetsStub = nil - if fake.listSubnetsReturnsOnCall == nil { - fake.listSubnetsReturnsOnCall = make(map[int]struct { - result1 []*models.AWSSubnet - result2 error - }) - } - fake.listSubnetsReturnsOnCall[i] = struct { - result1 []*models.AWSSubnet - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListVPCs() ([]*models.Vpc, error) { - fake.listVPCsMutex.Lock() - ret, specificReturn := fake.listVPCsReturnsOnCall[len(fake.listVPCsArgsForCall)] - fake.listVPCsArgsForCall = append(fake.listVPCsArgsForCall, struct { - }{}) - stub := fake.ListVPCsStub - fakeReturns := fake.listVPCsReturns - fake.recordInvocation("ListVPCs", []interface{}{}) - fake.listVPCsMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *AWSClient) ListVPCsCallCount() int { - fake.listVPCsMutex.RLock() - defer fake.listVPCsMutex.RUnlock() - return len(fake.listVPCsArgsForCall) -} - -func (fake *AWSClient) ListVPCsCalls(stub func() ([]*models.Vpc, error)) { - fake.listVPCsMutex.Lock() - defer fake.listVPCsMutex.Unlock() - fake.ListVPCsStub = stub -} - -func (fake *AWSClient) ListVPCsReturns(result1 []*models.Vpc, result2 error) { - fake.listVPCsMutex.Lock() - defer fake.listVPCsMutex.Unlock() - fake.ListVPCsStub = nil - fake.listVPCsReturns = struct { - result1 []*models.Vpc - result2 error - }{result1, result2} -} - -func (fake *AWSClient) ListVPCsReturnsOnCall(i int, result1 []*models.Vpc, result2 error) { - fake.listVPCsMutex.Lock() - defer fake.listVPCsMutex.Unlock() - fake.ListVPCsStub = nil - if fake.listVPCsReturnsOnCall == nil { - fake.listVPCsReturnsOnCall = make(map[int]struct { - result1 []*models.Vpc - result2 error - }) - } - fake.listVPCsReturnsOnCall[i] = struct { - result1 []*models.Vpc - result2 error - }{result1, result2} -} - -func (fake *AWSClient) VerifyAccount() error { - fake.verifyAccountMutex.Lock() - ret, specificReturn := fake.verifyAccountReturnsOnCall[len(fake.verifyAccountArgsForCall)] - fake.verifyAccountArgsForCall = append(fake.verifyAccountArgsForCall, struct { - }{}) - stub := fake.VerifyAccountStub - fakeReturns := fake.verifyAccountReturns - fake.recordInvocation("VerifyAccount", []interface{}{}) - fake.verifyAccountMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *AWSClient) VerifyAccountCallCount() int { - fake.verifyAccountMutex.RLock() - defer fake.verifyAccountMutex.RUnlock() - return len(fake.verifyAccountArgsForCall) -} - -func (fake *AWSClient) VerifyAccountCalls(stub func() error) { - fake.verifyAccountMutex.Lock() - defer fake.verifyAccountMutex.Unlock() - fake.VerifyAccountStub = stub -} - -func (fake *AWSClient) VerifyAccountReturns(result1 error) { - fake.verifyAccountMutex.Lock() - defer fake.verifyAccountMutex.Unlock() - fake.VerifyAccountStub = nil - fake.verifyAccountReturns = struct { - result1 error - }{result1} -} - -func (fake *AWSClient) VerifyAccountReturnsOnCall(i int, result1 error) { - fake.verifyAccountMutex.Lock() - defer fake.verifyAccountMutex.Unlock() - fake.VerifyAccountStub = nil - if fake.verifyAccountReturnsOnCall == nil { - fake.verifyAccountReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.verifyAccountReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *AWSClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.createCloudFormationStackMutex.RLock() - defer fake.createCloudFormationStackMutex.RUnlock() - fake.createCloudFormationStackWithTemplateMutex.RLock() - defer fake.createCloudFormationStackWithTemplateMutex.RUnlock() - fake.encodeCredentialsMutex.RLock() - defer fake.encodeCredentialsMutex.RUnlock() - fake.generateBootstrapTemplateMutex.RLock() - defer fake.generateBootstrapTemplateMutex.RUnlock() - fake.getSubnetGatewayAssociationsMutex.RLock() - defer fake.getSubnetGatewayAssociationsMutex.RUnlock() - fake.listAvailabilityZonesMutex.RLock() - defer fake.listAvailabilityZonesMutex.RUnlock() - fake.listCloudFormationStacksMutex.RLock() - defer fake.listCloudFormationStacksMutex.RUnlock() - fake.listInstanceTypesMutex.RLock() - defer fake.listInstanceTypesMutex.RUnlock() - fake.listRegionsByUserMutex.RLock() - defer fake.listRegionsByUserMutex.RUnlock() - fake.listSubnetsMutex.RLock() - defer fake.listSubnetsMutex.RUnlock() - fake.listVPCsMutex.RLock() - defer fake.listVPCsMutex.RUnlock() - fake.verifyAccountMutex.RLock() - defer fake.verifyAccountMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *AWSClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ aws.Client = new(AWSClient) diff --git a/tkg/fakes/client.go b/tkg/fakes/client.go deleted file mode 100644 index a03c44f390..0000000000 --- a/tkg/fakes/client.go +++ /dev/null @@ -1,3821 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - "time" - - v1alpha3a "sigs.k8s.io/cluster-api/api/v1alpha3" - "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - "sigs.k8s.io/cluster-api/cmd/clusterctl/client/tree" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -type Client struct { - ActivateTanzuKubernetesReleasesStub func(string) error - activateTanzuKubernetesReleasesMutex sync.RWMutex - activateTanzuKubernetesReleasesArgsForCall []struct { - arg1 string - } - activateTanzuKubernetesReleasesReturns struct { - result1 error - } - activateTanzuKubernetesReleasesReturnsOnCall map[int]struct { - result1 error - } - AddRegionContextStub func(region.RegionContext, bool, bool) error - addRegionContextMutex sync.RWMutex - addRegionContextArgsForCall []struct { - arg1 region.RegionContext - arg2 bool - arg3 bool - } - addRegionContextReturns struct { - result1 error - } - addRegionContextReturnsOnCall map[int]struct { - result1 error - } - ConfigureAndValidateManagementClusterConfigurationStub func(*client.InitRegionOptions, bool) *client.ValidationError - configureAndValidateManagementClusterConfigurationMutex sync.RWMutex - configureAndValidateManagementClusterConfigurationArgsForCall []struct { - arg1 *client.InitRegionOptions - arg2 bool - } - configureAndValidateManagementClusterConfigurationReturns struct { - result1 *client.ValidationError - } - configureAndValidateManagementClusterConfigurationReturnsOnCall map[int]struct { - result1 *client.ValidationError - } - ConfigureAndValidateTkrVersionStub func(string) (string, string, error) - configureAndValidateTkrVersionMutex sync.RWMutex - configureAndValidateTkrVersionArgsForCall []struct { - arg1 string - } - configureAndValidateTkrVersionReturns struct { - result1 string - result2 string - result3 error - } - configureAndValidateTkrVersionReturnsOnCall map[int]struct { - result1 string - result2 string - result3 error - } - ConfigureTimeoutStub func(time.Duration) - configureTimeoutMutex sync.RWMutex - configureTimeoutArgsForCall []struct { - arg1 time.Duration - } - CreateAWSCloudFormationStackStub func() error - createAWSCloudFormationStackMutex sync.RWMutex - createAWSCloudFormationStackArgsForCall []struct { - } - createAWSCloudFormationStackReturns struct { - result1 error - } - createAWSCloudFormationStackReturnsOnCall map[int]struct { - result1 error - } - CreateClusterStub func(*client.CreateClusterOptions, bool) (bool, error) - createClusterMutex sync.RWMutex - createClusterArgsForCall []struct { - arg1 *client.CreateClusterOptions - arg2 bool - } - createClusterReturns struct { - result1 bool - result2 error - } - createClusterReturnsOnCall map[int]struct { - result1 bool - result2 error - } - DeactivateTanzuKubernetesReleasesStub func(string) error - deactivateTanzuKubernetesReleasesMutex sync.RWMutex - deactivateTanzuKubernetesReleasesArgsForCall []struct { - arg1 string - } - deactivateTanzuKubernetesReleasesReturns struct { - result1 error - } - deactivateTanzuKubernetesReleasesReturnsOnCall map[int]struct { - result1 error - } - DeleteMachineDeploymentStub func(client.DeleteMachineDeploymentOptions) error - deleteMachineDeploymentMutex sync.RWMutex - deleteMachineDeploymentArgsForCall []struct { - arg1 client.DeleteMachineDeploymentOptions - } - deleteMachineDeploymentReturns struct { - result1 error - } - deleteMachineDeploymentReturnsOnCall map[int]struct { - result1 error - } - DeleteMachineHealthCheckStub func(client.MachineHealthCheckOptions) error - deleteMachineHealthCheckMutex sync.RWMutex - deleteMachineHealthCheckArgsForCall []struct { - arg1 client.MachineHealthCheckOptions - } - deleteMachineHealthCheckReturns struct { - result1 error - } - deleteMachineHealthCheckReturnsOnCall map[int]struct { - result1 error - } - DeleteRegionStub func(client.DeleteRegionOptions) error - deleteRegionMutex sync.RWMutex - deleteRegionArgsForCall []struct { - arg1 client.DeleteRegionOptions - } - deleteRegionReturns struct { - result1 error - } - deleteRegionReturnsOnCall map[int]struct { - result1 error - } - DeleteWorkloadClusterStub func(client.DeleteWorkloadClusterOptions) error - deleteWorkloadClusterMutex sync.RWMutex - deleteWorkloadClusterArgsForCall []struct { - arg1 client.DeleteWorkloadClusterOptions - } - deleteWorkloadClusterReturns struct { - result1 error - } - deleteWorkloadClusterReturnsOnCall map[int]struct { - result1 error - } - DescribeClusterStub func(client.DescribeTKGClustersOptions) (*tree.ObjectTree, *v1beta1.Cluster, *v1alpha3.ProviderList, error) - describeClusterMutex sync.RWMutex - describeClusterArgsForCall []struct { - arg1 client.DescribeTKGClustersOptions - } - describeClusterReturns struct { - result1 *tree.ObjectTree - result2 *v1beta1.Cluster - result3 *v1alpha3.ProviderList - result4 error - } - describeClusterReturnsOnCall map[int]struct { - result1 *tree.ObjectTree - result2 *v1beta1.Cluster - result3 *v1alpha3.ProviderList - result4 error - } - DescribeProviderStub func() (*v1alpha3.ProviderList, error) - describeProviderMutex sync.RWMutex - describeProviderArgsForCall []struct { - } - describeProviderReturns struct { - result1 *v1alpha3.ProviderList - result2 error - } - describeProviderReturnsOnCall map[int]struct { - result1 *v1alpha3.ProviderList - result2 error - } - DownloadBomFileStub func(string) error - downloadBomFileMutex sync.RWMutex - downloadBomFileArgsForCall []struct { - arg1 string - } - downloadBomFileReturns struct { - result1 error - } - downloadBomFileReturnsOnCall map[int]struct { - result1 error - } - GenerateAWSCloudFormationTemplateStub func() (string, error) - generateAWSCloudFormationTemplateMutex sync.RWMutex - generateAWSCloudFormationTemplateArgsForCall []struct { - } - generateAWSCloudFormationTemplateReturns struct { - result1 string - result2 error - } - generateAWSCloudFormationTemplateReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetCEIPParticipationStub func() (client.ClusterCeipInfo, error) - getCEIPParticipationMutex sync.RWMutex - getCEIPParticipationArgsForCall []struct { - } - getCEIPParticipationReturns struct { - result1 client.ClusterCeipInfo - result2 error - } - getCEIPParticipationReturnsOnCall map[int]struct { - result1 client.ClusterCeipInfo - result2 error - } - GetClusterConfigurationStub func(*client.CreateClusterOptions) ([]byte, error) - getClusterConfigurationMutex sync.RWMutex - getClusterConfigurationArgsForCall []struct { - arg1 *client.CreateClusterOptions - } - getClusterConfigurationReturns struct { - result1 []byte - result2 error - } - getClusterConfigurationReturnsOnCall map[int]struct { - result1 []byte - result2 error - } - GetClusterPinnipedInfoStub func(client.GetClusterPinnipedInfoOptions) (*client.ClusterPinnipedInfo, error) - getClusterPinnipedInfoMutex sync.RWMutex - getClusterPinnipedInfoArgsForCall []struct { - arg1 client.GetClusterPinnipedInfoOptions - } - getClusterPinnipedInfoReturns struct { - result1 *client.ClusterPinnipedInfo - result2 error - } - getClusterPinnipedInfoReturnsOnCall map[int]struct { - result1 *client.ClusterPinnipedInfo - result2 error - } - GetCurrentRegionContextStub func() (region.RegionContext, error) - getCurrentRegionContextMutex sync.RWMutex - getCurrentRegionContextArgsForCall []struct { - } - getCurrentRegionContextReturns struct { - result1 region.RegionContext - result2 error - } - getCurrentRegionContextReturnsOnCall map[int]struct { - result1 region.RegionContext - result2 error - } - GetKubernetesVersionsStub func() (*client.KubernetesVersionsInfo, error) - getKubernetesVersionsMutex sync.RWMutex - getKubernetesVersionsArgsForCall []struct { - } - getKubernetesVersionsReturns struct { - result1 *client.KubernetesVersionsInfo - result2 error - } - getKubernetesVersionsReturnsOnCall map[int]struct { - result1 *client.KubernetesVersionsInfo - result2 error - } - GetMachineDeploymentsStub func(client.GetMachineDeploymentOptions) ([]v1beta1.MachineDeployment, error) - getMachineDeploymentsMutex sync.RWMutex - getMachineDeploymentsArgsForCall []struct { - arg1 client.GetMachineDeploymentOptions - } - getMachineDeploymentsReturns struct { - result1 []v1beta1.MachineDeployment - result2 error - } - getMachineDeploymentsReturnsOnCall map[int]struct { - result1 []v1beta1.MachineDeployment - result2 error - } - GetMachineHealthChecksStub func(client.MachineHealthCheckOptions) ([]client.MachineHealthCheck, error) - getMachineHealthChecksMutex sync.RWMutex - getMachineHealthChecksArgsForCall []struct { - arg1 client.MachineHealthCheckOptions - } - getMachineHealthChecksReturns struct { - result1 []client.MachineHealthCheck - result2 error - } - getMachineHealthChecksReturnsOnCall map[int]struct { - result1 []client.MachineHealthCheck - result2 error - } - GetPacificClusterObjectStub func(string, string) (*v1alpha2.TanzuKubernetesCluster, error) - getPacificClusterObjectMutex sync.RWMutex - getPacificClusterObjectArgsForCall []struct { - arg1 string - arg2 string - } - getPacificClusterObjectReturns struct { - result1 *v1alpha2.TanzuKubernetesCluster - result2 error - } - getPacificClusterObjectReturnsOnCall map[int]struct { - result1 *v1alpha2.TanzuKubernetesCluster - result2 error - } - GetPacificMachineDeploymentsStub func(client.GetMachineDeploymentOptions) ([]v1alpha3a.MachineDeployment, error) - getPacificMachineDeploymentsMutex sync.RWMutex - getPacificMachineDeploymentsArgsForCall []struct { - arg1 client.GetMachineDeploymentOptions - } - getPacificMachineDeploymentsReturns struct { - result1 []v1alpha3a.MachineDeployment - result2 error - } - getPacificMachineDeploymentsReturnsOnCall map[int]struct { - result1 []v1alpha3a.MachineDeployment - result2 error - } - GetRegionContextsStub func(string) ([]region.RegionContext, error) - getRegionContextsMutex sync.RWMutex - getRegionContextsArgsForCall []struct { - arg1 string - } - getRegionContextsReturns struct { - result1 []region.RegionContext - result2 error - } - getRegionContextsReturnsOnCall map[int]struct { - result1 []region.RegionContext - result2 error - } - GetTanzuKubernetesReleasesStub func(string) ([]v1alpha1.TanzuKubernetesRelease, error) - getTanzuKubernetesReleasesMutex sync.RWMutex - getTanzuKubernetesReleasesArgsForCall []struct { - arg1 string - } - getTanzuKubernetesReleasesReturns struct { - result1 []v1alpha1.TanzuKubernetesRelease - result2 error - } - getTanzuKubernetesReleasesReturnsOnCall map[int]struct { - result1 []v1alpha1.TanzuKubernetesRelease - result2 error - } - GetVSphereEndpointStub func(clusterclient.Client) (vc.Client, error) - getVSphereEndpointMutex sync.RWMutex - getVSphereEndpointArgsForCall []struct { - arg1 clusterclient.Client - } - getVSphereEndpointReturns struct { - result1 vc.Client - result2 error - } - getVSphereEndpointReturnsOnCall map[int]struct { - result1 vc.Client - result2 error - } - GetWorkloadClusterCredentialsStub func(client.GetWorkloadClusterCredentialsOptions) (string, string, error) - getWorkloadClusterCredentialsMutex sync.RWMutex - getWorkloadClusterCredentialsArgsForCall []struct { - arg1 client.GetWorkloadClusterCredentialsOptions - } - getWorkloadClusterCredentialsReturns struct { - result1 string - result2 string - result3 error - } - getWorkloadClusterCredentialsReturnsOnCall map[int]struct { - result1 string - result2 string - result3 error - } - InitRegionStub func(*client.InitRegionOptions) error - initRegionMutex sync.RWMutex - initRegionArgsForCall []struct { - arg1 *client.InitRegionOptions - } - initRegionReturns struct { - result1 error - } - initRegionReturnsOnCall map[int]struct { - result1 error - } - InitRegionDryRunStub func(*client.InitRegionOptions) ([]byte, error) - initRegionDryRunMutex sync.RWMutex - initRegionDryRunArgsForCall []struct { - arg1 *client.InitRegionOptions - } - initRegionDryRunReturns struct { - result1 []byte - result2 error - } - initRegionDryRunReturnsOnCall map[int]struct { - result1 []byte - result2 error - } - IsFeatureActivatedStub func(string) bool - isFeatureActivatedMutex sync.RWMutex - isFeatureActivatedArgsForCall []struct { - arg1 string - } - isFeatureActivatedReturns struct { - result1 bool - } - isFeatureActivatedReturnsOnCall map[int]struct { - result1 bool - } - IsManagementClusterAKindClusterStub func(string) (bool, error) - isManagementClusterAKindClusterMutex sync.RWMutex - isManagementClusterAKindClusterArgsForCall []struct { - arg1 string - } - isManagementClusterAKindClusterReturns struct { - result1 bool - result2 error - } - isManagementClusterAKindClusterReturnsOnCall map[int]struct { - result1 bool - result2 error - } - IsPacificManagementClusterStub func() (bool, error) - isPacificManagementClusterMutex sync.RWMutex - isPacificManagementClusterArgsForCall []struct { - } - isPacificManagementClusterReturns struct { - result1 bool - result2 error - } - isPacificManagementClusterReturnsOnCall map[int]struct { - result1 bool - result2 error - } - IsPacificRegionalClusterStub func() (bool, error) - isPacificRegionalClusterMutex sync.RWMutex - isPacificRegionalClusterArgsForCall []struct { - } - isPacificRegionalClusterReturns struct { - result1 bool - result2 error - } - isPacificRegionalClusterReturnsOnCall map[int]struct { - result1 bool - result2 error - } - ListTKGClustersStub func(client.ListTKGClustersOptions) ([]client.ClusterInfo, error) - listTKGClustersMutex sync.RWMutex - listTKGClustersArgsForCall []struct { - arg1 client.ListTKGClustersOptions - } - listTKGClustersReturns struct { - result1 []client.ClusterInfo - result2 error - } - listTKGClustersReturnsOnCall map[int]struct { - result1 []client.ClusterInfo - result2 error - } - ParseHiddenArgsAsFeatureFlagsStub func(*client.InitRegionOptions) - parseHiddenArgsAsFeatureFlagsMutex sync.RWMutex - parseHiddenArgsAsFeatureFlagsArgsForCall []struct { - arg1 *client.InitRegionOptions - } - SaveFeatureFlagsStub func(map[string]string) error - saveFeatureFlagsMutex sync.RWMutex - saveFeatureFlagsArgsForCall []struct { - arg1 map[string]string - } - saveFeatureFlagsReturns struct { - result1 error - } - saveFeatureFlagsReturnsOnCall map[int]struct { - result1 error - } - ScaleClusterStub func(client.ScaleClusterOptions) error - scaleClusterMutex sync.RWMutex - scaleClusterArgsForCall []struct { - arg1 client.ScaleClusterOptions - } - scaleClusterReturns struct { - result1 error - } - scaleClusterReturnsOnCall map[int]struct { - result1 error - } - SetCEIPParticipationStub func(bool, string, string) error - setCEIPParticipationMutex sync.RWMutex - setCEIPParticipationArgsForCall []struct { - arg1 bool - arg2 string - arg3 string - } - setCEIPParticipationReturns struct { - result1 error - } - setCEIPParticipationReturnsOnCall map[int]struct { - result1 error - } - SetMachineDeploymentStub func(*client.SetMachineDeploymentOptions) error - setMachineDeploymentMutex sync.RWMutex - setMachineDeploymentArgsForCall []struct { - arg1 *client.SetMachineDeploymentOptions - } - setMachineDeploymentReturns struct { - result1 error - } - setMachineDeploymentReturnsOnCall map[int]struct { - result1 error - } - SetMachineHealthCheckStub func(*client.SetMachineHealthCheckOptions) error - setMachineHealthCheckMutex sync.RWMutex - setMachineHealthCheckArgsForCall []struct { - arg1 *client.SetMachineHealthCheckOptions - } - setMachineHealthCheckReturns struct { - result1 error - } - setMachineHealthCheckReturnsOnCall map[int]struct { - result1 error - } - SetRegionContextStub func(string, string) error - setRegionContextMutex sync.RWMutex - setRegionContextArgsForCall []struct { - arg1 string - arg2 string - } - setRegionContextReturns struct { - result1 error - } - setRegionContextReturnsOnCall map[int]struct { - result1 error - } - TKGConfigReaderWriterStub func() tkgconfigreaderwriter.TKGConfigReaderWriter - tKGConfigReaderWriterMutex sync.RWMutex - tKGConfigReaderWriterArgsForCall []struct { - } - tKGConfigReaderWriterReturns struct { - result1 tkgconfigreaderwriter.TKGConfigReaderWriter - } - tKGConfigReaderWriterReturnsOnCall map[int]struct { - result1 tkgconfigreaderwriter.TKGConfigReaderWriter - } - UpdateCredentialsClusterStub func(*client.UpdateCredentialsOptions) error - updateCredentialsClusterMutex sync.RWMutex - updateCredentialsClusterArgsForCall []struct { - arg1 *client.UpdateCredentialsOptions - } - updateCredentialsClusterReturns struct { - result1 error - } - updateCredentialsClusterReturnsOnCall map[int]struct { - result1 error - } - UpdateCredentialsRegionStub func(*client.UpdateCredentialsOptions) error - updateCredentialsRegionMutex sync.RWMutex - updateCredentialsRegionArgsForCall []struct { - arg1 *client.UpdateCredentialsOptions - } - updateCredentialsRegionReturns struct { - result1 error - } - updateCredentialsRegionReturnsOnCall map[int]struct { - result1 error - } - UpgradeClusterStub func(*client.UpgradeClusterOptions) error - upgradeClusterMutex sync.RWMutex - upgradeClusterArgsForCall []struct { - arg1 *client.UpgradeClusterOptions - } - upgradeClusterReturns struct { - result1 error - } - upgradeClusterReturnsOnCall map[int]struct { - result1 error - } - UpgradeManagementClusterStub func(*client.UpgradeClusterOptions) error - upgradeManagementClusterMutex sync.RWMutex - upgradeManagementClusterArgsForCall []struct { - arg1 *client.UpgradeClusterOptions - } - upgradeManagementClusterReturns struct { - result1 error - } - upgradeManagementClusterReturnsOnCall map[int]struct { - result1 error - } - ValidateDockerResourcePrerequisitesStub func() error - validateDockerResourcePrerequisitesMutex sync.RWMutex - validateDockerResourcePrerequisitesArgsForCall []struct { - } - validateDockerResourcePrerequisitesReturns struct { - result1 error - } - validateDockerResourcePrerequisitesReturnsOnCall map[int]struct { - result1 error - } - ValidatePrerequisitesStub func(bool, bool) error - validatePrerequisitesMutex sync.RWMutex - validatePrerequisitesArgsForCall []struct { - arg1 bool - arg2 bool - } - validatePrerequisitesReturns struct { - result1 error - } - validatePrerequisitesReturnsOnCall map[int]struct { - result1 error - } - VerifyRegionStub func(string) (region.RegionContext, error) - verifyRegionMutex sync.RWMutex - verifyRegionArgsForCall []struct { - arg1 string - } - verifyRegionReturns struct { - result1 region.RegionContext - result2 error - } - verifyRegionReturnsOnCall map[int]struct { - result1 region.RegionContext - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *Client) ActivateTanzuKubernetesReleases(arg1 string) error { - fake.activateTanzuKubernetesReleasesMutex.Lock() - ret, specificReturn := fake.activateTanzuKubernetesReleasesReturnsOnCall[len(fake.activateTanzuKubernetesReleasesArgsForCall)] - fake.activateTanzuKubernetesReleasesArgsForCall = append(fake.activateTanzuKubernetesReleasesArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ActivateTanzuKubernetesReleasesStub - fakeReturns := fake.activateTanzuKubernetesReleasesReturns - fake.recordInvocation("ActivateTanzuKubernetesReleases", []interface{}{arg1}) - fake.activateTanzuKubernetesReleasesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) ActivateTanzuKubernetesReleasesCallCount() int { - fake.activateTanzuKubernetesReleasesMutex.RLock() - defer fake.activateTanzuKubernetesReleasesMutex.RUnlock() - return len(fake.activateTanzuKubernetesReleasesArgsForCall) -} - -func (fake *Client) ActivateTanzuKubernetesReleasesCalls(stub func(string) error) { - fake.activateTanzuKubernetesReleasesMutex.Lock() - defer fake.activateTanzuKubernetesReleasesMutex.Unlock() - fake.ActivateTanzuKubernetesReleasesStub = stub -} - -func (fake *Client) ActivateTanzuKubernetesReleasesArgsForCall(i int) string { - fake.activateTanzuKubernetesReleasesMutex.RLock() - defer fake.activateTanzuKubernetesReleasesMutex.RUnlock() - argsForCall := fake.activateTanzuKubernetesReleasesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) ActivateTanzuKubernetesReleasesReturns(result1 error) { - fake.activateTanzuKubernetesReleasesMutex.Lock() - defer fake.activateTanzuKubernetesReleasesMutex.Unlock() - fake.ActivateTanzuKubernetesReleasesStub = nil - fake.activateTanzuKubernetesReleasesReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) ActivateTanzuKubernetesReleasesReturnsOnCall(i int, result1 error) { - fake.activateTanzuKubernetesReleasesMutex.Lock() - defer fake.activateTanzuKubernetesReleasesMutex.Unlock() - fake.ActivateTanzuKubernetesReleasesStub = nil - if fake.activateTanzuKubernetesReleasesReturnsOnCall == nil { - fake.activateTanzuKubernetesReleasesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.activateTanzuKubernetesReleasesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) AddRegionContext(arg1 region.RegionContext, arg2 bool, arg3 bool) error { - fake.addRegionContextMutex.Lock() - ret, specificReturn := fake.addRegionContextReturnsOnCall[len(fake.addRegionContextArgsForCall)] - fake.addRegionContextArgsForCall = append(fake.addRegionContextArgsForCall, struct { - arg1 region.RegionContext - arg2 bool - arg3 bool - }{arg1, arg2, arg3}) - stub := fake.AddRegionContextStub - fakeReturns := fake.addRegionContextReturns - fake.recordInvocation("AddRegionContext", []interface{}{arg1, arg2, arg3}) - fake.addRegionContextMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) AddRegionContextCallCount() int { - fake.addRegionContextMutex.RLock() - defer fake.addRegionContextMutex.RUnlock() - return len(fake.addRegionContextArgsForCall) -} - -func (fake *Client) AddRegionContextCalls(stub func(region.RegionContext, bool, bool) error) { - fake.addRegionContextMutex.Lock() - defer fake.addRegionContextMutex.Unlock() - fake.AddRegionContextStub = stub -} - -func (fake *Client) AddRegionContextArgsForCall(i int) (region.RegionContext, bool, bool) { - fake.addRegionContextMutex.RLock() - defer fake.addRegionContextMutex.RUnlock() - argsForCall := fake.addRegionContextArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *Client) AddRegionContextReturns(result1 error) { - fake.addRegionContextMutex.Lock() - defer fake.addRegionContextMutex.Unlock() - fake.AddRegionContextStub = nil - fake.addRegionContextReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) AddRegionContextReturnsOnCall(i int, result1 error) { - fake.addRegionContextMutex.Lock() - defer fake.addRegionContextMutex.Unlock() - fake.AddRegionContextStub = nil - if fake.addRegionContextReturnsOnCall == nil { - fake.addRegionContextReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.addRegionContextReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) ConfigureAndValidateManagementClusterConfiguration(arg1 *client.InitRegionOptions, arg2 bool) *client.ValidationError { - fake.configureAndValidateManagementClusterConfigurationMutex.Lock() - ret, specificReturn := fake.configureAndValidateManagementClusterConfigurationReturnsOnCall[len(fake.configureAndValidateManagementClusterConfigurationArgsForCall)] - fake.configureAndValidateManagementClusterConfigurationArgsForCall = append(fake.configureAndValidateManagementClusterConfigurationArgsForCall, struct { - arg1 *client.InitRegionOptions - arg2 bool - }{arg1, arg2}) - stub := fake.ConfigureAndValidateManagementClusterConfigurationStub - fakeReturns := fake.configureAndValidateManagementClusterConfigurationReturns - fake.recordInvocation("ConfigureAndValidateManagementClusterConfiguration", []interface{}{arg1, arg2}) - fake.configureAndValidateManagementClusterConfigurationMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) ConfigureAndValidateManagementClusterConfigurationCallCount() int { - fake.configureAndValidateManagementClusterConfigurationMutex.RLock() - defer fake.configureAndValidateManagementClusterConfigurationMutex.RUnlock() - return len(fake.configureAndValidateManagementClusterConfigurationArgsForCall) -} - -func (fake *Client) ConfigureAndValidateManagementClusterConfigurationCalls(stub func(*client.InitRegionOptions, bool) *client.ValidationError) { - fake.configureAndValidateManagementClusterConfigurationMutex.Lock() - defer fake.configureAndValidateManagementClusterConfigurationMutex.Unlock() - fake.ConfigureAndValidateManagementClusterConfigurationStub = stub -} - -func (fake *Client) ConfigureAndValidateManagementClusterConfigurationArgsForCall(i int) (*client.InitRegionOptions, bool) { - fake.configureAndValidateManagementClusterConfigurationMutex.RLock() - defer fake.configureAndValidateManagementClusterConfigurationMutex.RUnlock() - argsForCall := fake.configureAndValidateManagementClusterConfigurationArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Client) ConfigureAndValidateManagementClusterConfigurationReturns(result1 *client.ValidationError) { - fake.configureAndValidateManagementClusterConfigurationMutex.Lock() - defer fake.configureAndValidateManagementClusterConfigurationMutex.Unlock() - fake.ConfigureAndValidateManagementClusterConfigurationStub = nil - fake.configureAndValidateManagementClusterConfigurationReturns = struct { - result1 *client.ValidationError - }{result1} -} - -func (fake *Client) ConfigureAndValidateManagementClusterConfigurationReturnsOnCall(i int, result1 *client.ValidationError) { - fake.configureAndValidateManagementClusterConfigurationMutex.Lock() - defer fake.configureAndValidateManagementClusterConfigurationMutex.Unlock() - fake.ConfigureAndValidateManagementClusterConfigurationStub = nil - if fake.configureAndValidateManagementClusterConfigurationReturnsOnCall == nil { - fake.configureAndValidateManagementClusterConfigurationReturnsOnCall = make(map[int]struct { - result1 *client.ValidationError - }) - } - fake.configureAndValidateManagementClusterConfigurationReturnsOnCall[i] = struct { - result1 *client.ValidationError - }{result1} -} - -func (fake *Client) ConfigureAndValidateTkrVersion(arg1 string) (string, string, error) { - fake.configureAndValidateTkrVersionMutex.Lock() - ret, specificReturn := fake.configureAndValidateTkrVersionReturnsOnCall[len(fake.configureAndValidateTkrVersionArgsForCall)] - fake.configureAndValidateTkrVersionArgsForCall = append(fake.configureAndValidateTkrVersionArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ConfigureAndValidateTkrVersionStub - fakeReturns := fake.configureAndValidateTkrVersionReturns - fake.recordInvocation("ConfigureAndValidateTkrVersion", []interface{}{arg1}) - fake.configureAndValidateTkrVersionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *Client) ConfigureAndValidateTkrVersionCallCount() int { - fake.configureAndValidateTkrVersionMutex.RLock() - defer fake.configureAndValidateTkrVersionMutex.RUnlock() - return len(fake.configureAndValidateTkrVersionArgsForCall) -} - -func (fake *Client) ConfigureAndValidateTkrVersionCalls(stub func(string) (string, string, error)) { - fake.configureAndValidateTkrVersionMutex.Lock() - defer fake.configureAndValidateTkrVersionMutex.Unlock() - fake.ConfigureAndValidateTkrVersionStub = stub -} - -func (fake *Client) ConfigureAndValidateTkrVersionArgsForCall(i int) string { - fake.configureAndValidateTkrVersionMutex.RLock() - defer fake.configureAndValidateTkrVersionMutex.RUnlock() - argsForCall := fake.configureAndValidateTkrVersionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) ConfigureAndValidateTkrVersionReturns(result1 string, result2 string, result3 error) { - fake.configureAndValidateTkrVersionMutex.Lock() - defer fake.configureAndValidateTkrVersionMutex.Unlock() - fake.ConfigureAndValidateTkrVersionStub = nil - fake.configureAndValidateTkrVersionReturns = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *Client) ConfigureAndValidateTkrVersionReturnsOnCall(i int, result1 string, result2 string, result3 error) { - fake.configureAndValidateTkrVersionMutex.Lock() - defer fake.configureAndValidateTkrVersionMutex.Unlock() - fake.ConfigureAndValidateTkrVersionStub = nil - if fake.configureAndValidateTkrVersionReturnsOnCall == nil { - fake.configureAndValidateTkrVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 string - result3 error - }) - } - fake.configureAndValidateTkrVersionReturnsOnCall[i] = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *Client) ConfigureTimeout(arg1 time.Duration) { - fake.configureTimeoutMutex.Lock() - fake.configureTimeoutArgsForCall = append(fake.configureTimeoutArgsForCall, struct { - arg1 time.Duration - }{arg1}) - stub := fake.ConfigureTimeoutStub - fake.recordInvocation("ConfigureTimeout", []interface{}{arg1}) - fake.configureTimeoutMutex.Unlock() - if stub != nil { - fake.ConfigureTimeoutStub(arg1) - } -} - -func (fake *Client) ConfigureTimeoutCallCount() int { - fake.configureTimeoutMutex.RLock() - defer fake.configureTimeoutMutex.RUnlock() - return len(fake.configureTimeoutArgsForCall) -} - -func (fake *Client) ConfigureTimeoutCalls(stub func(time.Duration)) { - fake.configureTimeoutMutex.Lock() - defer fake.configureTimeoutMutex.Unlock() - fake.ConfigureTimeoutStub = stub -} - -func (fake *Client) ConfigureTimeoutArgsForCall(i int) time.Duration { - fake.configureTimeoutMutex.RLock() - defer fake.configureTimeoutMutex.RUnlock() - argsForCall := fake.configureTimeoutArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) CreateAWSCloudFormationStack() error { - fake.createAWSCloudFormationStackMutex.Lock() - ret, specificReturn := fake.createAWSCloudFormationStackReturnsOnCall[len(fake.createAWSCloudFormationStackArgsForCall)] - fake.createAWSCloudFormationStackArgsForCall = append(fake.createAWSCloudFormationStackArgsForCall, struct { - }{}) - stub := fake.CreateAWSCloudFormationStackStub - fakeReturns := fake.createAWSCloudFormationStackReturns - fake.recordInvocation("CreateAWSCloudFormationStack", []interface{}{}) - fake.createAWSCloudFormationStackMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) CreateAWSCloudFormationStackCallCount() int { - fake.createAWSCloudFormationStackMutex.RLock() - defer fake.createAWSCloudFormationStackMutex.RUnlock() - return len(fake.createAWSCloudFormationStackArgsForCall) -} - -func (fake *Client) CreateAWSCloudFormationStackCalls(stub func() error) { - fake.createAWSCloudFormationStackMutex.Lock() - defer fake.createAWSCloudFormationStackMutex.Unlock() - fake.CreateAWSCloudFormationStackStub = stub -} - -func (fake *Client) CreateAWSCloudFormationStackReturns(result1 error) { - fake.createAWSCloudFormationStackMutex.Lock() - defer fake.createAWSCloudFormationStackMutex.Unlock() - fake.CreateAWSCloudFormationStackStub = nil - fake.createAWSCloudFormationStackReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) CreateAWSCloudFormationStackReturnsOnCall(i int, result1 error) { - fake.createAWSCloudFormationStackMutex.Lock() - defer fake.createAWSCloudFormationStackMutex.Unlock() - fake.CreateAWSCloudFormationStackStub = nil - if fake.createAWSCloudFormationStackReturnsOnCall == nil { - fake.createAWSCloudFormationStackReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.createAWSCloudFormationStackReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) CreateCluster(arg1 *client.CreateClusterOptions, arg2 bool) (bool, error) { - fake.createClusterMutex.Lock() - ret, specificReturn := fake.createClusterReturnsOnCall[len(fake.createClusterArgsForCall)] - fake.createClusterArgsForCall = append(fake.createClusterArgsForCall, struct { - arg1 *client.CreateClusterOptions - arg2 bool - }{arg1, arg2}) - stub := fake.CreateClusterStub - fakeReturns := fake.createClusterReturns - fake.recordInvocation("CreateCluster", []interface{}{arg1, arg2}) - fake.createClusterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) CreateClusterCallCount() int { - fake.createClusterMutex.RLock() - defer fake.createClusterMutex.RUnlock() - return len(fake.createClusterArgsForCall) -} - -func (fake *Client) CreateClusterCalls(stub func(*client.CreateClusterOptions, bool) (bool, error)) { - fake.createClusterMutex.Lock() - defer fake.createClusterMutex.Unlock() - fake.CreateClusterStub = stub -} - -func (fake *Client) CreateClusterArgsForCall(i int) (*client.CreateClusterOptions, bool) { - fake.createClusterMutex.RLock() - defer fake.createClusterMutex.RUnlock() - argsForCall := fake.createClusterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Client) CreateClusterReturns(result1 bool, result2 error) { - fake.createClusterMutex.Lock() - defer fake.createClusterMutex.Unlock() - fake.CreateClusterStub = nil - fake.createClusterReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *Client) CreateClusterReturnsOnCall(i int, result1 bool, result2 error) { - fake.createClusterMutex.Lock() - defer fake.createClusterMutex.Unlock() - fake.CreateClusterStub = nil - if fake.createClusterReturnsOnCall == nil { - fake.createClusterReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.createClusterReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *Client) DeactivateTanzuKubernetesReleases(arg1 string) error { - fake.deactivateTanzuKubernetesReleasesMutex.Lock() - ret, specificReturn := fake.deactivateTanzuKubernetesReleasesReturnsOnCall[len(fake.deactivateTanzuKubernetesReleasesArgsForCall)] - fake.deactivateTanzuKubernetesReleasesArgsForCall = append(fake.deactivateTanzuKubernetesReleasesArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.DeactivateTanzuKubernetesReleasesStub - fakeReturns := fake.deactivateTanzuKubernetesReleasesReturns - fake.recordInvocation("DeactivateTanzuKubernetesReleases", []interface{}{arg1}) - fake.deactivateTanzuKubernetesReleasesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) DeactivateTanzuKubernetesReleasesCallCount() int { - fake.deactivateTanzuKubernetesReleasesMutex.RLock() - defer fake.deactivateTanzuKubernetesReleasesMutex.RUnlock() - return len(fake.deactivateTanzuKubernetesReleasesArgsForCall) -} - -func (fake *Client) DeactivateTanzuKubernetesReleasesCalls(stub func(string) error) { - fake.deactivateTanzuKubernetesReleasesMutex.Lock() - defer fake.deactivateTanzuKubernetesReleasesMutex.Unlock() - fake.DeactivateTanzuKubernetesReleasesStub = stub -} - -func (fake *Client) DeactivateTanzuKubernetesReleasesArgsForCall(i int) string { - fake.deactivateTanzuKubernetesReleasesMutex.RLock() - defer fake.deactivateTanzuKubernetesReleasesMutex.RUnlock() - argsForCall := fake.deactivateTanzuKubernetesReleasesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) DeactivateTanzuKubernetesReleasesReturns(result1 error) { - fake.deactivateTanzuKubernetesReleasesMutex.Lock() - defer fake.deactivateTanzuKubernetesReleasesMutex.Unlock() - fake.DeactivateTanzuKubernetesReleasesStub = nil - fake.deactivateTanzuKubernetesReleasesReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) DeactivateTanzuKubernetesReleasesReturnsOnCall(i int, result1 error) { - fake.deactivateTanzuKubernetesReleasesMutex.Lock() - defer fake.deactivateTanzuKubernetesReleasesMutex.Unlock() - fake.DeactivateTanzuKubernetesReleasesStub = nil - if fake.deactivateTanzuKubernetesReleasesReturnsOnCall == nil { - fake.deactivateTanzuKubernetesReleasesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deactivateTanzuKubernetesReleasesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) DeleteMachineDeployment(arg1 client.DeleteMachineDeploymentOptions) error { - fake.deleteMachineDeploymentMutex.Lock() - ret, specificReturn := fake.deleteMachineDeploymentReturnsOnCall[len(fake.deleteMachineDeploymentArgsForCall)] - fake.deleteMachineDeploymentArgsForCall = append(fake.deleteMachineDeploymentArgsForCall, struct { - arg1 client.DeleteMachineDeploymentOptions - }{arg1}) - stub := fake.DeleteMachineDeploymentStub - fakeReturns := fake.deleteMachineDeploymentReturns - fake.recordInvocation("DeleteMachineDeployment", []interface{}{arg1}) - fake.deleteMachineDeploymentMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) DeleteMachineDeploymentCallCount() int { - fake.deleteMachineDeploymentMutex.RLock() - defer fake.deleteMachineDeploymentMutex.RUnlock() - return len(fake.deleteMachineDeploymentArgsForCall) -} - -func (fake *Client) DeleteMachineDeploymentCalls(stub func(client.DeleteMachineDeploymentOptions) error) { - fake.deleteMachineDeploymentMutex.Lock() - defer fake.deleteMachineDeploymentMutex.Unlock() - fake.DeleteMachineDeploymentStub = stub -} - -func (fake *Client) DeleteMachineDeploymentArgsForCall(i int) client.DeleteMachineDeploymentOptions { - fake.deleteMachineDeploymentMutex.RLock() - defer fake.deleteMachineDeploymentMutex.RUnlock() - argsForCall := fake.deleteMachineDeploymentArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) DeleteMachineDeploymentReturns(result1 error) { - fake.deleteMachineDeploymentMutex.Lock() - defer fake.deleteMachineDeploymentMutex.Unlock() - fake.DeleteMachineDeploymentStub = nil - fake.deleteMachineDeploymentReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) DeleteMachineDeploymentReturnsOnCall(i int, result1 error) { - fake.deleteMachineDeploymentMutex.Lock() - defer fake.deleteMachineDeploymentMutex.Unlock() - fake.DeleteMachineDeploymentStub = nil - if fake.deleteMachineDeploymentReturnsOnCall == nil { - fake.deleteMachineDeploymentReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteMachineDeploymentReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) DeleteMachineHealthCheck(arg1 client.MachineHealthCheckOptions) error { - fake.deleteMachineHealthCheckMutex.Lock() - ret, specificReturn := fake.deleteMachineHealthCheckReturnsOnCall[len(fake.deleteMachineHealthCheckArgsForCall)] - fake.deleteMachineHealthCheckArgsForCall = append(fake.deleteMachineHealthCheckArgsForCall, struct { - arg1 client.MachineHealthCheckOptions - }{arg1}) - stub := fake.DeleteMachineHealthCheckStub - fakeReturns := fake.deleteMachineHealthCheckReturns - fake.recordInvocation("DeleteMachineHealthCheck", []interface{}{arg1}) - fake.deleteMachineHealthCheckMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) DeleteMachineHealthCheckCallCount() int { - fake.deleteMachineHealthCheckMutex.RLock() - defer fake.deleteMachineHealthCheckMutex.RUnlock() - return len(fake.deleteMachineHealthCheckArgsForCall) -} - -func (fake *Client) DeleteMachineHealthCheckCalls(stub func(client.MachineHealthCheckOptions) error) { - fake.deleteMachineHealthCheckMutex.Lock() - defer fake.deleteMachineHealthCheckMutex.Unlock() - fake.DeleteMachineHealthCheckStub = stub -} - -func (fake *Client) DeleteMachineHealthCheckArgsForCall(i int) client.MachineHealthCheckOptions { - fake.deleteMachineHealthCheckMutex.RLock() - defer fake.deleteMachineHealthCheckMutex.RUnlock() - argsForCall := fake.deleteMachineHealthCheckArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) DeleteMachineHealthCheckReturns(result1 error) { - fake.deleteMachineHealthCheckMutex.Lock() - defer fake.deleteMachineHealthCheckMutex.Unlock() - fake.DeleteMachineHealthCheckStub = nil - fake.deleteMachineHealthCheckReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) DeleteMachineHealthCheckReturnsOnCall(i int, result1 error) { - fake.deleteMachineHealthCheckMutex.Lock() - defer fake.deleteMachineHealthCheckMutex.Unlock() - fake.DeleteMachineHealthCheckStub = nil - if fake.deleteMachineHealthCheckReturnsOnCall == nil { - fake.deleteMachineHealthCheckReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteMachineHealthCheckReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) DeleteRegion(arg1 client.DeleteRegionOptions) error { - fake.deleteRegionMutex.Lock() - ret, specificReturn := fake.deleteRegionReturnsOnCall[len(fake.deleteRegionArgsForCall)] - fake.deleteRegionArgsForCall = append(fake.deleteRegionArgsForCall, struct { - arg1 client.DeleteRegionOptions - }{arg1}) - stub := fake.DeleteRegionStub - fakeReturns := fake.deleteRegionReturns - fake.recordInvocation("DeleteRegion", []interface{}{arg1}) - fake.deleteRegionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) DeleteRegionCallCount() int { - fake.deleteRegionMutex.RLock() - defer fake.deleteRegionMutex.RUnlock() - return len(fake.deleteRegionArgsForCall) -} - -func (fake *Client) DeleteRegionCalls(stub func(client.DeleteRegionOptions) error) { - fake.deleteRegionMutex.Lock() - defer fake.deleteRegionMutex.Unlock() - fake.DeleteRegionStub = stub -} - -func (fake *Client) DeleteRegionArgsForCall(i int) client.DeleteRegionOptions { - fake.deleteRegionMutex.RLock() - defer fake.deleteRegionMutex.RUnlock() - argsForCall := fake.deleteRegionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) DeleteRegionReturns(result1 error) { - fake.deleteRegionMutex.Lock() - defer fake.deleteRegionMutex.Unlock() - fake.DeleteRegionStub = nil - fake.deleteRegionReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) DeleteRegionReturnsOnCall(i int, result1 error) { - fake.deleteRegionMutex.Lock() - defer fake.deleteRegionMutex.Unlock() - fake.DeleteRegionStub = nil - if fake.deleteRegionReturnsOnCall == nil { - fake.deleteRegionReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteRegionReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) DeleteWorkloadCluster(arg1 client.DeleteWorkloadClusterOptions) error { - fake.deleteWorkloadClusterMutex.Lock() - ret, specificReturn := fake.deleteWorkloadClusterReturnsOnCall[len(fake.deleteWorkloadClusterArgsForCall)] - fake.deleteWorkloadClusterArgsForCall = append(fake.deleteWorkloadClusterArgsForCall, struct { - arg1 client.DeleteWorkloadClusterOptions - }{arg1}) - stub := fake.DeleteWorkloadClusterStub - fakeReturns := fake.deleteWorkloadClusterReturns - fake.recordInvocation("DeleteWorkloadCluster", []interface{}{arg1}) - fake.deleteWorkloadClusterMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) DeleteWorkloadClusterCallCount() int { - fake.deleteWorkloadClusterMutex.RLock() - defer fake.deleteWorkloadClusterMutex.RUnlock() - return len(fake.deleteWorkloadClusterArgsForCall) -} - -func (fake *Client) DeleteWorkloadClusterCalls(stub func(client.DeleteWorkloadClusterOptions) error) { - fake.deleteWorkloadClusterMutex.Lock() - defer fake.deleteWorkloadClusterMutex.Unlock() - fake.DeleteWorkloadClusterStub = stub -} - -func (fake *Client) DeleteWorkloadClusterArgsForCall(i int) client.DeleteWorkloadClusterOptions { - fake.deleteWorkloadClusterMutex.RLock() - defer fake.deleteWorkloadClusterMutex.RUnlock() - argsForCall := fake.deleteWorkloadClusterArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) DeleteWorkloadClusterReturns(result1 error) { - fake.deleteWorkloadClusterMutex.Lock() - defer fake.deleteWorkloadClusterMutex.Unlock() - fake.DeleteWorkloadClusterStub = nil - fake.deleteWorkloadClusterReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) DeleteWorkloadClusterReturnsOnCall(i int, result1 error) { - fake.deleteWorkloadClusterMutex.Lock() - defer fake.deleteWorkloadClusterMutex.Unlock() - fake.DeleteWorkloadClusterStub = nil - if fake.deleteWorkloadClusterReturnsOnCall == nil { - fake.deleteWorkloadClusterReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteWorkloadClusterReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) DescribeCluster(arg1 client.DescribeTKGClustersOptions) (*tree.ObjectTree, *v1beta1.Cluster, *v1alpha3.ProviderList, error) { - fake.describeClusterMutex.Lock() - ret, specificReturn := fake.describeClusterReturnsOnCall[len(fake.describeClusterArgsForCall)] - fake.describeClusterArgsForCall = append(fake.describeClusterArgsForCall, struct { - arg1 client.DescribeTKGClustersOptions - }{arg1}) - stub := fake.DescribeClusterStub - fakeReturns := fake.describeClusterReturns - fake.recordInvocation("DescribeCluster", []interface{}{arg1}) - fake.describeClusterMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3, ret.result4 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3, fakeReturns.result4 -} - -func (fake *Client) DescribeClusterCallCount() int { - fake.describeClusterMutex.RLock() - defer fake.describeClusterMutex.RUnlock() - return len(fake.describeClusterArgsForCall) -} - -func (fake *Client) DescribeClusterCalls(stub func(client.DescribeTKGClustersOptions) (*tree.ObjectTree, *v1beta1.Cluster, *v1alpha3.ProviderList, error)) { - fake.describeClusterMutex.Lock() - defer fake.describeClusterMutex.Unlock() - fake.DescribeClusterStub = stub -} - -func (fake *Client) DescribeClusterArgsForCall(i int) client.DescribeTKGClustersOptions { - fake.describeClusterMutex.RLock() - defer fake.describeClusterMutex.RUnlock() - argsForCall := fake.describeClusterArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) DescribeClusterReturns(result1 *tree.ObjectTree, result2 *v1beta1.Cluster, result3 *v1alpha3.ProviderList, result4 error) { - fake.describeClusterMutex.Lock() - defer fake.describeClusterMutex.Unlock() - fake.DescribeClusterStub = nil - fake.describeClusterReturns = struct { - result1 *tree.ObjectTree - result2 *v1beta1.Cluster - result3 *v1alpha3.ProviderList - result4 error - }{result1, result2, result3, result4} -} - -func (fake *Client) DescribeClusterReturnsOnCall(i int, result1 *tree.ObjectTree, result2 *v1beta1.Cluster, result3 *v1alpha3.ProviderList, result4 error) { - fake.describeClusterMutex.Lock() - defer fake.describeClusterMutex.Unlock() - fake.DescribeClusterStub = nil - if fake.describeClusterReturnsOnCall == nil { - fake.describeClusterReturnsOnCall = make(map[int]struct { - result1 *tree.ObjectTree - result2 *v1beta1.Cluster - result3 *v1alpha3.ProviderList - result4 error - }) - } - fake.describeClusterReturnsOnCall[i] = struct { - result1 *tree.ObjectTree - result2 *v1beta1.Cluster - result3 *v1alpha3.ProviderList - result4 error - }{result1, result2, result3, result4} -} - -func (fake *Client) DescribeProvider() (*v1alpha3.ProviderList, error) { - fake.describeProviderMutex.Lock() - ret, specificReturn := fake.describeProviderReturnsOnCall[len(fake.describeProviderArgsForCall)] - fake.describeProviderArgsForCall = append(fake.describeProviderArgsForCall, struct { - }{}) - stub := fake.DescribeProviderStub - fakeReturns := fake.describeProviderReturns - fake.recordInvocation("DescribeProvider", []interface{}{}) - fake.describeProviderMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) DescribeProviderCallCount() int { - fake.describeProviderMutex.RLock() - defer fake.describeProviderMutex.RUnlock() - return len(fake.describeProviderArgsForCall) -} - -func (fake *Client) DescribeProviderCalls(stub func() (*v1alpha3.ProviderList, error)) { - fake.describeProviderMutex.Lock() - defer fake.describeProviderMutex.Unlock() - fake.DescribeProviderStub = stub -} - -func (fake *Client) DescribeProviderReturns(result1 *v1alpha3.ProviderList, result2 error) { - fake.describeProviderMutex.Lock() - defer fake.describeProviderMutex.Unlock() - fake.DescribeProviderStub = nil - fake.describeProviderReturns = struct { - result1 *v1alpha3.ProviderList - result2 error - }{result1, result2} -} - -func (fake *Client) DescribeProviderReturnsOnCall(i int, result1 *v1alpha3.ProviderList, result2 error) { - fake.describeProviderMutex.Lock() - defer fake.describeProviderMutex.Unlock() - fake.DescribeProviderStub = nil - if fake.describeProviderReturnsOnCall == nil { - fake.describeProviderReturnsOnCall = make(map[int]struct { - result1 *v1alpha3.ProviderList - result2 error - }) - } - fake.describeProviderReturnsOnCall[i] = struct { - result1 *v1alpha3.ProviderList - result2 error - }{result1, result2} -} - -func (fake *Client) DownloadBomFile(arg1 string) error { - fake.downloadBomFileMutex.Lock() - ret, specificReturn := fake.downloadBomFileReturnsOnCall[len(fake.downloadBomFileArgsForCall)] - fake.downloadBomFileArgsForCall = append(fake.downloadBomFileArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.DownloadBomFileStub - fakeReturns := fake.downloadBomFileReturns - fake.recordInvocation("DownloadBomFile", []interface{}{arg1}) - fake.downloadBomFileMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) DownloadBomFileCallCount() int { - fake.downloadBomFileMutex.RLock() - defer fake.downloadBomFileMutex.RUnlock() - return len(fake.downloadBomFileArgsForCall) -} - -func (fake *Client) DownloadBomFileCalls(stub func(string) error) { - fake.downloadBomFileMutex.Lock() - defer fake.downloadBomFileMutex.Unlock() - fake.DownloadBomFileStub = stub -} - -func (fake *Client) DownloadBomFileArgsForCall(i int) string { - fake.downloadBomFileMutex.RLock() - defer fake.downloadBomFileMutex.RUnlock() - argsForCall := fake.downloadBomFileArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) DownloadBomFileReturns(result1 error) { - fake.downloadBomFileMutex.Lock() - defer fake.downloadBomFileMutex.Unlock() - fake.DownloadBomFileStub = nil - fake.downloadBomFileReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) DownloadBomFileReturnsOnCall(i int, result1 error) { - fake.downloadBomFileMutex.Lock() - defer fake.downloadBomFileMutex.Unlock() - fake.DownloadBomFileStub = nil - if fake.downloadBomFileReturnsOnCall == nil { - fake.downloadBomFileReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.downloadBomFileReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) GenerateAWSCloudFormationTemplate() (string, error) { - fake.generateAWSCloudFormationTemplateMutex.Lock() - ret, specificReturn := fake.generateAWSCloudFormationTemplateReturnsOnCall[len(fake.generateAWSCloudFormationTemplateArgsForCall)] - fake.generateAWSCloudFormationTemplateArgsForCall = append(fake.generateAWSCloudFormationTemplateArgsForCall, struct { - }{}) - stub := fake.GenerateAWSCloudFormationTemplateStub - fakeReturns := fake.generateAWSCloudFormationTemplateReturns - fake.recordInvocation("GenerateAWSCloudFormationTemplate", []interface{}{}) - fake.generateAWSCloudFormationTemplateMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GenerateAWSCloudFormationTemplateCallCount() int { - fake.generateAWSCloudFormationTemplateMutex.RLock() - defer fake.generateAWSCloudFormationTemplateMutex.RUnlock() - return len(fake.generateAWSCloudFormationTemplateArgsForCall) -} - -func (fake *Client) GenerateAWSCloudFormationTemplateCalls(stub func() (string, error)) { - fake.generateAWSCloudFormationTemplateMutex.Lock() - defer fake.generateAWSCloudFormationTemplateMutex.Unlock() - fake.GenerateAWSCloudFormationTemplateStub = stub -} - -func (fake *Client) GenerateAWSCloudFormationTemplateReturns(result1 string, result2 error) { - fake.generateAWSCloudFormationTemplateMutex.Lock() - defer fake.generateAWSCloudFormationTemplateMutex.Unlock() - fake.GenerateAWSCloudFormationTemplateStub = nil - fake.generateAWSCloudFormationTemplateReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *Client) GenerateAWSCloudFormationTemplateReturnsOnCall(i int, result1 string, result2 error) { - fake.generateAWSCloudFormationTemplateMutex.Lock() - defer fake.generateAWSCloudFormationTemplateMutex.Unlock() - fake.GenerateAWSCloudFormationTemplateStub = nil - if fake.generateAWSCloudFormationTemplateReturnsOnCall == nil { - fake.generateAWSCloudFormationTemplateReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.generateAWSCloudFormationTemplateReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *Client) GetCEIPParticipation() (client.ClusterCeipInfo, error) { - fake.getCEIPParticipationMutex.Lock() - ret, specificReturn := fake.getCEIPParticipationReturnsOnCall[len(fake.getCEIPParticipationArgsForCall)] - fake.getCEIPParticipationArgsForCall = append(fake.getCEIPParticipationArgsForCall, struct { - }{}) - stub := fake.GetCEIPParticipationStub - fakeReturns := fake.getCEIPParticipationReturns - fake.recordInvocation("GetCEIPParticipation", []interface{}{}) - fake.getCEIPParticipationMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetCEIPParticipationCallCount() int { - fake.getCEIPParticipationMutex.RLock() - defer fake.getCEIPParticipationMutex.RUnlock() - return len(fake.getCEIPParticipationArgsForCall) -} - -func (fake *Client) GetCEIPParticipationCalls(stub func() (client.ClusterCeipInfo, error)) { - fake.getCEIPParticipationMutex.Lock() - defer fake.getCEIPParticipationMutex.Unlock() - fake.GetCEIPParticipationStub = stub -} - -func (fake *Client) GetCEIPParticipationReturns(result1 client.ClusterCeipInfo, result2 error) { - fake.getCEIPParticipationMutex.Lock() - defer fake.getCEIPParticipationMutex.Unlock() - fake.GetCEIPParticipationStub = nil - fake.getCEIPParticipationReturns = struct { - result1 client.ClusterCeipInfo - result2 error - }{result1, result2} -} - -func (fake *Client) GetCEIPParticipationReturnsOnCall(i int, result1 client.ClusterCeipInfo, result2 error) { - fake.getCEIPParticipationMutex.Lock() - defer fake.getCEIPParticipationMutex.Unlock() - fake.GetCEIPParticipationStub = nil - if fake.getCEIPParticipationReturnsOnCall == nil { - fake.getCEIPParticipationReturnsOnCall = make(map[int]struct { - result1 client.ClusterCeipInfo - result2 error - }) - } - fake.getCEIPParticipationReturnsOnCall[i] = struct { - result1 client.ClusterCeipInfo - result2 error - }{result1, result2} -} - -func (fake *Client) GetClusterConfiguration(arg1 *client.CreateClusterOptions) ([]byte, error) { - fake.getClusterConfigurationMutex.Lock() - ret, specificReturn := fake.getClusterConfigurationReturnsOnCall[len(fake.getClusterConfigurationArgsForCall)] - fake.getClusterConfigurationArgsForCall = append(fake.getClusterConfigurationArgsForCall, struct { - arg1 *client.CreateClusterOptions - }{arg1}) - stub := fake.GetClusterConfigurationStub - fakeReturns := fake.getClusterConfigurationReturns - fake.recordInvocation("GetClusterConfiguration", []interface{}{arg1}) - fake.getClusterConfigurationMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetClusterConfigurationCallCount() int { - fake.getClusterConfigurationMutex.RLock() - defer fake.getClusterConfigurationMutex.RUnlock() - return len(fake.getClusterConfigurationArgsForCall) -} - -func (fake *Client) GetClusterConfigurationCalls(stub func(*client.CreateClusterOptions) ([]byte, error)) { - fake.getClusterConfigurationMutex.Lock() - defer fake.getClusterConfigurationMutex.Unlock() - fake.GetClusterConfigurationStub = stub -} - -func (fake *Client) GetClusterConfigurationArgsForCall(i int) *client.CreateClusterOptions { - fake.getClusterConfigurationMutex.RLock() - defer fake.getClusterConfigurationMutex.RUnlock() - argsForCall := fake.getClusterConfigurationArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) GetClusterConfigurationReturns(result1 []byte, result2 error) { - fake.getClusterConfigurationMutex.Lock() - defer fake.getClusterConfigurationMutex.Unlock() - fake.GetClusterConfigurationStub = nil - fake.getClusterConfigurationReturns = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *Client) GetClusterConfigurationReturnsOnCall(i int, result1 []byte, result2 error) { - fake.getClusterConfigurationMutex.Lock() - defer fake.getClusterConfigurationMutex.Unlock() - fake.GetClusterConfigurationStub = nil - if fake.getClusterConfigurationReturnsOnCall == nil { - fake.getClusterConfigurationReturnsOnCall = make(map[int]struct { - result1 []byte - result2 error - }) - } - fake.getClusterConfigurationReturnsOnCall[i] = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *Client) GetClusterPinnipedInfo(arg1 client.GetClusterPinnipedInfoOptions) (*client.ClusterPinnipedInfo, error) { - fake.getClusterPinnipedInfoMutex.Lock() - ret, specificReturn := fake.getClusterPinnipedInfoReturnsOnCall[len(fake.getClusterPinnipedInfoArgsForCall)] - fake.getClusterPinnipedInfoArgsForCall = append(fake.getClusterPinnipedInfoArgsForCall, struct { - arg1 client.GetClusterPinnipedInfoOptions - }{arg1}) - stub := fake.GetClusterPinnipedInfoStub - fakeReturns := fake.getClusterPinnipedInfoReturns - fake.recordInvocation("GetClusterPinnipedInfo", []interface{}{arg1}) - fake.getClusterPinnipedInfoMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetClusterPinnipedInfoCallCount() int { - fake.getClusterPinnipedInfoMutex.RLock() - defer fake.getClusterPinnipedInfoMutex.RUnlock() - return len(fake.getClusterPinnipedInfoArgsForCall) -} - -func (fake *Client) GetClusterPinnipedInfoCalls(stub func(client.GetClusterPinnipedInfoOptions) (*client.ClusterPinnipedInfo, error)) { - fake.getClusterPinnipedInfoMutex.Lock() - defer fake.getClusterPinnipedInfoMutex.Unlock() - fake.GetClusterPinnipedInfoStub = stub -} - -func (fake *Client) GetClusterPinnipedInfoArgsForCall(i int) client.GetClusterPinnipedInfoOptions { - fake.getClusterPinnipedInfoMutex.RLock() - defer fake.getClusterPinnipedInfoMutex.RUnlock() - argsForCall := fake.getClusterPinnipedInfoArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) GetClusterPinnipedInfoReturns(result1 *client.ClusterPinnipedInfo, result2 error) { - fake.getClusterPinnipedInfoMutex.Lock() - defer fake.getClusterPinnipedInfoMutex.Unlock() - fake.GetClusterPinnipedInfoStub = nil - fake.getClusterPinnipedInfoReturns = struct { - result1 *client.ClusterPinnipedInfo - result2 error - }{result1, result2} -} - -func (fake *Client) GetClusterPinnipedInfoReturnsOnCall(i int, result1 *client.ClusterPinnipedInfo, result2 error) { - fake.getClusterPinnipedInfoMutex.Lock() - defer fake.getClusterPinnipedInfoMutex.Unlock() - fake.GetClusterPinnipedInfoStub = nil - if fake.getClusterPinnipedInfoReturnsOnCall == nil { - fake.getClusterPinnipedInfoReturnsOnCall = make(map[int]struct { - result1 *client.ClusterPinnipedInfo - result2 error - }) - } - fake.getClusterPinnipedInfoReturnsOnCall[i] = struct { - result1 *client.ClusterPinnipedInfo - result2 error - }{result1, result2} -} - -func (fake *Client) GetCurrentRegionContext() (region.RegionContext, error) { - fake.getCurrentRegionContextMutex.Lock() - ret, specificReturn := fake.getCurrentRegionContextReturnsOnCall[len(fake.getCurrentRegionContextArgsForCall)] - fake.getCurrentRegionContextArgsForCall = append(fake.getCurrentRegionContextArgsForCall, struct { - }{}) - stub := fake.GetCurrentRegionContextStub - fakeReturns := fake.getCurrentRegionContextReturns - fake.recordInvocation("GetCurrentRegionContext", []interface{}{}) - fake.getCurrentRegionContextMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetCurrentRegionContextCallCount() int { - fake.getCurrentRegionContextMutex.RLock() - defer fake.getCurrentRegionContextMutex.RUnlock() - return len(fake.getCurrentRegionContextArgsForCall) -} - -func (fake *Client) GetCurrentRegionContextCalls(stub func() (region.RegionContext, error)) { - fake.getCurrentRegionContextMutex.Lock() - defer fake.getCurrentRegionContextMutex.Unlock() - fake.GetCurrentRegionContextStub = stub -} - -func (fake *Client) GetCurrentRegionContextReturns(result1 region.RegionContext, result2 error) { - fake.getCurrentRegionContextMutex.Lock() - defer fake.getCurrentRegionContextMutex.Unlock() - fake.GetCurrentRegionContextStub = nil - fake.getCurrentRegionContextReturns = struct { - result1 region.RegionContext - result2 error - }{result1, result2} -} - -func (fake *Client) GetCurrentRegionContextReturnsOnCall(i int, result1 region.RegionContext, result2 error) { - fake.getCurrentRegionContextMutex.Lock() - defer fake.getCurrentRegionContextMutex.Unlock() - fake.GetCurrentRegionContextStub = nil - if fake.getCurrentRegionContextReturnsOnCall == nil { - fake.getCurrentRegionContextReturnsOnCall = make(map[int]struct { - result1 region.RegionContext - result2 error - }) - } - fake.getCurrentRegionContextReturnsOnCall[i] = struct { - result1 region.RegionContext - result2 error - }{result1, result2} -} - -func (fake *Client) GetKubernetesVersions() (*client.KubernetesVersionsInfo, error) { - fake.getKubernetesVersionsMutex.Lock() - ret, specificReturn := fake.getKubernetesVersionsReturnsOnCall[len(fake.getKubernetesVersionsArgsForCall)] - fake.getKubernetesVersionsArgsForCall = append(fake.getKubernetesVersionsArgsForCall, struct { - }{}) - stub := fake.GetKubernetesVersionsStub - fakeReturns := fake.getKubernetesVersionsReturns - fake.recordInvocation("GetKubernetesVersions", []interface{}{}) - fake.getKubernetesVersionsMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetKubernetesVersionsCallCount() int { - fake.getKubernetesVersionsMutex.RLock() - defer fake.getKubernetesVersionsMutex.RUnlock() - return len(fake.getKubernetesVersionsArgsForCall) -} - -func (fake *Client) GetKubernetesVersionsCalls(stub func() (*client.KubernetesVersionsInfo, error)) { - fake.getKubernetesVersionsMutex.Lock() - defer fake.getKubernetesVersionsMutex.Unlock() - fake.GetKubernetesVersionsStub = stub -} - -func (fake *Client) GetKubernetesVersionsReturns(result1 *client.KubernetesVersionsInfo, result2 error) { - fake.getKubernetesVersionsMutex.Lock() - defer fake.getKubernetesVersionsMutex.Unlock() - fake.GetKubernetesVersionsStub = nil - fake.getKubernetesVersionsReturns = struct { - result1 *client.KubernetesVersionsInfo - result2 error - }{result1, result2} -} - -func (fake *Client) GetKubernetesVersionsReturnsOnCall(i int, result1 *client.KubernetesVersionsInfo, result2 error) { - fake.getKubernetesVersionsMutex.Lock() - defer fake.getKubernetesVersionsMutex.Unlock() - fake.GetKubernetesVersionsStub = nil - if fake.getKubernetesVersionsReturnsOnCall == nil { - fake.getKubernetesVersionsReturnsOnCall = make(map[int]struct { - result1 *client.KubernetesVersionsInfo - result2 error - }) - } - fake.getKubernetesVersionsReturnsOnCall[i] = struct { - result1 *client.KubernetesVersionsInfo - result2 error - }{result1, result2} -} - -func (fake *Client) GetMachineDeployments(arg1 client.GetMachineDeploymentOptions) ([]v1beta1.MachineDeployment, error) { - fake.getMachineDeploymentsMutex.Lock() - ret, specificReturn := fake.getMachineDeploymentsReturnsOnCall[len(fake.getMachineDeploymentsArgsForCall)] - fake.getMachineDeploymentsArgsForCall = append(fake.getMachineDeploymentsArgsForCall, struct { - arg1 client.GetMachineDeploymentOptions - }{arg1}) - stub := fake.GetMachineDeploymentsStub - fakeReturns := fake.getMachineDeploymentsReturns - fake.recordInvocation("GetMachineDeployments", []interface{}{arg1}) - fake.getMachineDeploymentsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetMachineDeploymentsCallCount() int { - fake.getMachineDeploymentsMutex.RLock() - defer fake.getMachineDeploymentsMutex.RUnlock() - return len(fake.getMachineDeploymentsArgsForCall) -} - -func (fake *Client) GetMachineDeploymentsCalls(stub func(client.GetMachineDeploymentOptions) ([]v1beta1.MachineDeployment, error)) { - fake.getMachineDeploymentsMutex.Lock() - defer fake.getMachineDeploymentsMutex.Unlock() - fake.GetMachineDeploymentsStub = stub -} - -func (fake *Client) GetMachineDeploymentsArgsForCall(i int) client.GetMachineDeploymentOptions { - fake.getMachineDeploymentsMutex.RLock() - defer fake.getMachineDeploymentsMutex.RUnlock() - argsForCall := fake.getMachineDeploymentsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) GetMachineDeploymentsReturns(result1 []v1beta1.MachineDeployment, result2 error) { - fake.getMachineDeploymentsMutex.Lock() - defer fake.getMachineDeploymentsMutex.Unlock() - fake.GetMachineDeploymentsStub = nil - fake.getMachineDeploymentsReturns = struct { - result1 []v1beta1.MachineDeployment - result2 error - }{result1, result2} -} - -func (fake *Client) GetMachineDeploymentsReturnsOnCall(i int, result1 []v1beta1.MachineDeployment, result2 error) { - fake.getMachineDeploymentsMutex.Lock() - defer fake.getMachineDeploymentsMutex.Unlock() - fake.GetMachineDeploymentsStub = nil - if fake.getMachineDeploymentsReturnsOnCall == nil { - fake.getMachineDeploymentsReturnsOnCall = make(map[int]struct { - result1 []v1beta1.MachineDeployment - result2 error - }) - } - fake.getMachineDeploymentsReturnsOnCall[i] = struct { - result1 []v1beta1.MachineDeployment - result2 error - }{result1, result2} -} - -func (fake *Client) GetMachineHealthChecks(arg1 client.MachineHealthCheckOptions) ([]client.MachineHealthCheck, error) { - fake.getMachineHealthChecksMutex.Lock() - ret, specificReturn := fake.getMachineHealthChecksReturnsOnCall[len(fake.getMachineHealthChecksArgsForCall)] - fake.getMachineHealthChecksArgsForCall = append(fake.getMachineHealthChecksArgsForCall, struct { - arg1 client.MachineHealthCheckOptions - }{arg1}) - stub := fake.GetMachineHealthChecksStub - fakeReturns := fake.getMachineHealthChecksReturns - fake.recordInvocation("GetMachineHealthChecks", []interface{}{arg1}) - fake.getMachineHealthChecksMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetMachineHealthChecksCallCount() int { - fake.getMachineHealthChecksMutex.RLock() - defer fake.getMachineHealthChecksMutex.RUnlock() - return len(fake.getMachineHealthChecksArgsForCall) -} - -func (fake *Client) GetMachineHealthChecksCalls(stub func(client.MachineHealthCheckOptions) ([]client.MachineHealthCheck, error)) { - fake.getMachineHealthChecksMutex.Lock() - defer fake.getMachineHealthChecksMutex.Unlock() - fake.GetMachineHealthChecksStub = stub -} - -func (fake *Client) GetMachineHealthChecksArgsForCall(i int) client.MachineHealthCheckOptions { - fake.getMachineHealthChecksMutex.RLock() - defer fake.getMachineHealthChecksMutex.RUnlock() - argsForCall := fake.getMachineHealthChecksArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) GetMachineHealthChecksReturns(result1 []client.MachineHealthCheck, result2 error) { - fake.getMachineHealthChecksMutex.Lock() - defer fake.getMachineHealthChecksMutex.Unlock() - fake.GetMachineHealthChecksStub = nil - fake.getMachineHealthChecksReturns = struct { - result1 []client.MachineHealthCheck - result2 error - }{result1, result2} -} - -func (fake *Client) GetMachineHealthChecksReturnsOnCall(i int, result1 []client.MachineHealthCheck, result2 error) { - fake.getMachineHealthChecksMutex.Lock() - defer fake.getMachineHealthChecksMutex.Unlock() - fake.GetMachineHealthChecksStub = nil - if fake.getMachineHealthChecksReturnsOnCall == nil { - fake.getMachineHealthChecksReturnsOnCall = make(map[int]struct { - result1 []client.MachineHealthCheck - result2 error - }) - } - fake.getMachineHealthChecksReturnsOnCall[i] = struct { - result1 []client.MachineHealthCheck - result2 error - }{result1, result2} -} - -func (fake *Client) GetPacificClusterObject(arg1 string, arg2 string) (*v1alpha2.TanzuKubernetesCluster, error) { - fake.getPacificClusterObjectMutex.Lock() - ret, specificReturn := fake.getPacificClusterObjectReturnsOnCall[len(fake.getPacificClusterObjectArgsForCall)] - fake.getPacificClusterObjectArgsForCall = append(fake.getPacificClusterObjectArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetPacificClusterObjectStub - fakeReturns := fake.getPacificClusterObjectReturns - fake.recordInvocation("GetPacificClusterObject", []interface{}{arg1, arg2}) - fake.getPacificClusterObjectMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetPacificClusterObjectCallCount() int { - fake.getPacificClusterObjectMutex.RLock() - defer fake.getPacificClusterObjectMutex.RUnlock() - return len(fake.getPacificClusterObjectArgsForCall) -} - -func (fake *Client) GetPacificClusterObjectCalls(stub func(string, string) (*v1alpha2.TanzuKubernetesCluster, error)) { - fake.getPacificClusterObjectMutex.Lock() - defer fake.getPacificClusterObjectMutex.Unlock() - fake.GetPacificClusterObjectStub = stub -} - -func (fake *Client) GetPacificClusterObjectArgsForCall(i int) (string, string) { - fake.getPacificClusterObjectMutex.RLock() - defer fake.getPacificClusterObjectMutex.RUnlock() - argsForCall := fake.getPacificClusterObjectArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Client) GetPacificClusterObjectReturns(result1 *v1alpha2.TanzuKubernetesCluster, result2 error) { - fake.getPacificClusterObjectMutex.Lock() - defer fake.getPacificClusterObjectMutex.Unlock() - fake.GetPacificClusterObjectStub = nil - fake.getPacificClusterObjectReturns = struct { - result1 *v1alpha2.TanzuKubernetesCluster - result2 error - }{result1, result2} -} - -func (fake *Client) GetPacificClusterObjectReturnsOnCall(i int, result1 *v1alpha2.TanzuKubernetesCluster, result2 error) { - fake.getPacificClusterObjectMutex.Lock() - defer fake.getPacificClusterObjectMutex.Unlock() - fake.GetPacificClusterObjectStub = nil - if fake.getPacificClusterObjectReturnsOnCall == nil { - fake.getPacificClusterObjectReturnsOnCall = make(map[int]struct { - result1 *v1alpha2.TanzuKubernetesCluster - result2 error - }) - } - fake.getPacificClusterObjectReturnsOnCall[i] = struct { - result1 *v1alpha2.TanzuKubernetesCluster - result2 error - }{result1, result2} -} - -func (fake *Client) GetPacificMachineDeployments(arg1 client.GetMachineDeploymentOptions) ([]v1alpha3a.MachineDeployment, error) { - fake.getPacificMachineDeploymentsMutex.Lock() - ret, specificReturn := fake.getPacificMachineDeploymentsReturnsOnCall[len(fake.getPacificMachineDeploymentsArgsForCall)] - fake.getPacificMachineDeploymentsArgsForCall = append(fake.getPacificMachineDeploymentsArgsForCall, struct { - arg1 client.GetMachineDeploymentOptions - }{arg1}) - stub := fake.GetPacificMachineDeploymentsStub - fakeReturns := fake.getPacificMachineDeploymentsReturns - fake.recordInvocation("GetPacificMachineDeployments", []interface{}{arg1}) - fake.getPacificMachineDeploymentsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetPacificMachineDeploymentsCallCount() int { - fake.getPacificMachineDeploymentsMutex.RLock() - defer fake.getPacificMachineDeploymentsMutex.RUnlock() - return len(fake.getPacificMachineDeploymentsArgsForCall) -} - -func (fake *Client) GetPacificMachineDeploymentsCalls(stub func(client.GetMachineDeploymentOptions) ([]v1alpha3a.MachineDeployment, error)) { - fake.getPacificMachineDeploymentsMutex.Lock() - defer fake.getPacificMachineDeploymentsMutex.Unlock() - fake.GetPacificMachineDeploymentsStub = stub -} - -func (fake *Client) GetPacificMachineDeploymentsArgsForCall(i int) client.GetMachineDeploymentOptions { - fake.getPacificMachineDeploymentsMutex.RLock() - defer fake.getPacificMachineDeploymentsMutex.RUnlock() - argsForCall := fake.getPacificMachineDeploymentsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) GetPacificMachineDeploymentsReturns(result1 []v1alpha3a.MachineDeployment, result2 error) { - fake.getPacificMachineDeploymentsMutex.Lock() - defer fake.getPacificMachineDeploymentsMutex.Unlock() - fake.GetPacificMachineDeploymentsStub = nil - fake.getPacificMachineDeploymentsReturns = struct { - result1 []v1alpha3a.MachineDeployment - result2 error - }{result1, result2} -} - -func (fake *Client) GetPacificMachineDeploymentsReturnsOnCall(i int, result1 []v1alpha3a.MachineDeployment, result2 error) { - fake.getPacificMachineDeploymentsMutex.Lock() - defer fake.getPacificMachineDeploymentsMutex.Unlock() - fake.GetPacificMachineDeploymentsStub = nil - if fake.getPacificMachineDeploymentsReturnsOnCall == nil { - fake.getPacificMachineDeploymentsReturnsOnCall = make(map[int]struct { - result1 []v1alpha3a.MachineDeployment - result2 error - }) - } - fake.getPacificMachineDeploymentsReturnsOnCall[i] = struct { - result1 []v1alpha3a.MachineDeployment - result2 error - }{result1, result2} -} - -func (fake *Client) GetRegionContexts(arg1 string) ([]region.RegionContext, error) { - fake.getRegionContextsMutex.Lock() - ret, specificReturn := fake.getRegionContextsReturnsOnCall[len(fake.getRegionContextsArgsForCall)] - fake.getRegionContextsArgsForCall = append(fake.getRegionContextsArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetRegionContextsStub - fakeReturns := fake.getRegionContextsReturns - fake.recordInvocation("GetRegionContexts", []interface{}{arg1}) - fake.getRegionContextsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetRegionContextsCallCount() int { - fake.getRegionContextsMutex.RLock() - defer fake.getRegionContextsMutex.RUnlock() - return len(fake.getRegionContextsArgsForCall) -} - -func (fake *Client) GetRegionContextsCalls(stub func(string) ([]region.RegionContext, error)) { - fake.getRegionContextsMutex.Lock() - defer fake.getRegionContextsMutex.Unlock() - fake.GetRegionContextsStub = stub -} - -func (fake *Client) GetRegionContextsArgsForCall(i int) string { - fake.getRegionContextsMutex.RLock() - defer fake.getRegionContextsMutex.RUnlock() - argsForCall := fake.getRegionContextsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) GetRegionContextsReturns(result1 []region.RegionContext, result2 error) { - fake.getRegionContextsMutex.Lock() - defer fake.getRegionContextsMutex.Unlock() - fake.GetRegionContextsStub = nil - fake.getRegionContextsReturns = struct { - result1 []region.RegionContext - result2 error - }{result1, result2} -} - -func (fake *Client) GetRegionContextsReturnsOnCall(i int, result1 []region.RegionContext, result2 error) { - fake.getRegionContextsMutex.Lock() - defer fake.getRegionContextsMutex.Unlock() - fake.GetRegionContextsStub = nil - if fake.getRegionContextsReturnsOnCall == nil { - fake.getRegionContextsReturnsOnCall = make(map[int]struct { - result1 []region.RegionContext - result2 error - }) - } - fake.getRegionContextsReturnsOnCall[i] = struct { - result1 []region.RegionContext - result2 error - }{result1, result2} -} - -func (fake *Client) GetTanzuKubernetesReleases(arg1 string) ([]v1alpha1.TanzuKubernetesRelease, error) { - fake.getTanzuKubernetesReleasesMutex.Lock() - ret, specificReturn := fake.getTanzuKubernetesReleasesReturnsOnCall[len(fake.getTanzuKubernetesReleasesArgsForCall)] - fake.getTanzuKubernetesReleasesArgsForCall = append(fake.getTanzuKubernetesReleasesArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetTanzuKubernetesReleasesStub - fakeReturns := fake.getTanzuKubernetesReleasesReturns - fake.recordInvocation("GetTanzuKubernetesReleases", []interface{}{arg1}) - fake.getTanzuKubernetesReleasesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetTanzuKubernetesReleasesCallCount() int { - fake.getTanzuKubernetesReleasesMutex.RLock() - defer fake.getTanzuKubernetesReleasesMutex.RUnlock() - return len(fake.getTanzuKubernetesReleasesArgsForCall) -} - -func (fake *Client) GetTanzuKubernetesReleasesCalls(stub func(string) ([]v1alpha1.TanzuKubernetesRelease, error)) { - fake.getTanzuKubernetesReleasesMutex.Lock() - defer fake.getTanzuKubernetesReleasesMutex.Unlock() - fake.GetTanzuKubernetesReleasesStub = stub -} - -func (fake *Client) GetTanzuKubernetesReleasesArgsForCall(i int) string { - fake.getTanzuKubernetesReleasesMutex.RLock() - defer fake.getTanzuKubernetesReleasesMutex.RUnlock() - argsForCall := fake.getTanzuKubernetesReleasesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) GetTanzuKubernetesReleasesReturns(result1 []v1alpha1.TanzuKubernetesRelease, result2 error) { - fake.getTanzuKubernetesReleasesMutex.Lock() - defer fake.getTanzuKubernetesReleasesMutex.Unlock() - fake.GetTanzuKubernetesReleasesStub = nil - fake.getTanzuKubernetesReleasesReturns = struct { - result1 []v1alpha1.TanzuKubernetesRelease - result2 error - }{result1, result2} -} - -func (fake *Client) GetTanzuKubernetesReleasesReturnsOnCall(i int, result1 []v1alpha1.TanzuKubernetesRelease, result2 error) { - fake.getTanzuKubernetesReleasesMutex.Lock() - defer fake.getTanzuKubernetesReleasesMutex.Unlock() - fake.GetTanzuKubernetesReleasesStub = nil - if fake.getTanzuKubernetesReleasesReturnsOnCall == nil { - fake.getTanzuKubernetesReleasesReturnsOnCall = make(map[int]struct { - result1 []v1alpha1.TanzuKubernetesRelease - result2 error - }) - } - fake.getTanzuKubernetesReleasesReturnsOnCall[i] = struct { - result1 []v1alpha1.TanzuKubernetesRelease - result2 error - }{result1, result2} -} - -func (fake *Client) GetVSphereEndpoint(arg1 clusterclient.Client) (vc.Client, error) { - fake.getVSphereEndpointMutex.Lock() - ret, specificReturn := fake.getVSphereEndpointReturnsOnCall[len(fake.getVSphereEndpointArgsForCall)] - fake.getVSphereEndpointArgsForCall = append(fake.getVSphereEndpointArgsForCall, struct { - arg1 clusterclient.Client - }{arg1}) - stub := fake.GetVSphereEndpointStub - fakeReturns := fake.getVSphereEndpointReturns - fake.recordInvocation("GetVSphereEndpoint", []interface{}{arg1}) - fake.getVSphereEndpointMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) GetVSphereEndpointCallCount() int { - fake.getVSphereEndpointMutex.RLock() - defer fake.getVSphereEndpointMutex.RUnlock() - return len(fake.getVSphereEndpointArgsForCall) -} - -func (fake *Client) GetVSphereEndpointCalls(stub func(clusterclient.Client) (vc.Client, error)) { - fake.getVSphereEndpointMutex.Lock() - defer fake.getVSphereEndpointMutex.Unlock() - fake.GetVSphereEndpointStub = stub -} - -func (fake *Client) GetVSphereEndpointArgsForCall(i int) clusterclient.Client { - fake.getVSphereEndpointMutex.RLock() - defer fake.getVSphereEndpointMutex.RUnlock() - argsForCall := fake.getVSphereEndpointArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) GetVSphereEndpointReturns(result1 vc.Client, result2 error) { - fake.getVSphereEndpointMutex.Lock() - defer fake.getVSphereEndpointMutex.Unlock() - fake.GetVSphereEndpointStub = nil - fake.getVSphereEndpointReturns = struct { - result1 vc.Client - result2 error - }{result1, result2} -} - -func (fake *Client) GetVSphereEndpointReturnsOnCall(i int, result1 vc.Client, result2 error) { - fake.getVSphereEndpointMutex.Lock() - defer fake.getVSphereEndpointMutex.Unlock() - fake.GetVSphereEndpointStub = nil - if fake.getVSphereEndpointReturnsOnCall == nil { - fake.getVSphereEndpointReturnsOnCall = make(map[int]struct { - result1 vc.Client - result2 error - }) - } - fake.getVSphereEndpointReturnsOnCall[i] = struct { - result1 vc.Client - result2 error - }{result1, result2} -} - -func (fake *Client) GetWorkloadClusterCredentials(arg1 client.GetWorkloadClusterCredentialsOptions) (string, string, error) { - fake.getWorkloadClusterCredentialsMutex.Lock() - ret, specificReturn := fake.getWorkloadClusterCredentialsReturnsOnCall[len(fake.getWorkloadClusterCredentialsArgsForCall)] - fake.getWorkloadClusterCredentialsArgsForCall = append(fake.getWorkloadClusterCredentialsArgsForCall, struct { - arg1 client.GetWorkloadClusterCredentialsOptions - }{arg1}) - stub := fake.GetWorkloadClusterCredentialsStub - fakeReturns := fake.getWorkloadClusterCredentialsReturns - fake.recordInvocation("GetWorkloadClusterCredentials", []interface{}{arg1}) - fake.getWorkloadClusterCredentialsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *Client) GetWorkloadClusterCredentialsCallCount() int { - fake.getWorkloadClusterCredentialsMutex.RLock() - defer fake.getWorkloadClusterCredentialsMutex.RUnlock() - return len(fake.getWorkloadClusterCredentialsArgsForCall) -} - -func (fake *Client) GetWorkloadClusterCredentialsCalls(stub func(client.GetWorkloadClusterCredentialsOptions) (string, string, error)) { - fake.getWorkloadClusterCredentialsMutex.Lock() - defer fake.getWorkloadClusterCredentialsMutex.Unlock() - fake.GetWorkloadClusterCredentialsStub = stub -} - -func (fake *Client) GetWorkloadClusterCredentialsArgsForCall(i int) client.GetWorkloadClusterCredentialsOptions { - fake.getWorkloadClusterCredentialsMutex.RLock() - defer fake.getWorkloadClusterCredentialsMutex.RUnlock() - argsForCall := fake.getWorkloadClusterCredentialsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) GetWorkloadClusterCredentialsReturns(result1 string, result2 string, result3 error) { - fake.getWorkloadClusterCredentialsMutex.Lock() - defer fake.getWorkloadClusterCredentialsMutex.Unlock() - fake.GetWorkloadClusterCredentialsStub = nil - fake.getWorkloadClusterCredentialsReturns = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *Client) GetWorkloadClusterCredentialsReturnsOnCall(i int, result1 string, result2 string, result3 error) { - fake.getWorkloadClusterCredentialsMutex.Lock() - defer fake.getWorkloadClusterCredentialsMutex.Unlock() - fake.GetWorkloadClusterCredentialsStub = nil - if fake.getWorkloadClusterCredentialsReturnsOnCall == nil { - fake.getWorkloadClusterCredentialsReturnsOnCall = make(map[int]struct { - result1 string - result2 string - result3 error - }) - } - fake.getWorkloadClusterCredentialsReturnsOnCall[i] = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *Client) InitRegion(arg1 *client.InitRegionOptions) error { - fake.initRegionMutex.Lock() - ret, specificReturn := fake.initRegionReturnsOnCall[len(fake.initRegionArgsForCall)] - fake.initRegionArgsForCall = append(fake.initRegionArgsForCall, struct { - arg1 *client.InitRegionOptions - }{arg1}) - stub := fake.InitRegionStub - fakeReturns := fake.initRegionReturns - fake.recordInvocation("InitRegion", []interface{}{arg1}) - fake.initRegionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) InitRegionCallCount() int { - fake.initRegionMutex.RLock() - defer fake.initRegionMutex.RUnlock() - return len(fake.initRegionArgsForCall) -} - -func (fake *Client) InitRegionCalls(stub func(*client.InitRegionOptions) error) { - fake.initRegionMutex.Lock() - defer fake.initRegionMutex.Unlock() - fake.InitRegionStub = stub -} - -func (fake *Client) InitRegionArgsForCall(i int) *client.InitRegionOptions { - fake.initRegionMutex.RLock() - defer fake.initRegionMutex.RUnlock() - argsForCall := fake.initRegionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) InitRegionReturns(result1 error) { - fake.initRegionMutex.Lock() - defer fake.initRegionMutex.Unlock() - fake.InitRegionStub = nil - fake.initRegionReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) InitRegionReturnsOnCall(i int, result1 error) { - fake.initRegionMutex.Lock() - defer fake.initRegionMutex.Unlock() - fake.InitRegionStub = nil - if fake.initRegionReturnsOnCall == nil { - fake.initRegionReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.initRegionReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) InitRegionDryRun(arg1 *client.InitRegionOptions) ([]byte, error) { - fake.initRegionDryRunMutex.Lock() - ret, specificReturn := fake.initRegionDryRunReturnsOnCall[len(fake.initRegionDryRunArgsForCall)] - fake.initRegionDryRunArgsForCall = append(fake.initRegionDryRunArgsForCall, struct { - arg1 *client.InitRegionOptions - }{arg1}) - stub := fake.InitRegionDryRunStub - fakeReturns := fake.initRegionDryRunReturns - fake.recordInvocation("InitRegionDryRun", []interface{}{arg1}) - fake.initRegionDryRunMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) InitRegionDryRunCallCount() int { - fake.initRegionDryRunMutex.RLock() - defer fake.initRegionDryRunMutex.RUnlock() - return len(fake.initRegionDryRunArgsForCall) -} - -func (fake *Client) InitRegionDryRunCalls(stub func(*client.InitRegionOptions) ([]byte, error)) { - fake.initRegionDryRunMutex.Lock() - defer fake.initRegionDryRunMutex.Unlock() - fake.InitRegionDryRunStub = stub -} - -func (fake *Client) InitRegionDryRunArgsForCall(i int) *client.InitRegionOptions { - fake.initRegionDryRunMutex.RLock() - defer fake.initRegionDryRunMutex.RUnlock() - argsForCall := fake.initRegionDryRunArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) InitRegionDryRunReturns(result1 []byte, result2 error) { - fake.initRegionDryRunMutex.Lock() - defer fake.initRegionDryRunMutex.Unlock() - fake.InitRegionDryRunStub = nil - fake.initRegionDryRunReturns = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *Client) InitRegionDryRunReturnsOnCall(i int, result1 []byte, result2 error) { - fake.initRegionDryRunMutex.Lock() - defer fake.initRegionDryRunMutex.Unlock() - fake.InitRegionDryRunStub = nil - if fake.initRegionDryRunReturnsOnCall == nil { - fake.initRegionDryRunReturnsOnCall = make(map[int]struct { - result1 []byte - result2 error - }) - } - fake.initRegionDryRunReturnsOnCall[i] = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *Client) IsFeatureActivated(arg1 string) bool { - fake.isFeatureActivatedMutex.Lock() - ret, specificReturn := fake.isFeatureActivatedReturnsOnCall[len(fake.isFeatureActivatedArgsForCall)] - fake.isFeatureActivatedArgsForCall = append(fake.isFeatureActivatedArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.IsFeatureActivatedStub - fakeReturns := fake.isFeatureActivatedReturns - fake.recordInvocation("IsFeatureActivated", []interface{}{arg1}) - fake.isFeatureActivatedMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) IsFeatureActivatedCallCount() int { - fake.isFeatureActivatedMutex.RLock() - defer fake.isFeatureActivatedMutex.RUnlock() - return len(fake.isFeatureActivatedArgsForCall) -} - -func (fake *Client) IsFeatureActivatedCalls(stub func(string) bool) { - fake.isFeatureActivatedMutex.Lock() - defer fake.isFeatureActivatedMutex.Unlock() - fake.IsFeatureActivatedStub = stub -} - -func (fake *Client) IsFeatureActivatedArgsForCall(i int) string { - fake.isFeatureActivatedMutex.RLock() - defer fake.isFeatureActivatedMutex.RUnlock() - argsForCall := fake.isFeatureActivatedArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) IsFeatureActivatedReturns(result1 bool) { - fake.isFeatureActivatedMutex.Lock() - defer fake.isFeatureActivatedMutex.Unlock() - fake.IsFeatureActivatedStub = nil - fake.isFeatureActivatedReturns = struct { - result1 bool - }{result1} -} - -func (fake *Client) IsFeatureActivatedReturnsOnCall(i int, result1 bool) { - fake.isFeatureActivatedMutex.Lock() - defer fake.isFeatureActivatedMutex.Unlock() - fake.IsFeatureActivatedStub = nil - if fake.isFeatureActivatedReturnsOnCall == nil { - fake.isFeatureActivatedReturnsOnCall = make(map[int]struct { - result1 bool - }) - } - fake.isFeatureActivatedReturnsOnCall[i] = struct { - result1 bool - }{result1} -} - -func (fake *Client) IsManagementClusterAKindCluster(arg1 string) (bool, error) { - fake.isManagementClusterAKindClusterMutex.Lock() - ret, specificReturn := fake.isManagementClusterAKindClusterReturnsOnCall[len(fake.isManagementClusterAKindClusterArgsForCall)] - fake.isManagementClusterAKindClusterArgsForCall = append(fake.isManagementClusterAKindClusterArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.IsManagementClusterAKindClusterStub - fakeReturns := fake.isManagementClusterAKindClusterReturns - fake.recordInvocation("IsManagementClusterAKindCluster", []interface{}{arg1}) - fake.isManagementClusterAKindClusterMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) IsManagementClusterAKindClusterCallCount() int { - fake.isManagementClusterAKindClusterMutex.RLock() - defer fake.isManagementClusterAKindClusterMutex.RUnlock() - return len(fake.isManagementClusterAKindClusterArgsForCall) -} - -func (fake *Client) IsManagementClusterAKindClusterCalls(stub func(string) (bool, error)) { - fake.isManagementClusterAKindClusterMutex.Lock() - defer fake.isManagementClusterAKindClusterMutex.Unlock() - fake.IsManagementClusterAKindClusterStub = stub -} - -func (fake *Client) IsManagementClusterAKindClusterArgsForCall(i int) string { - fake.isManagementClusterAKindClusterMutex.RLock() - defer fake.isManagementClusterAKindClusterMutex.RUnlock() - argsForCall := fake.isManagementClusterAKindClusterArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) IsManagementClusterAKindClusterReturns(result1 bool, result2 error) { - fake.isManagementClusterAKindClusterMutex.Lock() - defer fake.isManagementClusterAKindClusterMutex.Unlock() - fake.IsManagementClusterAKindClusterStub = nil - fake.isManagementClusterAKindClusterReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *Client) IsManagementClusterAKindClusterReturnsOnCall(i int, result1 bool, result2 error) { - fake.isManagementClusterAKindClusterMutex.Lock() - defer fake.isManagementClusterAKindClusterMutex.Unlock() - fake.IsManagementClusterAKindClusterStub = nil - if fake.isManagementClusterAKindClusterReturnsOnCall == nil { - fake.isManagementClusterAKindClusterReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.isManagementClusterAKindClusterReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *Client) IsPacificManagementCluster() (bool, error) { - fake.isPacificManagementClusterMutex.Lock() - ret, specificReturn := fake.isPacificManagementClusterReturnsOnCall[len(fake.isPacificManagementClusterArgsForCall)] - fake.isPacificManagementClusterArgsForCall = append(fake.isPacificManagementClusterArgsForCall, struct { - }{}) - stub := fake.IsPacificManagementClusterStub - fakeReturns := fake.isPacificManagementClusterReturns - fake.recordInvocation("IsPacificManagementCluster", []interface{}{}) - fake.isPacificManagementClusterMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) IsPacificManagementClusterCallCount() int { - fake.isPacificManagementClusterMutex.RLock() - defer fake.isPacificManagementClusterMutex.RUnlock() - return len(fake.isPacificManagementClusterArgsForCall) -} - -func (fake *Client) IsPacificManagementClusterCalls(stub func() (bool, error)) { - fake.isPacificManagementClusterMutex.Lock() - defer fake.isPacificManagementClusterMutex.Unlock() - fake.IsPacificManagementClusterStub = stub -} - -func (fake *Client) IsPacificManagementClusterReturns(result1 bool, result2 error) { - fake.isPacificManagementClusterMutex.Lock() - defer fake.isPacificManagementClusterMutex.Unlock() - fake.IsPacificManagementClusterStub = nil - fake.isPacificManagementClusterReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *Client) IsPacificManagementClusterReturnsOnCall(i int, result1 bool, result2 error) { - fake.isPacificManagementClusterMutex.Lock() - defer fake.isPacificManagementClusterMutex.Unlock() - fake.IsPacificManagementClusterStub = nil - if fake.isPacificManagementClusterReturnsOnCall == nil { - fake.isPacificManagementClusterReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.isPacificManagementClusterReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *Client) IsPacificRegionalCluster() (bool, error) { - fake.isPacificRegionalClusterMutex.Lock() - ret, specificReturn := fake.isPacificRegionalClusterReturnsOnCall[len(fake.isPacificRegionalClusterArgsForCall)] - fake.isPacificRegionalClusterArgsForCall = append(fake.isPacificRegionalClusterArgsForCall, struct { - }{}) - stub := fake.IsPacificRegionalClusterStub - fakeReturns := fake.isPacificRegionalClusterReturns - fake.recordInvocation("IsPacificRegionalCluster", []interface{}{}) - fake.isPacificRegionalClusterMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) IsPacificRegionalClusterCallCount() int { - fake.isPacificRegionalClusterMutex.RLock() - defer fake.isPacificRegionalClusterMutex.RUnlock() - return len(fake.isPacificRegionalClusterArgsForCall) -} - -func (fake *Client) IsPacificRegionalClusterCalls(stub func() (bool, error)) { - fake.isPacificRegionalClusterMutex.Lock() - defer fake.isPacificRegionalClusterMutex.Unlock() - fake.IsPacificRegionalClusterStub = stub -} - -func (fake *Client) IsPacificRegionalClusterReturns(result1 bool, result2 error) { - fake.isPacificRegionalClusterMutex.Lock() - defer fake.isPacificRegionalClusterMutex.Unlock() - fake.IsPacificRegionalClusterStub = nil - fake.isPacificRegionalClusterReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *Client) IsPacificRegionalClusterReturnsOnCall(i int, result1 bool, result2 error) { - fake.isPacificRegionalClusterMutex.Lock() - defer fake.isPacificRegionalClusterMutex.Unlock() - fake.IsPacificRegionalClusterStub = nil - if fake.isPacificRegionalClusterReturnsOnCall == nil { - fake.isPacificRegionalClusterReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.isPacificRegionalClusterReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *Client) ListTKGClusters(arg1 client.ListTKGClustersOptions) ([]client.ClusterInfo, error) { - fake.listTKGClustersMutex.Lock() - ret, specificReturn := fake.listTKGClustersReturnsOnCall[len(fake.listTKGClustersArgsForCall)] - fake.listTKGClustersArgsForCall = append(fake.listTKGClustersArgsForCall, struct { - arg1 client.ListTKGClustersOptions - }{arg1}) - stub := fake.ListTKGClustersStub - fakeReturns := fake.listTKGClustersReturns - fake.recordInvocation("ListTKGClusters", []interface{}{arg1}) - fake.listTKGClustersMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) ListTKGClustersCallCount() int { - fake.listTKGClustersMutex.RLock() - defer fake.listTKGClustersMutex.RUnlock() - return len(fake.listTKGClustersArgsForCall) -} - -func (fake *Client) ListTKGClustersCalls(stub func(client.ListTKGClustersOptions) ([]client.ClusterInfo, error)) { - fake.listTKGClustersMutex.Lock() - defer fake.listTKGClustersMutex.Unlock() - fake.ListTKGClustersStub = stub -} - -func (fake *Client) ListTKGClustersArgsForCall(i int) client.ListTKGClustersOptions { - fake.listTKGClustersMutex.RLock() - defer fake.listTKGClustersMutex.RUnlock() - argsForCall := fake.listTKGClustersArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) ListTKGClustersReturns(result1 []client.ClusterInfo, result2 error) { - fake.listTKGClustersMutex.Lock() - defer fake.listTKGClustersMutex.Unlock() - fake.ListTKGClustersStub = nil - fake.listTKGClustersReturns = struct { - result1 []client.ClusterInfo - result2 error - }{result1, result2} -} - -func (fake *Client) ListTKGClustersReturnsOnCall(i int, result1 []client.ClusterInfo, result2 error) { - fake.listTKGClustersMutex.Lock() - defer fake.listTKGClustersMutex.Unlock() - fake.ListTKGClustersStub = nil - if fake.listTKGClustersReturnsOnCall == nil { - fake.listTKGClustersReturnsOnCall = make(map[int]struct { - result1 []client.ClusterInfo - result2 error - }) - } - fake.listTKGClustersReturnsOnCall[i] = struct { - result1 []client.ClusterInfo - result2 error - }{result1, result2} -} - -func (fake *Client) ParseHiddenArgsAsFeatureFlags(arg1 *client.InitRegionOptions) { - fake.parseHiddenArgsAsFeatureFlagsMutex.Lock() - fake.parseHiddenArgsAsFeatureFlagsArgsForCall = append(fake.parseHiddenArgsAsFeatureFlagsArgsForCall, struct { - arg1 *client.InitRegionOptions - }{arg1}) - stub := fake.ParseHiddenArgsAsFeatureFlagsStub - fake.recordInvocation("ParseHiddenArgsAsFeatureFlags", []interface{}{arg1}) - fake.parseHiddenArgsAsFeatureFlagsMutex.Unlock() - if stub != nil { - fake.ParseHiddenArgsAsFeatureFlagsStub(arg1) - } -} - -func (fake *Client) ParseHiddenArgsAsFeatureFlagsCallCount() int { - fake.parseHiddenArgsAsFeatureFlagsMutex.RLock() - defer fake.parseHiddenArgsAsFeatureFlagsMutex.RUnlock() - return len(fake.parseHiddenArgsAsFeatureFlagsArgsForCall) -} - -func (fake *Client) ParseHiddenArgsAsFeatureFlagsCalls(stub func(*client.InitRegionOptions)) { - fake.parseHiddenArgsAsFeatureFlagsMutex.Lock() - defer fake.parseHiddenArgsAsFeatureFlagsMutex.Unlock() - fake.ParseHiddenArgsAsFeatureFlagsStub = stub -} - -func (fake *Client) ParseHiddenArgsAsFeatureFlagsArgsForCall(i int) *client.InitRegionOptions { - fake.parseHiddenArgsAsFeatureFlagsMutex.RLock() - defer fake.parseHiddenArgsAsFeatureFlagsMutex.RUnlock() - argsForCall := fake.parseHiddenArgsAsFeatureFlagsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) SaveFeatureFlags(arg1 map[string]string) error { - fake.saveFeatureFlagsMutex.Lock() - ret, specificReturn := fake.saveFeatureFlagsReturnsOnCall[len(fake.saveFeatureFlagsArgsForCall)] - fake.saveFeatureFlagsArgsForCall = append(fake.saveFeatureFlagsArgsForCall, struct { - arg1 map[string]string - }{arg1}) - stub := fake.SaveFeatureFlagsStub - fakeReturns := fake.saveFeatureFlagsReturns - fake.recordInvocation("SaveFeatureFlags", []interface{}{arg1}) - fake.saveFeatureFlagsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) SaveFeatureFlagsCallCount() int { - fake.saveFeatureFlagsMutex.RLock() - defer fake.saveFeatureFlagsMutex.RUnlock() - return len(fake.saveFeatureFlagsArgsForCall) -} - -func (fake *Client) SaveFeatureFlagsCalls(stub func(map[string]string) error) { - fake.saveFeatureFlagsMutex.Lock() - defer fake.saveFeatureFlagsMutex.Unlock() - fake.SaveFeatureFlagsStub = stub -} - -func (fake *Client) SaveFeatureFlagsArgsForCall(i int) map[string]string { - fake.saveFeatureFlagsMutex.RLock() - defer fake.saveFeatureFlagsMutex.RUnlock() - argsForCall := fake.saveFeatureFlagsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) SaveFeatureFlagsReturns(result1 error) { - fake.saveFeatureFlagsMutex.Lock() - defer fake.saveFeatureFlagsMutex.Unlock() - fake.SaveFeatureFlagsStub = nil - fake.saveFeatureFlagsReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) SaveFeatureFlagsReturnsOnCall(i int, result1 error) { - fake.saveFeatureFlagsMutex.Lock() - defer fake.saveFeatureFlagsMutex.Unlock() - fake.SaveFeatureFlagsStub = nil - if fake.saveFeatureFlagsReturnsOnCall == nil { - fake.saveFeatureFlagsReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.saveFeatureFlagsReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) ScaleCluster(arg1 client.ScaleClusterOptions) error { - fake.scaleClusterMutex.Lock() - ret, specificReturn := fake.scaleClusterReturnsOnCall[len(fake.scaleClusterArgsForCall)] - fake.scaleClusterArgsForCall = append(fake.scaleClusterArgsForCall, struct { - arg1 client.ScaleClusterOptions - }{arg1}) - stub := fake.ScaleClusterStub - fakeReturns := fake.scaleClusterReturns - fake.recordInvocation("ScaleCluster", []interface{}{arg1}) - fake.scaleClusterMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) ScaleClusterCallCount() int { - fake.scaleClusterMutex.RLock() - defer fake.scaleClusterMutex.RUnlock() - return len(fake.scaleClusterArgsForCall) -} - -func (fake *Client) ScaleClusterCalls(stub func(client.ScaleClusterOptions) error) { - fake.scaleClusterMutex.Lock() - defer fake.scaleClusterMutex.Unlock() - fake.ScaleClusterStub = stub -} - -func (fake *Client) ScaleClusterArgsForCall(i int) client.ScaleClusterOptions { - fake.scaleClusterMutex.RLock() - defer fake.scaleClusterMutex.RUnlock() - argsForCall := fake.scaleClusterArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) ScaleClusterReturns(result1 error) { - fake.scaleClusterMutex.Lock() - defer fake.scaleClusterMutex.Unlock() - fake.ScaleClusterStub = nil - fake.scaleClusterReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) ScaleClusterReturnsOnCall(i int, result1 error) { - fake.scaleClusterMutex.Lock() - defer fake.scaleClusterMutex.Unlock() - fake.ScaleClusterStub = nil - if fake.scaleClusterReturnsOnCall == nil { - fake.scaleClusterReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.scaleClusterReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) SetCEIPParticipation(arg1 bool, arg2 string, arg3 string) error { - fake.setCEIPParticipationMutex.Lock() - ret, specificReturn := fake.setCEIPParticipationReturnsOnCall[len(fake.setCEIPParticipationArgsForCall)] - fake.setCEIPParticipationArgsForCall = append(fake.setCEIPParticipationArgsForCall, struct { - arg1 bool - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.SetCEIPParticipationStub - fakeReturns := fake.setCEIPParticipationReturns - fake.recordInvocation("SetCEIPParticipation", []interface{}{arg1, arg2, arg3}) - fake.setCEIPParticipationMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) SetCEIPParticipationCallCount() int { - fake.setCEIPParticipationMutex.RLock() - defer fake.setCEIPParticipationMutex.RUnlock() - return len(fake.setCEIPParticipationArgsForCall) -} - -func (fake *Client) SetCEIPParticipationCalls(stub func(bool, string, string) error) { - fake.setCEIPParticipationMutex.Lock() - defer fake.setCEIPParticipationMutex.Unlock() - fake.SetCEIPParticipationStub = stub -} - -func (fake *Client) SetCEIPParticipationArgsForCall(i int) (bool, string, string) { - fake.setCEIPParticipationMutex.RLock() - defer fake.setCEIPParticipationMutex.RUnlock() - argsForCall := fake.setCEIPParticipationArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *Client) SetCEIPParticipationReturns(result1 error) { - fake.setCEIPParticipationMutex.Lock() - defer fake.setCEIPParticipationMutex.Unlock() - fake.SetCEIPParticipationStub = nil - fake.setCEIPParticipationReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) SetCEIPParticipationReturnsOnCall(i int, result1 error) { - fake.setCEIPParticipationMutex.Lock() - defer fake.setCEIPParticipationMutex.Unlock() - fake.SetCEIPParticipationStub = nil - if fake.setCEIPParticipationReturnsOnCall == nil { - fake.setCEIPParticipationReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.setCEIPParticipationReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) SetMachineDeployment(arg1 *client.SetMachineDeploymentOptions) error { - fake.setMachineDeploymentMutex.Lock() - ret, specificReturn := fake.setMachineDeploymentReturnsOnCall[len(fake.setMachineDeploymentArgsForCall)] - fake.setMachineDeploymentArgsForCall = append(fake.setMachineDeploymentArgsForCall, struct { - arg1 *client.SetMachineDeploymentOptions - }{arg1}) - stub := fake.SetMachineDeploymentStub - fakeReturns := fake.setMachineDeploymentReturns - fake.recordInvocation("SetMachineDeployment", []interface{}{arg1}) - fake.setMachineDeploymentMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) SetMachineDeploymentCallCount() int { - fake.setMachineDeploymentMutex.RLock() - defer fake.setMachineDeploymentMutex.RUnlock() - return len(fake.setMachineDeploymentArgsForCall) -} - -func (fake *Client) SetMachineDeploymentCalls(stub func(*client.SetMachineDeploymentOptions) error) { - fake.setMachineDeploymentMutex.Lock() - defer fake.setMachineDeploymentMutex.Unlock() - fake.SetMachineDeploymentStub = stub -} - -func (fake *Client) SetMachineDeploymentArgsForCall(i int) *client.SetMachineDeploymentOptions { - fake.setMachineDeploymentMutex.RLock() - defer fake.setMachineDeploymentMutex.RUnlock() - argsForCall := fake.setMachineDeploymentArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) SetMachineDeploymentReturns(result1 error) { - fake.setMachineDeploymentMutex.Lock() - defer fake.setMachineDeploymentMutex.Unlock() - fake.SetMachineDeploymentStub = nil - fake.setMachineDeploymentReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) SetMachineDeploymentReturnsOnCall(i int, result1 error) { - fake.setMachineDeploymentMutex.Lock() - defer fake.setMachineDeploymentMutex.Unlock() - fake.SetMachineDeploymentStub = nil - if fake.setMachineDeploymentReturnsOnCall == nil { - fake.setMachineDeploymentReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.setMachineDeploymentReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) SetMachineHealthCheck(arg1 *client.SetMachineHealthCheckOptions) error { - fake.setMachineHealthCheckMutex.Lock() - ret, specificReturn := fake.setMachineHealthCheckReturnsOnCall[len(fake.setMachineHealthCheckArgsForCall)] - fake.setMachineHealthCheckArgsForCall = append(fake.setMachineHealthCheckArgsForCall, struct { - arg1 *client.SetMachineHealthCheckOptions - }{arg1}) - stub := fake.SetMachineHealthCheckStub - fakeReturns := fake.setMachineHealthCheckReturns - fake.recordInvocation("SetMachineHealthCheck", []interface{}{arg1}) - fake.setMachineHealthCheckMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) SetMachineHealthCheckCallCount() int { - fake.setMachineHealthCheckMutex.RLock() - defer fake.setMachineHealthCheckMutex.RUnlock() - return len(fake.setMachineHealthCheckArgsForCall) -} - -func (fake *Client) SetMachineHealthCheckCalls(stub func(*client.SetMachineHealthCheckOptions) error) { - fake.setMachineHealthCheckMutex.Lock() - defer fake.setMachineHealthCheckMutex.Unlock() - fake.SetMachineHealthCheckStub = stub -} - -func (fake *Client) SetMachineHealthCheckArgsForCall(i int) *client.SetMachineHealthCheckOptions { - fake.setMachineHealthCheckMutex.RLock() - defer fake.setMachineHealthCheckMutex.RUnlock() - argsForCall := fake.setMachineHealthCheckArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) SetMachineHealthCheckReturns(result1 error) { - fake.setMachineHealthCheckMutex.Lock() - defer fake.setMachineHealthCheckMutex.Unlock() - fake.SetMachineHealthCheckStub = nil - fake.setMachineHealthCheckReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) SetMachineHealthCheckReturnsOnCall(i int, result1 error) { - fake.setMachineHealthCheckMutex.Lock() - defer fake.setMachineHealthCheckMutex.Unlock() - fake.SetMachineHealthCheckStub = nil - if fake.setMachineHealthCheckReturnsOnCall == nil { - fake.setMachineHealthCheckReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.setMachineHealthCheckReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) SetRegionContext(arg1 string, arg2 string) error { - fake.setRegionContextMutex.Lock() - ret, specificReturn := fake.setRegionContextReturnsOnCall[len(fake.setRegionContextArgsForCall)] - fake.setRegionContextArgsForCall = append(fake.setRegionContextArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.SetRegionContextStub - fakeReturns := fake.setRegionContextReturns - fake.recordInvocation("SetRegionContext", []interface{}{arg1, arg2}) - fake.setRegionContextMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) SetRegionContextCallCount() int { - fake.setRegionContextMutex.RLock() - defer fake.setRegionContextMutex.RUnlock() - return len(fake.setRegionContextArgsForCall) -} - -func (fake *Client) SetRegionContextCalls(stub func(string, string) error) { - fake.setRegionContextMutex.Lock() - defer fake.setRegionContextMutex.Unlock() - fake.SetRegionContextStub = stub -} - -func (fake *Client) SetRegionContextArgsForCall(i int) (string, string) { - fake.setRegionContextMutex.RLock() - defer fake.setRegionContextMutex.RUnlock() - argsForCall := fake.setRegionContextArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Client) SetRegionContextReturns(result1 error) { - fake.setRegionContextMutex.Lock() - defer fake.setRegionContextMutex.Unlock() - fake.SetRegionContextStub = nil - fake.setRegionContextReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) SetRegionContextReturnsOnCall(i int, result1 error) { - fake.setRegionContextMutex.Lock() - defer fake.setRegionContextMutex.Unlock() - fake.SetRegionContextStub = nil - if fake.setRegionContextReturnsOnCall == nil { - fake.setRegionContextReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.setRegionContextReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) TKGConfigReaderWriter() tkgconfigreaderwriter.TKGConfigReaderWriter { - fake.tKGConfigReaderWriterMutex.Lock() - ret, specificReturn := fake.tKGConfigReaderWriterReturnsOnCall[len(fake.tKGConfigReaderWriterArgsForCall)] - fake.tKGConfigReaderWriterArgsForCall = append(fake.tKGConfigReaderWriterArgsForCall, struct { - }{}) - stub := fake.TKGConfigReaderWriterStub - fakeReturns := fake.tKGConfigReaderWriterReturns - fake.recordInvocation("TKGConfigReaderWriter", []interface{}{}) - fake.tKGConfigReaderWriterMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) TKGConfigReaderWriterCallCount() int { - fake.tKGConfigReaderWriterMutex.RLock() - defer fake.tKGConfigReaderWriterMutex.RUnlock() - return len(fake.tKGConfigReaderWriterArgsForCall) -} - -func (fake *Client) TKGConfigReaderWriterCalls(stub func() tkgconfigreaderwriter.TKGConfigReaderWriter) { - fake.tKGConfigReaderWriterMutex.Lock() - defer fake.tKGConfigReaderWriterMutex.Unlock() - fake.TKGConfigReaderWriterStub = stub -} - -func (fake *Client) TKGConfigReaderWriterReturns(result1 tkgconfigreaderwriter.TKGConfigReaderWriter) { - fake.tKGConfigReaderWriterMutex.Lock() - defer fake.tKGConfigReaderWriterMutex.Unlock() - fake.TKGConfigReaderWriterStub = nil - fake.tKGConfigReaderWriterReturns = struct { - result1 tkgconfigreaderwriter.TKGConfigReaderWriter - }{result1} -} - -func (fake *Client) TKGConfigReaderWriterReturnsOnCall(i int, result1 tkgconfigreaderwriter.TKGConfigReaderWriter) { - fake.tKGConfigReaderWriterMutex.Lock() - defer fake.tKGConfigReaderWriterMutex.Unlock() - fake.TKGConfigReaderWriterStub = nil - if fake.tKGConfigReaderWriterReturnsOnCall == nil { - fake.tKGConfigReaderWriterReturnsOnCall = make(map[int]struct { - result1 tkgconfigreaderwriter.TKGConfigReaderWriter - }) - } - fake.tKGConfigReaderWriterReturnsOnCall[i] = struct { - result1 tkgconfigreaderwriter.TKGConfigReaderWriter - }{result1} -} - -func (fake *Client) UpdateCredentialsCluster(arg1 *client.UpdateCredentialsOptions) error { - fake.updateCredentialsClusterMutex.Lock() - ret, specificReturn := fake.updateCredentialsClusterReturnsOnCall[len(fake.updateCredentialsClusterArgsForCall)] - fake.updateCredentialsClusterArgsForCall = append(fake.updateCredentialsClusterArgsForCall, struct { - arg1 *client.UpdateCredentialsOptions - }{arg1}) - stub := fake.UpdateCredentialsClusterStub - fakeReturns := fake.updateCredentialsClusterReturns - fake.recordInvocation("UpdateCredentialsCluster", []interface{}{arg1}) - fake.updateCredentialsClusterMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) UpdateCredentialsClusterCallCount() int { - fake.updateCredentialsClusterMutex.RLock() - defer fake.updateCredentialsClusterMutex.RUnlock() - return len(fake.updateCredentialsClusterArgsForCall) -} - -func (fake *Client) UpdateCredentialsClusterCalls(stub func(*client.UpdateCredentialsOptions) error) { - fake.updateCredentialsClusterMutex.Lock() - defer fake.updateCredentialsClusterMutex.Unlock() - fake.UpdateCredentialsClusterStub = stub -} - -func (fake *Client) UpdateCredentialsClusterArgsForCall(i int) *client.UpdateCredentialsOptions { - fake.updateCredentialsClusterMutex.RLock() - defer fake.updateCredentialsClusterMutex.RUnlock() - argsForCall := fake.updateCredentialsClusterArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) UpdateCredentialsClusterReturns(result1 error) { - fake.updateCredentialsClusterMutex.Lock() - defer fake.updateCredentialsClusterMutex.Unlock() - fake.UpdateCredentialsClusterStub = nil - fake.updateCredentialsClusterReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) UpdateCredentialsClusterReturnsOnCall(i int, result1 error) { - fake.updateCredentialsClusterMutex.Lock() - defer fake.updateCredentialsClusterMutex.Unlock() - fake.UpdateCredentialsClusterStub = nil - if fake.updateCredentialsClusterReturnsOnCall == nil { - fake.updateCredentialsClusterReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateCredentialsClusterReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) UpdateCredentialsRegion(arg1 *client.UpdateCredentialsOptions) error { - fake.updateCredentialsRegionMutex.Lock() - ret, specificReturn := fake.updateCredentialsRegionReturnsOnCall[len(fake.updateCredentialsRegionArgsForCall)] - fake.updateCredentialsRegionArgsForCall = append(fake.updateCredentialsRegionArgsForCall, struct { - arg1 *client.UpdateCredentialsOptions - }{arg1}) - stub := fake.UpdateCredentialsRegionStub - fakeReturns := fake.updateCredentialsRegionReturns - fake.recordInvocation("UpdateCredentialsRegion", []interface{}{arg1}) - fake.updateCredentialsRegionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) UpdateCredentialsRegionCallCount() int { - fake.updateCredentialsRegionMutex.RLock() - defer fake.updateCredentialsRegionMutex.RUnlock() - return len(fake.updateCredentialsRegionArgsForCall) -} - -func (fake *Client) UpdateCredentialsRegionCalls(stub func(*client.UpdateCredentialsOptions) error) { - fake.updateCredentialsRegionMutex.Lock() - defer fake.updateCredentialsRegionMutex.Unlock() - fake.UpdateCredentialsRegionStub = stub -} - -func (fake *Client) UpdateCredentialsRegionArgsForCall(i int) *client.UpdateCredentialsOptions { - fake.updateCredentialsRegionMutex.RLock() - defer fake.updateCredentialsRegionMutex.RUnlock() - argsForCall := fake.updateCredentialsRegionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) UpdateCredentialsRegionReturns(result1 error) { - fake.updateCredentialsRegionMutex.Lock() - defer fake.updateCredentialsRegionMutex.Unlock() - fake.UpdateCredentialsRegionStub = nil - fake.updateCredentialsRegionReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) UpdateCredentialsRegionReturnsOnCall(i int, result1 error) { - fake.updateCredentialsRegionMutex.Lock() - defer fake.updateCredentialsRegionMutex.Unlock() - fake.UpdateCredentialsRegionStub = nil - if fake.updateCredentialsRegionReturnsOnCall == nil { - fake.updateCredentialsRegionReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateCredentialsRegionReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) UpgradeCluster(arg1 *client.UpgradeClusterOptions) error { - fake.upgradeClusterMutex.Lock() - ret, specificReturn := fake.upgradeClusterReturnsOnCall[len(fake.upgradeClusterArgsForCall)] - fake.upgradeClusterArgsForCall = append(fake.upgradeClusterArgsForCall, struct { - arg1 *client.UpgradeClusterOptions - }{arg1}) - stub := fake.UpgradeClusterStub - fakeReturns := fake.upgradeClusterReturns - fake.recordInvocation("UpgradeCluster", []interface{}{arg1}) - fake.upgradeClusterMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) UpgradeClusterCallCount() int { - fake.upgradeClusterMutex.RLock() - defer fake.upgradeClusterMutex.RUnlock() - return len(fake.upgradeClusterArgsForCall) -} - -func (fake *Client) UpgradeClusterCalls(stub func(*client.UpgradeClusterOptions) error) { - fake.upgradeClusterMutex.Lock() - defer fake.upgradeClusterMutex.Unlock() - fake.UpgradeClusterStub = stub -} - -func (fake *Client) UpgradeClusterArgsForCall(i int) *client.UpgradeClusterOptions { - fake.upgradeClusterMutex.RLock() - defer fake.upgradeClusterMutex.RUnlock() - argsForCall := fake.upgradeClusterArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) UpgradeClusterReturns(result1 error) { - fake.upgradeClusterMutex.Lock() - defer fake.upgradeClusterMutex.Unlock() - fake.UpgradeClusterStub = nil - fake.upgradeClusterReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) UpgradeClusterReturnsOnCall(i int, result1 error) { - fake.upgradeClusterMutex.Lock() - defer fake.upgradeClusterMutex.Unlock() - fake.UpgradeClusterStub = nil - if fake.upgradeClusterReturnsOnCall == nil { - fake.upgradeClusterReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.upgradeClusterReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) UpgradeManagementCluster(arg1 *client.UpgradeClusterOptions) error { - fake.upgradeManagementClusterMutex.Lock() - ret, specificReturn := fake.upgradeManagementClusterReturnsOnCall[len(fake.upgradeManagementClusterArgsForCall)] - fake.upgradeManagementClusterArgsForCall = append(fake.upgradeManagementClusterArgsForCall, struct { - arg1 *client.UpgradeClusterOptions - }{arg1}) - stub := fake.UpgradeManagementClusterStub - fakeReturns := fake.upgradeManagementClusterReturns - fake.recordInvocation("UpgradeManagementCluster", []interface{}{arg1}) - fake.upgradeManagementClusterMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) UpgradeManagementClusterCallCount() int { - fake.upgradeManagementClusterMutex.RLock() - defer fake.upgradeManagementClusterMutex.RUnlock() - return len(fake.upgradeManagementClusterArgsForCall) -} - -func (fake *Client) UpgradeManagementClusterCalls(stub func(*client.UpgradeClusterOptions) error) { - fake.upgradeManagementClusterMutex.Lock() - defer fake.upgradeManagementClusterMutex.Unlock() - fake.UpgradeManagementClusterStub = stub -} - -func (fake *Client) UpgradeManagementClusterArgsForCall(i int) *client.UpgradeClusterOptions { - fake.upgradeManagementClusterMutex.RLock() - defer fake.upgradeManagementClusterMutex.RUnlock() - argsForCall := fake.upgradeManagementClusterArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) UpgradeManagementClusterReturns(result1 error) { - fake.upgradeManagementClusterMutex.Lock() - defer fake.upgradeManagementClusterMutex.Unlock() - fake.UpgradeManagementClusterStub = nil - fake.upgradeManagementClusterReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) UpgradeManagementClusterReturnsOnCall(i int, result1 error) { - fake.upgradeManagementClusterMutex.Lock() - defer fake.upgradeManagementClusterMutex.Unlock() - fake.UpgradeManagementClusterStub = nil - if fake.upgradeManagementClusterReturnsOnCall == nil { - fake.upgradeManagementClusterReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.upgradeManagementClusterReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) ValidateDockerResourcePrerequisites() error { - fake.validateDockerResourcePrerequisitesMutex.Lock() - ret, specificReturn := fake.validateDockerResourcePrerequisitesReturnsOnCall[len(fake.validateDockerResourcePrerequisitesArgsForCall)] - fake.validateDockerResourcePrerequisitesArgsForCall = append(fake.validateDockerResourcePrerequisitesArgsForCall, struct { - }{}) - stub := fake.ValidateDockerResourcePrerequisitesStub - fakeReturns := fake.validateDockerResourcePrerequisitesReturns - fake.recordInvocation("ValidateDockerResourcePrerequisites", []interface{}{}) - fake.validateDockerResourcePrerequisitesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) ValidateDockerResourcePrerequisitesCallCount() int { - fake.validateDockerResourcePrerequisitesMutex.RLock() - defer fake.validateDockerResourcePrerequisitesMutex.RUnlock() - return len(fake.validateDockerResourcePrerequisitesArgsForCall) -} - -func (fake *Client) ValidateDockerResourcePrerequisitesCalls(stub func() error) { - fake.validateDockerResourcePrerequisitesMutex.Lock() - defer fake.validateDockerResourcePrerequisitesMutex.Unlock() - fake.ValidateDockerResourcePrerequisitesStub = stub -} - -func (fake *Client) ValidateDockerResourcePrerequisitesReturns(result1 error) { - fake.validateDockerResourcePrerequisitesMutex.Lock() - defer fake.validateDockerResourcePrerequisitesMutex.Unlock() - fake.ValidateDockerResourcePrerequisitesStub = nil - fake.validateDockerResourcePrerequisitesReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) ValidateDockerResourcePrerequisitesReturnsOnCall(i int, result1 error) { - fake.validateDockerResourcePrerequisitesMutex.Lock() - defer fake.validateDockerResourcePrerequisitesMutex.Unlock() - fake.ValidateDockerResourcePrerequisitesStub = nil - if fake.validateDockerResourcePrerequisitesReturnsOnCall == nil { - fake.validateDockerResourcePrerequisitesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.validateDockerResourcePrerequisitesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) ValidatePrerequisites(arg1 bool, arg2 bool) error { - fake.validatePrerequisitesMutex.Lock() - ret, specificReturn := fake.validatePrerequisitesReturnsOnCall[len(fake.validatePrerequisitesArgsForCall)] - fake.validatePrerequisitesArgsForCall = append(fake.validatePrerequisitesArgsForCall, struct { - arg1 bool - arg2 bool - }{arg1, arg2}) - stub := fake.ValidatePrerequisitesStub - fakeReturns := fake.validatePrerequisitesReturns - fake.recordInvocation("ValidatePrerequisites", []interface{}{arg1, arg2}) - fake.validatePrerequisitesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Client) ValidatePrerequisitesCallCount() int { - fake.validatePrerequisitesMutex.RLock() - defer fake.validatePrerequisitesMutex.RUnlock() - return len(fake.validatePrerequisitesArgsForCall) -} - -func (fake *Client) ValidatePrerequisitesCalls(stub func(bool, bool) error) { - fake.validatePrerequisitesMutex.Lock() - defer fake.validatePrerequisitesMutex.Unlock() - fake.ValidatePrerequisitesStub = stub -} - -func (fake *Client) ValidatePrerequisitesArgsForCall(i int) (bool, bool) { - fake.validatePrerequisitesMutex.RLock() - defer fake.validatePrerequisitesMutex.RUnlock() - argsForCall := fake.validatePrerequisitesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Client) ValidatePrerequisitesReturns(result1 error) { - fake.validatePrerequisitesMutex.Lock() - defer fake.validatePrerequisitesMutex.Unlock() - fake.ValidatePrerequisitesStub = nil - fake.validatePrerequisitesReturns = struct { - result1 error - }{result1} -} - -func (fake *Client) ValidatePrerequisitesReturnsOnCall(i int, result1 error) { - fake.validatePrerequisitesMutex.Lock() - defer fake.validatePrerequisitesMutex.Unlock() - fake.ValidatePrerequisitesStub = nil - if fake.validatePrerequisitesReturnsOnCall == nil { - fake.validatePrerequisitesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.validatePrerequisitesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Client) VerifyRegion(arg1 string) (region.RegionContext, error) { - fake.verifyRegionMutex.Lock() - ret, specificReturn := fake.verifyRegionReturnsOnCall[len(fake.verifyRegionArgsForCall)] - fake.verifyRegionArgsForCall = append(fake.verifyRegionArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.VerifyRegionStub - fakeReturns := fake.verifyRegionReturns - fake.recordInvocation("VerifyRegion", []interface{}{arg1}) - fake.verifyRegionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Client) VerifyRegionCallCount() int { - fake.verifyRegionMutex.RLock() - defer fake.verifyRegionMutex.RUnlock() - return len(fake.verifyRegionArgsForCall) -} - -func (fake *Client) VerifyRegionCalls(stub func(string) (region.RegionContext, error)) { - fake.verifyRegionMutex.Lock() - defer fake.verifyRegionMutex.Unlock() - fake.VerifyRegionStub = stub -} - -func (fake *Client) VerifyRegionArgsForCall(i int) string { - fake.verifyRegionMutex.RLock() - defer fake.verifyRegionMutex.RUnlock() - argsForCall := fake.verifyRegionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Client) VerifyRegionReturns(result1 region.RegionContext, result2 error) { - fake.verifyRegionMutex.Lock() - defer fake.verifyRegionMutex.Unlock() - fake.VerifyRegionStub = nil - fake.verifyRegionReturns = struct { - result1 region.RegionContext - result2 error - }{result1, result2} -} - -func (fake *Client) VerifyRegionReturnsOnCall(i int, result1 region.RegionContext, result2 error) { - fake.verifyRegionMutex.Lock() - defer fake.verifyRegionMutex.Unlock() - fake.VerifyRegionStub = nil - if fake.verifyRegionReturnsOnCall == nil { - fake.verifyRegionReturnsOnCall = make(map[int]struct { - result1 region.RegionContext - result2 error - }) - } - fake.verifyRegionReturnsOnCall[i] = struct { - result1 region.RegionContext - result2 error - }{result1, result2} -} - -func (fake *Client) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.activateTanzuKubernetesReleasesMutex.RLock() - defer fake.activateTanzuKubernetesReleasesMutex.RUnlock() - fake.addRegionContextMutex.RLock() - defer fake.addRegionContextMutex.RUnlock() - fake.configureAndValidateManagementClusterConfigurationMutex.RLock() - defer fake.configureAndValidateManagementClusterConfigurationMutex.RUnlock() - fake.configureAndValidateTkrVersionMutex.RLock() - defer fake.configureAndValidateTkrVersionMutex.RUnlock() - fake.configureTimeoutMutex.RLock() - defer fake.configureTimeoutMutex.RUnlock() - fake.createAWSCloudFormationStackMutex.RLock() - defer fake.createAWSCloudFormationStackMutex.RUnlock() - fake.createClusterMutex.RLock() - defer fake.createClusterMutex.RUnlock() - fake.deactivateTanzuKubernetesReleasesMutex.RLock() - defer fake.deactivateTanzuKubernetesReleasesMutex.RUnlock() - fake.deleteMachineDeploymentMutex.RLock() - defer fake.deleteMachineDeploymentMutex.RUnlock() - fake.deleteMachineHealthCheckMutex.RLock() - defer fake.deleteMachineHealthCheckMutex.RUnlock() - fake.deleteRegionMutex.RLock() - defer fake.deleteRegionMutex.RUnlock() - fake.deleteWorkloadClusterMutex.RLock() - defer fake.deleteWorkloadClusterMutex.RUnlock() - fake.describeClusterMutex.RLock() - defer fake.describeClusterMutex.RUnlock() - fake.describeProviderMutex.RLock() - defer fake.describeProviderMutex.RUnlock() - fake.downloadBomFileMutex.RLock() - defer fake.downloadBomFileMutex.RUnlock() - fake.generateAWSCloudFormationTemplateMutex.RLock() - defer fake.generateAWSCloudFormationTemplateMutex.RUnlock() - fake.getCEIPParticipationMutex.RLock() - defer fake.getCEIPParticipationMutex.RUnlock() - fake.getClusterConfigurationMutex.RLock() - defer fake.getClusterConfigurationMutex.RUnlock() - fake.getClusterPinnipedInfoMutex.RLock() - defer fake.getClusterPinnipedInfoMutex.RUnlock() - fake.getCurrentRegionContextMutex.RLock() - defer fake.getCurrentRegionContextMutex.RUnlock() - fake.getKubernetesVersionsMutex.RLock() - defer fake.getKubernetesVersionsMutex.RUnlock() - fake.getMachineDeploymentsMutex.RLock() - defer fake.getMachineDeploymentsMutex.RUnlock() - fake.getMachineHealthChecksMutex.RLock() - defer fake.getMachineHealthChecksMutex.RUnlock() - fake.getPacificClusterObjectMutex.RLock() - defer fake.getPacificClusterObjectMutex.RUnlock() - fake.getPacificMachineDeploymentsMutex.RLock() - defer fake.getPacificMachineDeploymentsMutex.RUnlock() - fake.getRegionContextsMutex.RLock() - defer fake.getRegionContextsMutex.RUnlock() - fake.getTanzuKubernetesReleasesMutex.RLock() - defer fake.getTanzuKubernetesReleasesMutex.RUnlock() - fake.getVSphereEndpointMutex.RLock() - defer fake.getVSphereEndpointMutex.RUnlock() - fake.getWorkloadClusterCredentialsMutex.RLock() - defer fake.getWorkloadClusterCredentialsMutex.RUnlock() - fake.initRegionMutex.RLock() - defer fake.initRegionMutex.RUnlock() - fake.initRegionDryRunMutex.RLock() - defer fake.initRegionDryRunMutex.RUnlock() - fake.isFeatureActivatedMutex.RLock() - defer fake.isFeatureActivatedMutex.RUnlock() - fake.isManagementClusterAKindClusterMutex.RLock() - defer fake.isManagementClusterAKindClusterMutex.RUnlock() - fake.isPacificManagementClusterMutex.RLock() - defer fake.isPacificManagementClusterMutex.RUnlock() - fake.isPacificRegionalClusterMutex.RLock() - defer fake.isPacificRegionalClusterMutex.RUnlock() - fake.listTKGClustersMutex.RLock() - defer fake.listTKGClustersMutex.RUnlock() - fake.parseHiddenArgsAsFeatureFlagsMutex.RLock() - defer fake.parseHiddenArgsAsFeatureFlagsMutex.RUnlock() - fake.saveFeatureFlagsMutex.RLock() - defer fake.saveFeatureFlagsMutex.RUnlock() - fake.scaleClusterMutex.RLock() - defer fake.scaleClusterMutex.RUnlock() - fake.setCEIPParticipationMutex.RLock() - defer fake.setCEIPParticipationMutex.RUnlock() - fake.setMachineDeploymentMutex.RLock() - defer fake.setMachineDeploymentMutex.RUnlock() - fake.setMachineHealthCheckMutex.RLock() - defer fake.setMachineHealthCheckMutex.RUnlock() - fake.setRegionContextMutex.RLock() - defer fake.setRegionContextMutex.RUnlock() - fake.tKGConfigReaderWriterMutex.RLock() - defer fake.tKGConfigReaderWriterMutex.RUnlock() - fake.updateCredentialsClusterMutex.RLock() - defer fake.updateCredentialsClusterMutex.RUnlock() - fake.updateCredentialsRegionMutex.RLock() - defer fake.updateCredentialsRegionMutex.RUnlock() - fake.upgradeClusterMutex.RLock() - defer fake.upgradeClusterMutex.RUnlock() - fake.upgradeManagementClusterMutex.RLock() - defer fake.upgradeManagementClusterMutex.RUnlock() - fake.validateDockerResourcePrerequisitesMutex.RLock() - defer fake.validateDockerResourcePrerequisitesMutex.RUnlock() - fake.validatePrerequisitesMutex.RLock() - defer fake.validatePrerequisitesMutex.RUnlock() - fake.verifyRegionMutex.RLock() - defer fake.verifyRegionMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *Client) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ client.Client = new(Client) diff --git a/tkg/fakes/clusterclient.go b/tkg/fakes/clusterclient.go deleted file mode 100644 index c1eb51ea01..0000000000 --- a/tkg/fakes/clusterclient.go +++ /dev/null @@ -1,8532 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - "time" - - v1a "k8s.io/api/apps/v1" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" - v1beta1a "sigs.k8s.io/cluster-api/api/v1beta1" - v1alpha3a "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - v1alpha1b "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - v1alpha1a "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -type ClusterClient struct { - ActivateTanzuKubernetesReleasesStub func(string) error - activateTanzuKubernetesReleasesMutex sync.RWMutex - activateTanzuKubernetesReleasesArgsForCall []struct { - arg1 string - } - activateTanzuKubernetesReleasesReturns struct { - result1 error - } - activateTanzuKubernetesReleasesReturnsOnCall map[int]struct { - result1 error - } - AddCEIPTelemetryJobStub func(string, string, *tkgconfigbom.BOMConfiguration, string, string, string, string, string) error - addCEIPTelemetryJobMutex sync.RWMutex - addCEIPTelemetryJobArgsForCall []struct { - arg1 string - arg2 string - arg3 *tkgconfigbom.BOMConfiguration - arg4 string - arg5 string - arg6 string - arg7 string - arg8 string - } - addCEIPTelemetryJobReturns struct { - result1 error - } - addCEIPTelemetryJobReturnsOnCall map[int]struct { - result1 error - } - ApplyStub func(string) error - applyMutex sync.RWMutex - applyArgsForCall []struct { - arg1 string - } - applyReturns struct { - result1 error - } - applyReturnsOnCall map[int]struct { - result1 error - } - ApplyFileStub func(string) error - applyFileMutex sync.RWMutex - applyFileArgsForCall []struct { - arg1 string - } - applyFileReturns struct { - result1 error - } - applyFileReturnsOnCall map[int]struct { - result1 error - } - ApplyFileRecursivelyStub func(string, string) error - applyFileRecursivelyMutex sync.RWMutex - applyFileRecursivelyArgsForCall []struct { - arg1 string - arg2 string - } - applyFileRecursivelyReturns struct { - result1 error - } - applyFileRecursivelyReturnsOnCall map[int]struct { - result1 error - } - ApplyPatchForAutoScalerDeploymentStub func(tkgconfigbom.Client, string, string, string) error - applyPatchForAutoScalerDeploymentMutex sync.RWMutex - applyPatchForAutoScalerDeploymentArgsForCall []struct { - arg1 tkgconfigbom.Client - arg2 string - arg3 string - arg4 string - } - applyPatchForAutoScalerDeploymentReturns struct { - result1 error - } - applyPatchForAutoScalerDeploymentReturnsOnCall map[int]struct { - result1 error - } - CheckUnifiedAzureClusterIdentityStub func(string, string) (bool, error) - checkUnifiedAzureClusterIdentityMutex sync.RWMutex - checkUnifiedAzureClusterIdentityArgsForCall []struct { - arg1 string - arg2 string - } - checkUnifiedAzureClusterIdentityReturns struct { - result1 bool - result2 error - } - checkUnifiedAzureClusterIdentityReturnsOnCall map[int]struct { - result1 bool - result2 error - } - CloneWithTimeoutStub func(time.Duration) clusterclient.Client - cloneWithTimeoutMutex sync.RWMutex - cloneWithTimeoutArgsForCall []struct { - arg1 time.Duration - } - cloneWithTimeoutReturns struct { - result1 clusterclient.Client - } - cloneWithTimeoutReturnsOnCall map[int]struct { - result1 clusterclient.Client - } - CreateNamespaceStub func(string) error - createNamespaceMutex sync.RWMutex - createNamespaceArgsForCall []struct { - arg1 string - } - createNamespaceReturns struct { - result1 error - } - createNamespaceReturnsOnCall map[int]struct { - result1 error - } - CreateResourceStub func(interface{}, string, string, ...client.CreateOption) error - createResourceMutex sync.RWMutex - createResourceArgsForCall []struct { - arg1 interface{} - arg2 string - arg3 string - arg4 []client.CreateOption - } - createResourceReturns struct { - result1 error - } - createResourceReturnsOnCall map[int]struct { - result1 error - } - DeactivateTanzuKubernetesReleasesStub func(string) error - deactivateTanzuKubernetesReleasesMutex sync.RWMutex - deactivateTanzuKubernetesReleasesArgsForCall []struct { - arg1 string - } - deactivateTanzuKubernetesReleasesReturns struct { - result1 error - } - deactivateTanzuKubernetesReleasesReturnsOnCall map[int]struct { - result1 error - } - DeleteClusterStub func(string, string) error - deleteClusterMutex sync.RWMutex - deleteClusterArgsForCall []struct { - arg1 string - arg2 string - } - deleteClusterReturns struct { - result1 error - } - deleteClusterReturnsOnCall map[int]struct { - result1 error - } - DeleteExistingKappControllerStub func() error - deleteExistingKappControllerMutex sync.RWMutex - deleteExistingKappControllerArgsForCall []struct { - } - deleteExistingKappControllerReturns struct { - result1 error - } - deleteExistingKappControllerReturnsOnCall map[int]struct { - result1 error - } - DeleteResourceStub func(interface{}) error - deleteResourceMutex sync.RWMutex - deleteResourceArgsForCall []struct { - arg1 interface{} - } - deleteResourceReturns struct { - result1 error - } - deleteResourceReturnsOnCall map[int]struct { - result1 error - } - ExportCurrentKubeconfigToFileStub func() (string, error) - exportCurrentKubeconfigToFileMutex sync.RWMutex - exportCurrentKubeconfigToFileArgsForCall []struct { - } - exportCurrentKubeconfigToFileReturns struct { - result1 string - result2 error - } - exportCurrentKubeconfigToFileReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetAWSCredentialsFromSecretStub func() (string, error) - getAWSCredentialsFromSecretMutex sync.RWMutex - getAWSCredentialsFromSecretArgsForCall []struct { - } - getAWSCredentialsFromSecretReturns struct { - result1 string - result2 error - } - getAWSCredentialsFromSecretReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetAzureClusterNameStub func(string, string) (string, string, error) - getAzureClusterNameMutex sync.RWMutex - getAzureClusterNameArgsForCall []struct { - arg1 string - arg2 string - } - getAzureClusterNameReturns struct { - result1 string - result2 string - result3 error - } - getAzureClusterNameReturnsOnCall map[int]struct { - result1 string - result2 string - result3 error - } - GetAzureCredentialsFromIdentityStub func(string, string) (azure.Credentials, error) - getAzureCredentialsFromIdentityMutex sync.RWMutex - getAzureCredentialsFromIdentityArgsForCall []struct { - arg1 string - arg2 string - } - getAzureCredentialsFromIdentityReturns struct { - result1 azure.Credentials - result2 error - } - getAzureCredentialsFromIdentityReturnsOnCall map[int]struct { - result1 azure.Credentials - result2 error - } - GetAzureCredentialsFromSecretStub func() (azure.Credentials, error) - getAzureCredentialsFromSecretMutex sync.RWMutex - getAzureCredentialsFromSecretArgsForCall []struct { - } - getAzureCredentialsFromSecretReturns struct { - result1 azure.Credentials - result2 error - } - getAzureCredentialsFromSecretReturnsOnCall map[int]struct { - result1 azure.Credentials - result2 error - } - GetBomConfigMapStub func(string) (v1.ConfigMap, error) - getBomConfigMapMutex sync.RWMutex - getBomConfigMapArgsForCall []struct { - arg1 string - } - getBomConfigMapReturns struct { - result1 v1.ConfigMap - result2 error - } - getBomConfigMapReturnsOnCall map[int]struct { - result1 v1.ConfigMap - result2 error - } - GetCAPZControllerManagerDeploymentsReplicasStub func() (int32, error) - getCAPZControllerManagerDeploymentsReplicasMutex sync.RWMutex - getCAPZControllerManagerDeploymentsReplicasArgsForCall []struct { - } - getCAPZControllerManagerDeploymentsReplicasReturns struct { - result1 int32 - result2 error - } - getCAPZControllerManagerDeploymentsReplicasReturnsOnCall map[int]struct { - result1 int32 - result2 error - } - GetCLIPluginImageRepositoryOverrideStub func() (map[string]string, error) - getCLIPluginImageRepositoryOverrideMutex sync.RWMutex - getCLIPluginImageRepositoryOverrideArgsForCall []struct { - } - getCLIPluginImageRepositoryOverrideReturns struct { - result1 map[string]string - result2 error - } - getCLIPluginImageRepositoryOverrideReturnsOnCall map[int]struct { - result1 map[string]string - result2 error - } - GetClientSetStub func() clusterclient.CrtClient - getClientSetMutex sync.RWMutex - getClientSetArgsForCall []struct { - } - getClientSetReturns struct { - result1 clusterclient.CrtClient - } - getClientSetReturnsOnCall map[int]struct { - result1 clusterclient.CrtClient - } - GetClusterInfrastructureStub func() (string, error) - getClusterInfrastructureMutex sync.RWMutex - getClusterInfrastructureArgsForCall []struct { - } - getClusterInfrastructureReturns struct { - result1 string - result2 error - } - getClusterInfrastructureReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetClusterResolvedOSImagesFromTKRStub func(*v1alpha3.TanzuKubernetesRelease) ([]*v1alpha3.OSImage, error) - getClusterResolvedOSImagesFromTKRMutex sync.RWMutex - getClusterResolvedOSImagesFromTKRArgsForCall []struct { - arg1 *v1alpha3.TanzuKubernetesRelease - } - getClusterResolvedOSImagesFromTKRReturns struct { - result1 []*v1alpha3.OSImage - result2 error - } - getClusterResolvedOSImagesFromTKRReturnsOnCall map[int]struct { - result1 []*v1alpha3.OSImage - result2 error - } - GetClusterResolvedTanzuKubernetesReleaseStub func() (*v1alpha3.TanzuKubernetesRelease, error) - getClusterResolvedTanzuKubernetesReleaseMutex sync.RWMutex - getClusterResolvedTanzuKubernetesReleaseArgsForCall []struct { - } - getClusterResolvedTanzuKubernetesReleaseReturns struct { - result1 *v1alpha3.TanzuKubernetesRelease - result2 error - } - getClusterResolvedTanzuKubernetesReleaseReturnsOnCall map[int]struct { - result1 *v1alpha3.TanzuKubernetesRelease - result2 error - } - GetClusterStatusInfoStub func(string, string, clusterclient.Client) clusterclient.ClusterStatusInfo - getClusterStatusInfoMutex sync.RWMutex - getClusterStatusInfoArgsForCall []struct { - arg1 string - arg2 string - arg3 clusterclient.Client - } - getClusterStatusInfoReturns struct { - result1 clusterclient.ClusterStatusInfo - } - getClusterStatusInfoReturnsOnCall map[int]struct { - result1 clusterclient.ClusterStatusInfo - } - GetCurrentClusterNameStub func(string) (string, error) - getCurrentClusterNameMutex sync.RWMutex - getCurrentClusterNameArgsForCall []struct { - arg1 string - } - getCurrentClusterNameReturns struct { - result1 string - result2 error - } - getCurrentClusterNameReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetCurrentKubeContextStub func() (string, error) - getCurrentKubeContextMutex sync.RWMutex - getCurrentKubeContextArgsForCall []struct { - } - getCurrentKubeContextReturns struct { - result1 string - result2 error - } - getCurrentKubeContextReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetCurrentKubeconfigFileStub func() string - getCurrentKubeconfigFileMutex sync.RWMutex - getCurrentKubeconfigFileArgsForCall []struct { - } - getCurrentKubeconfigFileReturns struct { - result1 string - } - getCurrentKubeconfigFileReturnsOnCall map[int]struct { - result1 string - } - GetCurrentNamespaceStub func() (string, error) - getCurrentNamespaceMutex sync.RWMutex - getCurrentNamespaceArgsForCall []struct { - } - getCurrentNamespaceReturns struct { - result1 string - result2 error - } - getCurrentNamespaceReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetDeploymentStub func(string, string) (v1a.Deployment, error) - getDeploymentMutex sync.RWMutex - getDeploymentArgsForCall []struct { - arg1 string - arg2 string - } - getDeploymentReturns struct { - result1 v1a.Deployment - result2 error - } - getDeploymentReturnsOnCall map[int]struct { - result1 v1a.Deployment - result2 error - } - GetKCPObjectForClusterStub func(string, string) (*v1beta1.KubeadmControlPlane, error) - getKCPObjectForClusterMutex sync.RWMutex - getKCPObjectForClusterArgsForCall []struct { - arg1 string - arg2 string - } - getKCPObjectForClusterReturns struct { - result1 *v1beta1.KubeadmControlPlane - result2 error - } - getKCPObjectForClusterReturnsOnCall map[int]struct { - result1 *v1beta1.KubeadmControlPlane - result2 error - } - GetKubeConfigForClusterStub func(string, string, *clusterclient.PollOptions) ([]byte, error) - getKubeConfigForClusterMutex sync.RWMutex - getKubeConfigForClusterArgsForCall []struct { - arg1 string - arg2 string - arg3 *clusterclient.PollOptions - } - getKubeConfigForClusterReturns struct { - result1 []byte - result2 error - } - getKubeConfigForClusterReturnsOnCall map[int]struct { - result1 []byte - result2 error - } - GetKubeadmControlPlaneNameStub func(string, string) (string, string, error) - getKubeadmControlPlaneNameMutex sync.RWMutex - getKubeadmControlPlaneNameArgsForCall []struct { - arg1 string - arg2 string - } - getKubeadmControlPlaneNameReturns struct { - result1 string - result2 string - result3 error - } - getKubeadmControlPlaneNameReturnsOnCall map[int]struct { - result1 string - result2 string - result3 error - } - GetKubernetesVersionStub func() (string, error) - getKubernetesVersionMutex sync.RWMutex - getKubernetesVersionArgsForCall []struct { - } - getKubernetesVersionReturns struct { - result1 string - result2 error - } - getKubernetesVersionReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetMDObjectForClusterStub func(string, string) ([]v1beta1a.MachineDeployment, error) - getMDObjectForClusterMutex sync.RWMutex - getMDObjectForClusterArgsForCall []struct { - arg1 string - arg2 string - } - getMDObjectForClusterReturns struct { - result1 []v1beta1a.MachineDeployment - result2 error - } - getMDObjectForClusterReturnsOnCall map[int]struct { - result1 []v1beta1a.MachineDeployment - result2 error - } - GetMachineObjectsForClusterStub func(string, string) (map[string]v1beta1a.Machine, map[string]v1beta1a.Machine, error) - getMachineObjectsForClusterMutex sync.RWMutex - getMachineObjectsForClusterArgsForCall []struct { - arg1 string - arg2 string - } - getMachineObjectsForClusterReturns struct { - result1 map[string]v1beta1a.Machine - result2 map[string]v1beta1a.Machine - result3 error - } - getMachineObjectsForClusterReturnsOnCall map[int]struct { - result1 map[string]v1beta1a.Machine - result2 map[string]v1beta1a.Machine - result3 error - } - GetManagementClusterTKGVersionStub func(string, string) (string, error) - getManagementClusterTKGVersionMutex sync.RWMutex - getManagementClusterTKGVersionArgsForCall []struct { - arg1 string - arg2 string - } - getManagementClusterTKGVersionReturns struct { - result1 string - result2 error - } - getManagementClusterTKGVersionReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetPacificClusterObjectStub func(string, string) (*v1alpha2.TanzuKubernetesCluster, error) - getPacificClusterObjectMutex sync.RWMutex - getPacificClusterObjectArgsForCall []struct { - arg1 string - arg2 string - } - getPacificClusterObjectReturns struct { - result1 *v1alpha2.TanzuKubernetesCluster - result2 error - } - getPacificClusterObjectReturnsOnCall map[int]struct { - result1 *v1alpha2.TanzuKubernetesCluster - result2 error - } - GetPacificTKCAPIVersionStub func() (string, error) - getPacificTKCAPIVersionMutex sync.RWMutex - getPacificTKCAPIVersionArgsForCall []struct { - } - getPacificTKCAPIVersionReturns struct { - result1 string - result2 error - } - getPacificTKCAPIVersionReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetPacificTanzuKubernetesReleasesStub func() ([]string, error) - getPacificTanzuKubernetesReleasesMutex sync.RWMutex - getPacificTanzuKubernetesReleasesArgsForCall []struct { - } - getPacificTanzuKubernetesReleasesReturns struct { - result1 []string - result2 error - } - getPacificTanzuKubernetesReleasesReturnsOnCall map[int]struct { - result1 []string - result2 error - } - GetPackageStub func(string, string) (*v1alpha1.Package, error) - getPackageMutex sync.RWMutex - getPackageArgsForCall []struct { - arg1 string - arg2 string - } - getPackageReturns struct { - result1 *v1alpha1.Package - result2 error - } - getPackageReturnsOnCall map[int]struct { - result1 *v1alpha1.Package - result2 error - } - GetPinnipedIssuerURLAndCAStub func() (string, string, error) - getPinnipedIssuerURLAndCAMutex sync.RWMutex - getPinnipedIssuerURLAndCAArgsForCall []struct { - } - getPinnipedIssuerURLAndCAReturns struct { - result1 string - result2 string - result3 error - } - getPinnipedIssuerURLAndCAReturnsOnCall map[int]struct { - result1 string - result2 string - result3 error - } - GetRegionalClusterDefaultProviderNameStub func(v1alpha3a.ProviderType) (string, error) - getRegionalClusterDefaultProviderNameMutex sync.RWMutex - getRegionalClusterDefaultProviderNameArgsForCall []struct { - arg1 v1alpha3a.ProviderType - } - getRegionalClusterDefaultProviderNameReturns struct { - result1 string - result2 error - } - getRegionalClusterDefaultProviderNameReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetResourceStub func(interface{}, string, string, clusterclient.PostVerifyrFunc, *clusterclient.PollOptions) error - getResourceMutex sync.RWMutex - getResourceArgsForCall []struct { - arg1 interface{} - arg2 string - arg3 string - arg4 clusterclient.PostVerifyrFunc - arg5 *clusterclient.PollOptions - } - getResourceReturns struct { - result1 error - } - getResourceReturnsOnCall map[int]struct { - result1 error - } - GetResourceListStub func(interface{}, string, string, clusterclient.PostVerifyListrFunc, *clusterclient.PollOptions) error - getResourceListMutex sync.RWMutex - getResourceListArgsForCall []struct { - arg1 interface{} - arg2 string - arg3 string - arg4 clusterclient.PostVerifyListrFunc - arg5 *clusterclient.PollOptions - } - getResourceListReturns struct { - result1 error - } - getResourceListReturnsOnCall map[int]struct { - result1 error - } - GetSecretValueStub func(string, string, string, *clusterclient.PollOptions) ([]byte, error) - getSecretValueMutex sync.RWMutex - getSecretValueArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 *clusterclient.PollOptions - } - getSecretValueReturns struct { - result1 []byte - result2 error - } - getSecretValueReturnsOnCall map[int]struct { - result1 []byte - result2 error - } - GetTanzuKubernetesReleasesStub func(string) ([]v1alpha1a.TanzuKubernetesRelease, error) - getTanzuKubernetesReleasesMutex sync.RWMutex - getTanzuKubernetesReleasesArgsForCall []struct { - arg1 string - } - getTanzuKubernetesReleasesReturns struct { - result1 []v1alpha1a.TanzuKubernetesRelease - result2 error - } - getTanzuKubernetesReleasesReturnsOnCall map[int]struct { - result1 []v1alpha1a.TanzuKubernetesRelease - result2 error - } - GetVCClientAndDataCenterStub func(string, string, string, vc.VcClientFactory) (vc.Client, string, error) - getVCClientAndDataCenterMutex sync.RWMutex - getVCClientAndDataCenterArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 vc.VcClientFactory - } - getVCClientAndDataCenterReturns struct { - result1 vc.Client - result2 string - result3 error - } - getVCClientAndDataCenterReturnsOnCall map[int]struct { - result1 vc.Client - result2 string - result3 error - } - GetVCCredentialsFromClusterStub func(string, string) (string, string, error) - getVCCredentialsFromClusterMutex sync.RWMutex - getVCCredentialsFromClusterArgsForCall []struct { - arg1 string - arg2 string - } - getVCCredentialsFromClusterReturns struct { - result1 string - result2 string - result3 error - } - getVCCredentialsFromClusterReturnsOnCall map[int]struct { - result1 string - result2 string - result3 error - } - GetVCCredentialsFromSecretStub func(string) (string, string, error) - getVCCredentialsFromSecretMutex sync.RWMutex - getVCCredentialsFromSecretArgsForCall []struct { - arg1 string - } - getVCCredentialsFromSecretReturns struct { - result1 string - result2 string - result3 error - } - getVCCredentialsFromSecretReturnsOnCall map[int]struct { - result1 string - result2 string - result3 error - } - GetVCServerStub func() (string, error) - getVCServerMutex sync.RWMutex - getVCServerArgsForCall []struct { - } - getVCServerReturns struct { - result1 string - result2 error - } - getVCServerReturnsOnCall map[int]struct { - result1 string - result2 error - } - HasCEIPTelemetryJobStub func(string) (bool, error) - hasCEIPTelemetryJobMutex sync.RWMutex - hasCEIPTelemetryJobArgsForCall []struct { - arg1 string - } - hasCEIPTelemetryJobReturns struct { - result1 bool - result2 error - } - hasCEIPTelemetryJobReturnsOnCall map[int]struct { - result1 bool - result2 error - } - IsClusterClassBasedStub func(string, string) (bool, error) - isClusterClassBasedMutex sync.RWMutex - isClusterClassBasedArgsForCall []struct { - arg1 string - arg2 string - } - isClusterClassBasedReturns struct { - result1 bool - result2 error - } - isClusterClassBasedReturnsOnCall map[int]struct { - result1 bool - result2 error - } - IsClusterRegisteredToTMCStub func() (bool, error) - isClusterRegisteredToTMCMutex sync.RWMutex - isClusterRegisteredToTMCArgsForCall []struct { - } - isClusterRegisteredToTMCReturns struct { - result1 bool - result2 error - } - isClusterRegisteredToTMCReturnsOnCall map[int]struct { - result1 bool - result2 error - } - IsPacificRegionalClusterStub func() (bool, error) - isPacificRegionalClusterMutex sync.RWMutex - isPacificRegionalClusterArgsForCall []struct { - } - isPacificRegionalClusterReturns struct { - result1 bool - result2 error - } - isPacificRegionalClusterReturnsOnCall map[int]struct { - result1 bool - result2 error - } - IsRegionalClusterStub func() error - isRegionalClusterMutex sync.RWMutex - isRegionalClusterArgsForCall []struct { - } - isRegionalClusterReturns struct { - result1 error - } - isRegionalClusterReturnsOnCall map[int]struct { - result1 error - } - ListCLIPluginResourcesStub func() ([]v1alpha1b.CLIPlugin, error) - listCLIPluginResourcesMutex sync.RWMutex - listCLIPluginResourcesArgsForCall []struct { - } - listCLIPluginResourcesReturns struct { - result1 []v1alpha1b.CLIPlugin - result2 error - } - listCLIPluginResourcesReturnsOnCall map[int]struct { - result1 []v1alpha1b.CLIPlugin - result2 error - } - ListClustersStub func(string) ([]v1beta1a.Cluster, error) - listClustersMutex sync.RWMutex - listClustersArgsForCall []struct { - arg1 string - } - listClustersReturns struct { - result1 []v1beta1a.Cluster - result2 error - } - listClustersReturnsOnCall map[int]struct { - result1 []v1beta1a.Cluster - result2 error - } - ListPacificClusterObjectsStub func(string, *client.ListOptions) ([]interface{}, error) - listPacificClusterObjectsMutex sync.RWMutex - listPacificClusterObjectsArgsForCall []struct { - arg1 string - arg2 *client.ListOptions - } - listPacificClusterObjectsReturns struct { - result1 []interface{} - result2 error - } - listPacificClusterObjectsReturnsOnCall map[int]struct { - result1 []interface{} - result2 error - } - ListResourcesStub func(interface{}, ...client.ListOption) error - listResourcesMutex sync.RWMutex - listResourcesArgsForCall []struct { - arg1 interface{} - arg2 []client.ListOption - } - listResourcesReturns struct { - result1 error - } - listResourcesReturnsOnCall map[int]struct { - result1 error - } - LoadCurrentKubeconfigBytesStub func() ([]byte, error) - loadCurrentKubeconfigBytesMutex sync.RWMutex - loadCurrentKubeconfigBytesArgsForCall []struct { - } - loadCurrentKubeconfigBytesReturns struct { - result1 []byte - result2 error - } - loadCurrentKubeconfigBytesReturnsOnCall map[int]struct { - result1 []byte - result2 error - } - MergeAndUseConfigForClusterStub func([]byte, string) (string, string, error) - mergeAndUseConfigForClusterMutex sync.RWMutex - mergeAndUseConfigForClusterArgsForCall []struct { - arg1 []byte - arg2 string - } - mergeAndUseConfigForClusterReturns struct { - result1 string - result2 string - result3 error - } - mergeAndUseConfigForClusterReturnsOnCall map[int]struct { - result1 string - result2 string - result3 error - } - MergeConfigForClusterStub func([]byte, string) error - mergeConfigForClusterMutex sync.RWMutex - mergeConfigForClusterArgsForCall []struct { - arg1 []byte - arg2 string - } - mergeConfigForClusterReturns struct { - result1 error - } - mergeConfigForClusterReturnsOnCall map[int]struct { - result1 error - } - PatchCalicoKubeControllerDeploymentWithNewNodeSelectorStub func(string, string) error - patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex sync.RWMutex - patchCalicoKubeControllerDeploymentWithNewNodeSelectorArgsForCall []struct { - arg1 string - arg2 string - } - patchCalicoKubeControllerDeploymentWithNewNodeSelectorReturns struct { - result1 error - } - patchCalicoKubeControllerDeploymentWithNewNodeSelectorReturnsOnCall map[int]struct { - result1 error - } - PatchCalicoNodeDaemonSetWithNewNodeSelectorStub func(string, string) error - patchCalicoNodeDaemonSetWithNewNodeSelectorMutex sync.RWMutex - patchCalicoNodeDaemonSetWithNewNodeSelectorArgsForCall []struct { - arg1 string - arg2 string - } - patchCalicoNodeDaemonSetWithNewNodeSelectorReturns struct { - result1 error - } - patchCalicoNodeDaemonSetWithNewNodeSelectorReturnsOnCall map[int]struct { - result1 error - } - PatchClusterAPIAWSControllersToUseEC2CredentialsStub func() error - patchClusterAPIAWSControllersToUseEC2CredentialsMutex sync.RWMutex - patchClusterAPIAWSControllersToUseEC2CredentialsArgsForCall []struct { - } - patchClusterAPIAWSControllersToUseEC2CredentialsReturns struct { - result1 error - } - patchClusterAPIAWSControllersToUseEC2CredentialsReturnsOnCall map[int]struct { - result1 error - } - PatchClusterObjectStub func(string, string, string) error - patchClusterObjectMutex sync.RWMutex - patchClusterObjectArgsForCall []struct { - arg1 string - arg2 string - arg3 string - } - patchClusterObjectReturns struct { - result1 error - } - patchClusterObjectReturnsOnCall map[int]struct { - result1 error - } - PatchClusterObjectAnnotationsStub func(string, string, string, string) error - patchClusterObjectAnnotationsMutex sync.RWMutex - patchClusterObjectAnnotationsArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 string - } - patchClusterObjectAnnotationsReturns struct { - result1 error - } - patchClusterObjectAnnotationsReturnsOnCall map[int]struct { - result1 error - } - PatchClusterObjectWithOptionalMetadataStub func(string, string, string, map[string]string) (string, error) - patchClusterObjectWithOptionalMetadataMutex sync.RWMutex - patchClusterObjectWithOptionalMetadataArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 map[string]string - } - patchClusterObjectWithOptionalMetadataReturns struct { - result1 string - result2 error - } - patchClusterObjectWithOptionalMetadataReturnsOnCall map[int]struct { - result1 string - result2 error - } - PatchClusterObjectWithPollOptionsStub func(string, string, string, *clusterclient.PollOptions) error - patchClusterObjectWithPollOptionsMutex sync.RWMutex - patchClusterObjectWithPollOptionsArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 *clusterclient.PollOptions - } - patchClusterObjectWithPollOptionsReturns struct { - result1 error - } - patchClusterObjectWithPollOptionsReturnsOnCall map[int]struct { - result1 error - } - PatchClusterObjectWithTKGVersionStub func(string, string, string) error - patchClusterObjectWithTKGVersionMutex sync.RWMutex - patchClusterObjectWithTKGVersionArgsForCall []struct { - arg1 string - arg2 string - arg3 string - } - patchClusterObjectWithTKGVersionReturns struct { - result1 error - } - patchClusterObjectWithTKGVersionReturnsOnCall map[int]struct { - result1 error - } - PatchClusterWithOperationStartedStatusStub func(string, string, string, time.Duration) error - patchClusterWithOperationStartedStatusMutex sync.RWMutex - patchClusterWithOperationStartedStatusArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 time.Duration - } - patchClusterWithOperationStartedStatusReturns struct { - result1 error - } - patchClusterWithOperationStartedStatusReturnsOnCall map[int]struct { - result1 error - } - PatchCoreDNSImageRepositoryInKubeadmConfigMapStub func(string) error - patchCoreDNSImageRepositoryInKubeadmConfigMapMutex sync.RWMutex - patchCoreDNSImageRepositoryInKubeadmConfigMapArgsForCall []struct { - arg1 string - } - patchCoreDNSImageRepositoryInKubeadmConfigMapReturns struct { - result1 error - } - patchCoreDNSImageRepositoryInKubeadmConfigMapReturnsOnCall map[int]struct { - result1 error - } - PatchImageRepositoryInKubeProxyDaemonSetStub func(string) error - patchImageRepositoryInKubeProxyDaemonSetMutex sync.RWMutex - patchImageRepositoryInKubeProxyDaemonSetArgsForCall []struct { - arg1 string - } - patchImageRepositoryInKubeProxyDaemonSetReturns struct { - result1 error - } - patchImageRepositoryInKubeProxyDaemonSetReturnsOnCall map[int]struct { - result1 error - } - PatchK8SVersionToPacificClusterStub func(string, string, string) error - patchK8SVersionToPacificClusterMutex sync.RWMutex - patchK8SVersionToPacificClusterArgsForCall []struct { - arg1 string - arg2 string - arg3 string - } - patchK8SVersionToPacificClusterReturns struct { - result1 error - } - patchK8SVersionToPacificClusterReturnsOnCall map[int]struct { - result1 error - } - PatchKappControllerLastAppliedAnnotationStub func(string) error - patchKappControllerLastAppliedAnnotationMutex sync.RWMutex - patchKappControllerLastAppliedAnnotationArgsForCall []struct { - arg1 string - } - patchKappControllerLastAppliedAnnotationReturns struct { - result1 error - } - patchKappControllerLastAppliedAnnotationReturnsOnCall map[int]struct { - result1 error - } - PatchResourceStub func(interface{}, string, string, string, types.PatchType, *clusterclient.PollOptions) error - patchResourceMutex sync.RWMutex - patchResourceArgsForCall []struct { - arg1 interface{} - arg2 string - arg3 string - arg4 string - arg5 types.PatchType - arg6 *clusterclient.PollOptions - } - patchResourceReturns struct { - result1 error - } - patchResourceReturnsOnCall map[int]struct { - result1 error - } - RemoveCEIPTelemetryJobStub func(string) error - removeCEIPTelemetryJobMutex sync.RWMutex - removeCEIPTelemetryJobArgsForCall []struct { - arg1 string - } - removeCEIPTelemetryJobReturns struct { - result1 error - } - removeCEIPTelemetryJobReturnsOnCall map[int]struct { - result1 error - } - RemoveMatchingMetadataFromResourcesStub func(schema.GroupVersionKind, string, string, []string) error - removeMatchingMetadataFromResourcesMutex sync.RWMutex - removeMatchingMetadataFromResourcesArgsForCall []struct { - arg1 schema.GroupVersionKind - arg2 string - arg3 string - arg4 []string - } - removeMatchingMetadataFromResourcesReturns struct { - result1 error - } - removeMatchingMetadataFromResourcesReturnsOnCall map[int]struct { - result1 error - } - ScalePacificClusterControlPlaneStub func(string, string, int32) error - scalePacificClusterControlPlaneMutex sync.RWMutex - scalePacificClusterControlPlaneArgsForCall []struct { - arg1 string - arg2 string - arg3 int32 - } - scalePacificClusterControlPlaneReturns struct { - result1 error - } - scalePacificClusterControlPlaneReturnsOnCall map[int]struct { - result1 error - } - ScalePacificClusterWorkerNodesStub func(string, string, int32) error - scalePacificClusterWorkerNodesMutex sync.RWMutex - scalePacificClusterWorkerNodesArgsForCall []struct { - arg1 string - arg2 string - arg3 int32 - } - scalePacificClusterWorkerNodesReturns struct { - result1 error - } - scalePacificClusterWorkerNodesReturnsOnCall map[int]struct { - result1 error - } - UpdateAWSCNIIngressRulesStub func(string, string, v1beta2.CNIIngressRule) error - updateAWSCNIIngressRulesMutex sync.RWMutex - updateAWSCNIIngressRulesArgsForCall []struct { - arg1 string - arg2 string - arg3 v1beta2.CNIIngressRule - } - updateAWSCNIIngressRulesReturns struct { - result1 error - } - updateAWSCNIIngressRulesReturnsOnCall map[int]struct { - result1 error - } - UpdateAzureClusterIdentityStub func(string, string, string, string, string) error - updateAzureClusterIdentityMutex sync.RWMutex - updateAzureClusterIdentityArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 string - arg5 string - } - updateAzureClusterIdentityReturns struct { - result1 error - } - updateAzureClusterIdentityReturnsOnCall map[int]struct { - result1 error - } - UpdateAzureKCPStub func(string, string) error - updateAzureKCPMutex sync.RWMutex - updateAzureKCPArgsForCall []struct { - arg1 string - arg2 string - } - updateAzureKCPReturns struct { - result1 error - } - updateAzureKCPReturnsOnCall map[int]struct { - result1 error - } - UpdateCAPZControllerManagerDeploymentReplicasStub func(int32) error - updateCAPZControllerManagerDeploymentReplicasMutex sync.RWMutex - updateCAPZControllerManagerDeploymentReplicasArgsForCall []struct { - arg1 int32 - } - updateCAPZControllerManagerDeploymentReplicasReturns struct { - result1 error - } - updateCAPZControllerManagerDeploymentReplicasReturnsOnCall map[int]struct { - result1 error - } - UpdateCapvManagerBootstrapCredentialsSecretStub func(string, string) error - updateCapvManagerBootstrapCredentialsSecretMutex sync.RWMutex - updateCapvManagerBootstrapCredentialsSecretArgsForCall []struct { - arg1 string - arg2 string - } - updateCapvManagerBootstrapCredentialsSecretReturns struct { - result1 error - } - updateCapvManagerBootstrapCredentialsSecretReturnsOnCall map[int]struct { - result1 error - } - UpdateCapzManagerBootstrapCredentialsSecretStub func(string, string, string) error - updateCapzManagerBootstrapCredentialsSecretMutex sync.RWMutex - updateCapzManagerBootstrapCredentialsSecretArgsForCall []struct { - arg1 string - arg2 string - arg3 string - } - updateCapzManagerBootstrapCredentialsSecretReturns struct { - result1 error - } - updateCapzManagerBootstrapCredentialsSecretReturnsOnCall map[int]struct { - result1 error - } - UpdateReplicasStub func(interface{}, string, string, int32) error - updateReplicasMutex sync.RWMutex - updateReplicasArgsForCall []struct { - arg1 interface{} - arg2 string - arg3 string - arg4 int32 - } - updateReplicasReturns struct { - result1 error - } - updateReplicasReturnsOnCall map[int]struct { - result1 error - } - UpdateResourceStub func(interface{}, string, string, ...client.UpdateOption) error - updateResourceMutex sync.RWMutex - updateResourceArgsForCall []struct { - arg1 interface{} - arg2 string - arg3 string - arg4 []client.UpdateOption - } - updateResourceReturns struct { - result1 error - } - updateResourceReturnsOnCall map[int]struct { - result1 error - } - UpdateResourceWithPollingStub func(interface{}, string, string, *clusterclient.PollOptions, ...client.UpdateOption) error - updateResourceWithPollingMutex sync.RWMutex - updateResourceWithPollingArgsForCall []struct { - arg1 interface{} - arg2 string - arg3 string - arg4 *clusterclient.PollOptions - arg5 []client.UpdateOption - } - updateResourceWithPollingReturns struct { - result1 error - } - updateResourceWithPollingReturnsOnCall map[int]struct { - result1 error - } - UpdateVsphereCloudProviderCredentialsSecretStub func(string, string, string, string) error - updateVsphereCloudProviderCredentialsSecretMutex sync.RWMutex - updateVsphereCloudProviderCredentialsSecretArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 string - } - updateVsphereCloudProviderCredentialsSecretReturns struct { - result1 error - } - updateVsphereCloudProviderCredentialsSecretReturnsOnCall map[int]struct { - result1 error - } - UpdateVsphereCsiConfigSecretStub func(string, string, string, string) error - updateVsphereCsiConfigSecretMutex sync.RWMutex - updateVsphereCsiConfigSecretArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 string - } - updateVsphereCsiConfigSecretReturns struct { - result1 error - } - updateVsphereCsiConfigSecretReturnsOnCall map[int]struct { - result1 error - } - UpdateVsphereIdentityRefSecretStub func(string, string, string, string) error - updateVsphereIdentityRefSecretMutex sync.RWMutex - updateVsphereIdentityRefSecretArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 string - } - updateVsphereIdentityRefSecretReturns struct { - result1 error - } - updateVsphereIdentityRefSecretReturnsOnCall map[int]struct { - result1 error - } - UseContextStub func(string) error - useContextMutex sync.RWMutex - useContextArgsForCall []struct { - arg1 string - } - useContextReturns struct { - result1 error - } - useContextReturnsOnCall map[int]struct { - result1 error - } - VerifyCLIPluginCRDStub func() (bool, error) - verifyCLIPluginCRDMutex sync.RWMutex - verifyCLIPluginCRDArgsForCall []struct { - } - verifyCLIPluginCRDReturns struct { - result1 bool - result2 error - } - verifyCLIPluginCRDReturnsOnCall map[int]struct { - result1 bool - result2 error - } - VerifyExistenceOfCRDStub func(string, string) (bool, error) - verifyExistenceOfCRDMutex sync.RWMutex - verifyExistenceOfCRDArgsForCall []struct { - arg1 string - arg2 string - } - verifyExistenceOfCRDReturns struct { - result1 bool - result2 error - } - verifyExistenceOfCRDReturnsOnCall map[int]struct { - result1 bool - result2 error - } - WaitForAVIResourceCleanUpStub func(string, string) error - waitForAVIResourceCleanUpMutex sync.RWMutex - waitForAVIResourceCleanUpArgsForCall []struct { - arg1 string - arg2 string - } - waitForAVIResourceCleanUpReturns struct { - result1 error - } - waitForAVIResourceCleanUpReturnsOnCall map[int]struct { - result1 error - } - WaitForAutoscalerDeploymentStub func(string, string) error - waitForAutoscalerDeploymentMutex sync.RWMutex - waitForAutoscalerDeploymentArgsForCall []struct { - arg1 string - arg2 string - } - waitForAutoscalerDeploymentReturns struct { - result1 error - } - waitForAutoscalerDeploymentReturnsOnCall map[int]struct { - result1 error - } - WaitForClusterDeletionStub func(string, string) error - waitForClusterDeletionMutex sync.RWMutex - waitForClusterDeletionArgsForCall []struct { - arg1 string - arg2 string - } - waitForClusterDeletionReturns struct { - result1 error - } - waitForClusterDeletionReturnsOnCall map[int]struct { - result1 error - } - WaitForClusterInitializedStub func(string, string) error - waitForClusterInitializedMutex sync.RWMutex - waitForClusterInitializedArgsForCall []struct { - arg1 string - arg2 string - } - waitForClusterInitializedReturns struct { - result1 error - } - waitForClusterInitializedReturnsOnCall map[int]struct { - result1 error - } - WaitForClusterReadyStub func(string, string, bool) error - waitForClusterReadyMutex sync.RWMutex - waitForClusterReadyArgsForCall []struct { - arg1 string - arg2 string - arg3 bool - } - waitForClusterReadyReturns struct { - result1 error - } - waitForClusterReadyReturnsOnCall map[int]struct { - result1 error - } - WaitForControlPlaneAvailableStub func(string, string) error - waitForControlPlaneAvailableMutex sync.RWMutex - waitForControlPlaneAvailableArgsForCall []struct { - arg1 string - arg2 string - } - waitForControlPlaneAvailableReturns struct { - result1 error - } - waitForControlPlaneAvailableReturnsOnCall map[int]struct { - result1 error - } - WaitForDeploymentStub func(string, string) error - waitForDeploymentMutex sync.RWMutex - waitForDeploymentArgsForCall []struct { - arg1 string - arg2 string - } - waitForDeploymentReturns struct { - result1 error - } - waitForDeploymentReturnsOnCall map[int]struct { - result1 error - } - WaitForPacificClusterStub func(string, string) error - waitForPacificClusterMutex sync.RWMutex - waitForPacificClusterArgsForCall []struct { - arg1 string - arg2 string - } - waitForPacificClusterReturns struct { - result1 error - } - waitForPacificClusterReturnsOnCall map[int]struct { - result1 error - } - WaitForPacificClusterK8sVersionUpdateStub func(string, string, string) error - waitForPacificClusterK8sVersionUpdateMutex sync.RWMutex - waitForPacificClusterK8sVersionUpdateArgsForCall []struct { - arg1 string - arg2 string - arg3 string - } - waitForPacificClusterK8sVersionUpdateReturns struct { - result1 error - } - waitForPacificClusterK8sVersionUpdateReturnsOnCall map[int]struct { - result1 error - } - WaitForPackageInstallStub func(string, string, time.Duration) error - waitForPackageInstallMutex sync.RWMutex - waitForPackageInstallArgsForCall []struct { - arg1 string - arg2 string - arg3 time.Duration - } - waitForPackageInstallReturns struct { - result1 error - } - waitForPackageInstallReturnsOnCall map[int]struct { - result1 error - } - WaitK8sVersionUpdateForCPNodesStub func(string, string, string, clusterclient.Client) error - waitK8sVersionUpdateForCPNodesMutex sync.RWMutex - waitK8sVersionUpdateForCPNodesArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 clusterclient.Client - } - waitK8sVersionUpdateForCPNodesReturns struct { - result1 error - } - waitK8sVersionUpdateForCPNodesReturnsOnCall map[int]struct { - result1 error - } - WaitK8sVersionUpdateForWorkerNodesStub func(string, string, string, clusterclient.Client) error - waitK8sVersionUpdateForWorkerNodesMutex sync.RWMutex - waitK8sVersionUpdateForWorkerNodesArgsForCall []struct { - arg1 string - arg2 string - arg3 string - arg4 clusterclient.Client - } - waitK8sVersionUpdateForWorkerNodesReturns struct { - result1 error - } - waitK8sVersionUpdateForWorkerNodesReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *ClusterClient) ActivateTanzuKubernetesReleases(arg1 string) error { - fake.activateTanzuKubernetesReleasesMutex.Lock() - ret, specificReturn := fake.activateTanzuKubernetesReleasesReturnsOnCall[len(fake.activateTanzuKubernetesReleasesArgsForCall)] - fake.activateTanzuKubernetesReleasesArgsForCall = append(fake.activateTanzuKubernetesReleasesArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ActivateTanzuKubernetesReleasesStub - fakeReturns := fake.activateTanzuKubernetesReleasesReturns - fake.recordInvocation("ActivateTanzuKubernetesReleases", []interface{}{arg1}) - fake.activateTanzuKubernetesReleasesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) ActivateTanzuKubernetesReleasesCallCount() int { - fake.activateTanzuKubernetesReleasesMutex.RLock() - defer fake.activateTanzuKubernetesReleasesMutex.RUnlock() - return len(fake.activateTanzuKubernetesReleasesArgsForCall) -} - -func (fake *ClusterClient) ActivateTanzuKubernetesReleasesCalls(stub func(string) error) { - fake.activateTanzuKubernetesReleasesMutex.Lock() - defer fake.activateTanzuKubernetesReleasesMutex.Unlock() - fake.ActivateTanzuKubernetesReleasesStub = stub -} - -func (fake *ClusterClient) ActivateTanzuKubernetesReleasesArgsForCall(i int) string { - fake.activateTanzuKubernetesReleasesMutex.RLock() - defer fake.activateTanzuKubernetesReleasesMutex.RUnlock() - argsForCall := fake.activateTanzuKubernetesReleasesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) ActivateTanzuKubernetesReleasesReturns(result1 error) { - fake.activateTanzuKubernetesReleasesMutex.Lock() - defer fake.activateTanzuKubernetesReleasesMutex.Unlock() - fake.ActivateTanzuKubernetesReleasesStub = nil - fake.activateTanzuKubernetesReleasesReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ActivateTanzuKubernetesReleasesReturnsOnCall(i int, result1 error) { - fake.activateTanzuKubernetesReleasesMutex.Lock() - defer fake.activateTanzuKubernetesReleasesMutex.Unlock() - fake.ActivateTanzuKubernetesReleasesStub = nil - if fake.activateTanzuKubernetesReleasesReturnsOnCall == nil { - fake.activateTanzuKubernetesReleasesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.activateTanzuKubernetesReleasesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) AddCEIPTelemetryJob(arg1 string, arg2 string, arg3 *tkgconfigbom.BOMConfiguration, arg4 string, arg5 string, arg6 string, arg7 string, arg8 string) error { - fake.addCEIPTelemetryJobMutex.Lock() - ret, specificReturn := fake.addCEIPTelemetryJobReturnsOnCall[len(fake.addCEIPTelemetryJobArgsForCall)] - fake.addCEIPTelemetryJobArgsForCall = append(fake.addCEIPTelemetryJobArgsForCall, struct { - arg1 string - arg2 string - arg3 *tkgconfigbom.BOMConfiguration - arg4 string - arg5 string - arg6 string - arg7 string - arg8 string - }{arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8}) - stub := fake.AddCEIPTelemetryJobStub - fakeReturns := fake.addCEIPTelemetryJobReturns - fake.recordInvocation("AddCEIPTelemetryJob", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8}) - fake.addCEIPTelemetryJobMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) AddCEIPTelemetryJobCallCount() int { - fake.addCEIPTelemetryJobMutex.RLock() - defer fake.addCEIPTelemetryJobMutex.RUnlock() - return len(fake.addCEIPTelemetryJobArgsForCall) -} - -func (fake *ClusterClient) AddCEIPTelemetryJobCalls(stub func(string, string, *tkgconfigbom.BOMConfiguration, string, string, string, string, string) error) { - fake.addCEIPTelemetryJobMutex.Lock() - defer fake.addCEIPTelemetryJobMutex.Unlock() - fake.AddCEIPTelemetryJobStub = stub -} - -func (fake *ClusterClient) AddCEIPTelemetryJobArgsForCall(i int) (string, string, *tkgconfigbom.BOMConfiguration, string, string, string, string, string) { - fake.addCEIPTelemetryJobMutex.RLock() - defer fake.addCEIPTelemetryJobMutex.RUnlock() - argsForCall := fake.addCEIPTelemetryJobArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5, argsForCall.arg6, argsForCall.arg7, argsForCall.arg8 -} - -func (fake *ClusterClient) AddCEIPTelemetryJobReturns(result1 error) { - fake.addCEIPTelemetryJobMutex.Lock() - defer fake.addCEIPTelemetryJobMutex.Unlock() - fake.AddCEIPTelemetryJobStub = nil - fake.addCEIPTelemetryJobReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) AddCEIPTelemetryJobReturnsOnCall(i int, result1 error) { - fake.addCEIPTelemetryJobMutex.Lock() - defer fake.addCEIPTelemetryJobMutex.Unlock() - fake.AddCEIPTelemetryJobStub = nil - if fake.addCEIPTelemetryJobReturnsOnCall == nil { - fake.addCEIPTelemetryJobReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.addCEIPTelemetryJobReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) Apply(arg1 string) error { - fake.applyMutex.Lock() - ret, specificReturn := fake.applyReturnsOnCall[len(fake.applyArgsForCall)] - fake.applyArgsForCall = append(fake.applyArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ApplyStub - fakeReturns := fake.applyReturns - fake.recordInvocation("Apply", []interface{}{arg1}) - fake.applyMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) ApplyCallCount() int { - fake.applyMutex.RLock() - defer fake.applyMutex.RUnlock() - return len(fake.applyArgsForCall) -} - -func (fake *ClusterClient) ApplyCalls(stub func(string) error) { - fake.applyMutex.Lock() - defer fake.applyMutex.Unlock() - fake.ApplyStub = stub -} - -func (fake *ClusterClient) ApplyArgsForCall(i int) string { - fake.applyMutex.RLock() - defer fake.applyMutex.RUnlock() - argsForCall := fake.applyArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) ApplyReturns(result1 error) { - fake.applyMutex.Lock() - defer fake.applyMutex.Unlock() - fake.ApplyStub = nil - fake.applyReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ApplyReturnsOnCall(i int, result1 error) { - fake.applyMutex.Lock() - defer fake.applyMutex.Unlock() - fake.ApplyStub = nil - if fake.applyReturnsOnCall == nil { - fake.applyReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.applyReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ApplyFile(arg1 string) error { - fake.applyFileMutex.Lock() - ret, specificReturn := fake.applyFileReturnsOnCall[len(fake.applyFileArgsForCall)] - fake.applyFileArgsForCall = append(fake.applyFileArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ApplyFileStub - fakeReturns := fake.applyFileReturns - fake.recordInvocation("ApplyFile", []interface{}{arg1}) - fake.applyFileMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) ApplyFileCallCount() int { - fake.applyFileMutex.RLock() - defer fake.applyFileMutex.RUnlock() - return len(fake.applyFileArgsForCall) -} - -func (fake *ClusterClient) ApplyFileCalls(stub func(string) error) { - fake.applyFileMutex.Lock() - defer fake.applyFileMutex.Unlock() - fake.ApplyFileStub = stub -} - -func (fake *ClusterClient) ApplyFileArgsForCall(i int) string { - fake.applyFileMutex.RLock() - defer fake.applyFileMutex.RUnlock() - argsForCall := fake.applyFileArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) ApplyFileReturns(result1 error) { - fake.applyFileMutex.Lock() - defer fake.applyFileMutex.Unlock() - fake.ApplyFileStub = nil - fake.applyFileReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ApplyFileReturnsOnCall(i int, result1 error) { - fake.applyFileMutex.Lock() - defer fake.applyFileMutex.Unlock() - fake.ApplyFileStub = nil - if fake.applyFileReturnsOnCall == nil { - fake.applyFileReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.applyFileReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ApplyFileRecursively(arg1 string, arg2 string) error { - fake.applyFileRecursivelyMutex.Lock() - ret, specificReturn := fake.applyFileRecursivelyReturnsOnCall[len(fake.applyFileRecursivelyArgsForCall)] - fake.applyFileRecursivelyArgsForCall = append(fake.applyFileRecursivelyArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.ApplyFileRecursivelyStub - fakeReturns := fake.applyFileRecursivelyReturns - fake.recordInvocation("ApplyFileRecursively", []interface{}{arg1, arg2}) - fake.applyFileRecursivelyMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) ApplyFileRecursivelyCallCount() int { - fake.applyFileRecursivelyMutex.RLock() - defer fake.applyFileRecursivelyMutex.RUnlock() - return len(fake.applyFileRecursivelyArgsForCall) -} - -func (fake *ClusterClient) ApplyFileRecursivelyCalls(stub func(string, string) error) { - fake.applyFileRecursivelyMutex.Lock() - defer fake.applyFileRecursivelyMutex.Unlock() - fake.ApplyFileRecursivelyStub = stub -} - -func (fake *ClusterClient) ApplyFileRecursivelyArgsForCall(i int) (string, string) { - fake.applyFileRecursivelyMutex.RLock() - defer fake.applyFileRecursivelyMutex.RUnlock() - argsForCall := fake.applyFileRecursivelyArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) ApplyFileRecursivelyReturns(result1 error) { - fake.applyFileRecursivelyMutex.Lock() - defer fake.applyFileRecursivelyMutex.Unlock() - fake.ApplyFileRecursivelyStub = nil - fake.applyFileRecursivelyReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ApplyFileRecursivelyReturnsOnCall(i int, result1 error) { - fake.applyFileRecursivelyMutex.Lock() - defer fake.applyFileRecursivelyMutex.Unlock() - fake.ApplyFileRecursivelyStub = nil - if fake.applyFileRecursivelyReturnsOnCall == nil { - fake.applyFileRecursivelyReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.applyFileRecursivelyReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ApplyPatchForAutoScalerDeployment(arg1 tkgconfigbom.Client, arg2 string, arg3 string, arg4 string) error { - fake.applyPatchForAutoScalerDeploymentMutex.Lock() - ret, specificReturn := fake.applyPatchForAutoScalerDeploymentReturnsOnCall[len(fake.applyPatchForAutoScalerDeploymentArgsForCall)] - fake.applyPatchForAutoScalerDeploymentArgsForCall = append(fake.applyPatchForAutoScalerDeploymentArgsForCall, struct { - arg1 tkgconfigbom.Client - arg2 string - arg3 string - arg4 string - }{arg1, arg2, arg3, arg4}) - stub := fake.ApplyPatchForAutoScalerDeploymentStub - fakeReturns := fake.applyPatchForAutoScalerDeploymentReturns - fake.recordInvocation("ApplyPatchForAutoScalerDeployment", []interface{}{arg1, arg2, arg3, arg4}) - fake.applyPatchForAutoScalerDeploymentMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) ApplyPatchForAutoScalerDeploymentCallCount() int { - fake.applyPatchForAutoScalerDeploymentMutex.RLock() - defer fake.applyPatchForAutoScalerDeploymentMutex.RUnlock() - return len(fake.applyPatchForAutoScalerDeploymentArgsForCall) -} - -func (fake *ClusterClient) ApplyPatchForAutoScalerDeploymentCalls(stub func(tkgconfigbom.Client, string, string, string) error) { - fake.applyPatchForAutoScalerDeploymentMutex.Lock() - defer fake.applyPatchForAutoScalerDeploymentMutex.Unlock() - fake.ApplyPatchForAutoScalerDeploymentStub = stub -} - -func (fake *ClusterClient) ApplyPatchForAutoScalerDeploymentArgsForCall(i int) (tkgconfigbom.Client, string, string, string) { - fake.applyPatchForAutoScalerDeploymentMutex.RLock() - defer fake.applyPatchForAutoScalerDeploymentMutex.RUnlock() - argsForCall := fake.applyPatchForAutoScalerDeploymentArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) ApplyPatchForAutoScalerDeploymentReturns(result1 error) { - fake.applyPatchForAutoScalerDeploymentMutex.Lock() - defer fake.applyPatchForAutoScalerDeploymentMutex.Unlock() - fake.ApplyPatchForAutoScalerDeploymentStub = nil - fake.applyPatchForAutoScalerDeploymentReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ApplyPatchForAutoScalerDeploymentReturnsOnCall(i int, result1 error) { - fake.applyPatchForAutoScalerDeploymentMutex.Lock() - defer fake.applyPatchForAutoScalerDeploymentMutex.Unlock() - fake.ApplyPatchForAutoScalerDeploymentStub = nil - if fake.applyPatchForAutoScalerDeploymentReturnsOnCall == nil { - fake.applyPatchForAutoScalerDeploymentReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.applyPatchForAutoScalerDeploymentReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) CheckUnifiedAzureClusterIdentity(arg1 string, arg2 string) (bool, error) { - fake.checkUnifiedAzureClusterIdentityMutex.Lock() - ret, specificReturn := fake.checkUnifiedAzureClusterIdentityReturnsOnCall[len(fake.checkUnifiedAzureClusterIdentityArgsForCall)] - fake.checkUnifiedAzureClusterIdentityArgsForCall = append(fake.checkUnifiedAzureClusterIdentityArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.CheckUnifiedAzureClusterIdentityStub - fakeReturns := fake.checkUnifiedAzureClusterIdentityReturns - fake.recordInvocation("CheckUnifiedAzureClusterIdentity", []interface{}{arg1, arg2}) - fake.checkUnifiedAzureClusterIdentityMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) CheckUnifiedAzureClusterIdentityCallCount() int { - fake.checkUnifiedAzureClusterIdentityMutex.RLock() - defer fake.checkUnifiedAzureClusterIdentityMutex.RUnlock() - return len(fake.checkUnifiedAzureClusterIdentityArgsForCall) -} - -func (fake *ClusterClient) CheckUnifiedAzureClusterIdentityCalls(stub func(string, string) (bool, error)) { - fake.checkUnifiedAzureClusterIdentityMutex.Lock() - defer fake.checkUnifiedAzureClusterIdentityMutex.Unlock() - fake.CheckUnifiedAzureClusterIdentityStub = stub -} - -func (fake *ClusterClient) CheckUnifiedAzureClusterIdentityArgsForCall(i int) (string, string) { - fake.checkUnifiedAzureClusterIdentityMutex.RLock() - defer fake.checkUnifiedAzureClusterIdentityMutex.RUnlock() - argsForCall := fake.checkUnifiedAzureClusterIdentityArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) CheckUnifiedAzureClusterIdentityReturns(result1 bool, result2 error) { - fake.checkUnifiedAzureClusterIdentityMutex.Lock() - defer fake.checkUnifiedAzureClusterIdentityMutex.Unlock() - fake.CheckUnifiedAzureClusterIdentityStub = nil - fake.checkUnifiedAzureClusterIdentityReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) CheckUnifiedAzureClusterIdentityReturnsOnCall(i int, result1 bool, result2 error) { - fake.checkUnifiedAzureClusterIdentityMutex.Lock() - defer fake.checkUnifiedAzureClusterIdentityMutex.Unlock() - fake.CheckUnifiedAzureClusterIdentityStub = nil - if fake.checkUnifiedAzureClusterIdentityReturnsOnCall == nil { - fake.checkUnifiedAzureClusterIdentityReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.checkUnifiedAzureClusterIdentityReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) CloneWithTimeout(arg1 time.Duration) clusterclient.Client { - fake.cloneWithTimeoutMutex.Lock() - ret, specificReturn := fake.cloneWithTimeoutReturnsOnCall[len(fake.cloneWithTimeoutArgsForCall)] - fake.cloneWithTimeoutArgsForCall = append(fake.cloneWithTimeoutArgsForCall, struct { - arg1 time.Duration - }{arg1}) - stub := fake.CloneWithTimeoutStub - fakeReturns := fake.cloneWithTimeoutReturns - fake.recordInvocation("CloneWithTimeout", []interface{}{arg1}) - fake.cloneWithTimeoutMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) CloneWithTimeoutCallCount() int { - fake.cloneWithTimeoutMutex.RLock() - defer fake.cloneWithTimeoutMutex.RUnlock() - return len(fake.cloneWithTimeoutArgsForCall) -} - -func (fake *ClusterClient) CloneWithTimeoutCalls(stub func(time.Duration) clusterclient.Client) { - fake.cloneWithTimeoutMutex.Lock() - defer fake.cloneWithTimeoutMutex.Unlock() - fake.CloneWithTimeoutStub = stub -} - -func (fake *ClusterClient) CloneWithTimeoutArgsForCall(i int) time.Duration { - fake.cloneWithTimeoutMutex.RLock() - defer fake.cloneWithTimeoutMutex.RUnlock() - argsForCall := fake.cloneWithTimeoutArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) CloneWithTimeoutReturns(result1 clusterclient.Client) { - fake.cloneWithTimeoutMutex.Lock() - defer fake.cloneWithTimeoutMutex.Unlock() - fake.CloneWithTimeoutStub = nil - fake.cloneWithTimeoutReturns = struct { - result1 clusterclient.Client - }{result1} -} - -func (fake *ClusterClient) CloneWithTimeoutReturnsOnCall(i int, result1 clusterclient.Client) { - fake.cloneWithTimeoutMutex.Lock() - defer fake.cloneWithTimeoutMutex.Unlock() - fake.CloneWithTimeoutStub = nil - if fake.cloneWithTimeoutReturnsOnCall == nil { - fake.cloneWithTimeoutReturnsOnCall = make(map[int]struct { - result1 clusterclient.Client - }) - } - fake.cloneWithTimeoutReturnsOnCall[i] = struct { - result1 clusterclient.Client - }{result1} -} - -func (fake *ClusterClient) CreateNamespace(arg1 string) error { - fake.createNamespaceMutex.Lock() - ret, specificReturn := fake.createNamespaceReturnsOnCall[len(fake.createNamespaceArgsForCall)] - fake.createNamespaceArgsForCall = append(fake.createNamespaceArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.CreateNamespaceStub - fakeReturns := fake.createNamespaceReturns - fake.recordInvocation("CreateNamespace", []interface{}{arg1}) - fake.createNamespaceMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) CreateNamespaceCallCount() int { - fake.createNamespaceMutex.RLock() - defer fake.createNamespaceMutex.RUnlock() - return len(fake.createNamespaceArgsForCall) -} - -func (fake *ClusterClient) CreateNamespaceCalls(stub func(string) error) { - fake.createNamespaceMutex.Lock() - defer fake.createNamespaceMutex.Unlock() - fake.CreateNamespaceStub = stub -} - -func (fake *ClusterClient) CreateNamespaceArgsForCall(i int) string { - fake.createNamespaceMutex.RLock() - defer fake.createNamespaceMutex.RUnlock() - argsForCall := fake.createNamespaceArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) CreateNamespaceReturns(result1 error) { - fake.createNamespaceMutex.Lock() - defer fake.createNamespaceMutex.Unlock() - fake.CreateNamespaceStub = nil - fake.createNamespaceReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) CreateNamespaceReturnsOnCall(i int, result1 error) { - fake.createNamespaceMutex.Lock() - defer fake.createNamespaceMutex.Unlock() - fake.CreateNamespaceStub = nil - if fake.createNamespaceReturnsOnCall == nil { - fake.createNamespaceReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.createNamespaceReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) CreateResource(arg1 interface{}, arg2 string, arg3 string, arg4 ...client.CreateOption) error { - fake.createResourceMutex.Lock() - ret, specificReturn := fake.createResourceReturnsOnCall[len(fake.createResourceArgsForCall)] - fake.createResourceArgsForCall = append(fake.createResourceArgsForCall, struct { - arg1 interface{} - arg2 string - arg3 string - arg4 []client.CreateOption - }{arg1, arg2, arg3, arg4}) - stub := fake.CreateResourceStub - fakeReturns := fake.createResourceReturns - fake.recordInvocation("CreateResource", []interface{}{arg1, arg2, arg3, arg4}) - fake.createResourceMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) CreateResourceCallCount() int { - fake.createResourceMutex.RLock() - defer fake.createResourceMutex.RUnlock() - return len(fake.createResourceArgsForCall) -} - -func (fake *ClusterClient) CreateResourceCalls(stub func(interface{}, string, string, ...client.CreateOption) error) { - fake.createResourceMutex.Lock() - defer fake.createResourceMutex.Unlock() - fake.CreateResourceStub = stub -} - -func (fake *ClusterClient) CreateResourceArgsForCall(i int) (interface{}, string, string, []client.CreateOption) { - fake.createResourceMutex.RLock() - defer fake.createResourceMutex.RUnlock() - argsForCall := fake.createResourceArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) CreateResourceReturns(result1 error) { - fake.createResourceMutex.Lock() - defer fake.createResourceMutex.Unlock() - fake.CreateResourceStub = nil - fake.createResourceReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) CreateResourceReturnsOnCall(i int, result1 error) { - fake.createResourceMutex.Lock() - defer fake.createResourceMutex.Unlock() - fake.CreateResourceStub = nil - if fake.createResourceReturnsOnCall == nil { - fake.createResourceReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.createResourceReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) DeactivateTanzuKubernetesReleases(arg1 string) error { - fake.deactivateTanzuKubernetesReleasesMutex.Lock() - ret, specificReturn := fake.deactivateTanzuKubernetesReleasesReturnsOnCall[len(fake.deactivateTanzuKubernetesReleasesArgsForCall)] - fake.deactivateTanzuKubernetesReleasesArgsForCall = append(fake.deactivateTanzuKubernetesReleasesArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.DeactivateTanzuKubernetesReleasesStub - fakeReturns := fake.deactivateTanzuKubernetesReleasesReturns - fake.recordInvocation("DeactivateTanzuKubernetesReleases", []interface{}{arg1}) - fake.deactivateTanzuKubernetesReleasesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) DeactivateTanzuKubernetesReleasesCallCount() int { - fake.deactivateTanzuKubernetesReleasesMutex.RLock() - defer fake.deactivateTanzuKubernetesReleasesMutex.RUnlock() - return len(fake.deactivateTanzuKubernetesReleasesArgsForCall) -} - -func (fake *ClusterClient) DeactivateTanzuKubernetesReleasesCalls(stub func(string) error) { - fake.deactivateTanzuKubernetesReleasesMutex.Lock() - defer fake.deactivateTanzuKubernetesReleasesMutex.Unlock() - fake.DeactivateTanzuKubernetesReleasesStub = stub -} - -func (fake *ClusterClient) DeactivateTanzuKubernetesReleasesArgsForCall(i int) string { - fake.deactivateTanzuKubernetesReleasesMutex.RLock() - defer fake.deactivateTanzuKubernetesReleasesMutex.RUnlock() - argsForCall := fake.deactivateTanzuKubernetesReleasesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) DeactivateTanzuKubernetesReleasesReturns(result1 error) { - fake.deactivateTanzuKubernetesReleasesMutex.Lock() - defer fake.deactivateTanzuKubernetesReleasesMutex.Unlock() - fake.DeactivateTanzuKubernetesReleasesStub = nil - fake.deactivateTanzuKubernetesReleasesReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) DeactivateTanzuKubernetesReleasesReturnsOnCall(i int, result1 error) { - fake.deactivateTanzuKubernetesReleasesMutex.Lock() - defer fake.deactivateTanzuKubernetesReleasesMutex.Unlock() - fake.DeactivateTanzuKubernetesReleasesStub = nil - if fake.deactivateTanzuKubernetesReleasesReturnsOnCall == nil { - fake.deactivateTanzuKubernetesReleasesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deactivateTanzuKubernetesReleasesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) DeleteCluster(arg1 string, arg2 string) error { - fake.deleteClusterMutex.Lock() - ret, specificReturn := fake.deleteClusterReturnsOnCall[len(fake.deleteClusterArgsForCall)] - fake.deleteClusterArgsForCall = append(fake.deleteClusterArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.DeleteClusterStub - fakeReturns := fake.deleteClusterReturns - fake.recordInvocation("DeleteCluster", []interface{}{arg1, arg2}) - fake.deleteClusterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) DeleteClusterCallCount() int { - fake.deleteClusterMutex.RLock() - defer fake.deleteClusterMutex.RUnlock() - return len(fake.deleteClusterArgsForCall) -} - -func (fake *ClusterClient) DeleteClusterCalls(stub func(string, string) error) { - fake.deleteClusterMutex.Lock() - defer fake.deleteClusterMutex.Unlock() - fake.DeleteClusterStub = stub -} - -func (fake *ClusterClient) DeleteClusterArgsForCall(i int) (string, string) { - fake.deleteClusterMutex.RLock() - defer fake.deleteClusterMutex.RUnlock() - argsForCall := fake.deleteClusterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) DeleteClusterReturns(result1 error) { - fake.deleteClusterMutex.Lock() - defer fake.deleteClusterMutex.Unlock() - fake.DeleteClusterStub = nil - fake.deleteClusterReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) DeleteClusterReturnsOnCall(i int, result1 error) { - fake.deleteClusterMutex.Lock() - defer fake.deleteClusterMutex.Unlock() - fake.DeleteClusterStub = nil - if fake.deleteClusterReturnsOnCall == nil { - fake.deleteClusterReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteClusterReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) DeleteExistingKappController() error { - fake.deleteExistingKappControllerMutex.Lock() - ret, specificReturn := fake.deleteExistingKappControllerReturnsOnCall[len(fake.deleteExistingKappControllerArgsForCall)] - fake.deleteExistingKappControllerArgsForCall = append(fake.deleteExistingKappControllerArgsForCall, struct { - }{}) - stub := fake.DeleteExistingKappControllerStub - fakeReturns := fake.deleteExistingKappControllerReturns - fake.recordInvocation("DeleteExistingKappController", []interface{}{}) - fake.deleteExistingKappControllerMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) DeleteExistingKappControllerCallCount() int { - fake.deleteExistingKappControllerMutex.RLock() - defer fake.deleteExistingKappControllerMutex.RUnlock() - return len(fake.deleteExistingKappControllerArgsForCall) -} - -func (fake *ClusterClient) DeleteExistingKappControllerCalls(stub func() error) { - fake.deleteExistingKappControllerMutex.Lock() - defer fake.deleteExistingKappControllerMutex.Unlock() - fake.DeleteExistingKappControllerStub = stub -} - -func (fake *ClusterClient) DeleteExistingKappControllerReturns(result1 error) { - fake.deleteExistingKappControllerMutex.Lock() - defer fake.deleteExistingKappControllerMutex.Unlock() - fake.DeleteExistingKappControllerStub = nil - fake.deleteExistingKappControllerReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) DeleteExistingKappControllerReturnsOnCall(i int, result1 error) { - fake.deleteExistingKappControllerMutex.Lock() - defer fake.deleteExistingKappControllerMutex.Unlock() - fake.DeleteExistingKappControllerStub = nil - if fake.deleteExistingKappControllerReturnsOnCall == nil { - fake.deleteExistingKappControllerReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteExistingKappControllerReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) DeleteResource(arg1 interface{}) error { - fake.deleteResourceMutex.Lock() - ret, specificReturn := fake.deleteResourceReturnsOnCall[len(fake.deleteResourceArgsForCall)] - fake.deleteResourceArgsForCall = append(fake.deleteResourceArgsForCall, struct { - arg1 interface{} - }{arg1}) - stub := fake.DeleteResourceStub - fakeReturns := fake.deleteResourceReturns - fake.recordInvocation("DeleteResource", []interface{}{arg1}) - fake.deleteResourceMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) DeleteResourceCallCount() int { - fake.deleteResourceMutex.RLock() - defer fake.deleteResourceMutex.RUnlock() - return len(fake.deleteResourceArgsForCall) -} - -func (fake *ClusterClient) DeleteResourceCalls(stub func(interface{}) error) { - fake.deleteResourceMutex.Lock() - defer fake.deleteResourceMutex.Unlock() - fake.DeleteResourceStub = stub -} - -func (fake *ClusterClient) DeleteResourceArgsForCall(i int) interface{} { - fake.deleteResourceMutex.RLock() - defer fake.deleteResourceMutex.RUnlock() - argsForCall := fake.deleteResourceArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) DeleteResourceReturns(result1 error) { - fake.deleteResourceMutex.Lock() - defer fake.deleteResourceMutex.Unlock() - fake.DeleteResourceStub = nil - fake.deleteResourceReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) DeleteResourceReturnsOnCall(i int, result1 error) { - fake.deleteResourceMutex.Lock() - defer fake.deleteResourceMutex.Unlock() - fake.DeleteResourceStub = nil - if fake.deleteResourceReturnsOnCall == nil { - fake.deleteResourceReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteResourceReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ExportCurrentKubeconfigToFile() (string, error) { - fake.exportCurrentKubeconfigToFileMutex.Lock() - ret, specificReturn := fake.exportCurrentKubeconfigToFileReturnsOnCall[len(fake.exportCurrentKubeconfigToFileArgsForCall)] - fake.exportCurrentKubeconfigToFileArgsForCall = append(fake.exportCurrentKubeconfigToFileArgsForCall, struct { - }{}) - stub := fake.ExportCurrentKubeconfigToFileStub - fakeReturns := fake.exportCurrentKubeconfigToFileReturns - fake.recordInvocation("ExportCurrentKubeconfigToFile", []interface{}{}) - fake.exportCurrentKubeconfigToFileMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) ExportCurrentKubeconfigToFileCallCount() int { - fake.exportCurrentKubeconfigToFileMutex.RLock() - defer fake.exportCurrentKubeconfigToFileMutex.RUnlock() - return len(fake.exportCurrentKubeconfigToFileArgsForCall) -} - -func (fake *ClusterClient) ExportCurrentKubeconfigToFileCalls(stub func() (string, error)) { - fake.exportCurrentKubeconfigToFileMutex.Lock() - defer fake.exportCurrentKubeconfigToFileMutex.Unlock() - fake.ExportCurrentKubeconfigToFileStub = stub -} - -func (fake *ClusterClient) ExportCurrentKubeconfigToFileReturns(result1 string, result2 error) { - fake.exportCurrentKubeconfigToFileMutex.Lock() - defer fake.exportCurrentKubeconfigToFileMutex.Unlock() - fake.ExportCurrentKubeconfigToFileStub = nil - fake.exportCurrentKubeconfigToFileReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) ExportCurrentKubeconfigToFileReturnsOnCall(i int, result1 string, result2 error) { - fake.exportCurrentKubeconfigToFileMutex.Lock() - defer fake.exportCurrentKubeconfigToFileMutex.Unlock() - fake.ExportCurrentKubeconfigToFileStub = nil - if fake.exportCurrentKubeconfigToFileReturnsOnCall == nil { - fake.exportCurrentKubeconfigToFileReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.exportCurrentKubeconfigToFileReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetAWSCredentialsFromSecret() (string, error) { - fake.getAWSCredentialsFromSecretMutex.Lock() - ret, specificReturn := fake.getAWSCredentialsFromSecretReturnsOnCall[len(fake.getAWSCredentialsFromSecretArgsForCall)] - fake.getAWSCredentialsFromSecretArgsForCall = append(fake.getAWSCredentialsFromSecretArgsForCall, struct { - }{}) - stub := fake.GetAWSCredentialsFromSecretStub - fakeReturns := fake.getAWSCredentialsFromSecretReturns - fake.recordInvocation("GetAWSCredentialsFromSecret", []interface{}{}) - fake.getAWSCredentialsFromSecretMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetAWSCredentialsFromSecretCallCount() int { - fake.getAWSCredentialsFromSecretMutex.RLock() - defer fake.getAWSCredentialsFromSecretMutex.RUnlock() - return len(fake.getAWSCredentialsFromSecretArgsForCall) -} - -func (fake *ClusterClient) GetAWSCredentialsFromSecretCalls(stub func() (string, error)) { - fake.getAWSCredentialsFromSecretMutex.Lock() - defer fake.getAWSCredentialsFromSecretMutex.Unlock() - fake.GetAWSCredentialsFromSecretStub = stub -} - -func (fake *ClusterClient) GetAWSCredentialsFromSecretReturns(result1 string, result2 error) { - fake.getAWSCredentialsFromSecretMutex.Lock() - defer fake.getAWSCredentialsFromSecretMutex.Unlock() - fake.GetAWSCredentialsFromSecretStub = nil - fake.getAWSCredentialsFromSecretReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetAWSCredentialsFromSecretReturnsOnCall(i int, result1 string, result2 error) { - fake.getAWSCredentialsFromSecretMutex.Lock() - defer fake.getAWSCredentialsFromSecretMutex.Unlock() - fake.GetAWSCredentialsFromSecretStub = nil - if fake.getAWSCredentialsFromSecretReturnsOnCall == nil { - fake.getAWSCredentialsFromSecretReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getAWSCredentialsFromSecretReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetAzureClusterName(arg1 string, arg2 string) (string, string, error) { - fake.getAzureClusterNameMutex.Lock() - ret, specificReturn := fake.getAzureClusterNameReturnsOnCall[len(fake.getAzureClusterNameArgsForCall)] - fake.getAzureClusterNameArgsForCall = append(fake.getAzureClusterNameArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetAzureClusterNameStub - fakeReturns := fake.getAzureClusterNameReturns - fake.recordInvocation("GetAzureClusterName", []interface{}{arg1, arg2}) - fake.getAzureClusterNameMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *ClusterClient) GetAzureClusterNameCallCount() int { - fake.getAzureClusterNameMutex.RLock() - defer fake.getAzureClusterNameMutex.RUnlock() - return len(fake.getAzureClusterNameArgsForCall) -} - -func (fake *ClusterClient) GetAzureClusterNameCalls(stub func(string, string) (string, string, error)) { - fake.getAzureClusterNameMutex.Lock() - defer fake.getAzureClusterNameMutex.Unlock() - fake.GetAzureClusterNameStub = stub -} - -func (fake *ClusterClient) GetAzureClusterNameArgsForCall(i int) (string, string) { - fake.getAzureClusterNameMutex.RLock() - defer fake.getAzureClusterNameMutex.RUnlock() - argsForCall := fake.getAzureClusterNameArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) GetAzureClusterNameReturns(result1 string, result2 string, result3 error) { - fake.getAzureClusterNameMutex.Lock() - defer fake.getAzureClusterNameMutex.Unlock() - fake.GetAzureClusterNameStub = nil - fake.getAzureClusterNameReturns = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetAzureClusterNameReturnsOnCall(i int, result1 string, result2 string, result3 error) { - fake.getAzureClusterNameMutex.Lock() - defer fake.getAzureClusterNameMutex.Unlock() - fake.GetAzureClusterNameStub = nil - if fake.getAzureClusterNameReturnsOnCall == nil { - fake.getAzureClusterNameReturnsOnCall = make(map[int]struct { - result1 string - result2 string - result3 error - }) - } - fake.getAzureClusterNameReturnsOnCall[i] = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetAzureCredentialsFromIdentity(arg1 string, arg2 string) (azure.Credentials, error) { - fake.getAzureCredentialsFromIdentityMutex.Lock() - ret, specificReturn := fake.getAzureCredentialsFromIdentityReturnsOnCall[len(fake.getAzureCredentialsFromIdentityArgsForCall)] - fake.getAzureCredentialsFromIdentityArgsForCall = append(fake.getAzureCredentialsFromIdentityArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetAzureCredentialsFromIdentityStub - fakeReturns := fake.getAzureCredentialsFromIdentityReturns - fake.recordInvocation("GetAzureCredentialsFromIdentity", []interface{}{arg1, arg2}) - fake.getAzureCredentialsFromIdentityMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetAzureCredentialsFromIdentityCallCount() int { - fake.getAzureCredentialsFromIdentityMutex.RLock() - defer fake.getAzureCredentialsFromIdentityMutex.RUnlock() - return len(fake.getAzureCredentialsFromIdentityArgsForCall) -} - -func (fake *ClusterClient) GetAzureCredentialsFromIdentityCalls(stub func(string, string) (azure.Credentials, error)) { - fake.getAzureCredentialsFromIdentityMutex.Lock() - defer fake.getAzureCredentialsFromIdentityMutex.Unlock() - fake.GetAzureCredentialsFromIdentityStub = stub -} - -func (fake *ClusterClient) GetAzureCredentialsFromIdentityArgsForCall(i int) (string, string) { - fake.getAzureCredentialsFromIdentityMutex.RLock() - defer fake.getAzureCredentialsFromIdentityMutex.RUnlock() - argsForCall := fake.getAzureCredentialsFromIdentityArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) GetAzureCredentialsFromIdentityReturns(result1 azure.Credentials, result2 error) { - fake.getAzureCredentialsFromIdentityMutex.Lock() - defer fake.getAzureCredentialsFromIdentityMutex.Unlock() - fake.GetAzureCredentialsFromIdentityStub = nil - fake.getAzureCredentialsFromIdentityReturns = struct { - result1 azure.Credentials - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetAzureCredentialsFromIdentityReturnsOnCall(i int, result1 azure.Credentials, result2 error) { - fake.getAzureCredentialsFromIdentityMutex.Lock() - defer fake.getAzureCredentialsFromIdentityMutex.Unlock() - fake.GetAzureCredentialsFromIdentityStub = nil - if fake.getAzureCredentialsFromIdentityReturnsOnCall == nil { - fake.getAzureCredentialsFromIdentityReturnsOnCall = make(map[int]struct { - result1 azure.Credentials - result2 error - }) - } - fake.getAzureCredentialsFromIdentityReturnsOnCall[i] = struct { - result1 azure.Credentials - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetAzureCredentialsFromSecret() (azure.Credentials, error) { - fake.getAzureCredentialsFromSecretMutex.Lock() - ret, specificReturn := fake.getAzureCredentialsFromSecretReturnsOnCall[len(fake.getAzureCredentialsFromSecretArgsForCall)] - fake.getAzureCredentialsFromSecretArgsForCall = append(fake.getAzureCredentialsFromSecretArgsForCall, struct { - }{}) - stub := fake.GetAzureCredentialsFromSecretStub - fakeReturns := fake.getAzureCredentialsFromSecretReturns - fake.recordInvocation("GetAzureCredentialsFromSecret", []interface{}{}) - fake.getAzureCredentialsFromSecretMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetAzureCredentialsFromSecretCallCount() int { - fake.getAzureCredentialsFromSecretMutex.RLock() - defer fake.getAzureCredentialsFromSecretMutex.RUnlock() - return len(fake.getAzureCredentialsFromSecretArgsForCall) -} - -func (fake *ClusterClient) GetAzureCredentialsFromSecretCalls(stub func() (azure.Credentials, error)) { - fake.getAzureCredentialsFromSecretMutex.Lock() - defer fake.getAzureCredentialsFromSecretMutex.Unlock() - fake.GetAzureCredentialsFromSecretStub = stub -} - -func (fake *ClusterClient) GetAzureCredentialsFromSecretReturns(result1 azure.Credentials, result2 error) { - fake.getAzureCredentialsFromSecretMutex.Lock() - defer fake.getAzureCredentialsFromSecretMutex.Unlock() - fake.GetAzureCredentialsFromSecretStub = nil - fake.getAzureCredentialsFromSecretReturns = struct { - result1 azure.Credentials - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetAzureCredentialsFromSecretReturnsOnCall(i int, result1 azure.Credentials, result2 error) { - fake.getAzureCredentialsFromSecretMutex.Lock() - defer fake.getAzureCredentialsFromSecretMutex.Unlock() - fake.GetAzureCredentialsFromSecretStub = nil - if fake.getAzureCredentialsFromSecretReturnsOnCall == nil { - fake.getAzureCredentialsFromSecretReturnsOnCall = make(map[int]struct { - result1 azure.Credentials - result2 error - }) - } - fake.getAzureCredentialsFromSecretReturnsOnCall[i] = struct { - result1 azure.Credentials - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetBomConfigMap(arg1 string) (v1.ConfigMap, error) { - fake.getBomConfigMapMutex.Lock() - ret, specificReturn := fake.getBomConfigMapReturnsOnCall[len(fake.getBomConfigMapArgsForCall)] - fake.getBomConfigMapArgsForCall = append(fake.getBomConfigMapArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetBomConfigMapStub - fakeReturns := fake.getBomConfigMapReturns - fake.recordInvocation("GetBomConfigMap", []interface{}{arg1}) - fake.getBomConfigMapMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetBomConfigMapCallCount() int { - fake.getBomConfigMapMutex.RLock() - defer fake.getBomConfigMapMutex.RUnlock() - return len(fake.getBomConfigMapArgsForCall) -} - -func (fake *ClusterClient) GetBomConfigMapCalls(stub func(string) (v1.ConfigMap, error)) { - fake.getBomConfigMapMutex.Lock() - defer fake.getBomConfigMapMutex.Unlock() - fake.GetBomConfigMapStub = stub -} - -func (fake *ClusterClient) GetBomConfigMapArgsForCall(i int) string { - fake.getBomConfigMapMutex.RLock() - defer fake.getBomConfigMapMutex.RUnlock() - argsForCall := fake.getBomConfigMapArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) GetBomConfigMapReturns(result1 v1.ConfigMap, result2 error) { - fake.getBomConfigMapMutex.Lock() - defer fake.getBomConfigMapMutex.Unlock() - fake.GetBomConfigMapStub = nil - fake.getBomConfigMapReturns = struct { - result1 v1.ConfigMap - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetBomConfigMapReturnsOnCall(i int, result1 v1.ConfigMap, result2 error) { - fake.getBomConfigMapMutex.Lock() - defer fake.getBomConfigMapMutex.Unlock() - fake.GetBomConfigMapStub = nil - if fake.getBomConfigMapReturnsOnCall == nil { - fake.getBomConfigMapReturnsOnCall = make(map[int]struct { - result1 v1.ConfigMap - result2 error - }) - } - fake.getBomConfigMapReturnsOnCall[i] = struct { - result1 v1.ConfigMap - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetCAPZControllerManagerDeploymentsReplicas() (int32, error) { - fake.getCAPZControllerManagerDeploymentsReplicasMutex.Lock() - ret, specificReturn := fake.getCAPZControllerManagerDeploymentsReplicasReturnsOnCall[len(fake.getCAPZControllerManagerDeploymentsReplicasArgsForCall)] - fake.getCAPZControllerManagerDeploymentsReplicasArgsForCall = append(fake.getCAPZControllerManagerDeploymentsReplicasArgsForCall, struct { - }{}) - stub := fake.GetCAPZControllerManagerDeploymentsReplicasStub - fakeReturns := fake.getCAPZControllerManagerDeploymentsReplicasReturns - fake.recordInvocation("GetCAPZControllerManagerDeploymentsReplicas", []interface{}{}) - fake.getCAPZControllerManagerDeploymentsReplicasMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetCAPZControllerManagerDeploymentsReplicasCallCount() int { - fake.getCAPZControllerManagerDeploymentsReplicasMutex.RLock() - defer fake.getCAPZControllerManagerDeploymentsReplicasMutex.RUnlock() - return len(fake.getCAPZControllerManagerDeploymentsReplicasArgsForCall) -} - -func (fake *ClusterClient) GetCAPZControllerManagerDeploymentsReplicasCalls(stub func() (int32, error)) { - fake.getCAPZControllerManagerDeploymentsReplicasMutex.Lock() - defer fake.getCAPZControllerManagerDeploymentsReplicasMutex.Unlock() - fake.GetCAPZControllerManagerDeploymentsReplicasStub = stub -} - -func (fake *ClusterClient) GetCAPZControllerManagerDeploymentsReplicasReturns(result1 int32, result2 error) { - fake.getCAPZControllerManagerDeploymentsReplicasMutex.Lock() - defer fake.getCAPZControllerManagerDeploymentsReplicasMutex.Unlock() - fake.GetCAPZControllerManagerDeploymentsReplicasStub = nil - fake.getCAPZControllerManagerDeploymentsReplicasReturns = struct { - result1 int32 - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetCAPZControllerManagerDeploymentsReplicasReturnsOnCall(i int, result1 int32, result2 error) { - fake.getCAPZControllerManagerDeploymentsReplicasMutex.Lock() - defer fake.getCAPZControllerManagerDeploymentsReplicasMutex.Unlock() - fake.GetCAPZControllerManagerDeploymentsReplicasStub = nil - if fake.getCAPZControllerManagerDeploymentsReplicasReturnsOnCall == nil { - fake.getCAPZControllerManagerDeploymentsReplicasReturnsOnCall = make(map[int]struct { - result1 int32 - result2 error - }) - } - fake.getCAPZControllerManagerDeploymentsReplicasReturnsOnCall[i] = struct { - result1 int32 - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetCLIPluginImageRepositoryOverride() (map[string]string, error) { - fake.getCLIPluginImageRepositoryOverrideMutex.Lock() - ret, specificReturn := fake.getCLIPluginImageRepositoryOverrideReturnsOnCall[len(fake.getCLIPluginImageRepositoryOverrideArgsForCall)] - fake.getCLIPluginImageRepositoryOverrideArgsForCall = append(fake.getCLIPluginImageRepositoryOverrideArgsForCall, struct { - }{}) - stub := fake.GetCLIPluginImageRepositoryOverrideStub - fakeReturns := fake.getCLIPluginImageRepositoryOverrideReturns - fake.recordInvocation("GetCLIPluginImageRepositoryOverride", []interface{}{}) - fake.getCLIPluginImageRepositoryOverrideMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetCLIPluginImageRepositoryOverrideCallCount() int { - fake.getCLIPluginImageRepositoryOverrideMutex.RLock() - defer fake.getCLIPluginImageRepositoryOverrideMutex.RUnlock() - return len(fake.getCLIPluginImageRepositoryOverrideArgsForCall) -} - -func (fake *ClusterClient) GetCLIPluginImageRepositoryOverrideCalls(stub func() (map[string]string, error)) { - fake.getCLIPluginImageRepositoryOverrideMutex.Lock() - defer fake.getCLIPluginImageRepositoryOverrideMutex.Unlock() - fake.GetCLIPluginImageRepositoryOverrideStub = stub -} - -func (fake *ClusterClient) GetCLIPluginImageRepositoryOverrideReturns(result1 map[string]string, result2 error) { - fake.getCLIPluginImageRepositoryOverrideMutex.Lock() - defer fake.getCLIPluginImageRepositoryOverrideMutex.Unlock() - fake.GetCLIPluginImageRepositoryOverrideStub = nil - fake.getCLIPluginImageRepositoryOverrideReturns = struct { - result1 map[string]string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetCLIPluginImageRepositoryOverrideReturnsOnCall(i int, result1 map[string]string, result2 error) { - fake.getCLIPluginImageRepositoryOverrideMutex.Lock() - defer fake.getCLIPluginImageRepositoryOverrideMutex.Unlock() - fake.GetCLIPluginImageRepositoryOverrideStub = nil - if fake.getCLIPluginImageRepositoryOverrideReturnsOnCall == nil { - fake.getCLIPluginImageRepositoryOverrideReturnsOnCall = make(map[int]struct { - result1 map[string]string - result2 error - }) - } - fake.getCLIPluginImageRepositoryOverrideReturnsOnCall[i] = struct { - result1 map[string]string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetClientSet() clusterclient.CrtClient { - fake.getClientSetMutex.Lock() - ret, specificReturn := fake.getClientSetReturnsOnCall[len(fake.getClientSetArgsForCall)] - fake.getClientSetArgsForCall = append(fake.getClientSetArgsForCall, struct { - }{}) - stub := fake.GetClientSetStub - fakeReturns := fake.getClientSetReturns - fake.recordInvocation("GetClientSet", []interface{}{}) - fake.getClientSetMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) GetClientSetCallCount() int { - fake.getClientSetMutex.RLock() - defer fake.getClientSetMutex.RUnlock() - return len(fake.getClientSetArgsForCall) -} - -func (fake *ClusterClient) GetClientSetCalls(stub func() clusterclient.CrtClient) { - fake.getClientSetMutex.Lock() - defer fake.getClientSetMutex.Unlock() - fake.GetClientSetStub = stub -} - -func (fake *ClusterClient) GetClientSetReturns(result1 clusterclient.CrtClient) { - fake.getClientSetMutex.Lock() - defer fake.getClientSetMutex.Unlock() - fake.GetClientSetStub = nil - fake.getClientSetReturns = struct { - result1 clusterclient.CrtClient - }{result1} -} - -func (fake *ClusterClient) GetClientSetReturnsOnCall(i int, result1 clusterclient.CrtClient) { - fake.getClientSetMutex.Lock() - defer fake.getClientSetMutex.Unlock() - fake.GetClientSetStub = nil - if fake.getClientSetReturnsOnCall == nil { - fake.getClientSetReturnsOnCall = make(map[int]struct { - result1 clusterclient.CrtClient - }) - } - fake.getClientSetReturnsOnCall[i] = struct { - result1 clusterclient.CrtClient - }{result1} -} - -func (fake *ClusterClient) GetClusterInfrastructure() (string, error) { - fake.getClusterInfrastructureMutex.Lock() - ret, specificReturn := fake.getClusterInfrastructureReturnsOnCall[len(fake.getClusterInfrastructureArgsForCall)] - fake.getClusterInfrastructureArgsForCall = append(fake.getClusterInfrastructureArgsForCall, struct { - }{}) - stub := fake.GetClusterInfrastructureStub - fakeReturns := fake.getClusterInfrastructureReturns - fake.recordInvocation("GetClusterInfrastructure", []interface{}{}) - fake.getClusterInfrastructureMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetClusterInfrastructureCallCount() int { - fake.getClusterInfrastructureMutex.RLock() - defer fake.getClusterInfrastructureMutex.RUnlock() - return len(fake.getClusterInfrastructureArgsForCall) -} - -func (fake *ClusterClient) GetClusterInfrastructureCalls(stub func() (string, error)) { - fake.getClusterInfrastructureMutex.Lock() - defer fake.getClusterInfrastructureMutex.Unlock() - fake.GetClusterInfrastructureStub = stub -} - -func (fake *ClusterClient) GetClusterInfrastructureReturns(result1 string, result2 error) { - fake.getClusterInfrastructureMutex.Lock() - defer fake.getClusterInfrastructureMutex.Unlock() - fake.GetClusterInfrastructureStub = nil - fake.getClusterInfrastructureReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetClusterInfrastructureReturnsOnCall(i int, result1 string, result2 error) { - fake.getClusterInfrastructureMutex.Lock() - defer fake.getClusterInfrastructureMutex.Unlock() - fake.GetClusterInfrastructureStub = nil - if fake.getClusterInfrastructureReturnsOnCall == nil { - fake.getClusterInfrastructureReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getClusterInfrastructureReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetClusterResolvedOSImagesFromTKR(arg1 *v1alpha3.TanzuKubernetesRelease) ([]*v1alpha3.OSImage, error) { - fake.getClusterResolvedOSImagesFromTKRMutex.Lock() - ret, specificReturn := fake.getClusterResolvedOSImagesFromTKRReturnsOnCall[len(fake.getClusterResolvedOSImagesFromTKRArgsForCall)] - fake.getClusterResolvedOSImagesFromTKRArgsForCall = append(fake.getClusterResolvedOSImagesFromTKRArgsForCall, struct { - arg1 *v1alpha3.TanzuKubernetesRelease - }{arg1}) - stub := fake.GetClusterResolvedOSImagesFromTKRStub - fakeReturns := fake.getClusterResolvedOSImagesFromTKRReturns - fake.recordInvocation("GetClusterResolvedOSImagesFromTKR", []interface{}{arg1}) - fake.getClusterResolvedOSImagesFromTKRMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetClusterResolvedOSImagesFromTKRCallCount() int { - fake.getClusterResolvedOSImagesFromTKRMutex.RLock() - defer fake.getClusterResolvedOSImagesFromTKRMutex.RUnlock() - return len(fake.getClusterResolvedOSImagesFromTKRArgsForCall) -} - -func (fake *ClusterClient) GetClusterResolvedOSImagesFromTKRCalls(stub func(*v1alpha3.TanzuKubernetesRelease) ([]*v1alpha3.OSImage, error)) { - fake.getClusterResolvedOSImagesFromTKRMutex.Lock() - defer fake.getClusterResolvedOSImagesFromTKRMutex.Unlock() - fake.GetClusterResolvedOSImagesFromTKRStub = stub -} - -func (fake *ClusterClient) GetClusterResolvedOSImagesFromTKRArgsForCall(i int) *v1alpha3.TanzuKubernetesRelease { - fake.getClusterResolvedOSImagesFromTKRMutex.RLock() - defer fake.getClusterResolvedOSImagesFromTKRMutex.RUnlock() - argsForCall := fake.getClusterResolvedOSImagesFromTKRArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) GetClusterResolvedOSImagesFromTKRReturns(result1 []*v1alpha3.OSImage, result2 error) { - fake.getClusterResolvedOSImagesFromTKRMutex.Lock() - defer fake.getClusterResolvedOSImagesFromTKRMutex.Unlock() - fake.GetClusterResolvedOSImagesFromTKRStub = nil - fake.getClusterResolvedOSImagesFromTKRReturns = struct { - result1 []*v1alpha3.OSImage - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetClusterResolvedOSImagesFromTKRReturnsOnCall(i int, result1 []*v1alpha3.OSImage, result2 error) { - fake.getClusterResolvedOSImagesFromTKRMutex.Lock() - defer fake.getClusterResolvedOSImagesFromTKRMutex.Unlock() - fake.GetClusterResolvedOSImagesFromTKRStub = nil - if fake.getClusterResolvedOSImagesFromTKRReturnsOnCall == nil { - fake.getClusterResolvedOSImagesFromTKRReturnsOnCall = make(map[int]struct { - result1 []*v1alpha3.OSImage - result2 error - }) - } - fake.getClusterResolvedOSImagesFromTKRReturnsOnCall[i] = struct { - result1 []*v1alpha3.OSImage - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetClusterResolvedTanzuKubernetesRelease() (*v1alpha3.TanzuKubernetesRelease, error) { - fake.getClusterResolvedTanzuKubernetesReleaseMutex.Lock() - ret, specificReturn := fake.getClusterResolvedTanzuKubernetesReleaseReturnsOnCall[len(fake.getClusterResolvedTanzuKubernetesReleaseArgsForCall)] - fake.getClusterResolvedTanzuKubernetesReleaseArgsForCall = append(fake.getClusterResolvedTanzuKubernetesReleaseArgsForCall, struct { - }{}) - stub := fake.GetClusterResolvedTanzuKubernetesReleaseStub - fakeReturns := fake.getClusterResolvedTanzuKubernetesReleaseReturns - fake.recordInvocation("GetClusterResolvedTanzuKubernetesRelease", []interface{}{}) - fake.getClusterResolvedTanzuKubernetesReleaseMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetClusterResolvedTanzuKubernetesReleaseCallCount() int { - fake.getClusterResolvedTanzuKubernetesReleaseMutex.RLock() - defer fake.getClusterResolvedTanzuKubernetesReleaseMutex.RUnlock() - return len(fake.getClusterResolvedTanzuKubernetesReleaseArgsForCall) -} - -func (fake *ClusterClient) GetClusterResolvedTanzuKubernetesReleaseCalls(stub func() (*v1alpha3.TanzuKubernetesRelease, error)) { - fake.getClusterResolvedTanzuKubernetesReleaseMutex.Lock() - defer fake.getClusterResolvedTanzuKubernetesReleaseMutex.Unlock() - fake.GetClusterResolvedTanzuKubernetesReleaseStub = stub -} - -func (fake *ClusterClient) GetClusterResolvedTanzuKubernetesReleaseReturns(result1 *v1alpha3.TanzuKubernetesRelease, result2 error) { - fake.getClusterResolvedTanzuKubernetesReleaseMutex.Lock() - defer fake.getClusterResolvedTanzuKubernetesReleaseMutex.Unlock() - fake.GetClusterResolvedTanzuKubernetesReleaseStub = nil - fake.getClusterResolvedTanzuKubernetesReleaseReturns = struct { - result1 *v1alpha3.TanzuKubernetesRelease - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetClusterResolvedTanzuKubernetesReleaseReturnsOnCall(i int, result1 *v1alpha3.TanzuKubernetesRelease, result2 error) { - fake.getClusterResolvedTanzuKubernetesReleaseMutex.Lock() - defer fake.getClusterResolvedTanzuKubernetesReleaseMutex.Unlock() - fake.GetClusterResolvedTanzuKubernetesReleaseStub = nil - if fake.getClusterResolvedTanzuKubernetesReleaseReturnsOnCall == nil { - fake.getClusterResolvedTanzuKubernetesReleaseReturnsOnCall = make(map[int]struct { - result1 *v1alpha3.TanzuKubernetesRelease - result2 error - }) - } - fake.getClusterResolvedTanzuKubernetesReleaseReturnsOnCall[i] = struct { - result1 *v1alpha3.TanzuKubernetesRelease - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetClusterStatusInfo(arg1 string, arg2 string, arg3 clusterclient.Client) clusterclient.ClusterStatusInfo { - fake.getClusterStatusInfoMutex.Lock() - ret, specificReturn := fake.getClusterStatusInfoReturnsOnCall[len(fake.getClusterStatusInfoArgsForCall)] - fake.getClusterStatusInfoArgsForCall = append(fake.getClusterStatusInfoArgsForCall, struct { - arg1 string - arg2 string - arg3 clusterclient.Client - }{arg1, arg2, arg3}) - stub := fake.GetClusterStatusInfoStub - fakeReturns := fake.getClusterStatusInfoReturns - fake.recordInvocation("GetClusterStatusInfo", []interface{}{arg1, arg2, arg3}) - fake.getClusterStatusInfoMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) GetClusterStatusInfoCallCount() int { - fake.getClusterStatusInfoMutex.RLock() - defer fake.getClusterStatusInfoMutex.RUnlock() - return len(fake.getClusterStatusInfoArgsForCall) -} - -func (fake *ClusterClient) GetClusterStatusInfoCalls(stub func(string, string, clusterclient.Client) clusterclient.ClusterStatusInfo) { - fake.getClusterStatusInfoMutex.Lock() - defer fake.getClusterStatusInfoMutex.Unlock() - fake.GetClusterStatusInfoStub = stub -} - -func (fake *ClusterClient) GetClusterStatusInfoArgsForCall(i int) (string, string, clusterclient.Client) { - fake.getClusterStatusInfoMutex.RLock() - defer fake.getClusterStatusInfoMutex.RUnlock() - argsForCall := fake.getClusterStatusInfoArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) GetClusterStatusInfoReturns(result1 clusterclient.ClusterStatusInfo) { - fake.getClusterStatusInfoMutex.Lock() - defer fake.getClusterStatusInfoMutex.Unlock() - fake.GetClusterStatusInfoStub = nil - fake.getClusterStatusInfoReturns = struct { - result1 clusterclient.ClusterStatusInfo - }{result1} -} - -func (fake *ClusterClient) GetClusterStatusInfoReturnsOnCall(i int, result1 clusterclient.ClusterStatusInfo) { - fake.getClusterStatusInfoMutex.Lock() - defer fake.getClusterStatusInfoMutex.Unlock() - fake.GetClusterStatusInfoStub = nil - if fake.getClusterStatusInfoReturnsOnCall == nil { - fake.getClusterStatusInfoReturnsOnCall = make(map[int]struct { - result1 clusterclient.ClusterStatusInfo - }) - } - fake.getClusterStatusInfoReturnsOnCall[i] = struct { - result1 clusterclient.ClusterStatusInfo - }{result1} -} - -func (fake *ClusterClient) GetCurrentClusterName(arg1 string) (string, error) { - fake.getCurrentClusterNameMutex.Lock() - ret, specificReturn := fake.getCurrentClusterNameReturnsOnCall[len(fake.getCurrentClusterNameArgsForCall)] - fake.getCurrentClusterNameArgsForCall = append(fake.getCurrentClusterNameArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetCurrentClusterNameStub - fakeReturns := fake.getCurrentClusterNameReturns - fake.recordInvocation("GetCurrentClusterName", []interface{}{arg1}) - fake.getCurrentClusterNameMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetCurrentClusterNameCallCount() int { - fake.getCurrentClusterNameMutex.RLock() - defer fake.getCurrentClusterNameMutex.RUnlock() - return len(fake.getCurrentClusterNameArgsForCall) -} - -func (fake *ClusterClient) GetCurrentClusterNameCalls(stub func(string) (string, error)) { - fake.getCurrentClusterNameMutex.Lock() - defer fake.getCurrentClusterNameMutex.Unlock() - fake.GetCurrentClusterNameStub = stub -} - -func (fake *ClusterClient) GetCurrentClusterNameArgsForCall(i int) string { - fake.getCurrentClusterNameMutex.RLock() - defer fake.getCurrentClusterNameMutex.RUnlock() - argsForCall := fake.getCurrentClusterNameArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) GetCurrentClusterNameReturns(result1 string, result2 error) { - fake.getCurrentClusterNameMutex.Lock() - defer fake.getCurrentClusterNameMutex.Unlock() - fake.GetCurrentClusterNameStub = nil - fake.getCurrentClusterNameReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetCurrentClusterNameReturnsOnCall(i int, result1 string, result2 error) { - fake.getCurrentClusterNameMutex.Lock() - defer fake.getCurrentClusterNameMutex.Unlock() - fake.GetCurrentClusterNameStub = nil - if fake.getCurrentClusterNameReturnsOnCall == nil { - fake.getCurrentClusterNameReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getCurrentClusterNameReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetCurrentKubeContext() (string, error) { - fake.getCurrentKubeContextMutex.Lock() - ret, specificReturn := fake.getCurrentKubeContextReturnsOnCall[len(fake.getCurrentKubeContextArgsForCall)] - fake.getCurrentKubeContextArgsForCall = append(fake.getCurrentKubeContextArgsForCall, struct { - }{}) - stub := fake.GetCurrentKubeContextStub - fakeReturns := fake.getCurrentKubeContextReturns - fake.recordInvocation("GetCurrentKubeContext", []interface{}{}) - fake.getCurrentKubeContextMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetCurrentKubeContextCallCount() int { - fake.getCurrentKubeContextMutex.RLock() - defer fake.getCurrentKubeContextMutex.RUnlock() - return len(fake.getCurrentKubeContextArgsForCall) -} - -func (fake *ClusterClient) GetCurrentKubeContextCalls(stub func() (string, error)) { - fake.getCurrentKubeContextMutex.Lock() - defer fake.getCurrentKubeContextMutex.Unlock() - fake.GetCurrentKubeContextStub = stub -} - -func (fake *ClusterClient) GetCurrentKubeContextReturns(result1 string, result2 error) { - fake.getCurrentKubeContextMutex.Lock() - defer fake.getCurrentKubeContextMutex.Unlock() - fake.GetCurrentKubeContextStub = nil - fake.getCurrentKubeContextReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetCurrentKubeContextReturnsOnCall(i int, result1 string, result2 error) { - fake.getCurrentKubeContextMutex.Lock() - defer fake.getCurrentKubeContextMutex.Unlock() - fake.GetCurrentKubeContextStub = nil - if fake.getCurrentKubeContextReturnsOnCall == nil { - fake.getCurrentKubeContextReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getCurrentKubeContextReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetCurrentKubeconfigFile() string { - fake.getCurrentKubeconfigFileMutex.Lock() - ret, specificReturn := fake.getCurrentKubeconfigFileReturnsOnCall[len(fake.getCurrentKubeconfigFileArgsForCall)] - fake.getCurrentKubeconfigFileArgsForCall = append(fake.getCurrentKubeconfigFileArgsForCall, struct { - }{}) - stub := fake.GetCurrentKubeconfigFileStub - fakeReturns := fake.getCurrentKubeconfigFileReturns - fake.recordInvocation("GetCurrentKubeconfigFile", []interface{}{}) - fake.getCurrentKubeconfigFileMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) GetCurrentKubeconfigFileCallCount() int { - fake.getCurrentKubeconfigFileMutex.RLock() - defer fake.getCurrentKubeconfigFileMutex.RUnlock() - return len(fake.getCurrentKubeconfigFileArgsForCall) -} - -func (fake *ClusterClient) GetCurrentKubeconfigFileCalls(stub func() string) { - fake.getCurrentKubeconfigFileMutex.Lock() - defer fake.getCurrentKubeconfigFileMutex.Unlock() - fake.GetCurrentKubeconfigFileStub = stub -} - -func (fake *ClusterClient) GetCurrentKubeconfigFileReturns(result1 string) { - fake.getCurrentKubeconfigFileMutex.Lock() - defer fake.getCurrentKubeconfigFileMutex.Unlock() - fake.GetCurrentKubeconfigFileStub = nil - fake.getCurrentKubeconfigFileReturns = struct { - result1 string - }{result1} -} - -func (fake *ClusterClient) GetCurrentKubeconfigFileReturnsOnCall(i int, result1 string) { - fake.getCurrentKubeconfigFileMutex.Lock() - defer fake.getCurrentKubeconfigFileMutex.Unlock() - fake.GetCurrentKubeconfigFileStub = nil - if fake.getCurrentKubeconfigFileReturnsOnCall == nil { - fake.getCurrentKubeconfigFileReturnsOnCall = make(map[int]struct { - result1 string - }) - } - fake.getCurrentKubeconfigFileReturnsOnCall[i] = struct { - result1 string - }{result1} -} - -func (fake *ClusterClient) GetCurrentNamespace() (string, error) { - fake.getCurrentNamespaceMutex.Lock() - ret, specificReturn := fake.getCurrentNamespaceReturnsOnCall[len(fake.getCurrentNamespaceArgsForCall)] - fake.getCurrentNamespaceArgsForCall = append(fake.getCurrentNamespaceArgsForCall, struct { - }{}) - stub := fake.GetCurrentNamespaceStub - fakeReturns := fake.getCurrentNamespaceReturns - fake.recordInvocation("GetCurrentNamespace", []interface{}{}) - fake.getCurrentNamespaceMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetCurrentNamespaceCallCount() int { - fake.getCurrentNamespaceMutex.RLock() - defer fake.getCurrentNamespaceMutex.RUnlock() - return len(fake.getCurrentNamespaceArgsForCall) -} - -func (fake *ClusterClient) GetCurrentNamespaceCalls(stub func() (string, error)) { - fake.getCurrentNamespaceMutex.Lock() - defer fake.getCurrentNamespaceMutex.Unlock() - fake.GetCurrentNamespaceStub = stub -} - -func (fake *ClusterClient) GetCurrentNamespaceReturns(result1 string, result2 error) { - fake.getCurrentNamespaceMutex.Lock() - defer fake.getCurrentNamespaceMutex.Unlock() - fake.GetCurrentNamespaceStub = nil - fake.getCurrentNamespaceReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetCurrentNamespaceReturnsOnCall(i int, result1 string, result2 error) { - fake.getCurrentNamespaceMutex.Lock() - defer fake.getCurrentNamespaceMutex.Unlock() - fake.GetCurrentNamespaceStub = nil - if fake.getCurrentNamespaceReturnsOnCall == nil { - fake.getCurrentNamespaceReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getCurrentNamespaceReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetDeployment(arg1 string, arg2 string) (v1a.Deployment, error) { - fake.getDeploymentMutex.Lock() - ret, specificReturn := fake.getDeploymentReturnsOnCall[len(fake.getDeploymentArgsForCall)] - fake.getDeploymentArgsForCall = append(fake.getDeploymentArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetDeploymentStub - fakeReturns := fake.getDeploymentReturns - fake.recordInvocation("GetDeployment", []interface{}{arg1, arg2}) - fake.getDeploymentMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetDeploymentCallCount() int { - fake.getDeploymentMutex.RLock() - defer fake.getDeploymentMutex.RUnlock() - return len(fake.getDeploymentArgsForCall) -} - -func (fake *ClusterClient) GetDeploymentCalls(stub func(string, string) (v1a.Deployment, error)) { - fake.getDeploymentMutex.Lock() - defer fake.getDeploymentMutex.Unlock() - fake.GetDeploymentStub = stub -} - -func (fake *ClusterClient) GetDeploymentArgsForCall(i int) (string, string) { - fake.getDeploymentMutex.RLock() - defer fake.getDeploymentMutex.RUnlock() - argsForCall := fake.getDeploymentArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) GetDeploymentReturns(result1 v1a.Deployment, result2 error) { - fake.getDeploymentMutex.Lock() - defer fake.getDeploymentMutex.Unlock() - fake.GetDeploymentStub = nil - fake.getDeploymentReturns = struct { - result1 v1a.Deployment - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetDeploymentReturnsOnCall(i int, result1 v1a.Deployment, result2 error) { - fake.getDeploymentMutex.Lock() - defer fake.getDeploymentMutex.Unlock() - fake.GetDeploymentStub = nil - if fake.getDeploymentReturnsOnCall == nil { - fake.getDeploymentReturnsOnCall = make(map[int]struct { - result1 v1a.Deployment - result2 error - }) - } - fake.getDeploymentReturnsOnCall[i] = struct { - result1 v1a.Deployment - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetKCPObjectForCluster(arg1 string, arg2 string) (*v1beta1.KubeadmControlPlane, error) { - fake.getKCPObjectForClusterMutex.Lock() - ret, specificReturn := fake.getKCPObjectForClusterReturnsOnCall[len(fake.getKCPObjectForClusterArgsForCall)] - fake.getKCPObjectForClusterArgsForCall = append(fake.getKCPObjectForClusterArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetKCPObjectForClusterStub - fakeReturns := fake.getKCPObjectForClusterReturns - fake.recordInvocation("GetKCPObjectForCluster", []interface{}{arg1, arg2}) - fake.getKCPObjectForClusterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetKCPObjectForClusterCallCount() int { - fake.getKCPObjectForClusterMutex.RLock() - defer fake.getKCPObjectForClusterMutex.RUnlock() - return len(fake.getKCPObjectForClusterArgsForCall) -} - -func (fake *ClusterClient) GetKCPObjectForClusterCalls(stub func(string, string) (*v1beta1.KubeadmControlPlane, error)) { - fake.getKCPObjectForClusterMutex.Lock() - defer fake.getKCPObjectForClusterMutex.Unlock() - fake.GetKCPObjectForClusterStub = stub -} - -func (fake *ClusterClient) GetKCPObjectForClusterArgsForCall(i int) (string, string) { - fake.getKCPObjectForClusterMutex.RLock() - defer fake.getKCPObjectForClusterMutex.RUnlock() - argsForCall := fake.getKCPObjectForClusterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) GetKCPObjectForClusterReturns(result1 *v1beta1.KubeadmControlPlane, result2 error) { - fake.getKCPObjectForClusterMutex.Lock() - defer fake.getKCPObjectForClusterMutex.Unlock() - fake.GetKCPObjectForClusterStub = nil - fake.getKCPObjectForClusterReturns = struct { - result1 *v1beta1.KubeadmControlPlane - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetKCPObjectForClusterReturnsOnCall(i int, result1 *v1beta1.KubeadmControlPlane, result2 error) { - fake.getKCPObjectForClusterMutex.Lock() - defer fake.getKCPObjectForClusterMutex.Unlock() - fake.GetKCPObjectForClusterStub = nil - if fake.getKCPObjectForClusterReturnsOnCall == nil { - fake.getKCPObjectForClusterReturnsOnCall = make(map[int]struct { - result1 *v1beta1.KubeadmControlPlane - result2 error - }) - } - fake.getKCPObjectForClusterReturnsOnCall[i] = struct { - result1 *v1beta1.KubeadmControlPlane - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetKubeConfigForCluster(arg1 string, arg2 string, arg3 *clusterclient.PollOptions) ([]byte, error) { - fake.getKubeConfigForClusterMutex.Lock() - ret, specificReturn := fake.getKubeConfigForClusterReturnsOnCall[len(fake.getKubeConfigForClusterArgsForCall)] - fake.getKubeConfigForClusterArgsForCall = append(fake.getKubeConfigForClusterArgsForCall, struct { - arg1 string - arg2 string - arg3 *clusterclient.PollOptions - }{arg1, arg2, arg3}) - stub := fake.GetKubeConfigForClusterStub - fakeReturns := fake.getKubeConfigForClusterReturns - fake.recordInvocation("GetKubeConfigForCluster", []interface{}{arg1, arg2, arg3}) - fake.getKubeConfigForClusterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetKubeConfigForClusterCallCount() int { - fake.getKubeConfigForClusterMutex.RLock() - defer fake.getKubeConfigForClusterMutex.RUnlock() - return len(fake.getKubeConfigForClusterArgsForCall) -} - -func (fake *ClusterClient) GetKubeConfigForClusterCalls(stub func(string, string, *clusterclient.PollOptions) ([]byte, error)) { - fake.getKubeConfigForClusterMutex.Lock() - defer fake.getKubeConfigForClusterMutex.Unlock() - fake.GetKubeConfigForClusterStub = stub -} - -func (fake *ClusterClient) GetKubeConfigForClusterArgsForCall(i int) (string, string, *clusterclient.PollOptions) { - fake.getKubeConfigForClusterMutex.RLock() - defer fake.getKubeConfigForClusterMutex.RUnlock() - argsForCall := fake.getKubeConfigForClusterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) GetKubeConfigForClusterReturns(result1 []byte, result2 error) { - fake.getKubeConfigForClusterMutex.Lock() - defer fake.getKubeConfigForClusterMutex.Unlock() - fake.GetKubeConfigForClusterStub = nil - fake.getKubeConfigForClusterReturns = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetKubeConfigForClusterReturnsOnCall(i int, result1 []byte, result2 error) { - fake.getKubeConfigForClusterMutex.Lock() - defer fake.getKubeConfigForClusterMutex.Unlock() - fake.GetKubeConfigForClusterStub = nil - if fake.getKubeConfigForClusterReturnsOnCall == nil { - fake.getKubeConfigForClusterReturnsOnCall = make(map[int]struct { - result1 []byte - result2 error - }) - } - fake.getKubeConfigForClusterReturnsOnCall[i] = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetKubeadmControlPlaneName(arg1 string, arg2 string) (string, string, error) { - fake.getKubeadmControlPlaneNameMutex.Lock() - ret, specificReturn := fake.getKubeadmControlPlaneNameReturnsOnCall[len(fake.getKubeadmControlPlaneNameArgsForCall)] - fake.getKubeadmControlPlaneNameArgsForCall = append(fake.getKubeadmControlPlaneNameArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetKubeadmControlPlaneNameStub - fakeReturns := fake.getKubeadmControlPlaneNameReturns - fake.recordInvocation("GetKubeadmControlPlaneName", []interface{}{arg1, arg2}) - fake.getKubeadmControlPlaneNameMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *ClusterClient) GetKubeadmControlPlaneNameCallCount() int { - fake.getKubeadmControlPlaneNameMutex.RLock() - defer fake.getKubeadmControlPlaneNameMutex.RUnlock() - return len(fake.getKubeadmControlPlaneNameArgsForCall) -} - -func (fake *ClusterClient) GetKubeadmControlPlaneNameCalls(stub func(string, string) (string, string, error)) { - fake.getKubeadmControlPlaneNameMutex.Lock() - defer fake.getKubeadmControlPlaneNameMutex.Unlock() - fake.GetKubeadmControlPlaneNameStub = stub -} - -func (fake *ClusterClient) GetKubeadmControlPlaneNameArgsForCall(i int) (string, string) { - fake.getKubeadmControlPlaneNameMutex.RLock() - defer fake.getKubeadmControlPlaneNameMutex.RUnlock() - argsForCall := fake.getKubeadmControlPlaneNameArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) GetKubeadmControlPlaneNameReturns(result1 string, result2 string, result3 error) { - fake.getKubeadmControlPlaneNameMutex.Lock() - defer fake.getKubeadmControlPlaneNameMutex.Unlock() - fake.GetKubeadmControlPlaneNameStub = nil - fake.getKubeadmControlPlaneNameReturns = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetKubeadmControlPlaneNameReturnsOnCall(i int, result1 string, result2 string, result3 error) { - fake.getKubeadmControlPlaneNameMutex.Lock() - defer fake.getKubeadmControlPlaneNameMutex.Unlock() - fake.GetKubeadmControlPlaneNameStub = nil - if fake.getKubeadmControlPlaneNameReturnsOnCall == nil { - fake.getKubeadmControlPlaneNameReturnsOnCall = make(map[int]struct { - result1 string - result2 string - result3 error - }) - } - fake.getKubeadmControlPlaneNameReturnsOnCall[i] = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetKubernetesVersion() (string, error) { - fake.getKubernetesVersionMutex.Lock() - ret, specificReturn := fake.getKubernetesVersionReturnsOnCall[len(fake.getKubernetesVersionArgsForCall)] - fake.getKubernetesVersionArgsForCall = append(fake.getKubernetesVersionArgsForCall, struct { - }{}) - stub := fake.GetKubernetesVersionStub - fakeReturns := fake.getKubernetesVersionReturns - fake.recordInvocation("GetKubernetesVersion", []interface{}{}) - fake.getKubernetesVersionMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetKubernetesVersionCallCount() int { - fake.getKubernetesVersionMutex.RLock() - defer fake.getKubernetesVersionMutex.RUnlock() - return len(fake.getKubernetesVersionArgsForCall) -} - -func (fake *ClusterClient) GetKubernetesVersionCalls(stub func() (string, error)) { - fake.getKubernetesVersionMutex.Lock() - defer fake.getKubernetesVersionMutex.Unlock() - fake.GetKubernetesVersionStub = stub -} - -func (fake *ClusterClient) GetKubernetesVersionReturns(result1 string, result2 error) { - fake.getKubernetesVersionMutex.Lock() - defer fake.getKubernetesVersionMutex.Unlock() - fake.GetKubernetesVersionStub = nil - fake.getKubernetesVersionReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetKubernetesVersionReturnsOnCall(i int, result1 string, result2 error) { - fake.getKubernetesVersionMutex.Lock() - defer fake.getKubernetesVersionMutex.Unlock() - fake.GetKubernetesVersionStub = nil - if fake.getKubernetesVersionReturnsOnCall == nil { - fake.getKubernetesVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getKubernetesVersionReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetMDObjectForCluster(arg1 string, arg2 string) ([]v1beta1a.MachineDeployment, error) { - fake.getMDObjectForClusterMutex.Lock() - ret, specificReturn := fake.getMDObjectForClusterReturnsOnCall[len(fake.getMDObjectForClusterArgsForCall)] - fake.getMDObjectForClusterArgsForCall = append(fake.getMDObjectForClusterArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetMDObjectForClusterStub - fakeReturns := fake.getMDObjectForClusterReturns - fake.recordInvocation("GetMDObjectForCluster", []interface{}{arg1, arg2}) - fake.getMDObjectForClusterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetMDObjectForClusterCallCount() int { - fake.getMDObjectForClusterMutex.RLock() - defer fake.getMDObjectForClusterMutex.RUnlock() - return len(fake.getMDObjectForClusterArgsForCall) -} - -func (fake *ClusterClient) GetMDObjectForClusterCalls(stub func(string, string) ([]v1beta1a.MachineDeployment, error)) { - fake.getMDObjectForClusterMutex.Lock() - defer fake.getMDObjectForClusterMutex.Unlock() - fake.GetMDObjectForClusterStub = stub -} - -func (fake *ClusterClient) GetMDObjectForClusterArgsForCall(i int) (string, string) { - fake.getMDObjectForClusterMutex.RLock() - defer fake.getMDObjectForClusterMutex.RUnlock() - argsForCall := fake.getMDObjectForClusterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) GetMDObjectForClusterReturns(result1 []v1beta1a.MachineDeployment, result2 error) { - fake.getMDObjectForClusterMutex.Lock() - defer fake.getMDObjectForClusterMutex.Unlock() - fake.GetMDObjectForClusterStub = nil - fake.getMDObjectForClusterReturns = struct { - result1 []v1beta1a.MachineDeployment - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetMDObjectForClusterReturnsOnCall(i int, result1 []v1beta1a.MachineDeployment, result2 error) { - fake.getMDObjectForClusterMutex.Lock() - defer fake.getMDObjectForClusterMutex.Unlock() - fake.GetMDObjectForClusterStub = nil - if fake.getMDObjectForClusterReturnsOnCall == nil { - fake.getMDObjectForClusterReturnsOnCall = make(map[int]struct { - result1 []v1beta1a.MachineDeployment - result2 error - }) - } - fake.getMDObjectForClusterReturnsOnCall[i] = struct { - result1 []v1beta1a.MachineDeployment - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetMachineObjectsForCluster(arg1 string, arg2 string) (map[string]v1beta1a.Machine, map[string]v1beta1a.Machine, error) { - fake.getMachineObjectsForClusterMutex.Lock() - ret, specificReturn := fake.getMachineObjectsForClusterReturnsOnCall[len(fake.getMachineObjectsForClusterArgsForCall)] - fake.getMachineObjectsForClusterArgsForCall = append(fake.getMachineObjectsForClusterArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetMachineObjectsForClusterStub - fakeReturns := fake.getMachineObjectsForClusterReturns - fake.recordInvocation("GetMachineObjectsForCluster", []interface{}{arg1, arg2}) - fake.getMachineObjectsForClusterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *ClusterClient) GetMachineObjectsForClusterCallCount() int { - fake.getMachineObjectsForClusterMutex.RLock() - defer fake.getMachineObjectsForClusterMutex.RUnlock() - return len(fake.getMachineObjectsForClusterArgsForCall) -} - -func (fake *ClusterClient) GetMachineObjectsForClusterCalls(stub func(string, string) (map[string]v1beta1a.Machine, map[string]v1beta1a.Machine, error)) { - fake.getMachineObjectsForClusterMutex.Lock() - defer fake.getMachineObjectsForClusterMutex.Unlock() - fake.GetMachineObjectsForClusterStub = stub -} - -func (fake *ClusterClient) GetMachineObjectsForClusterArgsForCall(i int) (string, string) { - fake.getMachineObjectsForClusterMutex.RLock() - defer fake.getMachineObjectsForClusterMutex.RUnlock() - argsForCall := fake.getMachineObjectsForClusterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) GetMachineObjectsForClusterReturns(result1 map[string]v1beta1a.Machine, result2 map[string]v1beta1a.Machine, result3 error) { - fake.getMachineObjectsForClusterMutex.Lock() - defer fake.getMachineObjectsForClusterMutex.Unlock() - fake.GetMachineObjectsForClusterStub = nil - fake.getMachineObjectsForClusterReturns = struct { - result1 map[string]v1beta1a.Machine - result2 map[string]v1beta1a.Machine - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetMachineObjectsForClusterReturnsOnCall(i int, result1 map[string]v1beta1a.Machine, result2 map[string]v1beta1a.Machine, result3 error) { - fake.getMachineObjectsForClusterMutex.Lock() - defer fake.getMachineObjectsForClusterMutex.Unlock() - fake.GetMachineObjectsForClusterStub = nil - if fake.getMachineObjectsForClusterReturnsOnCall == nil { - fake.getMachineObjectsForClusterReturnsOnCall = make(map[int]struct { - result1 map[string]v1beta1a.Machine - result2 map[string]v1beta1a.Machine - result3 error - }) - } - fake.getMachineObjectsForClusterReturnsOnCall[i] = struct { - result1 map[string]v1beta1a.Machine - result2 map[string]v1beta1a.Machine - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetManagementClusterTKGVersion(arg1 string, arg2 string) (string, error) { - fake.getManagementClusterTKGVersionMutex.Lock() - ret, specificReturn := fake.getManagementClusterTKGVersionReturnsOnCall[len(fake.getManagementClusterTKGVersionArgsForCall)] - fake.getManagementClusterTKGVersionArgsForCall = append(fake.getManagementClusterTKGVersionArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetManagementClusterTKGVersionStub - fakeReturns := fake.getManagementClusterTKGVersionReturns - fake.recordInvocation("GetManagementClusterTKGVersion", []interface{}{arg1, arg2}) - fake.getManagementClusterTKGVersionMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetManagementClusterTKGVersionCallCount() int { - fake.getManagementClusterTKGVersionMutex.RLock() - defer fake.getManagementClusterTKGVersionMutex.RUnlock() - return len(fake.getManagementClusterTKGVersionArgsForCall) -} - -func (fake *ClusterClient) GetManagementClusterTKGVersionCalls(stub func(string, string) (string, error)) { - fake.getManagementClusterTKGVersionMutex.Lock() - defer fake.getManagementClusterTKGVersionMutex.Unlock() - fake.GetManagementClusterTKGVersionStub = stub -} - -func (fake *ClusterClient) GetManagementClusterTKGVersionArgsForCall(i int) (string, string) { - fake.getManagementClusterTKGVersionMutex.RLock() - defer fake.getManagementClusterTKGVersionMutex.RUnlock() - argsForCall := fake.getManagementClusterTKGVersionArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) GetManagementClusterTKGVersionReturns(result1 string, result2 error) { - fake.getManagementClusterTKGVersionMutex.Lock() - defer fake.getManagementClusterTKGVersionMutex.Unlock() - fake.GetManagementClusterTKGVersionStub = nil - fake.getManagementClusterTKGVersionReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetManagementClusterTKGVersionReturnsOnCall(i int, result1 string, result2 error) { - fake.getManagementClusterTKGVersionMutex.Lock() - defer fake.getManagementClusterTKGVersionMutex.Unlock() - fake.GetManagementClusterTKGVersionStub = nil - if fake.getManagementClusterTKGVersionReturnsOnCall == nil { - fake.getManagementClusterTKGVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getManagementClusterTKGVersionReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetPacificClusterObject(arg1 string, arg2 string) (*v1alpha2.TanzuKubernetesCluster, error) { - fake.getPacificClusterObjectMutex.Lock() - ret, specificReturn := fake.getPacificClusterObjectReturnsOnCall[len(fake.getPacificClusterObjectArgsForCall)] - fake.getPacificClusterObjectArgsForCall = append(fake.getPacificClusterObjectArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetPacificClusterObjectStub - fakeReturns := fake.getPacificClusterObjectReturns - fake.recordInvocation("GetPacificClusterObject", []interface{}{arg1, arg2}) - fake.getPacificClusterObjectMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetPacificClusterObjectCallCount() int { - fake.getPacificClusterObjectMutex.RLock() - defer fake.getPacificClusterObjectMutex.RUnlock() - return len(fake.getPacificClusterObjectArgsForCall) -} - -func (fake *ClusterClient) GetPacificClusterObjectCalls(stub func(string, string) (*v1alpha2.TanzuKubernetesCluster, error)) { - fake.getPacificClusterObjectMutex.Lock() - defer fake.getPacificClusterObjectMutex.Unlock() - fake.GetPacificClusterObjectStub = stub -} - -func (fake *ClusterClient) GetPacificClusterObjectArgsForCall(i int) (string, string) { - fake.getPacificClusterObjectMutex.RLock() - defer fake.getPacificClusterObjectMutex.RUnlock() - argsForCall := fake.getPacificClusterObjectArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) GetPacificClusterObjectReturns(result1 *v1alpha2.TanzuKubernetesCluster, result2 error) { - fake.getPacificClusterObjectMutex.Lock() - defer fake.getPacificClusterObjectMutex.Unlock() - fake.GetPacificClusterObjectStub = nil - fake.getPacificClusterObjectReturns = struct { - result1 *v1alpha2.TanzuKubernetesCluster - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetPacificClusterObjectReturnsOnCall(i int, result1 *v1alpha2.TanzuKubernetesCluster, result2 error) { - fake.getPacificClusterObjectMutex.Lock() - defer fake.getPacificClusterObjectMutex.Unlock() - fake.GetPacificClusterObjectStub = nil - if fake.getPacificClusterObjectReturnsOnCall == nil { - fake.getPacificClusterObjectReturnsOnCall = make(map[int]struct { - result1 *v1alpha2.TanzuKubernetesCluster - result2 error - }) - } - fake.getPacificClusterObjectReturnsOnCall[i] = struct { - result1 *v1alpha2.TanzuKubernetesCluster - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetPacificTKCAPIVersion() (string, error) { - fake.getPacificTKCAPIVersionMutex.Lock() - ret, specificReturn := fake.getPacificTKCAPIVersionReturnsOnCall[len(fake.getPacificTKCAPIVersionArgsForCall)] - fake.getPacificTKCAPIVersionArgsForCall = append(fake.getPacificTKCAPIVersionArgsForCall, struct { - }{}) - stub := fake.GetPacificTKCAPIVersionStub - fakeReturns := fake.getPacificTKCAPIVersionReturns - fake.recordInvocation("GetPacificTKCAPIVersion", []interface{}{}) - fake.getPacificTKCAPIVersionMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetPacificTKCAPIVersionCallCount() int { - fake.getPacificTKCAPIVersionMutex.RLock() - defer fake.getPacificTKCAPIVersionMutex.RUnlock() - return len(fake.getPacificTKCAPIVersionArgsForCall) -} - -func (fake *ClusterClient) GetPacificTKCAPIVersionCalls(stub func() (string, error)) { - fake.getPacificTKCAPIVersionMutex.Lock() - defer fake.getPacificTKCAPIVersionMutex.Unlock() - fake.GetPacificTKCAPIVersionStub = stub -} - -func (fake *ClusterClient) GetPacificTKCAPIVersionReturns(result1 string, result2 error) { - fake.getPacificTKCAPIVersionMutex.Lock() - defer fake.getPacificTKCAPIVersionMutex.Unlock() - fake.GetPacificTKCAPIVersionStub = nil - fake.getPacificTKCAPIVersionReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetPacificTKCAPIVersionReturnsOnCall(i int, result1 string, result2 error) { - fake.getPacificTKCAPIVersionMutex.Lock() - defer fake.getPacificTKCAPIVersionMutex.Unlock() - fake.GetPacificTKCAPIVersionStub = nil - if fake.getPacificTKCAPIVersionReturnsOnCall == nil { - fake.getPacificTKCAPIVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getPacificTKCAPIVersionReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetPacificTanzuKubernetesReleases() ([]string, error) { - fake.getPacificTanzuKubernetesReleasesMutex.Lock() - ret, specificReturn := fake.getPacificTanzuKubernetesReleasesReturnsOnCall[len(fake.getPacificTanzuKubernetesReleasesArgsForCall)] - fake.getPacificTanzuKubernetesReleasesArgsForCall = append(fake.getPacificTanzuKubernetesReleasesArgsForCall, struct { - }{}) - stub := fake.GetPacificTanzuKubernetesReleasesStub - fakeReturns := fake.getPacificTanzuKubernetesReleasesReturns - fake.recordInvocation("GetPacificTanzuKubernetesReleases", []interface{}{}) - fake.getPacificTanzuKubernetesReleasesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetPacificTanzuKubernetesReleasesCallCount() int { - fake.getPacificTanzuKubernetesReleasesMutex.RLock() - defer fake.getPacificTanzuKubernetesReleasesMutex.RUnlock() - return len(fake.getPacificTanzuKubernetesReleasesArgsForCall) -} - -func (fake *ClusterClient) GetPacificTanzuKubernetesReleasesCalls(stub func() ([]string, error)) { - fake.getPacificTanzuKubernetesReleasesMutex.Lock() - defer fake.getPacificTanzuKubernetesReleasesMutex.Unlock() - fake.GetPacificTanzuKubernetesReleasesStub = stub -} - -func (fake *ClusterClient) GetPacificTanzuKubernetesReleasesReturns(result1 []string, result2 error) { - fake.getPacificTanzuKubernetesReleasesMutex.Lock() - defer fake.getPacificTanzuKubernetesReleasesMutex.Unlock() - fake.GetPacificTanzuKubernetesReleasesStub = nil - fake.getPacificTanzuKubernetesReleasesReturns = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetPacificTanzuKubernetesReleasesReturnsOnCall(i int, result1 []string, result2 error) { - fake.getPacificTanzuKubernetesReleasesMutex.Lock() - defer fake.getPacificTanzuKubernetesReleasesMutex.Unlock() - fake.GetPacificTanzuKubernetesReleasesStub = nil - if fake.getPacificTanzuKubernetesReleasesReturnsOnCall == nil { - fake.getPacificTanzuKubernetesReleasesReturnsOnCall = make(map[int]struct { - result1 []string - result2 error - }) - } - fake.getPacificTanzuKubernetesReleasesReturnsOnCall[i] = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetPackage(arg1 string, arg2 string) (*v1alpha1.Package, error) { - fake.getPackageMutex.Lock() - ret, specificReturn := fake.getPackageReturnsOnCall[len(fake.getPackageArgsForCall)] - fake.getPackageArgsForCall = append(fake.getPackageArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetPackageStub - fakeReturns := fake.getPackageReturns - fake.recordInvocation("GetPackage", []interface{}{arg1, arg2}) - fake.getPackageMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetPackageCallCount() int { - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - return len(fake.getPackageArgsForCall) -} - -func (fake *ClusterClient) GetPackageCalls(stub func(string, string) (*v1alpha1.Package, error)) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = stub -} - -func (fake *ClusterClient) GetPackageArgsForCall(i int) (string, string) { - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - argsForCall := fake.getPackageArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) GetPackageReturns(result1 *v1alpha1.Package, result2 error) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = nil - fake.getPackageReturns = struct { - result1 *v1alpha1.Package - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetPackageReturnsOnCall(i int, result1 *v1alpha1.Package, result2 error) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = nil - if fake.getPackageReturnsOnCall == nil { - fake.getPackageReturnsOnCall = make(map[int]struct { - result1 *v1alpha1.Package - result2 error - }) - } - fake.getPackageReturnsOnCall[i] = struct { - result1 *v1alpha1.Package - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetPinnipedIssuerURLAndCA() (string, string, error) { - fake.getPinnipedIssuerURLAndCAMutex.Lock() - ret, specificReturn := fake.getPinnipedIssuerURLAndCAReturnsOnCall[len(fake.getPinnipedIssuerURLAndCAArgsForCall)] - fake.getPinnipedIssuerURLAndCAArgsForCall = append(fake.getPinnipedIssuerURLAndCAArgsForCall, struct { - }{}) - stub := fake.GetPinnipedIssuerURLAndCAStub - fakeReturns := fake.getPinnipedIssuerURLAndCAReturns - fake.recordInvocation("GetPinnipedIssuerURLAndCA", []interface{}{}) - fake.getPinnipedIssuerURLAndCAMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *ClusterClient) GetPinnipedIssuerURLAndCACallCount() int { - fake.getPinnipedIssuerURLAndCAMutex.RLock() - defer fake.getPinnipedIssuerURLAndCAMutex.RUnlock() - return len(fake.getPinnipedIssuerURLAndCAArgsForCall) -} - -func (fake *ClusterClient) GetPinnipedIssuerURLAndCACalls(stub func() (string, string, error)) { - fake.getPinnipedIssuerURLAndCAMutex.Lock() - defer fake.getPinnipedIssuerURLAndCAMutex.Unlock() - fake.GetPinnipedIssuerURLAndCAStub = stub -} - -func (fake *ClusterClient) GetPinnipedIssuerURLAndCAReturns(result1 string, result2 string, result3 error) { - fake.getPinnipedIssuerURLAndCAMutex.Lock() - defer fake.getPinnipedIssuerURLAndCAMutex.Unlock() - fake.GetPinnipedIssuerURLAndCAStub = nil - fake.getPinnipedIssuerURLAndCAReturns = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetPinnipedIssuerURLAndCAReturnsOnCall(i int, result1 string, result2 string, result3 error) { - fake.getPinnipedIssuerURLAndCAMutex.Lock() - defer fake.getPinnipedIssuerURLAndCAMutex.Unlock() - fake.GetPinnipedIssuerURLAndCAStub = nil - if fake.getPinnipedIssuerURLAndCAReturnsOnCall == nil { - fake.getPinnipedIssuerURLAndCAReturnsOnCall = make(map[int]struct { - result1 string - result2 string - result3 error - }) - } - fake.getPinnipedIssuerURLAndCAReturnsOnCall[i] = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetRegionalClusterDefaultProviderName(arg1 v1alpha3a.ProviderType) (string, error) { - fake.getRegionalClusterDefaultProviderNameMutex.Lock() - ret, specificReturn := fake.getRegionalClusterDefaultProviderNameReturnsOnCall[len(fake.getRegionalClusterDefaultProviderNameArgsForCall)] - fake.getRegionalClusterDefaultProviderNameArgsForCall = append(fake.getRegionalClusterDefaultProviderNameArgsForCall, struct { - arg1 v1alpha3a.ProviderType - }{arg1}) - stub := fake.GetRegionalClusterDefaultProviderNameStub - fakeReturns := fake.getRegionalClusterDefaultProviderNameReturns - fake.recordInvocation("GetRegionalClusterDefaultProviderName", []interface{}{arg1}) - fake.getRegionalClusterDefaultProviderNameMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetRegionalClusterDefaultProviderNameCallCount() int { - fake.getRegionalClusterDefaultProviderNameMutex.RLock() - defer fake.getRegionalClusterDefaultProviderNameMutex.RUnlock() - return len(fake.getRegionalClusterDefaultProviderNameArgsForCall) -} - -func (fake *ClusterClient) GetRegionalClusterDefaultProviderNameCalls(stub func(v1alpha3a.ProviderType) (string, error)) { - fake.getRegionalClusterDefaultProviderNameMutex.Lock() - defer fake.getRegionalClusterDefaultProviderNameMutex.Unlock() - fake.GetRegionalClusterDefaultProviderNameStub = stub -} - -func (fake *ClusterClient) GetRegionalClusterDefaultProviderNameArgsForCall(i int) v1alpha3a.ProviderType { - fake.getRegionalClusterDefaultProviderNameMutex.RLock() - defer fake.getRegionalClusterDefaultProviderNameMutex.RUnlock() - argsForCall := fake.getRegionalClusterDefaultProviderNameArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) GetRegionalClusterDefaultProviderNameReturns(result1 string, result2 error) { - fake.getRegionalClusterDefaultProviderNameMutex.Lock() - defer fake.getRegionalClusterDefaultProviderNameMutex.Unlock() - fake.GetRegionalClusterDefaultProviderNameStub = nil - fake.getRegionalClusterDefaultProviderNameReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetRegionalClusterDefaultProviderNameReturnsOnCall(i int, result1 string, result2 error) { - fake.getRegionalClusterDefaultProviderNameMutex.Lock() - defer fake.getRegionalClusterDefaultProviderNameMutex.Unlock() - fake.GetRegionalClusterDefaultProviderNameStub = nil - if fake.getRegionalClusterDefaultProviderNameReturnsOnCall == nil { - fake.getRegionalClusterDefaultProviderNameReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getRegionalClusterDefaultProviderNameReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetResource(arg1 interface{}, arg2 string, arg3 string, arg4 clusterclient.PostVerifyrFunc, arg5 *clusterclient.PollOptions) error { - fake.getResourceMutex.Lock() - ret, specificReturn := fake.getResourceReturnsOnCall[len(fake.getResourceArgsForCall)] - fake.getResourceArgsForCall = append(fake.getResourceArgsForCall, struct { - arg1 interface{} - arg2 string - arg3 string - arg4 clusterclient.PostVerifyrFunc - arg5 *clusterclient.PollOptions - }{arg1, arg2, arg3, arg4, arg5}) - stub := fake.GetResourceStub - fakeReturns := fake.getResourceReturns - fake.recordInvocation("GetResource", []interface{}{arg1, arg2, arg3, arg4, arg5}) - fake.getResourceMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4, arg5) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) GetResourceCallCount() int { - fake.getResourceMutex.RLock() - defer fake.getResourceMutex.RUnlock() - return len(fake.getResourceArgsForCall) -} - -func (fake *ClusterClient) GetResourceCalls(stub func(interface{}, string, string, clusterclient.PostVerifyrFunc, *clusterclient.PollOptions) error) { - fake.getResourceMutex.Lock() - defer fake.getResourceMutex.Unlock() - fake.GetResourceStub = stub -} - -func (fake *ClusterClient) GetResourceArgsForCall(i int) (interface{}, string, string, clusterclient.PostVerifyrFunc, *clusterclient.PollOptions) { - fake.getResourceMutex.RLock() - defer fake.getResourceMutex.RUnlock() - argsForCall := fake.getResourceArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 -} - -func (fake *ClusterClient) GetResourceReturns(result1 error) { - fake.getResourceMutex.Lock() - defer fake.getResourceMutex.Unlock() - fake.GetResourceStub = nil - fake.getResourceReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) GetResourceReturnsOnCall(i int, result1 error) { - fake.getResourceMutex.Lock() - defer fake.getResourceMutex.Unlock() - fake.GetResourceStub = nil - if fake.getResourceReturnsOnCall == nil { - fake.getResourceReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.getResourceReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) GetResourceList(arg1 interface{}, arg2 string, arg3 string, arg4 clusterclient.PostVerifyListrFunc, arg5 *clusterclient.PollOptions) error { - fake.getResourceListMutex.Lock() - ret, specificReturn := fake.getResourceListReturnsOnCall[len(fake.getResourceListArgsForCall)] - fake.getResourceListArgsForCall = append(fake.getResourceListArgsForCall, struct { - arg1 interface{} - arg2 string - arg3 string - arg4 clusterclient.PostVerifyListrFunc - arg5 *clusterclient.PollOptions - }{arg1, arg2, arg3, arg4, arg5}) - stub := fake.GetResourceListStub - fakeReturns := fake.getResourceListReturns - fake.recordInvocation("GetResourceList", []interface{}{arg1, arg2, arg3, arg4, arg5}) - fake.getResourceListMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4, arg5) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) GetResourceListCallCount() int { - fake.getResourceListMutex.RLock() - defer fake.getResourceListMutex.RUnlock() - return len(fake.getResourceListArgsForCall) -} - -func (fake *ClusterClient) GetResourceListCalls(stub func(interface{}, string, string, clusterclient.PostVerifyListrFunc, *clusterclient.PollOptions) error) { - fake.getResourceListMutex.Lock() - defer fake.getResourceListMutex.Unlock() - fake.GetResourceListStub = stub -} - -func (fake *ClusterClient) GetResourceListArgsForCall(i int) (interface{}, string, string, clusterclient.PostVerifyListrFunc, *clusterclient.PollOptions) { - fake.getResourceListMutex.RLock() - defer fake.getResourceListMutex.RUnlock() - argsForCall := fake.getResourceListArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 -} - -func (fake *ClusterClient) GetResourceListReturns(result1 error) { - fake.getResourceListMutex.Lock() - defer fake.getResourceListMutex.Unlock() - fake.GetResourceListStub = nil - fake.getResourceListReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) GetResourceListReturnsOnCall(i int, result1 error) { - fake.getResourceListMutex.Lock() - defer fake.getResourceListMutex.Unlock() - fake.GetResourceListStub = nil - if fake.getResourceListReturnsOnCall == nil { - fake.getResourceListReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.getResourceListReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) GetSecretValue(arg1 string, arg2 string, arg3 string, arg4 *clusterclient.PollOptions) ([]byte, error) { - fake.getSecretValueMutex.Lock() - ret, specificReturn := fake.getSecretValueReturnsOnCall[len(fake.getSecretValueArgsForCall)] - fake.getSecretValueArgsForCall = append(fake.getSecretValueArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 *clusterclient.PollOptions - }{arg1, arg2, arg3, arg4}) - stub := fake.GetSecretValueStub - fakeReturns := fake.getSecretValueReturns - fake.recordInvocation("GetSecretValue", []interface{}{arg1, arg2, arg3, arg4}) - fake.getSecretValueMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetSecretValueCallCount() int { - fake.getSecretValueMutex.RLock() - defer fake.getSecretValueMutex.RUnlock() - return len(fake.getSecretValueArgsForCall) -} - -func (fake *ClusterClient) GetSecretValueCalls(stub func(string, string, string, *clusterclient.PollOptions) ([]byte, error)) { - fake.getSecretValueMutex.Lock() - defer fake.getSecretValueMutex.Unlock() - fake.GetSecretValueStub = stub -} - -func (fake *ClusterClient) GetSecretValueArgsForCall(i int) (string, string, string, *clusterclient.PollOptions) { - fake.getSecretValueMutex.RLock() - defer fake.getSecretValueMutex.RUnlock() - argsForCall := fake.getSecretValueArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) GetSecretValueReturns(result1 []byte, result2 error) { - fake.getSecretValueMutex.Lock() - defer fake.getSecretValueMutex.Unlock() - fake.GetSecretValueStub = nil - fake.getSecretValueReturns = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetSecretValueReturnsOnCall(i int, result1 []byte, result2 error) { - fake.getSecretValueMutex.Lock() - defer fake.getSecretValueMutex.Unlock() - fake.GetSecretValueStub = nil - if fake.getSecretValueReturnsOnCall == nil { - fake.getSecretValueReturnsOnCall = make(map[int]struct { - result1 []byte - result2 error - }) - } - fake.getSecretValueReturnsOnCall[i] = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetTanzuKubernetesReleases(arg1 string) ([]v1alpha1a.TanzuKubernetesRelease, error) { - fake.getTanzuKubernetesReleasesMutex.Lock() - ret, specificReturn := fake.getTanzuKubernetesReleasesReturnsOnCall[len(fake.getTanzuKubernetesReleasesArgsForCall)] - fake.getTanzuKubernetesReleasesArgsForCall = append(fake.getTanzuKubernetesReleasesArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetTanzuKubernetesReleasesStub - fakeReturns := fake.getTanzuKubernetesReleasesReturns - fake.recordInvocation("GetTanzuKubernetesReleases", []interface{}{arg1}) - fake.getTanzuKubernetesReleasesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetTanzuKubernetesReleasesCallCount() int { - fake.getTanzuKubernetesReleasesMutex.RLock() - defer fake.getTanzuKubernetesReleasesMutex.RUnlock() - return len(fake.getTanzuKubernetesReleasesArgsForCall) -} - -func (fake *ClusterClient) GetTanzuKubernetesReleasesCalls(stub func(string) ([]v1alpha1a.TanzuKubernetesRelease, error)) { - fake.getTanzuKubernetesReleasesMutex.Lock() - defer fake.getTanzuKubernetesReleasesMutex.Unlock() - fake.GetTanzuKubernetesReleasesStub = stub -} - -func (fake *ClusterClient) GetTanzuKubernetesReleasesArgsForCall(i int) string { - fake.getTanzuKubernetesReleasesMutex.RLock() - defer fake.getTanzuKubernetesReleasesMutex.RUnlock() - argsForCall := fake.getTanzuKubernetesReleasesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) GetTanzuKubernetesReleasesReturns(result1 []v1alpha1a.TanzuKubernetesRelease, result2 error) { - fake.getTanzuKubernetesReleasesMutex.Lock() - defer fake.getTanzuKubernetesReleasesMutex.Unlock() - fake.GetTanzuKubernetesReleasesStub = nil - fake.getTanzuKubernetesReleasesReturns = struct { - result1 []v1alpha1a.TanzuKubernetesRelease - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetTanzuKubernetesReleasesReturnsOnCall(i int, result1 []v1alpha1a.TanzuKubernetesRelease, result2 error) { - fake.getTanzuKubernetesReleasesMutex.Lock() - defer fake.getTanzuKubernetesReleasesMutex.Unlock() - fake.GetTanzuKubernetesReleasesStub = nil - if fake.getTanzuKubernetesReleasesReturnsOnCall == nil { - fake.getTanzuKubernetesReleasesReturnsOnCall = make(map[int]struct { - result1 []v1alpha1a.TanzuKubernetesRelease - result2 error - }) - } - fake.getTanzuKubernetesReleasesReturnsOnCall[i] = struct { - result1 []v1alpha1a.TanzuKubernetesRelease - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetVCClientAndDataCenter(arg1 string, arg2 string, arg3 string, arg4 vc.VcClientFactory) (vc.Client, string, error) { - fake.getVCClientAndDataCenterMutex.Lock() - ret, specificReturn := fake.getVCClientAndDataCenterReturnsOnCall[len(fake.getVCClientAndDataCenterArgsForCall)] - fake.getVCClientAndDataCenterArgsForCall = append(fake.getVCClientAndDataCenterArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 vc.VcClientFactory - }{arg1, arg2, arg3, arg4}) - stub := fake.GetVCClientAndDataCenterStub - fakeReturns := fake.getVCClientAndDataCenterReturns - fake.recordInvocation("GetVCClientAndDataCenter", []interface{}{arg1, arg2, arg3, arg4}) - fake.getVCClientAndDataCenterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *ClusterClient) GetVCClientAndDataCenterCallCount() int { - fake.getVCClientAndDataCenterMutex.RLock() - defer fake.getVCClientAndDataCenterMutex.RUnlock() - return len(fake.getVCClientAndDataCenterArgsForCall) -} - -func (fake *ClusterClient) GetVCClientAndDataCenterCalls(stub func(string, string, string, vc.VcClientFactory) (vc.Client, string, error)) { - fake.getVCClientAndDataCenterMutex.Lock() - defer fake.getVCClientAndDataCenterMutex.Unlock() - fake.GetVCClientAndDataCenterStub = stub -} - -func (fake *ClusterClient) GetVCClientAndDataCenterArgsForCall(i int) (string, string, string, vc.VcClientFactory) { - fake.getVCClientAndDataCenterMutex.RLock() - defer fake.getVCClientAndDataCenterMutex.RUnlock() - argsForCall := fake.getVCClientAndDataCenterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) GetVCClientAndDataCenterReturns(result1 vc.Client, result2 string, result3 error) { - fake.getVCClientAndDataCenterMutex.Lock() - defer fake.getVCClientAndDataCenterMutex.Unlock() - fake.GetVCClientAndDataCenterStub = nil - fake.getVCClientAndDataCenterReturns = struct { - result1 vc.Client - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetVCClientAndDataCenterReturnsOnCall(i int, result1 vc.Client, result2 string, result3 error) { - fake.getVCClientAndDataCenterMutex.Lock() - defer fake.getVCClientAndDataCenterMutex.Unlock() - fake.GetVCClientAndDataCenterStub = nil - if fake.getVCClientAndDataCenterReturnsOnCall == nil { - fake.getVCClientAndDataCenterReturnsOnCall = make(map[int]struct { - result1 vc.Client - result2 string - result3 error - }) - } - fake.getVCClientAndDataCenterReturnsOnCall[i] = struct { - result1 vc.Client - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetVCCredentialsFromCluster(arg1 string, arg2 string) (string, string, error) { - fake.getVCCredentialsFromClusterMutex.Lock() - ret, specificReturn := fake.getVCCredentialsFromClusterReturnsOnCall[len(fake.getVCCredentialsFromClusterArgsForCall)] - fake.getVCCredentialsFromClusterArgsForCall = append(fake.getVCCredentialsFromClusterArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetVCCredentialsFromClusterStub - fakeReturns := fake.getVCCredentialsFromClusterReturns - fake.recordInvocation("GetVCCredentialsFromCluster", []interface{}{arg1, arg2}) - fake.getVCCredentialsFromClusterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *ClusterClient) GetVCCredentialsFromClusterCallCount() int { - fake.getVCCredentialsFromClusterMutex.RLock() - defer fake.getVCCredentialsFromClusterMutex.RUnlock() - return len(fake.getVCCredentialsFromClusterArgsForCall) -} - -func (fake *ClusterClient) GetVCCredentialsFromClusterCalls(stub func(string, string) (string, string, error)) { - fake.getVCCredentialsFromClusterMutex.Lock() - defer fake.getVCCredentialsFromClusterMutex.Unlock() - fake.GetVCCredentialsFromClusterStub = stub -} - -func (fake *ClusterClient) GetVCCredentialsFromClusterArgsForCall(i int) (string, string) { - fake.getVCCredentialsFromClusterMutex.RLock() - defer fake.getVCCredentialsFromClusterMutex.RUnlock() - argsForCall := fake.getVCCredentialsFromClusterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) GetVCCredentialsFromClusterReturns(result1 string, result2 string, result3 error) { - fake.getVCCredentialsFromClusterMutex.Lock() - defer fake.getVCCredentialsFromClusterMutex.Unlock() - fake.GetVCCredentialsFromClusterStub = nil - fake.getVCCredentialsFromClusterReturns = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetVCCredentialsFromClusterReturnsOnCall(i int, result1 string, result2 string, result3 error) { - fake.getVCCredentialsFromClusterMutex.Lock() - defer fake.getVCCredentialsFromClusterMutex.Unlock() - fake.GetVCCredentialsFromClusterStub = nil - if fake.getVCCredentialsFromClusterReturnsOnCall == nil { - fake.getVCCredentialsFromClusterReturnsOnCall = make(map[int]struct { - result1 string - result2 string - result3 error - }) - } - fake.getVCCredentialsFromClusterReturnsOnCall[i] = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetVCCredentialsFromSecret(arg1 string) (string, string, error) { - fake.getVCCredentialsFromSecretMutex.Lock() - ret, specificReturn := fake.getVCCredentialsFromSecretReturnsOnCall[len(fake.getVCCredentialsFromSecretArgsForCall)] - fake.getVCCredentialsFromSecretArgsForCall = append(fake.getVCCredentialsFromSecretArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetVCCredentialsFromSecretStub - fakeReturns := fake.getVCCredentialsFromSecretReturns - fake.recordInvocation("GetVCCredentialsFromSecret", []interface{}{arg1}) - fake.getVCCredentialsFromSecretMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *ClusterClient) GetVCCredentialsFromSecretCallCount() int { - fake.getVCCredentialsFromSecretMutex.RLock() - defer fake.getVCCredentialsFromSecretMutex.RUnlock() - return len(fake.getVCCredentialsFromSecretArgsForCall) -} - -func (fake *ClusterClient) GetVCCredentialsFromSecretCalls(stub func(string) (string, string, error)) { - fake.getVCCredentialsFromSecretMutex.Lock() - defer fake.getVCCredentialsFromSecretMutex.Unlock() - fake.GetVCCredentialsFromSecretStub = stub -} - -func (fake *ClusterClient) GetVCCredentialsFromSecretArgsForCall(i int) string { - fake.getVCCredentialsFromSecretMutex.RLock() - defer fake.getVCCredentialsFromSecretMutex.RUnlock() - argsForCall := fake.getVCCredentialsFromSecretArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) GetVCCredentialsFromSecretReturns(result1 string, result2 string, result3 error) { - fake.getVCCredentialsFromSecretMutex.Lock() - defer fake.getVCCredentialsFromSecretMutex.Unlock() - fake.GetVCCredentialsFromSecretStub = nil - fake.getVCCredentialsFromSecretReturns = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetVCCredentialsFromSecretReturnsOnCall(i int, result1 string, result2 string, result3 error) { - fake.getVCCredentialsFromSecretMutex.Lock() - defer fake.getVCCredentialsFromSecretMutex.Unlock() - fake.GetVCCredentialsFromSecretStub = nil - if fake.getVCCredentialsFromSecretReturnsOnCall == nil { - fake.getVCCredentialsFromSecretReturnsOnCall = make(map[int]struct { - result1 string - result2 string - result3 error - }) - } - fake.getVCCredentialsFromSecretReturnsOnCall[i] = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) GetVCServer() (string, error) { - fake.getVCServerMutex.Lock() - ret, specificReturn := fake.getVCServerReturnsOnCall[len(fake.getVCServerArgsForCall)] - fake.getVCServerArgsForCall = append(fake.getVCServerArgsForCall, struct { - }{}) - stub := fake.GetVCServerStub - fakeReturns := fake.getVCServerReturns - fake.recordInvocation("GetVCServer", []interface{}{}) - fake.getVCServerMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) GetVCServerCallCount() int { - fake.getVCServerMutex.RLock() - defer fake.getVCServerMutex.RUnlock() - return len(fake.getVCServerArgsForCall) -} - -func (fake *ClusterClient) GetVCServerCalls(stub func() (string, error)) { - fake.getVCServerMutex.Lock() - defer fake.getVCServerMutex.Unlock() - fake.GetVCServerStub = stub -} - -func (fake *ClusterClient) GetVCServerReturns(result1 string, result2 error) { - fake.getVCServerMutex.Lock() - defer fake.getVCServerMutex.Unlock() - fake.GetVCServerStub = nil - fake.getVCServerReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) GetVCServerReturnsOnCall(i int, result1 string, result2 error) { - fake.getVCServerMutex.Lock() - defer fake.getVCServerMutex.Unlock() - fake.GetVCServerStub = nil - if fake.getVCServerReturnsOnCall == nil { - fake.getVCServerReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getVCServerReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) HasCEIPTelemetryJob(arg1 string) (bool, error) { - fake.hasCEIPTelemetryJobMutex.Lock() - ret, specificReturn := fake.hasCEIPTelemetryJobReturnsOnCall[len(fake.hasCEIPTelemetryJobArgsForCall)] - fake.hasCEIPTelemetryJobArgsForCall = append(fake.hasCEIPTelemetryJobArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.HasCEIPTelemetryJobStub - fakeReturns := fake.hasCEIPTelemetryJobReturns - fake.recordInvocation("HasCEIPTelemetryJob", []interface{}{arg1}) - fake.hasCEIPTelemetryJobMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) HasCEIPTelemetryJobCallCount() int { - fake.hasCEIPTelemetryJobMutex.RLock() - defer fake.hasCEIPTelemetryJobMutex.RUnlock() - return len(fake.hasCEIPTelemetryJobArgsForCall) -} - -func (fake *ClusterClient) HasCEIPTelemetryJobCalls(stub func(string) (bool, error)) { - fake.hasCEIPTelemetryJobMutex.Lock() - defer fake.hasCEIPTelemetryJobMutex.Unlock() - fake.HasCEIPTelemetryJobStub = stub -} - -func (fake *ClusterClient) HasCEIPTelemetryJobArgsForCall(i int) string { - fake.hasCEIPTelemetryJobMutex.RLock() - defer fake.hasCEIPTelemetryJobMutex.RUnlock() - argsForCall := fake.hasCEIPTelemetryJobArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) HasCEIPTelemetryJobReturns(result1 bool, result2 error) { - fake.hasCEIPTelemetryJobMutex.Lock() - defer fake.hasCEIPTelemetryJobMutex.Unlock() - fake.HasCEIPTelemetryJobStub = nil - fake.hasCEIPTelemetryJobReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) HasCEIPTelemetryJobReturnsOnCall(i int, result1 bool, result2 error) { - fake.hasCEIPTelemetryJobMutex.Lock() - defer fake.hasCEIPTelemetryJobMutex.Unlock() - fake.HasCEIPTelemetryJobStub = nil - if fake.hasCEIPTelemetryJobReturnsOnCall == nil { - fake.hasCEIPTelemetryJobReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.hasCEIPTelemetryJobReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) IsClusterClassBased(arg1 string, arg2 string) (bool, error) { - fake.isClusterClassBasedMutex.Lock() - ret, specificReturn := fake.isClusterClassBasedReturnsOnCall[len(fake.isClusterClassBasedArgsForCall)] - fake.isClusterClassBasedArgsForCall = append(fake.isClusterClassBasedArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.IsClusterClassBasedStub - fakeReturns := fake.isClusterClassBasedReturns - fake.recordInvocation("IsClusterClassBased", []interface{}{arg1, arg2}) - fake.isClusterClassBasedMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) IsClusterClassBasedCallCount() int { - fake.isClusterClassBasedMutex.RLock() - defer fake.isClusterClassBasedMutex.RUnlock() - return len(fake.isClusterClassBasedArgsForCall) -} - -func (fake *ClusterClient) IsClusterClassBasedCalls(stub func(string, string) (bool, error)) { - fake.isClusterClassBasedMutex.Lock() - defer fake.isClusterClassBasedMutex.Unlock() - fake.IsClusterClassBasedStub = stub -} - -func (fake *ClusterClient) IsClusterClassBasedArgsForCall(i int) (string, string) { - fake.isClusterClassBasedMutex.RLock() - defer fake.isClusterClassBasedMutex.RUnlock() - argsForCall := fake.isClusterClassBasedArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) IsClusterClassBasedReturns(result1 bool, result2 error) { - fake.isClusterClassBasedMutex.Lock() - defer fake.isClusterClassBasedMutex.Unlock() - fake.IsClusterClassBasedStub = nil - fake.isClusterClassBasedReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) IsClusterClassBasedReturnsOnCall(i int, result1 bool, result2 error) { - fake.isClusterClassBasedMutex.Lock() - defer fake.isClusterClassBasedMutex.Unlock() - fake.IsClusterClassBasedStub = nil - if fake.isClusterClassBasedReturnsOnCall == nil { - fake.isClusterClassBasedReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.isClusterClassBasedReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) IsClusterRegisteredToTMC() (bool, error) { - fake.isClusterRegisteredToTMCMutex.Lock() - ret, specificReturn := fake.isClusterRegisteredToTMCReturnsOnCall[len(fake.isClusterRegisteredToTMCArgsForCall)] - fake.isClusterRegisteredToTMCArgsForCall = append(fake.isClusterRegisteredToTMCArgsForCall, struct { - }{}) - stub := fake.IsClusterRegisteredToTMCStub - fakeReturns := fake.isClusterRegisteredToTMCReturns - fake.recordInvocation("IsClusterRegisteredToTMC", []interface{}{}) - fake.isClusterRegisteredToTMCMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) IsClusterRegisteredToTMCCallCount() int { - fake.isClusterRegisteredToTMCMutex.RLock() - defer fake.isClusterRegisteredToTMCMutex.RUnlock() - return len(fake.isClusterRegisteredToTMCArgsForCall) -} - -func (fake *ClusterClient) IsClusterRegisteredToTMCCalls(stub func() (bool, error)) { - fake.isClusterRegisteredToTMCMutex.Lock() - defer fake.isClusterRegisteredToTMCMutex.Unlock() - fake.IsClusterRegisteredToTMCStub = stub -} - -func (fake *ClusterClient) IsClusterRegisteredToTMCReturns(result1 bool, result2 error) { - fake.isClusterRegisteredToTMCMutex.Lock() - defer fake.isClusterRegisteredToTMCMutex.Unlock() - fake.IsClusterRegisteredToTMCStub = nil - fake.isClusterRegisteredToTMCReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) IsClusterRegisteredToTMCReturnsOnCall(i int, result1 bool, result2 error) { - fake.isClusterRegisteredToTMCMutex.Lock() - defer fake.isClusterRegisteredToTMCMutex.Unlock() - fake.IsClusterRegisteredToTMCStub = nil - if fake.isClusterRegisteredToTMCReturnsOnCall == nil { - fake.isClusterRegisteredToTMCReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.isClusterRegisteredToTMCReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) IsPacificRegionalCluster() (bool, error) { - fake.isPacificRegionalClusterMutex.Lock() - ret, specificReturn := fake.isPacificRegionalClusterReturnsOnCall[len(fake.isPacificRegionalClusterArgsForCall)] - fake.isPacificRegionalClusterArgsForCall = append(fake.isPacificRegionalClusterArgsForCall, struct { - }{}) - stub := fake.IsPacificRegionalClusterStub - fakeReturns := fake.isPacificRegionalClusterReturns - fake.recordInvocation("IsPacificRegionalCluster", []interface{}{}) - fake.isPacificRegionalClusterMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) IsPacificRegionalClusterCallCount() int { - fake.isPacificRegionalClusterMutex.RLock() - defer fake.isPacificRegionalClusterMutex.RUnlock() - return len(fake.isPacificRegionalClusterArgsForCall) -} - -func (fake *ClusterClient) IsPacificRegionalClusterCalls(stub func() (bool, error)) { - fake.isPacificRegionalClusterMutex.Lock() - defer fake.isPacificRegionalClusterMutex.Unlock() - fake.IsPacificRegionalClusterStub = stub -} - -func (fake *ClusterClient) IsPacificRegionalClusterReturns(result1 bool, result2 error) { - fake.isPacificRegionalClusterMutex.Lock() - defer fake.isPacificRegionalClusterMutex.Unlock() - fake.IsPacificRegionalClusterStub = nil - fake.isPacificRegionalClusterReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) IsPacificRegionalClusterReturnsOnCall(i int, result1 bool, result2 error) { - fake.isPacificRegionalClusterMutex.Lock() - defer fake.isPacificRegionalClusterMutex.Unlock() - fake.IsPacificRegionalClusterStub = nil - if fake.isPacificRegionalClusterReturnsOnCall == nil { - fake.isPacificRegionalClusterReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.isPacificRegionalClusterReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) IsRegionalCluster() error { - fake.isRegionalClusterMutex.Lock() - ret, specificReturn := fake.isRegionalClusterReturnsOnCall[len(fake.isRegionalClusterArgsForCall)] - fake.isRegionalClusterArgsForCall = append(fake.isRegionalClusterArgsForCall, struct { - }{}) - stub := fake.IsRegionalClusterStub - fakeReturns := fake.isRegionalClusterReturns - fake.recordInvocation("IsRegionalCluster", []interface{}{}) - fake.isRegionalClusterMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) IsRegionalClusterCallCount() int { - fake.isRegionalClusterMutex.RLock() - defer fake.isRegionalClusterMutex.RUnlock() - return len(fake.isRegionalClusterArgsForCall) -} - -func (fake *ClusterClient) IsRegionalClusterCalls(stub func() error) { - fake.isRegionalClusterMutex.Lock() - defer fake.isRegionalClusterMutex.Unlock() - fake.IsRegionalClusterStub = stub -} - -func (fake *ClusterClient) IsRegionalClusterReturns(result1 error) { - fake.isRegionalClusterMutex.Lock() - defer fake.isRegionalClusterMutex.Unlock() - fake.IsRegionalClusterStub = nil - fake.isRegionalClusterReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) IsRegionalClusterReturnsOnCall(i int, result1 error) { - fake.isRegionalClusterMutex.Lock() - defer fake.isRegionalClusterMutex.Unlock() - fake.IsRegionalClusterStub = nil - if fake.isRegionalClusterReturnsOnCall == nil { - fake.isRegionalClusterReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.isRegionalClusterReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ListCLIPluginResources() ([]v1alpha1b.CLIPlugin, error) { - fake.listCLIPluginResourcesMutex.Lock() - ret, specificReturn := fake.listCLIPluginResourcesReturnsOnCall[len(fake.listCLIPluginResourcesArgsForCall)] - fake.listCLIPluginResourcesArgsForCall = append(fake.listCLIPluginResourcesArgsForCall, struct { - }{}) - stub := fake.ListCLIPluginResourcesStub - fakeReturns := fake.listCLIPluginResourcesReturns - fake.recordInvocation("ListCLIPluginResources", []interface{}{}) - fake.listCLIPluginResourcesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) ListCLIPluginResourcesCallCount() int { - fake.listCLIPluginResourcesMutex.RLock() - defer fake.listCLIPluginResourcesMutex.RUnlock() - return len(fake.listCLIPluginResourcesArgsForCall) -} - -func (fake *ClusterClient) ListCLIPluginResourcesCalls(stub func() ([]v1alpha1b.CLIPlugin, error)) { - fake.listCLIPluginResourcesMutex.Lock() - defer fake.listCLIPluginResourcesMutex.Unlock() - fake.ListCLIPluginResourcesStub = stub -} - -func (fake *ClusterClient) ListCLIPluginResourcesReturns(result1 []v1alpha1b.CLIPlugin, result2 error) { - fake.listCLIPluginResourcesMutex.Lock() - defer fake.listCLIPluginResourcesMutex.Unlock() - fake.ListCLIPluginResourcesStub = nil - fake.listCLIPluginResourcesReturns = struct { - result1 []v1alpha1b.CLIPlugin - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) ListCLIPluginResourcesReturnsOnCall(i int, result1 []v1alpha1b.CLIPlugin, result2 error) { - fake.listCLIPluginResourcesMutex.Lock() - defer fake.listCLIPluginResourcesMutex.Unlock() - fake.ListCLIPluginResourcesStub = nil - if fake.listCLIPluginResourcesReturnsOnCall == nil { - fake.listCLIPluginResourcesReturnsOnCall = make(map[int]struct { - result1 []v1alpha1b.CLIPlugin - result2 error - }) - } - fake.listCLIPluginResourcesReturnsOnCall[i] = struct { - result1 []v1alpha1b.CLIPlugin - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) ListClusters(arg1 string) ([]v1beta1a.Cluster, error) { - fake.listClustersMutex.Lock() - ret, specificReturn := fake.listClustersReturnsOnCall[len(fake.listClustersArgsForCall)] - fake.listClustersArgsForCall = append(fake.listClustersArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ListClustersStub - fakeReturns := fake.listClustersReturns - fake.recordInvocation("ListClusters", []interface{}{arg1}) - fake.listClustersMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) ListClustersCallCount() int { - fake.listClustersMutex.RLock() - defer fake.listClustersMutex.RUnlock() - return len(fake.listClustersArgsForCall) -} - -func (fake *ClusterClient) ListClustersCalls(stub func(string) ([]v1beta1a.Cluster, error)) { - fake.listClustersMutex.Lock() - defer fake.listClustersMutex.Unlock() - fake.ListClustersStub = stub -} - -func (fake *ClusterClient) ListClustersArgsForCall(i int) string { - fake.listClustersMutex.RLock() - defer fake.listClustersMutex.RUnlock() - argsForCall := fake.listClustersArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) ListClustersReturns(result1 []v1beta1a.Cluster, result2 error) { - fake.listClustersMutex.Lock() - defer fake.listClustersMutex.Unlock() - fake.ListClustersStub = nil - fake.listClustersReturns = struct { - result1 []v1beta1a.Cluster - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) ListClustersReturnsOnCall(i int, result1 []v1beta1a.Cluster, result2 error) { - fake.listClustersMutex.Lock() - defer fake.listClustersMutex.Unlock() - fake.ListClustersStub = nil - if fake.listClustersReturnsOnCall == nil { - fake.listClustersReturnsOnCall = make(map[int]struct { - result1 []v1beta1a.Cluster - result2 error - }) - } - fake.listClustersReturnsOnCall[i] = struct { - result1 []v1beta1a.Cluster - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) ListPacificClusterObjects(arg1 string, arg2 *client.ListOptions) ([]interface{}, error) { - fake.listPacificClusterObjectsMutex.Lock() - ret, specificReturn := fake.listPacificClusterObjectsReturnsOnCall[len(fake.listPacificClusterObjectsArgsForCall)] - fake.listPacificClusterObjectsArgsForCall = append(fake.listPacificClusterObjectsArgsForCall, struct { - arg1 string - arg2 *client.ListOptions - }{arg1, arg2}) - stub := fake.ListPacificClusterObjectsStub - fakeReturns := fake.listPacificClusterObjectsReturns - fake.recordInvocation("ListPacificClusterObjects", []interface{}{arg1, arg2}) - fake.listPacificClusterObjectsMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) ListPacificClusterObjectsCallCount() int { - fake.listPacificClusterObjectsMutex.RLock() - defer fake.listPacificClusterObjectsMutex.RUnlock() - return len(fake.listPacificClusterObjectsArgsForCall) -} - -func (fake *ClusterClient) ListPacificClusterObjectsCalls(stub func(string, *client.ListOptions) ([]interface{}, error)) { - fake.listPacificClusterObjectsMutex.Lock() - defer fake.listPacificClusterObjectsMutex.Unlock() - fake.ListPacificClusterObjectsStub = stub -} - -func (fake *ClusterClient) ListPacificClusterObjectsArgsForCall(i int) (string, *client.ListOptions) { - fake.listPacificClusterObjectsMutex.RLock() - defer fake.listPacificClusterObjectsMutex.RUnlock() - argsForCall := fake.listPacificClusterObjectsArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) ListPacificClusterObjectsReturns(result1 []interface{}, result2 error) { - fake.listPacificClusterObjectsMutex.Lock() - defer fake.listPacificClusterObjectsMutex.Unlock() - fake.ListPacificClusterObjectsStub = nil - fake.listPacificClusterObjectsReturns = struct { - result1 []interface{} - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) ListPacificClusterObjectsReturnsOnCall(i int, result1 []interface{}, result2 error) { - fake.listPacificClusterObjectsMutex.Lock() - defer fake.listPacificClusterObjectsMutex.Unlock() - fake.ListPacificClusterObjectsStub = nil - if fake.listPacificClusterObjectsReturnsOnCall == nil { - fake.listPacificClusterObjectsReturnsOnCall = make(map[int]struct { - result1 []interface{} - result2 error - }) - } - fake.listPacificClusterObjectsReturnsOnCall[i] = struct { - result1 []interface{} - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) ListResources(arg1 interface{}, arg2 ...client.ListOption) error { - fake.listResourcesMutex.Lock() - ret, specificReturn := fake.listResourcesReturnsOnCall[len(fake.listResourcesArgsForCall)] - fake.listResourcesArgsForCall = append(fake.listResourcesArgsForCall, struct { - arg1 interface{} - arg2 []client.ListOption - }{arg1, arg2}) - stub := fake.ListResourcesStub - fakeReturns := fake.listResourcesReturns - fake.recordInvocation("ListResources", []interface{}{arg1, arg2}) - fake.listResourcesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) ListResourcesCallCount() int { - fake.listResourcesMutex.RLock() - defer fake.listResourcesMutex.RUnlock() - return len(fake.listResourcesArgsForCall) -} - -func (fake *ClusterClient) ListResourcesCalls(stub func(interface{}, ...client.ListOption) error) { - fake.listResourcesMutex.Lock() - defer fake.listResourcesMutex.Unlock() - fake.ListResourcesStub = stub -} - -func (fake *ClusterClient) ListResourcesArgsForCall(i int) (interface{}, []client.ListOption) { - fake.listResourcesMutex.RLock() - defer fake.listResourcesMutex.RUnlock() - argsForCall := fake.listResourcesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) ListResourcesReturns(result1 error) { - fake.listResourcesMutex.Lock() - defer fake.listResourcesMutex.Unlock() - fake.ListResourcesStub = nil - fake.listResourcesReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ListResourcesReturnsOnCall(i int, result1 error) { - fake.listResourcesMutex.Lock() - defer fake.listResourcesMutex.Unlock() - fake.ListResourcesStub = nil - if fake.listResourcesReturnsOnCall == nil { - fake.listResourcesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.listResourcesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) LoadCurrentKubeconfigBytes() ([]byte, error) { - fake.loadCurrentKubeconfigBytesMutex.Lock() - ret, specificReturn := fake.loadCurrentKubeconfigBytesReturnsOnCall[len(fake.loadCurrentKubeconfigBytesArgsForCall)] - fake.loadCurrentKubeconfigBytesArgsForCall = append(fake.loadCurrentKubeconfigBytesArgsForCall, struct { - }{}) - stub := fake.LoadCurrentKubeconfigBytesStub - fakeReturns := fake.loadCurrentKubeconfigBytesReturns - fake.recordInvocation("LoadCurrentKubeconfigBytes", []interface{}{}) - fake.loadCurrentKubeconfigBytesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) LoadCurrentKubeconfigBytesCallCount() int { - fake.loadCurrentKubeconfigBytesMutex.RLock() - defer fake.loadCurrentKubeconfigBytesMutex.RUnlock() - return len(fake.loadCurrentKubeconfigBytesArgsForCall) -} - -func (fake *ClusterClient) LoadCurrentKubeconfigBytesCalls(stub func() ([]byte, error)) { - fake.loadCurrentKubeconfigBytesMutex.Lock() - defer fake.loadCurrentKubeconfigBytesMutex.Unlock() - fake.LoadCurrentKubeconfigBytesStub = stub -} - -func (fake *ClusterClient) LoadCurrentKubeconfigBytesReturns(result1 []byte, result2 error) { - fake.loadCurrentKubeconfigBytesMutex.Lock() - defer fake.loadCurrentKubeconfigBytesMutex.Unlock() - fake.LoadCurrentKubeconfigBytesStub = nil - fake.loadCurrentKubeconfigBytesReturns = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) LoadCurrentKubeconfigBytesReturnsOnCall(i int, result1 []byte, result2 error) { - fake.loadCurrentKubeconfigBytesMutex.Lock() - defer fake.loadCurrentKubeconfigBytesMutex.Unlock() - fake.LoadCurrentKubeconfigBytesStub = nil - if fake.loadCurrentKubeconfigBytesReturnsOnCall == nil { - fake.loadCurrentKubeconfigBytesReturnsOnCall = make(map[int]struct { - result1 []byte - result2 error - }) - } - fake.loadCurrentKubeconfigBytesReturnsOnCall[i] = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) MergeAndUseConfigForCluster(arg1 []byte, arg2 string) (string, string, error) { - var arg1Copy []byte - if arg1 != nil { - arg1Copy = make([]byte, len(arg1)) - copy(arg1Copy, arg1) - } - fake.mergeAndUseConfigForClusterMutex.Lock() - ret, specificReturn := fake.mergeAndUseConfigForClusterReturnsOnCall[len(fake.mergeAndUseConfigForClusterArgsForCall)] - fake.mergeAndUseConfigForClusterArgsForCall = append(fake.mergeAndUseConfigForClusterArgsForCall, struct { - arg1 []byte - arg2 string - }{arg1Copy, arg2}) - stub := fake.MergeAndUseConfigForClusterStub - fakeReturns := fake.mergeAndUseConfigForClusterReturns - fake.recordInvocation("MergeAndUseConfigForCluster", []interface{}{arg1Copy, arg2}) - fake.mergeAndUseConfigForClusterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *ClusterClient) MergeAndUseConfigForClusterCallCount() int { - fake.mergeAndUseConfigForClusterMutex.RLock() - defer fake.mergeAndUseConfigForClusterMutex.RUnlock() - return len(fake.mergeAndUseConfigForClusterArgsForCall) -} - -func (fake *ClusterClient) MergeAndUseConfigForClusterCalls(stub func([]byte, string) (string, string, error)) { - fake.mergeAndUseConfigForClusterMutex.Lock() - defer fake.mergeAndUseConfigForClusterMutex.Unlock() - fake.MergeAndUseConfigForClusterStub = stub -} - -func (fake *ClusterClient) MergeAndUseConfigForClusterArgsForCall(i int) ([]byte, string) { - fake.mergeAndUseConfigForClusterMutex.RLock() - defer fake.mergeAndUseConfigForClusterMutex.RUnlock() - argsForCall := fake.mergeAndUseConfigForClusterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) MergeAndUseConfigForClusterReturns(result1 string, result2 string, result3 error) { - fake.mergeAndUseConfigForClusterMutex.Lock() - defer fake.mergeAndUseConfigForClusterMutex.Unlock() - fake.MergeAndUseConfigForClusterStub = nil - fake.mergeAndUseConfigForClusterReturns = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) MergeAndUseConfigForClusterReturnsOnCall(i int, result1 string, result2 string, result3 error) { - fake.mergeAndUseConfigForClusterMutex.Lock() - defer fake.mergeAndUseConfigForClusterMutex.Unlock() - fake.MergeAndUseConfigForClusterStub = nil - if fake.mergeAndUseConfigForClusterReturnsOnCall == nil { - fake.mergeAndUseConfigForClusterReturnsOnCall = make(map[int]struct { - result1 string - result2 string - result3 error - }) - } - fake.mergeAndUseConfigForClusterReturnsOnCall[i] = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *ClusterClient) MergeConfigForCluster(arg1 []byte, arg2 string) error { - var arg1Copy []byte - if arg1 != nil { - arg1Copy = make([]byte, len(arg1)) - copy(arg1Copy, arg1) - } - fake.mergeConfigForClusterMutex.Lock() - ret, specificReturn := fake.mergeConfigForClusterReturnsOnCall[len(fake.mergeConfigForClusterArgsForCall)] - fake.mergeConfigForClusterArgsForCall = append(fake.mergeConfigForClusterArgsForCall, struct { - arg1 []byte - arg2 string - }{arg1Copy, arg2}) - stub := fake.MergeConfigForClusterStub - fakeReturns := fake.mergeConfigForClusterReturns - fake.recordInvocation("MergeConfigForCluster", []interface{}{arg1Copy, arg2}) - fake.mergeConfigForClusterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) MergeConfigForClusterCallCount() int { - fake.mergeConfigForClusterMutex.RLock() - defer fake.mergeConfigForClusterMutex.RUnlock() - return len(fake.mergeConfigForClusterArgsForCall) -} - -func (fake *ClusterClient) MergeConfigForClusterCalls(stub func([]byte, string) error) { - fake.mergeConfigForClusterMutex.Lock() - defer fake.mergeConfigForClusterMutex.Unlock() - fake.MergeConfigForClusterStub = stub -} - -func (fake *ClusterClient) MergeConfigForClusterArgsForCall(i int) ([]byte, string) { - fake.mergeConfigForClusterMutex.RLock() - defer fake.mergeConfigForClusterMutex.RUnlock() - argsForCall := fake.mergeConfigForClusterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) MergeConfigForClusterReturns(result1 error) { - fake.mergeConfigForClusterMutex.Lock() - defer fake.mergeConfigForClusterMutex.Unlock() - fake.MergeConfigForClusterStub = nil - fake.mergeConfigForClusterReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) MergeConfigForClusterReturnsOnCall(i int, result1 error) { - fake.mergeConfigForClusterMutex.Lock() - defer fake.mergeConfigForClusterMutex.Unlock() - fake.MergeConfigForClusterStub = nil - if fake.mergeConfigForClusterReturnsOnCall == nil { - fake.mergeConfigForClusterReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.mergeConfigForClusterReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchCalicoKubeControllerDeploymentWithNewNodeSelector(arg1 string, arg2 string) error { - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.Lock() - ret, specificReturn := fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorReturnsOnCall[len(fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorArgsForCall)] - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorArgsForCall = append(fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.PatchCalicoKubeControllerDeploymentWithNewNodeSelectorStub - fakeReturns := fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorReturns - fake.recordInvocation("PatchCalicoKubeControllerDeploymentWithNewNodeSelector", []interface{}{arg1, arg2}) - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchCalicoKubeControllerDeploymentWithNewNodeSelectorCallCount() int { - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.RLock() - defer fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.RUnlock() - return len(fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorArgsForCall) -} - -func (fake *ClusterClient) PatchCalicoKubeControllerDeploymentWithNewNodeSelectorCalls(stub func(string, string) error) { - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.Lock() - defer fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.Unlock() - fake.PatchCalicoKubeControllerDeploymentWithNewNodeSelectorStub = stub -} - -func (fake *ClusterClient) PatchCalicoKubeControllerDeploymentWithNewNodeSelectorArgsForCall(i int) (string, string) { - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.RLock() - defer fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.RUnlock() - argsForCall := fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) PatchCalicoKubeControllerDeploymentWithNewNodeSelectorReturns(result1 error) { - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.Lock() - defer fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.Unlock() - fake.PatchCalicoKubeControllerDeploymentWithNewNodeSelectorStub = nil - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchCalicoKubeControllerDeploymentWithNewNodeSelectorReturnsOnCall(i int, result1 error) { - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.Lock() - defer fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.Unlock() - fake.PatchCalicoKubeControllerDeploymentWithNewNodeSelectorStub = nil - if fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorReturnsOnCall == nil { - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchCalicoNodeDaemonSetWithNewNodeSelector(arg1 string, arg2 string) error { - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.Lock() - ret, specificReturn := fake.patchCalicoNodeDaemonSetWithNewNodeSelectorReturnsOnCall[len(fake.patchCalicoNodeDaemonSetWithNewNodeSelectorArgsForCall)] - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorArgsForCall = append(fake.patchCalicoNodeDaemonSetWithNewNodeSelectorArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.PatchCalicoNodeDaemonSetWithNewNodeSelectorStub - fakeReturns := fake.patchCalicoNodeDaemonSetWithNewNodeSelectorReturns - fake.recordInvocation("PatchCalicoNodeDaemonSetWithNewNodeSelector", []interface{}{arg1, arg2}) - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchCalicoNodeDaemonSetWithNewNodeSelectorCallCount() int { - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.RLock() - defer fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.RUnlock() - return len(fake.patchCalicoNodeDaemonSetWithNewNodeSelectorArgsForCall) -} - -func (fake *ClusterClient) PatchCalicoNodeDaemonSetWithNewNodeSelectorCalls(stub func(string, string) error) { - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.Lock() - defer fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.Unlock() - fake.PatchCalicoNodeDaemonSetWithNewNodeSelectorStub = stub -} - -func (fake *ClusterClient) PatchCalicoNodeDaemonSetWithNewNodeSelectorArgsForCall(i int) (string, string) { - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.RLock() - defer fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.RUnlock() - argsForCall := fake.patchCalicoNodeDaemonSetWithNewNodeSelectorArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) PatchCalicoNodeDaemonSetWithNewNodeSelectorReturns(result1 error) { - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.Lock() - defer fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.Unlock() - fake.PatchCalicoNodeDaemonSetWithNewNodeSelectorStub = nil - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchCalicoNodeDaemonSetWithNewNodeSelectorReturnsOnCall(i int, result1 error) { - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.Lock() - defer fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.Unlock() - fake.PatchCalicoNodeDaemonSetWithNewNodeSelectorStub = nil - if fake.patchCalicoNodeDaemonSetWithNewNodeSelectorReturnsOnCall == nil { - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterAPIAWSControllersToUseEC2Credentials() error { - fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.Lock() - ret, specificReturn := fake.patchClusterAPIAWSControllersToUseEC2CredentialsReturnsOnCall[len(fake.patchClusterAPIAWSControllersToUseEC2CredentialsArgsForCall)] - fake.patchClusterAPIAWSControllersToUseEC2CredentialsArgsForCall = append(fake.patchClusterAPIAWSControllersToUseEC2CredentialsArgsForCall, struct { - }{}) - stub := fake.PatchClusterAPIAWSControllersToUseEC2CredentialsStub - fakeReturns := fake.patchClusterAPIAWSControllersToUseEC2CredentialsReturns - fake.recordInvocation("PatchClusterAPIAWSControllersToUseEC2Credentials", []interface{}{}) - fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchClusterAPIAWSControllersToUseEC2CredentialsCallCount() int { - fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.RLock() - defer fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.RUnlock() - return len(fake.patchClusterAPIAWSControllersToUseEC2CredentialsArgsForCall) -} - -func (fake *ClusterClient) PatchClusterAPIAWSControllersToUseEC2CredentialsCalls(stub func() error) { - fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.Lock() - defer fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.Unlock() - fake.PatchClusterAPIAWSControllersToUseEC2CredentialsStub = stub -} - -func (fake *ClusterClient) PatchClusterAPIAWSControllersToUseEC2CredentialsReturns(result1 error) { - fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.Lock() - defer fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.Unlock() - fake.PatchClusterAPIAWSControllersToUseEC2CredentialsStub = nil - fake.patchClusterAPIAWSControllersToUseEC2CredentialsReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterAPIAWSControllersToUseEC2CredentialsReturnsOnCall(i int, result1 error) { - fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.Lock() - defer fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.Unlock() - fake.PatchClusterAPIAWSControllersToUseEC2CredentialsStub = nil - if fake.patchClusterAPIAWSControllersToUseEC2CredentialsReturnsOnCall == nil { - fake.patchClusterAPIAWSControllersToUseEC2CredentialsReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchClusterAPIAWSControllersToUseEC2CredentialsReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterObject(arg1 string, arg2 string, arg3 string) error { - fake.patchClusterObjectMutex.Lock() - ret, specificReturn := fake.patchClusterObjectReturnsOnCall[len(fake.patchClusterObjectArgsForCall)] - fake.patchClusterObjectArgsForCall = append(fake.patchClusterObjectArgsForCall, struct { - arg1 string - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.PatchClusterObjectStub - fakeReturns := fake.patchClusterObjectReturns - fake.recordInvocation("PatchClusterObject", []interface{}{arg1, arg2, arg3}) - fake.patchClusterObjectMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchClusterObjectCallCount() int { - fake.patchClusterObjectMutex.RLock() - defer fake.patchClusterObjectMutex.RUnlock() - return len(fake.patchClusterObjectArgsForCall) -} - -func (fake *ClusterClient) PatchClusterObjectCalls(stub func(string, string, string) error) { - fake.patchClusterObjectMutex.Lock() - defer fake.patchClusterObjectMutex.Unlock() - fake.PatchClusterObjectStub = stub -} - -func (fake *ClusterClient) PatchClusterObjectArgsForCall(i int) (string, string, string) { - fake.patchClusterObjectMutex.RLock() - defer fake.patchClusterObjectMutex.RUnlock() - argsForCall := fake.patchClusterObjectArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) PatchClusterObjectReturns(result1 error) { - fake.patchClusterObjectMutex.Lock() - defer fake.patchClusterObjectMutex.Unlock() - fake.PatchClusterObjectStub = nil - fake.patchClusterObjectReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterObjectReturnsOnCall(i int, result1 error) { - fake.patchClusterObjectMutex.Lock() - defer fake.patchClusterObjectMutex.Unlock() - fake.PatchClusterObjectStub = nil - if fake.patchClusterObjectReturnsOnCall == nil { - fake.patchClusterObjectReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchClusterObjectReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterObjectAnnotations(arg1 string, arg2 string, arg3 string, arg4 string) error { - fake.patchClusterObjectAnnotationsMutex.Lock() - ret, specificReturn := fake.patchClusterObjectAnnotationsReturnsOnCall[len(fake.patchClusterObjectAnnotationsArgsForCall)] - fake.patchClusterObjectAnnotationsArgsForCall = append(fake.patchClusterObjectAnnotationsArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 string - }{arg1, arg2, arg3, arg4}) - stub := fake.PatchClusterObjectAnnotationsStub - fakeReturns := fake.patchClusterObjectAnnotationsReturns - fake.recordInvocation("PatchClusterObjectAnnotations", []interface{}{arg1, arg2, arg3, arg4}) - fake.patchClusterObjectAnnotationsMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchClusterObjectAnnotationsCallCount() int { - fake.patchClusterObjectAnnotationsMutex.RLock() - defer fake.patchClusterObjectAnnotationsMutex.RUnlock() - return len(fake.patchClusterObjectAnnotationsArgsForCall) -} - -func (fake *ClusterClient) PatchClusterObjectAnnotationsCalls(stub func(string, string, string, string) error) { - fake.patchClusterObjectAnnotationsMutex.Lock() - defer fake.patchClusterObjectAnnotationsMutex.Unlock() - fake.PatchClusterObjectAnnotationsStub = stub -} - -func (fake *ClusterClient) PatchClusterObjectAnnotationsArgsForCall(i int) (string, string, string, string) { - fake.patchClusterObjectAnnotationsMutex.RLock() - defer fake.patchClusterObjectAnnotationsMutex.RUnlock() - argsForCall := fake.patchClusterObjectAnnotationsArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) PatchClusterObjectAnnotationsReturns(result1 error) { - fake.patchClusterObjectAnnotationsMutex.Lock() - defer fake.patchClusterObjectAnnotationsMutex.Unlock() - fake.PatchClusterObjectAnnotationsStub = nil - fake.patchClusterObjectAnnotationsReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterObjectAnnotationsReturnsOnCall(i int, result1 error) { - fake.patchClusterObjectAnnotationsMutex.Lock() - defer fake.patchClusterObjectAnnotationsMutex.Unlock() - fake.PatchClusterObjectAnnotationsStub = nil - if fake.patchClusterObjectAnnotationsReturnsOnCall == nil { - fake.patchClusterObjectAnnotationsReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchClusterObjectAnnotationsReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterObjectWithOptionalMetadata(arg1 string, arg2 string, arg3 string, arg4 map[string]string) (string, error) { - fake.patchClusterObjectWithOptionalMetadataMutex.Lock() - ret, specificReturn := fake.patchClusterObjectWithOptionalMetadataReturnsOnCall[len(fake.patchClusterObjectWithOptionalMetadataArgsForCall)] - fake.patchClusterObjectWithOptionalMetadataArgsForCall = append(fake.patchClusterObjectWithOptionalMetadataArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 map[string]string - }{arg1, arg2, arg3, arg4}) - stub := fake.PatchClusterObjectWithOptionalMetadataStub - fakeReturns := fake.patchClusterObjectWithOptionalMetadataReturns - fake.recordInvocation("PatchClusterObjectWithOptionalMetadata", []interface{}{arg1, arg2, arg3, arg4}) - fake.patchClusterObjectWithOptionalMetadataMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) PatchClusterObjectWithOptionalMetadataCallCount() int { - fake.patchClusterObjectWithOptionalMetadataMutex.RLock() - defer fake.patchClusterObjectWithOptionalMetadataMutex.RUnlock() - return len(fake.patchClusterObjectWithOptionalMetadataArgsForCall) -} - -func (fake *ClusterClient) PatchClusterObjectWithOptionalMetadataCalls(stub func(string, string, string, map[string]string) (string, error)) { - fake.patchClusterObjectWithOptionalMetadataMutex.Lock() - defer fake.patchClusterObjectWithOptionalMetadataMutex.Unlock() - fake.PatchClusterObjectWithOptionalMetadataStub = stub -} - -func (fake *ClusterClient) PatchClusterObjectWithOptionalMetadataArgsForCall(i int) (string, string, string, map[string]string) { - fake.patchClusterObjectWithOptionalMetadataMutex.RLock() - defer fake.patchClusterObjectWithOptionalMetadataMutex.RUnlock() - argsForCall := fake.patchClusterObjectWithOptionalMetadataArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) PatchClusterObjectWithOptionalMetadataReturns(result1 string, result2 error) { - fake.patchClusterObjectWithOptionalMetadataMutex.Lock() - defer fake.patchClusterObjectWithOptionalMetadataMutex.Unlock() - fake.PatchClusterObjectWithOptionalMetadataStub = nil - fake.patchClusterObjectWithOptionalMetadataReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) PatchClusterObjectWithOptionalMetadataReturnsOnCall(i int, result1 string, result2 error) { - fake.patchClusterObjectWithOptionalMetadataMutex.Lock() - defer fake.patchClusterObjectWithOptionalMetadataMutex.Unlock() - fake.PatchClusterObjectWithOptionalMetadataStub = nil - if fake.patchClusterObjectWithOptionalMetadataReturnsOnCall == nil { - fake.patchClusterObjectWithOptionalMetadataReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.patchClusterObjectWithOptionalMetadataReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) PatchClusterObjectWithPollOptions(arg1 string, arg2 string, arg3 string, arg4 *clusterclient.PollOptions) error { - fake.patchClusterObjectWithPollOptionsMutex.Lock() - ret, specificReturn := fake.patchClusterObjectWithPollOptionsReturnsOnCall[len(fake.patchClusterObjectWithPollOptionsArgsForCall)] - fake.patchClusterObjectWithPollOptionsArgsForCall = append(fake.patchClusterObjectWithPollOptionsArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 *clusterclient.PollOptions - }{arg1, arg2, arg3, arg4}) - stub := fake.PatchClusterObjectWithPollOptionsStub - fakeReturns := fake.patchClusterObjectWithPollOptionsReturns - fake.recordInvocation("PatchClusterObjectWithPollOptions", []interface{}{arg1, arg2, arg3, arg4}) - fake.patchClusterObjectWithPollOptionsMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchClusterObjectWithPollOptionsCallCount() int { - fake.patchClusterObjectWithPollOptionsMutex.RLock() - defer fake.patchClusterObjectWithPollOptionsMutex.RUnlock() - return len(fake.patchClusterObjectWithPollOptionsArgsForCall) -} - -func (fake *ClusterClient) PatchClusterObjectWithPollOptionsCalls(stub func(string, string, string, *clusterclient.PollOptions) error) { - fake.patchClusterObjectWithPollOptionsMutex.Lock() - defer fake.patchClusterObjectWithPollOptionsMutex.Unlock() - fake.PatchClusterObjectWithPollOptionsStub = stub -} - -func (fake *ClusterClient) PatchClusterObjectWithPollOptionsArgsForCall(i int) (string, string, string, *clusterclient.PollOptions) { - fake.patchClusterObjectWithPollOptionsMutex.RLock() - defer fake.patchClusterObjectWithPollOptionsMutex.RUnlock() - argsForCall := fake.patchClusterObjectWithPollOptionsArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) PatchClusterObjectWithPollOptionsReturns(result1 error) { - fake.patchClusterObjectWithPollOptionsMutex.Lock() - defer fake.patchClusterObjectWithPollOptionsMutex.Unlock() - fake.PatchClusterObjectWithPollOptionsStub = nil - fake.patchClusterObjectWithPollOptionsReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterObjectWithPollOptionsReturnsOnCall(i int, result1 error) { - fake.patchClusterObjectWithPollOptionsMutex.Lock() - defer fake.patchClusterObjectWithPollOptionsMutex.Unlock() - fake.PatchClusterObjectWithPollOptionsStub = nil - if fake.patchClusterObjectWithPollOptionsReturnsOnCall == nil { - fake.patchClusterObjectWithPollOptionsReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchClusterObjectWithPollOptionsReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterObjectWithTKGVersion(arg1 string, arg2 string, arg3 string) error { - fake.patchClusterObjectWithTKGVersionMutex.Lock() - ret, specificReturn := fake.patchClusterObjectWithTKGVersionReturnsOnCall[len(fake.patchClusterObjectWithTKGVersionArgsForCall)] - fake.patchClusterObjectWithTKGVersionArgsForCall = append(fake.patchClusterObjectWithTKGVersionArgsForCall, struct { - arg1 string - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.PatchClusterObjectWithTKGVersionStub - fakeReturns := fake.patchClusterObjectWithTKGVersionReturns - fake.recordInvocation("PatchClusterObjectWithTKGVersion", []interface{}{arg1, arg2, arg3}) - fake.patchClusterObjectWithTKGVersionMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchClusterObjectWithTKGVersionCallCount() int { - fake.patchClusterObjectWithTKGVersionMutex.RLock() - defer fake.patchClusterObjectWithTKGVersionMutex.RUnlock() - return len(fake.patchClusterObjectWithTKGVersionArgsForCall) -} - -func (fake *ClusterClient) PatchClusterObjectWithTKGVersionCalls(stub func(string, string, string) error) { - fake.patchClusterObjectWithTKGVersionMutex.Lock() - defer fake.patchClusterObjectWithTKGVersionMutex.Unlock() - fake.PatchClusterObjectWithTKGVersionStub = stub -} - -func (fake *ClusterClient) PatchClusterObjectWithTKGVersionArgsForCall(i int) (string, string, string) { - fake.patchClusterObjectWithTKGVersionMutex.RLock() - defer fake.patchClusterObjectWithTKGVersionMutex.RUnlock() - argsForCall := fake.patchClusterObjectWithTKGVersionArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) PatchClusterObjectWithTKGVersionReturns(result1 error) { - fake.patchClusterObjectWithTKGVersionMutex.Lock() - defer fake.patchClusterObjectWithTKGVersionMutex.Unlock() - fake.PatchClusterObjectWithTKGVersionStub = nil - fake.patchClusterObjectWithTKGVersionReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterObjectWithTKGVersionReturnsOnCall(i int, result1 error) { - fake.patchClusterObjectWithTKGVersionMutex.Lock() - defer fake.patchClusterObjectWithTKGVersionMutex.Unlock() - fake.PatchClusterObjectWithTKGVersionStub = nil - if fake.patchClusterObjectWithTKGVersionReturnsOnCall == nil { - fake.patchClusterObjectWithTKGVersionReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchClusterObjectWithTKGVersionReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterWithOperationStartedStatus(arg1 string, arg2 string, arg3 string, arg4 time.Duration) error { - fake.patchClusterWithOperationStartedStatusMutex.Lock() - ret, specificReturn := fake.patchClusterWithOperationStartedStatusReturnsOnCall[len(fake.patchClusterWithOperationStartedStatusArgsForCall)] - fake.patchClusterWithOperationStartedStatusArgsForCall = append(fake.patchClusterWithOperationStartedStatusArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 time.Duration - }{arg1, arg2, arg3, arg4}) - stub := fake.PatchClusterWithOperationStartedStatusStub - fakeReturns := fake.patchClusterWithOperationStartedStatusReturns - fake.recordInvocation("PatchClusterWithOperationStartedStatus", []interface{}{arg1, arg2, arg3, arg4}) - fake.patchClusterWithOperationStartedStatusMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchClusterWithOperationStartedStatusCallCount() int { - fake.patchClusterWithOperationStartedStatusMutex.RLock() - defer fake.patchClusterWithOperationStartedStatusMutex.RUnlock() - return len(fake.patchClusterWithOperationStartedStatusArgsForCall) -} - -func (fake *ClusterClient) PatchClusterWithOperationStartedStatusCalls(stub func(string, string, string, time.Duration) error) { - fake.patchClusterWithOperationStartedStatusMutex.Lock() - defer fake.patchClusterWithOperationStartedStatusMutex.Unlock() - fake.PatchClusterWithOperationStartedStatusStub = stub -} - -func (fake *ClusterClient) PatchClusterWithOperationStartedStatusArgsForCall(i int) (string, string, string, time.Duration) { - fake.patchClusterWithOperationStartedStatusMutex.RLock() - defer fake.patchClusterWithOperationStartedStatusMutex.RUnlock() - argsForCall := fake.patchClusterWithOperationStartedStatusArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) PatchClusterWithOperationStartedStatusReturns(result1 error) { - fake.patchClusterWithOperationStartedStatusMutex.Lock() - defer fake.patchClusterWithOperationStartedStatusMutex.Unlock() - fake.PatchClusterWithOperationStartedStatusStub = nil - fake.patchClusterWithOperationStartedStatusReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchClusterWithOperationStartedStatusReturnsOnCall(i int, result1 error) { - fake.patchClusterWithOperationStartedStatusMutex.Lock() - defer fake.patchClusterWithOperationStartedStatusMutex.Unlock() - fake.PatchClusterWithOperationStartedStatusStub = nil - if fake.patchClusterWithOperationStartedStatusReturnsOnCall == nil { - fake.patchClusterWithOperationStartedStatusReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchClusterWithOperationStartedStatusReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchCoreDNSImageRepositoryInKubeadmConfigMap(arg1 string) error { - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.Lock() - ret, specificReturn := fake.patchCoreDNSImageRepositoryInKubeadmConfigMapReturnsOnCall[len(fake.patchCoreDNSImageRepositoryInKubeadmConfigMapArgsForCall)] - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapArgsForCall = append(fake.patchCoreDNSImageRepositoryInKubeadmConfigMapArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.PatchCoreDNSImageRepositoryInKubeadmConfigMapStub - fakeReturns := fake.patchCoreDNSImageRepositoryInKubeadmConfigMapReturns - fake.recordInvocation("PatchCoreDNSImageRepositoryInKubeadmConfigMap", []interface{}{arg1}) - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchCoreDNSImageRepositoryInKubeadmConfigMapCallCount() int { - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.RLock() - defer fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.RUnlock() - return len(fake.patchCoreDNSImageRepositoryInKubeadmConfigMapArgsForCall) -} - -func (fake *ClusterClient) PatchCoreDNSImageRepositoryInKubeadmConfigMapCalls(stub func(string) error) { - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.Lock() - defer fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.Unlock() - fake.PatchCoreDNSImageRepositoryInKubeadmConfigMapStub = stub -} - -func (fake *ClusterClient) PatchCoreDNSImageRepositoryInKubeadmConfigMapArgsForCall(i int) string { - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.RLock() - defer fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.RUnlock() - argsForCall := fake.patchCoreDNSImageRepositoryInKubeadmConfigMapArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) PatchCoreDNSImageRepositoryInKubeadmConfigMapReturns(result1 error) { - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.Lock() - defer fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.Unlock() - fake.PatchCoreDNSImageRepositoryInKubeadmConfigMapStub = nil - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchCoreDNSImageRepositoryInKubeadmConfigMapReturnsOnCall(i int, result1 error) { - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.Lock() - defer fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.Unlock() - fake.PatchCoreDNSImageRepositoryInKubeadmConfigMapStub = nil - if fake.patchCoreDNSImageRepositoryInKubeadmConfigMapReturnsOnCall == nil { - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchImageRepositoryInKubeProxyDaemonSet(arg1 string) error { - fake.patchImageRepositoryInKubeProxyDaemonSetMutex.Lock() - ret, specificReturn := fake.patchImageRepositoryInKubeProxyDaemonSetReturnsOnCall[len(fake.patchImageRepositoryInKubeProxyDaemonSetArgsForCall)] - fake.patchImageRepositoryInKubeProxyDaemonSetArgsForCall = append(fake.patchImageRepositoryInKubeProxyDaemonSetArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.PatchImageRepositoryInKubeProxyDaemonSetStub - fakeReturns := fake.patchImageRepositoryInKubeProxyDaemonSetReturns - fake.recordInvocation("PatchImageRepositoryInKubeProxyDaemonSet", []interface{}{arg1}) - fake.patchImageRepositoryInKubeProxyDaemonSetMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchImageRepositoryInKubeProxyDaemonSetCallCount() int { - fake.patchImageRepositoryInKubeProxyDaemonSetMutex.RLock() - defer fake.patchImageRepositoryInKubeProxyDaemonSetMutex.RUnlock() - return len(fake.patchImageRepositoryInKubeProxyDaemonSetArgsForCall) -} - -func (fake *ClusterClient) PatchImageRepositoryInKubeProxyDaemonSetCalls(stub func(string) error) { - fake.patchImageRepositoryInKubeProxyDaemonSetMutex.Lock() - defer fake.patchImageRepositoryInKubeProxyDaemonSetMutex.Unlock() - fake.PatchImageRepositoryInKubeProxyDaemonSetStub = stub -} - -func (fake *ClusterClient) PatchImageRepositoryInKubeProxyDaemonSetArgsForCall(i int) string { - fake.patchImageRepositoryInKubeProxyDaemonSetMutex.RLock() - defer fake.patchImageRepositoryInKubeProxyDaemonSetMutex.RUnlock() - argsForCall := fake.patchImageRepositoryInKubeProxyDaemonSetArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) PatchImageRepositoryInKubeProxyDaemonSetReturns(result1 error) { - fake.patchImageRepositoryInKubeProxyDaemonSetMutex.Lock() - defer fake.patchImageRepositoryInKubeProxyDaemonSetMutex.Unlock() - fake.PatchImageRepositoryInKubeProxyDaemonSetStub = nil - fake.patchImageRepositoryInKubeProxyDaemonSetReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchImageRepositoryInKubeProxyDaemonSetReturnsOnCall(i int, result1 error) { - fake.patchImageRepositoryInKubeProxyDaemonSetMutex.Lock() - defer fake.patchImageRepositoryInKubeProxyDaemonSetMutex.Unlock() - fake.PatchImageRepositoryInKubeProxyDaemonSetStub = nil - if fake.patchImageRepositoryInKubeProxyDaemonSetReturnsOnCall == nil { - fake.patchImageRepositoryInKubeProxyDaemonSetReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchImageRepositoryInKubeProxyDaemonSetReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchK8SVersionToPacificCluster(arg1 string, arg2 string, arg3 string) error { - fake.patchK8SVersionToPacificClusterMutex.Lock() - ret, specificReturn := fake.patchK8SVersionToPacificClusterReturnsOnCall[len(fake.patchK8SVersionToPacificClusterArgsForCall)] - fake.patchK8SVersionToPacificClusterArgsForCall = append(fake.patchK8SVersionToPacificClusterArgsForCall, struct { - arg1 string - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.PatchK8SVersionToPacificClusterStub - fakeReturns := fake.patchK8SVersionToPacificClusterReturns - fake.recordInvocation("PatchK8SVersionToPacificCluster", []interface{}{arg1, arg2, arg3}) - fake.patchK8SVersionToPacificClusterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchK8SVersionToPacificClusterCallCount() int { - fake.patchK8SVersionToPacificClusterMutex.RLock() - defer fake.patchK8SVersionToPacificClusterMutex.RUnlock() - return len(fake.patchK8SVersionToPacificClusterArgsForCall) -} - -func (fake *ClusterClient) PatchK8SVersionToPacificClusterCalls(stub func(string, string, string) error) { - fake.patchK8SVersionToPacificClusterMutex.Lock() - defer fake.patchK8SVersionToPacificClusterMutex.Unlock() - fake.PatchK8SVersionToPacificClusterStub = stub -} - -func (fake *ClusterClient) PatchK8SVersionToPacificClusterArgsForCall(i int) (string, string, string) { - fake.patchK8SVersionToPacificClusterMutex.RLock() - defer fake.patchK8SVersionToPacificClusterMutex.RUnlock() - argsForCall := fake.patchK8SVersionToPacificClusterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) PatchK8SVersionToPacificClusterReturns(result1 error) { - fake.patchK8SVersionToPacificClusterMutex.Lock() - defer fake.patchK8SVersionToPacificClusterMutex.Unlock() - fake.PatchK8SVersionToPacificClusterStub = nil - fake.patchK8SVersionToPacificClusterReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchK8SVersionToPacificClusterReturnsOnCall(i int, result1 error) { - fake.patchK8SVersionToPacificClusterMutex.Lock() - defer fake.patchK8SVersionToPacificClusterMutex.Unlock() - fake.PatchK8SVersionToPacificClusterStub = nil - if fake.patchK8SVersionToPacificClusterReturnsOnCall == nil { - fake.patchK8SVersionToPacificClusterReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchK8SVersionToPacificClusterReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchKappControllerLastAppliedAnnotation(arg1 string) error { - fake.patchKappControllerLastAppliedAnnotationMutex.Lock() - ret, specificReturn := fake.patchKappControllerLastAppliedAnnotationReturnsOnCall[len(fake.patchKappControllerLastAppliedAnnotationArgsForCall)] - fake.patchKappControllerLastAppliedAnnotationArgsForCall = append(fake.patchKappControllerLastAppliedAnnotationArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.PatchKappControllerLastAppliedAnnotationStub - fakeReturns := fake.patchKappControllerLastAppliedAnnotationReturns - fake.recordInvocation("PatchKappControllerLastAppliedAnnotation", []interface{}{arg1}) - fake.patchKappControllerLastAppliedAnnotationMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchKappControllerLastAppliedAnnotationCallCount() int { - fake.patchKappControllerLastAppliedAnnotationMutex.RLock() - defer fake.patchKappControllerLastAppliedAnnotationMutex.RUnlock() - return len(fake.patchKappControllerLastAppliedAnnotationArgsForCall) -} - -func (fake *ClusterClient) PatchKappControllerLastAppliedAnnotationCalls(stub func(string) error) { - fake.patchKappControllerLastAppliedAnnotationMutex.Lock() - defer fake.patchKappControllerLastAppliedAnnotationMutex.Unlock() - fake.PatchKappControllerLastAppliedAnnotationStub = stub -} - -func (fake *ClusterClient) PatchKappControllerLastAppliedAnnotationArgsForCall(i int) string { - fake.patchKappControllerLastAppliedAnnotationMutex.RLock() - defer fake.patchKappControllerLastAppliedAnnotationMutex.RUnlock() - argsForCall := fake.patchKappControllerLastAppliedAnnotationArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) PatchKappControllerLastAppliedAnnotationReturns(result1 error) { - fake.patchKappControllerLastAppliedAnnotationMutex.Lock() - defer fake.patchKappControllerLastAppliedAnnotationMutex.Unlock() - fake.PatchKappControllerLastAppliedAnnotationStub = nil - fake.patchKappControllerLastAppliedAnnotationReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchKappControllerLastAppliedAnnotationReturnsOnCall(i int, result1 error) { - fake.patchKappControllerLastAppliedAnnotationMutex.Lock() - defer fake.patchKappControllerLastAppliedAnnotationMutex.Unlock() - fake.PatchKappControllerLastAppliedAnnotationStub = nil - if fake.patchKappControllerLastAppliedAnnotationReturnsOnCall == nil { - fake.patchKappControllerLastAppliedAnnotationReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchKappControllerLastAppliedAnnotationReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchResource(arg1 interface{}, arg2 string, arg3 string, arg4 string, arg5 types.PatchType, arg6 *clusterclient.PollOptions) error { - fake.patchResourceMutex.Lock() - ret, specificReturn := fake.patchResourceReturnsOnCall[len(fake.patchResourceArgsForCall)] - fake.patchResourceArgsForCall = append(fake.patchResourceArgsForCall, struct { - arg1 interface{} - arg2 string - arg3 string - arg4 string - arg5 types.PatchType - arg6 *clusterclient.PollOptions - }{arg1, arg2, arg3, arg4, arg5, arg6}) - stub := fake.PatchResourceStub - fakeReturns := fake.patchResourceReturns - fake.recordInvocation("PatchResource", []interface{}{arg1, arg2, arg3, arg4, arg5, arg6}) - fake.patchResourceMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4, arg5, arg6) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) PatchResourceCallCount() int { - fake.patchResourceMutex.RLock() - defer fake.patchResourceMutex.RUnlock() - return len(fake.patchResourceArgsForCall) -} - -func (fake *ClusterClient) PatchResourceCalls(stub func(interface{}, string, string, string, types.PatchType, *clusterclient.PollOptions) error) { - fake.patchResourceMutex.Lock() - defer fake.patchResourceMutex.Unlock() - fake.PatchResourceStub = stub -} - -func (fake *ClusterClient) PatchResourceArgsForCall(i int) (interface{}, string, string, string, types.PatchType, *clusterclient.PollOptions) { - fake.patchResourceMutex.RLock() - defer fake.patchResourceMutex.RUnlock() - argsForCall := fake.patchResourceArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5, argsForCall.arg6 -} - -func (fake *ClusterClient) PatchResourceReturns(result1 error) { - fake.patchResourceMutex.Lock() - defer fake.patchResourceMutex.Unlock() - fake.PatchResourceStub = nil - fake.patchResourceReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) PatchResourceReturnsOnCall(i int, result1 error) { - fake.patchResourceMutex.Lock() - defer fake.patchResourceMutex.Unlock() - fake.PatchResourceStub = nil - if fake.patchResourceReturnsOnCall == nil { - fake.patchResourceReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchResourceReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) RemoveCEIPTelemetryJob(arg1 string) error { - fake.removeCEIPTelemetryJobMutex.Lock() - ret, specificReturn := fake.removeCEIPTelemetryJobReturnsOnCall[len(fake.removeCEIPTelemetryJobArgsForCall)] - fake.removeCEIPTelemetryJobArgsForCall = append(fake.removeCEIPTelemetryJobArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.RemoveCEIPTelemetryJobStub - fakeReturns := fake.removeCEIPTelemetryJobReturns - fake.recordInvocation("RemoveCEIPTelemetryJob", []interface{}{arg1}) - fake.removeCEIPTelemetryJobMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) RemoveCEIPTelemetryJobCallCount() int { - fake.removeCEIPTelemetryJobMutex.RLock() - defer fake.removeCEIPTelemetryJobMutex.RUnlock() - return len(fake.removeCEIPTelemetryJobArgsForCall) -} - -func (fake *ClusterClient) RemoveCEIPTelemetryJobCalls(stub func(string) error) { - fake.removeCEIPTelemetryJobMutex.Lock() - defer fake.removeCEIPTelemetryJobMutex.Unlock() - fake.RemoveCEIPTelemetryJobStub = stub -} - -func (fake *ClusterClient) RemoveCEIPTelemetryJobArgsForCall(i int) string { - fake.removeCEIPTelemetryJobMutex.RLock() - defer fake.removeCEIPTelemetryJobMutex.RUnlock() - argsForCall := fake.removeCEIPTelemetryJobArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) RemoveCEIPTelemetryJobReturns(result1 error) { - fake.removeCEIPTelemetryJobMutex.Lock() - defer fake.removeCEIPTelemetryJobMutex.Unlock() - fake.RemoveCEIPTelemetryJobStub = nil - fake.removeCEIPTelemetryJobReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) RemoveCEIPTelemetryJobReturnsOnCall(i int, result1 error) { - fake.removeCEIPTelemetryJobMutex.Lock() - defer fake.removeCEIPTelemetryJobMutex.Unlock() - fake.RemoveCEIPTelemetryJobStub = nil - if fake.removeCEIPTelemetryJobReturnsOnCall == nil { - fake.removeCEIPTelemetryJobReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.removeCEIPTelemetryJobReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) RemoveMatchingMetadataFromResources(arg1 schema.GroupVersionKind, arg2 string, arg3 string, arg4 []string) error { - var arg4Copy []string - if arg4 != nil { - arg4Copy = make([]string, len(arg4)) - copy(arg4Copy, arg4) - } - fake.removeMatchingMetadataFromResourcesMutex.Lock() - ret, specificReturn := fake.removeMatchingMetadataFromResourcesReturnsOnCall[len(fake.removeMatchingMetadataFromResourcesArgsForCall)] - fake.removeMatchingMetadataFromResourcesArgsForCall = append(fake.removeMatchingMetadataFromResourcesArgsForCall, struct { - arg1 schema.GroupVersionKind - arg2 string - arg3 string - arg4 []string - }{arg1, arg2, arg3, arg4Copy}) - stub := fake.RemoveMatchingMetadataFromResourcesStub - fakeReturns := fake.removeMatchingMetadataFromResourcesReturns - fake.recordInvocation("RemoveMatchingMetadataFromResources", []interface{}{arg1, arg2, arg3, arg4Copy}) - fake.removeMatchingMetadataFromResourcesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) RemoveMatchingMetadataFromResourcesCallCount() int { - fake.removeMatchingMetadataFromResourcesMutex.RLock() - defer fake.removeMatchingMetadataFromResourcesMutex.RUnlock() - return len(fake.removeMatchingMetadataFromResourcesArgsForCall) -} - -func (fake *ClusterClient) RemoveMatchingMetadataFromResourcesCalls(stub func(schema.GroupVersionKind, string, string, []string) error) { - fake.removeMatchingMetadataFromResourcesMutex.Lock() - defer fake.removeMatchingMetadataFromResourcesMutex.Unlock() - fake.RemoveMatchingMetadataFromResourcesStub = stub -} - -func (fake *ClusterClient) RemoveMatchingMetadataFromResourcesArgsForCall(i int) (schema.GroupVersionKind, string, string, []string) { - fake.removeMatchingMetadataFromResourcesMutex.RLock() - defer fake.removeMatchingMetadataFromResourcesMutex.RUnlock() - argsForCall := fake.removeMatchingMetadataFromResourcesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) RemoveMatchingMetadataFromResourcesReturns(result1 error) { - fake.removeMatchingMetadataFromResourcesMutex.Lock() - defer fake.removeMatchingMetadataFromResourcesMutex.Unlock() - fake.RemoveMatchingMetadataFromResourcesStub = nil - fake.removeMatchingMetadataFromResourcesReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) RemoveMatchingMetadataFromResourcesReturnsOnCall(i int, result1 error) { - fake.removeMatchingMetadataFromResourcesMutex.Lock() - defer fake.removeMatchingMetadataFromResourcesMutex.Unlock() - fake.RemoveMatchingMetadataFromResourcesStub = nil - if fake.removeMatchingMetadataFromResourcesReturnsOnCall == nil { - fake.removeMatchingMetadataFromResourcesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.removeMatchingMetadataFromResourcesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ScalePacificClusterControlPlane(arg1 string, arg2 string, arg3 int32) error { - fake.scalePacificClusterControlPlaneMutex.Lock() - ret, specificReturn := fake.scalePacificClusterControlPlaneReturnsOnCall[len(fake.scalePacificClusterControlPlaneArgsForCall)] - fake.scalePacificClusterControlPlaneArgsForCall = append(fake.scalePacificClusterControlPlaneArgsForCall, struct { - arg1 string - arg2 string - arg3 int32 - }{arg1, arg2, arg3}) - stub := fake.ScalePacificClusterControlPlaneStub - fakeReturns := fake.scalePacificClusterControlPlaneReturns - fake.recordInvocation("ScalePacificClusterControlPlane", []interface{}{arg1, arg2, arg3}) - fake.scalePacificClusterControlPlaneMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) ScalePacificClusterControlPlaneCallCount() int { - fake.scalePacificClusterControlPlaneMutex.RLock() - defer fake.scalePacificClusterControlPlaneMutex.RUnlock() - return len(fake.scalePacificClusterControlPlaneArgsForCall) -} - -func (fake *ClusterClient) ScalePacificClusterControlPlaneCalls(stub func(string, string, int32) error) { - fake.scalePacificClusterControlPlaneMutex.Lock() - defer fake.scalePacificClusterControlPlaneMutex.Unlock() - fake.ScalePacificClusterControlPlaneStub = stub -} - -func (fake *ClusterClient) ScalePacificClusterControlPlaneArgsForCall(i int) (string, string, int32) { - fake.scalePacificClusterControlPlaneMutex.RLock() - defer fake.scalePacificClusterControlPlaneMutex.RUnlock() - argsForCall := fake.scalePacificClusterControlPlaneArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) ScalePacificClusterControlPlaneReturns(result1 error) { - fake.scalePacificClusterControlPlaneMutex.Lock() - defer fake.scalePacificClusterControlPlaneMutex.Unlock() - fake.ScalePacificClusterControlPlaneStub = nil - fake.scalePacificClusterControlPlaneReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ScalePacificClusterControlPlaneReturnsOnCall(i int, result1 error) { - fake.scalePacificClusterControlPlaneMutex.Lock() - defer fake.scalePacificClusterControlPlaneMutex.Unlock() - fake.ScalePacificClusterControlPlaneStub = nil - if fake.scalePacificClusterControlPlaneReturnsOnCall == nil { - fake.scalePacificClusterControlPlaneReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.scalePacificClusterControlPlaneReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ScalePacificClusterWorkerNodes(arg1 string, arg2 string, arg3 int32) error { - fake.scalePacificClusterWorkerNodesMutex.Lock() - ret, specificReturn := fake.scalePacificClusterWorkerNodesReturnsOnCall[len(fake.scalePacificClusterWorkerNodesArgsForCall)] - fake.scalePacificClusterWorkerNodesArgsForCall = append(fake.scalePacificClusterWorkerNodesArgsForCall, struct { - arg1 string - arg2 string - arg3 int32 - }{arg1, arg2, arg3}) - stub := fake.ScalePacificClusterWorkerNodesStub - fakeReturns := fake.scalePacificClusterWorkerNodesReturns - fake.recordInvocation("ScalePacificClusterWorkerNodes", []interface{}{arg1, arg2, arg3}) - fake.scalePacificClusterWorkerNodesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) ScalePacificClusterWorkerNodesCallCount() int { - fake.scalePacificClusterWorkerNodesMutex.RLock() - defer fake.scalePacificClusterWorkerNodesMutex.RUnlock() - return len(fake.scalePacificClusterWorkerNodesArgsForCall) -} - -func (fake *ClusterClient) ScalePacificClusterWorkerNodesCalls(stub func(string, string, int32) error) { - fake.scalePacificClusterWorkerNodesMutex.Lock() - defer fake.scalePacificClusterWorkerNodesMutex.Unlock() - fake.ScalePacificClusterWorkerNodesStub = stub -} - -func (fake *ClusterClient) ScalePacificClusterWorkerNodesArgsForCall(i int) (string, string, int32) { - fake.scalePacificClusterWorkerNodesMutex.RLock() - defer fake.scalePacificClusterWorkerNodesMutex.RUnlock() - argsForCall := fake.scalePacificClusterWorkerNodesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) ScalePacificClusterWorkerNodesReturns(result1 error) { - fake.scalePacificClusterWorkerNodesMutex.Lock() - defer fake.scalePacificClusterWorkerNodesMutex.Unlock() - fake.ScalePacificClusterWorkerNodesStub = nil - fake.scalePacificClusterWorkerNodesReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) ScalePacificClusterWorkerNodesReturnsOnCall(i int, result1 error) { - fake.scalePacificClusterWorkerNodesMutex.Lock() - defer fake.scalePacificClusterWorkerNodesMutex.Unlock() - fake.ScalePacificClusterWorkerNodesStub = nil - if fake.scalePacificClusterWorkerNodesReturnsOnCall == nil { - fake.scalePacificClusterWorkerNodesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.scalePacificClusterWorkerNodesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateAWSCNIIngressRules(arg1 string, arg2 string, arg3 v1beta2.CNIIngressRule) error { - fake.updateAWSCNIIngressRulesMutex.Lock() - ret, specificReturn := fake.updateAWSCNIIngressRulesReturnsOnCall[len(fake.updateAWSCNIIngressRulesArgsForCall)] - fake.updateAWSCNIIngressRulesArgsForCall = append(fake.updateAWSCNIIngressRulesArgsForCall, struct { - arg1 string - arg2 string - arg3 v1beta2.CNIIngressRule - }{arg1, arg2, arg3}) - stub := fake.UpdateAWSCNIIngressRulesStub - fakeReturns := fake.updateAWSCNIIngressRulesReturns - fake.recordInvocation("UpdateAWSCNIIngressRules", []interface{}{arg1, arg2, arg3}) - fake.updateAWSCNIIngressRulesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateAWSCNIIngressRulesCallCount() int { - fake.updateAWSCNIIngressRulesMutex.RLock() - defer fake.updateAWSCNIIngressRulesMutex.RUnlock() - return len(fake.updateAWSCNIIngressRulesArgsForCall) -} - -func (fake *ClusterClient) UpdateAWSCNIIngressRulesCalls(stub func(string, string, v1beta2.CNIIngressRule) error) { - fake.updateAWSCNIIngressRulesMutex.Lock() - defer fake.updateAWSCNIIngressRulesMutex.Unlock() - fake.UpdateAWSCNIIngressRulesStub = stub -} - -func (fake *ClusterClient) UpdateAWSCNIIngressRulesArgsForCall(i int) (string, string, v1beta2.CNIIngressRule) { - fake.updateAWSCNIIngressRulesMutex.RLock() - defer fake.updateAWSCNIIngressRulesMutex.RUnlock() - argsForCall := fake.updateAWSCNIIngressRulesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) UpdateAWSCNIIngressRulesReturns(result1 error) { - fake.updateAWSCNIIngressRulesMutex.Lock() - defer fake.updateAWSCNIIngressRulesMutex.Unlock() - fake.UpdateAWSCNIIngressRulesStub = nil - fake.updateAWSCNIIngressRulesReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateAWSCNIIngressRulesReturnsOnCall(i int, result1 error) { - fake.updateAWSCNIIngressRulesMutex.Lock() - defer fake.updateAWSCNIIngressRulesMutex.Unlock() - fake.UpdateAWSCNIIngressRulesStub = nil - if fake.updateAWSCNIIngressRulesReturnsOnCall == nil { - fake.updateAWSCNIIngressRulesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateAWSCNIIngressRulesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateAzureClusterIdentity(arg1 string, arg2 string, arg3 string, arg4 string, arg5 string) error { - fake.updateAzureClusterIdentityMutex.Lock() - ret, specificReturn := fake.updateAzureClusterIdentityReturnsOnCall[len(fake.updateAzureClusterIdentityArgsForCall)] - fake.updateAzureClusterIdentityArgsForCall = append(fake.updateAzureClusterIdentityArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 string - arg5 string - }{arg1, arg2, arg3, arg4, arg5}) - stub := fake.UpdateAzureClusterIdentityStub - fakeReturns := fake.updateAzureClusterIdentityReturns - fake.recordInvocation("UpdateAzureClusterIdentity", []interface{}{arg1, arg2, arg3, arg4, arg5}) - fake.updateAzureClusterIdentityMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4, arg5) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateAzureClusterIdentityCallCount() int { - fake.updateAzureClusterIdentityMutex.RLock() - defer fake.updateAzureClusterIdentityMutex.RUnlock() - return len(fake.updateAzureClusterIdentityArgsForCall) -} - -func (fake *ClusterClient) UpdateAzureClusterIdentityCalls(stub func(string, string, string, string, string) error) { - fake.updateAzureClusterIdentityMutex.Lock() - defer fake.updateAzureClusterIdentityMutex.Unlock() - fake.UpdateAzureClusterIdentityStub = stub -} - -func (fake *ClusterClient) UpdateAzureClusterIdentityArgsForCall(i int) (string, string, string, string, string) { - fake.updateAzureClusterIdentityMutex.RLock() - defer fake.updateAzureClusterIdentityMutex.RUnlock() - argsForCall := fake.updateAzureClusterIdentityArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 -} - -func (fake *ClusterClient) UpdateAzureClusterIdentityReturns(result1 error) { - fake.updateAzureClusterIdentityMutex.Lock() - defer fake.updateAzureClusterIdentityMutex.Unlock() - fake.UpdateAzureClusterIdentityStub = nil - fake.updateAzureClusterIdentityReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateAzureClusterIdentityReturnsOnCall(i int, result1 error) { - fake.updateAzureClusterIdentityMutex.Lock() - defer fake.updateAzureClusterIdentityMutex.Unlock() - fake.UpdateAzureClusterIdentityStub = nil - if fake.updateAzureClusterIdentityReturnsOnCall == nil { - fake.updateAzureClusterIdentityReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateAzureClusterIdentityReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateAzureKCP(arg1 string, arg2 string) error { - fake.updateAzureKCPMutex.Lock() - ret, specificReturn := fake.updateAzureKCPReturnsOnCall[len(fake.updateAzureKCPArgsForCall)] - fake.updateAzureKCPArgsForCall = append(fake.updateAzureKCPArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.UpdateAzureKCPStub - fakeReturns := fake.updateAzureKCPReturns - fake.recordInvocation("UpdateAzureKCP", []interface{}{arg1, arg2}) - fake.updateAzureKCPMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateAzureKCPCallCount() int { - fake.updateAzureKCPMutex.RLock() - defer fake.updateAzureKCPMutex.RUnlock() - return len(fake.updateAzureKCPArgsForCall) -} - -func (fake *ClusterClient) UpdateAzureKCPCalls(stub func(string, string) error) { - fake.updateAzureKCPMutex.Lock() - defer fake.updateAzureKCPMutex.Unlock() - fake.UpdateAzureKCPStub = stub -} - -func (fake *ClusterClient) UpdateAzureKCPArgsForCall(i int) (string, string) { - fake.updateAzureKCPMutex.RLock() - defer fake.updateAzureKCPMutex.RUnlock() - argsForCall := fake.updateAzureKCPArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) UpdateAzureKCPReturns(result1 error) { - fake.updateAzureKCPMutex.Lock() - defer fake.updateAzureKCPMutex.Unlock() - fake.UpdateAzureKCPStub = nil - fake.updateAzureKCPReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateAzureKCPReturnsOnCall(i int, result1 error) { - fake.updateAzureKCPMutex.Lock() - defer fake.updateAzureKCPMutex.Unlock() - fake.UpdateAzureKCPStub = nil - if fake.updateAzureKCPReturnsOnCall == nil { - fake.updateAzureKCPReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateAzureKCPReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateCAPZControllerManagerDeploymentReplicas(arg1 int32) error { - fake.updateCAPZControllerManagerDeploymentReplicasMutex.Lock() - ret, specificReturn := fake.updateCAPZControllerManagerDeploymentReplicasReturnsOnCall[len(fake.updateCAPZControllerManagerDeploymentReplicasArgsForCall)] - fake.updateCAPZControllerManagerDeploymentReplicasArgsForCall = append(fake.updateCAPZControllerManagerDeploymentReplicasArgsForCall, struct { - arg1 int32 - }{arg1}) - stub := fake.UpdateCAPZControllerManagerDeploymentReplicasStub - fakeReturns := fake.updateCAPZControllerManagerDeploymentReplicasReturns - fake.recordInvocation("UpdateCAPZControllerManagerDeploymentReplicas", []interface{}{arg1}) - fake.updateCAPZControllerManagerDeploymentReplicasMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateCAPZControllerManagerDeploymentReplicasCallCount() int { - fake.updateCAPZControllerManagerDeploymentReplicasMutex.RLock() - defer fake.updateCAPZControllerManagerDeploymentReplicasMutex.RUnlock() - return len(fake.updateCAPZControllerManagerDeploymentReplicasArgsForCall) -} - -func (fake *ClusterClient) UpdateCAPZControllerManagerDeploymentReplicasCalls(stub func(int32) error) { - fake.updateCAPZControllerManagerDeploymentReplicasMutex.Lock() - defer fake.updateCAPZControllerManagerDeploymentReplicasMutex.Unlock() - fake.UpdateCAPZControllerManagerDeploymentReplicasStub = stub -} - -func (fake *ClusterClient) UpdateCAPZControllerManagerDeploymentReplicasArgsForCall(i int) int32 { - fake.updateCAPZControllerManagerDeploymentReplicasMutex.RLock() - defer fake.updateCAPZControllerManagerDeploymentReplicasMutex.RUnlock() - argsForCall := fake.updateCAPZControllerManagerDeploymentReplicasArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) UpdateCAPZControllerManagerDeploymentReplicasReturns(result1 error) { - fake.updateCAPZControllerManagerDeploymentReplicasMutex.Lock() - defer fake.updateCAPZControllerManagerDeploymentReplicasMutex.Unlock() - fake.UpdateCAPZControllerManagerDeploymentReplicasStub = nil - fake.updateCAPZControllerManagerDeploymentReplicasReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateCAPZControllerManagerDeploymentReplicasReturnsOnCall(i int, result1 error) { - fake.updateCAPZControllerManagerDeploymentReplicasMutex.Lock() - defer fake.updateCAPZControllerManagerDeploymentReplicasMutex.Unlock() - fake.UpdateCAPZControllerManagerDeploymentReplicasStub = nil - if fake.updateCAPZControllerManagerDeploymentReplicasReturnsOnCall == nil { - fake.updateCAPZControllerManagerDeploymentReplicasReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateCAPZControllerManagerDeploymentReplicasReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateCapvManagerBootstrapCredentialsSecret(arg1 string, arg2 string) error { - fake.updateCapvManagerBootstrapCredentialsSecretMutex.Lock() - ret, specificReturn := fake.updateCapvManagerBootstrapCredentialsSecretReturnsOnCall[len(fake.updateCapvManagerBootstrapCredentialsSecretArgsForCall)] - fake.updateCapvManagerBootstrapCredentialsSecretArgsForCall = append(fake.updateCapvManagerBootstrapCredentialsSecretArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.UpdateCapvManagerBootstrapCredentialsSecretStub - fakeReturns := fake.updateCapvManagerBootstrapCredentialsSecretReturns - fake.recordInvocation("UpdateCapvManagerBootstrapCredentialsSecret", []interface{}{arg1, arg2}) - fake.updateCapvManagerBootstrapCredentialsSecretMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateCapvManagerBootstrapCredentialsSecretCallCount() int { - fake.updateCapvManagerBootstrapCredentialsSecretMutex.RLock() - defer fake.updateCapvManagerBootstrapCredentialsSecretMutex.RUnlock() - return len(fake.updateCapvManagerBootstrapCredentialsSecretArgsForCall) -} - -func (fake *ClusterClient) UpdateCapvManagerBootstrapCredentialsSecretCalls(stub func(string, string) error) { - fake.updateCapvManagerBootstrapCredentialsSecretMutex.Lock() - defer fake.updateCapvManagerBootstrapCredentialsSecretMutex.Unlock() - fake.UpdateCapvManagerBootstrapCredentialsSecretStub = stub -} - -func (fake *ClusterClient) UpdateCapvManagerBootstrapCredentialsSecretArgsForCall(i int) (string, string) { - fake.updateCapvManagerBootstrapCredentialsSecretMutex.RLock() - defer fake.updateCapvManagerBootstrapCredentialsSecretMutex.RUnlock() - argsForCall := fake.updateCapvManagerBootstrapCredentialsSecretArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) UpdateCapvManagerBootstrapCredentialsSecretReturns(result1 error) { - fake.updateCapvManagerBootstrapCredentialsSecretMutex.Lock() - defer fake.updateCapvManagerBootstrapCredentialsSecretMutex.Unlock() - fake.UpdateCapvManagerBootstrapCredentialsSecretStub = nil - fake.updateCapvManagerBootstrapCredentialsSecretReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateCapvManagerBootstrapCredentialsSecretReturnsOnCall(i int, result1 error) { - fake.updateCapvManagerBootstrapCredentialsSecretMutex.Lock() - defer fake.updateCapvManagerBootstrapCredentialsSecretMutex.Unlock() - fake.UpdateCapvManagerBootstrapCredentialsSecretStub = nil - if fake.updateCapvManagerBootstrapCredentialsSecretReturnsOnCall == nil { - fake.updateCapvManagerBootstrapCredentialsSecretReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateCapvManagerBootstrapCredentialsSecretReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateCapzManagerBootstrapCredentialsSecret(arg1 string, arg2 string, arg3 string) error { - fake.updateCapzManagerBootstrapCredentialsSecretMutex.Lock() - ret, specificReturn := fake.updateCapzManagerBootstrapCredentialsSecretReturnsOnCall[len(fake.updateCapzManagerBootstrapCredentialsSecretArgsForCall)] - fake.updateCapzManagerBootstrapCredentialsSecretArgsForCall = append(fake.updateCapzManagerBootstrapCredentialsSecretArgsForCall, struct { - arg1 string - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.UpdateCapzManagerBootstrapCredentialsSecretStub - fakeReturns := fake.updateCapzManagerBootstrapCredentialsSecretReturns - fake.recordInvocation("UpdateCapzManagerBootstrapCredentialsSecret", []interface{}{arg1, arg2, arg3}) - fake.updateCapzManagerBootstrapCredentialsSecretMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateCapzManagerBootstrapCredentialsSecretCallCount() int { - fake.updateCapzManagerBootstrapCredentialsSecretMutex.RLock() - defer fake.updateCapzManagerBootstrapCredentialsSecretMutex.RUnlock() - return len(fake.updateCapzManagerBootstrapCredentialsSecretArgsForCall) -} - -func (fake *ClusterClient) UpdateCapzManagerBootstrapCredentialsSecretCalls(stub func(string, string, string) error) { - fake.updateCapzManagerBootstrapCredentialsSecretMutex.Lock() - defer fake.updateCapzManagerBootstrapCredentialsSecretMutex.Unlock() - fake.UpdateCapzManagerBootstrapCredentialsSecretStub = stub -} - -func (fake *ClusterClient) UpdateCapzManagerBootstrapCredentialsSecretArgsForCall(i int) (string, string, string) { - fake.updateCapzManagerBootstrapCredentialsSecretMutex.RLock() - defer fake.updateCapzManagerBootstrapCredentialsSecretMutex.RUnlock() - argsForCall := fake.updateCapzManagerBootstrapCredentialsSecretArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) UpdateCapzManagerBootstrapCredentialsSecretReturns(result1 error) { - fake.updateCapzManagerBootstrapCredentialsSecretMutex.Lock() - defer fake.updateCapzManagerBootstrapCredentialsSecretMutex.Unlock() - fake.UpdateCapzManagerBootstrapCredentialsSecretStub = nil - fake.updateCapzManagerBootstrapCredentialsSecretReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateCapzManagerBootstrapCredentialsSecretReturnsOnCall(i int, result1 error) { - fake.updateCapzManagerBootstrapCredentialsSecretMutex.Lock() - defer fake.updateCapzManagerBootstrapCredentialsSecretMutex.Unlock() - fake.UpdateCapzManagerBootstrapCredentialsSecretStub = nil - if fake.updateCapzManagerBootstrapCredentialsSecretReturnsOnCall == nil { - fake.updateCapzManagerBootstrapCredentialsSecretReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateCapzManagerBootstrapCredentialsSecretReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateReplicas(arg1 interface{}, arg2 string, arg3 string, arg4 int32) error { - fake.updateReplicasMutex.Lock() - ret, specificReturn := fake.updateReplicasReturnsOnCall[len(fake.updateReplicasArgsForCall)] - fake.updateReplicasArgsForCall = append(fake.updateReplicasArgsForCall, struct { - arg1 interface{} - arg2 string - arg3 string - arg4 int32 - }{arg1, arg2, arg3, arg4}) - stub := fake.UpdateReplicasStub - fakeReturns := fake.updateReplicasReturns - fake.recordInvocation("UpdateReplicas", []interface{}{arg1, arg2, arg3, arg4}) - fake.updateReplicasMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateReplicasCallCount() int { - fake.updateReplicasMutex.RLock() - defer fake.updateReplicasMutex.RUnlock() - return len(fake.updateReplicasArgsForCall) -} - -func (fake *ClusterClient) UpdateReplicasCalls(stub func(interface{}, string, string, int32) error) { - fake.updateReplicasMutex.Lock() - defer fake.updateReplicasMutex.Unlock() - fake.UpdateReplicasStub = stub -} - -func (fake *ClusterClient) UpdateReplicasArgsForCall(i int) (interface{}, string, string, int32) { - fake.updateReplicasMutex.RLock() - defer fake.updateReplicasMutex.RUnlock() - argsForCall := fake.updateReplicasArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) UpdateReplicasReturns(result1 error) { - fake.updateReplicasMutex.Lock() - defer fake.updateReplicasMutex.Unlock() - fake.UpdateReplicasStub = nil - fake.updateReplicasReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateReplicasReturnsOnCall(i int, result1 error) { - fake.updateReplicasMutex.Lock() - defer fake.updateReplicasMutex.Unlock() - fake.UpdateReplicasStub = nil - if fake.updateReplicasReturnsOnCall == nil { - fake.updateReplicasReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateReplicasReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateResource(arg1 interface{}, arg2 string, arg3 string, arg4 ...client.UpdateOption) error { - fake.updateResourceMutex.Lock() - ret, specificReturn := fake.updateResourceReturnsOnCall[len(fake.updateResourceArgsForCall)] - fake.updateResourceArgsForCall = append(fake.updateResourceArgsForCall, struct { - arg1 interface{} - arg2 string - arg3 string - arg4 []client.UpdateOption - }{arg1, arg2, arg3, arg4}) - stub := fake.UpdateResourceStub - fakeReturns := fake.updateResourceReturns - fake.recordInvocation("UpdateResource", []interface{}{arg1, arg2, arg3, arg4}) - fake.updateResourceMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateResourceCallCount() int { - fake.updateResourceMutex.RLock() - defer fake.updateResourceMutex.RUnlock() - return len(fake.updateResourceArgsForCall) -} - -func (fake *ClusterClient) UpdateResourceCalls(stub func(interface{}, string, string, ...client.UpdateOption) error) { - fake.updateResourceMutex.Lock() - defer fake.updateResourceMutex.Unlock() - fake.UpdateResourceStub = stub -} - -func (fake *ClusterClient) UpdateResourceArgsForCall(i int) (interface{}, string, string, []client.UpdateOption) { - fake.updateResourceMutex.RLock() - defer fake.updateResourceMutex.RUnlock() - argsForCall := fake.updateResourceArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) UpdateResourceReturns(result1 error) { - fake.updateResourceMutex.Lock() - defer fake.updateResourceMutex.Unlock() - fake.UpdateResourceStub = nil - fake.updateResourceReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateResourceReturnsOnCall(i int, result1 error) { - fake.updateResourceMutex.Lock() - defer fake.updateResourceMutex.Unlock() - fake.UpdateResourceStub = nil - if fake.updateResourceReturnsOnCall == nil { - fake.updateResourceReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateResourceReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateResourceWithPolling(arg1 interface{}, arg2 string, arg3 string, arg4 *clusterclient.PollOptions, arg5 ...client.UpdateOption) error { - fake.updateResourceWithPollingMutex.Lock() - ret, specificReturn := fake.updateResourceWithPollingReturnsOnCall[len(fake.updateResourceWithPollingArgsForCall)] - fake.updateResourceWithPollingArgsForCall = append(fake.updateResourceWithPollingArgsForCall, struct { - arg1 interface{} - arg2 string - arg3 string - arg4 *clusterclient.PollOptions - arg5 []client.UpdateOption - }{arg1, arg2, arg3, arg4, arg5}) - stub := fake.UpdateResourceWithPollingStub - fakeReturns := fake.updateResourceWithPollingReturns - fake.recordInvocation("UpdateResourceWithPolling", []interface{}{arg1, arg2, arg3, arg4, arg5}) - fake.updateResourceWithPollingMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4, arg5...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateResourceWithPollingCallCount() int { - fake.updateResourceWithPollingMutex.RLock() - defer fake.updateResourceWithPollingMutex.RUnlock() - return len(fake.updateResourceWithPollingArgsForCall) -} - -func (fake *ClusterClient) UpdateResourceWithPollingCalls(stub func(interface{}, string, string, *clusterclient.PollOptions, ...client.UpdateOption) error) { - fake.updateResourceWithPollingMutex.Lock() - defer fake.updateResourceWithPollingMutex.Unlock() - fake.UpdateResourceWithPollingStub = stub -} - -func (fake *ClusterClient) UpdateResourceWithPollingArgsForCall(i int) (interface{}, string, string, *clusterclient.PollOptions, []client.UpdateOption) { - fake.updateResourceWithPollingMutex.RLock() - defer fake.updateResourceWithPollingMutex.RUnlock() - argsForCall := fake.updateResourceWithPollingArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 -} - -func (fake *ClusterClient) UpdateResourceWithPollingReturns(result1 error) { - fake.updateResourceWithPollingMutex.Lock() - defer fake.updateResourceWithPollingMutex.Unlock() - fake.UpdateResourceWithPollingStub = nil - fake.updateResourceWithPollingReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateResourceWithPollingReturnsOnCall(i int, result1 error) { - fake.updateResourceWithPollingMutex.Lock() - defer fake.updateResourceWithPollingMutex.Unlock() - fake.UpdateResourceWithPollingStub = nil - if fake.updateResourceWithPollingReturnsOnCall == nil { - fake.updateResourceWithPollingReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateResourceWithPollingReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateVsphereCloudProviderCredentialsSecret(arg1 string, arg2 string, arg3 string, arg4 string) error { - fake.updateVsphereCloudProviderCredentialsSecretMutex.Lock() - ret, specificReturn := fake.updateVsphereCloudProviderCredentialsSecretReturnsOnCall[len(fake.updateVsphereCloudProviderCredentialsSecretArgsForCall)] - fake.updateVsphereCloudProviderCredentialsSecretArgsForCall = append(fake.updateVsphereCloudProviderCredentialsSecretArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 string - }{arg1, arg2, arg3, arg4}) - stub := fake.UpdateVsphereCloudProviderCredentialsSecretStub - fakeReturns := fake.updateVsphereCloudProviderCredentialsSecretReturns - fake.recordInvocation("UpdateVsphereCloudProviderCredentialsSecret", []interface{}{arg1, arg2, arg3, arg4}) - fake.updateVsphereCloudProviderCredentialsSecretMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateVsphereCloudProviderCredentialsSecretCallCount() int { - fake.updateVsphereCloudProviderCredentialsSecretMutex.RLock() - defer fake.updateVsphereCloudProviderCredentialsSecretMutex.RUnlock() - return len(fake.updateVsphereCloudProviderCredentialsSecretArgsForCall) -} - -func (fake *ClusterClient) UpdateVsphereCloudProviderCredentialsSecretCalls(stub func(string, string, string, string) error) { - fake.updateVsphereCloudProviderCredentialsSecretMutex.Lock() - defer fake.updateVsphereCloudProviderCredentialsSecretMutex.Unlock() - fake.UpdateVsphereCloudProviderCredentialsSecretStub = stub -} - -func (fake *ClusterClient) UpdateVsphereCloudProviderCredentialsSecretArgsForCall(i int) (string, string, string, string) { - fake.updateVsphereCloudProviderCredentialsSecretMutex.RLock() - defer fake.updateVsphereCloudProviderCredentialsSecretMutex.RUnlock() - argsForCall := fake.updateVsphereCloudProviderCredentialsSecretArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) UpdateVsphereCloudProviderCredentialsSecretReturns(result1 error) { - fake.updateVsphereCloudProviderCredentialsSecretMutex.Lock() - defer fake.updateVsphereCloudProviderCredentialsSecretMutex.Unlock() - fake.UpdateVsphereCloudProviderCredentialsSecretStub = nil - fake.updateVsphereCloudProviderCredentialsSecretReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateVsphereCloudProviderCredentialsSecretReturnsOnCall(i int, result1 error) { - fake.updateVsphereCloudProviderCredentialsSecretMutex.Lock() - defer fake.updateVsphereCloudProviderCredentialsSecretMutex.Unlock() - fake.UpdateVsphereCloudProviderCredentialsSecretStub = nil - if fake.updateVsphereCloudProviderCredentialsSecretReturnsOnCall == nil { - fake.updateVsphereCloudProviderCredentialsSecretReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateVsphereCloudProviderCredentialsSecretReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateVsphereCsiConfigSecret(arg1 string, arg2 string, arg3 string, arg4 string) error { - fake.updateVsphereCsiConfigSecretMutex.Lock() - ret, specificReturn := fake.updateVsphereCsiConfigSecretReturnsOnCall[len(fake.updateVsphereCsiConfigSecretArgsForCall)] - fake.updateVsphereCsiConfigSecretArgsForCall = append(fake.updateVsphereCsiConfigSecretArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 string - }{arg1, arg2, arg3, arg4}) - stub := fake.UpdateVsphereCsiConfigSecretStub - fakeReturns := fake.updateVsphereCsiConfigSecretReturns - fake.recordInvocation("UpdateVsphereCsiConfigSecret", []interface{}{arg1, arg2, arg3, arg4}) - fake.updateVsphereCsiConfigSecretMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateVsphereCsiConfigSecretCallCount() int { - fake.updateVsphereCsiConfigSecretMutex.RLock() - defer fake.updateVsphereCsiConfigSecretMutex.RUnlock() - return len(fake.updateVsphereCsiConfigSecretArgsForCall) -} - -func (fake *ClusterClient) UpdateVsphereCsiConfigSecretCalls(stub func(string, string, string, string) error) { - fake.updateVsphereCsiConfigSecretMutex.Lock() - defer fake.updateVsphereCsiConfigSecretMutex.Unlock() - fake.UpdateVsphereCsiConfigSecretStub = stub -} - -func (fake *ClusterClient) UpdateVsphereCsiConfigSecretArgsForCall(i int) (string, string, string, string) { - fake.updateVsphereCsiConfigSecretMutex.RLock() - defer fake.updateVsphereCsiConfigSecretMutex.RUnlock() - argsForCall := fake.updateVsphereCsiConfigSecretArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) UpdateVsphereCsiConfigSecretReturns(result1 error) { - fake.updateVsphereCsiConfigSecretMutex.Lock() - defer fake.updateVsphereCsiConfigSecretMutex.Unlock() - fake.UpdateVsphereCsiConfigSecretStub = nil - fake.updateVsphereCsiConfigSecretReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateVsphereCsiConfigSecretReturnsOnCall(i int, result1 error) { - fake.updateVsphereCsiConfigSecretMutex.Lock() - defer fake.updateVsphereCsiConfigSecretMutex.Unlock() - fake.UpdateVsphereCsiConfigSecretStub = nil - if fake.updateVsphereCsiConfigSecretReturnsOnCall == nil { - fake.updateVsphereCsiConfigSecretReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateVsphereCsiConfigSecretReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateVsphereIdentityRefSecret(arg1 string, arg2 string, arg3 string, arg4 string) error { - fake.updateVsphereIdentityRefSecretMutex.Lock() - ret, specificReturn := fake.updateVsphereIdentityRefSecretReturnsOnCall[len(fake.updateVsphereIdentityRefSecretArgsForCall)] - fake.updateVsphereIdentityRefSecretArgsForCall = append(fake.updateVsphereIdentityRefSecretArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 string - }{arg1, arg2, arg3, arg4}) - stub := fake.UpdateVsphereIdentityRefSecretStub - fakeReturns := fake.updateVsphereIdentityRefSecretReturns - fake.recordInvocation("UpdateVsphereIdentityRefSecret", []interface{}{arg1, arg2, arg3, arg4}) - fake.updateVsphereIdentityRefSecretMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UpdateVsphereIdentityRefSecretCallCount() int { - fake.updateVsphereIdentityRefSecretMutex.RLock() - defer fake.updateVsphereIdentityRefSecretMutex.RUnlock() - return len(fake.updateVsphereIdentityRefSecretArgsForCall) -} - -func (fake *ClusterClient) UpdateVsphereIdentityRefSecretCalls(stub func(string, string, string, string) error) { - fake.updateVsphereIdentityRefSecretMutex.Lock() - defer fake.updateVsphereIdentityRefSecretMutex.Unlock() - fake.UpdateVsphereIdentityRefSecretStub = stub -} - -func (fake *ClusterClient) UpdateVsphereIdentityRefSecretArgsForCall(i int) (string, string, string, string) { - fake.updateVsphereIdentityRefSecretMutex.RLock() - defer fake.updateVsphereIdentityRefSecretMutex.RUnlock() - argsForCall := fake.updateVsphereIdentityRefSecretArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) UpdateVsphereIdentityRefSecretReturns(result1 error) { - fake.updateVsphereIdentityRefSecretMutex.Lock() - defer fake.updateVsphereIdentityRefSecretMutex.Unlock() - fake.UpdateVsphereIdentityRefSecretStub = nil - fake.updateVsphereIdentityRefSecretReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UpdateVsphereIdentityRefSecretReturnsOnCall(i int, result1 error) { - fake.updateVsphereIdentityRefSecretMutex.Lock() - defer fake.updateVsphereIdentityRefSecretMutex.Unlock() - fake.UpdateVsphereIdentityRefSecretStub = nil - if fake.updateVsphereIdentityRefSecretReturnsOnCall == nil { - fake.updateVsphereIdentityRefSecretReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateVsphereIdentityRefSecretReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UseContext(arg1 string) error { - fake.useContextMutex.Lock() - ret, specificReturn := fake.useContextReturnsOnCall[len(fake.useContextArgsForCall)] - fake.useContextArgsForCall = append(fake.useContextArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.UseContextStub - fakeReturns := fake.useContextReturns - fake.recordInvocation("UseContext", []interface{}{arg1}) - fake.useContextMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) UseContextCallCount() int { - fake.useContextMutex.RLock() - defer fake.useContextMutex.RUnlock() - return len(fake.useContextArgsForCall) -} - -func (fake *ClusterClient) UseContextCalls(stub func(string) error) { - fake.useContextMutex.Lock() - defer fake.useContextMutex.Unlock() - fake.UseContextStub = stub -} - -func (fake *ClusterClient) UseContextArgsForCall(i int) string { - fake.useContextMutex.RLock() - defer fake.useContextMutex.RUnlock() - argsForCall := fake.useContextArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ClusterClient) UseContextReturns(result1 error) { - fake.useContextMutex.Lock() - defer fake.useContextMutex.Unlock() - fake.UseContextStub = nil - fake.useContextReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) UseContextReturnsOnCall(i int, result1 error) { - fake.useContextMutex.Lock() - defer fake.useContextMutex.Unlock() - fake.UseContextStub = nil - if fake.useContextReturnsOnCall == nil { - fake.useContextReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.useContextReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) VerifyCLIPluginCRD() (bool, error) { - fake.verifyCLIPluginCRDMutex.Lock() - ret, specificReturn := fake.verifyCLIPluginCRDReturnsOnCall[len(fake.verifyCLIPluginCRDArgsForCall)] - fake.verifyCLIPluginCRDArgsForCall = append(fake.verifyCLIPluginCRDArgsForCall, struct { - }{}) - stub := fake.VerifyCLIPluginCRDStub - fakeReturns := fake.verifyCLIPluginCRDReturns - fake.recordInvocation("VerifyCLIPluginCRD", []interface{}{}) - fake.verifyCLIPluginCRDMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) VerifyCLIPluginCRDCallCount() int { - fake.verifyCLIPluginCRDMutex.RLock() - defer fake.verifyCLIPluginCRDMutex.RUnlock() - return len(fake.verifyCLIPluginCRDArgsForCall) -} - -func (fake *ClusterClient) VerifyCLIPluginCRDCalls(stub func() (bool, error)) { - fake.verifyCLIPluginCRDMutex.Lock() - defer fake.verifyCLIPluginCRDMutex.Unlock() - fake.VerifyCLIPluginCRDStub = stub -} - -func (fake *ClusterClient) VerifyCLIPluginCRDReturns(result1 bool, result2 error) { - fake.verifyCLIPluginCRDMutex.Lock() - defer fake.verifyCLIPluginCRDMutex.Unlock() - fake.VerifyCLIPluginCRDStub = nil - fake.verifyCLIPluginCRDReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) VerifyCLIPluginCRDReturnsOnCall(i int, result1 bool, result2 error) { - fake.verifyCLIPluginCRDMutex.Lock() - defer fake.verifyCLIPluginCRDMutex.Unlock() - fake.VerifyCLIPluginCRDStub = nil - if fake.verifyCLIPluginCRDReturnsOnCall == nil { - fake.verifyCLIPluginCRDReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.verifyCLIPluginCRDReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) VerifyExistenceOfCRD(arg1 string, arg2 string) (bool, error) { - fake.verifyExistenceOfCRDMutex.Lock() - ret, specificReturn := fake.verifyExistenceOfCRDReturnsOnCall[len(fake.verifyExistenceOfCRDArgsForCall)] - fake.verifyExistenceOfCRDArgsForCall = append(fake.verifyExistenceOfCRDArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.VerifyExistenceOfCRDStub - fakeReturns := fake.verifyExistenceOfCRDReturns - fake.recordInvocation("VerifyExistenceOfCRD", []interface{}{arg1, arg2}) - fake.verifyExistenceOfCRDMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClient) VerifyExistenceOfCRDCallCount() int { - fake.verifyExistenceOfCRDMutex.RLock() - defer fake.verifyExistenceOfCRDMutex.RUnlock() - return len(fake.verifyExistenceOfCRDArgsForCall) -} - -func (fake *ClusterClient) VerifyExistenceOfCRDCalls(stub func(string, string) (bool, error)) { - fake.verifyExistenceOfCRDMutex.Lock() - defer fake.verifyExistenceOfCRDMutex.Unlock() - fake.VerifyExistenceOfCRDStub = stub -} - -func (fake *ClusterClient) VerifyExistenceOfCRDArgsForCall(i int) (string, string) { - fake.verifyExistenceOfCRDMutex.RLock() - defer fake.verifyExistenceOfCRDMutex.RUnlock() - argsForCall := fake.verifyExistenceOfCRDArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) VerifyExistenceOfCRDReturns(result1 bool, result2 error) { - fake.verifyExistenceOfCRDMutex.Lock() - defer fake.verifyExistenceOfCRDMutex.Unlock() - fake.VerifyExistenceOfCRDStub = nil - fake.verifyExistenceOfCRDReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) VerifyExistenceOfCRDReturnsOnCall(i int, result1 bool, result2 error) { - fake.verifyExistenceOfCRDMutex.Lock() - defer fake.verifyExistenceOfCRDMutex.Unlock() - fake.VerifyExistenceOfCRDStub = nil - if fake.verifyExistenceOfCRDReturnsOnCall == nil { - fake.verifyExistenceOfCRDReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.verifyExistenceOfCRDReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *ClusterClient) WaitForAVIResourceCleanUp(arg1 string, arg2 string) error { - fake.waitForAVIResourceCleanUpMutex.Lock() - ret, specificReturn := fake.waitForAVIResourceCleanUpReturnsOnCall[len(fake.waitForAVIResourceCleanUpArgsForCall)] - fake.waitForAVIResourceCleanUpArgsForCall = append(fake.waitForAVIResourceCleanUpArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.WaitForAVIResourceCleanUpStub - fakeReturns := fake.waitForAVIResourceCleanUpReturns - fake.recordInvocation("WaitForAVIResourceCleanUp", []interface{}{arg1, arg2}) - fake.waitForAVIResourceCleanUpMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitForAVIResourceCleanUpCallCount() int { - fake.waitForAVIResourceCleanUpMutex.RLock() - defer fake.waitForAVIResourceCleanUpMutex.RUnlock() - return len(fake.waitForAVIResourceCleanUpArgsForCall) -} - -func (fake *ClusterClient) WaitForAVIResourceCleanUpCalls(stub func(string, string) error) { - fake.waitForAVIResourceCleanUpMutex.Lock() - defer fake.waitForAVIResourceCleanUpMutex.Unlock() - fake.WaitForAVIResourceCleanUpStub = stub -} - -func (fake *ClusterClient) WaitForAVIResourceCleanUpArgsForCall(i int) (string, string) { - fake.waitForAVIResourceCleanUpMutex.RLock() - defer fake.waitForAVIResourceCleanUpMutex.RUnlock() - argsForCall := fake.waitForAVIResourceCleanUpArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) WaitForAVIResourceCleanUpReturns(result1 error) { - fake.waitForAVIResourceCleanUpMutex.Lock() - defer fake.waitForAVIResourceCleanUpMutex.Unlock() - fake.WaitForAVIResourceCleanUpStub = nil - fake.waitForAVIResourceCleanUpReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForAVIResourceCleanUpReturnsOnCall(i int, result1 error) { - fake.waitForAVIResourceCleanUpMutex.Lock() - defer fake.waitForAVIResourceCleanUpMutex.Unlock() - fake.WaitForAVIResourceCleanUpStub = nil - if fake.waitForAVIResourceCleanUpReturnsOnCall == nil { - fake.waitForAVIResourceCleanUpReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitForAVIResourceCleanUpReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForAutoscalerDeployment(arg1 string, arg2 string) error { - fake.waitForAutoscalerDeploymentMutex.Lock() - ret, specificReturn := fake.waitForAutoscalerDeploymentReturnsOnCall[len(fake.waitForAutoscalerDeploymentArgsForCall)] - fake.waitForAutoscalerDeploymentArgsForCall = append(fake.waitForAutoscalerDeploymentArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.WaitForAutoscalerDeploymentStub - fakeReturns := fake.waitForAutoscalerDeploymentReturns - fake.recordInvocation("WaitForAutoscalerDeployment", []interface{}{arg1, arg2}) - fake.waitForAutoscalerDeploymentMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitForAutoscalerDeploymentCallCount() int { - fake.waitForAutoscalerDeploymentMutex.RLock() - defer fake.waitForAutoscalerDeploymentMutex.RUnlock() - return len(fake.waitForAutoscalerDeploymentArgsForCall) -} - -func (fake *ClusterClient) WaitForAutoscalerDeploymentCalls(stub func(string, string) error) { - fake.waitForAutoscalerDeploymentMutex.Lock() - defer fake.waitForAutoscalerDeploymentMutex.Unlock() - fake.WaitForAutoscalerDeploymentStub = stub -} - -func (fake *ClusterClient) WaitForAutoscalerDeploymentArgsForCall(i int) (string, string) { - fake.waitForAutoscalerDeploymentMutex.RLock() - defer fake.waitForAutoscalerDeploymentMutex.RUnlock() - argsForCall := fake.waitForAutoscalerDeploymentArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) WaitForAutoscalerDeploymentReturns(result1 error) { - fake.waitForAutoscalerDeploymentMutex.Lock() - defer fake.waitForAutoscalerDeploymentMutex.Unlock() - fake.WaitForAutoscalerDeploymentStub = nil - fake.waitForAutoscalerDeploymentReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForAutoscalerDeploymentReturnsOnCall(i int, result1 error) { - fake.waitForAutoscalerDeploymentMutex.Lock() - defer fake.waitForAutoscalerDeploymentMutex.Unlock() - fake.WaitForAutoscalerDeploymentStub = nil - if fake.waitForAutoscalerDeploymentReturnsOnCall == nil { - fake.waitForAutoscalerDeploymentReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitForAutoscalerDeploymentReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForClusterDeletion(arg1 string, arg2 string) error { - fake.waitForClusterDeletionMutex.Lock() - ret, specificReturn := fake.waitForClusterDeletionReturnsOnCall[len(fake.waitForClusterDeletionArgsForCall)] - fake.waitForClusterDeletionArgsForCall = append(fake.waitForClusterDeletionArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.WaitForClusterDeletionStub - fakeReturns := fake.waitForClusterDeletionReturns - fake.recordInvocation("WaitForClusterDeletion", []interface{}{arg1, arg2}) - fake.waitForClusterDeletionMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitForClusterDeletionCallCount() int { - fake.waitForClusterDeletionMutex.RLock() - defer fake.waitForClusterDeletionMutex.RUnlock() - return len(fake.waitForClusterDeletionArgsForCall) -} - -func (fake *ClusterClient) WaitForClusterDeletionCalls(stub func(string, string) error) { - fake.waitForClusterDeletionMutex.Lock() - defer fake.waitForClusterDeletionMutex.Unlock() - fake.WaitForClusterDeletionStub = stub -} - -func (fake *ClusterClient) WaitForClusterDeletionArgsForCall(i int) (string, string) { - fake.waitForClusterDeletionMutex.RLock() - defer fake.waitForClusterDeletionMutex.RUnlock() - argsForCall := fake.waitForClusterDeletionArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) WaitForClusterDeletionReturns(result1 error) { - fake.waitForClusterDeletionMutex.Lock() - defer fake.waitForClusterDeletionMutex.Unlock() - fake.WaitForClusterDeletionStub = nil - fake.waitForClusterDeletionReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForClusterDeletionReturnsOnCall(i int, result1 error) { - fake.waitForClusterDeletionMutex.Lock() - defer fake.waitForClusterDeletionMutex.Unlock() - fake.WaitForClusterDeletionStub = nil - if fake.waitForClusterDeletionReturnsOnCall == nil { - fake.waitForClusterDeletionReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitForClusterDeletionReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForClusterInitialized(arg1 string, arg2 string) error { - fake.waitForClusterInitializedMutex.Lock() - ret, specificReturn := fake.waitForClusterInitializedReturnsOnCall[len(fake.waitForClusterInitializedArgsForCall)] - fake.waitForClusterInitializedArgsForCall = append(fake.waitForClusterInitializedArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.WaitForClusterInitializedStub - fakeReturns := fake.waitForClusterInitializedReturns - fake.recordInvocation("WaitForClusterInitialized", []interface{}{arg1, arg2}) - fake.waitForClusterInitializedMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitForClusterInitializedCallCount() int { - fake.waitForClusterInitializedMutex.RLock() - defer fake.waitForClusterInitializedMutex.RUnlock() - return len(fake.waitForClusterInitializedArgsForCall) -} - -func (fake *ClusterClient) WaitForClusterInitializedCalls(stub func(string, string) error) { - fake.waitForClusterInitializedMutex.Lock() - defer fake.waitForClusterInitializedMutex.Unlock() - fake.WaitForClusterInitializedStub = stub -} - -func (fake *ClusterClient) WaitForClusterInitializedArgsForCall(i int) (string, string) { - fake.waitForClusterInitializedMutex.RLock() - defer fake.waitForClusterInitializedMutex.RUnlock() - argsForCall := fake.waitForClusterInitializedArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) WaitForClusterInitializedReturns(result1 error) { - fake.waitForClusterInitializedMutex.Lock() - defer fake.waitForClusterInitializedMutex.Unlock() - fake.WaitForClusterInitializedStub = nil - fake.waitForClusterInitializedReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForClusterInitializedReturnsOnCall(i int, result1 error) { - fake.waitForClusterInitializedMutex.Lock() - defer fake.waitForClusterInitializedMutex.Unlock() - fake.WaitForClusterInitializedStub = nil - if fake.waitForClusterInitializedReturnsOnCall == nil { - fake.waitForClusterInitializedReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitForClusterInitializedReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForClusterReady(arg1 string, arg2 string, arg3 bool) error { - fake.waitForClusterReadyMutex.Lock() - ret, specificReturn := fake.waitForClusterReadyReturnsOnCall[len(fake.waitForClusterReadyArgsForCall)] - fake.waitForClusterReadyArgsForCall = append(fake.waitForClusterReadyArgsForCall, struct { - arg1 string - arg2 string - arg3 bool - }{arg1, arg2, arg3}) - stub := fake.WaitForClusterReadyStub - fakeReturns := fake.waitForClusterReadyReturns - fake.recordInvocation("WaitForClusterReady", []interface{}{arg1, arg2, arg3}) - fake.waitForClusterReadyMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitForClusterReadyCallCount() int { - fake.waitForClusterReadyMutex.RLock() - defer fake.waitForClusterReadyMutex.RUnlock() - return len(fake.waitForClusterReadyArgsForCall) -} - -func (fake *ClusterClient) WaitForClusterReadyCalls(stub func(string, string, bool) error) { - fake.waitForClusterReadyMutex.Lock() - defer fake.waitForClusterReadyMutex.Unlock() - fake.WaitForClusterReadyStub = stub -} - -func (fake *ClusterClient) WaitForClusterReadyArgsForCall(i int) (string, string, bool) { - fake.waitForClusterReadyMutex.RLock() - defer fake.waitForClusterReadyMutex.RUnlock() - argsForCall := fake.waitForClusterReadyArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) WaitForClusterReadyReturns(result1 error) { - fake.waitForClusterReadyMutex.Lock() - defer fake.waitForClusterReadyMutex.Unlock() - fake.WaitForClusterReadyStub = nil - fake.waitForClusterReadyReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForClusterReadyReturnsOnCall(i int, result1 error) { - fake.waitForClusterReadyMutex.Lock() - defer fake.waitForClusterReadyMutex.Unlock() - fake.WaitForClusterReadyStub = nil - if fake.waitForClusterReadyReturnsOnCall == nil { - fake.waitForClusterReadyReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitForClusterReadyReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForControlPlaneAvailable(arg1 string, arg2 string) error { - fake.waitForControlPlaneAvailableMutex.Lock() - ret, specificReturn := fake.waitForControlPlaneAvailableReturnsOnCall[len(fake.waitForControlPlaneAvailableArgsForCall)] - fake.waitForControlPlaneAvailableArgsForCall = append(fake.waitForControlPlaneAvailableArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.WaitForControlPlaneAvailableStub - fakeReturns := fake.waitForControlPlaneAvailableReturns - fake.recordInvocation("WaitForControlPlaneAvailable", []interface{}{arg1, arg2}) - fake.waitForControlPlaneAvailableMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitForControlPlaneAvailableCallCount() int { - fake.waitForControlPlaneAvailableMutex.RLock() - defer fake.waitForControlPlaneAvailableMutex.RUnlock() - return len(fake.waitForControlPlaneAvailableArgsForCall) -} - -func (fake *ClusterClient) WaitForControlPlaneAvailableCalls(stub func(string, string) error) { - fake.waitForControlPlaneAvailableMutex.Lock() - defer fake.waitForControlPlaneAvailableMutex.Unlock() - fake.WaitForControlPlaneAvailableStub = stub -} - -func (fake *ClusterClient) WaitForControlPlaneAvailableArgsForCall(i int) (string, string) { - fake.waitForControlPlaneAvailableMutex.RLock() - defer fake.waitForControlPlaneAvailableMutex.RUnlock() - argsForCall := fake.waitForControlPlaneAvailableArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) WaitForControlPlaneAvailableReturns(result1 error) { - fake.waitForControlPlaneAvailableMutex.Lock() - defer fake.waitForControlPlaneAvailableMutex.Unlock() - fake.WaitForControlPlaneAvailableStub = nil - fake.waitForControlPlaneAvailableReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForControlPlaneAvailableReturnsOnCall(i int, result1 error) { - fake.waitForControlPlaneAvailableMutex.Lock() - defer fake.waitForControlPlaneAvailableMutex.Unlock() - fake.WaitForControlPlaneAvailableStub = nil - if fake.waitForControlPlaneAvailableReturnsOnCall == nil { - fake.waitForControlPlaneAvailableReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitForControlPlaneAvailableReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForDeployment(arg1 string, arg2 string) error { - fake.waitForDeploymentMutex.Lock() - ret, specificReturn := fake.waitForDeploymentReturnsOnCall[len(fake.waitForDeploymentArgsForCall)] - fake.waitForDeploymentArgsForCall = append(fake.waitForDeploymentArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.WaitForDeploymentStub - fakeReturns := fake.waitForDeploymentReturns - fake.recordInvocation("WaitForDeployment", []interface{}{arg1, arg2}) - fake.waitForDeploymentMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitForDeploymentCallCount() int { - fake.waitForDeploymentMutex.RLock() - defer fake.waitForDeploymentMutex.RUnlock() - return len(fake.waitForDeploymentArgsForCall) -} - -func (fake *ClusterClient) WaitForDeploymentCalls(stub func(string, string) error) { - fake.waitForDeploymentMutex.Lock() - defer fake.waitForDeploymentMutex.Unlock() - fake.WaitForDeploymentStub = stub -} - -func (fake *ClusterClient) WaitForDeploymentArgsForCall(i int) (string, string) { - fake.waitForDeploymentMutex.RLock() - defer fake.waitForDeploymentMutex.RUnlock() - argsForCall := fake.waitForDeploymentArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) WaitForDeploymentReturns(result1 error) { - fake.waitForDeploymentMutex.Lock() - defer fake.waitForDeploymentMutex.Unlock() - fake.WaitForDeploymentStub = nil - fake.waitForDeploymentReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForDeploymentReturnsOnCall(i int, result1 error) { - fake.waitForDeploymentMutex.Lock() - defer fake.waitForDeploymentMutex.Unlock() - fake.WaitForDeploymentStub = nil - if fake.waitForDeploymentReturnsOnCall == nil { - fake.waitForDeploymentReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitForDeploymentReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForPacificCluster(arg1 string, arg2 string) error { - fake.waitForPacificClusterMutex.Lock() - ret, specificReturn := fake.waitForPacificClusterReturnsOnCall[len(fake.waitForPacificClusterArgsForCall)] - fake.waitForPacificClusterArgsForCall = append(fake.waitForPacificClusterArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.WaitForPacificClusterStub - fakeReturns := fake.waitForPacificClusterReturns - fake.recordInvocation("WaitForPacificCluster", []interface{}{arg1, arg2}) - fake.waitForPacificClusterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitForPacificClusterCallCount() int { - fake.waitForPacificClusterMutex.RLock() - defer fake.waitForPacificClusterMutex.RUnlock() - return len(fake.waitForPacificClusterArgsForCall) -} - -func (fake *ClusterClient) WaitForPacificClusterCalls(stub func(string, string) error) { - fake.waitForPacificClusterMutex.Lock() - defer fake.waitForPacificClusterMutex.Unlock() - fake.WaitForPacificClusterStub = stub -} - -func (fake *ClusterClient) WaitForPacificClusterArgsForCall(i int) (string, string) { - fake.waitForPacificClusterMutex.RLock() - defer fake.waitForPacificClusterMutex.RUnlock() - argsForCall := fake.waitForPacificClusterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ClusterClient) WaitForPacificClusterReturns(result1 error) { - fake.waitForPacificClusterMutex.Lock() - defer fake.waitForPacificClusterMutex.Unlock() - fake.WaitForPacificClusterStub = nil - fake.waitForPacificClusterReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForPacificClusterReturnsOnCall(i int, result1 error) { - fake.waitForPacificClusterMutex.Lock() - defer fake.waitForPacificClusterMutex.Unlock() - fake.WaitForPacificClusterStub = nil - if fake.waitForPacificClusterReturnsOnCall == nil { - fake.waitForPacificClusterReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitForPacificClusterReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForPacificClusterK8sVersionUpdate(arg1 string, arg2 string, arg3 string) error { - fake.waitForPacificClusterK8sVersionUpdateMutex.Lock() - ret, specificReturn := fake.waitForPacificClusterK8sVersionUpdateReturnsOnCall[len(fake.waitForPacificClusterK8sVersionUpdateArgsForCall)] - fake.waitForPacificClusterK8sVersionUpdateArgsForCall = append(fake.waitForPacificClusterK8sVersionUpdateArgsForCall, struct { - arg1 string - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.WaitForPacificClusterK8sVersionUpdateStub - fakeReturns := fake.waitForPacificClusterK8sVersionUpdateReturns - fake.recordInvocation("WaitForPacificClusterK8sVersionUpdate", []interface{}{arg1, arg2, arg3}) - fake.waitForPacificClusterK8sVersionUpdateMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitForPacificClusterK8sVersionUpdateCallCount() int { - fake.waitForPacificClusterK8sVersionUpdateMutex.RLock() - defer fake.waitForPacificClusterK8sVersionUpdateMutex.RUnlock() - return len(fake.waitForPacificClusterK8sVersionUpdateArgsForCall) -} - -func (fake *ClusterClient) WaitForPacificClusterK8sVersionUpdateCalls(stub func(string, string, string) error) { - fake.waitForPacificClusterK8sVersionUpdateMutex.Lock() - defer fake.waitForPacificClusterK8sVersionUpdateMutex.Unlock() - fake.WaitForPacificClusterK8sVersionUpdateStub = stub -} - -func (fake *ClusterClient) WaitForPacificClusterK8sVersionUpdateArgsForCall(i int) (string, string, string) { - fake.waitForPacificClusterK8sVersionUpdateMutex.RLock() - defer fake.waitForPacificClusterK8sVersionUpdateMutex.RUnlock() - argsForCall := fake.waitForPacificClusterK8sVersionUpdateArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) WaitForPacificClusterK8sVersionUpdateReturns(result1 error) { - fake.waitForPacificClusterK8sVersionUpdateMutex.Lock() - defer fake.waitForPacificClusterK8sVersionUpdateMutex.Unlock() - fake.WaitForPacificClusterK8sVersionUpdateStub = nil - fake.waitForPacificClusterK8sVersionUpdateReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForPacificClusterK8sVersionUpdateReturnsOnCall(i int, result1 error) { - fake.waitForPacificClusterK8sVersionUpdateMutex.Lock() - defer fake.waitForPacificClusterK8sVersionUpdateMutex.Unlock() - fake.WaitForPacificClusterK8sVersionUpdateStub = nil - if fake.waitForPacificClusterK8sVersionUpdateReturnsOnCall == nil { - fake.waitForPacificClusterK8sVersionUpdateReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitForPacificClusterK8sVersionUpdateReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForPackageInstall(arg1 string, arg2 string, arg3 time.Duration) error { - fake.waitForPackageInstallMutex.Lock() - ret, specificReturn := fake.waitForPackageInstallReturnsOnCall[len(fake.waitForPackageInstallArgsForCall)] - fake.waitForPackageInstallArgsForCall = append(fake.waitForPackageInstallArgsForCall, struct { - arg1 string - arg2 string - arg3 time.Duration - }{arg1, arg2, arg3}) - stub := fake.WaitForPackageInstallStub - fakeReturns := fake.waitForPackageInstallReturns - fake.recordInvocation("WaitForPackageInstall", []interface{}{arg1, arg2, arg3}) - fake.waitForPackageInstallMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitForPackageInstallCallCount() int { - fake.waitForPackageInstallMutex.RLock() - defer fake.waitForPackageInstallMutex.RUnlock() - return len(fake.waitForPackageInstallArgsForCall) -} - -func (fake *ClusterClient) WaitForPackageInstallCalls(stub func(string, string, time.Duration) error) { - fake.waitForPackageInstallMutex.Lock() - defer fake.waitForPackageInstallMutex.Unlock() - fake.WaitForPackageInstallStub = stub -} - -func (fake *ClusterClient) WaitForPackageInstallArgsForCall(i int) (string, string, time.Duration) { - fake.waitForPackageInstallMutex.RLock() - defer fake.waitForPackageInstallMutex.RUnlock() - argsForCall := fake.waitForPackageInstallArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClient) WaitForPackageInstallReturns(result1 error) { - fake.waitForPackageInstallMutex.Lock() - defer fake.waitForPackageInstallMutex.Unlock() - fake.WaitForPackageInstallStub = nil - fake.waitForPackageInstallReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitForPackageInstallReturnsOnCall(i int, result1 error) { - fake.waitForPackageInstallMutex.Lock() - defer fake.waitForPackageInstallMutex.Unlock() - fake.WaitForPackageInstallStub = nil - if fake.waitForPackageInstallReturnsOnCall == nil { - fake.waitForPackageInstallReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitForPackageInstallReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForCPNodes(arg1 string, arg2 string, arg3 string, arg4 clusterclient.Client) error { - fake.waitK8sVersionUpdateForCPNodesMutex.Lock() - ret, specificReturn := fake.waitK8sVersionUpdateForCPNodesReturnsOnCall[len(fake.waitK8sVersionUpdateForCPNodesArgsForCall)] - fake.waitK8sVersionUpdateForCPNodesArgsForCall = append(fake.waitK8sVersionUpdateForCPNodesArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 clusterclient.Client - }{arg1, arg2, arg3, arg4}) - stub := fake.WaitK8sVersionUpdateForCPNodesStub - fakeReturns := fake.waitK8sVersionUpdateForCPNodesReturns - fake.recordInvocation("WaitK8sVersionUpdateForCPNodes", []interface{}{arg1, arg2, arg3, arg4}) - fake.waitK8sVersionUpdateForCPNodesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForCPNodesCallCount() int { - fake.waitK8sVersionUpdateForCPNodesMutex.RLock() - defer fake.waitK8sVersionUpdateForCPNodesMutex.RUnlock() - return len(fake.waitK8sVersionUpdateForCPNodesArgsForCall) -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForCPNodesCalls(stub func(string, string, string, clusterclient.Client) error) { - fake.waitK8sVersionUpdateForCPNodesMutex.Lock() - defer fake.waitK8sVersionUpdateForCPNodesMutex.Unlock() - fake.WaitK8sVersionUpdateForCPNodesStub = stub -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForCPNodesArgsForCall(i int) (string, string, string, clusterclient.Client) { - fake.waitK8sVersionUpdateForCPNodesMutex.RLock() - defer fake.waitK8sVersionUpdateForCPNodesMutex.RUnlock() - argsForCall := fake.waitK8sVersionUpdateForCPNodesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForCPNodesReturns(result1 error) { - fake.waitK8sVersionUpdateForCPNodesMutex.Lock() - defer fake.waitK8sVersionUpdateForCPNodesMutex.Unlock() - fake.WaitK8sVersionUpdateForCPNodesStub = nil - fake.waitK8sVersionUpdateForCPNodesReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForCPNodesReturnsOnCall(i int, result1 error) { - fake.waitK8sVersionUpdateForCPNodesMutex.Lock() - defer fake.waitK8sVersionUpdateForCPNodesMutex.Unlock() - fake.WaitK8sVersionUpdateForCPNodesStub = nil - if fake.waitK8sVersionUpdateForCPNodesReturnsOnCall == nil { - fake.waitK8sVersionUpdateForCPNodesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitK8sVersionUpdateForCPNodesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForWorkerNodes(arg1 string, arg2 string, arg3 string, arg4 clusterclient.Client) error { - fake.waitK8sVersionUpdateForWorkerNodesMutex.Lock() - ret, specificReturn := fake.waitK8sVersionUpdateForWorkerNodesReturnsOnCall[len(fake.waitK8sVersionUpdateForWorkerNodesArgsForCall)] - fake.waitK8sVersionUpdateForWorkerNodesArgsForCall = append(fake.waitK8sVersionUpdateForWorkerNodesArgsForCall, struct { - arg1 string - arg2 string - arg3 string - arg4 clusterclient.Client - }{arg1, arg2, arg3, arg4}) - stub := fake.WaitK8sVersionUpdateForWorkerNodesStub - fakeReturns := fake.waitK8sVersionUpdateForWorkerNodesReturns - fake.recordInvocation("WaitK8sVersionUpdateForWorkerNodes", []interface{}{arg1, arg2, arg3, arg4}) - fake.waitK8sVersionUpdateForWorkerNodesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForWorkerNodesCallCount() int { - fake.waitK8sVersionUpdateForWorkerNodesMutex.RLock() - defer fake.waitK8sVersionUpdateForWorkerNodesMutex.RUnlock() - return len(fake.waitK8sVersionUpdateForWorkerNodesArgsForCall) -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForWorkerNodesCalls(stub func(string, string, string, clusterclient.Client) error) { - fake.waitK8sVersionUpdateForWorkerNodesMutex.Lock() - defer fake.waitK8sVersionUpdateForWorkerNodesMutex.Unlock() - fake.WaitK8sVersionUpdateForWorkerNodesStub = stub -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForWorkerNodesArgsForCall(i int) (string, string, string, clusterclient.Client) { - fake.waitK8sVersionUpdateForWorkerNodesMutex.RLock() - defer fake.waitK8sVersionUpdateForWorkerNodesMutex.RUnlock() - argsForCall := fake.waitK8sVersionUpdateForWorkerNodesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForWorkerNodesReturns(result1 error) { - fake.waitK8sVersionUpdateForWorkerNodesMutex.Lock() - defer fake.waitK8sVersionUpdateForWorkerNodesMutex.Unlock() - fake.WaitK8sVersionUpdateForWorkerNodesStub = nil - fake.waitK8sVersionUpdateForWorkerNodesReturns = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) WaitK8sVersionUpdateForWorkerNodesReturnsOnCall(i int, result1 error) { - fake.waitK8sVersionUpdateForWorkerNodesMutex.Lock() - defer fake.waitK8sVersionUpdateForWorkerNodesMutex.Unlock() - fake.WaitK8sVersionUpdateForWorkerNodesStub = nil - if fake.waitK8sVersionUpdateForWorkerNodesReturnsOnCall == nil { - fake.waitK8sVersionUpdateForWorkerNodesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.waitK8sVersionUpdateForWorkerNodesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ClusterClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.activateTanzuKubernetesReleasesMutex.RLock() - defer fake.activateTanzuKubernetesReleasesMutex.RUnlock() - fake.addCEIPTelemetryJobMutex.RLock() - defer fake.addCEIPTelemetryJobMutex.RUnlock() - fake.applyMutex.RLock() - defer fake.applyMutex.RUnlock() - fake.applyFileMutex.RLock() - defer fake.applyFileMutex.RUnlock() - fake.applyFileRecursivelyMutex.RLock() - defer fake.applyFileRecursivelyMutex.RUnlock() - fake.applyPatchForAutoScalerDeploymentMutex.RLock() - defer fake.applyPatchForAutoScalerDeploymentMutex.RUnlock() - fake.checkUnifiedAzureClusterIdentityMutex.RLock() - defer fake.checkUnifiedAzureClusterIdentityMutex.RUnlock() - fake.cloneWithTimeoutMutex.RLock() - defer fake.cloneWithTimeoutMutex.RUnlock() - fake.createNamespaceMutex.RLock() - defer fake.createNamespaceMutex.RUnlock() - fake.createResourceMutex.RLock() - defer fake.createResourceMutex.RUnlock() - fake.deactivateTanzuKubernetesReleasesMutex.RLock() - defer fake.deactivateTanzuKubernetesReleasesMutex.RUnlock() - fake.deleteClusterMutex.RLock() - defer fake.deleteClusterMutex.RUnlock() - fake.deleteExistingKappControllerMutex.RLock() - defer fake.deleteExistingKappControllerMutex.RUnlock() - fake.deleteResourceMutex.RLock() - defer fake.deleteResourceMutex.RUnlock() - fake.exportCurrentKubeconfigToFileMutex.RLock() - defer fake.exportCurrentKubeconfigToFileMutex.RUnlock() - fake.getAWSCredentialsFromSecretMutex.RLock() - defer fake.getAWSCredentialsFromSecretMutex.RUnlock() - fake.getAzureClusterNameMutex.RLock() - defer fake.getAzureClusterNameMutex.RUnlock() - fake.getAzureCredentialsFromIdentityMutex.RLock() - defer fake.getAzureCredentialsFromIdentityMutex.RUnlock() - fake.getAzureCredentialsFromSecretMutex.RLock() - defer fake.getAzureCredentialsFromSecretMutex.RUnlock() - fake.getBomConfigMapMutex.RLock() - defer fake.getBomConfigMapMutex.RUnlock() - fake.getCAPZControllerManagerDeploymentsReplicasMutex.RLock() - defer fake.getCAPZControllerManagerDeploymentsReplicasMutex.RUnlock() - fake.getCLIPluginImageRepositoryOverrideMutex.RLock() - defer fake.getCLIPluginImageRepositoryOverrideMutex.RUnlock() - fake.getClientSetMutex.RLock() - defer fake.getClientSetMutex.RUnlock() - fake.getClusterInfrastructureMutex.RLock() - defer fake.getClusterInfrastructureMutex.RUnlock() - fake.getClusterResolvedOSImagesFromTKRMutex.RLock() - defer fake.getClusterResolvedOSImagesFromTKRMutex.RUnlock() - fake.getClusterResolvedTanzuKubernetesReleaseMutex.RLock() - defer fake.getClusterResolvedTanzuKubernetesReleaseMutex.RUnlock() - fake.getClusterStatusInfoMutex.RLock() - defer fake.getClusterStatusInfoMutex.RUnlock() - fake.getCurrentClusterNameMutex.RLock() - defer fake.getCurrentClusterNameMutex.RUnlock() - fake.getCurrentKubeContextMutex.RLock() - defer fake.getCurrentKubeContextMutex.RUnlock() - fake.getCurrentKubeconfigFileMutex.RLock() - defer fake.getCurrentKubeconfigFileMutex.RUnlock() - fake.getCurrentNamespaceMutex.RLock() - defer fake.getCurrentNamespaceMutex.RUnlock() - fake.getDeploymentMutex.RLock() - defer fake.getDeploymentMutex.RUnlock() - fake.getKCPObjectForClusterMutex.RLock() - defer fake.getKCPObjectForClusterMutex.RUnlock() - fake.getKubeConfigForClusterMutex.RLock() - defer fake.getKubeConfigForClusterMutex.RUnlock() - fake.getKubeadmControlPlaneNameMutex.RLock() - defer fake.getKubeadmControlPlaneNameMutex.RUnlock() - fake.getKubernetesVersionMutex.RLock() - defer fake.getKubernetesVersionMutex.RUnlock() - fake.getMDObjectForClusterMutex.RLock() - defer fake.getMDObjectForClusterMutex.RUnlock() - fake.getMachineObjectsForClusterMutex.RLock() - defer fake.getMachineObjectsForClusterMutex.RUnlock() - fake.getManagementClusterTKGVersionMutex.RLock() - defer fake.getManagementClusterTKGVersionMutex.RUnlock() - fake.getPacificClusterObjectMutex.RLock() - defer fake.getPacificClusterObjectMutex.RUnlock() - fake.getPacificTKCAPIVersionMutex.RLock() - defer fake.getPacificTKCAPIVersionMutex.RUnlock() - fake.getPacificTanzuKubernetesReleasesMutex.RLock() - defer fake.getPacificTanzuKubernetesReleasesMutex.RUnlock() - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - fake.getPinnipedIssuerURLAndCAMutex.RLock() - defer fake.getPinnipedIssuerURLAndCAMutex.RUnlock() - fake.getRegionalClusterDefaultProviderNameMutex.RLock() - defer fake.getRegionalClusterDefaultProviderNameMutex.RUnlock() - fake.getResourceMutex.RLock() - defer fake.getResourceMutex.RUnlock() - fake.getResourceListMutex.RLock() - defer fake.getResourceListMutex.RUnlock() - fake.getSecretValueMutex.RLock() - defer fake.getSecretValueMutex.RUnlock() - fake.getTanzuKubernetesReleasesMutex.RLock() - defer fake.getTanzuKubernetesReleasesMutex.RUnlock() - fake.getVCClientAndDataCenterMutex.RLock() - defer fake.getVCClientAndDataCenterMutex.RUnlock() - fake.getVCCredentialsFromClusterMutex.RLock() - defer fake.getVCCredentialsFromClusterMutex.RUnlock() - fake.getVCCredentialsFromSecretMutex.RLock() - defer fake.getVCCredentialsFromSecretMutex.RUnlock() - fake.getVCServerMutex.RLock() - defer fake.getVCServerMutex.RUnlock() - fake.hasCEIPTelemetryJobMutex.RLock() - defer fake.hasCEIPTelemetryJobMutex.RUnlock() - fake.isClusterClassBasedMutex.RLock() - defer fake.isClusterClassBasedMutex.RUnlock() - fake.isClusterRegisteredToTMCMutex.RLock() - defer fake.isClusterRegisteredToTMCMutex.RUnlock() - fake.isPacificRegionalClusterMutex.RLock() - defer fake.isPacificRegionalClusterMutex.RUnlock() - fake.isRegionalClusterMutex.RLock() - defer fake.isRegionalClusterMutex.RUnlock() - fake.listCLIPluginResourcesMutex.RLock() - defer fake.listCLIPluginResourcesMutex.RUnlock() - fake.listClustersMutex.RLock() - defer fake.listClustersMutex.RUnlock() - fake.listPacificClusterObjectsMutex.RLock() - defer fake.listPacificClusterObjectsMutex.RUnlock() - fake.listResourcesMutex.RLock() - defer fake.listResourcesMutex.RUnlock() - fake.loadCurrentKubeconfigBytesMutex.RLock() - defer fake.loadCurrentKubeconfigBytesMutex.RUnlock() - fake.mergeAndUseConfigForClusterMutex.RLock() - defer fake.mergeAndUseConfigForClusterMutex.RUnlock() - fake.mergeConfigForClusterMutex.RLock() - defer fake.mergeConfigForClusterMutex.RUnlock() - fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.RLock() - defer fake.patchCalicoKubeControllerDeploymentWithNewNodeSelectorMutex.RUnlock() - fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.RLock() - defer fake.patchCalicoNodeDaemonSetWithNewNodeSelectorMutex.RUnlock() - fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.RLock() - defer fake.patchClusterAPIAWSControllersToUseEC2CredentialsMutex.RUnlock() - fake.patchClusterObjectMutex.RLock() - defer fake.patchClusterObjectMutex.RUnlock() - fake.patchClusterObjectAnnotationsMutex.RLock() - defer fake.patchClusterObjectAnnotationsMutex.RUnlock() - fake.patchClusterObjectWithOptionalMetadataMutex.RLock() - defer fake.patchClusterObjectWithOptionalMetadataMutex.RUnlock() - fake.patchClusterObjectWithPollOptionsMutex.RLock() - defer fake.patchClusterObjectWithPollOptionsMutex.RUnlock() - fake.patchClusterObjectWithTKGVersionMutex.RLock() - defer fake.patchClusterObjectWithTKGVersionMutex.RUnlock() - fake.patchClusterWithOperationStartedStatusMutex.RLock() - defer fake.patchClusterWithOperationStartedStatusMutex.RUnlock() - fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.RLock() - defer fake.patchCoreDNSImageRepositoryInKubeadmConfigMapMutex.RUnlock() - fake.patchImageRepositoryInKubeProxyDaemonSetMutex.RLock() - defer fake.patchImageRepositoryInKubeProxyDaemonSetMutex.RUnlock() - fake.patchK8SVersionToPacificClusterMutex.RLock() - defer fake.patchK8SVersionToPacificClusterMutex.RUnlock() - fake.patchKappControllerLastAppliedAnnotationMutex.RLock() - defer fake.patchKappControllerLastAppliedAnnotationMutex.RUnlock() - fake.patchResourceMutex.RLock() - defer fake.patchResourceMutex.RUnlock() - fake.removeCEIPTelemetryJobMutex.RLock() - defer fake.removeCEIPTelemetryJobMutex.RUnlock() - fake.removeMatchingMetadataFromResourcesMutex.RLock() - defer fake.removeMatchingMetadataFromResourcesMutex.RUnlock() - fake.scalePacificClusterControlPlaneMutex.RLock() - defer fake.scalePacificClusterControlPlaneMutex.RUnlock() - fake.scalePacificClusterWorkerNodesMutex.RLock() - defer fake.scalePacificClusterWorkerNodesMutex.RUnlock() - fake.updateAWSCNIIngressRulesMutex.RLock() - defer fake.updateAWSCNIIngressRulesMutex.RUnlock() - fake.updateAzureClusterIdentityMutex.RLock() - defer fake.updateAzureClusterIdentityMutex.RUnlock() - fake.updateAzureKCPMutex.RLock() - defer fake.updateAzureKCPMutex.RUnlock() - fake.updateCAPZControllerManagerDeploymentReplicasMutex.RLock() - defer fake.updateCAPZControllerManagerDeploymentReplicasMutex.RUnlock() - fake.updateCapvManagerBootstrapCredentialsSecretMutex.RLock() - defer fake.updateCapvManagerBootstrapCredentialsSecretMutex.RUnlock() - fake.updateCapzManagerBootstrapCredentialsSecretMutex.RLock() - defer fake.updateCapzManagerBootstrapCredentialsSecretMutex.RUnlock() - fake.updateReplicasMutex.RLock() - defer fake.updateReplicasMutex.RUnlock() - fake.updateResourceMutex.RLock() - defer fake.updateResourceMutex.RUnlock() - fake.updateResourceWithPollingMutex.RLock() - defer fake.updateResourceWithPollingMutex.RUnlock() - fake.updateVsphereCloudProviderCredentialsSecretMutex.RLock() - defer fake.updateVsphereCloudProviderCredentialsSecretMutex.RUnlock() - fake.updateVsphereCsiConfigSecretMutex.RLock() - defer fake.updateVsphereCsiConfigSecretMutex.RUnlock() - fake.updateVsphereIdentityRefSecretMutex.RLock() - defer fake.updateVsphereIdentityRefSecretMutex.RUnlock() - fake.useContextMutex.RLock() - defer fake.useContextMutex.RUnlock() - fake.verifyCLIPluginCRDMutex.RLock() - defer fake.verifyCLIPluginCRDMutex.RUnlock() - fake.verifyExistenceOfCRDMutex.RLock() - defer fake.verifyExistenceOfCRDMutex.RUnlock() - fake.waitForAVIResourceCleanUpMutex.RLock() - defer fake.waitForAVIResourceCleanUpMutex.RUnlock() - fake.waitForAutoscalerDeploymentMutex.RLock() - defer fake.waitForAutoscalerDeploymentMutex.RUnlock() - fake.waitForClusterDeletionMutex.RLock() - defer fake.waitForClusterDeletionMutex.RUnlock() - fake.waitForClusterInitializedMutex.RLock() - defer fake.waitForClusterInitializedMutex.RUnlock() - fake.waitForClusterReadyMutex.RLock() - defer fake.waitForClusterReadyMutex.RUnlock() - fake.waitForControlPlaneAvailableMutex.RLock() - defer fake.waitForControlPlaneAvailableMutex.RUnlock() - fake.waitForDeploymentMutex.RLock() - defer fake.waitForDeploymentMutex.RUnlock() - fake.waitForPacificClusterMutex.RLock() - defer fake.waitForPacificClusterMutex.RUnlock() - fake.waitForPacificClusterK8sVersionUpdateMutex.RLock() - defer fake.waitForPacificClusterK8sVersionUpdateMutex.RUnlock() - fake.waitForPackageInstallMutex.RLock() - defer fake.waitForPackageInstallMutex.RUnlock() - fake.waitK8sVersionUpdateForCPNodesMutex.RLock() - defer fake.waitK8sVersionUpdateForCPNodesMutex.RUnlock() - fake.waitK8sVersionUpdateForWorkerNodesMutex.RLock() - defer fake.waitK8sVersionUpdateForWorkerNodesMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *ClusterClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ clusterclient.Client = new(ClusterClient) diff --git a/tkg/fakes/clusterclientfactory.go b/tkg/fakes/clusterclientfactory.go deleted file mode 100644 index a5aa23591e..0000000000 --- a/tkg/fakes/clusterclientfactory.go +++ /dev/null @@ -1,120 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -type ClusterClientFactory struct { - NewClientStub func(string, string, clusterclient.Options) (clusterclient.Client, error) - newClientMutex sync.RWMutex - newClientArgsForCall []struct { - arg1 string - arg2 string - arg3 clusterclient.Options - } - newClientReturns struct { - result1 clusterclient.Client - result2 error - } - newClientReturnsOnCall map[int]struct { - result1 clusterclient.Client - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *ClusterClientFactory) NewClient(arg1 string, arg2 string, arg3 clusterclient.Options) (clusterclient.Client, error) { - fake.newClientMutex.Lock() - ret, specificReturn := fake.newClientReturnsOnCall[len(fake.newClientArgsForCall)] - fake.newClientArgsForCall = append(fake.newClientArgsForCall, struct { - arg1 string - arg2 string - arg3 clusterclient.Options - }{arg1, arg2, arg3}) - stub := fake.NewClientStub - fakeReturns := fake.newClientReturns - fake.recordInvocation("NewClient", []interface{}{arg1, arg2, arg3}) - fake.newClientMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ClusterClientFactory) NewClientCallCount() int { - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - return len(fake.newClientArgsForCall) -} - -func (fake *ClusterClientFactory) NewClientCalls(stub func(string, string, clusterclient.Options) (clusterclient.Client, error)) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = stub -} - -func (fake *ClusterClientFactory) NewClientArgsForCall(i int) (string, string, clusterclient.Options) { - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - argsForCall := fake.newClientArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *ClusterClientFactory) NewClientReturns(result1 clusterclient.Client, result2 error) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = nil - fake.newClientReturns = struct { - result1 clusterclient.Client - result2 error - }{result1, result2} -} - -func (fake *ClusterClientFactory) NewClientReturnsOnCall(i int, result1 clusterclient.Client, result2 error) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = nil - if fake.newClientReturnsOnCall == nil { - fake.newClientReturnsOnCall = make(map[int]struct { - result1 clusterclient.Client - result2 error - }) - } - fake.newClientReturnsOnCall[i] = struct { - result1 clusterclient.Client - result2 error - }{result1, result2} -} - -func (fake *ClusterClientFactory) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *ClusterClientFactory) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ clusterclient.ClusterClientFactory = new(ClusterClientFactory) diff --git a/tkg/fakes/config/aws_credentials b/tkg/fakes/config/aws_credentials deleted file mode 100644 index 71fb2562d6..0000000000 --- a/tkg/fakes/config/aws_credentials +++ /dev/null @@ -1,8 +0,0 @@ -[default] -aws_access_key_id = my_aws_access_key_id -aws_secret_access_key = my_aws_secret_access_key - -[test] -aws_access_key_id = test_aws_access_key_id -aws_secret_access_key = test_aws_secret_access_key -aws_session_token = test_aws_session_token \ No newline at end of file diff --git a/tkg/fakes/config/bom/tkg-bom-v1.3.0.yaml b/tkg/fakes/config/bom/tkg-bom-v1.3.0.yaml deleted file mode 100644 index d7452e6057..0000000000 --- a/tkg/fakes/config/bom/tkg-bom-v1.3.0.yaml +++ /dev/null @@ -1,302 +0,0 @@ -default: - k8sVersion: v1.19.3+vmware.1-tkg.1 -release: - version: 1.2.1-rc.1 -components: - kubernetes_autoscaler: - - version: v1.19.1+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.19.1_vmware.1 - metadata: - k8sVersion: v1.19.1+vmware.1 - - version: v1.18.3+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.18.3_vmware.1 - metadata: - k8sVersion: v1.18.3+vmware.1 - - version: v1.17.4+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.17.4_vmware.1 - metadata: - k8sVersion: v1.17.4+vmware.1 - calico_all: - - version: v3.11.3+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni-plugin - tag: v3.11.3_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.11.3_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.11.3_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon - tag: v3.11.3_vmware.1 - metadata: - ANY_NAME: ANY_INTERFACE - alertmanager: - - version: v0.20.0+vmware.1 - images: - alertmanagerImage: - imagePath: prometheus/alertmanager - tag: v0.11.1_vmware.5 - antrea: - - version: v0.11.1+vmware.5 - images: - antreaImage: - imagePath: antrea/antrea-debian - tag: v0.11.1_vmware.5 - cadvisorImage: - - version: v0.36.0+vmware.1 - images: - cadvisorImage: - imagePath: prometheus/cadvisor - tag: v0.36.0_vmware.1 - ccm_controller: - - version: v0.36.0+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.2.1_vmware.1 - cloud-provider-azure: - - version: v0.5.1+vmware.2 - cloud_provider_vsphere: - - version: v1.2.1+vmware.1 - cluster-api-ipam-provider-in-cluster: - - version: v0.1.0+vmware.2 - images: - capiIPAMProviderInClusterControllerImage: - imagePath: cluster-api/cluster-api-ipam-provider-in-cluster - tag: v0.1.0_vmware.2 - cluster-api-provider-azure: - - version: v0.4.8-47-gfbb2d55b+vmware.1 - images: - capzControllerImage: - imagePath: cluster-api/cluster-api-azure-controller - tag: v0.4.8-47-gfbb2d55b_vmware.1 - cluster_api: - - version: v0.3.11-13-ga74685ee9+vmware.1 - images: - capiControllerImage: - imagePath: cluster-api/cluster-api-controller - tag: v0.3.11-13-ga74685ee9_vmware.1 - cluster_api_aws: - - version: v0.6.3+vmware.1 - images: - capaControllerImage: - imagePath: cluster-api/cluster-api-aws-controller - tag: v0.6.3_vmware.1 - cluster_api_vsphere: - - version: v0.7.1+vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/cluster-api-vsphere-controller - tag: v0.7.1_vmware.1 - cluster_api_docker: - - version: v0.3.11-13-ga74685ee9_vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/capd-manager - tag: v0.3.11-13-ga74685ee9_vmware.1 - cni_plugins: - - version: v0.8.7+vmware.3 - configmap-reload: - - version: v0.3.0+vmware.1 - images: - configmapReloadImage: - imagePath: prometheus/configmap-reload - tag: v0.3.0_vmware.1 - containerd: - - version: v1.4.1+vmware.1 - contour: - - version: v1.8.1+vmware.1 - crash-diagnostics: - - version: v0.3.2+vmware.1 - cri_tools: - - version: v1.18.0+vmware.3 - csi_attacher: - - version: v2.0.0+vmware.2 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v2.0.0_vmware.2 - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.0.1_vmware.1 - csi_livenessprobe: - - version: v1.1.0+vmware.8 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v1.1.0_vmware.8 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.0.1_vmware.1 - csi_node_driver_registrar: - - version: v1.2.0+vmware.2 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v1.2.0_vmware.2 - csi_provisioner: - - version: v2.0.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v2.0.0_vmware.1 - dex: - - version: v2.27.0+vmware.1 - envoy: - - version: v1.15.0+vmware.1 - fluent-bit: - - version: v1.6.9+vmware.1 - gangway: - - version: v3.2.0+vmware.2 - grafana: - - version: v7.0.3+vmware.1 - harbor: - - version: v2.0.2+vmware.1 - jetstack_cert-manager: - - version: v0.16.1+vmware.1 - images: - certMgrControllerImage: - imagePath: cert-manager/cert-manager-controller - tag: v0.16.1_vmware.1 - certMgrInjectorImage: - imagePath: cert-manager/cert-manager-cainjector - tag: v0.16.1_vmware.1 - certMgrWebhookImage: - imagePath: cert-manager/cert-manager-webhook - tag: v0.16.1_vmware.1 - k8s-sidecar: - - version: v0.1.144+vmware.1 - images: - k8sSidecarImage: - imagePath: grafana/k8s-sidecar - tag: v0.1.144_vmware.1 - kapp_controller: - - version: v0.9.0+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.9.0_vmware.1 - kube-state-metrics: - - version: v1.9.5+vmware.1 - images: - kubeStateMetricsImage: - imagePath: prometheus/kube-state-metrics - tag: v1.9.5_vmware.1 - kube_vip: - - version: v0.2.0+vmware.1 - images: - kubeVipImage: - imagePath: kube-vip - tag: v0.2.0_vmware.1 - kube_rbac_proxy: - - version: v0.4.1+vmware.2 - images: - kubeProxy: - imagePath: kube-proxy - tag: v1.19.3_vmware.1 - kubeRbacProxyControllerImage: - imagePath: cluster-api/kube-rbac-proxy - tag: v0.4.1_vmware.2 - kubernetes-sigs_kind: - - version: v0.8.1-1.19.3+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.19.3_vmware.1 - prometheus: - - version: v2.18.1+vmware.1 - prometheus_node_exporter: - - version: v0.18.1+vmware.1 - pushgateway: - - version: v1.2.0+vmware.1 - metrics-server: - - version: v0.4.0+vmware.1 - sonobuoy: - - version: v0.19.0+vmware.1 - tanzu_core: - - version: v1.4.0-pre-alpha-1-296-gb098dcc - images: - providerTemplateImage: - imagePath: sandbox/tanzu_core/provider/provider-templates - tag: v1.4.0-pre-alpha-1-296-gb098dcc - tkrImage: - imagePath: sandbox/tanzu_core/tkr/tkr-controller-manager - tag: v1.4.0-pre-alpha-1-296-gb098dcc - tkg_extensions: - - version: v1.2.0+vmware.1 - tkg_telemetry: - - version: v1.2.0+vmware.1 - images: - tkgTelemetryImage: - imagePath: tkg-telemetry - tag: v1.2.0_vmware.1 - velero: - - version: v1.4.3+vmware.1 - velero-plugin-for-aws: - - version: v1.1.0+vmware.1 - velero-plugin-for-microsoft-azure: - - version: v1.1.0+vmware.1 - velero-plugin-for-vsphere: - - version: v1.0.2+vmware.1 - vsphere_csi_driver: - - version: v2.0.1+vmware.1 - -kindKubeadmConfigSpec: -- "kind: Cluster" -- "apiVersion: kind.x-k8s.io/v1alpha4" -- "kubeadmConfigPatches:" -- "- |" -- " apiVersion: kubeadm.k8s.io/v1beta2" -- " kind: ClusterConfiguration" -- " imageRepository: registry.tkg.vmware.run" -- " etcd:" -- " local:" -- " imageRepository: registry.tkg.vmware.run" -- " imageTag: v3.4.13_vmware.4" -- " dns:" -- " type: CoreDNS" -- " imageRepository: registry.tkg.vmware.run" -- " imageTag: v1.7.0_vmware.5" -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -extensions: - contour: - clusterTypes: - - workload - managedBy: user - dex: - clusterTypes: - - management - managedBy: user - fluent-bit: - clusterTypes: - - workload - managedBy: user - gangway: - clusterTypes: - - workload - managedBy: user - grafana: - clusterTypes: - - workload - managedBy: user - harbor: - clusterTypes: - - workload - managedBy: user - prometheus: - clusterTypes: - - workload - managedBy: user diff --git a/tkg/fakes/config/bom/tkg-bom-v1.3.1.yaml b/tkg/fakes/config/bom/tkg-bom-v1.3.1.yaml deleted file mode 100644 index 8b610e1fd0..0000000000 --- a/tkg/fakes/config/bom/tkg-bom-v1.3.1.yaml +++ /dev/null @@ -1,313 +0,0 @@ -default: - k8sVersion: v1.18.0+vmware.1-tkg.2 -release: - version: 1.2.1-rc.1 -components: - kubernetes_autoscaler: - - version: v1.19.1+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.19.1_vmware.1 - metadata: - k8sVersion: v1.19.1+vmware.1 - - version: v1.18.3+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.18.3_vmware.1 - metadata: - k8sVersion: v1.18.3+vmware.1 - - version: v1.18.3+vmware.2 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.18.3_vmware.2 - metadata: - k8sVersion: v1.18.3+vmware.2 - - version: v1.17.4+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.17.4_vmware.1 - metadata: - k8sVersion: v1.17.4+vmware.1 - calico_all: - - version: v3.11.3+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni-plugin - tag: v3.11.3_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.11.3_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.11.3_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon - tag: v3.11.3_vmware.1 - metadata: - ANY_NAME: ANY_INTERFACE - alertmanager: - - version: v0.20.0+vmware.1 - images: - alertmanagerImage: - imagePath: prometheus/alertmanager - tag: v0.11.1_vmware.5 - antrea: - - version: v0.11.1+vmware.5 - images: - antreaImage: - imagePath: antrea/antrea-debian - tag: v0.11.1_vmware.5 - cadvisorImage: - - version: v0.36.0+vmware.1 - images: - cadvisorImage: - imagePath: prometheus/cadvisor - tag: v0.36.0_vmware.1 - ccm_controller: - - version: v0.36.0+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.2.1_vmware.1 - cloud-provider-azure: - - version: v0.5.1+vmware.2 - cloud_provider_vsphere: - - version: v1.2.1+vmware.1 - cluster-api-ipam-provider-in-cluster: - - version: v0.1.0+vmware.2 - images: - capiIPAMProviderInClusterControllerImage: - imagePath: cluster-api/cluster-api-ipam-provider-in-cluster - tag: v0.1.0_vmware.2 - cluster-api-provider-azure: - - version: v0.4.8-47-gfbb2d55b+vmware.1 - images: - capzControllerImage: - imagePath: cluster-api/cluster-api-azure-controller - tag: v0.4.8-47-gfbb2d55b_vmware.1 - cluster_api: - - version: v0.3.11-13-ga74685ee9+vmware.1 - images: - capiControllerImage: - imagePath: cluster-api/cluster-api-controller - tag: v0.3.11-13-ga74685ee9_vmware.1 - cluster_api_aws: - - version: v0.6.3+vmware.1 - images: - capaControllerImage: - imagePath: cluster-api/cluster-api-aws-controller - tag: v0.6.3_vmware.1 - cluster_api_vsphere: - - version: v0.7.1+vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/cluster-api-vsphere-controller - tag: v0.7.1_vmware.1 - cluster_api_docker: - - version: v0.3.11-13-ga74685ee9_vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/capd-manager - tag: v0.3.11-13-ga74685ee9_vmware.1 - cni_plugins: - - version: v0.8.7+vmware.3 - configmap-reload: - - version: v0.3.0+vmware.1 - images: - configmapReloadImage: - imagePath: prometheus/configmap-reload - tag: v0.3.0_vmware.1 - containerd: - - version: v1.4.1+vmware.1 - contour: - - version: v1.8.1+vmware.1 - crash-diagnostics: - - version: v0.3.2+vmware.1 - cri_tools: - - version: v1.18.0+vmware.3 - csi_attacher: - - version: v2.0.0+vmware.2 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v2.0.0_vmware.2 - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.0.1_vmware.1 - csi_livenessprobe: - - version: v1.1.0+vmware.8 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v1.1.0_vmware.8 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.0.1_vmware.1 - csi_node_driver_registrar: - - version: v1.2.0+vmware.2 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v1.2.0_vmware.2 - csi_provisioner: - - version: v2.0.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v2.0.0_vmware.1 - dex: - - version: v2.27.0+vmware.1 - envoy: - - version: v1.15.0+vmware.1 - fluent-bit: - - version: v1.6.9+vmware.1 - gangway: - - version: v3.2.0+vmware.2 - grafana: - - version: v7.0.3+vmware.1 - harbor: - - version: v2.0.2+vmware.1 - jetstack_cert-manager: - - version: v0.16.1+vmware.1 - images: - certMgrControllerImage: - imagePath: cert-manager/cert-manager-controller - tag: v0.16.1_vmware.1 - certMgrInjectorImage: - imagePath: cert-manager/cert-manager-cainjector - tag: v0.16.1_vmware.1 - certMgrWebhookImage: - imagePath: cert-manager/cert-manager-webhook - tag: v0.16.1_vmware.1 - k8s-sidecar: - - version: v0.1.144+vmware.1 - images: - k8sSidecarImage: - imagePath: grafana/k8s-sidecar - tag: v0.1.144_vmware.1 - kapp_controller: - - version: v0.9.0+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.9.0_vmware.1 - kube-state-metrics: - - version: v1.9.5+vmware.1 - images: - kubeStateMetricsImage: - imagePath: prometheus/kube-state-metrics - tag: v1.9.5_vmware.1 - kube_vip: - - version: v0.2.0+vmware.1 - images: - kubeVipImage: - imagePath: kube-vip - tag: v0.2.0_vmware.1 - kube_rbac_proxy: - - version: v0.4.1+vmware.2 - images: - kubeProxy: - imagePath: kube-proxy - tag: v1.19.3_vmware.1 - kubeRbacProxyControllerImage: - imagePath: cluster-api/kube-rbac-proxy - tag: v0.4.1_vmware.2 - kubernetes-sigs_kind: - - version: v0.8.1-1.19.3+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.19.3_vmware.1 - prometheus: - - version: v2.18.1+vmware.1 - prometheus_node_exporter: - - version: v0.18.1+vmware.1 - pushgateway: - - version: v1.2.0+vmware.1 - metrics-server: - - version: v0.4.0+vmware.1 - sonobuoy: - - version: v0.19.0+vmware.1 - tanzu_core: - - version: v1.4.0-pre-alpha-1-296-gb098dcc - images: - providerTemplateImage: - imagePath: tanzu_core/provider/provider-templates - tag: v1.4.0-pre-alpha-1-296-gb098dcc - tkrImage: - imagePath: tanzu_core/tkr/tkr-controller-manager - tag: v1.4.0-pre-alpha-1-296-gb098dcc - tkg_extensions: - - version: v1.2.0+vmware.1 - tkg_telemetry: - - version: v1.2.0+vmware.1 - images: - tkgTelemetryImage: - imagePath: tkg-telemetry - tag: v1.2.0_vmware.1 - velero: - - version: v1.4.3+vmware.1 - velero-plugin-for-aws: - - version: v1.1.0+vmware.1 - velero-plugin-for-microsoft-azure: - - version: v1.1.0+vmware.1 - velero-plugin-for-vsphere: - - version: v1.0.2+vmware.1 - vsphere_csi_driver: - - version: v2.0.1+vmware.1 - -kindKubeadmConfigSpec: -- "kind: Cluster" -- "apiVersion: kind.x-k8s.io/v1alpha4" -- "kubeadmConfigPatches:" -- "- |" -- " apiVersion: kubeadm.k8s.io/v1beta2" -- " kind: ClusterConfiguration" -- " imageRepository: registry.tkg.vmware.run" -- " etcd:" -- " local:" -- " imageRepository: registry.tkg.vmware.run" -- " imageTag: v3.4.13_vmware.4" -- " dns:" -- " type: CoreDNS" -- " imageRepository: registry.tkg.vmware.run" -- " imageTag: v1.7.0_vmware.5" -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -extensions: - contour: - clusterTypes: - - workload - managedBy: user - dex: - clusterTypes: - - management - managedBy: user - fluent-bit: - clusterTypes: - - workload - managedBy: user - gangway: - clusterTypes: - - workload - managedBy: user - grafana: - clusterTypes: - - workload - managedBy: user - harbor: - clusterTypes: - - workload - managedBy: user - prometheus: - clusterTypes: - - workload - managedBy: user -tkr-bom: - imagePath: tkr-bom -tkr-compatibility: - imagePath: tkr-compatibility diff --git a/tkg/fakes/config/bom/tkg-bom-v2.1.0.yaml b/tkg/fakes/config/bom/tkg-bom-v2.1.0.yaml deleted file mode 100644 index b658a5f903..0000000000 --- a/tkg/fakes/config/bom/tkg-bom-v2.1.0.yaml +++ /dev/null @@ -1,313 +0,0 @@ -default: - k8sVersion: v1.18.0+vmware.1-tkg.2 -release: - version: 2.1.0 -components: - kubernetes_autoscaler: - - version: v1.19.1+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.19.1_vmware.1 - metadata: - k8sVersion: v1.19.1+vmware.1 - - version: v1.18.3+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.18.3_vmware.1 - metadata: - k8sVersion: v1.18.3+vmware.1 - - version: v1.18.3+vmware.2 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.18.3_vmware.2 - metadata: - k8sVersion: v1.18.3+vmware.2 - - version: v1.17.4+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.17.4_vmware.1 - metadata: - k8sVersion: v1.17.4+vmware.1 - calico_all: - - version: v3.11.3+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni-plugin - tag: v3.11.3_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.11.3_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.11.3_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon - tag: v3.11.3_vmware.1 - metadata: - ANY_NAME: ANY_INTERFACE - alertmanager: - - version: v0.20.0+vmware.1 - images: - alertmanagerImage: - imagePath: prometheus/alertmanager - tag: v0.11.1_vmware.5 - antrea: - - version: v0.11.1+vmware.5 - images: - antreaImage: - imagePath: antrea/antrea-debian - tag: v0.11.1_vmware.5 - cadvisorImage: - - version: v0.36.0+vmware.1 - images: - cadvisorImage: - imagePath: prometheus/cadvisor - tag: v0.36.0_vmware.1 - ccm_controller: - - version: v0.36.0+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.2.1_vmware.1 - cloud-provider-azure: - - version: v0.5.1+vmware.2 - cloud_provider_vsphere: - - version: v1.2.1+vmware.1 - cluster-api-ipam-provider-in-cluster: - - version: v0.1.0+vmware.2 - images: - capiIPAMProviderInClusterControllerImage: - imagePath: cluster-api/cluster-api-ipam-provider-in-cluster - tag: v0.1.0_vmware.2 - cluster-api-provider-azure: - - version: v0.4.8-47-gfbb2d55b+vmware.1 - images: - capzControllerImage: - imagePath: cluster-api/cluster-api-azure-controller - tag: v0.4.8-47-gfbb2d55b_vmware.1 - cluster_api: - - version: v0.3.11-13-ga74685ee9+vmware.1 - images: - capiControllerImage: - imagePath: cluster-api/cluster-api-controller - tag: v0.3.11-13-ga74685ee9_vmware.1 - cluster_api_aws: - - version: v0.6.3+vmware.1 - images: - capaControllerImage: - imagePath: cluster-api/cluster-api-aws-controller - tag: v0.6.3_vmware.1 - cluster_api_vsphere: - - version: v0.7.1+vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/cluster-api-vsphere-controller - tag: v0.7.1_vmware.1 - cluster_api_docker: - - version: v0.3.11-13-ga74685ee9_vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/capd-manager - tag: v0.3.11-13-ga74685ee9_vmware.1 - cni_plugins: - - version: v0.8.7+vmware.3 - configmap-reload: - - version: v0.3.0+vmware.1 - images: - configmapReloadImage: - imagePath: prometheus/configmap-reload - tag: v0.3.0_vmware.1 - containerd: - - version: v1.4.1+vmware.1 - contour: - - version: v1.8.1+vmware.1 - crash-diagnostics: - - version: v0.3.2+vmware.1 - cri_tools: - - version: v1.18.0+vmware.3 - csi_attacher: - - version: v2.0.0+vmware.2 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v2.0.0_vmware.2 - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.0.1_vmware.1 - csi_livenessprobe: - - version: v1.1.0+vmware.8 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v1.1.0_vmware.8 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.0.1_vmware.1 - csi_node_driver_registrar: - - version: v1.2.0+vmware.2 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v1.2.0_vmware.2 - csi_provisioner: - - version: v2.0.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v2.0.0_vmware.1 - dex: - - version: v2.27.0+vmware.1 - envoy: - - version: v1.15.0+vmware.1 - fluent-bit: - - version: v1.6.9+vmware.1 - gangway: - - version: v3.2.0+vmware.2 - grafana: - - version: v7.0.3+vmware.1 - harbor: - - version: v2.0.2+vmware.1 - jetstack_cert-manager: - - version: v0.16.1+vmware.1 - images: - certMgrControllerImage: - imagePath: cert-manager/cert-manager-controller - tag: v0.16.1_vmware.1 - certMgrInjectorImage: - imagePath: cert-manager/cert-manager-cainjector - tag: v0.16.1_vmware.1 - certMgrWebhookImage: - imagePath: cert-manager/cert-manager-webhook - tag: v0.16.1_vmware.1 - k8s-sidecar: - - version: v0.1.144+vmware.1 - images: - k8sSidecarImage: - imagePath: grafana/k8s-sidecar - tag: v0.1.144_vmware.1 - kapp_controller: - - version: v0.9.0+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.9.0_vmware.1 - kube-state-metrics: - - version: v1.9.5+vmware.1 - images: - kubeStateMetricsImage: - imagePath: prometheus/kube-state-metrics - tag: v1.9.5_vmware.1 - kube_vip: - - version: v0.2.0+vmware.1 - images: - kubeVipImage: - imagePath: kube-vip - tag: v0.2.0_vmware.1 - kube_rbac_proxy: - - version: v0.4.1+vmware.2 - images: - kubeProxy: - imagePath: kube-proxy - tag: v1.19.3_vmware.1 - kubeRbacProxyControllerImage: - imagePath: cluster-api/kube-rbac-proxy - tag: v0.4.1_vmware.2 - kubernetes-sigs_kind: - - version: v0.8.1-1.19.3+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.19.3_vmware.1 - prometheus: - - version: v2.18.1+vmware.1 - prometheus_node_exporter: - - version: v0.18.1+vmware.1 - pushgateway: - - version: v1.2.0+vmware.1 - metrics-server: - - version: v0.4.0+vmware.1 - sonobuoy: - - version: v0.19.0+vmware.1 - tanzu_core: - - version: v1.4.0-pre-alpha-1-296-gb098dcc - images: - providerTemplateImage: - imagePath: tanzu_core/provider/provider-templates - tag: v1.4.0-pre-alpha-1-296-gb098dcc - tkrImage: - imagePath: tanzu_core/tkr/tkr-controller-manager - tag: v1.4.0-pre-alpha-1-296-gb098dcc - tkg_extensions: - - version: v1.2.0+vmware.1 - tkg_telemetry: - - version: v1.2.0+vmware.1 - images: - tkgTelemetryImage: - imagePath: tkg-telemetry - tag: v1.2.0_vmware.1 - velero: - - version: v1.4.3+vmware.1 - velero-plugin-for-aws: - - version: v1.1.0+vmware.1 - velero-plugin-for-microsoft-azure: - - version: v1.1.0+vmware.1 - velero-plugin-for-vsphere: - - version: v1.0.2+vmware.1 - vsphere_csi_driver: - - version: v2.0.1+vmware.1 - -kindKubeadmConfigSpec: -- "kind: Cluster" -- "apiVersion: kind.x-k8s.io/v1alpha4" -- "kubeadmConfigPatches:" -- "- |" -- " apiVersion: kubeadm.k8s.io/v1beta2" -- " kind: ClusterConfiguration" -- " imageRepository: registry.tkg.vmware.run" -- " etcd:" -- " local:" -- " imageRepository: registry.tkg.vmware.run" -- " imageTag: v3.4.13_vmware.4" -- " dns:" -- " type: CoreDNS" -- " imageRepository: registry.tkg.vmware.run" -- " imageTag: v1.7.0_vmware.5" -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -extensions: - contour: - clusterTypes: - - workload - managedBy: user - dex: - clusterTypes: - - management - managedBy: user - fluent-bit: - clusterTypes: - - workload - managedBy: user - gangway: - clusterTypes: - - workload - managedBy: user - grafana: - clusterTypes: - - workload - managedBy: user - harbor: - clusterTypes: - - workload - managedBy: user - prometheus: - clusterTypes: - - workload - managedBy: user -tkr-bom: - imagePath: tkr-bom -tkr-compatibility: - imagePath: tkr-compatibility diff --git a/tkg/fakes/config/bom/tkg-bom-v3.0.0.yaml b/tkg/fakes/config/bom/tkg-bom-v3.0.0.yaml deleted file mode 100644 index e36de960a7..0000000000 --- a/tkg/fakes/config/bom/tkg-bom-v3.0.0.yaml +++ /dev/null @@ -1,313 +0,0 @@ -default: - k8sVersion: v1.18.0+vmware.1-tkg.2 -release: - version: 3.0.0 -components: - kubernetes_autoscaler: - - version: v1.19.1+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.19.1_vmware.1 - metadata: - k8sVersion: v1.19.1+vmware.1 - - version: v1.18.3+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.18.3_vmware.1 - metadata: - k8sVersion: v1.18.3+vmware.1 - - version: v1.18.3+vmware.2 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.18.3_vmware.2 - metadata: - k8sVersion: v1.18.3+vmware.2 - - version: v1.17.4+vmware.1 - images: - kubernetesAutoscalerImage: - imagePath: cluster-autoscaler - tag: v1.17.4_vmware.1 - metadata: - k8sVersion: v1.17.4+vmware.1 - calico_all: - - version: v3.11.3+vmware.1 - images: - calicoCniImage: - imagePath: calico-all/cni-plugin - tag: v3.11.3_vmware.1 - calicoKubecontrollerImage: - imagePath: calico-all/kube-controllers - tag: v3.11.3_vmware.1 - calicoNodeImage: - imagePath: calico-all/node - tag: v3.11.3_vmware.1 - calicoPodDaemonImage: - imagePath: calico-all/pod2daemon - tag: v3.11.3_vmware.1 - metadata: - ANY_NAME: ANY_INTERFACE - alertmanager: - - version: v0.20.0+vmware.1 - images: - alertmanagerImage: - imagePath: prometheus/alertmanager - tag: v0.11.1_vmware.5 - antrea: - - version: v0.11.1+vmware.5 - images: - antreaImage: - imagePath: antrea/antrea-debian - tag: v0.11.1_vmware.5 - cadvisorImage: - - version: v0.36.0+vmware.1 - images: - cadvisorImage: - imagePath: prometheus/cadvisor - tag: v0.36.0_vmware.1 - ccm_controller: - - version: v0.36.0+vmware.1 - images: - ccmControllerImage: - imagePath: ccm/manager - tag: v1.2.1_vmware.1 - cloud-provider-azure: - - version: v0.5.1+vmware.2 - cloud_provider_vsphere: - - version: v1.2.1+vmware.1 - cluster-api-ipam-provider-in-cluster: - - version: v0.1.0+vmware.2 - images: - capiIPAMProviderInClusterControllerImage: - imagePath: cluster-api/cluster-api-ipam-provider-in-cluster - tag: v0.1.0_vmware.2 - cluster-api-provider-azure: - - version: v0.4.8-47-gfbb2d55b+vmware.1 - images: - capzControllerImage: - imagePath: cluster-api/cluster-api-azure-controller - tag: v0.4.8-47-gfbb2d55b_vmware.1 - cluster_api: - - version: v0.3.11-13-ga74685ee9+vmware.1 - images: - capiControllerImage: - imagePath: cluster-api/cluster-api-controller - tag: v0.3.11-13-ga74685ee9_vmware.1 - cluster_api_aws: - - version: v0.6.3+vmware.1 - images: - capaControllerImage: - imagePath: cluster-api/cluster-api-aws-controller - tag: v0.6.3_vmware.1 - cluster_api_vsphere: - - version: v0.7.1+vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/cluster-api-vsphere-controller - tag: v0.7.1_vmware.1 - cluster_api_docker: - - version: v0.3.11-13-ga74685ee9_vmware.1 - images: - capvControllerImage: - imagePath: cluster-api/capd-manager - tag: v0.3.11-13-ga74685ee9_vmware.1 - cni_plugins: - - version: v0.8.7+vmware.3 - configmap-reload: - - version: v0.3.0+vmware.1 - images: - configmapReloadImage: - imagePath: prometheus/configmap-reload - tag: v0.3.0_vmware.1 - containerd: - - version: v1.4.1+vmware.1 - contour: - - version: v1.8.1+vmware.1 - crash-diagnostics: - - version: v0.3.2+vmware.1 - cri_tools: - - version: v1.18.0+vmware.3 - csi_attacher: - - version: v2.0.0+vmware.2 - images: - csiAttacherImage: - imagePath: csi/csi-attacher - tag: v2.0.0_vmware.2 - csiControllerImage: - imagePath: csi/vsphere-block-csi-driver - tag: v2.0.1_vmware.1 - csi_livenessprobe: - - version: v1.1.0+vmware.8 - images: - csiLivenessProbeImage: - imagePath: csi/csi-livenessprobe - tag: v1.1.0_vmware.8 - csiMetaDataSyncerImage: - imagePath: csi/volume-metadata-syncer - tag: v2.0.1_vmware.1 - csi_node_driver_registrar: - - version: v1.2.0+vmware.2 - images: - csiNodeDriverRegistrarImage: - imagePath: csi/csi-node-driver-registrar - tag: v1.2.0_vmware.2 - csi_provisioner: - - version: v2.0.0+vmware.1 - images: - csiProvisonerImage: - imagePath: csi/csi-provisioner - tag: v2.0.0_vmware.1 - dex: - - version: v2.27.0+vmware.1 - envoy: - - version: v1.15.0+vmware.1 - fluent-bit: - - version: v1.6.9+vmware.1 - gangway: - - version: v3.2.0+vmware.2 - grafana: - - version: v7.0.3+vmware.1 - harbor: - - version: v2.0.2+vmware.1 - jetstack_cert-manager: - - version: v0.16.1+vmware.1 - images: - certMgrControllerImage: - imagePath: cert-manager/cert-manager-controller - tag: v0.16.1_vmware.1 - certMgrInjectorImage: - imagePath: cert-manager/cert-manager-cainjector - tag: v0.16.1_vmware.1 - certMgrWebhookImage: - imagePath: cert-manager/cert-manager-webhook - tag: v0.16.1_vmware.1 - k8s-sidecar: - - version: v0.1.144+vmware.1 - images: - k8sSidecarImage: - imagePath: grafana/k8s-sidecar - tag: v0.1.144_vmware.1 - kapp_controller: - - version: v0.9.0+vmware.1 - images: - kappControllerImage: - imagePath: kapp-controller - tag: v0.9.0_vmware.1 - kube-state-metrics: - - version: v1.9.5+vmware.1 - images: - kubeStateMetricsImage: - imagePath: prometheus/kube-state-metrics - tag: v1.9.5_vmware.1 - kube_vip: - - version: v0.2.0+vmware.1 - images: - kubeVipImage: - imagePath: kube-vip - tag: v0.2.0_vmware.1 - kube_rbac_proxy: - - version: v0.4.1+vmware.2 - images: - kubeProxy: - imagePath: kube-proxy - tag: v1.19.3_vmware.1 - kubeRbacProxyControllerImage: - imagePath: cluster-api/kube-rbac-proxy - tag: v0.4.1_vmware.2 - kubernetes-sigs_kind: - - version: v0.8.1-1.19.3+vmware.1 - images: - kindNodeImage: - imagePath: kind/node - tag: v1.19.3_vmware.1 - prometheus: - - version: v2.18.1+vmware.1 - prometheus_node_exporter: - - version: v0.18.1+vmware.1 - pushgateway: - - version: v1.2.0+vmware.1 - metrics-server: - - version: v0.4.0+vmware.1 - sonobuoy: - - version: v0.19.0+vmware.1 - tanzu_core: - - version: v1.4.0-pre-alpha-1-296-gb098dcc - images: - providerTemplateImage: - imagePath: tanzu_core/provider/provider-templates - tag: v1.4.0-pre-alpha-1-296-gb098dcc - tkrImage: - imagePath: tanzu_core/tkr/tkr-controller-manager - tag: v1.4.0-pre-alpha-1-296-gb098dcc - tkg_extensions: - - version: v1.2.0+vmware.1 - tkg_telemetry: - - version: v1.2.0+vmware.1 - images: - tkgTelemetryImage: - imagePath: tkg-telemetry - tag: v1.2.0_vmware.1 - velero: - - version: v1.4.3+vmware.1 - velero-plugin-for-aws: - - version: v1.1.0+vmware.1 - velero-plugin-for-microsoft-azure: - - version: v1.1.0+vmware.1 - velero-plugin-for-vsphere: - - version: v1.0.2+vmware.1 - vsphere_csi_driver: - - version: v2.0.1+vmware.1 - -kindKubeadmConfigSpec: -- "kind: Cluster" -- "apiVersion: kind.x-k8s.io/v1alpha4" -- "kubeadmConfigPatches:" -- "- |" -- " apiVersion: kubeadm.k8s.io/v1beta2" -- " kind: ClusterConfiguration" -- " imageRepository: registry.tkg.vmware.run" -- " etcd:" -- " local:" -- " imageRepository: registry.tkg.vmware.run" -- " imageTag: v3.4.13_vmware.4" -- " dns:" -- " type: CoreDNS" -- " imageRepository: registry.tkg.vmware.run" -- " imageTag: v1.7.0_vmware.5" -imageConfig: - imageRepository: projects-stg.registry.vmware.com/tkg -extensions: - contour: - clusterTypes: - - workload - managedBy: user - dex: - clusterTypes: - - management - managedBy: user - fluent-bit: - clusterTypes: - - workload - managedBy: user - gangway: - clusterTypes: - - workload - managedBy: user - grafana: - clusterTypes: - - workload - managedBy: user - harbor: - clusterTypes: - - workload - managedBy: user - prometheus: - clusterTypes: - - workload - managedBy: user -tkr-bom: - imagePath: tkr-bom -tkr-compatibility: - imagePath: tkr-compatibility diff --git a/tkg/fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml b/tkg/fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml deleted file mode 100644 index cdcf1ba2dc..0000000000 --- a/tkg/fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml +++ /dev/null @@ -1,96 +0,0 @@ -release: - version: v1.18.0+vmware.1-tkg.2 -components: - etcd: - - version: v3.4.13+vmware.4 - images: - etcd: - imagePath: etcd - tag: v3.4.13_vmware.4 - metadata: - ANY_NAME: ANY_INTERFACE - ANT_NAME_1: ANY_INTERFACE - kubernetes: - - version: v1.18.0+vmware.1 - metadata: - kubeadmAPIVersion: kubeadm.k8s.io/v1beta2 - kindKubeadmAPIVersion: kind.x-k8s.io/v1alpha4 -kubeadmConfigSpec: - apiVersion: kubeadm.k8s.io/v1beta2 - kind: ClusterConfiguration - imageRepository: registry.tkg.vmware.run - kubernetesVersion: v1.18.0+vmware.1 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: registry.tkg.vmware.run - imageTag: v3.4.13_vmware.4 - extraArgs: - fake-arg: fake-arg-value - dns: - type: CoreDNS - imageRepository: registry.tkg.vmware.run - imageTag: v1.7.0_vmware.5 -imageConfig: - imageRepository: registry.tkg.vmware.run -ova: -- name: photon_ova - osinfo: - name: "photonos" - version: "1.1" - arch: "amd64" - version: "v1.18.0+vmware.1" - metadata: - ANY_NAME: ANY_INTERFACE -ami: - ap-northeast-1: - - id: ami-0b3606365e3b9dc63 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE - us-west-2: - - id: ami-03f483756fb3350c7 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE - - id: ami-0b3606365e3b9dc63 - osinfo: - name: "amazon" - version: "2" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE - us-east-1: - - id: ami-083e578fc4e8b5cc1 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE - us-east-2: - - id: ami-083e578fc4e8b5cc1 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE -azure: -- publisher: vmware-inc - offer: tkg-capi - sku: k8s-1dot18dot8-ubuntu-1804 - version: "2020.09.09" - thirdPartyImage: true - osinfo: - name: "windows" - version: "10.1706" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE diff --git a/tkg/fakes/config/bom/tkr-bom-v1.19.3+vmware.1-tkg.1.yaml b/tkg/fakes/config/bom/tkr-bom-v1.19.3+vmware.1-tkg.1.yaml deleted file mode 100644 index 6974e15c30..0000000000 --- a/tkg/fakes/config/bom/tkr-bom-v1.19.3+vmware.1-tkg.1.yaml +++ /dev/null @@ -1,79 +0,0 @@ -release: - version: v1.19.3+vmware.1-tkg.1 -components: - etcd: - - version: v3.4.13+vmware.4 - images: - etcd: - imagePath: etcd - tag: v3.4.13_vmware.4 - metadata: - ANY_NAME: ANY_INTERFACE - ANT_NAME_1: ANY_INTERFACE - kubernetes: - - version: v1.19.3+vmware.1 - metadata: - kubeadmAPIVersion: kubeadm.k8s.io/v1beta2 - kindKubeadmAPIVersion: kind.x-k8s.io/v1alpha4 -kubeadmConfigSpec: - apiVersion: kubeadm.k8s.io/v1beta2 - kind: ClusterConfiguration - imageRepository: registry.tkg.vmware.run - kubernetesVersion: v1.19.3+vmware.1 - etcd: - local: - dataDir: /var/lib/etcd - imageRepository: registry.tkg.vmware.run - imageTag: v3.4.13_vmware.4 - dns: - type: CoreDNS - imageRepository: registry.tkg.vmware.run - imageTag: v1.7.0_vmware.5 -imageConfig: - imageRepository: registry.tkg.vmware.run -ova: -- name: photon_ova - osinfo: - name: "photonos" - version: "1.1" - arch: "amd64" - version: "v1.19.3+vmware.1" - metadata: - ANY_NAME: ANY_INTERFACE -ami: - ap-northeast-1: - - id: ami-0b3606365e3b9dc63 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE - us-west-2: - - id: ami-03f483756fb3350c7 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE - us-east-1: - - id: ami-083e578fc4e8b5cc1 - osinfo: - name: "ubuntu" - version: "20.04" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE -azure: -- publisher: vmware-inc - offer: tkg-capi - sku: k8s-1dot19dot3-ubuntu-1804 - version: "2020.11.05" - thirdPartyImage: true - osinfo: - name: "windows" - version: "10.1706" - arch: "amd64" - metadata: - ANY_NAME: ANY_INTERFACE diff --git a/tkg/fakes/config/cluster1_clusterOnly.yaml b/tkg/fakes/config/cluster1_clusterOnly.yaml deleted file mode 100644 index 196919f534..0000000000 --- a/tkg/fakes/config/cluster1_clusterOnly.yaml +++ /dev/null @@ -1,92 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - annotations: - osInfo: ubuntu,20.04,amd64 - labels: - tanzuKubernetesRelease: v1.22.5---vmware.1-tkg.2-zshippable - tkg.tanzu.vmware.com/cluster-name: wcc2 - name: wcc2 - namespace: default -spec: - clusterNetwork: - pods: - cidrBlocks: - - 100.96.0.0/11 - services: - cidrBlocks: - - 100.64.0.0/13 - topology: - class: tkg-aws-default - controlPlane: - replicas: 1 - variables: - - name: CLUSTER_PLAN - value: devcc - - name: AWS_AMI_ID - value: "ami-0b12ea388b0c61c8f" - - name: AWS_REGION - value: us-west-2 - - name: AWS_NODE_AZ - value: us-west-2a - - name: AWS_VPC_ID - value: "" - - name: AWS_PRIVATE_SUBNET_ID - value: "" - - name: AWS_PUBLIC_SUBNET_ID - value: "" - - name: AWS_VPC_CIDR - value: 10.0.0.0/16 - - name: AWS_PRIVATE_NODE_CIDR - value: 10.0.16.0/20 - - name: AWS_PUBLIC_NODE_CIDR - value: 10.0.0.0/20 - - name: AWS_SECURITY_GROUP_APISERVER_LB - value: "" - - name: AWS_SECURITY_GROUP_BASTION - value: "" - - name: AWS_SECURITY_GROUP_CONTROLPLANE - value: "" - - name: AWS_SECURITY_GROUP_LB - value: "" - - name: AWS_SECURITY_GROUP_NODE - value: "" - - name: AWS_IDENTITY_REF_KIND - value: "" - - name: AWS_IDENTITY_REF_NAME - value: "" - - name: AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB - value: 80 - - name: AWS_NODE_OS_DISK_SIZE_GIB - value: 80 - - name: CONTROL_PLANE_MACHINE_TYPE - value: m3.xlarge - - name: NODE_MACHINE_TYPE - value: m3.xlarge - - name: AWS_SSH_KEY_NAME - value: default - - name: BASTION_HOST_ENABLED - value: false - - name: AWS_LOAD_BALANCER_SCHEME_INTERNAL - value: false - - name: TKG_CUSTOM_IMAGE_REPOSITORY - value: "" - - name: TKG_CUSTOM_IMAGE_REPOSITORY_HOSTNAME - value: projects-stg.registry.vmware.com - - name: TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY - value: true - - name: TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE - value: "" - - name: TKG_PROXY_CA_CERT - value: "" - - name: ENABLE_AUDIT_LOGGING - value: "" - version: v1.22.5+vmware.1 - workers: - machineDeployments: - - class: tkg-worker - failureDomain: us-west-2a - name: md-0 - replicas: 1 ---- - diff --git a/tkg/fakes/config/cluster1_config.yaml b/tkg/fakes/config/cluster1_config.yaml deleted file mode 100644 index 3aeee0eb94..0000000000 --- a/tkg/fakes/config/cluster1_config.yaml +++ /dev/null @@ -1,57 +0,0 @@ -AWS_AMI_ID: ami-019bba1fc71b17985 -AWS_NODE_AZ: us-west-2a -AWS_NODE_AZ_1: "" -AWS_NODE_AZ_2: "" -AWS_PRIVATE_NODE_CIDR: 10.0.16.0/20 -AWS_PRIVATE_NODE_CIDR_1: "" -AWS_PRIVATE_NODE_CIDR_2: "" -AWS_PRIVATE_SUBNET_ID: "" -AWS_PRIVATE_SUBNET_ID_1: "" -AWS_PRIVATE_SUBNET_ID_2: "" -AWS_PUBLIC_NODE_CIDR: 10.0.0.0/20 -AWS_PUBLIC_NODE_CIDR_1: "" -AWS_PUBLIC_NODE_CIDR_2: "" -AWS_PUBLIC_SUBNET_ID: "" -AWS_PUBLIC_SUBNET_ID_1: "" -AWS_PUBLIC_SUBNET_ID_2: "" -AWS_REGION: us-west-2 -AWS_SSH_KEY_NAME: default -AWS_VPC_CIDR: 10.0.0.0/16 -AWS_VPC_ID: "" -BASTION_HOST_ENABLED: "false" -CLUSTER_ANNOTATIONS: description:,location:, -CLUSTER_CIDR: 100.96.0.0/11 -CLUSTER_NAME: wcc1a -CLUSTER_PLAN: devcc -CONTROL_PLANE_MACHINE_TYPE: m3.xlarge -ENABLE_AUDIT_LOGGING: "" -ENABLE_CEIP_PARTICIPATION: "false" -ENABLE_MHC: "false" -IDENTITY_MANAGEMENT_TYPE: none -INFRASTRUCTURE_PROVIDER: aws -LDAP_BIND_DN: "" -LDAP_BIND_PASSWORD: "" -LDAP_GROUP_SEARCH_BASE_DN: "" -LDAP_GROUP_SEARCH_FILTER: "" -LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE: "" -LDAP_GROUP_SEARCH_NAME_ATTRIBUTE: cn -LDAP_GROUP_SEARCH_USER_ATTRIBUTE: DN -LDAP_HOST: "" -LDAP_ROOT_CA_DATA_B64: "" -LDAP_USER_SEARCH_BASE_DN: "" -LDAP_USER_SEARCH_FILTER: "" -LDAP_USER_SEARCH_NAME_ATTRIBUTE: "" -LDAP_USER_SEARCH_USERNAME: userPrincipalName -NODE_MACHINE_TYPE: m3.xlarge -OIDC_IDENTITY_PROVIDER_CLIENT_ID: "" -OIDC_IDENTITY_PROVIDER_CLIENT_SECRET: "" -OIDC_IDENTITY_PROVIDER_GROUPS_CLAIM: "" -OIDC_IDENTITY_PROVIDER_ISSUER_URL: "" -OIDC_IDENTITY_PROVIDER_NAME: "" -OIDC_IDENTITY_PROVIDER_SCOPES: "" -OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM: "" -OS_ARCH: amd64 -OS_NAME: ubuntu -OS_VERSION: "20.04" -SERVICE_CIDR: 100.64.0.0/13 -TKG_HTTP_PROXY_ENABLED: "false" diff --git a/tkg/fakes/config/cluster_aws.yaml b/tkg/fakes/config/cluster_aws.yaml deleted file mode 100644 index a14269c1f7..0000000000 --- a/tkg/fakes/config/cluster_aws.yaml +++ /dev/null @@ -1,156 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - annotations: - osInfo: ubuntu,20.04,amd64 - run.tanzu.vmware.com/resolve-tkr: "" - labels: - tkg.tanzu.vmware.com/cluster-name: aws-workload-cluster1 - name: aws-workload-cluster1 # // CLUSTER_NAME - namespace: default # NAMESPACE -spec: - clusterNetwork: - pods: - cidrBlocks: - - 2002::1234:abcd:ffff:c0a8:101/64 # CLUSTER_CIDR - - 100.96.0.0/11 # CLUSTER_CIDR - services: - cidrBlocks: - - 2002::1234:abcd:ffff:c0a8:101/64 - - 100.64.0.0/18 # SERVICE_CIDR - topology: - class: tkg-aws-default # CLUSTER_CLASS - controlPlane: - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: ami-region=us-east-1,os-name=ubuntu - replicas: 1 # CONTROL_PLANE_MACHINE_COUNT - variables: - - name: network - value: - ipv6Primary: true #TKG_IP_FAMILY (if true expect TKG_IP_FAMILY="ipv6,ipv4") - subnets: - - az: us-east-1a #AWS_NODE_AZ - private: - cidr: 10.0.0.0/24 #AWS_PRIVATE_NODE_CIDR - id: idValue #AWS_PRIVATE_SUBNET_ID - public: - cidr: 10.1.1.0/24 #AWS_PUBLIC_NODE_CIDR - id: idValue #AWS_PUBLIC_SUBNET_ID - - az: us-west-1a # AWS_NODE_AZ_1 - private: - cidr: 10.0.2.0/24 #AWS_PRIVATE_NODE_CIDR_1 - id: idValue #AWS_PRIVATE_SUBNET_ID_1 - public: - cidr: 10.0.3.0/24 #AWS_PUBLIC_NODE_CIDR_1 - id: idValue #AWS_PUBLIC_SUBNET_ID_1 - - az: us-east-1b #AWS_NODE_AZ_2 - private: - cidr: 10.0.4.0/24 #AWS_PRIVATE_NODE_CIDR_2 - id: idValuePrivate2 #AWS_PRIVATE_SUBNET_ID_2 - public: - cidr: 10.0.5.0/24 #AWS_PUBLIC_NODE_CIDR_2 - id: idValue #AWS_PUBLIC_SUBNET_ID_2 - vpc: - cidr: 10.0.0.0/16 # AWS_VPC_CIDR - existingID: vpcID11 # AWS_VPC_ID - securityGroupOverrides: - bastion: bationValue # AWS_SECURITY_GROUP_BASTION - apiServerLB: apiserverlb # AWS_SECURITY_GROUP_APISERVER_LB - lb: lbvalue # AWS_SECURITY_GROUP_LB - controlPlane: controlplaneValue # AWS_SECURITY_GROUP_CONTROLPLANE - node: securitygroupNode # AWS_SECURITY_GROUP_NODE - - name: proxy - value: #TKG_HTTP_PROXY_ENABLED (under this if any value is not null then set TKG_HTTP_PROXY_ENABLED) - httpProxy: http://10.0.200.100 #TKG_HTTP_PROXY - httpsProxy: http://10.0.200.100 #TKG_HTTPS_PROXY - noProxy: #TKG_NO_PROXY - - 127.0.0.1 - - 100.64.0.0/18 - - 10.0.0.0/16 - - 169.254.0.0/16 - - .svc.cluster.local - - .svc - - localhost - - name: imageRepository - value: - host: imageRepositoryHost #TKG_CUSTOM_IMAGE_REPOSITORY - tlsCertificateValidation: true #TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY - - name: clusterRole #TKG_CLUSTER_ROLE - value: workload - - name: auditLogging - value: - enabled: true #ENABLE_AUDIT_LOGGING - - name: trust - value: - additionalTrustedCAs: - - name: proxy - data: "trust.proxy.val" #TKG_PROXY_CA_CERT - - name: imageRepository - data: "trust.imageRepository.val" #TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE - - name: apiServerPort - value: 9090 #CLUSTER_API_SERVER_PORT - - name: bastion - value: - enabled: true #BASTION_HOST_ENABLED - - name: identityRef - value: - name: identityrefname #AWS_IDENTITY_REF_NAME - kind: AWSClusterRoleIdentity #AWS_IDENTITY_REF_KIND - - name: worker - value: - instanceType: m5.large #NODE_MACHINE_TYPE - rootVolume: - sizeGiB: 80 # AWS_NODE_OS_DISK_SIZE_GIB - - name: controlPlane - value: - instanceType: t3.large #CONTROL_PLANE_MACHINE_TYPE - rootVolume: - sizeGiB: 80 #AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB - - name: TKR_DATA - value: - v1.23.5+vmware.1: - kubernetesSpec: - coredns: - imageTag: v1.8.6_vmware.5 - etcd: - imageTag: v3.5.2_vmware.4 - imageRepository: projects.registry.vmware.com/tkg - version: v1.23.5+vmware.1 - labels: - os-arch: amd64 - os-name: ubuntu - os-type: linux - osImageRef: - id: dummy-ami-id - region: dummy-region - version: v1.23.5+vmware.1 # KUBERNETES_VERSION - workers: - machineDeployments: - - class: tkg-worker - failureDomain: us-east-1a - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: ami-region=us-east-1,os-name=ubuntu - name: md-0 - replicas: 1 #WORKER_MACHINE_COUNT_0 - - class: tkg-worker - failureDomain: us-east-1b - name: md-1 - replicas: 2 #WORKER_MACHINE_COUNT_1 - variables: - overrides: - - name: worker - value: - instanceType: worker1 # NODE_MACHINE_TYPE_1 - - class: tkg-worker - failureDomain: us-east-1c - name: md-2 - replicas: 3 #WORKER_MACHINE_COUNT_2 - variables: - overrides: - - name: worker - value: - instanceType: worker2 # NODE_MACHINE_TYPE_2 ---- - diff --git a/tkg/fakes/config/cluster_aws_emptyClass.yaml b/tkg/fakes/config/cluster_aws_emptyClass.yaml deleted file mode 100644 index 39e473ad7b..0000000000 --- a/tkg/fakes/config/cluster_aws_emptyClass.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: aws-workload-cluster1 - namespace: namespace-test1 -spec: - topology: - class: diff --git a/tkg/fakes/config/cluster_aws_incorrectClass.yaml b/tkg/fakes/config/cluster_aws_incorrectClass.yaml deleted file mode 100644 index db3f013f02..0000000000 --- a/tkg/fakes/config/cluster_aws_incorrectClass.yaml +++ /dev/null @@ -1,153 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - annotations: - osInfo: ubuntu,20.04,amd64 - run.tanzu.vmware.com/resolve-tkr: "" - labels: - tkg.tanzu.vmware.com/cluster-name: testcluster - name: testcluster # // CLUSTER_NAME - namespace: default # NAMESPACE -spec: - clusterNetwork: - pods: - cidrBlocks: - - 100.96.0.0/11 # CLUSTER_CIDR - services: - cidrBlocks: - - 100.64.0.0/18 # SERVICE_CIDR - topology: - class: tkg-UNKNOWN-default # CLUSTER_CLASS - controlPlane: - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: ami-region=us-east-1,os-name=ubuntu - replicas: 1 # CONTROL_PLANE_MACHINE_COUNT - variables: - - name: network - value: - ipv6Primary: true #TKG_IP_FAMILY (if true set TKG_IP_FAMILY="ipv6,ipv4") - proxy: #TKG_HTTP_PROXY (under this if any value is not null then set TKG_HTTP_PROXY) - httpProxy: http://10.0.200.100 #TKG_HTTP_PROXY - httpsProxy: http://10.0.200.100 #TKG_HTTPS_PROXY - noProxy: #TKG_NO_PROXY - - 127.0.0.1 - - 100.64.0.0/18 - - 10.0.0.0/16 - - 169.254.0.0/16 - - .svc.cluster.local - - .svc - - localhost - subnets: - - az: us-east-1a #AWS_NODE_AZ - private: - cidr: 10.0.0.0/24 #AWS_PRIVATE_NODE_CIDR - id: idValue #AWS_PRIVATE_SUBNET_ID - public: - cidr: 10.0.1.0/24 #AWS_PUBLIC_NODE_CIDR - id: idValue #AWS_PUBLIC_SUBNET_ID - - az: us-west-1a # AWS_NODE_AZ_1 - private: - cidr: 10.0.2.0/24 #AWS_PRIVATE_NODE_CIDR_1 - id: idValue #AWS_PRIVATE_SUBNET_ID_1 - public: - cidr: 10.0.3.0/24 #AWS_PUBLIC_NODE_CIDR_1 - id: idValue #AWS_PUBLIC_SUBNET_ID_1 - - az: us-east-1b #AWS_NODE_AZ_2 - private: - cidr: 10.0.4.0/24 #AWS_PRIVATE_NODE_CIDR_2 - id: idValue #AWS_PRIVATE_SUBNET_ID_2 - public: - cidr: 10.0.5.0/24 #AWS_PUBLIC_NODE_CIDR_2 - id: idValue #AWS_PUBLIC_SUBNET_ID_2 - vpc: - cidr: 10.0.0.0/16 # AWS_VPC_CIDR - existingID: "vpcID" # AWS_VPC_ID - securityGroupOverrides: - bastion: bationValue # AWS_SECURITY_GROUP_BASTION - apiServerLB: apiserverlb # AWS_SECURITY_GROUP_APISERVER_LB - lb: lbvalue # AWS_SECURITY_GROUP_LB - controlPlane: controlplaneValue # AWS_SECURITY_GROUP_CONTROLPLANE - node: securitygroupNode # AWS_SECURITY_GROUP_NODE - - name: imageRepository - value: - host: imageRepositoryHost #TKG_CUSTOM_IMAGE_REPOSITORY - tlsCertificateValidation: true #TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY - - name: clusterRole #TKG_CLUSTER_ROLE - value: workload - - name: auditLogging - value: - enabled: true #ENABLE_AUDIT_LOGGING - - name: trust - value: - additionalTrustedCAs: - - name: proxy - data: "trust.proxy.val" #TKG_PROXY_CA_CERT - - name: imageRepository - data: "trust.imageRepository.val" #TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE - - name: apiServerPort - value: 9090 #CLUSTER_API_SERVER_PORT - - name: bastion - value: - enabled: true #BASTION_HOST_ENABLED - - name: identityRef - value: - name: identityrefname #AWS_IDENTITY_REF_NAME - kind: AWSClusterRoleIdentity #AWS_IDENTITY_REF_KIND - - name: worker - value: - instanceType: m5.large #NODE_MACHINE_TYPE - rootVolume: - sizeGiB: 80 # AWS_NODE_OS_DISK_SIZE_GIB - - name: controlPlane - value: - instanceType: t3.large #CONTROL_PLANE_MACHINE_TYPE - rootVolume: - sizeGiB: 80 #AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB - - name: TKR_DATA - value: - v1.23.5+vmware.1: - kubernetesSpec: - coredns: - imageTag: v1.8.6_vmware.5 - etcd: - imageTag: v3.5.2_vmware.4 - imageRepository: projects.registry.vmware.com/tkg - version: v1.23.5+vmware.1 - labels: - os-arch: amd64 - os-name: ubuntu - os-type: linux - osImageRef: - id: dummy-ami-id - region: dummy-region - version: v1.23.5+vmware.1 # KUBERNETES_VERSION - workers: - machineDeployments: - - class: tkg-worker - failureDomain: us-east-1a - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: ami-region=us-east-1,os-name=ubuntu - name: md-0 - replicas: 1 #WORKER_MACHINE_COUNT_0 - - class: tkg-worker - failureDomain: us-east-1b - name: md-1 - replicas: 2 #WORKER_MACHINE_COUNT_1 - variables: - overrides: - - name: worker - value: - instanceType: worker1 # NODE_MACHINE_TYPE_1 - - class: tkg-worker - failureDomain: us-east-1c - name: md-2 - replicas: 3 #WORKER_MACHINE_COUNT_2 - variables: - overrides: - - name: worker - value: - instanceType: worker2 # NODE_MACHINE_TYPE_2 ---- - diff --git a/tkg/fakes/config/cluster_aws_multipleObjects.yaml b/tkg/fakes/config/cluster_aws_multipleObjects.yaml deleted file mode 100644 index b5453833dc..0000000000 --- a/tkg/fakes/config/cluster_aws_multipleObjects.yaml +++ /dev/null @@ -1,190 +0,0 @@ -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AWSMachineTemplate -metadata: - name: tkg-aws-controlplane-template - namespace: aws-workload-cluster1 -spec: - template: - spec: - ami: - id: - iamInstanceProfile: control-plane.tkg.cloud.vmware.com - instanceType: - rootVolume: - size: 80 - sshKeyName: ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - annotations: - osInfo: ubuntu,20.04,amd64 - run.tanzu.vmware.com/resolve-tkr: "" - labels: - tkg.tanzu.vmware.com/cluster-name: aws-workload-cluster1 - name: aws-workload-cluster1 # // CLUSTER_NAME - namespace: default # NAMESPACE -spec: - clusterNetwork: - pods: - cidrBlocks: - - 100.96.0.0/11 # CLUSTER_CIDR - - 100.96.0.0/16 # CLUSTER_CIDR - services: - cidrBlocks: - - 100.64.0.0/18 # SERVICE_CIDR - topology: - class: tkg-aws-default # CLUSTER_CLASS - controlPlane: - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: ami-region=us-east-1,os-name=ubuntu - replicas: 1 # CONTROL_PLANE_MACHINE_COUNT - variables: - - name: network - value: - ipv6Primary: false #TKG_IP_FAMILY - subnets: - - az: us-east-1a #AWS_NODE_AZ - private: - cidr: 10.0.0.0/24 #AWS_PRIVATE_NODE_CIDR - id: idValue #AWS_PRIVATE_SUBNET_ID - public: - cidr: 10.1.1.0/24 #AWS_PUBLIC_NODE_CIDR - id: idValue #AWS_PUBLIC_SUBNET_ID - - az: us-west-1a # AWS_NODE_AZ_1 - private: - cidr: 10.0.2.0/24 #AWS_PRIVATE_NODE_CIDR_1 - id: idValue #AWS_PRIVATE_SUBNET_ID_1 - public: - cidr: 10.0.3.0/24 #AWS_PUBLIC_NODE_CIDR_1 - id: idValue #AWS_PUBLIC_SUBNET_ID_1 - - az: us-east-1b #AWS_NODE_AZ_2 - private: - cidr: 10.0.4.0/24 #AWS_PRIVATE_NODE_CIDR_2 - id: idValuePrivate2 #AWS_PRIVATE_SUBNET_ID_2 - public: - cidr: 10.0.5.0/24 #AWS_PUBLIC_NODE_CIDR_2 - id: idValue #AWS_PUBLIC_SUBNET_ID_2 - vpc: - cidr: 10.0.0.0/16 # AWS_VPC_CIDR - existingID: "vpcID" # AWS_VPC_ID - securityGroupOverrides: - bastion: bationValue # AWS_SECURITY_GROUP_BASTION - apiServerLB: apiserverlb # AWS_SECURITY_GROUP_APISERVER_LB - lb: lbvalue # AWS_SECURITY_GROUP_LB - controlPlane: controlplaneValue # AWS_SECURITY_GROUP_CONTROLPLANE - node: securitygroupNode # AWS_SECURITY_GROUP_NODE - - name: proxy - value: #TKG_HTTP_PROXY_ENABLED (under this if any value is not null then set TKG_HTTP_PROXY_ENABLED) - httpProxy: http://10.0.200.100 #TKG_HTTP_PROXY - httpsProxy: http://10.0.200.100 #TKG_HTTPS_PROXY - noProxy: #TKG_NO_PROXY - - 127.0.0.1 - - 100.64.0.0/18 - - 10.0.0.0/16 - - 169.254.0.0/16 - - .svc.cluster.local - - .svc - - localhost - - name: imageRepository - value: - host: imageRepositoryHost #TKG_CUSTOM_IMAGE_REPOSITORY - tlsCertificateValidation: true #TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY - - name: clusterRole #TKG_CLUSTER_ROLE - value: workload - - name: auditLogging - value: - enabled: true #ENABLE_AUDIT_LOGGING - - name: trust - value: - additionalTrustedCAs: - - name: proxy - data: "trust.proxy.val" #TKG_PROXY_CA_CERT - - name: imageRepository - data: "trust.imageRepository.val" #TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE - - name: apiServerPort - value: 9090 #CLUSTER_API_SERVER_PORT - - name: bastion - value: - enabled: true #BASTION_HOST_ENABLED - - name: identityRef - value: - name: identityrefname #AWS_IDENTITY_REF_NAME - kind: AWSClusterRoleIdentity #AWS_IDENTITY_REF_KIND - - name: worker - value: - instanceType: m5.large #NODE_MACHINE_TYPE - rootVolume: - sizeGiB: 80 # AWS_NODE_OS_DISK_SIZE_GIB - - name: controlPlane - value: - instanceType: t3.large #CONTROL_PLANE_MACHINE_TYPE - rootVolume: - sizeGiB: 80 #AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB - - name: TKR_DATA - value: - v1.23.5+vmware.1: - kubernetesSpec: - coredns: - imageTag: v1.8.6_vmware.5 - etcd: - imageTag: v3.5.2_vmware.4 - imageRepository: projects.registry.vmware.com/tkg - version: v1.23.5+vmware.1 - labels: - os-arch: amd64 - os-name: ubuntu - os-type: linux - osImageRef: - id: dummy-ami-id - region: dummy-region - version: v1.23.5+vmware.1 # KUBERNETES_VERSION - workers: - machineDeployments: - - class: tkg-worker - failureDomain: us-east-1a - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: ami-region=us-east-1,os-name=ubuntu - name: md-0 - replicas: 1 #WORKER_MACHINE_COUNT_0 - - class: tkg-worker - failureDomain: us-east-1b - name: md-1 - replicas: 2 #WORKER_MACHINE_COUNT_1 - variables: - overrides: - - name: worker - value: - instanceType: worker1 # NODE_MACHINE_TYPE_1 - - class: tkg-worker - failureDomain: us-east-1c - name: md-2 - replicas: 3 #WORKER_MACHINE_COUNT_2 - variables: - overrides: - - name: worker - value: - instanceType: worker2 # NODE_MACHINE_TYPE_2 ---- -apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 -kind: AWSClusterTemplate -metadata: - name: aws-cluster-template - namespace: default -spec: - template: - spec: - bastion: - enabled: true - network: - subnets: - - availabilityZone: - cidrBlock: - id: - vpc: - cidrBlock: - id: - region: - sshKeyName: diff --git a/tkg/fakes/config/cluster_azure.yaml b/tkg/fakes/config/cluster_azure.yaml deleted file mode 100644 index cb18e08ec3..0000000000 --- a/tkg/fakes/config/cluster_azure.yaml +++ /dev/null @@ -1,169 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - annotations: - osInfo: ubuntu,18.04,amd64 - labels: - tanzuKubernetesRelease: v0.0.0---marketplace-image - tkg.tanzu.vmware.com/cluster-name: testcluster - name: azure-workload-cluster1 - namespace: namespace-test1 -spec: - clusterNetwork: - pods: - cidrBlocks: #CLUSTER_CIDR - - 10.10.10.10/18 - services: - cidrBlocks: #SERVICE_CIDR - - 10.10.10.10/16 - topology: - class: tkg-azure-default #CLUSTER_CLASS - controlPlane: - replicas: 5 #CONTROL_PLANE_MACHINE_COUNT - variables: - - name: network - value: - ipv6Primary: false #TKG_IP_FAMILY (if true expect TKG_IP_FAMILY="ipv6,ipv4") - vnet: - cidrBlocks: #AZURE_VNET_CIDR - - 10.0.0.0/8 - - 10.0.0.0/16 - name: azure-vnet-name #AZURE_VNET_NAME - resourceGroup: azure-vnet-resource-group #AZURE_VNET_RESOURCE_GROUP - - name: proxy - value: #TKG_HTTP_PROXY_ENABLED (under this if any value is not null then set TKG_HTTP_PROXY_ENABLED) - httpProxy: http://10.0.200.100 #TKG_HTTP_PROXY - httpsProxy: http://10.0.200.100 #TKG_HTTPS_PROXY - noProxy: #TKG_NO_PROXY - - 127.0.0.1 - - 100.64.0.0/18 - - 10.0.0.0/16 - - 169.254.0.0/16 - - .svc.cluster.local - - .svc - - localhost - - name: imageRepository - value: - host: imageRepositoryHost #TKG_CUSTOM_IMAGE_REPOSITORY - tlsCertificateValidation: true #TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY - - name: clusterRole #TKG_CLUSTER_ROLE - value: workload - - name: auditLogging - value: - enabled: false #ENABLE_AUDIT_LOGGING - - name: trust - value: - additionalTrustedCAs: - - name: proxy - data: trust.proxy.val #TKG_PROXY_CA_CERT - - name: imageRepository - data: trust.imageRepository.val #TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE - - name: apiServerPort - value: 9090 #CLUSTER_API_SERVER_PORT - - name: location #AZURE_LOCATION - value: westus - - name: resourceGroup #AZURE_RESOURCE_GROUP - value: "" - - name: subscriptionID #AZURE_SUBSCRIPTION_ID - value: 6c2a2ce1-649f-9d9k-a19c-c729h3cf6126 - - name: environment #AZURE_ENVIRONMENT - value: AzurePublicCloud - - name: sshPublicKey #AZURE_SSH_PUBLIC_KEY_B64 - value: c3NoLXJzYSBB - - name: frontendPrivateIP #AZURE_FRONTEND_PRIVATE_IP - value: 22.22.22.22 - - name: customTags #AZURE_CUSTOM_TAGS - value: azureCustomTagsValue - - name: acceleratedNetworking #AZURE_ENABLE_ACCELERATED_NETWORKING - value: - enabled: true - - name: privateCluster #AZURE_ENABLE_PRIVATE_CLUSTER - value: - enabled: false - - name: identityRef - value: - name: test-identity1 #AZURE_IDENTITY_NAME - namespace: test-ns1 #AZURE_IDENTITY_NAMESPACE - - name: controlPlane - value: - vmSize: i3.xlarge #AZURE_CONTROL_PLANE_MACHINE_TYPE - dataDisks: - - sizeGiB: 256 #AZURE_CONTROL_PLANE_DATA_DISK_SIZE_GIB - osDisk: - sizeGiB: 128 #AZURE_CONTROL_PLANE_OS_DISK_SIZE_GIB - storageAccountType: Premium_LRS #AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE - subnet: - name: subnetName #AZURE_CONTROL_PLANE_SUBNET_NAME - cidr: 10.0.0.0/24 #AZURE_CONTROL_PLANE_SUBNET_CIDR - securityGroup: SecurityGroup #AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP - outboundLB: - enabled: true #AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB - frontendIPCount: 3 #AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT - - name: worker - value: - vmSize: m5.xlarge #AZURE_NODE_MACHINE_TYPE - osDisk: - sizeGiB: 128 #AZURE_NODE_OS_DISK_SIZE_GIB - storageAccountType: Premium_LRS #AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE - dataDisks: - - sizeGiB: 256 #AZURE_NODE_DATA_DISK_SIZE_GIB - subnet: - name: workerSubnetName #AZURE_NODE_SUBNET_NAME - cidr: 10.1.0.0/16 #AZURE_NODE_SUBNET_CIDR - securityGroup: SecurityGroup #AZURE_NODE_SUBNET_SECURITY_GROUP - outboundLB: - enabled: true #AZURE_ENABLE_NODE_OUTBOUND_LB - frontendIPCount: 1 #AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT - idleTimeoutInMinutes: 8 #AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES - - - name: TKR_DATA - value: - v1.23.5+vmware.1: - kubernetesSpec: - coredns: - imageTag: v1.8.6_vmware.5 - etcd: - imageTag: v3.5.2_vmware.4 - imageRepository: projects.registry.vmware.com/tkg - version: v1.23.5+vmware.1 - labels: - os-arch: amd64 - os-name: ubuntu - os-type: linux - osImageRef: - offer: dummy-offer - publisher: dummy-publisher - sku: dummy-sku - thirdPartyImage: dummy-third-party-image - version: dummy-version - version: v1.23.5+vmware.1 #KUBERNETES_VERSION - - workers: - machineDeployments: - - class: tkg-worker - failureDomain: us-east-1a #AZURE_NODE_AZ - metadata: - annotations: - run.tanzu.vmware.com/resolve-os-image: ami-region=us-east-1,os-name=ubuntu - name: md-0 - replicas: 1 #WORKER_MACHINE_COUNT_0 - - class: tkg-worker - failureDomain: us-east-1b #AZURE_NODE_AZ_1 - name: md-1 - replicas: 2 #WORKER_MACHINE_COUNT_1 - variables: - overrides: - - name: worker - value: - vmSize: worker1 # NODE_MACHINE_TYPE_1 - - class: tkg-worker - failureDomain: us-east-1c #AZURE_NODE_AZ_2 - name: md-2 - replicas: 3 #WORKER_MACHINE_COUNT_2 - variables: - overrides: - - name: worker - value: - vmSize: worker2 # NODE_MACHINE_TYPE_2 ---- - diff --git a/tkg/fakes/config/cluster_tkgs.yaml b/tkg/fakes/config/cluster_tkgs.yaml deleted file mode 100644 index 95810208cb..0000000000 --- a/tkg/fakes/config/cluster_tkgs.yaml +++ /dev/null @@ -1,33 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: cc01 - namespace: ns01 -spec: - clusterNetwork: - services: - cidrBlocks: ["198.51.100.0/12"] - pods: - cidrBlocks: ["192.0.2.0/16"] - serviceDomain: "cluster.local" - topology: - class: tanzukubernetescluster #tkg-vsphere-default [aws|azure|vsphere] - version: v1.22.8+vmware.1-tkg.2-zshippable #check what tkr is available on your testbed - controlPlane: - replicas: 1 - workers: - # node pools - machineDeployments: - - class: node-pool - name: node-pool-1 - replicas: 1 - - class: node-pool - name: node-pool-2 - replicas: 1 - failureDomain: foo-az - variables: - - name: vmClass - value: best-effort-xsmall - # default storageclass for control plane and node pool - - name: storageClass - value: wcpglobal-storage-profile diff --git a/tkg/fakes/config/cluster_tkgs_tkc.yaml b/tkg/fakes/config/cluster_tkgs_tkc.yaml deleted file mode 100644 index 60ac46453b..0000000000 --- a/tkg/fakes/config/cluster_tkgs_tkc.yaml +++ /dev/null @@ -1,15 +0,0 @@ -NAMESPACE: ns01 -CLUSTER_CIDR: 100.96.0.0/11 -CLUSTER_NAME: tkc-01 -CLUSTER_PLAN: dev -INFRASTRUCTURE_PROVIDER: tkg-service-vsphere -OS_ARCH: amd64 -OS_NAME: ubuntu -OS_VERSION: "20.04" -SERVICE_CIDR: 100.64.0.0/13 -SERVICE_DOMAIN: "cluster.local" -CONTROL_PLANE_STORAGE_CLASS: "wcpglobal-storage-profile" -WORKER_STORAGE_CLASS: "wcpglobal-storage-profile" -CONTROL_PLANE_VM_CLASS: "best-effort-xsmall" -WORKER_VM_CLASS: "best-effort-xsmall" -NODE_POOL_0_NAME: "workers-name-overwrite" diff --git a/tkg/fakes/config/cluster_vsphere.yaml b/tkg/fakes/config/cluster_vsphere.yaml deleted file mode 100644 index e56299ea31..0000000000 --- a/tkg/fakes/config/cluster_vsphere.yaml +++ /dev/null @@ -1,144 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - annotations: - osInfo: ",," - labels: - cluster-role.tkg.tanzu.vmware.com/management: "" - tanzuKubernetesRelease: v1.23.5---vmware.1-tkg.1-zshippable - tkg.tanzu.vmware.com/cluster-name: c1 - name: vsphere-workload-cluster1 # CLUSTER_NAME - namespace: namespace-test1 -spec: - clusterNetwork: - pods: - cidrBlocks: # CLUSTER_CIDR - - 10.10.10.10/18 - services: - cidrBlocks: # SERVICE_CIDR - - 100.64.0.0/18 - topology: - class: tkg-vsphere-default # CLUSTER_CLASS - controlPlane: - replicas: 5 # CONTROL_PLANE_MACHINE_COUNT - variables: - - name: network - value: - ipv6Primary: false #TKG_IP_FAMILY (if true expect TKG_IP_FAMILY="ipv6,ipv4") - addressesFromPools: - - apiGroup: ipam.cluster.x-k8s.io - kind: InClusterIPPool - name: inclusterpool - - name: proxy - value: #TKG_HTTP_PROXY_ENABLED (under this if any value is not null then set TKG_HTTP_PROXY_ENABLED) - httpProxy: http://10.0.200.100 #TKG_HTTP_PROXY - httpsProxy: http://10.0.200.100 #TKG_HTTPS_PROXY - noProxy: #TKG_NO_PROXY - - 127.0.0.1 - - 100.64.0.0/18 - - 10.0.0.0/16 - - 169.254.0.0/16 - - .svc.cluster.local - - .svc - - localhost - - name: imageRepository - value: - host: imageRepositoryHost #TKG_CUSTOM_IMAGE_REPOSITORY - tlsCertificateValidation: true #TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY - - name: clusterRole #TKG_CLUSTER_ROLE - value: workload - - name: auditLogging - value: - enabled: false #ENABLE_AUDIT_LOGGING - - name: trust - value: - additionalTrustedCAs: - - name: proxy - data: LS0tLS= #TKG_PROXY_CA_CERT - - name: imageRepository - data: trust.imageRepository.val #TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE - - name: apiServerPort - value: 443 #CLUSTER_API_SERVER_PORT - - name: apiServerEndpoint # VSPHERE_CONTROL_PLANE_ENDPOINT - value: http://10.0.200.101 - - name: vipNetworkInterface # VIP_NETWORK_INTERFACE - value: networkinter - - name: aviAPIServerHAProvider # AVI_CONTROL_PLANE_HA_PROVIDER - value: true - - name: vcenter - value: - cloneMode: fullClone # VSPHERE_CLONE_MODE - network: TESTNETWORK # VSPHERE_NETWORK - datacenter: /dc0 # VSPHERE_DATACENTER - datastore: ds1 # VSPHERE_DATASTORE - folder: vm0 # VSPHERE_FOLDER - resourcePool: /dc0/host/cluster0/Resources/rp0 # VSPHERE_RESOURCE_POOL - storagePolicyID: "" # VSPHERE_STORAGE_POLICY_ID - server: some.fqdn.com # VSPHERE_SERVER - tlsThumbprint: dummythumbprint # VSPHERE_TLS_THUMBPRINT - template: photon-3-v1.19.3+vmware.1 # VSPHERE_TEMPLATE - - name: user - value: - sshAuthorizedKeys: # VSPHERE_SSH_AUTHORIZED_KEY - - authkeyss11 - - authkeyss22 - - name: controlPlane - value: - machine: - diskGiB: 40 # VSPHERE_CONTROL_PLANE_DISK_GIB - memoryMiB: 8192 # VSPHERE_CONTROL_PLANE_MEM_MIB - numCPUs: 2 # VSPHERE_CONTROL_PLANE_NUM_CPUS - network: - nameservers: 100.64.0.0 # CONTROL_PLANE_NODE_NAMESERVERS - - name: worker - value: - count: 3 # WORKER_MACHINE_COUNT -- Removed - machine: - diskGiB: 40 # VSPHERE_WORKER_DISK_GIB - memoryMiB: 16384 # VSPHERE_WORKER_MEM_MIB - numCPUs: 4 # VSPHERE_WORKER_NUM_CPUS - network: - nameservers: 100.64.0.0 # WORKER_NODE_NAMESERVERS - - name: TKR_DATA - value: - v1.21.2: - kubernetesSpec: - coredns: - imageTag: v1.8.6_vmware.5 - etcd: - imageTag: v3.5.2_vmware.4 - imageRepository: projects.registry.vmware.com/tkg - kube-vip: - imageTag: dummy-kube-vip-image-tag - version: v1.21.2 - labels: - os-arch: amd64 - os-name: ubuntu - os-type: linux - - name: kubeVipLoadBalancerProvider - value: false - - version: v1.21.2 - workers: - machineDeployments: - - class: tkg-worker - failureDomain: us-east-1a # VSPHERE_AZ_0 - name: md-0 - replicas: 1 #WORKER_MACHINE_COUNT - - class: tkg-worker - failureDomain: us-east-1b # VSPHERE_AZ_1 - name: md-1 - replicas: 2 # WORKER_MACHINE_COUNT_1 - - class: tkg-worker - failureDomain: us-east-1c # VSPHERE_AZ_2 - name: md-2 - replicas: 3 # WORKER_MACHINE_COUNT_2 ---- -apiVersion: v1 -kind: Secret -metadata: - name: vsphere-workload-cluster1 - namespace: namespace-test1 -stringData: - password: Admin!23 - username: administrator@vsphere.local diff --git a/tkg/fakes/config/cluster_vsphere_insecure.yaml b/tkg/fakes/config/cluster_vsphere_insecure.yaml deleted file mode 100644 index 2863c00985..0000000000 --- a/tkg/fakes/config/cluster_vsphere_insecure.yaml +++ /dev/null @@ -1,144 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - annotations: - osInfo: ",," - labels: - cluster-role.tkg.tanzu.vmware.com/management: "" - tanzuKubernetesRelease: v1.23.5---vmware.1-tkg.1-zshippable - tkg.tanzu.vmware.com/cluster-name: c1 - name: vsphere-workload-cluster1 # CLUSTER_NAME - namespace: namespace-test1 -spec: - clusterNetwork: - pods: - cidrBlocks: # CLUSTER_CIDR - - 10.10.10.10/18 - services: - cidrBlocks: # SERVICE_CIDR - - 100.64.0.0/18 - topology: - class: tkg-vsphere-default # CLUSTER_CLASS - controlPlane: - replicas: 5 # CONTROL_PLANE_MACHINE_COUNT - variables: - - name: network - value: - ipv6Primary: false #TKG_IP_FAMILY (if true expect TKG_IP_FAMILY="ipv6,ipv4") - addressesFromPools: - - apiGroup: ipam.cluster.x-k8s.io - kind: InClusterIPPool - name: inclusterpool - - name: proxy - value: #TKG_HTTP_PROXY_ENABLED (under this if any value is not null then set TKG_HTTP_PROXY_ENABLED) - httpProxy: http://10.0.200.100 #TKG_HTTP_PROXY - httpsProxy: http://10.0.200.100 #TKG_HTTPS_PROXY - noProxy: #TKG_NO_PROXY - - 127.0.0.1 - - 100.64.0.0/18 - - 10.0.0.0/16 - - 169.254.0.0/16 - - .svc.cluster.local - - .svc - - localhost - - name: imageRepository - value: - host: imageRepositoryHost #TKG_CUSTOM_IMAGE_REPOSITORY - tlsCertificateValidation: true #TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY - - name: clusterRole #TKG_CLUSTER_ROLE - value: workload - - name: auditLogging - value: - enabled: false #ENABLE_AUDIT_LOGGING - - name: trust - value: - additionalTrustedCAs: - - name: proxy - data: LS0tLS= #TKG_PROXY_CA_CERT - - name: imageRepository - data: trust.imageRepository.val #TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE - - name: apiServerPort - value: 443 #CLUSTER_API_SERVER_PORT - - name: apiServerEndpoint # VSPHERE_CONTROL_PLANE_ENDPOINT - value: http://10.0.200.101 - - name: vipNetworkInterface # VIP_NETWORK_INTERFACE - value: networkinter - - name: aviAPIServerHAProvider # AVI_CONTROL_PLANE_HA_PROVIDER - value: true - - name: vcenter - value: - cloneMode: fullClone # VSPHERE_CLONE_MODE - network: TESTNETWORK # VSPHERE_NETWORK - datacenter: /dc0 # VSPHERE_DATACENTER - datastore: ds1 # VSPHERE_DATASTORE - folder: vm0 # VSPHERE_FOLDER - resourcePool: /dc0/host/cluster0/Resources/rp0 # VSPHERE_RESOURCE_POOL - storagePolicyID: "" # VSPHERE_STORAGE_POLICY_ID - server: some.fqdn.com # VSPHERE_SERVER - tlsThumbprint: "" # VSPHERE_TLS_THUMBPRINT - template: photon-3-v1.19.3+vmware.1 # VSPHERE_TEMPLATE - - name: user - value: - sshAuthorizedKeys: # VSPHERE_SSH_AUTHORIZED_KEY - - authkeyss11 - - authkeyss22 - - name: controlPlane - value: - machine: - diskGiB: 40 # VSPHERE_CONTROL_PLANE_DISK_GIB - memoryMiB: 8192 # VSPHERE_CONTROL_PLANE_MEM_MIB - numCPUs: 2 # VSPHERE_CONTROL_PLANE_NUM_CPUS - network: - nameservers: 100.64.0.0 # CONTROL_PLANE_NODE_NAMESERVERS - - name: worker - value: - count: 3 # WORKER_MACHINE_COUNT -- Removed - machine: - diskGiB: 40 # VSPHERE_WORKER_DISK_GIB - memoryMiB: 16384 # VSPHERE_WORKER_MEM_MIB - numCPUs: 4 # VSPHERE_WORKER_NUM_CPUS - network: - nameservers: 100.64.0.0 # WORKER_NODE_NAMESERVERS - - name: TKR_DATA - value: - v1.21.2: - kubernetesSpec: - coredns: - imageTag: v1.8.6_vmware.5 - etcd: - imageTag: v3.5.2_vmware.4 - imageRepository: projects.registry.vmware.com/tkg - kube-vip: - imageTag: dummy-kube-vip-image-tag - version: v1.21.2 - labels: - os-arch: amd64 - os-name: ubuntu - os-type: linux - - name: kubeVipLoadBalancerProvider - value: false - - version: v1.21.2 - workers: - machineDeployments: - - class: tkg-worker - failureDomain: us-east-1a # VSPHERE_AZ_0 - name: md-0 - replicas: 1 #WORKER_MACHINE_COUNT - - class: tkg-worker - failureDomain: us-east-1b # VSPHERE_AZ_1 - name: md-1 - replicas: 2 # WORKER_MACHINE_COUNT_1 - - class: tkg-worker - failureDomain: us-east-1c # VSPHERE_AZ_2 - name: md-2 - replicas: 3 # WORKER_MACHINE_COUNT_2 ---- -apiVersion: v1 -kind: Secret -metadata: - name: vsphere-workload-cluster1 - namespace: namespace-test1 -stringData: - password: Admin!23 - username: administrator@vsphere.local diff --git a/tkg/fakes/config/cluster_vsphere_snc.yaml b/tkg/fakes/config/cluster_vsphere_snc.yaml deleted file mode 100644 index ce4c31abaa..0000000000 --- a/tkg/fakes/config/cluster_vsphere_snc.yaml +++ /dev/null @@ -1,47 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: workload-vsphere-credential - namespace: default -stringData: - password: Admin!23 - username: administrator@vsphere.local ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - annotations: - osInfo: ",," - labels: - cluster-role.tkg.tanzu.vmware.com/management: "" - tanzuKubernetesRelease: v1.23.5---vmware.1-tkg.1-zshippable - tkg.tanzu.vmware.com/cluster-name: c1 - name: vsphere-workload-cluster1 # CLUSTER_NAME - namespace: namespace-test1 -spec: - clusterNetwork: - pods: - cidrBlocks: # CLUSTER_CIDR - - 10.10.10.10/18 - services: - cidrBlocks: # SERVICE_CIDR - - 100.64.0.0/18 - topology: - class: tkg-vsphere-default # CLUSTER_CLASS - controlPlane: - replicas: 1 # CONTROL_PLANE_MACHINE_COUNT - variables: - - name: controlPlaneTaint - value: false - version: v1.21.2 - workers: - machineDeployments: ---- -apiVersion: v1 -kind: Secret -metadata: - name: workload-vsphere-credential - namespace: default -stringData: - password: Admin!23 - username: administrator@vsphere.local diff --git a/tkg/fakes/config/cluster_vsphere_snc_cp_taint_true.yaml b/tkg/fakes/config/cluster_vsphere_snc_cp_taint_true.yaml deleted file mode 100644 index b709291194..0000000000 --- a/tkg/fakes/config/cluster_vsphere_snc_cp_taint_true.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - annotations: - osInfo: ",," - labels: - cluster-role.tkg.tanzu.vmware.com/management: "" - tanzuKubernetesRelease: v1.23.5---vmware.1-tkg.1-zshippable - tkg.tanzu.vmware.com/cluster-name: c1 - name: vsphere-workload-cluster1 # CLUSTER_NAME - namespace: namespace-test1 -spec: - clusterNetwork: - pods: - cidrBlocks: # CLUSTER_CIDR - - 10.10.10.10/18 - services: - cidrBlocks: # SERVICE_CIDR - - 100.64.0.0/18 - topology: - class: tkg-vsphere-default # CLUSTER_CLASS - controlPlane: - replicas: 1 # CONTROL_PLANE_MACHINE_COUNT - variables: - - name: controlPlaneTaint - value: true - version: v1.21.2 diff --git a/tkg/fakes/config/cluster_vsphere_snc_invalid_cp_taint.yaml b/tkg/fakes/config/cluster_vsphere_snc_invalid_cp_taint.yaml deleted file mode 100644 index a0e94a23f1..0000000000 --- a/tkg/fakes/config/cluster_vsphere_snc_invalid_cp_taint.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - annotations: - osInfo: ",," - labels: - cluster-role.tkg.tanzu.vmware.com/management: "" - tanzuKubernetesRelease: v1.23.5---vmware.1-tkg.1-zshippable - tkg.tanzu.vmware.com/cluster-name: c1 - name: vsphere-workload-cluster1 # CLUSTER_NAME - namespace: namespace-test1 -spec: - clusterNetwork: - pods: - cidrBlocks: # CLUSTER_CIDR - - 10.10.10.10/18 - services: - cidrBlocks: # SERVICE_CIDR - - 100.64.0.0/18 - topology: - class: tkg-vsphere-default # CLUSTER_CLASS - controlPlane: - replicas: 1 # CONTROL_PLANE_MACHINE_COUNT - variables: - - name: controlPlaneTaint - value: invalid control plane taint - version: v1.21.2 diff --git a/tkg/fakes/config/cluster_vsphere_snc_omit_workers.yaml b/tkg/fakes/config/cluster_vsphere_snc_omit_workers.yaml deleted file mode 100644 index ad76618f0c..0000000000 --- a/tkg/fakes/config/cluster_vsphere_snc_omit_workers.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - annotations: - osInfo: ",," - labels: - cluster-role.tkg.tanzu.vmware.com/management: "" - tanzuKubernetesRelease: v1.23.5---vmware.1-tkg.1-zshippable - tkg.tanzu.vmware.com/cluster-name: c1 - name: vsphere-workload-cluster1 # CLUSTER_NAME - namespace: namespace-test1 -spec: - clusterNetwork: - pods: - cidrBlocks: # CLUSTER_CIDR - - 10.10.10.10/18 - services: - cidrBlocks: # SERVICE_CIDR - - 100.64.0.0/18 - topology: - class: tkg-vsphere-default # CLUSTER_CLASS - controlPlane: - replicas: 1 # CONTROL_PLANE_MACHINE_COUNT - variables: - - name: controlPlaneTaint - value: true - - version: v1.21.2 diff --git a/tkg/fakes/config/clusterbootstrap.yaml b/tkg/fakes/config/clusterbootstrap.yaml deleted file mode 100644 index 7321b55e49..0000000000 --- a/tkg/fakes/config/clusterbootstrap.yaml +++ /dev/null @@ -1,91 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - creationTimestamp: "2022-07-21T21:03:00Z" - finalizers: - - tkg.tanzu.vmware.com/addon - generation: 2 - name: cc18 - namespace: ns01 - ownerReferences: - - apiVersion: cluster.x-k8s.io/v1beta1 - blockOwnerDeletion: true - controller: true - kind: Cluster - name: cc18 - uid: 0d3151d0-dbce-46f1-b580-5cd7a0b77488 - resourceVersion: "4003994" - uid: be1e1877-9209-4202-8ab1-361eb67b9652 -spec: - additionalPackages: - - refName: guest-cluster-auth-service.tanzu.vmware.com.1.0.0+tkg.1-zshippable - valuesFrom: - secretRef: cc18-guest-cluster-auth-service-data-values - - refName: metrics-server.tanzu.vmware.com.0.6.1+vmware.1-tkg.1-zshippable - - refName: secretgen-controller.tanzu.vmware.com.0.9.1+vmware.1-tkg.1-zshippable - - refName: pinniped.tanzu.vmware.com.0.12.1+vmware.1-tkg.1-zshippable - valuesFrom: - secretRef: cc18-pinniped-package - - refName: capabilities.tanzu.vmware.com.0.25.0-dev-12-g9305a725+vmware.1 - cni: - refName: antrea.tanzu.vmware.com.1.5.2+vmware.3-tkg.1-advanced-zshippable - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: cc18-antrea-package - cpi: - refName: vsphere-cpi.tanzu.vmware.com.1.23.1+vmware.1-tkg.1-zshippable - valuesFrom: - providerRef: - apiGroup: cpi.tanzu.vmware.com - kind: VSphereCPIConfig - name: cc18-vsphere-cpi-package - csi: - refName: vsphere-pv-csi.tanzu.vmware.com.2.4.0+vmware.1-tkg.1-zshippable - valuesFrom: - providerRef: - apiGroup: csi.tanzu.vmware.com - kind: VSphereCSIConfig - name: cc18-vsphere-pv-csi-package - kapp: - refName: kapp-controller.tanzu.vmware.com.0.38.4+vmware.1-tkg.1-zshippable - valuesFrom: - providerRef: - apiGroup: run.tanzu.vmware.com - kind: KappControllerConfig - name: cc18-kapp-controller-package - paused: false -status: - conditions: - - lastTransitionTime: "2022-07-21T21:09:57Z" - status: "True" - type: Antrea-ReconcileSucceeded - - lastTransitionTime: "2022-07-21T21:55:32Z" - message: |- - kapp: Error: waiting on reconcile deployment/tanzu-capabilities-controller-manager (apps/v1) namespace: tkg-system: - Finished unsuccessfully (Deployment is not progressing: ProgressDeadlineExceeded (message: ReplicaSet "tanzu-capabilities-controller-manager-67948789df" has timed out progressing.)) - status: "True" - type: Capabilities-ReconcileFailed - - lastTransitionTime: "2022-07-21T21:07:11Z" - status: "True" - type: Guest-Cluster-Auth-Service-ReconcileSucceeded - - lastTransitionTime: "2022-07-21T21:08:43Z" - status: "True" - type: Kapp-Controller-ReconcileSucceeded - - lastTransitionTime: "2022-07-21T21:10:42Z" - status: "True" - type: Metrics-Server-ReconcileSucceeded - - lastTransitionTime: "2022-07-21T21:08:00Z" - status: "True" - type: Pinniped-ReconcileSucceeded - - lastTransitionTime: "2022-07-21T21:10:18Z" - status: "True" - type: Secretgen-Controller-ReconcileSucceeded - - lastTransitionTime: "2022-07-21T21:08:08Z" - status: "True" - type: Vsphere-Cpi-ReconcileSucceeded - - lastTransitionTime: "2022-07-21T21:09:11Z" - status: "True" - type: Vsphere-Pv-Csi-ReconcileSucceeded - resolvedTKR: v1.23.5---vmware.1-tkg.1-zshippable diff --git a/tkg/fakes/config/config.yaml b/tkg/fakes/config/config.yaml deleted file mode 100644 index 4cf199818b..0000000000 --- a/tkg/fakes/config/config.yaml +++ /dev/null @@ -1,27 +0,0 @@ -providers: - - # add a custom provider - name: "my-infra-provider" - url: "https://github.com/myorg/myrepo/releases/latest/infrastructure_components.yaml" - type: "InfrastructureProvider" - - name: "cluster-api" # override a pre-defined provider - url: "https://github.com/myorg/myforkofclusterapi/releases/latest/core_components.yaml" - type: "CoreProvider" - - name: aws - url: /Users/dummy/.tkg/providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: /Users/dummy/.tkg/providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: /Users/dummy/.tkg/providers/infrastructure-vsphere/v0.7.0/infrastructure-components.yaml - type: InfrastructureProvider - -# Values for environment variable substitution -AWS_B64ENCODED_CREDENTIALS: XXXXXXXX -VSPHERE_SERVER: "10.10.10.10" -KUBERNETES_VERSION: v1.16.0 -BAR: bar -AWS_VPC_ID: VPC-XXXXXXX -VSPHERE_RESOURCE_POOL: "*/cluster365/Resources" -VSPHERE_DATACENTER: dc-0 -FOO: new-foo diff --git a/tkg/fakes/config/config2.yaml b/tkg/fakes/config/config2.yaml deleted file mode 100644 index 774501e17c..0000000000 --- a/tkg/fakes/config/config2.yaml +++ /dev/null @@ -1,34 +0,0 @@ -tkg: - regions: - - name: regional-cluster-1 - context: user1@regional-cluster-1-context - file: path/to/kubeconfig - - name: regional-cluster-2 - context: user1@regional-cluster-2-context - file: path/to/kubeconfig - - name: regional-cluster-2 - context: user2@regional-cluster-2-context - file: path/to/kubeconfig - current-region-context: "user2@regional-cluster-2-context" -# Values for environment variable substitution -AWS_B64ENCODED_CREDENTIALS: XXXXXXXX -KUBERNETES_VERSION: v1.16.0 -BAR: bar -FOO: foo - -AWS_REGION: us-east-2 -AWS_NODE_AZ: us-west-2a -VSPHERE_SSH_AUTHORIZED_KEY: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCs1kKExApUX5sQy6DKfO5bP79ynG2LtKqc8N9m/wC9jswSVAmEpSAna8NJaY0LIla/Lov7NRAvot1P9ITNnjbsVwSZe0w/aclLHctzsjpGtgYchW+PWQRreFW2as4zfRqQHAlsIB3+xgZTsgFa4v1/xWv6a2yGsa8Yf4bchGgqzrpuUI97peqoFQdNbdpnKAc4x+1AaBvvVE3wP5NbnLjVprQjgkCgidr9RUhQLxZMZOV3Y3b8CiPOXnbNn9BIER36ka3u83so+zC4dc194woTHgyM4ebAMFDvVfvTCNTsYGJ4kelC5E6QwX+Z3tNQw8HuR8GgfkdFvZAZrfFlcEV6QaT8NJ332yyJrplczalbaWPq3VQchCDx0KNCda4JCyopDzqzYAneCfYk2VCvDagZWO32ZQr4qcBYWb+iR52QxMBlm5QCdP2EaspDKBZCirEcBJNT/gJ3PhTSZ3RtchjLd9O6MQ7l0z65UKfzGddAJKwAWPFNHRp5oJyv/aJa6BCLwZGy0ct4ykwHfJ+CpewJwCHoaCToPBTmdSbDYJbalWv0NNc5gR7Q8cXriDKSaY+QXVao8kOuxhNj/cI9TAPid7Mp7sHFVKM+/7osdzL9Lwn53JGvaOWCm0pwh78GSfyEgePcQOpzqcYm5OUOTkQPGlg7k0NKtYsXKnIM2kVSpQ== test's comment here -VSPHERE_RESOURCE_POOL: "*/Resources" -VSPHERE_DATACENTER: dc-0 -VSPHERE_MEM_MIB: 2048 -images: - cert-manager: - repository: registry.tkg.vmware.run/cert-manager - tag: v0.11.0_vmware.1 - dummy-image: - repository: registry.tkg.vmware.run/dummy - tag: v0.11.0_vmware.1 -azure-image: - v1.18.0+vmware.1: - id: /random/image/id diff --git a/tkg/fakes/config/config3.yaml b/tkg/fakes/config/config3.yaml deleted file mode 100644 index fde6de6c1f..0000000000 --- a/tkg/fakes/config/config3.yaml +++ /dev/null @@ -1,36 +0,0 @@ -tkg: - regions: - - name: regional-cluster-1 - context: user1@regional-cluster-1-context - file: path/to/kubeconfig - - name: regional-cluster-2 - context: user1@regional-cluster-2-context - file: path/to/kubeconfig - - name: regional-cluster-2 - context: user2@regional-cluster-2-context - file: path/to/kubeconfig - current-region-context: user1@regional-cluster-1-context -providers: - - # add a custom provider - name: "my-infra-provider" - url: "https://github.com/myorg/myrepo/releases/latest/infrastructure_components.yaml" - type: "InfrastructureProvider" - - name: "cluster-api" # override a pre-defined provider - url: "https://github.com/myorg/myforkofclusterapi/releases/latest/core_components.yaml" - type: "CoreProvider" -# Values for environment variable substitution -AWS_B64ENCODED_CREDENTIALS: XXXXXXXX -KUBERNETES_VERSION: v1.16.0 -BAR: bar -VSPHERE_MEM_MIB: 2048 -VSPHERE_CONTROL_PLANE_MEM_MIB: 1024 -VSPHERE_SSH_AUTHORIZED_KEY: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCs1kKExApUX5sQy6DKfO5bP79ynG2LtKqc8N9m/wC9jswSVAmEpSAna8NJaY0LIla/Lov7NRAvot1P9ITNnjbsVwSZe0w/aclLHctzsjpGtgYchW+PWQRreFW2as4zfRqQHAlsIB3+xgZTsgFa4v1/xWv6a2yGsa8Yf4bchGgqzrpuUI97peqoFQdNbdpnKAc4x+1AaBvvVE3wP5NbnLjVprQjgkCgidr9RUhQLxZMZOV3Y3b8CiPOXnbNn9BIER36ka3u83so+zC4dc194woTHgyM4ebAMFDvVfvTCNTsYGJ4kelC5E6QwX+Z3tNQw8HuR8GgfkdFvZAZrfFlcEV6QaT8NJ332yyJrplczalbaWPq3VQchCDx0KNCda4JCyopDzqzYAneCfYk2VCvDagZWO32ZQr4qcBYWb+iR52QxMBlm5QCdP2EaspDKBZCirEcBJNT/gJ3PhTSZ3RtchjLd9O6MQ7l0z65UKfzGddAJKwAWPFNHRp5oJyv/aJa6BCLwZGy0ct4ykwHfJ+CpewJwCHoaCToPBTmdSbDYJbalWv0NNc5gR7Q8cXriDKSaY+QXVao8kOuxhNj/cI9TAPid7Mp7sHFVKM+/7osdzL9Lwn53JGvaOWCm0pwh78GSfyEgePcQOpzqcYm5OUOTkQPGlg7k0NKtYsXKnIM2kVSpQ== -VSPHERE_RESOURCE_POOL: "cluster0/Resources" -VSPHERE_DATACENTER: dc-0 -azure-image: - v1.18.0+vmware.1: - publisher: vmware-inc - offer: tkg-capi - sku: k8s-1dot18dot8-ubuntu-1804 - version: 2020.09.09 - thirdPartyImage: true diff --git a/tkg/fakes/config/config4.yaml b/tkg/fakes/config/config4.yaml deleted file mode 100644 index 3981bee399..0000000000 --- a/tkg/fakes/config/config4.yaml +++ /dev/null @@ -1,60 +0,0 @@ -tkg: - regions: - - name: tkg-region-vsphere-20200312184000 - context: tkg-region-vsphere-20200312184000-admin@tkg-region-vsphere-20200312184000 - file: /Users/anujc/.kube/config - - name: tkg-region-aws-20200312192017 - context: tkg-region-aws-20200312192017-admin@tkg-region-aws-20200312192017 - file: /Users/anujc/.kube/config - current-region-context: tkg-region-aws-20200312192017-admin@tkg-region-aws-20200312192017 -providers: - - name: "my-infra-provider" - url: "https://github.com/myorg/myrepo/releases/latest/infrastructure_components.yaml" - type: "InfrastructureProvider" - - name: "cluster-api" # override a pre-defined provider - url: "https://github.com/myorg/myforkofclusterapi/releases/latest/core_components.yaml" - type: "CoreProvider" - - name: aws - url: /Users/dummy/.tkg/providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: /Users/dummy/.tkg/providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: /Users/dummy/.tkg/providers/infrastructure-vsphere/v0.7.0/infrastructure-components.yaml - type: InfrastructureProvider - -# Values for environment variable substitution -AWS_B64ENCODED_CREDENTIALS: XXXXXXXX -VSPHERE_PASSWORD: Admin!23 -KUBERNETES_VERSION: v1.16.0+vmware.1 -BAR: bar -AWS_ACCESS_KEY_ID: -AWS_SECRET_ACCESS_KEY: uNncCatIvWu1e$rqwerkg35qU7dswfEa4rdXJk/E -VSPHERE_DATACENTER: datacenter -VSPHERE_TEMPLATE: photon-3-v1.16.0+vmware.1 -AWS_REGION: us-east-2 -AWS_NODE_AZ: us-east-2a -AWS_AMI_ID: ami-xxxxx -AWS_VPC_CIDR: "10.0.0.0/16" -AWS_PRIVATE_NODE_CIDR: "10.0.0.0/24" -AWS_PUBLIC_NODE_CIDR: "10.0.1.0/24" -VSPHERE_CONTROL_PLANE_DISK_GIB: "20" -VSPHERE_CONTROL_PLANE_NUM_CPUS: "2" -VSPHERE_CONTROL_PLANE_MEM_MIB: "4096" -VSPHERE_WORKER_DISK_GIB: "20" -VSPHERE_WORKER_MEM_MIB: "4096" -VSPHERE_WORKER_NUM_CPUS: "2" -azure-image: - v1.18.0+vmware.1: - resourceGroup: capi-images - name: capi-ubuntu-1804 - subscriptionID: d8d5fc65-407a-48c6-bf8b-cc072730cb2e - gallery: ClusterAPI - version: 0.18.1600991471 - v1.19.0+vmware.1: - resourceGroup: capi-images - name: capi-ubuntu-1804 - subscriptionID: d8d5fc65-407a-48c6-bf8b-cc072730cb2e - gallery: ClusterAPI - version: 0.19.1600991471 diff --git a/tkg/fakes/config/config5.yaml b/tkg/fakes/config/config5.yaml deleted file mode 100644 index c016d54b89..0000000000 --- a/tkg/fakes/config/config5.yaml +++ /dev/null @@ -1,11 +0,0 @@ -FOO: foo -providers: - - name: cluster-api - url: providers/cluster-api/v0.3.2/core-components.yaml - type: CoreProvider - - name: aws - url: providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider diff --git a/tkg/fakes/config/config6.yaml b/tkg/fakes/config/config6.yaml deleted file mode 100644 index c888196ae1..0000000000 --- a/tkg/fakes/config/config6.yaml +++ /dev/null @@ -1,19 +0,0 @@ -providers: - - name: cluster-api - url: providers/cluster-api/v0.0.0/core-components.yaml - type: CoreProvider - - name: aws - url: providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere-pacific - url: providers/infrastructure-tkg-service-vsphere/v1.0.0/unused.yaml - type: InfrastructureProvider - - name: kubeadm - url: providers/bootstrap-kubeadm/v0.3.2/bootstrap-components.yaml - type: BootstrapProvider - - name: kubeadm - url: providers/control-plane-kubeadm/v0.3.2/control-plane-components.yaml - type: ControlPlaneProvider diff --git a/tkg/fakes/config/config7.yaml b/tkg/fakes/config/config7.yaml deleted file mode 100644 index 2442bf1bd9..0000000000 --- a/tkg/fakes/config/config7.yaml +++ /dev/null @@ -1,61 +0,0 @@ -tkg: - regions: - - name: tkg-region-vsphere-20200312184000 - context: tkg-region-vsphere-20200312184000-admin@tkg-region-vsphere-20200312184000 - file: /Users/anujc/.kube/config - - name: tkg-region-aws-20200312192017 - context: tkg-region-aws-20200312192017-admin@tkg-region-aws-20200312192017 - file: /Users/anujc/.kube/config - current-region-context: tkg-region-aws-20200312192017-admin@tkg-region-aws-20200312192017 -providers: - - name: "my-infra-provider" - url: "https://github.com/myorg/myrepo/releases/latest/infrastructure_components.yaml" - type: "InfrastructureProvider" - - name: "cluster-api" # override a pre-defined provider - url: "https://github.com/myorg/myforkofclusterapi/releases/latest/core_components.yaml" - type: "CoreProvider" - - name: aws - url: /Users/dummy/.tkg/providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: /Users/dummy/.tkg/providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: /Users/dummy/.tkg/providers/infrastructure-vsphere/v0.7.0/infrastructure-components.yaml - type: InfrastructureProvider - -# Values for environment variable substitution -TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdXRENDQlVDZ0F3SUJBZ0lRQ2w4UlRRTmJGNUVYMHUvVUE0dy9PekFOQmdrcWhraUc5dzBCQVFVRkFEQnMKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1Tc3dLUVlEVlFRREV5SkVhV2RwUTJWeWRDQklhV2RvSUVGemMzVnlZVzVqClpTQkZWaUJTYjI5MElFTkJNQjRYRFRBNE1EUXdNakV5TURBd01Gb1hEVEl5TURRd016QXdNREF3TUZvd1pqRUwKTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERFUnBaMmxEWlhKMElFbHVZekVaTUJjR0ExVUVDeE1RZDNkMwpMbVJwWjJsalpYSjBMbU52YlRFbE1DTUdBMVVFQXhNY1JHbG5hVU5sY25RZ1NHbG5hQ0JCYzNOMWNtRnVZMlVnClEwRXRNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMOWhDaWtRSDE3K05EZFIKQ1BnZSt5THRZYjRMRFhCTVVHTW1kUlc1UVlpWHR2Q2dGYnNJWU9CQzZBVXBFSWMyaWlobHFPOHhCM1J0TnBjdgpLRVptQk1jcWVTWjZtZFdPdzIxUG9GNnR2RDJSd2xsN1hqWnN3RlBQQUFneVBoQmtXQkFUYWNjTTdweENVUUQ1CkJVVHVKTTU2SCsyTUViMFNxUE1WOUJ4Nk1Xa0JHNmZtWGNDYWJINEpudWRTUkVvUU9pUGttN1lEcjZpY3RGdWYKMUV1dGtvek90UkVxcWpjWWpiVEN1TmhjQm96NC95TzlOVjdVZkQ1K2d3NlJsZ1dZdzdJZjQ4aGw2Nmw3WGFBcwp6UHc4MlczdHpQcExRNHpKMUxpbFlSeXlRTFlvRXQrNStGLyswN0xKN3oyMEhrdDhIRXlaTnA0OTYreW5hRjRkCjMyZHVYdnNDQXdFQUFhT0NBdm93Z2dMMk1BNEdBMVVkRHdFQi93UUVBd0lCaGpDQ0FjWUdBMVVkSUFTQ0FiMHcKZ2dHNU1JSUJ0UVlMWUlaSUFZYjliQUVEQUFJd2dnR2tNRG9HQ0NzR0FRVUZCd0lCRmk1b2RIUndPaTh2ZDNkMwpMbVJwWjJsalpYSjBMbU52YlM5emMyd3RZM0J6TFhKbGNHOXphWFJ2Y25rdWFIUnRNSUlCWkFZSUt3WUJCUVVICkFnSXdnZ0ZXSG9JQlVnQkJBRzRBZVFBZ0FIVUFjd0JsQUNBQWJ3Qm1BQ0FBZEFCb0FHa0Fjd0FnQUVNQVpRQnkKQUhRQWFRQm1BR2tBWXdCaEFIUUFaUUFnQUdNQWJ3QnVBSE1BZEFCcEFIUUFkUUIwQUdVQWN3QWdBR0VBWXdCagpBR1VBY0FCMEFHRUFiZ0JqQUdVQUlBQnZBR1lBSUFCMEFHZ0FaUUFnQUVRQWFRQm5BR2tBUXdCbEFISUFkQUFnCkFFTUFVQUF2QUVNQVVBQlRBQ0FBWVFCdUFHUUFJQUIwQUdnQVpRQWdBRklBWlFCc0FIa0FhUUJ1QUdjQUlBQlEKQUdFQWNnQjBBSGtBSUFCQkFHY0FjZ0JsQUdVQWJRQmxBRzRBZEFBZ0FIY0FhQUJwQUdNQWFBQWdBR3dBYVFCdApBR2tBZEFBZ0FHd0FhUUJoQUdJQWFRQnNBR2tBZEFCNUFDQUFZUUJ1QUdRQUlBQmhBSElBWlFBZ0FHa0FiZ0JqCkFHOEFjZ0J3QUc4QWNnQmhBSFFBWlFCa0FDQUFhQUJsQUhJQVpRQnBBRzRBSUFCaUFIa0FJQUJ5QUdVQVpnQmwKQUhJQVpRQnVBR01BWlFBdU1CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRQXdOQVlJS3dZQkJRVUhBUUVFS0RBbQpNQ1FHQ0NzR0FRVUZCekFCaGhob2RIUndPaTh2YjJOemNDNWthV2RwWTJWeWRDNWpiMjB3Z1k4R0ExVWRId1NCCmh6Q0JoREJBb0Q2Z1BJWTZhSFIwY0RvdkwyTnliRE11WkdsbmFXTmxjblF1WTI5dEwwUnBaMmxEWlhKMFNHbG4KYUVGemMzVnlZVzVqWlVWV1VtOXZkRU5CTG1OeWJEQkFvRDZnUElZNmFIUjBjRG92TDJOeWJEUXVaR2xuYVdObApjblF1WTI5dEwwUnBaMmxEWlhKMFNHbG5hRUZ6YzNWeVlXNWpaVVZXVW05dmRFTkJMbU55YkRBZkJnTlZIU01FCkdEQVdnQlN4UHNOcEEvaS9Sd0hVbUNZYUNBTHZZMlFyd3pBZEJnTlZIUTRFRmdRVVVPcHppZHNwK3hDUG51VUIKSU5UZWVabElnL2N3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUI3aXBVaWViTnRUT0EvdnBob3FyT0lEUSsyYQp2RDZPZFJ2dy9TNGlXYXdUd0dIaTUvcnBtYzJIQ1hWVUtMOUdZTnkrVVN5Uzh4dVJmREVJY09JM3VjRmJxTDJqCkN3RDdHaFg5QTYxWWFzWEhKSmxJUjBZeEhwTHZ0RjlPTk1lUXZ6SEIrTEdFaHRDY0FhcmZpbFlHempycERxNlgKZEYzWGNacENkRi9lalVOODN1bFY3V2tBeXdYZ2VtRmhNOUVaVGZrSTdxQTV4U1UxdHl2RUQ3TGQ4YVczRGlURQpKaWlOZVhmMUwvQlh1bndIMU9IOHpWb3dWMzZHRUVmZE1SL1gvS0xDdnpCOFhTU3E2UG11WDJwMHdzNXJzMGJZCkliNHAxSTVlRmRaQ1N1Y3liNlN4YTFHRFdMNC9iY2Y3MmdNaHkyb1dHVTRLOEsyRXlsMlVzMXAyOTJFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJUUFxeGNKbW9MUUp1UEMzbnlya1lsZHpBTkJna3Foa2lHOXcwQkFRVUZBREJzCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU3N3S1FZRFZRUURFeUpFYVdkcFEyVnlkQ0JJYVdkb0lFRnpjM1Z5WVc1agpaU0JGVmlCU2IyOTBJRU5CTUI0WERUQTJNVEV4TURBd01EQXdNRm9YRFRNeE1URXhNREF3TURBd01Gb3diREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RERVJwWjJsRFpYSjBJRWx1WXpFWk1CY0dBMVVFQ3hNUWQzZDMKTG1ScFoybGpaWEowTG1OdmJURXJNQ2tHQTFVRUF4TWlSR2xuYVVObGNuUWdTR2xuYUNCQmMzTjFjbUZ1WTJVZwpSVllnVW05dmRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNYk01WFBtCis5Uzc1UzB0TXFiZjVZRS95YzBsU2JaeEtzUFZsRFJub2dvY3NGOXBwa0N4eExleWo5Q1lwS2xCV1RyVDNKVFcKUE50ME9LUkt6RTBsZ3ZkS3BWTVNPTzd6U1cxeGtYNWp0cXVtWDhPa2hQaFBZbEcrK01YczJ6aVM0d2JsQ0pFTQp4Q2hCVmZ2TFdva1ZmbkhvTmI5TmNnazl2am80VUZ0M01SdU5zOGNrUlpxbnJHMEFGRm9FdDdvVDYxRUttRUZCCklrNWxZWWVCUVZDbWVWeUozaGxLVjlVdTVsMGNVeXgrbU0wYUJoYWthSFBRTkFRVFhLRngwMXA4VmR0ZVpPRTMKaHpCV0JPVVJ0Q21BRXZGNU9ZaWlBaEY4SjJhM2lMZDQ4c29LcURpckNtVEN2MlpkbFlUQm9TVWVoMTBhVUFzZwpFc3hCdTI0TFVUaTRTOHNDQXdFQUFhTmpNR0V3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3SFFZRFZSME9CQllFRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1COEdBMVVkSXdRWU1CYUEKRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQWNHZ2FYM05lYwpuenlJWmdZSVZ5SGJJVWY0S21lcXZ4Z3lka0FRVjhHSzgzclpFV1dPTmZxZS9FVzFudGxNTVV1NGtlaERMSTZ6CmVNN2I0MU41Y2RibElaUUIybFdIbWlSazlvcG16TjZjTjgyb05MRnBteVBJbm5naUszQkQ0MVZITVdFWjcxakYKaFM5T01QYWdNUllqeU9maVpSWXp5NzhhRzZBOStNcGVpekdMWUFpSkxRd0dYRkszeFBrS21ORVZYNThTdm53MgpZemk5UktSLzVDWXJDc1NYYVEzcGpPTEFFRmU0eUhZU2tWWHlTR25ZdkNvQ1d3OUUxQ0F4Mi9TNmNDWmRrR0NlCnZFc1hDUysweXg1RGFNa0hKOEhTWFBmcUlibG9FcHc4bkwrZS9JQmNtMlBON0VlcUpTZG5vRGZ6QUlKOVZOZXAKK09rdUU2TjM2QjlLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0= -TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: true -AWS_B64ENCODED_CREDENTIALS: XXXXXXXX -VSPHERE_PASSWORD: Admin!23 -KUBERNETES_VERSION: v1.16.0+vmware.1 -BAR: bar -AWS_ACCESS_KEY_ID: -AWS_SECRET_ACCESS_KEY: uNncCatIvWu1e$rqwerkg35qU7dswfEa4rdXJk/E -VSPHERE_DATACENTER: datacenter -VSPHERE_TEMPLATE: photon-3-v1.16.0+vmware.1 -AWS_REGION: us-east-2 -AWS_NODE_AZ: us-east-2a -AWS_AMI_ID: ami-xxxxx -AWS_VPC_CIDR: "10.0.0.0/16" -AWS_PRIVATE_NODE_CIDR: "10.0.0.0/24" -AWS_PUBLIC_NODE_CIDR: "10.0.1.0/24" -AWS_NODE_AZ_1: us-east-2b -AWS_PRIVATE_NODE_CIDR_1: "10.0.2.0/24" -AWS_PUBLIC_NODE_CIDR_1: "10.0.3.0/24" -AWS_NODE_AZ_2: us-east-2c -AWS_PRIVATE_NODE_CIDR_2: "10.0.4.0/24" -AWS_PUBLIC_NODE_CIDR_2: "10.0.5.0/24" -VSPHERE_CONTROL_PLANE_DISK_GIB: "20" -VSPHERE_CONTROL_PLANE_NUM_CPUS: "1" -VSPHERE_CONTROL_PLANE_MEM_MIB: "2048" -VSPHERE_WORKER_DISK_GIB: "20" -VSPHERE_WORKER_MEM_MIB: "2048" -VSPHERE_WORKER_NUM_CPUS: "1" -VSPHERE_HA_PROXY_MEM_MIB: "2048" -VSPHERE_HA_PROXY_DISK_GIB: "20" -VSPHERE_HA_PROXY_NUM_CPUS: "1" -WORKER_MACHINE_COUNT_0: "2" -WORKER_MACHINE_COUNT_1: "1" -WORKER_MACHINE_COUNT_2: "3" diff --git a/tkg/fakes/config/config8.yaml b/tkg/fakes/config/config8.yaml deleted file mode 100644 index d652506aea..0000000000 --- a/tkg/fakes/config/config8.yaml +++ /dev/null @@ -1,33 +0,0 @@ -tkg: - regions: - - name: regional-cluster-1 - context: user1@regional-cluster-1-context - file: path/to/kubeconfig - - name: regional-cluster-2 - context: user1@regional-cluster-2-context - file: path/to/kubeconfig - - name: regional-cluster-2 - context: user2@regional-cluster-2-context - file: path/to/kubeconfig -# Values for environment variable substitution -AWS_B64ENCODED_CREDENTIALS: XXXXXXXX -KUBERNETES_VERSION: v1.16.0 -BAR: bar -FOO: foo - -AWS_REGION: us-east-2 -AWS_NODE_AZ: us-west-2a -VSPHERE_SSH_AUTHORIZED_KEY: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCs1kKExApUX5sQy6DKfO5bP79ynG2LtKqc8N9m/wC9jswSVAmEpSAna8NJaY0LIla/Lov7NRAvot1P9ITNnjbsVwSZe0w/aclLHctzsjpGtgYchW+PWQRreFW2as4zfRqQHAlsIB3+xgZTsgFa4v1/xWv6a2yGsa8Yf4bchGgqzrpuUI97peqoFQdNbdpnKAc4x+1AaBvvVE3wP5NbnLjVprQjgkCgidr9RUhQLxZMZOV3Y3b8CiPOXnbNn9BIER36ka3u83so+zC4dc194woTHgyM4ebAMFDvVfvTCNTsYGJ4kelC5E6QwX+Z3tNQw8HuR8GgfkdFvZAZrfFlcEV6QaT8NJ332yyJrplczalbaWPq3VQchCDx0KNCda4JCyopDzqzYAneCfYk2VCvDagZWO32ZQr4qcBYWb+iR52QxMBlm5QCdP2EaspDKBZCirEcBJNT/gJ3PhTSZ3RtchjLd9O6MQ7l0z65UKfzGddAJKwAWPFNHRp5oJyv/aJa6BCLwZGy0ct4ykwHfJ+CpewJwCHoaCToPBTmdSbDYJbalWv0NNc5gR7Q8cXriDKSaY+QXVao8kOuxhNj/cI9TAPid7Mp7sHFVKM+/7osdzL9Lwn53JGvaOWCm0pwh78GSfyEgePcQOpzqcYm5OUOTkQPGlg7k0NKtYsXKnIM2kVSpQ== test's comment here -VSPHERE_RESOURCE_POOL: "*/Resources" -VSPHERE_DATACENTER: dc-0 -VSPHERE_MEM_MIB: 2048 -images: - cert-manager: - repository: registry.tkg.vmware.run/cert-manager - tag: v0.11.0_vmware.1 - dummy-image: - repository: registry.tkg.vmware.run/dummy - tag: v0.11.0_vmware.1 -azure-image: - v1.18.0+vmware.1: - id: /random/image/id diff --git a/tkg/fakes/config/config_cluster_service_cidr.yaml b/tkg/fakes/config/config_cluster_service_cidr.yaml deleted file mode 100644 index 22da0ffaee..0000000000 --- a/tkg/fakes/config/config_cluster_service_cidr.yaml +++ /dev/null @@ -1,21 +0,0 @@ -providers: - - name: cluster-api - url: providers/cluster-api/v0.0.0/core-components.yaml - type: CoreProvider - - name: aws - url: providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere-pacific - url: providers/infrastructure-tkg-service-vsphere/v1.0.0/unused.yaml - type: InfrastructureProvider - - name: kubeadm - url: providers/bootstrap-kubeadm/v0.3.2/bootstrap-components.yaml - type: BootstrapProvider - - name: kubeadm - url: providers/control-plane-kubeadm/v0.3.2/control-plane-components.yaml - type: ControlPlaneProvider -CLUSTER_CIDR: 200.200.200.0/24 -SERVICE_CIDR: 250.250.250.0/24 diff --git a/tkg/fakes/config/config_custom_clusterbootstrap.yaml b/tkg/fakes/config/config_custom_clusterbootstrap.yaml deleted file mode 100644 index 7a3f4bb9b9..0000000000 --- a/tkg/fakes/config/config_custom_clusterbootstrap.yaml +++ /dev/null @@ -1,23 +0,0 @@ -providers: - - # add a custom provider - name: "my-infra-provider" - url: "https://github.com/myorg/myrepo/releases/latest/infrastructure_components.yaml" - type: "InfrastructureProvider" - - name: "cluster-api" # override a pre-defined provider - url: "https://github.com/myorg/myforkofclusterapi/releases/latest/core_components.yaml" - type: "CoreProvider" - - name: aws - url: /Users/dummy/.tkg/providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: /Users/dummy/.tkg/providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: /Users/dummy/.tkg/providers/infrastructure-vsphere/v0.7.0/infrastructure-components.yaml - type: InfrastructureProvider - -# Values for environment variable substitution -ANTREA_TRACEFLOW: false -CLUSTER_NAME: "test-cluster" -NAMESPACE: "test-namespace" -FOO: new-foo diff --git a/tkg/fakes/config/config_custom_registry_ca_cert.yaml b/tkg/fakes/config/config_custom_registry_ca_cert.yaml deleted file mode 100644 index 42b7c63826..0000000000 --- a/tkg/fakes/config/config_custom_registry_ca_cert.yaml +++ /dev/null @@ -1,21 +0,0 @@ -TKG_CUSTOM_IMAGE_REPOSITORY: registry.mydomain.com/library -TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCkNBIENFUlQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ== -providers: - - name: cluster-api - url: providers/cluster-api/v0.0.0/core-components.yaml - type: CoreProvider - - name: aws - url: providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere-pacific - url: providers/infrastructure-tkg-service-vsphere/v1.0.0/unused.yaml - type: InfrastructureProvider - - name: kubeadm - url: providers/bootstrap-kubeadm/v0.3.2/bootstrap-components.yaml - type: BootstrapProvider - - name: kubeadm - url: providers/control-plane-kubeadm/v0.3.2/control-plane-components.yaml - type: ControlPlaneProvider diff --git a/tkg/fakes/config/config_custom_registry_skip_tls_verify.yaml b/tkg/fakes/config/config_custom_registry_skip_tls_verify.yaml deleted file mode 100644 index d7748f7191..0000000000 --- a/tkg/fakes/config/config_custom_registry_skip_tls_verify.yaml +++ /dev/null @@ -1,21 +0,0 @@ -TKG_CUSTOM_IMAGE_REPOSITORY: registry.mydomain.com/library -TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: true -providers: - - name: cluster-api - url: providers/cluster-api/v0.0.0/core-components.yaml - type: CoreProvider - - name: aws - url: providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere-pacific - url: providers/infrastructure-tkg-service-vsphere/v1.0.0/unused.yaml - type: InfrastructureProvider - - name: kubeadm - url: providers/bootstrap-kubeadm/v0.3.2/bootstrap-components.yaml - type: BootstrapProvider - - name: kubeadm - url: providers/control-plane-kubeadm/v0.3.2/control-plane-components.yaml - type: ControlPlaneProvider diff --git a/tkg/fakes/config/config_ipv4.yaml b/tkg/fakes/config/config_ipv4.yaml deleted file mode 100644 index c51bccd918..0000000000 --- a/tkg/fakes/config/config_ipv4.yaml +++ /dev/null @@ -1,20 +0,0 @@ -providers: - - name: cluster-api - url: providers/cluster-api/v0.0.0/core-components.yaml - type: CoreProvider - - name: aws - url: providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere-pacific - url: providers/infrastructure-tkg-service-vsphere/v1.0.0/unused.yaml - type: InfrastructureProvider - - name: kubeadm - url: providers/bootstrap-kubeadm/v0.3.2/bootstrap-components.yaml - type: BootstrapProvider - - name: kubeadm - url: providers/control-plane-kubeadm/v0.3.2/control-plane-components.yaml - type: ControlPlaneProvider -TKG_IP_FAMILY: "ipv4" diff --git a/tkg/fakes/config/config_ipv4_ipv6.yaml b/tkg/fakes/config/config_ipv4_ipv6.yaml deleted file mode 100644 index 9935e58c84..0000000000 --- a/tkg/fakes/config/config_ipv4_ipv6.yaml +++ /dev/null @@ -1,20 +0,0 @@ -providers: - - name: cluster-api - url: providers/cluster-api/v0.0.0/core-components.yaml - type: CoreProvider - - name: aws - url: providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere-pacific - url: providers/infrastructure-tkg-service-vsphere/v1.0.0/unused.yaml - type: InfrastructureProvider - - name: kubeadm - url: providers/bootstrap-kubeadm/v0.3.2/bootstrap-components.yaml - type: BootstrapProvider - - name: kubeadm - url: providers/control-plane-kubeadm/v0.3.2/control-plane-components.yaml - type: ControlPlaneProvider -TKG_IP_FAMILY: "ipv4,ipv6" diff --git a/tkg/fakes/config/config_ipv6.yaml b/tkg/fakes/config/config_ipv6.yaml deleted file mode 100644 index c1d74cdef0..0000000000 --- a/tkg/fakes/config/config_ipv6.yaml +++ /dev/null @@ -1,20 +0,0 @@ -providers: - - name: cluster-api - url: providers/cluster-api/v0.0.0/core-components.yaml - type: CoreProvider - - name: aws - url: providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere-pacific - url: providers/infrastructure-tkg-service-vsphere/v1.0.0/unused.yaml - type: InfrastructureProvider - - name: kubeadm - url: providers/bootstrap-kubeadm/v0.3.2/bootstrap-components.yaml - type: BootstrapProvider - - name: kubeadm - url: providers/control-plane-kubeadm/v0.3.2/control-plane-components.yaml - type: ControlPlaneProvider -TKG_IP_FAMILY: "ipv6" diff --git a/tkg/fakes/config/config_ipv6_ipv4.yaml b/tkg/fakes/config/config_ipv6_ipv4.yaml deleted file mode 100644 index bd5f865db7..0000000000 --- a/tkg/fakes/config/config_ipv6_ipv4.yaml +++ /dev/null @@ -1,20 +0,0 @@ -providers: - - name: cluster-api - url: providers/cluster-api/v0.0.0/core-components.yaml - type: CoreProvider - - name: aws - url: providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere-pacific - url: providers/infrastructure-tkg-service-vsphere/v1.0.0/unused.yaml - type: InfrastructureProvider - - name: kubeadm - url: providers/bootstrap-kubeadm/v0.3.2/bootstrap-components.yaml - type: BootstrapProvider - - name: kubeadm - url: providers/control-plane-kubeadm/v0.3.2/control-plane-components.yaml - type: ControlPlaneProvider -TKG_IP_FAMILY: "ipv6,ipv4" diff --git a/tkg/fakes/config/config_ipv6_ipv4_with_cidrs.yaml b/tkg/fakes/config/config_ipv6_ipv4_with_cidrs.yaml deleted file mode 100644 index 23ce58eb02..0000000000 --- a/tkg/fakes/config/config_ipv6_ipv4_with_cidrs.yaml +++ /dev/null @@ -1,22 +0,0 @@ -providers: - - name: cluster-api - url: providers/cluster-api/v0.0.0/core-components.yaml - type: CoreProvider - - name: aws - url: providers/infrastructure-aws/v0.5.1/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere - url: providers/infrastructure-vsphere/v0.6.2/infrastructure-components.yaml - type: InfrastructureProvider - - name: vsphere-pacific - url: providers/infrastructure-tkg-service-vsphere/v1.0.0/unused.yaml - type: InfrastructureProvider - - name: kubeadm - url: providers/bootstrap-kubeadm/v0.3.2/bootstrap-components.yaml - type: BootstrapProvider - - name: kubeadm - url: providers/control-plane-kubeadm/v0.3.2/control-plane-components.yaml - type: ControlPlaneProvider -TKG_IP_FAMILY: "ipv6,ipv4" -CLUSTER_CIDR: fd00:100:96::/48,100.96.0.0/11 -SERVICE_CIDR: fd00::/48,1.2.3.4/16 diff --git a/tkg/fakes/config/config_missing_providers.yaml b/tkg/fakes/config/config_missing_providers.yaml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/fakes/config/config_never_persist.yaml b/tkg/fakes/config/config_never_persist.yaml deleted file mode 100644 index ddf3706ed4..0000000000 --- a/tkg/fakes/config/config_never_persist.yaml +++ /dev/null @@ -1,7 +0,0 @@ - -AWS_REGION: us-east-2 -AWS_NODE_AZ: us-east-2a -AWS_AMI_ID: ami-xxxxx -AWS_VPC_CIDR: "10.0.0.0/16" -AWS_PRIVATE_NODE_CIDR: "10.0.0.0/24" -AWS_PUBLIC_NODE_CIDR: "10.0.1.0/24" diff --git a/tkg/fakes/config/configmap/kubeadm-config1.yaml b/tkg/fakes/config/configmap/kubeadm-config1.yaml deleted file mode 100644 index 082f9ee932..0000000000 --- a/tkg/fakes/config/configmap/kubeadm-config1.yaml +++ /dev/null @@ -1,53 +0,0 @@ -apiVersion: v1 -data: - ClusterConfiguration: | - apiServer: - extraArgs: - authorization-mode: Node,RBAC - cloud-provider: external - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - timeoutForControlPlane: 8m0s - apiVersion: kubeadm.k8s.io/v1beta2 - certificatesDir: /etc/kubernetes/pki - clusterName: workload-cluster-12 - controlPlaneEndpoint: 10.186.40.161:6443 - controllerManager: - extraArgs: - cloud-provider: external - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - dns: - imageRepository: registry.tkg.vmware.run - imageTag: v1.6.5_vmware.4 - type: CoreDNS - etcd: - local: - dataDir: /var/lib/etcd - extraArgs: - cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - imageRepository: registry.tkg.vmware.run - imageTag: v3.4.3_vmware.4 - imageRepository: registry.tkg.vmware.run - kind: ClusterConfiguration - kubernetesVersion: v1.17.3+vmware.2 - networking: - dnsDomain: cluster.local - podSubnet: 100.96.0.0/11 - serviceSubnet: 100.64.0.0/13 - scheduler: - extraArgs: - tls-cipher-suites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - ClusterStatus: | - apiEndpoints: - workload-cluster-12-control-plane-thl2l: - advertiseAddress: 10.186.47.25 - bindPort: 6443 - apiVersion: kubeadm.k8s.io/v1beta2 - kind: ClusterStatus -kind: ConfigMap -metadata: - creationTimestamp: "2020-05-29T04:20:25Z" - name: kubeadm-config - namespace: kube-system - resourceVersion: "152" - selfLink: /api/v1/namespaces/kube-system/configmaps/kubeadm-config - uid: a7d4bbd1-3654-4e87-9dc7-399b62031573 diff --git a/tkg/fakes/config/features/features_duplicate.json b/tkg/fakes/config/features/features_duplicate.json deleted file mode 100644 index fffbe0858d..0000000000 --- a/tkg/fakes/config/features/features_duplicate.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "feature1": "true", - "feature1": "false" -} \ No newline at end of file diff --git a/tkg/fakes/config/features/features_invalid.json b/tkg/fakes/config/features/features_invalid.json deleted file mode 100644 index c787c031e0..0000000000 --- a/tkg/fakes/config/features/features_invalid.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "feature1": 0, -} \ No newline at end of file diff --git a/tkg/fakes/config/features/features_overwrite.json b/tkg/fakes/config/features/features_overwrite.json deleted file mode 100644 index 384c054065..0000000000 --- a/tkg/fakes/config/features/features_overwrite.json +++ /dev/null @@ -1 +0,0 @@ -{"feature1":"true","feature2":"false"} \ No newline at end of file diff --git a/tkg/fakes/config/features/features_valid.json b/tkg/fakes/config/features/features_valid.json deleted file mode 100644 index cdca01b6f8..0000000000 --- a/tkg/fakes/config/features/features_valid.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "feature1": "true", - "feature2": "http://google.com" -} \ No newline at end of file diff --git a/tkg/fakes/config/features/features_write.json b/tkg/fakes/config/features/features_write.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tkg/fakes/config/features/features_write.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tkg/fakes/config/invalid_config.yaml b/tkg/fakes/config/invalid_config.yaml deleted file mode 100644 index 73cc594821..0000000000 --- a/tkg/fakes/config/invalid_config.yaml +++ /dev/null @@ -1 +0,0 @@ -invalid_key:invalid_value diff --git a/tkg/fakes/config/kubeconfig/config1.yaml b/tkg/fakes/config/kubeconfig/config1.yaml deleted file mode 100644 index 18b7377c22..0000000000 --- a/tkg/fakes/config/kubeconfig/config1.yaml +++ /dev/null @@ -1,35 +0,0 @@ -apiVersion: v1 -clusters: -- cluster: - server: http://cow.org:8080 - name: cow-cluster -- cluster: - insecure-skip-tls-verify: true - server: https://horse.org:4443 - name: horse-cluster -- cluster: - insecure-skip-tls-verify: true - server: https://pig.org:443 - name: pig-cluster -contexts: -- context: - cluster: horse-cluster - user: green-user - name: federal-context -- context: - cluster: pig-cluster - namespace: saw-ns - user: black-user - name: queen-anne-context -current-context: federal-context -kind: Config -preferences: - colors: true -users: -- name: blue-user - user: - token: blue-token -- name: green-user - user: - client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJQ24vUDZ1S1pWWTR3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TURBeE1qVXdPRFV4TVRCYUZ3MHlNVEF4TWpRd09EVXhNVEphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJuUmc4dklXQlBWQUJWTFUKNGNFckd4bE5XZVJHR2x0OW0wVElsUStNUytSZU9GNUhROW5pQlRSQWMwVWpsUk1EdzR3aEREVXV3Y2NsazFCNApoa3l2YUx5elZyeW9jOWV5NHU0SVZ0MFR4ZU85VUI5bXZHMkF6TlVnY0FkRkp4cWdKbSt2OXo0RzMyU0EwUEc1CjhxZWtBRzVLYU1RQlJEVm5pNXZBajJ5c0hpdHhkbGdJdEZkc1dzNUgwM3FIUjVNQU5jT01nYlZLSnRtbE9MUngKYWFmRHhxSWRaS0pERENxeDFoaWFlMk5WdWp1TzI3OE9DV3NaN3FUWVR4UzNpVVJBUXNpYWk5Y2Q5T2FITnJSTAozWWtUdTl0b1c5RTNFdVB0b0h3S2N6RlZsNk01dWtaWW5wZDEwL213Y2wzUzA1ZFd2SExhNGVMakZ3Z2RQc05XCkZ4NThTd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNaThWVXZ0RWo0d3g3Z1hZSXhxZU95L1UyY0psQVp3S0Zmdwp3eEJYQjg3V1JYblhZaEt1aWhPeUpCSnM2RVpSOUZWcWUwNm1yZFNOMVRPQW5JdmovZVlEejB5SlZFQlVNMHJ1CmlXWkN2djRxZXBRYUpWSzZBRDBjcjBtZEIvbmFrd3lyS203eTRXdjRSMkhVcWxZdTZXcVRsdTY3V3Ezb1g5VFIKSUFZRUozWXJmSy9QUXV3WHZyUlNDWGg2NVpHT21aL3M0di9vbWlvajdocHp4Zm9OOUkxQ0hoYUV2clFGcW9UcwpiSWJWMDFDa3Nzak9DdUhrQlIzRGxLcENyQ29iMEVYd2E0c2pkNjlVWnJzRElCeUtmZmxqV0pscllYdWdOQ0pPCi9OeUhVS2dMTDk3c0lOR043NElJRmJhNXV2cWRkQm9jTUxGMkFrRHV6UndweC9mVWNrUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= - client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBcm5SZzh2SVdCUFZBQlZMVTRjRXJHeGxOV2VSR0dsdDltMFRJbFErTVMrUmVPRjVIClE5bmlCVFJBYzBVamxSTUR3NHdoRERVdXdjY2xrMUI0aGt5dmFMeXpWcnlvYzlleTR1NElWdDBUeGVPOVVCOW0KdkcyQXpOVWdjQWRGSnhxZ0ptK3Y5ejRHMzJTQTBQRzU4cWVrQUc1S2FNUUJSRFZuaTV2QWoyeXNIaXR4ZGxnSQp0RmRzV3M1SDAzcUhSNU1BTmNPTWdiVktKdG1sT0xSeGFhZkR4cUlkWktKRERDcXgxaGlhZTJOVnVqdU8yNzhPCkNXc1o3cVRZVHhTM2lVUkFRc2lhaTljZDlPYUhOclJMM1lrVHU5dG9XOUUzRXVQdG9Id0tjekZWbDZNNXVrWlkKbnBkMTAvbXdjbDNTMDVkV3ZITGE0ZUxqRndnZFBzTldGeDU4U3dJREFRQUJBb0lCQUNMUloyZ1ZtUDkwVTBxOAp0WEE1TlhrN0c0ME5XbEI0WWlGVElSVmUvUWxJa3VWOUs0d0hPRzBCZUx1STJRa3Z1bGlVNXlPZ21heGpLc1MwCkV0bjdCQ2RMUWgvVmwybEhhNVNQSFdyNHhMR0NPbzU3TmUzMWpQZFVzaHlwMXN0dkxQZCs0d2ZkZ1ZHa3BYRU8KVGFaNGZ1cjNHRExBcStBSktKbGNoSm9iZmw2bXlLc2tKV2NrUmNYY3FWOW5adFRtbGh5aFljZ2tuYkg0dFJmOAp0YzNsR1B5cHF0SmhiWmEyaUMxUGkxMlltYjBwNThFWVVFdVRXdWVjaHBXNHY0cU02V2ZYMXJSeGRSU3RwQkF5Cm50WUF5b3pYYUQ5cDlYbnI5OFNOekFMMW83azF0V29FanRBSXhNVTNlQ1VFTWx5Q01VVVFrUjNGN0JOUk9GWS8KcnNGVVlVRUNnWUVBMHorZ0QwNithSlpsSWkyeUtOYnJNMm1DTjFjQ2hkdVFCSmdvc0VMTS9IN0p1cnY4SFJsQQpvYkxwekJSWXQ3aW82WHBaQndsRnIrM0dabWdTWkkwY3U0L0tIMXRVWU1DRS9pVnVYa0tXVnYva0laUnd0ckpkCmNEU0htNkVxbnRwY2h3aTBQbFltNmx3Vm5lbEpvN282T2dycHFvVXA0cjNvRGNHUzREdU1vTThDZ1lFQTAybGEKelMycTdMVjlEQXZhdVFOQ2wvZ2JLTk9FZG9FR0tYWEVBaFJTYkc3SHpHeVkveDJVSUFocCtuUytFS21wdVF6WQp4UUdqOU5QSlY3WGJqQkg4MmtDcmhtRUx0bG9QOGdQVlhxUGhXTHFzemNUOE1xUFRCYUcxS21IaTRrb3FZb2hhCldJS0pnTFErOEFCTjBOUEJYUTl4NVJVSHVPejhJaUcveVBxcXM4VUNnWUE3WFVqc3BGTkw3dCt5MENhZDVXK3AKUGdBeTd3ZXRlRHNybjFybjFZM25jdlhidlJJblZ6NWJjbnpUTmZDTWlKOG5KWk81TDNqZTdMSHhlMU9YNERQdgozWU9PZGtycStZOG1JSHk0am52VExRditCOG40L1h6V21GeDNkcjRVY0FiS2g3Nm5PZXlydFg3NXBtSmtXV1FkCmhZMk90dWREYWR5NWFPbU9qQTJEN3dLQmdGQ1UwN3RwTU1GUTIvei9kN3NWZHdpZDFSeFdveUxZUXhVQ2dsZVkKajJJdFI1S3Z3aEZib040azF1QlVKeTRLdlZwL2Z4QjRjNW9hTDZCeS9PQUM2ekgxZkd1WUNmTFRtVWhTRmI0aApFUC9WQjVEWENKbjB2N1poMEwvNjE1UVJXTjU5d3BJQ0Q0OHpKTm91QTNzWmU1YVJFSVNVNDRDbE0rVituNjluCmZERlJBb0dBUDZ1NGxrSjg0amRjTVROVTdYeW16ZkMwSkd5aFRNcWQ2YnV4NG9FQlViSFhoOW1DaVRMSmFaV1YKN0F5NkxTV21lRGIrWEFrS0tQL2UwQVMrWElKV2p6MDI5SFdDaXM0T3NZV3VqeksrVjVaVUVkQlJNUEN0QUo4ZApCaDBvRTliSUdIOVB0RTFIdTh6NGpGaG5WUmVqdmdhMzRQdG9QV3JNL01sZnQzLy9Lazg9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== diff --git a/tkg/fakes/config/kubeconfig/config2.yaml b/tkg/fakes/config/kubeconfig/config2.yaml deleted file mode 100644 index 54d9b20588..0000000000 --- a/tkg/fakes/config/kubeconfig/config2.yaml +++ /dev/null @@ -1,36 +0,0 @@ -apiVersion: v1 -clusters: -- cluster: - api-version: v1 - server: http://cow.org:8080 - name: cow-cluster -- cluster: - insecure-skip-tls-verify: true - server: https://horse.org:4443 - name: horse-cluster -- cluster: - insecure-skip-tls-verify: true - server: https://pig.org:443 - name: pig-cluster -contexts: -- context: - cluster: horse-cluster - namespace: chisel-ns - user: green-user - name: federal-context -- context: - cluster: pig-cluster - namespace: saw-ns - user: black-user - name: queen-anne-context -kind: Config -preferences: - colors: true -users: -- name: blue-user - user: - token: blue-token -- name: green-user - user: - client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJQ24vUDZ1S1pWWTR3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TURBeE1qVXdPRFV4TVRCYUZ3MHlNVEF4TWpRd09EVXhNVEphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJuUmc4dklXQlBWQUJWTFUKNGNFckd4bE5XZVJHR2x0OW0wVElsUStNUytSZU9GNUhROW5pQlRSQWMwVWpsUk1EdzR3aEREVXV3Y2NsazFCNApoa3l2YUx5elZyeW9jOWV5NHU0SVZ0MFR4ZU85VUI5bXZHMkF6TlVnY0FkRkp4cWdKbSt2OXo0RzMyU0EwUEc1CjhxZWtBRzVLYU1RQlJEVm5pNXZBajJ5c0hpdHhkbGdJdEZkc1dzNUgwM3FIUjVNQU5jT01nYlZLSnRtbE9MUngKYWFmRHhxSWRaS0pERENxeDFoaWFlMk5WdWp1TzI3OE9DV3NaN3FUWVR4UzNpVVJBUXNpYWk5Y2Q5T2FITnJSTAozWWtUdTl0b1c5RTNFdVB0b0h3S2N6RlZsNk01dWtaWW5wZDEwL213Y2wzUzA1ZFd2SExhNGVMakZ3Z2RQc05XCkZ4NThTd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNaThWVXZ0RWo0d3g3Z1hZSXhxZU95L1UyY0psQVp3S0Zmdwp3eEJYQjg3V1JYblhZaEt1aWhPeUpCSnM2RVpSOUZWcWUwNm1yZFNOMVRPQW5JdmovZVlEejB5SlZFQlVNMHJ1CmlXWkN2djRxZXBRYUpWSzZBRDBjcjBtZEIvbmFrd3lyS203eTRXdjRSMkhVcWxZdTZXcVRsdTY3V3Ezb1g5VFIKSUFZRUozWXJmSy9QUXV3WHZyUlNDWGg2NVpHT21aL3M0di9vbWlvajdocHp4Zm9OOUkxQ0hoYUV2clFGcW9UcwpiSWJWMDFDa3Nzak9DdUhrQlIzRGxLcENyQ29iMEVYd2E0c2pkNjlVWnJzRElCeUtmZmxqV0pscllYdWdOQ0pPCi9OeUhVS2dMTDk3c0lOR043NElJRmJhNXV2cWRkQm9jTUxGMkFrRHV6UndweC9mVWNrUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= - client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBcm5SZzh2SVdCUFZBQlZMVTRjRXJHeGxOV2VSR0dsdDltMFRJbFErTVMrUmVPRjVIClE5bmlCVFJBYzBVamxSTUR3NHdoRERVdXdjY2xrMUI0aGt5dmFMeXpWcnlvYzlleTR1NElWdDBUeGVPOVVCOW0KdkcyQXpOVWdjQWRGSnhxZ0ptK3Y5ejRHMzJTQTBQRzU4cWVrQUc1S2FNUUJSRFZuaTV2QWoyeXNIaXR4ZGxnSQp0RmRzV3M1SDAzcUhSNU1BTmNPTWdiVktKdG1sT0xSeGFhZkR4cUlkWktKRERDcXgxaGlhZTJOVnVqdU8yNzhPCkNXc1o3cVRZVHhTM2lVUkFRc2lhaTljZDlPYUhOclJMM1lrVHU5dG9XOUUzRXVQdG9Id0tjekZWbDZNNXVrWlkKbnBkMTAvbXdjbDNTMDVkV3ZITGE0ZUxqRndnZFBzTldGeDU4U3dJREFRQUJBb0lCQUNMUloyZ1ZtUDkwVTBxOAp0WEE1TlhrN0c0ME5XbEI0WWlGVElSVmUvUWxJa3VWOUs0d0hPRzBCZUx1STJRa3Z1bGlVNXlPZ21heGpLc1MwCkV0bjdCQ2RMUWgvVmwybEhhNVNQSFdyNHhMR0NPbzU3TmUzMWpQZFVzaHlwMXN0dkxQZCs0d2ZkZ1ZHa3BYRU8KVGFaNGZ1cjNHRExBcStBSktKbGNoSm9iZmw2bXlLc2tKV2NrUmNYY3FWOW5adFRtbGh5aFljZ2tuYkg0dFJmOAp0YzNsR1B5cHF0SmhiWmEyaUMxUGkxMlltYjBwNThFWVVFdVRXdWVjaHBXNHY0cU02V2ZYMXJSeGRSU3RwQkF5Cm50WUF5b3pYYUQ5cDlYbnI5OFNOekFMMW83azF0V29FanRBSXhNVTNlQ1VFTWx5Q01VVVFrUjNGN0JOUk9GWS8KcnNGVVlVRUNnWUVBMHorZ0QwNithSlpsSWkyeUtOYnJNMm1DTjFjQ2hkdVFCSmdvc0VMTS9IN0p1cnY4SFJsQQpvYkxwekJSWXQ3aW82WHBaQndsRnIrM0dabWdTWkkwY3U0L0tIMXRVWU1DRS9pVnVYa0tXVnYva0laUnd0ckpkCmNEU0htNkVxbnRwY2h3aTBQbFltNmx3Vm5lbEpvN282T2dycHFvVXA0cjNvRGNHUzREdU1vTThDZ1lFQTAybGEKelMycTdMVjlEQXZhdVFOQ2wvZ2JLTk9FZG9FR0tYWEVBaFJTYkc3SHpHeVkveDJVSUFocCtuUytFS21wdVF6WQp4UUdqOU5QSlY3WGJqQkg4MmtDcmhtRUx0bG9QOGdQVlhxUGhXTHFzemNUOE1xUFRCYUcxS21IaTRrb3FZb2hhCldJS0pnTFErOEFCTjBOUEJYUTl4NVJVSHVPejhJaUcveVBxcXM4VUNnWUE3WFVqc3BGTkw3dCt5MENhZDVXK3AKUGdBeTd3ZXRlRHNybjFybjFZM25jdlhidlJJblZ6NWJjbnpUTmZDTWlKOG5KWk81TDNqZTdMSHhlMU9YNERQdgozWU9PZGtycStZOG1JSHk0am52VExRditCOG40L1h6V21GeDNkcjRVY0FiS2g3Nm5PZXlydFg3NXBtSmtXV1FkCmhZMk90dWREYWR5NWFPbU9qQTJEN3dLQmdGQ1UwN3RwTU1GUTIvei9kN3NWZHdpZDFSeFdveUxZUXhVQ2dsZVkKajJJdFI1S3Z3aEZib040azF1QlVKeTRLdlZwL2Z4QjRjNW9hTDZCeS9PQUM2ekgxZkd1WUNmTFRtVWhTRmI0aApFUC9WQjVEWENKbjB2N1poMEwvNjE1UVJXTjU5d3BJQ0Q0OHpKTm91QTNzWmU1YVJFSVNVNDRDbE0rVituNjluCmZERlJBb0dBUDZ1NGxrSjg0amRjTVROVTdYeW16ZkMwSkd5aFRNcWQ2YnV4NG9FQlViSFhoOW1DaVRMSmFaV1YKN0F5NkxTV21lRGIrWEFrS0tQL2UwQVMrWElKV2p6MDI5SFdDaXM0T3NZV3VqeksrVjVaVUVkQlJNUEN0QUo4ZApCaDBvRTliSUdIOVB0RTFIdTh6NGpGaG5WUmVqdmdhMzRQdG9QV3JNL01sZnQzLy9Lazg9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== diff --git a/tkg/fakes/config/kubeconfig/config3.yaml b/tkg/fakes/config/kubeconfig/config3.yaml deleted file mode 100644 index b959937e77..0000000000 --- a/tkg/fakes/config/kubeconfig/config3.yaml +++ /dev/null @@ -1,32 +0,0 @@ -current-context: federal-context -apiVersion: v1 -clusters: -- cluster: - api-version: v1 - server: http://cow.org:8080 - name: cow-cluster -- cluster: - insecure-skip-tls-verify: true - server: https://horse.org:4443 - name: horse-cluster -- cluster: - insecure-skip-tls-verify: true - server: https://pig.org:443 - name: pig-cluster -contexts: -- context: - cluster: pig-cluster - namespace: saw-ns - user: black-user - name: queen-anne-context -kind: Config -preferences: - colors: true -users: -- name: blue-user - user: - token: blue-token -- name: green-user - user: - client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJQ24vUDZ1S1pWWTR3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TURBeE1qVXdPRFV4TVRCYUZ3MHlNVEF4TWpRd09EVXhNVEphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJuUmc4dklXQlBWQUJWTFUKNGNFckd4bE5XZVJHR2x0OW0wVElsUStNUytSZU9GNUhROW5pQlRSQWMwVWpsUk1EdzR3aEREVXV3Y2NsazFCNApoa3l2YUx5elZyeW9jOWV5NHU0SVZ0MFR4ZU85VUI5bXZHMkF6TlVnY0FkRkp4cWdKbSt2OXo0RzMyU0EwUEc1CjhxZWtBRzVLYU1RQlJEVm5pNXZBajJ5c0hpdHhkbGdJdEZkc1dzNUgwM3FIUjVNQU5jT01nYlZLSnRtbE9MUngKYWFmRHhxSWRaS0pERENxeDFoaWFlMk5WdWp1TzI3OE9DV3NaN3FUWVR4UzNpVVJBUXNpYWk5Y2Q5T2FITnJSTAozWWtUdTl0b1c5RTNFdVB0b0h3S2N6RlZsNk01dWtaWW5wZDEwL213Y2wzUzA1ZFd2SExhNGVMakZ3Z2RQc05XCkZ4NThTd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNaThWVXZ0RWo0d3g3Z1hZSXhxZU95L1UyY0psQVp3S0Zmdwp3eEJYQjg3V1JYblhZaEt1aWhPeUpCSnM2RVpSOUZWcWUwNm1yZFNOMVRPQW5JdmovZVlEejB5SlZFQlVNMHJ1CmlXWkN2djRxZXBRYUpWSzZBRDBjcjBtZEIvbmFrd3lyS203eTRXdjRSMkhVcWxZdTZXcVRsdTY3V3Ezb1g5VFIKSUFZRUozWXJmSy9QUXV3WHZyUlNDWGg2NVpHT21aL3M0di9vbWlvajdocHp4Zm9OOUkxQ0hoYUV2clFGcW9UcwpiSWJWMDFDa3Nzak9DdUhrQlIzRGxLcENyQ29iMEVYd2E0c2pkNjlVWnJzRElCeUtmZmxqV0pscllYdWdOQ0pPCi9OeUhVS2dMTDk3c0lOR043NElJRmJhNXV2cWRkQm9jTUxGMkFrRHV6UndweC9mVWNrUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= - client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBcm5SZzh2SVdCUFZBQlZMVTRjRXJHeGxOV2VSR0dsdDltMFRJbFErTVMrUmVPRjVIClE5bmlCVFJBYzBVamxSTUR3NHdoRERVdXdjY2xrMUI0aGt5dmFMeXpWcnlvYzlleTR1NElWdDBUeGVPOVVCOW0KdkcyQXpOVWdjQWRGSnhxZ0ptK3Y5ejRHMzJTQTBQRzU4cWVrQUc1S2FNUUJSRFZuaTV2QWoyeXNIaXR4ZGxnSQp0RmRzV3M1SDAzcUhSNU1BTmNPTWdiVktKdG1sT0xSeGFhZkR4cUlkWktKRERDcXgxaGlhZTJOVnVqdU8yNzhPCkNXc1o3cVRZVHhTM2lVUkFRc2lhaTljZDlPYUhOclJMM1lrVHU5dG9XOUUzRXVQdG9Id0tjekZWbDZNNXVrWlkKbnBkMTAvbXdjbDNTMDVkV3ZITGE0ZUxqRndnZFBzTldGeDU4U3dJREFRQUJBb0lCQUNMUloyZ1ZtUDkwVTBxOAp0WEE1TlhrN0c0ME5XbEI0WWlGVElSVmUvUWxJa3VWOUs0d0hPRzBCZUx1STJRa3Z1bGlVNXlPZ21heGpLc1MwCkV0bjdCQ2RMUWgvVmwybEhhNVNQSFdyNHhMR0NPbzU3TmUzMWpQZFVzaHlwMXN0dkxQZCs0d2ZkZ1ZHa3BYRU8KVGFaNGZ1cjNHRExBcStBSktKbGNoSm9iZmw2bXlLc2tKV2NrUmNYY3FWOW5adFRtbGh5aFljZ2tuYkg0dFJmOAp0YzNsR1B5cHF0SmhiWmEyaUMxUGkxMlltYjBwNThFWVVFdVRXdWVjaHBXNHY0cU02V2ZYMXJSeGRSU3RwQkF5Cm50WUF5b3pYYUQ5cDlYbnI5OFNOekFMMW83azF0V29FanRBSXhNVTNlQ1VFTWx5Q01VVVFrUjNGN0JOUk9GWS8KcnNGVVlVRUNnWUVBMHorZ0QwNithSlpsSWkyeUtOYnJNMm1DTjFjQ2hkdVFCSmdvc0VMTS9IN0p1cnY4SFJsQQpvYkxwekJSWXQ3aW82WHBaQndsRnIrM0dabWdTWkkwY3U0L0tIMXRVWU1DRS9pVnVYa0tXVnYva0laUnd0ckpkCmNEU0htNkVxbnRwY2h3aTBQbFltNmx3Vm5lbEpvN282T2dycHFvVXA0cjNvRGNHUzREdU1vTThDZ1lFQTAybGEKelMycTdMVjlEQXZhdVFOQ2wvZ2JLTk9FZG9FR0tYWEVBaFJTYkc3SHpHeVkveDJVSUFocCtuUytFS21wdVF6WQp4UUdqOU5QSlY3WGJqQkg4MmtDcmhtRUx0bG9QOGdQVlhxUGhXTHFzemNUOE1xUFRCYUcxS21IaTRrb3FZb2hhCldJS0pnTFErOEFCTjBOUEJYUTl4NVJVSHVPejhJaUcveVBxcXM4VUNnWUE3WFVqc3BGTkw3dCt5MENhZDVXK3AKUGdBeTd3ZXRlRHNybjFybjFZM25jdlhidlJJblZ6NWJjbnpUTmZDTWlKOG5KWk81TDNqZTdMSHhlMU9YNERQdgozWU9PZGtycStZOG1JSHk0am52VExRditCOG40L1h6V21GeDNkcjRVY0FiS2g3Nm5PZXlydFg3NXBtSmtXV1FkCmhZMk90dWREYWR5NWFPbU9qQTJEN3dLQmdGQ1UwN3RwTU1GUTIvei9kN3NWZHdpZDFSeFdveUxZUXhVQ2dsZVkKajJJdFI1S3Z3aEZib040azF1QlVKeTRLdlZwL2Z4QjRjNW9hTDZCeS9PQUM2ekgxZkd1WUNmTFRtVWhTRmI0aApFUC9WQjVEWENKbjB2N1poMEwvNjE1UVJXTjU5d3BJQ0Q0OHpKTm91QTNzWmU1YVJFSVNVNDRDbE0rVituNjluCmZERlJBb0dBUDZ1NGxrSjg0amRjTVROVTdYeW16ZkMwSkd5aFRNcWQ2YnV4NG9FQlViSFhoOW1DaVRMSmFaV1YKN0F5NkxTV21lRGIrWEFrS0tQL2UwQVMrWElKV2p6MDI5SFdDaXM0T3NZV3VqeksrVjVaVUVkQlJNUEN0QUo4ZApCaDBvRTliSUdIOVB0RTFIdTh6NGpGaG5WUmVqdmdhMzRQdG9QV3JNL01sZnQzLy9Lazg9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== diff --git a/tkg/fakes/config/kubeconfig/config4.yaml b/tkg/fakes/config/kubeconfig/config4.yaml deleted file mode 100644 index 05a690f9a6..0000000000 --- a/tkg/fakes/config/kubeconfig/config4.yaml +++ /dev/null @@ -1,37 +0,0 @@ -current-context: federal-context -apiVersion: v1 -clusters: -- cluster: - api-version: v1 - server: http://cow.org:8080 - name: cow-cluster -- cluster: - insecure-skip-tls-verify: true - server: https://horse.org:4443 - name: horse-cluster -- cluster: - insecure-skip-tls-verify: true - server: https://pig.org:443 - name: pig-cluster -contexts: -- context: - cluster: horse-cluster - namespace: chisel-ns - user: green-user - name: federal-context -- context: - cluster: pig-cluster - namespace: saw-ns - user: black-user - name: queen-anne-context -kind: Config -preferences: - colors: true -users: -- name: blue-user - user: - token: blue-token -- name: green-user - user: - client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJQ24vUDZ1S1pWWTR3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TURBeE1qVXdPRFV4TVRCYUZ3MHlNVEF4TWpRd09EVXhNVEphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJuUmc4dklXQlBWQUJWTFUKNGNFckd4bE5XZVJHR2x0OW0wVElsUStNUytSZU9GNUhROW5pQlRSQWMwVWpsUk1EdzR3aEREVXV3Y2NsazFCNApoa3l2YUx5elZyeW9jOWV5NHU0SVZ0MFR4ZU85VUI5bXZHMkF6TlVnY0FkRkp4cWdKbSt2OXo0RzMyU0EwUEc1CjhxZWtBRzVLYU1RQlJEVm5pNXZBajJ5c0hpdHhkbGdJdEZkc1dzNUgwM3FIUjVNQU5jT01nYlZLSnRtbE9MUngKYWFmRHhxSWRaS0pERENxeDFoaWFlMk5WdWp1TzI3OE9DV3NaN3FUWVR4UzNpVVJBUXNpYWk5Y2Q5T2FITnJSTAozWWtUdTl0b1c5RTNFdVB0b0h3S2N6RlZsNk01dWtaWW5wZDEwL213Y2wzUzA1ZFd2SExhNGVMakZ3Z2RQc05XCkZ4NThTd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNaThWVXZ0RWo0d3g3Z1hZSXhxZU95L1UyY0psQVp3S0Zmdwp3eEJYQjg3V1JYblhZaEt1aWhPeUpCSnM2RVpSOUZWcWUwNm1yZFNOMVRPQW5JdmovZVlEejB5SlZFQlVNMHJ1CmlXWkN2djRxZXBRYUpWSzZBRDBjcjBtZEIvbmFrd3lyS203eTRXdjRSMkhVcWxZdTZXcVRsdTY3V3Ezb1g5VFIKSUFZRUozWXJmSy9QUXV3WHZyUlNDWGg2NVpHT21aL3M0di9vbWlvajdocHp4Zm9OOUkxQ0hoYUV2clFGcW9UcwpiSWJWMDFDa3Nzak9DdUhrQlIzRGxLcENyQ29iMEVYd2E0c2pkNjlVWnJzRElCeUtmZmxqV0pscllYdWdOQ0pPCi9OeUhVS2dMTDk3c0lOR043NElJRmJhNXV2cWRkQm9jTUxGMkFrRHV6UndweC9mVWNrUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= - client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBcm5SZzh2SVdCUFZBQlZMVTRjRXJHeGxOV2VSR0dsdDltMFRJbFErTVMrUmVPRjVIClE5bmlCVFJBYzBVamxSTUR3NHdoRERVdXdjY2xrMUI0aGt5dmFMeXpWcnlvYzlleTR1NElWdDBUeGVPOVVCOW0KdkcyQXpOVWdjQWRGSnhxZ0ptK3Y5ejRHMzJTQTBQRzU4cWVrQUc1S2FNUUJSRFZuaTV2QWoyeXNIaXR4ZGxnSQp0RmRzV3M1SDAzcUhSNU1BTmNPTWdiVktKdG1sT0xSeGFhZkR4cUlkWktKRERDcXgxaGlhZTJOVnVqdU8yNzhPCkNXc1o3cVRZVHhTM2lVUkFRc2lhaTljZDlPYUhOclJMM1lrVHU5dG9XOUUzRXVQdG9Id0tjekZWbDZNNXVrWlkKbnBkMTAvbXdjbDNTMDVkV3ZITGE0ZUxqRndnZFBzTldGeDU4U3dJREFRQUJBb0lCQUNMUloyZ1ZtUDkwVTBxOAp0WEE1TlhrN0c0ME5XbEI0WWlGVElSVmUvUWxJa3VWOUs0d0hPRzBCZUx1STJRa3Z1bGlVNXlPZ21heGpLc1MwCkV0bjdCQ2RMUWgvVmwybEhhNVNQSFdyNHhMR0NPbzU3TmUzMWpQZFVzaHlwMXN0dkxQZCs0d2ZkZ1ZHa3BYRU8KVGFaNGZ1cjNHRExBcStBSktKbGNoSm9iZmw2bXlLc2tKV2NrUmNYY3FWOW5adFRtbGh5aFljZ2tuYkg0dFJmOAp0YzNsR1B5cHF0SmhiWmEyaUMxUGkxMlltYjBwNThFWVVFdVRXdWVjaHBXNHY0cU02V2ZYMXJSeGRSU3RwQkF5Cm50WUF5b3pYYUQ5cDlYbnI5OFNOekFMMW83azF0V29FanRBSXhNVTNlQ1VFTWx5Q01VVVFrUjNGN0JOUk9GWS8KcnNGVVlVRUNnWUVBMHorZ0QwNithSlpsSWkyeUtOYnJNMm1DTjFjQ2hkdVFCSmdvc0VMTS9IN0p1cnY4SFJsQQpvYkxwekJSWXQ3aW82WHBaQndsRnIrM0dabWdTWkkwY3U0L0tIMXRVWU1DRS9pVnVYa0tXVnYva0laUnd0ckpkCmNEU0htNkVxbnRwY2h3aTBQbFltNmx3Vm5lbEpvN282T2dycHFvVXA0cjNvRGNHUzREdU1vTThDZ1lFQTAybGEKelMycTdMVjlEQXZhdVFOQ2wvZ2JLTk9FZG9FR0tYWEVBaFJTYkc3SHpHeVkveDJVSUFocCtuUytFS21wdVF6WQp4UUdqOU5QSlY3WGJqQkg4MmtDcmhtRUx0bG9QOGdQVlhxUGhXTHFzemNUOE1xUFRCYUcxS21IaTRrb3FZb2hhCldJS0pnTFErOEFCTjBOUEJYUTl4NVJVSHVPejhJaUcveVBxcXM4VUNnWUE3WFVqc3BGTkw3dCt5MENhZDVXK3AKUGdBeTd3ZXRlRHNybjFybjFZM25jdlhidlJJblZ6NWJjbnpUTmZDTWlKOG5KWk81TDNqZTdMSHhlMU9YNERQdgozWU9PZGtycStZOG1JSHk0am52VExRditCOG40L1h6V21GeDNkcjRVY0FiS2g3Nm5PZXlydFg3NXBtSmtXV1FkCmhZMk90dWREYWR5NWFPbU9qQTJEN3dLQmdGQ1UwN3RwTU1GUTIvei9kN3NWZHdpZDFSeFdveUxZUXhVQ2dsZVkKajJJdFI1S3Z3aEZib040azF1QlVKeTRLdlZwL2Z4QjRjNW9hTDZCeS9PQUM2ekgxZkd1WUNmTFRtVWhTRmI0aApFUC9WQjVEWENKbjB2N1poMEwvNjE1UVJXTjU5d3BJQ0Q0OHpKTm91QTNzWmU1YVJFSVNVNDRDbE0rVituNjluCmZERlJBb0dBUDZ1NGxrSjg0amRjTVROVTdYeW16ZkMwSkd5aFRNcWQ2YnV4NG9FQlViSFhoOW1DaVRMSmFaV1YKN0F5NkxTV21lRGIrWEFrS0tQL2UwQVMrWElKV2p6MDI5SFdDaXM0T3NZV3VqeksrVjVaVUVkQlJNUEN0QUo4ZApCaDBvRTliSUdIOVB0RTFIdTh6NGpGaG5WUmVqdmdhMzRQdG9QV3JNL01sZnQzLy9Lazg9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== diff --git a/tkg/fakes/config/kubeconfig/config5.yaml b/tkg/fakes/config/kubeconfig/config5.yaml deleted file mode 100644 index f41fa7bdca..0000000000 --- a/tkg/fakes/config/kubeconfig/config5.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -clusters: -- cluster: - server: http://localhost:8080 - name: local-server -contexts: -- context: - cluster: local-server - namespace: the-right-prefix - user: myself - name: default-context -current-context: default-context -kind: Config -preferences: {} -users: -- name: myself - user: - password: secret - username: admin diff --git a/tkg/fakes/config/kubeconfig/config6.yaml b/tkg/fakes/config/kubeconfig/config6.yaml deleted file mode 100644 index 8797df06ce..0000000000 --- a/tkg/fakes/config/kubeconfig/config6.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -clusters: -- cluster: - certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5ekNDQWJPZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01EVXlOVEU1TVRBeE5Gb1hEVE13TURVeU16RTVNVFV4TkZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWtUClFRYjY5VnluTnorRXNGTmgwWENxcjJjVkRkcnV4SW9UQkE1TktBUmZxdmJ2Qlhwd25vRVIzV1dLYWlJeHRhRTcKK0N2Wk5vL3dhVnkxNHRUOUQvdDA5USs2UE4zKzlkSmNDd2lxMlZRL1p6QXAxN3FyZlphKzlCV2ZRWTNjNmlreQpCLy9nYzI4bVp5TG90RnpQb0JlRUdLVTBZWVVEVnlVN21NN3QzWU1TVW5XRGNrcW5GNFF6RjAza2JVNGxGUEpjClhLTUZRKzdaaFc4Q1RyY2tjREc1aVNubGZWdjJRSGlBZnY4NUtlY1VwUjZFcWlvQW1SNHJIdlkxYmh3b0MwV3UKcm8rWmNuZC9sL1l6SVlOMmFsbEJWdmlaVHdQWVRyOEZZNWlwQzAzSmV4WERrbGZyZ1hsejhjSnQzNmFjWnFsVQptYkRmYW0zSXpISkEwb3pPVGVFQ0F3RUFBYU1tTUNRd0RnWURWUjBQQVFIL0JBUURBZ0trTUJJR0ExVWRFd0VCCi93UUlNQVlCQWY4Q0FRQXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBTDRjSE94d09uemRUTzlqQXhVNmdPMWsKY1k2R1VUVi9aOGpNaUNuMzQ0SnpnOTh2U3Y1eHJmT1RZcGRZL2RXSmtrTEJGUVJGa0JudXFOQnJMZlBFZzd0ZwpPNzU4d05DUDB6K1ZhbzBMZkhpczVtOW9SNHp0bGRzdzU2RThBaXpUVHcyMmI4V3d1Rkc1L0tlM1g5SkxMVjdSCmlKdU15dDhDY1ZrNWpDU3kvZldKRWF5K0s3ekJLZllDVHdvdkFocGxMbldBQlp1K1Y2YjY3OTVQRGRTSXVyL2kKNW1CQ0VZSG9CUnhoMkJvZzl1N2M4ek8yWEtPZHg0cFMreGtLYS8zMnNCcm9MY3VOdGxWZUZheVpKUHJMYnpBeAp5RjM0Z21kcEpDOUNSY1BSYlRRbjVWN21tMlE0RUxrc3dsNmJNcm5EWUtpUWdIZ3REVG9yRHdLVkYxeGkzeFE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K - server: https://72.1.43.1:6443 - name: docker-mgmt-1 -contexts: -- context: - cluster: docker-mgmt-1 - user: docker-mgmt-1-admin - name: docker-mgmt-1-admin@docker-mgmt-1 -current-context: docker-mgmt-1-admin@docker-mgmt-1 -kind: Config -preferences: {} -users: -- name: docker-mgmt-1-admin - user: - client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJSnlTUGZneEE1UUF3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TURBMU1qVXhPVEV3TVRSYUZ3MHlNVEExTWpVeE9URTFNVFZhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW5peDlYU2RhTUdBNTNwRmgKMEd1ZGxuNkJ3VmFJWTUrZGZINjcydytMU0dSaWtMcUk1V2QyWVZobWdXbkptYTdWZExURkdxZU9yekpudksvLwpUMGdiMDFQS1M3TFloZThKZU8rRnVqM1BUQWttaDRNUXhMNjErNE5ESG9uZm5mVXI3RjhQZTNlbHJUY2xhWk5TCnRKV0pWdWxCZXpxOWZNcElNNkFNTjZVQ29XUEY1Q2huUzlkclg5QWdLeHdFWnp3Znl6WnpQRjVmQXUvcWdJYm4KWEtFQ3g1MEswV3M1Sko4MmxKUEJRVnpqUzJxMUtraTJwODRUWldiNXhsRzRLL0grNDF5cGluL0VzTEdEeFQweQp3bzBwd0VVZFcwc3dETlVFc2IremVCY0FPcW5BV2pESmVtSmp1akUwSHRRc1RMRENkNnBhLzRNbGhheXlGbUN6CjNpU0Vsd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLdkwraHJnUjhDd3Z6SzM4cDZWTkZtV0daV1BEYmIwWWdqeQpxZVFZVjV1ZmpHbkhaTUtWTVloUHhneTVKejNLM2RuaE5MOUVsN2RvOE02N24vckVoekpQbmJ6c1Y2WDA2Um94CmF3SG9leEZGTEltcUV1S0p1eTVNODFjVnJNSmpLc085NUthUmVPWHNKM1Aya2RTdzIyeXM3bi9kWlBXMVJTVHUKTm14ODRwc0Jmc2FuTjVJbUJWQ09LRHp3cXNQOGpFTklDN0FDZGVURGJsKzZOdENVaTJIR2htLzhJcDgyT2lEcQoveS9VcHhuVFJNUWo5S2w2MEFiYXg3cHR5VGtMZUJPVkpVam1JTEw1UlBVc2JKVDBnS1VwbVBUS2RvTlNuaXpBCnBSeFJQb0tETzZjVFRoeFBxRW40c0s4MDFHcEFPQ0phZlg0SmFWSlhCZVpyMTJDTXl0az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= - client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBbml4OVhTZGFNR0E1M3BGaDBHdWRsbjZCd1ZhSVk1K2RmSDY3MncrTFNHUmlrTHFJCjVXZDJZVmhtZ1duSm1hN1ZkTFRGR3FlT3J6Sm52Sy8vVDBnYjAxUEtTN0xZaGU4SmVPK0Z1ajNQVEFrbWg0TVEKeEw2MSs0TkRIb25mbmZVcjdGOFBlM2VsclRjbGFaTlN0SldKVnVsQmV6cTlmTXBJTTZBTU42VUNvV1BGNUNobgpTOWRyWDlBZ0t4d0VaendmeXpaelBGNWZBdS9xZ0liblhLRUN4NTBLMFdzNUpKODJsSlBCUVZ6alMycTFLa2kyCnA4NFRaV2I1eGxHNEsvSCs0MXlwaW4vRXNMR0R4VDB5d28wcHdFVWRXMHN3RE5VRXNiK3plQmNBT3FuQVdqREoKZW1KanVqRTBIdFFzVExEQ2Q2cGEvNE1saGF5eUZtQ3ozaVNFbHdJREFRQUJBb0lCQUhOWjJxcitzZVVwcDhwSwpsOXpaUG5tc0ZKQ2N2S1o2bHUxZHR6NFFYZkVUVkZaYjBzNEozK2txQU1kTUVMdkZKdUlQbXRiUGIxMFJFMW9sCnQ3bG55dk1ZM2lUS2J1RnQ2NmlJZFN2WE84QWx4RFY3UGRWZGgzVyt5a29SSGtVaHNVQ1dLc0pPQlVNSFBuOTUKOHd6REtQOTY2RWdvRkZ4WFlNUlZhZE9Dd1NKVWJSTlZmalBGdEpiSW01WUptVmdpcm4xSHgvRGxpaHRwZFlrNgpldERGV1JSNFk5eU5HWTI3c2lKeHphLzhpTnJ5dk5nVTBmcXB6aC9ZU1l3VWRmOHdsOVhySVFZeTNGSzZvZGdPClYwU09yMUk0NHBDWVRPNTFjSjFrM1loeHlVZ2RmcnZjbGNneHV1aXdOellLVUg4elVZQnp6V3Z3dEhmVmo4K24KVU9ocFJmRUNnWUVBd1NUYjAxMlZsbS9JNStmWFJ1L3RHamRsNllWYzZST1hBN0I5Ym9qWWxhTVFza0pCKzZ3VQpUcjVoQVA0NjhiWllpVnlqKzdnd0JFYnBSdm43VnB6VmJsUWR2ajFKeUlzdXJTN0I5V1hLZ1gyTWdndjJWelVtCml6TVVPNEJpNW5HV2NKRE5lZVZxMWR2SjVDRERnVDdvMHlzU2JMKytzYm9jMDhYZDZEUFFaUU1DZ1lFQTBhWTEKQXpUelM2UkxTL0E5TzkydHRSMXRnUFdCaTk2Tld6a21QRFZkRGVpSjhjeHI2a0Fud0FjY3pOUk1aTFFBSkpGZwpQblUzUnhyeFl6T0lRankwNzVFMk5HaUVuT25RckZnY2hhcjVQK0hycTJ5ck1ZZEZQUkl2aDNONFpwQkFYVTg1CmdGZDM1WHczVjRBcGR3NnBFV0NaQTJodWtSK2MrNHJ6KzNveUc5MENnWUE2UytyQjZGeFBOTnhhQ3VNeWVSYUMKdERmaGZTeG0rVSs2Z0ZuTHRDaFRPZzIvRURxa1FQTThOVUJJTVhRUEl1K2tQajhNcWpKc0NBOC9LaExQdUxTLwpBVXFjOGhqRUhDWnhoVXhyeWxhT01Sdm80TDF3NHcwSU5ObWxnQUhaOW16bSt2M2FEZ0hxSE5YYU1uMXdGRkhuCjh2Y3p0Y2hVRW8zQzZkVXAwZ0hUaXdLQmdFdDhTY2d1ejQ4ang4eSs0bjFrc3Yvc2Fab3VTNGUrQ1MyWVpURDIKa2R2Sko2bjlUYm5aZ2JaOW1Sd1RNTEp0c1VONWFLcjBiNFBWcXFacVRweHkyVDhORFBSUDBiZmg1RFc1d0FOTQo3VlBZRjQvd242OUVvbVI3NE1zbmcybUNkUHBqNVROVnl5REEyZmhTZUJ1YkZycmdDaGdWQ1FLTjNHc2h1L21ICkpQV3RBb0dCQUt3TEc3OVJ2YTI3MEZJRC9XWFJIR3VRNUh1Q0I5TjdGajR1alpFa3EyRkt1RXJTd1dUeE9UUWEKREVHeXl3dmpHL3VHUCtacW5zN05BZlp6RytNamwySTYyeXh2UzFycEtkRUVTQjlwYlRDWDhoTmthbUhKNGRXUApUcytWajBrMlMxY0owVGk4bnRDU2tTaUh3cklzdDJ5YzZ0ZDV5YWFwSzMrcjcwVDFIV3hCCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== diff --git a/tkg/fakes/crtclientfactory.go b/tkg/fakes/crtclientfactory.go deleted file mode 100644 index e5a6386aae..0000000000 --- a/tkg/fakes/crtclientfactory.go +++ /dev/null @@ -1,121 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "k8s.io/client-go/rest" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -type CrtClientFactory struct { - NewClientStub func(*rest.Config, client.Options) (client.Client, error) - newClientMutex sync.RWMutex - newClientArgsForCall []struct { - arg1 *rest.Config - arg2 client.Options - } - newClientReturns struct { - result1 client.Client - result2 error - } - newClientReturnsOnCall map[int]struct { - result1 client.Client - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *CrtClientFactory) NewClient(arg1 *rest.Config, arg2 client.Options) (client.Client, error) { - fake.newClientMutex.Lock() - ret, specificReturn := fake.newClientReturnsOnCall[len(fake.newClientArgsForCall)] - fake.newClientArgsForCall = append(fake.newClientArgsForCall, struct { - arg1 *rest.Config - arg2 client.Options - }{arg1, arg2}) - stub := fake.NewClientStub - fakeReturns := fake.newClientReturns - fake.recordInvocation("NewClient", []interface{}{arg1, arg2}) - fake.newClientMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *CrtClientFactory) NewClientCallCount() int { - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - return len(fake.newClientArgsForCall) -} - -func (fake *CrtClientFactory) NewClientCalls(stub func(*rest.Config, client.Options) (client.Client, error)) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = stub -} - -func (fake *CrtClientFactory) NewClientArgsForCall(i int) (*rest.Config, client.Options) { - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - argsForCall := fake.newClientArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *CrtClientFactory) NewClientReturns(result1 client.Client, result2 error) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = nil - fake.newClientReturns = struct { - result1 client.Client - result2 error - }{result1, result2} -} - -func (fake *CrtClientFactory) NewClientReturnsOnCall(i int, result1 client.Client, result2 error) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = nil - if fake.newClientReturnsOnCall == nil { - fake.newClientReturnsOnCall = make(map[int]struct { - result1 client.Client - result2 error - }) - } - fake.newClientReturnsOnCall[i] = struct { - result1 client.Client - result2 error - }{result1, result2} -} - -func (fake *CrtClientFactory) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *CrtClientFactory) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ clusterclient.CrtClientFactory = new(CrtClientFactory) diff --git a/tkg/fakes/crtclusterclient.go b/tkg/fakes/crtclusterclient.go deleted file mode 100644 index e1d07dd2be..0000000000 --- a/tkg/fakes/crtclusterclient.go +++ /dev/null @@ -1,786 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "context" - "sync" - - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -type CRTClusterClient struct { - CreateStub func(context.Context, client.Object, ...client.CreateOption) error - createMutex sync.RWMutex - createArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.CreateOption - } - createReturns struct { - result1 error - } - createReturnsOnCall map[int]struct { - result1 error - } - DeleteStub func(context.Context, client.Object, ...client.DeleteOption) error - deleteMutex sync.RWMutex - deleteArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteOption - } - deleteReturns struct { - result1 error - } - deleteReturnsOnCall map[int]struct { - result1 error - } - DeleteAllOfStub func(context.Context, client.Object, ...client.DeleteAllOfOption) error - deleteAllOfMutex sync.RWMutex - deleteAllOfArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteAllOfOption - } - deleteAllOfReturns struct { - result1 error - } - deleteAllOfReturnsOnCall map[int]struct { - result1 error - } - GetStub func(context.Context, types.NamespacedName, client.Object) error - getMutex sync.RWMutex - getArgsForCall []struct { - arg1 context.Context - arg2 types.NamespacedName - arg3 client.Object - } - getReturns struct { - result1 error - } - getReturnsOnCall map[int]struct { - result1 error - } - ListStub func(context.Context, client.ObjectList, ...client.ListOption) error - listMutex sync.RWMutex - listArgsForCall []struct { - arg1 context.Context - arg2 client.ObjectList - arg3 []client.ListOption - } - listReturns struct { - result1 error - } - listReturnsOnCall map[int]struct { - result1 error - } - PatchStub func(context.Context, client.Object, client.Patch, ...client.PatchOption) error - patchMutex sync.RWMutex - patchArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 client.Patch - arg4 []client.PatchOption - } - patchReturns struct { - result1 error - } - patchReturnsOnCall map[int]struct { - result1 error - } - RESTMapperStub func() meta.RESTMapper - rESTMapperMutex sync.RWMutex - rESTMapperArgsForCall []struct { - } - rESTMapperReturns struct { - result1 meta.RESTMapper - } - rESTMapperReturnsOnCall map[int]struct { - result1 meta.RESTMapper - } - SchemeStub func() *runtime.Scheme - schemeMutex sync.RWMutex - schemeArgsForCall []struct { - } - schemeReturns struct { - result1 *runtime.Scheme - } - schemeReturnsOnCall map[int]struct { - result1 *runtime.Scheme - } - StatusStub func() client.StatusWriter - statusMutex sync.RWMutex - statusArgsForCall []struct { - } - statusReturns struct { - result1 client.StatusWriter - } - statusReturnsOnCall map[int]struct { - result1 client.StatusWriter - } - UpdateStub func(context.Context, client.Object, ...client.UpdateOption) error - updateMutex sync.RWMutex - updateArgsForCall []struct { - arg1 context.Context - arg2 client.Object - arg3 []client.UpdateOption - } - updateReturns struct { - result1 error - } - updateReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *CRTClusterClient) Create(arg1 context.Context, arg2 client.Object, arg3 ...client.CreateOption) error { - fake.createMutex.Lock() - ret, specificReturn := fake.createReturnsOnCall[len(fake.createArgsForCall)] - fake.createArgsForCall = append(fake.createArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.CreateOption - }{arg1, arg2, arg3}) - stub := fake.CreateStub - fakeReturns := fake.createReturns - fake.recordInvocation("Create", []interface{}{arg1, arg2, arg3}) - fake.createMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) CreateCallCount() int { - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - return len(fake.createArgsForCall) -} - -func (fake *CRTClusterClient) CreateCalls(stub func(context.Context, client.Object, ...client.CreateOption) error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = stub -} - -func (fake *CRTClusterClient) CreateArgsForCall(i int) (context.Context, client.Object, []client.CreateOption) { - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - argsForCall := fake.createArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) CreateReturns(result1 error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = nil - fake.createReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) CreateReturnsOnCall(i int, result1 error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = nil - if fake.createReturnsOnCall == nil { - fake.createReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.createReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) Delete(arg1 context.Context, arg2 client.Object, arg3 ...client.DeleteOption) error { - fake.deleteMutex.Lock() - ret, specificReturn := fake.deleteReturnsOnCall[len(fake.deleteArgsForCall)] - fake.deleteArgsForCall = append(fake.deleteArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteOption - }{arg1, arg2, arg3}) - stub := fake.DeleteStub - fakeReturns := fake.deleteReturns - fake.recordInvocation("Delete", []interface{}{arg1, arg2, arg3}) - fake.deleteMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) DeleteCallCount() int { - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - return len(fake.deleteArgsForCall) -} - -func (fake *CRTClusterClient) DeleteCalls(stub func(context.Context, client.Object, ...client.DeleteOption) error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = stub -} - -func (fake *CRTClusterClient) DeleteArgsForCall(i int) (context.Context, client.Object, []client.DeleteOption) { - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - argsForCall := fake.deleteArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) DeleteReturns(result1 error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = nil - fake.deleteReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) DeleteReturnsOnCall(i int, result1 error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = nil - if fake.deleteReturnsOnCall == nil { - fake.deleteReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) DeleteAllOf(arg1 context.Context, arg2 client.Object, arg3 ...client.DeleteAllOfOption) error { - fake.deleteAllOfMutex.Lock() - ret, specificReturn := fake.deleteAllOfReturnsOnCall[len(fake.deleteAllOfArgsForCall)] - fake.deleteAllOfArgsForCall = append(fake.deleteAllOfArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.DeleteAllOfOption - }{arg1, arg2, arg3}) - stub := fake.DeleteAllOfStub - fakeReturns := fake.deleteAllOfReturns - fake.recordInvocation("DeleteAllOf", []interface{}{arg1, arg2, arg3}) - fake.deleteAllOfMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) DeleteAllOfCallCount() int { - fake.deleteAllOfMutex.RLock() - defer fake.deleteAllOfMutex.RUnlock() - return len(fake.deleteAllOfArgsForCall) -} - -func (fake *CRTClusterClient) DeleteAllOfCalls(stub func(context.Context, client.Object, ...client.DeleteAllOfOption) error) { - fake.deleteAllOfMutex.Lock() - defer fake.deleteAllOfMutex.Unlock() - fake.DeleteAllOfStub = stub -} - -func (fake *CRTClusterClient) DeleteAllOfArgsForCall(i int) (context.Context, client.Object, []client.DeleteAllOfOption) { - fake.deleteAllOfMutex.RLock() - defer fake.deleteAllOfMutex.RUnlock() - argsForCall := fake.deleteAllOfArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) DeleteAllOfReturns(result1 error) { - fake.deleteAllOfMutex.Lock() - defer fake.deleteAllOfMutex.Unlock() - fake.DeleteAllOfStub = nil - fake.deleteAllOfReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) DeleteAllOfReturnsOnCall(i int, result1 error) { - fake.deleteAllOfMutex.Lock() - defer fake.deleteAllOfMutex.Unlock() - fake.DeleteAllOfStub = nil - if fake.deleteAllOfReturnsOnCall == nil { - fake.deleteAllOfReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteAllOfReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) Get(arg1 context.Context, arg2 types.NamespacedName, arg3 client.Object) error { - fake.getMutex.Lock() - ret, specificReturn := fake.getReturnsOnCall[len(fake.getArgsForCall)] - fake.getArgsForCall = append(fake.getArgsForCall, struct { - arg1 context.Context - arg2 types.NamespacedName - arg3 client.Object - }{arg1, arg2, arg3}) - stub := fake.GetStub - fakeReturns := fake.getReturns - fake.recordInvocation("Get", []interface{}{arg1, arg2, arg3}) - fake.getMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) GetCallCount() int { - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - return len(fake.getArgsForCall) -} - -func (fake *CRTClusterClient) GetCalls(stub func(context.Context, types.NamespacedName, client.Object) error) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = stub -} - -func (fake *CRTClusterClient) GetArgsForCall(i int) (context.Context, types.NamespacedName, client.Object) { - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - argsForCall := fake.getArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) GetReturns(result1 error) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = nil - fake.getReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) GetReturnsOnCall(i int, result1 error) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = nil - if fake.getReturnsOnCall == nil { - fake.getReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.getReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) List(arg1 context.Context, arg2 client.ObjectList, arg3 ...client.ListOption) error { - fake.listMutex.Lock() - ret, specificReturn := fake.listReturnsOnCall[len(fake.listArgsForCall)] - fake.listArgsForCall = append(fake.listArgsForCall, struct { - arg1 context.Context - arg2 client.ObjectList - arg3 []client.ListOption - }{arg1, arg2, arg3}) - stub := fake.ListStub - fakeReturns := fake.listReturns - fake.recordInvocation("List", []interface{}{arg1, arg2, arg3}) - fake.listMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) ListCallCount() int { - fake.listMutex.RLock() - defer fake.listMutex.RUnlock() - return len(fake.listArgsForCall) -} - -func (fake *CRTClusterClient) ListCalls(stub func(context.Context, client.ObjectList, ...client.ListOption) error) { - fake.listMutex.Lock() - defer fake.listMutex.Unlock() - fake.ListStub = stub -} - -func (fake *CRTClusterClient) ListArgsForCall(i int) (context.Context, client.ObjectList, []client.ListOption) { - fake.listMutex.RLock() - defer fake.listMutex.RUnlock() - argsForCall := fake.listArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) ListReturns(result1 error) { - fake.listMutex.Lock() - defer fake.listMutex.Unlock() - fake.ListStub = nil - fake.listReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) ListReturnsOnCall(i int, result1 error) { - fake.listMutex.Lock() - defer fake.listMutex.Unlock() - fake.ListStub = nil - if fake.listReturnsOnCall == nil { - fake.listReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.listReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) Patch(arg1 context.Context, arg2 client.Object, arg3 client.Patch, arg4 ...client.PatchOption) error { - fake.patchMutex.Lock() - ret, specificReturn := fake.patchReturnsOnCall[len(fake.patchArgsForCall)] - fake.patchArgsForCall = append(fake.patchArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 client.Patch - arg4 []client.PatchOption - }{arg1, arg2, arg3, arg4}) - stub := fake.PatchStub - fakeReturns := fake.patchReturns - fake.recordInvocation("Patch", []interface{}{arg1, arg2, arg3, arg4}) - fake.patchMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) PatchCallCount() int { - fake.patchMutex.RLock() - defer fake.patchMutex.RUnlock() - return len(fake.patchArgsForCall) -} - -func (fake *CRTClusterClient) PatchCalls(stub func(context.Context, client.Object, client.Patch, ...client.PatchOption) error) { - fake.patchMutex.Lock() - defer fake.patchMutex.Unlock() - fake.PatchStub = stub -} - -func (fake *CRTClusterClient) PatchArgsForCall(i int) (context.Context, client.Object, client.Patch, []client.PatchOption) { - fake.patchMutex.RLock() - defer fake.patchMutex.RUnlock() - argsForCall := fake.patchArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *CRTClusterClient) PatchReturns(result1 error) { - fake.patchMutex.Lock() - defer fake.patchMutex.Unlock() - fake.PatchStub = nil - fake.patchReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) PatchReturnsOnCall(i int, result1 error) { - fake.patchMutex.Lock() - defer fake.patchMutex.Unlock() - fake.PatchStub = nil - if fake.patchReturnsOnCall == nil { - fake.patchReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.patchReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) RESTMapper() meta.RESTMapper { - fake.rESTMapperMutex.Lock() - ret, specificReturn := fake.rESTMapperReturnsOnCall[len(fake.rESTMapperArgsForCall)] - fake.rESTMapperArgsForCall = append(fake.rESTMapperArgsForCall, struct { - }{}) - stub := fake.RESTMapperStub - fakeReturns := fake.rESTMapperReturns - fake.recordInvocation("RESTMapper", []interface{}{}) - fake.rESTMapperMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) RESTMapperCallCount() int { - fake.rESTMapperMutex.RLock() - defer fake.rESTMapperMutex.RUnlock() - return len(fake.rESTMapperArgsForCall) -} - -func (fake *CRTClusterClient) RESTMapperCalls(stub func() meta.RESTMapper) { - fake.rESTMapperMutex.Lock() - defer fake.rESTMapperMutex.Unlock() - fake.RESTMapperStub = stub -} - -func (fake *CRTClusterClient) RESTMapperReturns(result1 meta.RESTMapper) { - fake.rESTMapperMutex.Lock() - defer fake.rESTMapperMutex.Unlock() - fake.RESTMapperStub = nil - fake.rESTMapperReturns = struct { - result1 meta.RESTMapper - }{result1} -} - -func (fake *CRTClusterClient) RESTMapperReturnsOnCall(i int, result1 meta.RESTMapper) { - fake.rESTMapperMutex.Lock() - defer fake.rESTMapperMutex.Unlock() - fake.RESTMapperStub = nil - if fake.rESTMapperReturnsOnCall == nil { - fake.rESTMapperReturnsOnCall = make(map[int]struct { - result1 meta.RESTMapper - }) - } - fake.rESTMapperReturnsOnCall[i] = struct { - result1 meta.RESTMapper - }{result1} -} - -func (fake *CRTClusterClient) Scheme() *runtime.Scheme { - fake.schemeMutex.Lock() - ret, specificReturn := fake.schemeReturnsOnCall[len(fake.schemeArgsForCall)] - fake.schemeArgsForCall = append(fake.schemeArgsForCall, struct { - }{}) - stub := fake.SchemeStub - fakeReturns := fake.schemeReturns - fake.recordInvocation("Scheme", []interface{}{}) - fake.schemeMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) SchemeCallCount() int { - fake.schemeMutex.RLock() - defer fake.schemeMutex.RUnlock() - return len(fake.schemeArgsForCall) -} - -func (fake *CRTClusterClient) SchemeCalls(stub func() *runtime.Scheme) { - fake.schemeMutex.Lock() - defer fake.schemeMutex.Unlock() - fake.SchemeStub = stub -} - -func (fake *CRTClusterClient) SchemeReturns(result1 *runtime.Scheme) { - fake.schemeMutex.Lock() - defer fake.schemeMutex.Unlock() - fake.SchemeStub = nil - fake.schemeReturns = struct { - result1 *runtime.Scheme - }{result1} -} - -func (fake *CRTClusterClient) SchemeReturnsOnCall(i int, result1 *runtime.Scheme) { - fake.schemeMutex.Lock() - defer fake.schemeMutex.Unlock() - fake.SchemeStub = nil - if fake.schemeReturnsOnCall == nil { - fake.schemeReturnsOnCall = make(map[int]struct { - result1 *runtime.Scheme - }) - } - fake.schemeReturnsOnCall[i] = struct { - result1 *runtime.Scheme - }{result1} -} - -func (fake *CRTClusterClient) Status() client.StatusWriter { - fake.statusMutex.Lock() - ret, specificReturn := fake.statusReturnsOnCall[len(fake.statusArgsForCall)] - fake.statusArgsForCall = append(fake.statusArgsForCall, struct { - }{}) - stub := fake.StatusStub - fakeReturns := fake.statusReturns - fake.recordInvocation("Status", []interface{}{}) - fake.statusMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) StatusCallCount() int { - fake.statusMutex.RLock() - defer fake.statusMutex.RUnlock() - return len(fake.statusArgsForCall) -} - -func (fake *CRTClusterClient) StatusCalls(stub func() client.StatusWriter) { - fake.statusMutex.Lock() - defer fake.statusMutex.Unlock() - fake.StatusStub = stub -} - -func (fake *CRTClusterClient) StatusReturns(result1 client.StatusWriter) { - fake.statusMutex.Lock() - defer fake.statusMutex.Unlock() - fake.StatusStub = nil - fake.statusReturns = struct { - result1 client.StatusWriter - }{result1} -} - -func (fake *CRTClusterClient) StatusReturnsOnCall(i int, result1 client.StatusWriter) { - fake.statusMutex.Lock() - defer fake.statusMutex.Unlock() - fake.StatusStub = nil - if fake.statusReturnsOnCall == nil { - fake.statusReturnsOnCall = make(map[int]struct { - result1 client.StatusWriter - }) - } - fake.statusReturnsOnCall[i] = struct { - result1 client.StatusWriter - }{result1} -} - -func (fake *CRTClusterClient) Update(arg1 context.Context, arg2 client.Object, arg3 ...client.UpdateOption) error { - fake.updateMutex.Lock() - ret, specificReturn := fake.updateReturnsOnCall[len(fake.updateArgsForCall)] - fake.updateArgsForCall = append(fake.updateArgsForCall, struct { - arg1 context.Context - arg2 client.Object - arg3 []client.UpdateOption - }{arg1, arg2, arg3}) - stub := fake.UpdateStub - fakeReturns := fake.updateReturns - fake.recordInvocation("Update", []interface{}{arg1, arg2, arg3}) - fake.updateMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *CRTClusterClient) UpdateCallCount() int { - fake.updateMutex.RLock() - defer fake.updateMutex.RUnlock() - return len(fake.updateArgsForCall) -} - -func (fake *CRTClusterClient) UpdateCalls(stub func(context.Context, client.Object, ...client.UpdateOption) error) { - fake.updateMutex.Lock() - defer fake.updateMutex.Unlock() - fake.UpdateStub = stub -} - -func (fake *CRTClusterClient) UpdateArgsForCall(i int) (context.Context, client.Object, []client.UpdateOption) { - fake.updateMutex.RLock() - defer fake.updateMutex.RUnlock() - argsForCall := fake.updateArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *CRTClusterClient) UpdateReturns(result1 error) { - fake.updateMutex.Lock() - defer fake.updateMutex.Unlock() - fake.UpdateStub = nil - fake.updateReturns = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) UpdateReturnsOnCall(i int, result1 error) { - fake.updateMutex.Lock() - defer fake.updateMutex.Unlock() - fake.UpdateStub = nil - if fake.updateReturnsOnCall == nil { - fake.updateReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.updateReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *CRTClusterClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - fake.deleteAllOfMutex.RLock() - defer fake.deleteAllOfMutex.RUnlock() - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - fake.listMutex.RLock() - defer fake.listMutex.RUnlock() - fake.patchMutex.RLock() - defer fake.patchMutex.RUnlock() - fake.rESTMapperMutex.RLock() - defer fake.rESTMapperMutex.RUnlock() - fake.schemeMutex.RLock() - defer fake.schemeMutex.RUnlock() - fake.statusMutex.RLock() - defer fake.statusMutex.RUnlock() - fake.updateMutex.RLock() - defer fake.updateMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *CRTClusterClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ clusterclient.CrtClient = new(CRTClusterClient) diff --git a/tkg/fakes/discoveryclientfactory.go b/tkg/fakes/discoveryclientfactory.go deleted file mode 100644 index 4b206a75cf..0000000000 --- a/tkg/fakes/discoveryclientfactory.go +++ /dev/null @@ -1,119 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "k8s.io/client-go/discovery" - "k8s.io/client-go/rest" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -type DiscoveryClientFactory struct { - NewDiscoveryClientForConfigStub func(*rest.Config) (discovery.DiscoveryInterface, error) - newDiscoveryClientForConfigMutex sync.RWMutex - newDiscoveryClientForConfigArgsForCall []struct { - arg1 *rest.Config - } - newDiscoveryClientForConfigReturns struct { - result1 discovery.DiscoveryInterface - result2 error - } - newDiscoveryClientForConfigReturnsOnCall map[int]struct { - result1 discovery.DiscoveryInterface - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfig(arg1 *rest.Config) (discovery.DiscoveryInterface, error) { - fake.newDiscoveryClientForConfigMutex.Lock() - ret, specificReturn := fake.newDiscoveryClientForConfigReturnsOnCall[len(fake.newDiscoveryClientForConfigArgsForCall)] - fake.newDiscoveryClientForConfigArgsForCall = append(fake.newDiscoveryClientForConfigArgsForCall, struct { - arg1 *rest.Config - }{arg1}) - stub := fake.NewDiscoveryClientForConfigStub - fakeReturns := fake.newDiscoveryClientForConfigReturns - fake.recordInvocation("NewDiscoveryClientForConfig", []interface{}{arg1}) - fake.newDiscoveryClientForConfigMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfigCallCount() int { - fake.newDiscoveryClientForConfigMutex.RLock() - defer fake.newDiscoveryClientForConfigMutex.RUnlock() - return len(fake.newDiscoveryClientForConfigArgsForCall) -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfigCalls(stub func(*rest.Config) (discovery.DiscoveryInterface, error)) { - fake.newDiscoveryClientForConfigMutex.Lock() - defer fake.newDiscoveryClientForConfigMutex.Unlock() - fake.NewDiscoveryClientForConfigStub = stub -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfigArgsForCall(i int) *rest.Config { - fake.newDiscoveryClientForConfigMutex.RLock() - defer fake.newDiscoveryClientForConfigMutex.RUnlock() - argsForCall := fake.newDiscoveryClientForConfigArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfigReturns(result1 discovery.DiscoveryInterface, result2 error) { - fake.newDiscoveryClientForConfigMutex.Lock() - defer fake.newDiscoveryClientForConfigMutex.Unlock() - fake.NewDiscoveryClientForConfigStub = nil - fake.newDiscoveryClientForConfigReturns = struct { - result1 discovery.DiscoveryInterface - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClientFactory) NewDiscoveryClientForConfigReturnsOnCall(i int, result1 discovery.DiscoveryInterface, result2 error) { - fake.newDiscoveryClientForConfigMutex.Lock() - defer fake.newDiscoveryClientForConfigMutex.Unlock() - fake.NewDiscoveryClientForConfigStub = nil - if fake.newDiscoveryClientForConfigReturnsOnCall == nil { - fake.newDiscoveryClientForConfigReturnsOnCall = make(map[int]struct { - result1 discovery.DiscoveryInterface - result2 error - }) - } - fake.newDiscoveryClientForConfigReturnsOnCall[i] = struct { - result1 discovery.DiscoveryInterface - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClientFactory) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.newDiscoveryClientForConfigMutex.RLock() - defer fake.newDiscoveryClientForConfigMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *DiscoveryClientFactory) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ clusterclient.DiscoveryClientFactory = new(DiscoveryClientFactory) diff --git a/tkg/fakes/discoveryclusterclient.go b/tkg/fakes/discoveryclusterclient.go deleted file mode 100644 index 2df47bbc54..0000000000 --- a/tkg/fakes/discoveryclusterclient.go +++ /dev/null @@ -1,677 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - openapi_v2 "github.com/google/gnostic/openapiv2" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/version" - "k8s.io/client-go/openapi" - "k8s.io/client-go/rest" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -type DiscoveryClient struct { - OpenAPISchemaStub func() (*openapi_v2.Document, error) - openAPISchemaMutex sync.RWMutex - openAPISchemaArgsForCall []struct { - } - openAPISchemaReturns struct { - result1 *openapi_v2.Document - result2 error - } - openAPISchemaReturnsOnCall map[int]struct { - result1 *openapi_v2.Document - result2 error - } - OpenAPIV3Stub func() openapi.Client - openAPIV3Mutex sync.RWMutex - openAPIV3ArgsForCall []struct { - } - openAPIV3Returns struct { - result1 openapi.Client - } - openAPIV3ReturnsOnCall map[int]struct { - result1 openapi.Client - } - RESTClientStub func() rest.Interface - rESTClientMutex sync.RWMutex - rESTClientArgsForCall []struct { - } - rESTClientReturns struct { - result1 rest.Interface - } - rESTClientReturnsOnCall map[int]struct { - result1 rest.Interface - } - ServerGroupsStub func() (*v1.APIGroupList, error) - serverGroupsMutex sync.RWMutex - serverGroupsArgsForCall []struct { - } - serverGroupsReturns struct { - result1 *v1.APIGroupList - result2 error - } - serverGroupsReturnsOnCall map[int]struct { - result1 *v1.APIGroupList - result2 error - } - ServerGroupsAndResourcesStub func() ([]*v1.APIGroup, []*v1.APIResourceList, error) - serverGroupsAndResourcesMutex sync.RWMutex - serverGroupsAndResourcesArgsForCall []struct { - } - serverGroupsAndResourcesReturns struct { - result1 []*v1.APIGroup - result2 []*v1.APIResourceList - result3 error - } - serverGroupsAndResourcesReturnsOnCall map[int]struct { - result1 []*v1.APIGroup - result2 []*v1.APIResourceList - result3 error - } - ServerPreferredNamespacedResourcesStub func() ([]*v1.APIResourceList, error) - serverPreferredNamespacedResourcesMutex sync.RWMutex - serverPreferredNamespacedResourcesArgsForCall []struct { - } - serverPreferredNamespacedResourcesReturns struct { - result1 []*v1.APIResourceList - result2 error - } - serverPreferredNamespacedResourcesReturnsOnCall map[int]struct { - result1 []*v1.APIResourceList - result2 error - } - ServerPreferredResourcesStub func() ([]*v1.APIResourceList, error) - serverPreferredResourcesMutex sync.RWMutex - serverPreferredResourcesArgsForCall []struct { - } - serverPreferredResourcesReturns struct { - result1 []*v1.APIResourceList - result2 error - } - serverPreferredResourcesReturnsOnCall map[int]struct { - result1 []*v1.APIResourceList - result2 error - } - ServerResourcesForGroupVersionStub func(string) (*v1.APIResourceList, error) - serverResourcesForGroupVersionMutex sync.RWMutex - serverResourcesForGroupVersionArgsForCall []struct { - arg1 string - } - serverResourcesForGroupVersionReturns struct { - result1 *v1.APIResourceList - result2 error - } - serverResourcesForGroupVersionReturnsOnCall map[int]struct { - result1 *v1.APIResourceList - result2 error - } - ServerVersionStub func() (*version.Info, error) - serverVersionMutex sync.RWMutex - serverVersionArgsForCall []struct { - } - serverVersionReturns struct { - result1 *version.Info - result2 error - } - serverVersionReturnsOnCall map[int]struct { - result1 *version.Info - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *DiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) { - fake.openAPISchemaMutex.Lock() - ret, specificReturn := fake.openAPISchemaReturnsOnCall[len(fake.openAPISchemaArgsForCall)] - fake.openAPISchemaArgsForCall = append(fake.openAPISchemaArgsForCall, struct { - }{}) - stub := fake.OpenAPISchemaStub - fakeReturns := fake.openAPISchemaReturns - fake.recordInvocation("OpenAPISchema", []interface{}{}) - fake.openAPISchemaMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) OpenAPISchemaCallCount() int { - fake.openAPISchemaMutex.RLock() - defer fake.openAPISchemaMutex.RUnlock() - return len(fake.openAPISchemaArgsForCall) -} - -func (fake *DiscoveryClient) OpenAPISchemaCalls(stub func() (*openapi_v2.Document, error)) { - fake.openAPISchemaMutex.Lock() - defer fake.openAPISchemaMutex.Unlock() - fake.OpenAPISchemaStub = stub -} - -func (fake *DiscoveryClient) OpenAPISchemaReturns(result1 *openapi_v2.Document, result2 error) { - fake.openAPISchemaMutex.Lock() - defer fake.openAPISchemaMutex.Unlock() - fake.OpenAPISchemaStub = nil - fake.openAPISchemaReturns = struct { - result1 *openapi_v2.Document - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) OpenAPISchemaReturnsOnCall(i int, result1 *openapi_v2.Document, result2 error) { - fake.openAPISchemaMutex.Lock() - defer fake.openAPISchemaMutex.Unlock() - fake.OpenAPISchemaStub = nil - if fake.openAPISchemaReturnsOnCall == nil { - fake.openAPISchemaReturnsOnCall = make(map[int]struct { - result1 *openapi_v2.Document - result2 error - }) - } - fake.openAPISchemaReturnsOnCall[i] = struct { - result1 *openapi_v2.Document - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) OpenAPIV3() openapi.Client { - fake.openAPIV3Mutex.Lock() - ret, specificReturn := fake.openAPIV3ReturnsOnCall[len(fake.openAPIV3ArgsForCall)] - fake.openAPIV3ArgsForCall = append(fake.openAPIV3ArgsForCall, struct { - }{}) - stub := fake.OpenAPIV3Stub - fakeReturns := fake.openAPIV3Returns - fake.recordInvocation("OpenAPIV3", []interface{}{}) - fake.openAPIV3Mutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *DiscoveryClient) OpenAPIV3CallCount() int { - fake.openAPIV3Mutex.RLock() - defer fake.openAPIV3Mutex.RUnlock() - return len(fake.openAPIV3ArgsForCall) -} - -func (fake *DiscoveryClient) OpenAPIV3Calls(stub func() openapi.Client) { - fake.openAPIV3Mutex.Lock() - defer fake.openAPIV3Mutex.Unlock() - fake.OpenAPIV3Stub = stub -} - -func (fake *DiscoveryClient) OpenAPIV3Returns(result1 openapi.Client) { - fake.openAPIV3Mutex.Lock() - defer fake.openAPIV3Mutex.Unlock() - fake.OpenAPIV3Stub = nil - fake.openAPIV3Returns = struct { - result1 openapi.Client - }{result1} -} - -func (fake *DiscoveryClient) OpenAPIV3ReturnsOnCall(i int, result1 openapi.Client) { - fake.openAPIV3Mutex.Lock() - defer fake.openAPIV3Mutex.Unlock() - fake.OpenAPIV3Stub = nil - if fake.openAPIV3ReturnsOnCall == nil { - fake.openAPIV3ReturnsOnCall = make(map[int]struct { - result1 openapi.Client - }) - } - fake.openAPIV3ReturnsOnCall[i] = struct { - result1 openapi.Client - }{result1} -} - -func (fake *DiscoveryClient) RESTClient() rest.Interface { - fake.rESTClientMutex.Lock() - ret, specificReturn := fake.rESTClientReturnsOnCall[len(fake.rESTClientArgsForCall)] - fake.rESTClientArgsForCall = append(fake.rESTClientArgsForCall, struct { - }{}) - stub := fake.RESTClientStub - fakeReturns := fake.rESTClientReturns - fake.recordInvocation("RESTClient", []interface{}{}) - fake.rESTClientMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *DiscoveryClient) RESTClientCallCount() int { - fake.rESTClientMutex.RLock() - defer fake.rESTClientMutex.RUnlock() - return len(fake.rESTClientArgsForCall) -} - -func (fake *DiscoveryClient) RESTClientCalls(stub func() rest.Interface) { - fake.rESTClientMutex.Lock() - defer fake.rESTClientMutex.Unlock() - fake.RESTClientStub = stub -} - -func (fake *DiscoveryClient) RESTClientReturns(result1 rest.Interface) { - fake.rESTClientMutex.Lock() - defer fake.rESTClientMutex.Unlock() - fake.RESTClientStub = nil - fake.rESTClientReturns = struct { - result1 rest.Interface - }{result1} -} - -func (fake *DiscoveryClient) RESTClientReturnsOnCall(i int, result1 rest.Interface) { - fake.rESTClientMutex.Lock() - defer fake.rESTClientMutex.Unlock() - fake.RESTClientStub = nil - if fake.rESTClientReturnsOnCall == nil { - fake.rESTClientReturnsOnCall = make(map[int]struct { - result1 rest.Interface - }) - } - fake.rESTClientReturnsOnCall[i] = struct { - result1 rest.Interface - }{result1} -} - -func (fake *DiscoveryClient) ServerGroups() (*v1.APIGroupList, error) { - fake.serverGroupsMutex.Lock() - ret, specificReturn := fake.serverGroupsReturnsOnCall[len(fake.serverGroupsArgsForCall)] - fake.serverGroupsArgsForCall = append(fake.serverGroupsArgsForCall, struct { - }{}) - stub := fake.ServerGroupsStub - fakeReturns := fake.serverGroupsReturns - fake.recordInvocation("ServerGroups", []interface{}{}) - fake.serverGroupsMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) ServerGroupsCallCount() int { - fake.serverGroupsMutex.RLock() - defer fake.serverGroupsMutex.RUnlock() - return len(fake.serverGroupsArgsForCall) -} - -func (fake *DiscoveryClient) ServerGroupsCalls(stub func() (*v1.APIGroupList, error)) { - fake.serverGroupsMutex.Lock() - defer fake.serverGroupsMutex.Unlock() - fake.ServerGroupsStub = stub -} - -func (fake *DiscoveryClient) ServerGroupsReturns(result1 *v1.APIGroupList, result2 error) { - fake.serverGroupsMutex.Lock() - defer fake.serverGroupsMutex.Unlock() - fake.ServerGroupsStub = nil - fake.serverGroupsReturns = struct { - result1 *v1.APIGroupList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerGroupsReturnsOnCall(i int, result1 *v1.APIGroupList, result2 error) { - fake.serverGroupsMutex.Lock() - defer fake.serverGroupsMutex.Unlock() - fake.ServerGroupsStub = nil - if fake.serverGroupsReturnsOnCall == nil { - fake.serverGroupsReturnsOnCall = make(map[int]struct { - result1 *v1.APIGroupList - result2 error - }) - } - fake.serverGroupsReturnsOnCall[i] = struct { - result1 *v1.APIGroupList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerGroupsAndResources() ([]*v1.APIGroup, []*v1.APIResourceList, error) { - fake.serverGroupsAndResourcesMutex.Lock() - ret, specificReturn := fake.serverGroupsAndResourcesReturnsOnCall[len(fake.serverGroupsAndResourcesArgsForCall)] - fake.serverGroupsAndResourcesArgsForCall = append(fake.serverGroupsAndResourcesArgsForCall, struct { - }{}) - stub := fake.ServerGroupsAndResourcesStub - fakeReturns := fake.serverGroupsAndResourcesReturns - fake.recordInvocation("ServerGroupsAndResources", []interface{}{}) - fake.serverGroupsAndResourcesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *DiscoveryClient) ServerGroupsAndResourcesCallCount() int { - fake.serverGroupsAndResourcesMutex.RLock() - defer fake.serverGroupsAndResourcesMutex.RUnlock() - return len(fake.serverGroupsAndResourcesArgsForCall) -} - -func (fake *DiscoveryClient) ServerGroupsAndResourcesCalls(stub func() ([]*v1.APIGroup, []*v1.APIResourceList, error)) { - fake.serverGroupsAndResourcesMutex.Lock() - defer fake.serverGroupsAndResourcesMutex.Unlock() - fake.ServerGroupsAndResourcesStub = stub -} - -func (fake *DiscoveryClient) ServerGroupsAndResourcesReturns(result1 []*v1.APIGroup, result2 []*v1.APIResourceList, result3 error) { - fake.serverGroupsAndResourcesMutex.Lock() - defer fake.serverGroupsAndResourcesMutex.Unlock() - fake.ServerGroupsAndResourcesStub = nil - fake.serverGroupsAndResourcesReturns = struct { - result1 []*v1.APIGroup - result2 []*v1.APIResourceList - result3 error - }{result1, result2, result3} -} - -func (fake *DiscoveryClient) ServerGroupsAndResourcesReturnsOnCall(i int, result1 []*v1.APIGroup, result2 []*v1.APIResourceList, result3 error) { - fake.serverGroupsAndResourcesMutex.Lock() - defer fake.serverGroupsAndResourcesMutex.Unlock() - fake.ServerGroupsAndResourcesStub = nil - if fake.serverGroupsAndResourcesReturnsOnCall == nil { - fake.serverGroupsAndResourcesReturnsOnCall = make(map[int]struct { - result1 []*v1.APIGroup - result2 []*v1.APIResourceList - result3 error - }) - } - fake.serverGroupsAndResourcesReturnsOnCall[i] = struct { - result1 []*v1.APIGroup - result2 []*v1.APIResourceList - result3 error - }{result1, result2, result3} -} - -func (fake *DiscoveryClient) ServerPreferredNamespacedResources() ([]*v1.APIResourceList, error) { - fake.serverPreferredNamespacedResourcesMutex.Lock() - ret, specificReturn := fake.serverPreferredNamespacedResourcesReturnsOnCall[len(fake.serverPreferredNamespacedResourcesArgsForCall)] - fake.serverPreferredNamespacedResourcesArgsForCall = append(fake.serverPreferredNamespacedResourcesArgsForCall, struct { - }{}) - stub := fake.ServerPreferredNamespacedResourcesStub - fakeReturns := fake.serverPreferredNamespacedResourcesReturns - fake.recordInvocation("ServerPreferredNamespacedResources", []interface{}{}) - fake.serverPreferredNamespacedResourcesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) ServerPreferredNamespacedResourcesCallCount() int { - fake.serverPreferredNamespacedResourcesMutex.RLock() - defer fake.serverPreferredNamespacedResourcesMutex.RUnlock() - return len(fake.serverPreferredNamespacedResourcesArgsForCall) -} - -func (fake *DiscoveryClient) ServerPreferredNamespacedResourcesCalls(stub func() ([]*v1.APIResourceList, error)) { - fake.serverPreferredNamespacedResourcesMutex.Lock() - defer fake.serverPreferredNamespacedResourcesMutex.Unlock() - fake.ServerPreferredNamespacedResourcesStub = stub -} - -func (fake *DiscoveryClient) ServerPreferredNamespacedResourcesReturns(result1 []*v1.APIResourceList, result2 error) { - fake.serverPreferredNamespacedResourcesMutex.Lock() - defer fake.serverPreferredNamespacedResourcesMutex.Unlock() - fake.ServerPreferredNamespacedResourcesStub = nil - fake.serverPreferredNamespacedResourcesReturns = struct { - result1 []*v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerPreferredNamespacedResourcesReturnsOnCall(i int, result1 []*v1.APIResourceList, result2 error) { - fake.serverPreferredNamespacedResourcesMutex.Lock() - defer fake.serverPreferredNamespacedResourcesMutex.Unlock() - fake.ServerPreferredNamespacedResourcesStub = nil - if fake.serverPreferredNamespacedResourcesReturnsOnCall == nil { - fake.serverPreferredNamespacedResourcesReturnsOnCall = make(map[int]struct { - result1 []*v1.APIResourceList - result2 error - }) - } - fake.serverPreferredNamespacedResourcesReturnsOnCall[i] = struct { - result1 []*v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerPreferredResources() ([]*v1.APIResourceList, error) { - fake.serverPreferredResourcesMutex.Lock() - ret, specificReturn := fake.serverPreferredResourcesReturnsOnCall[len(fake.serverPreferredResourcesArgsForCall)] - fake.serverPreferredResourcesArgsForCall = append(fake.serverPreferredResourcesArgsForCall, struct { - }{}) - stub := fake.ServerPreferredResourcesStub - fakeReturns := fake.serverPreferredResourcesReturns - fake.recordInvocation("ServerPreferredResources", []interface{}{}) - fake.serverPreferredResourcesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) ServerPreferredResourcesCallCount() int { - fake.serverPreferredResourcesMutex.RLock() - defer fake.serverPreferredResourcesMutex.RUnlock() - return len(fake.serverPreferredResourcesArgsForCall) -} - -func (fake *DiscoveryClient) ServerPreferredResourcesCalls(stub func() ([]*v1.APIResourceList, error)) { - fake.serverPreferredResourcesMutex.Lock() - defer fake.serverPreferredResourcesMutex.Unlock() - fake.ServerPreferredResourcesStub = stub -} - -func (fake *DiscoveryClient) ServerPreferredResourcesReturns(result1 []*v1.APIResourceList, result2 error) { - fake.serverPreferredResourcesMutex.Lock() - defer fake.serverPreferredResourcesMutex.Unlock() - fake.ServerPreferredResourcesStub = nil - fake.serverPreferredResourcesReturns = struct { - result1 []*v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerPreferredResourcesReturnsOnCall(i int, result1 []*v1.APIResourceList, result2 error) { - fake.serverPreferredResourcesMutex.Lock() - defer fake.serverPreferredResourcesMutex.Unlock() - fake.ServerPreferredResourcesStub = nil - if fake.serverPreferredResourcesReturnsOnCall == nil { - fake.serverPreferredResourcesReturnsOnCall = make(map[int]struct { - result1 []*v1.APIResourceList - result2 error - }) - } - fake.serverPreferredResourcesReturnsOnCall[i] = struct { - result1 []*v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersion(arg1 string) (*v1.APIResourceList, error) { - fake.serverResourcesForGroupVersionMutex.Lock() - ret, specificReturn := fake.serverResourcesForGroupVersionReturnsOnCall[len(fake.serverResourcesForGroupVersionArgsForCall)] - fake.serverResourcesForGroupVersionArgsForCall = append(fake.serverResourcesForGroupVersionArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ServerResourcesForGroupVersionStub - fakeReturns := fake.serverResourcesForGroupVersionReturns - fake.recordInvocation("ServerResourcesForGroupVersion", []interface{}{arg1}) - fake.serverResourcesForGroupVersionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersionCallCount() int { - fake.serverResourcesForGroupVersionMutex.RLock() - defer fake.serverResourcesForGroupVersionMutex.RUnlock() - return len(fake.serverResourcesForGroupVersionArgsForCall) -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersionCalls(stub func(string) (*v1.APIResourceList, error)) { - fake.serverResourcesForGroupVersionMutex.Lock() - defer fake.serverResourcesForGroupVersionMutex.Unlock() - fake.ServerResourcesForGroupVersionStub = stub -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersionArgsForCall(i int) string { - fake.serverResourcesForGroupVersionMutex.RLock() - defer fake.serverResourcesForGroupVersionMutex.RUnlock() - argsForCall := fake.serverResourcesForGroupVersionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersionReturns(result1 *v1.APIResourceList, result2 error) { - fake.serverResourcesForGroupVersionMutex.Lock() - defer fake.serverResourcesForGroupVersionMutex.Unlock() - fake.ServerResourcesForGroupVersionStub = nil - fake.serverResourcesForGroupVersionReturns = struct { - result1 *v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerResourcesForGroupVersionReturnsOnCall(i int, result1 *v1.APIResourceList, result2 error) { - fake.serverResourcesForGroupVersionMutex.Lock() - defer fake.serverResourcesForGroupVersionMutex.Unlock() - fake.ServerResourcesForGroupVersionStub = nil - if fake.serverResourcesForGroupVersionReturnsOnCall == nil { - fake.serverResourcesForGroupVersionReturnsOnCall = make(map[int]struct { - result1 *v1.APIResourceList - result2 error - }) - } - fake.serverResourcesForGroupVersionReturnsOnCall[i] = struct { - result1 *v1.APIResourceList - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerVersion() (*version.Info, error) { - fake.serverVersionMutex.Lock() - ret, specificReturn := fake.serverVersionReturnsOnCall[len(fake.serverVersionArgsForCall)] - fake.serverVersionArgsForCall = append(fake.serverVersionArgsForCall, struct { - }{}) - stub := fake.ServerVersionStub - fakeReturns := fake.serverVersionReturns - fake.recordInvocation("ServerVersion", []interface{}{}) - fake.serverVersionMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DiscoveryClient) ServerVersionCallCount() int { - fake.serverVersionMutex.RLock() - defer fake.serverVersionMutex.RUnlock() - return len(fake.serverVersionArgsForCall) -} - -func (fake *DiscoveryClient) ServerVersionCalls(stub func() (*version.Info, error)) { - fake.serverVersionMutex.Lock() - defer fake.serverVersionMutex.Unlock() - fake.ServerVersionStub = stub -} - -func (fake *DiscoveryClient) ServerVersionReturns(result1 *version.Info, result2 error) { - fake.serverVersionMutex.Lock() - defer fake.serverVersionMutex.Unlock() - fake.ServerVersionStub = nil - fake.serverVersionReturns = struct { - result1 *version.Info - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) ServerVersionReturnsOnCall(i int, result1 *version.Info, result2 error) { - fake.serverVersionMutex.Lock() - defer fake.serverVersionMutex.Unlock() - fake.ServerVersionStub = nil - if fake.serverVersionReturnsOnCall == nil { - fake.serverVersionReturnsOnCall = make(map[int]struct { - result1 *version.Info - result2 error - }) - } - fake.serverVersionReturnsOnCall[i] = struct { - result1 *version.Info - result2 error - }{result1, result2} -} - -func (fake *DiscoveryClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.openAPISchemaMutex.RLock() - defer fake.openAPISchemaMutex.RUnlock() - fake.openAPIV3Mutex.RLock() - defer fake.openAPIV3Mutex.RUnlock() - fake.rESTClientMutex.RLock() - defer fake.rESTClientMutex.RUnlock() - fake.serverGroupsMutex.RLock() - defer fake.serverGroupsMutex.RUnlock() - fake.serverGroupsAndResourcesMutex.RLock() - defer fake.serverGroupsAndResourcesMutex.RUnlock() - fake.serverPreferredNamespacedResourcesMutex.RLock() - defer fake.serverPreferredNamespacedResourcesMutex.RUnlock() - fake.serverPreferredResourcesMutex.RLock() - defer fake.serverPreferredResourcesMutex.RUnlock() - fake.serverResourcesForGroupVersionMutex.RLock() - defer fake.serverResourcesForGroupVersionMutex.RUnlock() - fake.serverVersionMutex.RLock() - defer fake.serverVersionMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *DiscoveryClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ clusterclient.DiscoveryClient = new(DiscoveryClient) diff --git a/tkg/fakes/dynamicclientfactory.go b/tkg/fakes/dynamicclientfactory.go deleted file mode 100644 index 0727b2ead3..0000000000 --- a/tkg/fakes/dynamicclientfactory.go +++ /dev/null @@ -1,119 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "k8s.io/client-go/dynamic" - "k8s.io/client-go/rest" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -type DynamicClientFactory struct { - NewDynamicClientForConfigStub func(*rest.Config) (dynamic.Interface, error) - newDynamicClientForConfigMutex sync.RWMutex - newDynamicClientForConfigArgsForCall []struct { - arg1 *rest.Config - } - newDynamicClientForConfigReturns struct { - result1 dynamic.Interface - result2 error - } - newDynamicClientForConfigReturnsOnCall map[int]struct { - result1 dynamic.Interface - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfig(arg1 *rest.Config) (dynamic.Interface, error) { - fake.newDynamicClientForConfigMutex.Lock() - ret, specificReturn := fake.newDynamicClientForConfigReturnsOnCall[len(fake.newDynamicClientForConfigArgsForCall)] - fake.newDynamicClientForConfigArgsForCall = append(fake.newDynamicClientForConfigArgsForCall, struct { - arg1 *rest.Config - }{arg1}) - stub := fake.NewDynamicClientForConfigStub - fakeReturns := fake.newDynamicClientForConfigReturns - fake.recordInvocation("NewDynamicClientForConfig", []interface{}{arg1}) - fake.newDynamicClientForConfigMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfigCallCount() int { - fake.newDynamicClientForConfigMutex.RLock() - defer fake.newDynamicClientForConfigMutex.RUnlock() - return len(fake.newDynamicClientForConfigArgsForCall) -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfigCalls(stub func(*rest.Config) (dynamic.Interface, error)) { - fake.newDynamicClientForConfigMutex.Lock() - defer fake.newDynamicClientForConfigMutex.Unlock() - fake.NewDynamicClientForConfigStub = stub -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfigArgsForCall(i int) *rest.Config { - fake.newDynamicClientForConfigMutex.RLock() - defer fake.newDynamicClientForConfigMutex.RUnlock() - argsForCall := fake.newDynamicClientForConfigArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfigReturns(result1 dynamic.Interface, result2 error) { - fake.newDynamicClientForConfigMutex.Lock() - defer fake.newDynamicClientForConfigMutex.Unlock() - fake.NewDynamicClientForConfigStub = nil - fake.newDynamicClientForConfigReturns = struct { - result1 dynamic.Interface - result2 error - }{result1, result2} -} - -func (fake *DynamicClientFactory) NewDynamicClientForConfigReturnsOnCall(i int, result1 dynamic.Interface, result2 error) { - fake.newDynamicClientForConfigMutex.Lock() - defer fake.newDynamicClientForConfigMutex.Unlock() - fake.NewDynamicClientForConfigStub = nil - if fake.newDynamicClientForConfigReturnsOnCall == nil { - fake.newDynamicClientForConfigReturnsOnCall = make(map[int]struct { - result1 dynamic.Interface - result2 error - }) - } - fake.newDynamicClientForConfigReturnsOnCall[i] = struct { - result1 dynamic.Interface - result2 error - }{result1, result2} -} - -func (fake *DynamicClientFactory) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.newDynamicClientForConfigMutex.RLock() - defer fake.newDynamicClientForConfigMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *DynamicClientFactory) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ clusterclient.DynamicClientFactory = new(DynamicClientFactory) diff --git a/tkg/fakes/fake_featuregate_helper.go b/tkg/fakes/fake_featuregate_helper.go deleted file mode 100644 index d9b3664b8f..0000000000 --- a/tkg/fakes/fake_featuregate_helper.go +++ /dev/null @@ -1,120 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "context" - "sync" - //"github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type FakeFeatureGateHelper struct { - FeatureActivatedInNamespaceStub func(context.Context, string, string) (bool, error) - featureActivatedInNamespaceMutex sync.RWMutex - featureActivatedInNamespaceArgsForCall []struct { - arg1 context.Context - arg2 string - arg3 string - } - featureActivatedInNamespaceReturns struct { - result1 bool - result2 error - } - featureActivatedInNamespaceReturnsOnCall map[int]struct { - result1 bool - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *FakeFeatureGateHelper) FeatureActivatedInNamespace(arg1 context.Context, arg2 string, arg3 string) (bool, error) { - fake.featureActivatedInNamespaceMutex.Lock() - ret, specificReturn := fake.featureActivatedInNamespaceReturnsOnCall[len(fake.featureActivatedInNamespaceArgsForCall)] - fake.featureActivatedInNamespaceArgsForCall = append(fake.featureActivatedInNamespaceArgsForCall, struct { - arg1 context.Context - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.FeatureActivatedInNamespaceStub - fakeReturns := fake.featureActivatedInNamespaceReturns - fake.recordInvocation("FeatureActivatedInNamespace", []interface{}{arg1, arg2, arg3}) - fake.featureActivatedInNamespaceMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FakeFeatureGateHelper) FeatureActivatedInNamespaceCallCount() int { - fake.featureActivatedInNamespaceMutex.RLock() - defer fake.featureActivatedInNamespaceMutex.RUnlock() - return len(fake.featureActivatedInNamespaceArgsForCall) -} - -func (fake *FakeFeatureGateHelper) FeatureActivatedInNamespaceCalls(stub func(context.Context, string, string) (bool, error)) { - fake.featureActivatedInNamespaceMutex.Lock() - defer fake.featureActivatedInNamespaceMutex.Unlock() - fake.FeatureActivatedInNamespaceStub = stub -} - -func (fake *FakeFeatureGateHelper) FeatureActivatedInNamespaceArgsForCall(i int) (context.Context, string, string) { - fake.featureActivatedInNamespaceMutex.RLock() - defer fake.featureActivatedInNamespaceMutex.RUnlock() - argsForCall := fake.featureActivatedInNamespaceArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *FakeFeatureGateHelper) FeatureActivatedInNamespaceReturns(result1 bool, result2 error) { - fake.featureActivatedInNamespaceMutex.Lock() - defer fake.featureActivatedInNamespaceMutex.Unlock() - fake.FeatureActivatedInNamespaceStub = nil - fake.featureActivatedInNamespaceReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *FakeFeatureGateHelper) FeatureActivatedInNamespaceReturnsOnCall(i int, result1 bool, result2 error) { - fake.featureActivatedInNamespaceMutex.Lock() - defer fake.featureActivatedInNamespaceMutex.Unlock() - fake.FeatureActivatedInNamespaceStub = nil - if fake.featureActivatedInNamespaceReturnsOnCall == nil { - fake.featureActivatedInNamespaceReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.featureActivatedInNamespaceReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *FakeFeatureGateHelper) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.featureActivatedInNamespaceMutex.RLock() - defer fake.featureActivatedInNamespaceMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *FakeFeatureGateHelper) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -//var _ tkgctl.FeatureGateHelper = new(FakeFeatureGateHelper) diff --git a/tkg/fakes/featureflagclient.go b/tkg/fakes/featureflagclient.go deleted file mode 100644 index 297f12210b..0000000000 --- a/tkg/fakes/featureflagclient.go +++ /dev/null @@ -1,116 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" -) - -type FeatureFlagClient struct { - IsConfigFeatureActivatedStub func(string) (bool, error) - isConfigFeatureActivatedMutex sync.RWMutex - isConfigFeatureActivatedArgsForCall []struct { - arg1 string - } - isConfigFeatureActivatedReturns struct { - result1 bool - result2 error - } - isConfigFeatureActivatedReturnsOnCall map[int]struct { - result1 bool - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *FeatureFlagClient) IsConfigFeatureActivated(arg1 string) (bool, error) { - fake.isConfigFeatureActivatedMutex.Lock() - ret, specificReturn := fake.isConfigFeatureActivatedReturnsOnCall[len(fake.isConfigFeatureActivatedArgsForCall)] - fake.isConfigFeatureActivatedArgsForCall = append(fake.isConfigFeatureActivatedArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.IsConfigFeatureActivatedStub - fakeReturns := fake.isConfigFeatureActivatedReturns - fake.recordInvocation("IsConfigFeatureActivated", []interface{}{arg1}) - fake.isConfigFeatureActivatedMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FeatureFlagClient) IsConfigFeatureActivatedCallCount() int { - fake.isConfigFeatureActivatedMutex.RLock() - defer fake.isConfigFeatureActivatedMutex.RUnlock() - return len(fake.isConfigFeatureActivatedArgsForCall) -} - -func (fake *FeatureFlagClient) IsConfigFeatureActivatedCalls(stub func(string) (bool, error)) { - fake.isConfigFeatureActivatedMutex.Lock() - defer fake.isConfigFeatureActivatedMutex.Unlock() - fake.IsConfigFeatureActivatedStub = stub -} - -func (fake *FeatureFlagClient) IsConfigFeatureActivatedArgsForCall(i int) string { - fake.isConfigFeatureActivatedMutex.RLock() - defer fake.isConfigFeatureActivatedMutex.RUnlock() - argsForCall := fake.isConfigFeatureActivatedArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *FeatureFlagClient) IsConfigFeatureActivatedReturns(result1 bool, result2 error) { - fake.isConfigFeatureActivatedMutex.Lock() - defer fake.isConfigFeatureActivatedMutex.Unlock() - fake.IsConfigFeatureActivatedStub = nil - fake.isConfigFeatureActivatedReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *FeatureFlagClient) IsConfigFeatureActivatedReturnsOnCall(i int, result1 bool, result2 error) { - fake.isConfigFeatureActivatedMutex.Lock() - defer fake.isConfigFeatureActivatedMutex.Unlock() - fake.IsConfigFeatureActivatedStub = nil - if fake.isConfigFeatureActivatedReturnsOnCall == nil { - fake.isConfigFeatureActivatedReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.isConfigFeatureActivatedReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *FeatureFlagClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.isConfigFeatureActivatedMutex.RLock() - defer fake.isConfigFeatureActivatedMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *FeatureFlagClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ client.FeatureFlagClient = new(FeatureFlagClient) diff --git a/tkg/fakes/featuresclient.go b/tkg/fakes/featuresclient.go deleted file mode 100644 index d99a4d12a6..0000000000 --- a/tkg/fakes/featuresclient.go +++ /dev/null @@ -1,339 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/tkg/features" -) - -type FeaturesClient struct { - GetFeatureFlagStub func(string) (string, error) - getFeatureFlagMutex sync.RWMutex - getFeatureFlagArgsForCall []struct { - arg1 string - } - getFeatureFlagReturns struct { - result1 string - result2 error - } - getFeatureFlagReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetFeatureFlagsStub func() (map[string]string, error) - getFeatureFlagsMutex sync.RWMutex - getFeatureFlagsArgsForCall []struct { - } - getFeatureFlagsReturns struct { - result1 map[string]string - result2 error - } - getFeatureFlagsReturnsOnCall map[int]struct { - result1 map[string]string - result2 error - } - IsFeatureFlagEnabledStub func(string) (bool, error) - isFeatureFlagEnabledMutex sync.RWMutex - isFeatureFlagEnabledArgsForCall []struct { - arg1 string - } - isFeatureFlagEnabledReturns struct { - result1 bool - result2 error - } - isFeatureFlagEnabledReturnsOnCall map[int]struct { - result1 bool - result2 error - } - WriteFeatureFlagsStub func(map[string]string) error - writeFeatureFlagsMutex sync.RWMutex - writeFeatureFlagsArgsForCall []struct { - arg1 map[string]string - } - writeFeatureFlagsReturns struct { - result1 error - } - writeFeatureFlagsReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *FeaturesClient) GetFeatureFlag(arg1 string) (string, error) { - fake.getFeatureFlagMutex.Lock() - ret, specificReturn := fake.getFeatureFlagReturnsOnCall[len(fake.getFeatureFlagArgsForCall)] - fake.getFeatureFlagArgsForCall = append(fake.getFeatureFlagArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetFeatureFlagStub - fakeReturns := fake.getFeatureFlagReturns - fake.recordInvocation("GetFeatureFlag", []interface{}{arg1}) - fake.getFeatureFlagMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FeaturesClient) GetFeatureFlagCallCount() int { - fake.getFeatureFlagMutex.RLock() - defer fake.getFeatureFlagMutex.RUnlock() - return len(fake.getFeatureFlagArgsForCall) -} - -func (fake *FeaturesClient) GetFeatureFlagCalls(stub func(string) (string, error)) { - fake.getFeatureFlagMutex.Lock() - defer fake.getFeatureFlagMutex.Unlock() - fake.GetFeatureFlagStub = stub -} - -func (fake *FeaturesClient) GetFeatureFlagArgsForCall(i int) string { - fake.getFeatureFlagMutex.RLock() - defer fake.getFeatureFlagMutex.RUnlock() - argsForCall := fake.getFeatureFlagArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *FeaturesClient) GetFeatureFlagReturns(result1 string, result2 error) { - fake.getFeatureFlagMutex.Lock() - defer fake.getFeatureFlagMutex.Unlock() - fake.GetFeatureFlagStub = nil - fake.getFeatureFlagReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *FeaturesClient) GetFeatureFlagReturnsOnCall(i int, result1 string, result2 error) { - fake.getFeatureFlagMutex.Lock() - defer fake.getFeatureFlagMutex.Unlock() - fake.GetFeatureFlagStub = nil - if fake.getFeatureFlagReturnsOnCall == nil { - fake.getFeatureFlagReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getFeatureFlagReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *FeaturesClient) GetFeatureFlags() (map[string]string, error) { - fake.getFeatureFlagsMutex.Lock() - ret, specificReturn := fake.getFeatureFlagsReturnsOnCall[len(fake.getFeatureFlagsArgsForCall)] - fake.getFeatureFlagsArgsForCall = append(fake.getFeatureFlagsArgsForCall, struct { - }{}) - stub := fake.GetFeatureFlagsStub - fakeReturns := fake.getFeatureFlagsReturns - fake.recordInvocation("GetFeatureFlags", []interface{}{}) - fake.getFeatureFlagsMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FeaturesClient) GetFeatureFlagsCallCount() int { - fake.getFeatureFlagsMutex.RLock() - defer fake.getFeatureFlagsMutex.RUnlock() - return len(fake.getFeatureFlagsArgsForCall) -} - -func (fake *FeaturesClient) GetFeatureFlagsCalls(stub func() (map[string]string, error)) { - fake.getFeatureFlagsMutex.Lock() - defer fake.getFeatureFlagsMutex.Unlock() - fake.GetFeatureFlagsStub = stub -} - -func (fake *FeaturesClient) GetFeatureFlagsReturns(result1 map[string]string, result2 error) { - fake.getFeatureFlagsMutex.Lock() - defer fake.getFeatureFlagsMutex.Unlock() - fake.GetFeatureFlagsStub = nil - fake.getFeatureFlagsReturns = struct { - result1 map[string]string - result2 error - }{result1, result2} -} - -func (fake *FeaturesClient) GetFeatureFlagsReturnsOnCall(i int, result1 map[string]string, result2 error) { - fake.getFeatureFlagsMutex.Lock() - defer fake.getFeatureFlagsMutex.Unlock() - fake.GetFeatureFlagsStub = nil - if fake.getFeatureFlagsReturnsOnCall == nil { - fake.getFeatureFlagsReturnsOnCall = make(map[int]struct { - result1 map[string]string - result2 error - }) - } - fake.getFeatureFlagsReturnsOnCall[i] = struct { - result1 map[string]string - result2 error - }{result1, result2} -} - -func (fake *FeaturesClient) IsFeatureFlagEnabled(arg1 string) (bool, error) { - fake.isFeatureFlagEnabledMutex.Lock() - ret, specificReturn := fake.isFeatureFlagEnabledReturnsOnCall[len(fake.isFeatureFlagEnabledArgsForCall)] - fake.isFeatureFlagEnabledArgsForCall = append(fake.isFeatureFlagEnabledArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.IsFeatureFlagEnabledStub - fakeReturns := fake.isFeatureFlagEnabledReturns - fake.recordInvocation("IsFeatureFlagEnabled", []interface{}{arg1}) - fake.isFeatureFlagEnabledMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FeaturesClient) IsFeatureFlagEnabledCallCount() int { - fake.isFeatureFlagEnabledMutex.RLock() - defer fake.isFeatureFlagEnabledMutex.RUnlock() - return len(fake.isFeatureFlagEnabledArgsForCall) -} - -func (fake *FeaturesClient) IsFeatureFlagEnabledCalls(stub func(string) (bool, error)) { - fake.isFeatureFlagEnabledMutex.Lock() - defer fake.isFeatureFlagEnabledMutex.Unlock() - fake.IsFeatureFlagEnabledStub = stub -} - -func (fake *FeaturesClient) IsFeatureFlagEnabledArgsForCall(i int) string { - fake.isFeatureFlagEnabledMutex.RLock() - defer fake.isFeatureFlagEnabledMutex.RUnlock() - argsForCall := fake.isFeatureFlagEnabledArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *FeaturesClient) IsFeatureFlagEnabledReturns(result1 bool, result2 error) { - fake.isFeatureFlagEnabledMutex.Lock() - defer fake.isFeatureFlagEnabledMutex.Unlock() - fake.IsFeatureFlagEnabledStub = nil - fake.isFeatureFlagEnabledReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *FeaturesClient) IsFeatureFlagEnabledReturnsOnCall(i int, result1 bool, result2 error) { - fake.isFeatureFlagEnabledMutex.Lock() - defer fake.isFeatureFlagEnabledMutex.Unlock() - fake.IsFeatureFlagEnabledStub = nil - if fake.isFeatureFlagEnabledReturnsOnCall == nil { - fake.isFeatureFlagEnabledReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.isFeatureFlagEnabledReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *FeaturesClient) WriteFeatureFlags(arg1 map[string]string) error { - fake.writeFeatureFlagsMutex.Lock() - ret, specificReturn := fake.writeFeatureFlagsReturnsOnCall[len(fake.writeFeatureFlagsArgsForCall)] - fake.writeFeatureFlagsArgsForCall = append(fake.writeFeatureFlagsArgsForCall, struct { - arg1 map[string]string - }{arg1}) - stub := fake.WriteFeatureFlagsStub - fakeReturns := fake.writeFeatureFlagsReturns - fake.recordInvocation("WriteFeatureFlags", []interface{}{arg1}) - fake.writeFeatureFlagsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *FeaturesClient) WriteFeatureFlagsCallCount() int { - fake.writeFeatureFlagsMutex.RLock() - defer fake.writeFeatureFlagsMutex.RUnlock() - return len(fake.writeFeatureFlagsArgsForCall) -} - -func (fake *FeaturesClient) WriteFeatureFlagsCalls(stub func(map[string]string) error) { - fake.writeFeatureFlagsMutex.Lock() - defer fake.writeFeatureFlagsMutex.Unlock() - fake.WriteFeatureFlagsStub = stub -} - -func (fake *FeaturesClient) WriteFeatureFlagsArgsForCall(i int) map[string]string { - fake.writeFeatureFlagsMutex.RLock() - defer fake.writeFeatureFlagsMutex.RUnlock() - argsForCall := fake.writeFeatureFlagsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *FeaturesClient) WriteFeatureFlagsReturns(result1 error) { - fake.writeFeatureFlagsMutex.Lock() - defer fake.writeFeatureFlagsMutex.Unlock() - fake.WriteFeatureFlagsStub = nil - fake.writeFeatureFlagsReturns = struct { - result1 error - }{result1} -} - -func (fake *FeaturesClient) WriteFeatureFlagsReturnsOnCall(i int, result1 error) { - fake.writeFeatureFlagsMutex.Lock() - defer fake.writeFeatureFlagsMutex.Unlock() - fake.WriteFeatureFlagsStub = nil - if fake.writeFeatureFlagsReturnsOnCall == nil { - fake.writeFeatureFlagsReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.writeFeatureFlagsReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *FeaturesClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.getFeatureFlagMutex.RLock() - defer fake.getFeatureFlagMutex.RUnlock() - fake.getFeatureFlagsMutex.RLock() - defer fake.getFeatureFlagsMutex.RUnlock() - fake.isFeatureFlagEnabledMutex.RLock() - defer fake.isFeatureFlagEnabledMutex.RUnlock() - fake.writeFeatureFlagsMutex.RLock() - defer fake.writeFeatureFlagsMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *FeaturesClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ features.Client = new(FeaturesClient) diff --git a/tkg/fakes/helper/common.go b/tkg/fakes/helper/common.go deleted file mode 100644 index 76e19fdab5..0000000000 --- a/tkg/fakes/helper/common.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package helper - -import ( - "fmt" - "os" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -// GetFakeKubeConfigFilePath returns fake kubeconfig file path -func GetFakeKubeConfigFilePath(testingDir, filePath string) string { - f, err := os.CreateTemp(testingDir, "kube") - if err != nil { - fmt.Println("Error creating TempFile: ", err.Error()) - } - copyFile(filePath, f.Name()) - return f.Name() -} - -func copyFile(sourceFile, destFile string) { - input, err := os.ReadFile(sourceFile) - if err != nil { - fmt.Println("Error ReadFile TempFile: ", err.Error()) - } - _ = os.WriteFile(destFile, input, constants.ConfigFilePermissions) - if err != nil { - fmt.Println("Error WriteFile TempFile: ", err.Error()) - } -} - -// CreateTempTestingDirectory create temporary directory for testing -func CreateTempTestingDirectory() string { - testingDir, _ := os.MkdirTemp("", "testing") - return testingDir -} - -// DeleteTempTestingDirectory deletes temporary directory -func DeleteTempTestingDirectory(testingDir string) { - os.Remove(testingDir) -} diff --git a/tkg/fakes/helper/fakeobjectcreater.go b/tkg/fakes/helper/fakeobjectcreater.go deleted file mode 100644 index aa2e9afe7d..0000000000 --- a/tkg/fakes/helper/fakeobjectcreater.go +++ /dev/null @@ -1,611 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package helper implements helper functions used for unit tests -package helper - -import ( - "crypto/x509" - "encoding/base64" - "encoding/json" - "encoding/pem" - "fmt" - "strconv" - "strings" - - rbacv1 "k8s.io/api/rbac/v1" - - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - capav1beta2 "sigs.k8s.io/cluster-api-provider-aws/v2/api/v1beta2" - capzv1beta1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capiv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - cabpkv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/apis/cli/v1alpha1" - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -// ###################### Fake CAPI objects creation helper ###################### - -// GetAllCAPIClusterObjects returns list of runtime.Objects for CAPI cluster -// includes: -// v1aplha3.Cluster, v1aplha3.KubeadmControlPlane v1aplha3.MachineDeployment, []v1aplha2.Machine -func GetAllCAPIClusterObjects(options TestAllClusterComponentOptions) []runtime.Object { - runtimeObjects := []runtime.Object{} - runtimeObjects = append(runtimeObjects, NewCluster(options)) - runtimeObjects = append(runtimeObjects, NewKCP(options)) - runtimeObjects = append(runtimeObjects, NewMD(options)...) - runtimeObjects = append(runtimeObjects, NewMachines(options)...) - runtimeObjects = append(runtimeObjects, NewInfrastructureTemplates(options)...) - runtimeObjects = append(runtimeObjects, NewInfrastructureComponents(options)...) - return runtimeObjects -} - -// NewCluster returns a CAPI v1aplha3.Cluster object -func NewCluster(options TestAllClusterComponentOptions) *capi.Cluster { - cluster := &capi.Cluster{ - TypeMeta: metav1.TypeMeta{ - Kind: "Cluster", - APIVersion: capi.GroupVersion.String(), - }, - ObjectMeta: metav1.ObjectMeta{ - Name: options.ClusterName, - Namespace: options.Namespace, - Labels: options.Labels, - Annotations: annotations(options.ClusterOptions.OperationType, - options.ClusterOptions.OperationtTimeout, - options.ClusterOptions.StartTimestamp, - options.ClusterOptions.LastObservedTimestamp), - }, - } - cluster.Spec = capi.ClusterSpec{ - ControlPlaneRef: &corev1.ObjectReference{ - Kind: "KubeadmControlPlane", - Namespace: options.Namespace, - Name: "kcp-" + options.ClusterName, - APIVersion: controlplanev1.GroupVersion.String(), - }, - Topology: &capi.Topology{ - Class: options.ClusterTopology.Class, - Version: options.ClusterTopology.Version, - }, - } - cluster.Status = capi.ClusterStatus{ - Phase: options.ClusterOptions.Phase, - InfrastructureReady: options.ClusterOptions.InfrastructureReady, - ControlPlaneReady: options.ClusterOptions.ControlPlaneReady, - } - return cluster -} - -// NewKCP returns a CAPI v1aplha3.KubeadmControlPlane object -func NewKCP(options TestAllClusterComponentOptions) runtime.Object { - kcp := &controlplanev1.KubeadmControlPlane{ - ObjectMeta: metav1.ObjectMeta{ - Name: "kcp-" + options.ClusterName, - Namespace: options.Namespace, - Labels: map[string]string{capi.ClusterLabelName: options.ClusterName}, - }, - Spec: controlplanev1.KubeadmControlPlaneSpec{ - MachineTemplate: controlplanev1.KubeadmControlPlaneMachineTemplate{ - InfrastructureRef: corev1.ObjectReference{ - Kind: options.CPOptions.InfrastructureTemplate.Kind, - Namespace: options.CPOptions.InfrastructureTemplate.Namespace, - Name: options.CPOptions.InfrastructureTemplate.Name, - }, - }, - Version: options.CPOptions.K8sVersion, - Replicas: &options.CPOptions.SpecReplicas, - KubeadmConfigSpec: cabpkv1.KubeadmConfigSpec{ - ClusterConfiguration: &cabpkv1.ClusterConfiguration{ - ImageRepository: options.ClusterConfigurationOptions.ImageRepository, - DNS: cabpkv1.DNS{ImageMeta: cabpkv1.ImageMeta{ - ImageRepository: options.ClusterConfigurationOptions.DNSImageRepository, - ImageTag: options.ClusterConfigurationOptions.DNSImageTag, - }}, - Etcd: cabpkv1.Etcd{Local: &cabpkv1.LocalEtcd{ - DataDir: options.ClusterConfigurationOptions.EtcdLocalDataDir, - ImageMeta: cabpkv1.ImageMeta{ - ImageRepository: options.ClusterConfigurationOptions.EtcdImageRepository, - ImageTag: options.ClusterConfigurationOptions.EtcdImageTag, - }, - }}, - }, - }, - }, - Status: controlplanev1.KubeadmControlPlaneStatus{ - Replicas: options.CPOptions.Replicas, - ReadyReplicas: options.CPOptions.ReadyReplicas, - UpdatedReplicas: options.CPOptions.UpdatedReplicas, - }, - } - return kcp -} - -// NewMD returns a CAPI v1aplha3.MachineDeployment object -func NewMD(options TestAllClusterComponentOptions) []runtime.Object { - mds := []runtime.Object{} - for index, MDOptions := range options.ListMDOptions { - md := &capi.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "md-" + strconv.Itoa(index) + "-" + options.ClusterName, - Namespace: options.Namespace, - Labels: map[string]string{capi.ClusterLabelName: options.ClusterName}, - }, - Spec: capi.MachineDeploymentSpec{ - Replicas: &MDOptions.SpecReplicas, - Template: capi.MachineTemplateSpec{ - Spec: capi.MachineSpec{ - InfrastructureRef: corev1.ObjectReference{ - Kind: MDOptions.InfrastructureTemplate.Kind, - Name: MDOptions.InfrastructureTemplate.Name, - Namespace: MDOptions.InfrastructureTemplate.Namespace, - }, - }, - }, - }, - Status: capi.MachineDeploymentStatus{ - Replicas: MDOptions.Replicas, - ReadyReplicas: MDOptions.ReadyReplicas, - UpdatedReplicas: MDOptions.UpdatedReplicas, - }, - } - mds = append(mds, md) - } - return mds -} - -// NewMachines returns new []v1aplha3.Machine objects -func NewMachines(options TestAllClusterComponentOptions) []runtime.Object { - machines := []runtime.Object{} - for i, machineOption := range options.MachineOptions { - machine := &capi.Machine{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: options.Namespace, - Name: "machine-" + strconv.Itoa(i) + options.ClusterName, - Labels: map[string]string{capi.ClusterLabelName: options.ClusterName}, - }, - Spec: capi.MachineSpec{ - Version: &machineOption.K8sVersion, - }, - Status: capi.MachineStatus{ - Phase: machineOption.Phase, - }, - } - if machineOption.IsCP { - machine.Labels[capi.MachineControlPlaneLabelName] = "true" - } - machines = append(machines, machine) - } - return machines -} - -func NewInfrastructureComponents(options TestAllClusterComponentOptions) []runtime.Object { - infrastructureComponents := []runtime.Object{} - if options.InfraComponentsOptions.AWSCluster != nil { - infrastructureComponents = append(infrastructureComponents, NewAWSCluster(*options.InfraComponentsOptions.AWSCluster)) - } - return infrastructureComponents -} - -func NewAWSCluster(awsClusterOptions TestAWSClusterOptions) runtime.Object { - awsCluster := capav1beta2.AWSCluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: awsClusterOptions.Name, - Namespace: awsClusterOptions.Namespace, - }, - Spec: capav1beta2.AWSClusterSpec{ - Region: awsClusterOptions.Region, - }, - } - return &awsCluster -} - -// NewClusterAPIAWSControllerComponents inserts a minimal fake of -// Cluster API Provider AWS controller objects for testing. -func NewClusterAPIAWSControllerComponents() []runtime.Object { - components := []runtime.Object{} - ns := &corev1.Namespace{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterclient.CAPAControllerNamespace, - }, - } - secret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterclient.CAPACredentialsSecretName, - Namespace: clusterclient.CAPAControllerNamespace, - }, - Data: map[string][]byte{ - "credentials": []byte(base64.StdEncoding.EncodeToString([]byte("fakeawscredentials"))), - }, - } - deployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterclient.CAPAControllerDeploymentName, - Namespace: clusterclient.CAPAControllerNamespace, - }, - Spec: appsv1.DeploymentSpec{ - Template: corev1.PodTemplateSpec{ - Spec: corev1.PodSpec{}, - }, - }, - } - components = append(components, ns, secret, deployment) - return components -} - -// NewInfrastructureTemplates returns new InfrastructureMachine objects -func NewInfrastructureTemplates(options TestAllClusterComponentOptions) []runtime.Object { - infrastructureTemplates := []runtime.Object{} - - kcpTemplate := NewInfrastructureMachineTemplate(options.CPOptions.InfrastructureTemplate) - if kcpTemplate != nil { - infrastructureTemplates = append(infrastructureTemplates, kcpTemplate) - } - - for _, MDOptions := range options.ListMDOptions { - mdTemplate := NewInfrastructureMachineTemplate(MDOptions.InfrastructureTemplate) - if mdTemplate != nil { - infrastructureTemplates = append(infrastructureTemplates, mdTemplate) - } - } - - return infrastructureTemplates -} - -// NewInfrastructureMachineTemplate returns new Machine template based on infa -func NewInfrastructureMachineTemplate(templateOptions TestObject) runtime.Object { - switch templateOptions.Kind { - case constants.KindVSphereMachineTemplate: - return NewVSphereMachineTemplate(templateOptions) - case constants.KindAWSMachineTemplate: - return NewAWSMachineTemplate(templateOptions) - case constants.KindAzureMachineTemplate: - return NewAzureMachineTemplate(templateOptions) - default: - return nil - } -} - -// NewVSphereMachineTemplate returns new VSphereMachineTemplate -func NewVSphereMachineTemplate(templateOptions TestObject) runtime.Object { - template := capvv1beta1.VSphereMachineTemplate{ - ObjectMeta: metav1.ObjectMeta{ - Name: templateOptions.Name, - Namespace: templateOptions.Namespace, - }, - } - - return &template -} - -// NewAWSMachineTemplate returns new AWSMachineTemplate -func NewAWSMachineTemplate(templateOptions TestObject) runtime.Object { - template := capav1beta2.AWSMachineTemplate{ - ObjectMeta: metav1.ObjectMeta{ - Name: templateOptions.Name, - Namespace: templateOptions.Namespace, - }, - } - - return &template -} - -// NewAzureMachineTemplate returns new AzureMachineTemplate -func NewAzureMachineTemplate(templateOptions TestObject) runtime.Object { - template := capzv1beta1.AzureMachineTemplate{ - ObjectMeta: metav1.ObjectMeta{ - Name: templateOptions.Name, - Namespace: templateOptions.Namespace, - }, - } - - return &template -} - -func annotations(operationType string, operationtTimeout int, startTimestamp string, lastObservedTimestamp string) map[string]string { - operationStatus := clusterclient.OperationStatus{ - Operation: operationType, - OperationTimeout: operationtTimeout, - OperationStartTimestamp: startTimestamp, - } - operationStatusBytes, _ := json.Marshal(operationStatus) - operationStatusString := strings.ReplaceAll((string(operationStatusBytes)), "\"", "\\\"") - - annotation := map[string]string{ - clusterclient.TKGOperationInfoKey: operationStatusString, - clusterclient.TKGOperationLastObservedTimestampKey: lastObservedTimestamp, - } - return annotation -} - -// CreateDummyClusterObjects creates the dummy CAPI Cluster objects -// use this function when cluster configuration is not that important -func CreateDummyClusterObjects(clusterName, namespace string) []runtime.Object { - return GetAllCAPIClusterObjects(TestAllClusterComponentOptions{ - ClusterName: clusterName, - Namespace: namespace, - ClusterOptions: TestClusterOptions{ - Phase: "running", - InfrastructureReady: true, - ControlPlaneInitialized: true, - ControlPlaneReady: true, - }, - CPOptions: TestCPOptions{ - SpecReplicas: 1, - ReadyReplicas: 1, - UpdatedReplicas: 1, - Replicas: 1, - K8sVersion: "v1.18.2+vmware.1", - }, - ListMDOptions: GetListMDOptionsFromMDOptions(TestMDOptions{ - SpecReplicas: 1, - ReadyReplicas: 1, - UpdatedReplicas: 1, - Replicas: 1, - }), - MachineOptions: []TestMachineOptions{ - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: true}, - {Phase: "running", K8sVersion: "v1.18.2+vmware.1", IsCP: false}, - }, - }) -} - -// ###################### Fake Pacific objects creation helper ###################### - -// GetAllPacificClusterObjects returns list of runtime.Objects for pacific cluster -// includes: -// TanzuKubernetesCluster, v1aplha2.MachineDeployment, []v1aplha2.Machine -func GetAllPacificClusterObjects(options TestAllClusterComponentOptions) []runtime.Object { - runtimeObjects := []runtime.Object{} - runtimeObjects = append(runtimeObjects, NewPacificCluster(options)) - runtimeObjects = append(runtimeObjects, NewMDForPacific(options)) - runtimeObjects = append(runtimeObjects, NewMachinesForPacific(options)...) - return runtimeObjects -} - -// NewPacificCluster returns new TanzuKubernetesCluster object -func NewPacificCluster(options TestAllClusterComponentOptions) runtime.Object { - return &tkgsv1alpha2.TanzuKubernetesCluster{ - TypeMeta: metav1.TypeMeta{ - APIVersion: constants.DefaultPacificClusterAPIVersion, - Kind: constants.PacificClusterKind, - }, - ObjectMeta: metav1.ObjectMeta{ - Name: options.ClusterName, - Namespace: options.Namespace, - Labels: options.Labels, - }, - Spec: tkgsv1alpha2.TanzuKubernetesClusterSpec{ - Distribution: tkgsv1alpha2.Distribution{ - Version: options.CPOptions.K8sVersion, - }, - Topology: tkgsv1alpha2.Topology{ - ControlPlane: tkgsv1alpha2.TopologySettings{ - Replicas: &options.CPOptions.SpecReplicas, - }, - NodePools: []tkgsv1alpha2.NodePool{ - { - Name: "workers", - TopologySettings: tkgsv1alpha2.TopologySettings{ - Replicas: &options.CPOptions.SpecReplicas, - }, - }, - }, - }, - }, - Status: tkgsv1alpha2.TanzuKubernetesClusterStatus{ - Phase: tkgsv1alpha2.TanzuKubernetesClusterPhase(options.ClusterOptions.Phase), - }, - } -} - -// NewMDForPacific returns new v1aplha2.MachineDeployment object -func NewMDForPacific(options TestAllClusterComponentOptions) runtime.Object { - md := &capiv1alpha3.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "md-" + options.ClusterName, - Namespace: options.Namespace, - Labels: map[string]string{capiv1alpha3.ClusterLabelName: options.ClusterName}, - }, - Spec: capiv1alpha3.MachineDeploymentSpec{ - Replicas: &options.ListMDOptions[0].SpecReplicas, - }, - Status: capiv1alpha3.MachineDeploymentStatus{ - Replicas: options.ListMDOptions[0].Replicas, - ReadyReplicas: options.ListMDOptions[0].ReadyReplicas, - UpdatedReplicas: options.ListMDOptions[0].UpdatedReplicas, - }, - } - return md -} - -// NewMachinesForPacific returns new []v1aplha2.Machine objects -func NewMachinesForPacific(options TestAllClusterComponentOptions) []runtime.Object { - machines := []runtime.Object{} - for i, machineOption := range options.MachineOptions { - machine := &capiv1alpha3.Machine{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: options.Namespace, - Name: "machine-" + strconv.Itoa(i) + options.ClusterName, - Labels: map[string]string{capi.ClusterLabelName: options.ClusterName}, - }, - Spec: capiv1alpha3.MachineSpec{ - Version: &machineOption.K8sVersion, - }, - Status: capiv1alpha3.MachineStatus{ - Phase: machineOption.Phase, - }, - } - if machineOption.IsCP { - machine.Labels[capi.MachineControlPlaneLabelName] = "true" - } - machines = append(machines, machine) - } - return machines -} - -// ###################### Generic objects creation helper ###################### - -// NewDaemonSet returns new daemonset object from options -func NewDaemonSet(options TestDaemonSetOption) runtime.Object { - ds := &appsv1.DaemonSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: options.Name, - Namespace: options.Namespace, - }, - } - if options.IncludeContainer { - container := corev1.Container{Name: options.Name, Image: options.Image} - ds.Spec.Template.Spec.Containers = []corev1.Container{container} - } - return ds -} - -// NewDeployment returns new deployment object from options -func NewDeployment(options TestDeploymentOption) runtime.Object { - dp := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: options.Name, - Namespace: options.Namespace, - }, - } - return dp -} - -// NewClusterRoleBinding returns new cluster role binding object from options -func NewClusterRoleBinding(options TestClusterRoleBindingOption) runtime.Object { - clusterRoleBinding := &rbacv1.ClusterRoleBinding{ - ObjectMeta: metav1.ObjectMeta{ - Name: options.Name, - Namespace: constants.DefaultNamespace, - }, - } - return clusterRoleBinding -} - -// NewClusterRole returns new cluster role from options -func NewClusterRole(options TestClusterRoleOption) runtime.Object { - clusterRole := &rbacv1.ClusterRole{ - ObjectMeta: metav1.ObjectMeta{ - Name: options.Name, - Namespace: constants.DefaultNamespace, - }, - } - return clusterRole -} - -// NewServiceAccount returns new service account from options -func NewServiceAccount(options TestServiceAccountOption) runtime.Object { - serviceAccount := &corev1.ServiceAccount{ - ObjectMeta: metav1.ObjectMeta{ - Name: options.Name, - Namespace: options.Namespace, - }, - } - return serviceAccount -} - -// NewMachineHealthCheck returns new MachineHealthCheck object -func NewMachineHealthCheck(options TestMachineHealthCheckOption) *capi.MachineHealthCheck { - mhc := &capi.MachineHealthCheck{ - ObjectMeta: metav1.ObjectMeta{ - Name: options.Name, - Namespace: options.Namespace, - }, - Spec: capi.MachineHealthCheckSpec{ - ClusterName: options.ClusterName, - }, - } - return mhc -} - -// GetListMDOptionsFromMDOptions returns list from MDOptions -func GetListMDOptionsFromMDOptions(options ...TestMDOptions) []TestMDOptions { - listOptions := []TestMDOptions{} - return append(listOptions, options...) -} - -// GetFakeClusterInfo returns the cluster-info configmap -func GetFakeClusterInfo(server string, cert *x509.Certificate) string { - clusterInfoJSON := ` - { - "kind": "ConfigMap", - "apiVersion": "v1", - "data": { - "kubeconfig": "apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: %s\n server: %s\n name: \"\"\ncontexts: null\ncurrent-context: \"\"\nkind: Config\npreferences: {}\nusers: null\n" - }, - "metadata": { - "name": "cluster-info", - "namespace": "kube-public" - } - }` - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: cert.Raw}) - clusterInfoJSON = fmt.Sprintf(clusterInfoJSON, base64.StdEncoding.EncodeToString(certBytes), server) - - return clusterInfoJSON -} - -// GetFakePinnipedInfo returns the pinniped-info configmap -func GetFakePinnipedInfo(pinnipedInfo pinnipedinfo.PinnipedInfo) string { - data, err := json.Marshal(pinnipedInfo) - if err != nil { - err = fmt.Errorf("could not marshal Pinniped info into JSON: %w", err) - } - - pinnipedInfoJSON := ` - { - "kind": "ConfigMap", - "apiVersion": "v1", - "metadata": { - "name": "pinniped-info", - "namespace": "kube-public" - }, - "data": %s - }` - pinnipedInfoJSON = fmt.Sprintf(pinnipedInfoJSON, string(data)) - return pinnipedInfoJSON -} - -// NewCLIPlugin returns new NewCLIPlugin object -func NewCLIPlugin(options TestCLIPluginOption) v1alpha1.CLIPlugin { - artifacts := []v1alpha1.Artifact{ - { - Image: "fake.image.repo.com/tkg/plugin/test-darwin-plugin:v1.4.0", - OS: "darwin", - Arch: "amd64", - }, - { - Image: "fake.image.repo.com/tkg/plugin/test-linux-plugin:v1.4.0", - OS: "linux", - Arch: "amd64", - }, - { - Image: "fake.image.repo.com/tkg/plugin/test-windows-plugin:v1.4.0", - OS: "windows", - Arch: "amd64", - }, - } - cliplugin := v1alpha1.CLIPlugin{ - ObjectMeta: metav1.ObjectMeta{ - Name: options.Name, - }, - Spec: v1alpha1.CLIPluginSpec{ - Description: options.Description, - RecommendedVersion: options.RecommendedVersion, - Artifacts: map[string]v1alpha1.ArtifactList{ - "v1.0.0": artifacts, - }, - }, - } - return cliplugin -} diff --git a/tkg/fakes/helper/types.go b/tkg/fakes/helper/types.go deleted file mode 100644 index 8d4aa90628..0000000000 --- a/tkg/fakes/helper/types.go +++ /dev/null @@ -1,154 +0,0 @@ -/* -Copyright 2020 The TKG Contributors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package helper - -// TestAllClusterComponentOptions describes options for -// Cluster creation with all it's dependent components -type TestAllClusterComponentOptions struct { - ClusterName string - Namespace string - Labels map[string]string - ClusterOptions TestClusterOptions - CPOptions TestCPOptions - ListMDOptions []TestMDOptions - MachineOptions []TestMachineOptions - ClusterConfigurationOptions TestClusterConfiguration - ClusterTopology TestClusterTopology - InfraComponentsOptions TestInfraComponentsOptions -} - -type TestInfraComponentsOptions struct { - AWSCluster *TestAWSClusterOptions -} - -type TestAWSClusterOptions struct { - Name string - Namespace string - Region string -} - -type TestClusterConfiguration struct { - ImageRepository string - DNSImageRepository string - DNSImageTag string - EtcdLocalDataDir string - EtcdImageRepository string - EtcdImageTag string -} - -type TestClusterTopology struct { - Class string - Version string -} - -// TestClusterOptions describes options for CAPI/TKC cluster -type TestClusterOptions struct { - Phase string - InfrastructureReady bool - ControlPlaneInitialized bool - ControlPlaneReady bool - - OperationType string - OperationtTimeout int // seconds - StartTimestamp string - LastObservedTimestamp string -} - -// TestCPOptions describes options for ControlPlane -// This applies to KCP for CAPI and TKC.Spec.Topology.ControlPlane -// for TKC cluster -type TestCPOptions struct { - SpecReplicas int32 - ReadyReplicas int32 - UpdatedReplicas int32 - Replicas int32 - K8sVersion string - InfrastructureTemplate TestObject -} - -// TestObject describes options for Infrastructure Template -type TestObject struct { - Name string - Namespace string - Kind string -} - -// TestMDOptions describes options for MachineDeployment -type TestMDOptions struct { - SpecReplicas int32 - ReadyReplicas int32 - UpdatedReplicas int32 - Replicas int32 - InfrastructureTemplate TestObject -} - -// TestMachineOptions describes options for Machine -type TestMachineOptions struct { - Phase string - K8sVersion string - IsCP bool -} - -// TestDaemonSetOption describes options for DaemonSet -type TestDaemonSetOption struct { - Name string - Namespace string - Image string - IncludeContainer bool -} - -// TestDeploymentOption describes options for Deployment -type TestDeploymentOption struct { - Name string - Namespace string -} - -// TestClusterRoleBindingOption describes options for ClusterRoleBinding -type TestClusterRoleBindingOption struct { - Name string -} - -// TestClusterRoleOption describes options for ClusterRole -type TestClusterRoleOption struct { - Name string -} - -// TestServiceAccountOption describe options for ServiceAccount -type TestServiceAccountOption struct { - Name string - Namespace string -} - -// TestConfigMapOption describes options for ConfigMap -type TestConfigMapOption struct { - Name string - Namespace string -} - -// TestMachineHealthCheckOption describes options for MachineHealthCheck -type TestMachineHealthCheckOption struct { - Name string - Namespace string - ClusterName string -} - -// TestCLIPluginOption describes options for CLIPlugin -type TestCLIPluginOption struct { - Name string - Description string - RecommendedVersion string -} diff --git a/tkg/fakes/kindprovider.go b/tkg/fakes/kindprovider.go deleted file mode 100644 index acd6cb9508..0000000000 --- a/tkg/fakes/kindprovider.go +++ /dev/null @@ -1,272 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "sigs.k8s.io/kind/pkg/cluster" - - "github.com/vmware-tanzu/tanzu-framework/tkg/kind" -) - -type KindProvider struct { - CreateStub func(string, ...cluster.CreateOption) error - createMutex sync.RWMutex - createArgsForCall []struct { - arg1 string - arg2 []cluster.CreateOption - } - createReturns struct { - result1 error - } - createReturnsOnCall map[int]struct { - result1 error - } - DeleteStub func(string, string) error - deleteMutex sync.RWMutex - deleteArgsForCall []struct { - arg1 string - arg2 string - } - deleteReturns struct { - result1 error - } - deleteReturnsOnCall map[int]struct { - result1 error - } - KubeConfigStub func(string, bool) (string, error) - kubeConfigMutex sync.RWMutex - kubeConfigArgsForCall []struct { - arg1 string - arg2 bool - } - kubeConfigReturns struct { - result1 string - result2 error - } - kubeConfigReturnsOnCall map[int]struct { - result1 string - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *KindProvider) Create(arg1 string, arg2 ...cluster.CreateOption) error { - fake.createMutex.Lock() - ret, specificReturn := fake.createReturnsOnCall[len(fake.createArgsForCall)] - fake.createArgsForCall = append(fake.createArgsForCall, struct { - arg1 string - arg2 []cluster.CreateOption - }{arg1, arg2}) - stub := fake.CreateStub - fakeReturns := fake.createReturns - fake.recordInvocation("Create", []interface{}{arg1, arg2}) - fake.createMutex.Unlock() - if stub != nil { - return stub(arg1, arg2...) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *KindProvider) CreateCallCount() int { - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - return len(fake.createArgsForCall) -} - -func (fake *KindProvider) CreateCalls(stub func(string, ...cluster.CreateOption) error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = stub -} - -func (fake *KindProvider) CreateArgsForCall(i int) (string, []cluster.CreateOption) { - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - argsForCall := fake.createArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KindProvider) CreateReturns(result1 error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = nil - fake.createReturns = struct { - result1 error - }{result1} -} - -func (fake *KindProvider) CreateReturnsOnCall(i int, result1 error) { - fake.createMutex.Lock() - defer fake.createMutex.Unlock() - fake.CreateStub = nil - if fake.createReturnsOnCall == nil { - fake.createReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.createReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *KindProvider) Delete(arg1 string, arg2 string) error { - fake.deleteMutex.Lock() - ret, specificReturn := fake.deleteReturnsOnCall[len(fake.deleteArgsForCall)] - fake.deleteArgsForCall = append(fake.deleteArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.DeleteStub - fakeReturns := fake.deleteReturns - fake.recordInvocation("Delete", []interface{}{arg1, arg2}) - fake.deleteMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *KindProvider) DeleteCallCount() int { - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - return len(fake.deleteArgsForCall) -} - -func (fake *KindProvider) DeleteCalls(stub func(string, string) error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = stub -} - -func (fake *KindProvider) DeleteArgsForCall(i int) (string, string) { - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - argsForCall := fake.deleteArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KindProvider) DeleteReturns(result1 error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = nil - fake.deleteReturns = struct { - result1 error - }{result1} -} - -func (fake *KindProvider) DeleteReturnsOnCall(i int, result1 error) { - fake.deleteMutex.Lock() - defer fake.deleteMutex.Unlock() - fake.DeleteStub = nil - if fake.deleteReturnsOnCall == nil { - fake.deleteReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *KindProvider) KubeConfig(arg1 string, arg2 bool) (string, error) { - fake.kubeConfigMutex.Lock() - ret, specificReturn := fake.kubeConfigReturnsOnCall[len(fake.kubeConfigArgsForCall)] - fake.kubeConfigArgsForCall = append(fake.kubeConfigArgsForCall, struct { - arg1 string - arg2 bool - }{arg1, arg2}) - stub := fake.KubeConfigStub - fakeReturns := fake.kubeConfigReturns - fake.recordInvocation("KubeConfig", []interface{}{arg1, arg2}) - fake.kubeConfigMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *KindProvider) KubeConfigCallCount() int { - fake.kubeConfigMutex.RLock() - defer fake.kubeConfigMutex.RUnlock() - return len(fake.kubeConfigArgsForCall) -} - -func (fake *KindProvider) KubeConfigCalls(stub func(string, bool) (string, error)) { - fake.kubeConfigMutex.Lock() - defer fake.kubeConfigMutex.Unlock() - fake.KubeConfigStub = stub -} - -func (fake *KindProvider) KubeConfigArgsForCall(i int) (string, bool) { - fake.kubeConfigMutex.RLock() - defer fake.kubeConfigMutex.RUnlock() - argsForCall := fake.kubeConfigArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *KindProvider) KubeConfigReturns(result1 string, result2 error) { - fake.kubeConfigMutex.Lock() - defer fake.kubeConfigMutex.Unlock() - fake.KubeConfigStub = nil - fake.kubeConfigReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *KindProvider) KubeConfigReturnsOnCall(i int, result1 string, result2 error) { - fake.kubeConfigMutex.Lock() - defer fake.kubeConfigMutex.Unlock() - fake.KubeConfigStub = nil - if fake.kubeConfigReturnsOnCall == nil { - fake.kubeConfigReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.kubeConfigReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *KindProvider) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.createMutex.RLock() - defer fake.createMutex.RUnlock() - fake.deleteMutex.RLock() - defer fake.deleteMutex.RUnlock() - fake.kubeConfigMutex.RLock() - defer fake.kubeConfigMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *KindProvider) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ kind.KindClusterProvider = new(KindProvider) diff --git a/tkg/fakes/poller.go b/tkg/fakes/poller.go deleted file mode 100644 index bcb18fcf35..0000000000 --- a/tkg/fakes/poller.go +++ /dev/null @@ -1,353 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - "time" - - "k8s.io/apimachinery/pkg/util/wait" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" -) - -type Poller struct { - PollImmediateStub func(time.Duration, time.Duration, wait.ConditionFunc) error - pollImmediateMutex sync.RWMutex - pollImmediateArgsForCall []struct { - arg1 time.Duration - arg2 time.Duration - arg3 wait.ConditionFunc - } - pollImmediateReturns struct { - result1 error - } - pollImmediateReturnsOnCall map[int]struct { - result1 error - } - PollImmediateInfiniteStub func(time.Duration, wait.ConditionFunc) error - pollImmediateInfiniteMutex sync.RWMutex - pollImmediateInfiniteArgsForCall []struct { - arg1 time.Duration - arg2 wait.ConditionFunc - } - pollImmediateInfiniteReturns struct { - result1 error - } - pollImmediateInfiniteReturnsOnCall map[int]struct { - result1 error - } - PollImmediateInfiniteWithGetterStub func(time.Duration, clusterclient.GetterFunc) error - pollImmediateInfiniteWithGetterMutex sync.RWMutex - pollImmediateInfiniteWithGetterArgsForCall []struct { - arg1 time.Duration - arg2 clusterclient.GetterFunc - } - pollImmediateInfiniteWithGetterReturns struct { - result1 error - } - pollImmediateInfiniteWithGetterReturnsOnCall map[int]struct { - result1 error - } - PollImmediateWithGetterStub func(time.Duration, time.Duration, clusterclient.GetterFunc) (interface{}, error) - pollImmediateWithGetterMutex sync.RWMutex - pollImmediateWithGetterArgsForCall []struct { - arg1 time.Duration - arg2 time.Duration - arg3 clusterclient.GetterFunc - } - pollImmediateWithGetterReturns struct { - result1 interface{} - result2 error - } - pollImmediateWithGetterReturnsOnCall map[int]struct { - result1 interface{} - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *Poller) PollImmediate(arg1 time.Duration, arg2 time.Duration, arg3 wait.ConditionFunc) error { - fake.pollImmediateMutex.Lock() - ret, specificReturn := fake.pollImmediateReturnsOnCall[len(fake.pollImmediateArgsForCall)] - fake.pollImmediateArgsForCall = append(fake.pollImmediateArgsForCall, struct { - arg1 time.Duration - arg2 time.Duration - arg3 wait.ConditionFunc - }{arg1, arg2, arg3}) - stub := fake.PollImmediateStub - fakeReturns := fake.pollImmediateReturns - fake.recordInvocation("PollImmediate", []interface{}{arg1, arg2, arg3}) - fake.pollImmediateMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Poller) PollImmediateCallCount() int { - fake.pollImmediateMutex.RLock() - defer fake.pollImmediateMutex.RUnlock() - return len(fake.pollImmediateArgsForCall) -} - -func (fake *Poller) PollImmediateCalls(stub func(time.Duration, time.Duration, wait.ConditionFunc) error) { - fake.pollImmediateMutex.Lock() - defer fake.pollImmediateMutex.Unlock() - fake.PollImmediateStub = stub -} - -func (fake *Poller) PollImmediateArgsForCall(i int) (time.Duration, time.Duration, wait.ConditionFunc) { - fake.pollImmediateMutex.RLock() - defer fake.pollImmediateMutex.RUnlock() - argsForCall := fake.pollImmediateArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *Poller) PollImmediateReturns(result1 error) { - fake.pollImmediateMutex.Lock() - defer fake.pollImmediateMutex.Unlock() - fake.PollImmediateStub = nil - fake.pollImmediateReturns = struct { - result1 error - }{result1} -} - -func (fake *Poller) PollImmediateReturnsOnCall(i int, result1 error) { - fake.pollImmediateMutex.Lock() - defer fake.pollImmediateMutex.Unlock() - fake.PollImmediateStub = nil - if fake.pollImmediateReturnsOnCall == nil { - fake.pollImmediateReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.pollImmediateReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Poller) PollImmediateInfinite(arg1 time.Duration, arg2 wait.ConditionFunc) error { - fake.pollImmediateInfiniteMutex.Lock() - ret, specificReturn := fake.pollImmediateInfiniteReturnsOnCall[len(fake.pollImmediateInfiniteArgsForCall)] - fake.pollImmediateInfiniteArgsForCall = append(fake.pollImmediateInfiniteArgsForCall, struct { - arg1 time.Duration - arg2 wait.ConditionFunc - }{arg1, arg2}) - stub := fake.PollImmediateInfiniteStub - fakeReturns := fake.pollImmediateInfiniteReturns - fake.recordInvocation("PollImmediateInfinite", []interface{}{arg1, arg2}) - fake.pollImmediateInfiniteMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Poller) PollImmediateInfiniteCallCount() int { - fake.pollImmediateInfiniteMutex.RLock() - defer fake.pollImmediateInfiniteMutex.RUnlock() - return len(fake.pollImmediateInfiniteArgsForCall) -} - -func (fake *Poller) PollImmediateInfiniteCalls(stub func(time.Duration, wait.ConditionFunc) error) { - fake.pollImmediateInfiniteMutex.Lock() - defer fake.pollImmediateInfiniteMutex.Unlock() - fake.PollImmediateInfiniteStub = stub -} - -func (fake *Poller) PollImmediateInfiniteArgsForCall(i int) (time.Duration, wait.ConditionFunc) { - fake.pollImmediateInfiniteMutex.RLock() - defer fake.pollImmediateInfiniteMutex.RUnlock() - argsForCall := fake.pollImmediateInfiniteArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Poller) PollImmediateInfiniteReturns(result1 error) { - fake.pollImmediateInfiniteMutex.Lock() - defer fake.pollImmediateInfiniteMutex.Unlock() - fake.PollImmediateInfiniteStub = nil - fake.pollImmediateInfiniteReturns = struct { - result1 error - }{result1} -} - -func (fake *Poller) PollImmediateInfiniteReturnsOnCall(i int, result1 error) { - fake.pollImmediateInfiniteMutex.Lock() - defer fake.pollImmediateInfiniteMutex.Unlock() - fake.PollImmediateInfiniteStub = nil - if fake.pollImmediateInfiniteReturnsOnCall == nil { - fake.pollImmediateInfiniteReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.pollImmediateInfiniteReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Poller) PollImmediateInfiniteWithGetter(arg1 time.Duration, arg2 clusterclient.GetterFunc) error { - fake.pollImmediateInfiniteWithGetterMutex.Lock() - ret, specificReturn := fake.pollImmediateInfiniteWithGetterReturnsOnCall[len(fake.pollImmediateInfiniteWithGetterArgsForCall)] - fake.pollImmediateInfiniteWithGetterArgsForCall = append(fake.pollImmediateInfiniteWithGetterArgsForCall, struct { - arg1 time.Duration - arg2 clusterclient.GetterFunc - }{arg1, arg2}) - stub := fake.PollImmediateInfiniteWithGetterStub - fakeReturns := fake.pollImmediateInfiniteWithGetterReturns - fake.recordInvocation("PollImmediateInfiniteWithGetter", []interface{}{arg1, arg2}) - fake.pollImmediateInfiniteWithGetterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Poller) PollImmediateInfiniteWithGetterCallCount() int { - fake.pollImmediateInfiniteWithGetterMutex.RLock() - defer fake.pollImmediateInfiniteWithGetterMutex.RUnlock() - return len(fake.pollImmediateInfiniteWithGetterArgsForCall) -} - -func (fake *Poller) PollImmediateInfiniteWithGetterCalls(stub func(time.Duration, clusterclient.GetterFunc) error) { - fake.pollImmediateInfiniteWithGetterMutex.Lock() - defer fake.pollImmediateInfiniteWithGetterMutex.Unlock() - fake.PollImmediateInfiniteWithGetterStub = stub -} - -func (fake *Poller) PollImmediateInfiniteWithGetterArgsForCall(i int) (time.Duration, clusterclient.GetterFunc) { - fake.pollImmediateInfiniteWithGetterMutex.RLock() - defer fake.pollImmediateInfiniteWithGetterMutex.RUnlock() - argsForCall := fake.pollImmediateInfiniteWithGetterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Poller) PollImmediateInfiniteWithGetterReturns(result1 error) { - fake.pollImmediateInfiniteWithGetterMutex.Lock() - defer fake.pollImmediateInfiniteWithGetterMutex.Unlock() - fake.PollImmediateInfiniteWithGetterStub = nil - fake.pollImmediateInfiniteWithGetterReturns = struct { - result1 error - }{result1} -} - -func (fake *Poller) PollImmediateInfiniteWithGetterReturnsOnCall(i int, result1 error) { - fake.pollImmediateInfiniteWithGetterMutex.Lock() - defer fake.pollImmediateInfiniteWithGetterMutex.Unlock() - fake.PollImmediateInfiniteWithGetterStub = nil - if fake.pollImmediateInfiniteWithGetterReturnsOnCall == nil { - fake.pollImmediateInfiniteWithGetterReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.pollImmediateInfiniteWithGetterReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Poller) PollImmediateWithGetter(arg1 time.Duration, arg2 time.Duration, arg3 clusterclient.GetterFunc) (interface{}, error) { - fake.pollImmediateWithGetterMutex.Lock() - ret, specificReturn := fake.pollImmediateWithGetterReturnsOnCall[len(fake.pollImmediateWithGetterArgsForCall)] - fake.pollImmediateWithGetterArgsForCall = append(fake.pollImmediateWithGetterArgsForCall, struct { - arg1 time.Duration - arg2 time.Duration - arg3 clusterclient.GetterFunc - }{arg1, arg2, arg3}) - stub := fake.PollImmediateWithGetterStub - fakeReturns := fake.pollImmediateWithGetterReturns - fake.recordInvocation("PollImmediateWithGetter", []interface{}{arg1, arg2, arg3}) - fake.pollImmediateWithGetterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Poller) PollImmediateWithGetterCallCount() int { - fake.pollImmediateWithGetterMutex.RLock() - defer fake.pollImmediateWithGetterMutex.RUnlock() - return len(fake.pollImmediateWithGetterArgsForCall) -} - -func (fake *Poller) PollImmediateWithGetterCalls(stub func(time.Duration, time.Duration, clusterclient.GetterFunc) (interface{}, error)) { - fake.pollImmediateWithGetterMutex.Lock() - defer fake.pollImmediateWithGetterMutex.Unlock() - fake.PollImmediateWithGetterStub = stub -} - -func (fake *Poller) PollImmediateWithGetterArgsForCall(i int) (time.Duration, time.Duration, clusterclient.GetterFunc) { - fake.pollImmediateWithGetterMutex.RLock() - defer fake.pollImmediateWithGetterMutex.RUnlock() - argsForCall := fake.pollImmediateWithGetterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *Poller) PollImmediateWithGetterReturns(result1 interface{}, result2 error) { - fake.pollImmediateWithGetterMutex.Lock() - defer fake.pollImmediateWithGetterMutex.Unlock() - fake.PollImmediateWithGetterStub = nil - fake.pollImmediateWithGetterReturns = struct { - result1 interface{} - result2 error - }{result1, result2} -} - -func (fake *Poller) PollImmediateWithGetterReturnsOnCall(i int, result1 interface{}, result2 error) { - fake.pollImmediateWithGetterMutex.Lock() - defer fake.pollImmediateWithGetterMutex.Unlock() - fake.PollImmediateWithGetterStub = nil - if fake.pollImmediateWithGetterReturnsOnCall == nil { - fake.pollImmediateWithGetterReturnsOnCall = make(map[int]struct { - result1 interface{} - result2 error - }) - } - fake.pollImmediateWithGetterReturnsOnCall[i] = struct { - result1 interface{} - result2 error - }{result1, result2} -} - -func (fake *Poller) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.pollImmediateMutex.RLock() - defer fake.pollImmediateMutex.RUnlock() - fake.pollImmediateInfiniteMutex.RLock() - defer fake.pollImmediateInfiniteMutex.RUnlock() - fake.pollImmediateInfiniteWithGetterMutex.RLock() - defer fake.pollImmediateInfiniteWithGetterMutex.RUnlock() - fake.pollImmediateWithGetterMutex.RLock() - defer fake.pollImmediateWithGetterMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *Poller) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ clusterclient.Poller = new(Poller) diff --git a/tkg/fakes/providers/fake_providers.go b/tkg/fakes/providers/fake_providers.go deleted file mode 100644 index f5dbae2bce..0000000000 --- a/tkg/fakes/providers/fake_providers.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package providers ... -package providers - -import ( - _ "embed" - - "github.com/vmware-tanzu/tanzu-framework/tkg/providerinterface" -) - -//go:embed providers.zip -var FakeProviderZip []byte - -type fakeProviderGetter struct { -} - -func (f *fakeProviderGetter) GetProviderBundle() ([]byte, error) { - return FakeProviderZip, nil -} - -func FakeProviderGetter() providerinterface.ProviderInterface { - return &fakeProviderGetter{} -} diff --git a/tkg/fakes/providers/providers.zip b/tkg/fakes/providers/providers.zip deleted file mode 100644 index a49be4971b..0000000000 Binary files a/tkg/fakes/providers/providers.zip and /dev/null differ diff --git a/tkg/fakes/providersupgradeclient.go b/tkg/fakes/providersupgradeclient.go deleted file mode 100644 index 865ada653e..0000000000 --- a/tkg/fakes/providersupgradeclient.go +++ /dev/null @@ -1,113 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/providersupgradeclient" -) - -type ProvidersUpgradeClient struct { - ApplyUpgradeStub func(*client.ApplyUpgradeOptions) error - applyUpgradeMutex sync.RWMutex - applyUpgradeArgsForCall []struct { - arg1 *client.ApplyUpgradeOptions - } - applyUpgradeReturns struct { - result1 error - } - applyUpgradeReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *ProvidersUpgradeClient) ApplyUpgrade(arg1 *client.ApplyUpgradeOptions) error { - fake.applyUpgradeMutex.Lock() - ret, specificReturn := fake.applyUpgradeReturnsOnCall[len(fake.applyUpgradeArgsForCall)] - fake.applyUpgradeArgsForCall = append(fake.applyUpgradeArgsForCall, struct { - arg1 *client.ApplyUpgradeOptions - }{arg1}) - stub := fake.ApplyUpgradeStub - fakeReturns := fake.applyUpgradeReturns - fake.recordInvocation("ApplyUpgrade", []interface{}{arg1}) - fake.applyUpgradeMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *ProvidersUpgradeClient) ApplyUpgradeCallCount() int { - fake.applyUpgradeMutex.RLock() - defer fake.applyUpgradeMutex.RUnlock() - return len(fake.applyUpgradeArgsForCall) -} - -func (fake *ProvidersUpgradeClient) ApplyUpgradeCalls(stub func(*client.ApplyUpgradeOptions) error) { - fake.applyUpgradeMutex.Lock() - defer fake.applyUpgradeMutex.Unlock() - fake.ApplyUpgradeStub = stub -} - -func (fake *ProvidersUpgradeClient) ApplyUpgradeArgsForCall(i int) *client.ApplyUpgradeOptions { - fake.applyUpgradeMutex.RLock() - defer fake.applyUpgradeMutex.RUnlock() - argsForCall := fake.applyUpgradeArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ProvidersUpgradeClient) ApplyUpgradeReturns(result1 error) { - fake.applyUpgradeMutex.Lock() - defer fake.applyUpgradeMutex.Unlock() - fake.ApplyUpgradeStub = nil - fake.applyUpgradeReturns = struct { - result1 error - }{result1} -} - -func (fake *ProvidersUpgradeClient) ApplyUpgradeReturnsOnCall(i int, result1 error) { - fake.applyUpgradeMutex.Lock() - defer fake.applyUpgradeMutex.Unlock() - fake.ApplyUpgradeStub = nil - if fake.applyUpgradeReturnsOnCall == nil { - fake.applyUpgradeReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.applyUpgradeReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *ProvidersUpgradeClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.applyUpgradeMutex.RLock() - defer fake.applyUpgradeMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *ProvidersUpgradeClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ providersupgradeclient.Client = new(ProvidersUpgradeClient) diff --git a/tkg/fakes/readerwriter.go b/tkg/fakes/readerwriter.go deleted file mode 100644 index 434b6944d5..0000000000 --- a/tkg/fakes/readerwriter.go +++ /dev/null @@ -1,420 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" -) - -type TKGConfigReaderWriter struct { - GetStub func(string) (string, error) - getMutex sync.RWMutex - getArgsForCall []struct { - arg1 string - } - getReturns struct { - result1 string - result2 error - } - getReturnsOnCall map[int]struct { - result1 string - result2 error - } - InitStub func(string) error - initMutex sync.RWMutex - initArgsForCall []struct { - arg1 string - } - initReturns struct { - result1 error - } - initReturnsOnCall map[int]struct { - result1 error - } - MergeInConfigStub func(string) error - mergeInConfigMutex sync.RWMutex - mergeInConfigArgsForCall []struct { - arg1 string - } - mergeInConfigReturns struct { - result1 error - } - mergeInConfigReturnsOnCall map[int]struct { - result1 error - } - SetStub func(string, string) - setMutex sync.RWMutex - setArgsForCall []struct { - arg1 string - arg2 string - } - SetMapStub func(map[string]string) - setMapMutex sync.RWMutex - setMapArgsForCall []struct { - arg1 map[string]string - } - UnmarshalKeyStub func(string, interface{}) error - unmarshalKeyMutex sync.RWMutex - unmarshalKeyArgsForCall []struct { - arg1 string - arg2 interface{} - } - unmarshalKeyReturns struct { - result1 error - } - unmarshalKeyReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *TKGConfigReaderWriter) Get(arg1 string) (string, error) { - fake.getMutex.Lock() - ret, specificReturn := fake.getReturnsOnCall[len(fake.getArgsForCall)] - fake.getArgsForCall = append(fake.getArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetStub - fakeReturns := fake.getReturns - fake.recordInvocation("Get", []interface{}{arg1}) - fake.getMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigReaderWriter) GetCallCount() int { - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - return len(fake.getArgsForCall) -} - -func (fake *TKGConfigReaderWriter) GetCalls(stub func(string) (string, error)) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = stub -} - -func (fake *TKGConfigReaderWriter) GetArgsForCall(i int) string { - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - argsForCall := fake.getArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigReaderWriter) GetReturns(result1 string, result2 error) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = nil - fake.getReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigReaderWriter) GetReturnsOnCall(i int, result1 string, result2 error) { - fake.getMutex.Lock() - defer fake.getMutex.Unlock() - fake.GetStub = nil - if fake.getReturnsOnCall == nil { - fake.getReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigReaderWriter) Init(arg1 string) error { - fake.initMutex.Lock() - ret, specificReturn := fake.initReturnsOnCall[len(fake.initArgsForCall)] - fake.initArgsForCall = append(fake.initArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.InitStub - fakeReturns := fake.initReturns - fake.recordInvocation("Init", []interface{}{arg1}) - fake.initMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigReaderWriter) InitCallCount() int { - fake.initMutex.RLock() - defer fake.initMutex.RUnlock() - return len(fake.initArgsForCall) -} - -func (fake *TKGConfigReaderWriter) InitCalls(stub func(string) error) { - fake.initMutex.Lock() - defer fake.initMutex.Unlock() - fake.InitStub = stub -} - -func (fake *TKGConfigReaderWriter) InitArgsForCall(i int) string { - fake.initMutex.RLock() - defer fake.initMutex.RUnlock() - argsForCall := fake.initArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigReaderWriter) InitReturns(result1 error) { - fake.initMutex.Lock() - defer fake.initMutex.Unlock() - fake.InitStub = nil - fake.initReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigReaderWriter) InitReturnsOnCall(i int, result1 error) { - fake.initMutex.Lock() - defer fake.initMutex.Unlock() - fake.InitStub = nil - if fake.initReturnsOnCall == nil { - fake.initReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.initReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigReaderWriter) MergeInConfig(arg1 string) error { - fake.mergeInConfigMutex.Lock() - ret, specificReturn := fake.mergeInConfigReturnsOnCall[len(fake.mergeInConfigArgsForCall)] - fake.mergeInConfigArgsForCall = append(fake.mergeInConfigArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.MergeInConfigStub - fakeReturns := fake.mergeInConfigReturns - fake.recordInvocation("MergeInConfig", []interface{}{arg1}) - fake.mergeInConfigMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigReaderWriter) MergeInConfigCallCount() int { - fake.mergeInConfigMutex.RLock() - defer fake.mergeInConfigMutex.RUnlock() - return len(fake.mergeInConfigArgsForCall) -} - -func (fake *TKGConfigReaderWriter) MergeInConfigCalls(stub func(string) error) { - fake.mergeInConfigMutex.Lock() - defer fake.mergeInConfigMutex.Unlock() - fake.MergeInConfigStub = stub -} - -func (fake *TKGConfigReaderWriter) MergeInConfigArgsForCall(i int) string { - fake.mergeInConfigMutex.RLock() - defer fake.mergeInConfigMutex.RUnlock() - argsForCall := fake.mergeInConfigArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigReaderWriter) MergeInConfigReturns(result1 error) { - fake.mergeInConfigMutex.Lock() - defer fake.mergeInConfigMutex.Unlock() - fake.MergeInConfigStub = nil - fake.mergeInConfigReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigReaderWriter) MergeInConfigReturnsOnCall(i int, result1 error) { - fake.mergeInConfigMutex.Lock() - defer fake.mergeInConfigMutex.Unlock() - fake.MergeInConfigStub = nil - if fake.mergeInConfigReturnsOnCall == nil { - fake.mergeInConfigReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.mergeInConfigReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigReaderWriter) Set(arg1 string, arg2 string) { - fake.setMutex.Lock() - fake.setArgsForCall = append(fake.setArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.SetStub - fake.recordInvocation("Set", []interface{}{arg1, arg2}) - fake.setMutex.Unlock() - if stub != nil { - fake.SetStub(arg1, arg2) - } -} - -func (fake *TKGConfigReaderWriter) SetCallCount() int { - fake.setMutex.RLock() - defer fake.setMutex.RUnlock() - return len(fake.setArgsForCall) -} - -func (fake *TKGConfigReaderWriter) SetCalls(stub func(string, string)) { - fake.setMutex.Lock() - defer fake.setMutex.Unlock() - fake.SetStub = stub -} - -func (fake *TKGConfigReaderWriter) SetArgsForCall(i int) (string, string) { - fake.setMutex.RLock() - defer fake.setMutex.RUnlock() - argsForCall := fake.setArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *TKGConfigReaderWriter) SetMap(arg1 map[string]string) { - fake.setMapMutex.Lock() - fake.setMapArgsForCall = append(fake.setMapArgsForCall, struct { - arg1 map[string]string - }{arg1}) - stub := fake.SetMapStub - fake.recordInvocation("SetMap", []interface{}{arg1}) - fake.setMapMutex.Unlock() - if stub != nil { - fake.SetMapStub(arg1) - } -} - -func (fake *TKGConfigReaderWriter) SetMapCallCount() int { - fake.setMapMutex.RLock() - defer fake.setMapMutex.RUnlock() - return len(fake.setMapArgsForCall) -} - -func (fake *TKGConfigReaderWriter) SetMapCalls(stub func(map[string]string)) { - fake.setMapMutex.Lock() - defer fake.setMapMutex.Unlock() - fake.SetMapStub = stub -} - -func (fake *TKGConfigReaderWriter) SetMapArgsForCall(i int) map[string]string { - fake.setMapMutex.RLock() - defer fake.setMapMutex.RUnlock() - argsForCall := fake.setMapArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigReaderWriter) UnmarshalKey(arg1 string, arg2 interface{}) error { - fake.unmarshalKeyMutex.Lock() - ret, specificReturn := fake.unmarshalKeyReturnsOnCall[len(fake.unmarshalKeyArgsForCall)] - fake.unmarshalKeyArgsForCall = append(fake.unmarshalKeyArgsForCall, struct { - arg1 string - arg2 interface{} - }{arg1, arg2}) - stub := fake.UnmarshalKeyStub - fakeReturns := fake.unmarshalKeyReturns - fake.recordInvocation("UnmarshalKey", []interface{}{arg1, arg2}) - fake.unmarshalKeyMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigReaderWriter) UnmarshalKeyCallCount() int { - fake.unmarshalKeyMutex.RLock() - defer fake.unmarshalKeyMutex.RUnlock() - return len(fake.unmarshalKeyArgsForCall) -} - -func (fake *TKGConfigReaderWriter) UnmarshalKeyCalls(stub func(string, interface{}) error) { - fake.unmarshalKeyMutex.Lock() - defer fake.unmarshalKeyMutex.Unlock() - fake.UnmarshalKeyStub = stub -} - -func (fake *TKGConfigReaderWriter) UnmarshalKeyArgsForCall(i int) (string, interface{}) { - fake.unmarshalKeyMutex.RLock() - defer fake.unmarshalKeyMutex.RUnlock() - argsForCall := fake.unmarshalKeyArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *TKGConfigReaderWriter) UnmarshalKeyReturns(result1 error) { - fake.unmarshalKeyMutex.Lock() - defer fake.unmarshalKeyMutex.Unlock() - fake.UnmarshalKeyStub = nil - fake.unmarshalKeyReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigReaderWriter) UnmarshalKeyReturnsOnCall(i int, result1 error) { - fake.unmarshalKeyMutex.Lock() - defer fake.unmarshalKeyMutex.Unlock() - fake.UnmarshalKeyStub = nil - if fake.unmarshalKeyReturnsOnCall == nil { - fake.unmarshalKeyReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.unmarshalKeyReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigReaderWriter) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.getMutex.RLock() - defer fake.getMutex.RUnlock() - fake.initMutex.RLock() - defer fake.initMutex.RUnlock() - fake.mergeInConfigMutex.RLock() - defer fake.mergeInConfigMutex.RUnlock() - fake.setMutex.RLock() - defer fake.setMutex.RUnlock() - fake.setMapMutex.RLock() - defer fake.setMapMutex.RUnlock() - fake.unmarshalKeyMutex.RLock() - defer fake.unmarshalKeyMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *TKGConfigReaderWriter) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ tkgconfigreaderwriter.TKGConfigReaderWriter = new(TKGConfigReaderWriter) diff --git a/tkg/fakes/regionmanager.go b/tkg/fakes/regionmanager.go deleted file mode 100644 index f664af9e57..0000000000 --- a/tkg/fakes/regionmanager.go +++ /dev/null @@ -1,475 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/tkg/region" -) - -type RegionManager struct { - DeleteRegionContextStub func(string) error - deleteRegionContextMutex sync.RWMutex - deleteRegionContextArgsForCall []struct { - arg1 string - } - deleteRegionContextReturns struct { - result1 error - } - deleteRegionContextReturnsOnCall map[int]struct { - result1 error - } - GetCurrentContextStub func() (region.RegionContext, error) - getCurrentContextMutex sync.RWMutex - getCurrentContextArgsForCall []struct { - } - getCurrentContextReturns struct { - result1 region.RegionContext - result2 error - } - getCurrentContextReturnsOnCall map[int]struct { - result1 region.RegionContext - result2 error - } - ListRegionContextsStub func() ([]region.RegionContext, error) - listRegionContextsMutex sync.RWMutex - listRegionContextsArgsForCall []struct { - } - listRegionContextsReturns struct { - result1 []region.RegionContext - result2 error - } - listRegionContextsReturnsOnCall map[int]struct { - result1 []region.RegionContext - result2 error - } - SaveRegionContextStub func(region.RegionContext) error - saveRegionContextMutex sync.RWMutex - saveRegionContextArgsForCall []struct { - arg1 region.RegionContext - } - saveRegionContextReturns struct { - result1 error - } - saveRegionContextReturnsOnCall map[int]struct { - result1 error - } - SetCurrentContextStub func(string, string) error - setCurrentContextMutex sync.RWMutex - setCurrentContextArgsForCall []struct { - arg1 string - arg2 string - } - setCurrentContextReturns struct { - result1 error - } - setCurrentContextReturnsOnCall map[int]struct { - result1 error - } - UpsertRegionContextStub func(region.RegionContext) error - upsertRegionContextMutex sync.RWMutex - upsertRegionContextArgsForCall []struct { - arg1 region.RegionContext - } - upsertRegionContextReturns struct { - result1 error - } - upsertRegionContextReturnsOnCall map[int]struct { - result1 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *RegionManager) DeleteRegionContext(arg1 string) error { - fake.deleteRegionContextMutex.Lock() - ret, specificReturn := fake.deleteRegionContextReturnsOnCall[len(fake.deleteRegionContextArgsForCall)] - fake.deleteRegionContextArgsForCall = append(fake.deleteRegionContextArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.DeleteRegionContextStub - fakeReturns := fake.deleteRegionContextReturns - fake.recordInvocation("DeleteRegionContext", []interface{}{arg1}) - fake.deleteRegionContextMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *RegionManager) DeleteRegionContextCallCount() int { - fake.deleteRegionContextMutex.RLock() - defer fake.deleteRegionContextMutex.RUnlock() - return len(fake.deleteRegionContextArgsForCall) -} - -func (fake *RegionManager) DeleteRegionContextCalls(stub func(string) error) { - fake.deleteRegionContextMutex.Lock() - defer fake.deleteRegionContextMutex.Unlock() - fake.DeleteRegionContextStub = stub -} - -func (fake *RegionManager) DeleteRegionContextArgsForCall(i int) string { - fake.deleteRegionContextMutex.RLock() - defer fake.deleteRegionContextMutex.RUnlock() - argsForCall := fake.deleteRegionContextArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *RegionManager) DeleteRegionContextReturns(result1 error) { - fake.deleteRegionContextMutex.Lock() - defer fake.deleteRegionContextMutex.Unlock() - fake.DeleteRegionContextStub = nil - fake.deleteRegionContextReturns = struct { - result1 error - }{result1} -} - -func (fake *RegionManager) DeleteRegionContextReturnsOnCall(i int, result1 error) { - fake.deleteRegionContextMutex.Lock() - defer fake.deleteRegionContextMutex.Unlock() - fake.DeleteRegionContextStub = nil - if fake.deleteRegionContextReturnsOnCall == nil { - fake.deleteRegionContextReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.deleteRegionContextReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *RegionManager) GetCurrentContext() (region.RegionContext, error) { - fake.getCurrentContextMutex.Lock() - ret, specificReturn := fake.getCurrentContextReturnsOnCall[len(fake.getCurrentContextArgsForCall)] - fake.getCurrentContextArgsForCall = append(fake.getCurrentContextArgsForCall, struct { - }{}) - stub := fake.GetCurrentContextStub - fakeReturns := fake.getCurrentContextReturns - fake.recordInvocation("GetCurrentContext", []interface{}{}) - fake.getCurrentContextMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *RegionManager) GetCurrentContextCallCount() int { - fake.getCurrentContextMutex.RLock() - defer fake.getCurrentContextMutex.RUnlock() - return len(fake.getCurrentContextArgsForCall) -} - -func (fake *RegionManager) GetCurrentContextCalls(stub func() (region.RegionContext, error)) { - fake.getCurrentContextMutex.Lock() - defer fake.getCurrentContextMutex.Unlock() - fake.GetCurrentContextStub = stub -} - -func (fake *RegionManager) GetCurrentContextReturns(result1 region.RegionContext, result2 error) { - fake.getCurrentContextMutex.Lock() - defer fake.getCurrentContextMutex.Unlock() - fake.GetCurrentContextStub = nil - fake.getCurrentContextReturns = struct { - result1 region.RegionContext - result2 error - }{result1, result2} -} - -func (fake *RegionManager) GetCurrentContextReturnsOnCall(i int, result1 region.RegionContext, result2 error) { - fake.getCurrentContextMutex.Lock() - defer fake.getCurrentContextMutex.Unlock() - fake.GetCurrentContextStub = nil - if fake.getCurrentContextReturnsOnCall == nil { - fake.getCurrentContextReturnsOnCall = make(map[int]struct { - result1 region.RegionContext - result2 error - }) - } - fake.getCurrentContextReturnsOnCall[i] = struct { - result1 region.RegionContext - result2 error - }{result1, result2} -} - -func (fake *RegionManager) ListRegionContexts() ([]region.RegionContext, error) { - fake.listRegionContextsMutex.Lock() - ret, specificReturn := fake.listRegionContextsReturnsOnCall[len(fake.listRegionContextsArgsForCall)] - fake.listRegionContextsArgsForCall = append(fake.listRegionContextsArgsForCall, struct { - }{}) - stub := fake.ListRegionContextsStub - fakeReturns := fake.listRegionContextsReturns - fake.recordInvocation("ListRegionContexts", []interface{}{}) - fake.listRegionContextsMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *RegionManager) ListRegionContextsCallCount() int { - fake.listRegionContextsMutex.RLock() - defer fake.listRegionContextsMutex.RUnlock() - return len(fake.listRegionContextsArgsForCall) -} - -func (fake *RegionManager) ListRegionContextsCalls(stub func() ([]region.RegionContext, error)) { - fake.listRegionContextsMutex.Lock() - defer fake.listRegionContextsMutex.Unlock() - fake.ListRegionContextsStub = stub -} - -func (fake *RegionManager) ListRegionContextsReturns(result1 []region.RegionContext, result2 error) { - fake.listRegionContextsMutex.Lock() - defer fake.listRegionContextsMutex.Unlock() - fake.ListRegionContextsStub = nil - fake.listRegionContextsReturns = struct { - result1 []region.RegionContext - result2 error - }{result1, result2} -} - -func (fake *RegionManager) ListRegionContextsReturnsOnCall(i int, result1 []region.RegionContext, result2 error) { - fake.listRegionContextsMutex.Lock() - defer fake.listRegionContextsMutex.Unlock() - fake.ListRegionContextsStub = nil - if fake.listRegionContextsReturnsOnCall == nil { - fake.listRegionContextsReturnsOnCall = make(map[int]struct { - result1 []region.RegionContext - result2 error - }) - } - fake.listRegionContextsReturnsOnCall[i] = struct { - result1 []region.RegionContext - result2 error - }{result1, result2} -} - -func (fake *RegionManager) SaveRegionContext(arg1 region.RegionContext) error { - fake.saveRegionContextMutex.Lock() - ret, specificReturn := fake.saveRegionContextReturnsOnCall[len(fake.saveRegionContextArgsForCall)] - fake.saveRegionContextArgsForCall = append(fake.saveRegionContextArgsForCall, struct { - arg1 region.RegionContext - }{arg1}) - stub := fake.SaveRegionContextStub - fakeReturns := fake.saveRegionContextReturns - fake.recordInvocation("SaveRegionContext", []interface{}{arg1}) - fake.saveRegionContextMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *RegionManager) SaveRegionContextCallCount() int { - fake.saveRegionContextMutex.RLock() - defer fake.saveRegionContextMutex.RUnlock() - return len(fake.saveRegionContextArgsForCall) -} - -func (fake *RegionManager) SaveRegionContextCalls(stub func(region.RegionContext) error) { - fake.saveRegionContextMutex.Lock() - defer fake.saveRegionContextMutex.Unlock() - fake.SaveRegionContextStub = stub -} - -func (fake *RegionManager) SaveRegionContextArgsForCall(i int) region.RegionContext { - fake.saveRegionContextMutex.RLock() - defer fake.saveRegionContextMutex.RUnlock() - argsForCall := fake.saveRegionContextArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *RegionManager) SaveRegionContextReturns(result1 error) { - fake.saveRegionContextMutex.Lock() - defer fake.saveRegionContextMutex.Unlock() - fake.SaveRegionContextStub = nil - fake.saveRegionContextReturns = struct { - result1 error - }{result1} -} - -func (fake *RegionManager) SaveRegionContextReturnsOnCall(i int, result1 error) { - fake.saveRegionContextMutex.Lock() - defer fake.saveRegionContextMutex.Unlock() - fake.SaveRegionContextStub = nil - if fake.saveRegionContextReturnsOnCall == nil { - fake.saveRegionContextReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.saveRegionContextReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *RegionManager) SetCurrentContext(arg1 string, arg2 string) error { - fake.setCurrentContextMutex.Lock() - ret, specificReturn := fake.setCurrentContextReturnsOnCall[len(fake.setCurrentContextArgsForCall)] - fake.setCurrentContextArgsForCall = append(fake.setCurrentContextArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.SetCurrentContextStub - fakeReturns := fake.setCurrentContextReturns - fake.recordInvocation("SetCurrentContext", []interface{}{arg1, arg2}) - fake.setCurrentContextMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *RegionManager) SetCurrentContextCallCount() int { - fake.setCurrentContextMutex.RLock() - defer fake.setCurrentContextMutex.RUnlock() - return len(fake.setCurrentContextArgsForCall) -} - -func (fake *RegionManager) SetCurrentContextCalls(stub func(string, string) error) { - fake.setCurrentContextMutex.Lock() - defer fake.setCurrentContextMutex.Unlock() - fake.SetCurrentContextStub = stub -} - -func (fake *RegionManager) SetCurrentContextArgsForCall(i int) (string, string) { - fake.setCurrentContextMutex.RLock() - defer fake.setCurrentContextMutex.RUnlock() - argsForCall := fake.setCurrentContextArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *RegionManager) SetCurrentContextReturns(result1 error) { - fake.setCurrentContextMutex.Lock() - defer fake.setCurrentContextMutex.Unlock() - fake.SetCurrentContextStub = nil - fake.setCurrentContextReturns = struct { - result1 error - }{result1} -} - -func (fake *RegionManager) SetCurrentContextReturnsOnCall(i int, result1 error) { - fake.setCurrentContextMutex.Lock() - defer fake.setCurrentContextMutex.Unlock() - fake.SetCurrentContextStub = nil - if fake.setCurrentContextReturnsOnCall == nil { - fake.setCurrentContextReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.setCurrentContextReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *RegionManager) UpsertRegionContext(arg1 region.RegionContext) error { - fake.upsertRegionContextMutex.Lock() - ret, specificReturn := fake.upsertRegionContextReturnsOnCall[len(fake.upsertRegionContextArgsForCall)] - fake.upsertRegionContextArgsForCall = append(fake.upsertRegionContextArgsForCall, struct { - arg1 region.RegionContext - }{arg1}) - stub := fake.UpsertRegionContextStub - fakeReturns := fake.upsertRegionContextReturns - fake.recordInvocation("UpsertRegionContext", []interface{}{arg1}) - fake.upsertRegionContextMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *RegionManager) UpsertRegionContextCallCount() int { - fake.upsertRegionContextMutex.RLock() - defer fake.upsertRegionContextMutex.RUnlock() - return len(fake.upsertRegionContextArgsForCall) -} - -func (fake *RegionManager) UpsertRegionContextCalls(stub func(region.RegionContext) error) { - fake.upsertRegionContextMutex.Lock() - defer fake.upsertRegionContextMutex.Unlock() - fake.UpsertRegionContextStub = stub -} - -func (fake *RegionManager) UpsertRegionContextArgsForCall(i int) region.RegionContext { - fake.upsertRegionContextMutex.RLock() - defer fake.upsertRegionContextMutex.RUnlock() - argsForCall := fake.upsertRegionContextArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *RegionManager) UpsertRegionContextReturns(result1 error) { - fake.upsertRegionContextMutex.Lock() - defer fake.upsertRegionContextMutex.Unlock() - fake.UpsertRegionContextStub = nil - fake.upsertRegionContextReturns = struct { - result1 error - }{result1} -} - -func (fake *RegionManager) UpsertRegionContextReturnsOnCall(i int, result1 error) { - fake.upsertRegionContextMutex.Lock() - defer fake.upsertRegionContextMutex.Unlock() - fake.UpsertRegionContextStub = nil - if fake.upsertRegionContextReturnsOnCall == nil { - fake.upsertRegionContextReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.upsertRegionContextReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *RegionManager) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.deleteRegionContextMutex.RLock() - defer fake.deleteRegionContextMutex.RUnlock() - fake.getCurrentContextMutex.RLock() - defer fake.getCurrentContextMutex.RUnlock() - fake.listRegionContextsMutex.RLock() - defer fake.listRegionContextsMutex.RUnlock() - fake.saveRegionContextMutex.RLock() - defer fake.saveRegionContextMutex.RUnlock() - fake.setCurrentContextMutex.RLock() - defer fake.setCurrentContextMutex.RUnlock() - fake.upsertRegionContextMutex.RLock() - defer fake.upsertRegionContextMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *RegionManager) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ region.Manager = new(RegionManager) diff --git a/tkg/fakes/registy.go b/tkg/fakes/registy.go deleted file mode 100644 index 351270ee62..0000000000 --- a/tkg/fakes/registy.go +++ /dev/null @@ -1,352 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/tkg/registry" -) - -type Registry struct { - DownloadBundleStub func(string, string) error - downloadBundleMutex sync.RWMutex - downloadBundleArgsForCall []struct { - arg1 string - arg2 string - } - downloadBundleReturns struct { - result1 error - } - downloadBundleReturnsOnCall map[int]struct { - result1 error - } - GetFileStub func(string, string) ([]byte, error) - getFileMutex sync.RWMutex - getFileArgsForCall []struct { - arg1 string - arg2 string - } - getFileReturns struct { - result1 []byte - result2 error - } - getFileReturnsOnCall map[int]struct { - result1 []byte - result2 error - } - GetFilesStub func(string) (map[string][]byte, error) - getFilesMutex sync.RWMutex - getFilesArgsForCall []struct { - arg1 string - } - getFilesReturns struct { - result1 map[string][]byte - result2 error - } - getFilesReturnsOnCall map[int]struct { - result1 map[string][]byte - result2 error - } - ListImageTagsStub func(string) ([]string, error) - listImageTagsMutex sync.RWMutex - listImageTagsArgsForCall []struct { - arg1 string - } - listImageTagsReturns struct { - result1 []string - result2 error - } - listImageTagsReturnsOnCall map[int]struct { - result1 []string - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *Registry) DownloadBundle(arg1 string, arg2 string) error { - fake.downloadBundleMutex.Lock() - ret, specificReturn := fake.downloadBundleReturnsOnCall[len(fake.downloadBundleArgsForCall)] - fake.downloadBundleArgsForCall = append(fake.downloadBundleArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.DownloadBundleStub - fakeReturns := fake.downloadBundleReturns - fake.recordInvocation("DownloadBundle", []interface{}{arg1, arg2}) - fake.downloadBundleMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *Registry) DownloadBundleCallCount() int { - fake.downloadBundleMutex.RLock() - defer fake.downloadBundleMutex.RUnlock() - return len(fake.downloadBundleArgsForCall) -} - -func (fake *Registry) DownloadBundleCalls(stub func(string, string) error) { - fake.downloadBundleMutex.Lock() - defer fake.downloadBundleMutex.Unlock() - fake.DownloadBundleStub = stub -} - -func (fake *Registry) DownloadBundleArgsForCall(i int) (string, string) { - fake.downloadBundleMutex.RLock() - defer fake.downloadBundleMutex.RUnlock() - argsForCall := fake.downloadBundleArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Registry) DownloadBundleReturns(result1 error) { - fake.downloadBundleMutex.Lock() - defer fake.downloadBundleMutex.Unlock() - fake.DownloadBundleStub = nil - fake.downloadBundleReturns = struct { - result1 error - }{result1} -} - -func (fake *Registry) DownloadBundleReturnsOnCall(i int, result1 error) { - fake.downloadBundleMutex.Lock() - defer fake.downloadBundleMutex.Unlock() - fake.DownloadBundleStub = nil - if fake.downloadBundleReturnsOnCall == nil { - fake.downloadBundleReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.downloadBundleReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *Registry) GetFile(arg1 string, arg2 string) ([]byte, error) { - fake.getFileMutex.Lock() - ret, specificReturn := fake.getFileReturnsOnCall[len(fake.getFileArgsForCall)] - fake.getFileArgsForCall = append(fake.getFileArgsForCall, struct { - arg1 string - arg2 string - }{arg1, arg2}) - stub := fake.GetFileStub - fakeReturns := fake.getFileReturns - fake.recordInvocation("GetFile", []interface{}{arg1, arg2}) - fake.getFileMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Registry) GetFileCallCount() int { - fake.getFileMutex.RLock() - defer fake.getFileMutex.RUnlock() - return len(fake.getFileArgsForCall) -} - -func (fake *Registry) GetFileCalls(stub func(string, string) ([]byte, error)) { - fake.getFileMutex.Lock() - defer fake.getFileMutex.Unlock() - fake.GetFileStub = stub -} - -func (fake *Registry) GetFileArgsForCall(i int) (string, string) { - fake.getFileMutex.RLock() - defer fake.getFileMutex.RUnlock() - argsForCall := fake.getFileArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *Registry) GetFileReturns(result1 []byte, result2 error) { - fake.getFileMutex.Lock() - defer fake.getFileMutex.Unlock() - fake.GetFileStub = nil - fake.getFileReturns = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *Registry) GetFileReturnsOnCall(i int, result1 []byte, result2 error) { - fake.getFileMutex.Lock() - defer fake.getFileMutex.Unlock() - fake.GetFileStub = nil - if fake.getFileReturnsOnCall == nil { - fake.getFileReturnsOnCall = make(map[int]struct { - result1 []byte - result2 error - }) - } - fake.getFileReturnsOnCall[i] = struct { - result1 []byte - result2 error - }{result1, result2} -} - -func (fake *Registry) GetFiles(arg1 string) (map[string][]byte, error) { - fake.getFilesMutex.Lock() - ret, specificReturn := fake.getFilesReturnsOnCall[len(fake.getFilesArgsForCall)] - fake.getFilesArgsForCall = append(fake.getFilesArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetFilesStub - fakeReturns := fake.getFilesReturns - fake.recordInvocation("GetFiles", []interface{}{arg1}) - fake.getFilesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Registry) GetFilesCallCount() int { - fake.getFilesMutex.RLock() - defer fake.getFilesMutex.RUnlock() - return len(fake.getFilesArgsForCall) -} - -func (fake *Registry) GetFilesCalls(stub func(string) (map[string][]byte, error)) { - fake.getFilesMutex.Lock() - defer fake.getFilesMutex.Unlock() - fake.GetFilesStub = stub -} - -func (fake *Registry) GetFilesArgsForCall(i int) string { - fake.getFilesMutex.RLock() - defer fake.getFilesMutex.RUnlock() - argsForCall := fake.getFilesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Registry) GetFilesReturns(result1 map[string][]byte, result2 error) { - fake.getFilesMutex.Lock() - defer fake.getFilesMutex.Unlock() - fake.GetFilesStub = nil - fake.getFilesReturns = struct { - result1 map[string][]byte - result2 error - }{result1, result2} -} - -func (fake *Registry) GetFilesReturnsOnCall(i int, result1 map[string][]byte, result2 error) { - fake.getFilesMutex.Lock() - defer fake.getFilesMutex.Unlock() - fake.GetFilesStub = nil - if fake.getFilesReturnsOnCall == nil { - fake.getFilesReturnsOnCall = make(map[int]struct { - result1 map[string][]byte - result2 error - }) - } - fake.getFilesReturnsOnCall[i] = struct { - result1 map[string][]byte - result2 error - }{result1, result2} -} - -func (fake *Registry) ListImageTags(arg1 string) ([]string, error) { - fake.listImageTagsMutex.Lock() - ret, specificReturn := fake.listImageTagsReturnsOnCall[len(fake.listImageTagsArgsForCall)] - fake.listImageTagsArgsForCall = append(fake.listImageTagsArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.ListImageTagsStub - fakeReturns := fake.listImageTagsReturns - fake.recordInvocation("ListImageTags", []interface{}{arg1}) - fake.listImageTagsMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *Registry) ListImageTagsCallCount() int { - fake.listImageTagsMutex.RLock() - defer fake.listImageTagsMutex.RUnlock() - return len(fake.listImageTagsArgsForCall) -} - -func (fake *Registry) ListImageTagsCalls(stub func(string) ([]string, error)) { - fake.listImageTagsMutex.Lock() - defer fake.listImageTagsMutex.Unlock() - fake.ListImageTagsStub = stub -} - -func (fake *Registry) ListImageTagsArgsForCall(i int) string { - fake.listImageTagsMutex.RLock() - defer fake.listImageTagsMutex.RUnlock() - argsForCall := fake.listImageTagsArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *Registry) ListImageTagsReturns(result1 []string, result2 error) { - fake.listImageTagsMutex.Lock() - defer fake.listImageTagsMutex.Unlock() - fake.ListImageTagsStub = nil - fake.listImageTagsReturns = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *Registry) ListImageTagsReturnsOnCall(i int, result1 []string, result2 error) { - fake.listImageTagsMutex.Lock() - defer fake.listImageTagsMutex.Unlock() - fake.ListImageTagsStub = nil - if fake.listImageTagsReturnsOnCall == nil { - fake.listImageTagsReturnsOnCall = make(map[int]struct { - result1 []string - result2 error - }) - } - fake.listImageTagsReturnsOnCall[i] = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *Registry) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.downloadBundleMutex.RLock() - defer fake.downloadBundleMutex.RUnlock() - fake.getFileMutex.RLock() - defer fake.getFileMutex.RUnlock() - fake.getFilesMutex.RLock() - defer fake.getFilesMutex.RUnlock() - fake.listImageTagsMutex.RLock() - defer fake.listImageTagsMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *Registry) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ registry.Registry = new(Registry) diff --git a/tkg/fakes/tkgconfigbomclient.go b/tkg/fakes/tkgconfigbomclient.go deleted file mode 100644 index a2df3bb320..0000000000 --- a/tkg/fakes/tkgconfigbomclient.go +++ /dev/null @@ -1,1549 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/vmware-tanzu/tanzu-framework/tkg/registry" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" -) - -type TKGConfigBomClient struct { - DownloadDefaultBOMFilesFromRegistryStub func(string, registry.Registry) error - downloadDefaultBOMFilesFromRegistryMutex sync.RWMutex - downloadDefaultBOMFilesFromRegistryArgsForCall []struct { - arg1 string - arg2 registry.Registry - } - downloadDefaultBOMFilesFromRegistryReturns struct { - result1 error - } - downloadDefaultBOMFilesFromRegistryReturnsOnCall map[int]struct { - result1 error - } - DownloadTKGCompatibilityFileFromRegistryStub func(string, string, registry.Registry) error - downloadTKGCompatibilityFileFromRegistryMutex sync.RWMutex - downloadTKGCompatibilityFileFromRegistryArgsForCall []struct { - arg1 string - arg2 string - arg3 registry.Registry - } - downloadTKGCompatibilityFileFromRegistryReturns struct { - result1 error - } - downloadTKGCompatibilityFileFromRegistryReturnsOnCall map[int]struct { - result1 error - } - GetAutoscalerImageForK8sVersionStub func(string) (string, error) - getAutoscalerImageForK8sVersionMutex sync.RWMutex - getAutoscalerImageForK8sVersionArgsForCall []struct { - arg1 string - } - getAutoscalerImageForK8sVersionReturns struct { - result1 string - result2 error - } - getAutoscalerImageForK8sVersionReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetAvailableK8sVersionsFromBOMFilesStub func() ([]string, error) - getAvailableK8sVersionsFromBOMFilesMutex sync.RWMutex - getAvailableK8sVersionsFromBOMFilesArgsForCall []struct { - } - getAvailableK8sVersionsFromBOMFilesReturns struct { - result1 []string - result2 error - } - getAvailableK8sVersionsFromBOMFilesReturnsOnCall map[int]struct { - result1 []string - result2 error - } - GetBOMConfigurationFromTkrVersionStub func(string) (*tkgconfigbom.BOMConfiguration, error) - getBOMConfigurationFromTkrVersionMutex sync.RWMutex - getBOMConfigurationFromTkrVersionArgsForCall []struct { - arg1 string - } - getBOMConfigurationFromTkrVersionReturns struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - } - getBOMConfigurationFromTkrVersionReturnsOnCall map[int]struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - } - GetCurrentTKGVersionStub func() string - getCurrentTKGVersionMutex sync.RWMutex - getCurrentTKGVersionArgsForCall []struct { - } - getCurrentTKGVersionReturns struct { - result1 string - } - getCurrentTKGVersionReturnsOnCall map[int]struct { - result1 string - } - GetCustomRepositoryStub func() (string, error) - getCustomRepositoryMutex sync.RWMutex - getCustomRepositoryArgsForCall []struct { - } - getCustomRepositoryReturns struct { - result1 string - result2 error - } - getCustomRepositoryReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetDefaultBoMFileNameStub func() (string, error) - getDefaultBoMFileNameMutex sync.RWMutex - getDefaultBoMFileNameArgsForCall []struct { - } - getDefaultBoMFileNameReturns struct { - result1 string - result2 error - } - getDefaultBoMFileNameReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetDefaultBoMFilePathStub func() (string, error) - getDefaultBoMFilePathMutex sync.RWMutex - getDefaultBoMFilePathArgsForCall []struct { - } - getDefaultBoMFilePathReturns struct { - result1 string - result2 error - } - getDefaultBoMFilePathReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetDefaultClusterAPIProvidersStub func() (string, string, string, error) - getDefaultClusterAPIProvidersMutex sync.RWMutex - getDefaultClusterAPIProvidersArgsForCall []struct { - } - getDefaultClusterAPIProvidersReturns struct { - result1 string - result2 string - result3 string - result4 error - } - getDefaultClusterAPIProvidersReturnsOnCall map[int]struct { - result1 string - result2 string - result3 string - result4 error - } - GetDefaultK8sVersionStub func() (string, error) - getDefaultK8sVersionMutex sync.RWMutex - getDefaultK8sVersionArgsForCall []struct { - } - getDefaultK8sVersionReturns struct { - result1 string - result2 error - } - getDefaultK8sVersionReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetDefaultTKGReleaseVersionStub func() (string, error) - getDefaultTKGReleaseVersionMutex sync.RWMutex - getDefaultTKGReleaseVersionArgsForCall []struct { - } - getDefaultTKGReleaseVersionReturns struct { - result1 string - result2 error - } - getDefaultTKGReleaseVersionReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetDefaultTKRVersionStub func() (string, error) - getDefaultTKRVersionMutex sync.RWMutex - getDefaultTKRVersionArgsForCall []struct { - } - getDefaultTKRVersionReturns struct { - result1 string - result2 error - } - getDefaultTKRVersionReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetDefaultTkgBOMConfigurationStub func() (*tkgconfigbom.BOMConfiguration, error) - getDefaultTkgBOMConfigurationMutex sync.RWMutex - getDefaultTkgBOMConfigurationArgsForCall []struct { - } - getDefaultTkgBOMConfigurationReturns struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - } - getDefaultTkgBOMConfigurationReturnsOnCall map[int]struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - } - GetDefaultTkrBOMConfigurationStub func() (*tkgconfigbom.BOMConfiguration, error) - getDefaultTkrBOMConfigurationMutex sync.RWMutex - getDefaultTkrBOMConfigurationArgsForCall []struct { - } - getDefaultTkrBOMConfigurationReturns struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - } - getDefaultTkrBOMConfigurationReturnsOnCall map[int]struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - } - GetK8sVersionFromTkrVersionStub func(string) (string, error) - getK8sVersionFromTkrVersionMutex sync.RWMutex - getK8sVersionFromTkrVersionArgsForCall []struct { - arg1 string - } - getK8sVersionFromTkrVersionReturns struct { - result1 string - result2 error - } - getK8sVersionFromTkrVersionReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetKappControllerPackageImageStub func() (string, error) - getKappControllerPackageImageMutex sync.RWMutex - getKappControllerPackageImageArgsForCall []struct { - } - getKappControllerPackageImageReturns struct { - result1 string - result2 error - } - getKappControllerPackageImageReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetManagementPackageRepositoryImageStub func() (string, error) - getManagementPackageRepositoryImageMutex sync.RWMutex - getManagementPackageRepositoryImageArgsForCall []struct { - } - getManagementPackageRepositoryImageReturns struct { - result1 string - result2 error - } - getManagementPackageRepositoryImageReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetManagementPackagesVersionStub func() (string, error) - getManagementPackagesVersionMutex sync.RWMutex - getManagementPackagesVersionArgsForCall []struct { - } - getManagementPackagesVersionReturns struct { - result1 string - result2 error - } - getManagementPackagesVersionReturnsOnCall map[int]struct { - result1 string - result2 error - } - InitBOMRegistryStub func() (registry.Registry, error) - initBOMRegistryMutex sync.RWMutex - initBOMRegistryArgsForCall []struct { - } - initBOMRegistryReturns struct { - result1 registry.Registry - result2 error - } - initBOMRegistryReturnsOnCall map[int]struct { - result1 registry.Registry - result2 error - } - IsCustomRepositorySkipTLSVerifyStub func() bool - isCustomRepositorySkipTLSVerifyMutex sync.RWMutex - isCustomRepositorySkipTLSVerifyArgsForCall []struct { - } - isCustomRepositorySkipTLSVerifyReturns struct { - result1 bool - } - isCustomRepositorySkipTLSVerifyReturnsOnCall map[int]struct { - result1 bool - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *TKGConfigBomClient) DownloadDefaultBOMFilesFromRegistry(arg1 string, arg2 registry.Registry) error { - fake.downloadDefaultBOMFilesFromRegistryMutex.Lock() - ret, specificReturn := fake.downloadDefaultBOMFilesFromRegistryReturnsOnCall[len(fake.downloadDefaultBOMFilesFromRegistryArgsForCall)] - fake.downloadDefaultBOMFilesFromRegistryArgsForCall = append(fake.downloadDefaultBOMFilesFromRegistryArgsForCall, struct { - arg1 string - arg2 registry.Registry - }{arg1, arg2}) - stub := fake.DownloadDefaultBOMFilesFromRegistryStub - fakeReturns := fake.downloadDefaultBOMFilesFromRegistryReturns - fake.recordInvocation("DownloadDefaultBOMFilesFromRegistry", []interface{}{arg1, arg2}) - fake.downloadDefaultBOMFilesFromRegistryMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigBomClient) DownloadDefaultBOMFilesFromRegistryCallCount() int { - fake.downloadDefaultBOMFilesFromRegistryMutex.RLock() - defer fake.downloadDefaultBOMFilesFromRegistryMutex.RUnlock() - return len(fake.downloadDefaultBOMFilesFromRegistryArgsForCall) -} - -func (fake *TKGConfigBomClient) DownloadDefaultBOMFilesFromRegistryCalls(stub func(string, registry.Registry) error) { - fake.downloadDefaultBOMFilesFromRegistryMutex.Lock() - defer fake.downloadDefaultBOMFilesFromRegistryMutex.Unlock() - fake.DownloadDefaultBOMFilesFromRegistryStub = stub -} - -func (fake *TKGConfigBomClient) DownloadDefaultBOMFilesFromRegistryArgsForCall(i int) (string, registry.Registry) { - fake.downloadDefaultBOMFilesFromRegistryMutex.RLock() - defer fake.downloadDefaultBOMFilesFromRegistryMutex.RUnlock() - argsForCall := fake.downloadDefaultBOMFilesFromRegistryArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *TKGConfigBomClient) DownloadDefaultBOMFilesFromRegistryReturns(result1 error) { - fake.downloadDefaultBOMFilesFromRegistryMutex.Lock() - defer fake.downloadDefaultBOMFilesFromRegistryMutex.Unlock() - fake.DownloadDefaultBOMFilesFromRegistryStub = nil - fake.downloadDefaultBOMFilesFromRegistryReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigBomClient) DownloadDefaultBOMFilesFromRegistryReturnsOnCall(i int, result1 error) { - fake.downloadDefaultBOMFilesFromRegistryMutex.Lock() - defer fake.downloadDefaultBOMFilesFromRegistryMutex.Unlock() - fake.DownloadDefaultBOMFilesFromRegistryStub = nil - if fake.downloadDefaultBOMFilesFromRegistryReturnsOnCall == nil { - fake.downloadDefaultBOMFilesFromRegistryReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.downloadDefaultBOMFilesFromRegistryReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigBomClient) DownloadTKGCompatibilityFileFromRegistry(arg1 string, arg2 string, arg3 registry.Registry) error { - fake.downloadTKGCompatibilityFileFromRegistryMutex.Lock() - ret, specificReturn := fake.downloadTKGCompatibilityFileFromRegistryReturnsOnCall[len(fake.downloadTKGCompatibilityFileFromRegistryArgsForCall)] - fake.downloadTKGCompatibilityFileFromRegistryArgsForCall = append(fake.downloadTKGCompatibilityFileFromRegistryArgsForCall, struct { - arg1 string - arg2 string - arg3 registry.Registry - }{arg1, arg2, arg3}) - stub := fake.DownloadTKGCompatibilityFileFromRegistryStub - fakeReturns := fake.downloadTKGCompatibilityFileFromRegistryReturns - fake.recordInvocation("DownloadTKGCompatibilityFileFromRegistry", []interface{}{arg1, arg2, arg3}) - fake.downloadTKGCompatibilityFileFromRegistryMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigBomClient) DownloadTKGCompatibilityFileFromRegistryCallCount() int { - fake.downloadTKGCompatibilityFileFromRegistryMutex.RLock() - defer fake.downloadTKGCompatibilityFileFromRegistryMutex.RUnlock() - return len(fake.downloadTKGCompatibilityFileFromRegistryArgsForCall) -} - -func (fake *TKGConfigBomClient) DownloadTKGCompatibilityFileFromRegistryCalls(stub func(string, string, registry.Registry) error) { - fake.downloadTKGCompatibilityFileFromRegistryMutex.Lock() - defer fake.downloadTKGCompatibilityFileFromRegistryMutex.Unlock() - fake.DownloadTKGCompatibilityFileFromRegistryStub = stub -} - -func (fake *TKGConfigBomClient) DownloadTKGCompatibilityFileFromRegistryArgsForCall(i int) (string, string, registry.Registry) { - fake.downloadTKGCompatibilityFileFromRegistryMutex.RLock() - defer fake.downloadTKGCompatibilityFileFromRegistryMutex.RUnlock() - argsForCall := fake.downloadTKGCompatibilityFileFromRegistryArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *TKGConfigBomClient) DownloadTKGCompatibilityFileFromRegistryReturns(result1 error) { - fake.downloadTKGCompatibilityFileFromRegistryMutex.Lock() - defer fake.downloadTKGCompatibilityFileFromRegistryMutex.Unlock() - fake.DownloadTKGCompatibilityFileFromRegistryStub = nil - fake.downloadTKGCompatibilityFileFromRegistryReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigBomClient) DownloadTKGCompatibilityFileFromRegistryReturnsOnCall(i int, result1 error) { - fake.downloadTKGCompatibilityFileFromRegistryMutex.Lock() - defer fake.downloadTKGCompatibilityFileFromRegistryMutex.Unlock() - fake.DownloadTKGCompatibilityFileFromRegistryStub = nil - if fake.downloadTKGCompatibilityFileFromRegistryReturnsOnCall == nil { - fake.downloadTKGCompatibilityFileFromRegistryReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.downloadTKGCompatibilityFileFromRegistryReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigBomClient) GetAutoscalerImageForK8sVersion(arg1 string) (string, error) { - fake.getAutoscalerImageForK8sVersionMutex.Lock() - ret, specificReturn := fake.getAutoscalerImageForK8sVersionReturnsOnCall[len(fake.getAutoscalerImageForK8sVersionArgsForCall)] - fake.getAutoscalerImageForK8sVersionArgsForCall = append(fake.getAutoscalerImageForK8sVersionArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetAutoscalerImageForK8sVersionStub - fakeReturns := fake.getAutoscalerImageForK8sVersionReturns - fake.recordInvocation("GetAutoscalerImageForK8sVersion", []interface{}{arg1}) - fake.getAutoscalerImageForK8sVersionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetAutoscalerImageForK8sVersionCallCount() int { - fake.getAutoscalerImageForK8sVersionMutex.RLock() - defer fake.getAutoscalerImageForK8sVersionMutex.RUnlock() - return len(fake.getAutoscalerImageForK8sVersionArgsForCall) -} - -func (fake *TKGConfigBomClient) GetAutoscalerImageForK8sVersionCalls(stub func(string) (string, error)) { - fake.getAutoscalerImageForK8sVersionMutex.Lock() - defer fake.getAutoscalerImageForK8sVersionMutex.Unlock() - fake.GetAutoscalerImageForK8sVersionStub = stub -} - -func (fake *TKGConfigBomClient) GetAutoscalerImageForK8sVersionArgsForCall(i int) string { - fake.getAutoscalerImageForK8sVersionMutex.RLock() - defer fake.getAutoscalerImageForK8sVersionMutex.RUnlock() - argsForCall := fake.getAutoscalerImageForK8sVersionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigBomClient) GetAutoscalerImageForK8sVersionReturns(result1 string, result2 error) { - fake.getAutoscalerImageForK8sVersionMutex.Lock() - defer fake.getAutoscalerImageForK8sVersionMutex.Unlock() - fake.GetAutoscalerImageForK8sVersionStub = nil - fake.getAutoscalerImageForK8sVersionReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetAutoscalerImageForK8sVersionReturnsOnCall(i int, result1 string, result2 error) { - fake.getAutoscalerImageForK8sVersionMutex.Lock() - defer fake.getAutoscalerImageForK8sVersionMutex.Unlock() - fake.GetAutoscalerImageForK8sVersionStub = nil - if fake.getAutoscalerImageForK8sVersionReturnsOnCall == nil { - fake.getAutoscalerImageForK8sVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getAutoscalerImageForK8sVersionReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetAvailableK8sVersionsFromBOMFiles() ([]string, error) { - fake.getAvailableK8sVersionsFromBOMFilesMutex.Lock() - ret, specificReturn := fake.getAvailableK8sVersionsFromBOMFilesReturnsOnCall[len(fake.getAvailableK8sVersionsFromBOMFilesArgsForCall)] - fake.getAvailableK8sVersionsFromBOMFilesArgsForCall = append(fake.getAvailableK8sVersionsFromBOMFilesArgsForCall, struct { - }{}) - stub := fake.GetAvailableK8sVersionsFromBOMFilesStub - fakeReturns := fake.getAvailableK8sVersionsFromBOMFilesReturns - fake.recordInvocation("GetAvailableK8sVersionsFromBOMFiles", []interface{}{}) - fake.getAvailableK8sVersionsFromBOMFilesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetAvailableK8sVersionsFromBOMFilesCallCount() int { - fake.getAvailableK8sVersionsFromBOMFilesMutex.RLock() - defer fake.getAvailableK8sVersionsFromBOMFilesMutex.RUnlock() - return len(fake.getAvailableK8sVersionsFromBOMFilesArgsForCall) -} - -func (fake *TKGConfigBomClient) GetAvailableK8sVersionsFromBOMFilesCalls(stub func() ([]string, error)) { - fake.getAvailableK8sVersionsFromBOMFilesMutex.Lock() - defer fake.getAvailableK8sVersionsFromBOMFilesMutex.Unlock() - fake.GetAvailableK8sVersionsFromBOMFilesStub = stub -} - -func (fake *TKGConfigBomClient) GetAvailableK8sVersionsFromBOMFilesReturns(result1 []string, result2 error) { - fake.getAvailableK8sVersionsFromBOMFilesMutex.Lock() - defer fake.getAvailableK8sVersionsFromBOMFilesMutex.Unlock() - fake.GetAvailableK8sVersionsFromBOMFilesStub = nil - fake.getAvailableK8sVersionsFromBOMFilesReturns = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetAvailableK8sVersionsFromBOMFilesReturnsOnCall(i int, result1 []string, result2 error) { - fake.getAvailableK8sVersionsFromBOMFilesMutex.Lock() - defer fake.getAvailableK8sVersionsFromBOMFilesMutex.Unlock() - fake.GetAvailableK8sVersionsFromBOMFilesStub = nil - if fake.getAvailableK8sVersionsFromBOMFilesReturnsOnCall == nil { - fake.getAvailableK8sVersionsFromBOMFilesReturnsOnCall = make(map[int]struct { - result1 []string - result2 error - }) - } - fake.getAvailableK8sVersionsFromBOMFilesReturnsOnCall[i] = struct { - result1 []string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetBOMConfigurationFromTkrVersion(arg1 string) (*tkgconfigbom.BOMConfiguration, error) { - fake.getBOMConfigurationFromTkrVersionMutex.Lock() - ret, specificReturn := fake.getBOMConfigurationFromTkrVersionReturnsOnCall[len(fake.getBOMConfigurationFromTkrVersionArgsForCall)] - fake.getBOMConfigurationFromTkrVersionArgsForCall = append(fake.getBOMConfigurationFromTkrVersionArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetBOMConfigurationFromTkrVersionStub - fakeReturns := fake.getBOMConfigurationFromTkrVersionReturns - fake.recordInvocation("GetBOMConfigurationFromTkrVersion", []interface{}{arg1}) - fake.getBOMConfigurationFromTkrVersionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetBOMConfigurationFromTkrVersionCallCount() int { - fake.getBOMConfigurationFromTkrVersionMutex.RLock() - defer fake.getBOMConfigurationFromTkrVersionMutex.RUnlock() - return len(fake.getBOMConfigurationFromTkrVersionArgsForCall) -} - -func (fake *TKGConfigBomClient) GetBOMConfigurationFromTkrVersionCalls(stub func(string) (*tkgconfigbom.BOMConfiguration, error)) { - fake.getBOMConfigurationFromTkrVersionMutex.Lock() - defer fake.getBOMConfigurationFromTkrVersionMutex.Unlock() - fake.GetBOMConfigurationFromTkrVersionStub = stub -} - -func (fake *TKGConfigBomClient) GetBOMConfigurationFromTkrVersionArgsForCall(i int) string { - fake.getBOMConfigurationFromTkrVersionMutex.RLock() - defer fake.getBOMConfigurationFromTkrVersionMutex.RUnlock() - argsForCall := fake.getBOMConfigurationFromTkrVersionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigBomClient) GetBOMConfigurationFromTkrVersionReturns(result1 *tkgconfigbom.BOMConfiguration, result2 error) { - fake.getBOMConfigurationFromTkrVersionMutex.Lock() - defer fake.getBOMConfigurationFromTkrVersionMutex.Unlock() - fake.GetBOMConfigurationFromTkrVersionStub = nil - fake.getBOMConfigurationFromTkrVersionReturns = struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetBOMConfigurationFromTkrVersionReturnsOnCall(i int, result1 *tkgconfigbom.BOMConfiguration, result2 error) { - fake.getBOMConfigurationFromTkrVersionMutex.Lock() - defer fake.getBOMConfigurationFromTkrVersionMutex.Unlock() - fake.GetBOMConfigurationFromTkrVersionStub = nil - if fake.getBOMConfigurationFromTkrVersionReturnsOnCall == nil { - fake.getBOMConfigurationFromTkrVersionReturnsOnCall = make(map[int]struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - }) - } - fake.getBOMConfigurationFromTkrVersionReturnsOnCall[i] = struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetCurrentTKGVersion() string { - fake.getCurrentTKGVersionMutex.Lock() - ret, specificReturn := fake.getCurrentTKGVersionReturnsOnCall[len(fake.getCurrentTKGVersionArgsForCall)] - fake.getCurrentTKGVersionArgsForCall = append(fake.getCurrentTKGVersionArgsForCall, struct { - }{}) - stub := fake.GetCurrentTKGVersionStub - fakeReturns := fake.getCurrentTKGVersionReturns - fake.recordInvocation("GetCurrentTKGVersion", []interface{}{}) - fake.getCurrentTKGVersionMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigBomClient) GetCurrentTKGVersionCallCount() int { - fake.getCurrentTKGVersionMutex.RLock() - defer fake.getCurrentTKGVersionMutex.RUnlock() - return len(fake.getCurrentTKGVersionArgsForCall) -} - -func (fake *TKGConfigBomClient) GetCurrentTKGVersionCalls(stub func() string) { - fake.getCurrentTKGVersionMutex.Lock() - defer fake.getCurrentTKGVersionMutex.Unlock() - fake.GetCurrentTKGVersionStub = stub -} - -func (fake *TKGConfigBomClient) GetCurrentTKGVersionReturns(result1 string) { - fake.getCurrentTKGVersionMutex.Lock() - defer fake.getCurrentTKGVersionMutex.Unlock() - fake.GetCurrentTKGVersionStub = nil - fake.getCurrentTKGVersionReturns = struct { - result1 string - }{result1} -} - -func (fake *TKGConfigBomClient) GetCurrentTKGVersionReturnsOnCall(i int, result1 string) { - fake.getCurrentTKGVersionMutex.Lock() - defer fake.getCurrentTKGVersionMutex.Unlock() - fake.GetCurrentTKGVersionStub = nil - if fake.getCurrentTKGVersionReturnsOnCall == nil { - fake.getCurrentTKGVersionReturnsOnCall = make(map[int]struct { - result1 string - }) - } - fake.getCurrentTKGVersionReturnsOnCall[i] = struct { - result1 string - }{result1} -} - -func (fake *TKGConfigBomClient) GetCustomRepository() (string, error) { - fake.getCustomRepositoryMutex.Lock() - ret, specificReturn := fake.getCustomRepositoryReturnsOnCall[len(fake.getCustomRepositoryArgsForCall)] - fake.getCustomRepositoryArgsForCall = append(fake.getCustomRepositoryArgsForCall, struct { - }{}) - stub := fake.GetCustomRepositoryStub - fakeReturns := fake.getCustomRepositoryReturns - fake.recordInvocation("GetCustomRepository", []interface{}{}) - fake.getCustomRepositoryMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetCustomRepositoryCallCount() int { - fake.getCustomRepositoryMutex.RLock() - defer fake.getCustomRepositoryMutex.RUnlock() - return len(fake.getCustomRepositoryArgsForCall) -} - -func (fake *TKGConfigBomClient) GetCustomRepositoryCalls(stub func() (string, error)) { - fake.getCustomRepositoryMutex.Lock() - defer fake.getCustomRepositoryMutex.Unlock() - fake.GetCustomRepositoryStub = stub -} - -func (fake *TKGConfigBomClient) GetCustomRepositoryReturns(result1 string, result2 error) { - fake.getCustomRepositoryMutex.Lock() - defer fake.getCustomRepositoryMutex.Unlock() - fake.GetCustomRepositoryStub = nil - fake.getCustomRepositoryReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetCustomRepositoryReturnsOnCall(i int, result1 string, result2 error) { - fake.getCustomRepositoryMutex.Lock() - defer fake.getCustomRepositoryMutex.Unlock() - fake.GetCustomRepositoryStub = nil - if fake.getCustomRepositoryReturnsOnCall == nil { - fake.getCustomRepositoryReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getCustomRepositoryReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultBoMFileName() (string, error) { - fake.getDefaultBoMFileNameMutex.Lock() - ret, specificReturn := fake.getDefaultBoMFileNameReturnsOnCall[len(fake.getDefaultBoMFileNameArgsForCall)] - fake.getDefaultBoMFileNameArgsForCall = append(fake.getDefaultBoMFileNameArgsForCall, struct { - }{}) - stub := fake.GetDefaultBoMFileNameStub - fakeReturns := fake.getDefaultBoMFileNameReturns - fake.recordInvocation("GetDefaultBoMFileName", []interface{}{}) - fake.getDefaultBoMFileNameMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetDefaultBoMFileNameCallCount() int { - fake.getDefaultBoMFileNameMutex.RLock() - defer fake.getDefaultBoMFileNameMutex.RUnlock() - return len(fake.getDefaultBoMFileNameArgsForCall) -} - -func (fake *TKGConfigBomClient) GetDefaultBoMFileNameCalls(stub func() (string, error)) { - fake.getDefaultBoMFileNameMutex.Lock() - defer fake.getDefaultBoMFileNameMutex.Unlock() - fake.GetDefaultBoMFileNameStub = stub -} - -func (fake *TKGConfigBomClient) GetDefaultBoMFileNameReturns(result1 string, result2 error) { - fake.getDefaultBoMFileNameMutex.Lock() - defer fake.getDefaultBoMFileNameMutex.Unlock() - fake.GetDefaultBoMFileNameStub = nil - fake.getDefaultBoMFileNameReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultBoMFileNameReturnsOnCall(i int, result1 string, result2 error) { - fake.getDefaultBoMFileNameMutex.Lock() - defer fake.getDefaultBoMFileNameMutex.Unlock() - fake.GetDefaultBoMFileNameStub = nil - if fake.getDefaultBoMFileNameReturnsOnCall == nil { - fake.getDefaultBoMFileNameReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getDefaultBoMFileNameReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultBoMFilePath() (string, error) { - fake.getDefaultBoMFilePathMutex.Lock() - ret, specificReturn := fake.getDefaultBoMFilePathReturnsOnCall[len(fake.getDefaultBoMFilePathArgsForCall)] - fake.getDefaultBoMFilePathArgsForCall = append(fake.getDefaultBoMFilePathArgsForCall, struct { - }{}) - stub := fake.GetDefaultBoMFilePathStub - fakeReturns := fake.getDefaultBoMFilePathReturns - fake.recordInvocation("GetDefaultBoMFilePath", []interface{}{}) - fake.getDefaultBoMFilePathMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetDefaultBoMFilePathCallCount() int { - fake.getDefaultBoMFilePathMutex.RLock() - defer fake.getDefaultBoMFilePathMutex.RUnlock() - return len(fake.getDefaultBoMFilePathArgsForCall) -} - -func (fake *TKGConfigBomClient) GetDefaultBoMFilePathCalls(stub func() (string, error)) { - fake.getDefaultBoMFilePathMutex.Lock() - defer fake.getDefaultBoMFilePathMutex.Unlock() - fake.GetDefaultBoMFilePathStub = stub -} - -func (fake *TKGConfigBomClient) GetDefaultBoMFilePathReturns(result1 string, result2 error) { - fake.getDefaultBoMFilePathMutex.Lock() - defer fake.getDefaultBoMFilePathMutex.Unlock() - fake.GetDefaultBoMFilePathStub = nil - fake.getDefaultBoMFilePathReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultBoMFilePathReturnsOnCall(i int, result1 string, result2 error) { - fake.getDefaultBoMFilePathMutex.Lock() - defer fake.getDefaultBoMFilePathMutex.Unlock() - fake.GetDefaultBoMFilePathStub = nil - if fake.getDefaultBoMFilePathReturnsOnCall == nil { - fake.getDefaultBoMFilePathReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getDefaultBoMFilePathReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultClusterAPIProviders() (string, string, string, error) { - fake.getDefaultClusterAPIProvidersMutex.Lock() - ret, specificReturn := fake.getDefaultClusterAPIProvidersReturnsOnCall[len(fake.getDefaultClusterAPIProvidersArgsForCall)] - fake.getDefaultClusterAPIProvidersArgsForCall = append(fake.getDefaultClusterAPIProvidersArgsForCall, struct { - }{}) - stub := fake.GetDefaultClusterAPIProvidersStub - fakeReturns := fake.getDefaultClusterAPIProvidersReturns - fake.recordInvocation("GetDefaultClusterAPIProviders", []interface{}{}) - fake.getDefaultClusterAPIProvidersMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2, ret.result3, ret.result4 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3, fakeReturns.result4 -} - -func (fake *TKGConfigBomClient) GetDefaultClusterAPIProvidersCallCount() int { - fake.getDefaultClusterAPIProvidersMutex.RLock() - defer fake.getDefaultClusterAPIProvidersMutex.RUnlock() - return len(fake.getDefaultClusterAPIProvidersArgsForCall) -} - -func (fake *TKGConfigBomClient) GetDefaultClusterAPIProvidersCalls(stub func() (string, string, string, error)) { - fake.getDefaultClusterAPIProvidersMutex.Lock() - defer fake.getDefaultClusterAPIProvidersMutex.Unlock() - fake.GetDefaultClusterAPIProvidersStub = stub -} - -func (fake *TKGConfigBomClient) GetDefaultClusterAPIProvidersReturns(result1 string, result2 string, result3 string, result4 error) { - fake.getDefaultClusterAPIProvidersMutex.Lock() - defer fake.getDefaultClusterAPIProvidersMutex.Unlock() - fake.GetDefaultClusterAPIProvidersStub = nil - fake.getDefaultClusterAPIProvidersReturns = struct { - result1 string - result2 string - result3 string - result4 error - }{result1, result2, result3, result4} -} - -func (fake *TKGConfigBomClient) GetDefaultClusterAPIProvidersReturnsOnCall(i int, result1 string, result2 string, result3 string, result4 error) { - fake.getDefaultClusterAPIProvidersMutex.Lock() - defer fake.getDefaultClusterAPIProvidersMutex.Unlock() - fake.GetDefaultClusterAPIProvidersStub = nil - if fake.getDefaultClusterAPIProvidersReturnsOnCall == nil { - fake.getDefaultClusterAPIProvidersReturnsOnCall = make(map[int]struct { - result1 string - result2 string - result3 string - result4 error - }) - } - fake.getDefaultClusterAPIProvidersReturnsOnCall[i] = struct { - result1 string - result2 string - result3 string - result4 error - }{result1, result2, result3, result4} -} - -func (fake *TKGConfigBomClient) GetDefaultK8sVersion() (string, error) { - fake.getDefaultK8sVersionMutex.Lock() - ret, specificReturn := fake.getDefaultK8sVersionReturnsOnCall[len(fake.getDefaultK8sVersionArgsForCall)] - fake.getDefaultK8sVersionArgsForCall = append(fake.getDefaultK8sVersionArgsForCall, struct { - }{}) - stub := fake.GetDefaultK8sVersionStub - fakeReturns := fake.getDefaultK8sVersionReturns - fake.recordInvocation("GetDefaultK8sVersion", []interface{}{}) - fake.getDefaultK8sVersionMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetDefaultK8sVersionCallCount() int { - fake.getDefaultK8sVersionMutex.RLock() - defer fake.getDefaultK8sVersionMutex.RUnlock() - return len(fake.getDefaultK8sVersionArgsForCall) -} - -func (fake *TKGConfigBomClient) GetDefaultK8sVersionCalls(stub func() (string, error)) { - fake.getDefaultK8sVersionMutex.Lock() - defer fake.getDefaultK8sVersionMutex.Unlock() - fake.GetDefaultK8sVersionStub = stub -} - -func (fake *TKGConfigBomClient) GetDefaultK8sVersionReturns(result1 string, result2 error) { - fake.getDefaultK8sVersionMutex.Lock() - defer fake.getDefaultK8sVersionMutex.Unlock() - fake.GetDefaultK8sVersionStub = nil - fake.getDefaultK8sVersionReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultK8sVersionReturnsOnCall(i int, result1 string, result2 error) { - fake.getDefaultK8sVersionMutex.Lock() - defer fake.getDefaultK8sVersionMutex.Unlock() - fake.GetDefaultK8sVersionStub = nil - if fake.getDefaultK8sVersionReturnsOnCall == nil { - fake.getDefaultK8sVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getDefaultK8sVersionReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultTKGReleaseVersion() (string, error) { - fake.getDefaultTKGReleaseVersionMutex.Lock() - ret, specificReturn := fake.getDefaultTKGReleaseVersionReturnsOnCall[len(fake.getDefaultTKGReleaseVersionArgsForCall)] - fake.getDefaultTKGReleaseVersionArgsForCall = append(fake.getDefaultTKGReleaseVersionArgsForCall, struct { - }{}) - stub := fake.GetDefaultTKGReleaseVersionStub - fakeReturns := fake.getDefaultTKGReleaseVersionReturns - fake.recordInvocation("GetDefaultTKGReleaseVersion", []interface{}{}) - fake.getDefaultTKGReleaseVersionMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetDefaultTKGReleaseVersionCallCount() int { - fake.getDefaultTKGReleaseVersionMutex.RLock() - defer fake.getDefaultTKGReleaseVersionMutex.RUnlock() - return len(fake.getDefaultTKGReleaseVersionArgsForCall) -} - -func (fake *TKGConfigBomClient) GetDefaultTKGReleaseVersionCalls(stub func() (string, error)) { - fake.getDefaultTKGReleaseVersionMutex.Lock() - defer fake.getDefaultTKGReleaseVersionMutex.Unlock() - fake.GetDefaultTKGReleaseVersionStub = stub -} - -func (fake *TKGConfigBomClient) GetDefaultTKGReleaseVersionReturns(result1 string, result2 error) { - fake.getDefaultTKGReleaseVersionMutex.Lock() - defer fake.getDefaultTKGReleaseVersionMutex.Unlock() - fake.GetDefaultTKGReleaseVersionStub = nil - fake.getDefaultTKGReleaseVersionReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultTKGReleaseVersionReturnsOnCall(i int, result1 string, result2 error) { - fake.getDefaultTKGReleaseVersionMutex.Lock() - defer fake.getDefaultTKGReleaseVersionMutex.Unlock() - fake.GetDefaultTKGReleaseVersionStub = nil - if fake.getDefaultTKGReleaseVersionReturnsOnCall == nil { - fake.getDefaultTKGReleaseVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getDefaultTKGReleaseVersionReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultTKRVersion() (string, error) { - fake.getDefaultTKRVersionMutex.Lock() - ret, specificReturn := fake.getDefaultTKRVersionReturnsOnCall[len(fake.getDefaultTKRVersionArgsForCall)] - fake.getDefaultTKRVersionArgsForCall = append(fake.getDefaultTKRVersionArgsForCall, struct { - }{}) - stub := fake.GetDefaultTKRVersionStub - fakeReturns := fake.getDefaultTKRVersionReturns - fake.recordInvocation("GetDefaultTKRVersion", []interface{}{}) - fake.getDefaultTKRVersionMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetDefaultTKRVersionCallCount() int { - fake.getDefaultTKRVersionMutex.RLock() - defer fake.getDefaultTKRVersionMutex.RUnlock() - return len(fake.getDefaultTKRVersionArgsForCall) -} - -func (fake *TKGConfigBomClient) GetDefaultTKRVersionCalls(stub func() (string, error)) { - fake.getDefaultTKRVersionMutex.Lock() - defer fake.getDefaultTKRVersionMutex.Unlock() - fake.GetDefaultTKRVersionStub = stub -} - -func (fake *TKGConfigBomClient) GetDefaultTKRVersionReturns(result1 string, result2 error) { - fake.getDefaultTKRVersionMutex.Lock() - defer fake.getDefaultTKRVersionMutex.Unlock() - fake.GetDefaultTKRVersionStub = nil - fake.getDefaultTKRVersionReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultTKRVersionReturnsOnCall(i int, result1 string, result2 error) { - fake.getDefaultTKRVersionMutex.Lock() - defer fake.getDefaultTKRVersionMutex.Unlock() - fake.GetDefaultTKRVersionStub = nil - if fake.getDefaultTKRVersionReturnsOnCall == nil { - fake.getDefaultTKRVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getDefaultTKRVersionReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultTkgBOMConfiguration() (*tkgconfigbom.BOMConfiguration, error) { - fake.getDefaultTkgBOMConfigurationMutex.Lock() - ret, specificReturn := fake.getDefaultTkgBOMConfigurationReturnsOnCall[len(fake.getDefaultTkgBOMConfigurationArgsForCall)] - fake.getDefaultTkgBOMConfigurationArgsForCall = append(fake.getDefaultTkgBOMConfigurationArgsForCall, struct { - }{}) - stub := fake.GetDefaultTkgBOMConfigurationStub - fakeReturns := fake.getDefaultTkgBOMConfigurationReturns - fake.recordInvocation("GetDefaultTkgBOMConfiguration", []interface{}{}) - fake.getDefaultTkgBOMConfigurationMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetDefaultTkgBOMConfigurationCallCount() int { - fake.getDefaultTkgBOMConfigurationMutex.RLock() - defer fake.getDefaultTkgBOMConfigurationMutex.RUnlock() - return len(fake.getDefaultTkgBOMConfigurationArgsForCall) -} - -func (fake *TKGConfigBomClient) GetDefaultTkgBOMConfigurationCalls(stub func() (*tkgconfigbom.BOMConfiguration, error)) { - fake.getDefaultTkgBOMConfigurationMutex.Lock() - defer fake.getDefaultTkgBOMConfigurationMutex.Unlock() - fake.GetDefaultTkgBOMConfigurationStub = stub -} - -func (fake *TKGConfigBomClient) GetDefaultTkgBOMConfigurationReturns(result1 *tkgconfigbom.BOMConfiguration, result2 error) { - fake.getDefaultTkgBOMConfigurationMutex.Lock() - defer fake.getDefaultTkgBOMConfigurationMutex.Unlock() - fake.GetDefaultTkgBOMConfigurationStub = nil - fake.getDefaultTkgBOMConfigurationReturns = struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultTkgBOMConfigurationReturnsOnCall(i int, result1 *tkgconfigbom.BOMConfiguration, result2 error) { - fake.getDefaultTkgBOMConfigurationMutex.Lock() - defer fake.getDefaultTkgBOMConfigurationMutex.Unlock() - fake.GetDefaultTkgBOMConfigurationStub = nil - if fake.getDefaultTkgBOMConfigurationReturnsOnCall == nil { - fake.getDefaultTkgBOMConfigurationReturnsOnCall = make(map[int]struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - }) - } - fake.getDefaultTkgBOMConfigurationReturnsOnCall[i] = struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultTkrBOMConfiguration() (*tkgconfigbom.BOMConfiguration, error) { - fake.getDefaultTkrBOMConfigurationMutex.Lock() - ret, specificReturn := fake.getDefaultTkrBOMConfigurationReturnsOnCall[len(fake.getDefaultTkrBOMConfigurationArgsForCall)] - fake.getDefaultTkrBOMConfigurationArgsForCall = append(fake.getDefaultTkrBOMConfigurationArgsForCall, struct { - }{}) - stub := fake.GetDefaultTkrBOMConfigurationStub - fakeReturns := fake.getDefaultTkrBOMConfigurationReturns - fake.recordInvocation("GetDefaultTkrBOMConfiguration", []interface{}{}) - fake.getDefaultTkrBOMConfigurationMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetDefaultTkrBOMConfigurationCallCount() int { - fake.getDefaultTkrBOMConfigurationMutex.RLock() - defer fake.getDefaultTkrBOMConfigurationMutex.RUnlock() - return len(fake.getDefaultTkrBOMConfigurationArgsForCall) -} - -func (fake *TKGConfigBomClient) GetDefaultTkrBOMConfigurationCalls(stub func() (*tkgconfigbom.BOMConfiguration, error)) { - fake.getDefaultTkrBOMConfigurationMutex.Lock() - defer fake.getDefaultTkrBOMConfigurationMutex.Unlock() - fake.GetDefaultTkrBOMConfigurationStub = stub -} - -func (fake *TKGConfigBomClient) GetDefaultTkrBOMConfigurationReturns(result1 *tkgconfigbom.BOMConfiguration, result2 error) { - fake.getDefaultTkrBOMConfigurationMutex.Lock() - defer fake.getDefaultTkrBOMConfigurationMutex.Unlock() - fake.GetDefaultTkrBOMConfigurationStub = nil - fake.getDefaultTkrBOMConfigurationReturns = struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetDefaultTkrBOMConfigurationReturnsOnCall(i int, result1 *tkgconfigbom.BOMConfiguration, result2 error) { - fake.getDefaultTkrBOMConfigurationMutex.Lock() - defer fake.getDefaultTkrBOMConfigurationMutex.Unlock() - fake.GetDefaultTkrBOMConfigurationStub = nil - if fake.getDefaultTkrBOMConfigurationReturnsOnCall == nil { - fake.getDefaultTkrBOMConfigurationReturnsOnCall = make(map[int]struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - }) - } - fake.getDefaultTkrBOMConfigurationReturnsOnCall[i] = struct { - result1 *tkgconfigbom.BOMConfiguration - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetK8sVersionFromTkrVersion(arg1 string) (string, error) { - fake.getK8sVersionFromTkrVersionMutex.Lock() - ret, specificReturn := fake.getK8sVersionFromTkrVersionReturnsOnCall[len(fake.getK8sVersionFromTkrVersionArgsForCall)] - fake.getK8sVersionFromTkrVersionArgsForCall = append(fake.getK8sVersionFromTkrVersionArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetK8sVersionFromTkrVersionStub - fakeReturns := fake.getK8sVersionFromTkrVersionReturns - fake.recordInvocation("GetK8sVersionFromTkrVersion", []interface{}{arg1}) - fake.getK8sVersionFromTkrVersionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetK8sVersionFromTkrVersionCallCount() int { - fake.getK8sVersionFromTkrVersionMutex.RLock() - defer fake.getK8sVersionFromTkrVersionMutex.RUnlock() - return len(fake.getK8sVersionFromTkrVersionArgsForCall) -} - -func (fake *TKGConfigBomClient) GetK8sVersionFromTkrVersionCalls(stub func(string) (string, error)) { - fake.getK8sVersionFromTkrVersionMutex.Lock() - defer fake.getK8sVersionFromTkrVersionMutex.Unlock() - fake.GetK8sVersionFromTkrVersionStub = stub -} - -func (fake *TKGConfigBomClient) GetK8sVersionFromTkrVersionArgsForCall(i int) string { - fake.getK8sVersionFromTkrVersionMutex.RLock() - defer fake.getK8sVersionFromTkrVersionMutex.RUnlock() - argsForCall := fake.getK8sVersionFromTkrVersionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigBomClient) GetK8sVersionFromTkrVersionReturns(result1 string, result2 error) { - fake.getK8sVersionFromTkrVersionMutex.Lock() - defer fake.getK8sVersionFromTkrVersionMutex.Unlock() - fake.GetK8sVersionFromTkrVersionStub = nil - fake.getK8sVersionFromTkrVersionReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetK8sVersionFromTkrVersionReturnsOnCall(i int, result1 string, result2 error) { - fake.getK8sVersionFromTkrVersionMutex.Lock() - defer fake.getK8sVersionFromTkrVersionMutex.Unlock() - fake.GetK8sVersionFromTkrVersionStub = nil - if fake.getK8sVersionFromTkrVersionReturnsOnCall == nil { - fake.getK8sVersionFromTkrVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getK8sVersionFromTkrVersionReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetKappControllerPackageImage() (string, error) { - fake.getKappControllerPackageImageMutex.Lock() - ret, specificReturn := fake.getKappControllerPackageImageReturnsOnCall[len(fake.getKappControllerPackageImageArgsForCall)] - fake.getKappControllerPackageImageArgsForCall = append(fake.getKappControllerPackageImageArgsForCall, struct { - }{}) - stub := fake.GetKappControllerPackageImageStub - fakeReturns := fake.getKappControllerPackageImageReturns - fake.recordInvocation("GetKappControllerPackageImage", []interface{}{}) - fake.getKappControllerPackageImageMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetKappControllerPackageImageCallCount() int { - fake.getKappControllerPackageImageMutex.RLock() - defer fake.getKappControllerPackageImageMutex.RUnlock() - return len(fake.getKappControllerPackageImageArgsForCall) -} - -func (fake *TKGConfigBomClient) GetKappControllerPackageImageCalls(stub func() (string, error)) { - fake.getKappControllerPackageImageMutex.Lock() - defer fake.getKappControllerPackageImageMutex.Unlock() - fake.GetKappControllerPackageImageStub = stub -} - -func (fake *TKGConfigBomClient) GetKappControllerPackageImageReturns(result1 string, result2 error) { - fake.getKappControllerPackageImageMutex.Lock() - defer fake.getKappControllerPackageImageMutex.Unlock() - fake.GetKappControllerPackageImageStub = nil - fake.getKappControllerPackageImageReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetKappControllerPackageImageReturnsOnCall(i int, result1 string, result2 error) { - fake.getKappControllerPackageImageMutex.Lock() - defer fake.getKappControllerPackageImageMutex.Unlock() - fake.GetKappControllerPackageImageStub = nil - if fake.getKappControllerPackageImageReturnsOnCall == nil { - fake.getKappControllerPackageImageReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getKappControllerPackageImageReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetManagementPackageRepositoryImage() (string, error) { - fake.getManagementPackageRepositoryImageMutex.Lock() - ret, specificReturn := fake.getManagementPackageRepositoryImageReturnsOnCall[len(fake.getManagementPackageRepositoryImageArgsForCall)] - fake.getManagementPackageRepositoryImageArgsForCall = append(fake.getManagementPackageRepositoryImageArgsForCall, struct { - }{}) - stub := fake.GetManagementPackageRepositoryImageStub - fakeReturns := fake.getManagementPackageRepositoryImageReturns - fake.recordInvocation("GetManagementPackageRepositoryImage", []interface{}{}) - fake.getManagementPackageRepositoryImageMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetManagementPackageRepositoryImageCallCount() int { - fake.getManagementPackageRepositoryImageMutex.RLock() - defer fake.getManagementPackageRepositoryImageMutex.RUnlock() - return len(fake.getManagementPackageRepositoryImageArgsForCall) -} - -func (fake *TKGConfigBomClient) GetManagementPackageRepositoryImageCalls(stub func() (string, error)) { - fake.getManagementPackageRepositoryImageMutex.Lock() - defer fake.getManagementPackageRepositoryImageMutex.Unlock() - fake.GetManagementPackageRepositoryImageStub = stub -} - -func (fake *TKGConfigBomClient) GetManagementPackageRepositoryImageReturns(result1 string, result2 error) { - fake.getManagementPackageRepositoryImageMutex.Lock() - defer fake.getManagementPackageRepositoryImageMutex.Unlock() - fake.GetManagementPackageRepositoryImageStub = nil - fake.getManagementPackageRepositoryImageReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetManagementPackageRepositoryImageReturnsOnCall(i int, result1 string, result2 error) { - fake.getManagementPackageRepositoryImageMutex.Lock() - defer fake.getManagementPackageRepositoryImageMutex.Unlock() - fake.GetManagementPackageRepositoryImageStub = nil - if fake.getManagementPackageRepositoryImageReturnsOnCall == nil { - fake.getManagementPackageRepositoryImageReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getManagementPackageRepositoryImageReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetManagementPackagesVersion() (string, error) { - fake.getManagementPackagesVersionMutex.Lock() - ret, specificReturn := fake.getManagementPackagesVersionReturnsOnCall[len(fake.getManagementPackagesVersionArgsForCall)] - fake.getManagementPackagesVersionArgsForCall = append(fake.getManagementPackagesVersionArgsForCall, struct { - }{}) - stub := fake.GetManagementPackagesVersionStub - fakeReturns := fake.getManagementPackagesVersionReturns - fake.recordInvocation("GetManagementPackagesVersion", []interface{}{}) - fake.getManagementPackagesVersionMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) GetManagementPackagesVersionCallCount() int { - fake.getManagementPackagesVersionMutex.RLock() - defer fake.getManagementPackagesVersionMutex.RUnlock() - return len(fake.getManagementPackagesVersionArgsForCall) -} - -func (fake *TKGConfigBomClient) GetManagementPackagesVersionCalls(stub func() (string, error)) { - fake.getManagementPackagesVersionMutex.Lock() - defer fake.getManagementPackagesVersionMutex.Unlock() - fake.GetManagementPackagesVersionStub = stub -} - -func (fake *TKGConfigBomClient) GetManagementPackagesVersionReturns(result1 string, result2 error) { - fake.getManagementPackagesVersionMutex.Lock() - defer fake.getManagementPackagesVersionMutex.Unlock() - fake.GetManagementPackagesVersionStub = nil - fake.getManagementPackagesVersionReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) GetManagementPackagesVersionReturnsOnCall(i int, result1 string, result2 error) { - fake.getManagementPackagesVersionMutex.Lock() - defer fake.getManagementPackagesVersionMutex.Unlock() - fake.GetManagementPackagesVersionStub = nil - if fake.getManagementPackagesVersionReturnsOnCall == nil { - fake.getManagementPackagesVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getManagementPackagesVersionReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) InitBOMRegistry() (registry.Registry, error) { - fake.initBOMRegistryMutex.Lock() - ret, specificReturn := fake.initBOMRegistryReturnsOnCall[len(fake.initBOMRegistryArgsForCall)] - fake.initBOMRegistryArgsForCall = append(fake.initBOMRegistryArgsForCall, struct { - }{}) - stub := fake.InitBOMRegistryStub - fakeReturns := fake.initBOMRegistryReturns - fake.recordInvocation("InitBOMRegistry", []interface{}{}) - fake.initBOMRegistryMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigBomClient) InitBOMRegistryCallCount() int { - fake.initBOMRegistryMutex.RLock() - defer fake.initBOMRegistryMutex.RUnlock() - return len(fake.initBOMRegistryArgsForCall) -} - -func (fake *TKGConfigBomClient) InitBOMRegistryCalls(stub func() (registry.Registry, error)) { - fake.initBOMRegistryMutex.Lock() - defer fake.initBOMRegistryMutex.Unlock() - fake.InitBOMRegistryStub = stub -} - -func (fake *TKGConfigBomClient) InitBOMRegistryReturns(result1 registry.Registry, result2 error) { - fake.initBOMRegistryMutex.Lock() - defer fake.initBOMRegistryMutex.Unlock() - fake.InitBOMRegistryStub = nil - fake.initBOMRegistryReturns = struct { - result1 registry.Registry - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) InitBOMRegistryReturnsOnCall(i int, result1 registry.Registry, result2 error) { - fake.initBOMRegistryMutex.Lock() - defer fake.initBOMRegistryMutex.Unlock() - fake.InitBOMRegistryStub = nil - if fake.initBOMRegistryReturnsOnCall == nil { - fake.initBOMRegistryReturnsOnCall = make(map[int]struct { - result1 registry.Registry - result2 error - }) - } - fake.initBOMRegistryReturnsOnCall[i] = struct { - result1 registry.Registry - result2 error - }{result1, result2} -} - -func (fake *TKGConfigBomClient) IsCustomRepositorySkipTLSVerify() bool { - fake.isCustomRepositorySkipTLSVerifyMutex.Lock() - ret, specificReturn := fake.isCustomRepositorySkipTLSVerifyReturnsOnCall[len(fake.isCustomRepositorySkipTLSVerifyArgsForCall)] - fake.isCustomRepositorySkipTLSVerifyArgsForCall = append(fake.isCustomRepositorySkipTLSVerifyArgsForCall, struct { - }{}) - stub := fake.IsCustomRepositorySkipTLSVerifyStub - fakeReturns := fake.isCustomRepositorySkipTLSVerifyReturns - fake.recordInvocation("IsCustomRepositorySkipTLSVerify", []interface{}{}) - fake.isCustomRepositorySkipTLSVerifyMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigBomClient) IsCustomRepositorySkipTLSVerifyCallCount() int { - fake.isCustomRepositorySkipTLSVerifyMutex.RLock() - defer fake.isCustomRepositorySkipTLSVerifyMutex.RUnlock() - return len(fake.isCustomRepositorySkipTLSVerifyArgsForCall) -} - -func (fake *TKGConfigBomClient) IsCustomRepositorySkipTLSVerifyCalls(stub func() bool) { - fake.isCustomRepositorySkipTLSVerifyMutex.Lock() - defer fake.isCustomRepositorySkipTLSVerifyMutex.Unlock() - fake.IsCustomRepositorySkipTLSVerifyStub = stub -} - -func (fake *TKGConfigBomClient) IsCustomRepositorySkipTLSVerifyReturns(result1 bool) { - fake.isCustomRepositorySkipTLSVerifyMutex.Lock() - defer fake.isCustomRepositorySkipTLSVerifyMutex.Unlock() - fake.IsCustomRepositorySkipTLSVerifyStub = nil - fake.isCustomRepositorySkipTLSVerifyReturns = struct { - result1 bool - }{result1} -} - -func (fake *TKGConfigBomClient) IsCustomRepositorySkipTLSVerifyReturnsOnCall(i int, result1 bool) { - fake.isCustomRepositorySkipTLSVerifyMutex.Lock() - defer fake.isCustomRepositorySkipTLSVerifyMutex.Unlock() - fake.IsCustomRepositorySkipTLSVerifyStub = nil - if fake.isCustomRepositorySkipTLSVerifyReturnsOnCall == nil { - fake.isCustomRepositorySkipTLSVerifyReturnsOnCall = make(map[int]struct { - result1 bool - }) - } - fake.isCustomRepositorySkipTLSVerifyReturnsOnCall[i] = struct { - result1 bool - }{result1} -} - -func (fake *TKGConfigBomClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.downloadDefaultBOMFilesFromRegistryMutex.RLock() - defer fake.downloadDefaultBOMFilesFromRegistryMutex.RUnlock() - fake.downloadTKGCompatibilityFileFromRegistryMutex.RLock() - defer fake.downloadTKGCompatibilityFileFromRegistryMutex.RUnlock() - fake.getAutoscalerImageForK8sVersionMutex.RLock() - defer fake.getAutoscalerImageForK8sVersionMutex.RUnlock() - fake.getAvailableK8sVersionsFromBOMFilesMutex.RLock() - defer fake.getAvailableK8sVersionsFromBOMFilesMutex.RUnlock() - fake.getBOMConfigurationFromTkrVersionMutex.RLock() - defer fake.getBOMConfigurationFromTkrVersionMutex.RUnlock() - fake.getCurrentTKGVersionMutex.RLock() - defer fake.getCurrentTKGVersionMutex.RUnlock() - fake.getCustomRepositoryMutex.RLock() - defer fake.getCustomRepositoryMutex.RUnlock() - fake.getDefaultBoMFileNameMutex.RLock() - defer fake.getDefaultBoMFileNameMutex.RUnlock() - fake.getDefaultBoMFilePathMutex.RLock() - defer fake.getDefaultBoMFilePathMutex.RUnlock() - fake.getDefaultClusterAPIProvidersMutex.RLock() - defer fake.getDefaultClusterAPIProvidersMutex.RUnlock() - fake.getDefaultK8sVersionMutex.RLock() - defer fake.getDefaultK8sVersionMutex.RUnlock() - fake.getDefaultTKGReleaseVersionMutex.RLock() - defer fake.getDefaultTKGReleaseVersionMutex.RUnlock() - fake.getDefaultTKRVersionMutex.RLock() - defer fake.getDefaultTKRVersionMutex.RUnlock() - fake.getDefaultTkgBOMConfigurationMutex.RLock() - defer fake.getDefaultTkgBOMConfigurationMutex.RUnlock() - fake.getDefaultTkrBOMConfigurationMutex.RLock() - defer fake.getDefaultTkrBOMConfigurationMutex.RUnlock() - fake.getK8sVersionFromTkrVersionMutex.RLock() - defer fake.getK8sVersionFromTkrVersionMutex.RUnlock() - fake.getKappControllerPackageImageMutex.RLock() - defer fake.getKappControllerPackageImageMutex.RUnlock() - fake.getManagementPackageRepositoryImageMutex.RLock() - defer fake.getManagementPackageRepositoryImageMutex.RUnlock() - fake.getManagementPackagesVersionMutex.RLock() - defer fake.getManagementPackagesVersionMutex.RUnlock() - fake.initBOMRegistryMutex.RLock() - defer fake.initBOMRegistryMutex.RUnlock() - fake.isCustomRepositorySkipTLSVerifyMutex.RLock() - defer fake.isCustomRepositorySkipTLSVerifyMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *TKGConfigBomClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ tkgconfigbom.Client = new(TKGConfigBomClient) diff --git a/tkg/fakes/tkgconfigreaderwriterclient.go b/tkg/fakes/tkgconfigreaderwriterclient.go deleted file mode 100644 index 70ce3b82b6..0000000000 --- a/tkg/fakes/tkgconfigreaderwriterclient.go +++ /dev/null @@ -1,169 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "sigs.k8s.io/cluster-api/cmd/clusterctl/client/config" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" -) - -type TKGConfigReaderWriterClient struct { - ClusterConfigClientStub func() config.Client - clusterConfigClientMutex sync.RWMutex - clusterConfigClientArgsForCall []struct { - } - clusterConfigClientReturns struct { - result1 config.Client - } - clusterConfigClientReturnsOnCall map[int]struct { - result1 config.Client - } - TKGConfigReaderWriterStub func() tkgconfigreaderwriter.TKGConfigReaderWriter - tKGConfigReaderWriterMutex sync.RWMutex - tKGConfigReaderWriterArgsForCall []struct { - } - tKGConfigReaderWriterReturns struct { - result1 tkgconfigreaderwriter.TKGConfigReaderWriter - } - tKGConfigReaderWriterReturnsOnCall map[int]struct { - result1 tkgconfigreaderwriter.TKGConfigReaderWriter - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *TKGConfigReaderWriterClient) ClusterConfigClient() config.Client { - fake.clusterConfigClientMutex.Lock() - ret, specificReturn := fake.clusterConfigClientReturnsOnCall[len(fake.clusterConfigClientArgsForCall)] - fake.clusterConfigClientArgsForCall = append(fake.clusterConfigClientArgsForCall, struct { - }{}) - stub := fake.ClusterConfigClientStub - fakeReturns := fake.clusterConfigClientReturns - fake.recordInvocation("ClusterConfigClient", []interface{}{}) - fake.clusterConfigClientMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigReaderWriterClient) ClusterConfigClientCallCount() int { - fake.clusterConfigClientMutex.RLock() - defer fake.clusterConfigClientMutex.RUnlock() - return len(fake.clusterConfigClientArgsForCall) -} - -func (fake *TKGConfigReaderWriterClient) ClusterConfigClientCalls(stub func() config.Client) { - fake.clusterConfigClientMutex.Lock() - defer fake.clusterConfigClientMutex.Unlock() - fake.ClusterConfigClientStub = stub -} - -func (fake *TKGConfigReaderWriterClient) ClusterConfigClientReturns(result1 config.Client) { - fake.clusterConfigClientMutex.Lock() - defer fake.clusterConfigClientMutex.Unlock() - fake.ClusterConfigClientStub = nil - fake.clusterConfigClientReturns = struct { - result1 config.Client - }{result1} -} - -func (fake *TKGConfigReaderWriterClient) ClusterConfigClientReturnsOnCall(i int, result1 config.Client) { - fake.clusterConfigClientMutex.Lock() - defer fake.clusterConfigClientMutex.Unlock() - fake.ClusterConfigClientStub = nil - if fake.clusterConfigClientReturnsOnCall == nil { - fake.clusterConfigClientReturnsOnCall = make(map[int]struct { - result1 config.Client - }) - } - fake.clusterConfigClientReturnsOnCall[i] = struct { - result1 config.Client - }{result1} -} - -func (fake *TKGConfigReaderWriterClient) TKGConfigReaderWriter() tkgconfigreaderwriter.TKGConfigReaderWriter { - fake.tKGConfigReaderWriterMutex.Lock() - ret, specificReturn := fake.tKGConfigReaderWriterReturnsOnCall[len(fake.tKGConfigReaderWriterArgsForCall)] - fake.tKGConfigReaderWriterArgsForCall = append(fake.tKGConfigReaderWriterArgsForCall, struct { - }{}) - stub := fake.TKGConfigReaderWriterStub - fakeReturns := fake.tKGConfigReaderWriterReturns - fake.recordInvocation("TKGConfigReaderWriter", []interface{}{}) - fake.tKGConfigReaderWriterMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigReaderWriterClient) TKGConfigReaderWriterCallCount() int { - fake.tKGConfigReaderWriterMutex.RLock() - defer fake.tKGConfigReaderWriterMutex.RUnlock() - return len(fake.tKGConfigReaderWriterArgsForCall) -} - -func (fake *TKGConfigReaderWriterClient) TKGConfigReaderWriterCalls(stub func() tkgconfigreaderwriter.TKGConfigReaderWriter) { - fake.tKGConfigReaderWriterMutex.Lock() - defer fake.tKGConfigReaderWriterMutex.Unlock() - fake.TKGConfigReaderWriterStub = stub -} - -func (fake *TKGConfigReaderWriterClient) TKGConfigReaderWriterReturns(result1 tkgconfigreaderwriter.TKGConfigReaderWriter) { - fake.tKGConfigReaderWriterMutex.Lock() - defer fake.tKGConfigReaderWriterMutex.Unlock() - fake.TKGConfigReaderWriterStub = nil - fake.tKGConfigReaderWriterReturns = struct { - result1 tkgconfigreaderwriter.TKGConfigReaderWriter - }{result1} -} - -func (fake *TKGConfigReaderWriterClient) TKGConfigReaderWriterReturnsOnCall(i int, result1 tkgconfigreaderwriter.TKGConfigReaderWriter) { - fake.tKGConfigReaderWriterMutex.Lock() - defer fake.tKGConfigReaderWriterMutex.Unlock() - fake.TKGConfigReaderWriterStub = nil - if fake.tKGConfigReaderWriterReturnsOnCall == nil { - fake.tKGConfigReaderWriterReturnsOnCall = make(map[int]struct { - result1 tkgconfigreaderwriter.TKGConfigReaderWriter - }) - } - fake.tKGConfigReaderWriterReturnsOnCall[i] = struct { - result1 tkgconfigreaderwriter.TKGConfigReaderWriter - }{result1} -} - -func (fake *TKGConfigReaderWriterClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.clusterConfigClientMutex.RLock() - defer fake.clusterConfigClientMutex.RUnlock() - fake.tKGConfigReaderWriterMutex.RLock() - defer fake.tKGConfigReaderWriterMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *TKGConfigReaderWriterClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ tkgconfigreaderwriter.Client = new(TKGConfigReaderWriterClient) diff --git a/tkg/fakes/tkgconfigupdaterclient.go b/tkg/fakes/tkgconfigupdaterclient.go deleted file mode 100644 index f44a531e33..0000000000 --- a/tkg/fakes/tkgconfigupdaterclient.go +++ /dev/null @@ -1,1181 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - yaml "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigupdater" -) - -type TKGConfigUpdaterClient struct { - CheckBOMsNeedUpdateStub func() (bool, error) - checkBOMsNeedUpdateMutex sync.RWMutex - checkBOMsNeedUpdateArgsForCall []struct { - } - checkBOMsNeedUpdateReturns struct { - result1 bool - result2 error - } - checkBOMsNeedUpdateReturnsOnCall map[int]struct { - result1 bool - result2 error - } - CheckInfrastructureVersionStub func(string) (string, error) - checkInfrastructureVersionMutex sync.RWMutex - checkInfrastructureVersionArgsForCall []struct { - arg1 string - } - checkInfrastructureVersionReturns struct { - result1 string - result2 error - } - checkInfrastructureVersionReturnsOnCall map[int]struct { - result1 string - result2 error - } - CheckProviderTemplatesNeedUpdateStub func() (bool, error) - checkProviderTemplatesNeedUpdateMutex sync.RWMutex - checkProviderTemplatesNeedUpdateArgsForCall []struct { - } - checkProviderTemplatesNeedUpdateReturns struct { - result1 bool - result2 error - } - checkProviderTemplatesNeedUpdateReturnsOnCall map[int]struct { - result1 bool - result2 error - } - DecodeCredentialsInViperStub func() error - decodeCredentialsInViperMutex sync.RWMutex - decodeCredentialsInViperArgsForCall []struct { - } - decodeCredentialsInViperReturns struct { - result1 error - } - decodeCredentialsInViperReturnsOnCall map[int]struct { - result1 error - } - EnsureBOMFilesStub func(bool) error - ensureBOMFilesMutex sync.RWMutex - ensureBOMFilesArgsForCall []struct { - arg1 bool - } - ensureBOMFilesReturns struct { - result1 error - } - ensureBOMFilesReturnsOnCall map[int]struct { - result1 error - } - EnsureConfigImagesStub func() error - ensureConfigImagesMutex sync.RWMutex - ensureConfigImagesArgsForCall []struct { - } - ensureConfigImagesReturns struct { - result1 error - } - ensureConfigImagesReturnsOnCall map[int]struct { - result1 error - } - EnsureCredEncodingStub func(*yaml.Node) - ensureCredEncodingMutex sync.RWMutex - ensureCredEncodingArgsForCall []struct { - arg1 *yaml.Node - } - EnsureImagesStub func(bool, *yaml.Node) error - ensureImagesMutex sync.RWMutex - ensureImagesArgsForCall []struct { - arg1 bool - arg2 *yaml.Node - } - ensureImagesReturns struct { - result1 error - } - ensureImagesReturnsOnCall map[int]struct { - result1 error - } - EnsureProviderTemplatesStub func() error - ensureProviderTemplatesMutex sync.RWMutex - ensureProviderTemplatesArgsForCall []struct { - } - ensureProviderTemplatesReturns struct { - result1 error - } - ensureProviderTemplatesReturnsOnCall map[int]struct { - result1 error - } - EnsureProvidersInConfigStub func(bool, *yaml.Node) error - ensureProvidersInConfigMutex sync.RWMutex - ensureProvidersInConfigArgsForCall []struct { - arg1 bool - arg2 *yaml.Node - } - ensureProvidersInConfigReturns struct { - result1 error - } - ensureProvidersInConfigReturnsOnCall map[int]struct { - result1 error - } - EnsureTKGCompatibilityFileStub func(bool) error - ensureTKGCompatibilityFileMutex sync.RWMutex - ensureTKGCompatibilityFileArgsForCall []struct { - arg1 bool - } - ensureTKGCompatibilityFileReturns struct { - result1 error - } - ensureTKGCompatibilityFileReturnsOnCall map[int]struct { - result1 error - } - EnsureTKGConfigFileStub func() (string, error) - ensureTKGConfigFileMutex sync.RWMutex - ensureTKGConfigFileArgsForCall []struct { - } - ensureTKGConfigFileReturns struct { - result1 string - result2 error - } - ensureTKGConfigFileReturnsOnCall map[int]struct { - result1 string - result2 error - } - EnsureTemplateFilesStub func() (bool, error) - ensureTemplateFilesMutex sync.RWMutex - ensureTemplateFilesArgsForCall []struct { - } - ensureTemplateFilesReturns struct { - result1 bool - result2 error - } - ensureTemplateFilesReturnsOnCall map[int]struct { - result1 bool - result2 error - } - GetDefaultInfrastructureVersionStub func(string) (string, error) - getDefaultInfrastructureVersionMutex sync.RWMutex - getDefaultInfrastructureVersionArgsForCall []struct { - arg1 string - } - getDefaultInfrastructureVersionReturns struct { - result1 string - result2 error - } - getDefaultInfrastructureVersionReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetPopulatedProvidersChecksumFromFileStub func() (string, error) - getPopulatedProvidersChecksumFromFileMutex sync.RWMutex - getPopulatedProvidersChecksumFromFileArgsForCall []struct { - } - getPopulatedProvidersChecksumFromFileReturns struct { - result1 string - result2 error - } - getPopulatedProvidersChecksumFromFileReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetProvidersChecksumStub func() (string, error) - getProvidersChecksumMutex sync.RWMutex - getProvidersChecksumArgsForCall []struct { - } - getProvidersChecksumReturns struct { - result1 string - result2 error - } - getProvidersChecksumReturnsOnCall map[int]struct { - result1 string - result2 error - } - SetDefaultConfigurationStub func() - setDefaultConfigurationMutex sync.RWMutex - setDefaultConfigurationArgsForCall []struct { - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *TKGConfigUpdaterClient) CheckBOMsNeedUpdate() (bool, error) { - fake.checkBOMsNeedUpdateMutex.Lock() - ret, specificReturn := fake.checkBOMsNeedUpdateReturnsOnCall[len(fake.checkBOMsNeedUpdateArgsForCall)] - fake.checkBOMsNeedUpdateArgsForCall = append(fake.checkBOMsNeedUpdateArgsForCall, struct { - }{}) - stub := fake.CheckBOMsNeedUpdateStub - fakeReturns := fake.checkBOMsNeedUpdateReturns - fake.recordInvocation("CheckBOMsNeedUpdate", []interface{}{}) - fake.checkBOMsNeedUpdateMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigUpdaterClient) CheckBOMsNeedUpdateCallCount() int { - fake.checkBOMsNeedUpdateMutex.RLock() - defer fake.checkBOMsNeedUpdateMutex.RUnlock() - return len(fake.checkBOMsNeedUpdateArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) CheckBOMsNeedUpdateCalls(stub func() (bool, error)) { - fake.checkBOMsNeedUpdateMutex.Lock() - defer fake.checkBOMsNeedUpdateMutex.Unlock() - fake.CheckBOMsNeedUpdateStub = stub -} - -func (fake *TKGConfigUpdaterClient) CheckBOMsNeedUpdateReturns(result1 bool, result2 error) { - fake.checkBOMsNeedUpdateMutex.Lock() - defer fake.checkBOMsNeedUpdateMutex.Unlock() - fake.CheckBOMsNeedUpdateStub = nil - fake.checkBOMsNeedUpdateReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) CheckBOMsNeedUpdateReturnsOnCall(i int, result1 bool, result2 error) { - fake.checkBOMsNeedUpdateMutex.Lock() - defer fake.checkBOMsNeedUpdateMutex.Unlock() - fake.CheckBOMsNeedUpdateStub = nil - if fake.checkBOMsNeedUpdateReturnsOnCall == nil { - fake.checkBOMsNeedUpdateReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.checkBOMsNeedUpdateReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) CheckInfrastructureVersion(arg1 string) (string, error) { - fake.checkInfrastructureVersionMutex.Lock() - ret, specificReturn := fake.checkInfrastructureVersionReturnsOnCall[len(fake.checkInfrastructureVersionArgsForCall)] - fake.checkInfrastructureVersionArgsForCall = append(fake.checkInfrastructureVersionArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.CheckInfrastructureVersionStub - fakeReturns := fake.checkInfrastructureVersionReturns - fake.recordInvocation("CheckInfrastructureVersion", []interface{}{arg1}) - fake.checkInfrastructureVersionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigUpdaterClient) CheckInfrastructureVersionCallCount() int { - fake.checkInfrastructureVersionMutex.RLock() - defer fake.checkInfrastructureVersionMutex.RUnlock() - return len(fake.checkInfrastructureVersionArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) CheckInfrastructureVersionCalls(stub func(string) (string, error)) { - fake.checkInfrastructureVersionMutex.Lock() - defer fake.checkInfrastructureVersionMutex.Unlock() - fake.CheckInfrastructureVersionStub = stub -} - -func (fake *TKGConfigUpdaterClient) CheckInfrastructureVersionArgsForCall(i int) string { - fake.checkInfrastructureVersionMutex.RLock() - defer fake.checkInfrastructureVersionMutex.RUnlock() - argsForCall := fake.checkInfrastructureVersionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigUpdaterClient) CheckInfrastructureVersionReturns(result1 string, result2 error) { - fake.checkInfrastructureVersionMutex.Lock() - defer fake.checkInfrastructureVersionMutex.Unlock() - fake.CheckInfrastructureVersionStub = nil - fake.checkInfrastructureVersionReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) CheckInfrastructureVersionReturnsOnCall(i int, result1 string, result2 error) { - fake.checkInfrastructureVersionMutex.Lock() - defer fake.checkInfrastructureVersionMutex.Unlock() - fake.CheckInfrastructureVersionStub = nil - if fake.checkInfrastructureVersionReturnsOnCall == nil { - fake.checkInfrastructureVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.checkInfrastructureVersionReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) CheckProviderTemplatesNeedUpdate() (bool, error) { - fake.checkProviderTemplatesNeedUpdateMutex.Lock() - ret, specificReturn := fake.checkProviderTemplatesNeedUpdateReturnsOnCall[len(fake.checkProviderTemplatesNeedUpdateArgsForCall)] - fake.checkProviderTemplatesNeedUpdateArgsForCall = append(fake.checkProviderTemplatesNeedUpdateArgsForCall, struct { - }{}) - stub := fake.CheckProviderTemplatesNeedUpdateStub - fakeReturns := fake.checkProviderTemplatesNeedUpdateReturns - fake.recordInvocation("CheckProviderTemplatesNeedUpdate", []interface{}{}) - fake.checkProviderTemplatesNeedUpdateMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigUpdaterClient) CheckProviderTemplatesNeedUpdateCallCount() int { - fake.checkProviderTemplatesNeedUpdateMutex.RLock() - defer fake.checkProviderTemplatesNeedUpdateMutex.RUnlock() - return len(fake.checkProviderTemplatesNeedUpdateArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) CheckProviderTemplatesNeedUpdateCalls(stub func() (bool, error)) { - fake.checkProviderTemplatesNeedUpdateMutex.Lock() - defer fake.checkProviderTemplatesNeedUpdateMutex.Unlock() - fake.CheckProviderTemplatesNeedUpdateStub = stub -} - -func (fake *TKGConfigUpdaterClient) CheckProviderTemplatesNeedUpdateReturns(result1 bool, result2 error) { - fake.checkProviderTemplatesNeedUpdateMutex.Lock() - defer fake.checkProviderTemplatesNeedUpdateMutex.Unlock() - fake.CheckProviderTemplatesNeedUpdateStub = nil - fake.checkProviderTemplatesNeedUpdateReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) CheckProviderTemplatesNeedUpdateReturnsOnCall(i int, result1 bool, result2 error) { - fake.checkProviderTemplatesNeedUpdateMutex.Lock() - defer fake.checkProviderTemplatesNeedUpdateMutex.Unlock() - fake.CheckProviderTemplatesNeedUpdateStub = nil - if fake.checkProviderTemplatesNeedUpdateReturnsOnCall == nil { - fake.checkProviderTemplatesNeedUpdateReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.checkProviderTemplatesNeedUpdateReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) DecodeCredentialsInViper() error { - fake.decodeCredentialsInViperMutex.Lock() - ret, specificReturn := fake.decodeCredentialsInViperReturnsOnCall[len(fake.decodeCredentialsInViperArgsForCall)] - fake.decodeCredentialsInViperArgsForCall = append(fake.decodeCredentialsInViperArgsForCall, struct { - }{}) - stub := fake.DecodeCredentialsInViperStub - fakeReturns := fake.decodeCredentialsInViperReturns - fake.recordInvocation("DecodeCredentialsInViper", []interface{}{}) - fake.decodeCredentialsInViperMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigUpdaterClient) DecodeCredentialsInViperCallCount() int { - fake.decodeCredentialsInViperMutex.RLock() - defer fake.decodeCredentialsInViperMutex.RUnlock() - return len(fake.decodeCredentialsInViperArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) DecodeCredentialsInViperCalls(stub func() error) { - fake.decodeCredentialsInViperMutex.Lock() - defer fake.decodeCredentialsInViperMutex.Unlock() - fake.DecodeCredentialsInViperStub = stub -} - -func (fake *TKGConfigUpdaterClient) DecodeCredentialsInViperReturns(result1 error) { - fake.decodeCredentialsInViperMutex.Lock() - defer fake.decodeCredentialsInViperMutex.Unlock() - fake.DecodeCredentialsInViperStub = nil - fake.decodeCredentialsInViperReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) DecodeCredentialsInViperReturnsOnCall(i int, result1 error) { - fake.decodeCredentialsInViperMutex.Lock() - defer fake.decodeCredentialsInViperMutex.Unlock() - fake.DecodeCredentialsInViperStub = nil - if fake.decodeCredentialsInViperReturnsOnCall == nil { - fake.decodeCredentialsInViperReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.decodeCredentialsInViperReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureBOMFiles(arg1 bool) error { - fake.ensureBOMFilesMutex.Lock() - ret, specificReturn := fake.ensureBOMFilesReturnsOnCall[len(fake.ensureBOMFilesArgsForCall)] - fake.ensureBOMFilesArgsForCall = append(fake.ensureBOMFilesArgsForCall, struct { - arg1 bool - }{arg1}) - stub := fake.EnsureBOMFilesStub - fakeReturns := fake.ensureBOMFilesReturns - fake.recordInvocation("EnsureBOMFiles", []interface{}{arg1}) - fake.ensureBOMFilesMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigUpdaterClient) EnsureBOMFilesCallCount() int { - fake.ensureBOMFilesMutex.RLock() - defer fake.ensureBOMFilesMutex.RUnlock() - return len(fake.ensureBOMFilesArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) EnsureBOMFilesCalls(stub func(bool) error) { - fake.ensureBOMFilesMutex.Lock() - defer fake.ensureBOMFilesMutex.Unlock() - fake.EnsureBOMFilesStub = stub -} - -func (fake *TKGConfigUpdaterClient) EnsureBOMFilesArgsForCall(i int) bool { - fake.ensureBOMFilesMutex.RLock() - defer fake.ensureBOMFilesMutex.RUnlock() - argsForCall := fake.ensureBOMFilesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigUpdaterClient) EnsureBOMFilesReturns(result1 error) { - fake.ensureBOMFilesMutex.Lock() - defer fake.ensureBOMFilesMutex.Unlock() - fake.EnsureBOMFilesStub = nil - fake.ensureBOMFilesReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureBOMFilesReturnsOnCall(i int, result1 error) { - fake.ensureBOMFilesMutex.Lock() - defer fake.ensureBOMFilesMutex.Unlock() - fake.EnsureBOMFilesStub = nil - if fake.ensureBOMFilesReturnsOnCall == nil { - fake.ensureBOMFilesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.ensureBOMFilesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureConfigImages() error { - fake.ensureConfigImagesMutex.Lock() - ret, specificReturn := fake.ensureConfigImagesReturnsOnCall[len(fake.ensureConfigImagesArgsForCall)] - fake.ensureConfigImagesArgsForCall = append(fake.ensureConfigImagesArgsForCall, struct { - }{}) - stub := fake.EnsureConfigImagesStub - fakeReturns := fake.ensureConfigImagesReturns - fake.recordInvocation("EnsureConfigImages", []interface{}{}) - fake.ensureConfigImagesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigUpdaterClient) EnsureConfigImagesCallCount() int { - fake.ensureConfigImagesMutex.RLock() - defer fake.ensureConfigImagesMutex.RUnlock() - return len(fake.ensureConfigImagesArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) EnsureConfigImagesCalls(stub func() error) { - fake.ensureConfigImagesMutex.Lock() - defer fake.ensureConfigImagesMutex.Unlock() - fake.EnsureConfigImagesStub = stub -} - -func (fake *TKGConfigUpdaterClient) EnsureConfigImagesReturns(result1 error) { - fake.ensureConfigImagesMutex.Lock() - defer fake.ensureConfigImagesMutex.Unlock() - fake.EnsureConfigImagesStub = nil - fake.ensureConfigImagesReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureConfigImagesReturnsOnCall(i int, result1 error) { - fake.ensureConfigImagesMutex.Lock() - defer fake.ensureConfigImagesMutex.Unlock() - fake.EnsureConfigImagesStub = nil - if fake.ensureConfigImagesReturnsOnCall == nil { - fake.ensureConfigImagesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.ensureConfigImagesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureCredEncoding(arg1 *yaml.Node) { - fake.ensureCredEncodingMutex.Lock() - fake.ensureCredEncodingArgsForCall = append(fake.ensureCredEncodingArgsForCall, struct { - arg1 *yaml.Node - }{arg1}) - stub := fake.EnsureCredEncodingStub - fake.recordInvocation("EnsureCredEncoding", []interface{}{arg1}) - fake.ensureCredEncodingMutex.Unlock() - if stub != nil { - fake.EnsureCredEncodingStub(arg1) - } -} - -func (fake *TKGConfigUpdaterClient) EnsureCredEncodingCallCount() int { - fake.ensureCredEncodingMutex.RLock() - defer fake.ensureCredEncodingMutex.RUnlock() - return len(fake.ensureCredEncodingArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) EnsureCredEncodingCalls(stub func(*yaml.Node)) { - fake.ensureCredEncodingMutex.Lock() - defer fake.ensureCredEncodingMutex.Unlock() - fake.EnsureCredEncodingStub = stub -} - -func (fake *TKGConfigUpdaterClient) EnsureCredEncodingArgsForCall(i int) *yaml.Node { - fake.ensureCredEncodingMutex.RLock() - defer fake.ensureCredEncodingMutex.RUnlock() - argsForCall := fake.ensureCredEncodingArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigUpdaterClient) EnsureImages(arg1 bool, arg2 *yaml.Node) error { - fake.ensureImagesMutex.Lock() - ret, specificReturn := fake.ensureImagesReturnsOnCall[len(fake.ensureImagesArgsForCall)] - fake.ensureImagesArgsForCall = append(fake.ensureImagesArgsForCall, struct { - arg1 bool - arg2 *yaml.Node - }{arg1, arg2}) - stub := fake.EnsureImagesStub - fakeReturns := fake.ensureImagesReturns - fake.recordInvocation("EnsureImages", []interface{}{arg1, arg2}) - fake.ensureImagesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigUpdaterClient) EnsureImagesCallCount() int { - fake.ensureImagesMutex.RLock() - defer fake.ensureImagesMutex.RUnlock() - return len(fake.ensureImagesArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) EnsureImagesCalls(stub func(bool, *yaml.Node) error) { - fake.ensureImagesMutex.Lock() - defer fake.ensureImagesMutex.Unlock() - fake.EnsureImagesStub = stub -} - -func (fake *TKGConfigUpdaterClient) EnsureImagesArgsForCall(i int) (bool, *yaml.Node) { - fake.ensureImagesMutex.RLock() - defer fake.ensureImagesMutex.RUnlock() - argsForCall := fake.ensureImagesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *TKGConfigUpdaterClient) EnsureImagesReturns(result1 error) { - fake.ensureImagesMutex.Lock() - defer fake.ensureImagesMutex.Unlock() - fake.EnsureImagesStub = nil - fake.ensureImagesReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureImagesReturnsOnCall(i int, result1 error) { - fake.ensureImagesMutex.Lock() - defer fake.ensureImagesMutex.Unlock() - fake.EnsureImagesStub = nil - if fake.ensureImagesReturnsOnCall == nil { - fake.ensureImagesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.ensureImagesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureProviderTemplates() error { - fake.ensureProviderTemplatesMutex.Lock() - ret, specificReturn := fake.ensureProviderTemplatesReturnsOnCall[len(fake.ensureProviderTemplatesArgsForCall)] - fake.ensureProviderTemplatesArgsForCall = append(fake.ensureProviderTemplatesArgsForCall, struct { - }{}) - stub := fake.EnsureProviderTemplatesStub - fakeReturns := fake.ensureProviderTemplatesReturns - fake.recordInvocation("EnsureProviderTemplates", []interface{}{}) - fake.ensureProviderTemplatesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigUpdaterClient) EnsureProviderTemplatesCallCount() int { - fake.ensureProviderTemplatesMutex.RLock() - defer fake.ensureProviderTemplatesMutex.RUnlock() - return len(fake.ensureProviderTemplatesArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) EnsureProviderTemplatesCalls(stub func() error) { - fake.ensureProviderTemplatesMutex.Lock() - defer fake.ensureProviderTemplatesMutex.Unlock() - fake.EnsureProviderTemplatesStub = stub -} - -func (fake *TKGConfigUpdaterClient) EnsureProviderTemplatesReturns(result1 error) { - fake.ensureProviderTemplatesMutex.Lock() - defer fake.ensureProviderTemplatesMutex.Unlock() - fake.EnsureProviderTemplatesStub = nil - fake.ensureProviderTemplatesReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureProviderTemplatesReturnsOnCall(i int, result1 error) { - fake.ensureProviderTemplatesMutex.Lock() - defer fake.ensureProviderTemplatesMutex.Unlock() - fake.EnsureProviderTemplatesStub = nil - if fake.ensureProviderTemplatesReturnsOnCall == nil { - fake.ensureProviderTemplatesReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.ensureProviderTemplatesReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureProvidersInConfig(arg1 bool, arg2 *yaml.Node) error { - fake.ensureProvidersInConfigMutex.Lock() - ret, specificReturn := fake.ensureProvidersInConfigReturnsOnCall[len(fake.ensureProvidersInConfigArgsForCall)] - fake.ensureProvidersInConfigArgsForCall = append(fake.ensureProvidersInConfigArgsForCall, struct { - arg1 bool - arg2 *yaml.Node - }{arg1, arg2}) - stub := fake.EnsureProvidersInConfigStub - fakeReturns := fake.ensureProvidersInConfigReturns - fake.recordInvocation("EnsureProvidersInConfig", []interface{}{arg1, arg2}) - fake.ensureProvidersInConfigMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigUpdaterClient) EnsureProvidersInConfigCallCount() int { - fake.ensureProvidersInConfigMutex.RLock() - defer fake.ensureProvidersInConfigMutex.RUnlock() - return len(fake.ensureProvidersInConfigArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) EnsureProvidersInConfigCalls(stub func(bool, *yaml.Node) error) { - fake.ensureProvidersInConfigMutex.Lock() - defer fake.ensureProvidersInConfigMutex.Unlock() - fake.EnsureProvidersInConfigStub = stub -} - -func (fake *TKGConfigUpdaterClient) EnsureProvidersInConfigArgsForCall(i int) (bool, *yaml.Node) { - fake.ensureProvidersInConfigMutex.RLock() - defer fake.ensureProvidersInConfigMutex.RUnlock() - argsForCall := fake.ensureProvidersInConfigArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *TKGConfigUpdaterClient) EnsureProvidersInConfigReturns(result1 error) { - fake.ensureProvidersInConfigMutex.Lock() - defer fake.ensureProvidersInConfigMutex.Unlock() - fake.EnsureProvidersInConfigStub = nil - fake.ensureProvidersInConfigReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureProvidersInConfigReturnsOnCall(i int, result1 error) { - fake.ensureProvidersInConfigMutex.Lock() - defer fake.ensureProvidersInConfigMutex.Unlock() - fake.EnsureProvidersInConfigStub = nil - if fake.ensureProvidersInConfigReturnsOnCall == nil { - fake.ensureProvidersInConfigReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.ensureProvidersInConfigReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureTKGCompatibilityFile(arg1 bool) error { - fake.ensureTKGCompatibilityFileMutex.Lock() - ret, specificReturn := fake.ensureTKGCompatibilityFileReturnsOnCall[len(fake.ensureTKGCompatibilityFileArgsForCall)] - fake.ensureTKGCompatibilityFileArgsForCall = append(fake.ensureTKGCompatibilityFileArgsForCall, struct { - arg1 bool - }{arg1}) - stub := fake.EnsureTKGCompatibilityFileStub - fakeReturns := fake.ensureTKGCompatibilityFileReturns - fake.recordInvocation("EnsureTKGCompatibilityFile", []interface{}{arg1}) - fake.ensureTKGCompatibilityFileMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TKGConfigUpdaterClient) EnsureTKGCompatibilityFileCallCount() int { - fake.ensureTKGCompatibilityFileMutex.RLock() - defer fake.ensureTKGCompatibilityFileMutex.RUnlock() - return len(fake.ensureTKGCompatibilityFileArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) EnsureTKGCompatibilityFileCalls(stub func(bool) error) { - fake.ensureTKGCompatibilityFileMutex.Lock() - defer fake.ensureTKGCompatibilityFileMutex.Unlock() - fake.EnsureTKGCompatibilityFileStub = stub -} - -func (fake *TKGConfigUpdaterClient) EnsureTKGCompatibilityFileArgsForCall(i int) bool { - fake.ensureTKGCompatibilityFileMutex.RLock() - defer fake.ensureTKGCompatibilityFileMutex.RUnlock() - argsForCall := fake.ensureTKGCompatibilityFileArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigUpdaterClient) EnsureTKGCompatibilityFileReturns(result1 error) { - fake.ensureTKGCompatibilityFileMutex.Lock() - defer fake.ensureTKGCompatibilityFileMutex.Unlock() - fake.EnsureTKGCompatibilityFileStub = nil - fake.ensureTKGCompatibilityFileReturns = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureTKGCompatibilityFileReturnsOnCall(i int, result1 error) { - fake.ensureTKGCompatibilityFileMutex.Lock() - defer fake.ensureTKGCompatibilityFileMutex.Unlock() - fake.EnsureTKGCompatibilityFileStub = nil - if fake.ensureTKGCompatibilityFileReturnsOnCall == nil { - fake.ensureTKGCompatibilityFileReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.ensureTKGCompatibilityFileReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *TKGConfigUpdaterClient) EnsureTKGConfigFile() (string, error) { - fake.ensureTKGConfigFileMutex.Lock() - ret, specificReturn := fake.ensureTKGConfigFileReturnsOnCall[len(fake.ensureTKGConfigFileArgsForCall)] - fake.ensureTKGConfigFileArgsForCall = append(fake.ensureTKGConfigFileArgsForCall, struct { - }{}) - stub := fake.EnsureTKGConfigFileStub - fakeReturns := fake.ensureTKGConfigFileReturns - fake.recordInvocation("EnsureTKGConfigFile", []interface{}{}) - fake.ensureTKGConfigFileMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigUpdaterClient) EnsureTKGConfigFileCallCount() int { - fake.ensureTKGConfigFileMutex.RLock() - defer fake.ensureTKGConfigFileMutex.RUnlock() - return len(fake.ensureTKGConfigFileArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) EnsureTKGConfigFileCalls(stub func() (string, error)) { - fake.ensureTKGConfigFileMutex.Lock() - defer fake.ensureTKGConfigFileMutex.Unlock() - fake.EnsureTKGConfigFileStub = stub -} - -func (fake *TKGConfigUpdaterClient) EnsureTKGConfigFileReturns(result1 string, result2 error) { - fake.ensureTKGConfigFileMutex.Lock() - defer fake.ensureTKGConfigFileMutex.Unlock() - fake.EnsureTKGConfigFileStub = nil - fake.ensureTKGConfigFileReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) EnsureTKGConfigFileReturnsOnCall(i int, result1 string, result2 error) { - fake.ensureTKGConfigFileMutex.Lock() - defer fake.ensureTKGConfigFileMutex.Unlock() - fake.EnsureTKGConfigFileStub = nil - if fake.ensureTKGConfigFileReturnsOnCall == nil { - fake.ensureTKGConfigFileReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.ensureTKGConfigFileReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) EnsureTemplateFiles() (bool, error) { - fake.ensureTemplateFilesMutex.Lock() - ret, specificReturn := fake.ensureTemplateFilesReturnsOnCall[len(fake.ensureTemplateFilesArgsForCall)] - fake.ensureTemplateFilesArgsForCall = append(fake.ensureTemplateFilesArgsForCall, struct { - }{}) - stub := fake.EnsureTemplateFilesStub - fakeReturns := fake.ensureTemplateFilesReturns - fake.recordInvocation("EnsureTemplateFiles", []interface{}{}) - fake.ensureTemplateFilesMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigUpdaterClient) EnsureTemplateFilesCallCount() int { - fake.ensureTemplateFilesMutex.RLock() - defer fake.ensureTemplateFilesMutex.RUnlock() - return len(fake.ensureTemplateFilesArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) EnsureTemplateFilesCalls(stub func() (bool, error)) { - fake.ensureTemplateFilesMutex.Lock() - defer fake.ensureTemplateFilesMutex.Unlock() - fake.EnsureTemplateFilesStub = stub -} - -func (fake *TKGConfigUpdaterClient) EnsureTemplateFilesReturns(result1 bool, result2 error) { - fake.ensureTemplateFilesMutex.Lock() - defer fake.ensureTemplateFilesMutex.Unlock() - fake.EnsureTemplateFilesStub = nil - fake.ensureTemplateFilesReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) EnsureTemplateFilesReturnsOnCall(i int, result1 bool, result2 error) { - fake.ensureTemplateFilesMutex.Lock() - defer fake.ensureTemplateFilesMutex.Unlock() - fake.EnsureTemplateFilesStub = nil - if fake.ensureTemplateFilesReturnsOnCall == nil { - fake.ensureTemplateFilesReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.ensureTemplateFilesReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) GetDefaultInfrastructureVersion(arg1 string) (string, error) { - fake.getDefaultInfrastructureVersionMutex.Lock() - ret, specificReturn := fake.getDefaultInfrastructureVersionReturnsOnCall[len(fake.getDefaultInfrastructureVersionArgsForCall)] - fake.getDefaultInfrastructureVersionArgsForCall = append(fake.getDefaultInfrastructureVersionArgsForCall, struct { - arg1 string - }{arg1}) - stub := fake.GetDefaultInfrastructureVersionStub - fakeReturns := fake.getDefaultInfrastructureVersionReturns - fake.recordInvocation("GetDefaultInfrastructureVersion", []interface{}{arg1}) - fake.getDefaultInfrastructureVersionMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigUpdaterClient) GetDefaultInfrastructureVersionCallCount() int { - fake.getDefaultInfrastructureVersionMutex.RLock() - defer fake.getDefaultInfrastructureVersionMutex.RUnlock() - return len(fake.getDefaultInfrastructureVersionArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) GetDefaultInfrastructureVersionCalls(stub func(string) (string, error)) { - fake.getDefaultInfrastructureVersionMutex.Lock() - defer fake.getDefaultInfrastructureVersionMutex.Unlock() - fake.GetDefaultInfrastructureVersionStub = stub -} - -func (fake *TKGConfigUpdaterClient) GetDefaultInfrastructureVersionArgsForCall(i int) string { - fake.getDefaultInfrastructureVersionMutex.RLock() - defer fake.getDefaultInfrastructureVersionMutex.RUnlock() - argsForCall := fake.getDefaultInfrastructureVersionArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TKGConfigUpdaterClient) GetDefaultInfrastructureVersionReturns(result1 string, result2 error) { - fake.getDefaultInfrastructureVersionMutex.Lock() - defer fake.getDefaultInfrastructureVersionMutex.Unlock() - fake.GetDefaultInfrastructureVersionStub = nil - fake.getDefaultInfrastructureVersionReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) GetDefaultInfrastructureVersionReturnsOnCall(i int, result1 string, result2 error) { - fake.getDefaultInfrastructureVersionMutex.Lock() - defer fake.getDefaultInfrastructureVersionMutex.Unlock() - fake.GetDefaultInfrastructureVersionStub = nil - if fake.getDefaultInfrastructureVersionReturnsOnCall == nil { - fake.getDefaultInfrastructureVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getDefaultInfrastructureVersionReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) GetPopulatedProvidersChecksumFromFile() (string, error) { - fake.getPopulatedProvidersChecksumFromFileMutex.Lock() - ret, specificReturn := fake.getPopulatedProvidersChecksumFromFileReturnsOnCall[len(fake.getPopulatedProvidersChecksumFromFileArgsForCall)] - fake.getPopulatedProvidersChecksumFromFileArgsForCall = append(fake.getPopulatedProvidersChecksumFromFileArgsForCall, struct { - }{}) - stub := fake.GetPopulatedProvidersChecksumFromFileStub - fakeReturns := fake.getPopulatedProvidersChecksumFromFileReturns - fake.recordInvocation("GetPopulatedProvidersChecksumFromFile", []interface{}{}) - fake.getPopulatedProvidersChecksumFromFileMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigUpdaterClient) GetPopulatedProvidersChecksumFromFileCallCount() int { - fake.getPopulatedProvidersChecksumFromFileMutex.RLock() - defer fake.getPopulatedProvidersChecksumFromFileMutex.RUnlock() - return len(fake.getPopulatedProvidersChecksumFromFileArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) GetPopulatedProvidersChecksumFromFileCalls(stub func() (string, error)) { - fake.getPopulatedProvidersChecksumFromFileMutex.Lock() - defer fake.getPopulatedProvidersChecksumFromFileMutex.Unlock() - fake.GetPopulatedProvidersChecksumFromFileStub = stub -} - -func (fake *TKGConfigUpdaterClient) GetPopulatedProvidersChecksumFromFileReturns(result1 string, result2 error) { - fake.getPopulatedProvidersChecksumFromFileMutex.Lock() - defer fake.getPopulatedProvidersChecksumFromFileMutex.Unlock() - fake.GetPopulatedProvidersChecksumFromFileStub = nil - fake.getPopulatedProvidersChecksumFromFileReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) GetPopulatedProvidersChecksumFromFileReturnsOnCall(i int, result1 string, result2 error) { - fake.getPopulatedProvidersChecksumFromFileMutex.Lock() - defer fake.getPopulatedProvidersChecksumFromFileMutex.Unlock() - fake.GetPopulatedProvidersChecksumFromFileStub = nil - if fake.getPopulatedProvidersChecksumFromFileReturnsOnCall == nil { - fake.getPopulatedProvidersChecksumFromFileReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getPopulatedProvidersChecksumFromFileReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) GetProvidersChecksum() (string, error) { - fake.getProvidersChecksumMutex.Lock() - ret, specificReturn := fake.getProvidersChecksumReturnsOnCall[len(fake.getProvidersChecksumArgsForCall)] - fake.getProvidersChecksumArgsForCall = append(fake.getProvidersChecksumArgsForCall, struct { - }{}) - stub := fake.GetProvidersChecksumStub - fakeReturns := fake.getProvidersChecksumReturns - fake.recordInvocation("GetProvidersChecksum", []interface{}{}) - fake.getProvidersChecksumMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TKGConfigUpdaterClient) GetProvidersChecksumCallCount() int { - fake.getProvidersChecksumMutex.RLock() - defer fake.getProvidersChecksumMutex.RUnlock() - return len(fake.getProvidersChecksumArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) GetProvidersChecksumCalls(stub func() (string, error)) { - fake.getProvidersChecksumMutex.Lock() - defer fake.getProvidersChecksumMutex.Unlock() - fake.GetProvidersChecksumStub = stub -} - -func (fake *TKGConfigUpdaterClient) GetProvidersChecksumReturns(result1 string, result2 error) { - fake.getProvidersChecksumMutex.Lock() - defer fake.getProvidersChecksumMutex.Unlock() - fake.GetProvidersChecksumStub = nil - fake.getProvidersChecksumReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) GetProvidersChecksumReturnsOnCall(i int, result1 string, result2 error) { - fake.getProvidersChecksumMutex.Lock() - defer fake.getProvidersChecksumMutex.Unlock() - fake.GetProvidersChecksumStub = nil - if fake.getProvidersChecksumReturnsOnCall == nil { - fake.getProvidersChecksumReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getProvidersChecksumReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *TKGConfigUpdaterClient) SetDefaultConfiguration() { - fake.setDefaultConfigurationMutex.Lock() - fake.setDefaultConfigurationArgsForCall = append(fake.setDefaultConfigurationArgsForCall, struct { - }{}) - stub := fake.SetDefaultConfigurationStub - fake.recordInvocation("SetDefaultConfiguration", []interface{}{}) - fake.setDefaultConfigurationMutex.Unlock() - if stub != nil { - fake.SetDefaultConfigurationStub() - } -} - -func (fake *TKGConfigUpdaterClient) SetDefaultConfigurationCallCount() int { - fake.setDefaultConfigurationMutex.RLock() - defer fake.setDefaultConfigurationMutex.RUnlock() - return len(fake.setDefaultConfigurationArgsForCall) -} - -func (fake *TKGConfigUpdaterClient) SetDefaultConfigurationCalls(stub func()) { - fake.setDefaultConfigurationMutex.Lock() - defer fake.setDefaultConfigurationMutex.Unlock() - fake.SetDefaultConfigurationStub = stub -} - -func (fake *TKGConfigUpdaterClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.checkBOMsNeedUpdateMutex.RLock() - defer fake.checkBOMsNeedUpdateMutex.RUnlock() - fake.checkInfrastructureVersionMutex.RLock() - defer fake.checkInfrastructureVersionMutex.RUnlock() - fake.checkProviderTemplatesNeedUpdateMutex.RLock() - defer fake.checkProviderTemplatesNeedUpdateMutex.RUnlock() - fake.decodeCredentialsInViperMutex.RLock() - defer fake.decodeCredentialsInViperMutex.RUnlock() - fake.ensureBOMFilesMutex.RLock() - defer fake.ensureBOMFilesMutex.RUnlock() - fake.ensureConfigImagesMutex.RLock() - defer fake.ensureConfigImagesMutex.RUnlock() - fake.ensureCredEncodingMutex.RLock() - defer fake.ensureCredEncodingMutex.RUnlock() - fake.ensureImagesMutex.RLock() - defer fake.ensureImagesMutex.RUnlock() - fake.ensureProviderTemplatesMutex.RLock() - defer fake.ensureProviderTemplatesMutex.RUnlock() - fake.ensureProvidersInConfigMutex.RLock() - defer fake.ensureProvidersInConfigMutex.RUnlock() - fake.ensureTKGCompatibilityFileMutex.RLock() - defer fake.ensureTKGCompatibilityFileMutex.RUnlock() - fake.ensureTKGConfigFileMutex.RLock() - defer fake.ensureTKGConfigFileMutex.RUnlock() - fake.ensureTemplateFilesMutex.RLock() - defer fake.ensureTemplateFilesMutex.RUnlock() - fake.getDefaultInfrastructureVersionMutex.RLock() - defer fake.getDefaultInfrastructureVersionMutex.RUnlock() - fake.getPopulatedProvidersChecksumFromFileMutex.RLock() - defer fake.getPopulatedProvidersChecksumFromFileMutex.RUnlock() - fake.getProvidersChecksumMutex.RLock() - defer fake.getProvidersChecksumMutex.RUnlock() - fake.setDefaultConfigurationMutex.RLock() - defer fake.setDefaultConfigurationMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *TKGConfigUpdaterClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ tkgconfigupdater.Client = new(TKGConfigUpdaterClient) diff --git a/tkg/fakes/vcclient.go b/tkg/fakes/vcclient.go deleted file mode 100644 index de11ee7e71..0000000000 --- a/tkg/fakes/vcclient.go +++ /dev/null @@ -1,1819 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "context" - "sync" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -type VCClient struct { - AcquireTicketStub func() (string, error) - acquireTicketMutex sync.RWMutex - acquireTicketArgsForCall []struct { - } - acquireTicketReturns struct { - result1 string - result2 error - } - acquireTicketReturnsOnCall map[int]struct { - result1 string - result2 error - } - CheckUserSessionActiveStub func() (bool, error) - checkUserSessionActiveMutex sync.RWMutex - checkUserSessionActiveArgsForCall []struct { - } - checkUserSessionActiveReturns struct { - result1 bool - result2 error - } - checkUserSessionActiveReturnsOnCall map[int]struct { - result1 bool - result2 error - } - DetectPacificStub func(context.Context) (bool, error) - detectPacificMutex sync.RWMutex - detectPacificArgsForCall []struct { - arg1 context.Context - } - detectPacificReturns struct { - result1 bool - result2 error - } - detectPacificReturnsOnCall map[int]struct { - result1 bool - result2 error - } - FindDataCenterStub func(context.Context, string) (string, error) - findDataCenterMutex sync.RWMutex - findDataCenterArgsForCall []struct { - arg1 context.Context - arg2 string - } - findDataCenterReturns struct { - result1 string - result2 error - } - findDataCenterReturnsOnCall map[int]struct { - result1 string - result2 error - } - FindDatastoreStub func(context.Context, string, string) (string, error) - findDatastoreMutex sync.RWMutex - findDatastoreArgsForCall []struct { - arg1 context.Context - arg2 string - arg3 string - } - findDatastoreReturns struct { - result1 string - result2 error - } - findDatastoreReturnsOnCall map[int]struct { - result1 string - result2 error - } - FindFolderStub func(context.Context, string, string) (string, error) - findFolderMutex sync.RWMutex - findFolderArgsForCall []struct { - arg1 context.Context - arg2 string - arg3 string - } - findFolderReturns struct { - result1 string - result2 error - } - findFolderReturnsOnCall map[int]struct { - result1 string - result2 error - } - FindNetworkStub func(context.Context, string, string) (string, error) - findNetworkMutex sync.RWMutex - findNetworkArgsForCall []struct { - arg1 context.Context - arg2 string - arg3 string - } - findNetworkReturns struct { - result1 string - result2 error - } - findNetworkReturnsOnCall map[int]struct { - result1 string - result2 error - } - FindResourcePoolStub func(context.Context, string, string) (string, error) - findResourcePoolMutex sync.RWMutex - findResourcePoolArgsForCall []struct { - arg1 context.Context - arg2 string - arg3 string - } - findResourcePoolReturns struct { - result1 string - result2 error - } - findResourcePoolReturnsOnCall map[int]struct { - result1 string - result2 error - } - FindVirtualMachineStub func(context.Context, string, string) (string, error) - findVirtualMachineMutex sync.RWMutex - findVirtualMachineArgsForCall []struct { - arg1 context.Context - arg2 string - arg3 string - } - findVirtualMachineReturns struct { - result1 string - result2 error - } - findVirtualMachineReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetAndValidateVirtualMachineTemplateStub func([]string, string, string, string, tkgconfigreaderwriter.TKGConfigReaderWriter) (*types.VSphereVirtualMachine, error) - getAndValidateVirtualMachineTemplateMutex sync.RWMutex - getAndValidateVirtualMachineTemplateArgsForCall []struct { - arg1 []string - arg2 string - arg3 string - arg4 string - arg5 tkgconfigreaderwriter.TKGConfigReaderWriter - } - getAndValidateVirtualMachineTemplateReturns struct { - result1 *types.VSphereVirtualMachine - result2 error - } - getAndValidateVirtualMachineTemplateReturnsOnCall map[int]struct { - result1 *types.VSphereVirtualMachine - result2 error - } - GetComputeResourcesStub func(context.Context, string) ([]*models.VSphereManagementObject, error) - getComputeResourcesMutex sync.RWMutex - getComputeResourcesArgsForCall []struct { - arg1 context.Context - arg2 string - } - getComputeResourcesReturns struct { - result1 []*models.VSphereManagementObject - result2 error - } - getComputeResourcesReturnsOnCall map[int]struct { - result1 []*models.VSphereManagementObject - result2 error - } - GetDataCenterMOIDStub func(context.Context, string) (string, error) - getDataCenterMOIDMutex sync.RWMutex - getDataCenterMOIDArgsForCall []struct { - arg1 context.Context - arg2 string - } - getDataCenterMOIDReturns struct { - result1 string - result2 error - } - getDataCenterMOIDReturnsOnCall map[int]struct { - result1 string - result2 error - } - GetDatacentersStub func(context.Context) ([]*models.VSphereDatacenter, error) - getDatacentersMutex sync.RWMutex - getDatacentersArgsForCall []struct { - arg1 context.Context - } - getDatacentersReturns struct { - result1 []*models.VSphereDatacenter - result2 error - } - getDatacentersReturnsOnCall map[int]struct { - result1 []*models.VSphereDatacenter - result2 error - } - GetDatastoresStub func(context.Context, string) ([]*models.VSphereDatastore, error) - getDatastoresMutex sync.RWMutex - getDatastoresArgsForCall []struct { - arg1 context.Context - arg2 string - } - getDatastoresReturns struct { - result1 []*models.VSphereDatastore - result2 error - } - getDatastoresReturnsOnCall map[int]struct { - result1 []*models.VSphereDatastore - result2 error - } - GetFoldersStub func(context.Context, string) ([]*models.VSphereFolder, error) - getFoldersMutex sync.RWMutex - getFoldersArgsForCall []struct { - arg1 context.Context - arg2 string - } - getFoldersReturns struct { - result1 []*models.VSphereFolder - result2 error - } - getFoldersReturnsOnCall map[int]struct { - result1 []*models.VSphereFolder - result2 error - } - GetNetworksStub func(context.Context, string) ([]*models.VSphereNetwork, error) - getNetworksMutex sync.RWMutex - getNetworksArgsForCall []struct { - arg1 context.Context - arg2 string - } - getNetworksReturns struct { - result1 []*models.VSphereNetwork - result2 error - } - getNetworksReturnsOnCall map[int]struct { - result1 []*models.VSphereNetwork - result2 error - } - GetPathStub func(context.Context, string) (string, []*models.VSphereManagementObject, error) - getPathMutex sync.RWMutex - getPathArgsForCall []struct { - arg1 context.Context - arg2 string - } - getPathReturns struct { - result1 string - result2 []*models.VSphereManagementObject - result3 error - } - getPathReturnsOnCall map[int]struct { - result1 string - result2 []*models.VSphereManagementObject - result3 error - } - GetResourcePoolsStub func(context.Context, string) ([]*models.VSphereResourcePool, error) - getResourcePoolsMutex sync.RWMutex - getResourcePoolsArgsForCall []struct { - arg1 context.Context - arg2 string - } - getResourcePoolsReturns struct { - result1 []*models.VSphereResourcePool - result2 error - } - getResourcePoolsReturnsOnCall map[int]struct { - result1 []*models.VSphereResourcePool - result2 error - } - GetVSphereVersionStub func() (string, string, error) - getVSphereVersionMutex sync.RWMutex - getVSphereVersionArgsForCall []struct { - } - getVSphereVersionReturns struct { - result1 string - result2 string - result3 error - } - getVSphereVersionReturnsOnCall map[int]struct { - result1 string - result2 string - result3 error - } - GetVirtualMachineImagesStub func(context.Context, string) ([]*types.VSphereVirtualMachine, error) - getVirtualMachineImagesMutex sync.RWMutex - getVirtualMachineImagesArgsForCall []struct { - arg1 context.Context - arg2 string - } - getVirtualMachineImagesReturns struct { - result1 []*types.VSphereVirtualMachine - result2 error - } - getVirtualMachineImagesReturnsOnCall map[int]struct { - result1 []*types.VSphereVirtualMachine - result2 error - } - GetVirtualMachinesStub func(context.Context, string) ([]*models.VSphereVirtualMachine, error) - getVirtualMachinesMutex sync.RWMutex - getVirtualMachinesArgsForCall []struct { - arg1 context.Context - arg2 string - } - getVirtualMachinesReturns struct { - result1 []*models.VSphereVirtualMachine - result2 error - } - getVirtualMachinesReturnsOnCall map[int]struct { - result1 []*models.VSphereVirtualMachine - result2 error - } - LoginStub func(context.Context, string, string) (string, error) - loginMutex sync.RWMutex - loginArgsForCall []struct { - arg1 context.Context - arg2 string - arg3 string - } - loginReturns struct { - result1 string - result2 error - } - loginReturnsOnCall map[int]struct { - result1 string - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *VCClient) AcquireTicket() (string, error) { - fake.acquireTicketMutex.Lock() - ret, specificReturn := fake.acquireTicketReturnsOnCall[len(fake.acquireTicketArgsForCall)] - fake.acquireTicketArgsForCall = append(fake.acquireTicketArgsForCall, struct { - }{}) - stub := fake.AcquireTicketStub - fakeReturns := fake.acquireTicketReturns - fake.recordInvocation("AcquireTicket", []interface{}{}) - fake.acquireTicketMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) AcquireTicketCallCount() int { - fake.acquireTicketMutex.RLock() - defer fake.acquireTicketMutex.RUnlock() - return len(fake.acquireTicketArgsForCall) -} - -func (fake *VCClient) AcquireTicketCalls(stub func() (string, error)) { - fake.acquireTicketMutex.Lock() - defer fake.acquireTicketMutex.Unlock() - fake.AcquireTicketStub = stub -} - -func (fake *VCClient) AcquireTicketReturns(result1 string, result2 error) { - fake.acquireTicketMutex.Lock() - defer fake.acquireTicketMutex.Unlock() - fake.AcquireTicketStub = nil - fake.acquireTicketReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) AcquireTicketReturnsOnCall(i int, result1 string, result2 error) { - fake.acquireTicketMutex.Lock() - defer fake.acquireTicketMutex.Unlock() - fake.AcquireTicketStub = nil - if fake.acquireTicketReturnsOnCall == nil { - fake.acquireTicketReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.acquireTicketReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) CheckUserSessionActive() (bool, error) { - fake.checkUserSessionActiveMutex.Lock() - ret, specificReturn := fake.checkUserSessionActiveReturnsOnCall[len(fake.checkUserSessionActiveArgsForCall)] - fake.checkUserSessionActiveArgsForCall = append(fake.checkUserSessionActiveArgsForCall, struct { - }{}) - stub := fake.CheckUserSessionActiveStub - fakeReturns := fake.checkUserSessionActiveReturns - fake.recordInvocation("CheckUserSessionActive", []interface{}{}) - fake.checkUserSessionActiveMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) CheckUserSessionActiveCallCount() int { - fake.checkUserSessionActiveMutex.RLock() - defer fake.checkUserSessionActiveMutex.RUnlock() - return len(fake.checkUserSessionActiveArgsForCall) -} - -func (fake *VCClient) CheckUserSessionActiveCalls(stub func() (bool, error)) { - fake.checkUserSessionActiveMutex.Lock() - defer fake.checkUserSessionActiveMutex.Unlock() - fake.CheckUserSessionActiveStub = stub -} - -func (fake *VCClient) CheckUserSessionActiveReturns(result1 bool, result2 error) { - fake.checkUserSessionActiveMutex.Lock() - defer fake.checkUserSessionActiveMutex.Unlock() - fake.CheckUserSessionActiveStub = nil - fake.checkUserSessionActiveReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *VCClient) CheckUserSessionActiveReturnsOnCall(i int, result1 bool, result2 error) { - fake.checkUserSessionActiveMutex.Lock() - defer fake.checkUserSessionActiveMutex.Unlock() - fake.CheckUserSessionActiveStub = nil - if fake.checkUserSessionActiveReturnsOnCall == nil { - fake.checkUserSessionActiveReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.checkUserSessionActiveReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *VCClient) DetectPacific(arg1 context.Context) (bool, error) { - fake.detectPacificMutex.Lock() - ret, specificReturn := fake.detectPacificReturnsOnCall[len(fake.detectPacificArgsForCall)] - fake.detectPacificArgsForCall = append(fake.detectPacificArgsForCall, struct { - arg1 context.Context - }{arg1}) - stub := fake.DetectPacificStub - fakeReturns := fake.detectPacificReturns - fake.recordInvocation("DetectPacific", []interface{}{arg1}) - fake.detectPacificMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) DetectPacificCallCount() int { - fake.detectPacificMutex.RLock() - defer fake.detectPacificMutex.RUnlock() - return len(fake.detectPacificArgsForCall) -} - -func (fake *VCClient) DetectPacificCalls(stub func(context.Context) (bool, error)) { - fake.detectPacificMutex.Lock() - defer fake.detectPacificMutex.Unlock() - fake.DetectPacificStub = stub -} - -func (fake *VCClient) DetectPacificArgsForCall(i int) context.Context { - fake.detectPacificMutex.RLock() - defer fake.detectPacificMutex.RUnlock() - argsForCall := fake.detectPacificArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *VCClient) DetectPacificReturns(result1 bool, result2 error) { - fake.detectPacificMutex.Lock() - defer fake.detectPacificMutex.Unlock() - fake.DetectPacificStub = nil - fake.detectPacificReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *VCClient) DetectPacificReturnsOnCall(i int, result1 bool, result2 error) { - fake.detectPacificMutex.Lock() - defer fake.detectPacificMutex.Unlock() - fake.DetectPacificStub = nil - if fake.detectPacificReturnsOnCall == nil { - fake.detectPacificReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.detectPacificReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindDataCenter(arg1 context.Context, arg2 string) (string, error) { - fake.findDataCenterMutex.Lock() - ret, specificReturn := fake.findDataCenterReturnsOnCall[len(fake.findDataCenterArgsForCall)] - fake.findDataCenterArgsForCall = append(fake.findDataCenterArgsForCall, struct { - arg1 context.Context - arg2 string - }{arg1, arg2}) - stub := fake.FindDataCenterStub - fakeReturns := fake.findDataCenterReturns - fake.recordInvocation("FindDataCenter", []interface{}{arg1, arg2}) - fake.findDataCenterMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) FindDataCenterCallCount() int { - fake.findDataCenterMutex.RLock() - defer fake.findDataCenterMutex.RUnlock() - return len(fake.findDataCenterArgsForCall) -} - -func (fake *VCClient) FindDataCenterCalls(stub func(context.Context, string) (string, error)) { - fake.findDataCenterMutex.Lock() - defer fake.findDataCenterMutex.Unlock() - fake.FindDataCenterStub = stub -} - -func (fake *VCClient) FindDataCenterArgsForCall(i int) (context.Context, string) { - fake.findDataCenterMutex.RLock() - defer fake.findDataCenterMutex.RUnlock() - argsForCall := fake.findDataCenterArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *VCClient) FindDataCenterReturns(result1 string, result2 error) { - fake.findDataCenterMutex.Lock() - defer fake.findDataCenterMutex.Unlock() - fake.FindDataCenterStub = nil - fake.findDataCenterReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindDataCenterReturnsOnCall(i int, result1 string, result2 error) { - fake.findDataCenterMutex.Lock() - defer fake.findDataCenterMutex.Unlock() - fake.FindDataCenterStub = nil - if fake.findDataCenterReturnsOnCall == nil { - fake.findDataCenterReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.findDataCenterReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindDatastore(arg1 context.Context, arg2 string, arg3 string) (string, error) { - fake.findDatastoreMutex.Lock() - ret, specificReturn := fake.findDatastoreReturnsOnCall[len(fake.findDatastoreArgsForCall)] - fake.findDatastoreArgsForCall = append(fake.findDatastoreArgsForCall, struct { - arg1 context.Context - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.FindDatastoreStub - fakeReturns := fake.findDatastoreReturns - fake.recordInvocation("FindDatastore", []interface{}{arg1, arg2, arg3}) - fake.findDatastoreMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) FindDatastoreCallCount() int { - fake.findDatastoreMutex.RLock() - defer fake.findDatastoreMutex.RUnlock() - return len(fake.findDatastoreArgsForCall) -} - -func (fake *VCClient) FindDatastoreCalls(stub func(context.Context, string, string) (string, error)) { - fake.findDatastoreMutex.Lock() - defer fake.findDatastoreMutex.Unlock() - fake.FindDatastoreStub = stub -} - -func (fake *VCClient) FindDatastoreArgsForCall(i int) (context.Context, string, string) { - fake.findDatastoreMutex.RLock() - defer fake.findDatastoreMutex.RUnlock() - argsForCall := fake.findDatastoreArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *VCClient) FindDatastoreReturns(result1 string, result2 error) { - fake.findDatastoreMutex.Lock() - defer fake.findDatastoreMutex.Unlock() - fake.FindDatastoreStub = nil - fake.findDatastoreReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindDatastoreReturnsOnCall(i int, result1 string, result2 error) { - fake.findDatastoreMutex.Lock() - defer fake.findDatastoreMutex.Unlock() - fake.FindDatastoreStub = nil - if fake.findDatastoreReturnsOnCall == nil { - fake.findDatastoreReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.findDatastoreReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindFolder(arg1 context.Context, arg2 string, arg3 string) (string, error) { - fake.findFolderMutex.Lock() - ret, specificReturn := fake.findFolderReturnsOnCall[len(fake.findFolderArgsForCall)] - fake.findFolderArgsForCall = append(fake.findFolderArgsForCall, struct { - arg1 context.Context - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.FindFolderStub - fakeReturns := fake.findFolderReturns - fake.recordInvocation("FindFolder", []interface{}{arg1, arg2, arg3}) - fake.findFolderMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) FindFolderCallCount() int { - fake.findFolderMutex.RLock() - defer fake.findFolderMutex.RUnlock() - return len(fake.findFolderArgsForCall) -} - -func (fake *VCClient) FindFolderCalls(stub func(context.Context, string, string) (string, error)) { - fake.findFolderMutex.Lock() - defer fake.findFolderMutex.Unlock() - fake.FindFolderStub = stub -} - -func (fake *VCClient) FindFolderArgsForCall(i int) (context.Context, string, string) { - fake.findFolderMutex.RLock() - defer fake.findFolderMutex.RUnlock() - argsForCall := fake.findFolderArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *VCClient) FindFolderReturns(result1 string, result2 error) { - fake.findFolderMutex.Lock() - defer fake.findFolderMutex.Unlock() - fake.FindFolderStub = nil - fake.findFolderReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindFolderReturnsOnCall(i int, result1 string, result2 error) { - fake.findFolderMutex.Lock() - defer fake.findFolderMutex.Unlock() - fake.FindFolderStub = nil - if fake.findFolderReturnsOnCall == nil { - fake.findFolderReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.findFolderReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindNetwork(arg1 context.Context, arg2 string, arg3 string) (string, error) { - fake.findNetworkMutex.Lock() - ret, specificReturn := fake.findNetworkReturnsOnCall[len(fake.findNetworkArgsForCall)] - fake.findNetworkArgsForCall = append(fake.findNetworkArgsForCall, struct { - arg1 context.Context - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.FindNetworkStub - fakeReturns := fake.findNetworkReturns - fake.recordInvocation("FindNetwork", []interface{}{arg1, arg2, arg3}) - fake.findNetworkMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) FindNetworkCallCount() int { - fake.findNetworkMutex.RLock() - defer fake.findNetworkMutex.RUnlock() - return len(fake.findNetworkArgsForCall) -} - -func (fake *VCClient) FindNetworkCalls(stub func(context.Context, string, string) (string, error)) { - fake.findNetworkMutex.Lock() - defer fake.findNetworkMutex.Unlock() - fake.FindNetworkStub = stub -} - -func (fake *VCClient) FindNetworkArgsForCall(i int) (context.Context, string, string) { - fake.findNetworkMutex.RLock() - defer fake.findNetworkMutex.RUnlock() - argsForCall := fake.findNetworkArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *VCClient) FindNetworkReturns(result1 string, result2 error) { - fake.findNetworkMutex.Lock() - defer fake.findNetworkMutex.Unlock() - fake.FindNetworkStub = nil - fake.findNetworkReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindNetworkReturnsOnCall(i int, result1 string, result2 error) { - fake.findNetworkMutex.Lock() - defer fake.findNetworkMutex.Unlock() - fake.FindNetworkStub = nil - if fake.findNetworkReturnsOnCall == nil { - fake.findNetworkReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.findNetworkReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindResourcePool(arg1 context.Context, arg2 string, arg3 string) (string, error) { - fake.findResourcePoolMutex.Lock() - ret, specificReturn := fake.findResourcePoolReturnsOnCall[len(fake.findResourcePoolArgsForCall)] - fake.findResourcePoolArgsForCall = append(fake.findResourcePoolArgsForCall, struct { - arg1 context.Context - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.FindResourcePoolStub - fakeReturns := fake.findResourcePoolReturns - fake.recordInvocation("FindResourcePool", []interface{}{arg1, arg2, arg3}) - fake.findResourcePoolMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) FindResourcePoolCallCount() int { - fake.findResourcePoolMutex.RLock() - defer fake.findResourcePoolMutex.RUnlock() - return len(fake.findResourcePoolArgsForCall) -} - -func (fake *VCClient) FindResourcePoolCalls(stub func(context.Context, string, string) (string, error)) { - fake.findResourcePoolMutex.Lock() - defer fake.findResourcePoolMutex.Unlock() - fake.FindResourcePoolStub = stub -} - -func (fake *VCClient) FindResourcePoolArgsForCall(i int) (context.Context, string, string) { - fake.findResourcePoolMutex.RLock() - defer fake.findResourcePoolMutex.RUnlock() - argsForCall := fake.findResourcePoolArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *VCClient) FindResourcePoolReturns(result1 string, result2 error) { - fake.findResourcePoolMutex.Lock() - defer fake.findResourcePoolMutex.Unlock() - fake.FindResourcePoolStub = nil - fake.findResourcePoolReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindResourcePoolReturnsOnCall(i int, result1 string, result2 error) { - fake.findResourcePoolMutex.Lock() - defer fake.findResourcePoolMutex.Unlock() - fake.FindResourcePoolStub = nil - if fake.findResourcePoolReturnsOnCall == nil { - fake.findResourcePoolReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.findResourcePoolReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindVirtualMachine(arg1 context.Context, arg2 string, arg3 string) (string, error) { - fake.findVirtualMachineMutex.Lock() - ret, specificReturn := fake.findVirtualMachineReturnsOnCall[len(fake.findVirtualMachineArgsForCall)] - fake.findVirtualMachineArgsForCall = append(fake.findVirtualMachineArgsForCall, struct { - arg1 context.Context - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.FindVirtualMachineStub - fakeReturns := fake.findVirtualMachineReturns - fake.recordInvocation("FindVirtualMachine", []interface{}{arg1, arg2, arg3}) - fake.findVirtualMachineMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) FindVirtualMachineCallCount() int { - fake.findVirtualMachineMutex.RLock() - defer fake.findVirtualMachineMutex.RUnlock() - return len(fake.findVirtualMachineArgsForCall) -} - -func (fake *VCClient) FindVirtualMachineCalls(stub func(context.Context, string, string) (string, error)) { - fake.findVirtualMachineMutex.Lock() - defer fake.findVirtualMachineMutex.Unlock() - fake.FindVirtualMachineStub = stub -} - -func (fake *VCClient) FindVirtualMachineArgsForCall(i int) (context.Context, string, string) { - fake.findVirtualMachineMutex.RLock() - defer fake.findVirtualMachineMutex.RUnlock() - argsForCall := fake.findVirtualMachineArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *VCClient) FindVirtualMachineReturns(result1 string, result2 error) { - fake.findVirtualMachineMutex.Lock() - defer fake.findVirtualMachineMutex.Unlock() - fake.FindVirtualMachineStub = nil - fake.findVirtualMachineReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) FindVirtualMachineReturnsOnCall(i int, result1 string, result2 error) { - fake.findVirtualMachineMutex.Lock() - defer fake.findVirtualMachineMutex.Unlock() - fake.FindVirtualMachineStub = nil - if fake.findVirtualMachineReturnsOnCall == nil { - fake.findVirtualMachineReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.findVirtualMachineReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetAndValidateVirtualMachineTemplate(arg1 []string, arg2 string, arg3 string, arg4 string, arg5 tkgconfigreaderwriter.TKGConfigReaderWriter) (*types.VSphereVirtualMachine, error) { - var arg1Copy []string - if arg1 != nil { - arg1Copy = make([]string, len(arg1)) - copy(arg1Copy, arg1) - } - fake.getAndValidateVirtualMachineTemplateMutex.Lock() - ret, specificReturn := fake.getAndValidateVirtualMachineTemplateReturnsOnCall[len(fake.getAndValidateVirtualMachineTemplateArgsForCall)] - fake.getAndValidateVirtualMachineTemplateArgsForCall = append(fake.getAndValidateVirtualMachineTemplateArgsForCall, struct { - arg1 []string - arg2 string - arg3 string - arg4 string - arg5 tkgconfigreaderwriter.TKGConfigReaderWriter - }{arg1Copy, arg2, arg3, arg4, arg5}) - stub := fake.GetAndValidateVirtualMachineTemplateStub - fakeReturns := fake.getAndValidateVirtualMachineTemplateReturns - fake.recordInvocation("GetAndValidateVirtualMachineTemplate", []interface{}{arg1Copy, arg2, arg3, arg4, arg5}) - fake.getAndValidateVirtualMachineTemplateMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4, arg5) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) GetAndValidateVirtualMachineTemplateCallCount() int { - fake.getAndValidateVirtualMachineTemplateMutex.RLock() - defer fake.getAndValidateVirtualMachineTemplateMutex.RUnlock() - return len(fake.getAndValidateVirtualMachineTemplateArgsForCall) -} - -func (fake *VCClient) GetAndValidateVirtualMachineTemplateCalls(stub func([]string, string, string, string, tkgconfigreaderwriter.TKGConfigReaderWriter) (*types.VSphereVirtualMachine, error)) { - fake.getAndValidateVirtualMachineTemplateMutex.Lock() - defer fake.getAndValidateVirtualMachineTemplateMutex.Unlock() - fake.GetAndValidateVirtualMachineTemplateStub = stub -} - -func (fake *VCClient) GetAndValidateVirtualMachineTemplateArgsForCall(i int) ([]string, string, string, string, tkgconfigreaderwriter.TKGConfigReaderWriter) { - fake.getAndValidateVirtualMachineTemplateMutex.RLock() - defer fake.getAndValidateVirtualMachineTemplateMutex.RUnlock() - argsForCall := fake.getAndValidateVirtualMachineTemplateArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4, argsForCall.arg5 -} - -func (fake *VCClient) GetAndValidateVirtualMachineTemplateReturns(result1 *types.VSphereVirtualMachine, result2 error) { - fake.getAndValidateVirtualMachineTemplateMutex.Lock() - defer fake.getAndValidateVirtualMachineTemplateMutex.Unlock() - fake.GetAndValidateVirtualMachineTemplateStub = nil - fake.getAndValidateVirtualMachineTemplateReturns = struct { - result1 *types.VSphereVirtualMachine - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetAndValidateVirtualMachineTemplateReturnsOnCall(i int, result1 *types.VSphereVirtualMachine, result2 error) { - fake.getAndValidateVirtualMachineTemplateMutex.Lock() - defer fake.getAndValidateVirtualMachineTemplateMutex.Unlock() - fake.GetAndValidateVirtualMachineTemplateStub = nil - if fake.getAndValidateVirtualMachineTemplateReturnsOnCall == nil { - fake.getAndValidateVirtualMachineTemplateReturnsOnCall = make(map[int]struct { - result1 *types.VSphereVirtualMachine - result2 error - }) - } - fake.getAndValidateVirtualMachineTemplateReturnsOnCall[i] = struct { - result1 *types.VSphereVirtualMachine - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetComputeResources(arg1 context.Context, arg2 string) ([]*models.VSphereManagementObject, error) { - fake.getComputeResourcesMutex.Lock() - ret, specificReturn := fake.getComputeResourcesReturnsOnCall[len(fake.getComputeResourcesArgsForCall)] - fake.getComputeResourcesArgsForCall = append(fake.getComputeResourcesArgsForCall, struct { - arg1 context.Context - arg2 string - }{arg1, arg2}) - stub := fake.GetComputeResourcesStub - fakeReturns := fake.getComputeResourcesReturns - fake.recordInvocation("GetComputeResources", []interface{}{arg1, arg2}) - fake.getComputeResourcesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) GetComputeResourcesCallCount() int { - fake.getComputeResourcesMutex.RLock() - defer fake.getComputeResourcesMutex.RUnlock() - return len(fake.getComputeResourcesArgsForCall) -} - -func (fake *VCClient) GetComputeResourcesCalls(stub func(context.Context, string) ([]*models.VSphereManagementObject, error)) { - fake.getComputeResourcesMutex.Lock() - defer fake.getComputeResourcesMutex.Unlock() - fake.GetComputeResourcesStub = stub -} - -func (fake *VCClient) GetComputeResourcesArgsForCall(i int) (context.Context, string) { - fake.getComputeResourcesMutex.RLock() - defer fake.getComputeResourcesMutex.RUnlock() - argsForCall := fake.getComputeResourcesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *VCClient) GetComputeResourcesReturns(result1 []*models.VSphereManagementObject, result2 error) { - fake.getComputeResourcesMutex.Lock() - defer fake.getComputeResourcesMutex.Unlock() - fake.GetComputeResourcesStub = nil - fake.getComputeResourcesReturns = struct { - result1 []*models.VSphereManagementObject - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetComputeResourcesReturnsOnCall(i int, result1 []*models.VSphereManagementObject, result2 error) { - fake.getComputeResourcesMutex.Lock() - defer fake.getComputeResourcesMutex.Unlock() - fake.GetComputeResourcesStub = nil - if fake.getComputeResourcesReturnsOnCall == nil { - fake.getComputeResourcesReturnsOnCall = make(map[int]struct { - result1 []*models.VSphereManagementObject - result2 error - }) - } - fake.getComputeResourcesReturnsOnCall[i] = struct { - result1 []*models.VSphereManagementObject - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetDataCenterMOID(arg1 context.Context, arg2 string) (string, error) { - fake.getDataCenterMOIDMutex.Lock() - ret, specificReturn := fake.getDataCenterMOIDReturnsOnCall[len(fake.getDataCenterMOIDArgsForCall)] - fake.getDataCenterMOIDArgsForCall = append(fake.getDataCenterMOIDArgsForCall, struct { - arg1 context.Context - arg2 string - }{arg1, arg2}) - stub := fake.GetDataCenterMOIDStub - fakeReturns := fake.getDataCenterMOIDReturns - fake.recordInvocation("GetDataCenterMOID", []interface{}{arg1, arg2}) - fake.getDataCenterMOIDMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) GetDataCenterMOIDCallCount() int { - fake.getDataCenterMOIDMutex.RLock() - defer fake.getDataCenterMOIDMutex.RUnlock() - return len(fake.getDataCenterMOIDArgsForCall) -} - -func (fake *VCClient) GetDataCenterMOIDCalls(stub func(context.Context, string) (string, error)) { - fake.getDataCenterMOIDMutex.Lock() - defer fake.getDataCenterMOIDMutex.Unlock() - fake.GetDataCenterMOIDStub = stub -} - -func (fake *VCClient) GetDataCenterMOIDArgsForCall(i int) (context.Context, string) { - fake.getDataCenterMOIDMutex.RLock() - defer fake.getDataCenterMOIDMutex.RUnlock() - argsForCall := fake.getDataCenterMOIDArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *VCClient) GetDataCenterMOIDReturns(result1 string, result2 error) { - fake.getDataCenterMOIDMutex.Lock() - defer fake.getDataCenterMOIDMutex.Unlock() - fake.GetDataCenterMOIDStub = nil - fake.getDataCenterMOIDReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetDataCenterMOIDReturnsOnCall(i int, result1 string, result2 error) { - fake.getDataCenterMOIDMutex.Lock() - defer fake.getDataCenterMOIDMutex.Unlock() - fake.GetDataCenterMOIDStub = nil - if fake.getDataCenterMOIDReturnsOnCall == nil { - fake.getDataCenterMOIDReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.getDataCenterMOIDReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetDatacenters(arg1 context.Context) ([]*models.VSphereDatacenter, error) { - fake.getDatacentersMutex.Lock() - ret, specificReturn := fake.getDatacentersReturnsOnCall[len(fake.getDatacentersArgsForCall)] - fake.getDatacentersArgsForCall = append(fake.getDatacentersArgsForCall, struct { - arg1 context.Context - }{arg1}) - stub := fake.GetDatacentersStub - fakeReturns := fake.getDatacentersReturns - fake.recordInvocation("GetDatacenters", []interface{}{arg1}) - fake.getDatacentersMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) GetDatacentersCallCount() int { - fake.getDatacentersMutex.RLock() - defer fake.getDatacentersMutex.RUnlock() - return len(fake.getDatacentersArgsForCall) -} - -func (fake *VCClient) GetDatacentersCalls(stub func(context.Context) ([]*models.VSphereDatacenter, error)) { - fake.getDatacentersMutex.Lock() - defer fake.getDatacentersMutex.Unlock() - fake.GetDatacentersStub = stub -} - -func (fake *VCClient) GetDatacentersArgsForCall(i int) context.Context { - fake.getDatacentersMutex.RLock() - defer fake.getDatacentersMutex.RUnlock() - argsForCall := fake.getDatacentersArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *VCClient) GetDatacentersReturns(result1 []*models.VSphereDatacenter, result2 error) { - fake.getDatacentersMutex.Lock() - defer fake.getDatacentersMutex.Unlock() - fake.GetDatacentersStub = nil - fake.getDatacentersReturns = struct { - result1 []*models.VSphereDatacenter - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetDatacentersReturnsOnCall(i int, result1 []*models.VSphereDatacenter, result2 error) { - fake.getDatacentersMutex.Lock() - defer fake.getDatacentersMutex.Unlock() - fake.GetDatacentersStub = nil - if fake.getDatacentersReturnsOnCall == nil { - fake.getDatacentersReturnsOnCall = make(map[int]struct { - result1 []*models.VSphereDatacenter - result2 error - }) - } - fake.getDatacentersReturnsOnCall[i] = struct { - result1 []*models.VSphereDatacenter - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetDatastores(arg1 context.Context, arg2 string) ([]*models.VSphereDatastore, error) { - fake.getDatastoresMutex.Lock() - ret, specificReturn := fake.getDatastoresReturnsOnCall[len(fake.getDatastoresArgsForCall)] - fake.getDatastoresArgsForCall = append(fake.getDatastoresArgsForCall, struct { - arg1 context.Context - arg2 string - }{arg1, arg2}) - stub := fake.GetDatastoresStub - fakeReturns := fake.getDatastoresReturns - fake.recordInvocation("GetDatastores", []interface{}{arg1, arg2}) - fake.getDatastoresMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) GetDatastoresCallCount() int { - fake.getDatastoresMutex.RLock() - defer fake.getDatastoresMutex.RUnlock() - return len(fake.getDatastoresArgsForCall) -} - -func (fake *VCClient) GetDatastoresCalls(stub func(context.Context, string) ([]*models.VSphereDatastore, error)) { - fake.getDatastoresMutex.Lock() - defer fake.getDatastoresMutex.Unlock() - fake.GetDatastoresStub = stub -} - -func (fake *VCClient) GetDatastoresArgsForCall(i int) (context.Context, string) { - fake.getDatastoresMutex.RLock() - defer fake.getDatastoresMutex.RUnlock() - argsForCall := fake.getDatastoresArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *VCClient) GetDatastoresReturns(result1 []*models.VSphereDatastore, result2 error) { - fake.getDatastoresMutex.Lock() - defer fake.getDatastoresMutex.Unlock() - fake.GetDatastoresStub = nil - fake.getDatastoresReturns = struct { - result1 []*models.VSphereDatastore - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetDatastoresReturnsOnCall(i int, result1 []*models.VSphereDatastore, result2 error) { - fake.getDatastoresMutex.Lock() - defer fake.getDatastoresMutex.Unlock() - fake.GetDatastoresStub = nil - if fake.getDatastoresReturnsOnCall == nil { - fake.getDatastoresReturnsOnCall = make(map[int]struct { - result1 []*models.VSphereDatastore - result2 error - }) - } - fake.getDatastoresReturnsOnCall[i] = struct { - result1 []*models.VSphereDatastore - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetFolders(arg1 context.Context, arg2 string) ([]*models.VSphereFolder, error) { - fake.getFoldersMutex.Lock() - ret, specificReturn := fake.getFoldersReturnsOnCall[len(fake.getFoldersArgsForCall)] - fake.getFoldersArgsForCall = append(fake.getFoldersArgsForCall, struct { - arg1 context.Context - arg2 string - }{arg1, arg2}) - stub := fake.GetFoldersStub - fakeReturns := fake.getFoldersReturns - fake.recordInvocation("GetFolders", []interface{}{arg1, arg2}) - fake.getFoldersMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) GetFoldersCallCount() int { - fake.getFoldersMutex.RLock() - defer fake.getFoldersMutex.RUnlock() - return len(fake.getFoldersArgsForCall) -} - -func (fake *VCClient) GetFoldersCalls(stub func(context.Context, string) ([]*models.VSphereFolder, error)) { - fake.getFoldersMutex.Lock() - defer fake.getFoldersMutex.Unlock() - fake.GetFoldersStub = stub -} - -func (fake *VCClient) GetFoldersArgsForCall(i int) (context.Context, string) { - fake.getFoldersMutex.RLock() - defer fake.getFoldersMutex.RUnlock() - argsForCall := fake.getFoldersArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *VCClient) GetFoldersReturns(result1 []*models.VSphereFolder, result2 error) { - fake.getFoldersMutex.Lock() - defer fake.getFoldersMutex.Unlock() - fake.GetFoldersStub = nil - fake.getFoldersReturns = struct { - result1 []*models.VSphereFolder - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetFoldersReturnsOnCall(i int, result1 []*models.VSphereFolder, result2 error) { - fake.getFoldersMutex.Lock() - defer fake.getFoldersMutex.Unlock() - fake.GetFoldersStub = nil - if fake.getFoldersReturnsOnCall == nil { - fake.getFoldersReturnsOnCall = make(map[int]struct { - result1 []*models.VSphereFolder - result2 error - }) - } - fake.getFoldersReturnsOnCall[i] = struct { - result1 []*models.VSphereFolder - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetNetworks(arg1 context.Context, arg2 string) ([]*models.VSphereNetwork, error) { - fake.getNetworksMutex.Lock() - ret, specificReturn := fake.getNetworksReturnsOnCall[len(fake.getNetworksArgsForCall)] - fake.getNetworksArgsForCall = append(fake.getNetworksArgsForCall, struct { - arg1 context.Context - arg2 string - }{arg1, arg2}) - stub := fake.GetNetworksStub - fakeReturns := fake.getNetworksReturns - fake.recordInvocation("GetNetworks", []interface{}{arg1, arg2}) - fake.getNetworksMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) GetNetworksCallCount() int { - fake.getNetworksMutex.RLock() - defer fake.getNetworksMutex.RUnlock() - return len(fake.getNetworksArgsForCall) -} - -func (fake *VCClient) GetNetworksCalls(stub func(context.Context, string) ([]*models.VSphereNetwork, error)) { - fake.getNetworksMutex.Lock() - defer fake.getNetworksMutex.Unlock() - fake.GetNetworksStub = stub -} - -func (fake *VCClient) GetNetworksArgsForCall(i int) (context.Context, string) { - fake.getNetworksMutex.RLock() - defer fake.getNetworksMutex.RUnlock() - argsForCall := fake.getNetworksArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *VCClient) GetNetworksReturns(result1 []*models.VSphereNetwork, result2 error) { - fake.getNetworksMutex.Lock() - defer fake.getNetworksMutex.Unlock() - fake.GetNetworksStub = nil - fake.getNetworksReturns = struct { - result1 []*models.VSphereNetwork - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetNetworksReturnsOnCall(i int, result1 []*models.VSphereNetwork, result2 error) { - fake.getNetworksMutex.Lock() - defer fake.getNetworksMutex.Unlock() - fake.GetNetworksStub = nil - if fake.getNetworksReturnsOnCall == nil { - fake.getNetworksReturnsOnCall = make(map[int]struct { - result1 []*models.VSphereNetwork - result2 error - }) - } - fake.getNetworksReturnsOnCall[i] = struct { - result1 []*models.VSphereNetwork - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetPath(arg1 context.Context, arg2 string) (string, []*models.VSphereManagementObject, error) { - fake.getPathMutex.Lock() - ret, specificReturn := fake.getPathReturnsOnCall[len(fake.getPathArgsForCall)] - fake.getPathArgsForCall = append(fake.getPathArgsForCall, struct { - arg1 context.Context - arg2 string - }{arg1, arg2}) - stub := fake.GetPathStub - fakeReturns := fake.getPathReturns - fake.recordInvocation("GetPath", []interface{}{arg1, arg2}) - fake.getPathMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *VCClient) GetPathCallCount() int { - fake.getPathMutex.RLock() - defer fake.getPathMutex.RUnlock() - return len(fake.getPathArgsForCall) -} - -func (fake *VCClient) GetPathCalls(stub func(context.Context, string) (string, []*models.VSphereManagementObject, error)) { - fake.getPathMutex.Lock() - defer fake.getPathMutex.Unlock() - fake.GetPathStub = stub -} - -func (fake *VCClient) GetPathArgsForCall(i int) (context.Context, string) { - fake.getPathMutex.RLock() - defer fake.getPathMutex.RUnlock() - argsForCall := fake.getPathArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *VCClient) GetPathReturns(result1 string, result2 []*models.VSphereManagementObject, result3 error) { - fake.getPathMutex.Lock() - defer fake.getPathMutex.Unlock() - fake.GetPathStub = nil - fake.getPathReturns = struct { - result1 string - result2 []*models.VSphereManagementObject - result3 error - }{result1, result2, result3} -} - -func (fake *VCClient) GetPathReturnsOnCall(i int, result1 string, result2 []*models.VSphereManagementObject, result3 error) { - fake.getPathMutex.Lock() - defer fake.getPathMutex.Unlock() - fake.GetPathStub = nil - if fake.getPathReturnsOnCall == nil { - fake.getPathReturnsOnCall = make(map[int]struct { - result1 string - result2 []*models.VSphereManagementObject - result3 error - }) - } - fake.getPathReturnsOnCall[i] = struct { - result1 string - result2 []*models.VSphereManagementObject - result3 error - }{result1, result2, result3} -} - -func (fake *VCClient) GetResourcePools(arg1 context.Context, arg2 string) ([]*models.VSphereResourcePool, error) { - fake.getResourcePoolsMutex.Lock() - ret, specificReturn := fake.getResourcePoolsReturnsOnCall[len(fake.getResourcePoolsArgsForCall)] - fake.getResourcePoolsArgsForCall = append(fake.getResourcePoolsArgsForCall, struct { - arg1 context.Context - arg2 string - }{arg1, arg2}) - stub := fake.GetResourcePoolsStub - fakeReturns := fake.getResourcePoolsReturns - fake.recordInvocation("GetResourcePools", []interface{}{arg1, arg2}) - fake.getResourcePoolsMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) GetResourcePoolsCallCount() int { - fake.getResourcePoolsMutex.RLock() - defer fake.getResourcePoolsMutex.RUnlock() - return len(fake.getResourcePoolsArgsForCall) -} - -func (fake *VCClient) GetResourcePoolsCalls(stub func(context.Context, string) ([]*models.VSphereResourcePool, error)) { - fake.getResourcePoolsMutex.Lock() - defer fake.getResourcePoolsMutex.Unlock() - fake.GetResourcePoolsStub = stub -} - -func (fake *VCClient) GetResourcePoolsArgsForCall(i int) (context.Context, string) { - fake.getResourcePoolsMutex.RLock() - defer fake.getResourcePoolsMutex.RUnlock() - argsForCall := fake.getResourcePoolsArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *VCClient) GetResourcePoolsReturns(result1 []*models.VSphereResourcePool, result2 error) { - fake.getResourcePoolsMutex.Lock() - defer fake.getResourcePoolsMutex.Unlock() - fake.GetResourcePoolsStub = nil - fake.getResourcePoolsReturns = struct { - result1 []*models.VSphereResourcePool - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetResourcePoolsReturnsOnCall(i int, result1 []*models.VSphereResourcePool, result2 error) { - fake.getResourcePoolsMutex.Lock() - defer fake.getResourcePoolsMutex.Unlock() - fake.GetResourcePoolsStub = nil - if fake.getResourcePoolsReturnsOnCall == nil { - fake.getResourcePoolsReturnsOnCall = make(map[int]struct { - result1 []*models.VSphereResourcePool - result2 error - }) - } - fake.getResourcePoolsReturnsOnCall[i] = struct { - result1 []*models.VSphereResourcePool - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetVSphereVersion() (string, string, error) { - fake.getVSphereVersionMutex.Lock() - ret, specificReturn := fake.getVSphereVersionReturnsOnCall[len(fake.getVSphereVersionArgsForCall)] - fake.getVSphereVersionArgsForCall = append(fake.getVSphereVersionArgsForCall, struct { - }{}) - stub := fake.GetVSphereVersionStub - fakeReturns := fake.getVSphereVersionReturns - fake.recordInvocation("GetVSphereVersion", []interface{}{}) - fake.getVSphereVersionMutex.Unlock() - if stub != nil { - return stub() - } - if specificReturn { - return ret.result1, ret.result2, ret.result3 - } - return fakeReturns.result1, fakeReturns.result2, fakeReturns.result3 -} - -func (fake *VCClient) GetVSphereVersionCallCount() int { - fake.getVSphereVersionMutex.RLock() - defer fake.getVSphereVersionMutex.RUnlock() - return len(fake.getVSphereVersionArgsForCall) -} - -func (fake *VCClient) GetVSphereVersionCalls(stub func() (string, string, error)) { - fake.getVSphereVersionMutex.Lock() - defer fake.getVSphereVersionMutex.Unlock() - fake.GetVSphereVersionStub = stub -} - -func (fake *VCClient) GetVSphereVersionReturns(result1 string, result2 string, result3 error) { - fake.getVSphereVersionMutex.Lock() - defer fake.getVSphereVersionMutex.Unlock() - fake.GetVSphereVersionStub = nil - fake.getVSphereVersionReturns = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *VCClient) GetVSphereVersionReturnsOnCall(i int, result1 string, result2 string, result3 error) { - fake.getVSphereVersionMutex.Lock() - defer fake.getVSphereVersionMutex.Unlock() - fake.GetVSphereVersionStub = nil - if fake.getVSphereVersionReturnsOnCall == nil { - fake.getVSphereVersionReturnsOnCall = make(map[int]struct { - result1 string - result2 string - result3 error - }) - } - fake.getVSphereVersionReturnsOnCall[i] = struct { - result1 string - result2 string - result3 error - }{result1, result2, result3} -} - -func (fake *VCClient) GetVirtualMachineImages(arg1 context.Context, arg2 string) ([]*types.VSphereVirtualMachine, error) { - fake.getVirtualMachineImagesMutex.Lock() - ret, specificReturn := fake.getVirtualMachineImagesReturnsOnCall[len(fake.getVirtualMachineImagesArgsForCall)] - fake.getVirtualMachineImagesArgsForCall = append(fake.getVirtualMachineImagesArgsForCall, struct { - arg1 context.Context - arg2 string - }{arg1, arg2}) - stub := fake.GetVirtualMachineImagesStub - fakeReturns := fake.getVirtualMachineImagesReturns - fake.recordInvocation("GetVirtualMachineImages", []interface{}{arg1, arg2}) - fake.getVirtualMachineImagesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) GetVirtualMachineImagesCallCount() int { - fake.getVirtualMachineImagesMutex.RLock() - defer fake.getVirtualMachineImagesMutex.RUnlock() - return len(fake.getVirtualMachineImagesArgsForCall) -} - -func (fake *VCClient) GetVirtualMachineImagesCalls(stub func(context.Context, string) ([]*types.VSphereVirtualMachine, error)) { - fake.getVirtualMachineImagesMutex.Lock() - defer fake.getVirtualMachineImagesMutex.Unlock() - fake.GetVirtualMachineImagesStub = stub -} - -func (fake *VCClient) GetVirtualMachineImagesArgsForCall(i int) (context.Context, string) { - fake.getVirtualMachineImagesMutex.RLock() - defer fake.getVirtualMachineImagesMutex.RUnlock() - argsForCall := fake.getVirtualMachineImagesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *VCClient) GetVirtualMachineImagesReturns(result1 []*types.VSphereVirtualMachine, result2 error) { - fake.getVirtualMachineImagesMutex.Lock() - defer fake.getVirtualMachineImagesMutex.Unlock() - fake.GetVirtualMachineImagesStub = nil - fake.getVirtualMachineImagesReturns = struct { - result1 []*types.VSphereVirtualMachine - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetVirtualMachineImagesReturnsOnCall(i int, result1 []*types.VSphereVirtualMachine, result2 error) { - fake.getVirtualMachineImagesMutex.Lock() - defer fake.getVirtualMachineImagesMutex.Unlock() - fake.GetVirtualMachineImagesStub = nil - if fake.getVirtualMachineImagesReturnsOnCall == nil { - fake.getVirtualMachineImagesReturnsOnCall = make(map[int]struct { - result1 []*types.VSphereVirtualMachine - result2 error - }) - } - fake.getVirtualMachineImagesReturnsOnCall[i] = struct { - result1 []*types.VSphereVirtualMachine - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetVirtualMachines(arg1 context.Context, arg2 string) ([]*models.VSphereVirtualMachine, error) { - fake.getVirtualMachinesMutex.Lock() - ret, specificReturn := fake.getVirtualMachinesReturnsOnCall[len(fake.getVirtualMachinesArgsForCall)] - fake.getVirtualMachinesArgsForCall = append(fake.getVirtualMachinesArgsForCall, struct { - arg1 context.Context - arg2 string - }{arg1, arg2}) - stub := fake.GetVirtualMachinesStub - fakeReturns := fake.getVirtualMachinesReturns - fake.recordInvocation("GetVirtualMachines", []interface{}{arg1, arg2}) - fake.getVirtualMachinesMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) GetVirtualMachinesCallCount() int { - fake.getVirtualMachinesMutex.RLock() - defer fake.getVirtualMachinesMutex.RUnlock() - return len(fake.getVirtualMachinesArgsForCall) -} - -func (fake *VCClient) GetVirtualMachinesCalls(stub func(context.Context, string) ([]*models.VSphereVirtualMachine, error)) { - fake.getVirtualMachinesMutex.Lock() - defer fake.getVirtualMachinesMutex.Unlock() - fake.GetVirtualMachinesStub = stub -} - -func (fake *VCClient) GetVirtualMachinesArgsForCall(i int) (context.Context, string) { - fake.getVirtualMachinesMutex.RLock() - defer fake.getVirtualMachinesMutex.RUnlock() - argsForCall := fake.getVirtualMachinesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *VCClient) GetVirtualMachinesReturns(result1 []*models.VSphereVirtualMachine, result2 error) { - fake.getVirtualMachinesMutex.Lock() - defer fake.getVirtualMachinesMutex.Unlock() - fake.GetVirtualMachinesStub = nil - fake.getVirtualMachinesReturns = struct { - result1 []*models.VSphereVirtualMachine - result2 error - }{result1, result2} -} - -func (fake *VCClient) GetVirtualMachinesReturnsOnCall(i int, result1 []*models.VSphereVirtualMachine, result2 error) { - fake.getVirtualMachinesMutex.Lock() - defer fake.getVirtualMachinesMutex.Unlock() - fake.GetVirtualMachinesStub = nil - if fake.getVirtualMachinesReturnsOnCall == nil { - fake.getVirtualMachinesReturnsOnCall = make(map[int]struct { - result1 []*models.VSphereVirtualMachine - result2 error - }) - } - fake.getVirtualMachinesReturnsOnCall[i] = struct { - result1 []*models.VSphereVirtualMachine - result2 error - }{result1, result2} -} - -func (fake *VCClient) Login(arg1 context.Context, arg2 string, arg3 string) (string, error) { - fake.loginMutex.Lock() - ret, specificReturn := fake.loginReturnsOnCall[len(fake.loginArgsForCall)] - fake.loginArgsForCall = append(fake.loginArgsForCall, struct { - arg1 context.Context - arg2 string - arg3 string - }{arg1, arg2, arg3}) - stub := fake.LoginStub - fakeReturns := fake.loginReturns - fake.recordInvocation("Login", []interface{}{arg1, arg2, arg3}) - fake.loginMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VCClient) LoginCallCount() int { - fake.loginMutex.RLock() - defer fake.loginMutex.RUnlock() - return len(fake.loginArgsForCall) -} - -func (fake *VCClient) LoginCalls(stub func(context.Context, string, string) (string, error)) { - fake.loginMutex.Lock() - defer fake.loginMutex.Unlock() - fake.LoginStub = stub -} - -func (fake *VCClient) LoginArgsForCall(i int) (context.Context, string, string) { - fake.loginMutex.RLock() - defer fake.loginMutex.RUnlock() - argsForCall := fake.loginArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *VCClient) LoginReturns(result1 string, result2 error) { - fake.loginMutex.Lock() - defer fake.loginMutex.Unlock() - fake.LoginStub = nil - fake.loginReturns = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) LoginReturnsOnCall(i int, result1 string, result2 error) { - fake.loginMutex.Lock() - defer fake.loginMutex.Unlock() - fake.LoginStub = nil - if fake.loginReturnsOnCall == nil { - fake.loginReturnsOnCall = make(map[int]struct { - result1 string - result2 error - }) - } - fake.loginReturnsOnCall[i] = struct { - result1 string - result2 error - }{result1, result2} -} - -func (fake *VCClient) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.acquireTicketMutex.RLock() - defer fake.acquireTicketMutex.RUnlock() - fake.checkUserSessionActiveMutex.RLock() - defer fake.checkUserSessionActiveMutex.RUnlock() - fake.detectPacificMutex.RLock() - defer fake.detectPacificMutex.RUnlock() - fake.findDataCenterMutex.RLock() - defer fake.findDataCenterMutex.RUnlock() - fake.findDatastoreMutex.RLock() - defer fake.findDatastoreMutex.RUnlock() - fake.findFolderMutex.RLock() - defer fake.findFolderMutex.RUnlock() - fake.findNetworkMutex.RLock() - defer fake.findNetworkMutex.RUnlock() - fake.findResourcePoolMutex.RLock() - defer fake.findResourcePoolMutex.RUnlock() - fake.findVirtualMachineMutex.RLock() - defer fake.findVirtualMachineMutex.RUnlock() - fake.getAndValidateVirtualMachineTemplateMutex.RLock() - defer fake.getAndValidateVirtualMachineTemplateMutex.RUnlock() - fake.getComputeResourcesMutex.RLock() - defer fake.getComputeResourcesMutex.RUnlock() - fake.getDataCenterMOIDMutex.RLock() - defer fake.getDataCenterMOIDMutex.RUnlock() - fake.getDatacentersMutex.RLock() - defer fake.getDatacentersMutex.RUnlock() - fake.getDatastoresMutex.RLock() - defer fake.getDatastoresMutex.RUnlock() - fake.getFoldersMutex.RLock() - defer fake.getFoldersMutex.RUnlock() - fake.getNetworksMutex.RLock() - defer fake.getNetworksMutex.RUnlock() - fake.getPathMutex.RLock() - defer fake.getPathMutex.RUnlock() - fake.getResourcePoolsMutex.RLock() - defer fake.getResourcePoolsMutex.RUnlock() - fake.getVSphereVersionMutex.RLock() - defer fake.getVSphereVersionMutex.RUnlock() - fake.getVirtualMachineImagesMutex.RLock() - defer fake.getVirtualMachineImagesMutex.RUnlock() - fake.getVirtualMachinesMutex.RLock() - defer fake.getVirtualMachinesMutex.RUnlock() - fake.loginMutex.RLock() - defer fake.loginMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *VCClient) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ vc.Client = new(VCClient) diff --git a/tkg/fakes/vcclientfactory.go b/tkg/fakes/vcclientfactory.go deleted file mode 100644 index ee7de5a815..0000000000 --- a/tkg/fakes/vcclientfactory.go +++ /dev/null @@ -1,121 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "net/url" - "sync" - - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -type VcClientFactory struct { - NewClientStub func(*url.URL, string, bool) (vc.Client, error) - newClientMutex sync.RWMutex - newClientArgsForCall []struct { - arg1 *url.URL - arg2 string - arg3 bool - } - newClientReturns struct { - result1 vc.Client - result2 error - } - newClientReturnsOnCall map[int]struct { - result1 vc.Client - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *VcClientFactory) NewClient(arg1 *url.URL, arg2 string, arg3 bool) (vc.Client, error) { - fake.newClientMutex.Lock() - ret, specificReturn := fake.newClientReturnsOnCall[len(fake.newClientArgsForCall)] - fake.newClientArgsForCall = append(fake.newClientArgsForCall, struct { - arg1 *url.URL - arg2 string - arg3 bool - }{arg1, arg2, arg3}) - stub := fake.NewClientStub - fakeReturns := fake.newClientReturns - fake.recordInvocation("NewClient", []interface{}{arg1, arg2, arg3}) - fake.newClientMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *VcClientFactory) NewClientCallCount() int { - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - return len(fake.newClientArgsForCall) -} - -func (fake *VcClientFactory) NewClientCalls(stub func(*url.URL, string, bool) (vc.Client, error)) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = stub -} - -func (fake *VcClientFactory) NewClientArgsForCall(i int) (*url.URL, string, bool) { - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - argsForCall := fake.newClientArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *VcClientFactory) NewClientReturns(result1 vc.Client, result2 error) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = nil - fake.newClientReturns = struct { - result1 vc.Client - result2 error - }{result1, result2} -} - -func (fake *VcClientFactory) NewClientReturnsOnCall(i int, result1 vc.Client, result2 error) { - fake.newClientMutex.Lock() - defer fake.newClientMutex.Unlock() - fake.NewClientStub = nil - if fake.newClientReturnsOnCall == nil { - fake.newClientReturnsOnCall = make(map[int]struct { - result1 vc.Client - result2 error - }) - } - fake.newClientReturnsOnCall[i] = struct { - result1 vc.Client - result2 error - }{result1, result2} -} - -func (fake *VcClientFactory) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.newClientMutex.RLock() - defer fake.newClientMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *VcClientFactory) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ vc.VcClientFactory = new(VcClientFactory) diff --git a/tkg/features/client.go b/tkg/features/client.go deleted file mode 100644 index b401e28f1f..0000000000 --- a/tkg/features/client.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package features - -import ( - "encoding/json" - "io" - "os" - "path/filepath" - "strings" - - "github.com/pkg/errors" -) - -const ( - defaultConfigFile = "features.json" -) - -type client struct { - featureFlagConfigPath string -} - -// New creates new features client, defaults config file path to ~/.tkg/features.yaml -func New(featureFlagsConfigFolder, featureFlagsConfigFile string) (Client, error) { - if featureFlagsConfigFile == "" { - featureFlagsConfigFile = defaultConfigFile - } - if featureFlagsConfigFolder == "" { - return nil, errors.New("featureFlagsConfigFolder connot be empty") - } - return &client{ - featureFlagConfigPath: filepath.Join(featureFlagsConfigFolder, featureFlagsConfigFile), - }, nil -} - -// Write feature flags, overwrites config file if it already exists -func (c *client) WriteFeatureFlags(featureFlags map[string]string) error { - featureFlagsList := make(map[string]string) - for feature, value := range featureFlags { - featureFlagsList[strings.TrimSpace(feature)] = value - } - jsonString, err := json.Marshal(featureFlagsList) - if err != nil { - return errors.Wrap(err, "failed to parse the feature flags as valid json") - } - file, err := os.Create(c.featureFlagConfigPath) - if err != nil { - return errors.Wrap(err, "failed to create feature flag file") - } - defer file.Close() - _, err = file.WriteString(string(jsonString)) - if err != nil { - return errors.Wrap(err, "failed to write to feature flag file") - } - return nil -} - -// List all feature flags -func (c *client) GetFeatureFlags() (map[string]string, error) { - jsonFile, err := os.Open(c.featureFlagConfigPath) - if err != nil { - return nil, errors.Wrap(err, "failed to open feature flag file") - } - defer jsonFile.Close() - byteValue, err := io.ReadAll(jsonFile) - if err != nil { - return nil, errors.Wrap(err, "failed to read feature flag file") - } - result := make(map[string]string) - err = json.Unmarshal(byteValue, &result) - if err != nil { - return nil, errors.Wrap(err, "failed to unmarshal feature flag json data") - } - return result, nil -} - -func (c *client) IsFeatureFlagEnabled(featureName string) (bool, error) { - featureFlags, err := c.GetFeatureFlags() - if err != nil { - return false, err - } - for feature := range featureFlags { - if feature == featureName { - return true, nil - } - } - return false, nil -} - -func (c *client) GetFeatureFlag(featureName string) (string, error) { - featureFlags, err := c.GetFeatureFlags() - if err != nil { - return "", err - } - for feature, v := range featureFlags { - if feature == featureName { - return v, nil - } - } - return "", errors.Errorf("feature flag %s not set", featureName) -} diff --git a/tkg/features/client_test.go b/tkg/features/client_test.go deleted file mode 100644 index 6879563ffd..0000000000 --- a/tkg/features/client_test.go +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package features - -import ( - "os" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestClusterClient(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Feature Flag Client Suite") -} - -var _ = Describe("Feature flag client", func() { - var ( - featureClient Client - featureFlags map[string]string - err error - isEnabled bool - flags map[string]string - filePath string - flagName string - ) - - const ( - validFeaturesJSONFilePath = "../fakes/config/features/features_valid.json" - invalidFeaturesJSONFilePath = "../fakes/config/features/features_invalid.json" - duplicateFeaturesJSONFilePath = "../fakes/config/features/features_duplicate.json" - featuresWritesJSONFilePath = "../fakes/config/features/features_write.json" - featureOne = "feature1" - featureTwo = "feature2" - ) - Describe("Constructor", func() { - Context("New is given a config folder, but not a config file", func() { - It("Should create a client with the default config file name", func() { - tempDir := os.TempDir() - client, err := New(tempDir, "") - Expect(err).ToNot(HaveOccurred()) - Expect(client).ToNot(BeNil()) - }) - }) - Context("New is not given a config folder", func() { - It("Should error creating a new client", func() { - client, err := New("", "") - Expect(err).To(HaveOccurred()) - Expect(err).To(MatchError("featureFlagsConfigFolder connot be empty")) - Expect(client).To(BeNil()) - }) - }) - }) - Describe("GetFeatureFlags", func() { - JustBeforeEach(func() { - featureClient = &client{ - featureFlagConfigPath: filePath, - } - featureFlags, err = featureClient.GetFeatureFlags() - }) - - Context("with valid json", func() { - BeforeEach(func() { - filePath = validFeaturesJSONFilePath - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - It("should contain feature flags", func() { - Expect(len(featureFlags)).To(Equal(2)) - Expect(featureFlags[featureOne]).To(Equal("true")) - Expect(featureFlags[featureTwo]).To(Equal("http://google.com")) - }) - }) - Context("with invalid json", func() { - BeforeEach(func() { - filePath = invalidFeaturesJSONFilePath - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to unmarshal feature flag json data")) - }) - }) - Context("with duplicate json", func() { - BeforeEach(func() { - filePath = duplicateFeaturesJSONFilePath - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - It("should contain no duplicate flag", func() { - Expect(len(featureFlags)).To(Equal(1)) - }) - }) - }) - - Describe("IsFeatureFlagEnabled", func() { - JustBeforeEach(func() { - featureClient = &client{ - featureFlagConfigPath: filePath, - } - isEnabled, err = featureClient.IsFeatureFlagEnabled(flagName) - }) - - Context("with valid json", func() { - BeforeEach(func() { - filePath = validFeaturesJSONFilePath - flagName = featureOne - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - It("should contain feature flags", func() { - Expect(isEnabled).To(BeTrue()) - }) - }) - Context("with invalid json", func() { - BeforeEach(func() { - filePath = invalidFeaturesJSONFilePath - flagName = featureOne - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to unmarshal feature flag json data")) - }) - }) - Context("with duplicate json", func() { - BeforeEach(func() { - filePath = duplicateFeaturesJSONFilePath - flagName = featureOne - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - It("should return second of duplicates", func() { - Expect(isEnabled).To(BeTrue()) - }) - }) - Context("when flag doesn't exist in file", func() { - BeforeEach(func() { - filePath = validFeaturesJSONFilePath - flagName = "feature_does_not_exist" - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - It("should return false", func() { - Expect(isEnabled).To(BeFalse()) - }) - }) - }) - - Describe("WriteFeatureFlags", func() { - JustBeforeEach(func() { - featureClient = &client{ - featureFlagConfigPath: filePath, - } - err = featureClient.WriteFeatureFlags(flags) - featureFlags, _ = featureClient.GetFeatureFlags() - }) - - Context("with valid json", func() { - BeforeEach(func() { - filePath = featuresWritesJSONFilePath - flags = map[string]string{ - featureOne: "true", - featureTwo: "false", - } - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - It("should contain feature flags", func() { - Expect(len(featureFlags)).To(Equal(2)) - }) - }) - Context("with data in map", func() { - BeforeEach(func() { - filePath = featuresWritesJSONFilePath - flags = map[string]string{ - featureOne: "http://google.com", - featureTwo: "antrea", - } - }) - It("should not return error", func() { - Expect(err).To(Not(HaveOccurred())) - }) - It("should contain data", func() { - Expect(len(featureFlags)).To(Equal(2)) - Expect(featureFlags[featureOne]).To(Equal("http://google.com")) - Expect(featureFlags[featureTwo]).To(Equal("antrea")) - }) - }) - Context("with empty map", func() { - BeforeEach(func() { - filePath = featuresWritesJSONFilePath - flags = map[string]string{} - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - It("should contain nothing", func() { - Expect(len(featureFlags)).To(Equal(0)) - }) - }) - Context("with data already in file", func() { - BeforeEach(func() { - filePath = "../fakes/config/features/features_overwrite.json" - flags = map[string]string{ - featureOne: "true", - featureTwo: "false", - } - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - It("should overwrite existing data", func() { - Expect(len(featureFlags)).To(Equal(2)) - Expect(featureFlags["overwriteMe"]).To(Not(BeNil())) - }) - }) - Context("when file doesn't exist", func() { - BeforeEach(func() { - filePath = "../fakes/config/features/features_new.json" - flags = map[string]string{ - featureOne: "true", - featureTwo: "false", - } - }) - It("should not return error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - It("should contain data", func() { - Expect(len(featureFlags)).To(Equal(2)) - }) - AfterEach(func() { - os.Remove("../fakes/config/features/features_new.json") - }) - }) - }) -}) diff --git a/tkg/features/featuregate/doc.go b/tkg/features/featuregate/doc.go deleted file mode 100644 index 89a1ede95b..0000000000 --- a/tkg/features/featuregate/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package featuregate provides utilities for features and feature gates. -// Copied over from "github.com/vmware-tanzu/tanzu-framework/pkg/v1/sdk/features/featuregate" -package featuregate diff --git a/tkg/features/featuregate/featuregate.go b/tkg/features/featuregate/featuregate.go deleted file mode 100644 index 1a2b5c8322..0000000000 --- a/tkg/features/featuregate/featuregate.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package featuregate - -import ( - "context" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/sets" - "sigs.k8s.io/controller-runtime/pkg/client" - - configv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/config/v1alpha1" - featureutil "github.com/vmware-tanzu/tanzu-framework/tkg/features/util" -) - -const ( - // TKGSystemFeatureGate is the FeatureGate resource for gating TKG features. - TKGSystemFeatureGate = "tkg-system" -) - -// TKGNamespaceSelector is a label selector which matches TKG-related namespaces. -var TKGNamespaceSelector = metav1.LabelSelector{ - MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"tkg-system-public"}}, - }, -} - -// ComputeFeatureStates takes a FeatureGate spec and computes the actual state (activated, deactivated or unavailable) -// of the features in the gate by referring to a list of Feature resources. -func ComputeFeatureStates(featureGateSpec configv1alpha1.FeatureGateSpec, features []configv1alpha1.Feature) (activated, deactivated, unavailable []string) { - // Collect features to be activated/deactivated in the spec. - toActivate := sets.String{} - toDeactivate := sets.String{} - for _, f := range featureGateSpec.Features { - if f.Activate { - toActivate.Insert(f.Name) - } else { - toDeactivate.Insert(f.Name) - } - } - - // discovered is set a set of available features that are discoverable. - discovered := sets.String{} - // discoveredDefaultActivated is a set of available features that are discoverable and activated by default. - discoveredDefaultActivated := sets.String{} - // discoveredDefaultDeactivated is a set of available features that are discoverable and deactivated by default. - discoveredDefaultDeactivated := sets.String{} - for i := range features { - feature := features[i] - if !feature.Spec.Discoverable { - continue - } - discovered.Insert(feature.Name) - if feature.Spec.Activated { - discoveredDefaultActivated.Insert(feature.Name) - } else { - discoveredDefaultDeactivated.Insert(feature.Name) - } - } - - // activate is all the features that the spec intends to be activated and features that are default activated. - activate := discoveredDefaultActivated.Union(toActivate) - // activationCandidates are features that are discovered, but are explicitly set *not* to be activated in this feature gate. - // Only these features can be activated regardless of what the intent in the spec is. - activationCandidates := discovered.Difference(toDeactivate) - // Intersection gives us the actual activated features. - activated = activationCandidates.Intersection(activate).List() - - // deactivate is all the features that the spec intends to be deactivated and features that are default deactivated. - deactivate := discoveredDefaultDeactivated.Union(toDeactivate) - // deactivationCandidates are features that are discovered, but are explicitly set *not* to be deactivated in this feature gate. - // Only these features can be deactivated regardless of what the intent in the spec is. - deactivationCandidates := discovered.Difference(toActivate) - // Intersection gives us the actual deactivated features. - deactivated = deactivationCandidates.Intersection(deactivate).List() - - // Set of all features specified in the current spec. - allFeaturesInSpec := toActivate.Union(toDeactivate) - // Set difference with all the discovered features gives unavailable features. - unavailable = allFeaturesInSpec.Difference(discovered).List() - - return activated, deactivated, unavailable -} - -// FeatureActivatedInNamespace returns true only if all of the features specified are activated in the namespace. -func FeatureActivatedInNamespace(ctx context.Context, c client.Client, namespace, feature string) (bool, error) { - selector := metav1.LabelSelector{ - MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{namespace}}, - }, - } - return FeaturesActivatedInNamespacesMatchingSelector(ctx, c, selector, []string{feature}) -} - -// FeaturesActivatedInNamespacesMatchingSelector returns true only if all the features specified are activated in every namespace matched by the selector. -func FeaturesActivatedInNamespacesMatchingSelector(ctx context.Context, c client.Client, namespaceSelector metav1.LabelSelector, features []string) (bool, error) { - namespaces, err := featureutil.NamespacesMatchingSelector(ctx, c, &namespaceSelector) - if err != nil { - return false, err - } - - // If no namespaces are matched or no features specified, return false. - if len(namespaces) == 0 || len(features) == 0 { - return false, nil - } - - featureGatesList := &configv1alpha1.FeatureGateList{} - if err := c.List(ctx, featureGatesList); err != nil { - return false, err - } - - // Map of namespace to a set of features activated in that namespace. - namespaceToActivatedFeatures := make(map[string]sets.String) - for i := range featureGatesList.Items { - fg := featureGatesList.Items[i] - for _, namespace := range fg.Status.Namespaces { - namespaceToActivatedFeatures[namespace] = sets.NewString(fg.Status.ActivatedFeatures...) - } - } - - for _, ns := range namespaces { - activatedFeatures, found := namespaceToActivatedFeatures[ns] - if !found { - // Namespace has no features gated. - return false, nil - } - // Feature is not activated in this namespace. - if !activatedFeatures.HasAll(features...) { - return false, nil - } - } - return true, nil -} diff --git a/tkg/features/featuregate/featuregate_test.go b/tkg/features/featuregate/featuregate_test.go deleted file mode 100644 index f58d0e7c6f..0000000000 --- a/tkg/features/featuregate/featuregate_test.go +++ /dev/null @@ -1,307 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package featuregate - -import ( - "context" - "strings" - "testing" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - k8sscheme "k8s.io/client-go/kubernetes/scheme" - "sigs.k8s.io/controller-runtime/pkg/client/fake" - - configv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/config/v1alpha1" - stringcmp "github.com/vmware-tanzu/tanzu-framework/tkg/test/cmp/strings" -) - -func TestComputeFeatureStates(t *testing.T) { - testCases := []struct { - description string - features []configv1alpha1.Feature - spec configv1alpha1.FeatureGateSpec - expectedActivated []string - expectedDeactivated []string - expectedUnavailable []string - }{ - { - description: "All combinations of availability and discoverability", - features: []configv1alpha1.Feature{ - {ObjectMeta: metav1.ObjectMeta{Name: "one"}, Spec: configv1alpha1.FeatureSpec{Activated: true, Discoverable: true}}, - {ObjectMeta: metav1.ObjectMeta{Name: "two"}, Spec: configv1alpha1.FeatureSpec{Activated: true, Discoverable: true}}, - {ObjectMeta: metav1.ObjectMeta{Name: "three"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: true}}, - {ObjectMeta: metav1.ObjectMeta{Name: "four"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: true}}, - {ObjectMeta: metav1.ObjectMeta{Name: "five"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: true}}, - {ObjectMeta: metav1.ObjectMeta{Name: "eleven"}, Spec: configv1alpha1.FeatureSpec{Activated: true, Discoverable: true}}, - {ObjectMeta: metav1.ObjectMeta{Name: "twelve"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: true}}, - {ObjectMeta: metav1.ObjectMeta{Name: "thirteen"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: true}}, - {ObjectMeta: metav1.ObjectMeta{Name: "hundred"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: false}}, - {ObjectMeta: metav1.ObjectMeta{Name: "thousand"}, Spec: configv1alpha1.FeatureSpec{Activated: false, Discoverable: false}}, - }, - spec: configv1alpha1.FeatureGateSpec{ - Features: []configv1alpha1.FeatureReference{ - {Name: "one", Activate: true}, - {Name: "two", Activate: false}, - {Name: "three", Activate: true}, - {Name: "four", Activate: false}, - {Name: "six", Activate: true}, - {Name: "seven", Activate: true}, - {Name: "eight", Activate: false}, - {Name: "nine", Activate: true}, - {Name: "ten", Activate: true}, - }}, - expectedActivated: []string{"one", "three", "eleven"}, - expectedDeactivated: []string{"two", "four", "five", "twelve", "thirteen"}, - expectedUnavailable: []string{"six", "seven", "eight", "nine", "ten"}, - }, - } - - for _, tc := range testCases { - t.Run(tc.description, func(t *testing.T) { - activated, deactivated, unavailable := ComputeFeatureStates(tc.spec, tc.features) - - if diff := stringcmp.SliceDiffIgnoreOrder(activated, tc.expectedActivated); diff != "" { - t.Errorf("got activated features %v, want %v, diff: %s", activated, tc.expectedActivated, diff) - } - - if diff := stringcmp.SliceDiffIgnoreOrder(deactivated, tc.expectedDeactivated); diff != "" { - t.Errorf("got deactivated features %v, want %v, diff: %s", deactivated, tc.expectedDeactivated, diff) - } - - if diff := stringcmp.SliceDiffIgnoreOrder(unavailable, tc.expectedUnavailable); diff != "" { - t.Errorf("got unavailable features %v, want %v, diff: %s", unavailable, tc.expectedUnavailable, diff) - } - }) - } -} - -func TestFeaturesActivatedInNamespacesMatchingSelector(t *testing.T) { - scheme, err := configv1alpha1.SchemeBuilder.Build() - if err != nil { - t.Fatal(err) - } - if err := k8sscheme.AddToScheme(scheme); err != nil { - t.Fatal(err) - } - - newNamespace := func(name string) *corev1.Namespace { - return &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{"kubernetes.io/metadata.name": name}}} - } - - newFeatureGate := func(name string, namespaces, activated, deactivated, unavailable []string) *configv1alpha1.FeatureGate { - return &configv1alpha1.FeatureGate{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Status: configv1alpha1.FeatureGateStatus{ - Namespaces: namespaces, - ActivatedFeatures: activated, - DeactivatedFeatures: deactivated, - UnavailableFeatures: unavailable, - }} - } - - testCases := []struct { - description string - existingObjects []runtime.Object - selector metav1.LabelSelector - features []string - want bool - err string - }{ - { - description: "Namespace matched by selector is gated and all features are activated", - existingObjects: []runtime.Object{ - newNamespace("kube-system"), - newNamespace("kube-public"), - newNamespace("tkg-system"), - newFeatureGate("tkg", []string{"kube-system", "tkg-system"}, []string{"one", "two"}, []string{"three", "four"}, []string{"five", "six"}), - }, - selector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"tkg-system"}}, - }}, - features: []string{"one", "two"}, - want: true, - err: "", - }, - { - description: "Namespace matched by selector is gated and one feature is deactivated", - existingObjects: []runtime.Object{ - newNamespace("kube-system"), - newNamespace("ns-no-feature-gates"), - newNamespace("tkg-system"), - newFeatureGate("tkg", []string{"kube-system", "tkg-system"}, []string{"one", "two"}, []string{"three", "four"}, []string{"five", "six"}), - }, - selector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"tkg-system"}}, - }}, - features: []string{"one", "three"}, - want: false, - err: "", - }, - { - description: "Namespaces matched by selector are gated and all features are activated", - existingObjects: []runtime.Object{ - newNamespace("kube-system"), - newNamespace("ns-no-feature-gates"), - newNamespace("tkg-system"), - newFeatureGate("tkg", []string{"kube-system", "tkg-system"}, []string{"one", "two"}, []string{"three", "four"}, []string{"five", "six"}), - }, - selector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"tkg-system", "kube-system"}}, - }}, - features: []string{"one", "two"}, - want: true, - err: "", - }, - { - description: "Namespaces matched by selector are gated and all features are activated across multiple feature gates", - existingObjects: []runtime.Object{ - newNamespace("kube-system"), - newNamespace("ns-no-feature-gates"), - newNamespace("tkg-system"), - newFeatureGate("tkg", []string{"kube-system", "tkg-system"}, []string{"one", "two"}, []string{"three", "four"}, []string{"five", "six"}), - newFeatureGate("dev", []string{"kube-public"}, []string{"one", "two"}, []string{"three"}, []string{}), - }, - selector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"tkg-system", "kube-system", "kube-public"}}, - }}, - features: []string{"one", "two"}, - want: true, - err: "", - }, - { - description: "Namespaces are gated and all features are either deactivated or unavailable", - existingObjects: []runtime.Object{ - newNamespace("kube-system"), - newNamespace("kube-public"), - newNamespace("tkg-system"), - newFeatureGate("tkg", []string{"kube-system", "tkg-system"}, []string{"one", "two"}, []string{"three", "four"}, []string{"five", "six"}), - }, - selector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"tkg-system"}}, - }}, - features: []string{"five", "three"}, - want: false, - err: "", - }, - { - description: "Label selector matches only one namespace with all features activated", - existingObjects: []runtime.Object{ - newNamespace("kube-system"), - newNamespace("kube-public"), - newNamespace("tkg-system"), - newFeatureGate("tkg", []string{"kube-system", "tkg-system"}, []string{"one", "two"}, []string{"three", "four"}, []string{"five", "six"}), - }, - selector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"tkg-system", "ns-no-feature-gates"}}, - }}, - features: []string{"one", "two"}, - want: true, - err: "", - }, - { - description: "Label selector matches two namespaces where a feature is in different activation states", - existingObjects: []runtime.Object{ - newNamespace("kube-system"), - newNamespace("kube-public"), - newNamespace("tkg-system"), - newFeatureGate("tkg", []string{"kube-system", "tkg-system"}, []string{"one"}, []string{}, []string{}), - newFeatureGate("dev", []string{"kube-public"}, []string{}, []string{"one"}, []string{}), - }, - selector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"tkg-system", "kube-public"}}, - }}, - features: []string{"one"}, - want: false, - err: "", - }, - { - description: "Label selector matches no namespaces", - existingObjects: []runtime.Object{ - newNamespace("kube-system"), - newNamespace("kube-public"), - newNamespace("tkg-system"), - newFeatureGate("tkg", []string{"kube-system", "tkg-system"}, []string{"one", "two"}, []string{"three", "four"}, []string{"five", "six"}), - }, - selector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{ - // LabelSelectorRequirement are ANDed. - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"tkg-system"}}, - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"ns-no-feature-gates"}}, - }}, - features: []string{"one", "two"}, - want: false, - err: "", - }, - { - description: "Features are not gated in any of the namespaces", - existingObjects: []runtime.Object{ - newNamespace("kube-system"), - newNamespace("kube-public"), - newNamespace("tkg-system"), - newFeatureGate("tkg", []string{"kube-system", "tkg-system"}, []string{"one", "two"}, []string{"three", "four"}, []string{"five", "six"}), - }, - selector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"ns-no-feature-gates"}}, - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"kube-public"}}, - }}, - features: []string{"one", "two"}, - want: false, - err: "", - }, - { - description: "No features specified", - existingObjects: []runtime.Object{ - newNamespace("kube-system"), - newNamespace("kube-public"), - newNamespace("tkg-system"), - newFeatureGate("tkg", []string{"kube-system", "tkg-system"}, []string{"one", "two"}, []string{"three", "four"}, []string{"five", "six"}), - }, - selector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"ns-no-feature-gates"}}, - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"kube-public"}}, - }}, - features: []string{}, - want: false, - err: "", - }, - { - description: "Error due to bad namespace selector", - existingObjects: []runtime.Object{ - newNamespace("kube-system"), - newNamespace("kube-public"), - newNamespace("tkg-system"), - newFeatureGate("tkg", []string{"kube-system", "tkg-system"}, []string{"one", "two"}, []string{"three", "four"}, []string{"five", "six"}), - }, - selector: metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpExists, Values: []string{"bad-value"}}, - }}, - features: []string{}, - want: false, - err: "failed to get namespaces from NamespaceSelector", - }, - } - - for _, tc := range testCases { - t.Run(tc.description, func(t *testing.T) { - fakeClient := fake.NewClientBuilder().WithScheme(scheme).WithRuntimeObjects(tc.existingObjects...).Build() - got, err := FeaturesActivatedInNamespacesMatchingSelector(context.Background(), fakeClient, tc.selector, tc.features) - if err != nil { - if tc.err == "" { - t.Errorf("no error string specified, but got error: %v", err) - } - if !strings.Contains(err.Error(), tc.err) { - t.Errorf("error string=%q doesn't match partial=%q", tc.err, err) - } - } else if tc.err != "" { - t.Errorf("error string=%q specified but error not found", tc.err) - } - if got != tc.want { - t.Errorf("feature activation: got %t, want %t", got, tc.want) - } - }) - } -} diff --git a/tkg/features/interface.go b/tkg/features/interface.go deleted file mode 100644 index 4a4aca4044..0000000000 --- a/tkg/features/interface.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package features provides TKG related feature enablement functionalities -package features - -//go:generate counterfeiter -o ../fakes/featuresclient.go --fake-name FeaturesClient . Client - -// Client defines methods to access feature flags -type Client interface { - GetFeatureFlags() (map[string]string, error) - IsFeatureFlagEnabled(string) (bool, error) - WriteFeatureFlags(map[string]string) error - GetFeatureFlag(string) (string, error) -} diff --git a/tkg/features/util/doc.go b/tkg/features/util/doc.go deleted file mode 100644 index 4d48911c81..0000000000 --- a/tkg/features/util/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package util provides utilities for feature and feature gate functionality. -// Copied over from "github.com/vmware-tanzu/tanzu-framework/pkg/v1/sdk/features/util" -package util diff --git a/tkg/features/util/namespace_selector.go b/tkg/features/util/namespace_selector.go deleted file mode 100644 index 0003992c40..0000000000 --- a/tkg/features/util/namespace_selector.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "context" - "fmt" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// NamespacesMatchingSelector returns the list of namespaces after applying the NamespaceSelector filter. -// Note that a nil selector selects nothing, while an empty selector selects everything. -// Callers using this function in feature gates context should be sending a pointer to an empty selector instead of nil. -func NamespacesMatchingSelector(ctx context.Context, c client.Client, selector *metav1.LabelSelector) ([]string, error) { - s, err := metav1.LabelSelectorAsSelector(selector) - if err != nil { - return nil, fmt.Errorf("failed to get namespaces from NamespaceSelector: %w", err) - } - - nsList := &corev1.NamespaceList{} - err = c.List(ctx, nsList, client.MatchingLabelsSelector{Selector: s}) - if err != nil { - return nil, fmt.Errorf("failed to get namespaces from NamespaceSelector: %w", err) - } - - var namespaces []string - for i := range nsList.Items { - namespaces = append(namespaces, nsList.Items[i].Name) - } - return namespaces, nil -} diff --git a/tkg/features/util/namespace_selector_test.go b/tkg/features/util/namespace_selector_test.go deleted file mode 100644 index 8f4b048083..0000000000 --- a/tkg/features/util/namespace_selector_test.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package util - -import ( - "context" - "strings" - "testing" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - k8sscheme "k8s.io/client-go/kubernetes/scheme" - "sigs.k8s.io/controller-runtime/pkg/client/fake" - - stringcmp "github.com/vmware-tanzu/tanzu-framework/tkg/test/cmp/strings" -) - -func TestNamespacesMatchingSelector(t *testing.T) { - newNamespace := func(name string) *corev1.Namespace { - return &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: name, Labels: map[string]string{"kubernetes.io/metadata.name": name}}} - } - - testCases := []struct { - description string - existingNamespaces []runtime.Object - namespaceSelector *metav1.LabelSelector - want []string - err string - }{ - { - description: "Empty namespace selector - all namespaces selected", - existingNamespaces: []runtime.Object{newNamespace("default"), newNamespace("kube-system"), newNamespace("kube-public"), newNamespace("tkg-system")}, - namespaceSelector: &metav1.LabelSelector{}, - want: []string{"default", "kube-system", "tkg-system", "kube-public"}, - err: "", - }, - { - // Callers interested in feature gates should not be sending a nil namespaces, but this is a generic function. - description: "Nil namespace selector - no namespaces selected", - existingNamespaces: []runtime.Object{ - newNamespace("default"), - newNamespace("kube-system"), - newNamespace("kube-public"), - newNamespace("tkg-system"), - }, - namespaceSelector: nil, - want: []string{}, - err: "", - }, - { - description: "Selector that matches partially", - existingNamespaces: []runtime.Object{newNamespace("default"), newNamespace("kube-system"), newNamespace("kube-public"), newNamespace("tkg-system")}, - namespaceSelector: &metav1.LabelSelector{ - MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"kube-system", "tkg-system", "badlabel"}}, - }, - }, - want: []string{"kube-system", "tkg-system"}, - err: "", - }, - { - description: "Selector that doesn't match anything", - existingNamespaces: []runtime.Object{newNamespace("default"), newNamespace("kube-system"), newNamespace("kube-public"), newNamespace("tkg-system")}, - namespaceSelector: &metav1.LabelSelector{ - MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{"badlabel1", "badlabel2"}}, - }, - }, - want: []string{}, - err: "", - }, - { - description: "Bad namespace selector - error", - existingNamespaces: []runtime.Object{newNamespace("default"), newNamespace("kube-system"), newNamespace("kube-public"), newNamespace("tkg-system")}, - namespaceSelector: &metav1.LabelSelector{ - MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpExists, Values: []string{"value-should-not-be-here"}}, - }, - }, - want: []string{}, - err: "failed to get namespaces from NamespaceSelector", - }, - } - - for _, tc := range testCases { - t.Run(tc.description, func(t *testing.T) { - fakeClient := fake.NewClientBuilder().WithScheme(k8sscheme.Scheme).WithRuntimeObjects(tc.existingNamespaces...).Build() - got, err := NamespacesMatchingSelector(context.Background(), fakeClient, tc.namespaceSelector) - if err != nil { - if tc.err == "" { - t.Errorf("no error string specified, but got error: %v", err) - } - if !strings.Contains(err.Error(), tc.err) { - t.Errorf("error string=%q doesn't match partial=%q", tc.err, err) - } - } else if tc.err != "" { - t.Errorf("error string=%q specified but error not found", tc.err) - } - if diff := stringcmp.SliceDiffIgnoreOrder(got, tc.want); diff != "" { - t.Errorf("got namespaces: %v, want namespaces: %v, diff: %s", got, tc.want, diff) - } - }) - } -} diff --git a/tkg/go.mod b/tkg/go.mod deleted file mode 100644 index 96a9c44b89..0000000000 --- a/tkg/go.mod +++ /dev/null @@ -1,255 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/tkg - -go 1.18 - -replace ( - github.com/vmware-tanzu/tanzu-framework/apis/cli => ../apis/cli - github.com/vmware-tanzu/tanzu-framework/apis/config => ../apis/config - github.com/vmware-tanzu/tanzu-framework/apis/run => ../apis/run - github.com/vmware-tanzu/tanzu-framework/capabilities/client => ../capabilities/client - github.com/vmware-tanzu/tanzu-framework/cli/core => ../cli/core - github.com/vmware-tanzu/tanzu-framework/cli/runtime => ../cli/runtime - github.com/vmware-tanzu/tanzu-framework/packageclients => ../packageclients - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common => ../pinniped-components/common - github.com/vmware-tanzu/tanzu-framework/tkr => ../tkr - github.com/vmware-tanzu/tanzu-framework/util => ../util - sigs.k8s.io/cluster-api => sigs.k8s.io/cluster-api v1.2.8 -) - -require ( - github.com/Azure/azure-sdk-for-go v66.0.0+incompatible - github.com/Azure/go-autorest/autorest v0.11.23 - github.com/Azure/go-autorest/autorest/azure/auth v0.5.10 - github.com/MakeNowJust/heredoc v1.0.0 - github.com/Masterminds/semver v1.5.0 - github.com/apparentlymart/go-cidr v1.1.0 - github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 - github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7 - github.com/aws/aws-sdk-go v1.44.107 - github.com/awslabs/goformation/v4 v4.19.5 - github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f - github.com/docker/docker v20.10.17+incompatible - github.com/elazarl/go-bindata-assetfs v1.0.1 - github.com/fatih/color v1.13.0 - github.com/go-ldap/ldap/v3 v3.3.0 - github.com/go-logr/logr v1.2.3 - github.com/go-openapi/errors v0.19.2 - github.com/go-openapi/loads v0.19.4 - github.com/go-openapi/runtime v0.19.4 - github.com/go-openapi/spec v0.19.5 - github.com/go-openapi/strfmt v0.19.5 - github.com/go-openapi/swag v0.22.3 - github.com/go-openapi/validate v0.19.8 - github.com/golang/mock v1.6.0 - github.com/google/gnostic v0.6.9 - github.com/google/go-cmp v0.5.9 - github.com/google/go-containerregistry v0.10.0 - github.com/gorilla/websocket v1.5.0 - github.com/gosuri/uitable v0.0.4 - github.com/imdario/mergo v0.3.13 - github.com/jessevdk/go-flags v1.4.0 - github.com/jinzhu/copier v0.3.5 - github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b - github.com/k14s/imgpkg v0.17.0 - github.com/k14s/kbld v0.32.0 - github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1 - github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.24.1 - github.com/oracle/oci-go-sdk/v49 v49.2.0 - github.com/otiai10/copy v1.7.0 - github.com/pelletier/go-toml/v2 v2.0.5 - github.com/pkg/errors v0.9.1 - github.com/rs/xid v1.4.0 - github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b - github.com/sergi/go-diff v1.2.0 - github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 - github.com/spf13/cobra v1.6.1 - github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.12.0 - github.com/stretchr/testify v1.8.1 - github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 - github.com/vmware-tanzu/carvel-ytt v0.40.0 - github.com/vmware-tanzu/tanzu-framework/apis/cli v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/apis/config v0.0.0-20220824221239-af5a644ffef7 - github.com/vmware-tanzu/tanzu-framework/apis/run v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/capabilities/client v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/cli/core v0.0.0-20220914003300-5b2ed024556a - github.com/vmware-tanzu/tanzu-framework/cli/runtime v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/packageclients v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/pinniped-components/common v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/tkr v0.0.0-00010101000000-000000000000 - github.com/vmware-tanzu/tanzu-framework/util v0.0.0-00010101000000-000000000000 - github.com/vmware/govmomi v0.30.2 - github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 - golang.org/x/mod v0.8.0 - golang.org/x/net v0.8.0 - golang.org/x/sync v0.1.0 - golang.org/x/text v0.8.0 - gomodules.xyz/jsonpatch/v2 v2.2.0 - gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.24.4 - k8s.io/apiextensions-apiserver v0.24.4 - k8s.io/apimachinery v0.24.4 - k8s.io/client-go v0.24.4 - k8s.io/kubectl v0.24.0 - k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 - sigs.k8s.io/cluster-api v1.2.8 - sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2 - sigs.k8s.io/cluster-api-provider-azure v1.6.1 - sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 - sigs.k8s.io/cluster-api/test v1.2.8 - sigs.k8s.io/controller-runtime v0.12.3 - sigs.k8s.io/kind v0.15.0 - sigs.k8s.io/yaml v1.3.0 -) - -require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect - cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.6.0 // indirect - cloud.google.com/go/storage v1.27.0 // indirect - github.com/AlecAivazis/survey/v2 v2.3.5 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.18 // indirect - github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect - github.com/BurntSushi/toml v1.1.0 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.2.0 // indirect - github.com/Masterminds/sprig/v3 v3.2.3 // indirect - github.com/Microsoft/go-winio v0.5.2 // indirect - github.com/adrg/xdg v0.4.0 // indirect - github.com/alessio/shellescape v1.4.1 // indirect - github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect - github.com/aws/amazon-vpc-cni-k8s v1.12.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/blang/semver v3.5.1+incompatible // indirect - github.com/briandowns/spinner v1.19.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cheggaaa/pb v1.0.29 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.11.4 // indirect - github.com/coredns/caddy v1.1.1 // indirect - github.com/coredns/corefile-migration v1.0.18 // indirect - github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e // indirect - github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/dimchansky/utfbom v1.1.1 // indirect - github.com/docker/cli v20.10.16+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.4.0 // indirect - github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/getkin/kin-openapi v0.94.0 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-asn1-ber/asn1-ber v1.5.1 // indirect - github.com/go-logr/zapr v1.2.3 // indirect - github.com/go-openapi/analysis v0.19.5 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.20.0 // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/gobuffalo/flect v0.2.5 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.0.0 // indirect - github.com/golang/glog v1.0.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/cel-go v0.12.5 // indirect - github.com/google/go-github/v45 v45.2.0 // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect - github.com/hashicorp/go-version v1.4.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/huandu/xstrings v1.3.3 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // 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/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 // indirect - github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.15.4 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // 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/nxadm/tail v1.4.8 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522 // indirect - github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/sony/gobreaker v0.4.2-0.20210216022020-dd874f9dd33b // indirect - github.com/spf13/afero v1.9.2 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/stoewer/go-strcase v1.2.0 // indirect - github.com/subosito/gotenv v1.3.0 // indirect - github.com/valyala/fastjson v1.6.3 // indirect - github.com/vbatts/tar-split v0.11.2 // indirect - github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec // indirect - github.com/vmware-tanzu/carvel-imgpkg v0.23.1 // indirect - github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 // indirect - github.com/vmware-tanzu/carvel-vendir v0.30.0 // indirect - go.mongodb.org/mongo-driver v1.5.1 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - go.uber.org/zap v1.22.0 // indirect - golang.org/x/crypto v0.4.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.6.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.6.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.102.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect - google.golang.org/grpc v1.50.1 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.66.4 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - k8s.io/apiserver v0.24.4 // indirect - k8s.io/cluster-bootstrap v0.24.4 // indirect - k8s.io/component-base v0.24.4 // indirect - k8s.io/klog/v2 v2.80.0 // indirect - k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 // indirect - sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect -) diff --git a/tkg/go.sum b/tkg/go.sum deleted file mode 100644 index 750d4ebd84..0000000000 --- a/tkg/go.sum +++ /dev/null @@ -1,2143 +0,0 @@ -4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= -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.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= -cloud.google.com/go/iam v0.6.0 h1:nsqQC88kT5Iwlm4MeNGTpfMWddp6NB/UOLFTH6m1QfQ= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/longrunning v0.1.1 h1:y50CXG4j0+qvEukslYFBCrzaXX0qpFbBzc3PchSu/LE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= -cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/Antonboom/errname v0.1.5/go.mod h1:DugbBstvPFQbv/5uLcRRzfrNqKE9tVdVCqWCLp6Cifo= -github.com/Antonboom/nilnil v0.1.0/go.mod h1:PhHLvRPSghY5Y7mX4TW+BHZQYo1A8flE5H20D3IPZBo= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible h1:bmmC38SlE8/E81nNADlgmVGurPWMHDX2YNXVQMrBpEE= -github.com/Azure/azure-sdk-for-go v66.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest v0.11.23 h1:bRQWsW25/YkoxnIqXMPF94JW33qWDcrPMZ3bINaAruU= -github.com/Azure/go-autorest/autorest v0.11.23/go.mod h1:BAWYUWGPEtKPzjVkp0Q6an0MJcJDsoh5Z1BFAEFs4Xs= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ= -github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.10 h1:F9A3Z++TtAoFysBsNOIJILoHuYBaYvhVGsMGEqPtIS8= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.10/go.mod h1:zQXYYNX9kXzRMrJNVXWUfNy38oPMF5/2TeZ4Wylc9fE= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 h1:dMOmEJfkLKW/7JsokJqkyoYSgmR08hi9KrhjZb+JALY= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28= -github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -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/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= -github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= -github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= -github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d h1:0xIrH2lJbraclvJT3pvTf3u2oCAL60cAqiv4qRpz4EI= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220816024939-bc8df83d7b9d/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU= -github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489 h1:DKOk8ZLAPnn4P/qTwGj5x5wAMqHmaE1oL4+nl1laIu8= -github.com/aunum/log v0.0.0-20200821225356-38d2e2c8b489/go.mod h1:ze/JIQHfGKwpM8U2b39e8OH0KHt1ovEcjwPV3yfU+/c= -github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7 h1:UpBQmQ1gKLi+i+/Dohoqk7FfuxlYQYveajqs1pk/CvA= -github.com/avinetworks/sdk v0.0.0-20201123134013-c157ef55b6f7/go.mod h1:BcllDeAFx8PtaMrPxvvuCUo7NRS2x6w+3W17WFDu0sk= -github.com/aws/amazon-vpc-cni-k8s v1.12.0 h1:WP8wHJ+UjViYkpMi2Uu5hHiPTYH3/jPC9pG3PrTmoWY= -github.com/aws/amazon-vpc-cni-k8s v1.12.0/go.mod h1:vZdHLUZf7Kj4mpqzG+szRxvCe/XMS/EAcxwMklI6NOQ= -github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.37/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= -github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.44.107 h1:VP7Rq3wzsOV7wrfHqjAAKRksD4We58PaoVSDPKhm8nw= -github.com/aws/aws-sdk-go v1.44.107/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/awslabs/goformation/v4 v4.19.5 h1:Y+Tzh01tWg8gf//AgGKUamaja7Wx9NPiJf1FpZu4/iU= -github.com/awslabs/goformation/v4 v4.19.5/go.mod h1:JoNpnVCBOUtEz9bFxc9sjy8uBUCLF5c4D1L7RhRTVM8= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/blizzy78/varnamelen v0.3.0/go.mod h1:hbwRdBvoBqxk34XyQ6HA0UH3G0/1TKuv5AC4eaBT0Ec= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/breml/bidichk v0.1.1/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= -github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= -github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudfoundry/bosh-utils v0.0.0-20191216173634-505d7f919144/go.mod h1:JCrKwetZGjxbfq1U139TZuXDBfdGLtjOEAfxMWKV/QM= -github.com/cloudfoundry/config-server v0.1.20/go.mod h1:Y3b/MHqyp22CcG0X1qvEHG8lujoebxjD9IAslyS/Yk0= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/stargz-snapshotter/estargz v0.11.4 h1:LjrYUZpyOhiSaU7hHrdR82/RBoxfGWSaC0VeSSMXqnk= -github.com/containerd/stargz-snapshotter/estargz v0.11.4/go.mod h1:7vRJIcImfY8bpifnMjt+HTJoQxASq7T28MYbP15/Nf0= -github.com/coredns/caddy v1.1.0/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/caddy v1.1.1 h1:2eYKZT7i6yxIfGP3qLJoJ7HAsDJqYB+X68g4NYjSrE0= -github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= -github.com/coredns/corefile-migration v1.0.18 h1:zs5PJm/VGZVje1ESRj6ZqyUuVsVfagExkbLU2QKV5mI= -github.com/coredns/corefile-migration v1.0.18/go.mod h1:XnhgULOEouimnzgn0t4WPuFDN2/PJQcTxdWKC5eXNGE= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cppforlife/cobrautil v0.0.0-20200514214827-bb86e6965d72/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e h1:4AxO89dwbgA957M8DX5AV/KsOmxDyAB1BES0INY+A/0= -github.com/cppforlife/cobrautil v0.0.0-20220411122935-c28a9f274a4e/go.mod h1:2w+qxVu2KSGW78Ex/XaIqfh/OvBgjEsmN53S4T8vEyA= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835 h1:mYQweUIBD+TBRjIeQnJmXr0GSVMpI6O0takyb/aaOgo= -github.com/cppforlife/color v1.9.1-0.20200716202919-6706ac40b835/go.mod h1:dYeVsKp1vvK8XjdTPR1gF+uk+9doxKeO3hqQTOCr7T4= -github.com/cppforlife/go-cli-ui v0.0.0-20200506005011-4268990983cc/go.mod h1:I0qrzCmuPWYI6kAOvkllYjaW2aovclWbJ96+v+YyHb0= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f h1:yVW0v4zDXzJo1i8G9G3vtvNpyzhvtLalO34BsN/K88E= -github.com/cppforlife/go-cli-ui v0.0.0-20200716203538-1e47f820817f/go.mod h1:L18TqO77ci8i+hFtlMC4zSFz/D3O8lf84TyVU+zFF8E= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/daixiang0/gci v0.2.9/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.16+incompatible h1:aLQ8XowgKpR3/IysPj8qZQJBVQ+Qws61icFuZl6iKYs= -github.com/docker/cli v20.10.16+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 h1:7QPwrLT79GlD5sizHf27aoY2RTvw62mO6x7mxkScNk0= -github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46/go.mod h1:esf2rsHFNlZlxsqsZDojNBcnNs5REqIvRrWRHqX0vEU= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw= -github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -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.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= -github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getkin/kin-openapi v0.94.0 h1:bAxg2vxgnHHHoeefVdmGbR+oxtJlcv5HsJJa3qmAHuo= -github.com/getkin/kin-openapi v0.94.0/go.mod h1:LWZfzOd7PRy8GJ1dJ6mCU6tNdSfOwRac1BUPam4aw6Q= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= -github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= -github.com/go-critic/go-critic v0.6.1/go.mod h1:SdNCfU0yF3UBjtaZGw6586/WocupMOJuiqgom5DsQxM= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-ldap/ldap/v3 v3.3.0 h1:lwx+SJpgOHd8tG6SumBQZXCmNX51zM8B1cfxJ5gv4tQ= -github.com/go-ldap/ldap/v3 v3.3.0/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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 v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4 h1:5I4CCSqoWzT+82bBkNIvmLc0UOsoKKQ4Fz+3VxOB7SY= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= -github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-openapi/validate v0.19.8 h1:YFzsdWIDfVuLvIOF+ZmKjVg1MbPJ1QgY9PihMwei1ys= -github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/flect v0.2.5 h1:H6vvsv2an0lalEaCDRThvtBfmg44W/QHXBCYUXf/6S4= -github.com/gobuffalo/flect v0.2.5/go.mod h1:1ZyCLIbg0YD7sDkzvFdPoOydPtD8y9JQnrOROolUcM8= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -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/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.43.0/go.mod h1:VIFlUqidx5ggxDfQagdvd9E67UjMXtTHBkBQ7sHoC5Q= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-go v0.12.5 h1:DmzaiSgoaqGCjtpPQWl26/gND+yRpim56H1jCVev6d8= -github.com/google/cel-go v0.12.5/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= -github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= -github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= -github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-containerregistry v0.10.0 h1:qd/fv2nQajGZJenaNcdaghlwSPjQ0NphN9hzArr2WWg= -github.com/google/go-containerregistry v0.10.0/go.mod h1:C7uwbB1QUAtvnknyd3ethxJRd4gtEjU/9WLXzckfI1Y= -github.com/google/go-github/v45 v45.2.0 h1:5oRLszbrkvxDDqBCNj2hjDZMKmvexaZ1xw/FCD+K3FI= -github.com/google/go-github/v45 v45.2.0/go.mod h1:FObaZJEDSTa/WGCzZ2Z3eoCDXWJKMenWWTrd8jrta28= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= -github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= -github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= -github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= -github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca1L0J4= -github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hpcloud/tail v1.0.1-0.20180514194441-a1dbeea552b7/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= -github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= -github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -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/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -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/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k14s/difflib v0.0.0-20201117154628-0c031775bf57 h1:CwBRArr+BWBopnUJhDjJw86rPL/jGbEjfHWKzTasSqE= -github.com/k14s/imgpkg v0.17.0 h1:l1HqYtjecqx7iYecJUvxQQYdo3WubCahHQ30lh0p9sU= -github.com/k14s/imgpkg v0.17.0/go.mod h1:xYZ7gQxYP3O35vGIXcYchDEHq0xA81FOheCp8Vlq5ko= -github.com/k14s/kbld v0.32.0 h1:zf3qCir0usz7rX6JRF97QxaZ25+13EniE7z+ll0xaZ8= -github.com/k14s/kbld v0.32.0/go.mod h1:N7Ij72ZhJ2B7kTUxavGTBT1YymIfmAeO6JKyNbtja1g= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115 h1:wKSifC/VbCaQMqXYn6/gSFqle82OX4bE3KYALDU9FlU= -github.com/k14s/semver/v4 v4.0.1-0.20210701191048-266d47ac6115/go.mod h1:mGrnmO5qnhJIaSiwMo05cvRL6Ww9ccYbTgNFcm6RHZQ= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368 h1:4bcRTTSx+LKSxMWibIwzHnDNmaN1x52oEpvnjCy+8vk= -github.com/k14s/starlark-go v0.0.0-20200720175618-3a5c849cc368/go.mod h1:lKGj1op99m4GtQISxoD2t+K+WO/q2NzEPKvfXFQfbCA= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.4 h1:1kn4/7MepF/CHmYub99/nNX8az0IJjfSOU/jbnTVfqQ= -github.com/klauspost/compress v1.15.4/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= -github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= -github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1 h1:hZD/8vBuw7x1WqRXD/WGjVjipbbo/HcDBgySYYbrUSk= -github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.1.2/go.mod h1:bnXsMr+ZTH09V5rssEI+jHAZ4z+ZdyhgO/zsy3EhK+0= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= -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 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= -github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc= -github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= -github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -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 v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.5.0 h1:TRtrvv2vdQqzkwrQ1ke6vtXf7IK34RBUJafIy1wMwls= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= -github.com/onsi/gomega v1.12.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= -github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198 h1:+czc/J8SlhPKLOtVLMQc+xDCFBT73ZStMsRhSsUhsSg= -github.com/opencontainers/image-spec v1.0.3-0.20220114050600-8b9d41f48198/go.mod h1:j4h1pJW6ZcJTgMZWP3+7RlG3zTaP02aDZ/Qw0sppK7Q= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/oracle/oci-go-sdk/v49 v49.2.0 h1:l4PUk81EKdTDD4mDg5wrELpdWFqYeE9KYejfNgtsyUI= -github.com/oracle/oci-go-sdk/v49 v49.2.0/go.mod h1:E8q2DXmXnSozLdXHUFF+o3L2gzcWbiFIPFYOYWdqOfc= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= -github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/otiai10/mint v1.3.3 h1:7JgpsBaN0uMkyju4tbYHu0mnM55hNKVYLsXmwr15NQI= -github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -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/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.13/go.mod h1:Ul8wwdqR6kBVOCt2dipDBkE+T6vAV/iixkrKuRTN1oQ= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.10/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20210428214800-545e0d2e0bf7/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryancurrah/gomodguard v1.2.3/go.mod h1:rYbA/4Tg5c54mV1sv4sQTP5WOPBcoLtnBZ7/TEhXAbg= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= -github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b h1:jUK33OXuZP/l6babJtnLo1qsGvq6G9so9KMflGAm4YA= -github.com/sanathkr/go-yaml v0.0.0-20170819195128-ed9d249f429b/go.mod h1:8458kAagoME2+LN5//WxE71ysZ3B7r22fdgb7qVmXSY= -github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522 h1:fOCp11H0yuyAt2wqlbJtbyPzSgaxHTv8uN1pMpkG1t8= -github.com/sanathkr/yaml v0.0.0-20170819201035-0056894fa522/go.mod h1:tQTYKOQgxoH3v6dEmdHiz4JG+nbxWwM5fgPQUpSZqVQ= -github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8= -github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securego/gosec/v2 v2.9.1/go.mod h1:oDcDLcatOJxkCGaCaq8lua1jTnYf6Sou4wdiJ1n4iHc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil/v3 v3.21.10/go.mod h1:t75NhzCZ/dYyPQjyQmrAYP6c8+LCdFANeBMdLPCNnew= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= -github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= -github.com/sony/gobreaker v0.4.2-0.20210216022020-dd874f9dd33b h1:br+bPNZsJWKicw/5rALEo67QHs5weyD5tf8WST+4sJ0= -github.com/sony/gobreaker v0.4.2-0.20210216022020-dd874f9dd33b/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.3.0 h1:mjC+YW8QpAdXibNi+vNWgzmgBH4+5l5dCXv8cNysBLI= -github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= -github.com/sylvia7788/contextcheck v1.0.4/go.mod h1:vuPKJMQ7MQ91ZTqfdyreNKwZjyUg6KO+IebVyQDedZQ= -github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY= -github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= -github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= -github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= -github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= -github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec h1:Klu98tQ9Z1t23gvC7p7sCmvxkZxLhBHLNyrUPsWsYFg= -github.com/vito/go-interact v0.0.0-20171111012221-fa338ed9e9ec/go.mod h1:wPlfmglZmRWMYv/qJy3P+fK/UnoQB5ISk4txfNd9tDo= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1 h1:sUHDtnvcIMMcY/Pudym6DJ0kv7+uyMCAqQby0SLnQVs= -github.com/vmware-tanzu/carvel-imgpkg v0.23.1/go.mod h1:2XNe+P0MDgya0FPEMOVZLAXku05VZhccVdDcXChhvy8= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0 h1:zgWNumjhN+0CCiq1Wo4lVTmO89eOA6HuPXgv1sVhE4k= -github.com/vmware-tanzu/carvel-kapp-controller v0.35.0/go.mod h1:Hldrv7kPAD3THS1yUYZPFIaHmPE0ENO0ljzbJrpftiE= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0 h1:3mSDyzhf52Y0jdvHrhJUf4Sk97CILBOkQt/WUaD8G/8= -github.com/vmware-tanzu/carvel-secretgen-controller v0.5.0/go.mod h1:UW9xzccG6vjNoq2emVderTX11epILNyxtmGxFupRsHc= -github.com/vmware-tanzu/carvel-vendir v0.30.0 h1:JqElRFpSsYJQmI5Hrxl1Fx9wJZ2xeDk+TVnnSrFLFVU= -github.com/vmware-tanzu/carvel-vendir v0.30.0/go.mod h1:qFV2/3Cu584fhG2wXodoIm8KhX1wKHRFavBiRjK/Ly0= -github.com/vmware-tanzu/carvel-ytt v0.40.0 h1:WUWTtwvfqV9CN9v207oDt2xfhmuWHGwc4MMaXJAqIEE= -github.com/vmware-tanzu/carvel-ytt v0.40.0/go.mod h1:crDcKbS1GM4Q34puoVxdrajWOXrxjOxvUCwtsNV5Etc= -github.com/vmware/govmomi v0.30.2 h1:zPMmLTtAfBgOVsTgwKOzVVahQIOC4A2oyFQFSsn/0ag= -github.com/vmware/govmomi v0.30.2/go.mod h1:F7adsVewLNHsW/IIm7ziFURaXDaHEwcc+ym4r3INMdY= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.5.1 h1:9nOVLGDfOaZ9R0tBumx/BcuqkbFpyTCU2r/Po7A2azI= -go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= -go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0= -go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U= -go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= -go4.org/intern v0.0.0-20220617035311-6925f38cc365 h1:t9hFvR102YlOqU0fQn1wgwhNvSbHGBbbJxX9JKfU3l0= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 h1:FyBZqvoA/jbNzuAWLQE2kG820zMAkcilx6BMjGbL/E4= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180730214132-a0f8a16cb08c/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -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.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/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.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/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-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -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-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= -gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/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-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/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= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= -inet.af/netaddr v0.0.0-20220811202034-502d2d690317 h1:U2fwK6P2EqmopP/hFLTOAjWTki0qgd4GMJn5X8wOleU= -k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= -k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= -k8s.io/api v0.24.4 h1:I5Y645gJ8zWKawyr78lVfDQkZrAViSbeRXsPZWTxmXk= -k8s.io/api v0.24.4/go.mod h1:42pVfA0NRxrtJhZQOvRSyZcJihzAdU59WBtTjYcB0/M= -k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY= -k8s.io/apiextensions-apiserver v0.19.2/go.mod h1:EYNjpqIAvNZe+svXVx9j4uBaVhTB4C94HkY3w058qcg= -k8s.io/apiextensions-apiserver v0.24.4 h1:w53Pm4zu8fCt9WfiRgS2YI6LE6I4NJ5aUi78GElD3K8= -k8s.io/apiextensions-apiserver v0.24.4/go.mod h1:iDK+Xb4jsPNnRGj5jU/WqqjLvt8363M7cKixKe1C9+U= -k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= -k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apimachinery v0.24.4 h1:S0Ur3J/PbivTcL43EdSdPhqCqKla2NIuneNwZcTDeGQ= -k8s.io/apimachinery v0.24.4/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= -k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= -k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= -k8s.io/apiserver v0.24.4 h1:ei+OunC83pVEiagBeZhTnRZvkclHgpzs/rrm7aSBDYs= -k8s.io/apiserver v0.24.4/go.mod h1:mAuC3pZVc0IDXLx7lUHoisBOtBa1SobfLW/CI3klXQE= -k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A= -k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= -k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= -k8s.io/client-go v0.24.4 h1:hIAIJZIPyaw46AkxwyR0FRfM/pRxpUNTd3ysYu9vyRg= -k8s.io/client-go v0.24.4/go.mod h1:+AxlPWw/H6f+EJhRSjIeALaJT4tbeB/8g9BNvXGPd0Y= -k8s.io/cluster-bootstrap v0.24.4 h1:ZryK73DHK4dv5yAr5081yO03rrEK2Dz9jUtymqEle9Q= -k8s.io/cluster-bootstrap v0.24.4/go.mod h1:D9SYcEo302eah8yxFoPciGy8dRnReZr7fG+waTAvj14= -k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= -k8s.io/code-generator v0.19.2/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/code-generator v0.24.4/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w= -k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= -k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= -k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA= -k8s.io/component-base v0.24.4 h1:WEGRp06GBYVwxp5JdiRaJ1zkdOhrqucxRv/8IrABLG0= -k8s.io/component-base v0.24.4/go.mod h1:sWxkgcMfbYHadw0OJ0N+vIscd14/nqSIM2veCdg843o= -k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c= -k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -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.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= -k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715 h1:tBEbstoM+K0FiBV5KGAKQ0kuvf54v/hwpldiJt69w1s= -k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= -k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo= -k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0= -k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI= -k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200912215256-4140de9c8800/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5 h1:XmRqFcQlCy/lKRZ39j+RVpokYNroHPqV3mcBRfnhT5o= -k8s.io/utils v0.0.0-20220812165043-ad590609e2e5/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw= -sigs.k8s.io/cluster-api v1.2.8 h1:O0ZGyxGBeJaSWVptM7U0vTArAVlxCE5OtQItZ4OS2Y4= -sigs.k8s.io/cluster-api v1.2.8/go.mod h1:HmxYwjLGHia5yjFoMY8I03Ha4kXAB+VTJnHFhAmPVig= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2 h1:WjTt0uyUG+FJBodnrSzb1L3mHfkIgtgMnNQQ+NJMuT8= -sigs.k8s.io/cluster-api-provider-aws/v2 v2.0.2/go.mod h1:ZKM3W39Pl7uPuuB6mT/dWakgy1O8OcivGRCAZqSP+Hs= -sigs.k8s.io/cluster-api-provider-azure v1.6.1 h1:GpY9YLiUqovz4gwIEg2PRYOhJ5e/AG7sTHtoxzt6K4w= -sigs.k8s.io/cluster-api-provider-azure v1.6.1/go.mod h1:wM/V5BBRq+m5KCE9h5YVtMQ3qcIOsGBb7UDD/tXufko= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3 h1:D0bDtSyRIcBmuGFyW65otEh+VIz8SGioaAjYok/cK5Y= -sigs.k8s.io/cluster-api-provider-vsphere v1.5.3/go.mod h1:EIWdG6qGX1iW0U5qiMi+EDQ9gmW7pylJwKDtHOkBQ6g= -sigs.k8s.io/cluster-api/test v1.2.8 h1:kYziHLSV+KqBoQXg7STGU4ZQpClayqIyw+BTYGx71uE= -sigs.k8s.io/cluster-api/test v1.2.8/go.mod h1:55r564Dm7/eO7LH76SRE8whfg4yUnsLz5akqqej4Q+8= -sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= -sigs.k8s.io/controller-runtime v0.12.3 h1:FCM8xeY/FI8hoAfh/V4XbbYMY20gElh9yh+A98usMio= -sigs.k8s.io/controller-runtime v0.12.3/go.mod h1:qKsk4WE6zW2Hfj0G4v10EnNB2jMG1C+NTb8h+DwCoU0= -sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU= -sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= -sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= -sigs.k8s.io/kind v0.15.0 h1:Fskj234L4hjQlsScCgeYvCBIRt06cjLzc7+kbr1u8Tg= -sigs.k8s.io/kind v0.15.0/go.mod h1:cKTqagdRyUQmihhBOd+7p43DpOPRn9rHsUC08K1Jbsk= -sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI= -sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco= -sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg= -sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/tkg/hack/tools/Makefile b/tkg/hack/tools/Makefile deleted file mode 100644 index c6a99f1d0e..0000000000 --- a/tkg/hack/tools/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Build tooling that is used for the main project - -# Ensure Make is run with bash shell as some syntax below is bash-specific -SHELL := /usr/bin/env bash - -.DEFAULT_GOAL := help - -# Use GOPROXY environment variable if set -GOPROXY := $(shell go env GOPROXY) -ifeq (,$(strip $(GOPROXY))) -GOPROXY := https://proxy.golang.org -endif -export GOPROXY - -# Directories. -ROOT_DIR:=$(shell git rev-parse --show-toplevel) -BIN_DIR := bin -SRCS := go.mod go.sum - -# Binaries. -GOIMPORTS := $(BIN_DIR)/goimports - -## -------------------------------------- -## Help -## -------------------------------------- - -help: ## Display this help - @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) - -## -------------------------------------- -## Binaries -## -------------------------------------- - -goimports: $(GOIMPORTS) $(SRCS) ## Build goimports -$(GOIMPORTS): go.mod go.sum - go build -tags=tools -o $@ golang.org/x/tools/cmd/goimports - -## -------------------------------------- -## Cleanup -## -------------------------------------- - -.PHONY: clean -clean: ## Remove all generated binaries - rm -rf bin diff --git a/tkg/hack/tools/go.mod b/tkg/hack/tools/go.mod deleted file mode 100644 index 9acbd85e48..0000000000 --- a/tkg/hack/tools/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/vmware-tanzu/tanzu-framework/tkg/hack/tools - -go 1.18 - -require golang.org/x/tools v0.1.12 - -require ( - golang.org/x/mod v0.7.0 // indirect - golang.org/x/sys v0.6.0 // indirect -) diff --git a/tkg/hack/tools/go.sum b/tkg/hack/tools/go.sum deleted file mode 100644 index 72ad2d259e..0000000000 --- a/tkg/hack/tools/go.sum +++ /dev/null @@ -1,6 +0,0 @@ -golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/tkg/hack/tools/main.go b/tkg/hack/tools/main.go deleted file mode 100644 index 602e391142..0000000000 --- a/tkg/hack/tools/main.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// This file is only present to make the linter happy. - -package main - -func main() {} diff --git a/tkg/hack/tools/tools.go b/tkg/hack/tools/tools.go deleted file mode 100644 index 5f56f534e4..0000000000 --- a/tkg/hack/tools/tools.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build tools -// +build tools - -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tools imports things required by build scripts, to force `go mod` to see them as dependencies - -package tools - -import ( - _ "golang.org/x/tools/cmd/goimports" -) diff --git a/tkg/kind/client.go b/tkg/kind/client.go deleted file mode 100644 index 75c83469ac..0000000000 --- a/tkg/kind/client.go +++ /dev/null @@ -1,478 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package kind provides kind cluster functionalities -package kind - -import ( - "fmt" - "os" - "strings" - "time" - - "github.com/pelletier/go-toml/v2" - "github.com/rs/xid" - "gopkg.in/yaml.v2" - kindv1 "sigs.k8s.io/kind/pkg/apis/config/v1alpha4" - "sigs.k8s.io/kind/pkg/cluster" - "sigs.k8s.io/kind/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/cli/clientconfighelpers" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -// Kind cluster related constants -const ( - kindClusterNamePrefix = "tkg-kind-" - kindClusterWaitForReadyTime = 2 * time.Minute - kindRegistryCAPath = "/etc/containerd/tkg-registry-ca.crt" -) - -var ( - dockerMount = kindv1.Mount{ - HostPath: "/var/run/docker.sock", - ContainerPath: "/var/run/docker.sock", - } -) - -type newKindNodeInput struct { - role kindv1.NodeRole - caPath string -} - -func newKindNode(input newKindNodeInput) kindv1.Node { - node := kindv1.Node{} - if input.role != "" { - node.Role = input.role - } - node.ExtraMounts = []kindv1.Mount{dockerMount} - if input.caPath != "" { - node.ExtraMounts = append(node.ExtraMounts, - kindv1.Mount{ - HostPath: input.caPath, - ContainerPath: kindRegistryCAPath, - }, - ) - } - return node -} - -// Client is used to create/delete kubernetes-in-docker cluster -type Client interface { - // CreateKindCluster creates new kind cluster - CreateKindCluster() (string, error) - - // DeleteKindCluster deletes existing kind cluster - DeleteKindCluster() error - - // GetKindClusterName returns name of the kind cluster - GetKindClusterName() string - - // GetKindNodeImageAndConfig returns the kind node image and kind config - GetKindNodeImageAndConfig() (string, *kindv1.Cluster, error) -} - -//go:generate counterfeiter -o ../fakes/kindprovider.go --fake-name KindProvider . KindClusterProvider - -// KindClusterProvider is interface for creating/deleting kind cluster -type KindClusterProvider interface { - Create(name string, options ...cluster.CreateOption) error - Delete(name, explicitKubeconfigPath string) error - KubeConfig(name string, internal bool) (string, error) -} - -// KindClusterOptions carries options to configure kind cluster -type KindClusterOptions struct { - Provider KindClusterProvider - ClusterName string - NodeImage string - KubeConfigPath string - TKGConfigDir string - Readerwriter tkgconfigreaderwriter.TKGConfigReaderWriter - DefaultImageRepo string -} - -// KindClusterProxy return the Proxy used for operating kubernetes-in-docker clusters -type KindClusterProxy struct { - options *KindClusterOptions - caCertPath string -} - -// ensure clusterConfig implements Client interface -var _ Client = &KindClusterProxy{} - -// New returns client to interact with kind clusters -func New(options *KindClusterOptions) Client { - // create provider is nil - if options.Provider == nil { - options.Provider = cluster.NewProvider(cluster.ProviderWithLogger(NewLogger(3))) - } - return &KindClusterProxy{ - options: options, - } -} - -// CreateKindCluster creates new kind cluster -func (k *KindClusterProxy) CreateKindCluster() (string, error) { - if k.options.ClusterName == "" { - k.options.ClusterName = kindClusterNamePrefix + xid.New().String() - } - - log.V(3).Infof("Fetching configuration for kind node image...") - var config *kindv1.Cluster - var err error - k.options.NodeImage, config, err = k.GetKindNodeImageAndConfig() - if err != nil { - return "", errors.Wrap(err, "unable to get kind node image and configuration from BoM file") - } - - log.V(3).Infof("Creating kind cluster: %s", k.options.ClusterName) - - // setup proxy envvars for kind clusrer if being configured in TKG - k.setupProxyConfigurationForKindCluster() - - // create kind cluster with kind provider interface - if err := k.options.Provider.Create( - k.options.ClusterName, - cluster.CreateWithNodeImage(k.options.NodeImage), - cluster.CreateWithWaitForReady(kindClusterWaitForReadyTime), - cluster.CreateWithKubeconfigPath(k.options.KubeConfigPath), - cluster.CreateWithDisplayUsage(false), - cluster.CreateWithDisplaySalutation(false), - cluster.CreateWithV1Alpha4Config(config), - ); err != nil { - return "", errors.Wrapf(err, "failed to create kind cluster %s", k.options.ClusterName) - } - - // get kubeconfig file for the created kind cluster - _, err = k.options.Provider.KubeConfig(k.options.ClusterName, false) - if err != nil { - // delete the created kind cluster if unable to retrieve kubeconfig - _ = k.DeleteKindCluster() - return "", errors.Wrap(err, "unable to retrieve kubeconfig for created kind cluster") - } - return k.options.ClusterName, nil -} - -// DeleteKindCluster deletes existing kind cluster -func (k *KindClusterProxy) DeleteKindCluster() error { - log.V(3).Infof("Deleting kind cluster: %s", k.options.ClusterName) - // delete kind cluster with kind provider interface - if err := k.options.Provider.Delete(k.options.ClusterName, k.options.KubeConfigPath); err != nil { - return errors.Wrapf(err, "failed to delete kind cluster %s", k.options.ClusterName) - } - return nil -} - -// GetKindClusterName returns name of the kind cluster -func (k *KindClusterProxy) GetKindClusterName() string { - return "kind-" + k.options.ClusterName -} - -// GetKindNodeImageAndConfig return the Kind node Image full path and configuration details -func (k *KindClusterProxy) GetKindNodeImageAndConfig() (string, *kindv1.Cluster, error) { - bomConfiguration, err := tkgconfigbom.New(k.options.TKGConfigDir, k.options.Readerwriter).GetDefaultTkgBOMConfiguration() - if err != nil { - return "", nil, errors.Wrap(err, "unable to get default BoM file") - } - - kindNodeImage, exists := bomConfiguration.Components["kubernetes-sigs_kind"][0].Images["kindNodeImage"] - if !exists { - return "", nil, errors.New("unable to read 'kindNodeImage' from BoM file") - } - - if len(bomConfiguration.KindKubeadmConfigSpec) == 0 { - return "", nil, errors.New("unable to read kind configuration") - } - - kindKubeadmConfigSpec := strings.Join(bomConfiguration.KindKubeadmConfigSpec, "\n") - - // TODO @randomvariable: Once the BOM includes coredns and etcd, switch over to generating the patch programatically - kindConfigData := []byte(strings.ReplaceAll(kindKubeadmConfigSpec, "v1beta2", "v1beta3")) - - kindConfig := &kindv1.Cluster{} - err = yaml.Unmarshal(kindConfigData, kindConfig) - if err != nil { - return "", nil, errors.Wrap(err, "unable to parse kind configuration") - } - - kindNodeImageString := tkgconfigbom.GetFullImagePath(kindNodeImage, bomConfiguration.ImageConfig.ImageRepository) + ":" + kindNodeImage.Tag - - caCertFilePath, err := k.getDockerRegistryCACertFilePath() - if err != nil { - return "", nil, errors.Wrap(err, "unable to generate CA cert file") - } - - defaultNode := newKindNode(newKindNodeInput{ - caPath: caCertFilePath, - }) - - kindConfig.Nodes = []kindv1.Node{defaultNode} - - kindRegistryConfig, err := k.getKindRegistryConfig() - if err != nil { - return "", nil, errors.Wrap(err, "unable to generate kind containerdConfigPatches") - } - - kindConfig.Networking = k.getKindNetworkingConfig() - - if kindRegistryConfig != "" { - kindConfig.ContainerdConfigPatches = []string{kindRegistryConfig} - } - - log.V(3).Infof("kindConfig: \n %v", kindConfig) - return kindNodeImageString, kindConfig, nil -} - -// Return the containerdConfigPatches field for kind Cluster object -func (k *KindClusterProxy) getKindRegistryConfig() (string, error) { - tkgconfigClient := tkgconfigbom.New(k.options.TKGConfigDir, k.options.Readerwriter) - - customRepositoryCaCert, caCertErr := k.getDockerRegistryCACertFilePath() - customRepository, repoErr := tkgconfigClient.GetCustomRepository() - if (caCertErr != nil || customRepositoryCaCert == "") && (repoErr != nil || customRepository == "") { - return "", nil - } - - if caCertErr != nil { - return "", caCertErr - } - - hostname := k.ResolveHostname(customRepository) - - registryTLSConfig := criRegistryTLSConfig{ - InsecureSkipVerify: tkgconfigClient.IsCustomRepositorySkipTLSVerify(), - } - - if customRepositoryCaCert != "" { - registryTLSConfig.CAFile = kindRegistryCAPath - } - - config := containerDConfig{ - Plugins: map[string]interface{}{ - "io.containerd.grpc.v1.cri": criConfig{ - Registry: criRegistry{ - Configs: map[string]criRegistryConfig{ - hostname: { - TLS: registryTLSConfig, - }, - }, - }, - }, - }, - } - - configData, err := toml.Marshal(config) - if err != nil { - return "", err - } - - return string(configData), nil -} - -// Create the CA certificate file for the private Docker Registry on local machine -// and this file will be mounted into the kind cluster node. -// Return the full path of the CA certificate file. -func (k *KindClusterProxy) createDockerRegistryCACertFile(customRepositoryCaCert []byte) (string, error) { - tempCACertFilePath, err := utils.CreateTempFile("", "tkg-registry-ca.crt") - if err != nil { - return "", errors.Wrap(err, fmt.Sprintf("failed to create custom repository CA certificate file %s", tempCACertFilePath)) - } - err = os.WriteFile(tempCACertFilePath, customRepositoryCaCert, 0o644) - if err != nil { - return "", errors.Wrap(err, fmt.Sprintf("failed to write custom repository CA certificate file %s", tempCACertFilePath)) - } - return tempCACertFilePath, nil -} - -func (k *KindClusterProxy) getDockerRegistryCACertFilePath() (string, error) { - if k.caCertPath != "" { - return k.caCertPath, nil - } - customRepositoryCaCert, err := clientconfighelpers.GetCustomRepositoryCaCertificateForClient(k.options.Readerwriter) - if err != nil { - return "", err - } - if len(customRepositoryCaCert) > 0 { - // Create a temp file with the content of customRepositoryCaCert when the CA cert is specified - k.caCertPath, err = k.createDockerRegistryCACertFile(customRepositoryCaCert) - if err != nil { - return "", err - } - } - - return k.caCertPath, nil -} - -type containerDConfig struct { - Plugins map[string]interface{} `toml:"plugins"` -} - -type criConfig struct { - Registry criRegistry `toml:"registry"` -} - -type criRegistry struct { - Configs map[string]criRegistryConfig `toml:"configs"` -} - -type criRegistryConfig struct { - TLS criRegistryTLSConfig `toml:"tls"` -} - -type criRegistryTLSConfig struct { - InsecureSkipVerify bool `toml:"insecure_skip_verify"` - CAFile string `toml:"ca_file"` -} - -// Return the networking field for kind Cluster object -// set the podSubnet and serviceSubnet fields -// if TKG_IP_FAMILY is set then set the ipFamily field -func (k *KindClusterProxy) getKindNetworkingConfig() kindv1.Networking { - ipFamily, err := k.options.Readerwriter.Get(constants.ConfigVariableIPFamily) - if err != nil { - // ignore this error as TKG_IP_FAMILY is optional - ipFamily = "" - } - - return kindv1.Networking{ - PodSubnet: k.podSubnet(ipFamily), - ServiceSubnet: k.serviceSubnet(ipFamily), - IPFamily: k.getKindIPFamily(), - } -} - -// if TKG_IP_FAMILY is set then set the networking field -func (k *KindClusterProxy) getKindIPFamily() kindv1.ClusterIPFamily { - ipFamily, err := k.options.Readerwriter.Get(constants.ConfigVariableIPFamily) - if err != nil { - // ignore this error as TKG_IP_FAMILY is optional - ipFamily = "" - } - - switch strings.ToLower(ipFamily) { - case constants.IPv4Family: - return kindv1.IPv4Family - case constants.IPv6Family: - return kindv1.IPv6Family - case constants.DualStackPrimaryIPv4Family, constants.DualStackPrimaryIPv6Family: - return kindv1.DualStackFamily - default: - return "" - } -} - -// podSubnet returns the pod subnet(s) from the cluster cidr config variable. -// If the cluster cidr config variable is not provided then it will return the -// default cluster cidr based on what IP family is set. In the case of an IP -// family of ipv6,ipv4 the pod subnets will be reversed because Kind only -// supports ipv4,ipv6 subnet, until the issue is fixed in -// https://github.com/kubernetes-sigs/kind/issues/2484. -func (k *KindClusterProxy) podSubnet(ipFamily string) string { - podSubnet, err := k.options.Readerwriter.Get(constants.ConfigVariableClusterCIDR) - if err != nil { - switch ipFamily { - // We expect the IPv4,IPv6 order for the CIDR in both cases for KinD until - // we bump to a version of the kind library that includes a fix for this issue: - // https://github.com/kubernetes-sigs/kind/issues/2484 - case constants.DualStackPrimaryIPv4Family, constants.DualStackPrimaryIPv6Family: - return constants.DefaultDualStackPrimaryIPv4ClusterCIDR - case constants.IPv6Family: - return constants.DefaultIPv6ClusterCIDR - default: - return constants.DefaultIPv4ClusterCIDR - } - } - - return k.reverseCIDRsIfIPFamilyDualstackIPV6Primary(ipFamily, podSubnet) -} - -// serviceSubnet returns the service subnet(s) from the service cidr config -// variable. If the service cidr config variable is not provided then it will -// return the default service cidr based on what IP family is set. In the case -// of an IP family of ipv6,ipv4 the service subnets will be reversed because Kind -// only supports ipv4,ipv6 subnet, until the issue is fixed in -// https://github.com/kubernetes-sigs/kind/issues/2484. -func (k *KindClusterProxy) serviceSubnet(ipFamily string) string { - serviceSubnet, err := k.options.Readerwriter.Get(constants.ConfigVariableServiceCIDR) - if err != nil { - switch ipFamily { - // We expect the IPv4,IPv6 order for the CIDR in both cases for KinD until - // we bump to a version of the kind library that includes a fix for this issue: - // https://github.com/kubernetes-sigs/kind/issues/2484 - case constants.DualStackPrimaryIPv4Family, constants.DualStackPrimaryIPv6Family: - return constants.DefaultDualStackPrimaryIPv4ServiceCIDR - case constants.IPv6Family: - return constants.DefaultIPv6ServiceCIDR - default: - return constants.DefaultIPv4ServiceCIDR - } - } - - return k.reverseCIDRsIfIPFamilyDualstackIPV6Primary(ipFamily, serviceSubnet) -} - -// reverseCIDRsIfIPFamilyDualstackIPV6Primary reverses the comma separated list of -// CIDRs if the ipFamily is "ipv6,ipv4". -func (k *KindClusterProxy) reverseCIDRsIfIPFamilyDualstackIPV6Primary(ipFamily, cidrString string) string { - if ipFamily == constants.DualStackPrimaryIPv6Family { - // We expect the IPv4,IPv6 order for the CIDR in both cases for KinD until - // we bump to a version of the kind library that includes a fix for this issue: - // https://github.com/kubernetes-sigs/kind/issues/2484 - subnets := strings.Split(cidrString, ",") - return fmt.Sprintf("%s,%s", subnets[1], subnets[0]) - } - - return cidrString -} - -// setupProxyConfigurationForKindCluster sets up proxy configuration for kind cluster -// -// This function takes HTTP_PROXY, HTTPS_PROXY, NO_PROXY variable into consideration as well. -// The precedence of the configuration variable is as below: -// 1. HTTP_PROXY , HTTPS_PROXY , NO_PROXY -// 2. TKG_HTTP_PROXY , TKG_HTTPS_PROXY , TKG_NO_PROXY -// -// Meaning if User has provided env variable for HTTP_PROXY that will have higher precedence than -// TKG_HTTP_PROXY when using it with kind cluster. -// -// This will allow user to configure different proxy configuration for kind cluster than the -// proxy configuration needed for management/workload cluster deployment -func (k *KindClusterProxy) setupProxyConfigurationForKindCluster() { - var httpProxy, httpsProxy, noProxy, tkgHTTPProxy, tkgHTTPSProxy, tkgNoProxy string - - httpProxy, _ = k.options.Readerwriter.Get(constants.HTTPProxy) - httpsProxy, _ = k.options.Readerwriter.Get(constants.HTTPSProxy) - noProxy, _ = k.options.Readerwriter.Get(constants.NoProxy) - - if proxyEnabled, err := k.options.Readerwriter.Get(constants.TKGHTTPProxyEnabled); err == nil && proxyEnabled == "true" { - tkgHTTPProxy, _ = k.options.Readerwriter.Get(constants.TKGHTTPProxy) - tkgHTTPSProxy, _ = k.options.Readerwriter.Get(constants.TKGHTTPSProxy) - tkgNoProxy, _ = k.options.Readerwriter.Get(constants.TKGNoProxy) - } - - if httpProxy == "" && tkgHTTPProxy != "" { - httpProxy = tkgHTTPProxy - } - if httpsProxy == "" && tkgHTTPSProxy != "" { - httpsProxy = tkgHTTPSProxy - } - if noProxy == "" && tkgNoProxy != "" { - noProxy = tkgNoProxy - } - - if httpProxy != "" { - os.Setenv(constants.HTTPProxy, httpProxy) - } - if httpsProxy != "" { - os.Setenv(constants.HTTPSProxy, httpsProxy) - } - if noProxy != "" { - noProxyList := strings.Split(noProxy, ",") - os.Setenv(constants.NoProxy, strings.Join(append(noProxyList, fmt.Sprintf("%s-control-plane", k.options.ClusterName)), ",")) - } -} diff --git a/tkg/kind/client_test.go b/tkg/kind/client_test.go deleted file mode 100644 index 1ea97d86be..0000000000 --- a/tkg/kind/client_test.go +++ /dev/null @@ -1,352 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package kind_test - -import ( - "errors" - "fmt" - "os" - "path/filepath" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - kindv1 "sigs.k8s.io/kind/pkg/apis/config/v1alpha4" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" - "github.com/vmware-tanzu/tanzu-framework/tkg/kind" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -var ( - testingDir string - defaultBoMFileForTesting = "../fakes/config/bom/tkg-bom-v1.3.1.yaml" - configPath = "../fakes/config/config6.yaml" - configPathCustomRegistrySkipTLSVerify = "../fakes/config/config_custom_registry_skip_tls_verify.yaml" - configPathCustomRegistryCaCert = "../fakes/config/config_custom_registry_ca_cert.yaml" - configPathIPv6 = "../fakes/config/config_ipv6.yaml" - configPathIPv4 = "../fakes/config/config_ipv4.yaml" - configPathIPv4IPv6 = "../fakes/config/config_ipv4_ipv6.yaml" - configPathIPv6IPv4 = "../fakes/config/config_ipv6_ipv4.yaml" - configPathIPv6IPv4WithCIDRS = "../fakes/config/config_ipv6_ipv4_with_cidrs.yaml" - configPathCIDR = "../fakes/config/config_cluster_service_cidr.yaml" - registryHostname = "registry.mydomain.com" -) - -func TestKind(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Kind Suite") -} - -var ( - kindClient kind.Client - kindProvider *fakes.KindProvider - err error - clusterName string - kindConfig *kindv1.Cluster -) - -var _ = Describe("Kind Client", func() { - BeforeSuite(func() { - os.Unsetenv(constants.ConfigVariableCustomImageRepository) - testingDir = fakehelper.CreateTempTestingDirectory() - }) - - AfterSuite(func() { - fakehelper.DeleteTempTestingDirectory(testingDir) - }) - - Context("When TKG_CUSTOM_IMAGE_REPOSITORY is not set", func() { - BeforeEach(func() { - setupTestingFiles(configPath, testingDir, defaultBoMFileForTesting) - kindClient = buildKindClient() - }) - - Describe("Create bootstrap kind cluster", func() { - JustBeforeEach(func() { - clusterName, err = kindClient.CreateKindCluster() - }) - - Context("When kind provider fails to create kind cluster", func() { - BeforeEach(func() { - kindProvider.CreateReturns(errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("failed to create kind cluster")) - }) - }) - - Context("When kind provider create kind cluster but unable to retrieve kubeconfig", func() { - BeforeEach(func() { - kindProvider.CreateReturns(nil) - kindProvider.KubeConfigReturns("", errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("unable to retrieve kubeconfig for created kind cluster")) - }) - }) - - Context("When kind provider create kind cluster and able to retrieve kubeconfig successfully", func() { - BeforeEach(func() { - kindProvider.CreateReturns(nil) - kindProvider.KubeConfigReturns("fake-kube-config", nil) - }) - It("does not return error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(clusterName).To(Equal("clusterName")) - }) - }) - }) - - Describe("Delete bootstrap kind cluster", func() { - JustBeforeEach(func() { - err = kindClient.DeleteKindCluster() - }) - - Context("When kind provider fails to delete kind cluster", func() { - BeforeEach(func() { - kindProvider.DeleteReturns(errors.New("fake-error")) - }) - It("returns an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(HavePrefix("failed to delete kind cluster")) - }) - }) - - Context("When kind provider deletes kind cluster successfully", func() { - BeforeEach(func() { - kindProvider.DeleteReturns(nil) - }) - It("returns an error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) - }) - - Context("When TKG_CUSTOM_IMAGE_REPOSITORY is set", func() { - Context("When TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY is set to true", func() { - BeforeEach(func() { - setupTestingFiles(configPathCustomRegistrySkipTLSVerify, testingDir, defaultBoMFileForTesting) - kindClient = buildKindClient() - _, kindConfig, err = kindClient.GetKindNodeImageAndConfig() - Expect(err).NotTo(HaveOccurred()) - }) - - Describe("Generate kind cluster config", func() { - It("generates 'insecure_skip_verify = true' in containerdConfigPatches", func() { - Expect(kindConfig.ContainerdConfigPatches[0]).Should(ContainSubstring(fmt.Sprintf("plugins.'io.containerd.grpc.v1.cri'.registry.configs.'%s'.tls", registryHostname))) - Expect(kindConfig.ContainerdConfigPatches[0]).Should(ContainSubstring("insecure_skip_verify = true")) - Expect(kindConfig.ContainerdConfigPatches[0]).ShouldNot(ContainSubstring("ca_file = '/etc/containerd/tkg-registry-ca.crt'")) - Expect(len(kindConfig.Nodes[0].ExtraMounts)).To(Equal(1)) - }) - }) - }) - - Context("When TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE is set to non-empty string", func() { - BeforeEach(func() { - setupTestingFiles(configPathCustomRegistryCaCert, testingDir, defaultBoMFileForTesting) - kindClient = buildKindClient() - _, kindConfig, err = kindClient.GetKindNodeImageAndConfig() - Expect(err).NotTo(HaveOccurred()) - }) - - Describe("Generate kind cluster config", func() { - It("generates ca_file config in containerdConfigPatches", func() { - Expect(kindConfig.ContainerdConfigPatches[0]).Should(ContainSubstring(fmt.Sprintf("plugins.'io.containerd.grpc.v1.cri'.registry.configs.'%s'.tls", registryHostname))) - Expect(kindConfig.ContainerdConfigPatches[0]).Should(ContainSubstring("insecure_skip_verify = false")) - Expect(kindConfig.ContainerdConfigPatches[0]).Should(ContainSubstring("ca_file = '/etc/containerd/tkg-registry-ca.crt'")) - Expect(kindConfig.Nodes[0].ExtraMounts[1].ContainerPath).Should(ContainSubstring("/etc/containerd/tkg-registry-ca.crt")) - }) - }) - }) - }) - - Context("When TKG_IP_FAMILY is unset", func() { - BeforeEach(func() { - setupTestingFiles(configPath, testingDir, defaultBoMFileForTesting) - kindClient = buildKindClient() - _, kindConfig, err = kindClient.GetKindNodeImageAndConfig() - Expect(err).NotTo(HaveOccurred()) - }) - - It("generates a config with ipfamily omitted", func() { - Expect(string(kindConfig.Networking.IPFamily)).To(Equal("")) - }) - - Context("When CLUSTER_CIDR and SERVICE_CIDR are not set", func() { - It("generates a config with default pod and service subnet", func() { - Expect(kindConfig.Networking.PodSubnet).To(Equal("100.96.0.0/11")) - Expect(kindConfig.Networking.ServiceSubnet).To(Equal("100.64.0.0/13")) - }) - }) - }) - - Context("When TKG_IP_FAMILY is ipv4", func() { - BeforeEach(func() { - setupTestingFiles(configPathIPv4, testingDir, defaultBoMFileForTesting) - kindClient = buildKindClient() - _, kindConfig, err = kindClient.GetKindNodeImageAndConfig() - Expect(err).NotTo(HaveOccurred()) - }) - - It("generates a config with ipfamily set to ipv4", func() { - Expect(kindConfig.Networking.IPFamily).To(Equal(kindv1.IPv4Family)) - }) - }) - - Context("When TKG_IP_FAMILY is ipv6", func() { - BeforeEach(func() { - setupTestingFiles(configPathIPv6, testingDir, defaultBoMFileForTesting) - kindClient = buildKindClient() - _, kindConfig, err = kindClient.GetKindNodeImageAndConfig() - Expect(err).NotTo(HaveOccurred()) - }) - - It("generates a config with ipfamily set to ipv6", func() { - Expect(kindConfig.Networking.IPFamily).To(Equal(kindv1.IPv6Family)) - }) - - Context("When CLUSTER_CIDR and SERVICE_CIDR are not set", func() { - It("generates a config with default pod and service subnet", func() { - Expect(kindConfig.Networking.PodSubnet).To(Equal("fd00:100:96::/48")) - Expect(kindConfig.Networking.ServiceSubnet).To(Equal("fd00:100:64::/108")) - }) - }) - }) - - Context("When TKG_IP_FAMILY is ipv4,ipv6", func() { - BeforeEach(func() { - setupTestingFiles(configPathIPv4IPv6, testingDir, defaultBoMFileForTesting) - kindClient = buildKindClient() - _, kindConfig, err = kindClient.GetKindNodeImageAndConfig() - Expect(err).NotTo(HaveOccurred()) - }) - - It("generates a config with ipfamily set to dual", func() { - Expect(kindConfig.Networking.IPFamily).To(Equal(kindv1.DualStackFamily)) - }) - - Context("When CLUSTER_CIDR and SERVICE_CIDR are not set", func() { - It("generates a config with default pod and service subnet", func() { - Expect(kindConfig.Networking.PodSubnet).To(Equal("100.96.0.0/11,fd00:100:96::/48")) - Expect(kindConfig.Networking.ServiceSubnet).To(Equal("100.64.0.0/13,fd00:100:64::/108")) - }) - }) - }) - - Context("When TKG_IP_FAMILY is ipv6,ipv4 and config vars are unset", func() { - // This context should never happen, the initRegion code will always - // ensure there's a default value set if the user has not provided one. - BeforeEach(func() { - setupTestingFiles(configPathIPv6IPv4, testingDir, defaultBoMFileForTesting) - kindClient = buildKindClient() - _, kindConfig, err = kindClient.GetKindNodeImageAndConfig() - Expect(err).NotTo(HaveOccurred()) - }) - - It("generates a config with ipfamily set to dual", func() { - Expect(kindConfig.Networking.IPFamily).To(Equal(kindv1.DualStackFamily)) - }) - - It("generates a config with default pod and service subnet", func() { - Expect(kindConfig.Networking.PodSubnet).To(Equal("100.96.0.0/11,fd00:100:96::/48")) - Expect(kindConfig.Networking.ServiceSubnet).To(Equal("100.64.0.0/13,fd00:100:64::/108")) - }) - }) - - Context("When TKG_IP_FAMILY is ipv6,ipv4 and SERVICE_CIDR and CLUSTER_CIDR are set", func() { - BeforeEach(func() { - setupTestingFiles(configPathIPv6IPv4WithCIDRS, testingDir, defaultBoMFileForTesting) - kindClient = buildKindClient() - _, kindConfig, err = kindClient.GetKindNodeImageAndConfig() - Expect(err).NotTo(HaveOccurred()) - }) - - It("generates a config with ipfamily set to dual", func() { - Expect(kindConfig.Networking.IPFamily).To(Equal(kindv1.DualStackFamily)) - }) - - It("generates a config with default pod and service subnet in ipv4,ipv6 order because Kind's dualstack family is ipv4,ipv6", func() { - Expect(kindConfig.Networking.PodSubnet).To(Equal("100.96.0.0/11,fd00:100:96::/48")) - Expect(kindConfig.Networking.ServiceSubnet).To(Equal("1.2.3.4/16,fd00::/48")) - }) - }) - - Context("When CLUSTER_CIDR and SERVICE_CIDR are explicitly set", func() { - BeforeEach(func() { - setupTestingFiles(configPathCIDR, testingDir, defaultBoMFileForTesting) - kindClient = buildKindClient() - _, kindConfig, err = kindClient.GetKindNodeImageAndConfig() - Expect(err).NotTo(HaveOccurred()) - }) - - It("generates a config with specified pod and service subnet", func() { - Expect(kindConfig.Networking.PodSubnet).To(Equal("200.200.200.0/24")) - Expect(kindConfig.Networking.ServiceSubnet).To(Equal("250.250.250.0/24")) - }) - }) -}) - -func buildKindClient() kind.Client { - tkgConfigReaderWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - - kindProvider = &fakes.KindProvider{} - options := kind.KindClusterOptions{ - Provider: kindProvider, - ClusterName: "clusterName", - NodeImage: "nodeImage", - KubeConfigPath: "kubeConfigPath", - TKGConfigDir: testingDir, - Readerwriter: tkgConfigReaderWriter, - } - return kind.New(&options) -} - -var testTKGCompatibilityFileFmt = ` -version: v1 -managementClusterPluginVersions: -- version: %s - supportedTKGBomVersions: - - imagePath: tkg-bom - tag: %s -` - -func setupTestingFiles(clusterConfigFile string, configDir string, defaultBomFile string) { - testClusterConfigFile := filepath.Join(configDir, "config.yaml") - err := utils.CopyFile(clusterConfigFile, testClusterConfigFile) - Expect(err).ToNot(HaveOccurred()) - - bomDir, err := tkgconfigpaths.New(configDir).GetTKGBoMDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - err = os.MkdirAll(bomDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - err = utils.CopyFile(defaultBomFile, filepath.Join(bomDir, filepath.Base(defaultBomFile))) - Expect(err).ToNot(HaveOccurred()) - - compatibilityDir, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(compatibilityDir); os.IsNotExist(err) { - err = os.MkdirAll(compatibilityDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - defaultBomFileTag := utils.GetTKGBoMTagFromFileName(filepath.Base(defaultBomFile)) - testTKGCompatabilityFileContent := fmt.Sprintf(testTKGCompatibilityFileFmt, tkgconfigpaths.TKGManagementClusterPluginVersion, defaultBomFileTag) - - compatibilityConfigFile, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityConfigPath() - Expect(err).ToNot(HaveOccurred()) - err = os.WriteFile(compatibilityConfigFile, []byte(testTKGCompatabilityFileContent), constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) -} diff --git a/tkg/kind/logger.go b/tkg/kind/logger.go deleted file mode 100644 index fe499ded78..0000000000 --- a/tkg/kind/logger.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package kind - -import ( - "fmt" - "strings" - - "sigs.k8s.io/kind/pkg/log" - - logt "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// NewLogger creates logger to retrieve kind cluster provider logs -func NewLogger(logLevel log.Level) log.Logger { - return &Logger{ - level: logLevel, - } -} - -// NewLoggerWithChannel creates logger to retrieve kind cluster provider logs with channel -func NewLoggerWithChannel(ch chan string, logLevel log.Level) log.Logger { - return &Logger{ - ch: ch, - } -} - -// Logger implements interface to retrieve logs from kind cluster provider -type Logger struct { - ch chan string - level log.Level -} - -// Warn should be used to write user facing warnings -func (l *Logger) Warn(message string) { - write(message, l.ch, l.level) -} - -// Warnf should be used to write Printf style user facing warnings -func (l *Logger) Warnf(format string, args ...interface{}) { - message := fmt.Sprintf(format, args...) - write(message, l.ch, l.level) -} - -// Error may be used to write an error message when it occurs -// Prefer returning an error instead in most cases -func (l *Logger) Error(message string) { - write(message, l.ch, l.level) -} - -// Errorf may be used to write a Printf style error message when it occurs -// Prefer returning an error instead in most cases -func (l *Logger) Errorf(format string, args ...interface{}) { - message := fmt.Sprintf(format, args...) - write(message, l.ch, l.level) -} - -// V returns an InfoLogger for a given verbosity Level -func (l *Logger) V(level log.Level) log.InfoLogger { - return &InfoLogger{ - ch: l.ch, - level: level, - enabled: level <= l.level, - } -} - -// InfoLogger defines the info logging interface kind uses -type InfoLogger struct { - ch chan string - level log.Level - enabled bool -} - -// Info is used to write a user facing status message -func (l *InfoLogger) Info(message string) { - if l.enabled { - write(message, l.ch, l.level) - } -} - -// Infof is used to write a Printf style user facing status message -func (l *InfoLogger) Infof(format string, args ...interface{}) { - if l.enabled { - message := fmt.Sprintf(format, args...) - write(message, l.ch, l.level) - } -} - -// Enabled should return true if this verbosity level is enabled -func (l *InfoLogger) Enabled() bool { - return false -} - -// TODO: check if we should include other characters or not -func write(message string, ch chan string, logLevel log.Level) { - // Skip status message which prints the same message again with success/failure - // character at the start of the log. - if strings.HasPrefix(message, " ✗ ") || strings.HasPrefix(message, " ✓ ") { - return - } - - // Also skip all not ascii characters from the logs - cleanMessage := []rune{} - lastchar := rune(32) - for _, c := range message { - if int(c) < 32 || int(c) > 126 || (lastchar == ' ' && c == lastchar) { - continue - } - lastchar = c - cleanMessage = append(cleanMessage, c) - } - if ch == nil { - if logLevel <= 1 { - logt.V(3).Info(string(cleanMessage)) - } else { - logt.V(7).Info(string(cleanMessage)) - } - } else { - ch <- string(cleanMessage) - } -} diff --git a/tkg/kind/utils.go b/tkg/kind/utils.go deleted file mode 100644 index 8f67fd862a..0000000000 --- a/tkg/kind/utils.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package kind provides kind cluster functionalities -package kind - -import "strings" - -func (k *KindClusterProxy) ResolveHostname(repositoryPath string) string { - hostname := "" - if repositoryPath != "" { - hostname = strings.Split(repositoryPath, "/")[0] - } else { - hostname = strings.Split(k.options.DefaultImageRepo, "/")[0] - } - return hostname -} diff --git a/tkg/kind/utils_test.go b/tkg/kind/utils_test.go deleted file mode 100644 index 833587d4a1..0000000000 --- a/tkg/kind/utils_test.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package kind - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var ( - kindClusterProxy KindClusterProxy -) - -var _ = Describe("Kind Client", func() { - BeforeEach(func() { - kindClusterProxy = KindClusterProxy{ - options: &KindClusterOptions{DefaultImageRepo: "test-repo/tkg"}, - } - }) - Describe("Only image repository hostname should be used", func() { - Context("Custom Image Repository not set", func() { - It("Default hostname from the imagerepos in the TKG BOM should be returned", func() { - hostName := kindClusterProxy.ResolveHostname("") - Expect(hostName).To(Equal("test-repo")) - }) - }) - - Context("Custom Image Repository is set", func() { - It("Default hostname from the imagerepos in the TKG BOM should be returned", func() { - customImageRepo := "test-custom-repo/tkg" - hostName := kindClusterProxy.ResolveHostname(customImageRepo) - Expect(hostName).To(Equal("test-custom-repo")) - }) - }) - }) -}) diff --git a/tkg/ldap/client.go b/tkg/ldap/client.go deleted file mode 100644 index a1b7f32c16..0000000000 --- a/tkg/ldap/client.go +++ /dev/null @@ -1,221 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ldap - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "strings" - - "github.com/pkg/errors" - - ldapApi "github.com/go-ldap/ldap/v3" - - tkg_models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -const ( - testSuccessCode = 1 - testSuccessDesc = "The test has passed" - testSkippedCode = 2 - testSkippedDesc = "The test is skipped" -) - -var ( - resultSuccess = &tkg_models.LdapTestResult{ - Code: testSuccessCode, - Desc: testSuccessDesc, - } - - resultSkipped = &tkg_models.LdapTestResult{ - Code: testSkippedCode, - Desc: testSkippedDesc, - } -) - -type client struct { - params *tkg_models.LdapParams - conn *ldapApi.Conn -} - -// New creates a new LDAP client -func New() Client { - return &client{ - params: nil, - conn: nil, - } -} - -// LdapConnect verifies the reachability of the LDAP server -func (c *client) LdapConnect(params *tkg_models.LdapParams) (*tkg_models.LdapTestResult, error) { - c.params = params - var err error - - // Verify if we can connect to the server. - // If we are unable to connect, we expect the error message - // would contain meaningful information, be it a a URL issue - // or a certificate one. - ca := strings.TrimSpace(params.LdapRootCa) - if len(ca) > 0 { - caCertPool := x509.NewCertPool() - caCertPool.AppendCertsFromPEM([]byte(ca)) - tlsConfig := &tls.Config{ //nolint:gosec - RootCAs: caCertPool, - InsecureSkipVerify: false, - } - - c.conn, err = ldapApi.DialURL(params.LdapURL, ldapApi.DialWithTLSConfig(tlsConfig)) - } else { - c.conn, err = ldapApi.DialURL(params.LdapURL) - } - - if err != nil { - return nil, errors.Wrap(err, `unable to connect to `+params.LdapURL) - } - - return resultSuccess, nil -} - -// LdapBind verifies username and password is properly authenticated via bind -// Note that BindDn amd BindPassword are not must-haves in order to create -// a connection -func (c *client) LdapBind() (*tkg_models.LdapTestResult, error) { - dn := c.params.LdapBindDn - password := strings.TrimSpace(c.params.LdapBindPassword) - if len(dn) > 0 && len(password) > 0 { - err := c.conn.Bind(dn, password) - if err != nil { - return nil, errors.Wrap(err, `unable to connect to `+c.params.LdapURL) - } - } else { - return resultSkipped, nil - } - - return resultSuccess, nil -} - -// LdapUserSearch verifies user search function is able to locate the user -func (c *client) LdapUserSearch() (*tkg_models.LdapTestResult, error) { - if c.params.LdapTestUser == "" { - return resultSkipped, nil - } - - baseDn := strings.TrimSpace(c.params.LdapUserSearchBaseDn) - filter := strings.TrimSpace(c.params.LdapUserSearchFilter) - uid := strings.TrimSpace(c.params.LdapUserSearchUsername) - - attrs := []string{} - if filter != "" && c.params.LdapTestUser != "" { - filter = fmt.Sprintf("(&%s(CN=%s))", filter, ldapApi.EscapeFilter(c.params.LdapTestUser)) - } else if filter == "" && c.params.LdapTestUser != "" { - filter = fmt.Sprintf("(CN=%s)", ldapApi.EscapeFilter(c.params.LdapTestUser)) - } - - if len(baseDn+filter+uid) > 0 { // perform this verification iff we have at least one input - if len(uid) > 0 { - attrs = []string{uid} - } - - scope := ldapApi.ScopeBaseObject - if c.params.LdapTestUser != "" { - scope = ldapApi.ScopeWholeSubtree - } - - searchReq := ldapApi.NewSearchRequest( - baseDn, - scope, - 0, - 0, - 0, - false, - filter, - attrs, - []ldapApi.Control{}) - - rs, err := c.conn.Search(searchReq) - - if err != nil { - return nil, errors.Wrap(err, `user search test failed`) - } - - if c.params.LdapTestUser != "" && len(rs.Entries) == 0 { - return nil, errors.Errorf(`Unable to find user: '%s'`, c.params.LdapTestUser) - } - } else { - return resultSkipped, nil - } - - return resultSuccess, nil -} - -// LdapGroupSearch verifies group search is able to locate group -func (c *client) LdapGroupSearch() (*tkg_models.LdapTestResult, error) { - if c.params.LdapTestGroup == "" { - return resultSkipped, nil - } - - attrs := []string{} - if len(c.params.LdapGroupSearchNameAttr) > 0 { - attrs = append(attrs, c.params.LdapGroupSearchNameAttr) - } - - if len(c.params.LdapGroupSearchUserAttr) > 0 { - attrs = append(attrs, c.params.LdapGroupSearchUserAttr) - } - - if len(c.params.LdapGroupSearchGroupAttr) > 0 { - attrs = append(attrs, c.params.LdapGroupSearchGroupAttr) - } - - if len(c.params.LdapGroupSearchBaseDn+ - c.params.LdapGroupSearchFilter+ - c.params.LdapGroupSearchNameAttr+ - c.params.LdapGroupSearchUserAttr+ - c.params.LdapGroupSearchGroupAttr) > 0 { - filter := strings.TrimSpace(c.params.LdapGroupSearchFilter) - - if filter != "" && c.params.LdapTestGroup != "" { - filter = fmt.Sprintf("(&%s(OU=%s))", filter, ldapApi.EscapeFilter(c.params.LdapTestGroup)) - } else if filter == "" && c.params.LdapTestGroup != "" { - filter = fmt.Sprintf("(OU=%s)", ldapApi.EscapeFilter(c.params.LdapTestGroup)) - } - - scope := ldapApi.ScopeSingleLevel - if c.params.LdapTestGroup != "" { - scope = ldapApi.ScopeWholeSubtree - } - - searchReq := ldapApi.NewSearchRequest(c.params.LdapGroupSearchBaseDn, - scope, - 0, - 0, - 0, - false, - filter, - attrs, - []ldapApi.Control{}) - - rs, err := c.conn.Search(searchReq) - - if err != nil { - return nil, errors.Wrap(err, `group search test failed`) - } - - if c.params.LdapTestGroup != "" && len(rs.Entries) == 0 { - return nil, errors.Errorf(`Unable to find group: '%s'`, c.params.LdapTestGroup) - } - } else { - return resultSkipped, nil - } - - return resultSuccess, nil -} - -// LdapCloseConnection closes the LDAP connection -func (c *client) LdapCloseConnection() { - if c.conn != nil { - c.conn.Close() - } -} diff --git a/tkg/ldap/client_integration_test.go b/tkg/ldap/client_integration_test.go deleted file mode 100644 index 5310320017..0000000000 --- a/tkg/ldap/client_integration_test.go +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package ldap - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - tkg_models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -var ldapClient *client - -var ldapRootCa = ` - -----BEGIN CERTIFICATE----- -MIIGWDCCBUCgAwIBAgIQCl8RTQNbF5EX0u/UA4w/OzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA4MDQwMjEyMDAwMFoXDTIyMDQwMzAwMDAwMFowZjEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTElMCMGA1UEAxMcRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -Q0EtMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9hCikQH17+NDdR -CPge+yLtYb4LDXBMUGMmdRW5QYiXtvCgFbsIYOBC6AUpEIc2iihlqO8xB3RtNpcv -KEZmBMcqeSZ6mdWOw21PoF6tvD2Rwll7XjZswFPPAAgyPhBkWBATaccM7pxCUQD5 -BUTuJM56H+2MEb0SqPMV9Bx6MWkBG6fmXcCabH4JnudSREoQOiPkm7YDr6ictFuf -1EutkozOtREqqjcYjbTCuNhcBoz4/yO9NV7UfD5+gw6RlgWYw7If48hl66l7XaAs -zPw82W3tzPpLQ4zJ1LilYRyyQLYoEt+5+F/+07LJ7z20Hkt8HEyZNp496+ynaF4d -32duXvsCAwEAAaOCAvowggL2MA4GA1UdDwEB/wQEAwIBhjCCAcYGA1UdIASCAb0w -ggG5MIIBtQYLYIZIAYb9bAEDAAIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3 -LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH -AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy -AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj -AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg -AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ -AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt -AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj -AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl -AHIAZQBuAGMAZQAuMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYIKwYBBQUHAQEEKDAm -MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wgY8GA1UdHwSB -hzCBhDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGln -aEFzc3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNl -cnQuY29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDAfBgNVHSME -GDAWgBSxPsNpA/i/RwHUmCYaCALvY2QrwzAdBgNVHQ4EFgQUUOpzidsp+xCPnuUB -INTeeZlIg/cwDQYJKoZIhvcNAQEFBQADggEBAB7ipUiebNtTOA/vphoqrOIDQ+2a -vD6OdRvw/S4iWawTwGHi5/rpmc2HCXVUKL9GYNy+USyS8xuRfDEIcOI3ucFbqL2j -CwD7GhX9A61YasXHJJlIR0YxHpLvtF9ONMeQvzHB+LGEhtCcAarfilYGzjrpDq6X -dF3XcZpCdF/ejUN83ulV7WkAywXgemFhM9EZTfkI7qA5xSU1tyvED7Ld8aW3DiTE -JiiNeXf1L/BXunwH1OH8zVowV36GEEfdMR/X/KLCvzB8XSSq6PmuX2p0ws5rs0bY -Ib4p1I5eFdZCSucyb6Sxa1GDWL4/bcf72gMhy2oWGU4K8K2Eyl2Us1p292E= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- - ` - -var ldapParams = &tkg_models.LdapParams{ - LdapBindDn: "", - LdapBindPassword: "", - LdapGroupSearchBaseDn: "dc=vmware,dc=com", - LdapGroupSearchFilter: "(&(objectClass=*)(OU=people))", - LdapGroupSearchGroupAttr: "memberUid", - LdapGroupSearchNameAttr: "cn", - LdapGroupSearchUserAttr: "uid", - LdapRootCa: "", - LdapURL: "ldaps://ldaps.eng.vmware.com:636", - LdapUserSearchBaseDn: "ou=people,dc=vmware,dc=com", - LdapUserSearchEmailAttr: "", - LdapUserSearchFilter: "(&(objectClass=posixAccount)(CN=ylarry))", - LdapUserSearchIDAttr: "", - LdapUserSearchNameAttr: "uid", - LdapUserSearchUsername: "uid", - LdapTestUser: "", - LdapTestGroup: "", -} - -func TestLdapClient(t *testing.T) { - RegisterFailHandler(Fail) - ldapClient = &client{ - params: nil, - } - RunSpecs(t, "LDAP Verification Suite") -} - -var _ = Describe("LDAP verification", func() { - - BeforeEach(func() { - Skip("Skip integration tests for LDAP client ") - }) - - Context("Verify LDAP credentials", func() { - It("should be able to connect over ldaps without a certificate", func() { - _, err := ldapClient.LdapConnect(ldapParams) - Expect(err).ToNot(HaveOccurred()) - ldapClient.LdapCloseConnection() - }) - - It("should be able to connect with a valid certificate", func() { - ldapParams.LdapRootCa = ldapRootCa - _, err := ldapClient.LdapConnect(ldapParams) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Describe("Verify LDAP capability", func() { - BeforeEach(func() { - _, err := ldapClient.LdapConnect(ldapParams) - Expect(err).ToNot(HaveOccurred()) - _, err = ldapClient.LdapBind() - Expect(err).ToNot(HaveOccurred()) - }) - - AfterEach(func() { - ldapClient.LdapCloseConnection() - }) - - It("should be able to do User Search", func() { - _, err := ldapClient.LdapUserSearch() - Expect(err).ToNot(HaveOccurred()) - }) - - It("should be able to do User Search for a particular user", func() { - ldapParams.LdapTestUser = "ylarry" - _, err := ldapClient.LdapUserSearch() - Expect(err).ToNot(HaveOccurred()) - }) - - It("should faile User Search for a unexisting user", func() { - ldapParams.LdapTestUser = "ylarryXXXXX" - _, err := ldapClient.LdapUserSearch() - Expect(err).To(HaveOccurred()) - }) - - It("should be able to do Group Search", func() { - _, err := ldapClient.LdapGroupSearch() - Expect(err).ToNot(HaveOccurred()) - }) - - It("should be able to do Group Search for a particular group", func() { - ldapParams.LdapTestGroup = "people" - _, err := ldapClient.LdapGroupSearch() - Expect(err).ToNot(HaveOccurred()) - }) - - It("should fail Group Search for a unexisting group", func() { - ldapParams.LdapTestGroup = "peopleXXXXXX" - _, err := ldapClient.LdapGroupSearch() - Expect(err).To(HaveOccurred()) - }) - }) -}) diff --git a/tkg/ldap/interface.go b/tkg/ldap/interface.go deleted file mode 100644 index d52599171c..0000000000 --- a/tkg/ldap/interface.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package ldap provides ldap configuration verification -package ldap - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// Client is a LDAP client interface -type Client interface { - LdapConnect(params *models.LdapParams) (*models.LdapTestResult, error) - LdapBind() (*models.LdapTestResult, error) - LdapUserSearch() (*models.LdapTestResult, error) - LdapGroupSearch() (*models.LdapTestResult, error) - LdapCloseConnection() -} diff --git a/tkg/log/interface.go b/tkg/log/interface.go deleted file mode 100644 index 175eed1bc8..0000000000 --- a/tkg/log/interface.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package log provides logging functionalities -package log - -import ( - "fmt" - "os" -) - -// LoggerImpl represents the ability to log messages, both errors and not. -type LoggerImpl interface { - // Enabled tests whether this Logger is enabled. For example, commandline - // flags might be used to set the logging verbosity and disable some info - // logs. - Enabled() bool - - // Info logs a non-error message with the given key/value pairs as context. - // - // The msg argument should be used to add some constant description to - // the log line. The key/value pairs can then be used to add additional - // variable information. The key/value pairs should alternate string - // keys and arbitrary values. - Info(msg string, keysAndValues ...interface{}) - - // Error logs an error, with the given message and key/value pairs as context. - // It functions similarly to calling Info with the "error" named value, but may - // have unique behavior, and should be preferred for logging errors (see the - // package documentations for more information). - // - // The msg field should be used to add context to any underlying error, - // while the err field should be used to attach the actual error that - // triggered this log line, if present. - Error(err error, msg string, keysAndValues ...interface{}) - - // V returns an Logger value for a specific verbosity level, relative to - // this Logger. In other words, V values are additive. V higher verbosity - // level means a log message is less important. It's illegal to pass a log - // level less than zero. - V(level int) LoggerImpl - - // WithValues adds some key-value pairs of context to a logger. - // See Info for documentation on how key/value pairs work. - WithValues(keysAndValues ...interface{}) LoggerImpl - - // WithName adds a new element to the logger's name. - // Successive calls with WithName continue to append - // suffixes to the logger's name. It's strongly recommended - // that name segments contain only letters, digits, and hyphens - // (see the package documentation for more information). - WithName(name string) LoggerImpl - - // Infof logs a non-error messages with the given message format with format specifier and arguments. - Infof(format string, args ...interface{}) - // Warning logs a warning messages with the given key/value pairs as context. - Warning(msg string, kvs ...interface{}) - // Warningf logs a warning messages with the given message format with format specifier and arguments. - Warningf(format string, args ...interface{}) - // Fatal logs a fatal message with the given key/value pairs as context and returns with os.Exit(1) - Fatal(err error, msg string, kvs ...interface{}) - // Print logs a message of generic type - Print(msg string, err error, logType string, kvs ...interface{}) - // Output writes a message to stdout - Outputf(msg string, kvs ...interface{}) - // SetThreshold implements a New Option that allows to set the threshold level for a logger. - // The logger will write only log messages with a level/V(x) equal or higher to the threshold. - SetThreshold(threshold *int32) - // Clone creates cloned copy of the logger - Clone() LoggerImpl - // CloneWithLevel creates cloned copy of the logger with updated log level - CloneWithLevel(level int) LoggerImpl - // WithCallDepth implements a New Option that allows to set the callDepth level for a logger. - WithCallDepth(callDepth int) LoggerImpl -} - -var l = NewLogger() - -// Info logs a non-error message with the given key/value pairs as context. -func Info(msg string, kvs ...interface{}) { - l.Print(msg, nil, "INFO", kvs...) -} - -// Infof logs a non-error message with the given key/value pairs as context. -func Infof(format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - l.Print(msg, nil, "INFO") -} - -// Error logs an error message with the given key/value pairs as context. -func Error(err error, msg string, kvs ...interface{}) { - l.Print(msg, err, "ERROR", kvs...) -} - -// Warning logs a warning messages with the given key/value pairs as context. -func Warning(msg string, kvs ...interface{}) { - l.Print(msg, nil, "WARN", kvs...) -} - -// Warningf logs a warning messages with the given message format with format specifier and arguments. -func Warningf(format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - l.Print(msg, nil, "WARN") -} - -// Fatal logs a fatal message with the given key/value pairs as context and returns with os.Exit(255) -func Fatal(err error, msg string, kvs ...interface{}) { - l.Print(msg, err, "ERROR", kvs...) - os.Exit(1) -} - -// Outputf writes a message to stdout -func Outputf(format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - l.Print(msg, nil, "OUTPUT") -} - -// V returns an InfoLogger value for a specific verbosity level. -func V(level int) LoggerImpl { - return l.CloneWithLevel(level) -} - -// WithName adds a new element to the logger's name. -func WithName(name string) LoggerImpl { - return l.Clone().WithName(name) -} - -// WithValues adds some key-value pairs of context to a logger. -func WithValues(kvList ...interface{}) LoggerImpl { - return l.Clone().WithValues(kvList...) -} - -var logWriter = NewWriter() - -// SetFile sets the logFile to writer -// if the non-empty file name is used, writer will also -// write the logs to this file -func SetFile(fileName string) { - logWriter.SetFile(fileName) -} - -// SetAuditLog sets the log file that should capture all logging activity. This -// file will contain all logging regardless of set verbosity level. -func SetAuditLog(fileName string) { - logWriter.SetAuditLog(fileName) -} - -// SetChannel sets the channel to writer -// if channel is set, writer will forward log messages to this log channel -func SetChannel(channel chan<- []byte) { - logWriter.SetChannel(channel) -} - -// QuietMode sets the logging mode to quiet -// If this mode is set, writer will not write anything to stderr -func QuietMode(quiet bool) { - logWriter.QuietMode(quiet) -} - -// SetVerbosity sets verbosity level and also updates default verbosity level -func SetVerbosity(verbosity int32) { - l.SetThreshold(&verbosity) - logWriter.SetVerbosity(verbosity) -} - -// SendProgressUpdate sends the progress to the listening logChannel -func SendProgressUpdate(status, currentPhase string, totalPhases []string) { - logWriter.SendProgressUpdate(status, currentPhase, totalPhases) -} diff --git a/tkg/log/logger.go b/tkg/log/logger.go deleted file mode 100644 index 8508f1e8b2..0000000000 --- a/tkg/log/logger.go +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package log - -import ( - "encoding/json" - "fmt" - "os" - "runtime" - "strings" - "time" - - "github.com/pkg/errors" -) - -const nanoSecondsPerMicroSecond = 1000 - -// logEntry defines the information that can be used for composing a log line. -type logEntry struct { - // Prefix of the log line, composed of the hierarchy of log.WithName values. - Prefix string - - // Level of the LogEntry. - Level int32 - - // Values of the log line, composed of the concatenation of log.WithValues and KeyValue pairs passed to log.Info. - Values []interface{} -} - -// NewLogger returns a new instance of the clusterctl. -func NewLogger() LoggerImpl { - return &logger{} -} - -// logger defines a clusterctl friendly logr.Logger -type logger struct { - threshold *int32 - level int32 - prefix string - values []interface{} - callDepth int -} - -var _ LoggerImpl = &logger{} - -// SetThreshold implements a New Option that allows to set the threshold level for a logger. -// The logger will write only log messages with a level/V(x) equal or higher to the threshold. -func (l *logger) SetThreshold(threshold *int32) { - l.threshold = threshold -} - -// WithCallDepth implements a New Option that allows to set the callDepth level for a logger. -func (l *logger) WithCallDepth(callDepth int) LoggerImpl { - nl := l.clone() - nl.callDepth = callDepth - return nl -} - -// Enabled tests whether this Logger is enabled. -func (l *logger) Enabled() bool { - if l.threshold == nil { - return true - } - return l.level <= *l.threshold -} - -// Info logs a non-error message with the given key/value pairs as context. -func (l *logger) Info(msg string, kvs ...interface{}) { - l.Print(msg, nil, "INFO", kvs...) -} - -// Infof logs a non-error messages with the given message format with format specifier and arguments. -func (l *logger) Infof(format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - l.Print(msg, nil, "INFO") -} - -// Error logs an error message with the given key/value pairs as context. -func (l *logger) Error(err error, msg string, kvs ...interface{}) { - l.Print(msg, err, "ERROR", kvs...) -} - -// Warning logs a warning messages with the given key/value pairs as context. -func (l *logger) Warning(msg string, kvs ...interface{}) { - l.Print(msg, nil, "WARN", kvs...) -} - -// Warningf logs a warning messages with the given message format with format specifier and arguments. -func (l *logger) Warningf(format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - l.Print(msg, nil, "WARN") -} - -// Fatal logs a fatal message with the given key/value pairs as context and returns with os.exit(1) -func (l *logger) Fatal(err error, msg string, kvs ...interface{}) { - l.Print(msg, err, "ERROR", kvs...) - os.Exit(1) -} - -// Outputf writes a message to stdout -func (l *logger) Outputf(format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - l.Print(msg, nil, "OUTPUT") -} - -// V returns an InfoLogger value for a specific verbosity level. -func (l *logger) V(level int) LoggerImpl { - nl := l.clone() - nl.level = int32(level) - return nl -} - -// WithName adds a new element to the logger's name. -func (l *logger) WithName(name string) LoggerImpl { - nl := l.clone() - if len(l.prefix) > 0 { - nl.prefix = l.prefix + "/" - } - nl.prefix += name - return nl -} - -// WithValues adds some key-value pairs of context to a logger. -func (l *logger) WithValues(kvList ...interface{}) LoggerImpl { - nl := l.clone() - nl.values = append(nl.values, kvList...) - return nl -} - -func (l *logger) clone() *logger { - return &logger{ - threshold: l.threshold, - level: l.level, - prefix: l.prefix, - values: copySlice(l.values), - callDepth: l.callDepth, - } -} - -func (l *logger) Clone() LoggerImpl { - return l.clone() -} - -func (l *logger) CloneWithLevel(level int) LoggerImpl { - return &logger{ - threshold: l.threshold, - level: int32(level), - prefix: l.prefix, - values: copySlice(l.values), - callDepth: l.callDepth, - } -} - -func (l *logger) Print(msg string, err error, logType string, kvs ...interface{}) { - values := copySlice(l.values) - values = append(values, kvs...) - values = append(values, "msg", msg) - if err != nil { - values = append(values, "error", err) - } - header := []byte(l.header(logType, l.callDepth)) - _, _ = logWriter.Write(header, []byte(l.getLogString(values)), l.Enabled(), l.level, logType) -} - -func (l *logger) getLogString(values []interface{}) string { - entry := logEntry{ - Prefix: l.prefix, - Level: l.level, - Values: values, - } - f, err := flatten(entry) - if err != nil { - _, _ = logWriter.Write([]byte{}, []byte(err.Error()), l.Enabled(), 0, "WARN") - return "" - } - return f -} - -func copySlice(in []interface{}) []interface{} { - out := make([]interface{}, len(in)) - copy(out, in) - return out -} - -// flatten returns a human readable/machine parsable text representing the LogEntry. -// Most notable difference with the klog implementation are: -// - The message is printed at the beginning of the line, without the Msg= variable name e.g. -// "Msg"="This is a message" --> This is a message -// - Variables name are not quoted, eg. -// This is a message "Var1"="value" --> This is a message Var1="value" -// - Variables are not sorted, thus allowing full control to the developer on the output. -func flatten(entry logEntry) (string, error) { // nolint:gocyclo - var msgValue string - var errorValue error - if len(entry.Values)%2 == 1 { - return "", errors.New("log entry cannot have odd number off keyAndValues") - } - - keys := make([]string, 0, len(entry.Values)/2) - values := make(map[string]interface{}, len(entry.Values)/2) - for i := 0; i < len(entry.Values); i += 2 { - k, ok := entry.Values[i].(string) - if !ok { - return "", errors.Errorf("WARNING: key is not a string: %s", entry.Values[i]) - } - var v interface{} - if i+1 < len(entry.Values) { - v = entry.Values[i+1] - } - switch k { - case "msg": - msgValue, ok = v.(string) - if !ok { - return "", errors.Errorf("WARNING: the msg value is not of type string: %s", v) - } - case "error": - errorValue, ok = v.(error) - if !ok { - return "", errors.Errorf("WARNING: the error value is not of type error: %s", v) - } - default: - if _, ok := values[k]; !ok { - keys = append(keys, k) - } - values[k] = v - } - } - str := "" - if entry.Prefix != "" { - str += fmt.Sprintf("[%s] ", entry.Prefix) - } - str += msgValue - if errorValue != nil { - if msgValue != "" { - str += ": " - } - str += errorValue.Error() - } - for _, k := range keys { - prettyValue, err := pretty(values[k]) - if err != nil { - return "", err - } - str += fmt.Sprintf(" %s=%s", k, prettyValue) - } - if str[len(str)-1] != '\n' { - str += "\n" - } - - return str, nil -} - -func pretty(value interface{}) (string, error) { - jb, err := json.Marshal(value) - if err != nil { - return "", errors.Wrapf(err, "Failed to marshal %s", value) - } - return string(jb), nil -} - -func (l *logger) header(logType string, depth int) string { - _, file, line, ok := runtime.Caller(3 + depth) - if !ok { - file = "???" - line = 1 - } else if slash := strings.LastIndex(file, "/"); slash >= 0 { - path := file - file = path[slash+1:] - } - - now := time.Now() - _, month, day := now.Date() - hour, minute, second := now.Clock() - - // Lmmdd hh:mm:ss.uuuuuu file:line] - return fmt.Sprintf("%c%02d%02d %02d:%02d:%02d.%06d %s:%d] ", logType[0], int(month), day, hour, minute, second, now.Nanosecond()/nanoSecondsPerMicroSecond, file, line) -} diff --git a/tkg/log/logr.go b/tkg/log/logr.go deleted file mode 100644 index b44cfec741..0000000000 --- a/tkg/log/logr.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package log - -import "github.com/go-logr/logr" - -// GetLogr returns logr logger object that can be used to attach to some external logr logger -func GetLogr() logr.Logger { - lr := logr.Logger{}.WithSink(&logrWrapper{logger: l.WithCallDepth(2)}) - return lr -} - -// logrWrapper is a logr.LogSink implementation wrapper using LoggerImpl interface -type logrWrapper struct { - logger LoggerImpl -} - -var _ logr.LogSink = &logrWrapper{} - -// Init receives optional information about the logr library for LogSink -// implementations that need it. -func (lr *logrWrapper) Init(info logr.RuntimeInfo) { - lr.logger = lr.logger.WithCallDepth(info.CallDepth) -} - -// Enabled tests whether this LogSink is enabled at the specified V-level. -// For example, commandline flags might be used to set the logging -// verbosity and disable some info logs. -func (lr *logrWrapper) Enabled(level int) bool { - return lr.logger.V(level).Enabled() -} - -// Info logs a non-error message with the given key/value pairs as context. -// The level argument is provided for optional logging. This method will -// only be called when Enabled(level) is true. See Logger.Info for more -// details. -func (lr *logrWrapper) Info(level int, msg string, keysAndValues ...interface{}) { - lr.logger.V(level).Info(msg, keysAndValues...) -} - -// Error logs an error, with the given message and key/value pairs as -// context. See Logger.Error for more details. -func (lr *logrWrapper) Error(err error, msg string, keysAndValues ...interface{}) { - lr.logger.Error(err, msg, keysAndValues...) -} - -// WithValues returns a new LogSink with additional key/value pairs. See -// Logger.WithValues for more details. -func (lr *logrWrapper) WithValues(keysAndValues ...interface{}) logr.LogSink { - nlr := lr.clone() - nlr.logger.WithValues(keysAndValues...) - return nlr -} - -// WithName returns a new LogSink with the specified name appended. See -// Logger.WithName for more details. -func (lr *logrWrapper) WithName(name string) logr.LogSink { - nlr := lr.clone() - nlr.logger.WithName(name) - return nlr -} - -func (lr *logrWrapper) clone() *logrWrapper { - return &logrWrapper{ - logger: lr.logger.Clone(), - } -} diff --git a/tkg/log/types.go b/tkg/log/types.go deleted file mode 100644 index 23445a5148..0000000000 --- a/tkg/log/types.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package log - -import "encoding/json" - -const ( - msgTypeLog = "log" - msgTypeProgress = "progress" -) - -const ( - logTypeINFO = "INFO" - logTypeWARN = "WARN" - logTypeERROR = "ERROR" - logTypeFATAL = "FATAL" - logTypeUNKNOWN = "UNKNOWN" -) - -// Update is a structure to be used for sending websocket message -type logUpdate struct { - Type string `json:"type"` - Data logData `json:"data"` -} - -// Data is a structure to be used for describing message data -type logData struct { - Message string `json:"message,omitempty"` - LogType string `json:"logType,omitempty"` - - Status string `json:"status,omitempty"` - CurrentPhase string `json:"currentPhase,omitempty"` - TotalPhases []string `json:"totalPhases,omitempty"` -} - -func convertLogMsgToJSONBytes(logMsg []byte) []byte { - data := logData{ - Message: string(logMsg), - LogType: getLogType(logMsg), - } - update := logUpdate{Type: msgTypeLog, Data: data} - - updateBytes, err := json.Marshal(update) - if err != nil { - ForceWriteToStdErr([]byte("unable unmarshal log message")) - return []byte{} - } - return updateBytes -} - -func convertProgressMsgToJSONBytes(data *logData) []byte { - update := logUpdate{Type: msgTypeProgress, Data: *data} - - updateBytes, err := json.Marshal(update) - if err != nil { - ForceWriteToStdErr([]byte("unable unmarshal progress message")) - return []byte{} - } - return updateBytes -} - -func getLogType(logMsg []byte) string { - logType := logTypeUNKNOWN - if len(msgTypeLog) > 0 { - switch logMsg[0] { - case 'I': - logType = logTypeINFO - case 'W': - logType = logTypeWARN - case 'E': - logType = logTypeERROR - case 'F': - logType = logTypeFATAL - } - } - return logType -} diff --git a/tkg/log/writer.go b/tkg/log/writer.go deleted file mode 100644 index e45991f4fc..0000000000 --- a/tkg/log/writer.go +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package log - -import ( - "log" - "os" - "path" -) - -// Writer defines methods to write and configure tkg writer -type Writer interface { - - // Write writes message to stdout/stderr, logfile and sends to the channel if channel is set - // - // header is message header to append as a message prefix - // msg is actual message to write - // logEnabled is used to decide whether to write this message to stdout/stderr or not - // logVerbosity is used to decide which message to write for different output types - // logType used to decide should write to stdout or stderr - Write(header []byte, msg []byte, logEnabled bool, logVerbosity int32, logType string) (n int, err error) - - // SetFile sets the logFile to writer - // if the non-empty file name is used, writer will also - // write the logs to this file - SetFile(fileName string) - - // SetAuditLog sets the log file that should capture all logging activity. This - // file will contain all logging regardless of set verbosity level. - SetAuditLog(fileName string) - - // SetChannel sets the channel to writer - // if channel is set, writer will forward log messages to this log channel - SetChannel(channel chan<- []byte) - - // QuietMode sets the logging mode to quiet - // If this mode is set, writer will not write anything to stderr - QuietMode(quiet bool) - - // SetVerbosity sets verbosity level and also updates default verbosity level - SetVerbosity(verbosity int32) - - // SendProgressUpdate sends the progress to the listening logChannel - SendProgressUpdate(status string, step string, totalSteps []string) -} - -var ( - originalStdout *os.File - originalStderr *os.File -) - -var defaultVerbosity int32 = 4 - -// NewWriter returns new custom writter for tkg-cli -func NewWriter() Writer { - return &writer{} -} - -type writer struct { - logFile string - logChannel chan<- []byte - verbosity int32 - quiet bool - auditFile string -} - -// SetFile sets the logFile to writer -// if the non-empty file name is used, writer will also -// write the logs to this file -func (w *writer) SetFile(fileName string) { - w.logFile = fileName -} - -// SetAuditLog sets the log file that should capture all logging activity. This -// file will contain all logging regardless of set verbosity level. -func (w *writer) SetAuditLog(fileName string) { - w.auditFile = fileName -} - -// SetChannel sets the channel to writer -// if channel is set, writer will forward log messages to this log channel -func (w *writer) SetChannel(channel chan<- []byte) { - w.logChannel = channel -} - -// QuietMode sets the logging mode to quiet -// If this mode is set, writer will not write anything to stderr -func (w *writer) QuietMode(quiet bool) { - w.quiet = quiet -} - -// SetVerbosity sets verbosity level and also updates default verbosity level -func (w *writer) SetVerbosity(verbosity int32) { - w.verbosity = verbosity - if verbosity > defaultVerbosity { - defaultVerbosity = verbosity - } -} - -// Write writes message to stdout/stderr, logfile and sends to the channel if channel is set -// -// header is message header to append as a message prefix -// msg is actual message to write -// logEnabled is used to decide whether to write this message to stdout/stderr or not -// logVerbosity is used to decide which message to write for different output types -// logType used to decide should write to stdout or stderr -func (w *writer) Write(header, msg []byte, logEnabled bool, logVerbosity int32, logType string) (n int, err error) { - fullMsg := append(header, msg...) //nolint:gocritic - - // Always write to the audit log so it captures everything - if w.auditFile != "" { - fileWriter(w.auditFile, fullMsg) - } - - // write to logfile, channel only if verbosityLevel is <= default VerbosityLevel - if logVerbosity <= defaultVerbosity { - if w.logFile != "" { - fileWriter(w.logFile, fullMsg) - } - if w.logChannel != nil { - w.logChannel <- convertLogMsgToJSONBytes(fullMsg) - } - } - - // write to stdout/stderr if quiet mode is not set and logEnabled is true - if !w.quiet && logEnabled { - if logType == "OUTPUT" { - stdoutWriter(msg) - } else { - stderrWriter(msg) - } - } - - return len(msg), nil -} - -func (w *writer) SendProgressUpdate(status, currentPhase string, totalPhases []string) { - if w.logChannel == nil { - return - } - - msgData := logData{ - Status: status, - CurrentPhase: currentPhase, - TotalPhases: totalPhases, - } - w.logChannel <- convertProgressMsgToJSONBytes(&msgData) -} - -// UnsetStdoutStderr intercept the actual stdout and stderr -// this will ensure no other external library prints to stdout/stderr -// and use actual stdout/stderr through tkg writer only -// Note: Should not use this functions for normal cli commands like -// -// tkg get regions, tkg set regions -// -// As it will stop any libraries like table.pretty to print on stdout -func UnsetStdoutStderr() { - originalStdout = os.Stdout - originalStderr = os.Stderr - os.Stdout = nil - os.Stderr = nil - log.SetOutput(nil) -} - -func fileWriter(logFileName string, msg []byte) { - basePath := path.Dir(logFileName) - filePath := path.Base(logFileName) - - if os.MkdirAll(basePath, 0o600) != nil { - msg := "Unable to create log directory: " + basePath - stderrWriter([]byte(msg)) - os.Exit(1) - } - - logFileName = path.Join(basePath, filePath) - file, err := os.OpenFile(logFileName, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0o600) - if err != nil { - stderrWriter([]byte(err.Error())) - os.Exit(1) - } - defer file.Close() - - _, fileWriteErr := file.Write(msg) - if fileWriteErr != nil { - stderrWriter([]byte(fileWriteErr.Error())) - os.Exit(1) //nolint:gocritic - } -} - -func stdoutWriter(msg []byte) { - if originalStdout != nil { - _, _ = originalStdout.Write(msg) - } else { - _, _ = os.Stdout.Write(msg) - } -} - -func stderrWriter(msg []byte) { - if originalStderr != nil { - _, _ = originalStderr.Write(msg) - } else { - _, _ = os.Stderr.Write(msg) - } -} - -// ForceWriteToStdErr writes to stdErr -func ForceWriteToStdErr(msg []byte) { - stderrWriter(msg) -} diff --git a/tkg/managementcomponents/helper.go b/tkg/managementcomponents/helper.go deleted file mode 100644 index 0cf72f8155..0000000000 --- a/tkg/managementcomponents/helper.go +++ /dev/null @@ -1,367 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package managementcomponents implements management component installation helpers -package managementcomponents - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "strconv" - "strings" - "time" - - "gopkg.in/yaml.v3" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -const ( - packagePollInterval = 5 * time.Second - packagePollTimeout = 10 * time.Minute -) - -// GetTKGPackageConfigValuesFileFromUserConfig returns values file from user configuration -func GetTKGPackageConfigFromUserConfig(managementPackageVersion, addonsManagerPackageVersion string, userProviderConfigValues map[string]interface{}, tkgBomConfig *tkgconfigbom.BOMConfiguration, readerWriter tkgconfigreaderwriter.TKGConfigReaderWriter, onBootstrapCluster bool) (*TKGPackageConfig, error) { - // TODO: Temporary hack(hard coded values) to configure TKR source controller package values. This should be replaced with the logic - // that fetches these values from tkg-bom(for bom related urls) and set the TKR source controller package values - var tkrRepoImagePath string - providerType := userProviderConfigValues[constants.ConfigVariableProviderType] - switch providerType { - case constants.InfrastructureProviderVSphere: - tkrRepoImagePath = fmt.Sprintf("%s/%s", tkgBomConfig.ImageConfig.ImageRepository, tkgBomConfig.TKRPackageRepo.VSphereNonparavirt) - case constants.InfrastructureProviderAWS: - tkrRepoImagePath = fmt.Sprintf("%s/%s", tkgBomConfig.ImageConfig.ImageRepository, tkgBomConfig.TKRPackageRepo.AWS) - case constants.InfrastructureProviderAzure: - tkrRepoImagePath = fmt.Sprintf("%s/%s", tkgBomConfig.ImageConfig.ImageRepository, tkgBomConfig.TKRPackageRepo.Azure) - // Using vSphere's TKR components because there are no TKR components for CAPD yet - // The issue https://github.com/vmware-tanzu/tanzu-framework/issues/3215 has been filed to add TKR components for CAPD - case constants.InfrastructureProviderDocker: - tkrRepoImagePath = fmt.Sprintf("%s/%s", tkgBomConfig.ImageConfig.ImageRepository, tkgBomConfig.TKRPackageRepo.VSphereNonparavirt) - case constants.InfrastructureProviderOCI: - tkrRepoImagePath = fmt.Sprintf("%s/%s", tkgBomConfig.ImageConfig.ImageRepository, tkgBomConfig.TKRPackageRepo.Oracle) - default: - return nil, errors.Errorf("unknown provider type %q", providerType) - } - - skipVerifyCert := getSkipVerify(userProviderConfigValues, readerWriter) - - // get cacert value from user input for tkr-controller-config cm - caCerts, imageRepo := getCaCertAndImageRepoFromUserProviderConfigValues(userProviderConfigValues, tkgBomConfig, readerWriter) - - tkgPackageConfig := TKGPackageConfig{ - Metadata: Metadata{ - InfraProvider: userProviderConfigValues[constants.ConfigVariableProviderType].(string), - }, - ConfigValues: userProviderConfigValues, - FrameworkPackage: FrameworkPackage{ - VersionConstraints: managementPackageVersion, - FeaturegatePackageValues: FeaturegatePackageValues{ - VersionConstraints: managementPackageVersion, - }, - TKRServicePackageValues: TKRServicePackageValues{ - VersionConstraints: managementPackageVersion, - }, - CLIPluginsPackageValues: CLIPluginsPackageValues{ - VersionConstraints: managementPackageVersion, - DeployCLIPluginCRD: false, - }, - AddonsManagerPackageValues: AddonsManagerPackageValues{ - VersionConstraints: addonsManagerPackageVersion, - TanzuAddonsManager: TanzuAddonsManager{ - FeatureGates: AddonsFeatureGates{ - ClusterBootstrapController: true, - PackageInstallStatus: true, - }, - }, - }, - TanzuAuthPackageValues: TanzuAuthPackageValues{ - VersionConstraints: managementPackageVersion, - }, - }, - ClusterClassPackage: ClusterClassPackage{ - VersionConstraints: managementPackageVersion, - ClusterClassInfraPackageValues: ClusterClassInfraPackageValues{ - VersionConstraints: managementPackageVersion, - }, - }, - TKRSourceControllerPackage: TKRSourceControllerPackage{ - VersionConstraints: managementPackageVersion, - TKRSourceControllerPackageValues: TKRSourceControllerPackageValues{ - VersionConstraints: managementPackageVersion, - BomImagePath: fmt.Sprintf("%s/%s", tkgBomConfig.ImageConfig.ImageRepository, tkgBomConfig.TKRBOM.ImagePath), - BomMetadataImagePath: fmt.Sprintf("%s/%s", tkgBomConfig.ImageConfig.ImageRepository, tkgBomConfig.TKRCompatibility.ImagePath), - TKRRepoImagePath: tkrRepoImagePath, - DefaultCompatibleTKR: tkgBomConfig.Default.TKRVersion, - CaCerts: caCerts, - SkipVerifyCert: skipVerifyCert, - ImageRepo: imageRepo, - }, - }, - CoreManagementPluginsPackage: CoreManagementPluginsPackage{ - VersionConstraints: managementPackageVersion, - }, - } - - // fill in nsx advanced load balancer(a.k.a avi) config - if err := setAkoOperatorConfig(&tkgPackageConfig, userProviderConfigValues, onBootstrapCluster); err != nil { - return nil, err - } - setProxyConfiguration(&tkgPackageConfig, userProviderConfigValues) - - return &tkgPackageConfig, nil -} - -// GetTKGPackageConfigValuesFileFromUserConfig returns values file from user configuration -func GetTKGPackageConfigValuesFileFromUserConfig(managementPackageVersion, addonsManagerPackageVersion string, userProviderConfigValues map[string]interface{}, tkgBomConfig *tkgconfigbom.BOMConfiguration, readerWriter tkgconfigreaderwriter.TKGConfigReaderWriter, onBootstrapCluster bool) (string, error) { - - tkgPackageConfig, err := GetTKGPackageConfigFromUserConfig(managementPackageVersion, addonsManagerPackageVersion, userProviderConfigValues, tkgBomConfig, readerWriter, onBootstrapCluster) - if err != nil { - return "", err - } - - configBytes, err := yaml.Marshal(tkgPackageConfig) - if err != nil { - return "", err - } - - valuesFile := filepath.Join(os.TempDir(), constants.TKGPackageValuesFile) - if err = utils.SaveFile(valuesFile, configBytes); err != nil { - return "", err - } - - return valuesFile, nil -} - -// convertToString converts config into string type, and return "" if config is not set -func convertToString(config interface{}) string { - if config != nil { - return config.(string) - } - return "" -} - -// convertNodeNetworkList converts config into avi node network list type, and return default value if config is not set -func convertNodeNetworkList(userProviderConfigValues map[string]interface{}) (string, error) { - var nodeNetworkList []NodeNetwork - config := userProviderConfigValues[constants.ConfigVariableAviIngressNodeNetworkList] - if utils.IsAviInputEmpty(config) { - // return vsphere network if node network list is not set - network_pathes := strings.Split(convertToString(userProviderConfigValues[constants.ConfigVariableVsphereNetwork]), "/") - network := network_pathes[len(network_pathes)-1] - nodeNetworkList = []NodeNetwork{ - { - NetworkName: network, - }, - } - } else { - if err := yaml.Unmarshal([]byte(config.(string)), &nodeNetworkList); err != nil { - return "", errors.Errorf("Invalid node network list %s", config.(string)) - } - } - // convert nodeNetworkList to json string - jsonBytes, err := json.Marshal(nodeNetworkList) - if err != nil { - return "", errors.Errorf("Cannot convert nodeNetworkList to json string") - } - - return string(jsonBytes), nil -} - -// convertToBool converts config into bool type, and return false if config is not set -func convertToBool(config interface{}) bool { - if config != nil { - return config.(bool) - } - return false -} - -// convertAVILabels converts config into string type, and return empty string if config is not set -func convertAVILabels(config interface{}) (string, error) { - if config != nil { - switch config.(type) { - case string: - return config.(string), nil - default: - jsonBytes, err := json.Marshal(config) - if err != nil { - return "", err - } - return string(jsonBytes), nil - } - } - return "", nil -} - -func setAkoOperatorConfig(tkgPackageConfig *TKGPackageConfig, userProviderConfigValues map[string]interface{}, onBootstrapCluster bool) error { - if !convertToBool(userProviderConfigValues[constants.ConfigVariableAviEnable]) { - return nil - } - - nodeNetworkList, err := convertNodeNetworkList(userProviderConfigValues) - if err != nil { - return errors.Wrapf(err, "Error convert node network list") - } - - aviLabelsJsonString, err := convertAVILabels(userProviderConfigValues[constants.ConfigVariableAviLabels]) - if err != nil { - return err - } - - tkgPackageConfig.AkoOperatorPackage = AkoOperatorPackage{ - AkoOperatorPackageValues: AkoOperatorPackageValues{ - AviEnable: convertToBool(userProviderConfigValues[constants.ConfigVariableAviEnable]), - ClusterName: convertToString(userProviderConfigValues[constants.ConfigVariableClusterName]), - OnBootstrapCluster: onBootstrapCluster, - AkoOperatorConfig: AkoOperatorConfig{ - AviControllerAddress: convertToString(userProviderConfigValues[constants.ConfigVariableAviControllerAddress]), - AviControllerUsername: convertToString(userProviderConfigValues[constants.ConfigVariableAviControllerUsername]), - AviControllerPassword: convertToString(userProviderConfigValues[constants.ConfigVariableAviControllerPassword]), - AviControllerCA: convertToString(userProviderConfigValues[constants.ConfigVariableAviControllerCA]), - AviCloudName: convertToString(userProviderConfigValues[constants.ConfigVariableAviCloudName]), - AviServiceEngineGroup: convertToString(userProviderConfigValues[constants.ConfigVariableAviServiceEngineGroup]), - AviManagementClusterServiceEngineGroup: convertToString(userProviderConfigValues[constants.ConfigVariableAviManagementClusterServiceEngineGroup]), - AviDataPlaneNetworkName: convertToString(userProviderConfigValues[constants.ConfigVariableAviDataPlaneNetworkName]), - AviDataPlaneNetworkCIDR: convertToString(userProviderConfigValues[constants.ConfigVariableAviDataPlaneNetworkCIDR]), - AviControlPlaneNetworkName: convertToString(userProviderConfigValues[constants.ConfigVariableAviControlPlaneNetworkName]), - AviControlPlaneNetworkCIDR: convertToString(userProviderConfigValues[constants.ConfigVariableAviControlPlaneNetworkCIDR]), - AviManagementClusterDataPlaneNetworkName: convertToString(userProviderConfigValues[constants.ConfigVariableAviManagementClusterDataPlaneNetworkName]), - AviManagementClusterDataPlaneNetworkCIDR: convertToString(userProviderConfigValues[constants.ConfigVariableAviManagementClusterDataPlaneNetworkCIDR]), - AviManagementClusterControlPlaneVipNetworkName: convertToString(userProviderConfigValues[constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkName]), - AviManagementClusterControlPlaneVipNetworkCIDR: convertToString(userProviderConfigValues[constants.ConfigVariableAviManagementClusterControlPlaneVipNetworkCIDR]), - AviNSXTT1Router: convertToString(userProviderConfigValues[constants.ConfigVariableAviNSXTT1Router]), - AviLabels: aviLabelsJsonString, - AviControlPlaneHaProvider: convertToBool(userProviderConfigValues[constants.ConfigVariableVsphereHaProvider]), - AviIngressNodeNetworkList: nodeNetworkList, - }, - }, - } - - // auto fill in vip networks - autofillAkoOperatorConfig(&tkgPackageConfig.AkoOperatorPackage.AkoOperatorPackageValues.AkoOperatorConfig) - return nil -} - -// autofillAkoOperatorConfig autofills empty fields in AkoOperatorConfig -func autofillAkoOperatorConfig(akoOperatorConfig *AkoOperatorConfig) { - if akoOperatorConfig.AviManagementClusterServiceEngineGroup == "" { - akoOperatorConfig.AviManagementClusterServiceEngineGroup = akoOperatorConfig.AviServiceEngineGroup - } - - // fill in mgmt cluster data plane VIP networks - if akoOperatorConfig.AviManagementClusterDataPlaneNetworkName == "" || akoOperatorConfig.AviManagementClusterDataPlaneNetworkCIDR == "" { - akoOperatorConfig.AviManagementClusterDataPlaneNetworkName = akoOperatorConfig.AviDataPlaneNetworkName - akoOperatorConfig.AviManagementClusterDataPlaneNetworkCIDR = akoOperatorConfig.AviDataPlaneNetworkCIDR - } - // fill in workload clusters' control plane VIP network - if akoOperatorConfig.AviControlPlaneNetworkName == "" || akoOperatorConfig.AviControlPlaneNetworkCIDR == "" { - akoOperatorConfig.AviControlPlaneNetworkName = akoOperatorConfig.AviManagementClusterDataPlaneNetworkName - akoOperatorConfig.AviControlPlaneNetworkCIDR = akoOperatorConfig.AviManagementClusterDataPlaneNetworkCIDR - } - // fill in management cluster control plane VIP network - if akoOperatorConfig.AviManagementClusterControlPlaneVipNetworkName == "" || akoOperatorConfig.AviManagementClusterControlPlaneVipNetworkCIDR == "" { - akoOperatorConfig.AviManagementClusterControlPlaneVipNetworkName = akoOperatorConfig.AviManagementClusterDataPlaneNetworkName - akoOperatorConfig.AviManagementClusterControlPlaneVipNetworkCIDR = akoOperatorConfig.AviManagementClusterDataPlaneNetworkCIDR - } - -} - -func setProxyConfiguration(tkgPackageConfig *TKGPackageConfig, userProviderConfigValues map[string]interface{}) { - var ( - httpProxy string - httpsProxy string - noProxy string - ) - - if p, ok := userProviderConfigValues[constants.TKGHTTPProxy]; ok { - httpProxy = p.(string) - } - if p, ok := userProviderConfigValues[constants.TKGHTTPSProxy]; ok { - httpsProxy = p.(string) - } - if p, ok := userProviderConfigValues[constants.TKGNoProxy]; ok { - noProxy = p.(string) - } - - setProxyInTKRSourceControllerPackage(tkgPackageConfig, httpProxy, httpsProxy, noProxy) - setProxyInTKRServicePackage(tkgPackageConfig, httpProxy, httpsProxy, noProxy) -} - -func setProxyInTKRSourceControllerPackage(tkgPackageConfig *TKGPackageConfig, httpProxy, httpsProxy, noProxy string) { - tkgPackageConfig.TKRSourceControllerPackage.TKRSourceControllerPackageValues.Deployment = - TKRSourceControllerPackageValuesDeployment{ - HttpProxy: httpProxy, - HttpsProxy: httpsProxy, - NoProxy: noProxy, - } -} - -func setProxyInTKRServicePackage(tkgPackageConfig *TKGPackageConfig, httpProxy, httpsProxy, noProxy string) { - tkgPackageConfig.FrameworkPackage.TKRServicePackageValues.Deployment = - TKRServicePackageValuesDeployment{ - HttpProxy: httpProxy, - HttpsProxy: httpsProxy, - NoProxy: noProxy, - } -} - -func getCaCertAndImageRepoFromUserProviderConfigValues(userProviderConfigValues map[string]interface{}, bomConfig *tkgconfigbom.BOMConfiguration, - readerWriter tkgconfigreaderwriter.TKGConfigReaderWriter) (string, string) { - caCert := "" - imageRepo := bomConfig.ImageConfig.ImageRepository - // implement the same logic as legacy func tkg_image_repo_ca_cert() in providers/ytt/lib/helpers.star - if val, ok := userProviderConfigValues[constants.TKGProxyCACert]; ok { - caCert = val.(string) - } else if val, ok := userProviderConfigValues[constants.ConfigVariableCustomImageRepositoryCaCertificate]; ok { - caCert = val.(string) - } - - // implement the same logic as legacy func tkg_image_repo() in providers/ytt/lib/helpers.star - if val, ok := userProviderConfigValues[constants.ConfigVariableCustomImageRepository]; ok { - imageRepo = val.(string) - } - - // override the values with tkgconfig readerwriter if exists - if readerWriter != nil { - repo, err := readerWriter.Get(constants.ConfigVariableCustomImageRepository) - if err == nil && repo != "" { - imageRepo = repo - } - if ca, err := readerWriter.Get(constants.TKGProxyCACert); err == nil && ca != "" { - caCert = ca - } else if ca, err := readerWriter.Get(constants.ConfigVariableCustomImageRepositoryCaCertificate); err == nil && ca != "" { - caCert = ca - } - } - - return caCert, imageRepo -} - -func getSkipVerify(userProviderConfigValues map[string]interface{}, readerWriter tkgconfigreaderwriter.TKGConfigReaderWriter) bool { - defer func() { - recover() // don't panic - }() - - if readerWriter != nil { - if skipVerifyStr, err := readerWriter.Get(constants.ConfigVariableCustomImageRepositorySkipTLSVerify); err == nil { - if skipVerifyBool, err := strconv.ParseBool(skipVerifyStr); err == nil { - return skipVerifyBool - } - } - } - - if skipVerifyVal, ok := userProviderConfigValues[constants.ConfigVariableCustomImageRepositorySkipTLSVerify]; ok { - if skipVerifyBool, err := strconv.ParseBool(fmt.Sprint(skipVerifyVal)); err == nil { - return skipVerifyBool - } - } - - return false -} diff --git a/tkg/managementcomponents/helper_test.go b/tkg/managementcomponents/helper_test.go deleted file mode 100644 index 35e5105dd3..0000000000 --- a/tkg/managementcomponents/helper_test.go +++ /dev/null @@ -1,703 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package managementcomponents_test - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "gopkg.in/yaml.v3" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/managementcomponents" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" -) - -const ( - verStr = "v0.21.0" -) - -var _ = Describe("Test GetTKGPackageConfigValuesFileFromUserConfig", func() { - var ( - managementPackageVersion string - userProviderConfigValues map[string]interface{} - tkgBomConfigData string - tkgBomConfig *tkgconfigbom.BOMConfiguration - providerType string - valuesFile string - outputFile string - err error - ) - - tkgBomConfigData = `apiVersion: run.tanzu.vmware.com/v1alpha2 -default: - k8sVersion: v1.23.5+vmware.1-tkg.1-fake -release: - version: v1.6.0-fake -imageConfig: - imageRepository: fake.custom.repo -tkr-bom: - imagePath: tkr-bom -tkr-compatibility: - imagePath: fake-path/tkr-compatibility -tkr-package-repo: - aws: tkr-repository-aws - azure: tkr-repository-azure - vsphere-nonparavirt: tkr-repository-vsphere-nonparavirt -tkr-package: - aws: tkr-aws - azure: tkr-azure - vsphere-nonparavirt: tkr-vsphere-nonparavirt -` - - JustBeforeEach(func() { - // Configure tkgBoMConfig - tkgBomConfig = &tkgconfigbom.BOMConfiguration{} - err = yaml.Unmarshal([]byte(tkgBomConfigData), tkgBomConfig) - Expect(err).NotTo(HaveOccurred()) - - // Configure user provider configuration - userProviderConfigValues = map[string]interface{}{ - "PROVIDER_TYPE": providerType, - } - - // invoke GetTKGPackageConfigValuesFileFromUserConfig for testing using addonsManagerPackageVersion = managementPackageVersion - valuesFile, err = GetTKGPackageConfigValuesFileFromUserConfig(managementPackageVersion, managementPackageVersion, userProviderConfigValues, tkgBomConfig, nil, true) - }) - - Context("When provider type is AWS", func() { - BeforeEach(func() { - managementPackageVersion = verStr - providerType = "aws" - outputFile = "test/output_aws.yaml" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("When provider type is vSphere", func() { - BeforeEach(func() { - managementPackageVersion = verStr - providerType = "vsphere" - outputFile = "test/output_vsphere.yaml" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("When provider type is Azure", func() { - BeforeEach(func() { - managementPackageVersion = verStr - providerType = "azure" - outputFile = "test/output_azure.yaml" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("When provider type is Docker", func() { - BeforeEach(func() { - managementPackageVersion = verStr - providerType = "docker" - outputFile = "test/output_docker.yaml" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("When provider type is not provided", func() { - BeforeEach(func() { - managementPackageVersion = verStr - providerType = "" - }) - It("should not return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unknown provider type")) - }) - }) -}) - -var _ = Describe("Test Set proxy settings", func() { - var ( - managementPackageVersion string - userProviderConfigValues map[string]interface{} - tkgBomConfigData string - tkgBomConfig *tkgconfigbom.BOMConfiguration - valuesFile string - outputFile string - err error - ) - - tkgBomConfigData = `apiVersion: run.tanzu.vmware.com/v1alpha2 -default: - k8sVersion: v1.23.5+vmware.1-tkg.1-fake -release: - version: v1.6.0-fake -imageConfig: - imageRepository: fake.custom.repo -tkr-bom: - imagePath: tkr-bom -tkr-compatibility: - imagePath: fake-path/tkr-compatibility -tkr-package-repo: - aws: tkr-repository-aws - azure: tkr-repository-azure - vsphere-nonparavirt: tkr-repository-vsphere-nonparavirt -tkr-package: - aws: tkr-aws - azure: tkr-azure - vsphere-nonparavirt: tkr-vsphere-nonparavirt -` - // Configure user provider configuration - userProviderConfigValues = map[string]interface{}{ - "TKG_HTTP_PROXY": "http://192.168.116.1:3128", - "TKG_HTTPS_PROXY": "http://192.168.116.1:3128", - "TKG_NO_PROXY": ".svc,100.64.0.0/13,192.168.118.0/24,192.168.119.0/24,192.168.120.0/24", - "PROVIDER_TYPE": "vsphere", - "TKG_PROXY_CA_CERT": "dGVzdDE=", - "TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE": "fake-ca", - } - - JustBeforeEach(func() { - // Configure tkgBoMConfig - tkgBomConfig = &tkgconfigbom.BOMConfiguration{} - err = yaml.Unmarshal([]byte(tkgBomConfigData), tkgBomConfig) - Expect(err).NotTo(HaveOccurred()) - - // invoke GetTKGPackageConfigValuesFileFromUserConfig for testing using addonsManagerPackageVersion = managementPackageVersion - valuesFile, err = GetTKGPackageConfigValuesFileFromUserConfig(managementPackageVersion, managementPackageVersion, userProviderConfigValues, tkgBomConfig, nil, true) - }) - - Context("when proxy is set", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_proxy.yaml" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) -}) - -var _ = Describe("Test Set custom ca settings", func() { - var ( - managementPackageVersion string - userProviderConfigValues map[string]interface{} - tkgBomConfigData string - tkgBomConfig *tkgconfigbom.BOMConfiguration - valuesFile string - outputFile string - err error - ) - - tkgBomConfigData = `apiVersion: run.tanzu.vmware.com/v1alpha2 -default: - k8sVersion: v1.23.5+vmware.1-tkg.1-fake -release: - version: v1.6.0-fake -imageConfig: - imageRepository: fake.custom.repo -tkr-bom: - imagePath: tkr-bom -tkr-compatibility: - imagePath: fake-path/tkr-compatibility -tkr-package-repo: - aws: tkr-repository-aws - azure: tkr-repository-azure - vsphere-nonparavirt: tkr-repository-vsphere-nonparavirt -tkr-package: - aws: tkr-aws - azure: tkr-azure - vsphere-nonparavirt: tkr-vsphere-nonparavirt -` - // Configure user provider configuration - userProviderConfigValues = map[string]interface{}{ - "TKG_HTTP_PROXY": "http://192.168.116.1:3128", - "TKG_HTTPS_PROXY": "http://192.168.116.1:3128", - "TKG_NO_PROXY": ".svc,100.64.0.0/13,192.168.118.0/24,192.168.119.0/24,192.168.120.0/24", - "PROVIDER_TYPE": "vsphere", - "TKG_CUSTOM_IMAGE_REPOSITORY": "fake-repo", - "TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE": "fake-ca", - } - - Context("when proxy is set from userconfig map", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_custom_repo_ca.yaml" - }) - - JustBeforeEach(func() { - // Configure tkgBoMConfig - tkgBomConfig = &tkgconfigbom.BOMConfiguration{} - err = yaml.Unmarshal([]byte(tkgBomConfigData), tkgBomConfig) - Expect(err).NotTo(HaveOccurred()) - }) - - It("should not return error", func() { - // invoke GetTKGPackageConfigValuesFileFromUserConfig for testing using addonsManagerPackageVersion = managementPackageVersion - valuesFile, err = GetTKGPackageConfigValuesFileFromUserConfig(managementPackageVersion, managementPackageVersion, userProviderConfigValues, tkgBomConfig, nil, true) - - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - - When("skipVerifyCert is set in user config", func() { - - It("skipVerify should be correctly parsed", func() { - userProviderConfigValues["TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY"] = 1 - }) - It("skipVerify should be correctly parsed", func() { - userProviderConfigValues["TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY"] = "1" - }) - It("skipVerify should be correctly parsed", func() { - userProviderConfigValues["TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY"] = true - }) - It("skipVerify should be correctly parsed", func() { - userProviderConfigValues["TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY"] = "true" - }) - - AfterEach(func() { - tkgPackageConfig, err := GetTKGPackageConfigFromUserConfig(managementPackageVersion, managementPackageVersion, userProviderConfigValues, tkgBomConfig, nil, true) - Expect(err).ToNot(HaveOccurred()) - Expect(tkgPackageConfig.TKRSourceControllerPackage.TKRSourceControllerPackageValues.SkipVerifyCert).To(BeTrue()) - }) - }) - }) - - Context("when proxy is set from readerWrtier", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_custom_repo_ca_rw.yaml" - - }) - - JustBeforeEach(func() { - // Configure tkgBoMConfig - tkgBomConfig = &tkgconfigbom.BOMConfiguration{} - err = yaml.Unmarshal([]byte(tkgBomConfigData), tkgBomConfig) - Expect(err).NotTo(HaveOccurred()) - - rw, err := tkgconfigreaderwriter.New("test/config.yaml") - Expect(err).NotTo(HaveOccurred()) - - rw.TKGConfigReaderWriter().Set("TKG_CUSTOM_IMAGE_REPOSITORY", "fake-repo-2") - rw.TKGConfigReaderWriter().Set("TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE", "fake-ca-2") - - // invoke GetTKGPackageConfigValuesFileFromUserConfig for testing using addonsManagerPackageVersion = managementPackageVersion - valuesFile, err = GetTKGPackageConfigValuesFileFromUserConfig(managementPackageVersion, managementPackageVersion, userProviderConfigValues, tkgBomConfig, rw.TKGConfigReaderWriter(), true) - Expect(err).NotTo(HaveOccurred()) - }) - - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) -}) - -var _ = Describe("Test AVI related settings", func() { - var ( - managementPackageVersion string - userProviderConfigValues map[string]interface{} - tkgBomConfigData string - tkgBomConfig *tkgconfigbom.BOMConfiguration - valuesFile string - outputFile string - err error - ) - - tkgBomConfigData = `apiVersion: run.tanzu.vmware.com/v1alpha2 -default: - k8sVersion: v1.23.5+vmware.1-tkg.1-fake -release: - version: v1.6.0-fake -imageConfig: - imageRepository: fake.custom.repo -tkr-bom: - imagePath: tkr-bom -tkr-compatibility: - imagePath: fake-path/tkr-compatibility -tkr-package-repo: - aws: tkr-repository-aws - azure: tkr-repository-azure - vsphere-nonparavirt: tkr-repository-vsphere-nonparavirt -tkr-package: - aws: tkr-aws - azure: tkr-azure - vsphere-nonparavirt: tkr-vsphere-nonparavirt -` - - Context("On bootstrap cluster", func() { - JustBeforeEach(func() { - // Configure tkgBoMConfig - tkgBomConfig = &tkgconfigbom.BOMConfiguration{} - err = yaml.Unmarshal([]byte(tkgBomConfigData), tkgBomConfig) - Expect(err).NotTo(HaveOccurred()) - - // invoke GetTKGPackageConfigValuesFileFromUserConfig for testing using addonsManagerPackageVersion = managementPackageVersion - valuesFile, err = GetTKGPackageConfigValuesFileFromUserConfig(managementPackageVersion, managementPackageVersion, userProviderConfigValues, tkgBomConfig, nil, true) - }) - - Context("when AVI_ENABLE is set to true", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_avi_enabled_bootstrap_cluster.yaml" - // Configure user provider configuration - userProviderConfigValues = map[string]interface{}{ - "AVI_ENABLE": true, - "AVI_CLOUD_NAME": "Default-Cloud", - "AVI_CONTROL_PLANE_HA_PROVIDER": true, - "AVI_CONTROLLER": "10.191.186.55", - "AVI_DATA_NETWORK": "VM Network", - "AVI_DATA_NETWORK_CIDR": "10.191.176.0/20", - "AVI_INGRESS_NODE_NETWORK_LIST": `- networkName: node-network-name - cidrs: - - 10.191.176.0/20 -`, - "AVI_PASSWORD": "Admin!23", - "AVI_SERVICE_ENGINE_GROUP": "Default-Group", - "AVI_USERNAME": "admin", - "PROVIDER_TYPE": "vsphere", - } - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("when AVI_ENABLE is set to true, AVI_INGRESS_NODE_NETWORK_LIST is not set", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_avi_enabled_no_node_network_list.yaml" - // Configure user provider configuration - userProviderConfigValues = map[string]interface{}{ - "AVI_ENABLE": true, - "AVI_CLOUD_NAME": "Default-Cloud", - "AVI_CONTROL_PLANE_HA_PROVIDER": true, - "AVI_CONTROLLER": "10.191.186.55", - "AVI_DATA_NETWORK": "VM Network", - "AVI_DATA_NETWORK_CIDR": "10.191.176.0/20", - "AVI_PASSWORD": "Admin!23", - "AVI_SERVICE_ENGINE_GROUP": "Default-Group", - "AVI_USERNAME": "admin", - "PROVIDER_TYPE": "vsphere", - "VSPHERE_NETWORK": "VM Network", - } - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("when AVI_ENABLE is set to true, AVI_INGRESS_NODE_NETWORK_LIST is empty", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_avi_enabled_empty_node_network_list.yaml" - // Configure user provider configuration - userProviderConfigValues = map[string]interface{}{ - "AVI_ENABLE": true, - "AVI_CLOUD_NAME": "Default-Cloud", - "AVI_CONTROL_PLANE_HA_PROVIDER": true, - "AVI_CONTROLLER": "10.191.186.55", - "AVI_DATA_NETWORK": "VM Network", - "AVI_DATA_NETWORK_CIDR": "10.191.176.0/20", - "AVI_PASSWORD": "Admin!23", - "AVI_SERVICE_ENGINE_GROUP": "Default-Group", - "AVI_USERNAME": "admin", - "PROVIDER_TYPE": "vsphere", - "VSPHERE_NETWORK": "VM Network", - "AVI_INGRESS_NODE_NETWORK_LIST": `""`, - } - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("when AVI_ENABLE is set to true, AVI_INGRESS_NODE_NETWORK_LIST is invalid", func() { - BeforeEach(func() { - managementPackageVersion = verStr - // Configure user provider configuration - userProviderConfigValues = map[string]interface{}{ - "AVI_ENABLE": true, - "AVI_CLOUD_NAME": "Default-Cloud", - "AVI_CONTROL_PLANE_HA_PROVIDER": true, - "AVI_CONTROLLER": "10.191.186.55", - "AVI_DATA_NETWORK": "VM Network", - "AVI_DATA_NETWORK_CIDR": "10.191.176.0/20", - "AVI_INGRESS_NODE_NETWORK_LIST": "VM Network", - "AVI_PASSWORD": "Admin!23", - "AVI_SERVICE_ENGINE_GROUP": "Default-Group", - "AVI_USERNAME": "admin", - "PROVIDER_TYPE": "vsphere", - } - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("Error convert node network list")) - }) - }) - - Context("when AVI_ENABLE is set to true, VIP network is fully customized", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_avi_enabled_custom_vip_network.yaml" - // Configure user provider configuration - userProviderConfigValues = map[string]interface{}{ - "AVI_ENABLE": true, - "AVI_CLOUD_NAME": "Default-Cloud", - "AVI_CONTROL_PLANE_HA_PROVIDER": true, - "AVI_CONTROLLER": "10.191.186.55", - "AVI_DATA_NETWORK": "VM Network", - "AVI_DATA_NETWORK_CIDR": "10.191.176.0/20", - "AVI_INGRESS_NODE_NETWORK_LIST": `- networkName: node-network-name - cidrs: - - 10.191.176.0/20 -`, - "AVI_PASSWORD": "Admin!23", - "AVI_SERVICE_ENGINE_GROUP": "Default-Group", - "AVI_USERNAME": "admin", - "PROVIDER_TYPE": "vsphere", - "AVI_CONTROL_PLANE_NETWORK": "avi-control-plane-network", - "AVI_CONTROL_PLANE_NETWORK_CIDR": "10.10.93.25/20", - "AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME": "avi-management-cluster-vip-network", - "AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR": "10.94.13.45/20", - "AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME": "avi-management-cluster-control-plane-vip-network", - "AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR": "10.48.99.33/20", - } - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("when AVI_ENABLE is set to false", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_avi_disabled.yaml" - // Configure user provider configuration - userProviderConfigValues = map[string]interface{}{ - "AVI_ENABLE": false, - "PROVIDER_TYPE": "vsphere", - } - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - }) - - Context("On management cluster", func() { - JustBeforeEach(func() { - // Configure tkgBoMConfig - tkgBomConfig = &tkgconfigbom.BOMConfiguration{} - err = yaml.Unmarshal([]byte(tkgBomConfigData), tkgBomConfig) - Expect(err).NotTo(HaveOccurred()) - - // invoke GetTKGPackageConfigValuesFileFromUserConfig for testing using addonsManagerPackageVersion = managementPackageVersion - valuesFile, err = GetTKGPackageConfigValuesFileFromUserConfig(managementPackageVersion, managementPackageVersion, userProviderConfigValues, tkgBomConfig, nil, false) - }) - - Context("when AVI_ENABLE is set to true", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_avi_enabled_management_cluster.yaml" - userProviderConfigValues = map[string]interface{}{ - "AVI_ENABLE": true, - "AVI_CLOUD_NAME": "Default-Cloud", - "AVI_CONTROL_PLANE_HA_PROVIDER": true, - "AVI_CONTROLLER": "10.191.186.55", - "AVI_DATA_NETWORK": "VM Network", - "AVI_DATA_NETWORK_CIDR": "10.191.176.0/20", - "AVI_INGRESS_NODE_NETWORK_LIST": `- networkName: node-network-name - cidrs: - - 10.191.176.0/20 -`, - "AVI_PASSWORD": "Admin!23", - "AVI_SERVICE_ENGINE_GROUP": "Default-Group", - "AVI_USERNAME": "admin", - "PROVIDER_TYPE": "vsphere", - } - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("when AVI_ENABLE is set to true", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_avi_enabled_with_nsxt_cloud_management_cluster.yaml" - userProviderConfigValues = map[string]interface{}{ - "AVI_ENABLE": true, - "AVI_CLOUD_NAME": "Default-Cloud", - "AVI_CONTROL_PLANE_HA_PROVIDER": true, - "AVI_CONTROLLER": "10.191.186.55", - "AVI_DATA_NETWORK": "VM Network", - "AVI_DATA_NETWORK_CIDR": "10.191.176.0/20", - "AVI_PASSWORD": "Admin!23", - "AVI_SERVICE_ENGINE_GROUP": "Default-Group", - "AVI_USERNAME": "admin", - "AVI_NSXT_T1LR": "/infra/test_t1", - "PROVIDER_TYPE": "vsphere", - "VSPHERE_NETWORK": "VM Network", - } - }) - It("when set NSX-T T1 router, it should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("when AVI_ENABLE is set to true", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_avi_enabled_with_avi_labels_0_management_cluster.yaml" - userProviderConfigValues = map[string]interface{}{ - "AVI_ENABLE": true, - "AVI_CLOUD_NAME": "Default-Cloud", - "AVI_CONTROL_PLANE_HA_PROVIDER": true, - "AVI_CONTROLLER": "10.191.186.55", - "AVI_DATA_NETWORK": "VM Network", - "AVI_DATA_NETWORK_CIDR": "10.191.176.0/20", - "AVI_PASSWORD": "Admin!23", - "AVI_SERVICE_ENGINE_GROUP": "Default-Group", - "AVI_USERNAME": "admin", - "AVI_LABELS": `{"foo":"bar"}`, - "PROVIDER_TYPE": "vsphere", - "VSPHERE_NETWORK": "VM Network", - } - }) - It("set AVI_LABELS, it should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("when AVI_ENABLE is set to true", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_avi_enabled_with_avi_labels_1_management_cluster.yaml" - userProviderConfigValues = map[string]interface{}{ - "AVI_ENABLE": true, - "AVI_CLOUD_NAME": "Default-Cloud", - "AVI_CONTROL_PLANE_HA_PROVIDER": true, - "AVI_CONTROLLER": "10.191.186.55", - "AVI_DATA_NETWORK": "VM Network", - "AVI_DATA_NETWORK_CIDR": "10.191.176.0/20", - "AVI_PASSWORD": "Admin!23", - "AVI_SERVICE_ENGINE_GROUP": "Default-Group", - "AVI_USERNAME": "admin", - "AVI_LABELS": map[string]string{"foo": "bar"}, - "PROVIDER_TYPE": "vsphere", - "VSPHERE_NETWORK": "VM Network", - } - }) - It("set AVI_LABELS, it should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - - Context("when AVI_ENABLE is set to false", func() { - BeforeEach(func() { - managementPackageVersion = verStr - outputFile = "test/output_vsphere_with_avi_disabled.yaml" - // Configure user provider configuration - userProviderConfigValues = map[string]interface{}{ - "AVI_ENABLE": false, - "PROVIDER_TYPE": "vsphere", - } - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - f1, err := os.ReadFile(valuesFile) - Expect(err).NotTo(HaveOccurred()) - f2, err := os.ReadFile(outputFile) - Expect(err).NotTo(HaveOccurred()) - Expect(string(f1)).To(Equal(string(f2))) - }) - }) - }) -}) diff --git a/tkg/managementcomponents/management_component_install.go b/tkg/managementcomponents/management_component_install.go deleted file mode 100644 index 8b54c5adbc..0000000000 --- a/tkg/managementcomponents/management_component_install.go +++ /dev/null @@ -1,463 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package managementcomponents - -import ( - "context" - "encoding/json" - "fmt" - "os" - "time" - - "github.com/pkg/errors" - "golang.org/x/sync/errgroup" - appsv1 "k8s.io/api/apps/v1" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/selection" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/util/retry" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - - kappipkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packageclient" - "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/packagedatamodel" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -const ( - addonsManagerName = "addons-manager" - addonFinalizer = "tkg.tanzu.vmware.com/addon" -) - -// ClusterOptions specifies cluster configuration -type ClusterOptions struct { - Kubeconfig string - Kubecontext string -} - -// ManagementPackageRepositoryOptions specifies management package repository deployment options -type ManagementPackageRepositoryOptions struct { - ManagementPackageRepoImage string - TKGPackageValuesFile string - PackageVersion string - PackageInstallTimeout time.Duration -} - -// KappControllerOptions specifies kapp-controller deployment options -type KappControllerOptions struct { - KappControllerConfigFile string - KappControllerInstallNamespace string -} - -// ManagementComponentsInstallOptions specifies install options for management components -type ManagementComponentsInstallOptions struct { - ClusterOptions ClusterOptions - ManagementPackageRepositoryOptions ManagementPackageRepositoryOptions -} - -func generateAddonSecretName(clusterName, addonName string) string { - return fmt.Sprintf("%s-tanzu-%s-addon", clusterName, addonName) -} - -func pauseAddonSecretReconciliation(clusterClient clusterclient.Client, addonSecreteName, namespace string) error { - log.Infof("Pausing reconciliation for %s/%s secret", namespace, addonSecreteName) - secret := &corev1.Secret{} - jsonPatch := []map[string]interface{}{ - { - "op": "add", - "path": "/metadata/annotations/tkg.tanzu.vmware.com~1addon-paused", - "value": "", - }, - } - payloadBytes, err := json.Marshal(jsonPatch) - if err != nil { - return errors.Wrap(err, "unable to generate json patch") - } - - err = clusterClient.PatchResource(secret, addonSecreteName, namespace, string(payloadBytes), types.JSONPatchType, nil) - if apierrors.IsNotFound(err) { - return nil - } - if err != nil { - return errors.Wrapf(err, "failed to pause %s secret reconciliation", addonSecreteName) - } - return nil -} - -func pausePackageInstallReconciliation(clusterClient clusterclient.Client, pkgiName, namespace string) error { - log.Infof("Pausing reconciliation for %s/%s packageinstall", namespace, pkgiName) - pkgi := &kappipkg.PackageInstall{} - jsonPatch := []map[string]interface{}{ - { - "op": "add", - "path": "/spec/paused", - "value": true, - }, - } - payloadBytes, err := json.Marshal(jsonPatch) - if err != nil { - return errors.Wrap(err, "unable to generate json patch") - } - err = clusterClient.PatchResource(pkgi, pkgiName, namespace, string(payloadBytes), types.JSONPatchType, nil) - if apierrors.IsNotFound(err) { - return nil - } - if err != nil { - return errors.Wrapf(err, "failed to pause %s packageinstall reconciliation", pkgiName) - } - return nil -} - -// PauseAddonLifecycleManagement pauses/unpauses the lifecycle management of addon package with given name and namespace -func PauseAddonLifecycleManagement(clusterClient clusterclient.Client, clusterName, addonName, namespace string) error { - log.Infof("Pausing lifecycle management for %s", addonName) - pkgiName := fmt.Sprintf("tanzu-%s", addonsManagerName) - addonSecretName := generateAddonSecretName(clusterName, addonsManagerName) - - err := pauseAddonSecretReconciliation(clusterClient, addonSecretName, namespace) - if err != nil { - return err - } - - err = pausePackageInstallReconciliation(clusterClient, pkgiName, namespace) - if err != nil { - return err - } - - return nil -} - -// NoopDeletePackageInstall sets spec.noopdelete = true before deleting the package install -func NoopDeletePackageInstall(clusterClient clusterclient.Client, pkgiName, namespace string) error { - log.Infof("Deleting %s/%s packageinstall with noopdelete", namespace, pkgiName) - - jsonPatch := []map[string]interface{}{ - { - "op": "add", - "path": "/spec/noopDelete", - "value": true, - }, - } - payloadBytes, err := json.Marshal(jsonPatch) - if err != nil { - return errors.Wrap(err, "unable to generate json patch") - } - pkgi := &kappipkg.PackageInstall{} - err = clusterClient.PatchResource(pkgi, pkgiName, namespace, string(payloadBytes), types.JSONPatchType, nil) - if apierrors.IsNotFound(err) { - return nil - } - if err != nil { - return errors.Wrapf(err, "failed to patch %s packageinstall", pkgiName) - } - - pkgi.Name = pkgiName - pkgi.Namespace = namespace - err = clusterClient.DeleteResource(pkgi) - if err != nil && !apierrors.IsNotFound(err) { - return errors.Wrapf(err, "failed to delete PackageInstall resource %s", pkgiName) - } - return nil -} - -// DeleteLegacyAkoOperatorPackageInstall removes legacy management cluster ako operator packageInstall -func DeleteLegacyAkoOperatorPackageInstall(clusterClient clusterclient.Client, akoOperatorAddonName string) error { - akoOperatorPkgiName := constants.AkoOperatorName - - if err := pauseAddonSecretReconciliation(clusterClient, akoOperatorAddonName, constants.TkgNamespace); err != nil { - return err - } - - if err := pausePackageInstallReconciliation(clusterClient, akoOperatorPkgiName, constants.TkgNamespace); err != nil { - return err - } - - if err := NoopDeletePackageInstall(clusterClient, akoOperatorPkgiName, constants.TkgNamespace); err != nil { - return err - } - return nil -} - -// DeleteAddonSecret deletes the secrete associated with the addon if present. Return no error if secret not found. -func DeleteAddonSecret(clusterClient clusterclient.Client, addonSecretName, namespace string) error { - addonSecret := &corev1.Secret{} - addonSecret.Name = addonSecretName - addonSecret.Namespace = constants.TkgNamespace - log.Infof("Deleting %s/%s secret", addonSecret.Namespace, addonSecret.Name) - err := clusterClient.GetResource(addonSecret, addonSecret.Name, addonSecret.Namespace, nil, nil) - if apierrors.IsNotFound(err) { - return nil - } - if err != nil { - return err - } - - if controllerutil.ContainsFinalizer(addonSecret, addonFinalizer) { - controllerutil.RemoveFinalizer(addonSecret, addonFinalizer) - } - - err = retry.RetryOnConflict(retry.DefaultRetry, func() error { - return clusterClient.UpdateResource(addonSecret, addonSecret.Name, addonSecret.Namespace) - }) - - if apierrors.IsNotFound(err) { - return nil - } - if err != nil { - return err - } - - err = clusterClient.DeleteResource(addonSecret) - if apierrors.IsNotFound(err) { - return nil - } - if err != nil { - return errors.Wrapf(err, "failed to delete addon addonSecret %s", addonSecret) - } - return nil -} - -// AddonSecretExists returns true if given addon is present and was installed from core repository. -func AddonSecretExists(clusterClient clusterclient.Client, addonSecretName, namespace string) (bool, error) { - addonSecret := &corev1.Secret{} - addonSecret.Name = addonSecretName - addonSecret.Namespace = constants.TkgNamespace - - err := clusterClient.GetResource(addonSecret, addonSecret.Name, addonSecret.Namespace, nil, nil) - if apierrors.IsNotFound(err) { - return false, nil - } - if err != nil { - return false, err - } - return true, nil -} - -// InstallManagementComponents installs the management component to cluster -func InstallManagementComponents(clusterClient clusterclient.Client, pkgClient packageclient.PackageClient, mcip *ManagementComponentsInstallOptions) error { - clusterName, err := clusterClient.GetCurrentClusterName(mcip.ClusterOptions.Kubecontext) - if err != nil { - return errors.Wrap(err, "unable to get cluster name") - } - - // If the addons-manager is moving from core repository to management repository, its lifecycle management - // needs to be paused. - previousAddonsManagerIsFromCoreRepo, err := AddonSecretExists(clusterClient, generateAddonSecretName(clusterName, addonsManagerName), constants.TkgNamespace) - if err != nil { - return err - } - if previousAddonsManagerIsFromCoreRepo { - err = PauseAddonLifecycleManagement(clusterClient, clusterName, addonsManagerName, constants.TkgNamespace) - if err != nil { - return err - } - - err = NoopDeletePackageInstall(clusterClient, fmt.Sprintf("tanzu-%s", addonsManagerName), constants.TkgNamespace) - if err != nil { - return err - } - } - - akoOperatorAddonName := fmt.Sprintf("%s-%s-addon", clusterName, constants.AkoOperatorName) - previousAkoOperatorIsFromCoreRepo, err := AddonSecretExists(clusterClient, akoOperatorAddonName, constants.TkgNamespace) - if err != nil { - return err - } - if previousAkoOperatorIsFromCoreRepo { - if err := DeleteLegacyAkoOperatorPackageInstall(clusterClient, akoOperatorAddonName); err != nil { - return err - } - } - - if err = InstallManagementPackagesRepo(pkgClient, mcip.ManagementPackageRepositoryOptions, DefaultRetry); err != nil { - // management package repository must installed successfully, otherwise the process should stop before installing packages - return errors.Wrap(err, "failed to install management package repository") - } - - if err = InstallManagementPackages(pkgClient, mcip.ManagementPackageRepositoryOptions, DefaultRetry); err != nil { - // instead of throwing error here, wait for some additional time for packages to get reconciled successfully - log.Warning(err.Error()) - } - - err = WaitForManagementPackages(clusterClient, mcip.ManagementPackageRepositoryOptions.PackageInstallTimeout) - if err != nil { - return errors.Wrap(err, "timed out waiting for management packages to get reconciled successfully") - } - - // Hack: This is temporary implementation to deploy missing components after installing management packages - // This is currently used to deploy TKR related resources. This can be removed once tkr-source-controller is in place - // and can deploy the necessary tkr components - resouceFile := os.Getenv("_ADDITIONAL_MANAGEMENT_COMPONENT_CONFIGURATION_FILE") - if resouceFile != "" { - log.Infof("Appling additional management component configuration from %q", resouceFile) - err := clusterClient.ApplyFile(resouceFile) - if err != nil { - return err - } - } - - if previousAddonsManagerIsFromCoreRepo { - err = DeleteAddonSecret(clusterClient, generateAddonSecretName(clusterName, addonsManagerName), constants.TkgNamespace) - if err != nil { - return err - } - } - - // // Todo: For the addon secret deletion of ako-operator, this is for legacy to clusterclass capable management cluster upgrade. - // // Because the upgraded management cluster will deploy ako-operator by the management package tkg-pkg instead of addon secret. - // // We currently only pause the legacy ako-operator addon secret to disable it but do not delete it, in order to keep this ako-operator - // // configuration information as a debug reference in case the upgrade is failed. - // // This secret could be removed in later releases where all the management cluster has already successfully upgraded to clusterclass capable. - // if previousAkoOperatorIsFromCoreRepo { - // err = DeleteAddonSecret(clusterClient, fmt.Sprintf("%s-%s-addon", clusterName, constants.AkoOperatorName), constants.TkgNamespace) - // if err != nil { - // return err - // } - // } - - return nil -} - -// InstallKappController installs kapp-controller to the cluster -func InstallKappController(clusterClient clusterclient.Client, kappControllerOptions KappControllerOptions, operationType constants.OperationType) error { - if operationType == constants.OperationTypeUpgrade { - // Ensure last-applied annotation is present before kapp-controller upgrade - err := clusterClient.GetResource(&appsv1.Deployment{}, constants.KappControllerDeploymentName, kappControllerOptions.KappControllerInstallNamespace, nil, nil) - if err != nil && !apierrors.IsNotFound(err) { - return err - } - if err == nil { // only attempt to add annotation when kapp-controller exists on the cluster - log.Infof("Adding last-applied annotation on kapp-controller...") - if err := clusterClient.PatchKappControllerLastAppliedAnnotation(kappControllerOptions.KappControllerInstallNamespace); err != nil { - return errors.Wrap(err, "error adding last-applied annotation on kapp-controller") - } - } - } - // Apply kapp-controller configuration - if err := clusterClient.ApplyFile(kappControllerOptions.KappControllerConfigFile); err != nil { - return errors.Wrapf(err, "error installing %s", constants.KappControllerDeploymentName) - } - // Wait for kapp-controller to be deployed and running - if err := clusterClient.WaitForDeployment(constants.KappControllerDeploymentName, kappControllerOptions.KappControllerInstallNamespace); err != nil { - return errors.Wrapf(err, "error while waiting for deployment %s", constants.KappControllerDeploymentName) - } - return nil -} - -// InstallManagementPackagesRepo installs TKG management packages repository to the cluster -func InstallManagementPackagesRepo(pkgClient packageclient.PackageClient, mpro ManagementPackageRepositoryOptions, backoff wait.Backoff) error { - // install management package repository - return retry.OnError(backoff, - func(err error) bool { - if err != nil { - log.Warning(err.Error() + ", retrying") - return true - } - return false - }, - func() error { - return installManagementPackageRepository(pkgClient, mpro) - }) -} - -// InstallManagementPackages installs TKG management packages to the cluster -func InstallManagementPackages(pkgClient packageclient.PackageClient, mpro ManagementPackageRepositoryOptions, backoff wait.Backoff) error { - // install tkg composite management package - return retry.OnError(backoff, - func(err error) bool { - // the error is tolerable, so continue with retry until a reconciliation error is returned - if err != nil && !IsReconciliationError(err) { - log.Warning(err.Error() + ", retrying") - return true - } - return false - }, - func() error { - return installTKGManagementPackage(pkgClient, mpro) - }) -} - -func installManagementPackageRepository(pkgClient packageclient.PackageClient, mpro ManagementPackageRepositoryOptions) error { - repositoryOptions := packagedatamodel.NewRepositoryOptions() - repositoryOptions.RepositoryName = constants.TKGManagementPackageRepositoryName - repositoryOptions.RepositoryURL = mpro.ManagementPackageRepoImage - repositoryOptions.Namespace = constants.TkgNamespace - repositoryOptions.CreateRepository = true - repositoryOptions.Wait = true - repositoryOptions.PollInterval = packagePollInterval - repositoryOptions.PollTimeout = packagePollTimeout - - return pkgClient.UpdateRepositorySync(repositoryOptions, packagedatamodel.OperationTypeUpdate) -} - -func installTKGManagementPackage(pkgClient packageclient.PackageClient, mpro ManagementPackageRepositoryOptions) error { - packageOptions := packagedatamodel.NewPackageOptions() - packageOptions.PackageName = constants.TKGManagementPackageName - packageOptions.PkgInstallName = constants.TKGManagementPackageInstallName - packageOptions.Namespace = constants.TkgNamespace - packageOptions.Install = true - packageOptions.Wait = true - packageOptions.PollInterval = packagePollInterval - packageOptions.PollTimeout = packagePollTimeout - packageOptions.ValuesFile = mpro.TKGPackageValuesFile - packageOptions.Version = mpro.PackageVersion - packageOptions.Labels = map[string]string{constants.PackageTypeLabel: constants.PackageTypeManagement} - return pkgClient.InstallPackageSync(packageOptions, packagedatamodel.OperationTypeInstall) -} - -func WaitForManagementPackages(clusterClient clusterclient.Client, packageInstallTimeout time.Duration) error { - var packageInstalls kappipkg.PackageInstallList - labelMatch, _ := labels.NewRequirement(constants.PackageTypeLabel, selection.Equals, []string{constants.PackageTypeManagement}) - labelSelector := labels.NewSelector() - labelSelector = labelSelector.Add(*labelMatch) - - err := clusterClient.ListResources(&packageInstalls, &crtclient.ListOptions{ - Namespace: constants.TkgNamespace, - LabelSelector: labelSelector, - }) - if err != nil { - return errors.Wrap(err, "unable to list PackageInstalls") - } - - // Filter management packages all the available packages from tkg-system namespace - // Management package will have a specific label which is being used to filter the packages - packageInstallNames := []string{constants.TKGManagementPackageInstallName} - for i := range packageInstalls.Items { - if packageInstalls.Items[i].Name != constants.TKGManagementPackageInstallName { - packageInstallNames = append(packageInstallNames, packageInstalls.Items[i].Name) - } - } - - // Start waiting for all packages in parallel using group.Wait - // Note: As PackageInstall resources are created in the cluster itself - // we are using currentClusterClient which will point to correct cluster - group, _ := errgroup.WithContext(context.Background()) - - for _, packageName := range packageInstallNames { - pn := packageName - log.V(3).Warningf("waiting for package: %s", pn) - group.Go( - func() error { - err := clusterClient.WaitForPackageInstall(pn, constants.TkgNamespace, packageInstallTimeout) - if err != nil { - log.V(3).Warningf("error while waiting for package '%s'", pn) - } else { - log.V(3).Infof("successfully reconciled package: %s", pn) - } - return err - }) - } - - err = group.Wait() - if err != nil { - return errors.Wrap(err, "error while waiting for management packages to be installed") - } - return nil -} diff --git a/tkg/managementcomponents/management_component_install_test.go b/tkg/managementcomponents/management_component_install_test.go deleted file mode 100644 index a4ffd7bba4..0000000000 --- a/tkg/managementcomponents/management_component_install_test.go +++ /dev/null @@ -1,594 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package managementcomponents_test - -import ( - "errors" - "fmt" - "testing" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/util/retry" - - packageclientfakes "github.com/vmware-tanzu/tanzu-framework/packageclients/pkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - . "github.com/vmware-tanzu/tanzu-framework/tkg/managementcomponents" -) - -const ( - addonsManager = "addons-manager" - akoOperatorName = "ako-operator" -) - -func Test(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "ManagementComponent Suite") -} - -var _ = Describe("Test InstallManagementPackagesRepo", func() { - var ( - fakePkgClient *packageclientfakes.PackageClient - mprOptions ManagementPackageRepositoryOptions - err error - ) - - BeforeEach(func() { - fakePkgClient = &packageclientfakes.PackageClient{} - mprOptions = ManagementPackageRepositoryOptions{ManagementPackageRepoImage: "", TKGPackageValuesFile: ""} - }) - - JustBeforeEach(func() { - err = InstallManagementPackagesRepo(fakePkgClient, mprOptions, retry.DefaultRetry) - }) - - Context("when update repository throws error", func() { - BeforeEach(func() { - fakePkgClient.UpdateRepositorySyncReturns(errors.New("fake error update repository")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake error update repository")) - }) - }) - - Context("when update repository is successful", func() { - BeforeEach(func() { - fakePkgClient.UpdateRepositorySyncReturns(nil) - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Test InstallManagementPackages", func() { - var ( - fakePkgClient *packageclientfakes.PackageClient - mprOptions ManagementPackageRepositoryOptions - err error - ) - - BeforeEach(func() { - fakePkgClient = &packageclientfakes.PackageClient{} - mprOptions = ManagementPackageRepositoryOptions{ManagementPackageRepoImage: "", TKGPackageValuesFile: ""} - }) - - JustBeforeEach(func() { - err = InstallManagementPackages(fakePkgClient, mprOptions, retry.DefaultRetry) - }) - - Context("when install package throws error", func() { - BeforeEach(func() { - fakePkgClient.InstallPackageSyncReturns(errors.New("fake error install package")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake error install package")) - }) - }) - - Context("when install package are successful", func() { - BeforeEach(func() { - fakePkgClient.InstallPackageSyncReturns(nil) - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Test InstallKappController", func() { - var ( - clusterClient *fakes.ClusterClient - kcOptions KappControllerOptions - err error - notFoundError = apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource") - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - kcOptions = KappControllerOptions{KappControllerConfigFile: "", KappControllerInstallNamespace: ""} - }) - - Context("when getting kapp-controller deployment throws error other than NotFound err, while upgrading kapp controller", func() { - JustBeforeEach(func() { - err = InstallKappController(clusterClient, kcOptions, constants.OperationTypeUpgrade) - }) - BeforeEach(func() { - clusterClient.GetResourceReturns(errors.New("fake error getting resource")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake error getting resource")) - }) - }) - - Context("when adding last-applied annotation on kapp-controller throws error, while upgrading kapp controller", func() { - JustBeforeEach(func() { - err = InstallKappController(clusterClient, kcOptions, constants.OperationTypeUpgrade) - }) - BeforeEach(func() { - clusterClient.GetResourceReturns(nil) - clusterClient.PatchKappControllerLastAppliedAnnotationReturns(errors.New("fake error adding annotation")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake error adding annotation")) - Expect(err.Error()).To(ContainSubstring("error adding last-applied annotation on kapp-controller")) - }) - }) - - Context("when applying kapp-controller config throws error, while upgrading kapp controller", func() { - JustBeforeEach(func() { - err = InstallKappController(clusterClient, kcOptions, constants.OperationTypeUpgrade) - }) - BeforeEach(func() { - clusterClient.GetResourceReturns(notFoundError) - clusterClient.ApplyFileReturns(errors.New("fake error applyfile")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake error applyfile")) - Expect(err.Error()).To(ContainSubstring("error installing %s", constants.KappControllerDeploymentName)) - }) - }) - - Context("when WaitForDeployment config throws error, while upgrading kapp controller", func() { - JustBeforeEach(func() { - err = InstallKappController(clusterClient, kcOptions, constants.OperationTypeUpgrade) - }) - BeforeEach(func() { - clusterClient.GetResourceReturns(notFoundError) - clusterClient.ApplyFileReturns(nil) - clusterClient.WaitForDeploymentReturns(errors.New("fake error waitfordeployment")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake error waitfordeployment")) - Expect(err.Error()).To(ContainSubstring("error while waiting for deployment %s", constants.KappControllerDeploymentName)) - }) - }) - - Context("when kapp-controller is deployed successfully, while upgrading kapp controller", func() { - JustBeforeEach(func() { - err = InstallKappController(clusterClient, kcOptions, constants.OperationTypeUpgrade) - }) - BeforeEach(func() { - clusterClient.GetResourceReturns(notFoundError) - clusterClient.ApplyFileReturns(nil) - clusterClient.WaitForDeploymentReturns(nil) - }) - It("should return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("when applying kapp-controller throws error, while installing kapp controller", func() { - JustBeforeEach(func() { - err = InstallKappController(clusterClient, kcOptions, constants.OperationTypeInstall) - }) - BeforeEach(func() { - clusterClient.GetResourceReturns(notFoundError) - clusterClient.ApplyFileReturns(errors.New("fake error applyfile")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake error applyfile")) - Expect(err.Error()).To(ContainSubstring("error installing %s", constants.KappControllerDeploymentName)) - }) - }) - - Context("when WaitForDeployment config throws error, while installing kapp controller", func() { - JustBeforeEach(func() { - err = InstallKappController(clusterClient, kcOptions, constants.OperationTypeInstall) - }) - BeforeEach(func() { - clusterClient.GetResourceReturns(notFoundError) - clusterClient.ApplyFileReturns(nil) - clusterClient.WaitForDeploymentReturns(errors.New("fake error waitfordeployment")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake error waitfordeployment")) - Expect(err.Error()).To(ContainSubstring("error while waiting for deployment %s", constants.KappControllerDeploymentName)) - }) - }) - - Context("when kapp-controller is deployed successfully, while installing kapp controller", func() { - JustBeforeEach(func() { - err = InstallKappController(clusterClient, kcOptions, constants.OperationTypeInstall) - }) - BeforeEach(func() { - clusterClient.GetResourceReturns(notFoundError) - clusterClient.ApplyFileReturns(nil) - clusterClient.WaitForDeploymentReturns(nil) - }) - It("should return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Test WaitForManagementPackages", func() { - var ( - clusterClient *fakes.ClusterClient - err error - timeout time.Duration - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - timeout = time.Duration(1) - }) - - JustBeforeEach(func() { - err = WaitForManagementPackages(clusterClient, timeout) - }) - - Context("when listing packageinstall throws error", func() { - BeforeEach(func() { - clusterClient.ListResourcesReturns(errors.New("fake error")) - clusterClient.WaitForPackageInstallReturns(nil) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("unable to list PackageInstalls")) - Expect(err.Error()).To(ContainSubstring("fake error")) - }) - }) - - Context("when there is an error while waiting for packageinstall to reconcile successfully", func() { - BeforeEach(func() { - clusterClient.ListResourcesReturns(nil) - clusterClient.WaitForPackageInstallReturns(errors.New("fake error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error while waiting for management packages to be installed")) - Expect(err.Error()).To(ContainSubstring("fake error")) - }) - }) - - Context("when packages gets reconciled successfully", func() { - BeforeEach(func() { - clusterClient.ListResourcesReturns(nil) - clusterClient.WaitForPackageInstallReturns(nil) - }) - It("should return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Test PauseAddonLifecycleManagement", func() { - var ( - clusterClient *fakes.ClusterClient - err error - clusterName string - addonName string - namespace string - notFoundError = apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource") - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - clusterName = "mgmtCluster" - addonName = addonsManager - }) - - JustBeforeEach(func() { - err = PauseAddonLifecycleManagement(clusterClient, clusterName, addonName, namespace) - }) - - Context("Resource manipulation returns no errors", func() { - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("Patching resources returns unknown error", func() { - BeforeEach(func() { - clusterClient.PatchResourceReturns(errors.New("Unknown error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("Patching resources returns not found", func() { - BeforeEach(func() { - clusterClient.PatchResourceReturns(notFoundError) - }) - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - -}) - -var _ = Describe("Test NoopDeletePackageInstall", func() { - var ( - clusterClient *fakes.ClusterClient - err error - addonName string - namespace string - notFoundError = apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource") - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - addonName = addonsManager - clusterClient.PatchResourceReturns(nil) - clusterClient.DeleteResourceReturns(nil) - }) - - JustBeforeEach(func() { - err = NoopDeletePackageInstall(clusterClient, namespace, fmt.Sprintf("tanzu-%s", addonName)) - }) - - Context("Resource manipulation returns no errors", func() { - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("Patching resources returns unknown errors", func() { - BeforeEach(func() { - clusterClient.PatchResourceReturns(errors.New("Unknown error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("Patch returns not found", func() { - BeforeEach(func() { - clusterClient.PatchResourceReturns(notFoundError) - }) - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("Deleting resources returns unknown errors", func() { - BeforeEach(func() { - clusterClient.DeleteResourceReturns(errors.New("Unknown error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("Deleting resources returns not found", func() { - BeforeEach(func() { - clusterClient.DeleteResourceReturns(notFoundError) - }) - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - -}) - -var _ = Describe("Test DeleteAddonSecret", func() { - var ( - clusterClient *fakes.ClusterClient - err error - addonName string - namespace string - notFoundError = apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource") - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - addonName = addonsManager - clusterClient.GetResourceReturns(nil) - clusterClient.UpdateResourceReturns(nil) - clusterClient.PatchResourceReturns(nil) - }) - - JustBeforeEach(func() { - err = DeleteAddonSecret(clusterClient, fmt.Sprintf("fake-cluster-tanzu-%s-addon", addonName), namespace) - }) - Context("Resource manipulation returns no errors", func() { - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("Getting resources returns unknown errors", func() { - BeforeEach(func() { - clusterClient.GetResourceReturns(errors.New("Unknown error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("Getting resources returns not found", func() { - BeforeEach(func() { - clusterClient.GetResourceReturns(notFoundError) - }) - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("Updating resources returns unknown errors", func() { - BeforeEach(func() { - clusterClient.UpdateResourceReturns(errors.New("Unknown error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("Updating resources returns not found", func() { - BeforeEach(func() { - clusterClient.UpdateResourceReturns(notFoundError) - }) - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("Deleting resources returns unknown errors", func() { - BeforeEach(func() { - clusterClient.DeleteResourceReturns(errors.New("Unknown error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("Deleting resources returns not found", func() { - BeforeEach(func() { - clusterClient.DeleteResourceReturns(notFoundError) - }) - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - -}) - -var _ = Describe("Test AddonSecretExists", func() { - - var ( - clusterClient *fakes.ClusterClient - err error - addonName string - pauseAddonsManagerLifecycle bool - notFoundError = apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource") - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - addonName = addonsManager - clusterClient.GetResourceReturns(nil) - clusterClient.UpdateResourceReturns(nil) - clusterClient.PatchResourceReturns(nil) - }) - - JustBeforeEach(func() { - pauseAddonsManagerLifecycle, err = AddonSecretExists(clusterClient, fmt.Sprintf("fake-cluster-tanzu-%s-addon", addonName), constants.TkgNamespace) - }) - Context("Getting resources returns no errors", func() { - It("should return true, and no error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(pauseAddonsManagerLifecycle).To(BeTrue()) - }) - }) - Context("Getting resources returns unknown errors", func() { - BeforeEach(func() { - clusterClient.GetResourceReturns(errors.New("Unknown error")) - }) - It("should return false and error", func() { - Expect(err).To(HaveOccurred()) - Expect(pauseAddonsManagerLifecycle).To(BeFalse()) - }) - }) - Context("Getting resources returns not found", func() { - BeforeEach(func() { - clusterClient.GetResourceReturns(notFoundError) - }) - It("should return false and no error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(pauseAddonsManagerLifecycle).To(BeFalse()) - }) - }) - -}) - -var _ = Describe("Test DeleteLegacyAkoOperatorPackageInstall", func() { - var ( - clusterClient *fakes.ClusterClient - err error - notFoundError = apierrors.NewNotFound( - schema.GroupResource{Group: "fakeGroup", Resource: "fakeGroupResource"}, - "fakeGroupResource") - ) - - BeforeEach(func() { - clusterClient = &fakes.ClusterClient{} - clusterClient.PatchResourceReturns(nil) - clusterClient.DeleteResourceReturns(nil) - }) - - JustBeforeEach(func() { - err = DeleteLegacyAkoOperatorPackageInstall(clusterClient, fmt.Sprintf("fake-cluster-%s-addon", akoOperatorName)) - }) - - Context("Resource manipulation returns no errors", func() { - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("Patching resources returns unknown errors", func() { - BeforeEach(func() { - clusterClient.PatchResourceReturns(errors.New("Unknown error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("Patching resources returns unknown errors", func() { - BeforeEach(func() { - clusterClient.PatchResourceReturnsOnCall(1, errors.New("Unknown error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("Patch returns not found", func() { - BeforeEach(func() { - clusterClient.PatchResourceReturns(notFoundError) - }) - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("Deleting resources returns unknown errors", func() { - BeforeEach(func() { - clusterClient.DeleteResourceReturns(errors.New("Unknown error")) - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("Deleting resources returns not found", func() { - BeforeEach(func() { - clusterClient.DeleteResourceReturns(notFoundError) - }) - It("should return no error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) -}) diff --git a/tkg/managementcomponents/test/config.yaml b/tkg/managementcomponents/test/config.yaml deleted file mode 100644 index 92aa0888a5..0000000000 --- a/tkg/managementcomponents/test/config.yaml +++ /dev/null @@ -1,4 +0,0 @@ -# a fake config file for reader writer -foo: bar - -TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: true diff --git a/tkg/managementcomponents/test/output_aws.yaml b/tkg/managementcomponents/test/output_aws.yaml deleted file mode 100644 index 4e1de55244..0000000000 --- a/tkg/managementcomponents/test/output_aws.yaml +++ /dev/null @@ -1,36 +0,0 @@ -metadata: - infraProvider: aws -configvalues: - PROVIDER_TYPE: aws -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-aws - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: {} diff --git a/tkg/managementcomponents/test/output_azure.yaml b/tkg/managementcomponents/test/output_azure.yaml deleted file mode 100644 index 85677d8701..0000000000 --- a/tkg/managementcomponents/test/output_azure.yaml +++ /dev/null @@ -1,36 +0,0 @@ -metadata: - infraProvider: azure -configvalues: - PROVIDER_TYPE: azure -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-azure - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: {} diff --git a/tkg/managementcomponents/test/output_docker.yaml b/tkg/managementcomponents/test/output_docker.yaml deleted file mode 100644 index c36be42590..0000000000 --- a/tkg/managementcomponents/test/output_docker.yaml +++ /dev/null @@ -1,36 +0,0 @@ -metadata: - infraProvider: docker -configvalues: - PROVIDER_TYPE: docker -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: {} diff --git a/tkg/managementcomponents/test/output_vsphere.yaml b/tkg/managementcomponents/test/output_vsphere.yaml deleted file mode 100644 index 0e43e3d1e5..0000000000 --- a/tkg/managementcomponents/test/output_vsphere.yaml +++ /dev/null @@ -1,36 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - PROVIDER_TYPE: vsphere -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: {} diff --git a/tkg/managementcomponents/test/output_vsphere_with_avi_disabled.yaml b/tkg/managementcomponents/test/output_vsphere_with_avi_disabled.yaml deleted file mode 100644 index bf74508004..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_avi_disabled.yaml +++ /dev/null @@ -1,37 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - AVI_ENABLE: false - PROVIDER_TYPE: vsphere -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: {} diff --git a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_bootstrap_cluster.yaml b/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_bootstrap_cluster.yaml deleted file mode 100644 index d011965d27..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_bootstrap_cluster.yaml +++ /dev/null @@ -1,69 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - AVI_CLOUD_NAME: Default-Cloud - AVI_CONTROL_PLANE_HA_PROVIDER: true - AVI_CONTROLLER: 10.191.186.55 - AVI_DATA_NETWORK: VM Network - AVI_DATA_NETWORK_CIDR: 10.191.176.0/20 - AVI_ENABLE: true - AVI_INGRESS_NODE_NETWORK_LIST: | - - networkName: node-network-name - cidrs: - - 10.191.176.0/20 - AVI_PASSWORD: Admin!23 - AVI_SERVICE_ENGINE_GROUP: Default-Group - AVI_USERNAME: admin - PROVIDER_TYPE: vsphere -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: - akoOperator: - avi_enable: true - on_bootstrap_cluster: true - config: - avi_controller: 10.191.186.55 - avi_username: admin - avi_password: Admin!23 - avi_cloud_name: Default-Cloud - avi_service_engine_group: Default-Group - avi_management_cluster_service_engine_group: Default-Group - avi_data_network: VM Network - avi_data_network_cidr: 10.191.176.0/20 - avi_control_plane_network: VM Network - avi_control_plane_network_cidr: 10.191.176.0/20 - avi_management_cluster_vip_network_name: VM Network - avi_management_cluster_vip_network_cidr: 10.191.176.0/20 - avi_management_cluster_control_plane_vip_network_name: VM Network - avi_management_cluster_control_plane_vip_network_cidr: 10.191.176.0/20 - avi_control_plane_ha_provider: true - avi_ingress_node_network_list: '[{"networkName":"node-network-name","cidrs":["10.191.176.0/20"]}]' diff --git a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_custom_vip_network.yaml b/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_custom_vip_network.yaml deleted file mode 100644 index 6f81893b3c..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_custom_vip_network.yaml +++ /dev/null @@ -1,75 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - AVI_CLOUD_NAME: Default-Cloud - AVI_CONTROL_PLANE_HA_PROVIDER: true - AVI_CONTROL_PLANE_NETWORK: avi-control-plane-network - AVI_CONTROL_PLANE_NETWORK_CIDR: 10.10.93.25/20 - AVI_CONTROLLER: 10.191.186.55 - AVI_DATA_NETWORK: VM Network - AVI_DATA_NETWORK_CIDR: 10.191.176.0/20 - AVI_ENABLE: true - AVI_INGRESS_NODE_NETWORK_LIST: | - - networkName: node-network-name - cidrs: - - 10.191.176.0/20 - AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR: 10.48.99.33/20 - AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME: avi-management-cluster-control-plane-vip-network - AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR: 10.94.13.45/20 - AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME: avi-management-cluster-vip-network - AVI_PASSWORD: Admin!23 - AVI_SERVICE_ENGINE_GROUP: Default-Group - AVI_USERNAME: admin - PROVIDER_TYPE: vsphere -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: - akoOperator: - avi_enable: true - on_bootstrap_cluster: true - config: - avi_controller: 10.191.186.55 - avi_username: admin - avi_password: Admin!23 - avi_cloud_name: Default-Cloud - avi_service_engine_group: Default-Group - avi_management_cluster_service_engine_group: Default-Group - avi_data_network: VM Network - avi_data_network_cidr: 10.191.176.0/20 - avi_control_plane_network: avi-control-plane-network - avi_control_plane_network_cidr: 10.10.93.25/20 - avi_management_cluster_vip_network_name: avi-management-cluster-vip-network - avi_management_cluster_vip_network_cidr: 10.94.13.45/20 - avi_management_cluster_control_plane_vip_network_name: avi-management-cluster-control-plane-vip-network - avi_management_cluster_control_plane_vip_network_cidr: 10.48.99.33/20 - avi_control_plane_ha_provider: true - avi_ingress_node_network_list: '[{"networkName":"node-network-name","cidrs":["10.191.176.0/20"]}]' diff --git a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_empty_node_network_list.yaml b/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_empty_node_network_list.yaml deleted file mode 100644 index 44af6ea905..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_empty_node_network_list.yaml +++ /dev/null @@ -1,67 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - AVI_CLOUD_NAME: Default-Cloud - AVI_CONTROL_PLANE_HA_PROVIDER: true - AVI_CONTROLLER: 10.191.186.55 - AVI_DATA_NETWORK: VM Network - AVI_DATA_NETWORK_CIDR: 10.191.176.0/20 - AVI_ENABLE: true - AVI_INGRESS_NODE_NETWORK_LIST: '""' - AVI_PASSWORD: Admin!23 - AVI_SERVICE_ENGINE_GROUP: Default-Group - AVI_USERNAME: admin - PROVIDER_TYPE: vsphere - VSPHERE_NETWORK: VM Network -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: - akoOperator: - avi_enable: true - on_bootstrap_cluster: true - config: - avi_controller: 10.191.186.55 - avi_username: admin - avi_password: Admin!23 - avi_cloud_name: Default-Cloud - avi_service_engine_group: Default-Group - avi_management_cluster_service_engine_group: Default-Group - avi_data_network: VM Network - avi_data_network_cidr: 10.191.176.0/20 - avi_control_plane_network: VM Network - avi_control_plane_network_cidr: 10.191.176.0/20 - avi_management_cluster_vip_network_name: VM Network - avi_management_cluster_vip_network_cidr: 10.191.176.0/20 - avi_management_cluster_control_plane_vip_network_name: VM Network - avi_management_cluster_control_plane_vip_network_cidr: 10.191.176.0/20 - avi_control_plane_ha_provider: true - avi_ingress_node_network_list: '[{"networkName":"VM Network"}]' diff --git a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_management_cluster.yaml b/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_management_cluster.yaml deleted file mode 100644 index ad18a0e4e9..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_management_cluster.yaml +++ /dev/null @@ -1,68 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - AVI_CLOUD_NAME: Default-Cloud - AVI_CONTROL_PLANE_HA_PROVIDER: true - AVI_CONTROLLER: 10.191.186.55 - AVI_DATA_NETWORK: VM Network - AVI_DATA_NETWORK_CIDR: 10.191.176.0/20 - AVI_ENABLE: true - AVI_INGRESS_NODE_NETWORK_LIST: | - - networkName: node-network-name - cidrs: - - 10.191.176.0/20 - AVI_PASSWORD: Admin!23 - AVI_SERVICE_ENGINE_GROUP: Default-Group - AVI_USERNAME: admin - PROVIDER_TYPE: vsphere -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: - akoOperator: - avi_enable: true - config: - avi_controller: 10.191.186.55 - avi_username: admin - avi_password: Admin!23 - avi_cloud_name: Default-Cloud - avi_service_engine_group: Default-Group - avi_management_cluster_service_engine_group: Default-Group - avi_data_network: VM Network - avi_data_network_cidr: 10.191.176.0/20 - avi_control_plane_network: VM Network - avi_control_plane_network_cidr: 10.191.176.0/20 - avi_management_cluster_vip_network_name: VM Network - avi_management_cluster_vip_network_cidr: 10.191.176.0/20 - avi_management_cluster_control_plane_vip_network_name: VM Network - avi_management_cluster_control_plane_vip_network_cidr: 10.191.176.0/20 - avi_control_plane_ha_provider: true - avi_ingress_node_network_list: '[{"networkName":"node-network-name","cidrs":["10.191.176.0/20"]}]' diff --git a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_no_node_network_list.yaml b/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_no_node_network_list.yaml deleted file mode 100644 index 6704825211..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_no_node_network_list.yaml +++ /dev/null @@ -1,66 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - AVI_CLOUD_NAME: Default-Cloud - AVI_CONTROL_PLANE_HA_PROVIDER: true - AVI_CONTROLLER: 10.191.186.55 - AVI_DATA_NETWORK: VM Network - AVI_DATA_NETWORK_CIDR: 10.191.176.0/20 - AVI_ENABLE: true - AVI_PASSWORD: Admin!23 - AVI_SERVICE_ENGINE_GROUP: Default-Group - AVI_USERNAME: admin - PROVIDER_TYPE: vsphere - VSPHERE_NETWORK: VM Network -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: - akoOperator: - avi_enable: true - on_bootstrap_cluster: true - config: - avi_controller: 10.191.186.55 - avi_username: admin - avi_password: Admin!23 - avi_cloud_name: Default-Cloud - avi_service_engine_group: Default-Group - avi_management_cluster_service_engine_group: Default-Group - avi_data_network: VM Network - avi_data_network_cidr: 10.191.176.0/20 - avi_control_plane_network: VM Network - avi_control_plane_network_cidr: 10.191.176.0/20 - avi_management_cluster_vip_network_name: VM Network - avi_management_cluster_vip_network_cidr: 10.191.176.0/20 - avi_management_cluster_control_plane_vip_network_name: VM Network - avi_management_cluster_control_plane_vip_network_cidr: 10.191.176.0/20 - avi_control_plane_ha_provider: true - avi_ingress_node_network_list: '[{"networkName":"VM Network"}]' diff --git a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_with_avi_labels_0_management_cluster.yaml b/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_with_avi_labels_0_management_cluster.yaml deleted file mode 100644 index f874c65e25..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_with_avi_labels_0_management_cluster.yaml +++ /dev/null @@ -1,67 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - AVI_CLOUD_NAME: Default-Cloud - AVI_CONTROL_PLANE_HA_PROVIDER: true - AVI_CONTROLLER: 10.191.186.55 - AVI_DATA_NETWORK: VM Network - AVI_DATA_NETWORK_CIDR: 10.191.176.0/20 - AVI_ENABLE: true - AVI_LABELS: '{"foo":"bar"}' - AVI_PASSWORD: Admin!23 - AVI_SERVICE_ENGINE_GROUP: Default-Group - AVI_USERNAME: admin - PROVIDER_TYPE: vsphere - VSPHERE_NETWORK: VM Network -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: - akoOperator: - avi_enable: true - config: - avi_controller: 10.191.186.55 - avi_username: admin - avi_password: Admin!23 - avi_cloud_name: Default-Cloud - avi_service_engine_group: Default-Group - avi_management_cluster_service_engine_group: Default-Group - avi_data_network: VM Network - avi_data_network_cidr: 10.191.176.0/20 - avi_control_plane_network: VM Network - avi_control_plane_network_cidr: 10.191.176.0/20 - avi_management_cluster_vip_network_name: VM Network - avi_management_cluster_vip_network_cidr: 10.191.176.0/20 - avi_management_cluster_control_plane_vip_network_name: VM Network - avi_management_cluster_control_plane_vip_network_cidr: 10.191.176.0/20 - avi_labels: '{"foo":"bar"}' - avi_control_plane_ha_provider: true - avi_ingress_node_network_list: '[{"networkName":"VM Network"}]' diff --git a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_with_avi_labels_1_management_cluster.yaml b/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_with_avi_labels_1_management_cluster.yaml deleted file mode 100644 index 833aca31b0..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_with_avi_labels_1_management_cluster.yaml +++ /dev/null @@ -1,68 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - AVI_CLOUD_NAME: Default-Cloud - AVI_CONTROL_PLANE_HA_PROVIDER: true - AVI_CONTROLLER: 10.191.186.55 - AVI_DATA_NETWORK: VM Network - AVI_DATA_NETWORK_CIDR: 10.191.176.0/20 - AVI_ENABLE: true - AVI_LABELS: - foo: bar - AVI_PASSWORD: Admin!23 - AVI_SERVICE_ENGINE_GROUP: Default-Group - AVI_USERNAME: admin - PROVIDER_TYPE: vsphere - VSPHERE_NETWORK: VM Network -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: - akoOperator: - avi_enable: true - config: - avi_controller: 10.191.186.55 - avi_username: admin - avi_password: Admin!23 - avi_cloud_name: Default-Cloud - avi_service_engine_group: Default-Group - avi_management_cluster_service_engine_group: Default-Group - avi_data_network: VM Network - avi_data_network_cidr: 10.191.176.0/20 - avi_control_plane_network: VM Network - avi_control_plane_network_cidr: 10.191.176.0/20 - avi_management_cluster_vip_network_name: VM Network - avi_management_cluster_vip_network_cidr: 10.191.176.0/20 - avi_management_cluster_control_plane_vip_network_name: VM Network - avi_management_cluster_control_plane_vip_network_cidr: 10.191.176.0/20 - avi_labels: '{"foo":"bar"}' - avi_control_plane_ha_provider: true - avi_ingress_node_network_list: '[{"networkName":"VM Network"}]' diff --git a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_with_nsxt_cloud_management_cluster.yaml b/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_with_nsxt_cloud_management_cluster.yaml deleted file mode 100644 index c119471920..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_avi_enabled_with_nsxt_cloud_management_cluster.yaml +++ /dev/null @@ -1,67 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - AVI_CLOUD_NAME: Default-Cloud - AVI_CONTROL_PLANE_HA_PROVIDER: true - AVI_CONTROLLER: 10.191.186.55 - AVI_DATA_NETWORK: VM Network - AVI_DATA_NETWORK_CIDR: 10.191.176.0/20 - AVI_ENABLE: true - AVI_NSXT_T1LR: /infra/test_t1 - AVI_PASSWORD: Admin!23 - AVI_SERVICE_ENGINE_GROUP: Default-Group - AVI_USERNAME: admin - PROVIDER_TYPE: vsphere - VSPHERE_NETWORK: VM Network -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - imageRepository: fake.custom.repo -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: - akoOperator: - avi_enable: true - config: - avi_controller: 10.191.186.55 - avi_username: admin - avi_password: Admin!23 - avi_cloud_name: Default-Cloud - avi_service_engine_group: Default-Group - avi_management_cluster_service_engine_group: Default-Group - avi_data_network: VM Network - avi_data_network_cidr: 10.191.176.0/20 - avi_control_plane_network: VM Network - avi_control_plane_network_cidr: 10.191.176.0/20 - avi_management_cluster_vip_network_name: VM Network - avi_management_cluster_vip_network_cidr: 10.191.176.0/20 - avi_management_cluster_control_plane_vip_network_name: VM Network - avi_management_cluster_control_plane_vip_network_cidr: 10.191.176.0/20 - avi_nsxt_t1_lr: /infra/test_t1 - avi_control_plane_ha_provider: true - avi_ingress_node_network_list: '[{"networkName":"VM Network"}]' diff --git a/tkg/managementcomponents/test/output_vsphere_with_custom_repo_ca.yaml b/tkg/managementcomponents/test/output_vsphere_with_custom_repo_ca.yaml deleted file mode 100644 index cd3fbe0486..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_custom_repo_ca.yaml +++ /dev/null @@ -1,50 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - PROVIDER_TYPE: vsphere - TKG_CUSTOM_IMAGE_REPOSITORY: fake-repo - TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: fake-ca - TKG_HTTP_PROXY: http://192.168.116.1:3128 - TKG_HTTPS_PROXY: http://192.168.116.1:3128 - TKG_NO_PROXY: .svc,100.64.0.0/13,192.168.118.0/24,192.168.119.0/24,192.168.120.0/24 -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - deployment: - httpProxy: http://192.168.116.1:3128 - httpsProxy: http://192.168.116.1:3128 - noProxy: .svc,100.64.0.0/13,192.168.118.0/24,192.168.119.0/24,192.168.120.0/24 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - caCerts: fake-ca - imageRepository: fake-repo - deployment: - httpProxy: http://192.168.116.1:3128 - httpsProxy: http://192.168.116.1:3128 - noProxy: .svc,100.64.0.0/13,192.168.118.0/24,192.168.119.0/24,192.168.120.0/24 -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: {} diff --git a/tkg/managementcomponents/test/output_vsphere_with_custom_repo_ca_rw.yaml b/tkg/managementcomponents/test/output_vsphere_with_custom_repo_ca_rw.yaml deleted file mode 100644 index 30fc3f3b6d..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_custom_repo_ca_rw.yaml +++ /dev/null @@ -1,52 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - PROVIDER_TYPE: vsphere - TKG_CUSTOM_IMAGE_REPOSITORY: fake-repo - TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: fake-ca - TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY: "true" - TKG_HTTP_PROXY: http://192.168.116.1:3128 - TKG_HTTPS_PROXY: http://192.168.116.1:3128 - TKG_NO_PROXY: .svc,100.64.0.0/13,192.168.118.0/24,192.168.119.0/24,192.168.120.0/24 -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - deployment: - httpProxy: http://192.168.116.1:3128 - httpsProxy: http://192.168.116.1:3128 - noProxy: .svc,100.64.0.0/13,192.168.118.0/24,192.168.119.0/24,192.168.120.0/24 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - caCerts: fake-ca-2 - skipVerifyRegistryCert: true - imageRepository: fake-repo-2 - deployment: - httpProxy: http://192.168.116.1:3128 - httpsProxy: http://192.168.116.1:3128 - noProxy: .svc,100.64.0.0/13,192.168.118.0/24,192.168.119.0/24,192.168.120.0/24 -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: {} diff --git a/tkg/managementcomponents/test/output_vsphere_with_proxy.yaml b/tkg/managementcomponents/test/output_vsphere_with_proxy.yaml deleted file mode 100644 index 7a9bb284f2..0000000000 --- a/tkg/managementcomponents/test/output_vsphere_with_proxy.yaml +++ /dev/null @@ -1,50 +0,0 @@ -metadata: - infraProvider: vsphere -configvalues: - PROVIDER_TYPE: vsphere - TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE: fake-ca - TKG_HTTP_PROXY: http://192.168.116.1:3128 - TKG_HTTPS_PROXY: http://192.168.116.1:3128 - TKG_NO_PROXY: .svc,100.64.0.0/13,192.168.118.0/24,192.168.119.0/24,192.168.120.0/24 - TKG_PROXY_CA_CERT: dGVzdDE= -frameworkPackage: - versionConstraints: v0.21.0 - featureGatesPackageValues: - versionConstraints: v0.21.0 - tkrServicePackageValues: - versionConstraints: v0.21.0 - deployment: - httpProxy: http://192.168.116.1:3128 - httpsProxy: http://192.168.116.1:3128 - noProxy: .svc,100.64.0.0/13,192.168.118.0/24,192.168.119.0/24,192.168.120.0/24 - clipluginsPackageValues: - versionConstraints: v0.21.0 - addonsManagerPackageValues: - versionConstraints: v0.21.0 - tanzuAddonsManager: - featureGates: - clusterBootstrapController: true - packageInstallStatus: true - tanzuAuthPackageValues: - versionConstraints: v0.21.0 -clusterclassPackage: - versionConstraints: v0.21.0 - clusterclassInfraPackageValues: - versionConstraints: v0.21.0 -tkrSourceControllerPackage: - versionConstraints: v0.21.0 - tkrSourceControllerPackageValues: - versionConstraints: v0.21.0 - bomImagePath: fake.custom.repo/tkr-bom - bomMetadataImagePath: fake.custom.repo/fake-path/tkr-compatibility - tkrRepoImagePath: fake.custom.repo/tkr-repository-vsphere-nonparavirt - defaultCompatibleTKR: v1.23.5+vmware.1-tkg.1-fake - caCerts: dGVzdDE= - imageRepository: fake.custom.repo - deployment: - httpProxy: http://192.168.116.1:3128 - httpsProxy: http://192.168.116.1:3128 - noProxy: .svc,100.64.0.0/13,192.168.118.0/24,192.168.119.0/24,192.168.120.0/24 -coreManagementPluginsPackage: - versionConstraints: v0.21.0 -akoOperatorPackage: {} diff --git a/tkg/managementcomponents/types.go b/tkg/managementcomponents/types.go deleted file mode 100644 index 2616c1e9a8..0000000000 --- a/tkg/managementcomponents/types.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package managementcomponents - -// TKGPackageConfig defines TKG package configuration -type TKGPackageConfig struct { - Metadata Metadata `yaml:"metadata"` - ConfigValues map[string]interface{} `yaml:"configvalues"` - FrameworkPackage FrameworkPackage `yaml:"frameworkPackage"` - ClusterClassPackage ClusterClassPackage `yaml:"clusterclassPackage"` - TKRSourceControllerPackage TKRSourceControllerPackage `yaml:"tkrSourceControllerPackage"` - CoreManagementPluginsPackage CoreManagementPluginsPackage `yaml:"coreManagementPluginsPackage"` - AkoOperatorPackage AkoOperatorPackage `yaml:"akoOperatorPackage"` -} - -// Metadata specifies metadata as part of TKG package config -type Metadata struct { - InfraProvider string `yaml:"infraProvider"` -} - -type TKRSourceControllerPackage struct { - NamespaceForPackageInstallation string `yaml:"namespaceForPackageInstallation,omitempty"` - VersionConstraints string `yaml:"versionConstraints,omitempty"` - TKRSourceControllerPackageValues TKRSourceControllerPackageValues `yaml:"tkrSourceControllerPackageValues,omitempty"` -} - -type TKRSourceControllerPackageValues struct { - Namespace string `yaml:"namespace,omitempty"` - CreateNamespace string `yaml:"createNamespace,omitempty"` - VersionConstraints string `yaml:"versionConstraints,omitempty"` - BomImagePath string `yaml:"bomImagePath,omitempty"` - BomMetadataImagePath string `yaml:"bomMetadataImagePath,omitempty"` - TKRRepoImagePath string `yaml:"tkrRepoImagePath,omitempty"` - DefaultCompatibleTKR string `yaml:"defaultCompatibleTKR,omitempty"` - CaCerts string `yaml:"caCerts,omitempty"` - SkipVerifyCert bool `yaml:"skipVerifyRegistryCert,omitempty"` - ImageRepo string `yaml:"imageRepository,omitempty"` - Deployment TKRSourceControllerPackageValuesDeployment `yaml:"deployment,omitempty"` -} - -type TKRSourceControllerPackageValuesDeployment struct { - HttpProxy string `yaml:"httpProxy,omitempty"` - HttpsProxy string `yaml:"httpsProxy,omitempty"` - NoProxy string `yaml:"noProxy,omitempty"` -} - -type FrameworkPackage struct { - NamespaceForPackageInstallation string `yaml:"namespaceForPackageInstallation,omitempty"` - VersionConstraints string `yaml:"versionConstraints,omitempty"` - FeaturegatePackageValues FeaturegatePackageValues `yaml:"featureGatesPackageValues,omitempty"` - TKRServicePackageValues TKRServicePackageValues `yaml:"tkrServicePackageValues,omitempty"` - CLIPluginsPackageValues CLIPluginsPackageValues `yaml:"clipluginsPackageValues,omitempty"` - AddonsManagerPackageValues AddonsManagerPackageValues `yaml:"addonsManagerPackageValues,omitempty"` - TanzuAuthPackageValues TanzuAuthPackageValues `yaml:"tanzuAuthPackageValues,omitempty"` -} - -type ClusterClassPackage struct { - NamespaceForPackageInstallation string `yaml:"namespaceForPackageInstallation,omitempty"` - VersionConstraints string `yaml:"versionConstraints,omitempty"` - ClusterClassInfraPackageValues ClusterClassInfraPackageValues `yaml:"clusterclassInfraPackageValues,omitempty"` -} - -type AkoOperatorPackage struct { - AkoOperatorPackageValues AkoOperatorPackageValues `yaml:"akoOperator,omitempty"` -} - -type AddonsFeatureGates struct { - ClusterBootstrapController bool `yaml:"clusterBootstrapController,omitempty"` - PackageInstallStatus bool `yaml:"packageInstallStatus,omitempty"` -} - -type TanzuAddonsManager struct { - FeatureGates AddonsFeatureGates `yaml:"featureGates,omitempty"` -} -type CoreManagementPluginsPackage struct { - NamespaceForPackageInstallation string `yaml:"namespaceForPackageInstallation,omitempty"` - VersionConstraints string `yaml:"versionConstraints,omitempty"` -} - -type AddonsManagerPackageValues struct { - VersionConstraints string `yaml:"versionConstraints,omitempty"` - TanzuAddonsManager TanzuAddonsManager `yaml:"tanzuAddonsManager,omitempty"` -} - -type FeaturegatePackageValues struct { - Namespace string `yaml:"namespace,omitempty"` - CreateNamespace string `yaml:"createNamespace,omitempty"` - VersionConstraints string `yaml:"versionConstraints,omitempty"` -} - -type TKRServicePackageValues struct { - Namespace string `yaml:"namespace,omitempty"` - CreateNamespace string `yaml:"createNamespace,omitempty"` - VersionConstraints string `yaml:"versionConstraints,omitempty"` - Deployment TKRServicePackageValuesDeployment `yaml:"deployment,omitempty"` -} - -type TKRServicePackageValuesDeployment struct { - HttpProxy string `yaml:"httpProxy,omitempty"` - HttpsProxy string `yaml:"httpsProxy,omitempty"` - NoProxy string `yaml:"noProxy,omitempty"` -} - -type CLIPluginsPackageValues struct { - Namespace string `yaml:"namespace,omitempty"` - CreateNamespace string `yaml:"createNamespace,omitempty"` - VersionConstraints string `yaml:"versionConstraints,omitempty"` - DeployCLIPluginCRD bool `yaml:"deployCLIPluginCRD,omitempty"` -} - -type ClusterClassInfraPackageValues struct { - Namespace string `yaml:"namespace,omitempty"` - CreateNamespace string `yaml:"createNamespace,omitempty"` - VersionConstraints string `yaml:"versionConstraints,omitempty"` -} - -type TanzuAuthPackageValues struct { - Namespace string `yaml:"namespace,omitempty"` - CreateNamespace string `yaml:"createNamespace,omitempty"` - VersionConstraints string `yaml:"versionConstraints,omitempty"` -} - -// AkoOperatorPackageValues -type AkoOperatorPackageValues struct { - AviEnable bool `yaml:"avi_enable,omitempty"` - ClusterName string `yaml:"cluster_name,omitempty"` - OnBootstrapCluster bool `yaml:"on_bootstrap_cluster,omitempty"` - AkoOperatorConfig AkoOperatorConfig `yaml:"config,omitempty"` -} - -// NodeNetwork -type NodeNetwork struct { - NetworkName string `yaml:"networkName,omitempty" json:"networkName,omitempty"` - Cidrs []string `yaml:"cidrs,omitempty" json:"cidrs,omitempty"` -} - -// AkoOperatorConfig -type AkoOperatorConfig struct { - AviControllerAddress string `yaml:"avi_controller,omitempty"` - AviControllerVersion string `yaml:"avi_controller_version,omitempty"` - AviControllerUsername string `yaml:"avi_username,omitempty"` - AviControllerPassword string `yaml:"avi_password,omitempty"` - AviControllerCA string `yaml:"avi_ca_data_b64,omitempty"` - AviCloudName string `yaml:"avi_cloud_name,omitempty"` - AviServiceEngineGroup string `yaml:"avi_service_engine_group,omitempty"` - AviManagementClusterServiceEngineGroup string `yaml:"avi_management_cluster_service_engine_group,omitempty"` - AviDataPlaneNetworkName string `yaml:"avi_data_network,omitempty"` - AviDataPlaneNetworkCIDR string `yaml:"avi_data_network_cidr,omitempty"` - AviControlPlaneNetworkName string `yaml:"avi_control_plane_network,omitempty"` - AviControlPlaneNetworkCIDR string `yaml:"avi_control_plane_network_cidr,omitempty"` - AviManagementClusterDataPlaneNetworkName string `yaml:"avi_management_cluster_vip_network_name,omitempty"` - AviManagementClusterDataPlaneNetworkCIDR string `yaml:"avi_management_cluster_vip_network_cidr,omitempty"` - AviManagementClusterControlPlaneVipNetworkName string `yaml:"avi_management_cluster_control_plane_vip_network_name,omitempty"` - AviManagementClusterControlPlaneVipNetworkCIDR string `yaml:"avi_management_cluster_control_plane_vip_network_cidr,omitempty"` - AviLabels string `yaml:"avi_labels,omitempty"` - AviNSXTT1Router string `yaml:"avi_nsxt_t1_lr,omitempty"` - AviControlPlaneHaProvider bool `yaml:"avi_control_plane_ha_provider,omitempty"` - AviIngressNodeNetworkList string `yaml:"avi_ingress_node_network_list,omitempty"` -} diff --git a/tkg/managementcomponents/utils.go b/tkg/managementcomponents/utils.go deleted file mode 100644 index dc6a52ea83..0000000000 --- a/tkg/managementcomponents/utils.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package managementcomponents - -import ( - "strings" - "time" - - "k8s.io/apimachinery/pkg/util/wait" -) - -const ( - ErrReconciliationFailed = "resource reconciliation failed" - ErrReconciliationTimeout = "resource reconciliation timeout" -) - -var DefaultRetry = wait.Backoff{ - Steps: 10, - Duration: 10 * time.Second, - Factor: 1.0, - Jitter: 0, -} - -func IsReconciliationError(err error) bool { - if strings.Contains(err.Error(), ErrReconciliationFailed) || - strings.Contains(err.Error(), ErrReconciliationTimeout) { - return true - } - return false -} diff --git a/tkg/managementcomponents/utils_test.go b/tkg/managementcomponents/utils_test.go deleted file mode 100644 index f9ae5405c3..0000000000 --- a/tkg/managementcomponents/utils_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package managementcomponents_test - -import ( - "errors" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/managementcomponents" -) - -var _ = Describe("Test IsReconciliationError", func() { - var ( - err error - isReconciliationError bool - ) - - JustBeforeEach(func() { - isReconciliationError = IsReconciliationError(err) - }) - - Context("When the error is reconciliation timeout error", func() { - BeforeEach(func() { - err = errors.New("resource reconciliation timeout: foo bar") - }) - It("should return true", func() { - Expect(isReconciliationError).To(BeTrue()) - }) - }) - - Context("When the error is reconciliation failed error", func() { - BeforeEach(func() { - err = errors.New("'foo' resource reconciliation failed") - }) - It("should return true", func() { - Expect(isReconciliationError).To(BeTrue()) - }) - }) - - Context("When the error is not a reconciliation error", func() { - BeforeEach(func() { - err = errors.New("fake error") - }) - It("should return false", func() { - Expect(isReconciliationError).To(BeFalse()) - }) - }) -}) diff --git a/tkg/manifest/server/zz_generated.bindata.go b/tkg/manifest/server/zz_generated.bindata.go deleted file mode 100644 index dfdb95cf16..0000000000 --- a/tkg/manifest/server/zz_generated.bindata.go +++ /dev/null @@ -1,1572 +0,0 @@ -// Code generated by go-bindata. DO NOT EDIT. -// sources: -// tkg/web/dist/tkg-kickstart-ui/175-es2015.d46a578ff1b6cad5d45a.js -// tkg/web/dist/tkg-kickstart-ui/175-es5.d46a578ff1b6cad5d45a.js -// tkg/web/dist/tkg-kickstart-ui/39-es2015.01e37d969093a24ceaf8.js -// tkg/web/dist/tkg-kickstart-ui/39-es5.01e37d969093a24ceaf8.js -// tkg/web/dist/tkg-kickstart-ui/3rdpartylicenses.txt -// tkg/web/dist/tkg-kickstart-ui/582-es2015.25ed5926266ddd371723.js -// tkg/web/dist/tkg-kickstart-ui/582-es5.25ed5926266ddd371723.js -// tkg/web/dist/tkg-kickstart-ui/644-es2015.b16fcfdb49088748e8f1.js -// tkg/web/dist/tkg-kickstart-ui/644-es5.b16fcfdb49088748e8f1.js -// tkg/web/dist/tkg-kickstart-ui/651-es2015.1191a3c343f5b6f4c3bd.js -// tkg/web/dist/tkg-kickstart-ui/651-es5.1191a3c343f5b6f4c3bd.js -// tkg/web/dist/tkg-kickstart-ui/742-es2015.fed85f8921ac5074e243.js -// tkg/web/dist/tkg-kickstart-ui/742-es5.fed85f8921ac5074e243.js -// tkg/web/dist/tkg-kickstart-ui/917-es2015.811d90b19a852dcbc427.js -// tkg/web/dist/tkg-kickstart-ui/917-es5.811d90b19a852dcbc427.js -// tkg/web/dist/tkg-kickstart-ui/assets/images/aws-ec2.svg -// tkg/web/dist/tkg-kickstart-ui/assets/images/docker.svg -// tkg/web/dist/tkg-kickstart-ui/assets/images/ms-azure.svg -// tkg/web/dist/tkg-kickstart-ui/assets/images/tanzu-logo.svg -// tkg/web/dist/tkg-kickstart-ui/assets/images/tce-logo.svg -// tkg/web/dist/tkg-kickstart-ui/assets/images/vmw-logo.svg -// tkg/web/dist/tkg-kickstart-ui/assets/images/vsphere.svg -// tkg/web/dist/tkg-kickstart-ui/assets/images/welcome-intro.svg -// tkg/web/dist/tkg-kickstart-ui/aws-ec2.1241b36c8e9e94dcf23e.svg -// tkg/web/dist/tkg-kickstart-ui/clr-ui-dark.min.css -// tkg/web/dist/tkg-kickstart-ui/clr-ui.min.css -// tkg/web/dist/tkg-kickstart-ui/docker.05653a44fa77774eac36.svg -// tkg/web/dist/tkg-kickstart-ui/favicon.ico -// tkg/web/dist/tkg-kickstart-ui/index.html -// tkg/web/dist/tkg-kickstart-ui/main-es2015.341f46d0b99a14967f1e.js -// tkg/web/dist/tkg-kickstart-ui/main-es5.341f46d0b99a14967f1e.js -// tkg/web/dist/tkg-kickstart-ui/ms-azure.814a53b97d8fea22860e.svg -// tkg/web/dist/tkg-kickstart-ui/polyfills-es2015.3e69d632a8e7bb99faa8.js -// tkg/web/dist/tkg-kickstart-ui/polyfills-es5.4f5834b7b08801de44f4.js -// tkg/web/dist/tkg-kickstart-ui/runtime-es2015.969771d6bf2c3ab9fc99.js -// tkg/web/dist/tkg-kickstart-ui/runtime-es5.969771d6bf2c3ab9fc99.js -// tkg/web/dist/tkg-kickstart-ui/scripts.2cc3b57c8646210a196c.js -// tkg/web/dist/tkg-kickstart-ui/styles.a0a16718149e3f00ad10.css -// tkg/web/dist/tkg-kickstart-ui/tanzu-logo.71a047ebb2527a9eb5a2.svg -// tkg/web/dist/tkg-kickstart-ui/tce-logo.37c4b14a8d8a0173d026.svg -// tkg/web/dist/tkg-kickstart-ui/vmw-logo.07f49a7461d1ed06907b.svg -// tkg/web/dist/tkg-kickstart-ui/vsphere.6ba76e3c33e72aa6f29e.svg -// tkg/web/dist/tkg-kickstart-ui/welcome-intro.92f405173016654f68c9.svg - -package server - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info fileInfoEx -} - -type fileInfoEx interface { - os.FileInfo - MD5Checksum() string -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time - md5checksum string -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) MD5Checksum() string { - return fi.md5checksum -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _bindataTkgWebDistTkgkickstartui175es2015D46a578ff1b6cad5d45aJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x59\xfd\x72\xdb\xb6\xb2\x7f\x15\x86\xb7\xe3\x21\x6f\x61\x54\xa2\xbe\xe5\xe1\xc9\x78\x6c\xa7\x55\x62\x4b\xae\xa5\x24\x37\xf1\xd1\xb8\x10\xb9\x92\x71\x4c\x91\x0c\x00\x2a\x71\x64\xbe\x43\xdf\xa0\xef\xd6\x27\xb9\x03\x90\x94\x48\x89\x94\x93\xd3\x9e\x39\xff\x58\x12\xb0\xd8\x5d\xec\xe7\x0f\x6b\x3d\xe2\xa0\x71\xc1\xa8\x23\xf4\x13\x83\x83\x37\xc7\x9f\x61\x16\x12\xe7\xe1\xec\x3e\xf2\x1f\xc4\xc3\xe2\xee\x81\x3a\x0f\x5c\x10\x26\xee\x22\x6a\x3f\x4b\xf1\xf4\x74\x3b\x35\x71\x18\xf1\x7b\xe3\xf6\xb6\xde\x69\x4d\xd1\xda\xb2\xac\x7a\xb3\x3f\x8f\x7c\x47\xd0\xc0\x37\x00\x09\x44\xcd\x35\xc5\xae\x21\xd0\xfa\x97\xed\x86\xb9\x66\x20\x22\xe6\x6b\x4e\x1c\x9b\x27\x2b\xc2\x34\x66\x53\xa3\xdb\xa8\x5b\x1d\x13\x71\x9b\x1a\x9d\x66\xaf\xd6\x34\x91\x6f\x53\xc3\x6a\xb4\x5a\x26\x22\x72\xb1\x5e\x6f\x35\x4c\xe4\xd9\xd4\x68\xb4\x3b\x3d\x13\x85\x36\x35\xea\xb5\x76\xa3\x67\xa2\xc0\xa6\x46\xab\x55\xeb\x35\xcc\x13\x0f\x84\xe6\xd8\x86\x61\xda\xff\x58\x3b\x1e\xe1\x5c\x03\x0d\xbe\x08\xf0\x5d\xae\x31\x3c\x58\x3b\x81\xcf\x05\x8b\x1c\x11\x30\x03\xcc\x35\x8f\x42\x60\x86\x89\xc4\x3d\xe5\x78\x45\x3c\xea\x12\xa9\xe3\x18\xd8\x8a\x3a\x60\x43\xb2\xe1\x07\x2e\x4c\x1e\x43\xe0\xf6\xed\x34\xf6\x17\x23\x7f\xe0\x53\x61\xa4\xa7\xf1\x76\x01\xf9\xf8\x23\x8e\x38\xb0\x73\x22\xc8\xab\x80\x2d\x53\x3e\x78\x16\x51\xcf\x95\x0b\x86\xe2\x37\x0f\xd8\xf2\x67\x16\x44\x61\xc2\xfe\x33\xfd\x4a\x98\x3b\x24\xcb\x54\x9c\xdc\xde\xfe\xe2\x51\x18\x7a\x8f\x63\x01\xe1\x15\x09\x43\xea\x2f\x0c\x33\xd5\xf7\x5e\x2c\xbd\x57\x14\x3c\xf7\x92\xcc\xc0\xe3\xb6\x94\x3e\x97\xbf\xaf\x48\xf8\x56\x50\x8f\x0a\x0a\x1c\x2f\x40\x6c\x89\xae\x48\x68\x3c\xc3\x95\x8b\x80\xc1\x39\xcc\x49\xe4\x89\x84\xf1\x73\x27\x18\x2c\x28\x17\xc0\xd2\x43\xaf\xa8\x07\x83\x65\x18\x30\x01\xee\x2f\xc4\x77\x3d\x60\x09\x07\x58\x81\x5f\xd8\x7d\xee\x82\x95\x8c\x2f\x18\x0b\xd8\x21\xde\x8a\x20\xbb\x50\x34\xe3\x0e\xa3\x33\x98\x04\xa9\x3f\x78\xe6\x71\x4f\xb2\xf7\x27\xc1\x85\x3c\xbd\x59\xe5\x20\xce\xbc\x48\x0a\x96\x5e\x18\xa4\x01\xa3\x42\x37\x76\x08\x73\xcf\x3c\xea\x3c\x9c\xc3\xca\x30\xd7\x1b\xfa\xc0\x17\x2c\xf0\xae\x3d\xe2\xc3\x24\x50\x7b\x09\x2f\xc1\xe8\x62\x01\x4c\xde\xee\x1c\xa4\x1a\xa1\x64\x74\x76\x4f\xfc\x05\xe4\xd9\x5d\xb3\xc0\xad\xe4\x97\x6c\x7e\x13\xc3\x05\x08\xcd\x85\x95\x54\x9a\xf8\x8e\x8a\xda\x77\xc4\x8b\x60\x9b\x75\x8a\x4b\x16\x14\xc9\x1e\xc1\x73\x3c\x18\x8e\x27\xa7\xc3\xb3\x8b\xbb\xc9\x87\xeb\x8b\xbb\xf3\x8b\x77\x09\xaf\x90\x05\xee\x5f\x65\x76\x7d\x33\x3a\x37\x63\x87\x01\x11\x50\x70\x73\x81\x4b\xb2\x9f\xba\xba\x40\x16\xef\xba\x69\x5d\x88\x8e\x91\xaf\x04\xa7\x26\x28\xbd\x4b\x62\xba\xc0\x3f\x2f\x5a\x26\x39\x82\x67\xd4\x77\x55\x14\xed\xc6\xdd\x73\x9c\xe5\xc5\x32\xd6\xd7\x3b\x86\x7a\x8e\xf7\x8e\x03\x27\x89\x5b\xb9\xb1\x76\x92\xd0\x93\x3c\xb2\xfd\x80\xf5\x5f\xd4\x62\x33\x2e\x8d\xe4\x75\x5c\x71\x2f\x59\xdf\xe0\xe8\xc8\xc8\x62\xea\x7d\xc0\x1e\x80\xe5\xe9\x06\xf3\x61\x20\xc6\x20\x0c\x48\x95\x73\x3c\x20\x2c\x8d\xbd\x83\xde\x34\xe3\xaa\x1b\xff\x87\xa4\xca\x80\x34\xe3\xe7\xf8\xad\xe9\xdc\x78\xa1\x78\x2e\x03\x17\xd2\x24\x1e\x0b\xe2\xbb\xc4\x0b\x7c\x38\x3a\x02\x33\xe9\x00\x9a\xb0\xb3\xd0\x4d\x05\x2b\x99\xef\x47\x37\x6f\x2e\x6e\xee\x86\xa3\xf3\x8b\xbb\x82\x7c\xf3\x44\xc8\xf6\x10\xc1\xd3\x93\x21\xe4\xb5\x12\x3d\xe5\x0d\x70\x14\xba\x44\x24\x89\x71\xea\xcb\x24\xa0\x2e\x15\x8f\x86\x69\xc6\x71\x79\x65\x58\xcb\x26\x05\x27\x74\x6e\xa4\xd7\x57\x6a\x4a\x0a\x9b\xe3\x8f\x5f\xb1\x0c\xd8\xba\x6d\xdb\xc5\xde\x83\x3d\xf0\x17\xe2\xde\x84\x8d\xe6\x6f\xe0\xf1\x15\x0b\x96\xc3\xc0\x85\xcc\x1e\x46\xf1\xcc\x6d\x6d\x6a\x9e\x80\xc7\xa1\x78\xeb\x4d\xff\x91\x5c\x2a\x8c\x9d\x5c\xf7\x64\x2b\x6d\x2c\xfb\xc2\xa1\x82\x51\x59\xcd\x91\x30\xe3\x34\xf6\x79\xc4\x18\x38\x49\xb9\x78\x4f\xc5\xfd\x5f\x60\x7a\xeb\xe1\x87\x01\x66\xf0\x29\xa2\x0c\xdc\x29\x4a\xdb\xe5\xa7\x88\x82\xf0\x1e\xd3\xd0\x72\x29\x27\x6c\xa9\xc4\x55\x16\xa6\x8a\x72\xfb\x9c\x97\x54\xf2\xff\x57\xdd\xa4\xd4\xff\x4e\x3f\x6d\x4b\xd6\xdf\xe9\xa8\xc3\x5c\xff\x06\x4f\xa9\x7e\x54\xdd\x21\x52\xbb\x41\x05\x04\x72\x64\xf2\xe7\x0f\x10\x3c\x31\x4f\x0e\xc3\xa5\x2d\xe9\x81\xb2\x80\xc0\xc4\x2e\x10\x47\xd0\x15\x11\xe0\x2a\xf1\x24\x0c\x25\xfc\xcb\xa0\x1f\xe5\x57\x65\xa5\xc8\x30\x4f\x32\x5f\x7f\xbb\x1e\x67\x97\x6f\xc7\x13\xa9\xc8\xe9\x95\x14\x7d\x22\xb0\x27\x01\x9a\x9d\xeb\x9f\x39\xe0\xa2\xc0\x9b\x74\xea\xc6\xf4\x09\x21\xe5\x39\xa2\x9b\x74\x6b\xa3\x0f\xfd\x37\xf4\xb9\xbe\x3c\x1d\x4a\x7d\xd2\x76\x4e\x65\xfc\xc8\x78\x61\xf6\x0e\x9e\x92\xd9\x93\x6b\x89\x48\x52\x0a\x46\x61\x95\x91\x2e\x2a\x49\x21\x76\xee\x83\x80\x83\x44\xda\x94\x78\x39\xaa\x9c\xfb\xab\x72\xa0\xa0\x68\x25\xe8\x3c\x01\xdb\xde\xe6\xf6\xcb\xc4\xaa\x45\x80\xd6\xdf\x90\x9c\x5f\xbc\xdb\xa1\x50\xb5\xbd\xff\x37\xa4\xa1\x59\x2e\xba\x44\x5a\x5c\x72\xba\x00\xaa\xf8\x76\x47\x76\xae\x9d\xa5\x7c\xe0\x94\x3f\x05\x36\x6b\x71\x55\x78\x25\x65\xd2\xce\xd7\xc8\x22\x74\xc1\x22\x78\x1b\x86\xc0\xce\x08\x07\xc3\xfc\x51\xd7\x52\x67\x68\x32\x8a\xf5\x2c\x66\x4a\x33\xa7\x34\x4e\x9f\x9e\x0c\xf8\xd1\xd6\x35\x63\x74\x3d\x19\x8c\x86\xa7\x97\xa6\x2e\xa3\xe3\x00\x68\x5f\xe7\x95\xdb\xd9\x2d\x4f\xd9\x52\xc1\x2f\xf5\x71\x08\x0e\x9d\x3f\x6a\x44\xf3\xc9\x12\xb4\x79\xc0\x34\x71\x0f\x9a\xfe\x63\xf5\xed\x7f\xd4\xb5\x74\x1d\xeb\x7d\x7d\xa4\xb0\x1e\xf1\xbc\x47\x8d\xff\x25\x5e\xda\x60\xae\x79\x30\x17\xda\xcc\x23\xfe\x03\x52\x47\xa9\x6c\x2e\x9e\x07\x4c\x71\xe4\x6a\x2d\xa5\xd7\x48\x24\x82\x25\x11\xd4\x91\xb2\xb1\x1e\x57\x5c\x71\xfd\xdd\xde\x88\xdd\x47\x9f\x2c\xa9\x93\x83\xb2\x3b\x21\xb8\x39\x28\x73\x55\x86\xf2\x4b\x5d\xfe\x4d\xcc\xbf\x51\x90\x83\x07\x8e\x00\xb7\xaf\x35\x34\xd9\x17\x35\x27\x69\xc9\x5a\x28\x7b\xb2\xde\xdf\x67\x75\x0e\xab\x97\xfa\x39\xac\xc0\x0b\xc2\x25\xf8\xa2\x84\x55\xbd\x94\xd5\x6f\x99\x1b\xa5\x81\x18\xf0\x20\x62\x0e\x70\x6d\x46\x9c\x07\xea\x2f\xd4\xea\x0f\xeb\x6a\x2f\xc4\x99\xa0\xdf\xd4\x03\x69\xef\x7a\xbb\xcf\x9a\x1c\x6e\xc8\x55\x97\xfd\xb3\x09\x34\x7c\xe6\xe8\xf9\xc5\xbb\xb8\x58\x4e\x25\xea\xdd\xa3\x86\xb8\x58\x48\xab\x19\xc7\x09\xf8\x2e\x90\xee\xb1\xd3\xf5\x58\xd5\xf3\xb7\xe9\x68\x63\xf3\x50\xcd\x2f\x4a\x8c\x93\x15\x90\x6f\x1a\x31\x50\x1e\x7a\xe4\x71\xc4\xdc\xec\x0d\x9f\xb5\x98\xc2\x8e\xa9\xde\xa1\x25\xeb\x85\x1b\xb9\x09\x28\xd8\xe7\x59\xa6\x44\x1c\xf8\x72\x61\x2c\x08\x13\xb0\x79\x75\x57\xb7\x97\x38\x4e\x45\x01\xfe\x67\x54\xb3\x3a\xad\x39\x71\xec\xcd\x38\x4b\x6c\xb3\x06\x3e\x1b\xe2\xe9\x09\x4c\x23\xc4\x1f\x1a\x6d\x23\xc0\x37\xa6\x19\xa3\xec\x94\x4b\x99\x1d\x62\xef\x67\xcb\x58\x8b\xc7\x10\xfa\x80\xe6\x40\x44\xc4\x80\xf7\x6f\x43\xfc\x69\xf4\xaf\x69\x2c\x0b\x99\x69\x98\x31\x6a\xf5\x7a\xbd\x46\xd5\x2c\x2d\x2a\x99\xa5\x79\xf9\x59\x5a\x32\x35\xe3\x36\x35\x5a\xed\x6e\xaf\x9d\x8c\xd2\xd2\x01\x1b\xd9\x8c\xcd\xd4\xac\xcc\xab\x98\x95\xf9\x3b\xb3\xb2\x9d\x51\x59\xc0\x07\x4b\xb2\x50\x03\xb1\x74\x92\x12\x10\x97\xfa\x8b\x11\x9f\xc0\x32\xf4\x88\x00\xfb\x45\x7d\x03\xec\xa4\x4f\x86\x81\x9f\x6d\x9d\x7a\xc0\xc4\x66\x5f\x3c\xb0\x77\xc0\xb8\xac\xc5\x6c\xbf\xec\x2c\x40\x4c\x36\x04\x46\xe1\x09\x7c\xcd\x82\x15\x75\x81\xa9\xa9\x80\xb4\x04\xfe\x88\xdd\xed\xd1\x1b\xf5\xd0\x66\x84\xa9\x36\x36\xce\xce\xa9\xb0\x48\x24\x87\x29\x83\x81\x1f\x46\x22\x1d\x21\x65\xcf\xf9\x51\x72\x41\xc5\x3b\xff\x88\x8f\x8b\x5b\x9b\xec\xdb\x18\x04\x9e\x9e\x9e\xb7\x49\x8a\x8f\x12\xb4\xcb\xf1\x04\x0f\xae\x4e\x7f\xbe\xd8\x6b\xba\x45\x5b\xab\x44\x50\x5f\x65\xaa\xe5\xf1\x05\x14\x93\x21\x3b\xf0\xb2\xf0\x0b\xcf\xd5\x2d\xec\x7f\x08\x2c\xfb\x83\x6d\xdb\x60\xf6\xfd\xc8\xf3\x0e\x4e\x34\xbf\x19\x32\x20\xf6\x9f\x98\x7d\x6e\x25\x54\xcc\x3c\xd9\xf7\xcc\x3c\xf7\xb8\x55\xce\x3a\xf7\x28\x8b\xb1\x62\xe7\x6a\xcb\x75\x61\xc7\xf8\xd6\x31\x8f\x52\x9a\xf7\x6f\x37\xde\x97\xd9\xbf\x3b\xaf\xdc\x09\xf1\xef\x1b\xb7\x96\x85\x77\x42\x28\x8f\x8c\x23\xc7\x01\xce\xab\xec\xfc\x1d\xa3\xd7\xc3\x72\x5e\x11\xea\x45\x0c\xcc\x38\x43\xfa\x69\xfa\x6c\xc6\x78\x25\x59\x52\x7b\xae\x72\x9c\x14\x00\xff\x8e\x02\x49\x70\xe6\xb3\xf4\x9a\x3c\x4a\x29\x2f\xbf\x8b\xda\x30\xfb\xab\x80\xba\x5a\xed\x44\xc6\xd8\x12\x38\x07\x7f\x01\x0c\x87\xd1\xcc\xa3\xfc\x3e\x2d\xe2\xd5\x85\x24\x4c\xd8\xf4\x21\x56\x45\x43\xb9\x9f\x8f\x53\x6c\x92\x5d\xbe\xf2\x8a\x3b\x03\x00\xf5\xc8\xcf\xc5\x0a\xa6\x1b\x73\x3d\x8f\xc0\x8a\xf3\xd9\x6d\xb9\x79\x51\x33\x8f\x8e\x0e\x51\x98\xaa\x52\xbc\xd4\x47\x63\x4d\x99\xa7\x9f\xc1\xd3\x83\xf4\x7d\xc0\xee\x56\x97\x7f\x0b\x39\x1c\x4c\xd4\x92\x26\x9f\xa3\x3f\xf4\x24\xe2\xf8\x43\xe9\x18\xba\x10\x4d\x25\xe7\xb3\x47\xca\xe1\x62\x93\x91\x6f\x0d\x0c\x66\xc9\xfb\xb6\xac\x82\x17\x1f\xba\x5b\xb8\x91\xb3\xa3\xad\xe7\x61\x6b\xe6\x11\x1d\x7d\x2b\x26\x29\xe2\x10\x52\x81\x43\xc8\x0e\x0e\xe9\x58\x35\xcb\xaa\xc2\x21\xe3\x12\x1c\x12\xe6\x71\x48\xf2\x8f\x3a\x85\x43\xea\x9d\x6e\x2d\xc1\x21\xe9\xff\xec\x24\x0e\x69\xd4\xba\x0d\xcb\x3c\xc9\xb8\x68\x9e\x14\x60\xae\xeb\x47\x70\x74\x64\xf8\x58\xfc\xf2\xde\xa8\x21\x0b\xd5\x4d\xe4\xe3\xc9\xe2\xa3\x51\x47\xba\xe3\xb1\x63\x11\x04\x9e\xa0\xe1\xb1\xc4\xf5\xe0\x0b\x1d\x49\x84\x83\xef\xde\x7e\x34\x2c\xa4\xf3\x90\xf8\xba\xfc\xfd\xe9\xe3\xa9\xfa\x8f\xdc\xf0\x2e\x94\x98\x4f\x82\x9d\xb0\x08\x76\x76\x00\x4e\xa1\x0f\xe2\x7b\x4c\x5c\x37\x9b\x0d\xef\x74\x2e\x1d\x7c\x32\xf3\xe0\x34\x72\xa9\xb8\x0c\x16\x0b\xea\x2f\x74\xe4\xc3\x67\x8d\xe1\xe1\xc0\x78\x51\x47\xb7\x53\xf3\xfb\x51\xe3\xd6\x43\xce\x32\xb4\x7d\xfc\x7f\xe1\x72\xe3\xa1\xe4\x4d\x13\x30\xde\xbf\xbd\xd5\x49\x18\x1e\x13\x29\xfb\xd8\x4b\x85\x4f\xa7\x88\xaa\xda\xd3\x5f\xab\x89\x50\x5f\x57\x1f\x3a\xca\xda\x69\x5f\xcf\xbe\x25\x6b\xea\x1e\xc9\xa2\xfa\xaa\xc7\xc8\x05\xc7\xe3\xfd\x7a\x1d\xad\x08\xe3\x7d\x0b\x29\xe3\xf0\xbc\x8b\x93\x81\x68\x76\x2b\xfb\x07\x2f\x70\x88\x47\xbf\xc2\x6f\xfd\xec\xe9\x95\xd8\x45\x53\xca\x69\xa9\x72\x7f\xfe\xfe\x47\x7b\x66\xb9\x8d\x76\xd3\xb5\x7a\xb5\x39\xb8\xb5\x7a\xd3\x69\xb4\xda\x5d\xa7\x37\x9b\xf7\x66\x04\x9a\x56\xcb\xed\xb4\x48\xbb\xd6\xfe\xf3\xf7\x3f\x7a\xad\x9e\x65\x75\x1b\xdd\x56\xab\x5d\x6f\x74\xeb\x6d\xab\xd3\xd7\x7e\x58\xeb\xff\x8c\xe6\xf3\xb9\x5b\x4b\x3e\xf4\xb8\x3f\x18\x4e\x2e\x6e\xae\x47\x97\xa7\x93\xc1\x68\x98\xa3\xf8\x9f\xe6\x86\x64\x3c\x39\xbd\x99\xdc\x4d\x4e\x7f\xbe\x3b\xbb\xbc\xb9\x9b\x8c\x46\x97\x93\xc1\x75\x7f\x4b\xd9\xaa\xa0\x1c\x9c\x8d\x86\x5b\xb2\x9f\x72\x74\x67\x97\xa3\xf1\x45\x05\xdd\xff\xb6\xfb\xf5\xe4\x5b\xca\xbe\x9e\xfd\xae\x52\xe5\xee\x6c\x34\x9c\x5c\x0c\x27\x39\x95\xac\xd2\x33\xe3\xeb\xd3\x61\x5f\xbb\x28\x31\xed\x66\x6a\xf0\x26\x9a\x01\xf3\x41\x00\xd7\x4e\xaf\x07\x1a\x07\xb6\x92\x8f\x7e\xdf\x4d\x1e\xc0\xef\xae\x38\xd6\x72\x57\xca\xcb\xd9\x5e\x4a\xc9\xc9\x51\xd5\x8b\x37\xfa\x69\x7b\xc5\x3d\x5b\x54\x5e\xe9\xa7\x9c\x43\x4a\x8f\xf4\x7f\x43\xb7\xb7\x0d\x94\x8b\xc4\x29\xba\x55\x59\x9e\xbe\xda\x8f\xd3\x48\xd6\xf5\x29\x82\x64\x6b\x92\xe4\x7f\x8a\xa5\xe4\x16\xd2\xf9\x3d\x09\x41\x47\x3a\xf5\xe7\xc1\xb1\x43\x99\xe3\xc9\x5f\x9c\x7e\x95\x1f\x96\x95\x71\xbd\x0e\x38\x95\xd1\xac\x23\x5d\x04\xe1\xb1\x07\x73\xa1\xab\xa2\x32\x4e\x28\xbd\x85\x8e\x9a\x6a\x61\x30\x1f\x85\xe0\xab\x73\x32\x07\x25\xd5\x3d\x38\x0f\xb3\xe0\x4b\x72\xe0\x6c\xfb\x4b\x47\xba\xaf\x32\xab\xb4\x2e\xa8\xab\xa5\x85\x64\x58\x49\xf6\xed\xfa\x4d\xa7\x31\x12\x69\xef\x2f\x54\xe6\x6d\xe1\x94\xb5\xb2\x96\x08\xd6\x51\x6d\xa7\x7a\x66\xd7\x50\x06\x26\xd4\x07\xa6\x67\x14\x16\xca\xea\x86\x2a\xb9\xb2\xfe\x36\x90\x95\xed\x36\x0b\xd5\x57\xcf\x6a\x6e\x2b\x59\xa6\x8e\xd4\xba\x21\x57\x3f\x0c\x1d\xa3\x8d\x3c\xd4\x40\xb5\x8a\x82\xdd\xdc\x2b\xd0\xb9\xdf\x52\x56\x67\x47\xd7\xcf\x8c\x84\x61\xaa\xa9\x14\xda\x95\x9e\x0e\x23\xa1\xa3\x56\x76\xa4\x97\x29\xaf\x68\xa2\xb7\x46\xbd\x86\xf4\x24\x6b\x0a\xfd\xa0\xf4\xd3\x44\x56\x6a\xbb\x5f\xdb\xaf\x8d\x5c\x34\x22\xb1\xad\xfb\x92\xfa\x4b\xd8\x36\x54\xbb\x09\x7f\x7d\x67\xa4\xf3\x77\xf9\xf3\x57\x31\x31\x1a\xf2\xb5\xef\x52\x06\x8e\xa0\x2b\xd9\x4d\x19\xbe\xfb\x80\x18\x7e\x7d\x89\x18\xe6\x0b\x44\xf0\x87\xbb\x26\x22\xf8\x6a\xf1\x06\x11\xfc\x7a\xf9\x2f\x44\xf0\xa7\xd5\x25\x22\x78\x76\xb5\x42\x04\xfb\x9f\x3e\x20\x82\xaf\x2f\xee\x11\xc3\xef\x3d\x44\xf0\x9b\x37\x67\xf2\xf8\x6b\xc4\x70\x84\x08\xfe\x7a\xfe\x6a\x8a\xb8\x78\xf4\x24\x6f\x5d\xcf\xb5\x69\xab\xd3\xb4\x2a\xc7\x05\x65\x6d\xba\x30\x2e\x48\x3b\xb2\xec\xd3\x8d\x6e\xab\xdb\x48\xfa\xf4\x6e\x73\x26\x49\x8c\xd1\xb9\x51\xdf\xfe\x1b\x15\x6c\x86\x2f\xc2\x57\x12\x22\x65\x51\xe7\xd2\x95\x8a\x1f\x96\x05\x9d\x5a\xb0\xb2\x05\x2b\x5d\x68\x64\x0b\x8d\x74\xa1\x29\x17\xa4\x6f\x9b\xf9\x80\x6a\xc9\xd5\xc4\x55\x09\x79\x2b\x6d\xf1\xb2\xe9\x33\x3c\x3e\x5f\x19\x6d\xd4\xc9\x13\xed\x7e\xa6\xe1\x34\x8b\x84\x90\x0c\xbb\x72\x6d\xe8\xbe\x36\x74\xc7\xa3\xce\x83\x8e\xf6\x8d\xc3\xf0\xd9\x2f\x57\x06\x48\xc2\xe0\xcb\x67\xc3\xc4\x20\xdf\x3c\xc3\x40\xd0\x39\x75\x48\x32\x35\x96\xef\xe6\x4c\xe1\x6e\x5e\xe1\xde\x9e\x0e\x31\x9d\x1b\x56\xd1\x64\x8a\xed\x09\xcb\xa2\x89\xa9\x68\x82\x7d\x39\x72\x4b\x46\x56\xdb\x8c\xe3\x92\x69\xcd\x01\x00\xf3\x17\xd1\x07\x3b\x8c\x3e\x24\xe0\x3e\x96\x79\x71\xec\xe7\xb4\xcd\xc3\x90\xbd\xab\xf4\xf5\xbd\xa5\x2d\xe8\x48\x30\x47\xfd\xbb\x30\x47\x32\x39\xd0\xa4\x2a\x9a\x62\xad\xe5\x75\xf9\xf3\xf7\x3f\xea\x8d\x66\xa3\xde\xb4\x6a\x9d\x5e\xbb\x4d\xba\x96\xd3\xe9\x36\x67\xed\x59\xdb\x69\x37\xad\x56\x87\xf4\x7a\xbd\x7a\xa7\xde\x9b\x75\xba\x7f\xfe\xfe\x47\xa3\xdb\x6a\xc8\x14\x6a\xb5\x7b\xbd\x4e\xaf\xd5\xab\x75\x9b\xdf\x02\x3b\x64\xef\xd2\x95\x2f\x74\xa4\x13\xf9\x70\xd3\xd4\xdf\x63\x97\xf8\x49\x67\x62\x81\xea\x43\x6a\x55\x75\x16\x7f\x31\x98\xab\x62\x5f\xdc\xa9\x6f\xbe\xe9\x05\x0e\x53\x74\x9b\x6d\x1d\x53\x01\x4b\xbe\xb7\x22\xbb\x9c\x20\x82\x3a\xc5\x1d\x27\xf0\x37\x45\x53\x8a\xcb\xfa\x23\x7c\x71\x3c\xb2\x54\x26\xda\xb4\xc9\xc2\xa9\x02\x1b\x01\x5f\x44\xda\x77\xd3\x26\x98\xa5\x91\x4e\x18\x25\x9b\xde\x7c\xe6\x05\x3c\x61\xe4\x24\xdf\x1a\x28\x4d\x2f\x29\x5b\x91\xde\x53\xd7\x05\xd5\xd7\x58\x04\xb9\x86\x9d\x1c\x78\xae\xa9\x31\xd5\x54\x6a\x88\xa0\x1e\xca\x4a\x4a\x2d\x2d\xda\x2c\xa9\xd9\xca\xb2\x48\x94\x24\x51\xb1\x28\x73\x3c\x6a\xc9\xb2\xbf\xba\x44\x3e\x1e\xf4\xbe\x96\x97\xd4\x78\x6a\x9e\xfc\x7f\x00\x00\x00\xff\xff\xb4\xe2\x2f\x5a\x35\x29\x00\x00") - -func bindataTkgWebDistTkgkickstartui175es2015D46a578ff1b6cad5d45aJsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui175es2015D46a578ff1b6cad5d45aJs, - "tkg/web/dist/tkg-kickstart-ui/175-es2015.d46a578ff1b6cad5d45a.js", - ) -} - -func bindataTkgWebDistTkgkickstartui175es2015D46a578ff1b6cad5d45aJs() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui175es2015D46a578ff1b6cad5d45aJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/175-es2015.d46a578ff1b6cad5d45a.js", - size: 10549, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui175es5D46a578ff1b6cad5d45aJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x7d\x77\xda\x38\x97\xff\x2a\x8e\x77\x0f\x2b\x6d\x15\x0f\x2f\x81\x04\x78\x7c\xf2\x64\x93\x74\x86\x69\x0a\x99\x42\x3b\xdb\xc9\xe4\xe4\x08\xfb\x1a\x34\x31\x96\x2b\xcb\xb4\x34\xf0\xdd\xf7\x48\x7e\x05\x4c\xd2\xce\xd3\xdd\xfd\x27\x60\xe9\xea\xde\xab\xfb\xfa\x93\x4c\x8e\xbc\x38\x70\x24\xe3\x01\xc2\x4f\x66\x1c\x81\x11\x49\xc1\x1c\x69\xf6\x97\x54\x18\x40\x64\x3f\x9b\x37\x18\x02\x22\xf1\x93\x00\x19\x8b\xc0\x90\xeb\x35\x92\x36\x58\x91\xcf\x1c\x40\x75\x8c\xc9\x68\xfa\x17\x38\xd2\xf2\x04\xc0\x57\x40\xe9\x93\x0b\x1e\x0b\xe0\x56\xf0\x10\x84\x64\x10\x21\x20\x4f\x82\x7e\xee\x3d\x2d\xa9\x1f\x43\x6f\x7b\x8d\xc4\x9b\x0d\xc6\x9b\x5c\xa2\x48\x24\x32\x0f\x1d\x21\x30\x58\x10\x49\x1a\x38\xc0\x3d\x43\x62\x2c\xe7\x82\x7f\x36\x02\xf8\x6c\x4c\x56\x21\x5c\x0b\xc1\x05\x32\x2f\x69\x10\x70\x69\x38\xd4\xf7\x0d\x6a\x38\x3e\x8d\x22\x83\x46\x06\x35\x32\x96\x66\x89\x7b\x90\x70\xf7\xb8\x40\x6a\xaf\xcc\xae\xf7\xd9\x3f\xa4\xe5\x43\x30\x93\xf3\x3e\x7b\xf5\x0a\x3f\xa9\x71\x61\xcb\x3b\x76\xdf\x17\x16\x04\xf1\x02\x04\x9d\xfa\x60\x97\x1f\xd6\xeb\xa3\x06\x11\x96\xc3\x03\x8f\xcd\xe2\x64\xfe\xa8\x4e\x4c\xbd\x41\x93\x05\x86\xa8\xd5\x90\xb0\x3e\x0b\x26\xd3\xb9\xdc\x54\x5b\xc6\x59\x21\x20\x28\xb0\x85\xf5\x08\x2b\x12\xd9\x4b\xce\x5c\xa3\x4e\xcc\x68\xb5\x98\x72\xdf\xb4\x6d\xb9\x0a\x81\x7b\x28\xb2\x73\x87\x65\xc6\x31\xb9\x66\x67\x1e\xa5\x34\x06\xac\xd7\x41\xec\xfb\xb6\x6d\x03\x4e\xdd\x05\xfd\x64\x8f\x70\x37\xd6\x0c\x2d\xc9\x6f\x05\x5b\x30\xc9\x96\x70\xdf\x67\x1e\x4a\xe4\x1d\xd9\x36\xcb\xb6\xcd\x2c\x65\x47\x25\x65\xbd\x36\x5d\xf0\x68\xec\x4b\x13\xf7\xab\x04\x8a\x4c\x8c\xe8\x57\xfa\xe5\x9f\xff\x2c\x89\x33\x16\x71\x24\x8d\x74\x01\x35\xc2\x7c\x5c\x5b\xcc\x32\xf1\x26\x99\x43\xa6\x0a\xc5\x60\x66\xda\xb6\x2d\xcf\xc7\xfa\x7b\x6f\x18\x2f\xa6\x20\x30\x02\xbc\x41\x01\xc9\x28\x30\x3e\x8f\x7a\x09\x05\x8a\x30\x26\x02\x6f\xd4\x1e\x02\x12\x15\xee\x56\xa1\x27\x09\x2b\x02\xb8\x56\x0b\x10\x58\xa1\xe0\x92\xab\x6d\x10\x89\x09\xd3\x63\x84\x1d\xf6\x90\x99\xd3\x9b\xe4\x29\xf3\x69\xef\xa8\xb1\xc1\x04\x0a\x59\x14\xe5\x62\xa8\x6d\xc6\x41\xc2\xc6\x2d\x0c\xf6\x0e\x3c\x1f\x1c\x59\xab\xa5\x5f\xac\x19\xc8\xf3\xd2\x77\x6b\xca\x02\x17\xe1\x5e\xd9\xd7\x24\xf7\x0c\xd7\xae\x57\x9e\x10\xc9\x50\x60\xa7\xfa\xce\x40\x8e\x3e\x07\x99\xbe\x57\x10\x39\x82\x85\x92\x0b\x24\xd4\x82\x54\xa5\x40\x4b\xd3\x7f\x13\x17\x53\x31\x8b\x17\x10\xc8\x28\x0d\xfe\x7f\xb4\xce\xa1\xc7\x70\x2f\xb0\xb4\x4b\x36\x1b\x42\x2d\x1a\x86\xfe\x0a\xc9\x39\x8b\x48\x4e\x5e\x4a\x26\x5e\x24\x53\xff\x28\x55\x26\x37\x95\x35\xa7\x51\x49\xad\x3c\xae\x70\xad\xa6\xe2\xf4\xc8\xb6\x11\xd8\x1e\x02\x8c\xfb\xb9\x92\x25\x6b\xfa\x45\xa4\xe7\x79\x9c\x5b\x52\xe6\x3c\x64\x75\x4d\x18\xc7\x21\x08\x03\xbe\x84\x02\xa2\x48\xb1\xd3\xe1\x07\x4c\xce\x41\x18\x53\x30\xd4\x6a\x83\x8b\xad\x22\xd1\x2f\xc5\x45\x66\x5a\x47\x00\x95\x80\x64\xad\x56\xda\x19\x79\x72\x78\x10\x49\x11\x3b\x92\x8b\xac\xa8\x01\x29\x02\xa3\x4e\xca\x85\xa1\x77\x54\xdf\x6c\xfe\x56\x70\xc9\x5a\x2d\xd6\x66\x28\xcc\x12\x6f\xd5\xe3\x38\xd3\x33\x02\x79\x9b\xb1\x19\x79\xe7\x95\xa3\x55\xe1\x95\x73\x02\xeb\xe1\x41\x2b\xf2\xf0\x60\x4b\x02\x1b\xb2\x2b\x38\x44\x90\x84\x9d\xb4\x4b\xcd\x43\xb9\xa7\x88\x74\x7b\x27\xd2\xd7\xeb\xa3\x2c\xbc\x73\x8b\xa5\x45\xe3\xa8\xa1\x22\x79\x6f\xd6\x8a\xe6\x74\xb1\x45\x52\x78\x3f\xe7\x7e\x2b\xf8\x97\x55\x46\x54\xef\x4b\xb1\xca\x76\xf1\x5f\x9c\xfb\x40\x83\x52\x10\x6a\xe7\x8c\xbc\x24\xfa\xf6\xc4\xa1\x74\x01\xb9\xbb\x27\xa5\x5d\x6d\x30\x26\x47\xf5\x8d\x43\xa5\x33\x57\xdb\xce\xf4\xd9\x6c\x50\x1e\xaa\x25\x72\x5d\x64\x89\xd0\xc1\xac\x54\x96\x59\x7e\x7a\x3a\x75\xb0\x55\x0a\x97\x3e\xb3\xf7\xb5\x10\x45\x76\x91\x00\x6f\xc0\x8f\xc0\x60\xb6\xa8\x4e\xbf\x4c\x01\x27\x99\x60\x78\x53\x38\xc9\xc9\x93\x46\xd6\x6a\x79\xc5\xce\x0d\xa7\x6a\xfa\xbe\x39\x25\xce\x0a\xb9\xdc\xea\x09\x07\x52\xeb\x0a\x04\x5b\x82\x6b\x94\x36\x15\x19\x0b\xba\x32\x78\xe0\xaf\xb2\x0a\x9f\x48\x56\x19\x56\x44\xc7\xbe\xe9\x40\xab\x9a\x08\xd4\x7d\xab\x10\xf8\x0e\x3c\x10\x10\x38\x99\x54\xb5\x57\x63\x4e\xa3\xe0\x3f\xa4\x31\x05\x08\x0c\x16\x30\xc9\xa8\xcf\x22\x70\x8d\x63\x23\x52\xf9\x8e\xf0\x16\x85\x72\x79\x59\x2c\x6c\x54\x03\xc9\x6d\xe5\x15\x9e\x35\xbc\xe7\xf3\x68\xf6\x42\x1e\x55\x65\xd1\x7a\x5d\xb9\x58\xa9\x40\xf4\x5f\x14\x81\xef\x59\x9f\x61\x1a\x52\xe7\xf1\x72\x1e\x07\x8f\xf2\x71\xf6\xf0\xc8\x9c\xc7\x48\x52\x21\x1f\x62\x66\xbf\x48\xb1\x5e\xdf\xdd\x63\x2b\x8c\xa3\x39\xba\xbb\x6b\x9c\xb6\xef\xc9\x53\xb3\xd9\x6c\x9c\xec\xb5\x10\x66\xb9\x48\x92\xa7\x5f\x7a\xa5\xb0\x4d\x75\x5e\x6d\x36\xb8\x9f\x34\x4e\x6e\x33\x74\xd6\x6a\x34\x4f\x31\x89\x6d\x86\x4e\x4f\xba\xf5\x13\x4c\x1c\x9b\xa1\x66\xab\xdd\xc6\x64\xae\x06\x1b\x8d\x76\x0b\x13\xd7\x66\xa8\xd5\x39\xed\x62\x32\xb3\x19\x6a\xd4\x3b\xad\x2e\x26\x4b\x9b\xa1\x76\xbb\xde\x6d\x61\xb2\xb2\x11\x0a\xec\xb2\x89\x7c\xc4\x08\x24\x92\xa4\x1d\x22\x86\xb7\x40\x66\x9a\x32\x99\xaf\x44\x16\xdc\x0a\x1d\xa5\x0d\x4b\xe7\x12\x56\x19\xcd\x5c\xaa\xd6\x8d\x41\x2c\x99\x03\x36\x90\xc0\x0a\xb8\x0b\x2a\x48\x23\xfb\xee\x9e\x04\x29\x98\x30\x22\xc4\xc8\xdd\xd3\x23\xac\x7a\x66\x30\x1b\x05\x83\x80\x49\x93\x24\xf5\xba\x64\x08\x8a\x3c\xc4\x8a\x9a\x81\x49\x89\x38\x4d\xe0\x5c\x3e\x71\xac\x3f\xac\x38\x02\x71\x45\x25\x7d\xcd\xc5\x22\x55\xc2\x9a\xc6\xcc\x77\xd5\x80\xa6\xb3\x3c\x2e\x16\x3f\x0b\x1e\x87\x9a\x83\xf5\x99\x7d\xa5\xc2\x1d\xd2\x05\x90\x7c\xba\x78\x8a\x62\x95\xe8\x63\x09\xe1\x5b\x1a\x86\x0a\xcf\x60\x9c\xcc\xcc\xe5\xc2\x7f\xcd\xc0\x77\x6f\xe8\x14\xfc\xc8\x56\xd2\x3d\xf5\xfc\x96\x86\xef\x25\xf3\x99\x82\xd7\x2a\xc4\x0a\xa2\xb7\x34\x44\x2f\x70\x8d\x24\x17\x70\x95\x80\xbb\x84\xf1\x4b\x2b\x04\xcc\x58\x24\x41\xa4\x8b\x5e\x33\x1f\x06\x8b\x90\x0b\x09\xee\x2f\x34\x70\x7d\x48\x1c\x66\xc1\x12\x82\xad\xd9\x97\x36\x78\x90\xb1\xce\xfb\xe7\x78\x6b\x82\x6c\x43\xf1\x54\x81\x9e\x29\x4c\x78\xea\x8f\x08\xa5\x53\xbe\x62\x1f\x4c\xf8\xb5\x5a\x9d\x8f\x46\x20\x2f\xfd\x58\x09\x56\x5e\x18\xa4\x95\x4c\x87\xc3\x66\x43\x92\x88\x71\xa8\x70\x2f\x7d\xe6\x3c\x5e\xc1\xb2\x22\x6a\x72\x3e\x3c\x90\x82\xfb\xb7\x3e\x0d\x60\xc2\xaf\x60\x99\xc9\x90\x82\xcd\x66\x20\xd4\xae\x33\x4c\xc6\x78\x70\x39\xa7\xc1\x0c\xaa\xc4\xdc\x0a\xee\x7e\xb3\x1c\x45\xfc\x9d\x82\x5c\x58\x0e\xd2\xd3\x94\xca\x94\x0f\xfa\xa8\x42\x66\x20\x2b\x8a\x82\xe6\x9b\x85\x95\xa6\x44\x73\xcb\xb3\x06\xc3\xf1\xe4\x62\x78\x79\xfd\x30\xf9\x78\x7b\xfd\x70\x75\xfd\xa1\xe0\x1e\x0a\xee\xfe\x58\xf6\xb7\xef\x46\x57\x25\x33\x69\x24\x56\x0a\xa1\x0a\x53\x95\xb9\x27\xf4\x69\x58\x6d\x45\x5e\xce\x72\x3b\x34\x0e\x99\x3e\x8b\xd0\x51\xa0\x15\x4d\xcd\x5a\x69\x8d\xc4\x1d\x3c\xb8\xda\xb6\x74\xb2\x24\x69\x1b\x49\x11\x23\xdf\xc5\x59\x19\x22\x63\x7d\xbb\x63\xe6\x97\x78\xef\x04\xc5\x24\x09\x95\x08\x3d\x39\x49\xf8\x2b\x1e\xc5\x89\x41\x41\xd5\xc2\x3e\x15\x59\x55\x61\xa4\x9c\xfc\xc0\xbe\xf7\x96\x00\x7e\x82\x5a\x0d\x65\x71\xfd\x3b\x17\x8f\x20\xca\xeb\x06\xde\x90\xcb\x31\x48\x04\xe9\x66\x1c\x1f\xa8\x48\xe3\xff\xd9\x68\xc1\x25\x65\xaa\x2d\xf5\x7f\xa4\x8d\x4a\x8d\x92\x21\x9f\xe3\x5b\xa5\x11\xf3\xd0\x91\x96\xb5\xe0\x2e\xa4\x85\x6a\x2c\x69\xe0\x52\x9f\x07\x50\xab\xe5\x50\x3c\x4b\xa4\x54\x1d\xad\xc9\xef\xa3\x77\x6f\xae\xdf\x3d\x0c\x47\x57\xd7\x0f\x5b\x5a\xe1\xbe\x4c\xf0\xf0\x7a\x8d\x34\xd4\x49\xb4\x57\xfb\xb2\xe2\xd0\xa5\x32\x49\xda\x8b\x40\xa5\x24\x73\x99\x5c\x21\xb5\x89\xd2\x2e\xf6\x6a\x5d\x45\x3c\xe8\x2b\x24\x0d\x83\x13\x63\x69\xe5\xd5\x0a\x3b\xb6\xfe\xf8\x6a\xa9\x34\x69\xa8\xc3\xbd\x9a\xcd\xbb\x76\x7a\x06\xc5\x90\xef\xe8\x0d\xac\x5e\x0b\xbe\x18\x72\x17\x32\xab\xa1\xed\x35\x77\xf5\x7b\xdc\x57\x58\xb9\x6c\x8b\xbc\xef\x2a\x1e\x07\x1c\x93\x18\xa1\x5f\xc8\x1a\xab\x7e\xf8\x5c\x99\x3b\xd8\xc5\xd4\x11\x29\xcd\xb7\x28\x16\x02\x9c\xa4\xa4\xfd\xce\xe4\xfc\x5f\x60\x7a\xe7\x5a\x8f\x03\x4b\xc0\xa7\x98\x09\x70\xef\x49\x0a\x13\x3e\xc5\x0c\xa4\xbf\x4a\xc3\xd0\x65\x11\x15\x0b\x2d\xee\xc5\xe2\x59\xd9\x3e\xbe\xdf\x77\xba\x10\xfd\x3f\x3a\x4f\x6f\xea\x3b\xbd\x57\x14\xcf\x1f\xe9\xbe\xe7\xb9\xfe\x00\xff\x6d\xf5\xd6\x43\xbd\xec\x90\x07\x0f\xc0\x44\x47\x15\x8f\xb2\xa6\x73\x6b\x82\xfb\xcf\x43\xca\x82\xf4\x99\xc2\x42\x00\x5b\x2e\x50\x47\xb2\x25\x95\xe0\x6a\xf1\x34\x0c\x15\x44\xce\xe0\x31\x8b\xde\x56\x95\x32\x94\x1d\x08\xbe\x5d\x8b\xcb\x9b\xf7\xe3\x89\x52\xe3\xe2\xad\x12\xdc\x97\x96\xaf\x20\xac\x5d\xea\xfa\x25\x68\xa7\xe1\xad\x72\x74\xee\x8e\x84\x90\x45\x25\xa2\x77\xe9\x54\xaa\x0d\xfb\x1b\xda\xdc\xde\x5c\x0c\x95\x36\x29\x04\x61\x2a\xa2\x54\x04\x09\x7b\x07\x6f\xaa\x6c\x2a\xb5\x6b\xa2\x28\xa5\x60\xb0\xcc\x48\x67\x07\x49\xa1\x08\x88\x39\xe7\x11\x0c\x92\x23\x70\x89\xfa\x60\x40\x1c\xca\x95\x2d\xf5\x0f\x42\xf5\x3e\xd8\x76\x51\x01\xce\x13\x4b\x97\x61\x2b\xc2\xbd\x9c\xe4\xea\xfa\xc3\x0e\x85\xc6\xc4\xbd\x1f\x90\xae\xb8\x5a\x74\x85\xb4\x12\x86\xd9\xe1\xf2\x02\x6c\x8c\x0a\x4a\xd5\x25\x77\x86\xca\x41\x56\x7d\xb0\xca\xc7\x76\x92\x77\x37\x24\x9f\xf7\x54\x25\x38\xb3\x24\x7f\x1f\x86\x20\x2e\x69\x04\x08\xbf\x32\x8d\xd4\x79\x86\xca\x04\x33\xbf\x16\xaa\xca\xbd\xca\x58\x5f\xaf\x11\xbc\xb2\x4d\x03\x8d\x6e\x27\x83\xd1\xf0\xe2\x06\x9b\xe5\x18\x3b\x78\x44\x3a\x04\x94\x9d\x4a\xea\xea\x62\x50\xa9\xd0\xb9\x39\x0e\xc1\x61\xde\xca\xa0\x46\x40\x17\x60\x78\x5c\x18\x72\x0e\x86\xf9\xea\xb0\x55\x5e\x99\x46\x3a\x6e\x99\x3d\x73\xa4\x51\x2e\xf5\xfd\x95\x11\xfd\x4b\xbc\x8c\x81\x67\xf8\xe0\x49\x63\xea\xd3\xe0\x91\xe8\xa5\xfa\x5d\x94\xef\x83\xd0\x1c\x23\x3d\x96\xd2\x1b\x34\x96\x7c\x41\x25\x73\x94\x6c\xcb\xcc\xad\x58\xb9\xd5\xc3\x31\xf8\xed\xc6\x2a\x8e\x75\xab\x80\x2e\x98\x53\x02\xf9\x2f\x84\x78\xce\x50\x55\x0c\x95\x42\xe7\xa6\xfa\x1b\xa7\x57\x88\xe9\x86\x22\xf0\xc1\x91\xe0\xf6\x8c\x96\xa1\xba\xb6\xe1\x24\x00\xc2\x08\x15\x82\x30\x7b\xfb\xac\xae\x60\x79\x6e\x5e\xc1\x12\x7c\x1e\x2e\x20\x90\x15\xac\x1a\x95\xac\x72\xb7\x2b\x83\x0a\x88\x78\x2c\x1c\x88\x8c\x29\x75\x1e\x59\x30\x4b\xbc\x66\x39\x3c\x70\xa8\x44\x87\x9d\x47\x72\xe7\x99\x78\xdf\xfc\xd9\x5e\x9f\x3d\x91\x96\x01\x4f\xa9\xe0\x55\x73\xd3\xe8\xf7\xfb\x98\x5d\x5d\x7f\xa8\x48\xaf\xca\xc2\x0d\xdb\x49\xa5\xb9\x14\xb9\x39\x7b\x7e\xf1\x41\x45\x8a\xa2\xa4\xcf\x30\xcf\xb2\xd8\x13\x6f\x16\x51\xad\x5b\xdb\xfb\xf4\x16\xec\xe0\x9d\x45\x99\x48\xc1\xc1\xac\x5a\x7e\xd3\xed\x14\x8b\x42\x9f\xae\x46\xc2\xcd\xae\x7f\xb2\xee\xbb\x35\x53\x3a\x64\x55\xcd\xbf\x60\x99\xf4\xfd\xe6\xbe\xac\x2a\xe5\x4a\x47\x4b\x35\x31\x96\x54\xc8\xca\x54\x4e\x0c\x77\xa0\x43\xab\xc4\xbd\xc7\x84\x6d\x10\xb7\x06\x18\x5b\x7f\xc6\xf5\xe6\x69\xdb\xa3\x8e\x5d\x71\x9d\x1c\xc0\x67\x04\xeb\x75\x80\xd1\xcc\xfa\xd8\xea\xa0\xa5\xf5\x0e\xe3\x0d\x09\xd2\x55\x2e\x13\xf6\xcc\xf2\x7f\x6e\xa2\x27\xb9\x0a\xa1\x17\x10\x0f\xa8\x8c\x05\x44\xbd\xbb\x99\xf5\x69\xf4\xd7\xfd\x06\x93\x00\x6f\x48\xbb\xdb\xed\xb6\x0e\xdd\x09\xc7\x15\xd6\x71\xb7\xef\x84\x93\xdb\xdf\xd8\x66\xa8\xdd\x39\xeb\x76\x92\x2b\xe1\xf4\xa2\x78\x5e\x5c\xff\xba\xdf\x77\xe7\x9b\x1d\x37\xf6\xaf\x7c\x61\xe7\xca\x97\x47\x83\x05\x9d\x25\x77\xbb\x60\xf9\x9c\xba\x2c\x98\x8d\xa2\x09\x2c\x42\x9f\x4a\xb0\x8f\x1a\x04\x14\x9e\x56\x5e\x1c\xf2\x20\x1b\xbf\xf0\x41\xc8\x64\x52\x3e\x8a\x0f\x20\x22\xd5\x8f\xf8\x7e\x89\x9d\x81\x9c\xe4\x04\x48\x35\xc1\xfd\xfb\xe3\xd2\x65\xc8\xad\xe0\x4b\xe6\x82\xd0\xf7\x46\x15\x01\xa0\x24\xb8\x05\xfb\x77\xfa\x2a\x46\x50\xa1\xe1\xc1\x38\xe3\x93\x6c\x57\x07\x4b\x98\x32\x1c\x04\x61\x2c\xd3\x8b\xce\xec\xc2\x67\x94\xec\x5d\xcb\x2a\x5f\xf3\x94\xc2\xb1\x4c\x72\xb0\x90\xe4\x36\x84\xf5\xfa\xee\x3e\xbd\x1b\xad\xb2\x64\x76\x1e\x52\x59\x98\x9c\x4e\x62\x6b\x62\x0d\xde\x5e\xfc\x7c\xbd\x07\x72\xc8\x16\xeb\xad\x5c\xd4\x43\x2a\xeb\x4b\x78\xaf\x4a\xb9\x72\x3e\x66\x8c\xce\xb7\x9e\x2c\x4f\xed\x3a\x5f\x53\xfa\x35\x8a\xa5\xfa\xb0\x6d\xdb\xb0\xc1\xbd\x20\xf6\xfd\x5c\xfe\x8f\xba\xec\xff\x66\xfc\x47\xf8\xff\xc6\x6b\x81\x42\xc2\x81\xd7\x01\xfc\x7b\x5e\x07\xec\x71\x3b\xf8\x1a\x60\x8f\x72\x3b\x40\xed\x52\x8d\xbc\xdd\x9a\x41\xdf\x7a\xfb\xa8\x95\x8e\x7a\x77\x79\x68\xa9\x52\xb5\x7b\x95\xbf\x95\x67\xbb\xac\x5f\x7a\x13\x51\x95\x53\x09\xa1\x5a\x32\x8e\x1d\x07\xa2\xe8\x90\x9d\xbf\xe3\xad\xc4\xf3\x72\x5e\x53\xe6\xc7\x02\x8a\xcc\xc8\x0e\x7b\x69\xce\x1e\xbc\x75\xae\x48\xcd\x7a\x7e\x6f\x70\xa0\xce\xf5\x4b\x27\x88\x1d\xb5\x92\x90\x2d\x17\x8a\x5b\xba\x52\x32\xce\xbf\x8b\x1a\xe1\x5e\xf2\xb6\xb6\xaf\x22\x6f\x01\x51\x04\xc1\x0c\x84\x15\xc6\x53\x9f\x45\xf3\xb4\x0f\x1d\xae\x69\x61\xc2\xa6\x07\x9b\xad\xfa\xa5\x83\x23\x1a\xa7\x30\xf1\x90\x49\x0e\x6e\x7c\xe7\xee\x48\xaf\x2e\x45\x96\xc5\x72\x23\xfe\x7d\xd0\xbc\xfd\xb2\xa2\xa8\x88\x47\x75\x5c\xab\x3d\x47\x81\x75\x91\x3a\x37\x47\x63\x43\x9b\xb3\x97\x9d\x40\x9e\xa5\xef\x31\xcb\x2d\x74\xfb\xa1\xb8\xeb\xd9\x32\x50\x01\x85\x4a\xf4\x7f\xe7\x54\x1d\x5b\x1f\xbf\xeb\x1d\x4e\x29\x86\x2b\x50\x58\x06\x16\x9e\x2f\x7c\x19\x79\xe1\x26\xc0\x15\xd7\x2c\x55\x2d\x6a\xe7\xbe\x25\x81\x6a\x8e\x86\x6a\x25\x87\xd8\x5b\x47\x96\xcc\xb5\x66\x8e\xcc\x5e\xc2\x73\xdb\x18\x6e\x7e\x00\xc3\xcd\xcb\x18\xee\xb4\x59\x6f\x36\x0b\x43\x49\x12\x10\x8a\x9f\xa8\xe5\xa2\x80\x3c\x8d\x2b\x0c\x3f\xcf\x30\x1c\xb7\x69\xfa\xaa\xde\xb7\x29\x6a\x37\x4e\xcf\xea\x0a\xcc\xd1\x0c\xb6\x85\x6a\xbe\x7e\xd6\x6a\x96\xd0\x59\xfa\x43\x92\x46\x0d\x6a\x35\x14\x5b\xf2\x97\xdf\x51\x9d\x34\x49\x03\x93\xd8\x9a\xcc\xfe\x40\x0d\x62\x3a\xbe\x38\x96\x9c\xfb\x92\x85\xc7\xea\x40\xa7\xc1\x47\x47\x11\x3c\xbc\xff\x03\x35\x89\x19\x85\x34\x30\xd5\xf3\xa7\x3f\x2e\x90\xfa\x1c\x3e\x84\x0a\x47\x2b\x9d\x3c\x32\xb7\x11\xf2\xca\x3f\x25\xca\x65\x83\xda\x43\x82\x8e\x00\x17\x48\x0c\xbe\xe1\x4d\xbe\x6f\xcd\x2d\xea\xba\xd9\xdb\x90\x9d\x96\x6b\x42\x40\xa7\x3e\x5c\xc4\x2e\x93\x37\x7c\x36\xd3\x01\x18\xc0\x67\x83\x5b\xc3\x01\x3a\x6a\x90\xbb\x7b\x9c\xc0\x73\xd8\xa0\x6f\xc4\xe6\x1e\xde\x10\x2f\xa5\x74\x16\xa1\x1d\x5b\xff\x1d\x2e\x52\x5f\x7a\x24\x39\xf9\x72\x11\xf5\xee\xee\x4c\x1a\x86\xc7\x54\xc9\x3e\xf6\x53\xe1\xf7\xf7\x84\xe9\xf2\xd8\x7b\xd2\x77\x98\x3d\xd3\x4f\xee\x86\x32\x1c\xd0\x33\xb3\x6f\xc9\x98\xde\x47\x32\xa8\xbf\x9a\x1b\xe2\x82\xe3\x47\xbd\x46\x83\x2c\xa9\x88\x7a\x4d\xa2\x7f\x96\x13\xed\xc7\xc3\xdd\x5d\x8b\x94\x16\xde\x93\x3b\xed\xc1\xf4\x28\x7e\x9c\x0a\x36\xcd\x7b\xf2\xef\x3e\x77\xa8\xcf\xbe\x82\xda\x1f\x02\x9b\xa1\x3b\xb3\x97\x9d\xe5\x13\x13\x1a\x7a\x1f\x46\xba\x8f\x3f\xe3\xe6\x49\xc3\xeb\x4c\x9b\x6e\xab\x73\xe2\x36\xbb\x75\x0f\xdc\x7a\xe3\xc4\x69\xb5\x3b\x67\x4e\x77\xea\x75\xa7\x14\x4e\x9a\x6d\xf7\xb4\x4d\x3b\xf5\x4e\x42\xdd\x6d\x77\x9b\xcd\xb3\xd6\x59\xbb\xdd\x69\xb4\xce\x1a\x9d\xe6\x69\xcf\x30\x89\xd9\x1b\x0c\x27\xd7\xef\x6e\x47\x37\x17\x93\xc1\x68\x98\x0c\x8d\x27\x17\xef\x26\x0f\x93\x8b\x9f\x1f\x2e\x6f\xde\x3d\x4c\x46\xa3\x9b\xc9\xe0\xb6\xb7\x3f\x33\xb8\x1c\x0d\xf5\xf0\xe5\xcd\x68\x7c\xbd\x3f\x5c\xc9\xe7\xe1\x72\x34\x9c\x5c\x0f\x27\x3b\x14\xe3\xdb\x8b\x61\xcf\xb8\xae\xd8\x6c\x7e\x91\xf4\x26\x9e\x82\x08\x40\x42\x64\x5c\xdc\x0e\x8c\x08\xc4\x12\x84\x41\x03\x37\xb9\xe3\xf8\xf0\x36\xb2\x8c\x6d\x6d\x34\xd3\x7d\x05\xab\x34\xa9\xa4\xe8\x99\xf7\x18\x13\xf3\xcf\xd8\xf3\x3c\xb7\x9e\x7c\x98\xd9\xf3\xbf\x9d\xec\x0e\xb4\x77\x06\x7e\xda\x1b\xf9\xcf\x4e\xaf\x91\x7c\x4b\x97\x34\xb2\xe7\x82\x4b\x73\x6f\xe8\xa7\xca\xb1\xc6\x36\xab\x9f\x0a\xde\x25\xa2\x4c\x47\x9c\x44\xdf\x24\x29\x1f\x29\x2c\x54\xd1\x47\xcc\x68\x4e\x43\x30\x89\xc9\x02\x8f\x1f\x3b\x4c\x38\xbe\x7a\x8a\xd8\x57\xf5\xd1\x6c\x66\x81\x7b\xcb\x23\x96\xb4\x6d\x53\xf2\xf0\xd8\x07\x4f\x9a\xba\x26\x8d\x13\x4a\x7f\x66\x92\x13\x3d\x30\xf0\x46\x21\x04\x7a\x5d\xf2\x23\x4b\xd3\x99\x83\xf3\x38\xe5\x5f\x92\x05\x97\xc5\x93\x49\xcc\x40\xe7\x5a\x65\xa5\xd0\xd9\x93\x96\x96\xe1\x41\xb2\x6f\xd7\xef\xfe\x7e\x43\x64\x0a\x4c\x76\x7e\x94\x99\xd5\x5d\x55\x6a\xeb\x89\x60\x93\xd4\x77\x8a\x6f\xb6\x0d\x9d\xc3\x94\x05\x20\xcc\x8c\xa2\x49\xb2\x4a\xa2\x2b\xb6\x2a\xdf\x2d\xd2\xcc\x66\x4f\xb6\x8a\xb7\x99\x95\xec\x76\x32\xcc\x1c\xa5\x75\x4b\x8d\x7e\x1c\x3a\xa8\x43\x1c\xd2\x22\xf5\x03\xf5\xfe\x64\xaf\xbe\x97\x9e\x95\xac\xd3\x1d\x5d\x3f\x0b\x1a\x86\xa9\xa6\x4a\xe8\x99\xf2\x74\x18\x4b\x93\xb4\xb3\x25\xdd\x4c\x79\x4d\x13\xbf\x47\x8d\x3a\x31\x93\x54\xdc\x6a\x27\x95\x9f\x98\x34\x53\xdb\xfd\xd6\xf9\x15\x95\x0a\x1e\x91\x45\x27\x50\xd4\x5f\xc2\x0e\xd2\xdd\x2a\xfc\xed\x03\x4a\xdf\x21\xa9\xc7\xdf\xe4\x04\xb5\x30\xde\x10\x97\x09\x70\x24\x5b\xaa\x4e\xcc\xad\x87\x8f\x84\x5b\xbf\xde\x10\x6e\x45\x33\x12\x5a\x1f\x1f\x4e\x48\x68\xbd\x9d\xbd\x21\xa1\xf5\xeb\xe2\x2f\x12\x5a\x9f\x96\x37\x24\xb4\xa6\x6f\x97\x24\xb4\x82\x4f\x1f\x49\x68\xdd\x5e\xcf\x09\xb7\x7e\xf7\x49\x68\xbd\x79\x73\xa9\x96\xff\x4a\xb8\x15\x93\xd0\xfa\x7a\xf5\xfa\x9e\x44\x72\xe5\x2b\xde\xa6\xa9\x5a\xbc\xea\x23\xcd\xd3\x93\xe6\xd6\x35\xcd\x4b\x2d\xde\x2b\xb7\xf8\xb4\x9b\xab\x1e\xdf\x3a\x6b\x9f\xb5\x92\x1e\xbf\xdb\xd8\xc3\xfc\x17\xa2\x8d\xec\x57\x04\xcc\xe6\xd6\x75\xf8\x1a\xe1\x3e\xcf\x02\xce\x65\x4b\x1d\x3a\x3c\x8b\x37\x3d\xd0\xcc\x06\x9a\xe9\x40\x2b\x1b\x68\xa5\x03\x27\x6a\x40\xb9\xf5\xa4\x1c\x4b\x6d\x35\x9a\x78\x29\x21\x6f\xa7\xe0\x40\xc1\x05\x6e\x8d\xaf\x96\xa8\x43\x4e\xcb\x44\xbb\x9f\x69\x24\x4d\x63\x29\x15\xc3\x33\x35\x36\x74\x7f\x45\xa6\xe3\x33\xe7\xd1\x24\xfb\xa6\xe1\xd6\xe5\x2f\x6f\x11\x53\x84\xfc\xcb\x67\x84\x2d\x50\x27\xb7\x21\x97\xcc\x63\x8e\xfe\xf5\xa0\xad\x6f\x0c\x32\x85\xcf\xca\x0a\x77\xf7\x74\xd8\x30\x0f\x35\x33\x83\x09\x3b\x65\xda\xe7\x59\x18\x71\x1d\x46\x62\x5f\x8a\x9a\x52\x21\xd5\xc1\x1b\x0d\x7c\x1c\xe2\xd9\x08\x39\x3f\x1a\xf8\x7c\x27\x6a\x71\xf0\x86\x38\x25\xd4\xc2\x4b\xa8\xc5\xd9\x47\x2d\xea\x0c\x70\xac\xb2\xe7\x38\x28\x6d\xad\x0c\x5f\xf6\xf6\xdd\x33\xf7\x86\x0a\xb0\x92\x60\x95\xc6\x33\x58\xc5\xd4\xff\xc6\x63\x12\x93\xaa\x23\x9e\xa1\xff\x1e\xbb\x34\x48\xda\x84\xe0\xba\x29\xe8\x51\x5d\xe6\x83\xd9\xc0\xd3\x95\x77\x7b\xa6\x91\x7f\x33\xb7\x38\xdc\x93\xbb\x6c\xea\x98\x49\x58\x44\x7b\x23\xaa\xe5\x48\x2a\x99\xb3\x3d\xe3\xf0\x20\xaf\x60\x4a\x5c\xd6\xac\xe0\x8b\xe3\xd3\x85\xde\x65\xde\xb3\xb6\x56\x6d\xb1\x91\xf0\x45\x6e\xe1\xac\xe4\xdf\xaa\x34\xce\x4a\x6e\x84\x0c\x65\x71\x43\x5b\xd0\x28\x9b\x3c\xc1\x4e\x8d\xd6\x49\xab\x71\xd2\xac\x9f\x76\x3b\x1d\x7a\xd6\x74\x4e\xcf\x4e\xa6\x9d\x69\xc7\xe9\x9c\x34\xdb\xa7\xb4\xdb\xed\x36\x4e\x1b\xdd\xe9\xe9\x59\x42\xdd\x3a\x6b\xb7\x54\x61\x69\x77\xba\xdd\xd3\x6e\xbb\x5b\x3f\x3b\xa9\x86\x5a\x15\xe0\x02\x17\x4d\x33\xcb\x3d\x93\x0a\x46\x73\xb8\x78\xe9\xf3\x28\xd9\xab\x93\x7c\x6b\x91\x34\x27\x95\x79\x34\xe9\x9c\xb9\x2e\xe8\x3e\x28\x62\x28\x35\xf8\x64\xc1\x4b\x4d\x90\xeb\x26\x54\x27\x21\xe9\x92\xac\x0e\xd5\xd3\x22\xcf\x93\x1a\xaf\x9d\x4f\x64\x45\xee\x6d\x17\x71\xdf\x1a\xb5\x55\x9b\x58\xde\x90\xd8\x1a\x74\xbf\xee\x96\x60\x47\x63\xff\x0d\xc2\xfd\xff\x09\x00\x00\xff\xff\x66\x82\xe6\xeb\x1f\x37\x00\x00") - -func bindataTkgWebDistTkgkickstartui175es5D46a578ff1b6cad5d45aJsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui175es5D46a578ff1b6cad5d45aJs, - "tkg/web/dist/tkg-kickstart-ui/175-es5.d46a578ff1b6cad5d45a.js", - ) -} - -func bindataTkgWebDistTkgkickstartui175es5D46a578ff1b6cad5d45aJs() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui175es5D46a578ff1b6cad5d45aJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/175-es5.d46a578ff1b6cad5d45a.js", - size: 14111, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui39es201501e37d969093a24ceaf8Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x8b\x72\xdb\x46\xd2\x28\xfc\x2a\x08\xce\xae\x8b\x38\x3b\xc2\x37\x57\x5c\xe8\xe2\xa6\x14\x89\x76\x98\xd8\x92\x22\xc9\xce\x26\x3a\x2a\x66\x00\x0c\x28\xac\x49\x80\x01\x40\xd9\x8a\xcd\x77\xc8\x1b\xe4\xdd\xf2\x24\x7f\x61\x70\x21\x08\x02\xbc\xc8\xf2\x7e\xf9\xce\x7f\x6a\xab\x36\x32\x38\x97\x9e\x9e\xee\x9e\x9e\x9e\xbe\xa8\x8b\x44\x28\x49\x1a\x07\x6e\xaa\x3e\xef\x25\x62\xea\xeb\xef\x85\x33\xe7\xee\xbb\x93\xbb\x45\xf8\x2e\x7d\x37\x19\xbf\x0b\xdc\x77\x49\xca\xe3\x74\xbc\x08\x06\x3b\x5b\x7c\xfa\x74\x73\xab\xe9\xf3\x45\x72\xd7\xbb\xb9\x21\xf6\x2d\xf8\x68\xd9\x90\xd8\x7d\x7f\x11\xba\x69\x10\x85\x3d\x01\x52\x10\x6b\x1f\x63\x3d\xee\xa5\x1a\x88\x75\xaf\x97\x82\x8f\xc7\xbf\x2d\x62\xf1\x63\xf0\x1b\x8f\xbd\xd7\x91\xb7\x98\x8a\x55\x7b\xed\x63\x2c\xd2\x45\x1c\x2a\xdf\xa5\xcb\xa5\xf6\xfc\x9e\xc7\x4a\x34\x88\x7b\xd8\xb6\x88\xa5\x81\x20\xfb\x93\x30\xa6\x81\x70\xd0\xeb\x69\x83\x7f\x16\xad\x7b\x62\x10\x7e\xfa\xd4\x0b\x07\x1f\x97\x9a\xa6\x0f\xff\x35\xba\xba\x1e\x9d\xbd\x1c\xa8\xe2\x43\x90\xa4\x41\x38\x51\x81\xd0\x4f\xde\x5c\x5d\x9f\xbf\x1e\xa8\xee\x22\x49\xa3\x99\x0a\x42\x39\xb8\x58\x6a\x3d\x0d\x4c\x9b\xa3\x4d\x3f\x7d\xea\x4d\x0f\x19\x6d\x5a\x1b\x8d\x37\x47\xe3\x9f\x3e\xf5\x78\x3e\xda\xc5\x9b\x6f\x5e\x8d\x4e\x06\xaa\x44\xc1\xc5\xc2\x99\x06\xee\xc9\x34\x5a\x78\xd9\x98\x2f\xcf\xdf\x5e\x17\xbf\xbc\xb9\x7a\x19\xdd\x8b\x38\x9c\x89\x30\x2d\x7e\xe7\xab\x19\x9e\xbb\x51\x98\xa4\x8a\x3b\xb8\xf9\x18\xf2\x99\xe8\xf3\x62\x58\xe0\x05\xc9\x7c\xca\x1f\xce\xb2\x8f\x6a\x3e\xba\x92\x77\x5f\x82\xb2\x69\x36\xcb\x7a\xc3\x37\x57\xca\x6a\xb6\xb2\xfd\xad\x9c\x2e\x69\x2e\x25\xf9\xf4\xa9\x97\x14\x4b\xb9\x3c\x7f\x3b\x3a\x1d\x5e\x0e\x54\x2e\x17\x13\x47\xf7\x81\x27\xe2\x17\x51\x3c\xcb\x56\x73\x76\x7e\x3a\xbc\x1a\x5e\xe7\xa8\x93\x2d\xce\x22\x4f\x5c\x89\x34\x43\x61\xd9\xe8\xed\xd9\xf0\x7a\xa0\xde\x87\x22\xcd\xbf\x24\x35\x34\x5e\x37\xe7\xbe\xfe\xf4\xa9\x77\xbd\x3e\xf7\xf8\xf8\xe7\x37\x97\xc3\x93\x57\xe7\x6f\x4e\x8b\x49\x2a\x6c\x56\x4d\x4e\x5e\x8d\x86\x67\xd7\x03\xd5\x9d\x06\x22\x4c\x47\x6d\x3f\x5e\x0d\x4f\x2e\x87\x55\x93\x2b\xe1\xc6\x22\x5d\x6b\x76\x39\x7c\x39\x3a\x3f\x1b\xa8\xb1\x98\x04\x51\xd8\xf8\xe9\xea\xfc\xcd\xe5\xc9\xf0\xe5\xe5\xf9\x9b\x8b\x92\x2c\x62\x91\x44\x8b\xd8\x15\x2f\xe3\x68\x31\x3f\x29\x68\xa4\xab\xd3\x8a\xc2\xd6\xba\x0d\x6b\xe4\xd6\xde\xf1\xfc\xe2\xba\x80\xaa\xd6\xed\x7c\x9e\x36\x41\xbc\xba\xfa\x36\x27\x90\xef\x87\x3f\x0d\xd4\x24\xb9\xcb\x49\xe3\x7b\xf1\xb0\xde\xec\xcd\x37\x57\x27\x97\xa3\x62\xd0\x64\xe1\x24\x6e\x1c\xc8\xd1\x1a\x48\xbb\x1e\x9e\x1d\x67\x18\x4d\x45\xc8\x4b\x8c\x66\x3b\x39\xce\x97\x3f\x3e\x3b\x7e\x3d\xcc\x77\x35\x23\xb0\xd5\xf2\xeb\x6d\x4e\x46\xa7\x97\x79\x9b\x93\xc0\x8b\xbf\x99\x46\xee\xbb\xaa\x49\x89\x90\xc6\x40\x75\x84\xac\xb7\x3b\xbf\x1c\x97\x98\xcf\x1a\xaf\x50\x20\x9b\x5d\x5c\x8e\xde\x1e\x5f\x0f\xc7\x27\xaf\xde\x5c\x5d\x67\xf4\x3a\x8f\x83\x7b\x9e\x8a\xe3\x9c\x5e\x16\x49\x2a\xe2\x8d\xc6\xa3\x8b\xaa\xdd\xe8\xa2\xfa\xb5\x44\xff\x58\xe2\x3f\x9f\xed\xb2\x8e\xfd\xd5\x32\xcf\xcf\xae\x2f\xcf\x5f\x5d\xbc\x3a\x3e\x1b\x8e\xcf\x86\x3f\x5e\xbd\xf9\x46\x7e\x96\xcb\x76\xa3\x30\x8d\xa3\xe9\xc5\x94\x87\xe2\x6a\xe1\x14\x48\x38\x13\xef\x77\x75\xcf\x11\xb2\xd9\xbd\xb3\xeb\x1e\xd3\x6e\xed\xd8\x35\x61\xd5\xe9\xc7\xf3\xcb\xef\x73\xda\x59\x35\x7f\x1f\xc5\xef\x44\x2c\xd9\xbd\xb5\x71\x13\x1d\xcd\xf6\x4d\x64\x6c\x74\x6b\x9f\x46\x76\xb9\xae\x49\x90\xc5\x20\xee\x11\xc3\xb4\x35\x30\xce\xfe\x82\x16\xc1\x1a\x98\x67\x7f\x22\x83\x30\x0d\x0c\x07\x71\xcf\x32\x19\xb2\x35\x70\x36\x88\x7b\xd4\x30\x2d\xac\x01\x6f\x10\xf7\x0c\xcb\x26\x76\x29\x67\xcf\x07\x1f\xfd\x40\x4c\xbd\xd7\x7c\x3e\x0f\xc2\x49\xd2\x2f\xc4\xee\x75\x9b\x18\x02\xb1\xf8\x75\x11\xc4\xc2\xeb\x7f\x05\x81\x27\x7c\xbe\x98\xa6\x6f\xf9\x74\x21\xfa\xee\x0d\xbc\x05\x53\xee\x88\x69\x5f\x95\xed\x95\xe1\xd9\xdb\xd1\xe5\xf9\xd9\xeb\xe1\xd9\xb5\x0a\x1c\xee\xbe\x0b\xc2\xc9\xb9\xf3\x6f\xe1\xa6\xfd\x8f\x85\x84\x7e\x91\x4d\xdc\x57\x6b\xf2\x5a\x05\xf7\xd9\x70\xc5\x0f\x19\x20\xea\xb2\x94\xee\xd7\x4d\xc1\xb6\x06\x4d\x31\x77\xfe\x8b\x32\x3a\x55\x3b\xbb\xe5\xf2\x70\xad\xf3\x8c\x27\xef\x36\x07\xc9\x1b\xb6\x0d\x94\x4b\xcc\xb5\x21\x8a\xbf\x93\x6f\xb8\xfb\x4e\x84\xde\x29\x4f\x79\x6d\xc4\xbc\x43\xfb\x50\x2d\xc2\xf2\x80\x91\xcb\x2e\x4a\x39\x90\x22\x47\xda\x39\x55\x2e\x52\x80\x17\x9d\x45\xe9\xf1\x22\x8d\x2e\x45\x92\x46\xb1\x58\x83\xb9\x3e\xa0\x92\x91\xe5\xce\x51\x73\xa1\xdd\xb6\x31\xbb\xc1\xab\x0b\xf2\xb6\x11\xae\xae\xbe\x55\xf2\x06\xca\xf7\xc3\x9f\x5a\x47\xa8\xc9\xf8\xd6\x11\x6a\xbf\x77\x90\x48\x2e\xfd\xdb\x3a\xe7\xbf\xc8\x6e\xb7\x4b\xc9\x87\x97\x19\x87\x11\x84\x4d\x0d\x1c\x67\x7f\x5a\x36\x86\x1a\x98\x0c\xe2\x1e\x82\x06\xb1\x35\x70\x92\xf1\x1d\xc3\x90\x68\xe0\x6a\x10\xf7\x18\x83\x36\xd1\xc0\x28\xe3\x51\x8b\x59\x44\x03\x3f\x67\x2a\x9f\x49\x31\xd1\x80\x9f\x75\xa3\x90\xda\x1a\xb8\x1b\xc4\x3d\xdb\x80\xa6\xa9\x3d\x2f\x55\x47\x65\x96\x29\x9b\xda\x47\xf4\x4c\x3c\x7b\xd6\x9b\xe8\xd7\x93\x9f\x7b\x10\xa8\x5e\x70\xaf\x82\x6c\xa6\xfc\x0b\x2a\xbe\x50\x58\x7e\xc1\xe5\x17\x54\x7e\x21\xe5\x17\x9c\x7d\x19\xbf\xf9\xb9\x47\x81\xea\x4e\xe3\xa3\xc0\xcd\x4e\x15\x4a\xb2\xcf\xbf\xfe\x7c\xdc\x2b\x3b\x30\xa0\x26\x73\x9e\xfd\x44\xb3\x4f\x57\xa7\xf7\x3d\x03\x50\x56\x6f\xd6\xfa\x5f\x6d\x59\x01\xef\xac\x03\x9f\x7e\xfb\x63\x0f\x02\x13\xa0\x1a\xdc\x19\x04\x69\x14\x4d\xd3\x60\x7e\x94\x09\x64\x11\xa6\x2a\xa0\x46\x09\x23\x2e\x80\xa8\xcf\x72\x36\x9e\xaf\xcd\x72\xd1\x8a\xa2\x6c\xe0\x42\xc2\x1f\x89\x38\x8e\x62\xb5\x5c\x05\x02\xd4\x6c\x83\xf6\x55\x1b\xb4\x08\x3f\x35\xb8\xf7\x87\x83\x6b\xb5\x81\xfb\xb2\x15\x5c\xba\x07\xb8\xf6\x21\xe0\xbe\x39\x18\x5c\x06\xdb\xc0\x7d\xdb\x0a\xee\x93\x13\xc3\xaf\x87\x83\x8b\xda\xc0\x3d\xcd\xc7\x09\xfc\xde\x3a\xc4\x18\x3e\x0d\xc4\x00\x3f\x13\xda\xc7\xfc\x28\x16\x83\x89\x1e\x7d\x78\xdf\xd3\x9e\x4f\xf4\x0f\x73\xa3\x27\x39\x74\xfe\xc3\xdb\x9e\xd0\xdd\x5c\x91\xbb\x7e\x98\x8b\x53\x91\x6b\xae\x51\x9c\xfd\xfc\x43\x7a\xdd\x83\xda\x72\x05\xf0\xdf\x36\x00\x2e\xd6\x1e\x15\x7a\x23\xcb\x19\x7f\xf1\xa6\x57\x5b\xf0\x3a\x18\xa9\xfe\xb7\x60\x36\x9f\x06\x6e\x90\x3e\x9f\xe8\x3f\x18\xdf\xf5\xd4\x70\x22\xcf\x79\x15\x88\xac\x53\x06\x9d\xec\x7d\xfe\xeb\xa2\x27\xf4\xda\x01\x5e\x07\xe5\xc3\xe1\x7b\x40\xda\xf6\xe0\xb7\xd6\x71\x72\xa1\xc4\x68\xb5\x1a\xa0\x2a\xaf\x22\xee\x05\xe1\x44\xd7\x75\x45\x6d\x1b\xe9\x45\xd7\x6e\x5a\x7f\xd1\xdd\x7c\xd8\xb9\x9b\xec\x31\xbb\x79\x5f\xec\xa5\x9e\x1d\x7f\xfb\x6f\xe8\xeb\xc3\x37\xd4\x68\xdb\x86\x1f\x9e\x6c\x43\xdf\x77\x42\xd4\xb1\x7f\xc5\x0e\x57\xfb\x97\x4d\x84\x81\xaa\x5c\xdf\x09\xa5\x68\x9a\x28\x91\xaf\xa4\x77\x42\xc9\x14\x8e\x79\x6e\x67\x78\x27\x1e\x14\x3f\x8e\x66\x0a\x97\x7f\xce\x79\x10\x2b\xe9\x1d\x4f\x95\x87\x68\xa1\xdc\xf1\x7b\xa1\xb8\xb1\xe0\xa9\xf0\x14\x3f\x8a\x95\x45\x22\x94\xf7\x41\x7a\xa7\xc8\x4b\x58\x1d\xf4\x96\x25\xbc\x3b\x1c\xa9\xad\xc7\xd6\x8f\x4f\x85\x8a\x2b\x31\x15\x6e\xaa\xf0\x50\x29\x6d\x42\x4a\x79\x07\x57\x26\xd9\x35\x50\x89\xe2\x62\xb9\x0a\x57\x42\xf1\x5e\x89\x42\xa1\xa4\x91\xc4\x5f\x10\x2e\x76\x2d\xf8\xbb\x0e\x26\x64\xf6\x97\x63\x42\xfc\x59\x5c\xf8\xd3\x7f\x9a\x0b\xef\x82\x7f\xf7\x54\xa5\xfc\x09\xa8\x8a\x5a\x07\xe7\x9b\x83\x29\xc6\x68\x3d\xdb\xbe\xed\x5a\x56\xae\x20\x36\xb5\x4a\x66\xd5\xb4\xca\x6c\xb6\x44\x12\x8a\x9c\x94\x07\xa1\xc8\x27\x2c\x74\x4c\xa9\x34\xab\x40\x6e\x57\xb6\xbd\x14\x30\xbb\xa6\x51\xd6\x36\x57\x2d\x77\xd4\xa8\xeb\xa1\x72\xae\x9f\xce\xdc\x9e\x09\xbe\x03\x04\x74\xd1\x83\xbd\xb1\xfd\x0d\xed\xd5\x02\x6a\x0e\xa6\x0a\x0c\x58\xce\x64\xaf\x76\x8e\xc0\x72\x22\x04\xc1\x4f\x00\x03\x5c\xfb\x0d\xd5\x47\xcb\x3a\x22\xb4\x8e\xe7\x3b\x31\x9d\x17\xeb\x96\x43\x60\xf0\x0d\xc0\xa0\x75\x33\x00\x42\xdd\xaa\xf2\xb6\x73\xc3\x5c\x51\xec\x5d\x3a\x9b\xca\xab\xf1\xab\x0c\xbb\x89\xde\x6a\x51\x2b\x29\x98\x96\x14\x25\xcf\xd4\xe2\x10\x7f\x11\xc5\xe7\x7e\x46\x57\x6b\x5d\x93\xb2\x29\xae\x9a\xba\xd3\x78\xe4\x0f\x73\xc8\x85\x7e\xcf\xa7\x81\xc7\xd3\x28\x1e\x86\x8b\x99\x7e\x39\xfc\xe1\xcd\xe8\x72\x78\x5a\xa7\xc9\xef\xdb\xd4\x3a\xe3\xc9\x95\xe6\x7f\x1d\x4e\xfa\xac\x8d\xf4\xff\x7d\xf8\x38\xad\x27\x99\x10\x87\x0f\xd4\x2a\xbd\x53\x51\x67\xc6\x3a\x2d\x0c\xe7\x2f\x24\x2d\x1c\xc6\x9b\x41\x38\x5f\xec\xcd\x9a\x06\x7e\x24\x6b\x7e\x0f\x08\xe8\x3a\x64\xf6\x61\x4d\x09\xa5\x0a\x0c\x02\x0c\xb9\xa4\x33\xef\xbb\x5e\xf9\x71\xf3\xd5\x64\xa2\x9f\x7c\xfb\xba\x27\x25\xa5\x64\x10\x3d\x0a\xd7\xcc\x93\xd2\x1e\x7b\xc7\xc3\x89\xe8\x69\xcb\x0d\xd6\x85\xdb\x59\x17\x81\x7f\xed\x60\xdd\x82\xc3\xff\xbd\x4f\x33\x02\x84\x78\x8c\x24\x58\x06\x7e\xef\x09\x64\x41\x6e\x95\xde\x90\x04\xf4\x30\xf6\xae\x9f\x48\x3b\x7b\xbd\x3d\x7e\x35\x3a\x6d\x98\x90\xa5\x29\xf3\xb0\x61\xde\x9c\x8d\x7e\x78\x33\x6c\x1d\x67\xb9\xcc\x91\x12\x8b\xc1\xcd\xa6\xc5\x66\xd3\x3a\xd8\x65\xf8\xeb\x32\x18\xb5\x5a\x3c\x6f\x9f\x4f\x45\xaa\x44\xa2\x78\xae\x71\xa7\x3c\x49\x14\xa1\x88\x0f\xa9\x08\xbd\x44\xb9\xd4\x47\xf9\x56\xc5\x0b\x37\x8d\xe2\x9c\x87\x93\xc5\x5c\xc4\x3d\x0d\xa4\x77\x41\xa2\xf3\x79\x70\x22\x1f\x5e\x06\x22\xff\x50\xac\x37\x88\xc2\x2b\x11\xdf\x07\xae\x18\xa4\xf9\x0f\xd3\x5c\xd7\xbd\x94\xaf\x30\xc9\xe0\x2b\xb4\xf6\xf9\x2a\xe5\xa9\x18\x8c\xf5\x0f\x73\xa6\x9f\x0e\x5f\x1c\xbf\x79\x75\x9d\xff\xde\xf2\x3e\x32\x08\xab\x87\xbd\xb2\x4d\x3e\xe6\xcd\x6d\x01\x54\xf5\x98\x94\x0c\xdc\x96\x61\x56\x2d\x25\xb4\x27\xb1\xf0\x44\x98\x06\x7c\xba\x02\x6b\x9d\xde\x32\x6d\x30\x5b\x91\x04\x52\xcd\x95\x43\x75\x59\xbc\xb2\x38\xe2\x3a\x2a\xd6\x9a\xf4\xb4\x8f\x81\xfe\xb3\xee\xf1\x94\x17\x9f\xb2\xf5\x26\x69\xcc\x63\x3d\x49\xc5\xfc\xaa\xec\xd2\xcb\x66\x01\xc7\xfa\x2b\x5d\x6e\xc6\xf8\xe5\xc6\x03\xc5\x55\x0e\x48\x14\xbe\x10\xa9\x7b\x27\xbc\x35\x59\x90\xe8\x4e\x10\x7a\x72\x10\x4d\x5b\x76\xb4\xe9\x09\xed\x63\xdb\xe2\x05\x40\x83\xc1\x40\xe8\x53\x11\x4e\xd2\xbb\xaf\x65\x13\x3f\x8a\x67\xf2\x67\x7d\x22\xd2\xde\x2e\x03\xae\xa6\x27\x22\xb7\x8c\xf7\xc4\x0d\xbc\xcd\x35\xbc\xbe\x1c\x28\x08\x83\xf5\x57\x95\x17\x71\x34\xbb\xe2\xf7\x42\x5a\x76\x7b\xda\x32\x7f\x75\x0d\x7e\x13\x2f\xa2\x78\xd6\x2b\x20\x5c\x4d\xef\xf2\xf0\x75\x74\x2f\xae\xa3\x33\xf1\x21\x1d\x64\x54\xd9\x68\x20\xb7\xec\xd9\xb3\xd6\xed\x5b\x91\x43\xa6\xfa\x5e\xa5\x62\x5e\xaa\xbe\x41\x14\x5e\xc7\xc1\x64\x22\xe2\xa4\x97\xbf\x08\x24\xfd\x4d\x36\xbb\x5d\x16\x64\xbd\x36\xdd\xa2\x10\xbb\x89\x3e\x0f\xe6\xa2\xd7\x83\x60\xae\x3b\x5a\x0f\x43\xa8\x81\x1e\x04\x43\xfd\x83\xd6\x93\xac\x31\xf8\xe7\x47\x3f\x8a\x7b\x05\x1f\x67\xf7\xac\x58\x68\x81\xdf\x13\x37\xf1\xed\x57\x83\x41\x7a\x13\xdf\x6a\xb9\xb0\xff\x0a\x3d\x2f\xfe\x80\x4b\x39\xc8\x99\x7e\xa9\xc9\xed\xd4\x17\x61\x45\x57\x9a\xa6\x57\x7f\xe7\x0c\xda\x45\xb4\x9b\x70\x6f\x6c\xe3\xcb\xd1\xf9\x99\xd6\xbe\x9c\xfa\x0a\xbe\xbb\x3a\x3f\xd3\x93\x34\x0e\xc2\x49\xe0\x3f\xf4\x84\x36\x18\x0c\x1a\xdf\x52\x6d\x4f\x90\x45\x09\x71\x76\x92\x65\x2c\x5a\x1c\x5f\x22\x3b\xbf\x32\x3e\x99\x89\x24\x11\xe1\x44\xc4\xb5\x4e\xb2\x83\xb8\x17\x61\xfa\x22\x98\x8a\xd1\x6c\x1e\xc5\xa9\xf0\x2a\x66\xa8\x7d\xab\xf3\xc0\xfa\xce\x9f\xe6\x6f\x37\xab\xc6\x52\x1c\x7f\xcb\x43\x6f\x2a\xe2\xd6\x19\x64\x03\xc9\x49\xb5\x09\x2a\x06\xf2\x9a\xe3\x09\x6f\x6d\xb0\x8c\xb5\x8b\x17\x26\x2d\x3b\xc1\xf3\x8f\x92\x45\xd6\x76\xaa\xf7\x15\xd2\x96\x7e\x10\x7a\xc7\x95\x84\xfa\x46\x9a\x21\xb2\x99\x0a\x35\xc0\xd5\x7d\xb9\xac\xc1\x3f\x53\xc9\x57\x19\xab\x6a\xcb\xb6\xc1\x4a\xe8\x36\xe8\x41\x2c\xc3\xc9\x79\x38\x0a\x83\xb4\x57\x88\x6b\x7d\xf5\x01\x34\x21\x1e\xc8\x0f\xb9\x50\xbb\x5a\x7d\xee\xe5\x5b\xb4\x48\x44\x9c\x71\x6e\xc6\xad\x85\x48\xd3\x9d\x45\x30\xf5\x24\xfb\xae\x13\x5d\x3e\xf4\x7b\xe9\x1c\x92\xad\x6a\x45\x93\xab\x7f\xd5\x51\x95\x7f\x69\x1c\xf5\x83\x6c\xd6\xf2\xcd\xee\x4d\x1a\x4c\x83\x34\x10\x49\x46\xcf\xab\x46\xaf\xf9\x7c\x13\xf1\xe5\xf8\x51\x2c\x8a\xfd\xcf\x07\xec\x6a\xd9\x10\x44\x45\xf7\x36\x99\x0e\x2a\xc9\x96\xef\x5b\x6d\x0f\xca\x6e\x77\xd1\xfb\xcb\xb6\xeb\x4a\xa6\xf3\xec\x90\x88\x1f\xb3\x23\x58\xe4\xbb\x30\x11\xe9\x55\xb6\x00\x2f\x17\xae\x3b\x1f\xd2\x9a\x4b\x03\xaa\xaa\x81\xf4\xa0\xb1\x8a\x97\xb2\xb6\x91\x9e\xe7\xfb\x23\x29\x7d\xe4\x4b\x90\x73\xd5\x6b\x6d\x39\xa3\xe4\x2c\x7a\x5f\xad\x37\xd5\x9e\x3d\xeb\xc9\x43\x7f\x90\xc1\xa2\xaa\x99\xe0\xfb\xba\x77\xc0\x21\x93\x03\x54\x3b\x62\xd2\x2e\x24\xf7\xc2\xc2\x97\x47\xd3\xfa\x72\x22\x71\xd0\x44\x6d\xa7\xd9\x96\xa9\xaa\xe6\xc5\x49\xb7\xd9\xa6\x4b\x61\xc9\x69\x60\x93\x76\x3e\xae\xab\x50\x19\xb0\xb2\xd1\x30\xf4\xe6\x51\x10\xa6\x3d\xad\x12\xd1\x07\x08\xdb\x44\x6c\x4c\x25\x17\x97\x64\x74\x77\x7c\x31\xca\xc4\x2f\x58\x9d\x26\x52\x6b\x3f\x8b\xd2\xc0\x0f\x5c\xa9\xe5\x0c\xd4\x37\x21\x77\xa6\xd2\xe6\x15\x8b\x34\x0e\xc4\xbd\xc8\x4d\x7d\x8a\xbb\x1a\x52\x2d\xc6\x58\x4a\xd9\xb4\x6b\xc2\xda\xb9\x98\x16\xe7\x62\x09\xeb\x49\x7e\x7b\x90\x3d\xae\xb8\x2f\xa6\x0f\xbd\x14\x88\x9b\xf4\x56\x5b\x4e\x44\x5a\xa8\x8b\x25\xae\x9a\x4a\x24\x04\x1d\x28\xac\xfa\x55\x18\xf4\xe4\x21\x57\x2d\x7b\x43\x1d\xdd\xf7\x1c\xae\xf0\x5c\x6a\x9d\x42\x4f\xa2\x38\x2d\xcf\xcf\xdc\xa6\xa5\x4f\x23\x97\x4f\xc5\x49\x34\x9b\xf3\x58\xf4\x72\x49\xae\x95\x4e\x09\x7b\x30\xa8\x7c\x80\xef\xe6\xc9\x76\xbc\x6d\x8e\x90\x29\x7a\x75\x60\xd7\x74\xbe\xe2\x5b\xa9\xc0\xf5\xd3\x47\xd3\x45\x31\x52\x8d\x26\xf2\xe3\x64\x45\x11\x17\x3c\xe6\xb3\x24\x77\x90\xe8\xd5\xcc\x86\x05\x1e\xa4\x68\xdf\x40\xc3\xea\x9e\x92\x09\x35\xf1\x75\x8e\xdb\xbe\xaa\x16\xca\xd3\xc7\xd2\x89\xa9\xbf\x7d\x9c\x5c\xb9\xd3\x40\xe9\x45\xb6\xa3\x79\x7e\x9d\x2a\x9b\xe7\x1e\x65\x7b\x75\xc9\x6f\x60\x1a\x58\x77\xbf\xda\xd1\xb5\x7e\x49\xd3\xc0\xea\xea\xd2\x4f\x97\xcb\x7b\x11\x07\xfe\x43\x8b\xcc\x68\xb9\x35\xbd\x3a\x3f\x3e\xad\x8e\x84\x96\xcd\x53\x9b\xac\x92\x34\xa5\xcd\x47\xee\xba\xd1\x22\x4c\xf3\xbd\xea\xd7\xd4\x82\xae\x7d\x5c\xb6\xb0\xd7\x8e\x5b\xdd\xc1\xda\x6e\xf7\x52\x5a\x15\x2c\x58\x48\xf0\xba\xec\x58\x82\x8c\x69\x4b\xde\x13\xf9\x90\x52\xf9\xe4\x13\xf1\xe9\x93\x58\xfd\xb9\xa1\xfd\x3e\xef\x80\xe1\x97\xbf\x7d\x4c\x97\xbf\x6c\x55\xf4\xda\xef\xa6\xfb\x72\xae\xaa\x6a\x2b\x6e\x0a\x92\x93\x28\x0c\x85\x9b\x9e\x06\x49\xc6\x82\x5e\x65\x35\xfa\x2a\x16\x7a\x2c\xbc\x85\x2b\x4a\x01\xd4\x72\x00\xa6\x5a\x79\x6b\x12\xe0\x2b\xa8\x2d\xb7\x68\x2b\x1f\x77\x1f\x7f\x9b\xdd\x73\xa5\x60\x5b\xe7\xe2\x98\xde\xec\xda\x7e\x47\x2d\xee\xf9\x02\x64\xda\xef\x6a\xea\x8d\xd3\xbd\xb0\x3c\x25\x37\xdb\x75\x89\x5b\xdd\x9d\x0a\x1e\xbf\x2d\x4d\x31\x95\xda\xf6\x88\x91\x2a\x55\x41\x6a\x5a\x07\x0e\x52\x2e\xe4\xb6\xa2\x99\x1c\x9c\x9b\x85\xfe\x6e\xa4\x97\x5e\x39\xb7\xa5\x82\x9a\x01\x2d\x85\xc6\x4a\x5b\xdc\xa1\x34\x69\xfd\x1c\x63\xf9\x3f\x0f\xc7\xd7\x0a\xc0\xcf\xc7\x58\x73\xb1\x8f\xc4\xd9\x3a\xe2\xdb\x31\xd6\x61\x7a\xd2\x83\x44\x76\xd9\x30\xa3\x96\xab\x69\xeb\xf1\x26\x0c\x7e\x5d\x88\xcd\x2e\x2d\x96\x14\xed\x31\x3b\x55\x53\x23\x33\x89\x14\x4d\x33\x65\x61\xd2\x53\x7f\x3c\xbe\x3c\x1b\x9d\xbd\xec\x2b\x9b\x3c\xa2\x29\xb1\x70\x45\x70\x2f\x3c\x65\x11\xc6\xc2\x8d\x26\x61\xf0\x9b\xf0\x14\x79\x99\xcf\xd4\x29\xf5\x1f\xb5\x4b\xe7\x2e\xf1\xb2\xe9\xcf\x26\x1e\xbf\x2b\x8b\xb9\xc7\x53\x21\xe7\x3a\x0e\x3d\x89\xed\x20\x7d\xf8\x2c\x6a\xe9\x1a\x72\xb9\x61\x45\xf8\xb8\x86\x40\x79\x74\x1e\xcd\x0b\x57\xf6\xa3\x4c\x6f\x6a\x1a\x1e\x34\xc5\x13\xa9\x70\xd3\xa4\xd0\x58\x14\x57\x7e\xcf\x34\x1a\xf5\x1f\xe2\x1f\xea\xf3\xfc\x41\x3c\xb9\x0b\xc2\x89\x92\x1b\xe6\x72\x71\x3c\x3e\xf9\xf6\xf8\xec\xe5\xf0\x54\x6d\xda\x2d\x8a\xf6\xbd\x8f\xe9\xc3\x5c\xf4\x57\xf6\xbc\xf5\x6e\x60\xce\x1f\xb2\x23\xb1\x2f\x96\xf9\x32\x3a\xcc\xfa\x1f\xf7\x1d\xbc\x86\xb8\x8d\x39\x1e\x71\xd5\x92\x84\xb4\xd4\x96\x87\x5d\xf5\x2a\x9b\xc5\x57\x5f\xb5\xd8\x4c\xf3\xb7\x99\xa4\x27\xb2\x0b\xe1\x63\xe5\x59\x41\xd4\xfc\x3e\xf7\x99\xdd\x8b\xb1\x32\x72\xce\x4e\xb9\x2e\x70\x4a\x43\x4b\x0b\x43\xb7\x9a\x5e\xbc\x87\x90\xcf\x02\xb7\x66\x49\xdc\x5b\x81\x2d\x8c\xf7\x5f\x41\xad\xd0\x58\x15\xf1\x75\x1e\x24\xa2\xe4\xaa\x6b\x3f\xa3\xbb\xbe\x5a\x08\x36\x21\xfd\x32\xf2\xdf\x4b\x3a\xae\xdf\xb9\xa4\xf7\xc5\x35\x0f\x7f\x5b\xa8\x4b\x69\xe7\x78\x53\x18\x67\xaa\xa3\xb7\xfe\x31\xbb\x7d\x95\xb6\x9c\x3d\x8c\x25\xa7\xb9\x53\xcc\x79\xec\xb5\x59\xb5\x96\x2d\xf6\xa1\x0a\x09\xe7\xe5\xea\xb6\x9b\x6e\xca\x8e\xed\xbe\xd7\x42\xd3\xcb\x5b\x45\x9c\xa3\xb5\xcd\x50\x56\xb3\xf9\x01\xb1\x5c\x96\x58\xd5\xff\xcf\x02\x62\x93\xf9\xdc\x1d\x54\x0f\x6b\x69\xb5\xd3\xa1\x78\xdf\x4b\x3f\x7d\x12\x5a\x6f\xa2\xff\x44\x8c\xde\x89\x3e\xbd\x90\x6f\x59\xc4\xe8\x5d\xe9\x97\x5a\xa6\x20\x16\x23\xb8\xb3\xf9\x60\xa2\xff\x6b\x3e\x2b\x98\x4e\x80\xfc\x7d\x3d\x8a\x93\xfe\xcd\x8d\xca\xe7\xf3\xa3\x16\x39\xa3\xde\xde\x02\x5f\xf0\x74\x11\x8b\xa4\x7f\x33\xd1\x7f\x3d\xff\xf7\x2d\xf0\x84\x3b\x4d\xfa\x08\x32\x70\xcf\xe3\xa4\x8f\x2d\x20\xf1\x95\xd4\x03\xa6\xa4\xe9\x07\xa4\x20\x06\x11\x08\x40\x08\xa6\x80\x03\x17\x24\xe0\x1a\x2c\xc0\x18\xcc\xc1\x10\x9c\x01\x0f\x9c\x83\x4b\x70\x0c\x26\x15\x0d\x0d\xfe\x26\xaf\x97\xc1\x6f\xe2\x97\xec\x0c\xc9\x14\x43\xc5\x49\xc3\x3f\x7f\xff\x43\x78\x14\xdb\xbe\x60\x98\x3b\xbe\xcd\x4c\xc6\x28\xc2\x8e\x6d\x12\x9f\x31\x68\x08\xee\x62\x66\x31\xd3\xa2\xd6\x9f\xbf\xff\xc1\x6c\x4a\x0c\x08\x09\xb3\x0d\x83\x51\x46\x20\x36\xfa\xca\xdf\x3e\xaa\xff\x67\xe1\xfb\xbe\x07\xf3\xff\xa8\xcb\xfe\xe8\xec\x7a\x78\x79\x71\xfe\xea\x38\x3b\x2a\xfa\xca\x2f\x20\xad\x4f\x9f\x1b\xfb\x94\x0c\x09\x4a\x10\xfa\x91\x12\xd6\xb4\xe4\x3f\x7f\xff\x83\x78\xa6\xe1\x32\x41\x05\x87\x8e\xcd\x7c\xc8\x99\x83\x11\xe6\xb6\x45\x90\xf0\x90\x70\x2d\x53\xf8\x9e\xe7\xe2\x3f\x7f\xff\xc3\xb2\x99\x49\x30\x41\x26\x24\xa6\x6d\x60\x64\x60\xd6\x57\x7e\x8a\x16\xca\x6c\x91\xa4\x8a\x3b\x0d\xdc\x77\x8a\x7a\x72\x7e\x76\x36\x3c\xb9\x56\x33\x91\x9d\xdf\x8e\x6a\x3c\x53\x67\x15\x47\xf8\x51\x2c\x94\x59\x74\x9f\xc9\xf2\x34\x52\x42\xf1\x21\x95\x70\xea\xca\x2f\x20\xae\xaf\x81\xe7\x0c\xc9\x43\x11\xa6\x4a\xe0\x29\xf2\x05\xf9\xcf\xdf\xff\x80\x36\x71\x88\xa0\x96\xc7\xb0\x6d\x13\x68\x5b\xd8\xc3\x04\x1b\xd0\x73\x4d\x46\x7c\x64\x73\xdb\xf2\x88\xc1\x32\xd8\x0d\x44\xa0\x69\x30\x46\x6c\x8a\x32\x0c\x1b\xcc\xda\x07\x99\x55\x8b\xff\x65\x57\x4d\xae\xae\x8f\x2f\xaf\xc7\xd7\xc7\x2f\xc7\x27\xaf\x2e\xc7\xd7\xe7\xe7\xaf\xae\x47\x17\xfd\x55\x4b\x04\x3b\x9a\x8e\x4e\xce\xcf\x56\xed\xfe\xab\xde\xf0\xe4\xd5\xf9\xd5\xb0\xa3\xe1\xff\x46\xa8\x8f\xf2\x3f\xcb\x19\xca\x7f\x77\x41\x23\xa3\x4d\x86\x67\xd7\x35\xa8\x70\x6b\x9f\xab\x8b\xe3\xb3\xbe\x74\x3e\xcb\xc5\x9d\x32\x3a\x95\x32\xec\x21\x5a\xc4\xc5\x9e\x15\x77\x4e\x5d\xa9\x41\x5e\x1f\x6c\x05\xba\x1c\xac\xbe\xbe\x75\xb0\xff\xab\xb6\x90\x8d\x25\x77\x02\xfe\x5f\x35\xcc\xb7\x76\xe9\xff\x02\xa2\x3a\xb1\xd4\xa5\x77\xb6\x9c\x52\x05\x55\x66\xc9\x24\x23\x62\x8f\x12\x07\x7b\x0e\x71\x4c\xdf\x65\x18\x5a\x8e\x60\x18\x43\xd3\x22\x66\xf6\xd1\x11\x3e\xb3\x7d\x1b\x91\x3f\x7f\xff\xc3\x86\xd4\x20\xa6\x65\x5b\xb6\x41\x29\xc1\x88\x22\xd8\x57\x9a\xc3\xbb\x3c\x0c\xa3\x54\x71\x84\x22\x66\xf3\xf4\x41\xf9\x05\x04\x9b\xa4\x9b\x1b\x2a\xd6\x48\xd7\xb5\x28\xb5\x28\x11\x94\x62\xc4\x7c\x64\x7b\xa6\xeb\x72\x07\x42\xdf\x37\x18\x71\x11\x72\x0c\x64\x1a\x06\xfd\xf3\xf7\x3f\x10\xc6\xc8\x46\xd8\xa0\x90\x12\x46\x4d\x68\x50\x72\x18\xe9\xa2\xfd\x69\x17\xef\x4b\xbb\x78\x4f\xda\xc5\xff\x09\xda\x2d\xd0\xfb\x45\x69\x17\x3f\x8a\x76\xd1\x6e\xe2\x0d\x37\x89\x77\xb5\x9e\x06\xf1\x72\xd3\xb3\xa0\x9f\x11\x81\x69\x72\x19\xc3\x61\x43\xe2\x33\xc3\xa4\x1c\x71\x64\xb8\x14\x71\xd3\x30\x0c\x27\x23\x5e\xc6\x2c\x4c\x88\xcd\x08\xb6\x28\x36\x69\x49\xb9\xab\xb1\x37\x29\x77\xda\x49\xb9\x89\xb4\xb1\x55\xd4\x8b\x2c\x17\x1b\xc4\x41\xae\x63\x58\x98\x51\xcb\xb7\x21\xb3\x05\x46\x8e\x65\x08\x8b\xfa\x9e\x6d\x0a\x81\xa9\xe0\xd9\xf9\x42\xa8\x6d\x41\x48\x0d\xcc\x0c\x42\xa8\x61\x41\x76\x18\xf5\xe2\xfd\xa9\x97\xec\x4b\xbd\x64\x4f\xea\x25\xff\x41\xea\x2d\x50\xfc\xe5\x28\x98\x3c\x8a\x82\xf1\x6e\x0a\xe6\x9d\x14\x5c\xac\xa9\x41\xc5\xbe\x30\xb1\xc9\x0c\xcc\xa1\x0f\x91\xcf\x1d\x1b\x51\xdb\xe3\xd8\x23\x94\xd8\x18\x32\x87\x3b\x88\x41\x06\x59\xa6\x03\x21\xdb\xc4\x8c\xda\x08\x5a\x86\x99\x9d\xdd\xc8\x68\x10\x72\x31\xc5\x26\x31\xbb\x9b\xc4\x5c\x37\xfb\xd6\x85\xb1\xc0\x88\x52\xee\xfa\x99\x7a\xc9\x1d\x1b\x7a\x36\xf4\x79\xa6\xed\x18\x02\xda\x88\x3b\xc2\x80\x16\xf1\x8d\x0c\x20\x13\x52\xc3\xb0\x08\x64\x16\xa3\x0c\x99\xc4\x30\x0f\x14\xc6\xb4\x8b\x46\x37\xc9\x99\x76\xd1\x5a\x93\x9c\x69\xd7\xbe\x36\xc8\x99\xe2\xff\x00\x39\xaf\x21\xf9\x8b\x8a\x64\xda\xde\x6f\x07\x41\xd3\x2e\xde\x5f\x11\x74\xb2\x83\x74\x36\x05\xb3\x29\xa8\x70\x5c\x68\x78\xa6\x0d\x4d\xc7\x34\xa9\x6d\x43\x8f\x0a\x2c\x3c\x6e\x0b\xc4\x19\x64\xdc\x65\x94\x64\x82\x19\x51\x8c\xa8\x4d\xb1\x65\x21\x64\x31\x06\xa9\x89\xfb\xca\x55\x63\xf8\x4d\x72\xbe\xde\x84\x49\x84\xf7\x41\x1c\xe5\x89\x05\x2a\x52\xa6\x2e\x62\xc2\xb5\xa9\xe0\xdc\x63\xb6\xcb\x4c\xc8\x39\xe7\xc2\xf3\x4d\x66\x62\x82\x6d\x6e\x79\xd8\xa2\x19\x20\x96\x69\x1b\x14\x61\x03\x59\x94\x21\x8a\x2d\x13\xed\x75\xbf\x58\x51\x02\xdb\x9f\x94\xd9\xbe\xa4\xcc\xf6\x24\x65\xf6\xa5\x49\x79\x15\x85\x90\xd3\xed\xb0\x86\xec\x8a\xa4\x57\xd8\xaa\x8d\xb4\x86\xaf\x31\xea\x2b\x85\xa3\xbf\xde\x32\x52\x90\xc8\xdb\x51\xc8\x67\xa2\x8c\xfa\x58\x5d\xa8\xb3\x4b\x91\x23\x94\x45\x22\xbc\x27\xe0\x16\xf6\x28\x6e\x61\xbb\xb9\x65\xb1\x41\x99\x39\xf4\x4d\x16\xc1\x26\xf5\x6d\xc4\x2c\x13\x33\xcc\x0d\x97\x31\xec\x98\x0e\xa4\x3e\xf7\xb1\x4f\x08\x77\x98\x41\x85\xeb\x65\x42\x16\x9b\x8c\xda\xb6\x69\x10\x1b\x62\x9b\xd8\x94\x99\xa8\xdf\x8e\xbc\x6a\x8e\x5f\xc0\x78\x93\x41\x0a\x1b\x62\xc9\x1b\x86\xf0\x10\xf5\xa9\xe3\xb2\x4c\x29\x72\x31\xc5\x88\xfb\xcc\x74\x0d\xc7\x65\x2e\x41\xc8\xc3\x90\x63\x07\x89\x4c\x6b\xb1\x6d\x6c\x5b\x26\x64\x36\x41\x0c\x5b\xb6\x45\x0e\xe4\x0d\xc3\xd8\x9b\x37\x0c\x73\x4f\xde\xa8\x35\xdc\xca\x1b\x86\xf5\x1f\xe6\x8d\x02\xcf\x8f\x65\x8b\xcf\xa7\xed\xd5\x8a\x0f\xa1\xed\xda\x1e\x75\xd1\xf6\xbc\x95\xa8\x16\x81\xd3\xa4\x6e\x44\x7c\x8f\xba\x8e\x4f\x31\x66\x8c\x1b\xbe\x65\x63\x83\x5b\xdc\xa4\xd0\x74\xb8\xe9\xb9\x06\x77\x7d\x13\x9b\x7e\xc6\x08\x08\x63\x6c\x99\x16\xa4\x19\x91\x53\xd3\x44\x15\x75\xe7\xb6\xf0\x06\x61\x0f\x5b\x4e\xa3\xe4\xae\x1e\x19\xd6\x80\xc5\x35\x38\xc6\x36\x32\x2c\xdb\x23\x16\x77\x1d\x2e\x4c\x46\x89\xeb\x67\xd2\xdf\xf7\x4c\xdf\x26\xcc\x84\x16\x77\xa5\x8d\x09\x5a\x0c\x22\x8b\x5a\x04\x9b\x14\x31\x6a\xc0\x7e\x33\xee\x6c\x1d\x9a\xb3\x36\x8c\xac\x45\x67\x49\x61\x56\xf2\x1c\x63\xd4\x44\x9e\xc9\x38\xe7\xd4\x75\x4c\xcb\x41\xae\x65\x59\x1e\xa6\x36\x31\x10\x15\x44\xd8\x0e\x17\xc2\xf0\x25\xcf\x99\x98\x12\x13\x21\x22\xa1\x62\x18\x99\x07\x9e\x47\xfb\xb3\xdc\xbe\x1c\xb7\x1f\xc3\x99\xff\x19\x7e\xcb\x4e\x87\xae\x90\xb8\xff\x3e\xde\x33\x1f\x75\xac\xec\xe4\x3c\x6f\x27\x9d\x35\xa8\xde\xe6\xbe\x30\x2d\xdf\x32\x09\x77\x2c\x4a\x39\x74\x91\x85\x39\xa3\x44\x08\x87\x60\xcf\xf3\x1d\xdb\x13\x1e\xce\xa8\x1e\xd9\x36\x32\x8d\x4c\x07\x63\x04\x53\xdb\xb6\x31\x5b\x71\x60\x31\x87\x7c\x6f\x68\xd0\xfe\xf9\x61\xb4\x6f\x7b\xd0\x24\x9e\x67\x1b\x1e\xa4\xdc\x10\xd0\xf1\x91\x25\x90\x05\x31\x72\xb8\x6f\x43\x17\x11\x26\x6c\x2a\xaf\x15\xd8\x42\x96\x85\xa1\x01\x33\x5d\x0c\xd9\x36\x25\x07\x5e\x2b\xfe\xaf\xa5\xfd\xeb\x86\x7a\x14\x8a\xf7\x4d\xa4\xe7\x6a\x52\x11\x00\xfb\x17\x26\xe9\xcb\xfd\xc8\xa7\x41\xd7\x8e\x30\x7c\x87\x11\xd3\x71\xa0\x21\x3c\xce\x6d\x68\x63\xd3\xc2\xdc\x30\x20\x34\x1c\xc3\xf6\x30\x81\x8e\x27\xec\x3f\x7f\xff\x83\x52\x64\x91\x4c\x7e\x42\xcc\x0c\x62\x21\x93\xe1\x7e\x93\xa2\xcf\xb2\x29\x36\xaf\x17\xc7\xfb\xc1\xb6\x7a\x8f\x2f\xb5\x3a\xca\x0d\xd7\x24\xcc\x13\x10\x1b\xd8\x77\x6c\x48\x89\x65\x59\xa6\x4f\x28\xa6\xb6\x83\xa0\xe5\xd8\xa6\x0b\x49\x76\x14\x60\xc3\xc4\x16\x61\x98\x1a\x14\x23\x03\x61\x6c\xb7\x43\xe7\x47\xf1\x8c\x4b\xf5\x2e\x08\xe5\x84\xca\x2f\x60\xb2\x1f\x7c\xde\x62\x3e\x0d\x5c\x9e\x8a\x02\x3c\x6a\xdb\xae\x4b\x32\x34\x41\xea\x31\x68\xfa\x86\xc8\x8e\x5d\xc1\x2c\x93\x0a\x81\x89\x4d\x9c\xec\x78\x42\xd2\xda\x8b\xb0\x89\x99\x41\x6d\x46\x89\x65\x10\x62\x5b\xed\xe0\xf1\x69\x2c\xb8\xf7\x90\x8b\xe2\x44\xf9\x05\xdc\xdc\x10\xa0\x56\xef\xb9\xea\x2d\xb8\x51\x65\x9c\x8e\x0a\x54\x3e\x15\x71\xaa\xc8\xff\x3f\x0a\x42\x3f\x52\x81\x1a\x47\x53\x51\xfe\xa2\x02\x0a\xd4\x70\x32\xf2\xb3\x4e\x04\xa8\x1b\x6e\x4c\xc5\xf7\xb0\xf1\xa9\x08\x66\x8c\xa3\xf7\xb5\x7f\xb9\xd1\xf4\x08\x61\x75\xf5\x8f\x64\x76\x64\xd4\xfe\x39\x9d\x1c\xd1\x02\xb8\x55\x48\x58\x11\x8c\xa7\xaa\xb7\x20\x06\x37\x2a\x8f\x03\x7e\x34\x0d\xee\x25\x84\x49\x22\xe2\xb4\xf8\x1b\xa1\x87\xeb\x3c\xc2\xae\x88\xd2\xc8\xfa\x00\x35\xb9\xe3\xf3\xec\xf7\x6c\x6d\x47\x6e\x10\xbb\x72\x6d\x49\xf0\x5b\xf6\x1f\x8c\xcb\xe9\x2e\xa2\x24\xc8\x63\x5a\xd5\x34\x9a\x1f\xc5\xc1\xe4\x2e\xcd\x21\xbb\xca\x9b\x4e\x27\x12\x15\x32\x32\xeb\x7c\x2e\xc2\xb2\xe3\x28\x8f\xc5\xcb\xa6\xca\x10\x5c\x78\x4e\xe4\x99\x9a\x6a\x19\xd2\xd4\xf9\x94\xbb\xe2\x2e\x9a\x7a\x12\xb0\xeb\xd2\x3a\x9f\x0d\x53\x0e\x9b\x07\x7c\xdd\x82\x60\x8f\x91\x57\xd9\xec\x1a\x23\x9f\x94\xd6\x53\xf5\x16\x4c\x5b\xd7\x36\x15\xfe\x7e\x4b\xbb\xe0\x49\xf2\x3e\x8a\xbd\xed\x30\x94\xe9\xf2\xda\xe1\x28\x7e\xbd\x05\xee\x1e\x8b\x6a\xe6\x9c\x6b\x0c\xd9\x30\x41\x34\x08\x8b\x66\x94\x2b\xb5\xd3\x5a\x50\xe7\x2d\xb8\xce\xe7\xbd\x2a\x42\x9c\xb3\x89\xc3\x7c\xb6\x7a\xbe\xc0\x16\x60\x6a\x3f\x17\x24\x5e\x26\xf8\x90\x1c\xf1\x22\xca\x40\x2a\xe3\x85\xeb\x1c\x95\xcc\x83\x30\x14\xb1\x52\xfc\xf7\x28\x99\xad\x31\x51\x17\x05\xaf\x2d\x25\x6b\x17\x64\x70\x39\x69\xd8\x7c\x2d\x2e\x9e\x6b\x65\x0f\x27\x0d\x8b\x46\xf3\x38\x98\xf1\xf8\xa1\xf8\x57\xd5\x86\xc8\x51\x8b\x24\x11\x2a\x50\xbd\xc2\xfb\x2f\xdf\x3e\xf7\x9d\x7a\x0b\xc4\x1a\x1a\x8d\x76\x34\x8e\x3b\xd1\x58\xe6\x44\x6c\x41\x61\xf1\xd3\x6a\xd1\x05\x2b\x3b\x53\x1e\xbe\xcb\xa8\x31\x48\x25\x37\xe6\xff\xce\xb1\x7c\xbf\x0d\xc7\x5d\x72\x64\x3a\x39\xb2\xe4\x34\xbe\xec\x91\x24\x77\xe3\x77\xe2\xa1\x86\xd3\xba\x28\x29\xa8\xfb\x5a\x7c\x48\x79\x2c\x78\x27\x31\xae\xe5\x49\x6c\x90\x62\xb6\x75\xf5\x15\xad\x5f\x77\xd6\x36\x53\x02\x1a\x46\x47\x93\x45\x9a\x8a\x38\x59\xc9\x8d\x69\x10\x8a\x5c\xae\xdd\xa8\xe9\x83\x14\x52\x31\xf7\x82\x28\x5f\xd7\x65\xf1\x67\x07\x62\x5b\x32\x3e\xaa\xe5\xb1\x9c\xf7\x2a\x10\x59\x4b\x5b\x4a\x56\x7b\xfe\x45\x67\x2c\x93\xa2\xae\xcd\x57\x72\x47\x79\x2a\xac\xb1\xc4\xfa\x89\x83\xaa\xbf\xd4\xda\xb9\x94\x6f\x7f\xf1\x21\x15\xb3\x64\xe3\x4b\xb6\x0f\x29\x4f\x03\x77\xfd\x17\x37\x0a\x8f\xde\xc7\x7c\x3e\x97\x84\x7c\xd3\x7e\x22\xac\x35\x5f\xeb\x9f\x8a\x0f\x99\xfc\x4a\xf7\x3f\x27\x6e\x41\x04\xc2\xbd\x45\xef\x2d\xe0\x20\x59\x13\x30\xb7\x60\x21\xe7\x2f\x04\xc8\x4a\xa4\x64\xa2\xa4\xce\x25\xb7\xd2\xbd\xa3\xc1\x15\xb7\xe0\x6c\x0b\xaf\xb6\x26\x18\xdd\xb5\xdf\x55\xcb\x5b\xe9\x49\xb2\x5b\x90\xb7\xe6\x3f\x6d\xb0\x50\x8b\x72\x24\x49\x26\x0f\x6e\xcf\x36\x2a\x14\xef\x2f\x27\x61\xce\x22\xd2\x7b\xe5\x76\x09\x52\x31\x9b\x4f\x79\x2a\xd6\x52\x0c\x6f\x64\x17\xf0\x65\x36\xd9\x55\xe2\x0a\x30\x03\x26\x28\x53\x03\xa0\x5a\x3a\x05\x3e\x9f\x4b\xef\x9b\xa3\xac\xc7\xd1\x9a\x12\x03\xaa\xf4\x6f\x24\x6f\x97\x93\xc3\x7a\x1b\x52\x86\xea\xd3\x66\xde\x01\x56\xe6\x1d\x28\x3f\x18\xdb\xd3\x0e\x98\x9b\x69\x07\x2c\x60\x96\xbf\xda\xed\x59\x07\xca\x90\xfd\x46\xda\x01\x84\x80\xf3\xd8\xbc\x03\x72\x58\x5c\x25\x1e\x40\x55\x4a\x10\x44\xb6\xa7\x07\xa0\xe0\xe2\xc0\x78\x7e\x99\x9e\x61\x03\x4f\x68\x07\xa2\x50\x0b\xa6\x90\x05\x50\x95\xa1\x01\x75\x20\x0b\xb7\x23\x0b\x23\xf0\xea\x73\x90\x85\x6b\xc8\x22\xd5\xc7\xed\xc8\xc2\x14\xdc\x3f\x02\x59\x78\x03\x59\xb8\x40\xd6\xbc\x50\xd5\x5a\xf0\x85\x5b\xf0\x85\x2d\x80\x2a\x4a\xc5\x1d\xf8\x22\xed\xf8\x22\x08\xbc\xdc\x82\x2f\xc4\x76\x21\x8c\xd4\x10\x56\xa5\x36\x21\xdb\x11\x46\x28\x78\xf3\x98\x6c\x11\x65\x4e\x0f\xd6\x64\x4f\x62\x34\x51\x49\xcc\x1d\x79\x41\xac\x4d\x3c\x12\x1b\xa0\x8a\x47\x29\x6c\xc7\x23\x45\xad\x78\xa4\x18\xbc\xfd\x1c\xba\xa3\x64\x85\x46\xab\xfa\x48\xb7\xa2\x91\x32\xf0\xeb\x23\xe8\x8e\x96\xc8\x42\x55\x86\x22\x6a\xee\xc8\x70\x44\x2b\x74\x55\x59\x54\x6c\x80\xab\xb4\x9b\xac\x03\x59\xac\x1d\x59\x0c\x83\xd3\xcf\x49\x72\xc4\xc8\x2a\xcb\x11\xae\x92\x90\x30\x0a\xfe\xb6\x9e\xd0\x08\xe3\x7a\x4f\xd9\x86\x81\x0f\x7b\xa2\x4c\x36\x37\xc0\x6f\x79\xf3\x3c\x59\x1b\x26\x5d\x48\x65\xe6\xc6\x91\x61\x15\x5f\xf0\xea\x93\x0d\x54\x67\x91\xa6\x12\x36\x56\x25\x80\xc9\xd5\xaa\x96\x04\x30\xa9\xde\x12\xef\xb5\x2c\x53\xeb\x18\x10\x60\x63\x17\xaf\x18\xa8\x09\x97\x51\xe6\x48\xc5\x15\xad\x1b\x64\xc7\xf6\x1b\xb4\xb9\xfd\x06\x03\xb8\xca\xc1\x63\x18\x1d\x69\x74\xcc\xd6\xed\x37\x2c\xf0\xe2\x73\xb6\xdf\xb0\x6b\xdb\x5f\x25\xf5\x34\x61\x5b\x96\x2b\x13\x81\x87\x5d\x59\xae\x4c\xbc\x95\xcd\x4c\x02\x5e\x1f\x40\x33\x26\x05\x3f\xec\x47\x33\xe6\x86\x1c\x33\x4b\xd6\x24\xd5\xf9\x67\x16\x38\x4c\x8b\x0b\x4e\x9b\xb2\xb1\x92\x65\x24\x3f\xb3\x16\x6f\x7a\x66\xc5\xdc\x56\x07\x73\x5a\xed\xcc\x69\x61\xf0\x7e\x5f\x49\x56\xc7\xa2\x45\x80\x9a\x56\xb7\x30\x42\xab\xef\xdb\x85\x98\xc5\xc0\xbb\xcf\x38\x0b\x2c\xa3\x89\x43\xab\x40\x98\xbc\x0b\xd5\xb0\x05\x48\x75\x38\x58\x6b\xd2\x2c\xc3\x96\x55\x61\xcb\xee\xc0\x96\xdd\x8e\x2d\x1b\x83\x1f\x0f\xc5\x96\x9c\x86\xd4\xa1\x2c\x2f\x34\xd5\xaf\xb4\x3a\x0d\x88\xb1\x8f\x9c\xd8\x96\x6e\x60\x63\x6a\xd6\x5c\xbd\x6d\x00\x75\x67\x16\xc4\xcd\x1c\x87\xe5\x78\xe6\xd6\xa5\xac\xd2\x5e\x11\xf3\x51\x4b\x29\x83\x09\x37\x17\x62\x37\x17\x82\x20\x04\xea\x49\x3d\x55\xe3\x9e\x6b\x40\x10\x75\x65\x31\xcb\xc7\xc5\x40\x7d\xbd\x48\x52\x25\xa9\xd0\x94\xcb\x13\xf9\x10\x26\xc2\x54\xc4\xd2\xab\xfc\xae\x69\x26\xfe\xaa\x75\xca\xba\xbc\x40\x90\x80\x6f\x01\x22\xa0\xcc\x54\x4d\x56\x9a\x3f\xa4\x20\x15\x00\x51\x40\xd7\x7e\x5b\x25\xd1\x93\xd7\x24\x99\x64\x6a\x65\x0f\x06\xe9\x2a\xd8\x47\xdb\x48\x46\x25\x6f\xe9\xe0\xab\x74\x23\x49\xc8\x66\xd3\x4d\xeb\x30\x48\x37\x23\x5f\x5b\xa6\x68\x74\x71\xa3\xd0\x0f\x26\x2f\x82\xa9\x68\xeb\x27\x57\x34\xff\xe1\x6d\x2f\xdd\xc8\xf1\x55\x1a\x5c\xb5\x22\xb1\x97\xa5\x6d\xa4\xf8\xab\xe7\xd6\x4a\x77\x24\xf6\x32\xbb\x67\x2a\x0d\xb0\xe5\x4c\xe8\x4b\x4f\x95\x5b\x52\xcb\xe9\xf0\x67\x4e\xb7\x05\x87\xeb\x56\xd8\x72\xc2\x3c\x87\xfa\x17\x59\xdf\xca\xd2\x5a\x4e\x46\xab\xc9\xb0\xb6\x91\x9a\x31\xad\x27\xe7\xda\xa4\xa5\x43\x80\x6a\x12\x79\xda\xc8\xe9\xd0\xba\xe4\xca\x98\x9a\xae\xc5\xa8\x6b\xbd\x9a\x71\x35\xd5\x5b\xe2\xad\x3f\x7d\xda\xc1\x43\x39\x7a\x9a\x4d\xbe\x2e\x23\x56\x86\xa7\x6a\xbf\x8a\x5e\x29\x51\x95\xe7\xec\xdc\xb1\xa5\xb9\x21\xb6\xea\xc2\x36\xd7\x55\xc3\x6e\xbc\xbe\xf6\xf6\x8c\x97\x4f\x85\x59\x09\x4a\x99\xcc\xb5\x85\x16\x6b\x46\x58\x99\xe4\xb5\xe8\x66\x3c\x0a\x28\xba\x7d\xb2\x16\x1b\x67\x7d\x4e\x44\x1b\x6b\x5a\x99\x56\x07\x83\x41\xda\x9a\xb5\xa5\x03\x1b\xa5\x89\xb4\xb3\x9f\xb6\x04\x5e\x10\x0b\x37\x0d\xee\x45\xd2\xbf\x59\xe8\xe3\x9f\xc0\x42\xff\xee\x15\x58\xe8\xc9\x04\x8c\xf4\x73\x06\x7e\xd6\xaf\x80\xaf\x47\x60\xac\xbf\x64\x0c\x8c\xf5\xd7\x93\xef\xc1\x58\xff\x6e\xf6\x6f\x30\xd6\x7f\xbd\x7f\x05\xee\xf4\xec\xaf\xf0\xd7\xac\xe3\x8b\xec\xcf\x0f\x97\x17\xd9\x18\xdf\x81\x85\xbe\x00\x63\xfd\xe4\xb5\x91\xb5\x7c\x67\x83\xb1\x3e\x99\xfd\x0b\x8c\xf5\xef\x7f\x3d\x07\x63\xdd\xbb\xbe\x07\x0b\x7d\xf8\x1d\x18\xeb\x51\xfa\x23\x18\x65\x13\x8e\xf5\xd7\x17\x0e\x18\xeb\xee\xc9\x5b\xb0\xd0\x7f\x3a\x03\x0b\xfd\xfb\x18\x8c\xf5\x57\xc7\x17\x60\xac\xff\x6b\x98\xcd\x7f\x7a\xfc\x2b\x18\xeb\x43\xf1\x03\x58\xe8\x63\x30\xd6\x79\x92\x35\xfb\xc1\x04\x63\xfd\xed\xaf\xc7\x60\xac\x8f\xec\xdf\xc0\x58\xff\xed\xf4\xc5\x2d\x48\xd2\x87\x69\xb6\x2e\x55\xaf\x2b\xaa\x37\xe3\x70\x52\xe8\x41\x47\x7f\x3f\x39\x7f\x7d\xf1\xf7\xdb\x8f\xef\x03\x2f\xbd\xeb\x33\x08\xe7\x1f\x9e\xdf\x89\x60\x72\x97\xf6\x11\x86\xf3\x0f\xcb\x22\xad\xc4\x51\x7e\x3b\x6a\xeb\x5a\xa4\xe8\xee\xfb\x53\xf1\xe1\x39\x9f\x06\x93\x30\xb7\x1b\xcb\x0f\x47\x22\xf4\x9e\xcf\x78\x3c\x09\xc2\x23\x27\x4a\xd3\x68\xd6\x3f\xd2\x99\x98\x2d\xf5\xe6\xe3\x47\xdb\xd0\xf3\xc2\xac\xdb\x8f\xc5\x94\x67\x7b\xb4\xd4\x0b\x13\xed\xd6\xd6\xdc\x49\xa2\xe9\x22\x15\xcf\x8b\x19\xe1\xf3\xa9\xf0\xd3\x3e\xcb\xd6\xa3\xde\x2e\x35\x90\x97\xf7\xba\xe7\xb1\x12\x88\x41\xdc\x63\xb6\x6d\x93\x5a\x89\x8b\x50\x6c\xcd\x47\x8c\x56\x36\xb4\xf2\x4b\x95\xc6\xba\xbc\xc2\xad\xcc\x15\xa5\xf2\x50\x33\x1e\xd4\xf5\x55\x64\x37\x35\x9e\xaa\xcc\x45\x7e\x8b\xcf\xcb\x5c\xe0\xad\xfa\xf6\xee\xdc\xbd\x86\x56\xe5\xeb\x2c\x1f\xb8\xa4\x65\x39\xd1\xc3\x68\x34\xe3\x13\x71\x3c\x15\x71\xfa\x3a\x4f\xae\x51\x09\xb0\x7a\x5e\xdd\xe9\x5f\x10\x29\xf8\xcb\x21\x25\xbc\x2e\x2c\xe0\x3b\x11\xc3\x0f\x4a\x98\x8b\xc9\x13\xe2\x29\x37\x60\xec\xc6\xd3\xd6\x1a\x29\x85\x55\xbc\x32\x7f\xec\x71\xad\xd9\xc8\x7f\xbb\x99\x75\x25\x5c\x4c\xa7\xcb\x12\x68\x6b\x0d\x68\x73\x03\x8a\x1d\xc9\x66\x6b\xfb\xd4\xaa\xe4\x6e\x6c\x89\xbb\x49\xab\x45\x1e\xe8\xdd\x69\xa0\x71\x85\xea\xcf\xae\xae\xd0\x20\xaa\x28\x91\x9c\x56\x78\x4f\x9c\xe4\x13\x6a\x6d\x69\xde\x93\x4d\xf8\x1f\xc2\x0f\x3d\x58\x83\xbd\xb2\xa4\xd9\xe5\x55\x68\x8d\x19\xbe\xf9\xe1\xdd\x8e\xc4\xef\xcd\xf3\xb2\xb5\xaa\xc6\xf6\xf4\xef\xd7\xf5\x9c\xd3\x39\xce\xd6\x6c\xd9\x04\xd6\xf2\x4a\x2f\x5a\x1b\xe7\xc4\x4a\x90\xb6\x9c\x8a\x54\x19\x77\x65\xb7\x0d\x84\xbe\xf8\x98\x2c\xe6\xf3\xe9\xc3\xc5\x1a\x52\x2b\x9a\xfc\x28\xb3\x44\xf6\xd7\xd3\xb4\x9e\x5f\x8d\x47\xaf\x8f\x5f\x0e\xaf\x80\xfc\x35\x4f\x08\x99\x5d\x77\x5e\xf0\x60\xba\x88\xeb\x89\x1a\x4e\xce\xcf\x5e\x8c\x5e\x8e\x5f\x8c\x5e\x0d\xc7\xa3\xd7\x17\xe7\x97\xd7\xe3\xe1\xe5\xe5\xf9\x65\xb3\xe7\xd5\xc2\x75\x45\x92\x6c\xed\x39\x3c\x05\x2d\x52\xb5\xaf\xaa\xa0\x95\x04\xfa\xd5\x15\x5f\x71\x78\x22\x94\xf3\x2b\x25\xc8\x5a\x35\xea\x3a\x94\xde\x46\x41\x91\xd6\x52\x09\xc2\x34\x6a\x0d\xa8\x19\xf9\x4a\x18\x29\x6e\x34\x9b\xf3\x34\x70\xa6\xb5\x11\x83\x44\x99\xc7\x22\x11\x61\x0a\x8a\x71\x64\xc9\x04\x39\x52\x31\x48\xe8\x15\x01\xdc\xd9\x95\xf9\x52\xf8\xb1\x48\xee\x94\x42\x38\x2c\xb7\x87\xf1\xe7\x41\xf2\x69\x19\xfc\x5e\x7d\x8f\xcb\x4d\xea\xa5\x9f\x3e\xf5\xd2\xc1\x44\x0f\xd9\x6f\x3d\xa1\x69\x5a\x2f\xfe\xf4\x49\x68\xcb\x65\x4f\x3b\x3c\xac\x3f\x4a\x8e\xe4\xa2\x76\x85\xf5\x63\x9c\x47\xf5\x23\xb4\x2b\xaa\xbf\x35\x6a\x3f\x4a\xca\xdd\x08\xd2\xa9\xf8\xf3\xf7\x3f\x5c\x8a\x3d\x4f\x58\x44\x18\xc8\x36\x18\xf5\x6d\x42\xb0\xed\x61\x9b\x7a\x9e\x45\x7d\x8f\x19\x8c\x43\xc1\xa5\x33\xa7\x85\x6c\x42\x88\x61\x5a\x16\xa3\x94\x50\x93\x60\xb3\x9f\x6d\x86\x24\x82\xbc\x30\xc7\xf7\x0b\x47\xc4\xa1\x48\x45\x72\x78\x44\x7f\x05\xda\x3b\x2b\x51\xee\x45\x9c\x48\xe5\x65\x3d\xaa\xdf\x73\x4c\xc8\x90\xeb\x40\x68\x79\xbe\x49\x3c\xcf\xf0\x20\x44\x1e\x85\xb6\xe1\x21\x8c\x2d\xec\x58\x9e\x43\x85\x8c\x8c\xa7\x06\x21\x36\x64\x16\xc3\x06\x36\x08\x32\x18\xdc\x2f\xcd\x40\x7c\x28\x50\xdc\x72\x2d\x2a\x98\xcf\x29\x43\x04\x11\xc8\xa0\x2d\x6c\x1b\x23\x97\x13\xd3\x83\xc4\x47\x8c\xf9\x1e\xe1\x19\xb6\xa9\x49\x09\x45\x06\xb5\x6d\x62\x21\x9b\x62\xcb\xc6\xfb\x01\xb5\x16\x0a\x5e\x25\xc1\x8b\x12\x65\x1a\x24\xa9\xe2\xe7\x02\xa0\x09\x18\xf3\x2c\x5b\xf8\x1e\x73\xb1\x67\x11\x0b\x71\x9b\x7b\xd4\xb4\xa1\x61\x09\x1f\x5b\x32\x9e\x95\x3b\x16\xe1\x32\x18\xdb\x92\x81\x5b\x04\x9b\xd4\xb6\x0d\x93\x42\x1b\xed\x07\x58\xd0\x8a\xad\xd2\x55\xd8\xe4\xd0\xf1\x91\xe3\x79\x06\x23\x9c\x1a\xd0\xa7\x86\xef\x13\xe4\x98\xae\x23\x2c\x46\x88\xef\x79\x2e\x74\x4d\x9e\x35\xb5\x4d\x62\xda\xd0\x86\x84\x18\x96\x81\x21\x26\x7b\xed\xd7\x1e\xf9\x09\x5a\x52\x19\xec\x1b\xb6\x85\xf6\x0c\xdb\x42\x5f\x3a\x6c\x6b\x3f\xf7\xf7\x27\x48\x65\xf0\xa8\x68\xaa\xce\x8c\x0f\x2b\x27\xe1\x3d\x9d\x49\xdf\xf3\x38\xcc\xbd\x4b\x3a\xfd\x49\x5b\xfb\x79\x3c\xcc\x9d\x37\xbb\xbb\xe5\xae\x57\xe2\x5e\xba\x5e\xe1\xca\x85\xad\x14\xbc\x85\x0b\xe5\x5f\xcd\x53\xb4\xc5\x1f\xa7\x38\x76\x5b\x7d\x68\xaa\xdf\x08\x50\xf3\x1c\x53\x07\x38\xd2\x75\xb8\x28\x16\x28\x2d\x55\xea\xf5\xc1\xe2\xe2\x4c\x2d\x59\x3f\xdb\x98\x94\x3b\x41\xe8\x89\x0f\x2a\x50\xa1\x74\x92\x2a\x1a\x1d\xe5\x8e\x87\xd9\x91\x9d\x36\x1c\xbd\x4a\x34\x16\x2d\x9b\xb3\x54\xa3\x2b\xd3\x88\x7b\xc2\x6b\xdb\xd9\xa2\x69\x61\x31\xaa\xec\xe3\xb9\xfb\xd8\x7e\x4e\x96\x3b\x3c\xca\x4a\xe2\x7c\x72\xa7\x32\xf1\xc1\x9d\xf2\x99\x14\xdb\x47\x69\x1c\xf0\x70\xb2\xa7\x77\x59\xbc\x1b\xe8\x82\x33\xba\xa6\xeb\x72\x65\x8b\x56\xde\x7e\xed\x1b\x7f\x32\x8d\x92\xd2\x01\x55\xfe\xb5\xb6\x9f\xb2\xe9\x5d\xe0\x79\x42\x92\x7c\x2c\x5d\xfc\xca\xf9\xf3\x0e\x07\x70\xc6\x6d\xc3\xd3\xed\x70\x7a\xd9\x87\x4c\x3a\x9d\xe7\x1e\xef\x41\x16\x0a\x60\x02\x54\x77\x21\x93\x8e\x3c\x60\xda\xfa\x9d\x00\x2e\x80\x5d\x7d\xaf\xde\x66\x29\x50\xef\x68\xe1\x36\x96\xdd\x81\x59\xfe\x0a\x79\xfc\x2a\xea\x19\x99\x94\x7a\x08\x5d\xb5\xe5\x0e\xdc\xfa\xd4\xbe\x72\x5d\xd9\x70\xb5\xb0\xc1\xaa\x7e\x59\xc7\xeb\x24\x5a\x7b\x9d\x34\xb5\x55\xf9\x16\x57\x6c\x79\x6a\xb7\x36\x2e\x9d\xcd\x77\xb1\x9a\xa7\x85\xbd\xba\xb1\xe7\x02\xac\xf5\xf9\x2e\x0a\x73\xa3\x67\x92\x0b\x48\xe1\x15\x0f\x77\x12\x4a\xba\xba\x51\xa2\xd5\x6e\x30\x90\x64\x40\xe2\x8c\x92\xea\x18\x41\x9b\xf5\xa8\x8c\xce\xb7\xe4\xd2\x99\x6c\xcb\x23\x9e\x55\xbe\x72\x66\xf4\xc5\xc3\xb5\xfb\x4a\xe5\xfb\xda\x65\xbb\x40\x35\xdf\x8d\xdc\x3b\x6d\xd7\x43\x66\xa9\x0d\x9e\xe7\xa2\xbf\x74\xdd\x90\x84\x06\xc1\xb5\x00\x08\xac\xdd\x63\xd1\x9a\xa3\x40\xe1\xcc\xb6\x28\x9a\xe5\x37\x58\x44\xb5\x27\x79\xfe\x83\x83\x41\x2f\x5c\x4c\xa7\x83\x41\x5a\xda\x0b\x92\xaf\xb3\x0f\xfd\xd5\xbf\x8b\xcc\xd0\xda\xb3\x67\xe9\x9e\xc6\xbc\xf6\x97\x82\xb2\xb6\x62\xc3\xd6\xd5\x3a\x6c\xa7\x39\xac\x7d\xe8\xce\xb7\x48\x52\x5a\x47\x26\xfa\xd4\xfd\xb9\x67\x00\x1b\xa4\x7a\xfa\x2e\x7e\x9b\x5f\x14\xb4\xd2\x1c\xc2\xd6\x5e\x20\xda\x5f\x5b\x0a\x7c\x94\x5d\x5a\x1e\xce\x6a\xaf\x2d\x25\xf2\xd6\x1e\x44\xd6\xdf\x5d\x0b\x01\x77\x9e\x94\x6b\xdd\xf9\xc8\x52\x6b\xba\xc7\x4b\x42\x6e\xf3\xdf\xfe\x82\x50\xbd\x07\x54\x2f\x08\xab\x77\x80\xe2\x89\x20\x7f\x50\xd8\xb0\xf5\xcf\x83\x79\x36\xf1\x48\x3f\xbf\xaf\x1b\xfe\x4b\x65\x6d\x9b\xe5\x3e\x90\x3e\xf2\x47\xce\x34\x72\xdf\x2d\xf5\x9a\xea\xd1\xd6\xc9\x5d\xc4\x49\x14\xf7\x65\x1e\x6a\x11\x3f\x6f\x1b\xa3\x7a\x41\x80\xf0\xef\xcf\xef\x33\x85\xd0\xe5\xd3\x23\xf9\x34\xd0\x4f\xa3\xf9\x73\x37\x9a\x46\x71\xff\x7f\x41\x68\x62\x4e\x9e\x6f\x18\xf9\x9f\xa7\xd1\xbc\x4f\xad\xf9\x87\x35\x58\x74\xa9\x04\xb5\x41\xe4\x70\xf7\xdd\x24\x8e\x16\xa1\xd7\x0f\xa3\x50\x3c\x77\xa2\xd8\x13\x71\xfe\xf7\x9c\x7b\xd9\x46\xf5\xe1\x73\x3f\x0a\xd3\x7e\x10\xde\x89\x38\x48\x9f\xaf\x2f\x62\xa9\xe7\xe7\x6e\xdb\xe0\xf7\x41\x12\x38\xc1\x34\x48\x1f\xfa\x79\xa3\xe6\x0b\xc2\x5c\x0c\xe2\x1e\x31\x2d\xcb\xd4\xc0\x50\xc8\x52\xf7\x36\x61\x65\xfe\xf8\x33\xd1\x59\xd5\x5e\xd6\xdc\xcf\xae\x06\x97\xe7\xaf\x2e\x5e\x1d\x9f\x0d\x1b\x05\xfb\xd7\x4b\xdc\x77\x57\x47\x2f\x86\x50\xe4\x18\x4a\x3e\x80\x92\x0d\x50\xab\x2a\xbe\x6d\xae\xb3\xe3\xd7\xc3\xcf\x9a\xab\x51\x8f\x7d\x73\xae\xae\x89\xb6\xd7\x93\x6f\x9b\x6b\x63\x1a\x99\x7b\xf4\xa0\x25\xbc\xed\x02\xb9\x4c\x4a\x7a\x28\x9c\xbb\x07\x3c\xbf\x2c\x00\x5d\x1b\xb5\x88\x24\x2a\xee\x46\x12\xea\x3c\xbd\xa7\xd4\xd9\xfa\xd3\x2a\x97\x76\x63\xd8\x8b\xcb\xd1\xdb\xe3\xeb\xe1\xf8\xe4\xd5\x9b\xab\xeb\xe1\x25\x08\x92\x6f\xa2\x68\x2a\x78\x58\x83\xa9\x68\x93\x27\xc6\x55\x8a\x96\x4d\xf8\xca\x81\x46\x17\xcd\x6e\xa3\x8b\x66\xdb\xf5\x82\x57\x07\x60\xa7\xb3\xda\x7e\x27\x99\x48\xda\x6f\xd9\xc0\xf6\xad\x3f\x84\x53\xde\x96\x9c\xa1\x7c\xf3\xea\xfc\xe4\x7b\x15\x54\xcf\xd8\x49\xff\x66\x28\x74\xfe\x4e\x3f\x3b\x1f\xff\xf8\xed\xe8\x7a\x98\xdd\xfb\x4f\x86\x20\xff\x38\xba\x1a\xe7\x45\xe5\x46\x17\xe3\xb3\xe1\xf5\x8f\xe7\x97\xdf\x8f\xaf\x86\x2f\x5f\x0f\xcf\xae\x6f\xf7\xe3\xb1\xbd\xa0\x7c\x0a\x68\x6e\x97\xc0\xdb\x14\x39\xba\xae\x9f\x09\x7d\xed\xe3\x3a\xd8\xd9\x20\xc3\xcb\x47\x0a\x85\xbc\xb3\x72\x76\x7e\xba\x55\x24\x6c\xcc\xb1\x0f\x52\xda\xc7\x78\x9c\x40\xd9\x84\xf3\x49\x40\xdc\x82\x06\x29\x85\x9f\x68\x5f\xe5\x61\x73\x9e\x1d\x30\x06\x31\x4c\x54\x7b\xae\xbe\x14\x8f\xad\x64\x9f\x3b\x5e\xee\x5b\xf2\xf4\xb8\xf3\x05\xb8\xf2\xe0\x35\xb4\x5d\xd5\x87\x6b\x55\x90\xd7\x4b\x0f\xbb\x9b\x39\xac\xb5\xcd\x7a\xe0\x6d\xad\x6a\x2f\x52\x93\xa7\x00\xf1\xf0\x02\xc9\x5d\x0f\x64\x27\x87\x17\x65\x25\xad\x45\x59\xaf\xba\x1e\x34\x31\x7b\x9a\x5d\x7e\xfa\x52\xd5\xa3\x47\xac\xdd\x6a\x5b\xfb\xcf\x9d\x6b\xdf\x87\xc2\xed\xa7\x5b\x7b\x79\x3c\x87\x22\x3d\x09\xbc\xf6\x55\xfb\x87\xaf\x9a\xc2\xb6\x55\xdf\x3d\x62\xa0\xd6\xda\xda\xb3\x2e\xf4\x11\xf8\x57\x25\x1d\xe7\x11\x6b\xc7\x6d\x6b\xbf\xe8\x5c\xfb\x1e\xf5\xa0\xbf\xfc\xda\x57\x34\x55\x98\xa4\x2f\xa6\x3c\x14\x9d\xb4\xf5\xea\x11\x68\x21\x6d\x68\xb9\x7f\xc4\x40\xb4\x6d\xa0\x97\x5d\xf8\xa5\x5f\x50\x2c\x91\xcf\xa2\xad\x37\x8f\x58\xbb\xdd\xb6\xf6\xb7\x9d\x6b\x7f\xa2\x83\xf7\xf3\xd6\xbe\xa2\xad\x1f\xa3\xf8\x9d\x88\xcf\x22\xaf\x9b\xb2\x7e\x3d\x1c\x29\xac\x55\x6a\x9d\x3e\x62\xa0\x56\xa9\xf5\xb7\xed\xde\x66\x1b\x65\xc7\xd7\x9c\xa8\xf6\x2b\x3b\x9e\x3b\x4f\xe5\x75\xc7\x69\x65\xe3\xdd\xa7\xee\x38\xaa\x15\x1e\x7f\xb9\xcd\x8a\x8b\xe8\x36\x33\x6e\xe1\x19\x55\xc4\x60\xac\xca\xcf\xdb\xdb\x03\x80\x21\x78\xd3\x5d\xd1\xbb\x3b\xa6\x09\x6d\xa2\x0a\xed\xc0\x15\x6a\x43\x16\xa2\x80\x56\xfe\x69\xa8\x03\x5d\xa8\x03\x5f\xc8\x04\x6f\x0b\x8b\xf2\x23\x11\x86\x6a\x18\xab\x3c\xb5\xd0\x76\x94\x61\x08\x7e\xdd\x85\xb2\xc2\xaa\x7b\x7a\x28\x6a\x77\xe8\xb8\x3b\x6a\xa5\xbf\xaf\x78\xf3\x6a\xe1\x84\x22\x3d\x13\xef\xb5\x66\xad\xf4\xf6\x38\x80\x5d\xb5\xd2\x0f\x98\x34\x13\x0b\xb5\x89\xd1\x67\xce\x7c\x48\x95\xf6\xd1\x45\x5d\x0c\x7d\xd8\xca\xf4\x4d\x96\xa7\x5a\xd3\x6d\xd2\xa8\x31\xf9\xf6\xa0\xd9\xe6\x43\x0e\xab\xf9\x5c\x76\x84\x4c\x9a\xed\x14\x6d\x81\x4b\xb1\x2d\x4c\x7b\x2b\x41\x17\x29\x07\xca\x77\x1c\x54\x29\xab\xa8\x76\x63\xc1\xab\xf7\x18\x04\x8e\x45\x23\x90\x76\x55\xe9\x1f\x83\x49\xf3\x47\xbc\xc1\x3d\x3b\x93\x0b\x9c\x3c\x4a\xb6\xb0\x4d\xd9\xb2\x7f\x7a\x81\x9a\x6c\xb1\x0a\x5f\xd5\xfd\xf3\x0b\xa0\x7a\x82\x81\xab\xcf\x13\xc6\xb5\x14\x03\xb8\x92\xc6\xbb\x53\x0c\x8c\x1e\x83\x32\xbc\x89\x32\xbc\x03\x65\xab\x0c\x03\xda\x2a\xbf\xc0\x2a\x56\x78\xbf\xfc\x02\xa8\x9e\x60\xe0\xe7\x6d\xf8\xc2\x5b\xdf\x20\x1b\x19\x06\x56\xd1\xbe\xbb\x33\x0c\xf8\xfb\xc8\x62\xc2\xc0\xdd\xa3\x64\x71\x33\xf1\xc0\x2a\x15\x81\xb9\x29\x27\xac\x1d\xca\x82\xdd\xa6\x2d\xc0\x22\x8a\x59\x4a\x12\xd4\x91\x8c\x00\xb7\x23\x9d\x12\x30\xfb\x3c\x22\xa5\xb5\x08\xd4\x2a\xc5\x0a\x65\xdb\xf3\x11\x18\xc0\x79\x0c\x91\xd2\x4d\x94\xd1\x1d\x28\xa3\x6d\x28\x63\xb0\x16\x37\xcd\x3a\x50\xc6\x3a\x50\xc6\x08\xb8\xf8\x3c\x9d\x81\xd5\x50\x56\xa5\x0e\x61\xdb\x51\xc6\x0c\xf0\x6a\x1f\x3a\x65\x26\xb8\x7f\x2c\x9d\xca\xfe\x16\xf8\x9b\x00\x18\x83\x52\x1e\x10\xba\x5d\xad\x28\xb5\x0a\xab\xfb\x80\xbf\x0f\x45\xba\x61\x48\x5b\x7b\x55\xad\x3f\x91\xca\x40\x29\x59\x92\x7b\xa7\x0d\x6e\xfd\x51\x55\x6c\x4e\xb4\x23\x9a\xed\x33\x94\x96\x6c\x2a\x59\x7f\x4f\x82\xa8\xed\x19\x0d\xfa\x99\x13\x66\x9a\xd1\x37\xd3\xc8\x7d\xa7\xed\x19\x0e\xfa\xc4\xba\x51\x33\xe2\x70\x13\x4a\xb7\x66\x38\xd8\x54\x21\xe1\x17\xc3\xce\xe6\xbc\x0d\x2d\x92\x7d\xe6\xdc\x8f\xc3\xd4\xaa\x57\xe1\x0c\x7e\x1d\x4d\xa4\x67\x98\xfa\xd5\x8c\x87\x7c\x22\x66\x22\x4c\x8f\xca\x9c\xc7\x49\xca\x43\x8f\x4f\xa3\x50\x94\x9f\x8e\x66\x91\x27\xd6\x4c\xb8\xbf\xb5\x1a\xd7\xd9\x13\xd9\x8f\x56\xf3\xbc\xf8\x6b\x59\xae\x1f\x1e\x71\x91\x5f\x45\x19\xd5\xd6\xf5\xba\x1d\x7f\xe4\xa9\xf1\xf7\xc3\x17\xc6\x5f\x2b\xea\x9a\x58\x7b\xff\x08\xac\x19\x6d\x58\x7b\xf7\xb9\xe6\x8f\xce\xab\x0f\xd9\x48\x17\x04\xd8\xea\x68\x3e\xd0\xf8\xf1\xdb\xe7\x5d\x7d\xac\xb6\xab\x8f\xdd\x7a\xf3\x81\xe0\xc5\xee\xcb\x0d\xda\x7e\xb9\xc1\xe0\xe1\x51\x97\x1b\xb2\x79\xb9\xa1\x3b\xb0\x8c\x58\x13\xcd\xc8\x00\x6c\x15\xfa\x67\x76\x98\x4d\xac\x0e\xb3\x89\x0d\x5e\x7f\x1e\xaa\xb3\x4b\x53\x89\x6b\x56\x65\x80\xc1\xa8\x0d\xd9\x18\x83\x1f\x76\x22\x7b\xf7\xb5\xe8\xfd\xd3\x99\x52\xf6\xb0\xa4\x74\xea\x3c\x2d\xd6\x8c\xff\x5e\x0d\xa6\x4c\x00\x53\xe9\x30\xc6\x4e\x08\xb3\x6e\x49\xbd\xdf\x23\x00\xac\x89\xa9\x1f\xdb\x65\xf2\x93\x3f\x18\x7f\xf7\xd7\x3a\xd3\x7e\x3a\x5c\x3a\x1b\xad\xc6\xe9\x6f\x5a\xf1\x67\x3c\xb9\x4e\xf0\xed\x5f\x0b\x7f\xdf\x3f\x02\x7f\xad\xcf\x46\xff\xda\x11\x4a\x6e\x34\xd0\xd8\x29\x66\x71\x53\xca\x12\x60\xd4\x7d\xc0\x5b\xaf\x99\xed\x22\xd6\x00\xdf\x7c\x9e\x84\x35\x57\x02\xd6\xa8\x2e\x99\x56\x9b\x7c\xb5\xc1\xb7\xbb\xcf\x32\xb8\xfd\x2c\x43\xe0\xfb\x83\xc4\xeb\x76\x0b\xb5\xd1\x2d\xb5\x9a\xc6\xe2\x52\x6a\x91\xad\x42\xab\xd9\xeb\xb1\x52\xb5\x46\x7d\xff\xfe\x8f\xaa\x44\xe6\x63\x55\xa2\x1f\x9f\x4c\x25\x62\xd6\x2e\x95\xe8\xbb\xbd\x54\xa2\xc2\xf2\xc1\x56\xc6\xe5\xed\x59\xf5\x10\x01\x3f\x1d\x7a\x74\x17\xc6\xe3\x7f\x09\x80\x70\x95\x2e\xcb\x80\x9f\x7d\xaa\x6f\x5e\x33\xf7\x3b\xd6\x37\xfb\xb5\xe7\x18\x7a\xc4\x75\xf4\xa9\x2e\x96\x22\x6d\xf5\xda\x7a\xf2\x43\x24\x4d\xbb\x72\x21\x98\xab\xd4\xcb\xa8\x36\xd0\x1e\xaf\xcf\x68\xb5\x63\x6e\xe0\xc5\x2f\xa2\xf8\x22\x0e\xee\x79\x2a\x4e\xf2\xd5\xde\x08\x99\x2c\xee\x6d\x58\x94\x93\x4f\xf2\xc8\x93\x5b\xad\xed\xf1\x39\xde\x02\xe0\x9e\xb8\xc8\x43\x84\xd2\x14\x60\x50\xae\xa4\x25\x82\x66\x0f\x6f\x8d\x9a\x49\xec\xd0\xa5\xd5\x56\x14\xa5\x87\x1f\x94\xad\x3e\x06\xc1\xe1\x03\x99\xad\xef\xf2\xe1\x23\x06\x6a\x55\x7d\xa6\x9b\x9b\x55\x97\xc2\x06\x6b\x6c\x58\xe7\x5b\xc6\x2a\xc9\xaf\x51\x3b\xbc\xcd\x83\x0e\x6f\xb2\x3a\xbc\xe3\xf4\xb3\x8c\xea\x66\x25\x26\x8d\xda\xcb\x5e\x94\xee\x61\x00\xb6\x41\xb0\x4f\x33\x04\x41\xb8\xab\xdd\xa3\x32\xd7\x34\x45\xe6\x3c\x27\xd7\xdc\x26\xb6\x76\x52\x3f\xee\x46\x73\x98\x21\x6e\x7c\x7e\x39\x7e\xf1\xc3\xe9\xd9\x61\xbd\x47\x17\xe3\xd1\x59\xe9\xd5\x7b\x79\x7c\xf6\x72\xa8\x2d\x65\x42\x10\x9e\x76\x24\x04\xb9\xd4\x47\x39\x6a\xe2\x85\x9b\x46\x71\x4f\x68\x1f\x93\xc5\x5c\xc4\x3d\x0d\xa4\x77\x41\xa2\xaf\xca\x13\x5d\x89\xf8\x3e\x70\xc5\x40\xe4\x3f\xe4\x69\xa7\x06\xaa\x9a\xff\xb3\x8d\x97\x07\x2b\xd7\xfb\xbc\x51\x8b\x59\x5c\xe6\xb7\x29\xa6\x0a\x45\x5a\x9c\x31\x83\x8f\xcb\xd5\xb7\xf5\x6b\xe5\xe0\xe6\x76\xf5\xd3\xda\x7d\xae\xfa\xa5\xe5\xd0\xaa\x7e\xdb\x50\xa8\xaa\x5f\x1a\x5e\x89\x03\x15\x41\x5d\xfe\xef\xbf\x90\xa1\xae\x35\x69\x3a\x99\xd5\x9a\x62\xba\xde\x74\xdd\x67\xa8\x68\x88\xea\x0d\xf3\xb4\x60\xeb\xb2\x71\xf0\x15\x2a\x7e\x6c\x93\x9c\x6b\xc8\xc9\xf1\xbd\x81\x82\xd5\x4f\x67\xe2\xfd\xe0\xe6\x76\x99\xe7\x7c\xb9\x4a\xc5\xbc\x70\x5c\xaf\xc5\xf1\x65\x1d\xb2\x63\xb5\x18\xff\xaa\x3a\x74\xbf\x3e\x13\x7d\x4f\x2c\x8b\x04\x8b\x8e\xb8\x8e\x0a\x22\x48\x7a\xda\xc7\x40\xff\x59\xf7\x78\xca\x8b\x4f\x97\x62\x12\x24\x69\xcc\xb3\x43\x5b\xcc\xaf\xca\x2e\xbd\x6c\x74\xb0\x9e\x4d\xe6\xed\xd9\xf0\xfa\xaa\x20\x1b\x21\x11\x9e\xe8\x4e\x10\x7a\xb2\xad\xa6\x81\xc7\x8f\xbc\x1e\x5d\x51\xcc\x11\x85\x2f\x44\xea\xde\x09\x6f\x9d\x90\xea\x53\x2e\x3b\xda\x64\xec\xd0\x45\x87\xa2\x93\xa6\xbf\x2e\x97\x56\x10\x8a\x8c\x43\xb9\xe2\xbe\x98\x3e\xf4\xda\xc3\x40\xba\x46\xd2\xfa\x68\x30\x18\x88\x22\x50\xf1\xf0\x71\xc5\x0d\xbc\xcd\x2f\xa7\xfd\xb2\xaf\xa4\x8a\x1f\x83\xf4\xee\x2a\x8d\x62\xe1\xc9\x31\xb6\x41\xd5\x42\x38\xda\x32\x07\x35\xf8\x4d\xbc\x88\xe2\x59\xaf\xc0\x51\x15\x93\xa9\x4f\x44\xda\x3e\xa4\xa6\xcb\x2b\xf3\x89\x8c\xae\x4d\xf4\x79\x30\x17\xbd\x1e\x04\x43\xfd\x83\xd6\x93\xe7\xe1\xe0\x9f\xdf\x5d\x9d\x9f\xe9\x49\x1a\x07\xe1\x24\xf0\x1f\x7a\x42\x1b\x0c\x06\x8d\x6f\xa9\xa6\x81\x1e\x04\x67\xfa\xa5\x26\xf7\x4f\x5f\x84\x15\x89\x6a\x9a\x5e\xfd\xdd\x13\x83\x7f\x7e\x2c\x48\x60\x3d\xdf\xae\x9c\xbf\x27\xb4\x65\x21\xe5\x5a\x41\x5f\x8b\x63\xda\x03\x72\x31\x18\x0c\xd2\x3d\x21\x2b\xa0\x92\xc2\x46\x0e\xb9\xc6\x00\xdd\x30\xd5\x82\x75\xfe\x1b\x70\x99\x31\xe6\x4c\x24\x89\x08\x27\x22\xd6\x65\xfd\xa0\xe4\xae\x48\x2f\x94\x31\x62\x15\x6d\x71\x3d\xbc\x90\xfc\x78\x76\x3e\xbe\xb8\x3c\xff\xd7\x4f\xe3\xd1\xd9\x8b\x73\x30\xe7\x0f\xd3\x88\x7b\xfd\x8f\x41\xe8\x47\xfd\x9e\xf8\x5a\xfc\x43\x05\x6a\x5f\x55\xb5\x7f\xa8\xc8\xb0\x75\xcc\x68\x21\x6f\x01\x32\x2c\xdd\x20\x3a\xc2\xb6\x8e\x0c\x75\x59\xee\x53\x9a\xc7\x78\x65\xd4\x58\xba\x68\x06\x51\x58\x6c\xa7\xb6\x2c\x83\x05\xc5\x20\x6b\xfd\x7c\x1d\xdc\xd5\x52\x56\x32\xe3\x72\xf8\x72\x74\x7e\x36\x3e\xf9\x36\x3b\x2a\x4f\x41\x3a\xf8\xe7\x47\x21\x89\x65\xb2\x1a\x36\xd5\x0b\xb8\xb5\x25\x10\x6b\xe8\x01\xfb\x4c\x90\x93\xbf\xa4\xfe\xc6\x3c\x6d\xa7\x61\x35\xd9\xc6\x5c\xd5\xa1\x9b\x89\xe8\xf3\xf0\xed\x6a\xef\x7b\x1d\xf1\x6c\x05\x8d\x9d\xd4\x0f\x98\xa2\x14\x76\x7e\xbb\xda\x20\xb9\xad\xc3\x6f\x8b\xc8\x2a\xa7\xea\x7a\xcc\xec\xa2\xf1\xfd\x27\xac\x47\x2a\x75\xcf\xf6\x98\x69\x5a\xa2\x0b\x8b\x09\xca\x53\xf5\x3c\xce\x1f\xcb\xcf\x6b\xd4\xb6\x76\x7a\x84\x93\xf3\x70\x14\x06\x69\xaf\x50\x9e\xf4\xd5\x07\x49\x23\x8b\x44\xc4\xa7\x3c\xe5\x99\xb4\x2c\x0e\x35\xdd\x59\x04\x53\x4f\x8a\xcf\x75\x6e\x2f\xd4\x94\xe0\x37\x1e\x7b\x99\x7a\xb3\x12\x06\xab\x7f\xb5\xc9\xe4\xfc\x97\x86\x12\x3b\xc8\x66\x2f\xc3\xd5\xde\xa4\xc1\x34\x48\x03\x91\x64\x02\x65\xd5\xe8\x35\x9f\xf7\x76\x8c\x2a\x23\xb4\x4e\x73\x8d\x26\x1f\x78\x57\x8f\x12\xe3\x45\xa7\x17\xc1\x54\x8c\x8a\x74\x6b\xdf\xf2\xd0\x9b\x8a\x38\x1f\x41\x26\x85\xab\xff\xba\x6b\x81\x9d\x03\x4b\x8d\x78\xdb\xd8\xb2\x41\xb9\xa0\x36\x8d\xa6\x7e\x0a\x57\x47\x5b\xb7\xa6\xd5\x1a\xed\xba\x83\x74\xdb\xb5\xb3\x96\x18\xdc\x96\xd8\xcc\x3d\x82\x8f\x77\x73\x6a\x01\x40\xab\xb6\xf7\xe9\x53\xaf\x63\xb1\xfa\x7c\x91\xdc\xf5\x3a\x43\x07\x37\x90\x74\x26\xde\xb7\x75\x69\x87\xb6\x35\x56\xb0\xa2\x67\xb9\xa1\x57\xfc\x5e\x78\x39\x0f\xbe\x2d\xb4\xfe\x5e\xa6\xb3\x75\x49\x80\x5e\x75\xdf\x4b\x07\x5d\x37\x02\xdd\x97\x0c\x3c\xf8\x67\x2a\x15\xa4\x4c\xcd\xd2\x40\x3c\x48\xbf\x4e\xa5\xd6\xdd\x57\xd5\xe7\xbb\xd5\xad\xce\xb0\xdb\x92\xd0\xda\x4d\x1f\xab\x7b\xd1\xed\x20\x6e\x5f\x47\x5d\x6e\x56\x5a\x68\xd7\x68\x39\x99\xdc\x0e\xc4\x72\x8b\xb8\xcf\x46\x09\xfc\x5e\xf7\xa5\x43\x80\xfa\x6b\x47\xeb\xe5\x4f\x0f\x92\xd1\x7c\x14\xe6\x30\xe2\xde\x16\xa0\x54\xf5\x1f\x9d\xf7\xc2\x5b\xed\x79\x43\xc3\x99\xf1\xf8\xdd\x71\x72\x21\x42\x4f\xf2\x7a\xc9\xea\xc9\x22\x8e\x85\xbb\x55\x65\xad\xc5\x5e\x77\x49\x0e\x70\xb3\xd0\xdf\x8d\xf4\x32\xfa\xb4\xe3\x5e\xab\x07\xc9\xdb\xec\xdb\x68\x7e\x1e\xbf\xf8\xd5\x0b\x7b\x1a\x10\xb7\xda\x52\x4c\x13\x91\xdf\x90\xbc\x20\xe1\xf1\x4c\xc2\xd2\x32\xf9\x57\x50\x5b\x6e\x21\xd6\x8f\x25\xdb\x05\xfe\x83\x6c\x20\x17\x91\x8c\x7c\xa9\x01\xca\xc6\x59\xc3\x51\x72\x16\xbd\x5f\x15\xb6\xa8\xd4\x19\xe9\x56\x26\x87\x98\x88\xb4\x05\x0b\x75\xd1\xd1\x89\x06\x55\xd5\xbe\x2e\x69\xa5\x16\x15\xff\x7c\x9f\x9b\x41\xd7\x21\xd9\x36\x8f\xc8\x58\x73\x4d\x85\x2a\xe9\xb7\xb0\x19\x08\xf0\xa4\x97\x91\x2e\xe5\xfe\xa3\x78\xf6\x4c\x94\x78\x6b\x51\xb6\x9e\x3d\xeb\xbc\x68\x16\x7a\x66\xef\xa6\xe5\xe2\x7a\x0b\x3e\xae\x65\x40\xcf\xf6\xad\x2f\xc0\x34\xca\x13\xb4\xf4\x6b\x2b\x5d\x6a\xcb\xf2\x82\xbb\x76\x93\x2c\x4d\x0f\x42\x8f\x85\xb7\x70\x45\xa9\xaf\xf7\xc4\x4d\x2e\x8d\x6e\x07\x69\x76\x46\x65\x8d\x80\xd0\xc0\xc7\xa5\xd6\x65\xf3\x38\x77\xfe\x2d\xdc\x54\x7f\x27\x1e\x92\x5e\x73\x7c\x0d\x7c\x0e\xd5\xa5\xdb\x08\x6e\xfd\xd4\xdb\x46\x72\xcf\xd3\x67\xcf\xda\x61\xd7\x83\xd0\x9d\x2e\x3c\x91\xf4\x52\x6d\x8f\xab\x6d\x63\xca\xfc\x6a\xdc\x31\x72\x7e\x5f\x2e\x26\x3e\x64\xd4\xd6\xe1\x6e\xe0\x6d\x46\x65\x6f\xd7\xce\x97\x52\x94\x6e\x1a\x94\x9a\xdb\x70\x23\x6e\x3f\x7d\xda\x66\x9b\x6a\x1f\x07\xc0\x72\x7d\x1b\x3f\x95\x89\x8b\xaa\x43\x4e\xfd\xf1\xf8\xf2\x6c\x74\xf6\xb2\xaf\x64\xf3\x2a\xea\x3f\xc4\x3f\x54\x85\xcf\xe7\x82\xc7\x89\x92\x46\x79\xde\xdb\x30\x52\x0a\x9a\x52\xf8\x3d\x0f\xa6\xdc\x99\x8a\xaf\x94\x3a\x3d\xaa\xff\x68\xde\x0e\x9b\x14\x25\x69\x23\x9a\x0a\x7d\x1a\x4d\x7a\xa9\xb6\x94\x0d\x82\x30\x28\x1a\xac\x49\xc7\xed\xfa\x7b\xeb\xcb\xd2\x36\xe5\x64\xdb\x54\x2d\xe9\x0c\xda\x31\xa7\x2d\x9b\x23\x48\x2b\x7c\x8e\xc7\xb8\x95\xe2\xbb\x75\x6e\x49\xde\x71\x41\x65\x99\x3a\x91\x8f\xfb\xcd\x83\x94\xf9\x31\xd8\x4e\xd6\x02\xc4\x05\x0d\xef\x43\xae\x02\xa4\x95\x2d\x67\xb9\x31\x97\x5c\x44\x95\x96\xab\x45\xb3\x59\x6e\xbf\xcd\x64\x03\x0c\xbe\x42\x85\x88\x6a\xb5\xe5\x0a\x90\x8d\xb4\x3a\x36\xbe\xee\x55\x1b\xf2\x76\x43\x61\xec\xa5\x1a\x58\x63\xcf\x86\xe9\xed\xb1\xf6\xac\x8e\xf1\xbe\x8c\x95\x4b\xeb\xe7\x2b\xce\xcf\xbb\x72\x77\xd6\x70\x53\x14\x6e\x4a\xb5\x9d\x97\xed\x6e\xbd\x4b\x5b\xb6\x8e\xb9\x3a\x33\xf7\xd0\x82\xf6\x3a\xff\xd7\xd5\xa0\xdb\x43\xb4\xac\x6d\x97\x8e\x2f\x32\x5f\xed\xde\xf3\x99\x6a\x5d\x18\xfd\x78\x17\xa4\x22\x99\x73\x57\x9c\x87\xc3\xd0\x4b\x3a\x9f\x36\x56\x2a\xe0\x99\x48\x33\xd1\x71\x25\x26\x33\x11\xa6\x3d\xad\xfd\x89\xe0\x09\x30\xf8\x17\x5d\xe1\x66\x18\xfd\xee\x6b\xe3\x5e\x68\x68\xbf\x09\x7e\x09\x12\x6a\x4f\x41\xf3\xd7\x43\x75\x23\xaa\xbc\xd3\xe0\x90\xdd\x96\x86\xdc\xbd\x93\x82\xbd\x79\x1f\x49\x81\xd0\xf2\xa3\xad\x45\x16\xd7\x35\xcf\x8e\x31\x2b\x43\xf9\x3a\x6a\x7b\x62\x63\x07\x96\xfb\x08\xf6\x67\xcf\x12\x91\x5e\x07\x33\x11\x2d\x52\x39\xf6\x3e\x5d\x9e\xfc\x30\x00\xff\x51\x05\x71\x35\x5b\x9b\xb1\x61\xff\xf9\x0e\xd6\x9a\x5a\xd6\xdb\xa5\x30\xee\x33\xff\xde\xaa\xd4\x4a\x1d\x69\x1a\xc2\x3f\xf3\x61\x60\xcf\xb7\x80\x75\x73\xd3\x6e\xee\x38\xf4\x1a\xb4\x6e\x0a\xf9\xbc\x7b\xf7\xf3\xce\x1b\x90\x27\x3e\x9c\xfb\x3d\xa1\xfd\x73\x00\x9f\x3d\x2b\xac\xaa\xfc\x5e\x48\xc0\x4f\x79\xca\xdb\xc9\xb0\x7c\x0f\x70\xa7\x82\xc7\xb2\xad\x5c\x57\xbd\x43\x0d\x34\x4d\x5b\x7a\x0f\x21\x9f\x05\x6e\xed\xd1\xa4\x65\x81\x72\xa0\xce\x73\xf8\x2b\xa8\x55\x75\x1d\xbe\xfe\x25\x27\x82\xbe\xf2\xb7\x8f\x62\xf9\x4b\x5f\xbd\x9a\x0b\x37\xf0\x1f\x14\x1e\x16\xe5\x2f\xde\x9e\x89\xb4\x48\x9e\x28\xad\xc7\x6f\x0a\x13\x78\x69\x0a\x59\xfb\xf8\x22\x8e\x66\x25\xbe\x0e\x30\x45\x9f\xe6\x29\x33\xcf\x63\xaf\xd4\xaf\x5a\xed\x03\x13\x91\xca\x5b\x4e\xae\xc8\xd6\x36\xb8\x58\x4d\x2d\x41\xe0\x7a\xd3\xb2\x2c\xe7\xaa\x61\x8e\x8f\xed\xc5\x3b\x56\x9a\x78\x28\xde\xf7\xd2\x4f\x9f\x84\xd6\x9b\xe8\x3f\x11\xa3\x77\xa5\x5f\x6a\xf2\x11\x69\xef\x02\x1d\x19\x2c\xbb\xca\x72\x90\xa2\x2c\x87\xbd\xab\x2a\x07\x08\xc1\x14\x70\xe0\x82\x04\x5c\x83\x05\x18\x83\x39\x18\x82\x33\xe0\x81\x73\x70\x09\x8e\xc1\x04\x9c\x80\x2b\x30\x02\x3f\x03\x1f\xdc\x81\x19\x70\xc0\x05\x78\xd5\x5a\xc9\x23\xcc\x0f\x34\x25\x03\xac\xaa\xe6\x21\x1c\x0a\x3d\x93\xf8\x36\xc4\xa6\x25\x6c\xdf\x71\x0d\x61\xba\x1e\xf5\x85\x6f\xba\x84\x23\xea\x10\xc3\xf7\x5c\xf3\xcf\xdf\xff\x30\x09\xc1\xb6\x65\x40\xd3\x32\x20\x33\x28\x35\x2c\xb3\x9f\x13\x8c\x1f\x95\x35\x58\x1a\x15\x3a\x64\xa5\x12\x25\xb7\xaa\x54\x25\x1e\x7c\x46\xa0\xc3\x98\xc5\x5c\x8b\xf8\x1e\x72\x88\xed\xd8\xd4\xc2\x2e\xf2\x11\xa2\x9c\x98\x90\x59\x8c\x53\x46\xfe\xfc\xfd\x0f\xc2\x6c\x0b\x1a\x04\x31\x4a\x28\x44\x18\x1a\x26\x3b\xac\xc4\x83\xb1\x77\x85\x07\x73\xcf\x02\x0f\xe6\x7e\xf5\x1d\xac\x2f\x5c\xde\x61\x55\x15\xf7\xb8\xc0\x71\xbd\xb8\xab\xfe\x04\x85\x1d\xac\xc7\xd4\x75\x30\x76\x96\x75\x88\xdb\xe8\xa3\x0e\x7b\x95\xf1\x5a\x99\x25\x93\x3f\x7f\xff\x03\x52\xd3\x73\x08\x77\x29\xf4\x39\x37\x30\x73\x2d\x68\x31\x03\x9b\x04\x51\xe4\x3a\x0e\x36\x29\xf2\x0d\xd3\x91\xf5\x66\x18\x85\x16\xb3\xa0\x45\xa9\x6d\x51\x66\xd8\xd8\xea\x17\xf8\x29\x95\x0d\x45\x6a\x1b\xf5\xc4\xda\xcd\x5a\x29\x39\x4c\xd2\x20\x93\x9d\x93\x15\xd9\x32\xdb\x17\x02\xd9\x48\x30\xc3\xe0\x2e\x71\x7d\x0f\xb9\xc2\xf0\xa0\x03\xb1\xe1\x41\xe4\x78\x98\x08\x06\xb1\x9d\x71\x8a\x89\x4c\x84\x19\x82\x10\x12\x1b\x5b\x18\x53\xf3\xc0\xca\x24\xf6\xde\x74\x8b\xbb\x8a\x98\x34\x09\x17\x77\x95\xdc\x68\x50\x2e\x46\x5f\x98\x74\xaf\xef\x44\x8e\xd9\xc8\x97\x45\x96\x42\xf1\x3e\x17\x23\x69\xa4\x38\x42\xc9\x2f\xdb\x9e\xb2\x98\x47\xa1\xe2\x89\xf9\x34\x7a\xc8\x14\xf0\xac\xb5\x2c\xf6\xb4\x5f\x61\x93\xd2\x15\xf9\x09\x18\x01\xa3\x47\x55\x38\xb1\x77\xb2\x42\xb0\x49\x76\x12\x0f\x12\x39\x0d\x2e\x20\x08\xda\x3e\xb1\x28\x76\x90\x87\x99\xf0\x3c\x0b\x51\x17\x39\xc8\x47\xd0\xa3\x8e\xef\x12\x07\xda\x36\x31\x33\xea\x23\x04\x5a\x16\xa1\xc8\x80\x90\xd9\x8c\x10\x83\x58\x85\x9c\xce\xb4\x18\xc5\xe5\x61\x18\xa5\x19\xa6\xc5\x6c\x9e\x3e\x28\xbf\x80\x70\xa7\xc8\xc6\x8e\xa0\x88\x53\x66\x7b\x5c\x30\xe8\x11\x4b\x40\xc6\xa0\x21\x3c\x48\x39\xb6\x19\xf3\x89\x03\x11\x81\xce\x9f\xbf\xff\x61\x63\x84\x29\x46\xc8\x34\x89\xc1\x18\xb2\xb1\x79\x60\x55\x1e\xbc\x3f\xed\x93\x7d\x69\x9f\xec\x49\xfb\xe4\x4b\xd3\xfe\x30\x4c\x45\xdc\xa2\x6e\x29\x32\x71\xb8\x3c\x48\xeb\x2c\xa1\x2b\x85\xce\xa4\x48\xa7\xa1\x4c\x6c\xed\x45\xfe\x4f\x41\xf6\xe4\x51\x64\x8f\x77\x93\xfd\xf4\xd0\x13\xc0\x70\x3c\x87\x39\xa6\xc9\x5c\x62\x73\x81\x0d\xdb\x76\x3c\xd3\xb4\x05\x75\x91\x65\x53\x1f\x59\x2e\x77\x7c\xc1\xfd\xac\x29\xc1\x90\x41\x64\x9b\xcc\x34\x29\x82\xd0\x86\xd5\x09\xd0\xc4\xf5\xfa\x11\xc0\x3b\x8e\x00\x37\xf0\xe2\xb2\x43\x28\xad\x05\x05\x50\x16\x17\x26\x86\xae\x67\x38\xae\x69\x70\xc3\x81\x3e\xf5\x31\xb6\x4c\x62\x73\xdf\x77\x3c\xd7\xf3\x20\xf4\x7c\xe2\x66\xc7\x01\xc5\x14\x19\xa6\x61\x50\x93\xda\x66\x76\x38\xd8\xfd\xb6\xad\x9f\xf1\x34\x83\xaa\x9c\xe7\x17\xe0\x6e\x02\x55\xdc\x24\x95\x79\x76\x95\x2c\x1e\x06\x6a\xc5\xb3\x18\x62\xd4\x36\x1c\xec\x50\x88\xa1\xe9\x08\xce\x6d\x86\x5d\xdb\xe4\x8e\x69\x10\xcf\x21\x8e\x89\xb0\xe0\x7f\xfe\xfe\x07\xb2\x2d\x64\x5a\x16\xcc\x38\xd5\x82\x08\x9b\xc6\x5e\xe5\xbb\x56\x54\x4e\x77\x30\x46\x8d\x21\x28\xde\x93\x4d\x6b\x0d\xb7\xb2\x29\x25\x5f\x98\x4d\x8f\x73\x19\x5c\xb2\x63\x81\x66\x9e\x24\xc1\x24\x14\x5e\x76\x50\x65\x9f\x0f\x3a\x89\x1a\x3b\x17\x46\x9e\x78\x0a\x2e\x5d\xa1\xe2\x10\x2e\xa5\x3b\xfa\xf4\x7f\x01\xc9\x9e\xb4\xd7\xe0\x55\xdf\x36\x5d\xcb\x76\x85\xcb\x4c\xd3\x73\x1d\xd3\x13\xc2\xc6\xd8\x33\x84\x63\x5a\xd8\xf2\x29\x77\xa8\x4d\x7d\x9a\x29\xf7\x38\xa3\x3f\x46\x21\x42\xcc\xb2\x99\x65\x50\x6c\xf6\x95\x93\xb6\x39\xc2\xf6\x73\xeb\x7a\x17\x88\x92\x79\x4b\xe6\x80\x16\x27\x36\x27\x82\x63\xe4\x70\xd7\xcf\x78\xc4\x82\x86\x87\xa8\x67\x19\xc4\x84\x98\x39\xcc\xe5\xb6\x40\x99\x14\xc9\xe4\x8a\x49\x0d\x68\x42\xd3\xb0\x0c\xdb\xb4\xec\xc3\x98\x83\xed\xcf\x1c\x6c\x5f\xe6\x60\x7b\x32\x07\xfb\xf2\xcc\x51\x6c\x4b\xc9\x1e\x9f\xcf\x07\xd7\x77\x41\x52\x8e\x9a\xdc\x45\x8b\xa9\xa7\x38\x62\x1a\x85\x13\xa5\x2c\xf1\x59\x89\xcb\x6d\x47\x22\xea\x9c\x1f\x3f\xc9\x91\xc8\x1e\xc5\x6c\x6c\x37\xb3\x2d\xf6\xa2\xe4\x06\xab\xb9\x02\x52\x2e\x4c\x6e\x63\xcb\xb3\x2d\x83\x18\x14\xbb\xb6\x47\xb9\x4f\x30\x31\x7c\xc3\xf4\x1d\x4b\x78\x0e\xa3\xd9\xdd\x85\x62\x68\x63\x4c\x6d\x4c\x10\x86\x0c\x33\xa3\x83\xd3\xe4\x3c\x9b\x9c\x36\xde\x0b\xbe\xf5\x03\x92\x19\x96\xe9\x5a\xc4\x61\x9e\x85\x98\x8b\x91\x65\x73\x07\x21\xc2\x7d\x8f\x20\x84\x99\xe7\x63\xc7\xb2\xb0\x6d\xca\x22\x97\x18\x31\x6c\x61\x33\x53\x59\x31\x66\x24\xbb\xb7\x75\xc3\xd7\x76\x54\xce\x37\x21\xcc\x4d\x9f\x92\xc2\x9a\x07\x25\x35\x89\xa0\x18\x22\xe8\xb9\x16\x84\x2e\xa5\x02\x7a\xb6\x6d\x0a\x13\x3b\x9e\x25\x4c\x68\x23\xec\x61\xdf\xe6\xb2\x2a\x28\x36\x11\x43\xd0\x44\x26\xb1\x10\x66\x78\xaf\xfa\x9b\x35\xfe\xde\x5b\x12\x74\xd9\x2a\x9a\x82\xa0\xeb\x8e\xdd\x90\x03\xe6\xff\xc0\x33\xb2\xb6\x65\xc9\x53\x30\xac\xf9\x28\x7e\xdd\xc9\xae\xc3\xbd\x88\xad\xc1\xae\x02\x33\x81\x05\xc5\x3e\xb5\x1c\x4c\x5d\x48\x90\x83\x10\xe7\x02\xb9\x9c\x9a\xdc\xf3\x21\xf2\xb3\x63\x92\x65\xca\x19\x66\x36\x32\xa0\x81\x19\x63\xd8\x32\x2c\x1b\x1b\x7d\xe5\xc7\xcd\x19\x3a\xce\xc5\xb3\xed\xe0\xad\x9d\x8a\x98\x72\x81\xa9\x8f\x0d\xec\xd9\x08\x73\x13\xfa\x8e\xe9\x40\xdf\x46\xc4\xb3\x98\xe1\x20\xd3\x75\x7d\xee\xd8\x22\x63\x68\x44\xa8\xc1\xb0\x85\x18\xc6\x10\xd9\xc4\xa2\xe4\x40\xab\xc6\xfe\xbc\x80\xf6\x65\x06\xb4\x27\x37\xa0\x2f\xcf\x0e\x9f\x75\x2a\xae\x53\xfe\xff\x90\xf3\x10\x3d\x8a\xbf\xd0\x6e\x06\xf3\xf6\xa0\xe0\x06\x7b\x99\xd4\xcb\x4e\x16\xdb\xb6\x5c\xd3\x61\x36\xe6\x3e\x47\xdc\xe1\xd4\xc2\x9e\x47\x1d\x68\xba\x1e\xa4\x2e\xc7\xb9\x81\x04\x33\x6c\x59\x06\x81\x84\x10\x6a\x9a\xa6\x89\x5b\xd9\xab\xe3\x30\x3c\xdf\x03\xb8\xf5\xa3\x90\x0b\xc7\xe0\x90\x21\xc3\xf3\x6c\x22\x2c\x97\xb8\x88\x99\x96\x25\x1c\xd7\x16\xd0\x34\x98\x6b\x08\x8f\x73\x47\x16\xa1\x46\x88\x61\x02\xb1\x01\x19\x25\x16\xb6\xa9\x45\xba\x61\x6b\x3b\x08\x2f\xbb\x6f\xd7\x93\xe2\x7a\x5d\x59\x34\xa1\xc1\x3d\xc2\x3d\x81\x6d\x82\x99\x10\x84\xb9\x86\xef\x40\x5b\x58\x18\xbb\x26\xa5\x26\x74\x98\x6f\x9a\x8e\x6c\x6a\xd9\x0c\x33\x02\x31\xc4\xb6\x85\x6c\x13\x1f\xc8\xfb\xff\xd7\x1e\x83\x5f\xde\x10\xff\x85\x0e\xb1\xe3\x43\xcd\x30\x36\xf7\x85\x69\xf9\x96\x49\xb8\x63\x51\xca\xa1\x8b\x2c\xcc\x19\x25\x42\x38\x04\x7b\x9e\xef\xd8\x9e\xf0\xb0\x2b\xad\x0b\x36\x32\x0d\x9b\x62\x8b\x11\x4c\x6d\xdb\xc6\x6c\x2f\x43\xfc\x64\x1f\x43\xbc\x27\x7c\x4a\x5d\xea\x09\xc7\x72\xfd\x8c\xb3\x99\x61\xba\xc4\xa1\x56\x46\x97\x2e\x84\x08\x52\x46\x99\x99\x5d\xe4\x90\x81\x30\x34\x99\xc1\x08\xc5\x86\x6d\x31\x6c\x1a\x07\x1e\x59\x5d\xcf\x42\x2d\x47\x96\xb5\xef\x91\x65\xed\x79\x64\xd9\xff\x61\xd2\xcd\x2d\x8e\x4f\x70\x2c\xd8\x8f\x3a\x16\xba\x5e\xd6\x56\x24\x7b\x72\xb0\xe5\xd0\xb6\x7d\x86\x4d\x21\x28\x42\xae\x05\x1d\xcf\x40\xdc\xb7\x2c\x53\x20\xcf\x21\x9e\xc7\x38\x12\xc4\x84\x76\x46\xb2\xc4\xa0\x16\x81\xcc\x86\x06\x31\x0d\x88\x91\x49\xe0\x9a\xe5\x50\x92\xe0\x3a\xb5\x5e\x1d\x68\x9e\xf3\x85\xf0\x1d\xcf\xe0\xcc\x40\x96\xe1\x3a\xc4\x63\xd4\x15\x98\x43\xc1\x11\x31\x29\xe5\x18\x61\xcb\xf0\x2d\x2e\x2f\x4f\x10\x31\x84\x4c\x46\xa9\x61\x63\x68\x1f\x4a\xb7\xff\xbf\x11\xb7\x6d\x08\xff\x0b\x0b\xdd\xd1\xa1\x14\x6c\x3a\x82\xfa\xc4\xa5\xc8\x81\x0e\xf3\xa8\x8b\x6d\xc3\x83\x08\xba\xa6\x80\x8e\x81\x1c\x4a\xb0\x4d\xb9\x41\xad\x8c\xd8\x0d\x64\x43\x6c\x65\x5a\x0d\x33\x09\x22\x16\xb5\xfb\x5b\xb0\xd4\x20\xe6\x9f\x0f\xba\x40\x3b\xc4\x60\x04\x0b\x6c\x3a\x9e\x4f\x33\xd5\xc1\x24\x1e\xf4\x6d\xcb\x63\x02\x33\xca\x0d\xd7\xf1\xa9\x63\x4a\xeb\xb7\xc1\x48\x76\x79\xc6\x96\x41\x09\x81\x36\x82\xe6\x81\x37\x68\xba\x37\x2d\x77\x51\xfd\x86\x29\x6d\x3f\x5a\x36\xfe\x43\xb4\xdc\x82\xe8\xa7\x20\x61\xe3\x51\x96\xe1\x9d\x24\xec\x3f\xe6\xf2\x4b\x2d\xe6\xdb\xae\x85\x71\x26\x6d\x3d\x82\xb8\x45\x98\x0f\x05\xf3\x28\x72\x1c\x13\x53\x93\x7a\x14\x43\x2f\xd3\xce\x51\x76\x5c\x33\x64\xd9\x16\x33\x2c\x13\x63\x84\xcc\x92\x8c\x5b\xe6\x59\x27\xe2\xbb\x3a\x6c\x45\x9f\x3b\x91\xde\x89\x58\x09\x64\xdb\x49\x14\xe4\x97\x28\x47\x28\x5c\x29\x72\xc5\x54\x97\xb0\x92\xba\x2d\x4b\x78\xae\x2f\x3c\x66\xdb\xa6\xc1\x2c\xc7\xf4\x2d\x2e\x2c\x62\x30\x26\x1c\x5f\x38\x98\x50\x17\x13\xc3\xcf\x34\x0c\x6a\x18\xb6\x49\x20\x33\x30\xb2\x6c\x44\x99\x61\x1d\xfa\xdc\xb9\xbf\x86\x81\xf7\xd5\x30\xf0\x9e\x1a\x06\xfe\xd2\x1a\xc6\xc9\x9d\x70\xdf\xc9\x38\x3c\x25\xf0\xf3\x97\x7d\x59\xe2\xbc\xc2\xf8\x22\xc9\xfe\x5d\xee\xc3\xe8\xe2\x49\xde\xeb\x1f\xa5\x7e\xe0\xdd\xea\xc7\xac\x4e\x5d\xd3\x88\x7b\x8a\xc3\xa7\x3c\x74\x45\xac\x94\xd5\xfe\x2b\x12\x22\x26\xf2\x0d\x83\x30\xe2\xbb\xae\xeb\x21\xc1\xb1\x61\x78\xbe\xc7\x31\xf1\xb0\x85\x2c\x8e\x84\x83\x2d\x42\x4c\xf9\xb4\x8f\x10\x35\x2d\x66\x9a\x08\xd9\xd0\x34\x6c\xeb\xc0\xbb\xd5\xff\x40\x01\xa9\xfc\x78\x27\xc2\x62\xf7\x79\xa8\xf0\x79\xa0\x24\x22\xbe\xcf\x78\x70\x0d\xaf\x91\xaf\xa4\x0f\x73\xa1\x8c\xc2\x54\xc4\x21\x9f\x02\x69\x5a\x29\x7c\xb0\x6b\x74\xa3\x70\xcf\x8b\x45\x92\x28\x3c\x49\x22\x37\x90\x0e\x24\xef\x83\xf4\x4e\x49\xef\x78\xda\x18\xf3\x7d\x30\x9d\x66\xfc\x5f\x64\xff\x41\x10\xea\xca\xc8\x57\xf8\x34\x89\x94\x24\x77\x88\x2c\x88\x54\x3a\x12\x2a\xf7\x41\x9c\x2e\xf8\x54\x29\xfc\xe7\x80\x32\xe3\xef\x32\xf9\x13\x0b\xe5\x21\x5a\x28\x45\xad\xf8\x9a\x38\xa9\x81\x23\xa7\x97\xf7\x73\x09\x78\xcc\xc3\x89\xa8\x3c\x59\x5a\x4f\x65\x1e\x7a\x4a\x18\xa5\x59\x8f\x45\x52\x7f\x22\xfc\xdf\xb8\x8f\x1b\xd8\x6e\x7b\x3a\x92\xec\xf1\x7a\x91\xa4\xb9\x88\xcb\xcd\x02\xa3\x0b\x89\x8d\x20\x2c\x67\xa9\x19\xa7\x70\x3b\x81\x8d\xd1\x3a\x93\xe1\x06\x93\xf5\xdb\x9e\xa3\xfe\xbb\xce\x24\xa7\xce\x99\xb5\x6d\x68\xbe\x98\xf8\x50\x40\x9f\x73\x88\x84\x63\x1b\x2e\x31\x0d\x0f\x51\xe1\xd9\x04\x9b\x0e\x72\x6c\x07\xfa\xc8\xcf\x14\xaa\x4c\xef\xca\x64\x3f\x26\xc8\x60\x16\xb5\x6d\x6a\xda\x99\x32\x75\xb1\x1a\x79\xfd\xdc\xb9\xe8\x98\xbf\x30\xd0\x14\xaa\x1c\x74\x4c\xc8\x88\x0f\x85\xe3\xba\xb6\x10\xc8\xa3\x9e\x27\x6c\x2c\xb0\xc5\xb0\x61\x61\xcc\x31\xe3\x06\xcc\x54\x39\x66\x42\x44\x0d\xd3\xb2\x2d\x13\x1b\x14\x33\x46\xac\xb5\xd9\xdb\x0c\x3f\xaf\x3a\x60\x28\x88\x29\x27\xbd\xe2\x69\x86\x39\x56\xa6\xbc\x21\xdf\xc2\x86\x8f\x4d\xdb\x35\xa9\x70\x2c\x24\xb8\xe1\x43\x0a\x29\xa2\x0e\xf6\xb1\xef\x65\xa7\x31\xb4\x20\x82\x06\x36\x4c\x66\x20\x64\x42\xca\xd8\x1a\x24\xc5\xe8\x39\x57\x26\xc1\x24\x94\xac\x57\x2a\x01\x72\xce\x5f\xc0\xcd\x0d\x01\x6a\x15\x36\xae\xde\x82\xec\xdf\x32\xf5\xdb\x59\x94\x06\x7e\x90\x87\xe0\x66\xdf\x55\x1e\x07\xfc\x68\x2a\xee\xc5\x54\x05\x2a\x56\x6f\x81\x00\x37\x45\x5e\xbb\x38\x7a\x9f\x35\xa9\xb2\x9c\x4f\x8f\x10\x96\x7d\xdc\x69\x3c\x92\xe5\xf7\x55\xa0\xca\x0f\x99\xc8\x50\x81\x1a\x73\x2f\x88\x54\xd9\xfc\xb2\xf8\x53\xcd\xe1\x28\xde\x96\xce\xf8\x2c\x6b\xb7\x72\x1d\xce\x3a\x15\xbb\x2a\x1b\x13\x50\x24\x0b\xbe\x05\x37\x14\xe4\x99\x11\xf3\x19\x79\x92\xa8\x2b\xb0\x40\xed\xc7\x1a\x7c\xb4\x0e\x8d\x9b\x9d\x85\x4e\xf4\x21\xef\x76\xb2\xfa\x97\x0a\xd4\x30\x07\x64\xbe\x19\x80\xd6\x0a\x70\x5b\xbb\x5b\x70\x97\xa3\xe2\x3a\x4f\xff\x57\xd4\x55\xcf\xc7\x4f\xee\xb8\x84\x21\x08\xfd\xe8\xc8\x0d\x62\x57\xa6\xee\x4c\x82\xdf\xb2\xff\xe0\x0a\x8b\x17\x51\x12\x14\x68\x48\xa3\xf9\x51\x1c\x4c\xee\xd2\x1c\xdc\xab\xbc\xe9\x74\x22\x97\x2a\x73\xd9\x9d\xcf\x45\xb8\x81\x8c\x6c\xd5\x46\x17\x3a\x10\xae\xb5\x4a\x66\x59\xc3\xea\x9f\xd3\x89\xc4\x56\x5a\x91\x40\x70\x9f\x4d\xc8\x93\x44\xc4\x69\xf1\x37\x42\x0f\x9f\xb1\xb8\xab\x22\xaf\x6c\x0d\xdf\x1b\x51\x28\x9d\xe4\xb1\xde\x6a\x45\xa8\x79\x0e\x47\xd5\x99\xf2\xf0\x5d\x86\xb5\x20\x95\x93\xe7\xff\xce\xe9\xbc\xc8\x36\x5d\x43\x49\xe3\xe3\x8b\x28\x5b\x48\x99\xbd\x35\xa7\xb4\x5a\xb6\xc0\x02\xfc\x2a\x65\x62\x39\xa7\x7a\x0b\xa2\x92\xf8\x65\xea\xc6\x6e\xe2\x5e\x15\x8e\xc9\x88\x67\xca\x5d\x71\x17\x4d\x3d\x89\xbf\xca\xb6\xa1\xde\x82\xb0\x95\x0a\xa6\xc2\xdf\x8b\x08\xea\x60\xd4\xf0\x5b\xd5\x90\xe9\x84\xae\xde\xa2\x05\xb8\x95\x8f\x94\x7a\x0b\xdc\x3d\x56\xdc\x5a\x13\x66\x63\xec\xab\xd5\x13\x9a\x7a\x0b\xae\xbb\x96\xd0\x59\xe8\x65\xcf\xa9\x57\xad\xd7\xa7\x97\x31\x16\x5d\xa2\x64\x3d\xc7\xee\x01\xcc\x59\x27\xae\x5b\x10\x83\x60\xef\x1d\xbd\x95\x41\x06\x49\x11\x60\xb0\x1b\xc9\x2d\x95\x1b\x77\xa0\xf8\xac\x0b\xc5\x1d\xf5\x18\xf7\x9a\x76\x07\x7a\x87\x45\x98\xc4\x64\xab\x08\xa8\x57\x25\xd8\xca\x43\x55\xa3\x5b\x70\x2c\xc3\x2e\xba\x46\xdd\xa4\x83\x3d\xc9\x45\x6e\xf6\x56\xd2\x3b\x80\xee\x54\x80\x80\x7a\x17\x78\x5e\x87\xa0\x46\x58\xa9\x4b\x63\x65\x4d\x16\xb7\xd1\xe1\x08\xfc\xdc\xb9\xe4\xe6\xce\xec\xb5\x7d\xea\x2d\xf0\xd7\x8e\x08\xa3\x38\x32\x2a\xa8\x67\x7b\xd0\x62\x95\xf2\x75\x83\x0c\xd4\xdb\x3c\x1e\xe6\x76\x09\xca\x1b\xda\x2a\xce\xa6\x2d\x23\x70\x36\xb8\x0a\x60\x2d\x2f\x34\x9f\xcf\x65\x28\xcf\x51\xf6\xd3\x51\x58\xd7\x57\x56\xe9\x99\x31\x50\xef\xa8\x9a\xe7\x93\xbe\x3a\xbd\xef\x11\x40\x9a\x99\xcd\x69\x33\x51\x7b\x59\xf0\xac\x4a\x19\x5c\xe4\x54\x97\x5a\x4b\x2d\x65\x30\x30\x6a\x29\xf6\x57\x0d\xde\xc7\x7c\x5e\xa6\x2d\x5f\xaf\xa4\x5b\x25\x11\xb6\xeb\x89\xdd\x65\x91\x04\x08\xd4\x95\x01\x55\x14\xd4\x2c\xed\xdb\x6a\x5b\x5a\xf3\xb2\x6e\x6e\x7b\x9e\x64\x39\x22\x06\xaa\xbc\x6c\x24\xd5\xb0\x79\x36\x76\xf9\x0c\x2e\xb2\x5b\x9b\x34\xb8\xdc\xe5\x56\xf4\xaf\xd4\x8d\xe1\xc9\xb6\x45\x21\xba\xb9\xaa\xf5\xda\x32\x12\x08\x03\xa8\x79\x04\xbf\xc2\x57\xd1\x04\x51\x61\x22\x6e\x5d\xd9\xb6\x92\x74\xc8\x04\x1f\x04\x60\x36\xa8\xca\x7a\xae\x0a\xd1\x58\xe0\x9d\x00\x98\x81\xb2\xba\xa2\xad\xad\x4a\xd4\xfc\x5b\x64\x3d\x68\xfd\x97\xb2\xf4\x4c\xa3\x60\x6b\x95\xa3\xbf\xaa\xa3\x88\xcb\x9c\xf4\x85\x5a\xd8\x96\x32\x9a\x34\x9a\x34\x91\x85\x57\xc8\x42\x2b\xca\xdc\xa8\xc4\x83\x0d\x80\xaa\x22\x11\xb8\xa3\x12\x0f\xb6\xda\x33\x4d\x63\x1b\x88\xf4\xd1\x19\xfe\x77\xfd\x57\x56\x23\x58\x43\x57\x51\xa8\x73\x9a\x02\x84\x2a\xd4\x22\xd6\x9e\x2d\x5a\x32\x72\x9e\xa4\xbe\xba\x6b\x80\x74\x95\xaf\x6a\x33\x29\xf3\xe6\x1d\x04\xa4\xfa\xc6\x47\xad\x5e\xdc\x26\xb1\x4f\xaa\x0a\x22\xa9\xbe\x19\xa0\x58\x36\x36\xb6\x35\x5e\x55\xf1\x6b\xab\x46\x98\xb6\xa7\xf2\x18\x0c\xba\x87\x40\x8f\x19\xa2\x09\xf2\xd3\x0c\x02\xcb\xdc\xdc\x69\x57\x6e\xee\xfa\xbd\xa5\xcc\xd2\x8d\x8d\xcd\x34\xdd\x25\x14\xad\xe9\x37\xb4\x25\xf0\x82\x58\xb8\xd9\xe5\x20\xe9\xdf\x2c\xf4\xf1\x4f\x60\xa1\x7f\xf7\x0a\x2c\xf4\x64\x02\x7e\xd6\xaf\xc0\x58\x3f\x3d\xfe\x15\x8c\xf5\xa1\xf8\x01\x2c\xf4\x31\x58\xe8\x2f\xfe\x0d\xc6\x3a\x4f\xce\xb2\x86\xdf\x81\x85\xbe\x00\x0b\xfd\x07\x13\x8c\xf5\xd7\x93\xef\xc1\x58\x7f\xfb\xeb\x31\x18\xe9\xe7\x0c\x8c\xf5\x9f\xc6\x14\x8c\xf5\x8b\xe1\x1d\x58\xe8\x3f\x4e\xc1\x58\xff\xfe\xfb\x13\x30\xd6\xbf\x9b\x65\x23\xfc\x7a\xff\x0a\x8c\x75\xe7\xf5\x3d\x18\xeb\xe1\xaf\x3f\x81\xb1\xee\x5d\xdf\x83\x3b\xfd\xdf\x60\xa1\x0f\xbf\x03\x63\x3d\x4a\x7f\x04\x0b\xfd\xa7\x6c\x9e\xef\x63\x30\xca\x00\x1a\xeb\x27\xaf\x8d\xac\xef\x3b\x1b\x8c\xf5\x97\x2c\x9b\xe4\xc3\xe5\x05\x38\x17\xfa\x3b\x30\xd6\x7f\x3b\x7d\x71\x0b\x92\xf4\x61\x9a\xad\x45\xd5\x25\x6f\x89\x0f\x29\x8f\x05\xbf\x19\x87\x93\x82\xbf\x8e\xfe\x7e\x72\xfe\xfa\xe2\xef\xb7\x1f\xdf\x07\x5e\x7a\xd7\x67\x10\xce\x3f\x3c\xbf\x13\x99\x26\xd8\x47\x18\xce\x3f\x2c\xd5\xdb\xa5\x06\xc4\x52\xeb\x69\xcf\xef\x79\xac\xb8\xe9\x20\xee\xd9\xd4\x86\x4c\x03\x49\xf6\xb7\x89\x10\x23\x1a\xb8\xce\xfe\xc6\x18\x67\xec\xba\x90\xdf\x31\xc4\x58\x7b\x5e\xe5\xb9\x1f\xb7\x57\x67\xa0\x7b\x54\x24\xb0\x0e\xa9\xce\x30\xdf\xcc\xa7\xff\x10\x7e\xe8\xc1\xda\x2c\x55\xad\x1f\xbb\x94\xf7\x6b\x65\x3e\xbe\xf9\xe1\xdd\x8e\x9a\x3f\xeb\xa4\xbd\xa3\xf8\x8f\xd2\x55\xfd\x67\xd8\x8a\x11\xcc\x9e\x1a\x23\x67\xff\x63\x30\xe2\x75\x15\xae\xc0\xf6\xd3\x20\x65\x5b\x05\x00\x5c\x2b\xc1\x91\x4b\x04\x99\x0b\xa0\xc8\x88\x5f\x08\xed\x8d\x5a\x1b\xe7\x9d\xe5\x1b\xb6\x95\x82\xa0\x7b\x16\x72\x41\x1b\x30\x5d\x3f\xcc\x45\x19\xbc\x1f\xc5\xd7\x41\x3a\x15\x27\x3c\x11\x25\x6c\xa8\x0e\xdb\xe5\xe3\x60\xeb\x2c\x7c\xf5\x94\xb0\x1d\x1f\x5e\x3f\x83\xe2\xb6\xfa\x19\x93\x56\x2e\xa2\xfb\x94\xc3\x3c\x88\x8b\x4e\xfe\xc7\x70\xd1\xd5\xf6\x8a\x22\xab\xfa\xe6\x8f\x28\x06\x46\x89\x76\x48\x3d\x91\xaa\x96\x8c\x01\x26\x5b\x95\x3c\x63\x9b\x92\xd7\x28\x06\x46\xa9\xb6\xbd\x18\xd8\x49\x9a\x17\xb7\x0e\x27\xf5\x4b\x0f\x46\x1b\x37\x85\x4e\x82\x93\x77\x00\x54\x5e\x6d\xf2\xb7\x9b\xfa\x53\x71\x10\x26\x29\x0f\x5d\x91\x3f\x25\xd5\x2c\xf7\xdd\x57\x83\xc7\x56\x1f\x59\x5d\x70\x47\xc5\xa4\x19\x9b\x69\x7b\x15\x0d\xcb\x60\xcd\x5a\x27\x75\xf2\x18\x75\x09\x59\xb2\x07\xcf\xd0\x3d\x2a\x25\x1d\x26\x64\xd7\x85\x46\x5d\xc6\xe6\x23\xfc\x9c\xae\x32\x6a\x88\x32\xa3\xc6\x47\xd5\xe5\xb1\x57\x50\xae\xf0\xd4\xbe\x58\x2e\x9f\x4f\x45\xaa\xf8\x5d\xe5\x4d\xae\x53\xfd\xdb\xf6\xfa\x26\xa2\xbb\xc0\xc9\x72\x22\xd2\xef\xc5\xc3\x8b\x38\x9a\xd5\x37\x60\x05\x87\x92\x73\x60\xd6\xae\xc8\x41\xb2\xbb\xed\x53\x17\xd1\x18\x9d\x5d\x5d\x1f\x9f\x9d\x0c\xc7\xd7\x3f\x5d\x0c\x9b\x95\x2e\xea\x34\xd3\x51\xe8\x62\xad\x49\x95\x23\xaa\x22\x9d\x81\xd0\x93\x28\x4e\x7b\x1a\xf8\xaa\x3b\xf5\xd7\xb3\x67\x55\xca\xa1\xaa\xe3\x7a\xaa\xa1\xf5\x22\x06\x49\xaa\xfb\x7a\x99\x98\xeb\xfc\x74\xb8\xbe\x08\x4d\x56\x03\x91\xe9\x67\xd6\x87\x5c\x65\x1a\xfa\x8f\x25\x5e\xc9\xe6\x3e\x4a\x44\x9a\x09\x81\x5d\x09\x58\x4c\x9a\x27\x60\xc1\xf8\xd0\x0c\x2c\xad\xd9\x55\x4a\x8f\x86\x62\xf6\xe4\xcf\xdf\xff\xc0\x36\x87\xb6\xe9\x21\xc3\x21\xcc\xe7\x1c\x43\x1b\x9a\xd8\xb5\x3c\x9f\x3b\xc2\x27\x0c\x9b\xd8\x35\x5c\xd3\x91\xb1\x15\x04\x22\x0b\x13\x66\x1a\x16\x63\x16\x41\x26\xde\x2b\x1c\xb7\xd8\x5a\xe5\xaa\x98\xb4\x99\x7f\xc5\x13\xf7\x62\x1a\xcd\x65\xfe\x84\xf5\xd7\xe6\x32\xff\x0b\x63\xbe\x47\x0d\x04\x7d\xcb\x16\xae\x0d\x99\x45\x39\xf5\xa0\x8b\x3c\x83\x73\xe8\xd9\xd0\xf4\x04\x16\x16\xc3\x7f\xfe\xfe\x87\x6d\x99\x36\x81\x36\x31\x4d\x66\x53\x4c\xa8\x6d\xf5\x95\xd3\xda\x04\x8d\xdc\x1e\xf5\xb9\xbd\x55\x02\xa3\x3f\x7f\xff\x83\x73\xcb\xb4\x91\xe9\x19\x8c\x70\x97\x62\x26\x2c\x1b\x7b\x0e\x33\x5c\x8f\x32\xec\x31\x83\xb9\x2e\x12\x4c\x46\x62\x9a\xb6\x69\x19\xd4\x34\x2d\x82\x18\xa1\xd8\x46\x36\xec\x2b\x57\x41\x38\x99\x36\x9d\xda\xf2\x40\xc2\x4b\xe1\x46\xb3\x99\x08\x3d\xe1\x49\x0b\x14\x57\xea\x60\x88\xf0\x3e\x88\xa3\x30\xfb\x5b\x6f\xa6\xfd\x98\xc7\x91\x97\x6b\x8e\x1d\x98\x72\x90\x89\x7d\x64\x09\xdf\xb5\x4c\x64\x71\xe4\x08\xe1\x18\x16\xe3\xc2\xe7\xc2\x73\x0d\xc3\x74\xa0\x6b\x09\x1b\xe6\x6e\xc7\x10\x42\xcb\x44\xd0\x36\x99\x69\x33\x26\xdf\x8e\xab\xf1\x1b\x99\x1f\x6a\x33\xaf\xe3\xc9\xb6\x1d\xdb\x86\x26\x44\xc8\xa2\x9e\x23\x84\xe5\x18\x90\x33\x8f\x41\x03\x79\x14\x7b\x86\x63\x43\xe1\x23\x4e\xfe\xfc\xfd\x0f\xc3\xb4\x09\xb6\x6c\x8b\x21\x8a\x09\x34\x11\x22\xac\xaf\x5c\xdf\xc5\xa2\x0d\x4d\x49\x1b\x9e\x6a\x50\x34\xd0\xb4\x96\x1e\x62\xfd\x2c\x2d\xbd\x5d\x04\xf4\x5c\x87\xba\x04\x19\xc4\xf7\x4d\x82\xa9\x6d\xb8\x0e\x77\x28\xb3\x10\x44\xa6\x2f\x2c\x62\x38\xcc\x96\x4f\xdb\x84\x11\x13\x31\x66\xd9\xd4\x30\x91\x45\x19\xa4\xf4\xff\xb9\x64\xd7\x1c\xa6\xa2\x48\x66\x2e\x97\xfb\xe6\x07\x93\x45\xcc\x2b\x73\x6a\xf1\xb5\xb1\x9b\xca\xdb\xd7\x89\xe2\x89\x79\x9e\x85\x5d\x89\xf2\xc7\x78\xf1\x61\x2e\x0f\x5b\x25\x5c\xcc\x9c\xdc\x91\x26\xd3\x4d\xa4\x27\x4c\x21\xaa\x64\x8a\xe1\xbc\x7a\xe3\x5f\xda\xeb\x7b\xba\x9b\xfe\xb0\x60\x02\x32\xcb\x82\xd8\x73\xb0\xeb\xf8\x2e\x36\x4c\x03\xba\x8e\x67\x71\x41\x1c\xd3\x21\x16\x84\x96\xf0\xb0\x94\xb4\x86\x0d\x09\x31\x2d\x46\x19\x36\x0d\x82\xe1\x81\xee\xa8\xa4\x8b\xa8\x5a\xf2\x93\x74\xa5\x32\xd9\xc8\x4f\xd2\x95\x35\xa3\x99\xf8\x00\xfe\x3f\xfa\xeb\xa2\x3f\x0a\x1f\x43\x7f\xa4\x8b\xf3\x57\xf4\xc7\xdb\x8e\xf9\xb5\x88\x14\xc3\x13\x94\x5a\xb6\x9f\x89\x3a\xd3\xb5\x09\x22\xd4\x72\x5d\x87\x62\x4e\x1c\x87\x31\xc2\xb1\xe3\x31\x2a\x23\x52\x98\x6d\x19\x86\x8d\x11\x83\x04\x62\xcb\x20\x94\xfe\xbf\xd4\x02\x2b\xf2\xdb\x2f\x66\xf2\x2f\x1c\xc8\xef\x76\xd2\xca\x5a\xee\x18\x87\x0b\x47\x20\x61\x13\xc2\x99\xe9\xd8\x3e\x65\xc8\xf7\x6c\xdb\x84\x98\x13\x6e\x98\x1e\x74\x6d\xcf\xa1\xbe\xf4\x2f\x46\x26\x36\x18\x31\x90\x61\x19\x10\x9a\x26\xdc\x8b\x5e\x4e\xea\x53\xcf\xe4\x03\x5d\xca\xe3\xdc\xbb\x50\x84\x85\x6f\x24\x57\xa6\x22\xcd\x5a\x45\x71\xc1\xa6\x40\x36\x70\x79\xae\x03\xf1\x20\x54\xa2\x70\xfa\xa0\x4c\xa3\xf7\x22\x76\x79\x22\x8a\x0e\x09\x28\xda\x27\x79\x87\xbb\x87\xf9\x9d\x08\x93\x4c\x59\x48\xf6\x42\x80\x61\x79\xb6\xc9\xb9\x99\x49\x5f\x8f\x39\x1c\xbb\x26\xe2\x16\x74\x3d\x4e\xa9\xc5\x7d\x6c\xba\x8c\xfb\x82\x99\x99\x68\x37\x4c\x1b\xd9\x84\x31\x4a\x6d\x1b\xdb\x98\x18\x7b\xa5\x00\xdc\x44\x40\xee\xa9\x26\x4b\x17\x28\xef\xab\x74\xc0\x8a\xd4\x77\x3c\x09\xfb\x75\x27\xec\x0d\x3f\x42\xcf\x37\x4d\x68\x40\x9b\x31\xc7\xb1\x5d\xd3\xa6\x1e\xf6\x0c\xcb\x77\xb0\x6b\x72\x93\x3a\x36\xf5\x85\x67\x21\x47\xaa\x3b\xc8\x36\x2d\x8b\x59\x18\x21\x13\x9b\x98\x51\x64\x34\x80\x5b\xf7\x24\x6c\xc9\x04\xd1\x6a\xca\x28\x45\x0f\x62\xd8\xb2\x2c\x68\x18\xa6\xeb\xf8\xa6\xe5\x78\xd0\x12\x38\x53\x97\x5d\xea\x09\x21\x28\x31\xb9\x25\x2c\x22\xb3\xd2\x59\xd4\x30\x28\xb3\x0c\xcb\x26\x90\x62\x46\x0d\xeb\xff\x7a\x3f\xe3\x83\x02\x31\x3a\x6d\x46\x7f\xe1\x68\x8c\x71\x1b\xcd\x8a\x90\x3b\x53\xa1\xcc\xb8\x7b\x17\x84\x42\xb9\x13\x7c\x9a\xde\x29\xf2\xe1\x38\x23\x19\x93\x53\x21\x3c\x87\x23\x42\x5c\x17\x43\x6c\x41\x61\xd9\xae\xef\x31\xe8\x60\xe1\x32\xdb\xb2\xa1\xe3\xd9\xd9\x69\x65\x11\x06\xed\x4c\x8b\xa7\xd4\x22\x0c\x63\x4a\x0e\x54\x96\x8c\xfd\x69\xc6\xd8\x97\x68\x8c\x7d\xa9\xe6\x4b\x93\xcd\x30\x47\xf3\xeb\x02\xcd\xdf\xe6\x68\x96\x9e\x9d\x52\xb7\x29\x3d\xc3\x25\x41\x15\x9b\x30\x8b\xc2\x20\x8d\xe2\x9a\xa6\xb4\xd2\x86\xee\x78\x2a\x3d\xca\xf3\xa4\x87\xa5\xff\xfa\xbe\x39\xdf\x9e\x32\xe5\xa1\xf1\x28\x6a\x35\x76\x93\xeb\xa6\x27\xf0\x61\x1e\xbf\xd3\xc9\x9a\xd7\x68\xe1\x00\x1c\x47\xd2\xeb\x32\x8c\x42\x21\x7d\x9e\x5c\x1e\x7b\xb2\x55\xe0\xbe\xcb\xb6\x48\x3a\xf2\x86\x93\x93\xca\xff\x29\x90\xce\x84\x37\x45\xd3\xa3\xd2\xbb\xf0\xa6\xf2\x25\x75\xa3\xd9\x7c\x91\xbb\xdf\x16\x8e\xa4\x26\xae\x86\xce\xed\xe5\xb5\xfe\xb9\xdb\xa7\xf4\x5e\xad\x3e\x89\x0f\xa9\x74\xc1\xab\xbe\xf8\x51\x94\xfb\xe9\x36\xd6\xc3\x9a\xeb\x09\xbf\x9c\x0f\xec\xa3\x1c\x7c\xd7\xc1\x35\x37\xd0\x8f\x32\xcc\x7b\xe2\x28\x93\x94\x35\x13\x7e\xb7\xdb\xad\x27\xee\xeb\x66\x4c\x15\x94\x1b\xe8\x46\x33\x27\xca\x9d\xa2\xd7\xdc\x6b\xeb\x36\x9c\x35\xc1\xdc\xea\x0e\xb6\x31\xfc\x1a\x80\xc5\xbb\xc4\xfe\x2e\xbc\xed\x3e\xba\x15\xc6\x65\x41\xc8\xdc\x71\xb0\x9b\x52\x22\x10\x80\x69\x27\x3e\xe6\x71\xe4\x1d\x86\x90\x9a\xb1\x66\x37\x3e\x36\x87\xef\x40\xc8\x61\xae\xda\x9d\x5e\xc9\x7c\x1f\x1f\xdd\xd5\x9b\xad\x0a\xd4\x19\xff\x90\x9b\x9f\x55\xa0\x52\x2c\xb9\xb5\xee\xc7\xd7\xe1\x12\x7d\xa0\x33\x63\xe1\x7d\x3d\xfe\x0c\x27\xe7\xfd\x3d\xf9\x8b\xa3\x37\x3f\x12\xf2\x13\x21\x3f\x2d\xbc\xda\xe6\xae\x3a\xae\x6d\xee\xb6\x63\xa5\x15\x99\x5b\x26\x6b\x89\x47\x20\xe5\x3b\x61\x5d\x10\xe7\x7f\x9f\xe5\x9e\xba\x8f\x74\x37\x2e\xed\xe3\xbb\x3d\x44\x1b\xc4\xbe\xcd\x4f\xf4\x30\xbe\xe8\xd4\xe0\x3a\x56\xd5\xea\x09\xfd\x18\x67\xd1\xe2\x15\xee\x8e\x16\x4e\xa1\x57\xa7\xf7\x3d\x0c\xf0\x86\x73\x5b\xf1\xaa\x5b\x7f\x97\xdd\xf0\x0a\xe5\x85\x4f\xe8\x99\xf7\x5d\xaf\x38\xab\x40\xed\x69\xa2\xaa\x17\x95\x09\x98\x93\xec\xe7\x53\x71\xdf\xd3\x96\xda\xca\x8d\x54\x0e\x69\x94\x6f\x7f\x66\xfd\x91\xb7\x7a\x4e\xb6\x80\x3a\x2f\x3c\x1b\x33\x60\xed\xdc\x61\xb1\xf9\xe0\x3a\x2f\x9d\x14\xe5\xa3\x3e\x2a\x1c\x0b\x5b\xfd\x44\x71\xe9\x9d\x57\x39\x17\xa2\x8d\xe5\xa2\xca\x85\x6f\xf5\x69\xc3\x41\x11\x19\x85\x1b\xa1\xfc\xb9\xc3\x41\x11\x59\xed\x4f\xd7\xc8\x06\xe3\xc7\xbf\x5d\xd7\x17\x54\xf9\x6d\xa2\x0a\x67\xb8\xeb\x0d\x1e\x20\x4b\xab\x79\x72\x96\x6f\xdf\xc8\xae\xde\x5f\x49\xdb\xe3\x37\xa6\x60\xbe\xc7\xeb\xf7\xa1\xff\x2d\xfd\x3e\x1b\x5e\xa7\xc6\x23\x48\xeb\x22\x8e\xbc\x1a\x6d\x61\xb3\x49\x5c\xeb\x8e\xa2\x78\xe5\x58\x6a\xaf\xd3\x17\x81\x00\x6f\xf8\x44\x13\xd4\xa0\x30\x82\x01\xa6\x5d\x4b\x22\x64\x83\xc2\x08\x6d\x52\x18\x61\x1b\x14\x46\x8c\x0d\xcf\x08\x13\xe0\xca\xed\x9a\x58\xed\x14\x46\xec\x76\x0a\xa3\x10\x0c\x9f\x86\xc2\x28\xda\xa0\x30\x8a\x77\x53\x18\x25\x2b\x0a\xc3\xd5\x46\x50\xda\x46\x61\x94\x81\xb3\x2f\x40\x61\x6b\xab\x30\x36\x84\x9a\xb9\xe1\xbc\x42\x4b\x32\xc9\x94\x82\x16\xe7\x15\x5a\xf9\xaa\x03\x6c\x95\xdb\xc4\x20\xc0\x95\x1b\x35\x43\x1d\x2e\x2c\xb8\x7d\x9b\x18\x01\x5e\xb6\xf2\x2e\xdf\x88\xed\xdb\x24\x47\x5e\xf9\x53\x93\x2a\x22\x80\xb1\x75\x2f\x94\x3b\x31\x2d\x7d\xb0\xe5\xac\x06\x38\x4f\x01\x06\xad\x4e\xf3\x80\xa0\xaa\x9d\x09\x2e\xf7\x6a\x67\x81\xe3\xac\x5d\xab\xef\x4b\xd1\xae\xcd\x87\x9d\xd9\xe0\x2a\x05\x08\x83\x52\x2a\x93\x8a\x67\x8c\x4d\xd7\x22\x03\xed\xf4\x3e\x37\x70\xcb\x06\x19\x04\x90\x6a\xd7\x8d\x0e\x1f\x23\xa3\xcb\xc9\xc8\x00\xa3\x6d\x1b\x44\xb6\xba\x92\xcb\x19\xcd\x1d\x1e\xf1\xc6\x2a\x28\x82\xac\xc2\x2c\x36\xc2\x22\x4c\x58\x2a\x5d\x07\xc5\x0a\x48\x47\x27\xd4\x24\x7e\xb3\xc2\xf8\xea\x00\x26\x79\x18\x09\x5f\x78\x41\x7a\x34\x8d\x26\x13\x79\x5f\x20\x66\xe7\xe8\x07\xb9\xb3\x57\x5e\x3a\xe9\x9e\xae\x7d\x58\x6b\x71\x43\x2a\x2e\xc7\x13\xfd\xed\xf7\xbf\x66\xa7\xeb\xcf\x29\x48\xf5\x20\x29\x4c\x95\x17\x53\x1e\x9e\x8a\x7b\xad\xec\x99\x1f\xd0\xed\x5e\xde\x8d\xfb\x57\x39\x2b\xaa\x3c\xbc\x99\xb6\xe1\xfd\x94\xd6\xbc\x9f\x5a\xfc\xc0\xd7\x80\xc3\xb0\x05\xb8\xec\xa0\xda\x0b\xba\xe6\x6d\xa8\x04\x2f\xdf\x8d\xfd\xc1\xb3\xba\xa7\xa8\x5d\x6e\xca\xd1\x19\xd4\xea\x2e\x81\x32\x2e\x60\x3d\x54\x29\x7d\x37\x51\xa5\x6b\xbd\xf0\xa4\x86\xfa\x75\x21\xcd\xf9\x54\xed\xab\xea\x26\x52\x6a\xd7\x21\x90\x96\xee\x50\x51\x3c\x0c\x17\x33\xfd\xed\xf1\xab\xd1\xe9\xf8\xe4\xd5\x9b\xab\xeb\xe1\x65\x51\xeb\xbd\xe9\xaf\xb8\xad\xff\x8f\xdf\x8e\xae\x87\x57\x17\xc7\x27\x07\xf6\xbb\x1c\xfe\xf0\x66\x74\x39\x3c\xdd\xec\x95\xbb\xf2\x7f\x95\xb6\x3b\x24\x69\xf5\x00\x8b\x76\x9c\x76\xdf\x71\x4a\x14\x1b\x64\x6d\x18\x39\x6d\x21\xb1\x36\x87\xcb\x2d\xa4\xc7\x19\x43\xbe\xca\xf9\x51\xeb\x64\xb3\xde\xea\x6e\x54\x7c\x97\x3b\xbb\x3d\x00\x61\xa4\xcf\xde\x55\xa1\x02\x79\x78\xc1\x77\xb3\x7f\xcb\x20\x81\x7a\xd0\xc0\x5a\xc0\x40\x15\x93\xd0\x88\x1c\x78\xc9\x58\x19\xbc\xf0\xe1\xf2\x02\x2c\xf4\xf0\x74\x2d\x9e\x60\x5b\xcc\xc2\x22\x95\x91\x10\xbf\x9d\xbe\xc8\x03\x1c\xd6\xa2\x0c\x4a\x0b\x45\x5b\x88\xc1\xbc\xb8\x29\xf5\x63\x31\xe5\xd9\x1a\x9f\x67\x97\xa5\x3e\x25\x7f\x5f\xea\x2b\xa3\x57\x5b\xcf\x54\x7c\x48\x8f\xf8\x34\x98\x84\x7d\x57\x46\x80\x15\x1d\x4a\xff\xbf\xb6\x3e\x99\xf4\x4e\xee\xb8\x17\xbd\xef\x43\x45\x47\x2c\x16\x33\x05\x2a\x50\xb9\xe7\x71\xef\xe8\x48\x0a\xf9\x6c\x88\xca\xa2\x77\xb4\xea\x90\xdd\x6c\xa3\x58\x7b\xee\x44\xb1\x27\xe2\x23\xb9\xbc\x7e\x12\x4d\x03\xef\x79\x1a\xf3\x30\xc9\x36\xac\x2f\xff\xca\x6e\x74\x3f\xf5\x8e\x74\x14\x8b\x99\x96\xff\x98\x2f\x31\xef\xaa\xe8\x38\x51\x04\x4f\x04\xa8\xfa\x55\x9f\xca\xd1\xe5\x5c\xfd\xff\x85\x4c\xdb\xf1\xc8\xfa\xc7\x2d\xa0\xae\x5a\x01\xa5\xe8\xab\x15\x48\xc9\xad\x82\x2d\x28\x51\x14\x45\x2f\x6c\xa0\x6d\x08\x93\xf8\x3d\x0a\x52\x31\x4b\xfa\x0e\x4f\xc4\x34\x08\xc5\x52\xbf\xe3\x47\xe5\xd5\xb5\xad\x93\x97\x7b\x3d\xf6\x03\x99\x2d\x21\x37\x7b\x2e\xf5\x58\xf8\xb1\x48\xee\x8e\x9c\xb4\x95\x10\xdc\x45\x9c\x44\x71\x7f\x1e\x05\xd9\x5e\x3e\x9f\xf1\x78\x12\x84\xf2\xe6\xdc\x47\x70\xfe\xe1\xf9\x63\x06\xcd\x16\x57\xb6\x90\x3c\xda\x4a\x81\xdc\xf3\x82\x70\xd2\x67\xf3\x0f\xcf\x37\xa9\x31\x8d\xe6\x7d\x3c\xff\xb0\xd4\x5b\x6c\x8f\x6d\xa3\xcd\xf8\x87\xa3\x32\x6c\xe6\xef\xf5\x5e\x39\x59\xee\x8b\xae\xe7\xab\x71\xb0\x8c\xb8\xc9\x3a\xde\x45\x49\x7d\x69\x8a\x52\x53\x68\x94\x16\xe5\xa6\x06\x0c\x81\xd9\x20\xe5\x4e\xcb\x80\xab\x63\xef\x3e\x3b\x9c\x5a\xf9\xa4\x04\x29\x8c\xb2\xed\x76\x17\x71\x9c\xfd\x9a\x57\xeb\x69\x5f\xf5\x6a\xb7\xb0\x98\x3d\xf7\xa3\x30\x3d\x7a\x9f\x47\x0c\x61\x08\x9b\xf1\x42\x77\xe9\x20\xee\x31\xc3\xb2\x0d\x0d\xcc\xf2\x18\x21\x98\x69\x4e\x8e\x8c\x11\xa2\x36\xa4\x1a\xb8\xc8\xfe\x26\x8c\x65\xb7\xb0\x57\xb2\x8d\x2d\x88\x06\xee\xb3\x3f\x29\xc6\xd9\xbd\xeb\xa5\x6c\x62\x43\x93\x69\xe0\x4d\xf6\x37\x32\x29\xb1\x34\xf0\x36\x0f\x41\x22\xd9\x85\xef\xd7\x3c\x34\x89\x30\xa2\x81\x53\x39\x8c\x01\x99\xa9\x81\xbf\xe5\xc3\x13\xbb\x1e\x8e\xf4\x61\xcd\x0b\xba\xee\xae\x3c\x9c\xbf\x90\xee\xca\x4d\xef\xfe\x32\x10\x12\x17\x17\xc1\xfc\xc6\x2b\xab\x66\xd7\xae\xbc\x2b\xdf\xd3\x89\x7e\xf2\xed\xeb\x9e\x3c\x89\xa4\x07\xb4\x1e\x85\xa3\xd9\x3c\x8a\xd3\x17\xc1\x54\x5c\x15\x92\xab\x97\xe6\x57\xe1\x86\x49\xc7\x59\xa4\xa9\xd4\x6d\xe9\x96\xbb\x75\x39\x41\x55\xa6\x7f\xa2\xbf\x3e\x4e\x7a\xb8\xaa\xce\xd8\x9c\xf8\x1b\x39\xaa\xbc\x85\xf7\xb4\x67\xcf\x32\xe5\x4e\xfe\xb9\x2c\x2f\xcb\xb4\x11\x08\x29\x23\x16\x6a\xae\xe3\xbf\x1d\x8c\xb4\x72\x21\xf9\x35\x7e\xbb\x91\xa0\x81\x30\xac\xe9\xe2\x43\x06\xf6\x49\xdd\x6d\xa8\x06\x2d\x6e\xdc\xff\x9b\xd0\xbe\xd8\x1f\xda\x5a\x64\xb6\x74\x52\x8a\x67\x45\xec\x66\x3d\x44\x24\xfb\x55\x5e\x93\x9a\x31\xdb\x86\xd6\x30\xc6\xd5\x6e\xdf\xe5\x97\xea\xae\xcd\x6a\xbb\x6b\x1f\x8c\x14\x4d\xcf\x9f\xf2\x0a\x34\x64\x77\x0d\x63\xe3\x06\x51\x43\x3b\x7c\xc4\x0c\xb1\xb8\x0f\xc4\xfb\x75\xac\x7f\x85\x56\x78\xb7\x1a\x57\xfd\x3c\xe8\xe2\xb7\xc2\x82\xb1\x6e\x14\x68\xbd\x90\xe4\x1b\x15\xf8\xbd\x5d\xd1\x45\x52\xe3\x7a\x1f\xfc\x26\x1f\xdf\x84\x9e\xff\x75\xd6\x8c\x86\xe9\x8a\xbb\x15\xdd\x71\xb7\xab\x6b\x8a\x17\x24\x85\x11\x5d\xe8\xc5\xdf\xa7\x12\xc3\x39\xb3\x68\x9b\x61\x37\xf9\xcf\x32\xfa\x66\xfb\xe5\x08\xa8\x95\x5b\x86\xba\x39\xf1\x7a\x26\x04\xa0\xe6\x6e\x6b\xb3\x4c\xd4\x96\xcf\xae\x39\xf9\x1f\xf9\x71\x34\x2b\xc9\x52\xad\xe2\x22\x1e\x5a\xe3\x22\xee\x02\x4f\xf4\xc5\x72\x09\x5e\xa7\x83\x9b\x8f\x73\x9e\xde\xf5\x55\x15\xb8\xd1\x6c\x1e\x85\x22\x4c\xfb\xed\xc1\x11\xb3\x54\xff\x79\x3d\x38\xa2\xee\xa8\x5e\x05\x4a\x80\x29\x08\x41\x54\x84\x4b\x04\x52\xa4\x94\xa1\x12\x69\xfe\x31\x87\xb8\xfc\x18\xe7\x1f\xf9\x3c\x38\x99\x06\x22\x4c\x07\xc1\x32\xaf\xcb\x9a\x49\xc0\x5c\x24\x09\x6f\x78\x2f\x6b\x61\x97\xd4\xb8\x8a\x6d\x38\x39\x3f\x7b\x31\x7a\x39\x7e\x31\x7a\x35\x1c\x8f\x5e\x5f\x9c\x5f\x5e\x0f\x4f\x37\xfa\xcb\x6b\xc3\x01\x43\x8c\x87\x97\x97\xe7\x97\xc5\x30\x3f\x56\xf4\x54\x75\x56\x65\x24\x71\xfe\x83\xba\x5c\x55\x91\x2d\x2a\xd6\xe6\x8d\x6e\xe4\xb2\x64\xcb\x8b\xfc\x41\x3e\x7e\x11\xc5\x33\xb0\xfa\x2c\x23\x9c\xd7\x3f\xc9\x14\x15\xb9\x53\xfd\xea\x97\xd7\x22\xe5\x1e\x4f\x79\xb3\x6d\x9e\x17\x6e\xf5\x75\xe4\x89\x30\x0d\xd2\x87\x46\xbb\xf3\x64\x34\xe3\x13\xb1\xfa\x7a\x22\x82\x79\xf6\xaf\xdb\x65\x38\x39\x0f\x47\x61\x90\xa1\x45\xee\x9e\xbe\xfa\x90\x37\x95\xca\x76\x59\xa2\x5c\x56\xe9\x4e\xa7\x45\xbc\x85\xfc\xe9\x1f\x6a\x95\xec\xa0\x28\x08\x3e\x09\xe4\x1d\xab\x8a\x59\x29\x0b\x1d\xb7\x84\xb3\x2c\xf3\x00\xeb\x93\x58\x48\xc0\xf9\xf4\x82\xc7\x7c\x96\x9c\x3b\xff\x16\x6e\xba\xbd\xe0\x70\xa2\x5f\x5c\x9e\xbf\x1d\x9d\x0e\x2f\xc1\x75\xf5\xe7\x58\xee\xe7\xc9\xab\xf3\x37\xa7\x1a\x48\x07\xe2\xeb\x3c\x96\xa6\xaf\xaa\xc5\x59\xf7\x31\x15\x21\x0f\xd3\x91\xd7\xdf\x7b\xc8\xeb\xe1\xd9\xf1\xd9\xb5\x06\x5c\x49\x9b\x87\xf4\x3c\x79\x35\x1a\xae\x7a\x5e\x09\x37\x16\xe9\xa1\xbd\xaf\x86\x27\x97\xc3\x6b\x0d\x14\xe8\x93\x17\xf3\x43\x60\xb8\x7a\xf3\xcd\xd5\xc9\xe5\xe8\xe2\x7a\x74\x7e\xa6\x01\x9e\xc7\xbf\x47\x0b\xaf\x9f\x2e\x97\x13\x91\x5e\xe4\x85\xb4\x6b\xa8\xfe\xb8\x7c\x2e\x74\xd9\xee\xd8\x75\xa3\x45\x98\xe6\x5b\x52\x54\x2a\xdf\xba\x5d\xe0\xe6\x46\x9d\x46\xa5\x58\x6d\x87\xe7\x72\xf8\x72\x74\x7e\x26\x9f\xb1\x93\xbb\x8b\x85\x33\x0d\xdc\xef\xc5\x43\x57\xeb\xab\xab\x6f\x2f\xde\x7c\xf3\x6a\x74\xf2\xfd\xf0\xa7\xdb\xdb\x7a\xcd\x6e\x71\x93\xde\xc0\xdb\xdb\x36\xca\x48\x6f\xd0\x2d\x48\x6f\xf0\xad\xa6\x65\xb2\xb7\x96\xa0\xe6\xc5\x94\xdf\x47\x71\xa3\x3e\x77\xcd\x94\xd3\x4b\xf4\xb3\xf3\xd3\xe1\xd5\xf0\xfa\x7a\x74\xf6\xb2\xd9\xbb\x78\x16\xcd\xa4\x78\x3b\x41\xd6\xfa\xe6\x6f\xdf\xea\x60\x30\x68\x83\xe0\x6b\x19\xd7\xb4\x16\xcb\x34\xbe\xb8\x3c\x3f\xed\xb7\x7c\x3f\x1d\xbe\xcd\x00\xc9\xdf\x17\xeb\x20\x04\xfa\xcf\x3a\x9f\x4b\x89\x53\xb2\x67\x90\xbc\x6e\x33\x72\xf4\xb4\xaf\x3b\x57\xd2\x4e\x49\xf5\x95\xec\x88\xc1\x02\xa2\xc5\x42\x52\x18\x48\x2a\x34\x7d\x13\x45\x53\xc1\xc3\xed\x73\xbc\x3e\x3e\xf9\x76\x74\x36\x1c\x7f\x3b\x3c\x7e\x75\xfd\xed\xf8\xe4\xdb\xe1\xc9\xf7\x57\xe3\xe1\xd9\xf1\xff\xc7\xdc\xb5\x2f\xb5\x8d\x2c\xfd\x57\x11\xaa\xfd\x52\x52\xed\x58\x25\xd9\xf2\x45\xa2\xf4\xe5\x10\x70\x58\xf6\x10\x60\x31\x90\xda\xa2\x5c\x44\xb6\x46\xa0\x83\x6d\x39\xd2\xe0\x40\x1c\xbd\x43\xde\x20\xef\x96\x27\x39\x35\x37\x79\x24\x8d\x7c\x61\xcf\x9e\x3a\xc5\x3f\xd8\x9a\x4b\xab\x3d\x33\xdd\x3d\xdd\xfd\xeb\x77\xa7\xfd\xa3\x95\xf6\xba\xf5\xd2\xe7\xd5\xff\x49\xf1\xff\x73\xba\x03\x3c\xcf\x9b\xe5\xd5\xbb\xdf\xd6\x35\xe6\x0d\xdc\xba\x06\xb4\xac\xf7\x3e\x34\x12\x11\x9d\x6d\x03\x69\x48\x07\x85\x94\xf1\xbc\xf9\x87\x43\x2a\x5b\x00\x34\x2a\x88\x6f\xf2\x31\x6f\xce\xfa\x57\x80\x95\x5c\xe7\x84\xdd\x11\xca\x38\x9f\x92\xcd\x1d\xf3\x0a\xf1\xe7\x97\xac\x6e\xbb\x4e\x72\x23\x63\xef\xf6\x36\x07\x9e\xc2\x3b\x53\xec\x24\x54\x89\xc7\x9b\x78\x91\x03\x3e\x49\x9b\x1d\x9e\x1c\x5d\x12\xff\xb7\x04\x95\xaa\xd4\xe1\xfc\xec\xea\xf2\xfc\xf4\xe2\xf4\xe0\xac\x7f\x77\xd6\xff\x38\xb8\x7e\x87\xbf\xe6\xf3\xd4\xc1\x4c\x6d\x35\x08\xa7\xa2\x0a\x14\x55\xec\xce\x17\x79\x65\x76\x19\xf6\xd7\xc6\xce\x64\xd6\x21\xb7\xb1\x12\xcf\xf3\x56\x75\xe3\xdf\xbc\xd1\xd6\x72\xb9\x50\xbc\xff\xef\xe3\xf3\x5f\x67\xf2\xeb\x38\x2c\xce\x3b\xd4\x41\xfc\xaa\x83\xbd\x7a\x91\xba\xdb\x71\x43\x0f\x96\xbb\x83\xeb\xa3\x93\xab\xbb\xd3\xf3\xe3\x63\x72\xe4\x53\x9d\x75\x16\x71\xc9\xf8\x31\x42\x0f\x87\xf1\x74\x1a\xcf\x52\x6c\xfb\xe0\x33\xb6\x08\x07\xb3\x76\x52\xf1\xdd\x2f\x2e\x4f\x6e\x0e\xae\xfa\xfc\x72\x1c\x8f\x15\x26\xe4\xd2\x24\x60\x23\x9e\xcc\x3d\x55\x95\x4c\xf1\xe6\x8d\x26\x6b\xbb\x71\x83\xf3\x19\x4f\x2e\x30\xc3\xb2\x14\xa2\xf7\x49\x3c\xe5\x22\x1f\x12\x8b\x77\x11\x47\x81\x62\xee\x79\x5e\xf9\xa3\x44\x07\xd0\x97\x61\x9c\x68\xf4\x7c\x89\x95\x38\x54\xa8\xe0\x37\x1e\xe1\x4b\xaa\x49\x3b\xe8\xea\x4a\xe3\x50\xf7\x3c\x2f\x66\x59\xbe\x29\x96\xbc\x84\xee\x01\x4a\xa2\xd9\xbd\x78\x4c\xc6\x40\x36\xd4\x6d\x3c\x5c\x89\x00\x59\x03\x63\x35\x13\x48\x3c\xf4\x76\x6c\x84\xd1\x2c\xd0\xa0\xf7\xff\x54\x07\xf4\x3c\x0f\xe9\x2e\x7d\xbf\xfd\x64\x0b\x3a\xa4\x5a\x25\x48\x28\x94\x42\x62\xb0\xfb\x30\x62\x65\x66\xbb\x0c\x26\xea\x34\x00\x1a\xa2\x1a\xc4\x55\xe5\xed\x06\xa2\xaa\x14\x80\x06\xd7\xb9\x78\xf7\x8d\x9a\x8d\x54\x2d\xaa\x9f\xfc\xef\xd2\x6b\xea\xf5\x2b\x1d\xec\xa2\xdd\x7c\xfb\xb6\x0d\xe5\xeb\xf5\x18\x99\x8a\x55\xe1\x08\xdb\xe2\x3b\x2b\x2f\xeb\x74\xa4\x5d\x7f\xf3\x8a\x16\x02\x4a\x5a\x08\x1f\xd0\x5f\x40\xa6\x58\xc0\xa2\x5f\x90\xc9\x9d\x12\xfc\xac\x54\x9b\xe0\xa2\x87\xca\xa8\x4d\x2a\xc0\xf6\x32\xe9\xaf\x09\xfd\xd7\x4a\xfb\xd7\x89\xf9\xf5\xf2\xbd\x56\x74\x49\x7e\x50\x72\x36\x13\x21\xc6\x5a\xea\x6b\x56\xd8\x1a\xd1\x21\x11\x11\x32\xc9\x54\x7f\xc6\xc9\x85\x84\x4c\x20\xed\xb2\x05\x64\x02\x55\x2a\xa7\xeb\x96\xfc\x08\x19\x17\x0b\xe3\x7c\x70\xf2\xe1\xe0\xb8\x0f\x1e\x90\x71\x65\xd0\x7f\xa1\x11\xa7\x0c\xdd\x26\x5f\xdb\x54\x28\x53\x78\xb8\xa2\x58\x23\x67\xc7\x53\x0a\x13\xf1\xf0\x78\x9a\x07\x3e\x62\x17\x36\x57\xd1\x14\xa6\xc8\x9f\xce\xe9\x35\x86\x70\x5d\x98\xb1\x0b\x89\x4b\xe2\xd6\xf0\x27\x8c\x93\x02\x38\x47\xf1\xa6\x8a\x19\xc4\xe4\x02\xa4\xda\x27\x13\x74\xfb\x42\xff\x8d\xe6\x56\xc1\x81\x9e\x89\x5b\x99\xc1\x6e\x6c\x73\xd6\x89\x83\x00\x4a\xcd\xe1\x24\xd2\xf2\xab\x54\xe4\xcd\xe0\x17\x65\x0e\x8d\x47\x90\x78\x4b\x9a\x74\x7b\xe1\xa3\x07\x17\x02\xe1\xc2\x32\x37\x10\x0f\x57\xdf\x69\x3a\x10\x4e\x14\xb7\x6a\xc7\x90\xfb\xc2\xc3\x49\x74\x38\x0d\x52\xf7\x76\x98\xed\xe7\xf1\x7d\x8c\x88\x84\x93\xd3\x9f\x2d\x6e\xfc\x24\xc2\x4b\x24\xe5\xe8\x17\x9e\xaa\xfe\x0f\x5a\x7b\xe0\x75\x26\x15\x88\xbd\x25\xbd\x65\x2c\x1e\xad\xee\xad\x68\x1a\x0e\x01\x6d\x23\x39\x83\x71\xc3\x7a\x7b\xaf\xd0\x11\xff\xd2\x79\xf3\xa2\xc5\xf1\x56\x66\x59\xb8\xb2\x13\x5d\x18\x0f\x1f\x71\xe5\xe9\x0b\xa7\x7b\x7e\x7d\x8a\x0f\xe2\xbb\x8a\x51\xb1\x81\x96\x3a\x5b\xc4\xdd\x46\x3c\xac\x99\x5a\x4a\xf6\x3a\x61\x41\xc7\x22\x4a\xc1\xf6\xd4\x57\x6d\x19\x77\xbd\x80\xa9\xce\x22\x23\x54\x2e\x67\x28\x6a\x51\xe4\xdd\xe6\x06\x65\xe4\x95\xc8\xba\x55\x65\xcb\x4c\x05\x6a\xed\xca\x2a\x3e\xc3\x44\xe6\xdf\xd4\xfe\xa4\x79\x8b\x32\xb7\xd4\xa1\xfb\x1f\xa5\x20\x5f\x80\x3b\xd0\x54\xbb\x1a\xea\xa9\x96\x3d\x60\x10\xde\x91\x28\xdb\x97\xfc\x5a\x25\xbe\x45\xc3\x7d\xf8\xab\xf7\xe9\x97\x25\xca\x3c\xf5\x97\xa5\xe4\x50\x48\x6e\xcd\x21\x48\x6e\xad\xa1\x9e\xa9\xca\x27\xe2\xe7\xf6\xe7\xf3\xc9\xcb\xd5\xe3\x3d\x75\x97\x69\x75\xf2\x84\x36\xfb\xe7\x31\x6d\xf6\x3e\x4e\x88\x68\xd1\x96\x73\x62\xe3\xe4\x27\x6d\x7e\x6d\x9b\xe9\x59\x02\x51\x12\xc1\x05\xec\x3f\x73\xa7\x71\xed\xe8\xd4\xed\xb2\xdb\xf0\x52\xdf\x6a\xe1\x62\x7e\xbf\xea\xd2\x61\x9f\x34\xe6\x11\xa8\x12\x08\x30\x4b\x21\x37\xa2\x88\x77\x86\xb8\xb8\xb1\x54\x50\x2a\x1e\x93\xfc\x85\x96\xe4\x36\x5f\x3c\x38\x23\x34\x81\xae\x7a\xe2\xfb\x03\x85\xf7\x50\x81\x00\x66\xe3\xaa\x37\x34\x50\x8c\x42\x4b\xd0\xca\x5c\x2c\x3d\x32\x51\xc6\xf9\x4d\x76\x4a\x70\x26\xae\xfc\xd9\xd7\x27\x15\x44\x56\x6f\xe6\x2e\xc5\xb1\x71\x0f\xdc\x21\x45\x70\x4e\x61\xe5\x8b\x93\x54\x1b\x09\x8f\xd5\x0c\x8c\x27\xfe\xd7\xaf\x6e\x0c\xb3\xd5\x0b\x72\xdf\x4f\xe5\xe5\xa8\x9a\x48\x27\x17\xca\x40\x72\xa4\xa5\xd2\xcc\x03\x5a\x37\xa8\x58\x4b\x53\xa1\x8b\xbe\xf0\x1e\xa4\x9c\x69\x1d\xfd\xab\x87\x32\xba\x7d\x24\xd0\x5d\x72\x50\x55\xc8\x17\xf5\x10\x3a\xf5\x18\x19\x33\xea\x2c\x3a\xf4\x53\xe6\x3b\x92\xa3\xba\xfd\xaa\x56\x80\xa5\x8a\x84\x7e\x1a\xac\xca\x24\x91\xb2\x46\xcc\x88\x49\x95\x91\x3f\x7e\xe4\xdf\xb2\x4d\x29\x9d\x23\xe3\xd9\xaa\x9f\x8a\xec\xa1\xa5\xdd\xe8\xa4\xb5\x6c\xaa\x36\x92\xb1\x2b\x14\xd9\x25\xf8\xde\xaa\x5a\xa0\xf8\xf0\x0e\x0a\xab\x5f\xf0\xec\xad\x7a\x11\x3e\x86\x71\x32\xfd\x18\xa1\x87\xf3\x05\x4c\x92\x28\x80\x29\xe5\xa7\xe8\x0a\x5c\x6e\xbb\x40\x32\x3d\x8b\xf2\x50\x13\xbe\x4f\x68\x30\x04\x9d\x72\x6f\x0f\x19\x0c\xb9\x20\xd5\xd8\x49\xa9\xea\xdf\xbe\x69\xfe\x04\x26\x48\x83\xbf\xaa\x4a\x94\x12\x7c\x03\x5e\xef\x29\xaf\xfa\x28\x22\xb8\x44\x13\xb8\xa7\xea\x60\xcf\x12\xe7\xbb\x64\xc7\x02\xbf\xa5\x20\x47\x50\xbd\xa6\x4d\x3b\xd6\x9f\x5d\x4b\x3c\x0b\x0b\x42\x4a\x5d\x98\x15\xde\xed\x22\x89\xc7\x30\x4d\x4b\x53\x01\x04\x12\xae\x4f\x17\xef\xc6\x92\xdc\x99\x99\x42\x74\x15\xbf\x8f\x92\x14\x0d\x10\x9c\x6b\x32\xa7\xb6\x31\x7f\x1a\x4d\xa2\xf4\x81\x7a\x9a\x07\x4f\x63\x3c\x15\xe1\x62\x26\x8d\xa8\x61\x4a\xee\x9e\xb9\x2f\xbe\x69\x94\x9e\xcf\x84\x79\xbe\x7d\xd3\xa0\xc7\x9c\xf9\x9a\x4a\x47\xc1\x8b\x8e\x94\x10\x8b\x17\x30\xf9\x92\x44\x08\x2a\xfe\xec\x45\x09\x7c\xe4\x93\xec\xed\x07\x7f\x01\x29\xf2\x3d\x0c\x0c\x85\xbc\x33\x2f\x46\x46\x09\x7e\xab\x92\x8b\x40\x69\x80\x91\x60\x16\x2c\xe1\x02\xce\xf8\x8b\xb8\xcc\x7b\x5b\xe3\x8f\x07\xa4\xed\x7b\x3f\x9a\x3c\x25\x50\xde\x56\xf4\xbd\x03\xfc\x2b\xb9\xd0\x40\x7e\x72\x0f\x91\x81\x3f\xa5\x58\x58\xe6\xd1\xbc\xae\xc0\x5f\x71\x55\x02\xbc\xbf\xe1\x2c\x28\x3f\x97\xae\x22\x01\xc0\x10\xc4\xb3\xc2\x8b\xac\x5f\x13\xc5\x8e\x85\xb7\x5a\xf3\x93\xb3\x76\xd9\xbe\xa4\x21\xfd\xa4\x11\xdf\x0f\x7b\x69\x92\xb5\xe8\xa9\xea\x1a\x84\xc7\x29\x4c\x53\x38\xbb\x87\xc9\xca\x6d\xae\xad\xc2\x15\xe8\xc5\xdf\xdd\xe1\x6f\x07\x67\xc7\xfd\x23\x00\x73\xed\x04\x79\xd0\x98\xd3\x25\xbc\x8f\xde\x6a\xb5\x58\x91\x88\x26\x70\x6b\xb7\x45\x84\xc8\xa2\x6e\x36\x58\x8b\x1f\x39\x04\x4b\x7e\xed\xe8\xa2\x8c\xda\xdc\xbb\xcc\x75\x3e\xb8\x23\xb6\xfd\x60\xa8\xeb\x6e\x3d\xa5\xe3\x09\xf4\x13\x6d\x2d\x99\x6b\xe6\x96\xf5\x2e\xbe\xc6\x8e\x9d\x73\xaa\x75\xaa\x79\x95\x43\x1d\x8a\x7a\x51\xed\xd0\xbc\xe3\xfa\x17\xc3\x3a\x12\x14\x4e\xc0\x7b\x88\xd8\x45\x83\x70\x71\x97\xe2\xa5\xa5\xe2\x15\x08\x03\x05\xc5\x0a\x57\xb6\x4a\xc5\x7d\xd3\x1c\x46\x6b\xee\x27\x28\x1a\x3f\x4d\xfc\x44\xa1\xc1\x9b\x86\xba\x86\x09\x35\x94\x96\xb1\x44\xe5\x84\x16\x11\x43\x6b\xe8\x64\x32\xe9\x83\x92\x46\x5f\x61\xfa\x0a\x5a\xf2\xdf\x04\x68\xba\x9c\x8e\xf3\x01\x91\xb2\xa9\x26\xa7\x60\x12\xa5\x88\x78\x33\x06\x4a\x44\xda\x29\x61\x12\x4f\x09\xb3\x68\x51\xc6\x08\x72\xb9\x36\x20\x95\x22\x5f\xc3\x31\xac\xd4\xd5\x32\x0a\xab\x82\xb5\x0c\xe2\xe4\x61\xb1\xbd\x0d\x69\xaf\xc5\x3c\x8d\x8d\xf7\x34\x79\xaf\xd5\xd1\x2e\x90\xf1\x27\xff\xff\x14\x19\x57\xfc\xff\x27\xe3\xf3\x13\xff\x7f\x81\x8c\xc9\x05\xff\x70\x8c\x8c\xa3\x67\xfe\xe1\xde\x18\xbc\xfb\xbc\x23\x7e\x2a\xf1\xde\x34\x58\x0c\x5f\x3d\x74\xaa\xc5\xa0\x53\x9d\xf5\xc8\xa9\x52\x9c\x54\x3a\x78\x8e\xaa\x19\x86\x61\xd3\x6c\xdb\xd6\x18\xf6\x9a\xbd\x71\x6b\xd4\xee\xc1\xb6\x63\x9b\x76\xd8\xed\xc1\xc0\x81\xf6\xc8\xef\x34\x03\x67\x64\xff\xfc\xfe\xc3\x6e\x76\x9d\x9e\xd9\xe9\x38\x96\xdd\xea\x99\x5d\xb3\xd7\x69\x6f\xa8\x63\x7e\x74\x72\xb3\xa9\x84\x39\x6e\xc2\x83\x04\xb7\x47\x95\xe2\xb5\x65\xca\x78\xab\x54\xce\x94\x14\x2f\x1a\xde\xf9\xf3\xfb\x0f\x33\x18\xf7\x6c\xd3\xb7\x4c\xc7\x0c\x5a\x9d\x51\xd0\x1e\x05\x0e\x0c\xad\x4e\xbb\x6d\x59\x8e\xed\x40\xbb\xed\x84\x61\xbb\x6d\xfd\xfc\xfe\xa3\xd9\x73\xda\x5d\xcb\xea\xd8\xb6\xd5\xb1\x9c\x96\x45\x50\x32\xa9\x9c\x53\x0a\x56\x60\x19\x75\x95\x2b\x33\xb1\xc2\x18\x4d\xea\xf0\x04\x11\x5a\x91\xe1\x37\xc3\x66\x68\x39\xe6\xd8\x1e\x39\xdd\x51\x37\x80\xb0\xd5\xb5\x1c\x3f\x1c\xdb\x41\x67\x64\x9a\x70\x64\x05\x76\xbb\xe9\xb0\x3a\x94\xdd\x66\xaf\xd7\xea\x98\x4d\xa7\xd9\x6c\x59\x0e\x26\xa3\x8f\x47\x2b\x13\x51\xc0\x52\xa5\x76\x67\x1d\x1b\x9c\x4e\xc7\x09\xc7\xa3\xb0\x6d\xfb\x66\x68\x8e\x61\xab\x13\x3a\xad\x9e\xd5\x0c\x60\xaf\xe3\x77\xdb\xb6\xed\x87\xcd\x51\xcb\x1e\xfd\xfc\xfe\xc3\x6a\xb5\x7b\x66\xbb\x65\xf6\x1c\xab\x6b\x76\xda\x8e\xed\x34\x5d\x85\x5a\xb0\x15\x0a\x08\xb4\x0c\x4f\x15\x1b\x16\x30\x64\x80\x3a\x1d\x35\x9a\xa6\xbc\x7a\x24\x07\xf2\xf0\x13\xda\x34\x88\x12\x15\xa8\x0c\x19\x80\x41\x7a\xb4\xcc\x15\xf6\x00\x8f\xd6\x55\x91\x8f\xf5\x14\xf8\xac\x02\xd5\x2c\x03\x11\x60\x3d\x49\x05\xea\x23\x7c\x19\xc5\x7e\x12\x9c\xe2\xc3\x68\xc6\xc0\x5a\x2c\xa0\x46\x69\x23\x9a\x85\x31\x6b\xd8\x98\x44\xb3\x47\x82\x7a\x91\x23\xd3\xa8\x51\x80\x87\x24\xdb\x91\x23\x92\x14\x80\x72\xac\x1c\x28\x67\x9a\xb2\x6d\x1b\x8d\xe3\x59\x83\x50\x1a\x87\x61\x0a\x51\x03\xc5\x73\x0a\xf9\x20\x2b\x29\xd7\x02\x3c\x56\x97\x72\x65\x84\xf0\x3b\x8d\xd0\xac\x31\x4f\xa2\xa9\x9f\xbc\x60\xae\x21\xcc\x35\x40\x02\xa5\x79\xe0\xad\x40\xa3\x08\x52\x33\x8f\x27\x11\xaa\xd4\xc9\xe4\x98\x24\xd1\x84\xa2\x8e\xe0\x7f\x1a\x3c\x23\x13\xf0\x78\x7c\xdc\x12\x3f\xb9\x9e\x63\x9d\x89\x15\xf1\x2c\x90\x14\x3f\x21\x56\xdf\x93\xee\xb0\x06\x79\x24\x30\x0c\xd5\x97\x14\x2d\xae\x03\x24\x5d\x07\x74\x96\x02\x76\x4d\x0d\x4b\x68\x40\x77\x3e\xbf\x8c\x2f\x35\x94\xe3\x4d\x58\xa1\x3b\x29\x35\xa7\x2b\x41\x65\xb1\xc4\xe5\xd6\xf1\xd6\xd0\x14\x24\x8c\x5d\x0c\xed\xa7\x71\xed\xfa\xaa\x56\x00\x4d\x01\x16\x62\xe1\x57\x39\xba\xad\xcd\x61\xe8\xc8\x98\xf9\x8b\xe8\x1e\x1b\xaa\xc8\x38\xb8\xb8\xb8\xbb\x3c\xbf\xbe\xea\x0f\x8c\xd3\x83\xb3\xa3\x93\xb3\xe3\x6a\x9a\x84\x0d\xd4\x87\x26\x43\x23\x20\xb9\xdd\x20\xc7\xa6\x2f\x00\x56\x94\xf3\x7c\xff\x3c\x1b\x6b\x5d\xf0\x8c\x40\x7b\xcb\x70\x75\x56\x69\x80\x94\x6d\x7b\xf0\x13\x18\x34\x02\x38\x81\x08\x36\xb0\x9e\xd0\x98\xc7\xf3\xa7\xb9\x90\x28\xe0\x08\x05\xde\x58\xf6\x70\x23\x85\x88\xb5\xe0\x28\x18\x7c\xcb\x6f\x91\x01\x80\xe4\x01\xf9\xe6\x2a\x03\xc0\xb2\x80\xaa\x5c\xf6\x6f\x4e\xfa\x1f\x15\x1a\xf2\x7c\x7d\x49\xc4\x8b\x52\x5f\x83\xad\x59\x28\x18\x46\x70\x2e\x5a\xe0\x3d\x02\x96\x09\xda\x65\xae\x58\x56\x5d\x1a\x71\x29\x8f\xb6\x0b\x5e\x10\xe0\xf4\xe6\xb9\xb3\x9d\x5d\xb3\x89\xdb\xd5\xf0\xfe\x2d\xa2\xe5\xe9\x3e\x56\xab\x7d\x79\x02\x01\x5a\x9b\x40\xb0\x6a\x95\x70\x9d\xaf\xda\x68\xb5\x39\xf7\x88\x96\x47\xfd\x8e\xc4\x96\x8d\xd0\x8b\xa6\xcb\xd2\xa0\x69\xc5\x29\xce\x93\x62\x8a\xa7\x90\xd3\x79\x8d\x8c\xdf\x68\xed\xa6\x1b\x64\x5c\x83\xcf\xc8\x38\xa3\x69\x98\x47\xc8\x18\x80\x5f\x90\xf1\x9b\x90\x68\x29\x4d\x11\xa3\x6b\x8a\x24\x7e\xf9\xe3\x71\x9c\x04\x51\x3c\x6b\x3c\x40\x3f\x80\x49\x83\x3e\x5b\x92\x64\x2d\x2c\x81\x5c\xcb\x9e\x3f\xef\xf3\x7c\x38\x67\xfe\xac\x58\xbd\xf9\xf3\x3e\x4b\x46\xb4\xbb\xf8\x4f\x9e\x88\xb6\x79\x16\xa5\xf4\x70\x1c\x4f\xe7\x64\xbf\xe0\xb3\x60\xc9\xa7\x18\x77\xbb\xad\x71\xc6\x8f\x08\x23\x97\x5a\x6b\x72\xce\x08\x62\x90\x4b\xe8\x2c\x66\x10\xca\x73\xf9\x48\x2e\x61\x38\x89\x7d\xe4\x62\xd9\x9b\x3d\x34\xd7\x8c\x8d\x3b\x98\xd9\x3f\xa6\x30\x88\x7c\x45\x5b\x65\xd3\x29\xed\x6e\x67\xfe\xac\x2f\x8d\xc2\x71\xbe\x65\x92\xea\xa6\x3e\x8a\xa2\x18\xab\xe3\x5f\xd2\x00\x28\x5b\x8d\xc1\x05\x41\x7d\x61\x2f\xcb\x34\xff\x2f\x13\x72\xf3\xb2\x21\x71\x3c\xfd\x51\x2a\x97\xb1\xdc\xd5\xc6\x58\xd9\x02\xd3\x38\xf0\xee\x8d\xf8\xe0\x1d\xb7\x05\xf0\x54\xec\x59\x34\xfb\x97\x77\x6f\x8c\x7f\x1f\x68\x4b\xba\x4b\xb1\x79\x10\x1b\xef\xbe\x1a\x61\x9c\x1c\x3e\x44\x93\x40\xfb\x80\xf4\x21\xc0\x5f\x15\xd3\x07\xbf\x90\x1c\x40\xdb\xee\x74\x74\xf0\x48\xf2\xfe\x9c\x76\xaf\xa9\x83\x8f\x34\xbf\xaf\xe9\xb4\x68\x6c\xeb\xef\xff\xf5\x17\xe1\xbe\x86\xd4\xbd\x1d\x18\x97\x43\xb0\x7a\xb1\x13\x03\x7e\x05\x7f\x20\xf0\x05\x19\x53\xf0\x88\x8c\x53\x9f\xe0\x58\x7f\x88\x83\xa7\x09\x04\x1f\x91\x31\x1a\xae\x7e\x87\x6c\xa8\xef\xff\x3b\x00\x00\xff\xff\x9b\xbd\x7c\x43\xde\x80\x01\x00") - -func bindataTkgWebDistTkgkickstartui39es201501e37d969093a24ceaf8JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui39es201501e37d969093a24ceaf8Js, - "tkg/web/dist/tkg-kickstart-ui/39-es2015.01e37d969093a24ceaf8.js", - ) -} - -func bindataTkgWebDistTkgkickstartui39es201501e37d969093a24ceaf8Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui39es201501e37d969093a24ceaf8JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/39-es2015.01e37d969093a24ceaf8.js", - size: 98526, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui39es501e37d969093a24ceaf8Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x0b\x57\xdb\xb8\xb7\x30\x0e\x7f\x15\xd7\x67\x0e\x8f\x33\xa3\x66\x2c\x59\xf2\x25\x7d\x72\x7a\x28\xd0\x0e\xd3\x16\x18\xa0\xed\xcc\x70\x78\x59\xb2\xbd\x1d\x3c\x04\x3b\xb5\x1d\x5a\xda\xf0\xdd\xdf\x65\xf9\x1e\xdb\x49\xa0\x97\x5f\x7f\xff\xe7\xac\xae\x55\x12\x45\x97\xad\xad\x7d\xd3\x96\xb4\xf7\x23\x6f\x1e\x38\x89\x1f\x06\xca\xe0\xb3\x3c\x8f\x41\x8a\x93\xc8\x77\x12\xf9\xc9\x0d\x8f\x24\x40\x09\x8a\x50\x88\x02\xe4\xa3\x29\xe2\xc8\x41\x31\x9a\xa3\x53\x34\x43\x17\xc8\x45\x7b\xe8\x00\x1d\xa2\x63\xb4\x8d\x3c\x34\x41\x3b\xe8\x04\xed\xa3\xbf\xd1\x0d\xb2\xd1\x35\xba\x44\x47\xe8\x15\x7a\x81\xde\xa0\xb7\xe8\x3d\xba\x45\xbb\xe8\x23\xfa\x84\xae\xd0\x73\xf4\x1a\x7d\x40\x7f\xa0\x77\xe8\x77\xf4\x17\x7a\x86\x7e\x43\x3f\xa1\x97\xe8\x1f\xf4\x27\x02\x40\x09\xa0\x08\x50\x08\x28\x00\xe4\x03\x9a\x02\xe2\x80\x1c\x40\x31\xa0\x39\xa0\x53\x40\x33\x40\x17\x80\x5c\x40\x7b\x80\x0e\x00\x1d\x02\x3a\x06\xb4\x0d\x4f\x8a\x39\x48\x1e\x28\x30\xf8\x1c\x41\x32\x8f\x02\xa9\x9c\x19\x0c\x3e\xfb\x9e\xb2\x1d\x45\xfc\x76\xe8\xc7\xe2\xaf\x02\x83\x41\x5e\x6d\x3f\x6d\x73\xa7\xc0\x60\xb1\x58\x6a\x21\xcf\x03\x17\x3c\x3f\x00\x57\x7e\x34\x4e\x6e\x67\x10\x7a\xd2\xc9\xed\xb5\x1d\x4e\xb7\xb6\x82\xf9\x74\xfa\x68\x0c\x67\xd9\xf7\xa1\x9f\x40\xc4\x93\x30\x3a\x5f\x2c\x8a\x5f\xe4\xff\xfe\xef\xa2\x54\x3e\x2f\x06\xcb\x80\xf0\xa2\xf0\xba\x1c\xf4\x04\x9a\x63\x0f\x3e\x27\x97\x51\xf8\x41\x0a\xe0\x83\x74\x7a\x3b\x83\xbd\x28\x0a\x23\x45\xde\x0f\x6e\xf8\xd4\x77\x25\x9e\x24\x70\x3d\x4b\xa4\x24\x94\xe2\x59\x04\xdc\x95\x82\x30\x78\x2c\x46\xb2\xa7\x20\xf9\x41\x9c\xf0\xc0\x81\xe1\xff\x04\xfb\x81\x14\x46\x2e\x44\x69\x55\x1b\xa4\xa2\x0a\x12\x0d\x78\x0a\x88\x14\xda\xff\x80\x93\xc4\xd2\xf5\x3c\x4e\xa4\x4b\x7e\x03\x12\x97\x5a\x53\x52\x06\xd2\x35\x24\x97\xa1\x3b\x94\x07\x77\xca\xe0\xae\xc4\xf6\x04\x14\x40\x49\x89\xef\x64\xb1\x50\x92\x31\x0c\xe3\xa9\xef\x80\xa2\x0e\x06\xe8\x50\x74\x3f\xf4\x22\x80\x4f\xa0\xe4\xdf\x32\x94\x1e\x45\xe1\x0c\xa2\xc4\x87\x58\x01\xf4\x39\xe2\x1f\x46\x9f\x6f\xf8\x74\x0e\xa3\x66\x9b\x64\x70\x77\x37\xa8\x0d\xb9\x93\x0f\x99\x52\x67\x34\x5e\xb5\x40\x5d\x4b\xb3\xb4\x28\x4f\x7c\x4f\x79\x14\x75\x12\xc7\x62\xa1\x44\x63\xb1\x32\x83\xc5\x22\xd9\xda\x82\xad\x2d\x39\x98\x5f\xdb\x10\xc9\xe3\x62\x24\x18\x4e\x21\x98\x24\x97\x83\xcf\xd1\xd6\x96\x02\xe3\x68\x20\x98\x26\x1c\xab\x28\x18\xd7\x96\xf3\xee\x49\x86\xa0\xcf\xf1\x28\x40\xc1\xa8\xf6\x4b\x8e\xb8\xf0\xbf\xc6\x45\x5f\x4f\x3f\xbb\x61\x00\xa3\x47\xea\xdd\x28\xff\x84\x51\x86\x17\x38\x0b\x7f\xf9\xe5\xfc\xee\x0e\xc1\xa8\x4e\xa6\x19\xad\xc0\x1d\xf2\x46\xc1\xdd\xdd\xa6\x94\x93\xe1\x00\xbe\x2f\xe9\xa4\xc8\xf1\xd1\x74\xfc\x48\x45\x7c\xfc\x08\x57\x58\xa9\x63\x64\x1c\x0d\x1d\x3e\x9d\xa6\xdc\xd1\xc4\x95\x90\x47\xe3\x68\x18\xc0\xc7\x44\x19\xe4\x8d\xa5\xe9\x18\x86\x29\x9e\x10\x2c\x23\x86\xa7\xe3\xf8\x63\x81\x99\x3a\x6f\x45\xb7\x9f\xa7\x19\x93\x8e\xc7\xd1\x30\xeb\x66\xb1\x28\x3e\xa5\xe4\xed\x07\x7c\x3a\xbd\x4d\xa9\x82\x0f\x32\x84\xfa\x77\x77\x77\x15\x0d\x9e\xe4\x34\xe8\x7b\x85\x9c\x48\x65\x66\x30\xa9\x51\x46\x5d\xb6\xa0\x24\xa3\x8b\x68\x9c\x93\xf6\x2c\x0a\x93\x30\xad\x39\x4c\xc2\x13\xd1\xb2\x98\x72\xce\x3a\x26\x7a\x8c\x8b\x19\xca\x59\x23\x79\x3c\x1e\x47\x5b\x5b\x30\x74\xc2\x20\x4e\xa2\xb9\x93\x84\x29\xd1\x45\xe3\x46\xc9\x30\xe0\xd7\x30\x40\xf2\x6b\x3e\x13\x0d\x16\x0b\xf9\x04\xb2\xb6\x4f\x1b\x92\x67\x24\x6f\x47\x93\xf9\x35\x04\x49\x9c\x57\xfc\xf5\xff\xa7\x3c\x1d\xbd\xf1\x17\xfb\x83\x20\x51\x9e\x8e\xcc\x05\xd6\x17\x1a\x19\x28\x4f\x47\x3b\x53\x7e\x3d\x03\x77\x90\xf5\xf0\xd3\xaf\xc3\x04\xe2\x44\x89\x06\x4f\xf3\xc9\x8d\x6e\x42\xdf\x95\xd4\x1a\x82\xf2\x1f\x3e\x2b\x19\x96\x93\xc5\x22\xf9\xaf\x92\x59\xb6\xb6\x84\x90\xc8\xbf\x3d\xf1\xc2\x48\xc9\xb0\xa3\xa2\x70\x9c\x52\x6e\xc6\x82\xc9\xe0\x49\xf4\x7f\x93\x27\xd1\x2f\xbf\x0c\xc2\xb3\xe8\x7c\x0c\x67\xd1\x79\xb1\xe8\x61\x35\xd4\xdf\xd5\x5a\x3c\x52\x2a\x12\x0e\x3d\x29\x19\x0c\x3a\xb9\x61\x87\x07\x41\x98\x48\x29\xc6\x25\x2e\x39\x53\x1e\xc7\x12\x8f\x25\x5e\xaa\x0b\xb9\x26\x6e\x6e\xf2\xee\x6b\x50\xa6\x60\xe5\xd0\x0b\xe8\x3e\x67\x3c\x9f\xa4\xf0\x85\x43\x08\xe6\xd7\x19\xaf\x8c\xeb\x5f\x16\x8b\x47\x18\x85\xe9\x52\x79\xfe\x64\x9e\xfd\xfe\x48\x45\xb2\x60\x6d\xd9\x0f\xa4\x70\x6b\x4b\x09\x87\x1f\x22\x3f\xc9\x7f\x2b\x85\x67\x43\x5c\xde\x2a\x80\x94\x60\x1c\x0e\xaf\xe0\x16\xf9\xe3\x0c\xf3\x48\x8e\x05\xdb\x95\xf4\xa7\xf8\x95\xf8\x29\xb0\x23\x67\xfc\x5a\xc9\x49\x28\x98\x60\x5c\x52\x2b\xe4\x74\x5a\x8a\xce\x24\x3c\x8a\xfc\x6b\x3f\xf1\x6f\x40\x08\xcb\x6c\xbc\x47\xe3\x71\x54\x4c\xbb\xe0\x56\x94\x2c\x16\xb2\x0b\x1e\x9f\x4f\x13\x79\xf0\xa4\x6b\xc0\xb0\x18\x26\x7c\xd2\xb9\x30\xff\xfd\xdf\xb5\xe1\x32\xb1\x92\x37\xe0\xd2\xac\x2c\x17\x18\x4b\xa5\x49\xce\xaf\x15\xef\x8d\x93\xa7\x19\x37\x8d\x0e\x84\xa0\x1e\x08\x0d\x1b\xa0\xa2\xc6\x60\xf0\xd4\x1f\x65\x35\x14\x7f\x30\x40\x61\x26\x91\x02\xe4\x57\xeb\x6d\x8b\xf5\x46\x51\xa5\xd3\xb6\xb6\x52\x1a\xa8\x78\x16\x25\x03\x14\x65\x85\x28\xea\x5f\x24\xb9\x6c\x20\xa3\xcf\xc5\xb2\x8e\x1e\xe1\xbb\x01\x82\x6a\xb8\x6b\xa8\x94\xc0\x35\x74\xaa\xb3\x63\xf0\xa6\xe0\x24\x5b\x5b\xf9\x87\xe1\x04\x92\xa7\xb5\xcf\x43\xdb\x0f\x5c\x65\x30\xaa\x2f\x38\x2a\x97\xe7\x32\x97\x3f\xbe\xa7\x84\x59\x59\x50\x48\xa1\x09\x24\x87\x1f\x82\x02\xe4\x5d\x88\x9d\xc8\x9f\x25\x61\xa4\x84\x69\x83\x1c\xa8\x40\x0c\x27\xfe\xcf\x16\x9a\x17\x62\x23\x67\x81\xff\xab\x3d\x85\x51\x34\x18\x05\x43\xb1\x30\x77\x77\xe8\x1a\x86\x7c\x36\x9b\xde\x2a\xc9\xa5\x1f\xa3\xb2\x7e\x8d\xa9\x2e\x6b\x4c\xf5\xe4\x51\x4b\x28\x5e\xf2\xb8\x06\x58\x49\x5f\x83\xc2\xe6\x1a\x2b\x30\x7e\x2b\x34\xf3\x93\x12\xce\x1a\x4e\x8f\x2a\x89\x20\x97\x2c\x5d\xa2\x33\x29\x7b\x49\xba\xc5\xc3\xc9\x7c\x06\x91\x04\x1f\x67\x11\xc4\xb1\x58\xa3\x94\x10\xc1\x4f\x2e\x21\x4a\x55\x61\xda\x5a\x0a\xa3\x86\xbc\x78\x52\xa3\x8f\x02\xbd\x4e\x04\x3c\x01\x25\xd9\xda\xaa\xcd\x0d\x7d\xae\x09\xeb\xc2\xe0\x01\x54\xd1\x87\x8a\xea\x22\x22\x35\x03\xee\x1e\x44\x63\xc9\xd6\xd6\xab\x0c\x0f\x15\x62\x5e\x35\xad\xb5\x57\x25\xa8\x31\x24\x47\x45\x4f\x87\xde\xd3\xce\xd2\x2e\x32\x2b\xbb\x82\xe1\xc5\x85\x80\xe5\xe2\x62\x9c\xa4\x9a\xb8\x35\xf6\x0b\x61\x97\xa7\xf4\x97\xd4\x2d\xa3\xa6\x8d\x3d\x5e\xa2\xf9\xc5\xe2\x51\x41\xe8\x25\xda\x72\x19\xf2\x08\xa7\x24\xdd\xfa\x75\x18\x5f\xf2\xeb\x46\x95\x8a\x04\xca\xde\x8f\xa2\xf0\xe3\x6d\x51\x49\x7d\x92\x1a\x04\xf9\x3c\x9e\x85\xe1\x14\x78\x50\xa3\x45\xb1\x42\x87\x5e\x46\x84\xad\xe1\x94\xbc\x01\x3a\x3b\x47\x75\x7b\x6f\x30\x40\x8f\xd4\x3b\x87\x27\xce\x65\xb5\x1d\x79\x84\xef\xee\x2a\xbb\x65\xc9\xb0\x89\x50\x98\xd1\x74\x0a\x73\x52\x70\xea\x5b\x10\x4c\x34\xa8\xab\xf8\x27\xd1\xb8\x0d\x47\x58\xf1\x19\x0a\x06\x77\x30\x8d\x41\x8a\xc6\x61\x37\x23\x16\x20\xbc\xc9\x7a\x47\xd1\xa0\xa6\xba\xdf\x54\xdc\x93\x6c\x6d\x95\x42\xbc\x44\x5e\x2a\xe6\xdb\x28\x4d\xca\xcd\x54\xd2\x50\x13\x3d\x3c\xb6\x0b\x91\x7f\x03\xae\x54\x9b\x56\x2c\x5d\xa7\x36\x65\x30\xbd\x2d\x84\x7e\x36\x72\xca\x6a\x15\x85\xb4\xd1\x97\x19\x60\xd9\x80\x42\x95\x55\x03\x1e\x83\x07\x11\x04\x4e\x31\x6a\x3a\x59\xe9\x92\xc7\xc1\xff\x49\x24\x1b\x20\x90\xfc\xc0\x4f\x7c\x3e\xf5\x63\x70\xa5\xc7\x52\x9c\x32\xbe\x32\x68\xd4\x48\x97\xbd\x3e\x2c\xa4\x3b\xb6\x0a\x59\x6f\xeb\xbb\xcd\xb7\x6b\xf8\x69\xb2\x86\x9f\xba\xb8\x69\xb1\xe8\x6c\x2c\x8c\xe3\xb7\xd9\xb6\x35\x86\xa9\x37\xfc\x00\xf6\x8c\x3b\x57\x3b\x97\xf3\xe0\x2a\xb9\x9a\x5c\x5c\xf9\xce\x55\x9c\xf0\x28\xb9\x98\xfb\xe3\xb5\x35\x16\x8b\xb3\xf3\xc1\x70\x36\x8f\x2f\x95\xb3\x33\xcd\x3a\x47\x9f\x4d\x4b\xd5\xac\x0a\xb6\x13\x40\xfb\x80\x6e\x52\x0e\x86\x61\xa4\xec\xc3\x00\xdd\xc0\xd0\x55\xf6\x01\x7d\xde\xfe\x34\x8f\xe0\x9d\xff\x89\x47\xee\xeb\xd0\x9d\x4f\xa1\x63\x7f\xb3\x1f\xde\xdd\x65\x36\xf0\x25\xa0\x57\x30\xbe\x01\x85\x58\xa6\x66\x0e\xd0\x9b\xec\x8b\xc6\xd8\x00\xbd\x87\xb1\xa2\x5c\xc2\xf8\x3d\x2c\x16\xca\x7b\x18\xa7\x7c\x34\xdc\xfb\x73\xff\xe4\x74\xff\xe0\xc5\x58\x86\x8f\x7e\x9c\xa4\x7a\x1c\x5d\xc2\x70\xe7\xcd\xc9\xe9\xe1\xeb\xb1\xec\xcc\xe3\x24\xbc\x96\xd1\x7b\x18\xa0\x5b\x18\xb7\x86\x56\x60\x7c\x9b\x76\x77\xbb\xa2\xbb\x76\x6f\xb7\x99\x21\x04\x77\xca\x00\xed\x76\xf7\xba\x9b\xf6\xba\x9b\xf7\x7a\xf4\xe6\xd9\xab\xfd\x9d\xb1\x2c\x70\x71\x34\xb7\xa7\xbe\xb3\x33\x0d\xe7\x6e\xda\xf7\x8b\xc3\xb7\xa7\xf9\x2f\x6f\x4e\x5e\x84\x37\x10\x05\x29\x1b\xe6\xbf\xef\xd6\x46\xfa\x08\xe3\xb3\xcf\xa9\x01\x3f\xda\x85\xbc\x4b\xe4\xfa\xf1\x6c\xca\x6f\x0f\xd2\x52\x39\xeb\x59\xca\x9a\xde\xa1\xb2\x6e\x3a\x44\xb3\xe6\x9b\x13\xa9\x1a\xaa\x68\x70\x8e\x3e\x75\xcf\xe5\x53\x3a\x97\x4f\xc5\x5c\x8e\x0f\xdf\xee\xef\xee\x1d\x8f\x65\x2e\x66\x13\x85\x37\xbe\x0b\xd1\xf3\x30\xba\x4e\xa7\x73\x70\xb8\xbb\x77\xb2\x77\x9a\xe1\x50\xd4\x38\x08\x5d\x38\x81\x24\xc5\x65\x51\xe9\xed\xc1\xde\xe9\x58\xbe\x09\x20\xc9\x4a\x3e\xd5\x66\x79\xd5\x0d\xc3\x55\x0a\xc3\xd5\x12\x0c\x17\xdb\x7f\xbf\x39\xde\xdb\x79\x75\xf8\x66\x37\x1f\xac\x44\x6b\x59\x65\xe7\xd5\xfe\xde\xc1\xe9\x58\x76\xa6\x3e\x04\xc9\x7e\xd7\x8f\x27\x7b\x3b\xc7\x7b\x65\x95\x13\x70\x22\x48\x1a\xd5\x8e\xf7\x5e\xec\x1f\x1e\x8c\xe5\x08\x26\xa9\x58\x6b\xfe\x74\x72\xf8\xe6\x78\x67\xef\xc5\xf1\xe1\x9b\xa3\x82\x4e\x22\x88\xc3\x79\xe4\xc0\x8b\x28\x9c\xcf\x76\x72\xa2\xe9\x6b\x54\x91\x5c\xa3\xd9\x5e\x8d\xfe\xba\x1b\x1e\x1e\x9d\xe6\x50\xd5\x9a\x1d\xce\x92\x65\x10\x4f\x4e\x7e\xcb\xa8\xe5\xe5\xde\x5f\x63\x39\x8e\x2f\x33\x3a\x79\x09\xb7\xcd\x6a\x6f\x9e\x9d\xec\x1c\xef\xe7\x9d\xc6\x73\x3b\x33\xf8\xfc\x30\x58\x42\xda\xe9\xde\xc1\x76\x8a\xd1\x04\x02\x5e\x60\x34\x5d\xd1\x8b\x6c\xfa\x17\x07\xdb\xaf\xf7\xb2\xd5\x4d\x89\xad\x9a\x7e\xbd\xce\xce\xfe\xee\x71\x56\x67\xc7\x77\xa3\x67\xd3\xd0\xb9\x2a\xab\x14\x08\x59\xea\xa8\x8e\x90\x66\xbd\xc3\xe3\x8b\x02\xf3\x69\xe5\x0a\x05\xa2\xda\xd1\xf1\xfe\xdb\xed\xd3\xbd\x8b\x9d\x57\x6f\x4e\x4e\x53\xba\x9d\x45\xfe\x0d\x4f\x60\x3b\xa3\x97\x79\x9c\x40\xd4\xaa\xbc\x7f\x54\xd6\xdb\x3f\x2a\x7f\x2d\xd0\x7f\x21\xf0\x9f\x8d\x76\x5c\xc7\x7e\x35\xcd\xc3\x83\xd3\xe3\xc3\x57\x47\xaf\xb6\x0f\xf6\x2e\x0e\xf6\xde\x9d\xbc\x79\x26\x8a\xc5\xb4\x9d\x30\x48\xa2\x70\x7a\x34\xe5\x01\x9c\xcc\xed\x1c\x09\x07\xf0\x61\x5d\xf3\x0c\x21\xed\xe6\xbd\x4d\x37\x18\x76\x65\xc3\xbe\x01\xcb\x46\xef\x0e\x8f\x5f\x66\xb4\x53\x55\xff\x10\x46\x57\x10\x09\xb6\xef\xac\xbc\x8c\x8e\xe5\xfa\xcb\xc8\x68\x35\xeb\x1e\x46\x34\xb9\xaa\x49\x92\xe7\x42\x77\x68\xba\x61\x0d\xd0\xeb\xec\xb3\x6a\x6a\x64\x80\x3e\x64\x5f\xb0\xae\xb1\x01\xfa\x43\x7c\x31\x0d\x86\xad\x01\x7a\x27\xbe\x50\xdd\x30\xc9\x00\xfd\x2e\xbe\xe8\xa6\xa5\x59\x03\xf4\x17\x8c\x3f\x7b\x3e\x4c\xdd\xd7\x7c\x36\xf3\x83\x49\x3c\xca\x65\xf1\x15\x74\x89\x23\x14\xc1\xfb\xb9\x1f\x81\x9b\x9a\xec\xf9\xb6\xf7\xad\xb0\xe6\x3f\xc2\x99\x7a\x8e\xa6\xdc\x86\xe9\x48\x16\x0d\xa4\xbd\x83\xb7\xfb\xc7\x87\x07\xaf\xf7\x0e\x4e\x65\x64\x73\xe7\xca\x0f\x26\x99\x5e\x1f\x7d\xce\xc5\xf6\xf3\x74\xe8\x91\x5c\x13\xe2\x72\xe6\xf6\xcb\x7f\x48\x41\x91\xef\x0a\x99\x7f\xd5\x12\x71\x0d\x78\xf2\xc1\xb3\x5f\xa4\xfd\x5d\xb9\xbf\x5d\x26\x1a\x1b\xad\xaf\x79\x7c\xd5\xee\x25\xab\xd8\xd9\x53\x26\x3d\x1b\x7d\xe4\x9f\xe3\x67\xdc\xb9\x82\xc0\xdd\xe5\x09\xaf\x75\x99\x35\xe8\xe9\xab\x43\x72\xde\xa3\xeb\xa2\x89\x54\x74\x24\x89\x9e\xd6\x8f\x95\x09\x18\xe4\x86\x07\x61\xb2\x3d\x4f\xc2\x63\x88\x93\x30\x82\x06\xd4\xf5\x1e\xa5\x94\x48\xd7\x77\x9b\xc9\xf0\xae\xd5\xd9\x00\xc0\xba\x60\xef\xea\xe2\xe4\xe4\x37\x29\xab\x20\xbd\xdc\xfb\xab\xbb\x8b\x9a\xd0\xef\xec\xa2\xf6\x7b\x1f\xa5\x64\xfa\xa0\xab\x75\xf6\x8b\x68\x77\x7e\x87\x9e\x65\x9c\xa6\x61\x62\x0c\xd0\x6f\xd9\x17\xd3\x22\xea\x00\xfd\x24\xbe\x60\x55\x4f\x39\xed\x65\xc6\x83\x8c\xa8\xda\x00\xfd\x23\xbe\x30\xa6\x5a\xda\x00\xfd\x99\xf1\xad\xc9\x4c\x6d\x80\x20\x11\x96\xa1\x41\x89\x36\x40\x89\xf8\x82\xa9\x4a\xad\x01\x8a\xc4\x17\x4b\x57\x0d\x63\x50\x9d\xfc\x84\x49\xb6\x71\xc1\x5b\xb0\xb5\xa5\xfc\x04\xc3\xd3\xc9\xdf\x8a\x8a\x64\xd7\xbf\x91\x51\x3a\x6e\x5e\x84\xf3\x22\xaa\x96\x45\xa4\x28\xc2\x65\x91\x56\x14\x11\x51\x74\xf1\xe6\x6f\x85\x22\xd9\x99\x46\x8f\x7d\x27\xd5\x3d\x54\x13\xe5\xef\xff\xde\x56\xca\x36\x0c\xc9\xf1\x8c\xa7\x3f\x52\x51\x76\xb2\x7b\xa3\xe8\x88\xb2\x66\xcd\x9e\x0f\xb5\x5d\x45\xb0\x3c\x93\xe4\xb7\x77\x8a\x8a\x0c\x84\xeb\x93\x48\x61\x49\xc2\x70\x9a\xf8\xb3\xc7\xa9\x00\x87\x20\x91\x11\xd5\x4b\x70\x49\x0e\x4d\x73\xac\x83\x8b\x59\x63\x2c\xbf\x07\x6b\x69\xef\xb9\x5a\x78\x0c\xe9\xf6\x49\x2e\xa7\x84\x11\x35\x3a\xe1\x9e\x76\xc3\x8d\xc9\xb7\x00\x9c\x3f\x08\x70\xb3\x13\x70\xa7\x07\x70\xba\x09\xe0\xd6\x3d\x01\x8f\x1f\x02\x38\x53\x3b\x01\x9f\xf7\x00\xfe\x4d\x48\xe5\xf4\x41\x80\xe3\x4e\xc0\x67\x49\xe9\x65\x58\x82\x9d\xa8\x5f\x0f\x76\x44\xb6\xa0\x38\x29\xfc\x09\x86\xe1\xc7\x0f\xca\xe0\xc9\x4f\x30\xfc\x38\xd3\x95\x8c\xaf\x67\x7f\xbc\x55\xa2\xa1\x93\x19\x89\xa7\xb7\x33\xa8\xdc\xa0\xe2\xf7\x3f\x92\x53\x45\xad\xbb\x47\x2e\x3a\x00\xcf\xf1\x10\xe6\x66\x29\xcb\x45\xc6\xfc\x8d\x52\x9f\x7c\x1d\x98\x64\xf8\x93\x7f\x3d\x9b\xfa\x8e\x9f\xa4\xf0\xfc\xa1\xff\xae\xc8\xc1\x44\xd8\x0f\x32\xca\x46\x4e\x61\xcc\x9a\x1f\xbe\x9f\x2b\xd1\xb0\x66\x19\xd4\xe1\x71\x1f\xb4\x28\x5a\xe7\xa2\xec\xf5\xf4\x95\x09\x35\x46\xab\x69\x21\x59\x7a\x15\x72\xd7\x0f\x26\xc3\xe1\x50\x92\x3b\x7b\x3b\xe8\x5f\x62\xf3\x87\x5e\xe2\xc3\x0d\x96\x98\x3d\x68\x89\x6f\xf2\x05\xce\x4f\xe9\x36\x5f\xe5\xe3\x07\xad\xb2\xde\xb9\x2e\xdb\x5f\x75\x95\xbd\x15\x90\xf5\xad\x69\xbe\xec\xd5\x9a\xa6\xa3\x11\x24\x4b\xa7\x97\x20\xe5\x95\x63\x29\xf4\xa4\xe4\x12\xa4\xd4\xc6\x99\x65\x7e\x8f\x2b\xb8\x95\xbc\x28\xbc\x96\xb8\xf8\x38\xe3\x7e\x24\x25\x97\x3c\x91\x6e\xc3\x79\x76\x00\x9d\xf9\xdc\x5d\xc9\x0b\x23\x69\x1e\x83\xf4\xc1\x4f\x2e\x25\xb1\x0f\x6c\xc0\xdf\x35\x91\xc9\x83\x50\xdc\xad\x08\x77\xbe\x26\x52\x4e\x60\x0a\x4e\x22\xf1\x40\x2a\x3c\x56\x52\xe1\x10\x90\x26\xe9\x9e\x54\x0a\xa3\x7c\xe2\x12\x17\x7e\xcf\x30\x00\x29\x09\x05\x26\xfd\x60\xbe\x7e\xea\x27\xbd\x9c\xca\xac\x6f\xca\xa9\xe4\x4b\x59\x75\xff\x5f\xc2\xaa\x97\xfe\x3f\x8a\x2c\x15\x3f\x22\x59\x92\xeb\x30\xfd\xfd\x10\x42\xd2\xbb\xd5\xe4\x4d\xff\xfc\x32\xeb\xb4\x65\xd5\x32\xb3\x6e\xd5\xa6\x63\xc6\x82\x7e\xc4\xd0\xdc\x0f\x20\x1f\x36\xb7\x71\x85\x1d\x2f\xa3\x6c\x05\xd3\x35\xa7\x88\x59\x75\x83\xb6\xb6\xe2\x72\xb9\xcc\x7a\xdd\x12\xce\x06\xfc\xeb\xc0\x51\x0c\x74\x92\x20\x0d\xf5\xd1\x89\xd5\x41\x15\x2d\x1b\xda\x44\x72\x06\xb0\x8c\x74\xb5\x1c\xd0\xaa\xd6\x53\x53\xcb\xf1\xb0\x8a\xf6\x13\x44\x10\xa9\xfd\x8a\x9b\x5d\xa6\x8d\x31\x6e\x22\xff\x12\xa6\xb3\x02\x0d\xa2\x1b\x82\xfe\x4e\xbb\xe9\x5c\x23\x84\xf1\x4a\xab\x7d\x95\xfe\x31\x6a\x44\x7d\x99\x5c\x4f\xc5\x56\xfe\x55\x8a\xf1\x78\xd8\xe9\x0a\x2c\x89\x9c\x96\x14\x97\x69\xea\xdc\x40\x78\x1e\x46\x87\x5e\x4a\x77\x8d\xd6\x71\x59\x99\x54\x95\x9d\x69\xb4\xef\xed\x65\x53\x88\x86\xe2\xfa\x0f\x4f\xc2\x68\x2f\x98\x5f\x0f\x8f\xf7\xfe\x78\xb3\x7f\xbc\xb7\x5b\xa7\x5a\xbb\xdb\x92\xd4\xbf\x89\xed\x7e\xfd\x20\x16\x61\x9d\x2c\x72\xf9\xa0\xbe\xba\x55\xe3\xd1\x83\xfa\xea\xd6\x01\xaf\x1a\xac\x5b\x23\x91\xbd\xd9\xf3\x8c\x44\xee\xcb\xc8\x7e\x30\x9b\xdf\x83\x8f\x75\xf2\x70\x3e\xb6\x53\x3e\xee\x53\x58\x9b\xf2\xb1\x80\x57\x46\xba\x86\xf4\x6c\x7a\x07\xee\xef\x4a\x51\xda\x3e\x23\xfa\x09\x86\x3b\xbf\xbd\x56\x32\x49\x2f\xf8\x68\x18\x06\x0d\xe7\xab\xf0\x36\x5f\xf2\x60\x02\xca\xe0\xae\x83\xcf\xd5\x35\x7c\x8e\xd1\xf5\x5a\x3e\xcf\x05\xc2\xe5\x66\x15\x35\x74\xf4\x50\xc9\x71\xe7\x7b\x4a\x29\x3b\xc2\x15\xb2\x23\x5c\x2d\x3b\x32\xf7\x7b\x87\xe4\xa0\xdd\xc2\x20\xec\x13\x06\x4d\x1d\xb7\xb6\xdd\xdb\xed\x57\xfb\xbb\x4b\x0e\x73\xe1\xb8\xbd\x6f\x47\x6f\x0e\xf6\xff\x78\xb3\xd7\xd9\xd3\x9d\xb8\x9f\xf3\x22\x19\x9f\x75\xb8\xa3\x3a\x7c\xa0\xbd\xee\xcd\x5e\x8f\x58\xb7\x73\xf7\x1c\xbd\x69\xdc\x52\x48\xa1\x98\x8c\xeb\x27\xb5\x47\xa0\x44\x08\xb2\x23\xcd\x64\xfc\x02\x94\xa8\xe6\x89\x8a\x14\x40\xc5\x65\x9b\xe2\xe0\xf8\xef\xf2\xac\x1d\x29\xc1\x38\xbf\x4b\x23\xce\xf6\x07\x43\x3e\xf3\x77\xc4\xc9\xd4\x18\x50\x50\x60\xc7\x0f\x83\x13\x88\x6e\x7c\x07\xc6\x21\x0a\x86\xd3\xcc\x10\x3f\x16\x07\x54\xf1\xf8\x11\xae\xca\x4e\x12\x9e\xc0\xf8\x75\x8a\x74\x36\xdc\xdd\x7b\xbe\xfd\xe6\xd5\x29\x0a\x86\x1d\xa7\x46\xe3\xf7\x50\x1e\x80\x8a\x1a\x59\x67\x67\xe7\x28\x18\x56\xa7\x6b\xf1\xf8\x23\x2c\xb7\xcf\x2b\x09\xd8\x76\x22\x70\x21\x48\x7c\x3e\xcd\xe1\x68\xd2\x63\x6a\x89\xa6\xc0\x0b\xa8\xe4\xcc\x30\x95\x51\x90\x5f\xd7\x92\xec\x14\x73\x67\x9f\xaf\xe0\x76\x54\x9c\x41\xd9\x70\x1a\xe6\x73\x8d\x73\xaf\x77\xfd\x0c\xf9\x0d\x0c\xff\x1e\xba\x3c\xe1\x79\x9d\x14\x07\x71\x12\xf1\x68\x18\x27\x30\x3b\x29\xfa\xc8\xf0\xfb\x1b\x0c\x5f\x0d\xc5\x4a\x5e\xbc\x68\x1d\xe8\x9c\xa0\xb4\xce\x30\x0c\x9e\x43\xe2\x5c\x82\xdb\x90\x2e\x71\x76\x22\x9f\xad\xc9\xdd\x1d\xca\x40\xec\xa9\xdb\x02\x53\x5c\xc4\xf5\xe3\x65\xac\x01\xc2\xe3\x71\x75\xb7\x57\x54\xf1\xc2\xe8\x5a\xfc\x3c\x9c\x40\xa2\xac\x75\x7e\x0f\x86\x31\x64\x47\x0b\x0a\x9c\xa9\xe7\x99\x41\x3a\x12\x3d\xf9\x81\xdf\x3c\x9e\x7a\x1e\x85\xd7\x27\xfc\x06\x84\x57\x5c\xa9\x66\x91\x9d\x6b\xfb\x9f\x20\x3b\x8e\x6d\xa1\x38\xbb\x5a\x9b\xf6\xf9\x64\x09\x44\x87\x07\xaf\xc3\x1b\x38\x0d\x0f\xe0\x63\xd2\x3e\xb8\x95\xa0\x56\x57\x50\xc7\xd6\x16\xb4\xc8\xe4\x0e\xe5\xb8\x49\x17\x0e\xa2\x93\x04\x66\x85\x65\xef\x87\xc1\x69\xe4\x4f\x26\x10\xc5\x4a\x76\xfe\x12\x8f\x3a\xb8\xfd\xfc\x6e\x80\x96\x20\x13\x93\xc8\xd4\x41\x3c\x9c\xf9\x33\x50\x14\x15\x7d\x80\xa1\x3d\x50\x88\xaa\x0e\x90\xa2\xa2\x3f\x60\xf8\x71\xa0\x34\x6f\x2c\x15\x97\x6d\x76\x40\x79\x91\x0c\xc4\xe5\x1f\x2f\x8c\x94\x70\x18\x2b\x83\x27\x8f\x94\x68\x1c\x0e\x03\x65\x30\x10\x77\x8a\x9f\x14\xf7\x70\xa2\x6c\xb4\x27\xbe\xa7\xc0\x59\x70\xfe\x68\x3c\x4e\xce\x82\xf3\x41\x75\xaf\x27\xbb\xea\xe3\x0f\x3e\x87\x43\x50\xfc\xea\x0a\x71\x38\xf4\x94\xe2\xa6\xe2\x23\xf5\x4e\x40\xf5\x0e\x86\xc7\x03\x41\x67\xc3\x79\x50\xb2\xc0\x60\x30\x2c\x3f\x2b\x35\x3c\xb7\xb1\x39\xce\x2e\x78\xad\x23\xa5\x17\xfb\x87\x07\x83\x6e\x2c\x75\xe1\x25\x5f\xcf\xdf\x4f\x0e\x0f\x86\xd9\x7d\x49\xdf\xbb\x55\x60\x30\x1e\x8f\x97\xca\x92\xc1\xfd\xe7\x91\xa4\x13\x49\xd5\x79\x2a\x71\x72\x1d\x2e\xfa\x11\xcc\x7d\x0d\x71\x0c\xc1\x04\xa2\x5a\x53\xd1\x2f\xdc\x40\x90\x3c\xf7\xa7\xb0\x7f\x3d\x0b\xa3\x04\xdc\x92\x81\x6b\x65\x75\xbe\x6d\x12\xda\x6e\x76\x2e\x57\x55\x16\x2a\xe8\x37\x1e\xb8\x53\x88\x3a\x47\x10\x15\x1a\xdc\x5f\x1b\xa8\x97\xe9\xdd\xe5\x71\xc0\x6d\x0c\x92\xca\xa9\xfc\x58\x71\xa0\x40\x0e\x64\xc6\xd5\x8d\x95\x55\x1e\xe1\x6a\x6c\xcf\x0f\xdc\xed\x52\x28\x3f\xab\x9f\x09\x76\x5d\x1a\xfa\x08\xc3\xb4\x45\x03\xe5\xc5\x95\x2c\x21\x33\x52\x39\x74\x57\x75\xdf\x31\x7c\xef\xfc\x5a\x14\x08\x65\x37\xc1\xe4\x30\xd8\x0f\xfc\xa4\x43\xa8\x5c\x83\xf2\x16\x94\xa8\xba\x4c\x37\x40\xb5\xea\xf9\xbd\xb6\x52\x0d\xa2\x65\x4c\x09\x71\x94\xdf\xa2\x3c\xa9\x8a\x95\x9c\x66\xe6\x31\x44\xa9\x94\x4b\x25\x5a\xae\x18\x86\xf6\xdc\x9f\xba\x69\x81\xd2\xe4\x8e\xac\xef\x0f\xe2\x8e\x52\x8a\xc6\x8a\x79\xaa\x6f\xf5\x35\xca\x4a\x96\xcc\xae\xb1\x18\xb6\x38\x22\x7e\x93\xf8\x53\x3f\xf1\x21\x4e\x39\xaf\xaa\xf5\x9a\xcf\xda\x4b\x5e\x0c\x10\x46\x90\x53\x64\xd6\x63\x5f\xcd\x86\xb4\x56\x8a\xe6\x6d\x5d\x59\xfc\x94\xaa\x81\x8c\x52\x6a\xa4\x54\x34\xbb\x0c\x3f\x1c\x77\xed\x35\x6b\xda\x61\xb5\x1a\x59\xa9\x2e\xd2\xd9\x9f\xa4\x13\x73\x33\x0d\xb5\xfe\x28\x77\x79\xce\x48\x96\x07\x28\xb9\x5f\x67\xf9\x59\x6d\x57\x57\x99\xfe\xba\x14\xdc\xb7\xef\x89\x49\x64\x16\x72\x63\x82\xfb\xf1\x41\xf8\xa1\xc4\x44\x32\x10\xaf\x77\x12\x94\x8c\x53\x60\x64\x39\x95\xef\x4f\x95\xfb\x28\xeb\x0c\xa2\x9a\xaa\x4e\xfa\xf0\xaf\xbc\x2f\xae\x9b\x0d\x06\x23\x31\x14\xdc\x6f\xa8\x2e\xbb\x60\xd5\x60\x65\xfd\xdc\x68\x68\x57\x6a\x1b\x2e\x99\xb9\xd8\xa4\x90\x65\x0a\xdb\xc0\x8c\x28\x0d\xdb\x74\x46\xa2\xfd\x5e\xe0\xce\x42\x3f\x48\x94\x41\xa9\x8c\xee\xad\x46\x62\x68\xc1\x22\xd0\x10\xa7\x64\xbb\x7d\xb4\x9f\x2a\x16\xd4\xd0\xa0\x62\x43\x76\x10\x26\xbe\xe7\x3b\xc2\x38\x1d\xcb\x6f\x02\xf1\xe2\x29\x09\xa5\x08\x92\xc8\x87\x1b\xc8\xfc\xc4\x92\x53\x9b\xe1\x5d\xf3\x52\x6f\x5d\x76\xae\x84\xa0\x4b\x90\x8a\x9d\x02\x8a\x96\xed\x8e\x28\xb7\x3b\x92\x71\xd4\xb2\x3b\xc2\x71\x92\xdb\x1d\x85\xc2\xd8\xc9\x76\x98\x62\xb0\x13\xee\xc1\xf4\x56\x09\x11\x9c\x85\xe7\x83\xc2\x04\x09\x06\x9f\xa3\x21\x28\x41\x65\x82\x44\xc2\x04\x29\x61\x9f\x40\x92\x6f\x22\x36\x58\xc0\xe5\x5d\x87\x8a\x7a\xd6\x35\xaf\x51\x5b\xd6\xdf\x9b\x36\x46\xba\x0c\xad\x3d\xcc\x03\xed\x88\x62\xdf\x92\x0c\xe3\x30\x4a\xba\xed\x18\x10\x3a\x6f\x38\x0d\x1d\x3e\x85\x9d\xf0\x7a\xc6\x23\x50\x32\x45\x38\xb8\x2b\x9e\x63\xc1\x6a\x89\x23\x6e\xb5\x40\x4b\xc2\x40\xcf\x4a\x74\x34\xce\x8c\xff\x1c\xde\x62\x13\x50\x16\x14\xd6\xfc\x28\xfa\x12\x82\xcd\x3b\xeb\x25\xd6\x4c\x83\x56\xa4\x7a\xc4\x23\x7e\x1d\xe7\x8f\xca\xd6\xc9\x76\xa1\xd9\xda\xb8\xa9\xb6\xca\xa9\xec\x86\xa7\x19\xb6\x47\xb2\x5c\x3c\xe9\x2b\xae\x0e\x8e\xd6\x74\x94\x59\xf7\x03\x54\x5c\xde\x5c\x57\x3f\xdb\xd5\x17\xf5\xb3\x9b\x9c\x9b\xb5\xc9\x3c\x01\x03\xd4\xbc\xf7\xb8\xae\x6d\xdd\x59\x30\x40\xd5\x1e\x79\x94\x54\x1c\x75\x03\x91\xef\xdd\xde\x4f\x32\x76\x6d\xdd\x5f\x1d\x6e\xef\x96\x1a\xb2\x83\x02\xe4\x65\xe6\x8b\x97\x85\xea\x67\xee\x38\xe1\x3c\x48\xb2\x25\x1e\xd5\x0c\xa8\xee\xe5\x57\x06\x77\x2b\x18\xb6\xe4\xa4\x15\x7e\x86\x87\xed\x68\x3a\x27\x07\xdd\x16\xb1\x3a\x40\x82\x4d\x4b\x09\x53\xa3\xf3\xa4\x3a\xc1\x11\x5d\x8a\x8d\x04\x9f\xc0\x62\x91\x54\x1f\x5b\xbb\x97\x27\xdd\x00\x0c\x9d\x30\x70\x78\xa2\x44\x83\x3e\x50\x70\xfa\x4b\xcd\x69\x72\x0f\x41\x20\xcb\x83\x3e\xfe\xf4\xe3\x9d\x30\x08\xc0\x49\x76\xfd\x38\x65\xf1\xf6\x36\xa3\x41\x3e\xf9\x5e\xf2\x45\x32\x8c\xc0\x9d\x3b\x75\xd9\x58\x7b\xb5\x06\x4b\xd6\x44\x34\x28\x76\xe7\xc9\x1d\x7a\xa4\xd6\x54\x59\x9f\x7d\xd8\x01\xc5\x06\x36\x46\x7f\xbf\xc5\x35\xe1\x7b\xf4\x9a\x9b\x49\xfd\x7d\x6e\xe6\x85\xc9\x7d\x5f\x80\xd2\x2d\x50\x0d\xd8\x96\xd9\x95\xfb\x6f\xe3\xb3\x35\x66\xde\xf9\xd0\x99\x02\x8f\xde\x16\x6e\xcc\xd2\xd8\x7e\x48\x57\xa5\x11\x27\xec\xe0\xfb\xf6\x52\xcc\xe5\xbc\xa4\xd8\x0c\xa0\xb3\xe7\x30\xbc\xda\x1f\x16\x57\xf6\xce\x8b\x9d\x45\x0a\xb7\x10\x75\x95\x97\x68\x9d\x4d\x3b\x18\xe5\x78\xcb\xbe\x3f\x00\x6b\x15\x90\x5f\x01\x6f\xcb\x33\x7e\x28\xe6\x9a\xf8\xef\xc1\x1b\xaa\xb6\xbf\x75\x8f\xec\xd0\x8f\x45\x9b\xd6\xe9\x44\x31\xa1\xae\x16\x6f\x02\xff\xfd\x1c\xda\x4d\x3a\xdc\x86\x83\x07\xad\x57\xcd\xd0\x77\xc2\x20\x0e\xa7\xa9\xe4\x9e\x28\xf2\xbb\xed\xe3\x83\xfd\x83\x17\x23\xa9\xcd\x64\x03\x29\x02\x07\xc4\x53\xac\x79\x10\x81\x13\x4e\x02\xff\x13\xb8\xd9\x1b\x5b\x29\xf4\x24\xf9\x97\x9a\xbb\x62\xad\xa8\x6b\xdf\x7b\x85\x2f\x58\x99\xf9\xcc\xe5\x09\x88\xd1\xb6\x03\x57\x20\xdc\x4f\x6e\xbf\x8c\x66\xfa\xfa\xac\x79\x7c\xea\x3e\xaa\x2e\x01\xd3\xc0\xad\xb0\x08\x1e\xcf\xf2\x37\x32\x8f\x53\x53\x71\xd9\xcd\x35\x90\x5c\x48\x44\xa0\x84\x4c\x75\x48\x8e\x28\x4f\x2d\x39\xf9\x17\xf8\x45\x7e\x92\x5d\x6f\x89\x2f\xfd\x60\x22\x65\x9e\xeb\x4c\x69\x5c\xec\xfc\xb6\x7d\xf0\x62\x6f\x57\x6e\x79\xc9\xf2\x06\xca\xe7\xe4\x76\x06\xa3\x9a\xcb\xbb\xd9\x10\xcd\xf8\x6d\xaa\xbb\x47\x75\xbf\x4f\xef\x99\x5a\x9f\xe7\x7d\xa3\x61\x6b\xc8\x6e\x8d\xfe\x90\x7d\x74\xf6\x96\xb8\x82\xfa\x5e\x1b\xfa\x7e\x2f\xd9\xa3\x47\x6d\x6e\xdb\xc9\x0e\x54\x63\x05\x44\x64\x82\x87\x8a\xc9\x9c\x4b\xf8\x4d\x76\x63\x7f\x33\x56\x4d\xf9\xa3\xae\x8d\x3b\x01\x5b\xe1\xf4\xeb\x90\x1d\xf7\xf3\x02\xba\xb7\x01\xbf\xf6\x9d\x9a\x37\xfe\xa1\x5b\x82\xfc\x54\xee\x91\x5a\xbd\x95\x7c\x9a\xbd\x7a\x93\xb2\xcd\xc0\x28\x25\xf7\x91\x9c\x0b\x5b\x10\x97\xbb\xb2\xdf\x0b\xf6\xa9\xef\xbd\xc5\x15\xae\x53\x1e\x7c\x9a\xcb\x95\xfe\x4f\x77\x6a\x6f\x72\xbf\x5f\xaf\x25\x51\xaf\x94\xee\xc7\x0b\xbf\xe1\x06\x6e\xb9\xdd\xec\xf6\xdd\x61\xe4\x76\x79\x6e\x97\x76\x54\x35\x9f\x64\x2f\xce\xfe\x82\xea\xad\xed\x4a\xe7\x61\x01\x64\xcf\x63\x13\x18\x0c\x8b\x5d\x5f\x94\x2d\x44\x97\x77\xb8\xe6\x08\x47\x70\x77\x77\x3e\x40\xd1\x9d\xf2\x0c\x86\xfb\xe5\x92\x4c\x86\xff\x33\x57\x89\xc1\x3c\xee\x8c\x3b\xc8\x29\x80\x0f\x0a\x2c\x16\x93\x81\xf2\x13\x0c\xff\xd2\x74\xe5\x25\x0c\xa7\x47\xd9\x71\xb7\xa6\x2b\xff\xa4\x66\xfe\xe0\x0e\x15\xbd\x38\xd7\xb3\xf1\x4f\x30\xfc\x73\x76\x9d\x8b\x84\x09\xca\xee\xee\x84\x51\x3c\x3a\x3b\x93\xf9\x6c\xf6\xb8\x43\x40\xca\xe7\xe7\xc8\x03\x9e\xcc\x23\x88\x47\x67\x3f\xc1\xf0\xfd\xe1\x3f\xe7\xc8\x05\x67\x1a\x8f\xb0\xca\xd0\x0d\x8f\xe2\x11\x31\x91\x78\x1c\x1c\x2f\x23\xb5\x27\xce\x54\x39\xc3\xf1\x4f\x62\xcf\xef\x7f\x82\x74\x2a\x0a\x8c\x27\xa0\x9c\xc9\xa9\x46\x4c\x6d\x6c\xc9\x4e\x82\xff\x99\x13\x8a\x3d\x70\x29\xb1\x3c\x60\x84\xdb\x9e\xc5\x0c\xc6\x28\x26\xb6\x65\x68\x1e\x63\xaa\x0e\xdc\x21\xcc\x64\x86\x49\xcd\xac\x36\xb3\xa8\xa6\xab\xaa\xc6\x2c\x5d\x67\x94\x69\x2a\xd1\x47\x92\x8c\xe4\xd1\xfe\xc1\xe9\xde\xf1\xd1\xe1\xab\xed\x54\xdd\x8d\x24\xf9\x7c\x30\x40\xf2\xff\xcc\x3d\xcf\x73\xd5\xec\x8f\x3c\x40\x3b\x35\xa0\xb2\x18\x49\x29\x50\xff\x67\x94\x79\xa4\xa5\x14\x29\x92\x1f\x78\xa1\x14\xd4\xb6\x24\xd9\xc0\x9a\x6b\xe8\x0e\x03\x0a\x5c\xb5\x2d\xe6\xa9\x9c\xd9\x04\x13\x6e\x99\x1a\x06\x17\x83\x63\x1a\xe0\xb9\xae\x43\xb2\xda\xa6\xc5\x0c\x8d\x68\xd8\x50\x35\xc3\xd2\x09\xd6\x09\x1b\x49\x7f\x85\xf3\x2c\x86\x81\x33\xf5\x9d\x2b\x49\xde\x39\x3c\x38\xd8\xdb\x39\x95\x53\x0d\x94\xed\x5d\x6b\xbc\x58\x67\x41\x1b\xbc\x30\x02\xe9\x3a\xbc\x49\x55\x53\x12\x4a\x01\x7c\x4c\x04\xb4\x43\xe9\xff\x9c\x0f\x06\x03\x74\x52\x9b\x58\x24\x22\x26\x65\xd8\xe6\x19\xdf\xf3\x00\x82\x44\xf2\x5d\x49\x5c\x4f\xc9\x40\x54\x2d\xcd\xd6\x80\x9a\x2e\x23\x96\xa5\xa9\x96\x49\x5c\xa2\x11\x5d\x75\x1d\x83\x69\x1e\xb6\xb8\x65\xba\x9a\xce\xf2\x09\xe9\x58\x53\x0d\x9d\x31\xcd\xa2\x38\x5d\x0f\x9d\x99\xdd\x78\x47\xf2\xe8\xe4\x74\xfb\xf8\xf4\xe2\x74\xfb\xc5\xc5\xce\xab\xe3\x8b\xd3\xc3\xc3\x57\xa7\xfb\x47\xa3\xf6\x2f\xfb\x3b\x87\x07\xa2\x78\xe7\xd5\xe1\xc9\x5e\xbb\xb8\xb3\x1f\xf1\x7a\x6e\xef\xe0\x74\xa9\xc6\xc9\xd1\xf6\xc1\x48\xdc\x5b\xcd\x84\x9c\xb4\xbf\x2b\x24\xd7\x6d\x38\x8f\x72\x8c\xe6\x7b\xf2\xa1\xd4\x1c\x52\xb4\x6c\x43\xd1\x35\x5c\x67\x8d\x51\x17\xa9\x15\xdf\xff\xc3\x5a\x2e\xc0\xcb\x55\x7e\x6d\x17\xfd\x8c\xf1\x08\x67\x1f\x8b\x56\xc5\xf7\xaa\x23\xd2\x2a\xfa\xb5\xb3\x6c\xa9\xab\x5f\x6b\x9d\xd7\x6a\x59\x25\x8f\xec\xd7\x48\x29\x5c\x2c\x94\x30\x27\xa5\xba\x0a\x49\xb1\x5b\x98\xe6\xd2\x75\x3c\xc9\x89\xde\xa5\x9a\x4d\x5c\x5b\xb3\x0d\xcf\x61\x44\x35\x6d\x60\x84\xa8\x86\xa9\x19\x69\xa1\x0d\x1e\xb3\x3c\x0b\x6b\x59\x6d\x4b\xa5\xba\x66\x98\x96\x69\xe9\x94\x6a\x04\x53\xac\x8e\xa4\xe5\x41\x9c\x2c\x44\x90\x0d\x12\x5c\xcf\x92\x5b\xc1\xd6\x03\xf4\x77\x0d\xc4\x60\xb1\x50\x82\x06\xb5\x67\x2e\xa9\x65\x6a\x77\x4c\x4a\x4d\xaa\x01\xa5\x04\x33\x0f\x5b\xae\xe1\x38\xdc\x56\x55\xcf\xd3\x99\xe6\x60\x6c\xeb\xd8\xd0\x75\x9a\xd5\xc6\x84\x60\x0b\x13\x9d\xaa\x54\x63\xd4\x50\x75\xaa\xfd\xa0\xd4\x9e\x4f\xf6\x07\xa1\x76\xdc\x22\x77\xd2\x26\xf7\x56\xd1\xcf\xe4\x5b\x92\x3b\xe9\x22\x77\x5c\xd1\xfb\x4d\x8d\x98\xfc\xc5\x42\xf1\x1b\xf4\x5e\xe1\xb7\x4d\xef\xdc\x70\x4d\xd5\x4b\xe9\xc3\x30\xb8\x78\x2c\x67\xa9\x9a\xc7\x74\x83\x72\xcc\xb1\xee\x50\xcc\x0d\x5d\xd7\xed\x9c\xde\x19\x33\x89\xa6\x59\x4c\x23\x26\x25\x06\x2d\x88\xbd\x1a\xa1\x9b\xd8\xed\x1a\x7c\xd3\xc5\x42\x99\x76\x11\x7b\x2c\x1c\xb0\x75\x82\xc7\xa6\x43\x74\xcd\xc6\x8e\xad\x9b\x84\x51\xd3\xb3\x54\x66\x01\xc1\xb6\xa9\x83\x49\x3d\xd7\x32\x00\x08\x05\x9e\x6b\x37\x8d\x5a\xa6\xaa\x52\x9d\x30\x5d\xd3\xa8\x6e\xaa\xec\xc7\x26\xf8\x7c\xc2\x3f\x02\xd1\x93\x16\xd1\x6b\x6d\xa2\x6f\x15\xfd\xac\x7d\x4b\xa2\xd7\xba\x88\x9e\x54\x44\x7f\x5d\x23\x2a\xbe\x58\x28\xbc\x8b\xe8\x73\x1c\xb7\x09\xdf\x03\x83\x18\x4c\x27\x5c\xf5\x54\xec\x71\xdb\xc2\xd4\x72\x39\x71\x35\xaa\x59\x44\x65\x36\xb7\x31\x53\x99\xca\x72\x93\x0d\x5b\x06\x61\xd4\xc2\xaa\xa9\x1b\xa9\xfd\x80\xf5\x25\xda\xcf\x07\xea\xa6\xff\xcb\x1a\xa8\xce\x62\xa1\x38\x0d\xfa\xaf\x9f\x22\x2c\x89\x7c\x20\x98\x52\xee\x78\xa9\x81\xcc\x6d\x4b\x75\x2d\xd5\xe3\xa9\x61\xa6\x83\x6a\x61\x6e\x83\xae\x9a\x9a\xa7\xe7\x50\x1a\x2a\xd5\x75\x53\x53\x99\xc9\x28\xc3\x86\xa6\x1b\x3f\xaa\xc8\x6f\x4c\xf9\x07\x11\xfc\xb4\x5d\xd2\xa6\xbf\x56\xd1\xcf\x94\x7c\x43\x1e\xa0\x5d\xb5\x68\xb5\x19\x38\xaa\x11\x56\xbc\x58\x28\x71\x3f\x61\x75\x8a\x7f\x03\x28\xd8\x8e\xaa\xbb\x86\xa5\x1a\xb6\x61\x50\xcb\x52\x5d\x0a\x04\x5c\x6e\x01\xe6\x4c\x65\xdc\x61\x54\xcb\xc5\x3f\xa6\x04\x53\x8b\x12\xd3\xc4\xd8\x64\x4c\xa5\x06\x19\x49\x27\x4b\x83\x74\x73\xc0\xab\x1a\xa0\xf3\xc5\x42\x99\x37\x00\x85\xe0\xc6\x8f\xc2\x2c\xbe\x4c\x9d\xfa\xa9\x83\x19\x38\x16\x05\xce\x5d\x66\x39\xcc\x50\x39\xe7\x1c\x5c\xcf\x60\x06\xd1\x88\xc5\x4d\x97\x98\x34\x87\xce\x34\x2c\x9d\x62\xa2\x63\x93\x32\x4c\x89\x69\xe0\x9e\x6d\xd5\xbf\x94\xfa\xab\x17\x58\x19\xa9\xef\xd5\xa6\x5e\x72\x41\x0b\xea\x0b\x3c\x92\xf2\xa7\x4c\xc3\x8e\x86\x7e\x2c\x76\x5d\x01\xbf\x86\xe2\xa9\x5b\xb5\x9f\xcf\xa3\xae\xce\x63\x70\xbf\x2b\x3f\xb1\x76\x49\x9b\x96\x5b\x45\x3f\xb3\x07\xf1\x93\xfa\x50\x0e\x63\x5d\xb5\x58\xc5\x61\x2f\x6a\x84\x7b\xba\x58\x28\xa7\x75\xc2\xcd\xf0\xdb\xc1\x56\xc4\xa0\x9e\x85\x99\x69\x10\x46\xb8\xee\x30\x46\x6c\xc3\x56\xa9\xc7\x3d\xe2\x69\x1a\xb7\x99\x4e\xc1\x71\x73\xb1\x4d\x0c\x46\x2d\xcb\xd0\x35\x4b\x25\x96\x66\x51\x66\xe0\x51\xf7\x22\x97\x23\x65\x4c\x75\x76\xa6\x21\xb9\x74\x86\xca\xe7\xe8\x4c\x16\x11\x48\x65\x24\xf3\x29\x44\x89\x24\xfe\x7f\xec\x07\x5e\x28\x23\x39\x0a\xa7\x50\xfc\x22\x23\x8a\xe4\x60\xb2\xef\xa5\x8d\x34\x24\xb7\xce\x30\xf3\xf2\x60\xa9\x28\x7f\xb5\x13\x85\x1f\x6a\xdf\x9c\x70\xfa\x18\x13\xb9\xfa\x12\x5f\x3f\xd6\x6b\x5f\xa7\x93\xc7\x34\x07\xae\x7a\xd7\x90\x3f\x32\x91\xe5\x73\x74\x82\xce\x64\x1e\xf9\xfc\xf1\xd4\xbf\x11\x10\xc6\x31\x44\x49\xfe\x19\xe3\xdb\xd3\xec\xd1\x48\x7e\xb5\x37\x6d\x83\xe4\xf8\x92\xcf\xd2\xdf\xd3\xb9\x3d\x76\xfc\xc8\x11\x73\x8b\xfd\x4f\xe9\x1f\x42\x8a\xe1\x8e\xc2\xd8\xcf\x1c\x91\x72\x12\xce\x1e\x47\xfe\xe4\x32\xc9\x20\x3b\xc9\xaa\x4e\x27\x02\x15\xe2\x4d\xc1\xe1\x0c\x82\xa2\xe1\x7e\xf6\xb2\x24\x1d\x2a\x45\x70\x7e\x5a\x91\x5d\x9b\xac\xc5\x32\x92\x67\x53\xee\xc0\x65\x38\x75\x05\x60\xa7\xc5\xa6\x2f\xed\xa6\xe8\x36\x7b\xaa\x70\x8e\xfe\xde\xa0\xe7\x2a\xee\xd4\x52\xcf\x3b\x85\x85\x2d\x9f\x23\xbb\x73\x6e\x53\xf0\x36\x9b\xda\x11\x8f\xe3\x0f\x61\xe4\xae\x86\xa1\x08\x6c\xd5\x0d\x47\xfe\xeb\x39\xba\xdc\x60\x52\xcb\xd1\xa1\x96\xba\x5c\x52\x20\x4b\x84\x45\x53\xca\x15\x67\x1d\xb5\xd7\x4a\xe7\xe8\x55\x36\xee\x49\xfe\xbc\x2f\x1d\x38\xc8\x46\xab\x47\xf6\xea\x00\xa6\xf6\x73\x4e\xe2\xc5\x53\x79\xc1\x11\xcf\xc3\x14\xa4\xe2\x75\x5c\x9d\xa3\xe2\x99\x1f\x04\x10\x49\xf9\xdf\xc7\xf1\x75\x83\x89\xfa\x28\xb8\x31\x95\xb4\x9e\x9f\xc2\x65\x27\xc1\xb2\x37\x33\x77\x2a\x8a\x16\x76\x12\xe4\x95\x66\x91\x7f\xcd\xa3\xdb\xfc\x5b\x59\x47\x13\xbd\xe6\x0f\xaa\x65\x24\xbb\xe5\x71\xbf\x2c\x1c\x73\xf2\x39\x9a\x34\xd0\xa8\x77\xa3\xb1\x92\x6d\xb3\xc5\x42\x99\x35\x94\x72\x7e\xc2\x54\xd3\xc7\x3a\xb8\x98\x7a\xd4\x76\x58\xba\x01\x74\x08\x25\x98\x7b\xcc\x70\x74\xdb\x61\x8e\x86\xb1\x4b\x54\x4e\x6c\x0c\xf9\x7e\xcc\xb2\x88\x65\x1a\x2a\xb3\x34\xcc\x88\x69\x99\xda\xbf\x83\x3e\xce\x67\xbd\xa1\x2a\xfe\x9e\xfa\x54\xd7\x5b\x25\x46\x4b\x73\xb5\x8a\x7e\xd6\xcd\xef\xaa\x4f\xab\xe1\xea\x50\xe9\xa5\x3e\xed\x63\xdb\x22\x5a\x5e\x07\xcb\xe6\x3f\x55\x4c\x96\xab\x0e\x7b\xca\x83\xab\x54\xfa\xf9\x89\x90\xfe\xd9\xf7\x8c\xab\x6f\x56\xf1\x74\x9f\xde\x9a\x4e\x1e\x9b\x62\x18\x4f\xb4\x88\xe3\xcb\x8b\x2b\xb8\xad\xf1\x70\x5d\x75\xe5\xd2\xf4\x14\x3e\x26\x3c\x02\xde\x2b\xfc\x1a\x11\xf4\x96\x44\x5f\x2a\x2a\xea\x33\x8a\xe3\xcb\x5a\x7c\x82\x86\xf0\x10\x80\x06\xe1\xe3\xc9\x3c\x49\x20\x8a\x2b\x3d\x35\xf5\x03\xc8\xf4\xe8\x99\x9c\x45\xef\x95\x23\xee\xfa\x61\x36\xaf\xe3\xfc\x63\x0f\x62\x3b\x62\x01\xca\x85\x91\x91\xb5\xca\x11\x59\x8b\x70\xa9\x55\x32\xe6\x9b\x8e\x58\xc4\xcf\x6c\x8c\x57\x48\xe3\xc2\x0a\x69\x88\xe0\xa6\x85\x83\xcb\x4f\x72\xcd\x0e\xca\x96\x3f\x2f\x48\xe0\x3a\x6e\x95\xa4\xeb\x90\xf0\xc4\x77\x9a\xbf\x38\x61\xf0\xf8\x43\xc4\x67\x33\x21\x38\xcf\xba\x2d\x90\x46\xf5\x46\xfb\x04\x3e\xa6\xfa\x72\x67\x73\xbb\xe4\x1c\xed\xa3\x9b\x8d\x55\xfd\x39\xba\x46\x47\x0d\x85\x76\x8e\x5e\x88\xf1\x73\x85\x55\xa9\xb0\x54\x75\xd5\xb9\xa4\xae\x06\x2e\x16\x0b\xe5\x62\x59\x0d\xcc\x7d\xbb\xc3\xc8\xc5\x9a\xe7\x52\xc7\xf6\x28\x21\x8c\x71\xdd\x33\x2d\xa2\x73\x93\x1b\x54\x35\x6c\x6e\xb8\x8e\xce\x9d\xd4\x10\xf6\x72\x93\x18\x13\x42\x4c\xc3\x54\x69\x6a\xeb\x52\xc3\xc0\xa5\x91\x9b\xdd\x70\xe8\xb0\x6f\x2b\xb0\xdc\xc5\x42\x71\x9b\x7b\xdb\x06\xab\x74\x80\xe7\xe8\x9c\x10\x0b\xeb\xa6\xe5\x6a\x26\x77\x6c\x0e\x06\xa3\x9a\xe3\xa5\xdb\x46\xcf\x35\x3c\x4b\x63\x86\x6a\x72\xa7\x38\x93\x53\x4d\xa6\x62\x93\x9a\x1a\x31\x28\x66\x54\x57\x47\xcb\xe1\x42\x3a\x0c\xf0\x26\x83\xd6\x11\xb9\xb7\x58\x28\x7b\x4b\x88\x6c\x04\xda\x10\x9b\xb5\x9a\x72\x65\x8c\x1a\xd8\x35\x18\xe7\x9c\x3a\xb6\x61\xda\xd8\x31\x4d\xd3\x25\xd4\xd2\x74\x4c\x41\x03\xcb\xe6\x00\xba\x57\x28\x57\x83\x50\xcd\xc0\x58\x13\x90\x33\x82\x8d\x1f\x57\xb9\xa6\xfb\xd1\xbe\x78\x23\x3f\xa0\xa2\x65\x2d\x3d\xdb\x56\x68\xcb\x5a\xd6\xf8\xae\x4a\xd6\xe8\xda\xb3\x6e\xa0\x62\x3b\xaf\x66\xae\x13\xd3\x65\xcd\x3a\x79\x1f\x2c\x16\xca\xc1\x2a\xf2\x6e\x33\xa4\xc5\x3d\x30\x4c\xcf\x34\x34\x6e\x9b\x94\x72\xd5\xc1\x26\xe1\x8c\x6a\x00\xb6\x46\x5c\xd7\xb3\x2d\x17\x5c\x92\x33\x24\xb6\x2c\x6c\xe8\x16\x25\x26\xd3\x08\xb5\x2c\x8b\xb0\x4a\x5e\xe4\x23\x09\xf0\x56\xca\x8d\xc3\xc5\x42\x39\xbc\x0f\x17\x5a\xae\x6a\x68\xae\x6b\xe9\xae\x4a\xb9\x0e\xaa\xed\x61\x13\xb0\xa9\x12\x6c\x73\xcf\x52\x1d\xac\x31\xb0\x68\xe1\x70\x25\x26\x36\x4d\xa2\xea\xaa\x49\x19\xc6\x96\x45\xb5\x1f\xd5\xe1\x5a\x77\x0d\x05\xf0\x61\x19\x0d\x99\x8b\x28\x8f\x78\xf4\xff\x51\x6e\xfb\x7a\xbc\xb5\x72\xb7\xdb\x19\xce\x79\xc9\xee\xeb\x20\x42\x61\xe7\x64\xf1\x2c\x52\xeb\x22\x80\x0f\xc7\x93\x20\xb3\xeb\x2a\x72\x3e\x5e\x2c\x94\xe3\xb5\xe4\xdc\x66\x3d\x1b\x74\xcf\x66\x9a\x61\xdb\xaa\x0e\x2e\xe7\x96\x6a\x11\xc3\x24\x5c\xd7\x55\x55\xb7\x75\xcb\x25\x9a\x6a\xbb\x60\x65\xb5\x29\xc5\xa6\x96\x6a\x16\x95\x30\x5d\x33\xb1\xc1\xc8\x68\x99\xe9\xd2\xc9\xf6\xb8\x7a\x2b\x70\xb7\x17\x0b\x65\x7b\x2d\xb8\xd5\xfd\xd6\x9a\x03\x8d\x72\xdd\x31\x34\xe6\x82\x4a\x74\xe2\xd9\x96\x4a\x35\xd3\x34\x0d\x4f\xa3\x84\x5a\x36\x56\x4d\xdb\x32\x1c\x35\x3f\x86\x67\x44\x37\x88\xa9\x31\x42\x75\x4a\xb0\x8e\x09\xb1\xba\x01\x4e\x57\x8b\x0b\x4f\x9a\x9f\x67\xb1\x5a\x06\xd9\x5b\x2c\x14\x6f\x2d\xc8\xee\x7c\x36\xf5\x1d\x9e\x40\x05\x31\xb5\x2c\xc7\xd1\x52\x64\xaa\xd4\x65\xaa\xe1\xe9\x90\x9a\x3a\xc0\x4c\x83\x02\x10\xcd\xd2\xec\x54\xbd\xe3\xe2\xe2\x00\x26\x06\x61\x3a\xb5\x18\xd5\x4c\x5d\xd3\x2c\xb3\x1b\x62\x3e\x8d\x80\xbb\xb7\x99\xfa\x8c\x33\x70\xcf\xef\x50\x02\xd7\xb3\x29\x4f\x60\x29\x83\xc6\x72\xac\x19\x4f\xbc\xd0\xaf\x05\x39\x42\x61\x82\x0c\x54\x04\x8a\xc1\xf5\x50\x3b\x7c\x36\x13\x37\xaa\x1e\xa7\x8d\x1e\x37\x1c\x7f\xa8\x8a\x5b\xaa\x65\x15\x33\x9b\xb6\x59\x49\x2b\xe3\xb5\xd0\x56\x20\x1a\x56\x04\xa2\x29\x4b\xf4\x35\x71\x68\x8c\x8e\x38\x34\x26\x32\xca\xdf\xad\x9e\x30\x34\x45\xe0\x96\xe5\x38\x34\x18\xa3\xe0\x8b\x02\xd1\x88\xce\x49\x19\x89\x06\x57\x01\xa5\xb0\xb6\x26\x56\x0c\x45\xfe\x03\x22\xbb\x88\x00\x3e\x6d\xc4\xe1\x75\x98\xc3\x5d\xa8\xc3\x26\xc2\x55\x0c\x1f\xdc\x87\x3d\xd2\x83\x3d\x82\xd1\xf4\x8b\xb1\x47\x6a\xd8\xd3\xaa\xd2\x35\xd8\x23\x14\xf1\x07\x62\x8f\xb4\xb1\x47\x72\xec\xcd\x72\x27\x68\x17\x02\x49\x17\x02\x89\x89\x70\x45\xcf\xa4\x0f\x81\x5a\x0f\x02\x35\x8c\x9c\x55\x08\xc4\x6c\x13\x0c\x6a\x35\x0c\x56\x71\xb2\xb4\x35\x18\xd4\x28\x8a\x1f\x1a\x59\xa8\x0c\x0b\xc5\x5a\x3c\xad\xe9\x2d\xec\x6a\xc6\xba\xe8\x52\x66\x07\x6a\x35\x0b\xe1\x8a\xb1\xa9\xda\x83\x5a\x8a\xbb\x51\x4b\x09\x9a\x7f\x31\x6d\x52\xad\xc2\xac\x59\x95\xd2\xd5\x98\xa5\x0c\x9d\x3e\x90\x36\x69\x81\x3d\x5c\x85\xc8\xa3\xc6\xba\x28\x7b\xb4\xc4\x5f\x15\x9c\xcb\x42\xa4\x8a\x3e\xcd\xfa\xb0\xc7\x7a\xb0\xc7\x08\x9a\x7d\x71\xa0\x3d\xa6\x55\x91\xf6\x48\x15\xd2\x8a\x51\x74\xb1\x14\x53\x8f\x90\x66\x6b\x51\x8d\x21\x77\x73\x2c\x8a\x16\x3a\xda\xcb\x5b\x64\x91\x46\x89\xb6\x02\xd5\xcc\x68\xeb\x23\x33\x2f\x22\xb5\x32\x0b\xc9\xf6\x3c\x49\x04\x98\xac\x0a\x32\x96\x39\x9f\x3a\x82\x8c\x25\xc3\xd6\x6b\xcd\x22\x96\x98\x88\xd6\xad\x22\xa2\x6f\xc2\x5b\x3a\x6e\xc1\xa7\x17\x51\xc4\x49\xc5\x18\xba\xb6\x8e\x3a\x74\xda\xa2\x0e\x9d\x21\x52\x05\x7f\xd3\xf5\xbe\xe0\x6d\x46\x37\x75\xe8\x26\x3a\xf8\x62\xea\xd0\xad\x1a\x75\x54\x11\xae\x0d\xb5\x33\x10\xa3\x81\xd1\xe1\x06\x81\x18\x0d\xb2\x9a\x35\x0d\x0d\x1d\xdf\x8f\xa8\x0c\x8a\xb6\x37\x27\x2a\xa3\x2d\x10\x8d\x82\xa5\xb5\x4a\xd3\x1a\x39\x62\x93\xdc\x4d\xdc\x69\xea\x54\x42\x51\xcb\xf5\xe2\xfc\x8d\x62\x54\x72\xc1\xec\x63\x6a\xb3\x87\xa9\x4d\x82\xbc\x7b\x88\xc4\x06\x62\x4d\x0d\xc9\x49\xe9\xd4\xd6\x68\xf5\xc3\x1a\x61\x68\x32\x34\xf9\x52\x35\x63\xea\x2d\xac\x9a\x39\x06\x85\x8b\xb9\x86\x3e\xa4\x55\x7a\xc7\x6c\x8a\xc5\x14\x7d\x66\x85\x3e\xab\x0f\x7d\x56\x0f\xfa\x2c\x82\x76\x1e\x82\x3e\x31\x98\x56\x07\xb7\x70\x18\x57\x3f\xd3\x52\xcf\x68\xfa\x46\x32\x66\x55\xd0\x95\x8e\xe1\x59\x0b\x13\x96\x8e\xe4\xb5\x71\x7f\xbb\xa2\xfa\x96\x7d\x1a\xab\xa7\x54\x85\x67\xd4\x8c\x87\x4d\x29\xdb\x26\x77\x4f\xc8\x6a\x4d\x08\xab\x2a\x92\x77\xea\x41\x8a\x37\x9f\x0b\x56\x71\x6f\x08\xce\xac\x6f\x82\xe4\xd7\xf3\x38\x91\xe2\x12\x65\x99\x18\x12\x9e\x4a\x08\x12\x88\xc4\x03\x86\xcb\xe5\x9d\xe1\xa3\xbe\x61\x1b\x42\x06\xab\x1a\xba\x49\x10\xd6\x50\x91\x14\x42\xab\xed\x51\x54\x8a\x5e\x25\x08\x53\x44\x9b\x3f\x56\xe1\x61\xb3\xed\x9d\x88\x83\x58\x5d\xfc\x40\x49\xf5\x24\x4e\xd4\x5f\x8a\x98\x28\x0e\x48\xd0\xa3\xa4\x15\x7b\xa9\xab\x72\xfb\x2a\x08\x4a\xda\x6f\xdc\x3b\x87\x59\x6a\x94\x25\x9f\x7c\xee\x4f\xa1\xb3\x65\x36\xb5\xd9\x1f\x6f\x95\xa4\x15\x95\xb2\xb8\x61\x91\x75\x9e\x9c\xe6\x95\x97\x82\xd8\xd6\x23\x41\x26\xeb\x42\x51\x1a\x2b\x86\x2b\xae\x5d\x94\xc3\xe1\xef\x31\x5e\x76\x89\xa2\x1c\x93\x7c\xf9\x98\xab\x50\xda\xbc\x85\x51\x8e\x9a\x27\x33\xf9\x56\x33\xad\xae\x5b\x94\x23\xd2\x6a\x44\x52\xa7\xd1\x3c\x20\x71\x52\x8f\x1e\xd9\x45\x66\xf7\x82\xad\xc5\x05\xc9\x52\xe4\x98\x9e\xd9\x97\x57\x2b\x92\x46\xc4\x8a\x81\x52\xbb\x6a\x91\x0c\x5b\xe1\x16\x94\xc1\x62\xb1\x96\xcd\x32\x4c\x2d\x57\x7a\x5a\xbc\xa5\xda\xdb\x95\x47\xe5\xbb\xaa\x12\x6b\x79\x00\xeb\x75\xab\x9c\x9d\x95\x57\xad\x58\xd7\xfc\x6a\xb8\x8e\x96\xb0\xd0\x13\xf5\xf9\x2b\xe2\x39\x83\xa8\x08\x7b\xde\x41\xa7\xb5\x03\x73\x11\x0e\xbd\x68\xa8\x3f\x10\x34\xba\x66\xc0\x8e\x33\xe9\xc6\xb8\x98\x2e\xcf\xad\x3a\x0c\x1f\x8f\xc7\x49\x67\xb4\xab\x5e\xbc\x14\xc7\xda\xbd\x2d\x07\x77\xc8\xf5\x23\x70\x12\xff\x06\xe2\xd1\xd9\x73\x18\x5e\xfc\x85\x9e\xc3\xf0\xf7\x57\xe9\xff\xf1\x04\xfd\x09\xc3\x43\x86\x20\x19\x9e\xa0\x24\x19\x86\xe8\x35\x0c\x5f\x30\x96\xfe\x79\x3d\x79\x99\xfe\xf9\xfd\xfa\x9f\xf4\xcf\xfb\x9b\x57\x28\x4a\x86\xe2\x73\xf0\x5e\xf4\xf1\x5c\x7c\xf9\x78\x7c\x24\x3a\xfc\x3d\xfd\x7f\x9e\x96\xec\xbc\xd6\x45\x8b\x2b\x2b\xfd\x33\xb9\xfe\x33\xfd\xf3\xf2\xfd\x61\xfa\xc7\x3d\xbd\x49\xeb\xed\xfd\x9e\x7e\x09\x93\x77\xe9\xf8\xf1\x44\x0c\x77\x64\xa7\x7f\x9c\x9d\xb7\x69\x85\xbf\x0e\xd2\xff\x5f\x46\x69\xd1\xab\xed\xa3\xf4\xcf\x9f\x7b\x02\xac\xdd\xed\xf7\xe9\x9f\x3d\xf8\x23\xad\x71\x91\x7e\xe6\xb1\xa8\xfd\x87\x91\x7e\x79\xfb\x7e\x3b\xfd\xb3\x6f\x7d\x4a\xff\x7c\xda\x7d\x7e\x8e\xe2\xe4\x76\x9a\xce\x5e\x1e\xd6\x8d\xe7\xb3\x8b\x60\x92\x1b\x61\x8f\xff\x73\xe7\xf0\xf5\xd1\x7f\x9e\x7f\xfe\xe0\xbb\xc9\xe5\x88\xa9\xea\xec\xe3\x93\x4b\xf0\x27\x97\xc9\x08\x13\x75\xf6\xf1\x2e\x0f\x56\xf3\x38\xdb\xd2\x75\x35\xcd\xf3\x63\x8c\xbc\x29\x7c\x7c\xc2\xa7\xfe\x24\xc8\x6e\x04\x88\x82\xc7\x10\xb8\x4f\xae\x79\x34\xf1\x83\xc7\x76\x98\x24\xe1\xf5\xe8\xf1\x90\xc1\xf5\xdd\x70\xf9\x1a\x55\x57\xd7\xb3\xfc\xc0\x7e\x14\xc1\x94\xa7\x2b\x79\x37\xcc\x0f\xdf\x57\xd6\xe6\x76\x1c\x4e\xe7\x09\x3c\xc9\x47\x54\x9f\x4c\xc1\x4b\x46\x2c\x9d\x8f\x7c\x7e\x37\x40\x93\x3b\x65\x80\xde\x8a\x94\x55\xcc\xb2\x2c\xad\x16\x28\xf8\xfd\x9a\xf0\xfe\xb8\xe6\x42\x2c\x8a\xaa\x6c\x11\xc5\x7e\xb3\xe6\x88\x29\x0c\x94\xba\x3f\xa4\x6e\x2f\x63\xab\x6d\x5e\x95\x59\xab\x72\x97\x44\x96\xb5\x8a\xac\xb5\xfd\xd7\xc7\xbf\xd7\x4b\xa1\x27\x82\x40\x8a\x3b\x73\xe2\x1c\x26\x1e\x06\xe1\xfe\x35\x9f\xc0\xf6\x14\xa2\xe4\x75\x16\xa9\xa7\x12\x80\xf5\xb8\xf4\xb7\x3f\x30\x8a\xc8\x37\x46\x51\x70\x9a\x1f\x19\xac\x47\xd3\xee\xbd\xa2\xcd\x13\xed\x2b\x23\x2d\x77\xc9\x6c\x82\xb4\xb5\xd9\xd0\xf2\x93\x84\xd2\xad\xb3\xc9\x96\xab\x23\x76\x7c\x3b\xc4\x53\x30\x9f\x4e\xef\x4a\xf8\xcd\x06\xfc\x46\x07\x30\x6b\x22\xb4\x57\x4b\x17\xf6\xd8\xda\xad\x55\xfa\xd8\x9b\x68\x45\xdf\x20\xcd\x02\xa9\x90\xff\x35\x32\x22\x2d\x91\x5b\x18\x0b\x8e\xcc\x2f\x6e\xef\x64\x83\x96\xd3\x68\x64\x5d\xf9\xd4\x31\x8d\xdb\xe0\xa3\xa2\xd6\xa7\x50\x7a\x0f\xad\x72\xa3\xb6\xc4\x2f\xcf\xfe\xb8\x5a\x9d\x88\xa5\xa5\x8c\x7b\x12\x64\xad\xce\xc7\x72\x55\x4f\xea\x90\xe3\xaf\xe1\xf1\xd7\xd4\x5a\xda\x86\xe7\xdd\xb5\x33\x4a\xd6\xf0\x40\x44\xa4\x7f\xdd\x8a\x0e\x0f\xf7\x89\x0e\x5f\x92\x6d\x2d\x28\x7c\xd2\x9d\xaa\xbd\x3b\x6a\x7a\x5a\xf3\xa8\xb1\x7c\x1d\x11\x28\xf2\x48\x7c\x22\xc0\xf1\x68\x29\x2c\xfa\xe1\xc9\xc5\xfe\xeb\xed\x17\x7b\x27\x48\xfc\x9c\x05\x2d\x4e\x77\x7d\xcf\xb9\x3f\x9d\x47\x8d\xe0\x2e\x3b\x87\x07\xcf\xf7\x5f\x5c\x3c\xdf\x7f\xb5\x77\xb1\xff\xfa\xe8\xf0\xf8\xf4\x62\xef\xf8\xf8\xf0\x78\xb9\xe9\xc9\xdc\x71\x20\x8e\x57\x37\xdd\xdb\x45\x1d\xa2\x7f\x24\xcb\xa8\x93\xfe\x46\xa5\x17\x44\xb2\x79\x0c\xd2\xe1\x89\xe4\xa7\xb5\x96\xd2\x3e\x15\x27\xae\x7e\x1e\x7c\x59\xf2\x83\x24\xec\x7c\x9c\xb6\xef\x49\x41\x28\x39\xe1\xf5\x8c\x27\xbe\x3d\xad\xf5\xe8\xc7\xd2\x2c\x82\x18\x82\x04\xe5\xfd\x88\x3c\x4a\xa2\xa7\xbc\x93\xc0\xcd\x43\x28\x24\x97\x20\x1d\x83\x17\x41\x7c\x29\xe5\x72\xea\xae\x88\xb7\xf1\x36\x19\xce\xab\x10\x28\x5d\xf1\x36\xf2\x58\xa0\xad\x4c\xf6\x65\xf4\xb6\x3c\x46\xc4\x4f\x30\x0c\xd8\x27\x05\x06\x83\x81\x12\x2d\x16\x30\xb8\x4b\x2d\x09\xe8\x0b\xbe\x01\x7d\xc1\x37\xc2\xf8\xb1\x98\xe2\xda\xe0\x1b\x84\x64\xb1\x37\x30\xee\x89\xbd\x01\x28\x41\x11\x0a\xcb\xd9\xd5\xde\xd9\x4c\x16\x0b\x65\x92\x1f\xc2\x87\x71\xb1\x4a\x7e\x32\xcd\x6f\x96\x3b\x94\xb8\x2e\x98\x1a\xe8\xd8\xd2\x19\xf5\x2c\x4d\x23\x96\x4b\x2c\xea\xba\x26\xf5\x5c\xa6\x33\xae\x02\x2f\x2e\xe9\x98\xd8\xd2\x34\x4d\x37\x4c\x93\x51\xaa\x51\x43\x23\xc6\x28\x5d\x2a\x41\x22\x59\x56\xaf\x97\x73\x1b\xa2\x00\x12\x88\x37\x8f\xc3\x91\xd4\x00\xde\x59\x2c\x94\x9d\x65\x80\xaf\xcc\x58\xba\x81\x28\x16\x59\x38\x5b\xb1\x38\x5c\xdb\x50\x19\x76\x6c\x55\x35\x5d\xcf\xd0\x5c\x57\x77\x55\x15\xbb\x54\xb5\x74\x17\x13\x62\x12\xdb\x74\x6d\x0a\x45\xe8\x0a\xaa\x6b\x9a\xa5\x32\x93\x11\x9d\xe8\x1a\xd6\x99\x7a\x8f\x90\x21\x51\x0d\xd4\x93\xc5\x42\x39\xb9\x1f\xa8\xdc\x74\x4c\x0a\xcc\xe3\x94\x61\x0d\x6b\x2a\x53\x2d\xb0\x2c\x82\x1d\xae\x19\xae\xaa\x79\x98\x31\xcf\xd5\x78\xbe\x38\xd4\xa0\x1a\xc5\x3a\xb5\x2c\xcd\xc4\x16\x25\xa6\x45\xee\x01\x6a\x58\x03\x75\x7f\xb1\x50\xf6\x73\x50\xcb\x38\xa5\x61\x2c\x4d\xfd\x38\x91\xbc\x4c\xb8\x74\x80\xcb\x5c\xd3\x02\xcf\x65\x0e\x71\x4d\xcd\xc4\xdc\xe2\x2e\x35\x2c\x55\x37\xc1\x23\xa6\x78\x36\xce\x6d\x53\xe3\x45\x98\x04\x53\x3c\x67\xd4\x88\x41\x2d\x4b\x37\xa8\x6a\xe1\x7b\x80\xbb\xe1\x0b\xac\x0f\x3c\x0a\xb2\xbb\x76\xbd\x8f\xb0\x3a\xdb\xb9\x3c\xc8\x5e\x3c\xf5\x37\xcb\xee\x8f\xc3\x8d\xb8\x3f\x4e\xe4\x73\x04\xe2\x56\x6a\xc1\xa7\x8d\xeb\x43\x7f\x2f\x16\xca\xdf\xcb\x6b\x5f\xbb\xfc\x66\x70\xd5\xf6\xb0\xed\xba\x3a\xd3\x38\xd5\x55\x8f\xea\x9e\xa7\x61\xdb\x70\x6c\x30\x99\xa6\x79\xae\xeb\xa8\x8e\x91\xbf\xb7\x37\x2c\x43\x33\x2c\xd5\x52\x35\x4d\x37\x75\xa2\x12\xad\x87\x26\xff\xa5\x97\xdf\x3a\xaf\x95\x7e\xd7\x78\x12\xed\x92\x8e\x5b\x68\xad\x67\x90\xf8\xfb\x3e\x83\xc4\x9d\xb5\x6a\x84\xfe\xc3\xbd\xd0\xeb\xb8\xe0\x9a\xab\xfd\xce\x6b\x79\xe5\x6f\x1a\x92\xb3\xa0\x79\xf7\x78\x50\xd2\xf3\x34\x2c\xe7\xca\x62\x77\xd1\xec\x2c\xca\x75\x7a\xc1\x68\x29\x6f\x27\xdc\xf6\x03\x17\x3e\xca\x48\x56\xc5\x63\x81\xbc\xd2\xe3\xec\xc1\x57\x6a\x32\x24\x4b\x0f\x1e\x0a\x34\xe6\x35\x97\x47\x29\x7b\x97\xa6\x21\x77\xc1\xed\x12\x0e\x79\xd5\xdc\x1f\x57\x1e\x5b\x64\xcf\x28\x36\x7b\xdc\xb6\xe6\x65\x45\x21\xdf\xbe\xfa\xe3\x0a\xf8\xe8\x4c\xf9\xb5\x10\xee\x8f\x93\xc8\xe7\xc1\x64\xa3\x57\x16\xa9\x65\xb1\x16\xe8\x5c\xb8\xf6\x0d\xd7\xf7\xa4\x23\xac\x5e\xbd\x74\x2f\xfc\xce\x34\x8c\x8b\x87\x7f\xe2\x53\x63\x3d\x45\xd5\x4b\xdf\x75\x41\x90\x7c\x24\x9e\xba\x14\xe3\x67\x0d\xee\xc1\x19\xe7\x4b\x2f\x3e\xee\x4f\x2f\x9b\x90\x49\xef\x23\x92\x2f\xb9\x89\xf8\x3e\x41\x06\xc2\x8d\x9b\x88\xe2\xba\x17\xba\xed\xfe\x41\x43\xbb\x09\xb2\xca\x1f\xaa\x23\x76\x8a\xe4\x4b\x5a\x5c\x3f\x3c\xd9\xbd\x51\x58\x7e\x7a\xbc\xfd\x2a\x54\xf4\x54\x58\xdd\x06\x8e\xdc\xe9\x17\xe8\xbc\x4e\x51\xbb\xcf\xd4\xbe\x6d\x63\xa1\x5a\x86\xd5\xbe\x73\x65\xdc\x38\x57\x36\xaa\x49\x13\xf4\x71\xd5\x6d\x0a\xb3\x63\x0b\xde\x02\x1b\xd7\xee\xda\x58\x35\x77\x46\x1e\x77\xb3\xeb\xbc\x35\x0c\x32\xdf\x72\x9c\xc9\x4c\x70\x8b\x93\x56\x01\x2c\xad\xf6\xd7\xb8\xb6\x40\x0c\x7d\x4a\x61\x25\x29\x79\xd5\xb1\xb3\x7c\x90\x2f\xfa\xd0\xfb\xaf\x06\x14\x57\x12\x57\x1d\xba\x9a\xc5\x09\x75\x4a\x78\x3c\x68\x6c\xa4\xca\xc7\x61\x2b\x5c\x3c\xb8\x76\x75\x27\xbf\xe6\xb8\xee\x0c\xba\x30\x28\x0f\x33\xbd\x50\xde\xdc\x11\x34\xa8\xa2\xab\x04\x61\xd4\xd8\xd9\xe3\xa5\xdb\x20\xf9\xb5\xc8\xe7\x79\xc5\x6c\x53\x8f\xe9\x92\xaf\xee\x0b\xce\x6b\xd5\xf1\x58\x09\xe6\xd3\xe9\x78\x9c\x14\x0e\x95\xf8\x69\x5a\x30\xaa\xbe\xe7\x69\x00\x06\x5b\x5b\xc9\xa6\x5e\xd1\x9e\xd3\x9a\x22\x59\xf4\x92\xa3\xb0\xb3\xe3\x7e\x5f\x62\x4f\xe7\xfd\xc7\xc7\x5a\xe9\x44\xfa\x09\x86\x53\xe7\x6f\x45\x47\x16\x4a\x86\xc9\x55\xf4\x36\xdb\x8f\x0c\x4a\xb7\x11\x5b\x3a\x09\xea\x3e\x00\xcb\x31\x53\xb6\xea\x3c\xde\xac\x1d\x80\x15\x98\x5c\x3a\x9f\x6a\x9e\x9b\xe7\x32\xf1\x30\x2e\x26\xbe\xc1\xb9\x57\xad\xf2\x86\x47\x3a\xf9\x61\xcb\x26\x07\x39\xd5\x69\x4c\xed\x20\xa7\x7e\x08\x53\x1e\xd2\xe4\x47\x3b\x1d\x67\x2c\x33\x7f\x96\x42\x93\x8e\x7d\x53\x3f\x71\x29\xb6\x0e\xab\x8e\x4c\x7c\xf1\xec\xf4\xb1\x3d\x0d\x9d\xab\xbb\x61\xcd\x8a\xe9\x6a\xe4\xcc\xa3\x38\x8c\x46\x22\xad\x00\x44\x4f\xba\xfa\x28\x8f\x6e\x54\xf5\x3f\x9f\xdc\xa4\xb6\xa5\xc3\xa7\x8f\xc5\x99\xcc\x28\x09\x67\x4f\x9c\x70\x1a\x46\xa3\xff\x50\x55\x83\x70\xed\x49\xeb\x74\xe5\x49\x12\xce\x46\xd4\x9c\x7d\x6c\xc0\x32\x14\xf6\x54\x17\x44\x36\x77\xae\x26\x51\x38\x0f\xdc\x51\x10\x06\xf0\xc4\x0e\x23\x17\xa2\xec\xf3\x8c\xbb\xe9\xf2\x8d\xd4\x27\x5e\x18\x24\x23\x3f\xb8\x84\xc8\x4f\x9e\x34\x27\x71\x37\xcc\x54\x78\x57\xe7\x37\x7e\xec\xdb\xfe\xd4\x4f\x6e\x47\x59\xa5\xec\xe8\x06\xee\x94\x01\xfa\x20\x8e\x6e\x34\xc3\x34\x8d\x01\xfa\x43\x7c\x31\x0d\x4b\x63\x03\xf4\x2e\x19\x7f\xf6\x6a\xd1\x5b\xe3\xd1\xd9\x67\x91\x07\xe3\x0a\x86\x6f\x0f\xf6\x4e\xc5\x36\xe4\xf8\xf0\xd5\xd1\xab\xed\x83\xbd\x8b\x83\xbd\x77\x27\x6f\x9e\x89\xe2\xfd\xdd\x63\x54\xc8\xc8\xd1\x23\x15\xb9\xe1\x41\x98\x6c\xcf\x93\xf0\x18\x44\x38\xda\xb4\x4c\x28\x31\x71\xa8\x9c\x76\x21\x89\x3e\xa4\xac\x03\x29\xed\x40\xbe\x43\x1b\x0d\x76\xb0\xfd\x7a\xef\x8b\x06\x4b\x3b\x58\x3d\x58\xdf\x48\xf9\xe7\xf8\x19\x77\xae\x20\x10\x21\x91\xd7\x0c\xd6\x1e\x47\x04\x57\xbe\xd7\x24\xde\xf6\x02\x5d\x44\x5d\xbe\x2f\xa4\x1b\xf4\x78\x78\x9c\x83\xda\xe8\x36\x8f\x04\x91\xef\xb1\x04\xdc\x59\xa0\x61\x61\xfb\x8d\x6e\xab\x5c\x04\xcb\x1d\x1f\x1d\xef\xbf\xdd\x3e\xdd\xbb\xd8\x79\xf5\xe6\xe4\x74\xef\x18\xf9\xf1\xb3\x30\x9c\x02\x0f\x6a\x60\xe5\x75\xb2\x98\xe1\x52\x5e\xb3\x05\x62\xd1\xd3\xfe\xd1\x72\xbb\xfd\xa3\x56\xe5\x66\xba\xcc\x7b\xa0\xa8\x68\x28\x89\x86\x1b\x91\x8b\xe0\x82\x8e\x75\xec\x21\x81\xfb\x30\xcd\xdb\x82\x49\xa4\x67\xaf\x0e\x77\x5e\x0a\xe7\x78\x1e\xe1\x7f\x74\xf6\x47\x32\xe4\x57\xc3\x83\xc3\x8b\x77\xbf\xed\x9f\xee\x5d\x9c\x1c\x6d\xef\xec\xa1\xac\x70\xff\xe4\x22\x4b\x6b\xbb\x7f\x74\x71\xb0\x77\xfa\xee\xf0\xf8\xe5\xc5\xc9\xde\x8b\xd7\x7b\x07\xa7\xe7\x1b\xb2\xdb\x46\x60\x7e\x0d\x70\xce\xef\xd0\xef\x6d\xf9\x73\x5e\x64\x31\xf1\x40\x79\x97\x0c\x1b\xbf\x0e\xd0\x92\x78\x4a\x3b\xdc\x3b\x7e\xa0\xac\xc8\x1a\x4b\x07\x87\xbb\xab\x25\x45\x6b\x90\x4d\x30\xd4\xd3\xc9\xc3\x04\x4d\x1b\xd2\xaf\x03\xe4\x0a\x4c\x08\x01\xfd\x75\x96\x79\x70\x87\xfe\x12\x4a\x47\xd7\x74\x03\xd7\xce\x91\x9e\x75\x67\x6c\xc7\xc6\x06\x47\x89\xf9\x3d\xdc\xcd\x33\xb6\xff\xd6\x7f\x0c\x5f\xde\xf8\xd6\xab\xcd\xc1\xea\xd3\x6f\x22\xce\x23\x85\x01\x96\x07\x8e\x88\xf2\x9c\x87\x8d\x1b\xa6\x4b\x06\xdb\xe1\xfb\xb9\xd2\x5d\xaf\x76\xd8\xf7\xd3\x57\x81\x73\xe9\x1c\xb2\x09\xa9\x48\x21\xd6\x71\x00\xd9\x77\xfe\xf8\xf2\x21\x49\xe5\xb5\xee\xa4\xf2\xff\xf4\x1e\x20\x13\xf6\xf5\x96\xbd\x77\xc9\x96\x8f\x90\xf3\xa7\xfe\xa7\xb7\x33\x28\x32\x08\x84\x51\xf7\x99\xf1\x9f\x0f\xc2\x82\xd9\x89\x05\x88\x7a\xb1\xb0\x11\xf1\x5b\x5f\x17\x0b\x85\x4e\x0f\x20\xd9\xf1\xdd\x9e\xf9\x27\xd1\x03\xe6\x4f\xd5\xce\xf9\x47\x0f\xea\x0b\x77\xf6\x15\xf6\xe2\x52\x53\x7f\x6c\x8a\x0a\x1e\x84\x05\xd2\x89\x05\xbf\x1f\x0b\xe4\x87\xc1\x42\x45\x6a\xb9\x9b\xfc\x68\xca\x03\xe8\x27\xb9\xe9\x83\x10\xa4\x75\x22\x88\x3f\xa8\x2f\xda\xd9\x97\xd3\x8b\x6c\xfa\x6d\x85\x98\xf6\xa5\x24\x17\x3f\x08\x0b\x56\x27\x16\xe6\xfd\x58\xf8\x8a\x1a\xfc\x0b\xb1\x50\x91\xdc\xbb\x30\xba\x82\xe8\x20\x74\x57\x10\xdc\xe9\x43\xd0\xc3\xba\x65\xdc\xec\x41\x7d\x75\xcb\xb8\x8b\x0e\x54\xd7\xaf\xc3\xd1\x3a\xb6\x3b\x6e\xc3\xad\x7e\x1e\x5b\x3e\x04\xcb\x2f\xc1\x89\x07\x9e\x88\x56\x1e\x69\xd6\xf7\x80\xaf\xe1\xaa\xac\x9e\x94\x18\xc8\x89\x56\x78\x9c\x31\x5d\xe7\x72\xce\xaf\xb7\xe5\x0f\x7c\x68\xf5\xea\xd8\x5a\xf3\xe8\x5d\x45\x71\xd4\xfb\x1a\x6c\xe5\xd3\x3a\xdc\x81\x39\xbc\x0e\x75\xb8\x13\x77\x98\x22\x5a\xdd\x3c\xc4\x7d\xd8\xc3\x7d\xe8\xc3\x06\x9a\x47\x99\x17\xfc\x0b\xf0\x87\x6b\x08\xac\xee\xdd\xe1\x35\x18\x24\x2a\x3a\x5d\x8b\xc1\xdc\x0b\x3d\x7b\x00\xaa\xd7\x98\xd4\xcd\x97\x1d\x51\xcb\xd1\xfa\xa1\x64\xe2\x93\xb9\x1d\x40\x72\x00\x1f\x4a\x4e\xa6\x5d\x4e\xd7\xfa\xa5\xfd\x68\xf3\x37\x25\xeb\x47\x4e\x85\x48\x7d\x74\xfc\xe5\xc3\xf7\x3c\x37\x59\x6e\x57\x6c\xb5\xea\x82\xcb\x5d\x2d\x20\x5a\xe2\x81\xd6\xa5\xc3\x32\xd9\xaf\x7d\xf2\xdb\x7e\xf1\xcb\xea\x77\x6d\xfb\xde\xfb\x1a\x3d\xf4\x6e\xa2\x67\x2b\xa3\x14\xac\x25\xf7\x3c\x34\x47\x71\x40\x85\x2b\xf3\x18\xd7\xb6\x4d\xa4\x76\xce\x84\xd1\x6f\xcb\x6f\xc4\xab\x43\x3f\x4c\xd0\x4f\x6b\x5e\x90\x6f\x18\x81\xe3\x65\xff\xd3\xd4\xd5\xc2\x88\x75\x08\xa3\x7b\x84\xe0\xa8\x0b\x23\xb3\xb8\xb1\x7c\x8f\x18\x1c\xb8\x11\x84\xe3\x9f\x55\xc7\x87\x9b\x09\xa3\x5a\x14\x0e\x52\x49\xf3\x0d\xa2\x70\xfc\xf9\x40\x0c\x92\x0e\x0c\x92\x75\x18\xac\x62\x70\x94\xe8\x23\x66\xfd\x35\xfc\x86\x11\x38\x70\x23\x04\x07\xac\xd2\x85\x64\xed\xf1\xeb\x52\x08\x8e\xda\x5b\xf6\x0d\x42\x70\x24\x1b\xc9\x72\x8d\xa1\xe8\xa1\xb2\x1c\x2d\x07\xe6\xa8\xc5\xea\x30\x3a\x64\x8b\xb9\xce\x1a\xb1\x3a\xcd\x11\xb5\x78\xad\x2f\xe4\x0f\xee\x8b\xd6\x41\x7a\x96\x81\x6a\x28\xfc\x72\x93\x84\xd6\xde\x51\x57\x61\x8c\x28\x5b\x13\xaf\x43\x47\xc1\x03\x8d\x12\xda\x81\x41\xba\x0e\x83\xb4\x13\x83\x4c\xad\x47\x08\x60\x7d\x18\x64\x7d\x18\x64\x1a\xf2\xbf\xdc\x28\x61\x35\x0c\x56\xd1\x78\xd8\x1a\x0c\x32\x1d\x4d\x37\x22\x64\x66\x20\xfe\x25\x84\x2c\xfa\x30\xd1\x45\x84\x08\x41\x85\x04\xd1\x96\x8f\xd7\xfb\xde\x26\x98\x2b\xcc\x87\x9b\x00\x92\xb6\x6f\xb0\x79\xc2\xdc\x38\x2b\x16\xcf\xf6\xe4\x47\xe3\xf1\x26\x9e\xc5\xe6\xf9\x72\xd4\x1e\x6d\xed\x5b\xcb\x2f\xb2\x8d\xd2\xe1\x44\x1a\x56\x01\x68\x65\x12\xad\x7d\x5b\xfc\xc5\xa3\xa6\x56\xd8\xb3\x69\xe8\x5c\x95\x83\xae\x7f\xd0\xfc\xd5\xed\x30\xb4\xc1\xfa\x3b\x35\x87\x47\x87\xe9\xaa\x7e\x53\x4c\xb5\x07\x5f\xb6\x5e\xd9\x97\x03\xf0\x50\xac\xd5\xda\xe5\xd7\xfa\x4f\xc3\x89\xb8\x71\x27\x3f\xba\xe6\x01\x9f\xc0\x35\x04\xc9\xe3\x22\x28\x6b\x9c\xf0\xc0\xe5\xd3\x30\x80\xa2\xe8\xf1\x75\xe8\x42\xc3\x61\xbd\xb7\xbc\xf5\xce\xdc\x12\xec\x2b\x7a\xc2\xaa\xc1\x0e\xfa\x4d\xef\x7f\x95\xc3\xfe\xf0\x41\xae\x87\xda\xbb\xb6\xda\xf4\x8e\x7b\x70\xa9\x7d\x0b\x5c\x6e\x7f\x73\x5c\xf6\xa0\x71\x19\x83\xde\x83\x30\xa8\x77\x62\x70\xf2\x15\x9c\x37\xfd\x7b\x31\xad\x1d\x9b\x0b\xb1\x9a\xa2\xbf\xb7\xeb\x66\x2f\xfa\xe2\xbd\x98\xd9\xb9\x17\xb3\xba\xb7\x62\x2a\x3a\x88\x36\xd8\x6c\xe1\x35\x9b\x2d\x82\x0e\x1f\xea\xf9\xd1\x3a\x36\x5b\x74\x1d\xde\x31\x6b\x21\x1e\xeb\x88\xd5\xde\xa5\x1a\x7d\x7e\x1f\xb3\xcf\xef\x63\xa1\xe3\x2f\x47\x7e\xba\x93\x2b\xb0\xcf\xaa\x40\x4a\x04\x77\xa2\x9f\x10\xb4\xbd\x01\xfa\x37\xd8\xa9\x79\x5f\xd3\x1b\xb4\x91\x33\xa8\xdf\xa6\xea\xf4\xc5\xfc\xeb\xed\xa3\x22\x88\x52\x65\x21\xe9\x1b\x00\x9a\xb6\x8c\x1b\x4d\x1f\x02\x67\x4d\xb8\xed\xf4\x88\xf4\x6f\x72\xee\x7e\xf2\xe3\xa9\xc7\xfd\x87\x08\x77\xbd\xdb\x33\xff\x77\x37\x2e\xf5\x6f\x62\x6a\xdc\xfc\x78\xb8\xb4\x1f\x84\xcb\xee\x63\xb5\xeb\x35\x8a\xb2\x2e\x9f\xd7\x89\x67\xd2\x92\xce\x1a\xd2\x1b\xd7\xf7\xbb\xb7\xbf\x3d\xa2\x59\x47\x7f\x7f\xb9\x64\x36\x2a\xc1\xac\x57\x9b\x5f\xb3\x53\x2e\x5b\xe8\x66\x13\xad\xa8\xae\xd1\x8a\x18\xd9\xf7\x14\xcb\xab\x7d\xf3\xfa\x0a\x29\xb7\xec\x21\x2f\xa5\x9c\xb6\x46\xc8\x2d\x37\x7c\xb8\x30\xae\x11\xe6\xe5\xf7\xb7\xba\x8c\x2f\xb0\xba\x76\xbe\xaa\xd5\xc5\xcc\xf5\x56\xd7\xc9\x86\x56\x57\xee\xae\x61\x35\xa7\xfa\x9a\x28\x98\x58\x43\xfb\x0f\x30\x06\x72\x9f\xf9\x75\x84\x30\x29\x03\xd5\xe9\xea\x57\x30\x14\xda\xfb\xdf\x8d\x2d\x85\x76\xd3\xbe\xe0\x5d\x0f\xda\x29\x7f\xad\x1d\xef\x51\xb7\x1a\xc2\xdf\x44\x0d\xbd\xea\x3d\xf8\xd7\x8d\x5a\xd4\x76\x5c\xef\x6c\x83\xc3\x7c\x5c\x5b\x41\xc7\x77\xa3\xe7\x61\x74\x14\xf9\x37\x3c\x81\x9d\x6c\xda\x67\x91\x08\xe2\xf8\x36\x80\x44\xac\x6e\x9c\x3d\x30\x3a\x2f\x17\xb3\x71\x96\xff\x62\x15\x94\x1b\x63\x25\x7b\x1d\xf6\x2a\x25\xe7\x62\x3e\x9d\x2f\xa6\x36\xb9\x1a\x53\xf3\xec\xdd\x77\x86\xb5\x79\xbd\x79\x90\xc6\xed\xbe\xc2\xf1\xf6\x21\x7d\x19\xdd\xf7\x1d\xde\x3f\xa8\xaf\x6e\xab\xea\x76\x8d\xf0\xd6\xd9\xf2\xfa\xf5\x9f\xe9\x54\xb1\xbf\xf5\xba\x2d\x60\xdc\xd3\x16\xd0\x6a\xb6\xc0\x8b\x2f\x3f\x4a\x30\x4a\xc1\xaa\xd7\x0f\x42\xdf\x6c\xe4\xe6\xb6\xd0\xdb\x8d\xea\x61\x15\xbd\xff\x0a\xea\x7f\x23\xed\x3f\xcb\x08\x39\x77\xec\x35\xd5\xfe\x43\xf7\x54\xf7\x74\x29\x5e\x1c\x1e\x5f\x3c\xff\x63\xf7\xe0\xbe\xed\xf7\x8f\x2e\xf6\x0f\x8a\xab\xd9\xc7\xdb\x07\x2f\xf6\x06\x77\x22\x4a\xce\x6e\xf4\x45\x51\x72\x8a\xc0\x4b\x4f\xda\xc1\x72\x94\x70\x9c\x0c\x1d\x3e\x9d\x8a\x92\xc1\x60\x58\xe5\x23\x39\x81\xe8\xc6\x77\x60\x0c\x28\xcc\xa3\xbe\x8d\x65\x19\x85\x9d\x82\x61\x5c\x7b\x80\x81\xc2\xae\x83\x02\x11\x33\x0a\x85\x62\x23\x99\xeb\xaf\xf1\xe7\xbb\xbc\xa0\xb9\x05\x1e\x9f\x9d\xe7\xe5\x8d\x1d\x67\x56\xdc\xa1\x07\xb3\x1f\x5a\xc6\x5b\x56\xbc\x74\xa5\x74\x2c\x63\x75\x28\xfe\xfd\x8a\x75\xb9\xfa\x7d\xf9\x1e\x60\xad\x1e\xa1\xb5\x7a\xcd\xcb\x5b\x79\x2d\x5c\xd6\xca\xa2\xee\x35\x65\xe9\xf8\x11\x4e\x7f\xe9\x12\xb3\x15\x06\x32\x64\x36\xa7\x5a\x95\x1f\xc0\x07\x51\xd4\x1f\xc3\xe8\x24\x81\x59\xfe\x3a\xa1\x37\x80\x91\x94\x2e\xf1\x30\x55\xd9\xf9\xf0\x27\xa5\x42\x7f\xfa\x2e\x19\xfd\x9e\xdc\xdd\xa1\xa2\x4f\x11\x2d\xd5\x86\xd3\x30\xa7\x82\xae\xb0\x48\x6f\x60\xf8\xf7\xd0\xe5\x09\xcf\xeb\x1c\xc3\xc4\x8f\x93\x88\xa7\x96\x02\xcc\x4e\x8a\x3e\x32\x5a\x5b\x0a\x9b\xf4\xf6\x60\xef\xf4\x04\x09\x80\x62\x10\xab\x13\x0f\x6d\x3f\x70\x73\x32\x44\x5f\xd2\x77\xf3\xe9\x4d\x3e\x4a\x18\x3c\x87\xc4\xb9\x04\xb7\x49\x6b\xf5\x41\xcb\xe9\xf7\xd4\x6d\xa1\x00\x06\x9f\x45\xdf\x1d\x24\x0c\xd9\xa8\x1d\x8c\xf0\xb4\x98\x74\x4e\x72\xe2\x01\xd3\x09\xf7\x60\x7a\xab\xf4\x3c\x1e\xea\xeb\x6a\x30\xc2\xe3\xf1\x18\xf2\x67\xb0\x0f\xe8\x18\xce\xd4\xf3\x6c\xa7\x3d\x2a\x1a\x0b\x82\x7b\xe7\x27\x97\x27\x49\x18\x81\x2b\x3a\x59\x09\x57\x8b\xfe\x94\x1a\x26\x33\xa0\xfd\x4f\xf0\x5c\xbc\x80\x6f\x91\x50\x26\xca\xd2\x7e\x9e\x88\xce\xca\x87\xc1\xc3\x09\x24\x3d\xc3\x0a\x19\x35\x87\x1d\xf1\xe4\x3b\x1e\xce\xfc\x19\x28\x8a\x8a\xfe\x80\xe1\xc7\x81\xd2\x7c\x87\x9f\xd3\xfd\xef\x27\x87\x07\xc3\x38\x89\xfc\x60\xe2\x7b\xb7\x0a\x0c\xc6\xe3\xf1\x52\x59\x32\xb8\x1b\x20\x45\x45\xef\x60\x78\x3c\x10\xf4\x30\x9c\x07\x25\x1b\x0c\x06\xc3\xf2\x73\x35\x44\x32\xf8\x0c\xc3\x30\x68\xc6\xf2\x16\x50\x65\xdd\xad\x98\x51\xe3\xfd\xdc\xfd\x27\x04\xe3\xf1\x38\xd9\x18\xe0\x9c\xfe\x85\x08\x14\x63\x34\x38\x6d\x05\x94\xb5\xf7\x62\x3f\x12\xd2\x85\x6c\xb8\x86\x38\x86\x60\x02\xd1\x50\xe4\xa8\x8c\x2f\xf3\xd8\x5d\x42\x16\x94\x6f\x7f\x4e\xf7\x8e\x84\x48\x38\x38\xbc\x38\x3a\x3e\xfc\xf3\xaf\x8b\xfd\x83\xe7\x87\x68\xc6\x6f\xa7\x21\x77\x47\x9f\xfd\xc0\x0b\x47\x4a\xf2\x34\xf9\x45\x46\xf2\x48\x96\x07\xbf\xc8\x58\xb7\x86\x84\xd1\x5c\x43\x20\xac\x9b\x43\x5d\x1b\x62\x62\x0d\xb1\x2e\xdf\xdd\x0d\x10\x0c\x93\xec\x11\x62\x4a\xf2\xc5\x05\x5f\x3f\x0c\xf2\x95\x1f\xdc\x15\x6a\x58\x50\xf5\x12\xac\xd5\x84\x6a\x32\xeb\x78\xef\xc5\xfe\xe1\xc1\xc5\xce\x6f\xa9\xc6\xdf\x45\x0d\xf1\x22\xe8\x6b\x52\x75\x0f\xc3\x1c\xf8\xc1\x1d\x4a\x1a\xd8\x42\x9b\x0d\x95\x71\x92\x60\xa4\x9e\x11\xbb\x94\x77\x39\x6c\x6b\x54\xb1\x6a\x91\x90\xce\x10\x1d\x06\x6f\x2b\x2a\x51\xfa\x5e\x60\xe6\xf4\xb8\x53\xd7\x95\xdb\x59\xd4\xeb\x6c\xa3\xd9\x22\xcf\xd5\xfd\xaf\x7a\x3f\x58\x8c\xd5\x77\xf0\xdc\xc7\x10\xf7\x18\xb1\xfe\x94\xae\x7f\xb8\x07\x8d\xd3\xf1\x28\x36\x1f\xa1\xb0\x14\x0e\xa3\xec\xae\xc3\x61\x8d\x06\x3b\x75\x5a\x30\x39\x0c\xf6\x03\x3f\xe9\x10\xc2\xd7\xa0\xbc\x85\x2c\x8c\x65\x12\xa6\x4c\x34\x40\xb5\xea\xa2\x9f\x9a\x89\x98\xd1\xd9\x3c\x86\x68\x97\x27\x3c\x95\xeb\xb9\x8a\x1e\xda\x73\x7f\xea\xa6\x05\x4a\x53\xa6\x64\x30\x7f\xf0\x3f\xf1\xc8\x4d\x2d\xba\x4a\xe4\x54\xdf\xba\xb4\x48\xf6\xcb\x92\x7d\x3f\x16\xc3\x17\xaf\x31\xdf\x24\xfe\xd4\x4f\x7c\x88\x53\xb9\x55\xd5\x7a\xcd\x67\xca\x9a\x6e\xc5\xd3\xc3\xdd\xcc\xa8\xcb\x7a\x5e\xd7\xa2\x58\xaa\xbc\xd1\x73\x7f\x0a\xfb\x79\x94\xc4\xdf\x78\xe0\x4e\x21\xca\x7a\x10\xc1\x1c\xeb\xbf\xae\x9b\x61\x6f\xc7\x62\x9b\xb0\xaa\x6f\x51\xa1\x98\x50\xdb\x66\x53\x06\x75\xd3\x21\xd7\xc2\x45\x61\x97\xd5\xd9\xfd\xbc\x7b\x1d\xd5\x9f\x2f\x77\x28\xcc\xd5\xae\x77\xe7\x5d\x0f\x91\x37\x79\x74\xbf\x01\xa7\xe7\x40\x74\x5a\xb7\x8b\x85\xd2\x33\xe5\xe1\x6c\x1e\x5f\x2a\xfd\x6f\x63\x5b\xb8\x3a\x80\x0f\x9d\x6d\x7a\x00\xee\x7c\x0d\x5b\x52\xb6\x58\xd9\x13\x7e\x03\x6e\xc6\xc4\x6f\xf3\x2d\x8f\x52\x37\x45\xfb\x64\x49\x97\x35\x5a\x29\x9e\xae\x7d\xd2\xd0\x4b\xe5\x42\x5d\x93\x96\xf1\x60\x52\x1b\x30\x35\x25\xef\x06\x28\x1a\x27\x4f\x13\xb1\x5d\x19\xc9\xf2\x93\x0d\x6c\xca\xde\x17\xe9\x05\x65\x76\x7b\x98\x6a\x3b\xc6\xf3\x71\xb4\x7a\xc2\x75\x59\xdd\x6b\x85\xf7\x0e\x93\x51\xdb\xf9\x18\xea\x83\xf4\x29\x9f\xae\xee\x7d\x2f\xa3\x9f\xce\xdd\x1d\xa0\x26\xe2\x5b\x1b\xe8\xa1\x1f\xef\xcf\xf6\x83\x6c\x2a\x44\x59\x01\xab\x2c\xff\x92\xe1\xbb\xd3\xf5\xb6\x6c\x21\x5f\xf3\xe8\x6a\x3b\x3e\x82\xc0\x15\xc2\xa4\x90\x25\xf1\x3c\x8a\xc0\x59\x6d\xc7\xd7\x22\x19\xf4\xc9\x26\x74\xf6\x1c\x86\x57\xfb\xc3\xe2\xe5\x36\xea\x9d\xdc\xdb\xb4\x6c\x7f\x76\x18\x3d\x7f\xef\x06\x29\x1c\xe7\x83\x3b\x98\xc6\x90\x6d\x37\x5d\x3f\xe6\xd1\xb5\x80\xa6\x6b\xf8\x47\x6a\x45\xeb\xbd\xfc\xd0\xa1\xb3\x0a\x66\xf7\xbd\x5b\xd1\x40\xcc\x2f\xde\xf7\x84\x91\x2b\x1a\xa7\x0d\xf7\xe3\x83\xf0\x43\x95\x31\xe8\x49\xb6\xdd\x10\xb7\x19\x45\x07\x13\x48\xba\xd0\x53\x17\x59\xbd\xf8\x91\xe5\xc1\xd3\x92\xb8\xea\x01\x28\x9e\x6c\xb4\x95\xea\x53\xed\x5d\x43\x41\x5d\x1e\xd4\xcd\xc1\x5e\x5e\xc8\xfd\x35\x80\xbe\xcd\xb6\xae\x73\xd3\xd3\x05\x0c\x6c\x6d\x41\x81\xec\x0e\xbb\x72\x6b\xab\x7f\x9f\x9f\x5b\xd9\xca\x59\x97\xe7\xe0\x1c\x7d\x6e\x64\x8f\x48\x17\x7b\x04\x68\x1a\x66\x01\x96\x46\x35\x24\xdc\x55\x60\x17\x9e\x86\x95\x1b\xf9\xc2\x7b\x04\xc3\x08\xdc\xb9\x03\x3d\x3b\xb0\xb3\x4c\x68\x9e\x8f\x93\x54\xf3\xa6\x2d\x10\xdc\xa1\xcf\x77\x35\x8d\xd1\xf4\x5e\x1d\xda\xff\x80\x93\x0c\xaf\xe0\x36\x56\x96\x07\x1b\xa0\x87\xd3\x73\xb2\x92\x94\x9b\x9a\x7c\x15\x31\x3f\x49\xb6\xb6\xba\x41\x1f\xfa\x81\x33\x9d\xbb\x10\x2b\xc9\x60\x13\x27\xc3\xd2\x98\x99\x97\xa2\xa7\xeb\xcc\x75\x91\x8f\x7c\xaf\x6e\x3b\xfb\x3b\x53\xcf\xeb\x54\xfa\x76\xa5\xb6\x2c\xc4\x7a\xdb\x73\xb8\xbc\x3e\x67\x70\xbe\x58\x9c\xe5\x26\x46\x97\x07\xb2\xbb\x1f\xa4\x16\x13\x6f\xfd\x54\x84\x2e\xcb\x35\x87\xfc\x6e\xfb\xf8\x60\xff\xe0\xc5\x48\x4a\x47\x95\xe4\x5f\xe0\x17\x59\xe2\xb3\x19\xf0\x28\x96\x92\x30\x8b\xcd\x1d\x84\x52\x4e\x6a\x12\xbf\xe1\xfe\x94\xdb\x53\x78\x24\xd5\x69\x56\xfe\x65\x79\x87\xbd\x4c\x68\x4f\x9c\x30\x88\xc3\x29\x0c\xa7\xe1\x24\xdd\x7f\x8b\x0a\x7e\xe0\xe7\x15\x9a\x72\x7a\xf5\x36\xa7\xf3\x44\x72\x95\x11\xb6\x72\xac\x8e\xb8\x24\xdd\x98\xab\xd6\x77\xa9\xab\xf6\x12\xa7\xfc\x9a\x5f\x35\xe9\x60\x91\xfe\x9d\x87\x60\x87\x28\x27\xca\xd4\x68\xca\x46\x79\x76\x2b\x8c\xb3\x08\xad\x66\x03\x40\x51\x4e\xf2\x9b\x50\x37\xa0\xa4\x74\xc2\x95\x33\x5b\x1e\xb3\x7b\x6a\xa5\xf5\xb6\x89\x5d\x57\xe3\x8a\x55\x7b\xc7\x7e\xab\xb2\x8c\xa4\x9f\xcf\xea\xbf\xf0\xd6\xd6\x4d\xe8\xbb\x92\xfa\x68\x5c\xfd\x78\x86\xcf\xb7\xb6\xea\xdf\x9e\xf4\x5a\x34\xa9\xe5\x34\x1e\xd7\x4f\x0e\x9e\x2a\x25\x89\xbc\x6d\x99\xea\x4a\x32\x40\x0d\x41\xb2\xe4\xc8\x7d\xb0\x13\xb4\xa7\xc3\x6f\xe4\x1a\x1d\x8c\xf2\x49\x67\x4a\xbf\xa0\x8d\x06\x7e\xf2\x84\x80\xc9\x60\xad\xab\xa4\xdf\x2e\xad\x69\xbd\x8e\xbe\x57\x6f\x1e\x9e\xdc\xc3\x94\xdc\xc8\x56\x5a\xb2\x25\xcf\xef\x65\xac\xae\xda\x18\x7e\xa3\x11\x6b\xdb\xd3\x2f\xb5\x8f\x83\xf0\xdd\xa5\x9f\x40\x3c\xe3\x0e\x1c\x06\x7b\x81\x5b\xee\xca\x57\xd8\xd2\x07\x90\xa4\x72\xef\x04\x26\x29\x1b\x29\x83\x5c\xf3\xb4\xc2\xa3\x7c\x39\x16\x7f\xd4\x39\xb6\xe3\x72\xac\xdf\xde\x6f\x86\x88\xee\x0d\xfb\xb7\x21\xa4\xee\x60\x58\x3f\x20\xba\x97\x62\x52\xf4\xba\x88\xd2\xed\xe7\x1e\x77\x2e\x95\x76\xaa\x0d\x29\x69\xec\xf5\xa2\x74\xd7\xd2\xd4\xd5\x6d\x99\xbe\x89\x18\xda\x04\x08\xe1\xb7\x6e\x2e\x89\x02\xed\xa5\xbb\xdb\x44\x83\x6c\x6d\xc5\x90\x9c\xfa\xd7\x10\xce\x93\xc6\x08\x99\x4a\x5f\xd1\x2e\xb9\xa7\xde\x59\xa5\x74\x50\x35\x5a\x8f\xc1\x7c\x3f\x6b\xb9\xdb\x54\xce\x47\xe9\xf2\x15\x6d\x3a\x4e\xbf\x8d\xd8\xd5\xed\xf2\xfc\xfa\xec\xe2\xf5\xe3\x76\xd9\x8b\xed\xee\x2a\xd3\xaa\x75\x3e\xf2\xa5\xc7\x46\xeb\x4f\x8a\x3a\x5c\x87\x0f\x65\x9f\xfb\xed\x0c\x57\x1e\xb4\x7e\xa9\xd3\xe3\x49\xef\x26\xd1\x85\x8f\x87\x9e\x02\x83\xff\x1a\xab\x5b\x5b\xb9\x37\x9d\xdf\x80\x98\xd0\x2e\x4f\x78\x0f\x6d\x16\x87\x48\xce\x14\x78\x24\x2a\x8b\x79\x36\x5a\xd4\x80\xab\xb9\x21\xdc\xdb\x80\x5f\xfb\x4e\xed\x10\x6e\xed\xcc\x45\xff\xfd\xda\xfe\x91\x5a\x25\x1c\x7a\x2a\x67\x44\x34\x92\xe4\x22\x14\x24\x0c\x46\xf2\xc9\x0c\x1c\xdf\xbb\x95\x78\x90\x27\x33\x7a\x7b\x00\x49\x1e\x47\xb6\x34\xb9\x52\xfc\xbe\xc9\x8f\x48\xfa\xbc\x57\x8d\x4a\xcf\xa3\xf0\xba\x40\xf3\x3d\x4e\x2e\x76\xb3\x68\xc2\x87\x91\x5b\xd8\x82\x2b\xfd\x36\xe9\xaa\x65\xc6\x77\x45\x2a\x13\x48\x3a\xae\x8a\xd4\x03\xaa\xb6\x5b\x17\x46\x64\x6f\xdb\x0c\xa7\x45\x22\xa7\x67\x30\xdc\x5f\x9d\xc8\xa9\xda\xb3\x04\xf0\x41\x49\x16\x0b\x18\x28\x3f\xc1\xf0\x2f\x4d\x57\xfe\x81\xe1\xf1\x60\x70\x77\xaf\x6c\x4d\x29\xa4\x6b\x73\x34\x69\x79\x8e\x26\x6b\x75\x8a\x26\x14\x20\x1f\x4d\x11\x47\x0e\x8a\xd1\x1c\x9d\xa2\x19\xba\x40\x2e\xda\x43\x07\xe8\x10\x1d\xa3\x6d\xe4\xa1\x09\xda\x41\x27\x68\x1f\xfd\xdd\x95\xce\xe9\x66\xb1\x50\x6e\xf2\xb4\x33\x41\xa6\x84\xa5\x14\xb4\x7a\x4a\x27\xb0\xa9\xea\x1a\x9a\x67\xa9\xc4\x30\xc1\xf2\x6c\x47\x07\xc3\x71\xa9\x07\x9e\xe1\x68\x1c\x53\x5b\xd3\x3d\xd7\x31\xf2\xd4\x33\x9a\x46\x2c\x53\x57\x0d\x53\x57\x99\x4e\xa9\x6e\x1a\xa3\x8c\x0a\xbd\xb0\x48\xd3\x25\x9f\x0f\x06\xcd\x2c\x4d\xf6\x62\xa1\xd8\x39\x1c\x22\x9b\x95\x94\xf9\xc7\xea\x29\x70\x3c\xa6\xa9\x36\x63\x26\x73\x4c\xcd\x73\xb1\xad\x59\xb6\x45\x4d\xe2\x60\x0f\x63\xca\x35\x43\x65\x26\xe3\x94\x69\x59\x6d\x8d\x59\xa6\xaa\x6b\x98\x51\x8d\xaa\x98\xa8\xba\xc1\x7e\xc0\x14\x38\x55\xf2\xf7\xed\x7c\xd6\xf5\xbc\xe5\xc3\xef\x9a\x0d\x47\x5f\x2e\x30\x5a\x59\x67\x96\x4b\x7e\x36\x1f\x92\x09\x67\xc3\xbc\x37\x66\x47\x25\xbd\x33\x71\xd6\xf5\x62\xa1\x5c\x2f\x51\x4f\x1d\x8f\x65\xa2\x02\xe9\x3a\x9e\x64\xe4\xa1\x52\xc3\xb5\x35\xee\x50\xd5\xe3\x5c\x27\xcc\x31\x55\x93\xe9\xc4\xd0\x30\xc5\x8e\x6d\x13\x83\x62\x4f\x37\xec\x22\x4f\x19\xa3\xaa\xc9\x4c\xd5\xa4\xd4\x32\x29\xd3\x2d\x62\x8e\xf2\x15\x2b\x4c\x24\x49\xd8\x48\xf5\xac\x08\x39\x99\xd7\xd3\x66\x5d\x2e\x16\xca\x65\x03\x50\xe1\x51\x4b\x8d\x80\x3a\xa5\x33\xcb\x03\xc0\x16\x06\xa6\xeb\xdc\xd1\x1c\xcf\xc5\x0e\xe8\xae\x6a\xab\x44\x77\x55\x6c\xbb\x44\x03\xa6\x12\x2b\xe7\x38\x03\x1b\x98\x30\xac\xaa\xaa\x66\x11\x93\x10\x6a\xfc\x80\x94\x7e\x7a\x09\xd9\x3c\x43\x4f\xe4\xd5\x0b\xe0\x43\x26\x16\x92\x50\xb2\x41\xca\xbc\x04\xae\x34\x9f\x85\x81\xe4\xc2\x6c\x1a\xde\xa6\x5b\x81\xb4\xb6\xc8\xef\xd7\x99\x2b\xaa\xb8\xfb\xff\x7d\x93\x46\x59\x2d\x0a\x5f\xae\xf3\x6b\xbb\xe8\x67\x82\xbf\x6b\xd2\x28\xd2\xee\xfe\xd7\x0a\xf4\x01\x0a\x6a\x54\x79\xb4\x58\x28\x47\x0d\xaa\x14\x0b\x23\x56\xab\xcd\x39\x1a\x56\x2d\x4f\x33\x29\xb1\xb1\x4b\x18\xb8\xae\x89\xa9\x83\x6d\xec\x61\xd5\xa5\xb6\xe7\x68\xb6\x6a\x59\x9a\x91\x13\xa7\xa6\xa9\xa6\xa9\x51\xac\xab\x2a\xb3\x98\xa6\xe9\x9a\x99\xab\x83\xd4\x40\x93\x1c\x1e\x04\x61\x92\x12\x00\x5c\xcf\x92\xdb\x9c\x65\xfc\x1a\x70\xaf\x16\x0b\xe5\xd5\x1a\xcd\x40\x6c\xa0\x98\x53\x66\xb9\x1c\x98\xea\x6a\x26\xa8\x8c\xa9\x3a\xb8\x2a\xe5\xc4\x62\xcc\xd3\x6c\x15\x6b\xaa\x9d\xd5\xb6\x08\x26\x94\x60\x6c\x18\x9a\xce\x18\xb6\x88\xf1\x23\x26\x47\xdb\x0b\x12\x88\x3a\xec\x38\x49\x24\x65\x10\xca\xb4\xce\x46\x43\x29\x37\xba\x24\x61\xcf\xa5\x72\xa8\x8b\x65\xbe\x2f\xab\x90\x16\xab\x68\x6d\x56\x69\x15\xfd\xac\x7d\x5f\x56\xd1\xba\x58\x85\x54\xac\x32\xad\x51\xe3\x8b\xc5\x42\x79\x71\x3f\x4d\xa3\xdb\xae\xcd\x6c\xc3\x60\x8e\x66\x71\x20\xba\x65\xd9\xae\x61\x58\x40\x1d\x6c\x5a\xd4\xc3\xa6\xc3\x6d\x0f\xb8\x97\xd7\xd6\x88\xca\x54\x6c\x19\xcc\x30\x28\x56\x55\x4b\x2d\x35\xcd\x32\x09\xb4\x55\x0d\xaf\x41\xfa\x66\xb1\x50\xde\xb4\x55\x8d\xe3\xbb\x51\xd1\x3e\x10\x1e\x99\x0a\x52\x93\x83\x41\x54\xc7\xd5\x6d\xc7\xd0\xb9\x6e\xab\x1e\xf5\x08\x31\x0d\xcd\xe2\x9e\x67\xbb\x8e\xeb\xaa\xaa\xeb\x69\x4e\xae\x76\x28\xa1\x58\x37\x74\x9d\x1a\xd4\x32\x52\x25\x64\x8d\xba\xc8\xf4\x9a\x27\x29\xa8\xc5\x68\x19\xa4\x4e\x0d\xd2\xb7\x8b\x85\xf2\xb6\x01\x69\xbe\x37\x97\x66\xe9\xe6\x3c\x3f\x56\x6a\x26\x43\x64\x98\x51\x4b\xb7\x89\x4d\x55\xa2\x1a\x36\x70\x6e\x31\xe2\x58\x06\xb7\x0d\x5d\x73\x6d\xcd\x36\x30\x81\x3c\x19\x22\xb6\x4c\x6c\x98\xa6\x9a\xb2\xbc\xa9\x62\x62\xe8\x3d\x69\x24\xff\xa5\xfc\xbe\x9d\xc9\xdb\x82\xaf\xf3\x49\xf3\x38\xf6\x27\x01\xb8\xa9\x96\x4c\x8b\x57\xa9\xc1\x25\xb4\x05\xa1\x0b\xdf\x97\xdd\x69\x8b\x4b\x29\x69\x31\x56\xab\xe8\x67\xaa\x7d\x57\x76\xaf\x86\xab\x43\x85\x4b\x76\x8f\x6b\xa4\xf9\x7e\xb1\x50\xde\xaf\x27\xcd\x36\xd3\x7b\x96\xe1\x98\x96\x03\x0e\x33\x0c\xd7\xb1\x0d\x17\xc0\x22\xc4\xd5\xc1\x36\x4c\x62\x7a\x94\xdb\xd4\xa2\x1e\xcd\xf7\x2a\x24\x25\x4f\x46\x55\x8c\x99\x69\x31\x53\xa7\xc4\x18\x49\x3b\x5d\x23\x05\xfd\x4a\x73\x5e\x83\xfb\x76\xb1\x50\x6e\x57\xc0\x2d\xa4\x40\x8d\xa1\x54\x93\x6b\x16\xd7\x80\x13\x6c\x73\xc7\x4b\xf9\xca\x54\x75\x17\x53\xd7\xd4\x35\x43\x25\xcc\x66\x0e\xb7\x00\xe7\x32\x2a\x15\x5c\x06\xd5\x55\x43\x35\x74\x53\xb7\x0c\xd3\xfa\x21\x19\x2a\xc7\x59\xc1\x52\xf7\xe6\x9d\xd3\x4b\x3f\x2e\x3a\x89\x2f\xc3\xf9\xd4\x95\x6c\x98\x86\xc1\x44\x2a\xb2\x4e\x97\xe2\x6e\x23\xf5\x4b\xbe\xb3\xfa\x65\x2d\x36\x62\x6d\x7e\x6c\x15\xfd\xcc\xbe\x12\x3f\x76\xaa\xd5\x4d\x38\x94\x75\x71\x28\xab\x38\xf4\xb4\x46\xe9\xbb\x8b\x85\xb2\xbb\x8e\xd2\xdb\xfc\xe9\x80\x4a\x39\x18\xdc\x22\xa6\x6b\x99\xba\xa6\x53\xe2\x58\x2e\xe5\x9e\x46\x34\xdd\xd3\x0d\xcf\x36\xc1\xb5\x59\x9e\x88\x98\x51\xa2\x5a\x84\x50\x8b\x68\x98\xa8\x8c\x30\xbd\x87\x3d\xc5\x68\xdd\xec\x39\xab\x01\xfd\x71\xb1\x50\x3e\xae\x03\xba\xa5\x9e\x99\x6e\x1a\x8e\xa9\xd9\xcc\x35\x31\x73\x08\x36\x2d\x6e\x63\xac\x71\xcf\xd5\x30\x26\xcc\xf5\x88\x6d\x9a\xc4\x32\x8a\x5c\xcf\x04\x33\x62\x12\x23\xb5\xbc\x09\x61\x5a\xba\x65\xed\x07\xba\x4f\x51\x5f\xd4\xc0\xfe\xb4\x58\x28\x9f\x1a\x60\x67\x2e\x6d\xc1\x2e\x1d\x6a\x9a\x1a\x1a\x50\xa2\x62\xd5\x75\x4c\x55\x75\x28\x05\xd5\xb5\x2c\x03\x0c\x62\xbb\x26\x18\xaa\x85\x89\x4b\x3c\x8b\x17\x79\xb4\x89\x81\x19\x56\x0d\x6c\x68\x26\x26\x8c\xf4\xe4\xa6\xfe\x77\xd7\xd2\x35\x9c\xc5\xdf\x59\x1e\xac\xf3\xf8\xfc\xda\x2a\xf9\xd9\xf8\xae\xba\xd9\xe8\x62\xfc\x92\xef\xdd\x1a\x2d\x5e\x2d\x16\xca\xd5\x3a\x5a\x6c\xf3\x3d\x10\x06\x04\x28\xf1\xa8\x69\x13\xea\xa8\x1a\xb6\x31\xe6\x1c\xb0\xc3\xa9\xc1\x5d\x4f\xc5\x5e\xaa\xa4\x73\xb7\x0f\x26\xcc\xc2\xba\xaa\x13\xc6\x18\x31\x75\xd3\x22\xfa\x48\x7a\xd7\x1e\x67\x85\x56\xde\xab\xc1\xfc\x7c\xb1\x50\x9e\xf7\xc2\xbc\xac\x93\x09\xe5\x40\xa8\x47\x74\xe2\x5a\x98\x70\x43\xf5\x6c\xc3\x56\x3d\x0b\x6b\xae\xc9\x74\x1b\x1b\x8e\xe3\x71\xdb\xca\x9d\xb4\x0c\x6b\x54\x67\xc4\xc4\x8c\x10\x15\x5b\x9a\x49\xb5\x1f\x92\x7d\xee\xa3\x93\x9b\x9c\xf2\xef\xae\x8d\x71\x8b\xfd\x70\x9b\xff\x5a\x45\x3f\xe3\xaf\xc4\x81\x0f\xd6\xc6\xb8\x8b\x29\x71\xc5\x95\x07\x35\x0a\x7f\xbd\x58\x28\xaf\x57\x53\x78\x9b\x27\x0d\xea\xa6\x2a\xcc\xb2\x4c\xc7\xb0\x99\x45\xb8\xc7\x31\xb7\x39\x35\x89\xeb\x52\x5b\x35\x1c\x57\xa5\x0e\x27\xa5\x43\x89\x30\x62\x9a\xba\xa6\x6a\x9a\x46\x0d\xc3\x30\x48\x27\x4f\xae\x50\xc5\x87\x35\x88\x3f\x2c\x16\xca\x87\xd5\x10\xb7\x14\x31\x07\x5b\xe7\x2a\xc3\xba\xeb\x5a\x1a\x98\x8e\xe6\x60\x66\x98\x26\xd8\x8e\x05\xaa\xa1\x33\x47\x07\x97\x73\x9b\x14\xd6\x32\x66\x44\x53\x89\xae\x32\xaa\x99\xc4\xa2\xa6\xd6\x0f\x70\x9f\x1a\x3e\xae\x81\xfc\xc7\x62\xa1\xfc\xd1\xe9\x83\x98\xe4\x4e\x88\xba\x2b\x59\xd5\xb9\xab\x71\x17\x88\xa5\x11\x06\xa0\x31\x47\xf7\x6c\xd5\x02\x93\x10\xc7\xa0\xd4\x50\x6d\xe6\x19\x86\x5d\xd4\x36\x2d\x46\x98\xa6\x12\x95\x58\x26\xb6\x0c\xf2\x23\x4a\x91\x1f\xe9\xd0\xe4\xbb\xe9\xd4\xaf\xa2\x41\xb7\x6b\x64\xf4\x6e\xb1\x50\xde\xdd\xcf\x95\x65\x71\x0f\x0c\xd3\x33\x0d\x8d\xdb\x26\xa5\x5c\x75\xb0\x49\x38\xa3\x1a\x80\xad\x11\xd7\xf5\x6c\xcb\x05\x97\x38\x85\xdf\xc5\xc2\x86\x6e\x51\x62\x32\x8d\x50\xcb\xb2\x08\xdb\xf8\xd0\xc4\xab\x01\xfa\xfb\x62\xa1\xfc\xbe\xfe\xd0\xc4\x05\x8f\x52\x87\xba\x60\x9b\x8e\x97\x8a\x0d\xa6\x1b\x8e\x66\x53\x33\xa5\x63\x47\x55\xb1\x4a\x19\x65\x46\xbe\x87\xc5\x3a\x26\xaa\xc1\x74\xa6\x51\xa2\x5b\x26\x23\x86\xfe\x6f\x40\xe9\x99\xa7\xf7\xbb\x6a\xad\xe5\x23\xbf\xff\xc0\x66\x9b\x0a\x97\x8b\x7e\xc6\xd6\x37\xa4\xf1\xaa\xf3\x7a\x2d\xa3\xa4\xf2\x49\x8d\x78\xfe\x5a\x2c\x94\xbf\xee\xe9\xb0\xb5\x2c\x8f\x11\x03\x80\x62\xec\x98\xaa\xed\xea\x98\x7b\xa6\x69\x00\x76\x6d\xcd\x75\x19\xc7\xa0\x19\xaa\x95\x53\xb9\xa6\x53\x53\x53\x99\xa5\xea\x9a\xa1\xab\x04\x1b\x9a\xda\x70\xd8\x0a\x32\x6d\x13\xf8\x4e\x0d\xc6\x67\x8b\x85\xf2\xec\x5e\x0e\x50\x0f\xc0\xb3\x5d\x9d\x33\x1d\x9b\xba\x63\x6b\x2e\xa3\x0e\x10\xae\x02\xc7\x9a\x41\x29\x27\x98\x98\xba\x67\xf2\x62\xe3\xa8\x62\x86\xb1\xc1\x28\xd5\x2d\xa2\x5a\xff\x16\xa4\xde\x85\x82\xff\x15\xed\xfd\xa2\xfd\xa4\x46\x50\xbf\x2d\x16\xca\x6f\xf7\x23\x7a\xc3\x06\xea\x69\x0e\xc5\xb6\x6a\x33\x97\x3a\xc4\xd2\x5d\x15\xab\x8e\x01\xaa\xad\x63\x9b\x6a\xc4\xa2\x5c\xa7\x66\xce\x22\x3a\xb6\x54\x62\xa6\x36\x18\x33\x34\xac\x99\xd4\x1a\xad\x58\xb7\x0e\xfa\xdf\xaf\x81\xfb\xd3\x62\xa1\xfc\x74\x0f\xbf\x82\xad\xe9\x4c\x23\x40\x0c\xdb\xf5\x68\x6a\xd3\x18\x9a\xab\x7a\x96\xe9\x32\x20\x8c\x72\xdd\xb1\x3d\x6a\x1b\xc5\x39\x85\xce\x34\xd5\xc0\x06\x31\x75\xaa\x69\xaa\x85\x55\xe3\x47\x74\x2c\x14\xe4\xdf\x31\xf5\xef\xec\xc4\x5f\xc7\x06\xbf\xb6\x4a\x7e\xd6\xbf\x21\xd5\xeb\x5d\xde\xfa\x92\xea\xff\xae\x91\xd1\xcb\xc5\x42\x79\x79\x7f\x97\x00\x35\x99\x67\x39\x26\x21\xa9\x4c\x77\x35\xcc\x4d\x8d\x79\x2a\x30\x97\x62\xdb\x36\x08\x35\xa8\x4b\x89\xea\xe6\xdb\x0f\x9c\x9a\x0c\x0c\x9b\x96\xc9\x74\xd3\x20\x04\x63\xa3\xa0\xfc\x8e\xd1\xda\x74\x7f\x76\xa6\x21\xb9\x7c\x26\x2b\x9f\xa3\xf4\xbb\x08\x35\x76\x10\x26\xbe\xe7\x67\x4f\x04\xd3\x72\x99\x47\x3e\x7f\x3c\x85\x1b\x98\xca\x48\x26\xf2\x39\x02\x74\x96\x87\x53\x8b\xc2\x0f\x69\x95\x32\xda\xf7\xf4\x31\x26\xa2\x8d\x33\x8d\xf6\x45\xee\x7e\x19\xc9\xa2\x20\xb9\x9d\xa5\x9f\x23\xee\xfa\xa1\x2c\xaa\x1f\xe7\x1f\xe5\x0c\x8e\xdc\x25\x98\x3d\xe4\xa9\xdd\xa2\x4b\x1b\xe5\xa0\x8b\xca\x1a\xca\xc3\xdf\x9e\xa3\x33\x8a\xb2\x00\x7d\xd9\x88\x3c\x8e\xe5\x0a\x2c\x54\xfb\xb1\x06\x1f\xad\x43\xe3\x5c\x82\x73\x65\x87\x1f\xb3\x66\x3b\xd5\x37\x19\xc9\x41\x06\xc8\xac\xeb\xf1\x73\x07\xc0\x5d\xf5\xce\x51\x45\x14\xff\x2c\x16\xca\x3f\x39\x51\xe4\xcb\x74\x09\xc9\x25\x44\x92\x2f\x96\x67\x12\xfa\x99\x07\xc1\x06\x89\x4b\x79\x6f\xa5\x07\xa2\x26\x74\x4c\x13\x5c\xc7\x03\x97\x59\x96\xa1\x33\xd3\x36\x3c\x93\x83\xa9\xe9\x8c\x81\xed\x81\x4d\x34\xea\x10\x4d\xf7\x72\xf3\x92\xea\xba\x65\x68\x2a\xd3\x09\x36\x2d\x4c\x99\x6e\xfe\x88\x77\x0c\x04\xe6\xc5\x4b\x68\xc9\xf7\xb2\x2b\x38\x29\x36\x78\x39\xff\x79\x9c\x7e\x2f\xb0\xb2\x7f\xf4\x9d\xaf\x0f\xb4\x6c\x4f\xd2\xb6\x3d\x5b\x45\x3f\x93\x6f\x69\x7b\x92\x2e\xdb\x93\x54\xb6\xa7\x60\xc1\xd3\x2c\xda\xe1\x69\xf6\x48\x38\xa3\xeb\xf8\x92\x0b\xda\xf7\x03\x2f\x7c\xec\xf8\x91\x23\x22\x99\xc6\xfe\xa7\xf4\x0f\x29\xb9\xf7\x28\x8c\xfd\x9c\xfd\x92\x70\xf6\x38\xf2\x27\x97\x49\xc6\x26\x27\x59\xd5\xe9\x44\xb0\x98\x88\xd4\x77\x38\x83\xa0\xc5\x84\x29\xb7\xe9\x7d\x6c\x88\x49\xad\x56\x7c\x9d\x56\x2c\xbf\x4e\x27\x82\x4b\x93\x52\xf4\xf8\x37\xe9\x80\x3c\x8e\x21\x4a\xf2\xcf\x18\xdf\x7e\xc1\xe4\x4e\xf2\xc0\xbb\x35\x3e\x6f\xbd\x32\xe8\x15\x4b\xcd\x5a\x95\x80\xcc\xc2\x56\xca\xf6\x94\x07\x57\x29\xd6\xfc\x44\x0c\x9e\x7d\xcf\xe4\x6b\x1e\xb7\xbb\x86\x92\xa5\xc2\xe7\x61\x3a\x91\x22\xa0\x6d\x26\xe1\x6a\xb1\x10\x73\xf0\xcb\xd0\x90\xc5\x98\xf2\x39\x0a\x0b\xa1\x2b\xa2\x54\xf6\x0b\xd5\x2a\xf1\x4f\x2a\xb4\xa6\xdc\x81\xcb\x70\xea\x0a\xfc\x95\xdb\x04\xf9\x1c\xf9\x9d\x54\x30\x05\x6f\x23\x22\xa8\x83\x51\xc3\x6f\x99\xfe\xa7\x17\xba\x7a\x8d\x0e\xe0\xaa\x0b\x1d\xf2\x39\x72\x36\x98\x71\x67\x1e\x9f\x56\xdf\x27\x95\xf7\x5c\x3e\x47\xf3\xbe\x29\xf4\xe6\xe5\xd9\x70\xe8\xaa\x76\x73\x78\x71\x2b\xbe\x4f\x85\x35\x43\x0e\xdf\x83\x39\xeb\xc4\x75\x8e\x22\x14\x6c\xbc\xa2\xe7\xe2\x22\x77\x9c\x5f\xe2\x5e\x8f\xe4\x8e\x2c\x9f\x6b\x50\xbc\xd7\x87\xe2\x9e\xb4\x9d\x1b\x0d\xbb\x06\xbd\x6e\x7e\x15\xdd\x5b\x29\x02\xea\x79\x1f\x56\xf2\x50\x59\xe9\x1c\x6d\x8b\xab\xed\x7d\xbd\xb6\xe9\x60\x43\x72\x11\x8b\xbd\x92\xf4\xee\x41\x77\x32\xc2\x48\xbe\xf4\x5d\xb7\x47\x50\x63\x22\xd5\xa5\xb1\xd4\x90\xc5\x5d\x74\x78\x82\xf6\x7b\xa7\xbc\xbc\x32\x1b\x2d\x9f\x7c\x8e\xfe\x6e\xa8\x08\x3d\x57\x19\x25\xd4\x95\x31\xf5\xe7\x62\xa1\xfc\x99\x1b\x53\xd3\x90\xbb\x92\xcd\xa7\x3c\x70\x20\x92\x12\xb8\x9e\x4d\x53\x1b\xa1\x66\x31\x69\x46\xba\x51\xd4\x98\xe6\x39\x8e\xe3\x62\xe0\x44\xd7\x5d\xcf\xe5\x44\x73\x89\x89\x4d\x8e\xc1\x26\xa6\xa6\x19\xc5\xb5\x52\x8c\xa9\x61\x32\xc3\xc0\xd8\x52\x0d\xdd\x32\xff\xd5\xae\x67\xe9\xdd\x25\x04\xb9\x09\xc4\x03\x89\xcf\x7c\x29\x86\xe8\x26\x35\x0b\x1b\x73\x0f\x3d\x29\xb5\x6b\xa5\xfd\x20\x81\x28\xe0\x53\x24\x4e\xb6\xf2\xb7\x8b\x35\xe3\x49\xe2\xae\x1b\x41\x1c\x4b\x3c\x8e\x43\xc7\x17\xd7\x9d\x3f\xf8\xc9\xa5\x94\x5c\xf2\x64\xa9\xcf\x0f\xfe\x74\x9a\x9a\xa4\x79\x9c\x57\xac\xaa\x43\x69\xdf\x93\xf8\x34\x0e\xa5\x38\x7b\xe3\x93\x5b\x6a\x42\xa7\x48\x37\x7e\x94\xcc\xf9\x54\xca\xdf\x70\x20\xe9\x9a\x5f\xa5\xbb\x90\x08\xa4\xdb\x70\x2e\xcd\xa2\xf0\xc6\x77\xeb\x16\x6e\x0d\x1c\x31\xbc\x38\x71\x10\x80\x47\x3c\x98\x40\x79\xef\xba\x73\x3b\xcf\x03\x57\x0a\xc2\x24\x6d\x31\x8f\xf3\x4b\x66\x4b\xb6\xe5\xeb\x79\x9c\x64\x36\x75\x76\x8c\xb1\x7f\x24\xe6\xea\x07\x45\x1f\x5d\x27\x7f\xff\xfe\xfb\xdc\x9f\xc9\x88\x2c\x55\x59\xbe\x5f\xa3\xb6\x4a\x7e\xad\x6a\x95\x66\x66\x67\xa5\x7b\x6d\x8d\xd7\x2b\x90\x32\x18\x75\x4b\x76\x37\xb8\x1e\x60\xb1\x50\x00\x72\xbe\xaf\x11\x50\xc7\xb5\x1a\x4f\x05\xd5\xe3\x5c\xc5\x60\x5b\xba\xa3\x19\xba\x8b\x29\xb8\x96\x46\x0c\x1b\xdb\x96\xad\x7a\xd8\xd3\x88\x95\x5f\xab\x31\xd2\xbd\x14\xd1\xb0\xce\x4c\x6a\x59\xd4\xb0\xa8\x35\x92\x8e\xaa\xfe\xdb\xbb\xe7\x0a\xa8\x44\x3c\xac\xee\x00\x2a\x3f\x41\xab\x1c\x5b\xaa\x6d\xa8\x4c\xf3\x54\xb0\x1d\xc7\x02\xc0\x2e\x75\x5d\xb0\x08\x10\x93\x11\xdd\x24\x84\x13\xc6\x75\x35\x77\x6c\x31\x43\xc5\x54\x37\x4c\xcb\x34\x88\x4e\x09\x63\x9a\xd9\x00\xa9\xef\x7c\xae\x02\x2c\x4a\x01\x8b\x3a\x00\xcb\x19\x26\x63\xaf\xea\x52\x0f\xb3\x4d\x02\xc4\xc0\x9e\x49\x74\x8f\x18\x96\x63\x50\xb0\x4d\x0c\x5c\xf7\x54\xaa\x52\x4c\x6d\xe2\x91\x74\xcd\x85\xf7\x41\x35\x55\xac\xea\x44\x37\x98\x8e\xb1\xa1\x52\xc6\x1a\xe0\xe5\x63\x64\xf2\x27\xf6\x27\x81\x10\x32\x85\xeb\x43\x8c\x2c\xe0\x3d\xbf\x43\x85\xc4\x5e\x0a\xdb\xb1\x1c\x48\xde\x13\xa1\x71\xd5\x7a\xba\x02\x3e\x9b\x89\xe7\x6b\x8f\xd3\xdf\x1e\x07\x75\xb7\x45\x2d\x63\x00\x41\xf2\x25\x95\xf3\x44\x07\x27\xbb\x37\x8a\x86\xb4\x76\x36\x0e\xda\xca\x33\x52\xe4\x13\xad\x62\xd7\xe7\xe9\x40\x84\x0b\xa3\x16\xbb\x1e\xe9\xf5\x94\x31\x55\x8d\x0f\x11\x9f\x95\x89\x36\x9a\x29\xf2\xab\x68\xf6\x56\x23\x33\x89\xc8\x03\xa4\x22\xb9\xf2\x41\x43\x6e\x66\x08\x1f\xbe\xdc\x93\x8a\xa3\x48\x88\xdf\x13\xbb\x5f\xf4\x4a\x90\x2c\x44\x61\x5c\x76\x9d\x65\x12\x11\x37\x20\x20\xd5\x18\xc2\xff\x70\x99\x9d\x16\x3c\x92\x3b\x46\xd0\x56\xce\x0e\xd3\x8e\xe9\x2d\xa5\x5d\x13\x90\xe8\x48\xce\x22\x75\x48\xbc\x7a\x7c\x13\xe6\xee\xf6\xbe\x29\xae\xc9\x02\x8b\x0d\xe4\x46\x88\x59\xa8\x4c\xc5\x5d\xcb\xd3\x66\xa2\x49\x84\x08\x43\x45\xca\x63\xab\xfa\xc9\x42\x97\x51\xda\x86\x36\x7e\x2a\xf2\xb2\x2d\xe7\x5e\x2f\x53\xcf\x54\xb9\x8d\x49\x91\x5c\x25\xf7\x1d\x75\xe6\x34\xd0\x96\xea\xb4\x70\x47\x2a\xdc\xe1\x1a\xe5\xb6\x73\xd6\x11\x1d\xe1\x2a\x2d\x12\xe9\xcb\x59\x47\xcc\x9e\x64\x08\xc4\x42\x47\x5f\x96\xba\x66\x93\x0f\x22\xe5\x4e\x13\x7f\x79\x72\xed\xdb\x08\x61\x5c\x62\x1b\xb3\xbe\x94\x06\x19\xeb\x67\x39\x57\x4a\x1f\x25\x4a\xaa\xb8\x7e\x5d\x49\x03\xda\xde\x4b\x94\x0c\x5b\x85\x65\xcb\x8c\x4a\x63\x6b\xa7\xcc\xa7\x95\xbd\xff\x6f\x3e\xfd\x2d\xab\xeb\x2b\xab\xd7\x72\xe9\x76\xe6\x06\x4e\xba\x83\xfb\x14\xd1\x0b\x3a\x3b\xc1\x0f\xea\xa4\x05\xf8\xd7\xea\x46\x2d\xd3\x49\x24\x7d\xe9\x24\xea\xde\xcf\x32\xb1\x04\xd1\xbb\x32\x4b\x14\xa0\x74\x46\xe5\x19\xdc\x21\xd7\x8f\xc0\x49\xfc\x1b\x88\x47\x67\xcf\x61\x78\xf1\x17\x7a\x0e\xc3\xdf\x5f\xa5\xff\xc7\x13\x04\xc9\xf0\x04\xbd\x86\xe1\xee\xf6\xfb\xf4\xcf\x1e\xfc\x91\xfe\x70\x91\xfe\xf7\xfc\x9f\xb4\x84\xc7\x07\xa2\xc1\xef\xe9\xff\xf3\xf4\xbf\x3f\x8c\xb4\xfc\xf5\xe4\x65\xfa\xe7\xed\xfb\x6d\xf4\x27\x0c\x0f\x59\xfa\xe5\xaf\x0b\x9a\xfe\x39\xda\xbb\x4c\xeb\xbd\x9b\xa6\x5f\x5e\xbe\xdc\x49\xff\xfc\x7e\x2d\x7a\x7b\x7f\xf3\x2a\xfd\x63\xbf\xbe\x49\xff\x04\xef\xff\x4a\xff\xb8\xa7\x37\x28\x4a\x86\xff\xa4\x8d\xf6\x7e\x4f\x4b\xc2\xe4\x5d\xfa\xe5\x2f\x31\xf4\xcb\x28\x1d\x21\x9e\xa4\x3f\xec\xbc\xd6\x45\x37\x57\x56\xfa\xe7\x05\x13\xc3\x7e\x3c\x3e\x42\x7f\x25\xc3\xab\xf4\xf3\xa7\xdd\xe7\xe7\x28\x4e\x6e\xa7\xe9\x74\xe5\xa1\xe0\x4d\xf8\x98\xf0\x08\xf8\xd9\x45\x30\xc9\xf9\xf3\xf1\x7f\xee\x1c\xbe\x3e\xfa\xcf\xf3\xcf\x1f\x7c\x37\xb9\x1c\x31\x55\x9d\x7d\x7c\x72\x09\xe9\xee\x7f\x84\x89\x3a\xfb\x78\x27\x9f\xdf\x0d\x10\xdc\x29\x03\xf4\x31\x1a\xdf\x80\x62\x51\x4b\x65\x03\xf4\x49\x7c\x31\x30\x66\xda\x00\x5d\x89\x2f\x84\x90\x94\xd9\x9f\x67\xbf\x10\x95\x90\x5a\x32\x8c\xd7\x3d\xf9\x89\xe8\x26\x99\x78\xcc\x7b\xe6\x27\xfa\xd0\x91\x3d\xe6\x36\xf8\xa8\xa8\xf5\xa1\xca\x84\x79\x56\xa9\x48\x96\x12\x60\x3d\xfb\xe3\x6a\x75\xe6\xbc\x25\x5e\x58\x9b\x43\x4f\xea\x4b\xa2\xf7\x47\x37\x76\x08\xfb\x16\xd8\x79\xf7\xef\x86\x9d\xdf\x7b\x13\x39\x11\xeb\xeb\x21\x68\x55\xde\x1b\x52\xcf\x4c\x95\x49\x14\x11\xfc\x23\x88\x93\x68\xee\x94\x3a\xa0\x95\x82\xea\xaf\xfe\x34\x46\x2b\xb3\x22\xd1\x4d\x93\x9e\xe1\x36\x60\xa7\xb7\x33\x28\x22\x73\x84\xd1\xa9\x9f\x4c\x61\x87\xc7\x50\x02\x88\xeb\x00\x3e\x7b\x28\x80\x7d\xb9\x25\xbf\x36\x80\xbf\x3d\x24\xa9\x14\x25\x9d\x49\xa5\x7e\xea\xe6\x32\xba\x51\x26\xeb\xfb\x72\xd9\xcb\x7f\x37\x2e\xfb\x67\x4d\xca\x2d\x62\x2c\x23\xe9\x7e\xc9\x37\xa9\x56\xdf\x1a\x6d\x90\x70\xab\xca\xbf\xa6\xa3\x9f\x56\x9a\x98\xfa\x3a\x13\x73\x29\xf9\x26\xa5\xf5\x1d\x54\x67\xf2\xcd\x97\xe9\x80\x04\xc9\xc1\xa4\xbe\x2f\x23\xb8\x63\x13\xd3\x4f\x8d\x62\x73\x82\x8b\xcd\x57\xe6\xd5\xaa\x1f\xa5\xfb\x41\x9c\xf0\xc0\x81\xcc\xc9\x56\xf3\x09\xac\xdc\xb3\x3c\x38\x43\x57\xe5\x1f\xdd\xcf\x07\x3e\x15\x49\x07\x36\xcc\xd2\x99\x82\x9c\x36\x88\xeb\x54\xf3\x67\xaf\x6c\xd6\x36\x61\x2b\xba\x59\xea\xc1\x7b\xca\xe6\xa6\x84\x69\x88\x66\x11\x60\x26\x6c\x24\xf1\xca\x62\xc7\x7c\x96\x1d\x1e\xb9\x39\x4d\x83\x2b\x8f\xe0\xee\x0e\x25\xe1\xf7\xc9\xff\x85\xa0\x2f\x03\x58\x57\xe6\xa9\x09\x24\x2f\xe1\xf6\x79\x14\x5e\xd7\xd7\xb2\x2b\xa6\x5b\x19\xfa\x27\x65\xf8\x32\x9e\xd0\x04\x8a\xf8\x45\x0f\xef\xe3\xdb\x67\xaa\xda\x3f\x38\x39\xdd\x3e\xd8\xd9\xbb\x38\xfd\xeb\x68\x6f\x39\x99\x54\x9d\x80\xd7\xe4\x92\x6a\x54\xed\x8d\x40\x5d\x12\xf7\x18\x86\x71\x18\x25\xca\x00\x3d\xea\x8f\x7c\xb8\xb5\x55\xc6\xb3\x2b\x1b\x36\x83\xce\x36\x13\xfb\x7c\x8a\x86\xde\xb0\x08\x4a\x78\xb8\xbb\xd7\x9c\xdc\x40\xa4\xe2\x12\xb1\xb1\x9a\x5d\xd6\x02\xd4\x66\x01\x9d\xae\xa2\xe1\x6f\xdf\x35\xa0\x53\x0a\xca\xe3\x18\x92\x54\x78\xad\x0d\xec\x64\xd0\x2c\xb0\x13\x21\xf7\x8b\xec\xd4\x15\xbd\x29\x84\xc5\x42\x09\x0b\x5f\x63\x71\x69\x23\x87\x24\xce\x9f\x11\x59\x5c\xb5\x0c\x17\xeb\xb6\xc6\x3c\xce\x89\x6a\xa9\x06\x71\x4c\xd7\xe3\x36\x78\x1a\x23\x06\x71\x74\xc7\xb0\x8b\x67\x44\x9a\x8a\x4d\xa2\x31\x43\x37\x19\x33\x35\x6c\x90\xee\xb7\xf2\xf9\x62\x4b\x27\xf9\x58\x52\x97\xaf\xbd\x19\xe2\x49\x84\xc2\x0c\x0a\x60\x5d\xb8\x81\x69\x38\x13\x31\x5e\x9a\x67\x0c\xb5\xc8\x53\x8c\x79\x2e\xd5\xb1\xea\x99\x16\x38\x96\xca\x4c\xca\xa9\xab\x3a\xd8\xd5\x39\x57\x5d\x4b\x35\x5c\x20\x60\xb2\xfc\xa1\x85\x65\x1a\x96\xa6\x5a\x9a\x61\x30\x8b\x12\x8d\x5a\xe6\x48\xda\xad\x0d\x93\x79\x6a\xeb\x71\x83\xfc\x14\x24\xbf\x0b\x24\xb7\x8a\xda\x96\xbf\xf9\xe0\xa6\x61\x61\xc3\xd5\x99\xc6\x1d\x4a\x18\x98\x16\x71\x6d\xa6\x3b\x2e\x65\xc4\x65\x3a\x73\x1c\x0c\xac\x78\x21\x6d\x58\x86\xa9\x53\xc3\x30\x35\xcc\x34\x4a\x2c\x6c\xa9\x23\xe9\xc4\x0f\x26\xd3\xe5\x0b\x92\xd9\x4b\xe3\x63\x70\xc2\xeb\x6b\x08\x5c\x70\x85\x63\x90\x4b\x75\x60\x20\xb8\xf1\xa3\x30\x48\x3f\x0f\x3b\x82\x0a\x4d\xd3\x59\x4c\x2b\x8f\x73\xe8\x66\xd6\x76\x3f\x5e\x6d\x6c\x10\x0f\x9b\xe0\x39\xa6\x81\x4d\x8e\x6d\x00\x5b\x37\x19\x07\x8f\x83\xeb\xe8\xba\x61\xab\x8e\x09\x96\x5a\x5e\x95\x57\x55\xd5\x34\xb0\x6a\x19\xcc\xb0\x18\x13\x5e\xfa\x72\x94\x0c\xa0\x7a\x3c\x19\x9e\x02\xc4\x3b\x00\x6a\x61\xd5\xb2\x6c\xcb\x52\x0d\x15\x63\x93\xba\x36\x80\x69\xeb\x2a\x67\x2e\x53\x75\xec\x52\xe2\xea\xb6\xa5\x82\x87\x79\xfe\x4c\x5e\x37\x2c\x8d\x98\x96\xc9\x30\x25\x9a\x6a\x60\xac\xb1\x91\x74\x7a\x19\x41\x17\x52\xe3\x2e\xac\xd6\x60\xe9\x40\x6a\x3d\xec\x8c\x93\xce\xc1\x29\xe6\xd0\xb4\x41\x6a\x67\x9c\xa0\xba\x8e\x4d\x1d\x0d\xeb\x9a\xe7\x19\x1a\xa1\x96\xee\xd8\xdc\xa6\xcc\xc4\x2a\x36\x3c\x30\x35\xdd\x66\x56\x71\xba\xa0\x31\xcd\xc0\x8c\x99\x16\xd5\x0d\x6c\x52\xa6\x52\xfa\x43\xde\x0a\x0b\x43\x91\x20\x43\xa0\xd5\xf3\x27\xf3\x88\x97\x2e\xeb\xbc\x74\x09\xd9\xd2\xdb\xd7\xb1\xe4\xc2\x2c\x4b\xf7\x21\x85\xd9\x11\x04\x7c\x9c\x09\x33\x41\x0a\xe6\xd7\x76\x76\x50\x9a\x5a\x57\xe2\xa4\x33\x17\x56\x22\x7e\x7c\x96\xcd\xf9\x7f\xdf\x35\xac\x7b\xd7\x50\x0f\x44\x13\xa7\xf4\x19\xaf\xa5\x4f\x02\x0c\x54\x66\x9a\x2a\x71\x6d\xe2\xd8\x9e\x43\x74\x43\x57\x1d\xdb\x35\x39\x68\xb6\x61\x6b\xa6\xaa\x9a\xe0\x92\x42\xfa\xeb\x96\xaa\x69\x86\xc9\x28\x23\x86\xae\x11\xf5\x47\xbc\x2a\xfd\xff\x04\x7d\x6a\xcb\xa4\xf7\x1f\xda\x72\x30\xa5\x5f\xdb\x45\x3f\x53\xf5\x1b\xd2\x27\xed\x7a\xd7\x5d\x02\xda\x0c\x3f\x34\x4f\xe9\x73\xbe\x6c\x9a\x2c\xbf\xd9\xd2\x5d\xa0\xd4\xb4\xbc\x54\x54\x1a\x8e\xa5\x61\x8d\x9a\x8e\x63\x53\xc2\x35\xdb\x66\x4c\xe3\xc4\x76\x19\x2d\xde\x6c\x31\xcb\xd4\x75\x8b\x60\xa6\x6a\x2a\x31\x75\x8d\xd2\x1f\x31\xee\x48\xe7\x93\xe6\xff\x87\xc2\x7e\x7c\xa5\x20\x1f\xf5\x08\x51\xa7\x29\x31\x9d\x76\x12\xd3\x72\x08\x2b\x9b\x83\x0d\x18\x2c\x4d\xe3\xcc\xb0\x2d\x8f\x32\xec\xb9\x96\x65\xa8\x84\x6b\x5c\x37\x5c\xd5\xb1\x5c\x9b\x7a\xc5\x2d\x6d\x6c\x10\x9d\x69\x3a\xd6\x4d\x5d\x55\x0d\x43\xed\x26\xa8\x9d\xfa\x88\xd7\xe2\x38\x37\xe1\x51\x76\x0f\x06\x82\xfc\x16\x0f\x97\xa6\x90\xa4\xb5\xc2\x28\x17\x28\x48\x54\x70\x78\x66\x89\x71\x3f\x90\xc2\x60\x7a\x2b\x4d\xc3\x0f\x10\x39\x3c\x86\xbc\x41\x8c\xf2\xfa\x71\xd6\xe0\xf2\x76\x76\x09\x41\x3c\xec\xb1\xa9\xeb\xf1\x89\x66\x29\x62\x66\x9b\x20\x46\x37\x5d\xcb\xe0\xdc\x48\x65\xba\xcb\x6c\x4e\x1c\x03\x73\x53\x75\x5c\x4e\xa9\xc9\x3d\x62\x38\x8c\x7b\xc0\xf2\xcb\x58\x44\x37\x2c\x6c\x69\x8c\x51\x6a\x59\xc4\x22\x9a\xde\x1d\x3c\xb5\x8d\x98\xec\x06\x82\xc8\xc8\x23\x7d\x28\x03\xc1\x4b\xc2\xe0\x72\x7b\xe7\x54\x8f\x5d\x74\x91\xce\xe9\xa2\x73\x4e\xed\x0b\x27\xae\x67\x18\xaa\xae\x5a\x8c\xd9\xb6\xe5\x18\x16\x75\x89\xab\x9b\x9e\x4d\x1c\x83\x1b\xd4\xb6\xa8\x07\xae\x89\xed\xc2\xfe\xc2\x96\x61\x9a\xcc\x24\x18\x1b\xc4\x20\x8c\x62\x7d\x69\x0e\xed\x2b\x27\xf5\x60\x33\x6e\x0a\x9a\x0b\xbd\x6f\x4c\x4a\x35\x5c\x13\x71\x98\x11\xd3\x34\x55\x5d\x37\x1c\xdb\x33\x4c\xdb\x55\x4d\x20\xe9\xc6\xc0\xa1\x2e\x00\x50\xcd\xe0\x26\x98\x5a\x11\xcb\xd3\xa4\xba\x4e\x99\xa9\x9b\x96\xa6\x52\xc2\xa8\x6e\xfe\x80\x22\x2e\xbf\x27\xd1\xeb\xa5\xfb\xdf\x17\x4b\x2b\xae\x65\xb5\x1e\x00\xdd\xef\xa1\xcf\x74\xd2\xb8\xb4\x9f\xbf\xfb\x89\x42\x71\xe9\x3d\x08\x03\x10\x57\x4e\x1d\x1e\xb9\xa2\x96\xef\x5c\x71\x3b\xfd\x4d\x43\x72\x30\xd9\x29\xaf\x9f\xfa\xe2\x2e\xf7\x59\x5e\xf5\x71\x71\xb9\xfb\xac\xbc\xca\xef\x84\xd7\xb3\xff\x3f\x73\xd7\xde\xdc\xb6\xad\xec\xbf\x0a\xc3\xd3\xd3\x92\xb7\x10\x87\x4f\xbd\x7c\x35\xb9\x8e\x2c\x27\x6a\x6d\xc9\x47\xb2\x93\xf6\x7a\x3c\x1e\x4a\x84\x2c\x36\x12\xa1\x92\xb0\xe3\xc4\xd1\x77\xbf\x03\x80\x20\x41\x12\xd4\xc3\xed\x99\x7b\xc6\x7f\x58\x24\xf1\x58\x2c\x5e\xbb\x8b\xfd\x2d\x1e\x19\xea\x26\xf5\xe3\x6f\xd9\x59\xd1\xcc\xfa\x2c\xe4\x67\x5e\xf7\x14\x3c\x90\xbd\x82\xcf\x98\x7a\x40\x67\x6f\x16\x08\x31\x78\x4e\xa9\x3d\x5e\xb9\x3d\xe1\xbf\x0f\x82\xf0\x2a\x7c\x45\x91\xdc\x56\x85\xfd\x16\xe1\x7c\x00\x1b\x64\xec\x0b\x96\xf0\x7a\xd4\x43\x00\x9f\x44\x8b\x9b\x0a\x78\x07\xce\xd1\x7a\x86\x18\x16\xaa\x80\x6e\x10\xcd\x01\x85\xa9\x26\x75\xec\xab\x14\x5f\x20\x30\x35\xf0\x1f\x8e\xa0\x90\x43\x24\x32\x8e\xd3\x9b\x75\x99\xdf\x76\xfd\x48\x41\x20\x02\xab\x5a\x7e\x10\xbd\xfc\x38\x86\x08\x9a\xfc\x7e\x7e\x54\x8b\xaf\x61\xc8\x71\x48\x99\x5a\x50\x88\x7f\x08\x44\x22\x3f\x21\x55\x81\xba\xf6\x9f\x99\x65\x54\x05\xaa\x6b\xd3\xd9\x2a\x7a\x64\xd6\x20\x52\x8e\xf4\x25\x4f\xc1\x2f\xf9\x7e\x36\x20\xfb\xd9\xa0\xbc\xd5\xc2\x88\xac\x18\xca\xda\x9f\x2f\xc3\x08\x2a\x4b\xe8\xaf\xf0\x52\xa1\x5e\x54\xe9\x96\xd6\xf2\x5d\x08\x83\x99\x6f\x39\xce\x7c\x6e\x9b\x76\xdb\x84\xed\xce\x7c\x11\x78\xe6\xcc\x86\x73\xaf\xd3\xee\x98\xb3\xa0\x93\x4a\xed\x6d\xc7\x33\x3b\xae\xd7\xb6\x5c\xb7\xed\x78\xb6\xed\x3a\xff\x89\x4a\xe5\x80\x35\xfa\x32\x6d\xf4\x07\xd6\x68\x0a\x90\xa3\x3a\x20\xf7\xa0\xa6\x9b\x5d\xca\x92\x35\x8a\x42\x8c\x62\x41\xa3\xcc\xb5\xc6\xa5\x8f\xa9\xe7\x35\x0b\x65\xcd\xfd\xbc\x6b\xa2\xf2\xfe\xff\x04\xb2\x6e\x56\x36\xce\x66\x75\xe7\xac\xbc\xfa\xaf\xe6\xab\xf6\xce\x57\xeb\x09\x4d\xd9\x76\xda\x2c\xb9\x39\xbf\x0a\x2f\x75\x38\x18\x35\x9d\x0a\x6c\x50\xb0\x31\xc1\xc6\x4b\x20\x2c\x54\x79\xc6\xc2\x42\xb5\x6b\x60\x49\x17\x86\x1d\x95\x49\x20\xb5\x0e\x3f\x44\x16\x85\x0a\xf6\x7b\xc4\x40\x3f\xaf\x44\x2e\xf1\x0b\x25\xf6\x83\x4d\x4a\x0b\xf7\x2e\xc8\xc9\x71\x6b\x7c\xad\x7c\x59\xd3\x2a\x29\xa8\xea\x75\xae\xce\xe9\x71\xec\xd2\xe5\x2e\xcd\xd3\xb3\x27\xcd\x06\xb6\xc4\xe1\x32\x3d\xf9\x2f\x1c\xdc\x57\x7d\x9a\x7d\xee\xd1\x3c\x0a\x7e\xd1\x52\xf9\x0b\x54\x6f\x27\xc1\x06\xd9\x34\xfb\xe4\xf3\x19\x7c\xd2\xf4\x6d\x56\x06\xf7\xa2\x6d\x66\x67\xc1\x2d\xd1\x11\x20\xf7\x3b\x68\x03\x75\xc3\xfd\x70\x09\xd5\x9d\xd4\xbb\xb6\x72\x1e\xbf\xc9\x3c\x6a\xa9\x43\x88\xc5\x7d\x60\x6b\x1c\x9d\x6d\xee\x3d\x9a\x3b\xc2\x5a\xd5\xc6\x5b\x99\x93\xa9\xf0\xae\xea\x50\x6b\x35\xb9\xcf\x2b\x4d\x50\xe7\x50\x6b\xb5\x6b\x9c\x1d\xac\x0e\xb8\xfc\x6b\xde\x0e\x85\xc6\x65\x5e\xc7\x56\xce\x47\xbb\xce\x81\x03\x58\xed\x3c\x91\x9d\x3b\x4c\x58\x9d\xfc\x98\xde\x91\x7a\x4c\xd8\x2e\xf8\x72\x90\xcb\xc4\xeb\x7e\x70\xe7\xe5\xb2\xff\x74\xf3\x35\xc3\xef\x2a\x46\x81\x38\xfe\xec\x56\x65\x00\x16\xdd\x9d\x6d\xc1\x41\xba\x53\x1a\x83\x8e\x09\x6c\x89\xf7\xbf\x63\x95\x47\xa1\x63\x03\xdb\xdd\xd1\x3c\xc7\xa9\x8e\x42\xc7\xad\x8c\x42\xc7\xab\x8e\x42\xa7\x59\xf5\xb7\x69\x01\x3b\xc7\x19\x38\xed\x9a\x51\xe8\x74\x6a\x46\xa1\x6b\x82\x7f\xfd\x8d\xa3\xd0\xb5\xaa\xa3\xd0\xb5\x0f\x18\x85\xae\x93\x8f\x42\x3b\xef\x1f\xd7\x95\x8e\x42\xd7\x03\x9f\xfe\x8d\xa3\xb0\xd8\xa4\x66\x75\x79\x6c\x55\x7d\xa5\x5c\x3e\x92\x88\xc4\x2c\xf3\x95\x72\x33\xc0\x06\xb0\xdb\x59\xff\x79\x26\xb0\x73\xe8\x80\x67\xd5\x79\x4c\xd9\x35\xfd\xe7\x39\xe0\x17\xc2\x89\x3a\xc7\x9b\xfd\xfd\x47\x8b\xcf\x51\x04\x4e\x0e\x94\xf1\xbc\xa2\xc7\xd3\x12\xae\x32\xec\x01\xad\xbb\x09\x7e\x8f\x81\x0d\xa4\xf8\x11\xe0\x58\x79\xc2\x16\x78\x77\x58\xc2\x36\xf8\x40\x12\x4a\x5d\xad\x78\x42\x39\x8e\xc3\xeb\x80\x3f\x62\x60\xd9\x80\x2f\xf2\x4e\x3e\xbd\x9a\x12\xdf\xb6\xa6\xb5\x1f\x7e\xd1\xb4\x65\x5d\xd6\x74\x80\x93\x8f\x85\x66\x9d\x93\x5b\xb3\xd6\xcb\xad\x09\x7e\xdb\xd5\x65\xce\x5e\x24\x05\xad\xb7\xb5\x0f\x1a\xd2\xcc\x51\x43\x8e\x00\x45\xaa\xe2\x86\x5a\x26\x97\xf1\x5e\x81\xa1\xa1\x2e\x77\x56\x65\x8a\xb4\xb2\x6e\x10\x76\x7b\x87\x21\xaf\xfc\xc7\x20\xc4\x8d\x15\x7a\x78\xa0\x2a\xb7\xd3\xda\x55\xc7\x91\xa0\x8e\xdc\x4b\x0c\x1f\xea\x87\x6a\x67\x99\x0b\xfe\x70\xa9\xa1\xe9\x07\x68\x7c\xfc\xf5\x4f\xb2\x8d\x43\x04\xb0\x11\x26\xa9\xb1\xf5\x6a\xe5\x47\x67\xf0\x49\xcf\x32\xa7\xc2\x80\x1c\xe5\x50\x32\x67\x64\x75\x5b\x39\xc2\xc1\x13\x2b\x4f\x9d\xf1\xb0\xe0\x8c\x07\x64\x48\x88\x22\x91\xb6\x29\x21\x92\xec\x82\x07\x52\x59\x36\x32\x64\x64\xa6\x5d\x74\x0c\x99\xed\x1d\xf5\x08\x86\x83\xac\x0a\xcf\xcc\x69\xa4\xbf\x28\x5e\xa6\x88\xe9\xc4\x9f\x1f\x54\x0a\x36\x81\x01\x15\x9a\xdf\xa6\x7b\x83\xbf\x52\xbb\xaa\x2a\xe3\x90\x60\x6f\x00\x98\x7b\xde\xa1\x78\x10\x3d\xae\x8d\x8f\xa7\x17\xc3\xb3\xfb\xfe\xc5\xcd\xf4\x7a\x30\x61\x57\x1f\x82\xaa\xa3\xed\xae\x12\x3e\x7d\x18\x5e\x0f\xa6\x57\xa7\xfd\xa3\x73\x4e\x06\xff\xba\x19\x4e\x06\x67\xb2\x7c\x0c\xdf\xf2\x06\xcb\x5d\xd2\xb2\x1c\xad\x1d\x0c\xae\x57\xc0\x32\x7e\x37\x9d\x52\x49\xb4\xee\x74\xb5\xab\x96\xc8\x2c\x2a\xa7\x64\xe6\x5e\xb0\x89\xab\xd7\xce\x45\x2d\xd7\xdd\xd2\xf7\xb4\xa7\xf7\x42\x73\x7e\x83\xc6\xfa\xb3\x00\x9a\x49\x11\x37\xbf\xac\xff\x60\x68\x99\x22\x80\xa6\x8c\x9d\x11\x00\x3b\x55\x18\xcd\x7b\xcf\xcb\x11\x3e\xcf\x93\x2b\xf2\x10\x9d\x95\x00\x36\x7b\x61\x3d\xe7\x31\xc3\x0e\x7d\x3b\x3b\x4f\xa1\x40\x05\xe8\x0d\xb7\x15\xca\x70\x37\x9b\x54\xcf\xeb\xc6\x70\xe5\x13\x0e\x9c\x10\x55\xaf\xeb\x3a\xff\xdc\x1a\xb9\xf9\x59\x96\x13\xc3\x67\xdc\xf0\x57\xe1\x43\xd4\x9d\x53\xb4\x65\x9a\x81\x7b\xb0\xca\xf2\x90\xfd\x20\x59\xfa\x01\xfa\xd2\x35\x15\xc3\xf2\x62\xb8\x56\x4c\xc5\x54\x9e\xfc\x58\x6b\x34\xe8\xb6\x41\x8a\xc8\x6c\xeb\x8d\x3c\x03\xd1\xcb\x51\xac\x9f\xcc\x50\x1c\xc0\xb8\x41\x9b\xd7\x4d\xd0\x2a\x0c\x4e\x70\xec\x47\x09\xe9\xce\x2e\xfd\x45\xf4\xd1\xdf\xb5\x86\x61\xc5\x70\xad\xb3\x8f\xac\x89\x2c\xab\x62\xd8\x89\x02\xfd\x04\x82\x2c\x5f\xf6\x8a\x97\x4e\xeb\xea\xfe\xc3\x6a\x75\x66\x81\x53\x7c\xb9\x83\xd4\x3c\x15\x50\xd2\xbc\x7a\xca\x14\x66\x9f\x97\xb0\x44\x51\x14\x23\x3d\x8d\x90\x31\x8c\xf2\xb7\x11\x62\xb8\x4e\xba\x33\x3f\x81\xab\x30\x82\x5b\x63\xe9\x37\xb8\xe2\x2d\xcb\x14\x30\xe7\xda\x6e\x48\xc3\x95\xb1\x03\x88\xad\x11\xc3\x45\x0c\x93\x65\x63\x86\xa5\x03\x61\xfe\x18\x27\x28\xee\x6e\x50\x48\xfa\xf2\x64\xed\xc7\x0f\x61\x44\xf5\xfe\xae\x65\x6e\x9e\x4f\x5e\x53\x28\x69\x1c\x4f\x41\x67\xb0\x74\x04\xfa\x41\x10\x46\x0f\x5d\x6f\xf3\x7c\x52\x1d\x8d\x18\x6d\xba\xf6\xe6\x79\x6b\x48\x4e\x01\x64\xa5\xad\xfd\xe7\x06\xc7\x92\xfd\x53\xcc\xc5\x86\xe5\xa1\xec\x3a\xc9\xcb\xb1\x29\x0c\x8d\x64\x5c\xa2\x44\x6c\x9a\xa2\x08\x62\x92\x22\x11\x99\x04\x62\x1c\x93\x14\xc2\x7b\x9a\xa2\x15\x4f\x83\x27\xb2\x9f\x49\xe7\x09\x27\x29\x42\xa4\xbb\xe7\x8f\x71\x4c\xbe\xb2\xdb\xd9\xe4\xad\xce\x7b\xcb\x86\xeb\x93\x05\x8a\x70\xe3\x0b\x83\xd1\xd9\xa6\x29\x80\xe8\x62\xd4\x7b\x82\x9a\xd7\x6c\x77\x9a\x3a\x40\x88\xe1\xe6\x4c\x22\x87\x45\xf4\xa1\xe5\x76\x4c\x57\x07\x21\x7d\x70\x3c\x8f\x28\x83\x2b\x96\xac\x03\x1d\x1d\xf8\xf4\xb7\x6b\xdb\x44\xfd\x9b\xb3\x54\x1d\xb3\xe5\xe9\x20\xa1\x0f\x56\xcb\x75\xda\x3a\x78\x64\x85\x59\x0e\x51\x40\xaf\x11\x03\xee\x39\x9e\xa3\x83\x0d\x2b\xac\x69\x7a\x2d\x1d\xdc\xa7\xd5\x38\x1d\x11\xab\x37\x40\xa2\x4f\xbf\xe0\x77\x3f\xd8\x9c\x33\xbf\xfb\x0a\x90\x85\x43\x8d\x6d\xae\x96\x32\x65\x7c\xe9\x47\x0f\x50\xd0\xc6\x73\x77\xf2\x1f\xa0\xd1\xff\x70\xa9\x31\xe7\x7c\xea\xcf\x6f\xa0\x68\xb8\xde\xa0\x18\x9f\x87\x2b\x38\x4d\x17\x31\x0d\xa6\x7a\x7a\xd9\x30\x35\x7b\xc4\x98\xca\xcf\xee\x2e\xdd\x3f\xab\xe5\x84\xf9\xee\xff\x00\x8d\xcb\xd3\x44\xb3\x33\x1f\xea\x4a\xe5\xef\x68\xb9\xd4\x4c\xa0\xe9\x3f\xfe\x08\x8d\x39\xfb\xb9\xcd\xf4\x78\xb7\x02\x32\xa6\x18\x1d\x01\x13\x31\x3a\x9e\x7f\xbc\x39\xa9\xa5\x61\xb7\x29\xa3\xc2\x3b\x5b\x37\xe0\x33\xa1\xbe\x2f\x3a\x8d\x89\x44\xdb\x15\x23\x45\x99\xe8\xf1\x11\x44\x0b\xd1\x12\xa8\x9b\x5a\xbc\x4e\xc1\xd1\x05\x90\x14\xf9\x4c\x35\xb4\x72\x20\x85\xa6\xd8\x91\x15\xab\x00\x7f\x95\xdb\x00\x3c\xa1\xbb\x3b\xaf\xe1\x8f\x6e\xb0\xb3\x0a\xce\x11\xa2\xdc\x34\x25\xea\x8a\xd0\x0f\xe6\xeb\xea\x89\xe1\x53\x08\xbf\x14\xbb\xe1\x8d\x25\x74\x44\xbb\x62\x8a\x60\x78\xa3\x11\x62\xc6\x96\xa2\xd9\xa2\x4e\x03\x62\x9d\x17\x2e\xb4\x0c\x17\x83\x6a\x90\x77\x54\x7a\xfb\x12\x7e\xa3\x87\xe6\xc8\x60\xbf\x46\x55\x6c\x58\x1d\xdc\x1d\xed\x80\xbb\x0b\x6a\x51\x10\x26\xe9\xa1\x01\x32\xd2\xdf\x67\x94\xe5\x6c\x3e\x95\x2a\x63\x40\x34\x96\x40\x21\x59\x76\x6b\x64\x40\xcd\x3c\x59\x54\x59\xe5\xc5\x40\x52\x40\x65\x4e\x8d\x6b\xb2\x40\xf3\xd3\x27\x36\x3d\x1a\x8b\x18\xad\xf9\x90\x55\x53\x34\xd0\x44\x8a\x06\x5a\x86\x01\xa4\x10\xa0\x53\xd4\xbb\x7d\xd9\xf8\x78\xd9\x55\x55\x30\x47\xeb\x0d\x8a\x60\x84\xab\x17\x9d\x1f\x03\x0b\x12\x21\x10\x2c\x7f\x22\x83\x08\x25\x45\x88\x10\x98\x03\x1f\x84\xba\x6e\x84\x74\xa5\xe2\x20\x21\x04\x92\xb4\x79\xfc\x4d\x04\x12\xc3\xdf\x84\xfd\x55\x08\x23\xdc\x5b\x81\x44\x06\x22\x62\xf7\x95\x93\xb5\x96\x2d\x7c\x30\x18\x3c\x51\x33\x43\x05\xc4\x93\x66\x16\xe0\x39\xfd\xf1\xe8\x7c\xf8\xfe\xfe\x7c\x78\x31\xb8\x1f\x5e\x5e\x8d\x27\xd7\x83\x33\x01\x19\x54\x2c\x98\x6a\x3a\x7f\xa5\xec\xfb\xc1\x64\x32\x9e\x94\xca\xff\x94\x0d\xe4\xda\x52\x55\x1a\x3b\x80\x25\x54\x4b\xd9\xa7\x18\x6e\x6a\xee\x88\x67\x99\x6f\x29\x12\x87\x96\x70\xc5\xce\x47\xe3\x73\x14\xaf\x41\xfe\x9a\x46\x3b\x28\xbe\xa2\xa1\xc7\x18\x6c\x24\xff\x72\x09\xb1\x1f\xf8\xd8\x2f\xa7\x65\xe1\xac\xf2\xb7\xc3\x00\x46\x38\xc4\x5f\x4b\xe9\xc6\xc9\x70\xed\x3f\xc0\xfc\x6d\x1f\x86\x1b\xf2\x74\x97\x35\x29\x7a\x18\x47\xc3\x28\x94\xf1\x77\x0d\xb5\x8f\x50\x8b\x89\x06\x8f\x11\xa6\xaa\xbb\x90\x9c\x42\xa6\xf2\x21\x96\xde\x73\x4f\x35\x8e\x74\x2c\x19\x09\xc4\x74\x1e\x6a\xf9\xa7\x9f\xd5\x2c\xb0\x0a\x7d\x19\x53\x50\x17\x8c\x39\x0e\x4c\xe3\xf7\xe5\x57\x21\x62\x5a\x8e\xcf\x62\x51\x1a\xfa\x31\xa4\xcd\xf6\x57\x57\x7e\xec\xaf\x93\xf1\xec\x0f\x6a\xea\xad\x34\x84\x4d\x32\x5a\xee\x43\x1a\x65\x82\x21\xa6\xbe\x41\xe3\x6a\x32\xfe\x38\x3c\x1b\x4c\xc0\xe7\xfc\xf7\x3d\x1d\x4d\xfd\x8b\xf1\xcd\x99\x0e\x70\x0f\xbe\x65\xf8\xb5\xae\xaa\xa6\x33\xed\x05\xc3\xc8\x8f\xf0\x30\xe8\x1e\x51\xe8\xf5\x60\x74\x3a\xba\xd6\xc1\x9c\x4e\xad\xe3\xf2\xf6\x2f\x86\x83\x3c\xef\x14\xce\x63\x88\x8f\xcf\x3f\x1d\xf4\x27\x83\x6b\x1d\xa4\xcc\xa5\x66\x8e\xe3\xe8\x98\xde\xbc\x9b\xf6\x27\xc3\xab\xeb\xe1\x78\xa4\x03\x9f\xc5\xd7\x40\x8f\x41\x17\x6f\x45\x84\xe0\x95\xff\x75\x85\xfc\x60\x67\x57\x00\xdc\x7b\xd9\x9e\x60\x83\x16\x72\x3a\x9f\xa3\xc7\x08\xb3\x7e\x64\x3d\xb5\xab\x8f\x35\x1d\xdc\xde\xaa\x2b\xc4\x37\x9a\x3a\x72\x27\x83\xf7\xc3\xf1\x88\x3a\xe5\x24\xcb\xab\xc7\xd9\x2a\x9c\xff\x0a\xbf\xd6\xa7\x9f\x4e\x3f\x5c\xdd\xbc\xbb\x18\xf6\x7f\x1d\xfc\x7e\x77\x67\x2c\x50\x3c\xf0\xe7\x4b\x2d\xa3\x3f\xce\x4f\x84\x6e\xe3\x5b\xf3\xee\xae\x07\x4b\x8c\x8b\x6f\xad\x3b\x10\xdf\xda\x77\x64\xdb\xc6\x86\x18\xfd\xf0\x7c\xe5\x3f\xa1\x38\x1b\x86\x53\x8c\x62\x18\x08\x36\x35\xc2\xf4\xd1\xf8\x6c\x30\x1d\x5c\x5f\x0f\x47\xef\xcb\xd9\xd3\x93\x72\xb2\xcd\xd5\x0c\x65\x21\x33\xf3\xed\x61\x76\xad\x2a\x0d\x6f\x29\xa4\xb0\x00\x23\xbc\xbf\x9a\x8c\xcf\xba\x92\xf7\x67\x83\x8f\x84\x12\x76\xe6\x2c\xd2\x40\xe1\x99\xfe\x86\xae\x84\x7c\xc2\x87\xc9\xa5\xcc\xbc\xa4\xe9\x6f\x6b\xdb\x52\x33\xfa\xc4\xb6\xec\x01\x40\x02\x2c\x31\x4d\xa5\x96\xa9\x8c\x53\xef\x10\x5a\x41\x3f\xda\x53\xc9\xe5\x69\xff\xc3\x70\x34\xb8\xff\x30\x38\xbd\xb8\xfe\x70\xdf\xff\x30\xe8\xff\x3a\xbd\x1f\x8c\x4e\xdf\x5d\x0c\xce\xd8\x96\x1c\x1f\xb3\x8e\x4c\x06\xd3\xf1\xcd\xa4\x3f\x78\x3f\x19\xdf\x5c\x8d\xd9\xac\xe9\xf5\x7a\x7f\x42\x63\xf0\xdb\x70\x4a\xea\x7d\x5b\x9b\x9c\xa7\xe8\xd6\xa6\xe8\xdf\x4c\xaf\xc7\x97\x27\xd8\x88\xc5\x10\xc0\xfb\xe8\x8b\xe9\xc0\xca\x8d\xa5\x59\xfa\xcb\x3e\x79\x24\x0b\xb0\x51\x89\x2b\x5c\x53\xe8\xc7\xd1\xe0\x9a\x34\x98\xfc\xcf\x68\xbb\xa7\xc4\x31\x6e\xa1\x43\x32\xf2\x96\xde\x8f\x27\xf7\xac\x4d\x3a\x88\x7a\xb7\xb7\x59\x70\x53\x3a\x61\x0b\x59\x58\x32\x6a\x5f\x25\xb3\xfb\x29\x0b\x2b\x5a\x93\xb0\x3f\x3c\x9b\x50\xe7\x08\x49\xf4\xd3\x4a\x96\xf1\xe8\x7a\x32\xbe\xb8\xba\x38\x1d\x0d\xee\x47\x83\x4f\xd3\x9b\x77\xe4\x35\xaf\xab\x2e\xa0\xe9\x81\xc5\x70\x4a\xaa\x41\x49\xcb\x05\xf0\x11\x5f\xa1\x40\x16\x69\xf6\x80\xec\xb4\xe6\x3b\x2e\x2b\xa2\x5e\xaf\xf7\x35\x1f\x87\x3f\xfe\xa8\xed\x61\x79\xd6\x4b\xff\x7e\xa6\xff\x1d\x1c\x7f\x2d\xbb\xc5\xba\xef\x74\x10\xfd\x0d\x9b\x40\xd5\xcc\x7d\xe4\xb2\xc4\x16\xa0\xfb\xd3\x9b\xb3\xe1\xf5\xfd\xc5\xf8\xfd\x7b\xb6\x3d\x90\x32\xc2\x28\xe4\xbb\xed\xa7\x10\x2f\xfb\x68\xbd\x46\x51\xa2\x61\x9d\x9e\xd8\x14\xe3\x58\xed\xae\xb5\xc0\x8c\xab\xc9\xf0\xe3\xe9\xf5\x80\x1f\x64\x90\xd2\x16\x31\xb5\x5b\x05\x69\x99\xc3\x4d\x4f\x55\x25\x95\xfc\xf8\xa3\x26\x4b\x7b\xc0\x32\xc0\xeb\x1c\x5e\xe9\x3a\xc0\xb9\xcc\x0d\xf1\x79\x8c\xd6\x75\x22\x45\xaa\xc2\x62\x5a\xc3\x49\xb8\xd0\x9e\x50\x18\x28\xe6\x9b\x5e\x0f\x52\x7b\x44\xfe\x28\x91\x34\xf4\x97\x05\x8a\x35\xb6\xac\x9b\x00\xf5\x98\x74\x61\x7c\x86\x5f\x13\x4d\x9a\xfe\x24\xfe\x6f\x94\x62\xf5\x4f\xe2\x9f\x7f\x66\x75\x47\x3d\x74\x1b\xdf\x9d\xa8\xb9\x38\xa4\xbe\xe9\xf5\xa2\x14\xcc\x9f\x90\x7d\x9e\x36\x7b\x8a\xe3\x30\x7a\x28\x2c\xc6\x11\x90\x55\x73\x1b\xdd\xe9\x54\xbd\x0c\xa5\x54\x1b\x79\x45\x60\xd5\x0b\xdf\x3e\x43\x63\x11\x46\x81\x56\x1b\x78\xa1\xd7\xeb\x85\x5b\xbd\xcb\x58\x71\xb2\x3a\x84\x30\xb9\x34\x0c\x56\x2c\xfa\xcb\xca\x48\x8d\x9c\xd4\x18\xb0\x3d\xae\x38\x51\xc8\x02\xd0\x10\x25\x33\x2e\xfc\x1f\x5a\x14\x93\xef\x00\x34\xb8\x28\xc8\x0b\xd8\x2f\x5e\x01\x28\x11\x8c\x76\xd4\x2f\x15\xae\x64\x65\x1c\x29\x5c\x95\xe8\x10\x24\x23\x1d\x1c\x25\x62\x7d\xff\x7e\x10\xed\xbb\x85\x29\x00\xab\x92\x5e\x85\x29\xe9\xf2\x71\xbc\x04\x05\x60\xbd\xa4\x76\x7c\xd7\x57\x24\x21\x00\x8b\x92\x10\x2f\xd2\x7f\x82\xa9\x6c\x03\x8b\xa7\xc4\xe9\x7e\x57\xba\x67\x41\x2e\xcf\xf0\x1d\x8f\x6d\x8e\x7b\xe5\x90\x23\xb6\xc2\xbf\x28\x77\xbc\x5a\xde\x78\xa5\x9c\xb1\x47\xbe\xd8\xb5\x5f\xc2\x74\xbf\xc4\xd2\x6e\xa6\x9b\x01\xdd\x3a\xd3\x74\x74\xf7\xac\x1d\x7a\xbb\xf6\x2b\x00\x2b\xfb\x92\x2e\x79\xb7\x63\x21\xac\xd9\x99\x00\xac\xee\x6d\x47\xcd\x0f\xd9\x56\x0e\xa0\xec\x24\xbc\x66\x3e\x44\xc8\xb8\x7a\x32\xc6\xd3\xe1\xe5\xe9\xfb\x01\x88\x91\x71\x6d\xb0\x9f\xd0\x40\x49\x1a\xb8\x2b\x1b\xf6\x4c\x1c\x60\x61\x35\x85\x4d\x54\xe3\x6b\xcb\x63\x02\x63\x71\x71\x79\xdc\x04\x3e\x4e\xad\x5e\xd7\xe1\x1a\x26\xd8\x5f\x6f\x98\xf5\x46\x30\xfe\x6e\x4b\x76\x98\x09\x3d\xda\xf2\x57\xd9\x7d\x44\xb5\x71\x80\x68\x49\x99\x75\x31\x55\xf1\xa9\x3d\xa8\x54\x86\x06\x75\xd1\x9e\xc0\xa6\x6f\xbd\x09\xf0\x40\x1d\xb2\xe0\x96\x91\x0b\x18\xd9\xfa\x50\x1b\xe0\xe7\xa0\x45\x55\x2c\x1d\x14\xe9\xef\xaf\xc2\x7a\xc1\x25\x82\x5f\x94\x2f\xd8\xf8\x0c\xe2\xde\x0b\x03\xee\x5f\xf9\x78\xd9\x85\x40\x30\x6c\x67\x5a\x72\x3f\x7f\xa7\xe9\x40\x58\xcd\xba\x15\x35\x0e\x3e\x93\x61\xda\x5f\x85\xfd\x75\x90\x74\x6f\xef\xb6\x27\x99\x37\x2b\x23\x49\x8b\xcb\x44\x0e\xa2\xa7\x8f\x7e\x1c\x92\xb1\x28\x8b\xc8\x54\x30\xde\xa8\x2a\xf8\x8f\xd3\x85\xc1\x5f\xd0\x37\x5f\x98\x09\xb9\xb8\xea\x77\x6f\x0b\xaa\xf3\x1d\x60\x89\x24\xfb\x03\x4d\xb9\x43\x1f\x2e\x64\x25\x43\x24\xcf\x50\x52\xc5\xde\x4a\x35\xae\xae\x74\xcb\x11\xca\x24\xcb\x6f\x95\x88\xc2\xfe\x93\x19\xc9\xc9\x46\x71\x5f\xd1\xb5\xf6\x53\x54\xa7\xa5\x75\x0f\xda\xc3\x76\x54\x5f\x43\xfc\xae\x2d\x8d\x95\x46\x45\x98\xa3\xda\x50\xd5\xf3\xba\x7b\x76\xc2\x6a\x4d\x72\x72\xe5\x3b\x22\x9f\x76\x5a\x99\xa0\x5b\x55\x36\xe2\x54\xa0\xd6\x8e\xb1\xe2\x37\x42\x5c\xf6\xa6\xb6\x53\xb3\x14\x65\x4e\xa9\x77\xdd\xbf\x95\x82\x6c\x10\x1e\x41\x53\xed\x58\xa8\xa7\x5a\xf6\x81\x5d\xa9\xa3\x4b\x45\x0f\x66\x85\x8a\x88\x82\x86\x7f\xee\xa9\x2a\x91\xb6\xe7\x3e\xd6\x62\xf0\x53\x4f\xfd\x49\xe7\x8f\x65\x15\x1e\xdd\x9a\x77\x00\xdd\x5a\x77\x3a\xf8\x49\x55\x7e\xa2\xa2\x48\xb6\x58\xfa\x9b\xcd\xea\xeb\xf5\xe7\x07\x76\x54\xbb\x67\x5b\xca\xb7\x3b\x96\xed\xd7\xf7\x2c\xdb\x39\x8a\xe9\xce\xa7\xbd\x6c\xa8\x56\x97\x2d\xe0\x7c\x93\xd6\xb7\xf9\xf2\x1c\x43\x1c\x87\xf0\x09\x0e\x9e\xb9\x93\xc3\xc1\xb5\xb2\xe3\xbd\xd7\x55\x2b\x71\x0c\xd8\xb9\x2d\x9c\xd0\xc2\x0a\x07\x8a\xe9\x93\x96\x9e\xf6\x94\x9b\xa1\xe9\x40\x0c\x3f\x07\xb9\x62\x49\x0f\xfe\x34\x2c\x12\x53\x39\x4f\x53\xc1\x03\xc4\x55\x06\xbc\xd0\xb3\x1a\x71\xdd\xa6\x27\x4f\x5d\x75\xe8\xfb\x53\x85\x17\xa0\x02\x21\xea\x56\x57\xfd\xc8\x3c\x29\x59\xf8\x1c\x76\x21\x62\x0a\x6d\x8c\x95\x79\x76\x06\x91\xd0\x58\x3a\xd7\x7e\xf4\xed\x51\x05\xa1\xd5\x8e\xba\x2f\x62\xd9\x24\x07\xc9\x90\x60\xb8\x61\x77\x4b\x15\x2b\xa9\x26\x12\x3e\xab\x5b\x30\x5f\xf9\xdf\xbe\x75\x6f\x84\xb3\x94\xc2\x61\xe1\xbe\xf6\xd2\xc5\x28\xa5\x47\xb8\x69\x99\xc7\xa2\x2b\x11\x33\x65\xd7\xe5\x14\x2f\xd1\x56\xd8\xe4\x2b\x34\x8d\xde\x2a\x5e\xd7\xa4\xfc\xa3\xac\x29\x67\x71\xa9\x29\xa5\x43\xce\x7d\x2d\x12\x65\x2c\x46\xcd\x73\x6c\x44\xec\x24\xb1\xef\x27\xe9\xc1\xa2\x3c\x70\xe7\xcf\x6a\x25\x1a\x9f\x9c\x03\xfc\xa2\x09\xae\x3b\x26\xca\xcc\x9f\x7f\xe6\x6f\xb3\x05\xa3\xbe\x2a\xa0\x72\xa0\xaa\xaa\x17\x59\xc7\xee\x3c\x65\xb5\xd7\xb2\xb0\x9a\x48\xc6\x4a\x8c\x4a\xac\x14\xce\x76\x6b\xd8\x98\x89\xc5\x42\x52\xed\x12\x97\x66\x94\x70\x96\x5c\x57\x0e\x65\xfa\x02\xc5\xeb\x4f\x21\x5e\x8e\x9f\x60\x1c\x87\x01\x4c\x18\x47\xc4\xa3\xe8\x97\x43\x07\x98\x30\xab\xc3\xcc\x6d\x8b\x4f\xc1\xaa\xa4\x0c\xb2\xc0\x94\x6f\xde\x60\x23\x0d\xa3\x92\x68\xe9\x4e\xa0\xea\xdf\xbf\x6b\xfe\x0a\xc6\x58\x83\x3f\xab\x4a\x98\xd0\x60\x2b\xfc\x82\xa5\xec\xf6\x65\x31\x20\x56\xb8\x82\x6f\x54\x1d\xbc\xb1\x64\x74\x4c\xd2\x45\x8a\xdb\x8e\xe8\x32\x79\xb8\x52\xc3\x0a\xaa\x5f\x6f\x5f\x48\xed\xa9\x0f\x60\xd2\x85\x5b\x29\x2f\xae\x62\x34\x87\x49\xb2\x87\x04\x80\x41\xcc\x35\x94\x82\x95\x54\x8b\xb3\xe3\xf5\x04\xe2\x6b\x74\x1e\xc6\x09\x9e\x62\xb8\xe1\xc7\xeb\x05\x2f\x10\x63\xf3\x38\x5b\x85\xc9\x92\xb9\x5c\x4c\x1f\xe7\xa4\x6a\xca\x75\x21\x20\x6a\xc5\xc3\xad\x76\x23\x78\x63\x9e\x88\x9c\x09\x93\x71\x24\xd4\xff\xfd\xbb\x06\x7b\xa9\x17\x8d\xa6\xb2\x52\xc9\xc0\xa7\x37\x7b\xa1\x27\x18\x7f\x89\x43\x0c\x15\x3f\xfa\xaa\x04\x3e\xf6\x29\x58\x7c\xe9\x3f\x41\x76\x29\x0c\x0c\x0c\x85\xf2\x86\xdf\x11\xc6\x1a\xf2\x56\xd5\x75\x00\x2b\xd4\x8a\xce\x80\xf5\xfa\xd7\x0b\x7c\x82\x11\x6f\x76\x37\xf5\x3e\x90\xfa\xb7\x10\xa5\x8a\xfc\x3f\xf7\xc3\xd5\x63\x0c\xe5\x69\x73\x97\x15\xb2\xb7\x85\x2b\xd8\x85\x06\xf6\xe3\x07\x88\x0d\xf2\x94\x10\xc1\x22\xf3\xdb\xef\x0a\xbd\x21\xce\x01\x40\x96\x20\x18\x05\xe5\xef\xd2\xb1\x29\x84\xb0\x05\x28\x2a\x34\x64\xf7\x88\x2a\x66\x2c\xb4\x6a\xc7\x00\x49\xd3\x6d\x4f\x24\x09\xd9\x93\x86\x75\x90\x35\x9a\xb2\xbd\xa7\xaa\xaf\x89\xfe\xbb\x86\x49\x02\xa3\x07\x18\xe7\xfe\x20\x9a\xe0\xee\xc3\xcc\xbf\xf7\xfd\x0f\xa7\xa3\xf7\x83\x33\x50\xed\x5a\x68\x6c\xd8\x84\x38\xc1\x6f\xb5\xfa\x78\xc2\x98\x05\x4c\xd1\x6e\x4b\x51\x84\x8b\xb2\xef\x74\x77\x90\xe1\x3b\xf0\xc2\xad\xd0\x5d\xbc\x4d\x0d\x2c\x47\x55\x37\x9e\xde\x53\x53\xce\xf4\x4e\xd7\xbb\x3b\xc8\x9d\xaf\xa0\x1f\x6b\xbb\x69\xdd\x55\xbf\x34\x7f\xb1\x31\x47\x67\xcf\x68\xd7\x8b\x62\x6b\xd1\xbb\x67\xb7\xf0\x58\x5f\x25\x2f\x67\x4f\xa3\x81\x24\x92\x31\x14\x96\xe6\x07\x88\x53\x63\x93\x60\xf0\x4d\x88\x94\x09\x54\x32\xaa\x61\xa0\x60\xa4\x70\x21\x35\x13\x08\x94\x07\x9a\x2e\x8b\xa3\xb8\xf1\x63\x1c\xce\x1f\x57\x7e\xac\x30\xaf\x6e\x43\xdd\xc5\xaf\x3a\xe2\x4b\x31\xaa\x0f\xa4\xbd\x10\x91\xba\x96\xf4\x74\xc3\xbd\x54\x92\xf0\x1b\x4c\x5e\x45\x5e\xd6\xa3\x12\xe7\x55\x19\x61\xe3\x29\x15\x32\x12\xad\x86\xa4\x55\x98\x60\x05\x2d\x94\xf1\x54\x09\x69\x42\x65\x11\xa3\x35\x65\x28\xbb\xb9\x31\x84\x7c\xb7\x9e\xd2\xeb\x24\x5f\xc7\x55\x22\x04\x1f\xcc\x4c\x22\x59\xd7\x33\x91\x53\x4c\xe4\x96\x43\xa8\xe5\x81\xb6\x11\x32\xfe\xf7\xd5\x81\xb6\x2f\xa0\x71\x9e\x62\x92\x9d\xa6\x16\x22\xe3\xf7\xec\x61\x85\x8c\xeb\xec\xe1\x1c\x1a\x7f\x3e\x66\x4f\x3e\x32\x56\x57\xd9\xd3\x1c\x19\x67\xcf\xd9\xd3\x0f\xd0\x98\xbe\xfb\xf3\xd8\xe0\xdd\xf4\x8c\xb1\x91\x3a\xff\xee\x88\xdb\x6d\xa5\x71\xbb\x3b\x92\xb0\xdd\xa9\x37\xe4\xad\x10\x63\xeb\xae\x10\xc2\x0b\xa8\xeb\x59\xc3\x36\xe5\x77\xf6\xf3\x38\x4a\x7e\xcc\x92\x06\x61\xac\x02\x35\x0d\x66\x91\x46\x54\x72\xcc\x3c\x5c\x06\x77\xbf\x56\xb1\x4f\xf6\x35\xf8\xac\x02\xd5\x2c\xc7\xce\x20\xfb\xaa\x0a\xd4\xcf\xf0\xeb\x0c\xf9\x71\x70\x41\xc6\x50\x94\xc6\xca\xb2\x80\x1a\x26\x8d\x30\x5a\xa0\x34\x61\x63\x15\x46\x9f\x69\xd0\xa1\x2c\x30\x98\x1a\x06\xa4\x48\xca\x1c\x1e\x10\xaa\x10\xa7\xcc\x2a\x44\x12\x1a\xc1\xef\xdf\xb5\x11\x8f\x24\xc4\xb8\x29\x46\x9c\x5e\x2c\x16\xb6\xe9\xb9\xd6\x1c\xb6\xed\xf6\xdc\x99\x79\x6d\xe8\x75\x5c\xd3\x5d\xb4\xda\x30\xe8\x40\x77\xe6\x37\xed\xa0\x33\x4b\x2f\x86\x74\xed\x56\xa7\x6d\x36\x9b\x1d\xcb\x75\xda\x66\xcb\x6c\x37\xbd\x52\xd0\x9e\xb3\xe1\xc7\x52\xd8\x1b\xf2\x26\xf7\x96\xae\x8d\x54\xc8\x2f\xbc\x2b\x04\x22\xfc\x47\xb3\x1a\x61\xa6\x1c\xbf\x26\x0f\x38\x63\x01\x75\x9d\xa4\xe3\x26\x9c\xa3\xa8\x41\x3b\x07\x2d\x16\x09\xc4\x0d\x8c\x36\x2c\x30\x8b\xec\x0e\x69\x07\x70\x2f\x73\x36\x10\x66\x98\x74\xe3\x0c\x47\x8d\x4d\x1c\xae\xfd\xf8\x2b\x19\x28\x98\x0c\x14\x40\x9d\xfe\xb9\xbb\xb8\xd0\x2d\x62\x58\xb4\x0d\x5a\x85\x18\x66\x11\xba\xd8\xcd\xe6\x3c\xac\xcd\x82\xda\x4e\x2c\xf6\xa3\xc1\xa1\xcc\x80\xc3\x4d\x48\x4a\xf2\xe5\x66\xc3\xbc\x0d\xd4\x0a\x49\xe8\x11\xaf\xc2\x88\x86\x54\xa3\xc2\x4e\x83\x7e\x12\xc6\x48\xde\xfb\x63\xd2\xfb\xe3\x2c\x18\x31\x4d\x5e\x52\x45\xd8\xa0\x65\xdd\x6b\x06\xf3\xb6\x6b\xfa\x96\xd9\x31\x03\xa7\x39\x0b\xbc\x59\xd0\x81\x0b\xab\xe9\x79\x96\xd5\x71\x3b\xd0\xf5\x3a\x8b\x85\xe7\xa5\xf1\xa3\xec\x76\xc7\x6b\x59\x56\xd3\x75\xad\xa6\xd5\x71\x2c\x1a\x34\x9b\x49\x68\x4a\xc1\x62\x93\x06\x6c\x24\x5c\xae\xfa\xe8\x57\xe6\x23\x96\xce\x47\xd6\xf4\x42\x08\xb7\x9a\x7e\x62\x60\x89\x8c\x29\xb2\xce\xaa\x61\x27\x0c\xc2\x5d\xcc\x9c\x10\x66\x4e\x38\x33\xb9\x86\x81\x94\x74\x52\xd1\x7b\x23\x83\x10\x17\x38\xea\xdb\x0b\x7b\x61\x75\xcc\xb9\x3b\xeb\xb4\x66\xad\x00\x42\xa7\x65\x75\xfc\xc5\xdc\x0d\x9a\x33\xd3\x84\x33\x2b\x70\x3d\xbb\x93\x5f\x72\xda\xb2\xdb\x6d\xa7\x69\xda\x1d\xdb\x76\xac\x0e\xe1\xe8\x80\x94\x29\xe5\x67\xa1\x19\x6c\xa5\x48\x0d\x66\x3b\x5a\x71\x4a\x5a\x71\xca\x5b\xc1\x92\xef\x18\x12\x9d\x66\xb3\xb3\x98\xcf\x16\x9e\xeb\x9b\x0b\x73\x0e\x9d\xe6\xa2\xe3\xb4\x2d\x3b\x80\xed\xa6\xdf\xf2\x5c\xd7\x5f\xd8\x33\xc7\x9d\xa5\x01\xc8\x1c\xaf\x6d\x7a\x8e\xd9\xee\x58\x2d\xb3\xe9\x75\xdc\x8e\xdd\x55\x98\xad\x4d\xd6\x84\xc3\x43\x00\x51\x50\x4d\x01\x73\xc4\x60\x36\xd9\x1b\x0e\xcc\xb7\x45\x74\x4e\x1e\xa8\xc0\x39\x00\x10\x83\x8d\xc8\x7f\x0a\x1f\x7c\x0c\x35\x6c\x9c\x5e\x5d\xdd\x4f\xc6\x37\xd7\x83\xa9\x71\x71\x3a\x3a\x1b\x8e\xde\xcb\xa0\x5c\x2e\x50\x97\x36\x0f\xe9\x42\x03\x5f\x80\xfc\x4a\x98\x62\x60\xa0\x6a\xbc\x83\xdf\x47\x73\xad\x05\x06\x08\x78\x87\x43\x67\xd2\x4b\x7f\xe8\x4d\xaf\x4b\x3f\x86\x41\x23\x80\x2b\x88\x61\x83\x88\x28\x8d\x0d\xda\x3c\x6e\x44\x1c\x53\x47\xb8\x14\x36\x8d\xa4\xd0\x48\x20\xe6\x49\x78\xc0\x21\xbe\x71\x1d\x02\x4f\xc2\x72\x94\x90\x29\x80\x93\x2c\x0b\xa8\xca\x64\xf0\x71\x38\xf8\xa4\x30\x40\xc4\xcd\x84\xae\xf6\xca\xce\x0b\x5b\xed\xe2\x6d\xa2\x34\x9a\x90\x03\xc6\x08\x58\x26\xf0\xca\x0c\xb2\xca\x57\x78\x09\xc1\x14\xca\x01\x04\x5a\x60\x82\x00\xa7\x3b\x0f\x1a\xd0\x3c\x3e\xa8\x82\x27\xc3\x1d\x1d\x00\xe0\x61\x2b\xaf\x2a\xcb\xcd\xd1\x4d\x78\x0f\xba\x29\x4f\x17\x73\x11\x54\x96\x2c\x5f\xee\xde\x50\x29\x93\x1d\xa5\x53\xad\x3e\xc4\x5f\x35\x5d\x1e\x15\x82\x5d\x3d\xc9\x19\x54\x44\xb4\x17\xf0\xeb\x09\x32\x3e\xb0\x4b\x1a\x1f\x91\x71\x03\xae\x91\x31\x4a\x01\xe6\x1b\x64\x4c\xc1\x3d\x32\x3e\x08\xe0\x71\x29\xec\x95\x0d\x36\x0a\x66\xf5\xe7\x73\x14\x07\x21\x8a\x1a\x4b\xe8\x07\x30\x6e\xb0\x6f\x2f\x14\x80\x4a\x04\xac\xae\xe5\x6e\x9e\x4f\x38\xc6\xb7\xb3\x79\x56\xac\xf6\xe6\xf9\x24\x05\x58\xbb\x2d\xf2\x27\x07\xd7\xee\xaf\x45\x29\x7d\x9c\xa3\xf5\x86\x4e\x25\xb2\x62\xbc\xf0\x2a\xe6\xad\x96\x33\xdf\xf2\x85\xc4\xc8\x84\xb2\x1d\x38\x5a\x1a\xc3\xad\x4b\xe9\x2c\xa2\xa2\xe5\xf8\x64\x8a\x8f\x5e\xac\x90\x8f\xbb\x44\xb4\xdc\x2e\xed\x1d\x65\x93\x0c\xe6\xf6\x7f\xd6\x30\x08\x7d\x45\xcb\x11\xc2\x8a\xd7\x6a\x6e\x9e\xf5\x17\xa3\xb0\x4b\x1e\x08\xbc\xdf\x97\x47\x51\x14\x23\xdf\x55\x25\x09\x80\x72\x50\x19\x7c\x7f\xad\xbf\xc1\xd3\x32\xcd\x7f\x6e\x73\xbc\xf1\xf6\x0e\x2c\x24\x77\x58\xcd\x60\x76\xc0\xa6\x40\x4d\x7f\xe1\xa8\x33\xa8\x6f\x8f\xd6\x7a\x72\x9d\x64\x8d\x02\x8a\x42\x3c\x7d\xc7\x75\x12\x42\x45\xfa\x31\x8c\xfe\x20\x1f\xe7\xbf\x4c\xb5\x17\x36\x99\x89\x9e\x72\x01\x8d\x77\xdf\x8c\x05\x8a\xfb\xcb\x70\x15\x68\xa7\x48\xbf\x03\xf4\x5d\x06\x98\x7e\x60\x80\x67\xd7\x6d\x36\x75\xd0\x67\x18\xe7\x8e\xd7\xb6\x75\x30\x4d\x91\xcc\x76\xc7\xd1\xc1\xf0\x3f\xaf\x95\xfc\xf0\x29\xe9\xde\xfe\x01\x8d\xc9\x1d\xc8\x9b\xfd\x1b\x34\xe0\x37\xb0\x40\xe0\x01\x19\x6b\xd0\x47\xc6\x85\x4f\xaf\x6f\xb8\x44\xc1\xe3\x0a\x82\x29\x32\x66\x77\x59\x17\x6e\xef\xf4\xad\xa6\x9f\xfc\x5f\x00\x00\x00\xff\xff\xe5\x79\xa2\x47\xe5\xaa\x01\x00") - -func bindataTkgWebDistTkgkickstartui39es501e37d969093a24ceaf8JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui39es501e37d969093a24ceaf8Js, - "tkg/web/dist/tkg-kickstart-ui/39-es5.01e37d969093a24ceaf8.js", - ) -} - -func bindataTkgWebDistTkgkickstartui39es501e37d969093a24ceaf8Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui39es501e37d969093a24ceaf8JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/39-es5.01e37d969093a24ceaf8.js", - size: 109285, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui3rdpartylicensesTxt = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xfd\x72\xdb\x38\xb2\xef\xff\x7c\x8a\xbe\xae\xba\xf7\xda\x55\xb4\xec\x64\xf6\x33\x33\xb3\xb5\x8a\xcd\xc4\xdc\xb5\x25\x1f\x49\x9e\x6c\x6a\x6a\xea\x14\x44\x42\x12\x12\x10\xe0\x02\xa0\x6d\xcd\x1b\x9d\xd7\x38\x4f\x76\xaa\x1b\x00\x49\x7d\x24\xf6\xe4\xcc\xee\xd6\x56\x34\x7f\x4c\x24\x91\x04\x1a\x8d\xee\x5f\x7f\x82\xfe\x33\x53\xcb\x46\x32\x73\x5a\xf2\xfb\x8f\xc2\x9d\xcd\x1b\x21\xcb\xd3\xf0\x63\x72\x93\xcf\x92\xd9\x8a\xc3\x4d\x3e\x83\x6b\x51\x70\x65\x79\x92\x5c\xe8\x7a\x6d\xc4\x72\xe5\xe0\xb8\x38\x81\x97\xe7\x2f\x7e\x0f\x6f\xb5\x5e\x4a\x9e\x42\xae\x8a\x41\x92\xdc\x72\x53\x09\x6b\x85\x56\x20\x2c\xac\xb8\xe1\xf3\x35\x2c\x0d\x53\x8e\x97\x29\x2c\x0c\xe7\xa0\x17\x50\xac\x98\x59\xf2\x14\x9c\x06\xa6\xd6\x50\x73\x63\xb5\x02\x3d\x77\x4c\x28\xa1\x96\xc0\xa0\xd0\xf5\x3a\xd1\x0b\x70\x2b\x61\xc1\xea\x85\x7b\x60\x86\x03\x53\x25\x30\x6b\x75\x21\x98\xe3\x25\x94\xba\x68\x2a\xae\x1c\x73\x38\xdf\x42\x48\x6e\xe1\xd8\xad\x38\x1c\x4d\xc3\x13\x47\x27\x34\x49\xc9\x99\x4c\x84\x02\xbc\x16\x2f\xc1\x83\x70\x2b\xdd\x38\x30\xdc\x3a\x23\x0a\x1c\x23\x05\xa1\x0a\xd9\x94\x48\x43\xbc\x2c\x45\x25\xc2\x0c\xf8\x38\xad\xde\x26\x4e\x43\x63\x79\x4a\x74\xa6\x50\xe9\x52\x2c\xf0\x5f\x4e\xcb\xaa\x9b\xb9\x14\x76\x95\x42\x29\x70\xe8\x79\xe3\x78\x0a\x16\x7f\x24\x36\xa6\xb8\x8e\x33\x6d\xc0\x72\x29\x93\x42\xd7\x82\x5b\xa0\xb5\x76\xd4\xd1\x3d\x48\x7a\x8d\x0c\x75\x81\x45\x16\x7f\x79\x58\xe9\x6a\x73\x25\xc2\x26\x8b\xc6\x28\x61\x57\x9c\x9e\x29\x35\x58\x4d\x33\x7e\xe0\x85\xc3\x5f\xf0\xf6\x85\x96\x52\x3f\xe0\xd2\x0a\xad\x4a\x81\x2b\xb2\xaf\x12\xda\x63\x36\xd7\xf7\x9c\xd6\xe2\x37\x57\x69\x27\x0a\xcf\x6e\xda\x80\xba\xdb\xd5\x70\xc9\xae\x98\x94\x30\xe7\x81\x61\xbc\x04\xa1\x80\xf5\x96\x63\x70\x7a\xeb\x98\x72\x82\x49\xa8\xb5\xa1\xf9\xb6\x97\x39\x48\x92\xd9\x55\x06\xd3\xf1\x9b\xd9\xbb\xe1\x24\x83\x7c\x0a\xb7\x93\xf1\x0f\xf9\x65\x76\x09\x47\xc3\x29\xe4\xd3\xa3\x14\xde\xe5\xb3\xab\xf1\xdd\x0c\xde\x0d\x27\x93\xe1\x68\xf6\x1e\xc6\x6f\x60\x38\x7a\x0f\x7f\xcd\x47\x97\x29\x64\x7f\xbb\x9d\x64\xd3\x29\x8c\x27\x49\x7e\x73\x7b\x9d\x67\x97\x29\xe4\xa3\x8b\xeb\xbb\xcb\x7c\xf4\x16\x5e\xdf\xcd\x60\x34\x9e\xc1\x75\x7e\x93\xcf\xb2\x4b\x98\x8d\x01\x27\x0c\x43\xe5\xd9\x14\x07\xbb\xc9\x26\x17\x57\xc3\xd1\x6c\xf8\x3a\xbf\xce\x67\xef\xd3\xe4\x4d\x3e\x1b\xe1\x98\x6f\xc6\x13\x18\xc2\xed\x70\x32\xcb\x2f\xee\xae\x87\x13\xb8\xbd\x9b\xdc\x8e\xa7\x19\x0c\x47\x97\x30\x1a\x8f\xf2\xd1\x9b\x49\x3e\x7a\x9b\xdd\x64\xa3\xd9\x00\xf2\x11\x8c\xc6\x90\xfd\x90\x8d\x66\x30\xbd\x1a\x5e\x5f\xe3\x54\xc9\xf0\x6e\x76\x35\x9e\x20\x7d\x70\x31\xbe\x7d\x3f\xc9\xdf\x5e\xcd\xe0\x6a\x7c\x7d\x99\x4d\xa6\xf0\x3a\x83\xeb\x7c\xf8\xfa\x3a\xf3\x53\x8d\xde\xc3\xc5\xf5\x30\xbf\x49\xe1\x72\x78\x33\x7c\x9b\xd1\x53\xe3\xd9\x55\x36\x49\xf0\x36\x4f\x1d\xbc\xbb\xca\xf0\x27\x9c\x6f\x38\x82\xe1\xc5\x2c\x1f\x8f\x70\x19\x17\xe3\xd1\x6c\x32\xbc\x98\xa5\x30\x1b\x4f\x66\xed\xa3\xef\xf2\x69\x96\xc2\x70\x92\x4f\x91\x21\x6f\x26\xe3\x9b\x34\x41\x76\x8e\xdf\xe0\x2d\xf9\x08\x9f\x1b\x65\x7e\x14\x64\x35\x6c\xec\xc8\x78\x42\xdf\xef\xa6\x59\x3b\x20\x5c\x66\xc3\xeb\x7c\xf4\x76\x8a\x0f\xe3\x12\xe3\xcd\x83\x24\x49\x22\xa8\x9c\x31\x25\x2a\x52\x1b\x4b\x50\xd2\x5d\x28\x74\x55\x69\xb5\xf3\xa3\xe1\x5b\x3f\x2d\xb4\xa9\xb6\x9f\x95\xba\x60\x52\xfc\xbc\x7d\x6b\x2d\x99\xc3\xdb\x4f\xe7\x46\x3f\x58\x6e\xb6\x2e\x1b\xdd\xb8\xf6\xc7\x39\x9b\x73\x79\x66\x1a\xe5\x44\xe5\xc7\xf9\x3c\xc2\xfd\xe6\xb4\x36\xdc\x72\xe5\x60\xca\xe7\xcc\x3a\xc1\x14\xdc\x14\x7f\xe5\xea\x67\xe1\x35\x44\xbb\x15\x37\xa8\x53\x5e\xd5\xb5\xb1\xbf\x12\x0c\x26\x1e\x06\xe1\x4b\x61\x30\xd9\x07\x83\xf0\xcb\x60\x30\xf9\x2c\x0c\xc2\xb3\x60\x30\x79\x06\x0c\xc2\xe7\x61\x30\x79\x1e\x0c\xc2\xe7\x61\x30\xf9\x87\xc1\x60\xb2\x05\x83\xf0\xcf\x86\xc1\xa4\x83\x41\xf8\x42\x18\x4c\xb6\x61\x10\x9e\x03\x83\xc9\xf3\x60\x10\x9e\x80\xc1\xe4\x79\x30\x08\x4f\xc0\x60\xf2\x8b\x60\x10\x3e\x01\x83\xc9\x17\xc1\x20\x6c\xc0\xe0\x06\xcc\x9c\x22\xbc\x7d\xb0\xdf\x1c\xe0\xe6\x00\x37\x07\xb8\x39\xc0\xcd\xaf\x0f\x37\x45\x69\xfb\x3e\x54\x21\xd1\x01\xeb\x02\x39\xff\x8b\x28\x3a\x6f\xac\x70\x46\x9e\xa9\xe5\xe3\x69\xa1\x4b\x5e\x09\x63\xb4\x79\x06\x3a\xfd\x11\xa6\x85\x76\x0e\x2e\xb4\xae\xb9\x39\x84\x7b\x87\x70\xef\x10\xee\x7d\xdd\xe1\x9e\x14\xee\xcc\x70\x56\x38\x71\xcf\x4f\xb9\xe4\xa8\xa0\xc9\xeb\xe9\xe5\xe9\x37\xa7\x17\x92\x35\x96\xe3\x17\x88\x5f\x9e\x91\x49\x82\xeb\xeb\x8b\x01\x0c\xa5\x8c\x46\x1f\xdd\x21\x73\xcf\xcb\x41\x92\x4c\x78\xab\x62\x28\x9c\x28\xb0\x38\xa8\x50\x60\x75\x63\x82\x08\xcf\x85\x62\x66\x0d\x14\x3e\xa6\xa4\xd7\x28\x9e\x41\xbf\x13\xd2\x5d\x51\x30\xaf\xff\xa8\x4e\x5e\xe5\x10\x60\x6a\xa3\xef\x05\x0a\xb7\x5b\x31\xf7\x49\x25\xa2\x87\x2a\xee\x5e\x25\xc9\x8b\x01\x6c\x92\x44\x12\x1f\x68\x41\x60\x85\xaa\xb1\x08\x39\x88\x74\x34\xe0\x7e\xd5\x4b\x49\xef\x12\x00\x90\xc2\x3a\x82\xcc\xde\x74\xa4\x96\x7d\x5a\x4a\x61\x0b\xc9\x44\xc5\xcd\x20\x49\x5e\xee\xd2\x20\x54\x9f\x09\x91\x86\xda\xe8\xb2\x29\xf8\xe7\xc8\x40\x0a\x08\x01\x7e\x21\x19\xd1\xcb\xdb\x40\x68\x1c\x2c\x20\x9f\xf7\x59\x2b\xe6\xb8\x11\x4c\xda\x8e\xd1\xb4\x3b\xf4\x64\x6f\x01\x83\x24\xf9\x66\x00\x23\x2e\xe8\x29\xbc\xaa\x58\xc5\x23\x96\x74\x44\xaf\xb4\x2c\xb9\x01\xa5\xbb\x9b\x88\xff\xc2\x11\x2b\xfb\x2e\x32\x54\x6c\x8d\xf0\xd5\x58\x0f\x99\x5c\x95\xda\x58\x8e\x82\x51\x1b\x5d\x69\xc7\xc1\xb3\xc7\x59\x28\xb9\x11\xf7\xbc\x84\x85\xd1\x55\xcb\x10\xbb\x6d\x46\x6c\xcd\x0b\x14\x24\xa8\x8d\x40\xf1\x32\x28\x42\xaa\x07\x9d\x84\x75\xf9\x74\x3f\xd8\xbd\x7e\x4f\x6a\xb6\x8b\x10\x88\x34\xa4\xd8\xf9\xeb\xbb\x19\xe2\x48\x80\xc5\x04\x2f\x20\x60\xec\x3a\x5e\x3d\x74\xeb\x41\x61\xba\x07\x0b\x53\x52\xdf\xdd\xc7\xf6\x80\x22\x11\xf2\x34\x2e\x4e\xb2\xe4\x32\x9f\x12\x88\x65\x97\x9f\xf2\xc5\xb6\x57\xe9\xb1\xb1\xb7\xc6\x16\x16\x93\x08\x8b\x97\xf9\x24\x43\x64\xcb\x47\xdd\xa7\x8b\xfc\x32\x1b\xcd\x86\xd7\x29\x4c\x6f\xb3\x8b\x1c\x3f\x64\x7f\xcb\x6e\x6e\xaf\x87\x93\xf7\x69\x18\x73\x9a\xfd\xc7\x5d\x36\x9a\xe5\xc3\xeb\x24\x42\xea\xf1\x13\x2c\xb9\x9d\x8c\x2f\xee\x26\x84\xe9\xc8\x87\xe9\xdd\xeb\xe9\x2c\x9f\xdd\xcd\x32\x78\x3b\x1e\x5f\x92\xa1\x99\x66\x93\x1f\xf2\x8b\x6c\xfa\x2d\x5c\x8f\xa7\xc4\xad\x3b\xc4\xd8\xcb\xe1\x6c\x48\x13\xdf\x4e\xc6\x6f\xf2\xd9\xf4\x5b\xfc\xfc\xfa\x6e\x9a\x13\xd3\xf2\xd1\x2c\x9b\x4c\xee\x6e\x11\x68\x4f\xe0\x6a\xfc\x2e\xfb\x21\x9b\x24\x17\xc3\xbb\x69\x76\x49\xdc\x1d\x8f\x68\xa9\xb3\xab\x6c\x3c\x21\x23\xb7\x1f\xf3\x3b\x98\x9f\xce\x26\xf9\xc5\xac\x77\x5b\x82\x68\x8d\xd8\xdf\xad\x11\x46\xd9\xdb\xeb\xfc\x6d\x36\xba\xc8\x36\x2c\xc2\x49\x6b\x11\x72\x3f\xed\xbb\xe1\xfb\xe8\x8f\x06\xc0\x4f\xe8\x63\x4f\x62\x53\xda\x49\xc8\xdf\xc0\xf0\xf2\x87\x1c\xc9\x0e\x37\xdf\x8e\xa7\xd3\x3c\xc8\x09\xb1\xec\xe2\x2a\x58\xb0\x41\x92\xfc\xd9\x3c\x3e\xf0\x79\x67\x13\x28\x2f\x77\xcf\xa4\x28\x19\x05\xab\xe4\x7e\x3e\xd3\xe9\xbc\x08\x96\x61\xbe\x86\x1b\x66\xc4\x07\x05\x57\xec\x9e\x9b\x39\xff\xc8\xe1\xbb\x8a\x7e\x59\xfd\x79\x59\x31\x21\x07\x85\xae\xfe\xd4\xc5\xc7\xbf\x56\x4c\x7c\x70\x4d\xff\x2d\x5d\xd3\xe4\x5f\x11\x13\x1f\x5c\xd3\x7f\xa9\x6b\x9a\x6c\xc7\xc4\x18\x0e\x9f\x7e\xf0\x80\xb3\x27\xcd\xf6\xf2\xfc\xe5\x0b\xb8\xe4\x4a\x58\xb8\x6d\xec\xea\x23\x33\xfc\xfe\x80\x1a\x07\xd4\x38\xa0\xc6\x01\x35\x3e\xd8\xd3\xba\x09\xc9\xb4\xfd\xd0\xf1\xf2\x00\x1d\x07\xe8\x38\x40\xc7\x01\x3a\x7a\xd0\x81\x5a\x78\x6a\x31\x40\x79\xaa\x79\xea\xbf\xff\x0b\x81\xe4\x77\xf0\x63\x26\x05\xbc\x35\x7c\xfd\xd3\x8f\x2f\x7e\xfa\x95\xbb\xa7\xbe\xb8\x8e\xb7\x17\x42\x7e\x61\x1d\xef\xf3\x10\xf2\xbc\x3a\xde\x73\x20\xe4\x89\x3a\xde\x33\x21\xe4\x89\x3a\xde\x3f\x2f\x9d\xfe\xaf\x84\x90\x2f\xad\xe3\xed\x40\xc8\xb3\xea\x78\xcf\x84\x90\xa7\xea\x78\xcf\x84\x90\xa7\xea\x78\xbf\x0c\x42\x3e\x55\xc7\xfb\xb2\x74\x7a\x1f\x42\x00\x7e\x7c\xf1\xd3\x2b\x58\x39\x57\xbf\x3a\x3b\xe3\x52\x2c\x0d\x5f\x0f\x0a\x5d\x25\x49\x22\xea\x53\xc3\x97\xfc\xf1\xa9\x2a\xdd\x54\xa8\xd2\xa0\x8c\x98\x55\x63\xe1\x3b\x4b\x5f\x2d\x7d\xeb\xa7\x4a\x8e\xfb\x17\xf0\xa7\x93\x03\xfc\x1c\xe0\xe7\x00\x3f\x5f\x33\xfc\x24\xc2\x9e\x8a\xfa\x00\x30\x07\x80\x39\x00\xcc\x01\x60\xfe\x11\x00\x23\xc5\xa1\x39\xe0\xd0\x1c\x70\x68\x0e\x38\x34\x07\x1c\x9a\x03\xbe\xc6\xe6\x00\x29\xdc\xa1\x49\xec\x60\x07\x0e\x76\xe0\x60\x07\x0e\x76\xe0\x2b\xb7\x03\x2b\x57\xc9\x83\x11\x38\x18\x81\x83\x11\x38\x18\x81\x83\x11\xf8\x0a\x8d\x40\x22\x75\xc9\xec\x6a\xab\xcb\x66\x5c\x73\xf5\x97\x29\xbc\xd1\x8d\x2a\x59\x0b\xde\xbb\xa7\x5e\xe1\xbb\x95\x73\xb5\x7d\x75\x76\xa6\x6b\xae\x3e\xd8\xc5\x40\x9b\xe5\xd9\x9f\x92\xe4\x35\x43\xd5\xd5\x0a\xee\x54\xc9\x8d\x2d\xb4\xe1\x83\x0f\x36\xed\xc1\xc1\x5f\xb8\xe1\xd5\x1a\x86\x76\xf5\x91\x2b\x66\xd3\xe4\x32\xa0\xd1\x85\xd4\x4d\x49\xf3\xe5\xea\x9e\x5b\x27\x96\xcc\x89\x7b\x0e\x13\x5e\x6b\xe3\xb8\xb1\xf0\xff\x20\x2b\x45\x37\xfd\xab\xb3\xb3\xa6\x9d\xe5\x83\x8d\x24\xcc\x36\x80\xa0\xd0\xca\x0a\xeb\x08\x71\xee\xb5\x6c\x94\x43\xc0\x6d\xd7\x42\x98\x59\xb1\x92\xc3\x7c\x0d\x15\x53\xeb\x44\xa8\x52\xdc\x8b\xb2\x61\xd2\x0e\xe0\x8d\x36\xc0\x1f\x59\xe1\x36\x9e\x80\x95\xb0\x4e\x9b\x75\x0a\x96\x7b\xa0\x36\xfc\x5e\xd8\xde\x95\x84\xdd\x33\x21\xd9\x5c\x72\x60\x0e\x22\xaf\x96\xc2\xad\x9a\xf9\xa0\xd0\xd5\x99\xe7\x7e\xf8\xc7\x67\x7a\x3b\xc4\x0e\xc9\x68\x60\x75\x2d\x05\xa7\xcc\x32\x93\x12\x6a\x66\x9c\xdd\xcd\xbc\xf3\xc7\x82\xd7\x0e\x98\x4d\x22\xae\xf3\x12\xe6\x5c\xea\x87\x57\x49\xf2\xfd\xf7\xdf\x7f\x7f\x38\xa2\x7c\x38\xa2\x7c\x38\xa2\xfc\x35\x1f\x51\xf6\x28\xd0\xc1\x3c\x8a\x90\xe1\x92\xd4\x35\xa8\xce\x02\x65\x83\x55\xb5\x0c\x1e\x31\xe9\x22\x23\x0f\xeb\x5e\x30\xb8\xb8\x38\x1f\xc0\x94\xae\xd3\xf9\x11\x94\xee\x92\x2f\x84\xe2\xa8\xfb\x24\x63\x7d\x7f\xba\x14\xb6\x96\x6c\x1d\x5c\xc7\xa0\xe3\xb5\xd1\x36\xfa\x87\xc9\x06\x4a\x0c\x92\xe4\xe2\xe2\xbc\xed\xbd\x28\x0c\x27\xe8\xf7\x2f\xab\xf1\xc0\x4e\xda\x5b\x94\xba\x62\x42\x9d\xfd\xcc\x8d\x3e\x7b\x31\x38\x3f\x8b\x4b\x7b\x43\x28\x23\x75\x41\x4b\x0a\xf3\x29\x5d\xf2\xff\xac\x74\xd9\xe0\x35\x5c\xf2\x3d\xf9\x93\x50\x0a\xc3\x0b\xa7\x0d\x6a\x84\x07\x50\xc7\x8d\x62\x52\xae\x13\x1c\x1d\xe1\x8e\x97\x20\xc5\xdc\x30\xba\x87\xbc\xd1\xf9\x7a\xdb\xc3\x5c\x89\x62\x05\x2b\x76\x4f\x16\x40\x18\xd0\x0f\x2a\x09\x58\x62\xbf\x85\x07\x34\x0a\xb8\x00\xae\x4a\x58\xeb\x06\x0c\x67\xe4\x99\x57\x29\x32\xcc\x3f\xe2\xb8\xa9\xbc\xd3\x5b\x8a\xc5\x82\x1b\x72\x66\x89\x3d\xfe\x0a\x21\x00\x1a\x6b\xc5\x5d\xc5\xec\x47\x7f\x7e\x47\x2d\x1f\x4f\xa5\x5e\x9e\x56\x5a\xa1\x35\xf4\x3f\x1a\x56\x95\x6c\x5f\xeb\x1b\x1c\xdf\xe4\xb3\x93\x3d\x91\xdc\x37\xa7\x2f\xcf\x5f\x9e\x87\x33\xe5\x53\xd6\xac\xb9\x17\x8c\x1b\x51\xac\x18\x97\x70\xd5\x18\xc9\xd7\x87\xd6\xda\x43\x6b\xed\xa1\xb5\xf6\xab\x6e\xad\x35\x7c\xc9\x15\x37\xcc\x69\x73\xfa\x05\xaf\xee\x4a\xe1\x0d\x2b\xf8\x5c\xeb\x8f\x87\xf7\x14\x1e\x10\xe5\xf0\xe2\x8a\xaf\x0f\x51\x76\x5e\x5c\x61\x1e\x3f\xd8\x64\x58\xb3\x62\xc5\x4f\x5f\x0e\xce\x13\xf8\xfc\x7f\xfe\xce\x16\x6b\x3e\x79\xdf\x0f\xdc\x90\xf8\xbd\x1c\x9c\xa7\xf0\x17\xa6\x1a\x0c\xf5\x5f\x9e\x9f\xff\xe6\x13\x8f\x04\x77\xf3\xe1\xe1\x61\xc0\x68\x0a\xf2\x34\xa3\x0f\x77\x96\x24\x30\xcb\x26\x37\x6d\xb6\xef\x32\xc7\xe5\xfb\x0d\xa7\xcc\xd2\x24\xbb\x9d\x8c\x2f\xef\x88\x2b\x29\xdd\x75\x99\x4f\x7d\xbe\x0c\xdd\xf6\x04\x5e\x0c\xe0\x12\x9d\x64\xaf\x47\xd4\x63\x0c\x70\x14\xd6\x71\x14\xf4\xa3\xe2\xcc\xa3\x46\xf0\xf9\x54\xd9\xcf\xe7\xa2\x5f\x4e\x20\x12\x33\xc3\x04\x41\x34\x10\xde\xb9\x99\x68\xef\x7c\xf2\xf9\x1a\xa6\xbc\xf0\x43\xbc\x00\xb7\x32\xba\x59\xae\xe0\x8f\x6d\xf0\x1e\x51\x71\x93\x26\x6d\x76\x88\xea\xf4\x5d\x3f\x28\x6e\x50\x67\xb9\x72\xc2\xad\x81\x35\x6e\xa5\x8d\xf8\x99\x66\xa3\x51\xf6\xdd\x4f\x39\x7a\x61\x3d\xbc\x23\xae\xb8\x6e\x27\xdb\xc9\xf9\x92\x49\xc8\x68\xd8\x1d\x02\x1a\x85\x4b\x0b\x90\xc0\x0a\x1a\x23\x52\x80\x48\x2f\x25\x0d\xe2\x73\x54\x74\x81\x52\x26\x38\x2d\xe5\x6c\xb4\xf4\xf5\x83\xf0\x45\x12\xb9\x29\xae\x03\x7f\xa5\x04\x12\x84\xb7\x62\x42\x4c\x47\x6b\x19\x53\xde\xcc\x85\xc9\x7c\x2e\x88\xc2\x98\xc6\xd4\xda\xf2\x2e\x13\x53\xb6\x5b\xec\xf7\xe5\x28\x8c\x71\x44\x8b\xb0\x70\x2c\x4e\xfc\x83\xfa\x81\x9b\x34\x84\x1f\x48\x80\x50\xfe\x33\x99\x9f\x82\x0a\x2f\xe8\xfb\xe3\x18\xfe\x02\xad\xdc\x40\xc5\x14\x5b\x52\xdd\x9e\xea\x16\x4d\xb1\x0a\x44\xa5\xf0\xb0\xe2\xb4\xf0\x79\xc8\x69\x31\x1a\xb9\xe3\xc8\x83\x40\xd9\xd1\x06\x8e\x85\x38\xf1\x5b\x62\x57\xa2\xc6\x71\x16\x62\xe1\xc8\xac\x16\x38\xf0\xf1\x6f\xcf\xff\xef\x09\x4d\xa6\x4d\x1b\xa4\xd1\x30\x8d\x43\x84\x26\x73\x67\x57\xcc\x70\x1b\xc7\x13\x27\x30\xe7\x8a\x2f\x44\x81\xe8\xbd\x31\x76\x8f\xc6\xb8\xc9\xef\x75\x73\x04\xc7\xda\xd0\x27\x73\x74\xd2\xdf\x67\xa6\xa0\x4b\xbb\xe1\xe8\x7d\x89\xa0\xc7\xf9\x23\x37\x85\xb0\x48\x44\x67\x67\x6c\x74\x1a\xda\xe8\x6c\x4b\xb0\xa6\x14\x92\x1e\xf9\xfa\xca\x96\x5c\xd5\x86\x2f\xb8\x31\xbc\xf4\x57\x17\xc4\xe7\x8f\x38\x41\xbf\xf6\x64\xfd\x96\x76\x16\x7f\xde\x90\xe5\xf3\x16\xdf\x5b\xd2\xd6\xf3\xe8\x45\xc0\xe9\x6e\x91\x25\x5c\x4e\xa3\x86\x2f\xc4\xb2\x31\x3d\xaf\x24\x12\x3d\x26\x83\xbc\x4b\x34\x3a\x41\xf4\x9b\xe1\xb6\x91\xa4\x07\x14\x2e\x56\xbc\x58\x31\x25\x0a\xe6\x15\xc1\x19\xa6\x2c\xde\xc7\xa2\xf8\xd0\x2f\x32\x7c\x5d\x00\x03\xcf\x16\x1a\x2c\xdd\x5c\x1a\x8d\xb0\xb5\xbc\x42\x57\xb5\x40\xb5\xd1\xde\x53\xf0\xcb\x0b\x2e\xe1\xb6\x83\xd5\x21\x53\xa1\xd5\xbd\xc7\x63\x72\x48\x42\x6d\x89\x97\x82\x81\x5b\xd7\xdd\x72\xdf\x69\xf3\x71\x47\xe9\x1f\xb4\xf9\x48\xb4\x12\xc6\xa0\x54\x75\xa2\x2e\x54\x5c\x40\x10\x74\xcf\xb0\xb0\x1c\xca\xe5\x76\xd9\x57\xaf\xdf\x3d\xcc\xa1\xe8\x1b\x85\xcd\xa7\x0a\xe6\x6b\x60\x41\xef\xb7\xfc\x9a\x08\x5c\x7d\xdf\x05\x41\xc3\x39\xb4\x14\x65\x74\x98\x90\x52\x1a\xe0\x98\x29\xe0\x8f\x3e\x83\x22\x7a\xb5\xb3\xe0\x51\x0e\xeb\x9a\xab\x52\x3c\xfa\xcc\xec\x49\x5c\xfd\x25\x37\xe2\xde\xe7\xb9\x91\x11\xf6\x68\x7b\xc7\x71\xfc\xfd\x6b\x0f\xeb\xa6\x71\xfc\xda\x23\xc9\xf3\x98\x84\x47\x75\xeb\xd7\xc9\x3c\x0e\xe1\x44\xb4\x45\x28\xf3\x3e\x8d\x11\x95\x9d\x53\x7e\x1d\xd5\x39\x66\xb4\x2d\xca\xab\xd2\x2e\x68\x03\x70\xc9\xe6\xda\xc4\x6f\x5d\xd1\xb0\xaf\x33\x34\x14\xda\xab\xe0\xff\x33\x0b\x0c\x3d\x52\x49\xc2\x0f\xda\x88\xa5\x50\x4c\xee\xd9\xe5\x5d\x94\xf5\x18\xb4\xd8\x50\xef\x14\xb6\xd9\x16\xb8\x86\x92\x1b\xf6\x8b\x06\x0f\x76\xc0\xf0\x8a\x89\xa0\x83\xbc\x66\x86\x24\x03\xf9\x41\x0b\xa8\xb8\xe1\x72\x0d\x52\xa8\x8f\xc4\xb0\xb9\x50\x24\x17\x8a\x55\xfc\x24\x6e\xb3\x50\x8e\x9b\x05\x2b\x08\xf6\xd3\xd6\xda\xb5\xac\xdc\x21\x08\xb9\xc2\xf5\x22\xee\xf3\x45\xaf\x7c\xb0\x77\x8f\xb7\xa5\xbd\x4b\x79\xc7\xb9\x5a\xb6\x05\xb5\x8a\x36\xb1\xa5\x01\x87\xda\xd8\x07\x92\xd7\x32\x78\x12\x7e\x1c\xed\x39\x42\xcf\x68\xf3\x49\xb2\xd3\x9e\xf8\x3b\xc4\x71\xed\xf3\x63\xc4\xc2\x66\x1e\x0a\xf1\x4e\x43\xf4\x1b\x48\x96\x88\x66\x1f\xd6\xa9\x8e\x34\xc2\xe6\x1d\xc7\xc0\xef\x2b\x19\xae\xcf\xa2\x7f\xdf\xcd\x40\xac\xa5\xc9\x51\xb6\xe7\x7c\xc5\xe4\x02\xf4\xe2\x53\xae\xc7\xf3\x2c\x36\x1c\xb5\xeb\x39\xa2\x91\xbc\xcd\x6e\xc1\x56\x2f\x80\x4b\x5e\x38\xa3\x95\x28\x52\xe4\xfd\x9c\x49\x92\x9b\x58\x4b\x46\xe7\xa1\x51\x81\xe7\x80\x12\xdf\xb1\x9a\x77\x0c\x42\xfe\x50\x9b\x44\x50\x0b\xe2\xba\x4d\x3f\x6b\x5a\x02\x32\xf5\xc7\xd7\xaa\x47\x0f\x54\x4c\x48\x5f\x31\xb2\xce\xa6\x1b\x29\xd8\xe8\xc8\xd8\xb5\x75\xbc\xb2\x1d\x30\x0b\x6b\x1b\x8e\x46\xa1\x20\x6b\x17\xae\xfb\x0d\xa7\x9e\x09\xf2\x36\x5a\x2f\xa9\xcf\xea\xb4\x05\x8a\x8d\x7d\xef\xf1\x18\xf9\x55\x0a\x5b\x34\x96\x6c\x35\xcd\x57\x11\x16\x06\xd7\xef\x1d\xe1\x59\x34\x35\xfc\x31\x2e\x7e\x73\x95\x51\xfa\x0a\xad\x6c\x2d\x8a\x46\x37\x56\xae\xa1\x62\xe6\x23\x02\x9b\xe9\x7c\x1b\xef\x2c\x71\x2b\x96\x2a\xa6\x7e\x71\x5f\x88\x9d\x7b\xe5\x0e\xc1\xe8\x68\xa4\x1d\x30\xe8\xeb\xe4\xe0\x68\x5b\x51\xb7\x7c\xe1\x76\xc1\x51\xd3\x9e\x70\x58\xfa\x6c\xf3\xd1\xf8\xe6\x84\xb0\x62\x16\xe6\x9c\x2b\x30\xbc\xe0\x84\xd0\xf3\xf5\xc6\x2c\x51\xd9\x2c\xff\x7b\xc3\x95\x93\x38\x65\xa1\x4d\xad\xbd\xd9\xed\x25\xd6\x91\xa7\x08\x34\x2f\x07\xf0\x16\x1d\x22\x9c\xb2\xcb\xc7\x44\x9f\x08\xa6\x9b\xa1\xfe\xde\x70\xa3\x55\xa7\x3e\xda\x72\x56\xac\xa0\xc7\x98\x8d\x94\x0d\x59\xf7\xf7\xba\x01\x86\x9e\x59\xcd\x5d\xc3\xa4\x17\xb6\x07\x6d\x64\xf9\x20\xd0\x5b\x50\x5a\x9d\xd2\x5e\x5b\x71\x4f\x5f\x4f\x63\x76\xc7\xe8\x35\x93\x6e\x7d\xba\x30\x9c\xa7\x20\x8c\xe1\xf7\xba\x40\x80\xde\xb2\xca\xb1\x26\xea\x74\xd7\x23\x93\xa2\x13\x57\xa3\xcc\xee\xe0\x58\x04\x69\x5f\x36\x90\xeb\x58\x91\x48\xbb\x5f\x6a\x6e\xbc\xd9\xdc\x4a\xba\xf4\x12\x32\xad\xb8\xb7\x18\x4b\x8e\xed\xce\x6c\x7b\xcc\x32\xa1\x07\x6e\xca\x37\xbd\x4d\xb9\x65\x08\xa6\xff\xd6\x3b\x72\xdc\x96\x9b\xc1\xba\xae\xda\x22\x2c\x58\x1f\xb0\x9c\x40\xed\x57\xd9\xdb\xb1\x8a\x7d\xe4\xa9\xaf\x95\xa0\x7f\xe6\x89\xa1\xa8\x56\x53\xd9\x03\x81\x9d\x4b\x99\x86\xff\x8b\xaa\xd6\xc6\xa5\x5d\xef\x01\x6a\x7a\x70\x6c\x83\x37\x47\x30\xe2\xd7\x84\x4b\xf7\xfb\xb2\x5d\x37\xd7\x4a\xae\x3d\x6f\x11\x99\x02\x59\xd4\x0b\x65\xc3\xbd\xed\xb2\xe6\x6b\x3f\x44\x9f\xa7\x2d\x22\x2a\x5e\x70\x6b\x99\x11\xa4\x83\x0b\x23\xd4\x32\xc6\x1c\x5c\x78\x4b\xd6\x57\xed\x63\x7b\x02\x4c\x6a\xc5\x83\x7d\x2b\x74\x35\x17\xaa\xf5\xbf\x7d\xe9\x67\xeb\x01\xbf\x94\xd8\x66\x45\xe2\x46\x59\x3c\x74\xce\x36\x09\x0b\x13\x3c\xe0\x06\x44\xcb\x35\x80\x7c\x81\x3b\x1e\x62\x15\xeb\x84\x43\xe9\x6d\x37\xc2\xf7\x52\x68\x05\x6c\xc9\xf0\x32\x01\x58\x08\xa2\x8f\x3b\x03\x14\x3c\x61\xa3\xad\x3d\x25\x36\xe1\x02\x0a\xdd\xa0\xef\xe3\xbf\x0b\x05\x0c\x24\x7b\xb0\x8d\x70\xb8\x48\xc9\x97\x1e\xd8\x43\x23\xde\xbb\xe8\x0d\x23\x84\x6d\xe2\xdd\xe7\xc0\x8b\x70\xde\x13\x6d\x43\xe8\x1b\x47\xe9\x75\x9d\xac\xe3\x82\xe2\x1e\x54\xe4\x5d\xba\x15\xf7\x6e\xd4\xa6\xdc\x79\x87\x27\x06\x88\x41\x23\x62\x38\xd0\xe9\x52\x30\x60\xd1\x27\xf2\x88\x8f\x8a\x88\x3b\xe6\x65\x83\xb5\x19\xc9\x92\xb9\x56\xd4\x5a\x9e\x0a\x4b\xf1\x5b\x89\xca\xfe\x9b\xed\x2e\xbf\x01\x4d\x5b\xb1\x75\xaf\xb3\x6f\x0b\x63\x36\x72\xbb\x1d\xda\x7c\xc6\x3b\xa3\x6d\x40\x67\x8f\x97\xa2\xa9\x76\x9b\x27\xc9\x8d\xd9\x08\x62\xbd\x21\xfe\x04\x4a\xa5\x5b\x1d\x95\x51\x90\x2a\xce\x3f\xdd\x5e\xf9\x2a\x09\x51\xcf\x89\x5f\x61\x63\x1d\x2c\x91\x52\x24\xcc\xc7\x04\x86\x17\xa2\x16\x5c\x39\xbb\xe1\xaa\x86\xa8\x0d\xff\xdb\x59\xe0\x56\x8b\x49\xd8\xa3\x6f\xc9\x1c\xfa\xf9\xe6\xbd\xf9\x7c\xca\xa4\x73\x7b\x31\xca\xa1\xfc\x3e\xa5\x53\x0c\x0a\x8c\xd1\x95\x50\x28\x15\x3e\xaa\xb3\xed\xd4\x08\x5e\xad\xe8\xe2\x88\x18\x44\x2f\x79\x68\x9e\xc4\x51\xfa\xb3\x16\xbd\x59\x7d\x9b\x68\xda\x75\xae\xb4\xc1\x34\xf9\xf0\x6a\xbd\xb3\xac\x76\xd2\x76\xb2\x7e\xce\x3f\x94\xd8\xbc\x9d\x4b\x83\x14\xa7\x08\x77\x25\x47\x8f\x27\x6d\x9d\x01\x12\x46\xd7\xa9\x54\x58\x53\x5b\x35\xde\xa6\x65\x13\x28\x37\xfd\x2d\x8f\x89\x71\x04\x22\xac\xd4\xe4\x7e\xd6\xdc\xf8\x3e\xd8\x50\x77\x61\xc6\x45\x23\x14\x3d\xed\xed\x05\xf6\x59\x55\x9e\x20\x18\xb5\xbb\x1d\xc2\x31\xdc\xda\xa3\xd1\x78\x96\x5f\x64\x47\xe0\xf8\xa3\x23\x1e\xa3\x6a\x85\xf1\x63\x3b\x28\xf8\xec\x57\xa7\x41\x3d\x05\xdf\xa3\x0f\x3b\xfc\xa4\x3d\x6a\x07\x8a\xc1\x20\xa3\xf2\x3b\xc5\x7d\x9d\x80\xf1\xbd\xcc\x44\xc0\xa1\x0e\x80\x76\x90\x00\x56\xa4\xf7\x7e\x09\x44\x7c\xfa\x1c\x6e\xb6\x83\xec\xe7\xea\x5e\x6e\x92\x68\x31\x07\x92\x33\x8b\xa1\x4e\x97\xf1\x0e\x0f\x74\xfa\x58\x4b\x0c\x49\x5f\x45\x12\x59\xa4\xaf\xe3\x70\xc7\x99\x9e\x0c\xd9\xcf\xce\xff\x6d\x1f\x9e\x37\x44\xaa\xd3\xdc\xcd\xa4\x0f\x88\x45\x87\x21\x68\xfa\x96\x9d\x2d\xdb\x1d\x5d\x9b\x74\x9b\xb7\x2c\xfa\x67\xbd\xbc\x52\xf0\xdf\xf7\x70\x67\xb1\xa1\x11\xe4\x00\xdc\x73\xe3\x37\xc8\xad\x84\x29\x4f\x71\x79\xeb\x76\x3f\x94\x36\x15\x86\xaf\xe8\x18\x70\x66\x06\x30\x5b\xf9\xf8\x08\xb1\x69\x9b\xb9\xbd\x1d\x26\xe3\xef\x03\xdb\x36\xa1\xc6\x64\x2f\x9c\x44\xff\xa2\x4f\x4a\xd0\x20\x5f\xe9\xdb\xc8\x74\xb7\x66\x80\x95\x25\x7e\xa6\x76\x91\xbe\xfc\xb5\x63\x44\xa2\x03\x67\x9e\x23\xf3\xa9\xe7\xb9\x15\x65\x4f\x54\x28\xd2\x61\x0a\x27\xe4\xaa\x6c\xaa\xe8\x64\x6e\x48\x48\x04\x0e\x1f\x95\xc5\x2d\xdc\xc4\x2b\x62\x6b\x4c\x23\x30\xb9\x5f\x69\x28\x47\x04\x73\xdf\x6f\xe9\x4c\xb3\x29\x6d\x9e\x21\xfb\xb3\xff\x7b\x19\xd3\xf9\xfd\xe4\x64\x52\xea\xdb\x9b\xf0\xad\x54\x53\xcb\x7e\x1c\x22\xd0\xdf\x27\x96\xda\x7d\xd0\xc7\xdc\xf0\x48\xf7\xf8\xd9\x31\x8d\xb6\xa7\xd8\xe2\x07\xe9\xd5\x59\xf4\x62\x0f\x25\x69\x54\x8f\x05\x85\x6f\xeb\x4f\x84\x0a\xfd\x5c\x58\xab\x32\x34\x1a\x4e\xdc\x66\xce\xba\xc9\x77\xaa\x3c\x1b\xb6\xb4\xf5\x8e\x0b\x5d\x79\xa7\x17\xe5\xa6\x97\x12\x69\xe3\x88\x2d\x6f\xbd\xb7\x09\xbf\xa5\x40\x24\xd6\x6e\x29\x76\xec\x75\xc7\x0e\xe0\x4e\x49\x6e\x2d\x6d\x14\x7f\xac\xa5\x28\x04\x06\xa3\x34\x5e\xaf\xc8\x10\xf2\x0b\xeb\x6d\xaf\xaf\x97\x3e\xea\xa5\x8e\x3e\x99\x2e\x8a\xde\x38\xce\xb6\x9d\x42\x69\xeb\xc9\x5d\x56\xf7\xf9\x21\x53\x2c\xd5\x23\x89\x3d\x01\xf1\x03\x78\x47\xb3\x8c\x75\x3a\x7c\x7a\xa4\x1d\x3e\xd2\xd6\x3e\xda\xf3\x18\x18\x2c\xa1\x6a\x2e\x29\xe8\x42\xc3\x40\x64\xd9\xa6\xe6\xc6\xf2\x92\xfb\x22\x0a\x0a\x7c\xbb\x0d\x61\x12\xef\x1d\xf8\x14\xa4\xe3\x5d\xb8\xb2\x34\xdc\x8b\xf8\x3a\xe8\x02\x45\x4a\xfc\x91\x17\x2d\x6c\x13\x9c\xb6\x8c\x30\x7c\xc9\x8c\xaf\xc8\x6c\xc7\x06\x94\x57\xff\xdd\x00\x66\xd1\x7d\xb0\x08\x77\x3d\x7f\xb7\xd4\x84\x88\xce\xbb\xc6\xfd\xaa\xbd\x6f\x57\xf0\x04\xe3\xd3\xbe\x18\xc0\x2a\x6e\x7b\xde\x88\xc5\x20\xcd\xdc\x8b\x82\x43\xf8\xea\x0f\x67\xa0\xbc\x76\x67\x3b\xfa\xdb\x96\xc6\x4c\x4f\x08\x1b\x0d\xff\x7b\x23\x42\xdd\x05\xcd\xb2\xd5\xca\x37\x4a\xe3\x26\x36\xd6\xe9\x8a\x99\x75\x3c\x30\x54\x72\x5b\x18\x31\x0f\x1b\x10\x82\x02\xb1\x14\xbb\xd9\xcf\xa8\x35\x71\xaf\x02\xbe\xef\x81\x75\xe4\xd0\xef\x07\x70\xd9\x9d\x8b\xd1\x0b\x78\xc7\x0c\xf2\x63\xdd\x8a\x7b\x4b\xe6\x7c\xed\x03\x4a\x8a\x81\x31\xf8\x89\x8a\x4e\xfb\x46\xa1\x45\x97\x75\x4a\xbb\x4d\x0a\xda\x6d\x3b\x32\x8f\x91\x4e\x0c\xdd\x37\x43\xc6\xfe\xbd\xc2\xd9\xcd\xed\x3c\x01\x6a\xc2\x8f\x8d\x0e\xf0\x7a\x38\xcd\xa7\x9e\xa5\x5b\x2d\x0f\x79\x16\xfa\x07\xda\x42\xf5\x46\x0b\x44\x38\xa7\xc3\x1f\x6b\x83\xcb\x0b\x6b\x10\x84\x1a\x65\x2f\x0d\x99\xee\x69\x6a\x49\x7d\x9a\xda\xb3\x28\x74\x6e\x6c\x41\xa7\x5e\xc0\x2c\x9f\x5d\x67\x29\x8c\xc6\xa3\xd3\x7e\xcf\x43\xba\xfb\x12\x0f\x6d\x36\x9b\x79\x69\x84\xdd\x0e\x0a\x6f\x35\x7d\x65\x4d\x72\x89\x31\x94\xad\xb5\xb2\x82\xf2\xf7\x54\xdb\xf0\x91\x5a\x5f\x3c\x58\x5d\x1b\x5d\x1b\x81\x6e\x34\x2d\x74\x01\x0d\xe5\x22\x49\xda\x3a\x24\xed\xe5\x23\x63\xcb\x50\x53\x51\x34\xe1\x41\x58\x58\x42\xeb\xb6\x8f\x88\x34\x90\x80\x3a\xd4\x22\x29\xd7\xd9\x2f\x46\xee\x06\x97\x28\x69\x7f\x18\xc0\x75\xd7\x1d\xa4\x17\x70\x2d\xd8\x5c\x48\x2a\x29\xe7\x68\x41\x81\xdf\xa3\x9c\xd2\x29\x39\xe5\x4f\x4a\x81\xa4\x74\xa2\x5b\x71\x6d\xd6\x6d\x9a\x23\x56\x80\x9c\x36\xae\x1f\xb6\x2b\xbe\x94\x62\xc9\x55\xc1\x4f\xd2\xb6\x0a\x9c\x6e\xa4\x49\x43\xc6\xe5\x49\xc9\x3e\xf6\xc6\xde\x42\xc9\xa5\x98\x93\x23\x46\x84\x2d\x8d\xb6\x36\xe4\xff\xe3\x74\x0e\x58\xe1\x2c\xd5\x8c\xf7\x6b\x82\xc7\xc5\x0d\x93\xa0\x0d\xcc\xfd\x36\x49\x41\x93\x86\xb8\x9c\x36\x93\x55\x6c\xb9\x99\x11\xc7\x67\x63\x89\xbc\x2b\x96\xd3\x99\xae\x98\xd2\x12\xaa\x10\x25\x3a\xa2\x3e\x29\x8f\xee\x87\xcf\x97\x0a\x26\xe3\x90\x11\x79\x8b\x15\x43\xd6\x70\x03\xcc\xf8\x5a\x32\x5a\xe3\x60\x73\x6d\x23\xdd\x76\xe0\x49\x3c\x6c\x5a\x0c\x69\xfc\x2f\x42\x85\x0d\xec\x21\x66\x17\xb7\x1f\x7f\xb6\x56\x1c\x29\xc2\x05\x4b\xed\xc5\x73\xa9\x75\xf9\x20\x64\x97\xa3\xfb\x08\xd6\xe9\xba\x66\x4b\xea\x1d\xab\xea\x06\x49\x5e\x30\x21\x1b\xe3\xad\x0b\x93\x8b\x46\x75\xce\x09\x99\xb4\x9d\x5e\x08\x6a\x3e\x36\xc5\x06\x1f\xfc\xa4\xdc\x9e\xa4\x24\x75\xe8\x4a\x6f\xa7\xbd\x68\x84\x36\x39\xcd\xca\x7b\x41\xc5\xc4\x45\x68\x61\xb0\x56\x84\xc5\xc7\x32\x7f\x18\x1c\x65\xfd\x8f\x03\x18\x16\x88\xf3\xb8\xfa\x88\xa8\x38\xeb\xb0\x33\xb8\x3d\xf1\x7f\xb7\x42\x27\x7b\x53\x29\x37\x4b\x6b\x9f\x2d\x51\x45\xcf\xb1\x58\x69\xed\xf3\x8c\x94\x4d\xec\x95\xa0\x29\xa3\x09\x0c\x16\x9c\xf0\x22\x05\x46\xd4\x31\x55\x70\x4f\x7e\xed\x13\x8d\x01\xd9\xd6\x24\x65\xbc\x52\xc2\x05\xad\x6b\xeb\x9b\x32\x52\x0d\x7a\x2e\x43\xe6\xc7\xc6\x16\xbd\xd0\x42\x1f\x8e\x1a\xa1\x66\x84\xe8\xc7\x1f\x16\xed\x82\x80\x2b\xfd\x80\x91\x8a\x0f\xf0\x5a\x46\x11\x17\x7b\xc3\x76\x2b\xa3\x6e\x0e\x25\xdb\x8a\x42\xeb\x1f\x87\xd2\x02\x25\x48\xc3\xcf\x08\x91\x1d\x40\x12\xad\xe4\xa9\x74\x95\x88\x88\xd3\x5d\x86\xa6\xb7\xed\x21\xdb\x8a\x11\x8d\x58\x78\xdc\x45\xa5\xf6\x3a\x4d\x3c\x59\x04\x9e\x94\x7c\xc1\x55\xe9\xef\x5f\x69\x59\xee\x49\x46\x33\x53\x11\xd2\x44\x57\xb8\xe5\x5e\x54\xd9\xc6\x98\xae\xc2\x14\x32\xb2\xcc\x5a\x6e\x50\x4d\x42\x92\x32\xdd\xcd\xc8\xce\xd7\xc1\x61\x88\x4b\x59\xe3\xca\x3b\x4e\xb6\x6e\xf7\x43\x4f\xf6\x7a\xce\x5e\x4b\x07\x0a\x6b\x36\xf2\x27\xe5\xf6\xb4\x78\x25\x09\x0c\x6f\x6f\xb3\xd1\x65\xfe\xb7\x57\xb8\x69\x14\xb5\xd7\xb5\x5c\x87\x52\x7e\xbf\x1d\x0d\xaf\x11\x19\x0f\xa1\x0a\x03\x00\xb3\x67\xde\x9e\x86\x76\x82\xcd\xa8\xde\xbb\xc0\x5a\x48\x6e\x6a\x89\x08\x1c\x4f\x1f\xb7\x31\xf5\x42\x70\x59\x5a\xe0\xaa\x90\x3a\x1c\x4e\x98\x1b\x56\x7c\xe4\xce\xc2\xd1\x8f\x3f\x1d\xc5\x30\x42\xb2\x22\x5a\xae\x75\x14\x1d\x42\xcb\x10\x8d\xf5\xe2\xda\x01\x1c\x5f\x6a\xf5\xff\xdb\xfa\x79\xab\x87\x71\xe0\xff\x73\x02\x14\x37\x53\xe0\x68\x57\xba\x91\x25\xba\xe2\x2d\x0d\xf1\xe4\x74\x67\x7e\xdb\xea\x25\x6a\x84\x5d\x2b\xc7\x1e\xdb\x72\x21\x85\xd7\x7e\xf2\x01\xbc\xe3\xc0\xa4\xd5\xbd\x03\x13\x3e\xf5\xee\xc3\x29\xbc\xd3\x4b\x89\xb5\xfe\x88\x31\x85\x44\xe4\x18\xd6\xd1\xa8\xc6\xf2\x63\xbf\xd9\xd4\x37\xe3\xfa\x32\x1a\x3e\x76\x54\x1b\x41\xc9\x60\x44\xd6\xa3\x70\x0a\x63\xb7\xf1\x03\x49\xe4\xcc\x8a\x50\xa3\x0e\xfc\x8a\x95\xc9\x36\x35\xd2\xa5\x19\x98\x29\x56\xe2\xde\x23\xe0\x4e\x1b\xf4\x6f\x4f\x5f\x9e\xbf\xf8\xc3\xc6\x1f\x6a\x4f\x61\xc4\xdd\x42\x8a\xc7\xf8\xf5\x46\x14\x46\x5b\xbd\x70\x70\xa1\x4d\x3d\x88\xe1\x4c\xef\x6f\x8c\x46\xe9\x29\x7b\xa1\xcf\xa6\x5c\xa5\xfd\xee\xc7\xd0\xe0\x1c\x1b\x0d\x4f\xbe\x4d\xda\xd0\x02\x11\xc1\xdb\xac\x90\xb7\x8e\x9e\xb9\x50\x21\x86\x24\x74\x6c\x45\xad\xf5\x64\x5a\x50\xf2\x1d\xd8\x1b\xa9\xda\x4e\xba\x99\xf3\x1a\xf0\x54\x6f\xe5\x75\x7e\x91\x8d\xa6\x19\x75\x7f\x26\xcf\x72\xb9\x3f\xe5\x64\x84\xe6\xab\xa4\x9f\xe9\xda\x6d\xfb\xa1\xf3\x4a\xbd\x1b\xf6\x3b\xd5\xff\x4b\x8f\x3a\x7a\xd3\x83\x04\xa6\xe1\x60\xe8\x66\x95\x81\x77\xe7\xd1\x25\x53\xcb\x86\x2d\x39\x2c\xf5\x3d\x37\x6a\xbb\xb1\x8d\xd2\x1a\x9d\x03\x6e\x77\x57\x34\x48\x20\x49\x12\xab\x8d\x3b\xad\x99\x5b\xd9\x67\xb4\xe4\xff\x0e\xde\x72\xb3\x44\x47\xfa\x4a\x1b\x25\x8a\xd5\xa1\x15\xff\xd0\x8a\x7f\x68\xc5\xff\xaa\x5b\xf1\x6d\x2d\x85\x3b\xf5\x35\xad\x2f\x81\x10\xf8\x6e\xe5\x3f\x2c\x7b\xef\x9f\x3d\xe0\xca\x01\x57\x0e\xb8\xf2\x55\xe3\x8a\xb3\x52\xcc\x93\xf3\xd7\xd3\xcb\x2d\x10\xd9\x74\x76\x43\x2b\xf1\xe6\xa1\xc0\xfd\x4a\x15\x94\x65\xa3\x3b\xab\x0f\x0a\x21\xd8\x4c\x62\x28\xb0\xd5\x15\x41\x49\x80\x1d\x2c\x7a\x86\xe0\xd1\x26\x77\xef\x0c\x80\xf8\x26\x9d\x29\xe0\xd6\xf6\x24\x08\x99\x96\x4c\xb2\xb7\xc3\x49\x90\xaf\x8d\xd7\x0a\xb5\xa2\x88\x4f\x3d\xeb\xe5\x3e\x49\xef\xe5\x3e\x9f\x7f\x8f\xc1\x1e\xf9\x69\x5f\xbe\x13\xde\xcc\x93\x74\xef\xe8\xd9\x7e\x07\x4f\x5f\xc8\xe8\xad\x3e\xe1\xeb\xbb\xab\xe1\x6c\x3a\xce\x7e\xc8\x26\x30\xc9\xa6\x77\xd7\xb3\x28\x37\xc9\xce\xfb\x75\x7a\xaf\xd7\x79\x8e\x5c\x6e\xbc\xfd\x26\xf1\xc2\x84\xb2\x9a\x8f\xef\xa6\xe1\x81\x4e\x52\x9f\x94\x51\x2f\x93\xc9\x6d\x36\x79\x33\x9e\xdc\x0c\x69\xd4\xad\x77\xe4\x0c\x92\xe4\x91\xfe\x80\x43\xfd\xd4\x5f\x87\xf1\x76\xee\xfc\xf7\xf1\xf4\x2a\x4c\x1d\x65\xca\xae\xf9\xbd\x70\x2b\xa6\xda\x57\xcf\x84\xf1\xe8\x6d\x2e\x07\x83\xf7\x55\x1b\xbc\xc3\x29\xf9\xaf\xcf\xe0\xed\x9c\x92\xff\x59\x2b\x3e\x08\x7f\xf1\xf2\x49\x7c\x79\x71\xee\xff\x8e\x5d\xff\x5d\x8a\xf1\x2d\x51\x4c\x2d\x1b\xc9\xcc\x40\xe8\x98\x2e\x39\xa0\xcb\x01\x5d\x0e\xe8\xf2\x15\xa3\xcb\xff\x04\x00\x00\xff\xff\xbf\x0a\x6d\xa3\x2d\x94\x00\x00") - -func bindataTkgWebDistTkgkickstartui3rdpartylicensesTxtBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui3rdpartylicensesTxt, - "tkg/web/dist/tkg-kickstart-ui/3rdpartylicenses.txt", - ) -} - -func bindataTkgWebDistTkgkickstartui3rdpartylicensesTxt() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui3rdpartylicensesTxtBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/3rdpartylicenses.txt", - size: 37933, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui582es201525ed5926266ddd371723Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xeb\x76\xdb\x38\xb2\x30\xfa\xff\x7b\x0a\x86\xbb\xb7\x87\xdc\x0d\x31\xa2\xae\x96\x7c\xd4\xd9\x8a\xac\x24\xea\xd8\x96\x5b\x92\x93\xe9\xce\xf8\x53\x43\x24\x24\xa1\x4d\x11\x0c\x09\xf9\x12\x87\xff\xce\x03\xcc\x1b\xcc\x5a\xe7\xd1\xe6\x49\xce\xc2\x85\x57\x51\xb2\x65\xa7\x67\xcf\x39\x5f\x56\xd6\x8a\x45\x10\x55\x28\xa0\x0a\x85\xaa\x42\x81\x50\xd7\x01\x52\x02\xea\x63\x8b\xaa\x47\x5a\x80\x9c\xb9\x71\x83\x66\x1e\xb4\xae\x7a\xcb\xb5\x7b\x45\xaf\x16\xd3\x2b\x6c\x5d\x05\x14\xfa\x74\xba\xc6\x9d\x07\x6b\x7c\xfd\xfa\xe9\x52\x37\xbc\x75\xb0\xd4\x3e\x7d\xaa\x1f\x56\x2e\xc1\xbd\x59\x2b\xd7\x5a\xed\xf9\xda\xb5\x28\x26\xae\x86\x00\x05\x58\xbf\xc7\x86\xad\x51\x70\xff\x47\xf2\x42\xbf\xf7\x11\x5d\xfb\xae\x32\x09\x01\x29\x28\x5e\x87\xa1\x7e\x74\x0d\x7d\xc5\xed\x60\xcd\x2c\x37\xaa\x2d\x1d\xf8\x1d\xac\x55\x0f\xeb\x87\x55\x1d\x04\xec\x67\xf9\xb0\x5a\xd1\x8f\x22\x58\x85\xb0\xd6\xf4\x7b\xf3\x00\x1d\x1c\xb8\xc6\xf4\xe2\x37\xad\x0c\x54\xcb\xf1\x4b\xd8\x22\xae\x0a\xcc\x8a\x1e\xc6\x75\xe1\x03\x75\xab\xa9\xba\xd6\x03\x75\x6b\xa9\xba\xce\x03\x75\xeb\x7a\x68\x11\x37\xa0\x8a\xd7\xc9\x8e\x11\x70\xa3\xae\xdf\xab\xd0\x41\x3e\x2d\x61\x77\x4e\xd4\x36\x02\xf2\x31\x58\x5b\x16\x0a\x02\xb5\x4d\xa3\x92\x1b\xe8\xbb\xd8\x5d\xa8\x6d\x1c\x95\xd8\xd0\x5d\x20\x5f\x6d\xbb\x61\x98\x0c\x8b\x2d\x48\xc2\x73\xcd\x3c\x40\xfa\xbd\x68\x1e\x75\x5c\xa3\xef\xbd\xd1\xf4\x23\xd7\x98\x2c\x38\x95\x36\xbe\x56\x81\xa9\x03\x51\x60\xca\x82\x4a\x54\x50\x91\x05\xd5\xa8\xa0\x2a\x0b\x6a\xac\xe0\xd7\x33\x4b\xab\x01\x02\x4c\x90\xe9\x6f\x3d\x7a\x57\x07\x30\xff\xae\x11\xbd\x6b\x00\x2b\xff\xae\x19\xbd\x6b\x02\x27\xff\xee\x90\xbd\xfb\xfc\x5b\x57\x8b\x08\x39\x04\x6a\xe0\x41\x57\x05\x2d\x56\x32\x5d\x5f\x68\xad\x74\x95\xfc\x5f\xde\xbb\x32\x50\x67\x6b\x4a\x39\x4f\xca\xac\xf4\xcc\xfe\x59\x53\x2d\x07\x5b\x57\x2a\xd8\x94\x46\xd7\xe8\xbd\x3b\xd5\x10\xab\x48\x6e\x6f\x34\xdd\x70\x09\xc5\x73\x6c\x41\x56\xad\xe3\xae\x1d\x27\xe4\x6d\x5f\xfc\xa6\x99\x66\x86\xe1\xe6\x06\x09\x21\x9e\x6b\x95\x2c\x27\x38\xce\x23\xd7\xf8\xa5\xf1\xb3\xa6\xba\x8b\x9e\x03\x83\x40\x05\xae\xe1\xd4\x5f\x6b\x0d\xe0\x01\x64\xe0\x60\xe0\xce\x89\xa6\xf3\x9f\x63\x21\x0a\xf2\xe9\xa3\x10\x03\xf9\xd4\xf7\x7d\xe2\x6b\xba\xce\x9a\xbb\xf5\x1a\x1a\xe7\x8e\xc4\x3b\x98\xab\x29\x54\x51\x0d\xb3\xa0\x46\xdc\xc2\xae\x4a\x71\xc3\xbb\x2a\x45\xf4\xc8\x2a\x5c\x9c\x96\xf8\x0f\x4d\x55\x54\xc0\xc6\xad\xd3\x41\x99\xc1\x7c\xc5\x0a\xdb\xd9\x32\x63\x85\x82\x00\x2e\x10\x50\x15\x55\x0f\x43\xa6\x15\x26\x1d\x4d\xd3\x3b\x3f\x49\xfe\x68\xa8\x33\xf9\xfa\x55\x9b\x74\xee\x43\x5d\x37\x06\x67\x6f\x86\x1d\x95\x4f\x1f\x80\x8c\xf1\x45\xaf\xd7\x1f\x8f\x3b\x6a\x34\x81\x00\x32\x3e\x76\x47\x67\x83\xb3\xb7\x1d\x35\x9a\x42\x00\x19\xfd\xd1\x68\x38\xea\xa8\x88\xd1\xab\x82\x09\xd7\x3d\x28\xd4\x35\xfd\xc8\x41\x54\x59\xcb\xf6\x2c\xc6\x1a\x05\xdd\x47\x83\x18\x09\x08\x5d\xe2\x20\x4b\x73\xfa\x61\x72\xe7\xa1\x4e\xa7\x33\xe1\xa4\x85\xa9\xe1\xdd\x13\x5c\xf6\x25\x4c\x8d\xfd\x9e\x18\x64\xcf\xc3\x98\x31\x7b\xc2\xf3\x51\x0a\x43\x09\x84\x8c\xbf\xad\xcb\x95\x66\x7d\x0e\xad\x44\x9d\xd1\x64\xd6\xa0\x1b\x8d\x7e\xfd\x8a\xf4\x10\x44\x35\xad\x95\xd7\x71\x8d\xbf\x7a\x2b\xed\x9e\xde\x79\xa8\x8d\x40\x80\x1c\x64\x51\xe2\x07\xed\x4f\x9f\x54\xe8\x79\x25\xa1\xca\xd2\xad\xab\x97\x97\x00\xbb\xde\x9a\x06\xed\xfb\x74\x79\x5b\xcd\xd4\x0a\x81\x8d\x2c\x27\x68\x9b\xe0\x1a\xfa\xec\x0f\x9f\x60\x1c\xaf\x25\x66\x94\x50\x93\x2a\x50\x7d\xe2\xa0\xe4\xb1\x0a\x92\x49\x57\x03\x42\x78\x2f\xc1\xa7\x5c\x2d\xb3\xa8\xfe\x25\xf8\x14\x95\x97\x30\x45\xab\xcd\x12\x15\xa8\x01\x85\x14\x5b\xd9\x37\x16\x71\x4b\x37\x3e\xf4\x3c\xe4\xf3\xb6\x32\x14\x4a\xe5\xa1\x06\x4b\xe8\x31\x0a\x98\x2c\x97\x2c\xec\x5b\x8c\x9e\x34\x85\x3b\xa1\xac\x25\xb2\xae\xf6\x07\x43\xb7\x96\x03\x57\x7c\x48\x4b\xd4\xc7\xd0\x5d\x3c\x19\xbc\xa0\xed\x78\x04\x28\xba\xa5\x1c\x1b\x93\x03\x35\x51\xc7\x2a\xf4\x31\x2c\x39\x70\x86\x1c\x15\xa8\x3d\x87\x04\x88\x8f\xbd\x25\x7e\x55\x81\xd4\xd2\x0c\x94\x57\x5d\x62\xdb\x46\x0c\x90\xfa\x6b\x94\xee\x3e\x07\x60\xd5\x0a\x87\x31\xc3\x8a\x4c\xb5\xec\xb8\x6d\xaf\x57\x3c\x50\x8f\xab\xbf\x05\xfb\x25\xa0\x68\xe5\x39\x90\xa2\x8c\x09\x15\x1b\x14\x6c\x49\x2c\x03\x1b\x98\x15\x60\x46\x2b\x74\x59\x07\x15\xf1\x36\xa5\x7a\x35\xa1\x5b\x69\x81\x6e\xa5\xbb\xa7\xb9\x7e\x70\xf0\x78\x60\xa9\x98\x75\x3d\x04\x36\xf6\x91\x45\xf1\x35\x0a\xda\x9f\x7c\x63\x58\x07\xbe\xb1\xba\x02\x81\x31\x68\x7d\x01\x81\xf1\xf9\xfa\xe4\x12\x20\xd7\x82\x5e\xb0\x76\xc4\xe4\xad\x84\x3a\xe0\x0a\x36\x04\xcd\x56\xdd\xac\x6c\x33\x1a\x61\xb7\xc0\x3c\x74\x43\xf0\x7a\x5e\x50\xee\x87\xe0\x1c\x17\x94\x07\x21\xc0\x57\x05\xe5\x24\x04\x81\x5f\x50\x0e\x99\xf9\x29\x16\x68\xb7\x73\xff\x61\x7c\xfe\xae\x3f\xea\xb7\xd5\xeb\xc0\x5b\x22\x1f\xa9\xa0\xfb\x71\xdc\x56\xe1\x4d\xa0\x82\xee\x6f\x17\xec\x0d\xfc\xb2\x66\xe5\xc7\xc3\xde\xfb\xfe\xa8\xad\xda\xc4\xba\x42\xbe\x1a\x02\xbf\x73\xdf\x3b\xb9\x18\x4f\xfa\xa3\xe9\xf8\x43\x6f\xda\x1b\x1c\x8f\xda\xaa\x59\x2e\x1b\x8d\x9a\x51\x36\xca\x2f\xcd\xaa\x0a\xa2\x0a\xe7\xc3\xe3\x54\x85\x56\x43\x54\x30\x93\x0a\x0c\xc3\xe0\xfc\x43\x43\xd6\x9a\xdb\xe5\x72\xdb\x2c\x97\xdb\xad\x46\xbb\xfd\xd2\x2c\x1f\x66\x51\x15\xd5\x6c\xd4\xda\xed\x97\xb5\x43\x35\xe4\xeb\x5b\x90\x5f\x45\x83\xaf\x5f\xb5\x40\xae\xa2\xe7\xd7\xb5\x8e\x8a\xbd\xeb\x1a\x5b\x1d\x07\xe7\xd7\x0d\xfe\xd4\x50\x41\x90\xac\x8d\x80\xe4\x31\x90\xaf\x5f\x35\x22\x30\x1c\xf7\x3f\x74\x54\x1b\x5d\x33\xf8\xf3\xd1\xf0\xb8\xa3\x7a\x3e\xb1\x55\x40\x52\xf0\x30\x0f\x0f\xbf\x7e\xd5\x20\x87\xff\x84\x8c\xbe\x4b\x91\xdf\x31\xab\x97\x1d\x95\xff\x54\x01\xfa\x84\x8c\x13\x34\xa7\x5d\xdf\x27\x37\x9d\x6a\xf3\xb2\xa3\xc6\x8f\xe2\xed\x08\x2f\x96\xd1\xeb\xd6\x65\x47\x4d\x9e\x55\x00\x93\x96\x43\xd0\x6a\x94\x9b\xcd\x7d\x3c\x95\x20\xed\x92\x08\xe7\x83\xbb\x24\xc2\x3b\xe1\x66\x42\x90\x35\x13\x14\x74\x4b\x91\x6b\x07\x8a\x6b\xcc\x4e\xaf\xef\x77\x2e\x9b\xfa\x3d\x43\x40\x8f\x64\x9d\xb8\x1c\x47\xed\xb3\xa5\x54\xa3\x1d\xdf\x70\xeb\x5f\x34\xa4\xeb\xba\x86\xf9\xda\x1a\x72\xcb\x4f\x60\xb4\xb1\xdf\xf1\x0d\xe7\x6d\xa5\x78\x79\x65\xda\xd5\x34\xef\x26\x84\x38\x14\x7b\x13\x1f\x2f\x98\xbb\x00\x54\xa6\x78\x96\x24\xa0\x5d\x4a\x59\x45\x95\xc2\x19\x76\x6d\x74\xab\x02\xb5\x9c\xd7\xc8\x54\x00\xab\x02\xe2\x03\x5b\x69\x1b\xfc\xe7\x6b\xec\xda\xd8\x5d\x04\x39\xcd\xc5\x75\x93\xe6\x1b\xeb\xc1\x95\x26\x30\xd9\x28\xb0\x7c\x3c\x43\xf6\xec\x4e\x05\xd4\x60\x65\xc7\x51\xd1\xeb\x3b\x5d\x8b\xd6\xdd\xa8\x25\x5d\xc2\x2d\x61\xe0\x11\x6f\xed\x45\xaa\x3e\x2a\xcf\x53\xa6\x03\xdf\x40\x57\x7f\x68\x51\x01\x53\xce\xa2\xa3\x2f\xca\x4c\x53\xcd\x11\xa4\x6b\x5f\xe8\xa9\xcf\xc3\x3f\x2e\x13\x3d\xd4\xa8\x36\x9a\xe6\x36\x91\x28\x56\x1f\x29\x91\x68\xd6\xcc\x46\x53\x88\x44\xa5\x5a\xaf\x0b\x27\x35\x25\x1c\x64\xab\x70\x50\xe1\x0b\xf8\x6b\xc6\x29\x31\x6c\xc1\xda\x43\xbe\xa6\x03\x6e\x97\x45\x8b\xc2\x08\xcd\x3b\x48\x14\x5d\x63\x74\xd3\x23\x2e\x85\xd8\x45\x7e\x87\x8a\xc2\x00\x79\xd0\x87\x94\xf8\x1d\xd5\x50\x43\x77\x31\x74\x07\x2e\xa6\x9a\x7e\xcf\xdf\xae\x03\x14\x9c\xa1\x05\x14\x5d\x38\x38\xd0\x84\xcd\x27\x4b\x3a\x2f\xca\x02\x89\x1c\x9e\x09\x59\x2c\x1c\xd4\xd9\x2c\x32\x82\xf5\x2c\xa0\xbe\x66\xea\x92\xba\x60\x49\xd6\x8e\x7d\x8c\x03\xcf\x81\x77\x9a\xfe\x6a\x93\x3e\xc3\xf2\x11\xa4\xa8\xbf\x9a\x21\xdb\x46\xf6\x07\xcc\x0c\xc3\x5c\xc7\xf4\x76\x11\x9c\x83\xa0\xaf\xe9\x61\x96\xf4\x8c\xcd\x9a\xa5\xcd\x41\xee\x82\x2e\x7f\x2a\x1f\x1c\xa8\x2f\xd4\x4e\xa7\x88\x7c\x6b\x09\xfd\x2e\xd5\xca\x7a\x98\x23\x3c\x42\x5b\x2e\x86\x13\xa8\x5f\x69\x8c\x55\x84\x3d\x93\x85\xa6\x4a\x7b\xba\xad\xf4\x57\x1e\xbd\x53\x24\x84\x42\x39\x88\x82\x5c\x8b\xac\x99\xe2\x42\xb6\xa2\xf9\xc8\x22\xab\x15\x72\x6d\xc5\x47\x2b\x72\xcd\xdf\x32\x13\xc5\x56\x90\x83\x56\xc8\xa5\x81\xae\xea\xe0\x85\xa9\xb7\xd5\xff\x2a\x26\x7d\x5b\xdb\x5d\xe7\x06\xde\x05\x25\xe2\xee\xd7\xbe\xac\x14\x2f\xdc\xbc\xf9\xb2\xe4\x43\x24\x16\xaf\x5e\xf0\x47\x1c\xbc\x11\xa8\xfb\x2e\x9c\x39\xc8\xd6\x64\xb5\xcd\xf2\x70\xb3\xe8\x1e\xcf\x23\x93\x62\xa3\x4f\xba\x18\xf4\x17\x26\x9f\x22\x08\x50\xb9\xea\xe2\x42\xc9\xf3\x1c\x4c\xb5\xac\xa8\xeb\x91\xc6\xac\xbc\xe8\x74\xf0\x03\x5c\x9a\x41\x5b\x61\x70\x2b\x44\x91\x9f\x19\x1e\x1c\x0f\xde\x24\x37\x2c\x6d\x45\xfd\x71\x93\x96\x1f\x55\x45\x88\x8f\x62\x09\x69\x55\xd0\x2d\xb4\xa8\x73\xa7\x10\x17\x29\x31\x75\x8a\xf6\x17\x09\x1d\x17\xfd\xa8\xfe\x25\x62\xb4\x86\x3a\xf8\x53\xf9\x12\xd0\x0e\xfe\x64\x5e\x02\xdf\xf8\xcd\x80\x9e\x77\x0c\x29\x1c\x23\xff\x1a\x5b\xcc\x81\x3e\x77\xd6\x0b\xec\xca\x21\xed\x32\x8a\x20\x45\x22\xa6\xa3\xef\xed\x88\x69\x81\xf1\x6b\xb5\xa1\x05\xc6\x68\x61\xe9\x20\x7a\x08\xa6\x33\x3d\xe5\xa3\xb1\x45\x24\xd8\xb9\x88\x64\x46\x42\xae\x1f\x91\x83\x96\x79\xd7\xce\x55\x4d\x2b\xdf\x20\xa7\x7c\xcd\x56\xfd\xb0\xc8\x08\xf4\x35\xaa\x03\xa9\x83\x4f\x20\x5f\x63\x4e\x89\xbd\x76\x50\x81\x3e\x46\x28\xb3\x46\x8b\x58\x21\x53\xc8\xf5\x5a\xa5\x25\x14\x72\xa5\x75\x58\x3d\x64\x86\x4b\x46\x37\xc3\x9c\x7f\x9f\xd6\xc7\xfa\xfd\x33\x1d\x5e\xb2\xdd\xe1\xa5\x57\x8b\x52\x1c\x51\x2d\xad\x71\xc9\x11\x3d\x64\x23\x2a\xbc\xd9\xba\xf0\x66\xcb\x89\x37\x2b\x03\x4c\xdc\xa2\x51\x57\x10\xbb\xfc\xa7\xf0\xad\xd8\x0b\x8b\x38\x25\xb3\xa2\x26\x0f\x2b\xbb\x54\x65\xee\xcf\x0a\x2e\x50\xc9\x8a\x94\xab\x84\x90\x0d\x96\xf8\xdb\x07\xb0\xb4\x1e\xf2\x50\x34\x92\x89\x26\x96\x75\x40\x32\xd1\x44\x93\x15\x4c\x2f\x92\x68\x62\x85\x15\x88\xf0\x18\xc9\x44\x15\xab\x51\xcd\x1a\xf3\xd6\xd7\x14\xf9\x25\xb2\xa6\x0e\xa2\x6a\x1a\x82\xff\xcd\x39\x1f\x81\xe1\xf4\x2e\x41\x40\xef\x1c\xf6\xa4\xfe\xf7\x0a\xd9\x18\x2a\xda\x0a\xde\x96\x6e\xb0\x4d\x97\x6d\xa5\xd9\x38\xf4\x6e\xf5\x7b\x23\x37\x20\x9f\xa6\xee\x82\x3d\x20\x97\x96\xfe\xb3\x37\x3c\x3d\xff\xcf\xcb\xfb\x25\x62\xe6\x63\xbb\x52\x2e\x7b\xb7\x47\xcc\x65\x2d\x41\x07\x2f\xdc\xb6\x85\x98\xde\x08\xc3\x1d\xd8\x33\x03\x5b\x84\x5b\xd4\xaf\x72\xd4\xe9\x76\xc2\xd0\x90\xfc\x35\x22\xee\x16\x81\xaf\xb0\x5b\x92\x60\x35\x0e\xa6\xc6\x93\x89\xcf\x00\xab\x83\xb5\x46\xb3\x5c\x2d\xeb\xc0\x89\x4d\x12\x2f\xb1\x53\x6c\xf6\x93\x39\x5e\x3a\x98\x74\xb0\x76\x78\xd8\xaa\x94\x75\xb0\x66\xf3\xa6\x55\x6e\xd6\x53\x81\xf5\x69\x71\x04\x99\xc8\x08\x72\x96\xe7\x87\x79\x9e\xb7\xa2\x82\x88\xe7\x66\x39\xcf\x6c\x53\xc8\xc5\xfa\x82\x71\x5b\x39\xe6\xbe\x93\xa2\xe6\x45\xa3\x1e\xd5\xae\x44\xb2\xd1\x88\xa4\xc8\xcc\xd7\x6d\x02\xd5\xe3\xa1\x79\x89\xf7\x70\x43\x6a\x64\xc5\x56\x84\xb4\x1e\xd3\x9d\x8a\x0d\x57\x78\x53\x5b\x62\xc3\x44\x06\x85\xe5\x8a\x45\x3b\x84\x07\x72\x2b\xf1\x8a\x44\x0d\x17\x5e\xe3\x05\xa4\x68\x42\x3e\xe2\x2f\xd0\xb7\x35\xca\x3c\xa1\x0f\x83\xe3\xfe\x68\x6c\x08\x5f\x51\x0f\x23\x1a\x99\x47\xaf\x1c\x23\xcf\x21\x77\xca\xa6\x94\xe7\xff\x6e\x84\x91\xe3\xd6\x09\x8f\xb4\xf2\x1e\x8b\x48\xab\xc4\x79\x47\xd6\xbe\xc2\x9c\x31\xcb\x59\x07\x14\xf9\xcc\xdb\x17\x86\xb7\x47\x89\x0f\x54\x45\x96\x2b\xc4\x15\x75\x1d\x62\x41\x47\xb9\x21\xfe\x15\x8f\x60\x11\x57\x90\x25\xe3\xb8\x24\x65\xd2\x47\x26\xb8\x2d\x5a\x22\xae\x22\x1d\x60\x3d\x4c\xf6\x46\x8e\xf7\x11\x23\x2e\x23\xbf\x9e\x59\x9a\x09\xa6\xc0\xac\x80\x48\x78\x9a\x79\x69\x3a\xcc\x0b\x53\x2c\x6f\xb5\x0d\x79\xab\x6f\xc8\x5b\x03\xa8\xca\x87\xd3\x1b\xe8\x23\xe5\x7a\xcc\x7d\xfb\x4d\xb9\x6b\x6e\xc8\xdd\x61\x54\x52\x2d\x10\xa7\x8c\xdc\x89\xb6\x8b\x04\x2f\x8e\xdf\xa4\x24\xaf\x92\xda\x95\x68\xec\x2f\x79\x8f\x15\x3c\x19\xce\x48\x49\x5e\x75\x1f\xc9\x8b\xa8\xad\x6d\xcc\xf8\x7a\x9e\x05\x66\x63\x83\x07\x66\x73\x83\x09\xe6\x21\x50\x95\xee\x0a\x7e\x21\xae\xf2\x11\xcd\x14\x69\xfc\x04\x9b\xac\x30\x5b\x1b\xbc\xa8\xc4\x5b\x57\xcd\x7c\xed\x8a\x99\xe3\x46\xa5\xb2\xad\x33\x95\xea\x06\x37\x2a\xb5\x14\x37\x0e\xff\x3c\x6e\x74\x3f\x8e\x13\x4e\x54\xea\x4f\xe0\x44\xa5\x91\xe7\x44\xa5\xb9\xa1\x7c\x0f\x37\x38\x51\x69\x6d\x70\xa2\x5a\x06\xaa\x72\x8a\x2d\x9f\x04\x64\x4e\x95\xee\x97\x75\xd1\x84\xa8\x9a\x1b\x5c\xa8\xc6\xca\xbd\xb5\x51\xbb\x9a\xe3\x42\xb5\xb6\xad\x23\xd5\xfa\x06\x17\xaa\x8d\x94\x36\x2e\xff\x89\x5c\xf8\xed\x22\x3d\x23\xaa\xcd\x3d\xf9\xb0\x4b\x27\x47\x2a\x99\x0f\x73\x2a\x48\xab\x52\x0b\x31\x4f\x0f\x19\xc8\xc6\xac\x1b\x91\x76\x6d\x3d\x4b\x77\x17\xe9\xb3\x47\xe9\xec\xeb\x95\x00\x94\x41\xce\x08\x4e\x48\xcc\x93\xc9\x91\x13\xbb\xef\xc0\x80\x62\x4b\xe9\x91\x95\xb7\xa6\x48\xe9\x39\x64\x6d\xef\x41\x5c\x81\x7e\xf8\x56\x14\x16\x0a\xfc\xa3\x88\x5a\xc5\x90\x22\xfe\x9b\x5e\xee\x56\xfb\xda\xc5\xe9\x55\xad\x52\x4d\x2d\x6b\x62\x77\xbb\x52\x4b\x1b\x49\x27\x04\x32\xeb\xd2\x30\x8c\x47\xc8\xa7\x1e\x32\x1f\xa7\xbf\x25\xfe\xe4\x3d\x18\x7f\x12\x06\x78\x14\x7a\xa2\x98\x3a\x48\xf2\x20\x8a\x3c\x75\xcf\xcf\xa7\xa3\xe1\xc5\xa4\x3f\xee\x58\xc6\x2f\xa2\x2c\x9e\x5c\x1d\xdb\x80\x5d\x51\xe6\x08\xb2\x3b\x2f\x4c\xf1\xec\xf9\xe4\x1a\xdb\xc8\xef\x38\x9b\xbe\xef\x02\xd1\x73\xf9\x9a\x71\x4f\xd3\xd3\x11\x2d\x56\x7f\x85\x82\x00\xb9\x0b\xe4\xf3\x90\x14\x0f\x20\x6a\x13\xe3\xc4\x78\x3d\xea\x9e\x1d\x0f\xce\xde\x4e\x7b\xef\xba\x67\x6f\xfb\xc7\x00\x75\x7e\x12\x21\x30\x39\xcf\x3a\xc8\xf0\xe0\x1d\xa3\x25\x2a\x11\xd4\x14\xca\x4a\xaa\x72\xb1\x2c\x89\x8e\x09\x6b\xff\x1c\x2e\x50\x4f\x18\xea\x29\xb8\x99\x2f\xde\xa6\x6b\x6d\x8e\xa5\x11\x20\x3a\x61\xcf\x5a\x01\x24\xaf\xa8\x87\x02\x6a\xed\xc6\x1d\xd6\xc3\x0d\xb5\x86\xa2\x50\x72\x70\x83\xa9\xb5\xd4\xb2\x03\x5f\x06\x05\x43\x1d\xe4\x86\x1a\xe9\x80\x69\x31\x18\x20\x85\xf1\x2e\xb2\x18\xda\x94\x71\xd7\xf8\x38\xf8\xad\x3b\x3a\x9e\x9e\xbe\x3d\x9d\x4c\xe5\x86\xc3\xd1\xcc\x47\xf0\xea\x28\x81\xe8\x7e\x1c\xcb\xda\xdd\x8f\xe3\xa9\x80\xd8\xac\xc4\xf7\x4e\x64\x35\xf6\x7b\x5b\x45\xb9\xad\x22\x6a\x8a\x07\x59\x35\x4c\x09\x68\xac\xe1\xb5\x4f\xf4\xf2\x09\xc1\x11\x22\xe3\x21\x6f\x84\xf1\x59\x6d\x68\x6b\xe3\xf8\x56\x7f\x86\x37\xcf\x7f\x30\xa7\x39\x09\x7b\x10\x1e\xf6\x88\xb6\xaa\x2b\xc2\xbb\x3f\x2c\xf4\xee\x37\x9c\xf1\x78\xcf\xd3\x41\xd7\x5c\x13\x99\xac\xa8\x0a\x54\xec\xba\xc8\x7f\x47\x57\x4e\x0e\xc6\x59\x64\x7d\xf8\x60\x95\x7d\x2e\xc2\x59\xc9\xec\xf1\xc6\x91\x86\xa2\x0d\xe0\x54\x33\x35\x25\xd5\x46\x43\x49\x47\x10\xb2\xbb\xbf\x69\x98\x2c\x65\x8d\x0d\xc2\x58\x75\xe8\xdb\x2a\x50\x23\x3d\x91\x2a\x2d\xcd\x1c\x22\xf6\x81\xa3\x02\x3e\x47\xd2\x05\xdc\x39\x97\xf5\x80\x7a\xe3\x43\x4f\xbe\x95\x4b\x9c\xd8\x86\xaf\x1d\x66\x90\xc8\x7d\xe9\xe8\x79\x4e\x08\x95\x7b\xf4\x98\x51\x32\xa3\x6e\x49\x2c\x00\xa5\x78\x37\xd0\xe4\xc5\xf2\xa5\xe7\xe3\x15\xf4\xef\xb2\x5b\xd5\x26\x50\xe1\x4d\x50\x42\x56\x25\xdd\xe6\x06\x46\xbe\xa3\xf8\x28\x6c\xab\xa0\xc4\x97\x9c\xdd\xe8\xc4\xa6\xe4\xa3\x10\x0a\x87\x6d\x27\x3a\xe9\xd3\x3d\x0e\x1f\x0f\x96\x88\x30\x89\x0a\xd4\x15\x2d\x55\xca\xf2\x4d\xe0\x71\x71\x55\xe3\x5f\x25\x67\xf1\x4d\x02\x4b\x72\x01\x5d\x56\x64\x5c\x89\x1b\xa6\xa2\x42\xbc\x74\xa6\xd7\x46\xf6\xbe\xce\x8d\xd3\xea\x36\x8b\xb4\x91\x6f\xb0\x99\x64\xbd\x91\x28\xfb\x6c\x59\xe3\x99\x6e\x24\xca\x3d\xdb\xbe\x1a\x73\x87\xb6\x0c\x8e\x41\xf5\x10\x44\x98\x1a\xf1\x0b\x13\xac\x40\x1d\x94\xe3\x72\xb9\xb1\xaf\x09\x63\x84\xd3\xf8\xd6\x47\x9a\x1a\x65\x4e\xd1\x82\x55\x27\xda\xa6\xdf\x7c\x63\x38\x64\x41\x78\xd6\x0a\x50\x15\x32\x9f\x07\x88\x96\x28\xf1\x4a\x95\xc4\x8c\x62\x3f\x86\x9f\xd7\xda\x93\xd0\x8b\x15\x0a\xe4\x4d\xdd\x44\x35\x3d\x8d\x6a\xec\x52\x9f\x00\x62\x90\x9f\x8f\x23\xe4\xb5\xd8\xda\x93\xc6\x1e\x5d\x22\x45\x05\xf4\x21\x5b\x4f\xdd\xa4\x4e\x18\xe2\x2f\x68\xb4\x3e\x6e\xab\x91\x54\xc8\x45\x1b\x5d\x63\x58\xff\x3f\x32\xda\x68\x30\xed\x18\xdb\x6f\x05\x20\x8a\xa2\x18\x89\x9e\x2e\xa8\x00\x94\xc7\xe3\x10\x5a\xb8\x88\xb0\xcd\x61\x7a\x3e\x65\xac\xc2\x8c\xba\x7f\x16\xcd\xdb\xd1\xdf\xaf\xa0\xbf\xc0\x6e\xbb\xbc\x47\x27\x52\x8b\x5c\x11\xc6\x3f\xd6\x01\xc5\xf3\xbb\x92\x2c\x97\x83\x74\xc4\x47\x4c\xa4\xac\x7d\xbb\x71\x4b\x4b\x89\xd9\x2c\x88\x49\x2f\x3a\x58\xab\x34\x2a\xcc\xbd\x5f\x76\xb0\x56\x6b\x34\x0f\x2b\x3a\xe8\xf2\x9f\x95\x6a\x43\x07\xe3\x24\xb5\xa2\xd7\xc1\x1a\xdf\x90\xd7\xc1\xa8\x83\x35\x9e\xae\x11\x79\xf7\xc3\x0e\x33\x5a\x10\x54\x2f\x93\x28\xf5\x3c\x1d\x5e\x4c\xaf\x18\xdc\x7d\x8a\x63\x4d\x89\x53\x04\x1e\x72\xd5\xa3\x3c\x55\xc4\xb8\x75\xc2\x9c\x3f\x99\x81\x2a\x60\x7e\x4b\xa5\x70\x27\xc9\xdb\x4b\x6c\xa3\x52\x94\x8a\xd0\x46\xe9\x4c\xec\xd9\x36\x0a\xd9\x04\x8c\x92\x15\xe4\x90\x46\x81\x9a\x47\xd2\xcc\x55\x95\xe5\xf8\xe7\x24\xe0\xfe\x0c\x23\x5a\x62\x3c\x16\xda\x8a\xb8\x7a\x2a\xb7\x98\x18\x1f\xde\x7f\xd6\xaa\xe0\x37\xf0\x82\x6b\xfb\x17\x9d\xb8\xfe\xc1\x41\xfc\x53\xee\xa6\xea\x7a\x46\x2d\x26\xc3\x22\xab\xc9\x51\x89\xfb\x39\x48\x2d\xdc\x24\x4a\x82\x67\xf3\x94\xb3\x0c\x98\x26\x0f\x1c\x55\xc4\x6b\x4e\x79\x94\xc3\xf7\xa2\x1c\xe5\xc7\x9f\x15\x0e\xae\x45\xbc\xbb\x92\x0c\x07\xb1\xb1\x05\xd7\x9d\xfc\x86\x61\x54\xd5\xc1\x2e\x92\xb2\xc8\xb3\xe8\x99\x68\x72\x1d\xa8\xb6\x29\x90\x32\x8a\xc3\x10\xbc\xee\x64\xcd\x0d\x09\x2f\xd4\x25\x8a\x6a\xd2\x30\x04\x17\x9d\x4f\xea\x7f\xa9\x97\x7c\xbf\xf0\x7c\xc7\x7e\x21\x92\xf9\x16\xc8\x89\x3c\x66\x5e\xeb\x04\x07\xb4\xa3\xaa\xa2\x84\x59\xdc\x5c\xa2\xe2\x92\x00\x7f\x41\x1d\xb3\x21\xdd\x42\x31\xb0\xf1\xcb\x48\xfe\xd2\x05\x9c\x93\x28\xe8\x7c\xe2\x66\x18\x59\x53\xd6\x63\xf5\x52\xbc\xb7\x71\xc0\x37\xdf\x63\x47\x3b\x2f\x0c\x1d\x95\xad\xfd\x0e\x9a\x53\x89\x91\x0d\x6d\x8f\xd9\x6f\x1d\x17\xdd\x28\xc4\xb8\xf6\x24\xf1\x73\xec\x07\xf4\x84\x40\x3b\xce\x10\x81\x2e\x5e\x45\xad\x47\x04\x2d\x61\x70\xee\x93\x3f\x90\x45\x91\x1d\x39\xc0\x51\xdb\x38\x18\xc3\x39\xf4\x71\xe7\xe5\xff\xd6\xb4\x57\x2f\xac\xa5\x4f\x56\xe8\x2b\x74\x6d\x9f\x60\x5b\x37\xf4\xff\x0a\xf8\xeb\x97\xd8\xa0\x28\xa0\x9a\xf4\xe2\x88\x6f\xac\x03\xe4\x77\x17\xc8\xa5\xfa\x46\x32\xcb\x8c\xac\x5d\x3b\xe8\xc4\x43\xf7\x63\xe3\x47\xd5\xbb\xdd\x41\x8c\x64\x89\xe1\x42\xb6\x72\xf7\x45\xca\x85\xc1\xad\x93\x09\xba\xa5\x06\xf5\xf1\x2a\x8a\x77\x58\xd0\xb1\xd6\xcc\x14\x95\xbd\x9c\x90\xae\xe7\x39\x77\x9a\x1e\x6e\x7d\xc3\x5d\x6e\xd4\xf9\x74\x79\x94\x61\x98\x9c\x41\x5f\xbf\x22\x71\x4c\x46\xe5\xf6\x35\xb3\x9e\x75\x50\x54\xf1\xe0\x40\x43\x1d\x64\x58\xc4\xb5\xa0\xcc\x74\x48\x58\x1d\x25\xdc\x44\xcc\x65\x33\x55\x60\x8d\x4a\x52\x58\xb3\x04\x76\x90\xf1\x07\xc1\x2e\x9b\xb7\xfa\x8f\x6a\x94\xd1\x10\xcb\x25\x1f\xde\xde\x12\xba\x0b\x14\x44\x23\xbc\x63\x10\x88\x77\x37\x21\x3d\x07\x7b\x33\x22\x03\x0e\x51\xd0\xf5\x06\xbb\x36\xb9\x01\xb8\xe3\x76\x7e\xba\x77\x0d\xcf\x47\xd7\xc8\xa5\xc7\x68\x0e\xd7\x0e\xe5\x67\x20\xac\x08\xec\x18\x52\xf8\x2a\xf7\x6c\x04\x88\xb2\xbf\x1a\x57\x17\x2f\x3d\x07\x62\xa6\xca\xf4\x36\xcd\xd6\x3b\x38\xa0\xdb\x00\x19\x33\x19\x08\xa0\x86\xc8\x73\xe9\x33\x0a\x58\x27\x91\x8b\x7c\x8d\xab\x10\x15\x60\x3d\x3c\xca\xc8\x66\x94\x0e\xc5\x54\x54\x4e\x46\xae\xa1\xb3\x46\xd1\x54\x2e\x78\x2f\x42\x00\x4c\x39\x53\x03\xda\xf6\x96\xf6\xc0\x63\xbb\xf0\xea\xc1\xae\xb5\x6d\x62\xad\x79\xd3\xe8\x16\x59\x3d\xb2\x5a\x41\xd7\x96\x2d\xe9\xa1\x4d\x7a\xc4\xbb\x8b\xb9\x98\xe3\x95\x48\xb2\x62\x3d\xd2\x73\xf3\xde\x40\x2b\x36\xbd\x36\x26\xbd\x59\x30\xe9\xe7\x0e\xf6\x4a\x4b\xe2\xe3\x2f\xcc\x9c\x75\x4a\x33\x42\x29\x59\x6d\xea\x36\x8b\x78\x18\xd9\x8a\xe5\x60\xc5\x12\x64\xaa\x80\x47\xb9\x56\x88\xac\xa9\x50\xa1\x0f\x63\x67\x42\xe4\x07\xa8\x40\x75\x86\xc0\xac\x97\xcb\x4f\x0e\xf5\x10\x63\xfc\xfa\xf3\x1e\xf1\x1d\xe8\xb1\xf5\xd9\xbb\x2b\x51\x52\x8a\x79\x14\xad\x47\x97\x97\xe0\x1a\xa3\x9b\x5f\xd6\xc8\xbf\xcb\xb9\xb0\xd1\x8a\x4f\x8c\xb7\x73\x6d\x08\xea\x40\x34\x2c\x16\x73\xae\x38\x8e\x88\x81\xdf\x9e\x6a\x6c\x49\xef\x8d\xde\x69\x3a\x4f\xcf\xe3\xc2\xd6\x41\x82\x19\x7a\x18\x26\x19\x97\x95\x07\x33\x2e\x89\x31\x21\x8e\x46\x93\x29\xae\x87\x71\x8a\x4e\x5c\xd6\x4e\x87\x72\x64\x99\x7a\x09\xb8\x78\xb4\x55\xfe\x47\x05\xf1\x78\xb7\xd5\xf8\xa7\x0a\x98\xce\x6d\xab\xec\x7f\x15\xc8\xb5\xa5\x1d\x67\x60\x82\x48\xab\xb5\xd5\xe8\x17\x2f\x93\x1c\xe6\xa5\xf2\xb7\x0a\x22\xdd\xd5\x4e\xb4\x18\xc8\xaf\x56\x31\xea\xb8\x44\x0d\x01\x59\x53\xd9\x9f\x48\x84\xdb\x6a\xfc\x33\x93\x6a\x44\x8c\xc9\xe4\xf8\x12\xb8\x0b\xb9\x18\x8c\x63\xa6\x5e\xe4\x02\x71\x95\x54\x9e\x4d\xf6\x98\xc7\xc6\x39\x05\xcb\xf1\x37\x13\x69\xe3\xd8\x48\xfa\x4c\x49\xaa\x63\xaa\xbb\x18\x33\x5f\x51\xcd\xc5\x86\x5c\xbc\x2a\x91\x19\x5b\xb1\x72\xa0\x51\x7d\x51\x6f\xee\x13\x66\x1a\xaa\x73\x68\x21\xf9\x47\xee\x4a\x64\x0e\x30\xe4\x45\x94\xbd\xcd\x46\xe1\x66\x90\x87\xc4\x1e\xc0\xb3\x44\xf2\xa0\x85\xe5\xf8\x63\xce\x6a\x75\x65\xcb\x48\x4f\xca\xd4\xcc\x9c\x9e\xb1\x1c\x7f\x30\x1f\x7a\x48\x9c\x7d\x90\xd6\x2c\xb2\x31\x65\x23\x10\x9f\xd2\xa8\x82\xd8\xe6\xcb\x06\x16\x1f\xd5\xce\xe3\x30\x8b\xc8\x26\xb3\x38\xd5\x47\x84\x97\xde\xfc\x40\xe3\xa8\x4f\xe4\x34\x64\xe2\x4c\x29\x23\x5d\x4d\x45\x9b\xe2\x2d\xe2\x1d\x7b\x93\x32\xc7\x91\xa6\x56\x6e\x6a\x44\x7a\x3a\xcc\x27\x30\x54\xf2\x09\x0c\xd5\x54\xb0\x2a\x39\x5a\xc8\xa3\x20\xef\x02\x57\x8b\x03\x48\x4d\x30\x07\x15\x60\x46\xc4\xd7\xf3\xc1\xac\xc3\x74\xc4\x89\xe1\x6b\xe5\xce\x5c\x3e\x18\xb8\x9a\x81\x0a\xa8\x6f\xf1\x57\x0a\x53\x6c\x64\x5c\x6b\x20\xe8\x4a\x7c\x80\x56\x2a\xb8\x95\x3d\xf5\x28\x3c\x13\xd3\x04\x67\xb1\x6b\x42\x63\x2b\x89\x8d\xdb\x86\x69\x45\x8b\xec\xbd\xc4\x67\xa9\xa4\x42\x39\xb2\x0d\xba\x69\x20\xe9\x5a\x5a\xfd\xc4\x8c\xe2\x3e\x93\x9c\xb1\x8f\x22\x47\x3f\x38\x78\x51\x48\x10\x53\xc9\x57\xfd\xdf\x34\xb3\x0a\xae\x19\x01\xdc\x7e\xdd\xfc\xa1\x17\x6e\x39\xd2\x64\xd5\x2b\x8a\x50\xc5\xdd\x4a\x2d\xa3\xdf\x96\xf2\x8f\x27\xaf\x35\xb3\x09\x5e\x6f\x21\x38\xbb\x59\x2a\x57\x05\x6e\x97\x17\x71\x61\x30\x4f\x62\x81\x11\x11\x51\x04\x30\x4f\xd4\x93\x90\xd3\xd8\xac\xdb\x0c\xd7\xad\xae\xc0\xd8\xf8\x79\xf5\x07\x18\x1b\xb3\xd3\x6b\xe0\x1a\xe7\x3d\x30\x36\x3e\x5f\x9f\x00\xd7\x18\xd6\xc1\xd8\x70\x3f\xff\x0a\xc6\xc6\x97\xe3\x37\xa9\xb0\x9e\x11\x99\xed\x05\x41\x8f\xf6\x9c\x58\xeb\xe0\x5e\x3a\x60\xed\xf2\x0b\xbc\xf2\x88\x4f\xa1\x4b\x43\x36\x0f\x8d\x94\xcf\x5a\x1c\x53\xd9\xfa\x4e\x46\x83\x4a\x3e\x77\x41\x53\x88\x8f\x66\xc4\xb7\x91\xdf\x76\x89\x8b\x8e\x3c\x68\x33\x2b\xa0\x5d\x0e\x8d\x62\xb3\xac\x08\x33\x13\x14\x71\x0c\xab\x18\x46\x31\xea\x81\x62\xad\x67\xd8\x2a\xcd\xd0\x17\x8c\x7c\xcd\xa8\xd5\xeb\xc0\x28\x57\x81\x51\x37\xeb\xc0\x68\xd5\xeb\xba\x32\x23\x74\xb9\xd9\xaa\x34\xd7\xf6\x6b\x56\x02\xed\xd3\x6e\x6a\xd1\x2c\x0c\x0c\xfa\xd0\x0d\xe6\xc4\x5f\x95\x38\x1b\xdb\x9e\x8f\x02\xe4\x5f\xa3\x52\xd5\x3e\xb2\x45\xce\x7f\x9b\x07\xb2\x8e\x22\xd6\xb1\xe1\x0c\x0d\xb6\x18\x16\xe1\xf3\xe4\x3a\xd4\x86\xb3\x80\x38\x6b\x8a\x8e\x44\x8c\xc0\x2c\x97\xff\x33\x8a\xa8\xf2\xdf\xa5\x1b\x34\xbb\xc2\xb4\xc4\xd6\x58\xbe\xb2\x5e\xe3\x00\xcf\xb0\x83\xe9\x5d\x5b\x2c\x4d\x47\xbb\x5e\x71\xd6\x96\x7c\x68\xe3\x75\xd0\xae\x16\x05\x82\x8f\xc8\x35\xf2\xe7\x0e\xb9\x89\x60\x78\x8d\xb8\x10\x39\x0e\xf6\x02\x1c\x1c\xc5\x23\xd0\xf6\x09\x85\x14\xfd\x55\x2b\xeb\xa1\xc1\x6d\x88\xa2\x0e\x7e\x29\xf1\x43\x3f\xed\x4a\x59\x56\x32\x12\xbb\x60\xe7\x80\xf8\xc8\xe1\x0e\x51\x68\xb0\x7e\xed\x42\x6d\x96\x0b\x88\x32\x0f\xcb\x36\x5a\xe8\x02\xfa\x81\x36\x29\xf1\xda\x3c\xfa\x9c\x0e\xb3\x15\x55\x8c\x38\xcc\x79\xfa\xdf\x57\xe8\x6e\xee\xc3\x15\x0a\x94\x62\x71\xbf\x2f\xff\xe7\x7d\xe1\x68\x51\x52\x50\x5e\x8a\x28\xde\x85\x58\x0a\x74\x31\xe6\x18\x43\x21\x7e\xe6\xd0\xa4\x02\xa7\x71\x5c\xed\xa4\x70\x43\x6c\xfb\x62\x2c\x0d\x97\x4c\xfc\xb3\x02\x54\xa5\xab\xf4\x4e\x06\x91\x43\xa6\xcc\x89\xaf\xf0\xf3\x39\xd8\x5d\x28\x30\xce\x8b\x59\x07\xec\x99\x2e\x91\x62\x11\x77\x8e\x17\x6b\x5f\xa4\x80\xce\xb1\x83\x94\x05\xf3\x6d\x21\x45\xb6\x32\xf7\xc9\x4a\xe1\x8e\x85\x82\x92\xa3\x14\x0c\xec\x62\x60\x28\xe7\x0e\x82\x01\x52\x5c\x42\x11\x2f\xf3\x20\x5d\x2a\xac\x51\x17\xae\x90\x42\xe6\xdb\xf0\x4b\x14\x69\x32\xd1\xe7\x35\xbe\x86\x0e\x72\xa9\x32\x43\x0e\xb9\x31\x94\xc9\x12\x89\xda\x16\x74\x95\x19\x52\x56\xc4\xc6\x73\xe6\x6e\x42\x7e\xc6\x65\x1d\xa0\x7c\xe7\x6c\x91\xec\x01\x9d\xa8\x97\x41\x51\xf6\x4c\x14\x82\x3c\xed\x6c\x98\x70\x22\xd6\xe6\x60\xf7\x4a\xee\x7e\x06\x2b\xf5\x32\xe4\x11\xc1\xbb\x47\x66\xd7\xe4\x52\x6b\x2c\x07\x77\x54\xf5\x28\x8a\xe8\xb2\xb2\xa3\x5d\xb9\x2d\xbd\x93\x41\x9c\xd6\x42\x3b\x3f\xdd\x23\x8e\x81\x46\x09\x23\x85\x09\x22\x49\xe8\xec\xcf\x3b\xc8\xc0\x5c\x63\xcf\x47\xcc\x03\x2e\x09\x86\xee\x4a\x7b\x68\x0a\x6f\xab\xf1\xf8\xb4\x07\x79\x26\x90\x2b\x71\x57\x64\x23\x73\x67\x4b\x18\xff\xf2\x28\x03\x9a\xd3\x54\x3e\x03\xbe\xe6\xa7\xf7\x83\x00\xf9\x54\xfe\x2e\x3c\xfc\xb8\xe5\x9c\xbd\xb4\x34\xd4\x4a\x85\x37\x94\xda\x31\x35\x23\x5f\x25\xe5\x9a\xb0\x72\xbe\x4e\x0b\xcf\x50\x7a\x31\xce\x62\xd3\x27\x8a\x08\x65\x7e\x9a\x8d\x64\x02\x47\xe2\x26\x27\x4e\x74\xe4\x80\xa7\xbd\xe5\x3d\x1a\xfe\x86\x3b\xea\xd2\xc3\xaa\xa4\x3c\x15\xba\x44\xd0\x56\x53\x9e\x0a\xf5\xe3\xa7\x3a\x7b\x1d\xb9\x2d\x22\xc9\x9a\xcd\x64\x19\xa8\x52\xfa\xc9\x4c\x56\x53\xdb\xea\x79\xff\x4a\x26\x5a\xe7\x1c\x1e\xe6\x50\xb4\xc0\x09\xa8\x82\x6d\xaa\xaf\x5e\xe4\x87\xf0\x2f\xb3\x94\x53\x74\x6d\x4b\xc9\xa6\x33\x62\xdf\xc5\x64\x99\x95\x4c\xc7\x4c\xd6\x71\x3b\x72\xa0\xd6\x17\x9a\x59\xdb\xc0\x51\x17\x55\x62\x9f\xcd\x6c\x80\xdd\x71\xa3\xdd\x8e\x57\x71\x3e\x5f\x26\x31\x40\x10\x31\xfc\xbc\xe6\xe1\x1e\xbc\x69\x14\xa7\x84\x8b\xb9\x9c\x4a\x8a\x19\xaa\xae\xa5\x04\x8e\x47\x4e\x14\x9e\x35\x4a\x89\xc2\x28\x8e\xd5\x30\x7b\x8e\xc3\x09\xba\x16\xc9\xa6\x68\x51\xcb\x04\x74\x88\x71\x6c\x9f\x6a\x75\x70\xaa\xe7\xad\xef\xc8\xf0\x66\xd6\xf6\xc8\xf8\x43\x1a\xdb\xe7\x79\x73\xfb\x2f\x06\x17\xb8\x62\x6b\x99\x2e\x0d\x36\x7d\x8a\x0c\x71\x07\x06\xb4\x64\x2d\xb1\x63\x03\x65\x27\x0a\xfb\x11\x28\xe4\x0e\x90\xd9\x6a\x30\x73\x43\xe4\xa9\xd0\x65\x91\xa9\x21\x2d\x36\x8b\x38\x0e\xf4\x02\xd4\x96\x27\xfd\x50\x64\xca\xb1\x19\x6a\x11\x87\xf8\xed\xff\xb0\x2c\x2b\x5d\x2a\x0c\xd3\x80\x38\xd8\x4e\x17\xcb\x96\xbd\xdb\x90\x77\x62\x6b\x57\xee\xf9\x8b\x92\x03\xef\xc8\x9a\xb6\xe7\xf8\x16\xd9\x0f\x40\xf0\xce\x17\x6e\x6b\x3f\x0c\x57\xd8\xf7\x1b\xe2\xdb\xfc\x3b\x26\x6d\x9e\xb2\x57\x62\xcf\x69\x83\x95\x8d\x73\x68\x30\x45\x57\x04\x7d\xcd\x34\xb3\x05\x1d\x59\x79\x85\x6d\xdb\x41\x47\x72\xac\xe6\xf3\x39\xb7\x93\x17\x3e\xf3\x33\xa3\x11\x2c\x97\xcb\x47\x73\xe2\xd2\xd2\x1c\xae\xb0\x73\xd7\xc6\x2e\x33\xdd\x33\x45\xea\x1b\xec\x43\xa5\xc7\x94\x2b\x38\x45\xae\x43\xc0\x29\x71\xa1\x45\x98\xf4\xaf\x7d\x8c\x7c\xe5\x0c\xdd\xa8\x60\x45\x5c\x12\x78\xd0\x42\xe1\x5f\xb2\x9b\xd4\x57\x9d\x9f\xc7\xc3\x33\xc3\x83\x7e\x80\xb4\xbf\xdc\x47\xdf\x72\x68\x7f\xba\x57\x99\xd9\xa2\xb6\x55\x69\x3d\x70\x89\x3f\x63\x96\xcc\xe4\xf5\x31\x53\xbf\x90\xa2\x05\xf1\x31\x0a\xd2\x95\x2f\x02\xe4\x2b\xc1\xda\xf3\x1c\x66\x9b\xf0\x79\x13\x70\xe5\xee\x63\x36\xda\x99\xba\xd1\xe7\x1b\xce\xba\xa7\x7d\x9e\x68\x2c\x92\x58\x98\xa6\x6f\xab\xc7\xc9\x13\x6f\x30\xbc\x0c\x41\x02\x29\xcd\x36\x61\x7e\xd8\x62\xc3\x45\xb6\xa6\x68\xd2\x42\x62\x2e\x82\xcf\x5d\x06\xfd\x21\x0a\xce\x4f\xba\x67\x0f\x53\x00\x36\xe0\xba\xe7\x83\xe9\xb8\x3f\xfa\xc0\xbf\x41\x31\x9a\xec\x83\x62\x3c\xf8\xed\x11\x9d\x4e\x35\x39\x3c\x9b\x8c\x86\x27\x8c\xd2\xfe\x74\x5f\xe0\x8f\xc3\xd1\xfb\xfe\x68\x6f\xb0\xfe\x59\xf7\xf5\x49\x7f\xda\xbd\x38\x1e\x4c\xa6\x27\xc3\xb7\x6f\x07\x67\x6f\x9f\x32\x4c\xbd\xc1\xf1\x68\xaf\xb1\xe9\x8f\x3e\x0c\x7a\xfd\xbd\xe1\xe4\x18\x4d\xc5\x20\x9d\x76\x7b\xef\x06\x67\xfd\x69\x6f\x78\x71\xb6\x17\x6b\xe4\x68\x7d\x53\xf8\x69\xf9\xd9\x18\xcc\x67\x63\xa8\xec\x83\x61\x38\x7e\xe4\xc4\xcc\x80\x7c\xe8\x8f\xc6\x83\xe1\x5e\x93\x69\x38\x9e\x76\x47\xbd\x77\x4f\x12\xcc\xc9\x70\xdc\xeb\x9e\xf4\xf7\x92\x92\x04\x6a\x7a\x3a\x38\xe3\x93\x62\x3f\xee\xa4\x11\x74\xff\xfa\x4c\x04\x11\x05\x7b\x71\xb7\x88\x82\x27\x23\x88\x28\xd8\x4b\x3a\x8a\x28\xd8\x0b\x81\xcc\x6b\x8f\x04\x74\xd2\x3f\x3d\x3f\xe9\x4e\xfa\xd3\xc1\x69\xf7\xed\x5e\x42\xf7\xfe\xe2\x75\x7f\x74\xd6\x9f\xf4\xf7\x10\xbe\xed\x6b\x09\xb7\x2b\x32\x2b\x89\x4b\xe8\x23\x57\x93\xc1\xd9\x9b\x51\x77\x3c\x19\x5d\xf4\x26\x17\xa3\xfe\x34\x3a\x11\xb2\x4f\x67\x22\x98\xe9\xe4\xd7\xf3\x47\xad\x89\x97\xe1\x65\x9c\xe0\xfd\x2f\x59\xb4\xf7\xa4\xb0\x60\x31\x38\xe9\x8e\xc7\xfb\x00\x0e\xc6\xd3\x8f\x83\xb3\xe3\xe1\xc7\xf1\x94\x69\xb5\x93\x61\xf7\x38\x3a\x88\xb1\x0f\x1a\x79\xaa\x63\x9a\x5d\x24\xfa\x67\xc7\xe7\xc3\xc1\x63\xf4\xfb\x77\xfb\xe3\x5f\x6e\x7f\x44\x2c\x3b\xbb\x38\x9d\xf6\xce\x2f\xf6\x92\x9a\x08\xf6\x78\x30\x7e\x3f\x7d\x3b\x78\xfd\x14\xd8\xd3\xfe\xe9\xf4\xf4\x69\xa0\x59\x29\x7b\x4e\x07\xb2\x98\x9e\xd3\x9d\x9c\x79\xf4\xf4\xce\x49\x76\x3e\xa7\x57\x12\xc5\x73\xba\x13\x99\x38\xcf\x60\xd2\xc9\x90\x0d\xc4\xf0\xf8\x69\x52\xd9\x9f\x30\x12\x9e\x02\x1a\xad\x76\x4f\xea\xb6\xd4\x85\x4f\xc2\x31\x38\x8f\xc8\x9e\x0e\xce\x26\xfd\xd1\x9b\x6e\xef\x49\x44\x8c\xc7\xef\x98\xf5\xf5\x6e\x38\x1a\xfc\xd6\x3f\x9e\xbe\xef\xff\xfa\x14\x2c\x17\xe3\xfe\x68\x5f\x1b\x33\x82\x3d\xef\x8e\xc7\x1f\x87\xa3\xe3\xa7\xc0\x76\x7f\xdb\xcf\x5e\x4b\xc1\xed\x65\x65\xa5\xe0\xf6\xb2\x8d\xe2\x51\xe6\xaa\xfd\x49\x5a\xaf\x3b\xe9\xf6\xfa\x67\x4f\x5c\x22\x47\xfd\xf1\xf0\x62\xd4\xeb\x4f\xcf\x87\xc3\x93\xa7\x36\x3f\x9e\x0c\x47\x4f\xe2\xec\x9b\xe1\xc9\x9e\x56\x53\x3c\x5e\x93\xe1\xa8\xfb\x96\x91\x7d\x32\xe8\xfd\x3a\x1d\x3c\x49\x38\x26\x27\xe3\xe9\xe4\xdd\xc5\xe9\xeb\xf3\xd1\xa3\xec\x82\x04\xc3\xe4\xfd\xdb\x69\xef\x62\x3c\x19\x9e\x0a\x2b\x76\x3a\xea\x9f\x0f\xc7\x83\xc9\x70\xb4\xd7\xec\xd8\x81\x66\x3a\x7e\x3f\x38\xe7\x14\x7e\xe8\x8f\x06\x6f\xbe\x19\xda\x5e\x77\xda\xeb\x8f\x26\x83\x37\x83\xde\x9e\x1a\x85\x61\x7d\x37\x99\x9c\x33\x6b\xf7\xaf\x7b\xd3\xc3\x20\xc7\x4f\x03\x3d\x1b\x3e\x0d\x8e\x03\x45\x1d\xde\x17\x78\x70\x3e\x7d\xd3\x3d\x1d\x9c\xec\xd5\x6a\xce\x14\x18\x1e\xf7\xb9\x63\x2d\x26\xf7\x5e\x8b\x67\xb4\xee\x3e\x03\xc5\xf7\x90\xce\xf7\x90\xce\xf7\x90\xce\xf7\x90\xce\x9f\x11\xd2\xf9\xff\x5e\x24\x86\xb7\x31\xe5\x6d\x4c\xe5\x76\x8d\x59\x20\x94\xa7\xef\x7a\xcf\x00\x9d\xa6\xd4\xf6\x73\xd0\x64\x54\xe1\xde\x88\x18\x86\x8b\xb3\xf7\x67\xc3\x8f\x67\xd3\xf1\xa4\x3b\xb9\x18\x4f\x27\x83\xd3\xfe\xf0\x62\x53\x0f\x3e\x06\xd5\x9b\xee\xc9\xb8\xff\x5c\x44\xbb\x63\x49\xc5\xd0\x32\xe4\x05\x6f\x82\x7f\xc3\x3d\xaa\x27\x47\xbb\xbe\x07\x97\xfe\xe5\xc1\xa5\xee\xc7\xf1\x74\xd4\x7f\xbb\xe7\xca\xc6\xa0\x78\x04\xf2\x75\xf7\xa4\x7b\xd6\x63\xed\xf6\xde\xf5\x4f\xfb\xc2\x9d\x3e\xeb\xee\xe5\x2e\x31\x64\xdc\x98\xeb\xfe\xf6\x44\xb0\x3d\x97\x88\x14\xe0\x7e\x4b\xc3\xc7\xf1\xf4\xc3\x79\x6f\x4f\x8f\x8a\x41\x9d\x8f\x06\x1f\xba\x93\xfe\x74\x7c\xf1\xfa\xac\x3f\x79\x0a\x82\x8b\xd7\x27\x83\xde\xb7\x83\xdf\x7f\xc4\x36\xba\xf0\x04\x14\x79\x22\xf6\x1e\xfd\x4d\x22\x9e\xc4\xc0\x7d\xcd\xef\x74\xd3\x5c\x72\x9e\x84\x40\xf4\xfe\xe9\xf0\x79\x02\x9e\xcc\x80\xe7\x60\xd8\x20\x62\x7f\x1e\xe6\x89\xd8\x1b\xc3\xb8\xdf\xbb\x18\x0d\x26\xbf\x4e\xdf\x8e\x86\x17\xe7\x4c\x43\x4b\x05\x7d\xb2\x57\xfc\xb3\x00\xd5\xeb\xee\x78\xf2\x04\x55\x98\xc3\x92\xd6\xe3\xcf\x44\xf5\xec\x1e\x15\x9a\x5b\x0f\xa0\x18\x1c\xf7\xcf\x26\x0c\xc5\xa8\xff\x66\xfa\x7e\x70\xb6\xb7\xb6\xc9\x20\xd8\xd7\x66\x60\x08\xb2\xfe\xee\x70\x2c\x22\xe4\xdc\x16\xdf\x33\x4c\x1e\x2b\xfb\xe7\x20\x29\x76\xbf\xf7\xdd\xfa\xe3\x64\x7c\x33\xe0\xfd\xe6\xee\x26\xf8\xfe\xb3\x6e\xfc\x6e\xfa\xbe\xff\xeb\xde\xfc\x94\x73\x6a\xfa\x6e\x38\x9e\x4c\x85\x21\xbf\x97\x40\x7d\x8f\x27\x7e\x8f\x27\x7e\x0f\xe1\xfd\xfb\x84\xf0\x9e\x3b\x9f\xbf\x87\x00\xbf\x87\x00\xbf\x87\x00\x1f\x58\x6c\xbb\xa7\x83\x47\x79\x79\xff\xb6\x29\x5c\x3b\x62\x86\x8f\x82\xda\x19\x2e\x7c\x1c\x86\xdd\x91\xc2\x1d\x38\xf6\x08\x12\x3e\x80\xe5\x51\xf1\xc1\x1d\x38\x9e\x96\x08\x27\x3e\x01\xfa\xff\xa3\xb8\x60\x6a\x6e\xf0\x2f\x06\xc7\x3b\xf3\xdc\xc7\xf9\x1e\x57\xfc\x77\x8c\x2b\x72\x46\xf5\xcf\x3e\x0c\x46\xc3\xb3\xd3\xfe\x7e\x46\xca\x37\x00\x1e\x5f\xbc\x1e\xf7\x46\x83\x73\x6e\xaa\xec\x19\x2f\xe3\x08\x7a\x27\x83\xfe\xd9\xde\xa1\xb6\x34\xe8\xb8\xdf\x1b\xf5\x9f\x40\xfa\xc9\xb0\xd7\xdd\x3b\x0a\x21\x3a\x3d\x7e\x17\x85\x57\x98\xa7\xf6\xba\x51\x7b\x02\xf1\xdf\xc4\xd7\x15\xb8\x9e\xe5\xf1\x46\x42\x20\xac\xa1\x5e\xaf\x7f\xd2\x1f\x75\x27\xfd\xe3\x28\x75\x6b\x4f\x7b\x5f\xa0\xfb\x70\xd6\x9f\xec\xad\x3e\x0a\x91\xec\x1d\xd6\x48\x40\xf7\x8e\xfe\x15\x30\x46\x46\x40\x9f\x46\x45\x21\xaa\x6f\x48\x55\x36\x06\xf5\x44\xb9\x79\x16\x59\x69\x0c\xdf\x84\x9a\x3d\xf7\x26\xd2\x80\x7b\x5a\xaf\x19\xd0\xfd\xec\x56\xc1\x11\x11\x8d\x98\x74\xdf\x3e\x61\x65\xfd\x86\x81\xb7\x5d\xf8\x64\x86\x5a\xb7\x27\x7c\xb7\x67\x68\x97\xe7\x93\x98\x45\xf3\x4d\x28\xcb\x25\x2b\x77\x27\xdd\xe7\x12\x29\xd5\x20\xa7\x35\xc6\xf7\xc4\xbe\x7e\x43\x7a\xa2\xed\x80\x27\x1c\x44\x10\x78\xde\x8c\x86\x67\x93\xfe\xd9\x71\x8c\x69\xf0\x84\x09\x2a\x89\xc9\xc9\xda\xc5\xe4\xf5\xf0\xe2\xec\x78\xdf\x10\xfa\xc6\x70\x3f\x0b\xd1\x56\x9a\x92\x9e\x0f\xce\xf7\x8f\xe2\xa4\x25\xf7\x4f\xc6\x39\x38\x3e\xe9\x47\xae\xcb\x74\x70\xc6\x5c\xea\x8b\x49\xff\x09\xaa\x45\x84\x47\x9f\x62\x4f\x45\x81\xd5\xe7\xad\xda\x02\xcb\xd3\x16\x4c\x01\xfb\x6c\x9b\x52\xa0\x79\xdb\x3d\x39\xe9\xef\x17\xbc\x4e\x83\x73\x03\x6f\xfc\xee\x29\xb3\xed\x1b\x21\x18\xbf\xbf\x78\x2a\xe8\xe4\xdd\x60\x74\x3c\x3d\xef\x8e\x26\x4f\xee\xff\x53\x22\x2a\x02\x3c\xda\x95\x7a\xa2\x0c\xa4\xc1\xc7\xe7\x7b\x1e\x19\xf8\xbe\x8b\xf1\x7d\x17\xe3\xfb\x2e\xc6\xbf\xcf\x2e\xc6\xf7\x5d\x88\xef\xbb\x10\xdf\x77\x21\xbe\xef\x27\x7c\xdf\x4f\xd8\x29\x0d\xec\xdf\x5f\x52\x9f\x23\xbc\xdd\x75\x9d\x49\x40\xa1\x75\x25\xaf\x5e\xcb\x7d\x44\x59\xbc\x12\x5f\xb6\x8d\x3f\x4b\x98\xff\x8e\x56\x35\x5d\x37\xfa\xb6\x57\xe1\x2d\x5e\x45\x17\xa3\x50\xe3\x07\xbc\xf2\x1c\x6c\x61\x7a\x94\xfa\x1a\x56\x72\x73\x09\x1b\x03\x7e\x6d\x09\x28\x7c\x9d\x1a\x8b\xfc\xe5\x26\x37\x8f\xed\x75\xf2\xb9\xb4\xc7\xf6\xfb\xd7\x33\x4b\xab\x82\x5b\x50\x07\x95\x02\x74\xd5\x3d\x3b\x3b\xfc\xbc\xd6\x44\x47\x8b\x3e\x19\xfc\x86\xf8\xc3\x39\xeb\x6a\x3c\x49\xd3\x9d\xfc\xfc\x67\x77\xf2\x06\xd4\x0a\x3b\xb9\xf5\xaa\x9b\xbd\x39\x5a\xd8\xd9\x64\x97\x4b\x0f\xf9\x9d\xa8\x6f\x77\xdc\xe3\x12\xdd\xa0\x90\xda\x30\x43\x41\xe7\xd3\xe5\xc6\x5d\x24\x5e\xea\xea\xcc\xe8\x1e\x89\x1c\xd4\xd5\xa7\x8d\x9a\x06\x25\x27\xe4\x06\xf9\x3d\x18\x20\x4d\x7f\xc2\x7d\x95\xfb\x5d\x5b\x20\xe8\x29\xf1\x8e\x96\xb0\x3b\x27\xea\xe5\x65\x7c\x23\x40\x9a\xae\xb6\x9a\x7e\x52\x43\xf9\xcd\xc6\x9a\xf8\x64\xa3\x99\xf9\x64\x63\x6a\x9e\xf0\xaf\x80\x79\xf2\xa6\x44\xcb\xf1\xc7\xb3\xfe\xad\x07\x5d\x9b\x7f\xf5\x5e\x7c\x9a\x9d\x7f\xe9\xfd\x0d\xf1\x55\x10\xf3\x64\x6b\xe5\xe8\x8b\xf5\xb9\xea\xfb\x7f\xd3\x90\x7f\xa6\x0f\xa8\xca\xe4\x86\xc4\xdf\x36\xb5\x04\x57\x94\x1b\xec\x38\x6c\xd9\xe2\x5f\x08\x95\x5f\x0b\x65\x7c\x52\x56\xd0\x85\x0b\x7e\xbb\x47\x04\xc3\x3f\x37\x1a\xc4\xdf\x1a\xe5\x1f\x17\x95\x5f\x29\x15\xb7\x23\xf2\xca\x64\xce\xaf\xcb\x77\x08\xb4\x53\x9f\x18\xfd\xb8\x44\x6e\xfa\x13\xab\xf9\x2a\x40\x09\xc8\x0a\x45\xeb\xe9\x6a\x1d\xf0\xb5\x34\xde\x76\x9d\x89\xaf\xf0\xad\x03\x46\xc5\x90\x2e\x91\x1f\x28\xd0\x47\xd1\x7e\x65\x52\x23\xd3\x3d\x65\xb6\xa6\xca\xc6\x16\xa6\x42\x7c\x65\x06\xaf\x38\xf1\x94\x14\x40\x41\xd7\x56\x0a\x17\x74\x43\x79\x43\x7c\x85\x6b\xe2\x5b\xba\x86\x8e\xb2\x44\x8e\xa7\x10\x77\x63\x50\xad\xf8\x23\x82\x7f\x73\x37\xae\x0e\xcf\xcc\xf9\x6b\x8c\x6e\xd4\x44\x27\x7c\x7e\x9c\x4e\xc8\x5e\x88\x98\x9d\xe1\x34\x37\xef\x0a\x3e\x40\x78\x67\x03\xd7\x08\x16\x60\x6c\x0c\xcd\xb7\x60\x6c\x7c\xac\xda\x60\x6c\x9c\xd3\x7e\xea\xfb\x83\x9f\xa6\xee\x62\x49\x82\xf4\xe7\xef\x14\xc5\x28\x10\xf6\xe8\x0b\xdd\xe2\x2b\xc2\xed\x4a\xd9\xbb\x0d\x0b\x81\x73\x9d\x52\x8c\xd4\x43\xb4\xbc\xdd\x6f\x7c\xed\x8e\x7f\x1a\xd8\x83\x3e\x72\x69\xfa\xe3\xdf\xf9\x6a\xd8\xc5\x14\x43\x27\xf5\xe1\xf1\x47\xd1\xb0\x93\x26\xf1\x05\x66\x0a\x67\xfc\xc3\xcd\x1d\xb5\xac\x5e\x6e\xd2\xf7\x1f\x73\xc8\xfe\x3d\xab\x39\xfe\xb1\x45\x1f\xb9\x05\xcd\xdf\xcb\x4f\x9b\xf3\x6b\xaa\xda\x55\x1f\xad\x42\xc3\x86\xfe\x95\xa2\x28\xff\x0e\x83\xbc\x17\x2d\xdf\x60\xb0\xcd\x59\x05\x56\x2b\xdf\xa4\xd9\x47\x0f\x7a\x9d\x0d\xfa\x5f\x0a\xbe\x45\xfd\x61\xbb\xda\x35\xcd\x8d\x6f\xc9\x56\xf4\xdc\xfd\xe6\x66\x35\x7f\xeb\x85\xf8\x8a\xe9\xf4\x82\x7f\x4c\x36\xf9\xe8\xab\xb9\x71\x8b\x45\x3d\xba\xdf\xc2\x6c\xa4\x3e\x30\xab\x0c\xdc\x80\x42\xc7\x11\x1f\x91\xb6\xc8\xca\x73\x10\x45\x40\xb9\x23\x6b\xa9\xcf\x6e\x14\xcb\x21\x81\xf8\x0e\xf5\xcc\x27\x37\x4c\x9d\x3e\xf6\xfa\xf4\xb8\xdb\xef\x76\x74\xbb\xf9\x3f\xde\xed\x25\x0c\x94\x39\xc4\x0e\xb2\xe3\x4f\x6f\x07\x48\xf4\xd8\x21\x8b\x80\xaf\x6f\x2b\xe2\x23\x85\xad\xff\xbe\xf8\x12\xff\x9e\x03\xf0\x71\xc3\x32\xbc\x73\x6f\xb5\x8d\x7b\x52\xf0\x0a\xf1\x0b\xf8\x02\x8a\x3c\x15\x98\x87\x39\xfd\x9f\x79\x2f\xef\x6d\x8e\x7a\x55\xf8\x79\xde\xd7\xbf\x5c\xed\x32\x09\x01\xee\x50\x83\x4f\x1e\xe0\x16\xdd\xe4\x18\x5d\x8f\x38\xa6\x90\x22\x15\xb8\xc6\x02\xd1\x31\x45\x5e\x6f\xed\xb3\x79\xcf\x8b\x35\x9c\xbd\xca\x82\xdb\xcf\x69\xa3\xf8\xfd\xce\xeb\x1b\xe1\x2c\xeb\xa6\x5c\xf0\xc1\x70\xc8\xa2\xb4\x22\x2e\xa6\xcc\x8c\x11\x97\xfa\x77\x4f\x08\x1b\x06\x18\xdc\xb9\x96\xba\xcd\xdc\x15\x7d\xa8\x6c\x76\xc2\x21\x8b\x31\xf5\x11\x5c\xa9\x80\x18\x8e\xc5\x46\xd4\x04\xc8\x58\x05\x8b\xe0\x07\x3d\x4d\xed\x97\x6d\xd4\x0a\xb1\x6b\xe5\x38\x06\x1d\xe4\x53\x35\xc7\x26\x5e\xc8\x2f\x09\x4d\xb8\x03\xd4\xc9\x12\x15\x18\x48\x1b\xc6\xd4\x0d\xa6\x4b\x05\x32\x73\x35\x67\x62\x64\xbe\xf7\x2e\x3e\xe3\x9e\xb7\x21\xe8\x12\xd2\x0d\x84\xd2\x98\x61\x56\x03\xb2\x15\x7b\xed\x33\x6b\x2a\x31\xbe\xd2\x16\x1a\x65\x16\x57\xce\x4c\x13\x06\x18\x71\x0b\x8d\xb4\xdd\xa6\x5f\xe1\x0c\x91\xdf\xbd\x96\xcc\x0f\xd2\x5f\xbf\x96\x65\x71\x51\x23\xb9\x26\xa8\x12\x1b\xa5\x4d\xa0\x9e\x90\x45\xa0\xe6\x9d\xa3\x43\xf0\x1e\x54\xe5\xdd\x47\x19\xb1\x02\x15\x33\xdf\x7e\x6b\xb3\x2d\xb3\x5c\xd4\x98\x69\x82\x38\x86\x13\x7d\xa8\x79\xe3\xd3\xd5\x95\x1d\xa2\x5c\x05\xdb\xdc\x08\x50\xa9\x3c\xee\x83\xd5\x5b\xef\x5a\x4d\x0c\xb9\x8c\xe7\x01\x50\xc6\x5f\x4a\x0b\xf7\x9b\xc7\x0b\xf7\xb2\xa6\x82\x4a\x2d\x75\xfd\xc1\xc6\xa0\xcb\x6b\xc2\xb7\x4c\xd5\xda\xe3\xa6\x6a\xd4\x99\xea\xf6\x99\x5a\xcb\xce\x54\xe6\x7e\xfe\xfa\xc8\x4b\x03\x50\xee\xd6\x80\x1b\x34\x0b\x88\x75\x85\xe8\x18\xf9\xd7\xd8\x8a\x6f\x27\x4c\x8f\x57\x7c\x35\xa7\xb8\x62\x40\x56\x80\x0b\x34\x61\xea\x36\x2e\x59\xa1\x20\x80\x0b\xee\xd8\xca\x02\x46\x20\xbf\x04\x74\x61\xfc\x95\x5f\x1c\x14\x5d\x55\xb0\xe6\xfa\x73\x1d\x74\xee\x57\xc1\xa2\xad\xaa\x20\xe0\x8f\xec\x97\xb5\xf6\xcf\x97\x30\x40\xec\xf7\x1c\xbb\x38\x58\x22\xbb\x47\xd6\x2e\x6d\x97\x01\x25\x14\x3a\xf2\x41\xde\x4f\xd0\x3d\x3f\x9f\x8e\x86\x17\x93\xfe\xb8\x63\x19\xbf\x48\xd2\x18\x3c\x27\xe3\xb1\xf7\x1f\xa0\xe8\xf6\x40\xd6\x43\xf4\xc8\x2b\x10\xc4\xad\x8f\x2e\xa6\x1f\xd1\x6c\xcc\xc7\x50\xd3\x77\xb6\xf8\x7a\xd4\x3d\x3b\x1e\x9c\xbd\xdd\x6c\x36\x19\xcc\xb8\x71\x63\xe6\x8b\x8b\xb8\xc5\x75\xe8\x20\x1d\x0b\xc8\x5e\x4b\x9e\x82\x29\x7c\x5f\xd0\x0d\x4e\x26\xf4\xbc\x63\x48\xa1\x64\x3c\x5b\xc8\xce\x53\x4c\xd7\x74\xc3\xc3\x1e\xd2\xb4\x32\x58\x1a\x23\x5d\xdb\xc0\xa1\xa7\x7a\xc7\x3a\x82\x0e\x0e\x90\x81\x5d\xcb\x59\xdb\x28\xd0\xe2\xef\x66\xea\xaf\x0a\xe4\xe9\x7a\x2c\x3f\xaa\x99\x03\x82\x37\x41\x31\x40\xf7\xe3\x78\xb3\x32\x4f\x48\x2e\xae\x2e\x72\x95\x73\x00\xf2\xf3\xdb\x7a\x14\x59\xc9\xc2\x1c\xcb\xb7\xa1\x1e\xe6\x98\x7a\x5f\x38\x53\x0c\x8b\xb8\x2e\xbf\xae\x33\x37\x10\xd1\x0d\xa6\x51\x1b\x16\x0a\x02\x7e\xed\x66\xea\x63\xe0\xc8\xb0\x21\x85\xba\x7e\x44\x23\x62\xf8\x64\x31\x5c\x74\x4b\x35\xaa\x67\x27\x94\xb8\x9a\x95\xea\x7a\xa8\xa7\xef\xbc\x8c\xa5\x67\x83\xb2\x00\xb9\xf6\xa9\x00\xe6\xda\x23\x50\xf5\x10\x98\xe5\xf2\x96\x39\x6f\x04\x88\x0e\xdd\x1e\xb3\x69\x39\x52\x35\x58\x5b\x8c\xe8\xf9\xda\x51\x5f\x74\x3a\xd9\x29\x6b\x88\xa9\x7a\x70\xa0\x0a\xfb\x70\x47\x8d\xc2\xfb\x39\x73\x63\x1b\x82\x3a\xaa\xb2\x31\xb7\x88\x7b\x8d\x7c\x7a\x42\x16\x5c\xfa\xe2\xab\x9a\xd5\xfe\x68\x34\x1c\xa9\x9d\x4e\x07\x7d\xfd\xaa\xbe\xe9\x4e\xba\x27\xfc\xe1\x15\x7b\xa1\xb6\x55\x19\x02\x17\x65\xfc\xea\x2f\x14\xa6\x07\x3d\x41\xe4\x90\x05\xaf\x65\xd0\x3b\x0f\xbd\xd2\x72\x44\x47\x7a\xa7\x23\x58\xc3\x9e\x99\x41\xc7\xcb\xbe\x7e\xdd\x52\x19\xdc\x4b\x1e\xb5\x25\x94\x7c\x34\x02\x07\x5b\x48\x63\xcb\x2c\x0f\xa3\xc9\xfb\x51\xb3\x3d\x14\x10\x8e\x78\xd4\x01\xb3\x64\x03\x0a\x57\x5e\x31\x2e\x93\xad\xc1\xa1\xde\xce\xd3\xbd\x0a\x16\x9d\x2c\x00\x28\x64\x47\x54\x49\x3c\x65\x14\xa5\x7c\xc3\xb5\x2b\xef\x56\xf0\xf5\xeb\xa7\x4b\x50\x30\x10\x07\x07\x29\xb8\xe4\xa2\xe1\x3d\x86\x32\x26\x2e\x2e\x19\xd8\xb7\x9d\x34\x56\x6e\x7c\x0f\xe7\xdb\x90\xea\x3a\x48\xcb\x67\x67\x8b\xf4\x6d\xf0\x37\xb3\x96\xe4\x61\x92\x85\xe5\x61\xfa\xe4\x75\x72\xed\x87\xe5\x7f\x37\x09\xa7\x90\x2e\x8d\x15\xbc\xd5\xca\x60\x93\x01\x0f\x8f\x42\x7e\x29\x4d\xf5\xa1\x80\xa1\xaf\x0a\x9a\x10\x1d\x69\x97\xf9\x0d\x7a\x7a\x58\xe4\xc8\xc4\x93\x47\x41\xa9\x81\x4e\x0f\x4d\xa2\x07\xb6\x72\x42\x45\xbe\x4f\x7c\xb5\x8d\xfe\xaf\x22\x04\x5f\xbf\x3e\x8a\x9d\x51\x25\xb5\xbd\x8d\x92\x57\xaa\x2c\x50\xdb\xaa\x4b\x68\x29\xa0\xd0\xa7\xc8\x56\x45\xc7\x18\x92\xd4\x4e\x54\x7c\x0f\x93\xea\xaf\x5d\x17\xbb\x8b\xed\x2d\xff\x7e\x9c\x89\xca\x32\x07\xe0\x87\xdc\xaa\x1d\x46\x25\xc5\xeb\x6f\xec\x94\x50\x12\x83\xa6\x96\x9e\x50\xc1\x01\x73\x2d\x3c\x9f\x2c\x7c\x14\x04\xc6\xef\xed\x47\x0d\xc9\xbf\x86\xb0\x84\x12\x46\xd7\x43\xbc\xfe\x17\xd0\x94\x0a\x4d\xfc\xde\xbe\x26\xd8\x56\xca\x4f\xbd\xb5\xb9\x6b\xe0\x3d\xee\x6c\xa6\x57\x8b\xd2\x15\xb6\xae\xb8\x60\x95\xd6\xb8\x24\x3c\xc6\x52\xc4\xb7\x5d\xd7\x54\xd5\xc5\x9e\x47\x2b\xda\xf3\x48\xdd\x07\x26\x6e\x6d\x8e\xa7\xd9\x0f\x0e\xb1\xa0\x83\xbf\xa0\xdf\xdb\x02\x7f\x2c\x17\x0a\x1b\x42\xe5\x06\x39\x16\x59\x21\x85\x5b\x85\xff\xfc\xfb\x3f\xea\x4d\xb3\x69\xd6\x51\x19\xb6\x5a\xa6\x0d\x91\x0d\x2b\xcd\xf2\xa1\xdd\x9a\xd5\x0e\xed\xc3\x6a\x0b\xd6\x1a\x35\x38\x9b\x97\xeb\xb5\x7f\xfe\xfd\x1f\x8d\x7a\xbd\x69\x9a\xe6\xe1\xe1\x61\xbd\x5c\x69\x9a\xcd\x4a\xab\xd5\x16\xfc\x62\xfe\xef\x0f\xf7\xea\xdf\xd6\xf3\xf9\xdc\x2e\x8b\x3f\x6a\xd8\xe6\xdf\xdd\x39\x1f\x9e\xf0\x83\x23\x6d\x85\xb8\x49\x25\xb3\xb8\xd2\xd4\x6c\xff\x0e\x3e\x25\x97\x41\x73\xbf\x5f\x11\xde\x7f\x34\x83\x41\x74\x05\x97\x88\x14\xe4\xae\xed\xdd\x84\xb3\xa1\x2b\xee\xd7\xda\x0a\xf6\xd0\x95\x5f\xe2\x16\x2f\x74\xcd\x2f\x2e\x32\xd5\x4b\x80\x32\x30\x40\x5d\xd1\x52\xa5\xbc\x09\x9b\x3c\xdc\x3a\xa5\xaa\xbc\x60\xcb\x72\xfc\x13\x7e\x4f\xce\xb6\x9d\x25\x90\xbe\x0b\x3b\xc2\xa5\xa4\x30\xb5\x38\xf1\x52\x54\x26\x64\xb1\x10\xf7\x8e\xe5\xfa\x67\xc6\xbf\xd4\xec\xf8\xc9\x8b\x9e\xe3\x88\xca\x66\x89\x0a\x54\x36\x1f\xb1\x95\x7d\x63\xe5\xf6\xd6\x32\xb7\x33\xc7\xb7\x95\x65\xea\x67\x10\x50\x74\x4b\x1f\x43\xa8\x64\x58\x3c\x5c\x22\x56\xb6\x7b\x74\x5b\xd1\x06\xde\x04\xce\x4e\xc4\xad\x78\x72\x7c\xf9\x95\x67\x5d\xbe\xef\x22\x51\x66\x7c\x7b\x7e\xa1\xf6\x12\xad\x18\x41\x36\xf4\xaf\xf8\xbd\xcd\x89\xc7\xbc\xc1\xfe\x8a\x7a\x79\x19\x3e\xb4\xf7\xf7\xeb\x99\xa5\x95\xc1\x07\xd0\x04\x99\x1d\x40\x7e\x07\x31\x78\x97\x2a\x36\xf3\x71\xd9\x4a\x3e\x2c\x5b\x4d\x45\x78\x96\x15\x79\xf7\xd8\xf8\xf8\x5a\xab\x6f\x5e\xab\xdc\x10\x30\x71\x5c\x67\x57\x34\x64\xe3\x1a\x66\x19\xc5\xe1\x05\xcd\x74\x0c\x27\x1d\x26\x95\xf7\x39\xca\xcb\x94\x3f\x8a\x7d\x32\x77\xc1\xa3\x34\x10\xbb\x6c\x9a\xb5\x8a\x5a\xe3\x00\x15\xf0\x05\x98\x35\x10\x07\xa5\x93\x31\xa9\x82\x37\xa0\x0e\xaa\x99\x17\x99\x0b\xd3\x6a\xa0\xe8\x5e\xbf\xcd\xab\x9b\x07\x73\x75\xc3\xbc\xdb\x58\x65\x8a\x36\xe6\x39\x60\x6a\x75\xda\x0a\xc4\xc7\xdf\xfb\xe5\x83\x46\x93\x25\x49\x67\x0f\xe9\x00\x11\xc3\x4b\x27\x5a\xbd\x30\xa9\x83\x1a\xc5\x16\x45\x3a\x67\xa0\x9a\x8e\x15\x4b\x75\x01\xd4\xe8\x96\xaa\x5d\xa9\x05\x54\xda\x99\x9b\x55\xb2\x0a\x03\xa8\x49\x7c\x31\x0a\xa6\x19\xd9\xa0\x5a\xb0\xf6\x3c\x22\x63\xb1\xbb\x51\xbd\x78\x3c\xae\x8d\x6b\x90\xf9\x55\xc7\x0b\xe8\x89\xcd\xd0\x9e\x71\x05\xee\xe4\xc5\x6c\x63\x63\xd0\xfa\x02\xc6\x46\xd7\x39\x07\x63\x03\x1d\x56\xc0\xd8\x98\x0c\x56\x60\x6c\xf4\xee\x3e\x32\xa0\xf7\x03\x30\x36\x6c\x07\x8c\x8d\x71\x8d\x01\x0d\x3e\xff\x00\xc6\xc6\x2f\x41\x13\x8c\x0d\x0a\x59\xc5\x8b\xab\x2e\x78\x0b\x7c\x63\x7d\x09\x3c\xec\xc9\x06\xaf\x53\xf7\x29\xff\xf7\x0a\xd9\x18\x2a\xda\x0a\xde\xca\xdb\xce\x94\x66\xe3\xd0\xbb\xd5\xef\x0d\xbc\x82\x0b\x94\x48\x76\xd1\xb5\x61\xf2\xb2\xdd\x4a\xb9\x5c\x74\x3b\x6e\x18\xee\xc0\xee\x88\xe8\x4c\x89\xb7\x52\x78\xa1\x19\xaf\x5f\xe5\xa8\xd3\xed\x84\xa1\x21\x17\x1e\x63\x05\xb1\xcb\x7e\x14\xde\xd8\x8c\xdd\x92\x04\xab\x95\xb7\xee\x06\xa7\x42\x8d\x8a\x11\x77\x35\xea\x97\x05\x1d\x4b\x33\xcb\xe5\xeb\xa5\x52\x52\xaa\x8d\xb2\x77\xab\x1f\xc9\x7d\x66\x4a\xbc\x76\xcd\xbb\x3d\x4a\x35\x53\x6f\x6e\x6d\xc6\x70\xe1\x75\x6e\x87\xba\xba\xb3\xb2\xbc\x8a\x3a\xba\xcb\x7a\x73\x83\x34\x34\x02\x4f\x5c\x85\xb7\x93\x41\x59\x6a\x43\x23\xb2\x85\x4a\x36\xbe\xde\x75\x59\xaf\xb8\xcc\x4d\xec\x46\x46\x5d\xe6\xdb\x90\x26\xbf\xf3\x37\xad\x12\x33\x0f\xa5\x68\x8a\x6e\x63\x89\xe0\x6a\x8b\xef\x20\x4b\x36\x16\xdf\x72\xb7\xac\x3d\xd0\x9f\x72\xfa\x66\xde\x6b\xe8\x2b\x3f\x77\xb0\x76\x58\x35\x2b\x4d\x1d\xfc\xd2\xc1\x5a\xb5\xd1\x6c\xe9\xf2\x3a\xd7\x3f\x3a\x9f\xee\x3d\x48\x97\x3c\x40\x4a\x56\x1e\x71\x91\x4b\xdb\x10\x44\xbb\xaf\xed\xa2\xd7\xfd\x10\xc8\xd2\x1b\xfc\x05\xfa\xb6\x0a\x1c\x02\xed\x5e\x04\xa2\xe9\x9d\x9f\xce\x7d\xb2\xc2\x01\x32\xa0\xe3\x68\x9f\xb0\x81\xb4\x66\xad\xa2\x03\xf6\xa3\x51\x37\xf5\x4b\xdd\xa0\x4b\xe4\x6a\xd8\x98\x61\xd7\xd6\x30\xa8\x35\x59\xb1\x2c\x45\x9d\x9f\x90\xf1\x91\x63\x3e\x25\xf6\xda\x41\x7a\xdc\x1e\xbc\x09\x5e\x3e\xa1\x4d\xb3\x59\x17\x3f\x5a\x66\x73\xb3\xf1\x56\x9d\x15\xa7\x1b\xef\xde\x04\x5b\xda\xff\xb2\xf6\xd1\xb3\x28\xa8\xb6\x36\x09\x38\x6c\x95\xab\xad\x2c\x01\xac\x9d\x62\x12\x44\xac\xf1\x29\x34\x34\x6a\xb5\x82\xce\xd7\x58\x71\xba\x6d\x11\xae\xdc\xd2\x78\xce\x31\x49\x09\xc5\xaf\x71\x25\x19\xa0\x2d\xdd\x60\xba\x2c\x5d\xad\x67\xc8\x77\x11\x45\x99\xca\xc5\x5b\x0a\x3f\x1b\x83\x9d\x5b\x0a\x3e\x59\x53\xe4\x47\x1b\x09\x45\x01\xfa\x25\x0c\x26\x57\x8b\x73\x67\x1d\x74\x5e\x98\x61\x40\x89\x8f\x2e\x02\xe4\xf3\x78\x9d\x7e\x9f\x8e\xb1\xef\x0a\xa7\x47\x97\x0a\x7c\xe8\xf1\xeb\x32\xfa\x67\x13\x7e\x96\x24\x15\x56\xbf\xb6\xde\x91\x80\x3e\x10\xd0\x87\xd7\x78\x21\x63\x1d\x29\xf2\x8d\xb8\xfc\x13\xba\xd4\x43\x07\xae\x5d\x6b\xf9\x41\x0c\xd9\x47\xcb\xd3\xf4\xfb\x1b\xec\xda\xe4\xc6\x20\x1e\x72\xb5\xdf\x97\x94\x7a\x41\xfb\xe5\xcb\x1f\xd2\x0d\x87\x2f\xd7\xf8\x25\xf4\xbc\x97\xd1\x26\x61\x89\xd9\x9c\x73\xe2\xaf\x5e\xfe\x0e\xd4\xe9\xcc\x81\xee\x95\xaa\x87\x3e\xca\x62\xe7\x2c\xfd\x96\x0d\x3c\xd1\x3b\x0e\x8c\x37\xe5\xe7\xb8\xc7\x37\x96\x57\xf2\x91\x30\x16\x76\xf8\xc6\xd5\x8a\xf0\x8d\x6b\xdb\x7c\x63\x40\x0b\xbd\x63\x31\xb5\x62\x3f\xd8\xac\xd9\x10\xcd\xec\x46\xbd\x61\xcd\xe7\xe5\x99\xdd\x68\xa0\x5a\xbd\x62\xd7\x6d\x34\xab\xce\x66\xb5\xb2\x5d\x9b\x35\xea\x0d\x34\x67\x2e\x73\xab\x5a\x69\x55\x1b\xd5\x7a\xb9\x52\xab\x36\xeb\xcd\x7a\xa3\xd6\x8e\x1d\xdb\xff\xa8\xc7\x9e\xed\x78\xd2\x1d\x4d\xa6\x93\xee\xdb\xe9\xf1\xe0\x43\x52\xe3\x65\xaa\x4a\xef\x64\x38\xee\xc7\x55\x14\xb9\xaf\x21\x76\xac\x27\xd0\xfd\xb2\x56\xfa\xee\x35\xf6\x89\xcb\x23\x22\xc7\x88\x22\x8b\x22\x5b\xf9\x1d\xd0\x74\x57\xe4\x54\x14\x60\x57\x87\x81\x62\x47\x15\xb9\xcb\x2f\x17\x91\x7f\xfe\xfd\x1f\x87\x55\xd4\x84\xb5\xb9\x09\x0f\x0f\xcd\x06\xb4\xca\x10\xcd\x61\x15\xce\x2b\x76\xbd\x5e\xb6\xad\x66\xb9\x59\x85\x68\x36\xb7\xd9\x78\xd4\xea\xad\x46\xbd\xda\xac\x1e\xb6\xca\x15\xb3\x55\x31\x0f\x1b\x66\x5b\xf9\x95\xac\x95\x25\xbc\xe6\x28\x5d\xd1\x02\x25\x0a\x8c\xe9\x6e\x2a\x28\x45\xee\xcd\x12\x5b\x4b\xc5\x22\x6b\xc7\x56\x66\x48\x41\x2e\x1f\x6b\x91\xdc\x58\xd0\x53\xe8\xda\xf2\xd7\xfb\x58\x9b\x28\x6f\x7d\x6c\x2b\xd1\x3e\x83\xf2\xfa\x4e\xde\x06\x5f\x00\x1e\xe5\xd7\x70\x4e\x27\x24\x45\xe1\x20\x9e\x65\x08\x95\x48\xc0\x39\x11\x32\x76\x97\x6e\x2f\x9a\x09\x3c\xa2\x66\x23\x1b\x5b\x7c\xc7\xdf\x47\x01\x59\xfb\x16\x52\x3c\x42\x9c\xc0\x50\x86\xae\xc5\x3a\x04\x67\xac\x3f\xa4\xa0\x3d\x50\x44\xa2\xc8\x1f\x08\x14\x98\x6e\x91\x71\xc7\x27\x0e\xa3\xcc\x45\x8a\x10\x77\xe7\x2e\xca\x15\x58\xde\x79\xac\xf3\x01\xf1\x15\x07\xde\x21\xdf\xe0\x3c\x88\x33\x0b\xfc\xb5\x9b\xc7\xc5\x6d\xa1\x40\x99\xdd\xc9\x8c\x84\xf4\x70\x9d\x13\x3b\x00\x0a\xf1\xe3\xc1\x12\x14\x29\x6b\x2f\xe0\xee\x6e\x06\x57\x94\x90\x40\x97\x3e\x59\x2f\x96\x9c\x9c\x0f\xa7\x37\xd0\x47\xa2\x3b\xff\xfc\xbf\xff\x9f\x3c\xa7\x58\x91\x64\x96\xb8\xfb\x7e\xed\xb2\xa6\x7c\x05\x7a\x9e\xc3\x86\x12\x13\x97\x8d\x6c\x80\x6d\x9e\x0c\x14\xa0\x54\x72\xea\x4e\xde\x2b\x38\x10\xf7\xf6\xfb\x68\x8e\x7c\x1f\xd9\xca\x0d\xbc\x13\x77\x43\xbb\xc1\x7a\x85\xb6\x40\x13\x37\xee\x7b\x4a\x32\x03\xe3\x7f\xfd\x0e\x3e\xe5\x42\x38\xb3\xc2\x10\x4e\x3a\xce\x01\x7d\x51\xd5\xc6\xbe\x1a\x5f\x9d\x2e\xef\x66\xaf\x96\x93\x00\x53\x94\xf4\xa0\x46\x79\x74\x2a\x50\xcb\x1c\x1e\x43\x99\x90\x0e\xd4\x19\xe4\x19\xa5\x40\xc5\x51\xf6\x02\x2f\x92\x57\xfa\xf3\xc0\x07\xb6\xae\xe2\x58\x53\xb4\xda\xf2\x20\x0c\x6f\x2c\x75\x0d\x3c\x23\x93\xf2\x6a\x33\xea\x8a\x6b\xda\x4b\x9e\x8f\x57\xd0\xbf\x53\x99\x83\xce\x8d\x4e\x15\xa8\x0d\xe6\x08\x70\xcf\x4f\xba\x23\x49\x59\xaa\xc1\x4f\x2a\xbd\x4b\xe2\x3a\x33\x72\x2b\x22\x2d\xb1\xb3\xa7\x02\x71\x70\x03\xa8\x84\x7b\xae\x01\x87\x76\x17\xa7\xc4\xe6\x3d\x93\xbf\x7a\x4b\xe8\x2e\xa2\xb0\xcd\x73\xe8\xb2\x71\xc0\xe7\x99\x9a\x26\x71\xe9\x23\xe6\xb1\x47\xcb\x9a\x4d\xac\xc0\xb8\x5e\x31\xe1\x34\x2c\xb2\x7a\x89\xdc\x97\x42\x54\x4b\x5c\x2e\x4a\x89\x5c\x94\x98\x5c\xbc\xe4\x6c\x31\x96\x74\xc5\xef\xb9\x87\xfe\x02\x31\x5e\xca\x15\x2f\xcd\x73\x8f\x78\x25\x19\xab\x7b\x7c\x9b\x52\xe4\x5e\x36\x8d\xf2\x4b\x51\xa1\xb4\xc5\x5a\x7a\xf9\xf6\x62\x70\x5c\xea\x99\x8d\x6a\xad\x55\xee\x95\x5e\xf7\xcb\xd5\x52\xed\xf8\x4d\xbf\x74\xd8\x2d\x57\x4b\xf5\xaa\xd9\x38\xae\x56\x6a\xf5\x66\xa3\xbe\x95\xd8\x87\xa3\x51\x8f\xbe\x5d\x3f\xc9\xfa\xe3\x01\x8b\x33\x9b\xc7\x1f\xd8\x90\x83\xd4\xa2\x2a\x17\x53\x9a\x98\x38\x34\x65\xa5\x19\x27\x22\x49\x41\x0f\xf3\xd1\xa6\x2a\x0f\x60\xb1\x27\xfa\xee\xa3\x56\x4b\x2e\xa6\xaf\x4b\x52\x78\x68\xe5\x6c\xea\xed\xbc\x76\x5e\xc6\xb9\xc4\xcd\xfc\xe3\xe3\x6b\xad\xb9\x19\x07\x3b\x8c\xde\xcb\x98\x56\x34\x21\x1b\x8f\xe9\xd5\xa6\xa9\x16\xc6\xb9\x4b\x65\xa0\x2a\x3d\x99\x34\x86\x8a\x34\xfc\xd6\xfc\x2c\xd3\x8c\x68\xe2\x88\x36\x4e\x19\x99\xd5\x24\x76\xc7\x9f\xa3\x84\x2e\x3e\xeb\x52\xf1\x35\x3d\x75\xbd\x7f\xaa\x42\x14\x97\x8d\x5f\x37\x80\xca\xcf\x54\xc8\x60\x1e\xef\x75\x76\x66\x26\xbd\x47\xa9\xee\xa7\x6c\x6b\xb4\xc1\x42\xb3\x09\xd4\xec\x89\x1a\xf3\x10\xa8\x03\x61\x13\x40\x45\x9a\xc5\xe2\xac\x16\x25\x5b\x74\x32\xc3\xfd\x70\xa6\x67\xd4\x62\x8a\x7d\x87\x8f\x61\xdf\x16\x6b\x38\xe6\x61\xa5\x9c\x6f\xa2\x92\x61\x4d\xa5\x02\x54\xe5\x8c\x50\x25\x60\x2c\x96\x7b\x50\x36\x9e\xcf\x91\x8f\xd8\xa2\x3f\x43\xf4\x06\x21\x57\x99\xbc\x7f\xab\xac\xd6\x0e\xc5\x96\x43\xd6\xb6\x30\x5e\xde\xbf\x8d\x96\xab\x57\xca\x09\x82\xbe\x2b\x72\x5c\x93\x64\xc6\x2a\x50\xa1\x8c\x90\xf2\xb6\x6a\x40\xe5\xe7\x13\x64\x62\x1f\x9b\x0c\x95\x7a\x26\xfb\x76\x23\x14\x5a\x69\x00\x75\xe6\x27\xe4\x36\x81\xaa\x1c\x13\x6b\xcd\xd6\x35\x91\x55\xb8\xcb\xbc\x4a\x28\x8c\x92\x18\xe7\x64\xed\xda\x29\x12\x0f\x39\x89\x22\x73\x9a\x37\xd0\x8a\x68\x8c\x49\xac\x96\x77\x93\x58\x35\x63\x12\x0b\x0e\x4b\x98\xa9\x60\x68\xb2\x7b\x04\x15\x97\xb8\x25\xec\x52\xb4\xf0\xb9\xc5\x55\x2c\x3b\xa9\x83\x15\xd9\x7d\x3f\xa0\xc6\x96\x5e\x6a\xcd\x6f\x2a\x3e\xfa\xbc\xc6\x3e\xb7\xb9\x1e\x2f\x9d\x86\x3c\x2f\x12\xc7\x7b\x65\x88\x55\xae\x70\xe9\x49\xb2\x19\xb0\x4d\x96\xab\x17\x26\x8f\x24\x6f\x56\x36\xf3\x23\xf0\xcc\xce\xf3\x20\x74\x0f\x06\x88\xa9\x27\x51\x81\xf5\x60\xe3\xc8\x89\x08\xaa\xfe\x3a\xad\x81\xb1\x71\xde\x5f\x82\x5f\x8c\x8f\x0e\x18\x1b\xef\xdf\xf7\xc0\x2f\xc6\xcf\x3f\x83\x5f\x8c\xa1\x0b\xc6\xc6\xe9\xe2\x7d\x2a\x42\xea\x19\xab\x65\xad\x5c\x7e\x54\x8c\x31\x92\x0a\x23\x36\x65\x76\x04\xb1\x7c\x0e\xd8\xf0\x6e\x8f\xac\xb5\x1f\x10\xbf\xed\x11\x36\x04\xfe\x91\x47\x02\xcc\x98\xd4\x66\x73\x99\x11\x7f\x44\x89\xc7\x23\x6f\x47\x73\x87\x40\xda\x66\xa6\x57\xb8\xac\xec\x11\x20\x8b\xa3\x16\xd8\xb5\xc8\xca\x83\x14\xcf\x98\x2d\xb3\x25\x54\x91\x3b\x7c\xf7\xe7\x9d\x87\xdb\xf0\x79\x33\xe4\x5d\x5e\x66\x4f\xbc\x95\xf7\xf4\x70\x1f\x70\x0b\x23\xcf\x17\xce\xac\x56\x7d\x56\x6d\x9a\xd5\x06\xb2\xad\x59\x79\x3e\x6f\x5a\xf3\xfa\x1c\xd9\x87\xd5\x0a\x84\x33\x64\x55\x1b\x76\x73\x76\x38\xfb\xe7\xdf\xff\xd1\xa8\x9a\x66\xb5\xda\x6c\x34\xeb\xf5\x7a\xb5\xda\x6a\x1e\xb6\xea\x6d\xe5\x63\xb4\xa3\x2c\x4e\x71\x15\xcb\xae\x3c\x1d\x80\xfc\xff\xb5\xc5\x77\xbd\x46\x7e\xc0\x26\x66\x7a\x04\xf2\xee\xeb\xbc\x6e\xa1\x79\xab\x56\xab\xcc\xa0\x65\x9b\xad\x79\xcd\x34\xeb\x87\x8d\xda\xcc\xaa\xcd\xcd\xfa\x61\xd5\xb2\x5a\x2d\xcb\xb4\xb9\xfb\x5a\xad\x57\x9a\xad\x6a\xe3\xb0\x5a\x69\x94\x6b\xcd\x72\xab\x5a\x3d\x6c\xf3\x04\xef\x15\x76\xf1\x6a\xbd\x8a\x55\x44\xd4\xae\xdc\xa0\x10\x67\xd8\x8a\xfb\x80\x83\x18\xaa\x61\x34\xd7\xd5\xf8\x68\xc3\xda\x5b\xf8\xd0\x4e\x0c\x02\xa6\x6a\xa9\x7f\xa7\xc0\x05\xc4\x2e\xf7\x35\x84\x11\xcf\x27\x12\xb3\xd5\x1f\x6d\xb3\x49\x83\x89\xd9\x39\x26\xd8\x5c\xb9\xd8\xc2\x25\x2c\x38\x56\xa3\x0a\x12\xb3\x42\x0f\x9f\x36\x83\x53\x53\xe6\x32\xbc\x3c\x62\xe2\xf5\xd7\xdc\xc9\xd4\xa7\xcf\x86\x15\xb1\x3b\xc4\x20\xdd\xd7\xd1\x6c\x60\x6d\xc9\x77\xd8\xfd\xa3\x43\x0c\xeb\xe7\xb1\x76\x2f\x0e\x36\xb1\x09\x12\x18\xaf\xbf\x18\x73\xe2\xf3\xd0\xa7\xf6\x87\x7e\x09\x58\x49\x36\xec\xfd\x43\x07\x6b\xb5\x5a\xad\xd1\xd0\x39\xb5\x08\xfd\xcf\x91\xeb\x1a\xe8\x0b\xf8\x2b\xf0\x8d\xf7\xe0\x07\x63\x75\x99\xd2\x3e\xad\x5a\xab\x5c\xcf\xb0\x1a\x60\xfd\x1e\x1b\xb6\x46\xc1\xbd\xdb\xde\x34\x64\xdc\x30\xd4\x8f\x44\x17\xdc\x7b\xb1\x19\x2f\x26\x2c\x3f\xa4\x9b\x18\x6c\xee\xda\x71\x78\x6a\x63\x99\xa7\x26\x8a\x9c\xac\x57\xaa\xda\x46\x86\x8f\x3c\x07\x5a\x48\x7b\xa9\xfd\xef\xaf\x7f\x0b\xf4\xbf\x8d\x5f\x2e\x8a\x4c\x3e\x64\x50\x72\xc1\x6c\x47\x71\xfc\x37\xd4\x43\xd9\xdc\x9c\xf8\xab\x8f\x98\x2e\x87\xe2\xe4\x25\x0a\x84\x84\xc6\x96\x56\xea\x14\xe2\xc1\x81\x96\x39\xaa\xde\xc9\xbc\xd5\xf9\xba\x05\xbf\x7c\xe1\xd5\xf8\xaf\x8e\x2c\x61\x03\x14\x86\x80\x6f\x5b\x6c\x1b\x9e\x41\xc1\xf0\x4c\xd9\xf0\x30\xee\xbb\x1d\xac\x1d\x36\xeb\x66\x4b\x07\x3e\x13\x84\x46\xf3\xb0\xa2\x83\xa0\x83\xb5\x66\xd9\x6c\x30\xd3\xb7\x83\xb5\x4a\xb5\x5e\xd7\x01\x64\x85\x35\x5e\x68\x75\xb0\xc6\x59\xa2\x03\x87\x95\xb6\xea\xcc\x2a\xf1\x3a\x58\x33\x6b\xe5\x5a\x4b\x07\x36\x43\x7b\xd8\x62\xc6\xe2\x84\xb7\xd0\xaa\xd6\x75\xb0\x66\x15\xca\x8d\x6a\x4b\x88\xda\x74\x4b\xce\x3c\xcc\xe5\xcc\x47\xf1\x6d\xc3\x30\xa0\xbf\xe0\x96\x5a\x20\x63\xdd\xc8\xe6\x2b\x5d\x27\x30\xce\x17\xc6\xa4\xd7\x17\xa5\xd7\xd0\xc1\x36\xa4\xc4\xef\xbb\xeb\x55\x67\x62\x5c\xff\x26\x6b\xfb\x3e\xf1\xcf\x08\xc5\x73\x19\x4b\x49\x65\xd6\x6f\x98\x05\xe9\xd7\xd8\x7b\x03\x57\xd8\xb9\xeb\x38\xc6\x39\x36\x06\xe7\xd7\x35\x51\xfe\x79\x8d\x11\x75\xee\x3a\xf7\xc4\x75\xee\xc6\xc8\x99\xb7\x5f\x94\x01\x5a\x61\xda\xbf\x66\x8b\xe2\x0b\x33\x0c\xed\x3b\x17\xae\xb0\x55\x94\xfb\xc6\x85\x2f\x0c\x44\xde\xdf\x08\x2d\x70\x40\x7d\xe8\xd2\x28\x6d\x96\xb7\xc0\x84\xe8\x0c\xae\x50\x07\x19\x01\x45\x1e\x88\x0b\xdf\xfa\x64\xed\x75\x50\xf2\x5b\xe6\x16\x73\x7b\x5d\x42\x88\x07\xd9\x77\x46\xd1\x1b\xec\xa0\xc1\x4a\xe8\xe9\x0e\xda\x2c\x2b\xac\xda\x67\xa3\xb6\x59\x9b\x17\x87\x3e\x27\x1b\xf9\xc7\xe2\x08\x73\xee\xf5\x3b\xe8\xda\x0e\xe2\x5b\x14\x64\xcb\x4e\x02\x4a\x25\xff\x73\xcf\x90\xa1\xc8\xf0\xe8\xde\x4d\x3d\xf1\x73\xed\x9e\xf1\x87\xc1\xd3\x92\x41\x92\xfe\x1b\x6d\x31\x84\x9b\x67\x04\x16\x88\xbe\x91\xc3\x18\xed\x91\xc4\xed\x4f\x08\x1b\xfc\xb1\xc8\x55\xe4\x5c\x0b\xb6\xd4\xe9\xc9\x93\x88\x49\xad\x6d\x5d\xb2\x77\x9e\x35\x88\x44\x36\x39\x35\x20\x4b\x64\xab\x88\xf6\x8a\x6c\x54\xed\x81\x53\x06\x7a\xd1\x31\x03\x91\xc6\x4e\x6c\x24\x51\x8e\x29\x74\x6d\xe8\x10\x17\x75\xc8\xe6\x09\x04\x1c\x9c\x16\x55\xd5\x78\x6e\x6a\x32\x82\xf7\x58\xa6\xc5\xc6\xa2\x27\xd3\x92\xe3\x67\x43\xec\x31\x6f\x29\x36\x64\xc4\x36\xd0\xe7\xc4\xd7\xe4\xe1\x1b\xe6\x29\x0e\x67\x7f\x20\x8b\x1a\x57\xe8\x2e\xd0\x1e\x80\xd4\x37\x68\xc8\x57\xf9\x84\x2e\xa3\x2c\xc9\xb8\xce\xc6\x9c\x3a\x9a\xf9\x08\x5e\x85\xbc\x7f\x18\x39\xf6\x07\xe8\xac\x51\x7c\x22\x29\x0f\xbc\xd9\x66\xaa\x31\x3d\xd2\xeb\x5b\x6b\x18\xfc\xb3\x00\x47\xf4\xeb\x57\xd6\x67\xe2\x20\xa1\x8f\x34\x35\xdb\xba\xfa\x23\xfa\x51\xd5\x15\x8b\x59\x7b\x36\x3f\xfb\xef\x92\x38\xc8\xcd\xbf\x0f\x00\xa9\xc2\x03\x88\x7a\x88\x9c\x00\x29\xfb\x21\x64\xc6\x2c\x59\x53\x05\x2a\x31\x91\x4a\x80\xa8\x2a\x13\x90\x89\x8f\x92\x51\x60\x8b\x88\xe0\x8f\xcb\xe5\x65\xce\x90\x9e\x42\xef\x82\x62\x07\x53\x8c\xc4\xd4\x92\x85\x1e\x76\x17\x7c\xe8\x80\xcf\x2b\xaf\xe5\x8e\x62\x24\x5d\x3e\xa2\x3e\x46\xd7\x28\xdd\x46\x4e\x65\x81\x0c\x7b\x80\xab\x1f\x65\x56\x69\xff\x15\x6e\xfb\xe1\x12\x06\x63\x78\x8d\x6c\xb9\x5b\x29\x6b\x14\xb5\xc8\x6a\xf2\xc6\xd8\xf4\xe5\xd5\x77\xb6\xa7\x33\x55\x9c\x17\x03\xd1\x7d\xdc\x89\x14\x49\x4f\x30\x42\x43\xfa\x91\x20\x0a\xbf\x8a\x06\xdf\x21\x0b\x4d\xfd\xd8\x1d\x9d\x0d\xce\xde\xb6\x95\x2c\x2e\x5d\x6e\xe3\xb8\x84\x2a\x73\xec\xda\x0a\x1f\x4a\x85\xb3\x86\x19\xfe\x01\x92\x5f\xab\x67\x0f\xea\x8f\x54\x6f\x63\xa6\x09\xe4\x28\x71\xde\x24\x2d\x67\x4f\xb8\x24\xb2\xb6\x40\x94\xd1\x95\x19\x33\x7a\x70\x50\x4c\x5f\x0a\xe3\x76\xe2\x74\x40\x43\xcb\x41\xd0\xe7\x5d\x49\x86\x5d\xea\xf3\xfc\x80\xf3\xaa\x32\x65\x9e\x6f\x8c\x44\xbb\xca\x03\x1b\xb9\x4c\x87\xf3\xa5\x40\x17\x28\x65\xeb\xa9\xb1\x8e\xf5\x5f\xea\xcd\x18\xce\x91\x73\xa7\x21\xa0\xaa\x60\xfb\x2a\xab\x83\x48\xd9\x14\x53\x1b\x06\xf0\x1a\xf1\x52\x51\xc0\x5a\x2b\xea\x00\xdf\x0a\x7f\xb0\x03\x20\x4e\x73\xa1\x80\x33\xad\x4d\x43\x3d\x64\x23\xc7\x9b\xc8\x98\x79\xe8\xd5\x76\x85\xf0\xf5\xab\x16\xf1\xe6\x06\xfa\xae\xf6\xfb\x0f\xf7\x34\xd4\xf4\xb6\xb2\xe6\x1b\x63\x4c\x14\x52\xec\xe0\x5e\x28\x9b\xf7\xca\x0f\xf7\x28\xfc\x5d\x17\xc7\x06\xda\x5b\x50\xa4\x66\xbb\x82\x56\x1e\xbd\x13\x58\x98\x9c\x47\xa0\xa1\x8d\x03\xe8\xaf\x62\x9a\xd3\xb3\x5d\x10\x9d\xea\x91\x9a\xaa\xac\xea\x47\xcc\x62\x75\xc5\x60\x7f\x88\x8c\x2d\xb6\x24\xba\x89\xd4\xaa\x2a\xc0\xac\x60\xed\xd9\x90\x22\x5e\xd6\x75\x6d\x5e\x1b\xd3\x3b\x0d\x3f\xc4\x33\x3d\xf4\x51\xb0\xf6\x7d\x64\xd1\x14\x89\xc0\x8d\x88\xf4\x0b\x88\xcc\x42\xa8\xfa\x91\x7f\x70\xa0\xf9\x92\xa6\x88\x4a\xa6\xa1\xb6\x51\xe5\xea\x40\xa4\xb4\xbf\xe8\x74\xf0\xc1\x81\x2f\x74\x76\xf4\x10\xf7\x0d\x7f\xfd\xca\x86\x10\xb8\x1b\x54\x32\x83\x7f\x43\x8b\x02\x17\xf8\x11\xd9\x41\xac\x4a\xf2\xd5\x5c\xfd\x48\x24\x40\xe4\xbb\x8d\x41\x00\x7c\x3d\x0c\x96\xe4\x86\xad\xc2\xdc\xb2\x4a\xc7\x9c\xb7\xaf\x38\xd8\xe5\xa6\x70\x74\x14\xa6\xb8\x92\x8d\x7d\x7a\x27\x8f\x58\x15\xd7\xa0\x64\x6d\x2d\x91\xad\x87\x38\xe8\x33\x59\xea\xfa\x3e\xbc\x4b\x28\x78\xa1\xf1\x83\x7e\xc2\x77\xfa\xa9\xac\xc7\x46\x21\xd7\xbb\x89\xe1\x3b\xf1\xf1\x62\x81\xfc\x80\x41\x22\xb1\x98\x04\x52\x04\x22\x08\xde\xe5\xa0\x3b\x9f\x23\x8b\x62\x77\x91\x43\xa0\x45\x50\xfa\x8e\xe3\x98\x17\x01\xb2\x07\x6e\xda\x8a\x47\x5b\x8e\x3a\x3c\xb6\x51\x4e\x2d\xf1\xfb\xd0\x5a\x26\x87\xfe\x22\xe0\xa1\xcb\x39\x28\xf6\x04\x34\x04\x92\x93\x76\x54\x74\x37\x87\x4e\x56\x64\x7e\x62\x32\x50\x79\x24\x34\xb1\x5c\x13\xb5\x2f\x64\x51\xd4\x09\xe2\xc3\xa1\xae\x71\xab\x6b\x1c\xa4\xf3\x13\x3f\xe0\x18\x50\x1f\xbb\x0b\x3c\x67\x0c\xea\x74\x3a\xb9\x32\xaa\xeb\x40\x2b\x03\xff\x31\x47\x4a\xa9\x9c\x85\x11\x8d\x03\xe9\x05\x25\x64\x8a\xf9\xb8\xcb\x0e\x8e\x92\x84\xe2\xef\xa8\x4a\x83\x18\xf8\xc9\x40\xe6\xc4\xdd\x8f\x0c\xdd\x4e\x27\xf1\xb7\x5e\xd1\x36\x06\x85\xeb\x9d\x18\x16\x70\x9f\x5e\x10\x40\x6a\xa5\x08\xf5\x9c\x0f\x17\xe3\x07\xee\xc1\x81\xab\x15\x19\xce\xe1\xb6\x55\xa8\x40\x49\xe6\x97\x5f\x86\x34\xb5\x76\x03\x9c\xd8\x15\x5b\x94\x43\xa2\xd1\xf6\x30\xb2\x82\x6f\x64\x64\xf9\x52\xeb\x6c\xeb\xb1\x30\x23\x82\x57\xb8\x1d\x00\x97\x1b\x22\xca\xee\x18\x7a\x62\x93\x59\x86\x6b\x24\x31\x97\xed\x33\x56\x0f\x77\x4f\x95\xf8\x80\xfe\xbd\xe8\x45\x3b\xdf\x23\xe6\x19\xb7\xb3\xdd\x4a\x85\x4f\xc4\x9b\x22\x3f\x3c\x3c\xca\x8a\xae\xb7\x9e\x39\x38\x58\xca\x70\x15\x13\xdf\xf1\xa4\x7f\x3e\x3d\xee\x27\x1f\x08\x97\xd2\x2b\x25\xa8\x8d\x42\x21\x2b\xc5\x1e\x9b\xbe\xf5\xa0\x15\x26\xee\x8b\x4e\x27\xff\x8d\xb9\x7c\xf8\x61\xd7\xa9\xf3\x0d\x35\x27\x35\xe9\xee\xa1\xdc\xc1\x40\x2d\xbb\xa0\x14\x93\x14\x3e\xe4\x14\xef\x54\x06\x7c\x34\x7b\xc3\xd3\xf3\x93\x7e\x94\x27\x98\x78\xb5\x82\x9f\x91\xcf\x96\x70\x97\x2d\x2d\x51\x1d\xc6\xe8\xb4\x57\x27\xde\xf3\x47\xe2\x66\xe8\x11\x81\xb8\x9d\x5e\xfe\xc3\xa4\xf2\x04\xb4\x3f\x87\x50\x49\x0b\x27\x33\x57\x72\x1f\x6e\xf4\x45\x9a\xc6\xd9\x44\xcd\x70\x87\x89\x2a\x59\xb9\xc7\x84\xe1\x6a\xa7\x8d\xc2\x6c\x3a\xe8\x1b\x9f\xac\x62\xb5\x93\xb5\x99\x99\x29\x92\xb1\x9b\xd3\x75\x77\xeb\x1c\x94\xd3\xe4\xba\x68\x54\xc6\x90\x8e\x85\x71\x3d\xf4\x6d\x94\xcc\x21\x51\x21\xfd\x46\xcc\xea\x42\x90\x08\x5f\x0e\xd1\x56\x8b\x9f\x4f\x96\x0d\xdc\xdb\xc9\xcf\xd2\x7b\x02\x67\xc8\x09\xb2\x94\xca\xb2\x34\x8d\x71\x35\x09\x9d\x80\xed\xa4\x2b\x8d\x69\x17\x45\xc5\x23\x91\x76\x8f\x0b\x17\x16\x8e\x1e\x09\x0b\x3a\x48\xd6\xa7\x87\xbd\xe5\x54\x9b\x49\x4f\x1e\x6a\x8d\x37\xc3\xab\x9f\x42\x8f\xf9\x65\x3e\x12\xa2\xb3\xd5\x07\xd9\xe5\x86\xed\xb3\x5e\x1e\x6d\x13\xdd\x0c\x05\x2e\xf0\x73\xa2\xc9\x96\x6f\xa6\x32\x53\xd6\xc1\x90\x69\x5d\xea\x93\xbb\x9c\xc6\x4c\x55\xd9\x1e\x16\x45\x76\x1c\x13\x8d\x9c\xd0\xe2\xa8\x68\x5a\x74\x8a\xc0\xa9\x1e\x8f\x7f\x21\xf6\x6c\x94\x20\x0a\x0a\xe0\x27\xc5\x5a\xc7\x17\xbd\x5e\x7f\x3c\x8e\xa3\xad\x38\x49\xe8\x7e\x68\x58\x89\xbf\xd2\x68\x46\x88\x12\x09\xa2\xa9\x61\x46\x7a\xb8\x7b\x9b\x58\x6c\xd5\xc6\x1b\xb5\x71\x39\x8e\x98\xa0\xd1\xaf\x5f\x35\xda\x59\x1b\x6e\xfd\x0b\x9b\x65\x3a\xf3\xd2\x18\x5a\x2d\xd9\x75\xb2\xb1\xdf\x59\x1b\xce\xdb\x4a\xbc\x9d\x9c\x24\x45\xaf\x79\x52\x74\xbc\xe5\x14\x5e\xea\x47\xff\x6f\x00\x00\x00\xff\xff\x97\xac\x4a\x11\x67\xed\x00\x00") - -func bindataTkgWebDistTkgkickstartui582es201525ed5926266ddd371723JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui582es201525ed5926266ddd371723Js, - "tkg/web/dist/tkg-kickstart-ui/582-es2015.25ed5926266ddd371723.js", - ) -} - -func bindataTkgWebDistTkgkickstartui582es201525ed5926266ddd371723Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui582es201525ed5926266ddd371723JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/582-es2015.25ed5926266ddd371723.js", - size: 60775, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui582es525ed5926266ddd371723Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x0b\x77\xdb\x38\x92\x30\xfa\x57\x18\xee\xac\x87\xdc\x86\x18\x51\x2f\x5b\xf2\xf2\xcb\x28\xb2\x92\xa8\x63\x5b\x1a\x4b\x4e\xa6\x3b\xe3\x4f\x87\x22\x21\x09\x6d\x8a\x60\x83\xa0\x1f\xb1\xf5\xdf\xef\xc1\x83\x2f\x91\x92\x2d\x3b\xb3\x3b\xf7\xde\x9c\x9c\x13\x8b\x20\x50\x28\xa0\x0a\xf5\x42\x81\x78\x33\x8f\x7c\x87\x22\xec\x6b\xfa\x83\x1a\x85\x50\x09\x29\x41\x0e\x55\x8f\x6f\x6c\xa2\x40\x40\x01\x02\x3e\x20\xc7\x71\x2d\x05\x6b\x10\x50\xfd\x81\x40\x1a\x11\x5f\xa1\x8f\x8f\x1a\xb5\xa0\x11\x7a\xc8\x81\x5a\x55\xd7\xc1\x70\xf6\x07\x74\xa8\x31\x27\x10\x7e\x87\x9a\x7c\x72\xe1\x1c\xf9\x70\x44\x70\x00\x09\x45\x30\xd4\x20\x78\x20\xf6\x6d\xe7\xe1\xc6\xf6\x22\xd8\xc9\xb7\xa1\xfa\x7a\xad\xeb\xeb\xa4\x47\x5b\xf4\x88\xe6\x9a\x1a\x97\xa9\x6f\x2c\x7a\x1f\x40\x3c\x57\xe8\xc1\x81\x1f\x79\xde\x1b\xcb\xa2\x3a\x5d\x12\x7c\xab\xf8\xf0\x56\x99\xdc\x07\xb0\x4f\x08\x26\x9a\x3a\x8e\x02\x48\x14\x78\x17\x10\x18\x86\x0c\xdc\x2a\x0a\xa9\x02\x11\x5d\x42\xa2\xcc\xa0\xc2\x5a\x2b\x98\x28\xb6\x92\x00\xd7\x8f\xa1\x11\x10\x4c\x31\xeb\xc3\x92\xc8\x39\x04\xda\x14\x6a\xf4\xe0\x80\xa6\x2f\xc1\x83\x83\xfd\x90\x92\xc8\xa1\x98\xc4\xa3\x81\xe0\x96\x20\x6a\xcf\x3c\xd8\x79\x53\x05\x0e\xf6\xe7\x68\x11\x11\xf9\xbc\x5e\x27\x53\x94\x9b\x94\x7b\x0d\x02\x35\x81\xab\x82\x87\x14\x86\xb9\xd6\x01\x3d\x38\x08\xf9\x34\xa4\xd3\x12\xe6\x08\x11\xc6\x78\x86\x90\x8e\x62\x30\xc3\xf9\xbb\xd2\x52\x63\x86\x7c\x57\xd3\x3b\x09\xe9\xb3\x90\xa0\x31\x9d\x72\x44\xa6\x53\x8b\x02\xb8\x06\x9b\x1d\x3b\x1a\xd4\x1f\x18\x77\x50\x2b\xc3\x3b\x8c\x3c\x91\x2f\xc6\xe4\xaa\x56\x4c\x9f\x0b\x38\xf7\xa0\x43\x1f\x1f\xdf\xc8\x5f\x46\x32\x63\xba\xe8\xf0\x8d\x79\x8c\xe6\x5a\xe1\xad\x11\x2e\xed\x55\xae\x4a\x4a\xfd\x04\xfa\x88\xe0\xbb\xfb\xb8\x52\xf5\x98\x92\xfb\x78\x14\xef\x31\xf6\xa0\xed\xa7\xa4\x32\x38\x71\x86\x73\xc3\xb1\x3d\xaf\xd8\x9d\x26\x1b\x80\x6f\x57\x20\x33\xaa\xb5\xae\x83\x37\xd5\xb5\x63\x53\x67\xc9\x86\x1d\xe3\xb3\x5e\x6b\xfa\xb1\xec\x2a\x53\x9d\xcd\x0a\x02\xbe\x15\x69\x50\x67\x28\x53\x51\x44\xac\x48\xa3\x4b\x14\xea\x46\x86\x5d\x8e\x91\x55\xc4\xc2\x07\x36\x59\x44\x2b\xe8\xd3\x10\x10\x7d\x0d\xbd\x10\x2a\xc8\xf2\x0d\x3b\x08\xbc\x7b\x0e\x23\xad\x90\x20\xe0\x89\x17\x48\x5f\xa7\x44\xf2\x92\x45\x43\x0f\x0e\x34\x15\x73\x36\x48\x27\x8e\x3e\x3e\x96\x4c\x27\xd5\xf5\x78\x5d\x33\xec\x6f\x30\x72\x95\xea\xf6\xa5\x75\x02\x09\xba\x81\xae\x92\x19\x54\xa8\xac\xec\x7b\x05\xfb\xde\xbd\x22\x21\x89\x9e\xd9\x0a\x4b\xb9\x23\xc1\x3c\xd0\x60\x86\xb1\xd8\xd3\x43\xd2\xaf\x65\x59\x30\xd3\xef\x05\x9c\x43\x02\x7d\x27\xee\x9c\x0d\x59\x59\xda\xa1\xff\x57\xaa\xcc\x20\xf4\x15\xe4\x23\x8a\x6c\x0f\x85\xd0\x55\x2a\x4a\xc8\x96\xbd\xa6\xe7\x6a\x30\xca\x67\x7b\x87\x69\xd7\x51\x4a\x5c\x25\xda\xbd\x94\x16\x4f\x2c\xa5\xb2\x85\xf4\xf8\x58\xda\x98\x8d\x1e\x44\xb9\x39\x70\x13\xba\xbd\xd1\xa0\x82\xfc\x90\xda\xbe\x23\x69\x53\x4a\x84\x9e\xed\xfb\x98\xf2\xb1\x29\xb6\xe2\x78\x76\x18\x2a\x76\x98\x13\x67\x29\xf4\x89\x80\x3e\xc7\x44\xe3\xac\x6a\x55\x8f\xd1\x7f\x53\xc3\x83\xfe\x82\x2e\x8f\xd1\x2f\xbf\x08\x7e\xf5\x2d\xfa\x0d\x5d\x1d\xfb\x06\xf4\xa3\x15\xe4\xa2\xcb\xca\x3e\x3c\x3e\xbe\x31\x81\x6f\x64\x45\x9b\xf5\xa6\x0a\x54\xbe\xc4\x54\xe4\x2b\xfe\xc1\x81\xe6\x1b\xb1\x08\xb3\xde\x54\xb7\x0b\x3d\x8d\x58\xbe\x71\x0d\xef\x01\xb6\x04\xdd\x81\x1a\xde\xaf\x66\xd8\x4b\xd8\x52\xc3\x56\x5e\x50\x31\x59\x20\x19\x3a\xd1\x03\xf0\xf1\x91\x49\x72\xce\x34\xf1\xfc\x1f\x8b\x31\xc2\x6f\x63\x0e\xd0\xa0\x78\x44\xd0\x0a\x51\x74\x03\xaf\x72\xfc\x8d\xe2\x61\x23\x21\x1d\x20\x60\xeb\xc3\x85\x73\x3b\xf2\xa8\xca\x57\x72\xa1\x43\x3f\xee\xc6\x3f\x2e\xa5\xcb\xdf\xfe\x96\xe9\x4e\x28\x1d\xd9\xc0\x56\x82\xa4\x9c\xcf\x98\xa1\xea\x6b\xf1\x4e\x53\x99\xf6\xf5\x17\xaa\x65\x59\xf4\xdd\x98\xff\xee\x9c\x47\xab\x19\x24\x3a\x63\x13\x8d\x80\xb8\x86\xae\xbf\xc3\x1d\x51\x43\xc3\xba\x0e\x7c\x7d\xcd\x45\x0d\xc0\x29\xb9\xa7\x1a\x57\xe0\xa9\xb6\x3e\x38\x98\x68\x19\xdd\x06\xa8\x0e\x10\x2f\x03\xe8\x45\x6a\x09\xae\xb5\x10\x7a\x73\xe3\x16\xce\x02\xdb\xb9\xee\x2d\x23\xff\x9a\x5e\x2f\xa6\xd7\xc8\xb9\x0e\xa9\x4d\xe8\x34\x42\xd6\x93\x35\x1e\x1f\xbf\x5d\xe9\x46\x10\x85\x4b\xed\xdb\xb7\xe6\x51\xed\x0a\x3c\x98\x8d\x6a\xa3\x9d\xd3\x4f\x6c\x18\xc8\x70\x35\x0a\x1e\xfe\xe8\x64\x44\xae\x1c\xda\xc9\x1a\xe0\x92\xe2\xd5\x7a\xad\x1f\x4b\xda\x6a\x66\xb5\x55\x6f\xeb\x80\x58\x48\xab\x1f\x35\x8f\xea\x3a\xc0\xec\x67\xf5\xa8\x5e\xd3\x8f\x37\xcd\x0d\xf3\x00\x1e\x1c\xf8\xc6\xf4\xf2\x77\xad\x0a\x54\xc7\x23\x15\xe4\x60\x5f\x05\x66\xad\xa8\x83\xb7\xd6\xad\xe7\xd5\xe6\xce\xba\x0d\xbd\x20\xbd\xb7\xd6\x6d\x0a\x62\x07\x56\x7e\x86\x80\x1f\x0f\xfc\x41\xb5\x3d\x48\x68\x05\xf9\x73\xac\x76\x20\x90\x8f\x61\xe4\x38\x30\x0c\xd5\x0e\x8d\x4b\x6e\x6d\xe2\x33\x76\xea\xa0\xb8\xc4\xb5\xfd\x05\x24\x6a\xc7\x5f\xaf\x8f\xb3\xf2\x51\xae\x3c\xf3\x40\x6a\x7f\xa6\x96\xfa\xc1\x07\x4d\x3f\xf6\x8d\xc9\x82\x63\xe8\xa2\x1b\x15\x98\x3a\x10\x05\xa6\x2c\xa8\xc5\x05\x35\x59\x50\x8f\x0b\xea\xb2\xa0\xc1\x0a\x7e\x3b\x77\xb4\x06\xb0\x81\x09\x72\x63\x6d\xc6\xef\x9a\x20\xdc\x7c\xd7\x8a\xdf\xb5\x80\xb3\xf9\xee\x30\x7e\x77\x08\xbc\xcd\x77\x47\xec\xdd\x9f\xbf\x77\xb5\x18\x91\x23\xa0\x86\x81\xed\xab\xa0\xcd\x4a\xa6\xd1\xa5\xd6\xce\x56\xd9\xfc\xcb\x47\x57\x05\xea\x2c\xa2\x94\xd3\xa3\xca\x4a\xcf\xdd\x5f\x35\xd5\xf1\x90\x73\xad\x82\x22\x27\xfa\x46\xef\xd3\x99\x86\x58\x45\x7c\x77\xab\xe9\x86\x8f\x29\x9a\x23\xc7\x66\xd5\x2c\x26\xbb\xd6\xbc\xef\xcb\xdf\x35\xd3\xcc\x11\xdb\x2c\xa0\xb0\x46\x73\xad\x16\xd3\x81\xc9\x4f\x0e\xf1\xd8\x37\xfe\xde\xfa\x55\x53\xfd\x45\x8f\x69\x01\x15\xf8\x86\xd7\x7c\xaf\xb5\x40\x00\x88\x81\xc2\x81\x3f\xc7\x9a\xce\x7f\x8e\x05\x1b\xc8\xa7\xaf\x82\x05\xe4\x93\x10\x5f\x3a\x93\x28\xc6\x5d\xd0\xd2\x38\x6d\x24\xdc\xc1\x5c\xcd\x80\x8a\x6b\x98\x25\x35\x92\x1e\x76\x55\x4a\x3a\xde\x55\x29\xc6\x47\x56\xe1\xcc\xb4\x44\x7f\x68\xaa\xa2\x02\x21\xf1\x49\x6e\x2a\xdf\xb1\xc2\x4e\xbe\xcc\x58\xc1\x30\xb4\x17\x10\xa8\x8a\xaa\xaf\xf9\xd2\x99\x80\x13\x4b\xd3\x26\xd6\xc9\xe3\xa3\x76\x62\x31\x3b\xcf\x18\x9c\x7f\x18\x5a\x2a\x5f\x31\x60\x62\x8c\x2f\x7b\xbd\xfe\x78\x6c\xa9\xf1\x9a\x01\x13\xe3\x6b\xf7\xe2\x7c\x70\xfe\xd1\x52\xe3\x55\x03\x26\x46\xff\xe2\x62\x78\x61\xa9\x90\xa1\xa9\x82\x13\x1d\xac\xac\x0d\x83\x10\x66\x0b\x92\x15\x05\x35\xfd\xc1\x15\x86\x1b\x8c\xc5\x3f\x17\xd8\xdf\x1e\xae\xe1\x7d\x47\x15\xb3\xac\x02\xe1\x53\x14\xf9\x89\xb5\xcc\x0f\x32\xfb\xc0\x14\x91\x65\x59\x27\x7c\x50\xeb\x35\x88\x61\x8e\xe3\xc1\xbc\x12\xac\x9c\x9d\x0c\xe4\xaf\xf1\x94\xbc\x12\xb2\x9c\xe3\x0c\xe4\xbe\x98\xda\x57\xc2\xe5\x74\x5a\xaf\xaf\xb8\xd2\x4a\x4d\x40\xe3\x9f\x51\xb5\x76\xd8\x9c\xdb\x4e\x4a\xa5\xd4\x17\xf2\xe1\xad\x46\x1f\x1f\x99\x99\x16\xd7\x74\x56\x81\xe5\x1b\xff\x08\x56\xda\x03\x53\x89\x1d\x08\x42\xc8\x8c\x78\x4c\xc2\xce\xb7\x6f\xaa\x1d\x04\x15\x21\x47\xb3\x58\xa8\x57\x57\x00\xf9\x41\x44\xc3\xce\x43\xb6\xbc\xa3\xe6\x6a\xad\x81\x0b\x1d\x2f\xec\x98\xe0\xc6\x26\xec\x0f\xb7\xac\x39\x5c\x47\x2c\x69\x21\xa3\x55\xa0\x12\xec\xc1\xf4\xb1\x0e\xd2\x55\xdf\x00\x62\xf5\x5c\x81\x6f\x1b\xb5\xcc\xb2\xfa\x57\xe0\x5b\x5c\x5e\x41\x14\xae\x8a\x25\x2a\xb3\x39\x6c\x8a\x9c\xfc\x1b\x07\xfb\x95\x5b\x62\x07\x01\x24\xbc\xaf\x1c\x86\x52\x76\xa9\xe1\xd2\x66\x66\x03\x5f\x55\x15\x07\x11\x87\xe1\x93\xc5\x70\x67\x2b\x67\x09\x9d\xeb\xfd\x9b\xc1\x3b\xc7\xb3\x57\x7c\x4a\x2b\x94\x20\xdb\x5f\xbc\xb8\x79\x49\xdf\xc9\x0c\x50\x78\x47\x39\x34\x61\x1a\x25\xda\x40\xb5\x09\xb2\x2b\x9e\x3d\x83\x9e\x0a\xd4\x9e\x87\x43\xc8\xe7\xde\x11\xbf\xea\x40\x2a\x09\xd6\x94\x57\x5d\x22\xd7\x85\xac\x21\x25\x11\xcc\x0e\x9f\x37\x60\xd5\x4a\xa7\x31\x47\x8a\x5c\xb5\xfc\xbc\x6d\xaf\x57\x3e\x51\xcf\xab\xbf\x05\xfa\x15\xa0\x70\x15\x78\x36\x85\x1b\xd1\x05\x69\xcb\x30\x8d\x5c\x05\x11\x30\x6b\xc0\x8c\x0d\x84\xaa\x0e\x6a\xe2\x6d\x46\xf6\x6b\x42\xb8\xd3\x12\xe1\x4e\x77\x2f\x77\x9d\x39\x1f\xcf\x6d\x2c\x35\x83\xae\xaf\x81\x8b\x08\x74\x98\x55\x1e\x76\xbe\x11\x63\xd8\x04\xc4\x58\x5d\x03\x6c\x0c\xda\xdf\x01\x36\xfe\xbc\x39\xbd\x02\xd0\x77\xec\x20\x8c\x3c\xb1\x78\x6b\xc2\x02\xd6\xd7\xe0\xb0\xdd\x34\x6b\xdb\xcc\x55\xbb\x5b\x22\xb5\xfc\x35\x78\x3f\x2f\x29\x27\x6b\x30\x42\x25\xe5\x78\x0d\xd0\x75\x49\xb9\xbd\x06\x21\x29\x29\x0f\x53\xc3\xf7\xe1\xcb\x78\xf4\xa9\x7f\xd1\xef\xa8\x37\x61\xb0\x84\x04\xaa\xa0\xfb\x75\xdc\x51\xed\xdb\x50\x05\xdd\xdf\x2f\xd9\x1b\xfb\x7b\xc4\xca\x4f\x86\xbd\xcf\xfd\x8b\x8e\xea\x62\xe7\x1a\x12\x75\x0d\x88\xf5\xd0\x3b\xbd\x1c\x4f\xfa\x17\xd3\xf1\x97\xde\xb4\x37\x38\xb9\xe8\xa8\x66\xb5\x6a\xb4\x1a\x46\xd5\xa8\xbe\x35\xeb\x2a\x88\x2b\x8c\x86\x27\x99\x0a\xed\x96\xa8\x60\xa6\x15\x18\x84\xc1\xe8\x4b\x4b\xd6\x9a\xbb\xd5\x6a\xc7\xac\x56\x3b\xed\x56\xa7\xf3\xd6\xac\x1e\xe5\x41\x95\xd5\x6c\x35\x3a\x9d\xb7\x8d\x23\x75\x0d\xb0\x55\x18\xb3\x06\x2d\xfc\xf8\xa8\x61\xa9\xcd\x47\x37\x0d\x4b\x45\xc1\x4d\x43\x05\x90\x3d\xb5\xf8\x53\x4b\x05\x58\x84\x36\xd7\x9a\x0e\xec\x52\x28\xf6\xe3\xa3\x66\x0b\x28\x27\xfd\x2f\x96\xea\xc2\x1b\x06\x63\x74\x31\x3c\xb1\x98\x33\xe4\xaa\xc0\x4e\x61\x84\xa5\x30\xc2\xc7\x47\x2d\xe4\x30\xbe\x41\xa3\xef\x53\x48\x2c\xb3\x7e\x65\xa9\xfc\xa7\x0a\xe0\x37\x68\x9c\xc2\x39\xed\x12\x82\x6f\xad\xfa\xe1\x95\xa5\x26\x8f\xe2\xed\x05\x5a\x2c\xe3\xd7\xed\x2b\x4b\x4d\x9f\x55\x10\x26\xbd\xaf\x41\xbb\x55\x3d\x3c\xdc\xc7\x53\xf2\x12\xce\x00\x24\xe3\x00\x81\x30\xf5\x90\x3c\x4b\x23\x56\x36\xa2\x61\x6b\x08\x40\xd1\x8a\x5a\x8e\x86\x32\xee\x12\x4a\x21\xbb\x71\x1c\x0a\xd0\xf2\x80\x55\x6a\xe6\x20\x7d\xad\x61\x63\x76\x76\xc3\x8c\xce\x12\x15\x9c\x44\x51\x34\xff\xf1\x51\xf3\xad\xd0\xf0\x9b\xdf\x35\xa2\xeb\xba\x06\x1f\x1f\x89\xbe\x4e\x9a\xb9\x88\x58\xa1\xe1\x7d\xac\x49\x7d\x4c\xf2\xfa\x98\x89\x63\xd3\xbc\x9f\x60\xec\x51\x14\x4c\x08\x5a\x30\xe7\x06\xa8\x4c\x52\x2d\x71\x48\xbb\x94\xb2\x8a\x2a\xb5\x67\xc8\x77\xe1\x9d\x0a\xd4\xea\xa6\x08\xa7\xa2\xb1\x2a\x5a\x7c\x61\xaa\xb9\xc5\x7f\xbe\x47\xbe\x8b\xfc\x45\xb8\x21\xea\xb8\x30\xd3\x42\x23\x1a\x5c\x6b\x02\x92\x0b\x43\x87\xa0\x19\x74\x67\xf7\x2a\x9b\x1c\x82\xec\x93\xb8\xe8\xfd\xbd\xae\xc5\x8a\x3a\xee\x49\x97\xed\x96\x76\x18\xe0\x20\x0a\x62\xdd\x10\x97\x6f\x62\xa6\x83\xd0\x80\xd7\x7f\x68\x71\x01\x93\xe6\x62\xa0\x6f\xaa\x4c\xb4\xcd\xa1\x4d\x23\xc2\x04\x5b\x68\xfc\x39\xfc\xe3\x6a\xad\x03\x36\x87\xad\x7a\xeb\xd0\xdc\xc6\x3b\x65\xd2\x26\xcb\x3b\x16\xd2\x0e\x1b\x66\xeb\x50\x78\xd1\xb5\x7a\xb3\xb9\xc9\x43\x9a\xff\x7c\x26\x82\xcc\x77\xe5\xee\xcc\x71\x81\x9b\x34\x62\x51\x11\x98\xe1\x41\x54\xdd\x88\x55\xcc\x05\x9c\x5b\x10\x10\xe3\x06\xc1\xdb\x1e\xf6\xa9\x8d\x7c\x48\x2c\x1f\x10\x23\x84\x81\x4d\x6c\x8a\x89\xa5\x1a\x2a\x20\x19\xc6\x8b\xed\x6b\x7f\x31\xf4\x07\x3e\xa2\x25\x86\x25\xb7\x28\xa3\x10\x86\xe7\x70\x61\x8b\xb2\x83\x03\x4d\xd8\x99\xb2\xc4\x7a\x53\x05\xbc\x40\xce\xec\x04\x2f\x16\x1e\xb4\x8a\x45\x46\x18\xcd\x42\x4a\x34\x53\xd7\x45\x83\x70\x89\x23\xcf\x3d\x41\x61\xe0\xd9\xf7\x9a\xfe\x8e\x17\xe6\x06\x20\xb7\x1a\xfa\xab\x19\x74\x5d\xe8\x7e\x41\xcc\x08\x65\xb5\x32\xc3\xd6\x3b\x65\xed\x3c\x68\x13\x4d\x4f\x4c\xe7\xec\x10\x9e\xb0\x9f\xf3\x38\x8b\x78\xe0\xff\xa9\x1e\x1c\xa8\x6f\x78\x28\xaa\x58\xc5\x59\xda\xa4\x4b\xb5\x6a\xda\x5b\x6e\x60\xdb\xbb\xab\x96\xc3\x13\x5d\xbe\xd3\x98\xc5\x8b\xd9\x33\x5e\x68\xaa\xf4\x05\x3a\x4a\x7f\x15\xd0\x7b\x45\xb6\x50\x28\x6f\xa2\x40\xdf\xc1\x11\x13\xa7\xd0\x55\x34\x02\x1d\xbc\x5a\x41\xdf\x55\x08\x5c\xe1\x1b\xfe\x96\x99\x4f\xae\x02\x3d\x28\xa4\x8f\xaa\x83\x37\xa6\xde\x51\xff\xab\x7c\x48\xdb\xfa\xee\x7a\xb7\xf6\x7d\x58\xc1\xfe\x7e\xfd\xcb\x4a\x89\x51\xc1\xbb\xaf\x4a\xba\xc5\x6c\xf4\xee\x0d\x7f\x44\xe1\x07\x01\xba\xef\xdb\x33\x0f\xba\x9a\xac\x56\x2c\xcf\xb8\x45\xf9\x57\x25\x13\x8e\xe6\xb1\x19\x54\x18\x6b\xba\xaf\x92\xec\xf2\x95\xf2\x6e\xe0\x21\x2a\x78\x2f\x59\x50\x89\xeb\x54\x7b\x63\x59\xe8\x09\xba\xcd\x6c\x57\x61\xed\x56\x90\x42\x92\x9b\x30\x94\x4c\xe7\x64\x63\xa2\x3a\x8a\xfa\x4b\x11\x97\x5f\x54\x45\x30\x98\xe2\x08\x7e\x57\xe0\x9d\xed\x50\xef\x5e\xc1\x3e\x54\x12\xec\x14\xed\xaf\xb2\x75\x52\xf4\x8b\xfa\xd7\x98\xf4\x1a\xb4\xd0\xb7\xea\x15\xa0\x16\xfa\x66\x5e\x01\x6c\xfc\xce\xf4\xd4\x89\x4d\xed\x31\x24\x37\xc8\x81\x06\x0a\x47\x5e\xb4\x40\xbe\x9c\xdc\x2e\xc3\xc8\xa6\x50\x44\xe5\x75\xee\x3e\xa2\xb5\x46\x0c\xaa\xeb\x3b\xd5\x16\xf7\x1c\xe1\xe3\xa3\xaf\x6b\xa1\xf1\x5b\xbd\xa5\x85\xc6\xc5\xc2\x61\x62\x5a\x3c\x84\xd3\x19\x93\xcb\xfe\x16\x25\xe6\x17\x94\x58\x6e\x32\xa4\xfe\x8a\x3d\xca\xdc\xbb\xce\x46\xd5\x52\xe1\xef\xeb\x6b\x60\xb6\x9b\x47\x19\x9b\x35\x04\x1e\x88\xf4\x87\xc8\x20\x9a\xa7\x83\xc8\x70\x35\x0f\x3c\x9c\xda\x5c\xc1\x9d\x61\x37\xf2\xca\x16\xb3\x0b\x63\x85\x30\x01\x27\x56\x14\x87\x55\x57\x56\xa4\x35\x1b\xb5\xb6\x0e\xfa\x56\xa4\xd5\xda\x47\xf5\x23\x1d\xcc\xad\x28\xd6\x0d\x0b\x1e\x7a\x99\x6a\x5b\x82\x21\xcf\x9c\xdb\x89\xbe\x06\x93\x8c\x57\x3e\xcf\x78\xe5\x93\xfc\x04\xd2\xeb\x45\x25\x89\x38\x57\x22\x54\xf1\xc4\xc0\xd8\x2c\x0a\x97\xbb\x29\x5c\xee\x6a\xea\x72\xcb\x20\x1c\x37\xb8\xd4\x95\x8d\x7c\xfe\x53\x38\x80\xec\x85\x83\xbd\x8a\x59\x53\xd3\x87\x95\x5b\xa9\x33\x1f\x6d\x65\x2f\x60\xc5\x89\xa5\xb2\x6c\x21\x3b\xac\xf0\xb7\x4f\x40\x69\x3f\xe5\x46\x69\xf3\x5c\xc4\xb5\xaa\x83\x79\x2e\xe2\x6a\xb2\x82\xe9\x65\x1a\x71\xad\xb1\x02\x11\x42\x9c\xe7\x22\xaf\xf5\xb8\x66\x03\xa8\x04\x47\x14\x92\x0a\x8e\xa8\x07\xa9\x9a\x6d\xc1\xff\x6e\x78\x48\x7d\xc3\xeb\x5d\x81\x90\xde\x7b\xec\x49\xfd\xdb\x0a\xba\xc8\x56\xb4\x95\x7d\x57\xb9\x45\x2e\x5d\x76\x94\xc3\xd6\x51\x70\xa7\x3f\x18\x1b\x13\xf2\x6d\xea\x2f\xd8\x03\xf4\x69\xe5\x3f\x7b\xc3\xb3\xd1\x7f\x5e\x3d\x2c\x21\xb3\x6e\x3b\xb5\x6a\x35\xb8\x3b\x66\x7e\x75\xc5\xf6\xd0\xc2\xef\x38\x90\x89\x8b\xf5\x7a\x07\xf4\xdc\xc4\x96\xc1\x16\xf5\xeb\x1c\x74\xb6\x9f\xf5\xda\x90\xf4\x35\x62\xea\x96\x35\x5f\x21\xbf\x22\x9b\x35\x78\x33\x95\x2d\xa0\x89\x0e\x96\x56\xa4\xb5\x0e\xab\xf5\xaa\x0e\xba\x8c\xcb\xb9\x01\x74\x63\x45\xb1\x55\x34\x66\x3f\x99\x5f\xa8\x83\xa1\x15\x69\x47\x47\xed\x5a\x55\x07\x3d\xb6\x4a\xda\xd5\xc3\x66\xc6\xfa\xb9\x28\x0b\xae\xcf\x65\x70\x3d\x4f\xea\xa3\x4d\x52\xb7\xe3\x82\x98\xd4\x66\x75\x93\xc6\xa6\x60\x87\xe8\x92\x11\x59\x39\xe1\xae\x9d\xa2\x6e\x72\x44\x33\xae\x5d\x8b\x59\xa2\x15\x33\x8f\xb9\x59\xf7\x10\xa8\x01\xdf\xb1\x90\x70\x8f\x0a\xcc\x22\x2b\xb6\x63\xa0\xcd\x04\xef\x4c\xd8\xbc\xc6\xbb\xda\x12\x36\x9f\xcb\x78\xf9\xb1\x0c\xa1\xf2\x18\x77\x2d\x13\xb8\xf3\xed\x1b\xb4\xb0\x29\x9c\xe0\xaf\xe8\xbb\x4d\x5c\x8d\x7b\x68\x5f\x06\x27\xfd\x8b\xb1\x21\x1c\x59\x7d\x1d\x63\x68\x9a\x6c\xe8\x30\xf0\xf0\xbd\x52\x64\xed\xcd\xbf\xb9\xf8\xba\x9f\xf6\x3d\xe7\x21\x68\x3e\x5a\x11\x82\x96\x10\xef\x71\x44\x14\x15\xf8\x86\xe3\x45\x21\x85\x64\x72\x1f\x40\x61\xdf\x07\x14\x13\xa0\x2a\xb2\x5c\xc1\xbe\xa8\xeb\x61\xc7\xf6\x94\x5b\x4c\xae\x79\x64\x0d\xfb\x02\x29\x19\xe0\x9e\x67\x3c\x87\xd8\xd2\x77\x45\x4f\xd8\x57\xa4\x6f\x9e\xdd\xec\x9f\x3d\x9f\x81\x38\x77\xfc\x76\xee\x68\x26\xb8\x00\x66\x0d\xc4\x6c\x73\xb8\xc9\x47\x47\x9b\x6c\x94\x70\x5a\xa3\xc0\x69\xcd\x02\xa7\xb5\x80\xaa\x7c\x39\xbb\xb5\x09\x54\x6e\xc6\x3c\xe8\x50\xe4\xb8\xc3\x02\xc7\x1d\xc5\x25\xf5\x12\x46\xca\x71\x9c\xe8\xbb\x8c\xe5\x92\xa8\x52\x86\xe7\x6a\x99\xad\x9a\xd6\xbe\x3c\xf7\x5c\x96\x93\x51\x96\x0c\xcf\xd5\xf7\xe1\xb9\x18\xd7\x46\x61\xa5\x37\x37\x09\x60\xb6\x0a\x14\x30\x0f\x0b\x24\x30\x8f\x80\xaa\x74\x57\xf6\x77\xec\x2b\x5f\xe1\x4c\x91\x26\x4e\x58\x24\x84\xd9\x2e\x50\xa2\x96\xec\xe6\x1d\x6e\xd6\xae\x99\x1b\xb4\xa8\xd5\xb6\x0d\xa6\x56\x2f\xd0\xa2\xd6\xc8\xd0\xe2\xe8\x5f\x45\x8b\xee\xd7\x71\x4a\x87\x5a\xf3\x05\x74\xa8\xb5\x36\xe9\x50\x3b\x2c\x88\xdc\xa3\x02\x1d\x6a\xed\x02\x1d\xea\x55\xa0\x2a\x67\xc8\x21\x38\xc4\x73\xaa\x74\xbf\x47\x65\x8b\xa1\x6e\x16\x68\x50\x4f\x44\x7a\xbb\x50\xbb\xbe\x41\x83\x7a\x63\xdb\x40\xea\xcd\x02\x0d\xea\xad\x8c\x0c\xae\xfe\xcb\x68\xf0\xfb\x65\x76\x35\xd4\x0f\xf7\xa4\xc2\x76\x49\x1c\x0b\x62\x3e\xc5\x99\x90\xb1\x4a\x1d\xc8\x7c\x3b\xdf\x80\x2e\x62\x43\x88\x65\x6a\xfb\x55\x12\xbb\x4c\x8e\x3d\x4b\x52\xdf\xac\x44\x43\x19\x75\x8d\xdb\x09\x6e\x79\x31\x3a\x72\x49\xf7\x3d\x3b\xa4\xc8\x51\x7a\x78\x15\x44\x14\x2a\x3d\x0f\x47\xee\x1e\xc8\x95\x48\x86\x1f\x85\x61\x29\xb3\x3f\x0b\xa9\x55\xd2\x52\x04\xa4\xb3\x4a\xee\xf7\x7d\x0d\xe0\xac\x36\xab\xd5\x33\xea\x4c\x6c\xf5\xd7\x1a\x59\xb3\xe8\x14\xdb\xcc\x8c\x34\x0c\xe3\x19\xdc\x29\xb2\x2f\x06\x3b\x36\x7a\x7f\x68\xb8\x4b\x18\xe6\x3c\xd2\x45\x11\xf5\xa0\xa4\x17\x0f\x74\x75\x47\xa3\xe9\xc5\xf0\x72\xd2\x1f\x5b\x4b\xe3\xef\x80\xa4\x0b\xd0\x1a\x1b\x76\x17\x10\xc3\x13\x23\xb3\xde\x98\x80\x18\x01\xc1\x37\xc8\x85\xc4\xea\x16\x7d\x5f\x91\x9b\xc6\x5f\x33\xea\x6a\xfa\xbe\x71\x33\x31\x07\x0c\xe9\x63\x06\x7e\x05\xc3\x10\xfa\x0b\x48\x78\x0c\x8c\x07\x3b\xb5\xa1\x71\x6a\xbc\xbf\xe8\x9e\x9f\x0c\xce\x3f\x4e\x7b\x9f\xba\xe7\x1f\xfb\x27\x20\xbb\xf1\x0a\xe3\xb5\x6b\x51\x23\xb0\xef\x19\xf2\x71\x09\x80\xe5\xcc\x97\xa9\x59\xce\x9c\x30\x76\x12\x46\xf6\x02\xf6\x84\x7d\x9f\x69\x34\x23\xe2\x6d\xb6\x16\x80\xb9\xa9\x36\x42\x48\x27\xec\x59\x2b\x69\xc6\x2b\xea\x6b\x11\xde\x8b\xfc\x64\xb0\x69\xb0\x66\x53\x4e\x16\xe6\x2e\x4e\xa8\x3d\x0e\x6f\x11\x75\x96\x22\xe4\x92\x10\xae\x0a\x4a\xa8\x15\x6e\x50\x0b\xea\x00\xea\x0f\x8e\x1d\x42\x85\x11\x3e\x36\x47\x3a\x94\xf1\x85\xf1\x75\xf0\x7b\xf7\xe2\x64\x7a\xf6\xf1\x6c\x32\x95\x9b\x2c\xc7\x33\x02\xed\xeb\xe3\xb4\x45\xf7\xeb\x58\xd6\xee\x7e\x1d\x4f\x45\x8b\x62\x25\xbe\x5f\x24\xab\xb1\xdf\xdb\x2a\xca\xad\x24\x51\x53\x3c\xc8\xaa\x6b\x3e\x3a\xc1\xd4\x89\x0a\xd1\xbe\xd1\xab\x24\xbe\x72\x63\xd0\xbd\x77\xe8\xb5\x39\x0f\xad\xf4\x8d\x0f\xc2\xc4\xad\xb7\xb4\x9e\x71\x72\xa7\x6f\x6c\xdd\xcf\xb7\x6f\xdd\x17\x82\x04\xfc\x07\xf3\xc5\xd3\x08\xca\x9c\x47\x50\xe2\x6d\xfa\x9a\x08\x1a\x1c\x95\x06\x0d\x0a\x3e\x7e\xb2\xdf\xeb\xc1\x1b\x2e\xf7\x4c\x56\x54\x07\x2a\xf2\x7d\x48\x3e\xd1\x95\xb7\xd1\xc6\x5b\xe4\x43\x03\xe1\x2a\xff\x5c\x06\xb3\x96\xdb\xdf\x4e\x02\x18\x65\x9b\xdf\x99\x6e\x1a\x4a\xa6\x8f\x96\x92\x0d\x4c\xe4\x77\xbe\xb3\x6d\xf2\x98\xb5\x0a\x88\xb1\xea\x9c\xd9\xd5\x58\xea\x64\x4a\x2b\x33\x0f\x8b\x3d\xf0\xb8\x80\x2f\xa3\x6c\x01\xf7\xf9\x65\x3d\xa0\xde\x12\x3b\x90\x6f\xa5\x42\x15\x29\x08\x8d\xa3\x1c\x10\xb9\x27\x1f\x3f\xcf\x31\xa6\x32\x3f\x01\x31\x4c\x66\xd4\xaf\x08\x75\x53\x49\x36\x43\x4d\x5e\x2c\x5f\x06\x04\xad\x6c\x72\x9f\xdf\xa6\x37\x81\x6a\xdf\x86\x15\xe8\xd4\xb2\x7d\x16\x20\xf2\x0d\xd5\x67\x41\x5b\x85\x15\xae\xe0\x76\x83\x13\x7b\xb2\xcf\x02\x28\x9c\xc2\x9d\xe0\xa4\xdf\xf8\x3c\x78\x3c\x06\x23\xa2\x2f\x2a\x50\x57\xb4\x52\xab\xca\x37\x61\xc0\xd9\x55\x4d\x7e\x55\xbc\xc5\x0f\x89\x57\x49\x75\xbd\xac\xc9\x70\x15\x37\x81\x45\x85\x44\x51\x67\x35\x31\x7b\xdf\xe4\x66\x70\x7d\x9b\xed\xdb\xda\xec\xf0\x30\x4d\x38\x9c\xc7\x89\x7f\xcb\x06\x4f\x32\x9c\xc7\x69\x7f\xdb\x75\x3f\x77\x9b\xab\x60\x06\xea\x47\x20\x86\xd4\x4a\x5e\x98\xe0\x77\xd0\x04\xd5\xa4\x5c\x26\x35\x68\xc2\xf4\xe1\x38\x7e\x24\x50\x53\xe3\xb4\x35\x5a\xa2\x95\xe2\x14\x85\xe2\x1b\xc3\xc3\x0b\xcc\x33\x76\x80\xaa\xe0\xf9\x3c\x84\xb4\x42\x71\x50\xa9\xa5\x46\x1b\xfb\x31\xfc\x33\xd2\x5e\x04\x5e\x28\x31\xb0\x69\x58\xa7\xa2\xe9\x65\x58\x23\x9f\x12\x0c\xe6\x06\xfe\xf5\x24\x06\xde\x48\x6c\x4b\x69\x5a\xd2\x25\x54\x54\x40\x9f\xb2\x2c\xd5\x22\x76\xc2\xec\x7f\x43\x63\x55\xb9\xad\x46\x5a\x61\x23\x88\x79\x62\x0c\x9b\xff\xbf\x0c\x62\x1a\x4c\x3a\x26\xd6\x60\x49\x13\x45\x51\x8c\x54\x4e\x97\x54\x00\xca\xf3\x61\x08\x29\x5c\x86\x58\x71\x9a\x5e\x8f\x19\xab\x30\xa3\xfe\xbf\x0a\xe7\xed\xe0\x1f\x56\x36\x59\x20\xbf\x53\xdd\x63\x10\x19\x25\x57\x06\xf1\x8f\x28\xa4\x68\x7e\x5f\x91\xe5\x72\x92\x8e\xf9\x8c\x89\x74\xbd\x1f\x37\x6f\x59\x2e\x31\x0f\x93\x50\x37\x4f\x72\x39\xb7\x22\xad\xd6\xaa\x99\x4d\x1d\xbc\xb7\x22\xad\xd1\x3a\x3c\xaa\xe9\xe0\x9e\xff\xac\xd5\x5b\x3a\x18\x59\x51\x9c\x48\x72\x69\x45\x1a\xcf\x2c\xd0\xc1\xb5\x15\x69\x3c\x41\x45\x07\xa7\x16\xb3\x54\xa0\xad\x5e\xa5\x7e\xd0\x59\x36\x6e\x99\x55\x13\xdc\x43\x4b\x02\x59\xa9\xdf\x05\x6a\xd9\xf8\x66\x21\x16\x10\xe7\x05\x23\x46\xa0\x53\xe6\x5d\x66\x32\x7e\x6f\x4b\xb6\x92\x1e\xd4\x25\x72\x61\x25\x4e\xa3\xe8\xc0\x6c\xce\xfb\xdd\x36\xec\xd8\x8a\x8b\x13\x2d\xe4\x1c\xc6\x31\xa0\x67\xe1\xcb\x25\x93\xe3\x91\x11\x0e\x91\xd8\x9b\x47\x86\x84\x77\x22\x84\x13\xf6\xf5\x4c\x1e\xf7\xdc\xf8\xf2\xf9\x4f\xad\x0e\x6e\xc1\x1b\x4d\x1c\x76\x4c\xea\x1f\x1c\x24\x3f\xe5\x56\xac\xae\xe7\xa4\x60\x3a\x25\xb2\x9a\x9c\x91\x64\x94\x7f\x66\xf4\xf4\x3c\x3e\x6a\xc0\x96\x25\x27\x16\x30\x4d\x1e\x91\xaa\x89\xd7\x1c\xf3\x38\x5d\xf1\x4d\x55\xf8\xc1\x1f\x4b\x27\xd6\xc1\xc1\x7d\x45\x46\x99\xd8\xbc\x82\x2f\xd6\x66\xa2\x49\x5c\xd5\x43\x3e\x94\x8c\xc7\xcf\x2a\x30\x3e\xe4\x02\x4f\xed\x50\x20\x19\x12\xad\xd7\xe0\x93\x55\x76\x60\x51\xca\x46\x18\xd7\xa4\xeb\x35\xf8\x6a\x7d\x53\xff\x4b\xbd\x02\xdf\x9f\x9b\x8b\x4d\x33\xfb\x8f\xc2\x91\x83\x9e\x45\xc5\x2f\x6e\x2f\x9f\xa2\x90\x5a\xaa\x2a\x4a\x98\xc5\xcd\xd9\x2b\x29\x09\xd1\x77\x68\x99\x2d\xf1\x20\x67\x3a\x79\x19\x33\x63\xb6\x80\x93\x16\x86\xd6\x37\x6e\x86\xe1\x88\xb2\x49\x50\xaf\xc4\x7b\x17\x85\x7c\x53\x9f\xf9\xec\x59\x88\x09\x77\x58\x2a\xd3\xfd\x1e\x9c\x53\x09\x91\xcd\x76\x8f\xd9\x6f\x96\x0f\x6f\x95\xb9\x71\x13\x40\x99\x9f\x82\x48\x48\x4f\xb1\xed\x26\x19\x2b\xb6\x8f\x56\x71\xef\x31\x42\x4b\x3b\x1c\x11\xfc\x07\x74\x28\x74\x63\x07\x39\xee\x1b\x85\x63\x7b\x6e\x13\x64\xbd\xfd\xbf\x9a\xf6\xee\x8d\xb3\x24\x78\x05\x1f\x6d\xdf\x25\x18\xb9\xba\xa1\xff\x57\xc8\x5f\xbf\x45\x06\x85\x21\xd5\xa4\x43\x87\x89\x11\x85\x90\x74\x17\xd0\xa7\x65\xe9\xed\x4f\xa5\xdf\xcc\x70\xe4\xbb\xa1\x95\x4c\xee\x2f\xad\x5f\xd4\xe0\x6e\x07\xba\x92\x68\x86\x6f\x33\xdd\xde\x17\x49\x1f\x06\xb7\x5f\x26\xf0\x8e\x1a\x94\xa0\x95\x26\x69\xeb\xd8\x9e\x13\x31\x63\x55\xce\xc3\x04\x77\x79\xba\x5a\xea\xb1\x6f\xa9\xb1\x35\xe8\xf1\xed\xea\x38\x47\x6a\xb9\x18\x1f\x1f\xa1\x38\xd7\xa4\x72\xcb\x9c\xd9\xdd\x3a\x28\xab\x78\x70\xa0\x41\x0b\x1a\x0e\xf6\x1d\x5b\x66\x5c\xa4\x4c\x12\xa7\x0e\xc5\x6c\x71\x70\x10\x43\x8d\x4b\x32\x50\xf3\x08\x5b\xd0\xf8\x03\x23\x9f\x89\x00\xfd\x17\x35\xce\xac\x48\x38\x3a\x8d\x50\x2c\x86\x7e\x6f\x69\xfb\x0b\x58\x76\x36\xe0\xb9\x93\x86\x83\xfb\x09\xee\x79\x28\x98\xe1\x5d\x51\x0e\xeb\x16\xf9\x2e\xbe\x3d\xce\xb1\x57\x9c\x61\xc5\xc4\xce\x06\x11\x39\x18\x0b\x82\x6d\xef\x85\x17\xcf\xc4\x2d\x35\x6c\xd7\xed\xdf\x40\x9f\xb2\xd1\x41\x1f\x12\x8d\x63\x95\x46\xb5\x15\xa4\xf9\xfa\x83\x6f\x04\x04\xb2\x6a\x27\xe2\x8c\x1f\x3f\x5a\xe3\xc4\x88\x9f\xd8\xd4\x7e\xb7\xf1\x6c\x84\x90\xb2\xbf\x1a\x97\x8d\x6f\x03\xcf\x46\xbe\x0a\xa0\xde\xa1\xf9\x7a\x07\x07\x74\x5b\x43\xc6\x86\x2a\x97\x2f\x86\xc8\x11\x2a\x45\x14\xe9\x6b\x1d\x3c\x17\xe8\xbb\x27\x3b\xeb\xb8\xd8\xe1\xd9\x97\x06\xbc\x83\x4e\x0f\xaf\x56\xb6\xef\xca\xbe\x52\xca\xb9\xb8\xc7\x3b\xdf\x15\xd2\x4b\xe4\x4c\x86\xc4\x82\x64\xbc\x95\xbe\x21\x88\x0c\xb8\x42\x34\x5e\x70\x19\x29\x64\x96\x48\xa1\xb9\x87\x82\xca\x12\x13\xf4\x9d\xd9\xd7\x5e\x65\x86\x29\xc5\xab\xa2\xb0\x75\x70\x80\xa0\xab\x38\x1e\x52\x1c\x31\x12\x15\xf0\xc8\xdc\x0a\xe2\x88\x6a\x19\xbc\xe1\xee\x0e\x18\xf1\x49\x08\x55\x00\x73\xb2\x7c\x0d\xcc\x66\xb5\xaa\xbf\xf8\x94\x88\x8c\x41\xcd\x8d\xf1\xfb\x3f\xf7\x08\x3c\xd9\x01\xb3\x23\x82\xfb\x0a\xc5\x95\x84\x9c\xb1\xee\xbc\xba\x02\x37\x08\xde\xfe\x3d\x82\xe4\x7e\xc3\xb7\xe6\x76\xc5\xb1\x26\x55\xf7\xc7\xb9\x76\x0a\x9a\x40\x74\xce\x0d\x0f\x6e\xb3\xa0\x8f\x67\x1a\x33\x3e\x7a\x17\x9f\x34\x9d\xe7\x31\xf2\x25\x64\x21\x41\x14\x86\x66\x92\xd5\x5a\x7b\x32\xab\x75\x6e\x4c\xb0\xa7\xd1\x54\x82\xe8\xeb\x24\x0d\x29\x29\xeb\x64\x63\x4c\xb2\x4c\xbd\x92\xcc\x25\x0f\x09\x83\x64\xde\x3b\x6a\xf2\x53\x05\x4c\xd4\x77\x54\xf6\xbf\x0a\xa4\xd2\xeb\x24\x59\xae\x20\x16\x9a\x1d\x35\xfe\xc5\xcb\x24\x99\x79\xa9\xfc\xad\x82\x58\x34\x76\x52\x21\x09\x36\xd5\x68\x02\x3a\x29\x51\xd7\x00\x47\x54\x8e\x27\x66\x65\x21\xd9\xf8\xcf\x5c\x3a\xd5\xdc\x98\x4c\x4e\xae\x80\xbf\x90\x3a\x68\x9c\x10\xf5\xeb\x46\x84\xb0\x96\xc9\x2b\xca\x9f\xbd\x29\x1c\x1e\x71\x3c\x52\x4c\x56\x4e\x82\x36\xd9\x83\x3e\x99\x81\xa9\xfe\x62\xcc\x9c\x58\x75\x23\x68\xe5\xa3\x55\x45\x1e\x5c\xce\x37\x8d\xeb\x8b\x7a\x73\x82\x99\x09\xab\xce\x6d\x07\xca\x3f\x72\x73\x26\x77\xaa\x64\x93\x45\xd9\xdb\x7c\x78\x70\x66\xf3\x58\xdd\x13\x70\x96\x50\x9e\x7e\x71\x3c\x32\xe6\xa4\x56\x57\xae\x0c\x41\x65\x8c\xe2\xdc\x91\x26\xc7\x23\x83\xf9\x30\x80\xe2\x40\x8a\xb4\xba\xa1\x2b\x0e\x23\x27\x47\x67\xea\x20\xb1\x4e\xf3\x11\xcf\x67\xf5\xf3\x3c\xc8\x22\xe4\xca\x6c\x63\xf5\x19\x71\xaf\x0f\x7f\xa1\x49\x38\x2a\x76\x6c\x72\x01\xb0\x8c\x33\xa1\x66\xc2\x60\xc9\x1e\xf9\x8e\xed\x59\x99\xc4\x49\x33\x86\x01\x35\x84\x28\xd7\xc4\xc6\x6b\x36\x7f\xa3\xb6\x99\xbf\x51\xcf\x44\xd1\xd2\xe3\xa6\x3c\x3c\xf3\x29\xf4\xb5\x24\xb2\x75\x08\xce\x40\x0d\x98\x31\xf2\xcd\xcd\x28\xdb\x51\x36\x14\xc6\xe0\xb5\x37\xce\xe1\x3e\x19\x51\xbb\x03\x35\xd0\xdc\xe2\x57\x95\xe6\x16\xc9\x80\xdb\x9f\x02\xaf\xd4\x5b\x69\x67\xa2\x6e\xf9\xb3\xb0\xc2\x87\x32\x4d\xf0\x31\x71\xa2\x68\x62\x84\xb1\x79\x2b\x58\x6e\xb4\xcc\xcc\x4c\xbd\xab\x5a\x26\xc6\x24\xfb\xa0\x45\xfb\x4b\xd7\xb2\xe2\x27\x21\x14\xf7\xee\xe4\x8a\x7d\x16\x3a\xfa\xc1\xc1\x9b\x52\x84\x98\x48\xbe\xee\xff\xae\x99\x75\xf0\x85\x21\xc0\xcd\xe6\xe2\x0f\xbd\x74\xe7\x95\xa6\xda\xaf\x2c\x74\x96\x0c\x2b\xa3\x4b\x7f\x2c\xe6\x5f\x4f\xdf\x6b\xe6\x21\xf8\xb4\x05\xe1\xfc\x9e\xb1\xd4\x0a\xdc\x1d\x28\xa3\xc2\x60\x9e\x06\x29\x63\x24\xe2\xd0\xe4\x26\x52\x2f\x02\x4e\x13\x63\xb5\x18\x47\x5c\x5d\x83\x91\xf1\xeb\xea\x0f\x30\x32\x66\x67\x37\xe0\xc4\x18\xf5\xc0\xc8\xf8\xf3\xe6\x14\x9c\x18\xc3\x26\x18\x19\xfe\x9f\xbf\x81\x91\xf1\xfd\xe4\x43\x26\xde\x68\xc4\x5e\x41\x49\x34\xa6\x33\xc7\x4e\x14\x3e\x48\xcf\xb0\x53\x7d\x83\x56\x01\x26\xd4\xf6\xe9\x9a\xad\x43\x23\xe3\x5f\x97\x07\x7b\xb6\xbe\x93\x61\xaa\x0a\xe1\xee\x72\x06\xf0\xf1\x0c\x13\x17\x92\x8e\x8f\x7d\x78\x1c\xd8\x2e\xb3\x02\x3a\xd5\xb5\x51\x6e\x9e\x95\x41\x66\x8c\x22\xce\xc6\x95\xb7\x51\x8c\x66\xa8\x38\xd1\x0c\x39\x95\x19\xfc\x8e\x20\xd1\x8c\x46\xb3\x09\x8c\x6a\x1d\x18\x4d\xb3\x09\x8c\x76\xb3\xa9\x2b\x33\x4c\x97\xc5\x5e\xa5\xcd\xb6\x5f\xb7\xb2\xd1\x3e\xfd\x66\x94\x66\x69\xc4\x92\xd8\x7e\x38\xc7\x64\x55\xe1\x64\xec\x04\x04\x86\x90\xdc\xc0\x4a\xdd\x3d\x76\xc5\xe1\x87\x0e\x8f\xb0\x1d\xc7\xa4\x63\xd3\xb9\x36\x98\x32\x2c\x83\x17\x48\x3d\xd4\xb1\x67\x21\xf6\x22\x0a\x8f\x45\x3c\xc3\xac\x56\xff\x33\x0e\xf5\xf2\xdf\x95\x5b\x38\xbb\x46\xb4\xc2\x74\x2c\xd7\xac\x37\x28\x44\x33\xe4\x21\x7a\xdf\x11\xaa\xe9\x78\xd7\x2b\x4e\xda\x0a\xb1\x5d\x14\x85\x9d\x7a\x59\x84\xfa\x18\xdf\x40\x32\xf7\xf0\x6d\xdc\x86\xd7\x48\x0a\xa1\xe7\xa1\x20\x64\x8e\x40\x3c\x03\x1d\x82\xa9\x4d\xe1\x3f\xb4\xaa\xbe\x36\xb8\x0d\x51\x36\xc0\xef\x15\x7e\xb0\xaa\x53\xab\xca\x4a\x46\x6a\x17\xec\x9c\x10\x02\x3d\xee\xe6\xad\x0d\x36\xae\x5d\xa0\xcd\x6a\x09\x52\xe6\x51\xd5\x85\x0b\x5d\xb4\x7e\xa2\x4f\x8a\x83\x0e\x0f\x8b\x67\xc3\x81\x65\x15\x63\x0a\x73\x9a\xfe\xed\x1a\xde\xcf\x89\xbd\x82\xa1\x52\xce\xee\x0f\xd5\xff\x7c\x28\x9d\x2d\x8a\x4b\xca\x2b\x31\xc6\xbb\x00\x4b\x86\x2e\x87\x9c\x40\x28\x85\xcf\x1c\x9b\x24\xa2\x9b\x86\x39\x3f\x97\x6e\xd4\x6d\xd7\xc5\xd2\x6e\xc9\x85\x68\x6b\x40\x55\xba\x4a\xef\x74\x10\xfb\x65\xca\x1c\x13\x85\x9f\x63\x42\xfe\x82\x7f\x97\x48\x64\x07\x45\x21\x7b\xa6\x4b\xa8\x24\x1f\x0f\xe2\x48\xcc\x91\x07\x95\x05\xf3\x83\x6d\x0a\x5d\x65\x4e\xf0\x4a\xe1\x7e\x85\x02\xd3\x03\x23\xac\xd9\xe5\xc0\x50\x46\x1e\xb4\x43\xa8\xf8\x98\x42\x5e\x16\xd8\x74\xa9\xb0\x4e\x7d\x7b\x05\x15\x3c\xdf\x06\x5f\x82\xc8\xa2\x09\xff\x8c\xd0\x8d\xed\x41\x9f\x2a\x33\xe8\xe1\x5b\x43\x99\x2c\xa1\xa8\xed\xd8\xbe\x32\x83\xca\x0a\xbb\x68\xce\xbc\x4e\x9b\x9f\xed\x89\x42\xb8\x39\x38\x57\xa4\xa7\xd8\x5e\x3c\xca\xb0\x2c\x87\x48\xc4\x4a\x3f\x14\x0f\x8b\x8a\x08\xa0\x87\xfc\x6b\xb9\x27\x1b\xae\xd4\xab\x35\xf8\xed\x15\xd9\x45\xb2\xc1\x71\x26\xa7\x08\x6e\xe4\x14\x39\x1e\xb2\x54\x55\x9e\x10\x0e\x34\x98\xf8\xba\xbb\x32\x77\x7a\xa7\x83\x62\xd2\x0e\xd4\x1f\x78\xac\xc4\x82\x71\x6a\x0c\x73\x7c\xb3\x79\x30\x00\xee\x97\x47\xf4\x9a\x34\x90\xbd\x9c\xee\x80\x40\xe6\x5b\x57\x04\xaf\xec\xca\xf4\x38\x14\x7e\x5c\xeb\xf9\x99\x1e\xf2\x44\x27\x57\x0f\x3e\x95\x67\xf0\x98\xb1\xca\xdd\x0a\x79\x28\x04\xce\x69\x26\x85\x03\xdd\xf0\x8f\x35\x84\x21\x24\x54\xfe\x2e\x3d\xba\xba\xe5\xb3\x0a\xd2\x86\x51\x6b\x35\xde\x51\x66\x93\xd8\x8c\xbd\xa0\x8c\xd3\xc3\xca\xb9\x05\x20\x7c\x4e\xe9\x1f\x79\x8b\xa2\xb7\x15\x23\xca\x3c\x40\x17\xca\x9c\x95\xd4\x01\x4f\xdd\xf3\xd8\xb5\xcf\xfa\xe1\x7b\x74\xfc\x03\x93\x08\xa4\xef\x56\xcb\xf8\x40\x74\x09\x6d\x57\xcd\xf8\x40\x94\x24\x4f\x4d\xf6\x3a\x76\x88\x44\xf6\x3a\x13\x12\x32\x5a\xa6\xf4\x53\x21\xa1\x66\x32\x09\x36\x3d\x37\x99\xc1\xbe\xe1\x4a\x31\x57\xa5\x0d\x3e\x83\x3a\xd8\x26\x55\x9b\x65\x1e\x0e\xff\x0e\x50\x35\x83\xd7\xb6\x5c\x77\x3a\xc3\xee\x7d\x82\x96\x59\xcb\x0d\xcc\x64\x03\x77\x63\xd7\x2c\xba\xd4\xcc\x46\x01\x46\x53\x54\x49\xbc\x41\xb3\x05\x76\x47\xa4\x76\xbb\x74\xe5\x09\x93\xb9\x5c\x08\x81\xc4\xf0\xcf\x88\x07\x92\x50\xd1\xdc\xce\x30\x17\x73\x66\x95\x0c\x31\x54\x5d\xcb\x30\x1c\x8f\xc9\x28\x3c\x2d\x97\x62\x85\x61\x9c\x48\x78\xf6\x9c\x04\x2a\x74\x2d\xe6\x4d\xd1\xa3\x96\x0b\x15\xcd\x8d\x13\xf7\x4c\x6b\x82\x0f\xfa\xa6\x5d\x1f\x9b\xf4\xcc\x8e\xbf\x36\xfe\x90\x66\xfc\xf7\x4d\x43\xfe\xaf\x06\x67\xb8\x72\x3b\x9c\x2e\x0d\xb6\x7c\xca\x4c\x7c\xcf\x0e\x69\xc5\x59\x22\xcf\x05\xca\x4e\x10\xee\x33\x40\xc8\x7d\x30\xb3\xdd\x62\x86\x8c\x48\xcd\xa1\xcb\x32\x23\x46\xda\x82\x0e\xf6\x3c\x3b\x08\x61\x47\x1e\x95\x84\xb1\x91\xc8\x56\xa8\x83\x3d\x4c\x3a\xff\xe1\x38\x4e\xb6\x54\x98\xbc\x21\xf6\x90\x9b\x2d\x96\x3d\x07\x77\x6b\x3e\x88\xad\x43\x79\xe0\x2f\x2a\x9e\x7d\x8f\x23\xda\x99\xa3\x3b\xe8\x3e\xd1\x82\x0f\xbe\x74\x27\xff\xe9\x76\xa5\x63\xbf\xc5\xc4\xe5\x9f\xad\xe9\xf0\x84\xc5\x0a\x7b\xce\x9a\xc2\x6c\x9e\xd7\x06\x13\x74\x65\xad\x6f\x98\x64\x76\x6c\x4f\x56\x5e\x21\xd7\xf5\xe0\xb1\x9c\xab\xf9\x7c\xce\x2d\xf0\x05\x61\x1e\x6c\x3c\x83\xd5\x6a\xf5\x78\x8e\x7d\x5a\x99\xdb\x2b\xe4\xdd\x77\x90\xcf\x9c\x82\x5c\x91\xfa\x01\x11\x5b\xe9\x31\xe1\x0a\xce\xa0\xef\x61\x70\x86\x7d\xdb\xc1\x8c\xfb\x23\x82\x20\x51\xce\xe1\xad\x0a\x56\xd8\xc7\x61\x60\x3b\x70\xfd\xd7\x64\x5f\xfe\x0f\xeb\xd7\xf1\xf0\xdc\x08\x6c\x12\x42\xed\xaf\x0f\xf1\x87\x3b\x3a\xdf\x1e\x54\x66\x0c\xa9\x1d\x55\xda\x24\x9c\xd9\xcf\x99\x7d\x34\x79\x7f\xc2\x24\xaf\x4d\xe1\x02\x13\x04\xc3\x6c\xe5\xcb\x10\x12\x25\x8c\x82\xc0\x63\x16\x0f\x5f\x32\x21\x97\xeb\x04\xb1\x89\xce\xd5\x8d\xbf\xd5\x71\xde\x3d\xeb\xf3\x24\x6e\x91\xb2\xc3\x84\x7c\x47\x3d\x49\x9f\x78\x87\xeb\xab\x35\x48\x5b\x4a\x63\x50\x7c\xac\x52\x7e\x66\x51\xf6\xa6\x68\xd2\xee\x62\x7e\x07\xe1\x7e\x88\xfe\x14\x06\xa3\xd3\xee\xf9\xd3\x18\x80\x42\xbb\xee\x68\x30\x1d\xf7\x2f\xbe\xf0\x0f\x8e\x5c\x4c\xf6\x01\x31\x1e\xfc\xfe\x8c\x41\x67\xba\x1c\x9e\x4f\x2e\x86\xa7\x0c\xd3\xfe\x74\xdf\xc6\x5f\x87\x17\x9f\xfb\x17\x7b\x37\xeb\x9f\x77\xdf\x9f\xf6\xa7\xdd\xcb\x93\xc1\x64\x7a\x3a\xfc\xf8\x71\x70\xfe\xf1\x25\xd3\xd4\x1b\x9c\x5c\xec\x35\x37\xfd\x8b\x2f\x83\x5e\x7f\xef\x76\x72\x8e\xa6\x62\x92\xce\xba\xbd\x4f\x83\xf3\xfe\xb4\x37\xbc\x3c\xdf\x8b\x34\x72\xb6\x7e\x68\xfb\x69\xf5\xd5\x10\xcc\x57\x43\xa8\xed\x03\x61\x38\x7e\xe6\xc2\xcc\x35\xf9\xd2\xbf\x18\x0f\x86\x7b\x2d\xa6\xe1\x78\xda\xbd\xe8\x7d\x7a\x11\x63\x4e\x86\xe3\x5e\xf7\xb4\xbf\x17\x97\xa4\xad\xa6\x67\x83\x73\xbe\x28\xf6\xa3\x4e\x16\x40\xf7\x1f\xaf\x04\x10\x63\xb0\x17\x75\xcb\x30\x78\x31\x80\x18\x83\xbd\xb8\xa3\x0c\x83\xbd\x00\xc8\x84\xfe\x98\x41\x27\xfd\xb3\xd1\x69\x77\xd2\x9f\x0e\xce\xba\x1f\xf7\x62\xba\xcf\x97\xef\xfb\x17\xe7\xfd\x49\x7f\x0f\xe6\xdb\xae\x4b\xb8\x49\x91\xd3\x24\x3e\xa6\xcf\xd4\x26\x83\xf3\x0f\x17\xdd\xf1\xe4\xe2\xb2\x37\xb9\xbc\xe8\x4f\xe3\x73\x34\xfb\x0c\x26\x6e\x33\x9d\xfc\x36\x7a\x96\x4e\xbc\x5a\x5f\x25\xe9\xec\xff\x23\x4a\x7b\x4f\x0c\x4b\x94\xc1\x69\x77\x3c\xde\xa7\xe1\x60\x3c\xfd\x3a\x38\x3f\x19\x7e\x1d\x4f\x99\x54\x3b\x1d\x76\x4f\xe2\x13\x28\xfb\x80\x91\xc7\x59\xa6\x79\x25\xd1\x3f\x3f\x19\x0d\x07\xcf\x91\xef\x3f\xed\x8f\xff\x71\xfb\x23\x26\xd9\xf9\xe5\xd9\xb4\x37\xba\xdc\x8b\x6b\xe2\xb6\x27\x83\xf1\xe7\xe9\xc7\xc1\xfb\x97\xb4\x3d\xeb\x9f\x4d\xcf\x5e\xd6\x34\xcf\x65\xaf\x19\x40\x1e\xd2\x6b\x86\xb3\x61\x1e\xbd\x7c\x70\x92\x9c\xaf\x19\x95\x04\xf1\x9a\xe1\xc4\x26\xce\x2b\x88\x74\x3a\x64\x13\x31\x3c\x79\x19\x57\xf6\x27\x0c\x85\x97\x34\x8d\xb5\xdd\x8b\x86\x2d\x65\xe1\x8b\x60\x0c\x46\x31\xda\xd3\xc1\xf9\xa4\x7f\xf1\xa1\xdb\x7b\x11\x12\xe3\xf1\x27\x66\x7d\x7d\x1a\x5e\x0c\x7e\xef\x9f\x4c\x3f\xf7\x7f\x7b\x09\x94\xcb\x71\xff\x62\x5f\x1b\x33\x6e\x3b\xea\x8e\xc7\x5f\x87\x17\x27\x2f\x69\xdb\xfd\x7d\x3f\x7b\x2d\xd3\x6e\x2f\x2b\x2b\xd3\x6e\x2f\xdb\x28\x99\x65\x2e\xda\x5f\x24\xf5\xba\x93\x6e\xaf\x7f\xfe\x42\x15\x79\xd1\x1f\x0f\x2f\x2f\x7a\xfd\xe9\x68\x38\x3c\x7d\x69\xf7\xe3\xc9\xf0\xe2\x45\x94\xfd\x30\x3c\xdd\xd3\x6a\x4a\xe6\x6b\x32\xbc\xe8\x7e\x64\x68\x9f\x0e\x7a\xbf\x4d\x07\x2f\x62\x8e\xc9\xe9\x78\x3a\xf9\x74\x79\xf6\x7e\x74\xf1\x2c\xbb\x20\x85\x30\xf9\xfc\x71\xda\xbb\x1c\x4f\x86\x67\xc2\x8a\x9d\x5e\xf4\x47\xc3\xf1\x60\x32\xbc\xd8\x6b\x75\xec\x00\x33\x1d\x7f\x1e\x8c\x38\x86\x5f\xfa\x17\x83\x0f\x3f\x0c\x6c\xaf\x3b\xed\xf5\x2f\x26\x83\x0f\x83\xde\x9e\x12\x85\x41\xfd\x34\x99\x8c\x98\xb5\xfb\x8f\xbd\xf1\x61\x2d\xc7\x2f\x6b\x7a\x3e\x7c\x59\x3b\xde\x28\x1e\xf0\xbe\x8d\x07\xa3\xe9\x87\xee\xd9\xe0\x74\xaf\x5e\x37\x4c\x81\xe1\x49\x9f\x3b\xd6\x62\x71\xef\xa5\x3c\x63\xbd\xfb\x0a\x10\x3f\x43\x3a\x3f\x43\x3a\x3f\x43\x3a\x3f\x43\x3a\xff\x8a\x90\xce\xff\xfb\x22\x31\xbc\x8f\x29\xef\x63\x2a\x77\x6a\xcc\x12\xa6\x3c\xfb\xd4\x7b\x45\xd3\x69\x46\x6c\xbf\x06\x4c\x4e\x14\xee\x0d\x88\x41\xb8\x3c\xff\x7c\x3e\xfc\x7a\x3e\x1d\x4f\xba\x93\xcb\xf1\x74\x32\x38\xeb\x0f\x2f\x8b\x72\xf0\x39\xa0\x3e\x74\x4f\xc7\xfd\xd7\x02\xda\x1d\x4b\x2a\x6f\x2d\x43\x5e\xf6\x6d\xf8\x6f\xb8\x47\xf5\xe2\x68\xd7\xcf\xe0\xd2\xff\x78\x70\xa9\xfb\x75\x3c\xbd\xe8\x7f\xdc\x53\xb3\xb1\x56\x3c\x02\xf9\xbe\x7b\xda\x3d\xef\xb1\x7e\x7b\x9f\xfa\x67\x7d\xe1\x4e\x9f\x77\xf7\x72\x97\x18\x30\x6e\xcc\x75\x7f\x7f\x61\xb3\x3d\x55\x44\xa6\xe1\x7e\xaa\xe1\xeb\x78\xfa\x65\xd4\xdb\xd3\xa3\x62\xad\x46\x17\x83\x2f\xdd\x49\x7f\x3a\xbe\x7c\x7f\xde\x9f\xbc\x04\xc0\xe5\xfb\xd3\x41\xef\xc7\xb5\xdf\x7f\xc6\x0a\x43\x78\x01\x88\x4d\x24\xf6\x9e\xfd\x22\x12\x2f\x22\xe0\xbe\xe6\x77\xb6\x6b\xce\x39\x2f\x02\x20\x46\xff\xf2\xf6\x9b\x08\xbc\x98\x00\xaf\x81\x50\x40\x62\x7f\x1a\x6e\x22\xb1\x37\x84\x71\xbf\x77\x79\x31\x98\xfc\x36\xfd\x78\x31\xbc\x1c\x31\x09\x2d\x05\xf4\xe9\x5e\xf1\xcf\x12\x50\xef\xbb\xe3\xc9\x0b\x44\xe1\x06\x94\xac\x1c\x7f\x25\xa8\x57\x8f\xa8\xd4\xdc\x7a\x02\xc4\xe0\xa4\x7f\x3e\x61\x20\x2e\xfa\x1f\xa6\x9f\x07\xe7\x7b\x4b\x9b\x1c\x80\x7d\x6d\x06\x06\x20\xef\xef\x0e\xc7\x22\x42\xce\x6d\xf1\x3d\xc3\xe4\x89\xb0\x7f\x0d\x90\x72\xf7\x7b\xdf\xad\x3f\x8e\xc6\x0f\x6b\xbc\xdf\xda\x2d\x36\xdf\x7f\xd5\x8d\x3f\x4d\x3f\xf7\x7f\xdb\x9b\x9e\x72\x4d\x4d\x3f\x0d\xc7\x93\xa9\x30\xe4\xf7\x62\xa8\x9f\xf1\xc4\x9f\xf1\xc4\x9f\x21\xbc\x7f\x9f\x10\xde\x6b\xd7\xf3\xcf\x10\xe0\xcf\x10\xe0\xcf\x10\xe0\x13\xca\xb6\x7b\x36\x78\x96\x97\xf7\x6f\x9b\xc2\xb5\x23\x66\xf8\xac\x56\x3b\xc3\x85\xcf\x83\xb0\x3b\x52\xb8\x03\xc6\x1e\x41\xc2\x27\xa0\x3c\x2b\x3e\xb8\x03\xc6\xcb\x12\xe1\xc4\x07\x4f\xff\x3f\x14\x17\xcc\xac\x0d\xfe\xa9\xe4\x64\x67\x9e\xfb\x38\x3f\xe3\x8a\xff\x8e\x71\x45\x4e\xa8\xfe\xf9\x97\xc1\xc5\xf0\xfc\xac\xbf\x9f\x91\xf2\x03\x1a\x8f\x2f\xdf\x8f\x7b\x17\x83\x11\x37\x55\xf6\x8c\x97\x71\x00\xbd\xd3\x41\xff\x7c\xef\x50\x5b\xb6\xe9\xb8\xdf\xbb\xe8\xbf\x00\xf5\xd3\x61\xaf\xbb\x77\x14\x42\x0c\x7a\xfc\x29\x0e\xaf\x30\x4f\xed\x7d\xab\xf1\x02\xe4\x7f\x88\xaf\x2b\x60\xbd\xca\xe3\x8d\x99\x40\x58\x43\xbd\x5e\xff\xb4\x7f\xd1\x9d\xf4\x4f\xe2\xd4\xad\x3d\xed\x7d\x01\xee\xcb\x79\x7f\xb2\xb7\xf8\x28\x05\xb2\x77\x58\x23\x6d\xba\x77\xf4\xaf\x84\x30\x32\x02\xfa\x32\x2c\x4a\x41\xfd\x40\xac\xf2\x31\xa8\x17\xf2\xcd\xab\xd0\xca\x42\xf8\x21\xd8\xec\xb9\x37\x91\x6d\xb8\xa7\xf5\x9a\x6b\xba\x9f\xdd\x2a\x28\x22\xa2\x11\x93\xee\xc7\x17\x68\xd6\x1f\x18\x78\xdb\x05\x4f\x66\xa8\x75\x7b\xc2\x77\x7b\x85\x74\x79\x3d\x8a\x79\x30\x3f\x04\xb3\x8d\x64\xe5\xee\xa4\xfb\x5a\x24\xa5\x18\xe4\xb8\x26\xf0\x5e\x38\xd6\x1f\x88\x4f\xbc\x1d\xf0\x82\x83\x08\x02\xce\x87\x8b\xe1\xf9\xa4\x7f\x7e\x92\x40\x1a\xbc\x60\x81\x4a\x64\x36\x78\xed\x72\xf2\x7e\x78\x79\x7e\xb2\x6f\x08\xbd\x30\xdd\xaf\x02\xb4\x15\xa7\x74\xe4\x83\xd1\xfe\x51\x9c\x2c\xe7\xfe\x8b\x61\x0e\x4e\x4e\xfb\xb1\xeb\x32\x1d\x9c\x33\x97\xfa\x72\xd2\x7f\x81\x68\x11\xe1\xd1\x97\xd8\x53\x71\x60\xf5\x75\x5a\x5b\x40\x79\x99\xc2\x14\x6d\x5f\x6d\x53\x0a\x30\x1f\xbb\xa7\xa7\xfd\xfd\x82\xd7\xd9\xe6\xdc\xc0\x1b\x7f\x7a\xc9\x6a\xfb\x41\x00\xc6\x9f\x2f\x5f\xda\x74\xf2\x69\x70\x71\x32\x1d\x75\x2f\x26\x2f\x1e\xff\x4b\x22\x2a\xa2\x79\xbc\x2b\xf5\x42\x1e\xc8\x36\x1f\x8f\xf6\x3c\x32\xf0\x73\x17\xe3\xe7\x2e\xc6\xcf\x5d\x8c\x7f\x9f\x5d\x8c\x9f\xbb\x10\x3f\x77\x21\x7e\xee\x42\xfc\xdc\x4f\xf8\xb9\x9f\xb0\x93\x1b\xd8\xbf\xbf\x66\xbe\x89\xf7\xeb\xae\xbb\x5c\x42\x6a\x3b\xd7\xf2\xa2\xb9\x8d\x2f\x33\x8b\x57\xe2\x73\xb9\xc9\xc7\x0e\x37\x3f\xa1\x55\xcf\xd6\x8d\x3f\xeb\x55\x7a\x67\x59\xf1\x56\x18\x6a\xfc\x05\xad\x02\x0f\x39\x88\x1e\x67\x3e\x83\x95\x5e\xdb\xc2\x66\x80\xdf\xd9\x02\x4a\x5f\x67\x66\x62\xf3\x66\x97\xbf\x3f\x77\xcc\xe9\x77\xd2\x9e\x3b\xea\xdf\xce\x1d\xad\x0e\x7e\x05\x4d\x50\x2b\x01\x57\xdf\x6b\xa8\xc3\x3f\x23\x4d\x0c\xb3\xec\x1b\xc4\x1f\x30\x19\xce\xd9\x40\x93\x05\x9a\x1d\xe2\x3f\xfe\xd5\x43\xfc\x3b\x68\x94\x0e\x71\xcb\x1d\x3f\x7b\x53\xb3\x74\xa8\xe9\xfe\x96\xbc\xba\xe8\x2f\xcf\xbd\xc6\xa6\x70\x8b\x4d\x76\x07\x0d\x86\xd6\xb7\xab\x17\x5c\xc5\x12\x64\xae\x19\x8d\x6f\xe9\xd8\x80\xfb\xc7\xb7\x42\x4d\x83\xe2\x53\x7c\x0b\x49\xcf\x0e\xa1\xa6\x5f\xbd\xfc\x52\x85\xfd\xae\x51\x10\x78\x55\xb8\xec\xaf\x20\x7f\x8e\xd5\xab\xab\xe4\x86\x82\x2c\x7e\x1d\x35\xfb\xa4\xae\xe5\x97\x1e\x1b\xe2\x43\x8f\x66\xee\x43\x8f\x99\x45\xc6\xbf\x1d\x16\xc8\x2b\x25\x1d\x8f\x8c\x67\xfd\xbb\xc0\xf6\x5d\xfe\x15\x7e\xf1\xa9\x78\xfe\xe5\xf9\x0f\x98\xa8\x20\x21\xea\xd6\xca\xf1\x17\xf4\x37\xaa\xef\xff\x25\x44\xfe\x71\x3f\xa0\x2a\x93\x5b\x9c\x7c\x6c\xd5\x11\xd4\x51\x6e\x91\xe7\x31\x8d\xc7\x3f\x59\x2a\x3f\x5f\xca\xe8\xa5\xac\x6c\xdf\x5e\xf0\x3b\x54\xe2\x36\xfc\xfb\xa7\x61\xf2\xf1\x53\xfe\xb5\x53\xf9\xd9\x54\x71\x8d\x24\xaf\x8c\xe7\xca\x2d\x26\xd7\x1e\xb6\xdd\xcc\x37\x4f\xbf\x2e\xa1\x9f\xfd\xe6\xeb\x66\x15\xa0\x84\x78\x05\x63\x55\xbc\x8a\x42\xae\x86\x93\x1d\xdb\x99\xf8\x76\x5f\x14\x32\x2c\x86\x74\x09\x49\xa8\xd8\x04\xc6\x5b\x9d\x69\x8d\xdc\xf0\x94\x59\x44\x95\xc2\xee\xa7\x82\x89\x32\xb3\xaf\x39\xf2\x14\x97\xb4\xb2\x7d\x57\x29\xb5\x05\x0c\xe5\x03\x26\x0a\x17\xe2\x77\x34\xb2\x3d\x65\x09\xbd\x40\xc1\x7e\x61\x52\x9d\xe4\xd3\x83\xff\xf4\x0b\xb7\xb9\xe7\x44\xc6\x0d\x82\xb7\x6a\x2a\x52\xfe\xf1\x3c\x91\x92\xbf\x39\x32\x2f\x22\xe8\xc6\xfa\x2b\xf9\x6c\xe1\xbd\x0b\x4e\x8c\x70\x01\x46\xc6\xd0\xfc\x08\x46\xc6\xd7\xba\x0b\x46\xc6\x88\xf6\x33\x5f\x2d\xfc\x36\xf5\x17\x4b\x1c\x66\x3f\x9a\xa7\x28\x46\x09\xb3\xc7\x5f\x0c\x17\x5f\x35\xee\xd4\xaa\xc1\xdd\xba\xb4\xf1\xc6\xa0\x14\x23\xf3\x10\x6b\xc6\x87\xc2\x37\xf2\xf8\xa7\x8a\x03\x9b\x40\x9f\x66\x3f\x46\xbe\x59\x0d\xf9\x88\x22\xdb\xcb\x7c\x08\xfd\x59\x38\xec\xc4\x49\x7c\x11\x9a\xda\x33\xfe\x21\x69\x4b\xad\xaa\x57\x45\xfc\xfe\x63\x6e\xb3\x7f\xaf\xea\x8e\x7f\xa2\x91\x40\xbf\xa4\xfb\x07\xf9\xa9\x75\x7e\x9f\x57\xa7\x4e\xe0\x6a\x6d\xb8\x36\xb9\x56\x14\xe5\xdf\x61\x92\xf7\xc2\xe5\x07\x4c\xb6\x39\xab\xd9\xf5\xda\x0f\xe9\xf6\xd9\x93\xde\x64\x93\xfe\xd7\xe2\xb7\xb1\x21\xdc\x2e\x76\x4d\xb3\xf0\x05\xda\x9a\xbe\x71\xed\xbc\x59\xdf\xbc\x85\x43\x7c\xfb\x74\x7a\xc9\x3f\x41\x9b\x7e\x2a\xd6\x2c\xdc\xaa\xd1\x8c\xef\xdb\x30\x5b\x99\xcf\xd2\x2a\x03\x3f\xa4\xb6\xe7\x89\xaf\x5a\x3b\x78\x15\x78\x90\x42\xa0\xdc\xe3\x48\xca\xb3\x5b\xc5\xf1\x70\x28\x3e\x8c\x3d\x23\xf8\x96\x89\xd3\xe7\xde\x6a\x9f\x8c\x9b\xee\x1a\xf7\xe1\xff\xfa\xb8\x97\x76\xa8\xcc\x6d\xe4\x41\x37\xf9\x18\x78\x08\xc5\x90\x3d\xbc\x08\xb9\x82\x5b\x61\x02\x15\x66\x00\x10\x71\x35\xc0\x9e\x33\x80\x60\xc1\xb4\xbc\xf7\xef\xb4\xc2\xcd\x2d\x68\x05\xf9\xf5\x85\x21\x85\x81\x0a\xcc\xa3\x0d\x0d\x90\x7b\x2f\xaf\xb8\x8e\x87\x55\xfa\x59\xdf\xf7\x7f\xbf\xde\x6e\x53\x02\xdf\xa2\x06\x5f\x3c\x80\x94\xdd\x7f\x19\x5f\x2c\x39\xa6\x36\x85\x2a\x20\xc6\x02\xd2\x31\x85\x41\x2f\x22\x6c\xdd\xf3\x62\xcd\xcf\x5f\xad\xc1\xcd\xef\xac\x4d\xed\x17\x47\x9e\xfd\x26\xbc\x3d\xcb\xbb\x38\x97\x7c\x2e\x3c\xbc\xa8\xac\xb0\x8f\x28\xb3\x63\x6a\x7c\x64\xdd\x53\xcc\x66\xc1\x0e\xef\x7d\x47\x2d\x37\x97\xc5\x10\x6a\xc5\x31\x78\x78\x31\xa6\x04\xda\x2b\x15\xcc\x0d\xcf\x61\xd3\x69\x02\x64\xac\xc2\x45\xf8\x17\x3d\x8b\x2c\xd9\x8a\xac\xe0\xba\xf6\x06\xbd\x6c\x0f\x12\xaa\x6e\x10\x89\x17\xf2\xdb\x54\x53\xda\x00\x75\xb2\x84\x25\x06\x52\xc1\x98\xba\x45\x74\xa9\xd8\xcc\x5c\xdd\x30\x31\x72\x1f\xa0\x17\xdf\x95\xdf\xb4\x21\xe8\xd2\xa6\x05\x80\xd2\x98\x61\x56\x03\x74\x15\x37\x22\xcc\x9a\x4a\x8d\xaf\xac\x85\x46\x99\xc5\xb5\x61\xa6\x09\x03\x0c\xfb\xa5\x46\xda\x6e\xd3\xaf\x74\x81\xc8\xaf\x65\x4b\xda\x87\xd9\x6f\x66\xcb\xb2\xa4\xa8\x95\x5e\x5b\x54\x4b\x8c\xd2\x43\xa0\x9e\xe2\x45\xa8\x6e\xfa\x56\x47\xc0\x87\xa0\x2e\x2f\x63\xca\xb1\x15\xa8\x99\x9b\x08\xb4\x8b\x9d\x99\xd5\xb2\xde\x4c\x13\x24\xf1\x9f\xf8\xfb\xce\x85\x2f\x5e\xd7\x76\xb0\x72\x1d\x6c\xf3\x23\x40\xad\xf6\xbc\xef\x5c\x6f\xb9\xa0\x36\xb5\xe3\x72\x8e\x07\x40\x39\xb7\x29\xcb\xdc\x78\x0f\xe6\x5e\x36\x54\x50\x6b\x64\xee\x63\x28\x4c\xba\xbc\x4f\x7d\xcb\x4a\x6d\x3c\x67\xa5\xc6\x63\xa9\x6f\x5f\xa8\x8d\xfc\x42\x65\xad\x6d\xb8\xe9\xbe\xd2\xe7\x5f\x65\x20\x31\xf0\x63\xaf\x31\x73\xa5\x81\xbf\x71\xa5\xc1\x2d\x9c\x85\xd8\xb9\x86\x74\x0c\xc9\x0d\x72\xa0\x05\x81\x9f\x9b\x5b\x4b\x55\xc5\x35\x8f\xe2\x47\x60\x2f\xe0\x84\x49\x64\xf1\xb8\x82\x61\x68\x2f\xb8\x93\xcc\x9e\xd8\x08\xf8\x65\xaa\xe7\xc6\x3f\xf8\x3d\x47\xfc\x8a\xc8\x88\xcb\xd6\x28\xb4\x1e\x56\xe1\xa2\xa3\xaa\x20\xe4\x8f\xec\x97\x13\x91\xd1\xd2\x0e\x21\xfb\x3d\x47\x3e\x0a\x97\xd0\xed\xe1\xc8\xa7\x9d\x2a\xa0\x98\xda\x9e\x7c\x58\x03\xdf\xe8\x8e\x46\xd3\x8b\xe1\xe5\xa4\x3f\xb6\x96\xc6\xdf\x19\x2e\xac\x25\xef\xfa\x87\xdc\xbf\xe0\xe7\xef\x5f\xf0\xf7\xbb\x7f\x61\xf3\xd2\x47\x66\x13\x7e\x85\xb3\x31\x9f\x5c\x4d\xdf\x89\xe2\xfb\x8b\xee\xf9\xc9\xe0\xfc\x63\x11\x4f\xaa\x3f\xc0\xcc\x9c\xd3\x18\x5b\x63\x46\xc4\xed\xe7\xe2\x0e\x7a\x00\xcb\x2f\x82\xcf\x34\x28\x7d\xbf\x16\x01\x8f\xdc\xb8\x19\xa2\x76\x10\x9c\xd8\xd4\x96\x3c\xc1\x34\xe2\x28\xc3\x12\x9a\x6e\x04\x28\x80\x9a\x56\x05\xef\x8d\x0b\x5d\x2b\xc0\xd0\x33\xe3\xcb\x0e\x85\x1e\x1c\x30\x55\xec\x78\x91\x0b\x43\x2d\xf9\x86\xa7\xfe\x0e\x6e\xb0\xdc\xcd\x58\x7e\xdd\x73\xa3\x85\x7d\x1b\x96\xd4\xee\x7e\x1d\x17\x6b\xf2\xb4\xe8\x92\xba\x22\x5d\x7a\xa3\xb6\xfc\x02\xb8\x7e\x70\xa0\x6d\x36\x38\x91\xaf\xd6\xe9\xc5\x9f\x39\xd2\x3e\x83\x15\x36\xd7\x98\xe1\x60\xdf\xe7\x97\xaf\x6e\x99\x27\x21\x3e\x38\x26\x0e\x0c\x43\x7e\x39\x69\xe6\x93\xe5\xd4\x70\x6d\x6a\xeb\xfa\x31\xe2\xf8\xf2\x55\x67\xf8\xf0\x8e\x6a\x48\x07\x30\x59\x93\xe2\xba\x5b\xa4\xeb\x6b\xbd\xf4\xc2\x4f\xce\x5b\x05\xdc\x42\xe8\xbb\x67\x02\x02\x97\x54\xa1\xaa\xaf\x81\x59\xad\xca\xd8\x58\x49\x7d\x3a\xf4\x7b\xcc\x7a\xce\x41\x56\xc3\xc8\x61\xb8\xcf\x23\x4f\x7d\x63\x59\x30\x95\x02\x86\x58\xfd\x07\x07\xaa\xb0\x46\xb7\xbd\xde\x76\x47\xe9\xc6\xc2\x5a\x83\x26\xac\x67\xa9\xe3\x60\xff\x06\x12\x7a\x8a\x17\x42\x55\x14\xef\xd3\x15\xeb\x5a\xed\x5f\x5c\x0c\x2f\x54\xcb\xb2\xe0\xe3\xa3\xfa\xa1\x3b\xe9\x9e\xf2\x87\x77\xec\x85\xda\x51\x65\x10\x5f\x94\xf1\x1b\xd1\x60\xd2\x47\x86\x30\x3b\x3a\xf0\xf0\x82\xb7\x36\xe8\x7d\x00\xdf\xc9\x18\x60\x32\xce\x58\xf4\x59\x90\x93\x93\x3d\x33\x7b\x93\x97\x3d\x3e\x6e\xa9\x0c\x1e\x24\x75\x3b\xb2\x95\x7c\x34\x42\x0f\x39\x50\x63\x46\x00\x8f\xf2\xc9\x6b\x65\xb3\x33\xa1\xc9\x16\x9e\x78\xd4\x01\x33\xb3\x43\x6a\xaf\x82\x72\x58\x26\xb3\x10\xd6\x7a\x67\x13\xef\x55\xb8\xb0\xf2\x0d\xc0\x46\x0d\x41\xc1\xb8\x92\x78\x12\x75\xa4\xc4\x96\x6f\xb8\x80\xe7\xc3\x0a\x1f\x1f\xbf\x5d\x81\x92\x89\x38\x38\xc8\xb4\x4b\xaf\x7d\xde\x63\x2a\x13\xe4\x92\x92\x81\x7b\x67\x65\xa1\x72\xdf\x60\x38\xdf\x06\x54\xd7\x41\x96\x99\x2d\xcb\x2a\x1d\x6e\x81\xbe\x39\x75\xb6\xd9\x26\xd5\x6d\x4f\xe3\x27\x6f\xdf\xeb\x64\xd6\x4b\x29\x06\xc5\x79\xc9\xa3\x70\x66\xd3\xa5\xb1\xb2\xef\xb4\x2a\x28\x12\xe0\xe9\x59\xd0\x37\xc9\x9c\x8e\xa1\x84\xa0\xef\x4a\xba\x10\x03\xe9\x54\xf9\x85\x83\xe9\x82\x2d\xf1\xb7\xb6\x2f\x2a\x05\x66\x08\x90\x9d\xb2\x54\x9e\x6c\xa5\x90\x0a\x09\xc1\x44\xed\xc0\xff\x2e\x03\xf0\xf8\xf8\x2c\x32\xc7\x95\xd4\xce\x36\x4c\xde\xa9\xb2\x40\xed\xa8\x3e\xa6\x95\x90\xda\x84\x42\x57\xcd\x0f\x98\x01\xcb\xec\xc1\x95\xa8\x11\x29\x45\x48\xe4\xfb\xc8\x5f\xec\xc0\xe8\x24\x17\x64\x66\xfe\x8c\x9a\xbb\x14\x3d\xb1\x1f\xf8\x26\x4a\xee\x55\xa9\x55\x00\xd4\xc4\xe9\xa2\x78\xb3\x45\x56\x3b\x02\x55\x41\x21\xf3\xa1\x02\x82\x17\x04\x86\xa1\xa1\xea\x9d\xe7\xcd\xe2\xff\x32\xce\x29\x8e\x1c\xe5\x27\x39\xe7\x7f\x13\xdd\x4c\xe0\x46\xd5\x3b\x37\x18\xb9\x4a\xb5\xec\xb6\x2f\x5a\xb6\x37\x04\x73\x7b\x43\x4c\xb1\xc4\x17\x6e\xdf\x1b\xfc\x46\x4e\xba\x65\x9f\x88\xe6\xf7\x89\xe8\xf5\xa2\x72\x8d\x9c\x6b\xce\xcc\x95\x08\x55\x84\x73\x5d\x89\x29\xbf\xeb\x1e\xb0\xa6\xd8\x1e\x6a\xc7\xdb\x43\xc5\xdb\xdc\xd2\xbb\xaf\x79\x58\x41\x11\xc1\x85\x78\xa5\x81\xf8\x5e\x30\x11\x88\xd8\xb8\xa5\xb8\xd8\xce\xb5\x7d\x71\xe9\xd7\xd6\x66\x4f\xdd\x43\x26\xae\x16\x83\x37\xfc\x36\x25\x53\xbd\x02\x7f\xf1\xb0\x63\x7b\xe8\x3b\x64\x53\xa8\x41\x0b\x6b\xdf\xd4\x8e\x98\x82\x84\xf9\x15\xc6\x04\xca\x2d\xf4\x1c\xbc\x82\x0a\xb7\xcb\xff\x19\xd5\x1a\xe6\xbc\x79\x68\x1e\x9a\x4d\x58\xb5\xdb\x6d\xd3\xb5\xa1\x6b\xd7\x0e\xab\x47\x6e\x7b\xd6\x38\x72\x8f\xea\x6d\xbb\xd1\x6a\xd8\xb3\x79\xb5\xd9\x10\xb5\x5b\xcd\xe6\xa1\x69\x9a\x47\x47\x47\xcd\x6a\xed\xd0\x3c\xac\xb5\xdb\x1d\xc1\x7e\xc8\x5f\x28\x2a\x50\x3b\xfc\xbb\x4b\xa3\xe1\x29\x3f\x38\xd4\x51\xb0\x5f\x2c\x9d\x9a\x1d\xf5\x8a\x69\xae\x7f\x46\xf3\xf9\xdc\xad\x8a\x3f\x6a\xfc\x6c\xca\x67\x3d\x37\x15\x40\x5d\xd1\x4a\xad\x5a\x9c\x92\xf4\xe1\xce\xab\xd4\xe5\x65\x66\x8e\x47\x4e\xf9\x9d\x44\xdb\xf6\xe3\x40\xf6\x46\xf3\x18\x96\x92\x81\xd4\xe6\x34\x91\x5c\x33\xc1\x8b\x85\xb8\xe3\x6d\x83\x6c\x66\xf2\x4b\xcd\xb3\x85\xbc\xae\x3b\x89\x43\x15\x4b\x54\xa0\xb2\x05\x8c\x9c\xfc\x1b\x67\x63\x47\x32\x77\xc7\x76\x72\x33\x5c\xae\x7e\x0e\x00\x85\x77\xf4\x39\x88\x4a\x3e\x4c\xa6\x4b\xa8\xb6\xdd\xb3\xdb\x8e\xb7\x3d\x27\xf6\xec\x54\x5c\x6f\x28\xe7\x97\x5f\x2f\xd7\xe5\xbb\x55\x12\x64\x2e\x24\xc2\xaf\x45\x5f\xc2\x15\x43\xc8\xb5\xc9\x35\xbf\x7d\x3b\x8d\x34\x14\xb8\xba\xa6\x5e\x5d\xad\x9f\xda\x31\xfd\xed\xdc\x61\xd6\x02\x04\x87\x20\xb7\x71\xca\xaf\x92\x06\x34\x5b\x6e\x6e\x86\xb3\x6b\x9b\xd1\xec\x7a\x26\x32\xb6\xac\xc9\x9b\xde\xc6\x27\x37\x5a\xb3\x78\x3d\x76\x4b\xb4\x49\xe2\x61\xbb\x82\x48\x85\xeb\xb4\x65\xf0\x8b\x17\x1c\x66\x43\x5f\xd9\xe0\xb2\xbc\x98\x53\x5e\x8a\x8d\xa0\xd8\x60\xf4\x17\x3c\xba\x65\x23\x9f\x09\x90\x76\x59\x77\xbc\x45\x0d\x10\x08\xcc\x06\x48\xa2\xf9\xe9\xb4\xd4\x01\x86\xa0\x09\xea\xb9\x37\xb9\x1b\xea\x1a\xa0\xec\x22\xc5\xe2\x2d\xdc\x83\xb9\x5a\x30\x3d\x0b\xba\xa9\x2c\x29\x82\x37\xcc\xe8\xb4\xad\x8d\x38\x09\x82\xbf\x7f\xd1\x68\xaa\xc1\x74\xf6\x90\x0d\xae\x31\xb8\x74\xa2\x35\x4b\x93\x69\xa8\x51\x66\xcd\x68\x7a\x36\x5f\xa3\x9e\x0d\xb3\x4b\x99\x01\xd4\xf8\x5a\xb0\x5d\x69\x1d\x54\xda\xc0\xc5\x2a\x79\xa9\x01\xd4\x34\x34\x1b\x87\x21\x8d\x7c\x38\x32\x8c\x82\x00\xcb\x30\xf6\x6e\x50\x6f\x9e\x0f\xab\x70\xa3\x35\xbf\xb5\x7a\x61\x07\x62\x1f\xf9\xd2\xb8\x06\xbf\xc9\x9b\xf0\x46\xc6\xa0\xfd\x1d\x8c\x8c\xae\x37\x02\x23\x03\x1e\xd5\xc0\xc8\x98\x0c\x56\x60\x64\xf4\xee\xbf\xb2\x46\x9f\x07\x60\x64\xb8\x1e\x18\x19\xe3\xc6\x3d\xab\xfe\xe7\x5f\xc0\xc8\xf8\x7b\x78\x08\x46\x06\xb5\x59\xc5\xcb\xeb\x2e\xf8\x0b\x58\x19\xd1\x15\x08\x50\x20\x3b\xbc\xc9\x5c\x8d\xfd\xb7\x15\x74\x91\xad\x68\x2b\xfb\x4e\x5e\x2f\xa7\x1c\xb6\x8e\x82\x3b\xfd\xc1\x40\x2b\x7b\x01\x53\xde\x2e\xbb\xa7\x4d\xde\x9b\x5c\xab\x56\xcb\x2e\x3a\x5e\xaf\x77\x40\xf7\x44\x30\xaa\xc2\x7b\x29\xbd\x41\x8e\xd7\xaf\x73\xd0\xd9\x7e\xd6\x6b\x43\x6a\x1f\x63\x65\x23\x9f\xfd\x28\xbd\x7c\x1b\xf9\x15\xd9\xac\x51\xdd\xba\x91\x9e\x89\xd2\x2a\x46\x32\xd4\x78\x5c\x8e\xed\x39\x9a\x59\xad\xde\x2c\x95\x8a\x52\x6f\x55\x83\x3b\xfd\x58\x6e\xd1\x53\x1c\x74\x1a\xc1\xdd\x71\xa6\x9b\xe6\xe1\xd6\x6e\x0c\xdf\xbe\xd9\xd8\xdc\xaf\xef\xac\x2c\x6f\x15\x8f\xaf\x25\x2f\xee\x2d\xaf\x8d\x30\x10\x77\x0f\xee\x24\x50\x1e\xdb\xb5\x11\x1b\x1e\x15\x17\xdd\xec\xba\x77\x59\xdc\x9e\x27\x36\x72\xe3\x21\xf3\x1d\x5c\x93\x5f\xdf\x9c\x95\x8a\xb9\x87\x4a\xbc\x44\xb7\x91\x44\x50\xb5\xcd\x37\xdf\x25\x19\xcb\xaf\x15\x5c\x36\x9e\x18\x4f\x55\x5c\xb2\x4c\xd7\x9a\x0e\x42\x68\x45\xda\x51\xdd\xac\x1d\xea\xc0\x61\xbf\xeb\xad\xc3\xb6\x0e\x3c\x68\x7d\x7b\x08\x6c\xba\xe4\x71\x63\xbc\x0a\xb0\x0f\x7d\xda\x59\x80\x78\xc3\xba\x53\xf6\x7a\xb0\x06\xb2\xf4\x16\x7d\xb7\x89\xab\x02\x0f\xdb\x6e\x2f\x6e\x52\x30\x45\x95\x11\xc1\x2b\x14\x42\xc3\xf6\x3c\xed\x5b\x64\x40\xed\xb0\x51\xd3\x01\xfb\xd1\x6a\x9a\xfa\x95\x6e\xd0\x25\xf4\xb5\xc8\x98\x21\xdf\xd5\x22\xd0\x38\x64\xc5\xb2\xb4\xcc\x5d\x35\xbe\xf2\x7e\xcf\xb0\x1b\x79\x50\x84\xa9\x04\x3e\xf6\x6d\xf8\xf6\xd5\x38\x99\x87\x4d\xf1\xa3\x6d\x1e\x16\x91\x6b\x37\x59\xf1\x2e\xe4\xba\xb7\xe1\x56\xfc\xbe\x47\x04\xfe\x40\x0c\xeb\xed\x22\x82\x47\xed\x6a\xbd\xbd\x1b\x41\x86\xc5\x36\x14\x45\xd8\xf6\xf5\x38\xb6\x1a\x8d\x92\xc9\x6b\xb0\xe2\x5d\xb8\x89\xd0\xf0\x56\xe4\x36\x1c\xa4\x0c\x53\xda\x30\xa9\x25\x63\xe0\x95\x5b\x44\x97\x95\xeb\x68\x06\x89\x0f\x29\xcc\xd5\x7e\xf9\x95\xd6\x7b\xec\x03\x11\x1c\x51\x48\xf8\xee\x4f\x61\x9f\x65\x69\x87\x93\xeb\xc5\xc8\x8b\x42\xeb\x8d\x59\xba\x2f\x12\x52\x4c\xe0\x65\x08\x49\x69\x44\x54\x7f\x48\x42\x1f\xcf\xdb\x40\xd9\xb5\x57\x12\xdf\x59\xf1\xa5\xc7\x6f\x63\xe9\x9f\x4f\xf8\x51\xa5\xcd\x3d\x93\x1b\xe7\x13\x0e\x69\xba\xff\x51\xb2\xd3\x91\x22\x65\xdf\xa0\xc5\x96\xa8\x13\x6f\x25\x26\xc7\x88\xeb\x69\xdf\xe0\x55\xda\xda\xb3\x23\xdf\x59\x7e\x11\x74\xfc\xea\x04\x25\x43\xbb\x45\xbe\x8b\x6f\x0d\x1c\x40\x5f\x53\x97\x94\x06\x61\xe7\xed\xdb\x7c\x00\x41\xe0\x0b\xd4\xb7\x11\x7a\x6b\x07\xc1\xdb\x78\x17\xba\xc2\xcc\xf3\x39\x26\xab\xb7\xaa\x0e\xd4\xe9\xcc\xb3\xfd\x6b\x35\xed\x9c\xc0\x7c\xf7\x72\x25\xfc\x4f\x60\x20\x02\x10\x21\x34\x06\x7b\x67\xa7\xca\x08\x44\xdf\xf8\x50\xd5\x9f\x9f\xaa\x5a\x08\x41\xdc\x3a\x41\x85\x40\x61\x80\xed\x88\x3f\xd4\x6b\x22\xfe\xd0\xd8\x11\x7f\xc8\x7b\xc1\xb3\x52\x2f\x38\xeb\x2a\xda\x44\x54\x75\x11\x73\x79\xe5\x4d\xdf\xf2\x2a\xf1\x7a\x35\x0d\x3d\xc4\x9b\xed\x6a\x9c\xc0\xa5\x02\xb5\xca\xdb\x33\x57\x4c\x5e\xd7\x3c\xb3\x79\x2a\x23\x50\x51\xbc\x6b\xce\x8b\xe4\xf5\xf6\xdc\x77\x44\xce\x75\x2e\x0a\x41\x1f\x1f\x35\x2a\xa2\x10\x42\xfa\x65\xe3\x0d\x66\xc3\xb5\xe1\xcc\x6d\x35\x5b\xce\x7c\x5e\x9d\xb9\xad\x16\x6c\x34\x6b\x6e\xd3\x85\xb3\xfa\x6c\xd6\xa8\xba\x8d\x59\xab\xd9\x82\x73\x19\x9d\x68\xd7\x6b\xed\x7a\xab\xde\xac\xd6\x1a\xf5\xc3\xe6\x61\xb3\xd5\xe8\xa8\x40\xed\x8c\x27\xdd\x8b\xc9\x74\xd2\xfd\x38\x3d\x19\x7c\xe1\x25\xbd\xd3\xe1\xb8\x9f\x94\x28\x72\x93\x4e\x24\x73\x4c\x6c\xff\x7b\xa4\xf4\xfd\x1b\x44\xb0\xcf\xe3\x64\x27\x90\x42\x87\x42\x57\xc9\x06\x22\xfe\xa3\xb9\x11\x89\x78\x9b\x94\x88\x58\x44\x2c\x0f\xb9\x93\xce\x67\x32\x73\x25\x7b\x2d\x37\x07\xe8\xf1\x51\x43\x62\x0e\x64\x2b\x81\xca\xf5\x51\xa8\xb8\x71\xe7\x3c\x26\x23\x0d\x0f\x31\xde\xa3\x3a\x3c\xb4\x1b\x73\xd3\x3e\x3a\x32\x5b\xb6\x53\xb5\xe1\xdc\xae\xdb\xf3\x9a\xdb\x6c\x56\x5d\xe7\xb0\x7a\x58\xb7\xe1\x6c\xee\xca\xb9\x6c\x34\xdb\xad\x66\xfd\xb0\x7e\xd4\xae\xd6\xcc\x76\xcd\x3c\x6a\x99\x1d\xe5\x37\x1c\x29\x4b\xfb\x86\x03\xf6\x45\x3f\x14\x2b\x76\x32\x23\x87\x0a\xcc\x4c\xc4\xed\x12\x39\x4b\xc5\xc1\x91\xe7\x2a\x33\xa8\x40\x9f\x93\x4a\x64\x14\x97\xcc\xa1\xed\xbb\xf2\xd7\xe7\x44\x1d\x28\x1f\x09\x72\x95\x78\xcb\x4d\x79\x7f\xaf\x44\x21\xf2\x17\x65\xcd\xe3\xa4\x36\xbe\xe2\x52\x94\xe2\x68\x23\x4f\xed\xb5\x95\x78\x4d\x73\x24\x64\x84\x39\xdb\x5f\xbc\xf8\x79\x74\xd7\x85\x2e\x72\x78\x9a\x0d\x81\x21\x8e\x88\x03\x95\x00\x63\x2f\x34\x94\xa1\xef\xb0\x01\xd9\x33\x36\x1e\x5c\xd2\x1f\x28\x43\x51\x24\xed\x84\x8a\x9d\xed\x91\xd1\x88\x60\x8f\x61\xe6\x43\x45\x2c\x6a\xef\x3e\x4e\xd0\x59\xde\x07\x6c\xf0\x21\x26\x8a\x67\xdf\x43\x62\x70\x1a\x24\xe9\x3c\x24\xf2\x37\x61\x71\x2b\x3a\x54\x66\xf7\x32\x0d\x28\x3b\x5d\x23\xec\x86\x40\xc1\x24\x99\x2c\x81\x91\x12\x05\x21\x8f\x96\xe4\x60\xc5\x59\x40\x74\x49\x70\xb4\x58\x72\x74\xbe\x9c\xdd\xda\x04\x8a\xe1\xfc\x33\xaa\x99\xb5\xda\x26\xb1\x64\xa9\x24\x19\x27\x2a\x43\xf2\x1e\x47\x44\xb1\x83\xc0\x63\x13\x8a\xb0\xcf\xe6\x37\x44\x2e\x4f\xc3\x0b\x61\x26\x2f\x7c\x27\x07\x28\x28\xe4\x68\x04\x04\xce\x21\x21\xd0\x55\x6e\xed\x7b\x71\x99\xbb\x1f\x46\x2b\xb8\xa5\x35\xf6\x93\x19\xc8\xf0\x67\x68\xfc\xd3\x67\x4b\x54\xac\xbf\x19\x65\xd2\x6a\x46\xfd\x4a\x40\xd0\xca\x26\xf7\x2a\xa8\x01\x95\x1b\xfa\x2a\x50\x5b\xcc\xf9\xe2\xde\xb6\x74\x01\xd3\xb2\x8c\x98\xfa\xa6\xd2\xfb\x34\xa0\x36\xc3\x77\x22\xc4\x95\x38\xd8\x2a\x10\x47\x94\x80\x8a\x79\xb4\x20\xe4\xad\xfd\xc5\x19\x76\xb9\x3c\x94\xbf\x7a\x4b\xdb\x5f\xc4\xf1\xb2\xd7\xe0\xe5\xa2\x90\x73\xa8\x9a\x45\x71\x49\xe0\x5c\x05\x89\x2e\x74\xb1\x13\x1a\x37\x2b\x46\x56\xc3\xc1\xab\xb7\xd0\x7f\x2b\x88\x5c\xe1\x73\x59\x49\xe7\xb2\xc2\xe6\xf2\x2d\x17\xe6\xc6\x92\xae\x3c\x2e\xdc\xc9\x02\x32\x0d\x20\xb5\x63\x56\x53\x04\x38\xa8\xc8\x20\xe9\xf3\xfb\x94\x64\x7a\x7b\x68\x54\xdf\x8a\x0a\x95\x2d\x86\xe2\xdb\x8f\x97\x83\x93\x4a\xcf\x6c\xd5\x1b\xed\x6a\xaf\xf2\xbe\x5f\xad\x57\x1a\x27\x1f\xfa\x95\xa3\x6e\xb5\x5e\x69\xd6\xcd\xd6\x49\xbd\xd6\x68\x1e\xb6\x9a\x5b\x91\x7d\x3a\x0c\x58\x38\x38\x91\x4b\x64\xdd\x48\x0c\x14\x39\xaa\x3c\x48\x74\xee\xf2\x98\x0f\x9b\x72\x50\xb4\xc7\x69\x6a\x50\xd1\x8c\xd1\x69\x9c\x8a\x64\x18\x7d\xbd\x19\xe4\xab\xf3\xb8\x21\x7b\xa2\x9f\xbe\x6a\x0d\x11\x50\x9c\x5e\xf2\xb4\x3a\x8e\x0a\x0f\x67\x9d\x4f\x83\xed\xb9\x66\x69\x78\x31\x50\xe3\xf0\xe3\x61\x31\xfc\x78\x14\xbf\x97\xa1\xc4\x58\x8d\xb7\x9e\x33\xaa\x4d\x83\x50\x13\x23\xe1\x99\x76\x55\xa0\x2a\x3d\x99\xe3\x08\xcb\x64\xe3\xd6\x74\x42\xd3\x8c\x71\xe2\x80\x0a\xe7\xe9\xcc\x7a\x1a\x32\xe5\xcf\x71\xfe\x21\x5f\x75\x99\xa8\x66\x52\xa1\x99\xab\x10\x07\xc4\x93\xd7\x2d\xa0\xf2\x23\x40\x32\x86\xca\x47\x9d\x5f\x99\xa0\xc4\x2b\xa2\x59\x6f\x01\x16\x48\x68\x1e\x02\x35\x7f\x7e\xcc\x3c\x02\xea\x40\x68\x53\x5b\x91\xc6\xb9\x38\x95\x48\xf1\x16\x39\xc6\x60\x3f\x9d\x97\x1c\xf7\x98\x21\xdf\xd1\x73\xc8\x57\x6a\x52\x67\x68\x58\xab\x6e\x76\x51\xcb\x91\xa6\x56\x03\xaa\x72\x8e\xa9\x12\x32\x12\xcb\xdd\x42\x17\xcd\xe7\x90\x40\xa6\x2e\x67\x90\xde\x42\xe8\x2b\x93\xcf\x1f\x95\x55\xe4\x51\xe4\x78\x38\x72\x85\xda\xff\xfc\x31\x16\xf1\xef\x94\x53\x68\x13\x5f\x64\x64\xa7\xb9\xb7\x75\xa0\xda\x32\x2e\xcd\xfb\x6a\x00\x95\x1f\xa7\x91\x79\xa8\x6c\x31\xd4\x9a\xb9\x5c\xf1\x42\xf8\xb9\xd6\x02\xea\x8c\xa4\xe8\x1e\x02\x55\x39\xc1\x4e\xc4\x74\x81\x48\x82\xdd\x65\x98\xa4\x18\xc6\x39\xb7\x73\x1c\xf9\x6e\x06\xc5\x23\x8e\xa2\x48\xf4\xe7\x1d\xb4\x63\x1c\x13\x14\xeb\xd5\xdd\x28\xd6\xcd\x04\xc5\x92\xb3\x3d\x66\x26\x00\x9d\x6e\x8c\xd9\x8a\x8f\xfd\x0a\xf2\x29\x5c\x10\x6e\xab\x94\xf3\x4e\xe6\x1c\xd0\xd6\x1d\xd9\x8c\x9e\x3c\x54\x08\xfc\x33\x42\x84\x5b\x2b\xcf\xe7\x4e\x43\x1e\x6f\x4a\x62\xec\x32\xac\x2d\x35\x5c\x76\x91\x14\x83\xe4\xa9\xba\x7a\x63\xf2\xe8\x7d\xb1\xb2\xb9\x39\x03\xaf\x1c\x3c\x0f\xfc\xf7\xec\x10\x32\xf1\x24\x2a\xb0\x11\x14\x4e\x48\x89\x40\xf6\x6f\xd3\x06\x18\x19\xa3\xfe\x12\x38\xd0\xf8\xea\x81\x91\xf1\xf9\x73\x8f\xfd\xfe\xf5\x57\xf6\xff\xd0\x07\x23\xe3\x6c\xf1\x39\x13\x98\x0e\x8c\xd5\xb2\x51\xad\x3e\x2b\xb4\x1b\x33\x86\x91\xf8\x40\x3b\x62\x87\x84\x37\x6c\x05\x77\xc7\x4e\x44\x42\x4c\x3a\x01\x66\xb3\x40\x8e\x03\x1c\x22\x46\xa7\x0e\x5b\xce\x0c\xff\x63\x8a\x03\x1e\xf0\x3c\x9e\x7b\xd8\xa6\x1d\xe6\xb3\xad\x97\xb5\xe7\xc5\x25\xe1\x5a\xd3\x93\x90\x0d\xf2\x1d\xbc\x0a\x6c\x8a\x66\xcc\x9a\xd9\x11\xa7\x99\x6a\xe5\xa7\x4c\xd7\xff\xba\xe3\x9c\x05\x1f\x39\x87\xec\xd5\x55\xfe\xc0\x66\x75\xbb\x47\x9c\xba\x59\xfe\xe3\xa3\xe6\x3f\xcb\xcd\xca\xb8\xa0\xf6\xcc\x69\x37\x67\xf5\x43\xb3\xde\x82\xae\x33\xab\xce\xe7\x87\xce\xbc\x39\x87\xee\x51\xbd\x66\xdb\x33\xe8\xd4\x5b\xee\xe1\xec\x68\x26\xb7\xbc\xeb\xa6\x59\xaf\x1f\xb6\x0e\x9b\xcd\x66\xbd\xde\x3e\x3c\x6a\x37\x3b\xca\xd7\x78\x23\x5d\x1c\x45\x2c\xe7\x68\x79\xc2\x85\xb3\x6b\x62\xc3\x72\x5e\xcb\xb9\x8a\xe4\xf1\x51\x23\xf9\x31\xdc\x40\x12\xf2\x28\x59\x66\x82\x4a\xbc\xc5\x79\xd3\x81\xf3\x76\xa3\x51\x9b\xd9\x8e\x6b\xb6\xe7\x0d\xd3\x6c\x1e\xb5\x1a\x33\xa7\x31\x37\x9b\x47\x75\xc7\x69\xb7\x1d\xd3\x8d\xbd\xc5\x7a\xb3\x76\xd8\xae\xb7\x8e\xea\xb5\x56\xb5\x71\x58\x6d\xd7\xeb\x47\x1d\x7e\x88\x61\x85\x7c\xb4\x8a\x56\x89\x5c\x89\x7b\x97\x3b\x49\xe2\x9c\x66\xf9\x10\x51\x98\xb4\x6a\x19\x87\x51\x3d\x39\xbd\x13\x05\x0b\x62\xbb\xa9\x15\xc1\xe4\x33\x25\xf7\x8a\xbd\xb0\x91\x1f\x1b\xf5\xcf\x36\xee\xa4\x65\xc5\x0c\x22\x13\x14\x55\x1c\xd3\x70\xc2\xd4\x63\x35\xea\x20\xb5\x3f\xf4\xf5\xcb\xd6\x79\xba\xb0\xae\xd6\x57\x20\x28\xe4\xbb\xff\x6b\xd6\xcf\x0a\xbb\xd6\xdc\xc0\xdd\xf7\xf1\xfa\x61\x48\xc8\x77\xc8\xff\xc3\x9a\x1b\xce\xaf\x63\xed\x41\x9c\xe4\x63\x4b\xaa\x6f\xbc\xff\x6e\xcc\x31\xe1\x81\x65\xcd\x83\xfa\x15\x60\x45\x31\xf2\x20\x82\x56\xa4\x35\x1a\x8d\x56\x4b\x07\xee\xbf\xeb\x20\x4e\x0c\xf8\x1d\x04\x10\xac\x8c\xcf\x20\x82\xc6\xea\x2a\x15\x6a\xed\x46\xbb\xda\xcc\xb1\x06\x40\xfa\x03\x32\x5c\x8d\x82\x87\xb2\x30\xba\xbf\x5e\x8b\x78\xb3\xff\xf4\x79\xfa\xec\xc1\x79\x3f\xf2\xbc\x38\x5e\x4c\x63\x7d\xb3\x23\xd1\x8f\xd5\xe7\xb9\xb9\x55\x9e\x43\x2b\x92\x07\xdf\xa9\x6a\x07\x1a\x04\x06\x9e\xed\x40\xed\xad\xf6\x7f\x1f\xff\x19\xea\xff\x1c\xbf\x5d\x94\xd9\xa2\xd0\xa0\xf8\x92\x19\xb5\xe2\x38\x7d\x26\x47\x78\x8e\xc9\xea\x2b\xa2\xcb\xa1\x38\xc2\x0c\xc3\x22\x1e\x80\x66\x6c\xc2\xcc\xf1\x5e\x9e\x72\x9d\x79\xb6\x72\x6f\x75\xae\x61\xed\xef\xdf\x79\x35\xfe\xcb\x92\x25\x6c\xc2\xe3\xe3\xfc\x6b\xc0\xf7\xb7\xb6\x4d\xfb\xa0\x64\xda\x97\xc9\xb4\x03\x02\xb0\x85\xb4\xa3\xc3\xa6\xd9\xd6\x41\x68\x21\xad\xd1\x3a\x3c\xaa\xe9\xc0\xb3\x90\x76\x58\x35\x5b\x87\x3a\x08\x2c\xa4\xd5\xea\xcd\xa6\x0e\x22\x56\xd8\xe0\x85\x13\x0b\x69\x9c\xdc\x3a\x38\x61\xa5\xed\x26\x33\xa5\x56\x16\xd2\xcc\x46\xb5\xd1\xd6\x41\x9f\x81\x3d\x6a\x73\x0b\x97\xf7\xd0\xae\x37\x75\xb0\x60\x15\xaa\xad\x7a\x5b\x07\x4b\x4b\x23\xcf\xdf\x7e\x90\x4b\xa0\x64\xf7\x01\x5a\xd4\xb0\x83\xc0\xbb\x17\x45\x36\x59\x70\xf3\x33\xd4\x75\x03\xba\x5c\x6f\x5b\x9e\x31\x5a\x18\x93\x5e\x1f\x40\xe3\xc6\xf6\x90\x6b\x53\x4c\xfa\x7e\xb4\xb2\xe6\xc6\xcd\xef\x00\x1a\x3c\x97\xf3\x1c\x53\x34\x97\xa1\x14\x4b\x55\xcb\x8f\x41\x24\xef\x50\xf0\xc1\x5e\x21\xef\xde\x3a\x31\x46\xc8\x18\x8c\x6e\x1a\x00\x1a\x7f\x46\x08\x52\xef\xde\x7a\xc0\xbe\x77\x3f\x86\xde\xbc\xf3\xa6\x0a\xe0\x0a\xd1\xfe\x0d\x53\xea\x6f\xcc\x35\x80\x25\x3b\x1e\xee\xbd\x6f\xaf\x90\xf3\x9c\x0c\x4e\xce\xc9\x09\xeb\x85\x22\xdb\xf5\x02\x2e\x50\x48\x89\xed\xd3\x6d\x49\xe4\x3c\x28\xcf\x18\xf5\xdc\x5e\x41\x0b\x1a\x21\x85\x01\x48\x0a\x3f\x12\x1c\x05\x16\x4c\x7f\xcb\xf4\x7c\xee\xad\xc8\x16\xe2\x41\xbc\x80\x6c\x34\x1f\x90\x07\x07\x2b\xa1\x70\x2c\x58\x2c\x2b\xad\xda\x67\x13\x5d\xac\xcd\x8b\x33\xfb\x10\x6c\x38\x90\x9c\x88\xef\x0e\x6c\x54\xfb\x64\xfb\xae\x07\x49\xd9\x28\x05\xe7\xf0\x5d\x9f\x60\xcb\xae\x0f\xcc\xad\x6d\x6a\x88\x7c\x19\xd6\x45\x8e\xfc\x0f\x7e\xe6\x89\x7f\xac\x62\x65\xfc\x61\xf0\x24\x7f\x90\x26\xcd\xc7\xdb\x41\x19\x61\xb0\xc7\xa1\x9e\x05\xa4\x1f\x24\x45\x34\x99\x0f\x9d\xe0\x39\xc1\x8c\xae\x63\x91\xec\xcb\x99\x27\xdc\x52\xa7\x27\x4f\x20\xa7\xb5\xb6\x0d\xbd\xff\xf4\xe1\xa0\x78\xbd\xa4\x27\x7d\x64\x09\xe0\x67\x33\x7a\x65\xe6\xbe\xf6\xc4\xb1\x20\xbd\xec\x5c\x10\x2f\x59\x61\x17\x4a\x90\x63\x6a\xfb\xae\xed\x61\x1f\x5a\x41\xf1\xc8\x10\x0a\xcf\xca\xaa\x6a\xb9\xb4\xef\x78\x2e\x4b\x66\x1e\xc9\x4c\xf4\x84\xbf\xe5\x49\x80\xe4\xd9\x10\xa9\x13\x5b\x8a\x0d\x19\x4e\x0e\xf5\x39\x26\x9a\x20\x63\x15\x50\x6b\x38\xfb\x03\x3a\xd4\xb8\x86\xf7\xa1\xf6\x44\xc3\x63\xf8\xdf\x54\x6a\x9d\x63\xf8\xcb\x2f\xc9\xc9\xe2\x6f\xf0\xea\xb8\x80\xdd\x66\xeb\x6f\xe8\x2a\x4e\x26\x4e\xea\x6c\x2e\x69\x74\x3c\x23\xd0\xbe\x5e\xaf\x73\x53\x82\xa0\xe7\x7e\x61\xb3\x51\xae\x92\x0a\x3d\x97\x14\xa5\x58\xc0\x2b\x3d\xd6\x61\x5b\x6b\x18\xbc\x9b\x63\xfa\xf8\xc8\x9c\x01\xec\x49\xd1\xaa\xe5\xb1\xd1\xd4\x5f\xe0\x2f\xaa\xae\x38\xcc\xda\x76\xf9\x07\x44\x7c\x9c\x04\xed\xf9\x47\x46\x6c\xaa\xf0\xb0\xae\xbe\x86\x5e\x08\x95\xfd\x00\x32\x97\x02\x47\x54\xb1\x95\x04\x49\x25\x84\x54\xdd\x38\x26\x80\x09\xdc\x3e\x3b\x4c\x83\x0a\xc3\x84\x31\xe4\x9c\x75\x75\x66\x07\x97\x14\x79\x88\x22\x28\x56\xaf\x2c\x0c\x90\xbf\xe0\x13\x0a\x08\xaf\x1c\xc9\xbd\xeb\x98\x7d\x09\xa4\x04\xc1\x1b\x98\xe9\x51\xdb\x10\xb0\x20\x47\x4d\xe0\x27\xf6\x9c\x30\x5c\xc8\x3b\xd4\x49\xe5\xe3\xd2\x0e\xc7\xf6\x0d\x74\xb7\xec\x8f\xcb\x96\x65\x98\xb0\x96\x1c\x09\x26\x39\xf8\x49\xb0\x9d\x78\xe8\x59\x45\xf3\x14\x33\x49\x8e\x96\x92\xad\x27\x88\xa9\x41\xfd\x58\x0c\x01\xbd\x8b\x09\xe8\xe1\x85\xa6\x7e\xed\x5e\x9c\x0f\xce\x3f\x76\x94\x1c\x64\x4d\x97\x5b\x5b\x3e\xa6\xca\x1c\xf9\xae\xc2\x27\x5e\xe1\xe4\x65\xce\x5b\x08\xe5\x8d\x1b\x3c\xd3\xfd\x17\xaa\x77\x10\x13\x4c\x72\x4e\x73\xf4\x95\x18\xec\xd6\x13\x19\x2e\x5e\x40\xca\xb0\xcd\xcd\x3b\x3d\x38\x28\xc7\x3a\x33\xc2\xed\x28\xeb\x80\xa6\x07\xc9\x3c\x68\x13\x3e\xd0\xed\xa4\x83\xfa\x43\x19\xd1\x78\x53\x99\xfe\xcf\xb7\x96\xe2\xdc\x88\x81\x0b\x7d\xa6\xa5\x20\xd1\xa0\xae\xe7\xbb\x92\xd8\xed\xa0\x97\x50\x26\xc9\x38\x78\xcd\xb1\x3d\x87\xde\xbd\x06\x81\xaa\x82\xed\x36\x8c\x0e\x62\x49\x59\x32\x2a\x2d\xcb\x35\xf6\x0d\xe4\x6f\xcb\x87\xcb\xb0\x28\x1b\x30\x4f\x00\x79\x72\xc0\x20\x49\x49\xa3\x12\x32\xcd\x1a\xe5\xc8\x77\x79\xd7\x3b\x8d\x71\xf8\x6e\xbb\x28\x7b\x7c\xd4\x62\xda\xdf\xda\xc4\xd7\xd4\x34\xc3\x01\xa8\x9a\xde\x51\x22\xbe\x55\xc9\x18\x31\x43\x76\x1e\xcd\x60\x92\x2b\x73\x0e\x03\xea\xba\x38\xa5\xd4\x79\x02\x62\x46\x7c\x29\x70\x15\xd0\x7b\x01\x94\x6b\xb5\x18\x46\x32\x42\x17\x85\x36\x59\x6d\x1d\x63\x2a\xbf\xc4\x10\xe3\xf9\x60\xc4\xcd\x36\xd5\x8f\x99\x17\xe2\x0b\x52\x7e\x89\x8d\x63\x66\x47\xf8\xe9\xca\x52\x55\x66\x69\xfb\x46\x14\xb8\x36\x85\xbc\xac\xeb\xbb\xbc\x36\xa2\xf7\x1a\x7a\x8a\x23\xb2\x39\x26\x61\x44\x08\x74\xe8\x0e\xc4\x81\x2f\x50\x27\x25\xa8\x6f\xb4\xd7\x8f\xc9\xc1\x81\x46\x24\xa6\x31\xee\x4c\x12\x6f\xc3\xd5\xd7\x81\x38\xf5\xf2\xc6\xb2\xd0\xc1\x01\x11\x1a\x2b\x7e\x48\x46\x8c\x1e\x1f\xb9\x8f\xe9\x6f\xc5\x9d\xb9\x7c\x4f\xea\x10\xe0\x03\x22\x06\x83\x13\xd1\x98\x55\x03\xac\x92\xaf\x0b\x7b\x30\x0f\x5e\x83\x00\x01\x0c\x48\x66\x35\x2d\xf1\x2d\x33\x72\xb8\x15\xbc\xc3\xd7\xdd\xa1\x9d\x91\xcf\xdd\x9f\xf8\x70\x5f\x79\x25\x17\x11\x7a\x2f\x0f\x8d\x96\xd7\xa0\x38\x72\x96\xd0\xcd\x1c\x62\x0e\xfb\x8c\x5d\xbb\x84\xd8\xf7\xdb\x31\x7b\xa3\xc1\x83\x83\xd8\xf9\xfe\x3f\x55\xbd\x60\xf0\x73\xad\x94\x3a\x41\x13\x82\x16\x0b\x48\x4a\xfc\x69\x66\xab\xf2\xa5\x11\x4a\xb6\x8b\x21\xf0\xa9\x0b\xbb\xf3\x39\x74\x28\xf2\x17\x1b\x00\xb5\xb8\x55\xfe\xdb\x7c\x79\x7b\xf5\x32\x84\xee\xc0\xcf\xfa\x7b\x5b\xce\xc3\x17\xd0\xdf\xdd\xf9\x13\x0e\x0b\xf7\xbe\xfa\xb6\xb3\xd4\xf2\x0e\x4a\x0c\x7c\xe8\x73\x8e\x11\xbb\x65\x59\x37\x86\x55\xa2\x62\xa6\x36\x7a\x94\x75\xf5\x75\x36\x5a\x51\x0a\x6f\x87\x86\xc8\xe9\x72\xb1\x58\x44\x9b\x30\x39\xb7\x8f\x8d\x3b\x5d\x2b\x95\xaf\xfc\x9c\x79\x48\x09\xf2\x17\x68\x7e\xaf\x41\xdd\xb2\xac\x8d\x32\xaa\xaf\x75\xa0\x55\x41\xf8\xfc\xc3\xff\x19\x56\x67\xda\xa6\x6c\x6c\x03\xe9\x9d\x6f\x1f\xde\xa6\x98\xd9\xea\x31\xf6\x33\x79\x82\xc9\x97\xba\xa5\xff\x94\x52\x01\xeb\x0f\xa4\xb8\x82\x71\xec\x1a\x59\x56\x1a\x27\x78\x47\x3b\x08\x90\x82\xe5\x21\xe6\x16\x3c\x64\x55\x2d\xc8\xe8\xe0\x35\x13\x6a\x49\xd4\x21\x81\x0c\xfc\x83\x03\x5f\x2b\x73\xb2\xb2\xc6\x5b\x51\xc9\x3f\x47\x67\x6c\xda\x46\xac\xab\x8c\xb9\x05\x50\xd1\x40\x7c\xa6\x54\x8c\x67\x7e\x0f\xdb\x1a\xff\x20\xdb\x9a\x48\x71\xbb\xcd\xf4\x11\x96\x1f\x7e\x87\x3a\x18\xf8\x59\xab\x6a\xd7\x56\x97\x0a\x16\x90\x96\x18\xe1\x13\xc3\x37\x92\xf8\xe4\x8e\x23\x9c\x69\x3f\xbb\x96\xf2\xd6\xa0\xc2\x83\x18\x6d\x67\x73\xe4\x21\x85\x41\x27\x3f\xfc\x4c\x7c\x51\xbc\x29\x06\x9f\x34\x7d\xbd\xb1\x1a\x82\x68\xe6\xa1\x70\x29\x23\xc4\x6c\x45\x8c\x27\xfd\xd1\xf4\xa4\x9f\xde\x6a\x21\x17\x84\xe4\xca\x0e\x5c\xe7\xf9\xaf\x6c\xd0\x5b\x03\x55\xe5\x71\xb7\x37\x96\xb5\xf9\xf5\xd3\xcd\xc8\x1c\xdc\x47\xae\x4b\xd5\xb1\x5b\x76\x3e\xc1\x00\xdb\xe8\xbe\x03\xc9\x74\x5a\x76\x06\x72\x76\x07\x90\x76\x09\x2b\x4e\x9a\xde\xf0\x6c\x74\xda\xdf\x4c\x65\x4e\x43\x35\x82\x49\x78\x30\x3c\xe5\x97\x83\x83\xb4\x02\x63\x1d\xfe\x3a\xe6\x1c\xa6\xba\xb1\x9f\xc3\x34\x17\x06\xdf\x15\xbb\x7a\xe5\x60\x78\xf6\xe8\xbf\x64\x28\x12\xcb\xdc\x40\x72\x6f\x76\xe5\x9f\x6f\xcc\xc6\xb6\xaf\xf7\xe6\xf2\xd9\x33\x31\xab\x6d\xbe\xcd\x76\x03\x6a\x8f\x65\xce\x85\x6a\x07\xa6\xe1\xa0\x1c\x16\x1f\x08\x5e\x49\xe1\xfa\x94\x17\xca\x2c\xce\x9c\x63\x96\x69\xfb\x84\xa4\x85\x1b\x11\x66\x3d\x8f\x8c\x0c\xef\x9e\x08\x2f\x6e\x48\xdc\xf2\xa1\xa7\x73\x98\xad\x29\xba\x76\x8b\x20\x72\xde\x46\xa1\xd9\x73\x7d\x6e\xde\x90\x8b\x84\x42\x9f\xdb\x87\x5b\x3e\xbe\x53\x7b\x06\xbd\x52\x1b\x36\x1d\x99\xa8\x93\x1b\x93\x2c\x2a\x8c\x66\x3b\xb8\x9d\xe3\xc8\xf6\xf0\x9c\x11\x94\xcc\xec\x0e\x97\x63\xab\x1a\xe7\xdd\x42\xe1\xbe\x85\xa9\x6d\xf0\x74\xe8\xa9\x04\x97\xed\x23\x7f\x0a\x0b\xde\x3d\x6f\x7e\x66\x07\xd9\x00\x05\x81\x82\xa5\x9f\xe9\x44\xef\x8a\x46\xec\x63\xcb\x1c\x6f\x5b\x60\x59\x7c\x34\x1f\x90\x8d\x05\x94\x35\xb8\x32\x96\xde\x90\x69\x35\x4a\xf0\xfd\x4e\x6d\x94\x69\xf0\xf4\x4e\x0b\x74\xb7\x6e\xb3\xc4\x51\x9b\xf2\xdd\x95\x2c\x0b\x97\x80\xd3\xa8\x5e\xa0\xeb\xb3\x7a\xcd\xfa\x4a\x40\x84\x19\xe3\x50\x5d\x52\xc9\xdf\x7b\x43\x67\x7c\xd9\xeb\xf5\xc7\xe3\x64\x4b\xc7\x4f\x4f\xf8\x3c\x45\x22\x4c\x56\x1a\xca\xb2\x2f\x4a\x79\x17\x65\x48\xc6\xb8\x4d\x1e\x6f\x89\x0c\x1e\x98\xd8\xf5\x61\x0d\x99\x20\xb3\x30\xfc\xe6\x77\x8d\xe8\xba\xae\xc1\xc7\x47\xa2\xaf\x93\x66\x2e\x22\xd6\xc2\xf0\x3e\xd6\xa4\x2d\x46\x32\x07\x55\x16\xfc\xa0\x0a\xf3\x13\xf8\x89\x9a\xb5\xa6\x1f\xff\x3f\x01\x00\x00\xff\xff\xf5\xc8\xab\xfb\x5c\x00\x01\x00") - -func bindataTkgWebDistTkgkickstartui582es525ed5926266ddd371723JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui582es525ed5926266ddd371723Js, - "tkg/web/dist/tkg-kickstart-ui/582-es5.25ed5926266ddd371723.js", - ) -} - -func bindataTkgWebDistTkgkickstartui582es525ed5926266ddd371723Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui582es525ed5926266ddd371723JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/582-es5.25ed5926266ddd371723.js", - size: 65628, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui644es2015B16fcfdb49088748e8f1Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x7c\xeb\x96\xda\xb8\xd2\xe8\xab\x38\x3e\xb3\xb3\xec\x33\xc2\x63\x83\xcd\xad\x17\x7b\x56\x07\xe8\x84\x4c\x37\x30\x40\x27\x93\xf4\x66\x31\xc2\x16\xa0\xb4\x91\x1d\x59\xee\x4b\x08\xef\x90\x37\xc8\xbb\xe5\x49\xce\x92\x64\x83\xcd\xa5\x2f\x99\xb3\xbe\x6f\xff\x49\x1b\xb9\x54\xaa\x2a\x95\x4a\x75\x73\xd4\x38\x42\x4a\xc4\x28\x76\x99\x7a\xa2\x45\xc8\x9f\x19\xb7\x68\x1a\x42\xf7\xba\xb9\x88\xc9\x35\xbb\x9e\x4f\xae\xb1\x7b\x1d\x31\x48\xd9\x24\xc6\x8d\x47\x21\xbe\x7e\xbd\x1a\xeb\x46\x18\x47\x0b\xed\xea\xaa\x6c\xdb\x63\xb0\xaa\xd9\x65\xdb\xae\xcf\x62\xe2\x32\x1c\x10\x0d\x01\x06\xa8\xbe\xa2\x06\xd5\x98\x0e\xa8\xe1\x69\x0c\xac\x5a\x81\x7b\x8d\xe8\x7b\xfc\x05\x52\xef\x22\xf0\x62\x1f\x6d\x27\xe8\x2b\x8a\x58\x4c\x89\x42\xd1\x7a\xad\x9f\xdc\x40\xaa\xe0\x06\xd5\x4a\x55\xa7\x5a\xd2\x41\xd0\xa0\x5a\xb1\x56\x2d\x55\x75\x40\xf8\x63\xc9\x71\x74\x10\xf1\xf7\x95\x6a\xb5\xa2\x03\xbf\x41\x35\xbb\x5c\xa9\x16\x75\x00\x1b\x54\xab\x56\x6a\x25\x47\x3f\x71\x03\x12\x31\xc5\x6d\xac\x66\x18\xf9\xde\x05\x0c\x43\x4c\xe6\x51\xfd\x6a\x45\xe0\x12\xd5\x55\x1c\x35\x03\x42\x90\xcb\x90\xa7\x82\x1b\xe8\x63\x0f\xb2\x80\x46\xf5\x2b\x68\xc0\x6b\xa3\x33\x9c\x8c\x06\x97\xed\x31\xc0\xd1\xab\x20\xf0\x11\x24\xf5\x17\x26\xf0\x82\x6e\xc0\x4e\x63\x16\x0c\x50\xc4\x02\x8a\xf8\x98\x0f\xa7\xc8\xaf\xab\xad\x5e\xf3\x8f\xf6\x40\x69\x9d\xb6\x2f\x7a\x5d\xa5\xd9\xeb\x76\xdb\xcd\x51\xbb\xa5\xae\xc7\x6b\xc1\x4e\xc8\x09\x2b\x59\xc5\x8a\x0e\xe2\x06\xd5\x2c\xb3\x5c\xaa\xe9\xc0\x6b\x50\xcd\x71\xcc\x5a\x49\x07\x23\xce\x44\xb1\x68\x95\x74\xb0\xe4\x00\xb6\x69\xd7\x74\x30\xe7\x5c\x9a\xd5\x52\x51\x07\xb3\x06\xd5\x6a\x65\xb3\x52\xd1\x4f\x52\xb9\x29\x0b\x2e\x6a\x7d\x65\xbd\x44\x2f\x5f\x6a\xb1\x31\x9a\x7f\xd4\x4c\xa0\xba\x3e\x2d\xb0\x20\xf0\x19\x0e\x0b\x6e\x40\x18\x22\x4c\x05\x55\x1d\x48\x00\x0b\xa8\x51\x08\x89\xca\x7f\x4f\xe2\x4b\xad\x08\x54\xa5\xef\x23\x18\x21\x05\x91\x28\xa6\x48\x61\x0b\xc8\x14\xb9\x5d\x0a\x8e\x14\x1a\x13\x82\xc9\x5c\x09\x88\x72\x1f\xc4\x54\xf1\x03\x17\xfa\xca\x12\xba\x0b\x4c\x10\x50\x20\xf1\x72\x33\x22\xc4\x18\x97\xb4\xb2\x80\x37\x48\x81\xca\x12\x13\xbc\x8c\x97\x4a\x30\x53\x6c\xa5\xd9\xbf\x8c\xc4\x8c\xf2\xeb\x57\xca\xe0\xf4\x42\x81\x3e\x47\xc7\x90\x67\x28\x82\xa2\xcf\x1f\x4f\xb5\xcd\x5f\x7d\xbd\xe1\xb4\x29\x39\xc5\x33\xcd\x7a\x89\xf4\x95\xdc\x5c\xd4\x88\x8d\x76\x78\xa6\xe9\x27\x1b\xde\xa7\x31\x63\x01\x51\x41\x8d\x23\xe9\x7a\x6f\x35\xd5\xf5\xb1\x7b\xad\x82\x7d\x5d\x8b\x8d\xe6\x9b\x0b\x0d\x71\xc0\xe0\xee\x56\xd3\x0d\x57\x2a\xc4\x28\x90\x9c\x68\xfa\x3a\x95\x91\x05\xd4\x64\x4b\x95\x51\x4f\x91\x7b\xbd\x25\x77\xbd\x25\xb3\x9f\x25\x33\xbb\x27\x1e\xbe\x51\x81\x65\x66\x36\x41\x8e\x58\xe9\x48\x31\x1d\x29\xa6\x23\xa5\x74\xa4\x24\xc8\xb8\xfc\xa8\xd9\x72\x6f\xb1\xcb\x39\xb4\xec\xac\xbc\xf8\x04\x27\xd9\x59\x60\x39\x29\xe1\xe5\x3d\x99\xee\xc9\x18\x14\xf3\x02\x15\xb2\x38\x89\x8d\xbb\xb0\x2c\xa7\xf7\x3e\xc7\x1a\x32\x10\xa5\x01\xed\x06\x0c\xcf\xb0\x0b\x39\xaf\x59\xb6\x27\x07\xf5\x50\x52\x5f\xfe\xff\xc9\x73\xe5\x29\x3c\x03\x75\x90\xa8\x6c\xa2\x92\x1e\x44\xcb\x80\x80\x8d\x2a\x6e\x94\x4e\xea\xa3\x66\xeb\x42\x27\x47\x01\x83\xbe\x72\x81\x96\x01\xbd\x57\xb4\xf2\xeb\x57\xba\x92\x18\x06\xe4\x19\xfb\xda\xf9\x80\xb6\x76\x1f\x90\x47\x75\x4f\x1e\xb5\x5d\x79\x14\xcd\x8c\x3c\x24\x7b\x45\x2b\x65\xcf\x06\xaa\x92\x68\x2a\x26\x73\xc3\x38\x74\x70\xf6\x49\xf3\x11\x53\x6e\x1a\x9a\xa6\x37\xfe\xbd\x72\x7d\x18\x45\x0a\x52\xd0\x1d\x43\xc4\x8b\x94\xd0\xe8\xc8\xfd\xa7\xb1\xcb\x02\x2a\x69\x8f\xe2\x90\x1f\x01\xc0\x16\x38\x32\x12\x31\xe0\x80\x0c\x11\xbd\xc1\x2e\x6a\x20\xf9\x02\x86\xb8\xe9\x63\x44\x58\x83\xc9\x01\x37\x35\xaa\x8d\x17\x56\x6e\x04\x93\xf9\x66\x68\x4f\x97\x1a\xaa\xba\x76\xe3\x88\x05\x4b\xfc\x05\x9d\x05\x74\xa9\xe9\x2b\x01\x49\xd1\x1c\x47\x0c\xd1\x16\x9a\xc1\xd8\x67\x67\xd8\x47\x9d\x65\x18\x50\x86\xbc\x37\x90\x78\x3e\xa2\x9a\xc4\x78\x83\x48\xee\x2d\x70\x13\xd2\x8f\x62\x68\x73\x22\x1e\x42\x22\x00\xf4\x35\x99\xf7\x48\x87\x60\xa6\x25\x32\x31\xb6\x03\x80\x18\x1f\x8d\x38\x42\xb4\x05\x19\xe4\x64\x27\xd2\x31\xa6\x31\xf6\x3d\xc1\x87\x40\x3c\x0b\xe8\xf2\x35\x0d\xe2\x50\x92\x74\x2b\xee\xc0\x2e\x5c\x26\x42\xe4\xaf\xc5\xaf\x94\xe6\x05\x5b\xfa\x67\xfc\xd6\x3a\xe7\x97\x4b\xd4\xe0\xcb\xa4\xb7\xd8\x25\xc3\x3e\x66\x18\x45\xc6\x1c\xb1\x2d\xd0\x05\x0c\xb5\x74\xba\xb8\x9b\x12\x7e\x25\x86\xcd\xab\x1d\x21\xe7\x76\x28\x63\xf7\x30\xc1\x8c\x43\xbc\xc7\x6c\x31\x84\x37\xc8\xe3\x0c\x6a\xfa\x6a\xcd\xd7\x4c\xa8\xdd\xc8\x23\x37\xb6\xde\x43\xb6\xda\xd3\x02\x73\x47\x77\x0c\x77\x81\xdc\xeb\xce\x4c\xce\x68\x89\xc3\x7a\x7a\x03\xb1\x0f\xa7\x3e\xd2\x74\x23\xc4\x21\xd2\x34\x13\xf8\xc6\x40\x97\x02\x8d\x49\x14\x4f\x23\x97\xe2\x29\xd2\x75\x63\xf3\xac\xa1\xc6\xbf\x57\xbb\x6a\xf8\x02\x19\x11\x83\x2c\x8e\x8e\xaa\x23\x45\x51\x4c\x29\x72\xa5\x38\xb5\xbc\x6b\x70\x58\xff\x0d\x1c\x8d\x68\x8c\x34\x1d\xa8\x8c\xc6\x48\x05\x2b\xb4\xc4\xac\xcd\x15\xa8\xfe\xc2\x5a\xeb\x6b\x70\x88\x94\xe7\x9c\x88\xc4\xe2\x1a\x4b\x14\x45\x70\x8e\xd6\xfa\x5a\x6c\xeb\x65\xa2\x6d\xa9\x5c\x73\x83\x67\x34\x58\x26\x8e\xce\x41\x65\x68\xe1\x28\xf4\xe1\x7d\x8f\x7a\x88\x6a\xae\xbe\x5e\x27\x37\x21\x32\xfe\x13\x9b\xc5\x8a\x33\x83\x6e\x63\x73\x4f\xb2\xcd\x45\x49\xd0\xad\xc6\xbe\x7e\x45\xba\x16\x1b\x1f\x4a\x65\xcd\x33\x06\xdc\xb2\xf0\xc7\x91\xe1\xf7\x75\xce\x6d\x82\xc1\x5d\x86\x8d\xd8\xf8\x2b\x5c\x6a\x2b\x76\x1f\xa2\x3a\x02\x11\xf2\x91\x2b\x3d\xab\x2b\x15\x86\x61\x41\x1a\xe3\xc2\x56\xa4\x85\x88\xa1\x50\x1d\x8f\xc1\x0c\x41\x16\x53\x14\xd5\xaf\x62\xe3\x73\xef\xd3\x18\x78\xc8\xf5\xa3\xba\x65\x82\x1b\x48\xa3\xba\x03\x84\x91\xe2\x88\x2c\xa0\x32\xcc\x7c\xa4\x8e\xc1\x55\x09\xa8\x24\x23\x38\x3e\xa4\x42\x8a\x61\xc1\xc7\x37\x48\x05\x2a\x8c\x22\x44\x59\xf2\x6c\x59\xf7\x23\xe9\x19\x8d\x28\x9e\xcf\x11\x55\x81\xaa\x02\x35\x5a\xc0\x90\xbf\xc7\x64\x16\x14\x5c\x4c\x5d\x9f\xff\x8a\xf0\x17\xfe\xa7\x58\x14\x38\x5d\x9f\xf6\x83\x08\x8b\x35\x80\xca\x82\xb0\x40\xf1\x7c\xc1\x54\x71\x3f\x0d\x25\xa8\x3f\x57\x81\xbc\xb0\x3a\xb3\x5e\x88\x48\x32\x11\x46\x91\x0a\xd4\x29\x23\xca\x94\x91\x82\x8f\xc9\xb5\x0a\x4a\x20\xf5\x4c\x6c\xa0\x92\x79\x67\x96\x83\x85\x3e\xa2\x4c\x11\xff\x16\x3c\x48\x24\xa1\x34\x10\x64\x89\xd1\xc7\xa7\x45\xb1\xeb\x22\x31\xfa\xf8\x3c\x7e\xc3\xd2\xe0\x76\xf7\xe5\x93\x18\x1e\x03\xbe\x1d\x53\x46\x24\x8b\xbb\xec\x71\x4c\x79\x02\xac\xcd\x93\x9a\x63\x50\x22\x92\x43\x98\xa1\x65\xb4\x37\xc2\xf7\x84\x41\x86\xdd\xfc\x1b\x37\x20\x85\x5b\x0a\xc3\x50\x22\xd9\xec\x26\xba\x73\x7d\xb8\x94\x3a\x96\x6e\x6a\x6e\x56\x0e\x0d\x43\x77\xec\x29\xd4\xa6\x72\xcd\xae\x24\x0c\xd8\x83\x6b\xa4\x12\xde\xfe\x72\x03\xbf\x60\x15\x93\x01\xbe\x78\xc1\x45\x84\x89\x8d\x5e\xb2\x82\x65\x26\x6f\xa2\x10\x13\x22\x46\x93\xa7\xc2\xd2\xe3\x87\x85\xa1\x65\xe8\x43\x86\x72\x51\xd7\x61\x97\xc3\xcc\xb8\xb1\xca\xbb\xc4\xa3\x49\x7d\xa3\x3e\x45\x14\x7d\x8e\x71\x84\x19\x8a\xa4\x2b\xc1\xdd\xae\x22\x10\x87\x55\xf2\x91\x3b\x5f\xc0\xca\x38\x27\x99\x50\x43\x3d\xe8\xb1\x09\xcf\xee\x43\xd7\xd5\x1c\xb0\x00\x25\x70\x2c\x3a\x29\x65\x5d\x16\x0e\x5e\x06\x4d\x50\x04\x19\x87\xde\xde\x85\xa8\x80\x3e\xa8\x80\xd4\x89\x72\xd2\xe1\x2a\x98\x80\x0a\x48\x59\x2f\xa7\xc3\x35\xd0\x05\xce\x66\xb8\x22\xdd\x5e\x21\x29\xee\xe7\x0a\x2a\xff\x2c\xbf\xd5\xf2\xa6\x04\x30\x6e\xab\x67\x78\xce\x9d\x82\x9c\xef\x0b\xe4\x3c\x7b\x3b\x8f\x9f\x1a\xf0\x82\x6d\xcd\x7d\x0a\x63\x3d\x00\xf3\xf2\xe5\xf6\x17\x26\xf3\x97\x2f\xd9\x01\x3f\xfb\x08\x9e\xe3\x68\x1e\x9d\xc1\x61\xf4\x35\xf0\x30\xbf\xf4\xf0\x0d\xb7\xb8\x4b\x23\x00\x73\xe3\xed\xf2\x13\x98\x1b\x9f\x6f\xce\xc1\xcc\xe0\x4f\xe4\xf3\x07\x80\x8d\x9e\x03\xe6\xc6\x97\xd6\x19\x98\x1b\x9d\xda\x97\x31\x88\xd8\xbd\xcf\xe7\xa8\x86\x30\xc2\x57\x13\x32\x4f\x36\xb2\xf0\xaf\x66\xef\xa2\xff\xaf\xf1\x6a\x16\x10\x56\xe0\xf6\xb3\x6e\x95\xc3\xbb\x93\x25\xa4\x73\x4c\x0a\xd3\x80\xb1\x60\x59\x2f\x9a\xe1\xdd\xfa\xe8\x5c\x45\x51\x8c\xd4\x8e\x1c\x42\x9d\xc7\x55\x0b\xef\xd6\xea\x78\xad\x03\xb4\xd6\x35\x99\x39\x18\x34\xa8\x56\xae\x56\x6b\x8e\x0e\x5a\x3c\xbe\x2e\x16\xab\x25\xfd\x84\x3b\xc0\xed\x23\x0e\x70\xcb\xf8\xc4\x7d\x99\xd0\xbf\x17\x1e\x40\x74\x3a\x9b\x49\x29\x0d\x19\x0a\x5b\x88\x3b\x17\x61\x2e\x76\xbc\x1a\x18\x41\xc5\x68\x9e\x5f\x0e\x47\xed\xc1\xa4\xdf\x6b\x4d\x9a\x9d\xd6\x60\xbc\xf6\xee\x09\x5c\x62\xf7\xd0\x14\x45\xdc\xc6\xa9\xcf\xf6\x0e\xfa\x31\xd2\x0e\x62\xd1\x7f\x57\x9b\x7e\xcc\x5d\x56\xa5\x1f\x78\x0a\x1f\xaa\x2b\xea\xaf\x4f\x9e\x5e\x47\x86\xb7\x5d\x7f\xcf\x6b\x48\x03\x3d\xe9\x89\x50\x04\xd9\xe6\x6d\xc7\x43\x84\xeb\x1d\xa2\x3c\x6a\x16\x24\xf4\x03\xaf\x89\x3d\xaa\xea\x27\xc7\x5c\x5d\x81\xbf\x43\xc2\x38\xf1\x9e\x32\x3e\xad\x70\x79\x73\x6e\x48\xd6\xff\xb8\xda\x5d\x63\x9c\x75\x48\x32\x2c\x34\xd4\x61\x88\x5c\x3c\xbb\x57\xd8\x02\x29\xee\x8e\x6c\xd4\xcc\xce\x7f\x6c\x50\xad\x66\xd7\xcc\x4d\xf6\xa7\xd3\x50\x3d\x61\xe6\xba\x81\x87\x86\x49\x62\x42\x05\xbd\x63\x49\xa1\x04\x39\x77\x65\x55\x20\xcc\x22\x45\x5e\xfd\x85\x79\x30\x41\xf4\xee\xf4\xbc\xd3\x9a\xa4\xf2\xef\x9e\x5e\xb4\xc7\x69\x36\x28\x19\x54\xf8\xe0\x26\x05\x34\x6c\x50\xad\x54\xae\xd4\x32\xf9\x9b\xeb\xbd\x74\x01\x7b\xf3\x5e\x33\x81\xbd\x35\xb2\xd6\x11\x8b\x59\xcb\x58\xea\x4d\x3e\x27\xb5\x8f\xdd\x49\xf8\x48\x64\x2f\x2c\x5e\xf8\xe7\x3b\x0d\x19\x19\xa6\x3b\x49\x10\x98\x98\x9d\x3f\xd9\x48\x33\xb3\x71\xfe\xf4\x58\x7a\x43\x5e\x68\x84\xd1\xc0\x2f\x08\x0b\xb6\x49\x2f\x59\x4f\xcb\x34\x08\xb0\x05\xfe\xa4\xa9\x8a\x0a\x36\x34\x8d\xee\x43\x94\x1e\xa6\x80\x8e\xb8\xc5\x68\xc2\x08\x01\x55\x49\x8f\x08\xdf\x37\x91\xa4\x4a\x36\x8b\x47\xc3\x19\x82\xcf\xfe\x3b\x09\x5e\xc6\x11\x53\x44\x3e\x55\x24\x1e\x10\xf1\x94\x5b\xcc\x16\x0a\x54\x7c\xc4\x38\x54\x40\x15\x12\x2f\xa7\x88\xca\xfc\x9a\x0b\x09\x8f\xf9\x19\xc4\x44\x09\x88\x7f\xaf\xf8\xc1\x2d\xa2\x2e\x8c\x50\x32\x21\x02\x09\x7c\x24\x27\x2c\xee\xc3\x05\x22\xd1\x8e\x34\x4e\xff\xeb\xa4\xd1\xdd\x48\x83\x04\x4c\xc1\xc4\xf5\x63\x0f\x29\xb7\x0b\xee\x8c\x84\xd0\x45\x4a\x40\xb8\x74\x12\x46\xb8\x0d\xbf\x7b\x20\x89\x21\x6d\x38\x37\xda\x69\x14\xb4\xb1\xbe\xbd\xff\xc9\x38\x5e\x5a\xbc\x7d\x62\xfe\x59\x78\xff\x08\xd6\x03\x51\xff\x23\x33\x7e\x3e\xb9\xf2\xb3\x88\x9f\x98\x73\x49\xc2\xe4\x83\x76\x69\x7b\x1b\x40\x79\x96\x66\x01\x15\x17\x43\x72\x45\x1e\x54\xbd\x5f\xd5\xf4\xde\x30\xd4\x67\xc6\xd1\xbd\xc7\xe2\xe8\xde\x23\x71\xb4\xbe\xe2\x6a\xcb\x4e\x12\x98\xcd\x38\x4d\x75\x93\xc7\xd6\x1a\x6b\xc4\x06\x71\xbe\x68\x48\xd7\x75\x8d\xf2\x60\x7b\xbd\xd6\xf4\xe7\xc4\xd5\x24\xf0\x50\x21\x49\xbe\x3f\x1a\x52\xdb\x3b\x21\xf5\x0e\xb5\x28\xa5\x16\x35\x7e\x11\xe9\x7e\xfc\x05\xfd\x5d\x77\xb3\x26\x4c\xdc\x74\x3f\xbe\x7d\x2f\x7b\xc8\xb6\xab\xb5\x99\x55\x99\xa1\x8a\x5b\x2b\x59\x25\xbb\xea\xba\x53\xbb\x08\x4b\xd3\xa9\xe3\x94\x60\x71\xea\x39\x76\xc5\xfa\xf1\xed\xbb\x53\xab\x96\xcb\xb5\xa2\xe5\x98\x25\xb3\x58\x2d\x97\x6c\xbb\x56\x57\x7e\x59\xa9\xff\x89\x67\xb3\x99\x67\xca\x3f\xea\xba\xde\xe9\x8e\xda\x83\x7e\xef\xfc\x74\xd4\xe9\x75\x33\x10\xff\xa7\xbc\x01\x19\x8e\x4e\x07\xa3\xc9\xe8\xf4\xf5\xa4\x79\x3e\x98\x8c\x7a\xbd\xf3\x51\xa7\x5f\xdf\x42\x56\x8e\x40\x76\x9a\xbd\xee\x16\xec\xb7\x0c\x5c\xf3\xbc\x37\x6c\x1f\x81\xfb\xbf\xd5\xba\x25\x9f\x12\xf4\x56\xfa\xfb\x18\x29\x93\x66\xaf\x3b\x6a\x77\x47\x19\x92\x8a\x07\xe7\x0c\xfb\xa7\x59\x16\xcd\x0c\x50\x4e\x0c\x13\x2b\x03\xf5\x5b\x0e\xd9\x96\x72\x81\x2c\x03\x65\xe5\xc9\xfe\x6d\xcb\xc7\x1e\xc3\x47\xe9\xfe\x2d\x23\xf5\x83\x53\xea\x7f\x83\xab\xab\x12\x50\x37\xc6\xf1\xb1\x88\x77\xfb\x23\x5a\x16\xca\x99\x9f\xfe\xbc\x60\xa7\x99\x87\xcd\x75\x24\xf4\x4c\x05\xaa\x3a\x06\xe8\xbf\x2f\xb3\x43\x85\xe7\x2b\x97\xe2\x02\x68\x4a\xaa\xa5\x03\x99\x77\x27\xd5\xd0\x87\x2e\x5a\x04\xbe\x97\xd2\xb6\x84\x77\x3e\x22\x73\xb6\x50\x81\x6a\x0b\x52\xd2\x15\x84\x19\x7c\x56\x12\x66\xbc\x7e\x62\x46\x80\x53\x99\xa4\x04\x72\x45\x88\xbd\x1a\xc4\x4e\x94\x8f\x39\xa3\x85\xc4\x09\x41\xd2\x41\xe0\xaf\x6d\xa0\x26\x5b\x24\x62\x78\xee\xbf\x3a\x32\x58\xe7\x6f\xcb\x87\x53\x04\x95\x6c\x8a\x20\x13\xba\x5f\x83\x12\x38\xe6\xf0\x96\xf7\x1c\xdc\xcc\x6f\x8e\xb4\xc6\x77\x59\xec\x46\x25\x1d\xb2\x76\x7c\x9b\x05\xf2\xc3\x84\x76\xbe\xa0\x65\x81\x29\x28\x02\xeb\x90\x03\x24\x0b\xa6\x02\xaa\x08\xce\x9e\x00\x55\x02\xa7\x0f\x43\x3d\x5e\x86\x13\xfb\x24\x02\xf6\xed\x61\x02\x2c\x1b\x4b\x49\x6f\xab\x9a\x3a\xef\x6c\xd7\x97\xc8\x5e\x9a\xa9\x07\xef\xa4\xd3\x4a\x9b\x7c\x40\x46\xc9\x00\x33\x36\xc1\x4d\x9b\xc4\x4b\x63\xd0\xfe\xf3\xb2\x33\x68\xb7\xf6\xb3\x08\x0f\xcd\xda\x0f\x86\x9e\x37\xff\xfd\x9b\xce\xa8\x3d\xec\x9f\x36\xdb\xbb\x99\x89\xa1\x31\xf9\x00\x86\xc6\xdb\x73\x30\x34\xa2\x39\x98\x1b\xaf\x1d\x07\xcc\x8d\x8b\xf9\x1f\x47\x12\x16\x43\xe3\x8c\x3f\xde\x0d\xfa\x7c\xda\x5b\x30\x34\x62\x30\x34\x48\x0b\xcc\x8d\xe6\x45\x99\x83\x5f\xd7\x36\x09\x8d\x77\x9f\x4f\x33\x09\x8d\x9d\x4c\xc2\x7d\x83\x6a\xd5\x6a\xad\x68\xea\xe0\xb2\x41\xb5\x62\xd1\x2c\x39\x3a\xf8\xdc\xa0\x5a\xc5\xae\x99\xb6\x0e\x6e\x45\x67\x02\x2a\xe9\xe0\x9c\x07\x77\x8e\x63\x15\x75\xf0\x85\x3f\xd6\xcc\x8a\xa3\x83\x8b\x06\xd5\xac\x8a\x5d\xaa\xea\xe0\x43\x83\x6a\xe5\x52\xb9\x62\xe9\xe0\x0d\x47\x60\x95\x2c\x53\x07\x6f\x45\xc4\x5a\x72\x4a\x3a\x78\xc7\x71\x95\x4d\xa7\xa2\x83\xf7\x02\x59\xa9\x56\xcc\x84\x8a\x7f\x3e\x56\x00\xbf\x27\x77\x5a\xf6\x58\x27\x67\xc1\xb2\x92\xf2\xaa\x2c\x86\x2f\x20\x99\xa3\x4c\x35\x9c\x1d\x2f\x87\x07\x44\xfa\x64\xdc\x3b\x1b\x0a\x6f\x03\x79\x1a\x93\x45\xf1\x6c\x09\xb6\xb4\x4d\xd2\xc9\xb2\xed\x91\xb2\x7b\xba\x40\x12\x9b\x73\x8f\xe7\xe2\x34\xd2\x8a\xfa\xc9\x86\x82\xfc\xc2\xaf\x04\xd6\x26\x47\xa4\xe9\x2f\x5f\x32\xc3\x95\x8f\x82\x82\x61\xeb\x46\xb3\x77\x8a\xe0\xaf\xfe\xbc\xce\x55\xe3\x5f\x3f\x57\x66\x29\x1f\xb2\x00\xfb\xac\xf6\x81\xa2\x6e\xa0\x3b\x4e\x75\x53\x64\x0c\x63\x0a\x25\xf8\x86\xd8\x62\x52\xc3\x3d\x46\xec\x1f\x4f\x26\x56\x58\x36\x99\x9f\x15\xe9\x49\xba\x4c\xd2\x95\xd5\x9d\xec\xad\xb0\x3e\xbb\xd9\x5b\x67\xaf\xd6\x5e\xce\xd8\xf2\xbc\xed\x77\x32\x5b\x5b\xf9\x89\x8e\x0a\x0f\x85\x7e\x70\x9f\x69\xa4\x28\xef\x2a\x4f\x25\xb3\x42\xf5\x27\x56\xa0\xe8\x06\xa3\xdb\xbc\xcc\x5f\x58\x5b\xa9\x57\x93\xf2\x7a\x36\x73\x5c\x03\xaf\x65\x2a\x9a\xcc\x33\x17\x1a\xa8\x1c\x32\xce\x72\x97\xf0\x4c\x7b\x2c\xf8\x15\x16\x4e\x46\x84\x3c\x02\xde\xc6\x86\xfb\x76\x70\x2f\xc5\xcb\x27\x1c\xcd\xfb\x6e\xad\xb6\x87\x23\x38\xf5\x91\xc0\x9f\x3c\xb7\x84\x80\xe5\x41\xc9\x2d\x24\x63\x71\xf9\xfa\x79\x21\xb9\xba\xbf\x70\x12\x45\x8c\x82\xf9\x5c\xb8\x4f\x4b\x48\xe0\x1c\x2d\x11\x61\x85\x34\xac\x92\xba\x5f\x98\xd1\x60\x99\x2a\x25\x8f\xd8\xa5\xc0\x7e\xd9\x46\x43\x28\xdd\xca\xd5\x02\x7b\xa8\x8e\xd6\x6b\xf0\xa9\x71\xb5\x0a\x21\x5b\xd4\x55\x15\xb8\xc1\x32\x0c\x08\x22\xac\x7e\x38\xca\xbf\x34\x3e\xee\xb6\x2a\x00\x0a\x30\x08\x00\x01\x51\xda\xb4\xc0\x07\x09\x08\x92\xc0\x4d\x52\x96\xf6\x2d\x50\x39\x88\x97\xd9\x41\xbc\xdb\xcc\x10\xad\xd3\x74\xf0\x36\xe8\x15\xc5\xdd\xad\x26\xde\x1b\xe7\x86\x6c\x04\xe2\x3e\xf3\x59\xe7\xf5\xe4\xac\x73\xde\x9e\x74\x2e\xfa\xbd\xc1\xa8\xdd\xda\x43\x20\xee\xbd\xe7\xe0\x98\xb4\x07\x83\xde\x20\xc1\xf3\x7e\xa3\x4e\x9b\xd9\x6a\xb6\xa1\x4e\x5d\x6f\xa3\xf1\x24\xac\x4d\x32\xd5\x82\xb3\x6c\x65\xfd\x2c\xa0\x4b\x90\x19\xed\x22\x76\x1b\xd0\xeb\xbd\xe1\x6d\xc6\x94\xbf\x1a\x3f\x98\x3f\xd9\xa4\x3f\x8c\x25\xa4\xd7\xa7\x51\x0b\x53\x76\x9f\x8e\x8b\x44\xff\x26\x5d\x8c\x98\x50\x3a\x6d\xfb\xea\xf7\xed\xe3\xaf\x6a\x52\x96\x52\xeb\x09\x7b\xaa\xbe\x8e\x10\xe3\x01\x79\x1f\xde\xfb\x01\xf4\xb8\x06\xc9\x80\x3c\x97\x0b\xff\x6c\xf4\x6f\x8c\x6e\x7b\xf4\xbe\x37\xf8\x03\xe4\x12\xe3\xc3\xf6\xe0\x5d\xa7\xd9\x16\xc9\x71\x80\x0c\x22\xd9\xc5\x64\x9e\x1e\x89\x84\x34\x91\x3c\x07\xcf\x42\x9d\xe6\xdc\x0f\xa2\xed\x07\xde\x73\x50\x76\x3b\x93\xd1\x87\x7e\x7b\x07\x15\xc1\xfc\xc0\x1e\xc4\xd1\xd9\x89\x2f\x50\xde\xf7\xdb\x26\x2d\xfa\x34\xb8\x4b\x0a\x1b\x79\x39\xe6\xd2\x5e\xe9\x06\xc5\xa1\x07\x19\x92\x5a\x35\xc2\x4b\x14\x31\xb8\x4c\x72\x4f\x19\x9b\xb6\x9e\x23\x96\x22\xda\x9a\xc5\xd5\xfa\x04\xcf\xb4\x2c\x07\x8d\x55\x42\x54\xab\x3b\xec\x8a\x14\xbb\x0a\x52\x32\x03\x4f\xc8\x3c\x33\x94\xd9\x89\xfa\x81\x7a\xc7\xd3\xf6\x58\x07\xf9\x0d\x78\x1e\xa6\x4d\x19\x05\x24\xb2\x7f\xe2\xf4\x64\xfb\x44\x2b\x44\x66\x1f\x1a\x07\x66\xef\x6c\x5c\xb2\x55\x8f\xad\xd0\x1f\xf4\xfe\xfa\x30\x19\xb6\x47\xa3\x4e\xf7\xf5\x50\x4f\xb2\x4a\x0d\x12\xfb\xfe\x09\x6b\x5c\x5d\xa9\x6f\x46\xa3\xbe\xd8\xea\xcb\xc1\xb9\x0a\xf6\x11\xf0\xf7\x13\x89\xe5\x72\x70\xce\x63\xcb\xed\x8c\x08\x51\x22\x94\xe8\xe1\x69\xc3\xf6\x40\x96\x39\x32\x73\xfb\x30\x8a\x6e\x03\x7e\xe9\x3d\x38\xb7\x7f\x3a\x1c\xbe\xef\x0d\x5a\x7c\x2e\x09\xc4\xcc\x43\x33\xba\x3d\x09\x3f\x1e\x03\x76\x48\x76\x87\xd7\x18\x4e\x3a\xc3\xc9\xf0\xf4\xa2\x3d\x39\x1d\x4e\xf8\x80\xfe\xfb\x95\x61\x18\x2c\xa1\x73\xf8\x7c\xb1\x0c\xff\x89\x5c\x86\x3f\x25\x98\x71\xfd\x59\x34\x0f\x7f\x96\xe8\xe1\x3f\xa2\x7a\xb8\x47\x76\xde\x62\x2d\x18\x0b\x05\xa2\x9c\x4b\xd6\x58\x21\x22\x5c\x97\xfa\x0b\x73\x2d\x23\xda\x36\x74\x17\x1a\x6b\xfc\x5b\xe8\x31\x3d\xb4\xd7\xec\xca\x1a\x03\x76\x55\x1c\xeb\x27\x1b\x95\x69\x34\x1a\xec\xca\x1c\xbf\x7c\xa9\xd1\x06\x35\x28\x12\x39\x15\xed\xb7\xff\x44\xbf\xcd\x81\xaa\xea\xfa\x53\x88\xb9\xe2\x18\xc6\x0d\xba\xd6\xb7\x79\x5b\x2c\x4a\x9f\xec\xfe\x62\xe3\xd9\x34\x56\xd8\x5b\x4e\x44\xb2\x55\x25\x01\x41\xea\x1a\xa0\x35\xe4\x77\xec\xe8\x7a\x2e\xf1\xed\xd4\x76\xb7\xfd\x6c\x12\xec\x8f\xd7\x12\xec\x2c\xa0\x49\x2f\xdc\x2a\x84\x14\x2e\xa3\x8d\x49\xd9\x58\xd0\xb5\x30\xa8\x17\xcd\xdc\x05\x7f\xa8\x62\xbc\x6b\x3b\x38\x07\x14\xa3\x1b\xd4\xbe\x4b\x43\xb5\xa3\x54\x49\x47\xe8\x99\x64\x1d\x8c\x69\x72\x45\xe4\x93\x7d\x2f\x2b\xf9\xa5\x25\xc5\x80\x7d\x0a\x01\xdf\x78\xe1\xc4\x86\x3e\xbc\x17\xae\x91\x88\x2c\xb9\x14\x9a\x3e\xd6\x36\xae\x36\x6b\x10\x74\xab\x44\xc6\x35\xa0\x8d\x95\xec\xc5\xe8\x73\x57\x11\x81\x8c\x3f\xbb\x21\xbc\xb9\x1d\xd3\x36\xd7\x80\xb8\x76\x52\x88\x54\xc4\x40\x3a\x94\x4d\x1f\x37\x97\x5e\x54\xbf\x1a\xaf\xd3\x20\x94\x19\x09\x0d\x54\x5f\xcb\xf2\xf8\x00\xcd\x71\x40\xa0\x9f\x60\xdf\xba\xb0\xbb\x02\x96\xe0\x52\xa8\xfb\x93\x38\x6f\xca\x9e\xcb\xb5\xdd\xad\x8f\x06\x11\x2e\xd4\x7b\xcc\x16\xbd\x1b\x44\x29\xf6\x50\xa4\x49\x57\x2b\xeb\xa3\xad\x32\xa5\xf1\x7a\x3b\x5b\x28\x07\xae\x0f\xbf\x7c\xa9\xb7\xd7\xb9\xb5\xf2\x7e\x5c\x66\xf3\xf8\x82\x2c\x0d\x00\xb4\xe3\xc5\x13\xfd\xd7\x6d\x70\xb0\xa9\xa1\x27\xe2\x92\x75\xf3\x0e\x10\x78\xea\x08\x64\x69\x53\x7b\xe2\x2f\xf4\xeb\x4a\xb6\x80\xbf\x0d\x1e\x94\x6c\x41\x41\x05\xd8\xaa\x92\xfa\x4a\x62\x52\x49\xe0\xa1\xf4\x53\x02\x25\x62\x28\x4c\x80\x72\x0b\xec\x03\x65\x5e\xab\xeb\x44\x1e\x77\xeb\x8c\x38\xb6\x3e\xf0\x46\xf2\x49\xed\xdf\xdb\x79\xaf\x26\x4c\xa9\x87\x1a\xa5\x76\x08\xd9\x34\x55\x71\x06\xe5\xf7\x11\x3b\xad\xe7\x3b\x2d\xe7\xbb\xed\xe6\x3b\xdc\x4b\x5a\x94\x30\xb3\xe4\x51\x21\xb4\x8e\xc1\x1e\x92\xc5\xcd\x7a\x8d\x37\x49\x9d\x94\x6a\x99\x78\x90\xc2\x78\xf1\x82\x19\x49\x19\x36\xd2\xd4\x4e\xf7\x6c\x70\x3a\x1c\x0d\x2e\x9b\xa3\xcb\x41\x9b\x9b\xfe\x77\x9d\x56\x7b\x50\x57\xbc\xc4\x39\xff\xfa\x55\x13\x2d\x62\x1a\x77\xdd\x71\x24\xaa\xb8\x50\x76\xcd\x27\x30\x8a\x9b\xb5\x1d\xca\x0c\xfb\xe8\x85\xaa\x03\x1e\xa3\x6f\x29\x19\x24\x36\x22\x51\xb3\xbe\xb0\x47\xc7\x0f\x9a\x9c\x98\xb5\x64\xef\xa2\x70\x81\x28\xda\x98\xb2\x15\x5f\x27\x49\x1d\x47\x3c\xca\xcc\xae\xd6\xa7\x81\x8b\xa2\x68\x67\x31\xf9\xcd\xd2\xc6\xd1\xce\x78\xca\x74\x53\xd6\xe4\xd1\x4b\x70\x86\x69\xc4\x78\xa0\x95\x06\x38\xb9\x60\xd2\x08\xe3\xa9\x8f\xa3\x85\x8c\xfa\x86\xb2\x59\x50\x48\x78\x7d\x30\xaf\x25\xeb\x6d\x8d\x17\xe6\x49\x96\x57\x1c\xf5\x48\x66\x9d\xaf\x5f\x35\xd4\x48\xc2\x6a\x4d\x95\x58\xb8\xce\xdf\x62\xdf\x57\x82\x1b\x44\x6f\x29\xdf\x76\x48\xee\x15\x0f\x32\xa8\xdc\x07\xb1\xfc\xfc\x46\x74\x14\x22\xcf\x50\x04\xcf\x28\x69\x33\x90\x04\xff\x2e\xee\xcb\xf5\xc1\x34\x5f\xc6\x00\xaf\x44\x89\x36\x61\xa4\x9e\xa9\xfc\x1e\x08\x8e\x81\x2c\xe7\x42\xec\xc7\x14\x1d\x86\xcd\xc6\xc1\x80\xef\x52\x1d\x19\x0c\xd2\x39\x62\x06\xff\x15\x5d\x99\xe3\x6d\xb7\x4d\x3d\x23\xdf\xac\xc6\x82\x29\x74\xaf\x11\xf1\x76\xdf\x1f\xd4\x23\x63\x8a\x89\x27\xec\x9b\x0e\x02\x92\x63\xe4\x61\x9d\xc8\x4f\xcc\x71\xf5\xc0\x96\x27\x70\xeb\x93\x03\x80\xf2\x97\xc6\xb8\x9f\x92\x30\x7d\xc3\xef\xf5\x86\xaa\xfe\x6c\x33\x76\x60\x9c\x99\x69\x37\x76\x6c\x0c\x5f\x7d\x4e\x7f\xdc\x1a\xa3\xf4\xf1\xdc\xf8\x90\x3e\x0e\x8d\xcf\x71\xfa\xfc\xc5\x68\xdd\xfd\x93\x46\x6e\x71\xbe\x0b\x49\xce\xeb\x81\x62\x73\x49\x16\x9b\x6b\xc7\x8a\xcd\x32\x87\x73\xb0\xe4\x2c\x91\x2b\xc2\x2c\xfe\xf8\xf6\xbd\x38\x75\x4c\x58\x71\x8a\xc8\xf6\x3c\x6f\x5a\xae\x4c\xa7\xb3\x62\x0d\x9a\x8e\x5b\x85\x35\x0b\x4d\xcd\x69\xb5\x04\x1d\xe8\xc0\x1f\xdf\xbe\x3b\x15\xa7\x64\xd6\x1c\xbb\x5a\xad\x39\xb5\xaa\x55\xb6\xec\x62\xfd\xe1\x4a\x72\xab\xf3\xee\xb1\xb2\x27\x07\x49\x93\x6a\x8f\x17\xae\xd3\x4b\x33\x20\xe9\x6d\xf0\x37\x60\x59\xee\xa4\x3a\xec\x58\x48\x99\x0e\xfd\xf1\xed\xbb\xe9\xb9\x55\xdb\x84\x96\x59\x33\xbd\x52\x79\xea\x39\x53\xaf\x86\x66\x56\xd9\x71\x2c\xab\x66\xd7\x90\xed\xd4\x66\x33\xc7\xb1\xb8\x5c\xaa\x35\xa7\x62\x59\x65\xdb\xb6\xca\x56\xad\x64\x99\xb6\x5d\x57\xa4\x3a\x2a\x39\xdf\x4d\xf9\x1b\xd0\x2c\x05\xa9\xcd\x09\x94\x44\xd2\xb3\x80\x2a\xc8\xc3\x6c\x4b\xc6\x74\x36\xb5\x1d\xe4\x14\x6d\x54\xf5\x6a\x76\xb1\x54\xf6\x5c\xbb\x6a\x95\x1d\xdb\xa9\x40\x77\xe6\xce\x2c\x7b\xe6\x56\x2a\xd0\xf9\xf1\xed\xbb\x6d\x56\x8a\x76\xcd\xa9\x9a\x65\xc7\xaa\xd4\xec\xa2\x63\x57\xeb\x4a\x9b\x63\xdb\x25\x02\x67\x89\x90\xde\xe2\x31\x31\xd4\x8a\x1e\x32\x4b\x4e\xd9\x73\x50\x75\x06\xbd\x9a\x5b\xb2\x61\xd1\x9c\x4d\x51\xd1\x9a\x4e\xbd\x0a\x9a\xce\xbc\xb2\x5b\xa9\x94\x7e\x7c\xfb\x6e\x99\xa6\x6d\xd7\xcc\x4a\xd5\x29\x59\x66\xa5\x5c\x2e\x55\x9c\xba\x22\xfd\xce\x3d\x0a\x44\xcd\x9a\xcc\x9b\xa2\x03\x3e\x5f\xb1\x06\xea\x72\x5a\x28\x9a\x07\x7b\xb5\x37\x05\x65\x48\x25\xa8\x87\xa9\x0a\x54\x1f\xcd\xd8\xb6\xae\x5c\x32\xb7\x5d\xf7\x69\x76\x5b\x65\x90\x9b\x13\x74\xa7\x02\xd5\x14\xf3\x31\xdc\x14\xb7\xb9\x39\x53\x81\x7a\x8d\xee\xa7\x01\xa4\xde\x39\x8e\x18\x22\x49\x99\xd8\x02\x2a\x8e\x0a\x98\xcc\x82\x04\xf0\x50\x87\xbd\xc4\x86\x6e\x04\x36\x4b\xd6\xca\x2d\x90\xf8\x11\xb2\x43\x5e\x10\x15\xcc\x66\x11\x62\x05\x16\x84\x85\xb4\xe0\x9c\x4f\xee\xca\x0f\x2a\xd2\x33\xbd\xd3\xda\x1f\x52\xbc\x84\xdc\x59\x51\x97\x8c\x0b\x08\x88\x12\x42\x9a\x94\xde\x92\x93\xfd\x8a\x80\x5b\x0f\x15\xa8\xdc\xb6\x0b\x5e\xf8\x43\x21\xa9\x4d\x71\x16\x64\x41\x8a\x43\xf2\x37\x97\x21\xbf\x71\x65\xb9\x3f\xbf\x76\x10\x33\x1f\x13\x51\xca\x17\x7a\x5d\x10\xaf\x32\x42\x60\x82\xf2\xfd\xdc\xfa\xde\xde\xb2\xed\xde\x1e\x60\xed\x08\x4b\x87\x69\xc9\x2c\x4f\x0f\x7e\x06\xa1\x26\x79\xf1\x5d\x62\xf1\x93\xeb\xf5\xdb\x0e\xfe\xe7\x95\xeb\x45\x69\xfd\xa1\x72\xdc\x26\xde\x21\xf0\x06\xcf\xb9\x1b\xc8\x8c\xd3\x7e\x7f\x32\xe8\x5d\x8e\xda\x43\xe3\xfc\xb4\xdb\xea\x74\x5f\xef\x97\xfb\x6c\xa0\x2e\x8a\x49\x3f\xbe\xac\xf6\x3b\x69\xd9\xa9\x9c\xed\xba\xdf\x2d\xd1\xcb\x9e\xfd\x3f\x65\x17\xfe\x13\x2a\x2f\x1c\x61\x55\xd6\xb1\xa2\x05\xa4\xc8\x2b\x78\xc8\x47\x0c\x15\xb8\x87\x53\x08\x83\x30\x0e\x33\x15\xaf\x5a\x02\xc9\x50\x98\x7e\x0b\x52\x88\x50\xee\xbb\xe7\xe7\x7d\x1d\xcc\x0e\x97\x96\xcc\xcc\x47\xc1\x16\x50\x95\x41\xfb\x5d\xa7\xfd\x5e\x91\xe9\xfb\xcb\x81\xb0\xfc\x87\x3f\xc8\x4c\x5a\x09\xfe\x00\x96\x09\x9c\x5d\x09\x58\xe6\x6e\x07\x40\x6a\x9a\x40\x6c\xbc\xfb\xe3\xb3\x56\x01\xbf\x80\x94\x24\x3d\xad\xd0\x94\xb7\x7d\x00\x0f\x97\x77\xf6\x5a\x01\xac\xe7\xd4\x76\xe4\x81\x53\xf7\xe7\xa6\xe5\x2e\xf6\x60\xb9\x6b\x0b\x25\xfb\x02\x29\xa4\xfb\x40\xdb\x33\xf7\x42\x44\xe0\x32\x01\x2d\xfc\x3d\xcc\xee\xb5\x0d\xcb\xc5\xbd\x6f\x1a\x52\x99\xe4\xbb\x06\xb0\xb1\xbc\x4e\x3a\x03\x2e\x8c\x37\xe0\x83\x71\x0d\xde\x18\x97\xe0\xad\xd1\x95\x1f\x34\xbc\x33\x86\xe0\xbd\xf1\x26\x53\xfb\xbf\x9a\x90\xf9\x22\x88\xb2\xdf\x21\x28\xc9\x2d\x64\xf0\x13\x05\x5d\x37\xa0\x1e\x0e\x48\x61\x81\xa0\x87\x68\x41\xbe\xcb\x7e\xea\x60\x87\x77\x27\x21\xf4\x3c\x4c\xe6\xf5\x5a\x78\xa7\x58\xd5\xf0\x6e\x9d\x9e\x46\x63\x63\xbb\x1f\xf8\xaa\x41\x34\xf7\xd4\xab\xe1\xdd\x89\x1b\xd3\x28\xa0\xf5\x30\xc0\xdc\x85\x3f\x09\x93\x26\xa0\x3a\x45\x3e\xe4\x3c\x9e\xb0\x20\xac\x97\x4a\xe1\xdd\xc9\xcc\x0f\x20\xab\xf3\x1b\x28\xf3\x25\xc4\x7a\x2c\xbe\x78\x78\x95\xef\x96\x5d\x3d\xd7\xc9\xdc\x3a\x84\xcb\xc0\x6b\xc4\x46\x70\xfa\x2a\x75\x08\xd7\xdb\xee\x44\x4c\x3e\x35\x62\xc3\x7d\x3b\xd4\x56\x52\x57\xb8\x8f\x18\x18\xaf\xbe\x18\xb3\x80\x36\x17\xd8\xf7\xb4\x4f\xfa\x18\xf0\x91\x7c\x83\xc5\x5f\x0d\xaa\x59\x35\xa7\x5a\xd4\x01\x42\x0d\xaa\xd9\xb6\x5d\x2e\xeb\x80\x21\xd1\x0b\x51\xac\x25\xdf\x6d\x50\xf4\xbf\xc7\x06\x36\xd0\x17\xf0\x0a\x20\x64\x2c\x01\x43\xc6\x14\xfc\x65\x9c\x43\xc2\xb7\x58\xfe\x27\x16\xe3\xad\xc8\xd7\x63\xfd\xe4\xff\x05\x00\x00\xff\xff\x19\xa3\xc0\x50\x6e\x43\x00\x00") - -func bindataTkgWebDistTkgkickstartui644es2015B16fcfdb49088748e8f1JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui644es2015B16fcfdb49088748e8f1Js, - "tkg/web/dist/tkg-kickstart-ui/644-es2015.b16fcfdb49088748e8f1.js", - ) -} - -func bindataTkgWebDistTkgkickstartui644es2015B16fcfdb49088748e8f1Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui644es2015B16fcfdb49088748e8f1JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/644-es2015.b16fcfdb49088748e8f1.js", - size: 17262, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui644es5B16fcfdb49088748e8f1Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x7c\xfb\x77\xdb\xb8\xce\xe0\xbf\xa2\x68\xef\x97\x95\x76\x68\x8d\xe5\xb7\x9d\x4f\xdb\x9b\x3a\x6e\x9b\x99\xbc\xc6\x76\xda\xdb\xc9\x78\x73\x68\x09\xb2\x59\xcb\x94\x4a\xd1\x79\x34\xf6\xff\xbe\x87\xa4\x5e\xb6\x95\x34\xed\xbd\xe7\x3b\xf3\x4b\x22\x51\x20\x08\x02\x20\x08\x02\xa0\x0f\xfc\x15\x75\x39\x09\xa9\x61\x3e\xe9\xab\x18\xb4\x98\x33\xe2\x72\xfd\xe8\x0e\x33\x0d\x10\x47\x0c\x11\x44\x8f\x52\x28\x2d\x34\xc0\x7c\x62\xc0\x57\x8c\x6a\x59\x57\x30\x9f\x88\x6f\x1c\x33\x86\x1f\x2d\x12\xcb\xff\x06\x98\x66\x02\x86\x0d\x30\x37\x06\x98\xeb\xf5\x4e\x07\x7d\x45\x3d\xf0\x09\x05\x4f\x3f\x70\xf8\x63\x04\xa1\xaf\x8d\x1e\x97\xd3\x30\x38\x3c\xa4\xab\x20\x38\x70\xe0\x46\xbd\x5b\x84\x03\xc3\x3c\x64\x93\xf5\x3a\xfd\xa2\xff\xf3\x9f\x69\xab\x3e\x49\xc7\x52\x34\xf8\x2c\x5c\x96\x0c\x8a\xb8\x1c\xf6\x00\x12\xe8\x23\x41\x83\x98\x2f\x9d\xe9\x4e\x4a\x00\x14\xc8\x46\xdc\x94\x7c\x60\xce\xe5\xf4\x0b\xb8\xdc\x8a\x58\xc8\x43\x01\x68\xf1\x70\x24\x3b\x5a\x2e\x0e\x02\x03\x4c\x2b\x0e\x88\x0b\x46\x07\x55\x6c\xf3\x48\x57\xe0\xba\xe3\x38\xec\xf0\x10\x2c\x37\xa4\x31\x67\x2b\x97\x87\xec\xf0\xd0\x60\xce\x56\x8b\x45\xf1\x12\x4c\x49\xcb\x39\x8e\x64\x9f\xf5\x5a\x1f\x81\xea\x5e\x3a\x31\x09\x7c\xcc\x66\xab\x25\x50\x1e\x27\x5d\x7e\xfd\x7f\xc6\x9b\xde\x35\x59\x9f\x9a\x94\x1b\x6f\x7a\x9d\xb5\xdd\x5a\xd7\x6b\xa6\xf1\xa6\xd7\x0f\xf0\x32\x02\xcf\x7c\x23\x91\xfc\xe3\x57\x8b\x43\xcc\x0d\x66\x6e\xcf\x74\x87\x5b\xe6\x13\x9f\xb3\xf0\x5e\xa3\x70\xaf\x8d\x1f\x23\x18\x30\x16\x32\x43\x3f\xa5\x77\x38\x20\x9e\x86\x39\x87\x65\xc4\x35\x1e\x6a\x71\xc4\x00\x7b\x1a\x0d\x69\x45\x0a\x64\x1a\x80\x46\x68\xcc\x31\x75\xc1\xfa\x8b\x9e\x52\x2d\x64\x1e\x30\x01\x3a\x05\x2d\x05\x41\xb2\x03\x16\x14\x69\xa1\x64\x57\xac\x2d\x57\x31\xd7\xe6\xf8\x0e\x34\xac\xed\x49\xde\x30\xb5\x25\xf0\x79\xe8\x59\xba\xb9\x31\xcc\x4d\xa6\x92\x8a\xfc\x27\x43\x28\x86\xe3\xf0\xf5\x9a\xff\x5f\xb0\x02\xa0\x33\x3e\x37\x0f\x0f\x0d\xee\x64\x6f\x47\x7e\xc8\x0c\x25\xd0\x2a\x22\x8e\x98\x9a\x52\x56\x6e\x1e\xb1\xff\xe6\x47\xec\x97\x5f\x4c\x72\xc3\x26\x0e\xdc\xb0\xc9\x51\xc2\x1d\x92\x8f\xe4\xaa\x91\x92\x0f\x7c\xbd\x96\xc8\x95\xe4\xab\xa6\x89\x12\x2d\xf1\x19\xc0\x37\x30\x92\x37\xa5\xe2\x57\x2c\x8c\x80\x71\x02\xb1\x01\xe8\x89\xe1\xfb\xde\xd3\x1d\x0e\x56\xd0\xdb\xee\xc3\xcd\xcd\xc6\x2c\xcc\x2d\xc8\xb5\xd6\xc8\xb9\x1a\xfa\x1a\x37\xcd\x52\xf9\xf4\x31\xa5\x21\xd7\x84\x56\x6a\x58\x73\x03\x1c\xc7\x1a\x8e\x35\x9c\x2d\x56\xbd\x80\x3d\x56\xd8\x0b\x5c\x11\x6c\x48\xb8\x25\xb9\xf1\x24\xda\x89\xc3\x05\x3f\x88\x05\x74\xb5\x54\xd2\x73\x8a\x2f\xeb\xf5\x81\x8d\x88\xd0\x69\x9f\xcc\x56\xea\xfb\x41\x15\xe9\x72\x82\x3a\xa1\x1a\x39\x3c\x34\x88\x75\xcf\x08\x4f\xbe\x65\xac\xda\x62\xce\xa3\x01\xc8\xa0\x0e\xb1\x16\xf0\x88\x42\xe7\x2e\x24\x9e\x56\x45\x7a\x2c\x15\x21\x5b\xa1\x46\xe8\xec\x2d\x69\x5d\x69\x50\x6e\x46\x40\xd9\x09\xc7\x71\xb2\xf5\x0c\xc9\x52\xce\x6c\x0a\x0f\xaf\x18\x59\x12\x4e\xee\x60\x22\x56\x94\x1a\xef\x40\x2c\xba\x64\xda\x2c\x59\xdd\x88\xaf\xd7\xba\x07\x3e\x5e\x05\x5c\x57\xab\x6f\x77\x40\x92\x0e\x43\x8e\x4a\xe5\xf2\xcf\x7f\x16\x86\x53\x8a\x9e\xae\x3e\x2d\xca\xda\x25\xc7\x84\x7e\xab\x6f\x05\xeb\xe4\xf0\x37\xca\xe0\xf4\x2e\x56\xcb\x29\x30\x53\xda\x37\x8a\x52\x08\xd3\x7c\x13\xf6\x14\x84\x11\x9a\x26\x22\xe6\x46\xcc\x81\xa2\x30\x17\xf7\xca\x90\x06\x3d\x57\xe0\xc3\xc3\xd8\x80\xdc\xa8\x21\x6e\x22\x26\xdb\x10\x7b\x5e\x42\x7a\x06\xaf\xa3\xa7\x54\xa6\xbd\x03\x7b\x63\x22\xc8\xc7\x8a\x8c\x6c\x98\xc8\x29\x33\xf4\x43\xf0\x03\x70\xf9\xe1\x61\xf2\x60\xcd\x80\xbf\x29\x3c\x5b\x53\x42\x3d\xc3\xec\x15\x65\x8d\x32\xc9\xf8\xca\x38\x13\xdf\x20\xaa\x89\xa6\x26\x7a\x06\xfc\xf2\x9e\xa6\xf4\x9e\x40\xec\x32\x12\xf1\x90\x19\x44\x74\x48\x48\xa2\x72\x34\xf9\x57\x89\x18\xa7\xc6\x34\x51\xfe\xff\xae\xbf\x81\x1e\x33\x7b\xd4\x92\x22\xd9\x6c\x50\x64\xe1\x28\x0a\x1e\x0d\x3e\x27\x31\xca\xc0\x0b\x8b\xc9\xcf\x17\xd3\xd1\xc1\xde\x7e\x31\xc7\x71\x81\xac\x4c\xaf\xcc\x74\xa7\x73\x0c\x70\xee\xc4\xa6\x79\x94\x11\x59\xe0\xa6\x97\x6b\x7a\xb6\x8e\x33\x4e\xf2\x0c\x07\x2f\xb7\x09\xa3\x55\x04\x4c\x83\x87\x88\x41\x1c\x0b\x74\x52\xfd\x80\xf0\x39\x30\x61\x92\x45\x6f\x2d\x64\x5b\x46\xe2\xa8\xa0\x17\x29\x6b\x5d\x06\x98\x83\xc1\x0f\x0f\x0b\x33\x43\x4f\x85\xbd\x2c\x35\x6a\x80\x72\xc5\xa8\xa2\xa2\x61\xe8\x1d\x54\x37\x9b\x9f\x52\x2e\x7e\x78\xb8\x54\x1b\x55\xc6\x96\xe5\x96\x3d\x5e\xa6\x74\xc6\xc0\xaf\x52\x34\x97\xfe\x9b\xd2\xd6\x32\xf5\xca\x30\x81\x75\x7b\x2b\x09\xb9\xbd\x75\x38\x82\x0d\xda\x1d\x78\x26\x3c\x18\xa1\x76\xdc\x29\x6c\x98\xdb\x2e\x8d\xb3\xa3\xe9\xeb\xf5\x41\xaa\xde\x19\xc7\x12\xa3\x71\x60\x0b\x4d\xde\xfb\x6a\xc5\x73\xbc\xdc\x02\xc9\xa5\x9f\x61\xbf\x62\xe1\xc3\x63\x0a\x54\x3d\xe2\xec\x31\x9d\xc5\xdb\x30\x0c\x00\xd3\x82\x12\x4a\xe1\x5c\xfa\x4a\xfb\xf6\x86\x33\x92\x0e\xe8\x66\x82\x0a\xb3\xda\x98\x26\x3a\xa8\x6e\x5c\xcc\xdd\x79\xee\xfc\x1d\xd8\x9b\x8d\x91\xa9\x6a\x01\x5c\x1a\x59\x44\xa4\x32\x0b\x92\x79\xba\x3e\xef\xe4\xd2\x31\x8b\xae\xcf\x11\x73\xf6\xa9\x20\xf9\xea\x42\xd4\xdc\x40\x10\x83\xc6\x1c\x52\xbe\xfc\x52\x02\xc6\xea\x03\x33\x37\xb9\x90\xc6\xd9\xa2\xe1\x87\x87\x99\xc5\xce\x18\x27\x6c\xfa\x3e\x3b\x79\xe6\x15\xf1\xad\x3d\xe1\x99\xa5\x75\x02\x8c\xdc\x81\xa7\x15\x26\x15\x6b\x4b\xe1\xd2\xd0\xe0\x31\xb5\xf0\x6a\x64\xb1\xc2\x72\xed\xd8\x67\x9d\xf2\x89\xd5\x80\x72\xdf\xca\x07\x1c\x82\x0f\x0c\xa8\x9b\x8e\x2a\xe6\xaa\xcd\x71\x4c\xff\x37\xd7\xa6\x00\x54\x23\x94\x70\x82\x03\x12\x83\xa7\x55\xb4\x58\xac\x77\xc3\xdc\x82\x10\x22\x2f\x0e\x0b\xc2\xdd\xcb\x79\x75\x57\x70\xeb\xef\x5e\x5e\x47\xb3\xef\xac\xa3\xb2\x55\xb4\x5e\x97\x76\x16\x24\xa0\x3b\xb9\x93\xc5\x10\xf8\xd6\x3d\x4c\x23\xec\x2e\xfa\xf3\x15\x5d\xf0\xc5\xec\x76\x41\xdc\x45\xcc\x31\xe3\xb7\x2b\xe2\x7c\x17\x62\xbd\xbe\x99\x98\x56\xb4\x8a\xe7\xc6\xcd\x4d\xab\xd1\x98\xa0\xa7\x6e\xa3\xd5\x68\xe4\xb4\x61\x14\x23\xdf\x7c\xf2\x2d\x66\xc4\x26\xf2\x2d\xcf\x88\xd1\xd3\x49\xe8\x2e\x80\x7d\x22\xdf\x30\xf3\xce\x43\x6f\x15\x40\xaf\xa0\xce\xa9\x7e\xc1\x66\xa3\xce\x02\x4b\xc7\x37\xea\x9d\x66\xa7\x6e\xa2\xb1\xe3\x1b\xb5\x6e\xa7\xde\x31\xd1\x5c\x3c\xd6\x9b\x4d\x13\x3d\x8a\xef\xed\x4e\xa7\x6d\xa2\x2b\xc7\x37\x1a\xad\x76\xa7\x66\xa2\xa9\xe3\x1b\x9d\x76\xb7\xde\x34\x51\xdf\x79\xf2\x09\x04\xde\x39\x8e\x22\x42\x67\x71\xef\xe6\x49\x9c\x00\x7a\x3a\x89\xfb\x21\xa5\xe0\x72\xf0\x74\x24\xbd\x6c\xe1\xf7\xc6\xbd\x9b\xa9\x85\x17\xd6\xe9\xe8\x76\x3c\xbc\x1e\x4c\x10\x89\x93\x75\x2a\x4c\xab\x17\x5e\x84\xfc\x78\xc5\xc3\x21\xc4\x3c\x64\xd2\xdc\x06\x78\x0a\x41\x4f\x3f\xb9\xec\xff\x3e\x18\x6a\x27\xc7\x83\xf3\xcb\x0b\xad\x7f\x79\x71\x31\xe8\x8f\x07\x27\xfa\x66\xb2\x41\xb7\x82\x9c\xba\x5d\x6b\x9b\x68\xe1\xf8\x86\x5d\x6d\xd5\xbb\x26\xba\x74\x7c\xa3\xd9\xac\x76\xeb\x26\xba\x10\xa4\xd7\x6a\x76\xdd\x44\x43\x01\xd0\xa8\x36\xba\x26\x3a\x11\x73\xab\x76\xea\x35\x13\x0d\x1c\xdf\xe8\xb6\xaa\xed\xb6\x99\x9f\x0d\x47\x6a\xc1\xd9\x87\x70\x78\x68\x2c\xac\xf1\xec\x4f\xa3\x8a\x74\x37\x60\x15\x1e\x86\x01\x27\x51\xc5\x0d\x29\x07\xca\x75\xd4\x31\x91\x02\xb0\x91\x1e\x47\x98\xea\xe2\xfd\x76\x75\x6d\xd4\x90\xae\x5d\x05\x80\x63\xd0\x80\xc6\x2b\x06\x1a\x9f\x63\xae\x29\x21\x69\x24\xd6\xd8\x8a\x52\x42\x67\x5a\x48\xb5\xc7\x70\xc5\xb4\x20\x74\x71\xa0\x2d\xb1\x3b\x27\x14\x90\x86\xa9\xb7\xd5\x23\x06\xce\x05\x97\xd3\x63\xc5\x92\x50\xb2\x5c\x2d\xb5\xd0\xd7\x1a\x5a\xff\xea\x3a\x96\x3d\x5a\xef\xdf\x6a\xc3\xe3\x73\x0d\x07\x02\x1d\x07\xcf\xd2\x24\x45\x5f\xff\x3c\x36\xb2\xff\x85\xe5\x72\x9a\x99\x16\xfb\x30\xd9\x09\x98\xb3\xb0\x06\xd1\x3b\xc3\x3c\xca\x66\x3e\x5d\x71\x1e\x52\x1d\x75\x05\x8a\x0b\xef\x37\x43\x77\x03\xe2\x2e\x74\xb4\xaf\x5f\x0b\xab\xff\xe1\xdc\x60\x02\x30\x7c\xb8\x37\xa4\x95\x14\xaa\x30\x0e\xd5\x3c\x0c\x73\x93\x72\xc8\x46\x7a\x22\x4c\x6d\x7c\xa9\x29\x29\xe7\xc4\x16\xec\xdf\x9f\x45\x22\x8b\x12\xf1\xc8\x9d\x8e\xec\x6a\x41\x04\xaa\xc5\x4e\x5b\x6a\x69\x4b\x2d\x6d\xa9\xa7\x2d\x75\x49\xc6\xf5\x9f\x46\x43\x49\x96\xb8\x62\x86\x76\xa3\xc8\x2d\xd1\xa1\x99\xc8\x15\xd9\xcd\x94\xf0\xd6\x1e\x47\xf7\x38\x8c\x6a\x45\x76\x4a\x4e\x1c\x2d\xac\x87\xa8\xa5\x3a\x5f\x7e\x5d\x19\xcc\x02\x61\x04\x2f\x42\x4e\x7c\xe2\x62\x31\xd3\xe2\xa4\x8f\x4b\x75\x50\xd1\xde\xfa\x4f\xce\xb8\xfd\x9a\x19\x23\x7d\x98\xa8\x6b\xa2\x8e\x1e\x86\x65\x48\x51\xa6\x86\x99\xc2\x29\x5d\x34\x1a\xa6\xd4\xc7\x71\xc8\x71\xa0\x9d\xc3\x32\x64\x8f\x9a\xd1\x7a\xff\xd6\xd4\x12\x83\x00\xe2\xf8\xfb\x5d\x3e\xe6\xfc\x78\xf7\x02\x3f\x3a\x7b\xfc\xe8\xee\xf2\xa3\x56\x2d\xf0\x43\x4d\xaf\x66\xa7\xd3\x6b\x20\x5d\x4b\xf4\x94\xd0\x99\x65\x95\x2d\x9a\x7d\xd2\x84\x74\x1f\xd0\xbd\x63\x18\x0f\x4e\x71\xd7\xf0\x0c\x86\x40\xd9\x58\xee\xcc\x0c\x56\x30\x2c\xcc\x00\x94\xfa\xf9\xe9\x06\x16\xa4\x3b\xbe\x38\x32\x26\x5e\xbc\x74\x30\x4c\x2b\x61\x15\x09\xe9\x08\xd8\x1d\x71\xc1\x01\x44\x2d\x1c\x91\x7e\x40\x80\x72\x87\x20\x9a\xae\x2f\xf0\x9c\x03\x3b\x7f\x25\x74\xa6\xde\xf7\x74\xcc\xd1\x75\x44\x93\x63\x99\xb6\x32\x18\xba\x79\x5a\xc0\x63\x4f\x77\x57\x31\x0f\x97\xe4\x1b\xbc\x0b\xd9\x52\x9a\xed\xd5\xd6\xfe\x21\x48\xb2\x18\xcc\x48\xcc\x81\x9d\xa8\x23\xe4\x3b\x12\xc0\xe9\x32\x0a\x19\x07\xef\x03\xa6\x5e\x00\x4c\x92\x6e\xc1\x1d\xd0\xad\xaf\xa8\x6f\xa2\x97\x31\x48\x8f\xe0\x25\x24\x12\xc0\xdc\x6c\x90\xa2\x97\xce\x2e\xe9\x29\x25\xbc\x84\xd4\xc8\xb8\x33\x58\xee\x2d\x9a\xa8\x00\x9c\xb8\x6e\x19\x93\xd1\xdc\xfa\xd3\x5a\xc5\xc0\x4e\x30\xc7\x62\xea\x09\xa7\xad\xe9\x8a\x04\x9e\x68\x50\xc4\xf8\x21\x5b\xbe\x67\xe1\x2a\x52\xd3\xb8\x97\xbb\xec\x05\x5e\x02\xca\x3e\xcb\xb7\x74\x9e\x73\xbe\x0c\xde\x89\xdd\xf1\x4c\x6c\x62\xb1\x23\x86\x49\x77\xcb\x6b\x4e\x02\xc2\x09\xc4\xc2\x8b\xc8\x81\xce\x71\x64\xa4\xdd\xe5\x1e\x98\xf0\x48\x61\xc8\x3e\x6d\x09\xca\x48\x1b\xf7\xac\x6c\xca\x27\xe1\x51\x09\xc8\x4f\x84\xcf\x47\xf8\x0e\x3c\x31\xd1\x12\xa6\x65\x1d\x04\x4d\xc9\x6c\x5e\xc5\xdb\x2d\xf8\x5d\xf6\x66\x58\x77\x08\x2c\xc1\x2c\xe3\xb4\x8e\xe8\x75\x54\x9c\x92\xd4\xe4\xaa\x9a\x65\xa6\xf9\x96\x3b\x07\x77\x71\xea\x2b\x64\x27\xd2\x16\x1d\xdf\x61\x12\x88\x53\x96\x61\x5a\x11\x89\xc0\x30\xaa\xe8\xca\x1a\x9a\x4a\x7e\x2b\x1a\xaf\xa6\xe2\x08\x3d\x05\xd3\xb4\xb2\x67\x23\x23\x80\x9b\x4f\x50\x5c\x4c\x07\xdc\x8a\x39\xe6\xab\x18\xc1\xce\xa2\x02\x8b\x41\xbc\x62\x0c\x5c\x25\x3c\x63\xdb\xe1\x81\xfd\x65\x6b\x91\x78\xcc\x56\x60\x98\x48\xe7\x6c\x25\x4e\x84\xb0\x24\x7c\x20\xf4\x5b\x1e\x09\x37\xe8\x59\x32\xec\x92\xe1\xf7\xd7\x34\x57\x6d\xd6\x12\xe2\x18\xcf\x60\x93\xf3\x5d\x2a\xd2\x75\xa2\xdf\xcf\x2d\xeb\x2d\xa0\x77\x2c\x5c\x26\x2e\x5d\xa9\x3a\x9e\x90\x38\x0a\xf0\xe3\x25\xf3\x80\x19\x7d\x73\xb3\x99\x98\x88\x6d\x8c\x5b\xeb\xd4\x34\xad\xbf\x56\xd5\x5a\xbb\xe9\x63\xd7\x29\xf1\xa3\x29\xdc\x1b\xb0\x5e\x3f\x98\xc6\xc2\xfa\x5c\x6f\x19\x97\xd6\x50\x98\x53\xf1\x78\x61\x05\x57\xa6\xb9\x41\x0f\x09\x06\x77\x19\x39\x0b\xeb\x5f\xd1\xd2\x78\x12\x6a\xd6\x7b\x40\x31\x88\xe3\x95\x74\x23\x6f\x74\x1c\x45\x15\xb5\x03\x55\x72\x66\x57\x62\x0e\x91\x3e\x99\x20\x1f\x30\x5f\x31\x88\x7b\x37\x0b\xeb\xeb\xe5\x97\x09\xf2\xc0\x0d\xe2\x9e\x5d\x45\x77\x98\xc5\xbd\x26\x92\x87\x1c\x81\xc8\x46\x3a\x27\x3c\x00\x7d\x82\x6e\xea\x48\xa7\x05\x9e\x8a\x26\x1d\x33\x82\x2b\x01\xb9\x03\x1d\xe9\x38\x8e\x81\xf1\xe4\xd9\xb6\x1f\xc7\xca\x15\x1c\x33\x32\x9b\x09\x85\xd6\x75\xa4\xc7\x73\x2c\x0e\xfc\x3a\xa1\x7e\x58\x71\x09\x73\x03\xf1\x16\x93\x6f\xe2\x5f\xad\x26\x71\xba\x01\xbb\x0a\x63\x22\xc7\x40\x3a\x0f\xa3\x0a\x23\xb3\x39\xd7\xe5\xa6\x3c\x52\xa0\xc1\x4c\x47\x6a\x97\x3e\xf5\x2f\x23\xa0\x49\x47\x1c\xc7\x3a\xd2\xa7\x9c\x6a\x53\x4e\x2b\x01\xa1\x0b\x1d\xd5\x51\xea\x8c\x35\x84\x9d\x3b\xf5\xb7\x60\x71\x00\x8c\x6b\xf2\x6f\xc5\xc3\x54\x11\xca\x42\x49\x96\x6c\xfd\x7e\xb7\x78\xe5\xba\x20\x5b\xbf\xdf\x4f\xb8\x15\x2c\xbc\xdf\xfd\xf8\xaa\x09\x4f\x90\x10\xc7\x94\x53\x35\xc5\xdd\xe9\x09\x4c\xdb\x04\xd8\xd9\x93\xbe\x35\x41\x85\x48\x35\x11\x0e\xcb\x78\xaf\x45\xc8\x84\x63\x4e\xdc\xed\x2f\x6e\x48\x2b\xf7\x0c\x47\x91\x42\x92\x49\x13\x1e\xdc\x00\x2f\x95\x8e\xa5\x42\xdd\xea\xb5\x85\x86\xc3\x03\x7f\x0d\xb5\x29\x5f\x8b\x23\x49\xb3\xf6\xe2\x18\x29\x87\xf3\x37\x37\x0c\x2a\x76\x2d\x69\x10\x83\x57\x5c\xa0\x5c\x0a\x7a\xc9\x2b\x76\x35\xf9\x12\x47\x84\x52\xd9\x9a\x3c\x55\x96\x9e\x58\x2c\x1c\x96\x51\x80\x39\xec\x04\x90\xca\xfc\xac\x6a\xc1\x73\xd7\x3e\x26\x6e\x5c\xea\x10\x5e\x31\x60\xf0\x75\x45\x62\xc2\x21\x56\xfe\x93\xf0\x35\x6b\x48\x2e\x56\x35\x8f\xad\xf5\x85\xec\x82\x47\x56\x38\x5b\xe9\xa5\x6e\xaa\x74\x67\x3f\x5f\xb8\x46\x13\x8d\x50\x1d\x3d\x77\x1c\xab\x17\xfd\x34\x01\xde\x42\xa7\xa8\x86\x0a\x67\x98\xc6\x2e\x44\x1b\xfd\x89\xda\x28\xf5\x1c\x9b\x69\x73\x07\x1d\xa3\x36\x4a\xa7\xde\x4a\x9b\xbb\xe8\x1d\x6a\x66\xcd\x6d\xe5\xe9\x4b\x4e\x09\xe7\x5e\x52\xf9\x47\xeb\x37\x63\xdb\x94\x20\x9e\xe4\x14\x84\x37\xb3\xe5\xf0\x23\xd5\xaf\x91\xf7\x13\xab\x06\x1d\xf0\x7c\x0f\x48\x61\xec\x17\x60\x0e\x0f\xf3\x37\x42\x67\x87\x87\xbc\xe4\x70\xf1\x0c\x9e\xe7\xd1\x7c\xb7\x87\x80\x31\x37\xc8\x23\x62\x2f\x24\x77\xc2\xe2\x0e\xad\x10\x9d\x58\xbf\x2d\xbf\xa0\x13\xeb\xeb\xdd\x19\x1a\x58\xe2\x89\x7e\xfd\x8c\x96\xd6\x65\x13\x9d\x58\xdf\x4e\xde\xa1\x13\xeb\xb4\xfb\x6d\x82\x62\xfe\x18\x88\x3e\xba\x25\x8d\xf0\xcd\x2d\x9d\x25\x82\xac\xfc\x57\xff\xf2\xfc\xea\xbf\x26\x4f\x7e\x48\x79\x45\xd8\xcf\x9e\xdd\x8a\x1e\x8e\x96\x98\xcd\x08\xad\x4c\x43\xce\xc3\x65\xaf\x56\x8d\x1e\x36\xcf\xf6\xd5\x34\xcd\x4a\xed\x48\x19\xea\x6d\x5c\xdd\xe8\x61\xa3\x4f\x36\x26\x7a\x30\xd1\xb5\xe3\x1b\xad\x4e\xa7\xdb\x34\xd1\x57\xc7\x37\x9a\xb5\x5a\xa7\x6e\xa2\x33\x67\xcf\x59\x79\xb5\xd7\x9f\x6d\x81\xb9\xb3\xcf\x9f\x09\xc3\xef\x7b\xe6\xf1\x4a\x00\x4a\x57\x23\x3e\xf6\x7d\xc5\xf7\x11\x87\x28\xcd\x09\x48\x15\xdb\xdb\xd9\x15\xa2\x9b\x6b\x2b\x6c\x5b\xfd\xb3\xeb\xd1\x78\x30\xbc\xbd\xba\x3c\xb9\xed\x9f\x9e\x0c\x27\x99\x7f\xe0\x3d\x52\xbc\x24\xee\x6b\x50\x69\xd2\x15\x48\x5d\xd6\x8f\x02\xc8\x28\xc5\x6e\xbe\xd1\xfb\xc1\x4a\x78\xf9\xda\x55\xe8\x69\xa2\xa9\xa7\xe9\xbf\xbc\xba\x7b\x8f\x59\x5e\x4e\xcf\xab\x5d\x99\xdc\x81\x4c\x02\xfc\x29\xec\xa9\x07\x54\xac\x03\x60\x86\xee\x2a\xc2\xae\x42\xaf\x4f\x3c\xa6\x9b\x47\xcf\xf9\xff\x72\xb4\x53\x1a\xad\x12\x27\xaf\xe0\xe8\xcb\x73\xc0\x96\x67\x54\x74\x89\x6e\x76\xc7\x98\x64\x3e\xd2\x57\xeb\x4b\x1e\xb7\x2c\xce\xd1\xd1\x47\x11\xb8\xc4\x7f\xd4\xf8\x1c\x34\x77\x87\x79\x3a\x82\x8d\x61\xa2\x6f\x8e\x6f\x74\x1b\xdd\x6a\xd3\x44\xe7\x8e\xee\x49\xb3\x7b\x11\x7a\x30\x4a\x22\x43\x3a\xfa\xfc\x5c\x44\x2e\xc1\xa8\x7c\x74\x69\xa6\x19\x78\xbd\x83\x6a\x69\x74\xee\xe3\xf1\xd9\xe9\xc9\x6d\x2a\x95\x8b\xe3\xf3\xc1\x24\x0d\xc5\x25\x8d\x9a\x68\x94\xf1\xb7\x2f\x8e\x6f\xd4\x5b\xed\x6e\x41\xdb\x3f\xec\x45\x6b\xf8\x87\x4f\x46\x15\x35\x72\x83\x6f\x3f\x63\xbd\xbb\x85\x5d\x23\x0b\xa6\xa5\xb6\xfa\xe2\x36\x7a\x31\xb0\x22\x6d\x6f\xf4\xc7\x47\x83\x59\x85\xe9\x9e\x26\xe1\xec\xc4\x00\xfe\xc1\xc7\x46\xb5\x18\x66\xf9\xed\xb9\xd8\x92\xda\x5a\x29\x67\x61\x50\x91\xb6\x34\x8b\xec\xd9\xaf\x09\xf3\x48\xa0\x39\xf9\x62\xe8\x9a\x8e\x32\x8a\xc6\x8f\x11\xe4\x99\xbc\xb1\xb0\x5c\x7d\x1c\x03\xd2\xb5\x74\xc1\x08\x79\xc9\xe8\x60\x22\x24\x4b\xd3\x8b\xe4\x7e\xfc\x3b\x92\x2b\xb3\x70\x32\x78\x2d\x63\x3e\x40\x3d\xed\x9e\xf0\xb9\x86\xb5\x00\xb8\x80\x0a\x99\x46\x65\xb2\x57\x85\x35\x5d\x4c\x35\x41\x2b\x26\x54\xa5\x17\x82\xf0\x1e\x98\x8b\x63\x48\x3a\xc4\x28\x81\x8f\x55\x87\xf9\x63\x34\x07\x1a\xef\xf0\xe2\xd3\xdf\x8c\x17\x17\x19\x2f\x68\xc8\x35\x42\xdd\x60\xe5\x81\x76\x3f\x17\x0e\x51\x84\x5d\xd0\x42\x2a\x78\x93\x4c\x43\x8c\xfc\xc7\xee\x96\xc2\x11\xfb\x1f\xdd\x54\xc4\x2e\x92\x18\x8b\xe7\xcd\xfe\xe7\xbf\x7b\xcc\x45\x19\xe2\xdd\x09\x09\x19\xff\x3b\xa1\x98\xef\x60\x2d\x89\xd0\x7c\xa7\xc7\xcf\x07\xcf\x7e\x16\xf1\x2b\x63\x6a\x49\x08\xa9\xd4\x68\xe6\x3b\x13\x56\x8b\xdd\x0f\x99\xdc\xa4\x92\xfd\xbc\x74\x75\xfc\xa2\xa7\x7b\x98\xa5\xff\x87\x22\x11\x9f\xbf\x17\x89\xf8\xbc\x15\x89\x48\x77\x59\xf6\x62\x44\xc2\x50\x95\x4f\x0b\x8b\x36\xbf\x19\xcc\x34\x4d\x03\xd6\x6b\x66\x6e\x10\x7b\x26\x0c\xc1\xf6\xc3\x10\x34\xf4\xa0\x92\x24\x67\xbe\x1b\x81\x68\xec\x44\x20\xf6\xdd\xb5\x9b\x3a\xd2\x33\xbd\xff\xde\x99\x2f\x7f\x89\x97\x95\x56\xe1\x35\x98\x55\x1a\xe9\xd9\x3b\x33\x85\x72\x0f\xd7\x91\xae\x4f\xd0\x3f\x64\xb2\x89\x7c\x03\x31\x61\x03\x1c\xd7\xb8\xd1\x7b\x6e\xd1\xa6\x4b\xe0\xbf\x56\xb5\x86\xed\xb7\x3c\x68\x34\x3a\x5d\xdf\x6e\xfb\xd0\x76\xbb\x75\xbb\xde\xe8\xb8\xee\xb4\x51\xc3\xf5\xe9\xb4\xd9\xac\xe3\xda\xd4\x6b\x36\xda\xb6\x82\x6e\x76\x3b\xad\x56\xb7\x66\x37\xab\xf5\x6a\xad\xd3\xaa\x37\x1a\xdd\x9e\xa6\x23\xbd\x77\x7a\x31\x1e\x0c\xaf\x2e\xcf\x8e\xc7\xa7\x97\x17\xaa\x69\x34\x3e\x1e\x8e\x6f\xc7\xc7\xef\x6f\xfb\x67\xc3\xdb\xf1\xe5\xe5\xd9\xf8\xf4\xaa\xb7\xff\xe5\xb4\x7f\x79\x21\x9b\xfb\x67\x97\xa3\xc1\x7e\x73\x29\x9e\xdb\xfe\xe5\xc5\x78\x70\x31\xde\x81\x18\x5d\x1d\x5f\x94\x10\x74\x6b\xab\xc6\x7c\x04\x09\xb8\x3f\x68\x19\xf6\x52\x88\x9e\x3e\x31\x4d\xa4\xff\xb5\xf2\x7d\xdf\xab\xaa\x7f\x7a\xfa\xfe\xbf\x5a\xbb\x0d\xed\x9d\x86\x5f\xf7\x5a\xfe\x4f\xa7\x67\xab\xa7\xa4\x8b\x9d\xbe\xe7\x58\x6a\x7b\x4d\xd5\xbd\x96\x5f\x4b\xa0\x7e\xcd\x91\x25\x0d\xf9\x68\x05\xa0\x94\x6a\xf3\xef\x17\x1b\x63\xd2\x57\x57\x43\x89\x05\xd4\x57\x5a\xaf\x5c\xde\x6d\x07\x58\x8f\x02\xec\xc2\x3c\x0c\xbc\x94\xb6\x25\x7e\x50\xe5\x52\x3a\xd2\x1b\x92\x94\x74\x04\x69\x21\x7f\x28\x8c\x35\xd9\xbc\x32\xa6\xe2\xcb\x44\xcb\x7e\xf6\x72\x2f\x75\xb5\x13\x27\x21\x62\xa2\x95\xc4\x81\x02\xe5\xdc\x88\xcf\x0d\xa4\x27\x4b\x5c\x46\x41\x84\xd7\xdd\x54\xe1\x0e\xf1\xb5\x55\x1e\x64\x69\x17\x83\x2c\x85\xe0\xc7\x07\x54\x47\xcf\xb9\xe9\xad\x3d\xb7\xbc\xf0\x2e\x90\x76\x85\x94\xa5\x34\xda\x69\x93\xbd\xe3\x97\xcd\x21\x88\x12\xda\xc5\x80\xb6\x8d\x7e\x43\x35\x64\x97\x39\x6f\x2a\xc7\x2e\xa1\x6a\xe8\xe3\x2b\xa0\xea\xe8\xd3\xcb\x50\xdf\xcf\xdd\x4a\x39\xc9\x90\x47\x6e\x8c\x11\x2f\x9e\xfe\x94\xaf\xd8\x49\x0f\x1d\x7c\xd7\xcd\x28\xee\xa7\xe9\xc9\xa3\x99\x76\xab\x67\x11\x95\x82\x92\x21\x6e\x65\xc7\xb1\x01\x5d\x2d\xad\xe1\xe0\x8f\xeb\xd3\xe1\xe0\x64\x3f\x0e\xf3\x52\xaf\xfd\xe3\xdb\x8f\xf5\xff\xf4\xe1\x74\x3c\x18\x5d\x1d\xf7\x07\xbb\xb1\x9d\x2f\xd6\xed\x67\xf4\xc5\xfa\xed\x0c\x7d\xb1\xe2\x19\x3a\xb1\xde\x37\x9b\xe8\xc4\x3a\x9f\xfd\xfe\x4c\xc8\xe7\x8b\xf5\x4e\x3c\x3e\x0c\xaf\x44\xb7\xdf\xd0\x17\x6b\x85\xbe\x58\xf4\x04\x9d\x58\xfd\xf3\x96\x00\x5f\x74\xb3\x90\xd0\xc7\xaf\xc7\x85\x90\x90\x8c\xc5\x30\x71\xec\x7d\xef\xf8\x46\xa7\xd3\xad\x55\x4d\xf4\xbb\xe3\x1b\xb5\x5a\xb5\xde\x34\xd1\x5b\xc7\x37\xda\x8d\x6e\xb5\x61\xa2\x7f\xc9\xea\x15\xa8\x9b\xe8\x1f\xe2\x34\xda\x6c\xda\x35\x13\x01\x88\xe7\x6e\xb5\xdd\x34\x11\x17\xcf\x76\xbb\x51\xef\x98\x88\x89\xe7\x56\xbd\xd5\xb6\x4d\x44\xc4\x73\xdb\xae\xdb\x55\x13\x51\x90\xa7\xeb\x7a\xb3\x6e\xa2\x50\x3c\xd7\x5a\xd5\x66\xdb\x44\x58\xe2\x69\xd6\xbb\xb5\x82\xef\xed\xc2\xcb\x65\x13\x8f\xf4\xc1\x28\xae\xeb\x64\x31\xd8\x76\x92\x96\x57\x25\x14\x73\x4c\x67\x50\xa8\xa1\x80\xe7\x8b\x28\x42\xaa\xfc\x35\xe1\xb9\x8d\xa4\x07\x02\x9e\x01\xaa\x94\xa2\x98\xba\xaf\xe7\x71\x4e\x95\xee\x7f\xa6\x58\x23\x1d\x40\x5d\x8e\x70\x16\xd6\xf9\x71\x6c\xd4\x32\xaf\x69\x77\xd8\xb7\x12\x67\x5f\xa0\x31\x4c\x79\x0f\x40\x3d\xca\xf1\x47\x27\x77\x46\x63\xa7\x70\xe2\xed\x1f\x8b\xad\x0a\x8e\xe0\x07\x19\x96\x4e\x42\x65\xed\x7f\xa8\xe2\xa4\x66\x5a\xf0\x20\x88\xee\xa7\xc5\x9a\x0a\x3c\xa3\xb5\x96\x24\xfe\x9f\xa3\x35\x7e\x2d\xad\xd2\xac\xa9\xf0\xb6\x8c\xee\xb2\x65\x12\xed\xed\xec\x04\xbf\xa5\xe9\xd9\x0d\x7e\x37\xf7\xea\x33\x5a\x05\x43\xbe\x6d\xf8\x9b\x05\xb1\xb6\x7f\xa2\x06\xc7\x83\x28\x08\x1f\x0b\xa5\x37\xad\x5d\xc5\x69\x17\x46\xe8\xfc\xc4\x08\x0c\xee\x08\xdc\x6f\xb3\xfc\xc0\xce\x99\xde\x49\x4a\x32\x8a\x81\xf7\x2e\x0a\x40\x85\xf2\xe9\xac\xb0\x9d\xa1\x76\x99\x69\x56\x52\x22\xbe\x91\x1d\xdb\x49\xd9\xb1\x5d\x5a\x37\x75\x50\xd4\x11\x29\x1c\x19\xf7\x6d\xe0\x5e\x80\x5c\x74\x78\x36\x6a\x9e\x5b\x6c\x8f\xc4\x78\x1a\x80\xc4\x9f\x3c\x9f\x48\xfe\xaa\x55\xb2\x35\x90\x8a\x22\xa8\xcf\x9a\xe8\xf0\xea\x60\x82\xbe\x3f\x70\x72\xa8\x18\x87\xb3\x99\x74\x9d\x96\x98\xe2\x19\x88\x13\x7e\x25\x3d\x6d\x29\xcd\xaf\xf8\x2c\x5c\xa6\x3a\x99\xc6\x1a\x56\x50\x72\x00\x7a\x9a\x13\x0f\x7a\xb2\x2a\x1c\x9c\x9b\xa7\x08\xf3\x79\x4f\xd7\x91\x1b\x2e\xa3\x90\x02\xe5\xfb\xe1\xd5\x1f\x29\x74\x41\x14\x85\x08\x23\x17\xc5\xaa\xf7\xaa\xa4\xe4\x65\x55\x2c\x79\x41\xa2\x93\x8b\xb0\x99\xae\xe1\xb4\xec\x85\xa2\x95\x45\x96\xc5\x96\x10\xad\x0a\x85\x30\x31\x5a\xbd\x10\x38\xcf\x4f\xd2\x32\xe5\xfe\x7c\xa4\xe3\xbd\x75\x66\xa9\x3a\x34\xe1\xde\xbf\x3b\x7d\x7f\xfb\xee\xf4\x6c\x70\x7b\x7a\x7e\x75\x39\x1c\x0f\x4e\xf2\xa3\xec\x0e\x62\xb9\x93\xfe\x3b\xb8\x6f\x07\xc3\xe1\xe5\x70\x07\xff\xa7\x4c\x79\x9f\xc5\xaa\x17\x6b\x3e\xf5\x9d\xfe\x32\x45\x50\x7e\xd6\x4e\x0e\x9b\xf2\x44\x5d\xac\xa1\x78\x17\xb2\x25\x2a\xb4\x5e\x00\xbf\x0f\xd9\x62\xaf\x39\x8f\x3a\x8b\x4f\x93\xff\x78\x80\x28\x8b\xef\x58\x4b\xcc\x16\xc7\xf1\x09\x61\xfc\x31\xad\x75\x91\x09\x9f\x2c\x4c\x0f\x5c\x2e\x1f\x23\xff\xf4\x26\x7f\xfc\x45\x4f\xd2\x93\x7a\x2f\x61\x95\x5e\x28\x8d\x00\xfe\x8e\x85\xcb\x2b\xfc\x18\x84\xd8\xdb\x23\x19\xd2\x90\xc4\x56\xc6\xe2\xad\x75\x75\x67\x5d\x0c\xc6\x9f\x2e\x87\xbf\xa3\xad\xf4\xc5\x68\x30\xfc\x78\xda\x1f\xc8\x14\x06\x02\x8b\x2a\xd6\xc9\x9b\x75\x6a\x75\x26\x24\xcb\x14\x07\xfa\x21\xd4\x69\x66\xa4\x14\xed\x55\xe8\xfd\x08\xca\x8b\xd3\xdb\xf1\xe7\xab\xc1\x0e\x2a\x4a\xc6\x52\x28\x25\x38\xce\x77\x4e\x4f\xb0\xed\xd9\xe6\x51\x19\x59\xc0\xaf\xd2\x54\x05\xbe\x1a\xb0\x1d\xef\x4b\x05\xb7\x8a\x3c\xcc\x41\x69\xee\x98\x2c\x21\xe6\x78\x99\x04\xdd\x0a\x56\xbb\x58\x95\xf4\x9c\xa0\x8a\x99\x1f\xc4\x9d\xa7\x8d\xac\xd6\x2f\x4c\xcf\x79\x4a\x28\x3e\xb9\x18\x5d\xc8\x7c\x88\x8e\xd2\x39\x84\x9e\x14\x48\xa1\xa9\x20\xa6\x5e\x49\xca\xea\x75\x0a\x60\xa2\x6d\xe9\xfc\x18\xa6\x2c\x13\x86\x12\xc1\xbc\xb2\x7b\x22\x5b\x73\x83\x78\x51\x48\x4e\x49\xef\x1d\xa9\x26\x72\xfc\xde\x08\x57\xc3\xcb\x7f\x7d\xbe\x1d\x0d\xc6\xe3\xd3\x8b\xf7\x23\x33\x75\x8e\xe8\x2a\x08\x8e\x98\x73\x73\xa3\x7f\x18\x8f\xaf\xa4\x1e\x5c\x0f\xcf\x74\xb4\x8f\x40\x7c\xbf\x55\x58\xae\x87\x67\xe2\x58\x9d\xf7\x88\x81\x51\xa9\x61\x2f\x77\x1b\x0d\x86\x2a\x27\x55\xe8\x7b\x85\xe3\xf8\x3e\x14\x7b\xfe\x8b\x7d\xaf\x8e\x47\xa3\x4f\x97\xc3\x13\xd1\x97\x86\xb2\x67\x59\x8f\x8b\x4b\x05\x3f\x99\x20\x56\xc6\xbb\xf2\x31\x46\xb7\xa7\xa3\xdb\xd1\xf1\xf9\xe0\xf6\x78\x74\x2b\x1a\xcc\x37\x37\x13\xcb\x0d\xa9\x8b\xb9\x11\x0a\x67\x29\xe1\xcf\xe8\xc7\x19\x34\xfa\x77\x38\x34\xfa\x29\x16\x4d\xcc\xde\x4f\x92\x3f\xfa\x59\xfa\x47\xff\xd6\x04\x46\xfb\x33\x40\x45\x2b\x60\xcd\x39\x8f\x24\xa6\x2d\x37\xd5\x79\x02\x2a\xfd\xb9\xde\x41\x75\x83\x98\xd8\x75\x06\xd8\x9d\xe7\x85\x81\xd9\x55\x3d\xd8\x51\x03\x76\x63\x4f\x10\xbb\xa9\x4d\xcc\xa3\x4c\x9b\x1c\xc7\x61\x37\xd5\xc9\xe1\xa1\x41\x1c\x62\x31\x90\x91\x26\xe3\xd7\xbf\xe2\x5f\x67\x48\xd7\xcd\x57\x51\x74\x23\x30\x4c\x1c\xb2\xc9\xf2\x36\xdc\x22\x32\x85\xcd\x1f\xcf\x33\x9f\xcf\x79\x22\xde\xf2\x56\x46\xa5\x75\x1a\x52\xd0\x37\x88\x67\xd6\x52\x66\x81\xc6\x8b\x99\xc2\xfb\x9d\x8c\x7e\x5e\x55\xa9\xba\xfd\xfe\x5e\x75\x7b\x17\xb2\xa4\x9a\xf4\x29\xc2\x0c\x2f\xe3\xcc\x0a\xa5\xa6\xdd\xdc\x6c\x19\xe8\xf3\xfe\x8b\xce\x4a\x59\xfd\xc0\xae\x19\xca\xd0\x31\xe0\x8c\xc0\x1d\x0c\x1e\xd2\x73\xef\xab\x67\xa1\x5c\xc7\x9f\x9c\x46\xc9\xd9\xf1\x15\xb5\xaa\x5b\xde\x6a\xf2\x66\x24\xb9\x99\xdd\x79\x18\xe6\x4e\xb5\xa7\xa7\xd2\x18\xea\x4a\x14\xdf\xe1\x69\x3f\x20\x65\x9e\x89\xf2\xb9\x29\xdc\x6b\x8f\xd6\x02\x31\xe7\x49\xd5\x17\x5d\x09\x07\x1e\x50\xe1\x94\x91\x4d\xb6\x9f\xb7\x19\xd9\xee\x24\x77\xc3\x14\x42\x89\xcf\x30\x11\x3c\x70\xa0\x5e\x3f\x20\xfd\xa5\x17\xf7\x6e\x26\x9b\xa3\x4c\x0f\x15\x45\x46\xa1\x0e\x5b\x95\x5a\x0c\x61\x46\x42\x8a\x83\x64\x94\x32\x92\xcb\x85\xa5\xba\x2b\x01\xed\x20\x31\x0a\xdb\xff\x9e\x3b\xaa\xa3\x19\xf0\x12\x5d\xf8\x66\x51\xe9\x38\x7e\x22\x7c\x7e\x79\x07\x8c\x11\x0f\x62\x63\xdf\xf9\xdc\x42\xa5\x9c\xce\xa7\x42\x41\x46\xef\xac\x58\x9e\x81\xdc\x00\x7f\xfb\xd6\x3b\xdb\xec\x11\xb4\xed\x08\xef\x11\xa5\xf4\x44\xd0\xc4\xd3\x33\x9e\xf1\x7c\xda\xcc\xfc\x25\x3f\xff\x65\x45\x1d\x09\xef\x55\x21\xc7\x39\x92\x78\x7a\x80\x8a\xb4\xea\x97\xf2\x3f\x0e\x7a\x5a\xb1\x8c\x24\x3f\x1f\x6a\xc5\xd4\x8e\x8e\x88\xdd\xa1\xbd\x27\x85\x49\xa7\xa1\x07\xe9\xe5\x22\x2d\xe6\x10\x25\x40\x5b\x03\xec\x03\x15\x3e\xeb\x9b\x84\x3f\x7f\x6c\x76\xd8\x93\x1f\x2a\x9e\x11\x57\x52\x9e\xe2\xed\x41\x27\xc4\x95\xd5\x16\xee\x90\x96\xd5\x21\x8a\x29\xab\x3b\x54\x3b\x57\x54\x76\xae\xa6\xec\x5e\x4b\xd9\xe1\x87\xa2\x45\x8b\x0a\x43\x3e\xcb\x96\x93\xe7\x60\xcb\xb8\x73\x9f\x73\x87\x64\xc1\xbc\x94\xfa\xfd\x05\x93\xdf\xe2\x3d\x38\xe0\x56\x52\x4d\x10\x1b\xfa\xe9\xc5\xbb\xe1\xf1\x68\x3c\xbc\xee\x8f\xaf\x87\x03\xb1\xe7\x7d\x3c\x3d\x19\x0c\x7b\x9a\x97\x9c\x6f\xd6\x6b\x43\x56\x5b\x1a\xe2\xf4\x43\x62\x59\x8c\x80\xd5\xad\x9b\x04\x46\x73\x8b\xe6\x4d\xf3\x49\x00\x07\xba\x89\x0e\x6c\xb3\x84\xc2\x61\x62\xc0\x12\xc5\xbc\x92\x26\xf4\xf5\xeb\x5b\x21\x2a\x1a\xe3\x8f\x71\x34\x07\x06\x99\x35\x7e\x12\xe3\x27\xb9\x85\xb8\x07\x9b\x4d\x19\x15\x57\x2c\x74\x21\x8e\xbf\x43\x84\xba\x58\x9f\x9d\x61\x0a\x87\x10\x96\xa5\xca\xc5\x81\x31\x7c\x47\x58\xcc\xc5\xf9\x38\x3d\x53\x6e\x05\x17\xac\x68\x35\x0d\x48\x3c\x57\x87\xfb\x91\xaa\xd3\x55\x17\xa7\x53\xca\x4a\x22\xa3\xcf\x6e\x13\x07\xd5\xa3\x22\x6f\x48\x7c\x49\x0b\xe3\xab\xfc\xab\x8a\xd5\x18\xba\xc2\x2a\x56\xd9\x3d\x09\x02\x2d\xbc\x03\x76\xcf\x84\x5a\x61\xfa\xa8\x79\x98\x63\xed\x31\x5c\xa9\x2b\x80\xb2\xc8\x17\x3c\x4b\x93\xbc\x81\xa4\xe6\x46\x4d\xe4\x8d\x70\x35\x60\x8f\xda\x62\xf8\xf8\xf9\x5d\xe5\x49\x16\x09\x24\xd3\xee\x15\x6a\x0f\xf6\x22\x29\x62\xaf\x90\x05\x05\x98\x04\x2b\x06\xe5\xb0\x79\x70\x44\xec\x7c\x44\x58\x2f\x8b\x63\x36\x03\x6e\x89\xb7\xf8\xa6\x3a\xc9\xcb\xd0\x7a\x05\x69\x14\xd7\x07\x9a\x62\x77\x01\xd4\xdb\xfd\x5e\xaa\x9d\xea\x2a\xaf\x32\xea\x21\xdd\x9a\xc8\xcb\x1a\xb5\xdd\x71\x6b\x56\x2f\x28\x48\x02\xb7\x39\x2a\x01\x54\x6f\x06\x37\x51\x36\x69\xc9\x76\x47\xd7\xd3\x72\x85\xdf\xad\x3f\x0b\x45\x81\x25\xe5\x0a\x7c\xeb\x02\x05\x5f\xaf\x21\xbd\x40\x31\xb6\xde\x55\xd3\x1b\x14\x0b\x6b\xf4\xf6\x6b\xfa\xf2\x2f\x6b\x9c\x3e\xfe\xc3\xfa\x9c\x3e\x7e\xb1\xbe\xae\xd2\x67\x00\xeb\xe4\x61\xf7\xf6\x05\x3c\x53\xf6\x00\x25\xb7\x2f\xa4\x25\xa9\x24\xa1\xd6\x17\x4a\x1e\xea\xaa\xe4\xa1\xfb\x72\xc9\x03\x9d\xf5\xe5\x15\x82\xed\x82\x07\xa4\x2f\xa7\x95\x5a\xb5\xb4\xd8\x3d\xcb\x27\x63\xa6\x40\x3d\xc2\x74\xa4\x07\xe0\xf3\x3c\xad\x5c\xaf\xe6\xd7\x16\xd2\xf8\xb6\xce\xb1\x10\x33\x3c\xe8\x48\xaf\xca\xfe\x04\x67\xb5\x11\x42\xcd\x74\xa4\x2f\xe0\x71\x1a\x62\xe6\x9d\x91\x98\x03\x4d\xb2\xc4\x36\xd2\x49\x5c\x21\xd4\x0f\x13\xc0\xb2\x2b\x0a\x0a\x1b\xdc\x49\x6c\xf6\x56\xa9\x85\x2a\x36\x91\xa5\x16\x8a\x6d\x9a\xdc\x72\x54\xd9\x44\x6d\xda\xac\xe2\x76\xb3\x06\x0d\xcf\xf3\xa6\xad\xf6\x74\xea\xd7\xba\xb8\xda\x74\x3b\xb8\x6b\xc3\xb4\x3a\xed\xd4\x71\x13\x37\x71\x52\x64\xd1\x6e\xd6\xab\xdd\x66\xa3\xd3\xe9\x36\xbb\x1d\xbb\x65\x37\x6a\x3b\x65\x0e\x27\xa7\x1f\x77\x4a\x13\x44\x4b\x1e\x8a\xde\xab\xc7\x48\x1d\x8f\x90\xa6\xfb\x67\xb1\x7e\x61\xaf\x5e\xe1\xd7\xbd\x96\x6a\x5e\x1b\x60\xa3\x64\x1b\x55\x77\x2a\xa4\x14\x42\xdf\x8f\x81\x57\x78\x18\x55\xd2\x04\xfb\x76\x40\x5b\x5d\xc1\x49\x15\x6a\xe7\x32\x48\xc4\xc8\x12\x8b\xbd\x5a\x5f\x72\xa1\x11\x48\x66\x4d\xd2\x40\x7c\xce\xff\xe2\xbd\x13\xf5\xe3\x1b\xba\x4f\x92\xbb\x14\xe2\xa1\x92\xa4\xe2\x84\xcc\x54\xfe\x4d\x40\x8a\x2f\xd7\x91\x0a\x2e\xe9\x7b\x63\x87\x2b\x1e\x10\x2a\x4b\x17\xe4\x6a\xae\xc8\x4f\x05\xa9\xe7\x22\x66\xeb\xb5\xc1\x94\x88\x15\xec\xce\x56\xab\x74\x50\xc9\xb0\xea\xb9\x9d\x46\x15\xdb\xd5\x6e\xd5\xab\xb7\xa6\x5e\x73\xea\x75\xc1\xb7\x5b\xcd\xa6\x6d\x77\x1b\x5d\x68\x34\xbb\xbe\xdf\x6c\x26\x65\x35\xb5\x4e\xb7\xd9\xb6\xed\x56\xa3\x61\xb7\xec\x6e\xdd\xae\x36\x1a\x3d\x4d\xd9\x1f\x6d\xeb\xb4\x22\xc5\x66\x4a\x5e\xee\x67\x38\xf6\x96\x17\xcf\x97\x57\x09\xb3\x9f\x61\x72\x39\x77\x4a\x19\x42\xd6\x6b\x83\x28\x86\xa4\x7b\x60\xa8\x25\xda\xef\x87\x4c\x03\x8f\xf0\x2d\xae\x4c\xfd\x69\xa3\x09\xcd\x5a\x03\x3a\x5e\xb7\x51\xab\xb7\x3c\xb7\xd1\xb1\x5b\xcd\x46\xb3\x8d\x5d\xdf\xf5\xed\x86\xef\xb6\xdb\xb8\xa9\xa0\x1b\xd5\x76\xad\xd1\x6d\x76\xaa\xad\xa6\xdd\xee\x36\x6a\xcd\x46\xa7\xa7\x0d\x04\xce\x52\x9e\x94\xdc\x2f\x4a\x0e\x7c\x2f\xc8\x94\xae\xd7\x06\x55\x53\x50\xb0\x2f\xc8\xb4\x5b\xf3\xa0\x5a\x6f\xb6\xbc\x26\x74\x7c\xec\x75\xdd\x7a\x03\xd7\xaa\xfe\x14\x6a\xf6\x74\xea\xb5\x61\xea\x7b\x2d\xb7\xdd\xae\x2b\x68\xbb\x5a\x6d\x34\xba\xd5\x76\xa7\x59\xb7\xab\xed\x56\xab\xde\x6e\xf6\x34\x75\x50\x2c\xa3\xff\xd5\x85\x25\xf9\x65\x9d\x1f\xab\x2b\x91\x35\x20\x2f\xa5\x8d\xb3\x63\x20\xc5\x77\x64\x26\x7f\x42\xc7\x3a\xbe\xba\xba\x1d\x5e\x5e\x8f\x07\x23\xeb\xec\xf8\xe2\xe4\xf4\xe2\xfd\x7e\x5a\xba\x81\xf4\x79\x2d\xb9\x7a\xa3\xca\x52\x9a\x69\x8a\xb4\x55\xbc\x60\xb3\x5b\x4b\xa2\xae\xe7\xb8\xa0\x6e\xdc\xbc\x22\x4b\x28\x30\x76\x54\xd2\x35\x9e\x63\x06\x5e\xc5\x83\x00\x38\x54\x84\xeb\x54\x89\xc2\x68\x15\x15\xd2\xb3\xdd\x04\x92\x43\x94\xde\xfb\xaa\xc4\xb0\xf5\xa3\x0e\x3f\xf6\xe3\x07\xbc\x3c\x0f\x5a\x2d\xfc\xe6\x81\x8d\x74\x6d\x38\xf8\x78\x3a\xf8\xa4\xa9\x34\xd0\xf5\x50\x1a\xe0\xf2\x1b\xe7\x49\xd1\x4b\x0c\xc8\xae\xa2\xe6\x2e\x0b\xec\xea\x6e\xb1\x4a\xba\x8d\xa2\x85\xf5\xf1\xf7\xaf\x46\x1b\xad\x00\xa5\x44\x99\x69\x46\xb1\x95\xd7\xac\xbc\x9c\x8e\xdc\x2b\x5b\xb1\x7f\x24\x17\xa9\x0c\xa0\xbe\xdf\x37\x4d\xcf\xf2\x17\xd3\xb3\x39\x94\x2a\x6f\x65\x98\xed\x03\xe5\xd6\xe9\x40\xc6\x26\x54\x3a\x41\x3a\x8d\x84\x3f\x1a\xd9\x94\x6b\x7b\x37\x98\x52\x9e\x6c\x57\xb8\x2c\xad\xe5\x22\xa9\x62\xe1\x60\x7d\x40\x0c\xac\x05\x22\x60\x5d\x23\x0a\xd6\x85\xba\xc2\x14\x82\x35\x42\x18\xac\x0f\x85\x6a\x95\x9b\x5b\x3a\x9b\x87\x71\xf1\xee\x91\x96\x18\x06\x4b\x2c\x2d\xec\xba\x21\xf3\x48\x48\x2b\x73\xc0\x1e\xb0\x8a\xfa\x56\xbc\xde\xd4\x88\x1e\x8e\x22\xec\x79\x84\xce\x7a\xdd\xe8\x41\xb3\x3b\xd1\xc3\x26\x5d\x96\x56\xe6\x6e\xbc\x70\x93\x49\x96\xa3\xf5\x3a\xd1\xc3\x91\xbb\x62\x71\xc8\x7a\x51\x48\xc4\x19\xe1\x28\x4a\xca\xd6\x7a\x0c\x02\x2c\x66\x7a\xc4\xc3\xa8\x57\xaf\x47\x0f\x47\x7e\x10\x62\xde\x13\x4e\x93\xba\xfd\x04\x1b\xc3\xdc\x08\x67\x6e\xff\xb2\xd3\x2a\x0b\x89\x6a\x60\x98\x4f\x69\xc6\xd6\xdc\xfc\xb0\xf7\x9a\x3b\x9a\xcb\xd0\x73\x16\x56\x78\xfc\x36\x75\x34\x05\x09\xc9\x37\x42\xbf\x38\x0b\xcb\xfd\x6d\x64\x3c\x29\x55\x12\xbe\xe7\xd8\x7a\xfb\xcd\xf2\x43\xd6\x9f\x93\xc0\x33\x22\x30\x27\x48\x34\xa5\xa4\x23\x4f\x96\xfa\x74\x9b\x9d\x9a\x89\x96\xe2\xb9\xd1\x68\xb4\x5a\x26\x9a\xa9\x92\x9e\x5a\xb7\x6e\xa2\xf1\xdf\x75\x72\x4b\x0b\xbe\x21\x1f\xd0\x12\xac\x25\x9a\x81\x35\x45\x1e\x58\x67\x98\x0a\x9d\x50\x3f\xe8\x33\xc9\x64\xb4\x99\x98\x1b\xc3\x3c\xfa\xff\x01\x00\x00\xff\xff\x5b\x9c\xbc\x12\xf6\x54\x00\x00") - -func bindataTkgWebDistTkgkickstartui644es5B16fcfdb49088748e8f1JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui644es5B16fcfdb49088748e8f1Js, - "tkg/web/dist/tkg-kickstart-ui/644-es5.b16fcfdb49088748e8f1.js", - ) -} - -func bindataTkgWebDistTkgkickstartui644es5B16fcfdb49088748e8f1Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui644es5B16fcfdb49088748e8f1JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/644-es5.b16fcfdb49088748e8f1.js", - size: 21750, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui651es20151191a3c343f5b6f4c3bdJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\xbd\x09\x53\xdb\xba\xbb\x38\xfc\x55\x88\xff\x5c\x1f\xe9\x44\x81\x04\x28\x6d\x1d\x84\x87\xae\x87\x2e\xd0\x85\xb6\xa7\x75\xfc\xcb\x18\x47\x01\xb5\xc6\x4e\x65\x85\xa5\x38\xef\x67\x7f\x47\x8f\x2c\x5b\x4e\x4c\xdb\x73\xee\x6f\xee\x30\x43\x24\x59\xfb\xf2\xe8\xd9\x85\x72\x96\x4c\x37\xae\xd8\xe9\x2c\x8a\xbf\x3d\x3e\x9f\xa7\xdf\xe4\xb7\xb3\xf1\x37\x1e\x7f\xcb\x65\x24\xe4\x78\xce\xe9\x2f\x73\x14\x45\x10\xe2\x8d\xd9\x3c\x3f\x47\x41\xb0\x7b\x6f\x10\x92\xdb\xad\xed\x07\x83\x7b\xde\x74\x9e\xc6\x92\x67\x29\x62\x44\x12\x81\x6f\x2f\x23\xb1\x96\x0e\x19\x15\x1b\xe9\xc5\x04\x31\x4c\x50\x95\x43\x7f\xe4\x24\xa3\xce\xd3\xeb\x19\x8b\x25\x9b\xac\x45\x6b\xe6\xb3\x43\x12\xea\x8c\xc7\x49\x36\x89\xf2\xf3\xf1\xb9\xfa\x37\x4f\x27\x6c\xca\x53\x36\x19\x8f\x1d\x12\x59\x5f\x67\x49\x14\xb3\xf3\x2c\x99\x30\xa1\x3e\xc5\x74\x7b\x8b\xe4\x74\xb0\xd9\x27\x73\xfa\xb0\xdf\xbf\x3f\x78\xf8\x70\xeb\xde\xce\xfd\x9d\xfe\xc3\x87\x03\x32\xa3\x3b\x5b\x0f\x77\x1e\xee\xde\xdf\x7a\x78\x8f\x4c\x68\x10\x38\x91\xb8\x71\xc8\x60\xeb\x41\x48\x02\xe7\x94\xa7\x13\x87\x0c\x4c\xf0\x25\xbb\x71\xc8\x96\x8a\xc5\x73\xa1\xb2\x3d\xa8\xc2\xef\xf8\xd9\xb9\x74\xc8\x60\x57\xa5\x4c\x13\x3e\x73\xc8\xbd\x01\x64\x9d\x45\x42\xf2\x28\x71\x48\x6c\xc5\xca\xec\xbb\x3b\x2a\x4d\xb0\x48\x9c\x39\x64\xeb\xde\x6e\x18\x92\x13\xea\x04\xd9\xe9\x57\x16\xcb\xb5\x03\x71\x36\xbf\x60\xa9\xcc\x43\x87\x4c\xed\x64\x11\xdd\x84\x0e\x19\xd7\x49\x8f\xb2\x2c\x61\x51\x1a\x3a\xe4\xac\x4e\x7c\x12\x49\x16\x3a\xe4\xbc\x4e\x79\x2a\x44\x26\x42\x87\x1c\xd5\x49\xcf\xca\x09\x0e\x1d\x72\x50\xa7\x3e\x67\x29\x13\x91\xcc\x84\xf5\xf9\xb8\xfe\xfc\x3a\x9a\x85\x0e\x79\x5a\x27\x1c\xcd\x2f\x4e\x99\xaa\xf9\xa2\x4e\x3b\x86\x9f\xd0\x21\x97\x75\xda\x1b\x91\x5d\xf0\x5c\xf5\xea\x71\x9d\xf8\x8e\x9d\x3d\xbd\x56\x15\x7e\xa9\xd3\xde\x33\x55\xf2\x9d\x95\x20\x05\x4f\xcf\x42\x87\xbc\xb7\xd2\x6e\x2e\x4e\xb3\x24\x74\xc8\x69\x9d\xf6\x89\x45\xdf\x74\xf7\x0e\x97\x66\xec\xd1\x7c\x3a\x85\x3e\xbe\x6a\x4c\x51\xf4\x91\xb3\xab\xd0\x21\x6f\xac\x39\x49\xb2\x48\x6e\x6f\x99\x79\xbe\x59\xfa\xb2\xbb\x63\xbe\x7c\xaf\xbf\x1c\xa6\xf2\x81\x49\x7e\xd2\x48\x1e\xec\x9a\xf4\xeb\x46\x7a\xdd\xc0\x55\x9d\xfe\x81\x5b\xf5\x3c\x5f\x4a\x7f\x9c\x44\x17\x33\x36\x31\x9f\xbf\x35\x3f\xd7\xed\x7c\x6c\x7e\xa8\x1b\xfa\x40\x37\x47\xa7\xe3\xf1\x6c\x6d\xd4\xa5\x6b\x7f\xfc\x31\xdc\x3c\x23\xeb\x2a\x09\x95\x69\x78\xed\x8f\x3f\xd6\x46\xdd\xcd\x33\xf2\x9a\x6e\xa2\xf1\x98\x8d\xd0\xc6\x9f\xfe\x08\x17\xaa\x94\x1c\x61\xbc\x36\xea\x8e\x52\x5d\xf0\x19\xdd\x74\x91\xef\x45\x17\xb3\x22\x91\xc5\x99\x2c\xbe\xcf\x33\x59\xfc\xbf\xed\x87\x58\x7d\x7d\x4b\x37\x03\x77\x6f\xdf\xf9\x23\xdc\x3c\x23\x7f\x51\xbd\xc4\xe8\xd9\x46\x9e\xcd\x45\xcc\x30\xf9\x61\x92\xde\x56\x49\x9f\xe8\xe6\xde\xff\xf4\x50\x30\xca\x47\xef\xc3\xae\x8f\xff\x67\x7f\xf3\x8c\x7c\x56\x89\x4b\x69\x2f\x54\x1a\x5d\x4a\x7c\x49\x37\x47\x1b\xc5\x28\x40\xbe\x17\xfc\x27\x18\x85\xe1\x9f\x05\x0a\x9c\x3f\x42\x8c\x7c\x0f\xf9\x9d\xd1\x00\x07\xff\x19\x8d\xc2\x62\x34\xda\xc0\x7f\xfa\xa3\x01\x1e\x85\x9b\xe4\x2b\xdd\xfc\xcf\xe8\xea\xcf\xf5\x4d\xf2\x88\x6e\x06\xff\xd9\x50\xe5\xba\xba\x12\xd4\xf3\x47\x93\x2e\xf2\xbd\xd1\xc6\x68\xd2\xc5\x3e\x36\xd5\x95\xf5\x6d\x35\xea\xc3\xa3\x2d\x3c\x0a\x0b\xe4\x53\x28\x51\x8c\x82\x11\xb4\x5c\x06\x8b\x75\x8c\x37\xcf\xc8\xdf\x74\x33\x18\x8d\xfe\xb3\xbe\xf1\x67\xd7\x47\x38\x18\x85\xb7\x8b\x42\xcd\x0f\x63\x66\x36\xfe\xae\x66\x43\x32\xd5\xb7\xbc\xbb\x49\x04\xa3\x9b\xa3\x7c\x93\xa4\xea\xf7\x56\x55\x9a\x8e\x36\x47\x7f\xae\x8d\x82\x2b\x11\xcd\x66\x6c\xb2\x76\xc5\xe5\xf9\xda\x46\x77\x14\xae\x8d\xfe\x1c\x6d\x62\x7f\x94\xfa\x9b\x84\x43\xf6\xf6\xbc\x68\xa3\x8b\x21\xf7\x26\xc9\x18\xdd\x24\xfe\x9a\xbb\xb6\x49\x12\xa6\x26\x61\x74\xdd\xef\xf7\x46\xd7\x5b\xd3\xd1\xf5\x76\xd4\x1b\x5d\xef\xf4\x47\xd7\xf7\x4e\x7b\xa3\xeb\xdd\xfe\xe8\xfa\xbe\x0a\xdc\x9f\x86\x6a\x8b\x44\x2a\x3b\xc2\x94\xdc\x2e\xd4\x18\x47\x9b\xa3\x3c\xdc\x24\xb1\x6a\x76\x84\x46\x23\xec\x6f\x9e\x91\x5c\xc5\xd6\x47\xb7\x48\x4d\xd6\x22\xfc\x53\xf5\x7e\xb4\x51\x46\xf0\x9f\x78\xb4\xd8\x3c\x23\x73\x95\x09\x56\x61\xa6\x06\x1d\xf4\xba\x61\xff\x3a\xe8\xf7\x1e\x46\xbd\x69\xd8\x5d\xdf\xe4\x64\xa2\xd2\xfb\xa7\x41\x7f\xa0\xe3\x27\x30\x39\x66\x8f\x6f\x74\xfd\xc7\x59\x9a\x4b\x31\x8f\x65\x26\x46\xe1\xfa\x26\x99\x42\x81\x2c\xe8\xf7\xee\xeb\x12\x63\x95\x80\x7c\xaf\x5f\x04\x83\xde\xc3\x70\x34\xf9\x13\xaf\x6f\x92\x33\x35\x84\xd1\x75\xac\x06\x3c\xd9\x1d\x5d\x4f\x1e\xf4\x46\xd7\xd3\xdd\xd1\xf5\x14\x02\xd3\xd1\xbc\x3f\x50\xb3\x31\xef\x0f\xee\x4f\xd5\x4a\x9d\x33\xba\x89\xd6\xff\x83\x37\xc9\x91\x2a\xfa\xc7\x28\x1d\x89\xd1\x7c\xab\xbf\xf5\x00\xfe\x3f\x1c\x8d\x54\xae\x03\x46\x9d\xd1\x68\x3e\x79\xa0\xca\x8e\xe6\x93\xe9\x74\xea\x90\x63\x9d\xd8\xdf\xd6\x89\xfd\xed\xdd\xe9\x68\x34\x9f\xb2\x2d\x88\x4e\xd9\x96\x8a\x6e\xf5\x27\x10\xdd\xea\xab\x22\x4f\x75\x91\xad\xfb\xba\xc8\xd6\xfd\xd3\xa9\x43\x2e\x18\x75\xa2\xde\x8f\xd1\xe8\x7a\x32\xed\x8d\xa0\xbb\xba\xbf\xaa\xc3\x0e\xb9\x64\xd4\x39\xe8\x7d\x19\xe9\x51\xc1\xb0\xf4\xb8\x46\xd7\x13\xe6\x90\xc7\xba\xca\x29\xeb\x33\xfd\x33\x75\xc8\x17\x48\xbb\x8e\xe2\xd1\xe8\xfa\x74\xa0\x32\xde\x57\x95\xa9\x7f\xd0\xb0\xda\x0b\x7a\x33\xc0\x6e\xd0\xdb\x01\xf6\x83\xde\x10\xa3\xeb\x53\xdd\xf7\xb2\x9b\xfd\xdd\xe9\xda\x68\x24\x55\xf1\xd3\xd1\x48\x95\x8d\xfa\xd0\xd8\x74\x3a\x1a\xa5\xa3\x91\x18\x95\x53\x66\xe6\x6c\x3e\xd8\x7d\xa0\x72\x0c\x1e\x40\xaf\x54\x45\xfa\x67\xa0\x7f\xb6\xf4\xcf\xb6\xfe\xd9\xd1\x3f\xf7\xf4\xcf\xae\xfe\xb9\xaf\x7f\x74\x9d\xfd\x87\xfa\x27\xd2\x2d\xe8\xce\xdd\x53\x3f\xdb\xfd\x7e\xdf\x21\xef\x18\x75\x02\xa7\x7b\xc0\xba\x8e\xba\x50\x74\xec\x8b\x8e\x9d\xea\xd8\xb1\x8e\x1d\xc2\xd4\x4c\xba\x0e\x79\xa5\xd3\x9f\xea\xf4\x37\x3a\x76\xa1\x63\x37\x2a\xf6\x1f\xa8\xf0\x0b\xeb\x1e\x32\x95\xeb\x82\x75\x2f\xf5\xd7\xef\x66\x37\x6c\xc7\x81\xde\x0d\xa7\x66\x57\xa8\xbb\xa2\x2e\xab\x32\x5f\x33\xea\xc0\x21\xa9\xf3\x4f\xd8\x2e\xe4\x9f\x4c\xa7\x21\xbe\xdd\x5a\x38\xe4\x4a\x95\xb1\x37\xd8\xe9\x74\x1a\x42\x42\x5c\xef\x38\x75\x7f\xe8\x5e\x96\xfd\xf8\xa6\xab\x76\xba\x6f\x58\xd7\x29\x9c\xee\x0d\xeb\x3a\xd8\x21\x1f\x4d\xf2\xf3\x46\xf2\x07\x9d\x1c\xfc\xa1\xe6\x6e\xf0\x30\x44\xbe\x37\x29\x92\xa4\xb8\x28\x04\x2b\xf2\x42\x16\x97\x0c\x63\xdf\x21\xeb\xab\xf9\x9e\x14\xaf\x5e\x15\xaf\x8b\x77\x4f\x8b\xf7\xc5\x49\xf1\xf1\x29\xe4\x7b\x6d\x9a\x39\xd5\xcd\x7c\x57\xcd\xf8\x0e\x79\xa6\xfb\xf8\x58\xf5\xd1\x77\xc8\x5b\x46\x9f\xb1\xee\x6b\xd6\x2d\x67\x61\xab\xdf\x9f\x40\xb1\xe0\x09\x23\xd7\x8c\x5c\xb1\x70\xe3\x6b\xc6\x53\xe4\x14\x0e\x56\x1d\xed\x96\xd9\xf1\x9f\x0e\xf9\xcb\xb4\x11\xbc\xba\x23\xf3\x5b\x46\x7e\x54\x99\x9e\x30\xe8\x8c\xaf\x16\x5d\x67\x27\xef\x96\x4b\x90\x4f\x15\x6c\x76\xaa\x31\x3a\xc4\x39\x73\x30\xf9\x5c\x7d\x3a\x65\x3a\xe5\x45\x95\xf2\x1d\x46\x40\xcb\x71\x16\x4e\xf7\x07\x53\x8d\x43\xae\x97\x55\xae\xe0\x39\xb4\x0f\x2b\xd2\x75\xba\x1f\x4c\xa1\xe0\x3d\x23\xcf\x19\x71\xd6\x9d\xe5\xee\x7c\xd4\x39\xd7\x9b\x39\xbb\xdf\x5a\x33\x97\xb5\x7f\x33\xb5\x43\x02\x94\x26\x6a\x57\x2b\x68\x3c\x78\x7f\x52\x6c\x1d\x3d\x29\xb6\xdf\x3d\x29\x90\xdf\x09\x06\x5b\xdb\x21\x1e\x8d\x26\x27\x7f\x61\xe4\xd3\xd1\xe8\xb4\x08\xa2\xde\x8f\x71\x88\x9d\xba\x48\x2e\x8b\xad\x74\x52\x6c\x8b\x49\xa3\x88\x3c\xaf\x8a\x1c\xf4\xbe\x40\x91\x43\x46\xfe\xb2\x67\x54\x8f\xff\xab\x35\xa5\xe5\x12\xc3\xfe\x3f\x66\x7a\x1b\x38\x98\x3c\x52\xd0\x35\xea\xfd\x08\x55\x55\x21\x54\x18\xde\x6e\x2d\x20\xa9\x50\x57\x43\xa8\x82\xfa\x5b\x19\x80\xd4\x22\xf8\x8f\x8e\xf6\x7b\x0f\xd7\xc2\x4d\xf2\x37\xa3\x81\x03\xd8\x8f\x43\x1c\x8d\x00\x3a\xc4\x31\x58\x9f\x0e\x32\x87\x38\x80\x18\x3b\xc4\xb1\x31\x3f\x13\x2d\xd1\x3d\x15\xad\x88\x11\xa7\x42\xf7\x74\xb8\xc4\xbd\x74\xa4\x2e\xff\x3a\x9a\xc1\x7f\x79\xee\x10\x47\xe3\xc3\x0e\x71\x4a\x24\xd8\x21\x8e\x9e\x06\x87\x38\xef\x99\xfa\xa0\x71\x5c\x15\x00\xc4\xd6\x21\xce\xc9\xcd\x8c\x99\xbe\xd5\xa8\xa1\x89\xd8\xf8\x60\x99\x56\x77\xc4\xc2\xfc\x1c\xe2\x94\x68\xb1\x43\x9c\xb1\x43\x9c\x38\x61\x91\x38\xe1\x17\x2c\x9b\xab\x76\x79\xfe\x8c\xa7\x1c\x26\x62\x16\x89\x9c\x1d\xa6\x2a\x35\x67\xd2\x64\x09\x09\x93\xb4\x37\x20\x52\xd2\xdb\xc5\x50\xca\xe0\x4d\x48\xa5\x0c\x6e\xe0\xff\x77\xf8\xff\x04\xfe\x5f\xc3\xff\x2b\xf8\xff\x1c\xfe\x7f\x83\xff\x1f\x43\xda\xe9\x13\x29\x83\x13\x88\x4e\xe1\xff\x21\xfc\x1f\xc3\xff\x57\xf0\xff\x0c\xfe\x9f\xc3\xff\x23\xf8\x7f\x0c\xff\x9f\xc2\xff\x0b\xf8\xff\x18\xfe\x7f\x81\xff\xef\xe0\xff\x69\x48\x3b\x83\xa1\xa2\x1e\x05\xf4\x4f\x40\x33\x02\x9a\x11\xd0\x8c\x80\x06\x04\x34\x26\xa0\x19\x01\x63\x10\x30\x06\x01\x63\x10\x30\x06\x01\x63\x10\xd0\xb0\x80\x86\x05\x34\x2c\xa0\x61\x01\x0d\x0b\x68\x58\xc8\xe0\x3d\xfc\xbf\x82\xff\xcf\xe1\xff\x37\xf8\xaf\x47\x2b\x60\x24\x02\x46\x22\xec\x5e\xa6\x92\xde\x3a\xa3\x91\xe3\xa9\x7f\xc4\xf9\xc3\xf1\x9c\x3f\xd4\xf1\x4a\x1d\xcf\x51\x7b\x6b\x24\x1c\xcf\x51\x2b\xae\xaf\x49\xc7\x73\xf4\x6f\x99\xf0\xb0\x4c\x78\xe8\x2c\x08\x97\x14\x56\x0c\x36\x2a\xc9\xca\xd8\x61\x2a\x49\x22\xa9\xa3\xf1\x23\x87\x52\x79\x33\x63\xd9\x74\xed\x2c\xc9\x4e\xa3\xc4\x75\x9b\xbf\x1b\x7a\x63\x52\x4a\x75\xc0\xa4\x93\xa8\xa5\x8a\x9c\x25\x53\xd7\xad\xff\xaf\x16\x56\xa9\x24\x96\x34\x91\x45\x11\xc9\xa2\x30\x87\x06\x39\x82\xc9\xb9\x48\xd7\xe4\x39\xcf\x1d\x8c\x30\xc9\x25\x95\xae\xdb\x91\x1b\x69\x36\x61\x6a\xa7\xbb\xae\x24\x73\x49\x73\xe9\xba\xcc\x75\x3b\xcc\xfa\xc0\xc8\x4c\xd2\xb9\x74\xdd\xb9\xdc\x60\xd7\xb3\x4c\xc8\x9c\x52\x9a\x4b\x32\x91\x74\x26\x5d\x37\x91\x1b\x33\x91\xc5\x2c\xcf\xc9\x89\xa4\x16\x53\x41\x8a\x9b\xdb\xb2\xe1\xb2\xb8\x60\xdf\xe7\x5c\x30\x3b\x8c\x9c\xb9\xe4\x89\x83\x37\xd4\x28\xf3\xa2\x98\x48\xd7\x9d\xc8\x0d\x45\xf2\xf3\xf4\xcc\x0e\x9b\x9c\x8b\x38\x92\xf1\x39\x62\xf8\x76\xb1\x40\x98\x4c\x25\x3d\x91\xae\x7b\x22\x37\x78\x6e\x11\x9b\x64\x6c\xa5\x2b\x50\x43\xce\xac\x84\xd7\xd1\x8c\x9c\x5b\x71\x0d\x0d\xc8\x91\x95\xf4\x9e\x49\x72\x60\xc5\xd5\x64\xe8\xf3\x3e\x34\x63\x5c\x3b\x96\x86\xbb\x92\x5f\x71\xd5\x29\xb1\x91\xb0\xf4\x4c\x9e\xe3\xdb\x38\xca\xd9\x5a\xdf\x2b\xc7\xcf\x36\xe2\x28\x49\x90\xc4\x43\x48\x1f\x2c\xa7\x13\x11\xf4\xc3\xf2\xe3\x56\xeb\x47\x22\x82\x81\xc9\xb1\x7d\x77\x0e\x22\x82\xad\x10\x2f\xaa\xef\xd1\x6c\x96\xdc\xa8\x0c\x78\x51\xf5\xfa\x69\xd9\x6b\x92\xe2\xdb\x69\x26\x10\x30\x7f\x14\x8c\xc9\x68\x3a\x4f\x12\x4a\x99\xdf\xf7\x58\x39\x92\x61\xb7\xcb\xf7\xb2\xa1\x66\x11\x25\x94\x05\x3c\x1c\x4a\x94\x92\x84\x08\x94\x60\xc2\xaa\xb6\xd2\xba\x81\x0b\x68\xa0\xae\x5c\xa8\xca\xd3\xf6\xca\xc5\x5e\xea\xba\x9d\x41\x87\x52\x89\x58\x20\x42\x22\x08\xc3\x43\x3c\x34\x23\xa8\x6b\xbd\x5c\xa9\xb5\xa5\x42\xd1\xeb\xfd\x66\x75\x8f\xff\x59\x27\x87\x98\x4f\x51\xc7\xaa\x14\xeb\x2a\x3b\x83\xb2\xee\x4e\xbf\xae\xfb\xcb\xef\xd6\x4d\x38\xed\x93\x8c\x06\xa1\x69\xa4\x9a\x66\xa1\xa6\x39\x81\x96\x5c\x17\x65\x01\xef\x76\x43\x9a\x54\xb3\x9d\xd5\x8d\xbd\x2b\x1b\x2b\xbb\x81\xca\x56\x8a\xa2\x63\x5a\xc1\xae\x7b\xa5\xd7\xbc\x8f\xf7\x7b\x83\xba\xe8\xfb\x6a\xff\x9a\x9e\xa6\xaa\xa7\xbc\x7d\x16\xd2\x3d\x0e\xb3\x20\x90\x24\x2c\x48\xc3\x6a\x0a\xfa\x66\x0a\xac\xaa\x4f\xff\xc1\x14\xc0\xa9\x42\x29\xae\x66\x3a\x10\x61\x63\xfd\xca\x41\xf3\xba\xfa\xc3\xf6\xea\x65\x5d\xe9\xf2\xf2\xb1\x80\x77\x55\xb5\x6a\x66\x57\x77\xc3\x2b\xeb\x4c\xfc\xfc\x3c\xa8\x16\x53\xd7\xcd\x5c\x17\x09\xca\x82\x6e\x97\x87\xd8\x1c\x12\x41\x25\x12\x44\x9d\x11\xc2\xad\x7e\x8b\xba\x9d\x37\x2b\xed\xdc\xdd\x04\x2f\x9b\xe8\xf5\x54\x13\xbc\xd7\xfb\x9d\x06\x6e\xfe\xc5\xb6\x6e\xd9\xd5\xd6\x92\xaa\x5a\xbe\x4b\xfa\x41\x22\x47\x97\x74\x70\x0d\x01\x9f\xc8\x26\x7f\xd9\x74\x08\x31\x62\x31\xa0\x05\xe1\xf8\x56\x37\x04\x61\x6c\x60\x06\x15\xa4\x33\x58\x60\x62\x01\x8f\xeb\x56\xe8\x54\xed\x96\x8c\x8a\x2e\x4a\xfd\x81\xd7\x1b\xe0\x61\xea\x67\xbd\x9e\xd7\xed\x66\xe5\xce\x54\x03\xc9\x42\x92\xd5\x03\x59\xcb\xca\x2e\xd9\xdb\xfe\xaa\xea\xb4\xb9\x17\x29\x95\xfe\x32\xc3\xbc\x3e\x12\x02\xce\x44\xcb\x49\x50\xa7\x80\x52\x2a\xab\xf1\xd4\x8d\x95\xb5\x78\x30\x9c\x6f\x4d\x00\xfc\xbc\x75\x88\x02\x76\xdc\x32\xdc\xe5\x53\x94\x22\x58\x70\x59\x8d\x89\xb7\x8c\xe9\x9b\x54\x37\xa2\xd9\xd8\x1d\x6a\xed\xed\x8f\xe5\x96\xb8\x1b\x68\x96\x8b\xe6\x3f\xd3\x39\x37\x85\x77\x14\x1d\xd5\x15\x7c\xb0\xeb\xae\xa6\xa9\x02\x39\x6b\xba\x4a\xe9\x73\x4f\x06\x2c\x5c\xd4\x05\xd7\x7f\xab\x20\xf3\xb9\xc7\x02\x69\x17\x7c\x5d\xcd\x90\xda\x39\x66\xd8\xcd\x4d\xc5\x49\x86\x6f\x05\x4d\x7d\x94\xd2\xce\x80\x30\xec\xc1\xd9\x80\xf4\x05\x26\xd6\x99\x78\xb6\x7c\x26\x48\x4a\x97\x27\x3b\xb5\x2e\x39\x09\x0b\x8b\x87\x49\x87\x52\x7d\x08\x05\xa5\x94\xfb\x89\x27\xba\x35\x08\xb6\x1a\x78\xdb\x7e\xe8\x34\x5c\x63\x1a\xae\xb1\x21\x4e\x35\x5c\x13\xd5\xb9\xb5\xb6\xfd\x5f\x8d\xf5\x73\x5d\xb6\x91\x27\x3c\x66\xa8\x4f\x62\x81\x18\xee\x0e\xf0\x86\x60\x20\x5e\x41\x92\x11\xc7\xb1\xb6\xd3\x8f\x5f\xcc\x32\x43\x12\x5b\x73\xfb\xa9\x71\x5f\x28\x40\x2d\x49\x5b\x29\xb5\x22\x56\x2b\x9f\x9b\xc5\xd8\xc6\x79\x94\xab\x8a\xab\x0c\x2f\xda\x27\x61\xf9\xae\xbf\x92\x70\x7d\x88\x50\x5f\x46\xc3\x36\x20\xf6\x72\xa5\xaa\xe6\x05\xff\x3b\x75\x7c\xbd\xb3\x0e\x92\xd2\xbe\xaa\x47\xdd\x09\x02\xce\xaf\xeb\x76\xbb\x69\xbd\x28\x2a\xfb\x23\x49\xd7\x25\xba\x75\x46\xd7\x71\xdf\xf1\x9c\x03\x45\x02\x5c\xc7\x83\x3a\xb8\x55\x07\xb7\xeb\xe0\x4e\x1d\xbc\x57\x05\x99\xaa\x21\xd2\xc1\x41\x1d\xdc\xaa\x83\xdb\x75\x70\xa7\x0e\xde\xab\x82\xf1\x7d\xc7\x73\x1e\xeb\x54\x15\x8c\x21\x38\x51\xf5\x3e\x81\xe0\x54\x05\x27\x3a\xaf\x22\x5b\x9e\xea\xe0\xc3\x3a\x18\xd5\xc1\xd3\x2a\xc8\x54\x5e\xa6\x83\x0f\xeb\x60\x54\x07\x4f\xab\x60\x1c\x3b\x9e\x73\xa8\x83\x93\x3a\xc8\xea\xe0\xb4\x0a\x32\x95\x97\xeb\xe0\xa4\x0e\xb2\x3a\x38\xad\x82\x13\x35\x25\x47\x7a\x14\x03\x43\x87\x5d\x4f\xd4\xec\x1c\xeb\xe0\x76\x1d\xdc\xa9\x83\xf7\xea\xe0\x6e\x1d\x7c\x50\x05\xa7\xaa\x86\x4c\x07\xb7\xeb\xe0\x4e\x1d\xbc\x57\x07\x77\xeb\xe0\x83\x2a\x38\x51\x53\xf2\x41\x07\xa3\x3a\x78\x5a\x07\xe3\x2a\x38\x05\xda\x50\x07\xa3\x3a\x78\x5a\x07\xe3\x2a\x38\x51\x53\xf2\x59\xa7\xaa\xe0\x8d\x0e\x4e\xab\x60\xac\xba\x73\x50\xae\x80\x0a\x47\x3a\x3c\x51\x13\x78\x72\xae\xb3\xab\xb0\xd4\xe1\x89\x2a\x9a\xe7\x40\xa6\xf6\x07\xfd\x6a\xc3\xaa\xc8\x96\x1d\xd9\xb1\x23\xd5\x56\x54\x91\x6d\x3b\x72\xcf\x8e\xec\x9a\xad\xa7\x22\x0f\xec\x48\x64\x47\x62\x3b\x52\xed\x51\x15\x79\x68\x47\x4e\xed\xc8\xc4\x8e\x30\xb3\x99\xe7\xfd\xc1\xa0\x6f\x45\xfa\x53\xb3\xb7\xd5\x97\x81\x1d\xd9\x32\x3b\x59\x45\x76\xec\xc8\xae\x1d\x79\x60\x47\x22\x3b\xb2\x6d\xb6\xb7\x8a\xdc\xb3\x23\xf7\xed\xc8\x43\x3b\x72\x6a\x47\xd4\xb0\x9f\x9b\x08\xb3\x22\x5b\x7d\x3b\xb2\x65\x67\x53\xc3\x3e\x33\x91\xa9\x15\xd9\x1a\xd8\x91\x6d\x3b\xa2\x06\xf7\x97\x89\xec\xda\x11\xd5\xeb\x73\x13\xb9\x6f\x47\x1e\x98\xf3\xa8\x22\x91\x1d\x89\xed\x08\xb3\x22\xdb\x7d\xfb\xcb\x43\x73\x48\x55\xe4\xd4\x8e\x4c\xec\xc8\xd4\x8a\x6c\x0f\xec\x88\xea\xf5\x0b\x13\x51\x1d\xfd\x6a\x22\x6a\x08\x2f\x4d\x44\xf5\xfa\x9b\x89\x3c\xb0\x23\xaa\x07\xaf\x4c\xe4\xd4\x8e\x4c\xec\xc8\xd4\x8a\xec\x0c\xec\x2f\x6a\xd8\x89\x89\xc4\x76\x84\x59\x91\x9d\xbe\x1d\xd9\xb2\x23\xdb\x06\x3a\xa9\xc8\x3d\x3b\x72\xdf\x8e\x44\x76\x64\xc7\x80\x31\x15\xd9\xb5\x23\x0f\xec\xc8\xa9\x1d\x89\x0d\xe0\x52\x11\x66\x45\xee\xf5\xed\x2f\x13\x03\x9d\x54\x64\x6a\x45\xee\x0d\xec\x88\xea\xc1\x3b\x13\xd9\xb5\x23\x0f\xec\xc8\xbd\x8a\xdd\xd5\x1f\xdc\xbb\x6f\x47\x1e\xda\x11\x35\xb8\xf7\x26\x12\xdb\x11\x66\x45\x76\xfb\xf6\x17\x35\x38\x03\x91\xee\x4d\xec\xc8\xd4\x8a\xec\x0e\xec\x88\x9a\xf8\x13\x13\xd9\xb1\x23\xbb\x76\x44\x2d\x89\x34\x91\x7b\x76\xe4\xbe\x1d\x79\x60\x80\xb3\x8a\x44\x76\x24\xb6\x23\xcc\x8a\xdc\xef\xdb\x91\x2d\x3b\x5b\x05\xdf\x55\xe4\xd4\x8e\x4c\xec\xc8\xd4\x8a\xdc\x1f\xd8\x91\x6d\x3b\xa2\x06\xf7\xc9\x44\xd4\x10\xae\x4c\x64\xd7\xdc\x0d\x2a\x72\xdf\x5c\x09\x2a\xf2\xc0\xfe\xa2\xba\xf3\xc5\x44\x4e\xed\xc8\xc4\x8e\xa8\x61\xff\x30\x91\xd8\x8e\x30\x2b\xb2\xad\x46\x7a\x58\x1d\x54\xd5\x53\x6e\x4e\xea\x3d\xb8\x88\x0d\xbc\xbb\x07\x37\xa9\x89\xed\xa8\x5e\xfc\x61\xb6\xf0\x7d\xbd\xb0\x0b\x4c\xfe\x2e\x91\x27\xd7\xf1\x1c\x37\xba\x98\x0d\x1d\xe2\xec\xa9\x70\x22\x55\x70\x5f\x05\xcf\x54\xf0\x0f\xe7\x0f\xcf\x71\xbf\xcf\x33\x48\xff\x43\xa5\xff\xbf\xed\x87\x43\x67\x61\x91\x98\x4c\xd4\xe8\xad\x33\x1a\x39\xdd\x14\xa8\x8c\xea\xbb\xb4\xbe\xaf\x7d\x65\x1b\x92\xe5\x0a\x21\xae\x33\x08\xc8\xa0\x90\x3a\xe0\xa4\x0b\x83\x97\x6f\xe4\xfc\x47\x4d\x43\xb3\x8d\x69\x26\x9e\x46\xf1\x39\xb2\x68\x8c\x14\xdf\x8a\xa0\xdb\x95\x21\x0d\x52\xc2\xc2\x26\x59\x91\x8a\x06\x46\x5c\x15\x13\x36\xe6\x8d\x04\xb6\x91\x6f\x2e\x7e\x8a\x24\xff\x94\x1f\x84\x12\x85\xab\x16\x85\xfa\x89\xb0\xeb\x02\xd5\x4e\x23\x52\x32\x87\x44\x1b\x73\x28\xfb\xd7\x63\xaf\x46\xce\x9a\xa3\x4e\xec\xe9\x86\xb9\xf7\xed\x42\x66\x60\x92\xbe\x60\x1b\x49\x94\xcb\xc3\x74\xc2\xae\x69\x7f\xf8\xa2\x5a\x99\x21\xee\x76\xa5\x69\x5a\x2e\x10\xc3\xde\xf7\xe6\x8a\x45\x3f\x6f\xa3\xea\xf5\x05\x70\x82\x5f\x30\x5c\x14\x41\x08\x15\xb5\x66\xcb\x67\x09\x97\x48\xd1\x4c\x8d\x56\x80\xb0\xb2\x3a\x5c\xd1\x18\x52\xd1\x18\xc2\xf4\x77\x23\x3e\x8f\xc4\x81\x44\x12\x5b\x8c\x44\x09\x44\x42\x2e\xca\x7d\x0e\x7b\xdc\x73\x5c\x87\xe8\x3d\xee\x39\x7b\x2a\x78\x06\xc1\x7d\x15\xd4\x7b\xdc\xfb\xc3\xf9\x83\x94\x7b\xdc\x73\xfe\x50\x67\x65\x2e\x68\xbd\xd5\x91\x21\xd3\x49\x4a\x91\xa4\x86\xb0\x8e\xa5\x37\x17\x1b\x13\x36\x8d\xe6\x89\xcc\x51\x2c\x4b\xde\x3f\xc2\x44\x92\xb9\xd8\x98\xf1\xf8\x1b\x8a\x25\xf9\x9b\x61\x8c\x37\x60\x89\x89\x60\x54\x6e\x00\xe3\xfb\x40\x85\x40\x94\x45\x8e\x55\xd0\x88\x05\xc8\x53\x15\x7b\x1d\xc9\x73\x72\xa1\x42\xba\x4e\x72\xa9\xc2\x25\x43\xfc\xb1\x0a\x6b\xd9\x18\xf9\xa2\xc2\x95\x54\x8c\xbc\x63\x34\xdd\x98\x89\x4c\x66\xf2\x66\xc6\xc8\x7b\x46\x2f\x98\x15\x3f\x65\x54\x06\xce\x78\x1c\x67\x82\xf5\xbe\xe6\xe3\xfc\x3c\x12\xa0\x2f\x18\x92\x43\x46\x8f\xad\xac\x1b\x32\x2b\x5b\x78\xc5\xe8\x7b\xa0\x2b\x8f\xaf\xd2\x37\x22\x9b\x31\x21\x6f\xc8\x1b\x46\xfb\xe4\x86\x51\x24\x40\x4f\x28\xec\xae\x6f\x6e\xb0\x6b\x16\xa3\x53\xe6\xba\xa7\x6c\xe3\x1b\xbb\xc9\xab\xc0\xc6\xe1\xd3\xf1\x9b\x77\xc7\x27\xc7\x45\xe1\x38\x18\xfb\xa5\x38\x0f\xe5\x22\xc6\xe3\xc1\x86\xd3\x15\x9e\x03\x6a\x01\xef\xad\x66\x9f\x30\x7a\x58\x72\xd2\x2f\x18\x26\xd7\x8c\xc6\x72\x63\x4c\xae\x18\xbd\x64\xc8\xf9\x8f\xd3\x35\x5f\x5f\xb1\x9a\x08\xff\x9b\x38\xa3\xd1\xba\xeb\xd4\x29\x9b\xcd\x8e\x17\xd5\x59\xc2\x1b\x7f\xfa\x20\x9e\x1d\x21\x5c\xac\x4d\x33\xb1\xb6\xd1\x2d\x13\x42\xbc\x79\x46\x9c\xf5\xc1\xc6\x9f\xbe\x83\xbb\xce\xba\x83\xc9\x73\x46\x67\xd2\x97\x1b\x5a\x8c\xe1\x71\xf2\x0d\xd6\x00\xc6\x41\x3e\xaa\x70\x2d\x8d\x24\x1f\x18\x7d\xce\xfc\xe7\x6c\x23\x4a\x92\x2c\xfe\x90\xe6\xd1\x94\x79\x9c\xac\x33\x9a\x0a\x74\xc1\x36\xce\x98\x7c\x63\xe6\xf9\x78\x4a\xd4\xf0\x5e\xc3\x42\xc5\x82\xa9\xad\xf1\x0c\x66\x62\x56\x76\xf9\x30\x7f\x9a\xce\x2f\x98\x88\x4e\x13\x46\xde\x32\xfa\x4e\x1f\x9d\x98\x91\xbf\x18\xfd\xc6\xfc\x6f\x6c\x83\xe7\x8f\xb3\x34\x8e\xe4\xfb\x99\x60\xd1\x44\x65\xf4\x38\xf9\x51\x7d\x95\x5a\x75\xd1\xe3\xe4\x85\x49\x33\xd3\x7c\x12\x9d\x79\x9c\x7c\x65\xcb\x12\x22\xb5\xdd\x19\xcd\x32\x74\xc1\x88\xa3\xd5\x4a\xcd\x14\x3a\x35\x80\x42\xb7\x0b\xe2\x38\xe4\x76\x81\x09\x2b\x05\x40\x6f\xb2\x52\x02\x94\x4a\x2a\x37\x6c\xb9\x6a\x87\xaa\x15\xb4\x53\x5c\xb7\x19\x27\x89\xa4\x82\xc1\x21\x4f\xb3\x2b\x9d\x5f\x9d\x15\x15\x33\xa9\x24\x52\xf5\xd6\xa2\x58\x9d\xab\x8e\xab\x3a\xeb\x18\xc9\x25\x7d\xca\x36\x62\xc6\x13\x32\x87\xe0\x34\xc9\x32\x41\x26\x92\xea\x75\xb0\xb6\x86\x5e\x4c\x10\x97\xe9\xd5\xe3\x79\xb5\xda\xdf\x55\xa3\x46\x2a\x4c\xd6\xa5\x5a\x84\xaf\x19\x4f\xc9\x4c\x94\x6b\xaa\xf6\x39\xac\xe4\x44\xa8\x66\x2e\xa2\x6b\x72\xa2\x43\x3c\x25\x53\x41\xcb\xde\x8f\x05\x95\x1b\x95\x4c\xf2\x0c\x72\x88\x28\x9d\x64\x17\xe4\x5c\xa8\x5a\x05\xbb\x64\x22\x67\xe4\x48\xa8\xd9\x97\x96\x6c\x1e\x93\x03\x93\xf6\x3a\x9a\x39\x98\x1c\x9b\xa8\x91\x9f\x63\xf2\xd4\x24\xbd\x67\xd2\xc1\xe4\xc2\x44\x8d\xb4\x1b\x93\x4b\x61\x56\x55\x6f\x36\x07\x93\xc7\x82\x5e\x08\xd7\x4d\xd9\xd5\xda\x85\x20\x5f\x04\xbd\x5d\x90\x77\x82\x5e\x67\xe8\x48\x60\xf2\x1e\x42\x07\x02\x93\x53\x08\x1d\x0b\x4c\x0e\x21\xf4\x54\x60\xf2\x0a\x42\x17\x02\x93\x37\xa2\xdc\x5a\x15\x08\xf1\x38\xb9\x11\xf4\x8d\xf0\xdf\x88\x8d\xcb\x28\x99\xb3\xe3\xa9\x9a\x4a\x93\x64\xb6\xa0\xc7\x2d\xc6\x35\x00\x7f\x3e\x45\x8f\x12\xc4\xb0\xeb\x76\xd6\xcb\x5f\xc4\xd6\x78\x9a\xcb\x28\x8d\x59\x36\x5d\xfb\x26\x30\xe4\x6a\x24\x3e\x17\x86\x13\xcb\x86\x7c\x8a\x5e\x95\xe0\x81\x11\x67\x3c\x2e\x95\xfd\xc6\x63\xa7\x62\xd7\x5e\x65\xc8\x12\x93\xb1\xab\xb5\xe7\xaa\x6d\xb8\x40\xae\x85\x7d\x1c\xac\x7b\x00\xdf\x2e\x5a\x18\x7a\x7c\x8a\x3a\x5f\x13\x54\x71\x82\x6f\x17\xaa\xfd\xd7\xcc\xb4\xf4\x5a\x5d\x20\x43\x6b\x62\xa8\x1c\x96\x5c\x5f\x76\xb5\xc6\xea\xeb\xbe\xce\xc0\x89\x50\x87\xa8\x9e\x98\x2b\xa1\x1a\xaf\x79\xd5\x25\xc2\x22\xcf\x79\xbe\x61\x0d\x8f\x32\x52\x26\x45\x90\x31\x1f\x8f\x69\x10\x9a\xb4\xf8\x3c\xe2\xe9\x78\x4c\x3b\x1d\x69\x92\xb8\xc2\x03\xc6\x63\xda\x37\x09\xb0\x50\xaa\x98\x25\xd6\xf9\x06\xab\xf2\xcf\xda\x9a\x70\x31\x1e\xd3\x81\x89\x4e\x79\x22\x19\x5c\x35\xb4\x53\x25\x6a\xc0\xc4\x58\xb3\xa4\x8c\xbe\xb1\xc7\xd9\x3c\x95\xe3\x31\x9d\x55\xdd\xe2\xec\x4a\x67\xb3\x38\xe8\xcb\x58\xd4\x1d\x42\x1b\xa8\x02\xe0\x0c\xc2\xc3\x6e\x57\xee\x89\x12\x83\x4b\x29\x0b\x64\x38\x84\xef\x39\x93\x28\x0d\xfa\x21\x49\x83\x41\x68\xe3\x86\x1f\xfe\x4f\x5a\x59\xff\x3f\x69\xe5\xf5\x3f\x69\x65\x3c\x9e\x44\x32\x1a\x8f\x61\x97\xae\x0b\xd3\x1a\x7c\x8b\x26\x13\xa4\xda\xb3\xf0\xb6\x67\x56\xdd\xab\xe5\x61\x16\xcb\xde\xf1\x1f\xea\xbe\x54\x3f\x16\xaf\x5e\xd8\xd2\x10\x38\xf5\x24\xa5\x1d\xe1\xba\x1f\x20\xcc\x21\xdc\x49\x5d\xf7\x2f\x88\x67\x55\xbc\xc3\x5d\x37\x89\x54\x5a\x42\x45\x51\xa4\x45\xc1\x8b\x22\x23\x11\x4d\xfc\xb7\x0a\x4f\x2c\x51\xf8\xc7\x0c\x7b\x41\x48\x62\x1a\xd9\x03\x05\x74\x71\x8d\xa7\x6b\x0c\x23\x59\x14\x35\xcc\xc8\xb1\x42\xe5\x3b\x49\x51\x74\x2a\x01\x1b\xa5\x79\x51\x70\xd7\x45\x4e\x36\x9d\xe6\x4c\xea\x04\x67\x16\x09\x96\x42\x04\x17\x45\xa6\x3e\x9f\x6a\xbd\x2a\xfd\xf9\xf4\x46\xb2\x57\x56\x05\x90\x70\x5c\x55\x80\x8b\xe2\x24\x43\x39\x89\xb1\x6a\x31\xd2\x36\x23\x79\x75\xc5\x46\x96\x2c\xc2\x9a\xe0\x65\x21\x91\xf4\x59\xf0\x3a\x45\x7d\x22\x7b\x03\x1c\x7a\xd6\xd9\xfd\xd1\x24\x87\x5e\x65\xe8\x92\xab\xc9\x92\x29\x92\xa4\x4f\x2a\x61\xb4\xb5\x92\x9f\x6c\x3c\xdf\x14\xb0\x65\x0e\xc2\x08\xe3\x90\xd0\xb2\x98\xce\xf3\x04\xb6\x03\x11\xb8\x28\x40\x2a\xa3\x40\xb6\xd4\x13\x8b\x5d\xf7\x6f\x53\xc2\x92\x4b\x88\x86\x88\x52\xef\x5e\xd4\xa9\x57\x40\xe2\xa2\x50\xf5\xa6\xff\xa0\xd2\x97\x2b\x74\x9c\x2d\xa1\x00\xb1\x1d\xf4\x54\x84\xea\x74\xd4\xa2\x3b\xd1\x22\xba\xfb\x2a\x6a\x71\xa0\x59\x8c\xb4\x45\xd6\x25\x51\x4a\x18\x11\xb0\x29\x71\x53\x68\xfa\xa8\x39\xf7\xcc\x75\x1f\x73\x24\xc9\x69\x84\x24\xe8\x68\x54\x19\xab\xa1\xdc\x3a\xe3\x31\xdc\x02\xe3\xb1\x03\x12\x90\xaf\xcc\xff\xca\xe0\xe3\x6d\x9c\xa5\x53\x7e\x36\x07\x3c\xd0\xeb\xf4\x09\xab\xb0\x42\x15\x03\xb8\xed\x09\x72\x25\xb8\x2c\xd3\x16\x18\x04\x78\xd4\x22\x13\x59\xda\x42\xe8\x66\xb5\x80\x3e\xa1\x29\xca\x30\x89\x0c\x60\x00\x82\x37\x1b\xe2\x04\x68\x5a\x9f\x7b\x97\x91\xaa\x20\x10\x61\xb5\x43\x13\x8b\xe6\x4f\x97\x24\xb8\x8c\x52\xe6\xba\x66\x97\x20\x46\xd9\x1e\x15\x3e\xf3\x04\x26\xb2\x4e\xdb\xa7\xd2\x67\x9e\xc4\x0a\x89\xac\xd9\x03\x69\x25\x6b\xcc\x48\xa2\x77\x49\x44\x62\x3a\x70\x25\xc9\xe9\x96\x2b\xc9\x9c\xee\xb8\x52\xdd\xb4\xc2\x75\x51\x44\x33\x5f\x4d\xa2\xce\xed\xa9\xe5\xc0\x24\x52\x6d\x98\x35\x8e\x86\xe5\x3d\x5d\x4b\xa1\x19\x5c\xc3\x33\x0d\x6e\xd4\xe7\x19\x5c\xe6\x11\xb5\xe9\xd5\xe6\x81\x23\xe5\xa5\xbd\x11\xd7\x0a\xf6\xea\x76\x37\xe7\xd0\x75\x9d\x5c\x2b\x2d\x56\x1a\x62\x2c\xe8\x87\xae\x6b\xa1\x23\x70\xe7\x3a\x0a\xbe\x88\x0d\x08\x53\xa6\x7f\x89\x8a\xcf\xe6\x12\xe2\xb3\xb9\x54\x14\xbe\xda\x57\x9d\xd8\xf4\x58\x1d\x45\x12\xe1\x05\x4b\x72\x06\x3d\x9b\xd0\x58\xe1\x31\x64\x4a\x27\x94\x1e\x15\xc5\x84\xd2\x03\x35\x92\xbf\xec\x71\x9e\xab\x52\x31\x8c\x70\x42\xe9\x05\xe4\x3a\x29\x8a\xa9\xeb\x76\xb2\x72\xc4\x79\x51\x4c\xfd\xdb\x85\x37\xcf\x9a\x0d\xe6\x0d\x01\x7c\xb5\xb0\x8f\xa1\x1f\x90\x57\x2a\xfa\x9d\xb4\xe6\x32\x1b\xfe\xd0\x6c\x78\x14\x11\x86\xb1\x77\x77\x95\x89\x55\xe5\x23\xa1\xb3\xeb\xc1\xaa\xc5\x13\x32\x98\x84\x95\x0a\x81\xcf\xbc\xdb\xc5\xd0\x5e\xac\x06\x3c\xb1\x57\x68\x58\x2a\x82\xc9\x52\x03\xec\xd0\xa8\x6a\x1d\x29\xd0\xa6\xd5\xb7\xc6\x1e\xfc\x9c\x79\x16\x4a\x98\xa2\xae\xf9\xfc\xca\x5b\xc6\xfc\xac\xfb\x4a\xfa\xaa\xa2\x0d\x0d\xf7\xb1\x67\x42\x43\xab\xaa\xe6\x8e\x11\x84\x6d\xd4\xf7\x40\x19\xd1\xb7\x04\x8c\x5d\x94\xad\xbe\xd1\x9d\xba\xd1\x3f\xdf\xf5\xcf\x13\xfd\x73\xad\x7f\xae\xf4\xcf\x73\xfd\xf3\x4d\xff\x7c\x34\xbd\x3d\xe0\x56\x6d\xc7\x8d\xb1\xe9\xb4\xa7\xba\xc0\xbb\xe6\xb0\xcd\xa8\x1f\xaf\x8e\xda\x9c\x88\xd5\x41\xb1\xd2\x56\x87\xcc\x99\xe6\x05\x30\x5c\x1f\x0c\x8b\xeb\x64\x71\xa0\x08\x30\x9a\x74\x5b\x5f\x5a\x7a\xf7\xbe\xad\xfd\x32\xe9\x46\xf8\x17\x0c\xdd\x88\xf2\x5c\x61\xec\x29\xc2\x93\x61\xf5\x8f\x4c\x48\x8c\x17\x8b\xa4\x28\x50\x02\x3d\x7d\x26\x30\x1c\xf6\x73\x9a\x28\xb2\xaf\x3c\xef\xe7\xd5\x09\x19\x26\x80\x35\xa9\xc3\x45\x52\x85\x4d\xf8\x2d\xdc\xb7\x14\xdf\x46\x80\xfa\x88\x14\xa5\x25\x70\x62\x24\xc1\x78\x81\xbd\xbf\x35\xa1\xd2\x56\x8a\x70\x55\x4e\x55\xcf\x49\x55\x92\x9b\x92\xd0\xad\x4b\x3a\xf3\xb9\x87\xe6\x7e\xee\x3f\xe2\xde\x57\xee\xe5\xfe\x61\xe4\x9d\x46\x18\xd5\xec\xc0\x0b\x89\x2e\x8b\xc2\x3a\x6a\x50\xf1\xa5\xeb\x22\x75\x7b\x72\x9a\x86\x98\xbc\x50\x67\xa6\xad\x15\x62\x21\x12\xe9\xd2\x51\x31\xea\x91\x6a\x46\x4a\xb8\x6f\x14\x8e\x52\xc0\x92\x18\xbd\x60\xaa\x23\xa9\xba\x43\xa1\x50\x46\x45\x90\x86\x24\xa1\x2c\xc8\x42\x55\x2e\x31\xf7\x73\xa6\xef\x67\x85\x37\xf5\x89\x0c\xb2\x10\xa3\xa4\xd6\xca\x5b\xac\x6a\xe5\xd5\x07\x97\x4f\x91\x53\x99\xb7\x76\x2a\xf0\x89\xe5\xb9\xc8\xae\x60\x57\x7c\x61\x28\xab\xe6\xe3\x5d\x66\xdb\xca\x1a\xa5\x4a\xae\x10\x02\x62\x6b\x40\x24\x69\xab\x12\xd9\x3b\x49\x12\xda\xe9\x93\xa8\x86\xed\xb1\xa2\x42\xf2\xea\x36\x84\x0b\x23\x32\x5b\x24\x1e\xaa\x7b\x46\x52\xd0\xcc\xf8\x01\x1c\x64\x4c\x52\x1f\x65\xf4\x3d\xd4\x34\xc0\x9e\x29\xb8\x4f\xb7\xfa\x7d\xd7\x45\x19\xfd\xac\x3f\x11\x7d\x5c\x5e\x0b\x60\x57\x32\x4f\x4d\x2a\xa8\x12\x45\xe5\x7c\xce\x41\x85\x93\xcc\xca\x7b\x57\xf8\x73\x4f\xa0\x39\xec\xd1\x39\x4d\x8b\xa2\xdf\xa1\x74\xee\xcf\xbd\x3e\x49\x5c\x77\x46\xe9\xac\xbe\xc2\x27\x34\x1f\x4e\x4a\xe4\x46\xc1\x47\xaa\xbe\xc6\x59\x2a\x79\x3a\x67\x6b\x6c\x18\x6b\x94\x72\xae\xe1\xe8\x5a\x86\x24\x99\x91\x14\x17\x45\xfd\xc1\x8c\x70\xf1\x44\x6c\x48\x76\x31\x4b\x22\xc9\xde\x33\x29\x79\x7a\x96\xd3\x5b\x96\xc7\xd1\x8c\x79\x9f\x08\x53\x38\x46\x24\x99\xf7\x99\xf0\x54\x32\x31\xcb\x54\x46\xef\x05\xb9\x8c\x04\x07\x9c\xc3\x71\x08\xbf\x00\x5d\x64\xef\x76\xec\x3d\x11\x8b\x05\x41\x4f\x84\x45\xd7\x5e\x59\x11\x6c\x03\x0f\xfa\x44\x10\xf4\xdc\xce\x7a\x2d\x50\x23\x77\x33\xfb\x73\x41\xd0\xb7\xdf\xcf\xfe\x4d\x90\x8f\xd6\x57\x4d\x41\x35\x78\x5e\x0d\x8a\xe5\x52\xf8\x97\x02\xce\x82\x02\x2a\xa4\x26\x5b\xfa\x8b\x66\x3d\x13\x96\x30\xc9\x5a\xf0\x05\x28\x72\x1e\xe5\x00\x14\x74\xae\xb5\x46\x1b\x01\xab\x14\x1e\xab\xea\x7b\x54\xfa\x03\xaf\x4f\xe4\x52\x2b\x67\x4c\xde\xd5\x84\xa9\x4e\xed\x94\x4b\x51\xdd\x47\x56\xed\x0a\x73\x4e\x7c\xee\x09\xb3\xcc\xaf\x2a\xfd\x64\x86\x7d\x95\xd3\xe3\x4b\xed\x9d\x47\xf9\x2f\xdb\x33\x08\x89\x80\x2a\x14\xa2\xe5\xd9\x15\x2f\xd5\x98\x37\x46\x60\x5d\x9c\x6d\x75\x56\xf3\xd1\xb5\xa7\xd1\xef\x7b\x03\x22\x02\x16\xd2\x4b\xe1\xba\xb2\x54\xfd\xd2\x8c\x8c\x05\xf9\xf0\x0f\x56\xd7\xb0\x1a\xcc\x8a\x7e\xf8\xfd\x15\x35\x75\x10\x41\x5f\x82\xc2\xad\x81\x46\x1d\x24\xf6\xfa\x45\x81\x04\xad\xc0\x47\x6f\xe0\xcb\x8d\x59\x36\x43\xd8\x7b\x5b\xab\x84\x93\x01\x26\xbd\x5e\xd5\x3e\xe9\x63\xbc\xd4\x83\xdf\x58\xed\x95\xe6\xd7\xc4\x5e\x1f\x14\xfd\x44\x18\x0c\xc2\xa5\x0a\x97\x97\xb3\x2c\xf2\x72\x89\xce\x27\x0c\xd4\x90\x9b\x65\x7f\x6b\xe1\x48\xaa\xba\x63\xeb\x04\xa7\x7b\x7d\x1f\x75\xbb\xf5\x30\x45\xe9\x0c\x81\x11\x19\x62\xec\xa9\xdb\x23\x18\x84\xd4\x2c\xdf\xfa\xaf\x97\x4f\xaf\x16\x69\x2e\xe5\xed\x79\x94\x9f\x7b\x0a\xb6\x7e\x14\xe4\x22\x9a\xa9\x20\x3a\x10\x45\xf1\x41\x60\xa2\x11\xf1\xf2\xeb\x62\xa9\x91\x3b\xd7\x39\xcd\x60\x5a\x08\xc3\x65\x1e\xeb\x0a\x6e\x3b\xa9\xeb\x3f\x5b\x3b\x33\x1d\x75\x9d\x1a\xf9\x58\x2a\x76\xc7\x0a\x59\xc5\xf4\x19\x58\x2a\x76\xd7\xe2\xd4\xe5\x88\xba\xdd\x55\x87\xab\x7d\x52\xa2\x39\x12\x13\xeb\x98\xe9\x3c\x94\xa6\x70\xc8\xf4\x92\xbc\xb6\x5b\x8a\x26\x13\xda\x48\x50\xab\xd9\xd6\xe5\xc6\xf2\x94\x6d\x25\xb8\xad\xca\x3b\xc6\xdc\xac\xc0\x0c\xfb\xd9\x3f\x38\xde\x9a\xdd\xd4\x3c\xe2\xcf\xfe\xd5\x11\x97\x3f\xd9\x01\x25\x07\x8b\x88\xa5\xca\xef\xd8\x01\xcd\x61\x99\x4d\xf0\xec\xbf\x33\x21\xbf\x07\x5d\x15\xa5\x6c\xf3\xcb\x3f\x58\x08\xa0\x9d\xa9\xa3\xce\x4f\x5a\x02\xb1\xbd\xc1\xc3\x87\x95\x1e\xb5\x7d\x86\xad\xf9\xed\x76\xf5\xfe\x81\xa4\xa1\x68\xe1\xfe\xad\x0b\x94\xd6\x1a\xba\x2d\x5b\x90\x5a\x35\x2c\x00\x23\x8e\x52\xfa\x9e\xa3\x71\x8a\x49\x0c\xa1\xb3\x94\x74\xfa\x16\x43\x3c\x6f\x8c\xb4\xd2\x8c\x5f\xe1\xd1\xd8\xaa\xca\x82\x76\x3a\xb2\x4c\x6b\x8a\xcf\xe7\x2d\xfa\xe5\x3f\xd3\x45\x66\x0a\xfb\x8d\xa8\x44\x09\x36\x58\x73\x87\x46\xae\x8b\x62\xb8\x97\x22\xaa\x22\x9d\x2c\x42\x11\xf6\x14\x4a\x1e\x63\x8c\x55\xc9\x98\x46\x24\xa7\x89\x99\x8a\xbc\xee\xc1\xac\x31\x9e\x20\xfc\xe9\x78\xcc\x20\x5c\xb7\x84\xab\x6c\x69\x3c\x93\xd4\xd6\xd4\xd6\x18\x7b\x6f\xa0\xf0\x75\x9b\xfb\x29\xe0\xc2\x9a\x65\x98\xf0\xa2\x40\x9c\x06\x60\x33\x91\xed\x25\xe5\x38\x23\x8d\xde\xcb\xfd\xbe\xeb\x0a\x14\x61\x5f\xee\x0f\xfc\x49\x8a\x22\x22\x7b\x83\xb2\x72\xef\x50\x91\x35\x11\xf6\x52\x55\x45\xc0\xcb\xfa\x43\x1a\x55\x0b\xce\x41\xa8\x72\x92\xd2\x53\x8e\x30\x99\xc2\x6f\x63\x2d\xc7\x2b\x6c\x83\x13\xdd\xff\xd3\xc8\xc2\xe3\xcf\x56\x72\x4d\x5b\x72\x9d\x37\x73\x7d\xb9\x43\x8f\xfa\x73\x52\xf2\xaf\xad\xa2\x47\x2b\xcc\xb1\xbe\x16\xf8\x9f\x70\xb8\x6b\xb1\x99\x3b\xbd\xdc\xcc\x75\xb5\x09\x0b\x65\xc1\x93\x0c\xc9\x40\x74\xbb\x21\xae\xf1\x2e\xd7\x15\x0a\xa2\x32\x9b\x1b\x7b\xb0\x44\x7a\x49\x0b\xb4\x00\x17\xca\x4f\xd5\x84\xa6\xc0\x4f\xb4\xba\x76\xdc\xb8\x16\x4a\xa6\x3d\x83\xbd\x56\x7b\x36\x31\xee\x7f\x42\xc7\xb3\xfc\xd0\x24\x49\xe8\x78\x2f\x98\xeb\xbe\x60\x8a\x34\x03\x4a\xce\x5f\x85\x7d\x35\x7f\xea\x05\xc3\x44\x50\x16\xbc\x60\xe1\x50\x8a\x9b\x5b\x08\x51\xae\x2d\x35\x69\xa7\x5f\x0a\x7a\x13\x7c\xbb\xd0\x1b\xeb\xbb\x29\x5a\x5f\xff\x8a\x52\xf2\x75\x41\xe1\x95\xe8\x2f\x44\x31\xc9\xee\xd2\x08\xa9\xab\x69\x2a\x84\x3c\x5d\x5a\xf7\x7d\x69\xd9\xb4\x35\xbf\x55\x0b\x63\xb3\x91\x2d\x5b\xb5\x3b\x72\xcb\x6a\x62\x2c\x43\xb4\x15\x88\x90\x51\xe1\xbf\x97\x1e\xd0\x8d\x2c\xe8\x87\x86\x6a\x6c\x10\x90\xea\x78\xa7\x28\xc2\x64\x0e\xfe\x95\x66\xea\x24\xc7\x15\xd9\x3c\xa1\x2c\x88\xc3\x61\xec\xba\xd2\x75\xd1\x44\xd1\x92\x13\x45\x4b\x4a\x45\x4b\xce\xe9\x89\x40\x13\x53\xd5\x1c\x93\x3c\x88\x43\x10\x73\x20\x59\x14\xc9\x3e\x1d\x6c\xf5\x5d\x77\x52\xd1\x98\x83\xad\x3e\xf6\x4b\xb2\x32\x76\xdd\x09\xf6\xf8\x62\x02\x3d\x83\xa5\x3a\x51\x07\x7e\x4a\x73\x15\xaf\x28\xce\x93\x3d\x45\x3f\x1a\xd8\x3e\x2f\xbb\x35\xa6\x93\xe0\x24\x24\x67\x54\xfa\x12\x8d\xb1\x07\xd7\xc0\x98\x0a\x4d\x77\x8e\xfd\xb1\xd7\x27\x1d\x34\xf5\x3f\x4b\x34\x25\x67\xd8\xcb\xd0\x8c\x9c\x11\x45\x00\xc3\xe4\xc4\x34\x1a\xf6\x7a\x71\x59\xd9\x39\x55\xfd\x86\x8b\x04\x9d\xab\x22\xe7\xba\x88\x1a\x79\x59\xaa\xa6\x4e\x17\x53\xd7\x9d\x6a\x10\x76\x86\xc9\x4c\x87\xc6\x78\x61\x40\xc7\xcc\xb2\xde\x5b\x3a\x3a\xfa\x14\x20\x46\x2f\x32\xf5\xa1\x3a\xa4\xd8\x67\x1e\x1c\xc8\x4f\x99\x9a\xd7\xea\x3c\xea\xfc\xa9\xcf\xbd\xe3\x92\x65\x6f\xad\xf6\x3b\x7b\x23\x96\xb2\x67\x38\x73\x94\x9e\x58\x86\x79\x16\x4f\xda\xe6\x71\x53\x59\x14\xb5\x81\x5f\xa9\x1e\x54\x14\x1d\x23\xc4\x7e\x94\x20\x89\x7d\xa6\xf7\x5a\x87\xca\x25\x2f\x60\x0d\x16\x77\x29\xfb\x8a\xd5\xaf\xc4\x24\xa7\x91\x3f\xf5\x34\x8f\x77\x4e\x63\x1d\x96\x98\xcc\x28\xca\x69\x4e\xe9\x89\x7f\xe1\xe5\x98\xd2\x0b\x32\xa1\x68\x4e\xe7\x3a\x65\x0e\x29\x47\x2a\xc3\x5c\xad\xc4\x51\x29\x36\xd3\xb2\xea\xbf\x2c\x59\x75\x67\x30\x8c\x68\x47\x6d\xd4\xce\x60\xa1\x73\x76\x66\xe6\xc2\x6f\xb0\xcf\x48\x54\x14\x20\x67\xf3\x5f\xf0\x46\xbf\x57\x47\xc3\xf5\x78\x8c\xf5\x6d\xc9\x74\x7d\xe5\xf1\x29\xb2\x39\x9d\x1d\x2a\xad\x58\x51\xd8\x2c\x51\xf3\x4d\xc7\xea\xce\x32\x6a\x98\xab\x44\xaa\x2c\x9a\xcf\xda\x60\xea\x76\x7e\xda\x48\x27\x43\x40\x10\x30\x90\x30\xea\x90\x3a\x7e\x4b\x4c\xe0\x92\x37\x5a\x4e\xc4\xf3\x04\x75\x19\xe9\x1a\x43\xe1\xf3\xda\xd2\x37\x8d\x2e\x98\x22\xf9\xd4\xaf\xeb\xb2\x8d\x0b\x96\xe7\xd1\x19\x24\x95\x41\xc3\x48\x6d\xb2\x59\x55\x8e\xae\xe3\x18\xbe\xac\x5e\x7a\x21\x0c\x27\x94\x4f\x51\x54\x14\x28\xa2\x99\xc0\x44\xab\x05\x76\x4a\x8c\xd3\x75\x3b\x68\xe0\xa6\xd6\x02\x6a\xc4\xc2\xe6\x6b\x56\xec\xfb\x98\x52\x39\x4c\x0b\xba\x45\x92\x0a\xeb\x82\xfc\x39\x7d\xc1\x11\x48\x4d\x81\x37\x6f\xd6\xac\x12\xea\xd4\x98\x2f\xc9\x0d\x2b\x96\x4f\xd1\x4d\xa5\x63\x51\xf3\x5d\x29\x35\x61\x69\xae\xfc\x4e\x69\x69\x97\x57\x9b\x44\xc3\x83\x81\x2b\xb0\xde\xe7\x07\x74\xd6\x90\x89\x34\x54\x34\xc8\x25\x9d\xd4\x5f\xe5\xd2\x57\x55\xd5\x41\x51\x5c\xea\x8a\x4e\xe9\x81\xcf\xb4\x7a\x09\xc2\x1e\x23\x6f\xe8\xa5\x2f\xab\x78\xa5\xd0\xd8\xdc\xca\x19\x3a\x25\x6f\xa0\x6f\x49\x05\x6b\x3a\x9d\x23\xd7\x45\xcd\x7c\x3f\x3b\xa7\x03\x57\x90\x98\x7e\x05\x61\x6a\x4e\x63\x8b\x67\x98\x77\x54\xb2\x34\xe8\x82\xeb\x56\x4c\xc4\xce\xa0\x92\x3a\xcf\x69\x3e\x9c\x57\x17\xc3\x8c\xc6\xc1\xbc\x04\x9a\x91\x3f\x53\xf7\x91\xb4\xf8\x29\x33\x6c\xb1\x50\xf5\x45\x62\x96\x9b\x9c\x94\x41\xa9\xe5\x3b\xae\x7b\x62\x96\x68\x02\x12\xc4\x13\x4a\xb5\x9c\x6b\xaa\xb0\xe4\x7a\x1b\x94\x3b\x02\x98\x08\xa6\x53\x63\x1a\x0d\xbb\xdd\xf9\x5e\x5e\x76\xeb\x8c\xb2\x40\x77\x2d\x24\xe7\x54\x06\x33\xe8\x62\x0a\xa8\xec\x11\x8d\xfc\x54\x01\x77\x32\x23\x12\xd8\xcc\x5e\x8a\xce\xc8\x39\x99\x11\x35\x5b\x66\xc9\x8f\x00\x49\x39\xa3\x94\x9e\x17\x45\x06\x19\xf4\xbc\x7b\x47\xea\xfa\xa0\x9d\xc1\xf0\x54\xb0\xe8\xdb\x62\x5c\x14\x68\x4c\x1d\x8b\x6b\xe7\x50\x3a\xc3\x0a\x28\x4d\x5d\xb7\x33\x36\xfb\xa6\x21\x73\x20\xc7\x54\x36\x04\x3d\x07\x1d\x7a\xec\xba\x8d\x5a\x38\xe0\x8a\xcb\x49\x52\x9d\xa3\x9a\xdd\x5c\x49\xeb\x0e\x5c\xf7\xc0\xa6\x92\x0e\x5c\xb7\x25\xd7\xb1\xeb\x1e\xdb\xb9\x8e\xb1\xeb\x22\x35\x98\x0a\xe9\xb5\x4f\x50\x15\x96\x98\x4c\x17\x8d\xcd\x84\xeb\xe8\x7b\x75\xab\x58\x77\xd2\xe9\x12\xdf\x3a\xab\x18\xf5\x24\xa1\x19\x89\x68\x27\x6d\xe1\xd8\x27\x0d\x8e\x7d\x56\xed\xb0\x98\x8a\x92\x55\x1f\xb9\x6e\x1c\x6c\x85\x7e\x1c\x0c\xc2\x0e\x55\x18\x49\xd0\x0f\x43\xaf\x83\xd4\xaf\x16\xae\x57\x7b\xad\x44\x1b\x6a\x92\x20\xa7\x48\xd7\x84\x83\x7e\x48\xe6\x94\x05\x79\x48\xd4\x16\x19\xd8\x75\xc3\x3d\x33\x37\x22\x81\x52\xc1\xa2\xae\xd5\x92\x5e\xea\x93\x56\xef\xaa\x13\x9a\xa2\x39\x99\x91\x1c\x36\xd1\xa4\xdc\x44\x27\xb0\x89\xde\xa7\x68\x46\xe6\x64\x9b\xa4\x64\x82\xbd\x13\xab\xc2\x16\xb1\xc2\xa1\x75\xa3\x77\x4a\xb9\x6f\x51\xac\xa2\x9d\x9d\xce\x0d\x73\xdd\x1b\xc0\x8d\x99\x42\x3c\xd5\x4a\x7e\x06\x54\xfc\x8a\x79\x27\x0c\x6b\x7d\xe3\xeb\xac\x89\x90\xbf\xb2\xaa\x68\xd9\x1f\xcc\x67\x5e\x85\xa6\xc7\xde\x8a\xd7\x10\xe6\x6b\x6c\xff\x3a\x45\x0a\x61\x23\x2c\x18\x84\xd8\x7b\xa2\x2a\xf5\xf2\xb8\x81\x88\xbe\x49\x4b\x95\xb8\xce\x51\x66\xc9\x74\x67\xa0\x50\xa3\x71\xf7\x20\xac\x4e\xb0\xa8\x50\x59\x5c\x43\x57\x81\x97\xf6\x7f\x87\x0a\xd7\x95\x1a\xdb\x12\x96\xf6\x74\xd5\xe8\xcd\x12\xce\xbd\x67\x7d\xfb\xde\xa0\x54\xc1\x08\xfb\x99\x26\x5d\x2a\x6d\x1b\xec\xfd\x8c\x80\xcd\xf0\x2d\x0f\xba\x5d\xed\x4d\x00\xe2\x0b\x4c\x2c\x22\xe9\x89\x45\x96\xf0\xcc\x22\x2b\x06\x35\x73\xd5\x75\x65\xd0\x0f\xd5\x36\x3e\x56\xa4\x57\x5f\x2b\x74\xa8\x5f\x35\x91\x2d\x4a\xff\x82\x02\x72\x76\x9a\x82\x35\x72\xc3\xf4\xf6\xba\x39\xd8\x71\x06\x58\xdb\x81\xc2\xb3\x54\xed\x4f\x4a\x99\x74\xa3\x56\x8d\x83\x5e\x46\x4d\xae\xa7\xde\xf1\xea\x47\xfa\x8f\xf5\x37\xef\x7d\x8a\x24\x49\xc9\xb6\xdd\xe2\x55\x03\x91\x64\x1d\x0d\xa8\x53\x9b\x54\x4d\x48\x04\xab\x9e\x15\x05\xca\xaa\x0b\xe9\x6b\x82\x12\x8c\x3b\x6d\xf7\x92\xca\xaf\x0f\xfa\xe3\x0c\xd6\x9c\xe4\x2a\xa4\x30\x66\x32\xa7\x11\xdc\x11\xb9\x96\x28\x61\xd0\xe0\x11\x64\x8e\x87\xd5\x51\x9c\xd1\xc4\x4f\x50\xac\xae\xec\xae\xe3\xc0\xe9\x8b\xb0\xc7\xc9\x84\xce\xd4\xa8\xe0\x6e\xd1\x0d\x9c\x28\xd4\x34\xc7\x64\x4a\x3b\x27\x80\x57\xe6\x98\x8c\x21\xdc\x99\x82\x2a\x56\x8e\x87\x33\x9a\x93\x93\xa2\x98\x16\xc5\x58\xed\xf4\x18\xfb\x33\x1a\x7b\x6f\xcb\xd0\x25\x47\x31\xf6\xa6\x3e\x9a\xd0\xce\x80\xcc\xe8\x39\x47\x39\xe9\xf4\x31\xf6\xc6\x55\xda\x41\x95\xa6\x68\x28\x4f\xaa\x6a\x8b\xe2\x83\x6a\xcd\x47\x33\x1a\x93\x0f\x65\x65\xd3\x48\x55\x06\x27\x3c\xc6\x45\xf1\x59\xfd\xa8\x33\x3c\xa3\xf3\x0c\xe5\x18\x63\x4f\xd5\xb8\x98\xb8\x2e\xd2\x42\xd8\x9c\xcc\x14\x06\xa0\x60\x4c\x0a\xd3\x46\x22\x03\x9f\x73\x8c\x49\x39\x37\x33\x2d\x47\x96\x24\x22\x82\x5c\xa5\xb0\x52\xf5\x6c\xc5\x34\xf5\x53\x04\x13\x1d\x61\x55\x89\x99\xb3\x0c\x7b\x7c\x18\xeb\x7d\x80\x62\x9a\x94\xf5\x45\x20\x8e\x26\x87\x36\xa7\xe2\x79\xe3\x1c\x31\x0b\x81\xa8\x90\xac\x93\x0c\xc9\x2e\x95\x7b\x7d\x5f\x78\x7d\x22\xb0\xcf\x02\xd9\xd0\xee\xfa\x56\x11\x45\xb2\x3a\x1a\x7e\xd3\x76\xbc\xa6\x6b\x34\xc8\x69\x61\x86\x1c\xa9\x9d\x37\x50\x07\xc4\x54\xa1\x80\x92\xc7\xf0\xc2\x63\x0b\xec\x05\x2c\x0e\x87\x86\x27\x56\x01\x8b\x5a\x10\x9a\x21\x45\xbe\xae\x32\x20\xd3\x26\xb7\x89\x6d\xe4\x99\x90\xa8\x55\xf9\x63\x59\x87\x63\xc9\xf1\x09\xdb\x88\x05\x97\x4c\xf0\x08\x94\x95\xaa\x48\x42\x79\x4d\x85\x0b\x9b\x55\x97\x54\xd7\xde\x31\x47\x3c\x48\x43\x92\x81\xf3\x00\x1b\x39\x4e\xf7\x69\xe4\xc7\x5e\xfc\x27\x72\x26\x2c\x8f\x1d\x0a\x42\x6d\xbf\x37\xf0\x06\x96\xaf\x1e\xd0\xcc\xe9\x49\xfd\x6b\x1c\x48\x2c\x4a\x61\x38\xb8\x9a\x50\xff\x34\xc6\x59\xbb\x30\x41\xdf\xd3\x16\x67\x1b\xa5\x7e\xb0\xe9\xbf\x77\x97\x95\xbf\xd4\x0c\x3d\x68\xd2\xeb\x76\xd3\x52\xbb\x8b\x2d\x16\xf6\x1d\xf4\xf1\xae\xe9\x92\xb5\x5b\x8e\xdb\x85\x71\x8c\x61\xbc\x28\x68\xce\x25\xf0\xba\x14\xbe\x8f\x22\x92\x60\xd7\xfd\x94\xa2\x8c\x9c\x70\x94\x10\x45\x12\xb4\xd9\x2c\x7d\x58\x11\xa3\xa7\xfe\x73\xe9\x5d\x49\x52\xb2\x16\xa5\xc5\x10\x29\x91\x10\x80\x6b\x48\xaa\x03\x2f\x31\x26\x5a\x51\x0b\x7c\xd0\x94\x02\x74\x83\x5b\x98\x01\xc4\xb4\x4f\x72\x2a\x83\x4c\xe1\x16\xc2\x17\x28\xc7\x5e\x3e\x44\x31\xe5\x28\x22\x73\x12\x93\x14\x6b\xd7\x02\x51\x07\x54\xcb\x8c\x60\x2d\x22\x31\x19\x60\xf2\xb6\xba\xf2\x54\xb4\xc5\xa1\xcc\xfa\x0a\x8b\x8f\xf9\xa6\xdf\x5e\x9f\x80\x53\x11\xad\x2a\x58\x8e\x11\x1c\xd3\xa8\x23\x49\x69\x5a\x14\xbc\x43\x69\x66\xb0\x31\x3e\x3c\xc9\x10\xc7\x7e\xdd\x28\x27\x03\xec\x65\x8a\x3a\xe6\x35\x0b\xc3\x6a\xfd\xf5\xd2\xad\xda\x9d\x4b\x74\x26\x10\xfe\x13\xc9\x1e\xeb\x0e\xec\xb5\x7d\xd6\x00\x0e\x8e\x03\x78\x10\x2b\x0a\xb9\x37\x28\x0a\xb9\x3f\xaf\x35\x17\x27\xd9\xad\xfc\x9f\x2d\xd7\x45\xa2\x4b\x19\x26\x48\xd2\xb9\x44\x72\x73\x0b\x80\x20\x53\x69\x8b\xab\x73\x9e\x30\x4b\x4b\xcd\xf6\x91\xd1\xec\xd2\xfb\x0c\x3d\x05\x76\x0a\x61\x31\x26\xac\xdb\xf0\x68\xf1\x97\x0d\x4c\xfe\x12\xe8\x79\xd4\xc4\x89\x7e\x34\xfa\x0c\x5f\x4d\x8b\xaf\x32\x24\x8c\xca\xa9\x68\x53\x39\xb5\x36\x57\x8b\x9a\x5e\xcd\x82\x83\x9d\xb6\xca\x92\x25\x11\x4d\x7a\x03\x12\x53\x56\x32\x67\x63\xd7\x6d\xa2\xad\xc0\xa1\xcd\x42\x75\x17\x02\xba\xd9\x50\xb4\x04\xbd\xdc\x26\xe5\xa1\x55\x7b\x8d\x88\x05\x12\x1a\xe6\x05\x59\x87\x46\x35\xed\x96\x87\x43\x34\x87\x3b\x41\x5d\x2b\x31\xf6\x38\x2e\xef\x80\x39\xfd\x9a\xa0\x19\xf6\x67\xde\x09\xf4\xa0\x3b\x08\xb1\x1f\x84\xde\xed\x02\x2f\x5e\x08\xb8\x70\xe7\x98\xc4\x50\x47\xbd\x65\x54\xbd\x9f\x53\xfa\x58\xdc\xa1\x7e\x67\xc9\x50\xd8\xc2\x63\x31\x79\x91\xd2\xaf\xac\x3d\x33\xe8\x8f\x3a\xc6\xda\xc2\xf9\xb9\x22\xe9\xa0\x04\x35\x5f\x81\x2d\xd0\x50\x26\x55\xed\xd4\x3c\xfb\x97\x69\x53\x49\x78\x79\x33\x7c\x6d\xb0\xeb\xf8\x92\x34\x45\xee\xf5\x01\x30\xf4\xe4\x7e\xe6\xf7\xbd\xac\x2b\x31\x41\x82\x8a\xfd\xcc\xcf\x3c\x81\xe1\xab\xe8\xd2\x0c\x2b\x78\xbf\x2f\xfc\xbe\x27\x7a\x72\x7f\x7f\xbf\x4f\xd4\x7f\xda\xaf\x76\x84\x56\x58\x35\x6e\x79\x92\x80\x2b\x70\xcc\xbb\x32\x6c\x51\x4f\x7d\x64\xef\xcf\xdf\x90\x17\x75\x90\xa0\x46\xd2\xa2\xc0\x71\xa7\x63\x1d\x9c\xbf\x97\xd8\x91\x7d\xcb\x3f\x57\xea\xd9\xb7\xb9\x93\x82\x2f\xf8\x1a\xf9\x97\xa0\xbe\x20\x5d\x97\xef\xd1\xad\xc1\xce\xfd\x9d\x07\xdb\xbb\x3b\xf7\x35\x50\x1a\xd6\xb0\x3a\xa3\x69\x97\xef\xef\xef\x0f\x8c\x9a\x95\xde\xd9\x34\xd1\x92\xa5\x04\x14\x48\xfd\x64\x8f\x4a\x2f\xd9\x93\xd8\x4f\x69\xd6\x1d\x78\x9c\x66\xb5\xdc\xc5\xec\x27\x5e\x1e\xe9\x06\xcf\x93\xf1\x65\xfa\xb2\x4f\x92\x36\x8b\x00\x3e\x45\x7d\x4a\x69\x62\xf6\x7f\x3d\xfb\x91\x3a\x8a\xa0\xd4\xd4\xa1\x92\xc4\x65\x61\x2a\x49\x4e\x33\xd8\x40\x73\x0a\x8a\x1a\xc3\xfa\x24\xce\x14\x78\x42\x59\x37\xc1\x9b\x5b\x98\x4c\xa8\x40\x2c\x98\x85\x98\x9c\xd0\x49\x87\x52\x4e\xa6\xa6\x92\x09\x19\xd3\x89\xfa\x39\x53\x75\x69\x4a\x30\xc2\x9a\xc3\x9c\x16\xc5\x18\x90\xb1\xb5\x73\x3a\xf7\xc7\xae\x8b\xd2\xa2\x38\xc1\x5e\xac\xc2\x27\x3a\xda\x99\x62\x2f\x2f\xe3\x0a\x31\x85\xb4\x33\xec\xa9\x70\xe7\x4c\xc5\xfd\x89\x9a\xbb\xc9\x9e\xc4\xc3\x73\x3f\xa3\xb3\xee\xc0\x4b\xe8\xcc\x4c\xda\x89\x40\x09\xa9\x9e\x42\xd8\xb1\x26\x4e\xf2\x7f\x6d\x2d\x4c\x22\xe0\xb1\x27\xd8\x4b\x00\xa2\x0b\xad\xe3\x0e\x02\xc2\x12\x5f\x89\x86\xa5\xe5\x30\xcc\xb9\xdf\xf7\x92\x45\xcb\x6d\x2c\xb8\x45\x7f\x2e\x6f\x30\x45\x7d\x66\xc0\xaa\x3d\x8a\x8e\xbc\xae\x75\x03\xa5\xbc\x24\x26\x57\xb5\x94\x1b\xd0\x6d\xdd\x86\xbf\x70\x61\xa7\x1c\x77\xf5\x35\x04\x35\x9b\x6f\xdf\x85\xff\xbd\xe2\x04\x7a\x8e\x53\x52\xa4\xea\xe6\x28\x4f\x98\xd3\xd7\x9a\xec\x83\x4d\x46\x69\x2f\xf7\x9d\x5e\xdf\xf1\x2c\x72\x92\xf3\xe6\x41\x02\x0c\xe6\x9d\xb4\xa0\x85\xd1\xd3\xd3\xe6\x1b\x1a\x41\x06\xad\x3a\x4e\xdf\x4b\xbd\x0d\x54\xb7\x40\xeb\xce\x80\x7b\xe9\xab\x6d\xe4\x3d\xe3\x25\x47\xb4\x02\xde\x99\xc2\x29\x86\x65\xf1\xcf\xb0\x69\x41\x84\xa2\xb5\xe3\x62\x2a\x15\x70\x8e\x6a\x89\x49\x2d\xf5\x9d\x6b\xa9\xef\x0c\x56\x70\x8e\xbd\xb9\xd6\xce\x13\xbf\xd0\xce\xab\x38\x83\x46\x49\x2f\x6e\x51\xd2\x93\xae\x5b\xaa\xe3\xcd\x14\x39\xd2\xd0\xd8\xe3\x28\x26\x33\x30\x82\x40\x71\x07\x04\xcb\x2d\x59\x2b\x8c\xcd\xd2\xf3\xcc\xf8\x8a\xb8\xab\x55\x60\x52\x14\x95\x84\xae\x16\x9b\x58\xfa\x93\x7c\xc5\x10\xc2\x5c\xd7\xa8\x14\x99\x62\x92\xda\x76\xe2\xfc\x17\xbe\xe2\x52\x9f\x7b\xbd\xc1\x10\x59\x8e\xe2\xb0\xeb\x5a\x6e\xe2\x2c\xd7\x51\x3e\x5c\x24\xa9\xba\x24\x48\xea\x03\x84\xc3\x5e\x99\xa6\x62\x7d\xa2\x6a\xcb\x6c\x03\x72\xde\xa0\xab\xaa\x9a\x9a\x06\x84\xda\x81\x98\x61\x14\x63\xf2\xaa\x49\x34\x59\xf3\x26\x37\x54\xb2\xf1\xd9\xb9\x21\xcf\x79\x7e\x20\xce\xc8\xa1\x44\x01\x0b\x89\xdc\x88\xc4\x59\x8e\xf1\xa2\x01\x5b\x73\xde\xbc\xfd\x6c\x58\xca\xf7\xb6\x2a\x97\x71\xbe\xda\xfd\x41\x3f\x04\x86\xc9\x12\x96\x93\x22\xae\xf1\x63\x5e\xe3\xc7\x5a\x22\x4f\x62\x45\x88\x75\xbb\xb1\xfa\x14\x77\x68\xe6\xba\x28\x09\xb2\x90\x26\x29\xfc\x16\x45\x44\x40\xdc\xa6\x7a\x50\xfb\x69\xe4\x68\x92\xa2\x44\xe1\xc9\x4d\xab\x99\x39\xff\x85\xf2\x43\x13\xb9\x2f\x49\x8a\x6c\x88\x41\x41\x5f\x9d\x89\x74\x2f\xf1\x15\x61\xe1\xf1\x36\xc3\xa5\x99\x05\xab\xd6\xde\x02\x11\xca\x3c\xdb\x90\x6f\xc2\x7f\xc9\x4c\x63\x71\x9d\xfd\xa4\xb9\xaf\xd7\xcb\x1a\xc7\xb0\xad\xb1\x1f\xb0\xd0\xfb\x9e\xa1\xb1\x46\x48\x80\xf3\xcd\xe9\xdb\xd4\x52\x37\xe0\xcb\xa6\x02\x4b\x1e\xf7\x4a\xc7\x72\xa9\x27\x48\x47\xba\xae\xd8\x07\x31\x7e\x85\xd1\x40\x9d\x67\x9c\xa6\xb2\x8d\xa1\xb8\xb6\x64\xe4\xac\x48\xb9\xba\xed\xf3\xb2\xef\x7c\x8a\x2a\xff\x84\xc6\xa9\x1c\x1e\x5e\x2e\x7b\x44\xfb\xc0\xfc\x0f\x0c\x09\xec\xb5\x98\x10\x58\x7e\x22\xe2\x6c\x76\x83\xd2\x86\xed\x11\x58\x36\xfc\x44\x55\xdf\x32\x38\xb0\xcd\x14\x40\x1a\xa6\x0d\x08\x8d\x94\x0c\x13\x0b\x5a\x1f\xf0\xff\xae\xdd\x43\x49\x0a\x58\x9a\x0e\xf5\x04\x01\x5f\xac\x3a\xc7\x80\x1d\x18\xb1\x2f\x65\x6a\x7b\xaa\x9f\x84\x66\x5a\x8c\x45\xc1\xa2\xa8\x89\x84\x28\x34\x8b\xcc\x35\x2e\x02\xf7\x6d\xec\xba\x9d\xb9\xeb\x76\x12\xd7\x65\xfb\xb2\x28\x12\xd7\x8d\x5c\x37\x77\x5d\xfd\xa5\x28\x52\x9d\x50\x14\x1d\xa1\x7f\x32\xb3\x4a\x03\xa8\x20\xd5\x85\x55\x25\x6c\x4f\x16\xc5\xdc\x75\x05\xb8\x1d\xd5\x5f\x8a\x22\xd6\x09\x45\xd1\x89\xf4\x8f\xb9\x79\x7a\x46\xf9\x7d\xcd\xe2\x52\x3f\x35\xa0\x92\xdb\x7a\x06\x0d\x4d\x1d\x8b\xb3\x01\xe7\xde\x52\x50\x27\x73\x3a\x11\x28\xe9\x45\xa4\x8f\xc9\x8c\xa6\x28\xef\xce\x15\x4e\xd5\xe1\x00\x1c\xf2\x21\x9e\x05\x71\x48\x65\x10\x6b\xe0\x02\xd0\x24\x1a\x62\x34\x29\x8a\x6c\x0f\x10\xc8\x59\x20\x82\x2c\x0c\x01\xac\x68\x39\x90\x96\x4a\xcd\x82\x58\xe1\x20\x2c\xc8\xba\xdd\x0a\x97\xb6\xa4\xf1\x17\xbf\xd5\x71\x20\xc9\xaa\xde\xe7\x2a\x3e\xaf\x7b\x3f\xd3\xbd\x8f\x55\xef\x27\x34\x45\x33\xd5\xfb\x13\xdd\xfb\x6c\x6f\x36\xc4\x13\x05\xd3\x00\xf5\x35\x4d\x4c\x69\x36\xec\x76\xf3\xbd\xb9\xfa\x38\xed\xe6\x6a\x70\x79\x35\xb8\x68\x2f\x1e\x62\x74\x52\x0d\x4e\x65\x11\x41\x14\x9a\x71\x54\x3b\x7d\x62\xe9\x84\xf0\x15\x6e\x76\xd3\x14\xb6\x28\x90\x04\x58\xac\x1d\x46\xf2\x21\x96\x81\x08\xb5\xef\x97\x55\xc6\xf9\xe3\x15\xa4\xba\x23\x86\x5a\xcf\xea\x76\x81\x2d\xb2\xa5\x37\x50\x5b\xb6\x66\x59\x25\x95\x2d\x40\x4c\x65\x90\x84\x24\x07\x72\x52\x28\x30\x0e\xb0\x3c\x06\x4f\xb0\x1e\x1f\xe6\x25\x65\x99\x83\x32\x09\x26\x99\xff\xb7\x3a\x58\x31\xc9\xb1\xf7\xc2\x84\x5a\xdc\x61\x7e\xe1\x77\x38\xc6\xa9\x39\x3a\xeb\x09\x12\xd8\x7f\x2a\xbd\xaf\x42\x11\x5e\xbe\x44\xd8\xbb\x5d\x54\x17\x08\xb0\xce\x45\x86\x52\xb2\x05\xc6\x8e\x96\xfe\x44\x03\xc4\xa7\x35\x93\xaf\x89\xd8\x35\x45\x58\xfb\x03\x5f\x04\x59\x6f\x10\x7a\x9c\x44\x34\xdb\xdf\xf2\x45\xb0\x15\x7a\x1c\x66\xa9\xde\x47\xfb\xdb\xad\x22\xb8\xc4\x47\x59\xaf\x47\x12\xac\x4a\xbb\xee\x34\x43\xb5\xbb\x6d\xf0\xc3\x93\xd0\x6c\x6f\xdb\xe7\x5e\x42\x32\xaa\xee\x3c\x7a\x01\x3c\x10\x1b\xa5\x8b\x81\xe3\x37\x8c\x5d\x97\x21\x49\x62\x2d\x0f\xae\x16\xd5\x82\x4a\xef\x7f\x36\x77\x95\x10\x4e\xd4\x5c\x19\x05\x2b\x9e\xa9\xd9\xac\x80\x3c\xe4\x1d\x5a\x8e\x65\x6b\x7c\x48\x02\x3e\x44\x12\xd5\x43\x81\x87\x48\x36\xf0\x22\xf0\x9b\xad\x2f\x76\x2d\x4a\xb7\xf8\x38\x96\xb4\x90\xb7\xba\x1b\x6d\xf5\x27\x0e\x13\x01\x18\x86\x54\x80\x33\x31\xbb\x30\xb2\xa4\x85\x49\xc0\xfc\xc8\xeb\x76\xb9\x96\x4a\x0f\x28\xa5\x02\x65\x7a\x23\x66\x18\x6b\x99\x6d\x35\x55\x96\xdc\xad\xbd\x1f\xd5\x8d\x21\x90\xa4\x63\x05\x8f\xb1\x1f\x29\xca\xd1\x53\x40\x5d\xf8\x6a\xed\x3c\x69\x9c\xfa\xf4\x15\xdd\x2f\xfc\xb1\xda\x71\x03\x5c\x3e\x97\xe1\x60\x4f\x96\x37\x65\xcd\xdb\x4b\x03\x16\x22\xdc\xcd\xac\x1e\xbc\xba\xab\x07\x86\x59\x21\xd1\xe7\x08\x7d\x50\x7d\xa8\xbc\xc4\x7c\x02\xe7\xad\x98\x68\x1f\xae\x96\xf0\xad\xb5\x2e\x73\xaf\x46\xe6\x39\xba\xca\xbe\xf0\x0e\x47\xf3\xda\xcf\x43\xd3\xc9\x3c\xa4\x81\xe8\x6a\xd9\xc3\x7c\xfd\x85\xc8\x16\xf7\xf2\x4b\x9f\x89\x0c\xb6\x4c\x9e\x9d\x9f\xe5\x21\x32\xd8\x36\x19\xef\xfd\x32\x23\x91\xc1\x8e\xc9\xbd\xfb\x7b\xb9\x89\x0c\xee\x99\x22\xf7\xff\x41\x11\x22\x83\xdd\x50\x63\x55\x82\x5e\x2b\xe4\xa4\x36\xe3\x01\xba\x5a\xa3\xde\x82\xd4\x1c\xcc\xaf\x09\x4a\xb1\x42\xd0\xac\xb5\xba\xf9\xd9\x09\xd0\xb0\x58\x43\x80\xf2\x6c\x4a\x6c\x28\x73\x91\x21\x41\xb6\xf1\x50\x52\x6d\x9a\x2d\xda\xf4\xb0\x13\x94\x29\x7c\x9f\x01\xe0\x2b\x71\xf1\xb2\xf6\x0a\xe7\xdd\xef\x0d\xfc\x2c\x50\xb8\x70\x14\x7a\x51\xe8\x71\xab\x7b\xdf\xed\xee\xbd\xe4\xa8\xe5\x6c\xd4\x78\x9f\x20\x09\xb5\xad\xa1\x36\xe4\xb9\x98\x6b\xa6\xba\xeb\x4a\xe3\x24\x06\xd9\x26\x79\x11\xb0\xf6\x87\xed\x46\x74\xd1\x8a\x11\x1d\x9f\xa2\x44\xa3\x3d\x8e\xd6\xad\x11\x0e\xa5\x2c\x43\x91\x51\x54\x2e\x5d\xa2\x04\x21\xe9\xf4\x31\x28\x02\xa4\x34\x56\x53\x0e\x10\x54\x54\x8c\x55\x55\x06\x9a\xc6\x64\x4e\xad\xba\x72\xff\x6f\x8e\x22\x2d\x0e\x9b\xbb\xee\x59\x86\xe6\x6a\xaf\xbb\xee\xce\xd6\x0e\xa5\xf3\x60\x10\x2a\x34\x2a\xd8\x09\x2b\x89\xee\x40\x25\x3f\x0c\xfd\x38\x60\x65\xe6\xb0\x5c\xfa\x98\xcc\xd5\xde\xf5\x06\xb4\x72\xdf\x00\x35\x46\xd8\x8f\x83\x3c\x44\xd8\x8b\x61\x86\x50\x2d\xb9\x58\x3a\xac\xac\x3e\xac\x6a\x4b\x05\x7d\x98\xa9\x18\x1a\x65\x55\x95\xeb\x6a\x5b\x55\xba\x53\x1b\xb3\x24\x4a\x25\x4a\xb1\xa1\x12\x2d\xe8\xdd\x07\x00\x25\x03\x6e\xba\x58\x1a\x5c\x78\x29\xf0\x22\xc5\x10\x67\x14\xbe\x6a\x0d\x1e\xf5\xb1\xb6\x5c\xcc\x16\xf6\xdd\xf2\xc4\xa0\x0c\x20\xc4\x25\xc0\x11\x26\x33\xa3\x30\x3a\xd8\x7a\xe0\x4a\x72\x02\x76\xef\x53\xb0\x7b\x1f\xd3\xad\x1d\x57\x92\x33\x7a\x6f\xa0\xa2\xe7\x74\xea\x73\x0f\x00\xd5\x70\x69\xec\x6b\x1c\xd5\xb0\xff\xa8\x9e\x01\xb3\xcf\x0e\x68\x8a\x8e\x30\x39\xa6\x47\xc3\x63\xb5\x8f\x0e\x82\xe3\xb0\xce\x15\x1c\xc3\x1c\x8d\x61\x3f\x3c\xa5\x32\x43\x1c\x93\x0b\xfa\x55\xa2\x03\xf2\x14\x36\x90\xa2\x3b\x0f\xe8\x53\x8e\x0e\xa0\xef\x63\x8c\xd5\x4d\x8c\x0e\xe8\x85\x4a\x52\x43\x51\x49\x47\x3d\x7a\x41\xc6\xae\x7b\xb4\x57\x0e\xea\x92\x72\xa1\xeb\x30\x14\x9c\x9e\x81\x27\x9c\xf0\x0d\xeb\xad\x52\x22\xc8\x01\xb9\xd4\xd3\xd1\x3b\xd2\x00\xe2\x31\x3d\xf1\x85\x07\xf3\xf9\x85\x4e\xfd\xc7\x8a\xd8\xab\x48\xfc\x23\x7a\x50\xe1\x9a\xfe\x01\xbd\xcc\xd0\x81\x42\x8a\xce\x5c\xf7\x68\x7f\xe0\xba\x07\xf5\xb9\x21\x13\xd7\x9d\xef\x1d\xa9\xce\x96\x25\xe8\x5c\x9b\x23\xb8\xae\xfa\x0f\x5e\xa5\x74\xd0\x66\x1b\x28\xb4\xeb\x0b\x3d\x2f\x8a\x37\x1c\x7d\xc1\x98\x7c\x29\x17\xff\x31\x39\x68\x28\x14\xfc\x0c\x5b\x68\x95\x78\x5a\x1f\xc6\x77\x39\x99\x00\x17\x13\xdc\x38\x99\xd0\x6a\x0c\x8a\xe8\xbb\x5d\x34\x54\x0b\x7e\x85\xe5\x65\xa5\x38\xcb\x68\x2a\x54\x0e\x12\xb4\x2f\x85\xd2\x2d\x43\x46\x05\x26\x29\xf8\x4f\x00\x2d\x04\x3b\x63\x3a\x5c\xe1\x1e\x8a\xa2\x58\x49\x4b\x7d\x24\x68\xca\x91\xaa\x48\xfd\xa6\x18\x7b\x48\x50\x51\xa6\x08\x48\x51\x64\x1c\xf4\xad\xe6\x71\x5a\x12\xf2\x9f\x80\xcc\xbb\xc4\xd0\x36\xf2\x59\xab\xd9\x83\x61\x8a\x41\xc4\x5a\x85\xe3\xc7\x9a\xd3\x2f\xf0\x42\xff\xd5\x22\xf6\x06\x81\x80\xa4\xe6\x68\xfb\xce\x9a\xe3\xa5\x20\xd6\xb4\x05\xf7\x35\x6b\x47\xf8\xcf\x52\xe0\xaf\x79\xb2\x94\x9d\x43\x3c\x97\x88\x6d\x26\x42\xab\x9c\x9a\x31\xa8\xa8\x42\x76\x22\xa1\xd6\xb3\x4f\x98\x85\xf2\xa4\x95\xc7\x79\x5b\x29\xe8\xe3\x9d\x77\x5d\xad\x98\x9c\xb9\xae\xe1\x0c\x57\xf7\x40\x06\x88\xb2\xce\x07\x1c\xb0\x8c\x72\x85\x1a\xcf\xcb\x7b\x4f\x8d\x0c\x09\x2a\x89\xa4\x7d\xec\x09\x95\xbe\xaa\x06\xb9\x4a\xf2\x4d\x04\xca\x25\x42\xb2\xc7\xf0\x26\x12\x45\x31\xc0\x58\x11\x75\x91\x42\x5b\xf1\x30\x51\xb0\x25\x0a\xb8\x9f\x28\x9c\x36\xa4\x8c\xb0\x2e\xad\x05\x30\x0b\xdd\x1f\x0a\x7b\xcc\x97\x7b\x02\x9e\x91\xf0\xe6\x11\xca\xc0\x69\x84\x25\x82\xbe\x6b\xd4\x15\xf3\x68\x79\x0f\xb6\xf9\xe3\x10\x40\xd1\x9d\x94\x23\x3e\x51\x23\xc4\x84\xe9\xd7\x78\x2c\x49\x31\x6f\x2a\xd7\x34\xa1\xf2\x03\x57\x0e\x65\x41\x27\x7e\xec\xed\xee\x90\x1d\x17\x49\x97\xfe\x7f\x68\xe2\xef\xee\x78\x31\xc6\xaa\x01\x97\xf6\x76\x70\xa9\x88\x1f\x80\x66\x08\x99\xf8\x89\xc7\xc9\xc4\x8f\xe0\xbf\x22\x4c\xd4\xff\xb2\xe6\x90\x4c\xa9\xa8\x6c\xd8\x4f\xaa\xcd\x71\xa6\xb5\x91\xbe\x64\x68\x4a\x4e\x30\x99\xda\x00\x92\xa6\xe4\x54\xa5\x37\xad\x1c\x5e\x5b\x9c\x9f\xa7\xcc\xb2\x04\xb6\xb5\x11\x34\x83\x45\x8d\x9e\x81\xe4\xcd\xd8\x9d\xf7\xbd\x13\x81\x66\xb0\xea\x5b\x0f\x41\x86\x0c\x4e\x40\xcd\x41\xd2\x5c\xb5\xae\xc3\x1c\x6c\xfc\x77\xb2\xca\x1f\x60\x17\x21\x9d\x43\x7b\x9f\x52\xb9\xba\xa8\x9b\x06\x83\xb0\x2b\x30\x5e\x29\x85\x9b\x79\x7a\xa2\x66\x62\x03\xd3\x0c\xe0\xfd\x33\x4e\x9f\x0a\xd7\x1d\x6c\x2a\xfc\x83\x5d\xad\x3d\x15\x28\x20\xbd\x7e\x88\x71\x30\x08\x15\x92\xd1\x72\x94\xcb\x7c\x0c\x2f\xbc\xcc\x92\x58\xbe\xfd\x39\x65\x02\x7a\xf5\x96\xd1\xf4\xb1\x2f\x80\x3e\x11\x94\x7e\x69\xb1\x97\xf9\x97\x6e\x5b\x03\x66\x1c\xd6\x22\x79\x87\x23\x94\x3b\x94\x42\x02\x49\x58\x20\xc3\x70\x81\xd5\x81\x01\xa5\x75\x6b\xbb\xfe\x65\xb6\x6b\xa2\xb7\x13\xa9\x94\xb5\xb6\xb4\x93\x9c\xce\x89\x4d\x45\xff\xc4\xbb\x82\x66\xb3\x24\x7e\x52\xa9\x45\xa8\xe2\xd3\x72\x4f\x3f\xbc\x4f\x12\x9a\x2b\xa0\x31\xd3\x8a\x61\xfe\xcc\x9b\xc0\x8e\x99\x61\xcd\xc7\x99\x40\xea\xc4\x9b\x45\x68\x82\xc9\xb4\x47\x73\x3f\xaf\x35\x2c\x76\x77\x5c\x69\x8c\x4e\x12\x72\x46\xf3\x21\x54\xb7\xd0\x72\xbd\x13\x9f\x7b\x7f\x83\x46\xf5\x91\x3e\x34\x7a\x3c\x63\x72\xa6\xc7\x04\x08\xc9\xb9\xeb\xae\xea\x1a\x09\xca\x14\x75\x91\x52\x20\x32\x38\x15\x45\xaa\x55\x47\xf9\xde\x60\x7b\x50\x14\x68\xb0\xf5\x80\xd2\xd4\x75\x1f\x50\xaa\x00\x54\x19\xdb\xba\xb7\x4b\xa9\x70\x5d\x16\xdc\x37\x78\xe8\x1e\x95\xc1\x83\xb0\x28\xb6\x1f\xec\x40\x16\xb9\xfc\x49\xd7\x81\x2d\xf5\x84\x81\x9b\x82\xdf\xdf\xad\x90\x02\x79\xc3\x0b\x3a\x70\xd5\x59\x2a\x21\x80\x42\x05\xb7\xa1\xef\x59\x2d\x0c\xdc\x0e\x87\xea\x1f\x4d\xfc\xa7\x1c\x25\x24\xd3\x04\x97\x97\x11\x16\xec\xa8\x54\x2e\x90\xfa\x4e\x22\xec\xa9\x2f\x0b\xa4\x6a\xb9\x17\x6a\x0f\xc3\xf7\x42\x8a\x54\x25\xf7\x42\xec\x5f\x98\xe2\xbb\x65\xf1\xdd\xaa\xf8\xbd\xb2\xf8\x6e\x88\x09\x94\xbf\x5f\x96\xbf\x1f\xd2\x0c\x13\x85\x5b\xea\x9e\x3f\x08\x8d\xe0\x37\x78\x10\xfa\x6a\x94\x0a\x0e\xa8\x08\x51\x11\x8c\x89\xf9\xfc\x30\x84\x02\x0f\xd5\x50\x1f\x86\x98\x28\x54\x9a\x4a\xa3\xc3\x4a\xf9\x02\x1d\x91\x73\x4c\x18\x3d\x02\x92\x8f\x1e\xc1\xf3\x67\xf4\x48\xcd\x4b\x42\x8f\xd4\x88\x72\x7a\xa4\x48\xbf\x0e\x9a\xd0\x23\x55\x11\xfc\x53\x9b\xe6\xc4\x92\x3a\xab\x5d\xa5\x3e\xf4\xa6\xa4\xaf\xc0\x90\xc2\x79\x5d\x80\xb3\xbd\xad\x7b\x98\x48\xd7\x1d\x74\xa8\xc4\x07\xf4\x01\xd8\xda\x0c\x76\xdb\x1e\x0b\xd2\x93\xdf\x8e\x1b\x27\x16\x6e\x1c\xad\xe2\xc6\xb1\x36\xe3\xca\x69\x44\xe6\x0a\xf7\x4d\xf0\x30\x57\xf7\x98\xa2\x37\x2c\x1c\x39\x0f\x4b\x1f\x52\xd1\xde\xb6\xeb\xc6\x41\x3f\xec\x50\x45\xee\xc4\x41\xd4\x03\xf5\xea\xb9\x1f\x84\x1e\x17\x8a\x84\x31\x7d\x40\x51\x8f\x1a\x1b\x2c\xbc\x27\xfc\x1a\xfd\x4d\x1a\xe8\x2f\x27\x31\x99\x11\x4e\x38\x11\xbd\x08\x7b\xc7\x12\xfd\x12\x41\x4d\xfc\xcc\xd3\x56\xb4\xa0\x70\x88\xb4\x12\xb5\x27\x41\x21\x66\x7b\xbb\xa3\xa6\xca\x0c\xd1\x7f\xc2\xab\xfb\xe6\x68\xc5\x8a\xa7\x32\x1b\x55\x84\x47\x72\xc7\x1c\xca\xc6\x1c\x02\xb7\x77\x65\x22\x4b\xae\x2f\xaf\xb9\xbe\x29\x9a\x77\x63\x05\x2a\x7e\x39\x1c\xe9\x27\x1e\x33\x0c\xdf\x99\x9a\x79\x5e\xb1\x7b\x63\xcd\xa6\xce\xbb\x5d\x7b\x3d\xba\xdd\xa8\xba\xef\x8e\x25\x9a\x90\xcc\x90\x0b\x95\x42\xa7\x20\x89\xd6\xe4\x5c\xd3\x06\x05\x6d\x9b\x26\x85\x61\xf3\x9f\x0c\xbb\x5c\xca\xdf\x18\x02\xf7\x18\x2e\x27\x3a\x35\x9d\xa9\x3a\x5c\x75\xaa\x6a\xe5\x34\x43\xe8\xdc\xff\x9c\x7a\x5f\x32\x8c\x0e\xc8\x11\x5e\xba\xde\x7f\xac\x8a\x63\xc1\x10\xb4\x28\x9e\x27\x88\x91\xf7\x2c\x10\xea\x90\x57\x9e\xf4\x14\x4e\xeb\x4b\xcf\x52\x02\xf8\xd4\xb4\xdf\xba\xad\x79\x2a\x0a\xd3\x00\x4f\xa6\xae\x8b\x6a\xf3\x10\x52\xaa\x2b\x73\xf2\x89\x93\xa4\x61\xce\xd0\x70\xd9\xf6\xd9\xbe\x60\x25\xe8\x1f\x70\xbb\xdd\x25\xbb\xb1\x86\x1d\x0d\xab\xb7\x8b\xed\x7e\x27\xee\xd0\xdc\x75\x3b\x28\x72\xdd\x7c\x3f\x5e\xb2\x79\x9a\xd7\x46\x30\xb3\x86\x11\xcc\xdc\x75\x2b\x1b\xb6\x39\x28\x1f\xcc\x8c\x11\xcc\x44\xed\xc6\x13\xda\xe9\x03\x31\x2d\x4a\xfb\x49\xc3\x73\x6e\x35\x8e\xe9\x76\x27\x7b\x71\x65\x29\xc9\x82\x09\x58\x4a\x06\x13\xcb\x16\xe6\x1c\x6c\x61\xce\xc8\x98\x4c\x6a\x5b\x18\x75\x6b\x4d\x2c\x5b\x98\xf3\x8a\x9a\x3a\xaf\x44\xff\xc3\x93\xda\x00\x46\xdd\xb2\x5a\xfb\xed\x66\x55\x16\xad\x92\xc1\xfc\x12\xd6\x66\xac\x95\xd9\x33\x34\x26\xac\x34\xa7\xa9\xae\xa3\xd2\x9c\x52\xe2\x05\xc6\xb7\x56\xf5\x0b\xa3\x28\x31\xee\x50\x7a\xe6\xba\x9d\x0c\x7a\x58\x96\x6e\xe4\x34\x1c\xaf\x3b\x4c\x58\x2c\x8b\xc8\x97\xf6\x92\x1b\xe5\x41\x4e\x5e\x67\x2b\xca\x83\x5f\xed\x9c\x60\x06\x7d\x1a\x91\xc4\x96\xdb\x3f\x5a\xc9\x71\x18\x91\x28\xd3\x74\xff\xdf\xbc\xa9\x0c\x67\xab\xc2\x95\xde\x14\x1a\xc8\x1e\xcb\x96\xbd\xc8\xa7\xd1\x85\xea\x12\x11\xf4\x8b\x08\xa4\x42\x15\xcc\x09\xf9\x22\x88\xc4\xbe\xa8\xf1\x9d\xd4\x52\x00\x05\x3f\x57\x19\xe5\xa0\x04\x50\xdb\xdb\x64\x45\x91\xd5\x56\x37\x6b\x1c\xaa\x5f\xac\xca\x83\x64\x56\xf7\xb5\x72\x49\xfc\x44\x10\xc7\x02\xf4\x0e\xf6\x9f\x08\x05\x24\xac\x34\x4b\xd3\x27\xab\x58\x58\x4f\xc4\x86\x71\x99\x5b\x14\x32\xae\x10\x4e\x0a\x9a\xb6\xb1\xff\x2a\xf5\x18\x59\x06\xc0\x3e\x43\x35\x78\xec\x87\xf5\x77\xb0\x94\xb0\x75\x83\xb2\xa6\x3e\xfa\xb2\x5b\x9e\x55\x1c\xd8\xe0\x90\xc3\x15\xea\xab\x28\x2c\xa5\xa4\xa2\x70\x72\xfd\x7e\xb3\x8e\x9c\x66\x59\xc2\x22\x10\xe5\xf8\x96\x1a\x66\x87\x52\x63\x34\x43\x99\x42\x8f\x7d\x11\xac\x12\x74\xbe\x49\xf2\x9c\xf3\x28\x3f\x77\x42\x4f\x6c\x5c\x44\x96\x64\x92\x2f\xad\xfc\x29\x90\x38\x35\x77\xd5\x52\xef\x4d\x41\xbd\x97\x70\x50\xec\x19\x82\x58\x2f\x48\x09\x27\x07\x19\xe2\x38\x6c\x59\xcd\xac\x31\x45\xad\xd8\xfb\xd2\xe3\x79\xda\xe2\xb2\xfc\x76\x98\x22\x81\x7d\xe1\x69\x74\x37\xc9\xe8\x44\xb6\xd2\x2f\x65\x15\x41\xe8\x19\x43\x2e\xf2\x45\xa2\x09\x40\xba\x16\x1e\xc8\x33\xdb\xd8\x1d\xe3\x85\x37\x89\x49\xb4\x52\x79\x3d\x23\x41\x38\x64\x43\x7c\xa8\x80\x0c\xf8\x5b\x54\xd8\xda\x7a\xc3\xc9\x09\x54\x11\x67\xf4\xd8\xd2\x9a\xc8\xb3\x3b\xb4\xcd\x5b\xb4\x71\x33\x05\x4c\x9a\x7a\xe7\xa0\x7f\x5b\x6a\xe0\x77\x90\x7e\xc3\x53\xfb\x50\x00\x45\xf4\x52\xa2\x34\x64\x94\x05\x49\x35\xf5\x59\x51\x74\xbb\x69\x87\x72\x3f\xf3\x3a\x1d\xd4\xf6\x2c\x27\x76\xdd\x97\x09\xe2\xd8\x75\x4f\x32\x94\x80\x4f\x0c\xad\xbd\x06\xc6\x22\x0d\x95\xd4\x79\xd6\xa6\x66\x52\x93\x42\xb6\xa6\x42\x51\x80\xb5\x95\x7f\xbb\xf0\xae\x05\x82\xd9\xb1\x6a\x9a\x65\xcb\x66\x15\x65\x6b\x45\xd1\xe9\xa0\xbf\x18\x3c\xd7\xcc\x82\xbf\x98\xed\x20\xf9\xa4\xb1\x79\x96\xce\x4e\xa7\x63\x3d\x2c\x31\xf7\x00\xca\xd7\x47\x48\xd4\x47\x08\x4c\xb7\xc6\xd5\xab\x1d\xd8\x75\xd9\x7e\x6f\xe0\xba\xec\x7f\x06\x94\xf6\x41\x2b\xa1\x6e\x72\x9a\x59\xbe\xf5\x3a\x5f\x2d\x79\xa4\x79\x79\xbb\x3a\x57\x75\x3f\xea\x66\x53\x1f\x44\x98\x30\xb5\xb2\xd6\xdb\xf6\xea\x53\x99\x96\xce\x13\x54\xa6\xe7\x09\x02\xc0\x6a\xf3\xa9\x4a\x9d\x9c\xdb\x25\x95\x42\xf3\x3a\xf9\xca\x2c\xa0\x9a\x63\x25\x5c\xb7\x31\xe6\x0a\x6c\x40\xac\xda\x3e\x1d\xad\x8e\x58\x14\x5f\xcd\x94\x14\x45\xe7\x65\x1d\xd6\x19\xa5\xeb\x1a\xef\x17\x36\x2e\x05\xcc\x15\xe3\xe1\x35\xd3\x70\xe2\x89\x1a\xc4\x1d\x62\x14\x51\x14\xa5\x07\xe2\x6f\x0d\x5f\x73\xd5\xa8\x80\xa9\x52\x0b\x82\x3b\xfd\x72\x96\xff\xe6\xb5\xbe\x4e\xa7\x93\xba\xae\xca\x95\x06\xfd\x70\x81\x8e\x84\xeb\xc6\xda\x28\xfd\x48\xf3\x38\xac\xf7\xb2\xd1\x00\x63\xdc\xa1\xaf\x8a\xe2\xa0\xce\x76\x20\x70\x87\x1e\x17\xc5\xb1\x4e\x3a\x16\x1b\x82\xe5\x59\x72\xc9\x90\xca\x7b\x59\x14\x4f\xeb\xbc\x4f\x55\xde\x2f\x45\x71\x51\x27\x5d\xa8\xa4\x53\xb5\xc1\xe2\xac\xc5\x09\x12\xb8\x3d\x50\xf0\x92\xd2\x0b\xbf\x71\x26\x4a\x51\xed\x75\x86\x04\xa8\x7a\x02\xfa\x53\x4a\x3e\xd3\x52\xe4\xf9\x4e\x18\xc1\xdf\xab\xd2\x6c\xbc\x4a\x38\xd6\x09\xa7\x55\xc2\x65\x69\xb7\x5f\x25\x7c\x29\x5d\xad\x56\x09\xa7\x96\x30\x5e\xbb\xef\xcc\xe8\x29\xf3\x3f\x27\xde\x89\x75\xd7\x1f\xd9\xab\xe8\xba\x4d\xcf\xaf\x16\x8a\xdc\x66\xee\x0b\xef\x45\x54\x2b\x59\x14\xef\xed\xdd\x7b\x60\x1f\x73\xed\xcb\x58\x5b\x26\x58\xea\x4a\xd9\x1d\xec\xf6\x25\x2f\x23\xc2\x75\xc1\x77\x5d\x69\x11\xd3\x01\x84\xdd\x6c\xc9\xe6\x63\x44\x4f\xab\x43\x5b\xf1\xb8\x27\x02\x69\xae\x33\xab\x7c\xcb\x79\x92\xf4\xad\xdb\xc0\x96\xf1\xd7\x92\xae\x9a\x3d\x6b\xc8\xaf\x9e\xb4\x18\xb3\xa5\x85\x44\x14\x64\x8a\xb0\x92\xdd\x2c\x1c\xaa\x12\xc3\xda\x1a\x27\x45\xb2\x3b\xd0\x19\xa5\xa2\x7d\x21\x63\x56\x51\x58\x31\xb8\x97\x56\x74\xb2\x7e\x73\xdd\xd0\x9d\xb5\x9a\x50\xb6\xa4\x4a\x59\x32\x52\xb6\x7c\xe6\x81\xee\xe8\x57\x6d\x13\xd2\x6b\x18\xbf\x5c\x66\x2b\x56\x3a\xb5\x68\xf4\x44\x54\x62\x76\x22\x30\xc9\x28\xb8\x27\xb7\x70\x36\x6d\xe3\x34\x04\xd3\x2c\xb8\x13\x04\xf6\xb3\x20\x09\x3d\xde\x62\x92\xf3\xb8\x06\x50\x68\xc9\x44\x16\x70\x95\x96\x6b\x22\x90\x8a\xbe\x6a\x20\x2e\xb5\x2a\x9f\xba\xf3\x55\x27\xbe\x64\xf4\x30\x43\x9f\x53\x4c\xde\x65\x34\x6a\x28\x0a\x5a\xf3\xd1\x78\xb9\x44\xdf\xdf\xe4\x3d\x94\x7c\x91\x5a\xfe\x91\x4e\xb3\x25\xaf\x41\xb5\x76\xb5\x42\xba\x97\xbd\x2f\x37\xa5\xc9\x5a\xcf\xbc\xe9\xf2\xba\xb4\x73\x2a\x17\x45\x4d\x14\x12\xfb\x03\xdf\x71\xd7\x1c\xcf\x71\x70\x17\x8c\xc4\x24\x95\x5a\x0c\x21\xf6\xb7\x7c\x87\xa8\x4f\x6b\x0e\x26\xac\x52\x9a\x48\x19\x71\x6e\x47\xe9\xe6\x9f\x6b\x41\xe9\x9e\x61\xed\x8a\xcb\xf3\x35\xa7\x2b\xbb\x4e\xb8\xf6\xe7\xe6\x28\x75\xf0\x02\xa5\xed\x6a\xb5\x17\x8a\x3a\x5f\x15\xd5\x38\xe3\x0d\xa7\x2b\x82\x7e\x38\x94\xae\xd0\x42\x62\x78\x4a\x3d\x05\xe7\xba\x40\xda\xa4\x78\x01\x4e\x31\x32\x21\x11\x5e\xa0\x55\x10\x66\x9e\xa0\xe2\x16\x4a\xe3\xcb\x60\x10\x96\xdc\xe7\x0c\xde\x02\x58\xa0\x14\x83\x3b\x1a\x4b\x79\xc5\x82\x24\x7d\x22\x68\x7f\x05\xf7\x35\xdd\x9c\x0a\xa4\xf6\xde\x60\xb7\x87\xd2\x9e\xc0\x5a\xa6\x96\x92\x6c\xbf\x0f\x7b\xa9\xdb\x95\xfb\xf4\x41\xbf\x5f\x39\x1f\xb7\x30\x70\x4d\x88\xc9\xba\xf2\xda\x75\xad\xcd\x16\xa8\xf5\x59\xb2\x25\x0d\xb5\xb4\xa1\x4b\x5d\x9e\x57\x23\x97\x4a\x3d\x09\x7a\x6a\xb2\x3a\x0d\xaf\x53\x24\x08\x38\x75\x57\xa8\xd5\x50\xfd\xd3\xb6\x08\xfa\xa1\xb2\xda\xd2\xb1\x14\x84\x4a\xa2\xed\x8f\xde\x64\xe4\x26\x23\xdf\x33\x8a\xde\x64\xf4\x4d\xd2\x32\xcf\xb5\x91\xf7\xce\x2e\x58\x8f\xc6\xe7\x91\x78\x9c\x4d\x18\xa8\xf0\x54\x16\xe6\x4e\x63\xd7\x3c\x6a\x5a\x45\x6a\x7f\x66\xe5\xc2\xfa\xbc\xca\x16\x33\xe2\xac\x0f\x1c\xec\x89\xa2\x00\x63\x48\xb9\x68\x13\xdb\xdd\xeb\xf7\x29\xa5\x37\x59\xe9\x1a\xe5\x26\x33\x8f\x63\x10\xb6\xc0\xe4\x26\xa3\x6f\xb2\x8d\x38\x8a\xcf\x19\x79\x93\xd9\x0f\xa4\x67\x77\xda\x41\x14\x45\xc3\xc0\x81\xfd\x73\x8b\x86\x6b\x53\x79\x89\xa4\xe8\x17\x95\x0c\x0d\x50\x7b\xb9\xb2\x1e\x4c\xb2\x32\xa8\x86\x1a\x6f\x29\x95\x8d\x3a\x96\x8c\xd7\x34\xb0\xfc\x28\x4e\xb5\x94\x71\x92\xa5\x46\xa1\x58\x1a\x55\x0e\x66\xbf\xde\x42\x58\xfd\x20\x8c\xe5\xa5\xdb\x7e\xcc\x45\x01\x56\x3b\x01\x13\x69\xbd\x18\xc3\xea\x30\xa4\x57\x0f\xc7\x30\x2b\x42\xf4\x8b\x6c\xcf\x33\x6a\xcb\x65\x6d\x30\xa0\xf5\xc1\xc1\x47\xf3\x04\xcc\x90\xc9\xdb\x44\xdb\x7d\x07\xe1\x02\x93\x6f\x2d\x25\xf5\x41\xf8\x64\xcb\x6b\xde\x6a\x3c\x15\x09\xca\x31\xb9\xab\x4a\x02\x7a\x3e\x5b\xa6\xea\x8f\xff\xcd\xaa\x39\x11\xba\xda\x7a\x8f\x7d\xc8\xda\x1c\x56\x2d\x5b\x56\x75\xd2\x4a\x3f\x78\xa8\xaf\xef\x5a\x14\x07\x72\xb8\x4a\xfb\x12\x8c\xe2\xb8\xba\xcc\xd3\x2e\x27\x7d\x8c\x09\xbc\x62\x2f\x14\x6e\xbe\x8d\x09\xb7\xe0\xd8\xfa\xbf\x6a\x5a\x03\x13\x23\x01\xab\x14\x01\xb4\x34\x30\xa3\x62\xaf\xef\x43\xe3\x19\xe9\x63\xef\x44\xa0\x8c\xa4\xea\xde\x6e\x76\x23\xd3\xea\x42\x95\x30\x32\x5b\x22\x6c\x3b\x1a\x45\x2b\x79\x13\xe0\xa7\x70\x80\x1b\xd6\x00\xcf\xb2\xe5\x37\xd7\x6d\xa3\x74\x4d\x3b\xbf\x5d\x5a\x3b\x03\x91\xc0\x54\x69\xc6\x6d\xb7\xf3\x96\xbb\x08\x05\xa3\x82\x7e\xe8\x3f\x56\xd4\xb3\xde\x04\x7f\xdd\x51\xd1\xa7\x92\x1a\x58\xa9\x90\x52\xf5\x4d\x60\x5f\x52\xee\x09\xed\xdf\xb7\x22\x8d\x14\x92\xd7\x68\x46\xe8\x79\xa9\xf6\xdc\x8f\x7f\xd6\x1c\x92\xb4\x0d\x67\xf5\xa5\x57\xfa\x7e\xfc\x55\xeb\x9c\xc8\xe5\x6d\xf9\xc9\xba\xe3\x5a\xf6\x45\x75\x5f\xb2\x40\x82\x6a\xae\xb6\x45\x85\x7e\xbf\xb0\x41\xe8\x8b\x6c\xd9\x1d\x63\xad\x47\x05\x58\x75\xb9\x6a\xda\x6e\x1c\x7b\xfa\x52\x79\x99\x51\x5b\x91\xc3\x76\x5a\xbb\xd2\x17\x75\xd1\xa5\x0d\x06\x0a\x98\x6f\xdf\xe5\xde\xe0\x44\xbb\xbd\xf0\xbb\xcc\x63\x0b\xac\xd1\x83\x63\x8e\x31\x49\xed\xe1\x7f\x5d\xde\x90\xe0\xa2\xc5\x3b\xaf\x8c\xd8\xf4\x3b\xf3\x2b\xeb\x64\x4e\x21\x18\xd1\xb0\x1a\x4c\x2d\x30\xf9\xfb\x67\x8b\x6a\x81\x11\x20\xea\xa5\x02\x23\xcb\xb5\x54\xbb\x44\x21\x36\xc9\x6f\xd4\x76\xf7\xbe\x58\xad\x9b\x03\x5b\xa8\x9e\x01\x99\x18\x87\x32\xac\x28\x3a\x15\x1f\xa5\x94\x32\x87\xe5\x9d\x51\x63\x27\xf4\x8b\x6c\xa0\x98\x50\xf6\xad\x6d\x20\x08\x04\x4a\xb5\x6a\x12\x93\x4e\x7f\x81\xc9\xdb\x3b\x9c\x1b\xc0\x1e\xff\x00\x4e\x0f\x6d\x3d\x1b\x91\xd4\x9c\xee\xbb\x3b\x26\xa8\x6c\x38\x9a\x2c\x39\x26\xc2\x3b\x95\x48\xdc\xa1\xd7\x23\x09\x27\x0a\x85\x80\x95\x4d\x93\xdf\xb9\x8a\x0c\x78\xe0\x2b\x8b\x51\xe6\xcd\x39\x82\x69\x79\xab\x5f\x57\xc8\x7e\x67\xd1\x1a\x5b\xc0\xaa\xc0\x5e\xfd\xe4\x7f\xb9\xfa\x76\xb5\x7a\xe1\x49\x04\x55\xca\x04\x93\xf8\x8e\xca\xad\xc7\x6d\xe4\xfe\xa0\x3a\xf9\xb5\x32\x44\x4b\x73\xc2\x47\xcc\xc0\x1f\xec\x71\x22\xb4\xa3\x21\x7b\xa3\xe5\x49\xdd\x04\x3c\xec\x67\xa3\x19\xd5\x5b\x74\x7d\xdb\xbc\x68\x9e\x34\xe9\x45\x73\x1e\x67\x49\x13\x6c\xb4\xf5\x5c\xdf\x0f\x7d\x92\xd2\xe5\x97\xea\x88\xc5\xe7\xb0\x20\x96\xd6\xcf\x5a\x54\xbc\x27\xb9\x3f\x28\x8a\xe5\x27\xed\x6a\x36\x63\xba\x6c\x40\x78\x02\xf7\x00\x42\x29\x35\x4a\x5a\x82\x74\x45\x17\x81\x6b\x70\x8c\x71\xa3\x1a\x40\x70\xe1\x2d\x41\x6f\x9e\x28\x44\x3f\xf7\x82\x4c\x3b\xa2\x3f\x10\x67\x1e\x5f\x68\x6f\x84\xcf\x05\x4a\x97\x9e\xeb\xc3\x5a\xb5\xb5\x65\x13\x4a\xd7\xed\xd4\x40\xb7\xa4\x8e\x38\xa0\xbe\x18\xe4\x8c\xba\x24\x68\x0c\x4e\x12\xfa\xa5\x09\x78\x15\x7a\x60\xfb\x88\xf2\xbb\x5d\x45\x11\x78\x7f\x6b\x07\x38\x03\x55\xea\x24\xa1\x37\x1c\x7d\xc8\x30\x99\x42\x68\xdd\xbe\x01\xc6\x8d\xc5\xd2\x0c\x3e\xff\x42\x7a\x51\x8a\x6b\x84\xc0\xe6\xb6\xb5\xe5\xbf\x94\x5e\xdc\xcc\x0f\x7c\x9e\x5f\xf7\x56\xf5\xd5\x88\xba\x4c\x9f\xb5\x47\x5f\x72\xb4\x72\xc6\x97\xfc\x10\xb4\x1d\x1f\x92\xfc\x13\x37\x56\xf8\x36\x09\xba\x5d\x1e\xd2\xcc\x07\x08\xa3\xba\xe4\x55\x2e\x4a\xd5\x41\x5e\x60\x72\xd0\x3a\x8a\xb2\xaf\x4d\xa0\x7c\xdc\x36\x37\xa7\xd2\xfb\xbe\x3a\x37\x4f\x5b\x6b\x65\x81\xc2\x18\x07\xd5\x94\x2c\x6c\xde\x50\x09\x42\x83\x90\x04\xa1\x02\x6b\x17\x2d\x40\x70\xc5\x95\x5c\x0d\x71\x97\xed\x23\xf7\x07\xa0\x46\xc8\x48\x6d\xa3\xe0\x2b\x6a\xd0\x13\xfb\x5b\x5a\xc1\xb0\x69\x9c\x00\x30\x2f\x50\x89\x21\x26\xdf\x6a\xe4\x19\x93\x00\xd6\xeb\x32\xa1\x89\xcd\x22\xb1\xf9\x23\xe6\xfd\x57\x64\x5b\x51\x3e\x4e\x56\x58\x64\xc2\xe7\x9e\x24\xa0\x06\x35\xd8\x7a\x00\x5a\x13\xea\x0f\x38\x82\xe6\x96\xa8\x74\x4b\x6c\x1e\xf0\x97\xc4\xf6\x0a\xd1\xce\xf7\x95\x77\xbd\x41\xc3\x14\x76\xcc\xf0\xea\x5c\xf7\x7a\x6c\x1f\x9c\x58\x50\x69\x2b\x88\xd7\x04\x3e\x26\x6c\x8f\x0e\xcc\x6d\x20\xb4\xb6\xdb\xbb\x3b\x37\x6e\x4a\x81\xb9\x5c\xf1\xe0\xcb\xdd\xcc\x05\x12\x44\x66\xe8\x5d\x82\xf1\x30\x2d\x68\x6c\xa8\x79\x98\x88\xf2\x0d\x20\x35\xc5\xef\x7f\x52\xf3\xf6\xcf\x6a\x7e\xdf\x52\xb3\x84\x77\x8f\x74\xcd\x16\x97\x2a\x69\x54\x6b\x2b\xb3\xd3\x3e\x01\xb7\x5e\x27\xea\x1f\xf8\xa1\xfc\xdd\xb7\x7e\x6a\x60\x53\x6b\xea\xa5\x24\xa3\x49\xed\x73\x2d\xa1\x9c\xcc\xc0\xfd\x84\x61\xa4\x64\x0d\xf3\xe6\x33\x0b\x62\xce\x28\x23\x39\x7d\x97\xa1\x23\x85\xa6\x4c\xfc\x31\x62\xd8\xb3\x4c\x8b\xcf\xcd\xd5\x22\x28\xeb\xcd\x87\xb5\x0e\x01\xe5\x45\x21\xf6\xa9\x2c\x0a\x78\xe7\xe3\xc4\x75\x59\x6f\xb6\x4f\x2d\x2b\xe7\xa3\x4a\x4c\x7b\x99\x20\x2d\xf0\xb7\x50\xa4\x03\x75\xfd\x95\x2d\x2f\x5f\x63\x82\xca\x1e\x62\xbd\x4a\x3f\x68\xed\xc4\x3f\x51\xb3\x1f\xa9\xd4\x19\xc6\x1e\xbc\x02\x67\xf3\xa5\x6d\x44\x84\x72\x32\x75\xdd\x54\x0f\x05\xe9\xe9\x88\x6d\x0e\x75\xa3\x5f\x44\xd0\xf3\xd2\x25\x42\x6a\x31\x8a\x13\xb8\x33\xc9\x9c\x1a\xd5\xd0\xdc\x56\xf8\x3e\x2b\x9f\x22\xaa\x3c\x8b\x9e\x71\x94\x63\x6b\x22\xc7\xd6\x2b\x42\xb5\x79\x62\xf9\x15\x93\x6a\xef\x94\x6a\xb7\x45\xd1\x27\x5f\x4b\xb2\x7a\x42\x3b\x1d\xb5\xf7\xa2\x09\x4f\xcf\x48\x44\xd1\x09\x75\x2e\xa2\xeb\x4f\x11\x97\x0e\x08\x96\x14\xcd\x79\x12\x21\xb1\x51\xa6\x42\x69\x89\xbd\x88\x4c\xa9\x23\x45\xc4\x13\x9e\x9e\x41\x56\x5f\xd5\x64\x52\xbc\x29\x26\xc7\x1b\xb1\xba\xae\x13\xfb\xad\x88\x5c\xd3\xb5\x7a\x04\x33\xf0\xf0\x3e\xa7\x5a\x07\x91\x1c\x6f\x4c\x93\xc6\xbb\x16\xd6\x2c\x53\xca\xfd\xd8\x3b\x40\x6a\x12\xf1\x82\x1c\xc3\x79\x3d\xbc\x1b\x99\xcc\x34\x0e\x0e\x18\xd8\xab\xd6\xc3\x67\x67\xac\xa6\xa5\x89\x41\xbd\xa9\x71\xe2\xb6\xd3\x62\x49\xb7\x7e\x0b\x68\x2d\x89\xad\xcd\xf9\xaf\xb7\x01\xa7\xd2\x6f\xc0\xab\x14\x7b\xf0\x90\x6c\x46\x85\x66\xa3\x81\x12\x23\xbc\x42\xc1\xab\xbd\x9d\x81\x06\x06\xd7\xf5\x27\xd5\x29\x2c\x2b\xa8\x5f\x1e\x81\x0a\x68\x56\xbe\x84\x96\xe0\xa2\xc8\x48\xb2\x58\xfe\x9e\xb2\x2b\xf4\x26\xd9\x78\xac\x22\x45\xb1\x2e\x1a\xef\x1a\xdc\x18\xda\xe5\x9f\x3c\x14\xb6\x34\xe0\xdf\xb7\xdb\xeb\xb0\xda\x7c\x07\x37\xcd\xf7\xec\x4f\xa4\xc5\x88\x6f\xe5\x7b\x9b\x29\x5f\x7b\x26\x7d\x67\x2e\xaa\x2c\xd6\x6c\x4a\xbc\x58\x98\xb9\xa1\xeb\x02\x26\xfc\x7b\x42\xa7\xed\x14\x35\x92\xb4\xe1\x31\x73\x3d\xd1\xe6\x86\xe0\x20\x50\xb5\x56\x59\x4d\x28\xea\xc9\x5c\xc9\x55\x22\x5e\xba\xf6\xed\x2d\xbc\x6a\x53\x7a\x22\x50\x5a\x8b\x65\x8c\x43\xa6\x34\xe0\xe1\xb2\x1d\x94\x4a\xc3\x96\x8e\x5e\x29\x37\x4a\xc1\xee\x82\x3c\x69\x39\x52\x7a\x38\x5c\x20\xa9\x6e\xa4\x27\x49\x6d\x3a\x01\xd7\x5c\xac\xee\x79\x8d\x75\x5d\xff\xb2\xf4\xf5\x72\xe9\xdd\x9d\xba\xf8\x55\xb2\xca\x9d\xb0\xf3\x6e\xdd\xdb\x35\x78\x45\xe3\x9c\x3e\x6f\x92\x2d\xa5\x4b\xf8\xda\xe1\x3b\x00\x8b\x6f\x09\xfd\xc0\xd1\xd3\x14\x93\x8f\x10\x6a\x6d\x86\xed\x53\xb9\xc0\xe4\x43\x42\xdf\xa5\x68\x15\x0e\x55\x3b\x77\x81\x30\xf6\xdf\xa5\x6d\xef\x28\x94\x5e\xe7\x2d\xe7\xda\xea\x97\x31\x07\xbb\x6e\xe7\xd9\x6a\xea\x82\xac\x27\x34\xdd\x50\x74\x88\x88\x6e\xc8\xeb\x84\x4e\xa5\xff\x43\xa2\xa9\x6c\x7d\xa6\xa1\xe9\x1d\xff\xd0\xc2\xca\x00\x7d\x5e\xe1\xf5\xbd\x4c\x90\xa5\xab\xd1\xf9\xdc\x94\x9f\xbe\x4d\x56\xab\x7e\x56\xb1\x61\xfe\x4a\xe8\x89\x2c\x8a\x93\x98\xfc\x48\xe8\x18\x7a\x35\xfe\x9d\x5e\x9d\x59\xbd\xfa\x54\xb1\x3b\x1e\xad\x6a\x20\x94\xe2\x6e\x8b\xbb\x77\x5e\x14\xd5\xe3\x19\x4f\x8e\x5f\x3f\xbd\x8e\xd9\x4c\xd5\x13\x1a\x4d\xa6\x65\x79\x81\xf1\xf3\xde\xf6\xf2\x6b\xe9\x16\xbe\x03\xca\x90\x96\xa2\x64\xd5\xa5\xaf\xbf\xd3\xa5\xa3\xa2\x90\x94\x1e\x58\x1d\x3b\xc8\x6f\xd2\xf8\x59\x59\x9d\xe9\x99\xf9\xf8\x46\x64\xd7\x37\x90\x68\xa9\x5e\x26\x3f\x73\x17\x05\xea\x08\xb3\x66\x1f\x5f\xfe\xaa\xc4\x92\xd6\x09\x9d\x5b\xba\x7e\xc9\x9d\x3a\x62\xf5\xbe\x40\x96\x53\x64\x5b\xd0\x4a\xa9\x8d\x9d\x3f\x6a\xdd\x53\xab\xfe\x94\xb5\x92\x60\x42\xcf\x60\x93\x9c\xfd\x74\x93\xc0\x6b\x0a\x94\x1e\x5b\x9b\x84\x45\x3f\x1b\x6d\x51\x34\xb7\xd7\x53\x4b\xbf\x2f\x6a\xec\xae\xa2\x80\x2c\x1d\x7a\xb1\xbc\xa8\x5a\xc1\xaa\x22\xb2\x2a\x91\x71\xa9\x22\x22\xa8\xe5\xee\xde\x96\x43\x83\x18\x6d\x55\xa1\xa1\x8d\x23\xe3\xba\x0d\x1f\x47\xc2\x75\x8d\xb0\x49\x60\x4a\x9f\xe8\x39\x12\x11\x3d\x87\x39\x3a\xff\x9d\x83\xf4\x78\x41\xd2\x88\x1e\x41\x81\xa3\xdf\x99\xd4\x2f\xd6\xa4\x72\x7b\x52\x5b\xe4\x6c\x9d\x75\x5d\xb4\xd9\xe4\x3b\x4b\xdd\xae\x51\x41\xa5\x42\x78\xc7\xaa\xbc\xd7\x5a\x75\x11\x3d\x80\xee\x1e\xfc\xb4\xbb\x4b\x50\xa9\x23\x65\x00\xd5\x84\x0b\x12\x45\x0a\x3a\xdf\xa4\x98\xc4\xd1\xdd\x70\x7a\x4f\xc1\x69\x8b\xd7\x55\xed\x03\x8b\x7c\xe6\x53\xf4\xcc\xe6\x93\xc2\x84\xf8\x91\x50\x98\xfa\xa5\xf1\x4c\xf6\x03\x54\xc5\x7e\xb0\xea\x61\x63\xbb\xd3\x95\xd2\x1e\x81\x37\xa1\x3a\x08\x34\x59\xd9\xb5\x44\x18\x6f\x4c\xb2\x94\x0d\x71\xf9\x02\x54\xf9\xe6\x81\xe5\x1b\x02\x41\xad\x08\x1b\x29\x60\x6c\xb1\x10\x91\xd4\x06\x4e\x9e\xa4\xf4\x8b\x9f\x09\xef\x39\x3c\x35\x6b\x31\xe2\x22\x5b\x08\xe3\x1b\x53\x31\xac\x1d\x63\xaa\x0b\xae\x97\xfb\x83\xfb\x0f\xef\xef\x3e\xdc\x1e\x6c\xef\x3c\xd8\xdd\xda\x1e\xdc\xbb\xcf\xb6\x1e\x6e\xfd\x89\xd8\x5e\x5f\x3b\xd1\xf5\x98\x66\xae\xf7\xbd\x3e\x2d\x43\x96\x0e\x5d\x54\x03\x89\xb9\xd1\xd1\xfc\x1f\xcb\xbf\x30\x95\xbe\xf0\x65\x4f\x78\xd2\x2e\x36\x69\x76\x4c\xa6\x48\x53\xe0\x7d\x32\xc3\x76\xbe\x13\xb3\x20\xab\xc7\xb9\xe9\xc7\xd3\x16\xf6\x1e\x45\x47\x2a\x4d\x43\xe5\xb2\x6f\x6d\x0e\xa9\xf4\x5c\x1f\x4f\xfd\x2a\x84\xb0\xc7\x86\x8c\x82\xf2\xbc\x2f\xbb\x8e\xe3\xc9\x85\x25\x5e\xee\xac\x34\x6e\x66\xa4\xab\x8a\xfd\x25\x8d\x33\x77\x41\x27\x95\x6e\x5f\xb5\x94\x45\x31\xad\x12\xfd\x4c\x22\xe3\x30\x6a\x0b\x13\xe1\x6f\x79\x0f\xb0\x37\xab\xbf\x2f\xbb\xfc\x9b\xda\x13\x06\xee\x69\x0e\x97\x5c\x75\x8e\xa3\x16\x91\x88\x03\xe6\xad\xe5\x3d\x7c\x16\xd1\x77\xcb\x07\x81\x4f\xd1\x51\x06\x54\x8b\xf6\xa5\xd0\x78\xda\x5e\xdb\x57\x34\x9c\xd2\x4b\x5c\x43\x38\x45\xf9\xbd\x28\xd9\x60\x81\x00\x1e\xd0\x79\x4b\x13\xcd\xc7\xc3\x31\x39\x5a\xc9\xa3\xcd\x20\xec\x7c\x80\x47\x92\x83\x9f\xe5\x3c\xb5\x73\x1e\x47\x0a\xe5\x63\x29\x26\x4f\xa3\x55\xdc\xd1\xbc\xa3\x60\xe9\x5e\x58\xce\x95\xd3\xfd\x2d\x5f\xd6\x2e\x6b\xb2\x25\xde\x17\x98\xd8\xa6\x74\x80\x8d\x23\xc8\xda\xfb\x8f\xd4\xbe\x20\x0f\x23\x94\x60\xe3\xd5\x29\xaa\x9d\x01\xc5\xd5\x0b\x1c\x73\x1a\x05\x71\x48\x66\x94\x05\xf3\x70\x88\x66\x95\xa5\xc7\x8c\xbc\x57\x49\xb6\xa5\x07\x23\x73\xed\xf4\x37\x98\x87\x34\x51\x1f\x6b\x85\x27\x4c\x2e\xa2\x3b\x44\x19\x86\x6f\x4c\x3e\x71\xd0\xe3\x7a\x13\x95\xf2\x92\x1a\xba\xe9\x57\xff\x57\xe5\xc9\xdc\x3b\x6a\x0a\xe8\xc0\xa0\xdc\x17\x9e\xe5\x88\xec\x71\xb4\xa2\x1f\x0d\x77\x78\xa9\x4f\x7c\x99\xea\x2d\xf6\x25\xa2\xd7\xab\x5c\xcd\x9f\xd2\xb7\x1b\xc6\xa7\x2d\x70\xd1\xcc\xf3\x61\x60\x94\x02\x7a\x69\x0b\xf2\x35\x42\x2c\xc6\x98\xbc\xfb\x6f\x56\x6e\xbf\x2d\x06\x0e\xd9\xcd\x3b\x0a\xa0\xf1\x4d\x03\x11\x2e\x88\xc8\x30\x79\x0f\x13\xfe\xa5\xa1\xc8\x65\x9f\x34\xcd\x6d\x7e\x0b\xb7\x01\x3c\xf2\x60\xe9\x21\xb5\xe7\x23\x9d\x7e\xf3\x4e\x5b\x71\x95\xbc\x2a\x21\xd1\xd7\x90\xd1\x44\x69\x79\x26\xa2\xe5\x19\x88\xfa\x65\x89\xa3\x52\x2e\x6d\x79\x27\x4c\xf5\x6b\x1e\x4b\xee\x92\x53\xfd\x4a\x99\xb5\x17\x53\x8c\x8b\x42\x18\x8d\x2d\xfb\x5a\xd2\x0b\xfe\xaa\xe5\x88\xe2\xdb\x2b\x8b\x85\xfe\xe6\x8e\x43\x5c\xbf\x9e\xa0\x72\xdd\x44\x77\x49\x94\x6f\x17\xab\xef\xa3\xac\x09\xf3\x8e\xdd\x60\x58\xfa\x0e\x68\x11\x0d\x55\x1a\xed\x24\x2d\x0a\x54\x9f\xf9\xfd\x01\x26\x8a\x3c\x03\x30\x0a\xf6\x2a\x44\x60\x92\x6a\x5f\x92\x29\x12\xe4\x3e\xf9\xcc\xb1\xed\x27\xa4\xd6\xc2\xeb\xf5\x86\x38\xe3\x48\x41\x3c\x8b\xfe\x15\x0b\x4c\xbe\xb7\x8c\x60\x09\x1a\xdf\x2e\xda\x6d\x85\x4b\x17\xf0\xf5\x10\x2c\xc6\x12\x1c\x3c\xf0\x67\x50\x5a\x06\x58\xea\x4f\xd1\x1d\x3c\xff\xdb\x45\x09\xea\x4e\x25\xd2\xe3\x5b\x05\x18\x01\x0b\x17\x16\x79\x22\xe0\x3d\xb2\x8f\x5a\x9b\xcb\xea\xa4\xb0\xa5\x78\x44\x04\xfd\xd0\x88\x60\xaf\x23\xfa\x96\xa3\xd3\x08\x93\x2b\x08\x1d\x46\x36\x29\xdd\x76\x19\x05\xa1\xf7\x49\x82\xc9\x50\xe5\xd3\xf1\x5b\x44\x5f\xad\x6e\x9f\xaa\x57\xea\xfc\xbe\xca\xae\x98\x78\x1c\x81\xbf\x0f\xd6\x45\xc2\xff\xa8\x00\xbf\xd7\x9c\x8a\x8f\x76\x7b\x9f\x22\x6d\xe0\xde\x2c\x6c\x1d\xcc\x0f\x56\x6e\xc4\xa8\xf6\x31\xe9\xba\xb5\x76\xdb\x19\x23\x8f\x2c\xbf\x52\x9f\xb5\x43\x29\xd5\xe1\xf5\x9f\x75\x18\xba\xe7\xf4\x4a\xed\xcb\x66\xf3\x0b\x4c\x5e\xff\xba\xec\xda\x5d\x65\x9f\x45\xf4\x90\x23\xc7\x4a\x76\x30\x79\xfb\xeb\x0a\xc7\x77\x55\xf8\xd7\x6f\x77\xe6\x53\x04\x66\x68\xe4\xc7\x3f\xea\xfe\x87\xd9\xcc\x6a\xed\x93\xe9\x7e\x95\xec\x58\xab\xf7\x39\x5a\xae\x4d\xaf\x09\x41\xa5\x44\x08\xdc\xb0\xb7\x19\xd9\x3c\xaa\x30\xa6\xc5\xf2\x83\x98\xd5\xbd\xa8\xb5\x48\x5f\x2a\xb2\x2e\x08\xef\x7a\xb6\xd2\x64\x4b\xac\x6c\x26\x4d\xea\x24\xb5\xfc\x2f\x5a\xb0\x0b\x4b\xeb\x0f\xf8\x60\xc0\x56\xd2\xaa\x7f\x37\xb5\x1f\x8f\x4f\x89\x8a\xf9\x37\x19\x38\x01\x3d\x60\x2a\xb6\x58\x60\xf2\xf2\x6e\xb0\x71\xb1\x0c\xd7\x24\xd8\xdf\x60\x02\xb2\x47\x49\xde\xe9\xd7\x4f\x09\xd3\x1a\x27\x0d\xfd\x98\xa8\xdd\xe3\x59\x85\x49\x68\xfd\x98\x88\x7e\xe7\x08\x93\xbf\xe1\xb7\xf1\x98\x2b\x8b\xed\xc9\xb1\x28\x65\x3b\xfd\x55\xda\xa6\x8c\xaf\xf0\x61\xa1\x35\xc2\x4a\x77\x60\xf1\x9d\xfc\xf5\x2a\xb1\x5e\xfb\x2f\xf5\xdb\x3e\x98\xa4\xff\xb4\x68\x29\x93\xb5\xe7\x82\xc7\x4d\xb4\x47\x23\x8e\x9c\x9e\xc3\x93\x3e\x78\x58\x6a\xea\xb9\x2e\xdc\xc2\x6a\xb1\x3b\xbc\xe2\xb6\xa6\x35\x79\x59\x7a\x54\x61\x84\x69\x31\x4b\x59\x03\x54\x87\x8d\x8b\x80\x0e\x2a\x45\x22\x0e\xc8\xfd\x41\xa2\xe1\xba\x1d\xb1\x01\x51\x4c\x12\xfa\xd9\xd6\x7c\xb9\x90\x88\xb7\xa8\x4f\xc3\x7b\x15\xa0\xd8\x9b\x92\x44\xe1\x82\xb5\x71\x83\x4a\x5c\x61\x85\x37\x55\x0d\x86\xfa\xc1\xa1\xda\x08\x10\x2d\xab\x52\xa8\xe1\x8b\x65\x2d\xd1\x65\x9d\x89\x5a\x67\xd1\x56\x7b\x48\xb5\xd6\x43\x2d\x6d\x30\xba\x0f\x0a\x3b\x15\x96\x4a\x88\x24\xc2\x20\xae\x69\xc9\xfd\x66\xe0\x6e\x19\xda\x29\x7d\x71\x85\xb6\x2c\x75\xa1\xb7\x71\xcd\x38\x88\x51\xf9\x3a\x6d\x12\xd3\xe7\x1c\x9d\x4a\x4c\x22\x08\x3d\x96\x98\xc4\x10\xba\x91\x36\xf9\x6e\x6f\x4e\x78\x00\xca\xff\x20\xf5\xcb\x4f\xad\x87\xbe\x05\x67\x38\x2a\xd5\x49\x2a\x04\x67\x1e\xd3\x8f\xea\x8c\xcc\xe0\xb7\x71\x46\x26\x71\x2d\x94\xb7\x34\x1f\x4f\xea\xe4\xf2\x9d\xbf\x69\x4c\xaf\xee\xe2\x40\x74\xe5\x82\xf4\x31\x19\xc7\xf4\x35\x47\x4e\xcc\x78\xe2\x60\x72\xf6\x93\x02\x9b\x72\x41\x06\x98\x9c\xeb\x02\xd3\x24\xcb\x84\x83\xc9\xd1\x4f\x4a\xfc\xa9\x4b\x1c\xe8\x12\x22\x9b\xa7\x13\x07\x93\xe3\x9f\x94\xe8\x41\xa7\xcc\xfa\x3f\x11\x1b\xd1\x54\xb2\x65\x53\xc9\xff\xbd\x90\x9d\x4f\x51\xaf\xc7\xf6\x06\x95\x06\x5a\xbb\x90\x7d\xb1\x20\xaa\x0b\xe2\x86\x3e\x4e\x20\x94\xe7\xfc\x2c\xa5\x67\x51\x1d\x39\x4c\xe9\x79\x23\xfa\x89\xcb\x73\x7a\x64\x25\x41\xc2\x81\x4e\x90\xf4\x18\x02\xa7\x6c\x9a\x09\x46\xbf\x40\xad\xa7\x3c\x9d\xd0\x77\x55\xf0\x20\x49\xe8\xcb\xc8\xc4\x5e\xb2\x1b\xfa\x1e\xbe\xc5\x51\x2e\x81\xc5\x4e\x9b\x03\xe9\x2c\x5b\xec\x36\xf5\x2f\x2c\xcf\x75\x41\x3f\x6c\x3e\x16\xcd\x3c\x85\x8c\x41\xe5\xea\xec\xd0\x5c\x37\x74\x3e\x4f\xbf\xad\xb8\x35\x90\x14\x09\xbf\x32\x08\xf4\xc0\x5a\x00\xfb\x83\xd2\x7b\x8b\xc4\x6a\xd9\x4a\x2d\xe0\x76\x6d\xe1\x0c\x5e\x9f\xa9\x3b\x57\x53\xb3\x7d\x12\xd1\x3e\x78\xcc\xc8\x25\xca\x36\x25\xc6\xc3\x64\x2f\x1b\xe2\x38\x88\xba\xdd\x90\x82\xe3\xec\x84\x24\x5d\x5a\x13\x8a\xb1\xee\x75\x76\x31\x8b\xe2\xe6\x83\xf9\xb5\x9d\x2a\xb8\xd8\x69\x55\x0b\xed\x13\xae\xdf\x57\x90\x95\x23\xc2\x8c\xaa\x1b\x6d\x98\xb9\x2e\xe2\x41\xaa\x9a\xcd\xac\x07\xc8\x75\x63\x69\x1c\xc9\x65\x10\xc8\x56\x3c\x56\x0c\x97\xb8\x78\x75\x87\x52\xc4\x7a\x03\x45\x0e\x35\x0c\xaa\x39\x65\x1a\xbb\x97\x01\xef\x0d\x6c\x67\x14\xbc\x5a\xae\x43\x89\xb4\x6f\xdd\x4b\xae\x08\x45\x45\xfd\x97\xf2\x36\x6c\xfa\x36\x69\xb1\xc5\x6b\x19\xbc\x50\x08\xb7\x75\x34\xa4\x7f\xda\xa2\x9e\xd9\x6a\xb7\x34\x08\xef\x38\x61\x81\xd0\x4e\xe8\xc1\x85\x4b\xb8\xc0\x5e\x10\x2e\xfb\x51\xb3\x6d\x7e\xc1\xb2\x57\x56\x16\xf2\xac\x74\x3b\x79\x2c\x11\x07\xde\x87\x3a\x83\xb5\xe3\x5b\x48\x1e\x54\xc9\x8b\x45\x35\xe2\x69\x26\x2e\xf2\x36\x57\x9b\xab\x13\x71\x1a\xb5\xf8\xe1\xb0\x8d\xec\xea\xab\x1f\x55\x18\x44\xd9\x4c\x2e\xa3\x54\xd2\xaf\x91\x8e\xce\x53\xf9\xe8\x86\x4e\xf4\x41\x11\x2c\x92\x8c\xb6\xd1\x8e\xd7\xa2\x55\xcb\xf4\x11\x68\xc5\x94\x55\xcf\x85\xa8\xcf\xf2\x1a\x6b\xba\x1a\x05\x35\x99\x5a\x0f\x89\xab\xad\xec\x73\xaf\x26\xb3\xb3\x86\x27\x2f\xd6\xf0\xfc\x92\xd5\x0d\xbc\xe3\x67\xe7\xf2\xe7\xad\x0c\x76\xff\x57\xcd\x4c\xd8\x69\x36\x4f\x63\x46\x4f\x13\x1d\x9d\x46\xf3\x44\xe6\xf4\x69\x64\x47\x9f\x30\x36\xa3\x17\x26\x89\x09\x7a\x58\xe6\x4e\xa2\x1b\xfa\x4a\x87\xf9\x74\xca\x04\x53\x55\x3d\xcf\x9a\x09\x8f\x6e\xe8\xb7\xa5\x24\x00\xab\x1f\x75\xa2\xc8\x66\x77\xb8\x61\xb9\x5b\x43\x3d\xd5\x2f\x43\x28\x44\x1f\xe4\x63\x94\xfb\x03\x0f\x20\x19\xde\xeb\xfb\x7d\x4f\x61\x68\x5e\xa0\xa1\xa3\x6a\xa0\x39\x91\xff\xb0\x95\xbe\x6a\x27\xed\xb5\x35\x56\xb6\xb6\xda\xd6\xa7\x73\x9e\x2c\x6f\x2e\x73\x6c\x2d\xab\x06\x78\x2d\xc3\x58\x4f\x74\xfa\xc0\xe3\xb1\xaa\xfa\x77\xb5\x54\x55\x4c\x79\x92\xd0\x55\x16\xca\x9d\x80\xde\xec\x1a\x1f\x89\x16\xf7\x81\xc2\xe8\xfd\x91\xd2\x24\xa6\x4f\x52\x9a\xad\xbe\x93\x5c\x81\x64\xdb\x93\x3a\x12\xda\x94\xa4\x7c\xdd\x89\xf6\x44\xf9\xf6\x93\xc0\x04\xa5\x34\xd5\xac\xcd\x14\x9e\x80\x9a\x45\x28\x2d\x33\xa6\xf0\x0c\x54\x4a\xc5\x7e\xea\xf7\xbd\x49\x04\xcc\xa4\xbd\x74\x88\x59\x20\x14\x98\x97\xd6\xa3\x7b\xa6\x79\x7b\xf8\xab\xe8\x47\x49\xbe\xeb\x2b\xf4\x8b\xf4\x66\x4d\x1d\x4b\x28\x97\x44\xf2\x75\x34\x6b\x9f\xf7\x49\x8a\x4a\x75\x4d\x32\x68\x64\x87\x33\xf2\xab\x22\xf9\x52\x91\x99\x3c\x5f\xd9\x95\x86\x39\x54\x3e\x44\x31\xd0\x96\x40\xc4\xaa\x45\xd4\xb5\x48\x96\xd2\xd7\x99\x15\x5b\xea\xc6\xaf\xcc\x6f\xf2\x7a\xb6\x4c\xf9\xe5\x3e\xfd\xaa\x0a\x63\x7c\x68\xce\x44\x5d\x21\x6f\xed\x09\x28\x53\xdc\x1b\x6c\x99\x41\x64\x57\xf4\x51\x64\x82\xfa\xa0\xfe\xad\xe3\x22\xbb\x78\x13\x71\x91\xff\x63\x14\x01\x5e\x29\xa9\xd1\x03\xae\xd1\x83\x34\x50\x57\x54\x48\xd5\x8d\x54\xd1\x18\xba\x13\x65\xfd\xad\x17\x92\xc5\x87\x3a\x4f\x6b\x3e\x54\xa3\xdc\x61\xfa\x3b\x25\x0f\xeb\x92\x67\x22\x9b\xcf\x1e\xdd\xd0\x73\x00\x9e\x3c\xe5\x92\x47\xc9\xef\xad\x5b\x09\x93\x7a\x83\x6a\xa6\x79\x2a\x99\xc8\x19\x14\xa5\x6f\xb3\xe5\xa4\x47\x37\xf4\xaf\x95\x44\x80\xc0\x3f\xca\xe4\x4b\x26\x24\xfd\x12\xd5\x91\x47\x37\xf4\x9d\x89\x66\xdf\x98\x3a\x0d\x47\xba\xa7\xa5\x0b\x1a\x2a\x63\x15\xfd\xc6\x6e\x1e\xdd\xd0\x83\xa4\x0c\xe7\xf4\x34\x32\xc1\xc3\x94\x1e\x42\xe4\x22\x9a\xd1\xe3\xa4\x0c\xbd\x54\x99\xee\xe0\xd7\x36\xb8\x8a\x0a\x94\x2d\x7b\xc3\x05\x73\x51\x78\xef\xc0\xbc\xcc\xa6\x45\x43\x62\x51\xd6\xfe\x11\x2c\x0f\xff\x0b\xf5\xa7\xc4\x7e\xfb\xcd\xd4\x2f\xe3\x73\xd6\xba\x45\x9e\xa4\x4d\xc4\xa3\xcc\xfa\x46\x64\x33\x26\xe4\x4d\xfb\x71\x82\x97\x87\x85\x8d\x08\x5e\xb0\x8b\x8c\xff\x60\xf4\x8d\x9e\x2d\x26\xce\x18\x7d\x15\x55\x61\x58\xb2\x37\x65\x5c\x9e\x67\x13\x2a\xe2\x3a\x72\x3c\xa5\xa9\x8e\xf2\x6b\x9e\x52\x0e\xe1\x94\x9d\x29\x24\xe7\x06\x2a\x4c\xe5\xf9\x81\x38\x6b\xeb\xbf\x21\xb2\x1a\x8f\x37\x54\x5f\x9f\x97\xc4\xad\xee\x64\x76\xc1\x25\xbd\x89\x4c\xf0\xd1\x1d\xa3\x03\x2e\xf3\x4d\x82\x80\x43\x5c\x8e\x2f\x53\xd8\x41\x4b\xf3\x5f\x12\xb4\xa5\x1a\x80\x3c\x62\xc2\xc4\x52\xa5\x0d\x7f\x67\xb6\x83\x9c\x75\xcd\x78\xb1\xbc\xa7\x04\xa1\x17\xc8\x10\x13\x85\x70\x97\xc8\x10\xbc\xbf\x61\xec\x2a\xd5\x77\x61\x14\xd1\xe1\x85\x24\xdd\xea\x25\x13\x34\x89\x4d\xf0\x40\x9c\xe5\xf4\x7b\x62\xa2\x4f\x2f\x99\xb8\xa1\x51\xf5\xf9\x7d\x76\xc1\x68\x0c\xd1\x59\x24\xe0\xe4\x3e\x49\xac\x98\x06\x62\xd7\x75\x12\x1c\xcc\xa7\x3a\xce\xe3\x6f\xf4\x7b\x64\x82\x8f\x6e\xe8\x13\x1d\x31\x7b\x25\x8f\xed\xe8\xf1\xf4\xa7\x38\x72\x9b\xeb\xa1\x52\x2a\xa7\xc9\xdf\x99\x4a\xfe\x9c\x99\xa0\x22\x4f\x5f\xd8\xb1\x95\x99\xfe\x5d\x9b\xbe\xda\x9e\x96\x2d\xac\xfa\x60\x8f\xfe\xcb\x1a\xc1\x8c\xd6\xaa\x4d\xd2\x97\xd0\x55\x11\xa5\x67\x8c\xce\xe3\x2a\xac\xe7\x77\xa6\x13\x58\x24\xce\xe8\x55\xa2\xc3\x5f\x59\x2c\x7f\xeb\xc2\x2f\x77\xa6\xba\xf3\xf5\x0e\x10\xec\x22\xbb\x6c\x27\x07\xb4\x14\xad\xcd\x2e\xad\x12\x28\x81\x2f\xa4\x20\x24\x4b\x58\x4f\x05\x6a\x1a\x0f\x8f\x24\xa5\xcb\x29\x94\x90\x94\x30\xc0\xa5\x34\xab\x2c\xc1\x84\x1b\x99\x59\x45\xbf\x82\xd9\x23\x37\x40\x48\xb0\x7c\x79\x80\xff\x50\x21\xf6\xad\x7d\x67\xcb\xf2\xce\x2e\xeb\x06\x07\xe9\xf4\x2b\xcc\x7a\x1e\x5d\xcc\x12\xf6\x5e\xc1\xa3\x3b\x05\x2d\xed\x4c\x05\xcd\x51\x28\x67\xfc\x87\xf0\x7e\xc0\x8c\x97\x84\x53\xce\x56\xf1\xf0\xa5\x2d\xcc\xbc\x4f\x95\x20\xb0\x2c\xd2\xb2\xad\x6c\x90\xd0\xa6\xa7\x91\xfa\xa9\xc7\xc9\x6a\x9d\x24\x2d\x6b\x3d\x9f\x4f\xa7\x49\x1b\x3c\x2a\x7b\xfe\x49\x78\x2f\x53\x50\x8c\x81\xec\x09\x8f\x57\x67\xe2\xd7\x14\xc4\x2f\x51\x69\x1f\x69\x77\x13\x29\xf6\x2c\x38\xd6\x2f\x67\xb1\x7e\x8e\x4c\xa3\xcf\xa4\x7a\x88\xac\xba\xfd\xf3\x0c\xee\xeb\x8b\xc4\x44\xd8\xe4\x43\xca\xbf\xb7\xc2\x79\x0b\x8d\x90\x1c\xb1\x46\x1d\xba\xd8\x5d\xf0\x7c\xb9\x68\xc3\xb6\x19\xaa\x98\x25\xfc\xce\xa5\xfd\x0d\x7a\x42\x52\x30\xb2\x47\x66\xc4\x33\x4f\xec\xef\xef\xf7\xb1\x6f\x89\xda\x56\x3d\x36\x48\x4b\x0d\xbe\x23\x60\x2f\xbb\x2e\xb8\xd3\xe2\x3a\x2c\x15\x2d\x5f\xfa\x57\x07\x4d\x21\x78\xaa\x4c\xbb\x02\x91\xa5\xdd\xbe\xee\xbe\x60\xd1\xe4\x7f\x77\xb4\xec\xe5\xb3\x38\x6b\xed\x6e\xe9\xc1\x5d\x16\xa7\xf0\xcc\x4d\xdf\xd6\xa2\x70\xdd\x43\x89\x38\x49\x6d\xbf\x3a\xdc\xdc\xbe\x32\xe2\xc9\x6f\xf1\x8a\x6a\x5b\xee\xaf\xc6\x18\xc1\x0c\x55\x46\xdf\xee\x3c\xd3\x2d\x88\xe6\xdd\x44\x76\xa3\xc6\xff\x15\x89\xfd\x2b\x02\xdb\x22\xe7\xab\xb6\xfe\x15\x71\x3c\xb0\xe9\x63\x55\xd5\xbf\xa8\xc5\x2a\x7f\x07\xc5\x07\xce\xfa\xf4\x4d\xa6\xb6\x8a\x94\xc9\x5d\xa0\xa3\xd3\x27\xfc\x9f\x98\x44\x95\x0d\x18\x03\x9a\x94\x3a\xa5\xf5\x4c\x6d\x04\x53\x26\x78\x29\xe1\x3f\xb5\x91\xe1\x98\x94\x56\x5b\xb7\x75\x91\xd2\xce\xc6\x93\xa4\xce\x67\xb6\xde\xb9\x98\xd3\x39\x40\x19\x99\x69\x5e\x76\x1e\xe9\x98\xa6\xd2\xae\xed\xd8\x61\x4a\xaf\xaa\x78\x03\x78\x57\xb3\x64\xec\x1c\x11\x23\x4f\x32\x5c\x3e\x5a\x1b\xb0\xd0\xbb\xe4\xa8\x7a\xc3\xb1\x6c\x3b\x7b\x93\x44\x3c\x3d\x3e\xd5\x17\xbc\xae\x58\x44\x69\x3e\xcd\xc4\xc5\x1d\x53\x0b\xd5\x13\x4e\xd3\xa2\xf8\x4b\xab\xe7\x26\x51\xa9\x76\x59\xde\xcb\x3b\xc6\xb3\x75\xe5\x2d\x7a\xd5\x83\x98\x82\xbd\xe0\x28\x36\xf3\x82\xd0\x2b\xdd\xe4\x7e\x4e\x50\x86\xfd\xca\x37\xa0\x57\x39\x6a\x41\xdc\xbf\x90\xde\x18\x2e\xbc\x65\xc2\xa2\xda\x1b\x82\xe8\x94\x8a\xb2\x98\xa7\x91\xb8\x69\x9b\x21\x30\x75\x2c\xd9\x0c\xf3\x54\x21\x91\x8f\xb2\x2a\xfc\xe8\x86\xfe\x5d\xc7\xe0\x86\x64\x49\x19\xff\x25\xf4\xe7\x36\xf4\x9f\xff\x26\xdc\xe7\x6d\x70\x5f\x15\x5e\xb9\x9e\x2d\x1c\xe1\x4e\x6b\xf5\x95\x9a\xb9\x05\xa3\xe6\xe9\x32\xa2\xb0\x8c\x26\x14\x45\xf9\xc4\x6d\x99\xff\x07\x9f\x51\x99\x54\x61\xe8\x92\xd0\xf1\xd9\x64\x99\xd3\xdb\x8a\x75\x94\x6f\xdd\x4e\x38\x32\x64\x81\x2e\xf9\x5f\x40\x3e\xec\xaa\x0d\x02\xa2\xdd\xe4\xd0\xe7\x51\x1d\xf9\x25\x1b\x01\x14\x61\x2c\x36\xc2\x15\x97\xe7\xd9\x5c\xd2\x14\x06\x7a\x95\x89\x49\x4e\x3f\x43\x85\x57\xe2\x2e\xe0\xf4\x24\x41\x13\x5e\xaa\x55\xaa\x9c\xd7\x99\xa0\x3c\x29\x43\x8f\x6e\x68\x66\xc2\x30\xee\x04\x62\x6a\x72\x23\x13\x32\xa7\xb0\xad\xf2\x39\x47\xac\x28\x82\x90\x48\xf8\xff\xa2\x44\xe1\xaa\x52\x77\x73\xc9\x96\x4a\x7e\x4a\xab\x92\xd0\x8f\x18\x5a\x67\xa9\x14\x9c\x19\x50\x53\xc6\x2a\x50\xc3\xae\x25\x4b\x27\xa5\x48\x4f\x47\x8c\x40\x8f\xc7\xe8\x89\x20\x4f\x04\x56\x9f\xa2\xc9\x84\x4e\x81\x7a\x88\xa4\x64\x17\x33\x49\x5f\x68\x01\x41\x74\xc1\x92\xc7\x51\xce\xe8\xb7\x32\x3e\xe3\x32\x4a\x14\x0a\xfc\x51\x27\x30\x9e\xd0\x31\x94\x8c\x93\xe8\x62\x95\x6f\x5d\xf1\xee\xb4\x19\xa4\x16\xfd\x2b\xe4\xbd\x63\x12\x90\x79\x75\x44\x51\xa3\xc2\xeb\x63\x22\xcb\x6f\x92\x9a\x97\x49\xb0\x42\x21\x24\x7c\x4b\x91\x7e\xa5\xa3\x42\x86\xc1\xb9\x53\xdb\x2e\x01\x06\xc4\x8e\x95\xe9\x2e\x4e\x20\x64\xbc\xb7\x94\xf1\xee\x13\xac\xb3\x93\x9f\x38\xa3\xa9\x6b\xfa\x45\x2d\x3b\xbf\xae\xa5\x14\x0c\x9d\x64\x3f\x3b\xfb\x0a\xe9\xd3\x53\x7e\x5a\x53\x2f\x13\x76\x3a\x17\x82\x7e\xb0\x05\x17\x3f\xaf\x86\x69\x2b\x2d\xf0\x8f\x0e\x85\xf8\x25\x9f\x30\x7a\x16\xeb\xbd\x35\xc9\x5b\x89\x59\xa3\x64\x54\xa2\x98\x25\x01\x68\x39\x65\xab\x51\x76\xad\x9f\x2e\x14\xd6\x59\x29\x41\x22\xd1\xab\xf4\x02\xf1\x3e\x98\xcf\x54\xfe\x23\x32\xb5\xf0\xd0\x15\xf6\x9d\x3e\xd7\x1b\x3e\x8f\xa3\x59\x2b\x91\x52\x63\xc5\x3f\x2a\xf5\xef\x5a\x15\xed\x2d\xf9\x5b\x1a\x62\x5a\xd7\xf1\x8e\x9d\x3d\xbd\x6e\xdb\x10\xb6\x2a\x1b\x6b\xa9\xea\x6f\xe2\x8c\x46\xeb\xae\x53\x55\x07\xdc\x90\x9f\xdc\xb9\xfe\x63\xe9\xe5\xe9\xb0\x46\xfd\x9b\x68\x3e\xc7\x24\x5d\x61\xb9\xf3\x74\x42\x4f\x12\x13\x3c\x4c\x27\xec\x9a\x7e\xc8\x4c\xfc\x25\xbb\x8b\xcb\x64\x7b\x9f\x1a\xa7\x75\x65\xaf\x22\x45\x27\x27\x76\x54\x57\xba\x9e\xd9\x69\xbf\x57\xf1\xff\xcf\xde\x9b\xef\xc5\x6d\x2c\x0d\xc3\xb7\x22\xeb\xe4\x70\xa4\x87\x46\x51\x6b\xd7\x10\x85\x1f\x01\x1c\x93\x98\x25\x80\xed\x93\x10\xde\xb1\x46\xea\x19\x14\x34\xd2\x44\xd2\x60\x13\x33\xf7\x90\x3b\xc8\xbd\xe5\x4a\xbe\x5f\x2f\xda\xa5\x59\x30\xc9\x39\xef\xf7\x3e\xf9\x23\x66\x5a\xbd\x54\x57\x55\x77\x57\x57\xd7\x32\x89\x0a\x5d\x75\x9c\x38\xb7\x84\x3f\x58\x9a\x17\x67\x18\x56\x7e\x51\x19\x78\x92\x17\xd5\xb6\xf3\x0e\xc3\x4e\x34\xb8\xaa\x60\x02\x1c\xbb\x6c\x18\xdc\xb2\x2d\x4e\x77\x34\x1f\xf7\x34\x3f\xfb\xd0\x33\x32\xda\xda\x1a\xb6\x91\x4f\x1a\x2c\x19\x10\x6d\x6d\x4d\x5a\xad\x26\x28\x73\xee\xc9\x62\x9b\x64\xce\x5d\x48\xff\x40\xce\x5b\xf2\xd7\xad\xdb\xd4\xc2\x36\xd5\xd9\xcc\x02\x7c\xca\x50\x7b\xeb\xe2\x6d\xfc\x80\xf4\x77\x8b\x2f\x62\x2f\xa9\x6a\xda\x47\x51\x16\x64\x0f\x0e\x22\x48\x0f\x22\x2f\x9c\xfb\x0d\x0d\x2f\x3d\x8d\x11\x0b\xe0\x81\x06\xdf\x32\x7f\x92\x64\x6b\xeb\x45\xb4\x47\x16\xe0\x40\x66\xe1\xd5\x5a\xd9\xbe\xd9\x73\x94\x9f\x08\xc1\x76\x42\xe2\xaa\x51\x3f\x9d\xe4\x2b\xbc\x27\x23\x89\x04\xb9\x3b\x1b\x93\xab\xe2\xd7\x3b\x70\xf0\xe2\x45\xb0\xb5\xf5\x21\x63\xfc\xfc\xf5\x0e\x64\x0a\x78\x52\x6b\xfd\xdb\xcf\x67\xc6\x7e\x63\x00\xb0\x4d\x33\x88\x2e\x88\x86\xac\x57\x4d\xb3\x49\x82\xaf\x92\xe8\x5f\x93\x68\xab\x64\xd5\xa2\xaf\x7c\xfa\xe7\xa2\x48\x1b\x55\x1c\x48\xf4\x85\xc0\xb9\xa4\xcf\x05\xe9\x7e\x6e\x00\xe1\xbc\x09\xf3\x12\x7c\x55\xf8\xa2\xfa\x8b\xc6\x37\x76\x4e\xaa\x65\xaf\x83\x3b\x4c\xc3\x46\x09\x93\x35\x7e\x60\xe5\xdf\xd0\x30\xd0\x1d\xbb\xd8\x0b\x99\xa6\x45\x20\xc9\x6a\x5b\xee\x61\xc3\x05\x6b\x4f\x07\x7e\xc5\xba\x3b\xc4\x72\xe1\x6f\xec\xc7\x51\x88\x30\xe0\x5d\x47\x26\xeb\x8c\x74\x2d\x45\xb1\x8f\xae\x1e\x66\xa5\x6b\x27\x6b\x3e\x9d\x65\x75\x21\xbe\x65\x60\x4d\xef\x79\x2f\x69\x67\x79\xa0\xf2\x2e\xe7\xb8\x4e\xb7\xa3\x74\x86\x8f\x89\xfa\x65\x26\x8f\x73\x9e\x0f\x50\x30\x58\xd5\xeb\x8b\x5c\x78\x9c\x33\x72\xb5\xfe\xa9\xac\x99\x06\xbf\x11\x27\x28\x62\xe6\x9f\x17\x13\x5f\x84\xaa\x0a\xb3\x70\x18\x40\x62\x30\x16\xaa\x41\x78\x4a\x27\xc7\x7c\x76\x39\x26\x7e\x9d\xbb\x61\xf7\xf2\xbf\x8c\x4a\x91\x9d\x55\xec\x3c\x64\xe9\xc2\x11\x7a\x82\x4f\x25\x83\x40\xdc\x23\xc6\xac\x62\x19\xa8\x8a\x7a\x9f\x5c\x56\x54\xc9\x2f\x5e\x44\xf9\x40\x49\x12\x27\xce\x3b\x46\xe8\x97\x41\x14\x64\x5d\x67\x6a\x97\xab\x2b\xc9\x80\xc6\xba\xc9\x9d\x6e\x9d\x1f\x59\x4f\xc7\x51\x86\x26\x28\x71\xbe\x63\xbf\x69\x4e\x7d\xe7\x7b\xf6\xf3\xc4\x9d\x39\xff\x2e\xfe\xce\xbc\x1e\xd9\x88\x79\x8c\x8f\x18\xe8\x71\x21\xd2\xb0\x56\xcb\x74\xea\xfd\x18\x02\xd5\xfe\x8a\xc5\x9a\x9e\xba\xa7\x9d\x77\x43\x97\x30\x25\x7a\xe1\x6c\xa3\xa2\x66\x16\xdc\xa3\x26\x47\xdf\x12\x6e\x29\xd5\x12\xfb\x48\xe0\xdf\x44\xe9\x7c\x36\x23\x2a\x44\xce\x8b\x13\xb4\xf3\x4b\xca\xcd\x53\x24\x71\x57\xc9\x03\x77\x9b\x65\xb3\x74\xf0\xe5\x97\xd1\x6c\x9a\x4a\x41\xfc\x65\x8a\xdc\xc4\xbb\xdd\xfb\xd5\x99\xc5\xd1\xc3\x38\x08\x43\x89\xaf\xe6\x48\x28\x90\x7d\x1a\xf4\xbe\x87\x3a\x4e\x01\xe3\x3c\x5c\x52\xab\x52\x0d\xd3\xd5\x41\x6c\x8f\x62\x9b\xca\x2f\x61\xf5\x27\xd9\x7f\xbe\x61\x45\x55\x6d\x43\xc6\x5a\x31\x01\x2a\x61\x3f\x2f\xdd\x31\xca\xe9\xdf\x01\xc1\x77\x74\x95\xa3\xaf\x9d\x9d\x39\x73\x91\x66\xed\x50\xe6\x44\x79\x1f\x64\xe9\x3b\x41\xfe\x93\x78\xb9\x3a\x31\xfb\x89\x37\x19\x9f\xee\x9e\x21\x2b\x7a\x13\xf9\x68\x1c\x44\xc8\xef\x7e\xc5\x73\x9c\x80\x8d\xf2\x0e\xb9\x77\x75\x1b\x86\xe6\x66\xc6\x7c\x76\x47\x95\x06\x97\x68\xd9\xee\x57\xf8\x98\xb3\xaa\x37\xbc\x43\xbd\xd5\x49\x0f\xbf\xc4\xc1\x0a\x69\x87\xe7\x07\x5f\x64\x95\x64\x15\x80\x3c\x14\x8f\xdc\x11\xb9\x71\x7d\x41\x66\x18\x62\xb1\xed\x5d\x9c\xff\x79\xfc\x0c\xe7\x6a\xec\x44\xed\xb0\xa6\x79\x64\x53\xb1\x2f\xac\x69\xd6\x95\x51\xac\xb4\x83\x4b\xb6\x21\x0d\x3a\x1e\x8c\x05\x12\x6b\xbc\xf4\xe9\xe6\x8a\xe1\x22\x6a\x93\x12\x8b\x03\x12\x24\xf5\x2e\x63\xf1\x51\xc9\xec\x72\xaf\x0a\xe7\xc4\x2d\x7e\xbf\x0c\x92\x34\x73\x5e\xd2\x82\xcc\x71\xd9\x1f\xc8\xf1\xd8\x43\xfa\xc7\x55\x6a\x9d\x39\x86\x15\x79\xe0\x28\x12\x07\x01\x7b\x8a\xfe\xb8\x8e\x6a\x67\x1e\x95\xaa\x9d\x6a\xeb\xee\xc3\x96\x7b\x9b\x91\x71\xc4\xa2\x52\xdf\x18\x6f\xb3\x8a\xca\x88\xd6\x0e\x3a\x7b\xec\x9a\xc5\x43\x09\x47\xd0\x3b\x42\xef\x2c\xca\xd6\x69\x36\x1f\xd1\x75\xe4\x7b\xf9\xef\x97\x6e\x98\x22\xe7\xaa\xf8\xdd\x54\x6a\xe4\xfd\x7f\x5a\x14\x5d\xb0\xd5\xda\xaa\xc2\xf3\x45\x95\xab\x64\x8e\xda\x15\xd8\xc9\x38\x9d\x87\x59\x30\x0b\x1f\x9c\x53\xfa\x36\xdf\x77\x57\xae\xce\xe8\x5b\xfc\x89\xd9\xd5\xd0\xc9\x44\xf1\x41\x1c\x8d\xc3\xa0\x0b\x58\xce\xcb\xa4\x21\xe6\x45\x92\x98\x4c\x20\xbf\x3e\x22\x9a\xdb\x98\x35\x8e\x67\x4e\x4c\x87\x8f\x3f\x38\xf7\xec\x89\xda\xef\xbb\xe5\xb2\xdb\xad\x90\x39\x14\x86\xbd\x90\x78\x2c\x12\x39\xe6\x05\xbe\x86\x7f\x5d\x09\x7f\xcf\xc4\x58\x21\xdb\x89\xc4\x2f\x95\x7c\x15\xdc\x05\xc2\x3c\x13\x02\x7c\x04\x6d\xa3\xed\xbb\x40\x48\xd9\xaf\x05\x1b\xfb\x28\xda\x7c\xf8\x5c\xb4\xdd\xda\x8a\xbe\xca\xf6\x48\xb7\xd9\x4e\x54\x79\x3f\x76\xfd\xcb\xcc\x4d\xda\xef\x11\x9b\x75\x5c\x74\x4b\xc2\xca\xd2\x8e\x93\x14\x6f\xfb\xbd\xe7\x31\x7d\x8f\x22\x0a\x1c\x47\x1e\x90\x7c\x0f\xce\x76\x26\x82\x61\xc2\xbc\xcb\xf2\x6b\x75\x46\xbc\xc3\x40\xf6\xf8\xc8\xb6\x84\xc4\x8d\xfc\xb8\xad\xcc\x0e\xc6\x42\x3d\x01\xca\xd2\xe7\xb3\x5c\xf3\x54\xcd\xb3\x94\x6b\x59\x0a\x75\xd4\xa0\xfd\x15\x91\x6b\x10\x02\xc8\x09\x48\x4a\x20\xd2\x0b\x7d\x8a\x11\x90\x23\x83\xcc\x81\xe2\x40\x40\xcc\x59\x9f\x7d\xa0\x5e\x2d\xb2\x38\x60\x57\x0c\x11\xa0\xaf\xb3\x7c\x77\x46\xbb\x88\x0c\x17\x2d\xf0\x0c\x1e\x1f\xd1\x3f\xe1\xe3\x63\xf6\x4f\x98\xab\xda\x27\x49\x69\xc9\x7c\x95\x08\x68\x3b\xfe\x1f\x21\xdb\x41\xdb\x41\x26\xf0\x10\xed\xf0\xdb\x82\x10\x6f\xf3\xbc\x58\x24\xbd\x10\xf1\xb6\x5c\x3c\x8b\x9f\x54\x24\xc9\x04\xf9\xf3\xde\xc7\x59\xaa\x92\x78\x9d\x0d\x4e\x32\x10\xb4\xec\xbd\xbf\x52\x8b\xdd\x3a\xdf\x3a\x34\x11\x24\x20\x00\x6e\x54\xed\x7c\xd9\xeb\x16\x1d\xe1\x7c\xe3\x11\xbc\x62\x84\x19\x72\x7b\x39\x6a\xf9\x2b\xfb\xcb\x48\x60\xea\xa8\xa2\x2f\xcc\x5d\x4b\x0c\xdd\x41\x46\x96\x00\x89\x5a\x95\xaf\xdc\x02\xd4\xbd\x6c\x90\x15\x1c\x4a\x92\xaa\x22\x12\x8f\x8a\x76\x9d\xce\xc3\x3e\x1c\x90\x30\x50\xed\x64\x50\xd4\x35\xfe\xf1\x51\x88\x1d\x48\x78\xab\x61\x08\x51\x4d\x98\x95\x27\x89\xba\xd9\x0d\x19\x13\x47\x4e\x0c\x42\x27\xc1\xfc\xf8\x63\x28\x84\xe2\x5e\x98\xc7\x69\x1e\x84\xa5\x77\x3b\x81\x2d\x9e\x47\xbe\xb3\x4f\x2d\x42\xe6\xd1\x71\x74\x10\x47\x19\xfa\x88\x19\xb4\x30\x65\xe8\x7f\xe9\x7f\x95\x0c\x5e\x55\x5e\xfa\xeb\x26\x0f\x1d\xf7\x38\x4e\xee\x89\xee\x41\x77\x91\xce\x4b\x58\x41\xcd\xfc\x22\xb6\x47\x6f\x60\x83\xea\x8d\x8b\x8e\x1f\xb9\x77\x88\x88\x06\x3f\x90\x63\x3f\x8d\xa7\xcb\x79\xfb\x21\x1b\x7c\xb3\x99\xba\x8d\x3e\xf7\x53\x85\x58\xe7\x11\xf4\xef\xca\xea\xaa\x54\x5e\x62\x2d\x14\xd4\x8c\x82\x9a\x0d\x1b\x32\x5c\x7f\xd8\x6f\x12\x8d\x32\x9f\x1e\x83\x82\x38\x72\x7f\x95\x90\x24\x53\x88\x24\x27\x29\xd0\x1e\x2d\x72\x59\xaf\x32\x62\xa9\xec\x5b\x32\xb7\x42\x12\x6b\xb4\x59\x77\x8a\x7d\xed\x5b\x33\x2d\x1d\xf0\xcb\x63\x3d\x9f\x7f\x09\xca\x0e\x89\xf0\x49\x26\x98\x54\x27\x98\x34\x26\x88\x0f\x35\xc2\x1b\xaf\xdc\xe2\x77\xb7\x9e\xba\xb8\x14\x0c\x99\x3e\xac\x54\x2f\x55\xf4\xd2\x05\x44\xb9\x3e\x1b\x94\xea\xe8\x64\xbb\x50\x54\xe7\x7a\xe9\x74\x3e\xca\x12\xd7\xcb\x9c\x33\x2a\x38\xcd\xa7\xab\x64\xb9\x97\x4c\x52\x1c\xc8\xac\x83\xe9\x3a\x82\xdc\xcb\xaa\xd8\xc8\x9a\x66\x68\x3a\x0b\xbb\x1e\xf2\x28\xb3\x54\x6a\x5c\xa2\x2c\x0b\xa2\x49\xba\xdb\xb5\x18\x4a\xfd\xfd\xa9\x2b\x7c\x5a\x80\x0c\x44\xe0\x37\x16\xbf\x90\x24\x7b\xcf\xcb\xa5\x60\x8a\xef\xb4\x29\x88\x8a\xbf\x7e\x0b\x44\xe0\x39\x23\x97\x26\x07\x7e\x97\x09\x2e\xf0\x44\x30\x77\x64\x30\x73\x32\x6a\x5e\x3b\x8b\x31\x04\x8f\x8f\xb7\x08\xf8\x0e\x3f\x1c\xce\xb8\x6d\x87\xfb\x17\x0f\xae\x9c\x7b\x24\x08\x19\x53\xc6\xe3\xef\xa2\x94\xc6\xf3\xc4\x43\xdb\xfc\x23\xbf\x3d\xab\xfe\x20\x91\x3e\xbe\xdb\x4b\xd1\xa0\x51\x0b\xb7\xbf\x77\xc3\x39\x1b\xa1\xf2\xed\x0b\x1e\xf0\x13\x5e\x04\x63\x87\xff\xf2\xcb\x7f\x70\xb4\xfc\xcd\xc5\x6b\x87\xdf\x16\x2a\xc1\xa5\x8a\x72\x5e\xdc\x13\x32\xa9\xf8\x49\x0e\xda\x7c\xdf\xff\xf2\xe7\xf4\xcb\x09\xe0\x39\x5e\x1c\xf0\x61\xec\xbb\xe9\x6d\x89\x59\xd2\x20\xbd\xe6\xb7\xb9\xed\x6d\x94\x6d\xf3\x37\xbc\xb8\xcd\xff\x1c\xf1\xbb\xe5\x7b\xc1\x55\x2d\x22\x01\x88\xf0\x59\x0a\xbc\xf2\x3a\x48\x82\x2a\x04\x22\xf0\xb7\x9d\x9c\xd7\xe6\xc0\x2b\x87\x3f\x45\x00\x25\x22\x48\xc8\x45\xed\x85\x8c\xeb\xf1\xff\xe2\xb6\x7f\x8e\x86\x43\x24\xf0\xdb\xc9\x36\x2f\xe2\x5f\xff\xe2\x45\xe0\x6e\x6d\x09\x61\x51\x67\xf7\xe7\x88\xdf\x76\xb7\xf9\x5d\x5c\x95\xe1\x9d\x06\x68\x28\xba\x10\x84\xe1\x30\xe3\x1c\x4e\xe0\xb7\xa3\x6d\x5e\x14\x39\xc7\x21\xf7\x53\x6e\x8f\xfb\xd7\xbf\xb8\x01\x37\x1c\x66\x45\xe7\x73\xc7\x2b\x16\x00\x09\xfc\x50\x0c\x42\x78\x65\x58\x0d\xda\x75\xef\x26\x81\x3b\x0a\x11\x8d\xd8\x95\xff\xc2\x4b\x7a\x48\x76\x00\x97\x3d\xac\x0c\x9b\xaa\x93\xe3\xe8\xde\x0d\x03\x9f\x7b\x9f\xb7\x79\xcf\xc5\x24\xe4\x1c\x37\x73\xd3\x14\xf9\x5c\x10\x65\x31\xf7\x7e\x58\x50\xe0\x3d\x2f\xd2\x1c\x42\xbe\xc3\x93\x84\x4b\x42\x3c\xfa\x45\xe4\x3e\xe1\xb9\xfb\x98\x14\x0b\x0c\xa0\xef\x08\xe1\x9e\x5f\xa0\xf4\x0d\x16\x35\x07\x7e\x89\xe3\x2f\x68\x7e\x9d\xe2\xf7\x09\xfe\xbd\xcb\x8b\x98\x67\x0b\xea\xf1\xdb\xc2\xf0\xf1\x91\x8f\x47\xbf\x60\x22\xb3\x31\x84\x21\xbe\xc8\xe3\x42\xee\xf1\x91\x0c\xce\x39\xdc\xa7\x85\x88\xf1\x22\x6e\xf3\x04\x33\xc3\x0c\x70\x98\x02\x0e\xf7\xaf\x7f\xf1\xdb\x42\xbc\xc7\xe3\xdf\x88\x73\xb8\x21\xe3\x7f\xea\xf0\x2f\x84\xf4\x0b\xee\x82\xdc\xcf\x4a\x7f\x65\xa2\x4f\xd8\xfd\x39\xca\x81\xe1\x66\x49\x10\x65\x82\xc8\x7d\xe2\x18\x6d\x87\xc3\x5f\x28\xfa\x4b\xc9\x86\xfb\xd7\xbf\x44\x0e\xcf\x7f\xc0\x53\x70\xfc\x6d\x9e\x71\xdd\x70\x38\xfb\x39\x5a\x50\xca\x4d\x9c\xef\xdc\x8e\xf0\x8a\x67\x48\xf0\xc0\xb8\x68\xc1\x6f\xfb\x62\x91\x9b\x29\x15\x17\xe4\x18\x9a\xb0\x25\xe3\xf8\xe0\x5d\x28\x4c\x72\x6a\x4e\xf2\xd3\x77\x42\x77\xaa\x60\xda\xb2\x42\x0f\xc6\x82\xc0\xcc\xac\xc5\xaf\xe0\xe3\x23\xfa\x7a\xde\x0c\xb5\x3d\xa3\x09\xce\x10\x98\x89\xbb\x79\x68\x0d\xb4\xe3\xcc\x2a\x11\x45\x7e\xc8\x84\x08\x9f\x88\xdb\xdb\xc9\x57\x68\x57\xcc\xaa\xcf\x04\xcc\x50\x86\x69\x37\xe7\xcc\xf8\x26\x57\x51\xcd\xd8\x6f\xa6\xa2\xf4\xf3\x9f\xf1\x87\x6e\xfd\x55\x47\x28\x0c\x36\x00\x53\xa6\x5d\xb1\x1e\x56\xe8\xc1\x2a\x51\xba\x76\xe6\x60\x2e\x56\xa2\x81\xb1\xf6\xf4\x56\x3d\x64\xdd\x91\x48\x0f\xcb\x00\xaa\x46\x88\x20\x4d\x92\xa0\xf3\xd2\x54\x35\x1b\xcc\xcd\xca\x8a\x63\x95\xc6\xdc\xca\xad\x7a\x0b\x73\xc1\x66\xa2\x34\x6a\x33\x18\xe3\x7f\x4b\x03\xbd\x61\x20\x44\xe0\x3b\x4c\x88\x58\x04\xdf\xd3\x7f\xb7\xa1\x48\xd3\xa5\xf1\x7c\x09\x55\xd7\xc5\x76\x15\x60\xf9\x8e\x28\x03\x0f\x8f\xbd\x0d\xd7\x85\xb2\x06\x9d\x4c\xe1\x22\x60\x77\xc3\xd6\x7d\x3b\x5e\x0d\x5d\xfd\xf6\xfa\x14\xd8\xbe\x2b\x21\x6b\xc1\x35\x8f\xbc\x3e\x9f\x4c\x55\x06\x91\xc3\x4b\x92\xc4\xb3\x20\x6d\x99\x98\xdf\x24\xf9\x14\xcd\xdc\xc4\xcd\xe2\x84\x0f\x48\xb2\x37\xa9\x28\x18\xc4\xbb\x89\xc3\xd3\x3d\x9c\x7e\xc4\xd7\xa6\x22\xc2\x7f\x82\xfb\x8c\xa7\x41\x9a\x06\x71\x44\xbf\xe3\x69\x48\x79\x91\x38\x88\x68\x20\x01\xa7\x40\x4b\x45\x4e\x25\xa6\xa5\x79\x26\x73\x3a\xd1\xb0\x08\xe4\x45\x6e\xbd\x5f\x3b\x61\x1d\x21\x9e\x93\xec\x84\x89\x10\x11\xcc\x79\xa5\x0b\x7b\x44\xbe\xa6\x8e\x4b\x2c\x55\x81\x8c\xcf\xc3\x1c\x37\x83\x0a\x4f\x90\x76\x71\x35\x3c\x77\xba\x1d\xe1\x32\x7c\x12\x7a\xdb\x4e\x7e\xe9\xdc\xf1\x44\x90\xb8\x42\x2c\xd2\x4c\x61\xac\x03\x4f\x94\xa8\xf6\x9d\x7c\x20\x61\x0a\xc0\xcc\x49\xe9\x25\x4d\x9a\x84\xf1\xc8\x0d\xc9\x5d\xed\x1e\x09\x31\xdb\xe9\xc0\xd0\x15\xe6\x48\x42\x1f\x91\x87\x5b\x6d\x63\x29\x43\x04\x71\xa9\x9e\x75\xe4\xdd\xb9\x13\xd3\x0a\x33\x71\x97\xa4\x44\xf7\x9d\x39\x7d\x13\xdd\x4d\x9d\xb4\x80\xde\x67\x71\xb4\x7d\xb1\xcc\x47\x5e\xbe\xb0\x46\x81\x10\x8b\xc0\x13\x5f\x38\x1e\x85\xed\x0a\xcf\xa6\x14\xab\x85\x58\xdc\xbd\x22\x71\x47\x85\x6a\xa7\x57\xa5\xa5\x7c\xba\x1d\x31\x5b\xb0\x75\xac\x26\x5e\x75\x98\x3a\xbc\x04\x69\xa1\x42\x9a\x47\xc1\xaf\x73\x74\xdc\xe5\x99\xbd\xbd\x7d\x5e\x84\x34\x25\xdd\x6d\x67\xcc\x5c\x8c\x6d\x4d\xce\x6f\x6e\xf1\x9b\x2a\x75\xdf\x51\x9b\xa4\xd2\x62\x00\x35\xcd\x05\xa8\xee\x37\x66\x96\x4a\xad\xfb\x7b\xe9\xbf\x34\x8c\x6a\x15\x6a\xc9\x31\x0e\x2b\x99\x69\x01\x71\x7d\x21\x91\x3f\x32\x1a\x22\x43\x10\xc1\x27\x12\x2b\x60\xf0\x02\x2e\x88\x25\xd4\xdb\xa3\x8b\xcb\xe3\xb3\x53\x87\xd7\x24\x68\x4a\x0a\xe4\xc1\x34\x13\xae\xf9\x51\x10\xf9\x3c\xe0\x59\x08\x03\x1e\xf0\xc4\x1b\x39\xff\x97\x80\xcd\x03\x9e\x79\xbb\x94\x7f\xd1\x0f\x37\x35\x7f\xf4\xc3\xe4\x1a\xdd\xd4\xdc\x90\x0f\x93\x85\x48\x87\xf1\x93\x78\xc6\x03\x3e\x73\xef\x50\xad\x15\x5e\xf5\xd5\x1c\xbb\xd7\xa8\x12\xbc\x04\x5f\x6d\x0a\xd7\x48\x6a\x65\x9d\x14\xf1\x0b\x8a\xf4\x2f\xd4\xf7\x13\xf9\xc3\xe1\xd6\xd6\x8b\x8c\x18\x70\xde\x25\x34\x96\x37\x4d\x8e\x92\x27\xc9\xcb\x17\x60\xad\xcd\x1e\xfe\x89\xc1\x3a\x88\xe7\x51\x36\x1c\x3a\x24\x24\x7f\xa3\x50\x1c\xe0\x82\xfb\x00\x7d\x28\x53\xbc\x90\x1b\x3d\xa9\x3c\x13\x01\x06\x7d\x80\xb6\x05\x5c\xcd\x0f\x92\xe1\xf0\x2b\x79\x8f\xa7\x38\xc2\xe2\xcf\x42\x04\xd1\x02\xd4\xe7\xb9\xcd\xbe\x57\xe6\x5b\xb1\xa5\xc4\x70\x33\x27\x0d\x41\xbc\x46\x37\x02\x09\x36\xc5\x7e\x2f\x72\xac\xd2\x69\xf0\x80\x9f\xba\x39\x76\x89\x91\x73\x0b\xc5\x74\x63\xcd\xb6\x21\x88\x1c\x48\xf2\x4c\xab\x8e\x93\xec\xf6\x62\x1e\xd5\xe2\xc6\x34\x10\x48\xb2\x03\x32\xe7\xc0\x12\x1f\x79\xc9\x20\xc1\xd7\x30\x95\xe1\x04\x33\x40\x56\x43\xb8\x53\xff\xf9\xf8\x18\x81\xac\x98\xd0\x2d\x72\x31\x37\xe2\xbd\xa0\x67\x0e\x94\x85\xb6\x85\xac\x8a\xdf\xfe\x89\xd4\x30\x7a\x9d\xdc\x08\x50\xcc\x23\xcb\x5c\xcb\x37\xc5\xb8\xcc\x2b\x93\xe0\x30\x08\xfb\x86\x26\x4c\x4c\x86\xe6\x07\x6c\xf4\x75\x87\x6e\xf0\x5c\x93\x47\x29\x64\x18\x9c\x6a\x77\xed\xb8\x19\xf5\x3e\x69\x8f\x02\x79\x9c\xa9\xb5\x23\x36\x56\x1d\x82\x55\xad\x95\x48\xac\x6f\x84\xae\xb6\xd4\xa4\xaa\xa7\x7d\xc1\x86\xa4\x2a\x51\xa5\xd5\x3a\x28\xfd\x48\x7b\x02\x33\x75\x46\x84\x6a\x2f\xdb\xa9\x3b\xab\xf9\x52\x30\x18\xca\xe8\x4f\x62\x13\x5d\x2d\xa7\xb0\xce\x89\x53\x7f\x30\x6a\x6f\x5e\x6b\xde\xf6\xfb\x11\x3f\x31\x39\x3e\xcf\x90\x73\x1b\xa4\x65\x1e\x83\xfa\xd6\x23\xa0\xaf\xe5\xc7\xc7\xec\x2b\x59\xcc\xe7\x92\x88\x03\x12\x23\x37\x71\x2a\xae\x0c\xc2\x0e\x12\x07\x54\x05\x4f\x1d\xff\x49\x62\xfe\xac\x34\x1a\xcd\xdf\x29\x70\xc3\x32\xc8\x80\xb0\x93\x89\x03\xda\x8d\x90\xed\xe0\x26\x49\x13\xfc\x5e\x6f\x89\x3e\xf2\x15\xdb\x05\x7d\xab\xc8\x37\x97\x46\xaf\x71\x2b\x96\x4d\xb5\x37\x02\xd0\x4c\x5c\x80\x61\x24\x54\xdb\x75\x2e\xa0\x2f\xff\x8f\xb0\x37\xa0\x38\x7b\xc4\xbc\xf3\x38\x75\x67\x8f\x94\x68\xe2\x23\x81\xe4\x8b\x2f\xe9\x51\x9d\x89\x20\xa2\xd5\x31\x8f\x3e\xe2\xfd\x40\xac\x7c\x8b\x9d\xc3\xe4\x3a\xda\xcb\xf7\x02\xba\x5f\x38\x4e\x6d\x4f\x18\x64\x37\x20\x74\xa2\xc7\xc7\x2f\xff\x0f\x1e\xab\x68\xbc\xfb\x22\x7e\x7c\xac\x9d\x9e\xd7\x59\x7f\xc0\xac\x32\xb7\x98\xeb\x44\x7b\xd7\xf0\xa6\x12\xd7\xca\x73\xb2\x7a\xaa\x30\x90\x3a\xee\xb5\x7c\x03\xe6\x8e\xf7\xf8\x48\x1c\x56\xc1\xac\x63\x4f\x8d\xd9\x5d\xf3\x30\x21\xd1\xae\xd0\x0d\x70\xc5\xaa\x4f\x90\xbf\x97\x5d\xcb\x37\x83\x6c\xb1\x3b\xdf\xda\x4a\xaa\x61\x4b\x8b\xf5\x92\x6e\x6d\xc1\x17\x85\x08\x88\x05\x42\x67\xee\xbc\x80\x94\x4f\xfd\x46\xb4\x2f\x70\xe5\xbc\x78\xd1\x93\xef\x0c\x8c\x9d\x70\x6b\xeb\x85\x0f\x86\x8e\xb7\xb5\xf5\xe2\x8a\x88\xf9\xe1\xd6\xd6\x5c\xfc\x94\x39\xc3\xbd\x6c\x50\x5d\x97\xec\x4a\x5d\xa4\xaa\x00\x6e\x01\xf6\x64\x65\x12\xb4\x59\x67\x12\xb4\x09\xf0\x0b\xa1\x6e\xbc\xb5\x35\xdc\xab\xe5\xc1\x70\xc5\x81\x30\x71\xca\x0c\x67\x33\x11\x8c\xf7\xa2\xbd\x49\x65\x0b\x1f\x14\x3f\x06\x13\xba\x25\x90\x0d\x7d\x46\xc4\x0d\x0c\x07\x0f\xf8\xf4\x36\x18\x63\x29\x26\x8d\x13\xf2\x0f\xb1\xae\xe2\x01\x3f\x8f\xe8\x97\x9b\x56\xaa\x9e\xcc\xb9\xc0\x9b\x39\x60\x3c\x8b\xfb\x79\xc4\xad\x1f\x59\x93\x82\x19\x91\x88\xb9\x70\xc6\x0f\x78\x0c\x20\x9f\x73\xed\x2c\x9e\x3d\x36\x2b\xee\x1e\xf6\x9f\x14\x8d\x87\x1b\xa2\x06\xc7\xd2\x4c\x3d\x41\x1c\x8b\x70\x50\x0d\x8f\x56\x9e\xc9\x14\x6d\x5f\x84\x42\x20\xee\x05\x83\xeb\x1b\x80\x0a\xc4\xe6\x27\x4c\xc7\x6e\x5a\x69\x97\x88\x7b\x09\x6b\x47\x4e\xa2\x75\x56\xf4\x61\x72\x9d\xdd\xd4\x14\xf9\x09\xc9\x85\xb0\xcd\xf3\xbb\xb9\xa0\xfa\x53\x02\x22\x2c\x9e\xfe\x94\x5c\x47\x37\xce\xf5\x8d\x08\xc8\x5f\x8c\x49\x70\xed\x01\x0d\x62\x88\x85\x05\x3c\xf0\x4f\xc9\xf5\x61\x20\x04\x40\x11\x49\x5f\x37\xce\x35\xad\xc5\xd3\xc5\x98\xf0\xb4\x76\xb0\xb8\x69\x9c\x96\x75\x7b\xf9\x1c\xab\x15\x0e\xae\x45\xb8\x2b\x9f\xc4\x56\x85\xb9\x23\x39\x94\x89\x58\x97\xaf\x2c\xf2\x83\x14\x57\x05\x9b\xe6\x39\x4f\x2a\x54\x24\xa5\x4a\xe7\x95\x52\xda\x7d\x55\x04\x65\x75\x2a\x45\xa4\x0a\x93\x3f\x2b\xbd\xb0\x12\xe2\x80\xd6\x38\x09\xa9\x7f\x6f\x05\x19\xf8\x16\xdb\x04\xb0\x03\x45\xe2\x6e\x39\xd9\x1d\xd8\x9c\xe2\x0b\x99\x5c\xe7\x04\x54\x13\x0c\xc5\xbc\xc5\xff\x38\x65\x62\xe1\x26\x48\x84\x61\xdb\xd4\x69\x92\x25\x67\x6c\x90\xd5\x71\x9d\x30\x27\xaf\xc8\xc9\xbe\x92\x41\xe0\x24\x65\x96\x37\x19\xc4\x2d\xf5\x46\x35\x8e\x15\x09\x65\x58\xc4\xdc\x8e\xbe\x0a\x8a\x50\x62\x98\x0f\x41\xe8\xd0\xac\xe2\x79\x92\xa0\x58\xc2\xf0\xd2\x14\x41\x54\xe4\x1b\xa0\x6d\x27\xdc\x1d\x25\xc8\xbd\xdb\x2d\x4a\xd9\x49\x93\xed\xd4\x3f\x91\x23\x69\x90\x51\x83\x5a\xb4\x1d\x8a\xcd\x8f\xac\x1d\x22\xb9\x54\x41\xb6\x13\x8a\xb9\x47\xd9\x27\xf2\xc4\x33\x40\x00\x45\xfe\x20\x5b\x2c\x04\x19\x04\xa0\x49\x69\x02\x2d\xae\x07\x5c\x7c\x15\x8f\x7c\xe0\x39\xee\x4e\x08\x52\x27\xda\x73\x07\xe1\x0e\x04\x73\xa7\xcd\x63\x60\xe6\xcc\xf3\x1d\xdf\x77\x64\x70\x85\xe1\xf3\x40\x9b\xd1\xa8\x9e\x27\x79\x7c\x7c\x11\x6d\x6d\x05\x0e\x3e\x14\xae\x1c\xc7\xcb\x55\x10\x5e\xc0\xdc\x54\xeb\x61\x20\x49\x08\x43\xe7\xfa\x66\x17\x0d\x30\xe2\x77\xbd\x9d\x9d\xad\x2d\xff\xab\xab\xdd\x92\x10\x84\x9b\x26\x0e\xba\x4e\xb7\x9d\xec\x66\x77\x7b\x7b\xf8\xd5\x8c\xd1\xe1\xd6\x99\x5f\x0f\x6f\xc0\xa9\x73\x4b\x30\x0f\xf6\x1d\x41\x06\xb7\x45\xfc\x11\x51\x98\x10\xa8\x14\xc7\x39\x15\x27\xce\xfe\x6e\xae\x50\x78\xb1\x4f\xb8\x1a\xe2\x72\x2f\x8e\xb2\x20\x9a\x23\x0e\x51\x7c\x73\x68\xb1\x18\x5f\xfb\xdb\xdb\x37\xce\xa4\x38\x5f\xa8\x59\x47\xc1\x91\x6e\xe6\xcc\xc2\x7a\x11\x0d\xaf\xd7\x96\x75\x52\x96\x1c\xaa\xd1\x83\x17\x4f\xa7\x41\x97\x78\xce\x4e\xb7\xea\x4e\xdd\xcc\xf6\xd9\xe8\x2a\x42\x1f\x6b\x1d\xe5\x74\xcf\xb3\xad\x33\xc7\xa1\x46\x69\xea\xd6\xc6\x60\x41\x46\x8b\x55\xc5\xf2\xb6\x7f\xed\x34\xda\xd5\x4d\xe3\x3f\xf9\x71\x84\x06\x08\x90\xaf\x03\xb4\x17\x0c\x1a\xd5\xaf\xeb\xdd\x6d\x6f\xdf\x2c\x1a\xd0\xcf\x42\x37\xea\x09\xef\x07\x72\xb1\xb9\x2a\x2b\x7d\xc8\xe3\xf5\x44\xce\x87\x58\x48\xc4\xdd\xa8\x92\x71\x5e\x26\xd7\xef\x62\x8e\x01\xc8\xf6\xe2\xea\x16\xe1\x44\x83\xcc\x89\x4a\x8b\x3f\x12\xa8\xb4\xf8\x9a\x53\xbb\xde\x04\x81\xac\x01\x72\xc7\x16\xd9\xbd\x23\xed\x76\x24\xe0\xcf\xd3\xd2\xee\xd6\xaf\x78\x4d\xe9\x8a\x3c\x44\x56\x37\x57\x12\xb0\x38\x2b\x85\xed\xd5\xb9\x63\x7f\xe9\x4e\x1e\x9b\xb5\xd8\xa9\x26\x95\x63\x61\xe9\x97\xb8\xc9\x63\x59\xfc\xdd\xe5\xd9\xa9\x73\xd8\xda\x96\xcf\xc6\x1d\x85\x5d\x36\x67\x41\xeb\x18\x6d\xef\x06\x8d\x41\xa9\xb6\xab\x56\x84\x65\x7a\xf0\x1b\xbe\x04\xd5\x44\xa2\xdf\x7a\x6f\xcf\x44\x83\xb5\x10\xc4\x5d\x62\xe6\x36\x4f\x80\x10\x39\x1d\xcf\x3a\xf3\x64\x21\x16\xa9\x27\x00\x31\x4e\x61\xf7\x2a\x24\xa1\x8f\xe4\x5d\xd7\x89\xc4\xa2\x0e\x5d\xd0\xba\x6d\xc8\xfa\xa0\x79\x7e\xf0\xf3\x14\x71\x69\x96\x04\x5e\xc6\x33\x75\x53\x22\xd8\x50\xd7\x94\x6a\xdc\xe0\x42\x5c\x04\xc9\x6e\xe5\x75\x2a\x8f\x22\xef\x28\x80\xcf\xe2\x98\x1b\xa3\x0f\x65\x46\x2f\x5e\x04\xed\xaa\x5f\x39\x2a\xad\x3a\x75\xa3\x87\x5a\x5d\xc5\x71\x5a\x76\x46\x7b\x42\xe6\xb8\xb5\xf0\x94\xf0\x86\x84\x94\xa8\x16\xd4\xbe\x2b\x37\x78\xd4\x14\x1f\xa0\x7c\x90\xa1\x69\xca\x05\x29\x17\xc5\x19\xe7\x46\x9c\x8b\xef\x77\x04\x2a\x0f\xdf\x58\xf8\x7c\xdf\x2d\xaa\x14\x31\x68\x48\xa5\x96\x13\x43\x02\x78\x3f\x48\x2e\x73\x3d\x7c\xd9\x8c\x3e\xf7\x90\x46\xd0\x71\x8a\x33\xb8\x51\x7d\x3a\x4f\x33\x6e\x84\x38\x97\x4b\x83\x68\x12\x22\xce\xbb\x75\x13\xd7\xcb\x50\xc2\x8b\x85\x2b\x4f\x4d\x17\x80\x0a\x41\xb8\xf2\xe0\xd0\x01\x58\x40\xe7\xca\x61\x98\xd8\x9c\x04\x5c\x20\x56\xc6\x2c\x60\xfc\x84\xbf\x0c\x10\x98\xb9\xd9\xed\x55\x7c\x87\xa2\x74\x10\x09\x01\x0d\x64\x59\x86\x39\x26\xc9\xe6\x63\x12\x9d\x23\x68\x01\x55\xc8\x93\xb8\xab\x6a\xca\xf3\xb8\x33\x9e\x4f\x5d\x4c\xc9\xa4\x72\x64\x22\xb0\x54\x7e\xc6\x8e\x0c\x42\xe7\xc4\xcd\x6e\xa5\xa9\xfb\xb1\xcc\xbf\x97\x07\xa1\x16\x77\xe3\xaf\xc2\xdd\x78\x7b\x9b\xc6\x99\x15\x62\x2e\x88\xb8\x48\x2c\x8d\xa3\xcb\xd2\xf2\x81\x87\x9a\x4c\xbb\x4e\x74\x1d\xdf\x34\x82\xe8\x7b\x4e\xd0\x2a\x24\x2f\x0f\x2f\x9c\x5c\x63\x8f\x6f\xba\x6e\x61\xaf\x77\xe3\x38\xe5\x5e\x98\x3a\x8e\x23\x78\xd7\x5e\xfd\xab\xb8\xe7\x7e\xe5\x91\x74\x41\x83\x74\x0f\x0e\x76\x60\x2e\xf5\x70\xf2\xa2\xc4\x54\x35\x37\x7c\xe5\xf9\x9c\x38\x75\x08\xd5\x7c\x61\x6e\x77\xf0\xf1\x6a\x78\x67\xe6\x40\x54\x37\x68\xaf\x26\x53\x73\xa8\x21\x70\x6d\x83\xa4\xfc\x90\xdb\x9e\x95\x1d\xa7\xab\x3a\x26\x5a\x92\x35\x7b\x2d\x77\xa3\x00\x04\xa5\x62\x1e\x4a\x50\x82\xfc\x02\x90\x6d\xa6\x91\x07\xa2\xb6\x1f\x15\x50\x25\xd5\xd7\xbc\xc4\x09\x84\x04\x7c\x5a\x90\x87\x2b\x12\xe4\xa1\x58\x64\xf8\x4b\xab\x10\xbc\x80\x22\x88\x88\xc8\x25\x20\x90\xaf\x1e\xc0\xbf\xa7\x7f\xbd\x2f\x17\x72\x9a\x2f\x92\xa8\x33\x2a\x4b\x4d\x0b\x42\x5d\x27\x00\x1f\xe4\xd6\x0e\xc5\x03\xdd\x7b\x0e\x37\xe1\x8b\x31\x13\x90\xa7\x77\xab\xd4\xa6\x16\x11\x69\xab\x6e\x1b\xfa\xc2\xb0\xb5\xdd\xba\x55\xb9\xe8\x8e\xbc\x48\x37\xc2\x2f\xf3\xfc\xcd\x6e\xa7\xd2\x10\xb5\xe7\xb5\x87\x88\x42\x84\xfe\x10\x78\x81\xdf\xee\xdc\x00\x0a\xf3\x9a\xeb\x9d\xeb\x9f\x6f\x3e\x2d\x04\xf1\x7f\xb6\xf7\x24\xf0\xf3\xcf\xff\xe7\x8b\xc7\x7f\xfc\x9c\xde\x7c\x39\xc9\x1d\x6d\x17\x02\x12\xb7\x79\x91\x9a\xf4\x2c\x72\x27\xe3\xd8\x29\xe2\xd6\x90\x85\x87\xb7\xcf\xb8\x11\x8f\x2a\x66\x69\x58\x59\xe4\xe2\x36\x86\xb6\xb6\x42\x2a\x51\xc4\x12\x51\x45\x08\xa2\xb8\x9b\x77\xf2\xb5\xbc\x2b\xb2\xaf\xd5\xbe\xf7\x8a\xaa\x83\xe2\xaf\xed\x4a\xf3\xdc\x08\xde\x71\x9c\xf0\x5a\xbe\xc1\x23\xb0\x6f\x80\x15\x86\xe5\xaa\x27\xe3\xc7\x33\x41\x04\x61\xb9\x8e\xa2\x75\x17\x78\x50\x33\x18\xbb\x8f\x03\x9f\xa5\xd2\xca\x06\xa8\xb2\x80\x12\x90\x54\x17\x90\x2c\x41\x9e\xf1\x4c\xd7\x8b\x77\xae\x6d\x7e\xe1\x38\x59\x6b\x74\xbc\xd5\x03\xcd\x34\x74\xb8\x5c\x1a\x48\xa4\x84\xb8\x59\x49\xbe\x90\x81\x4f\xef\x82\xdf\xdc\xc4\x3f\x89\xfd\x79\x88\x06\x1d\x12\x53\x84\xcf\x8f\x5c\x80\x50\x2d\xdd\x52\x49\x68\x7d\x01\xda\xba\xa5\x88\x20\x76\x12\x41\xb1\x2d\xd5\xc2\x37\xbb\x44\x30\x4c\x59\x95\x45\xe0\xe2\x52\x55\xd7\xf1\x56\x9c\x08\xaa\x69\x59\xa6\x08\x52\x27\x11\x4c\xcd\x96\x35\x11\xcc\xb1\x30\xa2\xd9\xb2\x2e\x82\x99\x93\x08\x96\x69\xab\xba\xb8\x4b\x82\x99\x70\xbe\x73\xfd\x29\xf0\x07\x7c\x3a\x75\xc3\x90\x07\x54\x73\x42\x7e\x70\x82\x37\x9b\x0f\x38\x05\x70\x89\x3b\x1d\x70\x1a\xf7\xed\x37\x80\xf3\x83\xf4\x6e\xc0\x29\x32\xf7\xed\x37\x22\xbf\x00\xa4\xe9\x14\xf9\xc1\x7c\x9a\xb7\xa5\xbf\x1a\x8d\xad\x4a\x63\xad\xd6\x38\x74\x93\x09\xca\xdb\x92\x1f\xac\xa9\xc6\x9a\x42\xa3\xb7\x2d\xfa\x98\x25\xee\x4e\xad\x87\x4a\x11\xeb\xc7\x62\xfd\xa8\x4a\xa5\x1f\x8b\xf5\x43\x0d\x6c\xae\x1c\x41\x10\x9d\xaf\xcb\x97\xe0\xab\xc7\x47\xe1\xca\x21\x7b\xe3\xe9\xd1\xd5\xbb\xb3\x8b\xef\x87\xa7\xfb\x27\x47\x0e\x1f\xa1\xec\x43\x9c\xdc\x9d\xba\x53\xc4\x03\x24\x9d\x9e\x1d\x1e\x5d\x1e\x5d\x5d\x1d\x9f\x7e\x3b\x3c\x78\xfd\xe6\xf2\xea\xe8\x82\x55\xf4\xc2\x79\x9a\xa1\xa4\xb3\xe2\xd9\xe9\xd5\xc5\xd9\xeb\xe1\xf9\xeb\xfd\xd3\xa3\xe1\xd1\xe9\xe1\xf9\xd9\xf1\xe9\xd5\xf0\xf8\xdc\xe1\xf1\xb5\x34\x89\xc3\xf3\xd0\x8d\xd0\x51\xe4\xcf\xe2\x20\xca\x8e\xcf\xd7\xec\xe0\xfc\xe2\xec\xed\xf1\xe1\xd1\x45\x77\x37\xe7\x49\x7c\x1f\xf8\x28\x69\x76\x76\x74\xba\xff\xcd\xeb\xa3\xe1\xfe\x9b\xc3\xe3\xab\xe1\xeb\xb3\x6f\xbf\x3d\x3e\xfd\xd6\xe1\x51\xe4\x8e\x42\xb4\x3f\xf7\x83\xec\x75\x3c\x99\x90\x9d\xbe\xde\xee\xf8\xf4\xf2\x6a\xff\xf4\xe0\x68\x78\xf5\xe3\xf9\xd1\xf0\xf0\xe8\xad\xc3\xfb\xe8\xfe\x98\xed\x80\x57\x78\xff\x5c\xda\xe2\xfc\xe2\xec\xd0\xe1\x67\x49\xec\x2f\x6b\x73\xb2\x7f\xf0\xea\xf8\xf4\x68\xf8\xea\x68\xff\xf5\xd5\xab\xe1\xc1\xab\xa3\x83\xef\x2f\x19\xcc\x87\x0e\x3f\x75\xbd\xdb\x20\x42\xaf\x90\x1b\x66\xb7\x07\xb7\xc8\xbb\x4b\x8f\x08\xe4\x7e\xb3\x23\x4c\x43\x4c\x9c\xb3\xc3\xa3\x3a\x20\x0e\x8f\x09\x8a\x92\xd3\xd8\x47\x4d\x48\x72\x8c\x62\x8c\x9f\x1e\x1d\x5c\x1d\x9f\x9d\xe2\xc6\x47\x07\x6f\x2e\x8e\x1c\x3e\x88\x52\xe4\xcd\x93\x7a\xcd\xc3\xfd\xab\xfd\xe1\xc1\xd1\xe9\x15\xa6\x83\xef\x66\xae\x87\xa2\x8c\x62\xbd\xa8\x73\x7c\x3e\x7c\xb9\x7f\x72\xfc\xfa\x47\x87\x0f\x66\x2f\xdd\x69\x10\x3e\xd4\xbe\x5f\x5e\xbe\x1a\x7e\x7f\xf4\xa3\xc3\xa7\xe9\xed\xf0\x0e\x75\x7e\x1c\xbe\x3c\x7e\x7d\x54\xd4\x18\x8e\x83\xb0\x0e\xc7\xd5\xab\x37\x27\xdf\x9c\x5f\x1c\x9f\x5e\x39\x7c\x76\x3b\x9f\x8e\x88\x95\x5c\xad\xca\x9b\xcb\x82\x5b\xe7\x29\x4a\x22\xc6\xaa\xf5\xef\xe7\xfb\x97\x97\xef\xce\x2e\x30\xa9\xdc\x34\xfd\x10\x27\x7e\xad\xce\x5b\x3a\xd5\xe1\xfe\xe1\xe1\xc5\xd1\xe5\xa5\xc3\xdf\xd3\xf9\xee\xfb\x7e\x82\xd2\x14\xd7\xbd\x38\xba\x3c\x7b\x73\x71\x70\x44\x50\x73\x79\x75\x86\x51\x87\x11\x93\x66\x31\xc5\x5d\x51\xe1\xfc\xec\xec\xb5\xc3\x27\x88\x9a\x97\x9c\xc7\x71\x58\xfb\xfc\xf6\xe4\xe5\xd9\x6b\xc2\xdf\xf7\xd3\x97\xc4\x60\x80\x07\x57\x54\x81\xb1\x10\x05\x11\x8c\x9b\xab\x78\xfc\xf8\x28\x8c\xd9\x2a\x2e\x59\xc1\xe1\xef\xd3\xd9\x2d\x4a\x10\xa6\x38\xb3\x07\x7e\x19\x27\xd3\xea\xbc\x8a\x3a\xf9\xaa\xc9\x2b\xe4\xc0\x94\x60\xd2\x2f\xe3\x12\x0e\xb6\xaf\x0e\x1d\xfe\xfb\xf9\x08\xed\xdc\x07\x33\x1e\x4c\x1c\xfe\xf4\xf2\xdf\xdc\xbe\x7f\x8f\xd9\xcb\xe7\x5e\xc7\xae\xcf\x7d\xe3\x86\xf8\x57\xc2\x83\xdb\x5c\x65\x7d\xb5\xc9\x3a\x07\x09\xfa\x75\x1e\x24\xc8\x1f\xbc\x90\x01\x0b\x6b\x42\xc2\xdc\x0e\x86\x20\x74\x47\x28\x1c\xf0\xac\x07\x8e\xf4\xc0\xe5\x3d\x70\x79\x0f\x78\x1f\x5d\x7f\xdc\xe3\xf3\xda\x88\x44\x86\xc2\x82\x43\x3a\xb8\x9e\x49\xee\x9d\x74\x7c\x39\x7c\xbb\xff\xfa\xf8\x70\xf8\xf2\x87\xc3\xd3\xe1\x19\xe6\xf3\x9b\xe5\x80\xe4\xfb\xef\x29\x3e\xb5\x64\xc3\xb0\x45\xb0\x8f\xff\x34\x4c\x5b\x04\x67\xf8\xfc\xb2\x75\xa8\x88\xe0\x08\x9f\x6f\x8a\x02\x35\x11\x4c\x71\x29\x84\xba\x2a\x82\x7b\x7c\x94\x59\xb6\x22\x8b\xe0\x00\x9f\x90\xb2\xa1\xda\x22\xf8\xc9\x49\x04\x5d\x97\x6d\x55\x04\x17\xa4\x5b\x4b\x55\x44\x70\x89\x4f\x40\x43\x36\x4d\x11\x8c\xf0\xb9\xa9\x1a\x26\x14\xc1\x31\xee\x4c\x91\x95\xea\x25\xfd\x75\x21\x71\xc0\x2d\x24\x7e\xa2\xc4\x44\xce\x81\x74\x34\x7b\x29\x88\xbb\x07\xd2\xd5\xe4\x27\x41\xc6\x97\xd2\x7b\x1e\x68\x9a\x08\x68\x09\xcc\x4b\xf4\xbc\x44\xc9\x4b\x8c\xbc\x44\xcd\x4b\x4c\x5c\x32\x7c\xf3\x93\xa0\x01\xde\x0b\x93\x9d\xc0\x8b\x23\x1e\x68\x16\x2e\xfe\xf5\xa7\x7d\x21\x6f\xa0\x03\x3e\x9d\x61\x91\x55\xb3\x49\x8b\xf9\x1b\xc1\xa8\xd6\x69\xfe\x8b\xdb\x98\x80\x1f\xcd\xb3\x0c\x77\xa8\x63\xcc\x48\xa7\xfe\x77\x02\xef\x85\x81\x77\xc7\x83\xb6\xc0\x71\x20\x1d\xbc\x3a\xc1\xf7\xfc\x03\x29\xfe\xf8\x41\x10\x25\x84\x85\x9b\xd3\x38\x0b\xc6\x81\xe7\xe2\xba\xc4\x3b\x60\x91\x43\x6c\x55\x21\xd6\x61\x0b\x8a\x45\x30\x16\x94\x3a\xe2\x48\xbf\xbb\x07\xd2\xc7\x99\x41\xc1\xbf\x0d\x7e\x11\x78\x0e\x2f\xa7\xd6\x60\xc4\xb6\xbc\x72\xc1\x3b\xa7\xd4\x80\x5b\x68\x6b\x4b\x38\x90\xb2\x57\xef\x04\x19\x40\x1d\xc0\x0a\xde\x31\x3c\x59\x1c\x87\x59\x30\xdb\xc1\x27\x1f\xc2\xfb\x9c\xae\xe4\x10\x2b\x0c\x89\x55\x50\x4f\x87\xb3\x5a\xfe\xb6\x87\x2a\xd1\xc9\x48\x0f\xd1\x47\x41\xae\x0c\x42\xaf\x0a\x3c\xc0\x8c\x47\x29\xa1\x54\x3b\xfc\xe6\x87\x3b\x41\x14\x41\x6d\xe6\x99\xf4\x45\x30\x9d\x85\x81\x17\x64\x6c\xf6\x04\xea\x1f\x8c\xef\x04\x9e\x68\xcc\x30\x06\x02\x1f\x97\x15\x1f\x4b\xd4\xe0\x75\xd9\xc4\xc6\xaf\x5d\xd8\x50\x8c\xe7\xc6\xc6\xe1\xff\x1d\xd8\xf8\xd8\x02\x93\x22\x44\x95\x9f\x07\x21\x60\x09\x1f\x93\xe6\xb3\x1f\xde\x0a\x7c\x76\x87\x6f\xb7\x0e\x92\x90\x4f\x82\x39\xef\xf1\x67\x04\x39\x6e\x18\x3e\x70\xe9\x0c\x79\xc1\xf8\x81\x73\x39\x3c\x01\x6e\x1c\x27\x5c\x76\x8b\x38\x7e\x1b\x49\x4c\x40\xc4\xa2\xc6\x21\x4a\xbd\x24\x98\x65\x71\xb2\xcd\x73\xac\x5c\xe2\x8e\xc7\x5c\x88\xc6\x19\x37\x0a\xdd\xe8\x0e\xe0\x66\xe4\x7a\x19\x86\x28\x21\xbd\xa5\xa4\x2b\x56\x9d\x73\xe7\x59\x3c\x75\xb3\xc0\xc3\xe3\x4a\xfc\x80\xbf\x7c\xfa\xd0\x04\x17\x3f\x64\x57\x82\x5c\x45\xf7\x87\x16\xba\xd9\x4e\x88\x11\xcc\x24\xce\x1d\xb2\xa0\x49\xfb\xcb\xc3\x7b\x01\x02\x5d\x2b\xf0\xba\x14\x9f\x30\xc7\x67\x0f\x74\x57\x41\x16\x12\xcf\xb7\x1c\x34\x58\x05\xed\xdb\x27\x81\xa6\xff\x1d\xa0\xdd\xd5\x97\xec\x3a\x70\x95\x5b\x7c\x65\x4d\xbe\xed\x63\x76\xf5\x6f\x64\xf6\x1e\x0c\x74\xb2\xcb\x9b\xae\xbd\x4a\x7d\xf6\xbd\xea\x8b\xff\xd4\x5e\xd5\xbd\x51\x35\xf7\xa8\x93\x2e\x2c\x68\x32\x28\xe6\x08\x2b\x73\x6c\xce\xed\x65\x4f\x63\x75\x9d\xc6\x3f\xf4\x30\x8c\xb6\xf6\xee\xf8\xe3\xa9\x27\x28\xe0\x04\x28\x40\xce\xe5\x10\xdd\xcc\x3f\xa8\xe0\x65\xfb\xc3\x86\x2c\x45\xf0\x19\x4d\x8e\xc7\x3c\x28\x65\x65\xb2\x97\x7a\xf3\x24\x41\x51\x76\xb0\xe4\x1e\x5b\xc3\x7f\xb5\xa7\x25\x82\xf6\xda\x7d\x57\x28\xf8\x6a\xf3\x05\x6c\x75\x2d\xe0\xdf\x36\xef\xc7\xee\xea\xe7\x5d\x17\x53\x18\xf0\xb9\xd7\xd5\x8f\xff\x77\xc8\x00\xdf\xf5\xed\xfc\x44\xd0\x56\xac\x06\x52\x52\x14\x22\x2f\x23\x38\x71\x83\x08\x5f\xbd\x0c\xb9\x22\xaf\x93\xcb\x0a\x0f\x54\x82\x78\x8c\x59\x15\x18\x05\x5e\xb5\x1a\x5e\xf9\x1c\x99\x7a\x55\x20\x86\x46\xbe\x3e\x0c\xf0\x0e\xa8\x40\xee\xa1\x05\x6c\x2f\x97\xb6\x18\x4f\x81\xe5\x81\xa1\x54\x84\xef\x1c\xeb\x0a\xcc\x47\xb2\xc1\x8f\x40\x05\x0a\xe0\xa3\x49\x75\x62\x4a\x8d\x1a\x64\xb7\x68\xf0\xdb\x2d\x0a\x67\x88\x32\x1c\x41\x11\xec\x63\x47\x4c\x5b\xa8\x00\xfe\x92\x00\x14\x44\x13\x8e\xaa\x4c\x0a\x7d\x37\x51\x97\x73\x41\xca\xe5\xf7\x43\xbe\xf7\x96\xb2\x74\x57\xb0\x2b\x6b\xf9\x65\x9c\x9c\x8d\x09\xd9\x59\x50\xb5\x54\x5c\x2c\x68\xb3\xef\x3b\xb4\xef\x9f\x78\xcf\x4d\x7c\x46\x60\xe4\xf3\x03\xb4\x58\xec\x86\x28\xe3\x7e\x61\x5a\x01\x2f\x74\xd3\x94\x43\x1c\x0d\xfe\x9a\x72\x47\xd2\xab\x4f\x95\x70\xce\xb8\xa7\x74\x3e\x23\x86\xce\x20\xb7\x91\xc0\xf7\xdb\x20\x8e\x2e\x51\x72\x1f\x78\xc8\x61\xa6\x2c\xcb\xb4\x6b\xa9\x73\x3d\x04\x93\x1b\x56\x71\xf5\x4e\xe3\x0c\xfb\xfb\xcc\xe5\x48\x87\xe7\x69\xa5\x02\x13\xce\xb5\x24\x49\xfe\xcd\x82\x26\xaa\xbb\xcc\xd0\xec\xc4\x9d\xcd\x82\x68\x22\x94\x98\x75\xa5\x9f\xa4\x71\x80\x42\xff\xc4\x9d\xbd\xc9\x82\x30\xc8\x02\xc4\x2c\xb0\xaa\x0d\xc8\x9c\xa5\x8e\x8e\x8a\x57\xcc\xee\x8e\x82\x28\x45\x49\xf6\x92\x95\xe3\x26\xe9\xfe\x98\xd8\x89\x83\xa9\x34\x96\x7a\xd5\x6d\xe0\x56\x04\x68\x11\x06\x69\x86\xa2\xab\xf8\xe8\x1e\x45\x59\x2a\x30\xd4\x4b\xcd\x62\xc0\x2c\x90\x27\xb8\x3c\x39\x8b\x88\x76\xe3\xe0\xd6\x8d\x26\x48\xd8\x4c\x55\x42\x3a\x8a\xa3\x65\xa4\xa0\xfd\x92\xe4\x9c\xb9\xf1\x45\x63\xf8\x63\xa6\xac\xdb\x04\x82\xe3\x73\x70\xbd\x2f\xdd\x1d\x4b\xf9\xd2\xe8\x61\x2e\x29\x48\xdf\xe2\xb2\xe3\xd9\x59\xf2\xf2\x57\x3f\x12\xc4\x9b\x4d\x1b\xde\x1b\x45\x53\x71\xb1\xce\x5c\x31\xcf\xaf\xcd\xa8\x08\x60\x46\x98\xa2\x34\x45\xd1\x04\x25\xd2\x6c\x3e\x0a\x83\xf4\x56\xf8\x44\xfc\x36\xee\xa5\xd7\xd2\xdb\xcb\xf3\x57\x47\x17\x47\xab\x68\x31\x3c\x78\xb5\x7f\xfa\xed\xd1\x21\x98\xb9\x0f\x61\xec\xfa\x03\xb4\xc8\x75\x66\xcc\x86\x6f\x82\xb2\xe3\xd9\xdb\x42\xbd\x44\x63\x14\xe4\x5f\x2e\xb3\x38\x41\x3e\xe1\x84\xb5\x29\x40\xda\xa6\xf3\xd9\x2c\x7c\xa8\xf1\x38\x71\x54\x64\x44\x4e\x31\x0e\x3c\xca\xd1\xeb\x77\x0c\x12\xda\xf9\xaf\xf3\x00\x65\xe1\x83\xb8\xc6\x6a\x46\x8e\xe3\x50\x4f\x69\xe1\xec\xfc\xea\xf8\xec\x74\xff\xb5\xc8\x2f\xda\x73\xfe\x54\xc3\x49\xae\x28\x76\x1c\xe7\x4c\x3a\x0f\xa4\xe3\xf3\x7b\x6d\x6f\x5d\x56\x1a\xac\xcf\x3a\x65\x06\x51\x0c\x65\x93\x03\x49\x0a\x25\x0c\xeb\xf7\xe8\xe1\x65\x12\x4f\xab\x4a\xf3\xba\x49\x83\x8f\x6b\x1d\x06\xe9\x2c\x74\x97\xd7\xc4\xa7\x7a\xf1\xb6\x8f\xa4\x9f\xe7\xb2\x62\xea\x63\xd7\xeb\x72\x73\x8a\xd0\x07\x21\x7b\x7c\x44\xa2\x70\x20\xfd\xa8\x1a\xc2\x4f\xd2\x85\x28\x2e\x40\xde\xca\x9b\xce\x9c\x03\xe9\xdf\xb3\x29\x63\x4a\x04\xe8\x71\x40\x54\x94\xd7\xbc\x3b\x9b\xed\xe0\x2d\x74\x27\xa5\x4a\xdf\x9d\x34\x43\x33\xfe\xe6\x06\x8c\x91\x9b\xcd\x13\x94\x0e\xae\x0f\xa4\x5f\xcf\x7e\xb9\x01\x3e\xf2\xc2\x74\x00\x65\x05\xdc\xbb\x49\x3a\x50\x34\x40\x68\x91\x56\x1f\xec\xf0\xd9\xc2\x42\xcc\x82\x00\x90\xf0\x10\xc0\x03\x29\x98\x83\x19\xf0\xc1\x15\x18\x83\x21\x98\x94\xd8\xfc\x22\x8c\x3d\x37\x0c\x7e\x43\xef\x07\xf9\x95\x9d\x81\x91\xfe\xf9\xfb\x1f\x8a\xed\xca\xb6\xe9\x43\x63\xa4\xea\x63\xd7\x55\x64\x5b\x36\x15\xcf\xf2\xc7\xee\x08\x8d\x55\x5d\x31\x15\xcf\xf0\xcc\x11\xfa\xf3\xf7\x3f\x74\x55\x86\x96\xa2\xea\xa6\x61\xe9\xba\xa5\x42\x53\x81\x03\xee\x8b\x4f\xfc\xcf\xf3\xf1\x78\xec\xcb\xf4\x1f\x7e\x31\x38\x3e\xbd\x3a\xba\x38\x3f\x7b\xbd\x8f\x59\x6c\xc0\x1d\xb0\x41\xf3\x00\x18\xdc\x7b\x90\x55\x81\xf2\xd1\x3d\x0a\xe3\xd9\x14\x45\x19\xc7\xd8\x97\x9b\x61\xfe\xe5\x32\x7c\xbf\xc5\x03\xeb\x63\x5f\x33\xa0\x3c\xb6\x6c\xe4\xd9\xb2\x6e\x69\xae\xe6\xcb\x1e\xf4\x0d\xd7\x95\x7d\x5b\x36\x7d\xa4\x20\x4b\x57\xfe\xfc\xfd\x0f\xdb\x32\x6d\x55\xb6\x55\xd3\xd4\x6d\x4d\x51\x35\xdb\x1a\x70\x87\x95\x01\xde\x13\xf3\xdc\xce\xb1\x7d\x76\xab\x0c\xe2\xe8\xcf\xdf\xff\x70\x5d\xcb\xb4\xa1\xe9\x1b\xba\xea\x7a\x9a\xa2\x23\xcb\x56\xfc\x91\x6e\x78\xbe\xa6\x2b\xbe\x6e\xe8\x9e\x07\x91\x8e\xe0\x9f\xbf\xff\x61\xda\xa6\x65\x68\xa6\x69\xa9\x50\x57\x35\xc5\x86\xb6\x3c\xe0\x2e\x99\x89\x50\x6d\x42\x98\x07\x24\xee\x02\x79\xf1\x74\x8a\x22\x1f\xf9\x44\x39\xe2\x72\x55\x30\x50\x74\x1f\x24\x71\x84\xff\x96\xb8\xf7\x20\xaa\x82\x3b\x4b\x62\x7f\xce\xec\x47\x3a\x31\x35\x82\xa6\x32\x86\x16\x1a\x7b\x96\x09\x2d\x17\x8e\x10\x1a\x19\x96\xee\xa2\xb1\x8b\x7c\xcf\x30\xcc\x91\xec\x59\xc8\x96\xff\xfc\xfd\x0f\x68\x40\x59\x96\x2d\x13\xca\xb6\xa9\x9b\xb6\xae\xdb\x03\xee\xbc\xec\xff\x3d\x08\x7a\x46\xae\xe3\xc9\xb6\x47\xb6\x2d\x9b\x32\x84\x96\xe6\x8f\x10\xb2\x46\x86\xec\xea\xbe\x2e\x1b\xd0\xd7\x14\xdf\x18\xd9\x32\x1a\x43\x57\xfd\xf3\xf7\x3f\x0c\xd3\x56\x15\xcb\xb6\x74\xa8\x29\xaa\x6c\x42\xa8\xea\x03\xee\xea\x36\x41\x5d\x68\x4a\xbb\xf0\x54\x81\xa2\x81\xa6\xb8\x0a\x6c\x5d\x38\x24\xa2\xf5\x9f\xbf\xff\xe1\x9b\x9e\xef\xd9\x86\xaa\xe9\xee\x48\x46\x96\x22\x23\xdd\x33\x74\xa4\x1b\x86\x62\xdb\xd0\x36\x3d\x64\xe8\x48\xd5\x46\x98\xa2\x86\x61\x5b\xa6\xa5\x9a\xb2\xac\xaa\x9a\xa6\x5b\x86\x3a\xe0\x72\x61\x82\xc3\xc2\x44\xc9\xf7\xff\x80\x56\xc1\xf9\x97\x57\xfb\x17\x57\xc3\xab\xfd\x6f\x87\x07\xaf\x2f\x86\x57\x67\x67\xaf\xaf\x8e\xcf\x07\x95\xaa\x76\x4f\xd5\xe3\x83\xb3\xd3\xb2\xde\x97\xd5\x8a\x07\xaf\xcf\x2e\x8f\x7a\x2a\xfe\x8f\x22\x0f\x20\xfd\x33\x1f\x21\xff\xdd\x07\x0d\x39\x52\x8e\x4e\xaf\x2a\x50\x29\x9d\x6d\x2e\xcf\xf7\xf1\xe2\xbd\x8d\xe3\x14\x51\x7d\x5f\x1c\x8d\x83\xc9\x3c\x21\xfb\x78\xa1\xd5\x6b\x53\x8e\x7b\x7b\x92\x72\x3e\x9a\xa1\xc8\xc7\x02\x7b\x1c\x91\x7a\xe8\xe3\x8c\x88\xc7\x1c\x0d\x67\xcb\xc5\x63\x22\xca\xe3\x63\x38\xd7\xfe\xa5\x5c\x46\xcc\x0a\xdd\x09\x92\xb8\x0a\x32\xaa\xf0\x95\xd8\x20\xf0\x55\x51\x56\xc7\xc4\x97\x15\xdc\xb4\xb0\xd8\x8b\x8b\x2f\xab\xd4\xec\x6c\x33\x78\x0f\xc2\xff\x1c\xaf\x69\x2b\xa8\x5b\xa1\xaa\xa6\xac\xc9\x6b\x95\x8a\x4b\x79\x4d\x53\xff\x97\xd7\xfa\x78\xad\xc4\xcd\x26\xbc\xa6\xad\x68\x33\x78\x0f\xdc\xae\xe3\x9b\xa8\xd5\x73\x56\xd3\xc8\x9e\xeb\x69\xf8\x00\xb2\x8d\xb1\x6b\x1a\x86\x3b\x76\x15\x7f\x6c\xea\x06\x84\x9a\xe9\x23\x59\xf6\x6d\x1f\x6f\xf9\xaa\x06\x0d\x59\x37\xa1\xa1\x29\xa6\x2d\xcb\xb2\xac\xae\x75\x80\x97\xd4\xd3\x8d\xb5\xd9\x4f\x37\xd7\x64\xbf\x4a\xc5\xa5\xec\xa7\x5b\x7f\x31\xfb\x95\x88\xa8\x54\xaa\xa1\x62\x58\x45\xd7\x93\x79\xa5\x9c\xc8\x26\xbc\x52\x41\x7d\x1f\xaf\x78\xbd\xbc\x42\x8d\x0e\xa7\xe9\xe4\xcf\xdf\xff\xb0\x46\x2e\x1a\x21\x88\x6c\x55\x75\x75\x73\x64\x8f\x35\x1d\x8e\x7d\xdb\x36\x65\xc5\x55\x5d\xc3\xf4\x65\xcf\xf6\x47\xda\x18\xb3\x96\x01\x4d\xc5\xd0\x55\x03\x1a\x96\x21\xcb\xa6\x29\xdb\x9b\x08\x7c\x64\x68\x62\xc0\x4c\xdc\x80\x38\x37\xf2\x39\x14\xf9\x1c\x89\x10\xe5\x72\x21\xca\x70\xad\x38\x61\xcb\x14\x90\x0a\x9e\x4b\x65\x1b\x37\x88\xb8\x38\x0a\x1f\x38\x12\x84\xd8\x73\x53\xc4\x1a\xa4\x80\xd5\x4f\x69\x83\xdb\x87\xd9\x2d\x8a\x52\x2c\x04\xa4\x6b\x21\x00\xfa\x50\x56\x54\xcf\x36\x2d\xc5\x30\x54\xcb\x83\x9a\x6c\x1a\x9a\xe5\x99\x8a\x6c\x8d\x75\xe4\x2a\xb2\x37\xf2\x74\xc5\x23\x32\x92\x25\xdb\xba\x0a\x0d\xd3\xb0\x35\xcb\x34\x15\xdb\xdc\x04\x01\xa7\x05\x02\xa2\x38\xe3\x58\x9e\x08\xee\xc3\x6d\x90\xa1\x74\xe6\x7a\x88\x23\x72\x8c\x4f\x60\x9f\xf7\xc2\x9e\xdf\x81\x18\xf8\xfe\xd8\x34\x65\x43\xb6\x75\x7d\x34\xb2\x3d\xd3\xd6\x7c\xc5\x37\xac\xf1\x48\xf1\x4c\xd7\xd4\x46\xb6\x36\x46\xbe\x05\x47\x16\x5e\xef\xd0\x36\x2d\x4b\xb7\x14\x08\x4d\xc5\x54\x74\x0d\x1a\x0d\xea\x54\x14\x67\xdc\x7b\x30\xeb\x82\x81\xda\x63\x71\xcc\xde\x89\xbb\x25\x06\x4f\x9c\x77\x8b\xbc\x3b\x0c\x0d\x34\x3d\x7f\x04\x75\xcd\xf0\x2c\xa4\x59\xc6\xd8\xd5\x15\x19\x5a\x9a\x85\x0c\x5b\x87\xaa\x65\x8d\x15\xa4\x8d\x47\x06\xbe\x69\xc8\xb6\xa5\x9b\x96\xa9\xe9\xba\x65\x6b\x86\x66\xc9\xd6\x80\x63\x56\x56\x1c\xb5\xb2\xe2\xa8\x95\x55\x65\xc7\x31\xd6\x17\xae\x8c\x75\x85\x2b\x63\x4d\xe1\xca\xfc\xab\x85\x2b\x6a\x30\xc6\x9d\x30\xd4\x52\x5b\x32\x8e\x1a\x93\xe1\xf3\x69\x46\x35\x20\xf4\xa4\x63\x88\x9f\xc6\x51\x90\xc5\x49\xe5\xb4\x2b\x4f\xb4\x5b\x37\xe3\x1e\xe2\x39\x3e\x10\xc3\xf8\x81\xae\x33\x7c\xff\x5e\x63\x6b\x1b\x94\xaf\xbf\x9f\xbf\xc3\x99\x4f\x92\xbc\x8c\xd5\x92\x97\x5f\x65\x50\xa6\x33\xe2\x88\xae\x83\xcb\x95\x1d\x5c\xae\x36\x2a\x0e\x48\x5b\x53\x2c\xd9\xf4\x65\x5d\xf3\x2c\xdb\xf3\x90\xa5\xaa\x9a\x6b\xa2\x91\x06\xc7\x48\xf1\x14\xd5\x1e\xc9\x63\x7c\x1a\xe2\x8b\x26\x5e\xed\xaa\x09\x0d\x5d\x57\x75\xd3\x56\x0c\xbc\xde\x57\x58\x32\x55\x98\xd5\x92\xd7\x66\x56\xab\x8f\x93\x9a\xcc\x6a\xf5\x61\xb2\xc1\xac\x96\xf2\x17\x33\x2b\x55\xc1\x73\x2b\xb0\xfe\x1c\xec\x63\x75\xb7\x5b\xc1\x3e\x15\xe4\xf7\xb1\xcf\x55\x95\x7d\x88\x34\x38\x62\xef\x73\x5c\x1e\xc9\xb0\xe0\x1a\x73\x0c\x55\x53\xf5\x90\xec\x19\x96\xa2\x2a\xae\x22\x9b\xae\x36\x1a\xb9\x86\x2d\x1b\xea\x48\x93\x15\xd9\x77\x8d\x31\xc4\x97\x6e\xa8\x28\xd0\x50\x74\x68\x5b\xb2\x69\x5b\x9a\x21\xe3\x63\xb2\x87\x6b\x36\x91\xb6\xec\xf5\x85\x7d\x7b\x5d\x61\xdf\x5e\x53\xd8\xb7\x9f\x41\xd8\xff\x1f\x65\xa0\x34\xfa\xe8\x02\x93\xb2\xd7\x15\xde\xa7\x8e\xcf\x39\x97\x9a\x6f\x62\xb1\xe0\xe5\x0f\x87\xa7\xf8\x84\x9a\xa7\xc8\xe7\x46\x0f\x64\xb3\xcb\x1f\x6b\x39\x21\x4f\xe1\x71\xc7\x4a\xa4\x20\xfe\x52\xe4\x66\xb1\x4f\xf7\xc1\x64\x1e\xa5\x5c\x10\xf5\xdc\x1b\x52\xa9\xec\x89\xed\xb2\x29\x57\xe1\x08\xbc\xbd\xa6\x54\x55\x99\x16\xd7\x8f\xfc\xe4\xdc\x3f\x3f\x26\x1f\x19\xb7\x5f\x97\x8c\xac\x34\x6e\xa0\x79\xc1\x63\x59\x45\xad\x57\x51\xf3\x82\x9b\x25\x6b\xa4\xac\x55\x20\x52\xed\x41\x24\x16\x51\x73\x54\x76\xa0\xb0\xff\x85\x9a\x73\xd3\xc2\xa2\xa7\x8e\x2f\xc4\xd6\xb8\xc4\x1d\x67\xb8\xaf\x98\xa9\x93\x25\xee\xdd\x2d\x8a\xc8\x81\x93\x1b\x1b\x05\x19\xe0\x82\x8c\xbb\x75\xc9\xf1\x35\x42\xdc\x38\x89\xa7\xdc\xfe\xdb\xe3\xbc\xcb\x10\x25\x58\x18\xcc\x02\x0f\x03\x78\x1e\xc7\xe1\xdf\x84\xc2\x8e\x6d\xc6\x7e\xd2\x9d\xcd\x5e\x7d\x67\xbb\x72\x0e\xa4\x9f\x3e\x6a\xc2\x95\x08\xc6\x35\x89\xaa\x13\xad\x4d\xf9\xce\xf0\x75\x5d\xf6\x55\x6b\x6c\xf8\x96\x61\xd8\x9e\x6a\x41\xa4\x2b\x23\x45\x81\x23\x75\x34\x32\x7c\xa8\x8f\x47\x0a\xf2\x20\x39\xae\x34\xa8\x6b\x9a\x09\x35\x4d\xd7\x0d\xd9\x36\xa1\x3a\xe8\x21\x5e\x43\xd2\x1b\xae\x01\xd7\x38\x4e\xa6\x6e\xc6\xa0\xd2\x90\x06\x0d\x38\xb6\x2d\x4d\xf5\x46\xaa\x0b\x4d\x4f\x96\xc7\x23\xe4\x59\xc8\xd5\xac\x91\x87\xf4\x31\xf2\x0d\x13\xe9\xb8\xaa\xac\xd8\xb6\x05\x4d\x55\x97\x0d\x03\xca\x58\xf8\xec\x85\x8a\x8d\x11\xe0\xa5\xca\x3c\xa3\xc0\xa4\x0a\x1b\x7b\xee\x25\x12\x50\xb7\xaa\xc5\x72\x3d\xc3\x92\x47\x70\xac\x9b\x63\xcd\x70\x6d\x43\xf1\x15\xcd\x1f\x99\xe6\xc8\x56\x3c\x7d\x3c\xf6\x2d\xa4\xf8\x86\x8d\xef\x33\x0a\x34\x6d\x05\x2a\xb6\x0a\x6d\x45\xb6\x6d\xd5\x30\x94\x01\x47\xdf\x0b\xb9\xd3\xb3\xc3\xa3\x7e\xb5\xcb\xfa\xd7\xde\x75\x6f\xbd\xeb\x6d\xc3\xc6\x7f\x52\xe5\x52\xc1\x7d\xfa\x1c\xe7\xba\xf1\x24\x1d\xc9\xca\xe5\x76\x7d\xad\x02\x1e\x33\xd2\xb7\x49\x3c\x9f\xf1\x37\xe0\x9a\x27\x2f\xee\x3c\xe0\xdd\x10\xe1\x7b\x27\xfe\xff\x8e\xef\x46\x13\x12\x81\x2e\x89\x43\x94\x7f\xe3\x81\x06\xa8\xf5\x0e\x6e\xe6\x26\x81\xbb\x13\xa2\x7b\x14\xf2\x80\x57\xf8\x1b\x80\xc0\x35\x33\x4d\x48\xe2\x0f\xb8\x4a\x61\xa8\x10\xee\x84\x93\x1d\x83\x2f\x7f\x42\x85\x74\xc1\x3a\x8f\xe2\x08\xf1\x00\xd7\x76\x13\x9f\xd4\x0a\xbc\x3b\x12\x8b\x19\xa8\x78\xc0\x03\x06\x20\x35\x8e\x66\x1d\xbb\x89\xbf\x33\x0a\x63\x5a\xc0\xa7\xb7\xee\x0c\x77\xe5\xc5\xd3\xd9\x9c\xc6\xce\x4b\x83\xdf\x70\x89\xa9\x14\x5d\x53\xe3\x8f\x4a\x7b\xf2\x10\xc0\xdf\x80\xac\x52\x84\x3e\x66\xfc\x0d\x48\xca\x92\x71\x1c\xe3\x0e\xeb\xf3\xf9\x18\xee\x68\x95\xf9\xa4\x53\x3c\xa5\xda\xfc\xf0\xb4\x76\x3e\x24\x2e\xc6\x71\x5c\xa0\x2b\xb8\x27\xd8\x4c\x53\x94\x64\xec\x6f\x08\x1f\xae\xa8\xdd\xc9\x55\x12\x4c\x28\xd6\x49\x70\x23\x3a\xa3\x20\x1a\xc7\x3b\x5e\x90\x78\x04\x55\x6c\x52\x8a\xc2\x28\x97\x9c\xc7\x69\x40\x2d\x4d\xf8\x2c\x9e\xed\x24\x2c\xb0\xa3\x17\x26\x97\xb4\x6a\x38\x21\x64\xf3\xc2\xe4\x78\x7c\x36\x43\x51\x7b\x22\xd6\xf2\x89\xd0\xfa\xe4\x41\x0e\x6f\x25\x15\xdb\x15\x06\xc2\x25\xb3\x7f\xc1\x50\x53\xe7\x94\xb6\x87\x11\x61\x39\x26\x0d\x9f\xf6\xd5\x61\xec\xe0\xc5\xd3\x51\x3c\x8a\x3f\x62\xe4\x10\xa4\x51\x6b\x1f\xbe\xfa\xee\x53\xdb\xdd\x08\x81\x4b\x00\x99\x3d\x4e\xc9\xa3\xac\x3d\x31\xd0\xc5\x78\x22\x54\xcf\x7f\xdf\x80\x6b\xc2\xd5\x2f\x63\x8c\xf8\xdc\x9e\xa5\xca\x53\xa3\x79\x10\xfa\xd4\x87\xb6\x9f\xa7\x22\x10\x80\xb0\x17\x1f\x6d\xf7\xa9\x0e\x84\x74\x54\x5a\x81\x91\xca\x0b\xcf\x7a\x08\x81\x0d\x16\xad\x90\xbd\xba\x3c\xc3\xc9\x8e\x96\x53\xb7\xb0\x33\xca\x07\xe5\x6f\x80\x4b\x3f\x1d\x47\xb3\x39\x9b\x67\x7b\x36\x35\xc7\x3a\x7e\xea\x7e\x64\x21\x7c\x01\xaf\x29\x64\x5d\x57\x02\x8a\x32\x22\x10\x1e\x25\x4e\x9b\xfc\x0d\x98\x81\x6b\x9e\xce\x85\x27\xea\x13\x3a\x7d\x2f\x4c\x0e\xca\x5f\x25\x82\x97\x39\x98\x75\x00\xb7\xb4\x7a\x8e\xf4\x72\x9c\x1a\xd2\x97\xe9\x21\x1a\x38\xc6\x48\xf4\x29\xae\x3e\x63\x89\x77\xf0\xd3\x72\xc7\xc1\x2e\x6a\x2c\x6b\x40\x81\xbe\x0d\x7c\x9f\x6c\x0f\x57\xeb\x50\xb7\xc7\x01\xb2\x46\x55\xc2\x2b\xe5\xf9\x52\x72\x1e\x57\xe5\x3b\xae\xc6\x75\x78\xaf\x62\xef\xfc\x57\xf1\x64\x42\xb6\x67\x7c\x64\xe5\xd8\x2f\x8f\x2e\xfa\x37\x81\xa7\x72\x96\xb0\x83\x0a\x16\x7f\xf1\xb5\x03\x8d\x4e\x95\x16\x91\x80\x19\xad\x12\x4c\x01\x22\x73\xd7\xbf\x78\x71\xb4\x93\xc7\x29\xab\x6e\x0e\xe8\xa3\x17\xba\x53\x22\x06\x14\x24\xac\xb5\xaa\x75\xc3\x4e\x97\x82\xb3\x73\x0f\xa0\x3a\x87\x1d\x84\x71\xca\x0e\x44\xfa\x97\x5a\x39\xfb\x68\x55\x46\x2c\xc0\x67\xc9\x1c\x55\x58\x89\x36\xd8\xe0\x6c\xa0\xd8\xa5\x46\x9d\x37\xcc\x30\xe2\xba\x3c\xe6\xc7\x60\x48\x99\xc3\xdd\xc9\x2f\xfd\xfc\x0d\x98\xf4\x32\x66\x9f\x8f\x66\x07\x0b\xf5\x56\x5d\xb1\xe9\xf5\x0a\xb9\x3d\xbb\xde\xcd\x02\xe4\xa0\x37\x82\x2f\x34\x4c\x51\xc7\xc4\x43\x50\xce\xed\x35\x21\x78\x0d\x6c\x90\xfb\x8b\xc1\x8a\xf9\xe9\xad\xc6\x53\xc3\xf0\xcb\xc3\x7b\x41\xa5\x66\xde\x55\x9b\x50\x2d\xf7\x1f\xab\xf8\x87\x91\x82\xc2\xe7\xcc\x00\xbc\xcb\x03\x63\xb5\xdb\x57\x26\xe1\x43\xe6\x00\x7f\x3e\x44\xf7\x82\xb8\xa8\xd8\x9d\x92\x2e\xcd\x4e\x87\xaf\xc2\x9e\xd6\x06\xfc\x8c\x07\x76\x61\xac\x2c\x03\x28\x37\xc1\x85\x90\x54\x82\xb0\xa8\xa5\x00\xa8\xf4\xf9\xad\xc1\xdc\x3b\x0e\xaa\x45\x51\x6b\xc2\x30\x9f\x31\x2c\x8b\x8c\x7c\x11\xe7\x46\xbb\xd0\x04\xb0\xc0\x08\xb4\xba\xcd\x76\xa1\xdd\x6d\xb7\xab\xc8\xe0\xfc\xc9\x86\xbb\xd5\xf9\x28\x05\x85\x0b\xa4\x29\x4a\x9f\x15\x32\xb4\x8b\x3a\x6a\x69\xf8\x4b\x3c\x1b\xa9\xc5\xb6\xd6\x65\xf9\xab\xe8\xe0\x61\xb5\xe9\x2f\xe9\xd5\x58\x66\xdb\xab\x98\x55\xdb\x5e\x37\x7a\x8a\x5d\xef\x1a\xff\x12\x40\xac\x26\xcb\x2a\xf6\x13\x78\xf6\x3c\x89\xfd\x0a\xd3\xaa\x72\x93\x6b\x55\x58\x25\xaf\x52\xb0\x94\xaa\xd4\x19\x57\x55\x81\xa2\x35\x81\x54\xb5\x06\xe3\xaa\x3a\x50\xf4\xbe\x29\xa9\x46\x8b\x71\x55\xb3\xc9\xb8\xaa\xd5\x62\x5c\xd5\x6e\x32\xae\x26\x03\xa5\x70\x16\xd5\x60\x37\xe3\x6a\x4a\x37\xe3\x6a\x2a\xf8\xf5\x59\x18\x57\xd3\x5a\x8c\xab\xe9\xab\x19\x57\x33\x2a\x8c\x5b\x3a\xb8\x9a\x5d\x8c\xab\x59\xe0\x70\x3d\xc6\xd5\xec\x65\x8c\xab\xcb\x7f\x0b\xe3\xd6\x5c\x72\x61\x6b\x13\x56\x5a\xde\x06\xba\xca\x68\x84\x45\x9d\xca\x04\x8b\xef\x5a\x21\x78\x28\x85\xaf\x81\xae\x03\xb5\x70\x46\xd0\x8d\x1e\x6f\x03\xb3\x9b\xfa\xba\x05\x3e\x02\x15\xf4\xf9\x7e\x2c\xa7\x3e\xe9\xd8\xc6\xf2\x22\x91\xcc\x54\x98\x17\x1a\xfd\x1e\x03\xc4\xc7\x01\x82\x0f\x40\x01\x9d\x7e\x03\x40\x2d\x7c\x88\x0c\x05\x7c\xbb\x4e\x35\x15\xdc\x51\x97\xa2\xde\x6a\x5d\x04\x31\xb4\x16\xfa\x0d\xc6\xae\xb9\xa4\xdd\x41\x01\xc3\xe8\xa0\x80\x61\x02\xb5\x58\xc3\x46\xcf\xc1\x61\xf4\x1c\x1c\xa6\x0c\xde\x3e\x99\x02\xe4\xe4\x85\x0d\xa8\x73\xb1\x30\x1f\xd9\x54\x4a\x12\x15\xdc\x67\xaa\xd5\x5d\x04\x2f\x0a\x53\xcb\xef\x12\x1b\x31\x3d\xe9\x4c\x6f\x32\xb7\x99\x6f\x6e\x6a\xb1\x61\x9b\x66\xcf\x66\x50\x54\xb0\x3a\x70\x6b\xda\x40\x2d\xf6\x36\x4b\xee\xc6\xad\x55\xdb\xb5\xd5\xc2\xd9\xcc\x52\xc0\x9b\xcf\xf2\xa6\xb1\x2a\xa7\xaa\x6a\x15\xdd\x6a\xe0\x8b\xf5\xb6\x21\x4b\x5f\xb6\x0d\x59\x46\x6d\x1b\x5a\xf5\x3a\xb7\xf6\xbe\x44\x46\x36\x5b\x04\xb0\xac\xe5\xbb\x8b\x65\x77\x78\x32\xd9\x32\xd0\x8a\xdd\xc5\xee\x39\x5b\xec\x9e\xb3\xc5\x56\xc1\x0f\x40\x03\xca\x93\x77\x17\x5b\x2b\x58\x57\x2b\x76\x17\x5b\x5f\xba\xbb\xd8\x06\x78\xb5\x62\x3f\x20\xd5\x4c\xf0\xdb\x86\xdb\x46\x15\xbf\xb6\x55\x65\x79\xd2\xa1\x0d\xbe\x03\x50\x2d\x24\x74\x4d\xc9\xeb\x42\xb9\xee\x58\x46\x9d\xaa\xf0\x25\x6c\x36\xdb\x71\xe7\x7e\x90\xed\x84\x79\xb0\x1c\x4d\xed\x1d\x99\xb8\x40\x91\x0b\x02\x71\x75\xaa\xdc\x3c\x33\xa9\xf8\x21\xf6\xb8\x37\x66\xed\x98\x09\x79\xd5\xc2\x4d\x37\x5b\xd3\x51\x59\xcd\x5b\xaa\x95\x41\x98\x52\xf4\x40\x7a\xfb\xfd\xaf\x58\x1a\xfe\x1e\x64\x52\x90\xb2\x57\x37\xcc\xd1\x87\xe8\x5e\x2c\xa0\xeb\xf0\xd8\xca\x2a\x1e\x5b\xac\x9a\xd6\xdb\xbf\xd2\xee\x1f\xcb\x76\x9b\x0e\x40\x2f\x1f\x74\xee\xb7\xd9\x34\x24\x5e\x1c\xaf\xf1\x1a\x48\xa5\x8a\xc2\x28\x9f\x38\x75\xfd\x2e\xd0\x9b\xda\x07\x42\x43\xc1\xc0\xbc\xfa\xb3\xd2\xab\x3f\x7f\x70\x23\xc9\x02\x40\xd3\x8b\xb5\xa2\x62\x02\x99\x54\x84\x46\x39\x8a\xe6\x53\x89\x06\x45\xa9\x86\x87\x6a\x13\x77\x59\xfb\x77\xaf\x8e\xaf\x8e\x2e\xcf\xf7\x0f\x36\x6c\x77\x71\xf4\xc3\x9b\xe3\x8b\xa3\xc3\x02\x5a\xd8\x85\xcb\xa5\xde\x6c\x79\x53\xbb\xc2\x5a\x4b\x7c\x5b\x72\xfc\xda\x72\x9b\xb3\x36\x81\x74\xbd\xf9\x51\xbc\x1e\x9f\x0f\xcf\x2e\x48\xc8\x99\x36\x55\xea\x0a\x1f\xc0\xbf\xa0\xb6\xa6\x53\x14\x65\x3b\xb9\xa5\x0d\x16\x18\x7d\x37\x8c\x23\x94\x17\xed\x4c\x63\x1f\x75\xd0\x98\xed\xa9\x6d\x0e\x6b\x07\xcb\x12\x7b\x97\xb5\x50\x6a\x97\x58\x39\x61\x4c\x71\x01\xfc\x20\xc1\x27\xc8\x3d\x4a\x07\xd7\xfb\xd2\xf0\x47\xb0\x2f\x7d\xf7\x1a\xec\x4b\xe9\x04\x44\xd2\x99\x0e\x22\x69\x7a\x07\x2e\xa4\x5f\xef\x5f\x83\x0b\xe9\x64\xf2\x3d\xb8\x90\xbe\x9b\xfe\x02\x2e\xa5\x5f\xc0\x85\x14\xfd\xfa\x23\xb8\x90\xfc\xab\x7b\xb0\x2f\x1d\x7d\x07\x2e\xa4\x38\x7b\x87\x3b\xf8\x0e\xec\x4b\x73\xb0\x2f\xfd\x78\x0a\xf6\xa5\xef\x13\x10\xe1\xee\x2e\xa4\xb7\xbf\xee\x83\x0b\xe9\x5b\x5d\x07\xfb\xd2\x4b\xdc\xfe\xe3\xc5\x39\xd8\x97\xa2\x43\x70\x21\x1d\x9c\x18\x78\x98\x3b\x1b\x5c\x48\x3f\x0e\x35\x70\x21\x9d\x1f\xdd\x82\x7d\xe9\x5d\x08\x2e\xa4\xef\xbf\x3f\x00\x17\xd2\xe8\xe4\x1e\x8c\xa4\x3b\x70\x2c\x5d\x82\x0b\xe9\xd8\xfe\x0d\x5c\x48\xbf\x1d\xbe\xbc\x01\x69\xf6\x10\x62\xf8\x79\xa9\xd0\x61\x5f\x0f\xa3\x09\x3b\x29\x76\xfe\x79\x70\x76\x72\xfe\xcf\x9b\x4f\x33\xa6\x40\x1a\x24\x28\x74\xf1\x94\x77\x43\x34\xce\x06\x9a\xfa\xcf\x85\x54\x3e\xa0\x74\xb5\xcc\xd0\xc7\x6c\xc7\x0d\x83\x49\x34\xa0\x81\xa6\x58\x83\xdc\xef\xb3\xab\x0d\x96\xa5\xd2\x5b\xd7\x8f\x3f\x0c\x64\x4e\x82\x7a\x82\xa6\x9c\xcc\xc9\xdc\xbd\x9b\x08\x3b\x3b\xe4\xd4\xc0\x5d\x14\xaf\x43\x3b\x65\x83\x1d\x2f\x0e\xe3\x44\xdc\x1d\xc5\x89\x8f\x92\x1d\x32\xbd\x41\x1a\x87\x81\xbf\x9b\x25\x6e\x94\x62\xfa\x0d\xc8\x5f\xa1\x9b\xa1\x1f\x85\x1d\x09\x26\x68\x2a\xd2\x8f\x74\x8a\xb4\x29\x27\x29\x29\x87\xdc\x14\x81\xa2\x5d\x51\x94\xf7\x4e\xc6\x1a\xfc\x03\x9a\xf6\xc8\x57\xeb\x85\x4b\x40\x2d\x6b\x01\x8e\xb5\x15\x19\x52\xe8\x0b\x53\x07\x4a\x38\x8e\x93\xd8\x7b\x5a\x17\xc2\x08\x7e\xa9\x1a\x73\x30\x72\x53\x14\x06\x11\x5a\x48\x15\x55\x5d\x57\x23\x9f\xfa\x7a\x0d\x82\x08\x57\xa7\x4f\x68\x0b\x29\x41\xe3\x04\xa5\xb7\x3b\xa3\xac\x93\x11\xbc\x79\x92\xc6\xc9\x80\x6c\x22\x28\xd9\xed\xea\x63\xf7\x16\x05\x93\xdb\x6c\x00\x65\xf9\x9f\xbb\xf7\x28\x21\x21\x4e\x18\x0b\x64\xf1\x6c\x97\x61\x4d\x96\x4d\xc5\x55\x57\x0d\xc8\x71\x5c\x2e\xdf\x74\x7c\x05\xdc\xea\xe6\x52\x3a\x0b\xa2\x08\xf3\xc2\x74\x3d\xce\xce\xe2\xd9\x40\xb3\x66\x1f\x17\x52\xc7\x53\x57\x57\x17\x53\xf7\xe3\xce\x87\xc0\xcf\x6e\x07\x9a\xfe\xcf\x6a\x2b\xca\xe3\xeb\xe2\x7e\xb7\xec\x47\x91\xe5\xd9\xc7\x05\x6e\x78\x1b\xa7\xd5\xc9\x50\x6c\x30\x79\x8e\xeb\x90\xed\x2a\xc0\xa8\xa4\x13\xfe\x86\xa4\x8b\x13\x05\x1a\xa4\xf2\x1b\x27\x11\x48\x40\x6c\x11\xfc\xdb\x49\x04\x4b\x85\x8a\x99\x3b\x73\x22\xe4\x7c\x1a\x57\xfd\x83\x07\x45\x90\xb3\x56\x48\xb7\x5a\x60\x31\xf6\x77\xfa\x8d\xeb\xdd\xa1\xc8\x3f\x74\x33\x17\x17\xb3\x48\x62\x6f\x4f\x38\xda\xa6\x12\xbc\xac\x1d\x62\x6e\x83\x0e\x8b\x36\x5d\x1d\x9e\x9f\x9d\xbd\xde\xa0\x2f\x76\xc8\x5f\x02\xee\xd5\xd9\xe5\xd5\x25\xe0\xf6\x4f\x0f\xb9\xbc\x33\x0e\x77\x76\xc9\x2f\x6e\x16\x65\xb4\xb1\x0c\xad\x19\x6e\xac\x14\xcb\x97\x69\xca\xf2\x68\x5e\x85\x3f\x6d\x1e\xd5\xab\x8c\xbb\x50\xc4\xfd\xa2\x1f\x32\x72\x36\x1e\x7d\x9c\xb9\x91\x2f\x64\x54\xa5\xb6\x34\x90\x57\x2d\x84\x03\x91\x9c\xfc\x80\x84\x37\x0c\x52\xda\x0b\xf2\xf7\x78\x3f\xfe\x10\xf1\x03\x9e\xbe\x0c\x54\xe3\x35\x24\xa8\x1e\xb0\x81\x0a\xd1\x32\x15\xa1\xb3\x04\x15\xea\x75\x60\x76\x47\x0a\x28\x87\x07\x59\x25\x7a\x00\x39\xa0\x7d\x37\x73\x31\x24\xde\x6d\x10\xfa\x09\x8a\x44\x81\xcf\xcf\x85\x57\x6e\xe4\x87\x88\x08\x11\x8d\xa2\x2a\x74\xd1\xba\xd4\xc0\x97\x00\xb1\x0c\x2d\x31\x0f\xeb\x8a\xfc\x30\x60\x8a\xfc\x4a\xd4\xb7\xfc\x7a\xa1\x81\x0c\x01\x08\xea\x37\x5d\xb1\xae\xd0\x17\x4b\x75\x7e\xaf\x46\x80\x29\xeb\xf3\x5b\x55\xc1\x14\xd1\xe4\x24\xf6\x51\x48\x3d\xbc\x2b\xcc\x91\xb5\x42\xbe\x95\xa8\x94\xc8\x08\xc8\x77\xb2\x85\x28\xf0\x5e\xb3\x69\xe9\x8a\xdc\x6e\xda\xe4\xa7\x5b\x82\x55\xa2\xa4\x25\xec\x24\xf0\x77\xe8\x81\xb0\x43\x0d\x14\xda\x61\xb2\x46\x87\x71\xf4\x3d\x7a\x98\xcf\x48\xfc\xf3\x45\xeb\x76\xdc\x54\x7e\xd8\xeb\xa8\x3a\xc8\x2b\x0c\x5e\xca\x00\xe2\x3b\x6d\x8b\xf5\x3a\x55\xbd\xdd\x8b\xa2\x1d\xd1\x44\x6b\x5c\xd8\x4a\x76\x2c\x62\x29\xd7\xc4\xdc\xab\x38\x14\x90\xe4\x07\x29\x79\x26\xde\x23\x04\xc7\xe2\x41\x71\x95\xcd\x3f\x75\x5f\x3c\x18\xb9\xe9\x38\x84\x88\xf8\xd3\xfc\xf8\x0e\xaf\xcb\xb4\x08\x85\x9a\xff\x5d\xeb\xe0\xec\xd7\xb9\x80\x24\x82\xc0\xbe\xeb\x66\x07\xf4\x5b\x5b\xd5\xb5\x2e\x2e\x16\x21\xca\xb8\x00\xd5\xc3\x6c\xd4\x42\x6b\x88\x9f\x16\xd1\xe4\x2c\x3a\x8e\x82\x0c\xff\x5d\x65\x91\x3c\x02\x41\x63\x51\x0a\x48\x5c\xd4\x76\x26\x24\x7e\xaa\x8e\xea\xbc\xa8\xfe\x5a\xe4\x3c\x92\x2f\x5e\x24\xdd\xa1\x87\x83\xd8\x47\xc4\x5b\x3e\x4d\xa4\x23\x2c\x5e\x88\x25\x9f\xbf\x28\xfe\x04\x9d\xc3\x67\xe2\x6e\x99\x86\xb6\xd1\xd7\x6b\x34\xce\xf6\x93\x24\xfe\x20\x66\x35\x88\x64\xd2\xa4\x36\xfc\x0b\xd6\x84\xe4\xf0\xa1\x6d\x28\x77\xbf\x90\x77\xeb\x8d\x21\xf3\x80\x7f\x01\x37\xf6\x85\xdf\xc8\xff\xbd\xca\xe7\x37\x37\x80\xec\x1e\xe9\xe0\x13\xde\x39\x07\x6c\xff\x6c\xe0\x62\xd0\xda\x43\x17\xb9\x7f\x3c\xf5\x8e\x87\xb9\x73\xfc\x75\x9f\xc1\x0b\x7b\x78\xc5\x63\x93\x97\xf0\x8a\xe5\x4f\xdd\xe8\x27\x7f\x6d\x76\x23\x7a\x5f\xcb\x5f\xf8\x11\xc1\x13\x16\xca\xc8\x9b\x35\x39\x70\xf2\xd3\xaf\x6a\x3a\xb6\xbe\x5d\x07\x8b\xfc\xce\x83\x86\xd2\x95\x59\x86\xb1\x35\xd5\xdc\x4c\x8b\xad\xb1\xd8\xd4\x2a\xd3\x9b\xd0\xcb\x1e\x86\x8f\xe0\xb1\x7d\xf6\x54\x41\x6d\x4c\x15\x2e\x9d\xe4\x26\xa3\xdc\xdc\x2c\x7d\x96\xa6\xbb\x9f\x0c\x22\x04\x20\x04\xb9\xf2\x4b\x66\x3a\xa9\xb6\x7a\x00\x8f\xd2\xb8\x9c\x46\xc5\x95\xb4\x75\x35\x64\x37\xce\xb3\xa8\xb8\xa2\xe2\xeb\x2a\xaa\x5e\x0c\xeb\x64\xef\x94\xa1\x5d\xdf\x0f\xa2\xc9\xc0\x9a\x7d\xe4\x14\x79\xf6\x91\x93\x77\xc3\x20\xcd\xe8\xed\x8b\x88\xc2\x83\x28\x8e\xd0\xee\x38\x8e\xb2\x1d\x92\x56\x17\x6a\xb3\x8f\xbb\x2d\xd1\x7b\xb1\x7a\x2c\x8e\xa3\x16\xac\xeb\x5f\x68\x4a\x2a\x2d\x15\xff\xdd\x51\x1a\x87\xf3\x8c\x5d\x6c\xe5\xd9\x47\x72\x0f\x80\x0a\xbe\x07\x2c\xed\x62\x70\x1b\xdf\xa3\xa4\x71\x31\xaa\x8a\xdd\x65\x96\x90\x4d\x84\x15\xf6\xca\x59\x8d\x54\xab\xb4\x22\xd5\x2a\xad\x48\xb5\x4a\x77\xa4\x5a\xa5\x3f\x52\xad\xf2\xa4\x48\xb5\xea\x5f\x1d\xa9\x56\xfd\xcb\x23\xd5\x86\xa8\xb6\xca\x98\x58\x5b\x81\x40\xa9\xa6\x23\xe9\xac\x4c\x31\xa8\xaa\x95\x8a\x1e\xea\x09\xe3\x07\xd7\x08\xe3\x47\x5f\x89\xfe\xe6\xb8\x8f\x69\x9f\x84\x9f\x3f\x03\xab\xfa\xd2\xa8\x70\xd5\x60\x70\x98\x9e\x8e\x83\xf6\xf0\xbf\x03\x1a\x2a\xa6\x3a\xd4\x1c\x6d\x10\x53\x8f\x04\x31\x03\x3c\x57\x7d\xa8\x79\x7b\xc2\x8d\x89\xc6\xb7\x66\x98\x5f\x62\xa9\x42\x88\x59\x2f\x21\xcc\x35\x08\x61\xfc\x07\x08\xe1\xff\x7d\x84\xb8\xfa\x5c\x42\x14\xf1\xe0\x57\x13\x62\xdc\x47\x08\x65\x8d\x18\x88\xff\x91\x15\x31\x7c\x02\x76\xaa\xc8\xc9\x23\xcd\x77\xbf\x1b\x8a\x0b\x92\x65\x17\x35\x83\xdf\x4f\xd0\xe3\xa3\x30\x41\x34\xfc\x3d\xd3\x4b\x14\x69\x29\xf0\x8e\x76\xb8\x7f\xb5\xdf\x9d\xa8\xe0\xd5\xd9\xe5\x95\xc3\xdf\xc6\x69\xc6\x83\x09\xaa\x44\xb6\xc7\x92\xfe\x2d\xea\x09\xa8\xf7\x6f\xe9\xb8\x3b\xa0\xde\xaa\x78\x7a\x61\x4c\x12\xd1\x5c\xb0\x69\xa6\xce\x0b\x98\x47\x5e\x63\x25\x2f\x51\xe6\xdd\x3a\x72\xbd\xf4\x3c\x8e\xc3\xd4\xb9\xce\x63\xed\x51\x03\xfd\xb2\x93\xfc\x43\xc1\x5a\x65\x51\x9e\x3e\xa0\x2c\xc1\xa2\xe9\xa1\x9b\xb9\x45\x01\xbd\xa3\x9c\x45\xe4\x96\xe2\x20\xe7\x6b\x12\xef\x29\x73\x78\x7e\xb7\xb8\x68\xe5\xf9\x15\x51\x94\xce\x13\x74\x16\x85\x0f\x67\x51\x01\xc0\x25\x13\xcb\x84\x5a\xff\x00\x89\x20\x73\x10\x49\xd6\xc5\xd0\x52\x3c\x0d\x48\x13\x94\x09\x0d\xd5\x93\x28\xa5\x88\xc6\xf4\xc7\x97\xe9\xea\x2d\x8a\x06\xcc\x2b\x0b\x48\x74\xb6\x79\x8a\x12\x3c\xcc\xcb\x38\x99\xe6\x31\xbe\x88\x95\x39\x2e\x10\xea\xc3\xd1\xd1\x3f\x90\x74\x34\xa7\xee\x14\x95\xd0\x90\x5f\x28\x0f\x83\xd8\x78\xec\xe8\x89\x2b\x38\x41\x59\x59\xe9\xc4\x9d\x09\x45\x7b\x82\xfb\x43\x9a\x9d\x80\x76\x51\x7e\xcb\x43\xeb\x5d\x66\x68\x76\x58\x06\x34\x62\xc6\xcc\xa9\xf0\xa9\x73\x91\x0d\x5e\xc8\x80\x40\x90\x0e\xae\x3b\x75\x7f\x4d\xfd\x5d\x87\xc2\x11\xcb\x53\x35\x10\x18\x84\x2f\x83\x10\x1d\x4f\x67\x71\x52\xbd\x0c\x12\x22\xdf\xa3\xa8\xf6\x15\xb4\x66\xd1\xea\x82\xbc\x5b\x2d\xeb\x85\x54\x60\xbd\x74\xc7\x3e\x4c\xe7\x23\x3c\xed\x11\xba\x8a\x19\x41\x53\x41\x6c\x87\x4f\xac\x87\xe6\x2b\x1a\x09\xd5\xb0\x7c\xe5\x7a\x2f\x22\xf0\xb1\xa8\x88\x98\x65\x0e\xc8\xea\x6f\xc5\x40\xa4\x55\xe6\x51\xd1\xa5\xb8\xc0\xcb\x35\xe7\x72\xfa\xf0\x97\xe6\xf9\x47\xbb\x17\x6c\x7b\x7d\x17\x2b\x39\x4b\x02\x74\x5f\xac\x19\xb2\xa2\x85\x6a\x44\xc2\x12\x32\xb1\xde\xe4\xa0\xb1\xdc\xd7\x6b\x75\x58\xec\x05\xeb\xd5\x7f\x7b\xc2\x36\x8a\xbe\xea\x8b\x36\xf2\x9a\x41\x15\xcb\xef\x64\xdd\x93\x90\x87\xe0\x7a\x09\x8b\x76\xf2\x71\xc1\xb7\x78\x85\x1e\xb9\xde\xad\x80\xf7\x24\xa6\xbb\xa0\x4b\xef\x5d\x90\xdd\x56\x83\x23\xe2\x35\x0c\xf2\xa8\x89\xa4\x06\x2b\x17\xc1\xa7\x38\x0a\x1f\x2e\x51\x38\xc6\x4b\x09\x4d\x83\x8c\x30\xd2\xe0\x05\x5c\x88\x0b\x92\x19\xb4\x83\x2c\xa8\xc9\x65\xfd\x01\x20\xbf\x3d\xba\x1a\xd6\xa6\x77\x59\xc4\x7a\xfc\xe4\x7b\x03\xb4\xa8\x0c\xd2\x22\xe4\x86\xe3\xe0\x5b\xd3\x9b\xab\xa3\x62\xbc\xfe\x91\x2a\xc4\xdf\x70\x0c\x92\xd3\x87\x90\x64\xc9\x44\x4a\x5e\xd9\xb0\xf7\xb7\x27\x43\x4a\xdb\x8e\xce\x8b\xf3\x34\xc7\xcf\x55\x82\x50\x35\x36\x64\x84\x3e\x70\x27\xee\x0c\x24\x24\x9b\x72\x8d\x39\x68\x95\x88\x70\x1d\x66\xc4\x93\x38\xf0\x77\xa3\xbd\x4c\xba\x75\x53\x21\x12\xf7\x32\x72\xe0\x44\x22\x4d\xeb\x86\xc4\x41\x86\x59\x49\x88\xc0\x35\xba\x11\x07\x49\x5e\x0c\x98\x86\xd0\x61\xa1\x1a\xf3\xb7\x85\xa8\x27\x22\x67\x9d\xaf\x11\x2a\x63\x6c\x16\x93\x21\x93\x48\x40\x06\x22\xb1\x71\xfc\xb2\xd5\x37\x8d\x29\xb9\xa8\x48\x22\x24\x15\x44\x50\x04\xd0\x34\x6b\x2f\xd0\xe3\x23\x2a\x32\xa2\xca\xf8\x47\x15\x01\x02\x2a\x36\x24\x7c\x80\x38\x8e\x33\xa1\xb2\x0d\xae\xd8\xfe\xc2\x64\x24\x91\xa4\x7f\xc5\x07\xf4\xb6\xc3\x7f\x59\xf0\x25\x5f\x99\x37\x41\x1c\x92\xa6\x71\xe0\x8b\x8f\x8f\x04\xf1\xb9\x96\xd4\x89\x40\x5d\x4f\x29\x97\x8a\x59\x27\x21\xf1\xc7\x71\xd7\xa0\x03\x21\x11\xa0\x2a\xee\x45\x6b\xfe\x48\x64\xd2\xc7\xf5\x4d\x99\x84\xbe\x3a\xd3\xae\xe9\x94\xdb\xfd\x5e\x09\xde\xd6\x56\xa7\x42\x57\xc8\x48\x44\xe1\x0c\x48\x92\x54\x56\xb8\xc1\x2c\xc1\xb8\x00\x1f\x97\x8b\xe5\x82\x0e\x91\x71\x29\x49\xea\xb0\xe5\xd3\xa7\x18\x23\x56\x35\xf8\x0f\xb0\x86\xf0\x54\x02\x03\x32\x8c\x9a\x09\xca\xb8\xaa\xfc\x47\x99\xae\x96\xfb\x77\x95\x40\x45\x6e\x34\xa4\xa3\x5c\x0c\xdc\xa8\x93\x7c\x23\xae\x76\x54\x88\x98\x1b\xf5\x54\xec\xf3\x79\x57\xfe\x43\xe4\x4e\x03\xaf\x22\x08\x55\xc2\x39\x77\x6c\xe4\x5d\xef\xa8\x2f\xe4\x22\x13\x7e\x6f\xe5\xf2\x80\xc1\xb5\x93\x15\xb5\xc9\x32\x7e\x21\x97\x81\x61\xb7\xb6\xb2\xad\xad\x64\x8f\xcf\x89\x45\x02\x08\x0c\x38\x7e\x3b\xd9\xe6\x01\xbe\x52\x53\xac\xe2\x12\x84\x4b\x8a\x7d\x17\x97\x64\x83\xf7\x79\x62\x92\xec\x16\x15\xb4\xcc\xc3\x3b\x90\x28\x39\x74\x6d\x74\x49\x7e\x8b\x3c\x38\xc2\xfb\x45\x10\x79\x09\x31\xe4\xb9\xa8\xc9\x1c\xc8\xef\x96\x45\xb6\x1d\x08\x34\xcc\x7a\xed\x4f\xb9\x18\xdf\x71\x0d\x11\x17\x9d\xf2\x17\xd9\xde\x31\xd1\x59\xd1\x05\x11\x00\x13\x37\x91\xd2\x0c\xcd\x2e\x0b\xe9\x0b\x77\x0b\x56\x1c\x8c\x4c\x04\x63\xc0\xd7\x8e\xdc\xaa\x18\xd6\x3b\xa2\x3b\x63\x61\xf7\xb0\x0c\xdd\x12\x38\xc5\x25\x2d\xd7\x80\xb5\x75\xb8\xd6\xa1\x6d\x9e\xdd\xff\x79\x80\xab\x27\x75\x1d\xd6\xf2\xf4\xff\xcf\x43\x59\x39\xf1\xeb\x40\xbe\xcd\x2f\xa6\xcf\x02\xe3\x22\x8d\x93\xec\x2d\xcd\x63\x57\x93\xaf\xf2\xbc\xc4\x02\x02\x9d\xe9\x68\xc9\x39\x0f\xf8\x2f\x79\x2c\xdf\x36\x41\x2b\xe4\xdb\x25\x2b\x30\xd7\x17\xe1\xa3\xd4\xb9\xbe\x11\x9b\xd7\x6e\x2a\xb7\x76\x43\xd7\x0a\x05\xde\x23\x5e\x14\x5b\x1e\x15\x31\x40\xe2\xc0\x4a\xb2\xde\x3d\x74\x2d\xdf\x90\x89\x0c\x32\x10\x39\x1b\x45\x52\xc7\xf7\xdf\xe3\xe8\x75\x90\x92\x43\x1e\xdf\x65\x9d\xaf\x99\xce\x4b\xbc\xe9\x09\x17\xde\x06\x2b\x02\x49\x05\x7d\x75\xe1\xf3\x69\xf8\xab\x68\x32\xd6\x42\x60\x1f\x3e\x96\xe3\xb5\x3c\x1d\x0a\xc4\xfe\x7d\xd8\xab\xd8\xef\xe0\x03\xbf\x77\xa7\x79\x3a\x12\x5b\x7a\xa2\x65\xa8\x6c\x88\x69\x0d\x21\x7c\xd1\xbd\x6d\x3f\x1d\xb6\xba\x66\x6b\x19\x60\x0b\xc2\x07\x6f\x98\xba\xa7\x50\x07\xd5\x4a\x5f\x26\xf1\x34\x8f\x74\x8f\x90\x08\x2a\x55\x98\xa6\x82\x85\x67\x3f\x4b\x7c\x2c\x64\x22\xf1\xef\x0b\xc3\x9e\xcf\x74\x55\x08\x76\x4d\x63\x6f\xcc\x4b\x23\xb0\x77\x46\x59\xbf\x9f\xe6\xba\xfd\x22\x46\xab\x66\xca\xf2\x48\xf7\x15\xcf\x90\x35\xcf\x1a\x8d\xf5\xb1\x61\x1b\xaa\xae\x8c\x15\xd5\x1e\xab\x2a\xb4\x7c\x57\x35\x15\xed\xcf\xdf\xff\xd0\x0d\x0b\xea\xaa\x6e\x42\x4d\xb6\x2d\xd3\xd4\x14\x53\xde\x2c\x46\x2b\xec\x0a\x0d\xd5\x13\x8e\xba\x2f\xae\x4d\x2b\x1c\x75\x5f\x14\x96\x46\xb8\x1a\xa8\xff\x3d\x41\xe8\xdc\x88\x43\x1f\x83\x94\x68\xa9\x2b\x2f\x29\x11\xf7\xe1\x36\xf0\x6e\x49\xe8\xc4\xd0\xf5\x68\x5c\x9b\xf5\xc2\xba\xe6\xa1\xaf\xde\x9e\x3c\x4b\xa8\x9b\x12\x11\x1b\xc5\x9e\x56\x57\x06\xbb\xa9\x47\xce\x2f\xde\x2e\x8a\xb8\xd3\xbe\x6c\x6a\x63\x4d\x19\x23\x5f\x87\x63\xcd\x84\x23\x5d\x35\x4d\x5b\xd3\x65\x5d\xd7\x2d\x13\x42\x77\xec\x19\x9e\xe6\x61\x9e\x54\x2d\x4b\x57\x0d\xc3\xb4\x0d\x0b\xda\xb6\xa6\xaa\x6b\x05\x77\xad\xd0\xa9\x2f\xd6\x51\x9b\xd1\x94\xbe\xb8\xc1\x4d\x46\x53\xfa\xa2\xdc\x36\xe3\x9e\x9b\x7f\x13\xa3\x71\xf7\x97\x64\x0b\xac\xbc\x13\xe5\xe1\xe0\x36\x63\xac\x2c\xe6\xe6\xe9\xf3\xc4\x35\x37\x9f\xc2\x5b\x4a\x5f\xc4\xa9\x92\xb7\x6a\x99\x11\x8a\xa7\x9f\x2c\x41\x15\xfe\x52\xc7\x9e\x6f\x41\x59\xf5\x47\x06\x92\x5d\x04\x91\xaf\x99\x0a\xf4\x4d\x04\x5d\xe4\x29\x23\x68\x8f\x6c\xc3\x93\x31\x7f\x99\xba\x61\xa8\xba\x0c\x35\x28\x5b\xb2\x2e\xeb\x96\xb6\x61\xb0\x69\xb5\x2f\x82\x74\x9b\xbf\xd4\xbe\x28\xb1\x4d\xfe\x52\xfb\x62\x8c\x36\xf8\x4b\xb5\xff\x2e\xfe\x62\xfc\x01\xb8\xdb\x38\xcd\x00\x47\xd2\x1c\x14\xb8\x9f\xc5\x71\x48\xf8\xed\x21\x9e\x27\x9b\x31\xdc\x73\x70\x5a\x89\x85\x4d\x38\x4d\xed\x0b\xe8\x5d\x0d\xd9\x05\x41\x91\xc6\x7a\x87\x46\xa9\xf8\x8b\x82\x78\x01\x08\xf8\x69\xb6\xa3\xc9\x24\x2a\x4d\x18\x44\xa8\x52\xab\x19\xbb\xaa\x62\xed\xd4\x1d\xc7\x84\x19\xe9\x97\xda\x03\x1e\xf0\x99\x8b\xaf\x4c\xe8\x23\x0f\x78\x99\x0c\x37\xca\xa2\x1d\x56\x91\x34\x49\x51\xd6\x08\x78\x92\x9b\x60\x95\xb5\x1a\xa3\xe4\xba\x89\x30\x76\x7d\xe4\x77\x4d\x90\x55\x65\xaa\x83\x1a\x40\x39\xe2\x98\xbf\x00\x57\xfa\x0d\xd4\x3a\xea\x8d\x6c\x66\xb4\x23\x9d\xb5\x23\x68\xa1\xff\xb2\x00\x60\xf8\x17\x96\x3d\xc3\x20\xcd\x2a\x71\x7e\x98\xd1\x5d\x99\xb6\xbd\x23\x6c\x4b\xf1\x11\x77\x13\xf8\x8d\x92\x22\x96\x0c\xe8\xb6\x31\x2c\x31\x9a\x75\x82\x1f\xa2\xf1\xe7\x42\x5f\xc9\x59\xdf\x15\x75\xac\xf8\x5a\xc0\x5f\x2d\x4a\x9a\x31\xb2\x1a\x76\x91\x4b\x2d\xfa\xfe\x37\x0a\x51\x2b\x0a\xd1\xa6\x6b\x77\x9d\x25\x0b\x8b\xc5\x5a\x2e\x5b\xbc\x5c\x9f\x1c\xf5\x68\x5d\x46\xfc\x8c\x50\x42\x31\x5a\x15\x4b\x68\x38\x7f\x23\xa8\x80\xe7\xaa\x6a\xd7\xe2\x2a\xc9\xf1\x4d\xa3\x3c\xad\x30\x43\xab\x98\xf6\xe5\x84\xd4\x56\x5b\xe9\x65\x52\xe7\xfb\xf0\x42\x2c\xf2\x62\x86\x08\x40\x50\x33\x8d\xd3\x9b\xc6\xf9\x26\x70\x59\x25\x0a\x8b\xd1\x61\xf7\x5f\xc6\x7b\x61\xf1\x88\x48\x41\x99\xf0\x93\x8d\xe0\xb3\xf5\xdc\xe1\x27\x0f\x61\xe1\x27\x5f\xb8\xc9\x43\x85\x05\x32\xca\x43\x12\x75\xc6\x0e\xaa\x19\x43\xc2\x22\xac\x09\xd4\x81\x87\x96\xc5\x80\x50\x5a\xd6\x46\xcd\x14\x9d\x46\xe1\xd1\x51\x09\x83\x64\xd2\xad\x01\x4f\x23\x0f\x20\x43\x86\xb3\x40\xca\x5c\x49\x72\x93\x2e\xa8\xb7\x7a\xb4\x7b\x9d\xec\xab\x18\x57\x64\x30\x47\xbd\x6e\xf4\xb0\x45\x80\x22\xba\x51\x2b\xb8\xd1\x12\x84\x2b\x6a\x1b\xe1\x8a\xc6\xc2\x07\x90\x0a\x7a\x37\xc2\xf3\xf0\x45\x4d\x84\x2b\x26\x98\x2d\x45\xb8\xb5\x0a\xe1\x8a\x55\x22\xbc\x8c\xc1\x64\x57\x11\xae\x14\xcb\x4d\x95\x81\xbf\x12\xe1\x2a\x5c\x0b\xe1\xaa\x02\xae\xd6\x45\x78\x2d\xda\x90\xda\x64\x7d\x55\x5b\x1e\x0e\x42\xd5\x9b\x71\x86\x54\x83\xc5\xe2\xc9\x63\x15\x75\xe1\x5c\xb5\xba\x71\xae\xda\x60\xfc\x74\x26\xef\x0c\x38\x24\x37\xa7\xa4\x15\x36\xca\x45\xea\x5b\xad\xcb\x51\x87\xc6\x75\x62\xd1\x8f\x86\x9b\xa2\xf3\x2f\x0d\xc6\xa0\x37\xaa\xbe\xc8\x5a\x0f\x4c\xfd\xbd\xf6\xd5\xb4\xc4\xde\x28\x07\xb9\xb0\x94\x5b\x20\x52\x32\x34\x83\x3b\x14\x66\xfd\x85\x2e\xbe\xcb\xa3\x88\x02\x91\xde\xc6\x1f\x5e\xc6\xc9\x94\xbc\x2c\x08\xa5\x34\x56\xc4\x66\x30\xfb\xa1\x29\x44\x9f\x1c\x1c\x6a\x7e\xde\x0b\x4e\xa9\xda\x5e\x1b\x9e\x52\xba\x5a\x07\xa0\xaa\x6a\x35\x87\x89\x5a\xe5\xd6\x61\xa2\x22\x58\x56\x58\x24\x74\xbb\x10\xd6\xac\x03\xfb\xc9\xd8\x80\xb8\x0a\x03\x2f\xae\xe3\xf2\x7f\x21\x0d\xb5\x93\x9a\xb7\x3f\x75\xa8\x28\x7d\xfe\x99\xfb\xfe\x3b\x1d\x96\xde\xfe\x17\xd2\x43\x1a\xe7\x9e\xfe\xd4\x9b\xff\x5b\x5d\x07\x01\xaa\xfa\xea\x57\x62\x02\x90\x70\x00\x15\x17\x8d\x8e\xcd\x64\x89\x9b\x06\x91\x68\x98\x67\x43\xed\x32\xd9\xe9\xdb\x1c\x44\x3b\xcc\x9f\x5b\x51\x65\xdc\x84\xac\xe7\xa5\xe3\xe4\x7e\x18\xd4\xab\x79\xe4\x7a\x77\x93\x24\x9e\x47\xfe\xe0\x1f\x08\xa1\xdd\xa9\x9b\x4c\x82\xa8\x04\x22\x2f\xc8\xdd\x2d\x76\x73\x30\x13\xea\x45\x5e\x2d\x22\xae\xd9\x95\xdf\xa3\x38\xcb\xe2\x29\x2e\x5a\x50\x89\x47\x22\xd7\xc6\xce\x98\x02\x25\x18\xc4\x17\x85\xfa\xe1\xd3\xbf\x73\xff\x15\x99\x78\xa8\x0c\x82\xe8\x16\x25\x41\xb6\xdb\x70\xe9\x90\x7c\x37\xb9\xeb\xf0\xc9\x5e\x8d\x11\xc0\x91\xb6\x1c\xc7\x3d\xa9\x79\x15\xf6\x7f\x28\x8a\xaa\xa9\xde\x42\x6a\x9f\xda\xdd\xde\x32\x2c\x70\x00\x65\x0f\xe2\x8b\xf4\x89\xba\x87\x43\x59\xfe\xe7\xe7\x74\x53\x29\xa8\xf6\xd8\xf0\x37\x3f\x45\x4e\x22\x18\x96\xad\xda\x22\xd8\xc7\x7f\x6b\x86\x69\x29\x22\x38\xc3\x7f\xab\xd0\x50\x75\x11\x1c\xe1\xbf\x2d\x53\xc7\xe7\xf9\x94\xd4\x51\x14\x2c\x4c\xdd\xe3\xbf\x4d\x19\x6a\x72\xc5\x89\xe6\x60\x23\x27\x1a\x43\x17\x1b\x4e\x34\x86\x21\x36\x9c\x68\x8c\xf2\x60\xce\x4b\x8a\x60\x41\x35\xb9\xd1\xb0\x9b\x07\x61\xe1\x44\x63\xca\xe2\x13\x9c\x68\x4c\xb8\x5a\x3c\xff\x2c\x27\x1a\xb3\x1d\x4d\xe9\x99\x9d\x68\x7e\x6a\x98\xca\x53\xcb\x7e\x63\xb5\x61\xbf\xa9\xae\x36\xec\x2f\x87\xb9\xd8\xc4\x22\x9f\x44\x2e\x05\xa6\xd6\xe5\x8c\x70\xf9\x84\x8e\xf4\xae\x8e\x46\x4f\xe8\xc8\xe8\xea\xe8\xf8\x09\x1d\x99\x5d\x1d\xbd\xee\xef\xa8\x07\xfb\x8c\x3e\x05\xf6\x49\x68\x51\xc0\x73\x57\xb7\x88\x3b\x40\x09\xa3\x3a\xe2\xf6\xe7\xd9\x6d\x9c\x04\xd9\x03\xcd\x11\x93\x06\x93\x28\xa5\xa9\x5d\xca\xf4\x24\x95\xfa\x12\xd7\x0e\x92\x56\x81\xf3\xbc\x93\x65\x14\xf5\xb9\x79\xe6\xa1\xed\x77\xc2\x50\x92\xdf\x05\x4c\x2b\x9f\x35\xac\x8b\x97\xeb\x78\xd8\xb0\x27\xf2\xaa\x2c\x41\xdd\xb3\x9b\xbe\x36\xbf\x76\xce\x57\x55\x9e\x7b\xbe\x87\xff\x25\xf3\xfd\xd8\x3d\x5f\x1d\x14\x71\xe4\x96\xcf\xb7\x39\xaf\x0f\xff\x25\xf3\xfa\xb6\x7b\x5e\xd6\x53\xe7\x75\xf7\x57\xcf\x2b\x9d\x8f\x22\x94\x75\xcc\x8c\x7d\xa8\xcc\xed\x6d\xe7\xdc\x34\xf8\xd4\xb9\xbd\xf9\x2f\xa1\xd9\x17\xdd\xf3\xd2\x9e\x3a\xaf\x93\xff\x22\x9a\xbd\xec\x9e\xdb\x1a\xde\x8d\x9b\xed\x2b\x3f\xfc\x97\xd0\xf2\x55\xe7\x7c\xf5\x35\xdc\x6a\x37\x9b\xef\x6f\xff\x25\xf3\x7d\xd7\x3d\xdf\x67\x3f\x27\x7f\xfc\x2f\xe2\xe9\xef\xba\xe7\xfc\xec\x3c\xfd\xfd\x7f\x09\x8d\x7f\xe9\x16\x9f\x9f\x9d\xa7\xbf\xf9\xcf\xd3\x98\xf6\xf2\x6f\xe4\x5c\x9f\x4a\x33\x89\xe5\x79\x7c\x7d\x74\x31\x7c\x75\x76\x79\x05\x70\xd9\x9b\xcb\xa3\x8b\xd3\xfd\x93\x23\xf2\xe3\x7c\xff\xf2\xf2\xdd\xd9\xc5\x21\x68\xd4\x3e\x38\xba\xb8\xba\x21\x7e\xad\x28\x5b\xd7\xaf\x15\xcf\x7c\x3d\xcf\x56\x77\x16\x1c\x84\x01\x8a\x32\x27\xab\xb9\xc2\x5d\x66\x6e\x86\x9c\x0b\xe9\xe3\x4c\x97\x0e\x8f\x5e\xee\xbf\x79\x7d\x55\x98\x1a\x46\x44\xd9\x54\xf8\xc0\xde\x07\xb3\x53\x94\x7d\x88\x93\xbb\xd2\x5b\x15\xf7\x92\x67\x0c\x24\xfa\x2d\x87\xaf\x67\x11\xbc\x44\x59\x16\x44\x93\x94\xa7\x7e\x0e\x65\x17\xe7\x28\x39\x08\xe3\xb9\xdf\xf0\x51\xa8\xd4\xd8\xda\x6a\x96\x54\xfc\x44\x6a\xb1\x72\x48\x47\x7b\xad\xda\xe3\x20\x24\x3e\x2b\xce\xd7\x48\xf2\x70\x95\xdc\xea\xbe\xd6\x4e\x9a\xcf\x03\x5f\x1c\x5c\xdf\x10\x08\x29\x55\x31\x74\xac\x9b\x06\x7c\x13\x94\x5d\xd2\x2a\x42\xad\x2b\x56\x9b\x44\xd0\x6c\x74\x74\x52\x44\xfa\xdc\xac\xcb\xb2\x1d\x0b\x49\x5b\x1b\xe3\x6f\x74\xc0\x65\xee\x9f\xb3\x59\xf8\x70\x99\xa1\x59\x6e\xc9\x29\x7e\x9e\x5b\xee\x8a\x5e\x3b\x9c\x75\x57\xb4\x78\xba\xff\xec\x53\x3b\xde\xc8\xab\xd6\x9b\xa7\x59\x3c\x0d\x7e\x43\x84\x00\xb9\xbb\xd9\xdd\x84\x4e\xee\x80\x64\xdb\x73\x3e\xd1\xe8\x7d\x9f\x48\xd4\xd1\x41\x17\x7a\x73\x77\x14\xfa\x0b\xb0\xed\xf3\x0a\x7d\xcc\x06\xfc\x37\x0f\x9c\x4f\x61\x04\x9c\x1b\x86\x65\x26\xe8\x0f\x41\x18\x72\xb7\xee\x3d\x5a\x96\xf0\x93\xc6\x8e\xf5\x25\xee\x15\x4a\x10\x49\xe3\x39\x75\x1f\x7e\x8e\xb8\xc6\x7f\x79\xf4\xe1\xf0\xa1\x48\xf3\x99\xdb\xb4\x11\xe0\x49\xaa\xcf\xc0\x47\x51\x86\x3f\xb9\x78\x21\xa4\x28\xe3\xe2\x71\x23\x31\x75\x7a\x1b\xcf\x43\x9f\x40\xd5\x1e\x64\x1d\x30\x4f\xe3\x0c\x0d\xb8\x23\xe2\xb5\x45\xbb\xcc\x6e\x51\x8a\x72\x28\xdc\x04\x71\xb3\x04\xa5\x28\xca\xb8\x38\x6a\x0f\x11\x44\x7e\x70\x1f\xf8\x73\x37\xec\x06\x6c\x84\xf2\xa1\x68\xe2\xec\x7e\x90\x24\x1e\xd0\xa7\xb5\xbf\x8c\x0a\x15\xa4\xb7\x27\xf2\x5c\x54\x58\x02\x55\x7b\xd0\x1c\x4c\x7e\x01\xf0\x3e\x91\x0e\x3e\x51\xd7\xce\x41\x63\x67\x61\x9a\x9e\x41\x87\x03\x1a\x5f\xe3\x64\x5e\x5c\xe4\xae\xf4\x3d\xbe\xf6\xfc\xbb\x38\xb9\xc3\x07\x0e\x0f\xaa\xc1\x3c\x07\xa7\xd2\x9d\x54\x8b\xee\x29\x8d\x83\xc8\x2f\x8d\xfd\x1d\xc7\x21\x47\x2d\x8b\x7a\xfd\x7a\xff\x9b\xa3\xd7\x97\xe2\x82\x1c\xdc\xf8\x88\x7b\xfd\x4d\xee\xa8\xd5\x71\x26\xbe\x3e\xdb\x3f\x3c\x3e\xfd\xb6\x71\x88\x4a\xf7\x28\x09\xc6\x0f\xfb\x9e\x17\xcf\xa3\x4c\xf8\xe4\x25\x88\xa0\xda\x0d\xd3\xc1\x27\xbc\xf3\x96\xee\x0d\xe5\x9c\x19\x2a\xd2\xeb\xaa\x48\x70\x43\x3d\xee\xc0\xcc\x4d\xd3\x0f\x71\xe2\x2f\x6d\x94\x8b\x0e\x79\xa3\xdb\x38\x6d\x22\xbc\xde\xa0\x21\x8c\xe4\xed\x32\x14\xb9\x2d\x52\x2d\x87\xef\x60\x9f\xc4\x17\x5d\x73\x30\x22\xcb\x30\x5f\xc2\x85\x28\xcd\x82\x19\x12\x04\x19\x9c\x22\xe9\xa3\x48\x44\x9b\x15\x22\x88\x08\x04\x19\xec\x23\xe9\x42\x14\x5a\x5e\xff\x62\x25\xa8\x40\xe1\x79\xde\xd6\x1d\xf3\x7c\x4b\x8e\x91\x0b\x1f\x74\x72\xf0\x17\x91\x0d\xf0\x01\x4c\x4f\xc8\xa3\x68\x12\x44\x88\xcc\xad\xfa\xf5\x6d\x29\x54\x14\x1b\x37\x09\x09\xf8\x36\x8f\x02\x9e\x0a\x2f\x64\x71\x01\x4a\x67\xe7\xcc\x61\x3a\x66\xe2\x7c\xed\x4e\x88\x33\x6a\xf1\xe7\x77\x97\x67\xa7\x52\x9a\x25\x41\x34\x09\xc6\x0f\x02\x62\x6e\xc9\xed\x59\x64\x12\x31\x25\x3c\x1b\x0b\xfc\x31\x4b\x88\x5b\xe1\x35\x5e\xfc\xda\x91\xf7\xba\xbe\x0c\x38\xe2\xea\x4a\xed\x44\x73\x86\xe4\xdc\xc8\xe7\x72\x46\xe3\x07\x95\xbe\x2f\x50\x4a\xf3\x0e\xe3\x7f\x09\x14\x80\xa3\x22\x4a\x10\x4d\xf0\x4e\xe2\xb9\x61\x88\x92\xc6\x78\xdd\x4a\xd2\x52\xa9\x9a\x03\x91\xdd\x22\x8e\xb4\x08\xb2\x07\xbc\x03\x91\xec\xb2\x65\x03\x7e\xf0\xfe\xa5\x1b\xe0\x7d\x16\x0f\x44\xc9\x85\xff\xc4\xd5\xe8\xde\x16\x20\x9f\xdb\xbf\x0f\xb8\x7a\x8a\xf6\x32\x85\xb4\xc4\x7d\xf1\x29\x5b\xbc\xa7\x5e\xb9\x39\x6d\x3f\x35\x96\xec\x04\x65\xfb\xf7\x41\xfe\xb5\xe0\xc9\x67\xe2\x32\xd2\xad\x83\xfe\x02\x16\xa8\x20\x27\x77\xf0\xef\x42\x06\x01\x80\x0b\x83\x34\xab\x61\xa3\x93\xb1\xbb\x51\xd3\x59\xf5\x99\xf1\x94\xb6\xc7\xc8\x6f\x28\xf8\xca\x82\x05\x5f\x7a\x2b\x68\xcb\xe9\x54\xec\xfd\x4f\xe1\x97\x01\xce\x21\x02\x39\x47\x1e\x0a\x3b\xd0\x5d\xdb\x29\xba\xd1\x5c\xab\xf2\xcc\xe8\xad\x5e\xd1\xfe\x4e\x5e\x7c\x7b\x7c\xce\x45\xf9\xb5\xab\xc0\x47\x9d\xa2\x65\x7c\xd5\x16\x0b\xbc\x24\x17\x35\xe4\xe3\x6b\x25\x62\x77\x3b\xca\xd0\xb9\x47\x74\x8d\x13\x9c\x4a\x05\x7a\xd6\x67\xce\xd7\x59\x7e\xd6\x17\xd1\x7e\xaa\x4d\xca\x7e\xfa\x07\xef\xab\x50\xbb\x47\x86\x31\x45\x85\x14\x44\x5e\x38\xf7\x51\xda\x01\x1f\xbd\x51\x8a\x62\x89\x81\x5c\x72\x61\x17\xb9\xf6\x4a\xc3\xcc\x5d\x60\xa8\x2e\x26\xe1\xa3\xf5\x64\xff\x74\xff\xdb\xa3\x93\xa3\xd3\xab\x22\x79\xc7\xe5\xd1\xc5\xdb\xe3\x83\xa3\xe1\xd1\xe9\xb7\xc7\xa7\x47\xc3\x6f\x2f\xce\xde\x9c\xd3\x8c\x1e\xf4\xdc\x7d\x7c\x7c\x96\xbe\x8a\xa0\x4f\xa8\x9c\x4d\xc9\xc1\xad\xa0\xb9\x95\x2b\xaa\x83\xba\xa2\x4a\xf5\x40\x70\x7a\x74\xf5\xee\xec\xe2\xfb\xa7\x4e\xa0\xde\xbc\x02\xf3\x06\x20\x30\xf1\x65\x78\xfe\x7a\xff\xf4\x68\xf8\xf6\xf8\xfc\x73\x81\x5a\xd5\xe1\x1a\x60\xe2\xda\x58\x02\x7d\x26\x20\x37\xee\xae\x87\xfa\x07\xc7\x87\x17\x9b\x71\x6b\xde\x2d\x6e\xf9\x19\xf4\xa5\xcd\x9f\x9b\xbe\x4f\x04\x6a\x55\x87\xcf\x4b\xdf\x75\x80\xdc\xb8\xbb\x2e\xfa\xb6\xd5\x55\xcd\x45\xbe\x4c\x31\xe5\xa0\x45\x4b\x34\x46\xe2\xa7\x17\x32\xde\x99\xf7\x84\x2e\xa7\x6b\x7a\x39\x3b\x7b\x73\x48\x98\x0e\xd4\x5d\xbc\x6f\x40\x97\x93\x78\xa3\x49\x9f\xfe\x06\xf0\x7c\xa9\xc3\x69\x8d\xd9\xbb\xeb\xad\x0d\x42\x7f\x0f\x4f\x83\xa8\xba\xf8\xd6\x06\xa2\xd6\xe8\x69\xe3\x6e\xb8\x2f\xac\x0d\xda\xa6\xfd\x7e\x1e\xd6\x30\x4b\x83\xf5\x02\x04\x44\xf1\xbb\xdb\x20\x43\xe9\xcc\xf5\xd0\x59\x74\x14\x95\x77\xc1\x60\xf6\xd2\x9d\x06\xe1\x03\x09\xb1\x7e\x1e\x48\xc7\xe7\xf7\xda\xde\xf2\x30\x03\xc7\xf9\x69\x78\x89\x26\x78\x51\x08\xe2\x60\x55\x83\x7b\xa3\xd9\x64\x35\x7d\xc9\xf4\xfe\x72\xfa\xfe\xff\x14\x89\x9b\x62\xe0\x69\x78\xde\x58\x08\x58\x7b\x25\x6d\xde\xf3\xb3\xcd\xe0\xb9\xe0\xfd\x6b\xa0\xfb\x7f\x8e\x93\x37\xc7\xc1\xb3\x73\xc2\xff\x3b\x98\x5d\x1f\x8f\xe2\x80\xca\x36\x7e\x90\xba\xc9\xb4\x53\xb0\x21\x01\xd1\xba\xea\xf4\x8b\x11\xbd\x4d\x36\xb9\xc4\xf5\xf7\x52\x5b\x92\x2b\x6b\x11\x24\xf4\xd6\xda\xf4\xac\x7f\x8e\x8e\x96\x43\xb4\x6a\x0f\x7a\x4a\xc3\x8d\x47\x7c\x2a\x16\x36\x5f\xe6\x2f\x64\x91\xa8\xa0\x0e\x59\x7e\x9d\xf2\x95\xf9\xdf\x48\x4a\xe3\x29\x51\x20\xbd\xe8\xb8\x39\x20\x76\xad\x10\x1f\x1f\xd7\xaa\x19\xf8\x54\xb3\xc8\xde\xac\x11\x31\xbe\xa0\xd5\x83\xf4\x68\x3a\xcb\x1e\xf6\x93\xc4\x7d\x10\x9a\x1a\xa9\xfc\xc5\x5f\xdc\xda\xaa\x84\x0d\xed\xab\xd5\xa5\xd8\xd9\x0d\xc6\x42\xb6\xb5\xd5\x35\x96\xe4\x91\x07\x54\xe4\x33\xb0\x44\xb1\x4c\xd5\x5f\xff\x52\x51\xe7\xf0\x6f\x35\x9e\x44\xa6\x1a\x93\xad\x48\x64\x41\x87\xae\x6f\x16\x8d\xc7\xda\x4f\xff\x46\xed\x68\xb7\xdd\x58\xa4\xa1\x77\xd3\x42\xb1\x77\x86\xa4\x91\x28\xe8\xb2\x4c\xde\x34\x8e\xe8\x0b\x08\x02\x99\xe8\x7c\xdd\x52\xbb\x39\x8e\xd3\x28\xcb\xc4\x75\x9f\x42\x88\xc1\x48\xfd\xc5\x23\x57\x7a\xb5\x4d\x39\x98\xba\x3a\xb7\xe2\xe8\xd2\xca\x16\xf1\xc8\x5b\x0f\x1d\x50\x14\x17\xe2\xa2\xf7\x4e\x5b\xee\x78\x3d\x18\xf9\xeb\x70\x50\x09\x44\xdc\x50\x1c\x6f\xa6\x64\x6e\xbc\xfb\x9f\x45\x6f\xcb\x79\xf4\xdc\xb9\xda\xba\xb1\x4a\xe0\xbc\xb5\xfb\x2b\xcf\x99\x86\xb6\x65\x93\xce\x56\xdc\x4a\x37\xd2\x49\x6e\x32\xee\x5a\x32\x5f\xaf\x96\x61\xd9\x48\xc7\x4c\x56\xe8\xc3\xd8\xf5\x0d\xa8\x44\x2e\x5b\xd2\x6a\xa5\x50\xb3\xa9\x00\x72\xb3\xba\x49\x87\x08\xd2\x0e\x9a\x46\x39\xb1\x2f\x66\x5a\x9f\xe4\xd1\x61\x2a\x53\x0b\xa4\xd6\xdb\x6e\xd1\x51\x58\xb3\x49\x4a\xcb\x2f\x8f\x8f\x42\xb3\x88\x29\xe0\x13\xe4\x66\xa8\x1b\xa0\xa2\x6c\xd1\x51\x2b\x1f\xe9\x54\xba\xfb\x9c\x38\x6f\x80\xfe\x39\x45\x52\x78\xbe\x61\xd0\x37\xcc\xf7\x3b\xf9\xdb\xce\xaa\xc8\x6f\x0a\x64\xa1\xdf\x74\x7b\x59\xe8\x37\x10\x81\x00\xc4\x20\x04\x2e\xf0\x40\x0a\xe6\x60\x06\x7c\x70\x05\xc6\x60\x08\x26\xe0\x16\x9c\x82\xfd\xce\xe0\x70\xcd\x67\x26\x6a\x2e\xf7\xe7\xef\x7f\xa8\x9a\xae\x5a\x63\x1b\x29\xae\x61\x5b\xb2\xac\x78\x86\xa7\x8c\x3d\x84\xa0\x86\x74\x03\x41\xc3\x36\x5d\x53\x73\x6d\xf8\xe7\xef\x7f\x40\x55\x51\x6c\xcd\xb4\x2c\x05\x9a\x10\x5a\xa6\x61\xaa\xeb\x84\x56\x6a\x44\x0f\x2b\x9e\x89\xf3\xe0\x4e\x23\xc5\x1a\xc9\xa6\x65\xb9\xa6\xa5\x78\x08\x19\xbe\xe1\xab\xba\x6f\xea\xf6\xc8\x43\x9a\x6d\xca\x9e\x29\x43\xd5\x74\x3d\x02\xac\xa1\x41\xa8\x43\xd9\x34\x2d\xdb\x34\x55\x28\xaf\x15\xdc\xa9\x11\x63\x2a\x7f\x9b\x2e\x20\xc0\x53\x1e\x2b\xb6\xab\x8d\x91\xa9\xbb\xba\x35\x1e\x9b\x10\xf9\xda\x08\xea\x9a\xa5\x98\xe3\xb1\x6c\xc0\xb1\xe5\xf9\x18\x07\x16\xd4\x6d\x1b\xaa\x96\xa9\x5a\xa6\x6c\x9a\x9a\x02\xcd\xf5\x20\x88\xaa\x10\xe4\xcf\xcf\xa3\x2c\xfa\xf3\xf7\x3f\x34\xdb\x55\x65\xcf\x1b\x29\xf2\xc8\x1b\xb9\x9e\xea\x59\xbe\xe5\xb9\xc6\xc8\x50\x2d\x64\x21\x34\x1a\x99\xc8\x43\xae\xed\xe2\xaa\xba\xac\x2a\x86\x8c\xe7\xae\xcb\x9a\x2c\x6b\x70\xad\xe8\x69\xef\x41\xd0\x18\x3e\x7f\x51\xbf\x8d\xd3\xac\x82\x07\xdb\xd4\x2d\xcd\x55\x47\x9e\x6b\x7b\x0a\xd4\x47\xc8\x55\x0c\xd3\xf4\x7d\x4d\xd6\x8c\xf1\xd8\x18\xdb\x96\x69\x8e\x2c\x42\x09\xd9\x36\x64\xcb\xd6\x55\xcb\x36\x75\x45\x35\xec\xb5\xf0\x50\x46\xa9\xb2\xd7\x0f\x17\x28\xaf\x1b\x2e\x50\x5e\x33\x5c\x20\xfc\xab\xa3\x6c\x31\x53\xa9\x3e\x43\x02\xee\xf8\x9c\x73\x7d\x3f\x41\x69\xca\xc5\x09\xf7\xf2\x87\xc3\xd3\x67\x89\xfe\x07\x9f\x12\x37\xcb\x5e\x19\x36\x2b\x5e\xc6\x3b\x78\x1e\x65\x02\xa3\x69\x3a\xf9\xf3\xf7\x3f\x10\xf2\x90\x39\xf2\xc7\xc8\xb4\x46\xf6\xd8\xd7\xc6\x96\xa6\x68\x96\xa6\x8f\xa1\xe7\x99\x96\xe6\x1b\xae\x61\xc8\x08\x29\x98\xe5\x4c\xdd\x96\x35\xdd\xb4\x64\x53\xb5\x14\x5b\xd6\x2d\x73\x50\xb5\xf8\x28\xc6\xc0\xb8\xf2\xdc\x28\x8a\x33\x62\x32\x87\x65\x72\xee\x3d\x08\x57\x82\x46\x6d\x48\x28\x5c\x96\x36\xf6\xec\xb1\x61\x8c\x91\x39\xf6\x47\xc8\xf3\xcc\x91\x67\xaa\x9e\x8b\x34\x77\x04\x75\x7f\x64\xbb\x63\x63\xa4\x78\x3e\xe6\x6f\x5b\xd7\x2d\xc5\xd0\x2d\x59\x35\x75\x45\xd7\xa0\x0a\x07\x1c\x49\xaa\xc9\xb9\xac\xcf\x36\x11\xb9\xf7\xc0\xdd\x14\x57\xfa\x48\x1d\xcb\x9a\x0d\x47\xae\x69\x8c\x2d\x45\x33\x7c\x65\xac\x41\x4b\x86\x23\xd5\x1c\xcb\x96\x3e\xf2\x14\xcb\xf2\x46\x3a\xde\x7f\x15\xa8\x58\xb6\x6e\x9b\xb6\x6c\xeb\x8a\x69\x5b\x86\x31\xe0\xde\xe4\xdb\x69\x1b\x39\xde\xa6\xb0\x40\xdf\x35\x5c\xa4\x8e\x4d\x43\x81\xf2\xd8\x90\x3d\x43\x36\x54\x5d\x55\xc7\x0a\x34\xa0\xae\x7a\xb2\x6e\x42\xa8\xb9\xda\x9f\xbf\xff\xa1\x28\x86\x6e\x43\xd5\xb6\x64\x5d\x36\x55\xd3\xb6\xf1\xfa\x3f\xcf\x37\xd6\x36\x2c\x69\x0d\x16\x2c\x03\x73\xb5\x43\xc0\x53\xa0\x35\xb2\xa0\x69\xe1\x69\xab\xda\x58\xb3\x7d\xc3\x1b\x19\x9e\x6f\x18\x23\x5d\xb1\x3d\x59\x33\x65\xd7\xd4\xc8\x16\x6c\x68\x9a\x6e\x69\x86\xa6\x5b\x96\xac\x5b\x9a\x65\x69\x9b\x6d\x3d\xba\xb2\xf6\xde\xa3\xf7\x45\x35\x6d\xee\x3d\x7a\x5f\x0c\xcd\xc6\xde\xa3\x6b\x7f\x5f\x84\xbf\x1c\xc9\xcf\xb1\xb7\x94\x70\x6f\xb2\xb7\x54\x30\xdd\xb7\xb9\xcc\xab\x8c\xd1\x65\xfe\x52\xe7\x13\x5f\x96\xa1\xa7\xcb\xea\x58\x33\x7c\x57\xd1\x0c\xd3\x50\x65\xa4\x1a\xa6\xe1\x7b\x9e\xa2\x5a\xba\xa1\x20\x6b\xac\x29\x78\x09\xe3\xc3\xc9\xb4\x14\xcb\x90\x15\x5b\xb5\x4c\xcd\x56\x94\xcd\xf8\xc4\x5c\x3f\xa4\xad\xb9\x6e\x48\x5b\x73\xcd\x90\xb6\xe6\xdf\x15\xd2\x96\xfb\xc0\x2e\x68\x85\x61\x6f\x2f\x11\x9e\x83\x8f\xcc\x27\x45\xa8\x35\x57\x47\xa8\x9d\x55\xf9\x88\x19\x09\x35\xb6\x98\x91\x6b\x5a\xa3\x31\x54\x10\x52\x7d\xd7\x47\x9a\x6a\x21\xd7\xf0\xa1\xa2\x40\xdd\x54\x20\x1c\xc9\x1e\x34\x47\xae\x81\xc5\x2c\x53\x53\x54\x15\xda\xb2\xac\xaa\x8a\xa1\x1b\xd6\xa6\xd2\x8d\xd5\x17\x19\xb4\xcd\x3a\x56\x9f\x24\xd4\x64\x1d\xab\xef\xa4\x6e\xb0\x8e\x2d\x3f\x99\x75\x4a\xae\xf0\xdd\xcc\xe5\x66\xa1\x1b\xa1\xaa\xd5\x15\x45\xe8\x38\x4e\x5a\x5c\x53\x0f\x5f\xdc\x22\xbb\x2d\x3f\x85\xec\x56\x5f\xd8\xd4\x92\xec\x7e\x17\xd9\xf1\x25\xbb\x22\xd4\x1a\x3a\xb2\x75\x7b\x8c\x7c\xdb\x52\x7d\xcb\xd2\xe4\x91\xe7\x5b\x63\xcd\x1d\x1b\xbe\x2f\x6b\x32\x32\x64\x7d\xa4\x10\xe9\x5a\x33\x2c\xdb\x50\xa0\x61\xe8\x86\xad\x1b\xa6\xac\x6f\x1a\x04\x5b\x5e\x81\xe9\x9a\x58\xdb\x77\x0c\xb5\xe5\xda\xbe\x6d\xb4\x29\xd8\xca\xea\x5f\x47\x7a\x82\xd4\x27\x90\xbe\x02\xd4\x46\x41\xa9\xe5\x15\x8d\x06\xef\xc1\xd5\xca\x35\xef\xdb\xaa\x3d\x72\x4d\x84\x64\x38\x1e\xb9\x8a\xad\x20\xcb\x44\x9e\xef\xdb\x3e\x42\xae\xa5\xca\x9e\xef\x1b\x50\x53\x31\xf1\x2d\xd9\x82\xba\x66\xda\xa6\xa5\x19\xb6\x2a\x2b\x50\xdb\x70\xcd\x43\xd8\x17\x6e\xba\x83\xf8\xb0\x2f\xca\x70\x8b\xf8\xb0\x2f\xae\x6d\xeb\x56\x63\x3d\x03\xf1\x99\x98\xf8\x8c\x4b\xbf\x02\xd7\x46\xf4\x87\x7d\x31\xb9\x4b\xfa\x8f\x57\x2f\xfe\x11\xf4\x46\x86\xe1\x43\xc3\x80\x63\xcd\x50\x46\xaa\x66\xea\x63\x45\x91\x47\xae\x0b\xc7\x8a\x65\x5a\x68\xa4\x8e\x11\xbe\xd1\x9a\x10\x1a\x8a\xa6\xeb\x3a\x54\x6d\x45\xd6\x2c\xd3\xb0\x36\xa4\xbf\xb2\xc1\x9d\x56\x5d\xfb\x52\xab\xae\x7b\xab\x55\x9f\x7e\xad\x5d\x87\xfe\x4f\x5e\xff\xea\x93\xae\xa5\x55\x6c\xf6\xd1\x7f\xb8\x99\xec\xa8\xca\xa3\xf1\x58\x47\xbe\x2e\x1b\x1a\x34\x7c\xd9\xb5\x4d\x0f\x9a\xb6\xa7\xf9\x1a\x84\xaa\xee\x5b\xe3\xb1\xeb\xab\x0a\x66\x06\x22\x59\xda\xba\xaa\xd9\x9a\xa1\xab\x26\x3e\x10\x36\x64\x06\xbd\x8f\xc0\x1d\xcc\xa0\xf7\xd1\xa9\xc5\x0c\x7a\x1f\x26\x5b\x19\x11\x94\xbf\x4b\x7e\x9c\x16\x2a\xf6\xbf\x47\x82\xac\x4c\x6d\x23\x7e\xd2\xfb\xd6\x51\xc9\x4f\x93\x2a\x3f\xb1\x07\x0b\x8e\xa9\xd5\xb9\xd3\x2a\x2b\xe9\x8a\x22\x8f\x3d\x38\xd2\x64\x73\xe4\x5a\xae\xa9\x8d\x46\xbe\x62\xeb\x9e\xa9\x1b\xae\x82\x14\xdd\x1a\x8d\x55\x57\xd6\x75\x72\xae\x40\x5b\x55\x2d\x43\xb6\x65\xc5\xb6\x0c\x55\xb7\x36\xbc\x86\x40\xa3\xef\x72\xd1\xc1\x4a\x46\x5f\x76\x84\x16\x2b\x19\x7d\x91\xf9\x9b\xac\x64\x18\x7f\x17\x2b\xad\x12\x3a\xdb\xac\xf6\x2c\x0c\x55\x4e\x70\x23\x86\x32\xfa\xae\x72\x25\x43\xdd\x2e\x63\xa8\xda\x41\xa5\x1a\x50\x53\x3c\xcd\xd6\x74\xdb\xb0\x7d\x57\x1f\xa3\xf1\x48\xb3\x74\x7d\x84\x74\x24\xcb\xfe\x48\x81\x2a\xb4\x74\x8f\x5c\x4e\x2c\x28\xdb\xb6\x61\x5b\x9a\x2a\xdb\x16\x54\x65\x65\x53\x29\xd5\xdc\x40\x50\x31\xd7\x16\x54\xcc\x75\x05\x15\xf3\xe9\x82\xca\xf3\x30\x54\x71\x94\xfd\x45\x0c\x65\x3e\x4d\xe2\x31\x57\x4b\x3c\xa7\x6b\xef\x50\x08\xea\x3a\xf2\x3d\xd9\x43\xb6\x3d\x36\xc6\x3a\x42\x9a\x3c\x36\x5d\xdf\x34\x0d\x68\xc8\x9a\x66\x59\xa6\x02\x47\xb2\x42\x74\x9d\x8a\xaa\x98\xb6\x05\x6d\x53\xb7\x54\xa8\xc8\x70\x53\x86\xb2\x37\x38\xec\xec\xb5\x0f\x3b\x7b\xdd\xc3\xce\xfe\xab\x0f\xbb\x83\xdb\x38\x4e\xd1\x7a\xe2\xf1\x5f\xc4\x53\xf6\xd3\x4e\x3d\x7b\xf5\xa9\xb7\xbf\xf6\x26\x85\x34\x4b\x53\x46\xba\x2b\xfb\xd6\xc8\xf4\x6d\xcd\x85\xaa\xa7\x99\xda\x08\x41\xdf\x1f\xc9\xf2\x58\x57\x8c\xb1\xa5\xa9\x36\x96\xa6\x65\x5b\x31\x75\xc5\x36\x74\xd9\xb6\x74\xcd\x80\xf2\xa6\x69\x7e\x7a\xaf\xc7\x1d\x79\x7e\xe4\x75\xd5\xb4\xd5\x9a\xcb\x33\xfd\xc8\x7f\x9f\xa2\x76\xb5\xc8\xfd\xd7\xf0\x54\x65\x8e\x1b\xa5\xf4\xe9\x55\x47\x54\x33\xad\x3c\x4f\x5e\x15\xb4\x24\x5f\x48\x2d\x39\x48\x3a\xdd\x31\xf8\x5a\xee\x10\x2d\xcf\x47\x50\x84\x81\xcc\x33\x21\xf0\x37\x20\xf8\x2f\x4c\x23\x52\x49\xc0\xd1\xce\xb6\x51\x3e\xdf\xbc\x8a\x53\x5c\x8b\x64\x1a\xbb\xcd\xb3\x8b\xb0\x8c\x20\xa4\x4f\x12\x0d\xa4\xcc\x0b\xb2\xb4\xdb\xfc\x31\xbe\xd5\x61\xf1\x81\x64\xf2\x20\xf3\xca\x3d\xba\x7b\xba\x9a\x95\xdf\xeb\x5d\x55\x3e\xb8\xf3\x2c\xf6\xe2\xe9\x2c\x44\x19\x6e\x12\x8f\xc7\x5d\x39\x60\x70\xe7\xb5\x29\x1f\xe4\x39\x40\xda\xd4\x64\xb8\xfb\x0c\x7a\x5d\xa1\x8f\x99\x9b\x20\xb7\x96\xfa\xa4\x39\x36\xcd\x6f\xd2\x2a\x5d\x46\x27\x56\xa5\x4d\x27\x9a\xaa\x87\xa7\x09\x7b\x66\x49\x30\x75\x93\x07\xf6\x8b\xd9\x05\xb0\x0c\x21\xc9\x6b\x1a\xb9\x80\x07\xbc\xcf\xac\x2d\xf9\x32\x73\x48\xb4\xc9\x62\x58\x2b\xb7\x4e\xba\x2a\x21\x8c\x97\xdb\xae\x75\x4f\xbd\xf2\x95\x26\x12\x28\x8b\x5e\xe3\xdf\x45\x9e\x98\x56\xf1\xaa\x64\x37\x4b\x26\x5a\xfb\x4d\xa7\xc5\x1a\xb8\x89\x5f\xf9\x73\xe7\x16\xb9\x7e\x91\x31\x86\x94\x90\xf8\xda\xd5\x02\x96\xce\x65\xbe\x0a\x0f\x6d\x43\xc6\x5e\xa4\xf4\x56\x65\x18\xea\xfe\x5e\x47\xd7\xd2\x3a\xb3\x55\xc0\x46\xa5\xd7\x5c\x27\x84\xf5\xef\x0c\xac\x4a\x61\x1d\x96\xf6\x07\x7f\x4d\x00\xf0\x61\xb6\x0c\x00\xf6\xbd\x0e\x00\x2e\xec\x04\xa0\xf2\xe1\x6a\x15\x00\x1f\xea\x26\x88\x6c\xf4\x73\x7c\xdc\x96\x76\x94\xbd\xf8\xd9\xa4\x75\xce\xf6\x95\x3a\xa7\x7d\x98\x5c\x5e\x69\xfc\x2c\x93\xea\xc5\xf9\x26\xad\xfb\x27\xd5\xa6\xce\xf2\x4a\xc3\x55\x93\x9a\x36\x5d\x3e\xbb\xcd\x45\x3b\xa7\xb4\x7e\x5b\x36\xa1\x35\x1b\xd4\x27\xb8\x59\xa3\xc9\xc6\x13\x5e\xc5\x8d\x2b\x1a\xf4\x4d\xad\x97\x0b\xd7\xa8\x79\xfb\xd4\x49\xf4\x72\xdf\x8a\x06\x2b\x26\xd1\xe6\xba\xb5\x6a\xd6\x92\x61\x8d\x42\x37\xba\xc3\x12\x5a\x90\xd1\xb4\x7b\xe4\xf7\x0d\x38\xdd\x78\xae\x1b\xee\x26\x9b\xb5\xef\xc3\x44\x7f\xa3\x15\x88\x59\xd9\x70\xff\x99\x10\xb0\x3e\xed\xd7\xd9\x7b\x36\x68\xf4\x24\x04\x54\x1b\xb6\xb2\xd6\xa9\x64\x5b\x1b\x07\x93\xff\xcd\x4b\xd7\x91\x97\x6e\xed\x3c\x71\xb9\xcd\x72\x25\x5f\xdc\xd3\xb3\xc0\x1d\x2c\xc9\x02\x97\xc7\xf9\x57\x81\xd2\xcc\x1d\xa1\xb1\x16\xd5\x54\x6f\xa4\x40\xcb\x0b\x8c\xe5\xa9\xa5\xcc\x22\x9f\x17\x49\x6a\x90\xbd\x7a\x27\x58\xa0\xc8\x88\x61\xf7\x64\x4f\xab\xe5\x7e\x33\x8b\x59\x40\xf0\x13\x02\x2a\xe8\xcb\x31\xb0\x32\x95\x17\x54\x8a\x54\x5e\x76\x51\xa6\xf6\x26\xe3\x22\x63\x6a\xe0\x62\x49\xd6\xa8\x12\xc3\x3a\xb8\x5c\x55\xaf\x2b\x39\x07\x34\x9a\x08\x85\xe6\x72\x8c\x42\xab\x8e\x52\x92\xa1\xc1\x66\xe9\xb7\x6a\x89\xcb\xe4\x32\x71\x59\x91\x24\x4b\xe9\xcf\x3d\x46\xd2\xa5\x29\x60\xf4\x94\x69\x28\x6a\x73\x1a\x0a\xcb\x64\x92\x5f\x66\xbb\x92\xbd\xe9\xed\x99\x28\x06\x4b\x6b\x57\x9b\x89\x59\xce\x44\x13\x2b\x79\xd9\x96\xcd\xc4\x06\xc7\x9b\xce\xa4\x96\x45\x4d\x6e\xb2\xbe\x5a\x2c\x9f\x22\xc7\x8b\xca\x32\xda\x65\xec\x4a\xdc\x98\x24\x49\xac\xa8\x02\xfe\x6b\xae\x4c\xb5\xa6\x15\x73\xa6\x29\xc7\x48\x9d\xb2\x43\xa3\x27\xd5\x9a\x59\x4b\xb5\x56\x2c\x09\xd5\x02\xaf\xd7\x5e\x12\xb5\x1c\x74\x36\xe0\xb3\xe2\x22\x0f\xcb\xfc\x33\x72\x2f\x56\xf3\xb4\x6b\xdd\x89\x42\xf0\x3c\x34\x05\xf0\x15\x53\xe4\x4a\x2c\x39\xce\x2d\x32\x7a\x04\x69\x61\x45\xdb\xce\xda\xd1\x97\xff\x4d\x6d\x12\x43\xd3\x9a\x0c\xa7\x55\xb2\x50\xd2\x44\x7d\xab\xd2\x50\x56\xe2\x4c\x2e\x72\xfe\xd3\x0c\x96\xcd\x6f\x29\x38\x66\x0b\x9c\x3c\xdd\x64\x99\x35\x4f\xb3\x57\x66\x3b\xd4\xe5\x82\x19\x68\x1a\x3b\xbc\x3d\xea\x90\x25\xad\x23\x35\x94\x6e\x7e\xd0\xd5\xce\x1d\x52\xd7\xc0\xf9\x67\xed\x90\xba\x5e\xac\x34\xa5\xc0\xac\x6e\xd4\x92\x1d\xea\xc5\x68\x26\x78\xc0\x4b\x4c\x29\x83\x7a\x2b\x46\xab\xc7\xfe\x65\x4a\xfa\xb6\x97\x31\x94\x21\x03\x9e\xaa\x7d\x83\x68\x52\x33\xd1\x7d\x12\x1b\x19\xb0\x49\x37\x23\xcf\xc9\xa4\x14\x39\x99\x8c\x9c\xd7\x94\x22\x71\xa5\x91\x33\x9b\x62\x17\x90\xe9\xa0\x88\x7b\xca\x31\x51\xa9\x95\x29\xd5\xc8\x37\x77\xb5\x48\x18\x6a\x14\xac\x53\x30\x8a\x61\xb5\xa0\xb2\x5b\xdc\x64\xae\x4e\x56\x6a\xc2\x0e\x6e\x32\x15\xa0\x2a\x45\x8d\x9e\x6c\xa5\xa6\xd6\xc9\x4d\xa6\x0e\x7e\xfd\x2c\x6e\x32\xcb\x5c\xa5\x6a\x31\x39\xb3\x96\xab\x54\x2d\x72\x95\x9a\x16\x38\x5c\xc9\x4d\x66\x7f\xae\x52\x92\xf4\xb5\x37\x8f\x11\xa6\x99\x05\xeb\xdc\xb4\xbe\x21\xef\x93\xb8\xcd\x52\x9a\x74\xb5\xd4\x16\x5d\x2d\x6d\x29\x5d\x09\xd8\x7a\xed\x04\xb1\x8c\x0e\x32\x5b\x26\x28\x0f\x11\xcb\xea\x26\xb3\x65\x77\x92\xd9\x96\xc1\xc7\xca\x49\xb9\x39\x99\x6d\x58\x92\xb9\x14\xed\x94\x1a\x99\xcb\xd1\x54\xf0\x61\x25\x99\x6d\x6d\x29\x99\x6d\x7d\x19\x99\x6d\xa3\x4e\xe6\x65\x46\x12\xeb\xd2\x95\x8c\x6a\xb6\xa8\x67\x5b\x2b\x57\xa5\x6d\x77\x90\x0b\xca\x32\x50\x2b\x89\x88\x61\x9f\x1c\xac\x74\x0b\xc2\xb2\x0a\xbe\xfd\x2c\x92\x41\x59\x2b\x69\x66\x97\x80\xe8\x55\xa2\x69\xa5\x74\x2b\x1b\xe0\x6e\x25\xd5\xa0\x6c\x2e\x25\x1b\x94\xad\x65\x74\x83\xb2\xbd\x16\xe1\xc8\x23\xdf\x53\x16\x24\x84\x2d\x99\x0e\x42\xd8\x22\x2a\x84\xcb\xf3\x14\x13\x58\x61\x5d\xac\x83\x50\xeb\x22\x33\xd4\x81\x56\xe9\xb7\x47\xb8\x83\xd0\xec\xb9\xef\x58\xe0\xed\xe7\x91\x19\xda\x05\x99\xb5\xe2\x18\x80\xf8\x66\x50\x21\x73\x91\x22\x17\x2a\x10\xbc\x59\x4d\xe6\x3c\x8f\x73\x1f\x99\x15\x75\x29\x99\xf1\xcd\xa0\x76\xa8\x2f\x37\x11\xd8\x64\x89\x42\x45\x6f\x93\x33\x4f\x0d\xbd\x2c\xcf\xb7\x62\x76\x91\x4f\xb1\x80\x56\xde\xcb\x94\xbe\xdb\xaa\xda\x73\x5d\x55\x21\xf8\xe2\xf3\xc8\xa7\x96\x17\x56\xad\x4c\x2c\x49\x12\x3c\x97\xe4\x33\xca\x01\x35\x70\xb2\x9a\x7c\xaa\xbe\x9c\x7c\xf9\x1d\xa4\x87\x7c\xf8\x2a\xb2\x1e\xf9\x9e\xb4\x50\xd7\xfd\x97\x82\xda\x12\x9d\xa0\x6a\xb7\x24\x3a\x58\xa4\x8f\x2e\x45\x3a\x58\x26\x90\x2e\x64\x3a\x88\xef\x2f\x65\x00\x84\x5e\xb1\x0e\x96\xd7\x91\x32\x11\x7c\x71\x21\x29\x05\x3b\xa8\xe9\x2d\xf0\x34\xa3\xcd\xa0\x9a\xb9\x9a\x41\x35\xab\x8b\x41\x35\x1b\x68\xe5\x34\x75\xb9\x87\x41\x75\xd8\xcd\xa0\xba\x02\x5e\x7e\x9e\x42\x05\xdf\x43\x72\x06\x2d\x71\xab\x6b\x35\x06\xb5\xcb\x01\x75\xf0\xc3\x6a\x06\xd5\x8d\xe5\x0c\xaa\x9b\x4b\x19\x14\xdf\x38\xaa\x0c\xba\x89\xbd\xed\xd3\xce\x15\xdd\x6e\xd1\xd9\x90\x5b\xca\x02\x68\xc0\xd5\x74\xc6\x17\x92\x36\x9d\x0d\x15\xe8\x25\xab\x19\x5a\x0f\x9d\x0d\xbd\x5b\x4b\x00\x0d\x03\xbc\xfa\x3c\x42\x1b\xa5\x0a\x46\x2f\x39\x97\x5c\x5d\x0a\x42\xeb\x4a\x39\xa0\x0d\x7e\x5b\x4a\x68\xaa\xe9\x5a\x2a\xae\x43\x7c\xa1\xe1\xaa\x94\xc4\x9b\x4b\xcd\x76\xaf\x42\xad\x8e\x14\xa0\xad\xe1\x94\x36\x4d\xf2\x2b\xd1\x32\x9a\x98\x9d\x67\xbb\xa9\x03\xbd\xa4\xb7\xd9\x77\xb6\x9b\x3d\x9a\x1b\x68\x5a\xe0\xdd\xe7\xd1\xc4\x2c\x0f\x77\xbd\x3c\xa6\xac\xda\xe1\xae\xeb\x45\x75\x7c\xfd\xc9\x89\xa1\x97\x87\x86\xa5\x80\x1f\x57\x93\xca\x5a\x7e\xa6\xe3\x6b\x4c\x8d\x54\x87\x58\x76\x3b\x2f\x8e\x84\xd3\x9e\x23\x61\x39\xd5\xea\x10\xb4\x37\x53\xcb\x68\x13\xd4\x5a\x63\x33\xb5\x3a\x37\x53\xcb\x06\x7a\xb9\x99\xda\x7d\x9b\xa9\x0d\x7b\x08\x6a\x2b\xe0\xbb\xcf\x23\xa8\x5d\xee\xa6\x7a\xb9\x9b\xda\xb5\xdd\x54\x2f\x77\x53\x5b\x07\xdf\xaf\xa6\x9c\xbd\xfc\x38\xc7\xb7\x9a\x1a\xe5\x98\x02\xaf\x83\x78\x4f\x58\x72\xb6\xd5\xa6\x90\xbd\x5a\x31\xa6\xc8\x5d\x9a\x31\x45\x86\xc0\x90\xcb\x3a\x3d\xba\x31\x45\x56\xbb\x29\xa4\xc8\x1a\xf8\xe5\xb3\x28\xa4\xc8\xa5\x7e\xcc\x28\x5f\x51\xe4\x9a\x82\xcc\x28\x95\xed\xf8\x42\xd4\x5e\x72\x8a\x6c\x81\x6f\x56\x12\x4e\x91\x97\xaa\xc6\x14\x7c\x99\x59\x93\x70\x4f\x5b\x75\x9b\x48\x62\x0a\x6c\xa9\xd6\x14\x58\xe4\x3b\x2f\x33\x07\xe2\x6b\x93\x3b\x9b\xed\x64\x77\x13\xfa\xaa\x96\xf2\xc0\xd0\x7a\x7b\x27\xf9\x00\xc9\xbb\x16\x49\xfe\x57\xda\x47\x82\xac\x8c\x70\x26\x56\x73\x00\x92\x7a\xc4\x16\x12\x64\xed\x44\x09\x79\x55\x42\xa1\xd9\x0f\x6f\x85\xac\x9d\x29\x8f\xf4\x92\x5d\x09\x6a\x5e\xd9\x2a\x2b\xb7\x72\x7e\xd5\x8c\x0c\xf3\x96\x56\xde\x52\x2d\x20\xaa\xd8\x19\x82\x2c\x8f\x4a\x15\x27\x47\xd1\x7c\x2a\x5d\x1c\xfd\xf0\xe6\xf8\xe2\xe8\xb0\x3d\x8f\x65\xad\xde\xee\xbf\x3e\x3e\x1c\x1e\x9f\x0f\xcf\x2e\x86\x2f\x7f\x38\x3c\xcd\x5b\x6b\xfd\xd0\xe6\x26\x8a\x39\x9c\x54\x4b\xfe\x74\x40\x97\x0c\x95\xbf\xfa\xe4\x43\x51\xf6\x7e\xfa\x50\xb5\x2c\xf1\xcb\xe8\x70\x80\x92\x8c\xa4\x8c\xcf\x91\x29\x57\xc7\x2b\xec\x03\xb3\x5a\x92\x23\x51\xa8\xd8\x0b\x92\x7c\x20\x65\xb0\xc6\xc7\xc7\xac\x0c\xd4\x57\x23\x11\x9d\x79\xf1\x6d\x8f\x7f\x7b\x74\x71\xfc\xf2\xf8\xe8\x90\x1f\xd0\x3f\x7f\xe4\x0e\x2e\x8e\x0e\x8f\x4e\xaf\x8e\xf7\x5f\x5f\xf2\x39\x2a\x34\xa3\x86\x3f\x74\xf7\x8b\x40\xb7\xba\x9d\x12\x86\x17\x1d\x63\x2e\xc1\x76\x61\x1e\x98\x8f\x41\x45\xb4\x3a\xba\x73\xeb\x40\x90\xb1\x30\x83\xc5\x64\x9e\x0d\x8e\x6e\xbb\xbb\x1c\x28\x53\x59\x0a\xd4\x92\x14\x20\xb5\x95\xf8\x1c\x80\x56\x8c\xf2\x8a\x45\x6b\x2e\x85\xae\x2b\x5e\x66\x95\x37\x9f\x11\x2a\x92\x02\x20\x5f\xa2\xb2\xbc\x1c\x69\xcd\xb4\x98\xcf\x8e\xaa\xb5\xad\xf9\x0a\x90\xe9\x51\xff\x1f\xc5\xe4\xda\xd6\x7a\x05\xd0\x4a\xc7\xa6\xbd\x0e\x9e\x9f\x6f\xf1\xac\x69\x28\x57\x40\xac\x75\xec\xde\x9b\x2d\xa7\xcd\xd0\xad\x6f\x00\x7a\x17\x5b\x18\xea\x53\xd9\x42\xff\xcb\x50\xdc\xc5\x09\xa6\x5e\xeb\xa9\x9f\x13\x5a\xa1\x32\x9f\x06\xef\x26\x78\x5d\x63\xf5\x59\xcb\xd9\xe2\x3f\x82\xe6\xd5\xeb\x4f\x91\xe1\xb3\x60\x9d\x1e\xf4\xd4\xf8\x0c\x64\xcd\x34\xae\xa2\xb8\x00\x7e\x90\x60\x89\xf9\x1e\xa5\x83\xeb\x7d\x69\xf8\x23\xd8\x97\xbe\x7b\x0d\xf6\xa5\x74\x02\x22\xe9\x4c\x07\x17\xd2\xb7\x3a\xfe\xff\xc9\xe4\x7b\x70\x21\x7d\x37\xfd\x05\x5c\x48\xbf\xde\xbf\x06\x97\x12\xfe\x2b\xfa\x15\x37\x78\x89\xff\xfc\x78\x71\x8e\xdb\x7e\x07\xf6\xa5\x39\xb8\x90\x0e\x4e\x0c\x5c\xf3\xce\x06\x17\xd2\x64\xfa\x6f\x70\x21\x7d\xff\xeb\x19\xb8\x90\x5e\xef\x9f\x83\x0b\x69\x74\x72\x0f\x2e\xa4\x7f\x1f\xe1\x9e\xdf\xfe\xba\x8f\xfb\x3f\x1f\x81\x0b\xc9\x3b\x78\x0b\x2e\xa4\xa1\x76\x02\x2e\xa4\x77\x3a\x04\x17\xd2\x43\x1a\x83\x08\x43\xb3\x2f\xfd\x78\x0a\xf6\xa5\xef\x13\x70\x8f\x24\x5c\xeb\xd8\xfe\x0d\x5c\x48\xbf\x1d\xbe\xbc\x01\x69\xf6\x10\xe2\x09\xf0\x12\x25\x55\x71\x83\xba\x1e\x46\x13\x76\x9d\xd9\xf9\xe7\xc1\xd9\xc9\xf9\x3f\x6f\x3e\x4d\xdd\x64\x12\x44\x3b\x21\x1a\x67\x03\x79\x21\x8d\xb2\x88\x8a\xde\xab\xea\xc2\x04\x4d\x69\x75\x1f\x85\x28\x43\x5d\xf5\x47\x71\xe2\xa3\x64\x10\xc5\x11\x5a\x30\x58\xc8\xf5\x68\x49\xdf\x59\x3c\x1b\x48\xb8\xef\x5d\x56\x30\x8a\xb3\x2c\x9e\x0e\x14\x6d\xf6\x71\x21\x55\xad\x69\xba\x3a\xf9\x10\xf8\xd9\xed\x40\x97\xe5\xd9\xc7\xdd\x5b\x14\x4c\x6e\xb3\x01\x54\x64\xdc\x12\x25\xc9\xb2\x79\x7d\xdc\xa1\x4d\xa1\xa9\xcf\x3e\x2e\xf8\x9b\x85\x08\xd0\x42\x14\xc4\xdd\x22\x65\x79\x96\x55\x53\x96\x97\x59\xc8\x0f\xa4\xa3\xd9\x4b\x41\xdc\x2d\x8c\xeb\xe8\xa5\xa6\xbc\xd0\xe6\x25\xc5\xdb\x67\x71\xf1\x29\xd4\x09\xb9\xc2\xd8\x28\x0d\x6d\xaa\x77\x54\xc3\x6e\x5e\xa8\x74\x96\x63\x1d\x98\x44\x00\x20\x26\x07\xab\x2e\x61\x66\x69\x00\x63\x92\xe5\xb4\xdc\x00\xe6\x40\x3a\x78\x75\x22\x90\x9d\x23\xfe\xf8\x41\x10\x3b\xf2\xca\x45\xf3\x30\x5c\xe4\x10\x5b\x35\x25\xb2\xd2\x82\x62\x11\x8c\x05\xa5\x8e\x38\xd2\xef\x6e\x87\x08\x8f\xda\x83\x11\xa9\xbd\x92\xa9\x3e\xc9\x3a\x33\xd5\x3f\x77\xa2\xfa\x28\xeb\x34\xa0\xec\xbe\x78\x13\x5b\x3b\x60\x96\x17\xd6\x4a\x47\xc1\x13\x3a\xd2\xbb\x3a\x8a\x9f\xd0\x91\xd1\xd5\x51\xf8\x84\x8e\xcc\xae\x8e\xdc\xfe\x8e\x7a\xb0\xcf\xe8\x53\x60\x9f\x68\x2c\x00\xcf\x5d\xdd\xa2\xee\x9c\xa4\x2c\xeb\x71\x30\x89\x52\x92\x60\xb4\x3b\x87\xa9\xd4\xa1\xb9\xa8\xc0\xe9\x75\xb2\x8c\xa2\x3e\x37\xcf\xa4\xb5\x9d\xa2\x8a\x92\x5c\x9d\x63\x5a\xf9\xac\x4b\xb3\x4c\xa2\xcc\x28\x57\x47\x26\x7d\x11\x4c\x67\x61\xe0\x05\xd9\x2e\x3b\xb8\x98\x4b\x17\x4d\x8f\x5c\xbb\x6b\x9e\xfd\x3a\x17\x58\x71\x65\x89\xcc\xff\x3f\xf6\xde\x44\xbb\x6d\x23\x6b\x17\x7d\x15\x18\xa7\x7f\x5f\xf2\x18\x42\x50\x98\x41\x5d\xb6\xaf\x2c\xd1\xb6\xda\x9a\x22\xc9\x72\x27\x3a\x5a\x0a\x86\x82\x84\x36\x08\x30\x00\x28\x4b\x91\xf9\x0e\x79\x83\xbc\x5b\x9e\xe4\xae\x9a\x80\xc2\x44\x52\xb2\x9c\x3f\xe7\x5f\xea\x5e\x49\x44\xa0\x50\xb5\x6b\xde\xb5\x6b\xef\xef\xeb\xac\xaf\xa6\x3e\x75\x7d\x67\x7f\x93\xfa\x06\xdd\xf5\x35\x48\x7d\xb1\x09\x75\x69\x7d\x9b\xf5\x3a\xfd\x9b\xd4\x2b\xec\xae\x97\xfd\xd8\x7a\x5d\x7e\xef\x7a\x11\x75\xac\xa3\x66\xf4\x05\x57\xb7\xab\xce\xba\xe9\xe0\xb1\x75\xbb\xfe\x9b\xf4\xd9\x41\x77\xbd\xf4\xc7\xd6\x6b\xeb\x6f\xd4\x67\x87\xdd\x75\xb3\x9e\x7a\x5d\x99\xfc\x4d\xfa\x72\xda\x59\x5f\x43\x79\xea\xfa\xde\xfc\x4d\xea\xbb\xdd\x5d\xdf\x27\xdf\x27\x7f\xfe\x1b\x8d\xe9\xe3\xee\x3a\x3f\xf9\x98\x3e\xf9\x9b\xf4\xb1\xd7\xad\x3e\x3f\xf9\x98\xde\xfd\xef\xef\x63\x92\xcb\x5e\x31\x3e\xc7\x3c\x37\x84\x8e\x69\x6f\x72\x7c\xf9\xfe\xf0\xe4\x54\x42\xcf\x3e\x9e\x4c\x8e\x31\xd7\x09\xfa\x71\xb4\x75\x72\xf2\xe9\xf0\x78\x47\x6a\xa4\xde\x9e\x1c\x93\xd4\xab\x08\x53\xd6\x60\x2c\xb9\xd8\x8c\x61\x21\x1c\x15\x63\xc2\xff\x83\xa1\x3c\x04\x28\xc0\xdb\x02\x26\x41\x2e\xc0\xe2\x3e\xb9\x3a\x4c\x76\x93\xa8\x18\x0c\xef\xf3\xf9\x0c\x66\x72\xf5\x80\x91\xff\x14\x7b\xcd\xbb\x29\xca\x1b\x34\xcf\x32\x98\x14\xbc\x55\x65\x92\x04\xb3\x34\x4a\x8a\xa3\x2c\xbd\x89\x02\x98\x35\x48\x57\x4e\x0a\x38\xdb\x81\xb9\x9f\x45\xb8\x4f\x28\xea\x43\x3e\xb8\x0f\x23\x18\x07\xf9\xa8\xab\xe1\x2e\x16\xc3\x45\xa7\x0c\x90\x90\x6b\x14\x63\x51\xdc\x84\xe3\xf1\xf8\xea\x75\x31\x16\xf7\xdd\x64\xee\xc6\x82\x38\x42\x4f\x2e\x5f\xbe\x1c\x14\x63\xf1\x10\x17\x86\x9e\x52\x71\x5a\x77\x6d\xe3\xe2\x95\x78\xb6\xff\xc5\xcd\xa0\x70\x70\xf2\x6f\x61\x2b\xb8\x41\xef\x02\x01\x15\x2a\xb0\x94\xc2\x09\x25\xdf\x10\x5b\xf4\x4f\xa4\xe5\x1a\x4f\x25\x57\xfe\x19\x73\xa8\xc3\xe4\x0a\x66\x1c\x0d\xd1\x8d\xbc\x27\x9f\x9d\x1c\xbd\x9f\x1c\x4f\x1a\xa4\x5d\x93\x83\x9d\xa3\xc3\xdd\x83\xd3\xcb\xa3\xe3\xc3\xb3\xdd\x1d\x34\x18\xde\x6f\x1d\xbc\x9b\xec\x48\x83\xfb\x99\x7b\x87\xe4\x1e\xc1\x45\xc9\xe4\x94\x26\xcb\xda\x9e\xf2\xda\xc0\x21\xa6\x5a\x5f\x2b\xe5\xfd\xba\xfd\x3a\x86\xd2\x5e\x51\x52\x5e\xad\xfd\x15\xea\x24\x38\xfe\x67\x17\xa7\x20\x6c\x72\x47\x0e\x47\x2c\x25\xcf\x7d\x06\x31\x8f\x19\xe9\xc6\x7e\x9e\xfb\x9e\xf1\x42\x19\xab\xc8\xa8\x6b\x8c\x45\xda\x06\xc3\x45\x70\x97\xb8\xd3\xc8\xe7\x5e\x0d\x1a\x6c\x64\x57\x90\xc8\xcc\x71\x0d\xd7\x87\xec\x90\x31\xb9\x14\xaf\xb9\x38\xa4\x91\x20\xbe\x2a\x46\x0f\x68\xab\xcb\xd7\x50\x0e\x2a\x31\x3e\xcc\x3d\x78\x16\xcd\x46\xb5\x87\x1c\x41\x0e\xf7\x74\x2c\x32\x26\x8b\xd5\xa3\x9a\x51\xca\xa0\x35\xae\x5d\x5a\x35\x7b\xe2\x3b\x21\x7f\x54\xa6\x1d\xc4\x3d\x74\xe6\xb2\x66\x2a\x9f\x67\xcc\x28\x34\x28\xbe\x7e\x1d\x14\xe3\x6d\x39\x31\x7e\x1b\xc0\xe1\x70\x38\xc8\xbe\x7e\x45\xfb\xca\x60\xf8\x10\x1e\x9f\x9b\x7c\x76\x0d\x33\xf8\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xf3\xcc\xe7\xb3\x5e\xe7\x3f\xf3\xf9\x3c\xf3\xf9\xac\xd5\xff\xcf\x7c\x3e\xcf\x7c\x3e\xcf\x7c\x3e\xcf\x7c\x3e\x6b\x0e\xa5\x67\x3e\x1f\x36\xa0\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x9e\xf9\x7c\x1e\x57\x89\x67\x3e\x9f\x67\x3e\x9f\x67\x3e\x9f\x67\x3e\x9f\xef\xc0\xe7\x53\x14\xff\x23\xf8\x7c\xb2\xe2\xaf\xe7\xf3\x49\x8a\xf5\xf8\x7c\xa2\x55\xe9\x3a\x11\x0f\xff\x76\x7c\x3e\xe9\x63\xaa\xf1\xb7\xe4\xf3\x89\x1f\x5a\x13\xbe\x46\xff\xd7\xf0\xf9\xb8\x6b\x4f\x09\xbe\x49\x9f\xf9\x7c\xfe\x87\xf2\xf9\xf8\xdf\xb4\x42\x3e\x94\xcf\x27\x2f\x9e\xf9\x7c\xfe\x27\xf3\xf9\xcc\xbf\x69\x34\x3d\x94\xcf\x67\xb6\x72\x34\x3d\xf3\xf9\x7c\x17\x3e\x9f\xa0\xf8\x2b\xf9\x7c\x4e\x57\x76\xf3\x33\x9f\xcf\x4a\x3e\x9f\xf0\x9b\xba\xec\x11\x7c\x3e\x97\x2b\x7b\xed\x99\xcf\xe7\xe9\xf9\x7c\xae\xbe\xad\x9b\x1f\xce\xe7\x73\xbd\xba\x9b\x9f\xf9\x7c\xd6\xe6\xf3\x39\xf8\xb6\xee\x7b\x38\x9f\xcf\xd6\xea\xee\x7b\xe6\xf3\x79\xe6\xf3\x29\xf9\x7c\x0e\xbf\xcd\xa0\xf2\x70\x3e\x9f\xc9\xea\x01\xfa\xcc\xe7\xf3\x1d\xf8\x7c\xa6\xdf\xd6\xd1\x0f\xe7\xf3\xb9\x59\xda\xd1\xa7\xcf\x7c\x3e\xb6\xb4\xfd\x6d\x7d\xf2\x64\x7c\x3e\x3f\xaf\xee\xaa\x67\x3e\x9f\x75\xf8\x7c\x8e\xbf\xad\x43\x1f\xce\xe7\x73\xb2\xba\xe7\x9e\xf9\x7c\x86\x1c\x9f\x8f\xf7\x4d\x3d\xf4\x74\x7c\x3e\xbb\x2b\x3b\xee\x99\xcf\xe7\x99\xcf\xe7\x99\xcf\xe7\x99\xcf\x67\x8d\xd6\x7e\xe6\xf3\x79\xe6\xf3\x79\xe6\xf3\x79\xe6\xf3\x79\xe6\xf3\x79\xe6\xf3\x79\xe6\xf3\x79\xe6\xf3\x79\xe6\xf3\x79\x00\x9f\xcf\x8d\x9b\x09\x77\xc5\x38\x1b\x98\xb6\xed\x18\x43\xe9\x57\xf4\xb7\xa1\xaa\xb6\x36\xdc\x24\x70\xb2\x3b\xc5\xf8\xfc\x1e\x29\xce\xa3\x53\xb9\x06\xec\x8c\x8b\x1b\x89\xf4\x99\x80\x9e\x89\x12\x3d\x64\xe5\x6f\x5c\xff\x33\x4c\x82\x1d\xb7\x70\x47\x2f\x14\xc9\x73\xfd\xcf\x51\x72\x75\xe8\xfd\x07\xfa\xc5\xe8\x3e\x88\xf2\x59\xec\xde\xe1\x69\x33\x12\xe9\x2f\xe2\xf1\x89\x7d\xfd\xe8\x0b\xec\x43\xba\x58\x5c\x54\xac\x43\xb7\x0f\x62\x1d\x02\x2d\xd6\x21\xd0\x62\x1d\x02\x2d\xd6\x21\xd0\xcd\x3a\x04\xfa\x59\x87\xd4\x47\xb1\x0e\xa9\xdf\x9b\x75\x48\xfd\xee\xac\x43\x5f\x78\xd8\x74\x22\x41\xed\x36\x48\xb5\x38\xec\xf3\x77\x9d\x89\x69\x0b\xda\x5c\xc2\xcf\xeb\x76\x32\xfd\x96\xe7\xd0\x29\x1b\x57\x7f\x44\xe3\x22\xa5\x89\xed\x0f\xd4\x2b\x0a\x5b\x2c\xa4\x2f\x85\x04\xa4\x7a\xcd\x0c\xbe\x6d\xb1\x33\x9a\xf4\x8e\xa6\xa2\x62\x99\xeb\xb6\xba\x3a\xac\x1f\xdd\x5f\x40\x76\x3e\x63\xc2\xb4\x0f\xc7\x24\x65\x3b\x21\xd7\x39\x67\x6d\xac\x79\x4a\x95\xb2\x06\xac\x3d\x71\x65\x58\x0e\x6b\x2f\x75\xd4\x49\xad\x55\x0a\xed\x90\x90\x3f\x6f\xec\x26\x79\x91\xcd\x7d\x66\x8d\x40\x9b\x9f\xc2\xcb\xfc\xb1\x2d\xf3\x5d\x72\x3b\x50\x38\x71\x99\xcd\x88\x38\x55\x60\x63\x10\x2f\xda\x9b\x1f\x3f\xaf\x00\xcc\x6f\x36\xe4\x19\xc5\xce\xaf\x35\x72\x35\x09\xb8\xd5\xa9\x39\xfc\xff\xd1\x8b\xe6\xcf\xdd\xad\x71\xad\x4c\x90\x9f\xbb\x2c\x7e\xcc\xde\x37\xa4\xc6\x3e\x8d\xbb\x5c\xeb\xb9\xef\xa8\xdd\x76\x90\x6b\x37\x34\x0c\x4d\xe9\xac\x90\x34\xa9\xb7\x5f\xd5\x56\x3f\xb6\x57\x28\x22\x27\x73\x5b\xa2\xeb\x4a\xd9\xee\xa5\xcf\x92\x23\x7d\x44\x45\xa9\x92\x98\x5c\x71\x95\xa2\xbe\x38\x75\xdf\x88\xe5\x77\x5a\x4b\xfd\x2a\x81\x5a\xbf\xd1\x3a\xdb\x2f\xef\x58\xd7\xba\xaf\xea\x1c\xa7\xb5\x15\x8f\x0c\xd3\x35\x8e\xc9\xcb\x94\xf8\x72\x9c\xd7\x26\xe1\x7e\x37\x59\x91\xf3\x34\x33\xb0\x2a\xe7\xed\xc3\xd9\xcb\xf4\x6a\x28\x70\x19\xfd\xf8\x88\x8c\xb4\xae\x8c\xde\x3f\x22\xa3\x4e\xaa\xb8\xdf\x1e\x38\xcb\xfa\x5c\xc7\xab\xbb\x45\xe2\x7c\x44\xe7\x99\xf3\xd8\x79\xb6\xbf\xcc\x98\xbe\x7c\x9e\x61\x67\xbe\xea\xee\x58\x69\x6c\xdf\x3d\x4e\xdd\x8e\xf4\xb6\xdf\xa7\x5b\x2f\x25\x03\x8a\xf4\xe3\x5a\xe9\x80\xf4\x7e\x55\xba\x27\x99\x48\x7e\xed\x44\xbf\x1d\x05\xd9\x92\xf9\xc4\xdb\x45\xe1\xa3\x6c\xc5\xcd\xaf\x98\xad\xf8\x61\x5f\x51\xb5\x76\xf7\xe0\xdd\xe5\xee\xd1\xe5\xc7\x83\xdd\x1f\x3f\x4e\xf8\x89\xfd\xa9\x9b\xf5\xc9\x78\xea\x89\xfd\xd3\x23\xa6\x51\x27\x2d\xe1\xbf\x1e\x91\x91\xdd\x95\xd1\x87\xef\x3a\x1f\x2b\x4f\x9f\x87\xce\xc7\x4f\x4f\x36\x1f\xcd\x75\xe7\xe3\x4f\x6b\xce\xc7\x7f\xfd\x95\xf3\xec\x28\x0d\xfe\xfb\xe6\x18\x37\x43\xfe\xd3\xa7\x7f\xea\x4f\xb4\xfb\xad\xab\x7f\xd2\x76\x39\xbd\x9b\x41\xc6\x97\x92\x66\x9d\xea\xe7\x9b\x87\xcf\x11\xb3\x73\xcf\xfa\xf7\x23\x32\xea\xa4\x37\x85\x59\x4f\x23\x9a\x6b\x70\xbb\x3e\xb6\x11\xb5\x6f\x6a\xc4\x22\x7b\x78\xdd\x3b\x17\x9a\xec\x11\x19\x39\x5d\x19\x25\xed\x46\xe4\x57\x2c\x6b\xd8\xb0\x12\x54\x4b\x98\xba\x7c\x09\xd3\x3a\x96\x30\x9d\xa3\x36\x36\xba\x97\x30\xb3\x7b\x09\xb3\x24\x98\x3d\x5a\x75\xa7\xcb\x15\xbb\x9e\xb7\xd8\xb3\xfe\x90\x01\xba\x36\x15\xd9\x7a\xba\x42\xb6\x2a\xdd\xfa\xca\x77\x39\x49\xad\xfe\xc5\xec\xba\x28\x66\xf9\x51\x96\xde\xde\x7d\xcc\xca\x5b\x69\xfd\xaf\x58\xcb\xde\x9f\x9e\xe2\x7b\x65\xf4\xdf\x13\x7e\x60\x47\x7f\xd5\x30\xc2\xa1\x58\x94\xcb\xba\x16\x4d\x54\xf6\xaf\x05\x1a\x63\xa9\xa3\x7f\x7b\xcc\x4f\x0d\xd1\xec\x95\x81\x8a\x4e\x87\x74\x40\x69\x70\x5a\x13\x7f\xeb\x4a\xbe\xf2\xe4\x08\xfa\xdd\xa5\x1f\x31\x60\xf4\xb5\x06\x4c\xe3\xa6\xbf\x1c\x35\x4b\xf6\xce\xea\xeb\xa3\xc6\xe5\x3d\xa8\x2d\x6e\x69\xd6\x43\x14\x58\xba\xbd\xf0\x44\xce\x4d\x65\x2e\xee\xfb\x5a\x5b\xe7\x6b\xb7\x77\x2f\x58\xdb\xa0\x43\xcc\x59\x29\x9d\xca\xc4\x50\x05\xca\x03\xbd\x26\xc5\x1d\x6f\x1e\xba\xe9\xd6\x2d\x59\x30\x71\xbd\x18\x36\xee\x6a\xba\x6d\x59\xed\xa4\x5c\xc3\xfb\xdd\x9b\x01\x99\x79\x7a\x73\xea\x7d\x83\x9d\xd7\x32\x9a\x93\xa6\xf4\xaa\xaf\xcc\xbc\x92\x28\xec\x86\x98\x7a\x3b\x4a\xc2\xcc\xe5\x5c\x6a\x09\x3f\x1a\xb1\x4c\x4c\xd3\x1b\x18\x48\x8d\x24\x5f\xa2\x38\x16\xae\x52\xa1\xb8\xce\xd2\xf9\xd5\xb5\xe0\x0a\x33\x34\xec\xd6\xf0\x4a\xe2\x39\xb5\x7b\x97\xa2\x8e\xb9\x46\x09\xcf\xf9\xf6\xb1\x2a\xe3\x99\x24\xbe\xfd\xb8\xb7\x27\x1c\x1c\x0a\x47\xc7\x87\xff\xfe\x49\xd8\xdb\x3d\x39\xad\xc9\x82\x63\x74\xd7\x9c\x9f\x38\x5d\x65\x3b\x0b\xe7\x71\x7c\x90\xe2\x69\xd5\xb4\x9d\xcd\xb3\x55\x46\xde\xa6\xe1\xaf\xbe\xc8\xaa\xad\x95\x4c\x5b\xbe\xc8\xea\x1d\x7b\xb5\x41\xdd\xb3\x4f\xab\x50\xfe\x56\x74\x60\xf7\x5e\x6d\x4b\xff\x79\xbc\x99\x8d\xee\xcb\xcc\xd9\xb1\x3c\xfe\x2f\x31\x93\xd1\x4d\xf8\xcd\x5a\x07\x0e\x55\xfa\xf7\x83\x0e\x1c\xad\xc0\x82\xd6\x8e\xa6\xb7\x0f\x77\xc6\xf2\xe6\x06\x66\xd7\xb6\x61\x51\xff\xe9\xda\xb6\x51\xa9\x2d\x46\xb5\x8a\xf6\xeb\x2d\x9d\x1e\x78\xed\xd3\x27\x8b\xf5\x5f\x16\x82\xdf\x3c\x82\xe2\x18\x7c\x8d\x7a\x36\xd7\x5c\x1f\xf5\x86\xb3\x31\x7e\xd8\x1f\x4a\xb2\xd4\x5b\xd0\x6c\x8d\x65\xb6\x2d\x83\xca\xab\x92\xb9\x8e\x1a\xe5\x79\x98\x45\xe0\xf8\xd7\xd0\xff\xec\xa5\xb7\x25\xf0\x47\x39\x01\x2a\xc8\x03\xe2\x6e\x49\xae\x3f\x30\x65\xe4\x5a\xf7\x1f\x45\x7a\x75\x15\x43\x3c\x5d\x29\x8b\x28\xbd\x05\xe1\xc5\xd7\x00\x6f\xac\xc6\x8b\x83\x2a\x89\x1f\x73\x28\xe4\x98\x57\x0a\xdf\x35\xcf\x33\x97\x70\xb5\xa7\x99\x80\xb7\x56\xb2\xc8\x3d\xc8\xf3\x12\xef\x48\x9a\x94\x64\x12\x50\x25\x36\x24\x8d\x2a\xf8\x5f\x97\xa2\x4c\x02\xd8\xfe\xcc\xbd\xc2\x22\x1a\xcd\x16\xd6\x58\x9b\x57\x9e\xc5\xda\x0a\xa4\x09\x8d\x43\x9a\x70\xd8\x82\xa1\x39\x9c\x0f\xae\xde\xe3\x24\xad\x83\xee\x35\x43\x57\x25\x37\x93\x74\x49\x7d\xb4\x6d\x5e\xd7\xf8\xb6\xc7\x79\xea\x92\x9f\x49\x96\xc4\xc6\xbf\xd9\x9a\x5e\x3a\xe7\xb4\x5b\x86\x28\xe8\xa6\x94\x23\x51\xba\xf1\x30\xa8\xcf\x6a\x5f\xc7\xe0\x2b\x96\x15\x77\x5a\xf6\x72\x55\xab\xa9\xd8\x77\x38\x4d\x7d\x6f\xc5\xbe\xe9\x80\xb2\x4c\xd0\xa6\xeb\xa8\xb5\xa6\x46\xd9\xa9\x50\xaa\xa5\x45\x86\x73\xcf\x2c\xf5\xa5\xd2\xb1\x57\xc6\x37\xe1\x72\x94\x9f\xb8\x53\xb8\x95\xbf\x2f\x8a\x5e\x5f\xdf\x35\x3f\x5b\xd2\x27\x09\xd9\xa4\x99\x88\x5a\xe9\x46\xd3\xa1\xd1\x5d\x47\x01\xa4\x9b\xfa\x27\x37\x4b\xa2\xe4\xaa\x2f\x71\x4d\x01\x18\x2e\x16\x31\x2c\x84\x59\xd6\xc3\xf2\xfc\x6b\x21\xff\x87\x0c\xa6\x6c\xee\x17\x48\xcf\xa6\x8c\xc5\x25\x25\x2e\xed\xcd\x28\x4d\xa8\x29\x79\x0c\xe9\x8b\x29\xbb\xff\x1c\x9f\x5f\x2c\xe2\x28\x2f\x60\x72\x9a\x4e\x6e\x60\x52\xe4\x25\xef\x71\xf3\xf1\x5a\xc4\xc7\x67\xdb\x97\x5b\x1f\x4f\xdf\x4f\x0e\x4e\x77\xb7\xb7\x4e\x27\x3b\x12\x64\xac\xc6\x58\xa9\xa3\x72\x6c\x11\x5e\xbf\x31\x94\x29\xfd\xf1\x82\xc8\x35\x4f\xca\x5c\xd7\x2b\x6e\x67\xeb\x74\x6b\x7b\x72\x70\xca\x53\x2a\x97\x3c\xca\x7e\x0c\x5d\xe6\x4c\x44\x48\x7d\xeb\x0e\x19\xc3\x8e\x52\x17\xe5\x9f\xa7\x29\x15\x16\xb5\x08\x92\x25\x70\x0b\x26\xff\x31\x26\xbe\xce\xdc\x4c\xce\x0b\x38\x3b\x29\x45\x43\xd9\x49\xbc\x7c\xef\x26\xa7\x97\x67\xfb\x8c\xbb\xfb\x44\xa2\xfc\xce\x6f\x61\xe1\x5f\xc3\xe0\xac\xec\x06\xd9\x8b\x92\x00\x7f\x3e\x1c\x2e\x3a\xde\x97\x24\xce\x5c\xcf\xbd\x19\xc0\x6a\x8f\x82\xe5\x26\x45\xb8\xda\x17\x92\xf8\x03\xe3\xc5\xae\xbe\xf9\xfa\x75\xd0\xee\x7f\x8e\x3d\x9b\xbb\x18\x1f\xbf\x00\xcd\xaf\xe5\x18\x26\x57\xc5\xf5\x3f\x95\x97\x2f\x07\x60\x3c\x1e\x77\xbf\x7e\xcd\xc8\x94\x69\xcb\x37\x1b\x5d\xce\x61\x41\x7a\xa3\xf1\xfd\xb9\x72\x31\x1c\x31\x0e\xe9\x22\xcd\x88\x53\x4b\xe3\x73\x4a\x04\x3d\x9f\xcd\xe2\xbb\x93\x02\xce\xf6\xdd\xd9\x0c\x6f\xbb\xb8\xdd\xe8\xcc\x69\x10\x5f\xb7\xe7\xdf\x18\xca\x45\x16\x4d\x07\x43\x39\x9f\xc5\x51\x31\x10\x25\x71\x28\x47\x89\x1f\xcf\x03\x98\x0f\xfa\x86\xeb\x50\x22\x13\xa3\x5d\xce\xa2\xee\x08\x71\xdf\xdd\xa0\x4a\x63\x48\xcf\xe6\x5e\x1c\xe5\xd7\x94\xe7\x78\xc9\xb0\x59\xa0\x61\x89\x6a\x8c\x5b\x24\xdf\x0a\x43\x72\xb7\xdb\xe0\xba\x1e\x54\x7b\x0b\x11\x74\xbd\x8f\x4a\x3e\x63\x79\x36\xcf\xaf\x9b\xdd\x25\x41\x5a\xf6\x04\x1f\x36\x73\xee\xb4\x59\x2a\x46\x2f\x14\x9a\xe6\xa0\xd3\x71\xa1\x4c\x27\x96\x98\xdc\x37\x27\x98\xc1\xb9\xbc\x97\x2e\x52\x61\x9e\x43\xc1\xcd\xf1\x11\xf1\xc3\xdc\x83\x59\x02\x0b\x98\x97\x87\x40\x9a\x50\x16\x1b\xd2\xd4\xba\xb5\x57\xa0\x9c\xc3\xf1\xa9\x0f\xba\x45\xc7\x50\xaa\x25\xcd\xab\x37\x6c\xf6\x70\x8f\xc8\x1c\xf0\x33\xe8\x16\xb0\x3e\x1c\xa5\x66\xd2\x45\x47\xaa\xb2\xbf\x08\x53\x3e\x7d\x9e\x8f\xce\x65\x59\xde\x29\x24\x59\x96\xf9\x8e\xac\x7d\x2a\xd7\xbe\xb8\x58\xb0\x5e\x44\x43\x8c\xbd\xfa\x58\x44\x71\x54\x44\xb0\xe2\x36\x67\x9f\x37\x26\x15\x1c\xca\x19\x2c\xb2\x08\xde\xc0\x8c\x54\x89\xb6\xf7\xdb\x2c\x9d\xa2\xde\xe4\xd6\x27\x09\x2e\x1a\x2f\xb9\xc5\xa7\xb9\x24\x84\xf8\xb3\xf1\x3f\x0b\xbc\x28\x8d\xc7\x63\xf8\x70\x26\xf6\xc6\x80\xdc\x44\x9b\x62\x36\x16\xc5\xcd\xe2\xe5\xcb\x41\x36\x16\x69\x61\x98\x87\x1d\x17\xf3\x4a\x94\x04\x91\x79\xe3\x25\x5d\x59\xde\x15\x72\x6a\xc9\xdb\x7b\x1f\x4f\xd0\xce\x71\x32\x39\x3e\xdb\xdd\x9e\x5c\x6e\xef\xee\x1c\x4b\x2f\x94\xe1\x66\x82\x32\x7e\x35\x16\x19\x58\x3f\x5d\x06\x70\x60\x14\x2a\x26\xa9\x95\x10\xad\x2e\xe1\xe8\x70\xa7\xca\x9d\x36\x55\xd4\x28\xe4\x28\x0d\xca\x02\xa2\xa1\x94\xc9\x68\x93\xff\x14\x15\xd7\x03\x5c\x18\xae\x6b\x26\xe7\x71\xe4\xc3\x81\x22\x6d\xa8\xc3\xa1\x94\x7d\xfd\xfa\x20\xd6\xf8\xeb\xf4\x8b\x70\xea\x26\xbf\xcd\xf9\x19\xf6\x2e\x8b\x02\x36\xbd\xa2\xe4\x4a\x88\xf0\xd1\xe3\x26\x0a\x60\x20\xb8\x09\xfa\xe7\x4e\xb8\x8a\x53\xcf\x8d\xcb\xd9\xba\x82\x06\xbe\x28\x87\x43\x02\xbf\x0c\x8a\xaf\x5f\xe1\x70\xb0\x2d\xff\xa4\x99\x83\x9f\xe5\xe3\xe1\x70\xf1\x18\xaa\x77\x5a\xf4\x4a\x92\x77\x8d\x70\xbc\x7f\x23\xc5\xbb\x74\x28\x4d\x3a\x69\xde\xcb\x16\x28\xe0\x4c\xc0\xe0\xa6\x7f\xfe\xfe\x07\x00\x81\xed\xd9\x9e\x17\xaa\x9a\x03\x42\x0d\x06\x40\x33\x3d\x60\x41\x07\xea\xae\xaf\x42\xd5\x0d\x3d\xdf\x70\x75\xed\xcf\xdf\xff\xb0\x4c\x47\xb3\x35\x47\x31\x75\xc3\xb0\x0c\x55\xb7\x6d\x30\xe2\x3b\x83\x85\xe0\xd1\xd3\x64\xde\x24\x77\x67\xe5\xfb\x49\xc4\x7a\x29\xfb\xf3\xf7\x3f\x74\x53\xf7\x55\x55\x0f\x1c\x27\x74\x7c\xc3\x32\x02\x18\x68\xb6\x6d\x05\x0e\x30\x0d\x4c\xdb\xea\xb9\xb6\xe2\x40\xf0\xe7\xef\x7f\xa8\xc0\x52\x1d\xd3\x00\x86\x6d\x68\xba\x65\x1b\x36\x50\x47\xc2\xf6\xc1\xae\x70\x44\xb3\x7b\x04\xe1\x3b\x5e\x83\x4b\x99\x51\x35\x83\x40\xf7\x15\x60\x98\x46\xa0\x2b\xb6\xe1\xaa\x8e\xad\xda\xaa\x17\x40\x57\xd1\xd5\xc0\xb4\x3c\x47\xb5\x15\xc7\xf0\xfe\xfc\xfd\x0f\x03\xa8\xaa\xe9\x18\x3a\xd0\x14\xcd\x06\x8a\x01\x6c\x6d\x24\xd4\x33\x6c\xb2\xbb\xb3\x46\x60\xb4\x19\xb6\xe3\x84\xb6\xad\x79\xbe\x1b\x02\x05\x04\x8a\x62\xe8\x9a\xe3\x9a\xb6\xa6\x38\x86\x66\xea\x9e\xe6\x00\x5b\x81\x96\xf3\xe7\xef\x7f\x68\xaa\xe5\x38\x0e\xd0\x55\x45\xd5\x2c\xc7\x74\xac\xf5\xe8\xe5\x2b\xc6\x89\xf5\xa9\xa2\xd6\x25\x8a\x5a\x93\x26\xea\x7b\x93\x44\x55\x8d\xc0\x25\xaa\x35\xc3\x25\x18\x3d\x01\x29\xc6\xa3\xb8\xa0\x56\x33\x41\xd5\xf9\xf7\x1b\xb8\x0d\x7e\x14\x64\x15\x4d\xad\x15\x00\xdf\x53\x3d\xdf\x54\x3c\xc3\x53\xd4\xc0\x35\x2d\x53\x0b\x1c\x57\x33\x81\xa1\x87\x8e\xe3\xab\x9a\xe5\x5b\x68\x62\x6b\x86\xae\xab\xb6\xaa\x3a\xa6\xa9\x9b\xa6\x6d\x03\x53\x7b\x1e\x2d\x78\xb4\x50\x5b\x7e\x06\xfd\x74\x3a\x85\x09\xda\x2b\x70\xd4\x70\x86\x14\x62\x21\x0d\x05\xa0\x28\xb2\xa9\xcb\x8a\xac\xfc\x00\x34\xb4\xa7\xcc\x13\xf7\xc6\x8d\x62\xa4\xb5\x49\x02\xa4\x44\xef\x41\x14\x86\x30\xc3\xe0\x29\xd5\xd7\x54\x17\x0c\xd3\xac\x47\x19\xcc\x9f\x82\x9c\xe5\x3b\x8d\xc3\x74\xe5\x38\x6c\x70\xc2\xfb\xa1\x1f\x78\x7e\xe8\x1b\x8e\xe1\xeb\x4a\x68\xaa\xbe\xa6\x2a\xa1\xae\x9b\x8e\x6d\x99\x4a\x08\x5c\x60\xe9\x81\x66\x63\x2e\x7f\xdb\x02\x9a\xa5\xa9\x86\x6a\x5a\x3a\x00\x9a\xa5\xa2\xa5\xbb\x43\x47\x59\x49\xe4\xbf\x86\x5c\x40\xb7\x14\xcd\x80\xc0\xb2\x2c\x13\x04\x96\x63\xdb\x81\xe2\xa8\xba\x0b\x0c\xdd\x04\xb6\xea\x2a\x9e\xe5\x98\xaa\x62\xa1\xdd\x47\x05\x3a\xb0\x4d\xdb\x54\x54\x55\x31\x80\x6e\xdb\x56\x8f\x5c\x61\x9a\x4d\x5d\x7c\xd7\x13\x25\x84\xe4\xbf\xc9\xe8\xbf\x86\x64\x4a\xe8\x40\x45\xf5\xa0\xae\xa9\xa1\xaf\x42\xc3\x36\x42\xd3\x52\x34\x55\x07\x40\x87\x56\xe0\x68\xba\xe1\x87\x9a\x16\xa0\x4a\x38\x40\x31\x75\xc7\xb1\x54\x45\xd3\x14\x4d\x71\x80\xdd\x23\xd9\x74\x9e\xe3\xf6\x9a\x27\xd1\xaf\x73\xd8\x22\xf7\xa7\x9f\xcc\xd2\xa0\xb1\x98\x98\x8a\xea\x6b\x5a\x68\x07\x68\xb7\x03\x46\xa0\x98\x9a\x6e\xb9\x9a\xad\x9a\x9e\x63\x79\x50\x35\x35\x07\x02\xcd\xc3\xbb\x94\xa2\xe8\xaa\x63\x02\x60\x2b\xba\xa2\x1b\x9a\x03\x9e\x17\x93\x35\x17\x13\x47\x95\x81\x69\x93\xd5\xc4\x7c\xf4\x6a\x32\x4b\x83\xbf\xf3\xd2\x91\x2f\x1d\x71\x8d\x49\xa0\xe9\xae\xa3\xeb\x7a\x60\x19\x8e\x13\x98\x36\x04\x68\xef\xd2\xc2\xc0\xd3\x6d\x5b\x55\x3c\xa0\xf9\xd0\xd3\x80\x6f\xa0\xe9\xa9\x19\x8e\x0d\x14\x55\xd3\x2c\xcd\xb0\x80\x69\xea\x7a\x35\x09\x8e\x0e\x77\xfa\x96\x8c\xf9\x52\x79\xd8\x04\x26\xe2\xa8\xc0\x0d\x7c\x2b\x44\xe2\xf8\xba\x02\x6c\x0f\x7a\x20\xd4\x6c\xdb\x08\x61\x00\x74\xe0\xe8\xa6\x62\x68\x10\xa0\x55\xcc\x32\x34\x45\x01\xaa\x66\x2b\x3a\x30\x75\xa0\xab\x96\xd5\x21\x4e\xd7\x4a\x51\xa3\xa0\xbf\x2e\x8a\x19\xbd\x08\x66\x40\x05\xe5\xac\x54\x20\x54\x2d\x55\x73\x35\x60\x87\x96\xeb\x3a\xa6\xe2\xab\x76\xe0\x3a\x9a\x66\xb8\x8a\x0b\x2c\xa8\xab\x96\xee\xc1\x10\xb5\xa3\xe6\x38\x8a\xa3\xab\xb6\xa9\x01\x60\x29\xb6\xb9\x16\x79\x68\x83\x17\x9d\x93\x85\x5d\x9e\x71\xf4\xe8\xba\x61\x86\xc0\x02\xa1\xad\xdb\xae\xea\xa9\x3a\xf0\xb4\x00\xe8\x9a\xa5\x03\x18\x00\x4f\x0f\x80\xea\xfa\xbe\xfd\xe7\xef\x7f\x38\x2a\xb0\x0d\x43\x73\x1c\xd5\x70\x6c\x5b\xb3\x6c\x65\xad\x15\xa2\xc1\xd3\xcd\x37\x4c\x16\x97\x72\x80\x50\xf1\x5c\xd3\xf6\xb4\x50\xd5\x9d\x00\x29\xe3\x9e\x06\x15\xc5\x56\xcc\x40\xf1\x8c\x50\x81\xba\x63\xd8\xa1\x85\x56\x4d\x4b\x73\x34\x55\xb1\x1c\xd5\xb1\x54\xcb\xd6\x6c\xc5\x7a\xe0\x4a\xb5\x3e\xfd\xe5\xba\xe4\x97\x6b\x52\x5f\x7e\x6f\xe2\xcb\xf7\xa7\xa7\x47\xb4\x6d\x3f\x1e\xef\xa1\xb5\xc5\xab\x2e\xf0\x60\x40\xcf\xc9\xf1\x9d\x10\x25\x78\x49\x5b\x4f\xa9\x66\x73\x0b\xad\x51\xae\xef\xc3\x3c\xc7\xe7\xf0\x24\xcc\x5c\x62\x43\x9b\x67\x50\x08\xe0\x2c\x4e\xef\x60\x20\x78\xf0\x3a\x4a\x02\x9c\x3d\x96\xe4\x29\x56\xb4\x47\xf1\x69\x3e\x90\x3f\xbc\x31\x2e\x1b\xeb\x99\xa5\x99\x8a\xa1\x5a\xd0\x33\x0c\x5f\xb1\x5d\x47\x31\xa0\xee\x40\xe0\x28\x81\xe2\xf9\x96\x0d\x02\xdf\x36\x5d\x0d\xa0\x29\x6b\xd9\x96\x6d\xe8\x86\x63\x6a\xc0\xb0\x14\xc5\xb1\x6d\x7b\x24\xbc\xaf\xe7\xde\x5e\xcd\x2e\x9b\xb2\x0c\xf2\x61\x53\x08\xc3\x0b\x55\x2f\x84\x2a\x30\x3c\xcf\x56\x3c\x55\x33\x15\xdb\x34\x3c\xdb\xd1\x1d\xa0\x68\x8a\xa9\x79\xba\xab\xaa\x2a\x9e\x23\x8a\xe2\x98\xb6\x09\x74\x5b\x31\x2c\xc3\x52\x6c\xd5\x19\xe1\x8b\xdb\xd1\x0f\x3f\x08\xb3\x0c\x86\xd1\x2d\x5a\xbc\xa6\x11\xe9\xcc\x06\xf7\x71\xcf\x1c\x75\xa0\xe1\xbb\x96\xaa\xf9\x41\x10\x42\xcb\x57\xa0\x67\xea\xbe\x63\x1b\xa1\xe7\x39\xd0\x36\x95\xc0\xb5\x35\x57\x75\x14\xcc\xa6\x8e\x8e\xaf\xa6\xa3\xda\xa6\x61\xab\x96\xaa\x58\x0f\x3c\xc8\xf6\xe9\x08\xed\x39\xda\x37\x9b\x9b\x73\xb4\x6f\x3c\x34\xe6\xa8\xf5\x17\xcc\xd1\x93\xff\x89\x93\xd4\x7a\xcc\x24\xed\x53\xf1\x7a\x38\x94\x97\x4f\x52\xbc\x79\x99\x9e\x66\x00\x1f\x9d\x95\x6d\xd3\xd3\x1c\x4b\x31\x9c\x50\x73\xb5\xd0\x76\x34\x3b\xb0\x40\xa0\xbb\x1a\x61\xe5\xb6\x81\xa3\x2b\x2a\xb0\x81\x6d\x1a\x96\xe3\x68\x64\x92\xe6\x4b\x67\xe9\xc1\x1a\xb3\x54\xd5\xbc\x20\x00\xaa\x63\x04\xa6\xe2\x04\x5a\x08\x2d\x13\x1d\x03\x0c\x2d\x34\x41\xa0\x1a\x00\xa8\xd0\x81\x96\x86\xcd\x6d\x1a\xb0\x2c\x5d\x01\xaa\x6e\xa8\x8e\x65\x68\xaa\xaa\x54\xb3\x94\x79\x5a\xf4\xcd\xd8\xad\xa6\x2c\x79\x9f\xbe\x11\x86\x9a\xae\xa9\xb6\x67\xe9\xba\x02\x3d\x00\x1c\xe0\x3b\x2e\x50\x5c\x2b\xf4\x81\xab\x6a\x10\x2a\xae\xe3\xaa\x3a\x3a\x2b\xd9\xb6\xa9\xeb\xa6\xe6\x58\xaa\x63\x6b\x8e\x65\x98\xe8\x44\xb2\xce\x1e\x7f\xd8\x27\x4d\x4b\xe3\x08\x7c\xc3\x85\x61\xe8\x3a\xd0\xf1\x15\x4d\x55\x1c\x23\xb4\x5c\x15\x3a\xae\xea\x1a\x0e\xb0\x81\x69\x28\x9a\xa3\x1b\x3a\x6a\x1f\x5d\xd5\x74\x0b\x60\x4e\x62\xdd\xb6\x0d\x73\xad\x45\xe4\x17\x69\x52\x33\xc7\xa5\x54\x92\xb2\x39\x6c\x2b\x0c\x75\x57\x75\x41\xa0\xd9\x9a\x1b\x78\x8a\x1e\x3a\x6e\xa0\xf9\x56\xe8\x79\x9a\xa3\xe8\xa6\xa9\x3a\x30\xc4\xd6\x48\xd5\x06\xa6\xe3\x38\xc0\x56\x00\x30\x75\x43\x77\xd6\x6a\x0e\xee\x50\xb4\x3e\x33\xb2\xbe\x2e\x31\xb2\xbe\x26\x2f\xb2\xfe\x04\xb4\xc8\xff\x5b\x1d\xa9\x8d\x3c\xba\x78\x79\xc9\xd2\xb6\x25\xa0\x13\x92\x2b\xe4\x70\xe6\x66\x6e\x01\x03\x21\x8e\xf2\x02\x9d\x90\x78\x0c\xdd\x1c\x8f\xec\x34\x2f\x30\x44\x69\x2e\x0b\x93\x5b\x77\x3a\x8b\xe1\x48\x48\x52\xb2\x18\xdd\xa5\xf3\x2c\x48\xa7\x6e\x94\xc8\x7e\x3a\x95\xf8\xe3\x95\xaa\xe3\xa5\xea\xbc\x5a\x85\xd4\xfa\x2a\x54\xca\xfb\xb5\x4a\xa2\xd5\x93\x68\xec\xc1\xc5\x92\x05\xae\x4a\x55\x56\xbc\x8b\x64\x18\x7d\x84\x96\xdf\xbf\xa8\xea\xbb\xd4\x11\xb5\x3a\x89\x16\xd7\x6e\x21\xdc\xa5\x73\x7a\xca\x44\x2b\xfa\xd9\x3e\x7f\xc0\x64\x76\x2a\x2e\xca\x96\xdc\x62\xc0\x40\x70\xbd\xf4\x06\xca\xc2\x5b\x37\x8a\xd1\x9a\x52\xa4\x42\x90\x0a\x79\x4a\x5c\x5a\x33\x98\xcf\xe3\x02\xef\x42\x99\x1b\x86\x91\x2f\x78\xb0\xf8\x02\x61\x22\xb8\xb3\x68\x23\x87\xd9\x0d\x3a\xd5\x26\x81\xf0\x79\xee\xc1\x18\xa2\x75\x12\x65\x12\xa6\xd9\x17\x37\xc3\xa2\xa5\xd5\x06\x23\x09\xd1\x74\xe6\x92\x88\x5f\x94\xde\x2f\x62\x21\x4e\xaf\x48\xab\x25\xf4\xdc\xfb\xfd\x7b\xb5\x63\xdb\xd2\x1f\x45\xac\xad\xaf\xe6\xd5\x9e\x8c\xb7\xe5\x9f\x6f\xf5\xc1\x64\xf8\x64\x74\xc8\x8c\xc5\x0e\xde\x60\x02\x2f\x15\x93\x77\x45\x49\x1c\x25\x90\x90\x25\xf7\x91\x1a\xf7\x66\xa1\x11\xa2\xe0\x3a\xc9\x72\x29\x9c\x5f\x12\xa1\x09\x3e\xc7\x2d\x5b\xfe\xc0\x34\xcb\xab\xe4\xcb\xe7\xde\x06\xe1\xd9\xc3\x5c\xc2\x2d\x7e\x35\x46\x52\xc6\xdc\x20\x49\xb9\xa7\xd8\x75\x91\x50\xcf\x61\x2a\xb7\x19\xe7\xc5\x98\x57\x7c\x74\xcd\xc7\x1d\xc4\xc4\x8d\x14\x58\x44\x72\xff\xe8\xc1\xc0\xbb\x6b\x26\x29\x9d\xe6\x34\x89\xf9\x5a\x96\x7c\x72\xdd\x09\xb1\x2f\x33\x06\x15\xd8\x48\x52\xdc\x15\xe7\x7c\x9b\x3c\x53\xc6\xd5\x29\xe3\xba\xc7\x28\xd7\x52\xdd\x65\x67\x30\xcc\x60\x7e\xcd\x56\x31\x54\x82\xeb\x45\x49\x00\xd1\x88\x51\xb0\x50\x5e\x91\x6c\xd0\x64\xf8\x83\x1c\x16\x0d\x11\x99\x34\x55\xaa\x5a\x19\xe5\xd5\x5d\xea\x06\x30\xe8\x1a\xda\x34\x21\x75\x9e\x41\x8b\x64\x3a\xcf\x7c\x48\x66\x0b\x99\x35\xf9\x2c\x4a\x12\x98\x09\xf4\xbf\x1b\xf9\xb4\x9e\xd1\xc3\x64\x58\xa7\x68\x50\x16\x5a\x15\x8f\x8a\x7d\x30\x61\x7a\xf2\x37\xe4\x45\x3f\xa1\xe0\x15\x8f\xe4\x34\x5e\x9b\xfb\xf3\xbc\x9b\x7b\x7a\x5d\xd9\x09\x53\x24\x43\x1f\x59\xc1\x3d\xbf\x92\xee\xbd\x15\x61\xdf\xa2\x12\xbf\xbd\xbd\x95\xb9\x7f\x7e\xb8\xbd\xed\x22\x81\x2f\x59\x17\xd7\x2d\x92\x06\x1b\xaf\x57\x5c\x2e\xcd\x19\xfd\x72\x9b\x29\x94\x77\x0b\xee\x2c\xb1\x91\xa0\x5e\x1e\x3d\x05\x41\xa2\x20\xa1\x14\x25\xd7\xf5\xb2\xa2\x2a\x3e\xfb\x65\xe5\xf5\xb1\xde\x7f\xac\x58\xef\x83\x2e\xd6\xfb\x66\x71\xdc\xdb\x25\xc5\x1d\xf5\x31\xe3\x97\x2f\xe8\x3c\x6d\xc6\x01\xf4\x6e\x8e\xdb\xd5\xaf\x4a\x2a\xde\x43\xb8\x53\xa0\x7a\x82\xfa\xee\xc6\xef\xf8\x48\x0b\xe0\x17\x2c\x7e\x09\x01\xf5\x35\xc3\xe6\x7e\xde\xc6\x1b\x46\xff\xb8\x47\x6b\x54\x09\x5b\x26\x5e\x48\x93\x1e\x1d\xe8\x0b\x71\x95\xa3\xbf\xd0\xd2\xb9\x44\x1b\xea\x1c\x0c\xd4\xf5\xb9\x7b\x61\x28\xdf\x35\x78\xf9\xeb\xe2\xa1\x84\x78\xab\xdf\xc0\xae\x6a\xb5\x16\x22\x9b\x3e\x0f\x8f\x53\x49\x44\x5c\x74\x96\x0c\xd2\x7c\xe5\x84\xc8\x1f\x34\x23\x88\x37\xd0\xea\x02\x57\x4d\x8b\x56\xb2\xde\x79\x71\xb8\x62\x5e\xe4\xeb\x4d\x8c\x56\xb2\xfe\x99\xb1\x4a\x7f\xa2\x23\xa6\xfc\x4d\xf6\xbd\x4e\x35\xa8\xc8\x22\x37\xb9\xea\x53\x84\x5a\x3d\x4b\x1e\x53\xdd\xf5\xf1\x64\xb5\xb7\x4b\xc8\x6a\x49\x98\x29\xa1\xab\xd5\x9a\xc1\x32\xba\xf4\xb9\x20\xe1\x25\x24\x7c\x53\xe7\x02\x18\xaf\x0d\x8e\x66\xd4\x94\x5a\x78\xeb\x16\x1f\x31\x43\x02\xdc\xfe\x51\xf0\xd1\x35\xf6\xb0\x44\xbd\xf8\xad\x90\x80\x2a\xe9\xcd\x17\x40\x91\x3e\x14\x12\x00\x65\xac\x8e\xdd\x0a\x2c\x03\xa4\x12\x4e\x19\x0f\xa6\x36\xb8\x48\x57\x84\x9f\x55\xf1\x51\xa0\x0c\xad\x47\x7a\x7f\x4f\xfc\x19\x97\xa0\x19\x2b\x05\xac\x06\x3d\xec\x8a\x58\xa9\x62\xbd\xe0\xa8\x8a\x9e\x76\x58\x52\x0c\xac\x8c\x07\xab\xe2\x6d\xb5\x61\x89\x6f\x2f\x89\x02\x76\x0a\x46\x8b\x1b\xb1\x47\x31\x37\x45\x01\xde\xce\xd2\x1c\xe6\x82\x1b\x04\x11\x89\xb2\xc2\x2e\xd1\xf8\x70\x4d\x60\x4b\xd1\x47\xf8\x50\x7e\x1d\x05\x50\x28\xae\xd3\x1c\xb2\x44\x4b\x43\xb0\x28\x09\xee\x3c\x93\x74\x4b\x02\x4a\x13\xd8\x8b\x8b\x07\xfe\x5e\xd8\xf4\x5a\x3b\x69\x5f\x00\x31\x07\x63\x7f\x05\x8b\xed\x24\x3a\xbd\x9b\x41\x1c\xcf\x82\xc4\x23\x81\x2c\x66\x5f\x68\xca\x92\x7c\x9b\xd2\x8a\x6e\x52\x64\xd0\x15\xc7\xe3\x42\xf6\x49\x29\x0f\x48\xfa\xf5\xab\xe8\xbb\x71\xe4\xa7\x5d\xdf\xe3\xb1\x71\xf8\xeb\xbc\x0b\x43\x9e\x3f\x3a\xf6\xb7\x4e\x33\xee\xa7\xfe\xd9\x5a\x88\xaf\x3f\x5d\xea\xd2\xb1\x7c\x34\xb9\x96\xb6\xe4\x4f\xb1\x74\x2c\x7f\xf8\xb0\xcd\x63\xbb\x12\x2c\xd8\x5f\x6f\xf6\x4a\x14\xd6\xe0\xf4\x86\xa2\xc3\xf2\xb8\xb0\x93\x7f\x49\xc7\x72\x5a\x7c\xe2\xb0\x5b\x31\x94\x2b\x43\x87\x25\xc8\xaf\xbf\xed\xbc\xa5\x28\xb3\x1c\x92\x6c\x0b\x3a\x96\x07\x79\x2d\x0d\x02\x5d\xd0\xa6\x33\x34\x09\x92\x2b\x8c\xab\xaa\x19\x18\x43\xb5\xa1\x16\xad\xfa\x8a\xe0\xa7\xe2\x08\x51\x2f\x83\xee\xe7\x4e\xdc\xd5\xf2\xed\x08\xff\x7b\xc3\x8d\xe3\x4d\x82\xa8\xaa\x9a\xc6\xca\xef\x05\x41\xe8\xc5\x85\xa5\xb8\xac\x8a\xf2\x5f\x0b\xb9\xb7\x96\x61\x9a\x14\x1b\xe8\x88\x34\x02\xda\xec\x76\x13\xff\xfc\x42\xf0\x5f\xbd\x34\x0e\x36\x69\x7d\x46\xc6\xec\x56\x50\x16\xe4\x3c\x2c\xe3\xf3\x6c\x27\x6c\xad\xeb\x7f\xbe\xca\xd2\x79\x12\x60\xe8\xda\x4d\x0e\xc6\xb6\xcc\x49\xc1\x85\x8c\xa2\xe4\x1a\x66\x51\xb1\xe9\xcf\xb3\x3c\xcd\x46\x38\xb6\x1d\x66\x0b\xb9\xb9\xf7\x75\x15\x93\xde\xc0\x2c\x8c\xd3\x2f\xb8\x23\x68\xbb\xa1\x66\xda\xac\xe0\x68\x75\x03\x37\x7e\x4d\x7b\x5a\x0e\x60\x4b\xbe\x68\x00\xd8\x06\xd9\x38\x1b\x18\x8e\xe3\x94\xa0\xb5\xa7\x59\x2b\x06\x81\x60\xd8\x8a\x69\xbe\x3b\x75\xd1\x1a\xcf\xae\x61\x46\x2f\x14\x06\x65\x7b\x78\x22\xec\xee\x6f\xbd\x7b\x24\x8c\x6d\xd2\xc2\xaf\x9d\xa6\x51\x20\x2e\x16\x17\x8b\x0a\xc0\x36\x5c\x8e\x21\xf2\xd7\x22\xd6\x12\x5d\x40\x5d\x1a\x10\xfe\x20\x44\x2a\xe6\xc3\x8d\x95\xcb\x5c\x4e\x52\xdc\xd6\x5b\x48\x73\xda\x87\x79\xee\x5e\xc1\x6a\x61\xe6\xb0\x00\x2e\xff\x86\x8d\xd2\xc6\xce\x7d\xb2\x46\x49\x4e\xa9\x62\xb8\xb2\x61\xae\x56\x82\x24\xd4\x90\xd7\xb4\x27\x6c\x27\x55\x5f\xaf\x9d\x8c\x55\xea\x0d\x8f\x78\xcc\x45\xa5\x7f\x1f\xc4\x63\xab\x25\xc5\x3a\x88\xc7\xa4\x9f\x3a\x75\x92\x56\x97\x5c\xf7\x82\xb0\xac\xc6\x60\x51\xcb\xa6\x7e\x18\x1e\x57\x07\x1c\x57\x63\x50\xd1\x55\x8d\xda\xdb\xb6\x49\x81\xc3\x2e\x74\xae\x83\xb6\xfc\x7d\x08\xbb\x15\x37\xe4\xf7\x45\xd8\x4d\x3a\xa0\x75\xb7\xb2\xe5\xc8\xd2\x9a\xc2\xa1\xa1\x1c\x76\x26\x26\x83\x55\x03\x43\x1c\x77\x3c\xe9\x8b\x3b\x0e\x32\x79\x5e\x8b\x3b\x66\x61\xc7\x34\xe6\xad\xf8\x9c\x9d\xc1\x2c\x8f\xd2\x84\x0b\xda\x2d\xc3\x80\xab\xb7\x27\x45\x86\x43\x31\x17\xc3\x45\x72\x75\x98\xec\x26\x51\x51\xc6\x1e\x57\x0f\x1e\x1b\x06\x0c\xc7\xff\x24\xb1\x79\xf3\x2c\x83\x49\x81\x36\xa4\x6d\x7c\x85\x57\x05\x1d\xb3\xa8\xca\xa3\xda\xd0\xe0\xa2\xf2\xc4\x9f\xd2\x79\x26\x88\xaf\x68\x34\x71\x07\x9e\xdb\x2b\xb1\x74\x0c\xc1\xc7\x07\x8f\xf3\x01\xf9\x12\x15\xd7\xed\x70\xab\x0c\xc6\xd0\xcd\xa1\x30\x38\xfd\x90\x0d\x59\xde\xcd\x46\x79\x25\xca\xc2\x27\x28\xb8\x19\x14\xe6\x58\xeb\xc6\x57\x87\xb0\x20\xc1\x93\x67\xfb\x02\x3b\x29\x93\xeb\x49\x0f\xc6\x29\x3a\xe7\xe0\x0b\xc1\x28\xef\x2d\x54\x16\x7e\x4a\xe7\xc4\xd5\x39\x4a\xf2\xc2\x8d\xe3\x15\xb9\xf5\x4a\xdf\x2b\x37\xfa\x0a\x4d\xdf\x28\x99\x43\xd2\x02\xa4\x3d\x30\x9f\x66\x4a\x1c\x7d\xd7\x6b\x50\x2a\xac\x7b\x27\xe0\xa5\x8f\xba\x08\x93\x2b\x0a\x34\xa4\x51\x49\x19\xc4\x84\xec\xe8\xd5\xe1\x89\x10\xa1\x19\x4d\xef\x85\x13\x1f\xe2\xc7\xee\x6c\x96\xa5\xb3\x2c\x42\xb5\xe3\x6b\x7a\xed\xe6\x82\x07\x61\xc2\x1a\x02\x06\xb2\x48\x23\xbe\xee\x49\xa0\xe6\x21\x59\x21\x70\xf4\xfb\x11\x19\x30\x23\x2e\xda\xb3\xe3\x75\x2d\x48\x12\x3d\x6f\xc5\xf4\x1e\x9e\x5c\x62\x7d\xe9\x84\xbc\xdf\x9d\xce\xd2\xac\x78\x1b\xc5\xf0\xad\x1b\xc5\xf3\xac\x1e\x04\xbc\x7d\x78\xf0\x76\xf7\xdd\xe5\xdb\xdd\xbd\xc9\xe5\xee\xfe\xd1\xe1\xf1\xe9\xe5\xe4\xf8\xf8\xf0\xb8\xf9\xed\xc9\x1c\xbb\x23\xad\xf8\x76\xb2\x23\x75\x68\x17\x23\x28\x75\xae\x84\xa3\x2a\x54\x97\x6f\x35\xec\xfc\x24\x78\x68\x04\x94\xed\x5d\x5e\x90\x5f\xbb\x37\x50\x70\xe3\x0c\xba\xc1\x9d\x10\x61\xf1\x60\x80\x14\xf9\x22\x65\xf1\xbe\xb2\xb0\x1b\x0a\x09\x1a\x21\xd3\x99\x5b\x44\x78\x60\xb3\xbc\x71\xdc\x21\xcc\x61\x52\x48\xf4\x6b\x21\x4d\x60\xed\x73\x7c\x60\xaf\x46\xc3\x31\x1d\x0d\x54\x7d\x17\xa5\x1e\x4d\x61\x44\xe6\x71\x79\x2b\x5f\x8a\xce\x9c\xfe\xfd\x34\xb9\x81\x58\xda\x22\xad\xd7\xf8\x29\x06\x61\x94\x57\xa3\x2d\x48\x13\x28\x8b\x8b\x45\xef\x18\x2a\xf7\xf5\xfb\xc0\x1f\x75\x2f\x60\x8b\xc5\x15\x2c\xf0\x87\x6f\xb3\x74\x7a\x52\xa4\x19\xa4\x41\xa7\x8d\x38\x5c\xda\xb3\x7c\x14\x2e\x52\xb0\xc7\xe3\x31\xfc\xfa\x95\x8f\xc8\x5d\x12\x03\x7d\x9a\x71\x41\xa5\xeb\xc5\x7a\x3e\x2a\xbe\x33\xcd\x37\x70\xcb\xad\x0c\xf0\x54\x49\x80\x27\x00\xab\x22\x3c\x3b\xe3\x37\xd3\x9c\x8d\x5a\x1a\xbb\xe9\xeb\x6a\x10\x40\x5b\x83\x26\x70\x4c\x43\x0f\x1d\x4d\x53\x9d\x40\x75\xf4\x20\xb0\xf5\x30\x30\x4c\xc3\x55\xa0\x6b\x1a\x7f\xfe\xfe\x87\x0d\x1c\x4d\xd3\x4c\xcb\xb6\x0d\x5d\xd7\x74\x4b\x53\xad\x11\xea\x71\xdc\xc8\x64\xad\xe3\x56\xca\x75\xdc\xa8\x8a\x4e\xd1\x3e\xdb\xb9\x70\x43\x56\x55\x21\xe1\xb4\xab\x3f\x7f\xff\x23\xf0\x2c\xc5\x00\xbe\xa7\x28\x76\x10\x5a\x5a\x10\x98\x81\xa2\x80\x40\x57\x1c\x33\x00\xaa\x6a\xab\x9e\x1d\x78\x3a\xc4\xc1\x42\xba\xa9\x69\x8e\x62\xd8\x86\x6a\xaa\xa6\x06\x4c\x43\x79\x44\x64\xe7\x3a\x42\xb9\xb6\x6f\xeb\xd0\x08\x5d\xdd\x00\x1a\xd0\x14\x43\x71\xa0\xe3\xa8\xc0\x77\x35\x2b\x50\xb4\x10\x18\x46\x18\x68\x2e\x6a\x6d\xdd\xd2\x35\x1d\x98\xba\xe3\x68\x36\x70\x74\xd5\x76\xd6\x74\xb7\xaf\xc5\x7f\xb2\x50\x75\x21\xcd\xc9\x44\x0b\xc9\xea\xd9\x14\xcc\x08\x6c\x07\x86\x81\xe1\xab\x81\xad\xd9\xc0\x75\xdc\x40\xb7\x1c\xc5\xb4\x61\xa8\xda\xa8\x77\x1d\xd7\xb3\x35\x57\xff\xf3\xf7\x3f\x80\xad\xda\x36\x00\x9a\x6a\xe9\x8e\x63\x5a\xba\xb2\x5e\x70\x4e\x23\xee\xb0\x6c\x2d\xe6\x09\x67\xb9\x8a\x17\x02\x2f\x08\x4c\x43\x73\x75\x53\x09\x75\x33\x0c\x35\xe0\x59\xbe\x07\x6d\x43\xd3\xc2\x20\xf0\x15\xdf\x72\x51\x52\xc7\xd2\x2c\x47\x71\x14\x4d\x33\x6d\x53\x55\x54\x6d\xad\xfe\xaa\xdc\xdb\xc0\xfa\x9e\x70\x60\x5d\x4f\x38\xb0\xa6\x27\x1c\x78\x02\x4f\xb8\xbf\x45\x74\x2a\x78\x94\xb3\x12\x58\xed\xac\xb4\xa6\x87\x52\x75\xd7\xb2\xec\x52\xee\x29\x3c\x9b\xb0\x3b\x13\x3a\xbb\xd0\x85\x97\x5e\x9c\xff\x5f\xe0\x9c\x50\x1a\xa4\x3a\xae\xbe\xca\x77\xf5\xdb\xd7\x6f\xf2\x4f\x58\xcb\x69\x86\x4d\xfd\xbc\xcb\x6d\x86\x26\xda\xf0\x8a\xe4\x71\x6e\x33\x65\xee\xdf\xd7\x71\x66\xcd\x8b\xc0\xef\xea\x49\xb5\xfc\x0a\xb1\xe6\x4b\x85\x36\xfa\x07\x78\x7f\x3d\xc8\x71\x2b\xf9\x4b\x3c\xb5\x1e\xed\xfa\xf2\xd0\xf1\xf2\x4d\x4e\x4e\x8f\xbf\x99\x0d\x33\xc9\xaa\xdf\xcc\x12\x3c\xdd\xcb\xce\xe7\x9a\x74\x95\x71\x37\xb9\xea\xb0\x02\x22\xbd\xd6\x29\x55\xf4\xc9\xce\xcd\xc0\x20\x17\xb5\x5b\x7b\xe9\xc0\x44\xab\xd4\x5d\xe2\x8b\x1d\x46\xb4\x4e\x02\x21\xa9\x34\x8d\xda\x4d\x0a\x21\x47\xaa\x50\x5f\xfb\xd8\xdc\x6b\x40\x85\x15\x97\xbb\x2a\x5d\x2f\x03\x22\x5f\x4a\x14\xce\x6e\x70\x19\x87\x90\xb3\xd6\xe5\x6a\x9a\x1c\x62\xa3\x53\x7e\x42\x4f\x35\xf4\x6e\x15\x4b\xa9\x57\x26\x29\x50\xf5\x86\x21\x1d\x64\x5d\xec\x43\xa0\x0d\x30\xda\x8f\x91\xcd\xae\x82\x97\x91\xfb\xd7\xd8\x87\x92\xea\x50\xb4\x8a\x7c\x88\xd0\xbd\x57\x13\x8e\xbf\x67\xee\xb3\x7e\x16\x25\x70\x11\x3d\x4c\xd5\x78\xc8\x14\x69\x2b\x6b\x12\x91\x81\x96\x1b\x80\x0a\xa4\xc3\x8c\x67\x22\x7b\xaa\x6b\x5b\x65\x3c\x1e\x24\xf3\x38\x1e\x8f\x8b\xf2\x30\xf6\x1a\x3d\x18\x55\xbf\x29\x6a\xda\xf0\xe5\xcb\x62\xcd\xdb\x80\xee\x0b\x62\xc6\xba\xd5\x38\x02\x77\x66\xdb\x6b\x4f\x7f\xcc\xdd\xf3\xec\xc7\xb3\xc1\xb6\x1c\xfb\x3f\x0f\x4c\xc9\xc1\x24\x9a\xcc\x26\x54\x5e\x2a\x97\x60\x95\xe6\xb0\x97\x05\x94\xb6\x07\xfb\x64\x39\x2d\x29\x6b\xbc\x61\x8b\xcc\x93\x82\x2e\x96\x84\xdd\x87\x39\xab\x6b\x7f\xfd\xda\x49\xd7\xba\x06\x26\x97\xba\xcb\x88\x3f\xb9\x0b\x5e\x7a\x39\xbc\xf4\xa6\x97\x63\xec\x9c\x45\x33\x54\x70\x22\x1f\xde\xf0\x37\xbb\x4c\x59\xeb\xba\xf2\xa3\x03\x60\x44\xdc\xd5\x37\xbc\x38\xf5\x3f\x2f\x64\x4e\xf5\xe8\xfa\xa8\x7e\x4d\xb9\xd9\x95\x47\xc9\x9b\xa9\x28\xff\xb5\x79\x83\x14\x42\xdf\x8d\x37\xdc\x38\xba\x4a\x46\x45\x3a\xdb\xf4\xd3\x38\xcd\x46\xff\x4b\x51\x2c\xd5\xd5\x36\x67\x74\x3b\x1b\x65\x30\x76\x51\xf3\x6d\x16\xe9\x6c\xa4\xdb\xb3\xdb\x9a\x2c\xdf\xf7\xae\x15\xef\xbb\x5d\x99\xdf\x44\x79\xe4\x45\x71\x54\xdc\x8d\x48\xa2\xe6\xc5\xe8\x34\x1b\x67\x03\x55\xb3\x81\x31\x94\x6e\xd0\xdf\x96\x02\x30\x35\x04\xfa\x1b\x58\xba\x66\x13\xfc\xb1\x9f\x1b\xc6\xf1\x86\x3d\x9c\xc0\xa0\xc1\x2c\x0a\x23\x18\x9c\x5e\xcf\xa7\xde\x2c\x8b\x92\x62\x9c\xc0\x2f\xc2\xb6\x7c\x33\x83\xbc\xc5\x9b\x00\xc5\x5d\xa7\x5f\xc6\x2f\xc0\x22\x9d\xc1\xa4\xfe\x4c\x59\x60\x7d\xa1\x3f\x57\x19\x4e\xa3\x62\xf0\x02\x30\xc8\x39\x9a\x13\xb3\xc2\xbe\x29\x92\xf7\x6e\x12\xc4\x70\x89\x60\x34\x0b\xa5\x91\xc5\x77\xb5\xfc\xe4\x79\xbc\x51\x94\x12\x6c\x4c\xd3\xc0\x8d\xc5\x8b\x0b\x09\x5f\xfc\xe7\xa3\xfb\xea\xdd\x48\xac\xfe\x16\xa5\x1b\x1f\x5b\xc1\xde\xa7\x79\x31\x12\xb9\x1f\xe2\x42\x4a\xe7\x05\xf9\xb6\x5d\xc3\x91\xd8\x7e\x26\x2e\xa8\x51\x09\x98\xc4\xa8\xa4\x33\x9b\x12\x3e\xad\xf9\x71\xb6\x8f\x84\xc2\xc7\x91\xea\x27\x52\xfc\x5c\x2f\x86\x62\x3d\xc5\x76\x79\xda\x00\x92\x88\x2b\x53\x06\x65\x54\x4f\xbc\x34\xb8\xab\x3d\x08\xd3\xb4\xa8\x3b\xa2\x96\xda\xe6\x67\x78\xe7\xa5\x6e\x16\xec\x61\x18\xd6\xca\x8b\x92\x1c\x22\xbc\x22\xd9\x98\x65\xd1\xd4\xcd\xee\x90\x20\xb4\xaf\xc9\x09\xa3\xa6\x89\x36\xb2\xad\x65\x90\xce\x0b\x1c\xda\xc2\x7d\x71\xb1\xa6\xaa\x87\xf6\x53\xd2\x65\x44\xdf\xa3\xbb\x74\xab\x3d\xba\x10\x4a\x0b\x32\xc0\xe0\x82\xbb\x42\xbb\xd6\xa8\x22\x48\x21\xf6\xcf\x50\x6f\xdd\x09\x27\x27\x7b\x02\xd7\x61\x4d\x6d\x41\xeb\x50\x15\x67\xa5\x26\xd2\xe2\x25\x30\xd9\x5b\x76\xcd\x5a\x26\xb5\xfb\xf4\x11\x87\xcf\x10\xa9\x85\xdb\xd8\x0e\xbc\xcd\xae\x38\x22\x72\xa5\x51\x0d\x50\xa4\xe5\x10\xc0\x8a\x34\x13\xb6\xdd\xc4\x87\x71\x77\xa2\x24\x2d\x48\x42\xb9\x5f\x19\x62\xaa\x70\x75\x4f\xad\x56\x5d\xb9\x06\x61\x2b\x26\xe2\x6e\xad\x02\x8b\xb2\x3e\x9a\x24\xb2\x9a\xb4\xda\x16\x69\x91\xac\x28\x63\xad\xa2\xc8\x32\x55\xe5\x6e\x48\x22\x69\x80\x15\xe4\x25\x95\x7a\x55\x9f\x72\x64\x9c\x0c\x07\x1d\x53\xef\x05\xa8\x6d\xfd\xf8\x6a\x74\x1b\xed\x4d\x58\x45\xa9\x35\x75\x98\x66\xc2\x0d\xb1\x9c\x63\xc8\x1f\x98\x09\x98\xd9\xbc\x5a\x39\x24\x51\xac\x69\x1b\xc4\xbf\xac\xca\xa2\xa9\x0e\x1c\xcb\xbf\x6e\x1d\xa0\x5d\x7b\x2f\x92\xb6\x33\xf9\x3d\xbf\x43\xf3\xd3\xba\x6b\x07\xfa\xcf\x3c\x2f\xa2\xf0\x8e\x9d\x0d\x46\x61\x0c\x6f\x37\xf2\xc2\xcd\x0a\x7e\x2b\x22\x17\x90\xc7\x7d\x3e\x39\xa7\xf2\xd1\xf1\xe1\xd9\xee\xce\xe4\xf8\x72\xfb\xf0\xe0\x60\xb2\x8d\x0d\x60\xbb\x07\x27\x93\xed\x8f\xc7\x13\x29\xca\xdf\xa4\x69\x0c\xdd\x64\xf4\x42\x91\x02\x18\xba\xf3\x98\x20\xee\x8e\x5e\x00\xe6\xb9\x43\x2f\x8a\x04\xf6\x91\x50\x65\x24\x2e\xa4\x56\x31\x3b\x5b\xa7\x5b\x97\xe4\x86\x95\xe5\x50\xdd\xb9\xf6\x79\xff\x74\xe4\xb3\x7b\x74\xf9\x76\x6b\x7f\x77\xef\xa7\xba\x5c\x87\xf2\x51\x24\xef\x1e\xdd\xe8\xcc\xec\xff\x36\x76\xaf\x46\x22\xbd\x1c\xd8\x3d\xba\x31\x45\x56\xec\xee\x91\x40\x72\xe8\x12\xf3\xe4\xe4\xfd\xe5\x87\xc9\x4f\x5d\xae\x4a\x27\x27\xef\x85\xa3\x8f\x6f\xf6\x76\xb7\x85\x0f\x93\x65\x1f\xe3\x4b\x33\x29\x48\x0f\xd2\x62\x6b\x5e\xa4\x27\xee\x0d\xec\xae\xcb\xe9\xfb\x8f\xfb\x6f\x8e\x8e\x77\x0f\x4e\xab\x32\xf6\x84\xea\x69\x57\x19\x1f\x4f\x26\xc7\x04\x72\xb5\x43\x44\xf4\x12\x93\x82\xf7\x7d\x78\xb4\x75\x72\xf2\xe9\xf0\x78\xa7\xf6\xf1\xd4\xcd\x3f\x73\x99\xb0\x34\x5d\x99\x9c\xd1\x3b\xf2\xad\x9d\x9d\xe3\xc9\xc9\x49\x97\x0c\x34\x89\x70\x32\x39\x3e\x9b\x1c\x8b\x8b\x8b\x05\xd6\x8b\x4e\x90\xfe\xa3\x1b\xaa\xa2\x0d\x25\x0f\xeb\x42\xba\xa2\x3b\xc3\xca\x4d\x6b\x77\x09\xdb\x8c\xd1\x22\x25\x31\x40\xd3\xcd\xc6\x50\x9b\x6b\xba\xa1\x75\xba\xd9\x18\xfd\x6e\x36\x06\xe7\xaf\x6d\x2c\x25\x16\x6f\xb2\xc3\xec\x3d\xc8\x6d\xc8\x68\x11\x57\x7d\x4b\x7d\x5a\x4e\xdf\xdd\xf5\x59\xe9\x15\xcd\xb9\x0d\x99\xca\x77\x76\x1b\x32\xdb\x1e\x70\x4f\xed\x36\x74\xd4\xcf\x65\xd7\xb2\xaf\x98\xbc\xbf\x5b\xe9\x26\x44\x35\x09\xe1\xf4\x3a\xca\x05\xff\x3a\x8d\x7c\x28\x04\x91\x5f\xb8\x05\xcc\xe9\x45\x2e\xc5\x95\xd8\x3d\x62\x78\x53\xf8\x82\x9b\xa0\x7d\x43\xe2\x1f\x4e\xc2\xca\x29\x54\x48\x06\xf3\xd2\x8b\x81\x39\x0e\x64\x72\x87\x8b\x38\x37\xb6\xee\xfa\x2b\x92\xb9\x41\x94\xf2\xa6\x18\x53\xe5\x2a\x52\x77\x8b\x47\x35\xa1\x77\xf2\xa8\x74\x24\xb2\x3b\x8d\xe2\xbb\x3a\x5c\x22\xaa\x29\xf5\x47\xe1\xc9\xd2\x3a\x49\x37\xf8\x0e\x75\x98\x2d\xc4\x90\x8e\xb2\x25\xac\xa0\xf5\xe0\x83\x86\x6e\x55\x55\x89\x0f\x1e\xa8\x53\x85\x9a\x5a\xa7\xfd\x0d\xd5\xd0\x91\x44\xb4\x05\xf4\x6b\x43\xca\xb2\x22\x38\x2e\x35\x53\xe7\xd5\xa5\x46\x74\x81\x86\x4b\x31\x97\xa8\x24\x55\xd7\xfd\xda\xc9\x3e\x66\xaf\xf6\x5b\x23\x03\x72\x5d\xc6\xda\x9d\x47\xd0\x36\x9a\x5d\xf2\xde\x3e\x22\xa3\x4e\xea\xdb\x2f\x4f\xc5\x48\xf9\xee\xa9\x18\x29\x3f\x77\x76\x05\x78\xf2\xbe\x38\xeb\xf3\x56\x54\xf5\xa7\x29\x6a\x4d\x77\xc5\xf5\xd9\x43\x3f\xae\xef\x9f\x68\x95\x7c\x6c\xdf\xe4\x9f\x78\x43\xbd\x13\xe5\xa4\x19\x04\xb2\xdc\x45\xf1\x1f\x4b\x39\xd8\x1e\xb2\xaa\x77\x9f\x23\x96\x36\x2b\x11\xed\xf4\x1a\x7b\xfb\xa0\x02\x72\xb4\x90\xbb\x89\xa0\x2b\x8e\xb9\xe1\x45\x85\x70\x72\xf2\x7e\x43\x15\x8e\x4f\xb6\x04\x4c\xcc\xe0\x0b\x9f\xe1\x9d\x10\x66\xe9\x54\x70\xf1\x9f\x33\x37\xca\x1a\xde\x4e\xc4\x8d\x27\x90\x85\xad\x38\x4e\xbf\xe4\x28\x0b\x86\xca\x81\x1a\xa1\xb3\x13\xa5\xca\x65\x30\x49\x03\xb4\xcb\xe4\x18\x51\x48\xf0\xdd\xd9\x8d\x5c\x6f\xb1\xfd\xee\xe9\x43\xd4\x03\xab\x3c\x2f\x03\x89\xa8\xb7\x44\xec\x0f\xf0\xae\xdb\xd4\x3e\x5c\x90\xf6\x79\x9b\x8d\xcf\x97\x68\x85\x9d\xea\x6a\x9f\x2a\x7a\x81\xcd\x61\x3f\xf6\xf9\x8a\xfe\x5b\xde\xad\x53\xd4\x48\x85\x94\x35\xfc\x45\x7b\x59\x6a\xdc\x59\xb4\x1d\x47\x30\x29\xc6\x05\x79\x90\xa5\xf3\x02\x66\xe3\x8c\xfc\xda\x3a\x3a\xba\x3c\x3e\xfc\x78\x3a\x39\x19\xc7\xf2\x8f\x35\x12\x93\x92\xbc\xc4\x4f\x93\x04\x5f\x8f\x94\x4f\x68\x8a\x13\xa4\x06\x8c\x8f\xe5\xdb\x99\x21\xef\x4c\xde\x6e\x7d\xdc\x3b\xa5\xd2\x10\x57\xb3\x4f\x51\x71\xfd\xc1\x2e\x0f\xa3\x15\x1b\x0a\x39\x92\x50\x0b\xf7\x58\x14\xc9\x63\x48\x02\xcb\xc6\x37\x99\x7c\x74\x25\x9f\x6e\x53\x9e\x12\x12\x32\xb5\x3b\xbb\x31\xcb\x0c\x70\xd5\x6f\xa2\x1c\x06\x15\x5b\x40\x8e\x0d\x83\xfb\xee\x8c\x24\x09\xa3\x18\x1e\x43\x37\x80\x19\x7e\xfe\xb6\xfc\xb9\xf0\xe7\x79\x91\x4e\xa3\xdf\xe0\xdb\x34\x9b\x0e\x86\xf7\x6f\x33\x39\x4c\xb3\x89\xeb\x5f\x57\x0e\xb6\x55\x80\xd3\x15\x2c\x06\x70\x48\xe2\x9c\x88\x39\x26\x97\x67\xd1\x0c\x0e\x06\x8a\x74\x08\x65\x6f\x38\x30\x14\x65\x28\x0d\x14\x69\x02\xe5\xdb\xe1\x00\xff\xb9\x05\xe5\xe3\xe1\xa0\xc5\x8b\x33\xe4\x3c\x6f\x0b\xd4\xd1\x78\x24\x51\xb2\x88\xce\x3a\xd1\xe2\x37\x8b\x17\xe3\x71\xf6\xf2\xe5\x60\x49\xca\x1c\x12\xf6\x67\x52\xfd\x20\xca\x69\xb7\x0d\xe0\x78\x3c\xee\x1b\x79\xaf\xc5\x2a\x61\x94\x5c\x09\xc1\x1c\x7b\xc9\x96\x70\x58\xf4\xf6\x6c\xd4\x9d\x8c\xbc\x15\xb0\x2b\x25\x99\xe4\xf8\xa4\x2d\x88\xaf\xe0\x2b\x51\xc0\x4d\x36\x12\xc4\x57\xd9\x2b\x71\x63\xe3\xff\xdc\x6a\x50\x7c\x55\x0c\x87\x8b\xe1\x82\xca\x58\x6f\xe4\xee\x83\x72\xa3\xe5\x3b\x7c\xa1\xd3\xa4\xf2\xea\xab\xb8\x64\x86\xcd\xb1\xf3\xf2\x25\x65\xc5\xb9\x8a\xd0\xb2\x71\x98\x9c\x55\xf9\x0e\x3a\x0f\xd7\xa8\x04\xf8\x82\x32\xf4\x44\xb3\xb7\x58\x53\x7c\xf9\x72\xb0\x2e\xff\x4c\x99\x13\x75\xa7\x96\xa8\xc7\xf4\x08\x2e\xda\x9d\xd4\x68\x60\x0f\xfa\xee\x9c\x85\x4f\x0a\x6d\xe1\x68\xd3\x07\xa4\x91\x51\x5f\x88\xaf\x20\x6a\xdb\xa5\x9e\xde\x6f\x8e\xb7\x0e\x76\x76\x0f\xde\xf1\xfe\xdd\xf7\xb5\xa9\x57\xba\x75\xb3\x27\x4b\x72\x24\x1f\xa2\xbe\x47\x93\x6b\x97\xfa\xaa\x56\x79\x52\xe3\x04\xff\x92\x59\xcf\x8e\xb3\x61\xc9\xaf\xc5\x37\xc2\x4e\xd7\x28\x43\x33\x99\x3a\xb3\x8a\x65\xc7\xb2\x7e\xdc\x69\x16\x82\x31\x25\x58\x39\x5d\x22\xe2\x04\xc3\xe6\x22\x21\xa7\x09\xaa\xf6\x18\x4b\x9f\xdd\x95\x54\x2a\x50\x2e\xdc\xec\x0a\x16\x32\x01\x9a\xda\x5c\x3e\x70\xa9\xf5\x83\xa7\x67\x1a\x2e\x7c\xb7\xf0\xaf\x39\x4b\xff\x4d\x1a\x05\x68\xff\xcc\xd3\x98\x9e\xe3\x06\x22\x16\x4a\xc8\x20\xf1\x27\x40\xfb\x10\xde\x37\xa3\x18\x12\x46\x96\x29\xbd\x5e\x5c\xac\x55\x3e\xb6\xbe\x70\x42\x88\x22\x63\xe9\xaa\x86\xff\x2e\x1d\xd0\xed\x19\xd0\xdc\xca\xce\xb7\xe4\xcf\xbb\x32\xdb\x09\x7b\xb6\x1b\x39\xca\xcf\xd0\xb3\xdd\xd9\x61\xf6\xf6\xd7\x20\x19\x0c\x2f\x1e\xfa\xe1\x8d\x59\x7e\xba\x3c\x98\xa1\xb9\x2b\xa0\x01\xea\xce\x66\x3b\x15\xb5\x98\x1c\xe5\x47\xf1\xfc\x2a\x4a\xde\x12\x4b\xd8\x96\x5f\x44\x37\x48\xc9\x18\xe4\xf2\xfe\x44\xaa\xd9\xc4\xc8\x00\x47\xca\x03\xca\x00\xed\x09\x2c\x13\x6f\x1e\xc5\x01\xde\x24\xea\xad\x4e\x04\xf8\x12\xfd\xe6\x66\xc1\x01\x52\xd1\xca\xd7\xf8\xd7\x31\x1b\x5d\x8d\xdb\xd9\xf1\x72\x56\x21\x9c\x68\xdf\x9d\x0d\xca\xef\x31\x7f\x17\x1d\xe0\x24\x8b\xea\xdd\xea\x21\x48\x62\xb2\xe1\xe0\x1e\x4e\xa3\x02\x7b\x47\x8f\x5e\x80\x87\x2d\xbd\x4b\xb3\x08\xdc\xc2\x25\xe6\xdf\x7c\x7c\x7e\x41\x35\x85\xfa\xd6\xba\xe0\x77\x21\x7a\x6f\x56\x2a\x13\x2f\x5f\x0e\xe0\xcb\x97\x6c\x1e\xc4\xe9\x55\xb9\x22\x3c\x5c\xdf\xa8\xaa\x33\x75\xb3\xcf\x5b\xf9\x11\x4c\x02\xec\x81\xdd\x2f\x2a\xaa\x5b\x36\x65\xec\x68\x9d\xf5\xa7\x91\x38\xc4\x53\xaf\xc1\xf8\x45\xa7\xcd\x70\xb8\xb8\x82\xc5\x91\x9b\xe5\x30\x38\x2b\xb5\x9a\x01\xac\xb8\x98\xa6\x19\xa5\x47\x83\x92\x38\x12\x19\x71\xd1\x3d\x75\x03\x1e\x15\xe7\xca\x85\x84\x07\xda\xa8\x38\x07\x17\x5f\xbf\x8a\x8a\xb8\x58\xe0\x68\x62\x9a\xdf\x76\xe9\xe6\xcf\x67\x7b\x6e\x4a\x96\xa4\x5c\x48\x19\x57\x80\x4c\x33\x95\x44\x59\x24\x37\xac\xc9\xf8\x85\x42\x4b\x14\x4d\xd9\x92\x15\x71\x3c\x1e\x97\xe9\x5e\x4f\x33\xb9\x48\x0f\xe6\x53\x0f\x89\x4c\x86\xfb\xf0\x9f\x63\xa0\x6b\xa6\x65\x69\xd6\x68\xc0\xbf\xcf\xce\x95\x8b\xe1\x3f\xc7\xd6\xd7\xaf\x95\xba\x34\x80\x52\x86\x14\xd6\x5a\x3e\xc3\xff\xb7\x38\xcf\x2e\x5e\xbe\x1c\x20\x7d\x0f\xad\xd7\x09\x56\x99\x51\x8f\x9e\x6d\x37\x68\xdd\xf8\x0e\xdd\x3b\xdc\x42\x7b\x53\x4d\x43\x7c\x9f\xe6\x3d\x6c\x56\x7d\xab\xd5\x50\xea\x52\xe7\x96\x6a\x4c\xed\xec\xc9\x4e\xba\xbc\xdc\x8e\x3b\x83\xe1\x6b\x5a\xb7\xab\x28\x19\x50\x16\x3e\x7c\x61\x7a\x57\xdd\xbe\x0d\x86\x8b\xf6\xa3\xfb\xba\xa6\x8e\x0a\xa5\x9d\xcf\xa5\xba\xbf\x4e\xf3\x62\xd4\x6c\x9d\xc5\xb0\xd4\x46\x0f\xb0\xfe\x89\x4e\x10\x2b\xe6\xcc\xba\x2a\xea\x80\xbf\x3e\x86\x52\x94\xe4\xd0\x9f\x67\x70\x54\x2c\x30\x3b\xe4\xeb\x01\x5f\x5d\x89\x9f\xc9\x22\x8b\x35\xd9\xa5\xdf\x08\x39\x2c\x84\x22\x9b\x43\xe1\x26\x72\x85\x52\x43\x62\xf7\x26\x30\xb9\x89\xb2\x34\xc1\xf1\x4d\x37\x6e\x16\xa1\x55\x47\x16\xde\xdc\x21\x3d\x14\x63\x3e\x56\x37\x51\xe4\x06\x9a\xd8\x3c\x05\x7c\x51\x24\x8b\xc3\xe1\x88\xc8\x52\xa5\x1b\xc3\xe6\xca\x40\x4d\x25\xf9\x79\xe7\xed\xc3\x45\xb5\x5b\xb2\x65\x28\xcf\xe3\xaa\xf9\xf1\x21\x46\x26\x8e\x05\xc3\x05\x56\x72\x2a\x15\x01\x6f\xe2\x6c\x8f\xfe\xfa\x15\x56\x7f\xfe\xeb\xe4\xf0\x40\xce\x71\x58\x57\x14\xde\x61\x4d\x1e\x6f\x5e\x2d\x33\xf1\x2f\x6f\xdd\x28\x26\xb1\x33\x74\xb2\xb0\x33\x70\x8e\x79\xc7\x22\xa4\xeb\xd5\x2e\xe0\x64\xe1\x1f\xf7\xc5\xe2\x97\x05\xd2\x09\x6a\x52\x1e\xc3\x7c\x96\x26\x39\x5e\x2e\x60\xc7\x90\x6c\x17\x2e\x6e\x53\xa5\x2b\x4d\x70\x18\x00\x3a\x8c\xf7\x5c\x04\x7e\x71\xb9\x4b\x57\x7c\x6c\x17\x17\x34\xf7\xf5\x66\x76\x35\xca\x51\x83\x93\x61\x32\xa1\xfc\xf5\x83\x7b\x3f\x83\x01\x4c\x8a\xc8\x8d\xf3\xd1\x3d\x83\x08\x1e\xad\xd1\x93\xe5\x21\xfb\x82\x1c\x18\x24\x76\x84\x59\xfb\xe3\xf2\x30\x4e\x33\xa8\xa6\xdb\xf2\x8f\x1b\x0b\x10\xfb\xbc\x9a\x2d\xab\xb3\xe8\x58\x4b\x58\x36\xdc\x0c\x6c\x8c\xf0\xc5\xf7\x9c\xfa\xf4\x64\xb5\x87\x7a\x96\x86\xc6\xd5\x02\xf3\xb8\xe1\xcf\x2e\x23\x5e\x37\xe6\xc1\x28\x99\xc7\xf1\xf0\xaf\x9f\x0d\x75\xa9\xf9\x3d\x93\x2d\xe8\xed\xed\x9a\xed\x88\x43\x89\x1e\xc6\x7b\x36\xe0\xa2\x57\x62\x66\xc3\xe0\x74\x17\xa5\xd3\xd8\x51\x94\xbb\x34\xd1\x11\xdd\xfc\xc8\x45\x35\xf2\xc7\x90\xfb\x21\x75\xe8\xb4\x79\xb9\x2b\xd0\xbc\x06\x45\x25\xf7\x1a\xaa\x8a\x94\xbd\x7c\xf9\x02\x69\x0b\x85\x9b\x15\x84\x14\xb1\x43\x40\x49\x34\xc5\x21\x3d\x2c\xd3\x33\xe0\x8b\x71\x65\x92\x79\x5d\xfa\x36\x9d\xb5\x6c\x3c\x83\xe1\x28\xfb\xfa\x95\x33\x32\xc9\x89\x7b\x13\x5d\xb9\x05\x1c\x9c\x37\x8c\x4d\xf2\xee\xc1\xf6\xe1\xfe\xd1\xd6\xe9\xee\x9b\xbd\xc9\x45\x79\xa6\x23\x4e\xa8\x3b\x95\xba\xd6\x0a\x5d\xee\x3f\x6e\xb7\x48\x93\x67\x7c\xbc\xe9\xda\xfa\xc3\x62\x28\x89\x77\x30\x17\x19\x35\x6f\xd5\x27\x74\xbf\xa3\x5b\x1b\xae\xf1\x69\x54\xc4\x70\xfc\x0b\xdb\xed\xfe\x71\xdf\xd1\xa0\x0b\x3e\x86\x79\x07\x87\x1f\xc3\xe0\x17\xa9\x95\xd7\x9b\x34\xb8\x1b\xff\xf2\x53\x69\x15\x65\x03\x89\x84\x53\xae\x5d\xc4\xff\x49\x84\x15\xff\xe3\x37\x5b\x6c\x89\x65\x9c\xbd\x82\x9b\x08\x51\x52\xc0\x2b\x82\x0d\xdd\x4d\x72\xc9\x08\x9f\xbe\x5c\x47\xfe\xb5\x80\x34\xcb\x5c\x70\x57\x17\xca\xe4\x67\x56\x5b\x1c\x91\xea\x0a\xb3\xd8\x2d\xd0\xda\x88\x6f\xde\xb2\x79\x82\x51\xf5\xb8\x22\xbf\xa4\xd9\x67\xd4\x89\xf8\xf2\x30\x80\x01\xde\x8f\x82\xd2\xe1\x7e\x75\xb9\xb3\x34\x8d\x73\x59\xd8\xa6\xcc\x05\x28\xfb\xe5\xf5\x8a\x72\x1c\x5f\x2a\x14\xd7\x59\x3a\xbf\xba\xc6\x8b\x0e\x13\xfe\xfd\xe9\xfe\x9e\x21\xd0\xed\xeb\x17\xa6\x74\x3c\x7c\x40\x4c\xb8\x1e\xf8\x5e\x23\x82\xeb\xe5\xd5\xad\x44\x3a\x33\x48\x21\xd9\xdc\x71\x71\x2c\x7f\x6e\xf4\x92\x33\x77\x20\x77\xbd\xe3\x06\xd1\xea\xf2\x1e\x37\xca\x56\x0d\xa2\xd5\xe5\x3e\x6e\x94\xad\x33\x88\x56\x97\xfd\xd8\x51\xb6\xe8\x5c\x16\xbb\x8e\x0c\xe4\xfb\x5a\xb2\x52\x43\x58\x63\xcf\x67\x60\x0f\xbc\x41\x35\x3f\xa6\x85\x07\x48\x2d\xfe\x9e\x5a\x6f\x19\x8f\xca\x20\xe9\xb9\x43\x3b\xb1\x2d\xaf\xbb\xfd\xf7\x48\xdf\x52\x03\x2a\x6a\xf5\x96\xf1\x64\x93\x01\xb5\x0d\x86\x52\x21\xcf\x67\x48\xd3\xc5\x3b\xc7\x56\x12\x60\x6b\x55\x54\xdc\x75\x19\x17\xd6\x60\x93\xdf\xac\x19\xfd\xbb\xc5\xe0\x8d\x10\x9b\x59\x29\x4a\x9d\x8c\x99\x2b\x57\x9e\xba\x33\xd4\x7d\xf4\x32\x71\x93\xee\xa6\x35\xfe\xf7\x4e\x2f\xb4\xe3\x4c\x42\x3a\x4f\x7f\x0d\x33\x7a\x2c\x42\xba\x7e\x9a\xe5\x83\xba\x49\xef\xa2\xde\xdc\x15\x63\x7c\x14\x0e\x9a\x32\x52\x95\x82\x97\x9a\x06\x6d\xe0\x88\xf3\x62\x2c\x8a\xf5\xa6\xe1\x53\x76\x30\x60\x6f\x66\x2f\x5f\x66\x38\x14\xff\xe5\xcb\x41\x31\x26\x7f\x0e\xa5\xe2\xe5\xcb\x75\x15\x86\x0e\xbc\x93\x52\x65\x58\x0c\x31\x40\xc0\x0e\x31\x80\x55\x80\x02\x2f\x98\x92\x87\xba\x6c\x97\x58\x2e\x07\x5d\xc7\x90\xe1\xd7\xaf\x6b\xa5\x65\xa7\x8e\x35\xd2\xb7\x34\x95\x46\x52\xd2\xee\x2f\xea\xe7\x8d\x21\x95\x1b\x6c\xd6\x86\x7f\xf3\x7e\x8b\xc5\xf9\xe3\x50\x17\x7c\xb6\x5b\xc4\xee\x3c\xf1\xaf\xa9\xc6\xf9\xc9\x9f\x0d\x86\xf7\x5f\xa2\x24\x48\xbf\x90\x53\xf0\x2f\x8c\xf6\xa5\xbe\xff\x60\x9b\xc4\x0f\xf3\xe8\x07\x77\x36\xfb\x81\xad\xab\x1b\x6c\x85\xfe\xe1\x17\x49\xbc\x24\xa1\xa2\xc3\x45\x9f\x12\x79\xbf\xf4\x0a\x51\x59\xa4\xc9\xdb\x28\xa6\x37\x37\xb8\xd6\xa5\x8d\x3e\x8c\xe2\x32\x16\x88\x5d\x96\x71\x26\xfe\x0c\xba\xc1\x56\x7e\x0a\x6f\x8b\x41\xfd\x93\x73\xe5\x62\x28\x95\x8f\xf0\xc1\x6b\x2c\x8a\x4b\x49\xd6\xe1\xc3\xcc\x52\x12\x0e\x0b\x58\xf1\x0d\x3f\x33\x39\x8e\x73\xf8\xf2\x65\xf1\x5a\x64\xeb\x1d\xb9\x5b\x2b\x75\x01\x71\x24\xd2\xe9\x09\x6b\x9b\x88\xf8\xaa\x4b\xb9\x7f\xdd\xf1\xec\x95\x28\x88\x23\x51\x1c\xbe\x12\x59\x88\x93\xe0\xfa\x7e\x3a\xa7\x5e\xbf\x78\xa3\x13\x17\x78\x2d\xf9\x48\x8d\xe4\x65\x6c\x05\xff\xf0\x6d\x96\x4e\x19\xf2\x45\xa7\x09\x7b\x87\xc4\xc5\x1c\x66\x01\xb9\x01\x7a\x70\x64\x04\xc7\x7f\x2e\x91\x3f\x4f\x32\x39\x3e\x62\x3f\x52\xf9\xad\xf2\x48\x62\x74\x56\xf3\x12\x38\xe3\x26\x82\x5f\x7e\x9c\xc3\xec\xae\xe1\xc0\xcf\xbc\x2e\xb6\xe5\x77\xe1\xe0\xe7\x4c\x32\xa8\xcf\x04\x06\xcd\xd8\xdc\x96\xa3\x77\xfb\x03\x38\xde\x96\xb7\x8f\xdf\x0f\x86\x43\x34\x06\x3b\xcc\x48\x63\x28\x87\x51\x96\x17\xc3\xc5\xa2\x0f\xa1\x03\x28\x94\x83\x5d\xd3\x1e\x4e\xc2\xde\x09\xda\xd1\xe2\x5b\xf2\x54\xdb\x53\x2c\xdb\x76\x2d\x5b\xf5\x21\x34\x03\x33\xd0\x8c\xc0\x32\x1c\xcf\x87\xba\x63\x29\xbe\xa5\x00\xcd\x72\x7d\xcc\x93\x69\xea\x00\x18\x40\xb1\x2c\xdb\xb1\x2c\x0d\xac\xcb\xa9\x58\xc3\xe6\xe8\x60\x75\x54\xc3\x50\x75\x5c\x3d\x84\x96\xe1\x1a\x76\x18\x5a\x00\x06\xba\x07\x0c\xdd\x56\xad\x30\x54\x4c\x10\xda\x7e\x00\x30\x6c\x88\xe1\x38\x40\xb3\x2d\xcd\xb6\x14\xcb\xd2\xd5\xf5\x28\xc7\x1b\x40\x1c\xcc\x96\xe0\x15\x18\x72\x43\x57\x5c\x2b\x0c\x02\x08\x2c\x4d\x73\x5d\xc7\x33\x3d\xcb\x87\x8a\xe2\x85\xaa\xe7\xa8\x96\x19\xd8\x61\x08\x9c\xd0\xc7\x44\x5c\x86\x62\x59\x0a\x30\x74\xc5\x52\x1d\xd5\x54\xd7\x23\x73\x6c\x40\x6e\xd0\xd1\x86\xb5\xe6\x74\x5e\x60\x8a\x19\xaa\x81\xf2\xa0\x1b\x15\x25\xbe\x61\x59\x8e\xe1\x06\x8a\xea\x78\xa6\xa6\xfa\x6a\xe0\xfb\x3a\x80\xba\xaa\x5b\x06\x00\x96\x6f\x79\x6e\x18\x42\x1d\x62\x26\x3d\x4b\xd3\x81\xaa\xe8\x26\x50\x2c\x47\x53\x4d\x4d\xe1\x40\x21\xec\x2e\x54\x8b\x9d\xdd\x33\x1e\x7e\xc1\xee\x82\x5f\xa8\xa5\x59\x17\xc0\x83\xaf\x26\x86\x3c\x09\xe8\x11\x47\x98\xb9\x57\xa5\xe7\xd0\x9f\xbf\xff\x01\x1d\x35\x80\xba\x17\x6a\x41\x10\xba\xa1\x19\x58\x9a\xae\x2a\x50\x87\x61\xa0\xeb\x9e\xa2\x05\x96\x6a\xea\x8e\x11\x62\xa6\x40\xdb\xb0\x1d\x60\x69\x8e\x09\x14\x47\xd7\x15\xa0\xac\xc9\xf8\x95\x76\x4b\xf6\x9b\x9b\x05\x02\x9a\xec\x42\x94\x84\x69\x13\xf3\xc4\x0f\x80\x11\x28\x9a\x69\x40\xc3\x0c\xdd\x10\x86\x81\x6a\x29\xc0\x34\x1d\x60\xea\xba\x61\x28\x21\x08\x3d\xc3\xf2\x4d\x4c\x45\x66\x28\x8a\xad\xaa\x86\xaa\x1b\x9a\x62\xaa\x96\x6a\x8d\x2a\x80\x30\x82\x77\x24\x52\xfb\x1e\xc6\xf5\x22\xd6\xff\xda\x5a\xcd\x19\x3d\x05\x0f\x86\x69\x06\x85\x69\x7a\x43\xb9\x8e\x12\x78\x5b\x60\x49\xe5\x16\x01\x35\x1d\xcd\x34\x08\xe3\xbf\x13\xc0\xa5\x46\x3f\xcd\xe4\x61\xe4\x4b\x01\x47\xf5\xac\xbb\xc0\xd1\x03\x80\x9a\xcc\x57\x5d\x5f\xd7\x8d\xd0\xd2\x2d\x2f\xb4\xb4\xc0\xf7\x03\x43\x0f\x15\xc3\x02\x9e\xaf\xfc\xf9\xfb\x1f\xaa\x61\x03\xd3\xb1\x15\x60\x01\xc5\xc6\x83\xdb\x79\xc6\x72\xa9\xe8\x9e\x8f\x98\x8b\x35\x63\xeb\xc2\x8b\x3b\x75\xab\x66\xca\x02\xed\x02\x6c\xe5\x99\xba\x09\x06\x33\xb8\x4b\xe7\x59\x39\xf4\xea\xd4\x8b\x4f\x41\xb0\xf8\xdd\xc0\x5f\xfc\x55\x63\xac\xc1\x70\x08\x95\x00\x6a\x9a\x6f\xb8\x9a\xe5\x23\xdd\xc2\xb4\x6d\xdb\x84\xae\xa5\x05\xaa\x1a\xda\xa1\xa3\x58\x36\xda\x6d\x1c\x34\x2a\x15\xcb\x51\x2d\xc7\xd4\x00\xd0\x81\x63\x98\x8e\xa1\x8e\x9a\xe1\x4e\xac\xb5\xdb\x74\x8b\xf9\x2a\xc1\x78\x8e\x67\x5b\x0f\x7d\x27\x34\xcd\x10\x5a\x61\xe0\x41\xdf\xb7\x3c\xdf\xd2\x7c\x17\xea\xae\x07\x8c\xc0\x73\xdc\xd0\xf4\x54\x1f\xad\x79\x9a\x63\x18\xb6\x6a\x1a\xb6\xa2\x59\x86\x6a\xe8\x40\x03\x23\x61\x42\x69\xba\x49\x9e\xf5\x51\xf0\xf6\xc7\x9d\x83\x26\xe5\x74\xb9\xed\xb7\x58\x5a\xb5\x50\xd1\x1d\xe0\xb9\x96\x19\xda\xaa\x6e\x06\x6a\xa8\x03\x5b\x01\x9e\x66\x85\x8a\x6d\x78\xbe\x6a\xdb\xbe\x67\xa0\x55\x41\x05\xaa\xed\x18\x8e\xe5\x28\x8e\xa1\x5a\x8e\x6d\x9a\x23\x81\x91\x2d\x74\xb4\x47\x8d\x61\x9a\x71\x24\xb4\x98\xf1\x03\xd7\x74\xa1\x16\x5a\xa6\x0a\x94\xd0\x54\x7c\x53\x31\x35\x43\xd3\x42\x15\x98\xc0\xd0\x7c\xb4\x0e\x00\x1d\xaf\x4a\xaa\x6a\x1a\x0e\xd0\x1c\xbc\x09\x6b\x96\xe3\x38\xd6\x48\x28\xf3\x6d\x97\x1f\x74\x2d\xf9\xec\x3a\x86\x69\xce\x68\x9f\x65\x8b\x12\x0c\x40\xa0\xb8\x81\xea\x6a\xa8\xfe\xa6\xa5\x58\xa1\xe2\x78\x8e\x6a\x20\x95\x20\x50\x2c\x1b\x02\x05\xea\x8a\x8a\x64\xb1\x0d\x4d\x57\x0d\xc7\x51\x6d\xdb\x52\x6d\x45\x55\xac\x91\x50\x8f\x58\x12\xce\x26\xc7\xbb\x6f\x77\xb7\xf1\x7a\xc4\x2d\x47\xda\xfa\x64\xb1\xda\xba\x6c\xb1\xda\x9a\x74\xb1\xda\xf7\xe6\x8b\x3d\xf9\x1c\xcd\x70\x3b\xf4\xdd\xd4\x7e\xb9\x86\x09\x45\xb1\x44\x1b\x1b\xb5\xe0\x61\x7c\xcc\xda\x82\xc4\x99\x2d\x9f\x62\x35\xd2\x1e\xc5\xf7\xaa\xad\x26\x7c\xad\xb1\x85\x57\xa6\x8a\x8a\x85\x58\x37\xcc\x40\x75\x14\x5b\x57\x5d\x1f\x06\xc0\xd1\xcd\x00\x38\x8e\xe5\xa8\x50\xf3\xa1\xae\x79\x8a\x02\x14\xc5\xb3\xd0\x3c\xb7\x80\x63\x03\xd3\x52\x54\x1d\xa0\x8d\x4e\xb1\x1f\xb8\xd1\x19\x2b\xfa\x92\xeb\x43\xa3\x8b\x17\xb3\x6b\x64\x71\x09\x97\x8e\x2c\x43\xfb\xce\x23\xeb\x80\xdb\xd6\xb8\x76\x8e\x92\xe6\x02\x1d\x25\xcc\x5a\x9c\x0a\x98\xa7\xe5\xe1\xbc\xc4\x4f\x31\xe2\xaa\x06\x79\x10\xc3\xf0\x8a\x6f\xd6\x07\x3f\x43\xfa\xec\xf7\x40\x3e\xc3\xe4\x3d\x24\xd0\x5d\xac\xbd\xd1\x24\x91\xd7\x38\x39\x2e\x26\x4a\xd4\xf8\x30\x72\xb7\x3e\x66\xa6\x2e\x46\x44\x16\xed\x40\x37\x5d\x4a\xf7\x29\x5e\x48\xee\xdf\x10\x84\x6d\x29\xaf\x19\xad\xc1\x16\xd9\xcc\x5b\x4c\x43\xbb\x47\x6c\x7f\xef\xa2\x4f\xeb\x25\x71\x83\x6b\x94\x3c\xef\xa3\x53\x9a\x57\x74\x4a\x45\x17\x9d\x52\x07\x87\x65\x1f\x51\xd2\xac\x22\x4a\x0a\x3a\xd9\xc2\x68\x30\x8c\x18\xba\x71\x0e\x97\xb1\x87\xd1\x5d\xbc\x9b\x39\xac\x7a\x49\x87\x31\x57\x42\x0d\xb7\x8b\x9a\x75\x1b\xc0\x08\xc2\x19\xb7\x61\x35\x86\xb1\x24\x4e\x8b\x0d\x55\x59\xc2\x0c\x29\x2d\x19\xe6\x3a\xcd\xad\x0b\x75\x02\xfd\xa2\x3a\x09\x85\x90\xc8\xf6\x88\xfb\x86\x88\x09\x3b\xb1\xfd\x59\xac\xc0\x28\x32\xc6\x65\xd7\x01\xea\x57\xad\x8f\x9d\x0d\xc4\xbd\xfe\x56\x3c\xbf\xf5\xe7\xb4\xcd\x25\x47\x22\xb1\x71\x8a\x45\x08\x71\xbe\x79\x7e\x7d\xf9\x19\xde\x71\x4d\xc8\x8f\x64\xbe\x34\xf2\x9c\x8b\xf5\xac\x4b\x91\xa4\x1b\x57\xf3\x02\xe9\x15\xdc\x57\x05\xbc\x2d\xdc\x0c\xba\x35\xd0\xbc\x76\xe3\x94\x42\x10\x0e\xd5\xea\x67\x93\x83\xad\x6b\x21\xa2\xa9\x2f\xf1\x0d\xd7\xe5\x34\xbf\x2a\xeb\xc2\x4a\x5f\x07\x3b\x0f\xa5\x67\x7e\x55\x25\x5e\x5f\x4d\x1c\xbe\x80\x1a\x1b\x5e\x3e\xf7\x30\x9e\x5f\x6d\xc9\xa6\xf3\x2c\x8c\x70\x8f\xd6\xf2\x21\xcf\x9a\x94\xb0\x0d\xc0\x47\xfa\x61\x25\x85\x97\xa5\x5f\x72\xf8\xa6\x0b\x05\x25\x9f\xba\x71\x4c\xff\x8e\x23\x3c\x94\xd0\x9f\xe4\x8b\x3a\x9a\x8a\x26\xd5\xa0\x68\x6a\xf0\x33\x52\x17\xc2\x0c\xf9\xa6\x07\x49\x86\xae\xba\x6b\xa2\xc8\x24\xf8\x19\x33\xfb\x62\x2c\x45\x4d\x11\x25\x31\x0d\xc3\x1c\x16\x1b\x68\x45\x57\xbb\xc0\x66\xa2\xa5\xf3\x17\x93\xc4\x6c\x68\x86\xd2\x80\x8d\xb9\xce\x60\xc8\xa8\xe4\x46\x3f\xfc\x10\xa4\x7e\x2e\xdf\x4c\xbf\xb8\x19\x94\xfd\x74\xfa\x03\x4c\x7e\x38\xdb\x47\xbf\x36\xb0\x91\x7d\xa3\xba\x4d\xde\x78\x97\x45\xc1\x0f\x18\xff\x12\x7b\x91\x63\x3c\xcc\xec\x0a\xa2\x06\xba\x2c\xa7\x66\x39\x9e\x66\xe9\x6c\x23\x9d\x17\x0f\x2b\x93\x6a\xdc\x3f\x58\xb2\xf2\x03\x49\x50\x9a\xc3\xbf\x44\xc5\xf5\x46\x65\x9d\xfc\xe1\xdd\xc7\xdd\x9d\x8d\x6d\x60\x6a\xba\xa3\x6c\x6f\xbc\x99\x28\xda\x86\xbe\xf3\x76\xb2\x61\x6f\x29\xda\x86\xa1\x01\x73\x47\x53\x75\xc3\x32\x8d\x65\xc2\xae\x80\x98\xc4\x7a\xcb\x93\x83\x62\xd6\x36\xf3\x95\x58\x98\xe9\x77\x43\xc2\x8c\xff\x2a\x24\xcc\x4a\x47\xe3\x56\x00\x1c\xec\x4d\x26\xc9\x31\xfd\x93\xdb\x53\x69\x20\x08\x06\xc2\xa4\xd1\x8e\xf8\x3d\xdb\x94\xa3\xd9\x8d\xde\xbd\xe1\xb2\x2f\x9f\xb2\x28\x73\x75\x51\x6b\x03\x7e\xb2\x3b\x11\xb4\x7c\xdc\x94\xb0\x9f\x7d\x0b\x2a\xa8\x2f\xa5\x4b\x10\x3b\x57\x22\x5c\xb4\x30\x3c\x77\x33\xc9\x92\x94\x36\x86\xe7\x5e\x0b\xab\x93\x60\x78\xde\x65\x12\xd0\xa5\x3e\x84\x03\x1e\x04\xc3\x9d\xcd\x36\xc8\x50\xab\x69\xe1\x35\x1a\x46\x02\x9d\xc1\x81\x0c\xe0\x07\xe6\xb0\x0e\xf3\x89\x03\xff\x3b\x38\x0d\x4b\x8c\x01\x82\xd5\x49\x50\x3e\xed\x26\xa0\xc0\x72\x94\xcf\x12\x1a\x01\xa8\xd2\xaf\xeb\x63\x23\x34\x61\x3e\x71\xc6\x5a\xc5\xa1\x08\x86\x1c\x5a\x67\x0f\xd8\x26\x85\xed\xdc\xc9\x24\x55\xea\x8c\x9a\xa7\x10\x99\x38\x9d\x29\xdd\xae\x4a\xd7\x89\xaa\x60\x35\xdb\x14\xd8\xcb\x1b\x15\x38\x65\xab\x82\x12\x93\x55\x55\x78\xd4\x4c\x16\x05\x5f\x61\x32\x80\x2a\x34\x5e\x5d\x5a\x5f\x55\x93\xbe\x3c\xa6\x1e\xaa\xde\xac\x87\x4a\x19\x2f\x99\x0a\xdf\x51\x15\xd5\xec\xaa\x8a\x45\x69\xa0\x6a\x55\xb1\xab\xaa\x58\xe5\x43\x67\x69\x55\x34\x45\x7a\xf7\x98\xaa\x68\xa0\x59\x15\x8d\xb5\x19\xa3\xea\x6b\x57\x45\xd3\x1a\x55\x41\x83\x5d\xd3\x29\x5b\x15\x4e\x61\x74\x0f\x77\xcd\xec\x1c\xee\x9a\x25\x7d\x7e\xfc\x70\xc7\x05\xda\x0d\xa9\x9b\x98\x1d\x9a\x53\x35\xaa\xc3\xbe\xd2\x95\x26\x66\x87\x0e\xaa\x73\x4f\xed\xa0\xb3\x0c\x12\xa7\xab\x61\x75\x86\xce\xa3\x96\xe8\x08\x7a\x09\x21\x57\xa2\x3b\xe8\x1c\xf0\x99\xba\x16\x04\x2d\x17\x23\xb4\x60\xa3\x48\x37\x28\xbd\xd8\x52\x81\xcc\xe6\x0a\xa7\xb7\xa6\xa3\x6e\xf7\x40\x19\x97\x09\x9c\x26\x92\xb1\xa1\x50\x36\x32\xbc\x88\x82\xee\x6e\x37\xd4\x6e\x00\x18\x4d\x3a\x5b\x86\x65\xbc\xba\xdb\x0d\xbd\x02\x33\x56\xcb\x69\x6f\x18\x1c\x4f\x96\x59\x96\x66\x4a\x1f\x3b\x41\x89\xeb\xc4\x64\x38\x03\x6b\x29\x28\xb1\x61\x2f\x03\x25\x36\x9c\x1a\x28\x71\xcd\x1c\xb7\x02\x95\xb8\x06\x72\x53\x32\xc7\x95\xb3\xca\x2c\xb7\xc0\x72\x04\x9b\x25\xea\x8c\xa4\x95\x88\x1b\x15\xf0\x8d\xa9\x77\x77\x88\x69\x74\x76\x88\x69\x4a\xff\x58\xbf\x43\x6a\xd2\xb2\xb1\xa4\x95\x63\xdb\xb4\xd9\x23\xb5\x2c\xd6\x91\xc4\xf2\xa8\x27\x69\xe5\x06\x6d\xd5\xe9\xc3\x6a\x8b\x3b\x92\xcb\x02\xd2\x3e\x5d\xdd\x28\x71\x58\x39\x88\x2d\xb5\x9c\xd7\x9a\x29\x69\xd6\xb0\x17\xd1\x1a\xd6\x20\xad\xeb\xce\x51\x2d\xae\x60\x8b\x9b\x98\x9a\xbd\x7a\x62\x72\x10\x57\xfb\x5b\xf9\xc0\xd2\x86\x32\x4e\xcb\x61\x14\x5a\x86\x24\x0a\x6f\xf0\x49\x0f\xe3\x2c\x2c\x67\xfb\x5d\x0a\xbf\x65\x4a\xfd\xb0\xa6\x92\x56\xa1\x7a\x77\x9c\x12\xbb\xdb\xa3\x3f\x36\xaa\xdd\x32\x56\x0d\x91\x53\x7f\x04\x24\x67\x8f\xd3\x5a\x05\xd2\x69\xd9\x04\xa5\x53\x07\x6c\x99\xb1\x1c\x49\x2f\x87\x91\xcd\xa6\x86\xae\xf5\x2d\x0c\x36\x9b\x2a\x7a\xb9\x38\xd9\x2a\xc3\xd7\x44\x6b\xa6\xad\x49\x7a\x0b\xb4\xd3\xd6\x79\xd4\x4e\xdb\xe0\x00\x30\xd7\x60\x47\x2c\xe4\xb6\x33\x60\xd9\xfb\xb6\x29\x89\xa5\x6b\x74\xa7\xdb\x78\x2f\x18\x95\x6d\xf1\xc0\xa0\x76\x0b\xc4\xcd\x76\x78\xa9\x1d\xe5\xa1\x52\xf7\xc2\x90\x94\xc2\x3b\x9d\x2c\xa4\xb8\x34\x95\x97\xcd\xd1\x24\x51\xf8\x74\xed\x16\xff\x0f\x41\x3d\x0b\xa2\x30\x84\x19\x4c\x7c\x28\x78\xb0\xf8\x02\x61\xd2\xe3\xc8\x3e\x9d\xc7\x45\xe4\xc7\xe9\x3c\xc0\x40\x68\x4b\xbd\xdd\x5f\x0b\x7b\xd0\xcd\x12\x61\x9a\x66\xb0\x42\x1e\x73\x90\x92\x2f\x4a\xba\x55\xca\x82\xa6\x1b\x26\x02\x2b\x57\x3d\xa7\xa6\x7d\xe8\x76\x73\xd9\x77\x2c\x49\xf4\xaa\x85\xdc\xb1\x25\x51\xd8\x49\xfd\xf9\x14\x26\x05\xb9\x9f\xc3\x00\x9f\xed\xae\x5b\x29\xb3\xe0\xbb\x89\xe0\x41\x21\x4c\xe7\x49\xc0\x09\xed\x10\xa1\x4b\x2e\x47\xa0\x28\x2d\xa9\x81\x02\x96\x8b\x0d\x14\xb5\x94\xbb\x73\xd9\x58\x7c\x03\xae\xfc\x8b\xa2\x0a\xd6\xea\x4b\xb3\x04\xb6\xbd\x23\x69\x89\x48\xd0\x91\xa6\x76\x36\xc3\x25\x87\xd1\x15\x5a\x2c\xbb\xf2\xc6\x0d\xd1\x8d\xf0\x5e\xbf\x28\x18\xf6\x03\xbd\x73\x37\x04\x52\xc1\x60\x17\xd2\x6c\x92\xcc\xa7\xf2\xf1\xe4\xc7\x8f\xbb\xc7\x93\x9d\xb6\x9c\xcb\xbe\x3a\xdb\xda\xdb\xdd\xb9\xdc\x3d\xba\x3c\x3c\xbe\x7c\xfb\xe3\xce\x01\xfb\x5a\xef\x97\x96\xdd\x21\x30\x39\x89\xca\xf8\x78\x41\x97\x14\xc5\x0e\x28\x65\x51\xd6\x37\xb6\x89\xce\x7f\x56\x9a\xe4\x8b\x5a\x70\xe5\x70\xc0\x99\xe8\x71\x10\x46\xe5\x31\xfe\xf5\x6b\xdf\x00\x23\x15\x28\xdf\xbd\x66\xfe\x61\x93\x1d\x71\x54\xfa\x8a\xb1\x7a\xe8\xc6\x1a\xa3\xa2\xd2\xc4\xd8\x67\x46\x47\x4b\x73\xd8\xff\x9c\x73\xfd\x90\xa7\x15\x80\x9f\xff\x33\x20\x6a\xd7\x46\x55\xb1\xde\x99\xc2\x90\xca\xda\x02\x51\xf3\x0a\x06\x2f\xe3\xfb\x0e\xe7\x8f\xa6\x3c\x64\xbd\x50\xf7\x44\x2f\xed\xee\x43\x39\x4a\x70\x07\xd5\x3e\xef\x21\xa1\x5f\xfe\x25\x6e\x80\xf9\xee\xe7\x7a\x5f\x55\xcd\x8f\xb9\x24\xaa\x77\xc3\x16\x77\x3f\x6f\xad\xae\x41\x1a\x0f\xea\xb6\xeb\x82\x77\x82\xef\x9c\x5b\x35\x5c\xe6\xee\xdd\x89\x43\x6a\xa6\xa6\xac\xdb\xb8\x8e\xac\x4c\x86\x40\x2b\xea\x8c\xf5\xbc\xe5\xac\x48\xfd\x26\x0d\xee\x58\x62\x5b\x1b\xf2\x10\xd0\x5b\xf9\x64\x20\xae\x0e\x90\x43\x3b\xe0\x2c\x83\x21\xcc\x32\x18\x08\x5f\xdc\x3b\x1a\xa8\x9b\xcf\xa7\xb0\xe7\xeb\x28\xa9\x5c\xd3\xab\x86\x2a\x63\x4e\x79\xbf\x8f\x5c\x16\xb6\xe2\x02\x2d\x1c\x45\x74\x03\xe3\x3b\x8c\x14\x37\x75\xef\xa8\xfb\x88\xe0\x0a\x49\x9a\x6c\xac\x0c\x21\xc3\xd0\xa2\x68\x83\x4e\x97\x17\x2d\x0b\xf5\xe6\x25\x83\x7a\x87\x94\x75\xfa\xe1\x1d\xfe\xa8\x13\x84\x0e\x37\xfb\xb6\x9b\x43\xa4\x00\x95\x80\xa1\x6b\xd0\x5e\x78\x99\x9c\x4a\xc7\xf2\x3b\xc3\x58\xc1\x7d\xf1\x16\xfd\x79\x7b\x7c\x54\x71\x5f\x30\xb2\x8b\x5f\x3f\x3b\xd2\xb1\x7c\x35\xfd\xb7\x74\x2c\x7f\xf8\xf5\x50\x3a\x96\x7f\xba\xd4\xa5\x63\xf9\x68\x72\x2d\x6d\xc9\x9f\x62\xf4\xf8\xc3\x36\xca\xfe\xc8\x93\x8e\x65\x7f\xfb\x8c\x92\x6d\xd4\x08\x35\x1a\x3c\x1a\x67\xbf\x6e\x49\x3f\x67\x12\x0f\xcd\xcd\x08\x35\x76\xb6\x7e\x95\x8e\xe5\x09\xfc\x51\xda\x92\x2f\xa5\x63\xd9\xcd\xd1\xa7\x3f\x5a\x8c\x6b\xa3\x04\xef\xee\x30\x58\x76\x40\x78\x0b\x02\xf1\x94\xe9\x42\xf7\xa6\x04\x15\x1b\x5e\x5a\x14\xe9\x74\x04\xd4\xd9\x2d\xa6\xaa\xd8\xc8\xa3\xdf\xe0\x08\xe8\xb3\xdb\x85\xcc\x5f\xad\x75\xe5\x41\x68\xfb\x0d\x45\x99\xdd\x96\xd4\x1b\x2a\x66\xfd\xe7\xee\x83\xba\xe5\x92\x1b\xb7\x43\x5d\xd9\x4f\xdd\xec\x2a\x4a\x88\xd9\x79\x64\xcf\x6e\x17\x94\x3d\xd5\x2b\xf0\x3f\xec\x7a\x48\xae\x5d\x0e\x75\x67\x74\x4b\x12\x8c\x34\x03\xc9\xca\xfd\xbd\x28\x73\x23\x97\x68\xcb\x9a\x2a\x86\x61\x31\x52\x9a\x3c\x1c\xef\x31\x0f\x87\xaa\xa0\x33\xe5\x6f\xf8\x6f\x07\x6a\x43\xe9\x13\xfa\x53\x33\x0c\xa0\x0e\xa5\x9f\xf0\xdf\x8e\x62\x19\x43\xe9\x5f\x98\xaa\x03\x68\xe8\x2c\xfc\x01\xfd\xed\xe8\x9a\xa1\x0d\xa5\xff\xe0\x4f\x4d\xc5\xb0\x86\xd2\x1b\xf2\xad\xe6\xa8\x1c\x6c\xf5\xbf\x57\x02\x3f\x37\xb1\x34\x99\xbd\x4a\xa3\xf6\xce\xee\x73\x6d\xd1\x8f\xb3\x9c\x26\x1c\x75\x2f\x23\x6f\x2a\xda\x67\x3a\x8d\x23\x6d\x58\x86\xbf\xcf\x0a\x28\xa3\xa4\xc8\x69\x57\x2d\x83\x70\x9a\x05\x93\x4b\xd0\x6d\x72\x12\x7e\xf9\xb2\xa8\x1d\x8a\xb1\xe9\xaa\x61\xff\xc4\xf8\xa0\x1c\x2a\x25\x5c\x79\x97\xd0\x6c\xb4\xd2\x9c\xb6\x06\x67\x41\xa3\xc1\xd4\xa1\x0c\x6f\x91\xd8\xec\x9c\xe6\x92\xe4\xa5\xb4\x6a\x83\x52\xbf\x29\x6d\xb1\xbe\xb4\x58\x71\x27\xc7\x78\xac\xe5\x66\x53\xaa\xf5\xf2\x34\xf4\xe8\x2d\x56\x01\x1a\xb7\x16\xc0\x1a\x36\x10\xbf\x2b\xd3\x2b\xb3\x4d\x57\x56\x4e\xee\x18\xab\x3e\x06\xad\x9b\x6c\x28\x5c\x33\x98\xd4\x82\xd9\x03\x09\xbe\x8e\x21\xb3\x55\x48\x06\x6f\x22\xf8\xa5\xde\xf0\x04\x18\x89\x9e\xd7\x1b\x26\xce\x9f\x0e\xfc\x81\x23\xc1\x84\x58\x8d\xeb\x06\x3d\xab\xeb\x24\x44\xfa\x6a\x39\x72\x78\xa5\x85\x90\xd8\x07\x51\x82\x1c\x80\x59\x5b\x57\x69\x1d\x7b\xd0\x07\xcb\x29\xac\xf0\x77\x95\x86\x05\x19\x7a\x18\xd9\x49\xc9\x7c\x69\xa9\xc1\x3d\xf0\xae\xe5\xce\x3a\x2c\x51\xcd\x5b\x45\xd1\xc8\xa9\xd3\xf4\x0a\x13\x1d\x8a\xc4\xbf\x1d\x29\x10\x1b\xcc\x9d\x8f\x8c\xf9\x8d\x30\x4b\xa7\x6c\x2c\x8a\xc3\x05\x05\x70\xcd\x92\x71\xdb\x86\x73\x7f\x1d\x05\x70\x04\x17\x0b\x29\x49\xc6\xe7\xf7\x33\xb7\xb8\x1e\x89\xa2\xe4\xa7\xd3\x59\x9a\xc0\xa4\x18\x75\x23\xb4\xbe\xcf\xe4\x9f\xdb\x10\xad\x34\x3a\xcb\x67\x50\xad\x85\xe4\x4b\xa9\x14\x0d\x9b\xc0\xac\x14\xaa\x88\x48\xcb\xe0\x5b\x29\x3e\x2b\xc1\x3d\x64\x0f\x93\x7e\xd0\x56\x16\x45\x78\x32\x3e\x94\xdd\x2d\x1a\x9a\x5c\xb2\xc6\x53\x40\xb4\x12\x50\xad\xa3\x6f\xca\x77\x2c\x18\xae\x0b\x57\xef\x0a\x16\x47\xf4\x35\xea\x31\x16\x03\x5d\xd1\x95\xf5\x7c\x74\x5a\x26\xa0\x88\x1e\xed\x24\x0d\x6c\x93\x61\x17\xd6\x67\x03\x4b\x05\xbe\x86\x34\x7a\x71\xc1\xf8\xb7\x79\xb4\x49\x8c\x58\x57\xcd\xcc\x55\xd4\xee\xad\x1c\xf0\x49\xf1\x41\x99\x10\x6e\x79\x9a\xd1\xa7\x72\x7e\x95\x9f\x8b\xa5\xce\x8f\x27\x21\xc7\x19\x4e\xc3\x2a\x49\x32\x82\x96\x42\x1b\x84\xb5\xf7\xdb\x34\x9b\x4a\xfc\x8b\x83\x34\x80\x27\xb0\x28\x22\x7c\xae\xab\xbf\x43\xe7\xd5\x37\x6e\x8c\xf4\x5f\xee\xc3\x7d\x58\xb8\x01\x05\x39\xac\x25\x3f\xa6\x48\x07\xed\x32\x60\xf1\x25\xcd\x3e\x57\xcf\x77\x71\xa4\x52\x71\xd7\x4a\x49\x99\x03\xab\xe7\xdb\x30\x9a\xa1\x5f\x17\xab\xb1\x1c\xb1\x36\xc6\xc1\xdc\xe0\xe9\x3f\xa8\x5e\xbd\xae\xfe\x7c\x25\x32\x65\x5e\x1c\xb1\xd6\x14\x1b\x98\xa0\x34\xa7\x9c\x65\x5f\x0e\xa4\xd3\xb4\x7a\x45\x70\xfb\x18\x5d\x3c\x52\x97\xea\x11\x95\x3e\x55\x05\xe6\xe3\xfb\x05\x09\xa8\x8f\x92\x88\x7d\x81\xce\x6c\xdb\xe9\x74\x9a\x26\xf9\x60\xce\x94\x86\xd9\x98\xd0\x14\x8e\x07\x45\xf9\x17\x1c\xcf\x65\xf7\x26\x22\xab\xff\xf0\xeb\x57\x8c\xfd\xa9\x8c\xc7\x63\xf8\x9a\xfc\x39\x82\x72\x42\xda\x98\x7f\x5b\xb0\xb7\x24\xe0\x5d\x0a\xca\x0c\x93\xf2\xaf\xac\x2f\xeb\x8c\x7d\x9c\x75\x65\x9d\xb0\xb7\x89\xec\x47\x41\xb6\x79\x7e\xce\xb9\x65\x84\xe5\x32\x22\x75\x41\xe2\x5e\x48\xe7\x35\x1f\xc3\xee\xe4\x5c\x18\x33\x76\x93\x61\x9e\x74\xdd\xa9\x29\xe4\x02\xf1\xeb\xc0\xcb\x36\x71\xf9\x08\xe5\x83\xc3\x9d\xc9\xc9\xe4\xf4\x74\xf7\xe0\x9d\x74\xca\xff\xba\xdc\xde\xfb\x78\x72\xca\xf0\xbe\xd0\x87\xe4\xba\xea\x28\x76\x93\x12\x4b\x6c\x45\x0e\x87\x07\xa7\xc7\x87\x7b\x97\x47\x7b\x5b\x07\x93\xcb\xc9\xc1\xce\xd1\xe1\xee\xc1\xe9\xe5\xee\x11\xab\x22\x0e\x5c\x46\x79\x1c\x4f\x4e\x0e\x3f\x1e\x6f\x4f\xa4\xd3\xf2\x4f\x5c\xc3\x93\xd3\xc3\xe3\x09\x71\x25\x24\xae\x81\xdd\x49\xcf\xf6\xdf\x1e\xee\xed\x90\x96\x60\x78\x22\x47\x69\x1a\xf7\xa5\x3f\x3a\x3c\xdc\xbb\xb8\xe0\x11\x0c\xe7\xe7\xf0\x5c\xb9\xb8\xe8\x8a\x1d\x87\xe7\xe0\x42\x82\xe7\xea\xc5\x70\x28\xcd\x65\xbe\x15\xde\xc6\xee\x4d\x5a\x61\x4c\x9c\xa0\xda\x04\xf4\x8c\x8a\x12\x0c\x6a\x8d\xd3\xfc\x1a\xad\x2c\x68\x79\x6f\x62\x54\xe0\x97\x78\xdd\xef\x2a\x0d\xe5\x82\x46\x1b\xcc\xca\xef\x3b\x91\x59\xf7\xd3\x00\x52\x51\x4e\x0a\x37\x09\xdc\x38\x4d\xe0\x60\xf8\xba\x5b\x86\x2e\xf8\xa6\x65\x3d\xfb\xe9\xf0\xf8\x03\x1a\x1a\x87\x3b\x18\x5f\xf0\x74\xeb\x60\x7b\x72\x79\xfa\xd3\xd1\x04\x89\x37\x75\xfd\xeb\x28\x81\xef\xa1\x1b\x17\xd7\xd8\xc3\x78\x42\x20\x6d\xc6\x2f\x14\x06\xf8\xb4\x7e\x51\xfb\x5b\xdb\xef\x77\x0f\x26\x97\xef\x27\x5b\x7b\xa7\xef\x2f\xb7\xdf\x4f\xb6\x3f\x9c\x5c\x4e\x0e\xb6\xde\xec\x4d\x76\xd8\xaa\x70\x35\x3e\x3f\x17\xaf\xb1\x7d\xa8\x7b\x02\x34\xf1\xe3\xa4\x73\xce\x91\xba\xfb\x93\x3a\x5e\x9d\x74\xce\x39\x71\x2f\xf9\x80\xcd\x16\xde\x9c\xd5\x9d\x9c\x83\x45\xbc\x60\x07\xa0\x39\xdb\x7c\xb7\xab\x68\xd5\xf1\xfd\x42\x9a\x53\xbb\xf7\xd6\x3c\x88\x8a\xbd\xf4\xea\x0a\xa9\x19\xac\x21\x29\x85\xd6\x9a\xed\x49\x5a\xee\x72\xeb\xe3\xce\xee\xe9\xe5\xde\xe1\xbb\x77\x78\x68\x5e\xd5\x26\x43\x87\x14\xeb\xce\x8f\xf6\x97\x32\x73\x19\x5f\x2a\x70\x57\x0b\x75\xa1\x7f\x4a\xdc\x7a\x5c\x1b\xca\xef\x5d\xb6\x87\x3f\x74\x84\xf5\x2c\x53\x4c\x8c\xe1\x8b\xf1\xf8\xb2\x56\x6c\xa5\x04\x5f\xd2\xd5\xf4\x32\x27\x13\xef\x12\x26\x57\x51\xd2\x09\x5b\x91\xcb\x47\x37\x18\xa4\xf1\xcd\xd6\x1e\x9a\x2e\xc7\xd2\x81\x3c\x93\xf7\xb7\x0e\xb6\xde\x4d\xf6\x27\x07\xa7\xe5\x7a\x7b\x32\x39\x3e\xdb\xdd\x46\x82\xbc\x43\xe3\xfe\xdd\xf1\xe1\xc7\x23\x82\x76\xd2\x23\x04\x9d\xe6\xfc\xf2\x71\x16\xcd\xa8\x52\x81\xd6\x79\xbc\x9b\xbd\x18\x8f\x07\xd1\x37\x09\x56\x6f\xa7\xb3\xdd\xa3\xcb\x83\xc9\x29\x5a\x09\x88\x74\xc3\x97\x2f\xc9\xa6\xf7\x62\x3c\x8e\x5e\x47\xa3\xd9\x63\xc4\xdd\xde\xdd\x39\x2e\xc5\x4d\xbf\x93\xb8\xa8\x90\x9a\xb8\xe9\xeb\x74\x14\x2c\x17\xb7\xa7\x45\xe3\x6f\x12\xb1\xb7\xfd\xe2\xd7\xf1\xaa\xf6\xe3\xda\x2c\x0a\xb2\x52\x20\xff\x49\x04\x6a\xb5\x90\xff\xda\x47\x2d\xb4\xc8\x61\xf1\x36\x4b\xa7\x4c\xa7\x23\x68\x38\xcf\xda\xcd\xdf\x59\xbb\x29\x28\xe2\x58\x05\x54\x75\x82\x41\xc3\x06\x05\x5a\xb8\x8b\x73\x15\xad\xde\x05\x5a\xdd\x87\x4c\x95\x5f\xa9\xcb\x48\xb0\x53\x35\x81\x9d\xca\x45\x05\x0a\x26\xce\xb2\x34\x20\xe8\xd8\xed\xcf\x5f\xd7\x9b\xb7\xa6\x56\xa0\xc5\x78\x67\xb4\x2c\xc1\xce\xe4\x4c\xaa\x56\x7e\x8a\x78\x84\x24\x18\xf4\x08\xb5\x99\x51\xb0\xac\x56\xbb\xb0\xc8\x85\xc6\xd1\x4f\x44\x27\x17\x39\x0a\xa4\x8c\x00\x80\x2d\x1a\x5f\xd3\x5d\xed\xc1\x9b\xaf\x04\x3b\x36\x77\x1e\xd9\x67\xed\xdc\x97\xaa\x4a\x12\xec\x57\xcc\x2a\x8b\x2c\x6c\x28\x97\x9b\x51\x38\x28\xda\x70\x4c\x7c\xfb\x16\xc3\x4d\xd8\xd7\x94\x8f\xd2\x21\x25\x88\x5a\x99\xc2\xac\x2d\xa2\x70\x50\xae\x42\xb0\x43\xbd\x18\xde\x3f\x5c\xf5\xfb\x8e\x9a\xdc\x83\xa6\x5d\x97\x9e\x45\x67\x62\xd9\x23\x1d\xda\x7d\x00\xfd\x34\x80\x6f\xdc\x1c\x9a\xfa\xa0\x2b\x93\xea\x9e\x7e\xb3\xaf\x5f\x56\x6a\xbc\x52\xd1\x6c\xfb\xea\x1c\x7c\xff\xf0\xde\x5e\xa1\x64\x49\x70\xa5\x5a\xf7\xfa\x6a\x74\x49\x00\xf7\x31\x8c\x1d\x5c\x7f\xb7\xae\x4b\xcf\xce\xeb\x78\x7c\x61\x58\xbb\x07\x64\xd5\x9a\x97\xb4\xea\x8f\xda\xf2\xa5\x82\xd4\x27\x5b\x59\x9f\x7e\xdd\x6e\x79\xdd\xb2\xe5\x75\xeb\xcf\xf6\x9b\xeb\xb9\x5c\x59\x94\xb2\x0a\x67\x71\xcd\xd6\x47\x5a\x0e\x6e\xad\x08\xb5\x56\xd2\x53\x6f\x3f\x0a\xb2\x97\x2f\x07\xd1\x38\x79\xb2\x9e\x42\xba\x90\x14\x31\x79\xd3\xc7\xb4\x68\x29\x7b\x8c\x64\x4f\x97\xcb\x1e\x8f\xd3\xef\xd8\xfa\xb8\x36\xf1\x37\x17\xd0\x7b\x48\x91\xba\x9b\xa7\xe7\xa0\xd4\xda\x44\xd9\x16\x9c\x56\x86\x4e\x51\x62\xbf\x44\x09\xca\x69\x8e\x31\x28\xc9\x5f\x09\x37\x52\xdd\x1b\x48\x8c\x85\x38\x9f\xbc\xae\xa5\xd6\xd8\x67\xd8\x32\x4a\xf0\x38\x89\x95\xf8\x34\x9a\xc2\xbc\x70\xa7\x33\x62\x10\xe5\x6e\x6d\x16\x4d\x75\xa2\xb4\x52\x07\x1c\x62\x66\x14\x60\xbc\xcc\x05\xa1\xd9\x3b\x86\x57\x51\x9a\xb8\x31\x1d\x14\xbc\xf7\x6a\x1d\x50\x96\x24\xa7\xd9\xb7\xbf\x42\x65\xef\x6f\xd7\x8c\xdb\xc2\x43\x0f\xb7\x9c\x9e\x8b\xf3\xdb\x8e\x23\x1e\xa7\x35\x81\x5f\x04\x5f\xfe\x2c\x65\xe3\x7b\xe2\x2e\x77\xe4\x16\xd7\x23\x28\x71\x37\x46\xa5\x71\x68\xbb\x7a\x36\x18\x4a\x9c\xaa\x5d\xa6\x60\xc2\x4a\xe4\xce\x66\x3b\x8e\xb6\xa7\x41\x3e\x3a\xbf\x58\x94\xd8\x97\x32\x95\x21\x1b\x2e\xdc\xd9\x2c\xbe\x3b\xfd\x7c\x45\x46\xcb\xa0\xaf\x91\x48\xb2\x0f\xef\x48\xb2\xb7\x69\x46\x8d\xe1\x83\xfb\x99\x9b\xb9\xd3\x7c\x54\x41\xce\x53\x4b\xf3\xa2\xc2\xf3\x9d\xdc\xb2\x1b\xec\xde\xfc\xc9\x95\xd0\x43\x0b\xe8\xbc\xea\xad\x29\x4a\x9b\xed\x0b\x27\xfa\x6b\x50\x43\x62\xe7\x45\x94\x8a\xf1\x3f\xef\xf1\xad\xde\x2c\x76\xef\xf0\xdd\x08\xbe\x71\x5f\x74\xd9\x07\x39\xec\xdb\xf1\x78\x9c\xcb\x3f\xff\x26\xef\x4c\xce\x5e\x3f\x70\x84\xb4\xf4\xe8\xe1\xa8\xcc\x0e\xa9\xdd\xdf\x96\x1f\xca\x61\x88\x59\x0a\x50\x15\x84\x9e\x9b\x93\xb2\x6f\x08\x11\x78\x7b\x19\xc2\xd7\x12\x23\x91\x44\xd5\x0a\x07\x27\xff\x16\xb6\x82\x1b\xf4\x79\x20\xa0\xbc\x04\x96\x99\x28\x05\x15\x8e\xe8\xe8\xa8\x90\xb9\x9f\x52\x04\xec\x64\x74\x4f\xb3\x42\x1d\x29\x78\xf4\x33\x82\x52\x47\x54\x42\x3e\x83\xae\x54\xdc\x7b\x71\x21\xf9\xb1\xfb\xdb\x6f\xa3\xa3\x62\xc1\x57\xaf\x71\x72\x68\xd4\xae\xde\x78\x44\x9c\xb9\x9c\x90\xab\x97\x6d\x37\xa7\x97\x32\xdd\xbc\xaa\xaf\x2a\x2f\x28\x5a\x42\x5e\x17\xf9\x97\x13\x8c\xde\x7c\xc7\x58\xa0\xf1\x71\x31\x17\x3c\xd7\xff\x4c\x48\x5e\x4a\x30\xf3\xce\x02\x16\x0c\xa6\xe5\x97\x7a\x73\x25\x69\x80\xf9\x65\x70\x54\x4a\x5f\x6b\xb5\x13\x75\x35\xd6\x7f\xea\x6d\x55\x5d\x7e\x55\x33\x14\x35\x47\x98\x66\xd3\x4f\x51\x71\x7d\x78\x03\xb3\x2c\x0a\x60\x3e\x20\xf7\x5a\xfc\x6d\xd9\x3d\xc9\x71\x96\xd5\xe4\x98\x65\x7c\xb7\x93\xc9\x23\x74\x5c\xf4\xb5\xfa\xa5\xd4\x46\x69\xa5\x77\x5d\xf7\x44\x60\x5f\x34\xea\xda\x03\x08\xdb\x89\xfd\xba\x04\xf3\xb5\xde\xca\xb8\xc0\x32\x75\x5f\x33\x77\xa4\xea\x6a\xe7\x1f\xb3\x5a\x43\xf3\xd7\x8f\xad\x9a\x97\x76\x04\x2a\x08\x4b\xbc\xde\xe0\x2a\x19\xbd\x1f\x33\xb2\x58\x51\xbd\xd5\xad\x27\xe8\xaa\xe9\x35\xac\xd5\x94\xbb\x25\x6d\xef\x9b\xfc\xcb\x49\x36\x5c\x44\xa5\x8b\x13\xeb\x51\xe2\x84\x43\x21\x9d\x5f\x14\x32\x03\xdd\x1f\x88\xec\x4e\x5a\x1c\x7e\xfd\x3a\xc0\xf1\xc0\x03\xf8\x4a\x14\x22\x02\xe8\xcf\xf0\xe2\x4a\xc4\x49\x7e\x6f\xc0\x34\x83\x2f\xc4\xa1\xf4\x02\xf0\x65\x32\xec\x74\x66\x69\xc1\xfb\x4d\xbf\xbe\x40\x3e\x5c\xb6\x55\xdd\xa3\x72\x18\x6f\xf0\x08\x2e\x16\x7c\x69\x47\x59\xea\xc3\x3c\x6f\x14\x46\x88\x6e\x99\xe5\x87\x57\x9c\xb2\xf2\xce\x37\x87\xc5\x69\xfa\x36\xca\xf2\xe2\xa4\x80\x33\x76\xe7\x5b\xf3\x9b\x60\x20\xe0\xe4\x5a\xbf\x64\x86\x41\xe7\xc8\x4e\x7f\x2e\x02\xb0\x5b\x71\xa7\x91\xba\x46\xf9\x61\xc2\x95\xf3\xf5\xeb\x00\x8e\xa9\x57\xc9\x40\x24\xb9\xa0\xc5\xe5\x4b\x14\xc7\x42\x7a\x03\xb3\x2f\x59\x54\x40\xc1\x4d\xee\x70\xa0\x5c\xc5\x77\x8c\xcd\x8b\x30\x90\x05\x5c\x67\x18\x90\x78\x0b\x22\xf0\x6b\x71\x38\x94\xe0\xa2\xd3\xbd\x8d\x53\x8d\xee\x31\xa7\x25\xad\xc8\x88\x5e\x72\xf7\xb8\x3f\x48\x84\xff\x92\x80\x83\x76\xa7\xe5\x1d\x1d\x24\x4c\x3a\xd9\xc2\xc7\x96\x4a\x6f\xf9\x11\xd7\xbe\xfc\xd8\x94\xd0\x3a\x0e\x93\xa0\xf9\xbe\x73\x1c\xf1\x64\x42\x69\x52\xab\xc8\xf2\x31\x51\xff\xb0\x56\xab\x25\x5d\x4e\xd3\xb1\x8b\xfc\x5a\x42\xf2\x6b\x50\x74\x20\x80\x2f\x3a\x3d\x07\xee\x97\x51\xac\x2e\x01\x97\x87\xe3\x7f\xe2\x4f\x83\x4a\xd1\x3f\xc6\x1e\x0b\x99\x9b\x31\xea\x9e\xc1\x39\x9f\xc9\xbb\xc9\xe9\x65\xcd\x76\x7a\x22\x35\x5f\x6f\x1f\xee\x1f\x7d\x3c\x9d\x94\xc9\x5a\x09\xce\xf6\xd9\x01\xab\xfd\x31\xb6\x65\x63\x53\x6f\xfb\xdd\xd9\xfe\x25\xb1\xed\xb6\x5f\x1d\x9e\x5c\xee\xee\x6f\xbd\x9b\x9c\x5c\x48\xf7\x81\x3f\x2a\x39\x63\x17\x44\xbb\x6d\x3a\x61\xd4\x35\xcf\xde\x16\x60\x1f\x0e\x56\xb4\x40\x31\xfe\x27\xec\x24\xbe\x38\xe6\x0c\xd0\x39\xea\x4f\x71\x09\xbb\x44\x9d\xdb\x63\x0d\x82\x09\xca\x13\xfa\x30\xd1\x5b\xbd\xd3\x2b\xfc\x76\x3a\x9d\xcd\x8b\xb2\x0e\x2b\xe5\xf7\x49\x7a\x7e\xa7\x6b\x57\xa1\xba\xcd\x78\x9c\xf8\xfc\xd8\xe9\x95\x9c\x2a\x3d\x2b\x25\x3e\xdb\x17\xa8\x39\xe1\xbb\x35\x37\x3f\x9e\x7b\xe5\xdd\x61\xf7\x1f\x2b\x25\x2e\x6f\x4a\xbe\x9b\xc0\xdc\x24\xeb\x95\xf7\x2d\xbe\x81\x59\x29\xec\xcd\x54\x20\x77\x35\xdf\x4d\xd8\x72\xda\xf7\xcb\x7a\x78\x82\x35\x98\x95\xc2\x1e\x9e\x08\x11\x4e\xb8\x96\xac\x8f\x25\x0a\x68\xb3\x03\xd0\xbf\x7f\xcb\xe4\x53\xf6\xf7\xa7\x4c\xfe\x89\xfd\xbd\x25\xff\x3a\x67\x7f\xff\x94\xc9\x3b\xb7\xec\xc7\xb6\x7c\xf2\xe6\xd7\x07\x72\x0b\x50\x47\xdb\x8b\x8b\x5e\x8c\x7f\x9d\x40\xfc\x3b\xab\x11\xfe\x3b\x11\xfd\x29\x8a\x39\x43\x8b\x37\x15\x4f\x53\x2d\xc3\x52\x75\xc5\x0e\x34\xd5\x84\xbe\xe7\x1b\x86\xe9\x7b\x41\xe8\x3b\x41\x10\x98\x8e\x65\xbb\xa1\x1f\xfe\xf9\xfb\x1f\x86\xad\x9b\x86\x6d\x00\x60\xe8\xb6\x6d\xa8\x2a\x00\x80\x43\xe3\xec\x02\x9f\x6d\x80\xc5\x77\xc1\xce\xa2\x24\x2c\x6c\x66\x35\x7a\x29\x3b\x29\x72\xc1\x39\x0d\xba\x00\xe2\x37\x5d\x72\x3d\xd5\x55\x56\x82\xe0\x6f\x69\x40\x0b\x0d\x5d\xb7\x81\x6d\x6a\xa1\xed\x85\xc0\xd7\x02\x5b\x53\x35\x68\xb9\x86\xe5\x3a\x86\xe5\xab\x8a\xa1\xe9\xa8\xca\x16\x86\x2f\xd6\x14\xc7\xd2\x1d\x53\xb1\x4d\xdb\x19\x09\xc7\x93\xb3\xdd\xc9\x27\x81\xf8\x71\x7e\x3c\x26\x88\xbd\x0d\xce\x00\xa2\x1e\x34\x8b\xc7\xda\xe2\x9f\xbf\xff\xa1\x04\xbe\xad\x2b\x2e\x50\x1c\x25\xd0\x4c\x2f\x30\xbc\xc0\x81\x21\x30\x0d\x03\x00\x47\x77\xa0\x6e\x38\x61\x68\x18\x00\x43\x07\x3b\x86\x05\x80\xa9\xeb\xc0\x04\x8e\x06\x14\x5d\x1f\x09\x44\x3d\x11\x6a\xb6\x9a\x26\x6d\x00\x0d\x7b\x5a\xd6\x10\xa1\xed\xfa\xb6\x07\x5d\xdd\x08\x4d\xdf\x0d\x0d\xd5\x74\x55\x08\x34\x45\x71\x54\xcd\xf6\x02\x2b\x04\xba\xe5\xd8\x46\xf0\xe7\xef\x7f\xe8\x0e\xea\x6e\x45\xb5\x15\x47\xb1\x4d\x03\x18\x2a\x78\x44\xb7\x35\x20\xff\x99\x9a\x9c\x32\x68\x7d\x74\xec\x82\x41\x54\x54\x2d\xe5\xaa\xa1\x1a\x02\x47\xf1\x75\xcf\xb1\x3c\x2b\x80\x50\xb3\x80\xe3\x86\xbe\x1e\x98\x9e\xa2\x40\x0f\x04\xba\xa1\x3a\x36\xee\x2b\xc5\x52\x6d\x5b\x33\x15\xd5\x51\x55\x0d\x38\xa8\xa5\x26\x28\xb7\x66\x3b\xd5\xd0\xfd\x89\x01\xab\xaf\xa7\x1c\xd3\x74\x42\xdf\x0b\x0d\xdd\x55\x42\xc5\x87\x9a\x19\x3a\x9a\x0d\xd4\x00\xda\xa6\x6b\x19\xba\xee\x86\xaa\xa7\xe9\xde\x9f\xbf\xff\x01\x34\xc3\x56\x0c\x4d\xb1\x1d\x60\x29\xa6\xe1\xe8\x8e\x3a\x12\x88\x29\xac\x25\x01\x46\x65\x4d\xae\xb6\x31\x16\x5f\x0b\x33\xd2\xa3\x98\x91\x75\xb8\x44\x1e\x3c\xcc\xcd\x48\xd2\x20\xca\x44\x49\x8c\x61\x58\x54\xa0\xa3\x18\x99\x8e\xe2\x91\x95\xa8\x61\x85\xeb\x61\x5c\x38\x51\x12\x95\x26\x88\x18\xd2\xc0\x45\x49\xfc\x0c\xef\xbc\xd4\xcd\x82\x3d\xb4\x8e\x27\x14\xb6\x10\x48\x62\x94\x33\x74\x58\x94\x90\xc2\xf4\xb5\x71\xc6\x62\x78\x83\x73\x03\x04\x41\x74\x2d\xbc\x3c\x5d\x6a\xf8\xe3\x13\xcc\x3e\xb6\x06\xf6\xa2\xe7\x11\x54\x4d\x49\xeb\x84\xba\x2c\x1a\x60\x9b\xb3\x34\x8e\x0a\x58\x82\x52\x76\xa1\x1c\x02\xf2\xc7\x06\x03\xce\x68\xe1\x19\x7e\x9c\x21\x4d\x95\xe2\xa3\xd5\x84\x4a\xe7\x05\x85\x4e\x23\x53\x7e\x03\xbf\xd2\x78\xe4\x4d\x54\xa5\x76\x64\x44\x2f\x52\x68\x13\x24\x93\x42\x7d\xd2\x60\x8e\xfe\x46\x21\x13\xbe\x2c\xbf\xa3\x65\x92\x5e\xd9\xd1\xa4\x6b\x49\xde\x44\x2f\xa4\x00\x8d\x34\x3c\xa2\x99\x3a\xed\x07\x3e\x03\x34\xdc\x9e\xc2\x9c\xe1\x70\x1c\x3e\x44\xa9\x82\x37\xc3\xc0\x50\x3c\xae\x19\x8d\xe9\xe1\xc0\x50\x56\xc7\xd2\x14\x15\x81\x68\xc1\x93\x87\xee\x6d\x1d\xec\xec\x1e\xbc\x6b\x87\x7b\xe9\x92\x78\xad\x52\xec\x33\x8c\xe1\x23\x95\xd0\x39\x35\xd4\xb3\x26\xb0\x06\x86\x62\x91\xfe\x9d\x49\xc6\x9a\x31\x37\x18\xac\x83\x62\x95\x5c\xbb\x19\x0c\x36\x02\x18\xc3\x02\x6e\x20\x95\x6a\x63\x96\xce\xe6\x33\x2e\xe0\xc9\xa1\x29\x0b\x38\x63\xf0\x4d\x1b\x39\x2c\xc4\x3a\x8a\x1a\x9b\xe2\xce\x3a\x0d\xd3\x19\x55\xa4\x54\x51\x45\x00\x2c\xc1\xb4\x01\xac\x67\x40\x09\x45\x07\x34\xa9\x48\x24\xa0\x48\x46\xb3\xfe\x1c\xc4\x16\x26\x3b\xaa\xf0\x16\xd8\xb2\x27\x6d\xcb\x67\x1f\x7e\x1d\x58\x52\x96\x48\x4c\xb2\x61\x2d\xac\x9c\x46\xbc\xaf\x15\xea\x63\xb4\xa3\x91\xd6\x08\xf5\x21\x73\x56\x6c\x7f\xcb\xe2\x9d\x8a\xa5\xf1\x4e\x55\xaa\x8c\x29\xc2\xed\x44\xb5\x88\xf8\x2b\x58\x90\xfb\xb9\x8a\x2d\xaf\x2b\xe2\x9e\x84\xaa\xb3\x36\xa9\x87\x06\x27\xf2\xf4\x33\x0d\xfa\xdd\xce\xe4\xf7\x92\x27\x7f\x96\xfe\x95\xc9\x1f\xa5\x0f\x99\x7c\x40\x22\x85\xff\x93\xc9\x27\xd2\x9b\x4c\x7e\xcf\x45\xd8\x9e\x5f\x26\x57\xd7\x69\xce\xc7\xac\x0a\x74\x9f\xc3\x71\xb1\xae\xef\xa7\x59\x10\xa5\xc9\xc6\x35\xe6\x3d\xdb\x20\xef\xee\xeb\x31\xb4\x9b\x34\x76\x74\xe4\xcc\x6e\x05\x60\xcf\x6e\x37\xfd\x34\x4e\xb3\xd1\xff\xd2\x2d\xf4\xff\xc5\x23\x4b\x11\x1a\x2f\xd1\x39\x15\x4f\x0c\x34\xe9\xef\x59\x11\xbe\x65\x69\xfe\x82\xad\x05\x72\xb9\x1d\xad\x8c\xb5\x35\x91\x9c\xf3\x2c\x4f\xb3\x11\xf6\x83\x83\xd9\xe6\x8c\x42\x41\x8e\x32\x18\xe3\x88\xf1\xcd\x22\x9d\x8d\x80\x32\xbb\xdd\x0c\xe3\xd4\x2d\x46\x68\x53\x5d\x5c\xab\x4b\xf2\x46\x1f\x28\x8b\xff\x6f\x0a\x83\xc8\x15\x06\x55\x4c\xae\x60\x58\xe6\xec\x76\x78\x2f\xd7\x56\xee\xae\x8c\x0a\x78\x5b\x6c\xb8\x71\x74\x95\x8c\xc8\x81\x7b\xb1\xf2\x1b\x41\x10\xe4\x6a\xa5\xef\x48\x20\x09\x6b\xe5\xc1\x56\xfc\xfe\x30\x68\xa0\x28\xff\xb5\xe0\x82\x83\x17\x17\xf8\xc6\x3f\x4d\xc6\xb5\x68\xb6\xfb\x87\x1e\xb3\xaa\xe3\xd0\x34\x0d\xc6\xdb\x72\xba\xf5\x86\x1d\x87\x50\x51\xf4\x5d\x94\xfc\x67\xbc\x2d\xfb\xff\x3a\x19\xdc\x93\x49\x8a\x4e\x48\xa9\xfc\xe6\x37\x39\x4c\xb3\xed\xeb\x28\x0e\x06\x49\x32\xbc\x90\xd0\xa3\x7a\xfc\x72\x9c\x8c\xb3\x81\xae\xeb\xa6\x39\x94\xdc\x04\x07\x21\xab\x8e\x46\x1c\x53\xfc\xbf\x5c\x78\x76\xab\x91\x8f\xce\x7f\x96\x8f\x2f\xa4\xaa\x32\x89\x0c\x7f\x93\xd2\x44\x8a\x13\x79\x2a\x45\xf2\x9e\x8b\x63\xed\xf6\xd3\x60\x1e\x43\xc9\x4d\x64\xef\xa2\x6a\x7a\x49\x55\x55\xa0\xd7\xb6\x55\x29\x1b\xde\x8b\xf3\x1c\x0a\x79\x91\x45\x7e\x21\x6e\x66\x72\x30\x28\xa4\xfb\xf7\xa3\xf6\xc2\x3f\x5f\x2c\x48\xdb\xa0\xe6\xb0\x35\xa0\x5a\x43\x29\x1a\x67\x03\x4b\x77\x14\x7d\x28\xa5\xa8\x91\x34\xc3\x18\x4a\x31\x8e\xe5\x06\x86\x36\x94\xdc\x71\x36\xd0\x4c\xcb\x19\x4a\xfe\x38\x1b\x00\xc5\xd4\x9c\xa1\x94\x8f\xb3\x81\x61\x28\xac\x39\xe7\xe3\xee\xc0\xc6\x44\xde\xad\xc7\x35\xb2\x58\x46\x6a\x66\xa7\x56\xe1\x28\x4d\x58\x88\x22\x0d\x66\x4c\xa8\x97\x5e\x3e\x3e\x5f\x1e\x00\x96\x72\xee\x0f\x6f\xd3\x6c\xca\xcc\xb2\xde\x3c\x8a\x03\x7c\x15\x52\x27\xac\x94\x1a\x5e\x10\x52\xf9\xba\xfa\x55\x85\xd5\x31\x42\x42\xe6\x3f\xda\xc0\x29\x19\xa3\xd2\x43\xf4\x7b\xdf\x9d\x7d\x2c\xa2\x38\x2a\x22\x58\xdd\x28\xe3\x44\xfb\x2e\xf5\xbc\xe8\xcf\x95\x67\x39\x24\x19\xaf\xfa\x82\x19\x59\xe8\x47\xbc\xd9\xfe\xbd\x9b\x04\x31\xcc\x48\x0e\xc4\x76\xcf\xbd\x5d\x55\xc1\xde\x8c\xb1\x8d\x7f\x59\xde\x38\xc1\xb2\x88\x39\xf2\x2a\xc6\x87\x8a\xd3\x14\x5f\x17\x54\x21\x76\xa5\x0b\x06\xea\x85\x5d\x3a\x60\x48\x8c\xb9\xef\x66\x01\xbe\x58\xd9\x81\x37\x83\xea\x36\xa7\xe6\x33\x90\xe2\x77\xeb\xb0\xd8\x57\xd9\x1d\x65\x69\xd0\x9b\x1f\x79\xb9\x56\x86\x57\xb0\x10\x02\x78\xb3\x4b\xf1\x42\xd0\xa8\x25\xae\x04\xcb\x1c\x5b\x62\x39\x94\xdb\xee\x09\x38\xaf\x59\x96\x06\xdf\x9a\x19\xf6\x4d\xa0\x2e\x3b\xb5\x6e\xae\xe5\x42\xde\xd3\xae\xae\x25\x5b\x34\xbb\xe9\xbe\x36\x3a\x0e\x13\x5c\x30\x6d\x82\xce\xba\x90\xa6\x4b\x93\x9d\x7a\xcb\x90\x4f\xb8\x5b\x98\xc6\xb8\x5b\x95\x33\xaa\x18\xcb\xfa\xa8\xd1\x50\xab\xf2\x6e\x74\x20\x65\xef\xc8\x07\xf7\x9d\x8a\xe5\xe8\x85\x82\xa3\x82\xbb\x6e\x70\x16\x3d\xf5\xc2\x6c\xb2\x8c\x39\x36\x87\xc5\x27\xec\x71\xcc\xa7\xdb\x0d\x0f\xd2\xe2\x04\x73\xe6\x4a\xf4\x42\x19\xba\xcc\xb7\x6e\x69\x6f\x0e\x17\x7d\x35\xfe\x4e\xa5\xa2\x01\x39\x5c\xac\xca\xaf\xe2\x0c\x9e\x76\xc5\xe5\xbd\x7c\xb9\x84\x39\x1b\x95\xd9\x1f\x6f\xb7\x49\x2f\xd2\xbe\x7e\x1d\x14\x94\x46\x7a\x0e\x71\x0d\x7a\xf9\xa6\x87\x8b\x45\xf7\xca\x40\x09\x56\x19\xaf\xb4\x5f\x79\xff\x8f\x23\xea\x5c\x24\x01\x16\xc1\x57\xee\x3d\x8c\x61\xba\xf2\x0e\xff\x00\xef\xde\x66\xe9\xf4\x20\x0d\x20\x6b\x8f\x41\xfd\x9b\x73\xe5\x62\xb8\x09\xe3\x1c\xde\x2f\x21\x4c\xee\x6e\x6c\x52\xdd\x4d\xd8\x08\xbb\x5c\xd2\x3f\xbd\xab\xb9\x54\x50\xff\xc3\x0c\xe6\xf3\x0c\x1d\x19\xf0\x72\xf1\x29\x2a\xae\xbf\x21\xd3\x73\xb7\xc6\xde\x2d\xd1\xed\xf2\xd7\x79\x04\x8b\xf8\x6e\x58\x41\x03\x64\x53\x42\x1b\xde\xb7\x30\xf5\x2c\xb7\xab\x7a\x09\x4f\xfe\xff\xd6\x6e\xc2\xe2\x3f\xb0\x9f\xaa\x25\xeb\x29\x3b\x6a\x79\xae\x4f\xd0\x53\x78\x3f\xea\xdf\x21\xca\x5b\xd9\x6e\x15\xc8\x47\x93\x9f\xff\x20\x96\x4f\x87\x9b\xcb\xd5\xa5\x2a\xe9\x92\x65\x41\x82\x43\x39\x80\x2e\x3a\x03\xbb\x05\x0c\x70\xf1\xeb\x86\x08\x97\x91\x07\xeb\xcb\xc1\x3b\x99\x4a\x10\xad\x49\xd8\x58\x3a\xe6\xf6\x4f\x4e\x71\xc1\xca\x1b\xe6\xfc\x67\x4d\x3f\xa6\xae\x1f\x5c\xa2\x63\xfa\x6a\x50\x71\xf9\x3f\x5c\x9e\xa3\xbd\xad\x03\xa9\xe2\x5d\xcf\x18\x5d\x3f\x0d\x14\xaa\xf4\x29\x34\x7b\x78\xa7\x87\xac\x74\xce\xac\x62\x8a\x7a\x92\xc2\x85\x7f\x9d\xa6\x39\x44\x9a\x76\x54\x3a\xef\xe2\x90\xa9\x76\xdc\x4c\x73\xb4\xd6\x04\xed\x55\x3a\x37\xe1\x78\x5c\xcd\x6d\xe2\x8f\xd9\x50\xd0\x46\x65\x92\xd2\x03\xb4\xae\x11\x8e\x9e\x60\x1a\x0e\xbb\x8b\xee\x28\x6d\xd1\xf1\x75\x4d\xa9\xca\xab\x37\x68\xe7\x6a\x3c\xe2\x07\x4e\xf7\x51\xa0\x7c\xb6\xe8\x1b\x5e\xd4\xbd\xa8\xdf\x1f\x4d\x2e\xd2\x8f\xb3\x19\xcc\xb0\xc7\x25\xf6\xab\x24\x9d\x21\xa0\x51\x2c\xb2\x31\xd3\x39\x73\x3a\xc7\xe9\xd7\xaf\x03\xf8\x6a\x2c\x0a\x83\xc3\xa3\xd3\xdd\xc3\x83\xad\xbd\xa1\x88\x46\xc7\x12\xa5\xbd\xe6\x2c\xd7\x78\xdb\x3d\x65\x3b\x0b\x7e\x2d\x32\xaf\x3c\x17\xbb\xcf\x51\x77\xbc\xd2\x1b\xb1\xb3\xf6\xaf\xc4\x92\x8f\x4f\x1c\x89\x87\x58\xd7\x73\xe3\xf8\x8e\x5e\x11\x3f\x36\x2f\x61\x37\x14\x62\x18\x16\x02\xa6\xa4\x91\xf0\xa7\x18\x23\x30\x8e\x61\x86\x73\x24\xc0\x86\xec\x9e\xcd\x9d\x17\xe9\xd4\x2d\x22\x1f\x95\x2d\x8b\x8b\x9e\x2a\xde\x3f\xb8\x37\x16\xc1\x5d\xe2\x4e\x23\x9f\x53\x65\x1b\x43\xb0\xfc\x10\xcd\x55\x34\x94\x5f\x8b\xe8\xdf\xa4\xf9\x4b\x01\x73\xea\x18\x36\x12\x34\x01\xbb\xb7\xd2\xe0\x24\x61\x86\xf6\x64\x71\xd4\xce\x6a\x07\xde\xbc\x16\x77\xe0\x0d\x8c\xd3\xd9\x14\x26\x45\x47\x56\xa0\x33\xab\x27\xf3\xdc\xc5\x07\xa4\x56\xf5\x9a\xc7\x1a\x4e\x6f\xe0\x56\x97\xf6\xb7\x44\x35\x5c\xf1\xe9\xce\xe4\x6c\x51\x5f\x4e\x91\xd6\xdb\x4a\x0d\x17\xf5\x85\xb4\x3f\xe3\x05\x51\xbe\x6b\x49\x5b\xd9\x89\xe2\x02\xaf\xe7\x1f\xa9\x69\x63\xc0\x47\xa6\xb1\x87\x48\xc7\x61\x0b\xc8\x5a\x26\x06\xe2\x7b\x7f\x98\x05\xec\x0c\xcf\xb6\x98\xda\x9b\x21\x3e\x87\x76\x3c\xaf\xd5\x28\x20\x4a\x41\x3b\xcf\x2e\x21\x16\x69\x82\x1e\x9c\x14\x6e\x56\xc0\xf2\xd4\xdd\xbf\xbd\x3c\xdc\x65\xc3\xc7\x8e\x16\xb9\x7c\xcc\xbb\x59\x04\x51\x36\xf6\xe5\xf8\x9d\x5a\xba\x59\x54\xbe\x14\x3e\xf6\xa5\xa8\x0c\x6b\x86\xe3\x38\xda\x5a\x86\xb5\x79\x87\x61\xcd\xe5\x0d\x6b\xc4\x84\x16\x8d\xb3\x81\x61\xda\x8e\x49\xec\x6a\xd4\xda\x16\x97\x36\x34\x6c\x38\x73\x7b\x0c\x67\x69\xc3\x70\xd6\xb0\x9b\xd1\xb0\xa1\x7c\x7c\x7e\x41\xcd\x2a\x04\x55\xf8\x30\x3f\xa5\x37\x6f\x3c\x54\x17\xea\xa0\x83\x34\x61\xaf\xb6\x62\x98\x15\xe5\x7b\x0e\x7b\x2b\x59\x89\xbd\xc5\x9f\x87\x99\xf7\x38\x43\xb8\x4a\xfa\x3c\x82\xd0\x9e\x76\x52\x7a\x39\xa2\x42\xeb\x40\x61\x98\x5f\x92\xda\x93\xd8\xd9\x9e\xfa\x32\xe3\xbc\xf9\x13\xfd\xa2\xfe\xaa\x9c\x8a\x65\x83\xc0\xaf\x5f\x57\xb7\x09\x55\x96\x88\xea\x1b\xc9\xa7\x32\x76\x4c\x6a\xed\xc0\xf5\xb6\xc6\xb3\x82\x78\x58\x67\xe9\x94\x57\x36\x1a\x4e\xcd\xec\x83\xd7\xb5\x5f\x5c\x48\x15\xda\x2c\x70\x50\x15\x89\x1e\x59\x89\x6f\xb5\x8e\xfe\x20\x25\xdf\xc3\x10\x5a\x95\xd0\x63\x00\x4d\x1e\x62\x00\x6d\xe5\xd6\x6b\xf8\x6c\xa5\xac\x8f\x95\x31\xb7\xd0\x1c\xd5\xde\x0c\xd6\xb5\xf9\x60\xa1\xf3\xd1\x79\xd9\xfb\x68\x29\x68\x1a\x2f\x1b\x43\xfc\x61\xb6\xd7\xae\xe1\xcd\xb9\x65\x13\x9f\xe5\xbe\x76\x7e\x80\x1d\x76\x79\x39\xd4\x75\xb9\x0a\x1b\xa3\xd3\xa7\xb4\xe9\x75\xcc\x12\x65\xd5\xca\xb1\x59\xd3\xfe\x1b\x02\x90\xc1\xc9\xcf\x52\xea\x74\xff\xfa\x41\xa9\x07\xc3\x11\x89\xd0\xde\x4c\x6a\xfe\xd2\xd4\x31\x9b\xae\xe8\xfd\x0b\x09\x75\x2a\x1e\xc1\x05\x5e\x34\x70\xf7\xe7\xa5\x33\x3c\xad\x7c\x6f\x15\x1b\xd6\x00\x7c\xe2\xe7\xc6\x8a\x1c\x95\xcd\xb5\x5a\x1d\xab\x1b\x6b\xab\xe5\xe6\x85\x32\xa4\xe8\x02\x3d\x29\x86\x78\xa5\x78\x2d\x1e\x9e\x08\xb8\x79\x46\x4c\x57\x5d\x9a\x7e\x04\x6b\x31\x42\x8f\x51\x23\x96\x4e\xd4\x8e\x1d\x9f\x4b\xbf\xec\x7c\x14\xc9\x3f\x75\xda\xa4\x6b\xa3\xa9\xe3\x7b\x76\x62\x59\xbe\xd8\xb0\xe4\x55\x03\xc3\x61\xc7\x61\xb7\x6b\x05\xaf\x9f\x7a\x2b\xdd\x83\x6b\xc7\xb1\xc8\xeb\xb0\xac\x47\x44\xe9\xe1\xf7\x85\x48\x29\x89\x7b\x94\x92\xb8\xa1\x94\x58\xaa\xa2\xaa\x6b\x29\x25\x27\x1d\x4a\x89\xcf\x2b\x25\xe4\x0a\x0f\x2b\x25\xc0\xb2\x15\xa2\x94\xd0\xdb\x3c\xa4\x94\x68\x8a\xad\xf1\xa8\xcc\x2e\xef\xb2\x93\x62\x77\x18\x45\x52\x25\x30\x94\x52\xe6\xae\xd3\x49\x85\x84\xd4\x1d\x06\xd3\x8b\x39\x89\xd0\x6f\xe2\x3d\x92\x12\xc7\x99\xe1\x02\xdf\xc0\x36\x2e\x60\xeb\xda\x0e\xbf\x29\x46\xf2\xb5\xec\x06\x01\xb3\x1a\x37\xb6\x31\xb1\x0d\x31\x22\x4a\x09\xfc\x22\x24\xf2\xc1\xee\xe0\x05\x90\xce\x2f\x86\x0f\xd7\x27\xeb\xae\xba\xe9\x72\x57\x5d\x17\x95\xbd\x11\xd3\xc2\x2f\x2e\x24\xec\x3e\x96\x8f\xee\xb1\xad\x68\xc4\x78\xa8\xd8\xde\x3a\x12\xd9\x5f\xe4\x19\xae\xc7\x88\xa3\x1f\x59\x30\x0f\x5f\x40\x3c\x7c\xd5\x3e\x0f\xdf\x4e\xbf\x5e\x76\x28\x23\xed\x22\x60\xe1\x04\x2a\xdc\x9f\xbf\xff\x61\x7a\x6a\xa0\x99\x7a\xa0\x3a\x4a\x08\x03\x05\xe8\xbe\x66\x98\xb6\xef\x78\xa1\xe3\xb9\x50\x57\x8d\xc0\x32\x5c\x53\x31\xff\xfc\xfd\x0f\xc7\x70\x54\xd5\xd6\x6c\xc3\x30\x81\x66\x03\x53\xb5\x46\x6b\xf8\x78\x56\x9e\xc0\xfa\x72\x26\x7f\xce\x67\xd8\xe8\x49\xb9\xbb\x7d\x58\xa3\xcb\x37\x7a\x68\xee\xeb\xe9\xfe\xb7\x59\x67\xd5\xaf\x58\xf6\xfb\x44\x69\x73\xea\xd7\xf8\xfb\xab\x6f\x30\x7f\xbf\x30\xe9\x68\xda\xd2\x9e\xc0\x11\x09\x6c\x1d\xed\x0a\x84\x54\x1e\x33\xe1\xe0\xa3\xf1\xd9\x7e\x2e\x0b\x5c\x95\xd4\x4e\xbe\x7f\x5c\x0e\x97\x0a\xd4\x6b\xf4\x43\x55\xc5\x3e\xca\xff\x76\x95\x7e\xe0\x3a\xa4\xf3\x93\x11\xf5\x47\xad\x46\xe2\x6a\x72\xf8\xa7\xa3\xc2\xa7\xce\xab\x2b\x98\xf0\xdb\xe4\xef\x7d\x64\xef\x5d\xeb\x42\x07\x35\x6c\x47\xb2\xf5\xe5\x5b\x42\xf2\xca\x16\xce\x26\xa5\x6b\x6d\xf5\xec\xe4\x92\x4c\x99\xf7\x23\xa3\x92\x44\x8f\x30\x93\xa4\xa4\xb2\xb7\x2d\xfa\x3a\xb2\xe6\x1a\x0d\x0f\xc9\x94\xb0\xd7\x49\xee\x12\x0e\x49\xbd\xb5\x40\x73\xbf\x39\x7e\xd7\x0e\x06\xc9\x94\x39\x32\x52\x7f\x59\x83\x7d\xc2\xb1\x21\xa6\x94\xbf\x49\x12\xc9\xac\xa9\xed\x07\x9d\xff\x65\x6e\x82\xe9\x72\x5a\xa6\x94\xf9\x07\xa6\xd4\x3f\x10\x97\x88\x7e\xfe\x58\x9c\x0e\xb4\xb6\xb7\xdc\xe5\x4f\x52\x22\xff\x6b\x8f\xb0\x55\xc4\x98\xf0\x22\xc6\xf4\x19\x31\xa6\xcf\x88\xb1\x27\x5d\x2c\x7b\xfb\x37\x52\x8c\x09\x34\x62\x4c\x87\x91\xc8\x9f\x62\x29\xc6\x74\x18\x89\xfc\xaf\x7f\x49\x89\x3c\x97\xe2\x06\x6b\x05\xe7\x1c\xb5\xb8\x18\x6e\xfe\xff\x01\x00\x00\xff\xff\x9c\xc2\xab\xda\x25\xda\x03\x00") - -func bindataTkgWebDistTkgkickstartui651es20151191a3c343f5b6f4c3bdJsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui651es20151191a3c343f5b6f4c3bdJs, - "tkg/web/dist/tkg-kickstart-ui/651-es2015.1191a3c343f5b6f4c3bd.js", - ) -} - -func bindataTkgWebDistTkgkickstartui651es20151191a3c343f5b6f4c3bdJs() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui651es20151191a3c343f5b6f4c3bdJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/651-es2015.1191a3c343f5b6f4c3bd.js", - size: 252453, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui651es51191a3c343f5b6f4c3bdJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\xfd\x89\x72\xdb\x38\xd3\x28\x0c\xdf\x8a\xc5\x2f\x2f\x07\x18\xb5\x64\xc9\xce\x4a\x19\xe6\x71\x76\x67\x12\x67\x73\x26\x93\x50\x7c\x54\x34\x05\xd9\x4c\x68\x52\x01\x21\xc7\x8e\xa9\xff\xda\xff\x42\x83\x20\x41\x49\x4e\x32\xcf\x79\xeb\x94\xab\x2c\x00\xc4\x8e\x46\xa3\xd1\x1b\x3a\xb3\x45\x16\xcb\x24\xcf\x08\xbd\xbe\x88\xc4\x16\x07\x09\x02\x32\x48\x20\x87\x08\x52\x88\x61\x01\x05\xcc\x61\x06\x53\x38\x86\x09\x9c\xc2\x19\x5c\xc0\x11\x1c\xc0\x6b\x38\x87\x27\xf0\x08\x3e\xc3\x3b\x78\x0f\x27\x70\x08\x2f\xe1\x0d\x5c\xc1\x37\xf8\x0a\x8f\xe1\x3b\x5c\xc2\x33\xf8\x1b\x3e\xc0\x2b\x78\x0a\x6f\xe1\x39\xfc\x80\x8f\xf0\x09\x5e\xc0\x17\xf8\x0b\x6e\xc1\x43\xf8\x07\x38\x07\xc9\x41\x70\xc8\x38\x24\x1c\x72\x0e\x11\x87\x94\x43\xcc\x61\xc1\xa1\xe0\x30\xe7\x30\xe3\x30\xe5\x70\xcc\x61\xc2\xe1\x94\xc3\x19\x87\x0b\x0e\x47\x1c\x0e\x38\xbc\xe6\x70\xce\xe1\x09\x87\x47\x1c\x3e\x73\x78\xc7\xe1\x3d\x87\x13\x0e\x87\x1c\x5e\x72\x78\xc3\xe1\x8a\xc3\x37\x0e\x5f\x39\x3c\xe6\xf0\x9d\xc3\x25\x87\x67\x1c\xfe\xe6\xf0\x81\xc3\x2b\x0e\x4f\x39\xbc\xe5\xf0\x9c\xc3\x0f\x0e\x1f\x39\x7c\xe2\xf0\x82\xc3\x17\x0e\x7f\x71\xb8\xc5\xe1\x21\x87\x7f\xf8\xc8\x4c\xce\x16\x97\x84\xd3\x6b\xc1\xe5\x42\x64\x5b\xf5\x94\x71\x7a\x9d\xcc\xc8\x81\x10\xd1\x55\x3f\x29\xf0\x97\x70\x4a\xab\x6c\x52\x95\x59\x12\x4e\xcb\x72\xa5\x84\xb3\xc8\xa6\x7c\x96\x64\x7c\xea\x74\x98\xbc\x9a\xf3\x7c\xb6\xf5\xfe\xea\xfc\x24\x4f\x5d\x37\x5b\xa4\x69\x87\xf1\x40\xc7\xfb\x89\xe4\x22\x92\xb9\x08\xcb\xd2\x7c\x71\xfe\xcf\xff\x31\xa9\x4e\x68\x1a\xd3\x9d\x98\x89\xfc\x7c\x43\xa3\x20\xb1\xd9\x0e\xaf\x72\x8f\x54\x1f\x0a\x29\x92\xec\xd4\x61\xa6\x03\xdc\xee\x37\x48\x3a\x52\xe0\x20\xd8\xeb\x93\x2f\x3c\x96\xfd\xb9\xc8\x65\xae\x72\xf6\x65\xfe\x1e\x4b\xf6\xe3\x28\x4d\x09\xa7\xfd\x22\x4d\x62\x4e\xee\x43\x6f\x48\x47\x8e\xce\xee\x30\xc6\x84\xeb\xf2\x7e\x9c\x67\x85\x14\x8b\x58\xe6\xc2\x75\x89\x60\xad\x94\x7e\x16\x9d\x73\x8a\x9d\x79\x15\xcd\xb1\x4c\x59\x3a\xef\xb9\x2e\xbe\x71\x64\x98\xf9\x40\x9c\x2e\xce\x79\x26\x8b\xaa\xc8\xf6\x7f\x88\xef\x7d\x48\xca\x43\x9a\x49\xe2\x7b\xf7\xcb\xe1\xdd\x72\x77\x87\x12\xdf\x7b\x94\x46\xe7\x73\x3e\xa5\x3e\x56\x72\x6b\xbb\x2f\x79\x21\x89\xa0\x2b\x43\x5d\x99\x2f\x7a\x2d\xcf\x44\xfe\x7d\x2b\xe3\xdf\xb7\x8e\xaf\xe6\xfc\x89\x10\xb9\x20\xce\x61\x76\x11\xa5\xc9\x74\x2b\x92\x92\x9f\xcf\xe5\x96\xcc\xb7\x8a\xb9\xe0\xd1\x74\x2b\xcb\xb3\x1e\x2e\xc9\x49\xca\xb7\x92\xac\x90\x51\x16\xf3\xfe\x38\x3b\xcc\xb6\x72\x31\xe5\x42\x65\x3d\xe1\x5b\x26\x0b\x60\x81\x48\x75\x69\x2b\xc7\xf9\x2a\xb6\xce\x17\x85\xdc\x3a\x8b\x2e\xf8\x56\xb4\xb5\xb6\xf6\x84\x6e\x9d\x73\x79\x96\x4f\xfb\x0e\x5d\x12\xba\xac\xc1\xb2\xea\xff\x35\x51\xb0\xc1\x98\x2c\x4b\xb9\xcf\xfb\x29\xcf\x4e\xe5\x19\x75\x5d\x22\x59\x1d\x1b\xcd\x72\x41\xf4\x92\x0e\x20\x63\x6a\x6c\x1a\x60\x25\x1d\x89\x3d\x39\x12\xdd\x2e\xcd\x02\x11\x32\x1e\x88\x70\x54\xcd\x4f\xd6\x34\x25\xaa\xa6\xcc\xcc\x95\x25\xd6\xae\x17\x7f\x40\x29\x54\x80\x32\x13\x9c\xff\xe0\xa4\x8a\x69\x30\x7f\x23\xf2\x39\x17\x32\xe1\x05\xe1\x70\x2d\xa2\xef\xde\xf5\x45\x94\x2e\xb8\xd7\x2e\x23\xe9\x72\x49\xad\xd1\x65\xb2\x01\x5d\xd2\x4c\x6c\x3e\xdb\x92\x94\x6e\x5c\xa2\x47\x51\x96\xe5\x72\x4b\x41\xe6\x56\xb4\x15\xa7\x51\x51\x6c\x45\xc5\x56\x54\x6f\x59\xc7\xaa\x3e\xa9\xaa\xb7\x26\x46\xcd\x44\x35\x61\x38\x21\x88\x12\x33\x26\xd5\x94\x64\x7d\x9e\x2d\xce\xf5\x0a\x32\x3b\x52\x96\x9d\x21\x64\x0a\xb0\x67\xc9\xe9\x42\x7f\xef\x0c\xc0\xc1\x21\x3a\x49\xb6\x95\xb9\x2e\xc9\xfa\xdf\x45\x22\xab\x6f\xf5\x64\xb5\xa6\xe7\x8a\x70\x20\x09\xcb\xfa\x5f\xf9\x15\xe4\xec\x22\x4f\xa6\x5b\x03\x70\x0a\x04\x86\x7a\x9f\x92\x9c\xad\x6d\x6c\x47\x43\x51\x83\x4c\xb8\xc6\x16\x8c\xb1\x7a\x57\xf3\x6a\x3f\xd7\x98\x45\xe6\x6f\x44\x72\x9e\xc8\xe4\x82\x87\x6a\x5b\xe9\xf6\x3a\x6a\xe7\x55\xc3\x16\xd5\x16\x07\x59\x96\xce\x94\xcf\xa2\x45\x2a\x1d\xbd\x05\x57\x1b\xcc\x4c\x33\xd9\x68\xe3\xc2\xfc\x9f\xff\x63\x35\xa7\x81\xbd\x2a\x10\x6d\xcd\xeb\x74\x9c\x31\x05\xe3\xfa\x9b\x85\xa3\x98\xf4\x35\xd6\xf1\x8e\x16\xe7\x27\x5c\x50\xc4\x72\x09\x98\x1c\x94\xfa\xb9\xa7\x73\x90\x9c\x52\xc8\xe8\x52\x8d\x21\x81\xbc\x59\xef\x1c\xd7\x1b\x44\x03\xc3\xae\xab\x60\xa0\xc1\x6d\x20\x29\x08\x9d\x08\xe2\xe6\x45\x72\xea\x02\x0e\x5c\x9b\x65\xf5\x3a\xc3\x25\x05\xde\x34\x17\x49\x52\xb7\x14\x49\xb6\x09\xe7\xbf\xe3\xb3\x94\xc7\xd2\x75\xab\x40\xff\x94\x4b\xdf\x0a\xf7\x4f\x92\x6c\x4a\xa8\x67\x2f\x38\xd4\xcb\x93\x56\x78\x3a\x99\x91\x4c\xa7\x25\x06\x5b\x9f\x72\xf9\xfa\x7b\x66\xba\xfc\x98\x17\xb1\x48\xe6\x32\x17\x24\x53\x05\xaa\x4e\x25\xd8\x1c\xfe\xd7\x0b\x1d\x19\xbc\x5a\x6d\x81\xbd\x5d\x9f\x7b\x82\x7a\x49\x1f\x17\x66\xb9\x84\x48\xf6\xa3\xf9\x3c\xbd\x22\xf2\x2c\x29\xa0\xce\x6f\x6d\xaa\xd4\xda\x54\xa3\xce\xda\xe1\x71\x16\x15\x56\xc7\x6a\xf8\xa2\xe6\xdc\x63\x84\xb3\x99\x3a\x37\xe9\xa8\xee\xa7\x35\xa7\x71\x83\x11\x9c\x7a\x4b\xd7\xd3\x29\xeb\x5a\xe4\x66\xf4\xf0\x7e\x31\xe7\x62\x8b\x5f\xce\x05\x2f\x0a\x55\x1f\x02\x22\x4f\xe4\x19\x17\x0a\x41\xab\xd2\x5b\xb9\x68\xe1\x8b\x91\x05\x1f\x66\x7a\x63\xc1\x23\xc9\x89\x74\x5d\x6b\x6c\x70\x6d\x1d\x6d\x06\xc1\x71\x68\xe0\x63\x00\x36\x8a\xf0\x3a\x83\xe5\xf2\xbf\x82\x31\xe9\xba\x8b\xea\xdc\xaa\x27\x66\xd1\xc6\xce\x0b\x69\xba\x5a\x70\xf9\xc6\xd4\xf4\x7a\xe6\x6f\x4c\xdd\x04\x66\x75\x55\xbc\x3f\x99\x60\x5f\x26\x13\x26\x81\x2f\x61\xad\xed\x02\x69\x23\x05\x7f\x92\x59\x67\x68\x9b\xce\x61\x2b\x30\x5f\x96\x1d\x03\xe8\xf5\xb4\x55\x38\xa4\x33\x54\x20\xbd\xf6\xb5\x5f\x9c\x45\xe7\xad\x2c\x0d\x08\xd4\xb5\xbf\x11\xf9\xe5\x95\xc9\x34\x18\x49\x71\x65\xc6\xf1\x30\xcf\x53\x1e\x65\x16\x2c\xe2\x0a\xbd\x9e\x69\x20\x5c\x6b\x8e\x54\x05\x20\x08\xc1\x1a\xd5\x92\x52\xe8\x0c\x96\x71\x24\xe3\xb3\x86\x24\xec\x0c\x97\x4b\x52\x03\xec\x0a\x49\x2d\x20\xd3\x30\xad\xfa\x2c\xcd\x4e\x9d\x49\xdc\x44\xd4\x26\x88\x46\x82\xad\xf7\x23\x6b\xf6\x19\x24\x74\xc9\xd3\x82\x6f\x09\x96\x6d\xde\x88\xa6\x0b\x73\x5d\x3b\x08\xba\x6c\x16\x6a\xde\xec\x1e\xe9\xba\x35\x12\xaf\x27\x4f\xa1\xf9\xf5\x29\x95\x0d\xb5\xd4\x3a\x26\x6e\xd8\x63\x8f\xb9\x48\x2e\xf8\x74\xcb\x1a\x56\xb1\x75\xae\x28\x9d\x2c\xbd\x32\x48\x5f\xb7\xac\xb6\x5a\x03\x21\xeb\xd3\xa7\x89\x65\xdd\x20\x1e\x65\x4d\x83\xef\xf8\x8c\x0b\x9e\xc5\xa6\x55\x35\xd8\xad\xb3\xa8\xc8\xfe\x90\x5b\x27\x9c\x67\x5b\x49\x96\xc8\x24\x4a\x93\x82\x4f\xb7\x7a\x5b\x85\xda\xf8\x84\xb6\x72\xa8\x65\xb7\x9b\xe5\x8a\x0a\x6c\x26\x6b\xd6\xa2\xf8\x7f\xb1\x9f\x4e\x7f\xb1\x9f\x36\xed\xa6\xb2\xdc\x58\x58\x75\x02\x66\xfa\xea\x50\xf0\x74\xd6\xff\xce\x4f\xe6\x51\xfc\xf5\xd1\xd9\x22\xfb\x2a\xbf\x9e\x4e\xbe\x26\xf1\xd7\x42\x46\x42\x4e\x16\x09\xfb\x65\x8e\xb2\x0c\x42\xda\x9f\x2f\x8a\x33\x12\x04\x77\xef\x0c\x43\xb8\xde\xd9\xbd\x3f\xbc\xb3\xf9\x4c\x19\x71\x26\xfa\xd9\xf9\x94\x70\x0a\x64\x05\x8c\x13\xc8\x99\xf3\xe4\x72\xce\x63\xc9\xa7\x36\x8a\x84\x88\x39\x93\x49\x9a\x4f\xa3\xe2\x6c\x72\xa6\xfe\xd5\x8b\x3a\x99\x38\x90\x5a\x5f\xe7\x69\x14\xf3\xb3\x3c\x9d\x72\xa1\x3e\xc5\x6c\x77\x07\x16\x6c\xb8\x3d\x80\x82\x3d\x18\x0c\xee\x0d\x1f\x3c\xd8\xb9\x73\xfb\xde\xed\xc1\x83\x07\x43\x98\xb3\xdb\x3b\x0f\x6e\x3f\xb8\x7b\x6f\xe7\xc1\x1d\x98\xb1\x20\x70\x22\x71\xe5\xc0\x70\xe7\x7e\x08\x81\xa3\xe6\xd8\x81\xa1\x09\xfe\xc5\xaf\x1c\xd8\x51\xb1\x78\x21\x54\xb6\xfb\x75\xf8\x5d\x72\x7a\x26\x1d\x18\xde\x55\x29\xb3\x34\x99\x3b\x70\x67\x88\x59\xe7\x91\x50\x40\xe2\x40\x6c\xc5\xaa\xec\x77\x6f\xab\x34\xc1\x23\x71\xea\xc0\xce\x9d\xbb\x61\x08\x53\xe6\x04\x15\xe4\xd6\x57\x90\xd0\x81\x63\x3b\x59\x44\x57\xa1\x03\x93\x26\xa9\x42\x23\xa1\x03\xa7\x4d\xe2\xe3\x48\xf2\xd0\x81\xb3\x26\x05\xe1\x38\x74\xe0\xa2\x49\x7a\x5a\x4d\x70\xe8\xc0\x51\x93\xfa\x8c\x67\xfa\x56\x60\x7d\x3e\x68\x3e\xbf\x8a\xe6\xa1\x03\xaf\x9b\x04\x4d\x2f\x85\x0e\x9c\x37\x69\x1a\xf0\x42\x07\x9e\x34\x69\x6f\x44\x7e\x9e\x14\xaa\x57\x8f\x9a\xc4\x77\xfc\xf4\xc9\xa5\xaa\xf0\x73\x93\xf6\x9e\xab\x92\xef\xac\x04\x24\xbb\x42\x07\xde\x5b\x69\x48\x63\x86\x0e\x9c\x34\x69\x1f\x79\xf4\x55\x77\xef\x70\x65\xc6\x1e\x2e\x66\x33\xec\xe3\xcb\xd6\x14\x45\x7f\x27\xfc\x7b\xe8\xc0\x1b\x6b\x4e\xd2\x3c\x92\xbb\x3b\x66\x9e\xaf\x56\xbe\xdc\xbd\x6d\xbe\x7c\x6b\xbe\x1c\x66\xf2\xbe\x49\xfe\xda\x4a\x1e\xde\x35\xe9\x8f\x5b\xe9\x4d\x03\xdf\x9b\xf4\x0f\x89\x55\xcf\xe5\x4a\x7a\x75\xd1\x34\x9f\x9f\xb5\x3f\x37\xed\xfc\xdd\xfe\xd0\x34\xf4\x81\x6d\x8f\x4f\x26\x93\xf9\xd6\xb8\xcb\xb6\xfe\xf8\x63\xb4\x7d\x0a\xaf\x54\x12\xa9\xd2\xe8\xd6\x1f\x7f\x6c\x8d\xbb\xdb\xa7\xf0\x94\x6d\x93\xc9\x84\x8f\x49\xff\x4f\x7f\x4c\x4b\x55\x4a\x8e\x29\xdd\x1a\x77\xc7\x99\x2e\xf8\x96\x6d\xbb\xc4\xf7\xa2\xf3\x79\x99\xca\xf2\x54\x96\xdf\x16\xb9\x2c\xff\xbf\xdd\x07\x54\x7d\x7d\xce\xb6\x03\x77\x6f\xdf\xf9\x23\xdc\x3e\x85\x1f\x4c\x2f\x31\x79\xdb\x2f\xf2\x85\x88\x39\x85\x8f\x26\xe9\x79\x9d\xf4\x89\x6d\xef\xfd\x4f\x8f\x04\xe3\x62\xfc\x3e\xec\xfa\xf4\x7f\xf6\xb7\x4f\xe1\x85\x4a\x5c\x49\xfb\xa2\xd2\xd8\x4a\xe2\x5f\x6c\x7b\xdc\x2f\xc7\x01\xf1\xbd\xe0\x3f\xc1\x38\x0c\xff\x2c\x49\xe0\xfc\x11\xaa\x0b\x3a\xf1\x3b\xe3\x21\x0d\xfe\x33\x1e\x87\xe5\x78\xdc\xa7\x7f\xfa\xe3\x21\x1d\x87\xdb\x70\x8b\x6d\xff\x67\xfc\xfd\xcf\x5b\xdb\xf0\x90\x6d\x07\xff\xe9\xab\x72\x5d\x5d\x09\xe9\xf9\xe3\x69\x97\xf8\xde\xb8\x3f\x9e\x76\xa9\x4f\x4d\x75\x55\x7d\x3b\xad\xfa\xe8\x78\x87\x8e\xc3\x92\xf8\x0c\x4b\x94\xe3\x60\x8c\x2d\x57\xc1\xf2\x16\xa5\xdb\xa7\xf0\x0f\xdb\x0e\xc6\xe3\xff\xdc\xea\xff\xd9\xf5\x09\x0d\xc6\xe1\xf5\xb2\x54\xf3\xc3\xb9\x99\x8d\x7f\xea\xd9\x90\x5c\xf5\xad\xe8\x6e\x83\xe0\x6c\x7b\x5c\x6c\x43\xa6\x7e\xaf\x55\xa5\xd9\x78\x7b\xfc\xe7\xd6\x38\xf8\x2e\xa2\xf9\x9c\x4f\xb7\xbe\x27\xf2\x6c\xab\xdf\x1d\x87\x5b\xe3\x3f\xc7\xdb\xd4\x1f\x67\xfe\x36\x24\x98\x7d\x73\x5e\xd2\xef\x52\xcc\xbd\x0d\x39\x67\xdb\xe0\x6f\xb9\x5b\xdb\x10\x71\x35\x09\xe3\xcb\xc1\xa0\x37\xbe\xdc\x99\x8d\x2f\x77\xa3\xde\xf8\xf2\xf6\x60\x7c\x79\xe7\xa4\x37\xbe\xbc\x3b\x18\x5f\xde\x53\x81\x7b\xb3\x50\x81\x48\xaa\xb2\x13\xca\xe0\x7a\xa9\xc6\x38\xde\x1e\x17\xe1\x36\xc4\xaa\xd9\x31\x19\x8f\xa9\xbf\x7d\x0a\x0b\x15\xbb\x35\xbe\x26\x6a\xb2\x96\xe1\x9f\xaa\xf7\xe3\x7e\x15\xa1\x7f\xd2\xf1\x72\xfb\x14\x0a\x95\x09\x57\x61\xae\x06\x1d\xf4\xba\xe1\xe0\x32\x18\xf4\x1e\x44\xbd\x59\xd8\xbd\xb5\x9d\xc0\x4c\xa5\x0f\x4e\x82\xc1\x50\xc7\xa7\x38\x39\x06\xc6\xfb\x5d\xff\x51\x43\x07\x8c\xc3\x5b\xdb\x70\x8c\x05\xf2\x60\xd0\xbb\xa7\x4b\x4c\x54\x02\xf1\xbd\x41\x19\x0c\x7b\x0f\xc2\xf1\xf4\x4f\x7a\x6b\x1b\x4e\xd5\x10\xc6\x97\xb1\x1a\xf0\xf4\xee\xf8\x72\x7a\xbf\x37\xbe\x9c\xdd\x1d\x5f\xce\x30\x30\x1b\x2f\x06\x43\x35\x1b\x8b\xc1\xf0\xde\x4c\xad\xd4\x19\x67\xdb\xe4\xd6\x7f\xe8\x36\x5c\xa8\xa2\x7f\x8c\xb3\xb1\x18\x2f\x76\x06\x3b\xf7\xf1\xff\x83\xf1\x58\xe5\x3a\xe2\xcc\x19\x8f\x17\xd3\xfb\xaa\xec\x78\x31\x9d\xcd\x66\x0e\x1c\xe8\xc4\xc1\xae\x4e\x1c\xec\xde\x9d\x8d\xc7\x8b\x19\xdf\xc1\xe8\x8c\xef\xa8\xe8\xce\x60\x8a\xd1\x9d\x81\x2a\xf2\x5a\x17\xd9\xb9\xa7\x8b\xec\xdc\x3b\x99\x39\x70\xce\x99\x13\xf5\x7e\x8c\xc7\x97\xd3\x59\x6f\x8c\xdd\xd5\xfd\x55\x1d\x76\xe0\x09\x67\xce\x41\xef\xf3\x58\x8f\x0a\x87\xa5\xc7\x35\xbe\x9c\x72\x07\x1e\xe9\x2a\x67\x7c\xc0\xf5\xcf\xcc\x81\xcf\x98\x76\x19\xc5\xe3\xf1\xe5\xc9\x50\x65\xbc\xa7\x2a\x53\xff\xb0\x61\x05\x0b\x1a\x18\x10\x1a\x34\x38\x20\x3c\x68\x80\x18\x5f\x9e\xe8\xbe\x57\xdd\x1c\xdc\x9d\x6d\x8d\xc7\x52\x15\x3f\x19\x8f\x55\xd9\x68\x80\x8d\xcd\x66\xe3\x71\x36\x1e\x8b\x71\x35\x65\x66\xce\x16\xc3\xbb\xf7\x55\x8e\xe1\x7d\xec\x95\xaa\x48\xff\x0c\xf5\xcf\x8e\xfe\xd9\xd5\x3f\xb7\xf5\xcf\x1d\xfd\x73\x57\xff\xdc\xd3\x3f\xba\xce\xc1\x03\xfd\x13\xe9\x16\x74\xe7\xee\xa8\x9f\xdd\xc1\x60\xe0\xc0\x3b\xce\x9c\xc0\xe9\x1e\xf1\xae\xa3\x0e\x14\x1d\xfb\xac\x63\x27\x3a\x76\xa0\x63\x87\x38\x35\xd3\xae\x03\x2f\x75\xfa\x6b\x9d\xfe\x46\xc7\xce\x75\xec\x4a\xc5\xfe\x83\x15\x7e\xe6\xdd\x43\xae\x72\x9d\xf3\xee\x13\xfd\xf5\x9b\x81\x86\xdd\x38\xd0\xd0\x70\x62\xa0\x42\x9d\x15\x4d\x59\x95\xf9\x31\x67\x0e\x6e\x92\x26\xff\x94\xdf\xc5\xfc\xd3\xd9\x2c\xa4\xd7\x3b\x4b\x07\xbe\xab\x32\x36\x80\x9d\xcc\x66\x21\x26\xc4\x0d\xc4\xa9\xf3\x43\xf7\xb2\xea\xc7\x33\x5d\xb5\xd3\x7d\xc3\xbb\x4e\xe9\x74\xaf\x78\xd7\xa1\x0e\xfc\x6d\x92\x2f\x5b\xc9\x1f\x74\x72\xf0\x87\x9a\xbb\xe1\x83\x90\xf8\xde\xb4\x4c\xd3\xf2\xbc\x14\xbc\x2c\x4a\x59\x5e\x70\x4a\x7d\x07\x5e\xad\xe7\x7b\x5c\xbe\x7c\x59\xbe\x2a\xdf\x3d\x29\xdf\x97\xc7\xe5\xdf\x4f\x30\xdf\x53\xd3\xcc\x89\x6e\xe6\x9b\x6a\xc6\x77\xe0\xad\xee\xe3\x23\xd5\x47\xdf\x81\xe7\x9c\xbd\xe5\xdd\xa7\xbc\x5b\xcd\xc2\xce\x60\x30\xc5\x62\x81\xe1\xb0\x87\xfd\x2f\x79\x92\x11\xa7\x74\xa8\xea\x68\xb7\xca\x4e\xff\x74\xe0\x87\x69\x23\x78\x79\x43\xe6\xe7\x1c\x3e\xd6\x99\xbe\x72\xec\x8c\xaf\x16\xbd\xe2\xde\xbf\x5b\x2d\x01\x9f\x6a\xdc\xec\xd4\x63\x74\xc0\x39\x75\x28\xbc\xa8\x3f\x9d\x70\x9d\xf2\xa5\x4e\xf9\x86\x23\x60\xd5\x38\x4b\xa7\xfb\x91\xab\xc6\x31\xd7\x5f\x75\xae\xe0\x12\xdb\xc7\x15\xe9\x3a\xdd\x0f\xa6\x50\xf0\x1e\x05\x09\xce\x2d\x67\xb5\x3b\x7f\xeb\x9c\xaf\xda\x39\xbb\xcf\x36\x66\xae\x6a\x7f\x66\x6a\xc7\x04\x2c\x0d\x0a\xaa\x15\x36\x1e\xbe\x3f\x2e\x77\x8e\x1e\x97\xbb\xef\x1e\x97\xc4\xef\x04\xc3\x9d\xdd\x90\x8e\xc7\xd3\xe3\xe7\x94\xf8\x6c\x3c\x3e\x29\x83\xa8\xf7\x63\x12\x52\xa7\x29\x52\xc8\x72\x27\x9b\x96\xbb\x62\xda\x2a\x22\xcf\xea\x22\x07\xbd\xcf\x58\xe4\x90\xc3\x0f\x7b\x46\xf5\xf8\x6f\x59\x53\x5a\x2d\x31\xc2\xff\x01\xd7\x60\xe0\x50\x78\xa8\xb0\x6b\xd4\xfb\x11\xaa\xaa\x42\xac\x30\xbc\xde\x59\x62\x52\xa9\x8e\x86\x50\x05\xf5\xb7\x2a\x80\xa9\x65\xf0\x1f\x1d\x1d\xf4\x1e\x6c\x85\xdb\xf0\x0f\x67\x81\x83\xd4\x8f\x03\x8e\x26\x00\x1d\x70\x0c\xd5\xa7\x83\xdc\x01\x07\x09\x63\x07\x1c\x9b\xf2\x33\xd1\x8a\xdc\x53\xd1\xfa\x32\xe2\xd4\xe4\x9e\x0e\x57\xb4\x97\x8e\x34\xe5\x5f\x45\x73\xfc\x2f\xcf\x1c\x30\x42\x0b\x70\x2a\x22\xd8\x01\x47\x4f\x83\x03\x28\x8e\x00\x47\xd3\xb8\x2a\xa0\xb9\xb1\xe0\xd4\x57\x5e\x07\x9c\x86\x34\x34\x11\x9b\x1e\xac\xd2\x9a\x8e\x58\x94\x9f\x03\x4e\x45\x16\x3b\xe0\x4c\x1c\x70\xe2\x94\x47\xe2\x38\x39\xe7\xf9\x42\xb5\x9b\x14\x4f\xd5\x4d\x56\xf5\x68\x1e\x89\x82\x1f\x66\x2a\xb5\xe0\xd2\x64\x09\x81\x4b\xd6\x1b\x82\x94\xec\x7a\x39\x92\x32\x78\x13\x32\x29\x83\x2b\xfc\xff\x0d\xff\x7f\xc5\xff\x8f\xf1\xff\x77\xfc\x7f\x89\xff\x9f\xe1\xff\xbf\x43\xd6\x19\x80\x94\xc1\x14\xa3\xc7\xf8\xff\x10\xff\x4f\xf0\xff\x4b\xfc\x7f\x8a\xff\xcf\xf0\xff\x05\xfe\x3f\xc0\xff\xaf\xf1\xff\x39\xfe\x7f\x84\xff\x3f\xe3\xff\x77\xf8\xff\x24\x64\x9d\xa1\x66\x3c\x63\xff\x04\x36\x23\xb0\x19\x81\xcd\x08\x6c\x40\x60\x63\x02\x9b\x11\x38\x06\x81\x63\x10\x38\x06\x81\x63\x10\x38\x06\x81\x0d\x0b\x6c\x58\x60\xc3\x02\x1b\x16\xd8\xb0\xc0\x86\x85\x0c\xde\xe3\xff\xef\xf8\xff\x12\xff\x3f\xc3\xff\x7a\xb4\x02\x47\x22\x70\x24\xc2\xee\x65\x26\xd9\xb5\x33\x1e\x3b\x9e\xfa\x07\xce\x1f\x8e\xe7\xfc\xa1\xb6\x57\xe6\x78\x8e\x82\xad\xb1\x70\x3c\x47\xad\xb8\x3e\x26\x1d\xcf\xd1\xbf\x55\xc2\x83\x2a\xe1\x81\xb3\x84\x44\x32\x5c\x31\x04\x54\xc8\xab\xd8\x61\x26\x21\x92\x6c\x8d\xf5\x72\x9a\xe6\x27\x51\xea\xba\xed\xdf\xbe\x06\x4c\xc6\x2a\xee\x83\x49\x87\x74\x43\x15\x05\x4f\x67\xae\xdb\xfc\x5f\x2f\xac\x52\x21\x96\x2c\x92\xa5\xba\x18\x94\x66\xd3\x10\xc7\x30\x78\xce\x92\xc2\xa1\x84\xc2\x42\x32\xe9\xba\x1d\xd9\xcf\xf2\x29\x57\x90\xee\xba\x12\x0a\xc9\x16\xd2\x75\xb9\xeb\x76\xb8\xf5\x81\xc3\x5c\xb2\x42\x55\x2f\xfb\xfc\x72\x9e\x0b\x59\x30\xc6\x16\x12\x66\x92\xcd\xa5\xeb\x46\xc8\x23\x8d\x79\x51\xc0\xb4\xc5\x20\xb4\x98\x73\x55\x71\xc1\xbf\x2d\x12\xc1\xed\x30\x71\x16\x32\x49\x1d\xda\x57\xa3\x2c\xca\x72\x26\x5d\x77\xa6\x19\xe3\x49\x76\x6a\x87\x4d\xce\x86\x37\xb7\x5c\x12\x0a\xc7\x92\x4d\xa5\xeb\x4e\xa5\x91\xd0\x6a\x5c\x03\x13\x2b\x5d\xa1\x1a\x38\xb5\x12\x5e\x45\x73\x38\xb3\xe2\x1a\x1b\xc0\x85\x95\xf4\x9e\x4b\x38\xb2\xe2\x6a\x32\xf4\x7e\x6f\xa4\xc6\x07\xb5\xc4\xa1\xf8\x9e\xa8\x4e\x09\x23\x8d\xbb\x8e\xa3\x82\x6f\x0d\xbc\x9a\x2d\x84\x4c\x48\x49\x47\x98\x3e\x5c\x4d\x07\x11\x0c\xc2\xea\xe3\xce\xc6\x8f\x20\x82\xa1\xc9\xb1\x7b\x73\x0e\x10\xc1\x4e\x68\xe4\x2b\x5b\xdc\x30\x11\x41\x58\x9c\xaf\xd7\x55\xaf\x21\x6b\x64\x63\x89\xc2\x31\x39\xd3\x42\x25\xee\x0f\x3c\x23\x57\x1c\x75\xbb\xc9\x5e\x3e\xd2\x2c\xa2\x88\xf1\x20\x09\x47\xc8\xb3\x04\x41\x22\x0a\xbc\x6e\xcb\x12\x25\x9e\xaf\x09\xde\x7a\x43\xc8\x36\x57\x2e\xf6\x32\xd7\xed\x0c\x3b\x8c\x49\xc2\x03\x11\x82\x00\xbe\x59\x36\xf0\x64\xad\xd6\x0d\x15\x8a\x5e\xef\x37\xab\x7b\xf4\xef\x3a\x39\xa2\xc9\x8c\x74\xac\x4a\x1b\x4e\xb5\xe1\x46\x37\x75\x7f\xfe\xdd\xba\x21\x61\x03\xc8\x59\x10\x9a\x46\xea\x69\x16\x6a\x9a\x23\x6c\xc9\x75\x49\x1e\x24\xdd\x6e\xc8\xa2\x7a\xb6\x2d\xb1\xd7\xbb\x96\x68\xa0\x53\x89\x8a\x79\x59\x76\x2c\x49\xf1\x77\xbd\xe6\x03\xba\xdf\x1b\x36\x45\xdf\xd7\xf0\x6b\x7a\x9a\xa9\x9e\x26\x9b\x67\x21\xdb\x4b\x70\x16\x04\x91\xc0\x83\x2c\xa4\x0d\x1f\xbe\xe6\x92\xd7\x55\x9f\xfc\x8b\x29\xd0\x72\xea\x8c\xd6\x33\x1d\x88\xb0\xb5\x7e\x46\xa0\xd5\x54\x7f\xb8\xb9\x7a\xd9\x54\xba\xba\x7c\x3c\x48\xba\xaa\x5a\x4b\xfa\x6d\x41\xc3\x4b\x6b\x4f\xfc\x7c\x3f\xa8\x16\x33\xd7\xcd\xb5\xba\x43\xd0\xed\x26\x21\x35\x9b\x44\x30\x49\x04\xa8\x3d\x02\x89\xd5\x6f\xd1\xb4\xf3\x66\xad\x9d\x9b\x9b\x48\xaa\x26\x7a\x3d\xd5\x44\xd2\xeb\xfd\x4e\x03\x57\xff\x05\x58\x6f\x80\x6a\x6b\x49\x55\x2d\xdf\x24\xfb\x20\x89\xa3\x4b\x3a\xb4\xc1\x80\x5f\x65\x9b\xbf\x6c\x3a\x44\x38\x58\x0c\x68\x01\x89\x96\x4a\x54\xe1\x5a\x98\xcc\x04\xa0\xc8\xcb\x42\x1e\x8f\x37\x62\xa7\x1a\x5a\x72\x26\xba\x24\xf3\x87\x5e\x6f\x48\x47\x99\x9f\xf7\x7a\x5e\xb7\x9b\x57\x90\xa9\x06\x92\x87\x90\x37\x03\xd9\xca\xab\x2e\xd9\x60\xff\x7d\x4d\x50\xcc\x98\xf4\x57\x19\xe6\xcd\x96\x10\xb8\x27\x36\xec\x04\xb5\x0b\x18\x63\xb2\x11\x8e\xd7\x8d\x55\xb5\x78\x38\x9c\x67\x6d\x04\x7c\xb9\x71\x88\x02\x21\x6e\x15\xef\x26\x33\x92\x11\x5c\xf0\x46\x4e\x93\x6c\x18\xd3\x33\x5b\x9c\xc1\x3b\xcc\x82\xed\xbf\x2b\x90\xb8\x19\x69\x56\x8b\xe6\xbf\xd5\x39\xb7\x85\x77\x14\x1d\x35\x15\x7c\xd8\xa8\x1c\xd5\x88\x10\x2b\xe5\x14\x3f\xf1\x64\xc0\x43\x4b\x20\xf5\xea\xb7\x0a\x72\x3f\xf1\x78\x20\xed\x82\x4f\xeb\x19\x52\x90\x63\x86\xdd\x06\xaa\x04\x72\x7a\x2d\x58\xe6\x93\x8c\x75\x86\xc0\xa9\x87\x7b\x03\xd3\x97\x14\xac\x3d\xf1\x76\x75\x4f\x40\xc6\x56\x27\x3b\xb3\x0e\x39\x89\x0b\x4b\x47\x51\x87\x31\xbd\x09\x05\x63\x2c\xf1\x23\x4f\x74\x1b\x14\x6c\x35\xf0\x7c\xf3\xa6\x33\x0a\x63\xb8\xd5\xf8\x48\xab\xdf\x48\x22\xe8\x06\xf5\x9b\x1f\xad\xf5\x73\xdd\x5a\xf3\x06\x62\x41\x38\xed\x0e\x69\x5f\x70\x14\xaf\x10\xc9\xc1\xb1\xf5\x5c\x3e\xfe\x62\x96\xb5\xe2\x4d\x9d\xfd\x53\x5b\x94\x7c\x22\x89\x84\x4d\xa5\xd4\x8a\x58\xad\xbc\x90\x2b\x62\xe3\xb3\xa8\x20\xb6\x98\xf8\xcb\xe6\x49\x58\x3d\xeb\xbf\x4b\x3c\x3e\x44\xa8\x0f\xa3\xd1\x26\x24\xf6\xd7\x5a\x55\xed\x03\xfe\x77\xea\xb8\x75\x63\x1d\x90\xb1\x81\xaa\x47\x9d\x09\x02\xf7\xaf\xeb\x76\xbb\x59\xb3\x28\x2a\xfb\x43\xc9\x5e\x49\x72\xed\x8c\x2f\xe3\x81\xe3\x39\x07\xea\x0a\x70\x19\x0f\x9b\xe0\x4e\x13\xdc\x6d\x82\xb7\x9b\xe0\x9d\x3a\xc8\x55\x0d\x91\x0e\x0e\x9b\xe0\x4e\x13\xdc\x6d\x82\xb7\x9b\xe0\x9d\x3a\x18\xdf\x73\x3c\xe7\x91\x4e\x55\xc1\x18\x83\x53\x55\xef\x63\x0c\xce\x54\x70\xaa\xf3\xaa\x6b\xcb\x13\x1d\x7c\xd0\x04\xa3\x26\x78\x52\x07\xb9\xca\xcb\x75\xf0\x41\x13\x8c\x9a\xe0\x49\x1d\x8c\x63\xc7\x73\x0e\x75\x70\xda\x04\x79\x13\x9c\xd5\x41\xae\xf2\x26\x3a\x38\x6d\x82\xbc\x09\xce\xea\xe0\x54\x4d\xc9\x91\x1e\xc5\xd0\xdc\xc3\x2e\xa7\x6a\x76\x5e\xeb\xe0\x6e\x13\xbc\xdd\x04\xef\x34\xc1\xbb\x4d\xf0\x7e\x1d\x9c\xa9\x1a\x72\x1d\xdc\x6d\x82\xb7\x9b\xe0\x9d\x26\x78\xb7\x09\xde\xaf\x83\x53\x35\x25\x1f\x74\x30\x6a\x82\x27\x4d\x30\xae\x83\x33\xbc\x1b\xea\x60\xd4\x04\x4f\x9a\x60\x5c\x07\xa7\x6a\x4a\x3e\xe9\x54\x15\xbc\xd2\xc1\x59\x1d\x8c\x55\x77\x0e\xaa\x15\x50\xe1\x48\x87\xa7\x6a\x02\x8f\xcf\x74\x76\x15\x96\x3a\x3c\x55\x45\x8b\x02\xaf\xa9\x83\xe1\xa0\x06\x58\x15\xd9\xb1\x23\xb7\xed\x48\x0d\x8a\x2a\xb2\x6b\x47\xee\xd8\x91\xbb\x06\xf4\x54\xe4\xbe\x1d\x89\xec\x48\x6c\x47\x6a\x18\x55\x91\x07\x76\xe4\xc4\x8e\x4c\xed\x08\x37\xc0\xbc\x18\x0c\x87\x03\x2b\x32\x98\x19\xd8\x56\x5f\x86\x76\x64\xc7\x40\xb2\x8a\xdc\xb6\x23\x77\xed\xc8\x7d\x3b\x12\xd9\x91\x5d\x03\xde\x2a\x72\xc7\x8e\xdc\xb3\x23\x0f\xec\xc8\x89\x1d\x51\xc3\x7e\x66\x22\xdc\x8a\xec\x0c\xec\xc8\x8e\x9d\x4d\x0d\xfb\xd4\x44\x66\x56\x64\x67\x68\x47\x76\xed\x88\x1a\xdc\x73\x13\xb9\x6b\x47\x54\xaf\xcf\x4c\xe4\x9e\x1d\xb9\x6f\xf6\xa3\x8a\x44\x76\x24\xb6\x23\xdc\x8a\xec\x0e\xec\x2f\x0f\xcc\x26\x55\x91\x13\x3b\x32\xb5\x23\x33\x2b\xb2\x3b\xb4\x23\xaa\xd7\x2f\x4c\x44\x75\xf4\x8b\x89\xa8\x21\xfc\x65\x22\xaa\xd7\x5f\x4d\xe4\xbe\x1d\x51\x3d\x78\x69\x22\x27\x76\x64\x6a\x47\x66\x56\xe4\xf6\xd0\xfe\xa2\x86\x9d\x9a\x48\x6c\x47\xb8\x15\xb9\x3d\xb0\x23\x3b\x76\x64\xd7\x60\x27\x15\xb9\x63\x47\xee\xd9\x91\xc8\x8e\xdc\x36\x68\x4c\x45\xee\xda\x91\xfb\x76\xe4\xc4\x8e\xc4\x06\x71\xa9\x08\xb7\x22\x77\x06\xf6\x97\xa9\xc1\x4e\x2a\x32\xb3\x22\x77\x86\x76\x44\xf5\xe0\x9d\x89\xdc\xb5\x23\xf7\xed\xc8\x9d\x9a\xdd\x35\x18\xde\xb9\x67\x47\x1e\xd8\x11\x35\xb8\xf7\x26\x12\xdb\x11\x6e\x45\xee\x0e\xec\x2f\x6a\x70\x06\x23\xdd\x99\xda\x91\x99\x15\xb9\x3b\xb4\x23\x6a\xe2\x8f\x4d\xe4\xb6\x1d\xb9\x6b\x47\xd4\x92\x48\x13\xb9\x63\x47\xee\xd9\x91\xfb\x06\x39\xab\x48\x64\x47\x62\x3b\xc2\xad\xc8\xbd\x81\x1d\xd9\xb1\xb3\xd5\xf8\x5d\x45\x4e\xec\xc8\xd4\x8e\xcc\xac\xc8\xbd\xa1\x1d\xd9\xb5\x23\x6a\x70\x1f\x4d\x44\x0d\xe1\xbb\x89\xdc\x35\x67\x83\x8a\xdc\x33\x47\x82\x8a\xdc\xb7\xbf\xa8\xee\x7c\x36\x91\x13\x3b\x32\xb5\x23\x6a\xd8\x3f\x4c\x24\xb6\x23\xdc\x8a\xec\xaa\x91\x1e\xd6\x1b\x55\xf5\x34\x31\x3b\xf5\x0e\x1e\xc4\x06\xdf\xdd\xc1\x93\xd4\xc4\x6e\xab\x5e\xfc\x61\x40\xf8\x9e\x5e\xd8\x25\x85\x7f\x2a\xe2\xc9\x75\x3c\xc7\x8d\xce\xe7\x23\x07\x9c\x3d\x15\x4e\xa5\x0a\xee\xab\xe0\xa9\x0a\xfe\xe1\xfc\xe1\x39\xee\xb7\x45\x8e\xe9\x7f\xa8\xf4\xff\x6f\xf7\xc1\xc8\x59\x5a\x57\x4c\x2e\x1a\xf2\xd6\x19\x8f\x9d\x6e\x86\xb7\x8c\x46\x47\xde\xfa\xbe\x75\x8b\x6b\x13\x00\x5b\xd3\x4b\x88\x46\x7f\xb1\x37\x04\x61\xe8\xf2\x7e\x91\xfc\x68\xee\xd0\xbc\x3f\xcb\xc5\x93\x28\x3e\x23\xd6\x1d\x23\xa3\xd7\x22\xe8\x76\x65\xc8\x82\x0c\x78\xd8\xbe\x56\x64\xa2\x45\x11\xd7\xc5\x84\x4d\x79\x13\x41\x6d\xe2\x3b\x11\x3f\x25\x92\x7f\xca\x0f\x22\x11\x43\x13\x00\xf5\x93\x52\xd7\xc5\x5b\x3b\x4b\xa1\x62\x0e\x89\x4d\xcc\xa1\xfc\xbf\x1e\x7b\x3d\x72\xde\x1e\x75\x64\x4f\x37\xce\xbd\x6f\x17\x32\x03\x93\xec\x0b\xef\xa7\x51\x21\x0f\xb3\x29\xbf\x64\x83\xd1\x97\x7a\x65\x46\xb4\xdb\x95\xa6\x69\xb9\x24\x9c\x7a\xdf\xda\x2b\x96\xfe\xbc\x8d\xba\xd7\xe7\xc8\x09\xfe\xc2\x69\x59\x06\x21\x56\xb4\x31\x5b\x31\x4f\x13\x49\xd4\x9d\xa9\xd5\x0a\x5e\xac\xac\x0e\xd7\x77\x0c\xa9\xee\x18\xc2\xf4\xb7\x1f\x9f\x45\xe2\x40\x12\x69\xeb\x2c\x4b\xbc\x24\x2c\x44\x05\xe7\x08\xe3\x9e\xe3\x3a\xa0\x61\xdc\x73\xf6\x54\xf0\x14\x83\xfb\x2a\xa8\x61\xdc\xfb\xc3\xf9\x03\x2a\x18\xf7\x9c\x3f\xd4\x5e\x29\x04\x6b\x40\xdd\xa8\x8f\xaa\x1b\x2a\x91\xcc\x5c\xac\x63\xe9\x15\xa2\x5f\x69\xe8\x17\x24\x96\x15\xef\x9f\x50\x90\x50\x88\xfe\x3c\x89\xbf\x92\x58\xc2\x3f\x9c\x52\xda\xc7\x25\x06\xc1\x99\xec\x23\xe3\xfb\x48\x85\x50\x94\x05\x07\x2a\x68\xc4\x02\xf0\x5a\xc5\x5e\x45\xf2\x0c\xce\x55\x48\xd7\x09\x4f\x54\xb8\x62\x88\x3f\x52\x61\x2d\x1b\x83\xcf\x2a\x5c\x4b\xc5\xe0\x1d\x67\x96\xb2\x2d\xbc\xe7\xec\xdc\xd6\xb4\x3f\xe1\x4c\x06\xce\x64\x12\xe7\x82\xf7\xbe\x14\x93\xe2\x2c\x12\xa8\x2f\x18\xc2\x21\x67\x07\x7c\x83\xc1\x11\xbc\xe4\xec\xfd\xaa\x0a\x39\xbc\xe1\x6c\x00\x57\x9c\x11\x81\x7a\x42\x61\xf7\xd6\x76\x9f\x5f\xf2\x98\x9c\x70\xd7\x3d\xe1\xfd\xaf\xfc\xaa\xa8\x03\xfd\xc3\x27\x93\x37\xef\x5e\x1f\xbf\x2e\x4b\xc7\xa1\xd4\xaf\xc4\x79\xa4\x10\x31\x9d\x0c\xfb\x4e\x57\x78\x0e\xaa\x05\xbc\xb7\x9a\xfd\xca\xd9\x61\xc5\x49\x3f\xe7\x14\x1e\x73\x16\xcb\xfe\x04\xbe\x73\xf6\x84\x13\xe7\x3f\x4e\xd7\x7c\x7d\xc9\x9b\x4b\xf8\x3f\xe0\x8c\xc7\xb7\x5c\xa7\x49\xd9\x6e\x77\xbc\xac\xf7\x12\xed\xff\xe9\xa3\x78\x76\x4c\x68\xb9\x35\xcb\xc5\x56\xbf\x5b\x25\x84\x74\xfb\x14\x9c\x5b\xc3\xfe\x9f\xbe\x43\xbb\xce\x2d\x87\xc2\x25\x67\x73\xe9\xcb\xbe\x16\x63\x78\x09\x3c\xc3\x35\xc0\x71\xc0\xdf\x2a\xdc\x48\x23\xe1\x03\x67\x97\xdc\xbf\xe4\xfd\x28\x4d\xf3\xf8\x43\x56\x44\x33\xee\x25\xf0\x8a\xb3\x4c\x90\x73\xbe\xa2\x7a\x0a\x6a\x78\x4f\x71\xa1\xb4\x86\x3b\xbc\xc5\x99\x98\x57\x5d\x3e\x2c\x9e\xd4\x46\x2f\xf0\x9c\xb3\x77\x7a\xeb\xc4\x1c\x7e\x70\xf6\x8c\xfb\xcf\x78\x3f\x29\x1e\xe5\x59\x1c\xc9\xf7\x68\x18\x85\x3a\xeb\x09\x7c\xac\xbf\x56\x06\x4d\x5e\x02\x5f\x4c\x9a\x99\xe6\xe3\xe8\xd4\x4b\xe0\x16\x5f\x95\x10\xa1\x51\x22\xcb\x73\x72\xce\xc1\x69\xab\xc9\x5b\xba\xbb\xe4\x7a\x09\x8e\x03\xd7\x68\x82\xa1\x05\x40\x6f\xf2\x4a\x02\x94\x49\x26\xfb\xb6\x5c\xb5\xc3\xd4\x0a\xda\x29\xae\xdb\x8e\x43\x24\x99\xe0\xb8\xc9\xb3\xfc\xbb\xce\xaf\xf6\x8a\x8a\x99\x54\x48\x55\xbd\x8d\x28\x56\xe7\x6a\xe2\xaa\xce\x26\x06\x0b\xc9\x5e\xf3\x7e\xcc\x93\x14\x0a\x0c\xce\xd2\x3c\x17\x30\x93\x4c\xaf\x83\x05\x1a\x7a\x31\x51\x5c\xa6\x57\x2f\x29\xea\xd5\xfe\xa6\x1a\x35\x52\x61\x78\x25\xd5\x22\x7c\xc9\x93\x0c\xe6\xa2\x5a\x53\x05\xe7\xb8\x92\x33\xa1\x9a\x39\x8f\x2e\x61\xaa\x43\x49\x06\xc7\x82\x55\xbd\x9f\x08\x26\xfb\xb5\x4c\xf2\x14\x73\x88\x28\x9b\xe6\xe7\x70\x26\x54\xad\x82\x5f\x70\x51\x70\xb8\x10\x6a\xf6\xa5\x25\x9b\xa7\x70\x64\xd2\x5e\x45\x73\x87\xc2\x81\x89\x1a\xf9\x39\x85\xd7\x26\xe9\x3d\x97\x0e\x85\x73\x13\x35\xd2\x6e\x0a\x4f\x84\x59\x55\x0d\x6c\x0e\x85\x47\x82\x9d\x0b\xd7\xcd\xf8\xf7\xad\x73\x01\x9f\x05\xbb\x5e\xc2\x3b\xc1\x1e\xe7\xe4\x42\x50\x78\x8f\xa1\x23\x41\xe1\x04\x43\x07\x82\xc2\x21\x86\x5e\x0b\x0a\x2f\x31\x74\x2e\x28\xbc\x11\x15\x68\xd5\x28\xc4\x4b\xe0\x4a\xb0\x37\xc2\x7f\x23\x8c\xd6\xbf\x9a\x4a\x93\x64\x40\xd0\x4b\x2c\xc6\xb5\xa8\xd4\xcf\x1f\x46\x84\x53\xd7\xed\xbc\xaa\x7e\xdb\x86\x68\xcf\x04\xc5\x5c\xad\xc4\x4b\xd1\x18\x5d\x25\x33\xf2\x92\x1b\x3b\x17\x67\x32\xa9\x94\xfd\x26\x13\xa7\x66\xd7\x7e\xcf\x89\x25\x26\xe3\xdf\xb7\x2e\x55\xdb\x78\x80\x3c\x16\xf6\x76\xb0\xce\x01\x7a\xbd\xdc\xc0\xd0\x4b\x66\xa4\x73\x2b\x22\x35\x27\xf8\x7a\xa9\xda\x7f\x5a\xdb\x80\x3d\x55\x07\x48\xcb\xa0\x45\x56\x56\x61\xaa\x59\xde\x1c\xf7\x4d\x86\x04\x04\x9a\x36\x34\xcc\x71\xa1\x1a\x6f\x78\xd5\x15\xc1\x22\xcf\x92\xa2\x6f\x0d\x8f\x71\xa8\x92\x22\xcc\x58\x4c\x26\x2c\x08\x4d\x5a\x7c\x16\x25\xd9\x64\xc2\x3a\x1d\x69\x92\x12\x45\x07\x4c\x26\x6c\x60\x12\x70\xa1\x54\x31\x4b\xac\xf3\x0c\x57\xe5\xdf\xb5\x35\x4d\xc4\x64\xc2\x86\x26\x3a\x4b\x52\xc9\xf1\xa8\x61\x9d\x3a\x51\x23\x26\xce\xdb\x25\x65\xf4\x95\x3f\xca\x17\x99\x9c\x4c\xd8\xbc\xee\x56\xc2\xbf\xeb\x6c\x16\x07\x7d\x95\x8a\xba\x41\x68\x83\x55\x20\x9e\x21\x74\xd4\xed\xca\x3d\x31\x32\xc6\x5c\x3c\x90\xe1\x08\xbf\x17\x5c\x92\x2c\x18\x84\x90\x05\xc3\xd0\xa6\x0d\x3f\xfc\x3f\x69\xe5\xd5\xff\x93\x56\x9e\xfe\x9b\x56\x26\x93\x69\x24\xa3\xc9\x04\xa1\xf4\x95\x30\xad\xe1\xb7\x68\x3a\x25\xaa\x3d\x8b\x6e\x7b\x6b\xd5\xbd\x5e\x1e\x67\xb1\xea\x5d\xf2\x43\x9d\x97\xea\xc7\xe2\xd5\x0b\x5b\x1a\x82\xbb\x1e\x32\xd6\x11\xae\xfb\x01\xc3\x09\x86\x3b\x99\xeb\xfe\xc0\x78\x5e\xc7\x3b\x89\xeb\x46\xa9\x4a\x8b\x98\x28\xcb\xac\x2c\x93\xb2\xcc\x21\x65\x91\xff\x5c\xd1\x89\x15\x09\xff\x88\x53\x2f\x08\x21\x66\xa9\x3d\x50\x24\x17\xb7\x92\x6c\x8b\x53\x22\xcb\xb2\xc1\x19\x0b\xaa\x48\xf9\x4e\x54\x96\x9d\x5a\xc0\xc6\xd8\xa2\x2c\x13\x34\xe1\x99\xcd\x0a\xb4\x97\x5e\x94\xa5\x33\x8f\x04\xcf\x30\x42\xcb\x32\x57\x9f\x4f\xb4\x5e\x95\xfe\x7c\x72\x25\xf9\x4b\xab\x02\x4c\x78\x5d\x57\x40\xcb\x72\x96\x93\x05\xc4\x54\xb5\x98\x6a\x9b\x91\x45\x7d\xc4\xa6\x96\x2c\xc2\x9a\xe0\x55\x21\x91\xf4\x79\xf0\x34\x23\x03\x90\xbd\x21\x0d\x3d\x6b\xef\x7e\x6c\x5f\x87\x5e\xe6\xe4\x49\xa2\x26\x4b\x66\x44\xc2\x00\x6a\x61\xb4\xb5\x92\x9f\x6c\x3a\xdf\x14\xb0\x65\x0e\xc2\x08\xe3\x88\xd0\xb2\x98\xce\x65\x84\xe0\x00\x82\x96\x25\x4a\x65\x14\xca\x96\x7a\x62\xa9\xeb\xfe\x63\x4a\x58\x72\x09\xd1\x36\xab\x44\xe8\x25\x9d\x66\x05\x24\x2d\x4b\x55\x6f\xf6\x2f\x2a\xfd\x6b\xed\x1e\x67\x4b\x28\x50\x6c\x87\x3d\x15\xa1\xda\x1d\x8d\xe8\x4e\x6c\x10\xdd\xdd\x12\x8d\x38\xd0\x2c\x46\xb6\x41\xd6\x25\x49\x06\x1c\x04\x02\x25\x6d\x0b\x4d\x1f\xb6\xe7\x9e\xbb\xee\xa3\x84\x48\x38\x49\x89\x44\x1d\x8d\x3a\x63\x3d\x94\x6b\xa7\x36\x54\x72\x50\x02\x72\x8b\xfb\xb7\x38\x7e\xbc\x5e\x31\x63\x84\xc6\x14\x5a\xc5\xb4\xe1\xa3\xb0\x0d\x1f\x97\x14\x05\x78\xcc\xba\x26\xf2\x6c\xc3\x45\x37\x6f\x04\xf4\x11\xcb\x48\x4e\x21\x35\x88\x01\x2f\xbc\xf9\x88\x46\x78\xa7\xf5\x13\xef\x09\x2e\x4d\x20\xc2\x1a\x42\x23\xeb\xce\x9f\xad\x48\x70\x39\x63\xdc\x75\x0d\x94\x10\xce\xf8\x1e\x13\x68\xdd\x0a\xb2\x49\xdb\x67\xd2\xe7\x9e\xa4\x2d\x3b\x5e\x91\xd5\xb2\xc6\x1c\x22\x0d\x25\x29\xc4\x6c\xe8\x4a\x58\xb0\x1d\x57\x42\xc1\x6e\xbb\x68\x1b\x27\x5c\x97\xa4\x2c\xf7\xd5\x24\xea\xdc\x9e\x5a\x0e\x0a\xa9\x6a\xc3\xac\x71\x3a\xaa\xce\xe9\x46\x0a\xad\x8d\xb3\xe7\x1a\xdd\xa8\xcf\x73\x3c\xcc\x53\x66\xdf\x57\xdb\x1b\x0e\xaa\x43\xdb\xb6\x1f\x24\x8d\x71\xaf\x74\xdd\x75\x0f\x0f\xc1\x20\x74\x5d\x8b\x1c\xc1\x33\xd7\x51\xf8\x45\xf4\x31\xcc\xb8\xfe\x05\x15\x9f\x2f\x24\xc6\xe7\x0b\xa9\x6e\xf8\x0a\xae\x3a\xb1\xe9\xb1\xda\x8a\x90\x6a\x73\x44\xec\xd9\x8c\xc5\x8a\x8e\x81\x63\x36\x63\xec\xa2\x2c\x67\x8c\x1d\xa9\x91\xfc\xb0\xc7\x79\xa6\x4a\xc5\x38\xc2\x19\x63\xe7\x98\x6b\x5a\x96\xc7\xae\xdb\xc9\xab\x11\x2f\xca\xf2\xd8\xbf\x5e\x7a\x45\xde\x6e\x70\xe1\x6f\x34\x4f\x7d\x84\xfd\xc0\xbc\xe8\xc7\x01\x36\x1b\xb1\x56\x00\x7f\x68\x00\x9e\xa4\xc0\xe9\x0d\x16\xaf\x58\x65\x64\x55\xf9\x50\xe8\xec\x7a\xb0\x6a\xf1\x84\x0c\x66\xb5\xeb\x8d\xdc\xe7\xde\xf5\x72\x94\xb2\xcd\x66\xda\xad\x15\x1a\x55\x8a\x60\xb2\xd2\x00\x3b\x34\xaa\x5a\x17\x0a\xb5\x69\xf5\xad\x89\x87\x3f\xa7\x9e\x45\x12\x66\xa4\x6b\x3e\xbf\xf4\xd6\xec\x24\x9b\xf3\x4a\xfa\xaa\xa2\xbe\xc6\xfb\xd4\x33\xa1\x91\x55\x55\x1b\x62\x04\xf0\x7e\x73\x0e\x54\x11\x7d\x4a\xe0\xd8\x45\xd5\xea\x1b\xdd\xa9\x2b\xfd\xf3\x4d\xff\x7c\xd5\x3f\x8f\xf5\xcf\x77\xfd\x73\xa9\x7f\x9e\xe9\x9f\xbf\x4d\x6f\x8f\x12\xab\xb6\x83\xd6\xd8\x74\xda\x6b\x5d\xe0\x5d\x7b\xd8\x66\xd4\x8f\xd6\x47\x6d\x76\xc4\xfa\xa0\x78\x65\xab\x03\x05\xd7\xbc\x00\x4e\x9b\x8d\x61\x71\x9d\x2c\x0e\x14\x20\xa3\x49\xb7\xf5\x79\x43\xef\xde\x6f\x6a\xbf\x4a\xba\x12\xfe\x39\x27\x57\xc6\x5d\x02\xa5\x9e\xba\x78\x72\xba\x44\x78\x84\x98\x2e\x97\x51\x59\x92\x08\x7b\xfa\x56\x68\xcf\x2a\x67\x2c\x52\xd7\xbe\x6a\xbf\x9f\xd5\x3b\x64\x14\x21\xd5\xa4\x36\x17\x64\xaa\x36\x7f\x03\xf7\x2d\xa3\xd7\x29\x92\x3e\x22\x23\x59\x85\x9c\x38\x44\x94\x2e\xa9\xf7\x8f\xbe\xa8\x6c\x2a\x05\x89\x2a\xa7\xaa\x4f\xa0\x2e\x99\x98\x92\xd8\xad\x27\x6c\xee\x27\x1e\x29\xfc\x85\xff\x30\xf1\x6e\x25\xde\xc2\x3f\x4c\xbd\x93\x94\x92\x86\x1d\x78\x2e\xc9\x93\xb2\xb4\xb6\x1a\x56\xfc\xc4\x75\x89\x3a\x3d\x13\x96\x85\x14\xbe\xa8\x3d\xb3\xa9\x15\xb0\x08\x89\x6c\x65\xab\x18\xf5\x48\x74\x69\xa0\xf1\xbe\x51\x38\xca\x90\x4a\xe2\xec\x9c\xab\x8e\x64\xea\x0c\xc5\x42\x39\x13\x41\x16\x42\xc4\x78\x90\xa3\x1b\x8b\xc8\x9c\xcf\xb9\x3e\x9f\x15\xdd\x34\x00\x19\xe4\x21\x25\x51\xa3\x95\xb7\x5c\xd7\xca\x6b\x36\xee\x66\xf7\x02\xb6\xfd\xf1\x67\x4e\xf2\x7a\x3e\xde\xe5\xb6\xad\xac\x51\xaa\x4c\x14\x41\xd0\x32\x94\x8f\xb2\x8d\x4a\x64\xef\x24\x44\xac\x33\x80\xb4\xc1\xed\xb1\xba\x85\x2c\xea\xd3\x10\x0f\x8c\xd4\x80\x48\x3c\x12\xe8\xda\x05\x35\x33\x3e\x22\x07\x99\x42\xe6\x93\x9c\xbd\xc7\x9a\x86\xd4\x33\x05\xf7\xd9\xce\x60\xe0\xba\x24\x67\x2f\xf4\x27\xd0\xdb\xe5\xa9\x40\x76\x25\xf7\xd0\x4d\x43\xb7\x9b\xec\xa5\xd5\x7c\x16\xa8\xc2\x09\xf3\xea\xdc\x15\x7e\xe1\x09\x52\x20\x8c\x16\x2c\x2b\xcb\x41\x87\xb1\xc2\x2f\xbc\x01\x44\xae\x3b\x67\x6c\xde\x1c\xe1\x33\xb6\x18\xcd\x2a\xe2\x46\xe1\x47\xa6\xbe\xc6\x79\x26\x93\x6c\xc1\xb7\xf8\x28\xd6\x24\x65\x51\xd9\xb0\xe7\x44\xc2\x1c\x32\x5a\x96\xcd\x07\x33\xc2\xe5\x57\xd1\x97\xfc\x7c\x9e\x46\x92\xbf\xe7\x52\x26\xd9\x69\xc1\xae\x79\x11\x47\x73\xee\x7d\x02\xae\x68\x8c\x48\x72\xef\x05\x24\x99\xe4\x62\x9e\xab\x8c\xde\x17\xb8\x88\x44\x82\x34\x87\xe3\x40\x72\x8e\xba\xc8\xde\xf5\xc4\xfb\x2a\x96\x4b\x20\x5f\x85\x75\xaf\xfd\x6e\x45\x5a\x36\xf8\xec\xab\x00\x72\x69\x67\x7d\x2c\x48\x2b\x77\x3b\xfb\xa5\x00\xf2\xec\xf7\xb3\x3f\x13\xf0\xb7\xf5\x55\xdf\xa0\x5a\x3c\xaf\xd6\x8d\xe5\x89\xf0\x9f\x08\xdc\x0b\x0a\xa9\x40\x73\x6d\x19\x2c\xdb\xf5\x4c\x79\xca\x25\xdf\x40\x2f\x60\x91\xb3\xa8\x40\xa4\xa0\x73\x6d\xb5\xda\x08\x78\xad\xf0\x58\x57\xdf\x63\xd2\x1f\x7a\x03\x90\x2b\xad\x9c\x72\x79\x53\x13\xa6\x3a\x05\x29\x4f\x44\x7d\x1e\x59\xb5\x2b\xca\x39\xf2\x13\x4f\x98\x65\x7e\x59\xeb\x27\x73\xea\xab\x9c\x5e\xb2\xd2\xde\x59\x54\xfc\xb2\x3d\x43\x90\x08\xac\x42\x11\x5a\x9e\x5d\xf1\x4a\x8d\x45\x6b\x04\xd6\xc1\xb9\xa9\xce\x7a\x3e\xba\xf6\x34\xfa\x03\x6f\x08\x22\xe0\x21\x7b\x22\x5c\x57\x56\xaa\x5f\x9a\x91\xb1\x84\x0f\xff\x62\x75\x0d\xab\xc1\xac\xe8\x87\xdf\x5f\x51\x53\x07\x08\xf6\x17\x2a\xdc\x1a\x6c\xd4\x21\x62\x6f\x50\x96\x44\xb0\x1a\x7d\xf4\x86\xbe\xec\xcf\xf3\x39\xa1\xde\xf3\x46\x25\x1c\x86\x14\x7a\xbd\xba\x7d\x18\x50\xba\xd2\x83\xdf\x58\xed\xb5\xe6\xb7\xc4\xde\x00\x15\xfd\x44\x18\x0c\xc3\x95\x0a\x57\x97\xb3\x2a\xf2\xd7\xca\x3d\x1f\x38\xaa\x21\xb7\xcb\xfe\xd6\xc2\x41\xa6\xba\x63\xeb\x04\x67\x7b\x03\x9f\x74\xbb\xcd\x30\x45\xe5\x0c\x81\x83\x0c\x29\xf5\xd4\xe9\x11\x0c\x43\x66\x96\xef\xd5\xaf\x97\x4f\xaf\x16\xb4\x97\xf2\xfa\x2c\x2a\xce\x3c\x85\x5b\xff\x16\x70\x1e\xcd\x55\x90\x1c\x89\xb2\xfc\x20\x28\x68\x42\xbc\xfa\xba\x5c\x69\xe4\xc6\x75\xce\x72\xed\xc3\x83\xd3\x2a\x8f\x75\x04\x6f\xda\xa9\xaf\x7e\xb6\x76\x66\x3a\x9a\x3a\x35\xf1\xb1\x52\xec\x86\x15\xb2\x8a\xe9\x3d\xb0\x52\xec\xa6\xc5\x69\xca\x81\x3a\xdd\x55\x87\x6b\x38\xa9\xc8\x1c\x49\xc1\xda\x66\x3a\x0f\x63\x19\x6e\x32\xbd\x24\x4f\xed\x96\xa2\xe9\x94\xb5\x12\xd4\x6a\x6e\xea\x72\x6b\x79\xaa\xb6\x22\xba\xa9\xca\x1b\xc6\xdc\xae\xc0\x0c\xfb\xed\xbf\xd8\xde\x9a\xdd\xd4\xde\xe2\x6f\xff\xab\x2d\x2e\x7f\x02\x01\x15\x07\x0b\xc4\x4a\xe5\x37\x40\x40\x7b\x58\x06\x08\xde\xfe\xef\x4c\xc8\xef\x61\x57\x75\x53\xb6\xf9\xe5\x1f\x2c\x02\xd0\xce\xd4\x51\xfb\x27\x33\xce\xa8\x86\x0f\x1e\xd4\x7a\xd4\xf6\x1e\xb6\xe6\xb7\xdb\xd5\xf0\x83\x49\x23\xb1\x81\xfb\xf7\x4a\x90\xac\xd1\xd0\xdd\x00\x82\xcc\xaa\x61\x89\x14\x71\x9a\xb1\xf7\x09\x99\x64\x14\x62\x0c\x9d\x66\xd0\x19\x58\x0c\xf1\x45\x6b\xa4\xb5\x66\xfc\x1a\x8f\xc6\x56\x55\x16\xac\xd3\x91\x55\x5a\x5b\x7c\x5e\x6c\xd0\x2f\xff\x99\x2e\x32\x57\xd4\x6f\xca\x24\x89\xa8\xa1\x9a\x3b\x2c\x75\x5d\x12\xe3\xb9\x94\x32\x15\xe9\xe4\x29\x49\xa9\xa7\x48\xf2\x98\x52\xaa\x4a\xc6\x2c\x85\x05\x8b\xcc\x54\x2c\x2c\x2f\x41\xad\xf1\x04\xe1\x4f\xc7\x63\x06\xe1\xba\x15\x5e\xe5\x2b\xe3\x99\x65\xb6\xa6\xb6\xa6\xd8\x7b\x43\x45\xaf\xdb\xdc\x4f\x81\x07\xd6\x3c\xa7\x90\x94\x25\x49\x58\x80\x36\x13\xf9\x5e\x54\x8d\x33\xd5\xe4\xbd\xdc\x1f\xb8\xae\x20\x29\xf5\xe5\xfe\xd0\x9f\x65\x24\x05\xd9\x1b\x56\x95\x7b\x87\xea\x5a\x93\x52\x2f\x53\x55\x04\x49\x55\x7f\xc8\xd2\x7a\xc1\x13\x14\xaa\x4c\x33\x76\x92\x10\x0a\xc7\xf8\xdb\x5a\xcb\xc9\x1a\xdb\x60\xaa\xfb\x7f\x92\x5a\x74\xfc\xe9\x5a\xae\xe3\x0d\xb9\xce\xda\xb9\x3e\xdf\xa0\x47\xfd\x22\xaa\xf8\xd7\x56\xd1\x8b\x35\xe6\xd8\x40\x0b\xfc\xa7\x09\x9e\xb5\xd4\xcc\x5d\xe5\x12\xd4\x75\xb5\x09\x0b\xe3\xc1\xd7\x9c\xc8\x40\x74\xbb\x21\x6d\xe8\x2e\xd7\x15\x0a\xa3\x72\x9b\x1b\x7b\xb4\x72\xf5\x92\x16\x6a\x41\x2e\x94\x9f\xa9\x09\xcd\x90\x9f\x68\x75\xed\xa0\x75\x2c\x54\x4c\x7b\x8e\xb0\xd6\x78\x36\x31\xee\x7f\x42\xc7\xb3\xfc\xd0\xa4\x69\xe8\x78\x5f\xb8\xeb\x7e\xe1\xea\x6a\x86\x37\x39\x7f\x1d\xf7\x35\xfc\xa9\x2f\x9c\x82\x60\x3c\xf8\xc2\x43\xf4\xe4\x85\x21\x96\x68\x4b\x4d\x56\x7b\xe1\x8a\xe8\xf5\x52\x03\xd6\x37\x53\xb4\x39\xfe\xd5\x4d\xc9\xd7\x05\x85\x57\x91\xbf\x18\xa5\x90\xdf\xa4\x11\xd2\x54\xd3\x56\x08\x79\xbd\xb2\xee\xfb\xd2\xb2\x69\x6b\x7f\xab\x17\xc6\x66\x23\x5b\xb6\x6a\x37\xe4\x96\xf5\xc4\x58\x86\x68\x6b\x18\x21\x67\xc2\x7f\x2f\x3d\xbc\x37\xf2\x60\x10\x9a\x5b\x63\xeb\x02\xa9\xb6\x77\x46\x52\x0a\x05\xfa\x57\x9a\xab\x9d\x1c\xd7\xd7\xe6\x19\xe3\x41\x1c\x8e\x62\xd7\x95\xae\x4b\x66\xea\x2e\x39\x53\x77\x49\xa9\xee\x92\x05\x9b\x0a\x32\x33\x55\x15\x14\x16\x41\x1c\xa2\x98\x83\xc8\xb2\x8c\xf6\xd9\x70\x67\xe0\xba\xb3\xfa\x8e\x39\xdc\x19\x50\xbf\xba\x56\xc6\xae\x3b\xa3\x0a\xd0\xb0\x67\xb8\x54\x53\xb5\xe1\x8f\xd9\x42\xc5\xeb\x1b\xe7\x74\x4f\xdd\x1f\x0d\x6e\x2f\xaa\x6e\x4d\xd8\x2c\x98\x86\x70\xca\xa4\x2f\xc9\x84\x7a\x78\x0c\x4c\x98\xd0\xf7\xce\x89\x3f\xf1\x06\xd0\x21\xc7\xfe\x0b\x49\x8e\xe1\x94\x7a\x39\x99\xc3\x29\xa8\x0b\x30\x4e\x4e\xcc\xd2\x51\xaf\x17\x57\x95\x9d\x31\xd5\x6f\x3c\x48\xc8\x99\x2a\x72\xa6\x8b\xa8\x91\x57\xa5\x9a\xdb\xe9\xf2\xd8\x75\x8f\x35\x0a\x3b\xa5\x30\xd7\xa1\x09\x5d\x1a\xd4\x31\xb7\xac\xf7\x56\xb6\x8e\xde\x05\x84\xb3\xf3\x5c\x7d\xa8\x37\x29\xf5\xb9\x87\x1b\xf2\x53\xae\xe6\xb5\x71\xaa\x8a\xf9\x33\x3f\xf1\x0e\x2a\x96\xbd\xb5\xda\xef\x6c\x40\xac\x64\xcf\xb8\xe7\x18\x9b\x5a\x86\x79\x16\x4f\xda\xe6\x71\x33\x59\x96\x8d\x81\x5f\xed\x14\xb6\x63\x84\xd8\x0f\x23\x22\xa9\xcf\x35\xac\x75\x98\x5c\xf1\x02\xd6\x62\x71\x57\xb2\xaf\x58\xfd\x4a\x0a\x0b\x96\xfa\xc7\x9e\xe6\xf1\x16\x2c\xd6\x61\x49\x61\xce\xc8\x82\x2d\x18\x9b\xfa\xe7\xde\x82\x32\x76\x0e\x33\x46\x0a\x56\xe8\x94\x02\x53\x2e\x54\x86\x02\xbd\xc7\x55\x62\x33\x2d\xab\xfe\x61\xc9\xaa\x3b\xc3\x51\xca\x3a\x0a\x50\x3b\xc3\xa5\xce\xd9\x99\x9b\x03\xbf\xc5\x3e\x83\xb4\x2c\x51\xce\xe6\x7f\x49\x5a\xfd\x5e\x1f\x4d\xa2\xc7\x63\xac\x6f\x2b\xa6\xeb\x4b\x2f\x99\x11\x9b\xd3\xd9\x61\xd2\x8a\x95\xa5\xcd\x12\x35\xdf\x74\xac\xe9\x2c\x67\x86\xb9\x0a\x52\x65\xd1\x7c\xd6\x16\x53\xb7\xf3\xd3\x46\x3a\x39\xc1\x0b\x01\x47\x09\xa3\x0e\xa9\xed\xb7\xc2\x04\xae\x78\xa3\xd5\x44\x5c\x46\xa4\xcb\xa1\x6b\x0c\x85\xcf\x1a\x4b\xdf\x2c\x3a\xe7\xea\xca\xa7\x7e\x5d\x97\xf7\xcf\x79\x51\x44\xa7\x98\x54\x05\x0d\x23\xb5\xcd\x66\x55\x39\xba\x8e\x63\xf8\xb2\x7a\xe9\x85\x30\x9c\xd0\x64\x46\xd2\xb2\x24\x29\xcb\x05\x05\xad\x16\xd8\xa9\x28\x4e\xd7\xed\x90\xa1\x9b\x59\x0b\xa8\x09\x0b\x9b\xaf\x59\xb3\xef\x63\xc6\xe4\x28\x2b\xd9\x0e\x44\x35\xd5\x85\xf9\x17\xec\x4b\x42\x50\x6a\x8a\xbc\x79\xb3\x66\xb5\x50\xa7\xa1\x7c\x61\x61\x58\xb1\xc9\x8c\x5c\xd5\x3a\x16\x0d\xdf\x95\x31\x13\x96\xe6\xc8\xef\x54\x96\x76\x8b\x1a\x48\x34\x3e\x18\xba\x82\x6a\x38\x3f\x62\xf3\x96\x4c\xa4\xa5\xa2\x01\x4f\xd8\xac\xf9\x2a\x57\xbe\xaa\xaa\x8e\xca\xf2\x89\xae\xe8\x84\x1d\xf9\x95\x53\x49\x42\x3d\x0e\x6f\xd8\x13\x5f\xd6\xf1\x5a\xa1\xb1\x0d\xca\x39\x39\x81\x37\xd8\xb7\xa8\xc6\x35\x9d\xce\x85\xeb\x92\x76\xbe\x9f\xed\xd3\xa1\x2b\x20\x66\xb7\x50\x98\xba\x60\xb1\xc5\x33\x5c\x74\x54\xb2\x34\xe4\x82\xeb\xd6\x4c\xc4\xce\xb0\x96\x3a\x17\x6c\x31\x2a\xea\x83\x61\xce\xe2\xa0\xa8\x90\x66\xea\xcf\xd5\x79\x24\x2d\x7e\xca\x9c\x5a\x2c\x54\x7d\x90\x98\xe5\x86\x69\x15\xd4\x2e\x69\x67\xae\x3b\x35\x4b\x34\x43\x09\xe2\x94\x31\x2d\xe7\x3a\x56\x54\x72\x03\x06\x15\x44\x20\x13\xc1\x74\x6a\xc2\xd2\x51\xb7\x5b\xec\x2d\xaa\x6e\x9d\x32\x1e\xe8\xae\x85\x70\xc6\x64\x30\x0f\xb5\xdb\x5b\xf5\xed\x82\xa5\x7e\xa6\x90\x3b\xcc\x41\x22\x9b\xd9\xcb\xc8\x29\x9c\xc1\x1c\xd4\x6c\x99\x25\xbf\x40\x22\xe5\x94\x31\x76\x56\x96\x39\x66\xd0\xf3\xee\x5d\x50\x7a\x7d\xcc\x3a\xc3\xd1\x89\xe0\xd1\xd7\xe5\xa4\x2c\xc9\x84\x39\x16\xd7\xce\x61\x6c\x4e\x15\x52\x3a\x76\xdd\xce\xc4\xc0\x4d\x4b\xe6\x00\x07\x4c\xb6\x04\x3d\x47\x1d\x76\xe0\xba\xad\x5a\x12\xa4\x15\x57\x93\xa4\xda\x47\x1b\xfc\x6e\x1e\xb9\xee\x91\x7d\x4b\x3a\x72\xdd\x0d\xb9\x0e\x5c\xf7\xc0\xce\x75\x40\x5d\x97\xa8\xc1\xd4\x44\xaf\xbd\x83\xea\xb0\xa4\x70\xbc\x6c\x01\x13\x6d\xa2\xef\xd5\xa9\x62\x9d\x49\x27\x2b\x7c\xeb\xbc\x66\xd4\x43\xc4\x72\x48\x59\x27\xdb\xc0\xb1\x8f\x5a\x1c\xfb\xbc\x86\xb0\x98\x89\x8a\x55\x9f\xba\x6e\x1c\xec\x84\x7e\x1c\x0c\xc3\x0e\x53\x14\x49\x30\x08\x43\xaf\x43\xd4\xaf\x16\xae\xd7\xb0\x56\x91\x0d\xcd\x95\x60\xc1\x88\xae\x89\x06\x83\x10\x0a\xc6\x83\x45\x08\x0a\x44\x86\x76\xdd\x78\xce\x14\x46\x24\x50\x29\x58\x34\xb5\x5a\xd2\x4b\xbd\xd3\x1a\xa8\x9a\xb2\x8c\x14\x30\x87\x05\x02\xd1\xac\x02\xa2\x29\x02\xd1\xfb\x8c\xcc\xa1\x80\x5d\xc8\x60\x46\xbd\xa9\x55\xe1\x06\xb1\xc2\xa1\x75\xa2\x77\x2a\xb9\x6f\xfb\x45\x00\xb3\xed\xaf\xb8\xeb\x5e\x21\x6d\x8c\xbe\x48\xd5\x4a\xbe\x40\x52\xfc\x3b\xf7\xa6\x9c\x6a\x7d\xe3\xc7\x79\x9b\x20\x7f\x69\x55\xb1\x01\x3e\xb8\xcf\xbd\x9a\x4c\x8f\xbd\x35\xaf\x21\xdc\xd7\xd4\xfe\xe3\x8c\x28\x82\x0d\x78\x30\x0c\xa9\xf7\x55\x55\xea\x2d\xe2\x16\x21\xfa\xc6\x78\x64\xed\x5c\xe4\x96\x4c\x77\x8e\x0a\x35\x9a\x76\x0f\xc2\xc6\xcd\x7c\x4d\xca\xd2\x06\xbb\x0a\xba\x02\xff\x1d\x26\xd0\x89\xb2\xa2\xb6\x84\xa5\x3d\x5d\x37\x7a\xb5\x42\x73\xef\x59\xdf\xbe\xb5\x6e\xaa\x68\x84\xfd\x56\x5f\x5d\x6a\x6d\x1b\xea\xfd\xec\x02\x9b\xd3\xeb\x24\xe8\x76\xb5\x37\x01\x8c\x2f\x29\x58\x97\xa4\xaf\xd6\xb5\x24\xc9\xad\x6b\xc5\xb0\x61\xae\xba\xae\x0c\x06\xa1\x02\xe3\x03\x75\xf5\x1a\x68\x85\x0e\xf5\xab\x26\x72\x83\xd2\xbf\x60\x48\x9c\x9d\x64\x68\x8d\xdc\x32\xbd\x7d\xdc\x1e\xec\x24\x47\xaa\xed\x48\xd1\x59\xaa\xf6\xaf\x95\x4c\xba\x55\xab\xa6\x41\x9f\xa4\x6d\xae\xa7\x86\xf8\x0c\x1d\xa7\x3f\xd2\xdf\xbc\xf7\x19\x91\x90\xc1\xae\xdd\xe2\xf7\x16\x21\xc9\x3b\x1a\x51\x67\xf6\x55\x35\x82\x14\x57\x3d\x2f\x4b\x92\xd7\x07\xd2\xad\x88\x44\x94\x76\x36\x9d\x4b\x2a\xbf\xde\xe8\x8f\x72\xed\x48\x7d\xa1\x42\x8a\x62\x86\x82\xa5\x78\x46\x2c\xb4\x44\x89\xa2\x06\x8f\x80\x82\x8e\xea\xad\x38\x67\x91\x1f\x91\x58\x1d\xd9\x5d\xc7\xc1\xdd\x97\x52\x2f\x81\x19\x9b\xab\x51\xe1\xd9\xa2\x1b\x98\x2a\xd2\x74\x41\xe1\x98\x75\xa6\x48\x57\x2e\x28\x4c\x30\xdc\x39\x46\x55\xac\x05\x1d\xcd\xd9\x02\xa6\x65\x79\x5c\x96\x13\x05\xe9\x31\xf5\xe7\x2c\xf6\x9e\x57\xa1\x27\x09\x89\xa9\x77\xec\x93\x19\xeb\x0c\x61\xce\xce\x12\xb2\x80\xce\x80\x52\x6f\x52\xa7\x1d\xd5\x69\xea\x0e\xe5\x49\x55\x6d\x59\x7e\x50\xad\xf9\x64\xce\x62\xf8\x50\x55\x76\x9c\xaa\xca\x70\x87\xc7\xb4\x2c\x5f\xa8\x1f\xb5\x87\xe7\xac\xc8\xc9\x82\x52\xea\xa9\x1a\x97\x33\xd7\x25\x5a\x08\xbb\x80\xb9\xa2\x00\x14\x8e\xc9\x70\xda\x20\x35\xf8\x79\x41\x29\x54\x73\x33\xd7\x72\x64\x09\x29\x08\xf8\x9e\xe1\x4a\x35\xb3\x15\xb3\xcc\xcf\x08\x4e\x74\x4a\x55\x25\x66\xce\x72\xea\x25\xa3\x58\xc3\x01\x89\x59\x54\xd5\x97\xa2\x38\x1a\x0e\x6d\x4e\xc5\x65\x6b\x1f\x71\x8b\x80\xa8\x89\xac\x59\x4e\x64\x97\xc9\xbd\x81\x2f\xbc\x01\x08\xea\xf3\x40\xb6\xb4\xbb\x9e\xd5\x97\x22\x59\x6f\x0d\xbf\x6d\x3b\xde\xdc\x6b\x34\xca\xd9\xc0\x0c\xb9\x50\x90\x37\x54\x1b\xc4\x54\xa1\x90\x92\xc7\xe9\xd2\xe3\x4b\xea\x05\x3c\x0e\x47\x86\x27\x56\x23\x8b\x46\x10\x9a\x13\x75\x7d\x5d\x67\x40\x66\x6d\x6e\x13\xef\x17\xb9\x90\x64\xa3\xf2\xc7\xaa\x0e\xc7\x8a\xe3\x13\xde\x8f\x45\x22\xb9\x48\x22\x54\x56\xaa\x23\x11\x4b\x9a\x5b\xb8\xb0\x59\x75\x51\x7d\xec\x1d\x24\x24\x09\xb2\x10\x72\x74\x1e\x60\x13\xc7\xd9\x3e\x4b\xfd\xd8\x8b\xff\x24\xce\x94\x17\xb1\xc3\x50\xa8\xed\xf7\x86\xde\xd0\xf2\xd5\x83\x9a\x39\x3d\xa9\x7f\x8d\x03\x89\x65\x25\x0c\x47\x57\x13\xea\x9f\xa6\x38\x2d\xa7\xd6\xdf\xb2\x0d\xce\x36\x2a\xfd\x60\xd3\x7f\xef\x26\x2b\x7f\xa9\x19\x7a\xd8\xa4\xd7\xed\x66\x95\x76\x17\x6f\x3f\xd4\xf1\xf7\x4d\xd3\x25\x1b\xb7\x1c\xd7\x4b\xe3\x18\xc3\x78\x51\xd0\x9c\x4b\xe4\x75\x29\x7a\x9f\xa4\x10\x51\xd7\xfd\x94\x91\x1c\xa6\x09\x89\x40\x5d\x09\x36\xd9\x2c\x7d\x58\x13\xa3\x67\xfe\xa5\xf4\xbe\x4b\xa8\x58\x8b\xd2\x62\x88\x54\x44\x08\xe2\x35\x22\xd5\x86\x97\x14\x1f\x79\x20\x29\x43\x1f\x34\x95\x00\xdd\xd0\x16\x66\x00\x31\x1b\xc0\x82\xc9\x20\x57\xb4\x85\xf0\x05\x59\x50\x6f\x31\x22\x31\x4b\x48\x0a\x05\xc4\x90\x51\xed\x5a\x20\xed\xa0\x6a\x99\x11\xac\xa5\x10\xc3\x90\xc2\xf3\xfa\xc8\x53\xd1\x0d\x0e\x65\x5e\xad\xb1\xf8\xb8\x6f\xfa\xed\x0d\x00\x9d\x8a\x68\x55\xc1\x6a\x8c\xe8\x98\x46\x6d\x49\xc6\xb2\xb2\x4c\x3a\x8c\xe5\x86\x1a\x4b\x46\xb3\x9c\x24\xd4\x6f\x1a\x4d\x60\x48\xbd\x5c\xdd\x8e\x93\x86\x85\x61\xb5\xfe\x74\xe5\x54\xed\x16\x92\x9c\x0a\x42\xff\x24\xb2\xc7\xbb\x43\x7b\x6d\xdf\xb6\x90\x83\xe3\x20\x1d\xc4\xcb\x52\xee\x0d\xcb\x52\xee\x17\x8d\xe6\xe2\x34\xbf\x96\xff\xb3\xe3\xba\x44\x74\x19\xa7\x40\x24\x2b\x24\x91\xdb\x3b\x88\x04\xb9\x4a\x5b\x7e\x3f\x4b\x52\x6e\x69\xa9\xd9\x3e\x32\xda\x5d\x7a\x9f\x93\xd7\xc8\x4e\x01\x1e\x53\xe0\xdd\x96\x47\x8b\x1f\x36\x32\xf9\x21\xc8\x65\xda\xa6\x89\x3e\xb6\xfa\x7c\x69\x33\x04\x5f\xe6\x44\x18\x95\x53\xb1\x49\xe5\xd4\x02\xae\x0d\x6a\x7a\x0d\x0b\x0e\x21\x6d\x9d\x25\x0b\x29\x8b\x7a\x43\x88\x19\xaf\x98\xb3\xb1\xeb\xb6\xc9\x56\xe4\xd0\xe6\xa1\x3a\x0b\x91\xdc\x6c\x29\x5a\xa2\x5e\x6e\xfb\xe6\xa1\x55\x7b\xeb\xd7\x20\x54\x42\xcb\xbc\x20\xef\xb0\xb4\xb9\xbb\x2d\xc2\x11\x29\xf0\x4c\x50\xc7\x4a\x4c\xbd\x84\x56\x67\x40\xc1\x6e\x45\x64\x4e\xfd\xb9\x37\xc3\x1e\x74\x87\x21\xf5\x83\xd0\xbb\x5e\xd2\xe5\x17\x81\x07\x6e\x41\x21\xc6\x3a\x1a\x90\x51\xf5\xbe\xc8\xd8\x23\x71\x83\xfa\x9d\x25\x43\xe1\x4b\x8f\xc7\xf0\x25\x63\xb7\xf8\xe6\xcc\xa8\x3f\xea\x18\x6b\x0b\xe7\xe7\x8a\xa4\xc3\x0a\xd5\xdc\x42\xb6\x40\x4b\x99\x54\xb5\xd3\xf0\xec\xff\xca\xda\x4a\xc2\xab\xc0\x70\xab\xc5\xae\x4b\x56\xa4\x29\x72\x6f\x80\x88\xa1\x27\xf7\x73\x7f\xe0\xe5\x5d\x49\x81\x08\x26\xf6\x73\x3f\xf7\x04\xc5\xaf\xa2\xcb\x72\xaa\xf0\xfd\xbe\xf0\x07\x9e\xe8\xc9\xfd\xfd\xfd\x01\xa8\xff\x6c\x50\x43\x84\x56\x58\x35\x6e\x79\xa2\x20\x51\xe8\x38\xe9\xca\x70\x83\x7a\xea\x43\x1b\x3e\x7f\x43\x5e\xd4\x21\x82\x19\x49\x8b\x42\xc7\x9d\x8e\xb5\x71\xfe\x59\x61\x47\x0e\x2c\xff\x5c\x99\x67\x9f\xe6\x4e\x86\xbe\xe0\xad\xa7\x1d\x50\x7d\x41\xba\x6e\xb2\xc7\x76\x86\xb7\xef\xdd\xbe\xbf\x7b\xf7\xf6\xbd\xea\xf1\x96\x06\x57\xe7\x2c\xeb\x26\xfb\xfb\xfb\x43\xa3\x66\x55\xbd\xb2\x12\x69\xc9\x52\x84\x0a\xa4\x7e\xb4\xc7\xa4\x17\xed\x49\xea\x67\x2c\xef\x0e\xbd\x84\xe5\x8d\xdc\xc5\xc0\x53\x52\x6d\xe9\x16\xcf\x93\x27\xab\xf7\xcb\x01\x44\x9b\x2c\x02\x92\x19\x19\x30\xc6\x22\x03\xff\xcd\xec\xa7\x6a\x2b\xa2\x52\x53\x87\x49\x88\xab\xc2\x4c\xc2\x82\xe5\x08\x40\x05\x43\x45\x8d\x51\xb3\x13\xe7\x0a\x3d\x91\xbc\x1b\xd1\xed\x1d\x0a\x33\x26\x08\x0f\xe6\x21\x85\x29\x9b\x75\x18\x4b\xe0\xd8\x54\x32\x83\x09\x9b\xa9\x9f\x53\x55\x97\xbe\x09\xa6\x54\x73\x98\xb3\xb2\x9c\x20\x31\xb6\x75\xc6\x0a\x7f\xe2\xba\x24\x2b\xcb\x29\xf5\x62\x15\x9e\xea\x68\xe7\x98\x7a\x8b\x2a\xae\x08\x53\x4c\x3b\xa5\x9e\x0a\x77\x4e\x55\xdc\x9f\xa9\xb9\x9b\xed\x49\x3a\x3a\xf3\x73\x36\xef\x0e\xbd\x88\xcd\xcd\xa4\x4d\x05\x89\xa0\x7e\x0a\xe1\xb6\xfd\xfc\x57\xf2\x5f\x5b\x0b\x43\x8a\x3c\xf6\x88\x7a\x11\x62\x74\xa1\x75\xdc\x51\x40\x58\xd1\x2b\xe9\xa8\xb2\x1c\xc6\x39\xf7\x07\x5e\xb4\xdc\x70\x1a\x8b\xc4\xba\x7f\xae\x02\x98\xba\x7d\xe6\xc8\xaa\x3d\x8a\x8e\xbc\xae\x75\x02\x65\x89\x79\x0b\xef\xc6\x77\xe8\x10\xbb\xbd\xb2\xf1\x2f\x1e\xd8\x59\x42\xbb\xfa\x18\xc2\x9a\xcd\xb7\x6f\xc2\xff\x56\x73\x02\x3d\xc7\xa9\x6e\xa4\xea\xe4\xa8\x76\x98\x33\xd0\x9a\xec\xc3\x6d\xce\x58\x6f\xe1\x3b\xbd\x81\xe3\x59\xd7\xc9\x24\x69\x6f\x24\xa4\x60\xde\x49\x0b\x5b\x18\x3d\x3d\x6d\xbe\xa1\x09\x64\xd4\xaa\x4b\xd8\x7b\xa9\xc1\x40\x75\x0b\xb5\xee\x0c\xba\x97\xbe\x02\x23\xef\x6d\x52\x71\x44\x6b\xe4\x9d\x2b\x9a\x62\x54\x15\x7f\x81\x40\x8b\x22\x14\xad\x1d\x17\x33\xa9\x90\x73\xda\x48\x4c\x1a\xa9\x6f\xa1\xa5\xbe\x73\x5c\xc1\x82\x7a\x85\xd6\xce\x13\xbf\xd0\xce\xab\x39\x83\x46\x49\x2f\xde\xa0\xa4\x27\x5d\xb7\x52\xc7\x9b\xab\xeb\x48\x4b\x63\x2f\x21\x31\xcc\xd1\x08\x82\xc4\x1d\x14\x2c\x6f\xc8\x5a\x53\x6c\x96\x9e\x67\x9e\xac\x89\xbb\x36\x0a\x4c\xca\xb2\x96\xd0\x35\x62\x13\x4b\x7f\x32\x59\x33\x84\x30\xc7\x35\xa9\x44\xa6\xf8\xf2\x57\x5d\x20\x4d\x7e\xe1\x2b\x2e\xf3\x13\xaf\x37\x1c\x11\xcb\x51\x1c\x75\x5d\xcb\x4d\x9c\xe5\x3a\xca\xc7\x83\x24\x53\x87\x04\x64\x3e\x62\x38\xea\x55\x69\x2a\x36\x00\x55\x5b\x6e\x1b\x90\x27\xad\x7b\x55\x5d\x53\xdb\x80\x50\x3b\x10\x33\x8c\x62\x0a\x2f\xdb\x97\x26\xfb\xcd\xbd\xbe\x4a\x36\x3e\x3b\xfb\xf2\x2c\x29\x0e\xc4\x29\x1c\x4a\x12\xf0\x10\x64\x3f\x12\xa7\x6a\xfe\x5b\xb8\x75\x91\xb4\x4f\x3f\x1b\x97\x26\x7b\x3b\xb5\xcb\x38\x5f\x41\x7f\x30\x08\x91\x61\xb2\x42\xe5\x64\x24\xd1\xf4\x71\xd2\xd0\xc7\x5a\x22\x0f\xb1\xba\x88\x75\xbb\xb1\xfa\x14\x77\x58\xee\xba\x24\x0a\xf2\x90\x45\x19\xfe\x96\x65\x0a\x28\x6e\x53\x3d\x68\xfc\x34\x26\x64\x96\x91\x48\xd1\xc9\x6d\xab\x99\x22\xf9\x85\xf2\x43\x9b\xb8\xaf\xae\x14\xf9\x88\xa2\x82\xbe\xda\x13\xd9\x5e\xe4\xab\x8b\x85\x97\x6c\x32\x5c\x9a\x5b\xb8\x6a\xeb\x39\x5e\x42\xb9\x67\x1b\xf2\xcd\x92\x5f\x32\xd3\x78\xdc\x64\x9f\xb6\xe1\xfa\x55\x55\xe3\x04\xc1\x9a\xfa\x01\x0f\xbd\x6f\x39\x99\x68\x82\x04\x39\xdf\x09\x7b\x9e\x59\xea\x06\xc9\xaa\xa9\xc0\x8a\xc7\xbd\xca\xb1\x5c\xe6\x09\xe8\x48\xd7\x15\xfb\x28\xc6\xaf\x29\x1a\xac\xf3\x34\x61\x99\xdc\xc4\x50\xdc\x5a\x31\x72\x56\x57\xb9\xa6\xed\xb3\xaa\xef\xf8\x26\x55\x7d\xc7\xd4\x4e\xe5\xcc\xdb\x9f\x96\x47\xb4\x0f\xdc\xff\xc0\x89\xa0\xde\x06\x13\x02\xcb\x4f\x44\x9c\xcf\xaf\x48\xd6\xb2\x3d\x42\xcb\x86\x9f\xa8\xea\x5b\x06\x07\xb6\x99\x02\x4a\xc3\xb4\x01\xa1\x91\x92\x51\xb0\xb0\xf5\x51\xf2\xbf\x6b\xf7\x50\x5d\x05\x2c\x4d\x87\x66\x82\x90\x2f\x56\xef\x63\xa4\x0e\x8c\xd8\x97\x71\x05\x9e\xea\x27\x62\xb9\x16\x63\x31\xb4\x28\x6a\x13\x21\x8a\xcc\x82\x42\xd3\x22\x78\xde\xc6\xae\xdb\x29\x5c\xb7\x13\xb9\x2e\xdf\x97\x65\x19\xb9\x6e\xea\xba\x0b\xd7\xd5\x5f\xca\x32\xd3\x09\x65\xd9\x11\xfa\x27\x37\xab\x84\x6f\x9f\xa1\xc1\x61\xa4\x2b\xe1\x7b\xb2\x2c\x0b\xd7\x15\xe8\x76\x54\x7f\x29\xcb\x58\x27\x94\x65\x27\xd5\x3f\xe6\xe4\xe9\x19\xe5\xf7\x2d\x8b\x4b\xfd\xda\xa0\xca\xc4\xd6\x33\x68\x69\xea\x58\x9c\x0d\xdc\xf7\x96\x82\x3a\x14\x6c\x26\x48\xd4\x4b\x61\x40\x61\xce\x32\xb2\xe8\x16\x8a\xa6\xea\x24\x88\x1c\x16\x23\x3a\x0f\xe2\x90\xc9\x20\xd6\xc8\x05\xb1\x49\x3a\xa2\x64\x56\x96\xf9\x1e\x12\x90\xf3\x40\x04\x79\x18\x22\x5a\xd1\x72\x20\x2d\x95\x9a\x07\xb1\xa2\x41\x78\x90\x77\xbb\x35\x2d\x6d\x49\xe3\xcf\x7f\xab\xe3\x78\x25\xab\x7b\xbf\x50\xf1\xa2\xe9\xfd\x5c\xf7\x3e\x56\xbd\x9f\xb1\x8c\xcc\x55\xef\xa7\xba\xf7\xf9\xde\x7c\x44\x67\x0a\xa7\x21\xe9\x6b\x9a\x38\x66\xf9\xa8\xdb\x5d\xec\x15\xea\xe3\x71\x77\xa1\x06\xb7\xa8\x07\x97\xee\xc5\x23\x4a\xa6\xf5\xe0\x54\x16\x11\xa4\xa1\x19\x47\xf3\xd6\x99\xa5\x13\x92\xac\x71\xb3\xdb\xa6\xb0\xf8\xe2\xaa\xc2\xc5\xda\x61\x64\x32\xa2\x72\xf5\xbd\x56\x6b\x7f\x3c\x5a\x23\xaa\x3b\x62\xa4\xf5\xac\xae\x97\xd4\xba\xb6\xf4\x86\x0a\x64\x1b\x96\x55\x54\xdb\x02\xc4\x4c\x06\x51\x08\x0b\xbc\x4e\x0a\x85\xc6\x11\x97\xc7\xe8\x09\xd6\x4b\x46\x8b\xea\x66\xb9\x40\x65\x12\x0a\xb9\xff\x8f\xda\x58\x31\x2c\xa8\xf7\xc5\x84\x36\xb8\xc3\xfc\x9c\xdc\xe0\x18\xa7\xe1\xe8\xbc\x8a\x88\xa0\xfe\x6b\xe9\xdd\x12\xea\xe2\xe5\x4b\x42\xbd\xeb\x65\x7d\x80\x20\xeb\x5c\xe4\x24\x83\x1d\x34\x76\xb4\xf4\x27\x5a\x28\x3e\x6b\x98\x7c\x6d\xc2\xae\x2d\xc2\xda\x1f\xfa\x22\xc8\x7b\xc3\xd0\x4b\x20\x65\xf9\xfe\x8e\x2f\x82\x9d\xd0\x4b\x70\x96\x1a\x38\xda\xdf\xdd\x28\x82\x8b\x7c\x92\xf7\x7a\x10\x51\x55\xda\x75\x8f\x73\xd2\xb8\xdb\x46\x3f\x3c\x11\xcb\xf7\x76\xfd\xc4\x8b\x20\x67\xea\xcc\x63\xe7\xc8\x03\xb1\x49\xba\x18\x39\x7e\xa3\xd8\x75\x39\x91\x10\x6b\x79\x70\xbd\xa8\x16\x56\x7a\xff\xb3\xb9\xab\x85\x70\xa2\xe1\xca\x28\x5c\xf1\x36\xb2\xde\x3c\xe6\x98\x77\x64\x39\x96\x6d\xe8\x21\x89\xf4\x10\x44\xaa\x87\x82\x8e\x88\x6c\xd1\x45\xe8\x37\x5b\x1f\xec\x5a\x94\x6e\xf1\x71\x2c\x69\x61\xb2\xd1\xdd\xe8\x46\x7f\xe2\x38\x11\x48\x61\x48\x85\x38\x23\x03\x85\xa9\x25\x2d\x8c\x02\xee\xa7\x5e\xb7\x9b\x68\xa9\xf4\x90\x31\x26\x48\xae\x01\x31\xa7\x54\xcb\x6c\xeb\xa9\xb2\xe4\x6e\x9b\xfb\x51\x9f\x18\x82\x48\x36\x51\xf8\x98\xfa\xa9\xba\x39\x7a\x0a\xa9\x0b\x5f\xad\x9d\x27\x8d\x53\x9f\x81\xba\xf7\x0b\x7f\xa2\x20\x6e\x48\xab\xe7\x32\x1c\xea\xc9\xea\xa4\x6c\x78\x7b\x59\xc0\x43\x42\xbb\xb9\xd5\x83\x97\x37\xf5\xc0\x30\x2b\x24\x79\x91\x92\x0f\xaa\x0f\xb5\x97\x98\x4f\xe8\xbc\x95\x82\xf6\xe1\x6a\x09\xdf\x36\xd6\x65\xce\xd5\xfa\x01\xc8\xda\xbe\xf0\x06\x47\xf3\xda\xcf\x43\xdb\xc9\x3c\xa6\xa1\xe8\x6a\xd5\xc3\x7c\xf3\x05\xe4\x06\xf7\xf2\x2b\x9f\x41\x06\x3b\x26\xcf\xed\x9f\xe5\x01\x19\xec\x9a\x8c\x77\x7e\x99\x11\x64\x70\xdb\xe4\xbe\xfb\x7b\xb9\x41\x06\x77\x4c\x91\x7b\xff\xa2\x08\xc8\xe0\x6e\xa8\xa9\x2a\xc1\x1e\x0b\xfb\x69\x60\x8a\xf7\x6a\x4d\x7a\x0b\xeb\x11\xdd\x5b\x11\xc9\xa8\x22\xd0\xac\xb5\xba\xfa\xd9\x0e\xd0\xb8\x58\x63\x80\x6a\x6f\x4a\x6a\x6e\xe6\x22\x27\x02\x76\xe9\x48\x32\x6d\x9a\x2d\x36\xe9\x61\x47\x24\x57\xf4\x3e\x47\xc4\x57\xd1\xe2\x55\xed\x35\xcd\xbb\xdf\x1b\xfa\x79\xa0\x68\xe1\x34\xf4\xd2\xd0\x4b\xac\xee\x7d\xb3\xbb\xf7\x57\x42\x36\xec\x8d\x86\xee\x13\x10\x31\xdb\x1a\xaa\x2f\xcf\xc4\x42\x33\xd5\x5d\x57\x1a\x27\x31\xc4\x36\xc9\x4b\x91\xb5\x3f\xda\x6c\x44\x97\xae\x19\xd1\x25\x33\x12\x69\xb2\xc7\xd1\xba\x35\xc2\x61\x8c\xe7\x24\x35\x8a\xca\x95\x4b\x94\x20\x84\xce\x80\xa2\x22\x40\xc6\x62\x35\xe5\x88\x41\x45\xcd\x58\x55\x65\xb0\x69\x0a\x05\xb3\xea\x5a\xf8\xff\x24\x24\xd5\xe2\xb0\xc2\x75\x4f\x73\x52\x28\x58\x77\xdd\xdb\x3b\xb7\x19\x2b\x82\x61\xa8\xc8\xa8\xe0\x76\x58\x4b\x74\x87\x2a\xf9\x41\xe8\xc7\x01\xaf\x32\x87\xd5\xd2\xc7\x50\x28\xd8\xf5\x86\xac\x76\xdf\x80\x35\xa6\xd4\x8f\x83\x45\x48\xa8\x17\xe3\x0c\x91\x46\x72\xb1\xb2\x59\x79\xb3\x59\x15\x48\x05\x03\x9c\xa9\x18\x1b\xe5\x75\x95\xaf\x14\x58\xd5\xba\x53\xfd\x79\x1a\x65\x92\x64\xd4\xdc\x12\x2d\xec\x3d\x40\x04\x25\x83\x24\xb4\x5f\x84\xe5\xd4\xcb\x90\x17\x29\x46\x34\x67\xf8\x55\x6b\xf0\xa8\x8f\x8d\xe5\x62\xbe\xb4\xcf\x96\xaf\x86\x64\x40\x21\x2e\x20\x47\x18\xe6\x46\x61\x74\xb8\x73\xdf\x95\x30\x45\xbb\xf7\x63\xb4\x7b\x9f\xb0\x9d\xdb\xae\x84\x53\x76\x67\xa8\xa2\x67\xec\xd8\x4f\x3c\x44\x54\xab\x4f\xb9\x6e\x25\xa4\xc1\xfd\x17\x6c\xf5\xa1\x69\x38\x62\x19\xb9\xa0\x70\xc0\x2e\x46\x07\x0a\x8e\x8e\x82\x83\xb0\xc9\x15\x1c\xe0\x1c\x4d\x10\x1e\x5e\x33\x99\x93\x84\xc2\x39\xbb\x25\xc9\x11\xbc\x46\x00\x52\xf7\xce\x23\xf6\x3a\x21\x47\xd8\xf7\x09\xa5\xea\x24\x26\x47\xec\x5c\x25\xa9\xa1\xa8\xa4\x8b\x1e\x3b\x87\x89\xeb\x5e\xec\x55\x83\x7a\xc2\x12\xa1\xeb\x30\x37\x38\x3d\x03\x5f\x13\x48\xfa\xd6\x5b\xa5\x20\xe0\x08\x9e\xe8\xe9\xe8\x5d\x68\x04\xf1\x88\x4d\x7d\xe1\xe1\x7c\x7e\x66\xc7\xfe\x23\x75\xd9\xab\xaf\xf8\x17\xec\xa8\xa6\x35\xfd\x23\xf6\x24\x27\x47\x8a\x28\x3a\x75\xdd\x8b\xfd\xa1\xeb\x1e\x35\xfb\x06\x66\xae\x5b\xec\x5d\xa8\xce\x56\x25\x58\xa1\xcd\x11\x5c\x57\xfd\x47\xaf\x52\x3a\x68\xb3\x0d\x14\xd9\xf5\x99\x9d\x95\xe5\x9b\x84\x7c\xa6\x14\x3e\x57\x8b\xff\x08\x8e\x5a\x0a\x05\x3f\xa3\x16\x36\x4a\x3c\xad\x0f\x93\x9b\x9c\x4c\xa0\x8b\x89\xc4\x38\x99\xd0\x6a\x0c\xea\xd2\x77\xbd\x6c\xa9\x16\xfc\x8a\xca\xcb\x2b\x71\x96\xd1\x54\x48\x5a\xef\x0c\x1b\x57\x0d\x39\x13\x14\x32\xf4\x9f\x80\x5a\x08\x76\xc6\x6c\xb4\xc6\x3d\x14\x65\xb9\x96\x96\xf9\x44\xb0\x2c\x21\xaa\x22\xf5\x9b\x51\xea\x11\xc1\x44\x95\x22\x30\x45\x5d\xe3\xb0\x6f\x0d\x8f\xd3\x92\x90\xff\x04\x65\xde\x24\x86\xb6\x89\xcf\x46\xcd\x1e\x0d\x53\x0c\x21\xb6\x51\x38\x7e\xa0\x39\xfd\x82\x2e\xf5\x5f\x23\x62\x6f\x5d\x10\x88\xd4\x1c\x6d\xdf\xd9\x72\xbc\x0c\xc5\x9a\xb6\xe0\xbe\x61\xed\x08\xff\x6d\x86\xfc\x35\x4f\x56\xb2\x73\x8c\x2f\x24\xe1\xdb\x91\xd0\x2a\xa7\x66\x0c\x2a\xaa\x88\x9d\x54\xa8\xf5\x1c\x00\xb7\x48\x9e\xac\xf6\x38\x6f\x2b\x05\xfd\x7d\xe3\x59\xd7\x28\x26\xe7\xae\x6b\x38\xc3\xf5\x39\x90\x23\xa1\xac\xf3\x21\x07\x2c\x67\x89\x22\x8d\x8b\xea\xdc\x53\x23\x23\x82\x49\x90\x6c\x40\x3d\xa1\xd2\xd7\xd5\x20\xd7\xaf\x7c\x33\x41\x16\x92\x10\xd9\xe3\x74\x9b\x88\xb2\x1c\x52\xaa\x2e\x75\xa9\x22\x5b\xe9\x28\x52\xb8\x25\x0d\x12\x3f\x52\x34\x6d\xc8\x38\xf0\x2e\x6b\x04\x30\x4b\xdd\x1f\x86\x30\xe6\xcb\x3d\x81\xcf\x48\x78\x45\x4a\x72\x74\x1a\x61\x89\xa0\x6f\x1a\x75\xcd\x3c\x5a\x85\xc1\x4d\xfe\x38\x04\xde\xe8\xa6\xd5\x88\xa7\x6a\x84\x14\xb8\x7e\x8d\xc7\x92\x14\x27\x6d\xe5\x9a\x36\x56\xbe\xef\xca\x91\x2c\xd9\xcc\x8f\xbd\xbb\xb7\xe1\xb6\x4b\xa4\xcb\xfe\x7f\x64\xe6\xdf\xbd\xed\xc5\x94\xaa\x06\x5c\xd6\xbb\x4d\x2b\x45\xfc\x00\x35\x43\x60\xe6\x47\x5e\x02\x33\x3f\xc5\xff\xea\x62\xa2\xfe\x57\x35\x87\x70\xcc\x44\x6d\xc3\x3e\xad\x81\xe3\x54\x6b\x23\x7d\xce\xc9\x31\x4c\x29\x1c\xdb\x08\x92\x65\x70\xa2\xd2\xdb\x56\x0e\x4f\x2d\xce\xcf\x6b\x6e\x59\x02\xdb\xda\x08\x9a\xc1\xa2\x46\xcf\x51\xf2\x66\xec\xce\x07\xde\x54\x90\x39\xae\xfa\xce\x03\x94\x21\xa3\x13\x50\xb3\x91\x34\x57\xad\xeb\x70\x87\x1a\xff\x9d\xbc\xf6\x07\xd8\x25\x44\xe7\xd0\xde\xa7\x54\xae\x2e\xe9\x66\xc1\x30\xec\x0a\x4a\xd7\x4a\xd1\x76\x9e\x9e\x68\x98\xd8\xc8\x34\x43\x7c\xff\x36\x61\xaf\x85\xeb\x0e\xb7\x15\xfd\xc1\xbf\x6f\xbd\x16\x24\x80\xde\x20\xa4\x34\x18\x86\x8a\xc8\xd8\xb0\x95\xab\x7c\x9c\x2e\xbd\xdc\x92\x58\x3e\xff\xf9\xcd\x04\xf5\xea\x2d\xa3\xe9\x03\x5f\xe0\xfd\x44\x30\xf6\x79\x83\xbd\xcc\x7f\xe9\xb6\x35\xe0\xc6\x61\x2d\x91\x37\x38\x42\xb9\x41\x29\x24\x90\xc0\x03\x19\x86\x4b\xaa\x36\x0c\x2a\xad\x5b\xe0\xfa\xc3\x80\x6b\xa4\xc1\x09\x6a\x65\xad\x1d\xed\x24\xa7\x33\xb5\x6f\xd1\x3f\xf1\xae\xa0\xd9\x2c\x91\x1f\xd5\x6a\x11\xaa\xf8\x71\x05\xd3\x0f\xee\x41\xc4\x16\x0a\x69\xcc\xb5\x62\x98\x3f\xf7\x66\x08\x31\x73\xaa\xf9\x38\x33\x4c\x9d\x79\xf3\x94\xcc\x28\x1c\xf7\xd8\xc2\x5f\x34\x1a\x16\x77\x6f\xbb\xd2\x18\x9d\x44\x70\xca\x16\x23\xac\x6e\xa9\xe5\x7a\x53\x3f\xf1\xfe\x41\x8d\xea\x0b\xbd\x69\xf4\x78\x26\x70\xaa\xc7\x84\x04\xc9\x99\xeb\xae\xeb\x1a\x09\xc6\xd5\xed\x22\x63\x78\xc9\x48\x98\x28\x33\xad\x3a\x9a\xec\x0d\x77\x87\x65\x39\xdc\xb9\xcf\x58\xe6\xba\xf7\x19\x13\x4d\x6c\xe7\xce\x5d\xc6\x84\xeb\xf2\xe0\x9e\x21\x43\xf7\x98\x0c\xee\x87\x65\xb9\x7b\xff\x36\x66\x91\xab\x9f\x74\x1d\x96\x72\xc2\xd0\xcd\xd0\xeb\xef\x4e\xc8\xf0\x72\x93\x94\x6c\xe8\xaa\x9d\x54\xed\x7f\x45\x08\xee\x62\xcf\xf3\x46\x14\xb8\x1b\x8e\xd4\x3f\x16\xf9\xaf\x13\x12\x41\xae\xaf\x5b\x5e\x0e\x3c\xb8\xad\x52\x13\x41\xd4\x77\x48\xa9\xa7\xbe\x2c\x89\xaa\xe5\x4e\xa8\xfd\x0b\xdf\x09\x19\x51\x95\xdc\x09\xa9\x7f\x6e\x8a\xdf\xad\x8a\xdf\xad\x8b\xdf\xa9\x8a\xdf\x0d\x29\x60\xf9\x7b\x55\xf9\x7b\x21\xcb\x29\x28\xca\x52\xf7\xfc\x7e\x68\xc4\xbe\xc1\xfd\xd0\x57\x83\x54\x58\x40\x45\x40\x45\x28\x05\xf3\xf9\x41\x88\x05\x1e\xa8\xa1\x3e\x08\x29\x28\x42\x9a\x49\xa3\xc1\xca\x92\x25\xb9\x80\x33\x0a\x9c\x5d\xe0\x85\x8f\x5d\xe0\xe3\x67\xec\x42\xcd\x4b\xc4\x2e\xd4\x88\x16\xec\x42\x5d\xfc\x3a\x64\xc6\x2e\x54\x45\xf8\x4f\x81\xcc\xd4\x92\x39\x2b\x98\x52\x1f\x7a\xc7\x30\x50\x48\x48\x51\xbc\x2e\x62\xd9\xde\xce\x1d\x0a\xd2\x75\x87\x1d\x26\xe9\x11\xbb\x8f\x96\x36\xc3\xbb\x9b\x9e\x0a\xd2\x93\xbf\x99\x32\x8e\x2c\xca\x38\x5d\xa7\x8c\x63\x6d\xc4\xb5\x60\x29\x14\x8a\xf2\x8d\xe8\x68\xa1\x4e\x31\x75\xdb\xb0\x28\xe4\x45\x58\x79\x90\x4a\xf7\x76\x5d\x37\x0e\x06\x61\x87\xa9\xcb\x4e\x1c\xa4\x3d\x54\xae\x2e\xfc\x20\xf4\x12\xa1\x2e\x30\xa6\x0f\x24\xed\x31\x63\x81\x45\xf7\x84\xdf\x10\xbf\x51\x8b\xf8\x4d\x20\x86\x39\x24\x90\x80\xe8\xa5\xd4\x3b\x90\xe4\x97\xe4\x69\xe4\xe7\x9e\xb6\xa1\x45\x75\x43\xa2\x55\xa8\x3d\x89\xea\x30\xbb\xbb\x1d\x35\x55\x66\x2f\xfa\x5f\x93\xfa\xb4\xb9\x58\xb3\xe1\xa9\x8d\x46\xd5\xb5\x23\xba\x61\x0e\x65\x6b\x0e\x91\xd7\xbb\x36\x91\x15\xcf\x37\x69\x78\xbe\x19\x29\xba\xb1\x42\x14\xbf\x1c\x8e\xf4\x23\x8f\x1b\x76\xef\x5c\xcd\x7c\x52\x33\x7b\x63\xcd\xa4\x5e\xe0\xfb\x6b\xf5\x7a\x74\xbb\x69\x7d\xda\x1d\x48\x32\x83\xdc\x5c\x16\x6a\x75\x4e\x01\x91\xd6\xe3\xdc\xd2\xe6\x04\x9b\x80\x26\xc3\x61\x27\x3f\x19\x76\xb5\x94\xbf\x31\x84\xc4\xe3\xb4\x9a\xe8\xcc\x74\xa6\xee\x70\xdd\xa9\xba\x95\x93\x9c\x90\x33\xff\x45\xe6\x7d\xce\x29\x39\x82\x0b\xba\x72\xb8\x7f\x5c\x17\xc6\xa2\x19\x68\x59\x5e\x46\x84\xc3\x7b\x1e\x08\xb5\xc9\x6b\x3f\x7a\x8a\xa2\xf5\xa5\x67\xa9\x00\x7c\x6a\x5b\x6f\x5d\x37\x1c\x15\x45\x67\xa0\x1f\x53\xd7\x25\x8d\x71\x08\x54\xca\xca\x09\x7c\x4a\x20\x6a\x19\x33\xb4\x1c\xb6\xbd\xb0\x8f\x57\x89\xda\x07\x89\xdd\xee\x8a\xd5\x58\xcb\x8a\x86\x37\xe0\x62\x3b\xdf\x89\x3b\x6c\xe1\xba\x1d\x92\xba\xee\x62\x3f\x5e\xb1\x78\x2a\x1a\x13\x98\x79\xcb\x04\xa6\x70\xdd\xda\x82\xad\x40\xd5\x83\xb9\x31\x81\x99\x29\x68\x9c\xb2\xce\x00\xaf\xd2\xa2\xb2\x9e\x34\x1c\xe7\x8d\xa6\x31\xdd\xee\x6c\x2f\xae\xed\x24\x79\x30\x43\x3b\xc9\x60\x66\x59\xc2\x9c\xa1\x25\xcc\x29\x4c\x60\xd6\x58\xc2\xa8\x33\x6b\x66\x59\xc2\x9c\xd5\x77\xa9\xb3\x5a\xf0\x3f\x9a\x36\xe6\x2f\xea\x8c\xd5\xba\x6f\x57\xeb\x92\x68\x95\x8c\xc6\x97\xb8\x36\x13\xad\xca\x9e\x93\x09\xf0\xca\x98\xa6\x3e\x8e\x2a\x63\x4a\x49\x97\x94\x5e\x5b\xd5\x2f\x8d\x9a\xc4\xa4\xc3\xd8\xa9\xeb\x76\x72\xec\x61\x55\xba\x95\xd3\xf0\xbb\x6e\x30\x60\xb1\xec\x21\xff\xb2\x97\xdc\xa8\x0e\x26\xf0\x34\x5f\x53\x1d\xbc\x65\xe7\x44\x23\xe8\x93\x14\x22\x5b\x6a\xff\x70\x2d\xc7\x61\x0a\x69\xae\x6f\xfd\xff\x24\x6d\x55\x38\x5b\x11\xae\xf2\xa5\xd0\x22\xf5\x78\xbe\xea\x43\x3e\x8b\xce\x55\x97\x40\xb0\xcf\x22\x90\x8a\x50\x30\x3b\xe4\xb3\x00\x49\x7d\xd1\x50\x3b\x99\xa5\xfe\x89\x5e\xae\x72\x96\xa0\x0a\x40\x63\x6d\x93\x97\x65\xde\xd8\xdc\x6c\x25\x58\xfd\x72\x5d\x1a\x24\xf3\xa6\xaf\xb5\x43\xe2\xaf\x02\x1c\x0b\xd1\x3b\xd4\xff\x2a\x14\x92\xb0\xd2\x2c\x3d\x9f\xbc\x66\x60\x7d\x15\x7d\xe3\x30\xb7\x2c\x65\x5c\x93\x9b\x0c\xf5\x6c\x63\xff\x65\xe6\x71\x58\x45\xc0\x3e\x27\x0d\x7a\x1c\x84\xcd\x77\xb4\x93\xb0\x35\x83\xf2\xb6\x36\xfa\xaa\x53\x9e\x75\x0a\xd8\x50\x90\xa3\xb5\xbb\x57\x59\x5a\x2a\x49\x65\xe9\x14\xfa\xf5\x66\x1d\x39\xc9\xf3\x94\x47\x28\xc8\xf1\x2d\x25\xcc\x0e\x63\xc6\x64\x86\x71\x45\x1c\xfb\x22\x58\xbf\xce\xf9\x26\xc9\x73\xce\xa2\xe2\xcc\x09\x3d\xd1\x3f\x8f\x2c\xb9\x64\xb2\xb2\xf2\x27\x78\xc1\x69\x78\xab\x96\x72\x6f\x86\xca\xbd\x90\xa0\x5a\xcf\x08\x85\x7a\x41\x06\x09\x1c\xe5\x24\xa1\xe1\x86\xd5\xcc\x5b\x53\xb4\x91\x76\x5f\x79\x3a\x4f\xdb\x5b\x56\xdf\x0e\x33\x22\xa8\x2f\x3c\x4d\xec\x46\x39\x9b\xc9\x8d\xb7\x97\xaa\x8a\x20\xf4\x8c\x19\x17\x7c\x96\x64\x86\x98\x6e\x03\x07\xe4\xad\x6d\xea\x4e\xe9\xd2\x9b\xc5\x90\xae\x55\xde\xcc\x48\x10\x8e\xf8\x88\x1e\x2a\x24\x83\xde\x16\x15\xb5\xf6\xaa\xe5\xe2\x04\xab\x88\x73\x76\x60\xe9\x4c\x2c\xf2\x1b\x74\xcd\x37\xe8\xe2\xe6\x0a\x99\xb4\xb5\xce\x51\xfb\xb6\xd2\xbf\xef\x10\xfd\x82\xa7\xf6\xa0\x80\x6a\xe8\x95\x3c\x69\xc4\x19\x0f\xa2\x7a\xea\xf3\xb2\xec\x76\xb3\x0e\x4b\xfc\xdc\xeb\x74\xc8\xa6\x47\x39\xa9\xeb\xfe\x15\x91\x84\xba\xee\x2c\x27\x11\x7a\xc4\xd0\xba\x6b\x68\x2a\xd2\x52\x48\x2d\xf2\x4d\x4a\x26\xcd\x45\xc8\xd6\x53\x28\x4b\xb4\xb5\xf2\xaf\x97\xde\x63\x41\x70\x76\xac\x9a\xe6\xf9\xaa\x51\x45\xd5\x5a\x59\x76\x3a\xe4\x07\xc7\xc7\x9a\x79\xf0\x83\xdb\xee\x91\x67\x2d\xe0\x59\xd9\x3b\x9d\x8e\xf5\xac\x44\xe1\x21\x96\x6f\xb6\x90\x68\xb6\x10\x1a\x6e\x4d\xea\x37\x3b\xa8\xeb\xf2\xfd\xde\xd0\x75\xf9\xff\x0c\x19\x1b\xa0\x4e\x42\xd3\xe4\x71\x6e\x79\xd6\xeb\xdc\xb2\xa4\x91\xe6\xdd\xed\x7a\x5f\x35\xfd\x68\x9a\xcd\x7c\x14\x60\xe2\xd4\xca\x46\x6b\xdb\x6b\x76\x65\x56\xb9\x4e\x50\x99\x2e\x23\x82\x88\xd5\xe6\x52\x55\x1a\x39\xd7\x2b\x0a\x85\xe6\x6d\xf2\xb5\x59\x20\x0d\xbf\x4a\xb8\x6e\x6b\xcc\x35\xda\xc0\x58\x0d\x3e\x1d\xad\x8c\x58\x96\xb7\xcc\x94\x94\x65\xe7\xaf\x26\xac\x33\x4a\xd7\x35\xbe\x2f\x6c\x5a\x0a\x59\x2b\xc6\xbf\x6b\xae\xf1\xc4\x57\x35\x88\x1b\x84\x28\xa2\x2c\x2b\xff\xc3\xcf\x5a\x9e\xe6\xea\x51\x21\x4b\xa5\x11\x03\x77\x06\xd5\x2c\xff\x93\x34\xda\x3a\x9d\x4e\xe6\xba\x2a\x57\x16\x0c\xc2\x25\xb9\x10\xae\x1b\x6b\x93\xf4\x0b\xcd\xe1\xb0\x5e\xcb\x26\x43\x4a\x69\x87\xbd\x2c\xcb\xa3\x26\xdb\x91\xa0\x1d\x76\x50\x96\x07\x3a\xe9\x40\xf4\x05\x2f\xf2\xf4\x82\x13\x95\xf7\x49\x59\xbe\x6e\xf2\xbe\x56\x79\x3f\x97\xe5\x79\x93\x74\xae\x92\x4e\x14\x80\xc5\xf9\x06\x17\x48\xe8\xf4\x40\xe1\x4b\xc6\xce\xfd\xd6\x9e\xa8\x04\xb5\x8f\x73\x22\x50\xd1\x13\xc9\x9f\x4a\xee\x99\x55\x02\xcf\x77\xc2\x88\xfd\x5e\x56\x46\xe3\x75\xc2\x81\x4e\x38\xa9\x13\x9e\x54\x56\xfb\x75\xc2\xe7\xca\xd1\x6a\x9d\x70\x62\x89\xe2\xb5\xf3\xce\x9c\x9d\x70\xff\x45\xe4\x4d\xad\xb3\xfe\xc2\x5e\x45\xd7\x6d\xfb\x7d\xb5\x48\xe4\x4d\xc6\xbe\xf8\x5a\x44\xbd\x92\x65\xf9\xde\x86\xde\x23\x7b\x9b\x6b\x4f\xc6\xda\x2e\xc1\x52\x56\xca\x6f\x60\xb6\xaf\xf8\x18\x11\xae\x8b\x9e\xeb\x2a\x7b\x98\x0e\x12\xec\x06\x24\xdb\x4f\x11\xbd\xae\x37\x6d\xcd\xe1\x9e\x09\xa2\x79\xce\xbc\xf6\x2c\xe7\x49\x64\xb6\x34\x32\xae\x46\x32\xd5\xc8\xb9\x1a\xe6\xac\xb9\x7e\xf5\xa4\xc5\x96\xad\xec\x23\xd2\x20\x57\x17\x2b\xd9\xcd\xc3\x91\x2a\x31\x6a\x6c\x71\x32\x22\xbb\x43\x9d\x51\xaa\xbb\x2f\x66\xcc\xeb\x1b\x56\x8c\xce\xa5\xd5\x3d\x59\xbf\xb8\x6e\xee\x9d\x8d\x92\x50\xbe\xa2\x48\x59\xf1\x51\x76\x7c\xee\xa1\xe6\xe8\x2d\x6d\x11\xd2\x6b\x99\xbe\x3c\xc9\xd7\x6c\x74\x1a\xc1\xe8\x54\xd4\x42\x76\x10\x14\x72\x86\xce\xc9\x2d\x9a\x4d\x5b\x38\x8d\xd0\x30\x0b\xcf\x04\x41\xfd\x3c\x88\x42\x2f\xd9\x60\x90\xf3\xa8\x41\x50\x64\xc5\x40\x16\x69\x95\x0d\xc7\x44\x20\xd5\xfd\xaa\x45\xb8\x34\x8a\x7c\xea\xcc\x57\x9d\xf8\x9c\xb3\xc3\x9c\xbc\xc8\x28\xbc\xcb\x59\xda\x52\x13\xb4\xe6\xa3\xf5\x6e\x89\x3e\xbf\xe1\x3d\x96\xfc\x92\x59\xde\x91\x4e\xf2\x15\x9f\x41\x8d\x6e\xb5\x22\xba\x57\x7d\x2f\xb7\x65\xc9\x5a\xcb\xbc\xed\xf0\xba\xb2\x72\xaa\x16\x45\x4d\x14\x11\xfb\x43\xdf\x71\xb7\x1c\xcf\x71\x68\x17\x4d\xc4\x24\x93\x5a\x08\x21\xf6\x77\x7c\x07\xd4\xa7\x2d\x87\x02\xaf\x55\x26\x32\x0e\xce\xf5\x38\xdb\xfe\x73\x2b\xa8\x9c\x33\x6c\x7d\x4f\xe4\xd9\x96\xd3\x95\x5d\x27\xdc\xfa\x73\x7b\x9c\x39\x74\x49\xb2\xcd\x4a\xb5\xe7\xea\x76\xbe\x2e\xa8\x71\x26\x7d\xa7\x2b\x82\x41\x38\x92\xae\xd0\x22\x62\x7c\x48\x3d\x43\xd7\xba\x78\xb5\xc9\xe8\x12\x5d\x62\xe4\x42\x12\xba\x24\xeb\x28\xcc\x3c\x40\x95\x58\x24\x8d\x2f\x83\x61\x58\xf1\x9e\x73\x7c\x09\x60\x49\x32\x8a\xce\x68\x2c\xd5\x15\x0b\x93\x0c\x40\xb0\xc1\x1a\xed\x6b\xba\x79\x2c\x88\x82\xbd\xe1\xdd\x1e\xc9\x7a\x82\x6a\x89\x5a\x06\xf9\xfe\x00\x61\xa9\xdb\x95\xfb\xec\xfe\x60\x50\xfb\x51\xb1\x28\x70\x7d\x11\x93\x4d\xe5\x8d\xe3\x5a\x9b\x2d\xd0\x68\xb3\xe4\x2b\xfa\x69\x59\x4b\x93\xba\xda\xaf\x46\x2a\x95\x79\x12\xb5\xd4\x64\xbd\x1b\x9e\x66\x44\x00\xba\x74\x57\xa4\xd5\x48\xfd\xd3\x96\x08\xfa\x99\xb2\xc6\xce\xb1\x12\x83\x4a\xd0\xd6\x47\x6f\x72\xb8\xca\xe1\x5b\xce\xc8\x9b\x9c\xbd\x89\x36\xcc\x73\x63\xe2\x7d\xfb\x2e\xda\x8e\xc6\x67\x91\x78\x94\x4f\x39\x2a\xf0\xd4\xf6\xe5\x4e\x0b\x6a\x1e\xb6\x6d\x22\xb5\x37\xb3\x6a\x61\xfd\xa4\xce\x16\x73\x70\x6e\x0d\x1d\xea\x89\xb2\x44\x53\x48\xb9\xdc\x24\xb4\xbb\x33\x18\x30\xc6\xae\xf2\xca\x31\xca\x55\x6e\x9e\xc6\x00\xbe\xa4\x70\x95\xb3\x37\x79\x3f\x8e\xe2\x33\x0e\x6f\x72\xfb\x79\xf4\xfc\x46\x2b\x88\xb2\x6c\x99\x37\xf0\x7f\x6f\xcf\xf0\xd8\x54\x5e\x11\x29\xfa\x3d\x25\x73\x07\x68\x7c\x5c\x59\xcf\x25\x59\x19\x54\x43\xad\x97\x94\xaa\x46\x1d\x4b\xc2\x6b\x1a\x58\x7d\x12\xa7\x5e\xca\x38\xcd\x33\xa3\x4e\x2c\x8d\x22\x07\xb7\xdf\x6e\x01\xde\x3c\x07\x63\xf9\xe8\xb6\x9f\x72\x51\x88\xd5\x4e\xa0\x20\xad\xf7\x62\x78\x13\xc6\xf4\xfa\xd9\x18\x6e\x45\x40\xbf\xc7\x76\x99\x33\x5b\x2a\x6b\xa3\x01\xad\x0d\x8e\x1e\x9a\x67\x68\x84\x0c\xcf\x23\x6d\xf5\x1d\x84\x4b\x0a\xcf\x36\x94\xd4\x1b\xe1\x93\x2d\xad\x79\xae\xe9\x54\x22\x58\x42\xe1\xa6\x2a\x01\xb5\x7c\x76\x4c\xd5\x7f\xff\x6f\x56\x9d\x80\xd0\xd5\x36\x30\xf6\x21\xdf\xe4\xae\x6a\xd5\xae\xaa\x93\xd5\xda\xc1\x23\x7d\x7c\x37\x82\x38\x94\xc2\xd5\xba\x97\x68\x12\x97\xa8\xc3\x3c\xeb\x26\x30\xa0\x14\xf0\x0d\x7b\xa1\x68\xf3\x5d\x0a\x89\x85\xc7\x5e\xfd\x57\x4d\x6b\x64\x62\xe4\x5f\xb5\x1a\x80\x96\x05\xe6\x4c\xec\x0d\x7c\x6c\x3c\x87\x01\xf5\xa6\x82\xe4\x90\xa9\x73\xbb\xdd\x8d\x5c\x2b\x0b\xd5\xa2\xc8\x7c\xe5\x62\xdb\xd1\x24\x5a\xc5\x9b\x40\x2f\x85\x43\xda\xb2\x05\x78\x9b\xaf\xbe\xb8\x6e\x9b\xa4\xeb\xbb\xf3\xf3\x95\xb5\x33\x18\x09\x0d\x95\xe6\x89\xed\x74\xde\x72\x16\xa1\x70\x54\x30\x08\xfd\x47\xea\xf6\xac\x81\xe0\xc7\x0d\x15\x7d\xaa\x6e\x03\x6b\x15\x32\xa6\xbe\x09\xea\x4b\x96\x78\x42\x7b\xf7\xad\xaf\x46\x8a\xc8\x6b\x35\x23\xf4\xbc\xd4\x30\xf7\xf1\xdf\x35\x47\x24\xdb\x44\xb3\xfa\xd2\xab\x3c\x3f\xfe\xaa\xf5\x04\xe4\x2a\x58\x7e\xb2\xce\xb8\x0d\x70\x51\x9f\x97\x3c\x90\xa8\x98\xab\x2d\x51\xb1\xdf\x5f\x6c\x14\xfa\x25\x5f\x75\xc6\xd8\x68\x51\x21\x55\x5d\xad\x9a\xb6\x1a\xa7\x9e\x3e\x54\xfe\xca\x99\xad\xc6\x61\xbb\xac\x5d\xeb\x8b\x3a\xe8\xb2\x16\x03\x05\x8d\xb7\x6f\x72\x6e\x30\xd3\x4e\x2f\xfc\x2e\xf7\xf8\x92\x6a\xf2\xe0\x20\xa1\x14\x32\x7b\xf8\xb7\x56\x01\x12\x1d\xb4\x78\x67\xb5\x09\x9b\x7e\x65\x7e\x6d\x9d\xcc\x2e\x44\x13\x1a\xde\xa0\xa9\x25\x85\x7f\x7e\xb6\xa8\x16\x1a\xc1\x4b\xbd\x54\x68\x64\xb5\x96\x1a\x4a\x14\x61\x13\xfd\x46\x6d\x37\xc3\xc5\x7a\xdd\x09\xb2\x85\x9a\x19\x90\x91\x71\x27\xc3\xcb\xb2\x53\xf3\x51\x2a\x19\x73\x58\x9d\x19\x0d\x75\xc2\x3e\xcb\x16\x89\x89\x65\x9f\xdb\xe6\x81\x78\x41\xa9\x57\x4d\x52\xe8\x0c\x96\x14\x9e\xdf\xe0\xda\x00\x61\xfc\x03\xba\x3c\xb4\xb5\x6c\x44\xd4\x70\xba\x6f\xee\x98\x60\xd8\xfd\xb6\x4b\x3f\xe9\x0b\xef\x44\x12\x71\x83\x56\x8f\x84\x04\x14\x09\x81\x2b\x9b\x45\xbf\x73\x14\x19\xf4\x90\xac\x2d\x46\x95\x77\x91\x10\x9c\x96\xe7\xfa\x6d\x85\xfc\x77\x16\xad\x05\x02\x56\x05\xf6\xea\x47\xff\x97\xab\x6f\x57\xab\x17\x1e\x52\xac\x52\x46\x14\xe2\x1b\x2a\xb7\x9e\xb6\x91\xfb\xc3\x7a\xe7\x37\xaa\x10\x1b\x9a\x13\x3e\xe1\x06\xff\x50\x2f\x01\x5c\x3e\xd1\x02\xb4\x45\xd4\x34\x81\xcf\xfa\xd9\x64\x46\xfd\x12\xdd\xc0\x36\x2e\x2a\xa2\xf6\x7d\xd1\xec\xc7\x79\xd4\x46\x1b\x9b\x7a\xae\xcf\x87\x01\x64\x6c\xf5\x9d\x3a\xb0\xf8\x1c\x16\xc6\xd2\xda\x59\xcb\x9a\xf7\x24\xf7\x87\x65\xb9\xfa\xa0\x5d\xc3\x66\xcc\x56\xcd\x07\x67\x78\x0e\x10\x92\x31\xa3\xa2\x25\xa0\x2b\xba\x04\x1d\x83\x53\x4a\x5b\xd5\x20\x81\x8b\x2f\x09\x7a\x45\xa4\x08\xfd\xc2\x0b\x72\xed\x86\xfe\x40\x9c\x7a\xc9\x52\xfb\x22\xbc\x14\x24\x5b\x79\xac\x8f\x6a\xc5\xd6\x0d\x40\x28\x5d\xb7\xd3\x20\xdd\xea\x76\x94\x20\xe9\x4b\x51\xce\xa8\x4b\xa2\xbe\xe0\x2c\x62\x9f\xdb\x88\x57\x91\x07\xb6\x87\x28\xbf\xdb\x55\x37\x02\xef\x1f\xed\xfe\x66\xa8\x4a\x4d\x23\x76\x95\x90\x0f\x39\x85\x63\x0c\xbd\xb2\x4f\x80\x49\x6b\xb1\x34\x83\xcf\x3f\x97\x5e\x9a\xd1\x86\x20\xb0\xb9\x6d\x9b\xf2\x3f\x91\x5e\xdc\xce\x8f\x7c\x9e\x5f\xf7\x56\xf5\xd5\x88\xba\x4c\x9f\xb5\x3f\x5f\xb8\x58\xdb\xe3\x2b\x5e\x08\x36\x6d\x1f\x88\xfe\x8d\x13\x2b\x7a\x1d\x05\xdd\x6e\x12\xb2\xdc\x47\x0c\xa3\xba\xe4\xd5\x0e\x4a\xd5\x46\x5e\x52\x38\xda\x38\x8a\xaa\xaf\x6d\xa4\x7c\xb0\x69\x6e\x4e\xa4\xf7\x6d\x7d\x6e\x5e\x6f\xac\x95\x07\x8a\x62\x1c\xd6\x53\xb2\xb4\x79\x43\x15\x0a\x0d\x42\x08\x42\x85\xd6\xce\x37\x20\xc1\x35\x47\x72\x0d\xc6\x5d\xb5\x8e\xdc\x1f\xa2\x12\x21\x87\xc6\x42\xc1\x57\xb7\x41\x4f\xec\xef\x68\xf5\xc2\xb6\x69\x02\xe2\xbc\x40\x25\x86\x14\x9e\x35\xc4\x33\x85\x00\xd7\xeb\x49\xc4\x22\x9b\x45\x62\xf3\x47\xcc\xeb\xaf\xc4\xb6\xa1\x7c\x14\xad\xb1\xc8\x84\x9f\x78\x12\x50\x09\x6a\xb8\x73\x1f\xb5\x26\xd4\x1f\x72\x04\xcd\x29\x51\xeb\x96\xd8\x3c\xe0\xcf\x91\xed\x13\x62\x33\xdf\x57\xde\xf4\x02\x0d\x57\xd4\x31\xa7\xeb\x73\xdd\xeb\xf1\x7d\x74\x61\xc1\xa4\xad\x1e\xde\x5c\xf0\x29\xf0\x3d\x36\x34\xa7\x81\xd0\xba\x6e\xef\x6e\x04\xdc\x8c\x21\x73\xb9\xe6\xc1\x57\xd0\x9c\x08\x22\x40\xe6\xe4\x5d\x44\xe9\x28\x2b\x59\x6c\x6e\xf3\x38\x11\xd5\x0b\x40\x6a\x8a\xdf\xff\xa4\xe6\xdd\x9f\xd5\xfc\x7e\x43\xcd\x12\x5f\x3d\xd2\x35\x5b\x5c\xaa\xa8\x55\xad\xad\xca\xce\x06\x80\x4e\xbd\xa6\xea\x1f\x7a\xa1\xfc\xdd\x97\x7e\x1a\x64\xd3\xe8\xe9\x65\x90\xb3\xa8\xf1\xb8\x16\xb1\x04\xe6\xe8\x7c\xc2\x30\x52\xf2\x96\x71\xf3\xa9\x85\x31\xe7\x8c\xc3\x82\xbd\xcb\xc9\x85\x22\x53\x66\xfe\x84\x70\xea\x59\x86\xc5\x67\xe6\x68\x11\x8c\xf7\x6a\x85\xe1\x42\xeb\x57\x88\x7d\x26\xcb\x12\x5f\xf9\x98\xba\x2e\xef\xcd\xf7\x99\x65\xe3\x7c\x51\x8b\x69\x9f\x44\x44\x0b\xfc\x2d\x12\xe9\x48\x1d\x7f\x55\xcb\xab\xc7\x98\x60\xb2\x47\x78\xaf\xd6\x0f\xda\x9a\xfa\x53\x35\xfb\xa9\x4a\x9d\x53\xea\xe1\x1b\x70\x36\x5f\xda\x26\x44\x58\x02\xc7\xae\x9b\xe9\xa1\x10\x3d\x1d\xb1\xcd\xa1\x6e\xf5\x0b\x04\x3b\xab\x1c\x22\x64\x16\xa3\x38\xc2\x33\x13\x0a\x66\x14\x43\x17\xb6\xba\xf7\x69\xf5\x10\x51\xed\x57\xf4\x34\x21\x0b\x6a\x4d\xe4\xc4\x7a\x43\xa8\x31\x4e\xac\xbe\x52\xa8\x61\xa7\x52\xba\x2d\xcb\x01\xdc\xaa\xae\xd5\x33\xd6\xe9\x28\xd8\x8b\xa6\x49\x76\x0a\x29\x23\x53\xe6\x9c\x47\x97\x1f\xa3\x44\x3a\x28\x58\x52\x77\xce\x69\x4a\x44\xbf\x4a\xc5\xd2\x92\x7a\x29\x1c\x33\x47\x8a\x28\x49\x93\xec\x14\xb3\xfa\xaa\x26\x93\xe2\x1d\x53\x38\xe8\xc7\xea\xb8\x4e\xed\x97\x22\x16\xfa\x5e\xab\x47\x30\x47\xff\xee\x05\xd3\x1a\x88\x70\xd0\x9f\xa5\xad\x57\x2d\xac\x59\x66\x2c\xf1\x63\xef\x88\xa8\x49\xa4\x4b\x38\xc0\xfd\x7a\x78\x33\x31\x99\x6b\x1a\x1c\x29\xb0\x97\x1b\x37\x9f\x9d\xb1\x9e\x96\x36\x05\xf5\xa6\xa1\x89\x37\xed\x16\x4b\xba\xf5\x5b\x48\xab\x2d\xb6\xde\x12\x35\x37\xb3\x01\x84\x84\x49\xbf\x85\xb1\x32\xea\xe1\x43\xb2\x39\x13\x9a\x91\x86\x6a\x8c\xf8\x0a\x45\x52\x43\x77\x8e\x3a\x18\x89\x6e\x21\xaa\xf7\x61\x55\x41\xf3\xf2\x08\x56\xc0\xf2\xea\x25\xb4\x88\x96\x65\x0e\xd1\x72\xf5\x7b\xc6\xbf\x93\x37\x51\xff\x91\x8a\x94\xe5\x2b\xd1\x7a\xd7\xe0\xca\xdc\x5e\xfe\xcd\x43\x61\x2b\xec\xdb\xdf\xb7\xdb\xeb\xf0\xc6\x7c\x87\xb6\xcd\xf7\xec\x4f\xb0\xc1\x88\x6f\xed\xfb\x26\x53\xbe\xcd\x99\xf4\xa9\xb9\xac\xb3\x58\xb3\x29\xe9\x72\x69\xe6\x86\xbd\x12\x38\xe1\xdf\x22\x76\xbc\xf9\x4e\x4d\x24\x6b\x79\xcc\x7c\x15\x69\x73\x43\x74\x10\xa8\x5a\xab\xad\x26\xd4\xfd\xc9\x1c\xca\x75\x22\x5d\x39\xf8\x6d\x20\x5e\xb7\x29\x9d\x0a\x92\x35\x82\x19\xe3\x90\x29\x0b\x92\x70\xd5\x0e\x4a\xa5\x51\x4b\x4b\xaf\x92\x1c\x65\x68\x77\x01\x5f\x37\x6c\x2a\x3d\x9c\x44\x10\xa9\xce\xa4\xaf\x51\x63\x3a\x81\x07\x5d\xac\x4e\x7a\x4d\x77\x3d\xfe\x65\xe9\xc7\xab\xa5\xef\xde\x6e\x8a\x7f\x8f\xd6\xf9\x13\x76\xde\x9d\x3b\x77\x0d\x65\xd1\xda\xa9\x97\xed\x8b\x4b\xe5\x12\xbe\x71\xf8\x8e\xe8\xe2\x59\xc4\x3e\x24\xe4\x75\x46\xe1\x6f\x0c\x6d\x6c\x86\xef\x33\xb9\xa4\xf0\x21\x62\xef\x32\xb2\x8e\x89\x6a\xc8\x5d\x12\x4a\xfd\x77\xd9\xa6\x77\x14\x2a\xaf\xf3\x96\x73\x6d\xf5\xcb\xb9\x43\x5d\xb7\xf3\x76\x3d\x75\x09\xaf\x22\x96\xf5\xd5\x4d\x44\x44\x57\xf0\x34\x62\xc7\xd2\xff\x28\xc9\xb1\xdc\xf8\x4c\x43\xdb\x3b\xfe\xa1\x45\x97\x21\x01\xbd\xc6\xed\xfb\x2b\x22\x96\xb6\x46\xe7\x45\x5b\x82\xfa\x3c\x5a\xaf\x1a\xeb\xc1\x29\xfb\x11\xb1\xa9\x2c\xcb\x69\x0c\x1f\x23\x36\xc1\x5e\x4d\x7e\xa7\x57\xa7\x56\xaf\x3e\xd5\x0c\x8f\x87\xeb\x3a\x08\x95\xc0\xdb\xe2\xef\x9d\x95\x65\xfd\x78\xc6\xe3\xd7\xaf\x9e\x5c\xc6\x7c\xae\xea\x09\x8d\x2e\xd3\xaa\xc4\xc0\xf8\x79\xdf\xf4\xf2\x6b\xe5\x16\xbe\x83\xea\x90\x96\xaa\x64\xdd\xa5\x5b\xbf\xd3\xa5\x8b\xb2\x94\x8c\x1d\x59\x1d\x3b\x28\xae\xb2\xf8\x69\x55\x9d\xe9\x99\xf9\xf8\x46\xe4\x97\x57\x98\x68\x29\x5f\x46\x3f\x73\x17\x85\x0a\x09\xf3\x76\x1f\xff\xfa\x55\x89\x15\xbd\x13\x56\x58\xda\x7e\xd1\x8d\x5a\x62\x0d\x5c\x10\xcb\x29\xb2\x2d\x6a\x65\xcc\xa6\xcf\x1f\x6e\x84\xa9\x75\x7f\xca\x5a\x4d\x30\x62\xa7\x08\x24\xa7\x3f\x05\x12\x7c\x4d\x81\xb1\x03\x0b\x48\x78\xfa\xb3\xd1\x96\x65\x1b\xbc\x5e\x5b\x1a\x7e\x69\x0b\xba\xca\x12\xb3\x74\xd8\xf9\xea\xa2\x6a\x15\xab\xfa\x9a\x55\x0b\x8d\x2b\x25\x11\xc1\x2c\x77\xf7\xb6\x24\x1a\x05\x69\xeb\x2a\x0d\x9b\x78\x32\xae\xdb\xf2\x71\x24\x5c\xd7\x88\x9b\x04\x65\xec\xab\x9e\x23\x91\xb2\x33\x9c\xa3\xb3\xdf\xd9\x48\x8f\x96\x90\xa5\xec\x02\x0b\x5c\xfc\xce\xa4\x7e\xb6\x26\x35\xb1\x27\x75\x83\xa4\xad\xf3\x4a\x17\x6d\x37\xf9\xce\x52\xb8\x6b\x55\x50\x2b\x11\xde\xb0\x2a\xef\xb5\x5e\x5d\xca\x8e\xb0\xbb\x47\x3f\xed\xee\x0a\x56\xea\x48\x19\x60\x35\xe1\x12\xd2\x54\x61\xe7\xab\x8c\x42\x9c\xde\x8c\xa7\xf7\x14\x9e\xb6\xb8\x5d\x35\x1c\x58\x17\xe8\x64\x46\xde\xda\x9c\x52\x9c\x10\x3f\x15\x8a\x56\x7f\x62\x3c\x93\x7d\x44\x65\xb1\x8f\xbc\x7e\xd8\xd8\xee\x74\xad\xb6\x07\xf8\x26\x54\x87\xa0\x2e\x2b\xbf\x94\x84\xd2\xfe\x34\xcf\xf8\x88\x56\x2f\x40\x55\x6f\x1e\x58\xbe\x21\x08\xd6\x4a\xa8\x91\x03\xc6\x16\x13\x91\x48\x6d\xe0\xe4\x49\xc6\x3e\xfb\xb9\xf0\x2e\xf1\xa9\x59\x8b\x15\x97\xda\x62\x18\xdf\x98\x8a\x51\xed\x18\x53\x1d\x70\xbd\x85\x3f\xbc\xf7\xe0\xde\xdd\x07\xbb\xc3\xdd\xdb\xf7\xef\xee\xec\x0e\xef\xdc\xe3\x3b\x0f\x76\xfe\x24\x7c\x6f\xa0\x9d\xe8\x7a\x5c\xb3\xd7\x07\xde\x80\x55\x21\x4b\x8b\x2e\x6d\x90\x44\x61\xb4\x34\xff\xc7\xf2\x2f\xcc\xa4\x2f\x7c\xd9\x13\x9e\xb4\x8b\xcd\xda\x1d\x93\x19\xd1\x77\xf0\x01\xcc\xa9\x9d\x6f\x6a\x16\x64\x7d\x3b\xb7\xfd\x78\xda\xe2\xde\xa3\x08\x1f\xcf\xd6\x58\xb9\xea\xdb\x26\x87\x54\x7a\xae\x5f\xcf\xfc\x3a\x44\xa8\xc7\x47\x9c\xa1\xfa\xbc\x2f\xbb\x8e\xe3\xc9\xa5\x25\x60\xee\xac\x35\x6e\x66\xa4\xab\x8a\xfd\x90\xc6\x99\xbb\x60\xb3\x5a\xbb\xaf\x5e\xca\xb2\x3c\xae\x13\xfd\x5c\x12\xe3\x30\x6a\x87\x82\xf0\x77\xbc\xfb\xd4\x9b\x37\xdf\x57\x5d\xfe\x1d\xdb\x13\x86\xee\x69\x0e\x57\x5c\x75\x4e\xd2\x0d\x42\x11\x07\xcd\x5b\xab\x73\xf8\x34\x65\xef\x56\x37\x42\x32\x23\x17\x39\xde\x5b\xb4\x2f\x85\xd6\xd3\xf6\xda\xc2\xa2\xe5\x94\x5e\xd2\x06\xc3\xa9\xbb\xdf\x97\x8a\x11\x16\x08\xe4\x02\x9d\x6d\x68\xa2\xfd\x78\x38\x85\x8b\xb5\x3c\xda\x10\xc2\xce\x87\x74\x24\x1c\xfd\x2c\xe7\x89\x9d\xf3\x20\x55\x24\x1f\xcf\x28\xbc\x4e\xd7\x69\x47\xf3\x8e\x82\xa5\x7d\x61\x39\x57\xce\xf6\x77\x7c\xd9\xb8\xac\xc9\x57\xb8\x5f\x68\x62\x9b\xb1\x21\x35\x8e\x20\x1b\xef\x3f\x52\xfb\x82\x3c\x4c\x49\x44\x8d\x57\xa7\xb4\x71\x06\x14\xd7\x2f\x70\x14\x2c\x0d\xe2\x10\xe6\x8c\x07\x45\x38\x22\xf3\xda\xd6\x63\x0e\xef\x55\x92\x6d\xeb\xc1\xa1\xd0\x4e\x7f\x83\x22\x64\x91\xfa\xd8\xa8\x3c\x51\x38\x4f\x6f\x10\x66\x18\xce\x31\x7c\x4a\x50\x93\xeb\x4d\x5a\x49\x4c\x1a\xec\xa6\x5f\xfd\x5f\x97\x28\x27\xde\x45\x5b\x44\x87\x06\xe5\xbe\xf0\x2c\x47\x64\x8f\xd2\x35\x0d\x69\x3c\xc3\x2b\x8d\xe2\x27\x99\x06\xb1\xcf\x29\x7b\xbc\xce\xd7\xfc\xe9\x0d\xb7\x6f\x7c\xda\x22\x1f\xcd\x3c\x1f\x86\x66\x29\xa8\x99\xb6\x84\x5b\x29\xe1\x31\xa5\xf0\xee\x7f\xb3\x72\xfb\x6d\x31\x74\xc8\x6e\xde\x51\x40\x9d\x6f\x16\x88\x70\x09\x22\xa7\xf0\x1e\x27\xfc\x73\x4b\x95\xcb\xde\x69\x9a\xdf\xfc\x1c\x4f\x03\x7c\xe4\xc1\xd2\x44\xda\x9c\x0f\x3a\x83\xf6\x99\xb6\xe6\x2a\x79\x5d\x46\xa2\x8f\x21\xa3\x8b\xb2\xe1\x99\x88\x0d\xcf\x40\x34\x2f\x4b\x5c\x54\x92\x69\xcb\x3b\x61\xa6\x5f\xf3\x58\x71\x97\x9c\xe9\x57\xca\x2c\x58\xcc\x28\x2d\x4b\x61\x74\xb6\xec\x63\x49\x2f\xf8\xcb\x0d\x5b\x94\x5e\x7f\xb7\x98\xe8\x6f\x6e\xd8\xc4\xcd\xeb\x09\x2a\xd7\x55\x7a\x93\x4c\xf9\x7a\xb9\xfe\x3e\xca\x96\x30\xef\xd8\x0d\x47\x95\xef\x80\x0d\xc2\xa1\x5a\xa7\x1d\xb2\xb2\x24\xcd\x9e\xdf\x1f\x52\x50\xd7\x33\x44\xa3\x68\xb1\x02\x82\x42\xa6\x7d\x49\x66\x44\xc0\x3d\x78\x91\x50\xdb\x4f\x48\xa3\x87\xd7\xeb\x8d\x68\x9e\x10\x85\xf1\xac\xfb\xaf\x58\x52\xf8\xb6\x61\x04\x2b\xd8\xf8\x7a\xb9\xd9\x56\xb8\x72\x01\xdf\x0c\xc1\x62\x2d\x3d\x4a\x2b\x99\xdc\xb2\xb2\x0d\xb0\x14\xa0\xd2\x1b\xb8\xfe\xd7\xcb\x0a\xd5\x9d\x48\xa2\xc7\xb7\x8e\x30\x02\x1e\x2e\xad\xeb\x89\xc0\xf7\xc8\xfe\xd6\xfa\x5c\x56\x27\x85\x2d\xc7\x03\x11\x0c\x42\x23\x84\x7d\x9c\xb2\xe7\x09\x39\x49\x29\x7c\xc7\xd0\x61\x6a\x5f\xa5\x37\x1d\x46\x41\xe8\x7d\x92\x68\x34\x54\xfb\x74\x7c\x96\xb2\x97\xeb\xe0\x53\xf7\x4a\xed\xdf\x97\xf9\x77\x2e\x1e\x45\xe8\xef\x83\x77\x89\xf0\xff\x56\x1b\xd8\x6b\x4f\xc5\xdf\x76\x7b\x9f\x52\x6d\xe0\xde\x2e\x6c\x6d\xcc\x0f\x56\x6e\xc2\x99\xf6\x31\xe9\xba\x8d\x7e\xdb\x29\x87\x87\x96\x5f\xa9\x17\xda\xa1\x94\xea\xf0\xab\x9f\x75\x18\xbb\xe7\xf4\x2a\xfd\xcb\x76\xf3\x4b\x0a\x4f\x7f\x5d\x76\xeb\xa6\xb2\x6f\x53\x76\x98\x10\xc7\x4a\x76\x28\x3c\xff\x75\x85\x93\x9b\x2a\xfc\xf1\xdb\x9d\xf9\x84\x4f\x82\x51\xf8\xf8\xaf\xba\xff\x61\x3e\xb7\x5a\xfb\x64\xba\x5f\x27\x3b\xd6\xea\xbd\x48\x57\x6b\xd3\x6b\x02\xa4\x92\x09\x51\x6d\x8d\xbe\xe1\x1e\x50\x53\x4c\xcb\xd5\x07\x31\xeb\x73\x51\xeb\x91\xfe\xa5\xae\x75\x41\x78\xd3\xb3\x95\x26\x5b\x64\x65\x33\x69\x52\x27\xa9\xe5\xff\xb2\x81\xba\xb0\xf4\xfe\x90\x0f\x86\x6c\x25\xad\xfc\x77\xd5\xf8\xf1\xf8\x14\xa9\x98\x7f\x95\xa3\x13\xd0\x23\xae\x62\xcb\x25\x85\xbf\x6e\x46\x1b\xe7\xab\x78\x4d\xa2\x05\x0e\x05\x94\x3e\x4a\x78\xa7\x5f\x3f\x05\xae\x75\x4e\x5a\x1a\x32\xe9\x66\x8f\x67\x35\x25\xa1\x35\x64\x52\xf6\x2d\x21\x14\xfe\xc1\xdf\xd6\x63\xae\x3c\xb6\x27\xc7\xba\x29\xdb\xe9\x2f\xb3\x4d\xea\xf8\x8a\x1e\x16\x5a\x27\xac\x72\x07\x16\xdf\xc8\x61\xaf\x13\x9b\xb5\xff\xdc\xbc\xed\x43\x21\xfb\xb7\x45\x2b\xa9\xac\x3d\x17\x49\xdc\x26\x7b\x34\xe1\x98\xb0\x33\x7c\xd2\x87\x8e\x2a\x5d\x3d\xd7\xc5\x53\x58\x2d\x76\x27\xa9\xb9\xad\x59\x73\xbd\xac\x3c\xaa\x70\xe0\x5a\xd0\x52\xd5\x80\xd5\x51\xe3\x24\xa0\x43\x2a\xa1\x88\x83\x92\x7f\x94\x69\xb8\x6e\x47\xf4\x31\x4a\x21\x62\x2f\x6c\xdd\x97\x73\x49\x92\x0d\x0a\xd4\xf8\x5e\x05\xaa\xf6\x66\x10\x29\x5a\xb0\x31\x6f\x50\x89\x6b\xac\xf0\xb6\xb2\xc1\x48\x3f\x38\xd4\x98\x01\x92\x55\x65\x0a\x35\x7c\xb1\xaa\x27\xba\xaa\x35\xd1\x68\x2d\xda\x8a\x0f\x99\xd6\x7b\x68\xa4\x0d\x46\xfb\x41\x51\xa7\xc2\x52\x0a\x91\x20\x0c\xe1\x9a\x55\xdc\x6f\x8e\xee\x96\xb1\x9d\xca\x17\x57\x68\x4b\x53\x97\x1a\x8c\x1b\xc6\x41\x4c\xaa\xd7\x69\xa3\x98\x5d\x26\xe4\x44\x52\x48\x31\xf4\x48\x52\x88\x31\x74\x25\xed\xeb\xbb\x0d\x9c\xf8\x00\x94\xff\x41\xea\x97\x9f\x36\x6e\xfa\x0d\x34\xc3\x45\xa5\x50\x52\x13\x38\x45\xcc\xfe\x56\x7b\x64\x8e\xbf\xad\x3d\x32\x8b\x1b\xb1\xbc\xa5\xfb\x38\x6d\x92\xab\x77\xfe\x8e\x63\xf6\xfd\x26\x0e\x44\x57\x2e\x61\x40\x61\x12\xb3\xa7\x09\x71\x62\x9e\xa4\x0e\x85\xd3\x9f\x14\xd8\x96\x4b\x18\x52\x38\xd3\x05\x66\x69\x9e\x0b\x87\xc2\xc5\x4f\x4a\xfc\xa9\x4b\x1c\xe9\x12\x22\x5f\x64\x53\x87\xc2\xc1\x4f\x4a\xf4\xb0\x53\x66\xfd\xbf\x8a\x7e\x34\x93\x7c\xd5\x58\xf2\xff\x5e\xcc\x9e\xcc\x48\xaf\xc7\xf7\x86\xb5\x0e\xda\x66\x31\xfb\x72\x09\xaa\x0b\xe2\x8a\x3d\x8a\x30\x54\x14\xc9\x69\xc6\x4e\xd3\x26\x72\x98\xb1\xb3\x56\xf4\x63\x22\xcf\xd8\x85\x95\x84\x09\x47\x3a\x41\xb2\x03\x0c\x9c\xf0\x59\x2e\x38\xfb\x8c\xb5\x9e\x24\xd9\x94\xbd\xab\x83\x07\x69\xca\xfe\x4a\x4d\xec\x2f\x7e\xc5\xde\xe3\xb7\x38\x2a\x24\xb2\xd8\x59\x7b\x20\x9d\x55\x9b\xdd\xb6\x06\x86\xe5\xb9\x2e\x18\x84\xed\xc7\xa2\xb9\xa7\x88\x31\xac\x5c\xed\x1d\xb6\xd0\x0d\x9d\x2d\xb2\xaf\x6b\x8e\x0d\x24\x23\xc2\xaf\x4d\x02\x3d\xb4\x17\xa0\xfe\xb0\xf2\xde\x22\xa9\x5a\xb6\x4a\x0f\x78\xb3\xbe\x70\x8e\xaf\xcf\x34\x9d\x6b\x6e\xb3\x03\x48\xd9\x00\x7d\x66\x2c\x24\xc9\xb7\x25\xa5\xa3\x68\x2f\x1f\xd1\x38\x48\xbb\xdd\x90\xa1\xe3\xec\x08\xa2\x2e\x6b\x2e\x8a\xb1\xee\x75\x7e\x3e\x8f\xe2\xf6\x83\xf9\x8d\xa5\x2a\xba\xd8\xd9\xa8\x18\x3a\x80\x44\xbf\xaf\x20\x6b\x47\x84\x39\x53\x27\xda\x28\x77\x5d\x92\x04\x99\x6a\x36\xb7\x1e\x20\xd7\x8d\x65\x71\x24\x57\x51\x20\x5f\xf3\x59\x31\x5a\xe1\xe2\x35\x1d\xca\x08\xef\x0d\xd5\x75\xa8\x65\x52\x9d\x30\xae\xa9\x7b\x19\x24\xbd\xa1\xed\x8e\x22\xa9\x97\xeb\x50\x12\xed\x5b\xf7\x49\xa2\x2e\x8a\xea\xf6\x5f\xc9\xdb\xa8\xe9\xdb\x74\x83\x35\xde\x86\xc1\x0b\x45\x70\x5b\x5b\x43\xfa\x27\x1b\x14\x34\x37\x5a\x2e\x0d\xc3\x1b\x76\x58\x20\xb4\x13\x7a\x74\xe2\x12\x2e\xa9\x17\x84\xab\x7e\xd4\x6c\xab\x5f\xb4\xed\x95\xb5\x8d\x3c\xaf\xdc\x4e\x1e\x48\x92\x20\xef\x43\xed\xc1\xc6\x41\x0e\x26\x0f\xeb\xe4\xe5\xb2\x1e\xf1\x2c\x17\xe7\xc5\x26\x57\x9b\xeb\x13\x71\x92\x6e\xf0\xc4\x61\x9b\xd9\x35\x47\x3f\xa9\x29\x88\xaa\x99\x42\x46\x99\x64\xb7\x52\x1d\x5d\x64\xf2\xe1\x15\x9b\xe9\x8d\x22\x78\x24\x39\xdb\x74\x77\x7c\x2c\x36\xea\x99\x3e\x44\xbd\x98\xaa\xea\x85\x10\xcd\x5e\xde\xe2\x6d\x57\xa3\xa8\x28\xd3\x68\x22\x25\x0a\x94\xfd\xc4\x6b\xae\xd9\x79\xcb\x93\x17\x6f\xf9\x7e\xc9\x9b\x06\xde\x25\xa7\x67\xf2\xe7\xad\x0c\xef\xfe\x5f\x35\x33\xe5\x27\xf9\x22\x8b\x39\x3b\x89\x74\x74\x16\x2d\x52\x59\xb0\xd7\xa9\x1d\x7d\xcc\xf9\x9c\x9d\x9b\x24\x2e\xd8\x61\x95\x3b\x8d\xae\xd8\x4b\x1d\x4e\x66\x33\x2e\xb8\xaa\xea\x32\x6f\x27\x3c\xbc\x62\xcf\x56\x92\x10\xad\xfe\xad\x13\x45\x3e\xbf\xc1\x11\xcb\xcd\x3a\xea\x99\x7e\x19\x42\x11\xfa\x28\x1f\x63\x89\x3f\xf4\x10\x93\xd1\xbd\x81\x3f\xf0\x14\x85\xe6\x05\x1a\x3b\xaa\x06\xda\x13\xf9\x2f\x5b\x19\xa8\x76\xb2\xde\xa6\xc6\xaa\xd6\xd6\xdb\xfa\x78\x96\xa4\xab\xc0\x65\xb6\xad\x65\xd7\x80\xaf\x65\x18\xfb\x89\xce\x00\x79\x3c\x56\x55\xff\x5d\x2d\x75\x15\xb3\x24\x4d\xd9\x3a\x0b\xe5\x46\x44\x6f\xa0\xc6\x27\x62\x83\xfb\x40\x61\x34\xff\xa0\x32\x8a\x19\x40\xc6\xf2\xf5\x77\x92\x6b\x94\x6c\x7b\x52\x27\x42\x1b\x93\x54\xaf\x3b\xb1\x9e\xa8\xde\x7e\x12\x14\x48\xc6\x32\xcd\xda\xcc\xf0\x09\xa8\x79\x4a\xb2\x2a\x63\x86\xcf\x40\x65\x4c\xec\x67\xfe\xc0\x9b\xa5\xc8\x4c\xda\xcb\x46\x94\x07\x42\xa1\x79\x69\x3d\xba\x67\x9a\xb7\x87\xbf\x4e\x7e\x54\xd7\x77\x7d\x84\x7e\x96\xde\xbc\xad\x65\x89\xe5\xd2\x48\xbe\x8a\xe6\x9b\xe7\x7d\x96\x91\x4a\x61\x13\x86\xad\xec\xb8\x47\x7e\x55\x64\xb1\x52\x64\x2e\xcf\xd6\xa0\xd2\x30\x87\xaa\x87\x28\x86\xda\x16\x08\xac\x5a\x44\x53\x8b\xe4\x19\x7b\x9a\x5b\xb1\x95\x6e\xfc\xca\x00\x67\xd1\xcc\x96\x29\xbf\xda\xa7\x5f\x55\x61\xcc\x0f\xcd\x9e\x68\x2a\x4c\x36\xf6\x04\x95\x29\xee\x0c\x77\xcc\x20\xf2\xef\xec\x61\x6a\x82\x7a\xa3\xfe\xa3\xe3\x22\x3f\x7f\x13\x25\xa2\xf8\xd7\x24\x02\xbe\x52\xd2\x90\x07\x89\x26\x0f\xb2\x40\x1d\x51\x21\x53\x27\x52\x7d\xc7\xd0\x9d\xa8\xea\xdf\x78\x20\x59\x7c\xa8\xb3\xac\xe1\x43\xb5\xca\x1d\x66\xbf\x53\xf2\xb0\x29\x79\x2a\xf2\xc5\xfc\xe1\x15\x3b\x43\xe4\x99\x64\x89\x4c\xa2\xf4\xf7\xd6\xad\xc2\x49\xbd\x61\x3d\xd3\x49\x26\xb9\x28\x38\x16\x65\xcf\xf3\xd5\xa4\x87\x57\xec\xc7\x5a\x22\x62\xe0\x8f\x55\xf2\x05\x17\x92\x7d\x4e\x9b\xc8\xc3\x2b\xf6\xce\x44\xf3\xaf\x5c\xed\x86\x0b\xdd\xd3\xca\x09\x0d\x93\xb1\x8a\x7e\xe5\x57\x0f\xaf\xd8\x51\x54\x85\x0b\x76\x92\x9a\xe0\x61\xc6\x0e\x31\x72\x1e\xcd\xd9\x41\x54\x85\xfe\x52\x99\x6e\xe0\xd7\xb6\xb8\x8a\x0a\x95\xad\x7a\xc3\x45\x83\x51\x7c\xef\xc0\xbc\xcc\xa6\x45\x43\x62\x59\xd5\xfe\x37\xda\x1e\xfe\x2f\xd4\x9f\x81\xfd\xf6\x9b\xa9\x5f\xc6\x67\xff\x7f\xf6\xde\xbd\x2d\x6e\x5b\xeb\x1b\xfe\x2a\xc6\xbb\x9b\x6d\x07\x31\xf1\xf9\x30\xd4\xe5\xa2\x40\x12\x5a\x02\x14\x48\xb2\x5b\xca\xc3\xed\xb1\x65\xc6\xc5\x63\x4f\x6d\x0d\x81\x66\xf8\xee\xef\xa5\x83\x6d\xf9\x30\xc3\x40\x92\x36\xf7\xfb\x3c\xf9\x23\x8c\x65\x49\x5e\x92\x96\xa4\xa5\xa5\xb5\x7e\x0b\xf6\xb2\xc8\x4d\xda\x14\x3c\x58\xd6\x93\x3c\x9b\xc2\x1c\xdd\xf7\x4f\x27\x12\x79\x38\xe7\x05\xc1\x09\x9c\x64\xf1\x5f\xd0\x3b\xa1\xbd\x05\xf3\x6b\xe8\x1d\x26\xd5\x6f\x32\x64\x27\xec\x19\x8d\xb3\xd0\xcb\x83\xfa\xe1\x38\xf2\x52\xfa\x18\xdf\xc5\xa9\x17\x93\xdf\x29\xbc\xc6\x42\xce\x3d\xa9\x30\x45\xe3\x9d\xfc\xba\x8f\xfe\xf2\x90\xd5\x08\xde\x50\xbd\xbd\x63\x87\x5b\x4a\x64\x36\x89\x91\x77\x9f\x94\x3f\x7f\x5c\xd0\x3a\xa2\x65\xbe\xf7\x25\xa2\x21\x66\xed\xcb\xb0\x74\xd0\xf3\xf9\xdf\x7c\x49\xc3\x1f\x20\x79\xf2\x10\xe6\xad\x4a\x1b\x88\x67\x3c\x44\xce\x5b\xaa\x78\xe1\xf0\x53\x2e\x2e\x87\x17\xe8\x52\x06\x58\xe0\x66\xc2\x10\x89\xbf\x51\x7a\x56\xe2\xf7\x79\x69\x8a\x4e\x22\x24\xd1\xaf\xde\xc2\xdc\xf3\x83\xf2\xe7\x4e\x7e\x5d\x78\x7f\xfa\xe5\xe3\xfe\x2d\xcc\xef\xbd\xa4\x7a\x7d\x96\x4d\xa0\x17\x90\xc7\xa9\x9f\x93\x99\x7b\xe3\x73\x4f\x74\x11\xdb\xab\x93\xc8\xc4\x3c\xa6\xcf\x71\x70\xe3\xfd\x99\x94\x3f\x7f\xbc\xf7\x6e\xe8\x43\xc9\x2b\xb3\x80\x7f\x3c\x8e\x96\xca\xc8\x7d\xe0\x43\xec\x56\x8e\x1e\x7f\xa7\x38\xf9\xa7\xac\xfc\x89\x8f\xa7\x7f\xf0\x4f\x9d\x9e\x5e\xd5\xab\xaf\xf6\xa8\x85\x0f\x5c\x7d\x84\x47\x9f\x59\x23\x71\xa4\xe5\x6a\x43\xde\xcf\x84\xd4\xdc\x4f\xaf\xa1\x57\x04\xd5\x6f\xda\xbf\x53\x9a\x00\xfd\xfc\xda\xfb\xe8\xd3\xdf\x7f\xc0\x00\xad\xb4\xe1\x33\xce\xc4\x7b\x3e\xe5\x80\x1c\x4e\xb2\xdb\xfe\xe3\x00\xbd\x45\xeb\xf3\x4c\xab\x2e\x94\x08\x1a\xd2\xc5\x25\x68\x49\x3d\xd5\x52\xd3\x08\x3c\xe2\x33\xd0\x29\xc9\x07\x29\x80\x44\x96\xa2\xaa\x32\x5f\x06\x71\x79\x67\x56\x9d\x5f\x89\xe3\x63\x5c\x2e\x42\x39\x2c\xda\x0d\x7c\xa2\x41\xec\x1b\x7e\xcf\x46\x6c\xcf\x66\x75\x13\x80\x74\xef\x3b\xd2\xeb\x85\x3f\x99\x26\xf0\x0c\xaf\x47\x0b\x2f\x5a\xfa\x95\x0a\x54\xa3\xc0\x7a\xfc\x43\x3e\xfc\x40\x7a\x9c\x1d\x9c\x0a\xd8\x95\xc3\x5b\x2c\x0c\x87\xbf\x56\x17\x81\xac\x48\x0f\x5b\xf1\x4b\x42\x9f\x9d\x46\xba\x9d\x0e\x63\xd0\xad\x13\xa4\xac\xd6\xf1\x2c\x8a\x92\xbe\xf5\x88\x51\xfe\x6b\x3e\xfc\x39\x25\x86\x31\x24\x7b\x12\x07\xdd\x9e\x78\xfc\x04\xf1\xa8\x28\xbd\x2d\x51\xc0\x89\x54\x1e\x72\xeb\x98\xc2\x7a\xb1\x0e\x47\x46\xc5\x67\x50\x05\x22\xab\x76\xff\x22\x23\xfb\xf5\xc4\x2f\x1f\x60\xf8\x2e\x8d\xff\xec\x5d\xe7\x39\x31\x02\xc5\x12\x6c\xd4\x41\x8b\x2d\x5a\xcf\xdb\x45\x1b\xde\xcd\xa4\x8a\x69\x12\x2f\x1c\xda\x15\xce\x13\xc8\x23\x6e\xf6\x52\xd9\xe2\xe9\x30\xff\xe1\x87\x1f\x14\x79\x9b\xbb\x6a\xeb\x62\x36\x20\xce\x10\x7e\x2d\x27\xbc\xbc\xbe\x4e\x00\xb5\x62\xfa\x1b\xe1\xb3\x3c\xc3\x57\x27\x96\x42\x24\x54\x19\x05\x03\x41\xcc\x73\x9f\x92\x9f\x43\x3f\xfc\xbc\xa9\xc5\x0f\x1f\xa7\x59\xeb\x87\xa5\x27\x80\x59\xb1\x47\xc2\xdc\x28\xbc\x15\xc5\xfa\xfa\x01\x92\x62\x90\xf2\xc8\x3a\x71\xb9\xfb\x22\x3f\x4e\x56\xd2\x15\xd5\xde\xdc\xdf\x95\xee\x08\x65\x53\x91\x7f\xb3\x70\x4e\xf7\x08\x9a\x8b\x0f\xd9\x8d\x1a\x3f\xeb\x88\xfd\xd8\x01\x9b\x3b\xce\x57\xdf\x7a\xd6\xe1\x58\xe5\xcf\xc7\xb8\xaa\x67\xd4\xc2\x95\x5f\x70\xe2\x23\x70\x7d\x74\x27\xc3\xac\x82\x50\xb2\x68\xe9\x58\x53\x40\xfc\x14\xa7\x28\xf6\x81\xd2\x85\x26\xf5\x44\xe6\x3f\x53\xbb\xc1\xb0\x84\x61\x0a\xe2\xa5\x5e\x32\xb1\x0c\x98\xdf\xd6\xa7\xba\x08\xf3\xb4\x19\x22\x50\xe7\x2b\x59\x6f\x9c\xcf\xbc\x82\xac\x32\x28\xa3\xba\xec\x59\x42\x9f\xe8\x29\x6d\x8f\x7f\x3a\x48\xbd\x8f\xd5\x73\x63\xf1\xae\x7a\xa9\xf4\x74\x94\x20\xb8\xc9\x64\x16\xb4\xf6\x02\x5e\x0e\xf7\x63\xa9\x8a\xe1\xc8\xbe\x9d\x9d\x24\x7e\x9c\x1e\x13\xcb\x5f\xef\x9c\x56\x9c\xfb\x69\x11\x65\xf9\x64\x41\xd7\x92\xea\x41\xec\xa5\xf3\xf9\x5f\xd4\x3c\xd7\x4f\x98\xd9\x25\xdb\x97\x8d\x12\xdb\xba\xc2\x8b\xee\x62\x88\xe1\xb5\x97\x40\xc5\x66\xc3\x8b\xcb\x21\x03\xca\xfd\xc9\x97\x32\x79\xbb\x42\x07\x1c\x56\x50\x2d\x52\xbc\x3d\x41\xc3\x2b\xb2\xe1\xb5\x0f\x16\x15\x6f\xe4\x80\xa6\x54\x27\x8b\x59\xea\xe7\xf7\x7d\x3d\x44\x9c\x1d\x99\x9a\x61\x96\x62\x21\xf2\xc7\xac\xfa\xfd\xe3\xbd\xf7\xdf\xfa\x89\xec\x90\xd0\x67\xcf\x8f\xae\xfe\x31\xbf\xfa\xcf\x56\x5c\xf7\xe3\xbe\x75\x1f\x17\xee\x6c\xcf\x9c\x8c\xb0\xd0\x5f\xbd\x53\x73\xcc\xad\x51\xb3\xb4\x2d\x28\xb4\xc5\x84\xf9\x9c\x85\xb8\x65\xf9\xff\x8a\xa7\x1e\xf2\xab\xdf\x84\xa4\x9c\x3e\x4f\xc3\xb6\xa6\xb7\x57\xea\x60\xb1\x6e\xa3\x58\x2a\x8f\x05\xb4\xe4\x17\x10\x3e\xf8\xaa\x4b\x01\x84\x02\xe5\x78\x77\x49\xfd\xf0\xa8\x1a\x81\x18\xc2\x70\x6a\x84\x8f\x31\x1a\x67\x33\xe4\xa5\xa4\xa1\x1f\xb3\x3c\x2c\xbc\x9f\x48\x85\x1f\xf3\x45\x8b\xd3\x8d\x2f\x45\x31\x33\xab\xc4\x39\xef\xb2\xdc\x8b\x7d\xf6\xeb\xc7\x7b\x2f\x2b\x7f\x93\x76\xfb\xe4\x09\x77\x6e\x52\xfe\x62\xb3\xb0\xb7\xf2\x22\x96\xe0\x7c\x7e\x71\x09\x10\xf9\xff\x0f\x26\xc2\x55\xa5\x16\x6b\xc9\x5a\x25\x7f\x4d\xab\x92\x84\x8e\x80\x7c\x1d\xa6\x28\x8f\x61\xb9\xd4\xb0\xa7\x6a\xa9\x81\x77\x08\xa6\x21\xbb\xd2\xa3\x0f\xe5\x85\x5e\x1c\x48\x37\x39\xb8\xc9\x65\xfc\xca\x0f\x43\xef\x9c\x9c\x1e\x7c\x84\xe0\x64\x8a\xbc\x3f\xe8\x05\x81\x3f\x81\xc9\xae\x5f\x40\xef\x35\x7b\x9e\xc6\xc8\x4f\xb0\x08\xfc\x9e\x26\xc0\x38\xf1\xae\x48\xc9\x20\xf1\x27\x5d\xbd\x75\xa5\xbb\xa3\x8e\x90\xf4\xea\x1f\x0b\xef\x6b\x65\x82\x54\x46\x1d\xc1\xa7\xd1\x7c\xa8\xc8\x00\xb1\x77\xc8\x2b\x23\x93\xc8\x58\x84\x40\xe4\x5d\x2a\xd1\x28\x1d\x95\x30\x4c\xe0\x9d\xfa\xb8\x84\x28\x20\x0c\x2e\xd3\x22\x4d\x20\xc9\x68\xb6\x32\x2e\x9e\xc1\x34\x3b\x58\x02\x47\x53\xd7\xf4\x48\x2d\xc6\xe3\xb5\xb0\x8b\xa1\xf3\x6c\xd9\xdc\xc7\x42\x1f\xed\xf2\x51\x7d\x7a\x09\xe1\x68\x96\xe7\xde\x3b\xfe\xe2\x62\x79\x35\x90\x7a\x69\x11\x84\x74\x52\x28\xbe\x8d\x43\xe8\x5d\x07\x94\xb7\xc2\xa2\xf7\x30\x5b\x1a\x19\x31\x11\x93\x1d\x00\x39\x58\xb6\x5a\x64\xa7\xf6\xe9\x39\x96\x3a\x2b\x23\x48\x29\xdf\xac\xec\x02\xe5\x1f\x88\xfb\x4c\x85\x20\x91\xe1\x81\x27\xa4\xc0\x3f\xbd\x3b\xca\xf0\x45\xe0\x4f\x7b\x0f\x29\xb5\x54\xfc\xa1\x32\xff\xae\x4d\xd1\xde\x80\xff\xa2\xf2\x30\x4d\xeb\x38\x85\xd7\xfb\x77\x7d\x0c\xc1\x9b\xb2\xc1\x9e\xaa\xfe\x0b\xc4\xdf\x7f\xff\x6e\x5d\xac\xaa\x23\xda\x90\x25\x7b\xee\xf6\x2e\x1a\xce\xd2\xad\x5a\xf4\x6f\x8a\xf9\xb1\x0c\xd2\x8e\xca\x3d\x4e\x43\x2f\xf4\xcb\x9f\x07\x69\x08\xef\xbc\x77\x59\xf9\xfc\x33\x5c\xa4\x65\xe2\xf1\xa7\xae\xd2\xba\xb2\x43\xbf\x40\xde\xb9\xcf\x3f\xd2\x4a\xdf\x66\x7c\xda\x6a\x15\x5f\xa7\x95\xae\x3a\xcb\xbd\x31\xe1\x0f\x16\xe6\xc5\xbb\xf2\xb9\x27\x2a\x03\x5f\x97\x49\x8d\xe5\xbc\xc7\xb0\x13\x0e\x43\xae\x27\xc0\x41\xc2\x3e\x83\x4b\x76\xc5\xe9\x9e\xe2\xe7\x0b\x8a\x1f\x7f\x5c\xf0\x65\xb8\xbe\x7e\xd5\xed\x7c\x52\x60\xc9\x07\xe1\xfa\xfa\x75\xa7\xd4\x35\x44\xde\x3e\x99\x6c\xd7\xc8\x7b\xed\xd3\x1f\xd0\x7b\x4f\x7e\x8d\xfd\xb6\x16\xb6\xad\xce\x66\x16\xe0\x13\xd6\xb5\x63\x1f\x2f\xe3\xbb\xa4\xbe\x31\x3e\x88\xfd\x42\x55\xd3\x21\x4c\x51\x8c\xee\x3d\x48\x3a\x3d\x4e\x83\x64\x16\xb6\x34\xbc\x74\x37\x86\x0c\xc2\x03\x0e\xef\x98\x3f\x49\xbe\xbe\xbe\x96\x6e\x93\x09\x38\x54\x18\xc0\x5a\x27\xda\x37\xbb\x8e\x8a\x72\x29\xde\xc8\x09\xb2\x1a\xf5\xd3\xc9\xbf\xc7\x6b\x32\x1c\x10\x98\xbb\xe3\x88\x1c\x15\x7f\xd8\x54\x87\x6b\x6b\xf1\xfa\xfa\x47\xc4\xf8\xf9\x87\x4d\x95\x29\xe0\x49\xae\xd5\x4f\x3f\x9f\x89\xfe\xc6\x08\x60\x8b\x66\x9c\x9e\x12\x0d\xd9\x42\x35\xcd\x53\x02\x7c\xd5\x83\xfe\x03\xc1\x5b\x25\xb3\x16\x7e\x1f\xd1\x9f\x0f\x55\xd8\xa8\x6a\x43\xa2\x37\x04\xde\x19\xbd\x2e\x28\x76\x4a\x03\x08\xef\x9d\x5f\xa6\xe0\xa3\xc2\x5b\xfe\x89\x22\x1c\x7b\xaf\xf8\xb4\xc3\xf8\x06\x8f\x61\x2b\x85\xc9\x1a\x6f\x58\xfa\x8f\x14\x08\xba\x67\x15\x5b\x53\x68\x60\x04\x12\xac\xb6\xe3\x1e\x76\xf5\xc0\xca\xd3\x0f\xff\xc5\xaa\xdb\xc3\x72\xe1\x07\xf6\xb0\x9f\x40\x4c\x78\xdf\x96\xc9\x2a\x23\x55\x0f\xd2\x2c\x84\xe7\xf7\xd3\xda\xb5\x93\x15\x9f\x4c\x51\x53\x88\xef\x18\x58\xd3\x73\xde\x2f\xb4\xb2\x12\xaa\xbc\xcf\x39\xae\xd7\xed\xa8\x98\xe2\x6d\xa2\x79\x98\x29\x91\xce\xcb\x0f\x54\x0c\xc6\x7b\x7d\x91\x03\x8f\xb7\x43\x8e\xd6\xbf\xd5\x39\x8b\xf8\x2f\xe2\x04\x45\xcc\xfc\xcb\x64\xe2\x8b\xc0\xab\x30\x2b\x87\x01\x28\xc7\x91\xc4\xc3\xf0\xd4\x4e\x8e\x65\xeb\xca\x9e\xf8\x73\xe6\x27\xfd\xd3\xff\x2c\xad\x45\x76\x96\xb1\x77\x93\xa5\x13\x47\x5a\x00\x3f\x95\x0f\x63\x79\x9b\x18\xb3\xca\x35\x54\x15\xf5\x3e\x39\xe3\x54\xc9\x6b\x6b\x69\xf9\xa1\x3c\xcf\x72\xef\x57\x36\xd0\xaf\xe2\x34\x46\x7d\x7b\x6a\x9f\xab\x2b\x89\x80\xc6\xaa\x29\x9d\x6e\xbd\x9f\x58\x4d\x07\x29\x82\xd7\x30\xf7\xfe\x60\xcf\x34\xa6\xbe\xf7\x33\x7b\x7c\xeb\x4f\xbd\xff\x56\xbf\x51\xb0\x40\x36\x62\x1e\xe3\x23\x46\x7a\x56\x89\x34\xac\xd4\x32\x9d\xfa\xe2\x1e\x02\x7c\x7d\xd5\x64\x2d\x8e\xfc\xa3\xde\xb3\x61\x42\x98\x12\xae\x79\x1b\xb0\xca\x89\xe2\x5b\xd8\xe6\xe8\x31\xe1\x96\x5a\x2d\x71\x04\x25\xf1\x5d\x5a\xcc\xa6\x53\xa2\x42\x14\x82\x2c\x87\x9b\x7f\x14\xc2\xac\x80\x03\xe1\x3c\xbf\x17\xc6\x08\x4d\x8b\xe1\xcb\x97\xe9\x74\x52\x0c\xe2\xec\x65\x01\xfd\x3c\x18\x6f\xff\xe9\x4d\xb3\xf4\x3e\x8a\x93\x64\x20\xf2\x51\x12\xaa\xce\x3e\x8a\x17\xde\x87\x7a\x5e\x45\xe3\x2c\x59\x92\x8b\xcb\x86\xc7\xd5\x83\x6c\x8d\x62\x8b\xca\x77\x3e\xff\x48\xd6\x9f\x1f\x59\x12\xaf\x6d\x40\xac\x14\x13\xa0\x72\xf6\x78\xe6\x47\xb0\x1c\xff\x1e\x0a\xfe\xa0\xb3\x1c\xfe\xe0\x6d\x16\xcc\x45\x9a\x95\x83\xc8\x4b\xcb\x3a\xc8\xd4\xf7\xe2\xf2\x91\x78\xb9\x7a\x19\x7b\xc4\x8b\x4c\x48\x57\x4f\x9f\x25\xbd\x4b\x43\x18\xc5\x29\x0c\xfb\x6f\xf1\x3c\x2f\x66\x5f\xf9\x00\xfd\x9b\xa6\x0d\x43\x7b\x31\x63\x3e\xbb\x23\xae\xc0\x19\x5c\xb6\xfa\x55\x3e\xe6\x2c\xeb\xa5\xe8\x51\x6f\x75\x52\xc3\x1f\x59\xfc\x88\xb4\x23\x8a\xc3\xb7\x88\x0b\x57\x01\xc8\x45\xf1\xc8\x1f\x91\x13\xd7\x5b\xd2\xc2\x04\x8b\x6d\xbf\x66\xe5\xcf\x83\x2f\xb0\xaf\x66\x5e\xda\x05\x36\x2d\xb1\x4d\xe5\x45\xc0\xa6\xa8\x2f\xa6\x58\x6d\x07\x97\x6f\xa8\x14\x76\x3c\x8e\x24\x82\x36\x5e\xfb\x74\x0b\xd5\xe7\x52\x6a\x93\x92\xc9\x43\x02\x93\xfa\x1a\x31\x84\x54\xd2\xba\xd2\xab\xc2\x7b\x95\x54\xcf\xaf\xe2\xbc\x40\xde\x2f\x34\x01\x79\x09\xfb\x01\xbd\x80\x5d\xa4\xdf\x3d\xa6\xd6\x29\x30\xad\x30\x00\xc7\xa9\x3c\x8c\xd9\x55\xf4\xdd\x2a\xaa\x9d\x22\xad\x55\x3b\x7c\xe9\xfe\xcd\x56\x78\x8f\xc8\x77\xe4\x2a\xd3\xa2\x6f\xbc\x47\x9c\xca\x88\xe6\x8e\x7b\x6b\xec\x6b\xc5\x7d\x4d\x47\xbc\xf0\x0b\x0b\x5b\x51\x97\x2e\xd0\x6c\xc4\x8c\x6f\x83\xf2\xf9\x95\x9f\x14\xd0\x0b\xab\xe7\xb6\x52\xa3\xac\xff\xd3\x43\x55\x05\x9b\xad\x9d\x2c\xa2\x58\x65\x39\xcf\x67\xb0\x9b\x81\xed\x8c\x93\x59\x82\xe2\x69\x72\xef\xdd\xd2\xbb\xf9\x45\x67\x65\xbe\x45\x77\xf8\x15\xb3\xab\xa1\x8d\x49\xb3\xdd\x2c\x8d\x92\xb8\x8f\x58\x21\x40\x83\x2b\xcc\x8b\x24\x34\x99\x44\x9e\xf6\x20\x8d\x6d\xcc\x0a\x67\x53\x2f\xa3\x9f\xcf\x3e\x7a\xfb\xec\x8a\x3a\x5c\x74\xca\x65\xa7\x5b\x09\x79\x94\x86\x6d\x9f\x78\x2c\x12\x39\x66\x0d\x1f\xc3\x7f\xe0\x00\xf0\x99\x18\x2b\xa1\xcd\x54\x7e\xa9\x95\xb3\xe0\x75\x2c\x15\x48\x8a\xf1\x16\xb4\x01\x37\x5e\xc7\xd2\x8c\x3d\x3d\xb0\x6f\xef\xa7\x4f\xff\x7c\x29\xda\xae\xaf\xa7\xdf\xa3\x6d\x52\x2d\xda\x4c\xb9\xfb\x63\x3f\x3c\x43\x7e\xde\xbd\x8f\x78\x5a\xc5\x55\xb5\x04\x58\x96\x56\x9c\x17\x78\xd9\x5f\xb8\x1f\xd3\xfb\x28\xa2\xc0\xf1\x94\x21\x89\xf8\xe0\x6d\x20\x19\x5c\xe5\xcc\xbb\xac\x3c\x56\x23\xe2\x1d\x06\xd0\x7c\xce\x96\x84\xdc\x4f\xc3\xac\xab\xcc\x8e\x23\xa9\x19\x02\x65\xe9\xf5\x59\xa9\x79\xe2\x23\x2d\x95\x5a\x96\x4a\x1d\x35\xec\xbe\x85\xe4\x18\x04\x01\xf4\x62\x12\x14\x88\xd4\x42\xaf\x62\x24\xe8\x29\x00\x79\xaa\x3c\x94\x20\x73\xd6\x67\x2f\xa8\x57\x8b\x22\x0f\xd9\x11\x43\x06\xf0\x07\x54\xae\xce\x70\x0b\x92\xcf\xa5\x0f\xb8\x05\xf3\x39\xfc\xb7\x3a\x9f\xa3\x7f\xab\xa5\xaa\xfd\x3a\xaf\x2d\x99\xc3\x5c\x82\x1b\xd9\x0b\x09\x6d\xc2\x8d\x18\x49\xa2\x0a\x37\xc5\x0d\x49\xca\x36\x44\x51\xae\xc2\x5e\xc8\x78\x59\xae\xae\xc5\x5f\x71\x92\x64\x0e\xc3\xd9\xc2\xcb\x59\xaa\x92\x38\x44\xc3\x57\x08\xc4\x1d\x7b\xef\xef\xf5\x6a\xb5\x2e\x97\x0e\x43\x06\x39\x88\x41\x92\xf2\x95\x2f\xbb\xdd\xa2\x5f\x38\x79\xf2\x17\x82\xea\x0b\x53\xe8\x2f\xe4\xa8\xe5\xb7\xec\xbf\xa4\x12\x53\x47\x55\x75\x61\xee\x5a\x62\xe8\x0e\x10\x99\x02\x04\xb5\xaa\x9c\xb9\x15\xa9\xdb\x68\x88\x2a\x0e\x25\x41\x55\x21\xc1\xa3\xa2\x55\x17\xb3\x64\x51\x1f\x10\x18\xa8\x6e\x38\x28\xea\x1a\x3f\x9f\x4b\x99\xa7\x12\xde\x6a\x19\x42\xf0\x21\xb3\xca\x30\x51\x97\x5b\x3e\x63\xe2\xd4\xcb\x80\xef\xe5\x98\x1f\x7f\xf2\x25\x5f\xde\xf6\x4b\xa4\xe6\xa1\x5f\x7b\xb7\x13\xda\xb2\x59\x1a\x7a\x47\xd4\x22\x64\x96\x1e\xa4\xbb\x59\x8a\xe0\x1d\x66\xd0\xca\x94\x61\xf1\x4d\xff\x5f\xf9\xf0\x2f\xee\xa6\xbf\x69\xf2\xd0\x73\x8e\x13\x94\x05\xe8\x1e\x74\x15\xe9\x3d\x84\x55\xa3\x59\x1e\xc4\xb6\xe9\x09\x6c\xc8\x9f\xb8\xe8\xf7\x53\xff\x06\x12\xd1\xe0\x0d\xd9\xf6\x8b\x6c\xb2\x9c\xb7\xef\xd1\xf0\xc7\xa7\xa9\xdb\xe8\x75\x3f\x55\x88\xf5\x6e\x41\xff\xe5\x66\x17\x97\x79\x89\xb5\x50\xdc\x30\x0a\x6a\x17\x6c\xc9\x70\x8b\x81\xbf\x09\x1e\x65\xd9\x3c\x46\x05\x71\xe4\xfe\x3e\x27\x61\xa6\x20\x09\x4f\x52\x75\x7b\xfa\x50\xca\x7a\xdc\x17\x6b\x65\xdf\x92\xb6\x55\x92\x58\xab\xcc\xaa\x4d\x5c\x54\xbe\xd3\xd2\xda\x01\xbf\xde\xd6\xcb\xf6\xd7\xa4\x6c\x12\x8c\x4f\xd2\xc0\x9c\x6f\x60\xde\x6a\x20\xde\xd4\x08\x6f\xfc\x95\x54\xcf\xfd\x7a\xea\xea\x50\x70\xc5\xf4\x61\xb5\x7a\x89\xd3\x4b\x57\x14\x95\xfa\x6c\x50\xab\xa3\xf3\x8d\x4a\x51\x5d\xea\xa5\x8b\xd9\x08\xe5\x7e\x80\xbc\x1d\x2a\x38\xcd\x26\x8f\xc9\x72\xbf\x30\x49\x71\xa8\xb0\x0a\x26\xab\x08\x72\xbf\xf0\x62\x23\x2b\x8a\xe0\x64\x9a\xf4\x5d\xe4\x51\x66\xe1\x72\x9c\x41\x84\xe2\xf4\xba\xd8\xea\x9b\x0c\xb5\xfe\xfe\x36\x91\x3e\x3d\x00\x04\x52\xf0\x81\xe1\x17\x92\x60\xef\x65\xfa\x20\x9e\xe0\x33\x6d\x01\xd2\xea\xd7\x87\x58\x06\x81\x37\x4a\x68\x78\xe0\x5f\x91\x94\x80\x40\x06\x85\xa7\x80\xa9\x87\xa8\x79\xed\x34\xc3\x14\xcc\xe7\x63\x08\x22\x4f\xbc\xba\x9a\x0a\x1b\x9e\xf0\x1f\x11\x84\xde\x3e\x94\x24\xc4\x94\xf1\xf8\xbd\x3c\x28\xb2\x59\x1e\xc0\x0d\x71\x2e\x6e\x4c\xf9\x07\x82\xf4\xf1\xc7\xf6\x0c\x0e\x5b\xb9\x70\xf9\x5b\x3f\x99\xb1\x2f\x70\xef\xbe\x13\x81\x78\x2d\xca\xe0\xdc\x13\x5f\xbe\xfc\x97\x40\xd3\xdf\x9d\x1e\x7a\xe2\x86\xc4\x81\x4b\x55\xe9\xa2\xbc\x2d\xa1\x41\xf5\x48\x36\xda\x72\xdd\x7f\xf9\x7b\xf1\xf2\x1a\x88\x82\x28\x0f\xc5\x24\x0b\xfd\x62\x5c\xf7\x2c\x29\x50\x5c\x88\x1b\xc2\xc6\x06\x44\x1b\xe2\xa5\x28\x6f\x88\xbf\xa7\xe2\x56\x7d\x5f\x10\x36\x10\x09\x40\x8a\xf7\x52\x10\xd4\xc7\x41\x02\xaa\x10\xcb\x20\xda\xf0\x4a\x5e\x2b\x40\x50\x7f\xfe\x16\x02\x98\xcb\x20\x27\x07\xb5\x35\x05\xe7\x13\xff\x23\x6c\xfc\x9e\x5e\x5d\x41\x49\xdc\xc8\x37\x44\x19\x3f\xfd\x47\x94\x41\xb2\xbe\x2e\xf9\x55\x9e\xad\xdf\x53\x71\x23\xd9\x10\xb7\x70\x56\xd6\xef\x14\xa0\xa1\xaa\x42\x92\xae\xae\x90\xe0\x09\x92\xb8\x91\x6e\x88\xb2\x2c\x78\x1e\x39\x9f\x0a\xdb\xc2\x7f\xfe\x23\x0c\x85\xab\x2b\x54\x55\x5e\x78\x41\x35\x01\x08\xf0\x43\xf5\x11\xc2\x2b\x57\x3c\x68\xd7\xad\x9f\xc7\xfe\x28\x81\x14\xb1\xab\x7c\xc2\x53\xfa\x8a\xac\x00\x09\xbb\x58\xb9\x6a\xab\x4e\x0e\xd2\x5b\x3f\x89\x43\xe1\x7f\xca\x32\xff\x23\x64\x04\x72\x4e\x98\xfa\x45\x01\x43\x21\x4e\x51\x26\xfc\xcf\x55\x35\x02\xff\x23\xca\x34\x8a\x50\xe4\x89\x24\xe4\x92\x94\x8d\xfe\x90\x85\x4f\xb8\xed\x11\x1e\x8a\x07\x4c\x60\xe4\x49\xfe\x76\x54\x75\xe9\x3b\x2c\x6a\x0e\xa3\xba\x8f\xdf\xd2\x08\x3b\xd5\xf3\x2b\xfc\xbc\x25\xca\x98\x67\xab\xd1\x13\x37\xa4\xab\xf9\x5c\xcc\x46\x7f\xe0\x41\x66\xdf\x90\xae\xf0\x41\x1e\x27\x0a\xf3\x39\xf9\xb8\xe0\x09\x9f\x1e\x64\xdc\x2f\xf2\x86\x48\x7a\xe6\x0a\x01\x01\x8f\x80\x27\xfc\xe7\x3f\xe2\x86\x94\x6d\x8b\xf8\x19\x0a\x9e\x70\xc5\xf8\x9f\x3a\xfc\x4b\x3e\x7d\x83\xab\x20\xe7\xb3\xda\x5f\x99\xe8\x13\xb6\x7e\x4f\x4b\x62\x84\x69\x1e\xa7\x48\x92\x85\x4f\x02\x1b\xdb\xab\xab\x3f\x68\xf7\xd7\x92\x8d\xf0\x9f\xff\xc8\x02\x6e\xff\x50\xa4\xe4\x44\x1b\x22\xe3\xba\xab\xab\xe9\xef\xe9\x03\x1d\xb9\x6b\xef\x8f\xa4\x07\x5e\x71\x07\x4a\x01\x38\xaf\x4a\x88\x1b\x91\x5c\x45\x67\x9a\xc9\x0f\x64\x1b\xba\x66\x53\xc6\x8b\xc0\xaf\xbe\x74\x5d\x8e\xe6\x75\xb9\xfb\x5e\xd3\x95\x2a\x9e\x74\xac\xd0\xe3\x48\x92\x98\x99\xb5\xfc\xbd\x3a\x9f\xc3\x1f\x8a\x36\xd8\xf6\x94\x86\x38\x83\x60\x2a\x6f\x95\xd0\x1a\x70\xd3\x9b\x72\x88\x22\x6f\x90\x94\xe2\x1d\x71\x63\x23\xff\x1e\x6e\xc9\x88\xbf\x26\x60\x86\x32\x4c\xbb\x59\x30\xe3\x9b\x52\x45\x35\x65\xcf\x4c\x45\x19\x95\x8f\xd9\xc7\x7e\xfd\x55\x0f\x14\x06\xfb\x00\x53\xa6\x85\xac\x86\x47\xf4\x60\x1c\x4a\xd7\x66\x01\x0a\x99\x43\x03\x63\xe5\xe9\xa9\xfa\x8a\x55\x47\x90\x1e\x96\x11\xc4\x23\x44\x90\x22\x79\xdc\x7b\x68\xe2\xcd\x06\x4b\xb3\xb2\x6a\x5b\xa5\x98\x5b\xa5\x55\x6f\x65\x2e\xd8\x0e\x95\x46\x6d\x06\x33\xfc\xb7\x36\xd0\xbb\x8a\xa5\x14\xfc\x81\x07\x22\x93\xc1\xcf\xf4\xef\x86\x2a\xd3\x80\x69\xa2\x58\x53\xd5\x77\xb0\x7d\x8c\xb0\x72\x45\x54\x40\x80\xbf\xbd\xa1\xae\x4a\x65\x83\x3a\x85\xd2\x45\xc8\xee\xa7\xad\xff\x74\xfc\x38\x75\xcd\xd3\xeb\x73\x68\xfb\xa3\xa6\xac\x43\xd7\x2c\x0d\x16\xf9\x64\xea\x0a\x48\x3d\x71\x30\x18\x88\x0c\xa4\x0d\xc9\xe5\x49\x52\x2c\xe0\xd4\xcf\x7d\x94\xe5\x62\x4c\xc2\xbd\x0d\xaa\x84\x61\xb6\x95\x7b\x22\x5d\xc3\xe9\x4b\x7c\x6c\xaa\x30\xfe\x73\x5c\x67\x36\x89\x8b\x22\xce\x52\xfa\x1e\x37\x63\x50\x26\xc9\xc3\x94\x02\x09\x78\x55\xb7\x70\x72\x2a\x31\x2d\x2d\x63\x99\xd3\x86\xfa\x15\x90\x17\x39\xf5\xfe\xe0\xf9\xcd\x0e\x09\xbc\x7c\xd3\xcf\xa5\x94\xf4\x5c\x50\xbb\xb0\xa7\xe4\xed\xcc\x4b\x88\xa5\x2a\x50\xf0\x7e\x58\xf6\xcd\x90\xe3\x09\x52\x2e\xe3\x01\xba\x67\x1b\x29\x4e\xc3\x3b\x61\xb0\xe1\x95\x01\xfe\x37\x03\x19\xe4\x89\x94\xc9\x34\x56\x18\xab\x20\x90\x07\x54\xfb\x4e\x5e\x10\x98\x02\x30\xf5\x66\xf4\x90\x36\xb8\x4e\xb2\x91\x9f\x90\xb3\xda\x3e\x94\x32\xb6\xd2\x81\xab\x44\x2a\xe0\x00\xde\xc1\x00\x97\xda\xc0\x52\x86\x0c\xb2\x5a\x3d\xeb\x29\x5b\x85\x97\xd1\x0c\x53\x79\x8b\x04\x45\x8f\xbc\x82\xde\x89\x6e\xcd\xbc\x59\x45\x7d\xc4\x90\xb4\x23\xb9\x8e\x48\x5e\xdf\xb0\xa6\xb1\x94\xc9\x20\x90\xd7\xbc\x80\xd2\x16\xe2\xd6\xd4\x62\xb5\x94\xc9\x5b\x21\xc1\x1d\x95\xf8\x4a\xc3\xda\x52\x7e\xb6\x91\x32\x5b\xb0\x55\xac\x26\xfe\xea\x31\x75\xf8\x05\xcc\x2a\x15\xd2\x2c\x8d\xff\x9c\xc1\x83\x3e\xcf\xec\x8d\x8d\x93\x0a\xd2\x94\x54\xb7\x81\x98\xb9\x18\x5b\x9a\xbc\x0f\x49\xf5\x4c\x95\xba\xbf\x52\x9b\xa4\xda\x62\x00\xb6\xcd\x05\xa8\xee\x37\x63\x96\x4a\x9d\xf3\x7b\xed\xbf\x74\x95\x36\x32\x34\xc2\x63\xdc\x70\xb1\x69\x01\x71\x7d\x21\xc8\x1f\x88\x42\x64\x48\x32\xf8\x44\xb0\x02\x86\x6b\xea\x03\xb1\x84\x7a\xbf\x7f\x7a\x76\x70\x7c\xe4\x89\xc6\x40\xb5\x07\x9a\x2a\x82\x09\x92\x2e\xc4\x51\x9c\x86\x22\x10\x19\x84\x81\x08\x44\xe2\x8d\x5c\xfe\x25\x64\x8b\x40\x64\xde\x2e\xf5\x2f\xfa\xe2\xb2\xe1\x8f\x7e\x93\x5f\xc0\xcb\x86\x1b\xf2\x4d\xfe\x20\xd3\xcf\x84\x79\x36\x15\x81\x88\xfc\x1b\xd8\x28\x85\x67\x3d\x1f\x65\xf7\x02\x72\xe0\x25\xf8\x68\x53\xb9\x46\x52\x2b\xeb\xbc\xc2\x2f\xa8\x02\xc0\x50\xdf\x4f\x18\x5e\x5d\xad\xaf\xaf\x21\x62\xc0\xf9\x3a\xa7\x58\xde\x34\x3c\x4a\x19\x26\xaf\x9c\x80\x8d\x32\xdb\xf8\x11\x93\xb5\x9b\xcd\x52\x74\x75\xe5\x11\x50\xfe\x56\xa2\x3c\xc4\x09\xb7\x31\xfc\x58\x07\x79\x21\x27\x7a\x92\x79\x2a\x03\x4c\xfa\x10\x6e\x48\x38\x5b\x18\xe7\x57\x57\xdf\x2b\xdb\x22\xed\x23\x2c\xfe\x3c\xc8\x20\x7d\x00\xcd\x76\x6e\xb0\xf7\x5c\x7b\x39\x5b\x4a\x4c\x37\x73\xd2\x90\xe4\x0b\x78\x29\x11\xb0\x29\xf6\xfc\x50\xf6\x2a\x6d\x86\x08\xc4\x89\x5f\xf6\x2e\x31\x72\xee\x74\x31\x5d\x58\xd1\x86\x0a\x52\x4f\x25\x91\xa6\x75\xcf\xcb\xb7\x16\xf6\x3c\x6c\xe0\xc6\xb4\x3a\x90\xc4\x07\x64\xce\x81\x75\x7f\x94\x29\xc3\x1c\x1f\xc3\x74\xd6\x27\x98\x01\x50\xa3\xc3\xbd\xe6\xe3\x7c\x9e\x02\x54\x35\x68\x0c\x7d\xcc\x8d\x78\x2d\x58\xd0\x06\xca\x42\x1b\x12\xe2\xfb\x77\x71\x43\x1a\x3d\x7a\x91\x5f\x4a\xaa\x5c\x22\xcb\x5c\x28\x97\xd5\x77\x99\x57\x26\xe9\xc3\x38\x59\xf4\x69\xc2\xc4\xe4\xd3\xe2\x90\x7d\x7d\xd5\x4f\xb7\x78\xae\xcd\xa3\x94\x32\x4c\x0e\x5f\x5d\x17\x37\xa3\x59\x27\xad\x51\x22\x97\x33\x8d\x72\xc4\xc6\xaa\x47\xb0\x6a\x94\x92\x89\xf5\x8d\xd4\x57\x96\x98\x54\x2d\x2a\x5f\xb1\x21\xc9\x4a\x54\x69\x8d\x0a\x6a\x3f\xd2\x05\xc0\x4c\xbd\x88\x50\xdd\x69\x3b\xf1\xa7\x0d\x5f\x0a\x46\x43\x8d\xfe\x24\xb7\xbb\xab\xe3\x14\xd6\xdb\x70\xea\x0f\x46\xed\xcd\x1b\xc5\xbb\x7e\x3f\xf2\x27\x26\xc7\x97\x31\x72\xc6\x71\x51\xc7\x31\x68\x2e\x3d\x12\xfc\x41\x99\xcf\xd1\xf7\x8a\x5c\xb6\x25\x97\x87\x04\x23\x37\xf7\x38\x57\x06\x69\x13\xca\x43\xaa\x82\xa7\x8e\xff\x24\x34\x3f\xaa\x8d\x46\xcb\x7b\x0a\x5c\xb0\x06\x19\x90\x36\x91\x3c\xa4\xd5\x48\x68\x13\x17\xc9\xdb\xe4\x2f\xf4\x96\x58\x34\x7c\xd5\x72\x41\xef\x2a\xca\xc5\xa5\x55\x6b\xd6\xc1\xb2\xe1\x6b\x23\x04\x4d\xe5\x07\x70\x95\x4a\x7c\xb9\xde\x09\xf4\xf2\xff\x48\xdb\x43\xda\x67\x73\xcc\x3b\xf3\x89\x3f\x9d\xd3\x41\x93\xe7\x84\x92\xef\x5e\xd2\xad\x1a\xc9\x20\xa5\xd9\x31\x8f\xce\xf1\x7a\x20\x73\xef\x32\xef\x26\xbf\x48\xb7\xcb\xb5\x80\xae\x17\x9e\xd7\x58\x13\x86\xe8\x12\xf8\x5e\x3a\x9f\xbf\xfc\x3f\xf8\x5b\x55\xe1\xad\xb5\x6c\x3e\x6f\xec\x9e\x17\x68\x31\x60\x56\x1d\x5d\x2c\xf1\xd2\xed\x0b\xf5\x92\xc3\xb5\x0a\x3c\xd4\x0c\x16\x06\x66\x5e\x72\xa1\x5c\x82\xc2\x0b\xe6\x73\xe2\xb0\x0a\xa6\x3d\x6b\x6a\xc6\xce\x9a\x37\x39\x41\xbb\x82\x97\x20\x91\x79\x9f\xa0\x68\x1b\x5d\x28\x97\x43\xf4\xb0\x55\xac\xaf\xe7\x3c\x6c\x69\x35\x5f\x66\xeb\xeb\xea\x5a\x25\x02\x62\x81\xd0\x2b\xbc\x35\x95\xf2\x69\xd4\x42\xfb\x02\xa1\xb7\xb6\xb6\x20\xe2\x19\x38\xf7\xfc\xf5\xf5\xb5\x08\x5c\x79\xc1\xfa\xfa\x5a\x48\xc4\x7c\x7f\x7d\xbd\x90\x3f\x21\xef\x6a\x1b\x0d\xf9\x79\xc9\x8e\xd4\x55\xa8\x0a\x90\x54\x64\x5f\x3f\x1a\x06\x6d\xda\x1b\x06\xed\x1a\x44\x95\x50\x77\xbe\xbe\x7e\xb5\xdd\x88\x83\x91\xc8\x43\xe9\xda\xab\x63\x9c\x4d\x65\x70\xbe\x9d\x6e\x5f\x73\x4b\xf8\xb0\x7a\x18\x5e\xd3\x25\x81\x2c\xe8\x53\x22\x6e\x60\x3a\x44\x20\x16\xe3\x38\xc2\x52\x4c\x91\xe5\xe4\x0f\xb1\xae\x12\x81\x38\x4b\xe9\x9b\xcb\x4e\xb0\x1e\xe4\x9d\xe2\xc5\x1c\x30\x9e\xc5\xf5\xcc\x71\xe9\x39\x2b\x52\x31\x23\x94\x31\x17\x4e\xc5\xa1\x88\x09\x14\x4b\xae\x9d\x66\xd3\x79\x3b\xe3\xd6\xcd\xe2\x9d\xa2\x75\x71\x43\xd4\xe0\x58\x9a\x69\x86\x88\x63\x08\x07\x3c\x3c\x5a\xbd\x27\xd3\x6e\x7b\xeb\x4b\xb1\xbc\x1d\x0f\x2f\x2e\x01\xac\x3a\xb6\xdc\x61\x7a\x56\x53\xae\x5c\x2e\x6f\xe7\xac\x1c\xd9\x89\x56\x99\xd1\x37\xf9\x05\xba\x6c\x28\xf2\x73\x12\x0b\x61\x43\x14\xb7\x4a\x41\xf5\xb7\x1c\xa4\x58\x3c\xfd\x2d\xbf\x48\x2f\xbd\x8b\x4b\x19\x90\x5f\x8c\x49\x70\xee\x21\x05\x31\xc4\xc2\x02\xfe\xf0\x6f\xf9\xc5\x4d\x2c\xc5\x40\x93\x49\x5d\x97\xde\x05\xcd\x25\xd2\xc9\x98\x8b\x34\x77\xfc\x70\xd9\xda\x2d\x9b\xf6\xf2\x65\xaf\x72\x1c\xdc\x40\xb8\xab\xaf\xc4\x1e\x83\xb9\x23\x51\x94\x89\x58\x57\xce\x2c\xf2\x40\x92\x79\xc1\xa6\xbd\xcf\x93\x0c\x9c\xa4\xc4\x55\xce\xa5\xd2\xea\x79\x11\x94\xe5\xe1\x92\x48\x16\x26\x7f\x72\xb5\xb0\x14\xe2\x80\xd6\xda\x09\xa9\x7f\x2f\xd7\x19\xf8\x14\xdb\x26\xb0\xa7\x8b\xe4\xad\xba\xb1\x9b\x6a\xbb\x89\x6b\x0a\x39\xce\x49\xb0\x21\x18\xca\x65\x89\x17\x5e\x1d\x5a\xb8\x4d\x12\x61\xd8\xee\xe8\xb4\x87\xa5\x64\x6c\x80\x9a\x7d\x9d\x33\x27\xaf\xd4\x43\xdf\x2b\x20\xf6\xf2\x3a\xce\x9b\x02\xb2\x8e\x7a\x83\xc7\xb1\x22\x50\x86\x15\xe6\x76\xfa\x7d\x5c\x41\x89\x61\x3e\x04\xbe\x47\xe3\x8a\x97\x41\x82\xb2\x01\xa6\x97\x86\x08\xa2\x22\xdf\x10\x6e\x78\xfe\xd6\x28\x87\xfe\xcd\x56\x95\xca\x76\x1a\xb4\xd9\x7c\x45\xb6\xa4\x21\xa2\x06\xb5\x70\xc3\x97\xdb\x2f\x59\x39\x48\xa2\xa9\x02\xb4\xe9\xcb\xa5\x47\xd9\x27\x72\xc5\x33\x84\x00\xa6\xe1\x10\x3d\x3c\x48\x0a\x88\x41\x7b\xa4\x09\xb5\x38\x1f\x48\xf0\x51\x3c\x0d\x41\xe0\x25\x9b\x3e\x98\x79\xe9\x76\x32\xf4\x37\x55\x50\x78\x5d\x1e\x03\x53\xaf\xbc\xa4\x06\x91\xa7\x80\x10\xd3\x17\x80\x2e\xa3\x51\x3d\x4f\x3e\x9f\xaf\xa5\xeb\xeb\xb1\x87\x37\x85\xd0\xf3\x82\x52\x05\x11\xc4\xcc\x4d\xb5\x09\x03\x49\x20\x0c\xbd\x8b\xcb\x2d\x38\xc4\x1d\xbf\x15\x6c\x6e\xae\xaf\x47\xdf\x87\x5b\xf5\x40\x10\x6e\xba\xf6\xe0\xc5\x6c\xc3\x43\x97\x5b\x1b\x1b\x57\xdf\x4f\xd9\x38\x8c\xbd\xe2\xe2\xea\x12\xdc\x7a\x63\xd2\xf3\xe0\xc8\x93\x14\x30\xae\xf0\x47\x64\xe9\x9a\x50\xa5\x79\xde\xad\x7c\xed\x1d\x6d\x95\x0a\x85\xb5\x23\xc2\xd5\x2a\x4e\x0f\xb2\x14\xc5\xe9\x0c\x0a\x90\xf6\xb7\x00\x1f\x1e\xce\x2f\xa2\x8d\x8d\x4b\xef\xba\xda\x5f\xa8\x59\x47\xc5\x91\x3e\xf2\xa6\x7e\x33\x89\xc2\xeb\x75\x65\x9d\x99\x4f\x27\x47\xab\x86\x20\x9b\x4c\xe2\x3e\xf1\x9c\xed\x6e\xfc\x4a\xdd\x8e\xf7\xd9\xaa\x2a\x85\x77\x8d\x8a\xca\x71\x2f\xe3\xad\x33\xc7\xa1\x56\xea\x2c\x69\x7c\x83\x81\x8c\x56\xb3\x8a\x45\x6e\xff\xc1\x6b\x95\x6b\x9a\xc6\x7f\x0a\xb3\x14\x0e\x21\x20\x6f\x87\x70\x3b\x1e\xb6\xb2\x5f\x34\xab\xdb\xd8\xb8\x7c\x68\x51\x3f\x4d\xfc\x74\x01\xbc\x1f\x28\xc5\x66\x5e\x56\xfa\x58\xe2\xf5\xa4\xde\xc7\x4c\xca\xe5\xad\x94\x8b\x39\xaf\x90\xe3\x77\xd5\xc6\x18\xa0\xed\x8c\x5f\x22\xbc\x74\x88\xbc\xb4\xb6\xf8\x23\x40\xa5\xd5\xdb\x72\xb4\x9b\x45\x20\x40\x2d\x92\x7b\x96\xc8\xfe\x15\x69\xab\x27\x04\x7f\x19\x98\x76\xab\x79\xc4\x6b\x4b\x57\xe4\x22\x92\x5f\x5c\x09\x60\x31\xaa\x85\xed\xc7\xa3\xc7\x7e\xd7\x1f\x3e\x16\x75\xd8\xa9\x21\x95\x63\x61\xe9\xbb\xac\xcd\x63\x28\xfb\xe9\xec\xf8\xc8\xbb\xe9\x2c\xcb\xc7\x51\x4f\x62\x9f\xcd\x59\xdc\xd9\x46\xbb\xab\x41\xeb\xa3\x54\xdb\xd5\x48\xc2\x32\x3d\xf8\x80\x0f\x41\x0d\x91\xe8\xc3\xc2\xd3\x33\xd1\x60\x3d\x48\xf2\x16\x31\x73\x2b\x72\x20\xa5\x5e\xcf\xb5\x4e\x91\x3f\xc8\x55\xe8\x09\x40\x8c\x53\xd8\xb9\x0a\x0e\xe0\x1d\xb9\xd7\xf5\x52\xb9\xca\x43\x27\xb4\xe9\x5a\x8a\x39\x6c\xef\x1f\xe2\xac\x80\x42\x81\xf2\x38\x40\x22\x53\x37\xe5\x92\xab\x9a\x86\xc6\xe3\x06\x57\xe2\x22\xc8\xb7\x7c\xa9\x6d\x0e\xf4\x83\xa7\x01\x11\x65\x99\x10\xc1\x8f\x75\x44\x2f\x51\x06\xdd\xac\xdf\x7b\x3a\xcd\x3a\xf1\xd3\xfb\x46\x5e\xcd\xf3\x3a\x76\x46\xdb\x12\xf2\x92\x06\x3c\xa5\x7a\x49\x20\x25\xf8\x84\xc6\x7b\xed\x12\x7f\x75\x86\x37\x50\x31\x46\x70\x52\x08\x71\x21\xa4\x19\x12\xfc\x54\xf0\xf1\xf9\x8e\x50\x15\xe0\x13\x8b\x58\xae\xbb\x55\x96\x0a\x83\x86\x64\xea\x38\x31\xe4\x40\x0c\xe3\xfc\xac\xd4\xc3\xd7\xc5\xe8\x75\x0f\x29\xa4\x7a\x5e\xb5\x07\xb7\xb2\x4f\x66\x05\x12\x46\x50\xf0\x85\x22\x4e\xaf\x13\x28\x04\x63\x3f\xf7\x03\x04\x73\x51\xae\x5c\x79\x1a\xba\x00\x58\x09\xc2\xdc\x85\x43\x0f\x61\x31\x6d\xab\x80\x69\x62\x6d\x92\x70\x82\xcc\x7d\xb3\xa2\xf1\x13\x7e\x33\x84\x60\xea\xa3\xf1\x79\x76\x03\xd3\x62\x98\x4a\x31\x05\xb2\xac\x61\x8e\x49\xb8\xf9\x8c\xa0\x73\xc4\x1d\xa2\x2a\x79\x12\x57\xc5\x07\x3d\xcf\x7a\xf1\x7c\x9a\x62\x0a\x1a\xd4\x5f\x26\x02\x0b\xf7\x98\x79\x0a\xf0\xbd\xb7\x3e\x1a\x0f\x26\xfe\x5d\x1d\x7f\xaf\x04\xa1\x96\xb7\xb2\xef\xfd\xad\x6c\x63\x83\xe2\xcc\x4a\x99\x10\xa7\x42\x2a\xd7\xc6\xd1\x75\x6a\x7d\xc1\x43\x4d\xa6\x13\x2f\xbd\xc8\x2e\x5b\x20\xfa\x81\x17\x77\x12\xc9\xcd\xc3\x9a\x57\x6a\xec\xf1\x49\x37\xa9\xec\xf5\x2e\x3d\xaf\x5e\x0b\x67\x9e\xe7\x49\xc1\x45\xd0\x7c\x2b\x6f\x27\xdf\x07\x24\x5c\xd0\x70\xb6\xad\x0e\x37\xd5\x52\xea\x11\x94\x87\xba\xa7\xf8\xe8\xf0\xdc\xf5\x39\x71\xea\x90\xf8\x78\x61\x49\x3f\xf8\x38\x0f\xef\xcc\x1c\x88\x9a\x06\xed\x7c\x30\x35\x8f\x1a\x02\x37\x16\x48\xca\x0f\xa5\xed\x59\x5d\xf1\xec\xb1\x8a\x89\x96\x64\xc5\x5a\xeb\xd5\x28\x06\x71\xad\x98\x57\x07\xea\x40\x15\x1f\x00\x59\x66\x5a\x71\x20\x1a\xeb\x51\x45\x55\xce\xdf\xe6\xe5\x5e\x2c\xe5\xe0\xd3\x03\xb9\xb8\x22\x20\x0f\xd5\x24\xc3\x6f\x3a\x89\x60\x4d\x95\x41\x4a\x44\x2e\x09\x82\x72\xf6\x00\xf1\x7f\xe8\xaf\xff\xa9\x27\x72\x51\x4e\x92\xb4\x17\x95\xa5\xa1\x05\xa1\xae\x13\x40\x8c\x4b\x6b\x87\xea\x82\xee\x7f\x04\x5c\x44\xac\xbe\x99\x83\x32\xbc\x1b\x97\x9b\x5a\x44\x14\x9d\xbc\x5d\xea\x2b\xc3\xd6\x6e\xe9\x4e\xe6\xaa\x3a\x72\x23\xdd\x82\x5f\x16\xc5\xcb\xad\x5e\xa5\x21\xec\xb6\x6b\x1b\x12\x85\x08\x7d\x90\x44\x49\xdc\xe8\x5d\x00\x2a\xf3\x9a\x8b\xcd\x8b\xdf\x2f\x3f\x3d\x48\xf2\x8b\x8d\xed\x01\xf8\xfd\xf7\xff\xf3\xdd\xfc\x5f\xbf\x17\x97\x2f\xaf\x4b\x47\xdb\x07\x09\xca\x1b\xa2\x4c\x4d\x7a\x1e\x4a\x27\xe3\xcc\xab\x70\x6b\xc8\xc4\xc3\xcb\x67\xd6\xc2\xa3\xca\x58\x18\x56\x86\x5c\xdc\xed\xa1\xf5\x75\x9f\x4a\x14\xd9\x80\xa8\x22\x24\x59\xde\x2a\x2b\xf9\x41\xd9\x92\xd9\x5b\xbe\xee\xed\x2a\xeb\xb0\xfa\xb5\xc1\x15\x2f\x8d\xe0\xf1\x9e\x74\xa1\x5c\xe2\x2f\xb0\x77\x80\x25\xfa\xf5\xac\x27\xdf\xcf\xa6\x92\x0c\xfc\x7a\x1e\xa5\xab\x4e\xf0\xb8\x61\x30\x76\x9b\xc5\x21\x0b\xa5\x85\x86\x90\x9b\x40\x39\xc8\xf9\x09\xa4\x0c\x54\x91\xf1\x4c\xdf\x8d\x77\xa9\x6d\x5e\xf3\x3c\xd4\xf9\x3a\x5e\xea\x81\x61\x5b\xa6\x5a\xcf\xbd\xff\x42\x80\x10\x88\xdb\x13\x30\x46\x83\x5c\x42\x48\x06\x31\x1a\x84\x12\x42\xe0\xd3\x87\xf8\x2f\x3f\x0f\xdf\x66\xe1\x2c\x81\xc3\xae\x64\x32\xce\xf0\x36\x42\x16\x5c\x04\x66\xc8\x8b\x91\xa4\x3b\xa6\xa3\xcb\x60\x4a\x1e\x54\xd7\x74\x34\x19\x84\xe4\x41\x73\x1d\xdd\x91\xc1\x39\x79\xb0\x6c\x45\x57\x64\x70\x45\xdf\xe8\xa6\x29\x83\x6b\x5a\xde\x76\x1c\x5b\x06\x63\xf2\x60\x1b\xae\x62\xc8\xe0\x96\x3c\xb8\x86\xab\x98\x32\x38\x22\x0f\x8e\xed\xea\xa6\x0c\x76\x90\x77\xf1\x29\x0e\x87\x62\x31\xf1\x93\x44\x04\x54\xa1\x42\x1e\x04\x29\x98\xce\x86\x82\x06\x84\xdc\x9f\x0c\x05\x43\x78\xfd\x23\x10\xc2\xb8\xb8\x19\x0a\x9a\x22\xbc\xfe\x51\x16\x1f\x00\x29\x3a\x81\x61\x3c\x9b\x94\x65\xe9\x53\xab\xb0\xc3\x15\x36\x1a\x85\x13\x3f\xbf\x86\x65\x59\xf2\xc0\x8a\x1a\xac\xa8\x6a\x2d\x2c\x0b\xef\x50\xee\x6f\x36\x6a\xe0\x92\x58\x3d\x0e\xab\x47\xd7\xb8\x7a\x1c\x56\xcf\x25\x38\x46\x9e\x24\x25\xc8\x3b\x46\xf3\xb9\x74\x8c\x3c\xb2\x4e\x1e\xed\x9f\x7f\x38\x3e\xfd\xf9\xea\x68\xe7\xed\xbe\x27\xa6\x10\x7d\xcc\xf2\x9b\x23\x7f\x02\x45\x90\xa0\xc1\xd1\xf1\xde\xfe\xd9\xfe\xf9\xf9\xc1\xd1\xeb\xab\xdd\xc3\x77\x67\xe7\xfb\xa7\x2c\x67\x90\xcc\x0a\x04\xf3\xfe\x9c\xc7\x47\xe7\xa7\xc7\x87\x57\x27\x87\x3b\x47\xfb\x57\xfb\x47\x7b\x27\xc7\x07\x47\xe7\x57\x07\x27\x9e\x88\x0f\xa9\x79\x96\x9c\x24\x7e\x0a\xf7\xd3\x70\x9a\xc5\x29\x3a\x38\x59\xb5\x86\x93\xd3\xe3\xf7\x07\x7b\xfb\xa7\xfd\xf5\x9c\xe4\xd9\x6d\x1c\xc2\xbc\x53\xdb\xfe\xd1\xce\x8f\x87\xfb\x57\x3b\xef\xf6\x0e\xce\xaf\x0e\x8f\x5f\xbf\x3e\x38\x7a\xed\x89\x30\xf5\x47\x09\xdc\x99\x85\x31\x3a\xcc\xae\xaf\xc9\xca\xdf\x2a\x78\x70\x74\x76\xbe\x73\xb4\xbb\x7f\x75\xfe\xeb\xc9\xfe\xd5\xde\xfe\x7b\x4f\x0c\xe1\xed\x01\x5b\x12\xcf\xf1\x82\xba\xbc\xc8\xc9\xe9\xf1\x9e\x27\x4e\xf3\x2c\x5c\x5a\xe8\xed\xce\xee\x9b\x83\xa3\xfd\xab\x37\xfb\x3b\x87\xe7\x6f\xae\x76\xdf\xec\xef\xfe\x7c\xc6\xc8\xde\xf3\xc4\x89\x1f\x8c\xe3\x14\xbe\x81\x7e\x82\xc6\xbb\x63\x18\xdc\x14\xfb\x84\xf8\xb0\x53\x13\x1e\x4b\x3c\x46\xc7\x7b\xfb\x4d\x52\x3c\x11\x0f\x2c\xcc\x8f\xb2\x10\x76\x68\x29\xfb\x15\xf7\xfb\xd1\xfe\xee\xf9\xc1\xf1\x11\x2e\xbd\xbf\xfb\xee\x74\xdf\x13\xe3\xb4\x80\xc1\x2c\x6f\x65\xdd\xdb\x39\xdf\xb9\xda\xdd\x3f\x3a\xc7\xc3\x11\xfa\xc8\x0f\x60\x8a\x58\xe7\x57\x99\x0e\x4e\xae\x5e\xed\xbc\x3d\x38\xfc\xd5\x13\xe3\xe9\x2b\x7f\x12\x27\xf7\xcd\x0c\x67\x67\x6f\xae\x7e\xde\xff\xd5\x13\x8b\x62\x7c\x75\x03\xfb\xdf\x5e\xbd\x3a\x38\xdc\xaf\xb2\x5c\x45\x71\xd2\xa2\xe5\xfc\xcd\xbb\xb7\x3f\x9e\x9c\x1e\x1c\x9d\x7b\x22\x1a\xcf\x26\x23\x62\x3f\xd7\xcc\xf3\xee\xac\xe2\xdd\x59\x01\xf3\xb4\x64\xdc\x66\x86\x93\x9d\xb3\xb3\x0f\xc7\xa7\x78\xd0\xfc\xa2\xf8\x98\xe5\x61\x33\xd3\x7b\xda\xe2\xab\x9d\xbd\xbd\xd3\xfd\xb3\x33\x4f\xbc\xa5\xcd\xde\x09\xc3\x1c\x16\x05\xc9\x7c\xba\x7f\x76\xfc\xee\x74\x77\x9f\x74\xd1\xd9\xf9\x31\xee\x43\xdc\x41\x05\xca\x58\x27\x56\x39\x4e\x8e\x8f\x0f\x3d\x31\x87\xd4\xfa\xe4\x24\xcb\x92\xe6\xfb\xf7\x6f\x5f\x1d\x1f\x12\x86\xbf\x9d\xbc\x22\x06\x05\x22\x38\x46\x32\x98\xf4\x68\x5c\x24\xe8\x4d\xf0\xcc\x9e\x94\x33\xbb\x66\x0b\x4f\xbc\x2d\xa6\x63\x98\x43\x3c\xfa\xcc\x5e\xf8\x55\x96\x4f\x44\x00\x07\xf5\x9c\x62\x79\xca\x69\x54\x66\x28\x89\xa9\xe9\xa4\x6f\x26\x88\x6a\x5a\x1e\x24\x19\xec\x23\x4f\xfc\x79\x36\x82\x9b\xb7\xf1\x54\x04\xbb\xc8\x13\x8f\xce\xfe\x2b\xec\x84\xb7\x98\xcd\x42\xe1\x30\xf3\x43\xe1\x47\x3f\xc1\x4f\xb9\x08\x7e\x43\xa5\x3e\xfb\xf8\x49\xd3\x1e\xe4\xf0\xcf\x59\x9c\xc3\x70\xb8\xa6\x00\x06\x7a\x42\x40\x70\x87\xfb\x08\x24\xfe\x08\x26\x43\x91\x55\x21\x90\x2a\x84\xb2\x0a\xa1\xac\x02\xaf\xa7\x4f\xf8\xf2\xc1\x49\xe3\x9b\x44\xc6\xc2\x82\x45\x31\xbc\x38\x42\x03\xff\x66\x70\x70\x76\xf5\x7e\xe7\xf0\x60\xef\xea\xd5\x2f\x7b\x47\x57\xc7\x98\xe3\x2f\x97\x93\x82\x57\xe2\x53\xba\x7d\x29\x96\xe5\xca\xe0\x8c\x3e\x58\xb6\x2b\x83\x11\xdd\xca\x5c\x53\xd5\x64\x70\x40\x37\x3c\x4d\x53\x0d\x19\x1c\xd2\x37\xaa\x6a\xea\x32\x38\xa1\xfb\x9a\xe3\x6a\x8a\x0c\xee\xe9\xf6\xa9\x58\xba\x2b\x83\x3f\xc9\x83\x69\x2a\xae\x2e\x83\x1b\xf6\x19\x47\xd7\x64\xb0\x47\x37\x46\x4b\xb1\x6d\x19\x7c\xa4\x1b\xab\x6e\xd9\xaa\x0c\xee\x68\xd5\x9a\xa2\xf1\x27\xfb\xd7\xa8\x92\x53\xd4\x75\x58\xde\x76\xdc\xa3\xc1\xfe\xf4\x95\x24\x6f\xdd\xa3\xc1\xf9\xf5\x6f\x92\x82\x8f\xb2\xb7\x22\x30\x0c\x4c\x08\x49\x52\xcb\x24\xb3\x4a\xd2\xca\x24\xab\x4a\xd2\xcb\x24\x9b\x24\x5d\xbd\xfb\x4d\x32\x80\x18\x24\xf9\x66\x1c\x64\xa9\x08\x0c\x87\xa4\xff\xf9\xdb\x8e\x54\x95\x31\x81\x58\x4c\xb1\xb8\x6b\xb8\xb4\xd0\xec\x9d\x64\x35\xb3\x75\x7f\xe0\x82\x36\x10\x47\x33\x84\x70\xbd\x26\xe9\xb1\xc1\x51\xf8\x93\x24\x06\x49\x1c\xdc\x88\xa0\x2b\xab\xdc\xa3\xc1\xee\x9b\xb7\x52\x4e\xb2\x66\x77\x1f\x25\x79\x00\xb1\x80\x74\x94\xa1\x38\x8a\x03\x1f\xe7\x26\x1e\x06\x0f\x15\xf1\x0e\x4f\xbc\xa9\xf6\x10\xf3\x10\x47\x92\x56\xf6\x64\xea\x95\x35\xe3\x9e\xbc\x9b\x5a\xac\x21\xe3\xf8\x0f\x49\x14\xb0\x00\xd7\xf9\x20\xb1\x51\xe7\x0e\x8a\xef\xd9\x00\xa9\xeb\x70\x7d\x5d\xba\x47\x03\xf4\xe6\x83\xa4\x00\xd5\x04\x2a\x3f\x16\x98\x2a\x94\x65\x09\x8a\xa7\x9b\x78\xd7\x84\x78\x61\x34\xb5\x8a\x70\x8d\x75\x6a\x93\xe2\xa3\xab\x69\x33\x1a\x5c\x83\x1b\xe8\xf7\xee\xd3\x3b\x49\xe1\x3f\x45\xcf\x1e\x22\xc0\x2c\xca\x86\x47\x6b\x56\xfb\xe3\x2f\x37\x92\x2c\x03\xad\x66\x28\x34\xf8\x2e\x9e\x4c\x93\x38\x88\x51\xd9\x13\x94\xfc\x5f\xac\x9f\x24\x91\x68\xe1\x44\x90\x0f\xe2\x90\x24\xd6\xaf\xcb\x8e\xa2\x97\x6d\xed\xbe\x79\xdb\xdf\x37\x9a\xf5\x35\xfa\xe6\xd5\xff\xae\xbe\xf9\xa5\x87\x5c\xda\x3d\xba\xf2\xe5\xba\x87\x6f\x47\x9b\xd5\x69\x0d\xd3\x5f\xde\x4b\x22\xba\xc1\x07\x69\x2f\x1f\xc0\x90\xe0\x46\x6f\x8b\xc7\xa4\xa3\xfc\x24\xb9\x17\x8a\x29\x0c\xe2\xe8\x5e\xf0\x05\xdc\x0e\x21\xca\x72\x01\x8d\xa1\x20\x6e\xe4\x03\x26\x7e\x62\x09\x66\x0f\x16\x41\x1e\x4f\x51\x96\x6f\x88\x02\x4b\x1f\x08\x07\x91\x90\xc0\x08\x09\xa3\xc4\x4f\x6f\x00\x2e\x46\x4e\xb2\x49\x02\x73\x52\x5b\x41\xaa\x62\xd9\x05\x7f\x86\xb2\x89\x8f\xe2\x00\x7f\x77\x20\x0e\xc5\xb3\xe7\x7f\x9a\x76\xc7\x2f\xe8\x5c\x52\xf8\x6e\x7f\xd3\xd3\xed\x6c\x05\xc5\xfd\xcc\x04\xda\x4d\x32\xed\x69\x15\x67\x7b\xb7\x92\x0a\x4c\xa3\xee\xde\xa5\xbd\xaa\x56\xbd\xba\x80\xc6\xf3\x18\x25\xc4\xd5\xae\x22\x50\xe5\x09\xfc\xeb\xb9\x04\x9a\x7f\x13\x81\x1f\xda\x93\x7a\x25\xea\xb8\x0d\x82\x9b\xb3\xbf\x2e\x9e\x04\xfa\xdf\x3d\x09\x16\xf4\x46\x3f\x1b\xfd\xd4\xbf\xb2\xe9\x5f\x65\x65\xfb\xe3\x9f\x5d\xd9\x16\x2d\x6b\xed\x15\xed\xe7\xfe\x3e\x31\x14\x50\x37\x58\xe5\x1b\xdc\x6e\xe7\x77\x0b\x2b\xd0\x57\xab\xe0\xc7\x85\xec\x64\x3c\x61\x4d\xfd\xf5\x28\x90\x34\xf0\x33\x02\x1a\x50\x4a\x51\xc7\xb4\xab\x57\x3a\xf8\xae\xef\xd5\x93\x79\x8e\xf4\x71\x7a\x7d\x10\x89\xa0\x16\xda\xc9\x22\x1c\xcc\xf2\x1c\xa6\x68\x77\xc9\xe1\xba\x35\x26\x7c\x5d\x4b\x44\xfe\x95\x6b\xe7\x46\xf5\xbf\xcf\x9a\xee\x4e\xef\x74\x87\xf9\x73\xea\x72\x7b\xeb\x42\xed\xba\xe8\x40\x5b\xea\xd7\x98\x81\x79\xfe\xbf\x4a\xb6\x48\x7b\xc8\xe5\x8f\x09\x9a\xd3\xee\xa2\x02\x26\x30\x40\xa4\x87\xfc\x38\xc5\xa7\x43\x4b\xe1\xcf\x0d\xe4\x2c\x25\x02\x9d\x8e\x05\xee\x6a\x1d\x58\x75\x47\x1b\x8d\x8e\x16\xab\xde\x35\x79\x71\x5c\xb5\xaa\x39\x64\x01\x94\x03\x1d\x28\x0b\xc6\x47\xed\x9b\x52\x7d\xc7\x09\x4a\xb6\x08\x2c\x8d\x3f\x01\x94\x03\xa1\xa9\xd5\x07\x5d\x90\xe3\x0f\x6a\x40\x4c\xaf\xf9\x56\x6a\xad\x11\x22\x4b\x4c\x8b\x23\xc7\x30\x99\x42\xc6\x92\xa4\xcb\xd4\x85\x1c\x8b\xc7\x5c\xd5\x80\x78\x46\xe8\x8a\xd3\x6b\x81\xaa\x7b\x2a\xfd\x3d\x51\xff\x0b\x71\x21\x94\xe7\x59\x71\xd9\xc1\x69\xe9\x2a\xe2\xf2\x33\xff\x55\x96\x1f\x47\x84\x1d\x18\x50\x5c\x21\xd3\xb8\xb9\x71\x9f\x5f\xdb\x27\x31\xf0\xf3\x90\x0d\x3a\x0c\xc5\x21\x7c\x78\x00\x59\xde\xb6\x40\x68\x02\x68\x07\x04\x44\xba\x8c\xd3\x5e\x10\x37\x40\xfe\xfe\x87\x9d\xa8\x2a\xf3\x51\x24\xb1\x00\x7c\x80\xc4\x33\xaf\x6e\xba\x09\x52\x03\x3b\xc2\xc7\x59\x7a\x06\xf3\xdb\x38\x80\x1e\x04\xe9\x60\x99\x3a\xb1\xf0\x2e\xf6\x11\xd8\x45\x97\x38\xdf\xe3\x4b\x98\xb7\x8f\x16\x54\x58\x4a\xb6\x9e\x88\xcf\x77\x55\x7f\x79\x17\x97\x2c\x60\xa3\xb4\x83\x64\x90\x56\xd6\x1b\xb8\xd9\x17\x9f\x6e\xe0\xfd\x50\xa4\xe1\xfb\xce\x10\x9c\xbe\xf5\xa7\x53\xa2\xaa\xa4\xa6\x2a\x1d\xd3\x8d\x2b\x34\xf8\x6d\x10\xc5\x30\x09\xdf\xfa\xd3\x77\x28\x4e\x62\x14\x43\x66\xa6\xc6\x95\x97\x7c\x24\x45\x48\xe2\x6c\x0f\x64\xd0\xf7\x15\x62\x21\xc0\x19\x0b\xd4\xde\x6d\xfd\xdf\x89\xd3\x02\xe6\xe8\x15\x4b\xc7\x75\x14\x3b\x11\xb1\xb5\x07\x87\x68\x10\x0d\x16\xea\x27\xc1\x6f\x48\x06\x98\x1b\x68\x83\x93\xb8\x40\x30\x3d\xcf\xf6\x6f\x89\x11\x40\xb7\xb5\x7d\xf4\xb7\x0b\xb5\x89\x07\xcc\xfa\xfb\x1a\xe7\xcb\x8f\x53\xa2\x3b\xda\x1d\xfb\xe9\x35\x94\x9e\xa8\x89\x22\x35\x65\xe9\x32\x46\xa0\x15\x93\xc8\xa8\xa5\xe5\x4b\xeb\xfb\x07\x4c\x25\xfa\x24\x12\x0e\x4e\xc0\xc5\x19\x1a\xdc\x1c\x0c\xca\x99\x0c\x4a\xfb\xa7\x26\x63\x0f\xe2\xe2\x3d\x4e\x3b\x98\x1e\xe7\xaf\xfe\x0c\x53\x49\xbe\x7c\x72\xc9\x5b\xab\x2a\x2b\x57\x63\xb3\x4a\xb3\x3b\x23\x06\x99\x3d\xd7\x2a\x33\x08\x02\xc2\x5d\x13\x58\x14\x30\xbd\x86\xf9\x60\x3a\x1b\x25\x71\x31\x96\x3e\x11\x87\x9a\x13\x34\x38\x1c\xbc\x3f\x3b\x79\xb3\x7f\xba\xff\xd8\x40\x5d\xed\xbe\xd9\x39\x7a\xbd\xbf\x07\xa6\xfe\x7d\x92\xf9\xe1\x10\x3e\x94\x0b\x09\x21\xe7\x1a\xa2\x83\xe9\xfb\x4a\xad\x47\xb1\x23\xca\x37\x67\x28\xcb\x61\x48\xb8\x64\xf5\xc1\x21\x85\x8b\xd9\x74\x9a\xdc\xf3\xf3\x4d\x26\x1e\xa4\x8c\x01\x0a\xdc\x09\x01\x9d\x26\x4f\xa8\x19\xe4\xb4\xf6\x3f\x67\x31\x44\xc9\x3d\xe3\xa7\xa5\x4b\x0d\xf4\x3c\x6f\x9f\x7a\xeb\x48\xc7\x27\xe7\x07\xc7\x47\x3b\x87\xb2\x58\x0d\x65\xab\xf9\x7d\xa3\xc6\x75\x56\xa9\xc2\xf7\x3c\x6f\x84\x06\x27\xf1\xe0\xe0\xe4\xd6\xd8\x5e\x95\xfb\x86\xab\x33\x5b\x1d\xf3\x95\x50\xdf\xe1\x5a\x12\xf6\x8a\x6f\xc4\xcf\xf0\xfe\x55\x9e\x4d\xf8\xcb\x8d\xbe\xb6\xd4\xe6\x29\x21\x5f\x7a\x2f\x2e\xa6\x89\xff\xb4\x1a\xb0\xf4\xf3\xf0\x70\x29\x83\xfc\x41\x3a\x40\x83\x37\x15\xcd\xe3\xc1\xef\x33\x45\xb3\xcd\xc8\x0f\x7a\xb1\x1a\xe1\x47\x09\xce\xe7\x63\x19\x8b\x46\xbf\xea\x96\xf4\x27\x1a\x9c\xca\xf2\x03\x28\xcb\x05\x93\x29\xde\x71\xff\x3b\x9d\x30\x76\x1f\x03\xba\x5d\x12\xad\xf3\x85\xe8\x4f\xa7\x9b\x78\xef\xd8\x2c\xa8\x1e\x7f\xb3\x40\x70\x2a\x5e\x5e\x82\x08\xfa\x68\x96\xc3\x62\x78\x81\x77\xf1\xe3\x3f\x2e\x41\x08\x83\xa4\x18\xaa\x8a\x06\x6e\xfd\xbc\x18\x6a\x06\x20\xc1\x1e\x8a\xf6\xae\x31\x06\xb7\xe0\x08\xec\x80\x63\x30\x01\xfb\x60\x17\xfc\x06\x4e\xc1\x19\x18\x81\x03\x70\x58\xb5\xca\xfb\x2e\xc9\x02\x3f\x89\xff\x82\x98\x7c\x09\x7a\x39\x92\x2e\xc4\x61\xa9\x40\x61\xc4\x14\xbf\xcf\x34\x43\x8d\x34\xd7\x57\x5c\x3b\x54\xad\x91\x6e\x46\xbe\xaf\x29\xae\x62\x6b\x81\x13\x46\xfe\x08\x46\xba\xa9\xd9\x5a\x60\x05\xf6\x08\xd2\xdc\xa6\xae\xa8\x8e\xa6\x9b\xb6\xe5\x98\xa6\xa3\xab\xb6\xa6\x0e\x05\x11\x88\xc3\x83\xa3\xf3\xfd\xd3\x93\xe3\xc3\x1d\xcc\xb7\x43\x61\x97\x7d\xab\x04\x3c\x11\xc4\x4b\x59\x06\xe2\xef\xb3\x28\x8a\x42\x85\xfe\x11\x65\x70\xcb\x91\x8a\x48\xb8\x34\x4a\x6a\x08\x6f\x61\x92\x4d\x27\x30\x45\x02\x9b\x33\xc2\x14\x4f\x1a\x01\xc5\x28\x29\x69\x31\xa3\xd0\xb0\x54\x25\x72\x5c\x18\xb8\x8a\xe9\x18\xbe\x11\x2a\x81\x1a\x5a\xbe\xaf\x84\xae\x62\x87\x50\x83\x8e\xa9\xd1\xdc\xae\x63\xbb\xba\xe2\xea\xb6\x6d\xba\x86\xa6\x1b\xae\x33\x14\xf6\xb8\xcf\x60\x02\x65\x70\xc4\x11\x94\x93\xf8\x6c\x5d\x82\x42\x76\xec\x8f\xb3\x94\x56\xed\xfb\x8e\xed\xaa\x76\x68\x99\xba\x1f\x18\x9a\x09\x1d\x57\x0b\x47\xa6\x15\x84\x86\xa9\x85\xa6\x65\x06\x81\x0a\x4d\xa8\xd2\xdc\xb6\x6b\x3b\x96\x61\xdb\x8e\xae\x9a\xba\xa1\xb9\xaa\xab\x0c\x85\x33\x66\x4c\xd6\x68\x2b\x66\x9d\x81\x70\x0a\x83\x6c\x32\x81\x69\x08\x43\xa2\xdb\xf2\x05\x9e\x18\x98\xde\xc6\x79\x96\xe2\xdf\x03\xd6\x86\x1d\xae\x0d\x14\xd3\x84\xb6\x61\x9a\x67\xe1\x8c\x19\x1e\x2d\xea\xd3\x91\x6a\x6b\x91\xea\xc0\x28\x70\x6c\xd5\xf1\xd5\x11\x84\x23\xcb\x31\x7d\x18\xf9\x30\x0c\x2c\xcb\x1e\x29\x81\x03\x5d\x85\xe6\x56\x2d\x55\x51\x14\xc7\x56\x15\xd7\x36\x6d\xd7\x34\xdd\xa1\x70\x52\x7f\x85\x92\x73\xcc\x91\x13\xcf\xe7\x52\xdc\x25\xa7\xd3\xa3\xae\x3b\x72\x5d\xc5\x56\x54\xd5\x31\xc2\x11\x84\xce\xc8\x52\x7c\x33\x34\x15\x4b\x0d\x0d\x2d\xb4\x46\xae\x02\x23\xd5\xd7\x69\x6e\xcb\x76\x75\xcd\x71\x1d\x53\x35\x34\x5d\xb1\x55\x55\x37\x87\xc2\xf9\x38\x87\x7d\x1d\x5a\xf4\xf5\x28\x47\x4b\x4f\x87\x4e\xb8\x16\x50\xc8\x30\xda\x82\xa6\xbc\x4e\x4e\x3f\x94\xa0\xd0\x0e\xc2\xc0\xb5\x74\xc3\xf4\x47\x0a\x74\x34\x05\x9a\x81\x65\x42\xd3\xb2\x34\xd7\x55\x5d\x3b\x80\x96\x09\x75\x63\xc4\x18\xc2\xb2\x5c\xc7\x76\x74\x5b\x51\x74\xdd\x30\x4c\xc7\xd2\x87\x42\x29\x70\x09\x58\xe0\x22\x33\xec\xec\x7c\xe7\xf4\xfc\xea\x7c\xe7\xf5\xd5\xee\xe1\xe9\xd5\xf9\xf1\xf1\xe1\xf9\xc1\xc9\xb0\xfb\xe6\x60\xf7\xf8\x88\x24\xef\x1e\x1e\x9f\xed\x77\x93\x7b\xeb\x21\x5b\xd9\xfe\xd1\x79\x2b\xc7\xd9\xc9\x0e\x9e\xcc\xe3\x2c\x2b\x20\x55\xc2\x66\x69\x14\x5f\xcf\x72\xb2\x2b\x54\xaa\xd6\x6e\x2f\x0b\xef\xdf\x16\x42\x08\xa7\x30\x0d\xf1\x01\x07\x1f\xc5\xc7\x50\x80\x77\x53\x72\x96\x10\x28\x9c\xb1\x90\x45\xe4\xe8\x83\x37\xfb\x52\x25\x5b\x08\x88\x98\x95\xfa\xd7\x70\x20\x34\x5b\x41\x88\xe9\x36\xac\xaf\x05\xbd\x39\x86\xfc\x1a\xf4\x2f\xd5\x61\xab\x50\x9d\xe2\xb6\x52\x5e\x76\x93\x5e\x68\xca\x50\xa5\x3f\xcb\x52\xe5\x73\x5d\x91\xd6\x49\x7a\xd9\x9b\xa6\x36\xab\x7a\xc9\x55\xce\xe7\x72\xaa\xe5\x72\x9f\x63\x44\x7f\x3e\x97\xfc\xff\xc7\x88\xff\xfb\x19\xd1\xe8\xf0\x8f\xa1\x75\x98\xa0\x93\xf4\xc2\xd0\xbf\x22\x23\xd6\x95\xf3\x34\xa8\x15\x23\xee\x72\x8c\x98\xcc\xe7\x52\xd2\x12\x31\xc8\x45\x0c\xc7\x87\x06\x59\xc2\x03\x03\x6f\x7b\xae\x15\xf9\xb6\x65\xf9\x91\xaf\x85\x91\x6d\x5a\xaa\x6a\xd8\x21\x54\x94\xd0\x0d\xd9\xb6\xa2\x1b\xaa\xa5\x98\xb6\x6a\x19\x9a\xed\x2a\x8a\xa2\xe8\xfd\x42\xc6\x3f\xcb\x8c\x1d\x82\xae\x18\x95\x5f\x89\x51\x94\xf6\xe8\x9a\x56\x27\xc5\xee\x0c\x5a\x27\xe9\x85\xe9\x3c\x87\x71\xfa\x56\xa6\x95\x58\xa9\xfe\x1c\x4f\x95\x55\xb1\xd2\x6f\x1c\x2b\x05\xf3\xb9\x14\xf4\xb1\x12\x35\x98\x9d\x14\xd7\x94\x41\x9c\x91\x0f\x47\x50\x85\xae\xae\xfb\xa6\x3d\x72\x23\xc3\x54\xa3\xd0\x75\x6d\x45\xf3\x75\xdf\xb2\x43\x25\x70\xc3\x91\x11\x31\xe6\xb3\x54\x5b\xb3\x4c\xdd\x52\x2d\xc7\x52\x14\xdb\x56\xdc\xa5\x32\x2b\xf9\x22\xb1\xb9\x27\x9e\x6b\x82\x9f\x86\x02\x4c\x43\x81\x80\x9a\xf9\x42\x02\x11\xce\x95\xe5\x6c\xf1\x00\x24\x43\xe0\x53\xa9\xca\x8f\x53\x21\x4b\x93\x7b\x81\xe0\x66\x07\x7e\x01\x59\x81\x02\xb0\xfc\x05\x2d\x30\xbe\x9f\x8e\x61\x5a\x0c\x16\x48\xc6\xa7\x5c\xb7\xcc\xe6\x73\x69\xb6\x42\xb7\xa8\xa1\xaa\x68\x7a\xe0\xda\x8e\x66\x59\xba\x13\xa8\x86\x62\x5b\x86\x13\xd8\x9a\xe2\x44\x26\xf4\x35\x25\x18\x05\xa6\x16\x94\xc2\x9b\xa3\xb8\xa6\xae\x5a\xb6\xe5\x1a\x8e\x6d\x6b\xae\xbd\xb4\x5b\x8e\xaa\x6e\x49\x33\x24\xb0\x80\x27\xc2\xc7\x71\x8c\x60\x31\xf5\x03\x28\x10\xe1\x29\x5c\xd8\xa2\x33\xae\x45\xc5\x7c\x2e\x15\x7d\x2d\x2a\xcf\x8d\x75\xa3\xc2\xc8\xb6\x15\x4b\x71\x4d\x73\x34\x72\x03\xdb\x35\x42\x2d\xb4\x9c\x68\xa4\x05\xb6\x6f\x1b\x23\xd7\x88\x60\xe8\xa8\x23\x87\x2d\x1d\xaa\x6b\x3b\x8e\xe9\x68\xaa\x6a\x6b\xb6\x66\x1a\xaa\xd5\x1a\x58\x4e\xad\xca\xc4\xbb\x11\x47\xd8\x74\x3e\x97\xa6\x2d\xc2\xa8\xf1\xa1\xc0\x2c\xfb\x84\x31\x31\xed\x13\x82\x31\x0c\x6e\x18\x89\xaa\x1d\x84\x23\xd5\x34\xac\xc0\x81\x86\x63\x45\xbe\xa9\x29\xaa\x63\x38\xd0\x72\x4d\x55\x77\x9c\x48\x83\x46\x34\xb2\xd8\x81\x4b\x71\x1d\xd3\x76\x6c\xc3\x34\x1d\xd7\xb0\x0c\x47\x71\x86\x02\xb3\x2a\x14\xa8\x55\xa1\x40\xad\x0a\xff\xe1\x05\x8e\xda\x2d\x0a\x6f\x59\xbb\xa9\x49\xa3\x40\x6d\x1a\xf1\xe6\x38\xa5\x3a\x20\xba\xcd\xb2\x5e\x99\x64\x69\x8c\xb2\x9c\xdb\x6a\xeb\xed\x74\xec\x23\xe1\x3e\x9b\xe1\xdd\x38\xc9\xee\xe9\x74\x42\xe3\xb8\xe8\x63\xba\xca\x36\xe0\x6b\xee\xbc\x56\x47\x04\xb4\xba\x22\x60\x27\xe9\x85\xfd\x2c\x11\xf0\xd9\x0b\xa8\xdd\x57\xd2\xaa\x85\xc2\x03\x8e\x7d\xa3\xf9\x5c\x8a\x18\xfb\x32\xb5\x9d\x40\x94\x4d\x42\xa9\x6d\x12\x4a\xcd\x1d\xbf\x3d\xbb\x86\xe6\x28\x76\xa8\x98\x46\xe0\xb8\x41\x00\x1d\x5d\x37\x7c\x1b\x8e\x0c\x35\x82\x5a\xa0\xe9\xee\x48\x89\xf0\x46\xcc\xce\xdd\x78\xd9\xd0\x6d\xd5\x32\x4d\xdd\xb4\x5d\xcd\xc2\x0b\xc7\x23\xb6\x7c\xff\x30\x2b\xd3\xab\x16\xe1\x91\x2e\xf9\xba\xdc\xe6\x74\x36\x70\xa7\x3b\xae\x9d\xa4\x17\x8e\xf6\x15\xe5\x3c\xa7\x2f\x97\x53\xaf\xd9\x87\x1c\x6f\x85\xf3\xb9\x14\x32\xde\x22\x82\xf2\x88\xdd\x18\x0b\x25\x02\x28\xcf\x52\x76\xa4\xea\xb6\x1e\x40\x25\xb0\x1c\x4d\xd7\x7c\x4d\xb1\x7d\x63\x34\xf2\x2d\x57\xb1\xf4\x91\xa1\x68\x4a\xe8\x5b\x91\xca\xd4\x0e\xaa\xa6\xa9\x96\x66\xaa\xae\xa3\xd8\xae\x63\x58\x0a\xde\xa2\x17\xb0\xd4\x37\x27\x08\x9e\xe3\x35\xec\xe0\x44\xf0\xa9\x5d\x31\x96\x0c\x5e\xfd\xb2\x77\x84\x77\x9a\x59\x01\x43\x61\x74\x4f\x16\xc2\xf2\xfa\x5e\x90\xca\xc0\x33\x37\x2c\x65\x10\x67\x2f\x65\x61\x9a\x85\x74\x8d\xcc\x67\x69\x21\xc4\xe9\x82\x03\x4d\x31\xa8\x6b\x62\x2b\x70\x21\x70\xe3\x81\x97\xde\x82\xaa\x6b\x8b\xea\x5c\x54\xee\x80\x3b\x27\x07\xe4\xe5\x12\x5e\x6f\xb6\x0e\xcb\xb4\x65\xfb\x7a\xda\xb5\xd8\x8c\x40\xf0\x8b\xca\x62\xab\xd9\x08\xc8\xa6\xdd\x40\x38\x40\xb8\xae\x8c\xe9\xbf\x07\xc2\x87\x31\x4c\xc9\x0e\x51\x1a\x93\xc5\x08\x08\x31\x12\xc6\x3e\xd9\x6f\x46\x50\x88\xf2\x6c\x22\xec\xbc\x3f\x28\xab\x4c\x60\x8e\x85\x34\x14\x07\x98\xc0\x93\x2c\x4b\xbe\xea\x1c\xee\xcc\x60\xb7\x33\x15\xdd\xee\xd9\xad\x93\xf4\xc2\x7d\xfc\xec\xf6\x42\x1b\x6a\xad\x2c\x75\x35\x17\xf5\x84\xd6\x5a\x1a\x84\x32\x61\x5e\x67\xd1\x9b\x59\xf4\x32\xe1\xb2\xfe\x98\xde\xcc\x54\x17\xfa\x0a\x1f\xeb\x59\x86\xdc\xbe\xe3\xa6\x5b\x1f\x37\x2f\x2e\x74\x20\x46\x59\x3e\x79\x9d\x67\xb3\xa9\x78\x09\x2e\xc4\x20\xf1\x8b\x42\x04\xa2\x9f\x40\x2c\xa2\xe3\xff\x37\x43\x3f\xbd\x26\xf8\x72\x79\x96\xc0\xf2\x9d\x08\x0c\x40\xad\x5e\x70\x31\x3f\x8f\xfd\xcd\x04\xde\xc2\x44\x04\xa2\x26\x5e\x82\x31\xb8\x60\x37\xf5\x79\xf6\x11\x67\xa9\xee\xed\x93\xcd\xe4\x7a\xd3\x12\xeb\x47\x55\x23\x55\xb0\xca\xd3\x2c\x85\x22\xc0\xb9\xfd\x3c\x24\xb9\xe2\xe0\x86\x20\x2d\x03\x1d\x7f\x70\x97\x11\x48\x0d\x97\x59\xc5\x7e\x1e\x6e\x8e\x92\x8c\x26\x88\xc5\xd8\x9f\xe2\xaa\x82\x6c\x32\x9d\x51\x64\xbc\x22\xfe\x0b\xa7\xd8\x5a\x55\x35\xb5\x8b\xe0\xca\x13\x6d\xad\x78\x09\x6e\xb9\x24\x78\x87\xc4\x4b\x70\x54\xa7\x44\x59\x86\x2b\x6c\xb6\xe7\x2e\xd9\x34\xb8\xf6\x14\x13\xdc\xa4\x46\xfb\x70\xb3\x36\x3f\xe6\x3e\xee\xe3\x49\xd5\x5d\xf1\x2d\xe9\xcd\xa2\x80\x39\x62\xbf\x55\xf5\xfe\x9c\x1a\x64\x9c\xe7\xf1\x35\xed\x75\x02\x5d\x44\x5b\x14\xa7\x51\xb6\x19\xc4\x79\x40\xba\x8a\x35\x4a\xd3\xd8\xc8\xe5\x27\x59\x11\x53\xeb\x0b\x11\x65\xd3\xcd\x9c\xc1\x36\x06\x49\x7e\x46\xb3\x26\xd7\x64\xd8\x82\x24\x3f\x88\x8e\xa7\x30\xed\x36\xc4\x59\xde\x10\x9a\x9f\xdc\xbd\xa0\xfb\x29\xe4\xac\x39\x18\x09\x67\xcc\x28\x04\x53\x4d\xfd\x4b\xba\xee\x42\x84\xe5\x98\xcc\x70\xb4\x28\x0f\x63\x87\x20\x9b\x8c\xb2\x51\x76\x87\x3b\x87\x74\x1a\xb5\x85\x11\x79\x5d\x7d\x43\x4d\x47\x06\xb8\x26\x90\x19\xa9\xd4\x3c\xca\xca\x13\x9b\x58\xdc\x4f\x64\xd4\xcb\xe7\x4b\x70\x41\xb8\xfa\x55\x86\x3b\xbe\xb4\xec\xe0\x79\x6a\x34\x8b\x93\x90\x7a\xc8\x2e\xe6\xa9\x1d\x70\x0c\xf6\x17\xf6\x47\xd7\x15\xaa\xa7\x43\x7a\x32\x3d\xd2\x23\x9c\xae\x7d\xb5\x0e\x51\x5b\x2c\xca\x0d\x3b\x3f\x3d\x93\xeb\x4d\xa3\x1c\xdd\xca\xec\xa6\xfc\xa8\x78\x09\x76\xe9\xab\x83\x74\x3a\x63\xed\xec\xb6\xa6\xe1\x29\x27\x4e\xfc\x3b\x06\xd0\x0b\x44\x43\x23\xf3\x9a\x83\x0b\x65\x83\x40\x78\x94\xb8\x64\x8a\x97\x60\x04\x2e\x44\xda\x16\x91\x9c\x0f\x69\xf3\x83\x24\xdf\xad\x9f\xea\x0e\x5e\xe6\x2b\xd6\x43\xdc\xd2\xec\x65\xa7\xd7\xdf\x69\x74\xfa\xb2\xb3\x5c\xab\x8f\x71\x27\x1e\xd0\xbe\xfa\x8c\x29\xde\xc3\x4f\xcb\xfd\x00\xfb\x46\x63\x59\x01\x4a\xf4\x38\x0e\x43\xb2\x3c\x1c\x7a\xf7\x68\xf0\xdb\x9d\x21\x1d\xca\xab\x8c\xf3\x02\xd7\xc6\xc6\xf8\x12\xae\xa9\x77\x9a\x9a\x07\x05\x9e\x03\x85\x06\xff\xe1\x55\x8b\x5d\xee\x9e\x67\xd7\xd7\x64\xa1\xc6\x9b\x57\x39\x0e\xf5\x26\x46\x7f\x13\x7a\xb8\x5d\x85\x6d\x59\x6a\xf5\x4b\x6c\x6c\x6d\xb4\xd1\x34\x89\x00\x63\x74\x52\xf0\x58\x10\x81\xa8\xf9\x26\xc8\xd2\xcd\x12\x8f\x8c\x5f\x26\xe0\x5d\x90\xf8\x13\xa2\x44\xaf\x06\xb3\x51\xaa\x51\x0d\xdb\x67\x2a\x1e\x2f\x1d\x75\x9a\xbc\xb6\x9b\x64\x05\xdb\x1a\xe9\x2f\x9d\xdb\x05\x69\x56\x36\x6c\x40\x44\xf9\x0c\x72\x4c\x45\x0b\x3c\x61\x97\xa0\xbd\x4b\x4d\x20\x2f\xd9\x65\xf8\x45\xbd\xe1\xd7\xa7\x97\xf3\xf9\x5c\x3a\x2f\x15\x3b\xbd\xf2\x68\x8f\xee\xc9\x0a\x4d\x53\x09\x75\x27\xb2\x42\xc7\xb2\xdc\x40\x77\x54\x68\x6a\x23\x4d\x53\x47\xfa\x68\x64\x85\xaa\x19\x8d\x34\x18\xa8\xe5\xb9\xd8\x50\x4d\xc3\xb0\x55\xc3\x30\x4d\x4b\x71\x6d\x55\x1f\x2e\x90\x7d\x7b\xb4\x50\x35\xa9\x57\xf3\xb9\x74\xb5\x9c\x54\xcc\x3a\x3e\xaa\x09\x35\xa0\xa1\x5a\x6a\xe4\x3a\x86\x1e\x8c\x74\x5f\xb5\x03\x45\x89\x46\x30\x70\xa0\x6f\x38\xa3\x00\x9a\x11\x0c\x2d\x1b\x9a\x2c\xb7\xa2\xb9\xae\xa3\xda\xba\xa9\x58\x96\xaa\x68\xaa\x6a\x2f\x24\x94\x7d\x29\xc6\x27\x12\xaa\x6e\xa4\xe4\x92\xc9\xe7\x6f\x96\x47\xbf\x46\x5f\x5f\xcf\xe7\xd2\x35\x6b\x00\x33\x6d\x24\x3a\xa2\x85\xd7\x54\x8e\x1f\x58\x8e\x32\x52\x23\xd3\x8e\x0c\xcb\x77\x2d\x2d\xd4\x8c\x70\x64\xdb\x23\x57\x0b\xcc\x28\x0a\x1d\xa8\x85\x96\xcb\xf4\xb9\x9a\x6a\xbb\x9a\xaa\xb9\xba\xea\x6a\x8a\xeb\xea\x96\xa5\x0d\x05\x6a\xac\x26\x1c\x1d\xef\xed\xff\xef\xb9\xb2\xe2\x3a\xa7\xf8\xca\x97\x4c\x9d\xab\x82\xae\x4e\xbe\x7d\x02\xb1\xbe\xa2\xe2\xc1\xea\xbb\x5f\xaa\xe5\xfd\x05\x3b\xc8\x22\xb7\xe8\x9e\x15\x7e\x61\xd6\x47\xa4\x93\x85\xfc\xba\x40\x3c\xb9\x7c\x00\xe5\x1c\x68\x61\xa0\xb4\x8d\xaa\x23\xe2\x89\xab\x54\xd6\xc6\x2a\x78\x8d\x80\x0b\x4a\x17\x4c\x95\xb7\xa4\x1e\x1b\x22\xf3\x87\x38\xdb\xbb\x95\x74\xe6\xda\xd0\x30\x6c\x36\x4a\xa7\x4c\xde\xe5\x92\xa4\xd4\xbe\x9c\x16\x10\x7d\x11\x58\x2b\x78\x51\xa2\x01\x96\x0b\x77\xf1\xeb\x3d\x78\x2b\xc9\x0f\xbc\x01\x35\xa9\xd5\xee\x77\x9f\xac\x8d\xc4\x5d\x20\x4e\x45\xe0\xd6\x46\xf9\x0a\x50\x95\x2e\xdd\xaa\x4a\xf2\xa9\x6a\x9d\x51\x03\xaa\xb6\xc4\x23\x54\x2d\xfd\x4f\x55\xbd\x4e\xeb\x36\x5f\x2d\xdb\xaf\x72\x69\x56\xb9\xf5\x56\x26\xe9\xaa\x0d\xd4\xba\x87\x54\x67\x81\x51\xba\xea\x2e\xb0\x4a\xd7\x14\xf0\x1e\x7d\x96\x59\x7a\xa3\x71\x5a\x35\xfe\x75\x4f\x6a\xda\x22\x7b\x7b\xd5\xad\x33\xe9\xb5\x65\x3b\x75\x2d\xa6\xae\x0a\x46\xaf\x69\xbb\x66\x82\x77\x68\x15\xdb\x76\x52\xb5\xb5\xd4\x76\x5d\xb3\x79\xdb\x75\x3f\x7d\xa6\xdd\xfa\xaa\x3f\x08\x45\x4e\x87\xb7\x35\xf7\x39\xcc\x7d\x92\x67\x21\xcf\xdd\xba\xd2\x61\x6f\x5d\xe5\x47\x5e\xab\x79\x4e\xd7\x5a\x1c\xae\xeb\x40\x33\xba\xc4\xea\x46\x9b\xc3\x75\x13\x68\xe6\x92\xe6\xe9\x56\x97\xc3\x75\xbb\xc3\xe1\xba\xd3\xe5\x70\xdd\xed\x70\xb8\xa1\x00\xad\x76\xde\x36\xd4\x05\x1c\x6e\x68\x0b\x38\xdc\xd0\xc1\xdb\x2f\xc8\xe1\x86\xd1\xe5\x70\xc3\x5c\x81\xc3\x0d\x8b\xe3\x70\xce\xf5\xdc\xee\xe5\x70\xc3\x01\xaf\x56\xe6\x70\xc3\x5d\xca\xe1\xa6\xf2\xb7\x72\x78\xd3\x71\x5e\xed\x2e\xec\x5a\xd7\x25\xc7\xd4\xd9\xe8\xe1\x63\x0e\xd7\xdc\x3a\x83\x51\x9d\x3a\xb4\xda\x21\xc7\x34\x81\x5e\xfb\xec\x98\xd6\x22\x97\x1c\x7b\x01\x6f\x98\x0e\xf8\x05\xf7\xf2\x22\xa7\xa9\xc7\x79\x83\x54\xef\xe2\xf3\x23\x39\x9f\xe9\x6a\x95\x6a\x2d\x71\xa9\x21\xfe\x40\x2a\x78\x83\x80\x06\x7a\x3d\x6b\x80\x5e\xfb\xe5\x59\x1a\xf8\x6b\xb5\x8c\x3a\xf8\xc0\xdc\xf4\x16\x67\xec\x1f\x26\xcb\xe8\x8e\x89\xc5\xb8\xba\x3c\x84\xf7\x0d\x8b\x65\xf5\x0d\x8b\x65\x03\xbd\x9e\xfa\xd6\xa2\x4d\xc9\x5a\xb4\x29\xd9\x0a\xf8\xf5\xf3\x86\x85\x6c\xf5\x6a\x8b\xfe\xf2\xc4\x58\x11\x60\x6b\xf5\xc0\xd5\xfc\x69\xeb\x8d\x35\x08\xcf\x20\xdb\x28\x75\x0e\xcf\x98\x21\xa4\x4e\xb3\x33\x0d\xec\x72\x95\xd4\xeb\x5d\xc0\xb6\x17\x2c\x24\x75\x0e\xa7\xaf\xc3\x6d\x17\xe8\xf5\x1a\xe9\x28\x0b\x3a\xdc\x69\xec\x05\x7a\xed\xdf\xe9\x68\xe0\xa7\xcf\x5b\x23\xc9\x77\xb9\x3d\x5c\x77\xea\xca\x0d\xf0\xc7\xca\x4b\x99\x63\x2e\x5d\xca\x1c\xab\xb1\x94\x3d\x76\x05\xfa\xa4\xb5\x8d\x7c\xde\xee\x0e\x8a\xe3\x3c\xb2\x36\x39\x6e\x9f\xb3\xa0\xab\x00\xa3\x5e\x9b\xdc\x45\xfb\x96\xbb\x68\xdf\x72\x75\xf0\x23\x02\x06\xd0\x3e\x6b\x6d\x72\x8d\x8a\xc5\x8d\x7a\x6d\x72\xcd\xe5\x6b\x93\x6b\x81\xff\x3e\xba\x92\x90\x8c\x36\x80\xf9\xd3\x97\x9c\x46\x9f\xbb\x4e\x63\x6e\x90\x6a\x5d\x90\xe6\x40\xd5\xab\xe3\x84\xa1\x55\xd9\x55\xa5\xe5\xd2\x49\xfd\x17\x55\x40\xfc\x13\xfc\x59\x18\xa3\xcd\xa4\x44\xd5\x32\xf4\x65\x14\x10\x5f\x43\x7a\xaa\x21\x3e\x85\x9c\x3a\x0b\x0d\xaa\x07\x92\xbf\xd7\xef\x18\x75\xa1\x52\xaa\xcc\xb5\x93\x3d\x5a\x15\x72\x40\xaf\x0a\xeb\xfc\x97\xd8\xd5\xcb\x3d\x1a\xbc\xff\xf9\x4f\x2c\xb0\xc7\x39\x40\x83\xb8\x60\xb7\xa0\x98\xf5\xf7\xe0\xad\x5c\x93\xd9\xe7\x25\x89\x38\x2f\xc9\x32\xa3\xb1\xe4\x2b\x5a\xcf\x57\xb0\xb4\xf9\x8c\xcf\xb0\x63\x13\xed\x8a\x31\x9a\x24\xc4\xf9\xe8\x10\x4f\x98\x62\xc0\xa9\xa8\xab\x7e\x60\xb0\x0e\x75\x97\x17\xee\xae\xd4\xd2\x65\x32\xf4\x0e\x54\xa3\x77\x94\x17\xaf\x24\xfe\x08\xe8\xba\x9d\x73\x9a\x6d\x80\x06\x15\x9e\xd2\x7e\x3a\x9b\x0c\x28\x90\x12\x0f\x33\xd7\x37\xe8\xcb\x6a\xf8\xf0\xe6\xe0\x7c\xff\xec\x64\x67\xf7\xc9\x25\x4f\xf7\x7f\x79\x77\x70\xba\xbf\x57\xd3\xac\xf6\x76\xec\x52\x47\xd1\xaa\xb0\xcb\xb3\xdd\x12\xf7\xac\xaa\xb3\x5d\xa5\x8f\xeb\x9e\x44\xf0\x8a\x0d\xa5\x9d\x7c\x70\x72\x75\x7c\x4a\x30\xab\xfa\x06\xa9\xa9\x6c\x06\xe2\x1a\x35\x59\x9e\xc0\x14\x6d\x96\x46\x54\x58\x76\x0d\xfd\x24\x4b\x61\x99\xb4\x39\xc9\x42\xd8\x3b\xe8\x6c\x59\xee\xf2\x5d\x17\x82\x4f\x5e\x38\xff\xa5\x5a\xb7\xcd\xd2\x09\xbb\xca\x0f\x20\x8c\x73\xbc\x15\xdd\xc2\x62\x78\x71\x86\x06\x57\xbf\x82\x33\x34\xf8\xe9\x10\xff\x5f\x5c\x83\x19\x1a\x1c\x9b\xf8\xff\xc9\x0d\xb8\x41\x83\x3f\x6f\x0f\xf1\x9f\xb7\xd7\x3f\xe3\x3f\x3f\x4d\xfe\x00\x7b\x68\xf0\x07\xfe\x9d\xfe\xf9\x2b\xfe\x13\x9e\xdf\xe2\x92\xfb\x3f\xe1\x87\x0c\x7d\x20\x95\xfd\x84\xff\x9f\xe1\xff\x7e\x3d\xc2\xff\xff\x9c\xe3\x1a\x8b\x6b\x9c\xe7\xfd\x9f\x3b\xf8\xcf\x6b\xd3\xc4\x6f\x5e\x91\xba\xee\x4e\x4f\xf0\x43\xba\x87\x1f\x76\xdf\x5a\xe4\xcb\x37\x2e\xfe\xf3\xeb\x95\x81\xff\x9c\xec\x8f\x71\x8e\x0f\x09\x7e\xf8\xf9\xe7\x5d\xfc\x67\xf4\xf6\x16\x7c\x44\x83\x1b\x70\x87\x06\x67\x38\xe1\xc0\xfd\x0b\xff\xf9\x6b\xef\xd5\x25\x28\xd0\x7d\x82\x5b\x28\x0e\xaa\xdb\xb6\x8b\xab\xf4\x9a\xed\x44\x9b\xff\xde\x3d\x7e\x7b\xf2\xef\xcb\x4f\x53\xa6\xe0\x1e\xe6\x30\xf1\x71\xa7\x6c\x25\x30\x42\x43\x43\xff\xf7\xc3\xa0\xbe\xea\xed\x2b\x89\xe0\x1d\xda\xf4\x93\xf8\x3a\x1d\x52\x4c\x3b\x56\xa0\x74\xd6\xee\x2b\x83\x05\xba\x62\xec\x87\xd9\xc7\xa1\x22\x0c\x54\x33\x87\x13\x41\x11\x14\xe1\xd6\xcf\xa5\xcd\x4d\xb2\x19\xe1\x2a\xaa\x7b\xec\xcd\xba\xc0\x66\x90\x25\x59\x2e\x6f\x8d\xb2\x3c\x84\xf9\x26\x69\xde\xb0\xc8\x92\x38\xdc\x42\xb9\x9f\x16\x78\x84\x87\xe4\x57\xe2\x23\xf8\xab\xb4\x39\x50\x73\x38\x91\xe9\x4b\xda\x44\x5a\x54\x18\x68\x85\x00\xfd\x02\x82\xaa\x5c\x95\x54\xd6\x4e\xbe\x35\xfc\x97\x6a\xbb\xa3\x50\x6f\x26\x2e\x21\xb5\xce\x05\x04\x56\x56\x66\x9d\x42\xef\xc2\x7b\xba\x44\x10\x84\x01\xbb\xf9\xef\xeb\x30\xd2\xbf\xf4\x9a\x65\x38\xf2\x0b\x98\xc4\x29\x7c\x18\x70\x4a\xef\xbe\x42\x21\xf5\x4f\x1c\xc6\x29\xce\x4e\x2f\xfb\x1f\x06\x39\x8c\x72\x58\x8c\x37\x47\xa8\x97\x11\x82\x59\x5e\x64\xf9\x90\xac\x37\x30\xdf\xea\xab\x63\x6b\x0c\xe3\xeb\x31\x1a\xaa\x8a\xf2\xef\xad\x5b\x98\x13\xfc\x23\xc6\x02\x28\x9b\x6e\xb1\x5e\x53\x14\x5b\xf3\xf5\xc7\x3e\x28\x08\x42\x29\x41\xf5\xbc\x05\xc2\xe3\xc5\x07\xc5\x34\x4e\x53\xcc\x0b\x93\xd5\x38\x1b\x65\xd3\xa1\xe1\x4c\xef\x1e\x06\x3d\x97\xf2\x7d\x55\x4c\xfc\xbb\xcd\x8f\x71\x88\xc6\x43\xc3\xfc\x37\x5f\x8a\xf2\xf8\xaa\x7d\xbf\x55\xd7\xa3\x29\xca\xf4\xee\x01\x17\x1c\x67\x05\xdf\x18\xda\x1b\x4c\x5e\x14\x7a\x64\x47\x8e\x18\x9d\x54\x22\x5e\x3e\xc8\x60\xfc\x20\xc9\xc0\xcf\x09\x88\x9f\x6b\x29\xa6\x0c\x12\xf2\xe0\xe8\xaa\x66\xcb\x20\xc8\xbd\x4f\x11\xef\x5c\x3f\xac\x81\x14\x3b\xa0\x91\x0d\xe8\x42\xf6\xbb\xf8\xd1\x0f\x6e\x60\x1a\xee\xf9\xc8\xc7\xc9\x0c\xaa\xf0\xfd\x5b\x81\x96\xe1\xf1\x11\xbb\x38\x96\x4f\xa8\xb1\x2a\xd3\x5b\xe3\xc9\xf1\xf1\xe1\x13\x2a\x63\x32\xc1\x19\x10\xde\x1c\x9f\x9d\x9f\x01\x61\xe7\x68\x4f\x28\x2b\x13\x70\x65\x67\xe2\xc3\xe5\x43\x8d\x0a\x31\xcb\x57\x04\x2f\xac\x85\xfe\xa5\x4a\xbf\x0a\x10\x90\x05\x17\xa9\x60\x01\x6b\x10\x95\x1a\x3a\x90\xbe\x41\x64\xf7\xdc\xbf\x9b\xfa\x34\x42\x60\x2d\xf0\x2e\x00\x02\x6c\x02\xb2\x10\x69\x2b\x8c\x73\x11\xa4\x83\xb8\xa0\xd5\xc0\x70\x5b\x0c\xb3\x8f\xa9\x38\x14\xe9\xc5\x25\x0f\xbd\x52\xb4\xa0\x57\x98\x4c\xae\x50\x89\x1c\xe5\xb0\xba\x5f\x00\x76\x2f\xbc\x47\xfd\x7d\xd0\x44\x27\x24\x7b\x78\xe8\x23\x5f\x04\xf9\x20\x18\xc7\x49\x98\xc3\x54\x96\xc4\x72\x63\x78\xe3\xa7\x61\x02\x09\xa5\xad\x24\x9e\xbe\xe9\xaa\x43\x82\x4f\x15\xf5\x39\x03\x88\xb3\xa4\x75\x91\x91\xc4\xe5\x45\x06\x07\x24\x59\x9d\x5a\x0c\x30\xcb\x81\x0a\x9a\x87\xec\x5a\x3b\xd5\xaa\xdf\x5a\xa6\x9d\x60\x57\x15\xe5\xc9\xad\x66\x90\xf4\xfa\x6d\x16\xc2\xa4\x84\x3a\xe8\x71\xf3\xae\x18\xa6\xee\xd5\x01\xf9\x08\x0c\x3d\xf8\x20\x4b\x62\xd0\x2e\x5b\x02\x78\xf4\x94\xec\xf0\xd6\x98\x74\x2f\x51\x3e\x13\xd6\x92\xc4\x1b\x78\x4f\x38\xa3\x27\x8c\xdb\x2a\x15\x66\xe9\xcf\xf0\x7e\x36\x95\x68\x50\xc9\xee\x81\xbc\xa3\x8b\x71\x57\x56\xbc\x90\x6b\x29\x05\x14\x78\x50\xb4\x1e\x66\x5c\xa4\xc3\xee\x9b\x2a\x3d\xa0\x45\x46\xfb\x38\x98\x56\x2c\x5a\x01\xbd\xb7\x64\xe4\xf3\x2c\x91\xd2\x41\x18\x17\xc4\xce\x65\x9b\x30\x00\x96\x1a\xaa\x83\x73\xf9\x6a\xd1\x21\x86\x0d\x3f\xfd\x16\x19\x53\xf2\x6e\x76\x70\x83\xa7\x2c\x2b\x0b\xea\x4f\xb4\xea\x38\xfe\x73\x26\xa5\x03\xd2\xa1\x8b\x4f\xb5\x3d\xcd\x58\x5f\xe7\x97\x02\x06\xb3\x13\x75\xc0\x73\x1a\x51\x6b\x6a\x04\x2c\x49\xfe\x54\x22\xe3\xd4\x61\xf1\x32\x24\xc1\x12\x63\x26\xbd\x3e\x4e\x0f\xd2\x18\xf5\x80\xad\x54\x60\x09\x1c\xe3\x2d\x44\xf8\x68\xad\x01\x98\x41\xcb\xe2\xfc\x9a\xd8\x57\x1e\x72\xed\xf3\xd6\xf8\x27\x0e\x7c\x84\x70\x6a\xb7\x34\x5b\x5b\xe0\xe0\x06\xde\xef\x66\x21\xa4\x20\x15\x45\x3e\xd8\xc7\xf2\x8f\x5c\x4f\xbf\xb5\xea\x27\xe8\xa5\x17\xc9\x5b\x75\xbc\xee\x76\x65\x87\x30\x42\x3b\x79\x9e\x7d\x94\x51\x83\x56\x85\x94\x69\x10\xb0\x56\x96\x21\xe1\xce\x68\x21\xda\xed\x6b\xca\x56\xb3\xb4\xca\xc6\x63\x4d\x25\x90\x12\xf0\x81\x83\xc0\xe8\x83\x93\x40\x0d\x38\x09\x34\x9f\x43\xf9\x01\xc0\x45\x00\x12\xb0\x0b\x20\xc1\xcf\xc0\xcb\x4b\x40\x56\xb8\x62\xf8\x09\x2f\xf2\x43\xb6\xd4\xb7\xba\x65\xd8\x59\xee\x1f\x4a\x7c\x09\x8a\x2e\xa1\x96\xe0\x12\x17\x8b\xcc\x08\xd9\x2d\x39\xfe\x36\xb1\x2a\xe2\xec\x29\x9b\xa6\x94\xa5\xe5\x8e\x9f\xd2\xf3\x67\x69\x2d\x05\x49\x87\x61\x01\x92\xd8\xff\x90\xdd\xb1\xdc\xac\x79\x83\xdc\xd5\xad\xe5\x58\xb4\x0c\x11\xb4\xb4\xd4\xcc\xde\x96\x4d\xf3\xf6\x7a\x5f\x2d\xde\xd5\xb2\xcb\x35\xef\x9a\x1e\x5d\x31\x7d\xa4\x1f\xbb\xdb\x24\x4f\x6a\xab\xa9\xea\xd2\x46\x3e\xe5\x2b\x97\x97\x4b\x6d\x08\xd8\xc2\xac\x80\x69\x0e\x54\x15\x94\xca\x3f\x85\x29\xe3\x7a\x34\x1f\xf8\x3b\xad\xc3\xf6\x8c\x3b\x60\xf7\x1d\x69\xab\x93\xf3\x71\xca\x9d\xb9\xf1\x09\x1c\xf2\xe7\xd9\x26\x07\xf4\x8a\xfe\x7e\x18\xc6\xe9\xf5\xd0\x99\xde\x09\x9a\x32\xbd\x13\x94\xad\x24\x2e\x10\x3d\x34\x12\x09\x7e\x98\x66\x29\xdc\x8a\xb2\x14\x6d\x92\xa8\xe4\xaa\x31\xbd\xdb\xea\x9c\x18\x1e\x1e\xff\x96\x20\x50\x23\xa2\xd5\xcf\x61\xf5\x80\x2d\x3d\xb5\xf8\xa3\x22\x4b\x66\x88\x9d\xc7\x95\xe9\x1d\x39\xbe\xa8\x1a\x3e\xbe\x2c\xad\x62\x38\xce\x6e\x61\xde\x3a\xcf\xd1\xd3\x02\x59\x28\xaa\x25\x3e\x7c\x8a\x84\x55\xde\x32\xf3\x88\xdd\x5a\x17\xb1\x5b\xeb\x22\x76\x6b\x0b\x10\xbb\xb5\x65\x88\xdd\xda\xf3\x11\xbb\xf5\xbf\x03\xb1\x5b\xff\x3b\x10\xbb\xcf\xf3\xe6\x0c\x64\xf2\x39\x47\x85\xc6\x41\x3f\x5e\xf5\xe7\xa6\xfd\xa9\xeb\x5c\xce\xeb\x1e\xd4\x45\x06\x06\xbe\x0a\xfa\x28\xbb\x75\xfb\x07\xc0\x6c\xc7\x0b\xcf\x2c\xe5\x65\xbc\x6e\x2e\x43\xad\xe4\xb1\x2a\xf1\xe0\x7a\x5e\xbe\x8d\xff\x0e\x29\x3a\x25\xff\xa9\xdb\xa7\x21\x80\x12\x3c\x45\x20\x0a\xfc\x35\xd7\xfb\xb7\x42\x44\x34\xdf\x4d\x4b\x4b\xee\x26\xa3\xfe\xdc\xd1\xe2\x21\xb1\x57\x19\x12\xeb\x9f\x1a\x92\x9d\xbf\x6f\x48\x8e\x3f\x7f\x48\xaa\xb0\x1a\x2b\x0c\xc9\x64\xe1\x90\x68\xab\x40\xb7\xfe\x73\xb3\x64\xff\x59\xfd\xc4\x77\x53\x19\xb8\x63\xc1\x4d\xac\x4c\x4e\x12\xbb\x79\x6f\x4c\x91\xdd\x7c\x3e\x97\x76\x73\x1a\x53\x84\x29\x62\xaa\xf0\x3f\x22\x80\x83\xbd\x9d\xf3\x9d\xbe\x38\x30\x70\xf0\xe6\xf8\xec\xdc\x13\xc7\x59\x81\x44\xb0\x9b\xd7\xd1\x42\x7e\x5b\x76\x66\xf9\x82\x80\x9f\x0b\xe1\x3e\x93\x8c\xc4\x09\x3b\x65\xdd\x52\x78\x6b\x2a\x48\x07\x65\x2f\x15\xaf\x20\x0a\xc6\x24\x06\x2b\x1f\x99\xa5\xf0\x2e\x08\x04\x28\x75\xac\xaa\xcb\x92\xd4\x8a\x11\xd9\x73\x19\xae\x85\x3d\x62\x99\x77\xcf\x47\x3e\x7d\xa2\xa7\xa8\xe3\x94\x9c\xa3\x7a\xa2\xe3\x8b\xe2\x16\x2c\xcf\x28\xeb\xeb\x52\x3a\x80\x69\x31\xcb\xe1\x71\x9a\xdc\x1f\xa7\xd5\x97\xcf\x98\xc4\x27\xd5\xd5\x03\x28\x03\xe4\x41\x12\x38\x51\x06\x69\x7d\x7b\x32\xb8\x86\x48\x6a\x2b\xe0\xe4\x41\x01\x69\xfc\x14\x09\xc9\x0f\xfd\xc0\xa3\x4b\x0e\x85\x7d\x08\x9c\x75\xf6\x0e\xf6\x26\x81\x74\x9c\x15\x30\xc7\x84\xbe\xca\xf2\x49\x89\xff\x47\xbc\x8a\x70\x02\x0d\xac\x5a\xd1\x4c\x4f\x67\x1f\x49\x54\xb1\x23\x7f\xc2\x82\x2e\x97\x17\x3f\x20\xc8\x19\xfe\x61\xeb\x52\x69\x11\x02\xea\x35\x44\x75\xae\xb7\xfe\x54\xaa\x2a\x20\xe3\xb6\x47\xc3\xc9\xd0\x3a\xea\x77\x25\x58\xe7\x19\x82\xd3\xbd\x1a\x51\x8c\x79\xaf\x14\xd2\xa7\xde\x79\x3c\x5c\x53\x00\xa1\xa0\x18\x5e\xf4\x2b\x52\x3b\xca\xd0\x3e\x05\x2e\x16\xf1\x1a\x54\x30\x22\x5f\xc5\x09\x3c\x98\x4c\xb3\x9c\x3f\xb5\xe2\x7c\xf0\x16\xa6\x8d\xb7\xa0\xd3\x90\x4e\x15\xe4\x9e\x70\x59\x2d\x24\x03\xab\xa5\x89\xb0\x5a\x46\x74\x2e\x66\x23\xdc\xf2\x11\x3c\xcf\xd8\xa0\x16\x92\xbc\x3a\x94\x6b\x0b\xec\xb3\xaa\x4d\x6a\x00\x7d\xd6\xcb\x4c\x85\xe9\xc9\x40\x58\x31\x43\xed\x92\x45\xa7\x03\xb9\x4a\xb3\xcc\xd2\xaa\x4e\x8e\xac\xcc\x0f\xcb\xa9\x74\x5c\x1e\x03\x3b\xb4\x95\x80\x9d\xcd\x85\x81\xf6\x45\x67\x11\x51\xca\xae\x46\x79\x0c\x6f\xab\x89\x4a\x16\x0f\x89\x47\x3f\xad\x29\x96\x9b\x45\x76\x5b\x8b\xcb\x6a\xa5\xf6\xaa\xc5\x67\xb5\xfc\xef\xdf\xb2\xc5\x69\x51\x76\x4e\xdb\xd2\xee\xdc\xe5\x10\xa1\x5b\xfd\x15\x92\x25\x89\xe0\xaf\x82\x8b\xa5\x9c\xdf\x3f\x41\xaa\xf9\x80\x67\xff\xbe\x1f\x8c\x1b\x31\x67\x11\x5e\xc6\xc8\xd4\xfe\x10\xa3\x31\x8f\xd9\x8a\x17\x09\x80\xaa\x99\xcf\x12\x65\xf0\x29\x4b\x93\xfb\x33\x98\x44\x78\x9e\xc2\x49\x8c\x08\x6b\x0e\xd7\xd4\x07\xf9\xa1\x6e\x7b\xef\x30\xf6\x35\x7f\x75\xb0\xda\xd7\xfb\xe7\x57\x8d\xc6\x9f\x55\xb8\xb4\x9f\xc2\x60\x08\x1f\x7a\x3e\xdf\x66\x89\xcf\xa7\x00\x1f\x2b\xdf\x9d\xef\x57\x94\x3c\x4e\x43\xcd\x60\x9f\xff\x75\x12\x37\x8e\x8c\xf1\x0a\x8d\xaf\x38\xf5\xf3\xbf\xfb\xfe\xed\x15\xe5\xa2\x25\x9f\x25\x1a\xac\x7c\x16\xa0\xb2\xb7\xcf\x73\xb8\x84\xe3\x53\xf8\x51\x78\xeb\x4f\x41\x4e\xe2\xfe\xf7\x32\x27\x3d\x39\x62\xf6\xc7\x33\xe2\x6d\x16\x87\x5b\xe9\x36\x1a\x8c\xfd\x42\x4a\xe5\x6d\xc2\x9b\x52\x2a\xd3\x30\xa4\x50\x1e\x12\x5e\x96\x52\x70\x01\x2f\xe5\x61\x5e\x26\x03\x48\xb5\xc5\x1e\x83\x9d\x95\x59\x38\xee\x05\x38\xc5\xcd\xe9\x15\xe4\x35\xf2\x70\xd5\x3e\xdc\x2e\x29\x07\x08\xa4\x6c\x69\xa8\x04\x14\xb6\x50\x4c\x32\x3a\xea\x54\x98\x93\xf2\x9e\x3e\xea\xef\x1b\x1a\x68\xb4\xa6\x6f\x6b\x0d\xce\xe7\xb0\x8a\xf1\xad\xe0\x87\xbe\x8e\x92\x60\xb5\xcc\xe2\xbd\xd4\xf3\xbc\xdd\x9c\x08\x90\xb8\x40\xf7\x0d\x13\x44\x65\x12\xd8\x1c\x8b\x3b\x1b\x9e\xf8\xb2\x9e\x23\x65\xd8\x6c\xda\xc1\x70\x30\xc9\xe2\x50\x9e\xcf\xc9\x30\x95\x7a\x75\x2f\x06\x4d\x7d\xb3\x02\x2a\xa9\xcb\xcb\x49\x94\x5c\x5c\x31\x05\x73\xe7\xba\x2d\x26\x4d\x6c\x30\x6b\xb3\xb7\x16\x33\xcc\xc5\x65\xad\xd6\xed\xeb\x84\xbe\x96\xd6\xfb\xde\x76\x4d\xfb\xfa\x3a\xec\xbb\x1f\x90\x10\x07\x26\x0f\x91\x84\x64\x40\x9a\x5f\x5d\xda\xc9\x98\xc5\x18\x57\x61\xe1\xa2\x6a\xc3\x52\x09\xb3\x5f\xd9\xce\x8e\x7f\xf5\x18\xf7\xb7\xa8\xba\xf5\x22\x83\x40\xac\xc5\xf0\x0f\x90\x3f\x22\xd5\xd6\x54\x93\x3b\x29\xae\xb7\xeb\xe5\xf8\x3d\x3d\x67\x5e\x43\xd4\x13\x70\xb6\x29\x4d\x2e\x90\x80\x49\xc3\xaa\xba\x4b\xa9\xfd\x73\xea\x2d\x37\xab\x76\xdd\xd5\x09\xe1\x73\x2a\xaf\xf6\xc7\x4e\xed\xf7\xa9\x3f\x89\x03\x4e\x44\x5d\x18\x21\xa0\x5c\x35\xb8\x3d\xb1\xd7\x7a\x60\x4d\xc1\x87\x89\x47\x72\xd7\x1b\x36\xce\x9e\x3f\x96\x9d\xac\x48\x6b\x4a\x7d\xbb\xb1\xbe\x8e\xd6\xd7\xf3\x6d\xb1\x1c\x7e\x82\xb7\x32\x14\xc4\x8d\x7c\x43\x04\xc2\xfb\xb7\x02\x1d\x10\x9c\x02\x71\x4a\xb5\x13\xe1\x14\x54\xc7\xe9\x42\x63\x58\x9d\x72\x4b\x88\x9a\xb8\x10\xc4\x72\x32\xd0\xe5\xaf\x4f\x56\x07\x55\xe4\x2e\xb1\x66\xb2\x38\x0d\x72\x62\xef\x76\xda\x10\xfd\x7a\xa6\x42\xaf\x88\xb8\xe1\xa9\xc0\xc0\xac\xde\x7d\x85\x27\x69\xbf\xf4\xa8\xd6\x9f\xef\x11\xa8\x17\xc9\xcd\x98\xad\x58\x9e\x53\x22\xe2\xe7\x7e\x3e\x28\x10\x9c\x9e\x55\x62\x34\x39\x1c\x3f\x26\x87\x30\x59\x9a\x35\xb3\x21\xf3\xf0\xf2\xf4\xe2\x6f\xfa\x53\x86\x87\x8a\x8f\x4a\x9d\x43\x85\xbc\xac\xe8\x2a\xe4\x76\x84\x96\x26\xc1\x6d\x29\xe9\x9b\xa0\x99\x17\x75\x9a\xe4\xd6\x02\xd5\x37\x41\x28\x27\x1b\x35\xe9\x7c\x5f\xaa\x31\xbe\x0c\x99\x35\x83\x67\x39\x7a\x4f\xc3\xcd\x2e\x15\x6c\xd9\x32\xe1\xe7\x12\xec\xb3\xb2\x60\xf2\x10\x10\x5f\x8a\xfc\x99\xa5\x4d\xfc\xc2\xab\xea\x85\xd3\x5c\x92\x99\xf2\x12\x62\x01\xc3\xbb\xb8\x64\x62\x52\xad\xd6\xa1\x07\xdf\x9e\x66\x48\xb0\x1d\x60\x62\x91\x78\x56\xad\xb4\x54\x44\x03\xb9\xa7\x72\xb1\xf9\xb7\xe1\x85\x72\x49\xda\x37\x44\x20\xf5\x9e\x16\xb9\xe3\xc8\x9f\xc0\x83\xf4\x30\x2e\x88\xf0\xe3\x4f\xa5\xc5\x9d\x27\xcb\x97\x8b\xc2\x52\x74\x29\x4d\x41\xde\xd3\xd1\xcb\x8f\x07\xcf\xeb\x69\x4e\xa1\xb6\x42\x57\x2f\xea\xb8\x47\x46\xa0\xde\xbd\xaa\x21\xf8\x47\xfb\x99\x33\xb4\xc3\x42\x4f\xa7\xa3\x57\x39\x0b\x3e\xaf\xbb\x3b\x5a\xcd\x65\x9d\x0e\x9a\x87\x09\xfe\xb0\xc4\x5b\x7b\xf4\xef\x26\x5f\x8e\xe6\xa6\x72\x76\x19\xc1\xf5\xba\x83\x19\xe1\x1d\x53\x42\xae\xa8\xd3\x6c\x94\x79\x95\x67\x93\x45\xc1\x91\x88\xb2\x6d\x61\x0d\x4c\xf1\xc6\x62\x8d\x1c\xe7\xc4\x83\xa2\xa7\x86\x32\xa8\x48\x92\x0f\x0e\x9e\x6c\x05\xd2\x0e\x2a\xf2\x14\x9b\x90\xb2\x3b\x1f\x0d\x28\x62\x18\xcc\xe2\xa3\x2f\x9e\x08\xa5\xe8\xe2\x42\x05\x95\xa4\xbe\x49\x51\x0a\xbe\x12\xdc\x1a\x50\x81\x38\x41\x9b\x86\x42\xf0\x83\x92\x38\x85\x5c\xae\x36\xca\x18\x67\x41\xd1\x8f\x33\xc3\x8c\x94\x6b\x59\x52\x04\x22\xf2\xf1\xe6\x07\xef\x44\x20\x2a\xe4\x73\x23\x94\x6e\xb2\x8c\xa4\x48\x01\x51\x0b\x90\xa6\x34\xeb\xa8\x73\xb5\xbe\x52\x4a\xaa\x58\x0c\xc4\x52\x65\xb7\x81\x2c\x2b\x93\x13\x1b\x04\x95\x1d\xc7\xec\xa5\x85\xda\x6e\xba\x51\xd1\x42\x0c\x3a\xab\x8b\x49\xd7\xc5\x3a\xab\xa1\x57\xc6\xf3\xb9\x34\x66\xd0\x2b\xb7\x93\xf2\x0e\x94\x47\x62\x37\x6c\x45\x19\x99\xa1\x16\x58\x8a\x11\x38\xa3\xc8\x8c\x2c\xd7\xd2\x4d\x2d\xd2\x74\x37\xd2\x75\xd5\x09\x7d\xdd\xd6\x0c\x06\x69\x63\x39\xaa\xa9\x9b\xb6\x6a\x28\xae\x63\xdb\x86\x66\x2b\xdf\x20\x12\x3b\x43\x77\xf5\x53\x01\xde\xc5\x05\xb9\x47\xe3\xee\x7f\x53\xe1\xe3\x38\x0e\xc6\x04\xb1\x38\xf1\x03\x8a\xc5\xd2\x0b\xde\x5e\xe2\x55\xbe\x7f\xfb\x75\xd1\x58\x3a\x30\x92\xaa\xde\x49\x69\x03\xb6\xbc\xec\x26\xbd\x50\xcd\xbf\x15\x88\xb8\xfe\x1c\x9f\x4b\xe7\x50\x5b\xbe\x25\xb8\x40\xfc\x84\x77\x81\x24\x2e\x10\x87\x05\xc6\x8c\xc9\x4a\xe1\xb0\x17\x3b\xa6\x7a\x89\xab\x89\xc3\x56\x4a\x85\x37\x05\xfa\x6d\xe7\xfa\xd0\xa7\x6e\xe7\x73\xe9\xb6\x0c\x25\x54\xdd\x83\xf3\x81\x3a\x42\xc5\x36\x22\x43\x8b\x60\x68\xaa\x91\x61\xab\x23\x53\xb7\x6d\xd7\x30\x15\xd3\x34\x1d\x5b\x55\xfd\x28\xb0\x02\x83\x41\xb7\x1b\xba\xe3\x98\xba\x65\xd9\xae\xe5\xa8\xae\x6b\xe8\x7a\x3f\xa2\xfd\xb7\x31\x2d\x85\xdb\x33\xb2\xcb\x73\x16\x00\x55\x8c\xee\x65\xd3\x10\x65\xc2\xac\xf8\xba\xc1\x37\x3a\x33\x51\x6b\xa3\x20\xfd\x4b\x6b\x47\x59\x78\xd9\x4d\x7a\xa1\xd9\x7f\xeb\x4c\xac\x3f\xc7\x97\x34\x9b\xf8\x49\xad\x59\x93\xc0\xe8\x73\x27\x4d\x35\x7e\xfd\xd0\x98\xd5\xdb\x6a\xda\xf0\x49\xf5\x64\x38\x9a\xcf\xa5\x23\x36\x19\x2a\x6b\x07\x94\xc3\xe6\x84\xd0\xa3\x20\x74\x54\x45\x0f\x47\x16\x54\x7c\xa8\xc2\xd0\xb0\x35\x35\xb4\xa1\xea\xc3\x40\x1b\xa9\xee\xc8\xb5\x02\x85\x4d\x08\xdb\xb4\x2c\xdd\x54\x54\x43\x55\x1c\xc5\x54\x4c\xc7\xf8\x16\x23\x86\x54\x13\x82\x71\x38\x10\xc6\x59\x81\x80\x40\x42\x50\x55\x3d\x31\xcd\xb2\x84\x4c\x90\xfb\x6c\x96\x2f\x9d\x21\x7f\xef\xd4\xd0\xdb\x91\x44\xfe\xa5\xb7\xf1\xf3\x5f\x76\x93\x5e\xe8\xee\xdf\x3a\x35\xea\xcf\xf1\x54\xd9\xf5\xd4\x50\x17\x01\xfa\x22\x72\x47\xb2\xc4\x4a\xf7\xff\xa1\x34\x76\x50\x1a\x9f\x2a\x3b\xaf\x22\x32\xab\x95\xb0\x5c\x8b\xcd\x58\x5c\x7e\x36\x2a\xe4\xaa\xab\xe1\x67\x61\xb9\x85\xf9\xe3\x58\x6e\x57\xb3\x77\x92\x0e\x44\x81\x57\x84\x57\x47\x5f\x41\xec\x5a\xd6\x1a\x95\x09\x29\x6f\xa5\x5b\x8e\xa7\xb1\x82\xad\x2d\x1a\xf4\xd8\x4e\x94\x00\x58\x34\xc8\xf6\x79\x0e\x54\xd0\x30\x6d\x35\xbb\x5e\x41\x36\xb8\x62\xd9\x28\x41\x56\xaf\xe3\x11\x87\xa4\xc5\x10\xe1\x48\x0a\x17\x48\x9c\x7d\x27\x64\x7b\x4c\x1f\x38\x88\xaa\x56\xe0\x20\x35\x36\x88\xaa\x95\x60\x72\x25\x22\x5c\x3f\x6a\x5b\xc3\xca\x59\xad\xd1\xa1\x54\x13\x5c\xe7\xcb\x00\x72\xb4\x1e\x03\x41\xd0\x09\xfa\x6d\x55\x1e\x66\x3c\x16\x9d\x4d\xd7\x0c\xdc\xa0\x0a\x9b\x8b\x7c\xd4\x01\x63\xe6\xdf\x56\x1a\x64\xaa\x66\x4f\xad\xee\x62\x6c\x91\xc6\x20\x68\x0a\xb8\x5d\x8c\x1d\xa2\xf6\x8c\x49\x85\x2e\xd7\x05\x97\x5b\x36\x04\x9a\xde\x33\x04\x9a\x51\x22\xa8\x90\x2c\xe6\x82\x21\x28\xc1\xe3\x3a\x43\xa0\xd9\xe0\x68\xe9\x10\x38\xab\x0c\x81\xe6\xd4\x43\xc0\x81\xe1\xb9\xfc\x10\x68\xf5\xc4\xd4\x15\xb0\xb3\xc2\x10\xe8\xea\x8a\x43\xa0\x6b\xe0\x78\xf5\x21\x68\x82\xbc\xe9\x9d\x09\xa2\x1b\x8f\x00\xe5\xe8\x66\x07\xdd\x4d\xb7\x4a\xd4\xb3\x12\x25\xae\x77\x18\x74\x67\xc1\x30\xe8\x2e\x98\x7c\xde\x4c\x58\x00\xf3\xa6\x74\x9a\x67\x54\xce\x0a\x75\xe4\x7d\xa3\xcf\xaf\x90\x81\xec\x31\xf0\xb9\xfd\x67\x74\xf0\x57\x47\xa7\x31\xdb\x99\xd7\x50\xe7\x5e\x70\x59\xcd\x0b\xf3\x3a\x95\xa1\x71\x17\x73\xa3\x3c\x76\x56\xb6\xc6\x6c\x70\x3a\x88\x37\x95\xe7\x4f\x75\xe9\xd1\xef\x0b\x49\x69\x29\xc6\xd9\xc7\x57\x59\x3e\x21\xb7\x3e\x52\x7d\xb8\xad\xa1\x6a\xec\x25\x44\x55\x42\x7d\x45\x15\x73\x4f\x59\x4c\x55\x7d\x41\xf0\x04\xb2\xea\xc3\xc3\x6a\x74\xf1\x2a\xe6\x8a\x34\x66\x9c\xdf\x22\x8d\x4a\x78\xa8\xb2\xa4\xe9\x73\x90\x46\x4d\xd3\xdf\x65\x63\xdb\x22\x9c\x27\x44\x94\x57\x45\x3d\xb9\x41\x83\x2b\xe3\x6d\x0b\xef\x84\xb9\x60\xf1\xb0\x27\x15\x6e\xc9\x07\x53\xe5\xf1\x4e\x6e\xd0\xe0\xbe\xc8\x6a\xa8\x13\x86\x64\xf2\xda\x34\x41\x94\x37\x01\x4a\x1a\xd8\x28\x14\x15\x85\xf3\xf1\xea\x59\x90\x96\xf8\x79\x11\x49\x8a\xb9\x46\x35\x94\xc8\xbd\x98\x0e\x71\xba\xc9\x70\x2c\x34\x5d\xc1\x45\xc8\x32\xb0\xf4\x3b\xa5\x23\x17\x45\x73\x18\xf9\xc1\xcd\x75\x9e\xcd\xd2\x70\xf8\x2f\x08\xe1\xd6\xc4\xcf\xaf\xe3\xb4\x26\xa2\x4c\x28\xfd\xb5\xb6\x4a\x32\x73\x8a\x9e\xc1\x27\x11\x48\x0a\xee\x79\x94\x21\x94\x4d\x70\xd2\x03\x15\xb1\x06\x44\x5d\xdc\x8b\xa5\x52\x93\x41\x9c\xd9\x28\xfe\x08\xfd\x5d\x3a\xc0\x29\xc4\xc5\x6d\x18\xa7\x63\x98\xc7\x68\xab\xe5\x13\x36\x08\xfd\xfc\xa6\x07\x8b\xe2\xf1\x1e\x01\x02\x29\x2b\x08\xc2\xb3\x8a\xf3\xb4\xff\x4b\xd3\x74\x43\x0f\x1e\x06\x5d\x61\xa0\xdf\xdd\x8e\x01\xa6\x50\xf6\x20\x7e\x8d\x9f\x28\x2c\x86\xaa\x28\xff\xfe\x9c\x6a\xb8\x04\xbe\xc6\xca\x73\x0e\x9c\x12\x68\x0d\xcb\x71\x75\x57\x06\x67\xe4\xc1\xb0\x6c\x47\x93\xc1\x88\x3c\xe8\xaa\xa5\x9b\x32\x38\xa0\x08\x1c\xb6\x89\x85\x83\x43\x9a\x4d\xd3\xb0\xb0\x76\x42\x1e\x6c\x45\x35\x14\xce\x43\xe1\xfe\x49\x7e\x78\x96\xc9\xbb\x9e\xd0\x24\x8b\x97\xf5\x69\x12\xb7\xc1\x97\x49\x35\xf0\x5a\x43\x42\xb5\xdc\xee\x46\x5a\xf9\xe1\xd9\x4a\x75\x6a\x78\xaa\x1f\x9e\xad\xae\x70\x36\xf8\x5c\x3f\x3c\xbb\x0f\xac\xee\x4b\xfb\xe1\xfd\xd9\x76\xa8\xa1\x6e\x40\xd6\x0a\x5e\x40\xb6\xbe\x92\x17\x50\xfd\xad\x9b\xa7\x39\xef\x10\xec\x6a\x60\x1b\xbd\x1e\x4c\x7b\xcf\xaa\xcb\xec\xad\xeb\xe3\xb3\xea\xb2\x7a\xeb\xba\x7b\x56\x5d\x76\x6f\x5d\xaf\x97\xd4\xb5\x68\x34\xd8\x80\xd5\xa3\x41\x10\xa5\x81\x28\x9c\x8f\xa1\xb0\x0b\x73\xc6\x09\x50\xd8\x99\xa1\x71\x96\xc7\xe8\x9e\x06\x45\x2b\xe2\xeb\xb4\xa0\xb1\xcc\xea\xd0\x5f\x5c\xfe\x41\xfb\xfc\xdc\x26\xf6\x7d\x3f\x23\x69\xfa\xd7\xe0\xa4\x77\x3d\xfe\x6b\xac\x73\xca\x63\x88\xed\x54\xcd\x57\x5b\x22\xec\x0a\xee\x7a\xcc\x43\xaf\x29\x94\x1c\xff\x39\x93\xba\xae\x7b\x6f\xfb\x1b\xae\x6b\x5f\xa3\xe1\xaf\xbe\xa1\x86\xff\xb2\xa0\xe1\x26\xa8\x71\x3d\x1f\x69\x78\xbb\x79\x6f\xbe\xa1\xe6\xfd\xb5\xa0\x79\xce\xf3\x9b\xf7\xe1\xeb\x37\xaf\x98\x8d\x52\x88\x7a\x1b\xc8\x5e\x71\x4d\xfc\xb5\xbf\x89\x86\xfa\xfc\x26\xfe\xf4\x0d\x8d\xe0\x1f\x0b\x9a\x67\x3c\xbf\x79\x3f\x7f\x63\x23\xf8\xdd\x82\x26\xae\xe2\x58\xfd\xe4\xc5\xe7\xc7\x6f\x68\x6c\xff\xdb\xdf\x70\x73\x15\x27\xff\x27\x37\x1c\xa6\xdf\x4e\xc3\x51\x5b\x65\xce\x1a\xfe\x55\xf6\xd9\xfc\xeb\x37\xfc\x49\xec\x9e\x2e\x68\xfc\x57\x61\xf7\xec\x1b\x1a\x75\xbf\xbf\xe1\xd6\x57\x61\xf7\xe4\xdb\x18\x75\x5c\x4d\x90\x7a\x17\xa7\x68\x30\x1d\xb0\x60\xc5\x87\xfb\xa7\x57\x6f\x8e\xcf\xce\x01\x49\x7c\x77\xb6\x7f\x7a\xb4\xf3\x76\x9f\x3e\x9d\xec\x9c\x9d\x7d\x38\x3e\xdd\x03\xed\x02\xbb\xfb\xa7\xe7\x97\x60\x96\x7e\x9e\xa7\x3d\x48\x69\xa9\xb8\xcf\xd7\x3e\x5e\xc1\xd7\x3e\x1e\xf8\xd3\x78\x37\x89\x61\x8a\xbc\x14\xc4\xa5\xca\xf2\x0c\xf9\x08\x7a\x37\xb8\x23\xcc\xc1\xde\xfe\xab\x9d\x77\x87\xe7\x20\x1e\x04\x59\x9a\x12\x8d\x99\xb7\xa6\x82\x78\x70\x1b\x4f\x8f\x20\xfa\x98\xe5\x37\xc4\x8d\x9e\x96\x2e\x83\x01\x13\x0d\x9d\x27\x36\x03\x04\x9f\x41\x84\xe2\xf4\xba\x10\x41\xdc\xe7\xcd\xce\x55\x78\x02\xf3\xdd\x24\x9b\x85\x1d\x47\x9c\xda\x49\x66\x8b\xf7\xc9\xe1\x8a\xae\xaf\xb7\x53\x38\x17\xac\x06\xa4\x18\xf9\xc2\x76\x27\x77\x14\x27\x08\xe6\x52\x8f\x21\x27\x1a\x04\xb8\x08\xb1\x66\x6e\x54\x32\x98\xcd\xe2\xf0\x41\x1e\x5e\x5c\xf2\x4e\x22\x29\x44\xb8\x21\xac\xe2\xa5\x3e\x45\xd7\x10\x9d\xd1\x02\x52\x83\x44\x56\xf6\x88\xce\xbd\x4e\xd5\x6f\x2b\xe4\xe7\xcf\xf9\x48\x5d\x0b\x03\x32\xef\xfd\xea\xb7\x8b\x35\xc0\xbc\xdc\xa7\xd3\xe4\xfe\x0c\xc1\x29\x33\x00\xc6\x73\xff\xb3\x10\x08\x1e\xa9\xb6\x07\x97\xe0\x91\x12\xcf\xc7\x09\x78\x6e\xc5\x4f\x42\x0f\x08\x66\x05\xca\x26\xf1\x5f\x90\x8c\x40\xe9\x79\x7a\x73\x4d\x1b\xb7\x4b\x42\xd9\x79\x9f\x28\xe6\xeb\x27\x82\x53\x3d\xec\xeb\xdf\xd2\x8f\x8b\x3e\x01\xb6\xf6\x9f\xc3\x3b\x34\x14\x7f\xbc\x17\x42\x4a\x23\x10\xfc\x24\x29\xad\x5a\x0a\xe1\x63\x9c\x24\xc2\xd8\xbf\x85\xcb\xe2\x8b\x53\x3c\xf2\x70\x20\xbc\x81\x39\x24\x51\xc3\x27\xfe\xfd\xef\xa9\xd0\xfa\x57\x82\xdc\x27\xf7\x55\x54\xf1\xd2\xbe\x8c\x10\x4f\x22\x8b\xc7\x21\x4c\x11\x7e\xe5\x0b\xc5\x6c\x54\x40\x24\x64\x51\x4d\x0e\xd5\x3f\x8c\xb3\x59\x12\x12\xaa\xba\x1f\x59\x85\xcc\xa3\x0c\xc1\xa1\xb0\x4f\xfc\x28\x69\x95\x68\x0c\x0b\x58\x52\xe1\xe7\x50\x98\xe6\xb0\x80\x29\x12\xb2\xb4\xfb\x89\x38\x0d\xe3\xdb\x38\x9c\xf9\x49\x3f\x61\x23\x58\x7e\x4a\xf8\x18\xa3\xf1\x12\x92\x06\x22\xa0\xd7\x9b\x5f\x6d\x14\xb8\x4e\xef\x36\xe4\x4b\x8d\xc2\x12\xaa\xba\x1f\x2d\xc9\x14\x1f\x00\x5e\x28\x8a\xe1\x27\xea\xe4\x3d\x6c\x2d\x2d\x4c\x03\x36\xec\x71\xed\x14\x1b\x9c\x2c\xca\x0f\x25\x6a\xc8\x02\x58\x11\xf1\x43\x96\xdf\xe0\x4d\x50\x04\x3c\x0a\xf4\xf0\x14\x0d\x6e\x06\x0d\x5c\xe8\x41\x14\xa7\xe1\x62\x6f\x14\xcf\xf3\xa8\xc0\xc0\x82\x2d\x1c\xee\xfc\xb8\x7f\x78\xf6\x20\x3f\x3c\xf0\x7e\xde\x78\x2f\x3e\xfc\x71\xa9\x23\xe9\x16\xef\xcc\xd8\xd8\xd5\x0f\x8f\x77\xf6\x0e\x8e\x5e\xd3\x49\x5e\x09\x01\x83\x5b\x98\xc7\xd1\xfd\x4e\x10\x64\xb3\x14\x49\x9f\x82\x1c\x92\x11\xf2\x93\x62\xf8\x09\xaf\xd8\xb5\xdf\x4e\xdd\x55\xac\x07\x8b\x8b\x86\x00\x74\x49\x5d\x60\xc1\xd4\x2f\x8a\x8f\x59\x1e\x2e\x2f\x55\x0a\x4a\x65\xa9\x71\x56\xb4\x47\xaa\x55\xa2\x25\x7d\x95\x05\x11\x4c\xfd\xce\x20\x3f\x42\xe2\xee\x0e\x01\xb4\x5e\xf5\x73\x44\x76\x2b\x1d\x7c\xe5\xc1\x34\x9e\x42\x49\x52\xc0\x69\x3e\xb8\x93\xa5\xee\xd6\x0b\x97\x49\x55\x0f\x32\x90\x14\x70\x96\x0f\x4e\x65\xa9\x03\x86\x22\x73\x60\x2b\xbc\x34\x02\x7b\x94\xf6\xa2\x08\x20\x2f\xa0\x29\x00\x62\x1e\x26\xd2\x49\x21\xc9\xf4\x89\xed\xb3\xfb\xe9\x75\x9c\x42\xd2\xca\xea\xd5\xfb\x5a\x00\x22\x49\x14\x0b\xf6\x7d\x19\x9c\xa2\x90\xd6\x14\xcc\xff\x1c\x15\xa5\x48\x4d\x68\x21\x40\x0f\xfe\x35\x9c\xcf\x51\xfd\xf3\xa7\xb3\xe3\xa3\x41\x81\xf2\x38\xbd\x8e\xa3\x7b\x82\xdc\xda\x43\x79\x3e\x20\xee\x1b\xc7\x91\x24\x1e\xb0\x78\xb3\x1c\xdb\x89\xf2\x0f\x9e\xb2\xdd\xf7\x66\x28\x10\xdf\x75\x6a\x33\x59\xf2\xa6\xe0\xa7\xa1\x50\xb2\x9c\x38\xe4\xea\x3e\x85\x05\x8d\xf7\x8b\xff\x12\x2a\x80\x40\x47\x28\x4e\xaf\xf1\x5a\x84\x05\x14\x98\xb7\xbe\xd7\xaf\x79\xae\x35\xd5\x25\x11\x68\x0c\x05\x52\x22\x46\xf7\x78\x0d\x23\xc1\x5f\xeb\x02\xe2\x50\x7c\xe5\xc7\x78\xa5\xc6\x1f\xa2\xa3\x84\x7f\xe2\x6c\x74\x75\x8c\x61\x28\xec\xdc\xc6\xc4\x6a\x4e\x18\x95\x6b\x6d\x50\x7d\x7e\x50\x3b\x4b\x37\xd0\x0d\xaa\x31\x5e\x61\x1d\xa8\xa7\xf9\x35\x44\x3b\xb7\x71\xc9\x1c\x15\x0b\x7f\x31\x3e\x24\x15\x7b\xe8\xeb\x30\x0c\xd7\x95\x25\x10\x49\x5f\xd7\x11\x1a\x84\x24\x2e\xd0\x92\xbe\xeb\x99\x11\xcf\xe8\xc8\xde\x79\xf5\xc5\x7b\xb5\xe8\x7e\xc5\x43\x00\x0e\xf0\x81\x0e\x0b\xf2\x64\x38\xa5\xd6\xc9\x84\xca\xf0\xff\xe0\x38\x30\xaa\x05\x48\xc8\x16\xc8\xd5\xef\xa3\xc3\xc2\xad\x46\xcf\x18\x8e\xc6\x5a\xf6\xc5\x87\x81\x3f\xf6\xfe\xcd\x1c\xfe\xfe\xe0\x44\x48\xcb\x63\xea\x82\xde\x6b\x70\xc3\x2a\x70\x50\x3d\x6c\xf5\x8a\x9c\x80\x61\x88\x8f\xf5\x90\x1d\x9a\xe9\x7c\x2a\xf1\x11\x1a\x3c\xe6\x71\x19\x5a\x92\x0d\x7f\x76\x66\x92\x0d\x2c\x61\xd3\x1a\x75\xd4\x15\x2f\xa6\x66\x51\x86\xce\x89\x1d\x36\x36\x5f\xda\xa9\x83\x38\x0d\x92\x59\x08\x0b\x09\xf5\x9c\xdd\xe5\x07\x59\xee\xf6\x61\x29\xcf\xb1\x63\x71\x77\x9a\x53\x3f\x88\x05\x1e\xb3\x4d\x61\x92\x48\x11\x6f\x77\x8e\x76\x5e\xef\xbf\xdd\x3f\x3a\xaf\x02\x69\x9d\xed\x9f\xbe\x3f\xd8\xdd\xbf\xda\x3f\x7a\x7d\x70\xb4\x7f\xf5\xfa\xf4\xf8\xdd\x09\x8d\xae\x45\x45\x8c\xf9\xfc\xcb\x54\x56\x81\x09\xc2\x6e\x3b\xeb\x09\xf3\x28\x6c\x3c\xa7\x1a\xf0\xb8\x73\xf8\xe3\xa4\x1d\xed\x9f\x7f\x38\x3e\xfd\xf9\xd9\x4d\x6b\x96\xe7\x5a\xf3\x14\x22\x98\x14\x77\x75\x72\xb8\x73\xb4\x7f\xf5\xfe\xe0\xe4\xb3\xc9\x7a\xac\xc6\x55\x08\xc5\xd9\xb1\x3c\xfe\xa5\xc8\x7c\x72\x7d\x8f\xf0\xc6\xee\xc1\xde\xe9\x67\x72\x79\xf9\x3d\x5c\xd5\xe7\x8c\x3e\x2d\xff\xc5\x47\xff\xb9\x64\x3d\x56\xe3\x17\x1e\xfd\x95\xc8\x7c\x72\x7d\xcb\x46\xbf\x47\xc1\xf8\xc8\x02\xb1\x4c\x99\xe8\xc1\x56\xac\x89\xfa\x7c\xd1\x57\xef\x9a\x82\xb7\x8b\x6d\xa9\x0f\x97\x81\x9d\x8f\x8f\xdf\xed\x11\x1e\x06\x2d\x60\x88\x4b\xd0\x07\x2e\xd1\x2e\xb4\x48\xad\x06\x44\xb1\x56\xad\x75\x3f\xbb\x70\x95\x7d\x02\x15\x8b\xeb\x78\x26\x51\xfc\x8c\x7e\x02\x1d\x8d\x62\xcf\xfc\xf4\x13\xd7\x9b\x27\x50\xf7\xd4\x9a\x3f\xb3\xef\xf0\x7c\x68\x53\xb7\x08\x62\x24\xcd\x3e\x8c\x63\x04\x8b\xa9\x1f\xc0\xe3\x74\x3f\x0d\x2b\xbc\xd5\x78\xfa\xca\x9f\xc4\xc9\x3d\x8d\x4a\x72\x12\x0f\x0e\x4e\x6e\x8d\xed\xe5\x48\x25\x07\xe5\x06\x7c\x06\xaf\xf1\xdc\x91\xe4\xe1\x63\x05\x6e\xad\x76\x91\x15\x86\x99\xb4\xf0\xeb\x0f\xf3\xff\x7f\x3b\xf2\xa9\x9d\xf0\xcc\xbe\x7e\xb2\xa4\xf1\x84\x49\xf5\xf4\xba\xbf\x5c\x23\xbe\x1c\xc9\x5f\x89\xc0\xff\x1b\x79\xfa\xe9\xdd\xf0\xe5\x19\xe2\xff\xaa\xde\x5d\xbd\x2f\xe5\x21\x95\x7e\xc2\xb8\xf0\xf3\x49\xbf\xe8\x43\x90\x20\x7b\x33\x2d\x16\x32\x16\x97\x79\xca\xa9\x72\x49\x35\x8d\xe9\xf9\x78\x36\xd2\x13\x8b\xb3\x3d\x55\x0e\xf8\x22\x35\x3d\x42\xd3\x63\x6b\xd2\xb3\x4a\x3e\xfd\x9b\xcf\xee\x89\xa7\xcf\xfa\x35\x45\x6e\x68\xe9\xf6\xaa\x60\x7a\xcb\x54\x74\x4c\x13\x13\xa4\x83\x22\x9b\xc0\x1e\xd5\xd0\x1a\x6c\x1d\x63\x50\x09\x9f\x2a\xcf\xe7\x4f\x2e\x16\x87\x2d\x0d\x2f\xb5\x78\xe8\x3b\x5f\xc4\x91\xb4\x46\x97\x8d\x62\x7f\x32\x45\xf7\x3b\x79\xee\xdf\x4b\x6d\x7b\x90\xd2\x14\x45\x5e\x5f\x6f\x68\xcf\xfa\xf2\xac\xa4\xfd\xda\x8a\x23\x09\xad\xaf\xf7\x7d\x7a\x10\x90\x5b\x76\x18\x32\xaa\x65\xb9\xb6\x3c\x69\xbe\x59\xac\xf3\x12\xdf\x1b\x22\xb1\x50\x89\xc8\x52\xf8\x50\x46\x13\xe4\x6c\x53\x1a\x37\xfd\xcb\x47\x2f\x48\xbb\xc0\xc1\x44\x3b\xda\x3f\x64\x14\x85\xbe\xa8\x94\xae\xa3\x7c\x30\x92\x25\x53\x51\xc8\x3d\xd7\x41\xf3\x8a\x8c\x58\x74\xb1\x06\xb6\x14\xa3\x50\xf6\x3c\xaf\xa3\x2c\xe5\x6f\xcb\xe0\xe3\x5a\x5c\x82\x6f\x5c\x5e\x89\x11\x28\xea\x86\x05\x53\x75\x4f\x71\x71\xb9\x40\xbb\x4e\x5e\x74\x6f\xc2\x54\x59\x7e\x90\x1f\x16\x9f\xe8\xeb\xb5\x79\x41\xaf\x7c\xc9\x7e\x78\x82\x42\xbb\x73\x31\xb0\xea\xf5\x41\xcb\xcc\xe4\x38\x7d\x5f\xb7\x6a\xd1\x31\xb2\xab\x5b\xe4\x40\x4a\x57\xaf\xb0\xde\x22\x5b\x0a\xa9\x27\xd5\xf6\xc8\x69\xfb\x49\xfa\xde\x27\x7d\x78\x25\xc1\x75\xa1\xb2\x65\xd9\xa7\x0e\x98\xa8\xb3\xb0\xd3\x2e\x2e\x01\x87\xc5\xb8\xac\xd8\xa3\x62\xd9\x53\x05\xa8\xcb\xc7\x8b\xf4\x88\x50\xab\xe3\x40\xa2\xca\xfe\xaa\x07\xf8\xf1\x29\x76\x5b\x3c\xdc\xe3\xe2\x72\x9c\xe1\x5d\xeb\x65\x0f\x6d\xbc\xc1\x5d\x51\xe7\x9c\xcf\xa5\x76\x12\xbb\x36\xc9\xa1\x8f\x60\x3f\xa1\x55\x5a\xbd\x72\xb7\x73\x2f\xa6\xe0\x14\x0d\x6e\xbe\x1c\x5a\x25\x60\x0f\x87\xf9\x20\x39\x79\x2a\x76\x25\x9e\x53\x9b\xe5\x8d\xe0\xa3\x00\x96\x9a\xca\x10\x2c\x4d\xb7\x07\xc1\x92\xec\x4d\x00\x81\x1c\xa4\x20\x06\x19\xf0\x41\x02\x82\xaa\x69\x5e\x8d\x39\xb5\x33\x9f\x4b\x3b\x0c\x73\xaa\x7d\x25\x49\xcd\x50\x29\x90\x94\x6e\x98\xba\x13\xb9\x50\xf3\x2d\xd7\x51\x14\x2d\xb0\x02\x2d\x0a\x20\x54\x0d\x68\x5a\x50\xb5\x5c\xdb\xb7\x0d\xdf\x55\x69\x6e\x55\xd7\x34\xd7\xb0\x1d\x47\x53\x6d\x55\x75\x6c\xcb\xd6\xfb\x61\xa7\x7a\x70\x95\x64\x80\x38\xfa\x8e\xe7\x73\xe9\x98\xd1\x57\x99\x2f\x70\x70\x58\x23\xcd\x19\x29\xb6\xe3\xf8\xb6\xa3\x05\x10\x5a\xa1\x15\xea\x66\x68\x9b\xee\x28\x80\x86\x6b\x2b\x81\xad\xa8\xba\xed\x07\x65\x2b\x2c\x43\x55\x4d\x55\xb1\x6d\xc7\xb5\x6d\x5d\x55\x16\xc0\x61\xf5\xd2\x95\x73\x74\x4d\xe6\x73\x69\xc2\xe8\x2a\x2d\x29\x78\xba\x70\xf7\x44\x9a\xeb\x1b\x11\xb4\x4d\xdf\x74\xa2\xc8\x56\x61\x68\x8c\x54\xd3\x70\x34\x3b\x8a\x14\x4b\x8d\x9c\x20\x64\xfd\xe5\xa8\xa6\xeb\xaa\xba\x63\xeb\x8e\xad\xd8\xb6\xa1\xa9\xf6\x13\xe8\x4a\x39\xba\xf6\xe7\x73\x69\x9f\xd1\x55\x9a\x50\x8c\x50\xca\xe0\xf1\x5c\x5f\x57\x82\x60\xa4\x29\xa3\x60\xe4\x07\x7a\xe0\x84\x4e\xe0\x5b\x23\x4b\x77\xa0\x03\xe1\x68\x64\xc3\x00\xfa\xae\xcf\x72\x9b\x8a\xae\x59\x0a\xee\x27\x53\x31\x14\xc5\x50\x17\x80\xe9\xf5\x12\x15\x73\x44\xed\xce\xe7\xd2\x6e\x4d\x54\x69\x2b\x32\xce\x0a\xd4\xec\x33\xd7\x36\x1d\xc3\xd7\x47\x81\xef\x06\x9a\x6a\x8e\xa0\xaf\x59\xb6\x1d\x86\x86\x62\x58\x51\x64\x45\xae\x63\xdb\x23\xa7\x1c\x4b\xc5\xb5\x14\xc7\x35\x75\xc7\xb5\x4d\x4d\xb7\xdc\x05\x7d\xf6\xcf\x42\x9b\x31\xab\xbe\x45\x16\x2b\xc2\xc1\x89\xe0\x87\x61\x0e\x8b\x42\xc8\x72\xe1\xd5\x2f\x7b\x47\x7f\x2f\x7a\x99\xdb\x41\xd8\x6c\x67\x79\xd9\x4d\x7a\xa1\xaa\xcf\x01\x2f\x5b\x15\x4f\xb3\x5b\xd9\xcb\x8a\x4e\x19\x64\x1c\x67\xfd\x36\x9f\x4b\xbf\x2d\xe0\x2c\xdc\xad\x75\x3c\xc5\x49\x71\x4d\xf9\x06\xc2\x00\xda\xa3\x30\x82\xb6\x33\x72\xa3\xd0\x88\x1c\x43\x33\x1c\xc3\x8c\xd4\x20\xb0\x1d\x23\xb4\x7c\xcb\x52\x20\xd4\x18\x4f\xda\xa6\xab\x18\xa6\xed\x28\xb6\xee\x68\xae\x62\x3a\xf6\x90\xb7\x77\xaa\xbe\x84\x07\x30\xf0\xd3\x34\x43\xc4\xe4\x14\x1f\x57\xc8\xcc\x90\x81\xcf\xd1\x7b\x3a\x9f\x4b\xa7\xcb\xe8\xa5\x06\x55\x15\xb1\x8e\x11\x05\x6e\x64\x59\x11\xb4\xa3\x70\x04\x83\xc0\x1e\x05\xb6\x1e\xf8\xd0\xf0\x47\xaa\x19\x8e\x5c\x3f\xb2\x46\x5a\x10\xb2\x29\xe1\x9a\xa6\xa3\x59\xa6\xa3\xe8\xb6\xa9\x99\x86\xaa\xab\x43\x81\x84\x0e\x17\x7c\x56\x73\x97\xdd\x18\x95\x09\x47\xe5\xd9\x7c\x2e\x9d\x3d\xad\x57\xcd\x91\x1e\x29\x86\xab\x8e\x7c\xdb\x8a\x1c\xcd\xb0\x42\x2d\x32\x54\x47\x51\x47\xba\x1d\x29\x8e\x39\x0a\x34\xc7\x09\x46\x26\xdb\x1f\x34\x55\x73\x5c\xd3\xb5\x5d\xc5\x35\x35\xdb\x75\x2c\x6b\x28\xbc\x2b\x97\xf7\xfe\x6e\x0c\x38\x02\x47\xf3\xb9\x34\x7a\x1a\x81\x6a\xe8\x5b\x3e\xd4\x23\xdb\xd2\x54\x25\xb2\x94\xc0\x52\x2c\xdd\xd4\xf5\x48\x53\x2d\xd5\xd4\x03\xc5\xb4\x55\xd5\xf0\x19\xbe\xaf\xa6\x59\xa6\xab\xea\xae\xa3\x98\x8a\xad\xdb\xae\x8b\x17\x97\x93\x72\x9d\xef\x27\xf0\xe2\xe2\xcb\xa0\x43\xc3\x25\xa8\xc7\x0d\x88\xe3\x62\xb2\x69\x89\x0d\x04\x64\xa3\x44\x75\xab\x5c\xd6\x4b\x3c\x39\xf1\x12\xc4\xdf\x20\x10\x2d\x87\xa5\xd9\x05\xce\xac\x47\xf6\x0d\x09\xbf\x29\x12\x98\xe2\x71\x89\x4f\xcb\x30\x65\x49\x9d\xc4\x42\x5f\xbc\x04\x68\x85\x6a\x4b\x31\xa2\x53\x61\xf5\xe2\x12\xe4\xac\x5d\xa5\x8d\xe4\x82\xaa\xa6\xf5\xfb\x66\x55\xdc\x0b\x7f\x86\xb2\x20\x9b\x4c\x13\x88\x48\xb4\xf6\x28\xea\x43\xb2\xc6\x95\x37\x9a\xbc\x5b\x22\x29\x76\x47\x93\xf5\xdd\x67\x8c\xd7\x39\xbc\x43\x7e\x0e\xfd\x06\x8a\x69\xfb\xdb\x14\xaa\xb4\x93\xba\x6c\x9c\x58\x96\xee\x38\x51\xc0\x71\x91\xc2\x8e\x4f\xf3\x78\xe2\xe7\xf7\xec\x89\x49\x29\x0c\x67\x31\x3f\xa4\x66\xc0\x22\x10\xc3\x4a\x71\x56\xe1\x2f\xa6\x4f\x99\x0c\x4f\x44\x08\x3f\x98\xcf\xa5\x83\x72\x4d\xc1\xa7\x7a\xa1\x2d\x6b\x06\x9a\xea\x8c\x1c\xd5\x76\xf0\x9a\xa6\x1b\x91\xe1\x86\x56\x30\xb2\x82\xd0\xb2\x46\xa6\xe6\x06\x8a\x61\x2b\xbe\x6d\x94\x32\x9d\x65\x18\xa6\x63\x58\x86\xe9\x38\x8a\xe9\x18\x8e\x63\x7c\x8b\xf2\x49\x0d\xbd\x5a\x36\xf9\xef\x95\x3f\x4c\xad\x93\xd2\x06\xfd\x7e\xd9\x4d\x7a\x61\x1a\x5f\x51\x00\xa9\x2b\xe7\x69\xd0\x9a\x30\xc2\x8b\xe1\x80\x83\x52\x27\xd4\x3f\x5b\xb8\xb7\x14\x96\xaf\x4e\x3a\xc4\xcf\x15\x4a\x70\x27\xf9\x31\x84\xed\x25\x73\xa3\xf1\x4c\x67\x02\x2b\xe0\xe7\x21\xf7\x73\x73\x0c\xfd\xb0\x82\x6a\x25\x29\x04\x60\x8a\x4f\x60\x38\xaa\xf5\xd4\x39\x9c\xcf\xa5\x43\x36\x75\xfa\x2c\x59\x3b\x33\x29\x54\x14\x35\x30\x15\x3d\x32\xac\xd0\xd7\x0c\xcb\xb6\x74\x05\xea\x96\x6d\x85\x41\xa0\xe9\x8e\x69\x69\xd0\x89\x0c\x8d\x89\x35\x58\xc6\xb7\x1d\xcd\xb1\x14\xcd\xd5\x1d\xdb\x70\x35\xed\x5b\x9e\x49\x1f\x99\x7e\xac\xf2\xe4\x59\xd8\x25\x7f\xef\x4c\xb3\x3b\x60\xfa\x76\x17\x4c\xbf\x93\xf4\xc2\x7e\x16\x98\xfe\x8a\x33\xcd\xee\x83\xce\xb7\xf5\x55\x67\x5a\x57\x1d\xbd\x70\xda\x2d\xcc\xca\xe6\x60\xff\xfb\xe6\x84\x5c\x9a\xa7\x9e\x0e\x27\xf3\xb9\x74\xc2\xa6\x03\x33\x44\xee\xee\x25\x23\xdf\x76\x46\x91\xaa\x41\xa8\x87\x7e\x08\x0d\xdd\x81\xbe\x15\xaa\x9a\xa6\x9a\xb6\xa6\xaa\x23\x25\x50\xed\x91\x6f\xb1\xa3\xb8\x6d\x68\xba\xae\xba\x8a\xa2\xeb\x9a\x65\x5a\xce\x3f\x7e\xd6\xad\xd9\x3d\xf4\x91\x2f\x4c\x13\x3f\x85\xbc\xe5\x35\x6d\x70\x94\xe5\x9d\xe9\xd0\x09\x21\xf1\x05\x59\xdc\x69\xa3\x6c\xff\xcb\x69\x9f\x6f\x5f\x76\x93\x5e\xb8\xca\xa3\x2c\xde\xc3\xbb\x6e\x1f\x16\x77\x45\xc1\xa3\xbc\x9b\xd6\x16\x7f\xbd\x0c\xdb\x7c\xcf\xb8\x94\x4b\x6c\xb2\x66\xf7\x45\xcd\x8f\xf7\xf3\xb9\x74\xdf\xe2\xc7\xdd\x83\xbd\xd3\xa6\xee\xc5\x32\xa1\x6b\xba\x11\x0c\x5d\x47\x0f\x1d\xc7\x50\x46\x41\xe8\x44\x86\x1f\x59\x61\xa8\x18\x0a\xb4\x14\x73\xa4\x95\xaa\x21\xc3\x72\x5c\x4b\x53\x2d\xcb\xb4\x5c\xd3\xb2\x15\xf3\x9f\x0e\x7f\xf2\x28\x3f\x92\x06\xff\xdd\xfc\xa8\x2a\x9d\xa5\x52\x55\xda\x02\xcf\xcb\x9e\xb4\x17\xaa\xa2\x3f\x87\x27\xb9\x62\x8d\xfa\xd5\x27\x72\x25\x35\x66\x5e\xcc\x95\xec\x7d\x93\x2b\x71\x62\x2f\x57\x72\x2f\x6a\xae\xfc\x73\x3e\x97\xfe\x7c\x64\x95\x0c\x5d\xdd\x1d\xf9\x36\x84\x8a\x1a\x8d\x7c\xcd\xd5\xa0\x63\xc3\x20\x0c\xdd\x10\x42\xdf\xd1\x95\x20\x0c\x2d\xd5\xd0\x19\x57\x3a\x8a\xa3\x9a\x86\xed\xda\x8e\x61\xb9\xba\xa2\xa9\xc6\xb7\xb3\x4a\xb2\x33\xd2\xb7\xb2\x50\xaa\x6a\x3b\x54\xc7\xbf\x54\xb5\x1d\xc7\xe0\x65\x4f\xda\x0b\x55\x75\x9e\xc5\x98\x75\xb1\x46\xfd\xd6\xaa\x8c\xf9\xb1\x79\xeb\xc8\xb8\xf2\x04\x77\x67\x7d\x79\xba\x70\x31\x7d\x4a\xe9\x52\x28\xe7\xf2\x1c\x2d\x5a\x76\x97\x67\xaa\x99\xfd\x66\x3e\x97\x6e\x1e\x5b\x82\x47\x6a\x30\xb2\xac\x50\xb5\x2c\x35\x32\x2c\x6d\xa4\x1b\xb6\x19\x69\x9a\x32\xf2\x7d\x35\xd2\x1c\xdb\x81\x23\x3d\x82\x4c\xfd\x6d\xab\xaa\xa5\x19\xa6\x69\xaa\xba\xab\x29\x86\x63\x5b\xce\xff\x02\x66\xff\x67\x56\x61\xad\xab\xe4\xd6\x7b\xb4\xdc\x9d\xb4\x17\xaa\xfe\xb8\x9e\xbb\x8f\xd9\xf5\xde\x6c\x9a\xfb\x45\x99\x7d\xe1\x1a\xfd\x94\xd2\x8b\x99\xbd\xbb\x9a\x2f\xcf\x54\x33\xfb\xde\x7c\x2e\xed\x3d\xe5\x38\xa8\x2b\xa3\x28\x32\x61\x68\x2a\x96\xa1\x5a\xa1\xe2\xbb\x76\xa0\xda\x6e\x60\x84\x86\xaa\xea\x66\xe8\x44\x91\x1f\xea\x1a\xe3\x7c\x72\x5e\x74\x4d\xdd\x70\x0d\xcb\xd4\x6d\x2c\x83\x7c\xcb\xc7\xc1\x49\x65\xaf\xf0\xad\x1d\x08\x55\xb3\x27\xa9\x87\x6f\x3b\x69\x2f\x54\x53\xfb\x9a\xf7\x3f\x66\x6f\x36\x53\x59\x75\xfa\x4c\xda\xde\x35\x8b\x7c\x12\x7b\x26\xcf\xea\x65\xd9\xd4\x59\xb1\x40\x73\x2a\x3d\xad\x50\x3d\xb5\x3e\xce\xe7\xd2\x47\x36\xb5\x58\x49\x81\x4d\x45\xe1\xa8\x35\xab\x4c\x4d\x53\xa2\x40\x1d\x19\x8a\x3d\xf2\x1d\xdf\x36\x46\xa3\x50\x73\xcd\xc0\x36\x2d\x5f\x83\x9a\xe9\x8c\x22\xdd\x57\x4c\xb3\x14\x9e\x54\x57\xd7\x1d\x4b\x71\x15\xcd\x75\x2c\xdd\x74\xbe\x69\x25\xcb\x63\xa7\xce\xee\xac\xfb\x9b\xe7\x96\xd5\x56\xa4\xfc\x4b\xb5\xda\x31\xd4\x5e\xf6\xa4\xbd\x50\x2d\xeb\x6b\xce\xad\xba\xf6\x06\x19\xc6\xb3\xe7\xd6\x63\xa2\xd7\x23\x05\x16\xcd\xa2\x85\x22\xd7\x0a\x39\xeb\xf9\x72\x37\x9f\x4b\x77\x0b\xe6\x4b\x5b\xfe\xd2\x2d\xd5\xd0\x02\xc3\x35\x4c\xd7\x72\x43\xdf\x8c\x60\x34\x32\x1c\xd3\x1c\x41\x13\x2a\x4a\x38\xd2\x54\x5d\x75\xcc\xa0\x54\xc9\x38\xaa\xe2\xba\x96\xeb\x18\xba\xe2\x3a\xaa\xae\x68\xff\xf4\x11\xf8\x39\xf3\xa5\x92\xc7\xfe\xf1\xf9\x62\x77\x0f\x24\x76\xcf\x81\xa4\x93\xf6\x42\xb5\x1f\x3f\x90\x7c\xc6\x7c\xb1\x7b\xcf\x2d\xf6\xca\xe7\x96\x45\xec\xba\x50\x7a\x7b\xa4\xc0\x23\xf3\xa5\x2b\xb5\xad\x94\xb3\x11\x7b\x6c\x94\xf8\xe9\x8d\x08\x44\x82\x5e\x56\x3d\xf3\xd3\xea\xf5\x7c\x2e\xbd\x5e\x71\x1b\x82\xaa\x69\xc2\x30\x50\x02\xe8\xba\x91\x15\x99\x10\x1a\x4a\x64\xfb\xa1\x6d\x5b\xaa\xa5\x18\x86\xe3\xd8\x9a\x3a\x52\xb4\xd2\x84\x41\xd3\x35\xdb\x75\x54\xd7\x36\x1d\x5d\xd5\x14\xf5\x5b\x9c\x56\xbb\xe3\x2c\x2b\xe0\x6a\xc7\xfa\x7f\x7c\x66\xb9\x3d\x49\x3d\x2c\xdd\x49\x7b\xa1\xba\x5f\x55\xca\x73\x7b\xb3\xb9\xcf\x97\xf2\x9e\xa8\x13\x78\x5a\xf9\x45\xf3\x6e\x71\xa1\x47\xa6\xe1\xa3\x05\xeb\xe9\xf6\x7e\x3e\x97\xde\xaf\xb8\x8b\x41\xc3\x31\xb4\x91\xe9\x2b\xa1\x33\xb2\x43\xd7\xf0\x55\x3d\x30\x6c\x63\x04\xd5\x30\x1c\x29\x4a\x64\x6a\x56\xe4\x18\xba\xcb\xb4\x08\x8a\xab\xd9\xa6\xe6\x5a\xa6\xe2\x3a\xa6\x61\xa9\xca\x37\x1d\x30\x77\x05\xc5\xc2\x3f\x3d\xdd\xb4\x8e\x2e\xf7\x5f\x9a\xd2\xbd\xd1\xee\xa6\xbd\xd0\x94\xaf\x79\xa7\xcd\xd5\xde\x20\x63\xe5\x5b\xed\x15\x19\x78\xf5\x7d\x6d\x15\xbd\xc4\x13\x0a\x3d\x6b\xba\xf1\x05\x3b\x01\x50\x75\xa2\xf2\x88\xe2\xeb\xff\x17\xe2\xb4\x27\xc4\xe9\xca\x21\x47\x99\xf5\x39\x1f\x7a\xf4\x73\x02\x8a\xde\x2f\x0b\x28\x5a\xc5\x66\xd1\x81\xd6\x0d\x04\x64\xb0\x52\x8d\xa8\xa1\x24\xc5\xa8\x52\xac\x47\x22\x0f\xda\x55\x04\x48\x1a\x93\x06\xbd\xf9\x20\x39\xa0\x0e\x76\xe4\x2e\x8a\xc0\xd9\x88\x24\x6a\xd7\x0d\x52\xc1\x9f\x39\xd0\xc1\xa2\xf0\x30\x2b\x05\x7f\x54\xb5\x2a\xf8\xa3\x5b\x27\xea\x8b\x63\x37\x92\x2f\x1b\xe0\x66\x49\x44\x41\xae\xcf\x4d\xb0\xf7\x68\xc6\xfe\xd0\x4b\xaa\xd5\xe9\x60\xd5\x7e\xa4\x87\x55\xa7\xd5\xc5\x24\xd6\x8e\x5b\xc6\x6a\x6c\x46\xbd\x54\xea\xa8\x97\x75\x2c\x45\x6d\x49\xd4\x4a\x12\x71\x53\x03\x1f\x9f\xd9\x20\x4d\xef\x34\x48\x63\x91\xab\x4a\x9b\xbf\xde\xc0\xa1\x66\x4f\x9b\x34\xab\x8c\x96\xda\x6c\x93\x5d\xb7\xc9\xa8\x53\x9d\x47\xda\xe4\x82\xbb\x67\xb4\xa9\x19\x89\x53\xe9\x4c\x10\xbd\x9a\x69\x75\x88\x2f\x9d\x45\x4a\x45\xcc\x8a\xb0\xdd\x60\x12\xce\x57\x07\xe2\x0f\x02\x17\xb0\xd3\xa8\x3a\x80\xc5\xaa\x24\xb9\xb8\x4a\xad\x45\x01\x3b\xed\x46\xc0\xce\x7a\xe6\xe8\x0e\x78\xfd\x84\x99\xd3\x8c\x6b\xea\x02\x11\x55\x46\x90\x2a\x17\x85\x4c\x59\xdc\xcd\x65\xe8\xce\xff\x8f\xbd\xb7\x71\x6b\x1b\xd7\xf2\xc7\xff\x15\xd7\x7b\x6f\x37\xd9\x11\x1e\xcb\xef\x0e\xbf\x6c\x7f\x14\x42\xcb\x94\xb7\x01\x4a\xa7\xc3\xf2\xf0\x38\xb6\x0c\x9e\x26\x76\x6a\x3b\x14\x5a\xf8\xdf\xbf\x8f\x5e\x6c\xcb\xb6\x9c\x04\x68\xe7\xf6\xee\xb2\xfb\xdc\x29\x49\xf4\x72\x24\x1d\x49\x47\xd2\x39\x9f\x4f\x07\x25\x14\x6e\x90\xa1\x01\x99\xf3\x0e\xe7\xc0\x2d\x25\xaf\xe4\x6d\x8a\xb2\xd2\x3f\x59\xc4\xcd\xd4\x3d\x3e\x86\xde\x1a\x1f\xc3\x68\xe9\xa3\xc1\x51\x21\x33\x2a\xd8\x65\x5c\xc8\x25\x4e\x6e\xc1\x80\x8c\xd5\xd3\xb0\x0a\xc2\xd8\x65\x62\xd9\x6d\xb1\x0a\xd2\x63\x8e\x92\xd5\x70\x97\x13\xec\x9a\x6a\xa9\x26\x8c\x1b\x15\xaf\xaf\x26\x2c\x98\x50\x49\x1a\xad\x43\x53\x4c\x5d\xbc\xc4\x9a\x06\x38\x7d\xf2\x12\x6b\x9a\xe5\xac\xd4\xaa\xbe\x36\xad\x1a\xbf\xae\x59\xd5\x69\x83\xf7\x78\x3a\x6a\x15\xf5\x82\x66\x09\x4a\x5d\x30\xab\x49\xf9\xee\x42\x75\xb3\x54\x20\x53\xe3\x38\x8a\x2f\x6b\x4e\x9c\x8f\x57\x32\x0b\xb6\x46\xd3\x2a\x18\xfc\xb4\x8a\xc1\xcf\x2a\x74\x51\xab\x28\x94\xad\x42\x19\x35\xb7\x12\xd1\x04\x25\xe2\xb3\xc4\x6c\x31\x01\xa3\xb7\x55\x6c\x14\x7a\xc5\x66\x6d\x95\x7a\x55\x29\x91\xe5\xb4\xa5\x73\xdb\xba\x66\xaf\xc0\xa7\x6d\x43\x91\xae\xd9\x1a\xd0\xb5\x2a\x4d\x17\xa1\xb6\x6d\x88\x75\xcd\x36\xc1\xde\x93\x75\xcd\xae\xe8\xb4\xf5\xaa\x9d\x76\x8d\x4e\x5b\xaf\xe8\xb4\x6d\x07\x6c\xaf\xa0\x6b\xf6\x02\x3a\x6d\xc2\x53\xde\xcd\x76\x87\x07\xd2\x81\x75\x5d\x5b\xdd\xcd\xf1\xf1\xba\xe8\x68\xad\xd1\x76\xf4\xf6\x68\x3b\xc6\xe2\xd1\x26\xe2\x9b\xf5\x0d\xc9\xb1\x44\xa3\xef\xd8\x80\xdb\x93\x1c\xa7\x63\xf4\x1d\x57\x3c\xfa\xae\x0a\x7e\xe7\x36\xe1\xc7\x8d\xbe\x0b\xab\xd1\xe7\xec\x4a\xad\x36\xfa\x5c\x9d\x3a\x78\xbb\xc2\xe8\xbb\xc6\xe2\xd1\x77\xcd\x85\xa3\xef\x5a\xf5\xd1\x5f\xf4\xfe\xf2\x90\xe1\x26\x55\xdb\xed\x21\x75\x9d\xe5\x13\xd8\x75\x45\x43\x08\x55\x15\xe8\x3c\xb3\x3e\xec\xb4\xc8\xb5\x0e\x93\x5c\xd5\xc1\xd7\x27\x0f\x23\x54\x8d\x6a\x1c\x5d\x4e\x1e\x93\x1f\x48\x83\x33\xb3\x55\x0b\x7c\x58\x61\x24\xa1\x6a\x2f\x1e\x4a\xa8\x3a\x0b\xc7\x12\xaa\xee\x4a\x83\x49\xee\x54\x1e\x3d\x77\x21\x6c\x5b\x93\x10\xc2\xf6\x50\x43\xb8\x84\x79\x9f\xc8\x0c\x1b\x06\x25\x84\x86\x70\xf4\xa1\x09\x0c\xbe\xec\x2e\xb3\x12\x42\xbb\xeb\x40\xe6\x80\x8f\x4f\x1f\x7d\xe8\x96\xa3\x6f\x54\xfb\x09\xc4\x07\x16\x6e\xf4\x2b\x7e\x77\xa8\x41\xf0\xdb\x2a\xa3\xaf\x69\x4b\x46\x5f\xd3\x17\x8f\x3e\x3e\xaf\xd4\x8c\x86\xc5\x77\xd8\x0f\x9d\xcd\x50\x33\x05\x63\xac\x59\xcb\xe7\x33\xd4\x6c\xe1\x90\x6a\x0e\x30\xb8\xf3\xa3\xd6\x79\xc4\xd6\xbb\xce\xd8\x3a\x04\x7f\x3d\x7d\x48\xf5\xea\x94\x6d\x70\x84\xc7\xf8\xa8\xc3\x0d\xa9\xc5\x55\x6b\x80\x77\xab\x0c\xa9\x6e\x2e\x19\xd2\xe2\x70\xd4\x35\xa4\xf8\x8c\xb4\xda\x90\x3e\x7e\x4e\x3f\xe8\x0f\x2a\x75\xdb\x56\x83\xba\xdb\x36\x25\xa1\xa1\xb6\x6d\x49\x68\xc0\xb6\x31\x09\xf1\xf9\xaa\x02\x00\x59\x60\x4f\xc2\xea\xac\xa4\x72\x5f\x1a\x6d\x8b\x12\x1a\x66\x5b\x4c\xc3\x12\xe8\xb0\x61\xaf\xa0\xc3\x86\x23\xd4\x61\xc3\x05\x06\xd7\x62\x53\xed\xd2\x61\x13\x76\xe8\xb0\xa9\x81\x7f\x3c\xfd\xa2\x08\x9f\x91\x0a\x1d\xe6\x3a\xdb\x34\x6a\x3a\xec\x72\xd5\x9a\xe0\xf5\x2a\x3a\x6c\x5a\x4b\x74\xd8\xb4\x17\xeb\x30\x3e\x0a\xf1\x3a\xfc\x10\xbf\xa9\x27\xec\x52\xa6\xdb\x1e\x7d\x4b\x6d\x5f\x7a\x40\x0b\xae\x30\xfa\xf8\xa4\x24\x18\x7d\x4b\x07\x26\xa7\x86\x96\xd1\x35\xfa\x96\xd9\x71\xd9\x01\x2d\x0b\xfc\xf1\xf4\xe1\xb7\xaa\xbb\x25\x93\xd3\x6c\x72\xaa\x2a\x87\xdf\xd4\xb8\x6a\x5d\x80\xe2\xc5\xc3\x4f\x2f\xf5\x16\x1f\x1e\x20\x3e\x6c\x49\xfc\xf0\xe2\x45\xa9\xf6\x64\xcc\x0d\xa1\x90\xb2\x5a\x50\xa7\x26\x18\xa6\xe2\xc4\xb6\x70\x98\x6c\xb1\xed\x60\x9b\xc0\xe4\xd4\xc0\xee\xb4\x1d\xec\xae\x3b\x29\x68\x3b\x20\x8f\x9f\x3c\x4c\x76\x65\x3c\x98\xdc\xce\xe7\xd4\x8c\x07\xd3\xac\x32\xe0\xc3\x59\x31\x3e\x26\xb7\x03\x39\x1a\x48\x57\x19\x3e\x67\x89\xcd\x80\x4f\x58\xb5\xe1\xdb\xc2\x26\xe3\x61\xb9\xbd\xec\x77\x6c\x2f\xcb\x47\xb2\x21\x87\x60\x2d\x76\x2c\xc1\x30\x3b\xab\xac\xc5\x8e\x78\x2d\x76\x5c\x60\x72\x6b\xb1\xdb\xb9\x16\xbb\xb0\x6b\x98\x5d\x0d\xc4\x4f\x1f\x66\xb7\x5a\x8c\x4d\x6e\x31\x76\x6b\x8b\xb1\xc9\x2d\xc6\xae\x09\x92\x55\x86\xd3\x5d\x62\x2f\xe0\x13\x57\x6d\x38\xd9\x9d\xa5\x60\x44\x1f\x39\x37\x5d\x47\x30\x68\xee\x0a\x37\x80\x9a\x2a\xbc\x02\xd4\x54\x08\x2c\x95\x4b\xd5\x75\x09\xa8\xa9\x7a\xc7\xa0\x69\xaa\x01\xbc\x27\x0f\x9a\xa6\x56\x17\x81\x16\xf7\xfc\xa4\xd6\x6e\x02\x2d\xee\x31\x02\x1f\xd7\x04\x73\x53\x53\x1d\x30\x59\x61\x30\x35\x75\xf1\x1d\xa0\x86\xcf\x59\x2b\x0e\xe6\x13\xa6\xe7\x83\xcd\x3f\x0d\xb6\x2f\x12\x35\x58\x2c\xd9\x16\xc7\x6d\x8b\x8f\x76\xde\x6c\xb6\x96\x7f\xba\xa4\x4f\x94\x99\x0c\x2c\x63\x51\x1d\x84\xaf\x96\xbe\x13\x12\x7a\xda\x0a\x75\x03\xe4\x15\xd6\x20\x49\x5f\xb1\xd4\x92\x94\x04\x63\x03\xe4\x6d\x3a\x99\x32\x31\x1d\xb9\xd9\xef\xa7\xbd\xbc\xcd\xd5\x4a\x0b\xca\x4f\x7a\x7a\x99\xde\xe1\xd2\xb7\x48\x1e\x6b\x08\x16\x65\x66\xa7\xcc\xac\x57\x92\x71\x38\x16\x20\x2f\x40\xe1\x92\x74\x14\xcf\xa7\xca\xd1\xe8\xf7\xf7\x3b\x47\xa3\x2d\x51\x8b\x16\xe5\x3b\xdd\xd8\xdd\xd9\xba\xd8\x39\xbc\x38\x38\xba\xd8\xfe\x7d\x6b\xbf\xcc\x6f\x2c\x10\xba\x80\xc1\x28\xc5\x65\x8f\x08\x4f\x91\x77\x51\x7d\xc5\xbb\x59\x59\x1f\x9b\x05\x4f\xa9\x8f\x96\x70\x15\xfd\xd5\x93\x25\x9c\xbc\x7b\x60\x36\x51\x9a\x03\x99\x4d\x04\xd2\xb5\x6a\xad\xce\x12\x8f\x22\xaf\x31\xd4\xf5\x7b\x1c\x3e\x05\xa1\x54\x2a\x70\x5e\x7b\xfd\xbb\xbb\xbc\xc2\xd0\x6c\x0c\x19\xed\x82\xf2\xd7\x57\xf2\xe9\xe8\x68\x67\x7b\x67\xb4\x25\x0f\xe8\x9f\x1f\xa5\xcd\xa3\xd1\xd6\x68\xff\x64\x67\x63\xf7\x58\x2e\xfb\xc4\xb0\x1a\x7d\x89\x3e\xfd\xd5\xa3\xeb\xe4\x5a\x25\xc8\x0b\x51\xc5\x8b\xfa\xbe\x84\x18\x28\x2b\x62\x66\x61\xa3\xf3\x0b\x90\x01\xc0\xc8\x7d\xb3\xaa\x59\xdf\x53\x1c\x71\x80\x75\x29\x9b\xad\x2d\x91\x6d\x01\x2f\x52\x63\xbe\x7e\x1f\x79\xb9\xa8\xdb\x6a\x72\xdb\x4b\x84\x14\xa1\xe6\xd6\xf5\xf6\xbb\x0a\x47\xe8\x4b\xca\xa9\xac\xaa\xcb\xba\xb0\xc9\xc8\xfc\x43\x3a\x6e\xe5\x78\xbc\x4a\x72\x66\x48\xfc\xeb\xfb\x75\xe5\xf0\xaa\x4a\x76\x4d\xb8\xe2\xaf\xd4\xeb\xdf\x75\x7e\xad\x18\x76\x52\x09\x6e\x08\x97\xfe\x07\xce\xb8\x87\x76\xbe\xf9\x90\x16\x08\x75\xc5\xd2\x9f\xa0\x2b\xe6\x8f\xec\x70\xa1\x7a\xd8\x66\xa3\xb0\x6e\xf5\x68\xa1\xdf\x3e\x5a\xec\x07\xf5\xf2\x2a\x13\xd4\x59\xa6\x2b\xff\xb2\x4e\x5f\x61\x8a\x6a\x2a\xfc\x6e\x63\x40\x4d\x07\xea\x39\x08\xf2\x26\x39\x78\xbf\x7f\x0f\x82\x28\xc5\xd6\xfa\x35\xca\x06\x67\xc7\xb9\x72\xf1\x11\x1c\xe7\xca\x6f\xbb\xf8\xbf\xd9\x25\x98\xe7\xca\x81\x09\x3e\xe5\xca\x1b\x93\xfc\xb3\x77\xf9\x0e\xff\xf3\xdb\xf4\x2f\xfc\xcf\xe7\xeb\x5d\xb0\x95\x2b\xe4\xef\xf8\x33\xc9\xb9\x4d\x3e\xdc\x1c\x1d\x92\x62\x7e\xc3\xff\x9d\xe3\x6f\x36\xf7\x2c\x92\xe3\x93\x8b\xff\xb9\x9c\xfe\x81\xff\x79\xf7\xf9\x00\xff\xb3\xbb\x71\x88\xff\x19\xef\x5d\xe3\x7f\xfe\x18\x91\x9a\x4e\x3f\x6f\x90\x0a\x0f\xc7\xf8\x1f\x7f\xf3\x14\xff\x73\x61\xec\xe1\x7f\x3e\x98\x10\xff\x73\x9b\x25\x58\xc0\xec\x12\xd7\xf2\x71\x1f\xff\xf7\x5d\x0a\x0e\x53\x85\xa4\xdd\x71\xbf\xe2\x7f\xbe\x6e\x6d\x9f\x83\x2c\xbf\x9d\xe0\x06\xca\x0a\x1d\xd1\xf2\xb0\x77\x76\x11\x5f\xb2\x43\xd7\xda\x3f\x37\x0f\xf6\x0e\xff\x79\xfe\x6d\xea\xa5\x97\x51\xbc\x36\x41\x61\x3e\x50\xef\x95\x71\x1e\xd3\xa3\xc0\xb2\xb4\x30\x45\x53\x9a\x3c\x40\x13\x94\x23\x51\xfa\x71\x92\x06\x28\x1d\xc4\x49\x8c\xee\x99\x2c\xe4\x00\xb7\xa0\xec\x3c\x99\x0d\x14\x5c\xf6\x3a\xfb\x62\x9c\xe4\x79\x32\x1d\x68\xc6\xec\xe6\x5e\xe1\x9d\x9f\x44\x85\x7c\x89\x82\xfc\x6a\x60\xaa\xea\xec\x66\xfd\x0a\x45\x97\x57\xf9\x00\x6a\x2a\xce\x89\xd2\x74\x51\xbb\x6e\xd6\x68\x56\x68\x9b\xb3\x9b\x7b\xf9\xfc\xbe\x0f\xd0\x7d\xaf\xbf\x5e\xf8\xec\x48\x19\x73\x93\x8c\xc2\x1e\x2c\x80\xf6\xd3\xe1\x6d\xae\x8c\x66\xdb\xbd\xfe\x7a\xe5\x37\x49\x0f\x59\xdc\xd9\xbb\xf8\xaa\x7a\x51\x2e\x8f\x62\xd5\x5d\x48\x71\x67\x6e\x71\x0e\x51\xfc\x69\xda\x72\xdb\xe7\x3c\x13\xc8\xd9\xcc\x8b\x65\x60\x53\xd3\x82\x38\x7d\xac\x72\x40\xb4\x2b\x37\x25\x9b\x4e\xbe\xc5\x6e\x4a\xb7\xb9\xb2\xf9\x76\xaf\x97\x92\xa4\xc9\xcd\x97\x5e\x5f\x40\x0a\x1a\xcf\x27\x93\xfb\x52\x78\xa7\x76\x97\xae\x09\x84\xb9\x8f\xc2\x9e\x56\xf4\x64\x3c\x2c\x4a\x5e\x17\x9e\x23\xe2\x76\x85\xe4\xe8\x70\x7f\x5f\x0e\xd0\xac\xe9\xc7\x9a\xbf\xfd\xd0\x53\x81\xc5\x79\xaa\xc2\x8e\xeb\x07\x9b\x3b\x12\xb3\x3e\xad\x0b\x4c\x2e\x24\xfa\x55\x5d\x61\x87\xcf\x6c\xc7\x65\x01\x71\xa3\x04\x36\x77\xb0\xe6\xca\x0a\x1e\x55\x96\x29\x2c\xeb\xe4\x51\x65\x59\xc2\xb2\x2e\x1e\x55\x96\x2d\x2c\xeb\x72\x41\x59\x5d\xa3\xc1\x06\xac\x1a\x0d\x72\xe5\x02\x64\xe9\xe4\x0a\x89\xc9\xae\x19\x21\x7f\x74\x19\x67\x84\xb9\x5a\x4c\x8e\xad\x08\xaf\x5e\x38\x61\xaf\xc4\x8a\xa4\xe9\x3f\x42\x93\xae\x6b\xcb\x4a\xad\x73\x8a\xab\x29\xdb\x29\x9b\xcf\xf9\xe1\x92\x8b\x98\x8a\xd2\xf7\x1f\xd1\x74\x36\x89\xfc\x28\x5f\x2f\xb6\x41\x86\x57\x97\x2a\xe5\x8d\x42\x75\x16\x3e\xf8\x3c\xef\xb1\x1f\xb8\x19\xb4\x2f\x6e\xb8\xae\xfd\x88\x86\x6f\xfc\x44\x0d\x3f\xe8\x68\xb8\xc9\x1a\x4e\xae\x8c\x17\x37\xbc\xd9\xbc\xe9\x4f\xd4\xbc\x51\x47\xf3\x9c\xc7\x37\x6f\xf3\xc7\x37\x8f\x5a\x7d\xc2\x06\xb2\x9f\xb8\x26\xfe\x29\x6e\xa2\x01\x1f\xdf\xc4\xa3\x9f\x68\x04\x8f\x3b\x9a\x67\x3c\xbe\x79\xe3\x9f\x6c\x04\x77\x3a\x9a\x68\xff\x88\xc5\x67\xf7\x27\x1a\xdb\x43\x71\xc3\x4d\xf5\x47\x34\xfc\xf6\x27\x6a\xf8\xe7\x8e\x86\xff\x90\x7d\xf6\xd3\x4f\xa6\xee\x5b\x1d\x8d\xff\x21\xea\xfe\xe5\x27\x1a\xf5\x9b\x0e\x33\xfd\x87\xa8\xfb\x9b\x9f\x63\xd4\x71\x31\xa7\xf1\xf0\x8c\xb2\x6f\x51\x12\xbb\xdd\xd1\xd1\xc5\xdb\x83\xe3\x13\x40\xbe\x7c\x7f\x3c\x3a\x22\x84\x4b\xe4\xd3\xe1\xc6\xf1\xf1\x87\x83\xa3\x2d\xd0\xcc\xb0\x39\x3a\x62\x19\x96\x11\x37\xad\x42\x9c\x74\x0e\xde\xc7\xc3\x36\x75\xcd\x90\xe7\x6c\xf3\xf3\x5e\x0a\x50\x7f\x9d\xf2\xca\x65\x79\x2f\xe5\xce\xc4\x69\x75\x44\x8c\x73\xc2\x1f\x04\xd2\x3e\xc8\x15\x6f\x36\x9b\x50\xa2\x3a\xe0\xa5\x97\xf3\x29\x8a\xf3\xac\xa0\x79\x93\x12\x5c\xe2\x19\xa5\x0b\x8a\x2f\x0f\xe2\x9d\x38\xca\x05\x2c\x41\x5e\xde\x0b\xf3\x5e\xaa\xcc\xd2\x24\x4f\xf2\xdb\x19\xea\x03\x2e\x39\xe1\x9c\x52\x7c\x6f\x32\xa1\xf4\x53\x8c\x91\x08\xe5\xbb\xcd\x77\x43\x4a\x6b\xe4\xcf\xd3\x14\xc5\x39\x7f\x1d\x35\x8a\x83\x59\x12\xc5\xf9\x61\x9a\x5c\x47\x01\x4a\x1b\x54\x54\xc7\x39\x9a\x6d\xa1\xcc\x4f\x23\xa2\x28\x0c\xeb\x3d\xeb\x7d\x0b\x23\x34\x09\xb2\x81\x70\x30\xcf\x39\x6e\x3f\x91\x30\x22\x96\x3f\xda\xb3\xb2\xbc\x8e\x86\xc3\xe1\x66\xfe\x2a\x1f\xca\x7b\x5e\x3c\xf7\x26\x92\x3c\xc0\x5f\x8d\xf2\x97\x2f\x7b\xf9\x50\x3e\x20\x72\xe0\xaf\x99\xa4\xad\x27\xd2\x61\xfe\x8b\x7c\xba\xf7\xc5\x4b\x91\xb4\x7f\xfc\x87\xb4\x11\x5c\xe3\xdf\x02\x09\x8b\x21\x15\x29\xa5\x63\xc6\x2e\x24\x3f\x86\x6e\x4f\x34\x2a\x8d\xec\xad\xa1\xb9\xc8\x95\x3f\x95\x29\xca\x32\x14\x5f\xa2\x94\x63\x7f\x3b\xcc\x95\x5d\xe5\xf4\xf8\xf0\xed\xe8\x68\xd4\xe0\x76\x1c\xed\x6f\x1d\x1e\xec\xec\x9f\x5c\x1c\x1e\x1d\x9c\xee\x6c\x61\xd5\x7f\xbb\xb1\xff\x66\xb4\x05\x78\x46\xa8\x62\x7a\xce\xbc\x5b\xdc\x19\xeb\x48\x49\xe2\x45\x43\xcc\x48\xc5\xd2\xfe\x3d\xcf\x24\xbf\x3c\x47\xf7\xb0\x91\x4e\x59\x55\xc3\x86\x08\x9c\x56\x74\x85\x2b\xe7\x22\x5a\xd1\xe6\x51\x94\xf2\x26\x87\x2d\x6a\x31\x16\xf7\xef\x07\xc2\x8c\x3c\xd9\x26\x02\x2f\xd4\x92\x42\xaf\x7d\xad\x23\xcb\x0b\xe6\x16\x62\xd9\x72\x3a\x3b\x1a\x73\x86\x75\x77\xd5\xd7\xc1\x6d\xec\x4d\x23\x9f\x4b\xb2\x50\xdb\x94\x4b\x44\x5b\xc6\xb3\xe3\xd7\x27\x5c\x45\x1a\xf6\x8a\x8b\xfe\x1b\x48\xf2\x2f\x68\xf0\x80\x0e\x1e\xe5\xaf\x52\x25\xa8\xc4\x7a\x37\x1f\xa3\xd3\x68\x36\xa8\x7d\x59\x90\x95\xcd\xe3\xb2\xd6\x9c\xff\x7d\x28\x17\x94\x43\xcb\x27\x61\x41\xf1\x25\x83\x5c\x50\x6f\x35\xd9\x27\xb7\x52\xf6\xa8\x42\x05\x14\x6a\x69\xa1\x00\x3d\x74\x77\xd7\x43\xc3\xdb\x5c\x89\xcd\xaf\xbd\xbc\xdf\xef\xf7\xd2\xbb\xbb\xbc\x7f\x5f\xe6\x6b\x91\xa6\xe5\x6d\xd2\xb4\xeb\x6c\x76\x85\x52\xf4\xaf\x21\x4f\x7b\x7f\x77\xd7\x7b\xff\x13\x93\xa7\xed\xdd\xdd\xf5\xf6\x7e\x42\xf2\xb4\xed\xbb\xbb\xde\xf6\x4f\x48\x9e\xf6\xfb\xdd\x5d\xef\xf7\x9f\x8d\x3c\xed\xed\xdd\x5d\xef\xed\x33\x79\xda\x33\x79\xda\x77\x27\x4f\xfb\x7a\x77\xd7\xfb\xfa\x6f\x44\x9e\xf6\xe1\xee\xae\xf7\xe1\xa7\x27\x4f\xfb\x78\x77\xd7\xfb\xf8\x33\x93\xa7\xfd\x76\x77\xd7\xfb\xed\x99\x3c\xed\x99\x3c\xed\x99\x3c\xed\x99\x3c\xed\x3b\x91\xa7\xfd\x75\x77\xd7\xfb\xeb\x99\x3c\xed\x99\x3c\xed\x99\x3c\xed\xa1\xe4\x69\xef\xee\xee\x7a\xef\x9e\xc9\xd3\x9e\xc9\xd3\x9e\xc9\xd3\xf0\x74\xf8\xc7\xdd\x5d\xef\x1f\xcf\xe4\x69\xcf\xe4\x69\x3f\x09\x79\xda\xeb\xbb\xbb\xde\xeb\x67\xf2\xb4\x67\xf2\xb4\x9f\x8a\x3c\xed\x8f\xbb\xbb\xde\x1f\xcf\xe4\x69\xcf\xe4\x69\xab\x29\xe6\xbf\x37\x79\x1a\x22\x2f\x45\xe8\x99\x3e\xed\x99\x3e\xed\x3b\xaa\xfb\x4f\x4b\x9f\x96\x63\x75\xcf\xd1\x33\x81\xda\x33\x81\xda\x33\x81\xda\xf7\x26\x50\x4b\xf1\xe4\x4a\xd1\x33\x85\xda\x33\x85\xda\x33\x85\xda\x4a\x14\x6a\x31\x9e\x31\x71\xd7\x8c\x79\x26\x51\xfb\x89\xb8\x67\x9e\x49\xd4\xfe\x9d\x48\xd4\x22\x3c\xb1\xa2\x55\xb7\xa2\x67\x1a\xb5\x67\x1a\xb5\x67\x1a\xb5\x27\xd1\xa8\x25\x78\xc2\x25\xab\xee\x64\xcf\x44\x6a\xcf\x44\x6a\xcf\x44\x6a\xcf\x44\x6a\xff\x6b\x89\xd4\xb2\xf8\x7f\x1b\x91\xda\xec\xe9\x90\xac\x8f\x24\x52\x0b\xe3\x15\x89\xd4\x82\xa5\x09\x3b\x00\x55\x7f\x56\x22\xb5\x93\x47\x36\xe8\x67\x26\x52\xbb\x78\x44\x9b\x6a\x8d\xfb\xb7\x23\x52\xbb\x7c\xc0\xcc\xa9\xf5\xf1\x33\x91\xda\xff\x2d\x22\xb5\xab\x27\x2f\xb1\x0f\x27\x52\xbb\x5e\x82\x92\xfc\x4c\xa4\xf6\xbf\x93\x48\x6d\xff\xc9\xba\xf6\x70\x22\xb5\x8d\x15\x74\xed\x99\x48\xed\xef\x20\x52\x3b\x88\xff\x7e\x22\xb5\xe9\x0a\xa3\xff\x4c\xa4\xf6\x20\x22\xb5\xd1\x93\x87\xf1\x51\x44\x6a\x9b\x2b\x8c\xe4\x33\x91\xda\xc9\x8f\x26\x52\xfb\xf3\xe9\xa3\xff\x18\x22\xb5\xa3\x55\x46\xff\x99\x48\xed\x51\x44\x6a\xc7\x4f\x1f\xd2\xc7\x10\xa9\x8d\x57\x19\xd2\x67\x22\xb5\x67\x22\xb5\x55\x88\xd4\x76\x9e\x7e\x51\xf4\x18\x22\xb5\xdd\x55\x74\xf8\x99\x48\xed\x87\x13\xa9\x1d\x3e\x7d\xf8\x1f\x43\xa4\x76\xfb\x4c\xa4\xf6\x20\x22\xb5\xcf\x3f\x17\x91\xda\xa7\x67\x22\xb5\x1f\x42\xa4\xb6\xf5\xaf\x21\x52\xfb\xf2\x4c\xa4\xf6\x04\x22\xb5\x9b\x9f\x8b\x48\xed\xcd\x33\x91\xda\x33\x91\xda\x33\x91\xda\x33\x91\xda\x33\x91\xda\x33\x91\xda\x33\x91\xda\x33\x91\xda\x33\x91\xda\x33\x91\xda\x33\x91\xda\x33\x91\xda\x33\x91\xda\x33\x91\x1a\x25\x52\xcb\xef\x7b\x7d\xb0\x17\x0f\xa3\xbc\x67\x39\x8e\x6b\xf6\xc1\x36\xf9\x60\x6a\x9a\xa3\xf7\xc1\xef\xf1\xf0\xec\x1b\xb6\xd6\x07\x07\xb9\x52\x03\xb1\x27\xd5\x0c\x64\xf6\x9d\x84\xbf\x93\x01\x3b\xf8\x65\xaf\x3d\xff\x13\x8a\x83\x2d\x2f\xf7\x06\x2f\x54\x30\xf6\xfc\x4f\x51\x7c\x79\x30\xfe\x0b\xf9\xf9\xe0\x5b\x10\x65\xb3\x89\x77\x4b\xe6\xd4\x40\x66\x9f\xa8\x1b\x2f\x71\xe0\x64\x3f\x10\xc7\xe0\xfb\xfb\xf3\x0a\xd3\xfe\xed\x83\x78\xde\x60\x9b\xe7\x0d\xb6\x79\xde\x60\x9b\xe7\x0d\x76\xf0\xbc\xc1\x45\x3c\x6f\xda\xe3\x79\xde\xb4\xbf\x83\xe7\x4d\xfb\x3b\x78\xde\xbe\xf2\x6e\xb6\x4c\x8a\xda\xa3\x99\x66\x73\x0c\x10\x1f\xc4\xa9\x59\x7f\x3a\x5c\xca\x8f\xab\x0e\x3c\xcb\x5b\x63\x29\x2b\xbb\xd9\x78\x5c\x37\x63\x63\xac\xd8\x58\x0a\x07\x36\x72\xc3\x02\xbe\xc6\x00\x82\x7a\xfb\xcc\x7a\x2f\x13\x47\x42\xf0\x81\xa5\x63\xd2\x59\x2b\x0f\x80\xc6\x6f\x15\x3b\xa1\x0c\x5e\xc4\xc5\x31\xb1\x90\x48\x74\x66\xa7\x69\xdb\x49\xb9\x91\xfa\x4d\xc0\xbe\xc1\xa8\xa7\x56\x61\xfb\x60\x9e\x23\xcb\xd8\x3e\x78\xa6\x0e\xd6\x36\xad\xd1\x38\xbc\xc7\xa6\xfc\x49\x67\x27\xce\xf2\x74\xee\x97\x97\x26\x78\xfb\x54\x79\xd1\xff\x12\x88\x7e\x1b\xdf\xf4\x54\x5e\xea\xe2\xca\x8b\x79\xb2\x90\x9b\xac\xba\x84\xaf\x7f\xff\xb4\x98\x4b\xa4\xd5\xa9\xa7\x8c\x57\xa4\xd1\xe5\xc5\xfc\x48\x15\x6e\x29\x6b\xce\x8c\x77\xdd\x6c\x27\xfc\x2b\x24\xd7\xe7\x14\xd4\x5d\x78\x87\x59\xdc\x60\x92\x6f\xf0\xa8\xe9\xfc\x33\x64\xd7\xeb\x4f\xed\xed\x87\xbd\x50\x62\xfd\xb4\xc0\x6f\x31\xd0\x41\xe7\x50\x6b\x82\x91\x15\x2d\x67\x54\xe0\xd2\xa7\x8c\xad\x40\xe5\x40\x54\x0e\x65\x2e\xf8\x0b\x57\xa8\x01\x39\xbe\xe4\xda\x57\xb8\x46\x35\xbc\x51\x96\xbc\xfb\x2d\x76\x98\x85\x5a\xfd\xd5\xef\x74\xaf\x7c\xaa\x5e\xf5\x4d\x4f\xa4\xc4\x8d\x15\x92\xea\xf0\x2a\xa7\xf7\xc5\x07\x87\x72\x1e\xd4\xa6\xea\x3f\x3a\x28\xe2\xdc\xef\x37\x4f\xab\xca\x5e\x3f\x86\x59\xd2\xe0\x54\x84\x2b\xeb\x8f\x47\x95\xa5\x0b\xcb\x42\xd1\x63\xca\x12\xb3\x7a\xe6\xd1\x43\xe7\x62\x67\x30\x41\xf5\x1e\xcb\x7c\xc2\xd8\x6c\x74\x9f\x30\x1b\xff\xb1\xe8\x11\x61\xf9\x6c\x24\xbe\x98\xd5\x2b\xbc\xda\x34\x07\xba\x3c\xfc\x5d\xf0\xba\xdb\xc1\xdf\xa8\x04\x84\x2a\xf8\x63\xb5\x84\x10\xa0\x68\x59\xc2\xef\x34\xd7\xfc\xda\x7d\xc3\x66\x14\xa4\x8b\xa7\x1c\x7f\xdb\x9b\x3e\xf2\x36\xbc\x99\xaf\xb8\x0d\x7f\x68\x3e\x66\x42\xef\xec\xbf\xb9\xd8\x39\xbc\x78\xbf\xbf\xf3\xfb\xfb\x11\x3f\xff\xd3\xa6\xea\x33\xf6\x3d\xf3\x47\xcc\xff\xf8\x51\xf3\x4c\xcc\x2c\x1b\x3d\xaa\x2c\x47\x58\x56\xf2\xc3\xe7\x2c\xe7\x73\xf5\xf0\x39\x9b\x46\xdf\x73\xce\x5a\xab\xcf\xd9\x78\xe9\x0c\x63\x73\x36\xfa\x9b\xa7\xe2\x61\x12\xfc\x8b\xa7\x21\x37\x85\x3c\x81\xf6\xb0\x59\xf4\x1d\x77\xd1\x95\xad\x5d\xd6\x45\x27\xb7\x33\x54\xf0\x2d\x25\xa9\xd8\xd8\x9d\x3c\x66\x0e\x59\xe2\x7d\xcf\x7f\x54\x59\x62\x36\xeb\x79\x67\x8f\x5a\xab\xb0\x7a\x3f\xbe\x47\xf5\xa7\xf6\x68\xf6\xa8\x5e\x10\xaf\x4a\xb3\x47\x95\xe5\x0a\xcb\x0a\x97\xac\x70\x36\xdf\xa9\xcd\x35\x4f\x5b\xb2\xe6\xe9\xa2\x35\xcf\xe0\x79\xef\xcd\x8e\x35\xcf\xea\x58\xf3\x6c\x30\x8f\x9e\x74\x6a\x60\xcb\x5b\xe1\xeb\x60\x97\x5f\x2e\x88\x23\x61\x6b\x59\xb6\xda\xa2\x07\xc1\xec\x81\x8b\xde\xc2\xd5\xaf\x9a\xcb\xf6\x82\xe5\xef\x2a\xcf\x67\xd9\x61\x9a\xdc\xdc\xbe\x4f\xab\xf7\x7c\xe3\xef\x5a\xfd\xde\x9e\x9c\x90\xe7\x78\xfc\xef\x31\xaf\xf6\xc1\xdf\xaa\x5e\x24\xc0\x0f\xd8\x6a\x7b\xc8\x2b\xf7\x16\x1b\x36\x95\x4c\x34\xe4\x9d\xb7\x67\x4d\x19\x9d\xe5\x61\xb2\xae\x48\x4c\xa8\x02\x5b\x6b\xcb\x09\xab\x30\x19\x8e\xda\x14\x2e\xf0\x8e\x7f\x94\x2a\x19\xab\xa9\x52\xd3\x67\xa2\xd2\xa7\x45\x5b\x71\x55\xc0\x61\xd3\x09\x02\xd6\xd6\xc4\x13\xb1\x89\x69\xa9\xa0\x72\x34\xaa\xf1\xfd\x37\xcd\xc6\x8b\xce\x02\xf4\xd5\x0a\xb8\xec\xde\x4f\x1e\x70\x1f\x45\xaf\xe5\x4e\xd8\xac\xa7\xd7\x6d\xb0\xba\x78\xd0\xc1\x85\xe8\xa7\x87\x6f\xe3\xfc\x8d\x5c\xaa\xa0\xd8\x1b\x4f\x50\xf3\xd1\x4a\x78\x27\x27\x4a\xcc\x8d\xc3\x55\xc7\x7e\x42\x67\xa8\xd1\x9a\xa2\x4f\xbb\xcf\xb6\xcd\xf6\xc4\x2a\x83\x2b\xb8\xeb\x6c\x20\x4b\x3b\xa1\x94\x5f\x21\x29\x8a\xc3\xd4\xe3\xfc\xa4\x29\x59\x23\xbd\x4a\x99\x26\xd7\x28\x00\x8d\x24\x5f\xa2\xc9\x44\xba\x4c\xa4\xfc\x2a\x4d\xe6\x97\x57\x92\x27\xcd\xb0\x3a\xae\xe8\x18\xc6\xe9\xc7\x75\xf7\xf2\x25\x98\x8f\xc0\xb6\x5a\x7d\x65\x73\x37\x81\x40\xde\x7e\xbf\xbb\x2b\xed\x1f\x48\x87\x47\x07\x7f\x7c\x94\x76\x77\x8e\x4f\x1a\x22\x91\xf8\xf1\x55\x67\x31\x4d\x58\x5d\x04\x86\xf3\xc9\x64\x3f\x21\x33\xaf\x79\x11\xb8\x1f\x2d\xbb\xca\x6e\xdd\x65\x36\xd6\x67\xad\xbd\xf6\xe9\x4b\xd6\x67\x43\xb4\xfd\x9b\x85\x23\xfe\x49\x85\x4b\xd1\x0e\x44\xed\xd8\xfe\x1d\xe0\x3d\x7d\xfb\xe7\xdc\x90\xab\x6b\x8a\x45\x37\x7e\x6c\x5b\x9f\xac\xb6\xff\x6b\xc0\x7f\xec\xfe\x5f\xf6\xbe\xde\xde\x1e\x0d\xc1\x91\xd3\x5c\x32\x00\xd0\x12\x6e\x3d\x76\xe1\x26\x5f\xdf\x7a\x2a\xb3\xc8\xe4\xd6\xdf\x05\x76\x51\x87\x8b\xa4\xe0\x70\x5c\x60\x57\x2c\x44\x93\x68\x9d\x90\x09\x9c\x84\x5e\x78\xaf\xd7\x1d\x56\x8d\xa6\x2f\x39\xf9\x76\x41\xc8\xd1\x32\xc7\x4e\xab\xad\xf1\xc5\x76\x0f\x39\x8f\xd8\xc2\x03\xd8\xac\xce\xed\x45\xe8\x96\x7f\x85\xfc\x4f\xe3\xe4\xa6\x44\xbc\xa9\x26\x4a\x05\xe8\xc1\x7c\x65\xe9\x73\x10\xa3\x12\x5e\xe9\x3d\x28\x4f\x2e\x2f\x27\x88\x4c\x6e\xc6\xd7\x5c\xbc\x0a\xd5\xda\xa1\xc3\xda\x35\x3d\x59\x4f\x34\x20\xbf\xcf\x90\x94\x11\x4a\x3a\xf2\x5c\x3f\x4f\x3d\x6a\xfd\x27\xa9\x44\xb6\x6b\xba\x40\x3e\xc2\x71\x96\x6c\x70\x3a\x08\x23\x00\x35\x50\xa8\xad\xc9\xe1\x59\x18\x20\x88\x00\x24\xf7\xee\xfc\x6f\x44\x56\xb3\xd5\xe7\x7a\x31\x0c\x9c\xeb\xb8\xbe\x0c\x5b\x45\xe7\xb0\x55\xdc\x72\xa1\xd1\x5d\xde\xb7\xda\xe8\xf2\x87\x37\x60\xc7\x5a\x63\x68\xe0\x32\x02\x06\xd0\x9e\xf4\x42\x61\xe8\xb5\xf1\x20\x05\x1b\xe0\x2a\x02\x36\x28\xe6\x89\x25\x98\x8c\x06\xe7\x8f\x5d\x05\xae\x18\x16\xb8\xc6\x22\x89\x91\x60\x0a\xf7\xe3\x05\xa3\x45\x5e\x9f\x96\xbc\xfe\x55\xae\xbf\xb1\xd0\xb4\x6b\x9d\x32\x84\x2e\x6c\xfc\x69\x21\x7e\xe4\x29\xa3\x99\xaf\x7e\xca\x00\x2d\x97\x9f\x45\xf2\xb6\xdc\x7f\x6d\x81\x2d\xbb\xa0\x80\x96\x29\xab\x55\x57\x4b\xbc\x73\x6d\xf9\x60\x5a\x3a\x6c\x2b\xc4\xbb\x40\x89\xb2\x63\x6f\x8a\x36\xb2\xb7\x79\xbe\xc0\x87\x7b\xd5\x8c\x8b\x06\x29\xa6\x26\x40\x29\xa9\x5e\xb9\x30\x89\x5e\x76\xaf\xa2\x00\x31\xab\xe1\x83\x97\xc6\x51\x7c\xd9\x9d\x3c\xe6\x6d\x8c\xfe\xfd\x3d\xd6\xa0\x8d\x68\xd8\xe2\xea\xe6\x29\xc6\xfd\xbc\x97\x02\xd4\x5f\xa7\xf4\xe8\x59\xde\x4b\xfb\x95\x6f\x45\x5a\x10\xa7\xc7\x05\xa7\x73\x9c\x13\x1e\x74\x90\xf6\x41\x2f\x1e\xe6\x15\x6d\x3c\x40\xfd\x7e\xa1\x10\x51\x12\xb3\x4b\xf7\x21\xc2\x6a\x32\x2d\x1e\x9b\x87\x67\xe7\x20\xbe\x67\x45\x25\xb8\xe6\x33\x4a\x34\x3e\x89\xb2\x1c\xc5\x27\xc9\xe8\x1a\xc5\x79\xf6\x70\x4a\xfb\x66\xfe\x47\x72\xda\x9f\x6e\x5e\x6c\xbc\x3f\x79\x3b\xda\x3f\xd9\xd9\xdc\x38\x69\x90\xd7\x23\x85\x98\xb1\xac\x65\x1b\x94\xdd\xb4\x22\xb3\xbf\xa7\xcc\xea\xf3\xb8\x2c\x7b\xd5\x5a\xb7\x36\x4e\x36\x36\x47\xfb\x27\x22\xd2\x7c\x5c\xad\x3f\x41\x5e\xe1\x4f\x46\x99\xd5\x1b\x7e\x37\x7d\x41\xdd\x25\x87\x7b\xf9\xd5\x49\xc2\x44\x17\xf5\x2f\x91\x34\xf0\xf2\xa2\x79\x47\xe8\x32\xca\xf2\xd4\x4b\x95\x2c\x47\xb3\xe3\x52\x70\x32\xd4\x35\xe9\xdf\x8c\x4e\x2e\x4e\xf7\x2e\x98\x3c\xc7\x54\x92\x24\xde\x46\xb9\x7f\x85\x82\xd3\x72\xec\x95\x71\x14\x07\x74\x34\x78\x32\xff\x56\x3a\x11\x77\x3f\x29\x93\x53\x23\x2f\xed\x21\x20\x20\xca\x47\x0a\x5e\x45\xee\x81\xfc\xab\xcc\x88\xee\xab\x4c\x77\x77\xbd\x66\x31\x67\xe7\x2c\x55\xc3\x27\x62\xf8\x02\x36\x73\x2b\x13\x14\x5f\xe6\x57\xff\xad\xbe\x7c\xd9\x83\xc3\xe1\x50\xfc\xf3\xab\x82\x05\x9f\x8d\x56\x6b\xa0\x94\x0c\xe5\x74\x08\x1b\x05\x9c\xa9\xe7\x7d\x4a\x80\x9f\xa2\x2c\x4f\x52\xea\xef\xd4\xcc\xcf\x98\xfd\xe7\xb3\xd9\xe4\xf6\x38\x47\xb3\x3d\x6f\x36\x23\xa6\x46\xad\x4b\xd9\x02\xb0\xc9\xec\x97\x8e\xee\x6c\x2f\x2c\x43\xa4\xe4\x69\x34\xed\xf5\x95\x6c\x36\x89\xf2\x9e\x0c\xe4\xbe\x12\xc5\xfe\x64\x1e\xa0\x8c\x0a\x2c\x98\x01\x7d\x20\x9a\x90\x2d\x29\x1a\x33\x12\x70\x1a\xca\xfb\xd2\x08\x54\x53\x3c\x42\x6a\x73\x72\xcd\xe6\xe3\x49\x94\x5d\x31\xfe\xfb\x45\x2a\x7a\xcf\x4f\x0e\xdc\x95\xa4\xaf\xb3\x8d\x30\xa4\x2e\x01\xb8\x67\xb7\x2a\x8e\xff\xce\xd5\x48\xd4\xee\xd5\x0a\x6c\x2e\x4f\x25\x63\xbe\x32\x9b\x67\x57\x2d\xad\x01\xa8\x21\xf0\x88\xdc\x17\x64\x35\xbc\xd8\x96\x90\xb4\xcc\x17\x6a\x23\xef\xbe\xd0\xab\xa6\x33\xbf\x5c\x02\xa1\x5e\x1f\xcf\xae\x50\x8a\x4a\x5f\x89\x3c\x91\xe6\x19\x92\xbc\x8c\xdc\x02\xbc\x9b\x8f\x51\x1a\xa3\x1c\x65\xe5\x39\x9f\x25\x54\xe4\x0e\xe9\x6b\xca\xf7\xe0\x06\x88\x54\xa5\x00\x17\xab\xcf\xad\x46\x7e\x6e\xe2\x2c\x29\x22\xab\x52\x16\xab\x07\xf7\x15\x5d\x03\xfc\x14\x79\x39\xaa\x4f\x46\xd0\x4c\x5a\x4a\xd0\x4a\xdd\xa9\x5c\xdf\x42\xac\x43\x2c\x55\x36\x38\x3b\x57\xfc\x24\xf6\xbd\xbc\xf7\x7b\x0c\x50\xde\xeb\xd6\xbd\x5a\xe1\x4d\x45\x53\x6a\xa5\xf6\xfb\xf7\x85\xe6\x91\xc9\x54\xfc\xf8\x3e\x8f\x26\x51\x1e\x21\xb2\x94\x6d\x73\x39\x5a\xeb\x11\xea\x2b\x29\xca\xd3\x08\x5d\xa3\x94\xf6\x07\x1b\xf4\xed\x34\x99\x62\x15\xe3\x56\x7d\x4e\x8b\x1b\x89\x44\x6b\x94\x78\x28\x95\x10\x17\xc7\xef\xca\x25\x9e\x1c\x5e\xf9\x87\xc3\x21\xe2\x66\x77\x70\x1b\x7b\xd3\xc8\x5f\x65\x2e\x17\x0b\x37\x69\xad\x78\x93\x05\xf9\x50\x96\xd7\xd1\xcb\x97\xbd\x7c\x28\x33\x81\x06\x92\xfc\x0b\xdd\x74\x7e\x91\x81\x24\x53\x33\x2a\x16\x95\xb6\x17\x2b\x89\xad\x6c\xee\xbe\x3f\xc6\xfb\xfc\xf1\xe8\xe8\x74\x67\x73\x74\xb1\xb9\xb3\x75\x04\x5e\xa8\xfd\xf5\x18\x17\xfb\xcb\x50\x2e\xa0\x96\xd9\x1a\x4b\xa2\x27\x71\x25\x31\x57\x7e\xb4\xbc\xfc\xc3\x83\xad\xaa\x6c\xd6\x45\x51\xa3\x8a\xc3\x24\x28\x8b\x8f\xfa\x20\x57\x50\x1c\x64\x1f\xa2\xfc\xaa\x47\xaa\x22\xed\xcc\x95\x6c\x12\xf9\xa8\xa7\x82\x35\x0d\xeb\xf5\xdd\x5d\xaa\x04\x55\x77\xde\xdf\x9f\xf7\x41\x7a\xdf\xdb\x8e\x95\xbf\xb8\x45\x8c\x4b\x31\x94\x8f\x67\xc8\x8f\xc2\x5b\xe9\x2a\xf9\x22\x9d\x78\xf1\xd7\x39\xbf\x54\xbc\x49\xa3\xa0\x58\x27\xa2\xf8\x52\x8a\xc8\x51\xf7\x3a\x0a\x50\x20\x79\x31\xfe\xdf\xad\x74\x39\x49\xc6\xde\xa4\x5c\x76\x32\x7a\xbc\xce\x64\x80\x94\xff\x99\xab\x9a\x6d\x86\x9e\x3f\x14\xa8\x44\x8c\xbe\xf4\xf2\xbb\x3b\xd4\xef\xe1\xf3\x99\x6e\xf5\x3e\xe7\xca\x51\xbf\x7f\x5f\xe6\xf3\xa7\x33\x7c\xbc\xfa\x63\x36\x65\x9b\x06\x02\xd4\x5d\x2d\x49\xb3\xc1\xd9\x19\x89\x0f\xbd\xce\xc8\xa2\xb7\xc6\x6a\x5f\xc3\x93\x5a\x3e\x3f\x07\x21\xf2\xf2\x79\x8a\xb2\xc1\x19\x3e\xc0\x1d\xfc\x75\x0e\x02\xe4\x4f\xb2\x81\xa6\x83\x6b\x2f\xcd\x06\x2e\xf0\x93\x38\xcb\xb3\x96\xa6\x81\x1c\xa4\x20\x06\x51\x09\x51\x3b\x07\x19\x98\x81\x10\x04\xe0\x04\x5c\x80\x4b\x70\x05\xae\xc1\x3e\xd8\x00\x07\x65\x7f\x72\x84\xf4\x1e\xba\xbb\xeb\x79\x4d\x7e\x2f\x2c\x94\x44\xd0\xf3\x19\x07\x3d\x0c\x9c\xb1\x33\x1e\x87\x9a\xee\xc2\x50\x47\x01\xd4\xad\x31\xb4\x91\x8b\x0c\xcf\xd7\x90\xe6\x85\x63\xdf\xf4\x0c\x9d\xe1\x71\x5b\xae\xee\xe8\xae\x6a\x19\xa6\x69\x9b\x9a\xe1\x38\x70\xc0\x8f\x51\x11\xc8\xcb\xee\x35\x32\x46\x43\x9f\x73\x62\x4d\xb0\x58\x93\xa6\x58\x7e\x1c\x15\xa3\x99\x32\x12\x0b\xcb\xf0\x35\xcd\x08\x5c\x37\x74\x7d\xd3\x36\x03\x14\xe8\x8e\x63\x07\x2e\xb4\x4c\x42\xc8\x3b\xf6\x1c\xd5\x45\x8c\xd9\x5a\x83\xb6\xe6\x5a\x26\x34\x1d\x53\x37\x6c\xc7\x74\xa0\x36\x90\x36\xf7\x77\xa4\x43\x56\xa8\x18\x36\x5c\x80\x94\xdd\x07\x29\x27\xad\x8f\xa5\xf5\x0b\x69\xc9\x26\x54\x36\x8e\x75\x49\x10\x18\xbe\x0a\x4d\xcb\x0c\x0c\xd5\x31\x3d\xcd\x75\x34\x47\x1b\x07\xc8\x53\x0d\x2d\xb0\xec\xb1\xab\x39\xaa\x6b\x8e\x19\xf5\x0d\xd4\x34\xcb\x35\x0d\xa8\xab\xba\x03\x55\x13\x3a\xfa\x40\xaa\x17\xcb\xfa\x2c\xe6\xa4\x98\x63\x29\xe6\xcd\x3e\xe3\x50\xd5\x1d\xd7\x0d\x1d\x47\x1f\xfb\x5e\x08\x55\x18\xa8\xaa\x69\xe8\xae\x67\x39\xba\xea\x9a\xba\x65\x8c\x75\x17\x3a\x2a\xb2\x19\xaa\xba\xae\xd9\xae\xeb\x42\x43\x53\x35\xdd\x76\x2d\xd7\x86\xff\x6a\x52\x42\x11\xaa\x7a\x4b\xa0\x0b\x38\xf8\x5b\xa1\xd2\x5b\x3c\x39\x6d\x96\x9c\x16\x47\xce\xa3\x18\x72\x44\xa4\xad\x2b\x81\xa6\x8b\x18\x73\x2a\xbe\x9c\x88\xd3\xa0\x0c\x6b\x50\x86\x4a\x2e\xf9\x3a\x60\x8d\x1f\x05\x69\x8d\x09\xd8\x0e\xa0\x3f\xd6\xc6\xbe\xa5\x8e\xcd\xb1\xaa\x05\x9e\x65\x5b\x7a\xe0\x7a\xba\x05\x4d\x23\x74\x5d\x5f\xd3\x6d\xdf\x66\x4b\x88\x6e\x1a\x86\xe6\x68\x9a\x6b\x59\x86\x65\x39\x0e\xb4\xf4\x9f\x50\x9d\xd8\x0b\x54\x8a\xfc\x64\x3a\x45\x31\xde\x35\x08\xdc\x40\x8a\xcf\x1c\x52\x12\x4a\x50\x55\x15\xcb\x50\x54\x45\xfd\x15\xea\x78\x77\x99\xc7\xde\xb5\x17\x4d\xb0\x01\x0a\x24\x14\xe3\x0e\xf3\xa4\x20\x0a\x43\x94\x12\x70\xa7\x2a\x37\x33\x6f\xc3\x24\xed\xb0\x6f\x5b\x44\x82\xff\x4b\x34\xf7\xbb\xe8\x69\xc2\xe9\xe9\x0c\xeb\xe9\x6c\xa1\x9e\x96\xe0\x10\xd3\xec\x92\xa9\x6b\xe8\x07\x63\x3f\xf4\x4d\xd7\xf4\x0d\x35\xb4\x34\x5f\xd7\xd4\xd0\x30\x2c\xd7\xb1\x2d\x35\x84\x1e\xb4\x8d\x40\x77\x18\x89\x8b\xe5\xd8\x50\xb7\x75\xcd\xd4\x2c\xdb\x80\x50\xb7\x35\xbc\x55\x08\x6c\x29\xc9\xf7\xe2\x38\xc9\xa5\x31\x92\xd0\x74\x96\xdf\xb2\x85\xd9\xe3\xc4\x0d\xb1\xb8\xe1\x03\xc5\x85\x86\xad\xea\x26\x82\xb6\x6d\x5b\x30\xb0\x5d\xc7\x09\x54\x57\x33\x3c\x68\x1a\x16\x74\x34\x4f\x1d\xdb\xae\xa5\xa9\x36\xdb\x07\x35\x68\x40\xc7\x72\x2c\x55\xd3\x54\x13\x1a\x8e\x63\x77\x88\x1b\x26\xe9\xd4\x23\x8f\xa9\x51\x4c\x6e\xd7\x98\xc0\x13\x4e\xe0\x00\x0b\x1c\x3c\x50\x60\x35\x74\x91\xaa\x8d\x91\xa1\x6b\xa1\xaf\x21\xd3\x31\x43\xcb\x56\x75\xcd\x80\xd0\x40\x76\xe0\xea\x86\xe9\x87\xba\xce\xa8\xf1\xa1\x0b\x55\xcb\x70\x5d\x5b\x53\x75\x5d\xd5\x55\x17\x3a\x1d\x02\x4f\xe7\x19\xe9\xdd\x79\x1c\x7d\x9e\x23\x26\xad\xcf\x49\x7b\x82\xa5\x3d\x69\x4a\x3b\x4b\x82\xf6\x8a\x65\xa9\x9a\xaf\xeb\xa1\x13\xe0\xad\x18\x9a\x81\x6a\xe9\x86\xed\xe9\x8e\x66\x8d\x5d\x7b\x8c\x34\x4b\x77\x11\xd4\xc7\xc5\x76\xa9\xaa\x86\xe6\x5a\x10\x3a\xaa\xa1\x1a\xa6\xee\xc2\x7f\xcb\x15\xcb\xd5\x14\x68\x39\x74\xc9\xb2\x1e\xbd\x64\xcd\x92\xe0\x79\x7d\x5a\xb0\x3e\xcd\x39\x8d\xbc\xc0\x1a\x79\xd1\xa9\x91\xed\xb9\xa3\x1b\x9e\x6b\x18\x46\x60\x9b\xae\x1b\x58\x0e\x82\x78\x03\xd5\xc3\x60\x6c\x38\x8e\xa6\x8e\xa1\xee\xa3\xb1\x0e\x7d\xc6\x75\x68\xe8\xa6\xeb\x40\x55\xd3\x75\x5b\x37\x6d\x68\x59\x86\x51\xcd\x9d\xc3\x83\xad\x45\xeb\x52\xc6\x89\x79\x89\xc5\xbc\xec\x14\xb3\x58\x1f\x4a\x29\x35\xe8\x05\xbe\x1d\x62\x29\x7d\x43\x85\xce\x18\x8d\x61\xa8\x3b\x8e\x19\xa2\x00\x1a\xd0\x35\x2c\xd5\xd4\x11\x64\x2b\xa8\x6d\xea\xaa\x0a\x35\xdd\x51\x0d\x68\x19\xd0\xd0\x6c\x5b\x20\x65\xd7\x72\x34\xe3\xe4\xbc\xc2\x72\x5e\x15\x72\x5e\xe5\xf9\x8c\xf9\x77\x14\x20\x2f\xfc\x1c\x57\x11\xd2\x6c\x4d\xf7\x74\xe8\x84\xb6\xe7\xb9\x96\xea\x6b\x4e\xe0\xb9\xba\x6e\x7a\xaa\x07\x6d\x64\x68\xb6\x31\x46\x21\xeb\x78\xdd\x75\x55\xd7\xd0\x1c\x4b\x87\xd0\x56\x1d\xab\x83\x35\x52\x78\x04\x08\x39\x19\xaf\xb1\x8c\xd7\x02\x19\x8b\x27\xf0\x3a\x67\xbd\x61\x5a\x21\xb4\x61\xe8\x18\x8e\xa7\x8d\x35\x03\x8e\xf5\x00\x1a\xba\x6d\x40\x14\xc0\xb1\x11\x40\xcd\xf3\x7d\x46\x19\xeb\x6a\xd0\x31\x4d\xdd\x75\x35\xd3\x75\x1c\xdd\x76\xd4\x8e\x75\x48\x28\x64\xc0\x09\xb9\x8f\x85\xdc\x17\x75\x64\x3a\xe1\xe5\x83\xa1\x3a\xf6\x2c\x67\xac\x87\x9a\xe1\x06\xf8\x9c\x32\xd6\x91\xaa\x3a\xaa\x15\xa8\x63\x33\x54\x91\xe1\x9a\x4e\x68\xb3\xa5\xdc\xd6\x5d\x5d\x53\x6d\x57\x73\x6d\xcd\x76\x74\x47\xb5\x7f\xc6\x75\xf2\xed\xc9\xc9\x21\x6b\xed\xfb\xa3\x5d\xbc\xb2\x8d\xab\xd7\x71\x14\xb0\x4b\x81\xc9\xad\x14\xc5\x64\x41\x15\x1e\x2c\x8a\x39\x82\x17\x44\xcf\xf7\x51\x96\x91\x3b\x86\x38\x4c\x3d\x7a\xf1\x39\x4f\x91\x14\xa0\xd9\x24\xb9\x45\x81\x34\x46\x57\x51\x1c\x90\xd2\x48\xc5\x7f\xef\xf2\xd9\xa2\x23\x6c\x93\x11\xb6\xa8\x08\x1f\x45\x44\xf8\xe8\x83\x89\x88\x98\xb0\xa2\x25\x3c\xe1\x14\x77\x03\x2b\xee\x46\x87\xe2\xb6\x97\x53\x5b\xb7\x54\x53\xb3\xd1\xd8\x34\x7d\xd5\xf1\x5c\xd5\x44\x86\x8b\xa0\xab\x06\xea\xd8\xb7\x1d\x18\xf8\x8e\xe5\xe9\x90\xad\x01\xb6\x63\x3b\xa6\x61\xba\x96\x0e\x4d\x5b\x55\x5d\xc7\x71\x06\xd2\xdb\x7a\x1d\xe2\xc5\xf4\x82\x13\xf1\x00\x8b\x78\xc0\x8b\xd8\xcb\xfa\x02\xd9\xcc\x71\xa8\x8d\x43\xa4\x41\x73\x3c\x76\xd4\xb1\xa6\x5b\xaa\x63\x99\x63\xc7\x35\x5c\xa8\xea\xaa\xa5\x8f\x0d\x4f\xd3\xb4\x62\x6e\xa9\xaa\x6b\x39\x16\x34\x1c\xd5\xb4\x4d\x5b\x75\x34\x77\x40\x3c\x38\x06\xbf\xfe\x2a\xcd\x52\x14\x46\x37\x78\xed\x9c\x46\x54\x13\xa9\x58\x97\x9c\x58\x53\x2c\xd6\x74\xf9\x94\x77\x91\xe9\x7b\xb6\xa6\xfb\x41\x10\x22\xdb\x57\xd1\xd8\x32\x7c\xd7\x31\xc3\xf1\xd8\x45\x8e\xa5\x06\x9e\xa3\x7b\x9a\xab\x16\x0c\xee\xb6\x6b\xb9\x96\xab\x39\x96\xe9\x68\xb6\xa6\xda\x3f\xe3\xdd\x00\xf1\x1b\xf8\x3f\x35\xe7\x9b\xf6\x50\x6b\x11\xf8\xb5\xf5\xcd\x7f\xd9\x7f\xeb\x9c\xb7\x05\x89\xcc\x72\xce\x5f\x71\x9a\x3b\xc2\x9a\x3b\x5a\x79\xce\x93\x4d\xd4\x1a\xeb\x26\xf4\x2d\x68\x1a\x8e\x35\xd6\x5d\x5b\x35\xdd\x50\xf7\xf4\xd0\x71\x75\x27\xb0\x61\x60\x78\x7a\x49\x17\xed\x40\xd7\x50\x35\xe8\x40\xc7\x32\x6d\xd7\xd5\xe9\x9c\xcf\x96\x4e\xfa\x6b\x4e\xc6\x4d\x2c\xe3\xe6\xf2\x49\xaf\xe9\xe3\x20\x80\x9a\x6b\x06\x96\xea\x06\x7a\x88\x6c\x0b\x1f\x91\x4c\x3d\xb4\x60\xa0\x99\x10\x6a\xc8\x45\xb6\x5e\xdc\x9f\xea\xd0\xb6\x0d\x15\x6a\x86\xa9\xb9\xb6\xa9\x6b\x9a\x5a\x4d\xfa\xc2\x83\x6b\xd1\x02\xb0\xcf\x89\xf8\x27\x16\xf1\x4f\x5e\xc4\x6c\x81\xf5\x14\x86\xba\xa1\x6b\xce\xd8\x36\x0c\x15\x8d\x21\x74\xa1\xef\x7a\x50\xf5\xec\xd0\x87\x9e\xa6\x23\xa4\x7a\xae\xa7\x19\xec\xd4\xe9\x38\x96\x61\x58\xba\x6b\x6b\xae\xa3\xbb\xb6\x69\xe1\x43\xdc\xca\x96\xc9\x06\x27\xe5\x11\x96\xf2\x48\x24\xa5\xc8\x7e\x0a\x7c\xd3\x43\x61\xe8\xb9\xc8\xf5\x55\x5d\x53\x5d\x33\xb4\x3d\x0d\xb9\x9e\xe6\x99\x2e\x74\xa0\x65\xaa\xba\x6b\x98\x06\xeb\x4e\x43\xd3\x0d\x1b\x12\x26\x56\xc3\x71\x4c\xab\x63\xad\x12\x0a\x79\xc0\x09\x79\x8c\x85\x3c\x2e\x2f\x58\x13\x26\x21\xdf\x7d\x8e\x1d\x86\x86\xa7\x79\x30\xd0\x1d\xdd\x0b\xc6\xaa\x11\xba\x5e\xa0\xfb\x76\x38\x1e\xeb\xae\x6a\x58\x96\xe6\xa2\xb0\xb8\x8e\xd6\x1c\x68\xb9\xae\x0b\x1d\x15\x42\xcb\x30\x0d\xb7\xa3\xfb\xfe\xa5\xab\xe8\x86\x84\x4f\x96\x9e\x94\xa1\x99\x97\x7a\x39\x0a\xa4\x49\x94\xe5\xf8\x64\xc9\xc3\xb1\x67\x44\x31\x93\x2c\x27\x50\xd6\x99\x22\x8d\x6e\xbc\xe9\x6c\x82\x06\x52\x9c\xd0\x85\xf0\x36\x99\xa7\x41\x32\xf5\xa2\x58\xf1\x93\x29\xe0\x8f\xa5\x9a\xd1\xb9\x4c\xd6\xa5\xc1\xeb\xf1\xdf\x24\xcf\x0e\x73\x38\xaf\x8e\xd5\xf9\x95\x97\x4b\xb7\xc9\x9c\x1d\x99\xf1\x12\x7f\xba\xc7\x9f\x96\x8b\x9b\x3d\x2e\xfc\x9f\x3e\xff\xa0\x40\xf2\xc6\xc9\x35\x52\xa4\x6d\x2f\x9a\xe0\x79\x9a\x27\x52\x90\x48\x59\x42\x5d\xd7\x53\x94\xcd\x27\x39\xd9\x85\x52\x2f\x0c\x23\x5f\x1a\xa3\xfc\x0b\x42\xb1\xe4\xcd\xa2\xb5\x0c\xa5\xd7\xf8\x88\x1e\x07\xd2\xa7\xf9\x18\x4d\x10\x5e\x92\x70\x21\x61\x92\x7e\xf1\x52\x22\x5a\x52\xed\x38\x40\x8a\xa6\x33\x8f\x42\x11\xe0\xf4\x7e\x3e\x91\x26\xc9\x25\xed\xb5\xf8\x6f\x3f\xc4\xb7\xbf\x11\x9c\xa2\x5b\xbc\xbd\xc6\x72\xda\xde\xff\xd2\x06\x5a\x23\x49\x45\x5a\x7a\x56\x6d\x40\x5a\x7d\x03\x2a\x73\xdd\x55\x49\xf4\x7a\x12\xbd\xf8\xe2\xbc\xaa\x4c\xaf\x27\xaa\x32\xfd\x80\xca\x04\xdb\xa6\x21\xda\x5c\x0d\x8e\x67\xf8\x4c\x07\x1c\x80\x2c\xa5\xb6\xf4\xb2\xac\x60\xf6\x94\x6a\xfc\x9e\xa0\xc1\x03\x6a\x00\xea\xef\x57\x11\x69\xa3\x6b\xc2\xb1\xa9\x11\x7e\xcd\x28\x9e\x44\x31\x92\xcf\x01\x2a\x7f\x8f\xae\x49\xf6\x2c\x43\x69\x4e\xfe\xee\x2c\x42\x97\xcf\x41\x5e\xf2\x92\xa6\xc9\x97\x9a\x70\x7e\xc9\x55\x2a\x15\x7f\x66\xd3\x35\xab\xfc\x30\xb9\x5c\x33\x96\xca\x97\xcd\xc7\x6b\x94\xea\xfb\x1c\xa4\x02\x0a\xd4\x82\x47\xb4\x70\xd8\xa6\xf5\x9e\x10\x07\x6b\xca\x0e\x4b\xd8\x56\x67\x9c\xaf\x75\x56\x51\xc6\x36\xbf\x6e\x93\xc2\x36\x53\x10\x11\xe9\x93\xf5\x18\x05\xe3\xdb\x66\x92\xd2\x81\x57\x07\x85\x4f\x78\x49\xf9\x2a\x4e\x48\xc2\x33\x08\xea\xcb\x5a\x9c\x90\xa1\x38\xe3\xfb\xe4\x99\xd5\xb5\xce\xea\x2a\xd6\x51\xae\xa7\xc4\x75\xa7\x28\x4c\x51\x76\x55\x2c\xde\xb8\x06\x6f\x1c\xc5\x01\xc2\x1a\xa3\x12\xa1\xc6\x79\xbc\xc6\x92\x91\x0c\x19\xca\x1b\x22\x16\xd2\x54\xa9\x6a\x75\x94\xcf\xb2\x89\x17\xa0\x40\xa4\xda\x2c\x21\xf3\x4f\xc3\x7b\x43\x32\x4f\x89\x8f\x65\x39\x6b\xb2\x59\x14\xc7\x28\x95\xd8\xbf\x6b\xd9\xb4\x5e\xd0\xc3\x64\x58\xa5\x6a\x58\x56\x5a\x55\x8f\xab\x6d\x31\x0e\x57\x1f\xf0\x3c\xe6\x3e\x92\x99\x7c\x0e\xe2\xee\x25\x44\xf6\x20\xbc\x3d\xa1\x6e\xf7\x27\x69\x74\x49\x57\x2a\x6e\x80\xa3\x38\x4c\x4a\x45\x93\x33\xca\xce\xab\x69\x0f\x21\xf2\x05\x34\x34\x6d\x27\x3c\x98\xa1\xb8\xc8\x78\xcc\x20\x85\x38\x9e\xe8\x78\x09\xf1\x3a\xff\x7b\xab\xff\xc6\x13\x2f\x26\xda\x43\xd6\xa4\xe2\x73\x31\x67\xb7\x13\xdc\xac\x02\x8d\xe7\x41\x24\xc4\x78\x91\x2f\x00\xa2\x58\xc6\x32\x28\xa0\xa8\x5c\x3e\x07\x11\xfd\x89\x63\xbf\x6e\x37\xa0\x0d\x65\x82\x17\x9f\x89\xe7\xa3\xab\x64\x12\x90\x9e\xbf\xb9\xb9\x51\xb8\xff\xfd\x7a\x73\xc3\xda\xc0\xf9\xec\x73\xc4\xc8\xab\x56\xc9\x20\x1b\x56\xab\x6e\x0e\x32\x10\xb4\xca\x66\x83\xc4\x47\x27\x08\x6b\x6c\x24\xa8\xd7\xc7\x0e\x54\x88\xda\x85\x38\xc5\x39\x98\x2d\xaf\x8a\x1d\x9a\x96\xd4\x57\xa5\xaa\x57\x5a\xfe\x70\x0e\x42\x36\xf2\xec\x7c\x23\xae\x8e\xfb\x75\x41\x75\x5c\xaa\x7a\x75\xe5\x0f\x6c\x9e\x36\x23\x96\x3a\x37\xc7\xcd\xea\x53\x25\x15\x1f\x99\x20\x14\xa8\x9e\xa0\xbe\xbb\xf1\x3b\x3e\xb6\x02\xf8\x05\x8b\x5f\x42\x60\x7d\xcd\x70\xb8\x8f\x37\x93\x35\xb3\x5b\xef\xf1\x1a\x55\x82\x4f\xca\xe7\xe0\x60\x78\x9b\x2b\x7f\xde\x18\xbd\x83\x7e\x87\x35\xf4\x85\x3a\x8a\xb2\x4f\x78\x11\x5d\x60\x17\x09\xd5\x82\x85\x5e\x88\x97\x88\xf2\xb7\xfa\x98\x34\x04\xc5\x09\xc9\xa6\xbf\x46\x9c\x25\x6b\x7d\x45\xb7\x7f\x1e\xbc\xac\x92\x88\xfa\x76\x2d\x50\xd7\x6c\xe9\xd4\xc8\x1e\x34\x37\xa8\x1b\xd9\xf2\x0a\x97\x4d\x90\x56\xb2\xce\x19\xb2\xb1\x64\x86\x64\xab\x4d\x91\x56\xb2\xee\x39\xb2\xcc\x92\xfa\x52\xb8\x16\xcb\xa5\xce\x74\x19\x44\x79\x1a\x79\xf1\x65\x97\x49\xd4\x1a\x59\xfa\x35\xb3\x62\x9f\xc2\x2c\xff\x76\x11\xb3\x3c\x0b\xb4\xa7\xdc\xf2\x7a\x3b\xb2\xcf\x00\x1f\x63\x1a\x02\x47\x43\xd7\x0d\x3e\x62\xfb\xca\xe4\x79\xbf\x2d\x20\xa0\xf9\xb0\x6b\x01\x7e\x34\x82\xf7\x5d\xcc\x87\x03\x3a\xe5\x2f\x2e\xc8\x49\x10\xa1\xd1\xfa\x05\xaa\x20\x89\x00\x84\x65\x7c\xa1\x23\x08\x99\x85\xb4\x41\x6e\x15\xe6\xaa\xb5\x08\xc2\x97\xc5\xd6\x72\x81\x9e\xb0\x44\x26\xc1\xa7\x82\xae\xe0\x5a\x2e\x45\x2b\xe8\x13\xda\x4d\x16\xf7\x25\x41\x9f\xf9\xaa\x31\x9e\x15\x97\x7c\x19\xe3\xd9\x04\x89\xed\x0e\xcd\x65\x18\x04\x7a\x99\x55\x83\x40\x96\x88\xc7\x3c\x5e\xfb\xe8\x15\x56\xe1\x02\x2b\xa1\x9b\x59\x92\xa1\x4c\xf2\x82\x20\x62\x78\x31\x68\x12\x64\xe4\xf2\x81\x82\x59\xe3\x4c\xe4\xd2\xe2\x2a\x0a\x90\x94\x5f\x25\x19\x2a\x12\x2d\x0d\x27\x65\xb4\xf5\xfb\x11\x30\x6c\x00\xd5\x26\x32\x23\x0f\x94\xf0\x23\xc9\x51\x74\x41\xe2\x4e\x70\x05\x9e\x49\xe5\x12\xe5\x9b\x71\x74\x72\x3b\x43\x24\xf4\x0e\x4b\xc9\x62\xee\xac\xee\x18\xba\x45\x85\xb7\xc4\x96\xbd\x38\x4f\x91\x27\x0f\x87\xb9\xe2\xd3\xaa\x1e\x94\xf8\xee\x4e\xf6\xbd\x49\xe4\x27\xc2\x12\xa8\xd2\x1c\x7c\x9e\x8b\x08\x4c\xf8\x83\xe7\xa2\xae\x6a\xc6\x2b\xd6\x33\xae\x8e\x0b\xfe\xf1\xc2\xc0\xff\x1c\x8e\xae\xf0\x2f\x1f\x26\x04\xd6\xfb\xdd\x66\x03\xfd\x9b\xc1\x86\x7f\xbe\xde\xe5\x90\xb9\x83\x93\xeb\x02\x4b\xbc\x01\x22\x3e\xfa\x0d\x7f\x48\xf2\x0f\x35\x60\x6f\x0a\xf5\x5d\x61\x89\x33\x84\xf0\xaf\x5b\xdb\x05\x40\x79\x0d\x7f\x5c\x84\x36\xce\x23\x81\x97\xf7\x0d\x22\xfc\xeb\x19\x9e\x3a\xf1\x25\x01\xdf\xd6\x4d\x02\xb4\xdd\xb0\xba\x96\xe5\xa2\x20\xdb\x24\x6c\x7e\x9c\x22\xef\x93\x10\x9c\xbb\xfc\x75\x40\xfe\xbb\xe6\x4d\x26\xeb\x14\x76\x5b\xb3\xcc\xa5\xf9\x25\x49\xea\x04\x0f\x67\xe0\xdd\xaa\xfa\xcf\x7b\xa5\xb3\x95\x61\x12\xe7\x6b\xf8\x04\x36\x80\xfa\xec\x66\x9d\x7c\xfc\x42\x41\xc2\xc7\xc9\x24\x58\x67\xed\x19\x98\xb3\x1b\x49\xbd\xa7\xc7\x6d\x85\x1c\x97\x85\xd8\xe6\x9e\xff\xe9\x32\x4d\xe6\x71\x40\xf0\xcd\xd7\x39\xac\xf3\xb2\x24\x95\x54\x32\x88\xe2\x2b\x94\x46\xf9\xba\x3f\x4f\xb3\x24\x1d\x10\x64\x10\x94\xde\x2b\xcd\x0d\x55\x54\x4d\x72\x8d\xd2\x70\x92\x7c\x21\x03\xc1\xfa\x0d\x77\xd3\x7a\x85\x59\x6e\x98\xa4\xf3\x6b\x26\xd9\x62\x94\x73\x9a\x83\xa0\x9c\xa3\xfb\x5e\x1f\x1c\x44\x04\xd8\xdc\x75\x5d\xbd\x0f\xa6\x51\x2b\xec\x86\xe2\x9c\xcb\x49\xb6\x33\xf5\xf0\xbe\x50\x3c\x16\x0d\x5e\xa8\x05\xda\xf9\xc1\xb1\xb4\xb3\xb7\xf1\xe6\x91\x48\xe7\x71\x0b\xe2\x7c\x9a\x44\x81\x7c\x7f\x7f\x7e\x5f\xc5\xe1\x8e\x96\xe0\x34\xfd\x4b\x50\xcd\xa9\x59\xa1\x2d\x85\xcc\x78\x18\x72\x60\x11\x30\x40\x8c\xd6\x4c\x89\x13\xd2\xf1\x1b\xd8\x22\xdb\x43\x59\xe6\x5d\x22\x6e\x15\xe7\x20\x54\x36\x7f\xe2\x2e\x12\xa1\xac\x7f\xcf\x2e\x8a\x4f\x98\xf9\xb9\xbc\x9b\xfe\x5c\x8a\x34\x53\x03\xd0\xd4\xbf\x73\xa7\x69\xc6\xca\x9d\x66\xae\x62\x32\xf1\x80\xf9\x3c\x74\xc7\x0f\x03\xcc\xb7\x05\xc2\xac\x04\x98\x4f\xc1\x00\xc4\x56\x4e\x6b\x94\x8e\xba\x81\xaf\x56\xc0\xbd\xd2\xaa\xce\x7f\x20\x8e\xa2\x10\x46\xb1\xa1\x6e\x6c\x29\x64\x37\x7f\x9b\xb4\xd2\xb2\x19\x35\x04\xb1\x63\x41\x33\x3a\x41\xd9\x39\xca\xe5\x1f\x0f\xca\x1e\x0b\xd0\xd8\xc7\xd1\x12\x9e\x02\x5d\xe5\xb0\xa7\x76\xc4\xa9\xa9\x26\xeb\xb0\x4f\xc0\x17\x76\x9f\x06\xbe\xc0\xb2\x88\xb0\x17\x10\x8f\xbd\xd0\xef\x2b\xf9\xa7\xf4\x14\xa5\x59\x94\xc4\x1c\xca\x40\x1d\xbd\xa0\x4a\x72\x9c\xa7\x24\x7e\x95\x6c\x82\x02\x34\x86\xf8\xf2\x20\xde\x89\xa3\xfc\xe1\x38\x0c\x55\xce\x47\x22\x30\x2c\xc2\x42\xc8\xb9\x38\x7f\x7f\x9e\xa6\x28\xce\xf1\x16\xbb\x49\x1e\x78\x39\x20\x86\x66\x78\xf7\x61\x4d\x81\x3b\x1b\x25\x7f\x4c\xe6\xa9\x24\xff\x42\xc3\x7a\x45\xd8\xa1\xbf\xc8\xa5\x7b\x11\x39\x53\x8d\x39\x4f\xa2\x2f\x51\x7e\xd5\x8e\x6f\x4c\xd1\x04\x79\x19\x92\x7a\x27\xef\xd2\x7e\x51\x76\x73\x20\x7e\x91\x15\xe9\x03\x92\xbc\x14\x49\x73\x72\xf6\x20\xef\xcd\x28\xa7\x61\xd7\xa7\x7b\x52\x71\xbb\x40\xdf\xb4\xc7\x68\x92\xe0\xc3\x1f\x79\x45\x8e\xb2\xce\x4a\x15\xe9\x63\x32\xa7\xfe\xf8\x51\x9c\xe5\xde\x64\xb2\xa4\xb4\x4e\xe9\x3b\xe5\xc6\xb9\xf0\xb2\x13\xc5\x73\x44\x7b\x80\xf6\x07\x61\xd0\x4e\xa8\xab\xfb\x6a\x1d\xca\x84\xf5\x6e\x25\xb2\x76\x33\x27\x79\xfa\xc0\x83\x67\x1f\xae\x29\x45\x78\x78\xc9\x4f\x07\xc7\x52\x84\x57\x21\xe6\x4c\x10\xfb\x88\x7c\xed\xcd\x66\x69\x32\x4b\x23\xdc\x3a\xbe\xa5\x57\x5e\x26\x8d\x11\x8a\x8b\x8e\x40\x81\x22\xb3\x59\xf5\x8d\x86\x64\x1f\xd0\x55\x8d\xe0\x87\x1c\x52\x3d\x1a\x70\xf1\xdd\x82\x9f\x6b\x91\xcd\xf8\xfb\x36\xe6\xc0\xc1\xf1\x05\xb1\x0c\x8f\x69\x82\x9d\xe9\x2c\x49\xf3\xed\x68\x82\xb6\xbd\x68\x32\x4f\x1b\x28\x05\x9b\x07\xfb\xdb\x3b\x6f\x2e\xb6\x77\x76\x47\x17\x3b\x7b\x87\x07\x47\x27\x17\xa3\xa3\xa3\x83\xa3\x66\xe6\xe3\x39\x71\x6b\x5b\x96\x79\xb4\x05\x04\xc6\xd3\x00\x01\xe1\x02\x3e\xa8\xe2\xfc\xf9\x8e\x23\x5e\x74\xd2\x18\x2b\x41\xd9\xe5\xa5\x63\xc5\x95\x77\x8d\x24\x6f\x92\x22\x2f\xb8\x95\x22\x22\x1f\x0a\xf0\x51\x25\x4f\x0a\xb0\x00\x45\xda\x09\xa5\x18\x2b\xc9\x74\xe6\xe5\x11\xd1\xed\xa2\x6c\x12\xeb\x8b\x32\x14\xe7\x80\xe5\x96\x92\x18\xd5\xb2\x93\x8b\x8c\x4a\x21\x8e\x98\x42\xb0\x03\x8a\x0c\x3a\x4c\x9f\x01\x9d\xca\xa5\x37\x47\x29\x7a\x11\x9c\xe2\x27\xf1\x35\x22\xd2\xe6\x49\xbd\xc5\xdf\x43\x0f\xa3\xac\x52\xb8\x20\x89\x91\x22\xdf\x37\x00\x00\x04\xea\xd4\x09\x45\xf0\x2d\xf0\x99\x26\x36\x97\xbc\xaa\xd4\x4b\x94\x93\x02\xb7\xd3\x64\x7a\x9c\x27\x29\x0a\xd8\x0e\xb8\x38\xae\x9e\x69\xc2\xa2\xa8\x7a\x7c\x18\x19\x0e\x87\xe8\xee\x4e\x18\x61\xff\x00\x44\x85\x69\x54\x44\x8b\x1f\x44\xca\x9c\x8b\x16\x5f\x2d\x88\xfb\x71\x61\xdb\x49\xb6\x46\xc6\x67\x79\xdc\xb6\x46\xe3\xb6\x21\x5c\x1c\xb8\x2d\x0a\xca\x1e\xa3\xbb\xbb\xde\xb8\x70\x34\x4b\xb2\x62\x9e\x54\x01\xd9\xbe\xa1\x05\x01\x72\x74\x64\x41\xd7\x32\x8d\xd0\xd5\x75\xcd\x0d\x34\xd7\x08\x02\xc7\x08\x03\xd3\x32\x3d\x15\x79\x16\x0b\x18\x71\xa0\xab\xeb\xba\x65\x3b\x8e\x69\x18\xba\x61\xeb\x9a\x3d\xc0\x9a\x46\x06\x8b\x2e\xb3\xdc\x22\xbd\xb2\x6f\x1c\x1f\xb0\xbd\x83\x45\xde\x69\x89\xfc\xc9\xc9\xa4\x6b\xba\xc4\x4b\x31\x67\xa5\x32\x3f\xbe\xb1\xad\x9a\xd0\x1f\xab\xaa\x13\x84\xb6\x1e\x04\x56\xa0\xaa\x30\x30\x54\xd7\x0a\xa0\xa6\x39\xda\xd8\x09\xc6\x06\x2a\x42\xf2\x0c\x4b\xd7\x5d\xd5\x74\x4c\xcd\xd2\x2c\x1d\x5a\xa6\xfa\xc8\x78\xed\x5d\x2c\xec\xee\x03\x85\xf5\x1c\xdf\x31\x90\x19\x7a\x86\x09\x75\xa8\xab\xa6\xea\x22\xd7\xd5\xa0\xef\xe9\x76\xa0\xea\x21\x34\xcd\x30\xd0\x3d\x36\x40\x86\x6d\xe8\x06\xb4\x0c\xd7\xd5\x1d\xe8\x1a\x9a\xe3\x3e\x24\xb2\x84\x0f\xeb\x3e\xc4\xc2\x1e\x16\xc2\x16\xe0\x18\x52\x92\xd1\x25\x22\xa4\x2b\xbf\x40\x60\x33\x70\x5c\x14\x06\xa6\xaf\x05\x8e\xee\x40\xcf\xf5\x02\xc3\x76\x55\xcb\x41\xa1\xe6\x60\x2d\x71\xbd\xb1\xa3\x7b\xcc\x4b\x12\x3a\x9a\xe3\x40\xa8\x6b\xb6\xe1\xba\x96\x6d\xa8\x5d\xd1\x6e\x42\x81\x57\xf4\x3f\xaa\xde\x4f\x16\x3d\xb4\x7d\x0f\xbf\x25\xe2\xac\x84\x0f\x03\x6c\xbe\xca\xe7\xa0\xea\xd2\x5b\xdc\xa5\xb7\xad\xf1\xe7\x1c\x39\x6d\x4f\x1d\x87\x70\x1c\x04\x96\xa9\x7b\x86\xa5\x86\x86\x15\x86\x3a\x1c\xdb\xfe\x18\x39\xa6\xae\x87\x41\xe0\xab\xbe\xed\xb1\xd4\xae\xad\xdb\xae\xea\xaa\xba\x6e\x39\x96\xa6\x6a\x7a\x87\x66\xfe\xdf\x0e\x95\x87\xed\x6f\x04\x1e\xe3\x2d\x3f\x3f\xb8\xdc\x17\xf0\x7b\x7a\xa8\x43\x61\x2a\x4e\xd5\xff\x1d\xfc\x57\xca\xeb\x45\xc1\x9b\x68\xf9\x5b\xfd\x81\xfe\x49\x2e\x2c\x2b\xf9\x55\x15\x13\x2d\x13\x79\x56\xb1\x44\x6b\xe3\x3c\x7e\x9c\x67\x55\x59\xfa\x8f\xf5\xad\x5a\xf1\x85\xf8\x87\x3a\xdb\x2d\x7e\x5b\xae\xb9\xdb\x61\x1b\xe3\x01\x0e\x82\x0f\xf2\xed\x8b\xff\x16\x67\xbe\x47\x7b\x47\x3d\x54\x5f\x9e\xe4\x07\xf7\x94\x27\xfb\x51\x04\xec\xc6\x93\x3d\x85\x98\xdf\x14\xff\xa0\x83\x3f\x23\xee\x91\x5f\x2b\x2f\xbf\x0c\xfa\x26\xae\x97\xb7\x9e\x26\x7b\xc1\xdf\xd8\x4d\x7a\x16\x5e\xac\x6e\x63\x5f\x16\x5e\x7a\x0a\xb9\x00\x41\x75\xc5\xed\xb4\xd8\x00\x5d\xc0\xa1\x9f\x77\xa1\xed\xc2\x1a\xda\x6e\xe5\x16\x00\x35\x70\xb4\x08\xd9\xdb\x11\xdc\x2f\x0a\x9f\xf6\x0b\x3a\x40\x77\xb5\x17\xf7\x24\x3e\x20\xb7\x83\xd9\x31\x3b\xca\x15\x0f\xee\x44\x58\xa3\xba\x3c\x84\xdc\x00\x99\xe0\x38\x12\x31\x09\x42\x11\xaa\xf6\x02\x92\x89\xc2\x4b\x60\x11\x93\xa0\x53\x63\x12\x8c\xab\xf3\xe0\x0a\x44\x82\xa4\x7c\xb7\x9a\x8c\x35\x37\x84\xae\x0b\xec\xbc\xc4\x5b\x63\x67\xc8\x3a\xfb\xa8\x0a\xc6\x51\x93\x7e\x14\x0a\x3c\x47\x34\x08\x76\x22\x9e\x7f\xf4\x7b\x3e\xe6\xab\xc3\x61\x2f\x9e\x4f\x26\xc3\x61\x5e\x1e\x31\x5f\xe1\x2f\x06\xd5\x67\x06\x98\xd9\x7f\xf9\x32\x5f\xf5\xc9\xa7\xc3\x71\xa0\xe0\xd7\x6c\x5c\x05\x08\x0b\xee\x7e\x28\x79\xa4\x57\xc2\xec\xf7\x53\xdc\x4d\x13\xff\xcf\x9e\x05\x5c\x42\xbc\x5d\xdc\x91\x55\xde\x06\x15\x02\xb3\xc5\x79\x27\x34\x5f\xf4\x59\xcf\x94\xb9\x96\x31\x9b\x17\x3d\x59\x26\x33\x9b\xe2\xbf\xc8\x0b\xd8\xcc\x83\xac\x68\xf8\xa2\xc6\xb6\x13\xaf\xee\x1e\xc0\xde\xf8\x97\xd2\x86\xd7\x5e\xfc\x0b\xc7\x81\x15\x1e\xff\x79\x92\xef\x59\x34\xc3\xd2\xe0\xba\xaf\xf9\x87\xfe\xe2\xf0\x20\x7a\x01\x66\x5a\x32\xa0\xc1\x11\x6b\xe3\x49\xe2\x7f\xba\x57\x38\x2b\x46\x94\xa9\xfe\x6a\xbd\x2e\x2a\xa3\xe4\xda\x56\xd5\x7f\xae\x5f\x63\xdb\xd2\xf7\x26\x6b\xde\x24\xba\x8c\x07\x79\x32\x5b\xf7\x93\x49\x92\x0e\xfe\x43\x55\x6d\xcd\xd3\xd7\x67\x6c\x67\x1c\xa4\x68\xe2\xe1\x4e\x5d\xcf\x93\xd9\xc0\x70\x66\x37\x35\x59\x7e\xec\xd3\x3b\xd9\xc2\x45\x85\x5f\x47\x59\x34\x8e\x26\x51\x7e\x3b\xa0\x89\xb8\x77\xf2\x43\xf2\x4e\xae\xe9\x0e\x79\x47\x25\x1f\x6c\x15\x5a\x76\x1f\x7c\x26\x1f\xa0\x6d\xe8\x4e\x1f\x7c\x5a\xf4\xe0\xd1\xff\x56\x31\x77\xf6\xfa\xdf\x8a\xe7\x0c\x54\x40\xf5\xa2\x34\x0a\x23\x14\x9c\x5c\xcd\xa7\xe3\x59\x1a\xc5\xf9\x30\x46\x5f\xa4\xdb\x5c\xb9\x9e\xf1\xcf\x14\x68\x85\x67\x0a\x0a\xc0\x79\x95\x7c\x19\xbe\x80\x15\x32\x2e\x36\xc2\x17\xa6\xad\xa0\x46\x99\x05\x24\x4e\xdc\x96\x54\x41\xd3\x28\xef\xbd\x80\x05\xf4\x67\xa3\xe6\xe2\x8e\xfc\x75\x1e\xbf\xf5\xe2\x60\x82\xb7\xa3\x07\x16\xad\x36\x8b\x3e\xa7\x23\xf3\x63\xef\xd1\xb2\x6c\xb2\x96\x97\xa2\xac\x4d\x93\xc0\x9b\xc8\xe7\xe7\x80\xb8\xa3\x64\x83\x6f\xd5\x6f\x03\xb9\xfa\x5b\x06\xd7\x3e\xb9\xa1\x7c\x9b\x64\xf9\x40\xe6\x3e\xc8\xf7\x20\x99\xe7\x34\x6f\xbb\xa9\x03\xb9\xfd\x9d\x7c\xcf\x6e\xe8\xa0\x45\x6f\xe8\x8c\xe2\x82\x8e\x5c\x62\xf8\x93\x74\x0f\x0b\x45\x0e\x58\xd5\x47\x6c\xca\x7a\xe3\x09\x92\xeb\x29\x36\xcb\xf3\x13\x04\x32\x69\x4c\x19\x89\x54\x7d\x33\x4e\x82\xdb\xda\x17\x61\x92\xe4\x75\xef\xeb\xd2\x7e\xfe\x84\x6e\xc7\x89\x97\x06\xbb\x04\x7f\xbc\x72\x18\xa6\xc7\xa2\x71\x1e\xaf\xcd\xd2\x68\xea\xa5\xb7\x58\x10\xa6\x04\xf4\xcc\x54\xb3\xad\x1b\xc5\xd6\x0a\x48\xe6\x39\x89\xe7\xe2\x72\x9c\xaf\x6a\xbc\x62\x23\x80\x8e\x19\xb3\x60\x99\x71\xd1\xea\x11\x11\x98\x76\x4e\x75\x0d\xdd\xf3\xaf\xb5\x57\x7a\x61\xda\x32\xce\x9c\x53\x3c\x62\xb7\xd2\xf1\xf1\xae\xc4\x0d\x5a\xdb\xd2\xd1\x45\xe6\xef\xac\x32\xa5\x04\xb4\x43\x56\x99\xa0\x78\xea\xaf\x92\x3b\x0b\x8c\x2a\xb7\x56\x30\x36\x76\x37\xc9\x5d\xfe\x66\xf1\x52\x15\xd1\x97\xa9\x4a\x61\xb1\xb9\x46\xe1\x6c\x92\x54\xda\xf4\x62\x1f\x4d\xc4\x89\xe2\x24\xa7\x09\x95\x85\x56\x5d\x61\xeb\x73\xee\x13\x5a\x35\xbc\xab\x50\xce\xe7\x4a\x7b\xcd\x28\x8d\x5f\xdc\x2a\x1d\xc8\x45\x7b\x04\xbd\x8d\x6d\xe3\xa2\x3a\x73\xb5\xea\xf0\x82\x57\xab\xc1\x04\x32\xed\x8a\xe5\x4c\x66\x9c\xb1\x58\x9f\x90\x54\x87\xfa\x3d\xc1\xc4\x7c\x01\x1b\x96\x0b\x79\x9d\xdf\xc4\x5b\x28\x31\xb6\x6a\x5d\x1f\x26\xa9\x74\x4d\x5f\x3d\x08\xdc\x18\x4a\x25\x5c\x38\xb7\xb2\x00\x59\x6e\x18\x4c\xd4\x71\xb2\x2a\xa4\x69\xcd\x60\x03\x65\x63\x9f\xd8\x18\xbb\x11\xf8\x1c\x29\x6f\x79\x63\x82\x9f\xfa\xa2\xcd\xf2\xaf\x79\x96\x47\xe1\x6d\x71\x06\x1a\x84\x13\x74\xb3\x96\xe5\x5e\x9a\x73\xbb\xe6\x56\x97\x43\xd9\x41\xae\x1c\x1e\x1d\x9c\xee\x6c\x8d\x8e\x2e\x36\x0f\xf6\xf7\x47\x9b\xe4\x86\x6f\x67\xff\x78\xb4\xf9\xfe\x68\x04\xa2\xec\x75\x92\x4c\x90\x17\x0f\x5e\xa8\x20\x40\xa1\x37\x9f\x50\xdc\xf8\xc1\x0b\x58\xf8\x9d\xb1\xa7\x3f\xa9\xc8\x24\x55\x05\xc9\xf7\xa0\x5d\xcf\xd6\xc6\xc9\xc6\x05\x7d\x5b\x2f\x8a\xa8\x5e\xdb\xbb\x9c\xd7\x44\x05\xed\x1c\x5e\x6c\x6f\xec\xed\xec\x7e\xac\x4b\x36\xce\x95\xc3\x48\xd9\x39\xbc\x36\x8a\x57\x96\xed\x89\x77\x39\x90\xd9\x5b\xcc\xce\xe1\xb5\x25\x17\x15\xef\x1c\x4a\xb4\x08\xa1\xa4\xc7\xc7\x6f\x2f\xde\x8d\x3e\x8a\x9c\xed\x8e\x8f\xdf\x4a\x87\xef\x5f\xef\xee\x6c\x4a\xef\x46\x0b\x73\x93\xb7\x50\x10\x24\xfb\x49\xbe\x31\xcf\x93\x63\xef\x1a\x75\xb4\xe7\xe4\xed\xfb\xbd\xd7\x87\x47\x3b\xfb\x27\x55\x2d\xbb\x52\xf5\xad\xb0\x96\xf7\xc7\xa3\x23\x8a\x81\x2d\x90\x12\xff\x88\x7f\xeb\xce\x79\xb8\x71\x7c\xfc\xe1\xe0\x68\xab\x96\x7b\xea\x65\x9f\xb8\x52\x8a\x34\xc2\x52\x4e\x99\x97\xc4\xc6\xd6\xd6\xd1\xe8\xf8\x58\x24\x05\x4b\x22\x1d\x8f\x8e\x4e\x47\x47\xf2\xfd\xf9\x3d\xf8\x42\x8c\x35\xc3\xd4\x54\xbd\x0f\x6e\xa8\xe5\x66\xa8\x86\xcb\xb9\x9d\xbc\x59\x44\x37\x67\xb6\x39\xc8\x4c\xd8\x72\x08\x33\xb5\xd6\xb2\x6f\xea\x62\x87\x30\x73\x91\x43\x98\xc9\xc7\x2f\x98\xd6\x6a\x5e\x74\x95\x8b\xce\xe9\x83\x7c\xdd\xcc\x36\xd9\xe5\x13\x9b\x26\x88\x83\xe8\x68\xda\x4a\xe1\x01\x9c\xaf\x9b\xa5\xfe\x0d\xbe\x6e\x4d\xe2\xa3\x1f\xe4\xeb\xf6\x7e\x01\x5d\x6e\xeb\xa2\xc9\xaa\x79\x71\x56\xae\x6d\xcc\x18\x91\x4e\xae\xa2\x4c\xf2\xaf\x92\xc8\x47\x52\x10\xf9\xb9\x97\xa3\x8c\xbd\xe1\x33\x90\x97\x9d\xc3\x02\xc4\x8e\xf8\x36\x50\x0e\x0b\x44\x43\x26\x28\x12\x05\x43\x17\x4a\x51\x56\xfa\xb0\x14\x6e\x23\xa9\x22\x8c\x9a\xe0\x74\x6e\x6f\x41\x6b\x52\x2f\x88\x12\xfe\x46\xca\xd2\xf8\xd6\x34\x62\x46\x70\x73\x98\x4f\x06\x16\x01\xcb\xed\x4d\xa3\xc9\x6d\x1d\x98\x16\x37\x97\xb9\x24\xd5\x98\x57\xc5\x64\x5a\xfc\xf0\xba\xe5\x65\x90\x09\xde\x2f\x62\x2a\x6f\x86\xe9\x34\x6d\xb4\xaa\x69\xb5\x20\x9b\x3a\x7d\xb9\xa5\x77\xdc\x4d\xe2\xa6\xba\x40\xc6\xdb\xc6\x42\x93\x4a\x5d\x58\x11\x47\xcc\x6a\x19\x35\xa3\xab\x19\x89\xa3\x93\xba\xac\xc5\x36\x4d\x35\x9e\xdb\x62\x0e\x53\x67\x05\x37\x4c\xa6\xab\xab\xd3\xec\xff\xfe\x28\xe2\x68\x4b\x28\xf7\xdb\x47\x95\x25\xa6\xec\xff\xfa\x1d\xc9\xb1\x3f\x7c\x47\x72\xec\x8f\xe2\xb1\x81\x3f\x64\x70\x7e\xeb\x74\xc9\xd5\x8c\xef\x57\xdf\xaa\x3e\xb9\x0f\xa0\x36\xff\xeb\x21\x4e\xb8\x76\xc5\xf0\xfa\x44\x27\xdc\x6b\xe6\x82\xab\xc4\xed\x08\xaa\xc5\x7e\xb8\xef\x16\xb3\xba\x3e\x6c\x4f\xe8\x3a\xb1\x2c\xee\x64\x2a\xe0\xc9\x15\xf1\x14\xc3\xb5\x64\x78\x27\xf0\x62\xc9\x50\x5d\x6b\x6d\x1c\xe5\xd2\xf1\xf1\xdb\x35\x4d\x3a\x3a\xde\x90\x08\xef\x90\x2f\x7d\x42\xb7\x52\x98\x26\x53\xc9\x23\x7f\xce\xbc\x28\x6d\x78\xca\x51\xd7\xaf\x40\x91\x36\x26\x93\xe4\x4b\x86\x8b\x28\x90\x80\x70\x57\x08\x87\x14\x54\x1e\xa7\x71\x12\xe0\x6d\x2a\x23\x40\x60\x92\xef\xcd\xae\x95\x7a\xbf\xfd\xa3\x63\x6a\x51\x83\xc3\xae\x4e\xed\x10\x50\x33\x9a\x0a\xfe\x0e\xdd\x76\xbc\x56\x50\x1f\xe6\xd7\xd1\xf0\x6c\x91\xe1\x29\x36\x8a\x3b\x0d\xde\x73\xf0\xc7\x13\x19\xe9\x40\x0c\x22\x9a\x2f\x11\x79\x46\x27\x0d\xcf\x68\x11\x27\x5d\xa2\x78\xb3\x68\x73\x12\xa1\x38\x1f\xc6\x20\x51\xd2\x64\x9e\xa3\x74\x18\x81\x44\xd9\x38\x3c\xbc\x38\x3a\x78\x7f\x32\x3a\x1e\x9e\xe4\xca\xef\x20\x29\xae\xc5\x87\x2f\x20\x48\xf0\xa9\x3c\x26\x2f\x51\xf4\x23\xfb\xed\x18\x1b\x1a\xc3\x4f\x58\x85\x4c\x65\x6b\xb4\xbd\xf1\x7e\xf7\x04\x24\x0a\xf3\x62\xfc\x10\xe5\x57\xef\x9c\xf2\x54\x4c\x73\xb2\x53\x11\x7b\x2c\x18\xca\x32\x48\x14\x44\xa3\x38\x87\xb7\x91\x72\x78\xa9\x9c\x6c\x8e\xf0\x77\xc4\x23\x78\x67\x76\x6d\xd1\x7c\xd9\x7c\x86\x9b\x91\xa1\xa0\x22\x7f\xc9\xc8\x45\xe9\x9e\x37\x03\x89\x12\x46\x13\x74\x84\xbc\x00\xa5\xe4\xcb\xed\xf2\x23\x48\x44\xae\xde\xfe\x3c\xcb\x93\x69\xf4\x15\x6d\x93\x77\xce\x45\xfe\xde\xaf\x23\x25\x4c\xd2\x91\xe7\x5f\x35\x1c\xcb\xab\x10\xc3\x4b\x94\xf7\xf2\x3e\x8d\x34\xa4\x37\x4b\x99\x32\x8b\x66\xa8\xd7\x53\xc1\x38\x55\xc6\xfd\x9e\xa9\xaa\x7d\xd0\x53\xc1\x4e\xaa\xdc\xf4\x7b\xe4\xcf\xe3\x54\x39\xea\xf7\x50\x8d\xbd\xae\x2f\xf2\x62\x4f\x0b\xab\x13\x89\x7b\x81\x55\xbf\x9e\xbe\x18\x0e\xe3\x97\x2f\x7b\x5d\xc9\x32\x9c\x0c\xeb\x0a\x52\x82\x28\x63\x23\xda\xcb\x87\xc3\x61\xa7\xd6\xbe\x92\xab\x94\x51\x7c\x29\x05\x73\xe2\xa4\x5d\xa2\xdd\xb1\x47\xcc\x81\x38\x19\xfd\x55\x22\x7e\xbc\x74\x91\x20\x97\x02\x92\xfc\x4b\xfe\x8b\x2c\xd1\x3e\xa7\x1c\x3f\x6b\x6b\xff\x73\xa3\x23\xf9\x97\xb4\xdf\xbf\xef\xdf\xb3\x2b\xdf\x7a\xff\x76\x1c\xe9\x1b\xbd\xde\x15\x04\x90\xc4\x95\xff\x28\x4d\xdb\xcb\xcb\x8a\x2a\x5d\x7b\xf9\x92\x71\xd1\x5d\x46\x78\xf1\x39\x88\x4f\xab\xc2\x7b\xe2\xbb\x00\xbe\x9e\xfc\xc5\x70\x88\x94\x68\xb6\x4d\x2c\xd6\x97\x2f\x7b\xab\x73\xb5\x95\x05\x32\xff\x7f\x30\x2b\xbc\xb1\xef\x1b\x03\xd6\xe8\xeb\x31\xf2\xbd\x79\x11\xdd\x2c\xb5\x05\x64\xa3\x10\xd0\xfe\xc6\xc3\x22\xff\x92\xe3\x6e\x5e\x12\x99\xf0\xfa\x68\x63\x7f\x6b\x67\xff\x8d\x30\x1e\x01\x95\x73\xb6\x0c\x3f\x28\xbe\x59\x54\x30\xed\x6d\xac\x0e\x78\x7e\xee\x30\xd7\xe9\x46\xc9\xec\x72\x85\x4f\x51\x5c\x04\x6e\x45\xfd\x5e\xde\xec\x8e\x2d\x91\xea\xe1\xe5\x80\x79\x57\xcb\xe5\x38\x17\xc3\xba\xd5\xac\x81\xa0\xc4\x14\x95\x88\x84\x24\x09\x0a\xb5\x2c\x97\x16\x25\x89\x71\xcb\x6b\xef\x0e\x79\x7a\x5b\xda\x09\xb9\x97\x5e\xa2\x5c\xa1\xb8\x79\xeb\xcd\x05\x43\x70\x77\xc3\xf1\x24\xa6\xfd\x7b\xdf\xcb\xfd\x2b\x3c\xfb\xd9\xfa\x75\x9d\x44\x01\xde\x98\xb3\x64\x82\xe8\x29\xb3\x27\x13\xc1\xa4\x14\x51\x17\x10\xbc\xbd\x91\x0d\x39\x9a\x90\x99\x95\x92\x51\xf0\x2e\x51\xff\x7e\x85\xda\xc9\xcd\x11\x27\x82\x2c\x17\x04\x9b\xd5\x7c\xd8\x61\xba\x2d\x98\x12\xcd\x0d\xf2\xec\x38\x57\x3e\xed\x28\xc5\x06\xcb\x1e\xbb\x9a\xbb\x92\x12\x65\xa7\xf8\xbb\x9d\xd9\x41\xba\xfd\x39\x88\x7b\xfd\xf3\x07\xe7\xbc\xb6\xca\xbc\x95\x8b\xf6\x82\x57\xb2\x07\x46\xf0\x34\xd6\x88\x21\x51\x6f\x6f\x36\xdb\xaa\x68\x43\x95\x28\x3b\x9c\xcc\x2f\xa3\x78\x9b\xde\x00\x6e\xf8\x79\x74\x8d\xad\x9e\xde\x55\xae\xec\x8d\x40\xed\x32\x90\x4d\x10\x6c\xcf\xe0\x22\xf0\x0e\x54\x14\x33\x9e\x47\x93\x00\x7f\xd1\xab\xaf\x80\x54\x86\x2f\xd1\x57\x2f\x0d\xf6\xb1\xed\x58\xfe\x4c\x3e\x6d\x45\x4c\xca\xc6\xe3\xfa\x70\x09\xbd\x1d\x49\xb5\xe7\xcd\x7a\x65\x01\x84\x83\x93\xcd\x0f\x5a\x46\xf5\xdb\x0a\xea\x4b\xc1\x17\x50\xef\x1b\x9a\x46\x39\x71\xf3\x1f\xbc\x80\x0f\x5c\xcf\x17\x96\x11\x78\xb9\x47\x2f\xbf\x09\xa9\x2e\x0b\x10\xe0\xf6\xf2\x1e\x47\x83\x57\x2e\x0c\x9d\x64\xa0\xa5\x59\x83\xb7\xcd\x97\x2f\x8b\xc9\x35\x49\x2e\x7b\xc5\xf3\x6c\xcd\xf2\xe1\x39\x39\x85\xc6\x4f\xa3\xa1\x53\x2f\xfd\xb4\x91\x1d\xa2\x38\x20\xa8\x19\xdd\x6d\xc0\x8d\x4e\xa7\x25\xf9\xa9\xb0\x67\x68\xca\x9c\xfa\x6c\x36\xb8\x35\xd9\x7c\xe4\xf8\x50\x2f\x51\x7e\xe8\xa5\x19\x0a\x4e\x4b\x8b\x4b\xd4\x0d\xd4\xda\x3c\x8c\x18\xf7\x29\x02\xf2\x40\x2e\x1e\x57\xbf\x31\x37\xf3\x41\x7e\xa6\x9e\x03\xa2\x9b\x83\xfc\x0c\x9e\xdf\xdd\xc9\x2a\x1f\xdb\x71\x85\xfc\x4f\xac\x96\xcd\x32\xe0\xa5\xbb\xb2\x33\x0b\xd8\x40\x3d\x07\x29\x57\xad\xc2\xaa\x02\xb2\x42\x1c\xcb\x5f\xa8\x4c\x06\xd9\x52\x6c\x45\x95\x87\x78\x63\x65\x69\x5e\x1d\x46\x4a\x9e\xec\xcf\xa7\x63\x94\xf6\xd8\x9c\xe9\xff\xf7\x10\x1a\xba\x65\xdb\xba\x3d\xe8\xf1\xbf\xa7\x67\xea\x79\xff\xbf\x87\xf6\xdd\x5d\xda\x36\xe3\x10\x48\xfb\xdf\x6a\xa5\xf5\xff\xbf\xfc\x2c\x3d\x7f\xf9\xb2\x87\xcd\x55\xbc\x71\xc4\x7d\xfe\x35\x1b\x6b\xc2\xe9\xe6\x62\x7b\xb1\x53\x47\x76\x0f\x36\xf0\x86\xca\x96\x33\xda\x5f\x6f\x93\x2c\xef\x20\x61\xec\x5a\x58\xfb\xa0\xd3\x22\x5d\x64\xf7\xa1\x46\x0d\xd4\x06\x58\x52\xb5\xe0\x8d\xa6\xff\x8a\x35\xf0\x32\x8a\x7b\x8c\xbb\x97\x3c\x5f\xdf\x56\xef\xa0\xdc\x24\x6c\xfe\xb4\x42\xdf\x95\x67\x14\x2c\x18\xd3\x2b\xae\xec\x6f\x57\x49\x96\x0f\x9a\x9d\x78\xdf\x2f\x2d\xee\x23\x62\x63\xb7\x2f\x86\xd1\xa2\x99\x7b\xcf\xd9\xe4\x2d\x52\x69\xa1\x59\x9e\x57\x17\x02\xd5\x63\xdb\x7a\xae\x44\x71\x86\xfc\x79\x8a\x5e\xf5\x50\xd1\x4b\x80\x5f\x58\xe4\x22\xc8\x6b\x87\x25\x94\x32\x94\x4b\x79\x3a\x47\xd2\x75\xe4\x49\xa5\x41\x58\x3c\x6f\xa1\xf8\x3a\x4a\x93\x98\xc4\x16\x5e\x7b\x69\x84\x17\x47\x45\x7a\x7d\x8b\x8d\x70\x02\xd2\x5b\x3d\x17\x52\x37\x02\x7a\xeb\x2c\x91\x97\x3c\x45\xee\xf7\x07\x3d\xc4\x49\x38\x4c\x01\x6f\x0b\xb0\xcb\xa7\xec\x4c\xfc\x32\x74\xce\x5b\x24\x00\x29\x59\x36\xa9\x86\x82\x1c\xed\x94\x64\x86\x62\xbc\xf0\x00\x51\xcf\x10\x33\xa5\xb0\x42\xee\xee\xf2\xea\xcf\xdf\x8e\x0f\xf6\x95\x8c\x04\x54\x46\xe1\x2d\x3e\xbf\x20\xc1\x3d\xbd\xbc\xed\x45\x13\x1a\xaf\xc6\xa6\x5f\x71\x77\x90\x11\x7e\xcd\x08\x1b\xb6\xb5\x07\x52\x45\x92\x0b\xca\xd8\xb4\xcf\x85\x6c\xe5\x75\xb1\x8f\x50\x36\x4b\x62\x81\xaf\x0b\xea\x7f\x43\x02\x15\x17\x88\xb6\xc9\xac\xce\x24\x26\xe1\x2d\x28\x50\xa4\x8e\x67\xdc\x2f\x1e\xf7\x84\x4e\x2e\x43\x64\x8e\x05\xfa\x32\x5a\xcc\xcf\xba\xe2\x8a\x52\x4d\x1b\x3c\x64\x54\xc7\x46\x71\x40\x1c\xa0\x7a\xdf\xfc\x14\x05\x28\xce\x23\x6f\x92\x0d\xbe\x15\x98\xea\x83\xc6\x76\x25\x54\x86\xf2\x72\xe3\x9c\x1e\xb5\x40\x71\xfa\x5b\x3d\x77\x79\x09\xc2\x4a\xa8\x66\xf0\x92\xdc\x8d\xa5\xaf\xc8\x5f\x4c\xb1\x95\xca\x10\xac\x61\x45\x39\x9c\x1b\x0f\xdd\x5b\xcb\xcf\xf7\x7f\xdb\x7a\xc2\x78\xe3\x77\xb1\x1a\xb0\x10\x57\x3e\xc4\xb6\x3d\xa9\x7a\x6c\x56\xbd\x6a\xcc\xae\x41\x3c\x9f\x4c\xfa\xff\xd2\x39\x56\x6f\x46\xb7\x05\x50\xec\x3a\x4d\x03\xa5\xb2\x03\xfa\x80\xf1\x2a\x8b\x8d\x0b\xdc\x94\xae\x69\x29\xb7\xec\x36\xb5\xb6\xe5\x16\x57\x4f\x79\x69\x73\x50\xd3\xd9\xcb\x0e\x3d\xdc\x5a\x7f\x88\xb8\x0f\x40\x64\xed\x67\xe5\xbe\xc4\x0a\xeb\xe5\x95\xe0\x2b\x58\x69\x20\x7d\xf9\xf2\x05\x36\x7e\x72\x2f\xcd\x29\xf7\xb0\x40\x42\x20\x5b\x72\x9f\xdd\x48\xb0\xc3\xf5\x8b\x61\x75\x49\xf6\xaa\xf4\x8b\x3b\x6d\xdd\xb7\xf5\xfa\x83\xf4\xee\x8e\x9e\xdd\xc8\x1d\x9f\x12\x7b\xd7\xd1\xa5\x97\xa3\xde\x19\xf9\xb6\xba\xee\x53\x76\xf6\x37\x0f\xf6\x0e\x37\x4e\x76\x5e\xef\x8e\xce\xcb\x93\x32\x75\xb6\xde\xaa\x4c\xd5\x5e\xeb\x5c\xbf\xe0\x36\xe3\x74\xf3\x62\xe3\xfd\xc9\xdb\xd1\xfe\xc9\xce\xe6\xc6\xc9\x68\xab\xba\xcd\x78\x98\xa9\x73\xdf\x07\xf2\x2d\xca\xb0\xf9\xd7\x18\xa4\x57\xac\xc7\x68\xd3\x49\xa3\x4f\xa2\x7c\x82\x86\xe5\xf6\x5a\xaa\xa8\xb0\x6b\x79\xe0\x82\x2d\x82\x39\x40\xee\x80\x5b\x85\xbe\x4e\x82\x5b\x02\x91\xc0\x2e\xb3\x0b\xad\xa2\x11\xd4\x0f\xae\xeb\x7f\x62\x69\xc9\xff\xf1\xdb\x3d\xb9\x48\x8f\x62\x7f\x32\x27\x77\xe0\xb1\x14\xc5\x39\xba\xa4\x74\x02\x62\x4e\xe9\x82\x93\xf0\xcb\x55\xe4\x5f\x49\x78\x99\xca\x24\x6f\x79\xa5\x45\x3b\x8a\x4b\x77\x12\x8c\xee\x49\xb3\x89\x97\xe3\xd5\x95\x3c\xba\xa6\xf3\x98\xe0\x90\x72\x55\x7e\x49\xd2\x4f\x78\x58\xc9\xe3\x71\x80\x02\xb2\xf1\x05\x65\x24\xca\xf2\x7a\x67\x49\x32\xc9\x14\x69\x93\x91\xdd\xe0\xe2\x17\xb7\x2b\xca\x48\x68\xb9\x94\x5f\xa5\xc9\xfc\xf2\x8a\xac\x52\x85\xf0\x6f\x4f\xf6\x76\x4d\x89\xed\x81\xc4\xee\x79\xa2\x8a\x8c\xb8\xa1\xf8\xe1\x3a\xc2\x8d\xfb\xf2\x7e\xa3\xc3\x1b\x24\x88\xda\x15\xa4\xda\xa2\x1e\x4e\xb1\xe9\xa5\x45\xa0\x88\x7e\xe3\xd4\x6a\x79\x7d\x8f\xd3\xbb\x65\x6a\xb5\xbc\xde\xc7\xe9\xdd\x2a\x6a\xb5\xbc\xee\x47\xeb\x5d\xb9\x1d\x0a\x56\xd1\x07\x1f\x7f\x68\x1d\xb5\x75\xb8\x34\x4c\x1e\x78\x5a\x29\xcd\x16\xfe\x32\x3c\x3b\x62\x42\x06\xbd\xfc\xc7\xdb\xf0\x65\x5c\x78\x41\x86\xc2\xdd\x85\xd0\x17\x82\xc7\x99\x1d\xa2\xf6\x2c\x37\x3f\x58\xc0\xa9\xf0\x2a\x6b\xbd\x00\xc4\xec\xf5\x41\xae\xcc\x67\xd8\x6c\x27\xfb\xd5\x46\x1c\x90\x6b\xc7\x28\xbf\x15\x5d\xe8\x78\x69\x0f\x89\xbc\x8a\x11\x79\xf3\xbd\x07\xf2\xaf\x32\x7d\xe2\x4b\x17\x8a\xc1\xdf\xfb\xac\xa7\xa5\x28\xeb\xf4\x21\xa8\x59\xab\x32\xf5\x66\xbd\xee\x4a\x99\xad\x94\x22\x72\xbb\xb7\xf0\x92\x09\x6c\x45\x00\x1b\x5f\xdd\x2d\x4e\xd9\x89\x10\x1f\x64\x92\x34\xeb\x35\x2e\x6b\xcf\xc5\xc3\x52\xf8\x5b\xb7\x87\x24\x0a\x7b\xcd\xe6\x30\x9b\x87\x6f\x20\x0b\x9b\x62\x03\x28\xcb\x85\x79\xc8\xa7\xe9\x46\xf3\xa8\x10\x3c\xd6\xd3\x97\x2f\x53\x82\xee\xf1\xf2\x65\x2f\x1f\xd2\x3f\xfb\x20\x7f\xf9\x72\x75\xe3\x46\x80\xd5\xc4\x3d\xd6\xd4\xd0\x49\xb6\xe8\x5d\x66\x37\xca\xc9\x8b\xc2\x56\xc5\x1a\xb0\x43\x2f\xb4\x7b\xc2\xd3\x57\xff\xee\x6e\xb5\xc4\xc5\x61\x6b\x95\x0c\x2d\x7b\x8b\x8f\xdc\xa8\xf2\x74\x8c\xdb\x8b\xfa\xf1\xab\xcf\x9a\x04\xd7\xb9\x69\x56\xbf\xf4\x45\x65\xdc\x06\x09\x54\x23\xe7\xe1\xea\x24\xec\xcd\x63\xff\x8a\x19\xd6\x1f\xfc\x99\xa0\xd3\xbe\x44\x71\x90\x7c\xa1\x57\x0e\x72\x41\x30\x26\xdc\x58\xa9\x6f\xf4\xaf\xf3\xe8\x57\x6f\x36\xfb\xb5\xd8\x30\xd6\x8a\xad\xe7\x57\xb9\x0f\xe4\x0b\x1a\x2f\xce\xc1\xba\x08\x8d\xe9\xce\x98\x95\x8e\x67\x6e\x95\x9b\x01\xdb\xd1\x84\x3d\x1f\x0a\x3b\x11\x15\x6f\x44\x61\x34\x29\x83\x03\xb1\x66\x36\x1e\x9a\x52\xe4\x05\x1b\xd9\x09\xba\xc9\x7b\xf5\x2c\x67\xea\x79\x1f\x94\x5f\x91\x0a\x86\x32\xd7\xa2\xe0\x36\xf6\xa6\x91\xcf\x9d\x41\x16\xee\x40\xab\x9b\xe6\x80\x44\xe6\x2c\xcb\xc4\xaf\x2c\x2f\xd4\x2a\x68\xe7\xe5\xcb\xfc\x95\x5c\x2c\xee\xf2\x2f\xe8\x17\xb9\xb2\x9a\xe4\x81\xcc\x96\x17\x54\xdb\x66\xe5\x5f\x44\x96\xd3\x2b\xc1\x77\xbf\xc8\x92\x3c\x90\xe5\xfe\x2f\x72\x11\x09\x29\x79\xbe\x9f\xcc\x99\x43\x3d\x31\x05\xaa\x0b\x18\xb2\x28\xbe\x67\x8f\x31\x9d\x71\x52\x7c\xa2\xed\x34\x99\x32\xcf\x76\xf1\xcb\xc9\x16\x8d\x98\x3b\x48\x03\xfa\x68\x59\x20\x00\x4d\x52\x65\xe7\xc1\x91\x4b\xbd\xdb\x5c\xf9\xa8\x5b\xbd\xcf\xb9\x72\x44\x7d\x17\x75\xab\xf7\x25\x52\x26\x87\xe5\xa7\x20\x57\xb6\xd5\xfe\x23\xb1\x82\x8a\x3e\x2a\xb1\x82\xae\x23\xf4\xe5\xf7\x39\x4a\x6f\x1b\x51\x36\x64\xd7\x5a\xef\x15\xc8\x7f\x6f\xc2\xde\xa7\x08\x98\xd4\xad\x88\x7a\xde\x44\x6f\xf6\x7a\xc4\xb7\x68\xf3\xe8\x6d\xaf\x8f\xbf\xcc\x05\x37\x86\xc3\x54\x09\xa3\x34\x23\x81\x09\x5d\xb8\x44\x50\xd5\x69\xd8\x93\xae\x2f\x06\x26\x02\x51\xc9\xed\x31\x07\x19\x98\x89\x80\x8a\x3e\xa3\xbb\xbb\xde\xe7\x02\x48\x45\x44\x28\x38\xd6\x9c\xb1\x6a\x3b\x8e\x67\x3b\x9a\x8f\x90\x15\x58\x81\x6e\x06\xb6\xe9\x8e\x7d\x64\xb8\xb6\xea\xdb\x2a\xd4\x6d\xcf\x2f\x78\xb0\x2d\x03\x42\x13\xaa\xb6\xed\xb8\xb6\xad\xc3\x07\x51\x1d\xf3\x78\x44\x9f\xb0\x64\x9f\x0a\xc9\xc4\x24\xcc\x5a\x18\x6a\xae\x67\x84\xc8\x36\x3d\xd3\x09\x43\x1b\xa2\xc0\x18\x43\xd3\x70\x34\x3b\x0c\x55\x0b\x86\x8e\x1f\xc0\x02\x42\xc9\x74\x5d\xa8\x3b\xb6\xee\xd8\xaa\x6d\x1b\x1a\x7c\x08\x8b\x20\x0f\x3e\xb4\x85\x25\xdb\x2a\x59\xb7\xd9\xbd\xd0\x38\x2f\x60\x86\x0c\xd5\xb3\xc3\x20\x40\xd0\xd6\x75\xcf\x73\xc7\xd6\xd8\xf6\x91\xaa\x8e\x43\x6d\xec\x6a\xb6\x15\x38\x61\x08\xdd\xd0\x2f\x78\x2c\x4d\xd5\xb6\x55\x68\x1a\xaa\xad\xb9\x9a\xa5\x75\x71\x2f\x2f\x85\x19\xfa\x82\xc5\xfa\x52\x88\xc5\x54\x98\x1c\x6b\x92\x79\x4e\x88\xe4\xd8\x11\x81\x07\x1a\xe2\x21\xa9\xa0\x69\xdb\xae\xe9\x05\xaa\xe6\x8e\x2d\x5d\xf3\xb5\xc0\xf7\x0d\x88\x0c\xcd\xb0\x4d\x08\x6d\xdf\x1e\x7b\x61\x88\x0c\x54\x10\xdb\xda\xba\x01\x35\xd5\xb0\xa0\x6a\xbb\xba\x66\xe9\x6a\x03\xb4\x66\x6b\xe7\xb4\x01\x34\x53\x7c\xb3\xa0\x6d\xff\xe1\x34\x31\x66\x7e\x6d\x7f\x55\x75\x40\xc4\x75\xc0\x0d\xee\x80\x1b\x51\x07\x10\x60\xa8\x80\x1d\x53\xa5\x99\x77\x59\x7a\xf1\xd1\xb6\x20\x57\x0b\x90\x31\x0e\xf5\x20\x08\xbd\xd0\x0a\x6c\xdd\xd0\x54\x64\xa0\x30\x30\x8c\xb1\xaa\x07\xb6\x66\x19\xae\x19\x16\x94\xbe\x8e\xe9\xb8\xd0\xd6\x5d\x0b\xaa\xae\x61\xa8\x50\x7d\x08\x69\x66\xc2\x49\xfc\x06\x4b\xfc\x86\x4a\xfc\x9f\x9c\xc4\x5f\xbd\x34\x90\xf0\x9a\x23\x45\x71\x98\x08\x90\xa1\xfc\x00\x9a\x81\xaa\x5b\x26\x32\xad\xd0\x0b\x51\x18\x68\xb6\x0a\x2d\xcb\x85\x96\x61\x98\xa6\x1a\xc2\x70\x6c\xda\xbe\x55\xb0\x7c\x9a\xaa\xea\x68\x9a\xa9\x19\xa6\xae\x5a\x9a\xad\xd9\x83\x0a\x09\x92\xa2\xda\xc9\xec\x2e\x98\x00\x38\xd2\x97\xa9\xda\x16\xc3\x5d\x92\x4b\x63\x14\x26\x29\x92\xa6\xc9\x35\x63\x42\x8c\xd1\x4d\x4e\xe4\x55\xa4\xff\x24\xfc\xa5\x1e\xd7\xc8\x53\xdc\xc8\xd3\xe6\x74\x61\x71\x5a\x3f\x09\xfa\xd5\x84\x93\xf7\x3d\x96\xf7\x7d\xa9\x46\x4c\xce\x82\xc3\x31\x08\x52\x7e\x0d\x32\x3c\xe8\x1a\x01\xc4\xdd\xeb\x6b\x9e\x6f\x18\x66\x68\x1b\xf6\x38\xb4\xf5\xc0\xf7\x03\xd3\x08\x55\xd3\x86\x63\x9f\xb1\x2e\x6b\xa6\x03\x2d\xd7\x51\xa1\x0d\x55\x87\xcc\x1e\xf7\x27\x84\x99\xda\x39\x2c\x82\x20\x0a\x0a\x4e\xb2\x27\xb0\xc0\x87\xc2\x34\x61\x1d\x42\xee\xe1\xa6\x5e\x4c\x70\x58\x6e\x93\x79\x5a\x6a\x4c\x9d\x60\xf9\xef\x25\xad\xfc\x5b\x81\xaa\xbe\x13\x2c\x95\xcf\xe9\xe0\x1e\xd6\xc1\xbd\x45\x3a\xd8\xa6\x28\x46\x6a\x80\x74\xdd\x37\x3d\xdd\xf6\xb1\xe9\x64\x39\x8e\x63\x21\xcf\xd6\x03\x4d\x0b\x9d\xd0\x55\x6d\x07\x6f\x8f\x2e\x53\x5c\xd5\x76\x35\xdb\xb5\x74\x08\x0d\xe8\x9a\x96\x6b\x6a\x83\x66\x3c\x65\xa1\x05\x62\x1a\xe5\x39\x27\xef\x36\x96\x77\x7b\x91\xbc\x34\x96\xb6\x14\xd6\x31\x42\xdf\x0d\x2d\x2b\x44\x76\x18\x8c\x91\xef\xdb\x63\xdf\xd6\x7d\x0f\x19\xde\x18\x9a\xc1\xd8\xf5\x42\x6b\xac\xf9\x6c\xc5\xd5\x5d\xd3\x74\x34\xcb\x74\x54\xdd\x36\x35\xd3\x80\x3a\x1c\x48\x23\x52\x87\xc7\x4a\xae\x2b\xed\xf6\xef\x5b\xfb\x4c\xcc\x8c\x13\xf3\x77\x2c\xe6\xef\x2d\x6b\x47\xc4\xf1\xae\x87\xaa\xe1\xc2\xb1\x67\x5b\xa1\xa3\x19\x56\xa0\x85\x06\x74\x54\x38\xd6\xed\x50\x75\xcc\xb1\xaf\x39\x8e\x3f\x66\xe8\x8c\x50\x83\x9a\xe3\x9a\xae\xed\xaa\xae\xa9\xd9\xae\x63\x59\x03\xa9\xa0\x41\xea\xe8\xbd\x19\x27\xd6\x5b\x2c\xd6\xdb\x42\xac\x82\xce\x48\x20\x16\x0c\x3c\xcb\x43\x7a\x68\x5b\x1a\x54\x43\x4b\xf5\x2d\xd5\xd2\x4d\x5d\x0f\x35\x68\x41\x53\xf7\xf1\x62\x03\x8d\x62\x49\xd4\x34\xcb\x74\xa1\xee\x12\x13\x43\xb7\x5d\xd7\xb5\x07\x52\x59\xba\x58\xac\x15\x61\x00\xf1\xb6\xf4\x23\x30\x00\x09\x35\x15\x8d\x6d\x97\x6b\xbf\xe8\x40\xe6\x77\x08\x8e\x73\x8c\x11\x92\x3e\x8c\xc4\xb0\x8b\x81\x4c\xc4\xfc\x59\x44\x17\x30\xad\x66\x6c\xbe\xf2\x39\x98\xfc\x84\x48\x72\x0b\xf9\xfb\x58\x0b\x36\xe8\x3c\x69\xf1\x68\xed\x1c\x16\x53\x47\x44\x13\xd8\x49\x56\x88\x56\xa8\x79\xde\x45\x16\x36\xaf\xc8\xc2\x72\x11\x59\x98\x80\xab\xb5\x8b\x06\x6c\x56\xd1\x80\x55\x53\xeb\x2b\x9e\x5a\x5f\x9b\x36\x61\xf1\x48\x5e\x9c\xac\xb1\x21\xcc\x6d\xea\x28\x80\x81\xea\x05\x9a\xa7\xe3\x19\x6f\xd9\xaa\x1d\xaa\xee\xd8\xd5\x4c\x6c\xcb\x07\xaa\xed\x20\xa8\x22\x43\x65\xa8\xa6\x9a\x63\xea\x86\x66\xba\xae\xe6\x38\xb6\xe6\xa8\x9a\x6a\x0f\xa4\x7a\xb8\xb0\x74\x3a\x3a\xda\xd9\xde\xd9\x24\xdb\xfb\xbf\x78\x77\x3f\xfe\x14\xcd\x88\x78\x5d\xce\x31\x5f\xae\x50\xcc\x40\xbb\xb1\x79\xc7\x1e\x28\x08\x1c\x78\x6d\x7f\xe7\x5e\x65\x7e\xe8\xe6\xfe\x1f\xba\xd9\xdc\x83\x75\xab\xb5\x91\xb6\xbe\xfa\x2f\xdd\xfe\x81\x9b\x79\x55\x38\x2f\x83\xc9\x61\x4c\xb6\x59\x19\x59\xfc\x93\x1c\x7a\x93\x0c\x2d\x62\x69\x64\xda\x29\x66\x68\xac\x7e\x64\xcb\x28\x57\x43\x0d\xfc\x8e\x5d\xb0\x36\x70\x38\xa4\x53\x6e\xac\x1b\xcb\x28\x90\xa7\xf9\x9a\xa6\x2e\x60\xe0\x05\x0b\x96\x59\x83\x95\x26\x02\x3a\xc1\x9f\x4a\x87\x53\x1a\x8b\xba\x4b\x1d\x44\x64\x42\x8c\xcc\x6e\x82\x4b\xfc\x93\x94\x9b\xc2\x1f\xf0\x14\xfe\x50\x4c\xe1\xea\x56\x9b\x9f\xb1\xae\x61\x5a\x81\xe6\xaa\x8e\xa1\x79\x3e\x0a\xa0\x6b\x58\x01\x74\x5d\xdb\xd5\x90\xee\x23\x43\x1f\xab\x2a\x54\xd5\xb1\xcd\xcc\x09\x1b\xba\x0e\xb4\x6c\x55\x33\x20\x36\xc3\x55\xe7\x67\x34\xc3\xf7\x39\xa3\x9b\x6b\x75\x14\x37\xcd\xb4\x28\x2e\xde\x16\x13\x89\x2c\x89\x2c\x80\x4c\x00\x16\x5b\x42\xeb\xff\x9d\xc6\xb8\xd9\x9a\x76\xa6\xd6\x9a\x3b\xad\xaf\xfe\xcb\xd4\xff\x56\xd4\xd8\xaa\x3a\x5e\x2a\xc8\xcd\x68\x31\x50\x6b\x35\x34\xc2\xf9\xca\xfd\xfc\x54\x8c\xd6\xd5\x4d\x1c\x87\x4b\x8e\x45\x2a\xb6\x6d\x22\x42\x48\xca\xcd\xb2\xab\x8b\x4f\xe8\x96\x9b\xd1\xfc\xc6\xce\xd7\x46\xbf\xe7\x62\xd4\xeb\x52\xc4\xc9\xda\xe5\x3c\x27\x0f\xb8\x55\xae\x1c\xdd\xe4\x5e\x8a\xbc\x1a\x10\x6a\xbb\x73\x4a\x21\x28\x75\x7a\xf5\xb1\x49\xb8\x2a\xb2\xcb\x58\xea\x0b\xf2\xaa\x7a\x31\xcd\x2e\xcb\xb6\x14\xb5\xaf\x82\x87\x8a\xd3\x17\xbe\x87\x25\x06\x6b\x4d\x1c\xbe\x82\x1a\x09\x6e\x36\x1f\x13\x8c\xd6\x9a\x05\xcb\x96\xfd\x30\x22\x23\x5a\x2b\x87\x7e\xd7\x64\x82\x6f\x80\xf8\xb2\x8c\x95\x14\xe3\x34\xf9\x92\xa1\xd7\x22\x1c\xa8\x6c\xea\x4d\x26\xec\xef\x49\x44\x54\x09\xff\x49\x73\xd4\xf1\xa4\x74\x50\x03\xe3\xaa\x01\x70\x01\x11\xc6\x16\xcd\xd3\x81\xa5\xc5\x8c\xd0\x15\x71\xb4\x62\xf2\x5d\x71\xa7\x4e\xf0\x71\x75\x55\x06\x72\x12\x86\x19\xca\xd7\xb0\x81\xab\x89\xe0\xb6\xa2\x85\xdb\x09\x21\x6f\x5b\xd3\x4d\xb5\x01\x9c\x75\x95\xa2\xb0\xe0\x8d\x1d\xfc\xfa\x6b\x90\xf8\x99\x72\x3d\xfd\xe2\xa5\x48\xf1\x93\xe9\xaf\x28\xfe\xf5\x74\x0f\x7f\x5a\x23\x6f\x1d\x6b\x95\xdb\xc3\xda\x9b\x34\x0a\x7e\x25\x98\xc6\x24\x58\x84\x60\x1c\xa7\x97\x08\x77\xd0\x45\x39\x35\x4b\x7d\x9a\x25\xb3\xb5\x64\x9e\x3f\xac\x4e\x66\x3b\xfd\x6a\x2b\xea\xaf\x34\x41\xf9\xd6\xf0\x25\xca\xaf\xd6\xaa\x5b\xda\x5f\xdf\xbc\xdf\xd9\x5a\xdb\x84\x96\x6e\xb8\xea\xe6\xda\xeb\x91\xaa\xaf\x19\x5b\xdb\xa3\x35\x67\x43\xd5\xd7\x4c\x1d\x5a\x5b\xba\x66\x98\xb6\x65\x2e\x12\x76\x09\x6c\x30\x39\xc6\x7d\x77\xa0\xe3\xda\xd9\x66\x29\xbe\x71\xf2\xc3\xd0\x8d\xbd\xbf\x0b\xdd\xb8\x3a\xb2\x72\x2b\x00\x81\xa5\xa0\x93\xe4\x88\xfd\xc9\x99\x78\x2c\x56\x8c\x80\x1b\xb3\x28\x6b\xf2\x7b\x61\x23\x46\xb3\x6b\x43\x6c\xff\x15\x39\xbf\x67\x55\xd6\xf2\xaa\x56\x06\x71\x66\x8f\x4d\x64\xf9\xb8\x2e\xa1\x9c\xbb\x16\x54\x58\x5f\x4a\x17\xa0\x30\x2f\x85\xec\x69\xc3\x32\xbf\x89\x80\x0d\x54\x01\x2c\xf3\x69\x1b\x7d\x99\xc2\x32\xef\x45\x00\x1a\xa0\x0b\x9c\xa5\x86\xea\xe3\xcd\x66\x6b\x54\xdd\x6a\x17\x13\x75\xc6\x65\x8a\x06\xc4\x43\xa3\x90\x6f\x2c\x1e\xc1\x87\xe0\xaf\xe0\xc3\xb3\x88\xb3\xb8\x44\x46\x61\xd0\xcb\x14\xb7\xd9\x69\x81\xa0\x2c\xc1\x6d\xae\x90\x5d\xa0\x06\xb6\x1f\x02\xed\xd2\x06\x6e\x26\xa5\xeb\x15\x55\x32\xac\xbe\x35\xba\xa1\x93\x19\x0e\xf3\xef\x11\xd0\x80\x10\xdc\xa3\x00\x3b\x26\x09\x2d\xf0\x76\x69\xc2\x0e\x54\x18\xbb\xd5\xc7\xd0\x59\xd2\xc9\xd0\x2d\x7b\x19\x56\xd0\xdb\x9a\x5a\x83\x40\x2e\xb1\x3a\x2a\x5c\x19\xc8\x21\x78\x68\x8b\x9b\xae\xe9\xe0\xeb\x23\x5b\xa4\x19\xad\x16\x69\x8c\xeb\xba\xb8\xf2\x10\x35\x4a\xb3\x84\x8d\xb2\x0b\xba\xc6\x7a\xa3\x9c\xaa\x51\x76\xf5\xad\xbb\xb8\x51\xba\x0a\x3e\x3c\xb2\x51\x3a\x6c\x35\x4a\x2f\xba\xb0\x60\xdb\x15\x34\x4a\xd7\x9b\x8d\xc2\x13\x42\x37\x0a\x76\x49\x92\xc6\xec\x98\x12\xba\x25\x9e\x12\xba\x0d\x3e\x3e\x6d\x4a\x90\x6a\x9d\x86\xf8\x2d\x44\x22\xdd\xad\x3a\xd9\x2d\xf3\x19\x6a\x0b\x91\xc8\x80\xd5\xe9\xbd\x76\x5c\x5f\x86\x09\x26\xee\x6b\xa3\x40\x2a\xd3\x2a\x80\x17\xa3\x04\xdf\xac\x80\x6a\x0c\x0e\x21\x52\x5b\x0d\x79\xbc\x8c\xfb\x2b\x60\x22\xb1\x8e\x19\x66\xc1\x12\xba\x4c\x30\xab\xb5\x42\x1a\xed\xe9\x6b\x38\x1d\xe0\xf6\x55\x0a\xb7\x85\x6d\x6f\xaa\x05\xb1\x28\x59\x89\x61\x87\x4a\x98\x5a\x07\xfe\x95\x0e\x7e\x5b\x84\x6e\xbf\x9a\x4a\x98\x46\x05\x6f\xaf\x55\x6b\x85\x69\x72\x14\x97\x56\x55\xa7\x05\xfe\x12\xa2\xd4\x37\x19\x46\x49\x19\xf6\x62\x94\x7a\xd3\x59\x88\x52\x6f\xba\x35\x94\xfa\xda\xfd\xc2\x72\x98\xfa\x3a\xdc\x57\xc9\x0c\x5b\x4d\x41\xab\xdc\x5b\x2b\x3d\xb7\x4a\xe4\x2d\xa0\x57\x90\x42\x1c\x08\x98\x65\x74\x0c\x92\x65\x8a\x07\xc9\xb2\xc0\xbb\x87\x0c\x52\x5d\xec\x42\xd1\xf4\x6a\x02\x58\x4e\xf1\x9d\x56\x55\xee\x02\xb9\x3c\x4f\x02\xbd\x32\x01\xec\x3a\x11\x68\x63\xa7\xc0\xf2\xd9\x10\xfc\x83\x2d\x8f\x8c\x03\xb4\xd2\x73\x5b\x2b\xd7\x02\xdd\x02\xba\xcd\xcd\xb6\x45\xf0\xbb\x35\xaf\xb9\x1e\x62\x93\xae\x8e\x09\xc8\xcd\x62\xdd\x59\x61\x16\xd7\x40\x01\xf7\x36\xb2\x9e\xad\xf7\x15\x92\x9a\xc7\x7e\xb5\x4d\x20\x4b\xaf\xc9\xc9\x92\x20\xc8\x08\x51\xef\x1e\xb2\x2a\xd9\x16\xe8\xc6\x93\x06\x3a\x47\x07\x21\x38\x9d\x8a\x7b\xa7\x23\x8e\xb1\xa3\x9f\xec\x1a\x18\xb2\xf1\x18\x34\xe4\x0e\x37\x47\x0e\x1f\xd9\x76\x28\x40\xb2\x01\xcb\xa5\xc9\x76\x81\x51\xe9\x97\x53\x4c\x1f\x43\x5f\xb0\x92\x38\xc5\x84\x32\xaa\x45\xcd\xd1\x4a\x50\x63\xbc\xea\x3a\x3a\x30\x04\x88\xc9\x8e\x51\x83\x4c\x76\x4c\x0e\x74\x78\x15\x7a\xe4\x5c\x69\xfa\x9e\xf2\x5a\xe1\x58\x40\x2e\x63\x09\x84\x71\x16\x8b\x10\xfc\x1c\xbb\x06\xcb\xec\x08\xd0\x31\x1d\xb7\x26\xbe\xab\x3e\x58\xfc\x4e\xc4\xa5\xaa\x15\x6e\x17\x61\x39\xa9\x52\xab\x09\xe9\xea\x40\x96\x3e\x5c\x79\xf9\x7f\x52\x14\xc9\x20\x0a\x43\x94\xa2\xd8\x47\xd2\x18\xe5\x5f\x10\x8a\x3b\xc2\x40\xa6\xf3\x49\x1e\xf9\x93\x64\x1e\x10\x60\xc9\x85\xb1\x22\xaf\xa4\x5d\xe4\xa5\xb1\x34\x4d\x52\xc4\x81\x38\xba\xf8\xd8\x21\x03\xc3\xae\xa4\xc1\xb3\x92\xb0\x6a\x56\xcb\xa5\x5b\x33\x73\x0c\xa7\xbd\x79\xb8\x36\x90\xc7\xdc\x6e\xe0\x3a\x40\x96\xb6\x12\x7f\x3e\x45\x71\x4e\x1f\x81\x08\xba\x72\x7b\x34\x97\x4a\x2e\xf9\x5e\x2c\x8d\x91\x14\x26\xf3\x38\xe0\x45\x77\xa9\xe8\x15\xa3\x33\x54\xd5\xb6\xec\x50\x85\xcb\x84\x87\xaa\x56\x49\xdf\xb1\xc6\xdc\x3f\x8d\xad\xe4\x45\x5e\x85\x48\x76\xa7\x5a\x44\x05\x22\x4a\x5c\xa2\xa4\x08\x53\xd5\xce\x90\xa4\xfe\x30\xba\xc4\x0b\xad\xb0\x7c\xda\x2f\x62\xd6\x90\xfa\x2b\x2f\xad\xa2\x8b\x3c\x84\x7b\xe1\x05\x79\x81\x23\x93\xa4\xa3\x78\x3e\x55\x8e\x46\xbf\xbf\xdf\x39\x1a\x6d\x89\xc4\x5d\x94\xef\x74\x63\x77\x67\xeb\x62\xe7\xf0\xe2\xe0\xe8\x62\xfb\xf7\xad\xfd\x32\xbf\xb1\x40\xe8\xe2\x1d\xb8\x14\x97\xd9\xaa\x4f\x91\x77\x51\x7d\xc5\xc9\xa9\xaa\xcf\x7e\x7a\xff\x18\xb5\x8c\xe5\x03\x57\x5e\x0b\x86\xee\xf7\xb8\x07\x2f\x12\xc8\x54\x44\x42\xf4\x48\x84\x72\x97\xe6\xd1\x76\x94\xbf\xbe\x2a\x1c\xf6\x46\x5b\xf2\xa0\x74\xde\x2b\x9b\x63\x98\x2b\xe9\x4a\x65\xf7\x95\x39\x4d\x61\xc7\x73\x2c\x33\x5c\x5c\x49\x99\x92\xea\x34\xfa\xf4\x57\x8f\xda\x78\x6b\x55\x13\x17\x4c\xa6\x02\xf4\xb1\x2d\x17\xbb\x29\x22\x38\x90\xf5\xe1\x24\x75\xe0\x15\x02\x15\xa3\x52\x0f\xa3\x28\x1f\x11\xfa\x4a\x14\x93\x01\x6b\x14\x50\x9b\x94\x2b\xe7\xa5\x5d\x31\xdf\xf9\x54\x1f\xbd\x6a\x38\x08\x99\x51\xf5\x5b\x99\x51\xab\x2a\xe5\x2f\xe0\x6b\x28\xf4\xbd\xfa\x75\x7c\xce\x07\x6a\x74\xcc\xbe\x1a\xa0\xbe\x78\x8b\xe3\x20\xf6\xd9\xfd\xdc\xcd\xa4\x09\x88\x4f\xb5\xa2\x15\x06\x5a\x2a\x83\xdd\x5c\x35\xda\x19\x5e\x27\xc1\x6d\x99\xde\xd1\xcb\xf4\x54\x01\x37\xb2\x51\x4f\x5e\x1e\xb8\x8a\x77\xd2\x59\x8a\x42\x94\xa6\x28\x90\xbe\x78\xb7\x2c\xe2\x3e\x9b\x4f\x51\x47\xee\x28\xae\xc2\x1f\xaa\x2e\x13\x06\x8d\x66\x8a\xb4\x31\xc9\xf1\x02\x93\x47\xd7\x68\x72\x4b\x00\x38\xa7\xde\x2d\xf3\x72\x90\x3c\x29\x4e\xe2\xb5\xa5\x81\x9c\x04\xf2\x19\x6f\xf4\xc9\xe2\xaa\x15\xa9\xd9\xcd\x54\xd1\xb7\x68\x6d\x27\xef\xde\x90\x6c\x42\x74\x4f\xd2\xfd\x9b\x5e\x86\xb0\x5d\x55\xa2\x38\xaf\x48\xba\x74\x13\x29\x09\xf8\x94\x2b\x6f\x4c\x73\x25\xe6\xa5\x6d\xf2\xe1\xe6\xe8\x90\x67\x5e\xaa\x78\x96\x3e\x7f\x72\xf1\x3f\x97\xd3\x3f\xf0\x3f\xef\x3e\x1f\xe0\x7f\x3e\x5e\x18\xf8\x9f\xc3\xd1\x15\x4e\xfe\x61\x42\x7e\x7a\xb7\x49\xea\x3b\x1c\xe3\x7f\xfc\xcd\xd3\x82\xfe\xa9\xc9\xee\xd4\xa6\x74\x22\x5c\x4e\x11\xa8\x13\x2f\x54\xe4\x4e\x5b\x1b\x9f\xf1\x3f\x23\xf4\x3b\xce\x78\x81\xff\xf6\x32\x52\xc8\xef\x76\x49\xfe\x54\x32\x34\x08\x2e\x6d\x05\x3c\x0d\x92\x44\x3d\x07\x44\x14\x0e\x8c\x30\x69\x6d\x9c\xe4\x79\x32\x1d\x40\x6d\x76\x43\xa8\x93\xd6\xb2\xe8\x2b\x1a\x40\x63\x76\x73\xaf\xf0\x2f\x8c\xa2\x32\xc8\xc3\xd4\xc0\x54\xd5\xd9\x4d\x49\x05\xa5\xa9\x38\x27\xf7\x2c\x26\x96\x4b\x69\x3c\x92\x89\x8a\x9f\x7a\xe9\x65\x14\xd3\xdb\xf7\x81\x33\xbb\xb9\x67\xd4\xe7\xe3\x9c\xfc\xaf\x78\x25\x53\x6a\x6f\x64\xe2\x82\x6e\x68\x82\x81\x6e\x62\x59\xb9\xbf\xef\xcb\xd2\xe8\x5b\xe2\xa2\xae\x9a\xa0\x30\x1f\xa8\x1c\xc3\x05\x4a\x08\x2f\x94\xa6\xe2\xe3\x6e\x4e\x3f\xb8\x48\xef\x83\x94\xfc\xad\x9b\x26\xd4\xfa\x20\xa6\x1f\x5c\xd5\x36\xfb\x20\x22\x1f\x6c\xa8\xe3\x23\x7b\x42\x3e\xb8\x86\x6e\xea\x7d\xe0\xd1\xfc\x96\x6a\xda\x7d\x30\x61\x05\xe8\xae\xc6\xe1\xbf\xfa\xc9\xb2\x07\x82\x16\xb6\x71\x71\x0b\xa7\x17\x37\xbc\xcb\x4e\xde\x02\xe0\xfc\x24\xe6\xf8\xf7\x0b\x2e\x42\xe1\x49\x53\xe7\x68\x7c\x16\x32\xaf\x94\xb5\xac\xd3\xb0\x33\x76\x1e\xd7\xca\xb8\xa8\x56\xe5\xf4\x59\x78\x93\x1e\xd6\x5f\xbe\x44\xf5\x73\x3b\xb9\x8c\x6b\xdd\xf7\x12\xd8\x66\x0e\x24\x78\xfe\xf0\xfe\x2b\x6f\x09\x57\xe1\xad\x69\xf5\x9d\xd6\x57\xd0\x0d\x96\xbe\x38\x38\x7a\x34\x43\x25\xb4\x56\x5c\x97\x75\x0a\x9d\x3d\x40\x68\x72\x6a\xa0\x97\x0d\xc4\xac\x4e\xa7\xcc\xcc\x76\xca\x9f\x35\xfa\x33\xb1\x29\x1a\xef\x39\xd0\xe6\x07\x92\x3e\x25\x55\x37\x5d\xc5\xdd\x3c\x77\xa1\xcb\x9d\xb0\xb5\x47\x92\x32\xd0\x7d\x89\xef\x11\xab\xb8\xa8\xed\xe2\x7f\x58\xe9\xc2\x56\x50\x55\x8a\xae\x23\xf4\xa5\x3e\x12\x14\xde\xad\xb8\x57\x68\x5d\xe6\x7e\xdc\xf7\x7b\x2e\x98\x27\xf4\xca\xbc\x7e\x57\x69\x77\x1c\xcb\xe8\xf8\x2d\x66\x8a\xe0\x2c\x1c\x1a\x02\x23\x83\x98\x03\x76\x14\x59\x42\xad\x13\x18\xce\xb2\x8c\xa1\x91\xe4\xac\xac\xb8\xb8\x80\x55\xa4\xfb\x33\x9d\x52\x02\xe3\x3b\x5e\xb2\x63\x97\x46\x90\x25\xaa\x8f\x45\xf3\x9d\x24\x97\x84\xf6\x57\xa6\x21\x13\xd8\x3a\x59\x2b\x9c\xb2\xe8\xa4\x58\x0b\xd3\x64\x5a\x28\xaa\xdc\xbf\x27\x88\xdb\xb3\x64\xd8\x5e\x95\xbe\x5d\x45\x01\x1a\xa0\xfb\x7b\x10\x26\xc3\xb3\x6f\x33\x2f\xbf\x1a\xc8\x32\xf0\x93\xe9\x2c\x89\x09\x01\xd1\x53\x31\xb5\x8b\xf8\x41\x9a\x7f\x2e\xc2\xd6\x9e\xf3\xd8\xda\x20\x06\x3e\x98\x00\xaf\xdf\xe7\xd0\xb4\x11\x98\xb3\xa6\x15\x68\xdb\x11\x98\x2b\x14\x80\xb6\xf8\x26\x01\xf3\x16\xcc\xf6\xbc\x8c\x95\x3d\x1e\x8e\x73\xc5\xdb\x00\x73\x36\x31\x70\xaf\x31\xe0\xc8\xe1\x0b\x88\xbf\x6e\x0f\x20\xfd\xa1\x08\xe0\x14\x02\x93\x5e\xa2\xfc\x90\xfd\x8e\x87\xb4\xd7\x07\x73\x8e\xac\xb3\x2b\xcb\x49\x99\xa2\x80\xfd\x69\xa7\x69\x20\x20\x09\x51\x27\x50\xff\xdb\xbc\x89\xbb\x84\x5e\x21\x16\xa0\x7b\xdf\x07\x73\x11\x38\x77\x36\x9f\xcd\x26\xb7\x3c\x00\x30\x81\x01\xed\x0c\xa2\x97\x6a\xe1\xf9\x9b\x07\xfb\xdb\x3b\x6f\x08\x98\xed\xc5\xce\xde\xe1\xc1\xd1\xc9\x68\xab\x0a\xf6\x6d\x14\x4d\x8e\xbd\x4f\x2b\xfd\x62\x74\x74\x74\x70\xd4\xa8\xe1\x43\x39\xa3\x3b\xcb\x95\xcb\x13\x0d\x59\x06\x1a\x05\x10\xe4\x28\x71\x40\x32\xcd\x4e\x71\x9c\xd8\x20\x14\x43\xbc\x9d\xa4\x53\xc0\xff\xb0\x9f\x04\xe8\x18\xe5\x79\x44\xce\xb6\xf5\xdf\xf0\xd9\xfd\xb5\x37\xc1\xd6\x3e\x97\x71\x0f\xe5\x5e\xc0\x60\x69\x6b\xc9\x8f\x18\xba\x4a\xbb\x0e\x94\x7f\x49\xd2\x4f\xd5\xf7\x3b\x24\x88\x2e\xbf\x6d\xa5\x64\xdc\xbd\xd5\xf7\x9b\x28\x9a\xe1\x4f\xe7\x3f\x0a\xb6\x97\xd8\xa1\x1c\x6c\x17\x59\xc8\x7a\xd5\x4f\xaf\xaa\x3f\x7f\x91\x8b\x03\x8f\x3c\x28\xc6\x46\x6e\x20\x47\xb3\x92\xb2\x02\xf9\xa3\x54\xf9\x93\xa4\xfa\xa9\x0e\xc1\x4a\x80\x21\xba\x82\xee\x9b\x31\xcc\x24\x9e\x1e\xcc\x87\xdf\xee\x29\x64\x47\x14\x47\x45\x11\xf8\xe0\xbb\x99\x4c\xa7\x49\x9c\xf5\xe6\x74\x45\xcb\x86\x94\x6e\x78\xd8\xcb\xcb\xbf\xd0\x70\xae\x78\xd7\x11\xdd\xeb\xfa\x77\x77\x04\x34\x5a\x1d\x0e\x87\xe8\x15\xfd\x73\x80\x94\x98\x0e\x18\xff\x6b\x5e\xfc\x4a\xc1\x32\xc0\xac\x2c\x30\x2e\xff\x4a\xbb\x8a\x4e\x8b\xcc\xa9\xa8\xe8\xb8\xf8\x35\x56\xfc\x28\x48\xd7\xcf\xce\x38\x77\x9d\x69\x05\x16\x00\x84\xf8\xea\xe7\xe0\xac\xe6\x7d\xda\x95\x81\x43\x1a\x20\x2e\x54\x85\x97\x65\x57\x7a\x86\xf3\x42\xbd\x7e\xc8\xd6\x44\x27\xeb\x34\x57\xf6\x0f\xb6\x46\xc7\xa3\x93\x93\x9d\xfd\x37\x38\x0b\xf7\xf1\x62\x73\xf7\xfd\xf1\x49\x01\x87\x88\xb3\xd2\x97\xc7\xc3\x89\x17\x97\x58\x8b\x4b\xcb\x38\xd8\x3f\x39\x3a\xd8\xbd\x38\xdc\xdd\xd8\x1f\x5d\x8c\xf6\xb7\x0e\x0f\x76\xf6\x4f\x2e\x76\x0e\x8b\xa6\x12\x24\x01\x52\xca\xd1\xe8\xf8\xe0\xfd\xd1\x26\xa1\x95\x28\xfe\x26\x2d\x3d\x3e\x39\x38\x1a\x51\x77\x53\xea\x3e\xda\x95\xf8\x74\x6f\xfb\x60\x77\x8b\xf6\x49\x01\x8f\x74\x98\x24\x93\xee\x1c\x87\x07\x07\xbb\xe7\xe7\x02\xac\xdc\x72\x3d\x9c\x9f\xa1\x33\xf5\xfc\x7c\xe8\x37\x80\x1f\xd0\x19\x3c\x07\xe8\x4c\x3b\xc7\x86\xd5\x5c\xe1\xfb\x66\x7b\xe2\x5d\x27\x15\xe2\xcd\x31\x6e\x61\xc0\x8e\xfe\x38\x41\xaf\xde\x65\xcd\xec\x78\x15\xc3\xbb\x57\x13\x32\x87\xfc\x48\xb6\x35\x51\x75\xb8\x14\xac\x8c\x28\x2d\xf3\x8b\xa1\xbb\xf7\x92\x00\x31\x61\x8e\x73\x2f\x0e\xbc\x49\x12\xa3\x5e\xff\x95\x58\x08\x11\x86\xdd\xe2\x11\xff\x70\x70\xf4\x0e\x2b\xcd\xc1\x16\x81\x75\x3d\xd9\xd8\xdf\x1c\x5d\x9c\x7c\x3c\x1c\x61\x09\xa7\x9e\x7f\x15\xc5\xe8\x2d\xf2\x26\xf9\x15\x09\x95\x18\x51\xd4\xae\xe1\x0b\xb5\x80\xbd\x7b\x48\x65\x7b\x1b\x9b\x6f\x77\xf6\x47\x17\x6f\x47\x1b\xbb\x27\x6f\x2f\x36\xdf\x8e\x36\xdf\x1d\x5f\x8c\xf6\x37\x5e\xef\x8e\xb6\xe8\xba\x11\x0e\xcf\xce\xe4\x2b\x72\x0d\xd7\x35\x3d\x9a\xc0\x9b\xe0\x8c\x8b\x49\xea\xca\xd4\x20\x3c\x39\xe3\x22\xa2\x16\x66\x29\x66\x13\x7f\x77\xd8\x95\x81\x83\xa6\x3d\x2f\x4c\xb5\xd2\xc4\xd8\xac\xe2\xb7\x87\xdf\xee\xb1\x49\x46\xba\x72\x63\x1e\x44\xf9\x6e\x72\x79\x89\x6d\xa9\xa2\x43\x19\xd1\xe4\xca\xfd\x4a\x7b\xf0\x62\xe3\xfd\xd6\xce\xc9\xc5\xee\xc1\x9b\x37\x44\x4f\xc3\x85\x13\x45\x20\xd7\x6a\x73\xa7\x9d\xaf\x84\x15\x5e\xdc\x00\x61\x9f\x89\x50\x9c\x01\xb7\x96\xd7\xd4\xfc\xad\x57\x18\x13\x0f\xd7\xbd\x8e\xa5\xad\x10\xa4\xff\x62\x38\x1c\xe5\xb5\x9a\xab\x13\xc2\x05\x5b\x86\x2f\x32\x3a\x2f\x2f\x50\x7c\x19\xc5\x42\x58\x9a\xab\x5c\x39\xbc\x26\xe0\xb7\xaf\x37\x76\xf1\x64\x3a\x02\x47\xb9\x32\x53\xf6\x36\xf6\x37\xde\x8c\xf6\x46\xfb\x27\xe5\x42\x7d\x3c\x3a\x3a\xdd\xd9\xc4\xb2\xbc\xc1\x93\xe2\xcd\xd1\xc1\xfb\x43\x0a\xa7\xd4\x21\x06\x5b\x07\xf8\x05\xe6\x34\x9a\x31\x13\x07\x6f\x11\x64\x3b\x7c\x31\x1c\xf6\xa2\x27\x8a\x56\xef\xac\xd3\x9d\xc3\x8b\xfd\xd1\x09\x5e\x2a\xa8\x7c\xfd\x97\x2f\xe9\xbe\xf9\x62\x38\x8c\x5e\x45\x83\xec\x31\x02\x6f\xee\x6c\x1d\x95\x02\x27\x3f\x4c\x60\x5c\x4d\x4d\xe0\xe4\x55\x32\x98\x2d\x16\xb8\xa3\x57\xbd\x27\x0a\xd9\xd9\x87\xde\x2b\x6f\x59\x1f\x72\xfd\x16\x05\x69\x29\xd2\xe4\x3b\x89\xd4\xea\xa5\xc9\xab\x09\xee\xa5\xca\xf2\x47\xf9\x76\x9a\x4c\xbb\x6c\xc6\x1a\x7e\xdd\x7a\x14\xf6\x9e\x2d\xa9\x7f\x4b\x4b\x2a\xe5\xa9\xc6\x4b\x44\xbe\x63\x02\xa3\xd8\x4b\xf1\x46\x90\x9e\x69\x78\x37\x48\xf1\x56\x51\xa2\xf4\x67\xcb\xed\x26\x80\x84\x66\x10\x12\xda\x31\xc5\x7d\xa2\x3c\x4b\x93\x80\x12\x2c\xb4\x33\xbf\x6a\x74\x79\xcd\x7c\xc1\x0b\xfb\xd6\x60\x61\x8a\xad\xd1\x29\x88\xcb\xf9\xc3\xb0\xd5\xb0\x04\xbd\x0e\xa1\xd6\x63\x86\xfe\xd7\xea\x99\x22\xb8\xa6\x71\xa4\x95\xf1\x09\x4a\x89\x02\x10\x53\xca\xbd\xfb\x46\x6e\xb6\x4d\x3e\x62\x77\x07\x48\x60\x3f\xf0\x68\x5f\x0f\x28\x7f\xa1\x55\x06\x50\xb7\x15\x48\x2d\xb6\x68\x88\x1a\xa6\x2c\x9e\xff\x05\x1d\x9c\xb0\x7f\xa3\xfe\x7a\xd2\xd5\x95\x8f\x34\x57\x41\x82\xfb\x39\x61\xfd\x1c\x85\xbd\x72\x25\x43\x02\x8b\xa5\xff\xed\x31\x56\xe6\x0f\x36\x19\x1f\x3f\x1b\x45\xb6\x5c\x31\x41\xc9\x18\x79\xc2\xd3\x45\x80\xfc\x24\x40\xaf\xbd\x0c\x59\x46\x4f\x54\x48\xe5\xa5\xb1\xde\x39\x58\xcb\xad\x6d\xe0\x35\x07\xa4\x3a\xa9\x7f\x7b\x8c\x12\x2c\x31\xe5\x00\x5a\x6a\x3e\xbe\xda\xcc\x07\xa3\x9c\xf6\xcd\x64\x28\xcb\xeb\x68\x75\x73\xa0\xde\x82\xe2\x56\x81\x28\xde\xcb\x97\xbd\xc9\xf0\x01\x45\xb5\x26\x2c\x6b\xfe\x23\x6d\x0a\x30\xa1\x2d\xf2\x97\xb6\xa8\xdb\x84\x5c\xdc\x3a\x7f\x71\xeb\xba\x8b\xfd\x0e\x2d\x5d\x6c\x93\x02\x9f\xb6\x7d\xbe\x6a\xff\x63\x33\x0a\x64\xb8\xa7\xe6\x1d\x6d\xf6\xa3\x20\x7d\xf9\xb2\x97\x0d\xe7\xdf\x71\x9c\xb0\xa1\x05\x32\x2a\xeb\xec\x31\xbd\x49\xe4\x0e\xb1\xdc\xb3\xc5\x72\x87\xc3\xd9\x0f\xed\x75\xd2\x92\xf0\x3b\x54\xd1\x79\x0e\x02\xe2\xee\xe9\x38\x8d\xb5\x76\xd7\x62\x6f\x4e\xaa\x9b\x5d\x19\x14\x9f\x64\x80\x94\x24\x23\x10\xbb\xf4\xaf\x98\xd3\x52\xef\x1a\xd1\xeb\x4c\x52\x4e\xc6\x19\xbe\x3d\xd4\x60\x48\x2b\xd6\x52\x8a\x49\x4c\xef\xcb\x4f\xa2\x29\xca\x72\x6f\x3a\xa3\x97\xb9\xdc\x0b\x1a\x7f\xfd\xca\x6d\x88\x22\x73\x9a\x2d\xfc\x1b\xf9\x02\xec\xe0\x28\xa0\xc8\xc1\x15\x34\x2e\xe1\xb3\x3d\x42\x97\x51\x12\x7b\x13\xa6\x47\x0b\x4a\x6f\x80\x7a\xd3\xec\x4c\xb0\x46\x29\xbd\xba\xf4\x7b\x9b\x0b\x1f\x10\xa4\x87\x9f\xcf\x39\xa3\xbb\x56\xd3\xe6\x24\xea\x3e\x6e\xc4\xe8\x8b\x74\x99\x2b\x9f\x40\x3a\xfc\x46\x5d\x36\x0f\xbd\xfc\x6a\x80\x00\xf7\x54\x58\x5e\x8a\x6d\x56\xdf\xf5\xfa\x80\x3b\x10\x94\x29\x68\xab\x7a\x7d\x80\x6e\x72\x14\x07\x9b\x93\x68\x73\x1a\x64\x83\xb3\xf3\xfb\x12\x1b\x98\x16\x14\xf5\xd2\x4a\x48\x6f\x36\x9b\xdc\x9e\x7c\xba\xa4\x9a\xba\xa4\x4f\xaa\xde\xa6\xd9\xde\xbd\xa1\xd9\xb6\x93\x94\xbd\x44\xf4\xbe\xcd\xbc\xd4\x9b\x66\x83\x8a\x8a\x84\xea\x1e\x8f\x2b\x5e\xa0\x95\x8f\x6e\x0a\x1f\x88\x95\xeb\xa5\x6f\x81\x8f\xad\x58\xe0\x39\xb0\x02\x70\x7c\xed\xfd\x91\x7d\xea\xd5\xe8\x3c\xaa\x86\xf4\xfa\x4d\xd6\x4d\x1a\xae\x4f\xde\xc3\x08\x35\x6a\x4d\x3d\x1a\xd7\xad\x0b\xb4\x1d\x0d\x87\xc3\xab\x5c\xf9\xf3\xab\xb2\x35\x3a\x7d\xf5\x60\x0d\x6d\x9d\x1e\xfa\x83\xaa\x44\x7c\xdc\x78\x6a\x91\xb8\x8c\x3e\xa1\xca\x29\x1b\xd8\xf1\x1c\x26\x83\x4b\x94\xb7\x47\xfa\x1b\x21\x4e\x12\x2c\xbd\xe4\x11\x69\x20\xd3\x20\x78\x69\xff\xf8\x0f\x69\x23\xb8\xc6\xa5\x05\x12\x2e\x5a\x2a\xca\x96\x41\x50\xa1\x31\x0f\xde\xc7\x0a\xf7\x11\x44\xd0\x89\x07\xdf\x58\x51\x58\x2f\xa4\x31\xcb\x46\xa1\x32\xa9\x69\xcc\x17\x20\x4a\xc5\xfd\x2e\xdf\x03\x7f\xe2\x7d\xfd\x3a\x78\x1f\xdf\x37\x5b\xdc\x3a\x49\x2d\x68\x70\xa3\x8f\xa9\x84\xd7\xb9\x12\xd3\xc7\xb3\x4d\x2f\x63\xcf\x6a\x62\x8a\xf6\x5f\x2a\x4f\x3f\x56\x63\xd6\x68\xc6\x31\x01\xfd\xa7\x78\x9c\xc5\xf9\x3a\x93\xc6\x9e\xff\x89\x92\x9c\x35\x09\x34\x96\xf0\x86\xcb\xfd\x7a\x5f\xc6\x49\x40\x88\xd6\x48\x2c\x58\x57\x57\xb6\x13\x89\x7a\x32\x49\xdb\x3d\x59\x3d\x81\x76\xf4\xa2\x44\xfa\x2a\x4c\xd2\xe9\x87\x28\xbf\x3a\xb8\x46\x69\x1a\x05\x28\xeb\x89\x1e\x35\x6b\xa5\xd1\xc7\xcc\x6f\xb4\xea\x8d\xa8\x26\xf0\x46\xc4\x2b\x0f\x37\x67\x05\xcf\xc2\xcb\x46\xb7\xb4\xec\x59\x87\xed\x78\xde\xb1\x54\x14\xd0\xe8\xa7\x0e\x7c\x6e\x21\x14\xf7\x02\x08\xee\xfa\x08\x91\x0a\xcb\xd4\x5d\x43\x24\x48\x25\x1a\xa3\x3f\xa2\xd6\x18\xf1\xef\xd7\xcb\x3a\xa3\xbc\xcf\x61\xb2\x15\x79\x57\x53\x5a\xdc\x42\xdc\x17\x4f\xd3\xd8\xa2\xce\xce\xae\xa8\x27\x10\xf5\xc2\x9f\x6d\x4d\x3d\xe0\x0d\x35\xb1\xa6\x16\x2b\x2c\x97\xb4\xb7\x1b\x55\xca\x15\x95\x2e\x81\x85\x1e\xb4\xf7\x03\x50\x9a\x50\x2f\x5e\xe4\x4a\xc1\x35\xd3\x93\x0b\x37\x0a\xb9\x7f\x77\xd7\x23\xc8\x02\x3d\xf4\x8b\x2c\x45\x94\xc7\xa6\xc0\xb9\x2c\xf1\x78\xf9\x1d\x90\xb0\x1a\xbf\x90\xfb\xe0\x05\x14\xc9\x52\xf0\x7e\x14\xb7\x63\x64\x97\x5d\xdd\x2c\xa3\x05\x2d\xda\xb0\xbf\xe1\xfa\x99\x83\x68\x36\x40\xf7\xf7\x22\x29\x0e\xd3\xc4\x47\x59\xb6\x44\x08\x90\x83\xb4\x38\x96\xd7\xee\x7c\x7b\x69\xe9\x70\x90\xa1\xfc\x24\xd9\x8e\xd2\x2c\x3f\xce\xd1\xac\x70\x38\xa8\x79\x14\x15\x24\x15\xd4\x95\x85\xb1\xae\x91\xbe\xe7\x18\x08\x5a\x3e\x94\x9d\x96\x44\xc9\xb9\x4a\xfb\x26\xca\x0e\x62\xae\xfe\xbb\xbb\x1e\x1a\x32\x8f\xad\x9e\x4c\x4b\xc5\xcb\xe4\x97\x68\x32\x91\x92\x6b\x94\x7e\x49\xa3\x1c\x49\x5e\x7c\x4b\x02\x6d\x89\xfb\x39\xe1\x25\x22\xd7\xcd\x28\x50\x24\xd2\x37\x28\xa0\xa1\x56\xb4\x21\xaf\xe4\x7e\x1f\xa0\x96\xb4\xbc\xbb\x69\xb7\x5d\xfa\x8d\x90\x74\xb3\x66\x0f\x98\x3f\x86\xd0\x73\x08\x1b\x9b\x84\xd0\x9b\xe2\x30\x8b\xd3\x56\xae\x40\xd8\x38\x8a\x26\x68\xd0\xa2\x5a\x00\x65\x70\xcc\x80\x1b\x0d\x7e\x26\x00\xbc\x61\xa1\x38\x68\xfe\x2e\xd4\x4e\x9e\xe7\x2f\x89\x6b\x0d\x59\xac\x51\xf5\x8c\xb5\x56\x2d\x50\x10\x96\xae\x70\x2d\xa9\x25\xa4\x9f\x28\xb9\x7a\x83\x4c\x82\x73\x4c\x6a\x39\xbb\x08\x74\x69\x31\xab\xfc\x02\x0e\x15\x7e\x80\x49\x21\x41\x75\xf4\x3b\x22\xfe\x37\xa9\x97\x16\xc4\x7a\xbd\xb3\x5a\x71\x6f\x46\x27\x17\xb5\x7b\xf7\x63\xd0\xfa\x7d\xf3\x60\xef\xf0\xfd\xc9\xa8\x4c\xd7\x4e\x71\xba\x57\x1c\xbc\x05\xd9\xc9\xb3\x08\x79\x2d\x10\xfc\x78\xba\x77\x41\x5f\x07\x04\xbf\x1d\x1c\x5f\xec\xec\x6d\xbc\x19\x1d\x9f\x83\x6f\x81\x3f\x40\x05\x61\xfe\x7d\xfd\xa8\x51\x77\x30\x5a\x6c\xee\x77\x77\x4f\x51\x4e\x6f\x59\xf7\x08\x89\xa1\x44\xd4\x53\x47\xdc\x5b\x47\x46\x38\xa2\x16\xf1\x39\xd5\x29\xb8\x56\xa0\x74\x2a\xd8\xd0\x1f\xd8\x9a\xd6\x60\xae\xdc\x9e\xcd\x64\x3a\x9b\xe7\x65\xb3\x96\x37\xc9\xa7\x19\xf8\xfd\xbd\xdd\xaa\xea\x61\xed\xb1\x2d\xe2\x95\x6f\xe5\xc6\x30\x4b\x71\x79\x23\x4e\xf7\x24\x76\x75\xf5\x03\x07\x85\x9f\x22\x2b\x37\x61\xab\x78\xa7\x5b\xde\x88\xf2\x49\xef\x07\xb6\x81\x9b\xc9\x2b\x37\x61\x9b\x3c\x1d\x2e\x97\xff\x7a\x2a\xd1\x57\xc6\x1f\x28\x7f\xb9\xda\xac\x2e\xfe\xc1\x31\xb1\xf3\x96\xcb\x7f\x70\x2c\x45\x24\xe5\x4a\xe2\x17\xa4\x37\x28\x51\xfe\x7c\x34\xe9\x8d\x88\xe7\xa6\xf8\x94\x27\xca\x49\xf9\x21\x4d\x94\x8f\xe5\x87\xe3\x5c\xf9\x3c\x2f\x3f\xc5\x89\xb2\x75\x53\x7e\xba\xcd\x95\xe3\xd7\x9f\x1f\x4a\x96\xc3\x7c\xf5\xcf\xcf\xbb\x19\x6b\x0c\x4a\x58\xe3\x0a\xf8\x6a\x98\xc7\x2e\x01\xf8\xbe\xdc\x24\xe8\x8a\x2d\x50\xda\x31\x03\xa5\xad\x03\x60\xf2\x70\x70\x5e\x4a\x93\x06\x51\x2a\x03\x79\x82\xc2\xbc\x42\xd5\x26\x58\x83\x0c\x61\xae\xc4\x81\xcb\xbd\x31\x41\xfa\x93\x81\xac\x36\x61\xe1\xb0\x9d\x22\x03\xf9\x13\xba\x1d\x27\x5e\x1a\xec\x62\x75\x8a\x19\x10\x25\x04\x72\x94\x15\xf0\xe7\x38\x21\x03\x5e\x6c\x23\xc7\x4d\xd0\x35\x29\x0d\xd6\xf0\xa8\x3f\xa2\xbb\xbb\xde\xc7\x02\xcc\x96\x31\x7d\x70\x1c\x2c\x96\x3a\xd6\x35\xdb\xb4\x35\x43\x75\x02\x5d\xb3\x90\x3f\xf6\x4d\xd3\xf2\xc7\x41\xe8\xbb\x41\x10\x58\xae\xed\x78\xa1\x1f\x32\x98\x7a\xc7\xb0\x4c\xc7\x84\xd0\x34\x1c\xc7\xd4\x34\x08\xe1\x4a\x1c\x2c\x45\x28\xa2\x00\xf3\xb6\xb8\x8a\xe0\x63\x1c\x79\x30\xe6\x36\xf2\x72\xf3\x9b\x8a\xd1\x60\x35\xd8\x47\x03\x34\x82\x23\x28\xf4\x64\xa1\x56\x9d\x20\x90\x14\xab\x18\xe8\x42\x00\xe1\xaa\xc7\x7f\xc3\x3d\xfe\x5b\xd1\xe3\x34\xdc\xa5\x64\xdd\xac\x9f\xa2\x4a\x0a\x1f\x5b\x87\x7a\x68\x1a\x86\x03\x1d\x4b\x0f\x9d\x71\x08\x7d\x3d\x70\x74\x4d\x47\xb6\x67\xda\x9e\x6b\xda\xbe\xa6\x9a\x3a\xc3\xd9\x37\x6d\x02\xfc\xaf\xab\xae\x6d\xb8\x96\xea\x58\x8e\x3b\x90\x8e\x46\xa7\x3b\xa3\x0f\x12\xf5\x89\x7f\x7f\xc4\x90\xbf\x29\xc6\x7e\x0d\x5c\x79\x96\x4c\xa2\x1c\x95\xa8\xaf\x22\x18\x51\x48\xff\x58\x2b\x00\x63\x5a\x80\xa1\xef\x67\xd4\x2b\x46\x6e\x75\x57\x32\xcf\x19\x36\x21\x35\x63\xd7\xc8\x4f\xba\xa8\xa3\xfe\xc2\x1d\xf5\x57\xd1\x51\x34\x79\xb3\x83\xc8\xf4\xa1\xad\x56\x03\xdf\x31\x54\x0f\xaa\xae\x1a\xe8\xd6\x38\x30\xc7\x81\x8b\x42\x68\x99\x26\x84\xae\xe1\x22\xc3\x74\xc3\xd0\x34\x61\x01\x92\xee\x9a\x36\x84\x96\x61\x40\x0b\xba\x3a\x54\x0d\x63\x20\x51\xdb\x5b\xaa\x5d\xe6\x16\x7d\xa4\x03\x41\x70\x4f\x27\x5c\x75\x13\x1a\x97\xe1\x4d\xb3\xa8\xa4\x6e\x1d\xa2\xf1\x24\x65\xa7\x2c\x54\xa4\x77\xb8\x7f\xde\x95\x38\xd4\x74\x06\x2d\x51\xa4\xd0\xf1\x7c\x67\x8c\x3c\xc3\x0c\x2d\xdf\x0b\x4d\xcd\xf2\x34\x04\x75\x55\x75\x35\xdd\x19\x07\x76\x08\x0d\xdb\x75\x4c\x46\x73\x61\xb8\x78\x06\xab\x9a\xa3\xba\xaa\x63\x99\xd0\xd4\xe0\x2a\x53\x55\x4c\x69\xd3\xa5\x07\x28\x88\x16\x69\xc1\x3f\x70\x2b\xff\x51\x4d\x17\x7a\xe8\x4d\x0a\x52\xa2\x30\x49\x25\x5c\x42\x4d\x15\x3c\x2d\xd4\x42\xe8\xaa\xbe\x31\x76\xed\xb1\x1d\x20\xa4\xdb\xd0\xf5\x42\xdf\x08\xac\xb1\xaa\xa2\x31\x0c\x0c\x53\x73\x9d\x62\xba\xa8\xb6\xe6\x38\xba\xa5\x6a\xae\xa6\xe9\xd0\xc5\xaa\x30\xc2\x65\x0a\x15\xa1\xd6\x0c\x86\x72\xcb\x22\xa5\xba\x5b\xf1\x1a\xb7\xe2\x75\xd1\x0a\x9a\x7c\x81\x2e\xbb\x96\xe5\x86\xfe\x38\x34\x0d\x4f\x0d\x55\x1f\xe9\x56\xe8\xea\x0e\xd4\x02\xe4\x58\x9e\x6d\x1a\x86\x17\x6a\x63\xdd\x18\x33\x16\x0e\xdd\x74\x54\x53\x57\x1d\x17\xda\xaa\x65\xba\x86\xab\x0d\x24\xfa\x7e\x20\x6a\x42\x37\xa4\x25\x2c\x50\x4a\x18\x82\x25\x89\x24\xac\x05\x5a\x72\xc8\x95\x04\xd3\xaf\x06\x59\xc9\x42\x12\x39\x10\xaa\x15\x42\x00\xf3\x8a\xee\x3c\xe7\xa9\xce\x77\x37\xf6\xb7\x76\xf6\xdf\x88\xe2\x57\x0d\x20\x5f\x69\x05\xb0\x25\x01\x57\x03\x15\x98\x59\x1d\xd2\xb2\x8d\x5e\x44\x80\xb0\x80\x9f\x00\x73\xf5\x60\x41\x82\x8b\xc4\xd0\xa1\xae\xbc\x14\x05\x6b\x01\x9a\xa0\x1c\xad\x61\x83\x6f\x6d\x96\xcc\xe6\x33\x3e\x78\xd3\x65\x49\x73\x34\x2b\x40\xf7\xd6\x32\x94\xcb\x0d\x98\xcc\x62\xef\x77\x57\xea\x25\x61\x5c\xa4\xca\xc5\x45\x42\xb8\x18\x60\x0c\x16\x83\x05\x2b\xe4\x51\xa8\x83\x2c\x01\x50\x05\x66\xb3\x2b\x78\xb0\x44\x42\x1b\xc8\xc1\xd7\x14\x76\x11\x4e\x70\xfa\xee\x73\xcf\x06\xb3\x04\x14\x12\xf6\x1b\x18\x1c\x0c\x26\x64\xb5\x48\x45\x53\x14\x53\xb9\x42\xa4\x22\xdd\x1c\x64\x51\xee\x22\x72\x33\x5f\x12\xb9\x59\xa5\x4b\x0b\xd3\x5d\x94\xac\x86\x23\x72\x89\x72\xfa\xc2\x5d\x71\xee\x8a\xb1\x4a\x28\xb8\x47\xd1\x41\x75\xf0\x84\x79\xae\x4c\x3f\x15\x80\x08\x9f\x23\xe5\x2d\xf8\x92\x2b\x9f\x40\x94\x28\xef\x41\x92\x28\xfb\x0c\x4b\xc1\x4b\x94\x63\x30\x49\x94\xb7\x1c\xbe\xc0\xd9\x45\x7c\x79\x95\x64\x7c\xc4\xbe\xc4\xd6\x11\x82\x0a\xe0\xf9\x7e\x92\x06\x51\x12\xaf\x5d\x11\x6e\xd2\x35\xfa\xdb\xb7\x3a\x82\xc0\x3a\x8b\x9c\x1f\xb8\xb3\x1b\x09\x3a\xb3\x9b\x75\x3f\x99\x24\xe9\xe0\x3f\x0c\x1b\xff\xff\xfd\x23\x6b\x91\x1a\x3f\xe2\xb3\x39\x99\x34\x78\x6d\xf8\x56\x54\xe1\xdb\xb6\xee\xdf\x17\x4b\x86\x52\x5a\xb0\x4b\x91\x06\x2c\x2c\xe7\x3c\xcd\x92\x74\x40\x1c\x50\x51\xba\x3e\x63\x78\xc0\x83\x14\x4d\x08\xb2\xc6\x7a\x9e\xcc\x06\x50\x9d\xdd\xac\x87\x93\xc4\xcb\x07\xd8\x0e\xbf\xbf\xd2\x16\x94\x8d\x33\xa8\xf7\xff\xff\x14\x05\x91\x27\xf5\x2a\x44\x02\xc9\xb4\xad\xd9\x4d\xff\x9b\x52\xdb\xc8\x45\x05\xe5\xe8\x26\x5f\xf3\x26\xd1\x65\x3c\xa0\x97\x0c\xf7\x4b\xf3\x48\x92\xa4\x54\x1b\xbf\x20\x01\x90\x56\x2a\xa3\xd8\x49\xbb\x41\x20\xa0\xaa\xfe\xf3\xbe\x82\x46\xb8\x3f\x07\x27\x5c\x20\x6f\x71\x6f\x95\xe4\xa5\x7b\x85\x84\x7a\xfd\x6f\x45\x78\x2d\xea\xdf\x3f\xf8\x70\x58\x1d\xdd\xa6\x49\x40\x22\xac\x37\x5e\x17\x47\x37\x2c\x05\xfb\x31\x8a\xff\xc2\x3f\xfa\xbf\x1d\xf7\xbe\xd1\xc9\x8c\x8f\x73\x41\xae\xbc\xfe\xaa\x84\x49\xba\x79\x15\x4d\x82\x5e\x98\xf4\xcf\x01\xf9\xae\xc4\x76\xb8\x20\x08\x0c\x86\x61\x58\x56\x1f\x5c\x32\x6c\x06\xcd\xd5\xfb\xe0\xea\xe7\x6b\x58\xf1\x14\x96\x0d\xce\x3e\xe7\xca\xd1\x39\xa8\x5a\x3a\xcf\x15\xf4\x15\x9c\x24\xe0\x22\x51\xa6\x60\x96\x2b\xbb\x1e\x09\x27\xde\x4b\x82\xf9\x04\x81\xcb\x44\x19\x9f\x97\xa3\x06\x34\x4d\x83\x46\xeb\x8d\x42\x9e\x67\x48\xca\xf2\x34\xf2\x73\x79\x3d\x55\x82\x5e\x0e\xbe\xbd\x15\xbc\x19\xcd\xee\x99\x17\x64\x0c\xa2\x61\xda\x73\x74\xa8\xd9\x7d\x90\x0c\xd3\x9e\x6d\xb8\xaa\xd1\x07\xde\x30\xed\x69\xba\x69\xf6\xc1\x04\x7f\x09\xa1\xa9\xf7\x81\x3f\x4c\x7b\xba\x65\xbb\x7d\x30\x1f\xa6\x3d\xa8\x5a\xba\xdb\x07\xd9\x30\xed\x99\xa6\x8a\xfb\x7b\x36\xec\xf5\xe2\x07\x05\x74\xb3\xb0\x7b\x51\x10\x77\xcc\x07\x71\xf7\xfb\x05\xd0\x55\x94\xc4\x45\x80\x36\x02\xb1\x12\x33\xff\xda\x6c\x78\x76\x0e\x62\x51\x74\xf2\xf7\x8b\x50\xf5\x38\x1f\xa7\xed\x24\x9d\x16\x97\xf1\xe3\x79\x34\x09\xc8\xb3\x5b\x9d\x42\x1b\x34\x5c\x9d\x40\xf9\x73\xf5\xa9\x8a\x1e\x2e\x18\x8a\xfb\xec\xe9\xa8\x01\x3f\x35\xc4\xb5\x87\xf8\xf3\x9e\x37\x7b\x9f\x47\x93\x28\x8f\x50\xe5\x59\x41\x12\xed\x79\xcc\xbd\xaa\xbb\x54\x9e\xf6\x98\x16\xbc\x2c\x47\x71\x77\xc5\x32\xf1\x8f\x35\x6f\xbd\x38\x98\xa0\x94\x96\x40\x5f\x6c\xb8\x5f\x97\x35\xb0\xb3\x60\xf2\xb2\xb3\xa8\x6c\x92\x60\x51\x48\x2f\xfd\x69\x42\x2e\x49\x4e\x12\xf2\x48\x54\xc5\x00\x97\x4e\x4f\x78\x14\x76\x62\xca\x06\x49\xc1\x3e\x4a\x9f\x31\x2f\x0d\xc8\xe3\xdb\x16\xba\xee\xa4\x98\x6e\xf8\xd9\x24\x5b\xe8\xba\xa8\x83\xbd\x7a\x90\xa0\xf0\xea\x9d\x97\xc2\x76\x8a\xaa\x39\x4c\x13\x51\xcc\xb1\xb8\x1e\x9c\xf8\x81\x15\x05\xe8\x7a\x87\x01\x45\xe1\xc9\x72\x4a\x51\xf6\x17\x3f\x27\x73\x0e\x3b\x13\x25\x54\xda\x9e\x3e\x65\xe9\xb3\x34\x09\xbe\x6f\xf1\xc4\xeb\xa7\xe1\xc1\xc7\xa9\xd0\x12\xb7\x2e\x9a\x9e\xa9\x55\x4d\xf3\x2a\xee\xfa\x9a\x6a\x74\x75\x7d\xa1\xa1\x07\x31\x11\x94\x75\xab\xb0\x37\xe8\x70\x24\xf1\x56\xbd\xa7\x69\x16\xee\xfd\xaf\xa1\xfb\xcb\x4a\xc6\x1d\x51\x14\x7d\xd8\xe8\xe6\x65\x65\x37\x94\x82\x51\xfe\x65\xbd\x6f\x42\x43\x7c\xf0\x42\xe5\xde\xb7\x56\x7b\x3b\xe4\x1e\x82\x85\xed\x16\x52\xe8\x17\x74\xf9\x19\xca\x3f\x90\x10\x09\x3e\xdf\x4e\xb8\x9f\xe4\xc7\x28\xef\x15\x7e\xa7\xfe\x04\x79\x85\xd7\xef\x42\x6d\xe1\xdf\xd0\xc5\x3d\xf5\x37\x49\x83\xa7\x46\x9f\x8f\x11\xeb\x2e\x57\x24\x51\x14\xf6\x5e\x90\xba\xa6\xa2\x28\xe7\x97\x2f\x6b\x51\x65\x5c\x6c\x35\x91\xa4\x3b\x72\x79\x9d\x3d\x10\xdf\xdd\xf5\x72\xdc\x58\x16\xc6\xda\x07\x39\x73\xd3\x25\x5f\x6c\xc4\xfc\x31\xe6\x9e\x6f\x45\x6b\xad\xeb\x7a\xf2\x5c\x8f\xc2\x9a\xff\x0c\xce\x31\x4c\x98\x87\x21\x80\x45\x8c\x74\xb9\x71\x2b\x13\x14\x5f\xe6\x57\xfd\x2a\x74\xf4\x1d\xba\xdd\x4e\x93\xe9\x7e\x12\xa0\xa2\xd7\x7a\xf5\x3c\x67\xea\x79\x7f\x1d\x4d\x32\xc4\xf7\x45\x1d\x37\x51\x3c\x30\xb4\x13\xd6\x51\x23\xb4\x7d\xc1\x58\x76\xee\x62\x20\x67\xde\xd5\x29\xca\xe6\x29\x3e\xcb\x91\x25\xed\x43\x94\x5f\x3d\xa1\xd0\x33\x5f\xf9\xb4\xa3\x14\x60\xe7\xe7\x80\x99\x09\x9f\xe7\x11\xca\x27\xb7\x4c\x0d\xf1\x01\xf4\xff\x11\x77\xbd\xbd\x6d\xea\x5e\xf8\xab\x30\x5e\xc1\x6f\x1e\x4b\x48\x93\x26\x54\x51\x55\x6d\xd3\x4f\x99\xba\x24\x77\xcd\x76\x37\x55\xd5\x44\x89\xb3\x21\x51\x5c\x11\xd2\xab\xe9\x26\xdf\xfd\xca\xc7\x7f\xb0\xc1\x26\xa4\xea\xd5\x7d\xb3\x35\x60\x8c\xf1\x9f\xe3\xc7\xc7\xcf\xe3\x53\x3c\xc0\xeb\x8e\x1a\x4f\xe3\xf4\x71\x7a\xdb\x81\x21\xfa\x0f\x1b\x0f\x3e\xea\xc4\xd6\xab\x8c\xe7\x4b\x36\x5f\x7b\xae\x2f\xd0\x7e\xda\xdc\x6a\x9b\xcb\xac\x84\x03\x33\x4c\x4c\xa8\xf1\x50\x4b\x9a\x05\x2b\xff\xa2\x1d\x52\x56\x49\x5b\x0c\x0b\xc2\x7e\xb0\xc6\x71\x52\xa6\x4f\x71\x89\xd7\xf0\xfa\xae\x07\x36\xf0\x55\x41\xf7\x52\xa8\x7c\x78\xba\xaa\x28\x03\xd8\x1e\x9b\x2a\xb3\xbe\x02\xed\x00\xde\xd2\x86\x96\xcd\x31\xe5\x44\x29\x25\xd1\x67\x7e\x8b\x97\xa6\x78\x46\x69\x96\xd7\x57\x73\x5a\x1a\x0e\x41\x0a\xda\xa3\x68\x0f\xe2\x82\xfc\x0a\x6f\xd2\xd1\xa4\x52\x81\x0a\x49\xf4\xae\xb4\xfb\x96\xa4\x15\xe7\x2a\xf9\x45\xc8\x16\xd3\x15\x4a\x2a\x75\x08\x34\x75\x2b\x03\xc5\x34\x56\xb4\xe2\x5b\xa1\xfa\x05\x9e\x4e\x2b\x0b\xc0\xd8\xdc\x1a\x6c\xf5\x18\xe3\x9b\x68\x14\x72\x15\x3f\x7b\x7e\xf4\x02\xc3\xd5\x37\xbf\xda\xf0\x36\xc3\xc1\x4c\xdd\x60\xe3\xb6\x4a\x49\x67\xc9\xda\x25\xb5\x93\x99\x17\x56\xf2\x5a\x6d\xf0\xd6\xbb\x64\x7b\x4b\x19\xc1\x59\x50\x92\x2f\x8f\x8f\xb8\x00\xda\x36\x90\xb3\x59\xe3\x39\x74\x24\xb8\xa2\xe7\x19\xc7\x9e\xb1\xaf\xef\xf7\x1e\x7e\x3d\x75\x1d\x6f\xb1\x5c\xcd\x16\xf3\xab\x6b\xdf\x55\xfb\x98\x75\x89\x64\x03\xca\x89\x31\xb5\xd9\x18\x18\x0b\x74\x29\xa9\xb9\x31\x50\x67\x39\x27\x57\xb2\x94\x8d\xb5\xf2\x5a\x72\x71\x03\x37\x72\x17\x80\x72\xe3\x2c\xfb\xcd\x59\x0e\xcf\xcd\xcb\x99\x6d\x9c\x0c\x6f\x4a\x07\x42\xd6\x21\x78\x14\x8e\xd9\xcd\x32\x5c\x40\x8e\xec\x6c\x60\xb1\xcd\x16\xef\x4a\xf2\x10\x97\x69\x42\xdf\x1d\x54\xfc\x3b\xe3\xa7\xda\xfb\x60\xf7\xca\xaa\x96\x75\xbf\xf3\xf8\x21\x4d\x14\x90\x7f\xa4\x8b\xcb\x0c\xa9\xc5\xa0\x43\xe8\xd2\xa5\xff\xee\xf8\xa1\xa5\xfc\x83\xb6\x9c\xca\x19\x39\x03\x07\x28\xf6\x5c\x30\xea\x3c\x52\x04\xe1\x46\xcd\xac\xde\xe3\xa7\x4b\xf7\x3d\x7e\xc2\x19\x79\x7c\xc0\x79\x69\xc8\xaa\x6f\xcc\xea\xe5\x65\x04\xcd\xea\x17\xdf\xda\xba\x22\x55\x01\x8f\x62\xf0\xcc\xb9\x01\xfa\x3d\x2d\xb3\xf7\x1f\xbe\x1a\x86\x97\xd1\x70\x63\x7d\x50\x41\x2e\x58\x57\x7f\xb5\x59\x7d\x4b\x41\x2a\xa3\x04\x6b\x98\xd6\x2c\x1a\xaf\x57\x59\xa5\xd4\x86\x7f\xe1\x5e\x30\xab\xcf\x42\x4d\x44\xe1\xa0\xb0\x96\x9d\xbc\x53\x4c\xda\xb4\x28\xd6\xc2\xfd\x23\x66\x5f\xed\x8e\xaf\x49\x9e\x1a\xf7\x8f\xd4\xcc\x9a\x21\xaa\xe6\xbb\x4c\x85\x53\x96\x96\xf4\xc6\x4d\x19\x17\x26\xa6\xb3\xa8\x38\xcb\x0c\xed\x49\x8a\x55\x1a\xcc\x7c\xdf\xe4\x63\xc6\x9a\x8f\x19\xef\xf7\xb9\xef\xed\x80\x06\xb5\x0d\x3e\xfb\xfe\x01\xe5\xfc\xa9\x75\x5a\x4c\x77\x41\xf6\xff\x90\xbb\x9b\x73\x85\xe7\xb4\x03\x9a\xd3\xc1\x47\xb9\x7f\x40\xc3\xc9\x64\x32\xe8\xe4\x26\xde\x19\xaa\x2a\xd1\xdd\xc4\xcc\x21\x4c\xa6\x85\x37\x1c\x8d\x27\x23\xe6\x25\xe6\xbe\xe3\xac\xf2\x08\x27\xa7\xba\x81\xc5\xea\xc3\xe0\x05\xc6\x35\x2f\x30\x97\xaa\x82\xbb\x17\x8b\x18\x06\x8b\xed\x8a\x6f\x66\x4f\x5f\xf5\x91\x14\xc7\xcd\x49\x2e\xae\x5f\x65\xb8\x28\xd9\x4d\xe5\x34\xcd\xf4\xf8\x61\x9a\xd8\x7c\xe0\xa5\xf4\x8e\x08\xc5\x8d\xed\x4c\xca\xd4\x46\x09\xa4\x78\xe1\x46\x92\xad\xe1\x7b\xa1\xf7\x88\x0d\x82\x59\xfe\xb8\x2b\xb9\xe7\x53\x78\x80\xb8\xc2\x03\xde\xa5\xfa\x7d\x94\xfe\xa9\x26\xb1\x5a\x16\x59\x89\x78\xbf\xbf\xbd\xe3\xce\x52\x53\x55\x8a\x05\x92\xd4\x0f\x7b\x24\x58\x05\x40\x58\x6c\xa0\x1e\xa4\x65\xad\x0d\x4e\xa6\x4b\x29\xc8\x83\x02\x00\x8f\x49\x3d\x44\x46\x97\xda\xaf\x16\xe1\x2f\x9d\x98\x99\xf4\x57\x97\x0b\xbe\xf0\x09\x95\x5d\x20\x21\x4a\xff\x8d\x9d\x82\xea\x0d\x96\x1d\x82\xf4\x94\x1d\x82\x46\x6e\xd6\x9d\x81\x46\x4a\xbd\x8b\x4e\x15\xb3\xb9\xd4\xee\x78\x5d\x1d\x92\x50\xe8\x6d\x74\x2b\x3b\xd7\xdd\xa1\xe9\xdd\xd7\x46\x5a\x3d\xeb\x63\x9b\x13\xa6\x51\xa5\x68\x57\x98\x94\xc3\x56\xcf\x27\x6c\x54\xb4\xbf\x87\x2b\x3a\x9a\x8a\x65\x3e\x6a\xad\x8e\x68\xc3\xe0\xec\x49\x57\x82\xc5\xd4\x5d\x28\x8b\x8a\x5a\xb1\x58\x97\x55\x4d\x05\xd7\x33\x5d\x9e\x94\xda\xf3\x23\x76\x80\xc9\x45\xaa\x69\x48\xb8\x8a\x85\x4f\x4d\x76\xab\xc6\x85\x15\x91\xaa\xd6\x27\x39\xc3\xf1\x5b\xab\x9e\x88\x57\x89\xf5\xc3\x6b\xee\x24\x78\x5a\xe9\x59\x41\x2a\x2b\xf1\xf9\x38\x5a\xdf\xbf\xa8\x6c\xe2\xab\x9e\xcf\xcf\xf0\xb1\xa4\xf0\xc1\x4c\x5d\xba\x8b\x1b\x07\xaa\x33\x12\x8b\x92\xd6\xf4\x51\xa1\xe9\x46\x5f\x12\x8a\xb5\x9a\x01\x03\x3a\x52\xd2\x3f\x67\xa1\x4d\x82\xef\x27\x6d\xeb\x28\x7d\xd8\x00\xcc\x04\x60\x68\x37\x7c\x22\x79\xd5\x4c\xd8\x37\x78\x5e\x4c\x93\x54\xcd\x05\xc3\xd0\x5b\x0c\xe8\x4d\x69\x90\xa9\xb6\x8a\x11\x4d\xeb\x4a\xb0\x76\x0c\xe2\xe9\xb0\x2e\xb3\xc0\xba\x4c\x85\x75\xe7\x61\x2f\x0c\x3b\xc1\xba\x1b\x43\x2b\xec\x24\xac\x93\x1b\xfa\x14\xde\x0d\xfb\xe7\xe3\x1e\xc3\x77\x1c\xc9\x51\x7c\x37\xe8\x8d\x07\x6a\x68\x8b\x4c\xe5\x09\x12\xe0\xde\xf5\x50\x88\xfa\x3e\x22\x82\x21\x68\x8c\x7c\x39\xa2\x09\x78\x5c\x03\x08\x3d\x49\x7f\x33\x76\x1a\x61\x1c\x3d\x1f\x8e\x95\x4f\xd0\x6e\xea\x79\x89\xca\xdc\xb0\x11\x36\x2a\x68\x86\x3b\xec\xf6\xa7\xc1\xaf\x20\x5e\xaf\xc5\x7e\x49\x6d\x06\x76\x9b\x67\x87\xb9\x28\xc7\x7f\x39\x79\x30\x9f\x79\xaf\xfa\xe8\xf6\xce\x67\x00\x1e\x1f\xbc\x8e\xe8\x3d\xf1\x0f\x28\x51\x54\x0b\x44\x11\x2d\x24\x4d\xd1\x42\x4c\xdf\xfd\x26\xe3\x2f\xbf\xbb\x43\xc0\xad\xde\x46\x7f\x83\x97\x33\x12\x91\x4a\x05\x2c\x88\x5c\xf1\x17\xbb\x06\xdf\x11\x29\x81\xe5\x0e\x42\xea\xd0\x67\x52\x87\xb0\x5d\xea\x50\x3d\xc8\x63\xab\xcb\x40\xad\x42\x84\xa0\xd1\x59\xbf\xe1\xfd\xde\xfb\x26\xe8\xac\x62\xc1\xcf\x6a\xd1\x81\x4f\x71\xf8\xa7\x70\x15\xc1\x7d\xb8\x1e\x8c\xce\xd6\xe1\xa4\xb7\xc1\xeb\x5e\xff\x2c\x19\x0c\x47\xe3\x64\x72\xbf\x99\xdc\xc7\xf8\x2c\x1c\xae\xcf\x87\xf1\xa8\x37\xe2\xec\xd7\xe1\x24\x0c\xc7\x83\xf1\x70\x38\xea\x0f\xc6\xfd\x51\x78\x1e\x99\xe8\xc6\xba\xb0\xe0\xdd\xf5\xe7\x1f\xab\xc5\xe2\x7a\x35\x5b\x46\xcd\x3b\xb3\x77\x8b\x79\x4d\x77\xa0\x5d\x36\xe6\x03\x87\xfd\x7c\x98\xaf\x6a\x29\x6e\x96\x57\xf3\xc8\xf9\x60\xf8\x58\xe9\x6d\x52\x22\x35\x5d\x2d\x67\xce\x16\x74\x36\x10\xac\x10\x1c\x21\x5f\x3f\x6d\x03\x47\x2f\x0d\x64\xda\x2c\xa0\xa9\x24\xc6\x14\x91\x89\x74\x2d\x45\x12\x67\xf5\x0b\xc3\x86\x6a\xa2\x7e\xe5\x7f\xa3\xa8\xcf\xfe\xe2\x8f\xf4\xc5\xef\x2a\x97\xb0\x71\xe9\xad\xf1\x5a\x5f\xcf\xea\x6d\x95\xb7\x92\xe8\xac\x62\x8a\xd3\x0e\xb8\x62\x36\x84\x03\x45\xd0\xba\x48\x75\x4d\x9a\x6f\xc8\x9b\x24\x2d\x12\xe0\x83\x72\x59\x4d\x18\x8a\xbe\xbb\xe4\x3c\x40\x17\xb9\x25\x79\x7c\xc3\xd5\x37\x49\x56\xf0\xb0\x63\xd9\x4f\x17\xb1\xd8\xbe\xb3\x0d\x84\x2c\x53\x04\x0e\x22\x5a\x36\x7b\xe0\x5d\xf5\xcb\x45\x2e\xd3\xf5\x1b\x8d\x05\x0c\x20\x6e\x5d\xe6\xd6\x64\xdd\xcb\x77\x77\x8c\xa4\x4d\x04\x47\x7b\x03\xa7\x03\xf4\x6a\x16\xd8\x18\xb3\x9c\x08\xce\xb6\x88\x58\x4e\x2f\x41\xbc\x72\x14\x8a\xbb\x8d\x98\xc7\xcc\x6e\x0f\x6b\xb4\x6e\xc2\x02\x1e\xa3\xac\x25\x4c\xf9\x59\xc3\xc8\x2b\xbf\x79\xb4\x18\x4b\x80\x72\x22\x28\xd7\x5c\x61\x32\x14\x8f\x28\x81\xb5\x09\x8f\xda\x89\x5c\x36\x14\xb5\x39\xc5\xf8\xbf\xe0\x31\x93\xf6\x28\x9c\x44\xb0\x97\x09\x27\x2f\xc3\x1b\xe9\xcf\x3f\xca\x95\x37\xa8\xf3\x77\xf3\xe0\xc7\x77\x94\x07\x1f\xaf\x51\x1e\x6c\x7f\xa2\x18\x22\x92\xc5\x10\xec\x2c\x86\x58\x67\x31\x30\x7b\xe3\xe0\xfe\xd3\x13\x8a\x21\xd4\x59\x0c\xe1\xca\xf2\xe0\xcf\x0c\xc5\x10\xac\x2c\x0f\x3e\x7e\x44\x79\xb0\x43\x71\x2d\x82\x18\x50\x35\x13\x98\x7b\x0e\x9e\x7f\xf1\x4f\x00\x00\x00\xff\xff\xa5\x4f\x00\x51\xba\x16\x04\x00") - -func bindataTkgWebDistTkgkickstartui651es51191a3c343f5b6f4c3bdJsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui651es51191a3c343f5b6f4c3bdJs, - "tkg/web/dist/tkg-kickstart-ui/651-es5.1191a3c343f5b6f4c3bd.js", - ) -} - -func bindataTkgWebDistTkgkickstartui651es51191a3c343f5b6f4c3bdJs() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui651es51191a3c343f5b6f4c3bdJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/651-es5.1191a3c343f5b6f4c3bd.js", - size: 267962, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui742es2015Fed85f8921ac5074e243Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x89\x7e\xdb\xb6\xb6\x28\x0e\xbf\x0a\xc3\xdb\x93\x2d\xed\xc2\x0c\xe7\x41\xfe\xb4\xf3\xb9\xb6\x92\xa8\xf5\x54\x4b\x4e\xda\xa6\x3e\x0e\x48\x82\x12\x1b\x8a\x54\x48\xc8\x43\x6d\xbd\x43\xdf\xa0\xef\xd6\x27\xf9\xff\x00\x70\x1e\x24\x39\x4d\xf7\xee\x3d\xf7\xfc\xf6\x39\x75\x04\x62\x58\x58\x58\x58\x58\x58\x58\x43\x2f\x41\x81\x27\xdc\x22\x7b\x09\x9d\x8f\x87\xf3\x55\xf8\x11\x7f\x9c\x5d\x7f\xf4\x9d\x8f\x09\x86\x31\xbe\x5e\xf9\xc3\xad\x35\x1e\x1f\xdf\x5f\xf5\x85\xe5\x2a\x99\xf7\xde\xbf\x37\x54\xf9\x0a\x3c\xa8\x96\xaa\x19\x03\x6f\x15\x3a\xd8\x8f\xc2\x1e\x02\xb8\xff\x70\x03\x63\x2e\xde\xbf\x89\x7c\x97\x13\x9f\x0d\x87\xbd\x78\xd8\xcb\x2b\xf4\x1f\xf8\x55\x82\xb8\x04\xc7\xbe\x83\xf9\xfd\xac\x9c\xc3\xa4\x29\x88\x59\x63\x7f\x18\xa2\x5b\xee\x87\x93\xe3\x37\x18\x2f\x2f\xd0\xa7\x15\x4a\xf0\xbe\x2f\x44\x4b\x14\xf6\xf8\xd7\xa3\x29\x0f\x50\x1f\xf8\x42\x8c\x92\x65\x14\x26\x68\x7a\xbf\x44\x43\xde\x0e\x22\x9b\x07\xbe\x10\x85\x41\x04\xdd\x61\x69\xc4\xa0\x57\xd4\xa5\x83\xac\x69\x35\x14\xc7\x51\x5c\xae\xe7\x44\x61\x12\x05\x48\xa0\x1f\x7a\xbc\x13\xad\x02\x97\x0b\x23\xcc\xb9\xd1\x2d\xed\x94\xf3\xfc\x00\xf1\xb4\x79\x82\x42\xb7\xd7\x5f\xe7\xf0\xc7\x3d\xc4\x60\xc7\x6d\xb0\xe3\x14\xf6\x37\xa3\x83\x23\x1e\x20\xf0\x4c\xea\xef\xe3\xf8\xfe\x01\x67\xfd\x38\x10\x3b\xf3\x5e\xdc\x7f\x58\xc7\x08\xaf\xe2\x90\x93\x45\xf1\xff\x37\xc4\x42\x82\x21\x5e\x25\xcf\x9f\xcb\x96\xf5\xaf\xfc\x67\x31\xaa\x4f\x46\x25\x1d\x21\xc1\xf5\x93\x25\xe9\x64\x74\x83\x42\xdc\x23\x30\x9c\x44\xab\x04\xb1\x9f\xbc\x13\xf8\xce\x47\xbe\x5f\x1a\x88\xc1\xea\x46\xce\x6a\x81\x42\x2c\x38\x31\x82\x38\xab\x5d\xb4\x4c\xf8\xfe\x3e\x16\xfc\xd0\xc7\xcd\xde\xc0\x33\x91\xfc\xdf\xad\x1f\xba\xd1\x2d\x10\xe9\xff\x4c\x11\xc8\x22\x78\x26\x15\xff\x27\x82\x70\x15\x04\x7d\x50\x87\x10\xf7\xd7\x6b\x02\x43\x38\xe4\x23\xfb\x17\xe4\x60\x7e\x38\xc4\xf7\x4b\x14\x79\x1c\xeb\xf1\xf9\x73\xf6\x57\x60\x7f\x86\xc3\x21\xfb\xc7\x4b\xf6\x67\xd0\x68\x46\xc8\xf7\xf9\x73\x4a\xc4\xe4\x3f\xc3\x21\x25\xe8\x97\xe4\x3f\xcd\xca\xb3\x20\xb2\x61\xf0\xfc\x39\xfb\x2b\xb0\x3f\xc3\xe1\x90\xfd\xe3\x25\xfb\x33\x60\x34\x0c\xa2\x61\x28\x84\xf0\xc6\x9f\x41\x1c\xc5\xcf\x9f\xbf\x38\x81\x8e\x1f\xe2\x28\x99\xbf\x10\x30\x4a\x70\x2f\xff\x26\xac\x12\x14\x1f\xcc\x50\x88\xfb\xcf\x9f\xbf\x38\x58\x2e\x03\xf4\x0e\xd9\xdf\xf9\x78\x63\xc5\x67\x2f\x26\xd0\x83\xb1\xbf\xa1\x12\x08\x86\xa1\x90\xc0\x1b\x74\x90\x3c\x3e\xf6\xb2\xd9\x3c\xab\x62\xec\xf1\x91\xfd\x7d\x36\x1c\x86\x2f\x4b\x74\xbd\x1e\xf0\x19\x05\xf3\x7e\xc8\xbd\x99\x9e\x1c\x1f\x84\xce\x3c\x8a\x47\x01\xa2\x8b\xbf\x8c\x23\x1c\x91\xae\x9e\x3f\x7f\x16\xbd\x2c\x6d\xe6\x08\x04\x8c\x52\xe0\x30\x14\x2e\x2f\x8e\x1f\x1f\x43\xc2\x20\x3e\xfa\xf8\xf2\xe2\x18\x24\x0d\xf2\x61\xfd\xf5\x78\xc8\xf7\xf7\x13\x21\x1b\x74\x18\x0d\xa3\xc7\x47\x24\x84\x70\x81\x1e\x1f\x0b\x58\x40\x22\xc4\x28\x18\xf2\x61\x44\x76\x07\x8a\x79\xc0\x13\xbe\x10\xce\x8a\x65\x42\x2f\x7b\x89\x30\x8f\x91\x37\x44\x20\x11\xa2\xd8\x9f\xf9\xe1\x70\x38\x0c\x22\x07\x12\x10\xd3\x92\x97\x7e\x2f\xe9\x0f\xe2\xb4\x6a\xff\x25\x4e\x41\x1f\xf8\xbd\x04\x24\x02\x86\xf1\x0c\xe1\x21\x7f\x6d\x07\x30\x24\xbb\x60\x90\x75\x0a\x53\xc0\xcf\x28\x3e\x2f\x2f\x8e\x7b\xa8\x0f\x12\x84\xa7\xfe\x02\x45\x2b\x5c\x66\x5b\x50\x88\xd1\x4d\xf4\xb1\x54\x35\x1d\x6d\x0d\x54\xa4\x76\xb5\x22\x80\xad\x81\xd8\xef\xaf\x07\xfc\x22\x99\xc0\x1b\x74\x16\x9f\x2d\x51\xf8\x0d\x61\x56\x7e\xc8\xe5\x6b\x5d\xc6\x7a\x08\xa2\xfe\x83\xef\xf5\xc2\x61\xd8\x8a\xb6\x0c\x4b\xf9\xf2\xa3\x7e\x41\x33\xf5\x51\x7a\x55\xde\x9c\xb2\x17\x46\xd8\xc3\xe1\x10\xbf\xc4\xc3\x07\xb8\xc2\xd1\x37\xd1\x62\xf0\x4c\x5a\x0f\x1a\xb4\x85\x9f\x3f\xef\x65\x9c\xf1\x16\xc6\x61\x8f\x3f\x42\xcb\x18\x39\x10\x23\x77\xc0\x8d\xee\x96\xc8\xc1\xc8\xe5\xf0\xdc\x8f\x5d\x0e\xc6\x33\x4a\x10\x1c\x8e\x38\x1b\x71\x90\x4b\x7b\xeb\x83\xf2\x30\x78\xdd\x07\x58\x48\x7f\x3e\x7f\xfe\xe2\xbf\x7f\x4e\xfe\xd9\x7b\x39\xc0\xe8\x0e\xff\xfc\xe2\xe7\xc9\x3f\x1f\xe1\x72\x19\xf8\x6c\x89\x7f\x7e\x71\xb7\x08\x1e\x7f\x9e\xfc\x93\x7e\xf9\xf9\xeb\xbb\x45\xd0\xff\x39\xf9\xe7\xbe\xf0\x4f\x67\x0e\xe3\x04\xe1\x9f\x93\x7f\x0e\x7f\x4e\xfe\xb9\xc2\xde\x9e\xf9\xc2\x67\x5b\x08\x09\x04\xf8\xfe\x4b\xc2\x06\x29\x12\xde\xf3\x3f\xaf\x3c\xe4\x79\x3c\x40\x57\xe0\x81\x7c\x1c\xb0\x3a\xeb\xfe\x00\xad\x09\xb9\xf4\x41\xd8\xdf\x47\x41\x82\x38\xdf\xeb\x11\x6e\xde\xc7\xe9\x52\xd0\x52\xba\x0b\x82\x8d\x04\x1f\x64\x84\x1a\xd4\x29\xae\x93\x38\x82\xfe\xba\xbf\x5e\x97\x8f\xcf\x18\xf8\x64\xcf\xf9\x5e\xaf\x17\x0c\x83\xc7\x47\x76\x6e\xf0\xa0\x20\xde\xe7\xcf\x7b\x81\x90\xc3\x81\x7d\x1c\xa0\x61\xa9\xc0\x8e\xdc\x7b\xc1\x0f\x43\x14\x4f\xd1\x1d\x1e\xe6\x64\xe3\x87\x33\x41\x10\xf8\x7e\xcb\x1e\xeb\xa7\x44\x81\xd9\xf8\xfd\x7d\xb6\xe3\xf9\xd2\x2a\xbc\x88\x1c\x8c\xf0\x5e\x82\x63\x04\x17\xfc\x70\x38\x64\xd8\x03\xc9\xf0\x05\xa1\x0d\x1c\xaf\x1c\x1c\xc5\x19\xfa\x43\x81\xf0\x98\x14\x39\x7d\xc2\x34\x12\xca\xe0\x80\x33\x7c\x71\x18\xfb\x67\x93\x9f\x5f\xbc\xff\xd9\xbd\xfa\x7a\x03\xc3\xdb\x27\x18\x70\x1e\x1f\xe1\xf3\xe7\xc9\xe3\x63\xd4\x7f\xfe\x9c\x5f\x85\x2e\xf2\xfc\x10\xb9\x05\x6d\xbe\xf2\x03\x74\x81\xa0\x8b\xd2\x03\x6d\x49\x0f\xdf\xa2\x74\x7f\x99\x8a\x03\x28\xac\x48\x04\xa4\x2e\x1a\x2e\x89\x54\xb0\x0a\xf0\x3e\x1a\x3a\x2f\x09\x41\xc4\x68\x19\x40\x07\xf5\x5e\xfc\xb7\x0b\x31\x1c\xbc\xff\xef\xfd\xab\x7f\xee\xbf\x00\x3c\xfd\x05\x31\x86\xce\x9c\xcc\xe8\x05\x11\x03\xf6\xf9\x3e\x08\x5e\x06\x42\xce\x8a\xd8\xe2\x0f\xb2\xdf\x84\x0e\x86\xe4\xe8\x5b\x03\x32\x0e\x74\x0f\x92\x23\x88\x21\xe3\x31\xeb\x9c\xa4\xdc\x36\xc6\x3a\x1d\xba\x2d\x8c\x69\xbf\x3c\xdc\x70\x3a\xa8\x8e\x3c\x4d\x87\xeb\xa0\x35\xb7\xc1\xbe\xa6\x29\xe7\x5a\xaf\xfb\xfb\xd9\xd9\x32\x0c\xf2\x7f\x00\x24\xa0\xbb\x65\x14\xe3\x64\x18\xac\xfb\x02\xa1\x85\xfb\x1e\x06\xef\xaf\x28\x05\x16\x1f\x89\x34\xa5\x68\x8a\x25\x57\x84\x40\x22\xc9\x55\x04\xbd\x58\x70\x7b\x18\x3c\xbc\x19\x94\x60\x4a\xc9\x2e\x21\x10\x30\xb1\x2f\xee\x19\xaa\xa4\x1b\x7d\x10\x0e\xe3\x9e\x24\xea\x8a\xd5\x07\xd1\x30\xee\x29\xa6\x66\x2a\xe4\x10\x8c\x7b\x8a\x68\x2a\x72\xbf\x10\x1c\x21\xe3\x6b\xbe\xd7\x93\x9e\x23\x26\xc3\x61\x0e\x0d\x43\x61\xb4\x7c\xd5\x23\x33\x9b\xce\x7e\xea\x89\x80\x77\xfd\x1b\x1e\x48\x7d\xc0\x0a\xa4\xb4\x40\xce\x0a\xe4\xb4\x40\xc9\x0a\x94\xb4\x40\x25\x05\xd7\x97\x3f\xf5\x54\xc0\x3b\x41\xbc\xe7\x3b\x51\xc8\x03\x8d\x94\x7e\xfa\xe9\xa0\x97\x55\xd7\x00\x9f\x2c\x61\xc8\x03\x9d\x94\x4c\x8e\x6e\x7a\x3a\x30\xca\x95\xea\x7f\x49\x23\x03\xf0\xf6\x0a\x63\xd2\xa1\x49\xca\x4e\xdd\x6f\x73\xe1\xaa\x89\xa7\x50\x38\x7c\x73\x42\x0e\xa8\x50\x88\xee\x6e\x7b\x7d\x26\xa7\x9e\x46\xd8\xf7\xd2\x5d\xca\xe8\x2d\x03\xd8\x2c\x03\x6c\x35\x60\x58\xfb\x5e\x4f\xae\xa2\x8c\x76\xbb\x1f\x0a\x77\x4b\xbd\x47\xe7\xb1\xfc\xfe\x6d\x0f\x35\xc7\x21\x9f\xbe\xc7\xd3\x9e\xde\x5f\xaf\x03\x84\xb9\x64\xd8\xeb\xf5\x87\xff\x7a\x70\x02\x98\x24\x1c\xe2\xd0\x1d\x46\xa1\x9b\x70\xbe\x80\x1f\xc2\xd9\x59\x38\x0e\x7d\x4c\xe4\x90\x4c\xb8\x45\xc2\xcf\x2b\x51\x36\x34\x0f\x3a\x15\x39\x1d\x61\x0e\xef\xa7\x75\xf2\xf2\x38\x43\x40\x0f\x3f\x3e\xf6\x30\x11\xc5\xb4\x5f\x09\x7f\xee\xf7\xe2\xc7\x47\xd4\x5f\xaf\x7b\x44\xba\x64\x3d\x3a\x8b\xe5\x30\x14\x7e\x58\x2e\x7a\x29\x93\x07\x09\x0a\x10\xe1\x4d\xc9\xe0\xfd\x7b\xc2\xd1\xf6\xe8\x6c\xf6\xc2\xd2\x74\xf8\xab\x2b\xe0\x87\xcb\x15\x4e\x06\x0f\x8d\xb9\x0e\xf8\x46\x11\xbf\x06\x1e\x82\x78\x15\xa3\x64\xf0\x3e\x14\x3e\x9d\xfd\x72\x05\x5c\xe4\x04\xc9\x40\x02\x37\x30\x26\x7f\x28\x4e\x93\x41\x6d\x72\x28\x9b\x1c\x1a\x7e\x45\x76\x6f\xe0\xff\x8a\x3e\x0c\x9c\x28\x0c\x91\x83\xb9\x1b\x07\x85\x18\xc5\x9c\x07\xfd\x60\x15\x23\xae\x0c\xe2\x1f\xbf\xfd\x2e\xd9\xb6\x23\x99\xaa\x2e\x1a\x92\x21\x6b\x92\xa5\x8b\x50\x51\x44\x09\x19\x86\x68\x40\x5b\xd2\x5c\x43\x75\xa1\x69\x6b\x7f\xfc\xf6\xbb\x2a\x6b\xba\x6e\x19\x86\x28\xe9\x86\xae\x6b\x86\x6c\xa9\x03\xee\xab\x07\x72\x06\x7a\x9e\x2b\xb2\x3f\xfc\x7a\x30\x3e\x9d\x8e\x2e\xce\xcf\x8e\x0f\xa6\xe3\xb3\xd3\x01\xf7\x01\xbc\x7f\xcf\xd3\x35\xe4\x01\x0f\x03\x14\x63\x8e\xfe\x77\xcf\x85\xe1\x8c\x8a\x67\x71\x14\xa0\xec\x1b\x0f\x54\xc0\x87\xb3\xb1\xc7\x5f\x81\xf7\xb5\x2f\x52\xfe\x2f\xbe\xd2\xc3\x15\x78\x9f\x7d\xda\xf3\x31\x5a\x24\x8d\x12\x2a\xdd\x40\xec\x3b\xd5\x2f\x4e\x14\xee\xdd\xc6\x70\xb9\x64\x9d\xf0\xc9\x1c\x2e\xc9\x78\xe8\xce\x09\xe0\x82\xa2\x68\xcf\xf1\x63\x87\x00\x51\x69\x55\xe9\x86\x08\x18\xfc\x15\x40\xe0\x3d\x4f\xa8\x83\x2f\xb6\x1f\x0f\x63\x1f\xee\x05\xd0\x46\x01\x0f\xf8\xc3\x20\x4a\x58\x47\x0e\xfb\x97\x02\xd2\x6d\x49\xc6\xa6\x55\xe7\xbe\xeb\x22\xd2\x10\xc7\x2b\xd2\x51\x06\x10\x6b\x70\x75\xb5\x06\x18\x2d\x96\x01\xc4\xa8\x76\x39\x96\x9e\xa3\xe7\xcf\x43\xe1\xc7\x53\xa7\x27\x02\x08\x2c\x90\xb1\x22\xb1\x0f\x64\xf6\xed\x7b\xfd\xdb\x1e\xc3\x2c\xc0\x2d\x9b\x6f\x0d\x5c\x3f\x46\x0e\xf6\x6f\x08\xfd\x45\xc2\x99\x06\x02\xe1\xd3\xcd\x31\x08\x84\xb1\xf5\xeb\x15\x40\xa1\x03\x97\xc9\x2a\x60\xe4\x2b\xaf\xfb\x00\xad\xfb\xbd\xfe\x1a\x48\x86\xaa\x98\x9f\xcd\xa6\xc3\x32\x9b\x66\xbc\x79\x9f\x10\x75\x58\xdd\xfc\x0f\x25\x79\x80\xde\x4e\xe7\x7e\x22\x20\x26\x0a\x0c\x89\x30\x4b\xe0\x4e\x45\x83\x75\x14\x7e\x87\xee\xed\x08\xc6\xee\x88\x90\x7e\xbd\xbe\x40\x91\xde\xeb\x97\xea\x4d\x96\xe4\x80\xee\xaa\xb7\x91\xc1\x14\xd2\x6f\x88\x6e\x09\x33\x41\xfd\x9e\x2f\xfc\xa8\xe8\x3d\x5f\x98\x7c\xf3\xa9\xdf\x5f\xe7\x6c\xc4\xf5\xe3\xa1\x2f\x04\xaf\xe5\x76\x36\xc2\x03\xfe\x63\x0a\xcf\xb1\x9f\xe0\xf4\xee\x42\xd8\xc8\x3c\x4a\xf0\x37\x7e\x48\xa4\xad\xa4\x6d\xe1\x7d\xc6\xe3\x3f\xa2\x7b\x22\x97\x09\x74\xc3\x97\x78\x3d\xca\x41\xc4\x42\x13\x37\xeb\x7e\xd1\x32\x21\x78\xd8\xda\x32\xc3\x16\x91\x32\x73\x32\x90\x2d\xa4\xec\x44\x05\xd3\x16\x2a\x80\x15\x2a\xd0\x64\x2d\x3d\xac\xa9\x1e\x88\x1e\xd6\x42\xd8\x0b\xd9\x51\x5d\x22\x12\x58\x23\x12\x26\x3d\x30\xc4\x20\x61\xe9\x2f\x51\xaf\x27\x02\x5f\xf8\xd4\xef\x49\xfd\xbe\x90\xac\xec\xc4\x89\x7d\x1b\xf5\x10\x69\x44\x0f\x28\xa6\x58\x61\xd2\x7c\x2e\xc4\xf3\x64\x4b\xbf\x58\x06\xd0\x0f\xf7\xd3\xfb\xc0\x90\xde\x04\xf8\x75\x7f\x3f\xea\xf5\x53\x71\xa6\x87\x01\xef\x44\xa1\xe7\xcf\x84\x7b\xb8\x08\x78\xb2\xd4\xc3\x7f\x3d\xe0\x1e\x3f\x22\xdb\x8b\x43\xa1\x13\xad\x08\x96\x91\xcb\xdd\xce\xfd\x00\x71\x54\xfc\xf2\xc3\x19\xc7\x20\xa5\x9a\x9f\x01\xc7\x7f\x8d\x04\x1c\x4d\xa8\x00\xdd\xeb\x53\xb4\x3e\x91\xe2\x0a\x1a\x5b\xc6\xd1\xcd\x30\x10\x7e\xfc\xd5\xe8\x3d\xe0\xe8\x23\x0a\x07\x08\x78\x90\xd0\xd8\xfd\xa0\xd4\x1b\x20\xf5\x7c\x17\xb9\xe3\x70\xc0\xc7\x51\x84\xf9\x62\x25\x15\x4d\x93\x76\x93\xbb\x7e\x6c\x59\xca\xa0\x63\x29\x65\x45\xd3\x98\xd8\x55\x5a\xc0\xa0\xb6\x80\xfe\x82\x2d\x60\x3f\x5f\x1d\xb2\x21\x41\x5c\x17\xc0\xe3\x76\x01\x1c\x0b\x6e\x34\x66\x5d\xc4\xa9\x14\x0e\x08\x72\xe2\x54\x54\x26\x77\x97\x1e\x12\x08\xd6\xfb\xeb\xbc\x2a\x25\x17\x36\x5e\x3c\xe4\xf9\xaf\xd1\xfe\x33\x2c\xdc\xc0\xc0\x77\xc9\xed\xa1\x87\x69\x7d\x7a\x5f\x06\x71\xff\xf1\x11\x0b\x36\x74\x3e\xa2\xd0\xed\xc5\xfd\x6d\x34\x46\x76\xcd\x64\xe5\x38\x28\x49\x7a\x58\x40\x37\x28\xc4\xe9\x4f\x50\xee\x16\x65\x94\x23\x44\xe1\x2b\x76\x4e\x67\xd5\xd3\x9f\xf5\xea\xfd\xf5\x72\x65\x07\x7e\x32\x67\x73\xc8\x1a\xa5\x6b\x15\x0a\x3f\x09\x0b\x94\x24\x88\x1c\x8f\x42\x5a\x33\x67\x3a\x4b\x78\x4f\x70\x37\xe8\xa4\x52\xb6\x0a\x84\x4c\xc9\x98\x1c\xff\x35\xfe\x9a\x27\x54\x1a\x97\xa8\xb4\x0e\x41\x36\x4b\x8a\xcc\x1d\xc7\x27\x37\x97\x74\x30\xe4\x72\x5e\x1c\x2d\xf2\x01\xff\xfc\x1e\x88\xfe\xd4\x1e\x90\x75\xb1\xa6\x80\xee\xda\x03\x93\x96\x3d\xb0\x2c\xef\x01\x46\xf8\x61\x71\x0b\x21\x7b\xc0\x34\x2d\x59\x2c\xf3\x33\x00\xf3\x0b\x49\x71\x0b\x49\xca\xb7\x10\x7a\x43\xbf\x0f\xef\x7a\xa4\x5d\x76\xdd\xc0\x31\x9f\xfd\x92\x01\x8f\x5d\x7a\x53\x08\x84\xeb\xd5\x65\x8f\xdc\x6c\x52\xd9\x9c\x55\x50\x6b\x15\xb4\x72\x85\xec\xef\x37\xdf\x7f\xec\xf5\xa9\xcc\x50\x88\xf0\x58\xf8\xca\x5f\x90\x4b\xbb\x8f\x41\x3c\x0c\xd2\x7b\x42\x51\xe6\x67\x65\xfb\x01\x15\xf2\xe9\xc8\x67\x9f\x56\x3d\x5f\xb8\xf5\x7f\x65\x47\x4d\x7c\x2f\x24\x18\x2d\x93\xf7\xf1\x95\x40\x05\xa2\xe4\x3d\xba\x22\xf5\x48\x03\x79\x4b\x03\xcf\x47\x81\x4b\x1a\x50\x6d\x6f\x00\xef\xfb\xeb\x42\x5b\xed\x6c\x45\x52\x26\x08\x05\x95\x3b\x99\x94\x15\x28\x80\xc7\xd0\x26\x32\x9e\x56\x42\x95\x03\x97\x54\x2a\x6f\xc5\x16\xa9\xa3\x03\x1e\xcf\x11\x74\xf3\x05\x30\x2a\xcb\x61\x92\xcf\x25\x6c\x5b\xf5\xf6\x92\x58\xab\x21\x49\x6d\x0b\x52\x69\x42\xd6\xd8\x8e\xdc\x7b\x3a\x0a\x11\xf6\x24\x05\x24\x40\x07\x32\x91\x99\xf7\x9c\x28\xc4\xd0\xa7\x62\x83\xba\xa9\xab\x27\xaf\x75\xba\xae\x5a\xb6\x4c\x71\x65\x99\xa8\xb2\xa8\xbc\x9c\xea\x8e\xf5\xe4\xf6\x7a\x2e\x22\x1c\x94\x62\xbf\x51\x3b\x15\x62\x5f\x45\xf1\x99\xc7\x83\xb8\x85\x5c\x0a\x22\x39\x8b\x5d\x14\xa7\x77\xc9\x65\xc7\x5d\x32\x14\x70\x45\xb4\xec\x3f\x24\xab\x25\x8a\x7b\x82\x20\x64\x4a\xc7\xa4\x0f\xa8\x54\xb8\x84\x33\x34\xa5\x7a\x31\x9e\x5f\x97\xee\x9f\x7e\x85\xd9\x15\xfc\x3f\x12\x8e\x85\x6f\x2e\x0e\x4e\x8f\xc6\xa7\xaf\xaf\x0f\xdf\x1c\x9c\xbe\x1e\x1d\x31\x2e\x5f\xed\x0d\x09\x29\x43\x14\xec\x18\x52\x19\x8f\x61\x6a\xcd\x86\x5d\x85\x79\x97\x29\x20\xa5\x39\x0f\xc9\xe0\xab\x04\xc5\x84\x95\x4e\x50\x7c\xe3\x3b\x48\x88\x11\x8e\x7d\x74\x83\xde\x15\xf5\x7a\xa5\x86\x5b\x38\xeb\xae\x17\xe6\x60\xdb\x85\x39\xd8\x7c\x61\xa6\x82\x53\xbc\x68\x5c\x95\x19\x90\x03\x9e\xfd\xad\x5c\x8a\x83\xf2\xa5\x58\x63\x97\x62\xf9\x49\x97\x62\xfa\xe4\xc8\x11\xdc\x73\xb7\x28\x70\xa2\x05\xe2\x28\xae\xff\xf8\xed\x77\xd1\xb1\x45\xd1\x95\x15\xdb\x52\x10\x52\x45\x4b\x34\x90\x69\x3b\x92\x2b\x8a\x10\x59\x48\x11\x2d\xd9\x30\x10\x44\x12\xb9\x08\x6b\xa2\x62\x1a\xaa\xa9\x5a\x86\x64\x88\x86\x21\xa9\xd6\x60\xfb\x3d\x78\x8f\x3b\x64\x53\xe6\x26\x08\x93\xd3\x35\x21\x37\x63\x89\xa9\x53\xe2\xe8\x36\xbd\x53\x92\x5f\x4e\x14\xec\x49\x72\x71\x2d\x0c\xd0\x0d\xbd\x41\x4a\xf9\x95\xd2\xbf\xa1\xf7\xe2\x24\x41\x31\xb9\xf9\xb0\xeb\x27\xbd\x39\xbf\x8a\xc8\xad\x21\xdb\x22\xac\x4f\xc6\xde\xd8\xbf\x03\xe4\xe1\xad\x37\xc9\x5e\x50\x51\x70\x35\x98\xa9\x54\x62\xa6\x73\x99\x2a\xbc\x02\xaa\x9e\x52\x80\xb2\x89\xe3\x10\x96\xa5\x02\x07\x48\x2a\xbb\xe6\x57\x59\x56\x7a\x55\xed\x95\x4e\x91\xe5\xf7\x6f\x7b\xb8\xd8\x2c\x94\x05\xe0\x29\xfb\x46\x2a\x49\x4d\xa6\x80\xab\xcc\xa4\xcc\x0b\x6a\x97\x5c\x28\x24\xb3\x2b\x90\xe0\xfb\x80\xfc\xe2\x05\x8a\xa6\xf7\xd7\xe1\x8c\x40\x85\x42\xbc\xf7\x5f\x87\x67\x27\xe7\xff\x75\xc5\x71\x1c\x9e\x0b\x04\x71\x2d\x1f\x07\x9e\x1f\x27\x78\xcf\x99\xfb\x81\x0b\xb8\x8d\x7d\xb8\xbb\xf4\xf1\x70\xeb\xbb\x78\x3e\x50\x44\x71\x79\xb7\xfe\xff\x2f\x90\xeb\x43\xae\xb7\x80\x77\x7b\xac\x9c\xd3\x0c\x7d\x79\xd7\x7f\xf8\x5b\x01\x2b\x69\x04\xd8\x35\x7b\x20\xd8\xc3\xf3\x96\x56\x0f\x76\x44\x96\x80\x90\x76\x00\x97\x09\x1a\x24\x68\x09\x63\x88\xd1\x7e\xfa\x01\x47\x84\x27\x04\x51\x3c\xf8\x3f\x8e\xe3\x94\x4b\xe9\x02\x0d\x92\x28\xf0\xdd\x72\x71\x3a\xf4\xf2\x6e\x4d\xa7\xd1\x39\x99\x07\xfa\x61\x2f\x80\xf7\xd1\x0a\x0f\x3c\xff\x0e\xb9\x5b\x5a\xd0\xe9\xb7\xf5\x74\x1b\xc5\x2e\x55\x18\x0d\xec\x18\xc1\x8f\x7b\xe4\xf7\x9a\xbf\x2a\xc4\x46\x43\x52\x24\x71\x27\xb1\xf1\x72\xdb\xd5\xa9\x10\x1b\xcb\x1a\x6b\xa6\xa6\x6e\xbb\x3a\x95\x35\xa2\x4e\x80\x20\x3d\x12\x0e\x99\x06\xe3\xa1\xed\x98\x70\x51\x80\x70\x7a\x48\x90\xf2\xca\x19\xc1\x4e\x9a\x68\x89\xc2\xe1\x33\x69\xbd\x4a\xd0\x04\xde\x20\x77\x5b\x97\xab\xa5\x0b\xb3\x2e\xa7\xfe\x02\x25\x18\x2e\x96\x1b\xfa\xfd\x7c\x11\x7f\x07\x8d\x6c\x32\x87\x31\x72\xf7\xd8\x34\xf7\x5c\x88\xe1\xde\x32\x5a\xae\x96\x1b\x0f\x9b\x54\xe1\x2a\xd7\x0e\x97\xf7\xef\xa9\xae\x2e\x3e\x89\x5c\x18\x9c\x2d\xa9\x8a\x2e\xfb\x79\x18\x44\x09\x13\x1f\x2b\x35\x0e\xe7\x30\x9c\x65\x4c\x77\x41\x4a\xf7\xe8\x51\x53\x29\xa1\xb2\x5c\xb9\xc0\x8b\x22\x9c\x2a\x23\x6b\xba\x44\x09\xf0\x36\x26\xe3\xda\x38\xdc\x8b\x56\x38\xf0\xc3\xba\x0a\x71\x53\x8b\x65\xec\x2f\x60\x7c\x5f\x6e\x71\xb5\xf9\x08\xc8\xdf\x38\xc8\x89\x44\xa1\xa3\x07\x41\xfe\x9e\xd0\x98\x6a\x87\xda\x88\xac\x35\x5a\x97\x9e\x48\xe6\x4a\xfa\x64\x42\x84\x5e\x19\xf0\x17\x28\xc1\x51\x8c\xb8\x43\xe8\xcc\x91\xcb\x11\x82\x7a\xc9\xd7\x1f\x35\x94\xfa\xd3\x8a\x0a\xf8\x25\x9f\xf5\xa2\x01\xfe\x5d\x7a\x9e\x93\xcb\xf9\x33\xee\x1d\xfa\xc7\x0d\xe2\x12\x42\xb4\x1c\x9e\x23\x8e\x2c\x3f\xbb\x61\xde\x47\xab\x98\x0b\x60\x82\xb9\x1b\x3f\xf1\xb1\x50\x19\x89\xf4\xa5\x03\x9e\x7b\x47\x8d\x74\xee\xa3\x15\x17\xf8\x1f\x11\x87\x23\x2e\x4e\x81\x24\xf4\xcb\x7a\x8b\x62\x8e\x89\x13\x5e\x8c\x92\xf9\x4b\xae\x01\xb2\x51\x7f\xfc\x31\x8b\xb5\x51\xb7\x3f\xcc\x60\xa1\xbe\x8d\xd7\x19\x88\x16\xe0\x27\xc5\xd0\x8d\x81\xc9\xcd\x22\x1b\x48\xdb\x65\xa0\x96\xfd\x9d\x8f\x25\x49\xc5\x0a\x91\x79\xf3\x9d\xcf\x4f\x55\x4d\x73\x75\xb7\x30\x3a\xe8\xf7\x5a\x76\xcd\x33\xa9\xa1\x7b\xfe\x74\x70\x0a\x22\xe1\xed\xb1\x5f\x3a\x9d\xcb\x6c\x56\x11\x75\xdd\xda\x89\xcd\x2e\x5b\x55\xce\xe0\x63\x4b\x71\x54\xe6\xbe\xa6\x61\x29\x94\xfd\x32\x26\x9b\x4a\xbe\x68\x18\x3e\x3e\xf6\xc2\xe1\xc3\xba\xdf\x17\x0e\x8f\xcf\x2e\x8f\xae\x4f\x0f\x4e\x46\x43\xde\x09\xa2\x95\x7b\x0a\x17\x88\x07\x48\x38\x3c\xbe\x9c\x4c\x47\x17\xd7\xc7\x07\xdf\x8c\x8e\x27\xe4\xe3\x2a\xc1\x28\x3e\xa6\xb7\x5e\x5a\xe1\xec\x74\x7a\x71\x76\x7c\x3c\xba\xb8\x3e\x1c\x5d\x4c\x87\x3c\x39\x67\xe2\x28\x08\x50\x7c\x48\x9f\x37\x2a\x55\xde\x9c\x4d\x2a\x55\xde\x44\x09\xad\x72\x72\x70\x7a\xf0\x7a\x74\x32\x3a\x9d\x5e\x67\x23\x9e\x8e\xa6\xef\xce\x2e\xbe\xbb\x3e\x1c\x1f\x5d\x0c\xf9\x05\x0c\xe1\x8c\x6a\xb2\x0f\x19\x04\xa7\x08\xdf\x46\xf1\x47\xf2\x75\x4b\x07\x6c\x56\x5d\x1d\x64\x13\xad\x0e\x17\x56\x7b\xaf\x76\x15\x56\x5b\xb6\x0c\x3d\x19\x5d\xbc\x1d\x1f\x8e\xae\x47\xa7\xaf\xc7\xa7\xa3\xeb\xd7\x17\x67\x97\xe7\x5d\x70\xa4\xe7\xcd\x28\x9c\xf9\x21\x7a\x1d\x47\xab\xe5\x86\x8e\x53\x54\x5e\x9f\x1f\x1f\x9c\x8e\xae\xdf\x8e\xcf\xb7\xcd\xf2\x90\xa1\xfa\x3c\x80\x21\x7a\xeb\x2f\x4f\xb7\x82\xde\x3d\x42\xc7\x42\xb4\x8f\x90\x61\x8e\xb4\x3c\x3e\x3b\x38\xda\x79\x06\xa4\x31\xb9\x40\xee\x04\xff\x13\x7a\x67\xd0\xef\xd4\x7b\xb1\xea\xef\x18\xdd\x5f\x7f\x37\xfa\x91\x2c\xfb\x2d\x25\xfb\xef\xd0\x7d\xf5\xeb\xdb\x83\xe3\xcb\x51\xf1\xfd\x2d\x0c\x56\x14\xba\xf3\x83\xc9\xe4\xdd\xd9\xc5\xd1\x90\x5f\xc2\x24\x21\xf2\x15\x29\xdd\x40\x1b\x49\x27\x29\x5c\x4e\x46\x17\xac\x0e\x11\x53\x42\x5a\x1a\xd2\x0d\x4e\xb9\xc8\x3e\xd3\x78\x44\xc3\x07\xaa\x5d\x3a\x81\xcb\x25\x7d\x5e\x79\xff\x40\xaa\x0e\xc2\xfa\x16\x04\xb9\x46\x38\x19\xbc\xf7\x05\xf8\x51\x18\x4f\xc8\x34\xc6\x47\xd7\xaf\xbe\x3f\x3a\xbd\x3e\xbb\xb8\x1e\x9f\x5f\x01\xaa\xdb\x1a\xf0\x45\x63\x8e\x34\xe6\xd7\x20\xeb\x36\x03\x2b\xab\x99\xfd\x2e\x55\xc9\x90\x00\x16\x30\xf9\x38\x78\x26\x66\x55\xb3\xf2\x52\xd5\x1a\x2b\x01\x6e\x74\x1a\xe1\x83\x15\x8e\x08\x3f\x2f\x35\x2d\xc1\x43\xea\x8d\x5f\x8d\x0f\x0f\xa6\x23\xee\xe0\x72\xfa\xe6\xec\x62\x3c\xfd\xb1\xdc\x65\xce\xd7\xf2\xc6\xa4\x84\xab\x01\xd9\xb9\x26\x59\xab\xb4\x02\xc7\x2a\x70\xb4\x42\xbd\x93\x32\x1d\x67\xed\x32\x02\xe5\x52\x02\xe5\xf6\xb8\xa3\x83\xe9\x01\x47\xe9\x93\x7b\x3b\x3e\xe7\xd2\x56\x5d\x9d\x11\x5a\x7c\x7a\x67\x94\x82\x8b\xce\x9e\xb8\x09\x37\x8c\x97\x36\xdc\x0e\xff\x13\x77\xe6\x67\x0d\x59\x9b\xe5\x53\xf8\x70\x36\x5e\xd1\xa6\x34\xe2\x2e\x8b\xbd\xe5\xbc\xd9\xd8\xff\x6e\x14\xb0\xe5\x48\xfc\x9c\x11\xb6\x23\x6c\x37\xc2\x68\x1d\x73\x67\xd2\x78\xf2\xa1\xf3\x99\xc3\xd6\x66\x5b\x95\x64\x0a\x76\xc0\x3a\x62\xa5\x5c\xef\xec\x7c\x3a\x3e\x3b\x3d\x38\xee\xf3\x20\x95\x52\xa6\xe4\x4a\x26\x81\x54\xf7\xf2\x2a\x15\xb5\x06\x68\xf8\x2f\xfa\xf8\x46\xdf\x9d\xc9\xbf\x3f\xa2\xfb\xbe\xb0\x80\x4b\xf2\xeb\xc3\x57\x0f\xb4\x60\xcd\x0d\x38\xf2\xcf\x1b\x72\x24\xac\x3f\xf4\x85\x5f\x22\x3f\xec\xf1\x80\xc8\xd7\x54\xe7\x10\xa3\x30\x63\xd2\xfc\x47\x72\xae\xb8\xc8\x83\xab\x00\xd3\x33\x64\xc0\x57\x81\x10\x37\xb0\x6d\x76\x12\x9d\x5d\x5c\x1f\x9c\x9e\x9e\x4d\xa9\x96\x0e\xd0\x1a\x17\x3f\x5c\x5f\x9e\x8e\xbf\xbf\x1c\xe5\x3f\x2f\x46\xdf\x5f\x8e\x2f\x46\x47\xd7\xe3\x57\xec\xe8\xba\xca\x90\xc4\xdf\xb0\xa3\xeb\xaf\x00\xa2\x3c\xea\x77\xa3\x1f\xaf\xd6\xe4\x7f\x6b\xa0\x1a\x86\xb2\xdb\xdb\xd4\xa7\x16\x31\xf7\xba\x5d\xc9\x60\x2a\x92\x9c\xbe\x4d\x19\xa6\x2e\x1a\x95\xb7\xf6\x6d\x66\x71\x41\x6a\x16\x57\xd5\x1a\xca\x0d\xb5\xa1\x2c\xd5\x1f\x61\x64\xb9\xf4\x0a\xc3\x4a\xa8\x6e\xaf\x61\x1a\x27\xab\xf5\xc7\x90\xdc\x36\x4e\xd6\xb2\x17\x14\x7d\xdb\x03\x4a\xc9\x34\x4e\xa6\x95\x37\xdf\x8c\x82\xcc\x36\x2e\xd8\x66\x1b\x17\x34\x6d\xe3\x08\x3a\x6b\x50\x34\x8c\xe3\xaa\xef\x2b\x14\xa2\xb9\xff\x4b\x8f\xe7\x88\x00\xd3\x18\x0c\xf0\x1c\x5f\x7e\xf9\x6a\x3e\x0f\xe2\x37\xef\x7a\x22\x30\x0a\xfd\x6c\xaa\x50\xc6\x51\x14\x60\x9f\x2a\xdd\x31\x0a\x31\x0f\x64\x33\x83\x59\x4e\xd1\x58\x06\xf6\xf4\x7a\xd9\x78\x18\xaa\x82\x2a\x67\xca\x59\x24\xa4\xd7\x1b\x42\xe9\x47\xe9\xcb\x4d\x14\x67\x8a\x5a\x71\xf3\x4b\x5d\x49\xc3\x90\x6e\x18\x66\x48\xc7\x03\xd9\xca\x54\xca\x12\x50\xc4\x1c\xb8\x8d\x40\x49\x5b\x80\xa2\x2a\xe4\x43\x98\xe4\x6a\x64\xa9\x0c\xdd\xf2\x73\xa1\x93\xfe\x1d\xd0\xb9\x9f\x0b\x9d\xfc\xef\x80\x6e\xda\x41\x89\x92\xf6\x37\x25\xc5\x55\x17\x3a\x99\xc6\x46\xc9\xdf\x64\x9f\x80\xbd\x62\xe7\x6e\xc6\x20\xe0\xb9\xf4\x2e\xc5\x1d\x15\x4f\x9d\xdc\x62\x95\xe0\x54\xa3\x04\x43\x97\x43\xa1\xcb\xdd\xfa\x78\xce\x41\x2e\x40\x18\xa3\x18\xd0\x62\x07\x86\x5c\xfa\x68\xc2\x45\x61\x70\xcf\x05\xd1\x2d\x8a\x1d\x98\xa0\xb4\x5a\x02\xb8\x70\xb5\xb0\xe9\x3f\x48\x83\xf9\xfd\x72\x8e\xc2\x44\xe0\xc6\x98\x0d\x11\x46\x98\xf3\x43\x27\x58\xb9\x88\xbb\x9d\xfb\x18\x51\xa3\x2f\x2e\x0a\xc9\x90\xac\xde\x1c\x26\x1c\xe4\x16\xf0\x8e\x0b\x50\x38\xc3\x73\x2e\xf2\x38\x5d\xe1\x9c\x39\x8c\xa1\x43\xc6\x10\x28\x23\x0a\x10\xe6\xae\x3b\x1f\x56\xc7\xad\x0f\xab\xfd\xf2\xd3\x29\x2d\x12\x8a\x02\x50\x56\x2a\xbf\x8a\xe2\x45\xa6\x58\xb6\x57\x7e\xe0\x92\x02\xa6\x4c\xf6\xa2\x78\x41\xef\x7a\xe5\x07\x51\x72\xef\x03\xf9\x67\xfa\x2b\x12\x7e\x48\x35\xce\x73\xbc\x08\x5e\x91\x7b\x1e\xd3\xc2\xd0\x77\xd3\xec\xde\x77\x89\xfd\xc0\xc7\x3e\x4a\x84\x19\xc2\x45\xa5\x13\xb8\xec\x15\x1d\x50\x05\xd8\x11\x3b\xe4\x59\x1f\xa5\x8f\x31\x9a\xf9\x54\x2f\x81\xd1\xb2\xb4\xa4\xd3\xd8\x9f\xcd\x50\x9c\xf4\xd8\x15\x93\xaa\xb6\xec\x42\xa8\x3a\x3b\xa4\xc7\xfd\x15\x68\x25\x97\xc1\x33\x71\x5d\xeb\x3e\x1d\xfe\x95\x1f\xa0\x71\x6a\x35\xf3\x06\x86\x6e\x80\x62\x86\x16\x66\x30\x54\xfa\x0a\x9a\x20\x36\xfa\xa0\x46\x40\x9b\xba\xa1\x15\xd2\x5e\xf0\xc7\x19\x9b\x3c\x7d\xca\x9c\x0d\x1f\x98\x48\xf8\x40\x35\xdb\x83\x36\x4c\x0b\x15\xed\x17\x48\x77\xff\x14\xdd\xe1\xc1\x87\x33\x8a\x25\x18\x04\xf7\x5c\xb2\x44\x8e\xef\xdd\x73\xcc\x34\x84\xf3\xa2\x98\xaa\x6d\xbf\x62\x8f\xe5\xad\x08\x5a\x73\x69\xb1\xf0\x61\x0d\xc8\x92\x27\x83\x87\x25\x8c\x51\x88\x07\x35\x22\x49\xd9\x63\xad\x98\xac\x76\xaf\xa6\x9c\xeb\xaf\x41\xba\x54\x0f\xed\x8b\xd2\x0d\x4e\xb1\xbd\xcb\xfa\x84\x41\x24\xfc\x20\x54\x14\x0c\x82\xe7\x87\x2e\x13\x7f\x89\x00\x39\x1c\x0e\x2b\x44\x41\x65\xea\xfe\x7a\xbd\x76\xef\x43\xb8\xf0\x9d\x12\x39\xf5\x4a\x56\x1a\x04\x8c\x8c\x5a\xa9\xcc\xd9\x6b\x23\x2d\xf0\x4c\xec\xe7\xef\xe0\x2f\x3f\x1c\xa7\xae\x1d\x54\xc0\x5e\x7f\x18\x7c\x98\xa4\x58\x5f\x20\x0c\x99\x86\xfc\x29\x78\xff\xb0\xa6\x9b\xe2\x32\xdd\xaf\xbd\xd4\x7a\xb6\x52\xf8\x2a\x8e\x16\xe9\xcc\x3b\x36\xd3\x51\xe9\x81\x96\x56\xf9\x93\xaf\x42\x5b\xcc\x0e\xb2\xa9\xee\x25\x18\xd1\xa7\xa0\x0e\xf3\x02\x25\x7d\x02\x92\x3a\xad\xee\x89\xd8\x0d\x7c\x10\x82\xa8\xd5\xd4\x20\xc7\x69\x8a\x2d\x2e\x49\x5f\xfd\xff\xf8\xed\x77\x19\xe9\x26\xf4\x6c\x84\x4c\xd9\xb3\xa1\xa3\x58\x9e\xe6\xba\x9e\x6c\x4b\x10\x2a\xb2\xe3\x20\xa8\x22\x49\xb4\x0d\xfb\x8f\xdf\x7e\x37\x14\xc3\x12\x4d\xd1\x32\x15\xd9\x54\x65\x45\x52\x24\x73\xc0\x65\x1b\x87\x3b\xc9\x06\xf9\x00\x70\xc5\xf8\x3f\x1d\x33\x73\xe6\x61\xfb\xea\x8f\xdf\x7e\xf7\x4c\x55\x34\x74\xd2\x9f\x6e\x3b\x92\xa1\x5a\x96\xed\x40\x24\x7a\xaa\x6a\xbb\x96\xe8\x49\x92\xe4\xaa\x10\x19\xc6\x1f\xbf\xfd\x2e\xc9\x92\xa6\xea\xb2\x24\x8b\xa2\xa2\x18\xa2\x24\x9b\xbb\x58\xfb\xe7\x35\xfe\x8f\x95\x57\x99\x4c\x0f\x2e\xa6\xd7\xd3\x83\xd7\xd7\x87\xc7\x17\xd7\xd3\xb3\xb3\xe3\xe9\xf8\xbc\xb0\x98\xf8\x3f\x92\xd8\x51\x75\x7c\x78\x76\x5a\xd4\x7b\x51\xae\x78\x78\x7c\x36\x19\x75\x54\xfc\xa7\x24\x0d\x24\xf6\xcf\x6c\x84\xec\x77\x17\x34\xf4\x3a\x3d\x3a\x9d\x96\xa0\x92\x5b\xdb\x4c\xce\x0f\x4e\x8b\x05\x28\x71\x2e\x58\x20\xbb\xd8\x45\x19\xb6\x4a\x5d\x55\xf0\x75\x2d\x0d\x72\x2e\xc6\x95\x26\x5a\x1e\xbb\x98\x29\x1d\xbb\x8c\x8e\xea\x2c\x5f\x94\xe6\xdd\xc0\x50\xe7\x3c\x5f\x94\x16\xaa\xb5\xc9\xe0\x03\x88\x37\xd2\x16\xbd\xdc\x72\x8b\x64\xf6\xc7\x6f\xbf\x43\x4f\x57\x3c\xd3\xb6\x45\xc3\xb2\x5c\xc3\x16\x35\xcd\x45\xaa\x2d\x22\x43\x31\x1d\xa8\x22\x03\x1a\xc8\x86\xa2\xe6\xfe\xf1\xdb\xef\xaa\x69\x99\xa2\x6c\x18\x92\x62\x11\x0a\x37\x2c\x55\xd9\x85\xc0\x32\xd1\x29\x63\x66\xdd\x72\x53\xc8\xc1\x60\x39\x87\xe1\x6a\x81\x62\xdf\x29\xa4\x97\x2e\x41\xaa\x21\x3e\xa5\xa2\x13\xe0\x56\xa1\x8b\xe2\xc4\x89\x62\x94\x0a\x55\x6e\x84\x13\x81\xfb\x00\xfc\x9d\x11\xa3\x1b\xb6\xa9\x5b\xb2\xa8\xba\x9e\xe1\x40\x49\x73\x3d\x53\xf2\x14\xc5\x35\x4c\xcd\x53\x45\xdb\x34\x11\xb2\x64\x09\x69\x84\x3b\x68\x9a\x6e\x12\xc4\x58\xa6\xac\xe8\xb2\xa2\x18\xf2\xe7\x23\x66\x9b\xb4\xf7\x01\x84\x3b\xcf\xc1\x82\xba\x6d\xd9\x48\x71\x90\xa9\x1b\x22\x54\x54\xd7\xb6\x1c\xdb\x51\x3c\x57\xb4\x55\xd3\x40\xae\x62\x98\xa6\xe1\xa9\x7f\xfc\xf6\xbb\x66\x58\xb2\x2c\x89\xba\xa8\x8a\xa6\x65\x19\x86\x64\xe8\x9f\x37\x87\x42\x06\xf5\x93\xba\x0c\xfa\x01\x44\x6d\xb0\x97\xec\x07\x73\xbe\xe7\xda\x86\x2a\x21\x45\x51\x75\xcf\xd5\x4c\x13\x22\x59\x81\x36\x54\x5c\x53\x75\x64\x43\x35\x6d\x57\xf7\x14\xcf\x13\x3d\x82\x7e\x55\x12\x2d\xd9\xb0\x74\x51\x51\x14\x49\xb2\x44\x59\x7c\x1a\xe3\x93\xe5\x9d\x39\x9f\xac\xec\xc8\xf9\x4a\x15\x37\x72\x3e\x59\xfd\x4f\x70\xbe\x32\xc6\xff\x63\xcc\xaf\x98\xfa\x53\x98\x5f\x69\xb1\xba\xb8\x1f\x35\xfe\xc8\xc5\x46\x6a\x69\xf1\x99\xee\x6c\x15\x63\x3e\x99\x19\xed\x6d\x33\x00\x2c\xdf\xef\x33\x4f\x32\xfe\x0a\xe0\xbc\xbb\xba\x29\x20\xe0\xa1\x24\xdd\x4f\x53\x41\x9b\x5d\x41\x48\x9b\xc2\x9b\xcc\x0f\xbd\x28\xf7\x6b\xe3\x13\xff\x57\xf2\x47\xce\x87\x3b\x8f\x12\x9f\x5a\x65\x02\x1e\x47\xcb\xbd\xd8\x9f\xcd\x31\x33\x6e\x99\xb0\xaa\xc1\x8c\x4e\xcb\x09\xe2\xb1\x47\x9f\xf7\xd3\x86\xe3\x70\xb9\xc2\x6c\x28\x82\xae\xf4\xa5\x90\xbd\xc7\xe5\x82\x76\xba\xb3\x79\xc0\x53\xaf\xe8\x79\x14\xb8\x14\xbe\x28\x25\xac\x0a\x7e\x51\x1c\x67\x93\xce\x06\xa4\xd7\x91\x26\xaa\x8a\x1f\x0b\x37\x45\x5d\x5a\x81\x80\x92\x61\xb0\xd2\xae\x8c\xd3\x2b\x10\x35\xbe\x94\x6c\x13\xab\x23\x85\xd1\xde\x6c\x45\x0f\x0b\x0a\xac\xef\x16\xd3\x2b\x89\xeb\x9b\xb0\x50\xad\xd6\x81\x88\x9a\xfb\xa0\x5b\x69\x43\x3f\xb1\x22\x1b\xb9\xf6\x7d\xd1\xf7\x5e\xa9\x62\xa6\x11\xca\x74\x2f\xe8\x0e\xc3\x18\xc1\x06\xd8\x6d\x6d\xf2\x45\x20\x2d\x93\x95\x4d\xdd\x1c\xcb\xe4\xac\x64\xde\x4f\xff\xd7\xb9\x6a\xfe\xe5\x8e\x9a\xbb\x6f\x24\x06\x5d\x41\xe7\x57\xe9\xa5\x62\xfb\xfa\x48\xd5\x95\xd9\xdd\xa4\x97\x50\x65\x6a\xd3\x4b\x5d\x08\x2a\xfe\xa2\x15\xcb\x5e\xb5\xdb\xb2\x37\x35\xc1\xca\x9c\xd9\x73\x95\x3c\x2d\xd0\x4a\x3e\x12\x54\x21\x4e\x18\x43\x69\x3f\x95\xd4\xf1\x29\xce\xa9\xea\x1b\xbf\x79\xd7\x33\x81\x91\x7d\xb5\x2a\x0a\x43\x3e\xd3\x12\x4a\x62\x59\xcb\x6e\xe6\xd3\x90\x40\x02\x14\xd0\xa5\x65\xb4\x1a\x4a\xc5\xd2\x6f\xda\xad\x4c\x18\x23\x65\x60\x92\x98\x17\x2a\x55\x96\x30\x47\xc1\x32\x85\x9f\x8e\xa9\x02\x07\xc8\x40\x6a\xd5\xc2\x32\x77\x0e\x5a\x4d\x03\xcb\x5d\xaa\xe9\xc0\xdd\x52\x6d\xa3\x73\x88\x51\x5f\x0e\xc9\xcc\x16\x35\x7f\x65\x91\xac\xac\x48\xc9\x17\x5a\xcc\x57\x41\x52\xb3\x65\x90\x25\x20\xe5\xab\x28\xcb\xed\x2b\x21\x2b\xad\x2b\x21\xab\x60\xfa\xb9\x2b\x41\x87\xcb\xc8\x48\xd2\xf3\x22\x9d\x15\xe5\x23\x1b\x80\xcf\x99\x19\x90\x8c\x7c\x68\x13\xac\x18\x0a\x59\x07\xe6\x2e\x6e\x30\x95\xb1\xad\x3a\x12\x15\xb1\x4c\xd4\x64\x70\x85\xb0\x93\xe5\x72\x0f\x7f\x9c\xb1\x4d\x9b\xf0\x40\xb2\x3a\x7b\x2e\xac\xda\xa9\x5d\x5c\x21\x48\x00\x5c\x28\xa3\xda\xec\xd9\xbb\x3c\xb5\xb3\xaa\x62\x61\x20\xdf\xa5\x74\x8b\x8a\x26\xdf\xe3\x69\xcf\xcc\xda\x2a\xf9\x30\xa5\x33\x15\x94\xbc\x1e\x47\xe1\x6a\x21\xb0\x17\xca\xfc\x25\xfd\xe0\x64\xd4\x04\x73\x53\xfb\x77\x6f\xc6\xd3\xd1\xe4\xfc\xe0\xf0\x89\xed\x4e\x0e\x7e\xb8\x3e\x1e\x9d\x66\x8d\xcc\xad\xf3\x2c\x1d\xa7\xd9\x54\xd9\x53\x63\x3e\x26\xfa\xf8\x0b\x1d\x33\xdb\x4e\xb8\x43\x0f\x58\x3e\x98\xfb\x82\x1f\x52\xc0\x9a\x58\xcb\x16\xe7\x4f\x75\x92\x1e\x9e\x00\xd7\xd5\xaa\xfd\xfe\xba\xe4\x95\x40\x49\xac\x60\x9e\x6d\x76\xe9\x0b\x18\xcf\xfc\x70\x2f\x40\x1e\x1e\x88\x6b\xc1\xc6\x61\x6a\xf6\xdc\x6d\x88\x3f\x08\xa3\x10\xad\xd3\xce\x29\xdf\xdb\xd0\x31\x8e\x96\x03\x41\x8a\xd1\x62\x3f\x2d\xb0\x23\x8c\xa3\xc5\x40\x56\x97\x77\x6b\xa1\x2c\x59\xb4\x5a\xcd\x53\x43\x7d\x4d\x14\x97\x77\xfb\x73\x44\x0e\xc1\x81\x24\x8b\xa4\x65\x7e\xec\xb5\x8f\x9d\xf9\x3c\x48\x86\xb6\xbc\xab\xda\xd9\x9b\xba\xb8\xdb\x13\xb8\xdd\x6e\x00\xfa\xc3\x17\x31\x00\xdd\x66\xe7\x99\x56\x38\x1a\x4d\x0e\x2f\xc6\xd4\x4a\x62\xd8\x2a\x01\xa2\x86\xe6\x76\xd8\x94\x97\x9f\x64\xbb\x56\x57\x04\x3f\xc9\x00\x21\xb7\x62\xcb\x9a\x97\x6d\x3c\x9a\xd6\x21\xa5\xe9\x7d\xe6\x38\xa5\x1e\x36\x0f\x55\x35\x44\xf9\x5f\x03\x94\xff\x8c\x01\x8a\x26\xcb\xe6\x6e\xb1\x1e\x7e\x69\xd9\x66\xdf\x97\xb7\x99\xa2\x1b\x56\x6a\x80\x62\x68\x52\xea\xe5\xa2\xea\x86\x29\x33\x03\x14\x66\xa0\x02\x87\x71\xcf\xb0\x34\x22\xc6\x24\xd4\x8f\xda\x12\xd5\x3e\x70\x86\x71\x4f\x37\x4d\x4b\xeb\x83\x65\x61\xc1\xe2\x16\xde\xd5\xd3\xc2\x79\x66\x35\x8c\x7b\x9a\x26\x5a\x4a\x1f\x5c\x17\x91\x9f\x66\xb9\x4b\x0d\x38\x18\xc6\x3d\x4b\x17\x0d\xa3\x64\xed\x32\x6f\xb7\x76\x99\xa6\xd6\x2e\xd3\x6a\x10\x28\xad\x0f\xa6\x55\x27\x39\x3d\x2b\xc9\x5d\x8e\x8d\xac\x44\x29\x49\x28\xd3\xa6\xb5\x0b\xc1\xc4\x34\x15\x23\xa6\x35\x6b\x17\x91\xb6\x60\xd6\x2e\x45\x9d\xfa\xdf\xba\xb5\x8b\x44\x0a\x37\x5b\xbb\x4c\x33\x6b\x97\xe9\x36\x6b\x97\x69\x8b\xb5\x8b\xdc\x80\xa2\x61\xed\x92\xf6\xbb\x3f\xcd\xac\x5d\xa6\x4f\xb1\x76\x59\x94\x2e\x33\x0c\x00\xb1\x66\x6e\x53\xd4\x1d\xb5\xd5\x4d\xf1\x67\x96\xea\x79\x3b\xae\x70\xda\x54\x29\x2d\x71\x8e\x59\xf5\x33\x30\x1b\x44\xd0\x4d\x2d\xa7\x13\xea\x6b\x31\x65\xe2\x2b\x58\x00\x09\x54\xa7\xa5\x95\xf1\x4a\x2a\x29\x60\xc4\x2a\xa5\x40\xe9\xbb\x22\x9c\xae\x50\x49\x7c\x79\x86\x84\x34\x84\x5f\x06\x0a\xa9\x90\x8a\x4c\x95\x9a\xcd\x8a\xa5\x75\x39\xad\x99\x52\x4c\x53\xdb\x0f\x45\x04\x52\x09\x5f\xad\x77\x01\x45\xcf\x88\xa9\xb0\xfd\x28\x66\xdb\x66\xfb\xc1\xa6\x24\x57\xe6\xc4\x8c\x3f\x4a\x2e\x06\xe3\xd4\xee\x80\xca\x83\xd3\xa6\xf5\xc7\xa4\x01\x72\x1a\x32\x20\x87\x36\x4a\x4f\x66\xc5\xc8\x76\x5b\x85\xbe\xb7\x78\xce\xef\x37\xd1\x98\x59\xb8\x57\x50\x5c\x50\x7f\x7a\x52\x51\xab\x85\x1a\xdd\x9f\x35\x80\xad\x18\xd9\x59\x35\x1c\xb3\x17\xcf\xca\x65\x3b\x67\x42\xec\x9a\x47\x0a\xc8\x12\x29\xd4\xb0\x6a\x9a\x07\x3c\xa8\xdc\xf0\xd8\xaa\x68\x65\x52\x54\xa4\x8c\x04\x75\x70\xba\xe1\x82\xa7\xc8\x8d\x45\x6c\x32\x26\x06\x26\x33\xb5\xc9\xd9\x49\x8e\x75\x35\x1b\xc9\x02\x13\xa0\x34\xc3\x1b\x28\x95\x5d\x51\xd6\x0a\x34\x6e\xea\x29\x72\x5a\x6f\xd5\xd9\xda\x92\xbb\xff\x84\x02\xe4\x87\x33\x0e\x72\x6f\x4f\xb8\x94\x9a\x38\x3f\xe1\x62\xf4\x69\xe5\xc7\xc8\xe5\x3b\xf9\x6d\x2b\x8d\x56\xf8\x1c\x23\xd1\xfa\xf5\xa5\x44\xb2\x19\x9d\x2a\x19\x81\x28\x25\xe2\x49\x3d\x9b\x73\x1a\xaf\xec\xbf\x71\x59\xc9\x93\x6f\x3e\xeb\xcb\x6c\xbe\x62\x98\x8b\xea\x30\x9d\xd6\x67\xa4\x2d\x33\x3d\x53\x0b\x3a\x28\xf5\x73\xf8\xf4\x7e\x94\xb6\x7e\xce\x9f\xde\x8f\xda\xd6\xcf\x4f\x4f\xdb\x5e\x4d\x55\x56\x6d\x77\x01\xc5\x2c\x6d\x30\xeb\x73\x37\xd8\x18\x28\xd9\x41\xf0\xc4\x0d\x46\xba\x35\x72\x5d\x96\x2a\xd6\x8e\xeb\x96\x0d\xc2\x36\xda\x05\x90\x41\xbb\x3d\xa1\x9a\xc3\x25\x89\xe0\x70\x97\x6a\x12\x38\xdf\x52\xed\x8b\xec\x1f\xa7\xe2\x0e\x76\xe8\xbb\xf1\x86\x6d\x54\xd6\x38\xa0\x9a\xc6\x21\x13\x74\x9b\x07\xe0\xa6\x56\x4c\x80\x1e\x9f\x3f\xad\x55\x6a\x6b\x3f\x3e\x7d\x7d\x3d\x3e\x4f\xe5\xfc\xf2\x7e\x3e\x6e\xdb\xcf\xaa\xf6\xa5\xf7\xb3\xfd\xf4\xfd\x63\xb4\xed\x9f\x9b\xa7\xf7\x63\xb6\xf5\x73\xff\x57\xee\x43\x55\xfb\xdc\x7d\x78\xfc\xa5\xf6\xa1\xbe\xeb\x3e\xb4\x77\xdb\x87\x37\xff\xc6\x0d\x76\x1e\xb9\xff\xb9\xcd\x55\xda\x1a\x47\x1d\xa2\xa6\xfa\x85\x4e\xbb\x5d\x45\xcd\x0e\x3b\xe3\x16\x49\xf3\xf2\xc9\xbb\x43\x6f\x3d\xa5\xee\x9e\xde\x8f\xd6\xd6\xcf\xa7\x0e\x0c\xea\xfa\x5f\x87\x41\xe5\x4f\x61\xf0\xf6\xe9\x33\x6f\xe5\x2f\x27\x4f\xef\xc7\x6a\xeb\xe7\xd5\x46\x3e\x65\xf4\x6b\x4a\x80\x82\x71\xc9\x9b\x19\x97\xd2\xc2\xb8\x54\xa0\xe7\x3a\x04\xad\x9d\x71\xe9\xed\x8c\xcb\x00\x9f\x3e\x5b\x42\x4f\x99\x54\xca\xb8\x74\x23\x2b\xb3\x36\x32\x2e\x49\x04\xb7\xbb\x89\x06\x27\x4f\xe1\x5c\x1b\x39\x58\xbe\x37\x8d\x6e\x16\x36\xc7\x78\x99\x9c\xc7\xd1\xdd\xfd\x65\x1c\x64\x14\xa6\xfe\x3b\x38\xd8\x9b\xe9\xf4\xfc\xfa\xec\xe2\x9a\xfc\x9d\x94\x49\xfa\xf5\xbf\x89\x84\x08\x19\xab\xc0\x10\xeb\x8b\xab\xe5\x8b\x6b\x48\x35\x3a\x6a\x59\xdc\x0e\xcd\x52\x0d\xb4\xf4\x54\xcb\xbc\xb6\x5b\xa0\xb3\x5a\xa0\x93\x44\x60\xc8\x75\xf0\xc8\x5d\x2d\x83\x2f\xbf\x1d\x4a\xf2\xce\x00\xee\x40\x2f\xea\x4e\xf4\x92\xba\x8d\x37\x88\x66\xc3\x81\x59\xb4\x3e\x4f\x31\x91\xb5\x96\x2a\x5c\xed\x6d\x9b\x90\xa7\x8b\x40\xce\xe7\x5b\x62\xb1\x75\xd1\xed\xc7\x8e\xc6\xca\x2e\x8d\x3f\x76\x9d\x00\x3b\xab\x6b\x98\xa6\xea\x2d\xdb\xc5\x4c\x09\x25\xe5\x17\x76\x05\xfc\xd8\xfc\xf0\xd4\x53\xb6\xaa\xa4\x42\x21\xb4\x03\x74\x5a\xbd\x2b\xb7\xab\xa9\x9a\x55\x4b\x38\x7f\xd3\x7a\x02\xb0\x3d\xa7\xd6\x37\xdd\x9f\x50\xde\x1a\x5a\x7d\xbb\x68\x25\x8f\xc8\x69\x1e\x64\x66\xec\x51\x43\x39\x3f\xf4\x62\xc8\xa5\x71\x0c\x38\x14\xba\xcb\xc8\x0f\x31\x53\x3c\x2c\xa2\x1b\xe4\x82\x5a\x95\x5b\x3f\x08\xb8\x59\xc4\xe1\x79\x1c\xad\x66\x73\x0e\x72\x4b\x42\x70\x5c\xf7\x66\x68\x39\xc6\xbe\xea\xe2\x41\x2d\x9b\x0c\x18\x7a\x1d\x3d\x46\xa1\x17\x03\xfc\xab\xcb\xe3\x63\xee\xf4\x8c\x3b\xbf\x38\xfb\xe1\x47\xee\x78\x3c\x99\x56\x40\x49\x83\x91\xee\xb4\x31\x69\xbd\x42\x2d\xe6\xad\x82\xe0\x34\xa2\xfb\xa9\xae\x16\x7b\xb7\x4d\x75\x5b\x57\xe9\x55\x99\xab\xdc\xe0\x60\xca\x66\xe6\xaa\xb6\x9c\xcf\x1a\x50\xf3\xe6\x7a\xfb\xf9\x6c\xb4\x9f\xcf\x26\x38\xfa\x53\xe7\xb3\x95\xb3\x48\x2d\xbf\xe0\x6f\x50\x81\xa5\x27\xef\xe5\x2e\x07\xb4\x0c\xee\x3e\xe7\x80\xce\x10\xad\x34\x8e\x31\xb5\x79\x87\xd3\x36\xe3\x5a\xd2\xdb\xce\x0a\x03\x68\x52\xe3\xac\x28\x04\x15\xad\xe0\x9d\xdd\x92\x4a\x1b\xc8\x72\xf3\x92\x29\x4b\x5b\x8f\x33\xb9\x7e\xd3\x24\x30\xca\x0a\xd0\x94\x3a\x8c\xb2\x5a\xc0\xa8\xe6\x85\xda\xd3\xce\xb3\x6c\x54\xbd\x41\xc8\xd9\x59\x2c\xe5\xec\x5b\xce\xec\x7e\xb4\xfc\xda\x2b\x67\x28\x99\x23\xe7\xa3\x1d\xdd\xe5\xb6\x74\x39\xf5\x8b\x05\x90\x74\xb7\xb3\x17\x8d\x7a\x64\xaf\xee\x27\x0d\x1c\xcd\x66\x01\xa2\x5b\x35\x8d\x6f\x99\x3e\x6c\x94\xc1\x57\xa4\xb2\x12\x9a\x32\x06\x19\xf0\x97\x09\xe2\x12\xb8\x40\x1c\xb3\x88\x58\xc5\x85\x1b\x05\x3d\x4f\x19\x7f\xdb\xce\xde\xea\x0f\x25\x0a\x78\x05\x24\x19\x64\x14\xa9\x19\xf9\x17\x15\xbc\x06\x12\xd5\x2b\x97\xbe\x50\x00\xb5\x3a\x7e\x95\x0c\xe3\x9a\x99\x17\x19\x5b\xe4\x30\x33\x27\x0d\xcd\xca\x78\x85\x62\x01\xbd\x50\xb7\x8b\xed\xdc\x42\x95\xda\xd9\x85\x2a\x83\x8f\x40\x05\xf2\x67\x6b\xdc\x55\xa5\x8c\x78\xda\xa5\x0a\xde\x00\x03\x64\xb4\xaf\x37\xb6\x96\x5a\x88\x89\xba\x9c\xb7\xd2\xc1\x57\x40\xad\xdb\xa8\x65\xe7\x84\xae\x6c\x5a\x13\xfa\x68\xb2\xe5\x8d\xca\xdc\x2c\x5a\xd5\xe5\x78\xad\xff\x6f\x97\xe3\xd3\xa6\xda\x2e\x80\xd6\x04\x48\x26\x41\xec\x20\x41\xb6\x0a\x90\x72\xae\x76\x91\xc4\xa6\x90\x54\x58\x22\x51\x7b\x00\xc1\x4f\x26\x70\x81\x0e\x92\x37\x18\x2f\xbb\xe4\xa5\x1d\x9b\x6d\x58\x93\x90\x9d\xcd\x19\x88\x4c\xdd\xdd\x21\xc6\xcd\x7d\x17\xa5\x67\xf9\x3b\x18\x87\x7e\x38\xeb\xaa\x5c\x39\xf7\x53\x3f\xe3\xef\x3b\xfc\x8c\x97\x35\x3f\x63\x94\x3b\x1a\x33\x57\xc3\x74\x29\xfd\x28\x4c\xb5\xc4\xc3\xd4\x49\x98\xca\x54\x69\xd9\x81\xeb\xc6\x28\x49\x86\x3c\xcf\xbe\xd5\x5e\x3b\x87\xcf\xa4\xd4\x8b\xb8\x31\x85\xe1\x33\x31\x75\x69\x44\xf8\xd0\x77\xe3\x64\x48\xa1\xe4\x61\x88\x63\x04\xf9\xe1\x90\xb9\x6a\x3a\xa1\x3f\xa5\x89\x10\x53\x5f\xdc\x64\x15\xc7\xc8\x61\xee\x9b\x3d\x47\x88\x0c\xa1\x1e\x7e\x87\x06\x71\x79\xef\x0b\x1f\xc7\x42\xf6\xfe\xd4\x31\x21\x21\x8c\xde\xe5\x8e\x3d\x67\xe1\x28\x74\x93\x6c\xf2\xfe\xf2\x15\x5c\xf8\xc1\xfd\x70\x38\x84\xc2\xb9\x2f\x8c\xcf\x6f\xd4\x97\x1d\xbd\xf8\xc9\x5b\x52\x36\xce\x22\x7a\x4d\xd0\x8c\x26\xa1\xeb\x0f\xb6\x35\xb8\xd1\xeb\x4d\xba\x20\xf5\x93\xf1\xf2\x32\xf4\x3f\xad\x50\xef\x7d\x8b\x33\x6e\x05\x11\xe7\x67\x47\x14\x09\xfd\xab\xfe\xd5\x86\xd9\x40\xe1\x1b\xaf\x40\xde\xdb\x43\xda\x66\xd0\x28\x1d\x9f\xbf\xd5\x19\x4e\x1f\xa2\x30\xb8\x9f\xa0\xc0\xab\x38\x58\x77\x2f\x48\x06\xc7\xff\xd3\x8b\x51\xa6\xca\xa7\x2c\x48\x86\xbc\x41\xa3\xb4\x6b\x41\xd6\xeb\x64\xb5\x5c\x06\xf7\x23\x7a\x93\x4b\x4a\x57\xb9\x5c\xf6\x78\x26\xd5\xea\x54\x76\x64\xb3\xda\x69\xab\x61\x40\x5e\x8f\xe7\xab\xf5\x92\xfc\xcb\xfb\xab\xf4\xcb\x04\xa3\x65\xe6\xc5\x5c\x84\xcd\xec\x44\x81\x23\xdc\x7e\x33\x70\x04\xfb\x24\x6d\x4e\xa9\x2a\x39\xf0\x3c\xf6\xc0\x5c\x8b\x12\x50\x0c\xd7\xcd\x08\x5a\x29\xf2\x6a\xed\xac\x12\x1c\x2d\xfc\x5f\x11\x0d\x8d\xd0\x7f\x78\x72\x0f\x64\xcd\x47\xd0\x99\xf7\xf2\xb8\xf4\x59\x9c\x80\xb3\x70\x9c\x4e\x8d\x45\x77\xed\x21\xf0\xfe\xa9\xc4\x7a\xb5\xbd\x49\x17\xb9\x66\xec\xf4\xaa\x5f\x0f\x82\xb0\x2d\xc6\x02\x6b\xbe\x13\xde\xd7\xc5\x60\x6f\x73\xfb\xb8\x2d\x11\x2a\x82\x2f\x1b\xa1\xa2\x04\x6d\x85\xc8\x3a\xc2\x56\x04\xbb\x85\xad\xd8\xd2\x6b\x4b\x2c\x8b\x2d\x2d\x3e\x3f\x02\xc5\xe7\x76\xfc\xa4\xb0\x14\xb5\x7d\x90\x1e\xe2\x34\x87\xd6\x34\x62\x19\xa7\x73\xc2\xca\x92\x29\x4c\xa3\x74\xe9\xc8\x8a\xd7\x28\xa0\x14\xe5\xe5\x27\x01\x2e\x97\xe5\x18\xd7\x33\x84\xcf\x83\xd5\xcc\x0f\x5f\xb1\xc0\x01\xbd\x44\x38\x19\x01\xde\x09\x7d\xbe\xbf\x5f\x3e\xec\x87\xe8\xf9\xf3\xf7\x99\x20\x00\x78\x07\x06\xbe\x13\x51\xef\xb1\x10\xf1\x57\x42\xea\x94\x9b\xf4\x50\xff\x25\x1a\x14\xf5\xe8\xe7\x9a\xdc\xf0\xf2\x4f\x6d\x6c\xda\x93\xeb\x27\x30\x5e\xb0\xf3\x8d\x66\x0a\xef\x0f\x7a\x19\x4c\xed\x52\x4a\xb9\x45\xf7\xf0\xcf\xa4\xda\x8e\xcd\x10\xdd\x50\xc5\xa5\xdd\x26\x08\x97\x0a\x73\xac\xf7\xfa\x74\x15\xda\x3f\x55\xe3\x5e\x14\xe7\x54\x7a\xff\xa8\x18\xd2\xec\xa3\xe7\xcf\x51\x6d\x4b\x57\x8f\xee\xab\xfe\xba\x4e\x1b\x0f\x15\x8a\x21\xf3\xa8\x52\x4d\xf6\x25\x3d\x6a\xb2\x8f\xeb\xb6\x16\x5f\x82\x0b\x57\x8f\x62\xd4\x67\xd2\x39\xe3\xc4\x49\x9e\x74\x2a\x14\xee\xfa\x3d\xaa\x06\x1b\xfe\xeb\xdb\xc9\xd9\xa9\xc0\x72\xf0\xfa\xde\x7d\x0f\xf5\x87\xc3\x61\xad\x0c\xf7\xfb\xa0\x27\x82\x48\xb8\xe8\xf7\x1a\xa9\x45\x1a\x99\xab\x58\x84\x91\x10\xc5\x10\xa3\x57\x85\x38\x9e\x61\x04\x33\xbe\x5b\xe3\xa9\xe9\x59\xd1\x5f\x93\xff\x75\x20\xad\x6d\x86\x7c\x7a\x91\xe0\xff\x53\x33\x8d\xc2\x14\xca\xec\xb4\xdb\x71\x9a\xf4\x3c\x68\xcb\xfe\xe2\x0a\xc7\x79\x40\xd2\xc9\x74\x74\x7e\xfd\x7a\x34\xbd\x3e\x3d\xbb\xa6\x3a\xd2\xeb\xf1\xe9\xab\xb3\x22\x17\x0c\x74\x5d\x9f\xf9\x7c\xa6\x40\x8c\x43\x2f\x2a\xe5\x85\xf1\x43\x2f\x02\xdd\x0b\xd2\x92\x28\x66\xdd\x9c\xcf\x86\x15\x5d\x57\xcd\x51\x1f\xb2\xbc\xdc\x54\xe9\xd7\xe3\xab\x5f\xb9\x5b\x98\x70\x0e\x0c\x02\xe4\x02\xce\x5e\x61\x2e\x8c\x38\x7f\xb1\x64\x29\x13\x99\xe2\xc6\x4f\x38\x78\x03\xfd\x80\x26\x59\xe0\x7a\x0d\x4e\x30\xe4\xf8\xaf\xdb\x79\xc4\xd7\x7c\x9f\xef\xaf\x5b\x81\xec\xe2\x01\xb9\xac\x9a\x21\x97\x26\x79\x46\xcf\x9f\x3f\x4b\x4d\xf8\xfb\xa5\xe4\xe4\xe9\xe1\x5c\xf4\x3b\xe4\xf9\xcc\x9b\x02\x77\xf6\xdc\x2a\x05\x83\x78\x6b\xfd\xfc\x0a\x03\xfc\xe1\x7b\x41\x10\x52\x80\x84\x64\x19\xf8\xb8\xc7\x03\x3e\x25\xb2\xd6\xf5\x07\xf8\xf9\x73\xcc\x1a\x80\xf8\xf9\xf3\x38\xfd\x27\x4f\xe3\x1d\xcc\x69\x0c\x70\x5e\x92\x0d\x41\x14\x44\x41\xe2\x01\x2f\x24\x37\x4e\xfa\x27\x7b\x5d\xa7\x69\x9d\x03\xfe\x6a\xbf\x31\x6b\xbf\xec\x05\x91\x7b\x38\xf0\xfd\x75\x8b\x16\xaf\x94\x8c\x8f\x71\x36\xaa\x0f\x61\x74\x7c\x79\x71\x0c\x1a\x65\x59\x80\xe3\xfa\x87\x3c\xac\x71\xfe\x61\x72\x3d\x9e\x5c\x4f\x0e\x4e\x46\xd7\x07\x13\xaa\x5e\x29\x7f\x6a\x19\x61\xd2\x39\xc4\xa4\x75\x8c\x8c\x24\xae\xf6\xd1\xe3\x63\x6d\xb5\x16\x30\xfe\x78\x90\x9c\x23\x9a\x71\x29\xe3\x6a\x35\x75\x08\x9b\x2f\xeb\x79\x32\x9a\x4e\xc7\xa7\xaf\x27\x57\x2f\x7b\x9d\x77\xc6\x1a\x66\x76\xbb\x31\xfa\x54\xd9\x72\x16\x93\xff\x26\xbd\xec\x6e\xd5\x0a\x49\xb5\xff\xab\x9d\xef\xb2\x19\x1e\xc0\xfb\x4d\xbd\xe7\xd8\x4a\x71\xd5\xa2\x21\x69\x1d\xb1\x13\xd4\xc6\xf2\x5e\xbd\x7c\xff\xa5\x16\xb8\xe5\xd0\xac\x89\x38\x62\x7f\x9d\x5e\x97\xbb\x96\x6a\xf2\x57\xaf\xd5\xa4\x7b\xb1\xfa\x03\xbc\xd3\x0c\xd6\x33\x84\x0f\x99\x5c\x46\x45\xf5\xe2\xda\xda\x2a\x28\xf2\xa7\xa4\x74\xd0\x21\xd9\xbd\xe4\x0f\x59\xf9\x80\x3f\x60\xf2\xe6\x3a\x46\x49\x7a\x7b\x48\x2e\x97\x51\x78\x74\x98\x9d\x6d\x0f\xef\x2b\x41\xfb\x9b\x12\x65\x5d\x46\x49\xe5\xbb\x86\xe8\xc2\x44\xb1\x15\xea\xf1\x7c\x1d\x07\x9b\x82\x9c\xe1\xb6\x20\x67\x1b\xe4\x50\x31\xe7\xc8\x1b\x9a\xe4\xca\x9c\x52\x60\x34\xfc\xfc\x79\xfc\xf2\x43\x16\x79\x26\x5d\x69\x1a\x09\x79\xc0\x7d\xf5\x80\xd7\x79\x50\x9a\xf3\xc8\xcd\x8b\xe3\xf5\x87\x41\xa9\x55\xfd\x13\x2a\x27\xb1\x5b\xb7\xde\x39\x1e\x1a\xd1\xd3\x7c\xaf\x71\x3c\x15\xa7\xde\x43\xea\x21\x30\xa8\x57\x01\x94\xe6\x1a\xc5\xeb\xfd\xa0\x25\x41\x0f\x1d\x92\x8d\x42\x53\xd1\xe6\xc3\x8f\x5d\x14\x62\xdf\xf3\x51\xdc\xe3\x49\x2f\xb4\x8f\x63\x3f\xc1\x7c\x1f\xa0\xfe\x7a\x73\x60\xb7\x27\x5c\x37\x2b\xd1\xde\x3a\xdb\x11\xa2\xe7\x52\xe1\xa0\x5d\xb9\xc3\x95\xda\x76\xa8\x81\xca\x9d\xb4\x68\x91\xda\x7a\x28\x57\xa3\xcd\xdb\x7d\x4a\x5a\xfb\xe8\xd2\x32\x95\xfb\x49\x36\xb5\x4c\x2a\x99\xa6\x4b\xf4\x33\xe4\xb3\x38\x7d\xf3\xe8\x96\x9b\x7e\xf7\x3a\xeb\xce\x0f\x67\x44\xd6\xca\xd2\x98\xd2\xc8\x54\xb3\x20\xb2\x61\x90\xbb\x2f\x64\x41\xe7\x78\xb0\x73\xf2\xea\x29\x4d\x5e\xbd\x12\x2e\xfa\xb5\xc8\x7a\xd3\x9d\xf2\x2d\xa5\x23\xb7\xc4\xd7\x9b\x96\xe3\xeb\xc9\x0a\x8b\xaf\x67\x6d\x0f\xaf\x07\x02\x00\x41\x02\x1c\xb0\x04\x2e\x58\x81\x6b\x30\x03\x07\x60\x0e\x16\x60\x04\x3c\x70\x0a\x26\xad\xe1\xf7\x72\x04\x60\xb4\xcc\x73\xfc\x49\x92\x6b\xda\xa6\x6d\x7b\xb2\x62\x49\x9e\x82\x5c\x49\xd1\x6d\xc9\x40\x16\x52\xa1\x23\x23\x19\x7a\xb6\xa3\x41\x55\xf9\xe3\xb7\xdf\x0d\xdd\x52\x4c\xc5\x12\x75\x55\xd3\x0c\x4d\x56\x4d\x53\x1a\x70\xdf\xad\x6c\x14\x87\x08\xa3\x84\x4b\x17\x2d\xcf\xe5\x57\x8f\xc0\x97\x8d\xef\x84\x7e\xb6\x40\xf1\x1f\xbf\xfd\xae\xea\xaa\x23\xcb\xaa\x6b\x59\x9e\xe5\x68\x86\xe6\x22\x57\x31\x4d\xc3\xb5\x24\x5d\x73\x64\xc5\xd4\x6c\x68\x8a\x16\xcd\x32\x28\x4b\x86\x6c\xe9\x9a\xa4\x99\x9a\xa2\x1a\xa6\x66\x4a\xf2\x80\x3b\x3c\x1d\x73\xe7\x69\x77\xbb\x25\xdf\xaf\xc4\x6e\xa3\x3b\x24\x87\x99\x4c\xd3\x75\x55\x47\x94\x34\x5d\x73\x55\xd1\xd4\xa0\x6c\x99\xb2\x29\xdb\x2e\x82\xa2\x2a\xbb\xba\x61\x5b\xb2\x29\x5a\x9a\xfd\xc7\x6f\xbf\x6b\x92\x2c\xeb\x96\xa6\x4a\x8a\xa8\x98\x92\xa8\x49\xa6\x32\xe0\xaa\x1d\xd6\x23\xa2\x65\x48\xc8\xa2\x70\x99\x96\xe5\x99\xa6\x62\x3b\xd0\x93\x44\xc9\x15\x45\x4d\x55\x2c\xa8\x9b\x8a\x68\x69\x8a\xae\xda\x8a\x25\x99\x22\x32\xac\x3f\x7e\xfb\x5d\x91\x0d\xcb\xb2\x24\x55\x16\x65\xc5\xb0\x74\xcb\x90\x8c\xa7\x45\xe1\x52\x77\x0e\xc2\xa5\xed\x18\x83\x4b\xdb\x2d\x04\x97\xfe\x17\x47\xe0\xda\x2d\xb0\xd6\x9f\x8f\xa7\xa5\x7f\x4e\x38\x2d\x75\x6b\x34\xad\xd6\x70\x73\x99\x69\x93\xe3\xbb\x71\x4e\x2d\x8e\xe1\x4a\x8e\x2d\xdb\x8e\x2e\xda\x9a\x2d\xca\x2e\xd4\x0d\x5d\x71\x2d\xa8\xe8\x92\xa6\x7a\x96\xe5\xc8\x8a\xe1\x18\x64\x63\x2b\x9a\xaa\xca\xa6\x2c\x5b\xba\xae\xea\xba\x69\x4a\xfa\x4e\xb1\x04\xff\x1f\xa0\x96\xd4\xc8\x2c\x46\x4e\xb4\x58\xa0\x90\x1c\x13\x44\x50\xe1\x62\x22\xe5\x71\x91\xc7\x49\xa2\x28\xe8\x2a\xb9\x46\xbe\x90\x14\x72\x9c\xac\xc2\xfc\xf2\x0e\x38\x14\x92\xe5\x81\x9c\xeb\x7b\x1e\x8a\x51\x88\xcb\xad\x71\xc4\xad\x12\x94\x47\x7c\x2b\x71\xc7\x74\x3d\x93\x2f\x11\xd7\xed\x2f\xa2\xc3\xd6\xd0\x81\x15\x3a\xcc\x2e\x03\x69\xf4\x43\xc7\x73\x5c\xdb\xf1\x1c\xcd\xd2\x1c\x55\xf4\x74\xd9\x51\x64\xd1\x53\x55\xdd\x32\x0d\x5d\xf4\x24\x28\x19\xaa\xab\x98\xf2\x1f\xbf\xfd\xae\x9b\x86\xa4\x18\x8a\xac\xc9\xba\xa1\x4a\x92\x62\xc8\x72\x11\xdb\xb0\x2c\x61\x72\x0e\x0c\xc3\x08\x73\x36\xe2\xd0\x62\x89\xef\xb9\x0f\x20\x78\x2a\x5c\x92\x6a\x88\x8a\x86\x24\xc3\x30\x74\xc9\x35\x2c\xd3\x74\x45\x4b\x56\xa1\xa4\xa9\xba\x64\xca\x50\xb4\x0d\x4b\x97\x45\x83\x9c\x3e\xb2\xa4\x4a\xa6\x6e\xea\xa2\x2c\x8b\x9a\xa4\x9a\xa6\xd1\x01\x17\x91\xe2\x21\x35\x42\x4c\xc3\x97\x70\x1f\x00\x7c\x2a\x64\xa2\x67\x21\x51\xb6\x91\xaa\xc8\x9e\x23\x23\xcd\xd4\x3c\xdd\x10\x15\x59\x95\x24\x15\x19\xae\xa5\xa8\x9a\xe3\x29\x8a\x4b\x26\x61\x49\xa2\xae\x5a\x96\x21\x8b\x8a\x22\x2a\xa2\x25\x99\x1d\x90\xd1\xa8\x96\x36\xe2\x56\xf4\xe9\x92\xfb\x00\x92\x36\xb0\x96\x91\x5b\x63\x26\xba\x28\x3b\x8a\xe2\x99\x2e\x39\xed\x24\xcd\x15\x75\x45\x35\xa0\x62\xca\xba\x6d\x19\x36\x92\x75\xc5\x42\x92\x62\xd3\x53\x4a\x14\x55\xd9\xd2\x25\xc9\x14\x55\x51\xd5\x14\x4b\xfa\x5f\x66\xb2\x23\x33\xb1\x64\x41\xd2\x4d\xc6\x4d\xf4\xcf\xe6\x26\xcb\xc8\xfd\x3b\xb3\x0e\x67\x23\xc5\xd5\x36\x81\xa2\x42\x4b\x55\x55\xd7\xd0\x2c\xcb\xd5\x4d\x24\x91\xb3\x4b\xf1\x5c\x5b\x35\x4d\x59\xb4\x25\xc5\x41\xb6\x22\x39\x1a\xd9\x9e\x8a\x66\x99\x92\x28\x2b\x8a\xa1\x68\x86\xa4\xeb\xaa\x5a\x6c\x82\xf3\xb3\xa3\x2e\x96\xb1\xdc\x08\x4f\xb6\x81\x19\x38\xb2\x04\x5d\xc7\xf0\x08\x38\x8e\x2a\x4a\xa6\x8d\x6c\xc9\x53\x4c\x53\xf3\x90\x2b\xa9\x92\xa5\xea\xa2\xa6\x20\x89\x70\x31\x43\x53\x44\x51\x92\x15\x53\x54\x25\x5d\x95\x54\xd9\x30\x5a\xc0\x69\xe3\x14\x6e\x19\xa0\x39\xc6\xcb\xd4\x42\x39\x4b\xc4\x96\xef\x4a\x11\x21\xd9\x90\x15\xa8\x48\xa6\x67\x40\x68\xe9\xa2\x23\x9b\x2e\xb4\x14\x45\x83\x22\x94\x0c\xa4\xca\x86\x6a\x23\x8f\xe0\x51\xb1\x2c\xd1\x52\x65\x53\x57\x24\xc9\x10\x4d\x7d\xa7\xa0\xb8\x1f\xc0\xaa\x03\x96\xcc\xb4\x33\x87\x45\x77\x54\x4d\xf7\x24\x43\xf2\x4c\xd5\x84\xb2\x2d\xab\x92\xad\xb8\x92\xaa\x18\xaa\x84\x5c\xc9\x56\x5d\x49\x86\x8e\x63\xfe\xf1\xdb\xef\x96\x2c\x99\x9a\xa6\x58\x96\xac\x59\xa6\xa9\x18\xa6\xb8\x13\x87\xf8\x00\xae\xbb\x10\x13\x07\x39\x1c\x92\x27\xda\x50\x37\x6d\xc5\x93\x55\xcb\x25\xc2\xb8\xad\x20\x51\x34\x45\xdd\x15\x6d\xcd\x13\x91\x6a\x69\xa6\x67\xb8\x34\x38\xb8\xa5\xc8\xa2\x61\xc9\x96\x21\x1b\xa6\x62\x8a\xc6\x13\x39\x95\xbe\x33\xa7\x32\x76\xe4\x54\xc6\x6e\x9c\xca\xfc\x8b\x39\xd5\x9b\xe9\xf4\x3c\xc5\xed\xe5\xc5\x31\xe1\x2d\x76\x61\x5e\x8a\xb2\x6b\x72\x70\xcf\xf9\xe1\xd3\xa3\xd5\x52\x1e\x05\x1d\x07\x25\x09\xbd\x82\x87\x5e\x0c\xd9\x8d\x7f\x15\x23\xce\x45\xcb\x20\xba\x47\x2e\x67\xa3\xb9\x1f\xb2\xf4\xb3\x14\x92\x2f\xc1\xd1\xcc\xcf\xe1\x68\xfa\x56\x8e\x36\xdb\x40\x97\x35\x7e\x66\x28\xba\xa8\xc9\x06\xb2\x35\xcd\x11\x4d\x68\x89\x1a\x52\x2d\x24\x59\xa2\x2b\xda\x8e\x61\x4a\xae\x63\xea\x50\x91\xc8\x96\x35\x4c\xc3\xd4\x54\xcd\xd2\x15\x49\x33\x44\xd1\x32\x4d\x73\xc0\xbd\xa9\xf6\xde\xe4\x66\x07\x75\x58\x7a\x49\xbf\x0e\x84\x66\x7b\xb2\xed\x21\x59\xd2\x6c\xdb\x14\x6d\x59\xd1\x45\x53\xd7\x6c\xd3\x52\x2d\x49\x54\x44\x5d\xb1\x55\x28\xcb\x32\xdd\x23\xa2\x68\xe9\xa6\x2e\xa9\xa6\xa8\x19\x9a\x21\x9a\xb2\x35\xa0\x66\xc5\x83\x17\x2f\xb8\x65\x8c\x3c\xff\x8e\x30\xaf\x85\xcf\x16\xf3\x03\x98\xef\xb0\x47\x2d\xa4\x39\xd0\x90\x15\xc7\x75\x3d\x64\x38\x22\xb2\x75\xd5\xb1\x4c\xcd\xb3\x6d\x0b\x99\xba\xe8\x42\x53\x81\xb2\x25\x92\xf1\x25\x72\x7d\xd5\x2d\xd9\xd4\x35\x53\x36\x64\xd1\x78\xe2\x45\xb6\x4b\x46\x68\xee\xd1\xae\xdd\x5c\xdf\xa3\x5d\xf4\x50\xdb\xa3\xc6\xbf\x61\x8f\x4e\xfe\x27\x6e\x52\xe3\x73\x36\x69\x97\x88\x57\x6c\xd2\xc5\xee\x9b\x94\x1e\x5e\xba\xad\x68\x92\x43\xee\xca\xa6\x6e\x2b\x96\x21\x6a\x96\xa7\x40\xc5\x33\x2d\xc5\x74\x0d\xc9\x55\xa1\x42\xa4\x5d\x51\x32\x25\x4b\x15\x65\xc9\x94\x4c\x5d\x33\x2c\x4b\x61\x9b\x34\xd9\xb8\x4b\x47\x3b\xec\x52\x59\xb1\x5d\x57\x92\x2d\xcd\xd5\x45\xcb\x55\x3c\x64\xe8\xe4\x1a\xa0\x29\x9e\x2e\xb9\xb2\x26\x49\x32\xb2\x90\xa1\x50\x75\x9b\x22\x19\x86\x2a\x4a\xb2\xaa\xc9\x96\xa1\x29\xb2\x2c\x16\xbb\x34\xf3\x03\xe8\xda\xb1\x5e\x1d\x96\xa4\x4b\xde\xf0\x3c\x45\x55\x64\xd3\x36\x54\x55\x44\xb6\x24\x59\x92\x63\x41\x49\x84\x86\xe7\x48\x50\x56\x10\x12\xa1\x05\x65\x95\xdc\x95\x4c\x53\x57\x55\x5d\xb1\x0c\xd9\x32\x15\xcb\xd0\x74\x69\xa7\xfc\x17\x1f\xc0\x69\x17\x34\x0d\x89\xc3\x75\x34\x88\x3c\x0f\x5a\xc8\x72\x44\x45\x16\x2d\xcd\x33\xa0\x8c\x2c\x28\x43\xcd\x92\x4c\x49\xd7\x44\xc5\x52\x35\x95\xe0\x47\x95\x15\xd5\x90\x14\x49\x16\xc9\xb5\x4d\xd3\x77\x62\x22\x1f\xc0\xa4\xa2\x8e\x8b\x52\x48\x8a\x6c\x20\x86\xe7\xa9\x50\x86\x92\xab\x98\x0a\x74\x6d\x51\xf5\x2c\xe8\x2a\x8e\xe1\xd9\xb6\x62\x89\xaa\xae\xcb\x16\xf2\xa8\x36\x52\x36\x25\xdd\xb2\x2c\xc9\x14\x25\x49\x57\x35\xd5\x7a\x62\x3a\x10\xb5\x2b\xc9\x47\x93\x8f\xa9\x5d\x7c\xa6\xce\xc8\xd4\xae\x7d\x56\xe3\x64\xaa\xfc\xe7\x59\xd9\x3f\xe5\x81\x5c\xeb\xa3\x2d\xce\x3f\x63\x6d\x07\x1c\xb9\x21\x41\x2e\x41\x4b\x18\x43\x8c\x5c\x2e\xf0\x13\x4c\x6e\x48\x99\x4a\x94\xc8\xce\x09\xa5\xec\x28\xc1\x1c\x21\xd2\x44\xe0\x46\x77\x70\xb1\x0c\xd0\x80\x0b\x23\xc6\x8c\xee\xa3\x55\xec\x46\x0b\xe8\x87\x82\x13\x2d\x40\xf9\x7a\x25\xab\x94\x55\xbd\x2f\xb8\x90\x5c\xe5\x42\x39\xbc\x8f\x45\x15\xa5\x5a\x45\xc9\x0a\xae\x36\x30\xb8\xa2\x56\x3e\xf1\xb6\xac\x05\xa4\x11\x61\xbf\xff\xa6\xa9\x8f\x53\x0f\xc9\xe2\x26\x8a\xe7\x10\xd3\x94\xfd\xec\x96\x49\x38\xfa\xdb\x93\xf2\x05\x33\xd3\x53\x95\xa2\x3b\xb1\x47\x0c\xe4\x72\xd0\x8e\x6e\x90\xc0\xbd\x82\x7e\x40\x78\x0a\x8e\x38\x37\xe2\x92\x88\xf9\x5a\xc6\x28\x59\x05\x98\x9e\x42\x31\xf4\x3c\xdf\xe1\x6c\x84\x6f\x11\x0a\x39\xb8\xf4\xf7\x12\x14\xdf\x90\x5b\x6d\xe8\x72\x1f\x57\x36\x0a\x10\xe1\x93\xa4\x13\x2f\x8a\x6f\x61\x4c\x41\x8b\x8a\x03\x06\x70\xfe\x62\x09\x59\xa4\x29\x52\xdf\xc1\x01\x17\x44\x33\x86\xb5\x30\xbd\xf7\xfe\xf5\xab\xda\x72\x6c\xa9\xed\xc7\xdd\xb6\xeb\x72\x57\x4e\x9e\xe2\xe0\x9a\x0c\xa7\xc2\x4f\x77\x6a\x6f\xd2\xff\xeb\x72\x29\x00\xea\x34\x1e\xf8\x21\x62\x69\x15\xba\x92\x23\x74\x76\xa1\xb0\xa4\x0a\xd5\x74\x0c\x95\x18\xf8\x2c\xfe\x3f\x97\xfd\x33\x59\xec\xe9\xf9\x8f\x60\xb6\xa7\x6e\x85\x2f\x59\xd9\x7b\xf4\x29\x8a\x46\x79\x6f\xc9\xf5\x90\x46\xa5\xcf\x9c\xf4\xd8\xb8\x53\x6a\x92\xc3\xd2\x2a\xd0\x98\xf0\xcb\x92\x75\x0e\x81\x8d\xa5\x36\x6f\x14\x37\x93\x0f\xd4\x6b\xb4\xe4\x10\xa8\x54\xc9\xfd\xba\x14\x90\x79\x02\xe6\x89\x03\xda\x2b\x52\x37\x5b\xfa\xc2\xbb\xc7\xcc\x5c\xc1\xfb\x32\x4e\xfe\x37\x47\x40\x35\x47\x40\x3b\x8d\x96\x30\xd5\x3e\x76\x8c\xbc\x18\x25\xf3\x8c\x8b\x91\x11\xa0\xed\x87\x2e\x22\x14\x23\x52\xa0\x6c\x1c\xee\xa5\xd5\x68\x83\x04\xe1\x1a\x88\x19\x34\x45\xad\xca\x18\xf9\xd3\x5d\x04\x5d\xe4\xb6\x91\x76\x5a\x31\xf5\x95\x22\x4c\x32\x5a\xc5\x0e\x4a\x4a\x99\x23\x92\xa5\x1f\x86\x28\xe6\xd2\xbf\x7b\xc9\xa2\xda\xd1\xd3\x60\xd8\x65\x68\x29\x1f\xb4\x18\x9e\x0c\xbb\x21\x5f\x08\xd9\xc7\xa5\x9f\x74\x27\x5f\x01\xff\x6f\x98\x5f\x65\x92\xc6\x4c\xe4\x8b\x4d\x5f\x36\xd1\x69\xdb\xf2\x15\x13\x9e\x3a\xfe\xec\x00\x86\x94\x7a\x28\x4f\xca\x7e\x67\x7b\xf6\x15\x4d\x02\x92\x05\x1f\x7c\x5a\x4a\x0b\x05\xe4\x21\x2f\x37\xe4\xb0\x09\x77\x4f\x1b\x53\x0a\xf1\xd6\x48\x98\x72\x77\x77\x27\x94\xfe\xff\xc5\xdd\x5d\x3a\x87\x4a\xbe\x98\xcc\x8c\x60\xe7\x21\xd3\xa0\x57\xbb\x0d\xe7\x80\x25\xb8\x6e\xf4\x9d\x2e\x52\xd9\x73\xb5\x75\xc4\x5a\x85\xea\x78\xe9\x2d\x08\x31\x01\x89\xd4\xb8\x02\xee\xf6\xa1\xd2\xab\xcf\x96\xf1\x8a\x5a\xd5\x41\xf3\x0f\x57\x60\x95\xae\x7c\x7a\x7b\x69\x1f\xae\xf4\x75\xc3\x70\xa5\x5a\xd5\xe1\xf2\x0f\xe9\x3e\xad\x7b\xa9\x77\x1e\x8e\x87\xc5\xaf\x02\xaa\xb2\x13\x6b\x2b\x40\xd5\x0a\xd5\xd3\xad\x7c\xe2\x13\x29\xa0\xcc\xb0\xca\x2c\x44\xaa\xf2\x0c\xb3\xf4\xf3\x2e\xd8\xd3\xba\xe9\x9e\xf0\xa8\x3c\xb6\x3d\x7f\x05\x26\x1d\x32\xd0\x2d\x33\x64\x4a\x7f\x11\xd6\xb9\x41\x1a\x6a\x25\x86\xcc\xa8\xbe\x95\x31\xe4\xdf\xaa\x2b\x51\x03\x8f\x54\xa4\x47\xfd\x1e\x75\x3b\xaa\x60\x88\x1d\xfa\xe5\xb0\xac\x05\x44\xcc\x44\x67\x03\x91\x26\x5b\x37\x44\xf2\xa4\x1d\xc1\xac\x81\xb6\x0f\xb8\x6d\x5b\x34\xaa\x75\xee\x8b\xd3\x2d\xfb\x22\xd9\x6d\x63\x34\xaa\x75\xef\x8c\x6d\xf2\x53\x4a\x31\xf9\x6f\x76\xee\xb5\x8a\x41\x38\xf6\x61\x38\xeb\x12\x84\x1a\x2b\xcb\x8a\x53\xd9\x75\x5b\xa2\xa1\x69\x23\xd1\x50\x1a\x59\x04\xcc\xab\x89\x86\xa6\xb5\x44\x43\xd3\x22\xd1\x50\x35\x92\x83\x0a\x3c\x16\xfd\x80\x05\x15\x52\x4b\x71\x75\xe6\x1a\xcd\xcc\xc2\x9a\xea\x40\xaf\x07\x3e\x30\xca\xf1\x1c\x58\xe4\x95\xb3\x72\xe8\x07\xb3\x9f\x07\x5e\xfc\x09\x48\x32\x50\xeb\xe5\x92\x08\xee\x81\x24\xe5\x51\x24\xcc\x46\xc4\x13\x89\x4d\xc0\xca\x03\x95\xc8\x40\x12\x9f\x10\x17\xa5\x08\xdc\x21\xe5\x41\xde\x88\xc8\xdf\x11\x18\xa5\x54\xa1\x1e\xc4\x43\x2a\xe2\x4d\x4a\xf2\x0e\x41\x3c\xf0\x6e\x51\x3b\x24\xb3\x1e\xb5\xa3\x1a\x9f\xbe\x2b\xa8\x4a\x1a\x02\x4a\xc9\x5a\xc9\x12\xe0\x39\x6a\x6b\x49\xf8\x1a\x53\x45\x65\x06\x8a\x1c\xba\x5b\x46\x09\x4a\xb8\xcc\x19\x82\x63\xfe\x9c\x2c\xdd\xa6\x9f\xa4\x8d\xe8\x7d\x7c\xee\xbb\x88\xc3\xf3\x28\x41\x59\xa5\x8d\xb1\x41\x68\xbc\x2a\x19\xbc\x03\xaa\x01\x24\xb1\x1e\x4a\xba\x14\xa1\x2a\xcb\xd4\x33\xdd\x9c\xa9\xa7\x3d\x98\x42\x6b\xa6\x9e\x66\x28\xe7\xb4\x6a\x57\x48\xab\x3c\x44\x22\x16\x1a\x86\xdf\x59\x94\x05\xbd\x2b\x6e\xc2\x86\x7e\xeb\xd0\x16\x01\x0a\x70\x66\x1c\xfe\x84\xaa\x8f\x8f\x85\x81\x79\xa3\x3d\x25\x8d\xb3\x4f\xab\x96\x74\x3d\x95\x4b\x63\x37\x76\xea\x41\x29\xaa\xcd\xfa\x6b\xe0\xfa\x31\x72\x88\x30\x4e\xb3\x59\x5c\xff\x08\x7c\xe1\xdb\x63\xe0\x0b\xc9\x0c\x5c\x0b\x67\x1a\x98\x09\x3f\x5e\xab\x60\x26\x9c\x8f\xe6\xc0\x17\xde\x05\x60\x26\x7c\xf7\xdd\x21\xa9\xf5\x2d\xf0\x85\x15\x98\x09\x27\xb3\xef\xc0\x4c\xf8\x74\x73\x0c\x66\xc2\xd8\xfa\x15\xcc\x04\x77\x7a\x03\x66\xc2\xb7\x8b\x5f\xc0\x81\xf0\x0b\x98\x09\xe1\x27\xd2\xed\xe8\x5b\x30\x13\x22\xfc\x0e\xf8\xc2\x8f\xa7\xc0\x17\xbe\x8b\xc1\x35\x19\x66\x26\x1c\x9e\xe8\x60\x26\xbc\xfd\x74\x00\x66\xc2\xaf\x47\xaf\xc0\x4c\x78\xad\x69\xc0\x17\x5e\x91\xc6\x77\x17\xe7\xa4\xfb\x8f\x16\x98\x09\xb3\xc5\x0f\x64\xfc\x4f\x67\x57\xa5\xa4\x3e\xb9\x2a\xa0\x2d\xf3\xcd\x92\xec\x81\x70\x46\xd3\xee\x28\x1a\x4d\xb1\x53\x13\x88\xb6\xb5\x62\xe9\x75\x68\xe4\x22\x3b\x46\xf0\x63\x6b\x5a\x9e\xfc\xeb\x80\xfe\x77\x0f\x06\xc1\x3e\x4b\xb8\x23\xeb\xda\xd6\xf6\x1c\xc7\x75\xa6\x0d\x4a\xd3\xf6\x88\xe2\x7f\xad\x85\xce\x59\x7a\x51\x88\xf7\xc8\xe5\x68\x20\x29\xcb\xbb\x7d\xfa\xf3\x96\xa5\x07\xb2\xa3\xc0\xdd\x4f\xe7\x33\xd0\x96\x77\x9c\xb8\x66\x37\x61\x81\xde\x64\x5b\xb3\x1a\x41\xe7\xe3\x2c\x8e\x56\xa1\x4b\x33\x1b\xed\x97\xb2\x1c\xe5\x3d\x89\x74\x90\x81\x1f\xce\x51\xec\xe3\x7d\x67\x15\x27\x51\x3c\xa0\xe1\xd6\x50\xbc\x16\xea\xa7\x5e\xdb\x30\xd1\x0d\x8a\xbd\x20\xba\xa5\x0b\x91\xe2\x8d\xa0\x69\xbf\xc8\x56\xa4\x6a\x14\xf9\x15\xb9\x69\x73\x7e\x23\xd6\xa2\x9c\xdf\x88\xa6\x35\xd9\x29\xc3\x4a\x64\xb4\x27\x38\xba\xfd\xa6\xa5\x1c\xae\x81\x7d\xd2\x52\x9e\x94\x53\xb2\xa4\x89\x56\x76\xc9\x7c\x54\xf6\xc0\x18\xb6\x5e\xd5\x50\xc3\xf5\x62\xd8\xb8\x5f\x21\xe1\xf0\x74\x7c\x3d\xfd\xf1\x7c\x34\xe4\x53\x5e\x42\x0a\xab\xce\x4e\xc3\xda\x25\x09\xb5\xb9\x9c\x0d\xdb\x6e\x36\xa8\xcd\x07\x6d\xd8\x76\x29\x41\xed\x5e\x4b\xc3\xda\x7d\x01\xd5\x7d\x7b\x86\x75\x79\x15\xb5\x3a\x33\x0d\x5b\x05\x4c\xd4\xea\xde\x34\x6c\x95\x0d\x51\xee\x52\xca\xfa\xab\xdc\xfe\x51\xee\xc0\x35\x2c\xa4\x7b\x54\xf3\x5e\x1b\xd6\x95\x80\x48\x78\x75\x79\x7c\x9c\x8e\x7e\x3c\x9e\x4c\x87\x35\xff\x8f\xd6\xbc\x53\x45\xa2\xa9\x74\xe5\x6a\xe9\x87\x32\x6f\xf6\x34\x51\x13\xb5\x5a\xbf\x38\x7b\x3b\x3e\x1a\x5d\xf0\xeb\x2b\x10\x14\x1d\x54\xc1\x03\x7e\xf2\x4d\x14\x05\x08\x86\x83\x67\x62\xd6\xfa\xe0\x70\x3a\x7e\x7b\x30\x1d\xa5\xf1\x05\xb3\xba\xa5\xf4\x50\x35\xbf\xbb\xb4\x1d\xb5\x01\x61\x6d\x2e\x2f\x8e\x3b\xaa\x67\x8e\x66\x2d\x6d\xd2\x4f\xed\x19\xa9\xda\xfc\x1a\x17\x30\xf9\x58\x82\xbb\xd4\x57\x56\xa5\xbb\xaf\x49\x3b\xfc\x93\xce\x09\x34\x7d\x27\x2b\xb8\xab\xac\x47\x01\xd3\xe5\x64\xc4\x91\x46\xdc\xe1\xd9\xe9\xab\xf1\xeb\xcb\x0b\x96\xdf\xeb\xd5\xd9\x05\x57\x1a\xae\x0b\xb6\x16\x64\x4d\x76\xc6\x56\xc3\x45\xb3\x05\x5d\x93\x9d\xf0\x95\xbb\x33\xa6\x2d\xf3\xd0\x93\xad\xb5\x6b\xf4\x9d\x35\x6a\x09\x5a\x99\xe5\x0b\x3b\x0b\x83\xfb\xc1\x33\x71\x7d\x05\x60\x23\xc3\x9a\x20\x08\x51\x23\x2d\x59\xc5\x13\xad\x82\x79\xbf\x2d\x3c\x51\xbe\x2d\x58\x39\x97\x36\xa7\x6f\x55\x2d\x49\xcf\x72\xa7\xb5\xee\x9e\xf3\x2a\xb5\x9e\x33\x2b\x3d\x7e\x0d\x04\x41\x08\xae\xd6\x20\xf9\xe2\x33\x2a\x22\xf9\xfc\x25\xd3\xea\xec\xbe\x31\xb7\x35\x30\x24\x49\xdb\x2d\x31\x99\xd7\x7e\x6a\x4e\xbf\x60\x5a\xc0\xf3\xe3\x83\x22\x8d\xdf\x79\x00\x2b\x79\xfe\x18\xff\x4e\x3f\x66\xfc\x7b\x7c\x3a\x99\x1e\x9c\x1e\x8e\x28\x47\xbd\x3e\x1a\xbd\x1d\xf2\x2e\xba\x19\x87\x09\x86\xa1\x83\xb2\x73\xb1\x5a\xeb\xfc\xe2\xec\x88\x32\x75\xb7\x5e\xef\xe4\xe0\xf0\xcd\xf8\x74\x74\xfd\x66\x74\x70\x3c\x7d\x73\x7d\xf8\x66\x74\xf8\xdd\xe4\x7a\x74\x7a\xf0\xcd\xf1\xe8\x68\xc8\x2f\xa0\x33\xf7\x43\xf4\x06\xc1\x00\xcf\xa9\x1a\x2d\x61\x6e\x70\xf4\x9c\x61\xd5\xae\x0f\x2e\x8f\xc6\xd3\xeb\xe3\xb3\xd7\xaf\xc7\xa7\xaf\x87\x3c\xbb\x5e\x1c\xac\x5c\x1f\x1f\x47\xb3\x19\xd5\x35\x20\x81\x1c\x48\x64\x4a\x67\x47\xa3\xeb\x0a\x70\x43\x9e\x9c\x4e\x28\x3e\x8d\x5c\x54\x85\xee\x73\x72\x19\x12\x7c\x82\x39\x4c\x4e\xa3\xa3\x28\xd3\xa3\x90\x5d\xda\x20\xac\x32\x8b\xca\x88\x85\x94\xf1\x1b\xb2\xe0\x95\xdb\x5e\x15\x5d\x36\x56\x24\xeb\x37\xfb\xc0\x91\x0f\x3c\x58\xc6\xfe\x02\xc6\xf7\xe9\x6b\x40\x05\xaa\xe6\x72\x3d\xbd\x8f\x4e\x0c\x83\xcc\xe2\xa6\xc4\x47\x59\x65\x8e\x54\xe6\xaa\x43\x14\x1d\xb6\x2d\xef\xe6\xb3\x97\x56\xe5\xd2\xaa\xa5\x9e\x36\x52\x59\x6b\x97\x69\x0b\x8e\xb5\xe0\x58\x0b\x9e\x25\x16\xd4\x4d\x4b\xdf\x69\xff\xb6\x6d\x54\x7f\x0d\x7e\x6c\xdd\xd6\xf9\xfe\xa5\x9b\xb6\xd7\xf3\x1f\x1f\x7b\x3e\xdb\xac\xe3\x93\x83\xd7\xa3\x21\x1f\x25\xe3\x05\x9c\x21\x1e\xf8\xfd\x82\x24\xc3\x0e\x92\xf4\x59\xab\x36\xdc\x9f\x4d\x38\xfa\x8d\xcf\x3e\x26\xdf\x40\xe7\x23\x0a\xdd\x23\x88\x21\xa9\x47\xae\x29\x7e\x38\x3b\xb3\x7f\x41\x0e\x1e\x64\x4e\xbd\xf4\x8e\x3c\x48\x95\x87\xf4\xce\x5b\x2e\x59\x53\xdc\x18\xa2\xa4\x8a\x3b\xe1\xe6\x6d\x0b\x12\x0e\xdb\x93\x2e\x1a\x96\xa1\x6b\x8d\xa4\x8b\x69\x2a\x46\x58\xf0\xbb\x64\x18\xf7\x34\xc9\x30\x45\x96\x75\x31\x4d\xaa\xb8\x2c\xd2\x27\xba\x79\xfa\x44\x9a\x75\x91\xe5\x57\x2c\x32\x29\xae\x6a\xd1\xa6\x9d\x2c\x4d\x15\x90\xfa\xc0\xd9\x18\x73\xdc\x22\x15\xaa\x49\x27\x9c\x54\xb5\xe3\xb4\x06\x14\x77\xd2\x80\xa2\x4e\xa6\x23\x71\xa8\x42\x25\x5c\x05\xc1\x70\x88\x04\x66\x5f\xf8\xf8\x58\xfd\xcd\x12\xe1\xbe\x24\x85\x83\x6a\x99\x90\x42\x34\x45\x77\x98\xf4\xd5\x48\x50\x71\xdd\x98\x5b\x39\x69\x20\x85\x7e\x75\xd9\x93\x72\xb0\x37\x82\x4b\xab\x15\xf1\xaf\x2b\x80\xb0\xfb\x29\x81\x03\xf0\x95\x50\xd8\xb3\x2e\x08\xda\xf2\x88\x1b\x64\x04\x96\xe0\x42\x32\x37\x03\x25\x57\xa0\xda\x01\x89\x4c\x1b\x57\xc3\x22\x2b\xec\xca\xf8\xc1\x10\x2a\x95\xa7\x73\xf0\xb9\xd3\xb1\xfe\x96\xd3\x99\x7f\xe6\x74\x64\xf1\x6f\x39\x9d\x72\x1a\xce\xdd\xe7\x52\x22\xff\x46\x96\xce\xa7\x63\x46\xfe\x5b\x62\xc6\xfb\xdc\xe9\x28\x7f\xcb\xe9\xd4\xf3\x7a\xee\x3c\x1d\xf5\x6f\x39\x9d\x7a\xce\xcf\x9d\xa7\xa3\xfd\x2d\xa7\x53\xcf\x0a\xba\xf3\x74\xf4\xbf\xe5\x74\xc6\xed\xd9\x1c\x9c\x34\x9b\x43\x3e\xbb\x3c\xeb\x2e\x9d\x52\x47\xd6\x5d\x27\x8d\x4d\x9f\x07\xf6\x4a\xcf\x58\x81\xda\x48\x65\xe1\x22\xb2\x42\x96\x29\x9f\xbd\xb1\xe0\xfe\x3a\x13\x37\x2a\x91\xd8\xe5\xe2\xa4\x6c\x04\x30\xaf\x76\xee\x08\x27\xaf\x83\x1e\xb3\x91\x63\xc9\xf5\x59\xff\x7b\x3c\x40\xb5\x63\xfb\xa2\x6b\x09\xd9\xab\xa0\x58\x92\x8c\xf2\x77\x42\x67\x73\x1e\x20\x06\xba\x52\x79\x05\x74\xca\x19\x4a\x1a\xe9\x06\x1c\xfa\x3c\xa6\x81\x19\x90\xeb\x51\xdd\x33\xea\x51\xb2\x5a\x3a\x38\xd8\xa1\x96\x01\xe6\x3b\xd4\x32\xc1\xa2\x33\xcb\x44\x51\xcb\x02\xa3\x2d\x7d\x65\x92\x20\x45\x54\x25\xed\x4c\x2a\x77\x49\x80\x1f\xf0\x8d\x9a\x5b\x30\x28\x95\x50\xa8\xe5\x85\x9b\x71\x28\x69\xc0\xdb\x61\xe2\x92\x0e\x4e\x77\xa9\x66\x80\xc9\x2e\xd5\x4c\x70\xb6\x23\x86\x68\x75\x0b\x8c\x59\xf5\x6c\x23\x49\x7a\xb9\x4e\x1b\x5f\xc0\x8c\xb2\x41\xdc\x26\xaa\x56\x1f\x4a\x53\x45\x06\xf9\x90\x66\x59\x72\x9a\xe1\xf5\xe3\xd6\x44\x7f\xe5\x0b\x78\xd6\x5e\xda\xa9\xfd\xbb\x37\xe3\xe9\x68\x72\x7e\x70\xf8\xc4\x76\x27\x07\x3f\x5c\x1f\x8f\x4e\x9f\xd6\x28\x4d\xd7\xf9\xa4\x36\x45\xd6\x01\x27\x0b\xfe\xff\x3f\x0d\x2d\xf5\x29\x16\xad\xd8\x9b\x6e\xcc\xae\x30\xc9\xab\x28\x5e\x1c\xc4\x31\xbc\x17\x02\x14\xce\xf0\xfc\x5f\x52\x1a\xde\xff\xb0\x1a\xde\xbf\x12\xd2\x3f\x0d\x5d\x59\x19\x71\x08\x85\x9b\x9f\xf2\xf0\x52\xcb\x09\x8b\xb0\x45\xc3\x25\x25\x5f\x0d\x43\x74\xcb\x85\xc2\xdd\xf7\x34\xf6\x52\x6d\xe4\x5a\x08\xa6\xec\xc0\x8a\xe2\x45\x92\xc5\x93\xa5\x01\xa0\xd3\x10\xa4\x3d\xd4\x7f\xc8\x8f\xb5\x65\x8c\x6e\xfc\x68\x95\x50\x55\xe5\xb3\xd2\x21\xe8\xac\xe2\x18\x85\x4c\x85\xf9\xfc\x79\x47\x31\x8b\x24\x5b\xc3\x43\x6b\xb8\xd3\x22\x70\x69\x73\x72\x34\xb2\x69\xf0\xe4\x78\xa8\xe5\xa8\xa7\x14\xd3\xad\xd0\xe4\x01\x75\x1b\xa1\xe9\xaa\x07\x7b\x59\x2f\x22\x38\x73\x3f\x70\x63\x14\xe6\x8d\xf0\xf0\x5f\x34\x4e\x72\x0f\x0b\x34\xfd\x85\xb0\x5a\xba\x10\x23\x8a\x86\x83\xd0\xa5\x81\x79\x7d\x7c\x4f\xee\x02\xe4\x7f\x2c\x12\x59\x16\xdd\x2e\x63\x3b\x64\x0d\x7d\xc1\xb9\xed\x3d\xac\x8b\x50\x6d\x9f\x01\x49\x22\xcc\x05\xe8\xba\x47\x2c\xd2\x5c\xaa\x37\xec\x91\xb3\x18\xe0\x7e\x1f\xa0\x75\xf9\xfc\xcf\xc2\xa4\xd6\xf1\xc2\x32\x71\x1d\xe0\x1e\xea\xaf\xa1\xeb\x9e\xa2\xdb\x0c\xdc\xd6\xea\x34\xb6\x64\x10\x1c\x24\xd3\x68\xe5\xcc\x91\xdb\xeb\x83\x67\xad\x15\x53\x97\xf9\x0e\xda\x58\xae\x92\x79\x39\x58\x5b\x66\x07\x42\xe9\xf3\x08\x25\x38\x8e\xee\x33\x10\x9a\x84\x22\x84\xe8\xae\x88\xa7\xde\xfc\xec\x44\x8b\x25\x99\x79\x25\xec\xd8\x6e\x31\xc2\xaa\x71\xc1\x9c\xcd\x71\xc1\xf0\xc7\x19\x33\x7e\x4c\xf8\xab\x2b\x40\x4f\xd5\x64\xf0\xc0\x56\x71\xc0\xb3\xbf\xfc\xba\x14\x27\xcc\x11\xa6\xd3\xa3\x2c\x4e\x98\x94\xc6\x09\x53\x77\x8f\x13\xd6\x1a\x0f\x8c\x41\x50\x38\xf0\x3a\x9e\x64\xd9\x86\x21\xdb\xa2\x62\x68\x50\x76\x6d\x55\x74\x3d\x1b\x79\xa2\xad\x3a\x8a\x6e\x43\xd3\x31\xa1\xe7\x52\x2f\x66\x4d\x53\x2d\xc5\x92\x4c\x53\xd3\x24\x43\x16\x15\x6b\xa7\xc8\x03\xff\xf3\x1d\x78\x77\x72\xc7\xfd\xdb\x7a\xd3\xe2\xb6\xa0\x19\x94\x3c\xb8\x72\xbc\x0c\xd1\x90\x35\x4b\xb1\x35\xc3\x32\x74\x55\xb2\x24\x13\x3a\xa2\x29\x39\xb2\x29\x59\xa6\x27\x2a\x9e\x09\x6d\x59\xf5\x20\xf5\x18\xb5\x0c\x4d\x36\x65\x5d\x31\x35\xcb\x34\x64\x49\x96\xd4\x5d\x08\xe5\xb0\x32\xf6\x47\x74\x9f\xb0\x18\x37\x09\x86\x31\xa6\xe6\x6f\x28\x74\xb9\x5b\x1f\xcf\x39\x18\x72\x30\x58\xce\x61\xb8\x5a\xa0\xd8\x77\x38\x67\x0e\x63\xe8\x60\x14\x03\x5a\xcf\x81\x21\x97\xca\xb2\x5c\x14\x06\xf7\x5c\x80\x30\x46\x71\x02\xb8\x70\xb5\xb0\xe9\x3f\xe6\xf7\xcb\x39\x0a\x13\xc0\xad\x42\x17\xc5\x89\x13\xc5\x28\x61\x8d\xdd\x08\x27\x42\x3d\x5e\x5c\x37\x5e\x1c\x88\x4c\xcf\x80\x8e\x66\xd9\xba\x6a\x2b\xb6\x2a\xa9\x9e\x6c\x7b\xa2\x6b\x1b\xa6\xa1\x89\xa2\x64\x29\x50\x83\x2a\xfa\xe3\xb7\xdf\x35\x53\xd4\x55\x45\xb6\x34\x55\x94\x24\x55\xb1\x64\xed\xcf\xa0\x25\x8c\x30\x97\xc6\xce\xe7\x6e\xf3\x54\x2b\x5c\x14\x12\x34\xd1\x19\xf8\x3b\xae\xac\xe8\x8a\x2e\x14\x3d\x5b\x95\x2c\x43\x94\x15\xc3\x35\x55\xc9\x90\x5c\xd7\x73\x4c\xd3\xb6\x5d\x4b\xb4\x91\x09\x3d\xf3\x8f\xdf\x7e\x97\x34\x59\xb2\x44\x43\x56\x4d\x43\x96\x45\x51\xb1\xb4\xcf\x5e\x59\x78\xc7\x31\xd1\x87\xf3\x13\x4e\x57\x8a\x25\xa4\xa0\xb7\x06\x47\x6b\x82\xae\x69\x2a\x92\xa1\x63\xc9\x92\x21\xbb\x06\x74\xa1\x24\x21\xc3\x76\xa1\xa1\xda\x0a\x84\x86\xa4\x41\xd3\x45\x06\x0d\x45\x25\x8b\xa6\x2a\x2b\x9a\xaa\xa8\x22\xa1\x48\x53\x13\xa9\x8f\x26\x3d\x4a\x18\x51\xe1\x79\x9a\x7d\xed\x23\xba\xe7\x60\x10\x23\xe8\xde\x73\xe8\xce\x4f\x18\x3d\xb4\xc6\xc9\x6a\xa5\x07\xc9\x40\x8a\xa1\x98\x2e\xb4\x6d\xdb\x71\x75\x51\x56\x44\xcd\x44\x96\xec\x5a\x12\x45\xaf\x67\x22\x57\x21\xd8\x54\x0c\x55\x52\x4c\x4b\x56\x65\x4b\x52\x4c\x49\x52\x76\x0a\xd6\x76\x58\x1f\x7b\x85\x98\x0b\x68\xea\x73\xee\x7b\x9c\x8f\x93\xe2\x03\x21\x14\xea\xad\x2e\x74\x45\xd5\x6a\xce\xc2\x52\x44\xc7\x53\x45\xd9\xd2\x2c\xcd\x92\x90\x6a\x6a\xc8\x30\x2d\xc7\x45\xaa\x03\x21\xf4\x54\x13\x5a\xa2\xab\x2a\x0e\xa9\xaa\xcb\x96\xa4\xc9\x8a\x62\x48\xa2\x2e\xab\x92\x61\x7d\xe6\x24\xfe\xb3\xdb\xbd\x35\xa8\x57\x13\x31\x8a\xae\xa9\x50\x34\x0c\x5b\x54\x55\xcd\xb0\x1c\x49\xd3\x64\x5d\x95\x55\x55\xf2\x6c\xcb\x95\x55\x68\x6b\xa2\xe1\x42\xea\xaa\x2e\x1b\x96\x6a\x4a\xa6\x65\x58\x92\xa6\x59\xba\x6a\xea\x7f\x0e\x33\xdb\x77\x7c\x6b\x08\xb0\xe6\x24\x0c\x55\x82\x92\x25\x79\x9a\xae\x43\x0f\x99\xaa\xa3\x88\x86\xad\x48\xb6\x64\x68\x86\xe8\x79\xc8\xd4\x44\xd7\x51\x6c\x8b\xec\x30\x5d\xd4\x74\xcb\x50\x24\xc3\x92\x24\x5d\x14\x75\xf1\x4f\x2c\xef\xe6\x3d\xdf\x1a\x4d\xaa\x65\xcf\x5b\x9e\xed\x42\xcf\x56\x2d\xdb\xd5\x14\x64\x20\x24\xe9\x90\x30\x29\xcd\xd2\x25\x49\x86\xba\x2b\x3b\xb6\x67\x88\x7f\xfc\xf6\xbb\x2a\xe9\x9a\x61\x18\xaa\xaa\xeb\x86\xac\x1a\xba\xfa\xd9\xb4\xd9\xb6\xc1\x08\x9b\xa8\x6f\xaf\xf7\x65\xbf\x59\x50\x77\xf1\x6d\x3a\xba\x76\x38\x84\x51\xbf\xdd\x0e\xe7\xba\x2e\x67\xbc\xbf\xd2\xe9\xae\xea\x61\x53\xf7\x04\x4e\x5d\x3a\xa8\xac\x5e\x75\x1d\x63\xe6\xce\xa9\x3f\x4c\xd3\x8f\xae\xe2\x84\x07\xdd\x34\x20\x44\xe1\xdf\x93\xeb\x66\xa8\x1f\x27\xcf\xbc\x39\xa9\x03\x10\xf9\x47\xee\xbd\x87\xc3\x3d\xe8\xba\x35\xb7\xce\xdd\x7d\xf4\xb6\x01\xdf\x58\xb5\xf2\x12\xe7\xba\x4d\x0c\x7d\x52\xb9\xbc\xe4\xed\xce\x86\xf9\x21\xc8\x40\xd9\xe8\x81\xc7\x6a\x55\x1d\x61\x48\x59\x79\x1d\x50\x1c\x67\x7d\xd7\x5d\xfd\xde\x67\x59\x46\x99\x7e\xaf\x0b\x16\x4a\xe1\x3b\x40\x93\xd5\xab\xc2\x73\x93\x7b\x37\x56\xba\x66\xb7\xc9\x7c\x45\x33\x68\x6d\x1c\x72\x64\xc1\x7c\x27\x62\xff\x60\xf5\x9a\x6b\xae\xa4\x4e\xde\xa9\x56\xbb\xea\x7c\x56\xcc\xf9\xaa\x25\x3c\xf2\x66\x48\x36\xd1\x16\x53\x72\xf3\x65\xb8\xaa\x70\x94\xdd\x88\x70\x0c\xa9\xab\x6e\xba\xc5\x24\x73\xbb\x47\x50\x55\xb3\xdd\x54\x6c\xef\xa0\xd7\xae\xe6\xb7\xa7\x6a\x6d\xfc\xe6\x5d\x4f\x05\x4a\xf6\x55\xab\xa7\x54\x75\xca\x89\xed\xd9\x14\xd5\x42\x49\xbd\xda\x90\x7f\x59\x6b\xd8\x18\xd4\x75\xa4\xb9\x16\xfb\x9a\xa9\x53\x99\xda\x59\xaf\x7f\xb7\xc0\x05\x90\x45\x20\x95\xd2\x4f\x17\xaa\xea\xea\xdc\xa5\x92\x52\xd6\xdc\xf0\xb8\x91\xbb\xee\x54\xf4\x10\xeb\x5c\xdf\x2d\x03\x9e\x3b\x38\x3a\xe2\xf8\x36\x98\x2b\x6e\x2e\x75\xed\x2d\x0f\xd8\xd3\x0e\xae\x3d\xf5\xe0\x8a\x92\x8c\xbd\xf4\x54\xcb\x84\x25\x8c\x51\x88\x33\xed\x9f\x51\x7d\x3a\xea\xec\xaf\x64\x73\x81\x6b\x36\x17\x3e\x0e\x50\xf6\x50\xa4\x76\x69\x15\x3f\xbb\xfb\xc2\x92\xa2\xad\x6b\xc6\xa8\xf3\xde\x6b\x5a\x99\xac\xc3\x2e\xd5\x59\xd3\x3f\x25\x73\x4d\x59\x52\x0f\x91\x25\xf5\x3d\x59\x52\x4f\x93\x25\xf5\x40\x71\x05\xf2\xaf\xf0\xd3\x8f\x60\x2a\x9c\x69\x60\xca\xea\xfe\x7a\xf4\x0a\xf8\xc2\xe1\x08\xf8\xc2\x9d\xc8\xfc\x4a\x96\xd4\xaf\x24\xf7\x62\x59\x52\x1f\x94\x25\x75\x33\x59\x0a\x6f\x3f\x1d\x94\x1d\x4c\x2a\xfc\xb9\xcd\xfd\x00\x06\xfe\x2c\x64\xf1\x15\x06\x36\x4c\x50\xe0\x17\x9e\x12\x7b\x01\xf2\xf0\x40\xd0\x63\xb4\x58\x0b\x05\x57\x68\xf5\xbb\x28\xfc\x2c\x58\x55\xe8\x76\x78\x3b\xc4\x33\x3f\xa4\xce\x29\x12\xed\x96\x01\xb8\xd1\xd9\x22\x6d\x43\x81\x11\xd7\x42\xce\xfd\x36\x7b\x53\x98\x82\x41\x06\x28\xbb\x53\x58\xaa\xb2\xa3\x5d\xe8\x69\xab\xd7\x44\xd9\x76\x8a\xd9\x3b\x85\xb9\x15\x54\x61\xe4\x14\xb5\xbf\x61\x86\xe9\x1b\x66\x58\x7e\xa1\x4d\x30\x2a\xf8\x4d\x1f\x84\x19\x3f\xa4\x81\xf4\xb3\x6f\x71\x14\x04\xe4\xac\x31\x49\x05\xca\x0e\x42\x74\x87\x27\x18\x2d\x2b\x1c\x21\xac\x3f\x77\x86\xe9\x8b\xe4\x57\xfe\x62\x19\xf8\x8e\x8f\x33\x8d\x58\xf6\x81\xa5\x23\x14\xa2\xf0\x34\xed\x2f\xd3\xd4\xae\xc9\x48\x8c\x59\xa4\x7f\x4b\xef\x95\x41\xed\xbd\x32\x2c\x73\xf5\xd2\x1c\xb2\xf9\x2d\x51\xbc\xb7\x84\x21\xcd\x90\x9e\x7d\x96\x4b\xd3\x67\xee\xa4\xe4\x0b\x73\xfb\x54\xcb\x83\xa7\x29\xf7\xf3\xca\xa5\x7c\x08\x79\x13\x8d\x30\xea\xa2\xc9\x7d\x78\xd7\xd3\xc9\x3f\xd2\xbc\xfb\x39\x2e\x33\x37\x49\x40\xbf\xd2\x34\xd4\x20\x4c\xf9\x77\x54\xbc\x42\x56\xd6\x84\xb0\xea\x1a\x2a\x1a\xef\x62\x39\x7e\x41\x9c\xe1\x7c\x3f\xcc\xd8\x49\x28\x24\xd6\x61\xf3\x6d\x8c\xe1\x19\x84\x99\x71\x5a\x98\x66\x56\x4e\x39\x5e\xc8\xf2\x28\x37\x2a\xc4\xd9\x9a\x25\xd5\x4c\x64\xef\x59\x87\x57\x59\x4b\xad\xd2\x92\x32\x34\x96\x62\x31\x86\xf4\xd9\x86\xf5\xd2\x67\x70\x55\x40\x22\x67\x0d\xfc\xf5\x57\x6a\x75\x46\xfe\x91\x3e\xcc\xc0\xda\xc3\x4c\x38\x3b\xf0\x30\x8a\xdf\xfa\xe8\x36\x4d\x91\x59\x7e\x9c\x41\x87\x01\x8c\x7d\x7c\xff\x8e\x0e\x93\x29\x9f\x1d\x56\x38\x61\x34\x21\xa4\xb4\x91\xe5\x24\x81\x8e\x13\xc5\xae\x1f\x85\x42\xb4\x44\xe1\x2b\x3f\x4e\xf0\x39\xa1\x9a\x61\xf9\x45\xbf\x9c\xfb\x8b\xe6\x77\xc9\x6a\xf5\xfa\xfb\x84\x16\xe9\x87\x6b\x4a\x6d\xc9\x7b\x24\xf8\xee\x15\xed\x2d\x4f\xcf\x5c\xfd\xc4\xfc\x49\x91\x3b\x7c\x26\x52\xe5\x37\xbd\x7b\x67\x30\xff\xe9\x09\x51\x1f\x35\x0a\x5c\xf2\xe7\x30\xd0\xeb\xaf\x3b\xc0\x78\x68\xe9\xf5\xe5\xf6\x91\x76\xa8\x52\x00\xf3\xf8\x58\xcb\x03\x47\x1a\xbc\x63\x5b\x69\x82\xf0\x61\xb4\x58\x46\x21\x0a\xb1\x70\x18\xc4\xdb\xfa\xa2\x17\xc6\x55\x10\x08\xdc\x1b\x98\x50\x8d\x53\x3a\xa1\x7a\xea\x38\xe6\xab\xec\xbe\xec\xf3\xfd\xc1\x6e\xc3\xff\x23\xe1\x0a\x00\x38\x37\x42\xec\x6a\x3a\x87\x37\x88\x83\x5c\x0d\xa0\x2f\x3f\x7c\x6d\x44\x27\xa2\x89\xa6\xca\x20\xf9\xe1\x2f\x34\xc6\x98\xc0\xbd\x4b\x07\x7f\x33\x3d\x39\xce\x86\x4a\x53\xe8\x61\xfa\xc1\xc9\x7a\x7d\xc9\xff\xd9\x47\x99\x70\x4b\xb2\x96\x12\x5f\xdc\x4b\x10\xe6\xaf\xae\xc0\x8d\x8f\x6e\xbf\x5f\xa1\xf8\xbe\x26\xc3\x67\x0c\x3f\x14\x5e\x7b\x3d\x5f\x38\x5f\xda\x84\xef\x52\x5e\x48\x5f\x60\xf6\x43\xc1\x7f\x7d\xd2\x23\x27\xdd\xe1\xc5\x9b\x5e\xbf\x4f\xf6\x63\x8d\xca\x86\x48\xf0\x08\x5d\xf7\xd7\xeb\xfc\x09\x88\xf1\xa2\x01\xcf\xfe\xf2\xeb\xf4\xc5\x27\x7d\xf0\x91\xbb\x1f\x7c\x5a\x1f\x78\x1e\xe8\x9e\xa0\x89\x1a\x21\x86\x82\x2f\x99\x21\x63\xaa\xeb\xf5\x1f\xbf\xfd\xae\x18\x86\x05\x91\x25\xa9\xb6\x83\x3c\x59\x73\x55\xd9\x90\x45\xd1\x80\xa2\x07\x3d\x5b\x75\x2d\x51\xd2\x1d\xc7\xd6\x69\x90\x7c\xc5\x94\x65\x4b\x51\x14\x53\x36\x44\x5d\x54\x2d\xb1\xf4\x8a\xd1\xa5\x3c\xa9\xbd\x27\xb4\x01\x53\xce\x08\x45\x40\xb2\x2c\x5d\x33\x64\xc5\x32\x25\xc9\x95\x55\x59\xd2\x91\x6a\xca\xc8\x70\x1d\x4d\x33\x65\x88\x0c\x59\x34\x4c\xc7\x55\x99\x42\x47\xb6\x4c\x5d\xd6\x4d\x55\xb4\x44\x45\xb6\x2c\x6d\xc7\x58\x94\xef\x59\xdc\x20\xb6\x06\xf4\x7e\xdb\x16\x7e\xad\xe0\x2c\x4c\x0d\xd3\x15\xff\x27\x7d\x05\x8d\x7d\x48\x6f\x1d\x01\x72\xbf\xb9\x6f\x74\x9a\xde\xfe\x89\x8c\xf5\x5e\x01\xe5\xd3\xa7\x74\xe6\xa4\x67\x4d\x39\x4c\xcf\xdd\x12\x86\x69\x94\x27\x05\x14\x82\xce\xd6\xbb\x65\x58\x8b\x36\x01\xa4\xec\x70\x97\x41\x00\x2c\xa0\xa7\x17\x2d\xb9\x7a\x8e\xd3\x96\x4d\x37\xff\xf4\x94\x65\x7f\x88\x70\xdf\x3c\x4f\xf3\x0b\x02\xae\x9c\xc9\x10\x43\x9a\x30\x29\x74\xe0\x32\x59\x05\x94\x9f\x0c\xe4\x42\x06\x55\x0c\xd3\x34\x76\x92\x41\x3f\x6e\x76\x62\x88\x7b\x86\x6a\x89\x6a\x7f\x9f\x1d\xc9\xe1\xc3\x0c\xe1\xc3\xc0\xef\xa5\xdb\x11\x0f\x3f\x60\x18\xfe\xba\x22\xf4\xc1\x7f\xdd\x43\x65\x23\xbc\x97\x95\x5f\x03\x5f\x78\xb7\x10\x4e\x60\x08\x67\x94\x05\xf6\xd7\x7b\x99\xfa\x91\xbd\x37\x7f\xf5\x90\xd7\x27\xcb\xf6\xf2\x03\x57\x2b\x59\x73\x1f\x06\x3c\xbf\xfe\x90\x6e\xc8\xf7\xef\xf9\xbd\x3d\xcf\x0f\x50\x61\xba\x7e\x0e\xf1\x9c\x90\xce\xde\x0d\x0f\x78\x9d\xbf\xaa\xa6\xed\xf3\xbd\x1e\x7a\x2f\x5d\x3d\x3e\xf2\x36\x73\x13\xe1\x87\x43\xc2\xb1\x22\x8f\x23\xe5\x7d\x1c\xdf\xa7\x47\x7f\x4c\xed\x01\x2e\x2f\x8e\x69\x83\xfe\x3e\xfe\x7a\x48\xa1\x79\x2f\x5e\xad\xb9\x7f\x7c\xf5\x10\x0b\xf3\x18\x79\xeb\x7f\x7c\x58\x3b\x10\x3b\xf3\x5e\xdc\x7f\xa8\x54\x21\x7f\xa5\xab\xf5\x87\x35\x59\x10\x01\xdd\x61\x14\xba\x87\x81\x7f\xb8\x70\x6b\xb6\x0e\x43\x24\xf8\xc9\x39\x0d\x32\x7b\xe6\x1d\x52\x34\x1c\x2e\x5c\x82\xb8\x85\x3b\xc1\xf1\xd7\x3c\xf7\xfc\x39\xc7\x7f\x8d\x07\x38\xfb\x67\xf6\x69\xdd\x07\x78\xbd\x5e\x03\x59\x16\x95\xdd\x7c\xb7\x7f\x6a\x59\x68\x1b\x95\x57\x3a\x75\xca\x20\xb7\x0d\xdd\x10\x15\x91\xb9\x6a\xc8\x8a\xa6\x31\x4f\x0d\x43\x95\x74\xa3\x0f\x60\xe6\xd9\x02\x1f\x1f\x7b\x90\x79\xb6\x9c\x9d\x4f\xc7\xa7\x43\xde\x41\xfe\xf2\x6c\x89\xc7\x21\x0f\x60\xc9\xb7\xa5\xe9\x06\xc8\x7c\x5b\x20\x6b\xb7\x93\x2f\xe9\xe1\x68\x7c\xce\x9d\x9d\x4f\xf7\xc6\xa7\xfc\xfa\x6a\x4d\x81\x76\x72\xf2\xa4\xde\x21\x96\x6a\x89\x5a\x1f\xb8\x75\x77\x39\xf7\xf1\xb1\xe7\x32\x38\xbf\x19\x9f\x1e\x5d\x1f\x9d\x0e\x79\xdb\x0f\xdd\xa3\x53\x42\x3a\xb4\xe8\xfc\x1d\x2b\x3a\x7f\xc7\xfc\xe6\xc6\xa3\xd3\xe9\xf5\xf8\x68\xc8\x3b\x81\x8f\x42\x3c\x76\x4b\xc5\x93\xd1\xe1\xc5\x68\x9a\x7d\x9a\x20\x27\x46\x98\x79\xb1\x1d\x9d\x9f\x8d\x49\xbb\xf3\x21\x8f\x42\x97\xba\xfa\x8f\x97\x95\x4f\xe7\x67\x17\xd3\xe2\xe3\x79\x14\xd3\x96\xaf\x2f\xce\x2e\xcf\xaf\x27\xa3\x83\x8b\xc3\x37\xd7\xdf\x1c\x4c\x46\x14\xc4\x19\x61\x13\x13\x04\x63\x67\xfe\x0d\x4c\x10\x83\xb6\x52\xf5\xd5\xf8\x78\x3a\xba\xa8\xd4\x7c\x45\x33\xad\x36\x6a\xb2\x1f\x07\xd3\x69\xb5\x36\xe5\x44\x07\x18\x37\x1b\x9c\x52\x5f\xdf\x7a\x7d\xb2\x0d\x5b\xab\x5f\x4e\x46\x17\xcd\xea\x97\x09\x8a\xb3\xea\xe3\xa3\xd1\xe9\x74\x3c\xfd\x31\xf5\xd5\xf3\x69\x0a\x40\x7c\x9f\xfb\x19\x1e\x9d\x94\xdc\xc6\x7d\x77\x51\x76\x1a\x1f\x4f\x26\x97\xa3\x0b\xe6\xfc\xee\x27\xc9\x0a\xc5\x97\x17\xc7\xe4\xc3\xf1\xd1\xc1\xf9\xf5\xc5\xd9\xd9\xf4\xfa\xf0\x60\xc8\x07\x2e\x5c\x5e\x44\x11\x3e\x3c\x20\xfc\x91\x7c\x3f\x1b\x1f\x1d\xb2\xb9\x4f\xae\x0f\x8f\x0f\xc6\x27\x43\x3e\xf2\x5d\x87\x4e\x3b\x39\x0c\xa0\xbf\xc8\x6b\x65\x2e\xc5\xe5\x7a\x99\xdf\x7c\x5e\x73\x72\x78\x76\x3e\x9a\x0c\xf9\xc4\x89\x96\x88\x82\x36\x1d\x4d\xa6\x29\x76\x99\x97\x25\x46\x09\xae\x5c\xc1\x68\x0d\x8a\x9f\xa2\x02\xe9\x38\xfb\x4e\x3f\xd5\xd7\x7e\x95\x10\xc1\xaf\xba\xf4\xe5\x8a\xd9\xca\x17\xf5\x8a\x85\x2f\xd7\x2b\xa2\x01\x14\x35\x8b\x68\x00\x6e\xc3\x31\x72\xda\xb1\x53\xdd\xca\x02\x6d\xda\xb0\x52\xc3\x99\x2f\x5b\x79\xee\xe4\xe0\xf4\xe0\xf5\xe8\x64\x74\x3a\x6d\xba\xd5\xbb\x55\x02\xa9\x76\xea\x08\xdf\x4f\xe8\x2a\xe5\xce\x8c\x59\x97\x99\x9f\x7f\xd5\xe5\xd0\x2d\x51\x4c\xde\x84\x96\x54\x5c\xdb\xdd\x62\xa3\x17\x1e\x9c\xa4\x80\x1b\x1f\x35\x2b\xb1\x6d\x5f\xf7\x23\x4f\x1b\xb0\x8f\xa5\x46\x8c\x52\xb2\x5a\xec\x57\xe9\x73\x0b\xc9\x95\x9c\xe6\x99\x6f\x3b\x2d\xad\xb7\x29\x13\x73\xd6\x82\x95\x35\xea\x97\xf8\x51\x56\x93\xec\x97\x09\x97\x7d\x68\xab\x4b\x18\x54\x7b\x6d\x8e\x7c\x2a\x35\x49\x59\x69\x56\x99\xfc\xe4\x8e\x4e\xdb\xbc\xe2\xdd\x8c\xc7\xd6\x91\x47\xdb\x6c\xf2\xbe\x77\xdb\x76\x47\xde\xfa\x60\x32\xea\x1c\xb1\xb9\x59\x72\x57\x7c\xfa\xab\xa3\x6a\x3d\xe8\x40\xf6\xbb\x54\xbd\x8d\x59\xef\x04\x52\x0b\xeb\xee\x84\xa9\x9d\x17\xe7\x21\x08\x08\x79\x90\x82\xf1\x37\x97\xd3\xd6\x20\x08\x6e\x07\x7b\x2e\xcf\xeb\x49\x3d\x14\x07\x48\x85\xea\xb6\xf5\x51\x66\xd0\x59\x43\xf2\x93\x3b\x3c\x68\x6f\x50\xe5\x96\x59\x13\x52\x4a\x83\x3e\x70\x5d\x51\x1f\xdc\x3a\x27\xae\x34\x65\xb0\x36\xda\xa6\x62\xc4\x8a\x6a\x5a\x75\xdd\xea\x83\x6b\x22\x51\x98\xba\x68\xf4\xc1\x8c\x48\x44\x86\xa1\x18\x7d\x70\x40\x24\x22\xd3\xb4\xb4\x3e\x98\x0f\xe3\x1e\x75\x1c\xee\x83\x45\x11\xbe\x66\x34\x8c\x7b\xa6\x22\xc9\x46\x1f\x78\x85\xc7\xea\x69\xee\xfd\x3a\xc9\x75\xb9\xfb\x44\x6a\x3e\xab\xaa\xb9\x38\x26\x21\x26\xdc\x48\x18\x3f\x84\xb3\xb3\x30\xd5\x75\x25\xab\x25\x8a\x85\xa2\x00\x44\xa5\x24\xbb\xe4\xba\x90\x29\x1a\xec\x95\x1f\xd0\xfb\x43\xaf\x9a\x14\x99\xa9\x83\xd8\xbd\x81\x1c\x37\x45\x02\x69\xfa\x2b\x49\xf5\x45\xb5\xc0\x59\x43\x32\x4c\x76\x0a\x5c\x62\x3f\xf0\xb1\x8f\x8a\x44\xc7\xb4\xd2\x09\x5c\xf6\x92\x96\x8c\xbb\xac\x87\xfc\x13\xbb\x8f\xa1\x38\xfd\xfa\xca\x0f\xd0\x78\xb1\x8c\x62\x8c\xdc\x37\x30\x74\x83\x2c\x2d\x2f\xba\x41\x61\xe5\x2b\xd8\xda\x03\x7d\x7e\xdd\xd4\x09\xad\xd0\x6f\xe4\x3d\xde\x9c\x5c\xb8\x6d\x4e\x95\x2c\xc2\xc9\x16\x55\x49\x7a\x2d\xca\x94\x06\x79\x79\x9c\xc9\xdc\x3d\xfc\xf8\xd8\xc3\x43\x4f\x08\xb5\x5f\x7b\xa8\xdf\xef\xf7\x62\xaa\x4f\x59\xf7\xfa\x15\x95\x8a\xb7\x53\xfe\x5b\x22\x70\xb7\x24\xbf\xf5\xca\xc9\x6f\x25\x8d\xe9\x38\xa4\x4c\xc7\xd1\x12\x16\x9d\xdc\x67\x8a\x58\x97\xb7\xb7\xb7\xc2\xcd\xe2\x16\xc6\xe4\x62\xb5\x78\x81\xe3\x55\x82\xd9\xef\x17\x64\x40\x4a\x30\x34\x0e\x74\x3c\x23\xa2\x2f\x7f\x9d\xc7\xf2\xad\x06\x34\xdf\x31\xe6\x78\x35\xac\x6a\xf6\x00\x9e\xc6\xb1\x4e\x63\x5c\x96\x6e\x16\x6d\x41\x74\xf3\xaf\xdd\xf6\x1e\x57\x9b\x6f\xf6\x5e\x23\x8e\xa4\x97\x3d\x31\x2c\x79\xf2\x83\xc6\x14\x04\xff\xe0\xde\x9e\x10\x44\xfc\xfc\x8f\x84\x3b\x5c\x25\x38\x5a\xa0\x98\x1b\xdd\x2d\x51\xec\xa3\xd0\x41\xdc\x78\xb1\x8c\xa3\x1b\x7a\xc3\xe5\xce\xe3\x68\x16\xc3\x05\xd7\xa3\x97\x17\xbe\x9f\xa5\xe6\x4d\xd2\x3e\x98\xdd\x95\x1f\xb2\xa4\x66\x7e\x14\xb2\xac\x02\x2c\xee\x45\x5e\x09\x47\x9c\xcf\x3a\xa5\x06\x31\xcb\x38\x72\x57\x0e\x66\xa1\x0a\xb3\xcc\x97\xf4\x87\xe7\xdf\x91\xaf\x76\x80\x16\x89\xc0\x7d\x73\xcf\x39\xf3\x28\x4a\xd2\x04\x03\x4b\x18\x63\xdf\xf1\x97\x10\x23\xce\x0f\x39\x02\x10\xa0\xf9\x0b\xe0\x2c\x46\x88\x0d\x9c\x0e\xb8\x80\xf7\x9c\x13\x05\x84\xe0\x38\x8c\x9c\x79\xe8\x3b\x30\xa8\x80\x09\xed\x68\x45\xb3\x1f\xc4\x34\x89\x5e\xe4\x65\x4d\xdb\x81\x23\x2d\xb8\x18\xcd\x56\x01\x8c\x39\x1b\x26\x7e\x22\x70\xd3\x39\xcd\xe1\x56\xf4\x99\x6b\x36\x97\x28\x4e\xa2\x90\x65\xe2\x61\x79\xc2\xef\xc9\x50\x02\xf7\x0f\xb2\x0a\xec\x8d\xc4\xcb\x5e\xe8\x8b\xa5\x51\x01\xcf\xbd\x8a\x62\x6e\x11\xd1\x84\x3b\xf4\x25\x32\x05\x14\xcf\x51\xb6\x16\x80\x5b\x06\x08\x92\xcb\x31\x42\x1c\x9f\x75\xa4\x01\x1e\xd2\xc7\x71\xd6\x95\x0e\x78\xee\x09\x3b\x81\xf5\x93\x01\x56\x06\xd0\x28\xb4\x41\xac\xc0\x4c\x0b\x94\xac\xc0\xca\xde\xb3\xbc\xfc\xa1\x9e\x52\x6f\x16\x81\xaf\x6c\x96\xe0\xe5\x2f\xf7\x95\x2a\x45\x58\x4e\x8f\x39\x8e\xc9\xb9\x37\x99\x9a\x37\x2a\x8c\x19\xb4\x6c\x96\x12\xc1\xd8\x79\x95\x2c\xa8\xb2\x7a\x47\xaa\x6e\x9d\xf5\x4e\x7f\x53\x95\x98\xb7\x31\xf0\x65\xf5\x5d\xfb\x54\xb8\xfe\x11\x9c\x0a\xdf\x1e\x83\x53\x21\x99\x81\x09\x0d\xb9\x38\xa1\x21\x17\x4f\x85\x77\x01\x98\xd0\x90\x8b\xa7\xc2\xb7\xdf\x82\x53\x61\x05\x26\xc2\xc9\xec\xbb\xd2\x03\x75\xf1\x3c\x4b\x0f\xfc\x31\x39\xcf\x55\x43\x97\xfb\xe0\xa2\x88\x40\x71\x48\x0e\x7c\x59\x96\x94\x3e\x38\x27\xa7\xbc\x26\x5a\x4a\x1f\xfc\x94\x07\x98\x00\xc7\x79\xd8\x89\xe2\x19\xd6\x6e\x7f\x86\xf5\xd2\x67\x58\xaf\x62\x8b\x62\x94\x98\x4a\x16\xde\xd5\xcb\x5e\x2a\x69\x81\x55\xa2\xed\xdc\x31\xd3\x2b\xfb\x54\x32\xd3\x12\x49\xaa\xd3\x9a\x96\x7b\x23\xca\x39\x1d\x6f\x5a\x89\x94\x3e\x73\x0b\x1d\x4a\x92\x9b\xad\x40\xbc\xf4\xe9\x17\x78\xe9\xcb\x6e\x23\x06\xe9\x30\x5c\x05\xc1\x3a\x83\xd8\xac\x40\xac\x36\xa0\x68\x38\xb7\xa6\xfd\xee\x7b\x99\xe7\x9a\x57\x8a\x4e\xd1\x18\x0c\xf0\x5c\xc5\xc3\xf5\xa6\xca\xce\x59\xcc\x0f\x59\x65\xfb\x7a\x53\xd0\x0f\xc5\xca\x20\x2e\xa2\x7e\x14\xa0\xb2\xa8\x1f\xc5\x30\xf7\xad\xa7\x46\xd3\x21\x32\xdf\x67\x80\xe7\xc6\x54\x69\x41\xf3\x8e\x95\x6c\x1c\x85\xd2\x1e\x2a\x0d\x70\xf4\xe7\x06\xd8\xc9\x8a\xb5\x75\xe0\xcb\x2f\x30\xb0\x8d\x38\x98\x5a\x92\xbe\xfa\xfe\xe8\x94\x8b\x62\x6e\x7c\xce\x0e\xba\x3c\x3b\x15\x8e\x9c\x28\x48\x73\x6b\x75\x80\x72\xf7\x85\x70\x90\x59\x2c\x93\x42\x2f\x86\x33\xc2\xc1\xba\xa6\xff\xe9\x2f\x18\xf3\xd3\x0a\xc5\xf7\xe4\xf0\x85\x0b\xc4\x4c\x70\x5b\x87\xbe\x6d\x23\x5d\x45\xfc\xd2\xa4\x7b\xd2\x3a\x8c\xfc\xa5\x87\x79\xd5\x3a\x8c\xf6\xa5\x87\x79\xfd\x19\xeb\x35\xa1\x8a\x3b\x8e\xc8\x2a\xc5\x2e\x1c\xe3\x12\xed\x76\xe5\x93\x62\x2a\xbf\x8e\xf5\x7b\xfb\x39\xa4\x83\x37\x6d\xd5\x8e\x81\x7e\xec\x1c\xa8\x03\x99\x29\xba\x73\x64\x32\x29\x96\x9f\xce\x11\xe7\x04\xd0\x5f\x90\x53\x9f\x0a\x72\x67\xe3\xa3\xc3\x4c\x40\x8d\xb9\xf1\x11\x87\xa3\x8f\x28\x95\x48\x63\xb4\x8c\x51\x42\xb6\x0e\x95\x10\xf2\x44\x77\x10\xe3\xd8\xb7\x57\x4c\x76\x28\x12\xb2\xa7\xd2\x1d\xb3\xe9\x2e\x30\xcb\x3c\x44\x85\xa6\xdc\x50\x9a\xdf\xc7\xbf\xc3\xfc\xa8\x06\x3b\x79\xe2\xec\xbe\x9d\x9c\x9d\x72\x30\x8e\xe1\x3d\xa5\x16\x3a\xd7\x24\x93\xa9\xb2\xe1\x36\x4f\xfe\x4d\xcd\xe4\xc9\xa3\x46\x46\xe5\x9b\xc8\x5c\xe3\x69\xe0\x21\x8f\x5a\x24\xc9\x34\x6a\x4f\x43\x26\x66\x22\x67\xbe\xd9\xf2\xc0\xef\x5a\x49\x54\x60\x75\x72\xb9\x54\xef\x32\x85\xcd\xe5\x84\xcc\x14\x96\x8a\x09\x64\x47\x9b\x34\xf4\x4a\x2e\xc5\x56\x8d\x61\x53\x49\x54\xac\x44\xb5\xa0\xe3\xd3\xb8\x00\x12\xb8\x01\x0a\xe8\x5a\x58\x59\x6f\xec\xfa\xd2\xef\x9a\x88\x4b\x55\x2e\x79\x14\x85\xd6\x80\x09\xe9\xa0\x2a\xb8\xef\x8c\x01\x21\x9b\x79\x35\x0d\x1c\xed\x52\x4d\x07\x97\xbb\x54\x33\xc0\xdd\x2e\xd5\x4c\xf0\x69\x4b\xb5\x6d\x82\x35\x25\x10\xab\xb1\xf8\x72\x26\x7a\xca\xf9\x6e\x91\xa5\xc6\xf2\xcb\x9d\xa6\xd0\xe9\x77\xa5\x85\x00\x64\x15\x28\x39\x6d\xca\x0d\x7b\xe8\x94\x8f\xeb\xed\x24\x20\x1b\xe0\xf6\x4f\x91\x80\x6c\xe6\x24\xa0\x48\x79\xa1\xd5\x49\x02\x74\x6f\x6c\xe4\xc9\x8a\x04\xf8\x43\xfa\xa4\x47\xb6\x6b\x45\x4c\xdb\xcc\xaa\x73\xa9\x6a\xa7\x1b\x11\x05\x44\x6e\xac\x8a\xa2\x34\x56\x45\x51\x37\xaf\x8a\xa2\xb5\xac\x8a\xa2\x03\xa5\xe8\xc1\x68\x5f\x15\xc5\x6c\x5f\x15\xc5\x02\x27\x7f\x6a\x55\x54\xb1\x58\x15\x25\x2f\x94\x36\xae\x8a\x2a\x6f\x5a\x15\x55\xc9\x57\x25\xa1\x2f\xad\x7f\xdd\xca\x94\x57\x48\x55\x9b\x7c\x34\x63\x9b\x4a\xce\xf7\x54\xbd\xb1\x68\xaa\xb1\x79\xd1\x54\xb3\x65\xd1\x54\x0b\x28\x05\x77\x16\xdb\x17\x4d\x93\xda\x17\x4d\x93\xc1\xab\x3f\xb5\x68\x5a\x11\x7e\x46\xd1\xf3\xc2\xae\xf0\x33\xe9\xa0\x1a\x78\xbd\x03\x63\xd3\x74\xf0\xf6\x0b\x30\x36\xcd\x68\xac\x86\x66\x36\xb6\x90\x66\x35\xcf\x35\x71\xf3\x6a\xe8\x52\x91\x6b\x24\xbd\x33\x17\x6d\x95\xf6\x75\xd0\xd5\xf6\x75\xd0\x35\xf0\xe3\xce\xeb\x50\xc6\xbf\xae\x17\xf8\xcf\x4f\x33\xdd\xd8\xb8\x69\x74\x73\xd3\xa6\xd1\xad\x22\x77\x50\x26\x06\x95\x76\xcd\xce\x7c\xca\x68\x9e\x1e\x46\xf3\xf4\x30\xb6\x9c\x1e\x86\x52\x47\xb2\x91\xef\x20\xa3\xe3\xdc\x30\x3a\xce\x0d\xc3\x00\x1f\x3f\x0b\xc9\x46\xe9\xbc\x30\xf3\xc2\xcd\xe7\x85\xb9\xf1\xbc\x30\x25\xc0\x33\x43\x82\xcf\x45\x71\xf6\x97\xda\x88\xd7\xec\xbd\xbd\x2c\x3e\x1a\xd3\x85\x30\x7d\x0f\x33\xde\xae\xe7\x39\xc9\x2d\x22\x48\x95\xef\xf1\xb4\x47\xe7\x97\x26\x3b\xf1\x9a\xe1\x74\x50\x67\x38\x1d\x2f\x33\x27\xdf\xa1\x55\x39\xe2\xcf\x53\xda\xb1\x48\x43\xe3\xf3\xeb\xb3\x8b\xeb\x57\xdf\x1f\x9d\x3e\xad\xf5\xf8\xf4\xf0\xf8\xf2\x68\x34\xb9\xbe\xbc\x38\xbe\x7e\x75\x71\xf0\xfa\x64\x74\x3a\xfd\xcc\x2e\xbe\xbf\x1c\x5d\xfc\x78\x7d\x7e\x70\x71\x70\x32\xc9\xba\xb0\xba\xd1\x9c\x59\x02\x65\x58\x66\xe2\x2f\x1d\x57\xde\xd6\x8a\x19\x09\x65\x2d\x19\x97\xa5\x2d\x95\xee\x96\xec\xc2\x99\xb5\x51\xad\xff\xcc\xa2\xd6\x94\x70\x75\x20\x1b\x56\x32\x54\x29\x57\xc1\xcb\xe6\xc6\x25\x53\x9c\xba\x3e\xef\xab\x2f\x74\x17\x1c\xe5\x19\x9a\xc7\xe7\x1c\x74\xdd\x18\x25\xc9\x0b\xaa\x9c\x82\xa1\xcb\x2d\xa3\x98\xde\xef\xe9\x25\x31\x41\xce\x2a\x46\x1c\x33\x7c\x60\xa9\x96\x37\x5f\xd9\xde\x3d\xfd\xe2\x3f\x66\x51\x78\xd2\x41\x32\x53\xb0\xd6\xdb\xfe\xf7\x5f\xf0\x36\x7c\x74\x4a\x53\x52\xc3\x90\x83\xcb\x65\x90\xaa\x50\xb3\x37\x1a\x0e\x3a\x4e\xb4\x0a\x31\xb9\xdb\x22\xce\x89\xc2\x90\xbe\x36\x92\x9b\x3e\xbd\x12\x27\x88\x73\x62\x44\x5f\x63\x60\x90\x70\x38\xe2\x12\x6a\x4a\x44\xbb\x5c\x25\x28\x66\x2f\x3e\xec\xe2\x2c\x70\xa7\x11\xae\x38\x72\x13\xdc\x93\xe9\xa6\x28\x2d\xde\xc1\xa0\xe3\xa0\x24\x49\x01\x8b\xc2\xfb\x45\xb4\x4a\x38\xb8\xc2\xf3\xcd\x58\xff\x75\x77\xbc\x98\x72\x1b\x5e\x52\x95\x7b\x05\x4f\x0a\xc3\x53\x9e\x37\xff\xff\x6e\x6c\xb5\x60\xed\x9b\x2f\xbe\x9f\x82\x28\x45\x4c\xaa\xe6\xa0\x50\xb3\x67\x9b\x28\xbe\xe7\x70\x8c\x88\x34\x8e\x62\xa6\x32\xca\xb0\x60\xa3\x99\x1f\x26\x0c\x79\xe9\x3c\x59\x39\x4c\x10\x87\xef\x97\xbe\x43\x1f\xff\x16\x10\x3b\x73\x94\xb0\x8d\xc9\x72\xb3\xd3\xf4\xed\x02\x7d\xe6\x43\x59\x06\x77\x58\xfe\xe6\x72\x4e\x10\xad\x5c\x21\xfd\x2a\x38\xd1\x82\x3e\x67\xae\xc8\x92\x84\x43\xc2\xa9\x12\xe0\x3a\xc3\xf4\x3b\xf9\x27\xa9\x02\x0b\xbd\x56\x19\x98\xcd\x44\xf8\xed\x17\x45\x67\xa6\x1e\x23\xd4\x42\xa0\xcd\x48\x25\x83\xc7\x89\x7d\x8c\x62\x1f\x32\xb4\xd5\x0a\x39\x18\x04\xd1\x6d\xc2\xb0\x89\x23\x6e\x89\x62\x2f\x8a\x17\xec\x2d\x14\x79\x1e\x7b\x46\x63\xe1\x3e\x3c\xcf\x77\xd2\xeb\x14\xe9\x03\x25\x35\x7c\xd2\x00\x2d\x18\x86\x2e\x8c\xdd\x9c\x6e\xa9\x6d\x21\xc1\xe0\x64\xe1\xe3\x39\xc7\xde\x83\x12\x32\x2c\x17\xd1\xe0\xf2\x49\x1a\x43\x84\xaa\x4f\x23\xb6\x18\x1c\xfa\xb4\x82\x01\x81\x87\xb6\x12\xb8\x31\xa3\x92\x6a\xa7\xd9\xb4\xb3\x7c\xfa\x64\xf2\x38\xe2\x98\x41\x37\x61\xc6\xd3\xef\x5e\x03\x5a\x7a\xc6\xf9\x61\x82\x11\x74\x09\xbb\x2e\xeb\x21\x2b\x33\x00\xd9\x62\x9f\x91\x6e\x32\xa7\xca\x20\x60\xc8\xa9\x40\x9b\xc7\xa2\x29\x03\x0d\x93\x5a\xdf\xe3\xb0\xc8\x12\x48\x00\x0b\x01\x17\xe1\x39\x41\x07\x6b\x95\xab\x09\x99\x5a\x79\x01\xfd\x00\x70\x2b\xdf\x25\xe8\x06\xd9\xce\x70\x20\x7b\x27\x4f\x0e\x4e\x0e\x18\xf3\x38\x25\x9d\x6f\x24\xb0\xef\xfe\x2c\x97\x2b\x71\x7f\x3a\xf9\x42\xa1\x49\xb1\x9d\x4a\xea\x35\x9d\xee\x2a\x21\x5c\xa8\xaa\xf0\x1c\x87\xdc\xc1\x11\x87\xc2\x1b\x3f\x8e\xc2\x45\xaa\x27\xf5\x13\x22\xf1\xce\x50\x88\x62\xba\x5f\x9f\x32\xb5\x1f\xfe\x83\xac\x88\xb2\xdd\xff\x30\x2f\xea\x64\x41\x55\xe0\xb6\xf2\xa0\x5f\xfe\x22\x1e\x44\xc8\xc3\x45\x9e\x1f\xa2\x94\xa9\x54\xe0\xaa\xf1\xa2\x8c\x59\xe4\x31\x5c\x7a\x0b\xb4\xb0\x51\x3c\x3c\xeb\x6f\x86\x1e\xa1\xbf\x98\xc2\x0b\x1a\x66\xa9\x3c\x13\x44\xf7\xf7\x12\x96\x44\xbe\x54\xd9\xdf\x43\xc2\x4c\x00\x9c\x13\x6e\x81\x19\x3f\x01\xe6\xad\x32\x59\x01\x6e\x89\xa3\x71\x31\x72\x88\xfc\x41\x67\xe0\x27\x6c\x43\xa6\xe4\xc1\x50\x9c\x56\x66\x58\x4e\xe6\xfe\xb2\xd9\x11\x5b\xaf\xb4\xa7\x74\x6e\xae\x9f\x60\x3f\x9c\xad\xfc\x64\x8e\x98\x39\x20\x77\x74\xba\x65\xba\xf1\x5f\x3a\xdd\x0a\x94\x74\xbe\xf3\x28\x70\x0b\x86\xf4\x82\x4d\x91\xda\x09\x65\xb3\x60\x45\x5b\xc0\xf6\xbf\x14\xd8\xdc\x01\x77\x3e\x3a\xe1\x98\x99\x12\x72\xb9\x38\x8a\x30\x77\x78\x20\xb4\x58\xbf\x94\x86\x0f\xbf\xd8\xf0\x6f\x51\xec\x7b\xf7\x8c\xb8\xb3\x23\x91\xf1\x39\xfb\x3e\x3b\xe6\x69\xda\x6e\xce\x46\x09\x26\xa7\x3b\xb9\xce\xa4\x22\xa9\x7f\xe3\xe3\x7b\x66\x1a\x96\x42\x06\x03\x52\x82\x49\x55\x2f\x8e\x16\x14\xd1\xf3\x28\xc1\x0c\xf9\x53\xea\xc9\x75\x78\x3c\xa6\xaa\x8c\x55\x48\x13\x82\x47\x21\xdb\xe6\x37\x04\x92\x4c\x10\x8e\x51\xb2\x0a\x28\x75\x12\x39\x25\x46\x1e\x8a\xa9\x9d\x50\x14\x06\xf7\x5b\x70\x13\x7d\x29\xdc\x14\xbc\xff\xf0\xb4\x44\x5a\x04\xa0\x7c\x2b\xe1\x88\x4d\x96\xe2\xaf\x2c\x4e\x55\x10\xb2\x99\x96\x82\x2f\x0f\xf0\xd9\x65\x0b\xc0\x6c\x33\x54\x20\xae\x70\xdd\x27\x80\x0c\xd1\x36\xab\xa4\x6d\x0f\x8b\x6a\xe7\xc3\x62\x6e\xba\xa6\x36\x15\xb0\x69\x89\x9a\x6b\x69\x33\xfd\xb8\x5a\x28\x0b\x73\xf5\xb7\xaa\xe4\x9a\xb4\xfe\x67\xbf\x23\x7e\xf5\x64\x65\x60\x16\x90\x9d\xc1\xa5\xf6\x4b\xaf\x87\x99\xd5\x9c\xd6\xa8\x9f\xcd\x55\xcd\xf5\xe3\x92\x56\xd4\x37\x1a\xf5\xf5\x66\xff\x45\xb2\x6c\xd5\xac\x2b\x27\xa5\xca\x7b\x0c\x53\xf5\xa4\x01\xd4\xdf\x75\xaa\xcf\xb7\x5a\x77\x75\xbc\xfd\x6d\x7c\xe8\x93\xeb\xaa\x5a\x39\x5f\x6f\x59\xed\x78\xe2\xd3\x3a\x9e\xf8\x74\xf0\xfd\x67\xa9\x6a\xe5\x02\x55\x5a\x6e\xfd\x26\x9b\x9d\xaa\xda\xd6\xb9\x5b\xcd\x17\xb6\x2d\x6f\x01\x4a\xe3\x2d\xa0\xf4\x90\xd6\xf1\x16\xa0\x74\xbc\x05\x28\x1a\xf8\x15\xa8\x9d\x73\xd7\xa4\xae\xb9\x2b\xc5\x5b\x80\x26\xe7\x85\xdd\x6f\x01\x1b\x5f\x19\xcd\xfa\xbe\x56\x2c\xa0\x29\xf5\x6a\xaa\xd8\xd8\xd9\x52\x03\x79\xea\x16\x1d\xbf\xda\xd0\xf1\xab\xc5\x2b\x59\x87\x8e\x5f\xed\xd0\xf1\xab\x06\xf8\xe6\xb3\x08\x47\x2d\x74\xfc\x5a\xbe\xf1\xd4\x6e\x1d\x7f\xeb\x53\x53\x73\xd3\x68\x5b\x36\x8d\xd6\xd8\x34\x5a\x8e\x4a\xad\x63\xd3\x68\x1d\x9b\x46\xd3\xc1\xb7\x9f\x35\x77\xad\xb4\x69\xb4\xbc\xb0\x7b\xd3\x64\x0f\x66\x1b\x1e\x91\x44\xc0\x33\xa7\xc2\xf2\xcb\xc6\x56\xaa\xd3\x9b\xc4\xa3\x6f\x21\x1e\xbd\x41\x3c\x7a\x4e\x3c\x7a\x07\xf1\xe8\x1d\xc4\xa3\x1b\xe0\xbb\x0d\x08\xec\xde\x79\x7a\x89\x78\x72\x2e\xaf\x6f\x7e\x20\x32\x36\xea\x7a\x0d\xa9\xf4\x0a\xb7\x2b\x0a\x2b\xcf\x6f\x72\x7d\x03\x1b\x0a\xd0\x1a\xa7\x8d\xa1\xd6\x37\xb0\xa1\x35\xdf\xed\xb6\x99\xf8\x18\x8d\x47\xba\xfc\x58\x36\x3a\xce\x65\xb3\xe3\x5c\x36\x25\xf0\xc3\x67\x11\xb1\x59\xd8\xf5\x68\xf9\x23\x9d\xd9\x6d\xd7\xd3\x86\x34\xb3\x29\x97\x98\xda\xe6\xb9\x9b\x7a\x7d\xee\x66\x6e\xa9\x6d\x9a\x1d\x73\xb7\xda\xe7\x6e\x89\xe0\x97\xcf\x9a\xbb\x25\x15\x73\xcf\xcd\x20\x2d\x79\x23\xfd\x59\xca\x26\xfa\xb3\xd4\xfc\x81\xb2\xaa\x72\xfb\xff\xb8\xfb\x1a\xe5\xb6\x71\x64\xdd\x57\x51\x78\xf6\x78\xc9\x1d\x98\x43\xea\x5f\x72\x71\x5c\x8e\xed\x64\x3c\xe3\x48\x3a\x96\x92\xec\x8c\x8e\x4a\x43\x89\x90\xcc\x09\x45\x2a\x24\xe4\x89\x63\xf3\x1d\xf6\x0d\xf6\xdd\xf6\x49\x6e\xe1\x8f\x04\x49\x50\xa2\x9c\x9d\xbd\x75\x6f\xed\xd6\x44\x26\x81\x46\xa3\xd1\x68\x00\x4d\xf4\xd7\x95\x3f\x54\x92\x36\x8a\xba\xd4\x3b\xa0\x4b\xbd\x82\x2e\xf5\xd2\x2d\x5e\xe9\x1e\xaf\x6c\x93\x67\x98\x00\xc2\x17\x4d\x69\xd3\x48\xf5\xa9\x6d\xa4\x4f\xab\x2b\x54\x66\x53\x67\x14\xe6\x99\x69\x14\x85\x63\x1a\x07\xa4\x63\x1a\x05\xf1\x98\x46\x37\x7d\x5b\x26\xa0\xf2\x5d\xb0\x09\xd0\x3e\x01\x95\xeb\x9c\x29\x5c\xa4\x6b\x9b\xe9\xd3\xe3\x66\x9c\x69\x16\xa7\x9c\x69\x1e\x98\x73\xa6\x59\x98\x74\xa6\x99\xc6\x47\x98\x25\xd3\xce\x34\x4b\xe6\x9d\x59\x37\x40\xf8\x42\x29\xd4\xd3\xa9\xd7\xae\xa7\x4f\xcb\xe7\xde\x5e\x35\xa9\x17\x4e\x4a\x66\x9d\x0b\xa8\x2d\x3c\x2b\xde\xc2\x34\xeb\x89\x4c\x00\x5d\x01\x29\xc6\x66\x2a\x96\x7a\x99\x58\xea\x65\x62\x69\x18\xc0\x3d\x5e\x2c\xa4\xb1\x06\x5f\xc9\xdb\xad\xf4\x19\x3f\x39\xb5\xd3\x93\x10\xde\x1c\x23\xf8\x05\xd9\x24\x09\x7f\xbb\x53\x75\x79\x33\x1b\x89\x58\x52\xf5\x6f\x48\xc4\xd2\x68\xe7\xee\x4c\xd1\xa7\xb2\xcb\x6d\x58\x5e\x78\xdf\x5b\xfb\x70\x7d\x77\xf3\xe6\x17\x7a\x8c\xce\x66\x9f\x4f\x03\x80\x6b\xa9\xfc\x1a\x65\xf2\x6b\x1a\xc0\x3f\x5e\x7e\xd9\xc3\x63\x22\xc7\x74\x7a\xe0\xfd\x34\x0f\xbd\xe9\x10\xd3\x54\x12\x7a\xb3\xca\xc3\x2d\x26\x17\x43\x12\x68\x56\xe2\x99\x79\xbc\x75\xec\xed\x25\xf1\x10\x59\xaf\x8a\xcf\xe2\x44\x3a\x78\xa7\x5e\x2e\x1d\x5d\x97\xb9\x6f\x4a\x7b\xc6\x76\xb7\x9b\xc0\xb1\x3d\x05\x74\x4c\xa1\x23\xe1\x3b\xfc\x70\xb8\x85\x2c\xb7\x91\xd0\x2b\x54\x16\x51\x54\xd7\x8a\x9d\x41\x71\xda\x5c\x0b\x28\xf7\x0d\x05\x74\xea\x69\x6f\xda\x40\x11\x7d\x64\x97\xa2\x8f\x4c\x29\x32\xcc\x2f\x92\x75\x52\x3d\x6a\x16\x82\xf2\xcc\x26\x3f\x3d\xa6\x17\x95\xcc\xd6\x81\xe3\xa3\xd9\x2a\x9c\x1f\xcd\x56\xaa\xc3\xad\x92\x13\xa4\xd9\x2a\x39\x42\x9a\xad\x16\x08\x5e\x68\xd0\x5a\xe9\x29\xb2\xd3\x4a\x9f\x56\x3f\x46\x52\x96\xbb\x12\x29\xf4\x0e\x48\x01\x9f\x1a\x72\x52\x68\xa7\x71\x1f\xfc\x24\x50\x90\x02\xbf\x6c\x57\x90\x42\xbb\x09\xbc\x17\x4a\xa1\x9d\xba\x68\x3a\xa9\xb5\xe2\x07\x87\x0a\x52\xa0\xdc\x77\x80\xf2\xbf\x3b\xa3\xb1\x34\x6a\x45\x7d\x6a\x77\x73\xf1\x9b\xfc\xc0\x80\xdc\x0d\xc1\xb8\x55\x40\x27\xb5\xde\xfc\xb8\xc0\x5f\xd2\xc0\x6d\xd0\x49\xb6\xba\x66\xc7\x94\x94\x38\xbd\x87\xb6\x23\xca\x98\x5f\xb8\xcb\x96\xe2\x00\xa7\x8c\xef\x4e\x03\x28\x97\xd4\x0f\x5c\xe4\xbb\xd3\x94\x51\xc8\xa2\x9e\x72\x3a\x2d\xa0\x4c\x12\x8f\x24\xbb\x92\x10\x42\x7b\x79\x6f\x2f\x5c\xe2\x8a\xac\x09\x9c\xb5\xc5\x90\x5c\xb3\xb3\x77\x2d\xa0\x35\xba\x07\x65\xd2\xab\x22\x93\xae\x4c\xb6\x79\x99\x74\x4d\xa0\xbc\x76\x7d\xa7\x28\x90\xae\x54\xa4\x52\x81\xe0\xf3\x48\x2d\x95\x88\xbd\x43\xf7\xd0\x47\xcc\x33\x2e\x0a\x03\x9f\x44\x04\x61\x74\x5b\x07\x85\xd1\x6d\xcb\x85\x91\x9c\x07\xcc\x6e\xa7\x92\x30\x64\x42\x2d\x08\x83\x5d\x12\xad\x51\x54\xa0\xa2\x4c\x7a\x52\x91\x4a\x65\x82\x0f\x2f\x82\x4c\xca\x3d\xed\x82\x78\xf0\xd9\x46\x10\x4f\xaf\x71\x50\x3c\x3d\x99\xd6\x66\x74\xa5\xd7\xaa\x22\x9e\x9e\x4c\xcc\x79\xf1\xe0\x43\x0c\x39\x3d\x95\xcb\x47\x2a\x65\xb9\x7c\x7a\x19\xf9\xec\xf1\xeb\xa7\x02\xaa\xe3\x13\x91\x00\x3d\x60\x48\xcf\x39\x59\x87\xaf\x4c\x8b\x45\x01\xd5\xf9\xd9\x67\xaf\x80\xea\x86\xd4\x3c\x64\x05\x54\xc7\x67\x9f\x2b\x37\x5a\x96\xd8\x98\xba\x21\x95\xb2\x4c\x3c\x75\x7c\x22\xaa\xa5\xb4\xe8\xb7\x29\xc1\xde\x64\xa4\xd2\xcd\x4a\xa5\x57\x65\xb7\x22\x95\x56\x82\x8a\xdf\x4d\xc3\x58\x32\xb8\xf8\xe6\x9e\x7d\x59\xe9\x06\x86\xa0\xfb\x7e\xc8\xed\x62\x08\x64\x3e\xe3\x18\x9f\xb9\xc6\xb8\xd0\xde\x7d\x16\xb9\x13\x5c\x12\x20\x9d\xdc\x0a\x26\xe3\x5a\x7e\xbf\x32\xc5\xa0\xcb\xdc\xca\x24\xbd\x85\x9f\x7e\x27\xbb\x34\xfe\x35\xe1\x15\xd4\x3d\xc7\xde\x5e\xf3\x2a\x78\xdd\x14\x52\x27\x16\x6e\x91\x52\x4c\xfc\x6a\xb5\x9a\xfb\xd9\xa4\x50\x7c\x22\x8b\xbd\xc3\x15\x46\x1f\x8f\xb9\x69\x9a\x87\x53\x3b\xa2\xb1\x3c\xc2\x5a\xa6\x59\xb3\x6a\x5d\xee\x07\xcc\xd4\x3e\x20\x97\x02\xfe\xdf\x11\x5c\x17\x10\x01\x8f\x61\x5b\x02\xf8\x57\x54\xa0\x4a\xd5\x39\x00\xe0\xcb\x38\x4f\xd0\x09\x8f\x69\x3d\x0b\x02\x98\xa9\xd9\xd1\x84\x3b\xd0\xc9\xf1\x84\xdc\x82\xce\xcd\x57\x5e\xe5\xc0\x04\x13\xa1\xfc\x8e\xe8\x62\x06\x22\xb0\x50\x8f\x33\x38\x46\x36\x22\x00\x81\xdc\x80\x92\x07\xfa\xe5\x70\x30\xb8\xbe\x4c\xee\xbc\x93\x3e\x0d\x3f\xef\xd4\xb4\x1c\xb9\xdb\x9d\x2f\x67\x56\x20\xfd\xfa\x66\x70\x75\x90\xae\x58\xa8\x0a\x51\x01\x5d\xed\x20\x6d\x49\xd9\x2a\x4d\x88\x40\x65\x07\xdb\x90\x15\xae\xd2\xc8\xd5\xcd\xb8\xaa\xe8\x85\xa2\xc2\x75\xf6\x08\x16\xc2\x7b\x27\x62\x46\x83\xe4\x5b\x7c\xf6\x30\x5a\x2f\x84\xef\xb2\x25\x3c\xb4\x1d\x37\x10\x8e\x60\x24\xb9\x76\xf2\x69\x3e\x2d\x91\xc7\x87\x49\x4f\x45\xa9\xbf\xad\xe0\x8b\xc3\x0b\x32\x89\x98\x2e\xf7\xb3\xef\x6b\xa3\x97\xb6\x21\x78\x36\x8b\x0e\x3f\xa0\xb0\x6b\xf0\x95\x7c\x0e\xfc\x5f\xea\xef\x03\x3f\x82\x6e\x1d\x98\x0d\xa0\xf8\x6b\x51\x0c\xed\xa4\x48\x03\xd8\x10\xd4\xcd\x06\xa8\x77\xa5\x85\xe8\xb5\x09\x59\xdc\x4d\x12\x76\x53\xcf\x2d\x78\x50\x77\xa3\x1b\x06\x5d\x9a\x62\x19\x0f\x5d\x67\x59\xb6\x44\xca\x6b\x60\x53\xa3\xc5\x31\x6d\x75\x09\x2d\x85\x29\x8c\x02\xb6\xd0\x22\xb8\x88\x0a\x70\xa0\xa5\x08\x33\x42\x01\x13\x68\x29\xa2\xfa\x2a\x60\x07\x2d\x25\xd5\x36\x05\xcc\xa1\x35\x5d\x42\xb0\x85\xc0\x81\x60\x02\xc1\x0e\xce\xc0\x1a\x5a\x8a\x1f\xa0\x53\xb2\x31\x81\x8e\x02\x2e\xa0\xa5\x44\x3b\x72\x97\x5c\x01\xf7\xd0\x52\xd8\x16\x60\x03\x2d\x65\x1b\x06\xf8\xb9\xeb\xaf\x15\x70\x0d\xad\x69\x06\x49\x53\xc4\xcb\xcc\xc3\x62\x26\x88\x97\x32\x9c\x4a\x29\xde\xe5\x0c\xac\x48\x03\x22\x4c\x65\x1e\x88\x32\x45\x8e\x94\xc3\x27\x4a\x71\x1e\xe5\x88\x8e\x33\x30\x20\xcd\x71\xd8\x4a\x39\xb4\x64\x09\xbc\x63\x29\x9c\x62\x39\x4a\x62\x29\x86\x63\x0e\x14\xb1\x00\x79\x58\x40\x32\x9c\x81\x31\xb4\x9e\xf0\xba\x36\xc7\x3b\x9f\xb9\xe3\xf7\x13\xf8\xe2\xf4\x29\x8f\x5b\xe8\x27\x38\xc6\xe4\x1d\x59\x4e\xe7\xf4\xa8\x31\x5f\xd8\x11\x24\xd5\x25\xd0\xc2\xc5\xd2\xf4\x6b\x51\x5f\x86\x2e\x5c\x2c\x4c\xff\xb0\x11\xca\x56\x10\x00\x86\x8b\x75\xf0\x86\xa8\x58\x25\xc5\x18\x2e\xd6\xc0\x1b\xaa\x62\x8d\x14\x66\x98\xd4\x08\x83\x00\xcd\x97\x76\xbf\x80\x07\x4c\xde\x12\x12\x79\x79\x14\xe1\x76\x0b\x65\xb9\x34\x8a\x88\xbb\x85\xa2\x42\xbf\x64\xa8\xbb\x85\xf2\xfc\xee\xf5\x9e\xe2\x78\xcb\x40\x45\xd1\xcf\x23\x0c\xa7\xef\x71\xed\x7e\x16\x5f\x38\xa6\x78\x93\x70\x0f\xe0\xa4\x98\xfc\x9e\x2c\x50\x04\x76\x92\xe7\x12\xb1\xb7\x2e\x0d\xbf\xb6\x18\x7a\x24\x0b\x18\x73\x03\x9f\xa1\x4f\x5a\x88\x25\x3d\x29\xfa\xa1\x4d\x06\x38\x49\x92\xa7\x5b\x53\x5d\xd7\xaf\x21\xd0\x75\x7d\x45\xfe\x3b\x80\x33\xfa\x3e\xb3\xd0\x5a\x4f\x71\xf6\x29\x59\x53\x93\xa7\x3b\x6c\x9b\x6e\x52\x78\xe8\xa4\x11\x92\x07\x65\x22\x52\x52\xb5\x78\x49\xb0\xcc\xdc\xaf\x90\x80\x63\x32\xf0\x47\x0e\x29\x39\xf4\x6f\xb6\x6f\xec\x8d\xeb\x3d\x52\x0f\xb5\x9a\x31\x76\xd3\x19\xfe\x7f\x9a\xbc\xde\x8d\xde\xd3\xa6\xf3\xa6\x9c\xe7\x83\x29\x5b\x18\x68\x1a\x94\x08\x22\x6c\x03\x3f\xf0\x70\xbb\x48\xd5\xfa\xa5\xd5\xb0\x0c\x59\x96\xf6\x08\x22\x6c\x2e\xc4\x7a\xf8\x2c\x99\xc5\xf9\x24\xe9\xef\x73\x08\xca\x9a\x3c\xd9\xff\xdd\xd1\xb9\xfc\x81\x6a\x00\x57\xbf\xd3\x68\x2f\x77\x7e\x92\xd9\x3f\x93\xe5\x3f\x49\xdd\x9f\x42\x77\x4f\x1e\xb7\x90\x6b\xcd\x41\xe9\xa5\x7d\x21\xe9\xec\xa3\x11\xf4\x1d\xd7\x5f\x73\x35\x2c\x15\x6e\xc2\x15\x44\x82\x8c\x56\x90\xe3\x78\x16\xc5\x9e\xbc\x60\x10\x92\x04\x62\x7a\x6c\xaf\xa0\xf7\xa8\xe6\x57\x35\x45\xd1\x0e\x0c\x53\x09\x03\xd7\x02\x03\x85\xf1\xeb\xcb\xeb\x08\x73\x85\x55\x76\xdc\xc8\x0e\x37\xe4\xe8\x50\x18\x5e\x56\x04\xd1\xac\xa5\xe3\x6c\xa2\x26\xa6\xd0\xa9\xaa\x70\x9d\xcf\x95\x63\x39\x4f\x23\x95\xa2\x7e\x47\xfd\x83\xeb\x71\x3a\x43\x66\xb1\x16\xff\x07\xc1\x6a\x27\xdf\x06\x56\x3b\x29\x07\xab\x9d\x7c\x33\x58\xed\x41\x0a\x15\xc1\x6a\x59\xfa\xa6\xac\xd1\x8a\x03\x1f\x8f\xda\x98\x6e\xdf\xb8\x11\x2b\xd8\xc1\x34\x59\x15\xf4\x1c\xa2\xd3\x6a\x16\xb4\x9d\xcf\xa4\xec\xfc\x2c\xa9\x26\x6a\x9a\xac\xde\xf3\xb3\x2a\xa3\x96\x02\xb5\xef\x9d\x64\x59\xa8\x77\x09\x21\x4d\x8b\x25\x33\x97\x9b\xef\x68\x47\xd2\x1e\x25\xf3\x42\x30\xda\x03\xfd\xd3\x8d\xce\x2f\xb7\x94\x2c\x58\xba\x1f\x7c\x4c\x20\x42\x86\xfe\xb5\xef\x24\x56\xc1\x65\x0b\x82\x65\x59\x1b\x7d\xe4\xea\x37\xa3\x87\xe6\x79\x09\x15\x37\x22\xbc\xdd\x6c\x87\xe1\x9b\xcf\x8e\xff\xd1\x45\xf7\x3f\x22\xb4\x8d\x46\x0c\xe0\x8e\x1b\xf8\x3d\x35\x1f\xda\xa5\x75\xcb\x78\x77\xa3\x31\x31\xce\xb8\x4a\xb0\x43\xef\x43\xef\x0d\x83\xb5\xab\x5c\x87\x64\x5d\x1a\xd9\xa1\xbd\x89\x54\x8d\x2d\xc1\x6b\x88\xc6\x78\x66\xa4\x2a\x90\x0a\x95\x98\x41\x5a\xec\xf3\xce\x85\xc8\x7b\x4c\xd4\x3d\x37\x12\xe9\xf1\xe0\xe5\x03\x51\xc6\x50\x4a\xfb\x68\x7e\x98\x31\xff\x16\x9e\x92\x16\x0b\x6d\xb0\x63\xcf\xb7\x6a\x9e\x6c\xd4\x2e\x83\xcd\xc6\x1e\xc3\x2d\x24\x48\x74\xb7\x6e\x84\xca\xc5\xc3\xd8\xa8\x2e\x9b\xe2\x29\x2d\xdb\x85\xb2\x86\x8a\xf5\x8e\x6c\x33\x97\xf5\xe0\x88\x56\x73\x35\x25\xed\xc6\x92\xe5\xb6\xc4\x6a\x88\xcb\x5c\x35\x1e\xc4\x1a\xd5\xfb\x9c\x5d\x40\xff\x2f\x18\x28\xbc\x4b\xc9\xef\xb1\xe8\x7e\x51\xe8\x90\x56\xc5\x58\x55\xa4\x74\x50\x7e\x44\x12\xd5\x25\xc8\x5d\x00\xd3\x7d\xd3\x50\xe2\x07\xa8\x36\xaa\x92\x8a\xd5\x59\x93\xa6\x8e\x38\xbe\xdd\xa4\x6a\xf5\x96\x65\xde\x90\x6a\x0d\xcb\x6a\xca\xda\x1d\x40\x31\x57\x95\x8c\x0b\x88\x87\x44\xd6\x08\x94\x11\xd4\xe2\xfc\x86\x17\x6a\x4f\xc5\x36\xc4\x3d\x2f\xde\x07\xa0\x60\xbd\xf6\x60\xba\xd3\x29\xdd\x00\xbd\x92\x3e\x96\x9f\x1a\xcf\xab\x1c\x2a\xfe\xfc\xb3\x43\xd9\x09\xa1\xff\x27\x6f\xae\xfa\x07\xcf\x1f\xf1\x9e\xcf\x7a\x49\x52\xf0\x43\x96\x80\x5a\x13\x76\x90\x2d\x2d\x88\xad\x01\x2b\x1a\xcb\x0e\xf1\x4f\x73\x98\x4d\x9a\x56\x70\x19\x4c\xe1\xcc\x5a\x43\x89\xd7\x00\xbf\xa0\x88\xd4\xf1\x32\x0c\xb6\xe2\xf7\xd8\xc4\xe1\xfb\x14\xf3\x9b\x74\x43\x82\x0d\xa0\x43\x1f\x85\x2e\x8c\xd4\x31\xd4\x92\x76\xd5\x29\x02\xe1\x2c\xf1\x05\x64\xfb\x12\x6a\xe7\x70\x8a\x66\x96\xf4\x15\x3d\x85\x3f\x3f\x2b\x4a\x92\xe2\xd3\x0b\xd6\xaa\xf2\x9e\x80\xfc\xd7\x50\x50\x5b\xb9\x04\xbb\x1f\x7a\x4e\xbf\xa6\x7c\x17\x6a\x24\x67\x1c\xf5\x11\x85\x1e\x4d\x6a\x15\xf5\xbf\xff\x5e\xf9\xae\x92\xbc\x77\xf0\x3b\xa5\x7f\xa8\x6c\x22\xf2\x1d\x04\x30\xa6\xc1\xad\x44\x60\x78\x4a\xf2\xec\x16\xe7\x2a\xc3\xdc\x3e\x67\xff\xea\x1b\x18\x45\xf6\x1a\xf6\xb1\x48\xb5\xe7\x67\xc8\x1f\x3c\x3f\xe7\x3d\x09\x24\x9d\x39\x68\x6a\x7d\x45\x89\x4b\x3e\x88\xf3\x74\x18\x06\xb8\xd1\x37\x6f\xa9\x77\x01\x3c\x04\xae\x53\x33\xf8\x3f\xfc\xd3\xc9\xdf\x84\x45\xbc\xa0\x1e\x67\x99\x6c\xbd\xf9\x61\x3e\xa3\xd9\x38\x44\xd1\xcb\x79\xed\x6a\xda\x19\x0a\x1f\x65\xda\xb5\x84\x33\x0b\x1f\x47\xad\x47\x3c\x48\xb5\xac\x5b\x2c\xfb\xe9\xd0\x87\x4b\xa4\x3e\x09\xe0\x2f\x7d\x18\x6b\x3a\x0a\x46\x61\xb0\x71\x23\xc8\x0d\x48\x91\x3e\x3a\x39\x51\x4d\x8b\xa6\x93\x77\xe0\xf9\x05\xec\xaf\xa1\x96\x66\x17\xdc\xc3\x7f\x98\xf0\x5f\x46\xfb\x5e\x3a\x35\x48\xab\x5c\x4b\xf8\xf0\x87\x5a\x5c\x22\x84\x6d\x45\x21\xbc\x76\x7d\x47\x3d\xd8\xe5\xed\x9f\xd8\xe5\x6d\x69\x97\xb7\xc7\x75\xd9\xa9\xd8\xe5\xf7\x89\xd3\xf6\x70\xc7\x9d\x3f\xb1\xe3\x4e\x69\xc7\x9d\xe3\x3a\x3e\xa9\xd8\xf1\xb7\xa9\x0b\xfe\x70\xcf\x27\x7f\x62\xcf\x27\xa5\x3d\x9f\x1c\xd7\xf3\x1d\xed\xf9\xa1\x89\xee\x05\x11\x64\xb3\x9d\xdc\x06\x3a\xd4\x77\x4c\xf6\x02\xfe\x1b\x3a\xba\x2b\xed\xe8\xae\xa4\xa3\xb1\x16\xaf\x21\xaa\xe5\x7d\xf3\xb9\x55\xbc\xe0\xbb\xc7\x07\xa9\x62\x25\xc8\xec\x70\xd1\xd5\x0f\xf7\x38\xe1\x9d\x47\xdf\xde\xb8\x4b\xc1\xed\x98\x2c\xbf\xa8\x82\xff\x09\xbc\x32\x34\x10\xca\x0b\x8a\x47\x32\x5c\xcc\x3d\x50\x8c\x9c\x3c\x70\x41\xbf\xa4\xe1\xd4\xeb\xf1\xca\x48\xaf\xd8\x5b\x56\xba\xf9\x3a\x39\xf1\xcf\x15\xf2\x69\x3c\x81\x28\x22\x0b\xb7\xdf\x4f\x8a\xe1\xed\xdc\xc9\x49\x78\xae\x64\x60\x1b\x68\xb1\x90\x2c\xcf\xaa\x8b\x77\x04\x5a\x1f\x66\xf2\x34\x1f\x97\xaa\x6a\x92\x64\x7b\x87\x76\xf8\xde\xdf\x45\xd0\xa1\xf5\x0e\x64\xb0\x9a\x68\x71\xa1\xca\x81\x4f\x1c\xdc\xdb\x47\xea\x11\x81\x8d\xed\x07\x56\x57\xea\x64\x24\x05\xc5\xdd\xa9\x74\x50\x65\x9b\x5c\xb2\xb7\xd8\xef\xf3\x7f\x7e\xbe\x2e\x1e\x1b\x8a\x2d\x42\xdc\xc6\x1e\x52\x58\x7b\x9f\x9f\xa7\xe2\xe7\xa8\xca\x54\xc9\x9c\x2a\xe3\x2f\x37\xb7\x72\x1d\x14\x54\xa9\x94\x0a\x39\x68\x57\xa1\x82\x15\x8c\x51\x29\x19\xba\x1c\x99\xfc\x41\x48\x48\x66\x26\x68\xa2\xa5\x0c\xb7\xf4\x4a\xaa\xf7\x58\x8b\xb6\x70\xe9\xae\x78\x32\x26\xf4\x58\xdb\x24\xc4\x15\x50\x35\x5d\xbc\xba\xd2\x7f\x69\xb4\xd5\x4b\xdd\x1b\x91\xeb\x19\x8d\xb6\x3a\xd2\xef\xb4\x5c\x1a\xf9\x6a\x39\xcf\x38\x23\x07\xf3\x9e\xd5\x69\xde\xb3\x66\x79\x6e\x77\x10\x02\x17\xf8\x20\x00\x1e\xb0\xa5\x79\xde\x93\x4e\x07\xae\xb3\xac\x91\x1b\xb0\xff\xfa\xc7\x3f\xed\x85\x0d\x17\x1d\x7b\xb9\x6a\xd6\x1b\x4e\xb7\x65\xb7\x3a\xdd\xc6\xc2\x71\xec\xb6\xe1\x18\xf5\xa6\x6d\xb7\xdb\xd0\x58\xb5\xec\xd6\xbf\xfe\xf1\xcf\x4e\xa7\x6b\x76\xdb\xbd\x5e\xaf\x5e\xef\x36\xdb\x8d\x66\xaf\xd5\xec\xd3\x9b\x35\x7c\xac\x6a\xe9\x60\xd5\xc6\xc1\x2e\x5c\xc2\x5a\x2e\xbf\x7b\xc2\x04\x45\x7a\xad\xed\x42\xaf\x46\x6e\xd2\xfc\xeb\x1f\xff\x34\xa1\x69\x9b\xab\x46\x07\xb6\x8c\x66\x6b\xd5\xed\x2e\x61\xbd\xe1\x38\xab\x76\xa7\xdd\xb6\x17\x9d\xb6\xe3\x98\x8e\xe1\x34\x17\x98\xeb\xba\xd1\x6d\x37\x1b\x4d\xb3\x6b\x98\x0d\xb3\xd7\xa8\x1b\x66\xaf\x4a\x5e\xf7\xa4\xc4\x7f\xf5\x92\x22\xe3\xc9\xc5\xdd\x64\x3e\xb9\x78\x3b\xbf\xbc\xbd\x9b\x4f\x86\xc3\xdb\xc9\xcd\x28\xcd\x5b\xff\x5f\xa6\x51\x52\xf4\xe6\x72\x38\x48\xcb\x7d\x2f\x16\xbc\xbc\x1d\x8e\xaf\x4b\x0a\xfe\xcd\x34\xfb\x26\xfd\xc9\x5b\xe0\x7f\x97\x71\x33\xbf\x1c\x0e\x26\xd7\x83\x89\xc0\x55\x5d\x5a\x67\x3c\xba\x18\xf4\x6b\x63\xa6\xe5\xb6\xcf\xa5\xfc\xfe\xee\x96\xc2\xc4\xfd\x38\x99\x8c\xc6\xc5\xbc\x35\x42\x2f\x44\xc2\x69\x37\x08\x61\xb1\xaf\xd9\x2e\x7c\x2f\x74\xaa\xd0\xfd\xd2\x4e\x7c\x2f\x8c\x82\xb4\x4a\xff\x37\x10\x4a\x95\x87\x22\xd1\xd6\x5c\x27\xd1\x9d\x96\x61\xb4\x97\xe6\xa2\xdb\x30\x9d\x5e\xaf\xdd\x6c\xd9\xe6\xa2\xd7\x76\x8c\x65\xc7\x69\x75\x9c\x76\xc7\x30\x5b\xab\xe6\xaa\x63\x38\xff\xfa\xc7\x3f\x1b\xed\x9e\xd1\x6c\xf6\x9a\xcd\x7a\xd3\x6c\xd6\xeb\xcd\x9e\xd1\x39\x4e\x77\xea\xad\xca\xca\x53\x6f\x57\x54\x1e\xa1\xe0\x5e\xe5\xa9\x77\xfe\x53\xca\x23\x08\xf9\xdb\xd5\x23\x65\xfb\x18\xf5\x10\x04\x5d\xa6\x1f\xee\x3e\xfd\x60\x28\xfb\x5c\x47\x16\xdd\xa6\xd1\x35\xda\x6d\xa7\xd1\xed\xd9\xdd\xa6\xd1\xe8\x18\xf5\x7a\xab\xb5\xe8\x2d\x8c\xe6\x0a\x36\x7b\x9d\x8e\xb3\xa8\xb7\x97\xab\x7f\xfd\xe3\x9f\x4d\xa3\xd7\x6d\xb4\x3a\x5d\xb3\x67\x76\x8d\x76\xc7\xec\x98\xc7\xa9\x48\xa3\x53\x59\x45\x1a\xdd\x8a\x2a\x22\x14\xdc\xab\x22\x8d\xde\x7f\x5a\x45\x98\x9c\xbf\x5d\x4d\x52\xd6\x8f\x51\x13\x41\xd8\x65\x6a\xe2\x4b\xd5\x84\xc2\x52\x27\xfa\x01\x61\xcb\x76\x56\x8b\x65\xa3\x5b\x5f\xc0\x45\xa7\xb1\x6c\x19\xb0\x6e\x36\x57\xce\xa2\x65\xaf\xda\x5d\xa3\xd9\xac\x77\x1a\xf6\xc2\xc0\x4b\xa1\xd9\xee\xd6\x9b\x6d\xc3\xa8\x1b\x9d\x46\xab\xd9\x36\x1b\xed\xe3\x14\xa4\x55\xb6\xaa\x14\x15\xa4\x55\x36\x7a\x79\x05\x69\x95\xc9\x2e\xa7\x20\xad\xfa\x7f\x48\x41\xc8\xde\x80\x09\x99\x40\xde\xd5\x82\x2d\xf4\x6f\x1c\x80\x57\xa0\x95\xeb\x41\x50\x83\x14\x63\x34\x58\xad\xf0\x31\x6b\x4e\x61\x81\x35\xbd\xf6\xb7\xbf\x0d\x02\x04\x01\x41\x61\x4b\xb2\x61\xd0\x8b\x72\x91\x42\x69\xd6\x5c\x06\x7b\xf8\x7e\x1b\xa1\x10\xda\x1b\xd6\xde\x6e\xbb\x0d\x42\x14\xd5\x5c\xf4\xef\x58\xd8\x5a\xf2\x7a\x07\x54\xb2\x55\xb6\x17\x48\x55\x32\x90\xaa\xa4\xe7\xd8\xdb\x64\x6f\xd6\x58\x34\xcc\x86\xe3\x18\xd0\xe8\x40\x73\xd9\xaa\xb7\x9a\xce\xb2\xdd\x5c\xb4\x4c\xc7\x58\x34\x0d\x68\x36\x60\xdd\xa9\x1b\x9d\x36\x36\x58\x75\xb2\xa2\x19\x66\xaf\xd9\x6c\x36\x3b\x6d\xa3\xdb\xec\xb3\xfb\xc8\x7b\x37\x67\x9e\xc8\x05\x69\x5c\x0c\x78\x13\xf0\x60\x39\x4f\x8e\xd9\xeb\x34\x97\x76\xd3\x68\xc2\x96\xe3\x34\x5b\x4e\xbb\xd3\x34\x16\x75\xa3\xdd\xed\x2d\x17\x46\xbd\xd1\x34\xda\x66\x6f\xd5\x20\x0b\xad\xd9\x32\x8c\x7a\xd3\xe8\x98\x8d\x4e\xbd\x69\xd4\xfb\x35\x21\x46\xaf\x76\x91\xd2\xfe\x0d\xd8\x22\x1b\x34\xa4\xec\x10\x1f\x75\xc7\x30\x17\xb6\xd9\x33\x9d\xee\xaa\x07\xeb\xed\x55\xdb\x34\x96\x76\x13\x76\x0d\xc7\x5e\xc2\x6e\xb3\xe1\x18\xed\x66\x0f\xcb\xa6\xde\x6e\xe0\x1d\x6b\xb7\x61\xb6\x1a\x8d\x56\xbb\x57\xaf\x37\xfa\x35\x31\x1e\x2e\xcb\x8b\x24\xa5\x30\xb9\x6b\xa8\x00\xc5\xf6\x60\x88\x6a\xe4\xbf\xa7\x8e\xed\xaf\x61\xa8\x00\x25\x0c\x3c\xc8\xdf\x29\xa0\x09\xe8\x65\x69\x5c\xcd\x0e\x5d\xfb\xd4\x83\x0f\x24\x6b\x6f\x5d\x01\x26\x50\x36\xe8\xb4\x69\xbc\x38\xbb\xf0\x84\x7c\x40\xa2\xb9\x85\x59\x32\xe1\xf4\x30\x15\x49\xd3\x09\x67\xde\x37\x30\x41\x12\xc1\x3e\x03\x53\x91\xd3\x6c\x1f\xcc\xe4\x97\x92\xe9\x2b\x65\x94\x3e\x72\x11\xdc\x44\x85\x27\x0a\x50\x22\x64\x23\x77\x99\x7d\xb3\x0c\xfc\xe4\x5e\x3d\x6e\x2e\xba\xb7\x49\xef\xe0\x97\xa5\x67\xd3\xa4\xb9\xa7\x4b\x37\x5c\x62\x26\x32\xb5\x32\x64\x10\xfc\x82\x44\xd9\xf0\xe0\x36\x26\x67\x96\x1d\x99\x78\xb4\x08\x99\x25\xfd\x45\x62\x0c\xdc\xe5\xa7\x74\x48\xee\x5d\xc7\x81\x7e\x9a\x97\x99\xb3\x43\x2b\x64\x87\xa3\xcb\xd3\x30\xdf\xf8\x34\x08\x5a\x11\x59\x20\x21\x03\xe2\x60\xd0\xa9\x36\x61\x83\xe7\x85\x77\xac\x80\x90\x0c\x1a\x1f\xbf\x4a\x86\x4a\xa8\xfd\x8d\x8d\xe0\xa9\x5c\xad\x91\x8c\x92\x36\x94\x19\x80\x19\xe5\xa4\xfc\x9e\x92\x4c\xd2\xa9\x64\xf0\x9f\x3c\xec\x3c\x23\x30\x31\x53\xf5\x0c\xa0\x84\xbe\xfb\x40\xf4\x2b\x8a\x60\x88\xd8\x6f\xd3\x7c\x9c\xd0\x10\x78\x76\x75\x8f\xf6\x80\x0f\x86\xeb\xaf\x82\x44\x29\x94\xc8\xfd\x8a\xff\xa9\xd7\xf9\x70\x8c\x82\x88\xe0\x58\xe3\x51\x0c\xb6\xa7\xa1\xbb\xbe\x47\x54\x1a\x63\x5a\xd4\x5b\x93\xc9\x48\x52\x44\x90\xd8\xa8\x64\x1c\x49\x30\x87\x42\x64\x81\xff\xc3\x53\x8e\xc8\xc5\x25\xbc\x65\x3c\xb4\x0c\x36\x7b\x84\xec\x13\x85\x29\x9c\xfe\x11\x6d\x4e\xdb\xc2\x9f\xde\xfa\xb4\xa9\xcc\x40\x28\x67\x86\x27\xe6\x90\x67\x06\xe7\x2f\x67\xc0\x2d\x54\x67\xba\xc2\xaf\xce\x0b\xd9\xc6\x85\xac\x1d\x7b\xc8\xb2\x02\xd9\x8e\x60\x4e\xfd\x42\x53\x8c\x30\x5d\xd8\xa5\x24\x93\x57\xa9\xc8\x80\xb2\xf5\xec\x25\xbc\x0f\x3c\x87\x8c\x74\xb5\x9d\x80\x64\xd0\xb2\x64\xa4\xcd\x17\x32\x79\xa4\x4c\x17\x5f\xbd\xb8\x05\x21\xdd\x47\x96\xbe\xf8\xe2\x08\x6d\x9d\x81\x40\x3e\xbf\xe8\x6c\x3e\x4d\xd2\x6b\x14\xe7\x5b\x1a\x0d\x44\xdf\x65\xca\x27\x96\x11\xdd\xc3\x0d\x3c\x0d\x1e\x60\x18\xba\x0e\xb7\x73\x2e\x31\x6b\xa7\x0b\x2f\x58\x7e\xca\xbc\xcb\x09\xa5\x28\x83\x34\x24\xb7\x20\xb3\x9b\x51\x2d\x08\x49\xd2\xdc\xbc\x75\x26\x5b\x0c\x5e\xb3\xe6\x6e\x71\xb9\xd5\x67\xc7\x4f\x25\x28\x92\x35\xd3\x3f\x4f\xdd\x2d\x45\xea\x10\xba\x4f\x91\x3b\xc4\x85\x25\xcb\xb3\xe3\x46\xf6\xc2\x83\x4e\x46\x6d\x39\xc1\xcb\xc0\x2b\x2e\x1e\x59\xf6\x96\xac\x08\x37\xaa\xfd\x2c\x47\xf4\xf5\x31\xa2\x1a\x05\x64\x51\xcd\x0a\x8b\x3d\xdc\xc3\xc7\x96\x96\xf0\x65\xc4\x44\x86\x70\xb9\x54\x48\x87\x56\x59\x2c\x41\x76\x47\x0a\x26\x8b\xed\xf1\x53\x81\x87\xef\x70\xf6\x92\xbf\x89\x41\x63\x7f\xc9\xa7\x81\x07\x57\x47\xdb\xec\xa2\x9d\xab\xc8\xe3\xe8\x63\x96\x47\xf2\x77\xc2\xe3\xe8\xa3\x32\x03\xde\x81\xfe\x97\xa7\xdd\x90\xb6\x5a\x8c\xc4\xe1\xed\x17\xde\x1c\x92\xbc\x4a\x93\x3d\x5c\xe2\x7d\xa8\xb5\x85\x61\x14\xf8\xda\x81\x36\x79\x48\x4f\xb1\x4d\xf6\xe6\x50\x9b\x3b\x57\xbe\x0c\xc9\x02\x7b\x8a\x8d\x24\xef\x66\xc0\x3e\xd0\x50\x35\x69\x4a\xe2\xbc\x78\xab\xc5\x57\x55\x26\xa5\x24\x16\x6c\x9f\xd4\x49\xf1\xe1\x0a\x57\x8e\x34\x69\xdb\x15\xe5\xba\xf4\x0f\xb1\x93\x86\x8d\x49\x5a\x49\x5e\x1e\x6a\xa7\x88\x91\x4f\x64\xb6\xb7\xe5\x34\xfc\x4c\xd2\x72\xf2\xf2\x48\xe9\x0a\x81\x73\x39\x16\x29\x00\xbe\xb4\xb1\xb4\xd2\x9e\xbd\x15\xdb\x4c\x4d\x71\xfb\xcc\x6a\x8a\x41\x72\x25\xbb\xd2\xf2\xd5\x33\xd7\x8c\x1f\x9c\xae\x77\x08\xc1\x30\x12\x6a\x71\x78\xb8\xcc\xba\x53\xec\x7f\x9e\x17\x6a\x6a\x0a\x4f\xf3\xc6\x2b\xd7\xc8\xc1\xce\x03\x25\xbf\xf6\xd3\x53\x51\x61\x4b\xb0\x40\x58\xed\x16\xc8\x3f\xc5\x1b\xeb\xec\xa9\x88\x46\x61\x0b\x28\x02\x32\xcc\x33\x4a\x86\xc0\xa3\x31\xf8\x14\xf1\xc9\x22\x70\x1e\x8f\xdb\x05\xb7\x2b\xa9\x51\x26\x02\x30\x2f\x2e\xfc\xe2\xaf\x51\x06\x33\x3f\xd5\xa5\x4c\xcd\xaa\x4d\x09\xb1\x88\xb9\xb6\xc8\x9b\xbf\x46\x19\xbc\xfb\x6c\x63\x69\x5d\xd6\xda\xad\xfd\x18\x90\xe6\x1e\xf0\xa1\x67\x69\x7b\xa9\xac\x69\x60\x3e\x95\xd7\x1a\x6e\x5c\xdf\x3d\x75\xd7\x7e\x10\xf2\xe3\x6a\xa6\x00\x95\xf0\x2a\x08\x90\x64\x34\xb7\xa1\xbb\xb1\xc3\xc7\xdc\x31\xb7\xda\x5a\x3b\x9b\xc5\x00\xc1\xcd\xd6\xb3\x11\x4c\xbf\x28\xca\x32\x04\x90\xe3\x1f\x30\x92\x70\x74\xb0\x00\x3d\xc0\xe3\xfb\x4d\x21\xbe\xff\xbe\xa9\x80\x04\xd2\xae\x01\x94\x9a\xf0\xf5\x95\xbb\x05\x65\x0e\x29\xf2\x75\x8a\xf8\xef\x82\x50\x16\x47\x2f\xa2\xf4\xa7\x88\xd4\x1c\x9a\x5e\x88\xfd\xa7\xc8\x6a\xeb\xb5\x07\xe5\xc9\xbf\x85\xf7\x62\xa4\x3f\x83\x01\xe0\xa8\xb5\x29\x5a\x4e\x1e\xf0\x2f\xfd\x06\xad\x17\xaf\xf3\xc6\x79\x96\x7b\x45\x78\xd4\xa3\xd1\x01\x4c\x10\x41\x60\x36\x41\x02\x57\x99\x8d\xf7\x27\xc3\x44\x82\xf4\x53\x9f\x15\x40\xe9\x85\xc9\xb2\x60\x7e\x44\x6f\x42\x0e\x02\x94\xe4\xc2\xc8\x60\x77\x0c\x3f\xef\x54\x54\x4c\xd0\x99\xba\x93\xca\x09\x97\x7e\xc1\xd7\xb4\x18\xd0\x44\x46\xee\x03\x8c\xfa\xd3\x81\x3e\xff\x05\x0c\xf4\x9f\x6e\xc1\x40\x8f\xd6\xe0\x57\x7d\xd8\x02\x63\xfd\x97\x79\x13\x8c\xf5\xd1\xf5\x3d\x18\xe8\x1f\x3d\x30\xd6\x7f\xfe\xf9\x12\x97\xfa\x09\x0c\xf4\x1d\x18\xeb\xef\xd6\x3f\x83\xb1\xfe\xf9\xe1\x16\x8c\xf5\x9b\xde\x57\x30\xd6\xaf\x2e\x3e\x83\xb1\x7e\x0d\xff\x07\x0c\xf4\x39\x18\xe8\x6f\x7e\x07\x63\xdd\x8e\x06\x60\xac\xbf\x6d\x61\x92\x3f\x6d\x7e\x07\xb7\x3a\x7e\xea\x7f\xfe\x05\x8c\xf5\x2f\x77\x23\x30\xd6\x2f\xdf\xb5\x31\xa1\x4f\x3d\x30\xd6\x3f\x7c\xbe\x00\x63\xfd\xeb\xd5\x1b\xfc\xe4\x02\xd7\xfc\x70\xeb\x82\xb1\xbe\xb6\xb7\x60\xac\x5f\x78\xb8\xfc\x68\xf8\x17\x30\xd6\x61\xb7\x0e\xc6\xfa\xdf\xeb\xb7\x33\x10\xa1\x47\x0f\xf7\x43\xd1\x29\x76\x04\x19\xeb\xe9\xdc\x5f\x33\x4c\xbf\xd3\xff\xbe\x1c\xbe\x1b\xfd\xf7\xec\x69\x6b\x3b\x8e\xeb\xaf\x4f\x17\x01\x42\xc1\xa6\x6f\xb6\xb6\x5f\xce\x56\x81\x8f\x4e\xf1\x01\xb9\x6f\xb6\xb7\x5f\x62\xbd\x70\xd2\x91\x11\xfa\xc3\x75\xd0\x7d\xdf\x34\xeb\xdb\x2f\x67\x1b\xd7\x3f\x15\xfe\x16\x28\xa4\x07\x81\x72\x1a\x4d\x23\x43\x02\xff\x29\x50\x88\x3c\x3b\xba\x2f\xaf\x5c\x6f\x65\x2a\x93\x3f\x17\x41\xe8\xc0\x90\x77\xd1\x0f\x7c\x78\xb6\xb1\xc3\xb5\xeb\xd3\xe3\x6e\xff\xb4\x81\xeb\xd0\x27\xd8\x1a\xf5\xdb\xd9\x26\xc9\x71\xea\xdf\xdc\xa4\x69\x6e\xbf\xc4\x78\xca\xd3\x0b\x18\xa9\x49\x20\xb7\x92\x19\x58\x98\xac\x4d\x46\x06\x05\xdb\xfe\x69\xbd\x81\xf9\x4c\xdc\x60\x92\xe2\xb5\x5a\x4d\x82\x24\xa9\xe7\x4f\xf2\x07\x1a\x32\x62\x3d\x73\x70\xff\xf6\xe2\xb5\x1a\xfd\xb8\xa5\x4b\x1c\x02\x32\xea\x0e\xbd\x5c\xd5\x27\xde\x80\x33\xe2\x18\xb8\x87\x44\x92\x66\x37\xab\xb1\x0d\xfe\xe7\x1f\xf4\x7d\xdb\x30\xce\x30\x53\x64\x58\xb6\x6c\xe9\xe9\x87\xd0\xb3\xf1\x54\x3f\xc3\x63\x1b\xf6\xff\xab\xd9\xc2\xff\xab\xc4\xb7\x2e\x75\x4c\xec\x63\x5a\xac\x50\xad\x89\x82\x0f\xe1\x3f\x4f\xbe\x56\xab\x95\xce\x53\x71\xae\x54\x1b\x6c\x0e\x3b\xaa\x17\xce\xf6\x7a\x82\x8f\x26\x35\x4f\x85\x01\x63\xf3\xa7\x8e\x8d\x84\x5c\x02\x24\x51\x74\xaa\xec\x15\x3a\x80\xb7\x2b\xa4\xd6\xa1\xb2\x66\x08\x37\xb4\xb8\x03\x3d\x88\xa4\xa3\x4e\xa7\x3e\x99\xf3\x9c\x97\x43\x82\xc4\xfa\xa9\x63\xda\xdc\x48\x30\xbb\x51\x6f\xe2\xf9\x2d\x6e\xbb\xcb\xad\x50\xcb\xc0\x12\xe1\x93\xa2\x4e\x2d\x58\x18\xee\xeb\xd7\x17\x6e\xa4\x3b\x2d\xd2\xce\x3e\x89\x71\x51\xaf\x3c\xf8\xe5\x0c\xff\xe7\x94\x2d\x97\x81\xdf\x5f\x06\xde\x6e\xe3\xc7\x7a\x7e\x83\x5f\x89\x4e\xdf\xac\x99\x67\xbf\xef\x22\xe4\xae\x1e\x39\xe2\x6c\x7f\x09\x7d\x04\xc3\x33\xdb\x73\xd7\x3e\xfd\xa0\xc3\x1e\xc5\xca\x2c\xd6\x00\x8c\x35\x55\x3b\x7b\xb0\xc3\xda\x0d\xb4\x42\xb5\x55\xaf\x77\x1b\x1a\xb8\xc3\xbf\xbb\xdd\x5e\xdd\xd0\xc0\x25\xfe\xdd\x6b\x36\x5a\x0d\x0d\x8c\xf0\xef\x8e\x69\xe2\xdf\xbf\xe2\xdf\xf5\x5e\xb7\xd1\xd5\xc0\x2d\xfe\xdd\xe8\x19\x9d\x16\x8d\x60\x58\x94\x01\x78\x78\x3a\xca\x03\x78\x80\x10\xb8\x39\x10\x8f\x30\xd8\x21\x18\xf2\x4b\xba\xd0\xe3\x90\x1d\xe4\x48\xc2\x61\x3c\xc2\x34\xe0\xfe\xf5\xce\xc5\x3b\x78\xcb\xa5\x8f\x2e\x46\xa3\xf9\xdd\xf0\xfd\xe4\x7a\x6c\xf9\xfa\xff\xd0\x67\xa3\xbb\xe1\x87\x9b\xab\xeb\xbb\xb1\xb5\xd1\xed\x0b\x06\x57\x00\xb7\x5e\xf0\x88\xf7\x2c\x0c\xbd\x21\x01\xe7\x60\x4e\xc5\x2b\x52\xe0\x35\x19\x8b\xe4\xdd\xd2\xdb\x45\x08\x86\x93\xc7\x2d\xe4\x57\x84\x83\xd0\x52\x14\x7e\x8d\x35\x03\x58\x60\xf9\xf0\x8f\xda\x3b\x7b\xcb\xaf\x1b\x3f\xb8\xf0\x0f\xeb\x95\x19\x47\xbb\xed\xd6\x7b\xcc\xdc\x73\xcd\x5e\x7c\x24\x74\x6c\x64\x9f\x9c\x18\xaf\x2c\x2b\xf3\x48\xf7\xa0\xbf\x46\xf7\xe7\xac\x0f\xc5\x1b\xb3\x99\xd2\x5a\x5f\xe5\xd7\xb7\xff\xb0\x43\x5f\x55\x64\x4d\xd7\x96\xb6\xe7\x41\xa7\xb6\x80\xab\x20\x84\x35\x5c\xb7\xe6\xd8\xc8\xae\xfd\x61\x47\xb5\x08\x22\x45\x03\xd3\x59\x06\x3e\xc1\x5d\xa5\x91\x95\x56\x7e\x20\x28\x28\x9e\xfa\x14\x6b\x20\xc3\x0b\xeb\x07\x61\x60\xcc\x9e\xa9\xb9\x32\xe5\x1d\x16\x2f\x18\x7f\x24\xb0\x0b\x92\x5e\x4b\x3a\x27\x5e\x30\xa6\xf5\x26\x58\x8f\x22\x55\x3b\x5b\x05\xa1\xca\xe2\x71\x68\x8e\x3f\x51\x70\x49\xaf\x74\xb6\xb4\x47\x53\xa8\xe3\xb3\xe0\xac\x5a\x87\x53\x2d\x48\xea\x65\x6e\xad\x9e\x51\x75\xda\x85\x21\xf4\x11\x16\x07\x23\xeb\x86\x11\xf9\x33\x86\x5e\x44\xd2\x35\x93\xc1\x23\x76\x5d\x55\x28\xde\x44\xcd\x71\x9d\x9a\x1f\xa0\x1a\xed\xaf\x30\x60\x28\xa0\xb9\x40\xe9\xd7\x6c\xed\x2c\xd0\x7f\x25\x61\x4f\xd0\x5f\xc3\x50\xc0\x3f\xb9\x83\xfa\xad\x3e\x9e\x5c\x8f\xe6\x57\xd7\xe3\xcb\xbb\x1b\x82\x31\x3f\xbf\xfc\xf1\x62\xf0\xf6\x1a\x40\x3c\x73\xd9\x85\x77\xa8\x6f\xed\x47\x2f\xb0\x9d\x33\x41\xc0\x1f\x13\xd4\x0b\x55\x23\xf1\x11\x94\xad\x93\x13\x76\x9d\x3e\xd8\x21\x35\x85\xa2\xc9\x4b\x03\x91\x27\x33\x0b\x65\x6e\x93\x03\x43\xe3\x98\x39\x02\x66\x0b\xd8\xdb\x81\xd7\x77\x17\x83\xab\x9b\xc1\x5b\xc6\xf8\x15\x48\x02\xee\x20\xcd\x80\x9b\xb2\xcf\x9f\xec\x9b\xc4\x69\x61\xe9\x7b\xc1\x08\x09\x45\x17\xa1\x4d\x8c\x07\x7d\x21\xeb\x42\x4e\x28\xa4\xc0\x22\x0c\x6c\x67\x69\xd3\x91\xe6\x58\x19\xd9\xf1\xd7\xb0\x44\xa8\xc9\xc8\xc0\xc4\x27\x61\x0d\xa2\x39\xd4\x49\x23\xc8\x83\x2a\x3c\xff\xed\x2f\xc2\xfb\x98\x62\xcc\x87\x9b\x1a\x3f\xd3\xfd\xd6\x4f\xdf\x6a\x87\xed\x9d\x8d\x07\x7c\xf2\x69\xcd\x03\x31\x12\x68\x9e\x23\x40\x76\x76\x5b\xbc\x49\xb9\xf4\x5c\x15\xcb\x0d\xdd\x6b\x71\x4e\xc7\x32\x01\x7b\x7b\x43\xf5\x34\xaa\x87\x85\x73\xad\xf5\xdb\x1b\xdb\xc5\x36\x0c\x05\x24\x07\xfa\x63\x0d\x7d\x5a\xb3\x60\x06\xbd\xf6\x97\x27\x14\xff\x96\x82\xcb\x10\x33\x0c\x63\xb6\x82\x26\xa1\x84\x25\x94\x61\xbc\x86\x88\xaa\x7c\x49\x54\xe9\x83\x1b\xb9\x08\x3a\xb7\x6c\x3c\x4f\x4e\x94\x0f\x17\xb7\x37\x57\x8a\x65\xa5\xa6\x42\x8f\x90\x8d\x76\x11\xa6\x75\x99\x6a\x57\x4a\x08\x2b\xba\xbd\x25\xa6\x27\x8d\x65\x7f\x17\x38\x90\x95\x1e\x93\xbc\xb5\x5e\xe0\x43\x55\x3b\x5f\xea\x1f\x37\x7a\xfa\xa4\x4f\xfe\x4e\xcf\xe0\xb1\x1b\x0d\xfd\x37\x5c\x91\x72\xcc\x8a\x16\xc7\xca\xdb\x1c\x1a\x11\x13\x88\x75\x59\x44\x42\x86\x60\x12\x61\x51\x6a\xbd\x80\x4c\x30\x89\x52\x61\x03\xf0\x91\x6e\x98\xc7\x10\xe9\x21\x24\x51\x97\x54\xc6\xaa\xa6\xc5\x74\x69\xe6\x8d\x4b\x16\x6a\x63\x8f\xe2\x1a\xd9\x18\xcb\x35\x44\x23\x3a\x57\x55\xa6\x3c\xcb\x10\xda\x08\xde\xc1\x35\xf1\x5a\x31\xf9\xaa\x4f\x5b\x82\x31\x42\x42\x20\xab\xeb\x78\x6a\xe6\x7c\xfb\xc1\x5d\xdb\x08\xaa\xbe\xfe\x3f\xfa\xc7\x9b\x5f\x2f\xee\xae\xe6\xa3\xbb\xe1\xdb\xbb\xeb\xf1\xf8\x4f\x56\x78\xd7\x77\x91\x6b\x23\x6c\xf6\x49\x5f\x6a\xa9\xc4\x98\xee\xbf\x6c\xc7\x13\x6b\x71\xd2\x2b\x3e\x3f\xe8\xe6\x2c\xed\xed\x14\xce\xd2\x52\x93\x80\x8d\xe1\xde\xd2\x81\x3f\x80\x5f\xa8\x26\xc1\x74\x2b\x91\x31\x89\x97\xc1\x66\x8b\x8f\x05\x2a\xd4\x00\xe4\x6a\xea\xb1\x97\x9a\x5c\xb7\x8c\x33\xbc\x62\x66\x43\xb5\x92\x3d\xc4\xca\xf5\x9d\x1b\xdf\x81\x5f\x54\x64\xfd\x80\xc8\x7a\x6c\x59\x16\x97\x6e\x04\xd1\x65\xaa\xca\xd9\x1d\xd4\x14\x7d\x67\xce\x48\x05\x66\x3f\xca\x6d\xb7\x30\x1d\xb4\x58\x6e\x19\xc8\xd3\xc0\xa7\x62\x4a\x7a\x49\x90\x40\x44\x0e\xb8\xfc\xc4\x09\x06\x71\x21\x21\xfe\x8b\x6c\x9e\xf9\xdc\x7e\xa5\xbe\x4a\x4d\xcd\x1a\x22\x15\x6a\xcf\xcf\x85\x47\xe4\x1f\x94\x4c\xdf\xe2\x1b\x9d\xc6\xd8\xef\xa0\x1a\xe2\xf5\x87\x44\x0e\x65\x9b\x2c\xc6\xd3\x0b\x11\xf3\x8c\x58\xf1\x09\x23\x5f\xfa\x22\x8d\x3b\xc7\x2d\xbe\x0e\x02\x0f\xda\xbe\xbc\xe1\x57\xaf\x24\xb1\x70\xf8\x7d\x2c\x2c\x33\xc5\x88\x3d\xfa\x38\xb7\x21\xda\xee\x16\x9e\x1b\xdd\xb3\x18\x1e\xb2\xa7\xb8\xbc\xbd\x49\xb6\x13\x6c\x8d\xef\xa3\x58\x8b\xed\x30\xb4\x1f\x87\x2b\x1a\x75\x1f\x4d\x02\xfa\x23\x23\x11\x78\x72\x02\x49\xd2\x7f\xdb\x5f\xc2\x60\x55\xbb\xc0\x55\xce\xa1\x1e\x42\x67\xb7\x84\xaa\x0a\x41\xa8\x25\x56\xc0\xb5\x90\xfe\x09\x3e\xaa\x61\x12\xb7\xe7\x9e\x9c\xa8\x70\xea\xe2\x8d\xd1\x03\x1b\x02\x7c\x40\x03\x4f\xb1\xd6\x7f\x8a\x63\xfa\xa1\x72\x12\x5c\x64\x18\xc1\x5d\x25\x41\xe3\xd6\x74\x96\xee\x67\xa7\x21\x70\x67\xc1\x2a\x8f\x11\x00\x35\x0d\x11\x5c\x43\x04\x9e\x3e\xc1\xc7\x7e\x08\x48\x43\x7d\x37\x9e\x25\xc1\x83\x71\x84\xc2\x77\xf6\x96\x74\x50\x94\x23\x23\x45\x6d\xa7\x4a\xe2\xde\x8a\xed\x41\x0d\x4d\xc3\x99\xe5\xa6\xd4\x5c\x04\x43\x6c\x59\x86\x8b\xdf\x27\xc1\x98\x90\x16\xa9\xb2\xf3\xd1\x99\xbb\x22\x24\x5f\xe1\x29\x59\x81\x6a\xb0\x9f\x5a\x3a\x1e\x8c\xeb\x4f\xf0\x11\xf7\x3e\x09\x98\x0b\xb1\xd1\xc6\xba\xae\x86\x00\x4e\xc3\x19\x01\x9e\x8b\xb1\x19\x65\x4b\xc5\x47\x17\xdd\x5f\x06\x9b\x4d\xe0\x47\x32\x65\x12\x34\x6f\xa9\x8f\x1e\xf4\xc1\xf5\xe4\xe3\xf0\xee\x67\x70\xa1\x07\x1d\xfe\x07\x01\x43\xd5\x70\xcf\xa0\xee\x43\xf4\x47\x10\x7e\xc2\x16\xf7\x89\xfd\xc6\xbb\xe7\x3e\x3a\xa7\xa6\xa8\xaf\x28\x80\xd9\xee\xab\xc1\x78\x90\x7d\x32\xc0\x9b\x80\x9b\xab\x3b\xe1\x11\xdb\x21\x90\xa7\x95\x78\xba\xbc\x7d\x3f\x9e\x10\x04\x97\xbb\x0f\x37\x97\xd7\x73\x5c\x53\xe3\xd4\x46\x81\x73\x3c\xa5\xd1\xf0\x8a\x53\xf1\x5d\xbc\x95\xa9\x58\x7d\x70\x43\x61\xda\x62\x50\xa9\xfc\xe8\x6e\xf8\xf7\x5f\xd2\x78\x4d\xae\xec\x58\x59\xce\x90\x35\x9d\x2a\x3f\x4e\x26\xa3\x51\x18\x7c\x79\x24\x17\xf8\x8a\x04\xf0\xfb\x39\xa5\xf2\xfe\xee\x76\x06\xc4\x1a\xc9\xdd\x86\xfd\xd5\x12\x48\x5e\xa1\xee\x28\xb9\x9c\xb2\xb7\xee\xe8\x62\x3c\xfe\x38\xbc\xbb\xc2\x75\xfd\x80\xd4\x94\xd5\x18\x0c\x69\xf9\xd9\x0c\x54\x54\x32\x12\xe5\x35\xbf\x19\xcf\xc7\x04\xa9\x77\x3c\xc7\x0f\xb4\x73\x3a\xb9\x29\x9f\xe3\xe3\xc5\x32\xfe\x16\xb9\x8c\x5f\x24\x98\x59\xff\x28\x9e\xc7\x2f\x65\x7a\xfc\x4d\x5c\x8f\x0b\x6c\x03\x71\x56\xeb\xf7\x08\x6d\x09\xa1\xcc\x51\xcd\x7a\x82\x04\x37\xc5\xe9\xbf\x32\x62\xfa\xc1\x8e\x98\x1f\x64\xfd\x40\xf4\x58\x1a\x26\x8e\xa6\xe6\x0c\xa0\x69\x7d\xa6\x9d\x25\x2a\x83\x77\x40\x53\x63\x76\x72\xa2\x86\x56\xa8\x87\x90\x7c\xb7\x56\xbf\xff\xdf\xe8\xfb\x35\x01\xee\xa9\xc2\xcc\x14\x53\x98\x59\x61\xac\xc5\x50\x5f\x42\x77\x3b\xdc\xa2\x9b\x34\xb0\xbc\xb8\xe6\x12\x49\x5c\x5e\xdf\x8c\x80\xad\x0f\x47\x93\x9b\x01\x07\x2f\x91\xb2\x4d\x4a\xbf\xbb\x9e\x5c\x5c\x5d\x4c\x2e\xc0\x5c\x5f\x24\x96\xe2\xf6\xe2\xf5\xf5\xed\x58\x3b\x83\xba\x47\x31\x30\xe9\xb9\x52\xbe\x9e\x86\x74\x65\x82\xd6\x0f\x10\x5b\x6d\xb6\x40\x91\x3f\xc9\x4f\x02\x37\x13\x48\xf1\x23\x09\x07\xc3\xf1\xcd\xbb\x8b\xb7\xd7\xe0\x5e\x9f\xe8\xe4\x17\x2e\x6f\xfb\x7e\x80\x88\x10\x22\xeb\x49\x70\x3a\x94\x9a\x2c\x69\x3f\x04\x4f\x89\x06\xbc\x80\x6e\xc3\x8f\x23\x71\x3b\xbc\x24\x61\x42\x1a\x05\x3a\x76\x2d\x45\x39\x2b\x23\xc0\x03\xd0\x41\x16\x35\xe7\xe4\x44\x95\xc2\x06\xec\xab\x93\x62\xec\x54\xac\x43\x10\x77\xb0\xe4\xdc\xc2\xf7\x5d\xeb\xc9\x75\x36\x73\xb4\xcf\xe0\x0b\x14\xb3\xd0\x9c\xcf\xcf\x8a\x1f\xf8\x50\x29\xb7\xfd\xa5\x55\xc5\x40\xf4\x73\x29\x5f\x6c\xa9\xb7\xa3\xc8\x5d\xfb\xea\x53\xe0\x3a\xcb\xf9\x36\x0c\x1e\x5c\x07\x86\x73\xbe\xc8\x66\x9f\xee\x42\xaf\x52\x27\x12\x98\x05\x8d\x12\xa0\xd7\xa9\xe7\xae\x53\xa5\x76\x82\x04\x99\xad\x4c\x03\xea\x8e\x20\x40\x71\xba\x18\x11\x72\xfb\xba\x4a\x65\x0a\xb4\x98\x34\x6d\xbb\x9b\xf9\x86\x22\x32\x44\xfd\xa7\x04\xc9\xbb\x02\x21\x09\xa4\xa1\x06\x68\xb0\x56\xe5\xea\x22\x0e\xa3\x16\xc7\x52\xfd\xd2\x8e\x57\xab\x2c\x90\x85\x5a\x45\x3b\x38\x60\x55\xdf\x05\x19\xa4\xfa\x0a\x6d\x33\x44\x7e\x4d\x06\x66\x5f\xb5\xfa\xe8\xa3\x56\x0e\xef\x5e\x81\x88\x24\x17\x80\x84\x20\xc3\x80\x3f\x92\x1e\xc5\xd8\x93\x90\x3b\x46\x5b\x64\x70\x81\x12\x92\x29\xf4\xfc\xb7\xd1\x94\xa6\x0d\xa8\x40\x52\x96\x3d\x41\x46\xb2\xba\x24\x25\x70\x85\x32\x82\x69\x66\x80\x63\x69\x26\xc9\x1c\x64\x64\x85\xb4\x06\xc7\xd2\x4d\x73\x41\xc8\x08\x1f\x35\x50\xf2\x4c\x12\x5a\x36\xdd\x41\x05\x3a\x62\xe2\x09\xad\xc4\x5a\xf0\x3d\x89\x14\x21\x87\x10\xbc\x1d\x5e\x5c\xbd\xbe\xb8\xbd\x18\x5c\x5e\xdf\x81\x9d\xbe\x2d\xec\x4b\x12\x48\x11\xfb\xc1\x65\xf8\x40\x4f\xec\x93\x8f\xb7\x67\xd0\x8b\x74\x87\x83\xc9\xdd\xf0\xf6\xf6\xfa\x6e\xfe\xe3\x70\x3c\xd1\xc0\xc1\x09\x53\x20\x91\xaa\xf5\x41\x93\x52\xa8\xcb\xb7\xa6\xf8\x58\x17\xec\x8e\xa8\x78\x79\x3b\x7c\x7f\x45\x4f\xab\x20\xa2\x07\xcb\x39\xf4\xd7\xae\x7f\x04\xe3\xfc\x5c\x79\x3d\x78\x7b\x33\xb8\x16\xb2\x81\x68\x60\x69\xcf\x97\x30\x2c\x5f\xe9\xf6\xc9\xf1\xf2\xfa\x6e\xa2\x01\xb6\xb5\xed\x3f\x1d\x27\xcc\xcc\x39\x1c\x2c\x5d\xe7\x88\xb1\xe4\x75\xc9\x09\x37\x06\x4c\x1d\x46\x9e\xed\xc3\xc1\xcb\xb8\xc1\xe4\xf0\xc3\x39\x57\x3f\xd6\xcd\xf9\xe8\xf6\x62\x70\x3d\xff\x70\x33\x9a\x7f\x0b\xc3\x47\x90\x67\x7d\xa2\x9b\xf1\xfe\xbe\xcd\xb8\x7f\x70\x33\x1e\x03\x18\x8b\x60\xfd\xd4\x1f\xc6\x8f\x09\x4f\xf4\xbb\x60\xbf\xe4\xd3\x21\x88\x10\xdc\xf6\x21\x48\xee\x31\xf6\x65\xdf\x5c\x67\xa0\x80\x60\x2f\x12\x14\x9f\x5f\x3f\x50\x60\x71\x19\x5a\xbd\xbc\x0e\x79\xc5\xaa\xc5\x67\xc4\x25\x84\xbb\x71\x47\xba\x14\xda\x3e\x22\xdf\xa8\x43\x8d\x82\x5d\x51\x2c\x29\xe2\x9b\x4f\xaf\x2e\x70\xfb\x53\xb5\xb3\x04\x3a\x13\xc5\x67\x62\xc2\x81\xe4\x2b\x1e\x6e\x05\x8b\x9d\x4a\x3a\x04\xc9\xbd\x9c\xe7\x67\x7c\x70\x4b\xb9\x20\x5e\x40\x35\xc1\x04\xd2\x9e\x1e\xec\xb0\xe6\x31\x63\x68\xff\x1b\x99\xb1\x8b\xcc\x30\x4f\x9d\xea\x59\xf4\x97\x7b\xee\xf6\x7d\x35\xd4\xb4\x93\x13\x0a\x85\xf9\xca\xb2\xbc\x73\xaf\x1f\xea\xbf\x07\xae\xaf\x2a\xa0\xa6\x68\x19\xe6\xd9\x59\x93\x7b\xb0\xb9\x43\xf4\x48\xa6\x81\x6f\x85\xe7\xca\x23\x8c\x94\xbe\xe2\x07\x0a\xf0\x2c\x36\x34\xa1\xb6\xa7\x3f\x2e\xef\x8f\x97\xf6\x87\x33\x47\x0e\xcd\x84\xc3\xe8\x4d\x18\x6c\xf8\x67\x23\xfa\x91\x22\xe9\x9a\x78\xd6\x16\x7a\x5c\xe1\x08\xae\x09\x5f\x80\x0e\x16\x06\xa1\x85\x74\xe6\x3f\x38\xe3\x1f\x49\x0a\x6a\x78\xc8\x63\x06\x42\x0d\x8b\x98\x00\x48\xfd\x7f\xe8\x2e\xcb\x7a\x24\xb0\x20\xdf\xd9\x68\x79\x0f\x23\x92\x9f\x80\x7f\xf2\x56\x11\xff\xce\x53\x50\xc1\x8a\x9e\x35\x22\xc6\xf3\xca\x63\x90\xf3\x54\xa5\xe8\xd2\xc7\xd6\xe5\x48\xdb\x2f\x25\xc0\x05\x4a\xe1\x9d\x21\x71\xfe\xc3\xff\x17\x7d\x6d\x05\x48\xe5\xa2\x41\x9e\x9a\x33\x00\xa7\xf5\x19\x40\x53\x38\x35\x66\x33\x6c\x73\xe2\x38\xb2\x1f\x20\xf5\xe4\x4b\x27\x36\x36\x9b\x22\xae\x5a\x04\xc8\xc7\x88\x92\xc9\x5e\x59\x01\xc4\xa5\x3c\xeb\x9c\x13\xdc\xff\xd5\x87\x54\xe6\xbe\xcf\x92\x2d\x7e\x18\x38\x9e\x3a\x77\xe9\x4b\x29\xb3\x8f\x04\x47\x50\x65\x9e\xfe\x1c\x35\xfa\xb1\x20\x73\x2b\xab\xd4\xec\xee\x6b\x4b\x74\x4c\x02\xc1\xa1\xa9\x01\x61\xec\xe8\x1e\x27\xf7\xfd\xa6\xec\x43\x1a\x2f\x0d\x42\x6b\xae\xff\x3d\xc9\xd2\x43\x7c\x25\xe4\xfb\xb1\x4a\x76\x3e\xec\xd3\xb1\xcc\xc3\x99\x63\x97\xae\xd1\x87\x1c\xa3\x00\x51\x0c\xd5\x50\x67\xeb\xd1\x1b\x16\x87\x42\xf2\x29\x0b\x9d\x11\xbc\x98\xfb\x35\xf1\x90\xf7\x32\xeb\x11\x15\x6f\x61\xed\x95\xf8\x5e\x8f\x66\x8e\x26\x77\x8f\x6a\x99\xe1\x90\x9c\xdf\x92\xa1\xa1\x9e\x41\x4b\x5e\x4c\xe7\x3e\xc7\x73\x45\xe9\xef\x2d\x70\x60\xa5\x2c\xf3\x21\x01\xa4\x81\x0c\x6e\xaa\x56\x91\x48\x8a\xc0\x2a\x65\xab\xe0\x6f\xdc\x2b\x61\x99\xd7\x70\x0f\xdd\xc4\x0d\x79\x24\x51\x86\xf8\x7f\x90\x30\x75\x51\x56\x25\xce\x52\xba\x94\x53\x25\x3e\xcb\xaa\xd4\x64\x19\x54\xf6\x31\x2c\x3a\x36\x75\x7e\xf0\x3e\xaa\xb1\x4c\x92\x98\xca\x4d\x51\x0f\xa8\x46\xae\x9e\xd4\xb0\xee\x89\xce\xc8\xfc\xbe\xd1\x75\x12\xa4\x7c\x71\x2b\x28\x3c\xd6\xa3\xad\xe7\x22\x55\xe9\x2b\x05\x6b\x52\xc2\xbb\x88\x29\x8c\xa6\xc6\x4c\x03\x88\x5d\x98\x55\xb5\x1f\x4c\x9e\x96\xaf\x32\x15\x02\x39\x8c\xa6\xe6\x8c\x5d\x60\x39\x58\x93\x27\x28\x95\x4a\x4c\xf4\xad\x56\x1d\x0c\x9e\x3f\xe5\x00\x41\xee\x20\xa9\x4a\x56\x96\x3e\xb5\xbc\x09\x89\x5f\xf6\x25\x0d\xb1\x7c\x25\xd5\xda\xa1\x4e\xc6\x97\x34\x93\x6c\x13\xab\x35\x74\xec\xf4\xf8\x86\xa6\x12\xbf\x61\xd5\xb6\xa4\xf9\x6c\xcb\xdb\x92\x39\x7e\x5f\xd4\xd4\xc1\x91\x92\xf8\x83\x5f\xd4\x50\x9a\x8c\xb7\x62\x5b\x89\xab\xf8\x45\xcd\x09\x29\x7e\x2b\xb6\x97\xfa\x90\x5f\xd4\x60\x9a\x39\xb8\x62\x7b\x47\xab\x48\x26\x1f\x71\x79\x23\xcc\xd1\xac\xc5\xf9\x6d\x14\xf7\xf2\x6a\x25\x07\x89\x4a\xde\x5d\x20\x10\xd2\x53\x6f\xf1\xde\x3e\x94\xba\x7b\x33\xc4\x2a\xcd\xce\x52\xef\x6f\x86\x54\x25\x1b\xb9\xc7\x1f\x9c\xed\xa4\x17\xec\x8e\xa4\x54\xea\x15\xce\x10\xce\xfa\x9c\x8f\xe4\x35\xeb\x2b\xce\x32\x4c\x1d\xcf\xc7\x11\xcc\x1c\xdc\xf0\xbe\xdc\xb2\x2c\x35\xb4\xf8\x2f\x94\x51\xa0\xe7\x67\xaa\x57\x96\x65\xa1\x73\xfa\xb3\x8f\xf8\x69\x47\x7c\x1b\xf2\xb7\xa1\x7e\xfc\xd0\x8a\x7e\xdb\x84\x25\x3f\x61\xc9\x2d\x63\xc9\xe5\x8d\xba\x32\x96\x7c\xfe\xd6\xd7\x97\xae\x73\xa4\xe2\x1e\xe9\xcc\x4e\xb8\xf6\x12\xae\x83\x32\xae\x03\xce\x57\xa0\x4b\xbc\xee\x62\x49\x8f\x97\xf4\x5e\x20\xd4\x23\xfd\xe5\x49\x0f\xb6\x49\x0f\xa2\xb2\x1e\x44\x9c\xaf\xe8\x50\x0f\xb6\xbc\xe4\x96\x8e\x41\xe2\xbe\xdd\x7f\x4e\x4d\x55\x9c\x9f\x58\x1d\x6b\xa7\x7f\x3a\x74\x62\x95\x7d\xfb\x2a\x3f\xb1\x1e\xf8\x6c\x06\x6c\x7a\x6a\x75\x8a\xa7\xd6\xb8\xd4\x0d\x27\xa4\x6b\xd2\x45\x47\x24\x39\xf5\x65\x5c\x52\x27\x27\x62\x09\x66\x11\xf3\xc5\xd8\xe3\x4c\x59\xee\x5c\xca\x95\xe5\x8f\x49\xf6\x81\x90\x79\xf7\x73\x41\x77\xe4\xdd\x25\x74\xb7\x2c\xfb\x36\x7d\x45\x3f\xf3\xa4\x2e\x07\x12\x37\xd3\x57\xf0\xef\xda\xc5\x3a\x84\x2c\xb3\x80\x78\xab\x48\xf9\x29\x70\x31\x49\x58\x23\xa5\xb6\x61\xb0\x0e\xed\x4d\x6d\x15\x84\xb5\xc9\xcf\x6f\x15\xe0\x9a\x5d\xbf\xff\xc4\x08\x2d\xa1\xbb\xad\xd9\x9c\x10\x0d\xe5\xa2\xd8\x2b\x59\x9a\xb2\x72\x42\x01\x25\x06\x4b\xcf\xfe\xfa\xb5\x3f\x8c\x49\x3f\x38\x30\x43\x59\x5f\x92\xf5\x94\xb1\x21\x01\xec\xc8\x32\x30\xcc\x04\xaf\x65\xfb\x90\xa2\x2d\x97\x71\x9f\x2d\x21\xe5\x1b\x52\xc6\xdf\x41\x64\x3b\x2c\x07\xb3\x8c\xf1\xc4\x0b\xc1\xda\xe6\xe5\x73\x0d\x72\x20\x92\x0d\x7b\x4d\xa4\x8f\x87\x84\x5d\x84\x92\x46\x78\x7d\xa7\xf0\x08\x8a\xdc\x20\x25\x54\x08\xfb\xd4\xf5\x99\x69\x2e\x5b\x40\xd6\xbf\xb5\xfe\x99\x76\x90\xd9\x81\xb2\xfe\x71\x1f\x1a\x6b\xf9\xe7\xdd\x02\x86\x3e\x44\x30\xe2\x15\xb3\x2d\xdf\x40\xfd\xf7\xf2\x81\x11\x6a\xb3\x25\xa0\xb4\x07\x65\x45\x65\x7d\xc1\x8d\x92\xce\x0c\xa3\x9b\x8d\xbd\xa6\x99\x9f\xa1\xa4\x33\xfc\x36\x1e\x63\x67\x38\xae\x91\xf2\x25\x63\x85\x87\x27\x2d\x92\xe9\x08\x7f\x5c\xae\x61\xd9\x12\x32\xae\x99\x82\xd1\x8f\x4c\x19\xf1\xa7\xb1\x0c\xa4\x84\x54\x37\x48\x74\xdd\xa5\x1d\x09\x21\x5b\x5b\xdd\xa7\x61\x74\xe4\x71\xb9\x5a\x69\x42\xbb\xf4\x53\x56\x36\xd6\xb7\xf0\xa5\x8b\xe5\x48\xb9\xb2\x91\x3d\xf4\x9c\x6c\x8c\x58\xfe\xab\x96\x1b\xb1\x60\x58\x56\xb8\x84\x24\xa5\xc9\x23\x68\x72\x1c\xf8\xbb\x0d\x7e\x1a\xfd\x60\x9c\xe7\x42\x5f\xc4\xb7\xa7\x2c\x0c\xa6\x4f\x83\x34\x6a\xab\x92\x00\xb3\x52\x6a\x46\xb6\x3e\x2f\x57\x12\xfa\x9c\xad\xcc\x7c\x1a\x7d\x23\x2e\x8b\x13\x4a\x1c\x2a\xd5\x3e\x23\xc6\x87\x43\x41\x48\x7c\xec\xe5\xf0\xdd\xe8\xf6\x7a\x92\x8b\x06\x91\xc6\x00\xfd\x69\x3c\x10\xf0\xf5\x1c\x07\xb2\xc8\x6f\x71\x7d\x4d\x83\x4e\x90\x66\xfd\xa0\x42\x7d\xbb\x8b\xee\x55\xc4\xb6\x4a\x90\x46\x74\x97\x05\x53\x43\xed\xa9\xf4\x0b\xea\xfe\xd8\xeb\x4c\x2f\x61\xa6\x85\x5c\x32\x7f\x3c\xee\x87\x1a\x11\x4b\x93\x46\xf2\xf9\xf6\x73\xb1\xc5\x99\xf6\x78\x98\xf7\x53\x26\x1c\x30\x51\xa8\xbc\x80\xa6\x88\x47\x77\xd3\x49\x8d\x65\xc4\x02\x4a\xf6\x7c\x4f\xce\x34\x95\x67\x11\x6a\x71\x31\xd4\xab\x10\xc6\x5e\x94\x0b\xed\x05\x09\x6e\xf9\xa6\x2f\xe4\xe5\x6c\x63\xda\x2e\xa0\x96\x89\xa6\xc2\x65\x61\x90\x78\xab\x2a\xe8\x91\x8c\x40\x08\x51\xe8\xc2\x07\x28\xa6\xd0\x2d\xf4\x1c\xd0\x55\x60\x04\xf5\x55\xfa\x7d\xe9\xf6\x62\x10\x93\x50\x37\x49\x93\x00\xed\x51\x07\x35\xd3\x71\xa1\x9d\x4c\x87\x8b\x8d\x81\x04\x25\x03\xb1\xcb\x2b\x78\xea\xa4\x49\xa4\x8e\xca\x06\xf5\x2b\xd4\xdf\x18\x3c\x1d\xd4\x4a\x1f\xbf\xfe\xcc\xff\xb8\x85\xfa\xd5\x17\xfe\xc7\x40\xff\xbc\x13\x33\x45\x39\x6e\x68\xad\x74\xef\x6d\x3d\xc9\x14\xf5\xe0\xc2\x3f\x48\x56\xfb\x1c\x20\x9b\xbb\x52\x09\x26\xdb\x4a\x7f\xbb\x52\x2f\xa1\x3e\x00\x2d\x02\xff\xc5\x3e\xdf\x9f\xad\x74\xf7\xed\x3b\x15\x5a\x2b\xfd\xf2\xee\x47\x55\xd3\x4e\x4e\x54\x94\x0b\xa5\xb5\x20\x0d\xc1\xd5\xe2\xb8\x90\x67\x8a\xc3\x7d\xc4\xa0\xde\xae\xf7\x1a\x99\xc6\xb1\x92\x29\xbb\x08\xaf\x9e\xa1\xbb\x44\xca\x59\xa8\x3b\x2a\x02\x4f\x8b\x7e\x11\x15\x6d\x15\xc7\x14\x32\xc4\xb5\x42\xb5\xd1\x6d\x75\x1b\x1a\xf0\x29\x48\x48\xa7\xab\x81\xc0\x0a\xd5\x66\xa7\xd3\xe8\x68\xc0\xc3\x3f\x9b\xcd\x76\x5b\x03\xb6\x15\xaa\xa6\xd1\x6e\xf4\x34\x10\xe1\x6a\x46\xb7\x51\xd7\xc0\xd2\x0a\xd5\x6e\xa7\x65\xf6\x28\x6e\xc8\x36\x0b\x1b\x92\x85\x0a\x61\x13\xc7\x67\xa1\xa3\x24\xd8\xcb\xd6\x1f\xb6\xcc\x12\xf8\x04\xd4\xe6\xda\xa3\xd7\x7d\x61\xf6\xef\xd8\x5f\x5f\xac\x10\x0c\x3f\xb8\xf0\x8f\x1c\x82\x05\xa6\x47\x03\x5e\x73\x86\x22\x7d\x71\x96\x6c\x0f\xb0\xce\x59\x50\x27\xe0\x7d\x70\xab\xbb\x0e\x80\x7a\x1a\xfb\x3a\x80\x5f\xd0\xc8\xf6\xa1\x67\xa9\x5a\x26\xda\x97\x97\x4f\x33\xdc\x2e\x6d\xff\x5d\xf0\xc0\xea\x9c\x1f\x2c\xa1\x6a\x7d\x59\x19\x02\xff\x73\x06\x89\x0e\x6c\x93\x8f\xbf\x32\x8e\xd4\x0c\xd3\x88\xa8\x67\x91\x1e\x0d\x51\xa7\x60\x90\x51\x12\x04\xbd\xd4\xbf\x68\xdc\x4c\x16\xa2\x93\x2d\xcb\xca\x3d\x43\x9a\x1c\x04\xc0\x8d\xae\x18\x56\xb3\xa5\xdc\x0c\x92\x00\x79\x88\x27\x24\x3e\xab\x5e\x72\xb0\x1b\x9e\xef\xcc\x2a\x8e\x2b\x89\x38\x3c\x83\x67\xe2\xd7\x93\xcf\x78\x26\x8d\x59\xf2\x35\x55\x71\xdc\x07\x82\xf3\x63\x2f\x97\x41\xe8\xb8\x81\x7f\xea\xfa\x3e\x0c\x39\x20\x8e\x42\x22\xf2\x90\xf6\x04\x2d\x74\xb6\x08\xa1\xfd\x29\xa6\x68\x0e\x21\xf4\xd1\x20\x70\x60\x62\x1c\x08\xdc\xc9\x15\x8c\x50\x98\x46\xa2\x73\xe5\xd3\xe1\xc6\x45\xea\x2b\xe3\x05\xb6\xc4\x26\x46\xc2\x26\xe6\x23\x97\x4f\xce\x3e\x90\x4f\x0e\xc1\xed\x69\xea\x6a\x54\x66\xb3\x83\x96\xc4\xc6\x96\x24\xd2\x17\xf3\xc7\x9c\x29\xb1\x99\x29\xb1\x45\x53\x92\x6a\xbc\x68\x46\x08\xe4\x52\xd4\x7f\xe2\xfa\xdf\x57\xf8\x2f\x25\x06\xc1\x0e\xd1\xb7\x5c\x32\x7d\x85\xff\x52\x62\x96\xd8\x8e\xe5\xb5\x33\x79\x5e\xbb\xe9\x54\x61\xaa\xf7\x9a\x67\x77\xf0\x49\xda\x87\xd9\x7e\xa4\x4a\x9b\x23\x55\xf2\xa4\x10\x86\x06\x6c\x8a\xb8\xc8\x28\xe0\xbf\x45\xd4\x44\x5b\xdf\xdd\x7c\x52\x29\xec\x76\x0a\x14\x8e\x04\x55\xcc\x81\x15\x52\x51\x45\xfa\xaf\x2d\x4f\x40\xfe\x13\x90\x92\xa8\xda\x39\xd6\x54\x89\xc8\xee\x33\x01\x60\x3d\xe3\x1c\xd7\x26\x94\xe7\x18\x0b\x7a\xb7\xcf\xa0\x51\xab\x4b\xe7\x86\xff\x3b\x19\x6b\x8e\x79\xb4\x0c\x36\xdb\xc0\x87\x3e\x7a\x63\xe3\xc7\x8f\x77\x30\x0a\xbc\x07\x18\x72\x24\x24\x0a\x59\x79\x05\x11\xad\x15\x4a\xec\x1b\xa3\xeb\x22\x97\xa4\x5c\xe1\x38\x3b\xd9\x9a\xba\x43\x7e\xb0\x19\xaf\x6a\xb1\x58\x01\x6b\xd1\x2b\x76\xaa\xb1\xbf\x7e\xd5\x98\x2a\x13\x97\x55\x0e\x96\x66\x10\xd4\x48\x19\x02\x18\xb4\x76\x1f\xa0\x5f\x43\x41\x6d\x9c\x2e\x4d\x97\xbc\x43\x74\xfe\x51\xb2\x89\x1f\xe6\x00\xe9\xa4\xdc\x71\xe4\xb9\x9a\x3e\x3f\x1b\x22\x10\x07\x7e\xc4\x21\x85\xf6\xb7\x8b\x4b\x93\xa3\x72\xd5\x76\x53\x6f\x30\xdf\x69\x26\x1a\x22\x6d\x8a\x20\x32\x65\x18\xfb\x4e\xe9\xe3\x63\x70\x48\x9b\xf4\x83\x5a\x86\x48\x0d\x52\x33\x58\x73\xe0\xca\xf5\xa1\x53\x63\x6e\x26\x62\x19\x18\x00\x5d\x8d\xcf\xa1\xda\x8f\x93\x77\xb7\x4a\x3e\xe1\x78\x89\x62\xe9\x21\xfd\x71\x99\x7b\xaf\x0a\xe3\x0f\x90\xa4\x5f\x2c\x20\x3c\xa9\x97\x00\x56\x24\x83\xa6\x67\xee\x07\x67\x7a\x8b\xa7\x22\x0b\x97\xff\x06\x4b\xfa\x35\x6a\xe0\x89\x4f\xff\x98\x7f\x70\xd2\x3f\xa2\xd7\xc3\x97\xd8\xd8\x04\xf5\xb9\xa2\x81\x75\x40\x0b\xd8\x7a\x34\x5f\x1c\x36\xb1\x19\xd9\xc9\xac\x6c\x22\xb6\xbe\x92\xfc\x54\x80\xc4\xf6\x32\xa7\x86\x42\xfe\xc9\xdb\x5a\x43\xb0\xb5\x59\x43\x05\x94\x43\x76\xd6\x26\x90\xb4\x06\x98\x00\x03\x18\x40\xf1\xd7\xa7\xbc\xb4\x42\x5d\xbe\x06\xb0\xf5\x8f\xe6\x10\x0b\xd6\x5f\xda\xdb\x68\xe7\xd1\x48\xc8\x7a\x06\x4f\x6e\x9e\xc2\xc6\xad\xad\x50\x6d\xb5\x8c\x5e\x43\x03\x17\x56\xa8\x76\x0c\xb3\x69\x68\xe0\x1e\x6f\x03\xdb\x9d\x9e\x06\x36\xb8\x68\xdb\xe8\x74\xe8\x2e\xf0\xba\xc2\x2e\x70\x4b\xb6\x59\x87\x77\x79\x69\xe1\xdc\x3e\xe1\xaf\xd3\x30\xf0\xa0\x45\x84\x1c\xf8\xca\xec\xaf\x9a\x1e\xc2\x4d\xf0\x00\x93\x3c\x51\xaa\x90\xae\xc1\x83\xce\xe2\x51\xf9\xf7\xad\xf6\xf8\x4c\x60\x67\xce\x04\x19\x4d\x54\x80\xc2\x98\x09\x5d\xfb\x96\x31\xf0\xfa\x91\x0e\x1e\x97\x32\x58\xe5\xe4\x74\x2c\x73\x29\x3b\x9b\xc0\xb1\x6c\x3d\xb8\x78\xcd\xd9\x21\x51\xb6\xf4\x9d\xeb\xff\x6e\xd9\xfa\xf2\xa7\xb1\xfa\xc4\xef\x31\x45\xfd\xe9\x5a\xbf\x9b\x01\x97\x5c\xa1\xc7\x1c\xfb\xfa\x27\xe0\xea\xf0\x2b\xf0\xf4\x4d\xca\xe1\x99\xad\xbf\x6e\xdf\xa9\x81\xfe\x19\x4c\xef\xf5\xf9\x2f\xe0\x5e\xff\xe9\x16\xdc\xeb\xd1\x1a\xb8\xfa\xb0\x05\x22\x02\xf0\x1b\x11\x80\xdf\x88\xa0\xf8\x46\x04\xf8\x37\x22\x58\xbe\x1b\xfd\x77\x10\x11\x2c\xdf\x88\x60\xf6\xde\xeb\x6f\xf0\x83\x2f\x77\x23\x4c\xe7\x27\x70\xaf\xef\x40\x44\xf0\x7d\x23\x82\xef\x1b\x11\x7c\xdf\x0b\xfd\xc3\x0c\x4c\x67\xd8\x06\xe0\xb6\xe7\xfa\x40\x6c\x3b\xd2\x47\xdb\x05\x88\xf4\xe5\xb2\xce\xf9\x88\xd6\x20\xd2\x27\xee\x3d\x5d\xf5\xc1\x35\xb8\xd7\xbf\x18\x20\xd2\xdf\xff\x84\xd9\x19\x78\x3f\x03\xdc\xcc\xe0\xeb\x5f\x40\xa4\x5f\x2d\x3e\x80\x48\x0f\xdb\x8f\x60\x4b\x1a\x89\xe3\x99\x76\xf6\x7f\x02\x00\x00\xff\xff\x3e\x4e\x40\xdc\xe6\xe7\x01\x00") - -func bindataTkgWebDistTkgkickstartui742es2015Fed85f8921ac5074e243JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui742es2015Fed85f8921ac5074e243Js, - "tkg/web/dist/tkg-kickstart-ui/742-es2015.fed85f8921ac5074e243.js", - ) -} - -func bindataTkgWebDistTkgkickstartui742es2015Fed85f8921ac5074e243Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui742es2015Fed85f8921ac5074e243JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/742-es2015.fed85f8921ac5074e243.js", - size: 124902, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui742es5Fed85f8921ac5074e243Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x09\x57\xe4\xb6\x96\x38\xfe\x55\x8c\xe7\x0d\x63\x27\xc2\xed\x7d\x29\x9e\xa7\x87\x00\xdd\xcd\x0b\x0d\x84\xa5\xb3\x10\x86\x23\xdb\x32\xe5\x87\xcb\xae\xb6\x55\x2c\xa1\xea\xbb\xff\x8f\x16\xaf\xe5\x2a\xaa\x3b\x2f\x99\xcc\xff\x37\xe7\xcd\xa4\x29\x59\xcb\xd5\xd5\xdd\x25\x5d\x6d\xc5\xb3\x2c\xc4\x49\x9e\x49\xf2\xcb\x03\x2c\x04\x04\x30\x28\x40\x06\x12\x90\x03\x08\x52\x10\x82\x12\xcc\xc0\x14\x44\xe0\x12\xc4\xe0\x16\xdc\x81\x31\x98\x80\x3d\x70\x08\x4e\xc0\x03\xb8\x00\xa7\xe0\x08\x9c\x83\x33\xb0\x0f\x9e\xc1\x2f\x20\x00\xc7\xe0\x00\x5c\x81\x27\xf0\x19\x3c\x82\x7b\xf0\x11\xbc\x03\xef\xc1\xcf\xe0\x13\xf8\x00\x7e\x04\x3f\x80\xdf\xc0\x77\xe0\x1f\xbb\xd5\x90\xc2\x3f\x25\x04\x30\x1b\xb7\xf0\xc5\x59\x16\xa1\x38\xc9\x50\x24\x6e\xf9\xf8\x79\x8a\xf2\x58\xb8\x78\x9e\x04\x79\xba\xbd\x8d\xae\xd9\x5f\x4a\x82\x51\x01\x71\x5e\xdc\xcc\xe7\xe8\x5a\xfc\xaf\xff\xaa\x7e\x8b\x37\xbb\x49\x2c\x6d\x15\xf2\x4b\x12\x4b\x7b\x45\x01\x9f\x95\xa4\xa4\xff\x4a\x48\x9e\xcf\xa5\xc2\x47\x48\x42\xb2\x3c\x9f\xe3\xed\x6d\xb4\xbd\x2d\x66\xb3\x49\x80\x0a\xd1\xaf\x46\x42\x4a\x8a\xb2\x3b\x3c\x96\x5f\x8a\xed\x6d\x09\xf9\x85\xbc\x4b\xc0\xca\x7c\x15\x24\x7e\x0b\x47\x8b\xdd\x02\xe1\x59\x91\xbd\x94\xa3\x04\x64\xa3\xd6\x17\x56\x2e\x64\xff\xe9\x57\x7d\xbd\x7d\x89\xf2\x0c\x8d\xb6\xd4\xc5\x88\xff\xa5\x81\x07\x98\xce\xd0\x08\x5d\x67\xdf\x7e\x7b\xb3\x58\x00\xd4\xf4\x80\xe4\x17\x3c\x2e\xf2\x47\x01\x2d\x40\x3c\x4a\x16\x0b\xf6\x2b\x43\x8f\xc2\xe5\xf3\x14\x1d\x16\x45\x5e\x48\xe2\x51\xf6\x00\xd3\x24\x12\x20\xc6\x68\x32\xc5\x02\xce\x05\x86\x03\x24\x64\x79\xb6\x43\xff\x0e\x52\x24\x24\x59\x89\x61\x16\x22\xe5\xd7\xec\x28\x13\xf2\x22\x42\x05\xa9\x1b\x20\xa1\xaa\x02\x68\x03\x48\x70\x24\xe4\xc1\x3f\x51\x88\x4b\x61\x32\x2b\xb1\x30\x86\x0f\x48\x80\xc2\x12\xca\x25\x59\x98\x20\x3c\xce\x23\x45\x94\x17\x04\x39\x39\x80\xfe\x96\x0a\x52\x7f\x4b\x6b\xb0\xd2\xc6\x88\x5f\x28\x21\x4c\x53\x09\xc9\x8b\x2e\xae\x28\xa5\xf9\x85\x92\xa1\x27\x2c\xc9\xbc\xb1\x00\x7d\xa4\x10\x3c\x01\xd4\x47\x4c\x4a\xc6\xc9\x7d\x8a\x99\x56\x37\xb8\x78\x7e\x81\xf3\x79\x36\x4b\x53\xdf\x2f\x14\xd6\xcd\x7c\x5e\xfd\x25\xc9\x8b\x38\xc9\x60\x9a\x3e\x13\xaa\x48\x65\x86\xd0\x7c\xb1\x58\x2c\x6a\x12\xfc\x5e\x92\x5f\xc4\x59\x89\x84\x12\x17\x49\x88\xc5\xdd\x37\xdf\x6c\x09\x05\xba\x43\x19\x9b\xf5\x4e\x31\xcb\x70\x32\x41\xc2\xce\x8e\xb0\x9f\x4f\x9f\x8b\xe4\x6e\x8c\x05\x29\x94\x05\x5d\xd5\xcc\x9d\x69\x81\x4a\x94\x61\x20\xbc\x83\x21\x0a\xf2\xfc\x1e\x08\x47\x59\xa8\x90\xda\x69\x12\xa2\xac\x44\x82\xf4\xf1\xe8\x52\x1e\x09\x63\x8c\xa7\xe5\xe8\xcd\x9b\xbb\x04\x8f\x67\x81\x12\xe6\x93\x37\x31\x6f\xf3\xa6\x35\xde\x9b\x20\xcd\x83\x37\x13\x98\x64\x6f\x8e\x8f\xf6\x0f\x4f\x2e\x0e\x85\x6f\xde\x7c\xef\x2f\xd3\x19\x5a\xec\x32\x2c\xbe\x2c\x00\xf6\x4f\xe9\x02\x2a\xd3\x22\xc7\x39\xa1\x68\x50\xf8\x58\x19\xc3\xf2\xf4\x31\x3b\x2b\xf2\x29\x2a\xf0\x33\xc8\xaa\x5a\x8c\xcd\xaa\xf2\xf9\xbc\xc1\x34\x61\x7e\xf9\x05\x5d\xe3\x1b\xbf\x50\x28\xa9\x2e\x40\xe2\x8b\x55\x85\x86\x5d\x18\x6d\xbc\x65\xff\x8c\x5e\x16\x20\xf7\x93\x9a\x52\xe6\xf3\x36\x67\x02\xe8\x27\x0a\x2c\x9f\xb3\xf0\xa8\xfd\xbd\x53\x22\x82\xd4\x4f\x14\x9c\x5f\xe0\x22\xc9\xee\x2e\xe1\x1d\xad\xd2\xfa\x2d\x36\x42\x23\xac\xc0\xe4\x88\x18\x9c\x14\xad\xf3\xc2\x98\xad\x00\x28\x9b\x4d\x18\xd1\x8f\xb6\x54\x10\xe6\x59\x9c\xdc\xcd\xea\xdf\x8f\x45\x82\xf9\xdf\x0b\x19\x90\xc9\x2f\x08\x61\x85\xd2\xcb\x02\x88\xa2\xbc\x08\x21\x0e\xc7\xd2\xbe\xfc\x12\xfa\x7d\x4c\x55\x6b\x41\x11\xd6\xa2\xaa\x92\x55\x00\x09\x23\xf5\xdc\xc7\xdb\xdb\xad\xd5\xa9\xb9\x33\x8f\x85\xe8\x2d\x1e\x45\x00\x56\x6b\x13\x16\x08\x62\x24\xe5\x4d\x65\x19\xa4\x3e\x11\x02\x47\x52\x32\x9f\x5f\xdf\xd4\xdc\x92\x49\x10\x88\xb7\x49\xf6\x90\xdf\x23\xb1\x9a\xeb\x89\x84\x40\x01\x52\x79\x21\x03\xd8\x80\x33\xab\xe0\x25\xf3\xe2\x9c\x4a\xba\x1e\x89\x59\x5e\x4c\x60\x2a\x02\x58\xdc\x8d\x10\x63\x56\x52\x71\xd1\x4c\xba\x53\x9d\x72\x10\xab\xbd\xbf\x58\x2c\x90\xf2\x58\xc0\xa9\x5f\x52\x4a\x9c\xfa\x2f\x8b\x66\x95\x22\x22\x2b\xeb\x5f\x97\x9d\x5f\x31\xf9\x45\x9a\xdc\x92\x26\xa1\x74\x0b\x72\xb0\x4c\xe0\x78\x9c\x94\x0b\x26\x85\xef\x2a\xec\xdc\x21\x7c\x56\xe1\xe5\x34\x06\x63\xff\x6e\x7b\xfb\x4e\xba\x93\xce\xa5\xeb\x1b\x59\x96\x77\xc7\xdb\xdb\xe3\x2d\x9f\x60\x9b\x4b\x9e\x31\xc8\xe5\xed\x6d\xe9\xd6\x1f\xb3\x9e\x26\x7e\xdc\x60\xd6\x8f\x5a\x7f\x77\xf1\x7f\x2b\x37\x53\xd9\x23\x12\xe8\x5a\x24\xb2\x4a\x04\x15\x0a\x44\x06\xa5\x78\xa3\xc4\x79\x71\x08\xc3\xb1\x54\xcf\x00\xcb\x2f\x8c\x46\xdb\x12\xac\x35\x29\x85\x2f\x9a\x84\x01\x92\x17\xe4\x7f\xf5\x50\x87\x4c\x21\xd6\xbf\x13\x29\x63\x7a\x98\xd1\x51\xe8\xcf\x24\x74\x9d\xdd\x00\x04\x72\x99\x28\x3c\x0e\xcd\x96\xef\x87\x0a\xa5\x15\x5a\xad\xf4\x43\x05\x16\x77\x60\xea\x97\x8c\x89\x2b\x92\x99\x6e\x6f\x8b\x4c\xd4\x37\x9c\x3c\xad\x71\x35\x05\xe2\xed\x2d\x7c\x84\x09\x16\xe5\xb7\x58\x29\x50\x99\xa7\x0f\x48\x9a\x2a\xbc\x54\x56\xf0\x18\x65\x52\x7b\x56\x89\xc4\xd1\x82\x28\x90\x0b\xd0\xfb\xc8\x91\xc5\xbf\xca\xa3\x56\xaf\x03\xbd\x71\x68\x7d\x04\xa0\x54\xf6\x3a\xe3\x33\x58\xee\x73\x91\x4a\x74\xb6\x5c\x25\xed\x66\x12\xc1\xf1\x32\x67\xb4\x58\xb7\x68\x61\xb8\xad\xb9\xd1\xa3\x80\x5b\xcb\x08\x32\x32\x07\xc2\x4f\xe4\xcf\x85\xbc\xe0\xf5\x72\x3f\x7f\x9b\x33\xe8\x33\x90\xc9\x23\xa2\x67\xda\x8b\x78\x52\x71\x1b\x33\x20\xc4\x72\x56\x4e\x51\x16\xa1\xe8\x02\xc3\x02\x8b\xd5\x62\xd4\x03\x25\x20\xa7\x66\x8b\x88\x9e\x50\x38\xc3\x49\x76\x27\xfa\xbe\x9f\xc9\x8d\xfe\xe7\xba\xff\x7d\xa5\x24\x84\xa4\x14\x60\x5a\x20\x18\x3d\x0b\xc5\x2c\xcb\x48\x13\x46\x0f\x61\x3e\x99\xa6\x08\xa3\x88\x75\xf1\xd2\xd0\x88\xef\xfb\x49\xa5\x01\x2b\x10\xce\x88\x86\xcc\x0b\xa9\x50\x98\x62\xf7\x13\x50\x10\x5c\xfa\xf9\xee\x2e\x03\x1f\xfa\x85\x12\xa1\x14\xdd\x41\x8c\xc8\x00\x90\x15\xa7\xfe\x83\x04\x41\x41\xc7\x4c\xe9\x28\xa9\xef\xfb\x53\x39\xcc\x33\x9c\x64\x0d\xc1\xa5\x8b\x05\x81\x80\xd2\x88\x4f\x54\x34\x1b\x47\x2e\x14\xa2\x35\xfd\x42\xb9\xe5\xff\xc2\xe2\x6e\x17\xa5\x25\x12\x3a\x00\xd7\xf5\xe9\x3c\x7a\x78\x6c\xe3\xc8\x6f\x4d\x9c\x4d\x61\xb7\x50\xa2\xa4\x9c\x12\x29\x76\xf8\x14\xa2\x29\xc5\x74\xc1\x08\x85\x0c\x54\xf1\x6f\x6b\x14\xc2\x08\x30\x28\x66\x53\x2c\x55\x5f\x59\x5f\xf2\x6e\xe6\xb7\x16\x67\xb7\x66\x45\xba\xcc\x14\xef\x5c\x8e\xfa\x0d\x23\x26\xb1\x94\x11\xe4\xe5\x19\x7a\xdb\x82\x6e\xd4\x4c\xe3\xe7\x04\xa5\x91\x08\x28\xf5\x0e\x61\x8f\x13\x2e\xe3\x65\x6a\x3f\xb2\xee\x16\x8b\x06\x43\x6c\xb4\xed\x6d\xa9\x8f\x02\xbe\xa0\x15\xb7\xb0\x65\xe5\x8c\xd2\x52\x54\x0f\x6d\x0b\x1c\xf3\x56\x20\xf3\x51\xad\xcc\xaf\x0b\x6a\x5a\x3f\xe4\x49\x24\xa8\x14\xe7\x95\x28\xab\x09\xc3\x27\x06\x18\x68\x2d\xdb\xf6\x76\xd3\x9e\xdb\x62\xdb\xdb\x12\xae\x81\xaa\xb0\x8b\x29\x54\xac\x6b\xc0\x40\x69\x75\x53\xd5\x97\xe7\xf3\xaa\xc5\x16\xed\xbc\xd5\x13\x9f\x1e\xeb\xa8\x67\x2a\x5f\x8e\xb9\xb1\x4b\x38\x26\xca\x51\x29\x64\x39\x16\xa6\x45\xfe\x90\x44\xc4\xc0\xfd\x0f\xf1\xdb\xe2\x5b\xf1\x3f\xb8\x51\x2b\xca\x32\x98\xd2\xa5\x4d\xfc\x99\x94\x81\x66\x06\xac\xf7\xb6\xbc\x25\xbc\xc4\x96\xb9\xc6\xc5\x20\x40\x09\x5d\xba\x3e\xa2\xd8\x28\x39\xfb\x5a\x71\x0a\x11\x29\x94\x56\x24\x7c\x8d\x88\x94\x9c\xa5\xf8\x04\x4e\xd0\x8d\x9f\x33\xa9\x08\x30\xb5\x96\x7d\x44\xff\x39\xce\x43\xd0\x42\x0a\xae\x49\xb8\x85\x1b\x26\x99\xdb\x38\x96\x97\x61\x91\x47\xf9\x68\x43\x7c\xd6\xb8\x64\xd0\x11\x21\x44\x10\x0a\x33\xee\x3e\x88\x43\xdd\x37\xa4\x76\x21\x71\xf5\x84\x7d\x62\x87\x1c\xe7\xe1\x08\x5d\xab\x37\x8b\x5d\x4d\x48\x32\x01\x51\xd0\xa9\xd5\x71\x9c\x87\x3e\xba\xd6\x6e\x64\xa0\x37\x5f\xb8\x21\xcf\xbe\xe9\x37\x04\xc2\x18\xa3\x82\xfd\x36\x6e\x64\x40\x35\x2b\x2e\x9e\x0f\x33\x5c\x24\xa8\x54\xa6\xb3\x72\x2c\xe1\xd6\xf8\xa7\xcd\xf8\x48\xe1\xbc\x92\xe4\xd9\x7c\xfe\xb2\xd8\xc5\x74\x35\xfd\xda\x1c\x22\xb3\xc0\x48\xa0\x68\x00\xed\xda\x3e\x6e\x3a\x3c\x62\x2e\x5b\x67\x58\xff\xba\x9a\x9b\x58\xe4\x39\x16\x17\x37\x00\xd5\x16\xc2\x05\x05\x92\x83\x4a\x1c\x07\x2c\x6d\xa9\x2d\x08\xcf\x25\x26\x37\x1a\x38\xaf\x73\xca\x7c\xb8\xa1\x33\xee\x4f\x51\x62\x5c\x36\xcb\x19\x71\x54\xb5\xa9\xc4\xde\x4a\xca\x13\x78\x22\xd5\xfe\x6d\xa5\x96\x76\xb4\x96\x63\x2b\x60\x49\x7e\x21\x9a\x60\xf7\xdb\x6f\xb3\xbf\x57\x75\x77\xe5\x24\x96\x2a\x17\x0e\x64\x72\x03\x05\xd7\xd3\xc4\x14\xc1\x94\x6c\xfd\x2d\x0d\xe0\xdd\xde\x77\xce\xd8\x55\x0d\x15\xe0\xca\x7b\x16\x12\x46\xcc\xc9\x82\x2b\xd5\x17\xf2\x73\x74\xd6\x92\x4c\x67\xb5\x62\xe6\x72\x90\xf7\x56\xb9\xd4\x95\x36\xbe\x6c\xd9\x70\x31\xc8\xa4\x09\x10\xc3\x3c\x2b\x71\x31\x0b\xa9\x63\x51\xa9\xff\xbe\xd9\xbf\x90\x41\x26\xc5\xc3\x95\x2f\x07\x2a\x5f\x52\x7d\x92\xc2\x67\xc2\x95\x7e\x28\xc5\x20\x05\x8d\x46\x7e\x57\x2d\x85\x4c\x04\x47\xb9\x54\xee\xb7\x6d\x19\xb6\xb8\x43\xcb\x47\x04\x67\x0b\x20\x8e\xad\xad\x2d\x4c\x78\xc0\xf7\xfd\xcb\xf9\x7c\x60\x4c\xdf\xf7\x25\xdc\x06\x6f\x3e\xc7\x4a\x06\x27\x48\x96\x17\x00\x29\x13\x58\xdc\xfb\x03\xb6\x14\xb7\x78\xcb\x8e\x4d\xfd\x76\xb0\x54\x42\x20\x96\x47\x12\x52\x6e\x6f\x29\xb6\x6f\x6f\xfd\x18\x10\x23\x77\x18\x07\x04\x09\xab\x2c\xeb\x89\x4c\xdd\x7b\x05\x52\xd7\x61\x19\xac\x17\x6e\x6d\x8e\xd0\x62\x01\xf6\xa4\xc3\xb6\x23\x14\xb6\x7f\x02\xb8\xd2\x69\x00\x48\xd9\x6b\xbb\x97\xfe\x21\x19\x90\x94\xf8\x2d\xf3\x8e\x87\xb9\xe4\x97\x5a\xb7\xe5\xdb\xdb\x52\xee\x9f\x15\xf9\x24\x29\x11\x73\x18\x20\x95\x82\x87\x52\x59\x35\x90\x89\xe9\x5d\x31\xd8\xd0\x52\x4b\x85\xfc\x16\x8e\x20\x8f\x6d\x2c\x5b\xb9\x75\x5b\x2a\xee\x11\xe3\x95\xba\xfe\x42\x26\xb3\x9e\x90\xb9\x4e\x3a\xd8\x15\x59\xd1\x6a\x4f\x89\x7e\x16\x2b\x9f\x59\x5c\xae\x27\x5e\x33\x39\x2d\xd4\x7d\xde\x88\x14\x57\xf7\xe8\xb9\x1c\x20\x50\xb6\x6e\x12\x92\x41\xe1\x5f\xdf\xec\x12\xf1\x40\x45\x07\x11\xca\x58\x2e\x98\x84\xcd\x6a\x64\x10\x4d\xff\x80\x8a\x12\x49\x72\x3d\xb6\x80\x2a\xb9\x52\xd4\x32\x85\xcb\x9f\x42\x99\xe6\x53\x89\x0a\xb2\xaa\xc7\x0a\x31\x4c\x7a\x10\x15\x5c\x89\x16\xb4\xe8\x60\x8d\xc8\x12\x42\x1e\xbc\x6a\xe9\x9f\x83\xa3\x16\xc1\xbd\xb4\x58\x68\x74\x04\xa8\xa4\xed\x84\x93\x88\x48\x25\x32\x78\x5a\xa0\x07\x5f\x65\xf2\x98\xca\x23\xfe\x37\x35\x4a\x99\xab\x46\xff\xac\x04\x19\x29\xa9\xa5\x1d\xfd\xd1\xd1\x76\xb4\xa8\xa7\x7d\x49\x51\xcb\xc8\xe9\x6b\xa9\x4a\x35\x9c\xca\x60\x0b\xc9\x15\x8a\x31\x45\x08\xd1\x15\x22\x66\x96\x50\x38\x86\xc5\x1e\x96\x54\xb9\xf6\xd6\xa8\x97\x83\xe5\xed\x6d\x2e\xe0\xbf\xc5\x4a\x99\x26\x21\x92\x34\x99\x78\xbc\xe4\xf3\x35\xbe\xa9\x14\xff\x02\x94\x38\x9f\x76\x62\x67\xcd\x64\x54\x1e\x49\xea\x01\x77\xad\xde\xb4\x34\x5f\xd7\xfc\x41\xcc\xfc\xe1\x01\xcb\xb6\x21\xc3\x94\xdb\x03\x4c\x17\x60\xc9\x00\x1f\x5c\x04\x02\x43\xd5\xd1\x2e\xa3\x3c\x52\xbe\xdb\x72\xd1\x0a\xe2\x8a\x55\x41\x42\xae\xaa\xab\x50\x04\xc5\x6e\x6d\x1d\x15\x20\x7b\xd5\x06\xda\xda\xca\x16\x15\xa6\x93\xfe\xa4\x39\x99\xee\x68\xbb\xc9\x7f\xfa\xea\xee\xce\x4e\x13\xc2\xe9\x61\x27\xb9\x01\xd0\xcf\xfb\x18\xa2\x5a\x9f\x88\x12\x85\xd9\x01\x72\x1d\xad\x11\x51\x16\x31\x2f\xad\xfa\xf6\x77\xbf\xa6\xc2\xca\xad\xe2\x8b\x9b\x03\xb1\x32\x85\x08\xdf\xb7\x8a\x1b\x3b\x88\xf5\x95\x6e\x6f\x87\x5d\x82\xfe\x7b\x5e\x9b\x51\xcd\xe0\x4d\x19\xd8\x52\x69\xc3\x76\xfd\xa6\xd3\x76\x8b\x56\xe9\xa2\xf2\xcd\xd2\x2f\x1e\x8b\x36\x25\x8d\xb6\xc2\x65\x8f\x16\x17\xcf\x42\x89\x21\x46\x13\x94\x61\xe1\x31\xc1\xe3\x7c\x86\x05\xda\x5c\xc8\x0b\x81\x43\x20\x7e\x05\xc0\x8b\xc5\x02\x30\x67\xae\xed\xf9\x63\x26\x8d\x98\x04\x5a\xb9\xf2\x19\x5b\xf9\x8c\x2d\xca\x12\x89\x5c\x67\xd4\x28\x4b\x96\x57\xb1\x66\xce\xa4\xbb\x50\xdb\xdb\x0d\xf0\x49\x1b\x4c\x4e\x5a\xc9\x6e\x50\x20\x78\xbf\x58\x10\x05\x24\xd2\xbf\x29\x93\xcd\xe7\x62\xe5\x13\xd2\xdf\xf2\xf6\x76\x8b\x76\xb6\xb7\xf1\xdf\xfd\xf6\xac\xa9\xf6\x22\x92\xa8\x52\x5d\xc4\xa9\x68\xe8\x73\x54\x6f\x5e\x54\x4c\x84\x38\xfb\x60\x90\xbf\x95\x56\x49\x2f\xca\x57\xed\x61\x88\xd3\x40\xbf\x54\x0e\xa7\x04\xe5\x05\xa8\x7e\xf4\xd0\xbd\x99\xd4\x68\xcd\x99\x56\xe9\x4f\x9c\x16\xbe\x6d\xc0\xa1\x6d\x47\x2d\x1f\x9e\xd7\x90\x6a\xe9\xe3\xd7\x92\x17\x31\x27\xac\x3d\xbb\xda\xff\xac\x3b\x64\xcc\x39\x6a\xf9\xf1\x88\x7b\xd6\x98\x0b\x53\x56\x0f\xcb\x60\xba\x00\x71\x92\x25\xe5\xb8\x23\xcd\x6a\xd1\xbd\x9a\xac\x30\x23\xab\xc6\xdd\xee\x91\x15\xa6\x64\x55\xb4\x5d\x1d\xb2\xe6\x6d\xb9\x5a\x63\xbc\x68\xad\x2b\x71\xee\xb9\x2f\x24\x83\x53\xa9\x20\x20\x2e\x00\x65\xa2\x3f\x0a\x44\x46\x83\x14\xbc\x5a\x9d\xaf\x52\x15\x59\x2b\x32\x99\xf8\x19\x5d\x75\x02\x65\xa5\xd2\x3b\x3b\x5d\x95\xab\x99\x12\xbd\x9a\x72\x49\xc0\xf7\xba\x44\x79\x01\x2a\x85\x4b\x63\x27\xa3\x15\xe1\xf8\xae\x6a\x7e\xa9\xfc\xd6\xd1\x39\xb5\x65\x6a\xd7\x7a\x84\x01\x77\xa5\x47\xc5\x02\xd4\x41\xaa\x16\xa5\x54\x4b\xdf\xd6\x1e\x04\xb7\xa8\x71\x53\x7e\x62\x64\xde\x8f\xe9\xa1\xc1\x8d\xc8\xda\xc4\x59\xd0\x5d\xc9\x2e\xa7\x30\x8c\xb3\xbd\x2c\xf4\x96\xfc\x3b\xfa\x17\x6c\x89\x92\x7e\xb6\xfc\x2a\x18\x59\x6d\xeb\xfa\xd7\x37\x20\x24\x56\x54\xe9\x6f\x69\xbb\xb8\xa0\x1b\x64\xb9\x2f\xb5\x76\xec\x64\x4a\xf0\x80\x98\xc5\x8c\x8d\xb9\x39\x58\xc8\x5b\xbe\x5f\xf0\x99\xec\x86\xfe\x96\xc6\x94\x03\xb5\xf2\xb6\xa4\xd0\x97\x32\xa2\x15\x49\x27\x85\x2c\x33\xed\xbe\xbd\x2d\xa5\xdc\x5c\x64\x16\x9b\x0c\x52\x4e\x74\x5b\xa4\x7b\xd2\x8d\x2a\xef\xf2\x4d\x87\x99\xfc\x52\x12\xd8\x12\x7f\x56\xef\xdf\x71\x10\xb7\xc2\xed\x6d\x3e\xa3\x26\xae\x04\xfd\x66\xc3\x0f\x70\x28\x21\x81\x12\x56\x08\x6f\x6f\x03\x96\x5c\xfc\xd4\xae\xa7\x90\x2e\x16\x74\x05\xe6\x73\x84\xf8\x1f\x1d\x3b\x69\xb3\x5d\xd8\x08\x31\x93\x73\x56\xfc\xc9\x3b\xb1\x52\x2b\x82\xf0\xb7\x96\x83\xb1\x21\x2d\x62\x24\x21\xb9\x4f\x8f\x4c\x6e\xaf\xa1\x3e\xb6\x08\x43\x34\x58\x7d\xe9\x50\x62\x35\x18\x03\x22\x2e\xf2\x49\x3d\x28\xdd\x97\xff\x2a\x8c\x97\xd3\x02\xc1\xe8\x7f\x0e\xd9\x9c\x5a\x78\xc4\x86\x46\xa8\x99\xeb\xd5\xf8\xf3\x6d\x24\x03\xcc\xd4\x72\xb1\xb4\x59\x5b\x6f\x7c\x56\xbc\xc7\x2d\x79\x17\xec\x68\x95\x7b\x25\x9e\x56\xfb\x36\x2c\xbc\xda\x72\x71\xb6\xb7\xa5\xc2\xef\x94\x30\xe7\x1f\x88\x1f\xe1\x94\x36\x98\xcf\xc5\x0b\xc4\xda\xbe\xed\x2c\xc1\x48\xdc\x2b\xee\x66\xc4\xf8\x2a\x79\xc5\x37\xff\x2d\xbd\x1d\x5d\x25\xf3\x23\x39\xc3\xd2\xdb\x91\x3b\xd7\xec\xb9\xa1\xcb\xd2\xdb\xd1\x7e\x0a\x27\x53\x14\xc9\xac\x87\xbf\xbd\x51\x30\x2a\x89\x38\x78\xcb\x27\xc7\x03\x34\xad\x10\x0e\xff\xf0\x22\x31\xa1\x86\xe7\x73\xfc\x9f\x75\x1c\x8a\x46\x34\xea\x5f\xb5\x77\x59\xf8\x2a\xc8\xa8\xcf\xcd\x08\x15\xcb\xbb\xc5\xdf\xf1\x6e\xf1\xed\xb7\x72\x76\x5d\xdc\xf8\xe8\xba\xb8\xa9\x77\x40\x9b\xa1\x0a\xd4\xb8\xc3\x05\x1a\x3c\x4b\x72\x8e\xe2\x14\x85\x78\x7b\x9b\xff\xa1\xdc\x21\xfc\xb6\xf5\xb7\x12\x24\x59\x24\xc9\x4b\x4a\x85\xe9\xb7\x8c\xaf\x20\x11\xa9\x95\x2e\x6b\x36\x25\x5b\xdb\xec\x07\xa8\x0c\x8b\x64\x8a\xf3\x42\xca\x48\x83\x3a\xe0\x45\x86\xa3\xff\x65\xab\x0c\x2b\xc4\x73\x14\xfc\xdd\x78\x8b\x46\x85\x3c\x4a\xf8\xbe\xfb\x02\x14\x48\x81\xd3\x69\xfa\xcc\x5c\xbd\xba\x7e\x8b\x02\x39\x50\xcc\xc3\xde\x5a\x22\xab\xee\xfe\x7f\x15\xc7\x23\x3e\x23\x63\x52\x5f\x42\x7e\x44\x8f\xc5\xec\x36\x21\x8d\xa6\xf7\x04\x75\x74\x1b\x9e\xcf\xe9\x8a\x31\xda\x54\xe5\x4a\xd6\x2a\x71\x81\xd0\x6f\x48\x1a\xda\x87\x4f\x50\x29\x21\xf0\x52\xc0\xc7\x11\x0f\xad\x75\xdb\x60\x79\xb1\x90\x5b\x13\xca\x1b\x96\xda\x92\x3a\xdb\xe4\x58\x96\x07\xe5\xc2\x3e\xcc\xb2\x9c\xb8\x0c\x69\x2a\x40\x21\x4c\x61\x59\x0a\xb0\x14\x60\x2d\xfe\xc4\x56\xf7\x10\x75\x7d\x80\xc2\x57\x09\x75\x55\xa1\x09\x42\x64\x7c\xb9\x31\x21\xb3\x4c\x69\x0e\x0e\xf8\xed\x1f\xf3\xf9\x96\x06\x32\xa5\x1d\x24\x24\x0a\x4b\xa4\x53\x14\x93\x4c\x20\x6a\x29\x53\xaa\x83\x05\x44\xb9\x81\x55\xc7\x14\x24\x62\x13\xdd\xa3\x67\x90\x57\x31\x02\xb1\xa4\x12\xa8\x16\x23\x52\xee\x2f\xdb\xd4\x3c\xe4\x5e\x53\x37\xaa\x8e\xc1\x34\x16\x23\xe2\xe2\xa6\x96\xd2\x38\x3f\x2b\x92\x49\x82\x93\x07\xd4\xda\xd3\xa1\xea\xbc\xb1\xe2\x38\x91\xcc\xe7\x62\x84\x62\x38\x4b\x31\xdf\x59\xec\x0f\x58\xef\x03\x65\xbb\x83\x0b\xf3\x5f\xff\xd5\x1a\x8e\x49\xd8\xca\xf9\x10\xa6\x75\x39\xc5\x18\x11\xac\x5c\x81\x37\x22\xd4\xc7\x6f\x99\x50\x1c\x9d\xd0\xa3\x5a\x32\xd5\x18\x09\xa8\x6a\xc8\xf2\xdb\x7c\xc4\x6a\x48\xb9\x2c\x83\x8c\x6d\x00\x27\x20\x6f\xd6\x3b\x45\x7d\xcb\x70\x7b\x9b\xd0\x40\x2b\x88\x88\x65\x50\xb0\x42\x50\xac\x5e\x24\xb1\x6e\x20\x82\x97\xe6\xbc\x88\xb6\x90\xdb\xb6\x60\xd8\x50\x6f\x13\xdc\xad\x11\x86\x6b\xb6\xc3\xc3\xa4\x7c\x31\x9b\xa2\x42\x40\x4f\xd3\x02\x95\x25\xe9\x8f\x22\x0d\x25\x78\x8c\x0a\xa2\xc1\x48\x6b\xe2\x15\xb7\x69\x7b\x77\x75\xa0\xb5\x7b\xe4\x04\x74\x82\x62\x9c\x19\x51\xfb\xec\xcb\x52\xcc\x7b\xf1\x55\xf8\xc0\xdb\xdb\x25\xc3\x43\xeb\x38\x4c\x57\x92\x94\x35\xa8\x9b\xc4\x9e\x87\xe4\x72\x2b\x8a\xda\x44\xa4\x31\x40\x0b\xb0\x34\xf6\x0c\x35\x11\xcd\x96\x91\xd1\xb5\x6f\xfc\x9e\x92\x98\xcf\xb7\x2a\xcd\x50\xa3\x8d\xd3\xfb\x96\x46\xd8\x61\xe9\xab\x52\x8e\xe1\xa4\x53\x65\x20\xbe\x7f\x56\xe4\x4f\xcf\x55\x25\x75\xb7\x39\x8d\x23\x7c\x97\xe7\x29\x82\x59\x4b\x78\xd3\x15\x3a\x8d\x19\x43\x2e\x0d\x27\xf1\x06\xe0\xfa\xa6\x1d\xe8\x5d\xc8\x32\xd8\x52\xb9\x1d\x5d\x9b\x82\x5b\xda\x62\xd1\x9c\xb2\xeb\x1d\xc3\x2b\x40\xc6\x94\x00\xdb\x68\xe2\xaa\x2d\x42\x54\xeb\xc8\xdd\xdd\x08\x7f\x19\x8e\xac\x51\x4c\x20\xe1\x71\xa2\x82\x78\x79\x43\x9a\xab\x3e\x87\xc2\x7a\xa7\x07\x8d\xea\x85\x9a\x36\xdc\x43\x7c\xee\xa5\x83\x2a\x44\x24\x2d\xa3\x14\x37\x86\x6c\x47\xa4\xad\xe0\xb1\x03\x54\x24\x0f\x28\x12\x5a\xd3\x2a\x85\x09\x31\x05\xb3\xf4\xb9\x12\x50\x3c\x4c\x9e\x17\x42\x43\x21\xcb\xe8\x63\x36\x5f\xbd\x77\x80\x5a\x03\x9e\xa3\x18\x15\x28\x0b\xab\x51\xc9\x64\x85\x31\x2c\xb3\xff\xc0\x42\x80\x50\x26\x24\x59\x82\x13\x98\x26\x25\x8a\x84\x1d\xa1\x24\x8c\x2f\xc9\x9d\x1a\x64\xd9\xdb\xc3\x52\x97\xb1\x41\x16\x5d\xb1\x8a\x78\xa2\x57\xf8\xe9\xee\x15\x7e\x1a\xe2\xa6\xf9\x7c\xb0\x31\x3d\xca\x19\x31\x97\xa1\x44\x69\xac\x3c\xa2\x60\x0a\xc3\xfb\xfd\xf1\x2c\xbb\xc7\xf7\x77\xb7\xf7\x49\x78\x5f\x62\x58\xe0\xdb\x59\xe2\xbf\x5a\x83\x1e\x68\x63\x9e\xe1\xf5\xb5\x63\xea\x37\xe0\xc5\xf4\x4c\xcb\x19\x0d\xb8\xc6\xbb\xf5\xda\x4a\x85\x2f\xb5\xa8\xb8\x73\x7c\xb3\xb5\xa3\xd9\xb3\xdf\x1e\x85\x9f\x3e\x1e\x7f\xc0\x78\x7a\x8e\x3e\xcf\x50\x89\x77\x33\x25\x9f\xa2\x4c\x12\xdf\x1f\x5e\x8a\x00\xc9\x20\x53\x0a\x54\x4e\xf3\xac\x44\x97\x34\xc2\x1c\xa4\x79\x20\x82\x4c\xc9\xb3\x34\x87\x51\x5b\x78\x40\xa9\xa9\x4b\x07\x59\xd0\x6a\x88\xac\x76\xbb\x1e\xa1\xb2\x3c\x45\x0a\x62\x64\x10\xe6\xb3\x34\xa2\x7b\xe6\x51\xfe\x48\x3b\x15\xe2\x24\x45\x22\x6d\x5e\x22\xb2\x2a\x2d\x8b\xb6\x11\x5b\x03\xb0\x63\x0e\xfb\x87\xc3\xbd\x03\x11\x20\xb0\xa5\xc9\x54\x9c\xe0\xaa\x1f\x26\x02\x0a\xf9\xa5\xf2\x72\x75\x55\xfd\xbb\x8f\x95\x12\x43\x3c\x2b\xb7\xb7\x75\xcf\xfb\xcf\xfa\x67\xcb\xa2\xa4\x7b\xda\xc5\xf3\x0b\x6a\x8e\xcf\x3c\xa0\x0c\x4b\x04\x86\x8f\xf9\xac\x44\xec\xa7\x18\xa6\x49\x78\x2f\xca\xad\x81\x18\xac\x51\x1e\x52\x66\xe7\x5a\x88\xd7\x6e\x5a\x96\xa2\xbc\x8b\x15\x42\xff\xcb\xbd\x81\x2d\x95\xfc\xdf\x63\x92\x45\xf9\x23\x50\xe9\xff\x5c\x15\xe8\x2a\xd8\xd2\x9a\xff\x53\x01\x0d\x71\x82\x3e\x84\xc4\x96\x64\xc2\x6b\x49\x74\xb0\x1e\xb7\xb7\xd9\xbf\x0a\xfb\xc7\xf7\x7d\xf6\xc7\x5b\xf6\xcf\x68\xa9\x19\x21\x5f\xa2\xcd\xd2\x58\x21\xff\xf1\x7d\x4a\xd0\x6f\xc9\x7f\x96\x2b\xdf\xa5\x79\x00\xd3\xed\x6d\xf6\xaf\xc2\xfe\xf1\x7d\x9f\xfd\xf1\x96\xfd\x53\x6d\x62\xe7\x7e\xa2\x64\xf0\x21\xb9\x83\xd4\x7f\x7b\xf3\x11\x86\x49\x86\xf3\x72\xcc\xbd\xaa\xfa\x9b\x32\x2b\x51\xb1\x77\x87\x32\x62\xb5\xbf\xd9\x9b\x4e\x53\xf4\x23\x0a\xbe\x4f\xf0\xda\x8a\x5b\x6f\x2e\x60\x0c\x8b\x64\x4d\x25\x7a\x2a\xb7\x84\x0f\x68\xaf\x9c\xcf\x97\xad\x3b\x86\x92\xf9\x9c\xfd\xbb\xe5\xfb\xc9\xdb\xb6\x9a\x19\x89\x15\x05\x13\x6b\xf7\xc3\xe5\xc7\xe3\xbd\x2c\x1c\xe7\xc5\x61\x4a\x23\xf9\x8d\x1a\xdb\xde\xde\xca\xdf\xb6\x98\x39\x07\xf5\x09\xb2\x44\xb9\x3a\x3f\x9e\xcf\x13\x22\x20\xee\x13\x7c\x75\x7e\x0c\xc2\x25\xf2\x61\xfd\x49\x22\x14\xe5\xdd\x50\xa9\x06\xf5\x73\x3f\x9f\xcf\x11\x75\x73\x89\xa1\x5a\xc1\x02\x42\xa5\x40\xa9\x2f\x66\x39\xe1\x0e\x54\x88\x60\xd9\x25\x7f\x2b\x85\xca\xb8\x40\xb1\x8f\x40\xa8\xe4\x45\x72\x97\x64\xbe\xef\xa7\x79\x08\x09\x88\xbc\xe4\x6d\x26\x85\xf2\xa8\xe0\x55\xe5\xb7\x98\x83\x3e\xca\xa4\x10\x84\x0a\x86\xc5\x1d\xc2\xbe\x78\x1b\xa4\x30\x23\x5c\x30\xaa\x3a\x4d\x39\xe0\x4c\x78\x5e\x9d\x1f\x4b\x48\x06\x25\xc2\x97\xc9\x04\xe5\x33\xdc\x16\x5b\xa9\x52\xa0\x87\xfc\xbe\x55\x95\x8f\xb6\x00\x26\x32\x57\xb5\x22\x80\x2d\x80\x2a\xcb\x8b\x91\x38\x29\x2f\xe0\x03\x3a\x2d\x4e\xa7\x28\xfb\x8e\x08\x2b\xe2\x79\x54\x6b\xdd\xc6\x7a\x75\xc2\x30\xf1\x93\x41\xb4\x55\x58\x6a\xbc\x09\xb9\xa1\x99\xfe\x28\xd2\xa0\x21\x56\xeb\x41\xfc\x16\xfb\x2f\x70\x86\xf3\xef\xf2\x09\xb1\x08\x47\x4b\xb4\x45\xb4\x7b\x25\x19\x1f\x21\x31\xfa\x0f\xd0\xb4\x40\x21\xc4\x28\x1a\x09\x87\x4f\x53\x14\x62\x14\x09\x78\x9c\x14\x91\x50\x19\x0f\x3c\x8a\x03\x5b\x67\x8d\x5a\xc3\x60\x62\x78\x2a\xfc\xe7\xf6\xf6\x9b\xff\xfe\xb5\xfc\x46\x7a\x3b\xc2\xe8\x09\xff\xfa\xe6\xd7\x8b\x6f\xe6\xc4\x1c\x49\xd8\x12\xff\xfa\xe6\x69\x92\xce\x7f\xbd\xf8\x86\x7e\xf9\xf5\xdb\xa7\x49\x2a\xff\x5a\x7e\xb3\xab\x7c\x13\x8e\x61\x51\x22\xfc\x6b\xf9\x8d\xff\x6b\xf9\xcd\x0c\xc7\x3b\xee\x9b\x84\xb1\x10\xdf\xb9\x78\x4b\xc4\x20\x45\xc2\xb5\xf8\xeb\x2c\x46\x71\x2c\x02\x74\x03\xd8\xe9\x68\x56\x67\x21\x8f\x88\xae\x06\xb9\x0c\x12\xb9\x3e\xd3\x48\xa4\xb9\x8c\xf9\x52\xd0\x52\x7e\xbc\x72\x1d\xc1\xc3\x8a\x50\x61\x9f\xe2\x56\x12\x07\x94\x17\xf2\x62\xd1\x39\xec\x0a\x32\xc2\x73\x49\x2c\x49\xd0\x87\xf3\x39\xd3\x1b\x22\x68\x88\x77\x7b\x5b\x82\x4a\x0d\x07\x4e\x70\x8a\xfc\x56\x41\x90\x47\xcf\x4a\x92\x65\xa8\xb8\xa4\x3b\x25\x15\xd9\x24\xd9\x9d\xa2\x28\xa2\x3c\xc0\x63\xb5\x49\xc6\xc6\x67\x71\xaf\xd4\x17\x5b\xab\xf0\x26\x0f\x31\xc2\x3b\x25\x2e\x10\x9c\x34\xfb\x2d\x20\xf4\xdf\xb4\x6c\xb3\x0a\xfd\x89\x42\x64\x0c\x47\x8e\x4c\x84\x46\x49\x05\x1c\x28\xfd\x37\xfb\x45\x72\x7a\xf1\xeb\x9b\xeb\x5f\xa3\x9b\x6f\xd7\x08\x3c\x62\x1d\x4a\xe5\x7c\x9e\x6e\x6f\x87\xf3\x79\x2e\x6f\x6f\x0f\x05\x89\xde\x25\x29\x3a\x47\x30\x42\x5c\xa1\xcd\xa8\xf2\x6d\x4a\x77\x67\xdc\x1c\x40\x59\xc7\x22\x60\x1b\xe8\x33\x7e\x70\x6f\x17\xf9\xe5\x5b\x42\x10\x05\x9a\xa6\x30\x44\xd2\x9b\xff\x8e\x20\x86\xa3\xeb\xff\xde\xbd\xf9\x66\xf7\x0d\x10\xe9\x2f\x88\x31\x0c\xc7\x64\x46\x6f\x88\x19\xb0\x2b\xca\x00\xbe\x85\x4a\x2d\x8a\xd8\xe2\x8f\xaa\xdf\x84\x0e\xe8\xf6\xc0\x02\x90\x71\x60\xb4\x57\x1e\x40\x0c\x99\x8c\x59\xd4\x24\x35\x1d\x12\xac\x91\x3f\x1d\x10\x4c\xbb\xed\xe1\xfc\x68\xd4\x1d\x39\xe2\xc3\xad\xa0\xb5\xe9\x92\xf8\x8a\xb8\xe4\x5a\x2c\xe4\xdd\x4a\xb7\xf8\xb0\xfe\x03\x20\x05\x3d\x4d\xf3\x02\x97\x3e\x5c\xc8\x95\x83\x00\xae\x6f\x28\x05\x36\x1f\x89\x35\x65\x58\x86\xa7\x8f\xba\x67\x75\x7a\x86\x5e\xa6\x44\x52\x01\x5e\x3e\x0c\x5c\xc1\x9a\x2e\xf8\xbd\x81\xc4\xcf\x24\xc7\xd4\x6c\x47\x06\xb9\x9f\x49\x9a\x6a\x1b\x1e\xd1\x7c\x99\x64\xb8\x96\x6b\xd0\x9b\x15\x92\xa1\xba\x86\x2e\xf7\xee\x97\x50\x86\xd1\xb6\x51\xb5\x2d\x93\x2b\x87\xd3\x77\x92\xbc\x9b\x2b\x97\x77\xbf\x48\x2a\x10\xa3\xe4\x41\x04\x9a\x0c\x58\x81\xc6\x0b\xf4\xaa\x40\xe7\x05\x46\x55\x60\xf0\x02\x93\x14\xdc\x5e\xfd\x22\x99\x40\x0c\xd3\x62\x27\x09\xf3\x4c\x04\x16\x29\xfd\xfc\xcb\x9e\x54\x55\xb7\x80\x58\x4e\x61\x26\x02\x9b\x94\x5c\x1c\x3c\x48\x36\x70\xda\x95\xfa\xff\x92\x46\x0e\x10\x83\x19\xc6\xa4\x43\x97\x94\x9d\x44\xff\xa8\x4d\xab\x65\x2c\xe5\xca\xfe\x87\x8f\x52\x41\x2a\xe6\x4f\x8f\x92\xcc\xac\xd4\x93\x1c\x27\x31\xe7\x51\x46\x6d\x15\xc0\x6e\x1b\x60\x6f\x09\x86\x45\x12\x4b\xfa\x76\xbd\x1f\xc8\x3b\xdd\xcd\x95\xa7\xa9\x2d\xd1\x59\x4c\x7f\xf8\x24\x65\xcb\xa3\x90\x4f\x3f\xe0\x4b\xc9\xe6\xf6\x1b\xbd\x6f\xe8\x4b\xb3\xce\x89\xa4\x10\x49\x05\xe0\x47\xb2\xb0\x3f\x43\x52\xd1\x5a\xb1\xa2\x35\xa9\xda\xb3\x24\xfa\x60\x30\x7a\x5a\xed\xfa\x90\x1e\xaf\x5f\xee\xd1\xf3\x48\xcc\xee\x4e\xb3\xa3\x2c\xc1\x22\xe8\xdd\x15\x90\x5f\x16\x8b\x1b\x19\x14\x0b\x29\x51\xb0\x0c\x66\xca\xaf\x33\x55\x77\xac\x18\x86\x03\x27\xd7\x88\x74\x91\x4a\x3f\x57\x32\xeb\x37\x69\x26\xcb\xb2\x84\xe6\xf3\x99\xbc\xa8\x9b\x85\x93\xa9\x9f\x2b\x3f\x4d\x27\x12\x53\x18\x33\x50\x22\xe2\x4e\xe7\x45\x39\xba\xbe\x26\xd2\x71\x87\x62\x67\x27\x6b\xa1\x47\xbc\xb9\x01\x49\x36\x9d\xe1\x72\xf4\xb2\x84\xbb\x91\xb8\x54\x24\x2e\x40\x8c\x20\x9e\x15\xa8\x1c\x5d\xe7\xca\xe7\xd3\x7f\xde\x80\x08\x85\x69\x39\xd2\xc0\x03\x2c\xc8\x3f\x54\xc0\x96\xcb\x8c\x73\x7d\x2d\xd2\x00\xaa\x08\x44\x98\xa2\x02\x0b\xf4\xbf\x3b\x11\xcc\xee\xa8\x2d\x55\xe4\x29\xaa\xbe\x89\xc0\x04\x62\x76\x77\x14\x8b\x37\xe0\xba\xf7\x45\xab\xff\x12\x3b\x3d\xdc\x80\xeb\xea\xd3\x4e\x82\xd1\xa4\x5c\x2a\xa1\xa6\x08\xc4\x49\xd8\xfd\x12\xe6\xd9\xce\x63\x01\xa7\x53\xd6\x89\x58\x8e\xe1\x94\x8c\x87\x9e\xc2\x14\x4e\xe8\xb4\x77\xc2\xa4\x08\x09\x10\x9d\x56\x9d\x6e\x88\x35\x20\xde\x80\xbf\x11\x31\x97\x26\xbf\x21\xb2\x3c\x12\xf2\x13\x24\x5d\x8b\xa3\x30\xcf\x32\xe2\xf4\x3f\x84\x28\xc3\xa8\x10\x62\x98\xa4\x6c\x2b\xaf\x41\xed\xaf\x33\xdd\xd4\x62\x2d\x08\x42\xcd\x35\x6d\xd5\xd1\x1c\xdd\xd2\x3c\x5b\x85\x86\xa1\x6a\xc8\x71\x54\x07\x06\x9a\x15\x39\x66\x04\xdd\xc0\x62\xb5\x4d\xdd\xb2\x6d\xcf\x71\x54\xcd\x76\x6c\xdb\x72\x74\xcf\x1c\x09\x22\x10\x47\x47\x27\x97\x87\xe7\x67\xa7\xc7\x7b\x97\x47\xa7\x27\x23\x41\xbc\x91\x65\x40\x6c\x8a\x38\x8e\x54\xf6\x8f\x28\x83\x6b\x91\xc5\xd8\x6a\xbe\x16\x61\x91\xc0\x9d\x14\x06\x28\x15\x81\xb8\x9f\xe6\x25\x9b\x72\xc8\xfe\x32\x00\xe7\x77\x82\x25\x5a\x75\x9c\x44\x11\x22\x0d\x71\x31\x23\x1d\x55\xa8\x63\x0d\x6e\x6e\x16\x00\xa3\xc9\x34\x85\x4b\x07\x37\xb4\x6d\xb4\xbd\x9d\x2b\x3f\x9f\x84\x92\x0a\x42\xe0\x81\x4a\xc6\xa9\x32\xd0\xd9\xb7\x1f\xec\x7f\x48\x8c\x06\x00\x1e\xe0\xeb\x05\x88\x92\x02\x85\x38\x79\x20\xa4\x08\x95\x53\x0b\xa4\xca\xe7\x87\x63\x90\x2a\x47\xde\x6f\x37\x00\x65\x21\x9c\x96\xb3\x94\x51\xb2\xbe\x90\x01\x61\x16\xcd\x31\x0d\x77\x69\x13\xa6\x23\xfa\x0b\x25\x92\xf0\xb0\xe8\xcf\x2b\xd1\x9f\x81\xc4\x2f\x2a\x89\x9f\xfb\x92\x94\xb5\xd5\x75\xeb\x7c\x22\x96\x5f\x2a\xa1\x81\xf8\xd1\x6c\xc4\xec\x0c\x1f\x2b\x19\x24\xd0\x73\xbb\xa3\x25\x39\x50\x25\x39\xf2\xec\x7b\xf4\x1c\xe4\xb0\x88\x0e\x09\xd9\x2c\x09\x90\xea\x84\x38\xef\x52\xa1\xab\x23\xc9\x8b\x05\xe8\xb7\xbf\x98\xc2\x10\x6d\xde\xfe\x46\x06\x68\x21\xc9\xf2\x5a\x89\x24\x64\xe8\x91\x50\x79\x26\x4b\x89\xf2\xb3\x61\x4b\x89\x72\xf1\xdd\x67\x99\xc6\x1b\x58\xbb\x28\x29\xfc\x44\x49\xdf\xeb\x5c\x24\x65\x5d\x91\x24\x02\xf1\x9e\xc3\x77\x9c\x94\x98\xfb\x54\x44\x24\x8d\xf3\x12\x7f\x97\x64\xc4\x0a\x2c\x87\x28\x27\x61\xda\xe7\x1e\x3d\x13\x7b\x51\x41\x0c\x3b\x43\x37\xe2\x94\x1e\x0e\x89\x35\x23\x37\x2d\x4b\x86\x97\x57\x5a\x52\xec\xd1\x96\x8b\x05\xdd\x0b\x00\xba\x87\x8c\x8d\xc8\xe8\x72\x80\x8c\xc2\x1e\x19\x59\xba\x45\x6d\x88\x42\xa2\xe1\x29\x62\x43\x14\x4a\x26\xe5\xc4\x82\xa8\xa9\x2c\x5c\x43\x65\x6d\x22\x1b\xa2\x23\x66\xfc\x2c\x2f\x3f\xc1\x27\x52\xa6\xc9\x14\x49\x92\x0a\x12\xe5\xb3\x2c\x69\xb2\xac\x94\xb3\xa0\x0c\x8b\x24\x40\xd2\xf2\xb1\xdd\xc6\x45\xa9\x3d\x13\x91\x88\xbe\x37\xd3\x14\x26\xd9\x2e\x77\x72\x7c\xea\xde\x88\x0b\x79\x17\x4a\x32\xb7\xd1\x24\x4c\x8f\xc3\xc7\xc9\x9d\xf2\x0c\x27\xa9\xd8\xbb\x82\x87\x25\x91\xc6\x33\x05\x94\x85\xf9\x8c\x2c\x15\x8a\x84\xc7\x71\x92\x22\x81\xda\x96\x49\x76\x27\xb0\x79\xd0\xb0\xd6\x48\x10\xbf\x6d\xb6\xb6\x25\x99\xae\xcd\x17\x92\x6d\x43\xa8\xd3\x22\x7f\xf0\x53\xe5\xe7\xdf\x1c\xe9\x05\xe7\xf7\x28\x1b\x65\x20\x86\x84\x50\x9f\x47\x59\xd3\x1b\xe0\xd7\x7b\xa2\xa3\xac\xba\x81\xc1\xc8\xc1\xb0\x2c\x4d\xdf\x88\x1e\x7e\x1e\xa0\x87\x74\x25\x3d\xe8\x86\x65\x51\x72\xa8\xa8\x20\xfd\x1d\x54\x90\x4c\x86\xa9\xa0\x5a\x5a\x66\xda\xf4\x5d\x92\x62\xd8\x25\xc1\x4a\x94\x1f\xd1\x0e\xa5\x82\xfb\x25\x64\x58\x50\x70\xe7\x81\x78\x73\x12\x52\xc8\x52\x35\xf2\xa8\x6a\x32\x4c\x89\x3c\x51\x83\xf8\x2d\xda\xdd\xa2\x97\x3c\x92\x88\x78\x59\xf4\x7a\x4e\xca\xe2\x0a\xa0\x90\xe7\x73\xac\x04\x30\xbc\x47\x59\x24\x15\xf2\xa6\xc4\x4b\xb8\xf9\x62\x16\x86\xa8\x2c\x25\xac\xa0\x07\x94\x61\xfe\x13\xb4\xbb\x47\x7d\xa2\x54\xf2\xec\x1d\xd3\xd5\x55\x33\xfe\xb3\xdf\xac\x99\xe4\x74\x16\xa4\x49\x39\x66\x33\xe5\xb5\x87\x26\x4c\x28\x24\x57\x7e\x51\x26\xa8\x2c\x11\xb1\x60\x14\xde\x92\x0b\x4b\x04\xa6\xf0\x99\x60\x7e\xb4\x92\x31\xd8\x8a\x12\xce\x20\xb0\x08\xe2\xb7\xf8\x5b\x91\x30\x46\xd1\x62\x8c\x55\x90\xf1\xe9\x0f\x2f\xc5\x86\x70\x11\x0f\x91\x03\x81\x22\x21\x2e\xf2\x49\x0d\xc8\xef\x67\x47\xf8\xf5\xec\xa8\xdb\x6a\x37\xca\xbf\xd2\xc1\xbb\x18\x60\xc7\xcb\xb6\x83\xc7\x38\x30\x6f\x5c\x3d\xe2\xdf\xb9\xae\xa7\xab\xcc\xbf\xab\xa5\x73\xe5\xf5\x35\x8e\x43\xd9\x76\xf5\xe8\x21\xb5\xe7\xec\x49\x22\xed\x2a\xaf\x0e\x17\x62\xf5\x4b\x07\x22\x8e\xa8\x43\x96\x2a\xb7\xb3\x2b\x89\xb8\x8f\xdc\x05\x62\x15\xcc\x5e\x05\xab\x5d\xa1\xfa\xf7\xbb\x1f\xee\x25\x99\x5a\x50\xcd\xad\xcb\xbf\x25\x93\x69\x9a\x84\x09\x06\x99\x9f\x72\x67\xac\x29\x4b\xaa\xb2\xdd\x94\xfa\x52\x74\xdc\xd3\xcf\x33\x29\x51\x1e\x93\xdf\x98\xd6\x2c\x9e\x95\x12\xa3\x69\x79\x9d\xdd\x28\xd4\x38\x2c\xaf\x8b\x1b\x52\x8f\x34\xd0\x5f\x69\x10\x27\x28\x8d\x48\x83\xea\x0a\x51\x7b\x57\x6e\xf6\x2a\x8a\x2a\xa3\x30\xed\x38\xbe\x5a\x55\x60\x00\x91\xee\x0e\x53\x27\xb7\x46\x54\x08\xa7\x6c\x03\x7b\x08\x57\xa4\x8e\x0d\x44\x3c\x46\x30\xaa\xd1\xef\x74\x16\xc3\x25\x9f\x5b\xb8\xf6\xfa\xed\x35\xb5\x57\x43\xd3\x86\x96\xa3\xd3\x84\xac\x70\x90\x47\xcf\x74\x14\x62\xf8\x6a\x06\x28\x81\x0d\x74\xe2\xe9\xec\x84\x79\x86\x61\x42\x2d\x20\x73\x5d\x57\x5f\xb8\xd2\x7c\x55\xad\x6a\x91\xb2\xce\x22\xd1\x68\x5c\x7b\x31\xcd\x0d\xeb\xe9\xc3\xf5\x22\x7e\x3a\x29\xc9\xb3\xa5\xda\xdc\x9c\x7f\x97\x17\xa7\xb1\x08\xb2\x01\x62\x69\x48\xe4\xb4\x88\x50\xc1\x1d\x76\x9a\x1c\xc8\x97\xa2\x2f\x73\xd8\x69\xc4\x6c\x77\xd9\x6d\x97\x90\xbf\xc2\x73\x97\x95\x29\xbc\x43\x97\x34\x3e\x29\x8a\xcd\x9d\xa0\x0d\x3d\xf9\xe6\x8e\xcb\x6e\xd2\x11\x9e\x8d\x3e\x82\xca\xb1\xf2\xdd\xf9\xde\xc9\xc1\xd1\xc9\xfb\xdb\xfd\x0f\x7b\x27\xef\x0f\x0f\x1a\x6d\xc3\x4c\xb1\x1a\x04\xac\x70\x29\xab\x04\x05\xa4\x86\x30\x5b\x85\x05\x73\x22\x66\x59\xdd\x2f\x77\x2b\x5a\xf8\xf4\x09\x04\xb3\x12\x15\x44\x3e\x5f\xa0\xe2\x21\x09\x91\x52\x20\x5c\x24\xe8\x01\xfd\xd8\xd4\x93\x5a\x0d\xe5\x2a\x14\x91\x2b\x58\x06\xd1\xfa\x50\xc4\x74\x3e\x97\xa6\x7e\x4a\x43\x11\x11\x0f\x45\x44\xc4\x23\x6b\x85\x22\xd2\x56\x28\x22\x5a\x0e\x45\x50\x4b\xb0\x98\x2c\x05\x21\x18\x34\x23\x91\xfd\xdb\x09\x37\xa4\xed\x70\x83\xc5\xc2\x0d\xfa\x9a\x70\x83\xc6\x42\x4a\x45\xfe\xc8\x1d\x75\xf2\x2b\xcc\xd3\x1d\x4d\x6f\x3c\xd8\x14\x3d\x50\x67\x57\xab\xbd\xdf\xe4\x81\x06\x1b\xca\x12\x15\xc4\x3d\xeb\xf8\xf4\xec\x94\x1a\xf3\xe9\xe9\x2e\xb3\x40\x56\x4c\x78\x44\x69\x98\x4f\x90\x40\x57\x88\x79\xe6\x6a\x18\xa8\x6a\xa4\x1b\x81\x67\x20\x64\xaa\x9e\xea\x20\x37\x08\xb5\x48\x55\x21\xf2\x90\xa1\x7a\xba\xe3\x20\x88\x34\xee\xc7\x5b\xaa\xe1\x3a\xa6\x6b\x7a\x8e\xe6\xa8\x8e\xa3\x99\xde\x68\xc0\x8d\xdf\x11\xf6\x19\xda\x84\x0b\x84\x89\xde\x2f\x57\x38\xf6\x34\x7a\xf2\x2e\x27\xee\x54\xc5\x72\x0c\x05\x4c\x58\xb2\xbf\x53\x14\xe3\x57\x7d\x74\x29\xed\xc4\x24\x97\x44\xb3\xd6\x12\xcd\x63\x9d\xc6\x28\x53\x1a\x51\x34\x80\xb1\x4e\x7e\x11\x01\x68\x82\x19\xd0\x4c\x16\xea\xe9\x0a\x40\x1e\x04\x90\x5a\x3a\x69\xfa\xc3\x27\x09\x37\x0c\x42\x45\x0a\xbe\x64\xdf\x48\x25\x6d\x59\xc8\xe0\xae\x70\x6a\xcb\x96\x5e\xf8\x20\x54\xca\xbb\x1b\x50\xe2\xe7\x94\xfc\x12\x15\x8a\xa6\xeb\xdb\xec\x8e\x40\x85\x32\xbc\xf3\xef\xfb\xa7\x1f\xcf\xfe\xfd\x46\x10\x04\x3c\x56\x08\xe2\x06\x3e\x8e\xe2\xa4\x28\xf1\x4e\x38\x4e\xd2\x08\x08\x6b\xfb\x88\x36\xe9\xe3\xe5\x31\x89\xf0\x78\x64\xa8\xea\xf4\x69\xf1\x5f\x13\x14\x25\x50\x90\x26\xf0\x69\x87\x95\x0b\x96\x63\x4f\x9f\xe4\x97\xbf\x14\xb0\x9a\x45\x80\x5d\xb0\x1d\x9d\x1d\x3c\x1e\x68\xf5\x12\xd0\x83\xd3\x84\x13\x53\x38\x2d\xd1\xa8\x44\x53\x58\x40\x8c\x76\xf9\x07\x9c\x13\xf1\x90\xe6\xc5\xe8\xdf\xc2\x30\x6c\x97\xd2\x05\x1a\x95\x79\x9a\x44\xed\x62\x3e\xf4\xf4\x69\x41\xa7\xb1\x72\x32\x2f\xf4\xc3\x4e\x0a\x9f\xf3\x19\x1e\xc5\xc9\x13\x8a\x5e\x69\x41\xa7\x3f\xd4\xd3\x63\x5e\x44\x34\x68\x38\xa2\x77\x8b\x76\xc8\xef\x85\x78\xb3\x90\x01\x91\x83\x8e\x66\x68\xea\x46\xee\xe0\xd5\xeb\xee\x60\x65\x81\x16\xcd\x0e\x43\xc1\xb7\x15\x7e\x97\x3b\xb8\x36\x2c\xcd\x3d\x86\x30\x45\x90\x6a\x91\x7d\x16\xe7\x5f\xaa\x39\xa4\x69\x58\x7a\x03\xa6\x67\x48\x79\x47\xcd\x30\x65\x95\x4f\x51\xe6\x6f\x69\xf5\x38\xb3\x12\x5d\xc0\x07\x14\x7d\xe9\x50\xb3\x69\x04\xab\xa1\x2e\x93\x09\x2a\x31\x9c\x4c\xd7\x8d\xf7\xd5\x2e\x49\x3f\xba\x9e\x2d\xab\xb4\x72\x0c\x0b\x14\xed\xb0\xe9\xef\x44\x10\xc3\x9d\x69\x3e\x9d\x4d\xd7\xaa\x37\x1e\x3c\xd7\x7b\xea\xec\xfa\x9a\x06\x5b\x8b\x8f\x79\x04\xd3\xd3\x29\x8d\xb1\x56\x3f\xf7\xd3\xbc\x64\x36\x6f\xa7\xc6\xfe\x18\x66\x77\x95\x6c\x9f\x90\xd2\x1d\xaa\x8f\x3a\x25\xd4\x00\x6d\x17\xc4\x79\x8e\x79\xdc\xbb\x17\x0c\xd6\x80\x18\x60\x32\x6e\x80\xb3\x9d\x7c\x86\xd3\x24\xeb\xc7\x80\xd7\xb5\x98\x16\xc9\x04\x16\xcf\xed\x16\x37\xeb\x35\x4d\xbd\xfb\x45\xf4\x34\x85\x8e\xea\x9b\x7a\xa7\x69\x69\xaa\x2b\xc2\x76\x64\xad\xd1\xa2\xb5\x79\x36\x36\xf8\x66\x1a\xb1\xd4\x75\x20\x9e\xa3\x12\xe7\x05\x12\xf6\x61\x38\x46\x91\x40\x08\xea\xad\xd8\xdf\xee\x32\xfa\x9b\x6e\x26\x10\xa7\x62\xd5\x8b\x05\xc4\x1f\xb9\xd2\x0f\x60\x78\xbf\x25\xfc\x88\xfe\xe3\x01\x09\x25\x21\x62\x01\x8f\x91\x40\x96\x9f\x79\xc4\xcf\xf9\xac\x10\x52\x58\x62\xe1\x21\x29\x13\xac\x74\x46\x22\x7d\xd9\x40\x14\x7e\xa4\x87\xb7\x9e\xf3\x99\x90\x26\xf7\x48\xc0\xb9\x50\x70\x20\xe9\xe9\x3e\xda\x5b\x5e\x08\xcc\xe6\x88\x0b\x54\x8e\xdf\x0a\x4b\x20\x3b\xfd\x6d\x41\xb7\x59\x1b\xf3\xf5\x2d\x3b\xac\x74\xd9\x5d\x92\x17\x15\x88\x1e\x10\x2f\x9a\xa1\x97\x06\x26\xee\x50\x35\x90\xb5\xc9\x40\x4b\xfc\xde\x1a\x4b\xd3\x9a\x15\x22\xf3\x16\x57\x6e\x4c\x76\xb7\x0a\xba\xdc\xc2\xe8\x40\x96\x06\xb8\x66\x4b\x5b\xda\x3c\xf8\xbc\x77\x02\xa0\xf2\xe9\x38\x69\x19\x01\x54\x9a\xd3\xe0\x9e\x6a\xdb\xde\x46\xd2\x7c\x3a\xb8\x67\x00\xee\x07\x8a\x61\x57\xc8\xbb\x8e\x67\x58\xd5\x56\x42\x3e\x9f\x4b\xb9\xff\xb2\x90\x65\x65\xff\xf8\xf4\xea\xe0\xf6\x64\xef\xe3\xa1\x2f\x86\x69\x3e\x8b\x4e\xe0\x04\x11\xf7\x69\xff\xf8\xea\xe2\xf2\xf0\xfc\xf6\x78\xef\xbb\xc3\xe3\x0b\xf2\x71\x56\x62\x54\x1c\x53\xf7\x9c\x56\x38\x3d\xb9\x3c\x3f\x3d\x3e\x3e\x3c\xbf\xdd\x3f\x3c\xbf\xf4\xe9\x95\xd7\x22\x4f\x53\x54\xec\xd3\xdd\xb3\x4e\x95\x0f\xa7\x17\x9d\x2a\x1f\xf2\x92\x56\xf9\xb8\x77\xb2\xf7\xfe\xf0\xe3\xe1\xc9\xe5\x6d\x35\xe2\xc9\xe1\xe5\x8f\xa7\xe7\xdf\xdf\xee\x1f\x1d\x9c\xfb\xe2\x04\x66\xf0\x8e\xee\x1e\xec\x33\x08\x4e\x10\x7e\xcc\x8b\x7b\xf2\xf5\x95\x0e\xd8\xac\x56\x75\x50\x4d\xb4\x3b\x5c\xd6\xed\xbd\xdb\x55\xd6\x6d\x39\x30\xf4\xc5\xe1\xf9\xa7\xa3\xfd\xc3\xdb\xc3\x93\xf7\x47\x27\x87\xb7\xef\xcf\x4f\xaf\xce\x56\xc1\xc1\x75\xcc\x61\x76\x97\x64\xe8\x7d\x91\xcf\xa6\x6b\x3a\xe6\xa8\xbc\x3d\x3b\xde\x3b\x39\xbc\xfd\x74\x74\xf6\xda\x2c\xf7\x19\xaa\xcf\x52\x98\xa1\x4f\xc9\xf4\xe4\x55\xd0\x57\x8f\xb0\x62\x21\x86\x47\xa8\x30\x47\x5a\x1e\x9f\xee\x1d\x6c\x3c\x03\xd2\x98\xf8\xa3\x1b\xc1\xff\x05\xbd\x33\xe8\x37\xea\xbd\x59\xf5\x1f\x19\xdd\xdf\x7e\x7f\xf8\x33\x59\xf6\x47\x4a\xf6\xdf\xa3\xe7\xee\xd7\x4f\x7b\xc7\x57\x87\xcd\xf7\x4f\xf4\xfe\x0c\xc8\x94\xb3\xbd\x8b\x8b\x1f\x4f\xcf\x0f\x7c\x71\x0a\xcb\x92\x98\x6e\xa4\x74\x0d\x6d\x94\x2b\x49\xe1\xea\xe2\xf0\x9c\xd5\x21\xa6\x49\x46\x4b\x73\x62\xa2\xbd\xd0\xb8\xd7\x47\x38\x9d\xd2\x3d\xac\xeb\x17\xf2\x6d\x94\xf7\x79\x0e\xd4\x61\xee\x72\x74\x9d\x28\xf0\x5e\x39\xba\x20\x70\x1f\x1d\xdc\xbe\xfb\xe1\xe0\xe4\xf6\xf4\xfc\xf6\xe8\xec\x06\xd0\xa8\xdb\x48\x6c\x1a\x0b\xa4\xb1\xb8\x00\x55\xb7\x15\x1c\x55\xcd\xea\x77\xab\x4a\x35\x6b\x30\x81\xe5\xfd\x68\x4b\xad\xaa\x56\xe5\xad\xaa\x3d\xd9\x01\xa2\xfc\x24\xc7\x7b\x33\x9c\x13\xa1\xdd\x6a\xda\x82\x87\xd4\x3b\x7a\x77\xb4\xbf\x77\x79\x28\xec\x5d\x5d\x7e\x38\x3d\x3f\xba\xfc\xb9\xdd\x65\x2d\xc8\xea\xc6\xa4\x44\xe8\x01\xb9\x72\x11\xaa\x56\xbc\x82\xc0\x2a\x08\xb4\x42\xbf\x93\x36\xe1\x56\xed\x2a\x8a\x14\x38\x45\x0a\x3b\xc2\xc1\xde\xe5\x9e\x40\x09\x52\xf8\x74\x74\x26\xf0\x56\xab\x3a\x23\xc4\xf7\xe5\x9d\x51\x92\x6d\x3a\xfb\x42\xae\x5b\x33\x1e\x6f\xf8\x3a\xfc\x5f\xc8\x8a\x5f\x35\x64\x6f\x96\x5f\x22\x78\xab\xf1\x9a\x36\xad\x11\x37\x59\xec\x57\x14\xcc\xda\xfe\x37\xa3\x80\x57\x74\xe0\xd7\x8c\xf0\x3a\xc2\x36\x23\x8c\xc1\x31\x37\x26\x8d\x2f\xd6\x32\x5f\x39\x6c\x6f\xb6\x5d\xd3\xa5\x11\x07\xac\x23\x56\x2a\x48\xa7\x67\x97\x47\xa7\x27\x7b\xc7\xb2\x08\xb8\x59\x72\x49\xfc\x2e\x0d\xf0\x38\x4e\x95\x10\x6b\xf8\xa6\x49\x9c\xa4\x18\x15\xc3\x99\xb1\xee\xd1\xf3\x42\x56\x26\x70\x3a\xf0\x59\x14\x95\x30\xcf\x42\x88\x25\x5a\x0f\x88\xc2\x48\x10\xe5\xa6\x8c\xe5\x17\x58\xc8\xca\x3f\xf3\x24\x93\x44\x20\x88\xf2\x02\xd0\x00\x48\x81\xb2\x4a\xca\x8b\xf7\x44\x13\xf1\x0b\x8e\x54\xeb\x8c\xc4\xee\x2c\xd4\x35\x72\x9f\xe9\xae\xd3\xf3\xdb\xbd\x93\x93\xd3\x4b\x1a\xf9\x03\xb4\xc6\xf9\x4f\xb7\x57\x27\x47\x3f\x5c\x1d\xd6\x3f\xcf\x0f\x7f\xb8\x3a\x3a\x3f\x3c\xb8\x3d\x7a\xc7\x94\xdd\x4d\x85\x65\x7e\x59\xf4\x0f\x01\xa2\x3d\xea\xf7\x87\x3f\xdf\x2c\xc8\xff\x16\xc0\x74\x1c\xa3\x7b\xb5\x06\x84\x3d\x33\x39\x64\x66\xf2\xe7\x01\x7b\xf8\xa4\xb2\x87\x4b\x3f\xe4\x21\x8f\x99\x1f\x4a\xae\xa1\xe9\x8e\x0c\xa6\x7e\x28\x39\xae\xad\x3a\x32\x88\xfc\x90\x07\x42\x9a\x88\xff\xe5\xd0\xa1\xca\x88\x1f\xaa\x8c\x3a\x01\x4c\x5d\x95\x41\xd4\x3d\x55\xa9\x55\x25\xd5\xee\x92\xae\x57\x25\xb5\x13\x68\x90\x92\xa5\x83\x95\xba\x49\x8a\x99\x4f\x12\x75\x4f\x56\xea\x16\x6d\x41\xdc\xbb\x76\x9d\xfe\xbf\xbd\x83\x95\x3a\xad\xbc\xde\x7b\x8a\xaa\x93\x95\xd1\x6b\x27\x2b\xa3\xe5\x93\x95\x04\x99\x3d\x28\x7a\x47\x2b\x79\xaf\xbb\x51\x75\xb4\x32\x52\xc6\xc9\x3f\x25\x51\x20\xe6\xce\xd2\x50\x40\x24\x1c\xd0\x4e\xbe\xdd\xdd\xd0\x8b\x14\xfc\xe1\x47\x49\x05\x0e\xd0\x5a\x78\x27\xf0\xe0\x3c\x4f\x71\x42\x37\x02\x30\xca\xb0\x08\x74\xb7\x82\x58\xe7\x48\x6c\x83\x7a\x72\x3b\xed\xed\x77\x75\x01\xa5\x4b\x36\xfd\xe1\x93\x54\x28\xdc\x15\x22\x34\xde\x5c\x97\x27\x9f\x7f\xc0\x97\x92\xda\x86\xf6\x76\x09\xda\x56\x04\x82\xb3\x0a\x3b\x34\x29\x02\xdd\x23\x5d\x5c\x1c\x3c\x48\x1a\x30\xd4\x1a\xb4\x35\x20\x69\xaf\x80\x44\xe3\xd8\xfb\xb0\x44\x15\x6c\x5a\x1b\xb6\xbb\xaf\x85\x4d\xfb\xe3\x61\x1b\x7f\x2d\x6c\xfa\x1f\x0f\xdb\x64\x05\x05\x6a\xd6\x5f\x92\x04\xf7\x56\xa1\x92\x45\x72\x8c\x4a\x8a\x6c\xbe\xaa\x15\xb7\xbe\x86\x3d\x20\x0a\xdc\xdb\x12\x0e\x9a\x7d\x5b\x76\x2d\x9c\xc5\x99\x60\x16\x09\x28\x8b\x68\xe6\x34\x01\x0a\x29\xc2\x18\x15\x80\x16\x87\x30\x13\xf8\x8e\x0d\xbb\xdc\x9a\xe6\x8f\xa8\x08\x61\x89\x78\xb5\x12\x08\xec\x11\x94\x92\x35\x18\x3f\x4f\xc7\x28\x2b\x15\xe1\x08\xb3\x21\xb2\x1c\x0b\x49\x16\xa6\xb3\x08\x09\x8f\xe3\x04\x23\x7a\x14\x4f\xc8\x33\x32\x24\xab\x37\xa6\xa9\x16\x26\xf0\x49\x60\x29\x14\x84\x3c\x16\x6c\x43\x08\xc7\xb0\x80\x21\x19\x43\xa1\xc2\x87\x60\xe2\x10\x9c\xf8\x92\x74\xf8\xfb\x4f\x75\xd7\xd9\x0f\xbf\xf4\x28\x77\x81\xa4\x08\x49\x45\x3b\xa1\x68\xab\x3a\xbf\xee\x5c\x77\x0e\xca\x56\x34\xfb\x5d\x5e\x4c\xaa\x88\x76\x30\x4b\xd2\x88\x14\xb0\x28\x76\x9c\x17\x13\xea\x70\xb6\x37\x79\x89\xf3\x09\xea\xcf\xf4\xd7\x54\xf9\x89\x87\xba\xc7\x78\x92\xbe\x23\xbe\x27\x0b\x05\xf9\x64\xa0\xca\x17\xbd\xc2\x49\x9a\xe0\x04\x95\xca\x1d\xc2\x4d\xa5\x8f\x70\x2a\x35\x1d\xd0\xc8\xdb\x01\xb3\x1b\x58\x1f\xad\x8f\x05\xba\x4b\x68\x70\x04\xa3\x69\x8b\x6a\x2e\x8b\xe4\xee\x0e\x15\xa5\xc4\xdc\xde\x72\x74\x3d\x55\x82\xc6\xd0\x3b\xdd\xa7\x16\xc4\x0d\x18\xa4\x48\x96\x01\xb7\xd3\x3d\x1f\xfe\x5d\x92\xa2\x23\x7e\xbc\xe8\x03\xcc\xa2\x14\x15\x0c\x2d\xec\x24\x56\xeb\x2b\x58\x06\x71\xa9\x0f\x7a\x8a\x6a\x5d\x37\xb4\x42\x95\xeb\xf9\xfe\x8e\x4d\x9e\xee\xb8\xde\xf9\x2f\xcc\x4c\x7d\xa1\x21\xf5\xd1\x10\xa6\x95\x4e\x08\x0e\x70\xe1\x72\x89\x9e\xf0\x48\x3c\xa5\x58\x82\x69\xfa\x2c\x94\x53\x14\x26\xf1\xb3\xc0\x0e\xd2\x08\x71\x5e\xd0\x78\x71\x6d\x77\xb2\x4c\x6c\x43\x78\x02\xa2\xc0\xcb\x15\x7a\x78\x32\x2f\x26\xe5\xe8\x65\x0a\x0b\x94\xe1\x51\x8f\x5a\xb8\x10\xee\x15\x93\x65\x97\x7a\xa1\x42\xd2\x13\x5b\xb3\x97\xe1\xd5\x59\x0d\x50\x23\x4a\xda\xc1\x8e\xd1\x54\xf9\x49\xe9\x44\x3f\x94\x38\xc9\xa2\x61\x5b\x9c\x18\xab\xbe\xef\x77\xa8\x85\x3a\x00\x0b\x96\x64\x91\x9f\x1b\x7c\xce\xe0\x24\x09\x5b\x04\xb7\xf6\x04\x46\x4d\xdd\xd4\xec\x95\x86\x48\x91\xe6\xa9\xac\xa0\x78\x2b\x1e\xf3\xbb\x49\xa3\x66\x1d\x90\x3c\x12\x2f\xf8\x5a\x4d\x10\x86\x2c\xa0\xff\x35\xab\x25\x36\x27\xf0\x28\x6f\x5d\x71\xb6\x1f\x98\x43\xc3\x80\x55\xa5\x77\x45\x3e\xe1\x78\x5c\xc1\xa3\x07\xad\x7d\x6d\x5a\xa5\x3a\xc9\x31\x53\x8e\x36\xdc\xe8\x3a\x94\x17\xe0\xb0\xb5\xd1\x15\xb5\x36\xba\x0e\x97\x37\xba\x2a\x74\xec\x94\x18\xd1\xdd\xad\xe6\x8c\x46\xd4\x3e\xa3\x61\xf0\x5d\x2d\x6d\xe8\x52\x48\xf5\x1c\x18\x7d\x02\xac\x5e\x0a\xbf\x39\x6b\x51\xd0\x87\xb5\xd8\x59\x8b\x7a\x01\x38\x4a\x85\x92\x9f\x7f\x60\xc7\x27\x74\x64\xbb\x30\x0e\x10\x72\xf5\x38\x80\xa1\xe1\xc5\x56\x14\xc5\x7a\xa0\x41\x68\xe8\x61\x88\xa0\x89\x34\x35\x70\x02\x56\xdb\x31\x1c\x4f\x75\x55\xcf\x35\x74\xd7\xd4\x0d\xcd\xd0\xdc\x91\x50\x71\xa8\xf0\xb1\x1a\x4a\xbc\x91\x65\x19\xe0\x16\x44\xd9\x7c\x2e\x65\xd5\x8d\x0e\x0e\x48\x75\xab\x8d\xf1\x33\x1b\x20\x76\x4d\xd5\xb1\xc9\x08\x76\x10\x6a\x8e\xe9\x79\x41\x08\x91\x1a\x9b\x66\x10\x79\x6a\xac\x69\x5a\x64\x42\xe4\x38\xfc\xc6\x87\xae\x59\xa6\xad\x6b\xba\xaa\x1a\x86\xa3\x6a\xba\x3b\x7c\x85\x03\x88\xa3\x8b\xcb\xbd\xf3\xcb\xdb\xcb\xbd\xf7\xb7\xfb\xc7\xe7\xb7\x97\xa7\xa7\xc7\x97\x47\x67\xa3\xe5\x2f\x47\xfb\xa7\x27\xb4\x78\xff\xf8\xf4\xe2\x70\xb9\x78\xb0\x1f\xea\xfb\x1f\x9e\x5c\xf6\x6a\x5c\x9c\xed\x9d\x34\xe8\x69\x09\x30\xd8\xcc\xbd\x66\x8b\x3e\xd8\xb7\xda\xa8\x96\x59\x42\x17\x20\xda\xef\x32\x8c\x43\xc0\x0c\xd6\x18\x0d\x1d\x7d\xa9\x7e\xff\x9b\xd7\x2f\xd0\xfa\x55\xde\x2c\x17\x7d\xa3\x69\x23\x8d\xfd\x59\xb5\xaa\x7e\x37\x1d\xe9\x4b\x45\xea\x52\xc9\x9b\x81\x5a\x6f\xfe\xad\xd7\xf9\x9b\xd6\x70\xad\x5a\x5e\x7d\x8a\x27\x6c\x91\x5e\x32\x9f\x4b\xc9\x2a\xd2\x63\xb9\xeb\x26\xe5\x1d\x23\x28\x18\xdb\x46\xec\x06\x81\xea\x78\x5e\xe4\x04\xaa\x65\x45\xc8\x0c\x54\xe4\x18\x6e\x08\x4d\xe4\x40\x07\x05\x50\xb5\x22\x7e\xf4\xc8\xf5\x5c\x55\x77\x1c\xcd\xf0\x08\x57\x38\x9e\x69\x0c\xd2\x5f\x65\x2b\x56\xa2\x72\xb5\xa1\x98\x09\x30\x9d\x8e\x21\xcd\x67\x95\x84\x8d\xb9\xb6\xca\x72\x5c\xb2\x17\xb9\xad\x08\x68\x82\x94\xa2\x0c\xf3\x02\x71\x2b\x32\xca\x31\x31\xfa\x06\x0f\x3d\x95\x2d\x74\xb1\x1d\xb4\xcd\xd0\x65\x3b\x81\x6b\x7b\xba\x6a\x46\xb1\x13\x42\xcd\x8a\x62\x57\x8b\x0d\x23\x72\x5c\x2b\x36\xd5\xc0\x75\x11\xf2\x74\x0d\xf1\x1b\x57\xba\x65\xd9\x2e\x41\x97\xe7\xea\x86\xad\x1b\x86\xa3\x7f\x01\xba\x5e\x33\x7a\x87\x67\x36\x6b\xcd\x0c\xce\xe7\x12\xdc\x70\x66\x1e\xb4\x03\x2f\x40\x46\x88\x5c\xdb\x51\xa1\x61\x46\x81\x17\x06\xa1\x11\x47\x6a\x60\xba\x0e\x8a\x0c\xc7\x75\x9d\xd8\x64\xb5\x2d\xc7\xd3\x75\x4d\xb5\x55\x53\x75\x3d\xcf\x71\x34\xc7\xde\x70\x66\x8d\x81\x9e\x94\x4b\x06\xfa\xf0\x01\xb5\x6b\x03\x88\xb5\x59\x42\xcf\x12\x7c\xe5\xdd\xc0\xce\x21\x3e\x5d\xbc\x01\x08\xbc\x7a\xf0\xaf\xed\xa5\x56\x97\xdd\xc4\x1b\x80\xeb\xee\xfa\x47\x00\x81\x08\x35\xed\xf9\x92\x5b\x74\xcc\xd6\x25\x6d\x9a\x0b\x6f\x49\x16\xe7\xf5\x25\x41\xb1\x4c\x7e\x23\xff\xe8\xf5\x70\x67\x79\x99\x30\xb3\x45\xc4\xf9\x74\x87\x3e\xf3\xc7\x8e\x6f\x5c\xb0\xaa\xe9\x1d\x9d\x56\x98\x16\x47\x31\xdd\xc0\xe6\x0d\x8f\xb2\xe9\x0c\xb3\xa1\x08\xba\xf8\xbe\x18\xdb\x7d\xaa\x0d\x39\xbe\x10\x22\x10\xe9\x7d\xf0\x71\x9e\x46\x14\xbe\x9c\x0b\xed\x0e\x7e\x51\x51\x54\x93\xae\x06\xa4\x76\xef\x32\xaa\x9a\x1f\x93\x88\xa3\x8e\x57\x20\xa0\x54\x18\xec\xb4\x6b\xe3\xb4\x7d\x6e\x32\x9d\xcf\xa5\xb4\x47\xb5\xad\xc3\xc2\x6d\xe5\x19\x05\x8e\xa9\x21\xc3\x30\xed\x38\xb2\x5c\x17\x22\xdd\x80\x01\x34\x22\xd7\x0c\x75\xc7\x74\x83\xc8\x8e\x8d\x38\x56\x63\xce\x8e\xa6\xa6\x7a\xba\xe3\xd9\xaa\x61\x18\x9a\xe6\xa9\xba\xfa\xbf\x45\x7b\xb6\xe7\xff\xd7\x53\xa0\xba\xbe\x54\x62\x2c\x6b\xb9\x7e\xd1\x37\xba\xf9\xa7\x6a\xd0\x66\xb8\x76\x4b\xbd\x91\x33\x3d\xca\x6c\x1d\x32\xed\x52\x7a\x96\xef\xdc\xcd\xa8\x1e\xa2\xcc\x92\x44\x0d\x7b\x75\xbc\x8e\xd5\x5c\xd8\xad\xb6\x82\x11\x7b\x37\x6c\xa3\x4e\x1b\xfa\x89\x15\x05\x28\x0a\x9e\x9b\xbe\x77\x5a\x15\xab\xb8\x5a\x15\xc3\x42\x4f\x18\x16\x08\x2e\x81\x3d\xd4\xa6\x16\x02\xa4\x65\x39\x0b\xe8\x9d\xe5\xb6\x38\x35\xaa\x2b\x7a\xff\xeb\xee\x5d\xff\xe1\x77\x99\x37\x17\xe4\x0c\xba\x46\xce\xde\xf0\x67\x8e\x5f\x5f\x1f\xad\xbb\x32\xaf\x9e\xcd\xae\x83\x85\x84\x2a\xe9\x61\xb9\x88\xdd\x2c\x01\x97\xad\x2b\xd5\xed\xfd\x8d\xb1\x49\x4f\xb4\x45\xcd\x11\xed\xee\x5e\x84\xd9\x24\x92\xa8\x37\x34\x68\x81\x55\x15\xd8\x7c\x3b\x81\x28\xa6\x16\x3f\xb5\x36\x33\x38\xce\xe9\xd6\x01\xfe\xf0\xa3\xe4\x02\xa7\xfa\xea\x75\x02\xaf\x62\x15\x6d\xd5\xd4\xf6\x1e\x85\x5b\x4f\x43\x03\x31\x30\xc0\xaa\x68\xad\xb7\x14\x9c\x6d\xfd\xa6\xdd\xea\x44\x31\x53\x05\xaa\xa9\x75\xa1\xd1\x15\x09\x63\x94\x4e\x39\xfc\x74\x4c\x13\xdc\x02\x1d\x68\x83\xb1\x6c\x4d\xab\xab\x59\xe0\x6e\x93\x6a\x36\x18\xbf\x52\x6d\xdd\xce\x90\xe6\xf4\x97\x43\x73\xab\x45\xad\xf7\xa8\x34\xaf\x2a\x32\xea\x85\x56\xeb\x55\xd0\xcc\x6a\x19\x74\x0d\x68\xf5\x2a\xea\xfa\xf0\x4a\xe8\xc6\xe0\x4a\xe8\x26\x98\x7c\xed\x4a\xd0\xe1\x2a\x32\xd2\xec\xba\xc8\x66\x45\xf5\xc8\x0e\x10\x6b\x61\x06\x34\xa7\x1e\xda\x05\x7b\x0c\x85\xac\x03\x77\x1d\xd2\x86\x90\xa8\x7b\x7d\x24\x1a\x6a\x9b\xa8\xc9\xe0\x06\x11\x27\xd3\xe9\x0e\xbe\xbf\x63\x4c\x5b\x8a\x40\xf3\x56\xf6\x5c\x5d\x4f\x88\xd8\xc9\xc3\xc6\x90\x05\xb8\x09\xb6\x91\xda\x75\x50\xfe\x95\x64\x06\x55\x55\xb5\xda\x42\xc0\x2b\xa3\x8b\x79\xd3\xe4\x07\x7c\x29\xb9\x55\x5b\xa3\x1e\xa6\x65\xd3\x81\xd6\x3d\xda\xc3\x6c\x36\x51\xd8\xee\x6e\x7d\x8c\x61\xef\xe3\xe1\x32\x98\xeb\xda\xff\xf8\xe1\xe8\xf2\xf0\xe2\x6c\x6f\xff\x0b\xdb\x7d\xdc\xfb\xe9\xf6\xf8\xf0\xa4\x6a\xe4\xbe\x3a\xcf\x96\x3a\xad\xa6\xca\x36\x6a\xeb\x31\xd1\xfd\x3f\xe9\x98\x15\x3b\xe1\x15\x71\xce\xb6\x62\x96\x95\x84\x65\x7a\x5f\xc6\x5a\xb5\x38\xbf\xab\x13\xae\x3c\x01\xee\xc7\x8f\x65\xfa\x46\x52\x75\xbd\x84\x92\x58\x23\x3c\x87\x2e\x18\x4c\x60\x71\x97\x64\x3b\x29\x8a\xf1\x48\x5d\x28\x01\xce\xf8\xc1\xf2\xd5\x37\x2a\x46\x59\x9e\xa1\x05\xef\x9c\xca\xbd\x35\x1d\xe3\x7c\x3a\x52\xb4\x02\x4d\x76\x79\x41\x90\x63\x9c\x4f\x46\xba\x39\x7d\x5a\x28\x6d\xcb\x62\xf0\xfa\x03\xbd\x71\x61\xa9\xea\xf4\x69\x77\x8c\x88\x12\x1c\x69\xba\x4a\x5a\xd6\x6a\x6f\x78\xec\xea\xf2\x8a\xe6\x58\xd3\x27\x76\x61\xe2\x50\x5e\x00\xba\xb7\xbf\xd1\x11\xdb\x60\xf8\x88\xed\x4f\xbf\xe7\x88\xed\x6b\x27\x69\x79\x85\x83\xc3\x8b\xfd\xf3\x23\x7a\x2c\xc5\x1f\xb4\xfa\xb2\xa5\x30\xb3\xbf\xec\xa3\xad\x3f\x1d\xd8\x0f\x53\x7f\xd1\x09\x8d\xfa\x9c\x60\xd5\xbc\x7d\x8a\x66\xf9\xfc\x4d\x6b\x3e\x5f\x39\x4e\xab\x87\xf5\x43\x75\x8f\xfa\xfc\xdf\x11\x9f\xff\xa5\x47\x7c\x2c\x5d\x77\x37\x4b\x7b\xf2\xcf\x01\x7e\x3c\x45\x35\x43\xfa\x85\x64\xd8\x8e\x27\x73\xc6\xb4\x34\x8f\xe7\x3f\xb1\x1d\x57\x67\x37\x9c\xd8\x19\xa0\xd4\x2f\x24\xc7\xb3\x88\xb5\xf3\x0b\xf9\xd3\xf4\x54\x53\x06\x81\x5f\x48\xb6\xeb\x7a\x96\x0c\x8e\x49\x07\xec\x90\xd0\x01\xf9\x93\xdd\xcc\xbf\x6a\x6e\x4b\x3d\xf9\x85\x64\x59\xaa\x67\xc8\xe0\x33\x19\x96\xa5\x66\x7b\x6c\xee\x50\xdd\xfb\x85\xe4\xd9\xaa\xe3\xb4\x76\x87\x3f\x0e\x1d\x28\xba\xe2\x07\x8a\xae\xba\x59\xda\x2c\x19\x5c\x75\xaf\x44\xda\x55\x49\x7d\x5d\xdd\xa9\x4a\x8c\x96\x19\x73\xb5\x7c\xa0\x88\xe0\xe1\x8a\xdb\x1a\x57\xbd\x03\x45\x2a\x6d\xc1\x0e\x14\x35\x75\xfa\xff\xf6\x0f\x14\x69\xa4\x70\xfd\x81\xa2\xab\xea\x40\xd1\xd5\x6b\x07\x8a\xae\x06\x0e\x14\xe9\x4b\x50\xf4\x0e\x14\xf1\x5e\x77\xaf\xaa\x03\x45\x57\x5f\x72\xa0\xe8\x5d\xcb\xdf\x61\xc3\xab\xbd\xf3\x4c\x4d\xdd\xf7\x43\x75\x39\xf6\xdc\x56\xbd\x9f\x37\x5a\x5d\xde\xd0\x68\x2d\x6f\x8d\x55\xf3\x2b\xb0\x9a\xe6\x30\xe2\x07\xd9\x4b\x7a\xdd\xe5\x8a\xd9\xb7\xe0\x1d\xd0\x40\x77\x52\x56\x1b\xa7\xa4\x92\x01\xde\xb3\x4a\x1c\x28\x7b\x33\x64\xd3\xb5\x69\x59\x37\x5b\x99\xc2\x73\x6b\x56\x80\x90\x0a\xdc\xa2\xea\xd4\x5c\xae\xd8\x5a\x93\x4f\xbd\x33\x2b\x57\xfc\x88\x8d\xa1\x02\xad\x85\xad\x41\x57\xc1\xb0\x2b\x32\x6a\x8e\xd8\x34\x73\x5d\x3e\x62\xc3\x26\xa4\x77\x66\xc4\xce\xd8\xb4\x6e\x7b\x1c\xf1\x94\x9e\xd4\x58\xbc\x5a\x3e\x64\xf3\x61\x09\x60\x9e\x66\xa2\x86\x35\xe7\x2a\xdc\x70\x2a\x2e\xeb\xd0\xf5\xda\x6c\x0b\xbb\xcb\x28\xe4\x57\x0d\x8a\x0e\x7a\x9b\x83\x39\xad\xc7\x74\xfb\xf4\xfe\xe3\x12\xa8\x9d\xd3\x8b\x5e\x0f\xbf\x6c\x6f\xb6\xe3\x87\xd7\xa2\x87\x79\x80\xa4\x80\x2c\x8f\x41\x4f\xad\x5d\xd5\x29\x32\x3a\xce\x1f\x5b\x11\xab\x4d\x84\x86\x56\x11\x9f\x0d\x3e\xad\xf1\xfd\x0c\x7d\x69\x01\x97\xc5\x11\x03\x93\x9d\x67\xaa\x85\x48\x8d\x73\xb3\x1a\xc9\x03\x1f\x80\xb1\x9c\x10\xc3\xe8\xf0\x43\x3b\x60\xb0\xe4\xc4\x73\xe4\x0c\x3a\xdc\xd5\xca\x6a\x3a\x10\x2f\x28\x40\x49\x76\x27\x40\xe1\xd3\x47\x81\xd3\x92\x90\x94\x42\x81\x3e\xcf\x92\x02\x45\xe2\x4a\x29\x3b\x40\x9f\x1d\xe9\xc6\xc8\xb3\xef\xd7\xb4\xc8\xb5\xa2\x51\xa3\x22\x0f\xa3\x45\x3a\xfc\xee\x7a\x4d\xdf\x1d\xce\xfb\xa1\x1d\xfd\xa9\xd9\xce\xfb\xd7\xb0\x5d\x33\xcc\x6f\xdd\x61\x56\x1e\xee\x23\x6d\xd9\xc9\x3e\xb3\xa1\x82\x56\x3f\xdf\x7d\x79\x3f\xc6\x50\x3f\xff\xf8\xf2\x7e\xcc\xa1\x7e\xfe\xf9\x65\xcc\xb5\x1c\xe3\xea\xf1\x16\x30\xdc\x16\x7b\x79\x5f\xcb\x5e\x3f\x00\xa3\x52\x00\x5f\xc8\x5e\xa4\x5b\xa7\x0e\x72\x99\x6a\x4f\x45\x0f\xb0\x07\x63\xb3\xdf\x80\x0e\x86\x8f\x6b\x9a\x35\x5c\x9a\x0a\xbe\xdb\xa4\x9a\x06\xfe\xf1\x4a\xb5\x7f\x01\xf7\x84\x9d\x3b\x79\xfb\x49\x54\xac\x61\xa2\x76\x20\xa2\xe8\x05\x22\x2a\xcb\x76\x59\xf1\xad\x6b\xc5\x2c\xe6\xa3\xb3\x2f\x6b\xc5\xef\x3f\x1c\x9d\xbc\xbf\x3d\x3a\xe3\x86\x7d\x9b\x9b\xbf\x1f\xe2\x66\xd3\xfa\x57\x73\xf3\x4f\x5f\xce\x3d\xce\x10\xf7\x54\x2f\xd2\x7d\x49\x47\xee\x50\x47\x18\xfd\x91\x7c\x68\x5a\x5f\xcb\x87\xdf\xff\xab\xf8\xd0\xde\x94\x0f\x7f\xda\x8c\x0f\x11\xfa\xd3\x38\xec\x2c\x8f\xfe\xe7\xb8\x6b\xb1\xfc\xf8\xdc\x92\x91\x69\xfe\x8b\xb4\xdd\x66\x46\xe6\x8a\x83\xdc\x03\x36\x26\xfc\x72\xee\xb0\x07\x95\x54\xf9\x15\x1d\x59\x43\x1d\x4d\x57\xa1\xd0\xb6\xff\x28\x14\x1a\xbf\x0b\x85\x97\x5f\x31\xf3\x41\x01\x13\x7f\x45\x47\xde\x50\x47\xb7\xeb\x25\x95\x23\xf7\x5c\xff\x46\x74\xe9\xeb\x45\x97\x31\x20\xba\x4c\x60\xd7\x91\x03\x6b\x58\x74\xd9\xc3\xa2\xcb\x01\x53\xf4\xd5\x26\x3a\x97\x53\x5c\x76\xd9\x4e\x55\xe6\xad\x95\x5d\x9a\x0a\x2e\x5f\x93\x4a\xd5\x1e\xde\x17\x49\xaf\x35\x52\xac\x66\x50\x67\xb5\x18\x1b\x63\x3c\x2d\xe9\x4b\x68\x57\x45\x5a\x51\x99\xf9\x67\x48\xb1\x0f\x97\x97\x67\xb7\xa7\xe7\xb7\xe4\xdf\x8b\xce\x4d\x9e\x3f\x8b\x88\x08\x25\x9b\xc0\x51\xfb\xab\x6b\xd5\xab\xeb\x68\x3d\x4a\x1a\x58\xdd\x15\x11\xa5\x1e\x68\x5c\xb3\x55\x17\xe8\x07\xa0\xf3\x06\xa0\xd3\x54\xe0\xe8\x7d\xf0\x88\xb7\x56\xc1\x57\xfb\x87\x9a\xbe\x31\x80\xaf\x92\x8b\xb9\x11\xb9\xf0\xfb\xfb\x4b\x34\xb3\x46\x67\x36\xad\xcf\x38\x1e\xaa\xd6\x5a\x47\xb0\x8d\xd1\x90\xa5\x67\xab\x40\xaf\xa7\xdb\x12\xb2\x7d\xfb\x6d\xb2\xaa\xb5\xb1\x49\xeb\xbd\x95\x5a\x60\xe3\x68\x0d\x0b\x53\x8d\x39\x1b\xb3\x10\x94\x56\x3b\xed\x06\x98\x0c\x7c\xf9\x32\x65\xdb\x8e\x51\x15\x0a\xca\x60\x90\xa2\x93\xae\xc3\x3c\x14\xa5\x1a\xaa\xda\x42\xfb\xe1\xb0\x1a\x60\x5c\x67\xf6\xd9\xee\x77\x84\x6d\x1d\xab\xcf\x30\x56\xeb\xba\xe9\x55\x9d\xe5\xe7\x28\xa6\xa7\xbc\x92\x2c\x2e\xa0\xc0\x93\x4a\x08\x28\x8b\xa6\x79\x92\x61\x16\x7c\x98\xe4\x0f\x28\x02\xbd\x2a\x8f\x49\x9a\x0a\x77\xb9\x80\xc7\x45\x3e\xbb\x1b\xd3\x37\x4e\xf3\xa7\x67\x61\x35\x3b\x0c\xe8\xb2\x93\x95\x62\x68\x80\xcf\x80\x63\xf7\xf1\xe3\x34\xa1\x31\x20\xbe\xbb\x3a\x3e\x16\x4e\x4e\x85\xb3\xf3\xd3\x9f\x7e\x16\x8e\x8f\x2e\x2e\x3b\xb0\xf0\x0c\xb6\x1b\xf0\x26\xad\xd5\x44\xc6\xe2\x59\x9a\x9e\xe4\x94\xa5\xfa\x91\xb1\x07\xb4\x3e\x6c\xdb\x0f\xe9\x75\x85\xab\xbe\x24\xc1\x8c\xf5\xc2\xd5\x1c\xd0\xd0\x16\x30\xeb\xe6\xf6\xb0\x86\x76\x86\x35\xb4\x0b\xb2\xdf\xa7\xa1\xbd\x5a\x46\x5a\xb5\x97\xbf\x26\x0a\xc6\x55\x2f\xdc\x48\x45\xeb\xa0\xfc\x2a\x15\x5d\xe1\xda\x58\xd2\x64\xe6\xb2\x2b\x67\xad\x47\xb7\x66\x0f\xa9\x0b\x07\x58\xda\x92\xba\x68\x8c\x15\xab\x91\x9f\xab\xad\x95\x21\x90\xf5\x65\x5f\x53\xd7\x5e\xd5\x68\x7a\xdf\xe1\x24\x30\xea\x06\xb0\x8c\x3e\x8c\xba\xd9\xc0\x68\xd6\x85\xd6\x97\xa9\xb4\x6a\x54\x7b\x89\x96\x2b\x75\xac\xd5\x02\x5c\xaf\xce\x05\x59\xb5\xf7\xab\x57\x28\x19\xa3\xf0\x3e\xc8\x9f\xea\xb3\x76\x35\x03\xa8\x0d\x90\x94\xdb\xd9\x86\x46\x3f\xb7\xda\xea\x1d\x0d\x9c\xdf\xdd\xa5\x88\x32\x2b\xcf\x47\xca\xf7\x35\xda\xe0\x1b\x5a\x3b\x12\x4d\x05\x83\x0e\xc4\xab\x12\x09\x25\x9c\x20\xa1\x7e\x16\xb8\x3e\x07\x4b\x95\x2a\x13\x70\xaf\xcb\xb7\xfe\x3e\x89\x01\x6e\x11\xd0\x74\x50\x91\xa4\xe5\xd4\x9f\x4c\x70\x87\x80\x46\xc3\xcb\xad\x4f\x14\x44\xab\x8f\x61\xa3\xc2\xb9\xe5\xd6\x45\xce\x2b\xc6\x98\x5b\x13\x87\xe5\x55\x02\xc3\xf0\x80\xdd\x44\xdd\xd5\x61\x91\x61\x6a\xc3\x32\xc3\xd4\xc1\x1e\x02\x26\xd0\xbf\x3a\xf2\x6e\x1a\x6d\xdc\xd3\x3e\x4d\x70\x88\x80\x03\x2a\xfa\xb7\x97\xd8\xcb\x6c\xac\x45\x5b\xaf\x9b\xd9\xe0\x84\x80\xa2\x0d\x2b\x0b\xdb\x58\xb7\x30\x74\xf3\x64\xed\x3e\x95\x5b\x99\x58\xd9\xa0\x89\xd5\x37\xe7\x2d\x79\xad\x39\x9f\x7d\x95\x39\xdf\x6f\xd5\x35\xe7\x79\x53\x6b\x13\x40\x7b\x86\x24\xb3\x22\x3a\x96\xe4\x9a\xd6\x7d\x43\x52\xaf\x23\x30\x9a\xda\xb7\x94\xb2\xd6\x61\x25\xf6\xd4\x79\x52\x5e\xc0\x09\xda\x2b\x3f\x60\x3c\x5d\x65\x34\x6d\xd8\x6c\xcd\x9a\x64\x4c\x41\x57\x20\xb2\xc0\xf7\x8a\xfd\xc6\x71\x12\x21\xae\xd0\x7f\x84\x45\x96\x64\x77\xab\x2a\x67\x6d\xe5\xcf\xaf\x75\x5f\x20\x70\x8a\x7c\x49\xba\x40\x5f\x72\xb3\x9b\x53\x59\x32\x94\xff\x3b\xf1\xdb\x77\xbc\xe5\x6a\xd1\x93\x3c\xe3\xb1\x65\x1f\x81\x44\xa1\xe6\x17\x2f\xd8\x8b\xa2\x02\x95\xa5\x2f\x8a\x20\xe9\xef\x8a\xfa\x5b\x1a\x48\x06\xe6\xe8\x6f\xa9\x20\x51\x4a\x84\xf7\x93\xa8\x28\xdb\x09\x5a\x45\x98\xe1\x02\x41\xd1\xf7\xfd\x44\x09\xb3\xe4\x92\x3e\x63\x9a\xd0\x27\x34\x8a\x02\x85\xec\xe2\xaa\x14\x28\xb9\xa3\xf4\x93\x27\xd1\x14\x3c\xd7\x99\x72\x7f\xa4\x54\xbb\x54\x20\x59\x9e\x81\x92\xe5\x3f\xd6\x77\x8b\x4e\xb3\xc3\x2c\x2a\x25\x99\x4c\x6a\xfa\x0e\x4e\x92\xf4\xd9\xf7\xfd\x54\x39\x4b\x94\xa3\xb3\x07\xf3\xed\x50\xfb\xa4\xfc\x44\xca\x8e\xaa\xbc\x6b\x17\xe8\x8e\x3e\x1b\x29\x8f\xd6\xd6\x7e\xb0\xfb\xf5\x07\xa1\x4b\xca\xa3\xe9\x55\x96\x7c\x9e\x21\xe9\x3a\xe9\x1d\xb7\xeb\x4c\xfb\xec\xf4\x80\x4e\x59\xbe\x91\x6f\x56\x81\x9f\x2a\xdf\xc5\x0d\x9e\x3e\xed\xd3\x06\xa3\xa5\xd2\xa3\xb3\x4f\x36\x43\xdf\x4b\x9e\xa5\xcf\x17\x28\x8d\xd9\xad\xf3\xf5\x88\xaf\x20\xf8\x7f\x08\xe9\x6d\x5a\xdb\x18\xf1\x15\x9e\x46\x4b\xa5\xab\x10\xbf\x00\xc9\x50\x7e\x85\x72\x36\x9d\xa6\xcf\x87\xd4\xa9\x2b\x3b\x39\x05\x07\xf2\x2d\x54\x8f\xcf\x83\xa1\xb6\x1d\x76\xdc\xbc\xf9\xc9\xe0\xa1\x82\x95\xed\x45\x71\xb8\xfd\xf2\xb3\x2a\x75\x5a\xfa\x9b\x5e\x8b\x0b\x8c\xa6\xfc\x20\xe0\xca\x46\x34\x09\xec\xf0\x3a\x04\xca\xe3\x77\xa3\x40\x09\x3e\xf6\xba\xa5\xd4\x5c\xee\xc5\x31\xdb\xe6\xee\xe5\x6b\x58\x0d\xde\x6a\xc1\x33\xc8\x19\xcd\x6c\xc2\x59\x89\xf3\x49\xf2\x1b\x7a\x47\xef\x22\xac\x7b\x20\xe1\x8b\x07\x21\x04\x7b\x08\xc3\xb1\xd4\x7d\x2d\xa1\xca\xf4\x70\x9a\x1d\x71\xd4\xb0\xc4\xc0\x12\x06\xd7\xe8\x4b\x58\xec\xe6\x95\xfa\x03\x4c\x86\x6a\xe9\x7e\x23\xf7\xb3\x57\xbc\x96\x1c\x83\x5d\xe1\xdf\x60\x99\xa4\xba\xeb\x12\xe1\x4f\xf5\x49\xbe\xd6\x0b\x6f\xff\xba\x84\x24\xf0\x5f\x9b\x90\xa4\x35\xc7\x16\x85\x4b\xf2\x8a\x2c\x25\x70\xb3\x2c\x25\xaf\xf4\x3a\x90\xba\xe4\x95\x16\x5f\x9f\x70\xe4\x6b\x3b\xfe\xa2\x2c\x24\x1d\xa6\x92\x78\x61\x4a\xdf\xca\xbb\xcc\xd9\x8b\xf7\x55\x69\xfd\x1e\xc8\x65\xce\x97\xae\x4d\x27\x1d\xfa\x59\xcb\x9d\x00\xd3\xc5\x80\xd3\x69\x3b\xd1\xfa\x1d\xc2\x67\xe9\xec\x2e\xc9\xde\xb1\x54\x0f\xd2\x2f\xca\xc7\x43\x20\x86\x59\x22\xca\xbb\x0c\x54\x66\xcb\xf8\x78\x7b\xfb\xba\x32\x72\x80\x18\xc2\x34\x09\x73\x7a\xc1\x2e\x43\xe2\x8d\xc2\x2f\x3f\x97\x12\x96\xdf\xe2\x51\x53\x8f\x7e\xf6\x7d\xbf\xdd\xd5\xdb\x7f\x8d\x9c\xa8\x0f\x05\x47\x49\x09\x8b\x09\x53\xf3\x98\x66\x81\x96\x47\x52\x05\x61\x6f\xec\xed\x6d\xfa\xab\xdd\x64\x35\x30\x5b\x5a\xc3\xa5\x54\x24\x54\x6b\xb2\x14\x9d\xe4\xdd\x96\x08\xb7\x0a\xeb\x85\x91\xe4\xce\x82\x0d\x55\x59\x9f\xf7\xa4\xd1\xeb\xdc\x43\xeb\x1c\x3b\xda\x45\xdb\xdb\xa8\x27\x49\xba\x86\xcd\x4d\x33\x7e\x97\xc8\x56\xa5\x2a\xa9\x6a\x91\x59\x77\xc9\xb1\xfa\xc2\x15\x71\xf5\x71\xa9\xff\xa6\xe5\x9f\xa3\x33\xba\xa6\x0f\x96\x99\x07\xc4\xf4\x46\xd9\x7a\x4d\xee\x49\x1e\x7e\x89\xfe\x1f\x17\xa7\x27\x0a\x7b\x92\x3c\x89\x9f\x25\x24\xfb\xbe\xdf\x2b\xc3\x44\x6a\x4b\x2a\xc8\x95\x73\x59\x42\x9d\xa7\x7a\x06\x9f\xa7\xa3\x70\xdd\xa1\x0c\x15\x10\xa3\x77\x8d\x0f\x44\xb5\x0c\x66\xca\xa3\xa7\x18\xb8\x9e\x93\x17\xed\xe7\xdd\x06\x51\xbe\x1e\xab\x43\xe9\x81\xb8\x77\x27\xfe\xe1\xa8\x59\x7a\xc8\x68\x35\x76\xf2\x8c\x4f\xaa\x52\xf0\x9b\xa0\x86\xaa\xb4\xa1\x87\x98\x0e\x94\xe3\x3a\xad\xef\xc5\xe5\xe1\xd9\xed\xfb\xc3\xcb\xdb\x93\xd3\x5b\x1a\xcc\xbe\x3d\x3a\x79\x77\xda\x7b\x96\x09\x46\x51\xc2\x6e\xf0\x72\x30\x8e\xb2\x38\x6f\x3d\xd1\x94\x64\x71\x0e\x56\xac\xe1\xc0\x83\x4d\xad\xf7\x59\x3b\xd3\x5a\xf9\x3e\xeb\x70\xc7\xf5\xba\xb7\x0e\x16\x0f\x2c\x77\x98\x67\x65\x9e\x22\x76\xd4\x5a\x12\xbb\xc7\x90\x85\x47\x58\x0a\xc4\x0a\x40\x11\x10\x82\x19\x16\xb2\x5c\x48\x26\x53\xf6\x1e\x2c\x8b\xc9\x25\xa5\x00\x1f\x60\x92\xd2\x87\x52\x04\x69\x49\xa6\xf9\x82\xf8\xed\xb0\xb4\xfb\x56\x94\x5b\xb9\x8f\x06\x26\xb1\xa9\x34\xab\xbd\x94\x6a\x91\xe8\x7b\xfb\x5b\x68\x3e\xaf\xae\x6b\xb4\x9e\xb0\xdc\xd8\xbb\x01\xc5\xab\xf5\x6b\x17\x14\x64\xfe\xf5\x4d\x75\x47\xe4\x6f\xd5\x2d\x11\xa5\x9c\xa6\x09\x96\x44\x20\xca\x32\xb8\xa6\x9d\x0d\x92\x0a\xc0\xdb\xdb\x98\x35\x01\xc5\xf6\x76\xc1\xff\x14\x69\x7e\x84\x31\x4d\xb5\x2f\x6a\xba\xa3\xa8\x8a\xaa\x68\x22\x10\x95\xf2\x21\xe4\xff\x54\xc7\x27\xe8\x4b\xfa\xa9\x78\xc3\xb5\x6d\x2b\x54\xe2\x67\xeb\xae\xc2\x34\xf7\x58\x44\xf6\x8c\xbf\xb0\xd4\xbe\xe5\xc4\x2c\x47\x74\x5f\x7d\x2e\x94\x09\x66\x1a\x2d\x63\xfc\x73\x75\x7e\x0c\x96\xca\xaa\xf4\xe4\xfd\x0f\x75\x52\xf2\xfa\xc3\xc5\xed\xd1\xc5\xed\xc5\xde\xc7\xc3\xdb\xbd\x0b\x1a\x7c\x6b\x7f\x1a\x18\xe1\x62\xe5\x10\x17\x83\x63\x54\x24\x74\xb3\x8b\xe6\xf3\xde\xfa\x4f\x60\x71\xbf\x57\x9e\x21\xfa\xde\x5a\xa5\xc9\x7a\xc1\x32\x36\x5f\xd6\xf3\xc5\xe1\xe5\xe5\xd1\xc9\xfb\x8b\x9b\xb7\x12\x37\xfa\x96\x63\x09\x3d\xcc\xf4\x22\x09\xb4\xd9\x90\xe7\xf1\x01\xe3\xe9\x69\x41\xfe\x5b\x12\xff\x64\x35\x24\xdd\xfe\x6f\xfa\x01\x8e\x95\x70\x55\x78\x00\xd7\xeb\x7a\xaf\xb1\xc5\x71\x35\x10\x18\x1b\x1c\x71\x25\xa8\x4b\xcb\x7b\xf3\xf6\xfa\x5f\xb5\xc0\x03\x3a\x9f\xbe\xe1\xda\xb6\xe2\x10\xd8\x52\x89\xe1\xb7\x76\xbd\x2e\xfe\xe8\x05\xbb\x58\xbd\x62\xf2\xa8\xd8\x7c\x1a\x2d\xe1\x8a\xf7\x99\xe5\x7a\xcc\xf6\x20\x56\x05\x2c\x06\x0d\x6d\xf1\x84\x94\x8e\x56\xd8\xc2\x6f\xc5\x7d\x56\x3e\x12\xf7\x98\xbd\x5e\x0f\x5b\xa0\x92\xbb\x68\xe5\xd5\x34\xcf\x0e\xf6\x57\x28\xb2\xae\x29\xd7\x79\xa8\xe3\x15\xa3\xbd\x6f\xaf\x11\x13\x76\xc9\x86\x63\x36\xed\x0c\x49\xa2\xd8\x8f\x33\xc9\xff\xa2\x24\x82\x6b\xac\x7f\x55\x06\xf8\xd5\x26\x75\x28\xb1\x9d\x78\x70\x7b\x1b\xbf\x15\xab\x7c\x4a\x9c\x94\x68\xb6\xf4\x76\x1e\xc2\x56\x9e\xd6\xb3\x3c\xaa\x3e\xd7\x17\x16\xb1\x3c\x6a\x75\xd2\xaa\xd1\xaa\x50\xb4\x5f\xe6\x6c\x05\x8a\x96\x3c\xc6\x75\x6f\x81\xbd\x96\xbb\x30\x89\xa5\xbe\x6a\xa9\xf0\xf9\xc2\x2f\xbc\x8c\xfa\x15\x78\x2f\xfd\xe2\xc5\x2e\x1c\x78\xec\x8b\x02\xc0\x33\x2e\x16\x08\xe2\x1a\x98\xa3\x08\x65\x38\x89\x13\x54\x48\x22\xe9\x85\xf6\x71\x9c\x94\x58\x94\x01\x92\x17\xeb\x93\x2a\x7e\x41\x48\xa1\x93\x69\x71\x65\xbb\x1a\x61\xdc\x1e\xea\x45\x22\xef\x10\x5e\x15\xe0\x5b\x13\xc1\x94\x96\xba\x6d\x07\x47\x37\xee\xb3\x69\xd4\x8e\x21\xad\x88\x79\xbe\xda\xeb\x70\xb0\x74\xb9\xe7\x72\xf3\xbe\xa8\x8b\xc8\xd2\x57\x1e\xd3\xf4\x95\x2d\xc2\xf5\xeb\x7c\x9c\xe3\xfc\x51\xb8\xfc\xfe\x7d\x75\x6d\x27\xc9\xee\x88\x95\x5a\xbd\x06\x4d\x33\xc5\xdd\xa5\x79\x00\xd3\xfa\x62\x4f\x95\x2f\x52\x04\x17\x68\xa3\x94\x98\x17\x48\x96\xae\x94\x9f\x0d\x5b\x7a\x52\xce\x65\x79\xd1\xb4\x0b\x27\x53\xff\xaa\x95\x20\xf3\x02\xad\x7c\x0a\x8e\x8f\x3e\x90\x27\xf3\xaa\x9d\x27\x53\x37\x58\x9e\x4c\x6f\x4d\x9a\xcc\x02\x64\x20\x01\x39\x80\x20\x05\xbf\x80\x00\x1c\x83\x03\xf0\x04\x3e\x83\x47\x70\x0f\x3e\x82\x77\xe0\x3d\xf8\x19\x7c\x02\x1f\x86\x12\x69\x86\xf3\xb9\x14\xf2\xe4\x5b\x35\x3e\x30\x9a\xb6\x9f\x2b\xd5\xb4\xc8\x0d\xdc\x20\x88\x75\xc3\xd3\x62\x03\x45\x9a\x61\x07\x9a\x83\x3c\x64\xc2\x50\x47\x3a\x8c\x83\xd0\x82\xa6\xc1\x33\x68\xda\x9e\xe1\x1a\x9e\x6a\x9b\x96\xe5\x58\xba\xe9\xba\xda\x48\xf8\x7e\x16\xa0\x22\x43\x18\x95\x02\x5f\xcc\xfa\x95\xd2\x81\x5c\x9a\xe5\x7c\x2e\x95\x3d\xa0\xc2\x2c\xa9\x16\xb1\xe0\xc9\x09\x6d\x33\xd4\x75\x33\xf2\xbc\xd8\x0b\x2d\xc7\x8a\x50\x64\xb8\xae\x13\x79\x9a\x6d\x85\xba\xe1\x5a\x01\x74\x55\xaf\x7a\x45\x55\xd7\x1c\xdd\xb3\x2d\xcd\x72\x2d\xc3\x74\x5c\xcb\xd5\xf4\x91\xb0\x7f\x72\x24\x9c\xf1\x4e\x87\x53\x83\x0d\x66\xa8\x2b\x5a\xb0\xce\xe6\x73\x69\xc6\x61\xa5\x4c\x59\x4f\x8c\xa3\x23\x8a\xcc\x50\xd5\x2c\xdb\x8a\x4c\xd5\xb5\xa0\xee\xb9\xba\xab\x07\x11\x82\xaa\xa9\x47\xb6\x13\x78\xba\xab\x7a\x16\x4f\x3f\x6a\x69\xba\x6e\x7b\x96\xa9\x19\xaa\xe1\x6a\xaa\xa5\xb9\xc6\x48\xe8\x76\xcb\xf1\x95\xb5\x60\x60\x4f\xee\x76\xf1\xd5\xca\x9a\xe6\x7a\x5e\xec\xba\x46\x10\xc2\x58\x53\xb5\x48\x55\x2d\xd3\xf0\xa0\xed\x1a\xaa\x67\x19\xb6\x19\x18\x9e\xe6\xaa\xc8\xf1\x58\x6d\x43\x77\x3c\xcf\xd3\x4c\x5d\xd5\x0d\xc7\xb3\x3d\x47\x73\xfe\x82\x59\xd3\x06\x93\xa1\xfd\x99\x39\xd0\xcc\x7e\x81\xb5\x94\x6b\xac\x5f\xf2\x8d\xfd\xa7\xe6\x3f\xb3\x07\x2a\x99\x35\x0d\x27\x2d\xfa\x89\xe6\x73\x29\xea\x65\xe0\xab\x8e\x17\x86\x49\x54\xb4\x89\x29\x74\x22\x2d\x0c\xf4\x20\xb4\xd5\xc0\x0a\x54\x3d\x82\xb6\x63\x1b\x91\x07\x0d\x5b\xb3\xcc\xd8\xf3\x42\xdd\x70\x42\x87\x8b\x0e\xc3\x32\x4d\xdd\xd5\x75\xcf\xb6\x4d\xdb\x76\x5d\xcd\x1e\x4e\x20\xfa\x3f\x4b\x4c\xfc\xe8\x65\x81\xc2\x7c\x32\x41\x19\x51\x13\xc4\x4e\x12\x0a\x62\xaf\x0a\x79\x2c\x68\xaa\xaa\xd8\x26\x71\xc1\xdf\x68\x06\x51\x27\xb3\xac\x0e\x7b\x00\x01\x65\x04\x61\x50\x88\x92\x38\x46\x05\xca\x70\xbb\x35\xce\x85\x59\x89\xea\x24\x7e\x2d\x41\xc8\x31\x5c\xfe\xb9\xb9\xfb\xfe\x34\xba\xfd\x97\x50\x69\xde\xa2\xd2\xcb\xf9\x5c\xba\x5c\x47\xa5\x95\x1f\xd6\x24\x39\x0d\xe3\x30\x0a\xc2\x38\xb4\x3c\x2b\x34\xd5\xd8\xd6\x43\x43\x57\x63\xd3\xb4\x3d\xd7\xb1\xd5\x58\x83\x9a\x63\x46\x86\xab\xf3\x64\xaf\xae\xa3\x19\x8e\xa1\x5b\xba\xed\x98\x9a\x66\x38\xba\xde\x64\x34\x6d\x5b\xe0\x42\x08\xb3\x2c\xc7\x42\x80\x04\x34\x99\xe2\x67\x2e\x92\x61\x0b\xd8\x78\x3e\x97\xe2\x2f\x03\x56\x33\x1d\xd5\xb0\x90\xe6\x38\x8e\xad\x45\x8e\xe7\xba\x91\xea\xe9\x26\xd4\x2c\xd3\xd6\x5c\x1d\xaa\x81\xe3\xd9\xba\xca\x33\x43\x9b\xba\x66\x6a\xae\xed\xda\xaa\xae\xab\x96\x66\xba\xae\xb3\x02\x58\xe2\x11\x41\x7a\x82\x98\xa7\x26\xe2\xe0\xa6\x2d\x70\x6f\xe7\x73\xe9\xf6\xcb\xc0\x55\x63\x0f\xa9\x7a\x80\x4c\x43\x8f\x43\x1d\x59\xae\x15\xdb\x8e\x6a\xe8\xa6\xa6\x99\xc8\x89\x3c\xc3\xb4\xc2\xd8\x30\x78\x26\x61\xcd\xd3\x54\xdb\xf4\x3c\x47\x57\x0d\x43\x35\x54\x4f\x73\x57\x80\x4b\x73\xe1\x06\x48\x98\xd1\x13\x09\x1c\xd6\x5f\x5a\xb0\xde\xcd\xe7\xd2\x5d\x0f\xd6\x69\x1e\x2d\x4b\x2a\x5b\xd5\x43\xc3\x88\xdd\x88\xa8\x5f\xcd\x8a\x54\xdb\x30\x1d\x68\xb8\xba\x1d\x78\x4e\x80\x74\xdb\xf0\x90\x66\x04\x95\x92\x54\x55\x53\xf7\x6c\x4d\x73\x55\x53\x35\x2d\xc3\xd3\xfe\x57\x4a\x2a\x4f\x57\x34\xdb\x65\xa2\xca\xfe\x6a\x51\x35\xcd\xa3\xff\x93\x4b\x6b\xe4\x52\xd0\xa2\xc7\xf1\x7c\x2e\x8d\x57\xd1\xe3\x32\xdf\x18\x26\xf4\x4c\xd3\x8c\x1c\xcb\xf3\x22\xdb\x45\x1a\x51\x9b\x46\x1c\x05\xa6\xeb\xea\x6a\xa0\x19\x21\x0a\x0c\x2d\xe4\x29\xa5\x4d\xc3\xf2\x5c\x4d\xd5\x0d\xc3\x31\x2c\x47\xb3\x6d\xd3\x6c\xf8\xe6\xec\xf4\x60\x9d\x3c\x3a\x6e\x01\x39\x99\xcf\xa5\xc9\x2a\x20\x2b\xb9\x50\xc3\xa8\x6b\x30\x0a\x9d\x98\xc0\x18\x9a\xaa\xe6\x06\x28\xd0\x62\xc3\x75\xad\x18\x45\x9a\xa9\x79\xa6\xad\x5a\x06\xd2\xb8\xdc\x74\x2c\x43\x55\x35\xdd\x70\x55\x53\xb3\x4d\xcd\xd4\x1d\x67\x00\xc6\x55\x62\xe8\xa0\x05\xe5\xde\x7c\x2e\xed\x71\x28\xc7\x18\x4f\xf9\x55\x86\xea\xf9\xcc\x36\x77\xab\x08\xe9\x8e\x6e\x40\x43\x73\x63\x07\x42\xcf\x56\x43\xdd\x8d\xa0\x67\x18\x16\x54\xa1\xe6\x20\x53\x77\xcc\x00\xf1\x54\xc0\x86\xe1\x79\xaa\x67\xea\xae\x6d\x68\x9a\xa3\xba\xf6\x70\x62\xee\x61\x73\xff\xa9\x05\xe1\xe1\x7c\x2e\x1d\x2e\x43\x58\x1d\x0c\x6f\x43\x68\x87\xa6\x65\xc7\x9a\xa3\xc5\xae\xe9\x42\x3d\xd0\x4d\x2d\x30\x22\xcd\x34\x1c\x53\x43\x91\x16\x98\x91\xa6\xc3\x30\x74\x79\x3e\x6e\x5d\x73\x2d\xcb\xf0\x3c\xdd\xf2\x5c\xd7\x70\x5c\x75\x85\xfc\x19\x04\xf1\x73\x0b\xc4\x93\xf9\x5c\x3a\x19\x40\x62\x91\xb6\xa1\xd3\x62\x35\x80\xb6\x1b\x18\xb1\x6e\x7a\x11\xf1\x48\x02\x03\xa9\xaa\xab\xda\x91\x1a\x58\xb1\x8a\x4c\xcf\x72\x63\x27\xaa\x9e\x45\xf0\x0c\x5d\x75\x3c\xdd\x73\x74\xc7\x35\x5c\xd5\xf9\x2b\x4a\xc7\x0f\x97\x97\x67\x7c\xb6\x57\xe7\xc7\x44\x9e\x05\xcd\x21\x72\x54\xf9\xfd\xe9\xb3\x90\x64\xaf\x66\x54\xa6\x62\x10\x86\x21\x2a\x4b\x1a\x42\xc8\xe2\x02\xb2\x30\xc6\xac\x40\x42\x84\xa6\x69\xfe\x8c\x22\x21\x40\xe3\x24\x63\xaf\x7a\xd3\x81\xff\x5c\xa1\x69\xf7\x0b\x9c\x25\x99\xd5\x2f\xf9\xc6\xfd\x53\x9d\x10\x77\xa0\x92\x5d\x93\xed\x63\x8b\x6c\x1f\xe6\x73\xe9\x61\x98\x6c\x97\x85\xa8\x63\xd8\xaa\xa5\x3b\x28\xb0\xac\x50\x75\xa1\xa7\x5a\xc8\xf4\x90\xe6\xa9\x91\x1a\x84\x8e\xab\x45\xa1\x6b\x43\x43\xe3\xdc\xef\xb8\x8e\x6b\x99\x96\x67\x1b\x9a\xe5\xa8\xaa\xe7\xba\xee\x48\xf8\xd0\x1d\x63\x58\x84\xde\xb7\x00\xbc\x98\xcf\xa5\x8b\x16\x80\x52\x29\x0f\x40\x66\x05\xb1\x1e\xc4\x48\xd7\xac\x20\x70\xd5\x40\x37\x6c\xd5\xb5\xad\xc0\xf5\x4c\x4f\x53\x0d\xd5\x36\x02\x13\xea\xba\x5e\xf1\x95\xaa\x7a\xb6\x6b\x6b\xa6\xab\x5a\x8e\xe5\xa8\xae\xee\x8d\xe8\x25\x87\xd1\x9b\x37\xc2\xb4\x40\x71\xf2\x44\x24\xe6\x24\x61\x54\xc8\x80\xfa\xd8\x02\xea\x74\x3e\x97\x4e\x5f\x65\x76\x0f\x59\x21\x74\x74\x23\x8c\xa2\x18\x39\xa1\x8a\x02\xdb\x0c\x3d\xd7\x8a\x83\xc0\x43\xae\xad\x46\xd0\x35\xa0\xee\xa9\x1c\x28\x8d\xf8\xfd\xb6\xa7\xbb\xb6\xe5\xea\x8e\xae\x3a\x7f\xc5\x08\x00\xdd\x2a\xf9\x7f\x8a\xdb\xfb\xf6\xcf\x12\xfb\xbf\x59\x2a\xf9\xc6\xf9\x53\xb9\xdd\x19\xa8\x64\xd5\xdc\xfe\xae\x45\xb7\x47\xf3\xb9\x74\xb4\x29\xb7\x53\xd5\x69\x07\x86\xa5\x85\xb6\x66\x99\xae\x1d\x18\x9e\xa3\x5a\x5e\x6c\x40\x23\x76\x3d\xc3\x8d\x1c\x2d\x32\x21\x0f\x40\xba\xaa\xe6\x6a\x9e\xa9\xea\x9a\xab\xb9\xb6\xe5\x78\x9e\xc1\xb8\xbd\x7c\x95\xdd\xdf\xb7\x20\x3c\x9f\xcf\xa5\xf3\x57\xd9\x5d\x37\x82\x28\xd2\x74\xcf\x8a\x6c\xd5\x8b\x8c\x18\x39\x36\x71\x86\x2c\x23\xb6\xb5\x48\xb7\x34\x4d\x47\x1e\x72\x8c\x2a\x36\x6a\x68\x8e\x63\xaa\x9a\x6e\x5a\xba\xe7\x58\x86\xae\xab\x0d\xbb\x57\xd7\x9b\xd6\xb1\xfe\xcf\x2d\x00\xcf\xe6\x73\xe9\xac\x05\x60\xb9\xc6\x5a\x8a\x63\xc3\x34\x74\x37\x70\x4c\x53\x45\x81\xa6\x79\x5a\xe8\x41\x4d\x85\x4e\x1c\x6a\x50\x37\x10\x52\xa1\x07\x75\x93\xfb\x96\xae\x6b\x9b\xa6\x6d\x78\x8e\xee\xb9\x86\xe7\x58\xb6\xb6\xe2\xd9\xa1\x41\x5b\xe4\x53\x0b\xc6\xfd\xf9\x5c\xda\x1f\x80\x71\xc8\x5e\x8a\x42\x0b\xa2\x38\x86\x1e\xf2\x42\xd5\xd0\x55\xcf\x8a\x1d\xa8\x23\x0f\xea\xd0\xf2\x34\x57\xb3\x2d\xd5\xf0\x4c\x8b\xbf\x48\xe2\x98\xba\x61\x3a\x9a\xa1\xe9\x2a\x71\x7e\x2d\x7b\x85\x8c\x1a\x04\xf1\x43\x0b\xc4\xe7\xf9\x5c\x7a\xae\x82\xa7\x39\x87\xaf\xf3\x60\x93\x13\xc7\x26\xd4\xa1\x16\x19\xae\x01\xa3\x40\x35\x63\x0f\x46\x46\xe8\xc4\x41\x60\x78\xaa\x69\xdb\xba\x87\xe2\x2a\xcc\xac\xbb\x9a\xed\x79\x9e\xe6\xaa\x9a\x66\x9b\x96\xe9\xfd\x15\x5f\x6c\xda\x13\x88\xff\x08\x85\x12\x4d\x61\x01\x31\x8a\x84\x34\x29\x31\xf1\x1f\xab\xf0\x31\x31\xd9\x4b\x4a\x92\x79\x89\x05\x42\x4e\xa5\x22\x1c\x3e\xc1\xc9\x34\x45\x23\x21\xcb\x99\xf8\x7b\xce\x67\x45\x94\x4f\x60\x92\x29\x61\x3e\x01\x6d\xe7\x53\x37\x57\x0a\xc7\x2e\x34\x44\x0a\xff\x49\xf0\x1c\xf1\x7b\xd4\x8d\xf3\x8c\xc7\x10\x0b\xcf\xf9\x8c\x3b\xc6\x44\xb0\x7f\xfa\xd8\xf6\x89\xab\xb8\x5d\x2b\x0f\x1c\xdb\xd0\x41\x91\x00\x83\xfc\x01\x29\xc2\x3b\x98\xa4\x84\x43\x71\x2e\x44\xb9\x50\xe6\xec\x46\x76\x81\xca\x59\x8a\xa9\xee\x29\x60\x1c\x27\xa1\x10\x20\xfc\x88\x50\x26\xc0\x69\xb2\x53\xa2\xe2\x81\x38\xe2\x59\x24\xdc\xcf\x02\x94\x22\x22\x8a\x48\x27\x71\x5e\x3c\xc2\x82\x82\x96\x37\x7a\x06\x08\xc9\x64\x0a\x59\x4e\x3a\x52\x3f\xc4\xa9\x90\xe6\x77\x0c\x6b\xd9\x9f\xee\xaa\x2f\x97\x0c\xf8\xca\xfd\xa2\x6f\x4c\xfd\x55\x5d\xf4\x8d\x3e\xd2\x7b\x55\x9a\xa7\x46\xae\x1b\xb5\xa3\x77\xd5\x4e\xdd\x6a\xde\x54\x31\xba\x55\x8c\xaa\xe0\xa6\x19\xcc\xe8\x56\x6a\x1a\xfd\x01\x83\x0d\x28\x4b\x73\x48\xa5\x9a\x7f\xc2\x3b\x48\x80\xe6\xd4\x48\x93\x0c\xb1\x27\x91\x56\x3d\x6c\xb4\xb2\x0b\x83\x3d\x88\xd4\x7d\x4a\xa9\xf3\x7e\x08\x7b\x3b\x45\xa8\xfe\x2c\x27\x3b\x76\xfd\x23\xbd\xdb\x31\x5f\x85\xaf\x9c\x05\x3b\x74\x0b\x52\xbc\x01\xc5\xd0\x3b\x4d\xfc\x45\x8f\xea\x02\x33\x1b\xf7\x92\x1e\x51\x63\x4f\x22\xd1\xf7\x34\xa6\xad\xd3\x6a\x04\xb6\x8c\x3d\xcb\xd2\x2f\x5e\x7e\xb8\xa5\x5f\x63\xe0\xfd\x95\x4e\x95\xfa\xba\xab\x01\xaa\x5b\xd2\xf5\xa3\x2b\xc3\x15\x69\x16\x02\x7a\x66\x60\x87\x9d\x7f\x07\xd7\x6d\x9c\xfc\xdf\xfb\x2a\xdd\xf7\x55\x86\x69\xb4\x85\xa9\xe1\xb1\x0b\x14\x17\xa8\x1c\x57\xc2\x9b\x8c\x00\x83\x24\x8b\x10\xa1\x18\x95\x02\x15\xe0\x6c\x87\x57\xa3\x0d\x4a\x84\x7b\x20\x56\xd0\x34\xb5\x3a\x63\xd4\x5b\xae\x39\x8c\x50\x34\x44\xda\xbc\x22\xbf\x20\x4a\x74\x43\x3e\x2b\xe8\x91\x9a\x9a\x6b\xca\x69\x92\x65\xa8\x10\xf8\xbf\x3b\xe5\xa4\xdb\xd1\x97\xc1\xb0\xc9\xd0\x5a\x3d\x68\x33\x3c\x19\x76\xcd\x5b\x5f\x84\x8f\x5b\x3f\x29\x27\xdf\x80\xec\x2f\xf8\x36\xda\x05\x4f\x2a\x2b\x36\x4c\xdf\x3e\x58\x36\xc4\xf2\x9d\x83\x67\x7d\xfc\x05\x29\xcc\x28\xf5\x50\x99\x54\xfd\xae\x78\xf6\x1d\x7d\x40\xa9\xca\xcf\xfa\x65\xcf\x01\x19\xa0\xce\x09\xbc\xe6\xfd\xb9\x64\xf3\x27\xdf\x5a\x79\x30\x97\x1e\x9b\x7a\x7a\x7a\x52\x5a\xff\xff\xe6\xe9\x89\xcf\xa1\xf3\xd6\x5b\x75\x92\x64\xe3\x21\x79\x62\xc0\xcd\x86\x0b\xc0\x31\xf8\xbc\xd4\x37\x5f\xa4\xf6\x95\xfe\xc1\x11\x7b\x15\xba\xe3\x71\x57\x0a\x31\xbb\x90\xd4\xb8\x01\x07\xaf\x0f\xc5\x1d\xa6\x57\xc6\x6b\x6a\x75\x07\xad\x3f\xdc\x80\x27\xbe\xf2\xdc\xbb\x19\x1e\xae\xf5\x75\xcd\x70\xad\x5a\xdd\xe1\xea\x0f\x9c\x4f\xfb\x19\x3c\x56\x2a\xc7\xfd\xe6\x57\x03\x55\xfb\x76\xff\x20\x40\xdd\x0a\x5d\xed\xd6\xd6\xf8\xc4\x0a\x68\x0b\xac\xb6\x08\xd1\xba\x32\xc3\x6d\xfd\x7c\x4a\x77\xac\xd5\x74\x4f\x64\x54\xfd\x2e\x88\x78\x03\x3e\xf8\x57\xca\x2f\x4f\xa6\xf4\x41\x5e\x61\x0c\x3d\xb2\x13\x71\xfc\x17\x91\xa1\x6b\xcc\xa2\x41\xaa\xa8\x6e\xb8\x0c\x4a\x88\xfa\x5b\x77\x49\x7a\x70\x92\x8a\x54\xe7\xef\xd0\x5b\x8b\x1d\x54\x31\xed\xdf\x4e\x60\xdd\x40\xc4\x8e\x6b\xad\xa1\xd6\xf2\x55\xce\x28\xbf\x88\x35\xd8\xc9\xb0\xd7\x07\x7c\x8d\x3f\x96\xaa\xad\x64\x90\x4f\xaf\x30\x48\xb9\x19\x87\x2c\x55\x5b\xcd\x22\xaf\x19\x52\x8f\xd5\xd9\x4b\xb1\xa6\x99\x55\xf6\x10\x2e\x12\x98\xdd\xad\xb2\x88\x96\x56\x96\x15\x73\x23\xf6\xb5\xd7\xda\xae\x96\x5e\x6b\xe3\xf9\x97\xc0\xc7\xee\x6b\x6d\x57\xbd\xd7\xda\xae\x9a\xd7\xda\xba\xe9\x6e\x4c\xf0\x33\xcb\x0f\xc3\x32\xaf\x99\xad\xec\x63\x63\x8b\x3e\x6f\xc5\x9a\xda\xc0\xee\xa7\x86\x71\xda\x29\x6f\x58\x86\xaa\x1f\xdb\xd9\x71\x5c\xb9\x4e\x52\xfb\x4f\xa0\xe9\xc0\xec\x97\x6b\x2a\xc0\x08\x68\x5a\x9d\x6a\xc7\x5d\xca\x0b\xa5\xb1\x19\x78\x75\x3a\x27\x1d\x68\xea\x17\x64\x8f\x6a\xd2\x1b\x69\x75\x3e\x4c\x62\xfc\xaf\x48\x1f\xd5\xaa\xd0\x4f\x75\xa4\x35\xc9\x79\x35\x7d\x83\x54\x47\x78\xb3\xdc\x46\x9a\xdb\xcf\x6d\xd4\x7d\xc0\x63\x55\xea\x29\x9e\x28\xcf\xa8\x5a\xe9\x1a\x10\x05\x7a\x46\x97\x08\x36\x16\x9e\xaa\x4e\xac\x0a\xe8\x69\x9a\x97\xa8\x14\xaa\x9b\x45\x02\xbb\x45\xce\xde\x43\x4e\x4a\xde\x88\x06\x24\xc6\x49\x84\x04\x3c\xce\x4b\x54\x55\x5a\x9b\x41\x89\xe6\xf5\xd3\xc1\x03\x02\xa6\x03\x34\xb5\x9f\x76\xbf\x95\xc8\xaf\x7a\xf0\xec\x6a\xfd\x83\x67\xc3\x09\x67\x06\x1f\x3c\x5b\x4e\x7c\xcf\xab\xae\xca\xfd\x57\x67\x94\xc5\x4a\xef\xb2\x03\x01\x8f\x65\xa2\xb1\x57\xe5\x96\x59\xd3\x6f\x1f\xda\x26\x41\x0b\xae\x2e\x40\x7c\x41\xd5\xf9\xbc\xb9\x44\xb1\xd4\x9e\xd2\xc6\xe9\xe7\xd9\xc0\xab\x67\x1d\xff\x71\x35\x76\xfa\x89\x7b\xba\xcd\xe4\x05\x88\x92\x02\x85\xc4\x2e\x2f\x47\xd7\x99\x72\xfb\x33\xc8\x94\x7f\x1c\x83\x4c\x29\xef\xc0\x67\xe5\xd4\x02\x8f\xca\xcf\xb7\x26\x78\x54\xce\x0e\xc7\x20\x53\x7e\x4c\xc1\xa3\xf2\xfd\xf7\xfb\xa4\xd6\x3f\x40\xa6\xcc\xc0\xa3\xf2\xf1\xee\x7b\xf0\xa8\x7c\x7e\x38\x06\x8f\xca\x91\xf7\x1b\x78\x54\xa2\xcb\x07\xf0\xa8\xfc\x63\xf2\x4f\x70\xaf\xfc\x13\x3c\x2a\xd9\x67\xd2\xed\xe1\x3f\xc0\xa3\x92\xe3\x1f\x41\xa6\xfc\x7c\x02\x32\xe5\xfb\x02\x7c\x26\xc3\x3c\x2a\xfb\x1f\x6d\xf0\xa8\x7c\xfa\xbc\x07\x1e\x95\xdf\x0e\xde\x81\x47\xe5\xbd\x65\x81\x4c\x79\x47\x1a\x3f\x9d\x9f\x91\xee\xef\x3d\xf0\xa8\xdc\x4d\x7e\x22\xe3\x7f\x3e\xbd\x69\xbd\x8d\x56\x47\x05\x86\x1e\x10\x9b\x12\x26\xc8\xee\xe8\xeb\x65\x86\x45\x5f\x2a\xeb\xd9\x46\xaf\xb5\x62\xaf\x94\xd1\x04\x6f\x41\x81\xe0\xfd\xe0\xeb\x66\xf5\xd7\x11\xfd\xef\x0e\x4c\xd3\x5d\xf6\x6e\x99\x6e\x5b\xaf\xb6\x17\x04\x61\xe5\xeb\x6b\xfc\xf5\x33\x55\xfd\xf7\x85\xb2\x72\x96\x71\x9e\xe1\x1d\xe2\x27\x8d\x34\x63\xfa\xb4\x4b\x7f\x3e\xb2\x57\xd6\x82\x3c\x8d\x76\xf9\x7c\x46\xd6\xf4\x49\x50\x17\xcc\x29\x56\xa8\x53\x3b\xf8\x38\x1c\x0c\xef\xef\x8a\x7c\x96\x45\xf4\x81\xb8\xdd\xd6\x63\x71\x75\x4f\x2a\x1d\x64\x94\x64\x63\x54\x24\x78\x37\x9c\x15\x65\x5e\x8c\x68\x5a\x4a\x54\x2c\x94\xbe\xde\x1b\x1a\x26\x7f\x40\x45\x9c\xe6\x8f\x74\x21\x38\xde\x08\x9a\x76\x9b\x47\xdf\x4c\x8b\x22\xbf\x63\x39\xad\x7f\x26\x8e\xb5\xa0\xcf\xc4\x5d\x20\x79\x01\xe8\xa3\x4f\x1b\x3d\x40\x95\x3b\xc3\x0f\xc5\x3d\x7e\x37\x50\x1e\x2e\x40\xf0\x71\xa0\xbc\xec\xbe\x20\xc7\x1f\xa2\x5a\xf9\x82\x5c\xfb\x5a\x90\x3f\xe8\xaa\x65\x4b\xf7\x81\xfc\x25\xff\x2a\x53\xf6\x4f\x8e\x6e\x2f\x7f\x3e\x3b\xf4\x45\x2e\x40\x48\x61\xf7\x9e\x9f\xdf\x73\x92\xb2\xa1\xdb\x96\xfe\x90\x67\x93\x0d\x5d\xbf\xf4\x87\x9c\x92\x6c\xf8\xc2\x9e\xdf\xf3\x17\xb2\xfe\x8d\x36\xbf\x6f\xa6\x66\x83\xf7\xf8\xfc\x41\xbb\x32\x1b\xbc\xd9\xe7\x0f\x9a\x84\x59\x7d\x8b\x9b\xf5\xd7\xf1\xfe\xb3\xfa\xee\xa2\xdf\x18\xf5\x59\xef\xe2\xa6\xdf\x0f\x02\x66\xca\xbb\xab\xe3\x63\x3e\xfa\xf1\xd1\xc5\xa5\xdf\xbb\x51\xc4\xde\xef\x6b\x1e\xec\xe3\x4b\xd5\x7b\x85\xad\xca\x6b\xc1\x1f\xbc\xa3\x77\x10\xce\x4f\x3f\x1d\x1d\x1c\x9e\x8b\x8b\x1b\x90\x36\x1d\x74\xe1\x01\x49\xf9\x5d\x9e\xa7\x08\x66\xa3\x2d\xb5\x6a\xbd\xb7\x7f\x79\xf4\x69\xef\xf2\x90\x27\x5b\xad\xea\xb6\x9e\xd9\xeb\xdd\x31\xe5\xed\xe8\x51\x19\xd6\xe6\xea\xfc\x78\x45\xf5\xea\x52\xe5\x40\x1b\xfe\x69\xf8\x65\xbf\xa1\x3b\xbc\x13\x58\xde\xb7\xe0\x6e\xf5\x55\x55\x59\xdd\xd7\xc5\x30\xfc\x17\x2b\x27\xb0\x7c\x4f\xb8\x83\xbb\xce\x7a\x34\x30\x5d\x5d\x1c\x0a\xa4\x91\xb0\x7f\x7a\xf2\xee\xe8\xfd\xd5\x39\x7b\x27\xf1\xdd\xe9\xb9\xd0\x1a\x6e\x15\x6c\x03\xc8\xba\xd8\x18\x5b\x4b\xd7\x91\x07\xd0\x75\xb1\x11\xbe\xea\xab\xbb\xbc\x65\x9d\x87\x77\xb0\x76\x8f\xa0\xab\x46\x03\x19\x7c\xab\x77\x17\x4f\xb3\xf4\x79\xb4\xa5\x2e\x6e\x40\xb8\xf4\x52\x65\x7d\x09\x1e\x82\xa5\x57\x2b\x3b\xd7\x22\x3b\x0b\x90\x0c\xa5\x69\xab\xb9\x83\x95\x0b\xbc\x39\xdd\x9a\x1b\x78\x43\xb2\xbe\x41\xb9\xba\xe7\xba\x4a\xaf\xe7\xea\x80\x22\xe5\x3d\x79\x01\xca\x3f\x6a\x5a\x4d\xba\xb3\x3f\x64\x6e\x2b\xbb\xef\x4d\x70\x01\x1c\x4d\xb3\x36\x7b\xa9\x31\x1e\xd6\x93\x97\xbf\xff\x41\xd5\xb3\xe3\xbd\xe6\x01\xd4\xb3\x14\x76\x5e\x48\x65\x12\x9b\x7f\xac\x24\xf6\xd1\xc9\xc5\xe5\xde\xc9\xfe\x21\x15\xa9\xb7\x07\x87\x9f\x7c\x31\x42\x0f\x47\x59\x89\x61\x16\xa2\x4a\x13\x76\x6b\x9d\x9d\x9f\x1e\x50\x31\x1e\xf5\xeb\x7d\xdc\xdb\xff\x70\x74\x72\x78\xfb\xe1\x70\xef\xf8\xf2\xc3\xed\xfe\x87\xc3\xfd\xef\x2f\x6e\x0f\x4f\xf6\xbe\x3b\x3e\x3c\xf0\xc5\x09\x0c\xc7\x49\x86\x3e\x20\x98\xe2\x31\x0d\x9c\x95\xec\x9a\x24\xd5\x2c\xac\xda\xed\xde\xd5\xc1\xd1\xe5\xed\xf1\xe9\xfb\xf7\x47\x27\xef\x7d\x7e\xf7\x72\x6f\x16\x25\xf8\x38\xbf\xbb\xa3\x41\x85\x4c\x21\x2a\x88\x4c\xe9\xf4\xe0\xf0\xb6\x03\x9c\x2f\x12\x7d\x84\x8a\x93\x3c\x42\x5d\xe8\x36\x7a\x05\x96\x20\x10\x8c\x61\x79\x92\x1f\xe4\x55\x84\x84\xf0\xe5\x12\xf9\xb4\x85\x52\x45\x12\xa4\x4c\x5c\xf3\xfc\x67\xbb\xed\x4d\xd3\xe5\xd2\x12\x54\xfd\x56\x1f\x04\xf2\x41\x04\xd3\x22\x99\xc0\xe2\x99\x07\xfc\x3b\x50\x2d\xaf\xcf\x97\xf7\xb1\x12\xa5\xa0\x3a\x9f\xd3\x92\x9c\xac\xb2\x40\x2a\x0b\xdd\x21\x9a\x0e\x87\xd6\x73\xbd\xb6\xa5\x55\x05\x5e\xb5\xd5\xd3\x5a\xb2\x1a\xec\x92\xb7\x10\x58\x0b\x81\xb5\x10\xd9\x8b\xaa\xb6\xeb\xd9\x1b\xf1\xe9\x10\x43\x66\x0b\xf0\xf3\x40\x71\xd2\xbc\xb3\x2a\x49\xd9\x7c\x2e\x65\x8c\x31\x8f\x3e\xee\xbd\x3f\xf4\xc5\xbc\x3c\x9a\xc0\x3b\xc2\x22\x32\x48\x56\x10\x61\xc6\x2a\x0f\x61\xfb\xf4\x42\xa0\xdf\xc4\xea\x63\xf9\x1d\x0c\xef\x51\x16\x1d\x40\x0c\x49\x3d\xe2\x70\x24\xd9\xdd\x69\xf0\x4f\x14\xe2\x51\x75\xf7\x9b\x7a\xbb\x23\x1e\x08\xa4\xde\x6b\xbb\x64\x41\xb1\xe1\xa8\x9a\xa9\x6e\x84\x8d\x4f\x03\xd3\x3e\x1b\x7e\x5e\xd6\xf1\x1c\xdb\x5a\x7a\x5e\x96\x3f\x3a\x9b\x36\x72\x2c\xf4\x0b\xc9\xd2\x1c\x57\x95\x41\xd9\x3c\x1f\x3b\x6b\x1e\x8a\x9d\xd6\x0f\xc5\x82\xa8\x7e\x49\xb6\xc9\x3b\x7b\xd9\x4b\xaf\x5f\x56\xcf\xf3\x01\x4d\x06\xe5\xda\x67\x16\x3c\x52\xa1\xfb\xd6\x4e\xc9\xa3\x34\xe5\xc0\x0b\x0a\x25\x4f\x9e\x5c\x56\xb1\x8e\x92\x25\xea\x9d\xa5\xa9\xef\x17\x0a\x3b\x1f\x39\x9f\x77\x7f\xb3\x77\xc1\xdf\x92\xc2\x51\xb7\x4c\xe1\xf0\x5c\xa2\x27\x4c\xfa\x5a\x7a\x97\x27\x5e\x9a\x59\xfb\x89\x54\x0a\xfb\xec\x4a\xd2\x6a\xa0\xd7\x00\x4b\x2b\x35\xe9\xfe\x3b\x60\x30\x2f\x93\x40\x01\xc4\x4e\xe6\xff\xdb\x55\xe3\x0f\xa4\xab\xd7\x1c\x32\x02\x7b\xd3\x47\x73\xd7\x81\xa4\x77\x60\xda\x00\x81\x2c\xa4\xd6\xc3\x20\x2b\x5c\xf5\xc8\x11\x43\xa6\xd6\x79\x0d\xe6\x6b\x27\xe3\xfd\x05\x27\x33\xfe\xca\xc9\xe8\xea\x5f\x70\x32\x93\x76\xb0\x7e\xe3\x99\xb4\xc8\xbe\xf5\xe8\xca\xd7\xe2\x45\xff\x0b\xe2\xe5\xf0\x6b\x27\x63\xfc\x05\x27\x73\xf2\xb5\x93\x31\xff\x82\x93\x79\xf8\xda\xc9\x58\x7f\xc1\xc9\x5c\x7c\xed\x64\xec\xbf\xe0\x64\x4e\x87\xde\xaa\x29\xf9\x5b\x35\xf5\xcc\xea\xf7\xc4\xe9\x74\x56\xbc\x27\x5e\xf2\x67\x37\x76\x59\x2e\x1d\xae\x4f\x15\x7a\xc0\xa9\x4a\xf7\x51\x15\x46\x28\x45\x98\xef\x8a\x20\x79\x51\x99\x15\x9d\x07\x26\xf4\x46\x2b\xf6\x1e\x65\xe8\x76\x5d\x2a\x1f\xdf\xa7\x12\x3b\xde\x46\x15\xf4\x0e\xeb\x7d\x47\x04\x59\x4f\x41\x1f\xad\x5a\x3a\xb6\x8d\xa7\xb6\xec\x9f\x7a\x63\xaf\x5c\xff\xc2\x19\x03\xdc\xe8\x6c\xdb\x95\xed\x97\x97\x96\x5e\x51\x29\xe9\x7e\x96\x05\x6e\x81\xde\x7f\xa7\xa2\xa2\x1a\xa3\xaa\x65\x83\xbb\x0d\x6a\x39\x60\xbc\x41\x2d\x17\x4c\x56\x3e\x9e\xd3\xd4\xf2\xc0\xde\x2b\x7d\x55\xf6\x1e\x45\x54\xe7\x35\x2d\x6e\x5f\x69\x40\x1c\x89\x4b\x35\x5f\xc1\xa0\xd6\x42\xa1\x55\x17\xae\xc7\xa1\x66\x81\xc3\x0d\x26\xae\xd9\xe0\x64\x93\x6a\x0e\x78\xd8\xa4\x9a\x0b\x2e\x36\xc4\x10\xad\xee\x81\x53\x56\xbd\x62\x22\xcd\x6e\xd7\x59\x96\x07\x98\xd1\x35\xc8\x86\x4c\xd2\xee\xb6\x26\x8b\x47\x50\xce\xe6\xef\xc7\x95\xaf\x3f\x18\xb2\xec\x56\x57\xed\xb5\x8d\xda\xff\xf8\xe1\xe8\xf2\xf0\xe2\x6c\x6f\xff\x0b\xdb\x7d\xdc\xfb\xe9\xf6\xf8\xf0\xe4\xcb\x1a\xf1\xc7\x88\xbf\xa8\x4d\xf3\x8e\x4a\x59\x3d\x67\xf2\xff\x37\xb4\xf4\xa7\xd8\xb4\xaa\xde\x28\xa1\x92\xb0\x7c\x97\x17\x93\xbd\xa2\x80\xcf\x4a\x8a\xb2\x3b\x3c\xfe\x4f\x8d\x3f\x58\x72\x0e\xce\x7c\x49\x3a\x6f\xbf\xf8\xd1\xbc\x9f\x2c\xc9\x2f\xd5\x53\x24\x48\xee\x64\x12\x64\xc3\xfb\xa9\xf2\xf0\x4b\x9d\x76\x6c\x7a\xc1\xf2\xb3\xd1\xdc\x57\xe5\xdf\xfc\x0c\x3d\x0a\x89\xf2\xf4\x43\xeb\xdd\x04\x54\xbd\x9b\xd0\x83\x6a\x6d\xbe\xad\x4a\xa5\xe5\xc5\xa4\xac\xf2\x44\x77\xf2\xc9\xf3\x8c\xbf\xeb\x33\x7f\xee\xa2\xaa\xa3\x69\x81\x1e\x92\x7c\x56\xd2\x98\xe5\x96\xef\xd7\x1f\xc2\x59\x51\xa0\x8c\xc5\x32\xb7\xb7\x57\x14\xb3\x64\xd1\x3d\xa4\x0e\x26\x1e\x6e\x72\x06\x2f\x23\x87\x26\x15\x86\xbf\x37\x33\xf1\x60\xfe\x61\xf9\x05\x2f\xc1\x57\x67\xd7\x1e\x4e\xd4\xd8\x35\x1a\xda\xf1\x15\x25\x1c\x27\x69\x54\xa0\x6c\x7d\xd2\x43\x9a\xd6\x50\xa1\x8f\x08\x29\xb3\x69\x04\x31\xa2\xd8\xda\xcb\x22\x9a\xba\x3b\xc1\xcf\x3c\xf5\x73\x93\x6a\x8d\x65\xc4\x5b\x95\xfc\x91\x99\x0e\x84\x82\x32\x25\x7c\x94\x5e\x16\x75\x0e\xc2\x0e\x49\x7c\x25\xc0\xa1\x32\x56\x60\x14\x1d\xb0\x04\x8b\x3c\x50\x29\x21\x20\x8a\x80\x26\x7c\x46\x4d\x0e\xc6\xc6\x3e\x59\x99\xec\xb8\x8f\x6c\xf6\x26\xe2\x1e\x96\x5a\x89\x93\x61\x14\x9d\xa0\xc7\x55\xb3\x1d\xec\x86\xe6\x76\x4d\xd3\xbd\xf2\x32\x9f\x85\x63\x14\x49\x32\xd8\x1a\xac\xc8\x53\x17\xac\x20\xcd\xe9\xac\x1c\xb7\x73\x10\x56\x27\x50\x3a\x1c\x74\x80\x4a\x5c\xe4\x43\xe9\x8d\x57\xd0\xaf\x92\xa1\x27\x2c\xc9\xab\x78\x5f\x09\xf3\xc9\x94\x60\x8e\x67\xc7\x43\x0b\x49\x96\x37\x4a\x63\x77\x2e\x2f\xc0\x79\x2b\x71\x5d\xd9\x4a\x5c\x77\xbe\x9c\xb7\x0e\xdf\xdf\xb1\x93\x99\xa5\x78\x73\x03\xa8\xdd\x50\x8e\x5e\x18\x79\x8c\x44\xf6\xaf\xb8\x68\xe5\xb1\x2b\x95\xcb\xcb\x83\x2a\x8f\x9d\xc6\xf3\xd8\x99\x03\x79\xec\xf8\xf3\x22\xed\x0b\x25\xa0\x7f\xf7\x65\xf9\x06\xc8\x8a\x93\xd2\xcd\xcd\xbe\x5f\xe6\x73\xe9\x17\x7e\xb3\x8f\x01\xde\xb9\x13\x1d\xc6\x9a\x17\x38\x8e\x1e\xa8\x86\x63\x41\x3d\x0a\x4c\x35\x8a\x03\x14\xab\x81\x19\x1a\x76\x00\xdd\xd0\x85\x71\x54\x5d\x21\xb7\x2c\xd3\x33\x3c\xcd\x75\x2d\x4b\x73\x74\xd5\xf0\x56\x64\x90\xf8\x9f\xbc\xd7\x37\x74\xc3\xf9\xff\x2e\x28\x6f\x7e\x41\xf9\x7a\xe5\x75\x85\x55\xd7\x1b\xfe\xc8\x6b\x0c\xdd\xa3\xca\xfd\xbb\x55\xfc\x6c\x2c\x15\x3c\xdd\xc3\xf8\xec\xd4\x18\x3f\x58\xbc\x7c\x33\xa1\x73\xad\x01\x46\xfc\x0a\x6e\x73\x50\xba\x36\x99\xe9\xcd\x18\x91\xdd\x8f\xa1\x27\xa9\xc9\x1f\xf5\x7d\x08\x9c\xed\xc0\x28\xea\x5d\x94\xd9\xfc\xd6\xc3\x6b\xc0\x2f\xb1\x7b\x5b\x36\xd4\x2e\x27\x86\x09\xa9\xdc\x96\x15\xc3\xd7\x37\xe8\xbf\xc2\x3d\x7a\x66\xa0\xac\xbd\xd3\xc0\x6a\x75\x4f\x14\x93\xb2\xf6\x3a\xa0\xa2\xa8\xfa\xee\x5f\x9e\xb8\xae\xde\xb4\x64\x6e\xd7\x2a\x58\xa8\xf4\xdf\x00\x9a\xaa\x5e\x17\x9e\x87\xfa\xbe\x48\xa7\x6b\xa6\x42\xeb\x15\xad\xa0\x0d\x70\x26\x90\x05\x23\x3e\x3e\xfd\x83\xd5\x5b\x5e\x73\x83\x5f\x9b\xe3\x81\x86\xee\x71\xfe\x66\xce\x6d\x21\x1b\xcc\xe7\x52\xd0\x4b\x2c\x54\xcf\xb0\x9d\x53\x48\x75\x74\xcb\x33\x02\xcb\xf1\x1c\xdb\xd4\x3c\xcd\x85\xa1\xea\x6a\xa1\xee\x6a\x9e\x1b\xab\x46\xec\xc2\x40\x37\x63\x58\x5d\x41\xf7\x1c\x4b\x77\x75\xdb\x70\x2d\xcf\x75\x74\x4d\xd7\xcc\x41\x79\xbb\xdf\x19\xf2\x1e\x3d\x97\x2c\x81\x58\x89\x61\x81\xe9\x31\x58\x94\x45\xc2\x63\x82\xc7\x02\xcc\x04\x98\x4e\xc7\x30\x9b\x4d\x50\x91\x84\x42\x38\x86\x05\x0c\x31\x2a\x00\xad\x17\xc2\x4c\xe0\x2e\xb2\x90\x67\xe9\xb3\x90\x22\x8c\x51\x51\x02\x21\x9b\x4d\x02\xfa\xc7\xf8\x79\x3a\x46\x59\x09\x84\x59\x16\xa1\xa2\x0c\xf3\x02\x95\xac\x71\x94\xe3\x52\x59\x71\xd9\xbc\xc1\xd5\xf1\x7c\x2e\x1d\x6f\x82\xab\x10\x22\x37\x76\x60\x68\x79\x81\x6d\x06\x46\x60\x6a\x66\xac\x07\xb1\x1a\x05\x8e\xeb\x58\xaa\xaa\x79\x06\xb4\xa0\xc9\x93\x2c\x5a\xae\x6a\x9b\x86\xee\x59\xa6\xaa\x69\xa6\xe1\xe9\xd6\x17\xa1\x2a\xcb\xb1\xc0\x9f\xde\x11\x1e\xeb\x67\xea\x04\xe2\x94\xb0\xab\xc5\xaf\xcc\xea\x60\x3e\x97\x0e\x36\xa2\x00\x35\x52\x23\xa8\xc6\x81\xa9\x79\x8e\xaa\x1b\x4e\xe4\x9a\x9a\xa3\x45\x51\x1c\xba\x6e\x10\x44\x9e\x1a\x20\x17\xc6\x3c\x21\x92\x66\xe9\x9a\xa7\x3a\xba\xe9\x3a\xba\xae\xaa\x86\x67\x6d\x4e\x01\xf0\x49\x60\xbe\x97\x90\x94\x82\x6d\x34\x4b\xbd\xc1\x74\xae\xe6\x73\xe9\x6a\x93\xe9\x58\x96\x89\x74\x18\x7a\xba\xe6\xe8\x91\x03\x23\xa8\x69\xc8\x09\x22\xe8\x98\x81\x01\xa1\xa3\x59\xd0\x8d\x90\x53\x25\x17\xd4\x55\xd7\xd4\x0d\xcb\x34\x4c\x95\x50\xb3\x6b\xa9\xf4\xde\x3b\x95\x77\x8c\x3e\xf1\x98\x3f\x7b\x7b\x8f\x9e\x05\x98\x16\x08\x46\xcf\x02\x7a\x4a\xca\x8a\xb4\xda\x50\x3e\xcd\xe7\xd2\xd3\x86\xa4\xa4\x39\xc8\x70\x0c\x37\x82\x41\x10\x84\x91\xad\xea\x86\x6a\xb9\xc8\xd3\x23\x4f\xa3\xab\x10\xbb\x28\xe2\x09\x2a\x34\xc3\x31\x35\xc3\xf5\x74\x53\xf7\x34\xc3\xd5\x34\x63\x38\x5f\xe7\x7e\x7f\xc8\x19\x62\x57\xeb\x79\x7e\x8c\x24\x16\x12\x5c\x36\x1f\x08\x8d\xd1\x44\x1b\xaf\xe3\xff\xf3\x7c\x2e\x7d\xde\x64\x66\x9e\xa1\x86\xb1\xa9\xea\x9e\xe5\x59\x9e\x86\x4c\xd7\x42\x8e\xeb\x85\x11\x32\x43\x08\x61\x6c\xba\xd0\x53\x23\xd3\x08\x79\x6d\x5b\xf7\x34\x4b\x37\x0c\x47\x53\x6d\xdd\xd4\x1c\x6f\xd3\x89\xfd\x95\x25\xca\xe3\x7c\x2e\x3d\x6e\x82\x2c\xc3\xb6\x4c\xa8\x3a\x4e\xa0\x9a\xa6\xe5\x78\xa1\x66\x59\xba\x6d\xea\xa6\xa9\xc5\x81\x17\xe9\x26\x0c\x2c\xd5\x89\x60\x95\x5c\x43\x77\x3c\xd3\xd5\x5c\xcf\xf1\x34\xcb\xf2\x6c\xd3\xb5\xbf\x10\x5b\xbf\x57\xa8\xdc\xcf\xe7\xd2\xfd\x26\x13\x73\x4c\x0d\x6a\x9e\x16\x5b\xb6\x0d\x63\xe4\x9a\xa1\xa1\x3a\x81\xa1\x05\x9a\x63\x39\x6a\x1c\x23\xd7\x52\xa3\xd0\x08\x78\x72\x63\xcb\x56\x2d\xdb\x73\x0c\xcd\xf1\x34\xcd\x56\x55\x5b\xfd\x12\x32\xf8\x3d\x62\xe5\xe3\x7c\x2e\x7d\xdc\x48\xac\x78\x71\x10\xc1\x38\x30\xbd\x20\xb2\x0c\xe4\x20\xa4\xd9\x90\xc8\x46\xcb\xb3\x35\x4d\x87\x76\xa4\x87\x41\xec\xf0\x5c\x4d\xa6\x66\x5b\x8e\xe3\x98\xa6\x6d\x3b\xba\xe9\xd8\xe6\xe6\x74\x3d\xc4\xb0\x44\xf4\x6c\xc2\xae\xeb\xed\x8e\x75\x96\x24\xdb\x67\x10\xdb\x56\x48\xd7\xea\x68\xdf\xbe\xc2\x05\xa4\x57\x9d\xb9\x41\xad\xb9\xaf\x5f\xa4\xea\x6e\x2f\x2c\xef\x2e\x6c\xb0\xb9\x40\x5f\xec\xae\x1f\xec\xa6\x7b\x0b\xf8\xc3\x8f\x92\x09\x8c\xea\xab\xd5\x7f\xac\x9b\x85\xce\xed\xf6\x56\x8a\xd9\xec\x14\x5c\xae\x79\xdd\xdf\x5a\x3a\xce\xd1\x0f\x54\xd7\x5b\x09\x31\x8b\x69\xb3\xd8\xbf\xdd\xff\xee\x81\x23\xa0\xab\x40\xd3\x9a\x2b\x53\xcd\x7e\x41\x77\xee\x5a\x2b\x32\xee\xae\xd9\x5d\xaa\x2f\x3c\xb5\x42\x2a\x12\xdf\x39\x9a\x5d\xd1\xed\x05\x61\xef\xe0\x40\x10\x87\x60\xee\xdc\x0d\xea\x07\xd1\x45\xc0\x76\xd6\x70\x6f\xa7\x0d\x77\x22\x90\x6c\xa3\xad\x5b\xa6\x4c\x61\x81\x32\x5c\x05\x61\x9d\xee\xce\xdd\xca\xfe\x5a\x07\x5c\x70\xef\x80\x4b\x82\x53\x54\xed\xd3\x99\x2b\x83\xbb\x5f\xdb\x7d\x73\x70\x65\xa8\x6b\xe6\x96\xd5\xbd\xf7\x02\x4a\x55\x87\xab\x42\x8c\xcb\x97\x7a\xaa\xfb\x3c\x33\x7a\xad\x66\x46\x2f\xec\xcc\xe8\xf5\x9c\x19\xbd\xb6\x33\x55\xc8\x5f\xd9\xe7\x9f\x41\xa4\x9c\x5a\x20\x62\x75\x7f\x3b\x78\x07\x32\x65\xff\x10\x64\xca\x93\xca\x2e\xe3\xcc\xe8\x65\x9c\xfa\xea\xcf\x8c\x5e\xdc\x99\xd1\xbb\x39\x33\xe5\xd3\xe7\xbd\xf6\xad\x9c\x8e\x37\x36\x74\x67\x03\xa6\xc9\x5d\xc6\xf2\x53\x8c\x02\x58\xa2\x34\x69\xae\x97\xec\xa4\x28\xc6\x23\xc5\x2e\xd0\x64\xa1\x34\x52\x61\xf0\xb2\x4a\x73\x39\x85\x55\x85\xd1\x8a\x2b\x22\xc5\x5d\x92\xd1\x1b\x3d\x1a\xed\x96\x01\xb8\xf6\x86\x0a\x6f\x43\x81\x51\x17\x4a\xed\xeb\xac\xbf\x82\xe2\x2a\x0e\x19\x80\xde\x41\x39\x97\x17\xc0\x33\x8d\x0d\x4f\xd6\x9e\x0c\xde\x34\x69\x9f\x51\x63\xe7\xca\x92\xfa\xb4\x59\x73\x98\x2c\x1f\xda\x3f\x4e\xf8\xfe\x71\xd2\xde\x19\x2f\x31\x6a\x44\x8d\x0c\x92\x4a\x14\xd2\x67\x28\xaa\x6f\x45\x9e\xa6\xc4\xa9\x74\x49\x05\x2a\x09\x32\xf4\x84\x2f\x30\x9a\x76\x84\x41\xd2\xdd\x6a\x4e\xf8\x7e\xf0\xdf\x92\xc9\x34\x4d\xc2\x04\x57\x41\xe3\xff\x8f\xbb\x77\xe1\x6e\x13\xd7\xfa\xc6\xbf\x0a\xc3\xfb\xbc\x1d\x38\xa3\x30\x80\xf1\x35\x7f\x9e\xae\xd4\x71\x3b\x9e\x49\x6c\x4f\xec\xb6\x67\x26\xc7\x2b\x0b\x83\xec\x30\xc5\xe0\x02\x4e\x9b\x36\xfe\xee\xff\xa5\x1b\x08\x10\xbe\xa4\x9d\x73\x9e\xe7\x5d\xe7\xac\x69\x2c\x74\xd9\xda\xda\xda\xda\xda\x92\x7e\x9b\x7d\x20\xd1\x5f\xb5\x28\x1c\xd1\xda\x14\x48\xbc\xd6\x38\xb2\x36\xd1\x12\xf4\x5f\xee\xb4\xd8\x29\x9d\x16\xfb\xbc\x3a\xe7\x7a\xc0\x7a\xb7\x81\xf1\xd9\xc6\x09\x91\xa2\x6e\xb0\xcf\x26\xd7\x79\xf2\xfc\x16\x7d\x21\xcf\x64\x2d\xbe\x71\x94\xd9\xe2\x32\x73\xf1\x44\xb2\x22\x4d\xa4\xa1\xf3\x22\x8f\xe1\x67\xa5\x85\xfe\x40\xfa\xbe\xcd\x71\x92\xbd\x2a\x05\xf8\xeb\xab\xdf\x3f\xe0\xec\x44\x71\x47\xf9\x19\x70\x61\x44\x90\x8e\x2e\xb1\xa2\x74\x2a\x99\x71\x17\x84\x8c\xe3\xe7\x3e\xd3\x22\xbe\x96\x74\xfb\xd5\x93\x49\xc2\x65\xe0\xb3\x0b\x80\x3e\xd6\x8f\x31\x53\x74\x3e\x89\xcb\x5f\xc9\x10\xb2\x11\x4b\x8a\x31\x13\x6f\x49\x85\x73\x56\xb2\x59\x28\x89\xf5\x18\x89\x67\x1b\x3b\xf8\xd0\x8c\xd4\xa2\x12\xba\x0a\x24\xa1\x25\xc6\xf9\xf2\x05\xdf\xed\x43\x7f\xd0\x63\xb1\x00\xb8\xb6\xa2\x04\x47\x1c\x8b\x89\x4e\xb7\xc2\xd5\xc5\x32\x85\xf1\x3b\x1f\x7e\xaa\x89\x75\xcc\x9f\xa5\xc1\x7e\xe0\xc4\x7e\xfa\xf8\x1e\x13\xc9\x9c\xea\x2e\x49\x9c\x12\x79\xd2\xa8\x5c\xb1\xd0\x42\x8e\xeb\x46\xb1\xe7\x47\xa1\x16\x6d\x60\xf8\xda\x8f\x93\x74\x82\x24\xce\xde\x13\x1a\x8a\xe5\x51\xd4\x73\x24\xc5\xf8\xc3\x1d\x96\xd3\xe4\x16\x6a\xbe\x37\xc7\x75\xd9\x3f\xe8\x40\xf0\x89\x3c\xdc\x85\x9e\xfd\x83\xae\xee\xf8\x70\x5a\x68\x07\x42\x28\xff\x1b\xba\x89\xdf\x08\x62\xa2\x93\x6f\xe3\x0b\x17\xe3\x47\x48\x4e\x1d\xed\xc5\xd6\x5e\x1e\xa6\xe0\x88\x2c\x39\x91\x4f\x4f\xa5\x58\x97\xa8\xc0\x7b\x32\x69\xa7\x30\xed\x47\xeb\x4d\x14\xc2\x30\xd5\xfa\x41\x7c\xa8\x2e\x6c\x22\x6f\x83\x40\x93\x7e\x71\x12\xbc\x6f\xa7\x1d\x2c\x87\xc7\x24\x8f\xc8\xbd\x97\xaa\xac\xf6\x8e\x6b\xfe\xc7\x44\xca\x09\x90\xbc\x08\x12\x63\xfc\xde\x79\x80\x92\x23\x95\x08\xfa\xfe\xcd\x97\x5a\x74\x23\x1c\x01\x8f\x27\xc9\x0f\xff\xc2\xe8\x77\x9a\xf4\x9e\x36\xfe\xcb\xec\xfa\x8a\x35\x45\xc3\x84\xa6\xf8\x83\xcb\x6a\x7d\x29\x9f\x7a\x34\x15\xa8\x3b\x10\x70\x47\x53\x3e\x77\x34\x15\x08\x42\x2a\x71\x1a\xf8\x2c\x81\xa9\x3c\x9f\x83\x07\x1f\x7e\xfa\x7d\x0b\xe3\xc7\xd2\x36\x01\xab\xd6\x73\xbc\xba\xf8\xda\x9b\xa5\x12\x6a\x93\xcd\x02\x29\x79\x93\x24\xf9\x6f\xae\x15\xb4\x9c\xf6\x6f\x7e\x51\x54\x15\x4d\xde\x92\x88\xd9\xb1\xb6\x44\xc2\xae\xee\xb2\x43\x30\xa2\xf3\x7a\x32\xf9\x57\xde\xd1\x33\x2f\x7a\xe4\x65\xee\x39\xf2\xc2\x8e\x71\x52\x2f\xf6\x00\x8b\x20\xdf\xf8\xa9\x23\xef\xc1\x1c\xa2\x87\xa1\xb1\xef\x60\x4b\x3d\x80\xde\xab\xc7\x4a\xa5\xd4\x3f\x9e\x6f\x4c\x5f\x3f\x3d\x29\xaf\xe9\xc6\xf4\x2b\x9e\x89\x38\x68\xae\x93\x3a\x9a\x6f\x74\x42\xb2\x6c\xec\x76\xd4\x8d\xd0\x6e\x77\x1d\xd8\x35\xac\x85\x0b\x97\x66\xd3\xb3\xcc\xb6\xa9\xeb\x6d\x47\x5f\xa2\x1d\xab\xd7\xd5\x8d\x96\xeb\x2e\x5a\x2c\x46\x45\xa3\x63\x9a\xdd\x46\xa3\xd1\x31\xdb\x7a\x4b\xb7\xba\xba\x51\x3d\xa3\x12\x1e\x29\xf1\x3b\xe7\x37\x4f\x4f\xca\x9b\x3d\x04\x16\xc2\xd7\x51\x67\x4f\xb7\xd5\x6c\x9b\x8d\x6e\xc7\x30\x3c\xd3\x32\x8d\x16\xb4\x3a\x26\x6c\x7b\x6e\xb3\xd9\x31\x1d\xd8\x36\xf5\x76\xc7\xf5\xac\x6c\x0f\x6d\x76\x3b\x2d\xb3\xd5\xb1\xf4\xae\xde\x30\xbb\xdd\xe6\x29\x70\xa7\xb7\x0d\xc0\x2f\x80\xdc\xb2\x47\x97\x3b\x1e\x60\xe9\xf3\xc6\x09\x29\x3e\x57\x03\xe4\x76\xd6\xc1\x5d\xad\x5f\x82\x07\x01\x06\xb3\x2e\x4c\xe0\x80\x2e\x68\xd1\x2d\x9e\x59\x34\x24\x70\xc9\x2a\x2a\x03\x5d\xe8\xc9\x3f\x68\x5b\x51\x5d\xd2\xb3\xad\x49\x5a\x30\x0b\x9c\xd4\x41\x9b\x0e\x18\xba\xce\x26\xd9\x06\x58\xcd\xf4\xcc\x9d\x8a\x5f\xce\x35\xda\x9d\x4e\xfb\x28\xeb\xf7\xc3\xfe\x87\x29\xb1\xd2\xb6\xba\x3a\x32\xd5\x9e\x69\x14\xac\x60\xda\x0f\xfc\xfa\x4b\x2a\x72\xea\x84\x5f\xb6\x79\x18\x44\x59\xfe\x49\x81\xfc\x0d\xce\x97\x85\x5f\xbd\x50\x7b\xbf\xd6\xae\x9d\xd0\x59\x61\xed\xaa\x02\xf9\x8c\xf9\x70\xc8\x49\x7f\x1e\x72\x31\x2b\x88\x64\xe0\xa5\xcc\xc5\x6a\xe4\x3f\x00\x59\x92\xd5\x9e\x2c\xb3\xab\x16\xb7\xb7\xf2\xd9\xd9\xd2\x0f\xa0\x0c\xd8\x5d\x98\x89\x93\xde\xa3\x59\x7d\xf6\x20\x03\xb9\x25\xcf\xc5\x01\x4c\xfd\xa5\x02\x6f\x8d\xf9\xd3\x93\xbc\x20\x4f\x8b\x64\xdb\x46\x5a\x32\x5a\x4a\x28\x5d\x4d\xe3\x47\x6a\x4c\x86\xf0\x93\xf4\xf6\xe6\x0a\x67\x57\xcf\xd3\x9f\x6c\x9e\xb6\x5b\x7d\x0e\x64\xe9\xc7\xbc\x1b\xb1\x76\x1f\xc3\x25\x90\x7f\x94\xd5\x9d\xeb\xa4\xee\xbd\x12\xab\x5f\x85\x85\xb8\xae\xa3\x9a\x77\x3b\x15\x40\x0d\x7e\x4e\x61\xe8\xf5\x03\xbf\xbf\xf6\x6a\x6e\xc2\xd8\x50\xf3\x93\x09\xc6\x39\x1e\x2f\xfb\x98\x8b\xfd\xb5\x87\x18\xbf\xf6\xa6\x69\xfc\x93\x2c\xbd\x78\x21\xc9\x3f\xa5\xbd\x94\xfd\xc9\x3e\xed\x54\x90\x66\xeb\xc9\x0e\x98\xa6\xde\x38\xee\xdd\xff\x9f\x02\xb1\xfb\x15\xf2\x72\x47\x1f\x01\xa1\x5d\x57\xab\xad\x37\x74\xf2\x34\xc8\x6c\x34\x9b\xe4\x65\x50\xdb\x32\x5a\x6d\x15\x04\xc8\x60\x7d\x7a\x52\x02\xf2\x76\x6a\x3c\x99\x0d\x47\xb6\xec\x42\x7f\x33\xde\xa4\xc3\x50\x06\x81\x2a\x78\x1e\x4b\x5e\x4f\x05\x24\xfb\x51\x2f\x92\xfb\x83\xe1\x44\x1a\x4f\x66\x67\xc3\x91\xbc\x9b\xef\xf0\xdb\x23\x3a\x35\xb6\x76\xac\x74\xad\xae\xde\x54\xc1\xc6\xae\x74\x4b\x81\x36\x09\x0a\x87\xe9\x7b\x35\x1c\x5d\xde\x5d\x8e\x6c\x79\xe1\x87\xde\xe5\x08\xc9\x18\x4e\x9a\xbc\x27\x49\x93\xf7\x28\xa9\x7f\x35\x1c\x8c\x66\x77\xc3\x4b\x5b\x76\x03\x1f\x86\xe9\xd0\xe3\x92\xa7\x83\xfe\xcd\x60\xc6\x3e\x4d\xa1\x1b\xc3\x14\x7d\x1e\x8c\x2e\x27\xe3\x21\x2a\x37\xb1\x65\x18\x7a\x18\x17\x62\xb8\x29\x7c\x9a\x8c\x6f\x66\xf9\xc7\x49\x14\xe3\x92\x6f\x6e\xc6\x6f\x27\x77\xd3\xc1\xc5\x4d\xff\x97\xbb\x57\x17\xd3\x01\x26\x71\x85\x94\xd4\x14\x3a\xb1\x7b\xff\xca\x49\x20\xa1\xb6\x90\xf5\xf5\xf0\x6a\x36\xb8\x29\xe4\x7c\x8d\x63\x5c\x57\x72\x92\x1f\x17\xb3\x59\x31\x37\xd6\x83\x17\x69\x5a\x2d\x30\xc2\x4f\xc6\xcb\xf9\xd1\x84\x15\x66\x7f\x3b\x1d\xdc\x54\xb3\xbf\x4d\x60\xcc\xb2\x0f\x2f\x07\xa3\xd9\x70\xf6\x07\x7d\xf1\xe9\xe3\x60\xa4\xe9\x23\x79\xe7\x89\x3e\x5f\x73\x70\x03\xbe\xb7\xce\xc1\x06\xa0\x36\x9c\x4e\xdf\x0e\x6e\x08\x68\x82\x9f\x24\x5b\x18\xbf\xbd\xb9\x42\x1f\xae\x2e\x2f\x26\x77\x37\xe3\xf1\xec\xae\x7f\x61\xcb\x81\xe7\x6c\x6e\xa2\x28\xed\x5f\x90\xd8\xab\x50\x1b\x0f\x2f\xfb\xa4\xef\xd3\xbb\xfe\xd5\xc5\xf0\xda\x96\x23\xdf\x73\x71\xb7\x93\x7e\xe0\xf8\xeb\x2c\x17\x7b\x99\xce\xe7\x63\x78\x0b\x59\xce\x69\x7f\x3c\x19\x4c\x6d\x39\x71\xa3\x0d\xc4\xa4\xcd\x06\xd3\x19\xe5\x2e\x79\xab\x9b\xc2\x24\xe5\xf6\xa0\x34\x07\xe6\x4f\x9e\x01\x55\xcc\xbe\xe3\x4f\xe5\xb1\xdf\x26\xc8\x1a\x2d\x0e\x3d\x9f\x91\x8d\x7c\x9e\x2f\x1f\x78\x3e\x5f\x8e\x22\x91\xe7\xcc\x51\x24\x36\xc4\x83\xb1\x53\x54\xe0\xd5\xcc\xd1\x4d\x61\x64\xf6\x4d\x55\xa3\xf2\x34\x94\x0d\xb9\x74\x7d\x31\xba\x78\x33\xb8\x1e\x8c\x66\x55\x58\x86\x4d\x51\x32\x8a\x95\x26\xda\xef\x53\x3c\x3c\xd9\xd3\x58\x56\x25\xc3\x89\x28\x3e\x60\xdd\x70\xa2\x92\x15\xc1\x29\x05\x68\x84\x4d\x3e\xc3\xf3\xf7\xc0\x28\x41\x1a\x5e\x56\x33\x91\xf9\x5e\xc6\x21\xa0\x05\xc8\x47\xae\x10\x11\x11\x96\x8b\xfc\xe2\x3e\x0b\x64\x8d\x03\x5d\x20\xd8\x08\x38\xb5\x5c\x86\x97\x62\x56\x82\xa4\x55\xf2\x73\x8a\x88\xe5\x44\x13\x65\x2a\xb1\x0f\xa2\xbc\x48\x33\x89\x73\x4b\xe8\x13\x57\x84\xea\x50\x96\x19\xfd\x94\x2e\x47\x22\x54\x85\x0d\x53\xae\x65\xe6\xe1\x32\xfb\xd0\x1b\x36\xa2\x69\x91\x95\xbe\x98\x0e\x6a\x5b\xac\xce\x92\x0c\xca\x01\xff\xaa\xc9\x5a\x06\xad\x60\xbf\xb9\xec\x22\x2d\x7d\x14\x49\x02\x9d\x5d\x4b\x93\x58\x09\x67\x10\x16\x48\x3c\x50\xc2\xf0\xd5\xdb\x99\x10\x44\x63\x53\xa3\x97\xf9\x7e\x9d\x54\x43\xbe\x72\x14\xa4\xee\x50\x1d\xbc\x66\x66\x05\xd1\x4f\xa9\x7f\x21\x2e\x50\x54\x93\xac\x08\x4a\xc5\xa0\x21\x52\x1d\x6a\xc8\xa6\xac\x82\x0b\x45\x09\xad\x95\xb2\xf3\x1d\x98\x61\xcf\x72\xab\xd5\x55\xc1\x12\xd9\x12\x9d\x96\xde\x56\xc1\x1d\xb2\x7c\xda\xed\x46\x5b\x05\x2b\x64\xf9\x74\x3a\xdd\xa6\x0a\xee\xed\x58\xc1\x4f\xd0\x55\xb0\xce\x01\x8e\x2e\xec\x58\xe9\x34\x0c\xb3\xad\x82\x41\xfe\x12\x7a\x94\xbd\xaa\x7e\xc8\x7d\xd7\xd3\x8a\x87\x0c\xa4\x85\x3d\xbf\x0b\x95\x18\x40\x62\x7d\xa5\xf6\x16\x2a\x31\xe7\xe5\x8e\x39\xc8\x09\x6a\xec\xc7\x2a\x48\x35\x67\xb3\x09\x1e\xc9\x6f\x27\x5e\x6d\x91\x3d\x9e\xf0\x9b\x80\x38\xf7\x0c\x8e\xc3\x1a\x97\x60\x0c\x15\x0f\x2a\xb1\xb6\x89\xa3\x34\x4a\x31\x0a\x1b\x97\x1d\xd5\xad\x6a\xae\x13\x04\xb8\x19\x15\x44\x5c\xc0\x71\xb4\x5d\x62\xfe\x97\xc5\xd6\x0f\xf0\xfe\x49\x29\x46\xf4\x27\xde\x33\xb2\x6f\xc2\xd6\x7e\xf6\x19\xff\x72\xa9\x7b\xad\x84\xf3\x66\xa3\x66\xd8\x72\xf4\x36\xf5\x03\x3f\xf5\x61\x1e\x37\x1e\x67\xba\x76\x36\x8a\x2b\x88\x3e\x4e\x6a\xc8\x3e\x91\xfd\x28\x8c\xe9\xd7\xd7\x7e\x00\x87\xeb\x4d\x14\xa7\xd0\xfb\xc5\x09\xbd\x80\x85\x28\x87\x0f\x30\x2c\x7c\x05\x07\x6b\xc0\xd7\xdc\xf6\x55\x82\x33\xa8\x47\x47\x86\xdf\x1f\x80\x5d\xd4\xd7\x42\xa4\x75\x37\x0b\x09\x7e\xa1\x0d\xf3\x8b\xeb\x22\x27\x53\x9c\x1b\xc7\x4f\x4f\x0a\xb4\x07\x5a\xd8\xfc\xa2\xa4\xaa\xaa\x2a\xf1\xd3\x53\xaa\xee\x40\xca\x79\x9c\x06\x9c\xc7\x29\xad\x0d\xe2\x8d\x4c\x7e\x41\x04\xef\x01\x1f\xc1\xdb\x68\x12\x37\x90\xc1\xdc\x40\x02\x60\x7f\xb4\xd9\xca\x41\x5a\x3f\x7d\xfa\xa4\x3d\xac\x3f\x39\x31\xda\x0b\xae\x7f\x4e\xe3\x6d\x92\x92\xdf\x3f\xa3\x06\xb1\xe0\x60\x24\xf3\x78\x85\x8c\x70\xf9\x2e\x43\xa3\x2e\x42\xf2\x1f\x89\x9a\x5f\x04\x06\x66\x17\x0e\x29\x12\x3b\x05\x67\xe5\xf6\x36\x22\x18\xe8\xec\x6b\xfd\xc5\xec\xf9\x7e\x0f\xc7\xa0\x02\x80\x3a\x60\x67\x3d\x1b\x19\xfd\xc0\x58\x98\xe0\x47\xe9\xdd\x35\x62\xc4\xbf\x7e\x4c\xa4\xfe\x36\x49\xa3\x35\x8c\xa5\xc1\xe7\x0d\x8c\x7d\x18\xba\x50\x1a\xae\x37\x71\xf4\x80\x77\xe9\xd2\x24\x8e\x56\xb1\xb3\x96\x14\xbc\x8f\x92\x55\x16\x3f\x3c\xa1\x75\x90\x4b\x3c\x7e\x48\x22\x13\x22\x9d\x83\xc3\x81\x10\x1c\x97\x2c\x53\x1a\x49\x3e\xa9\x14\xdf\x90\xd8\xc4\x91\xb7\x75\x53\x02\xb1\xc9\x42\xf8\xe2\x1f\x4b\xff\x33\xfa\xba\x08\xe0\x3a\xd1\xa4\x57\x8f\x92\x7b\x1f\x45\x09\x8d\x0c\xb2\x71\xe2\xd4\x77\xfd\x8d\x93\x42\xc9\x0f\x25\x44\x10\xc0\x81\x47\x9c\x55\x0c\x21\x69\x98\x36\xb8\x76\x1e\x25\x37\x0a\x90\xc0\x49\x29\x74\xef\x43\xdf\x75\x82\x02\x99\xce\x22\xda\xe2\xb0\x25\x31\x0e\xd8\x19\x2d\x59\x51\x31\x71\xa8\x84\x14\xc3\xd5\x36\x70\x62\x69\xe1\x24\x7e\xa2\x49\xb3\x7b\x1c\x88\x31\xaf\x33\x73\xfc\x6e\x60\x9c\x44\x21\x09\x9c\x85\xb7\x2b\xcb\x47\xd4\x94\x26\xfd\x88\x46\x81\x1c\x56\x0d\xd8\x1d\x89\x7c\x68\x2c\x20\x4b\xaf\xa3\x58\x5a\x47\x38\x60\x16\x3e\x0b\xa6\x84\xa6\xf7\x90\x8d\x05\x90\x36\x01\x74\xd0\xce\x1c\x42\x49\x66\x15\x35\x81\xec\xe0\xeb\x09\xa4\xaa\x16\x90\xa5\x13\x66\x02\xa9\x87\x11\xc6\x13\xd8\xce\xbd\x62\x24\xa1\x43\x13\x1a\x2c\xa1\xcb\x0e\x16\x07\xd9\x55\x09\x2c\xbd\x0c\x38\x92\xbf\x18\x32\xc8\xee\x4e\x14\xb2\xe4\x70\xb2\x03\xf2\x7e\xd2\xcc\x1e\x55\x5a\x59\xa1\xfc\x3a\x49\x93\xf5\xd2\x40\x1c\x9b\x14\xc5\x02\xfb\xf2\x8f\x94\x6a\x61\xaf\x8f\xfa\x97\xba\x06\x07\x7b\xf1\x5a\x8b\x37\x0b\x46\xda\xdd\x1f\x60\xa4\xfd\x7a\x05\x46\x5a\xb2\x02\x0f\x18\x29\xf4\x01\x23\x85\x8e\xb4\xf7\x01\x78\xc0\x48\xa1\x23\xed\xd7\x5f\xc1\x48\xdb\x82\x07\xed\x7a\xf5\x1b\x77\x45\x00\x1f\x90\xa7\x68\xc7\x35\x46\xf6\x85\xd5\x6e\x99\x2a\x18\xe6\x48\x2b\x37\xc8\x00\x31\x4d\xa3\xa1\x82\x09\xb2\x3a\x9a\x7a\xb7\xa1\x82\x7e\x06\xa4\x02\x1e\x33\x78\x95\xdc\x40\xf8\x53\x74\x0c\x3e\xa0\xc7\xe0\x83\xc2\x35\xa0\x36\xa7\x4d\x18\x1e\xf1\x80\x9d\x15\xe3\x84\x2e\x27\xd4\xd9\xc3\xe4\x01\xff\xa6\x98\xdc\xea\x31\x8c\xb2\x90\x35\xb3\xd7\xb8\x66\x26\xc0\xfb\x86\x80\x0a\x66\x76\x39\x0a\xcb\xe2\xfe\x0b\x38\x03\x7a\xf4\x0e\x06\xf4\x6c\xbd\x82\x99\x6b\x87\xdb\x20\xd8\x31\x8a\x3b\x05\x8a\xad\x0a\x15\xa5\xa7\xdd\xb4\xd6\xf3\x01\x7b\xb9\x39\xc8\x50\x58\xc2\x6a\x53\xd8\xe5\xc7\x9d\xd8\x2f\x8a\x5a\x9c\xe0\xda\x98\x16\x99\xce\xfb\x80\x6d\x1a\x5d\x46\x6f\x8e\x6c\x93\x13\x4a\x90\x6d\xf2\x66\xae\x84\x8b\x45\xf5\x39\x70\x36\xbd\x80\x2c\x0d\xb1\xd7\x04\x47\x07\xe4\xee\xba\x69\xdc\xd4\xe1\x1a\xb8\xfc\xb6\x06\x8e\xbb\xf5\x28\x6a\xf8\xed\x77\x68\x78\x01\x25\x87\x5e\x24\x7c\xfd\xfb\xe5\x48\x8a\x62\x69\x38\x21\xeb\x5b\x16\x76\x2d\x8d\xdc\x28\xa0\x91\xe5\x6a\x48\xf9\xfc\x9d\x78\xc0\x6e\xbd\xa2\xc4\x65\xec\xac\xb0\x91\x5e\xd3\xe6\xc7\xbf\xa1\xcd\x8f\x5b\x18\x3f\xa2\x35\xd7\x59\x43\x7a\x3d\x53\xd4\xf4\x27\x91\xe8\x36\xf4\xef\x2d\xba\x1f\x84\xcd\x98\xdf\xbb\x99\x6b\x61\x33\xcd\xef\xdd\xcc\xeb\x67\x8c\xd7\x14\x7b\x0e\x25\x64\xa2\xe4\xb3\x70\x98\x72\xb2\x5b\x17\xff\x8d\xf8\x1c\x6b\xc6\xef\xcd\x73\x44\x27\xdd\x37\x55\x6b\x1a\x82\xb0\xb6\xa5\x1a\x6e\x52\x7e\x67\xdc\x24\xd6\xab\x3c\xbb\x87\x92\x1b\x38\xfe\x1a\xad\xf6\xd8\x80\x1b\x0f\x2f\xfb\xcc\x30\x8d\xa5\xe1\xa5\x94\x46\x1f\x20\xb5\x44\x63\xb8\x89\x61\x82\xe6\x0e\xb6\x0c\xb2\xc0\x8e\x4e\x9a\xc6\xfe\x62\x4b\x6c\x86\xdf\xb6\x0b\x18\x87\x30\x85\xcc\xaa\x23\x97\x7b\x73\xd6\x92\x77\xcc\x5a\xd5\x5e\xe0\x3a\x98\xfe\x8f\xe8\x20\x76\xa2\x27\x27\x76\xef\xd7\xe9\x78\x24\x39\x71\xec\x3c\x62\x79\xc1\x9d\x4d\x98\x31\xc5\x9a\xdb\xdf\xfb\x10\x96\x6e\x9d\x0d\xf0\x3d\x2f\x7e\x0f\x72\xdf\x94\x31\xca\xd6\x00\x5f\x0a\x33\x31\x48\x55\xc5\x1a\x26\xc6\x66\x36\xdf\xb2\x50\x05\x4d\xce\x56\x20\x79\x32\x8b\xb4\x55\x77\x0d\x39\x33\x14\xd8\x35\x64\x6c\x27\xa0\x49\xdd\xc1\x78\x43\x99\xfd\x5a\xbc\x88\x4c\x6d\x50\xbd\x00\xea\x82\xdb\xc7\xc0\x18\x06\x58\x80\x06\xa8\x1b\x59\xb3\x55\x99\xf8\xdc\xef\x92\x71\x8b\x3d\x40\x19\x8c\x88\x10\x31\x84\x36\x6a\x81\xab\x5a\x10\x14\xb3\x93\x65\x6b\x82\xcb\x63\xb2\xb5\xc0\xdb\x63\xb2\xb5\xc1\xe7\x63\xb2\x75\xc0\xc7\x03\xd9\x0e\x99\xd4\x58\x40\xba\x95\xc1\x37\x99\xed\x69\x66\xd3\xc5\x34\x2a\xc3\x6f\xd6\x5e\x43\xa7\xdf\x1b\x02\x01\x30\x2d\xd0\xc8\x64\xd3\xac\xdc\x45\xa7\xaa\xbc\x25\x16\x01\xb3\x0d\x3e\x7d\x93\x08\x98\x9d\x4c\x04\x1a\x46\x96\xd8\xad\x15\x01\x3c\x37\xf6\xaa\xe5\x86\x01\xe4\x3e\x3e\x56\x44\xf3\xb5\x60\xa9\xed\xd7\xd6\x99\x61\x75\xd4\x5e\x08\x13\x62\x56\x46\xa5\xd1\xa8\x8c\x4a\xc3\xda\x3f\x2a\x8d\xa6\x60\x54\x1a\x2d\xd0\xc8\x6b\x68\x8b\x47\xa5\xd1\x11\x8f\x4a\xa3\x0b\x3e\x7c\xd3\xa8\x58\x7a\x3e\x2a\x8d\x2c\xd1\xd8\x3b\x2a\x96\xb9\x6f\x54\xac\x46\x36\x2a\x09\x3e\xed\xfd\xfb\x46\x86\x1f\x21\xcb\xaa\xea\x51\xa6\x36\x1b\x99\xde\xb3\x5a\x95\x41\xb3\xda\xfb\x07\xcd\xea\x08\x06\xcd\xea\x82\x46\xae\x9d\x75\xf1\xa0\x35\x0d\xf1\xa0\x35\x4d\x70\xfd\x4d\x83\xd6\xcc\xf1\x97\x1a\xad\x2c\xb1\x0e\x7f\x89\x36\xda\x04\xaf\x8f\x50\x6c\xcd\x16\x78\xf3\x1d\x14\x5b\xb3\x5d\x19\x8d\x66\xa7\x32\x85\x9a\xdd\xea\xba\xa6\xef\x1f\x8d\x96\x91\x47\xc7\xa1\x9b\xe6\xbc\x6c\x43\x3c\x0e\x2d\x4b\x3c\x0e\xad\x26\x80\xf0\xe8\x81\xe0\x07\xa0\xd5\xca\x07\x20\x5b\xce\x5a\xed\xbd\xb3\xa6\xd5\xd9\x37\x6b\x5a\xdd\x3c\xde\x15\x33\x84\xb8\x69\x73\xb4\xa2\x6a\x57\x97\x8f\x76\x75\xf9\x68\x1f\x58\x3e\xda\x8d\x32\x97\xdb\xd9\x14\x6a\xd7\x2c\x1c\xed\x9a\x85\xa3\xdd\x06\xe9\xf3\xb8\xdc\xe6\x56\x8c\x4e\x96\xb8\x7f\xc5\xe8\xec\x5d\x31\x3a\x06\x90\xc9\x75\x86\xe7\xf2\x98\xfd\x8b\x2f\xea\x17\x2e\xdd\x0f\x18\x34\x20\x71\x87\x10\x87\x0f\xb9\x41\x5f\x0e\xcc\x93\xdd\xca\x40\x59\x7e\x4f\x67\x0a\xee\x1d\x8d\xce\x33\xa8\x22\x4a\xc5\xb5\x88\x52\x03\x76\xa7\xff\x88\x52\x3c\xe8\xd5\x29\xe5\x08\xd8\xd6\x70\x72\x37\xbe\xb9\x7b\xfd\xfb\xe5\xe8\xb4\xd2\xc3\x51\xff\xea\xed\xe5\x60\x7a\xf7\xf6\xe6\xea\xee\xf5\xcd\xc5\x9b\xeb\xc1\x68\xf6\xcc\x2a\x7e\x7f\x3b\xb8\xf9\xe3\x6e\x72\x71\x73\x71\x3d\x65\x55\x74\xeb\xd9\xcc\x6e\x23\x31\x2e\x13\xf3\x17\xb7\x6b\x1e\x2a\x45\x2e\x2a\xb1\x92\x44\xcb\xe2\x92\x8d\xfa\x92\x64\xcf\xc9\xca\x58\xdd\xff\xcc\xa0\x16\xfc\x70\x55\x22\x2b\x37\x75\xb0\x5f\xae\xc0\x97\xfd\x85\xb9\xeb\x40\x65\x97\x9e\xf3\xbd\x76\x83\x83\x2c\xaa\xfa\x70\x22\x39\x9e\x17\xc3\x24\xf9\x19\x3b\xa8\x9c\xd0\x93\x36\x51\x8c\xf7\xf8\x78\x9b\x98\x40\x77\x1b\x43\x89\x5c\xc2\x20\xe1\xd1\xf7\x6f\xda\x92\x7a\x22\x6b\x77\xff\x43\x02\xdf\x44\x5b\x61\x17\xd2\x84\x5b\xfe\xcd\xf7\xdc\x11\x5f\x8e\x70\x20\x79\x27\x94\x9c\xcd\x26\xa0\x8e\x54\x76\x40\x23\x39\xae\x1b\x6d\xc3\x14\xed\x6f\xa1\xe4\x46\x61\x88\x8f\x1a\xd1\x76\x1f\x6f\x8b\x13\x28\xb9\x31\xc4\x47\x31\x4e\x90\x48\x69\x24\x25\xf8\x46\x13\xae\x72\x9b\xc0\x98\x1c\xf7\x90\xcd\xb3\x26\x8d\xa2\xb4\xf0\xac\x17\x71\x1f\xf5\x97\x32\x35\x3f\x04\x73\x5c\x17\x26\x09\x25\x2c\x0a\x1f\xd7\xd1\x36\x91\x9c\x6d\x7a\xbf\x9f\xef\xb3\x13\x18\xd3\x31\x45\x8c\xa1\x7e\xf7\x02\xa3\x1a\x84\x51\x1b\x1a\xbf\xe7\x7f\x39\xbb\x04\x6c\x5b\x7e\xff\x39\x15\x44\x94\x33\xd4\xd9\x81\xc9\x26\xa7\x36\x51\xfc\x28\xa5\x31\x44\x26\x39\x8c\x89\xe7\x88\xb1\x61\x01\x57\x7e\x98\x10\xee\xd1\x8e\x92\x74\x27\x81\x52\xfa\xb8\xf1\x5d\x7c\xf6\xb7\x76\x52\xf7\x1e\x26\x64\x72\x7a\xd1\xda\xf1\x43\x09\xe9\x1a\x0d\x9f\xf2\xd1\x30\xa2\x3d\xc9\xe1\xbf\x79\x92\x1b\x44\x5b\x4f\xa3\x5f\x35\x37\x5a\xe3\xd3\xcc\x2d\x1a\x93\xd0\x46\xea\x2a\x01\x9e\x6b\xd3\xef\xe8\x4f\x94\xc5\xc9\xdd\x5b\x3c\x31\xfb\xc5\xf0\xee\xfb\xf2\x93\xb9\xc9\x90\xbc\x20\x72\x99\xb0\x30\x82\xdc\xd8\x4f\x61\xec\x3b\x84\x6f\xa5\x44\xc9\x09\x82\xe8\x53\x42\xd8\x99\x46\xd2\x06\xc6\xcb\x28\x5e\x93\xb3\x50\xb8\x5c\x92\x63\x34\x82\x1d\xb1\x5c\xfa\x2e\xdd\x54\xa1\x3a\x60\x52\x62\x28\x46\x01\x49\x9d\xd0\x73\x62\x2f\x93\x5c\x7c\xcb\x11\xb1\x70\xba\xf6\xd3\x7b\x89\x1c\x0b\x25\xa8\x59\x29\xc2\x91\x14\x12\x0a\x48\x81\xfd\xa8\x11\x19\x0d\x09\x7e\xdc\x3a\x01\xa2\x07\x97\xd2\xa4\x21\x11\x93\x62\xa5\xac\xdb\xf7\x0e\x3e\x51\xc6\x9d\x4f\x23\x89\xdc\x41\x47\x1a\x79\xf6\xdb\x1b\x80\x53\xc7\x92\x1f\x26\x29\x74\x3c\xa4\xb3\x79\x7f\x64\xa1\x07\x80\x8d\xf6\x18\x55\xc3\x82\xc3\x04\x01\x61\x4e\x81\xda\x0c\xf0\x84\x27\xda\x49\x4a\x75\x0f\xc3\x3c\xba\x25\x22\x2c\x04\x52\x94\xde\x23\x76\x90\x52\x99\xb7\x90\xf8\x97\xd7\x8e\x1f\x00\x69\xeb\x7b\x88\xdd\x80\x4d\x0d\xd7\x21\xe7\xe4\xc9\xc5\xf5\x05\x51\x1f\x23\x54\xf9\x5e\x09\x5b\x7d\xb3\xa2\xe3\x56\x00\xdc\xfb\xdc\xb1\x89\xd9\x4d\xed\xf5\x92\x73\x77\x9b\x20\x45\x54\x74\x7c\x0e\x43\xe9\xe2\x52\x82\xe1\x83\x1f\x47\xe1\x9a\xfa\x4b\xfd\x04\x99\xbd\x2b\x18\xc2\x18\xcf\xd8\x53\xfa\x76\xff\x9f\xd4\x46\x58\xf5\xfe\x87\xd5\x51\xad\x16\x2a\x12\x77\x50\x0d\xad\xff\x2e\x35\x84\x04\xc4\x83\x4b\x3f\x84\x54\xaf\x14\x08\x2b\xa9\x23\xa6\x2f\x32\x5c\x0f\x65\x0d\xd7\x0b\x18\xdb\x63\x75\x3f\xf9\x17\x7f\xb7\x8c\xe7\x52\x4c\xa2\xd0\x26\x10\x4f\xf1\x8d\xc3\x99\x7e\xd4\xed\xaf\x40\x6d\xa5\x01\xc9\x0d\x0f\xd0\x3c\xf8\x9e\x96\x59\x4e\x2e\xa7\xd4\xa4\x18\xba\xc8\x08\xc1\x3d\xf0\x13\x32\x25\xa9\x7c\x10\x16\xd3\xcc\x84\xcb\xc9\xbd\xbf\xa9\x56\x44\xc6\x8b\xd6\x44\xfb\xe6\xf9\x49\xea\x87\xab\xad\x9f\xdc\x43\x72\x33\x50\xba\x1c\x1d\xe8\xee\xe8\x6f\xed\x6e\x81\x4a\xdc\xdf\xfb\x28\xf0\x72\x95\xf4\x33\xe9\x22\xbe\x2a\xc4\x7a\x41\x92\x0e\x90\xfd\xf0\xbd\xc8\x96\x2e\xa4\xc9\xe0\x5a\x22\x37\x95\xa0\x27\xc5\x51\x94\x4a\xfd\x0b\x4d\x70\x01\x86\x6b\x7e\xfa\xdd\x9a\x7f\x07\x63\x7f\xf9\x48\x84\x9b\xad\x8a\x44\xd1\x2d\x1e\xd9\x4a\x8f\x43\xce\x4b\x0b\x98\xa4\x68\x81\x47\xdb\x1a\x6a\x97\xfa\x0f\x7e\xfa\x48\x6e\x87\x51\xca\x9c\x00\xa5\xa4\x28\xeb\x32\x8e\xd6\x98\xd1\xf7\x51\x92\x12\xe6\xcf\xf0\xbb\xb4\xfe\xd5\x10\x7b\x34\xb6\x21\x0e\x66\x1f\x85\x64\x9a\x3f\x20\x4a\x98\x35\x1c\xc3\x64\x1b\x60\xe9\x44\xa6\x4a\x0c\x97\x30\xc6\x57\x85\xa2\x30\x78\x3c\xc0\x9b\xf1\xf7\x57\xfe\xfd\x11\x27\x5a\x88\xa0\x6c\x2a\xa5\x11\xe9\x2c\xe6\x1f\x6f\x51\x15\x18\xb2\x5f\x96\x86\xdf\x9f\xe0\xf1\x5b\x01\xc1\x64\x32\x14\x28\x2e\x68\xdd\x13\x48\xbe\x81\xfb\x6f\x27\x1d\x3a\x5f\xb4\x6a\xcf\x17\xb3\xbb\x6b\x56\xd5\x0f\x4b\x53\xac\xcc\x59\xcb\xdc\xe4\x56\xee\x32\xcc\xbc\xe0\x56\x23\x73\xa7\xa9\xcf\x3e\x4e\x74\x4e\x77\x09\xb2\xc8\x04\x84\x30\x4b\xe5\x4e\x11\xd9\xbd\xb9\x66\x25\x3f\xeb\xac\x95\xf9\xc9\x8d\x66\x9e\xbf\x5d\xc9\xdf\xaa\xd6\x9f\x87\x79\xb7\x3a\x65\x17\xa5\x51\x38\x97\x21\x2e\x1f\x1a\x49\x20\x81\xb5\x7e\xf4\x83\xf7\xbc\x6a\x0e\x01\xf7\x9e\xf8\x99\x65\x97\xad\x99\x8d\xb8\x69\xd5\x9c\xf5\x35\x6b\xce\xfa\x5a\x60\xf3\x3c\x97\xad\x99\x33\xab\x99\x5d\x84\x33\x3b\xb5\x2e\x5b\x61\xe7\xbb\xd5\xb3\xb6\x03\xa7\x02\x8d\xca\xa9\x00\x77\xa4\x56\x73\x2a\xd0\xa8\x39\x15\x68\x34\xc1\x0c\x02\xab\xb6\xf3\x4d\xa3\xae\xf3\x8d\xfc\x54\xa0\x69\x66\x89\xf5\xa7\x02\x7b\x0f\x1c\x3b\xe5\xb9\xdd\xe8\x82\x66\xa3\x9c\xcd\xd2\x2b\xb3\xdb\xa8\x70\xcf\x3a\xe0\xed\xb7\x2a\xde\x7e\x2b\x3f\x30\xab\xf1\xf6\x5b\x35\xde\x7e\xab\x0d\x96\xcf\x13\x1d\x2b\xf7\xf6\x37\xb3\xc9\x67\xd5\x7b\xfb\x85\xc7\x4e\xd5\x79\xd3\x3c\x30\x6f\x9a\x95\x79\xd3\xcc\x78\xd9\xac\x99\x37\xcd\x9a\x79\xd3\x6c\x81\xbb\xe7\x75\xbe\xc9\xcd\x9b\x66\x96\x58\x3f\x6f\xd8\xe9\xd9\x9e\x03\x25\x1d\xc8\xe4\x95\x23\x7f\xc8\x71\x50\xee\x5a\x55\xf1\x69\x1d\x10\x9f\x56\x45\x7c\x5a\x99\xf8\xb4\x6a\xc4\xa7\x55\x23\x3e\xad\x36\x58\xed\xe3\x60\xfd\xe4\x6b\x71\xe2\x93\xe9\xfa\xd6\xfe\xc3\xa2\xf6\x5e\xbf\x6f\xdb\xe0\x8e\xe4\x8e\xe5\x61\xe1\x2c\xce\x2c\xcf\xe1\x76\x03\x34\x2b\x6b\x4e\xdb\x2a\xcf\xe1\x76\xb3\x7a\x88\x77\xe8\xc2\x4f\xbb\x72\x62\x97\xad\xce\xed\x9a\xe5\xb9\x53\xb3\x3c\x77\x0c\x70\xff\x3c\x31\xee\xe4\xd7\x7c\x9a\xd9\x89\x5d\xa7\xfe\x9a\x8f\x88\x6b\x9d\xaa\x7d\xd2\x69\xee\xef\x7c\xa7\x55\xee\x7c\x27\xbb\xb9\xdd\xe9\xd4\x74\xbe\x2b\xee\x7c\x57\x07\xeb\xe7\x75\xbe\x6b\xe4\x9d\xcf\x6e\x46\x76\xcd\xbd\x12\xd8\x6d\xec\x93\xc0\xae\x95\x1d\x57\x16\x9d\x6f\x47\x1f\x5b\xe2\x36\xaa\xd2\xd4\x3d\x20\x4d\xdd\x8a\x34\x75\x73\x5b\xaf\xd6\xd8\xab\xb3\xf6\x74\x03\x5c\x3c\x6f\x52\x1b\x7a\x2e\x50\x2d\x3d\x4f\x3d\x5e\xa2\x0a\xc6\x9d\x5e\x99\x69\x86\x5e\x65\x8e\xa1\x1f\xe0\x8e\xa1\x57\xd8\x63\xe8\x9d\xfc\x6b\x1d\x83\xea\xcd\x61\x03\x0c\x9e\x27\x73\x06\x77\xb1\xae\x65\xe4\xa9\xa7\x4d\x39\xc3\xa8\xce\x39\xc3\x38\x30\xe9\x0c\xa3\x32\xeb\x0c\x23\x7f\x30\x61\xd4\xcc\x3b\xc3\xa8\x99\x78\x86\xa9\x83\xd1\x33\xb9\x60\xe6\x53\xaf\x65\xe6\xa9\xf5\x73\x6f\xaf\x98\x98\x95\x2d\x93\x61\x32\x06\xb5\xb8\xb4\xea\xad\x4c\xc3\xcc\x78\x02\xc8\x22\x48\xf0\x4e\x73\xb6\x98\x75\x6c\x31\xeb\xd8\xd2\xd0\xc1\xc3\x33\x37\x4b\x0d\xb6\x98\xb7\x9a\x79\x1a\xdb\x41\xb5\xf2\x1d\x11\x32\x91\x53\xf8\x39\x75\x62\xe8\xc8\xa0\xd5\x3e\x76\x81\x33\x1a\x19\x5b\x72\xf1\x6f\x08\xd8\xd2\x68\x95\xee\x50\x91\x54\xd1\x65\x37\xc4\x2f\x64\xfc\x4a\xef\x06\x37\xc3\xd7\x7f\x90\xdd\x74\x7f\x3c\x7a\x3d\x7c\xf3\xf6\x06\x03\x2a\x71\x6f\x93\xa5\x9c\x7f\x8d\x3a\xfe\x59\x3a\x98\x9e\xce\xbf\xe2\x26\x32\xe3\x63\x3e\x3d\x90\x51\xcd\xde\xe2\xb4\xb1\x6a\xaa\x79\x8b\x33\x28\xe2\x5f\x66\xd7\x44\xb2\xc0\x4c\xd8\x3d\xf3\x78\xe5\x39\x9b\x3e\x76\x13\xd9\x3f\x54\xd3\x76\x19\x6f\x90\xb1\x5e\xcf\x1b\x4d\x13\xf9\x70\x6a\xfb\x45\xed\xdb\x75\xe4\x39\x81\x0c\xda\x06\xd7\x8d\xf8\x1a\x25\x8e\x37\x90\x86\xee\xe2\xfa\x04\xeb\x1e\x18\x99\x6a\xb5\x33\x70\x97\x37\xd7\x04\xf2\x7d\x43\x06\x6d\x33\xef\x4d\x0b\xc8\xbc\xa3\xac\xcf\x3b\xca\xe4\x2a\xc1\xec\x5a\x59\x3b\x97\x22\xab\xf2\x38\xcf\xb0\xd8\x0e\x32\xbf\xb5\x64\x34\x0f\x6c\x21\x8d\x66\x65\x0f\x69\x34\x73\x09\x6e\xd6\xec\x22\x8d\x66\xcd\x36\xd2\x68\x36\xc1\xf8\x99\xea\xac\x99\x6f\x24\xdb\xcd\x3c\xf5\xf8\x9d\x24\x21\xb9\x23\xe0\x42\xf7\x00\x17\xd0\xb6\xa1\xc4\x85\x56\xfe\x10\x84\x6d\x05\x2a\x5c\x60\x57\xef\x2a\x5c\x68\x59\x60\xf8\x4c\x2e\xb4\x72\x47\x4d\x3b\xd7\x55\x6c\xe7\x70\x04\x17\x08\xf5\x6d\x20\xff\x6b\xab\x37\x5c\x5d\xaa\xca\x53\xab\x53\x7a\xc7\xc9\x36\x0c\xa9\xbf\xc6\x68\xc3\x32\x68\xe7\xba\x9b\x6d\x17\xd8\x47\xf2\x80\x1b\xb4\x33\x4b\xd7\x68\x1b\x82\x1c\x67\xf7\xd0\xf1\x78\x1e\xb3\xdb\x77\xc5\x5c\x0c\x71\x96\xd2\xdd\x6e\x00\xb9\x4f\x9c\xc1\x55\xba\xdb\x96\xa8\x86\x22\x0c\x2d\xab\xa7\x09\xe4\x59\xe6\x96\xa4\x97\x13\x62\xe8\xb8\xf7\xce\xc2\xc7\xfe\x48\x89\xa3\xac\xc5\x3f\xcd\x35\xda\x7b\x57\x02\x52\xa2\x73\x90\x27\xdd\x63\x78\xd2\x11\xf1\xb6\xcc\x93\x8e\x01\xe4\x57\x7e\xe8\x55\x19\xd2\x11\xb2\x54\xc8\x10\xb4\x1d\x91\x72\x8e\x38\xdb\xf4\x1e\x86\x29\x75\x8f\xf3\xcc\x40\x1b\x11\x8e\x19\x9d\xe6\x41\x66\x74\x5a\x62\x66\x64\xbb\x01\xa3\xd3\x3e\x8a\x19\x22\xa6\x56\x98\x41\x6f\x8c\x4a\x04\xa7\xa8\xca\x93\xae\x90\xa5\x42\x9e\xa0\xad\x0b\xc7\x93\x7a\x77\x3b\xc7\x1e\xb4\xb3\xe1\xd8\xd3\x6d\x1c\x64\x4f\x57\x24\xb5\x05\x59\xe9\x36\x8f\x61\x4f\x57\xc4\xe6\x32\x7b\xd0\x16\x06\xef\x9d\xea\xf9\x23\xe4\xb2\x98\x3f\xdd\x02\x7f\xf6\x38\xf7\x73\x06\x99\x68\x3f\xc4\x41\x10\xe8\xc2\x5d\x4e\xd1\xeb\x2b\x92\x62\x9e\x41\x26\xdb\xf9\xec\x65\x90\xa9\x0b\xd5\x43\x91\x41\x26\xda\xf9\x5c\xfa\x89\x5b\xa3\x63\x4c\x5d\xc8\x65\x11\x7b\x4c\xb4\x1f\x92\xf2\xba\xc8\x01\x15\xa7\x6f\x0a\x5c\xe9\x14\xb9\xd2\x3d\xc6\x5a\x11\x72\x2b\x8b\x4f\xd0\xc9\x1f\xb5\x14\x22\x14\x18\x7b\xac\xb2\x5a\x03\x06\x83\x25\xbf\x2b\x59\x31\x38\x78\x01\xa5\x18\xed\xb8\xa6\x28\xd3\x5e\x3b\x0b\xdf\x0f\x16\xbe\x97\xce\x6e\x08\xe3\x51\xcd\x1f\x4c\x97\xef\x5a\xe6\x98\x78\x85\x1b\x9a\xb8\xaf\xf0\xc3\x5f\xd8\x46\x63\x07\x0a\x3f\x84\x5a\xe0\x39\x9b\x01\x2b\x82\x56\xcd\x3c\xaa\xa7\x5a\xb9\x51\x4a\x62\x13\x1c\x57\xca\xda\x4f\x26\x81\x06\xe4\x49\xec\x1e\x2e\x30\x79\x5f\x7f\xeb\xb4\x5a\xa2\x0c\xef\x76\x42\x63\x65\xc4\xb7\x42\xb3\xc6\xb1\x65\x99\x17\xb0\x50\xfa\x00\x5f\x2a\x78\x84\x27\x50\x5d\x41\x28\x3c\x85\x6c\x01\x00\x61\x55\x80\x8e\x2a\xce\x00\x09\x9f\x47\x79\x86\x96\x78\x4a\xeb\x45\x50\xc2\x42\xc9\xb6\xca\xdd\x87\xce\x36\x27\x38\xdc\x72\x69\xb6\xb2\x22\x07\x26\x18\x0f\x2d\x78\x42\x17\x0b\x90\x85\x95\x72\x8c\xc0\x69\xea\xa4\x10\x15\x67\xea\x13\x27\x68\xfd\xf1\x68\x34\xe8\x67\xf7\xdf\x71\x9f\xc6\x1f\xb7\x4a\x9e\x0f\xdf\xf3\x2e\xe7\x33\x8e\xa8\xfa\xd5\x70\x74\x79\xb0\x5e\x3e\xd3\x31\x95\x72\xa0\x6f\x07\xeb\x16\xe4\x3d\xa6\x09\x1e\x3f\xed\x60\x1b\xa2\xcc\xc7\x34\x72\x39\x9c\x1e\xcb\x7a\x2e\x2b\x77\xb5\x7d\x52\x7d\xea\x3b\xe3\x03\x4c\x64\x07\xf2\xc5\xad\xa8\x59\x79\xca\x4b\x17\xf0\xd8\xf1\xfc\x88\xdb\x80\xe1\x48\xf3\xd9\xf9\x7c\x9e\xa3\x8c\x12\x93\xef\x89\x72\x5f\x5b\xc5\x0f\x87\x96\x63\xfc\x7c\xba\xde\xc9\xbe\xaf\x8d\x6e\xde\x06\xe7\xd5\xac\x3a\xfb\x80\x4c\x2f\xc4\x1f\xe5\x71\x60\xff\x12\x5f\x1f\x08\x21\xe8\x98\xc0\x68\x00\x39\x5c\xf1\x7c\x68\x65\x79\x1a\xe0\x06\x02\xd3\x68\x00\xb3\x23\xcc\x44\xae\x4e\x54\x9f\xe0\x64\x2f\x70\xcc\xd2\x7a\x17\x6b\x7e\x32\xa4\x48\xaa\x39\x28\xf3\xd8\xf7\xdc\xba\x15\x52\x5c\x02\x69\x1a\x1a\x83\xa2\x0f\x6d\x99\x4a\x8b\x0c\x1e\xa1\x8d\xb1\x1a\x65\xf0\x27\xb4\x65\x6e\x3a\xc8\x60\x01\x6d\x99\x97\x5d\x19\x5c\x41\x5b\xce\x45\x4d\x06\x97\xd0\xbe\xed\x43\xf0\x08\xc1\x9f\x10\x2c\x20\xb8\x82\x73\xf0\x16\xda\x72\x18\xa5\x67\xd8\x26\x81\x9e\x0c\x3e\x43\x5b\x4e\xb6\xf8\x42\xb9\x0c\x3e\x42\x5b\xa6\xeb\xff\x27\x68\xcb\x9b\x38\x42\xe9\x7e\xb8\x92\xc1\x07\x68\xdf\x16\xd0\x3d\x79\x0c\xcf\x32\x54\x67\x86\xc2\x29\xc2\xce\x14\x62\x70\xce\xc1\x35\x6e\x80\x87\xce\x2c\x83\x63\xe6\x68\x96\x62\x48\x47\x21\xf6\xa4\x18\x65\x72\x0e\x5e\xe3\xe6\x18\x94\xa6\x18\xee\xb2\x06\x72\xb2\x16\xe2\xb1\x1e\xb9\xb1\x16\x57\xb2\x04\xd4\x58\x81\x61\xac\xa0\x2b\xce\xc1\x1b\x68\x7f\x45\x8b\xda\x1d\x32\x7b\xee\xbc\xb0\x97\x61\x29\xe7\xa9\xec\xf1\x42\x2f\x03\x55\xc6\xdf\xf0\x5a\x7a\x47\x76\x19\x77\x0b\x27\x81\xb8\xb8\x00\xe7\xb8\x9a\x9b\x1c\x13\xf5\x44\x50\xc7\xd5\xcc\xe4\x87\x93\xa6\xc5\x02\x1c\xda\x71\xb5\x0c\xb2\x86\xaa\x45\x72\xc0\xe3\x6a\x09\x64\x4d\x55\x4b\xe4\x98\xc7\xb8\x44\x1c\x45\xe9\x9d\xeb\xf4\x2a\xe0\xc4\xf8\x2b\xae\xa2\xcc\x8f\x2a\xf6\x6f\x25\x2f\xe3\x46\x15\xfe\xb7\x92\x95\xeb\x97\x08\x02\xb8\x92\x9f\xdd\xbe\xde\x93\x1d\xd9\x0b\x84\x15\xbd\x32\xdc\x71\xfe\x1d\x95\xee\x15\xc1\x8e\x77\xe0\x0f\x58\x0d\x15\x73\x02\x0c\x26\x04\x21\x29\xe5\x9f\x57\xf1\x30\x15\xdf\x4e\x39\xa8\x4a\x55\x73\x36\x3e\x79\xb5\x6d\x43\xe0\xb3\x47\x66\x7e\x14\x52\xcc\x4a\x3b\x04\xbe\x76\x57\x75\x55\x1b\xc0\xa7\x21\xfe\xed\xdb\x39\x03\x74\xff\x00\xc1\x35\x04\xaf\x71\xd0\xa0\xc2\x3a\x6c\x7f\xdd\x71\x49\x78\xbd\x25\x49\x5b\xa4\xb7\x86\x39\x8e\x35\xa9\x18\x87\x96\x99\xf1\x15\x28\x2a\xf0\x45\x98\x9d\x2e\x06\x3f\xf3\xbf\xc0\xd7\x18\x05\xb0\x82\x16\x99\xc7\xd9\x39\x2f\xc0\x54\x8e\xc3\xe1\xe6\xb5\xb3\xf6\x83\x47\xe2\xe5\x56\x0a\x5a\xf3\x76\x8e\xfe\xcf\x55\x03\x35\x3f\x79\x4b\x48\x2d\x2f\x0a\x2f\x5e\x28\xb0\x76\x7d\x79\x09\xb5\x04\xa6\x48\x93\xbe\x63\xaf\xf7\x12\x45\xed\x89\x0b\x20\xf6\xbe\x78\x81\x4b\x20\x75\xc3\x97\x40\xdb\xd0\x22\x64\xa8\xb6\x82\xa9\x52\x42\x85\x56\x35\xdc\x7f\xd2\xa3\x44\xdb\xf8\x1b\xa8\x28\x3a\x18\x6a\x9f\x55\xa5\x08\xa1\xc8\xb0\xec\xa7\xe3\x91\x46\x2e\x90\xfb\xcb\x47\x05\xaa\xb6\x6d\x97\xd2\x52\xd4\xb4\xa2\x83\x50\xbb\x51\x09\x7c\xe7\x36\x4c\xb6\x8b\xc4\x8d\xfd\x05\x54\x55\x2d\xfb\x3b\x6f\x21\xc5\xfc\xca\xc6\x74\xf6\xb8\x81\x76\x0a\x0e\xb1\x30\xef\xd9\xda\x89\x3f\x5c\x24\x13\x18\x7a\x7e\xb8\x52\x54\xb0\x87\xbd\x0a\x44\xe4\xc0\x94\xe3\xd5\x35\x44\x25\x04\x5c\x27\xa9\x14\x87\x12\x03\x67\x4f\x9d\x25\x0c\x1e\x95\xf2\xba\x28\xcb\xea\xbe\x21\x12\x35\xfa\x81\x35\x5a\x19\xb8\x9e\x20\x37\xa4\x33\x07\x95\xf1\xfc\xc4\x89\xd7\x78\x9f\x51\x19\x4e\xf4\x3d\x25\x51\xe5\xa7\xc5\x18\x5b\x54\x68\x73\xb9\x60\x72\x5d\xca\x47\x63\xd2\x27\x0a\x81\x2d\x4f\x7a\x07\x17\xef\x7c\x16\xcc\x77\x39\x28\xeb\xff\x58\x68\x5c\xef\xdb\xa0\x71\xbd\x7a\x68\x5c\xef\x9b\xa1\x71\x0f\xd6\x70\x24\x34\x2e\x8d\xad\xc5\x6b\x3a\x2e\x64\x56\x14\xa2\x31\x9f\x32\x4b\x51\x8c\x97\x5b\x51\xb3\x79\xe4\x31\x18\x78\x78\x32\x28\x45\x0c\x7b\xda\x6a\x79\x1a\x8b\x8b\xf1\x42\x2b\x2a\xf7\xf4\xa4\x88\x6a\xcb\x71\xeb\xc9\x20\xd4\xcc\xce\x22\xf2\xbd\xa0\x22\x95\x43\x0f\x2e\xcf\xfb\x3a\x8e\xc4\x30\xd9\xe2\x58\x55\xd9\xd4\xe3\xd4\xff\x48\xfb\x30\xd4\xd8\x45\x1b\xc0\x07\x4a\xcb\x17\x46\x2d\x8c\xde\x67\xf0\x25\xe3\x70\x10\x7a\x59\x18\x34\x9f\x2e\x2d\xb6\x6d\xaf\xb5\x89\xaf\x0d\x27\x0f\xd6\xcb\x9a\x5a\xfc\x04\xd3\x3a\xdc\x8c\xe3\xd7\x1f\xbd\xf0\xbd\x9f\xde\xff\x92\xa6\x9b\x64\x42\xf1\xf7\x14\xb5\x77\xa8\xe4\x43\xab\xb6\x6c\x1d\xed\x7e\x32\xc5\x1a\x1e\x15\x89\xb6\xe9\xdb\x38\x78\x4d\x51\xf7\x8e\x2e\x83\x43\x65\x4d\x9c\xd8\x59\x27\x8a\x3a\x07\x4c\x32\xa6\x68\x26\xe5\xa2\x91\x33\xd5\x43\x7a\x95\x64\xfb\xb8\xf5\x61\x1a\x3c\x66\xd3\xa3\x34\x12\xf9\x8e\xe5\xf9\x03\x51\x47\x50\x5e\xf7\xc9\xf4\xd0\xd5\xe1\x5b\x68\xca\x5a\xac\xb4\x41\x77\x62\xdf\x2a\x79\xa2\x51\xeb\x47\xeb\xb5\x33\x85\x1b\x88\x81\xf2\xae\xfc\x24\xad\x67\x0f\x25\xe3\x78\xde\x54\x37\x8e\xc5\x2e\xd4\x35\x54\x2d\x77\x62\x9b\xa5\xe0\x10\x27\xb4\x5a\x2a\x29\x68\x97\xd7\x26\xc5\x05\xfd\x28\x0b\xb3\x44\x2e\xbf\xde\x1e\x47\x26\x5f\xe2\x78\xb6\x14\x57\xf2\xff\x80\x0e\x43\xc6\x91\x22\xb4\x52\xb9\x0e\xa9\xc7\xe8\xb3\x23\x6b\x3a\xc8\x3f\xcc\x89\xe3\x39\xc8\x1c\x17\xb7\xfb\x66\xaa\xc0\x7b\x71\xdc\xa8\x0a\x0a\x1e\x4f\x9a\x30\x08\xc7\xe9\xed\x66\x45\x8f\x6f\x59\xe4\xc3\x39\xae\x61\x51\x49\x51\xbb\xaf\x61\x35\xe0\x57\xbe\x47\x81\x65\x92\x52\x34\x3e\xb0\xdc\x5c\x4a\xab\x86\xf9\x2c\xce\xe7\x71\xc9\x00\xaf\x8f\xf3\x86\xa7\xb1\x80\x1c\xc8\xc5\x36\xe7\x2d\x76\xc8\xb7\x92\x46\xab\x55\x00\x73\x2b\xeb\x68\x63\xec\x07\x61\x32\x10\xa6\x92\x39\x58\xbf\x21\x62\x96\x54\x65\xf7\xb3\xd7\xc4\x12\x6c\x80\x6a\xdb\xc1\x7b\x20\x56\x5b\x79\xbf\xd3\xfb\x9b\x0d\xbd\x1e\xdb\x82\x16\x36\x54\x44\x55\x90\x3d\x55\x36\x1c\xb5\x47\x9c\xc2\x4d\x0c\x19\xdc\x43\x2a\x87\xa8\xad\x17\x2f\xf6\x67\x44\x6a\x87\x66\xe5\xa3\xf1\x96\x5c\x1a\xfb\xd7\x92\x4b\xf1\xa4\x80\x45\xbf\xca\x6d\x3a\xb7\xdf\x42\x00\x8b\xae\x15\x94\x4a\xf0\xbd\xb3\xe6\xdd\x38\xda\xe4\xee\x9b\xbd\x4d\x83\xd4\xfe\xba\x63\x9e\xa3\x31\xc6\x5f\xd0\x60\x98\xc6\x3e\x4c\x94\x37\x50\xad\x92\x15\xb3\x73\xee\x7f\x2a\x31\x0e\x28\x69\x87\xb7\xfa\x1c\x44\x76\x78\x6b\xcc\xcf\x61\x89\x4f\x91\xfa\x32\xbd\xf5\xe7\x76\x35\x9d\x78\x2f\x9e\x9e\x64\x39\x0b\x3e\x1b\x44\x2b\x45\x7e\x8b\xe3\x2b\x48\x69\x24\x2d\x7d\x1c\x36\x01\x06\x5e\x4f\x92\x7f\x8a\xf0\xee\x57\x23\xbe\xb9\x38\x20\x91\xcd\x92\xde\xcf\x3f\xcb\x3f\x1d\x35\x90\x5b\xf8\x93\xdc\x3b\x94\x37\x1b\xcb\x2d\x04\x69\xc6\x4e\xf2\xb8\x98\x42\x33\x55\x95\x09\x53\x5d\x2f\x15\x1a\x3f\xf7\x25\xfd\x57\x5b\xc3\x24\x71\x56\xb0\x87\x86\x47\x7d\x7a\x82\x2c\xe1\xe9\xa9\xec\x8b\xc1\x31\xfe\x81\xa5\xf6\x64\x99\x8b\x8d\x22\xb8\xa3\x50\x2b\xce\x8a\x0e\xc6\xda\xfa\x0d\x71\xdb\x80\x87\xc8\xf7\x24\x9d\xfd\xf3\x9b\xa2\x62\x3f\x8b\x52\x08\x92\x89\x95\x20\x88\xd9\xe0\xa3\x4c\x9f\x62\x67\x53\xd0\x83\xcb\x28\x56\xce\xcf\xd5\xe4\x93\x9f\xba\xf7\x0a\xd4\x36\x31\x7c\xb0\xa1\x16\xc2\xcf\xa9\xfa\x15\xc3\x66\xe8\x3d\x7e\x3a\x09\x7d\x79\x44\xd3\x6a\x45\xa9\x54\x54\xc0\x8f\x7b\xd9\x11\x45\x18\xd2\xc1\x5e\x11\xdc\x68\x83\xa8\x88\xe2\x84\xe8\xc3\xb9\xfd\x09\xcd\x08\x44\x90\xdd\x26\x59\x32\x1f\x67\xf1\xc8\x38\x84\x6e\xaa\x7c\xe5\xc0\x7f\x7a\xe9\x4e\xd5\xd2\x68\x12\x47\x6b\x3f\x81\x8a\x7a\x8e\xfb\xd3\xee\xc5\x36\xd4\x12\x18\xa6\x75\x0d\xc6\x2f\x5e\x28\x86\x6d\xdb\xb1\xe6\x46\x1e\x7c\xf9\x19\xf6\xde\x62\x87\x10\xa6\xc1\xb0\xce\x17\x31\x74\x3e\x90\xca\x0c\xa3\x47\xc9\x37\x0c\x34\x6f\x75\x1b\x6a\x24\x5e\x66\x63\x6f\xf7\x51\xd6\x9c\x03\x35\x74\x7c\x84\xc5\x2f\x44\x1b\xa0\x2f\x99\x90\x53\xa9\xc5\xf5\xd1\xfe\x19\x56\x2f\x5b\x6b\x09\x65\x96\xa8\x81\xc7\x02\x67\x8d\x4e\x3d\x6b\x5f\xf9\xa1\xa7\x08\x18\x69\x74\xf6\x72\xf2\xf1\x10\x27\xcd\x26\xcf\x49\xd3\x64\x9c\x34\x4d\xc4\x49\x23\xe3\xa4\x61\x1d\x62\xa5\xb1\x97\x95\x8f\xb5\xac\x7c\xac\x61\xa5\x41\x7b\x68\x36\x4b\xac\x34\x9b\xa2\x06\xfe\x2c\xb0\xd2\xec\xd6\xb3\xf2\x6d\x76\xba\x20\x62\xa8\xd9\xdd\xcb\xd0\x3f\x0f\x31\xb4\xd1\xe2\x19\xda\x68\x30\x86\x36\x1a\x88\xa1\x66\xc6\x50\xb3\x79\x88\xa1\xe6\x5e\x86\xfe\x59\xcb\xd0\x3f\x6b\x18\x6a\xd2\x1e\x36\x5a\x25\x86\x36\x5a\xa2\x06\x16\x05\x86\x5a\x7a\x3d\x43\xdf\xe4\x67\x50\x22\x8e\x5a\xfa\x5e\x8e\x2e\x0e\x71\xd4\x6a\xf3\x1c\xb5\x2c\xc6\x51\xcb\x42\x1c\x6d\xe4\x93\xbd\x75\x88\xa3\x8d\xbd\x1c\x5d\xd4\x72\x74\x51\xc3\xd1\x06\xeb\x61\xbb\xc4\x51\xab\x2d\x6a\xe0\xaa\xc0\xd1\xa6\xb1\x47\x91\x06\x51\x02\xa9\x36\xc5\xcb\x4f\x95\xab\x4d\xa3\x57\xd3\xc4\xe7\xbc\x89\x02\xe7\x9a\x19\xe7\x9a\x98\x73\x56\xc6\x39\xab\x7d\x88\x73\xd6\x5e\xce\x5d\xd5\x72\xee\xaa\x86\x73\x16\xeb\x45\xbb\x87\xfe\x95\x61\xe8\xc9\x39\x0f\x93\x34\xda\x60\x77\x2c\xa9\x13\xdc\xde\x36\x80\x61\xcc\xc1\xad\x61\x01\xd3\x9c\x83\x5b\xb3\x09\x1a\x8d\x39\xb8\x6d\xb4\x80\x65\xcd\xc1\xad\xd5\x06\x4d\x6b\x3e\x57\x77\x9c\xdb\xb2\x7c\xbe\x26\x83\x15\x4c\xeb\x0c\xd4\xca\x69\xdc\x0e\x24\x7c\x6e\x48\xf7\x19\xd5\x53\x3b\x08\x6a\x97\xe4\x8c\x14\xef\x31\x74\xd6\xbe\xcb\x1d\x22\xec\xb5\x16\xf7\x7b\x83\xc1\x0f\x7a\xb6\xd8\x97\x33\xf2\x5e\x0e\x94\x2d\x3c\x90\x0d\x6f\xe6\x51\x46\xbf\xa6\xe1\xdc\xd7\xf8\x83\x9e\x3f\xb3\xb1\xed\x7c\xfb\xf1\xe2\x85\xff\x52\xc6\x17\x64\x32\xb8\x32\x6c\x49\xfa\xbd\x2c\x1b\xda\xd0\xbc\x78\x91\xbe\x94\x0b\xf8\x2d\x24\x5b\x8a\xed\x45\x25\x44\x26\xaa\xda\x8b\x8b\x81\xe4\xbf\x4b\xf8\x3a\x76\x64\xe0\x06\xd0\x89\xdf\x86\xdb\x04\x7a\x28\x8b\x72\x28\xaa\x9d\xc7\x59\xfa\xc5\xa2\x47\x78\xac\x6a\xcf\xe5\x98\xdb\x1e\x57\x89\x79\x3d\x75\x1e\x28\x45\xc2\xd3\x02\x9c\x91\xdf\xda\x89\xe5\x41\xb0\x43\xc4\xf6\x30\xd8\xbb\xb7\x7d\x7a\xfa\x70\xc0\x51\x50\x6d\x3e\x45\x0d\xee\xf6\x54\x8c\x26\xc7\xd3\x53\x7e\x82\x4d\x8e\xaf\x9f\xd9\x4c\x36\x06\x75\x5d\xd8\x3b\xad\x4b\x1c\xe1\xc4\x76\x6f\xbd\xa8\x07\xcf\xa8\x17\x89\x37\x57\x6f\x8d\x04\xec\xad\xb8\xec\x9a\x10\x05\x56\x84\xfc\x24\xb1\xe5\xf1\x86\xdc\x98\x0f\x1e\xa5\x64\x03\x5d\x7f\xc9\x62\xc6\xa5\x8f\xd2\x9a\x6b\x15\x8a\xe2\x31\xe6\x63\x10\xc2\x4f\x4a\xfa\xf4\x04\x55\x65\xa0\xfd\xd1\x68\x29\x37\x5a\x30\xc1\xd7\xc7\x1a\x2d\x65\xa2\xdd\xa8\xea\x2e\xab\xa1\x1c\x9a\x11\xd6\x86\x66\x64\x84\x1c\x0c\xcf\x68\x92\xf0\x8c\x16\x0b\xcf\x58\x61\x8f\x20\x5e\xa3\x1b\x38\x49\x22\x03\xd9\x09\x60\x9c\x4a\xf8\xbf\x67\x9e\x13\xae\x60\x2c\x03\x39\x8e\x02\xc8\xbe\xc9\xc0\x02\xe4\x12\x1a\x2a\xe6\xc4\xbe\x73\x16\xc0\x07\x1c\x12\xd1\x94\x81\x01\xe4\x75\x7a\x66\xe9\xcf\x0e\xdd\x38\xc3\x3e\x2a\x12\xb8\x91\x46\x6a\x2c\x44\x11\x17\xc4\x6a\x2c\x7c\x6f\xa0\x0a\xf1\xb3\x40\xb4\x92\x71\x94\x16\xfb\x60\x64\x7f\xc9\x85\xbe\x12\x42\x49\x92\x9f\xc2\x75\x52\x49\x91\x01\xda\xe5\xa6\xbe\x5b\xfc\xe2\x46\x61\x76\x5d\x11\x35\x97\xdc\x3b\xb8\x77\xf0\xb3\x1b\x38\x24\x22\xe1\x99\xeb\xc7\x2e\x22\xa2\x50\xaa\x50\x4d\x0a\x3f\xa7\x3c\x6f\xd8\x8b\x01\xca\x67\x1a\x7a\x12\x1b\x34\xb8\x1a\x97\xfc\x85\xaf\x6e\xfa\xee\x87\x7c\x48\xee\x7d\xcf\x83\x61\x1e\xf4\x92\x91\x43\x0a\x14\x87\xa3\xc3\x62\x5c\x0e\x43\xf2\xb2\x4c\xe6\x49\xc0\x37\x31\xf9\xc1\xe0\x03\xbe\xa3\x52\x37\x34\x03\x17\x69\x33\xc2\xaa\x44\x38\x54\x5c\xe9\x6f\x6c\x24\xc0\x7a\xe5\x98\x46\x0a\x42\xda\x90\xe7\xe0\xbf\x82\xc8\x75\x02\xff\x0b\x54\xfe\x78\x7a\x52\xfe\xb0\x7d\xa8\xdc\xca\xbd\x6c\xa2\x23\xf2\x25\xfc\x28\xe5\x5f\x5b\xd3\x32\x96\xce\xc2\x81\x8b\xb6\xe3\x2e\x2d\xb3\xe1\x75\x9a\x4e\xb3\xdd\x69\x2c\x3c\xcf\x69\xe9\x9e\x6e\x5a\x8e\xd3\x6a\x41\x7d\xd9\x74\x9a\x24\x77\xbb\xdd\x31\x3a\xad\x6e\xb7\x6b\x9a\x1d\xab\xd5\xb0\xba\x4d\xab\x47\x2e\xbd\x32\xf5\x25\xe5\xfa\x4b\x9a\x46\xdb\xd8\x85\x92\x3c\x57\x55\xb5\x30\x65\x08\x17\xcf\x70\xf0\xd0\x7c\xbc\xd0\x4f\xf6\xc2\xb0\x30\x8c\x7c\x70\x52\xbe\x83\xef\x9e\x9e\x94\x77\xe5\x0e\x12\x98\x77\x69\x1b\x07\x12\x2e\x41\x08\x37\xa0\xe1\x18\xcb\x46\x1b\x36\x75\xab\xb9\xec\x74\x5c\x68\x36\x3c\x6f\xd9\x6a\xb7\x5a\xce\xa2\xdd\xf2\x3c\xc3\xd3\x3d\x6b\x41\x99\x62\xea\x9d\x96\xd5\xb0\x8c\x8e\x6e\x34\x8c\x6e\xc3\xd4\x8d\x6e\x4f\x92\x81\xdc\x1b\x8e\x66\x83\x9b\xc9\xf8\x0a\x3f\xfb\x25\x49\xd3\xd9\xc5\xcd\xec\x6e\x76\xf1\xe6\xae\x7f\x75\x73\x37\x1b\x8f\xaf\x66\xc3\x49\xaf\xfa\x65\xd8\x1f\x8f\x70\x72\xff\x6a\x3c\x1d\x54\x93\x85\xf5\xdc\xf5\xc7\xa3\xd9\x60\x34\x2b\xe5\x98\x4e\x2e\x46\x3d\x69\x4a\x95\xb8\x13\xb2\x4e\xbf\xbd\xb9\x22\x60\xad\xbf\xcc\x66\x93\xa9\x20\x8c\x5c\xa1\x79\x5c\x4b\x95\x22\x51\xd3\xc2\x1c\x3d\x34\xb0\x40\xfe\xd7\x76\xb9\x5c\x7a\x3a\xf9\x47\x66\xbf\xff\x4f\xb7\x9c\x60\x94\xb3\xfc\x5c\x4d\xfa\x87\x61\xf4\x0c\xf2\x27\x2b\xc5\x7e\xe7\x15\x99\x95\xa4\x9f\x85\x69\xa5\xaa\x7e\xe6\x2a\xe7\x72\x31\x3a\xd5\x6c\x32\xf9\x0f\x58\x99\x26\x09\x8c\x53\xfa\xb7\x61\x3c\xce\xc8\x23\x5a\x7a\xa9\x87\x4c\x57\xa6\x79\xfc\x70\x19\x65\x1a\x50\x4e\xfc\x2f\xe8\x1f\xd3\x64\xba\x67\x12\x25\x3e\xb1\xe5\xe5\x34\xda\x9c\xc5\xfe\xea\x3e\x25\x53\x7f\x4a\xb2\x06\x2b\xbc\xf2\x60\xc8\x79\xfc\xbe\x22\x53\x5a\xf8\x42\xb8\x8c\x27\x3e\xfa\x0f\x0b\x61\x20\xd6\x0d\xdc\x57\x4a\x43\x53\xa7\x4b\x05\x87\x66\x5f\x59\xaf\xf2\x1f\xc9\xfa\xac\xc5\xfd\x0c\x56\x67\x56\x61\xc2\xfd\xf2\xf4\xa4\xfc\x52\x9e\x70\x04\xba\x5f\xf2\x3d\x7e\xbe\x35\x75\xbd\xe5\x1a\x8b\x4e\xc3\xf0\xba\xdd\x96\xd5\x74\x8c\x45\xb7\xe5\xe9\x6e\xdb\x6b\xb6\xbd\x56\x5b\x37\x9a\x4b\x6b\xd9\xd6\x3d\x92\xbb\xd1\xea\xea\x96\xd5\xb5\x2c\xd3\x32\x2c\xd3\xb4\xba\x7a\xfb\x7f\xf2\x7c\xe3\xba\xfc\xef\x9c\x51\x66\xb3\x92\xd2\xaa\x4e\x84\x72\xd2\x3f\xcc\xf6\xdf\x38\xa5\xf2\xca\xf9\x92\x4d\x6e\x4e\x09\xc4\x98\x85\x88\x10\x47\xa7\x66\x1f\x79\xc1\x7b\xff\xf4\xa4\xbc\xaf\x11\x3c\x1a\xef\x88\x13\xbe\x45\xc7\xd2\x3b\x7a\xab\xe5\x35\x3a\x5d\xa7\x63\xe9\x8d\xb6\x6e\x9a\xcd\xe6\xa2\xbb\xd0\xad\x25\xb4\xba\xed\xb6\xb7\x30\x5b\xee\x92\xe4\xb6\xf4\x6e\xa7\xd1\x6c\x77\x8c\xae\xd1\xd1\x5b\x6d\xa3\x6d\xfc\x6f\x90\x3d\xda\xeb\x7f\xa7\xfc\x35\xda\x95\x94\x4e\x65\xec\x2b\x49\xff\x68\x74\xff\x46\xf9\xcb\x2b\xe7\x69\x68\xd7\xca\x1f\xb5\xc9\xd8\xe5\x7f\x2e\x64\x3a\x17\x80\x64\x8f\x5c\xd2\x0c\x45\x1d\x5a\x54\x92\xbf\x3f\x3d\x29\xbf\x97\x65\x95\x44\x29\xe1\x85\x14\xc2\xa6\xe3\x2d\x17\x6e\xa3\x63\x2e\xe0\xa2\xdd\x70\x9b\x3a\x34\x0d\x6b\xe9\x2d\x9a\xce\xb2\xd5\xd1\x2d\xcb\x6c\x37\x9c\x85\x4e\x0d\x2f\xa3\xd5\x31\xad\x96\xae\x9b\x7a\xbb\xd1\xb4\x5a\x46\xa3\xf5\x1f\x97\xd2\x1f\x6b\xa5\x14\x5b\x84\xb4\xcb\x18\x86\x58\x8a\x36\x30\x1c\x7a\x00\x99\x24\x4b\x3f\x80\x40\x82\x04\xfa\x3d\x5a\x2e\x91\x5d\x7e\x47\xe2\x35\xa8\x9a\xf4\x8f\x7f\x8c\xa2\x14\x02\x8c\x8c\x9b\x85\x2a\x23\x8f\x17\x12\x99\xd4\x29\xf9\x14\x8a\xfa\xed\x26\x49\x63\xe8\xac\x69\x7b\xdb\xcd\x26\x8a\xd3\x44\xf2\x53\x4d\xfa\xf1\xdf\x38\x2f\x9a\xd5\x94\xaa\x4c\x56\x92\xfe\xd1\x34\xff\xc6\x79\xd1\x14\xe5\xca\x08\xad\xce\x0b\x3a\x0b\xc8\x98\x09\xe5\x3f\xfb\x94\x9b\x16\x40\xde\x04\x8e\x0b\xef\xa3\xc0\xc3\x16\xd1\x71\x83\x2c\x30\x6e\x8a\xd5\x08\x9b\xaf\x44\xd0\xc9\x89\xae\x7e\x7a\x76\x0b\x5c\x98\x9d\x62\xfd\xfc\x87\x13\xac\x3a\x5e\x2f\x7c\x79\x7a\x52\xbe\x94\xf5\x02\xda\xe8\xf1\xdb\xb1\xc6\xa2\x61\x34\x3c\x4f\x87\x7a\x1b\x1a\x6e\xd3\x6c\x5a\x9e\xdb\xb2\x16\x4d\xc3\xd3\x17\x96\x0e\x8d\x06\x34\x3d\x53\x6f\xb7\xe8\xd2\x65\x62\xa3\x49\x37\xba\x96\x65\x59\xed\x96\xde\xb1\x7a\xf4\x75\xe0\xd1\xfb\xb1\xc2\xae\x8b\xec\x3c\xcf\xb2\x58\x3b\xd5\x5d\x58\xfe\x1e\x90\x7c\x2b\xe4\xcf\x76\xf1\xe9\x3d\x5c\xc3\xb3\xe8\x01\xc6\xb1\xef\xb1\x3d\xb9\x8f\xb7\xe0\x67\x8b\x20\x72\x3f\x14\xbe\x95\xc6\xaa\x3a\x34\xf9\xab\xfc\xca\x50\x0e\x27\x52\x14\xe3\x30\xda\x65\x4f\x02\x66\x2d\x2b\x29\xf9\x1b\x94\x6f\xf9\xd1\x0b\xf3\x81\xe5\xab\x35\xf2\x9f\x67\xfe\x86\x40\xf5\x70\xdd\x27\xd0\x3d\xbc\x13\xa4\x48\xb3\xe7\x27\xce\x22\x80\x5e\x61\x36\xb1\x0a\xfb\x51\x50\x75\x74\x14\xc9\x73\x69\x16\xe6\x00\xe8\x15\x29\x22\x9f\x4f\x61\xd5\x24\xc2\x0e\xa0\x22\xb3\x68\xe2\x1e\x3a\x36\x24\x47\x28\xaa\x8c\x27\x08\xe5\xcb\x99\x74\xc8\x23\x84\x38\x48\xef\x1c\xc2\xcc\x31\x74\xfa\x0c\x65\x8f\xf8\x18\x79\xd9\x6f\x6c\x55\xd2\x5f\xe2\xd9\x19\xc0\xe5\xc9\x5b\xae\xaa\xad\x70\x24\x8d\x93\xf7\x45\x1a\xf1\xef\x8c\xc6\xc9\xfb\x82\x5a\x78\xf5\xf4\xa4\xbc\xa2\x6a\x01\x8f\x05\x8f\x03\xc3\x85\x4b\xe1\x94\x84\x67\x74\xdb\x96\xeb\x58\xba\x05\x9b\x9e\x67\x35\xbd\x56\xdb\xd2\x17\xa6\xde\xea\x74\xdd\x85\x6e\x36\x2c\xbd\x65\x74\x97\x0d\xb6\xb9\x32\x9a\xba\x6e\x5a\x7a\xdb\x68\xb4\x4d\x4b\x37\x7b\x12\x07\x60\x23\x5d\xe4\x2d\x50\xbd\xb0\x77\x5c\xea\x03\x03\x09\xb9\x51\x7d\x27\xc8\xf8\x52\xf9\x72\x48\x22\x14\x12\x8d\xa6\x1f\x38\x49\x62\x6f\x60\x9c\x44\xa1\x7a\xa0\x4d\xf6\xe0\xb0\xda\x26\xfd\x72\xa8\xcd\xad\x2f\xde\xa3\x88\x9e\x1d\x56\x1b\xc9\xbe\xf1\xc3\xfd\xeb\xd3\x93\xf2\x2b\x1d\x6e\x82\x68\x73\xc4\x78\x9b\x9e\x6e\x2c\x1c\xa3\x6b\x78\x9d\x65\x17\x9a\xad\x65\xcb\xd0\x5d\xc7\x82\x1d\xdd\x73\x5c\xd8\xb1\x1a\x9e\xde\xb2\xba\x74\x51\x30\x5b\x0d\xd3\xec\x58\x9d\x86\xd1\x6c\x34\x9a\xad\xae\x69\x36\x7a\x12\x0f\xca\x73\xea\x98\x1f\x37\xd4\x82\x27\xb2\x8c\x25\xd5\x4f\xc7\x68\x32\xc1\x33\xda\x7d\x22\x81\xb3\x8f\x97\xa8\x70\xa2\x0a\xdb\x3e\x72\xd0\xdd\xf0\x10\x39\xf9\x8b\x5b\x41\x2b\xd9\xc7\x43\xed\x54\xc3\x8b\x60\x9e\xed\x6d\x39\x7f\xb9\x2b\x68\x39\xfb\x78\x22\x77\xb9\x37\xc7\x25\x12\x49\xec\x10\x61\x63\x79\xa1\x3d\xfe\x24\xea\x40\xba\x45\xed\xd3\xa5\x86\x7f\x5f\x5c\xe3\xe0\xad\x37\x39\x4a\xcd\x84\xd1\xd9\x6a\x9b\xa6\x30\x4e\xb8\x52\x0c\x52\xb3\xb0\x58\x57\xfb\x5f\xa6\x85\xe8\xe7\x4a\x6a\x59\xe3\x97\x1a\x39\xd8\x79\x20\x97\x0d\x26\x72\xec\x51\xb1\xa3\x16\x29\x12\xbb\x45\x1a\x9e\xf9\xe1\x32\x2a\x1e\x7b\x10\xf4\x0a\x0e\x7d\x45\x84\x14\x49\xaa\xc1\xa0\x92\x14\x74\x8a\x4f\x59\x44\xde\xe3\x69\x9e\xbf\xd6\x51\x62\x54\x78\x3c\x5d\x66\x17\xfa\xf0\x63\x52\x08\x37\x92\xcb\x52\xa1\xe4\xb1\x4d\x71\xcf\xb8\x4b\x6d\xe1\x2f\x3f\x26\x85\x50\x21\xc5\xc6\xf2\xb2\xb4\xb5\x2b\xe7\x31\xc2\xcd\x3d\xc0\x38\xf5\x5d\x27\xc8\x79\x4d\xee\x08\x13\x7e\xad\xe0\xda\x0f\xfd\x33\x7f\x15\x46\x31\x3b\x8f\x2a\x64\x20\x1c\x5e\x46\x51\x2a\x18\xcd\x4d\xec\xaf\x9d\xf8\xb1\x74\x8e\x75\x9c\x81\x32\x9f\xef\x40\x0a\xd7\x9b\xc0\x49\xf9\x2b\xae\x82\xe0\x2a\xf8\x24\x05\xe8\x19\x8a\x07\xf8\x13\x74\x01\xc3\x45\x31\x38\x5c\x94\x7b\x4b\x06\x19\x10\x68\x03\xc8\x12\x77\x28\xcc\x76\xef\xa2\xad\x03\x3e\x55\xc0\xdb\xec\x28\x16\xe1\x8f\xf0\x21\x4e\x72\x24\x7f\x16\xd6\x83\xc3\x4c\x21\x78\x94\xab\x55\x00\x45\x78\xea\x85\xef\x3c\x42\x0a\x85\x4f\x61\x48\xdf\x39\xc6\x58\x19\x26\x95\x7b\x2b\x50\x7e\x12\x40\xf1\xc4\x0a\x28\xdd\x55\x48\xe9\x93\x51\x55\x0c\x30\x81\xc0\xb0\x40\x06\xf1\x5b\x84\x49\xc1\xc3\x84\xd1\x4d\xf2\x43\x69\x90\xe6\x77\x9e\xeb\x50\x50\x52\x72\x69\x79\x14\xa5\x59\x18\xa1\x02\xe6\xd1\xf8\xe3\x56\x49\xab\x41\x8e\xf3\xf3\xe2\xfa\x8a\x6b\x6f\x1c\xa8\xea\x0e\x90\x20\x70\xfe\x03\x4c\x7a\xb7\x23\xed\xee\x0f\x30\xd2\x7e\xbd\x02\x23\x2d\x59\x81\xbe\x36\x6e\x82\x07\xed\x8f\x3b\x0b\x3c\x68\x93\xc1\x3d\x18\x69\xef\x03\xf0\xa0\xfd\xf6\x5b\x1f\xe5\xfa\x15\x8c\xb4\x2d\x78\xd0\xae\x57\xbf\x81\x07\xed\xe3\xc3\x15\x78\xd0\x86\xdd\x2f\xe0\x41\xbb\xbc\xf8\x08\x1e\xb4\x01\xfc\x1d\x8c\xb4\x3b\x30\xd2\x5e\xff\x05\x1e\x34\x27\x19\x81\x07\xed\x4d\x13\x55\xf9\xeb\xfa\x2f\xf0\xa8\xa1\xd4\xf0\xe3\x1f\xe0\x41\xfb\x7c\x33\x01\x0f\x5a\xff\xba\x85\x2a\xfa\xd0\x05\x0f\xda\xbb\x8f\x17\xe0\x41\xfb\x72\xf9\x1a\xa5\x5c\xa0\x92\xef\xae\x7c\xf0\xa0\xad\x9c\x0d\x78\xd0\x2e\x02\x94\x7f\x32\xfe\x2f\xf0\xa0\xc1\x8e\x09\x1e\xb4\x7f\x9a\x57\x73\x90\xa4\x8f\x01\xea\x87\xac\x11\xcc\x1d\x3c\xd6\xb7\x77\xe1\x8a\x22\xa1\x9e\xfd\xdf\xfe\xf8\x7a\xf2\x7f\xe7\x5f\x37\x8e\xe7\xf9\xe1\xea\x6c\x11\xa5\x69\xb4\xee\x19\xcd\xcd\xe7\xf3\x65\x14\xa6\x67\x89\xff\x05\xf6\x8c\xd6\xe6\xf3\x4e\xab\x6c\x0f\x45\x15\x7d\xf2\xbd\xf4\xbe\x67\x18\xe6\xe6\xf3\xf9\xda\x0f\xcf\xb8\xdf\x5c\x0d\xf9\xee\xa9\xbe\x0e\x4b\x2f\x54\x81\x7e\x72\x35\x24\x81\x93\xdc\xd7\x17\x36\x9b\x85\xc2\xf8\xe7\x22\x8a\x3d\x18\xb3\x2e\x86\x51\x08\xcf\xd7\x4e\xbc\xf2\x43\xe2\xba\xe8\x9d\x35\x50\x19\x92\x82\xb4\x51\xaf\x55\x6c\x12\xef\x41\xbf\x73\x93\x86\xb1\xf9\xbc\x43\x53\x9e\xdc\x0b\xc9\x55\x02\x7e\x58\x40\x21\x16\x45\x6d\xd2\x6a\xd2\x68\xd3\x3b\x33\x1b\x88\xce\xec\x44\x59\x90\x5d\x92\x24\x01\xfe\xae\x56\x76\x7f\x1c\x68\x48\xdf\x69\x05\x6f\xc7\xb7\x67\x97\x24\xe2\x11\xd6\x04\x5e\x14\x51\xed\x1e\xb9\x76\xd6\xc3\x2e\x94\x73\xec\x4d\xb9\x87\x98\x93\x46\xa7\x28\xb1\x0d\xf6\xf3\x13\xf9\xde\xd2\xf5\x73\x44\x14\x1e\x96\x0d\x5d\x7a\x7a\x31\x0c\x1c\x34\xd5\xcf\xd1\xd8\xc6\xbd\xff\x63\x35\xd1\xff\x8e\xa2\x5b\x13\x7a\x73\xf6\x11\xcd\x17\x38\xae\x89\x8a\xe3\xe5\xdf\x5f\xbd\x24\x49\xb5\xf3\x94\x9f\x2b\xc7\x0d\x36\x03\x6b\xd6\x2a\x0e\x11\x2d\xc3\x95\x14\xaa\xa7\xca\x80\xd1\xf9\x63\x22\x25\x21\xe6\x00\x0e\xb5\x9f\x0b\xfb\x11\x1d\x40\xe6\x0a\x2e\x75\x28\xaf\x11\xc3\x35\xc9\xee\xc1\x00\xa6\xc2\x51\x27\x53\x1f\xcf\x79\x46\xcb\x21\x46\x22\xf9\xd4\x50\xdd\x4c\x49\x50\xbd\x61\x5a\x68\x7e\xf3\x66\x77\xbd\x16\x6a\xea\x88\x23\x6c\x52\x98\x44\x83\xc5\xf1\xbe\x7e\x7d\x66\x4a\xba\xdd\xc4\xed\xec\xe3\x18\x63\xf5\x32\x80\x9f\xcf\xd1\x7f\xce\xe8\x72\x19\x85\x3d\x37\x0a\xb6\xeb\x70\xa7\x95\x0d\xfc\xa3\xea\xe9\x19\x92\x71\xfe\xd7\x36\x49\xfd\xe5\x23\xc3\xe9\xee\xb9\x30\x4c\x61\x7c\xee\x04\xfe\x2a\x24\x37\xb6\x68\xd2\x4e\x9e\xef\x54\x00\x77\x8a\x0a\xde\x41\x3b\x56\x9a\xa6\xd9\x69\xa8\xe0\x17\xf4\x77\xa7\xd3\x35\x75\x15\xbc\x47\x7f\x77\xad\x46\xb3\xa1\x82\xdf\xd1\xdf\x6d\xc3\x40\x7f\x7f\x41\x7f\x9b\xdd\x4e\xa3\xa3\x82\x57\xe8\xef\x46\x57\x6f\x37\x55\xf0\xeb\x37\xc3\x1e\x81\x08\x38\xa4\x64\x20\x82\x3e\x0a\x4a\xd0\x47\x71\xb4\x4d\x61\x6c\x43\x10\x68\x30\xb0\x43\x10\x68\x78\xd7\xc2\x90\x8f\x22\x10\x60\x1b\xe9\xd5\xd6\x47\x16\xbe\xed\x80\x40\xbb\x98\x4c\xee\x6e\xc6\x6f\x67\x83\xa9\xed\x6b\xbf\x83\x40\x9b\xdc\x8c\xdf\x0d\x2f\x07\x37\x53\x7b\xad\x39\x17\x20\xd0\x3c\xb8\x09\xa2\x47\x64\xca\x50\x04\x1b\xfb\x07\x03\x25\x13\xef\xec\x25\xfe\xfa\x0a\x8f\x0f\xf9\xe0\x06\xdb\x24\x85\xf1\xec\x71\x03\xd9\x9d\xeb\x28\xb6\x65\x19\x04\x5a\x52\x04\x73\xb1\x43\xf8\x49\xba\x76\x36\x20\xd0\x62\xf8\xe0\xc3\x4f\xb8\x02\x11\x2a\x52\xb2\xdd\x6c\x82\x47\xfe\x86\xf0\x81\x37\x8f\xb8\x25\x27\x75\x5e\xbc\xd0\x7f\xb0\xed\x42\x92\x16\xc0\x70\x95\xde\x93\x17\x9f\x9e\xe0\xee\x71\x21\xb7\xda\x53\xd8\xe5\xfc\x4f\x4e\x1c\x2a\x02\x52\x14\x55\x42\x83\x00\x3d\x69\x01\x97\x51\x0c\x25\x54\x56\xf2\x9c\xd4\x91\x3e\x39\x89\x94\xc0\x54\x56\xc1\xed\xfc\x28\xf0\x19\xee\x2a\xb3\xbf\xcc\x5f\x8c\xe7\xd7\xf8\xe9\xd8\x11\x7c\x52\xe5\xeb\x2e\xbb\x48\x4d\xc8\xa5\x5d\xc5\x34\x4e\x69\x9a\x52\xca\x53\xcf\x13\xfe\x36\xf7\x7b\x8c\x50\x23\x60\x8c\xa0\xff\xfc\x6d\x6e\x52\x6e\x86\xe4\x2e\x51\xa8\x6c\x83\xd8\xfe\xab\xc4\xd6\xf3\x34\x7e\xc4\x4f\xef\x62\x0d\x65\xfb\x41\x49\xed\x58\x0b\x15\x55\xd5\x3c\x64\xd2\xb0\x17\x98\x29\x79\xa9\x78\x9e\xf5\x5f\xa3\x76\x45\x72\x1b\x6a\x68\x23\x3a\x3f\x8e\x35\xb9\xd0\x65\xe5\xc2\xe2\x75\x77\xf2\x18\xc3\x57\xbf\xc6\x1a\x54\x7c\x75\xb7\xf4\xf1\x0e\xee\x6b\xac\x2d\x15\x75\x47\x6e\x83\x6f\xe3\x18\x86\x29\xe2\x2b\x6d\xd5\x8f\x13\xfc\x73\x07\x83\x04\x87\xe2\xc7\x82\x82\xd7\x1c\x45\x26\x18\x3f\x92\xe7\x7b\x52\x18\xa5\x12\x61\x1c\x27\x1c\x69\x44\x62\x3c\x93\xab\xb4\xea\x79\xa4\xfd\x89\x5f\x4f\xc2\x70\x05\x63\x0e\x87\xea\x17\xa8\x5d\x69\xd3\xd9\x60\x72\x77\x39\x98\xf6\x6f\x86\x38\x66\xc8\x5d\xff\x97\x8b\xd1\x9b\x01\xe0\x2f\x13\x13\xec\xc8\x54\xdb\x38\x8f\x41\xe4\x78\xe7\x90\x0e\xd6\xfb\x0c\x6c\x48\x51\xf1\x3b\x1f\x42\xd9\x8b\x17\xf4\xd5\x44\xb4\x4d\x95\x02\x36\x58\x99\x65\x31\x4e\x99\xdb\xc5\x17\x02\x40\x57\x77\x80\x3d\x5f\xce\x10\xb4\xc0\xde\x6e\xbc\xba\xb9\x18\x5d\x0e\x47\x6f\x28\xf9\x97\xa0\xf8\x16\x18\x92\x30\xe7\x79\x1f\x58\x0a\x80\x35\x7a\x25\xcf\x29\xfc\x8e\x5f\x12\xa7\x01\xe4\xf2\x2d\x62\x07\xab\x31\xf2\x41\xd4\x03\x31\x5b\xb2\x0b\xe0\x8b\x38\x72\x3c\xd7\x21\x23\x4f\x71\x8a\x30\x04\x16\x15\x06\x15\x73\x26\x7f\x27\x8d\x34\x5b\x31\x1c\xc8\xfe\xe7\xfa\xf4\x25\x4f\xae\xb8\x35\x4c\x50\x1a\x40\x05\xbe\x94\x65\x76\xb3\x3f\xcf\x06\x64\x12\x6e\x24\x5e\x4b\xd9\xc5\x66\xb5\x97\x7f\xa7\x13\xa1\x46\x63\xd3\x77\x50\x9b\xe0\x71\xf6\x61\xc5\x1e\xae\x66\x58\x6b\x27\xc0\xa4\x41\xf5\x6b\xaa\x6d\x37\xc8\xfe\xea\x07\xbe\x02\xb5\x8d\x93\xde\xab\x3b\x50\xee\x66\x6c\x97\x1e\x0f\xef\x7d\x36\xac\x9e\x0b\x76\xed\xb6\xfc\xda\xf1\x91\xc6\x4d\x23\x09\x93\x2e\xa5\x1f\x56\xf4\x71\x8b\x26\x65\x2c\x8a\x39\x38\x31\xbc\xbe\xc0\xfc\x55\x10\x51\x60\xb5\x2f\x9e\x71\xa9\x6a\xbb\x79\x05\x2b\x98\x92\x79\x75\xe4\x2b\xfc\x07\x3f\xf1\x53\xe8\x5d\x51\xb9\x79\xf1\x42\x7e\x77\x71\x35\xbc\x94\x6d\x3b\xd7\x60\x5a\x92\x3a\xe9\x36\xe1\xdb\xe8\xe7\x52\x5d\xdf\x00\x9a\x72\xce\x06\x2b\xd6\x1c\x7c\xe4\x3a\xf2\x20\x2d\x3d\xc5\xe1\xd1\x83\x28\x84\x8a\xfa\x32\xd1\xde\xaf\xb5\x3c\xa5\x87\x7f\xe7\xfe\x0a\xee\x0d\xc5\x38\x7c\xcd\x64\xfa\x40\xe7\x78\xcd\x68\x97\x75\x63\x11\x31\x20\xda\x57\x27\x7d\xd6\xc2\x35\xac\xa8\xd9\xa3\x9d\x5a\xed\x0b\x44\x0c\xce\x44\x1b\xa9\xae\xf7\x64\x33\x32\x85\xa9\x16\x43\xfc\xe8\x9c\x8c\x9d\xc2\x3d\x59\x23\x76\xce\x11\xcf\x8b\x04\x06\x91\xbe\x67\x86\xe9\xe7\xf9\xdc\xd6\x56\x30\x9d\x10\x3d\xa4\xa8\xe7\xf4\xc9\x38\x74\x52\x78\x03\x57\xd8\x65\x48\x07\x4c\xf9\xba\xc1\x40\x54\xf8\xfd\xf6\x33\xa6\x22\xd2\xa5\xa1\xf3\xe0\xaf\x9c\x14\x2a\xbe\xf6\xbb\xf6\x7e\xf8\xe7\xc5\xcd\xe5\xdd\xe4\x66\xfc\xe6\x66\x30\x9d\xf2\xb3\x92\x5b\x38\x4a\xb3\x32\xad\x9d\x95\xa9\x7a\x0e\xf7\xcf\x4a\x3f\xf4\x53\xdf\x49\xd1\xea\x86\x7b\x24\xe5\x5c\x2b\x4c\x50\x00\xc5\x06\x26\xac\x51\x57\x3c\x86\x1f\xed\x60\xed\xf4\x25\xe6\x70\xce\x88\x5b\x38\xaf\x96\x9e\x45\x44\x14\x9e\x57\x4b\x14\x8e\xe0\x67\xb1\x34\x43\x8c\xb1\x8d\xab\x28\xac\x18\xfd\x68\xbd\x41\x3b\x3c\x05\xaa\x00\xb2\xd9\x12\xd0\x8f\xaa\x58\x94\xf5\x73\x64\x60\x70\x8b\x44\x6e\xb9\x2d\xfd\xd0\x1b\x86\x1e\xfc\x2c\x7a\xdb\x95\x62\x5b\xc7\xb6\x6d\xb8\xa3\xe2\x96\xc0\xb4\x9f\x4f\xa4\xa2\x51\x76\x9b\xfe\x64\xcc\x71\x09\xaa\x35\x85\x2b\x5d\x79\x32\x52\xe3\xa8\xa2\xdf\x70\x6a\x14\x12\xee\x66\x9d\x2e\x60\x51\x71\x94\xd4\xb2\x9f\x9f\xf6\x90\x2f\x9c\xbf\x95\xac\x96\x05\x29\x88\x19\x13\x7e\x50\x7e\xc8\x15\xec\x0a\xa6\x0a\x54\x9f\x9e\x2a\x49\xf8\x9f\x34\x53\x36\xd5\x2f\x1a\x41\x68\xc1\xbb\x34\xa0\x73\x7a\x63\x75\x88\x94\x2a\x1a\x0b\x87\xb7\x42\x1b\xa9\xa6\xd0\x66\x6b\x3f\xe4\xe0\x22\x3c\x25\xaf\xa2\x28\x80\x4e\x78\x1c\x41\x3f\xfc\x20\x78\x77\x8a\xbe\xe7\x38\x43\x6c\x35\xdf\x6f\xb2\x68\x78\xa1\xf2\xd1\x62\x5d\xb4\xfe\x36\xdb\x45\xe0\x27\xf7\xf4\xa9\x1a\xb6\x00\xfb\x57\xc3\xcc\xf8\xa3\x26\x19\xd2\x72\x59\x93\x4e\x1c\x3b\x8f\xe3\x25\xc1\x69\x49\x66\x11\xf9\x63\x2f\x5f\xe1\x8b\x17\x50\xf2\xc3\x24\x75\x42\x17\x46\x4b\xe9\x02\x55\xf1\x12\x6a\x31\xf4\xb6\x2e\x6f\xa0\x80\x38\xdf\x57\x7c\x80\x8f\x68\xbf\xcd\x1e\xe0\xbd\x78\xa1\xc0\xdb\x70\xce\x36\x1c\x4a\xac\xaa\x00\xee\xc0\xd7\x9d\xda\xfb\xba\xcb\xa7\x3b\x26\x66\x16\x5d\x14\x88\x14\x31\x07\x6d\x6d\x08\x83\x6e\xe7\x20\xb6\x75\x10\xda\x25\xe8\x19\xa8\x9e\xc7\xff\x5f\x48\x77\x5e\xe7\xf1\x4f\x3f\x51\x8c\x63\xfb\x9f\x4a\x78\x1b\xcf\x81\xa9\x82\xc8\xf6\x6f\xf5\x39\x70\x6c\xff\xd6\x98\x9f\xa7\x1c\x30\xf1\x7f\x29\xa9\x4a\x37\xc7\x11\x6d\xdd\xd9\xcd\x55\xb6\x77\x4e\xb9\xe7\xbb\xf1\xb5\xb3\xc1\x6c\xac\x1d\x43\x10\x33\xda\xc8\x62\xa4\x90\xc7\xab\xa1\xfd\x17\x36\xbf\xe8\x46\x2d\xcc\x36\x6a\x61\x65\xa3\x86\x88\xa6\x9c\xab\xd2\x1d\xdf\x46\x73\xdb\x61\x3b\xac\x40\xfd\x1a\x6a\x50\x09\xf2\x1d\x56\x88\x77\x58\x94\xf2\x38\xb7\x3f\x52\x18\xa3\x05\x60\xbc\xf8\x6b\x16\x4d\x71\x37\xea\xa5\x90\x7a\x12\xd0\xa6\x19\x11\xff\x83\x6d\x33\x63\xb3\xae\x1b\x71\x4d\x37\xe2\xba\x6e\xa4\x47\x75\xa3\x3a\x02\xd1\x29\xf4\xe7\x12\x4d\x47\xe4\x03\x7c\x44\xa2\x22\x04\x29\x4a\x91\x4e\x52\x62\x00\x6f\xe3\x39\xb6\x74\x73\xde\x85\x3e\xb3\x33\xde\xfb\xe9\x7d\x3f\x5a\xaf\xa3\xf0\x00\x4c\x18\x88\x45\xcf\xd0\x13\x6d\xf2\xa0\x8d\x06\xb3\xf7\xe3\x9b\xdf\xc0\x4a\x8b\xda\xec\x07\x86\x85\x57\x11\xc3\xa1\x16\xc2\xf4\x53\x14\x7f\x40\x4b\xf7\x57\xfa\x37\xda\x6d\xf6\xe2\x97\xb1\x46\x40\xc5\x65\x40\xed\x80\xcb\xd1\x74\x54\x4c\x19\x21\x3b\x75\x78\x79\xc3\x25\x51\x23\x16\xa7\x1e\x45\x53\xff\xea\xed\x74\x86\x51\xe1\x6e\xde\x0d\xfb\x83\x3b\x54\x52\x65\xb5\x4d\x22\xef\xf4\x9a\x26\xe3\x4b\x56\x4b\xe8\x23\xeb\xfb\xc8\xe2\xa3\x21\x41\x8d\xdd\x81\xa3\xf2\x4f\x6e\xc6\xff\xfc\x23\x7f\x75\xce\xd4\x13\x92\xe1\xf3\xd0\xbe\xbd\x95\x7f\x99\xcd\x26\x93\x38\xfa\xfc\x88\xdf\x20\x55\x2b\x40\xdf\xef\x48\x2d\x6f\x6f\xae\xe6\x80\x2f\x91\xdd\xa3\xda\x5f\x2c\x0b\x4e\xc0\x95\x9d\x64\x17\xf4\xf6\x96\x9d\x5c\x4c\xa7\xef\xc7\x37\x97\xa8\x6c\x18\xe1\x92\xa2\x12\xa3\x31\xc9\x3f\x9f\x8b\x41\x11\xc4\x6d\x4c\xef\x86\xd3\xbb\x29\x8e\x59\x30\xbd\x43\x09\xea\x4b\x5e\x01\x86\x2a\xa0\xfc\x99\x9e\xce\xa0\xe9\xb7\x70\x68\xfa\x2c\x16\xcd\xd5\xde\x33\xc9\x9f\x3e\x97\xfe\xe9\x37\x75\x60\x5a\xed\x01\xe0\xe7\xba\x76\x9f\xa6\x1b\x5c\x53\xc1\xbb\x61\x7f\x85\x18\xdf\xcc\xeb\xfd\xa0\xef\x40\xb8\x07\x5e\x2d\x2d\x89\x41\x7c\x6b\xcc\x41\x7c\x6b\xce\xd5\xf3\x4c\x9a\x6c\xdb\x8e\x6f\xf5\xf9\x8b\x17\x4a\x68\x87\x5a\x0c\xf1\x0d\x15\xe5\xe7\x7f\x25\x3f\xaf\x30\xac\xdf\x31\x14\xdd\xa2\x1a\xe6\x76\xb8\x53\x77\x50\x73\xa1\xbf\x19\x6f\xd2\x61\x2e\x88\x15\x9b\x89\xc8\x63\x7f\x30\x9c\x80\x40\x1b\x4f\x66\xc3\x11\xf1\x63\x0a\x71\x3a\x70\xde\xeb\xc1\xec\xe2\xf2\x62\x76\x01\x96\xda\x22\x53\x21\x57\x17\xaf\x06\x57\x53\xb4\x53\x0a\x08\x86\x37\xf1\xb4\x08\xed\x1b\xc5\x27\x9a\x5b\x04\xba\x86\xd6\x80\xdd\x1e\x50\x36\xb2\x60\xed\x76\x88\x17\x91\x10\x09\x1b\xd3\x38\x9e\x0e\xaf\x2f\xde\x0c\xc0\xbd\x36\xd3\xf0\x5f\x28\xbf\x13\x86\x51\x8a\x99\x94\xd8\x5f\x39\xe7\x5e\xad\xb6\x13\xf6\x94\xf3\x4b\xaa\x20\x88\xc8\x6e\xf0\xb4\x2a\xae\xc6\x7d\xfc\xdc\x46\xdd\x61\x56\x47\xb6\x2c\x9f\xd7\x55\xc0\x10\x38\x40\x11\x02\xef\xc5\x0b\x25\xaa\xed\x7d\x4d\x99\x1c\x30\xef\xc8\x32\x18\x3e\x0f\x43\xf8\x57\x6e\x7a\xd8\x5f\x7d\x6f\x7d\x97\xee\x5b\x2b\xb8\x1a\x8b\x20\xe3\x4f\x4f\x72\x18\x85\x50\xae\x5f\x36\x6a\x8b\xf2\xc0\x1a\x2f\x85\x74\x51\x53\xc2\x49\x12\x7f\x15\x2a\x5f\x23\xdf\x73\xef\x36\x71\xf4\xe0\x7b\x30\xbe\x63\xeb\x73\x31\x75\x1b\x07\x47\x75\x22\x83\xa8\x51\x49\x05\xe4\x45\xd7\x9d\xef\x1d\x53\x3a\xc3\xae\x2e\x16\x26\xcf\xf0\x4e\xa8\x80\xa0\x7c\xd2\x4a\xf0\x9b\x9a\x63\x0a\x13\x68\xe8\xac\x69\xc7\x5f\xdf\xad\x09\x6a\x4d\xd2\xfb\x9a\x85\x43\x39\xa2\x22\x01\x08\xb3\x0a\xc8\xeb\xaa\xa3\x8b\xf3\xc8\xd1\x18\x7b\x49\x30\x8e\xea\xe9\x62\x55\x04\x01\x52\x8e\x91\x0e\x86\x3e\xd9\x8b\x40\x21\xdc\xcf\x11\x6d\xd3\xb0\x46\xaa\x28\x22\xd0\xb1\xc5\x27\xef\xd5\xfa\x18\x39\x47\x54\x22\x08\xa8\x24\xa8\x90\x06\xd2\x39\xb1\x3e\x02\xf9\x2b\xa8\xee\x14\x69\x11\xa1\x17\x0b\xaa\xcc\xe3\xf7\x7c\x5b\x9d\xc2\xd8\x4b\x47\x54\x29\x0a\x41\x25\xaa\xf2\x78\x4e\x0a\xd0\x93\x45\x15\xe6\xe1\x95\x4e\xad\x33\x8b\x88\x25\xaa\x96\x8b\x0d\x75\x6a\xbd\x79\x40\x2d\x51\xc5\x27\x0d\x94\x38\x1c\x97\x5a\x8c\x19\x75\x44\x3d\x7c\xf4\x2e\xb5\x46\x5b\x10\x9b\xc5\xa9\x5d\x11\xaf\xc6\x17\x97\xaf\x2e\xae\x2e\x46\xfd\xc1\x0d\x98\x69\x9b\x8a\xdd\x92\xd9\x17\xce\x83\x4f\xf1\xd6\xbe\xd2\xd3\xd7\x60\xcf\x90\x57\xeb\x1d\x8f\x66\x37\xe3\xab\xab\xc1\xcd\xdd\x2f\xe3\xe9\x4c\x05\x07\xa7\x4b\xa5\x8a\x5c\xa8\x0f\x2a\x94\x4a\x59\x66\xbe\xa2\xfd\x60\xb4\x3d\xa1\x60\xff\x6a\xfc\xf6\x92\x6c\x73\x41\x42\x76\xa4\x77\x30\x5c\xf9\xe1\x09\x84\xb3\x0d\xe9\x60\xf4\x66\x38\x1a\x70\x01\xd5\x54\xe0\x3a\x77\x2e\x8c\xeb\xd7\xb9\x7d\x7c\xec\x0f\x6e\x66\x2a\xa0\x86\x6f\xef\xeb\x69\xcc\x2c\x6c\xe0\x81\xeb\x7b\x27\x8c\x25\x2b\x8b\xb7\xc6\x3b\x40\xc5\x61\x12\x38\x21\x1c\x3d\x8f\x1a\x54\x1d\x4a\xbc\x63\xe2\x47\xbb\x79\x37\xb9\xba\x18\x0d\xee\xde\x0d\x27\x77\xdf\x42\xf0\x09\xd5\xd3\x3e\x11\x63\xbd\xb7\xcf\x58\x77\xbe\x83\xb1\xbe\x03\x90\x3b\x19\xcb\x83\x1d\x89\x3d\x9d\xe4\x84\xe6\x2b\x39\xb8\xef\x71\x17\x31\xf8\xb3\x7d\x90\xa4\x70\xd3\x83\x20\xbb\x07\xdd\x13\x5c\x9b\x80\x73\x50\x89\xec\xc3\x57\xc8\xa7\x0f\x1e\x48\x00\x15\x51\x14\x1f\x71\x19\xfc\x89\x16\xdb\x9d\x63\x07\x15\xea\xd4\x0d\xee\x60\xec\x84\x29\xbe\x90\x12\xab\x45\x78\x41\x02\xc5\x87\x4f\x97\xc4\xbe\xfc\x2c\x00\xdc\xd1\x2c\xc0\x98\xda\xe9\xee\x9c\x0f\xcf\x94\x1d\xa7\xa3\x36\xd1\x8e\x8b\x34\x15\x03\x76\x75\x2c\x7c\x7a\x8a\x77\x22\xda\xb0\xbf\xb7\x8e\x34\xe0\x13\xe2\x1c\x10\x7c\x47\xf2\x02\x01\x79\xc4\xb3\xa9\x38\x36\xf9\x2b\x7c\x19\xf6\x7c\x25\x56\xd5\x17\x2f\x08\x0a\xf6\x0f\xb6\xed\xbc\x74\x7a\xb1\xf6\x57\xe4\x87\x8a\x0c\x24\x59\x15\x76\x87\xee\x78\xeb\xce\x4d\xc8\xee\xfc\xc4\xae\x00\xdf\x8e\x5f\xca\x8f\x30\x91\x7b\x72\x18\xc9\xc0\xb1\xc9\x80\x2a\xb1\xba\xa7\x97\x21\xeb\xa5\x93\xf5\xd2\x2f\x93\x8c\x37\xf4\x98\xee\xe4\x75\x1c\xad\xa9\x5f\xf3\xc0\x25\x0a\x7f\xa9\x64\x3c\xe1\x5d\x04\x1c\xab\x8e\xf0\x1c\xe4\x17\x16\x0e\x66\x05\xa1\x1d\x6b\xd4\xf3\x91\xdd\xdd\x2a\x4b\xf7\x41\x0f\x20\x08\xd5\x5c\xd6\xff\x1f\x74\xff\xd1\x0d\x3a\x62\xe1\xb5\x93\xba\xf7\x30\xc1\x01\x9e\xd8\xb5\x15\x24\x2c\x25\xc6\x51\x59\x3d\xd6\x47\x08\x22\x15\x44\x2f\x8f\xe6\x7e\xc9\xbd\x96\x07\xf3\x38\xb5\x2c\x8b\x43\xf2\xdc\x0a\x18\x2b\x49\xac\x0a\xbf\x70\xd4\xe3\xff\xaf\x74\x15\xfa\xc2\xa8\x23\x69\x95\x31\xf0\xd6\x98\x03\x78\x6b\xce\x41\x7c\x0b\x6f\x75\x8c\x24\xbc\xcb\xcf\xdc\x12\xe7\x01\x92\x03\x8c\xe3\x75\x00\x51\xcb\x20\x02\x0e\x70\xc1\x76\x8f\x32\x38\x5a\x50\x78\x1b\xa4\xe8\x73\xe4\x0e\x3c\x8e\x1f\x7a\xd1\x81\x45\xb1\xda\xea\x51\xc8\xe9\xb5\xb3\x43\x0c\x61\xcd\xf4\x58\xe4\x84\x5a\xe9\xd9\x46\xa9\x36\x72\x3c\x52\xb8\x03\x2a\xd6\xd8\xca\x7e\xfe\xf0\xfe\x56\xc0\xf9\x69\x55\xc0\x8d\x1d\x31\xce\xc8\x28\x7b\x44\x97\x88\xcf\x64\x95\x2c\x2f\xb8\xb3\x97\xda\x3f\xb3\xe0\x89\xd8\xc1\x83\x6f\x4d\x88\xa2\xe1\x40\x76\x61\xa2\xea\xc8\xdd\x55\x54\x13\x6e\xf1\xa0\x03\x18\x78\x04\xbe\xfb\x4e\xa3\x2b\xdc\x6b\xda\xac\xba\x2b\xca\x25\xe7\x8b\xdd\x2f\x98\x87\x7c\xb0\x45\xbf\x2e\x7f\x67\x73\xef\x00\xec\xf5\xcb\x96\xea\x64\x4e\x5e\xb5\x30\x3a\x82\x5d\x28\x1e\xa9\x7b\x9b\x78\x37\x6d\x71\x26\x8d\xf9\x4d\x5f\xca\x72\x6f\x6f\x86\x03\x0b\x6b\x9d\x1f\x0c\xdc\xab\xe0\x9e\xf7\x93\xaa\x47\x56\x92\x23\x70\x0b\xc9\xaa\xf8\x4c\xf7\xf2\x57\xe4\xf9\xdc\x53\x6f\xe6\x4a\x3d\xb1\x52\x1a\xf3\xe8\x60\xc5\xc4\xcd\x7a\x6c\xe5\x34\x90\x5e\x7d\xad\xd8\xef\x7a\x6c\x6d\xa2\xb8\x75\xfb\x08\xe6\x9d\xb3\x1a\x73\x1f\x9c\xd4\x58\x21\x34\xdf\xd1\x4d\x11\x2f\xae\x8a\x6f\x5f\x49\xfe\x52\xb9\xe7\x1d\xaa\xf8\x7e\x57\x41\xfa\xb3\xd0\x3d\x44\xec\xd7\xc5\x44\x2d\xd9\x04\x7e\xaa\xc8\x3d\xb9\xa2\x49\x6a\x28\xe7\x11\xe5\xd7\xb7\xfa\x5c\x05\x6b\x7a\x5f\x44\x51\xff\xdb\xa0\x57\x83\x8e\xaf\x05\x03\xce\xaf\x6f\x8d\x39\xbd\xb2\x75\xb0\x24\x8b\x53\x2f\xe4\x17\xef\x1d\x3e\x76\x28\x58\x40\xba\x03\x15\x32\x27\xcf\xb1\xd5\x8a\xa2\xe8\xd7\x37\x21\xf0\x2c\x3f\xa7\x21\x1a\x00\xee\xb8\x76\x88\x9b\xf4\x39\xcd\x64\x96\xe5\x71\x0d\x9d\x3a\x39\xbe\xa1\xa9\xcc\xf3\x79\x6c\x5b\x22\x9f\xf2\x9e\xb6\x44\xae\xeb\x67\x35\x75\x70\xa4\x04\x1e\xed\x67\x35\x94\x79\xa0\x8f\x6d\x2b\x73\x76\x3f\xab\xb9\xdc\x31\x7d\x6c\x7b\xb9\x17\xfc\x59\x0d\x66\x1e\xeb\x63\xdb\x3b\x59\x44\x78\xc7\xf6\x9e\x46\xa8\xab\x5c\xdd\x95\x4d\x28\xe6\xa9\xe6\x5f\x32\x55\xda\x3b\xe4\xa1\x06\x5c\x45\x5a\xee\xf1\xde\xdb\x87\x5a\x97\x75\xa1\xb2\xa3\x66\x67\xad\x07\xbb\x50\xd5\x51\x3a\x72\x8f\x4f\xbb\xd8\xc9\x20\xda\x9e\x58\x53\xad\x67\xbb\x50\x71\xd1\x6f\x7e\x22\xad\x45\x7f\x77\x91\x60\xe2\x3c\x3f\xad\xc2\xc2\x1e\x0e\xd9\xe4\xb6\x6d\x2b\xb1\xcd\xfe\x4a\x0b\x02\xf4\xf4\x44\xe4\xca\xb6\xed\xf4\x25\xf9\xb3\x97\xb2\x8d\x0f\xff\x35\x66\x5f\x63\xed\xf4\xa1\xe5\x7d\xcf\x19\x49\x7e\x46\x52\x58\x47\x52\xc8\x1a\x0d\x45\x24\xf9\xec\xab\xaf\xb9\xbe\x77\xa2\xe0\x9e\xe8\x90\xcf\xa8\x76\x32\xaa\xa3\x3a\xaa\x23\x46\x57\xa4\x09\x4e\x0e\xf8\x9c\x0e\xcb\xe9\x3c\x83\xa9\x27\xfa\xfc\xb3\x1e\x6c\xb3\x1e\xb8\x75\x3d\x70\x19\x5d\xee\xa1\x1e\x6c\x59\xce\x2d\x19\x03\x7c\x1a\x77\x71\x60\xcb\x9a\x0b\x38\xdb\xbc\x0e\xec\x99\xf6\xe1\xd4\xcd\x6b\xf5\x34\x6f\xef\xe6\xf5\xc0\x49\x20\xb8\x20\x1b\xd8\x41\x75\x03\x9b\x39\x69\xea\x1c\x7a\xfb\x82\x49\x6a\xbc\x73\x13\x6f\x0d\x0b\x2e\xae\x17\x2f\xf8\x1c\x54\x71\x96\xb3\xd1\xe4\x42\x5e\xe6\xac\x2a\xe5\x65\xc9\xa5\x53\x97\xd8\x89\xf7\x05\x85\xc9\x72\xf7\xa1\xbf\x79\x8d\x21\x81\x84\x99\xc9\xa9\x57\xee\xc8\xc0\x0f\xef\x7a\x32\xfa\x5b\xba\x58\xc5\x90\xc6\x81\xe1\xaf\x58\xc9\xbf\x46\x3e\x6a\x04\x4a\x38\xd7\x26\x8e\x56\xb1\xb3\x96\x96\x51\x2c\xcd\x7e\x7b\x23\x03\xdf\xe8\x84\xbd\xaf\xb4\x22\x17\xfa\x1b\xc9\x61\x15\x91\x57\xa4\x04\x92\xaa\x58\xa7\x28\x1f\x97\x41\xde\x01\x37\x70\xbe\x7c\xe9\x4d\xf3\xb1\x63\x98\x35\xc7\xf5\x2e\x5b\xac\x29\x61\x02\x64\xa3\x22\x49\x7f\x14\x42\xe6\x14\x7b\x95\x63\x39\xd7\xf5\xa7\x98\x43\xd4\x93\x3f\x60\xde\x95\x6b\x98\x3a\x9e\x93\x3a\xc7\x75\x25\x73\x78\x50\x6a\x58\xe9\x12\x09\x0c\xc3\x69\x4d\x3f\xe3\x11\x42\xc3\x46\x6f\x8e\x09\x1f\x9e\xfe\x24\xb3\x97\x4f\xa5\x81\xcc\x6a\xc1\x1d\x22\x2e\xd9\x42\x73\xc5\x0c\xa2\x1e\xdf\x69\x1f\xf3\x2e\x53\xd5\x73\x5c\x8f\x99\x3f\x8f\xd2\xf2\xdb\x76\x01\xe3\x10\xa6\x30\x91\x68\x35\x45\x5a\xde\x41\xed\xaf\xfa\xc1\xe3\x4a\xd3\x35\xa8\xb6\x4f\x75\x59\x45\xbd\x43\x8d\xee\xf8\x37\x2d\xe3\x64\xb8\x76\x56\x90\xf4\xb0\x4e\x9d\x70\x9d\x64\x17\x1d\x29\x99\xe3\xa9\x84\xcb\xd7\x8c\x2a\x1a\xc8\x3c\x4b\xa1\x83\x2c\xb9\x5e\x3a\x8b\x39\x44\xbd\xe1\x84\x93\x9c\xa7\xed\x19\xa8\xfc\x81\x10\x17\xfc\x4c\x20\x5b\xf8\x2d\x70\xdf\x49\x60\x5d\x3d\x5b\x2d\x24\x2f\x7f\x51\x26\xa5\x5e\x48\xd5\x12\x6d\x04\x05\x6e\x0f\x6d\xd5\x63\x40\xee\xb9\xe8\xa5\x93\x3a\xe3\xc0\xab\xab\x40\x74\x08\xe8\x27\x14\x66\x80\x14\x55\x6a\x1a\xe1\x62\x60\x3b\xec\xed\xe8\x1e\x2a\xc3\xed\x1a\xe5\x49\xfe\x5b\x7f\x59\x7a\xdf\xc6\x7f\x3d\xa3\x6f\xdd\xf8\x78\xc4\xcb\xfc\x6d\xea\x73\xea\xd7\xab\x35\xb2\xbc\xfb\xd9\x4a\x2b\x28\x56\x47\x5d\x3d\x3d\x3d\xab\x4c\xf8\x8e\xb0\xfe\x20\xf4\xb8\x13\xdc\xdd\xe1\x37\x5b\x18\x7c\xa0\x3f\xbe\x9e\x5c\x0d\x66\x35\xcf\xb6\x44\x4f\x05\xff\x5d\x94\x61\xc8\xfc\x1a\xba\x04\x00\x1f\x7b\x6d\x92\xea\x9b\x31\x3e\x52\xde\x66\x9b\xdc\x2b\x29\x35\x49\xe1\xae\x80\xea\x51\x83\x9a\x21\x6a\xad\xf6\x3c\x7c\x3f\xe8\x46\x81\x45\x50\xd8\xf2\xb4\x88\xdc\x50\xb5\xbf\x0e\x37\xce\x95\x26\x8d\xe7\xba\x41\x08\xa8\x21\xa4\x83\xe0\x7f\xec\x0f\xb4\x99\xc9\xf9\x5e\x9e\xdf\xa6\x0c\xe7\x83\x82\x1d\xc0\x1d\xa0\xaf\xa5\xf6\x5c\x2c\x28\xa0\x90\x94\x7b\x01\xf9\xf7\xbb\xc5\xf7\xa9\x7b\x03\x5c\x8a\x59\xac\x94\x18\x20\x7c\xe7\xf5\x0d\x17\x2b\xea\x3b\x79\xed\x6c\x94\x10\xc4\x85\xa7\xa8\x53\xf4\xc1\xa3\xcf\xc8\xd1\xde\x64\x8f\xb4\x8b\x2a\x8e\x61\x1a\xfb\xf0\x01\x92\x7a\x68\x34\xc8\x32\xff\x00\x59\x6d\x7f\x87\xda\x32\x3f\x6b\xbc\xba\x18\xed\x0a\xaf\x7b\x8f\x20\x05\x0d\x74\xfd\xe5\x90\x02\xa3\xb8\xf6\x0b\x0c\xaa\x12\x01\x32\x28\xa8\x94\x36\x88\x15\x02\x89\xe5\xe8\x68\x29\x77\xb3\xf1\xa4\xa0\x8c\x5f\xa0\xf6\x5a\x67\x51\x19\x07\xda\xf4\xd5\x47\xf6\xe3\x15\xd4\x2e\x3f\xb3\x1f\x23\xed\xe3\x96\x0f\xd8\xe8\xf9\xb1\x3d\xd0\x82\x37\x66\x16\xb0\xf1\xc1\x87\x9f\x7e\xdf\xc2\xf8\x51\x74\xc9\xeb\x5c\xc1\x38\xa4\x03\xed\xcd\x52\x79\x0f\xb5\x11\x68\x62\xc8\x4b\x15\x63\x5e\xfa\x6f\xae\x15\x54\x5b\xff\xe6\x17\x45\x45\x49\x69\x09\xde\xc0\x8e\x09\x2c\x02\x22\xa0\x1c\xee\x91\xc2\x5b\xed\x80\xd9\x32\xbb\x8d\x8a\x70\xca\xdb\x04\xd9\x31\xb1\xef\xa6\xf2\x79\xac\x79\x4a\x0a\xbe\x2e\x04\x2b\xd6\x68\xb7\x23\x9b\xd9\x10\xf8\x76\xac\x34\x3a\xcd\x4e\x43\x05\x11\x81\xc6\x6a\x77\x54\xe0\xd8\xb1\x62\xb5\xdb\x8d\xb6\x0a\x02\xf4\xa7\x65\xb5\x5a\x2a\x70\xed\x58\x31\xf4\x56\xa3\xab\x82\x04\x15\xd3\x3b\x0d\x53\x05\x5b\x3b\x56\x3a\xed\xa6\xd1\x55\xc1\xc6\x56\x94\x90\x07\xcc\xe2\x22\xf9\x23\x31\xa1\xb8\x57\xcc\x17\x10\xd2\x77\xf7\xf8\xe9\xa4\xab\x3d\x6c\xa8\x76\x0a\x31\x98\xdb\x20\x20\x97\xdb\xd3\xe2\x6f\x0e\x5b\x0a\x32\x6c\xa9\x70\x75\xb1\x4c\x61\xfc\xce\x87\x9f\x8e\x07\x65\x42\xad\x13\x4c\x82\xc2\x3b\xe8\x3c\x39\x47\x2c\x42\x22\x6b\xa7\x1a\x06\xb8\x85\x1b\xcd\xf7\x40\xaa\xe5\xe0\x03\x23\xf8\x39\x9d\x38\x21\x0c\xaa\x50\x61\x79\x99\xec\x42\x9f\xe6\x3a\xe1\x75\xf4\x40\xcb\xbd\x3c\x98\x43\x51\x7b\xa2\x3c\x18\x26\xef\x9c\xc8\xce\x26\xbb\x63\x20\xa2\x4a\x29\x10\x0e\xd5\x1d\x10\xd5\x47\x60\x4b\x08\x68\x72\x92\xe1\x55\x6c\xb5\xcf\xaa\x58\xa9\x57\x30\x5e\x6c\xdb\xae\x20\x4c\xec\xc4\xd0\x16\x18\x27\xc8\x4f\x2e\x69\x70\x08\x5b\x1e\x8e\x72\x20\x95\x1d\xe7\x92\x58\xfa\xa1\xd7\xcf\x61\xae\x2b\xa3\xca\x5e\x68\xd3\xd5\xa8\x20\x27\xe7\xec\x45\x70\x6a\x43\xed\x23\x9a\xaa\x53\x1a\x64\x55\x91\x3d\xff\x01\x03\xe7\x39\xae\x1b\xc5\x9e\x1f\x85\x67\x7e\x18\xc2\x98\x21\xcc\xc9\xf8\x4d\x2c\xa2\xd2\x4e\x49\x00\xf0\x1d\xb4\xa1\xb6\x71\x62\x18\xa6\xa3\xc8\x83\x4c\x06\x61\x01\x0f\xec\x12\x26\x69\x2c\x84\x1f\x29\x48\xbb\x06\xd7\x7e\xaa\xfc\xa0\x13\x7d\x86\xa6\xb3\x2a\x52\x62\xb0\xa0\xc4\xe0\xd3\x53\xa8\x2a\x2e\xd6\x4e\x2e\xd6\x5b\xea\x0e\x84\x5c\x3c\x59\x97\x8b\x27\x1b\x0a\xe2\xc9\xa6\x70\x73\x96\xfb\xc1\xe5\xf9\xfc\x80\x0a\xc3\x1a\xcc\x45\x1a\x2c\xd1\x16\x77\x8f\x54\x85\xa1\x24\xa2\xc0\x5c\x5e\x81\xe5\x73\x26\x53\x5e\x3b\x80\x71\x0d\x93\xde\x57\x36\x81\x7a\x32\xfb\x4b\xde\x81\x68\x9b\x92\xaf\x8c\x2b\x3d\x99\xfd\x25\xef\x68\x50\x5b\x1a\xd3\xd6\x60\x31\x6d\x6f\x6f\x65\x2a\xb7\xaf\x58\x8c\xd4\x10\x07\x4f\x9d\xef\x87\x83\x76\x19\x1c\x34\x0b\xad\xaa\xab\xc0\x25\xb0\xc6\xb4\x06\xf4\x9b\x87\x26\x76\xb5\xed\xf0\x83\x42\x02\x82\xe4\x21\x4c\x52\x4e\x66\x4b\x88\xc0\x84\x47\x89\xf6\x67\x33\xe0\xe0\x75\x31\x1c\x61\xa8\x02\xcf\xbe\x95\x13\x6c\xee\x67\xe0\xe6\x39\x48\xe0\x8c\x90\xba\x43\x6c\x5f\xee\x01\x1b\x2c\x2a\x53\x72\x9f\xb6\xac\x50\xfd\xf0\x2f\x3c\xec\x76\x4a\x63\x5f\x47\xeb\x4d\x14\xc2\x30\x7d\xed\xa0\xe4\xc7\x1b\x98\x44\xc1\x03\x8c\xed\x98\x7e\xc7\xd3\xfd\x12\xa6\xa4\x54\xf8\x3c\xdd\x4a\x9b\xf6\x53\x9f\xc4\x72\x50\x45\x95\x6b\x1e\xfe\x83\x2a\x18\x7e\xd3\x99\x15\x14\x54\xcd\x74\x35\xde\x88\xab\xec\x57\xe6\xf5\x53\x79\x80\xbd\x11\x76\x22\x66\xb8\x78\x2c\x89\xe1\xe2\xf1\xa7\x4c\x99\xed\x9a\x8d\x48\xc1\xaa\xad\x63\x9b\x16\x93\x3f\xfa\xa5\xef\x3c\x8d\x20\x15\xd4\x4e\x41\x19\xb2\x72\x18\xcc\xa0\xd0\x13\x8d\xbf\x3f\x5e\xec\x13\x92\x3b\x0a\x8c\xa1\x16\x41\xea\x30\x9a\x61\x21\xef\x4f\x72\x4f\x4a\xef\x61\x0c\x31\x6c\x61\x18\x49\x05\x32\x24\x48\x54\xa3\xe4\xc1\xa5\x1f\x42\x4f\xa2\xbe\x4b\xac\x1c\x28\xd8\xab\xc4\xa6\x92\xf4\xcb\xec\xfa\x4a\xa6\xf7\x26\x4a\xb0\x78\xa3\x48\x42\x2d\x62\x37\x11\x6e\x69\xe5\x3f\xc0\x50\x4a\x23\x69\x9a\x9b\x32\x59\x6f\xeb\x2b\xc9\xba\xff\x2d\x95\x60\xbe\x1f\x53\x41\xa6\x6f\x4f\x36\x1e\x99\xde\xfd\x92\x34\x90\xaa\x20\x3f\xee\xde\x79\xf9\x8f\xe4\xd5\xb8\x1c\xe1\xdb\x3d\x10\xe1\x9b\x63\xfa\x61\x75\xac\xe4\xfa\xd8\x03\x4d\xe0\x6a\xc9\xdd\x22\x33\x2a\x85\x3a\xb9\x30\xf2\xbc\x4d\xc9\xf4\x72\xc6\xfc\x82\x1b\x5d\xa0\xad\xa9\x1b\x4c\xc6\xff\x94\xb5\xb3\xce\x69\xe7\xa2\x8e\x03\xf2\x21\xcd\xec\x62\xa4\x78\x1d\xcc\x80\x0e\x74\x20\x87\xab\x33\x96\x5b\x26\xc7\x15\x3a\x70\xb5\xf7\xc6\x18\x31\x36\x74\x9d\x4d\xb2\x0d\xc8\xb3\x64\x93\xc1\xbc\xde\xe5\x68\xae\x2b\x3b\x56\x9a\x4d\xbd\xdb\x50\xc1\xbd\x1d\x2b\x6d\xdd\xb0\x74\x15\xac\x91\x9d\xda\x6a\x77\x55\x70\x81\xb2\xb6\xf4\x76\x5b\x05\x83\xa3\xd5\x6c\x55\xc5\x6e\xb0\xa1\xf7\x5d\x6c\xd2\xbc\xbe\x92\x7d\xf2\xe3\x6d\x1c\x05\xd0\xc6\xc3\x12\x85\xf2\xfc\x47\x55\x8b\xe1\x3a\x7a\x80\x59\x84\x1a\x85\x0b\x56\x15\x40\x6f\xf1\xf8\x3d\xa4\x9b\x5a\x15\xfc\xa6\xc7\x2d\x6c\x7a\x0a\x32\x2c\x03\x99\x12\x15\xfb\xce\x15\x25\xe4\xd5\x23\x19\x76\x36\x3e\xa3\x2a\xa7\x83\xdc\x10\x94\xa0\xc2\x33\x78\x77\x32\xe9\x39\xb1\xeb\xc8\xb3\x5d\x2d\xba\x78\xc5\x88\xc5\x4f\xe9\xc9\x37\x3f\xfc\xcb\x76\x35\xf7\xd7\xa9\xf2\x95\x5d\xf4\x4b\x7a\xb7\x2b\xed\x66\x0e\x7c\xfc\xe2\x05\xf5\x27\xd2\x3e\x00\x5f\x83\x5f\x40\xa0\xad\x33\xfa\xcf\x5d\xed\x55\xeb\x46\x71\xb4\x8f\xe0\x76\xad\xdd\xfd\x01\xd6\xda\xaf\x57\x60\xad\x25\x2b\xe0\x6b\xe3\x26\x48\x30\x9c\x7f\x82\xe1\xfc\x13\x8c\xd9\x9f\x60\x98\xff\x04\x23\xf7\x5f\x68\x7f\x81\x04\x23\xf7\x27\x18\xa1\x7f\xad\xbd\x46\x09\x9f\x6f\x26\xa8\x9e\x5f\xc1\x5a\xdb\x82\x04\xa3\xf9\x27\x18\xcd\x3f\xc1\x68\xfe\xf7\xda\xbb\x39\xb8\x9d\x23\xd5\x82\xda\xbe\xd3\x46\x7c\xdb\x89\x36\xd9\x2c\x40\xa2\xb9\xae\xc9\xe8\x48\x56\x20\xd1\x66\xfe\x3d\x31\x3f\xc0\x00\xac\xb5\xcf\x3a\x48\xb4\xb7\xbf\x22\x72\x46\xc1\x6f\x60\x89\xfe\xfd\xf2\x5f\x20\xd1\x2e\x17\xef\x40\xa2\xc5\xad\x47\xb0\x99\x13\xcf\xd7\x5c\x45\xfd\xfc\xff\x03\x00\x00\xff\xff\x31\xb8\x08\x0e\xc7\x2c\x02\x00") - -func bindataTkgWebDistTkgkickstartui742es5Fed85f8921ac5074e243JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui742es5Fed85f8921ac5074e243Js, - "tkg/web/dist/tkg-kickstart-ui/742-es5.fed85f8921ac5074e243.js", - ) -} - -func bindataTkgWebDistTkgkickstartui742es5Fed85f8921ac5074e243Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui742es5Fed85f8921ac5074e243JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/742-es5.fed85f8921ac5074e243.js", - size: 142535, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui917es2015811d90b19a852dcbc427Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x8b\x76\xdb\xb8\xd1\x00\xfc\x2a\x0c\xbf\x36\xbf\xf8\x17\xe6\x12\xbc\x53\xfe\xd4\x3d\x5a\x59\x49\xb4\x49\x24\xad\xe5\x38\x8d\xfd\xf9\x78\x29\x12\xb4\xd9\x50\xa4\x42\x42\x76\x1c\x47\xef\x90\x37\xc8\xbb\xe5\x49\xfe\x03\xf0\x7e\xd3\xc5\x71\xb6\xdb\xfe\x6d\xcf\xd9\x58\x20\x2e\x83\xc1\x60\x66\x80\x19\xcc\xb0\xab\x08\x31\x11\x0e\x5d\x0b\xb3\x87\x9d\x08\x79\x0e\x7f\x8b\xe6\x4b\xd3\x7a\x3f\xb8\x5e\xf9\xef\xf1\xfb\xab\xcb\xf7\xae\xf5\x3e\xc2\x66\x88\x2f\x57\x6e\x6f\x6b\x8d\xcf\x9f\xcf\x2f\x38\x7e\xb9\x8a\xae\x3b\xe7\xe7\x06\xd4\x2e\xc0\xbd\xa1\x18\x50\xeb\x3a\x2b\xdf\xc2\x6e\xe0\x77\x10\xc0\xc0\xe5\xee\x5d\x3e\xec\x60\x0e\xb8\xbc\xdd\xc1\xe0\xbe\x7f\x1b\xbd\x75\x3f\x99\xa1\xfd\x3a\xb0\x57\x1e\xca\x6b\x73\xf7\x21\xc2\xab\xd0\x67\x3e\xe1\xf5\x9a\x3b\xbc\x31\x43\x26\xec\xb9\x1d\x49\x57\x74\x89\x03\x41\xcf\xed\x88\xaa\x68\x48\x1c\xf0\x7b\x6e\x47\x96\x65\x55\xe5\x80\xd7\x73\x3b\xd0\x50\x74\x91\x03\x26\xa9\x60\xe8\x92\xce\x01\x8b\xfc\x29\x29\x0a\x07\x22\xd2\x01\x54\x25\x85\x03\x27\x3d\xb7\xa3\x6b\x0a\x34\x38\x70\x49\x3a\x50\x35\xd2\x6a\xd9\x73\x3b\x8a\x24\xc8\x1c\xb0\x49\x23\x02\x3f\x07\xfa\xa4\x95\xa2\x29\x3a\x07\xc6\xbd\x4e\x87\xeb\xfd\x3d\x01\xad\x83\x7a\xe3\xcf\x9f\x3b\xe3\xde\xfd\x9a\xe3\xf8\xc9\x78\x78\x32\x7a\x3d\xec\xb1\x81\x8f\x4e\xdc\x05\x1a\x84\xc8\x46\x3e\x76\x4d\x2f\x62\x01\xe2\xa7\xc7\x93\x67\xa3\x57\xc3\x1e\x6b\x65\xe5\xd3\x30\x70\x5c\x0f\xb1\x60\x4c\xa7\x87\xd6\x5c\x87\x03\xab\xea\x10\xab\xcf\x9f\x3b\xab\x78\x88\xe1\x3f\x46\xb3\x93\xd1\xf8\x79\x8f\x45\x1f\xdd\x08\xbb\xfe\x15\xe9\x79\x3c\x7c\xdb\x63\x7d\x74\xcb\x82\x55\xa1\x9f\x61\xb5\x9f\xe1\xe7\xcf\x9d\x61\xdc\xcf\xf4\x78\x72\x3a\x3a\x1a\x1e\xf7\x58\xf3\x36\x9a\x86\xc1\x8d\x6b\xa3\xf0\x59\x10\x2e\x48\x77\xa7\xd3\x41\x8f\xbd\x59\x5a\xe9\xef\xf1\xe4\x68\x38\x1b\x9e\xc4\xe3\x9a\xb7\xd1\x38\xb0\xd1\x0c\x61\x32\x7a\x5c\x65\x58\x18\x75\x56\x1d\x75\xf6\xf9\x73\x67\x16\x8f\x5a\xe8\xe8\xb2\x7f\x76\x09\xb3\xde\xfa\x9f\x60\x65\x20\xf2\x5d\x2c\x7c\x17\x1b\xbe\x4b\x85\xef\x52\xf5\xfb\x2f\xfd\xd9\xc9\x68\x32\xbe\x7c\x31\x99\x9d\x5c\x0e\xc7\xfd\x5f\x5e\x0d\x8f\x7a\xec\xdc\x8c\x08\x6d\xbd\x08\x22\x3c\xf4\xcd\xb9\x87\xec\x6a\xbb\xc1\xf1\xb0\x7f\x32\xbc\x1c\xbc\x9a\xbc\x39\xba\x7c\x36\x39\x7e\xdd\x27\xdd\xd0\x45\x33\x31\x1a\x78\xc1\xca\x26\x93\x36\x49\x37\xd5\xb6\xb3\xd9\x8b\xcb\x97\xc3\x77\x97\xe3\x3e\xa1\x82\x28\xba\x7e\x89\xee\xc6\xe6\x02\x55\xeb\x9d\x4e\x07\x97\xd3\x37\xbf\xbc\x1a\x0d\x2e\x67\x6f\x7e\x19\x0f\x4f\x08\x2a\x6e\x96\xd6\x74\x35\xf7\x5c\x6b\xb6\x9a\xfb\x08\xd7\x10\x52\x6f\x24\xd6\x1a\xd5\xb0\x54\x6f\x24\xd5\x1a\xd5\x50\x47\x1b\x1d\x8f\x4e\x09\x1e\xca\xf0\x85\xee\x8d\x89\xd1\x26\x00\xcb\xcd\xc4\x7a\xb3\x66\x10\xcb\xcd\xa4\x7a\xb3\x1a\x90\x6f\x27\xc7\x2f\x87\xc7\x27\xef\xa6\x43\x32\xca\x6d\x10\xbe\x47\x21\x21\x85\x91\x1f\x61\xd3\xb7\xd0\xc9\xdd\x12\xd5\xc6\x2a\x34\x92\xda\x1a\x49\xc9\x5e\xa5\xfb\xe3\xb2\x3f\x18\x0c\x67\x33\xb2\xaa\x3d\xd6\xb4\x2c\x14\x45\x2f\xd1\xdd\xe8\xa8\x5c\xe7\xcd\xc9\x8b\x4b\xd2\x69\x8f\x35\x57\xf8\x9a\x74\x52\xfa\x9e\x6c\xfc\x84\x2c\x96\xf1\x9e\x4f\xe9\x22\xab\x75\x3c\x7c\x4e\x09\x2d\x44\x57\x09\x69\x65\x9f\x66\xc3\xc1\xf1\xf0\xa4\x04\x4b\x84\xac\x10\xe1\x7e\x0a\x51\xa5\xfa\x6c\x46\x48\xff\x64\xf2\x72\x38\x26\x55\xa3\xc8\x0d\xfc\x93\xe0\x3d\xf2\x93\xed\x7d\x99\xf2\x91\xcb\xd1\x51\xce\x4a\x4e\x97\xd6\xc8\xae\xd5\x18\x8c\x8e\x8e\x4b\x75\x06\xae\x1d\xa6\xb5\xc6\xc3\xb7\x49\x85\x9b\xa5\x95\x15\x4e\xc6\x97\xa3\xf1\xc9\xf0\x98\xac\xe5\xb3\xfe\x80\xf2\x0d\x3f\xf0\x47\x3e\x46\xa1\x8f\xf0\x33\xd3\x22\x3d\x4d\x07\x69\x83\x74\xf9\xc9\x52\x25\xdd\x2d\xe3\xc5\x27\x8b\x53\x1c\x2f\xa1\xe5\x62\x45\x4a\xc9\xd5\x7a\xf1\x6a\xdc\x2c\xad\x78\x31\x66\x39\x83\x3a\xb4\x02\x3f\xc2\xcc\x55\xef\xde\x71\x91\x67\xbf\x36\x97\x4b\xd7\xbf\x8a\xba\xe7\xf7\xbe\xb9\x40\xdd\x59\xc3\xb2\x82\x10\x7d\x58\xb9\x21\xb2\xbb\x4f\x04\x60\x23\xc7\x5c\x79\xf8\xd4\xf4\x56\xa8\x3b\x4e\x99\x3a\x58\x86\xee\xc2\x0c\xef\x4e\x42\xf7\xea\x0a\x85\xa4\xa2\x67\xce\x91\xd7\x65\xfb\x6f\x67\xcc\xe0\x78\x78\x34\x1c\x9f\x8c\xfa\xaf\x18\xd2\x1f\xbb\x06\xf5\xc1\xb2\xb5\x05\x0b\x33\x7a\x5f\xec\x80\x7e\x61\x5e\x0e\xdf\x31\xa3\x23\xa6\x33\x99\x12\x7e\xd4\x7f\xc5\xb1\xc0\x0e\xc6\x01\xee\xaf\x70\x70\x8c\x22\x1c\x84\xa8\xfb\x44\x68\xe8\xb9\x46\x3c\xd5\x01\xe2\x0a\x4c\x61\x9c\x87\x0c\x52\x20\xb9\xbc\x63\x5a\xc8\xd0\xc2\x07\x74\x5a\xdc\x37\x2d\xe8\x4c\xaa\xec\xda\x63\xbc\xc7\x4a\xeb\x99\xf4\x1b\x7f\x69\xee\xe7\x62\x4d\xc9\x67\x40\x14\x06\x09\x8a\x1a\x07\x26\xe4\x4f\xdd\x10\x05\x0e\x8c\x88\xc6\x21\xa8\x92\xc1\x01\x87\xa8\x11\x8a\x28\x48\x1c\x38\x23\x1a\x83\xaa\x19\x1c\xb8\x26\x6a\x84\x26\x8b\x12\x07\xe6\xa4\xaa\x2c\xc8\x06\x07\xa6\xe4\xbb\xa0\x4b\x22\x07\x16\x3d\xb7\x63\xa8\x82\xa6\x71\x87\xa9\xea\xc3\x1c\x13\x55\x89\xbb\x87\x4f\xd1\xd3\xa7\x9d\x11\x7f\x72\x75\xd6\x11\x00\x6b\x79\xe1\x01\x0e\x02\x0f\xbb\xcb\x03\x2b\xf0\x31\xf2\x31\x0b\x44\xc8\x81\xb8\x06\x04\x6c\xb4\x34\x7d\x96\xfc\xbe\x5c\xbd\xe9\x88\x80\x65\x06\xd7\x41\x10\x21\x26\xd7\x44\x98\x44\xe5\x60\x3a\x21\xb2\x82\xc5\x02\xf9\x36\xb2\x39\x06\x07\x4c\x84\x3c\x64\x61\xc6\xf4\x19\xd3\x0b\x91\x69\xdf\x31\xe9\x9e\x67\x08\xd2\x73\xa5\x85\x49\x38\x18\x60\x82\x90\xb1\xe2\x01\x26\x3e\x3a\x20\x2a\x4f\xa1\x5a\x44\x3a\x45\x64\xcb\xd3\xf6\xa6\x65\x05\x2b\x1f\x97\x2a\xd8\x6e\x88\x2c\xec\xdd\x31\xae\xcf\xe0\x6b\xc4\xc4\xec\x8c\x79\x89\xee\x08\xa9\x9b\xbe\xcd\xcc\x28\x9b\x2b\x7e\xa0\xbb\x36\x62\x9c\x20\x64\xee\x82\x55\xc8\xf4\x17\xe6\xa7\xc0\x67\xde\xa2\x39\x33\x43\xe1\x8d\x6b\xa1\x28\x1d\x8b\x67\x28\x2e\x3e\x9c\xf5\x3b\xd9\xbf\xdc\x3a\x43\xf2\xab\x32\x92\xf1\x8b\xb7\x1d\x01\x88\x32\x28\x22\xb4\x11\xe5\x12\xad\x71\xf9\xe6\x8c\xa0\x38\x43\x79\x3a\xcc\xf8\x72\x59\x1a\xe6\xa6\x71\x18\xf5\xb1\x87\x79\xde\x38\x8c\xbe\xc3\x30\xe2\x3e\xc3\x9c\xc6\xc3\xb8\x4e\x27\x1d\xe9\xce\xff\xd8\x11\x0a\x83\x2c\x4b\x04\x38\xfc\xd7\x12\xc0\x64\x49\xa0\x36\x3d\xef\x8e\x89\x96\xc8\x72\x9d\x3b\x42\xe0\x04\x9c\x44\x2a\x32\x98\x88\x45\x32\xfe\x2c\x29\x38\x89\x0b\x9c\xa4\xf7\x02\xe4\x6e\xc4\x58\x81\xef\xb8\x57\xab\x10\xd9\x84\xba\x13\x3e\xc2\x60\xb4\x58\x06\xa1\x19\xde\x15\x27\xc7\x33\x23\x67\xa7\x09\x99\x21\x62\x3c\xe4\x60\x66\xee\x99\xfe\x7b\x10\x13\x2d\x41\xa6\x04\x58\x93\x05\xa2\x98\xe2\x53\x06\x6c\x09\x7b\xb7\xae\xe7\x31\x73\xc4\x84\x28\x0a\xbc\x1b\x64\x33\xe6\x0a\x07\x44\x33\xb5\xe8\x84\x9d\xc0\xf3\x82\x5b\xb2\x7f\x09\x6a\x07\xaf\x46\xcc\x32\x44\x16\x69\x6e\x21\x26\x5c\x79\x28\xe2\x4b\x4b\x4d\x86\x50\x00\x9b\xec\x1a\x42\x10\x2a\x60\xe7\x61\xf6\x4b\xcb\x7f\xad\xde\x74\x74\xc2\x5d\xaa\xc0\xf8\x01\x26\x00\x45\x26\x81\xc6\xf5\x33\x74\x51\x6d\x99\x21\x4c\x23\x02\x14\x0b\x71\x6d\x14\xa3\x91\xb4\x40\x98\x41\xa6\x75\xcd\x60\xc2\x44\xca\xfc\x26\xa2\x18\x4a\x79\x36\xe3\x05\x74\x7a\x05\x30\x8d\x12\x98\x50\x28\xc1\x09\x21\x60\x99\x37\x11\xa2\x48\x08\x7c\x74\x80\xab\x6c\x6a\x11\xd8\x88\xb9\xbd\x46\x3e\x59\x71\x3a\xd6\x2a\xa2\x58\x6b\x5a\x55\x26\x98\x63\xd3\xf5\x91\xcd\xdc\xb8\x26\xa1\x25\xca\xe1\x96\xa1\x1b\x21\x66\x61\xfa\xe6\x15\xb2\x99\xc8\xc5\x88\xf0\x46\x1b\x2d\xbd\xe0\x8e\x74\xe5\x84\xc1\x82\x54\x76\x13\x3d\x93\x09\xfc\x46\xba\x8d\x07\x1e\xf5\x5f\xe7\x35\x13\x66\x1b\xf1\xcc\x1b\xfa\xd1\x6c\xe0\xc4\x84\x32\xc9\xf4\x0a\x2c\x9d\x59\x20\x7c\x1d\xd8\xcc\xed\xb5\x6b\x5d\xc7\xe8\x5e\x98\xef\x11\xe3\x12\x3c\x47\x2e\x0a\x09\xe2\x97\x28\x74\x82\x70\x91\x00\xbe\x40\x64\x77\x7a\xab\x88\xec\xd8\xd5\xf2\x2a\x34\x6d\xb2\x95\x7c\x9b\xb1\x91\x87\xc8\x0a\x46\x15\x8e\x4a\x77\xbc\x08\x58\xdb\xbd\x61\x81\x94\x95\x48\x49\x09\xcc\x79\x8f\x1c\x33\x9f\xa5\x19\x45\xb7\x41\x68\x53\xee\x43\xd0\x18\x66\xc4\x0e\x15\xc0\x52\x59\xcc\x02\x91\x76\x45\x38\x18\x54\x81\x28\x67\x35\xb4\x12\x07\xcb\x17\x5c\x8f\xcb\x5d\x8b\xa8\xcd\x2a\x29\x7e\x37\xb6\x3a\xd0\x00\xaf\x80\x04\xda\xe4\x26\x94\x6a\x6c\xae\xb8\x17\x08\x3b\x14\x00\xeb\xfa\xcb\x15\x11\xb2\x4a\x56\x98\xb0\x51\xd2\x4f\x18\x78\x07\xd7\xc8\x5b\x26\xb3\x28\xc9\x99\x04\x66\x51\xac\xe1\x42\x94\xb6\xe2\x42\x94\x1b\x70\x21\x2a\x40\x54\xb3\x1a\x6a\x33\x2e\x44\xad\x11\x17\xa2\x0e\x6e\xbe\x0f\x17\x46\x8e\x0b\x2d\x2d\x94\x84\xbd\x70\x21\xc1\x1a\x2e\x24\x31\x01\x97\x74\xdd\x80\x08\x49\x6a\x40\x84\x24\x03\x51\xcf\x6a\x28\xcd\x88\x90\xd4\x46\x44\x48\x1a\x78\xbe\x01\x11\xa2\xb1\x0d\x11\x92\x9e\x21\x42\x12\xb2\x42\x63\x67\x44\xa4\xff\xfe\xf2\xdb\xfb\x0e\xc7\x01\xf1\x29\xe2\xee\xe3\x13\x09\xea\x8d\xf8\xe0\xe3\x6d\x87\x3b\x1c\xf1\x1f\x97\x6a\x07\x52\x58\x96\xbf\x9d\x76\x10\x7f\x8d\x17\xde\x33\x22\xf7\x5e\x11\x64\x44\x7c\xe1\x24\x4a\x2a\xfd\x86\x4f\x3a\x90\xce\x91\x34\xdc\xd0\xae\x72\x6a\x4c\xdb\xc6\xe4\xbd\xb5\x6d\x7e\x8c\x4c\x1b\x4a\x32\xb7\xce\x75\x83\xbb\x26\x15\x44\x7a\x74\x4d\xe7\xa8\xa6\x82\x24\xfa\x71\xb0\x8c\x2f\x65\x24\x3d\x63\xfe\xb9\xde\x57\x46\x35\xe6\xff\xe2\x2e\x96\x9e\x6b\xb9\xf8\x70\xc4\xff\xa6\xfe\xda\x61\x6f\xc8\x89\x8e\x05\x28\x45\x05\x6d\x3b\xf9\xb0\xea\xa0\xe2\x1c\x3f\xec\xa9\xff\xcc\xf6\xd5\xaa\xa9\xda\x40\x04\x51\xaa\x8f\xe7\xea\x36\x61\xf1\xf1\xca\x33\xef\xd1\x5d\xcc\x9a\xab\x6a\x8c\x93\xde\x4d\x15\x55\x95\x4c\x57\x4a\xe5\x85\x59\x50\x5a\x5c\xef\x8e\x21\xbc\x28\x96\xc5\x64\x0c\x2a\x7b\x3c\x0f\x85\xcc\xad\x8b\xaf\x83\x15\x66\x6c\x37\x5a\x7a\x26\x15\x65\xa6\x85\x57\xa6\xc7\x50\x6c\x45\xa9\xde\xf6\x66\x54\x10\xc7\x52\x49\x1c\xcb\x25\x69\xac\x94\xb4\x86\x4c\xb8\x31\x96\xe9\x13\x35\x20\xdb\xf8\x2a\x55\x7d\x24\x29\x6d\x47\xd8\x5a\x3e\x9f\x44\x3e\x5f\xc7\x9a\xc2\xe0\xd5\xa8\xa6\xc7\xe8\x44\x8f\x39\xb9\x46\x51\x2e\x40\x63\x3d\x2b\x30\xed\x2d\x8a\x52\x06\x83\x11\xc3\x20\x67\xc4\x24\x00\x36\x19\xaf\xa6\x49\xd5\x00\x20\x6a\xc7\x7e\xd2\x52\x52\xaa\xd2\x32\xa6\x80\x8d\xb2\xb2\x20\x28\x25\xf5\xe1\x82\xf2\xee\xc1\xc2\x81\x0a\x23\x01\xb0\x31\xac\x2c\x90\xb4\xa2\xa4\x4c\x77\x24\x54\x32\x49\x24\x82\x23\x20\x02\xb1\xf0\x4d\xad\x09\x1b\xe9\x0f\x66\xa7\x85\x2b\xb9\x3a\x3b\xa5\xd3\xa7\x1c\x82\x5e\x77\x4f\x1c\x16\xa0\x62\x8b\xa8\xc8\x1e\xfe\x52\x63\x0f\x31\x17\x84\xe2\xe3\x70\xc1\x4d\x33\x14\xf3\x09\x26\x5a\xdc\xc9\xdd\x12\x1d\xa1\xc8\x0a\xdd\x25\x0e\xc2\x74\x6a\x42\x11\xe0\x8f\xff\x4a\x66\xfa\xac\xf5\x9a\x23\x5d\x7a\x14\x86\x41\xbc\xf2\xb3\xa3\x9b\x0e\x04\x52\x2e\xa0\xb9\x75\x3c\xfe\x9b\xde\x79\xdb\x9d\x51\xeb\x05\x55\xfd\x4a\xa8\xf9\x2a\x6e\xd3\x35\xda\xc5\xa1\x87\x30\xf3\x29\x31\x77\x58\x9e\x19\x45\x0c\x62\xd0\x47\x8c\x7c\x3b\x62\x06\xfc\x28\xc6\x4f\xb8\xb2\x70\x10\x76\x10\x77\x1f\xad\x96\x28\xec\x70\x00\x5f\xbb\x11\x6f\x2e\xdd\x81\xe7\x22\x1f\xf7\x50\x5c\x40\x38\x93\xeb\x5f\xf5\x9e\xc0\xa4\x42\x72\x93\x4c\x2f\x1a\x7b\xf9\x45\x23\xfd\x18\xdf\x11\x47\xbd\xf3\x8b\xf8\x77\x91\x1c\xb3\xc2\x1b\xd3\x73\xed\xc2\x11\xad\xf7\x04\xae\xad\x55\x84\x83\x85\xfb\x09\x3d\x0b\xc2\x45\x87\xbb\xa7\x15\x89\xcc\x78\x1e\x06\xab\x25\x6f\x99\xfe\xeb\xe0\x06\x9d\x04\x63\xf4\x11\xf7\xc8\xc4\x2a\x15\x68\x9f\x4f\x9f\x36\xf6\xbf\x8e\x10\x3e\xad\x94\x91\x79\x37\x03\x83\xc0\x13\xa1\xd7\xeb\xa1\xa7\x4f\x2d\xfe\x8c\xb7\x4d\x6c\x26\xa7\xa0\x63\x74\xe5\x46\x38\x34\x43\x1e\xc7\x97\xa9\x9d\xf3\x09\xff\x8a\xef\xbf\x9d\x5d\x3e\x1f\x9e\xe4\xf7\xd2\xa7\xd3\xc1\x0c\x14\xbf\xf4\x4f\xfb\xa3\x57\xfd\x5f\x46\xaf\x46\x27\xef\x2e\xcf\x26\xe3\x61\xf9\x33\xbd\x33\x3e\x79\x37\x1d\xce\x2e\xb8\xb5\xeb\xbb\xb8\x88\x02\xf2\xbb\x7f\x1b\x15\x21\xe7\xd6\xfe\xd5\xc4\x1f\xf9\x2e\xee\x24\x6b\xc7\xe7\x05\x80\x00\xbd\x8a\x50\x78\x64\x62\x93\x74\x94\x00\xcf\xcf\x57\xae\x47\x0d\x44\x9d\x32\xe6\xe2\x25\xb9\xa5\x86\x4e\xb2\x4c\x20\xfb\x4c\x7f\x5d\x25\x64\x51\xe1\x4c\x3d\x32\x4c\x7a\x4f\xfd\x06\xbb\x9e\x8b\x5d\x14\xf1\x57\x08\xe7\x95\x5e\x9b\xcb\x4e\xda\x9c\x5e\x59\x1e\xc5\x37\xd4\x71\x0f\xd9\xa7\xca\xca\x57\x88\x4e\x00\x19\x1a\x8a\xdf\x4b\x0b\xbf\x42\x83\x6b\xd3\xbf\x42\x11\xbf\x74\x97\xa8\xd3\x11\x40\xc4\xcf\xb9\x8e\x22\x08\x1c\xe8\x08\xe0\x84\xff\xc8\x75\xe8\x86\xee\xfd\xfd\xd7\xd9\x64\xcc\x47\x38\x74\xfd\x2b\xd7\xb9\xeb\x20\xae\xd7\xeb\x55\xca\x30\x47\x5b\x5d\xf2\xc7\x5c\x8c\xaa\x95\x1f\xad\xe6\x84\x57\xcd\x11\xc7\xf1\xd9\xdf\x1d\xd4\xfb\x7b\xbc\x46\x38\x74\x17\x64\x81\x08\x51\xad\xb9\x7c\x23\x10\x4e\x37\xf1\x4f\x73\x00\x3b\x8d\x97\xf8\x59\x3f\xe5\x9d\x85\x9a\xb6\x5b\xaf\x37\x4e\xad\xb9\x3f\xd3\xcf\x75\x8b\x6e\xac\xd8\x21\xfb\x85\xe9\xdb\x1e\xd9\xd7\xdd\x96\x7e\x92\x8d\x1b\xf7\x53\x33\xfd\xb6\x74\x63\xbb\x91\x19\x2e\xe8\x22\x37\xcf\xe6\x89\x90\xe1\xa0\x3c\x24\x2d\xba\x42\x78\x46\x48\xc1\xa6\x65\xcd\x3d\x5c\x81\x0c\xb6\x94\x7a\x10\x1e\xc4\x7c\x97\x36\x9b\x99\x0e\xf2\xee\x9a\x1b\xd7\x07\x8e\xb7\xc4\x02\x45\x11\xf2\xaf\x50\x58\x58\x40\x5a\x17\xdd\x20\x1f\x3f\x73\x3d\x34\x22\x5a\x27\x46\x36\x48\xf0\x5a\x2c\xe3\xe7\xae\x6f\xd3\xfa\x5c\x65\x7d\x13\x9a\xce\x2b\x0f\x89\x60\x48\x91\xd6\x34\x02\xad\x90\xd2\x3e\xbd\xa4\x26\x3b\xd7\x35\xbd\x7e\x02\x75\x87\x5b\x97\x47\xcf\x78\x95\x5d\x1d\x2c\x5f\x9e\x2b\xae\x83\x72\x6c\xd5\xb8\xdd\x13\xc8\xad\x8b\x64\x9a\x88\x48\xdc\x43\xc5\x23\xdb\xd3\xa7\xa5\x9f\x7c\x88\x96\x9e\x69\xa1\x0e\xfb\x7f\x98\x05\x2c\xcb\x01\xb7\x87\xaa\x47\x35\xd2\xa6\x52\x54\x6b\x77\x88\x9f\xf4\xaa\x23\x55\xb6\xf1\x15\xc2\x9d\x46\x51\xc7\x25\xf3\x59\x21\xea\x9a\x41\x3b\xaa\x81\xb0\xb9\xb3\x9a\x84\x2c\xf4\xe9\x72\xed\x32\xa9\x89\xf7\xe6\xba\x45\x49\x58\x92\x21\xfb\x6f\x67\xc7\xb1\xf8\xeb\x70\x19\x27\x5a\xf2\x2f\x39\xc2\x29\x3a\x02\xb0\xf9\xc0\xe1\x3a\xe7\x17\x1c\xa1\xa1\xe6\xf6\x83\xea\x2e\xdc\xde\xd5\x61\x47\x00\x7d\xfe\x88\xeb\x9c\x23\x80\x2f\xf2\xda\x7b\xf0\xaf\x54\x68\xa3\x73\xe1\x82\x8f\x82\x10\x77\x32\x22\xa7\x7c\x3b\x9e\x55\x5a\x58\x12\xe9\xe8\x1c\x5e\x94\xea\x26\x70\x77\xb8\x35\xc8\xa4\x74\xae\x41\x70\xeb\x4a\x97\xf7\xc5\xb6\x35\xae\x92\xa8\x40\x57\x25\xdd\x22\xeb\x23\x1b\x6a\x73\x27\x25\xc5\xeb\xaa\x3e\x07\xb2\xdb\xb6\xf2\xd0\xfb\x4d\xcc\xaf\x34\x02\xe1\x7f\xdb\x99\xe9\xfd\xf9\xfe\x7a\x5d\xab\xd6\x78\x41\x48\x7f\x68\x5a\xd7\x64\x49\x6b\x80\x22\x1e\x07\x33\x2a\xdd\x3a\x1c\x81\x8e\x23\xea\x50\x89\xd6\x22\xba\x15\xa2\x67\x61\xb0\xe8\x4f\x47\x84\x3b\x38\x41\xd8\x49\x38\x04\x13\x38\xcc\x1b\x6e\x03\x1b\xc6\xc5\xfe\xd1\x79\xf1\xe7\x05\xb7\x6e\xe1\x70\xd9\x36\xda\xac\x47\x24\x46\xf0\x8d\x9b\x99\xaa\x28\xbd\xa2\xda\x93\xaa\x3c\x21\xc2\xa1\x8b\x6e\x50\x51\xe2\x6c\xd6\x76\x10\x77\xd8\x24\xb9\x7e\xce\x84\x6e\x6e\x58\x5f\xdf\xa0\xd0\x75\xee\xca\xcc\xa1\x51\x77\xa1\x47\x85\x71\x80\x5d\xc7\xb5\xe8\x0d\x48\x8f\x65\x0f\xd3\xf9\xdf\xaf\x0f\x6b\xc8\xae\x20\x31\x93\x9c\x14\x25\x29\x2b\x3c\xac\x30\x90\x78\x51\x87\xbe\xbd\x0c\x5c\x1f\x77\xee\x13\xdb\xd0\xd4\x0c\xcd\x45\xd4\x45\xeb\x7d\x38\x03\x3d\x38\xb4\xc2\x5e\x91\xa7\xd4\xcf\x21\xba\xee\xdc\xe3\xbb\x25\xea\xa6\x8a\x6d\xbc\x75\x2f\x07\x2f\xfa\xe3\xe7\xc3\x23\xb0\x34\xef\x08\x5a\xba\x0d\x53\xa9\xed\x77\xa2\x3f\xec\x32\x04\xd1\x9d\x27\xb3\xcb\xd1\xeb\xfe\xf3\xe1\x2c\x1b\xe1\x3e\x66\x13\x3b\x8e\xb4\xde\x24\x33\x05\x6e\x4d\x95\xb3\x54\x56\x76\x50\x8c\x8f\x9f\x93\x7f\x29\x84\xe6\x15\xea\xfa\x2b\xcf\xe3\x3e\x7f\x46\x69\xc1\xe7\xcf\x35\x3d\xf3\xb0\x05\x9d\xbf\x8f\x7c\x2a\x7a\xaa\xa6\xa5\x2e\x63\x7a\x5e\xd9\xd6\xe4\xdb\x4c\x3c\x37\x66\xb1\x8a\xa8\x39\x8b\xb6\xe4\x99\xbf\xdc\xe3\xf5\xef\x9b\x65\x3f\xc8\x97\x34\xe7\xc6\x6b\x6e\xed\x46\x83\xc0\xf7\x91\x85\x8f\xdc\x88\x7a\x9d\x65\xce\x8d\x4f\xde\xf0\x21\xb2\x57\x16\x4a\x55\xe7\x06\x19\x5b\x24\x53\x2e\x3d\x82\x21\xca\x02\xdd\x28\xdd\xec\x39\x9b\x4e\xbc\x26\x37\xab\xa3\x6b\xca\xc5\xdf\x24\x5b\x39\xdd\x53\xa5\x42\xc2\xa8\x52\xce\xd0\x74\xc0\x38\x8a\x2f\x05\x27\xa1\x4d\x15\xa3\xf5\x3a\x19\x18\xf1\xff\xb7\x12\x44\x4d\x71\x4c\xab\x97\x39\x73\xe2\x0c\x2e\x1f\xdd\x76\xf0\xe7\xcf\x88\xeb\x8c\xf8\x77\x92\xda\x71\x78\x6f\xca\x11\x12\x48\x9a\x59\x8b\x65\x6f\xc4\xff\x63\xb9\x48\xe8\x10\x81\xf8\x6e\x29\x08\xa3\xee\xf9\x39\x6b\x2e\x97\x07\xe6\x6d\x74\xb0\x4c\x9c\x16\x0f\x22\x8c\x96\xec\xc5\x05\x70\x90\x89\x57\x21\x8a\xba\xe7\x23\xfe\xc3\xe4\x9f\x17\xc0\x46\x96\x17\x75\x25\x1d\xdc\x98\x61\xd4\x85\x10\x50\x02\x8b\x8a\x0e\xa6\xe4\x04\x4f\x9d\x52\x41\x08\x02\xe0\x03\xef\x30\x9d\x43\xef\x2f\xd4\xce\xe8\x7e\x42\xbf\x77\xad\x78\xed\x98\x39\xf6\xbf\x7d\xf9\x8a\x6c\x59\x34\x1c\xa4\x88\xe6\xdc\x31\x14\x4d\x51\x64\x28\xce\x0d\x4d\x72\x14\x45\x50\x91\x69\x89\x8a\xae\x68\xba\xac\x7f\xfb\xf2\x55\x31\x64\x49\x15\x04\x49\x31\x54\x55\x91\x15\x49\x10\xd5\x2e\xf3\x97\x7b\xf6\xff\x56\x8e\xe3\xd8\x42\xfc\x0f\xbb\xee\x52\x67\xa9\xe9\xe4\x15\x75\x35\xec\x32\xbf\x03\x5c\x1c\xde\xbc\x8d\x0a\xd7\xbe\x8c\x6b\x33\xf4\xee\xef\xdb\x97\xaf\xda\xdc\x14\xe7\x73\xd5\x30\x1c\x4b\x17\xec\xb9\x69\x19\xba\xae\xea\x8e\x61\x8b\x92\x66\x28\xa2\x66\x59\xb2\xad\xa9\x92\xfd\xed\xcb\x57\x28\x40\x05\xca\xaa\x01\x45\x41\x35\xa0\xae\xe8\xa2\xb1\x0b\x28\x59\x8d\xff\x81\x5a\x56\x67\x76\xd2\x3f\x3e\xb9\x3c\xe9\x3f\xbf\x1c\xbc\x3a\xbe\x3c\x99\x4c\x5e\x9d\x8c\xa6\xdd\x42\x55\xbd\xa5\xea\x68\x30\x19\xe7\xf5\x7e\x2a\x56\x1c\xbc\x9a\xcc\x86\x2d\x15\xff\x5f\x68\x74\x61\xfc\x67\x3a\x42\xfa\xbb\x0d\x9a\xcb\xc1\x64\x7c\x32\x1c\x9f\x14\xa0\x12\x1b\xdb\xcc\xa6\xfd\x71\x37\x73\x13\x28\xe2\x79\x74\x54\xf0\x31\xc8\xbd\x00\x78\xa6\x30\x81\x62\x9f\xf9\x0c\x68\x9f\xc5\x69\x96\xa1\xff\xa9\x30\x9f\xda\xcc\x5b\xe1\xff\xa9\xb8\x02\x8d\x6d\xba\xbf\x03\xb7\x4a\x37\xb1\x0a\x5f\x9c\x56\x4a\x3b\xa6\x22\x21\x41\x72\x2c\xcd\x50\xac\xb9\xac\xea\xc6\xdc\xd0\x11\x52\x15\x01\x49\x8a\x2a\x2a\x73\x68\x42\x28\x28\xce\xfc\xdb\x97\xaf\xa2\xa6\xeb\x8a\xa1\x4a\xd0\x10\xa0\xae\x8b\xaa\xa6\xed\x49\x3b\xa2\xba\x33\xed\x88\x6d\x64\x56\xa5\x1d\xb1\x0d\x1b\x15\xda\x11\xf5\x3f\x8a\x76\xea\xb8\xfe\x51\xf4\x93\xcf\x69\x1f\xfa\x29\xac\x42\x1b\xfd\x84\x75\xfa\x29\x9a\x97\x52\xda\x41\xba\x61\x08\xba\x29\x58\x48\xb3\x6c\x41\x71\x74\xcb\x91\x2d\x24\xce\xa1\x33\x47\x92\x62\xeb\x32\x54\x6c\x5b\x10\x35\xc2\x02\x65\x05\x4a\x9a\x22\x6b\x9a\x28\x09\x82\x22\xc8\x50\xde\x8f\x76\x24\x65\x67\xda\x91\xda\xc8\xac\x4a\x3b\x52\x1b\x26\x2a\xb4\x23\x69\x7f\x10\xed\xd4\xdd\x93\xca\xde\x48\xdf\x4f\x32\xf9\x54\xf6\x21\x99\x02\xf2\xdb\x48\x26\xa8\x92\x4c\x83\x7b\x4a\x4a\x37\x50\xb1\xe4\x39\x52\x8c\xb9\x26\x48\x92\x6a\xa8\x8e\x26\xce\x25\xd5\xd0\xe6\xba\x69\xeb\x32\x92\x1c\xc7\x12\x24\x55\x13\xbf\x7d\xf9\x2a\xab\xa2\xa2\xeb\x9a\xaa\x6b\xb2\xa2\x11\xc1\x25\x29\xff\x95\x57\x19\xdd\xe4\x56\xe5\xad\xd6\xe4\x8a\x11\x34\x31\x26\x96\xd8\x52\xa6\x59\xe4\xd6\xe3\x3f\xb5\x94\xf3\xab\x24\x97\xe8\xeb\x29\x99\xa9\x8a\x32\x47\xb6\xae\x49\x9a\x61\xc8\xaa\x25\x18\xba\xa1\xce\x65\x68\x48\x86\x64\x59\xd0\x82\x92\x3c\x87\x8e\x61\x0b\x84\x22\x75\x5d\x10\xa0\x08\x45\x43\x94\x75\x15\xaa\x8a\x2e\xfe\x57\xb4\x35\x90\x19\xa1\x94\x04\xcb\x99\x50\xcb\xd1\x54\xe8\xa2\x84\xa8\x4b\xd8\x4d\x1d\xca\xfe\xd4\x62\xcf\x2b\x12\x54\x61\xaa\x99\xcf\xe1\x22\xba\xfa\xf6\xe5\xab\xed\x40\x88\x64\x48\xb4\x7f\xc7\x98\x1b\x8e\x0c\x2d\x61\x6e\xe8\x8e\xae\x1a\xb6\x2a\xcf\xe7\x82\xae\x38\x8a\x68\xab\x44\x65\x52\x04\xc1\x10\x0d\x28\xab\xaa\xa4\x8a\xb2\xaa\x88\x52\x97\xe9\x57\x0f\x96\x51\x72\x5f\xc5\xfc\x0e\xce\xcf\x25\xc0\x66\xc7\x3e\xf6\x02\x90\xdf\xb5\x73\x6c\x52\xee\x57\x8a\x12\x8b\x72\x18\xdc\x16\x7e\x59\x81\x77\xa0\x93\xdf\xe4\xd7\xc8\xf7\x5c\x1f\xb1\x80\xa5\x05\x66\xe8\x9a\x07\x9e\x7b\x43\x0a\xcc\x28\x42\x21\x4e\xfe\x86\xf0\xee\x24\x36\x4b\x27\x0f\x19\x48\x0b\xc0\x46\xd7\xe6\x92\x7c\x27\x0c\xe2\xc0\x72\x43\xcb\x23\xbf\x22\xf7\x13\xf9\x47\x14\xd3\x41\xa6\x41\xe4\xc6\x46\x63\x36\x74\xaf\xae\x31\x4b\x01\x99\xc5\xd5\xbc\x2b\x16\xc4\x7e\x0d\x23\x67\xb2\x44\x14\x6e\x16\xd3\xd7\x19\x6c\x68\xda\x6e\xc0\x02\xd6\xa7\x6f\x62\x0a\x8f\x68\x48\xf5\xe3\xe4\x23\x0b\x52\xab\x72\xd3\x03\x3a\x8a\xbb\xe4\xda\x6c\x5c\xe9\xe6\x3b\x46\x6a\x7a\xc9\xb7\x65\x28\x19\xb0\xfe\xd5\xc8\xa9\xac\x04\x14\xd9\xfc\x47\xb4\x38\x50\x0b\x3f\xbd\xab\x03\x99\xbd\x00\x7e\x0d\x8b\x38\x58\x1e\xec\x88\x49\xf2\x39\x71\xc1\x60\xf3\xf9\xa5\x6f\x89\x1a\x40\x4e\x3e\xe5\xe4\x10\xbb\xd9\xb1\xd4\x09\x99\x8c\xed\x62\x8a\xd7\xf8\x77\x4c\x77\x09\x56\xe8\x0c\x9f\x05\x84\x38\x52\x97\x88\x78\xde\x14\x24\x6a\x78\xd9\x44\x66\x05\xac\xc8\x09\x96\xe6\x98\x00\x39\xc7\xfe\x41\xf2\x8e\x26\xf9\x95\x9c\xbc\x59\x40\x9d\x64\xa2\xe4\xc1\x1e\x6b\x79\xae\x45\x60\x42\xbb\xd1\x1d\x5d\x7f\x33\xbc\x42\xe4\xcb\x65\x3a\xc1\xeb\x10\x39\xe4\x1f\x8c\x97\x51\xf7\xa7\x9f\xec\xc0\x8a\x78\xf3\x36\xe2\x4d\xea\x97\xcb\x5b\xc1\xe2\xa7\xc8\x7e\x7f\xe0\x04\xe1\xc1\x55\xf0\xd3\x0d\xfc\xc9\x46\x37\xc8\x0b\x96\x28\x3c\xb8\x5a\xb9\x36\xfa\x29\x75\x48\x72\xfd\xab\x83\xc8\x7e\x4f\x6d\xb7\xff\x93\xa8\x71\xa4\xac\x70\xab\x94\x2e\x51\xe6\xd7\x90\x62\x9b\xbd\x00\x38\x99\x44\xe2\x0e\x1a\xaf\x5f\x03\x89\x15\x1f\x9f\xb1\xd4\xf0\x73\x1d\x78\x36\xdd\xa2\xa5\x53\x2b\x7b\x01\xdc\xdd\xba\xac\xbd\x21\x6b\xed\x96\xbd\x00\x61\x23\x75\x7a\xc8\xd9\x8d\x38\x47\xb1\xcf\x64\x1b\x20\xc5\x17\x6a\x15\x28\x4a\x47\x90\x06\x56\xd3\xba\x49\x9a\xab\x36\x41\x4c\x6a\xee\x40\x0e\x96\xe7\xfe\xe4\x99\x18\x45\xf8\xa7\x55\x84\xc2\x84\x0a\x3c\xf7\x20\x73\x4d\x3b\xf8\xb0\x4a\x1f\x44\xc7\xe4\xd0\xf6\xf5\x20\x55\xc8\x08\x54\x15\xd2\x7c\x30\xb9\x3e\x2e\x7c\xa9\x83\x5b\x85\x91\x91\x2d\x1b\xb4\x32\x9c\xd2\xe3\xc6\x86\x95\x2e\x7e\x2f\xf2\x94\x0b\xe0\x5d\xac\x01\x46\x8b\x25\x99\x40\xe9\xc5\x78\xcd\x3f\xc8\xa1\x6f\x8e\x33\xe7\x5b\x08\xe8\x9d\x60\x84\xd1\x92\x6c\xd6\xc5\x41\x49\x3a\x82\xa2\x53\x15\xbd\x3b\xf4\x50\x88\x2b\x75\xc4\xc2\x8b\x8b\xb2\x77\x9e\x9c\x14\x64\x4e\xe8\x89\xbb\x31\x95\x23\x05\xcf\x3c\xa0\x14\x3c\x17\x73\xd7\x3c\xea\xba\x98\x7e\xd1\x9b\xbd\xf2\x8c\x66\xa7\x3c\x01\x1c\x6f\x70\xca\xd3\xda\x9c\xac\x21\x2c\x02\x78\x1b\x9a\xcb\xd4\x75\x8e\xe2\x4a\xcc\xbc\x97\xf5\xa2\x03\x62\x19\x62\x28\x97\xbd\x34\x9b\x9f\x8c\xb5\xfa\x79\x43\x65\x23\x08\x6a\x06\x82\x51\x74\x58\xac\x80\xa0\x03\x36\x7f\x54\x56\x7c\x67\xb2\xd1\x0d\xb0\xfa\x6f\xe2\xde\x78\x0a\x64\x81\x88\x10\xc2\x94\xf3\x25\x83\x42\xe6\x94\x28\x80\x0f\x40\x94\x81\xd8\x5c\x85\xfa\x38\xc2\x2a\x69\x6c\x70\xed\x6f\x75\xdc\xcc\x1d\xfb\x0b\x5e\xfd\x50\x7c\xb8\x57\xff\x5f\x80\x04\xda\xfc\x09\x77\x70\xdc\x34\x72\xc7\x4d\x28\x17\xdd\xfa\xeb\x8e\x9b\x12\x04\x1f\xb7\x39\x6e\xa6\xee\xfc\x0d\x8e\x9b\xb4\x0b\x09\x3c\x03\x22\x68\x74\xf1\x03\xb0\x91\xa4\x4b\xef\x07\xe4\xea\x12\x48\x4a\xba\x04\xf9\x7b\x00\x15\xb0\xf3\x15\xc6\x14\x40\x4a\x60\x63\xfb\xd7\x4e\xa2\x31\x80\x7a\x6c\x09\xcc\x37\x18\x18\xd7\xa9\xc3\xa1\xa4\x01\xfa\xc6\x73\x33\xa1\x51\x77\x48\xca\xa1\xa8\xef\x63\xae\xc5\x03\x9c\x5b\x72\x4a\x9e\x90\xb4\x5e\x5d\xbb\x07\xb8\x6e\xba\xaa\xb7\xf3\x2b\x4d\x62\xfe\xfd\x8c\xb0\xd5\x86\x76\x74\x01\xaf\xdd\x7f\x76\x58\x86\x54\xae\xbd\x24\x48\x34\x57\xc0\xc6\x3b\x8b\x0e\x25\x16\x5c\x5e\x47\x0e\x0b\x9e\x60\xbe\xc1\xd0\xd4\x00\x19\xad\xbd\xb1\xb2\x9e\x3a\xa9\xd6\x41\x89\x35\x52\xae\xf6\x26\xa1\xc1\x01\x17\x67\x5e\x0a\xa0\xe0\xfb\x4a\xeb\x14\x74\x50\x80\x63\x63\x99\x89\x83\x70\xe8\xaf\x16\xfc\xf1\xf0\xb7\x37\xa3\xe3\xe1\x51\xbd\xe7\x5c\xb9\x24\xd0\xd7\x8c\x75\x9f\x3f\xe3\x9a\xeb\x4a\x69\xfa\xf1\x8c\xaa\x55\x7e\x66\x07\x93\xf1\x78\x38\x38\x19\x1e\xb1\xdd\xf4\x6f\x36\x9d\xa1\xa4\x71\xdc\x1a\xc4\x4f\x20\xdd\x1b\x14\x75\xcf\xcf\xf8\xcb\x77\xe0\x8c\xff\xf5\x15\x38\xe3\xa3\x2b\x70\xcd\xcf\xc0\x9c\x0f\xc0\x94\x3f\xea\x7f\x00\x53\xfe\xf5\xd5\x4b\x30\xe5\x7f\x5d\xfc\x13\x4c\xf9\x0f\x37\xaf\xc0\x82\x27\x7f\xf9\x1f\xde\x81\x29\x3f\x44\xbf\x81\x33\xfe\x12\x9c\xf1\xcf\x48\xa1\x19\x8d\x49\x47\xbf\x82\x33\x7e\x05\x42\x7e\xa2\x80\x29\x6f\x9f\xdc\x80\x33\x7e\xf8\x2b\x98\xf2\x01\x7e\x0b\xce\xf8\x77\xa4\xce\xcb\x10\x84\x64\xb0\x29\x3f\x78\xad\x92\x8e\xdf\x1b\x60\xca\x7f\x3a\x7a\x06\xa6\xfc\xd5\xe2\x1f\x60\xca\xbf\xfc\x30\x01\x53\xfe\xb9\x42\xfa\xf8\x78\x3c\x05\x53\xfe\xf4\x43\xff\x02\x44\xf8\xce\x23\x40\xb3\x7c\xfc\x7a\x87\xf2\xb5\xf3\x4b\xff\x2a\x61\x40\x07\x7f\x1d\x4c\x5e\x4f\xff\x7a\x71\x6f\x05\x5e\x10\x76\xff\x47\x13\x34\x43\x73\xd6\x31\xbf\x39\x27\xfa\x42\xaf\x76\x8e\xbb\x68\x6a\x7f\xeb\xda\xf8\xba\x0b\x0d\x69\xf9\x71\xcd\x5e\xac\x39\x10\xbf\xe3\xbf\x31\x43\xe6\xb6\xe7\x76\x14\xc3\x30\xa4\xc2\xdb\xe9\xf7\x6d\x1e\xcd\x31\xa7\x50\x0a\x6e\xd8\x71\x49\xfe\xa8\x2a\x2d\xd1\xaa\xfa\x40\xcc\x5f\x92\xe7\x0c\x39\x27\x86\x46\x95\x47\x29\x89\xe7\x76\xc2\x36\x08\x0f\x51\x93\x27\xda\xdb\x59\x48\x9b\x63\xb7\x9a\x3b\x76\xa7\x56\x4f\xaa\x4e\x47\xbc\x1f\x8c\x16\xe6\x15\xea\x13\x9d\xe6\x75\x6c\x14\x4f\xa9\x4b\x2d\x3a\x5a\xbf\xfd\xf3\xe1\x44\xfc\x71\x38\xf1\x4f\x12\x3d\x72\x2b\x5e\x7e\x2b\xe2\xa5\x38\xd4\x70\xf9\x8c\x0e\x55\x44\x93\x28\x3d\x22\x9a\xe2\x67\x8d\xdb\xd1\xa4\x6c\x93\x8a\x5a\x2e\xef\xe2\xe7\x81\x9b\xe5\xdd\x88\x1f\xbc\x78\xdd\xa1\xd8\xa0\xe8\x6c\xf0\x95\xf0\x57\x9e\xb7\x4e\x81\x2e\x3d\x19\x11\xeb\x32\x7a\xed\x3a\x9d\xdd\x96\xa9\x51\xb2\xd5\x56\xe4\x5d\xcb\x03\x8a\x1d\x5e\x91\x89\x3a\xf7\x58\xef\x27\x2a\x24\x15\x44\x74\x9b\x25\x57\x63\x83\x78\x40\xae\xe9\x39\xc5\x2f\x5b\x9f\x87\xa5\xda\x53\xfc\xd4\x90\x3e\x13\xe3\xb6\x3c\x64\x29\xbf\xaf\xa8\x8a\xdc\xd3\xa6\xa7\x16\xa9\xc0\x47\x3c\x61\xb4\x54\xb8\x17\xa0\x7c\x51\x38\x57\xc5\x18\x13\x8a\xcb\x2c\x09\x85\xd7\x76\xaf\x9b\xea\xc6\x84\x2a\x41\x6e\xed\x21\xcc\xfc\xda\xf2\x06\xe2\x96\x5f\xdd\x6f\xf3\xa1\x6f\x72\x18\x6e\x71\x6e\xca\x1c\x29\xad\x55\x18\x22\x1f\xc7\xce\x8d\x3d\xc4\x27\x3e\x49\x6b\x6e\x1d\xad\x96\x4b\xef\x6e\x5a\x5a\xbd\x8c\xf6\xef\xe3\x10\x4e\x93\x78\x31\x87\x37\xc8\xc7\xd3\xa2\xbf\x54\xeb\xe7\x82\x5b\x32\xa0\x5e\xc6\x2d\xbe\x51\xf4\x5b\xec\x31\x4c\xb4\xb1\x67\xa6\xeb\xad\xc2\xdc\x91\x6a\x30\x19\x3f\x1b\x3d\xbf\xa4\x3e\x8c\xa3\xd7\xd3\xc9\xf1\xc9\xe5\xf0\xf8\x78\x72\x5c\x6d\x37\x5b\xd1\x7b\x97\x0d\xed\x86\x47\xa0\x91\x24\xbb\x6c\x7a\x63\xcf\xcc\xcd\x08\x31\x93\x19\xe3\x92\x5a\x0c\xbe\x36\x31\x7d\x54\x78\x6d\xde\xa0\xec\x25\xa2\x9b\x38\x37\x33\xae\x8f\x83\x06\x43\xf5\xc8\x61\xfc\x80\xb1\x82\xc5\xd2\xc4\xee\xdc\x2b\xf4\xe7\x46\xcc\x32\x44\x11\xf2\x31\x48\x7a\x61\x02\x1f\xc5\xfd\xd0\x2e\x7c\x9b\xa1\x2c\x88\xbe\xa8\x3b\x46\x4e\x88\xa2\x6b\x26\xe1\x53\xeb\x75\x2b\xa6\xf3\xb5\x2a\xba\x97\x95\xd6\x7b\xbd\xd9\xcf\x28\xf6\xe9\xc1\xa9\x1f\x4f\x56\xee\xa6\x3d\x77\xf0\xe7\xcf\x1d\xdc\x1b\xf1\xbe\xf2\xa9\x83\x38\x8e\xeb\xb8\x9f\x3f\x23\x6e\xbd\xee\x70\xfb\xba\x20\x05\xd1\x01\x45\xc7\x36\x17\x24\x51\xdc\xd5\x05\xa9\xd1\xfd\x28\x88\xd2\x55\x74\xb1\x87\xbe\x7d\xf9\x6a\xc9\xa2\x6d\x23\x5d\x42\x2a\x34\x54\x45\x76\x0c\x49\x12\x0d\x5b\x34\x64\xdb\xd6\x65\xc7\x56\x54\xc5\x14\x90\xa9\x2a\xdf\xbe\x7c\xd5\xa1\x21\x49\x92\xaa\xe9\xba\x22\xcb\x92\xac\x49\xa2\xd6\x25\xcb\x48\x31\x4f\x9f\x77\x32\x2f\x57\x73\x1a\x95\x09\x45\xfb\xbb\x26\x65\xa0\xbd\xd7\x23\xe6\x06\x85\xf4\xa2\xae\x78\x3e\xf9\xf6\xe5\xab\x3d\xd7\x04\x05\x5a\x73\x41\xd0\x6d\x47\x93\x6c\x5b\xb5\x05\x01\xda\xb2\x60\xa8\x36\x14\x45\x5d\x9c\xeb\xf6\x5c\x46\xe2\xb7\x2f\x5f\x55\x59\x95\x24\x43\x50\x74\x45\x54\x45\x55\x82\xaa\x22\xec\xe6\x2f\xe5\xee\x0b\x94\xa9\x5b\xba\x8c\x14\xc7\x94\x15\x28\x41\x49\x50\x04\x03\x19\x86\x08\x2d\x53\xd2\x6c\x41\x72\xa0\xa2\x38\xb6\x64\x12\x6c\xcb\x9a\x2c\xc9\x50\x95\x0d\x43\xd2\xa1\x21\x8b\xba\xb1\x93\x89\xb0\xe2\x4c\x91\x3a\xc9\x32\x41\xc4\x78\x6e\x84\x19\x27\xe6\x0e\x55\xc0\x14\x5b\x37\x90\x63\x2b\x96\x68\xeb\x92\x0e\x4d\xc3\xb4\x65\xcd\x10\x54\x1d\x39\xa2\x4e\x56\xd7\x30\xe7\xba\x64\xca\xd4\x76\x29\xea\x3a\x84\x92\xa8\xc9\x86\xa1\x6a\xb2\x60\xc0\xdd\x00\x0b\x1a\xb1\x95\x39\x95\x99\xc2\xdc\x81\x73\xdb\x56\x15\xc9\x94\x55\xc1\x91\x55\xc7\x91\xe0\x5c\xb3\xe6\x48\x57\x24\xc9\xb1\x6d\x4b\xb0\x34\x93\x54\x35\x34\x49\x33\x04\x43\x90\x24\x55\x57\x45\x41\x94\x76\x5a\xaf\x82\xe5\x5d\xd8\xdd\x48\xdf\x66\xda\xac\x19\xe9\xdb\x6c\x84\x55\x23\xbd\xf8\x83\xad\xa7\xbb\xd9\x47\x1f\xc1\xce\xde\xdc\x6e\x9b\x9d\x5d\xd8\x6a\x16\xad\xdb\x24\x59\x2a\xe2\x59\xc0\xd2\x5b\x54\x26\xbe\x4b\xbd\x35\x43\x9f\x06\xa2\x64\xc3\x80\x9a\x8c\x68\x71\x62\x26\x8a\x0d\x61\x8d\xed\x6c\xd3\x8f\x2d\x8c\xed\xcd\x62\x0b\x12\xba\xa1\xb6\x12\x31\xb6\xf8\x10\x1d\x2a\x61\xbc\xc9\x55\xf4\x8f\x37\x67\x7e\xb7\x21\x2e\x11\xd7\x8d\x77\xe2\xd9\x37\x09\xb0\x16\x7d\xc0\xb6\x87\x55\xae\xd9\x16\x97\xa2\x34\x3d\x19\x94\x3b\x0b\x13\x79\x9c\x6e\xfd\xd8\x08\x41\x94\x1c\xf4\x91\x05\xac\x40\x4d\x74\x49\xa5\x83\xd8\x34\x47\x84\x7d\x6c\x86\x4b\x6d\x6f\xe7\x19\x1a\x93\x9a\xd5\x51\xb2\xde\x93\x47\xf7\x4d\x2b\x9b\x54\x4d\x7c\xa5\x69\x20\xa3\x55\x68\x51\x80\x52\x8a\x89\x96\xae\xef\xa3\x90\x49\xfe\x3d\x88\x16\xe5\x8e\xca\xc4\x03\xb3\xbf\xd8\x32\x71\xc6\x46\x8c\xb8\xcc\xc5\x68\x11\xd5\x4a\xc8\x58\xd8\xc4\xae\x55\xfe\x62\x05\x7e\x76\x87\x5d\x9c\x35\xfa\x68\x79\x66\xec\x2c\x73\x80\x43\xd7\xf4\xaf\x3c\x94\x8f\x1f\x6b\xd2\xc5\x8e\x30\xfa\x88\xa9\xb5\xcf\xdd\x0e\x74\xb2\x33\xda\x86\x4b\x49\xb6\x3a\x58\x98\xdb\xb9\x9b\x17\x7e\xe0\x05\x51\x6a\x80\xa5\x7f\x95\xd6\x93\x56\xbd\x76\x6d\x9b\x1a\xe1\x70\x48\x0d\xe0\xe9\xf8\x71\x83\xfd\xac\x6f\xf4\xc6\xfd\x34\xb1\xef\xec\x4f\x2f\xbb\x90\x09\xcc\x08\x24\x27\x15\x42\x22\x17\x0f\xb1\x26\x51\x6b\x01\x78\x0f\x34\x90\x1d\xf0\xb3\xab\x76\xf0\xb6\xa9\x58\x02\xbf\x01\x23\x2b\xce\xee\xf1\x65\xc0\x5e\xcb\xc9\x3d\x35\x39\xc7\x2b\xb1\xfd\xa8\xff\x2a\xa0\x81\x2d\xa2\x3b\xdf\xaa\x45\x86\xd0\x5a\x4c\x07\xb9\x65\x49\xaf\xda\x0e\x0c\x90\x87\x7c\x10\x5a\x42\x3e\xc0\xe2\xc1\x4e\xcb\x66\x29\x82\x77\x1b\x2c\x07\xfa\x36\xc3\x01\x94\x72\xc3\x41\xe1\x92\x3d\x66\x5e\x8d\xb7\xec\x81\x1f\xfb\x3a\x66\x6f\xbe\x92\x5b\x76\x0a\xa4\x5c\x30\x2a\xe4\x2b\xa1\x80\x5f\x80\xd4\x60\x93\x81\x55\xb3\x03\x54\x5b\xcd\x0e\xc5\x70\x18\xf5\x98\x02\xa9\xa5\x29\x86\x89\x46\x37\xf1\x4b\x87\x9c\xd4\x01\xa8\xdd\xd6\x65\x14\xcc\x0d\xe2\x2e\xe6\x86\x54\x11\x4c\x4e\x3f\xa9\xb5\x21\x31\x43\xbd\x00\x10\x94\xce\xe2\x65\x23\x0e\xad\x05\xc1\xeb\xb8\x56\x7c\x0a\x87\xf2\xf7\x1a\x22\xe2\x6b\x7b\xa1\xd7\xeb\xf8\x2b\xcf\xeb\xf5\x70\x7a\xe1\x11\xfd\x4c\x0a\xba\xf9\x6f\xde\x43\xfe\x15\xbe\xe6\x9e\x3e\xc5\x3b\x5e\x45\x36\x1b\x08\x92\x78\x32\xe3\xca\x55\x5d\x63\xb7\xad\xb7\x79\xcd\x5d\xb7\x1a\x50\xa4\xf4\x7a\x67\xc4\x7b\xd6\x59\x47\x05\x06\xc0\x3c\x7e\x1f\x9e\xc6\x27\x04\x2e\xbd\xcf\xc9\xec\x0e\x6a\xbb\xa9\x22\xc1\x47\xda\xc4\xd8\x68\xaa\x48\x91\x57\xb2\xc8\x94\xad\x2b\x09\x67\x9b\x44\xe9\x5c\xdb\xe7\x57\xaf\xba\xd9\x88\x50\xb8\xfc\xdf\x64\x41\x28\x19\x06\x12\xbb\x41\x8b\x85\xe0\xf4\x43\x1f\x4c\xf9\x91\xf1\x29\xb6\x13\x5c\x80\xa5\xbb\x24\x03\x87\xfc\xe4\xa6\x68\x16\x48\xb5\xb4\xa6\x3b\xfd\x84\x00\xba\x2e\xf5\x4b\x3b\x98\x7b\x81\xf5\x7e\xcd\x17\x74\x8e\x46\x43\xc2\x2a\x8c\x82\xb0\x4b\x5f\xde\xa1\xf0\xb0\xa9\x8f\xc3\x6b\x44\x84\x51\x17\x0a\xc2\x5f\x0f\x6f\x88\x26\x68\x99\xde\x81\xe9\xb9\x57\x7e\x17\x07\xcb\xc3\xc4\x16\x21\x08\x9a\x68\x4a\x87\xcb\x44\x8e\x75\x43\xe4\x99\x04\x7d\x87\x38\x58\x76\x65\x7d\xf9\xb1\x04\x0b\x4f\xb5\x9f\x26\x88\xe6\xa6\xf5\xfe\x2a\x0c\x56\xbe\xdd\xf5\x03\x1f\x1d\xce\x83\xd0\x46\x61\xfc\xf7\xd2\xb4\xc9\x42\x75\x85\x43\x27\xf0\x71\xd7\xf5\xaf\x51\xe8\xe2\xc3\xf2\x24\xd6\x7c\x2c\x70\x9b\x3a\xbf\x71\x23\x77\xee\x7a\x2e\xbe\xeb\xc6\x95\xaa\xd6\x8f\x97\x3d\xb7\x23\x69\xba\xae\x71\xe0\x1f\x3d\xb7\xa3\xc9\x86\x20\x73\xe0\x9f\x3d\xb7\x63\xc8\x86\xa0\x70\x00\x21\x52\x6c\x28\x84\x33\x61\xfa\x37\x84\x8a\xc4\x01\x97\xfe\x2d\x40\x55\x4b\xc3\x21\x87\xa8\x35\x1e\x72\x35\x68\x7b\x53\xf4\xdc\x62\xe8\x0d\xe6\x6c\x32\x1e\x32\x90\x4d\xeb\x45\xbf\x98\xd6\x7b\xe4\xdb\x47\x26\x36\x4b\x51\x79\xab\xd1\xde\x77\xeb\x58\xdc\xbb\x63\x69\xb7\x8e\xa5\xfd\x3a\x6e\x8a\x2f\x0f\xdc\xe8\x97\x20\xf0\x90\xe9\xd7\x22\x45\x17\xe3\x39\x9f\xd0\x68\xd7\x4c\xd2\x03\x43\x7a\x60\x9b\x07\x69\x0e\x46\xbf\xdb\x30\x6f\x4e\x26\xaf\xc9\x30\xb4\x0f\x32\xce\xe4\x59\x12\x2e\x6b\xf2\xe6\x28\xeb\x8b\x99\x9d\xf4\x07\x2f\x5b\x86\x2f\xc6\xb3\x6f\x42\xe2\x70\x20\xd2\x78\xd1\xd3\xfe\xe8\xb8\xa5\x8b\x86\x50\xf7\x69\xeb\xd3\xe9\x80\x89\x3f\x31\xf1\xa7\x7d\x89\xa6\x21\x22\x7e\x7b\xdf\x7b\xd2\x4d\x43\xe0\xfc\xf6\xbe\xf7\x24\x9d\xa6\xf8\xfa\xa5\xce\xe3\x6f\xdf\x83\x95\x4a\x18\xfe\x0d\xbd\x3f\x04\x2f\x95\x68\xfd\x1b\x7a\xdf\x13\x33\xc5\xa0\xfe\x19\x21\x9f\x89\x4c\x5c\xce\x90\xaa\xcc\x68\x3c\x3b\xe9\x8f\x07\xc3\x38\x94\xfa\x43\xbb\x97\xf2\xee\xa5\x07\x74\x7f\xb1\x06\x01\xea\x9d\x63\xc4\x3b\xfc\xe0\xd5\x9b\xd9\xc9\xf0\x38\xde\x25\xb4\x24\xed\x83\xc6\x4a\xb9\x3c\x1a\x9e\x36\x15\x4f\x8f\x27\x47\x60\x07\x9e\xb2\x13\x47\xd8\xb0\x6f\x1b\x38\xf8\xf6\x2d\xba\x03\xc1\xd2\x29\xc5\x98\x8b\x63\x2b\x95\xa6\x57\x1f\x56\xdc\x3a\x6c\x63\x8d\x2a\x25\x6f\x20\x98\x06\xce\xbf\x7d\x53\xef\x40\xde\x1b\x88\x88\x22\x21\x5e\xa9\xcb\xfe\x9b\xa3\xd1\xc9\xe5\xab\xc9\xf3\xe7\xa3\xf1\xf3\xf8\xcb\xeb\xfe\xe0\xc5\x68\x3c\xbc\x7c\x31\xec\xbf\x3a\x79\x71\x39\x78\x31\x1c\xbc\x9c\xa5\x2b\x7b\x41\x85\xb8\x4f\x64\xb1\x28\x8a\x44\x8d\xf7\xc8\xdf\x8a\x22\x18\x12\x07\x4c\x2a\xa3\x45\x41\x14\x39\x60\x91\xbf\x55\x49\xd5\x60\xc1\xcf\x21\x42\xfb\x18\xaf\x15\xb5\x6a\xbc\x56\xb4\xaa\xf1\x5a\xd1\xab\xc6\x6b\xc5\x68\x34\x5e\xab\x42\xab\xf1\x5a\x85\xe9\xc1\x4a\xdd\xc3\x72\xad\xee\x70\x74\xfa\x2e\xcb\xb5\x2a\x3d\xc8\x72\x9d\x9b\x51\x6b\x83\x55\x6d\xaa\x27\xa8\x29\xfa\x29\xdc\xc1\x6e\xad\xca\xdb\xed\xd6\xf9\x38\x97\xa8\xc9\x20\x9b\x1e\x9f\x55\x25\x39\x03\x96\xe3\xf0\x15\x2c\xc8\x85\xae\x96\x68\x8f\xf8\x7b\xf4\xac\x9c\x05\x34\x25\x67\xe5\xa4\x0e\xb3\xf4\x4c\x1f\x31\x7e\x60\xa3\x3c\x6a\x35\xbe\x5b\x96\x0e\xd0\x05\xb7\xcd\x02\x00\x76\x23\xce\x76\x09\x5a\xbf\x1f\xce\xfa\x8f\x87\xb3\xf1\xbf\x1a\x67\x2b\xd4\xe2\x21\x21\x49\x8f\x83\xb6\xfd\x42\x4c\x8e\xcd\x05\xcd\x9e\x13\xae\xac\xa2\x4f\x47\xc9\x29\x62\x58\x07\x79\x87\x50\x8f\xaa\xba\x9b\x27\x10\xac\xc1\x54\x0e\x7b\x79\xe2\x62\x0f\x0d\xcc\x28\x0f\xed\x59\x84\x6d\xf6\x30\xd8\xb4\x3f\x02\xb6\xab\x7d\x68\x2d\x01\x4c\x6f\xa2\x99\x41\xe3\x3e\xdb\x25\x32\xf3\x7e\xfb\x6c\xf2\x00\x80\x8d\x26\x80\x47\xad\x44\xfe\x48\xbc\xe1\xd1\xe3\xa8\x3a\x8d\x28\x96\x85\xc7\x46\xf1\x59\xf3\x38\x8f\xb4\xf7\xf3\x71\xae\x9b\xc7\x51\x1e\x7b\x9c\x79\x7d\xa5\xdb\x3c\xa6\x54\xe5\x51\x3c\xa6\xd2\xd0\xb4\xd4\x33\x6a\x0f\xa7\xa9\xe9\xfe\xc4\xad\x09\x4d\xc4\xbd\x78\x40\x47\xb0\xa9\xa3\xe3\xb6\x5d\x22\x1b\x7f\xe8\x2e\xb9\x42\xf8\x74\x99\x24\x93\x4b\xec\xad\x9d\x24\x2f\x17\xcb\x35\xee\x96\x57\xff\xba\x55\x77\xed\x96\x35\xb7\x5c\x3b\xac\xae\xf9\x4d\x1b\x86\x15\xb8\x1d\xc3\xda\x0e\x89\x75\xbe\x0b\xc3\x71\x8a\xb4\x16\x14\x3f\xff\x37\x41\xf1\x69\x23\xa3\xd1\x76\x48\xc3\xb4\x1f\xa3\xb9\x7b\x3c\x1d\xf0\xe8\xfb\x74\xc0\x38\xed\xe0\x36\xe5\xcf\x09\x42\x1a\xc2\x8b\xe9\x9f\x35\x2b\x82\x1f\x5a\x35\x97\xf8\x91\x4c\x15\x7f\xb6\x89\x4d\xcf\x8d\x1a\x9f\x25\x65\x59\x36\xb4\x3c\xcb\x06\xd0\xb2\x47\x6f\x72\xb3\x71\x51\x29\x19\xaa\x32\xe3\xa2\x0a\x4e\xd1\xa6\x78\xf2\x1b\xad\x8b\x49\xa2\xa1\xe4\x85\x98\x56\x34\x7e\xa6\x13\x60\x81\x96\x3d\x81\x32\xc0\x1d\x02\x10\x14\xfd\x6a\xa5\x6a\x77\x70\x7b\x9a\x12\x6a\x6f\x84\xe0\x08\xb5\x3e\x4f\x12\xe5\xdd\x34\xbe\x82\xc3\x73\xd5\x68\xd4\x9c\x6e\x32\xdd\xbc\x52\x69\xcf\xac\x46\xef\x8b\x8f\x52\x10\x6f\x7e\x22\x0d\x49\x03\xfa\xec\x33\x49\x9a\x9a\xd8\xe3\x62\x33\x5d\x5e\x9f\xab\xbd\x8a\x29\x84\xae\x6f\xee\xa9\xa9\xc9\x88\xd6\x8f\xae\x83\xdb\x67\x41\xb8\xa0\x6f\x6a\x3a\x2d\x49\x33\x59\xae\x14\x05\xbf\x79\x4f\x6b\x8f\xbd\xa7\x3f\xfe\xdb\x28\x0f\xcf\xf6\x97\xf9\xba\xd8\xb4\xeb\xdf\x3c\xa0\x23\xa9\xa9\xa3\x4f\x6d\xa2\x4d\x7f\x24\xd6\xdb\xb4\x4b\xa4\x47\xd1\x1e\x6e\xff\x4d\x44\xdb\xfb\x56\x14\xef\x70\xf2\x7a\xa8\xf6\xb0\x3b\x8a\x37\xaa\x0f\x6f\xff\x4d\x70\xfc\xdb\x76\x38\x2b\xe2\x50\xdc\xf2\x46\x57\xaa\xba\xd9\xc8\x40\xaf\x3e\xff\xae\x4a\x42\xb5\x59\x12\x6a\xe0\x13\xda\xf4\x40\x77\xab\x9f\x8d\x9e\xbb\xd9\xe8\x59\x0a\x32\x23\x47\xbd\x9c\x7b\xf4\x08\xe0\x16\x35\xb9\xcb\xc8\x7a\x4d\x1e\xb6\xa7\x30\x4b\x53\xd4\x6c\x50\x65\xea\x17\xa9\x55\x97\x18\xb9\xae\x81\x28\xdb\x12\xda\xa8\xb5\x84\x36\x1a\xd0\xf3\x2b\xeb\x96\xa7\xf3\xd0\x68\xc6\xbb\x28\x80\xf7\x9b\x10\xaf\x88\xdb\x10\x2f\xc2\x02\xe6\xf3\x94\x36\x62\x13\xea\x45\x09\xbc\xdd\x11\xf5\xa2\xbc\x11\xf5\xa2\xb2\x09\xf5\xe2\xc6\x1b\xf5\xf4\x9d\x78\x01\xf5\xed\x49\x71\xc4\x94\x49\x68\xed\xea\x4a\x35\xb5\x78\xca\x26\x64\xae\xdd\xd9\x25\xf6\x1f\x42\xbc\xe3\x7a\x18\x85\xc8\xee\x7f\x8a\x3e\x7f\x6e\x28\xcc\x15\x0f\x31\xd6\x5d\xda\xbe\xc6\x31\x89\x13\x10\xa2\xd2\xc8\x39\x5f\x28\xb2\x37\xaa\xa5\xbc\x8e\xae\x72\x11\x52\x7c\xd9\xbc\x65\xba\xa5\x3c\xe5\xe9\x7c\x63\xb2\xfa\xe3\x26\x5c\x04\x62\xcf\x19\xa7\x1c\xbd\xca\x24\xdf\x35\xeb\x63\x8f\x74\x4b\x50\x78\xfd\xf6\x78\x67\xac\x17\x7f\x8a\x33\xd6\xeb\xcd\x67\x2c\x28\x3f\xaa\x98\xd1\xb4\x87\x8a\x99\xbf\x3c\xfc\xc0\x55\x11\x33\x9a\xbe\x4d\xcc\x7c\xfc\x7e\x31\x93\xb8\xa0\x3e\x6b\x3f\x6e\x49\x59\xdc\x09\x28\x81\x37\xdb\xea\x35\x86\xfd\x90\xc1\x6f\x08\x88\x3a\x50\xab\xa0\x16\x32\x8a\x2a\x75\x51\xa5\x6e\x3d\x2d\xe7\xd1\x4a\x0a\xc7\x65\xa8\x03\x2d\x8f\x67\x62\xb4\xc4\xf1\x10\x5a\xe4\x15\x04\xef\xbe\xef\xc8\x2c\x16\x02\xbb\xe4\x31\x4b\xa4\xe2\xa1\x59\xcf\x9d\x99\x65\xf0\xcb\xd6\x53\x73\x55\x16\xb5\x9c\x9a\x45\x15\xbc\xd8\xe9\xd4\xbc\xd3\xe9\x79\x03\x7f\xce\x59\xe4\x2e\x82\x08\xf1\x3e\xad\xbc\x25\x40\x04\xda\x12\x20\x02\xee\xd4\xaa\x96\x78\xea\xf2\xcd\x78\xf4\xdb\x9b\x61\xbd\x97\xf4\x4c\xed\x46\x83\xd8\xb2\x30\xf5\x4c\x7f\x1a\x06\xf6\x0e\x02\xaa\xf9\xe0\x9d\x8b\x29\x9d\xdb\xff\x02\x41\x7c\xb4\x0b\x04\xb1\xa9\xc9\x1e\x17\x08\x62\xf9\x06\xe1\xd7\x46\x89\xa5\x3f\xba\x65\xf8\xe5\xbf\xcd\x0d\xc2\x3f\xf6\x3f\xf8\x1b\x8d\x07\xff\x7f\x3e\xa0\x23\xb9\xa9\x23\x84\x5b\x8e\xb7\xc6\x23\x59\x89\x7e\xdc\x0d\x02\xae\x83\xfe\xa7\x3c\xdd\xba\xad\x28\xde\xe1\x2e\xed\x5f\x7c\x83\x10\xfe\x9b\xe0\x38\xd8\x0e\xe7\xf7\xab\x76\x86\xf2\x50\xd5\x0e\xe1\xc7\xba\x41\x30\xd4\x6d\xaa\x1d\xc6\xff\x59\x37\x08\x46\xa6\x50\x3f\xe0\x06\xc1\xdd\x84\xf8\xfd\x6e\x10\x0c\x9d\xdb\x76\x83\x10\xee\x88\xfa\x7f\xe3\x1b\x04\x69\x17\xc5\x6d\xff\x03\xb5\xb4\xf1\x40\x2d\xfd\xeb\x6e\x10\xb2\xf9\x3e\xf2\x0d\xc2\xd6\x09\xff\x80\x1b\x04\x1f\x37\xe9\x63\xc6\xa3\xbb\xb7\x78\xf8\xd1\x6e\x10\x4c\xfc\x67\xb8\x41\xb0\xea\xd2\xe5\x07\xde\x20\xe8\xfa\x43\xc5\xcc\xaf\x8f\x76\x83\xa0\x1b\xdb\xc4\xcc\xcb\x47\xbb\x41\xf8\xc7\x8e\x37\x08\xff\x7c\xe0\x0d\x42\x80\xff\xd0\x1b\x04\x23\x57\x3a\xf6\xbf\x41\xf0\xf1\x63\xdd\x20\x18\xa5\x80\xa6\xf9\x0d\x82\x21\x72\xf9\x0d\x82\x87\x1f\xef\x06\xc1\xc4\x7f\xe8\x0d\xc2\x4e\x82\xe8\xff\x37\x37\x08\xb9\x98\x7a\xc8\x0d\x82\xf4\x68\x37\x08\x52\x53\x93\x3d\x6e\x10\x24\x7a\x83\x10\x53\x45\x84\xf3\x88\x50\x28\x8b\x29\xc5\x5a\x66\x68\x1f\xa4\x49\x17\xd8\x2e\x5a\xaf\xc1\x09\xee\x9d\x6f\x7d\x21\xd3\xf0\x7a\xa5\x7f\x76\x29\x5d\x80\x4b\x9c\xbc\x01\xda\xf5\x1d\xcc\x86\xf7\x2a\xc5\x77\x25\x17\x60\x59\x83\x6b\xc7\x67\x3a\xdb\x5f\xd4\x94\x1f\xc0\x5c\x00\xbb\x79\xa8\xea\x7b\x9f\xbd\xdf\xe6\x34\xbd\xa5\xb9\x00\x7d\xdc\x3b\xe7\x79\x7e\x89\x01\xcf\xf3\x36\x8e\x1f\xc1\x8c\x71\x1c\x42\xae\xd3\x19\xe3\xcf\x9f\x3b\x63\xdc\xbb\x5f\x73\x1c\x9f\xe6\x7a\xef\xb1\x69\x9a\x1b\x16\x8c\x31\xc7\x75\x38\x9a\x7b\x7f\x85\x5b\x02\xcf\xf9\x88\x7f\x51\xce\xbe\x4f\x44\x70\x9c\x7f\x1f\x15\x33\x11\xd3\x97\x1c\x49\x1e\xd3\x2c\x13\x78\x96\x99\x1f\xc7\x05\xfd\xe9\xf4\x72\x78\x34\x3a\x19\x4d\xc6\x3d\x17\xf1\xd3\x24\xb9\xed\xcd\xd2\x22\x64\xd7\x1b\xe3\x0c\xce\xf8\x43\xc2\x37\xb2\x3c\xfc\x05\x6a\xef\xdd\xe7\x1e\x37\xdd\xf3\x0b\x90\x5f\x9f\x95\x7e\x49\xdd\xf3\x8b\x75\x92\x42\xb7\xa8\xbd\xf6\x7c\x74\xcb\xf4\xc3\xd0\xbc\x4b\xf3\xeb\x16\x35\xbd\xea\xd7\x82\x7a\x58\x1a\xf7\xbe\xd4\x27\x19\xb8\xdc\x0f\x1d\xbc\x00\xd9\x7e\xf5\xa5\x9d\xea\x27\xb3\x8b\x43\x17\xf7\xd2\xe7\xe0\x2f\xd1\x5d\x97\xb5\x13\x47\x6b\x2a\x55\x22\x64\x86\xd6\x75\xf7\x89\x00\x92\x87\xdd\xac\xb9\xc2\x01\x0b\x0a\x29\x02\xd2\xa0\x77\x2c\x88\x53\xdc\x0f\x82\xc5\xd2\x0c\x09\x6b\xed\x52\xe2\x58\x83\x45\x10\xa2\x13\xf4\x11\x77\x59\xf2\x17\x0b\xfc\xe0\x18\x45\x2b\x0f\x47\xcf\xe8\xcb\x6d\x76\x1c\x30\x61\x5c\xc0\x38\xa4\xe4\x49\x3a\xee\xb4\x3c\x0a\x29\x4a\x3f\x4d\x7c\x0a\x6c\x1c\xde\xc7\xf2\x90\x19\x4e\xfc\x44\x79\x0c\xfc\xee\x13\x08\xa8\x2c\x3d\x8a\xdf\xe5\x07\x7e\x97\xf5\x70\xc8\x26\xb3\x36\xdd\xf0\xca\x5c\x2e\x91\x7d\x3a\x1d\xf4\x9e\xc0\x24\x1c\xde\x0c\xa3\x65\x9a\x6e\x33\x97\x6e\xd5\x57\xd9\x3c\xcf\xc7\x71\x14\x1b\x1a\xf1\xa5\xba\x64\x7f\x85\xa8\x5c\x46\xa8\x6a\xc7\x5c\xc0\x5b\xd8\x1a\xe2\x0e\xb3\x90\x16\x54\x95\xe9\xb1\xfd\x33\xb8\xe9\x25\x25\xe6\x1b\xde\x52\xf6\x9e\x08\x00\xad\x03\x2a\xc1\x8a\xcc\x3c\x49\xe4\x8f\xb8\xfb\x75\xe0\x1f\xa1\x9b\x96\x6f\x44\x2f\x41\xfe\x49\x40\x63\x08\x46\x59\x8c\xc9\x6a\xf1\xd6\x48\x93\xfd\xd1\xf1\xf3\xfe\x74\x3a\x3c\xa2\x4c\x2b\x0e\x38\x99\xc7\x9b\x2c\xad\x57\x16\x6e\x12\x2c\x71\x96\x10\xba\x56\xed\xe7\x62\x42\xdb\x34\x47\x6e\x12\xf6\x89\xa6\xa9\xcd\x53\xa3\xb3\x2c\x17\x47\xc4\x20\x82\xb3\xc3\xad\xbb\xd9\xb8\xa5\x26\x3c\xf2\x93\x0a\xf5\xc4\xbd\x5b\x43\x67\xe6\x69\x69\xab\xd9\xdb\xab\x92\x8f\x7b\xfa\xb4\xd3\xc0\x78\x52\x5e\x56\xe1\x38\x69\x31\xdd\x00\x71\x61\x9c\x4e\xb6\x50\xdc\xff\x14\x95\x7e\x27\x6d\xc9\x29\x09\xd4\xd2\x23\x6f\x9d\x18\x59\x1f\x2a\x23\x6b\x51\x41\x53\x7e\x9c\x2d\x50\x5a\x52\x62\xd7\x4f\x7a\x45\x86\x9d\xa4\xb4\x2f\xc3\x95\x40\xb5\xb4\x4d\x8c\xb2\x33\x72\xd4\x30\x27\xb2\x19\x4f\xa8\x1c\xbb\xa4\xff\xed\xe3\x7a\x8a\xf0\xf2\x1a\x26\x9d\x92\x75\xef\xfb\x36\x4d\x21\xec\xe2\x3b\x82\x8a\xdd\x66\x5e\x5f\xcf\xcd\x28\x5e\x73\xe0\x23\x2e\xc2\x94\x67\xa2\x27\xba\xe3\xc4\xa7\xa0\xa4\x1b\x8a\x37\x3f\x01\x9c\x11\x0a\x95\x1e\x49\x4f\xbf\xdc\xf5\xcf\x92\xef\x79\x26\xe7\xf8\x1b\x65\x1a\xd1\x5b\x17\x5f\x4f\x7c\xef\x6e\xe2\xa3\x38\xce\x0f\xad\x5d\x42\xe5\xdb\x46\xad\x2d\x4a\xba\x05\xa8\xcd\x3f\x96\xd0\xfb\x3a\x43\xc7\x49\x90\x88\x6b\xb2\xdb\x09\xca\xec\x3c\x13\xf9\x31\x9d\x56\x68\x86\x7c\x84\xd1\x72\x96\x61\x90\x00\x01\x8a\x21\x5b\x63\x6d\x64\x16\x43\x17\xf8\xcf\x10\xb6\xae\x91\x9d\xcc\xb5\x10\xed\x35\x5e\x94\x87\x8c\x40\x39\x26\xa1\xd3\xea\x20\xb9\xe2\xfb\x18\xc3\xd4\xce\x0d\xd5\xe1\xfa\x9f\x4a\x03\xad\x8b\x1f\x08\x07\x2d\x29\x2c\x68\x5d\xc5\x45\x56\xa5\xcc\x0d\xd2\xab\x27\x42\x51\xe4\x28\x12\xdf\xf2\x71\x8d\x2c\xa2\x58\xf7\x49\xb1\xf2\x49\x03\x61\x36\x10\x1d\x68\xc8\x30\x8e\xe8\x86\x69\xa2\xc3\x67\x61\xb0\x98\x99\x37\x49\x1a\x7a\xb2\x03\xea\x98\x27\x93\x72\x9d\x4e\x36\xf5\x58\x33\x43\x7c\x14\x84\x38\xdd\x46\xa5\xe3\xd5\x11\xba\xc9\x05\x32\xec\xf5\x7a\xe5\xa6\xe9\x09\xa8\x5c\x7a\x2e\x5c\x74\x9b\x72\x79\x37\xc6\x07\xa0\x59\xbd\x57\xe8\x30\xd9\x9d\xd1\x2a\x24\x7a\x03\x9d\x52\x4b\x0b\x70\x7e\xc6\xbf\x1f\xa5\x22\xd5\x6e\xd1\x69\x79\x37\xa2\x4c\x26\x7e\xa5\xf9\xca\x8d\x70\x65\xda\xdc\x05\x40\xdc\x1a\x79\x11\xfa\x81\x13\x9c\x1e\x4f\x8e\xf6\x9c\x21\x0d\x8e\xf0\x98\x53\x5c\x47\x19\x23\x26\x4b\x8a\x4e\x02\xa2\x72\x64\x1a\x43\xcb\xd7\x36\x51\x70\xe8\x04\x61\x87\x46\xee\xed\x09\x87\xe8\x7f\x4f\x70\x82\xa2\x43\xf4\xb7\xbf\x71\x99\xdc\x3f\xc1\xe7\xe8\x02\xb8\x31\x36\x03\x7c\x8d\xc2\xfe\x59\xd4\xc1\x49\x92\xfa\x82\x64\xc0\x5c\x96\x51\x9e\xe8\xad\x51\x67\xd7\x99\xbf\xf1\xdd\x0f\x2b\xd4\xff\xd4\x39\xaf\x76\xe9\x9e\x0b\x17\x1c\xa8\x97\xc2\x0b\x8e\xfc\x3f\xdb\x3c\x74\x05\x08\xf7\x9e\xe1\x20\x4c\xb6\x4d\x27\x39\xf8\xc4\xd1\xb4\x4b\x2a\x66\x13\x22\x8f\xd0\x4d\x3b\x1e\xe9\xc7\x56\x89\x5a\x3f\x7a\xef\x10\xc5\x61\xc7\x33\x74\x5b\xcc\x8d\xba\x8c\x26\xba\x57\xb8\x88\x69\x11\x15\x72\xed\x83\x27\x02\xc7\x95\xce\x74\x4f\x9f\x96\x76\x07\xe1\xae\xc5\xbd\x91\xcf\x9e\xe2\x71\x66\x3a\xc8\xbb\x6b\x50\xb2\x4a\x7d\x9e\x0b\x17\xb1\x2f\x40\x77\xe3\x9a\xb4\xf5\xd2\xb8\x48\x19\xb1\x65\x97\x1f\x0c\x61\xb7\x31\x23\xee\xd0\x60\xd3\x5c\xef\xef\xf8\x49\xaf\x87\xb8\xf5\x15\xc2\x4c\xb3\xec\x85\xf1\xd0\x79\xf4\xba\x3a\x2b\xde\x7c\x4c\xd8\xd4\xb9\xb8\xbd\xf3\xf6\x75\xdf\xd4\xb1\xf4\x1d\x1d\x4b\xdc\x3a\xd7\xa8\xee\xcb\x22\x2a\xd7\xaf\x8a\x8b\x4c\x85\x51\x59\xeb\xba\xef\x3f\xa0\x5d\xac\x37\xdf\xb7\x4b\x45\x2a\xb3\xcf\x8b\xf4\x79\xd1\xa2\xa4\x6f\xa8\x5f\x55\xdf\xd7\xdc\xba\x51\xe6\x72\xf7\x2c\x4b\xa8\xe3\xe9\x53\xfa\x2f\x4e\x4f\x05\xa5\xae\xab\xe3\xd7\x44\x38\xbd\x8c\xa0\x5d\xe2\x86\xdb\x0c\xae\x01\xda\x1a\x88\x3b\xf4\x59\x36\x77\x95\x27\x94\xd7\xa6\x93\x4a\x29\xe2\xe7\x6c\x33\xe0\xde\xdf\x31\x6f\xde\x98\xae\x67\xc6\xb1\xd6\xce\x02\x9f\xa6\xa7\xeb\x91\xbd\xd1\x3d\xbf\x58\x6f\xd7\x74\xa9\x3a\x11\xe3\x8b\x2b\x1f\xfa\x36\xa1\xeb\x90\xb2\x92\x84\x7f\x3c\x7d\xfa\xa4\x76\x86\x4c\x0e\x27\xcd\x4c\x25\x25\xea\xa2\x81\x95\x28\x3f\xfd\x4f\xf4\x86\x8b\x30\x15\xd7\x4e\xa3\xbb\xb9\xcd\xd0\x94\x10\x47\xc1\x71\x33\x70\x76\x19\xba\xd8\x3e\x1f\xdb\x4d\xc6\x5e\xaf\xdb\xc0\x2b\x08\x48\x9e\x06\x1d\x9e\x38\x9d\xc2\x7d\xc2\xff\x0a\x3f\x77\x48\x8d\xc0\x43\xbc\x17\x5c\x75\xd8\xb7\xfd\xe3\xf1\x68\xfc\xbc\xcb\xd4\x06\x25\x2b\x42\x16\x2b\xee\x9a\xfc\xd5\xe1\x98\x10\x59\xc8\xbd\x41\x36\xb3\xf2\x43\x64\x05\x57\xbe\xfb\x09\xd9\x8c\xf9\xa9\x10\x75\x99\x09\x1c\x86\xfd\x1b\xe2\xa8\xf5\x95\xeb\x2e\xf1\x39\xbe\x58\xb7\x4e\xe9\x4f\x07\xaf\x4d\xe1\xdd\x72\xac\x02\x18\xb8\xdc\x3d\xfe\xb9\x7c\xa9\x49\x16\xae\xff\x76\x96\x2b\xc3\xf7\xe6\xa7\x2e\x5e\x73\xfc\xd2\x5d\xa2\x4e\x47\x00\x97\xfc\x31\xd7\xa9\x9d\xcb\xb9\xc2\x81\x94\x1c\x11\x53\xfd\xb9\x70\xb7\x79\x8e\x2e\x7a\x49\xfc\xd0\x9f\x6f\x02\xd7\x66\x84\x2e\x4e\x75\xea\x22\xa9\x73\x1b\x48\xcb\xa5\x94\xcb\x1d\x96\x14\xd2\xba\x42\x4e\x94\xb3\x9f\x93\xcd\x5f\xbe\x37\x8a\xa3\xe0\xc5\x52\xbd\x7c\x6b\x44\xbf\x80\xfc\x32\xa6\x28\x5b\xdd\x56\x51\x0a\x50\xa2\xad\xb5\xc2\xcb\xad\xd7\xa0\x78\xd9\x93\x84\x0a\xa2\x47\x79\xf3\x0a\x7d\xfe\x8c\xf2\x3f\x7f\x9d\x4d\xc6\x7c\x44\xb9\xb1\xeb\xdc\x75\xd2\xbe\xeb\x81\x8c\x7e\x7f\x43\x2f\x7b\x18\x1c\x30\x59\xe2\x80\x56\x83\x74\xc4\x33\x7f\xb9\xc7\xeb\xdf\xd7\x89\x06\x51\x5c\x13\x7c\xd1\xab\xb3\xb0\xda\x21\xa9\x7e\xcd\xf5\xf9\xf3\xb2\x2c\x88\x2a\x6c\xcd\xb7\xf3\x3d\x92\x77\x95\x9e\xd6\xca\x6c\x7e\x13\x02\x11\x20\xbc\xd8\xb5\xbb\x2c\x4b\x8e\x74\xf6\xf7\x0c\x5a\x96\x03\xbb\x8f\xba\xde\xd4\x73\xba\xf9\xdd\x46\xc2\x41\xed\x3a\x58\x7e\x3d\x4a\xba\x8f\x4f\xca\x96\x6b\x87\x84\xcb\x12\xa2\x70\x6d\xf2\x17\xb7\xae\x6b\xc5\xf7\x2d\x04\xff\x60\x3b\xd5\x7e\xa1\xda\x76\x55\xaf\xff\x28\x93\xd1\xc3\xa2\xd5\xed\x6d\x06\x6b\xba\x25\x2b\x9e\x52\xab\xfa\x78\xe9\xa0\xd0\xca\x3e\xca\x07\xb9\x0b\x2e\xdd\xa3\xd5\xfb\x85\xa7\x4f\x9b\x56\x77\xaf\x75\xdb\x75\x05\xca\xb8\xfb\xc3\xe6\x5d\x37\x7d\xd4\xe6\xfc\xc7\x2d\x6d\xfb\x89\x0f\x12\x86\xd0\xe4\xed\x9a\x9d\xa4\x7e\x1f\x5c\x07\x41\x84\x18\x93\x39\x9d\x0e\x98\xbf\xdc\xa3\x35\x13\xd1\x9a\x8c\x19\x45\x81\xe5\x9a\x18\xd9\x71\x66\x1d\x7c\x5d\x48\xf1\x4f\xd3\x22\x15\xf4\x4c\xe6\x53\xe0\xa3\x24\xc7\xd2\xff\xf9\x4c\xe1\x7f\xb1\x47\x05\xe3\x46\x69\x7d\x0f\x01\x66\xe9\x21\x93\x0c\x6a\xdb\x8c\x59\x1a\x14\x07\xb1\x03\x52\xad\x6f\x26\x08\x99\xd8\x48\xc4\x98\x8c\x8f\x6e\x29\xb8\x81\x4f\x00\xe1\x7f\x5f\x37\xfa\x7f\xe5\x73\x2c\x44\x44\xaf\x4d\xb3\xe0\xff\x94\xe6\x88\x8a\xbf\x44\x8c\x19\xa2\x7d\x80\x2e\xcf\x3b\x5a\xcd\xe3\xac\x4f\x5b\x21\x67\xdc\xe8\x34\xbe\xce\x1f\x26\x76\xe1\xca\x69\x2f\xb5\x05\xf4\x7a\xab\xec\xae\x9f\x34\x7c\x89\xee\x08\x8b\x2f\x6a\x4b\x85\x23\x32\x22\x55\x8e\x62\x53\xe4\xb6\x6a\x94\x76\x92\xba\x93\xd0\x46\x61\x0e\x81\xc5\x9f\xf1\xab\x08\x85\x47\xf9\x85\x6e\x6c\x6f\x8b\xf2\xbd\x44\x4f\x7b\x14\xd4\x5b\xf7\x93\x19\x52\xa5\x10\x64\xb7\x69\xf4\x57\x80\xb8\xcd\xa9\xae\xf2\xf3\x8c\x8f\x6e\x3b\xf8\xf3\x67\xc4\x75\x46\xfc\x3b\x49\xed\x78\x88\x3f\xa6\xee\x35\x92\xda\x71\x78\x6f\xca\x71\xeb\x7d\x72\x5b\x11\x15\xe3\x20\x42\x18\xd3\xcc\xf6\x9b\x73\x5b\x41\x55\x88\x93\x5b\x49\xc6\xb6\xe4\x56\xc0\x07\x1e\x30\x81\x05\x22\x70\x02\x2e\xc1\x12\xd8\xa0\x0f\xc6\x60\x05\x86\x60\x06\xae\xc0\x00\x4c\xc0\x08\x38\xe0\x0c\x5c\x83\x39\x98\x82\x05\x38\x06\xaf\xc0\x0d\x78\x0e\x4e\x1b\xd3\x62\x25\xb1\xb9\x98\x04\xd0\xe8\xdb\x97\xaf\xa2\x61\x0a\x86\x66\x43\x75\x2e\x29\x8e\x69\x8a\x82\x21\x68\xa2\xa5\xdb\x8e\x39\x47\x8e\xa4\x88\x9a\x68\xa9\x96\x36\x47\xdf\xbe\x7c\x55\x24\x01\xea\xa2\xa4\x68\xaa\xae\x28\xba\x04\x35\x71\xa7\xe4\x49\x09\xd7\x66\x66\xc9\xa0\xd5\x84\x58\x36\xba\x41\x5e\xb0\x5c\x20\x1f\x57\x62\xfd\xa5\xc9\xbb\x14\xc5\xb1\x65\x15\x0a\x8e\x6e\x20\xcb\x10\x14\x5d\x36\x65\x5b\xb0\xa0\xad\x9a\xa6\x60\x1b\x82\x66\x23\x11\xe9\x8a\xf8\xed\xcb\x57\x43\xd7\x0c\x49\x30\x24\x4d\x53\x0c\x59\x94\x64\x43\xef\x32\x47\x85\x01\x2a\x79\xaf\x8a\x63\x17\x8c\xe8\xdf\xbe\x7c\x35\x4d\x5d\x33\xa0\x46\x33\x3a\x59\xb2\xa8\x20\xdd\x10\xed\xb9\xa2\x5a\xb6\xac\x88\xb6\xa2\x2a\x96\x05\x91\x82\x60\x9c\xd2\x49\x57\x65\x4d\xd3\x25\xa8\x48\xb2\x68\x40\x43\xe8\x32\x33\xd7\xbf\xf2\x50\x43\xf0\x42\x9e\x39\xce\x53\x82\x53\x67\x48\x93\x29\x82\x81\xfc\x1b\x37\x0c\x7c\xf2\x37\x5f\xcd\x88\x45\x54\xf7\x55\xe2\x24\xd9\x88\xa9\x39\xd4\x44\x07\xea\xc8\xb1\x74\x0d\xea\x26\x9c\x23\x34\x57\x75\xc5\x44\x8e\x89\x6c\x4b\x55\xb5\xb9\x60\xe9\xc8\x10\xbe\x7d\xf9\x0a\x55\x28\x08\x82\xae\x41\xc1\xd0\x14\xcd\x50\x14\xa3\xcb\x4c\xf3\xfe\x2b\x29\xaf\x0a\x23\x97\xf1\x64\x18\x73\xc3\x10\x34\x01\x42\x5d\xb6\xe7\x08\xe9\x73\x55\x30\x15\x5b\x11\x54\x68\xcb\xa2\xad\xce\x0d\x01\x39\xd0\x94\xbe\x7d\xf9\xaa\x6a\x86\x24\xea\x86\xae\x40\x59\x94\x04\x0d\x42\x49\xe9\x32\x27\xd7\x21\x6a\x42\x53\xd4\x84\xa7\x02\x14\x15\x34\xf9\x45\x60\xcb\xbe\xa7\x69\x92\x2e\x0b\x22\xa4\x49\xd0\x94\xe7\xa2\x65\x6b\xa6\x62\x4a\xa6\x28\x69\x9a\x61\x89\xc8\x54\x44\xcd\x14\x04\xd3\xd6\x2c\x87\xe2\x46\x50\xa1\x21\x41\x85\xc0\x2b\xeb\xaa\x21\x2a\x6a\xb7\x6c\x9b\x2f\x26\xe4\xd2\x77\x4f\xc8\x65\xec\x9a\x90\xcb\xd8\x2d\x21\x97\x28\xfc\xe0\x84\x5c\x89\xe0\x26\x62\x39\x76\x3c\x59\x85\x66\x1c\xbc\x8f\x7a\xf1\x36\xad\x1c\x73\xfa\x3a\x62\x6c\xb4\x44\x3e\xcd\x3c\x13\xf8\xb4\x1e\xfa\xb8\x8c\x85\xba\xbf\x5a\xcc\x51\x48\x4e\xe7\xe4\x74\xe6\x05\xa6\xcd\x24\x6c\x29\x22\x32\x6e\x61\xfa\xe6\x15\xe2\x1f\x21\xc7\x97\x28\x3c\x28\xc7\x97\xbe\x35\xc7\x97\xf7\xaf\xa3\x35\x59\xda\x99\xd6\x64\x79\x47\x5a\x2b\x54\xdc\x48\x6b\xb2\xf2\x5f\x5a\x6b\xa3\xb5\x1c\x37\xfb\xd0\x5a\x61\x35\xdb\x68\xcd\x6c\x12\xdf\xbe\xb9\xc8\x49\x4d\xb5\x91\x2c\xeb\x86\x03\x35\x07\x69\x96\x21\x41\x49\xd6\x2d\x6b\x2e\x8b\xa6\x34\x9f\x2b\x8a\x64\x8a\x73\x5b\x91\x35\x22\xa8\x14\x43\x57\x55\x43\x84\x8a\x20\x09\xa2\xae\x4a\xb2\x6c\xec\x97\x7b\x50\xdd\x3d\xf7\xa0\xba\x6b\xee\x41\x75\xc7\xdc\x83\xea\x7f\x4a\xee\x41\xf5\x41\xb9\x07\xd5\xed\xb9\x07\xad\x56\x5a\xa1\x76\x50\x66\x11\x5d\x7d\xfb\xf2\x55\x9f\x9b\x68\x8e\x20\x32\x24\xc9\x54\xb4\xb9\xe1\xc8\x0a\x74\x6c\xc3\xd0\x04\xd1\x94\x4c\x55\xb3\x05\xcb\xb0\xe7\xb2\xf3\xed\xcb\x57\x59\x85\x9a\xa8\x2a\x92\x0a\x55\x5d\x15\x04\x4d\x13\x76\xa2\x97\x41\x71\xe8\xc5\x8a\xfa\x16\x9b\x21\xa6\x19\x6e\x91\x9f\x1c\xf4\x4c\xc6\x43\x98\xd4\x0a\xc2\x64\x9b\x82\x38\x05\xae\x19\xeb\x36\xa6\xeb\x33\x81\xef\xdd\x31\x5e\x70\x8b\x42\x8b\x9c\x89\xe2\x06\x11\x48\xea\x47\x71\x83\xeb\xbb\xe5\x35\xf2\x23\xa2\x04\x44\x3b\x21\x00\xda\x50\x10\x25\xcb\xd0\x74\x51\x55\x25\xdd\x82\xb2\xa0\xa9\xb2\x6e\x69\xa2\xa0\x3b\x0a\x32\x45\xc1\x9a\x5b\x8a\x68\x51\x1d\x49\x17\x0c\x45\x82\xaa\xa6\x1a\xb2\xae\x69\xa2\xa1\xed\x83\x80\x71\x86\x00\x3f\xc0\x8c\xeb\x5b\xde\xca\x46\xcc\xed\xb5\x8b\x51\xb4\x34\x2d\xc4\x50\x3d\xc6\xa6\xb0\x9f\xb4\xc2\x9e\x3d\x9c\x89\xc1\xb7\x1d\x4d\x13\x54\xc1\x50\x94\xf9\xdc\xb0\x34\x43\xb6\x45\x5b\xd5\x9d\xb9\x68\x69\xa6\x26\xcf\x0d\xd9\x41\xb6\x0e\xe7\xfa\xb7\x2f\x5f\x25\x68\x68\xba\xae\xe8\x22\x84\x9a\xa8\x89\x8a\x0c\xd5\xca\xea\x14\xdf\xe5\xfc\x0e\x2e\x8b\x30\x0c\x07\x22\xf3\x1e\xdd\x31\x4b\xd3\x0d\x33\x66\x63\x6a\x8e\x21\x2a\x8e\xa2\x8a\x48\xd3\x04\x53\xb3\x35\xdb\x40\xb6\x35\x17\x4d\xd3\x9e\xdb\x2a\xd2\x4c\x03\x5a\x32\xd5\xc4\x55\x5d\x80\x22\x41\x9c\x6e\xa8\xa2\x26\xaa\x82\xbe\x53\x0e\xd8\x7c\xaf\x6a\xe2\xce\xcc\x46\x6b\x13\x8b\x55\x66\xa3\xb5\x71\xdc\x0a\xb3\xd1\xe4\x1f\xcc\x6c\x4e\xae\x51\xbc\x02\x81\xc3\x98\x8c\x28\xc8\xfa\xc1\xdc\xc5\xcc\x6c\xf6\xe2\x40\x64\x8e\x67\x7d\x26\xbe\x0f\xce\x57\x60\x4b\x3a\xea\xc6\x64\xd4\xdf\xcf\xab\x72\x3c\xec\xc3\xab\x0a\x2b\xd7\xc6\xab\x96\xad\xa4\x56\x21\x77\x53\x10\x91\xa6\x9a\x73\x53\xb3\x44\xdd\x34\xa1\x6a\xe8\x8a\xe2\x08\xba\x01\x1d\xcd\x12\x45\x41\xd5\x4c\x6d\x6e\xcf\x0d\x72\x94\x15\x35\x41\x96\x75\x55\xd0\x15\x43\x22\xbb\xda\x80\x5d\xa6\xd4\xb7\x65\xfa\x64\x27\xce\x11\x83\x16\x4b\x7c\xc7\xfc\x0e\xec\xa6\x6d\x17\xbb\x8d\x32\x0b\xd3\xba\x76\x7d\xc4\x5c\x23\xd3\xc3\xd7\x8c\x75\x8d\xac\xf7\x84\x2b\x92\x23\x8d\xad\x18\x50\x32\x4c\xc5\xd6\x65\x75\xae\x69\x10\xc9\xb2\x68\x2a\x96\xa4\x2b\x9a\x30\xb7\x25\x84\xe2\x64\xbf\x82\xa6\x68\x82\x24\x89\x92\x21\x1a\xaa\xa6\xe8\xb2\xba\xdf\x1e\xd0\x77\xd7\xf7\xf4\x5d\xf5\x3d\x7d\x47\x7d\x4f\xff\xd1\xfa\xde\x30\x46\xf3\xeb\x04\xcd\x2f\x62\x34\x0f\x08\x9a\xa9\x7a\x96\xa4\xb5\x8b\x15\xbd\x64\x11\x16\x81\xef\xe2\x20\x2c\x28\x7b\xb9\x42\x97\xee\x10\x1b\x2d\xbd\xe0\x2e\xbd\x4f\x74\xa3\x1d\x25\x7b\xd2\xd1\x63\x6c\x1b\xfd\x41\xea\xa0\xbe\x5d\x1d\xec\x37\x91\x6b\x31\x29\x16\x93\x24\x4a\x21\x82\x02\x09\x92\x28\x4b\x70\x2e\x38\xaa\x64\xce\x15\xa8\xca\xb6\xe5\x48\x86\xe0\x98\xba\x25\xc8\xd0\xb0\xa1\x8d\x34\x8d\x9c\xcc\x0d\x41\x36\x54\x49\x56\x44\x4d\xd6\x35\x43\x91\x24\x7d\xa7\x9b\x9d\x7c\x99\x8d\x36\xe2\xab\xd3\xa9\xa1\xec\x48\xa7\x85\x8a\x1b\xe9\xd4\x50\x7f\x30\x9d\x8e\xa8\xe0\x26\x24\x37\x37\xa3\x38\xd2\x7b\x10\xe1\x88\x71\xfd\x98\xe7\x9e\x4e\x07\xc5\xeb\x88\x84\x7d\x44\x94\x16\x71\xc0\x44\xc8\x5a\x85\xc8\xbb\x23\x6a\x8d\x8f\x2c\x9c\xf1\xea\x57\xae\xbf\xfa\x98\xd9\x25\x23\x4a\xb0\xc1\x0a\x93\xe3\x4b\x10\x91\xe1\x68\xad\x62\xcf\xf4\x0e\x18\x31\x23\x1f\xd3\xf4\xf3\x8f\x41\xaa\x39\xf6\xf6\x21\x55\xa3\x8d\x87\xe4\xa4\x3a\x6e\x22\xd5\xb6\x64\x6a\x44\x59\x99\x6b\x96\xa1\xaa\xd0\x51\x1c\xa4\x4b\x0a\xb2\xed\xb9\xae\x49\xaa\x86\x0c\x51\x90\x6c\x47\x83\x68\x6e\x23\xc1\x20\x6a\x99\xac\x88\x2a\x54\x21\x94\x05\x45\x80\x8a\xa6\xa8\xa2\xb2\x6f\x0e\xf5\x3d\xee\x6c\x84\x9d\x2f\x6d\x84\x1d\x6f\x6d\x20\xfc\xd1\xd7\x36\x27\x84\xed\x0d\xbc\x60\x65\x3f\x0b\xc2\x38\x05\x32\x51\xc2\xad\xf7\x89\x91\x20\xa2\x74\xe4\xda\xc8\xc7\x2e\xbe\xa3\x7a\xb4\x69\x59\x28\x8a\x92\x33\x31\xa5\xb6\xce\xa8\xff\x9a\xcb\x33\x07\xc7\x0c\xf6\xc4\xf4\x3f\xad\x18\x1f\x21\x9b\xf2\xe8\x84\xd7\x92\x0e\xc2\x95\x9f\x33\xe3\xc0\x67\xfa\x0b\xf3\x13\x8d\x8a\x3a\x67\x52\xff\x73\x9e\xea\x3d\x84\x08\x56\x11\x2a\xe8\x34\x29\xa7\xc7\x41\xd2\xff\xed\x35\xa2\x9b\x2b\xb5\x69\x10\x68\x1b\xa7\x43\xb5\x6b\xaa\x12\x2d\x51\xb8\x70\xa3\xc8\x0d\xfc\xc2\xd9\x9e\x19\xf5\x5f\xe7\x33\x00\x4c\xb4\xb2\xae\x19\x33\xa2\xc5\xcb\xc0\x73\x2d\x97\x94\x86\x81\x87\x92\xd3\x44\x76\x9d\xb3\x0c\x03\xc7\xf5\x08\xc8\xef\x82\x78\xbe\xa4\xd7\x04\x1c\x7a\x30\x09\xfc\x16\x98\x96\xe8\xd1\xf5\xb0\x02\xc5\xec\x97\xb0\x7e\xfb\x6d\xd6\xaa\xb8\x4f\xeb\x16\xb1\x54\xf3\x17\x75\xc9\x52\xac\xb9\x3d\x57\x90\x2a\x68\x86\x30\xb7\xe5\xb9\x29\x42\x4b\xb1\x75\xc1\x16\x6d\xa8\x89\x50\x9d\x4b\xd0\x26\x3b\x59\x87\x2a\x94\x35\x43\xd4\xa1\x0e\x0d\x41\x52\xa1\xb4\xe7\xf6\x14\xb7\xec\x86\xe2\xf6\x14\xdb\x8e\x09\xb5\xed\x29\xb6\xa9\xa5\xd5\xed\x29\x4a\x7f\xcc\x4d\x97\xe9\x37\x9b\x38\x99\x0e\x29\xce\x6c\x7b\x1c\xcf\x94\xb2\x2d\xd7\xeb\x3b\x6e\x18\xe1\x5a\x90\x85\xc4\x0d\x86\xb4\x4a\xdf\x82\xa6\xc7\x0a\x42\xea\x89\xf3\x47\x6a\x88\x7c\x14\x32\xcd\x31\xb7\x17\x99\x8a\x5b\x1a\x75\x7f\x07\xc3\xcd\x64\x5a\x39\x35\x18\x73\x4b\xb5\x55\x59\xd2\x0d\x41\xb3\x25\x43\x55\x2c\xa2\xf4\x88\x82\x68\x4b\x3a\x94\x1c\x59\x80\x2a\x54\xe7\xa6\x43\xce\xa9\x86\xae\x68\x06\x54\x25\x45\x35\x24\x45\x14\x44\x01\x76\xb7\xe1\xbb\x7c\x6c\x9e\x6d\x06\x6d\x45\x1d\xce\x13\xc0\x24\x45\x95\x75\x22\xd1\x2c\x43\xd7\x14\xdb\x94\x0d\x51\x9e\x43\x53\x14\x0d\x49\x10\x44\xcd\x50\x05\x5d\xd2\x54\x59\xa7\xe6\x12\x59\x51\x65\x51\x11\x64\x45\x81\x86\x2e\x2b\x32\xec\x32\xfd\x5a\xf7\x51\xfa\x82\x32\xe6\x85\xf3\x6c\xc0\xdf\xc1\x55\x11\xb0\x9b\xa5\x95\xae\x7e\x62\x51\xce\x0e\xf5\x70\xae\xd9\x50\x96\x65\x63\xae\x53\x3c\x39\x8a\x4e\x4f\x30\x73\x55\x57\x0d\xcb\x11\x74\xc9\x76\xe6\xb2\xfc\xed\xcb\x57\x45\x17\x14\x43\xd7\x55\x43\x80\xa2\xa0\xe8\x32\x14\xf6\xdd\xda\xd2\xee\x9a\x22\x94\x76\x55\x15\x8b\x35\x37\x6f\x6d\xe9\x47\x2b\x8b\x7f\xd4\x2d\x62\x61\x26\x7b\x6d\x35\x69\xbb\xe6\x36\xa8\x91\x4d\x89\x53\x64\x74\xe3\xc8\xb6\xae\x6b\xb6\xa6\x48\xa2\x03\xc9\xa9\x61\xae\xdb\xb2\x26\x88\xa2\xaa\xa8\xb6\x32\xb7\xe6\x86\xa4\x2b\xa2\xae\x12\xba\x81\x2a\x54\x74\x43\xd1\x04\x51\xd6\x05\xa8\x18\xf2\xbe\x74\x23\x6b\xbb\xd3\x8d\xdc\xa6\xdd\xd5\xe8\x46\x6e\x93\x8f\x55\xba\x91\x8d\xff\x14\xba\xc9\x67\xb2\x17\xdd\x14\xf0\xdf\x46\x37\x93\x22\xdd\xb4\xc7\x02\xca\xc8\x47\x77\x1c\x5d\x72\x1c\x1b\x59\x50\x15\x04\xd5\xb4\x0c\xd3\x34\x1c\xc1\x9c\x5b\x26\x12\x04\x5b\x9e\x23\x01\xda\xf2\x9c\x28\x1f\xb2\x08\x75\x51\x54\x09\x4b\x34\x54\x4d\xd6\xf4\x3d\xc9\x67\x77\xa6\xb3\x2b\xcb\xd9\x91\xe1\xfc\x68\x76\xb3\xd1\x66\x56\x58\x83\xa8\x18\x76\xe9\x31\x44\xfd\x83\xb8\xcf\x76\xde\x33\xda\x4d\x1b\x35\x6c\x5d\xd5\x34\x64\x28\xa2\x02\x45\x24\x49\x70\xae\xca\xa6\x20\x1b\xb6\x6e\xea\xaa\x69\xcc\xa1\xa5\x4a\x8e\x6d\x11\x6d\x54\x54\x54\x45\x50\x34\x51\x85\x82\x28\xe8\x1a\x21\xa2\xfd\x68\xa7\x8d\x22\x1a\x6c\x5e\x3b\xd2\x8e\xba\x1b\xed\x68\xff\xd5\x42\x1f\x76\x69\xfd\x10\xd2\x6c\xdb\xcf\x39\x69\x3a\x7f\x5e\x0d\xf4\xec\xcf\xaa\x81\x5e\xef\xa6\x81\xea\xa2\x24\x89\xa2\xa3\x69\xa2\x29\x2b\x82\x65\x23\xcb\x50\x65\x45\xd6\x65\xc3\x80\xa6\x61\x20\xc1\xb6\x1d\x28\x23\xed\xdb\x97\xaf\x9a\xa4\xeb\x9a\xa6\x1b\x9a\xa1\xc8\xaa\x2c\x29\x50\xf8\xef\x6e\xfe\x43\x15\x88\x1f\xb4\xbb\xe6\xbb\x2a\x9d\x86\x29\xda\xa2\x2c\x6b\x8e\x69\x98\xb2\x23\xea\x02\x52\x6c\x4b\x96\x04\x51\x46\x0a\x84\x68\xee\xd8\xa2\x64\x4b\x84\x54\x64\xa8\xa9\x8a\xac\x48\xa2\x4c\x68\x58\xd4\xe8\xbe\xda\x4b\xe9\xfc\x4f\xf6\xec\xfa\xa3\xe8\xe5\x87\xb9\x61\x4d\xf7\x53\x37\x91\x6c\x18\x84\x25\x9b\xba\xad\xaa\x82\x04\x55\xd9\x99\x2b\x50\x99\x23\x07\xca\xaa\xa6\x42\x41\x56\x4d\xcd\x56\xd1\xb7\x2f\x5f\xa1\x6c\x28\x82\x62\x88\xb2\x4c\x78\xb1\x24\x18\x70\x4f\xd3\x75\x2b\x35\xd4\x09\x47\x6c\x73\xa9\xa9\x12\x8e\xd8\xe6\x00\x52\x25\x1c\xf8\x9f\xaa\x72\x8a\xf0\x41\x94\xd4\xb6\xe1\x72\x4a\x5a\xec\x78\x05\xaa\x9a\xa6\xa3\xcf\x35\xc3\x12\x0c\x64\x69\xb2\x68\x2b\xb6\xa0\xdb\xf3\xb9\x2e\x22\x53\x36\x14\xa8\x18\xb6\x61\x4a\xe4\xbc\x0b\x0d\x41\x14\x04\x5d\xd4\x35\x5d\x96\x04\x43\x56\xf4\xff\x8a\xa9\xff\x2a\x9d\x0f\x10\x8b\xc7\x7f\x5e\xa5\xf3\xd5\x9f\x55\xe9\xbc\xd9\x4d\xe9\x74\x04\x28\xea\xc8\x81\x9a\x29\xd8\x96\xe9\x48\xba\xa6\x40\x69\x6e\x21\x15\xce\xa1\x24\x39\xb2\x2d\xa8\xaa\x33\x97\x44\x7a\x7d\xa5\xe8\x92\xa4\xeb\xa2\xac\x48\x0a\x94\x54\x5d\xd5\xff\xbb\x9d\xff\x13\xb4\xce\xe7\x3b\x6a\x9d\xb2\x83\x14\xa4\x4a\xaa\x6d\x8b\xb2\x2d\x58\xa2\x88\x14\xc1\x10\x74\x0b\x49\x96\x2c\x6a\x86\x8c\x4c\xa4\x59\x8a\x3e\x4f\xae\xc8\xa1\x02\xa1\x2e\x8b\x50\x95\x75\x5d\x95\xf7\xa4\x95\xff\x6a\x9d\x7f\x66\xad\xf3\x74\x3f\xad\x13\x3a\xaa\xea\xa8\xa2\xac\x43\x28\x6a\x0e\x52\x2d\x28\x40\xc5\x80\x73\x49\xb4\x04\x4d\x15\x0c\x43\x97\x8c\xb9\x09\xe9\xc9\x56\xd3\xa1\xa0\x43\x45\x95\xa1\x21\xea\x82\xa4\x40\xf9\xbf\x5a\xe7\x7f\xb0\xd6\x79\x7e\x2e\x01\x36\x0b\x04\xc6\x5e\x80\x73\x96\x06\xe5\x65\x01\x6b\x7a\x28\xc4\x0c\xfd\xef\x81\x6d\xfa\x57\x28\x64\x01\x1b\x06\x1e\x4a\xbf\xb1\x40\x06\x71\xa8\x67\xd2\xcc\x0c\x5d\xf3\xc0\x43\x37\xc8\x63\x01\x2b\xb2\x17\x00\x81\xf3\x24\x0e\x7c\x18\xdc\xb2\x80\x75\xdc\x8f\x07\x9f\x68\x18\x8e\x03\x28\x08\xa4\x4d\x16\x26\xde\x3b\xf0\xae\x0e\x54\x36\xff\x09\x45\xda\x67\x32\x9a\x1f\xf8\x88\xa5\x29\x3d\xcc\xd0\xa6\xb5\x5c\xeb\xbd\x39\x27\xdf\x24\x02\xc1\x20\x81\x98\x96\xa7\x1d\x9b\xa1\x7d\x30\xf7\x82\xb8\x80\x8d\xae\xcd\x25\xe9\xca\x0a\x16\xcb\x15\xa6\x53\x89\xdc\x4f\xa4\x44\x13\xb3\xae\xe3\xe8\xec\x85\xf6\xf4\x45\x1b\x7b\x01\x70\xa1\x08\x7d\xc4\xec\x05\x70\xf3\x12\x27\x08\x48\x87\x17\xa5\xe9\xd6\x66\xa7\x54\x67\xe7\x67\x38\x73\x6f\x28\x4a\xa3\x08\x85\x38\xf9\x1b\xc2\xbb\xe4\xfd\xf2\x49\xe8\x5e\xc5\xa8\x27\x20\x27\xb3\x70\x7d\x27\x38\xb0\xdc\xd0\xa2\xe8\x49\x26\x22\x8a\xc9\xf2\x85\xd3\x20\x72\xe3\x30\xbc\x2c\x0e\x96\x07\xa1\x7b\x75\x8d\xe3\xe1\x67\x71\x55\xef\x8a\xae\x1d\x8d\x6c\x3e\x59\x22\xbf\x0e\xae\x56\x5b\x0c\x11\xb0\x49\xb4\xdf\x74\x45\x92\xd1\x8e\x92\x38\xf3\xa3\x38\x08\x3d\x81\x33\x8e\xae\xcb\x56\x22\x79\xb0\x31\xa5\x15\xc2\xa3\x34\xd6\x49\x16\xdd\x0a\x16\xf3\x60\x1e\x7c\x24\xe8\xa0\x68\x8a\xe3\xee\xb3\xc5\x67\x8a\x25\x76\x47\x2a\xae\x70\x40\x56\xd8\x43\x98\xfc\x0c\x9c\x98\x34\x5d\xbb\x61\xa0\x0b\x40\x48\x3f\xc9\x44\x41\x09\xf9\x59\x40\xd0\x9c\x86\x3b\xbf\x00\xe7\x45\xf2\x4e\x51\x3f\x5f\xb9\x9e\x4d\x03\x5a\x6f\x20\xa0\x10\x04\xc0\xdb\x86\x9d\x6a\x08\x94\x46\xf4\x34\x54\xda\x82\x9f\xc2\xf3\xc4\x7d\xd0\x53\x1b\xa8\x4c\x12\x50\x2c\x10\x44\xb4\x28\x6d\x56\xef\xea\x40\x4e\x89\x21\x4b\x03\x90\x82\xc3\x5e\x00\x33\xfe\x54\xc0\x40\x7d\x9e\x89\xcf\x56\xf2\x6b\x61\x7e\x8c\x63\xce\xb0\x80\x95\x45\xba\xcb\x0b\x81\xa3\x93\xa5\x29\xc4\xe5\xbf\x00\x97\x3b\x8c\x11\x45\xd7\x2f\xd1\x5d\x8a\xd8\x42\x7f\x80\x45\x56\xc1\x41\x9b\xae\xcf\x05\xb0\xc1\x39\x9b\x20\x8e\x7a\x5d\xc7\xb8\xb6\xbc\x70\x90\xff\xca\x57\x33\xf1\xd3\x8e\xfd\x87\x63\xf7\xe1\xd8\xb5\xd8\x6e\x84\x65\x63\xf5\x74\x85\xf3\x71\x4a\x2b\xbc\xc9\x65\x99\xbd\x00\xfd\xbd\xe0\x4e\xbc\x49\x5f\x04\x11\xde\x04\x6f\x63\xb5\xdd\xe0\xfc\x25\xf1\x57\x25\x6d\x93\x5d\x97\xd6\xc8\x05\x4f\xfc\xf7\x38\xc6\xfc\x78\xaf\x19\xc4\xee\x70\x65\x27\xb8\x66\x1a\x6b\xae\xb8\x65\x16\x83\xd8\xdb\x8e\x36\x63\xf2\x76\x17\x60\x15\x93\x5c\x1a\xc4\xbc\x00\x51\x1e\xb3\xbd\x11\x8e\xc2\xe7\x5c\x70\x26\xa3\xcd\x3d\xd3\x7f\x4f\xf8\x36\x95\x3c\xe9\xef\x94\x17\x55\x39\xd4\x55\x2b\x08\x95\x14\x4e\xcd\x80\xd4\x2a\x5d\x80\x41\xa3\x04\xf1\x90\xb3\x5d\x80\x6c\x80\xa4\x18\xe1\xa7\x1d\x94\x72\xad\xa2\x2a\x92\x73\x21\xa6\xc8\x83\x98\x12\x07\x22\x00\x25\xc1\x0e\x4e\x82\xab\x2b\x0f\xd5\xba\xa0\x7a\x48\x91\xa9\x97\xb5\x19\x98\xfd\xc5\x96\xb4\x9e\x98\x13\xc6\x45\x2e\x46\x8b\xa8\x56\x42\x98\x0b\x36\xb1\x6b\x95\xbf\x58\x81\x7f\x70\x1b\x9a\xcb\x65\xdc\x49\x26\x43\xd0\x47\xcb\x33\x63\x3a\xca\xa4\x78\xa9\x55\xa9\x9b\x44\xe3\xc8\xb6\xc4\x7c\x85\x31\x5d\x99\x32\x99\x7a\x41\x94\x28\x49\xf1\x5f\x52\x41\x1f\x8a\xab\x5e\xbb\xb6\x8d\xe8\x92\x86\x2b\x54\xd0\x26\xe2\x06\x7b\xe8\x0e\x45\xd1\x79\x91\xc4\x85\x58\xd2\x68\x10\xbb\x12\xcf\x06\xe1\xb2\xb0\x63\x85\x63\xb2\x4d\x7e\x36\x07\x91\x6c\xa4\xae\xd6\xaa\x09\x01\x90\x01\x1a\xb6\x7e\xfb\xc9\x8a\x46\x02\xa0\xdb\x7b\x93\x4c\x6d\x19\xf6\x02\x8c\xb6\xb3\x0e\x71\x33\xeb\x20\x18\x9a\x3e\x0c\x43\xcd\x3d\xb7\xd7\xfd\x3e\x1c\x89\x0f\xc2\x11\x99\x5e\x1c\x51\x64\x47\x06\xd7\x3c\xa9\x5a\xa5\x0b\x30\xdf\x99\x51\xb5\x77\x59\xae\x75\x01\x16\xdb\x97\x53\xda\xbc\x9c\x12\x7b\x01\x4e\x1f\xb6\x9c\xcd\x3d\xb7\xd7\xfd\xbe\xe5\x94\x1e\xb4\x9c\x64\x7a\x71\x50\x98\x1d\x97\xb3\x79\x52\xb5\x4a\x17\xe0\xf9\xce\xcb\xd9\xde\x65\xb9\xd6\xc5\xc5\x1a\x60\xb4\x58\x7a\x26\x46\x79\x48\x9c\xa6\x8c\x74\xa4\x37\x16\x08\x59\xda\x31\x10\x21\x60\x80\x34\x1f\x5c\x31\x1d\xdc\xb5\xcc\x02\x9a\x1d\x69\x76\x74\xd3\x91\x80\x54\xcd\xc2\x96\xe6\xcd\x94\x0b\x59\xe0\x68\x41\x96\x7d\x54\x05\xac\xc9\x02\x9a\x06\x72\x6c\xd3\xa4\x54\x84\xb5\x83\x42\xc8\x9e\x2c\x6c\x1d\x39\x88\x0c\xc8\x67\x1a\xc2\x79\x9d\xf6\x90\x26\x88\xd4\xd2\x34\x5f\x7a\x31\x23\x59\x96\x7f\xce\x00\xec\x92\x05\x46\x0a\x2c\x14\x00\x14\x6a\x79\x3e\x21\xad\x04\x61\x56\x4b\x04\x50\x6c\xcd\x0a\x2a\xa5\x18\x91\x6a\x89\x42\x61\x3d\x21\x1b\x54\x36\xa6\x06\x85\xea\x77\xa4\x06\x3d\x79\x78\xb2\xbc\x6a\x8a\xd0\x18\xd6\x2c\x73\xbc\x28\x6e\x4d\x1e\x27\xe6\x8a\xaf\x28\x64\x99\x3d\x65\x7a\x32\xad\x1c\xd5\x9a\x32\xb2\x25\x39\xde\xc4\x9c\xae\xd4\x62\x8e\x37\x31\xcf\xf1\xa6\x81\xcb\xed\x59\xe2\xf5\xdd\x72\xbc\x19\x60\xb9\x57\x96\xf8\x2d\x19\x62\x25\xa1\x4a\xd8\x12\x7c\x00\x65\xc7\x41\xde\x33\xd2\x96\xc4\x2a\x6d\x4b\x52\x91\x06\xc4\x7c\x34\xb9\x4c\xde\x92\x02\xca\xb9\x55\x69\x25\xb5\x42\xde\x92\x06\x44\xad\x75\x4a\x7a\x8d\xbc\x25\xa3\x46\xde\xb2\x50\x23\x6f\x19\xd6\xf2\x40\x8a\x40\xcc\x36\xa2\x2c\x35\x93\xb7\x2c\x37\x93\xb7\xac\x00\xfb\x71\xc8\x5b\x56\x6b\xe4\x2d\x6b\x5b\xc9\x5b\xd6\x1b\xc8\x5b\x36\xe2\x9b\x85\x2d\xf4\xad\x08\x39\x7d\x67\x63\x2a\xb0\x48\xdf\x52\xc6\x67\x15\x11\xf4\xb7\xd2\xb7\x22\xed\x44\xdf\x8a\x0c\xc6\x8f\x45\xdf\x45\x14\x2a\x4a\x8d\x02\x14\xb5\x96\x71\x52\x49\xb0\x4a\xa7\xde\x80\x52\x25\x47\xa9\x24\xa6\x44\xa2\x18\x40\xca\x28\x4d\x15\x5a\xd2\x85\xc2\x66\x22\x51\x45\xb0\x42\x0f\xce\x4b\x4d\x7b\x96\xb2\xa5\x92\xb2\x0c\xb1\x6a\x7b\x72\x63\x3a\xaa\x02\x86\x04\xcb\x70\x4b\xc2\x4f\x55\x05\xb3\x9d\xea\x69\xe0\x6a\xdf\xc4\xa0\x14\x5b\x7a\x6d\x09\x54\x63\xf3\x12\x68\x42\xc3\x12\x68\x10\x48\x99\x18\xd2\xc4\xe6\x25\xd0\xa4\x96\x94\xad\x32\x18\x3c\x7c\x9f\xd2\x9e\x73\x69\x20\x65\x1c\x4f\x53\x37\x2e\x81\xa6\x81\xc9\xbe\x28\x2b\xa2\x4e\xd3\x6b\x04\xad\x19\x35\x6c\xea\x69\xf7\xc9\x5d\x4a\x03\x42\x75\xd8\x80\x50\x5d\x04\x52\xc6\xf8\xf4\x16\xc6\xa7\xb7\x30\x3e\x5d\x01\xa3\x87\xd3\x34\x1d\x51\xad\x80\x9d\x1e\xda\xb3\xa1\xb5\x1c\xe3\x19\x7f\xd2\xf5\x22\xff\x26\xdc\x4e\x37\xd2\x4b\x2f\x76\x57\x46\x61\x08\x35\x24\x1a\x70\x2b\x12\x0d\xb1\x01\x89\x86\x04\xe4\x2c\x0f\xad\x21\x37\x23\xd1\x50\x9a\x91\x68\xa8\xc0\xf9\xbe\x4c\xc2\x86\xb6\x05\x89\x86\x9e\x21\x51\xce\x27\x6b\x54\x91\x08\x05\x61\x6f\x2c\x42\xa1\x9c\x85\x99\xaa\x81\x82\x08\x68\x54\x4c\x73\x65\xbb\xf8\xc0\x0b\xae\xae\xe8\xb5\xbd\xdc\xae\xa8\x0a\x52\x5d\x2d\x15\x1a\x72\xda\x0b\xca\xd6\x15\x82\x82\xda\xb0\x44\x50\xd0\x80\x9c\x6b\xc1\x42\x9b\x06\x2b\xb4\xa8\xb0\x10\x0a\xe0\xec\xfb\x96\x09\xc2\x2a\x79\x55\xd7\x09\xc2\x3c\xa3\xb0\x9c\x23\x02\x4a\x95\x09\xd1\xc5\x22\x9a\x3c\xd3\x5f\xe1\x60\x61\x62\x14\xbf\x4c\xa6\x81\x60\x9d\xf8\x95\x7d\xf9\x65\xf2\x8c\xbe\x4c\xde\x69\x55\xd3\x7f\xef\xfc\x8f\x1d\x58\x38\x12\x40\xb5\xbe\x44\x50\xab\x2f\x51\x7a\x38\x68\x4d\xc2\x0d\xa1\x51\x3b\x5d\x88\x02\x90\xf3\xa1\x44\xd8\xb2\x3a\xa9\xae\x5f\x5b\x1d\x51\x02\xd7\xdf\xb9\x3a\xe4\x3c\x90\x26\xe4\x96\xd5\x7c\x48\xa5\x31\x25\xb7\xa8\x82\xf9\xae\x39\xb9\x45\x6d\x4b\x52\x6e\x1d\x4c\x77\xca\xca\x2d\x1a\x60\xf1\x10\xe9\x0b\xa5\x3a\xaf\x83\x12\xdc\xb6\x4e\x92\x58\x5b\x27\x49\x02\xb2\x91\x57\x68\x61\x75\x50\x6a\xe1\x75\x50\x52\xc1\xf1\xf7\x49\x0c\x28\x69\xf9\x3a\x29\x42\x3e\xa4\xde\xb8\x4e\x92\x01\x5e\xed\xba\x4e\xb2\xd0\xba\x4e\xf1\xd1\xb9\x51\x3b\xca\x36\x64\x33\x7b\x2b\xc1\x2e\x4b\xf5\x75\x48\x4f\x15\xed\xeb\x20\x2b\xb5\x75\x90\x55\xa0\x14\xba\xd0\x5a\xd6\x41\xd6\x5b\xd6\x41\x36\xc0\xcd\xa6\x75\x50\xc4\xad\xeb\x40\x4e\x0e\xd9\x3a\x48\xd9\x90\x0a\x6c\x5c\x07\x45\x04\xcf\x77\x5d\x87\x0d\x27\x88\x78\x64\x79\xe3\x3a\x28\x1b\x55\xaa\x78\x84\xf2\x89\x20\x86\x50\x03\x1f\x10\x80\x22\x48\xc5\x8e\x52\x3a\x83\xc4\x75\x74\xf0\x1a\x01\x51\x03\xa9\x02\xa6\xe4\x9b\x53\x31\x80\x85\xeb\xdf\x7e\xf9\xed\x7d\x25\x0f\x3b\xbd\xc8\xa2\xc9\xba\x0b\x46\x38\x9c\xe7\x84\xe3\x5a\x32\x98\xe3\x7a\xd6\x0b\xae\x98\xff\x7b\xf9\xdb\x69\x07\xf3\x89\x39\xf7\xe4\x6e\x89\x8e\x92\x48\xbd\x41\x78\xe2\x62\x0f\x0d\xcc\x08\x71\x49\xe2\xf2\x2c\x73\x78\x31\x8d\x7b\xe2\xcc\x31\xe2\x4f\x5f\x7e\x20\xe7\xf3\x08\x03\x5c\x4f\xeb\x97\x8d\x59\x84\x2f\xc9\x53\x8e\x0b\x39\xe4\x5a\x52\x93\xe3\x6a\x6a\xf2\xaa\x77\x00\xd7\xd4\xb2\x0c\x9a\xd6\x00\x1a\x4d\xe8\xfe\xd8\xb0\xd5\x4c\xf3\xd9\x08\x7a\x8e\xf1\x6a\xce\xf8\x82\x41\x3d\x45\xb7\x62\x94\x16\x35\x32\x06\x9d\xb2\x19\x1c\xf3\xc8\xa6\x96\x1b\x9a\xf5\xa5\x90\x3e\x9b\x3f\x79\xf9\xfc\xe7\x64\x43\x99\x1e\xdb\x65\x1b\xd2\xc4\x17\xd3\xe4\xe3\x4a\x9a\xfc\xd3\xfe\xab\xd1\xd1\xe5\xe0\xd5\x9b\xd9\xc9\xf0\xf8\x72\xdc\x7f\xdd\x90\x20\x7f\x53\xfb\xb7\x2f\x46\x27\xc3\xd9\xb4\x3f\xd8\xb3\x5d\x35\xa9\xbf\xd6\x8e\xaf\xdc\x39\x20\x45\x97\x06\xeb\xe4\xb9\xcf\x60\x1b\x16\xa7\xdd\xfa\x9f\x0e\xae\x8b\xd9\x4c\x61\x7b\x3f\x75\xab\x7c\xda\xde\xc8\xf6\x96\x9a\x01\x9f\x68\x6f\xf5\x6e\xe2\x58\x51\x7d\xa2\x27\xbf\x8a\xd5\x64\xae\x95\x2d\x74\x72\x43\x7d\x52\x9e\xe2\x6c\x1b\x41\x36\x58\xdf\x53\x68\xa1\xa0\x65\xd3\x95\xda\xbb\xc8\x0d\xe7\x59\xc3\xf8\xaa\xa9\xca\x43\x4a\x9b\xad\xff\xa9\x61\xab\xed\xb3\x90\xbb\xd1\x5a\x2d\xa5\xeb\xe5\x9b\xf1\xe8\xb7\x37\xc3\x1d\x68\xaf\x6a\x87\xcf\x66\x27\x35\x72\xc8\x64\x76\x49\xce\xa6\x62\x76\xb0\xcf\x9f\x1b\x0a\x0b\x68\xfb\x99\x7c\xee\xb6\x7d\xad\x66\x79\x2b\x8c\x7c\xed\xfe\xb3\xc3\x32\x64\xd2\x8d\xf9\x27\xd8\xb8\x25\xcb\x01\x96\x61\x77\x9c\x70\xc9\xda\x9f\xcd\x38\xd6\x79\xff\xb8\x19\x97\x73\x0f\xed\x35\xe5\xb8\x69\x79\xce\x39\x81\x95\x3d\x11\x00\xfb\x24\x8f\x69\x75\x90\x06\xf9\x23\x2c\xdd\x36\xbd\xc0\x47\x69\xd1\xc1\x22\xb0\x11\xdb\x2e\x7b\xeb\xc2\x66\x8f\xaa\xdc\x1a\xd8\x71\x5e\xfb\x1b\x14\x75\xcf\xcf\xf8\xcb\x77\xe0\x8c\xff\xf5\x15\x38\xe3\xa3\x2b\x10\xf2\x13\x05\x84\xfc\xe2\x3d\x98\xf2\x1f\x6e\x5e\x81\x29\xff\xfa\xea\x25\x98\xf2\xbf\x2e\xfe\x09\x16\xfc\x3f\xc1\x94\xf7\x3f\xbc\x03\x53\xfe\x52\x7e\x0d\xce\xf8\x67\xa4\xe0\xad\x02\x49\x07\xbf\x82\x33\x7e\x05\xa6\xfc\x5d\x14\x80\x90\x74\x35\xe5\x07\xaf\x55\x30\xe5\x9f\x2b\x0a\x98\xf2\x1f\x8f\xa7\xe0\x8c\xf7\x8f\x48\xbf\xef\x0d\x30\xe5\xdf\x5d\xca\x60\xca\x4f\x87\xd7\xe0\x8c\x7f\xeb\x81\x29\xff\xf2\xe5\x00\x98\x88\x9f\x81\x29\x6f\x9f\xdc\x80\x33\x7e\xf8\x2b\x98\xf2\x01\x7e\x0b\xce\xf8\x77\x63\x70\xc6\xbf\x0c\xc1\x94\x3f\xfd\xd0\x07\x16\xe2\x09\x7c\x23\xe3\x13\x98\xf2\x9f\x8e\x9e\x5d\x80\x08\xdf\x79\x64\x36\x2c\x9f\x39\xe0\x9d\x5f\xfa\x57\x89\x0e\x79\xf0\xd7\xc1\xe4\xf5\xf4\xaf\x17\xf7\xcb\xc4\x27\xa1\x1b\x22\xcf\x24\x08\x38\xf4\x90\x83\xbb\xb2\xf4\xd7\x35\x9f\xbb\x7a\x36\xb5\xc4\xe8\x23\x3e\x30\x3d\xf7\xca\xef\x5a\xc8\xc7\x28\x4c\x1a\xa4\x09\x62\x9a\xda\x90\x63\x75\x74\x6d\xda\xc1\x6d\x57\x60\x78\xa8\x84\x68\xc1\x08\x8c\xc0\xdc\x98\x61\xe7\xe0\x80\x6a\x8d\xa4\x8b\xcc\x8f\xf5\x20\x6f\x70\x60\x05\x5e\x10\x72\x87\xf3\x20\xb4\x51\x78\x40\xa7\xd7\x8d\x02\xcf\xb5\x0f\x71\x68\xfa\x11\xe1\xb8\x5d\xfa\x97\x67\x62\xf4\xae\x73\xc0\xc3\x10\x2d\xb8\xf8\x63\x3c\xc5\xb8\x29\xc3\x8b\x11\x83\xcc\x08\x81\xac\x5d\x56\x94\xf6\x4e\xc7\xea\xfe\x0f\xd4\x8c\xb9\x2d\x95\x0b\x37\x80\x9a\xd7\x02\x4c\xd2\x96\x5b\xf3\xd7\xe6\x41\x6a\x36\x6d\x42\x49\xe2\x3b\xda\x75\x7d\xcf\xf5\x51\xec\x99\xbb\xe6\x43\xe4\x84\x28\xba\x3e\x98\xe3\xc6\x55\xb3\x56\x61\x14\x84\xdd\x65\xe0\x12\xc4\x1f\x2e\xcc\xf0\xca\xf5\xa9\x43\x49\x17\x0a\xcb\x8f\x87\x0f\xe9\x94\x61\x98\xac\x06\x95\x88\x8d\xe4\x62\xda\xb6\xeb\x5f\x75\x95\xe5\xc7\xc3\x3a\xe9\xe0\x60\xd9\x15\x97\x1f\xd7\x54\xbc\x1c\xe0\xbb\x25\xca\xcf\x12\x4d\xbd\x2d\xcc\x8f\x07\xb7\xae\x8d\xaf\xbb\x8a\xf0\xd7\x62\xab\x98\x86\x76\x45\xd7\x61\xde\x8f\x28\x0a\xcb\x8f\x6b\xd2\xf0\x3a\x88\x8a\x53\x63\x98\xc2\x49\x8a\x69\x38\x55\x15\x80\x91\x04\xd2\x09\x9f\x78\x46\x51\xad\xb3\x6f\xdf\x10\x2d\xb3\x91\xa8\x53\x90\xfc\xc0\x47\x6b\xf6\x62\xcd\x01\xb4\xe6\x3a\xdc\x21\xf5\xb0\x62\x86\xf8\x3e\x76\x81\x62\x22\xd3\x41\x49\x5e\xa6\x42\xee\x9d\xcf\x9f\x59\x76\xbd\x8e\x73\xb2\xcd\x70\xef\x9e\x26\xd6\x49\xf2\x4e\x45\xdd\xf3\x7b\xdf\x5c\xa0\xee\x8c\x3f\x9d\x0e\xe2\x1c\x59\xcb\xd0\x5d\x98\xe1\x5d\xe2\xfe\xdc\x7d\x22\xac\x41\xb1\xce\x78\xf8\xf6\x72\x30\x3a\x3a\x06\x74\x09\xbb\xec\xe9\x74\xc0\x90\xdf\x6c\xb9\x5a\x9a\x43\xa8\xb9\x2e\xb0\x83\x71\x80\xfb\x2b\x1c\x1c\xa3\x08\x07\x21\xaa\x0d\x93\xb5\x1f\x1d\x15\x5b\x8f\x8e\x58\x90\x3c\x42\x8b\x7e\x31\xad\xf7\xc8\xa7\x89\x81\xea\x50\x4e\xc6\x97\xf4\xa5\xc4\x78\x78\x72\xf9\xac\x3f\x18\x8d\x9f\x03\x1b\x39\xe6\xca\xc3\x71\xc2\xc3\x27\x10\xb8\xd1\x2f\x41\xe0\x21\xd3\xef\x3e\x11\xd2\x31\x4e\x5e\x8c\x66\xcc\x68\xc6\x8c\x27\x27\x4c\x7f\xcc\xa4\x5d\x30\x71\x17\xcc\xe9\x74\xc0\xae\x2f\xd6\x87\xa9\x8d\x94\xb9\xc2\x65\x07\x05\x72\x3a\x17\x80\x9a\xfb\x20\xb4\xde\x74\x64\xf6\x03\x11\xb0\xd1\xd2\xf4\xd9\xda\x89\x9b\x5b\x67\xc3\x0c\x92\x61\x5c\xa7\x93\x8e\x74\xe7\x7f\xec\x08\x85\x51\xd2\x43\x77\x7c\x85\x42\x2d\xdc\xc5\x1e\xe9\x39\x94\x9e\x3f\xf3\xc4\xec\x98\xff\x8b\xbb\x58\x7a\xae\xe5\xe2\xc3\xaa\x30\x4b\xdc\xb3\x11\xef\x96\x25\x5d\x2a\x9c\xc9\x07\x2a\x7f\xd7\x39\x94\x93\x46\x64\x40\xe9\xb1\xb1\x31\x6a\x1e\xe7\xb1\xb0\xee\x21\xcc\x38\xb8\xd7\xe9\x70\xbd\xbf\xdf\xc7\x7b\x0c\x31\xe8\x23\x46\xbe\x1d\x31\x03\x7e\x14\xe3\x2f\x5c\x59\x38\x08\xc9\x46\xa3\x79\xbc\xd3\xd4\x6e\xb5\x9c\xe3\xbd\x24\x4b\x55\x4a\x7d\x4b\xeb\x85\x19\x0d\xae\x4d\xff\x0a\xd9\xbd\x27\x49\x4a\xea\xf4\x95\xea\xe9\xd2\xca\x93\x12\x7b\x81\x49\x58\xe1\xb0\xf8\x2d\x6d\x90\xf7\xd6\xb7\xed\x10\x45\x51\x8f\x85\x02\x4f\xff\xff\x13\x54\xd9\xb5\x8f\x6e\x93\x7c\x5f\xa3\x74\xb0\x34\x87\x72\xc2\x18\x9e\x74\x9e\xa0\x34\x87\xae\xb5\x0a\x93\xda\xdc\xd3\xa7\xe8\x49\x92\xaf\x3b\x2f\x4d\xba\x1b\xd9\xbb\x77\x36\xb2\xeb\x5d\x8d\xec\x75\xe0\x27\x5d\xc6\xfd\x24\x99\x80\xe3\xe4\xde\xed\x20\xe7\x95\x72\x98\x7a\x08\x94\xb3\x95\x15\x2a\x79\xc8\x0c\xc7\xb4\xbb\xc4\xe7\x28\x4a\x97\xa7\x88\x68\xae\x9c\x2f\xb5\xf8\x89\x5f\x98\xcb\x38\x01\xa5\x6b\x73\x59\x06\x7e\xc2\xa8\xe2\x0c\x78\x75\x1e\x35\xc3\x00\x71\xeb\x34\x83\x66\x61\xcd\x0a\x39\xea\xb9\x35\xf2\xe8\x23\xa6\x14\xc6\x42\xb5\x2a\xa0\x11\xc2\xf1\x0c\x8a\xed\x0f\x2d\xfe\x8c\xe6\x46\x45\xfe\x15\x0a\xe3\x53\x43\x74\x9d\xa4\x25\x9b\xf0\xaf\xf8\xfe\xdb\xd9\x65\xca\xc8\x2f\x07\x2f\xfa\xe3\xe7\xc3\x23\xb0\x34\xef\x08\x29\x75\xef\x93\x1c\x6f\x5d\xb4\x4e\x93\x0b\xe2\x98\xc9\xcf\x30\x5a\x1e\xe5\x79\x9d\x92\xb5\xe1\xd6\xeb\x46\x4c\xde\xe7\x13\xa0\xd8\xa0\xe9\x3f\x69\x7a\xb6\xb2\x84\x48\x92\x75\x37\x4e\xb2\x8c\xfa\xec\x90\x4b\x34\xfe\x3a\x72\xb9\x34\x09\xed\xc6\x7a\x74\xc8\x43\x44\x30\x17\xd3\x0d\xcb\x72\x00\xc5\x70\x16\x91\x08\x50\x9a\x57\x9f\xd4\xea\xfb\x36\xfd\xe8\xe2\x3b\x82\xfa\x72\x6b\xdc\xd0\x1a\xb7\xb6\x5e\xfb\x57\x13\x7f\xe4\xbb\x38\xcb\xed\x9f\x17\x80\x62\x8a\x3b\x72\x0a\x4f\xd3\xdc\xd1\x57\x2d\xa4\xa0\x53\x9e\x21\xd8\x9c\xea\x6e\x86\x93\x15\xac\x1c\xf0\x7a\x64\x9c\x54\xc2\xbf\xc1\xae\xe7\x62\x17\xe5\xb9\xdc\x69\xa5\xd7\xe6\xb2\x93\xb5\xa7\x44\x7d\x14\x73\x93\xb8\x8b\xfc\x5b\x88\xae\x5c\x72\x8e\x49\x3e\x3f\x73\x3d\x34\x4a\x32\x0e\xbc\x30\x7d\xdb\x43\x61\x0c\x34\xba\x41\x7e\xe9\x2b\xd8\xde\x05\x3d\xce\x6d\xea\x85\x56\xa8\xf4\x32\xf1\x29\xd6\x13\xfa\x2c\xe8\x2c\xb4\x56\x85\xb7\xf0\x73\xd7\xb7\x69\xd7\x1c\x07\xce\x1b\x88\xa5\x31\x91\x67\xd3\x40\x28\x4e\x57\xbc\x65\xef\x8d\x87\x27\x6f\x27\xc7\x2f\x2f\x67\x27\xc3\xe9\xe5\xf3\xe1\xc9\xe5\x78\x72\x39\x3d\x9e\xfc\xe3\xdd\xe5\x68\xfc\x6c\x92\xef\x42\xd7\x77\x82\x6e\x07\xfd\x8c\xfe\xc6\x02\x7a\xa1\xf7\x37\x16\xaa\x06\x2f\x2a\x72\xc6\xbd\x77\xdc\x9e\xdc\x3a\xa6\xab\x1c\xaa\x3c\xe5\x74\xca\x0d\x8e\x87\xcf\x47\x93\x71\xc6\x0b\xa8\x4c\x6b\x17\x39\xf5\x9c\xfb\x4d\x9b\x71\xa7\x9a\x31\x07\x00\xb5\xbc\xd8\x14\x62\x3b\x4f\xf4\x78\x4c\x51\x1e\x9a\xe4\x50\x8e\x96\xb3\x3c\x67\xf6\xb5\x1b\x81\x74\x16\x04\x9d\x59\xcf\xa7\xd3\xc1\x2c\x5d\xf1\x67\x08\x5b\xd7\xc8\xa6\x3c\xbb\xb8\xde\x5b\xc9\xa6\x49\x41\x4c\xfa\x1c\x07\x7e\x1a\x62\xfd\x99\x69\x11\x14\x4d\x07\x0d\x24\xb5\x75\x88\xa2\x78\x48\xba\x8e\xbf\x17\x38\x62\xb1\xc7\x75\xe0\x93\x95\x9e\x61\x93\xec\xa1\x8c\xcf\xd2\x97\xaf\x84\x8b\xb8\xa6\x97\x10\x78\x87\xd4\x2d\x4c\x9d\x88\xd1\xfa\xa2\xa2\x4d\x6a\xc4\x7a\xd3\x3c\x69\x06\xf7\x1d\x44\x4d\x7f\x74\xfc\xbc\x3f\x9d\x0e\x8f\xa8\xd0\x89\x69\x2c\x23\xf4\x27\x42\xaf\xd7\x43\x6b\x6e\xdd\x3c\x83\x4c\x02\xe4\x12\xfc\xb0\x95\xc9\x93\x4d\xce\xe5\xbc\x19\x71\xeb\x46\xf9\x78\xbf\x49\xd3\x5a\xb7\xcb\xe5\x3a\xf2\x92\xcc\xeb\x7f\x17\x92\xbc\xfe\xdb\x24\x54\x02\x5b\xda\x63\x2d\x99\x6f\xc3\xd2\x27\xba\xcf\x93\x82\xf2\xd3\xa0\x60\x71\xb1\x82\x75\x58\x52\xa3\x7a\xe8\xb0\x94\xe8\xbb\x04\x79\x7c\xe1\xd6\xc1\xbd\xbf\xe3\x38\x65\xf6\xe6\x84\xec\x4d\xc7\x35\xfc\xf4\x29\xce\x30\xf0\x33\x3e\x17\x2e\x68\x22\x6e\x6a\x7d\xd8\x85\x2e\xc8\x76\x8d\x73\x09\xcf\x4a\xda\xc7\xc8\x8e\x75\x8f\x5d\xd5\x98\x84\x6b\xed\xc8\x0e\xed\x3b\xdf\x5c\xb8\x56\xe1\x53\x55\xcf\x48\xc5\x60\x91\x61\x51\xd2\x2a\x64\xb9\xaf\x55\x28\xa3\xe6\x89\xc0\x01\x77\x87\xca\xa3\x23\x52\x35\x4f\xc3\x5a\xd4\x54\x9f\x3e\x75\x9f\x3e\xc5\x3f\x93\x03\x6d\x97\x61\xff\xe6\xfe\x8d\xa5\xa7\x62\xf2\x37\xee\xc6\x55\xc7\xc3\xb7\xc9\xf7\x31\xba\x65\xbb\xec\x6c\x89\x2c\xd7\xb9\xa3\xc9\x26\xd2\xf4\xad\xf4\x61\x40\xff\xed\x8c\x5d\x53\x21\xfe\x26\xd1\x2e\x52\x72\x2e\x15\x3e\x0b\x83\x45\x9a\x6b\xba\x51\xf6\x97\x12\xf3\xce\xf0\xf7\x25\xd2\xdd\x2f\x79\xee\xcd\xd2\xda\x96\x33\x57\xd2\xe2\x94\xb9\xea\xe6\x8c\xb9\x8d\x59\x6f\x6f\x96\x56\xfc\x84\xe2\x36\xfa\xf6\xe5\x2b\x94\x64\x4d\x15\x44\x43\x97\x14\x0b\x3a\xaa\xa2\x38\xb2\xac\x22\xc9\x91\xa1\x23\x2b\x73\x4d\x15\x0d\xc7\x96\xe6\xa6\x4c\x63\xde\x6b\xba\x20\x0a\x2a\x54\x45\x43\xd7\x54\x55\x35\xe4\x2e\x5d\x80\x04\xef\xd5\x4c\xb6\x59\xa8\x21\x32\x62\x16\xdb\x50\x93\x45\xdb\x90\x65\xd3\xb6\x25\x45\x73\x24\x09\xce\x1d\x08\x25\x09\xd9\x8e\x60\x49\x32\x92\xc5\xb9\xe2\x28\x82\xfe\xed\xcb\x57\x45\x86\x8a\x2a\xcb\x82\xa2\x28\xba\xae\x49\x9a\xb4\x67\x00\x88\xdd\xe3\x3f\xc0\x5d\xe3\x3f\xc0\x1d\xe3\x3f\xc0\x1f\x1d\xff\x21\x7e\x66\xc2\x98\x7e\x1e\xd0\x89\xae\x44\x18\x2c\x7e\x48\xe6\x2b\xf8\xa0\xb0\x0f\xdb\xa3\x3e\xb8\xad\x04\x43\x18\xec\xb7\x2f\x5f\x4d\x67\x2e\x68\x8a\x01\x6d\xc1\x10\x4c\xa4\xcf\x0d\xc9\x80\x82\x3e\x37\x44\x51\x9e\xab\xfa\x5c\x72\x34\x09\x69\xba\x44\xe8\x53\x37\x34\x43\xd3\x45\x4d\xd2\x25\xc5\x50\x34\x4d\x17\xf6\x0c\x6d\xdb\x9a\x3b\xa1\x21\x62\xc8\xae\x29\xd6\xc4\x1d\x53\xac\x89\x3f\x3a\xc5\xda\x31\x32\xed\x83\xc0\xf7\xee\xe2\xac\x23\xe9\xd5\xe3\xe6\x94\xf3\x45\xe2\x7a\x94\xe8\x21\x0f\x4a\xa0\xd6\x9a\xa9\x22\xa7\xa3\x52\x5e\x68\xf3\x36\xa2\x24\xe4\xd3\xc8\x03\xb1\x46\xc7\x38\x54\xa5\x23\x6c\xcc\x91\xe7\xb6\x08\x35\x43\xb3\x0d\x43\x31\xe6\x12\x32\x0d\x05\xaa\x96\xa8\xdb\xa6\x35\x37\x2d\xdd\x72\xcc\xb9\x61\xa3\x6f\x5f\xbe\xaa\x50\x94\x15\xdd\x30\x44\xc1\x90\x69\x62\x1d\xa8\x26\xc9\x64\xdc\x88\x26\x31\x34\x6b\x03\x24\xb9\xee\xd3\x15\xd9\x23\xbe\xff\xce\xe1\xfd\x77\x8d\xee\xff\xc3\x83\xfb\x4f\x4b\x81\xc4\x46\x47\x11\x13\x5d\x07\x2b\xcf\xf6\xff\x1f\x1a\x81\x2c\x49\x63\x93\x64\xab\xf6\xef\x9a\xd6\xe3\xb1\x08\xeb\x61\xe1\xff\x77\x88\xfe\xdf\x10\x96\xa6\x29\xbe\x8c\x04\xd8\x9a\x37\xd2\xc6\x40\x2c\x3b\x84\xb1\xc0\x7f\xb2\xb8\x2c\x2d\xcf\x1b\x0b\xca\xf6\xa8\x39\x64\x43\xb9\xc6\x77\x46\x1a\x68\x0d\xee\xe1\xee\x10\x78\xa3\x00\xc9\xc0\xb5\xc3\x5a\xf4\x0d\xfa\x6c\x3d\x7e\x81\x61\xbb\x51\x12\x5d\x42\x02\x6c\x88\x4c\x9b\xf0\xce\xe2\xeb\xf7\x1d\x02\x42\xf8\x0d\x27\xca\x46\xb8\x5a\x2a\x6e\x09\x08\xb1\x9d\x13\xd1\x08\x30\x0f\x7b\x4d\xff\x90\xc7\xa7\x89\xa9\xe1\x5a\x4e\x1e\x9d\xce\x8e\x6e\x3a\x22\x10\xab\xfe\x86\x52\xec\x0e\x4f\x74\xdc\x03\xd2\xfa\xc0\x2f\xee\x1a\x90\xb9\xa5\xef\xf4\x18\x75\xa3\xaf\xa8\x56\xf5\x14\xd5\x41\xf6\x5c\xc6\x68\x73\x79\x2f\xfa\x88\x16\x1c\xde\xc1\x15\xde\xe0\x51\xbd\x83\x43\x75\xee\x1f\x6a\x64\x83\x49\x05\x43\x55\xfe\x7e\x57\x06\x03\xdc\xe4\x1c\x1a\x7b\x60\x95\x5d\x37\x37\xfb\x86\xaa\x1b\x5d\x43\x35\xc0\x96\x62\x5c\x96\x74\xc9\x42\x78\xcb\x8d\x8e\xf2\xe9\x0b\xd8\xf2\xca\xc0\x2d\xcf\x99\xc4\xfc\x39\x13\xcc\x5e\x25\x88\xb0\xf0\x76\x51\x6c\x79\xce\x24\x4a\x8d\x0b\x24\xca\x60\xf2\xe0\x05\xaa\x3c\x6d\x85\xd9\x7b\x32\xb1\xfd\x31\xd3\x26\x7c\x88\x5a\x95\x74\xc5\x1a\x86\x44\x63\xeb\xdb\x0d\xa9\xfa\x8a\xa9\xfa\x42\x42\x82\x39\xcc\xf9\xd3\x52\xb1\x01\xb5\x92\x54\x78\xb0\xdc\xe6\xa8\x5e\xf6\x53\xcf\x50\x2b\xa9\x60\xf4\x60\xd4\xee\xf4\xef\x5e\x8e\xc0\xb9\x3f\x56\x5d\xe4\x6e\xf2\x0a\xde\xe0\x12\x58\x92\x50\x99\xe7\xe3\x46\x87\xbe\x92\xe5\x2c\xb5\x08\x0b\x3b\x0d\x41\x44\x4f\x3a\x88\x08\xeb\x8e\x53\x99\xb4\x01\x4f\x84\x2d\xbe\x52\xd7\x99\xaf\x52\xd1\x4b\x2a\xf6\x9b\xca\x7d\xa5\x4a\x7e\x4c\x89\x97\x54\xee\xd0\x54\xf2\x94\x3a\xfd\xd0\x4f\xfc\xa5\x12\xd7\xaa\x8f\xc7\xd3\x36\x4f\xa9\xba\xe3\x53\xba\xe1\xcf\xd3\x29\x5c\x34\x3b\x25\x51\xc7\x9d\x79\x80\x71\xb0\xe8\xc2\xe5\x47\x86\xba\x15\x31\xff\x63\x18\x46\xd1\x9f\xe3\xc6\x0c\x99\x33\xdc\x73\x3b\xa2\x28\x48\x0a\x07\xae\xe9\xdf\x06\x92\x38\x30\x27\x7f\x4a\x8a\x42\x08\x7c\x4a\xfe\x96\x45\x91\xb0\x8e\x05\x2d\x37\x04\x4d\xe1\xc0\x31\xf9\x1b\x6a\xb2\xa4\x73\xe0\x15\xf9\x5b\x83\x12\x59\xa1\x1b\xf2\xb7\x21\x4b\x8a\xc4\x81\xe7\xb4\x4b\x55\x50\x34\x0e\x9c\xc6\x7d\x4a\x86\xc8\xe5\x0e\x0d\x77\x25\x4f\x83\xfc\xfe\x6c\xc4\x0f\x97\xcf\x3a\xdc\x61\xdd\xf1\x20\xdd\x8f\x62\xc2\xcb\xe2\xb7\xe4\xf4\x52\xae\xf0\x98\x3c\xbf\x31\x1a\xf1\x83\x17\xaf\x3b\xd4\x71\x35\xf8\x78\xdb\xe1\xf8\xc0\x8f\x2d\x3e\xcf\x5c\x0f\xcd\x92\x93\x58\x07\xc7\x8f\xcc\x4b\xef\xbd\xf3\x08\x3c\x31\xc3\x6a\x79\xb5\x9e\x0e\x90\xdd\x91\x8e\xf8\xd7\xfd\xa8\x23\x66\xb7\x71\xd5\x81\x7f\xa1\xbd\xd2\xf7\xed\x1d\xee\xe9\x53\xcc\x5b\xf1\x9f\xeb\x54\xa6\xcb\x09\xb7\x29\x39\x53\x14\x1c\x1f\x8e\xf6\x46\x5a\x3a\x91\x38\x78\xc0\xe6\xe7\xf7\x15\x84\x89\x1c\x8f\x3e\x12\xb0\x07\xc5\x40\x98\x05\x68\xc5\xca\xab\xec\x2a\xb4\x1f\x76\x87\x96\x8a\xdc\x58\x7b\xa1\x61\x37\xb3\xd8\x5d\x7a\xc1\x8f\x82\x7c\xa5\x4c\xa8\xa2\xd7\x14\xf8\x6f\xfa\x74\x4c\xab\xaa\x3a\x50\x2f\xe8\x3a\xd9\xea\x1a\x7b\x23\x85\xe3\xe3\x54\xa4\x09\x1a\x88\xb4\xaf\x45\x17\xd0\x0a\x68\x17\x1e\x30\x42\x88\x6e\x5c\x74\x5b\xc6\xfa\x13\x98\xe3\x5d\x4f\x42\x44\x14\x9f\x8c\x18\xe0\x28\x91\x24\x65\xcd\xa6\x31\xa8\x41\xbc\x50\xae\xd3\x11\xcb\xcb\x42\x87\xaf\x79\xe8\xc4\xb6\x61\x16\xa0\x82\x95\xb8\xce\x5b\x1b\x44\x06\x6a\x17\x19\x39\xe7\xcf\x8f\x03\x88\x4f\xfe\x3e\xa2\x18\x8e\x37\x4b\x83\x4f\x50\xfc\x99\xba\x06\x6d\x7e\x84\x02\x58\x26\x71\x90\xcd\xdd\x77\xf3\x81\xab\xee\xbb\x0d\xde\xbb\x31\xf9\x1f\x38\x61\xb0\x48\xc9\x92\xe5\x52\x17\xb7\xbf\xe0\xfc\x9a\x3a\xf3\x4f\xb9\xbf\x76\x6d\xea\xf7\x00\x3e\xe2\xde\xf9\xbd\xf9\xa9\x3b\xe3\xc7\x93\xa3\xe1\x6c\x78\x42\x6f\xeb\xfb\x67\x97\x10\x54\x7d\xa3\x2b\x75\x4e\xa7\x83\xcb\xe9\xf1\xe8\xb4\x7f\x32\x4c\x8c\x1b\x49\x9b\x82\xef\x76\x53\x93\x37\xbf\xbc\x1a\x0d\xf2\x16\xcd\x71\x7a\xba\x18\xf1\x0e\xff\x76\x72\xfc\x72\x78\x7c\x49\xba\xb8\x1c\x8d\x67\x27\xfd\xf1\x60\x48\x0d\x14\x6b\xd0\x08\xb3\xf8\x00\x98\xc5\xbd\x61\x16\xdb\x60\x2e\x37\x8c\x81\xa7\x9e\x27\x62\x0b\xbc\xd2\x03\xe0\x95\xf6\x86\x57\xda\x1b\x5e\x69\x7d\x01\x9e\x11\xc2\x58\x9a\xf8\xba\xcb\xb2\xc0\x0a\x16\xcb\xc0\x47\x3e\xee\x36\x7b\x81\x9d\x61\xfe\xac\xec\x06\x16\x1b\x20\x40\x00\x7c\xe0\xa5\x2e\x61\x08\x78\xc0\x07\x38\x73\x3d\x22\x54\x9b\x7a\x85\xb9\x71\xa1\xbb\x28\x16\x86\x71\xa1\xb9\x74\x07\x9e\x8b\x7c\xdc\x0b\xd6\xd1\x6a\xb9\xf4\xee\x8a\xce\x15\xc3\x1b\xe4\xe3\x9c\x4d\xa5\xf6\xb2\xc1\x64\xfc\x6c\xf4\xfc\xf2\xd9\xe8\xd5\xf0\x72\xf4\x7a\x3a\x39\x3e\x19\x1e\xd5\x5a\x53\xa7\x8a\x9d\x3b\xb8\x1c\x1e\x1f\x4f\x8e\x93\x4e\xde\x66\x4c\x26\x6b\xca\xf6\xdf\xce\xe2\x62\x36\xa9\x44\x4d\x73\xb1\x0d\x2a\xae\x72\x4e\x27\xd4\xbf\x8d\xa6\xf1\xe5\x58\xf8\x2c\x08\x17\x20\x2d\x3c\x5d\x5a\xa5\xdf\x64\xc5\x66\xb1\x75\x2b\x2f\x7f\x8d\xb0\x69\x27\x5e\x33\x79\x4d\x84\xc9\x22\xe7\x65\xa3\x24\x99\x75\xa9\xd6\x24\x1a\x2d\xcc\x2b\x94\x97\x0d\x90\xbb\x24\xbf\x2e\x36\xfa\xea\x94\x2c\xfb\x69\xf2\xea\xcc\x31\x2b\xf5\x50\x38\x09\xaa\x9f\x88\xe6\xce\x2f\xcc\xf0\x7d\x3f\x3a\x72\xc3\xd8\xa1\x88\xda\x2d\x09\xe7\x4b\x1d\x7e\x22\x84\x29\x27\xec\xe4\x9f\xfe\xc6\x52\x33\x1e\xb7\xbe\x42\x78\x1a\x9b\x4b\x0b\x96\xcb\x7b\xf3\x36\xea\xc7\x96\x8d\xa9\x19\x9a\x8b\xa8\x7b\xbf\x5e\x1f\xbe\xc9\x9c\x57\x70\xef\xef\xf7\x88\xaf\x56\x3a\xc7\x17\x4d\x56\xca\x21\x3f\x3d\x9e\x9c\x8e\x8e\x86\xc7\x80\x6a\x58\x88\xba\x07\xcc\x4d\x8f\x6c\x92\x70\x66\x5d\xa3\x05\x8a\x6f\x66\x4c\x2f\x6b\x9f\xb8\xc9\x96\xba\x39\x9d\x0e\x40\xab\x27\x05\xe9\x37\x7f\xd6\xd5\x0c\x47\x61\x2b\x82\xf2\xc6\x9c\xcd\x5e\x5c\xbe\x1c\xbe\x4b\x5e\xab\xa1\xc6\xf7\x4b\xf4\x41\xfb\xbe\x1d\x0f\x8e\x87\x84\xb1\xd0\x0c\xf4\x97\x59\x0a\x7a\xee\xf3\xe7\x27\x30\x17\x5a\xbb\x41\x4c\xd9\x75\xf9\x59\x1d\xe2\x93\x43\xf3\xd4\x33\x7d\xf4\xcc\x33\x6f\x82\x30\xeb\x68\x86\x83\x10\xd9\x85\x77\x21\xe5\xfe\xaa\xad\xc7\xc9\x53\xc5\xed\x80\x34\x8e\xda\xeb\xfd\x83\x3f\xfb\x44\x96\xfa\xe8\x67\x0a\x69\x49\x98\x5c\x92\xf2\x6e\x43\xf9\xd1\xf0\x94\x00\x52\x7f\xdb\xb6\x91\x12\xda\xf1\xfd\x4b\x7f\x46\x43\xfa\xbf\x98\xcc\x4e\x2e\x87\xe3\xfe\x2f\xaf\x86\x47\x5c\xd9\x73\x61\x2b\x8e\x5f\xf7\x07\x2f\x46\xe3\xe1\xe5\x8b\x61\xff\xd5\xc9\x8b\xcb\xc1\x8b\xe1\xe0\xe5\x2c\xef\x2c\x33\x52\xd7\x1f\xf6\xa5\xb0\x53\x3f\x14\x0c\x10\x7f\xb3\xb4\x7a\xf7\xd4\x8f\xa1\x71\xe8\x9c\xa2\xcb\x3e\x4c\x44\xfe\x8c\x8e\x76\x6e\x33\x3a\xe2\x80\xf9\x29\xca\xea\xf7\xd3\x37\x4f\x51\x07\x51\xbb\x78\xfd\xcd\xdf\xce\xe8\xa5\x18\x89\xe7\x7e\xd9\x7f\x73\x34\x3a\xb9\x7c\x35\x79\xfe\x9c\xd2\x4f\x2c\x4d\x7c\x37\x65\x20\x6f\x5d\x7c\x3d\x08\x16\x8b\xc0\x27\xe3\x02\xb4\x8e\x10\x7e\x16\x06\x8b\x94\xbf\xc4\xce\x27\x37\x81\x6b\x33\xc2\x93\x5e\xaf\xfa\xb3\xc6\x4f\x38\x27\x08\x3b\xc9\xd2\x31\x81\xc3\x4c\xe6\xff\x44\x16\xe6\xdf\xa3\xbb\xa8\xd3\x50\x9b\xcb\x1d\x0c\x62\x1f\xd1\xf8\x59\x42\x91\xfd\x80\x46\xa6\x95\xfa\xaa\xd4\x5b\xee\xc6\x30\x4a\x9c\xa7\xe8\xe7\x40\x3b\x4b\x10\xfc\x00\x2e\xb1\x89\x0f\xd5\x86\x69\x84\xb9\xc6\x32\xca\x3c\x27\xf7\xfb\xdd\xc2\x2b\x1a\xb7\x7c\x0b\xfb\xe9\xf5\x10\xe2\xdd\xf7\xfc\xd1\xf0\xf4\xe7\x9d\x61\xac\x31\x85\x16\xe6\xc4\x75\x37\x8e\x49\xb8\x4c\xe2\x3d\xb5\xff\xa8\xa4\x71\xdb\xb0\x0f\x59\xd4\x26\x56\xd4\xc8\xea\x76\xec\x7d\x3b\x6f\x02\x1b\x78\x52\x3b\xc1\x34\x32\x94\x98\x77\xfd\x4c\xff\xcb\xc7\xdc\x88\x7a\x27\xb7\x01\xba\x51\x36\x6f\x14\xf9\xfb\xcc\xbe\x89\x0f\x35\xb2\xb7\x62\xa7\x44\xe3\x23\xfd\x12\xa6\x71\xb3\xb4\xda\x10\xc1\x06\xb9\xe6\xc6\x82\xf4\x17\x39\x5a\x06\x11\xef\x17\x76\x8b\x79\x83\x62\x2e\x17\xf7\x5a\xe6\x70\x25\xa7\xeb\x54\xff\x8a\xbd\xb7\x63\xb5\xf5\xc4\x5d\xa0\x08\x9b\x8b\x65\xa7\xe2\x6d\xcd\xad\xd7\x55\x70\xb9\x7b\xf4\xf4\x69\x0c\xf5\xe8\xe8\xe7\xce\xf6\x05\xa4\x8e\xc9\x85\xe7\x09\xfb\xac\x39\x75\x35\x43\xd4\xe9\x6e\x97\x76\xc9\xf9\x87\x9e\x1b\x69\xd3\x06\xf2\x68\x6a\x96\x9c\xb4\xf6\x6d\x57\x23\xcd\xd1\x11\xc7\x75\x77\x47\xc9\x78\xf8\x76\x97\x61\xb2\x97\x66\x09\x22\x2a\x74\x14\x4b\x54\x6e\x5d\xfe\x4d\xc4\x18\x7a\xfa\x14\xf1\xe6\xa7\x28\xf9\x27\xf3\x64\x4c\x75\x6a\xdc\xa3\xe5\xc0\xed\xa5\x5e\x8e\x87\x44\xba\x51\x47\xb2\x9e\x70\x88\xfe\xd7\x3d\x44\x7f\xfb\x5b\x41\x84\xf5\x3f\x11\xe6\x93\x50\x02\x3e\x47\x17\xe0\x23\xf9\x6f\x4a\x25\xa5\xcf\xf4\x6a\x6d\x27\xae\xc7\x9b\x9f\x00\x4a\xa8\x99\x50\xaa\xb9\x5c\x16\x09\xd5\x8d\x5e\x07\x36\x4a\xc4\xc0\x2c\x7b\xb0\xdc\xe1\x3e\x7f\xde\xad\xfb\xe6\x53\x30\x40\x85\x0f\x8d\xfc\xb4\xa5\xbb\xca\x31\x1c\x0c\x31\x5f\x7c\x70\x58\x7a\xc3\x4e\x08\x62\x8f\x6e\x8b\x37\x02\xf5\x7e\x8b\x5f\x49\xc7\xe4\x98\xd4\xff\x44\xfb\xa4\x67\x4d\x8a\xf1\xe4\x9e\x87\x3e\x01\xdc\x41\x69\x36\x3f\x71\xa0\x8c\x86\xee\x3e\x4b\xf0\x33\xde\x65\x90\xe6\x05\xe0\x40\x8c\x29\x52\x3e\xd8\x41\x1b\xa5\x0e\xaa\x99\x53\xe8\x96\xca\x55\x4e\xc0\x75\x59\x16\x24\x18\xfc\x31\x03\x56\x79\x48\x3c\x62\x89\x16\x76\x1f\x30\xe5\x2c\xcd\xa3\x96\xb1\x5b\xa1\xc7\xe2\x4c\x7f\xfc\xc0\xc5\x71\xc8\xc8\xeb\x75\x55\xd5\xcf\x78\xcd\x79\x76\x12\x28\xd0\xec\x47\x7c\x2e\x5c\xb4\x29\x38\x17\xe9\xb1\x66\xcf\xf3\x6d\xff\xec\x52\xa4\xf6\x8b\xe5\x2a\xba\xee\xb4\x0c\x0b\x5b\x87\x4d\x76\xec\x5e\xe3\x49\x5b\xc7\x13\x37\x8d\xb7\x8e\x75\xea\x63\x9a\xed\xd3\xf4\x92\x9d\x56\x78\xbd\x5c\xbe\x0f\x4b\x54\xf0\xfe\xdb\x59\xbd\x05\x59\x80\xd7\x83\xd2\xfd\xd4\x76\xfc\xd5\x8f\xf1\xa4\x9b\x21\xbd\xe5\x1b\x78\xee\x60\x61\x47\x7b\xf4\xb6\xd3\x6d\xc3\xcf\xe7\xf7\x6e\x34\x0d\x91\xe3\x7e\x9c\x38\x71\x8a\x93\xc1\xc2\xee\x3e\x11\x80\xb5\x20\x3c\xb2\xfb\x3b\x36\xfd\x4f\x2b\xe6\x2f\xf7\xe9\x78\x83\xfc\x36\x9d\x70\x9e\xa6\xd2\xee\x3f\xf8\xb7\x0b\xfe\x75\x76\x55\xbe\x4e\xef\xca\x99\x25\x0a\x17\x6e\x14\xb9\x81\x1f\x31\xe6\x6d\xc4\x44\x08\xff\xbe\xbe\xe8\x9e\x5f\xac\x69\x1f\x6e\x91\x52\xfd\xff\x8f\xb7\x6b\xdd\x6d\x1b\xc7\xc2\xaf\xc2\x08\xb3\x80\x8c\xd2\x84\x24\x4b\xb2\xe5\x20\xbb\x9b\xb6\x69\x27\x33\x9d\x26\x88\x9b\x06\x3b\x83\x60\x46\x17\x2a\xd6\x54\x91\x5c\x89\x4e\xd3\x38\x7a\x87\xbe\x41\xdf\xad\x4f\xb2\xe0\x4d\xa2\x2e\x76\x92\xa2\xbb\xf0\x1f\xdb\xa4\xc4\x8f\x47\xbc\x89\xfc\xbe\x73\xf0\x27\xf0\x2b\xfa\x00\x93\x83\x0d\x0f\xb2\x76\xea\x93\xe5\x1c\x43\x65\x3b\x7f\x3e\x58\x3c\x54\xde\x63\xea\x1c\xf2\x61\x40\xac\x9a\xb3\x4e\xee\x18\xb9\xaa\xdb\x3c\x12\xc0\x92\x51\xe5\xaf\x56\xe9\xe7\x77\x1f\xae\xf8\x99\x8b\xbe\xad\x55\xf0\x6c\xbf\xbe\xe6\xd9\x5e\xe5\xc5\xe1\xc5\x42\xdf\xac\xf8\x66\x99\x2c\xaf\xde\x58\xab\x46\x95\x88\x0f\x8b\x8f\x6e\xe5\xb9\xe3\xd6\x7b\xf3\x5d\xdb\xa7\xdc\x3c\xa9\x0f\x33\x85\x20\x04\xab\x33\xd4\xde\x1e\x41\x49\x16\xa6\xeb\x08\x97\xba\x76\x78\xb1\xf8\x53\x1b\xdd\xdf\xeb\x2c\xe0\x88\x8e\x9f\x69\x35\xbf\x09\x30\x25\x31\xe3\x35\x77\x22\xde\x25\x29\xde\xd3\x46\x70\xcf\x54\xcb\x3a\x13\x55\x92\xaf\x8d\x0c\xdf\xf6\x8e\xc4\x2f\xdc\x56\xad\x0d\x2d\x43\x9c\x62\x97\x4c\xb2\xa1\x94\x74\x5a\xe4\x21\x2e\xcb\x4e\x41\x90\xc0\x44\xae\x7b\xda\x3b\x0d\x49\xbd\xa1\x5a\x62\xf2\x2e\x7f\x95\x14\x25\x59\x10\xbc\x92\xbb\xa3\xad\x2d\x70\x29\x06\xe1\xdb\xd5\x8b\x75\x48\x8b\x62\xf6\xab\x06\x4f\x6b\x39\xfb\xff\x60\xcf\x68\x0d\x99\x49\x79\x92\x29\xe5\xdc\xdf\xeb\xf8\x40\x1c\x14\xe9\x1a\xbf\x4b\x92\x5d\x81\x4f\x49\x9a\x82\xfc\x06\x17\x9f\x8a\x84\x60\x46\xd9\x8c\x7c\xe2\x83\xcf\xf9\x1a\x2c\xfd\x1b\x0c\x98\xd7\x11\x1c\x21\xc0\xea\x2c\x19\xc3\x1c\xf0\xbf\xb4\xd1\x08\xe2\x6a\xf0\xf0\x5a\xe9\x53\x1b\x26\x6b\x14\x15\x99\x8b\x1d\xe4\x2d\x5b\xfa\x90\x4b\x20\xfd\x24\x5d\x17\x78\x38\xaf\xba\x81\x0f\xe9\x53\x9a\x63\x44\xfc\xe2\x0a\x33\x47\x3b\xb8\xa4\xb3\x4a\xed\x1d\x69\xae\xd8\x57\x6d\x8f\x30\xe0\x9e\x13\xba\xe9\x83\x6d\x48\x51\xa8\xc1\x3c\x6b\x55\x64\x77\x9b\x68\x5f\xd8\xaa\xd5\x8e\x47\x2e\xf2\x55\xfb\x03\x19\xf9\x2f\x9d\x8c\x60\x5d\x69\x46\xde\x3b\xd0\x34\x3a\x9a\x81\xce\x31\x83\xde\x5e\x15\xaa\x7b\x4f\x09\x49\xf1\x5c\x3b\xf6\xfd\x05\x90\x57\x68\x30\x6a\x84\x43\x73\x4d\xda\x8a\xf1\xc3\x69\x27\x14\xec\xde\x42\xaa\x0c\x18\xcb\x57\x7b\xd6\xec\xe2\xc3\xc4\x9c\x65\xf3\x8d\x7a\x6f\x7a\x0d\xbd\xa4\x24\x78\xc5\x83\x9b\xb5\x0b\xe9\x67\x52\x92\xb5\x0a\x86\xa9\x7f\x77\x37\xbf\xab\x64\xed\x3a\xe7\x23\xbd\x0a\xb6\xa6\x36\x86\xe3\x6f\x94\x71\x74\x2f\xfc\x12\x4b\x75\xfc\xc0\xe1\xec\xe8\x59\x73\x28\x2b\x4a\x28\xdb\x60\xff\x92\x12\x24\x6a\x90\x02\x97\xf9\xba\x08\x71\x09\x68\x53\xa2\x7d\x89\xfe\xfb\xd3\x66\x7b\x01\x15\x10\x7f\xff\xf5\x3f\xb3\xd3\x9a\xd4\x86\x12\x07\x4b\x3d\x03\xd1\xa5\x9f\x28\x58\x11\xf2\x74\x4a\xdb\xa9\xb5\x6a\xa3\xbf\x59\x85\x5b\x41\xd7\x69\x43\x58\xe3\x06\xab\x72\x48\xd5\x5f\x6b\xa8\x89\xbf\x8c\xea\x76\xd0\x9c\x7e\x35\x97\xd0\x47\x1d\xe7\xc5\xf5\x45\x42\x96\x27\x37\xb8\x28\x12\x3a\xc5\xb0\x1b\xa9\xa7\x65\x9b\xc1\xba\xb2\xc0\xaa\xe2\xf9\x9f\xe6\x91\xf0\xe8\x32\xaa\x06\x4f\xbb\x36\x4f\x14\x1d\x4b\xf5\xf4\xa0\xea\x57\x88\xfa\xf4\x3f\x54\xf1\xe0\xc9\xe2\xcf\xe3\xdf\x0e\x5f\x1f\x2d\x2e\xe1\x86\x87\x82\x9f\x63\x24\x94\x84\xd5\x0e\x09\xf1\xe0\xcd\xda\xc2\x61\x35\xa5\xe7\x39\x6e\x71\xc9\x97\x07\xdd\xa3\xbf\x96\x8c\x70\x7f\x6b\xf1\xf2\x42\x7d\x7b\xf1\xfa\xe8\xe0\x9f\x58\x99\x88\xaf\x30\x79\x7f\xfa\xa2\xd4\x47\x50\xa3\x43\x1f\x8e\x00\xc9\x65\xfc\x7a\x0c\xd2\xa4\x64\xbb\xed\x2a\x51\xb5\xe4\xaa\x27\xa6\x5b\x61\x4f\x2f\xc1\x7c\x99\x20\xb6\xd2\x91\xb6\xc3\x40\x83\x08\xfb\x66\x18\x82\x79\x78\xb1\x50\xe3\xb0\xff\x9e\x67\xf8\x21\xd8\xbd\xb0\xf0\x3f\x1e\xbb\x94\x99\x92\x21\xbc\xc2\xbb\x1c\x9d\x31\x76\xc1\x64\x1d\x9d\x67\xfd\xe1\xf8\xd8\x7b\x31\x7d\xcf\xdc\x02\x51\xbe\x0d\x3d\x08\x92\x05\x86\x22\x34\xe7\x0f\xc7\x58\xf7\xb6\x61\x88\x27\x0b\x36\x06\x3d\x88\xf0\x64\x01\x12\x96\x71\x1b\x40\x8a\x06\x17\x48\x1b\x55\x83\x04\xb6\x76\x27\xeb\x73\x26\xc4\x2f\x5d\xac\x26\xfb\x4b\x78\xc8\x8f\xc2\x85\xbb\x2c\xee\xc3\x95\xd0\x0e\xfd\x9d\x5a\x56\x1f\xbd\xe2\x1c\xf5\x89\xab\xff\x8e\x3e\xae\xe5\xf7\x25\x41\xef\xe4\xf7\x80\xa0\xff\xc8\xef\xa7\x04\xa5\xa7\xf2\xc7\x35\x41\x2f\x6f\xe5\x8f\x63\xb4\x78\xfe\xf1\x29\xb2\xd8\x4f\xe5\x58\xf0\xbb\xb6\x8b\x62\x4d\x9b\x8b\x62\xbd\xef\x10\xc5\xf2\x9b\x03\x36\x8d\x7d\xfb\xf2\xd5\xb3\x4d\x3f\xb6\x3c\x3c\x0b\x3d\x73\x36\x75\xe2\x28\x70\x6d\xdb\xb5\x5c\x23\x0a\x66\xb3\xc8\x9d\x06\x51\x10\x19\x71\x10\x7e\xfb\xf2\x75\xea\x9a\xa6\x6b\x4e\x1d\xd7\x31\x2c\xc7\x36\x3d\x77\x66\x29\xf2\x29\x77\x40\x3c\xf5\xf2\xf8\xbd\x2a\x42\x72\x07\x34\x48\x34\x8b\x24\x90\x3d\xac\x60\x94\x0b\x95\x3c\x03\x87\xd7\xfe\x5d\x9e\x81\x0b\x1c\x00\x39\x5a\x77\x65\xb9\x7c\xd5\xd8\x79\x89\xe2\x44\xc0\x6f\x5f\xbe\x1a\x51\x38\xb3\x0d\xdf\x34\x3c\x23\x9a\xb8\x41\xe4\x04\x91\x87\x63\xd3\x75\x1c\xd3\xf4\x6c\x0f\xdb\x8e\x17\xc7\x8e\x63\x32\x3d\xb0\xe7\x4c\x4d\xd3\xb5\x6d\xd3\x35\xbd\x89\x69\xd8\xf6\x1c\xf0\x55\x2b\x68\x35\x65\xd0\xd1\x79\xca\x39\x3d\x07\xc2\xec\x74\x31\x81\xa3\x84\x34\x30\x7c\x2b\xb6\x62\xd3\x33\x42\x3b\xf0\xa6\xc1\x34\xc2\x78\x32\x35\x3d\x3f\x0e\xed\xc8\x0d\x0c\x03\x07\x66\x64\x3b\x96\xc7\x64\xc2\x53\x63\x6a\xcd\x66\x13\xd7\xb0\x3c\xcb\x9a\x98\x1e\x85\x71\x44\xef\xd6\x05\x51\xb4\xc5\xa6\xbb\xcc\xe0\xb9\xae\x17\x87\x41\xec\xd8\xbe\x11\x1b\x21\x9e\xb8\xb1\x37\x99\x99\x56\x84\x67\xae\x3f\x75\x6c\xdb\x8f\xad\x60\x62\x07\x4c\x41\xed\xcc\x0c\x67\x62\xcc\x3c\x73\x6a\xb8\x8e\x67\x7b\xd6\x1c\xf0\x6e\xd8\x43\xc0\xd4\x64\xd2\x7d\xf3\x65\x27\x2c\xf9\x75\x30\xb6\xba\xd1\xc8\x45\xf8\x71\x29\xeb\xf2\x0b\x9e\x35\x4a\x0a\x0d\x6a\x22\x9e\xa5\x50\x77\x4d\x8c\x46\x31\x54\x47\xe6\x24\x7e\xc0\x02\x9d\x6b\x50\x33\xba\xf2\x21\xba\x54\xd5\xa0\xf6\x01\x7f\x0e\x72\xbf\x88\xde\xd0\x81\x30\x53\x64\x50\xe5\x38\xc9\xe2\x5c\x64\x1c\xa7\x49\xf6\x61\x28\x96\xa7\x14\xc2\x99\x75\xa0\x75\xda\x59\x71\x68\xf1\xa8\xa3\x0c\x55\x1e\xc7\x25\x26\x63\x92\xaf\xc6\x96\x10\x76\xf5\xe2\xa3\x4e\xa0\x64\x70\x72\x0b\x04\x84\xe2\x0f\x48\x36\x16\x0e\xf8\xa8\x85\x08\xb5\x10\x64\xf4\x59\x49\xc7\xec\xe1\xe1\x02\xb9\x55\x9e\x26\x04\x77\x63\x67\x0b\xe9\x16\x7d\x35\x64\x75\xa4\x5f\xc6\x32\x9e\x0a\x94\x2c\x6d\x9a\x93\xa6\x9c\xaf\xe8\xfa\x8a\xab\xcb\xda\x90\xf2\x35\x49\x93\x8c\x09\xed\x58\x7b\x1f\xb3\x24\xc5\x38\xe4\x51\x92\x40\x59\xa3\x01\x69\x20\x2d\xa5\xe1\xc7\x6e\x37\x09\xa7\xf9\xd6\xe5\x0f\xd9\x65\x0b\x72\xda\xe1\x7a\xb8\x93\x4e\x76\xfe\xd4\x35\xc1\x30\xed\xe6\x2e\x1e\x2d\x12\x63\xe4\x66\x95\xf0\xdd\x8b\x4c\xc8\xfe\xb0\x14\x86\x74\x23\x44\x99\x3c\x4c\x4e\x26\x28\xf3\x6f\x92\x2b\x9f\x60\x9d\xfb\x0b\x3f\x3b\x39\x7f\x77\xb4\x40\x6f\x0e\xdf\xbe\x3c\x7e\xfb\xba\x4f\x9e\xb7\xa1\xb6\xb4\x84\x3e\x87\x05\xb3\xe2\xc2\x1c\x16\x43\x4a\x80\x71\x87\xe4\x2c\x2c\x84\x11\xfc\x4c\xa0\xf3\x48\x12\xb3\x08\x70\xc8\x04\x6f\x4b\xbf\xc0\xd1\x38\xc2\x29\x26\x98\x45\x30\x1b\xaf\xf2\xd5\x7a\xa5\xd0\xc7\x3d\x45\x1a\x27\xc4\x3e\xe3\x12\x13\x25\x2c\xa2\x69\x34\xdd\xfb\x11\xbc\x70\x32\x4c\xd3\x36\x1a\x5e\xb8\x69\x42\x0d\x9c\x1d\xbd\x3f\x3e\xba\x00\x9c\xf3\x78\x7e\xc6\x26\x96\xe1\xf8\x28\x52\xcb\xc6\x1f\x60\xa3\x59\x9b\xc0\x8f\x04\x9a\x06\x74\x76\x88\xd6\x3a\x32\x9f\x8e\x1f\xfb\x29\xfc\x89\x40\x89\xb7\xf6\x2c\xef\x8e\x9e\xe8\xcb\xdf\xe9\x93\xbe\x1f\xc1\xa1\xe6\xfd\x78\xc0\xe1\xb1\xa4\x95\x93\x9d\xb4\xf2\x26\x57\x21\xd7\x96\xfd\x4c\x4d\xe7\xdc\x63\x6b\x49\x7e\xe8\xde\x38\x4c\x1b\xd2\x1b\x71\x17\xca\xd2\x26\x6d\x2d\x90\xe2\x23\xf9\x8c\xa0\x9f\xb9\x4f\xe2\x37\x04\x9d\xc3\x1b\x82\xde\x72\x3f\xca\xaf\x09\x5a\xc0\xf7\x04\xfd\xac\xe8\x74\x06\xbd\xb5\xf2\x36\xc5\x24\x3c\x7e\x18\xe6\x45\x94\xe4\xd9\x78\x89\x7d\xa6\xd4\x61\x69\x9b\x38\xcf\xc8\x98\xce\x36\x73\xd3\x5e\xdd\xee\x4b\xd7\xb4\xde\xea\x16\x98\xb3\xd5\xed\xbe\x70\xe2\x6b\x4f\xe9\x67\xd8\x27\xec\xc3\xa5\x80\x4e\xa2\x8c\xef\xca\xc6\x82\x8d\x2c\x22\x9c\x4e\x27\x61\x25\x87\x08\x54\xcf\x50\xc3\x4e\x6f\x99\xb3\x5e\x26\x79\x9d\x33\x9c\x6d\x67\xbe\xc3\x6e\x75\x99\x5b\xdf\x38\xcd\x7d\x32\xa7\xf3\x6c\xb5\xb4\x76\xdc\x9b\x5e\x60\x54\xff\xbe\xc6\x51\xe2\x03\xbd\x71\x6c\x0b\x9c\xa9\xbb\xba\x1d\x6d\x50\x6b\x38\x7f\xa4\x73\xe7\x87\xae\x01\x00\xa0\x66\xf8\x1f\xc8\x00\xc1\xa3\xee\x21\x27\x82\x21\x58\xbc\x1a\xa6\x61\xfc\xa3\x52\x94\x59\xd5\xe5\x3e\x5d\x50\x9f\x77\x9c\x82\x6e\x9e\xfa\x5e\xd1\xac\xff\xaf\xf3\xe8\xe0\x18\xe5\x87\xcf\xe5\xfa\x9f\x71\x71\x79\x5a\x92\xfd\x7d\x70\x8c\xc2\x5f\x16\xfa\x86\xf7\x52\xfa\x4a\xe0\xa3\xe7\x77\x28\xce\x8b\x17\xcb\x24\x8d\xf4\x57\x64\x74\x09\xe9\x5f\x35\x44\x78\xf7\x7f\x07\x27\x77\x44\xcb\xf9\x1f\x29\x46\x67\x97\xb0\x41\x5b\x20\x7c\x07\xcf\x09\xcc\xd0\x35\x4c\xd1\x1b\x3f\xa3\x1d\xe7\xb7\x3c\x5a\xa7\x18\xe6\x28\xb8\x6c\x2c\x5b\x5d\x8e\xf6\xff\x1b\x00\x00\xff\xff\x83\x17\xd0\x70\x58\x79\x01\x00") - -func bindataTkgWebDistTkgkickstartui917es2015811d90b19a852dcbc427JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui917es2015811d90b19a852dcbc427Js, - "tkg/web/dist/tkg-kickstart-ui/917-es2015.811d90b19a852dcbc427.js", - ) -} - -func bindataTkgWebDistTkgkickstartui917es2015811d90b19a852dcbc427Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui917es2015811d90b19a852dcbc427JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/917-es2015.811d90b19a852dcbc427.js", - size: 96600, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartui917es5811d90b19a852dcbc427Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x0b\x77\xdb\x36\xf2\x30\x0e\x7f\x15\x86\xbb\xeb\x97\xec\xc2\x2c\xef\x17\xf9\xa7\x27\x3f\x55\x56\x12\x35\x89\xed\xda\x8e\xd3\xc4\xeb\xd7\x87\x22\x41\x9b\x0d\x45\xaa\x20\x64\xc7\x89\xf4\xdd\xff\x07\x00\x2f\xa0\x48\xc9\xb2\x73\x69\xfa\x3c\xdb\x9e\x13\x8b\x24\x80\x19\xcc\x0c\x66\x06\xc0\x00\xf3\x24\x9a\xa7\x01\x8e\xb3\x54\x92\x3f\x8b\xf3\x1c\x0a\x39\x46\x71\x80\xc5\xbd\x1b\x1f\x09\x10\x60\x80\x40\x0c\x52\x90\x81\x04\xf8\x20\x00\x39\x38\x05\x97\x60\x0e\x66\x20\x04\x03\x70\x00\x46\x20\x02\x27\xe0\x0a\x1c\x82\x21\x18\x83\xf7\x60\x02\xae\xc1\x0d\x38\x02\x53\x70\x0c\x5e\x81\x3b\xf0\x1c\x9c\x81\x7d\xf0\x27\xf8\x00\xde\x80\x8f\xe0\x19\xb8\x05\x9f\xc0\x5b\xf0\x1b\x78\x07\x7e\x01\x2f\xc0\x6b\xf0\x2b\x78\x09\xfe\x09\xfe\x00\xbf\xef\x95\x78\x08\x10\x4a\x50\xfe\x8c\x20\x9e\xa3\x54\xa8\xb0\x83\xf2\xe7\x38\x92\x06\x08\xf9\x77\x4a\x9c\xd3\xbf\x12\x94\xe5\xa2\x58\x4a\xea\x2c\x25\x28\x2f\x16\x2b\x35\xc4\x79\x1a\xc2\x28\x4e\x61\x28\x3e\xe9\xe3\xbb\x19\xcc\x22\xe1\xe4\x6e\x3a\xc9\x92\x9d\x9d\x74\x9e\x24\x4f\xfa\xf0\x9c\x3d\x2b\x31\x86\xc8\xc7\x19\xba\x58\x2c\xca\x2f\xe2\xff\xfe\x6f\xf9\x56\xbc\x28\x81\x31\x24\x22\x94\x4d\x2b\xa0\x31\x6c\xc2\x96\x3f\xe3\x6b\x94\xdd\x0a\x29\xbc\x15\x4e\xef\x66\x70\x84\x50\x86\x24\x71\x9c\xde\xf8\x49\x1c\x0a\x3e\xc6\x70\x3a\xc3\x02\xce\x84\x7c\x86\xa0\x1f\x0a\x69\x96\xee\x52\x48\x93\x04\x0a\x71\x9a\x63\x3f\x0d\xa0\xf2\x9f\x74\x9c\x0a\x19\x0a\x21\x22\x45\x27\x50\x28\x8b\x00\x5a\xc1\x27\x88\x08\xd9\xe4\x0f\x18\xe0\x5c\x98\xce\x73\x2c\x5c\xfb\x37\x50\xf0\x85\x56\x97\x24\x59\x98\x42\x7c\x9d\x85\x8a\x28\x2f\x25\x79\x59\x51\x1b\x43\x09\x02\x5c\xd1\x1b\x2f\x16\x12\xee\x43\x25\x4f\xe2\x00\x4a\xaa\x2c\x83\x43\xda\xbc\x12\x21\x08\x3f\x41\xa9\x78\x62\x24\x3d\x42\xd9\x0c\x22\x1c\xc3\x5c\x82\xe0\x33\xf2\x6f\x7b\x9f\x6f\xfc\x64\x0e\x7b\xcd\x3a\x58\x5e\x2e\x65\x0e\x24\x2a\x40\x12\x09\x43\xfd\x4d\x0c\xea\x62\xcd\x0a\x53\xf6\xe2\x48\x7a\x82\x3a\x85\x63\xb1\x90\x50\x9f\x72\x46\x5e\x2c\xf0\xce\x0e\xdc\xd9\x11\xd3\xf9\x74\x02\x91\xd8\x2f\x21\x41\x25\x81\xe9\x15\xbe\x96\x3f\xa3\x9d\x1d\x09\xf6\x91\x4c\x05\x3f\xee\xab\x20\xed\x73\xec\x5c\xee\x31\x02\x7d\xce\x7b\x29\x48\x7b\xdc\x97\x82\x70\xf1\xff\xe9\x97\x6d\x3d\xfd\x1c\x66\x29\xec\x3d\x51\x97\xbd\xe2\x97\x06\x18\x5d\xe0\x79\xfc\xef\x7f\x5f\x2c\x97\x00\xf6\x78\x31\x65\xb2\x02\x97\x20\xea\xa5\xcb\xe5\xb6\x92\xc3\x68\x00\xbf\xaf\xe8\x10\xe2\x64\x20\xe9\x3f\x51\x81\xdf\x7f\xa2\xd5\x54\xe1\x29\xd2\x47\x4a\xe0\x27\x09\x19\x1d\x4d\x5a\x51\x9d\xd2\x47\x4a\x0a\x3f\x62\x49\x2e\x2a\x0b\x49\x1f\x2a\x84\x4e\x00\xae\x12\xc6\x27\x70\xb2\x3e\xa5\x0c\x3f\xb6\xd0\xdd\xe7\x84\x0d\xd2\x7e\x1f\x29\xac\x99\xc5\xa2\xfc\x45\xc4\x3b\x4e\xfd\x24\xb9\x23\x52\xe1\xcb\x8c\xa0\xd9\x72\xb9\xac\x65\x30\x2e\x64\x30\x8e\x4a\x3d\x41\xf4\x5e\x7a\xc5\x49\x06\xaf\x5b\x00\x66\x72\x81\xfa\x85\x68\xcf\x50\x86\x33\x52\x52\xc1\xd9\x09\xad\x59\x76\xb9\x18\x3a\x2e\xd8\xd5\xca\x1e\x8a\xac\x92\xd8\xef\xf7\xd1\xce\x0e\x54\x82\x2c\xcd\x31\x9a\x07\x38\x23\x42\x87\xfa\x8d\x37\x4a\xea\x4f\xa1\x0c\xc4\xd7\xfe\x8c\x56\x58\x2c\xc4\x13\xc8\xea\x3e\x6d\x68\x9e\x9e\x38\x40\x57\xf3\x29\x4c\x71\x5e\x14\xfc\xf9\xff\x2f\x3d\xed\xbd\x89\x17\x63\x39\xc5\xd2\xd3\x9e\xbb\xd0\xec\x85\xa1\xcb\xd2\xd3\xde\x30\xf1\xa7\x33\x18\xca\xac\x85\x7f\xfe\xac\x60\x98\x63\x09\xc9\x4f\x8b\xce\xf5\x6e\xb2\x38\x14\x54\x8e\x40\xc5\x87\xcf\x12\xa3\x32\x5e\x2c\xf0\xff\xa9\x06\xcb\xce\x0e\x55\x12\xc5\xd3\x5e\x94\x21\x89\x51\x47\x05\x71\x9f\x48\x2e\x1b\x82\x58\xde\x43\xff\x83\xf7\xd0\xbf\xff\x2d\xc7\xe7\xe8\xa2\x0f\xcf\xd1\x45\xc9\xf4\xb8\x06\x95\xd5\xbc\x78\x22\xd5\x22\x9c\x45\x02\x96\xe5\xce\xd1\x30\xf4\xd3\x34\xc3\x02\xa1\xb8\xe0\x0b\x41\xe2\xe7\xb9\xe0\xe7\x82\x5f\x99\x0b\x91\x53\x37\x49\xd1\x3c\x87\x25\x41\xab\xc0\x9e\x62\xf7\x99\x8d\x79\x4c\xf0\x8b\x15\x98\xce\xa7\x6c\xac\xf4\xf9\x87\xc5\xe2\x89\x06\x62\xc2\xaa\x28\xbe\x9a\xb3\xef\x4f\x54\x20\xd2\xa1\x2d\xc6\xa9\x10\xef\xec\x48\xb1\x72\x8b\x62\x5c\x7c\xab\x94\x67\x43\x5d\xde\x49\x10\x48\x69\x3f\x56\x3e\xc0\x3b\x90\xf5\x19\xe5\x81\x98\xd3\x61\x57\xc9\x9f\x94\xd5\xea\xa7\xa4\x8e\xc8\xc6\x6b\xad\x27\x61\x39\x08\xfa\x95\xb4\xc2\x42\x4e\x2b\xd5\x89\xb3\x23\x14\x4f\x63\x1c\xdf\x40\xaa\x2c\x19\xbc\x27\xfd\x3e\x2a\xbb\x5d\x8e\x56\x80\x17\x0b\x31\x84\x91\x3f\x4f\xb0\x28\xef\x75\x01\x8c\x4b\x30\xf1\x5e\x27\x63\xfe\xf7\x7f\x39\x70\x4c\xad\x14\x15\x7c\x61\x56\xbd\xa7\x14\x23\xda\xa4\x18\xaf\xf5\xd8\xeb\xe3\xa7\x6c\x34\xf5\x0e\xa8\xa2\x96\xa9\x85\x4d\x41\x59\x42\x96\x9f\x66\x3d\x56\x42\xca\x64\x19\xc4\x4c\x23\xa5\x20\xab\xf9\xed\x53\x7e\x03\x54\xdb\xb4\x9d\x1d\x22\x03\xf5\x98\x05\x58\x06\x88\xbd\x04\x68\x3d\x93\xc4\xaa\x82\x08\x3e\x97\x6c\xed\x3d\xd1\x96\x32\x80\x35\xb8\x00\xd6\x46\x20\x80\x9d\xe6\xec\x18\x46\x09\x0c\xf0\xce\x4e\xf1\x43\xb9\x82\xf8\x29\xf7\x5b\x99\xc4\x69\x28\xc9\x3d\x9e\xe1\xa0\x62\x4f\x5e\xe8\x9f\x38\x92\x62\xf6\x2e\x2d\xb5\xd0\x15\xc4\x87\xb7\x69\x89\xf2\x3e\xcc\x03\x14\xcf\x70\x86\xa4\x98\x54\x28\xf5\x17\x05\x47\xff\x65\x8c\xf6\x4b\xb5\x51\x0c\x81\xff\x31\x9e\xc2\x1e\x92\x7b\xa9\x42\x19\xb3\x5c\x82\x00\x2a\xfe\x6c\x96\xdc\x49\xf8\x3a\xce\x41\x55\x9e\x1b\x54\x39\x37\xa8\xf6\x9e\xb4\x94\xe2\xb5\x9f\x73\x88\x55\xf2\x25\x97\x3e\x57\x5f\x82\xfd\x90\x5a\xe6\xbd\x0a\x4f\x8e\xa6\xa7\xb5\x46\x10\xab\x21\x5d\x91\x13\x57\xad\xe0\x6e\xf5\x70\x32\x9f\x41\x24\xc0\x8f\x33\x04\xf3\x9c\xb4\x47\x05\x11\xc6\xf8\x1a\x22\x62\x0a\x49\x6d\x21\x43\x0d\x7d\xb1\xc7\xc9\x47\x49\xde\x00\x41\x1f\x43\x09\xef\xec\x70\x7d\x03\x9f\x39\x65\x5d\x3a\x3c\x10\xd4\xf2\xa1\x02\x5e\x45\x10\x37\x60\xf9\x28\x19\xc3\x3b\x3b\x97\x8c\x0e\x35\x61\x2e\x9b\xde\xda\x65\x85\x6a\x0e\xf1\x51\xd9\xd2\x61\xf4\xb4\xf3\x6d\x97\x98\x55\x4d\x41\xe5\xf2\x92\xe2\x72\x79\xd9\xc7\xc4\x12\xb7\x60\xcf\xa9\x5f\x4e\xe4\x0f\xf3\x9e\x51\xd3\xc7\xee\xaf\xc8\xfc\x62\xf1\xa4\x14\xf4\x8a\x6c\x85\x0e\x79\xa2\x11\x91\x6e\x7d\x55\xf2\x6b\x7f\xda\x28\x52\x8b\x40\xd5\xfa\x11\xca\x3e\xde\x95\x85\xd4\x3d\xe2\x10\x14\xfd\xf8\x25\xcb\x12\xe8\xa7\x9c\x2c\x52\x0e\x1d\x46\x4c\x08\x5b\xe0\xa4\xa2\x02\x38\xbf\x00\xbc\xbf\x27\xcb\xe0\x89\xba\x0c\x7c\x1c\x5c\xd7\xd3\x91\x27\xda\x72\x59\xfb\x2d\x2b\x8e\x0d\x02\x31\x93\x69\x82\x33\x2e\x47\x6a\x08\xe9\x20\x92\x79\x13\xbf\x87\xfa\x6d\x3c\xe2\x7a\x9c\x81\x54\x5e\xc2\x24\x87\x02\xea\xc7\xdd\x03\xb1\x44\x61\xc6\x5a\x07\x48\xe6\x4c\xf7\xac\x1e\x3d\x78\x67\xa7\x52\xe2\x15\xf1\x88\x9a\x6f\x93\x14\x57\x93\x29\xdc\x30\x13\x6b\xc6\xd8\x3e\x44\xf1\x0d\x0c\x05\xae\x5b\xb9\x30\x25\x3e\x65\x9a\xdc\x95\x4a\x9f\x41\x26\x43\xad\x96\x90\x36\xf9\x98\x03\xc6\x00\x52\x53\x56\x03\x3c\x86\x11\x44\x30\x0d\x4a\xa8\xa4\xb3\xc2\xb5\x9f\xa7\xff\x3f\x2c\x4c\x20\x4c\x85\x38\x8d\x71\xec\x27\x71\x0e\x43\x61\x57\xc8\xc9\xc0\x97\xe4\x46\x09\xc2\x76\x1e\x2c\x24\x33\xb6\x9a\x58\x21\x3f\xdb\x0c\xef\x19\x4f\x57\xf7\x8c\xa7\xae\xd1\xb4\x58\x74\x56\xa6\xce\x71\xc8\xa6\xad\x39\x4c\x22\xe5\x16\x4e\x66\x7e\xf0\x61\x78\x3d\x4f\x3f\xe0\x0f\x57\x97\x1f\xe2\xe0\x43\x8e\x7d\x84\x2f\xe7\xc4\x06\xdc\x53\x62\xb1\x38\xbf\x90\x95\xd9\x3c\xbf\x96\xce\xcf\x3d\xcd\xb9\x00\x9f\x3d\xcb\xd3\x9c\x1a\xb9\x18\x82\x14\x82\x04\xca\x9f\x13\xa8\x20\x29\x85\x32\x48\xa0\x12\x4a\x29\x04\x9f\x07\xb7\xf9\xdb\xf8\x93\x8f\xc2\xd7\x59\x38\x4f\x60\xc7\xf4\xe6\x9f\x68\xb9\x64\x2e\x70\x0e\xc1\x25\xec\x27\x50\x32\x5c\xcb\x35\x64\x30\xa3\x0f\xba\xad\x7b\x86\x0c\x06\xf4\xc1\x34\x4d\xdb\x96\xc1\x01\x7d\xd0\x3c\xcb\xd5\x65\x30\x62\xc5\x3c\xd7\x70\x65\x10\xb1\x07\xc3\xb2\x64\x70\xc2\x1a\xd3\x6c\xc3\x92\xc1\x15\x7d\x70\x1d\x4b\xf3\x64\x70\xc8\x1a\xb3\x1d\x52\x7f\x48\x1f\x2c\x43\x35\x65\x30\x66\xd5\x49\xff\x64\xf0\x9e\xd5\xb7\x1c\xcb\x95\xc1\x04\xf6\x25\x29\x87\xfd\x09\x5c\x2c\xa4\x09\xec\x93\x71\xac\x1c\x1e\x8c\x4e\xc7\xaf\x47\x7d\x31\x4b\xe1\x69\x3c\x85\x43\x04\x43\x98\x12\xb1\xc9\x45\x90\x43\xe5\xe8\xf8\xf0\xd9\xf8\xd5\xa8\x2f\x06\xd5\x87\x23\x94\x45\x71\x02\x45\x30\x81\x32\xb8\x86\xfd\x16\x41\x24\xd8\xbf\x26\x30\xae\x0b\x18\xa3\xdf\xc7\x27\xa7\xe3\x83\xe7\x7d\x11\x7e\x8c\x73\x4c\x7c\x15\x00\x95\x83\xd1\xdb\xbe\x98\xc2\x5b\x11\x5c\x33\xbf\x0c\x2e\x25\x19\xdc\x74\xb7\x77\x43\xda\xbb\x29\xda\x3b\x3a\x3e\x3c\x1b\xef\x8f\x8e\xfb\xa2\x7f\x9b\x1f\xa1\xec\x26\x0e\x21\x7a\x96\xa1\x29\x69\xf6\xec\x68\xd8\x17\x6f\x66\x41\xf9\x7c\x70\xb8\x3f\x3a\x19\x9d\x32\xf8\xfe\x6d\x7e\x90\x85\xf0\x04\x62\x82\x05\x2b\x72\xc3\x41\x3f\xea\x86\x7e\x44\xa0\x1f\x15\xd0\xb9\x06\x2f\x07\xef\x2f\xb5\xaa\xd5\xc1\x27\x6d\x05\x20\xf9\xae\x73\xdf\xf5\x8e\xef\x06\xf7\xdd\x58\xfd\xfe\xcb\xe0\xe4\x74\x7c\x78\x70\xf9\xe2\xf0\xe4\xf4\x72\x74\x30\xf8\xe5\xd5\x68\xbf\x2f\x4e\xfc\x9c\x60\xf8\x22\xcb\xf1\x28\x25\x36\x31\x5c\xad\x37\x3c\x1e\x0d\x4e\x47\x97\xc3\x57\x87\x6f\xf6\x2f\x9f\x1d\x1e\xbf\x1e\x90\x66\x28\x13\x7d\x0c\x87\x49\x36\x0f\x49\xe7\x7d\xaa\xe5\x56\xea\x9e\x9c\xbc\xb8\x7c\x39\x7a\x77\x79\x30\x20\x62\x91\xe7\xd7\x2f\xe1\xdd\x81\x3f\x85\xab\xe5\xce\x8e\x86\x97\x47\x6f\x7e\x79\x35\x1e\x5e\x9e\xbc\xf9\xe5\x60\x74\x4a\x48\x71\x33\x0b\x8e\xe6\x93\x24\x0e\x4e\xe6\x93\x14\xe2\x16\x41\xda\x95\xf4\x56\xa5\x16\x95\xda\x95\x8c\x56\xa5\x16\xe9\x68\xa5\xe3\xf1\x19\xa1\x43\x13\x3f\x14\xdf\xf8\x18\x6e\x42\xb0\x59\x4d\x6f\x57\xeb\x46\xb1\x59\xcd\x68\x57\x6b\x21\xf9\xf6\xf0\xf8\xe5\xe8\xf8\xf4\xdd\xd1\x88\x40\xb9\xcd\xd0\x07\x88\x88\x28\x8c\x8b\x69\x1e\xb1\x29\x2d\x58\x5c\x25\x63\x5d\x25\x0a\xa9\x1c\x27\x97\x83\xe1\x70\x74\x72\x42\xb8\xda\x17\xfd\x20\x80\x79\xfe\x12\xde\x8d\xf7\x9b\x65\xde\x9c\xbe\xb8\x24\x8d\xf6\x45\x7f\x8e\xaf\x4f\xa9\xd7\xc5\x7d\x2f\x14\x41\x21\x16\x33\xa6\x03\x4a\xb9\xa8\x4a\x1d\x8f\x9e\x53\x41\x43\xf0\xaa\x10\xad\xea\xd3\xc9\x68\x78\x3c\x3a\x6d\xe0\x92\xc3\x00\x41\x3c\x28\x31\x5a\x29\x7e\x72\x42\x44\xff\xf4\xf0\xe5\xe8\x80\x14\xa5\xde\xea\x69\xf6\x01\xa6\xc5\x30\xbf\x2c\xf5\xca\xe5\x78\xbf\x56\x2d\x67\xb3\x60\x1c\xb6\x4a\x0c\xc7\xfb\xc7\x8d\x32\xc3\x38\x44\x65\xa9\x83\xd1\xdb\xa2\xc0\xcd\x2c\xa8\x5e\x1e\x1e\x5c\x8e\x0f\x4e\x47\xc7\x84\x97\xcf\x06\x43\xaa\x3f\xd2\x2c\x1d\xa7\x18\xa2\x14\xe2\x67\x7e\x40\x5a\x3a\x1a\x96\x15\x4a\xf6\x13\x56\x15\xcd\xcd\x18\xf3\x09\x73\x78\x78\x85\x2c\xf3\x05\xa9\x24\xaf\x96\x63\xdc\xb8\x99\x05\x8c\x19\x47\x9c\xa2\x9a\xc2\xfe\xe7\x28\x86\x49\xf8\xda\x9f\xcd\xe2\xf4\x2a\xef\x9d\x7f\x4e\xfd\x29\xec\x1d\x75\xb1\x14\x20\xf8\xe7\x3c\x46\x30\x24\x0e\x78\x31\x89\x3d\xa3\xbe\xf9\xa4\xd2\xf0\x80\x4c\x41\x7d\x74\x77\x8a\xe2\xab\x2b\x88\x48\xc9\xc4\x9f\xc0\xa4\x27\x0e\xde\x9e\x08\xc3\xe3\xd1\xfe\xe8\xe0\x74\x3c\x78\x25\x90\x06\xc5\x25\xe8\x00\x57\x71\x16\x4c\xfd\xfc\x03\xdf\x02\xfd\x22\xbc\x1c\xbd\x13\xc6\xfb\x82\x74\x78\x44\xb4\xd1\xe0\x95\x2c\x82\x30\x3b\xc8\xf0\x60\x8e\xb3\x63\x98\xe3\x0c\xd1\x19\x41\x47\xd3\x2d\xd9\x59\x85\xc0\x0a\x08\x1c\xa0\x47\x41\xe1\x44\xae\x6e\x99\xbe\x14\xe8\xcb\xc7\xb4\xca\x0f\x9c\x35\x24\x2d\x8a\x6c\xdd\x24\x1b\x65\x0d\xae\x16\x0d\xb3\x2f\xdd\x0d\x5d\x2c\xc1\x31\x73\x21\x0c\x4d\x77\x64\xf0\x8a\x3d\xb8\x9e\xae\xca\xe0\x8e\xf9\x23\xaa\x6d\x78\x32\x78\xce\x9c\x0b\x4b\x57\x0d\x19\x9c\x31\x1f\xc2\x76\x3c\x19\xec\x33\xe7\xc2\x31\x75\x43\x06\x7f\xb2\x2a\xa6\x6a\x7a\x32\xf8\xc0\x4a\xa9\xae\xa1\xcb\xe0\x0d\x7d\xf0\x6c\xd5\x71\xe4\x7a\xef\xe2\x63\xe1\x7a\x6b\x3b\x70\x67\x47\xba\x83\xca\xe9\xd5\x7b\x49\x05\x62\x90\xa0\x5d\x9c\x65\x09\x8e\x67\xbb\x41\x96\x62\x98\x62\x11\xe8\x1a\xc1\x89\x16\xd1\x80\x98\xcf\xfc\x54\xa4\x2f\x2e\xe7\x6f\x24\x1d\x88\xc2\xf0\x3a\xcb\x72\x28\xd4\xee\x8a\x50\xb8\x25\x82\x84\x60\x90\x4d\xa7\x30\x0d\x61\x28\xd3\x5d\x04\x48\x66\x13\x82\x9f\x0a\x7e\x82\xa0\x1f\xde\x09\xa5\x1e\x10\x08\x1f\x6a\xc7\x46\x28\xb4\x1a\x20\x4e\x79\xc0\x00\x1c\xa6\x70\x97\xf8\x45\x5c\xb1\x9c\x34\x0a\x89\x1a\xa0\xf5\xfd\x20\xc8\xe6\x29\x6e\x14\x08\x63\x04\x03\x9c\xdc\x09\x71\x2a\xe0\x6b\x28\x30\x15\x27\xbc\x84\x77\x64\x00\xf8\x69\x28\x9c\x50\xd5\xc7\x7f\xa0\xc3\x39\x17\xa2\x0c\x09\x77\xd9\x1c\x09\x83\xa9\xff\x29\x4b\x85\xb7\x70\x22\x9c\x40\x74\x13\x07\x30\x2f\x61\x29\x02\x23\xc6\x9f\xef\x07\x52\xfd\x83\x73\xdc\x9f\xad\x92\x1a\xbf\x78\x2b\xa9\x40\x37\x41\x83\xac\x9d\x94\x37\x58\x91\xcb\x37\xef\x09\xa1\x6b\xca\x57\xc0\x0e\x2e\x67\x0d\x60\xb7\x6b\x80\xd9\xdf\x02\xd8\xa7\x35\xc0\xdc\x6d\x80\xe9\x0f\x04\xf6\xb6\x9e\x2c\x56\xf0\xee\xd2\x8f\x92\xca\x83\x9a\x35\x05\x73\xf4\xd7\x0a\xc6\xe1\x8c\x60\xee\x27\xc9\x9d\x90\xcf\x60\x10\x47\x77\x44\xf0\x09\x3a\x85\x05\x15\x30\x31\xa1\x04\xfe\x49\xf1\xe2\x94\xbd\x88\x8a\xd6\x39\xcc\xe3\x5c\x28\x97\x6b\x60\x48\xa4\xbe\xd0\x38\x02\x86\xd3\x59\x86\x7c\x74\xc7\x77\x4e\x11\xc6\xd1\x56\x1d\xf2\x11\x14\x12\x18\x61\x61\x92\xf8\xe9\x07\x50\x08\x33\x21\xa7\x01\x44\x5f\x04\xba\x5e\x51\xd4\x04\x62\x83\x7e\xb7\x71\x92\x08\x13\x28\x20\x98\x67\x09\x99\x62\xfb\x73\x9c\x11\x3f\x36\xa0\x5d\x8e\xb2\x24\xc9\x6e\xc9\xc8\x26\xc4\x1d\xbe\x1a\x0b\x33\x04\x03\x52\x3d\x80\x02\x9a\x27\x30\x57\x56\x58\x4e\x80\x58\x40\x2c\x47\x14\x91\x0d\x1b\x88\x13\x54\x3f\x3a\xdc\xe3\xfc\x8d\xe4\x12\xe5\xb3\x8a\x51\x9a\x91\x09\xb5\x90\xfb\x04\xa5\x38\xad\xa8\x46\x1d\x6c\x81\xe8\x94\x1c\x50\x62\xb0\xd2\x90\x51\x93\xd4\x80\x58\x80\x7e\x70\x2d\x60\xa2\x63\x9a\xea\x28\xa7\x84\x2a\x95\xbc\x90\x64\xb4\x8f\x3c\xa6\x5e\x13\x53\x4d\x6d\xa2\xaa\x69\x40\x14\xde\xe4\x90\x12\x23\x4b\xe1\x2e\x5e\x55\x64\xd3\x2c\x84\xc2\xed\x35\x4c\x09\xef\x29\xb8\x79\x4e\xa9\xd7\xc5\x5f\x21\x9b\x60\x3f\x4e\x61\x28\xdc\xc4\x3e\x91\x2a\xaa\x03\x67\x28\xce\xa1\x30\xf5\x53\xff\x0a\x86\x42\x1e\x63\x48\xb4\x67\x08\x67\x49\x76\x47\x9a\x8a\x50\x36\x25\x85\xcb\x9d\x0b\x21\x4b\x3b\x25\x98\x01\x1e\x0f\x5e\xd7\x25\x0b\x75\x9c\x2b\xc2\x1b\xfa\xd1\xef\xd0\xd5\x44\x46\x49\xf7\x38\xa5\x5f\xec\xc8\x09\xb7\xd7\x71\x70\xcd\x28\x3e\xf5\x3f\x40\x21\x26\xa4\xce\x63\xb6\xe9\x37\x83\x28\xca\xd0\xb4\x40\x7c\x0a\xc9\x38\x4d\xe6\x39\x19\xbb\xf3\xd9\x15\xf2\x43\x32\xa8\xd2\x50\x08\x61\x02\x09\x13\xf3\x96\xce\xa5\xc3\x5f\x07\x62\x18\xdf\x88\xc0\xa8\x5f\x19\xc5\x2b\x8d\x53\x48\x26\xd3\x48\x33\x3f\xcf\x6f\x33\x14\x52\x95\x44\x48\x89\x6a\xd1\xd7\x2c\x20\x52\x23\x2e\x02\x9d\xb5\x46\x34\x9b\x66\x03\xdd\xac\xcb\x38\x0d\xcd\xc6\x71\xde\x65\x1f\xe2\x80\x38\xdd\x36\x7d\xff\xee\x20\x90\x34\x0f\x3c\x83\xc0\x00\xeb\xac\xac\x66\x74\x28\xc0\xe6\xf8\x20\xca\x52\x05\x62\x9c\xce\xe6\xc4\x2c\x5b\xf5\xdb\x42\xcd\x92\xc6\x50\x96\xec\x5e\xc3\x64\x56\x76\xa8\x69\x98\x4a\xf4\x75\xbd\x4d\x1a\xdd\xb8\x9f\x34\xba\xd9\x45\x1a\xdd\x02\xba\x5d\x97\xb1\xd7\x90\x46\x77\xba\x49\xa3\xbb\xe0\xf6\x2b\x90\xc6\xab\x49\xe3\x54\x6f\x0d\xf5\xa1\xa4\x31\xb4\x36\x69\x0c\xbd\xc0\x9c\xb4\xdf\x45\x17\xc3\xe8\xa2\x8b\x61\x02\xdd\xad\xcb\x58\x6b\xe8\x62\xd8\xdd\x74\x31\x1c\xf0\x69\x13\x5d\x74\x6f\x1b\xba\x18\x6e\x45\x17\x43\xad\xdf\x7a\x0f\xa1\x4b\xf5\xe3\x97\xdf\x3e\x48\xb2\x0c\xf4\x1d\x58\xc6\x45\xdc\x41\x25\xfb\x78\x2b\xc9\x7b\x77\x50\xf9\x38\xb3\x25\x8d\x21\x35\xfb\xed\x4c\x42\xca\x35\x9e\x26\xcf\x88\xcd\x7c\x45\x68\x93\x2b\xdc\x8c\x97\x96\xfa\x0d\x9f\x4a\x1a\xeb\x30\xa9\xbb\xa9\xea\xca\x04\xb5\xaa\x5e\x0c\x83\xfb\xab\xd7\x93\xd6\xaa\xae\x61\xf2\xeb\xd1\xbf\x75\xfb\x33\xc6\x37\x71\x9e\xde\x75\xf8\x33\x85\x13\x9e\xcd\xd8\x5a\x90\xe1\xd6\xe6\x83\x73\x2d\x79\xe2\x63\xe5\x9f\xf1\x74\x96\xc4\x41\x8c\x09\xfd\x7f\xb3\x7f\x95\x8a\x7d\x5e\x80\x2a\xb2\xb0\xca\x87\x7f\xce\xa5\xc6\xf2\xfb\x2f\x8f\xf0\xa8\x4e\x1e\xea\xbf\x53\x47\x84\x18\xb4\xd2\xf3\xaf\x1d\x7b\x62\x2a\x98\x3c\x08\x1f\xe0\x1d\x53\xf1\xab\x8e\x51\x54\xae\x8c\xf1\xce\x4f\xe5\x7d\x95\x76\xc7\xe7\xdc\xa0\x38\xb9\x13\x88\x02\x63\x66\x9d\xc0\xa0\x36\x2c\x49\x20\x12\x6e\x63\x7c\x9d\xcd\xb1\x10\xc6\xf9\x2c\xf1\xa9\x49\xf4\x03\x3c\xf7\x13\xb6\xd3\x9b\x97\x9e\xe0\x9b\x31\x6f\xd9\x8d\xa6\x65\x37\x9b\x86\xdd\x6a\xf8\x20\x95\x9d\x14\x02\x3f\x25\x4e\x45\xad\x21\x6c\xea\x4f\x19\x46\x55\x93\x28\xc3\xba\x53\x85\xb1\xbf\x66\x9e\xc7\xf0\xd5\xb8\xc3\x39\x72\x89\x73\x74\x7a\x0d\xf3\xda\x1e\x33\x07\x2e\xf3\xc3\x7b\xfc\xaf\x1a\x0f\x8f\xe1\x61\xd6\xb2\xa5\x02\xb1\x80\xd9\x72\xd1\x3a\x90\x20\x9e\xcc\x83\x0d\xb0\x61\xb5\x0c\x30\x13\x88\xcd\xe6\x97\xb7\xbd\x86\xfd\x45\xb6\xf7\xb7\x2f\x33\x30\xd4\xae\xa9\x40\x64\x58\x8b\xc0\x70\x1a\xc6\xb7\x1c\xb2\x9a\x55\x1b\x35\x1d\xbc\x83\x40\x07\x3a\xf7\xd5\xee\xb0\x5a\xc6\x5f\xa1\x87\xb9\x35\xc3\x2e\x3d\xcc\xc8\x41\xb5\x09\x5d\x9a\x3f\x8c\x44\x80\xf8\x4a\x39\xaf\x48\x5e\x74\x28\x12\xa6\x3a\x35\xfd\xeb\xa9\xce\x4d\x7d\xd5\xb9\xae\x16\xae\xe3\xe9\xdd\x0c\xd6\x81\x06\x55\x27\x55\x1e\xf1\xd7\x7f\xb9\x0e\xfe\x75\xc3\x3a\x4c\x29\x11\x10\xa1\xac\x10\x88\x93\xfd\x1b\x49\x03\x06\x67\xf6\x59\x5c\xc9\x4b\xd8\x3f\x5f\xbb\xce\xb5\x7e\x59\xad\x63\x1d\x6b\xcd\x22\xe2\xc6\x05\xc0\x0b\xf0\xcf\xc6\x5e\x0d\xc1\xc8\xef\xf3\xbb\x8d\xa7\x50\x42\x00\xb2\x7d\x39\xdc\x9f\x43\x09\x71\x6b\x51\xa8\xdc\xae\x8f\xcb\xad\xcf\xac\xda\x2d\x06\x52\xdc\x2f\xa2\x41\xe8\xee\xb4\xac\xf8\xb3\x78\x98\xc4\x30\xc5\x7d\x08\x62\x85\x68\xbe\x38\xbd\xea\xd3\x88\xa7\x72\xad\x9c\x2e\xa7\xf6\xb9\xe5\xd4\x58\x61\x6b\xe0\x79\xff\xfc\x02\xc4\x0d\x39\x66\x6f\x68\xcc\x22\x37\x93\xa4\xed\x2d\xcb\x88\x20\x82\xfc\xf9\xe7\x0f\xf0\xae\x27\x06\xf3\x1c\x67\xd3\xf8\x13\x2c\xf6\xab\xe8\xc2\x6d\x2b\x70\x90\xa0\xba\x47\xfe\x51\x88\xfd\x7a\x8e\xb2\xf9\x4c\x09\xfc\xf4\x75\x76\x03\x4f\xb3\x03\xf8\x11\xb7\x77\xb6\x04\xc8\x95\xa5\xe8\xec\xec\xc0\x16\x5e\xcb\xe5\x12\x30\x44\x72\x88\xcf\x56\x3e\xb6\xd0\xa1\x11\x9b\x71\xde\xee\x1d\x04\x4f\xe8\x06\xf6\xce\x4e\x04\x95\xf7\x4a\xe8\x63\xbf\x98\xfb\x1d\xc3\xab\x38\xc7\xc8\x47\x0a\x66\x6b\xcf\xd2\xf9\x2b\xa8\xbc\x52\x06\x6f\x4f\x2e\x9f\x8f\x4e\xeb\x45\xfc\xb3\xa3\xe1\x09\x68\x7c\x1a\x9c\x0d\xc6\xaf\x06\xbf\x8c\x5f\x8d\x4f\xdf\x5d\xbe\x3f\x3c\x18\xad\x7c\xa7\x4b\xec\xa7\xef\x8e\x46\x27\x17\x72\xd5\x8d\x38\x8d\xf1\x1a\x52\x52\xd4\xc9\xf7\xc1\x6d\xce\x21\x2f\xd5\x95\xd3\xab\xc3\x74\x9c\xc6\x78\x33\x1f\x02\x28\x85\x50\x42\x75\xa0\x85\x0c\xb8\x9a\x45\xcc\x43\x25\x60\x80\x52\x64\x9e\x43\xb4\xef\x63\x9f\xa0\x56\x50\x46\x99\xcc\xe3\x84\xee\xd4\x49\x4d\xce\xd2\x26\x94\x5b\xba\x2d\x4d\x44\x0a\x54\x9f\xe9\x13\x51\xb0\xf4\xcd\x8a\x0a\xee\x53\x40\xe5\xbe\xc1\x1b\x1c\x27\x31\x8e\x61\xae\x5c\x41\x5c\x97\x7a\xed\xcf\xa4\xaa\x01\xba\x78\xbc\xcf\x76\x0c\x58\x1b\xf5\xb7\x86\x5c\x4a\xc5\xcb\x6a\x70\xa8\xa0\x22\x26\xff\xbd\x21\x70\x73\x38\xbc\xf6\xd3\x2b\x98\x2b\xb3\x78\x06\x25\x49\x05\x27\x50\x99\xc8\x92\xa5\xaa\x32\x90\x54\x70\x05\x95\x8f\xb2\xd4\x19\x92\xf3\xeb\xc9\xe1\x81\xc2\x02\xdf\xe2\xe8\x4e\x82\x72\xbf\xdf\x5f\x79\x87\xe5\x25\x6d\xe5\x10\x2a\xc7\x32\x23\xe0\x3c\xcd\xe7\x13\xa2\x9f\x27\x50\x96\x95\xea\x77\x0d\x02\xcb\x9f\x21\x11\xc3\x29\xe1\x7e\xce\x9a\xa0\x35\x11\x15\x52\x88\x0e\xd3\xb3\x1a\x6f\xa9\x7b\xb7\xa5\xd9\x5a\x53\x43\x60\xb0\xfa\xa6\x4f\xb4\x46\xb1\x0d\xff\x14\x2a\xed\x7d\x78\xe6\xff\xc2\xf0\x85\x9f\x86\x09\x44\x92\xdc\xeb\x6c\xa2\x50\x3c\x4f\xa1\xd2\xda\xaa\xef\x6a\x21\x8c\x73\x1f\x4d\x29\xdb\xd7\x74\xe3\x89\x5a\xf5\x7e\xa5\x0f\xe4\xd5\x15\xc4\x27\x44\x38\x42\xfa\x6e\x4d\x13\x53\x08\x6a\xcc\x4a\x91\x82\x78\xc8\xac\x0c\xad\x79\xe2\x47\x30\xb9\x5b\x53\xbf\x0d\xbc\x18\x2c\x53\x98\xe7\x30\xbd\x82\x88\x63\x22\x2d\x0c\x6f\x60\x8a\x9f\xc5\x09\x1c\x13\xd7\x1c\xc3\x90\xb5\x91\xa5\xfc\x3b\x16\x9c\xc2\x94\x7b\x93\xbd\x85\xa8\xd7\x85\x69\x6c\x4d\x49\xb7\x2e\x08\xb4\x40\x39\x22\xe8\x9e\xc1\x98\x85\xdd\x0c\x0a\xb4\x39\xe5\xd1\xc4\x62\xad\xee\x0c\x57\x91\xa8\x39\x37\x85\xb2\x04\x6b\x42\xae\xaa\x63\xe9\x89\x56\x43\xab\xc4\xb8\x0b\x10\xb3\x8a\x90\x9f\x1c\x13\xe5\xcf\x3d\x2a\x08\xce\x12\x3f\x80\x92\xf8\x1f\x2c\x02\x51\x94\x01\xea\xc3\xd5\x19\x31\xa9\xb3\xf2\xaa\x55\x6f\x0f\x3f\xe9\xaf\x42\x5a\xd1\x05\x57\x10\x4b\xdd\x5e\x80\x5c\x74\x73\x0e\x25\x2c\x03\x44\x5b\x6a\xe1\x70\x4f\x6b\x2d\xe7\x81\x6b\xb4\x64\x5d\x87\x35\x6e\x18\x8c\xa6\x41\xd8\xa8\xfd\x01\x66\x23\xa4\xf2\x1a\x08\x42\x83\xb7\x27\xc7\xcc\x1f\x90\xe4\x4a\xdb\x0d\xa1\xf2\x92\xd7\x6f\x55\xc8\x89\x0a\xc6\x50\xc9\x22\x59\x3a\xbf\x90\x97\x32\xa1\x7c\x67\x8b\xc3\xd5\x81\xfe\x98\xc6\xf7\x24\x15\xbc\x87\xca\xbe\x2c\x9d\x63\x80\x2e\xea\x06\x1e\xac\x37\x4b\x87\x07\x9f\xab\x17\x4a\x9e\x21\x2c\xc9\x80\xbc\xa5\x46\x84\xf5\x9e\xbe\x69\xf8\x42\xf8\x5c\xbb\xa8\x4b\x15\xfd\x90\xe4\x25\xe8\x72\x57\x6a\xd7\x6b\x59\xcb\x79\x03\xc0\x3a\xa3\x5e\x14\x6a\xeb\xbb\xc2\x07\x2d\x6d\x68\xd1\x87\x56\xeb\x55\xd0\xd3\x03\x9b\x6f\x78\xc5\x25\x90\x95\x49\x4d\xa5\x1d\xee\xd1\xfc\xeb\x80\xaf\x53\xe5\x0d\xd8\x44\x9b\x97\x90\xee\x33\x10\x9b\x9d\x9b\xf3\xc7\xf8\xeb\xeb\x67\x04\x17\x64\xe4\x8e\xfc\xe0\xba\x21\x4d\x15\xcb\xf9\xce\xe1\xea\x40\x89\x24\x33\xf3\xc4\xfb\xa6\x8d\x01\x91\xd3\xe1\x9d\x3f\x43\xd9\x74\x70\x34\x5e\xab\x01\x01\xea\x23\x28\xbd\x84\x32\x0d\x93\x8d\x32\x24\x21\x25\x97\xe4\xbd\x27\x12\xee\x23\x25\x95\x64\x99\x9e\xbe\xd9\xab\x4e\x41\x30\xb7\x65\x6f\x83\x25\x8b\x79\x24\xe1\x39\xff\x48\x9c\x50\x16\x35\x9b\xca\x9f\x91\x02\xa5\xb4\x3e\x8d\x83\x94\x88\x58\x8a\x8a\x45\x5d\xa6\x64\x2d\x5f\xee\xf1\xeb\x8a\x20\x91\xcd\x4a\x91\x79\x8d\xfd\x86\x2f\x5a\xfa\xa1\x08\x62\x14\xc3\x1b\xc8\x5b\xfc\xcd\x2e\x28\xa1\x68\x87\xe7\xf0\xb4\xf6\x75\xb8\xd8\x93\xaa\xd7\x37\x10\xc5\xd1\xdd\xb6\x8a\x76\xaf\xd3\xe3\xa4\x53\xd7\x83\x0c\xc7\x51\x1c\xd0\x65\xbc\xbe\xc8\x0e\x6c\x12\x66\x7f\x5e\x82\x78\x95\xe3\x71\xc5\xf1\xb8\xc5\xf1\xb4\xe2\x38\x3a\x4f\x79\x4e\x56\x4e\x10\x25\x30\xa3\x48\x5a\xb1\x37\x93\x3f\xc7\x0a\x94\x32\xee\xb0\x15\x65\xef\x8a\x16\x67\x42\x3b\x4a\xc3\x59\x16\xa7\x58\xfa\x5c\xec\xbb\x1e\xf9\xc8\x9f\xe6\x3d\xb4\x7c\x9c\x2e\x26\xaa\xb8\x8b\x08\xab\x9e\x13\x0d\x3a\xca\xaf\xa5\xcf\x64\x82\xd2\xab\xe6\x4d\x4c\x21\x5e\x0e\x5f\x0c\x0e\x9e\x8f\xf6\xc1\xcc\xbf\x23\x14\xee\xc1\x95\xce\xb6\x75\x28\xf1\x16\xb7\x03\x41\xa6\x66\x87\x27\x97\xe3\xd7\x83\xe7\xa3\x93\x0a\xc2\x67\xa6\x7b\xb7\x82\xb4\x24\x76\xa4\xd3\x01\x52\x79\xd3\x51\x1d\xa4\x94\x30\x23\xc9\xd3\xe2\x2f\xc5\xd1\xbf\x82\xbd\x74\x9e\x24\xf2\x62\x81\xcb\x17\x8b\x45\x6b\x16\xb1\xd7\x49\xce\xf2\xd0\xe1\xca\x9e\x6d\x4f\xf0\x93\xa4\xb9\x89\x9b\x86\x02\xeb\x19\x3b\x6a\x31\xa1\x67\x7c\xe2\x50\x11\x44\x25\xc8\xd2\xc0\xc7\xc4\x09\x59\xd3\x1b\xad\x69\x08\xd7\x58\xc0\x38\x1f\x66\x69\x0a\x03\xbc\x1f\xe7\x45\x3c\xe8\xa6\x61\x53\xc4\xeb\xbf\x24\xe3\x3a\x9c\x07\xbc\x19\xe7\x4e\x06\xc1\x15\x8f\x0a\x71\xe2\x2f\x97\xcb\x05\x78\xd9\x30\x2c\x71\x5e\xaa\xaa\xf5\xf6\xb2\x0c\xa4\x6f\x6b\x07\x7e\x1a\x53\x2b\x76\xa2\x72\xde\x14\xfa\x68\x9d\x05\x6c\x14\x22\x3a\xbf\xd4\x78\x9d\x13\xd9\x7d\xb6\x14\x7f\x88\x42\xe6\x51\x2f\x97\x17\x32\x40\x4b\xe9\x18\x2a\xe3\x2a\x14\xde\x57\xfe\x33\x57\x75\xc7\x8a\xfc\xa0\xdf\x11\xc4\x9e\xc2\x5b\x09\x2e\x16\xbe\x2c\xdd\x41\xe5\x9d\x61\x4b\xcf\xa1\x92\x1c\xc9\xf2\x12\x94\x15\x83\xe9\xac\x7f\x07\x95\xdf\x67\xd3\x42\xfc\x7d\xc0\x16\x72\x33\x94\xf7\xce\xcf\x45\x7f\x36\xdb\xf5\x6f\xf3\xdd\x59\x11\xc0\xbc\x9b\x63\x38\x13\x2f\x2e\x40\x04\x7d\x3c\x47\x30\xef\x9d\xdf\x41\xe5\xcf\xc3\x3f\x2e\x40\x08\x83\x24\xef\x19\x2e\xb8\xf1\x51\xde\xd3\x34\x40\x0f\x16\xe4\xab\xec\xad\xce\xa0\x57\x7d\xe8\xff\x93\x46\x0d\xc4\x9f\x20\x41\x56\x82\x7d\x0c\xa5\x73\xb1\x17\x30\x69\x11\x26\x38\xfd\xcf\x5c\x37\xb5\x08\x86\xa6\xee\x45\xd0\xd2\xfd\x49\xe4\x59\x8e\x65\x99\x9a\x3e\xf1\x1c\x23\xb2\x2c\xd5\x86\x7e\xa0\x5b\xae\xe5\xb8\xa6\xcb\x4a\x5b\x9e\x69\xd8\xaa\x6a\x58\x9e\x6d\x5b\xa6\x65\xa8\xba\xdd\x13\x44\x20\xf6\x68\xbc\xe4\xd1\xe1\x2b\x1a\x6d\xdc\x13\xc4\x0b\x59\x06\xe2\x7f\xe6\x51\x14\x85\x2a\xfb\x23\xca\x20\xe0\x90\x62\x27\xaa\x19\x52\xfe\x6d\xce\x6d\xcd\x08\x71\x28\xd0\xf5\x78\x06\xd2\x99\xf8\xfa\x64\x62\x7b\x5e\x14\xb8\x6a\x38\xf1\x03\xcf\x75\x6d\x37\xf2\x42\xdd\x70\x3c\x4b\x77\x82\xc0\x0c\x1d\xdb\x08\x59\x69\x4d\xd5\x2c\xcd\xb4\x3d\x4d\x57\x6d\x4f\x73\x2d\x57\xf7\xba\x11\x04\x62\xef\xe4\x74\x70\x7c\x7a\x79\x3a\x78\x7e\x39\x7c\x75\x7c\x79\x7a\x78\xf8\xea\x74\x7c\xd4\x6b\x7f\x19\x0f\x0f\x0f\xe8\xeb\xe1\xab\xc3\x93\x51\xfb\x75\x67\x3b\x97\xc3\xc3\x83\xd3\xd1\xc1\xe9\x4a\x89\x93\xa3\xc1\x41\xaf\x0a\xd5\xe1\x7b\x3d\xde\xe7\xe2\x7c\xea\x48\x1c\x45\x68\x42\xa6\x0d\xb4\x91\xe9\x82\xda\x59\xa2\xd7\xc5\x9a\xf2\xf9\x1f\x9a\xd3\x7a\xe3\xae\xbc\xf9\xb9\xfd\xea\x27\xcd\xeb\x69\xec\x67\x59\xab\x7c\xae\x1b\xd2\x5b\xaf\x7e\xee\x7c\xa7\x35\x9b\xfa\x99\x6b\x9c\x2f\xe5\x54\x52\x95\x73\x52\x85\xe8\xe1\xf6\x5a\xaa\xd8\x7c\x91\x27\x33\x27\x59\xbe\x65\x40\xd5\x88\x02\xc7\xb3\x82\x89\x69\xbb\xde\xc4\x73\x21\xb4\x2d\x15\x1a\x96\xad\x5b\x13\xcd\xd7\x34\xd5\x8a\x26\xac\xb4\xee\xb8\xae\xe5\xd9\x86\xe6\xa9\x9a\xeb\xea\xb6\xe3\xfc\xd0\x92\xd5\xee\xf9\x5f\x2f\x5d\xba\xdd\x7a\xb3\x2a\x6f\x3f\xb7\x5f\xfd\xa4\xbb\xdf\x50\xba\xea\xc6\xf9\x9a\x76\x25\x5d\xa7\x9c\x74\xc5\x8b\x85\x14\x37\xa4\x8b\xdf\x3e\xe6\x24\x0b\xba\x9e\xa7\xba\xbe\x1a\x40\x27\x08\x55\x2b\x72\x83\xc8\x0c\xa0\x3e\xd1\xa2\x09\x34\xac\xd0\x35\x35\x2b\x0c\x55\xd2\x53\xaa\x54\x4d\x4b\x33\x1c\xcb\x74\x1c\xdd\x50\x55\x4b\x35\x35\xf3\x07\x96\xac\x76\x78\x61\x33\x9a\xf0\x7b\x0a\x94\x61\xb5\xde\xac\x8a\xd8\xcf\xed\x57\x3f\x19\xce\x37\x14\xa8\xba\x71\x1e\x07\xab\x12\xa8\x4b\x4e\xa0\xd2\xc5\x42\x4a\x39\x81\xea\x08\x72\xe3\xa4\x4a\xb3\x02\x73\x02\x2d\x6f\xe2\xa8\x86\x61\x7b\x76\xe4\xe8\x13\xc3\xf6\x9c\x89\xeb\x87\xae\x09\x8d\x28\x0a\x54\xc3\x76\x74\x56\xda\xb4\x75\xcb\x75\x1d\xdb\x75\x4c\xcb\x21\x26\xd1\xb0\x7e\x40\xa9\xaa\x23\x3c\xee\x8d\xec\x58\x89\x44\x28\x76\xf2\x1b\x2a\xad\xf2\x20\xea\x48\x8e\xff\xda\xcf\xfb\xec\xe7\xf9\xb9\x01\xc4\xca\xe1\x17\x2f\x00\x79\x6e\x4d\x7b\x8a\xf7\xe9\xca\xab\x62\x97\x1d\x65\xb7\xdc\x53\x90\x25\xbb\x2e\x79\x26\x4f\xe3\x34\x89\x53\x28\x02\x91\xbe\xf0\x51\xec\xef\x26\xf1\x0d\x79\xe1\xe7\x39\x44\xb8\xf8\xad\x69\x77\xa7\x6c\xab\xbe\x38\x86\x42\x6a\x00\x31\xbf\xf6\x67\xe4\x3b\xe1\xe8\x6e\x10\xa3\x80\x4c\x2c\xc4\x3c\xfe\x44\xfe\xe8\x7a\x09\xe4\x28\xcb\x63\xb6\x83\x2e\xa2\xf8\xea\x1a\x8b\x14\x91\x13\x56\x2c\xb9\x12\x01\x8b\x02\x19\x47\x87\x33\x48\xf1\x16\xd9\xd9\x72\x11\xf9\x61\x9c\x89\x40\x4c\xe9\x71\x26\xee\xfc\x13\x29\x7e\x5c\x7c\x14\xcb\xdb\x2c\x40\xd7\x59\x48\x4a\xbb\x62\x35\xe8\x60\xa5\x99\x2f\x80\xd4\x75\x2a\xf3\x1e\x50\x26\x10\xd3\xab\x71\xb4\xc2\x09\x4d\x17\xeb\x87\x7c\xba\x6b\x73\x8f\xc9\xd5\xae\x29\x5e\x80\x5a\x23\x65\x8b\x85\x94\x71\x1a\xa9\x98\xbe\x72\x5a\xc8\xb6\xac\x09\x0c\x5d\xc7\x70\x3c\xcf\xb4\x03\xd5\x73\x3d\x7b\x62\x6a\x9e\xe1\x19\x41\xa0\x05\x9a\x61\x4e\xb4\xc8\x23\x43\x83\xea\x2c\xd7\x55\x55\x4d\xd7\x74\x4f\x37\x5d\x5b\xb3\x2d\x57\xff\xa1\xb5\x10\x51\x24\x45\x9f\x2b\x7f\xa9\x85\xee\xa5\xd6\x2b\x43\x86\xff\x2f\x76\xa0\xd4\x6f\xe5\x52\xad\x8e\x58\x9c\xcd\x76\xb7\x1c\xb5\xe4\x73\x11\x12\x25\xd6\x63\xa9\x3c\x72\xd8\x31\x3c\x8a\x4f\xb5\xea\x61\x41\xb3\x22\x3d\x7f\x40\x60\xc7\x98\x8e\x61\xf6\xcc\x74\x5c\x31\x02\xe9\x68\x7a\x96\x11\x45\x54\x46\x25\xb1\x31\x46\x51\xa2\x9b\x7f\x9b\x54\x1a\x37\x02\xcd\x62\x44\x4e\x30\x41\x72\x82\xd3\xdd\xe2\xc4\x5d\xf1\x54\x4c\xca\x45\x40\xe3\xd7\xca\x75\x1c\x31\x48\xe2\x80\xe0\xe4\x6f\xa7\xe3\xa8\xae\xf1\xd1\x15\x24\x5f\x2e\xcb\x0e\x5e\x23\x18\x91\x3f\x18\xcf\xf2\xde\xcf\x3f\x87\x59\x90\x2b\xfe\x6d\xae\xf8\x34\x10\x5f\x09\xb2\xe9\xcf\x79\xf8\x61\x37\xca\xd0\xee\x55\xf6\xf3\x8d\xf6\x73\x08\x6f\x60\x92\xcd\x20\xda\xbd\x9a\xc7\x21\xfc\xb9\x0c\x1a\x8c\xd3\xab\xdd\x3c\xfc\x40\x03\x0b\xfe\x51\x78\x80\xe4\x1d\xb7\xe0\x55\xb2\xa8\x8a\x25\x2a\xa9\x2d\x5e\x80\xa0\xe8\x44\x11\xec\xcd\xf8\xd7\xa1\xce\xf8\x33\xaa\x22\xdd\x4d\xbc\xce\x92\x90\x9a\x83\xc6\x64\x59\xbc\x00\xf9\x76\x4d\xb6\x8e\x9a\xae\x6d\x56\xbc\x00\xa7\x9d\xd2\x99\xc0\x68\x3b\xe1\x1c\xb3\xc0\xe7\x75\x88\xf0\x07\x59\x57\xb0\x68\xcc\x25\x3a\xcc\xda\xda\x41\xd2\x5d\xb4\x0b\x63\x52\x72\x0b\x71\x08\x92\xf8\xe7\xc4\xc7\x30\xc7\x3f\xcf\x73\x88\x0a\x29\x48\xe2\xdd\x2a\x7c\x74\xf7\xcf\x79\x79\xc7\x02\x13\x87\x75\x5f\x77\x4b\x6f\x8d\x60\xb5\x22\x9a\x8f\x16\xd7\xaf\x8b\x5f\x19\x80\xba\x62\x34\xc9\x90\xbd\x5c\xab\x70\x1a\x67\xa0\x3b\x38\xcd\x7f\xe7\x75\x0a\x6f\x69\x93\xc5\x42\x4a\x0a\x4b\xcb\x59\x9d\xea\xd0\xcf\x34\xbf\x62\x26\x34\x8c\x34\x0d\x9a\x9a\xee\x45\x30\xf2\x26\x5e\x64\x6a\x81\x3a\xf1\xdc\xc8\xb5\xbd\xd0\x36\x27\x13\xd5\xb5\x22\x4b\x0f\xed\x62\x99\xc2\x52\x55\x4f\xf7\x34\xd3\xb6\x0d\x5b\x37\x6d\x4b\x37\x7a\xc2\x60\x75\x19\x3a\x2f\x76\xfd\xe8\x42\x9d\x7c\xb1\x04\x18\x4e\x67\x84\xa8\x2b\xb7\xe0\xac\x06\x0a\x46\x34\x78\xaa\x0e\xeb\xd7\x00\x5d\xcc\xcc\x31\x9c\x11\x15\x32\xdd\x6d\xf8\x87\xa0\x11\x6a\x49\x57\x3d\x13\x88\xf0\x4a\x21\x9d\x3f\x03\xb6\x12\xd1\x6b\x16\x6f\xea\x83\x30\xc5\xa1\x06\xea\x4d\x71\xd1\xbc\xc0\xe2\x23\x9f\xb9\x70\x5e\x1a\xfa\x5c\x7d\x73\xd7\x44\xf2\x7a\x6b\x02\x79\x55\xf0\x71\x53\x20\xaf\xb3\xe1\x5c\x87\xa6\xf1\x98\xde\x22\x7f\x56\x05\xda\x52\xca\xe9\xd5\x31\x09\xb7\x11\xc0\xbc\x82\xbb\x66\x36\x23\xbe\xbb\xcf\xba\x6e\x3a\x60\xa2\x59\x9b\x11\xb1\x2b\x44\xbc\x46\xc8\xf3\x2a\x22\x2e\x10\xeb\x33\xb1\xfc\x39\xb8\x7b\xa3\x87\xdb\x3f\x8a\x28\xe9\xb7\x10\x98\x2a\xb1\x7a\xc4\x8e\xd4\xbc\xd4\xd4\x3a\xac\x59\x05\xbf\x40\xa0\x9b\x40\x5f\x53\x88\x46\x4a\x6b\x2d\xc1\xd9\x74\xe0\x68\x7d\x28\x78\x7d\xdc\x88\x3f\x6b\xa4\xe9\x5f\x74\xd6\xe8\x05\x91\xa0\x75\xd1\xc8\x5b\x86\x82\x7b\x75\x28\xb8\x66\x36\x0e\x1b\x75\x84\x82\x1b\x1a\x78\xbd\x45\x28\x78\x79\xc8\xa8\x2b\x14\x9c\x36\x63\x80\x5f\x49\x33\x9d\xf1\xc1\x40\x5b\x27\xfb\xcd\xc3\x4d\x66\x8b\x33\x86\x55\x72\x86\x3b\xaa\x64\x03\x71\x32\xc7\x98\xa2\xca\xa4\xf0\x20\xfc\x55\x2a\x3c\xa0\x8e\x78\x10\xac\xb4\xf6\x8b\x25\x79\x59\x05\x2d\x1b\x0e\x60\x27\xdb\xef\x15\x46\x1a\x5a\xcd\x54\x1c\x8d\xa4\xae\xe7\xc1\x00\xd7\xbb\x60\x2b\x71\xd5\xb4\x64\x7b\x86\x0c\x70\x7b\xb7\xb0\xab\x66\xba\x52\x89\x59\xa6\x67\xc4\x60\x74\xd5\x64\x8c\xbd\x8e\xff\x90\x44\x81\x14\x6f\x1d\x72\x2a\x66\x80\x40\x2c\x46\x22\x05\xa7\xf3\x31\xf5\xe3\x48\x04\x4f\xb0\xd2\xda\xa3\x23\xfd\xef\xc0\x8f\x96\xdf\x5c\xdc\xad\x42\xe0\xdb\x08\x31\x5b\x53\xc5\xc0\x73\x27\xa6\xba\x02\xfd\x71\x15\x78\x03\x1a\xe1\xf5\xb4\x14\xe7\x6a\x03\xcc\x76\x1e\x7d\x9c\xa1\x51\x3a\x9f\x2a\xc7\xa3\xdf\xde\x8c\x8f\x47\xfb\x5d\xad\xd7\x5e\x34\xe9\xc6\xca\x16\xa9\x44\x77\x7d\x57\xc3\xbe\x56\x28\xc1\xba\xb6\x5a\xe8\xa9\x38\x3c\x3c\x38\x18\x0d\x4f\x47\xfb\x62\xaf\xfc\x2d\x56\x5d\x35\x1c\x59\x5e\x02\x76\xd2\x3b\xbe\x81\x79\xef\xfc\x0c\x2a\x97\xef\xc0\x19\x54\x7e\x7d\x45\xfe\xcd\xaf\xc0\x3e\x54\x4e\xc0\x9f\x50\xc9\xc0\x07\xa8\xec\x0f\xfe\x24\x7f\x5e\x5f\xbd\x24\x7f\x7e\x9d\xfe\x41\xfe\xfc\x79\xf3\x0a\xbc\x81\x0a\xfd\x9d\xfe\xf9\x8e\xfc\x19\xc1\xdf\x48\xf5\x4b\xf2\xcf\x33\xfa\xc1\xcf\x0f\x68\xb3\xbf\x92\x7f\xe7\xe0\x12\x2a\x87\x16\x79\x1f\x9e\xde\x90\x37\xa3\x5f\xc9\x43\x86\xdf\x92\x87\x77\xb4\xe8\x4b\x44\x4a\xe5\x57\xe4\xc3\xf0\xb5\x4d\x21\x7d\xf0\xc8\x9f\x4f\xfb\xcf\xc8\x9f\xab\xe9\xef\xe4\xcf\xcb\x3f\x0f\xc9\x9f\xe7\x16\x6d\xef\xe3\xf1\x11\xf9\x73\xf6\xe7\xe0\x02\xe4\xf8\x2e\x21\x9d\x12\x15\x76\x30\x91\xaa\xca\xf3\xcb\xf4\xaa\x50\x67\xbb\xff\x1a\x1e\xbe\x3e\xfa\xd7\xc5\xe7\x20\x4b\x32\xd4\xfb\x87\xa3\x3a\x9e\x13\x2d\x99\xe6\x3a\x27\xbe\x53\xbf\xb5\x7e\x72\xd1\x55\xff\x36\x0e\xf1\x75\x4f\xf3\x8c\xd9\xc7\xa5\x78\xb1\x94\x81\xbf\x94\x64\xf0\x07\xbb\xeb\xca\xf3\x3c\x83\x8b\xe7\xff\x7d\xfd\xa9\x0a\xa6\x66\x2c\xfe\x48\x08\x7b\xc5\x1d\x1e\x2d\x5f\x39\x2d\x2f\xa4\xd0\x4f\xc5\x21\xac\x5a\xb9\x6b\x5e\x5b\xcf\x59\xc5\x49\x92\x52\xed\x10\x25\x64\x97\x37\x59\x6c\xa5\x83\xd6\x9d\x35\xb1\xb9\xb3\x26\xe5\x7e\x31\x9d\x65\xe4\x4a\x9a\x8d\xa7\xfe\x15\x1c\x10\x9f\xea\x35\x8b\x61\xa8\x24\xd1\xe6\x8f\x7d\x40\xfc\xe3\x92\x48\xff\xc6\x24\x4a\x4f\x0b\xcf\xf6\x7e\x32\xe1\x06\x99\x38\x68\xa3\xd9\x33\x06\x8d\x27\x9a\x6e\x7c\x65\xa2\x15\xa7\xbd\xb7\x21\x9a\xb5\x8d\xed\x75\x6a\x9b\x5a\x9c\x96\xde\x6c\x53\xef\xa0\x32\x7c\xf1\x5a\x62\x87\x88\x28\x81\x3b\x82\x5f\xd2\x79\x92\x2c\x2b\xfc\x1b\xe7\xdf\xf4\x2e\x8f\x60\x19\x47\x52\xc5\xba\x78\x03\xeb\xe2\x35\xb6\xb3\xc5\x25\xd4\x21\xcc\xec\xf8\xd7\x36\x07\x67\x75\x97\x9f\x92\x7c\xf1\xe9\xaf\x15\x71\xcb\x72\x3a\x22\x8b\x85\xec\x21\x03\x5a\x75\xa3\x71\x18\x2c\xee\xe8\x46\xeb\x38\x6c\xe9\xbe\x15\x27\xaf\xe9\xb1\xd8\x26\xba\xed\x83\x79\x2b\xe7\xc3\x5a\xb6\xfd\xac\xfb\xac\x58\xe9\x5f\xb0\x8b\xb6\xa9\x2f\xc1\x5f\x7b\x8d\xb9\xf9\x60\x41\x3f\x95\x67\xbe\xa1\x72\x87\x8d\xb3\xee\xd2\x4c\x92\x0d\x8d\x1d\x22\x4b\xf0\xea\x21\x2e\x08\xf0\x43\x8e\x71\x55\x82\xcb\x9d\xdf\xc2\x6b\x2e\xe8\xed\x38\x5b\xf5\xed\x8e\xf3\x74\x9d\x50\x58\x17\x63\xd7\x0c\xa3\x0e\xe6\x08\xc1\x14\xb3\x78\xe6\x3e\x56\x8a\xf8\x38\x3e\xd8\x75\x4e\xfa\x77\xd4\x10\xbb\xb5\x91\x56\x9f\xd9\xa5\x7f\x87\x4c\x2a\x47\x37\x30\xc5\x47\x45\xc4\x1d\x3b\xb4\xb0\xee\x33\x77\x4a\x02\xd0\x43\x0f\xeb\x02\xf8\xe8\x47\x76\x52\x81\xf8\xaf\xcf\xfc\x38\x99\x23\x2e\xdc\x6f\x78\x78\xf0\x6c\xfc\xfc\x92\xc6\x22\x8f\x5f\x1f\x1d\x1e\x9f\x5e\x8e\x8e\x8f\x0f\x8f\x57\x2b\x9e\xcc\xe9\x22\xdc\xa6\x8a\xa3\x7d\xd0\x39\xbc\x7a\x62\xb9\x7a\x2f\x4c\xfc\x1c\x0a\x87\x27\x42\x4c\x4a\x09\xf8\xda\xc7\xf4\x2c\x38\xbb\xc1\xbf\x38\x40\x1e\x17\xc7\x2a\x84\x38\xc5\x59\x47\x3c\xc4\x38\x12\xd2\x4c\x08\xb2\xe9\xcc\xc7\xf1\x24\xe1\xda\x8b\x73\x61\x86\x60\x0e\x53\x0c\x8a\x56\x84\x2c\x85\xac\x1d\xda\x44\x1a\x0a\x54\xb9\xd2\x13\xd0\xc7\x30\x42\x30\xbf\x16\x0a\x15\xbc\xe4\x23\xb0\xbb\x89\xbe\x9e\x8d\x45\x74\x64\x71\xf4\x8a\x13\x91\x65\x19\xbf\xf6\x07\x54\xe6\x55\xfc\x1a\xee\x8a\x5f\x43\xf5\xa5\x96\x34\x1c\xec\x0e\x2a\xa9\xf5\x49\xc2\xb2\x2c\x4b\x68\xb1\xc0\xf2\x12\xe0\x75\xe1\x6b\xb8\x3b\x7c\x2d\xcb\x77\x29\x65\xee\x0d\x5f\xd3\xf5\x7b\xc2\xd7\x8a\x84\x2a\xd5\x5d\xb4\xdc\x16\xb9\xbf\x58\x48\x7e\xb1\x4c\x96\xe5\x25\x6b\x63\x9c\x40\xb6\xde\x15\x98\x7a\x18\x42\xd7\x80\xb6\xe6\xd9\x96\x19\x79\x86\xa1\x7b\xa1\xee\x99\x61\xe8\x9a\x51\x68\xd9\x96\xaf\x42\xdf\xb6\x58\x69\x57\xf3\x0c\xc3\xb0\x1d\xd7\xb5\x4c\xd3\x30\x1d\x43\x77\x7a\x84\xc3\x94\x19\xf4\xc0\xbe\xf0\x72\x3e\xa1\xb7\xfc\xc1\x7c\xfb\xc0\x36\xcc\x21\x1c\x2c\x16\x52\xb0\x8a\xf0\x07\x37\x17\x6e\x20\xa2\x2b\xbc\xfc\xf4\xaf\x58\xe1\x9b\x38\xaa\xa5\x05\x13\x55\x75\xc3\xc8\x31\xc2\xd0\x0e\x55\x55\x0b\x4d\xd5\xb3\x43\x4d\xd7\x5d\x7d\xe2\x86\x13\x13\x16\x1b\xfb\xb6\x69\x1b\x86\xa7\x5a\xae\xa5\xdb\xba\x6d\x68\xb6\xa5\x3e\x20\x06\x0f\x71\xa8\xe6\x8b\x85\x94\x3f\x0c\x55\xdf\x0d\x5c\x13\x5a\x91\x6f\x5a\x9a\xa1\x19\xaa\xa5\x7a\xd0\xf3\x74\x2d\xf0\x0d\x27\x54\x8d\x48\xb3\xac\x28\x34\xfc\x82\x39\xa6\x63\x1a\xa6\x66\x9b\x9e\x67\xb8\x9a\x67\xea\xae\xb7\x66\xf7\xaf\x13\xd5\x98\x43\xf5\x74\xb1\x90\x4e\x0b\x54\xcb\x90\x74\x21\xcb\x85\x24\xce\xb1\x10\x31\xb5\xd3\x81\xae\x15\xba\x1e\x8c\x42\x2b\xd0\x43\xd7\x70\x35\xdf\xf3\x43\xd3\xf1\x54\xdb\x85\x91\xee\x12\xf9\xf0\xfc\x89\x6b\xf8\x66\xb9\x59\xa9\xbb\xae\xa6\x19\xba\x63\x7a\x9e\xed\x98\xaa\xa7\x3d\x00\xdd\xf6\x3e\xba\x48\x53\x30\x88\x40\xa4\xcb\x9e\x02\x5b\xfc\xbc\xf5\x51\x4a\xef\xc1\x15\x51\x46\xb7\x9e\xe8\xeb\x62\xbb\x89\x6d\xde\x76\xd6\x0b\xfd\x94\xed\x8a\xaf\xaf\xc6\x76\xa2\xe0\x0d\xdd\x73\xd1\xc5\x0b\x00\xe9\x9a\x76\x39\x4e\x1b\xcb\xcf\x97\x8b\x85\x74\xb9\xca\x7b\x3e\xec\xd2\x57\x27\x91\x36\x09\x43\xdb\x32\x7c\xd3\x56\x23\xd3\x8e\x22\x43\x9b\x38\xc1\x04\xba\x96\x61\x44\x61\x18\xa8\x81\xe3\x17\xa5\x3d\xc7\x70\x3c\xd5\x53\x0d\xc3\x76\x6d\x5d\xd5\x8d\x35\x32\xf9\x97\x6e\xf3\x76\x6e\xe4\x7e\xd7\xf0\x90\xf6\x9b\x8e\xfd\xd4\xd5\x57\x3f\x69\xfa\x77\xdd\xbf\xd5\x3a\x4b\x71\x82\xfe\x1d\xa2\x38\xbe\x78\x4f\xb8\xf0\x15\x3a\xb7\x67\xaa\x6f\x06\x10\x03\x7a\x9c\xf7\x01\x1b\xc4\xdd\xdb\xc2\xe5\xa8\x2c\x67\x5c\xcd\xc6\x50\xe1\x0c\x94\x03\x8d\xed\x87\x11\x27\x0b\x7e\x14\x81\xa8\xd2\xdd\xe2\xa2\xd0\x2e\xdb\x25\x26\x9e\x06\xdb\x11\x2e\xb7\x81\xcf\x2b\x32\x16\x25\x57\xa1\x54\xad\x17\x37\xb4\x74\x29\x87\xa2\x68\x71\x96\x80\x5e\xa6\x37\x47\x01\x45\xa8\x54\x3a\xf9\x2c\x4e\x53\x88\x84\xe2\xef\x6e\x3e\x6d\x36\xd4\xd4\x3f\x5a\xf5\x4b\x6c\xea\x37\xb6\x9f\xc6\xde\xc5\x18\x4e\xf3\xd6\x1b\x02\x0b\xfb\x38\x0e\x9a\x5f\x82\x2c\xad\x76\x29\xf8\x5e\xc3\x8f\x41\xe2\xb3\xa0\xae\x5d\x8c\x62\x3f\xbd\x4a\x60\x0d\x9f\xcd\x43\xf8\x86\x30\xfc\x88\xc5\x0b\xea\x59\xdc\x8b\x74\xa1\x5c\xd7\x81\x2b\x45\x76\x15\x58\x5c\x87\xf7\x74\x33\x7e\x98\x64\x79\x19\x0b\x40\x7f\x35\xf8\x49\x8b\x5e\xc7\x61\x48\xf7\x83\x31\xa2\x71\x3f\x25\x7c\x56\xe1\x61\x1b\xc1\x74\x27\xe5\xac\xd8\x6a\x7c\xb8\xbc\x6c\x23\x26\x5a\x25\x20\xb5\xa8\x10\x11\xb9\x78\xdc\x26\x22\xdd\x08\x02\xbf\x43\xe0\x80\x6a\x15\xa5\xde\x3c\x01\x10\x77\x7e\x30\x00\xc6\xc0\xab\x3e\xd4\xfb\x33\x26\x10\xaf\xcd\x72\xb7\xe1\x64\xff\x46\xb2\x8a\xad\xc3\xc1\xab\x8c\x5e\x89\x94\xdf\xa5\x41\xc7\x65\x42\xce\x9a\x9d\x21\x6e\x5b\xd1\x6d\x6d\x0d\x79\x80\xbb\x23\x48\x5d\x77\x47\x90\xc6\x4f\x93\x9d\xba\xd3\x3a\x40\x78\xc3\xc6\x90\xbb\xcd\xbe\x90\x66\xd4\xfb\x42\xfc\xb6\x09\xd3\x69\x9d\xfb\x26\x59\xca\x02\x79\xab\x13\xa6\xe5\xbe\x09\x45\xd6\xe4\xb6\x8c\x38\x06\x59\x20\x26\xb8\xb6\xf7\xe0\xb4\xf6\xb6\x92\x66\xaf\xdf\x56\xe2\x6f\x53\xea\xb8\x6f\xa6\xdc\x66\x64\xa8\xd1\xfb\xb2\xd2\xc6\xfc\xab\xdc\x1c\xdf\xb8\xdd\xe9\x71\x7b\x49\xfa\x56\x7b\x49\xa5\x43\x59\x4c\xca\xaa\xad\xa4\x62\x03\x32\xc5\x40\x03\x8d\xd5\x8e\xd5\x5d\x3b\x5a\x50\x03\x59\x51\x90\x2d\x74\x68\xe6\xd7\xd8\x66\x62\x9b\x31\x6a\xbf\x5f\x66\x1c\x2b\x17\x99\xf2\xa7\xe4\x45\xaf\x7e\xae\xb3\x90\xe1\x6d\x57\x8a\xd7\x6c\xfc\x14\x17\x96\x1d\xac\x2c\x9e\x76\x36\xbc\x7e\x7d\x75\x4d\xe3\xeb\xb7\xc8\x8c\x6a\x61\xed\x0e\x2a\x49\xf0\x5e\xb2\x81\x07\xb0\x82\x3f\xa0\x33\x36\x1f\x91\xab\xa5\xb4\x7a\x4b\xc9\xde\xb0\x11\x55\x50\xa6\xaa\xe5\xdd\xb3\x11\x55\x52\x72\x65\xeb\xad\xb9\x89\x56\xe8\xc4\xc3\xbc\xec\xf8\xa6\xce\xb6\x0b\xdf\xbb\x3f\xd4\xd8\xc9\xb9\x77\x6f\x68\x75\xab\xa7\xdc\x0f\xda\xb4\xeb\x73\xf6\xe7\x80\xfc\x19\x7b\x9f\x8a\xcd\x9f\x0b\x30\x8b\x67\x04\x1b\x02\xfb\x86\xdf\xe7\x29\xa7\x0e\x5d\x9b\x34\x85\x94\xf4\x62\x1a\xe0\xbb\x3b\x49\xb2\xe0\xc3\x52\xe1\xbc\x98\xce\x9d\xa1\x39\xca\x33\xd4\xa3\xa7\x5e\x21\xda\xeb\x6a\x63\xef\x1a\x12\xf3\xd6\xd3\x54\xf5\x5f\x7b\x37\xc4\xb7\x0c\xfc\x64\xd7\x4f\xe2\xab\xb4\x87\xb3\xd9\x5e\xb1\xb9\xa4\xaa\x8e\xee\x1b\x7b\xb3\xc2\x32\xf6\x10\x4c\x7c\x42\xd4\x3d\x9c\xcd\x7a\xa6\x3b\xfb\xd8\xc0\x45\xa1\xfe\x54\x17\x46\x13\x3f\xf8\x70\x85\xb2\x79\x1a\xf6\xd2\x2c\x85\x7b\x13\x9a\x1d\x92\xfd\x9e\xf9\x21\x61\x5f\x4f\xdd\x8b\xb2\x14\xf7\xe2\xf4\x1a\xa2\x18\xef\x35\x3b\xb1\x54\x98\x09\xef\x6a\xfc\x26\xce\xe3\x49\x9c\xc4\xf8\xae\xc7\x0a\xb1\xed\x2c\xbc\x94\x64\xe0\x63\x7a\x6f\xba\xe3\xba\x8e\x0c\x02\xfa\xe0\x98\x9e\x6a\xca\x20\xa7\x0f\x9e\xe9\xa9\x96\x0c\x4e\xd9\x17\xcf\x22\xca\xec\x92\x3d\x68\x9a\x65\xc8\x60\xce\x1e\x54\xcd\x76\x64\x30\xc3\xeb\xd3\x02\xac\xe6\x2d\xe9\xba\x3e\x9e\xbf\x4f\x49\x78\x7f\x78\x30\x12\x34\xb1\x2c\x97\xff\xe2\x07\x1f\x60\x1a\xee\xfb\xd8\x6f\xde\x4b\xbf\x9a\xf1\x64\xbb\x96\xf5\x87\xb7\x6c\x6c\xd7\xb2\xf1\xc0\x96\xbb\xb2\xac\x80\x38\x2f\x92\x5f\xb5\x72\x26\xf0\x79\x0d\x4e\x69\xce\x07\xa1\x68\x41\x20\x2d\x88\x6b\xa0\x74\xe7\x64\xd9\x0e\xce\x9b\xd3\xc3\xd7\x04\x0e\x6d\x83\x00\x3a\x7c\x56\x5c\xd9\x78\xf8\x66\xbf\x6a\x4b\x38\x39\x1d\x0c\x5f\xae\x83\xcf\xe7\x75\xe9\xa2\xe3\x68\xa8\xd3\xc4\x09\x47\x83\xf1\xf1\xba\x36\x3a\x72\xbe\x94\xd5\xcf\x8e\x86\x02\xfb\x24\xb0\x4f\x0f\x16\x9d\x8e\xdc\x30\xeb\x1b\x7f\xa8\xf4\x74\xe4\x90\x59\xdf\xf8\x43\x05\xa8\x2b\xd7\x4c\xa3\x75\xf6\xed\x8b\x08\xb3\x92\x93\x66\x43\xf3\x8f\x22\xcd\x4a\xee\x9a\x0d\xcd\x3f\x94\x38\x7c\x8e\x9b\x4a\xa0\xdf\xeb\x02\x7b\x2f\x90\xa2\xc2\xf8\xe0\xe4\x74\x70\x30\x1c\xb1\xe4\x22\x8f\x6e\xdf\xa8\xdb\x37\x1e\xd1\xfe\xc5\x12\x84\xb8\x7f\x7e\x89\x95\x48\x19\xbe\x7a\x73\x72\x3a\x3a\x66\xa3\x85\xbe\x29\xdb\xa0\x37\x53\x5d\xee\x8f\xce\xba\x5e\x1f\x1d\x1f\xee\x83\x6d\xd4\xcb\x76\xca\x61\xd3\x10\xee\x52\xe9\x5b\x0c\xd7\x6d\x44\x97\x76\x8c\xd1\x8f\x5d\xa1\xd7\xe8\x64\x07\x64\xfd\x7e\xc8\xdd\x45\x56\xa5\x7a\x93\xec\x74\xd9\x83\x2d\x46\xf9\x36\xd2\xbe\x49\xa4\x28\x31\x18\xdb\x2e\x07\x6f\xf6\xc7\xa7\x97\xaf\x0e\x9f\x3f\x1f\x1f\x3c\x67\x5f\x5e\x0f\x86\x2f\xc6\x07\xa3\xcb\x17\xa3\xc1\xab\xd3\x17\x97\xc3\x17\xa3\xe1\xcb\x93\x92\xcd\x17\x60\x40\xcd\xb3\xae\xeb\x64\x22\x70\x40\x1f\x2c\x4b\xf5\x0c\x19\x8c\x98\xe1\xd6\x55\x5d\x97\x41\x44\x1f\x6c\xc3\x76\x34\x6e\x7b\xf3\xe4\x41\xb1\x08\x96\xdd\x8a\x45\xb0\x9c\x56\x2c\x82\xe5\xb6\x62\x11\x2c\xaf\x3b\x16\xc1\x56\x37\xc4\x22\xd8\x5a\x35\x5b\xb3\x1f\x18\x88\x60\x6f\x33\x21\xfb\xd2\x40\x04\xdb\x78\x6c\x20\x42\xb9\x09\xde\x11\x8c\xb0\xba\x23\x7e\x85\x3b\x6f\xef\xd6\xb6\x09\x42\xb0\xcd\xad\x82\x10\x6a\x60\x87\xdd\x1b\xea\xe5\x54\xdd\xb6\x8a\xf9\xe5\xca\x7d\xb0\x5c\x28\x00\xd7\xd8\x70\x15\xf3\xcd\x97\xc0\xd2\x49\x79\x75\x17\x37\x99\x94\x17\x85\x84\x59\xe2\xa7\x50\x48\xb3\xb0\x4e\x4e\x2d\xe0\xbb\x59\x63\xa6\xce\x07\x07\x73\x38\x8c\xbb\xa9\xb7\x55\x2e\x97\x07\x53\xef\xfd\xd7\xa4\xde\xe4\x07\xa0\xde\xf5\xda\x10\x18\xc3\xf8\x7a\x04\x7c\xe0\x0d\xc8\x07\xfe\x94\xe6\xa1\x43\xf3\xa0\x11\xbc\xd3\x88\x7a\xb9\x59\x1f\x89\xb6\xf1\x0e\x62\xdb\xde\x32\x16\x4c\x6b\x23\xd6\xbc\x9a\xf9\x34\xc6\x09\x1c\xfa\x39\x77\x11\x35\x8f\xe0\xd1\x63\x11\x74\xbe\x13\x82\xd3\x87\xc9\x5f\x81\x9d\xdb\x29\x47\xc7\xdd\xa3\x70\xab\x0c\x04\x0f\x1e\x85\xaf\x1e\x85\xb8\xd7\x89\xf8\xdd\xfa\x01\xf0\x15\x35\xc8\x37\xb8\x02\xfc\x79\x37\xc5\x4d\xf5\x5b\x50\xfc\x6c\x0d\xb0\xaf\xa8\x23\x6a\x60\xfb\x6b\x80\x59\xdf\x02\xd8\x9f\x0f\x09\x9e\xb3\xad\xaf\x15\x3c\x57\x5e\xb3\x4e\x43\xe4\x1e\x14\x3f\xf7\xe1\x31\xc2\xef\xa8\x9d\xc2\xff\xe6\x51\x6d\x69\x9d\x6d\x7d\x5c\x3b\x90\x4c\xef\xfb\x0f\xa4\x2b\x88\xcf\x66\x45\x56\xd7\x62\x1b\x59\x2a\x12\x64\x8a\x72\xf7\x80\x7a\xf6\x17\x4b\x42\x1c\xae\x95\x83\x20\x0e\xd1\xaa\x1c\xdc\xae\xa5\xb7\xa5\x6d\x41\x6f\x67\xbb\x34\x76\x5f\x46\x6f\x96\xb9\x74\x1d\xc1\x3f\xfd\xbd\x08\xfe\xb6\x5b\x2d\x39\xdb\xa4\x43\x7c\xb0\x5a\xfa\xed\x6b\x3a\x9a\xef\xbe\xd4\xd1\x64\xe9\x81\xef\xf3\x30\xa3\x0c\xd1\x0b\xf9\x84\xc1\xfb\x35\xde\xe6\x2f\xf7\x9c\x1e\x30\x5a\x94\x0c\x7d\xec\x27\x71\xde\x7d\xc4\xae\x4a\x5c\xe5\x70\x89\xab\x80\x53\x9f\xf0\x34\xd7\xec\xa4\x5a\x8d\x1d\xb8\x7a\x27\xd5\x06\x6f\xf1\xa6\x64\x2b\xf7\xee\xa4\x16\xa9\xfe\x8a\x43\x90\x4e\x63\xcb\xb7\xec\x8a\x08\x9c\xfa\x50\x9f\x07\x7e\xc3\x40\x03\x7c\x80\xb6\xd1\x6e\x52\xdb\x26\x15\x18\xdd\x5e\xd5\xc0\x3b\xbc\xf6\xa0\x9d\xbe\xba\x8d\xb8\xcd\x31\x88\xd5\x9d\xb0\xee\x54\xd1\xd5\x08\x37\x56\xc6\xd4\x7c\xfc\x81\x3f\x43\x85\x14\xff\x13\xa9\x4b\xea\xd0\xe3\xd8\x45\xce\xf3\x62\xc7\x91\x6d\x44\xd6\xe5\xab\xc6\x1a\x67\xd0\xaa\xbc\x2e\xdd\x6d\x75\x57\x1a\xd3\x1a\xf9\x75\x76\xfb\x2c\x43\x53\x7a\x10\x4c\x5a\x93\xf7\x5a\x94\x1b\x49\x62\xd6\x8c\x7b\xe7\x5b\x8c\xfb\xd7\x7f\x37\x77\xe4\xd7\xc7\xb8\x10\xae\xde\xa9\x1e\x5e\x3e\xaa\x2d\xa3\xb3\xad\x7f\xae\x35\x8f\xee\x57\x54\xd8\x1d\x83\xc8\xf8\x5a\xfe\xc8\x1f\x7f\x2f\xf3\xf8\xfb\x7a\x82\x6f\x33\x09\x7c\xbc\x3f\xf2\x10\x82\x6f\x76\x48\x20\xfa\x5b\x51\x1c\x6f\x83\xee\xaa\x5d\xd5\xef\x3b\xb8\x6e\xb4\x82\x93\x4c\xe0\xb6\x2e\x4d\x68\x99\x54\x7b\x8d\x49\x75\xc0\x3f\x37\xc5\x26\xdd\x6f\x52\x0b\xeb\x59\xc6\x26\xb9\x75\xee\x50\xaf\x66\x86\xc9\x45\x43\xa9\xe0\x8f\xce\x08\x23\xd3\xed\x30\xac\x1b\xd2\x8f\x96\x99\xe1\x36\x79\x49\x5d\xcb\xc3\x2d\xec\x35\xb3\xc3\xbd\xb1\xee\xcd\x25\x67\xb7\x73\xc9\x39\xc0\xe5\x96\xe7\xd7\xdd\x40\xa1\x79\x6b\x78\xa1\xab\xe0\xf7\x4d\xcc\xb0\xf4\x6d\x98\xa1\x6b\x1c\x37\xb8\x64\x72\x7a\x27\x3b\x74\x03\x40\xb4\x2d\x3b\x74\x73\x33\x3b\x74\x6b\x23\x3b\xf4\x7b\xf7\x10\xca\xfb\x15\x78\x76\xac\x4d\x48\xa7\x57\x8a\xc5\xd9\xe0\x0f\xdd\xcc\x82\x23\xaa\xc7\x99\xae\xd1\x2b\xd5\x62\x56\x83\xb9\x2b\x44\x88\x85\x60\x21\x25\x8a\x13\x0c\x11\x0c\x07\x9f\xf2\xc5\xa2\xe3\x65\xed\xd7\xe8\xcc\x39\x5a\xf7\x95\x5d\x93\x5e\x60\x91\xaf\xc0\xae\x15\x09\xaf\x17\xa9\x13\xf4\x3a\xbf\xaa\x2d\x51\xe3\xe0\xff\x7d\xbd\x66\xca\x74\xb5\xdb\x85\xbc\x7d\xc7\x7e\xf3\x78\x3c\xb8\xe3\xa5\x45\x58\x55\xae\x08\x75\x7b\x7d\x5f\x71\x2d\x83\x3b\xc1\x89\xbe\xe2\x6c\x2f\x5d\xc5\xfc\xaf\x9a\xed\x65\x1d\xf6\xa9\x71\x56\xdc\xfc\xea\x86\xca\x71\xbe\xc0\x50\xbd\xf8\xb2\xb9\xdf\x8a\xa1\x72\xdc\xfb\x0d\xd5\xeb\xaf\x62\xa8\x8a\x18\xe0\x5f\xd7\x4f\xfc\x8c\xfa\x46\x17\xcd\x00\x2f\xef\x2d\xb8\xe6\x96\x1d\x13\x60\x04\x74\x17\xd8\xab\x18\xf3\xd9\xc5\xad\x0e\x63\x67\xdf\x3f\x99\xaf\xaf\x09\xe2\x67\xf3\x9a\x0b\x1c\xee\x2a\x21\x6f\xdd\x95\x39\xea\x3a\x8b\xa7\x01\x84\xbe\x78\x46\xaf\x73\x17\x2c\x71\x57\x05\x19\xfc\x9c\xde\xe5\x62\xcd\x4d\x10\xa3\xfb\x27\xf5\xab\xc6\x6c\xed\xa4\x5e\xb7\x41\x8a\xb6\x9a\xd4\x83\xad\x66\xf7\x9b\xf4\x7a\xad\x57\xb7\xb4\x63\x48\x49\x69\xf9\x7b\xef\x5c\x41\xf7\xdd\xb9\xa2\x6d\x57\xaf\x95\xad\xf1\xf2\xcd\xc1\xf8\xb7\x37\xa3\xae\x76\xca\x59\x7f\x9c\x0f\xd9\xc6\xca\x51\xe2\xa7\x47\x28\x0b\xb7\xb2\x71\xdd\x8b\x03\x9c\xa5\x73\x57\x60\x6e\xb7\xd6\xa1\x7f\xc5\xb5\x0e\xbd\xbb\xd2\x03\xd6\x3a\xf4\xe6\x62\x47\xd2\x6d\xf6\xdc\x6f\xb2\x9b\xee\xff\xc5\xf3\xad\x07\x2f\x76\x04\x0f\x33\xad\x6c\x81\xc2\xeb\x5e\xa0\xc8\x1f\xd5\x96\xd9\xd9\xd6\x69\x07\x21\x19\xe3\xbc\xaf\xb8\x69\xf6\x2d\x17\x3b\x2e\xff\x5e\x53\xef\xf9\x7a\x82\x6f\xb3\x2c\xf8\x23\x2c\x76\xcc\xfe\x5e\x14\x0f\xbf\xdb\x62\x87\x67\x7d\x81\x0f\x79\x8a\xbe\xe6\x62\x87\x67\xdf\xef\x43\x5e\x6e\x3d\xbb\xfe\xdb\x2d\x76\x78\xb5\x37\xff\xa8\xc5\x8e\xf9\x26\x66\x3c\x7c\xb1\xc3\x73\x1b\x1e\x61\xf7\x62\xc7\xec\xff\xa5\xc5\x0e\x63\x4b\x27\xf1\xe1\x93\x7e\x63\xe3\xa4\xdf\xf8\x6b\x17\x3b\xea\x6e\x7f\xf5\xc5\x8e\x7b\xfb\xfd\x4d\x16\x3b\x06\xdd\x5e\x9f\xf7\x4d\x62\x89\x0e\xbe\xe6\x62\xc7\xe8\x47\x59\xec\x88\xbe\xff\x62\x87\xeb\x7e\x81\xa1\x4a\xbe\x6c\x5a\xbc\xba\x2a\xef\xdd\x6f\xa8\xfc\xaf\x62\xa8\x8a\xc5\x8e\x60\xfd\x84\xb8\xb9\xd8\x91\xdf\x5b\x70\xed\x62\x47\xf8\xfd\x17\x3b\x3c\xce\x9d\x79\xcc\x62\xc7\xe0\xab\x2e\x76\x78\xcd\x0b\x8f\xeb\xc5\x0e\x4f\xaf\x81\x9a\xe0\xe0\x2b\x2f\x76\x8c\xbe\xfb\x62\xc7\xb6\x76\xec\xff\xb9\xc5\x0e\xce\xd2\x3d\x6e\xb1\xc3\xf8\x8a\x8b\x1d\x46\x77\xa5\x07\x2c\x76\x18\x74\xb1\x83\x08\xca\x09\xea\xc8\xc7\xf9\x59\x0c\x7c\x14\xee\x96\x37\xda\x8b\x3d\xb8\x5c\x82\x2b\xd4\x3f\xdf\xe2\x94\x54\xd7\xf9\xa5\xc1\xfb\x4b\xe3\x02\x1c\xa2\xe2\x34\xd8\xd6\x67\xa1\x36\x1d\x58\xe2\x4f\x15\x5d\x80\x61\x1b\xb9\x6d\x8f\x6b\x6d\x71\xae\xaa\x79\x06\xea\x02\x8c\xd7\x40\x5b\x3d\xf9\xf5\x88\x33\x5a\x5d\x07\xaa\x2e\xc0\x7b\xd4\x3f\xbf\x28\xf3\xdb\x0e\x11\x18\x23\x19\x4c\x50\x5f\x92\x26\x68\xb1\x90\x26\xa8\xff\x79\x29\xcb\xca\xe8\xf7\xf1\x09\x69\xa4\x2f\x96\x89\xbf\x44\x30\x41\x32\xb8\x46\xad\x6b\x21\x1f\x72\x29\x24\x04\x71\x91\xbe\x79\xaf\x7d\x3b\xa4\x94\xf6\x71\x7d\x5b\x23\x80\x65\x32\x5b\x7a\xc0\xa7\x48\x78\xdd\x87\x20\xad\xf3\x34\xf7\x63\x90\x2a\x83\xa3\xa3\xcb\xd1\xfe\xf8\x74\x7c\x78\xd0\x9f\x63\xe5\xe8\x0a\xa4\xc4\xbb\x24\xb2\xd9\x9f\xa0\xaa\x27\x20\x2d\x15\x4d\xff\xfc\x82\x34\x52\x0f\x87\xfe\xe7\x3a\xd0\xa9\x77\x7e\x01\xea\xa5\xc0\xc6\x93\xd1\x3b\xbf\x58\x82\xb4\xe9\x27\xf7\x53\x78\x2b\x0c\x10\xf2\xef\xc8\x97\x86\x27\xd9\xf8\xc4\xf9\x9e\x0d\x70\x9f\x1b\xad\x11\x78\xcd\x46\x28\x4c\x0e\xa1\x87\x95\x37\xb6\x2a\x4f\x3a\xc5\x6e\x39\xef\x97\xd7\x06\xbc\x84\x77\x3d\x31\x2c\xc2\xe5\xa9\x05\xca\xa1\x8f\x82\xeb\xde\x13\x15\x14\x17\x00\x88\xfe\x1c\x67\x22\xe0\xf2\xa4\x94\x77\x3d\x8a\x20\x98\xe7\x38\x9b\x0e\xb3\xe9\xcc\x47\x44\xf1\xf2\x37\x0a\x2e\xc1\x34\x43\xf0\x14\x7e\xc4\x3d\x91\xfc\x12\x41\x9a\x1d\xc3\x7c\x9e\xe0\xfc\x19\x3d\xe7\x2f\x1e\x64\x02\x62\x2f\x84\x88\xbc\x79\x52\x42\x3f\x6a\xc2\x22\xaf\xca\x4f\x87\x29\x45\x99\x5d\x2f\x15\x24\xd0\x47\x87\x69\xe1\x91\x66\x69\xef\x89\x06\xa8\xfd\xdd\x67\x77\x3b\x64\x69\x4f\x4c\x30\x12\x49\xc7\xfd\x18\x5d\xf9\xb3\x19\x0c\xcf\x8e\x86\xfd\x27\x1a\x48\xbb\x6e\x23\x65\xb7\x42\x9e\x60\x38\x2b\xce\xef\xaf\xbd\x96\x74\xf5\x94\x7f\x35\xd4\x20\x94\xba\x6e\x2b\xed\x68\x79\xf5\xda\x52\xa5\xd1\xa4\x0c\x20\x94\x66\x78\xe5\xa5\xbc\x2c\x33\xc4\xdf\x9f\x6c\xfe\x1e\xc5\x09\xb9\x9b\x2a\xa9\x43\xd5\x17\x07\xef\xb5\x4d\xa7\x76\xb1\xd2\x71\x6e\xb7\xff\x44\x05\xb0\xba\x56\x33\xa3\x56\x93\xb7\x1b\xc3\xe2\x16\x9c\x76\xfe\x7f\xae\xd2\x3e\xbc\x79\x60\x1d\xe2\x4c\xc1\xf4\x34\xa3\x57\x77\xde\x93\xa5\xbe\x8b\x1f\xab\xf5\x1f\x71\x87\xec\x60\x7c\xfc\x7c\x70\x74\x34\xda\xa7\x1a\x98\x5d\x25\xbb\x72\x93\x6c\x43\xe8\xaa\x8b\x64\xc1\x10\x29\x51\x86\x46\x7e\x70\x2d\x35\xcb\x3c\x6d\x27\x4e\xa7\xc9\xd8\x8b\x8b\xd3\x24\x2c\xef\xa1\x22\x4f\xf9\x1c\x4a\xa2\x28\x03\xa4\x14\x7e\x81\x24\x2f\x7b\x4d\xe0\x8d\x7a\x0a\x4c\x8b\x52\x1d\x59\xe2\x1f\x70\x41\x2e\x69\xb8\x99\x96\xbc\xc3\xc0\xcb\x3b\x3b\x12\x5c\xd1\x9f\xe7\x17\x00\xae\x2a\x4e\xfa\x8e\x0e\x62\xf6\x86\xc8\x93\x24\x97\xef\x06\x9f\xf2\xfa\xa1\xa8\x22\xd1\x11\xb0\x9a\x85\x7f\x8b\xfe\x10\x16\x51\xcb\xdf\x7d\xe5\x6f\x69\x48\x2a\x1e\x95\x6f\x40\xf5\xed\x49\x9f\x37\x33\x3b\x3b\xab\x88\x01\xa8\xcc\x67\xa1\x8f\x61\xb5\x7a\x90\xaf\xf6\xa5\xd6\x12\x57\x08\x1c\x22\x32\xc2\xdf\x23\x59\xae\x84\x81\xc7\xa9\x4a\x02\xdf\x64\x63\x01\x82\xf0\x7f\x90\x86\x34\x5f\x7d\x8c\xef\xb6\x66\x6b\x2d\xa9\x2b\x3c\xdd\x40\xf1\xa5\x0c\x5e\xa3\x4e\x1c\x21\x4d\x1a\x41\xfc\xe5\xc3\x94\xa2\xc4\x06\xae\x84\x15\xff\x13\xe0\xef\xbc\x85\x85\x5d\x2c\xda\xfc\xe5\x6e\xf0\x9e\x15\x2a\x13\xef\xb3\x0f\x54\x7d\xe5\x6f\x63\x7c\x7d\x98\x26\x77\x87\x29\x64\x97\x64\xd1\xa2\x35\x7d\xdf\x76\xfa\xa7\x79\xd1\x20\xc0\xeb\xc2\xac\x09\x89\xb8\x1b\x9c\x0b\xda\x9c\x66\x85\xcb\xd1\xa5\x44\x28\x41\xc9\xdc\xad\x28\x73\x4c\xbb\x8b\x7c\xa4\xe4\x18\xce\x4e\x2a\xfa\x52\x47\xa6\x71\x39\x33\x73\xc4\x4e\x98\xac\x66\xe9\x33\x88\x83\x6b\x18\x16\xfd\xe7\x2e\x76\x2e\x98\xf6\x28\x18\x54\xa9\x13\xa1\x5e\x05\x53\x4f\x00\xbe\x0e\xa0\xd6\x54\x6a\x15\xe0\xe0\x53\x03\x14\xa7\xd9\xeb\x02\x5d\xea\x9c\xb6\x52\xba\x6b\xb0\x5d\xad\xa0\x57\x57\x55\xe6\x79\x52\xfd\x4e\x5b\x69\x6a\x9b\x52\xe0\xa4\xf6\x4c\x45\x80\x4a\x9c\xb3\x95\xd8\xa5\xcc\xfa\xb1\xa2\x96\x36\x54\x7e\xd2\xa8\x7c\xd5\x31\x2c\x48\xaf\x3a\xa4\x1d\x02\x5c\x19\x68\xa6\xbd\xa1\x2c\x97\xf0\x57\x06\xc0\x33\x94\x4d\x4f\xfc\x1b\xc8\x0a\x92\x11\xd8\x22\x4c\xc5\xe1\x2e\xd2\xc4\x91\x54\x11\x96\x39\xbe\x50\xc9\x33\x84\xa5\x02\x5c\x63\x96\xbb\x0f\x6f\x4a\x62\x6a\xfd\x7e\xbf\x59\xb1\x9c\x81\x36\xdf\x9e\xab\x17\xec\x16\xec\xa6\x21\xe8\xbe\xa4\x83\x3a\xf7\x73\xc8\x98\x44\xdc\x3d\x44\x5c\x33\xda\xd1\x35\x35\xc0\xf9\x19\x54\x3e\x8c\x4b\x67\x23\x64\x48\xb7\xa6\x08\x4a\x9c\x53\xf5\xc7\x4e\x3c\xbf\x8a\x73\xbc\xd2\x6b\xf9\x02\x60\x79\x09\x93\x1c\x16\xa6\xf4\xeb\xf7\xef\xe8\xf8\x70\xff\x81\x1d\xa4\x17\x94\x7c\xbd\x1e\x22\xb9\xbe\xd3\x3c\xaf\x2c\x05\x61\x2c\x3c\xcd\x88\x2f\xd6\xa1\xd5\xba\xfc\xa1\x35\x75\x5b\x6e\x11\xb3\xbd\x2d\x3b\xb7\x17\x65\x48\x62\x2e\x97\xba\x07\xff\xe7\x0a\x15\x94\xdd\x83\xff\xfe\x77\x29\x5e\x57\xe8\x1c\x5e\x80\x98\xb1\x20\xc3\xd7\x10\x0d\xde\xe7\xc4\xa5\xa1\x2f\x9a\x66\x8e\xf9\x38\x6c\x35\x27\x97\xb6\x26\xd7\x9b\x34\xfe\x73\x0e\x07\x9f\xa4\xf3\xd5\x36\xe3\x73\xf5\xa2\xc0\xbe\xf1\x56\xbb\x90\xc9\xff\xd5\x38\xa4\x7c\x23\x16\xe8\x04\x67\xa8\x18\x81\x12\x2e\x3e\xd3\x5b\xff\x39\x1f\x9e\x78\x23\xeb\xa9\xbf\x0f\x6f\x1e\xee\x97\x76\xb7\xb2\x2d\x1b\x40\xc7\x72\xcb\x56\xf7\xb6\x6c\xbb\x6c\xb2\xee\xca\x9d\x8b\xcd\x3e\x0c\xf1\x51\xd1\x94\x8d\x09\xac\xe0\xec\x04\x23\x4a\x3e\xf0\x44\xad\x94\x60\x61\x06\x76\x76\x1a\xc3\x94\x58\x16\x7e\x90\xd6\xf4\xa1\xac\x39\xf1\x23\x98\xdc\x75\xf9\xa0\x8d\x46\xcf\xd5\x0b\x16\xb1\xd2\xdb\xc8\xe7\xb5\xcd\x74\x73\xbe\x54\xca\x85\x28\x77\xa9\xe2\x82\x02\x57\xa8\x65\x52\xe8\x55\xfb\xf5\xed\x97\x4f\xfa\x7d\xc8\xb9\x27\xdd\x2e\x8c\x56\x64\x0d\xb9\x82\xb8\x9d\x9f\x40\x28\x85\x9b\xb3\x31\x9b\xa7\x80\xf7\x81\xd3\x1f\x0a\x6e\x83\x50\xdd\x07\xcb\xf8\x7a\xb0\x8c\x1a\x56\xe9\xd5\x6e\x1e\x87\x5d\x66\x9c\x97\x5e\xda\x0a\x2f\x75\x12\xe6\x5d\x49\xde\x5b\xde\x0c\xe8\xfd\x57\x03\x44\x66\x4a\x8f\xea\x14\xe4\x57\xa8\xce\xf9\xb1\x78\xd1\x35\x61\xdb\x50\x78\x75\x2a\xc7\x21\xda\x72\x7f\xda\x43\x03\x60\xf9\xb3\x28\x12\xa9\xdf\xd9\xa1\x7f\xf1\xce\x0e\xb3\x6e\x3c\x48\xb8\x8a\x14\x57\x82\xbd\xa2\xeb\x6e\x6c\x3e\x01\xda\x7e\x60\xa1\x5a\x56\x9b\x6c\xa2\xbe\x45\x9b\xcd\x9d\xe3\xee\x8e\x56\xb5\xba\x3b\x5b\x4a\xf2\x53\xdc\x56\x05\xdc\x25\xb8\xfe\x8d\x1f\x27\x3e\xbb\xac\xf2\x7d\x96\xd2\xe4\xb5\x7d\xaa\x1b\xd8\x0a\x5e\x65\x6b\x36\xce\x98\xd6\x78\x85\x8c\xe0\xbc\xef\xbc\x91\xda\x7b\x54\x13\x17\xea\x77\x67\xe7\x09\xad\xc0\x2f\x57\xec\xec\x6c\xd0\xc9\xe5\x98\xe5\x83\x1e\x88\x67\x3b\xf8\x24\x41\x19\x60\xa2\x92\xe3\x90\xad\x20\xa3\x6e\x5c\x1a\x54\xa7\xc8\xa0\x0a\x99\x6d\x00\xf3\xf5\x6b\xc8\xa8\x80\x5c\x5b\xee\x4e\x24\xd7\xcf\x39\xae\x90\x42\xaf\x8c\x3f\x8c\x24\x6e\x0d\xed\x7f\xd4\xa7\x52\x90\xa5\x79\x96\x40\x25\xc9\xae\x24\xf1\xed\xe0\xf8\x60\x7c\xf0\xbc\x27\xb4\x50\x21\x3c\x23\x7c\x65\x80\xc8\x2f\x49\x16\x10\x0c\x60\x7c\x03\x43\x61\x9e\x22\x18\x64\x57\x69\xfc\x09\x86\x82\xff\x89\xbb\x33\x5f\xc8\x22\x41\xfc\x37\x94\x69\x6c\x84\xdc\x1b\xa2\x73\x7c\xd1\xe8\x44\xbb\xc3\x3f\x7e\x2f\xc6\x8d\x5e\x6c\x9c\xe1\x77\x0d\x2c\x80\xca\xbb\xc4\xd8\x54\x90\x79\x09\xd5\xce\x01\x91\x83\xc1\xdb\x93\x6a\xba\x24\x7d\xf6\x3f\xf5\xf0\x52\x56\x66\xf1\x0c\x4a\x92\x0a\x0e\xa1\x72\x2c\x4b\xad\x15\x25\x99\x5b\x3c\xe1\xc7\x69\x1c\x49\x31\xbf\xa5\x70\x0e\x2f\xfa\xc5\x8d\xd0\x4f\x6f\xb2\x38\x14\xd4\x1e\x2e\xe7\x5a\xfc\xe8\x91\xe3\x35\xc2\x8a\xe8\x48\x90\xf7\xaa\x69\x4a\xda\x8f\xdb\xdb\x90\x4f\x63\xe2\x24\x36\xd6\x55\xd9\x15\xa5\xb1\x12\x36\x97\x4e\xe9\x6b\x90\xf5\x63\xd2\x73\xde\xb7\x41\x20\xee\x72\x63\x40\x2a\xef\xad\xc7\x2d\x23\xaa\xae\x2d\x3b\x90\x5d\xcc\x46\x97\x9a\xfc\x2b\xb8\x58\xc0\xfa\xe7\xaf\x27\x87\x07\x4a\x4e\xcd\x44\x1c\xdd\x11\xd9\xea\xb8\xc6\xad\x2f\xbe\xa1\xcb\x91\x02\xce\x84\x2a\x8f\xcc\xda\x70\x92\x5c\x11\xc4\x72\xe1\x8c\x18\x44\xe6\xc4\xf1\x5c\xc0\x17\xfd\xf5\xda\x71\x65\x3a\xbd\xd9\x6c\xb6\x74\xdc\x62\x31\xec\xb6\xa4\xe5\xf2\x6c\x14\xa7\x61\x3d\xe4\x6a\x40\x12\x06\x2b\x6b\xa0\xf2\x1e\x5c\xa7\xb2\x00\x7a\x8a\x94\x38\xec\x89\x22\xf1\x87\xc7\x5f\x02\xb1\x69\xab\xb6\x04\xc9\x59\xb4\xee\xb6\xbb\x8d\x1a\xa7\xbc\x57\xc4\x0d\xae\x77\x9c\xeb\x6d\x07\x02\xac\x7b\x85\x26\x88\x43\x44\xf4\x3d\x11\xad\x38\x24\xbf\x38\x1c\x57\xe7\x3d\x5b\x70\xb4\x3d\xa2\xbe\x64\x63\xfa\x81\xf7\x73\x6e\x3d\xb9\xfa\x8e\x1b\xc4\x8f\xbd\xa9\xf4\xe1\x5b\xdf\x6b\x57\x8e\xf9\x95\x92\xd6\x8c\x9b\x9f\x24\xc2\x4e\xc5\xb5\xb2\x28\x70\x51\x29\x86\xd5\xe5\xad\x9d\x9d\x4e\x5e\x3f\x8c\x87\x5b\xf3\xa2\x49\xc3\xef\xd9\x7b\xd0\xe1\x9f\x7d\xbf\x08\x87\x35\x1d\x5d\x3f\xf3\xd7\x78\xb5\xd3\x11\x85\xbf\x7e\x3a\x2d\x0e\xaf\xb3\x2c\x87\x82\x2f\x9c\x1d\x0d\x6b\xd3\x00\x81\x28\xe4\xb4\x05\xc1\xcf\xf3\x2c\x88\x7d\x0c\x43\x96\x4d\x0e\x5f\x43\xa1\x0c\x4d\x61\x59\x02\x39\x37\x5b\xf8\x94\xa5\xb0\x48\x39\xf8\x9f\x54\xe0\xfe\x63\x51\x59\x42\x9c\x97\xe5\x13\x08\x84\x59\x02\x7d\x02\x3c\x0c\x05\x5f\x10\xe5\x0e\xe8\x38\x63\x01\x8f\x2d\x20\x42\x86\x04\xb6\x11\x2c\xf8\x42\x0a\x6f\x29\xfe\x59\x4a\x30\x52\xc4\x6e\x62\x94\x11\xa8\x1b\xa8\xc1\xe5\xe9\x58\x4b\x10\x2e\x20\xb3\x4c\xae\xc8\xbe\xe4\x82\x8f\xe0\xa3\xba\xd7\x24\x55\x3e\x9f\xb0\xfc\x88\x5b\xf6\x31\xce\xcf\xd8\xb6\xda\xa8\x8a\x3b\xd9\x30\xf5\x2f\xb7\xe7\xfa\xfd\x6b\x58\x6d\xc1\xf1\xf4\x7a\x09\xef\x88\xbd\xe2\x5d\xc6\x0d\xcb\x31\x90\xaf\xba\xcf\x22\x21\x1e\x5b\x9d\x8a\x76\xd1\xc6\x21\x0a\x21\x5a\x9b\x40\x52\xa0\x1b\x30\xf3\x1c\xa2\xfd\x7a\x13\x86\xed\xe3\xe7\xb5\x06\xa0\x7b\xa0\xb4\xd3\xb7\xf1\x27\x1f\x51\x17\x1b\x54\xab\xd1\xf4\x29\xc4\x72\x99\x71\x72\x80\x95\x17\x95\x41\x85\x5d\x19\x27\xeb\xc9\x65\x0a\x6f\x25\xbc\x58\x40\x59\xba\x83\xca\x3b\xc3\x96\x0e\xb0\x72\xcc\x82\x07\x0d\x5b\x7a\x0e\x95\xe4\x48\x96\x97\x00\xae\xcb\x3f\x09\xdb\xf9\x27\x89\xaf\xb6\x9b\x43\x4c\x18\x78\x6f\xfe\x49\xcd\x56\x59\x02\x4a\xc3\xdb\x9c\x80\x12\xa4\x20\x03\x09\xf0\x41\x00\x72\x70\x0a\x2e\xc1\x2f\xe0\x05\x78\x0d\x7e\x05\x2f\xc1\x3f\xc1\x1f\xe0\x77\x00\x21\x40\x10\xc4\x10\xa4\x10\x64\x10\x24\x10\xf8\x10\x04\x04\x3f\x70\x0a\xc1\x25\x04\x73\x08\x66\xb0\x2b\x8f\xe5\x7c\xb1\x90\xe6\x45\xbe\xbd\xe2\xc2\x48\xa1\xc0\x3f\x67\x39\xf4\x74\xcf\x57\x3d\x27\xd4\xec\x89\x61\x45\xbe\xaf\xab\x9e\xea\xe8\x81\x1b\x46\xfe\x04\x46\x86\xa5\x3b\x7a\x60\x07\xce\xa4\x48\xad\x68\x19\xaa\xe6\xea\x86\xe5\xd8\xae\x65\xb9\x86\xe6\xe8\xdd\xb9\x0a\x0b\x8b\x24\x9c\x14\xb0\xb6\xc8\x60\x39\x5b\x2c\xa4\x59\x81\x6a\x08\x6f\x60\x92\xcd\xa6\x30\xc5\x2b\x37\xd7\x72\x39\x38\x2d\x2b\x0a\x4d\x5b\x53\x23\xd7\x83\x81\xa7\x5a\xae\xe9\x9b\xa1\x1a\x68\xa1\xed\xfb\x6a\xe8\xa9\x4e\x08\x75\xe8\x5a\x45\xfe\x4a\xcf\x75\x3c\x43\xf5\x0c\xc7\xb1\x3c\x53\x37\x4c\xcf\xed\x09\xfb\x1c\x18\x82\x60\x33\x4f\x65\xb8\x58\x48\x61\x07\x42\x5c\xf8\x50\x91\x9d\xd2\x77\x1d\x4f\x73\x68\xce\xc2\xc0\xd4\x2d\xe8\x7a\x7a\x38\xb1\xec\x20\x34\x2d\x3d\xb4\x6c\x2b\x08\x34\x68\x41\xad\x4a\x5a\xe8\xda\xa6\xe3\xb8\x86\x66\x19\xa6\xee\x69\x9e\xda\x13\x4e\xe2\xf4\x2a\x81\x1d\xb7\xf4\x2a\xc2\x31\x0c\xb2\xe9\x14\xa6\x61\x11\x5b\xee\x0b\x3c\x32\x30\xbd\x89\x51\x96\x92\xdf\x4a\xd1\x07\x3e\x81\xe5\x60\xb1\x90\x06\x45\x1f\xc8\x8c\x6a\x5e\x1c\x4e\x5c\x47\xd3\x89\xe6\xe8\x91\xe6\xc2\x28\x70\x1d\xcd\xf5\xb5\x09\x84\x13\xdb\xb5\x7c\x18\xf9\x30\x0c\x6c\xdb\x99\xa8\x81\x0b\x3d\xb5\xc8\x5c\x69\x6b\xaa\xaa\xba\x8e\xa6\x7a\x8e\xe5\x78\x96\xe5\xf5\x84\xa3\x1a\x0a\x43\x27\xe5\xd0\x39\x58\x2c\xa4\x83\x36\x3a\x2d\x8a\x7a\xde\xc4\xf3\x54\x47\xd5\x34\xd7\x0c\x27\x10\xba\x13\x5b\xf5\xad\xd0\x52\x6d\x2d\x34\xf5\xd0\x9e\x78\x2a\x8c\x34\xdf\x28\x52\x93\x3a\x9e\xa1\xbb\x9e\x6b\x69\xa6\x6e\xa8\x8e\xa6\x19\x56\x4f\x38\xbd\x46\xb0\x8b\xa0\x79\x17\x45\x39\x5c\x3a\x08\x9a\x71\x3d\x18\x2d\x16\xd2\xa8\xe8\x41\xf3\x0c\x00\x97\xc5\x32\xd0\x20\x74\x0c\xcd\x37\x27\x7a\x10\x3a\xbe\xe5\x1b\xbe\x6e\x38\x8e\x17\xe8\xd0\xb7\x74\xc7\x57\x55\x3f\x74\x82\xa8\xa4\xa2\x6a\x6b\x9e\xa1\x59\xa4\x13\xa6\x6b\x7b\xba\x65\xf7\x9a\xa1\x48\x7f\x71\x02\xcb\xc2\xfd\x20\x4e\x05\x0b\xa7\x9b\x23\x9f\x1d\x64\xa0\x47\x1d\xba\xa8\x2c\x9c\xbd\xce\x85\x10\xce\x60\x4a\x33\xb9\x65\x29\x2d\x07\x3f\xce\x98\x4b\x92\xce\xa7\x13\x88\x84\x2c\xa2\x93\xe0\x24\xf3\x43\xa1\xd0\x4e\x39\x31\xb7\x53\x3f\xf5\xaf\xa0\xf2\x2d\x93\x64\xfe\x43\x73\x5b\x49\x31\xbd\x76\xfa\xc9\xd5\x57\x3f\xe9\xea\x63\x92\x62\x6e\x99\x02\x53\xef\x4a\x9e\x59\x21\x2a\x83\x84\x13\xc4\x68\xb1\x90\xa2\xff\x0a\xe2\xdf\x5f\x10\x4d\x63\x55\x7e\x4c\xb3\x25\x04\xad\x57\x3f\x99\xd6\x37\x14\xc4\xba\x71\x1e\x07\xa3\x12\x44\x9f\x13\xc4\x93\xc5\x42\x3a\x59\x71\x31\x52\x7f\xda\x90\x43\x3b\x84\xa6\xe9\x7a\x91\xe6\x44\xd0\x09\x3c\x43\x33\x4c\x37\x08\x26\xa6\xee\x1b\x93\x89\x65\x19\xbe\x3e\x09\x2d\xd3\x29\x2c\xa4\xe5\xb9\xb6\xed\xe9\x9a\xa5\x1a\xaa\xee\xda\x86\x69\x7a\xff\x4d\xeb\xdb\x4e\xeb\x6b\xb7\xdf\xb4\x99\xd6\x7a\xf5\x93\xfd\x7d\xd3\xfa\xda\x5d\xa5\xec\xda\x05\x0c\x38\x51\xba\x5a\x2c\xa4\xab\x2e\x51\xa2\xb1\x0f\xc2\x34\xbf\x2a\xf2\xa9\x4f\x7c\x38\x81\x1a\xf4\x0c\xc3\xb7\x9c\x89\x17\x99\x96\x16\x85\x9e\xe7\xa8\xba\x6f\xf8\xb6\x13\xaa\x81\x17\x4e\xcc\xa8\x48\x07\x6e\x6b\x8e\x6e\x5b\x86\xad\xd9\xae\xad\xaa\x8e\xa3\x76\x8b\xd3\x90\x87\x38\x9d\xe7\x58\xc8\xb1\x8f\x30\xcd\xb0\x0f\xd3\x62\x66\xed\x0b\x09\xc4\xa4\x54\x86\x0a\xe5\x01\x58\x0a\x7e\x9f\x79\x55\x7e\x9c\x0a\x59\x9a\xdc\x09\x49\x76\x0b\x51\x40\xa6\x96\xac\x42\x0e\x8a\xf2\x39\xab\x70\x7d\x37\xbb\x86\x69\xae\xac\xf1\x8c\x73\x8e\x2c\x87\x8b\x85\x74\xb8\x05\x59\xb4\x50\x53\x75\x23\xf0\x1c\x57\xb7\x6d\xc3\x0d\x34\x53\x75\x6c\xd3\x0d\x1c\x5d\x75\x23\x0b\xfa\xba\x1a\x4c\x02\x4b\x0f\x4a\xe7\xcd\x55\x3d\xcb\xd0\x6c\xc7\xf6\x4c\xd7\x71\x74\xcf\xd9\x48\x96\x83\x8a\x2c\x69\x86\x85\x38\x0d\x92\x79\x08\x85\xdb\xeb\x18\xc3\x7c\xe6\x07\x50\xa0\xce\x53\xb8\xb6\x47\xa7\x5c\x8f\x86\x8b\x85\x34\xec\xea\x51\x75\x8a\xb2\xea\x54\x18\x39\x8e\x6a\xab\x9e\x65\x4d\x26\x5e\xe0\x78\x66\xa8\x87\xb6\x1b\x4d\xf4\xc0\xf1\x1d\x73\xe2\x99\x11\x0c\x5d\x6d\xe2\xb2\xd2\x86\xe6\x39\xae\x6b\xb9\xba\xa6\x39\xba\xa3\x5b\xa6\x66\xaf\x30\xb6\x91\xe7\x82\xba\x77\x97\x1c\x62\xe3\xc5\x42\x1a\x17\x88\x8d\x86\xba\xf0\x01\xde\x09\x33\x3f\x46\xbc\x32\xf3\x9d\xc8\xd3\xad\xc8\xb2\x75\xe8\x38\xaa\xef\x84\x4e\xe8\xc1\x30\x98\xe8\xbe\x1f\x4e\x42\x1b\x3a\xbe\xa7\x05\x66\x39\xef\xb0\x5d\x55\xd3\x09\x8d\x5d\xcf\xd6\x1d\xdd\x56\xdd\x35\xc9\xe8\xff\x52\x65\x76\x7a\x0d\x19\x79\xb2\x48\xf0\x05\x5d\x35\xdd\xdd\x49\x8c\x85\x93\x93\x17\xbb\xba\x70\x7c\x32\x10\xd8\xc2\x7e\x4d\x0f\x7c\xed\x63\xe1\x2e\x9b\x0b\xd7\xfe\x0d\x14\xfc\x04\x41\x3f\xbc\x13\xe2\xe9\x2c\x43\xc4\xae\xe2\x8c\x7c\x44\x6c\xed\x29\x08\xb2\x39\xf5\xa6\xbf\xa3\x72\x74\xf4\xd6\x9b\x55\x3b\xfb\x73\xfb\xd5\x4f\x8e\xf9\x0d\xad\x6a\xdd\x38\x8f\x83\x5e\x8d\x90\x5f\x38\x41\x7c\xbf\x58\x48\xef\xbb\x04\xb1\x3d\x42\x7c\x55\x87\x8e\xed\x4f\x7c\x27\xd0\x5d\xdf\xd7\x6c\xcf\xb5\xac\x48\x75\x3d\x2d\x72\x02\x5d\x57\x6d\xc7\x77\x26\xe1\xc4\x2b\xe6\xfb\xba\xa3\x9a\xa6\x6b\xab\xae\xe5\x19\x44\x43\x78\x5a\x4f\x68\x40\x08\xfc\x94\x8c\xf0\x09\x14\xe0\x74\x86\xef\x8a\x51\xf2\x82\x43\x6e\xb2\x58\x48\x93\x95\xe1\xcb\xe2\xed\x85\xa9\x1f\x5c\xc7\x29\x14\xae\xa1\x9f\xe0\x6b\x21\xb8\x86\xc1\x87\x42\x0d\x93\x49\x5b\x68\x79\x9a\xe1\xf9\x56\xe8\x9a\xf6\xc4\x71\x34\x68\x9a\xba\x6f\x05\x86\x6b\x39\xea\x24\x34\x20\xac\x52\xfb\xab\x8e\xe5\xa8\x86\xa1\x1b\x9e\xee\xd9\x8e\xe5\x9a\xf6\x0f\x38\x6c\x46\xac\xd3\xaf\x8b\x4e\xbf\x60\x9d\x1e\x92\x4e\x53\xff\xb1\xc8\x5b\xcb\x3c\xd1\x82\x24\xd3\x2c\x8d\x71\x86\x38\x6f\xb4\xf6\x38\xcb\x41\x15\xc2\x59\x92\xdd\x95\x6b\xb9\x71\xde\xed\x6c\x14\xf5\xbe\xef\xc0\x72\x5b\xee\xaa\xdb\x76\x57\x5b\xaf\x7e\x72\x1f\xe5\xae\x3e\xda\xeb\x70\xbb\x1c\x58\xb7\x76\x60\x5f\x73\xd2\x7c\xbd\x58\x48\xd7\x2b\xd2\xcc\xe7\xd7\x14\x8a\xdc\x6a\x85\x3d\x82\xaa\xa1\x9b\x86\x36\x51\x23\xdb\xf0\x27\x96\x66\x9b\x61\x10\x19\x9e\x1a\xf9\x6e\xa0\x9a\x9a\x17\x6a\x21\x74\x9c\x62\x69\xc2\x53\x4d\xcf\x36\x4c\x4b\x77\x4c\xd7\xf1\x2c\xc3\x70\xbb\xd7\xcb\xfe\x5a\x31\x1e\x53\x63\x4e\x24\x72\xe2\xe7\x74\x42\x75\x9d\xe5\x38\x17\xe2\x94\x69\xf1\xb3\xa3\x21\xbf\x2e\x52\x8c\xf5\x9c\x8a\x2a\xce\x84\x1c\x06\x73\x04\x93\x3b\xe2\x00\xa5\x30\xc0\x95\xf6\x7f\x15\xa7\xf3\x8f\xd5\xde\x76\x4e\xe5\x39\x9b\x63\x32\xfd\xca\x72\x02\x8e\x96\xe2\x5b\xa6\x6b\xed\x50\x18\xa7\x18\xa2\x14\x7e\x67\x9b\xe1\xad\x4a\xed\x3f\x3c\xab\x25\x44\xad\x57\x3f\x79\xf6\x37\xb4\x19\x75\xe3\x3c\x0e\x66\x25\xc8\xbf\x72\x82\x7c\xb3\x58\x48\x37\x2b\x82\xbc\x2e\x69\x6b\xe1\x2e\x4d\x9c\xc0\xb3\x6d\x2d\xb2\x22\xe8\x1a\x16\x0c\xc3\x89\xeb\x18\xb6\x03\x3d\x5d\x35\xc2\xc8\xd1\xe0\x24\x84\xaa\x57\x78\x8c\xa6\xa5\xdb\x9a\xad\x69\xa6\x6a\xa9\x9a\xe5\x58\xb6\x6e\xfd\x80\xc2\x7c\x4a\xf4\xe5\x30\xc9\xe6\xe1\xb3\x0c\x4d\xd9\xfa\x40\x8e\xfd\xe0\x43\xb1\x4d\x93\x53\x09\x8b\x43\x98\xe2\x18\xdf\x51\x5f\xdc\x0f\x02\x98\xe7\xc5\x6c\x9f\xca\xa1\x34\x1e\xbc\x96\x05\x04\xf3\x6c\x8e\x02\x58\x68\xe6\x53\x3f\xfd\x34\x17\x52\x08\x43\xaa\xdc\x0b\x25\x4d\x1a\x40\xf3\xb4\xd6\xe2\x59\x2a\x0c\xa6\xfe\xa7\x2c\x15\xde\xc2\x89\x50\x9e\xb6\x51\xa8\x8f\x45\xd8\x31\xcf\x21\xe7\x3f\x95\x26\x02\x67\x45\xfb\xb7\xd7\x90\x0e\xbb\x72\x57\x89\x60\xdb\xd9\x1d\xea\x8b\x53\xf7\x6b\x06\xd1\x34\xce\xf3\x38\x4b\xb9\x55\x0b\x61\x3c\x78\x5d\xf7\x00\x08\xf9\x3c\xb8\x16\xfc\x9c\xbe\x9e\x65\x49\x1c\xc4\xe4\x2d\xca\x12\x58\xcc\x48\xaa\x55\xa4\x19\xca\xa2\x38\x21\x28\xbf\xcb\x58\x7f\x49\xab\x05\x3a\x74\x72\x93\xa5\x6b\x70\x9a\xc1\xbf\xd0\xe7\xd3\xd4\xf6\x9a\x9e\xda\xb1\xa8\xd7\x7a\xf7\x93\xa6\x7d\xcb\x65\x3d\xae\xf5\x06\x1a\xf5\xc2\xde\x4b\x6e\x14\x1f\x2d\x16\xd2\x51\x31\x8a\xdb\x3b\xaa\xdc\x3c\x44\x77\x8d\xc0\x0a\x26\xe1\xc4\x82\xb6\xea\x78\xea\x24\x34\x27\xbe\xae\x05\x56\xe8\xaa\xa1\x1e\x6a\x8e\xae\xd9\x13\x43\x0b\x8b\xa1\xee\x6a\xb6\x66\x3a\x9e\xee\x6a\xae\xe6\xa9\x86\xad\x19\x3f\xe0\xe0\x2d\x77\xba\xd3\xee\x5d\x6b\x41\x22\xaf\xab\xbd\x57\x59\xe1\x6e\xe7\xf1\xd3\x8e\xf2\x51\x8c\x72\xdc\xba\x9e\xa7\x08\xc1\x22\xb5\xca\x6b\x00\xca\x09\x0e\x19\x08\x45\x48\x51\xb9\x63\xfc\x9d\x85\x58\x6f\x09\x9e\xa6\xaf\x4e\x66\x7e\xee\x78\xf7\x93\xa6\x1b\xdf\x52\x88\xeb\xd6\x1b\x68\x68\x95\x10\xff\x93\x13\xe2\xe9\x62\x21\x4d\xd7\x0a\x71\x7b\x0e\xe3\x4d\x02\x3b\xb4\x4d\xc3\xf5\x54\x27\x34\x3c\xdb\x0a\x88\x3b\xa5\xab\x7a\x68\xb8\x9a\x11\x99\xaa\x66\x6b\xf6\xc4\x2f\x56\x74\xc8\x0c\xc7\xf1\x34\xdb\xb0\x6c\xcf\xb0\x74\x55\x57\xb5\xde\x7d\x92\xd0\x9e\xf7\xff\xc1\xe1\x7b\xbc\x58\x48\xc7\x6b\xf1\x9d\xd3\x63\x36\x35\xb6\x86\x65\x9b\x2e\x31\x91\x81\xe7\x3a\x56\xe8\x9b\x9e\x6e\x4e\x34\x5f\xd7\x3d\x43\x55\x75\xc7\xb3\x55\xd7\x70\x6c\xd3\x2d\xb7\xa7\x4c\xcb\x36\x75\x4b\x35\x2d\x4b\xf3\x5c\xd3\x32\xb5\x9e\x30\x68\x01\xc9\xcb\x53\xfd\x4c\xb1\x4f\x2a\xb0\x0c\xdb\xdf\x39\x6c\x5f\x2d\x16\xd2\xab\x02\xdb\x9b\x59\x50\xca\x6e\x11\xaf\xc0\x2f\x55\x68\x13\x27\xd4\x4c\xd3\xf4\x26\x2e\xa5\x68\x64\xb9\x74\x92\x35\xb1\x5d\xdb\x0b\x22\xd5\x35\xc2\x68\x62\x9a\xc5\xba\xab\xab\x5a\x9e\xeb\xda\x9e\xaa\xe9\xaa\xe5\x9a\x9a\xfa\x23\xaa\x88\xbf\x7c\xdd\x55\x33\x5a\x7e\xa2\x66\xb4\x1d\xc5\xf6\xbb\x9f\x34\xe3\x51\xae\xe2\xa3\x67\x41\x1c\xbc\x06\x62\xb5\xfb\x08\xf9\x60\x81\xbb\xc5\x42\xba\xe3\xc5\xaa\xa1\x07\x79\xb9\x8a\xcc\xd0\x75\x9d\xd0\xb1\x0c\x3d\xd2\xc8\xb4\x66\xe2\x86\xa6\xa3\xea\xba\x6d\xd9\xa1\x35\x09\x26\x9e\xe1\x5a\xba\x6b\x17\x72\xa5\xd9\x9a\xe5\x7a\x96\xa3\xea\xa6\xab\x6a\x96\x67\xfe\x57\xae\xba\xe4\xca\x74\xda\xaf\x56\x3d\x9a\x9f\x3b\xde\xfd\xa4\x99\xde\xf7\x95\xab\x1a\x5e\x03\x31\xa7\x92\x2b\xc4\xcb\xd5\xf3\xc5\x42\x7a\x5e\xc8\xd5\xfa\x3b\xf4\x78\xf1\x72\xa3\xc8\x35\xa2\x28\x84\x81\x66\xab\xaa\xed\x07\x9e\xef\x7b\x91\xea\x4f\x02\x1f\xaa\x6a\x68\x4e\xa0\xaa\x85\xe6\xa4\xf0\x83\x4c\x5d\x73\x75\xdd\x26\x7a\xd6\xb3\x1d\xd3\x71\x7f\x44\xf1\xda\xb8\x77\xc9\x51\x25\xe7\x2f\x10\xfc\xbe\xae\x47\x4b\xad\xb5\x95\x5a\x4b\xa5\x7d\xcb\xb9\x6f\x97\xf2\xaa\x55\x57\xcc\x8b\xd8\xd9\x62\x21\x9d\x6d\xe3\x34\x7b\xa1\x6b\x3b\x0e\xf4\x2c\xdd\xd2\x74\x68\x18\xda\xc4\x36\x7d\xd5\xf4\x42\xd7\x77\x6d\xdf\x9b\x68\x81\x6d\x44\x61\x50\x38\xcd\xba\x65\x5b\xaa\xe5\xe8\xb6\xa6\xea\xaa\xeb\x10\x19\xfb\x71\x45\xeb\xff\x61\xa7\x79\x55\x2c\xff\x61\xb7\x04\x67\xf5\xcd\x4f\xce\xb7\x5c\xe9\xef\x28\x64\x55\x92\x9b\xf2\x92\xbb\xbf\x58\x48\xfb\x3f\xb8\xa7\x9c\xf1\x08\xff\xb9\x58\x48\x7f\xfe\xd0\xae\x72\xc2\xa3\xfb\x61\xb1\x90\x3e\x6c\xe3\x2b\xbb\xba\x61\xe8\x7a\xe4\x38\xba\x6f\x5a\x6a\x10\xc2\xc0\xb3\x4d\xcb\x74\x4d\xcf\xd3\x7c\xcf\x83\x6a\x18\x46\x9a\x09\x9d\x62\x7f\xc2\x70\x5d\xc7\x71\x3d\xc7\xb3\x4c\xdb\x34\x2c\x4d\xfd\x01\x15\xc3\x5f\xee\xd2\x7c\xb7\x71\xf9\x68\x57\x66\xf3\x48\xf5\x79\x49\x7a\xb3\x58\x48\x6f\xb6\x73\x8f\x3d\x5f\x0f\x75\xd3\x74\x22\xdf\xf3\xcd\x48\x77\x55\x68\x85\x81\x69\xa8\xba\x09\x2d\x4d\x83\x93\x28\xd4\x8d\xd0\x28\x44\xc9\xd4\x1c\xdb\x32\x2d\x43\x37\x89\xe4\xeb\x0e\x1d\xa3\xff\x95\xa5\x96\x2f\xfc\x3d\x03\xf6\x1e\x2d\x4f\xf7\x85\xf0\x05\xbc\x44\x7d\x5c\x2c\xa4\x8f\x0f\x71\x8c\xa1\xe9\x79\x44\xfd\xfb\x6e\x68\xdb\xaa\xa1\xd9\x66\x34\xb1\x34\x6b\x02\x23\xcd\xb4\x1d\x5b\x53\x4d\xdb\x77\x42\xbb\x08\xe6\xd5\x4c\xcf\x52\x2d\x4f\x37\x4d\xa2\xf7\x0d\xd5\xd3\x7e\xc4\xd0\x83\xbf\x81\x63\xdc\x92\xaa\x7f\xe8\xab\x65\x7e\x6e\xbf\xfa\x49\xd7\xbe\x65\xac\x68\xbb\x31\x4e\xfc\x65\x90\xf3\x82\xf6\x6c\xb1\x90\x9e\x6d\xb5\xa6\x6c\xfb\x7e\xe4\x4e\x1c\x2f\x50\x3d\x18\x38\xa6\x1e\x5a\xa1\xea\x86\x93\x89\xab\x43\xdf\xf4\x2c\xcd\xf2\x42\xcf\x37\x8a\x89\xbd\xe6\xa9\xba\xaa\xba\xba\xeb\xb8\xa6\xa1\x7a\xa6\xe5\xfe\x88\x56\xf0\xbf\xee\xf1\xdf\xcb\x3d\x3e\xe5\x25\xf7\x76\xb1\x90\x6e\x7f\x70\xf7\xf8\x92\x47\xf8\xd3\x62\x21\x7d\xfa\xa1\xdd\xe3\x39\x8f\xee\xdb\xc5\x42\x7a\xbb\x8d\x7b\x1c\xa9\x9a\xee\xc2\x48\x73\x7c\x35\x0c\xfc\xc8\x70\x1d\x4b\x33\x26\x01\xb4\xb5\x89\x66\x18\x91\x19\xaa\xb6\x1d\x4d\x0c\xbd\x5c\xf2\xb3\x5c\xc3\x70\x5d\xdd\xb4\x0c\x4b\x33\x6c\xd7\x76\x7f\x40\xcd\xf0\x97\xfb\x34\x7f\x77\xff\x78\xc6\x8b\xd2\x6f\x8b\x85\xf4\xdb\x56\xfe\xb1\x19\x41\x0b\xda\x86\x1d\x86\xba\x19\xaa\x81\xae\x43\x4b\xf5\x54\x37\x80\x46\x60\xea\x8e\x67\x42\x1f\x3a\x81\xe5\x4e\xea\x6d\x09\xcd\xd2\x34\xd7\xd4\x35\xdb\x74\x5d\xdb\xfc\xaf\x2c\xfd\x5f\xeb\x1f\x9f\x9f\x1b\x40\xac\xee\x21\x14\x2f\xc0\xb9\x18\x24\x7e\x9e\x8b\x40\xf4\x13\x88\xb0\x40\xff\xdd\x0d\xfd\xf4\x0a\x22\x11\x88\x28\x4b\x60\xf9\x4d\x04\x26\x60\x97\xfc\x93\x6a\x3e\x8a\xfd\xdd\x04\xde\xc0\x44\x04\xa2\x2e\x5e\x00\x08\xce\x8b\x64\x21\x28\xbb\x15\x81\x18\xc5\x1f\x77\x3f\xd1\x3b\x61\x76\x35\x55\x25\x75\xaa\x5c\x22\xc9\x6e\x72\xb5\x6b\x8b\xf5\xa3\xa6\xd3\x36\x0b\x68\x69\x96\x42\x91\x66\x8b\xf2\x51\x48\x4b\xc5\xc1\x07\x7f\x42\xbe\x19\x04\x83\x61\x81\x31\x7d\x5f\x36\xec\xa3\x70\x77\x92\x64\xec\x85\x98\x5f\xfb\x33\xd2\x54\x90\x4d\x67\x73\x4c\xbb\x92\xc7\x9f\xc8\x1b\x47\xaf\x9a\x66\x79\x3b\xb8\xfa\xf4\xa4\x9e\x78\x01\x30\xf7\x0a\x7e\xc4\xe2\x05\x40\xf5\x9b\x28\xcb\x48\x83\x17\x8d\xee\xb6\x7a\x67\xad\xf6\x2e\xab\x68\x16\xdf\x50\x92\xe6\x39\x44\xb8\xf8\xad\x69\x77\xc5\x31\xf5\x53\x14\x5f\x31\xd2\x13\x94\x8b\x5e\xc4\x69\x94\xed\x06\x31\x0a\x28\x79\x8a\x8e\xe8\x7a\xc1\x3e\x74\x94\xe5\x31\xbb\xa6\x49\xc4\xd9\x6c\x17\xc5\x57\xd7\x98\x81\x3f\x61\x45\x93\x2b\xca\x3b\x9a\xde\xe2\x70\x06\xd3\x36\xba\x4e\x8b\x19\x3a\x10\x8b\x4b\xdd\x4b\x8e\x14\xd0\xf6\x8b\xdc\x23\x63\x96\x99\x84\xe0\xc9\xae\x4f\x17\x57\xee\x8e\x11\x99\xa4\x71\x77\xf5\x74\x96\x29\x98\x1e\x64\xd3\x49\x36\xc9\x3e\x12\x72\x50\x32\xb1\xa4\x2c\x22\x7f\x1a\xb3\x31\x71\x23\x05\xe7\x38\x23\x1c\x4e\x20\x26\x8f\x59\xc4\x44\x33\x0e\x3b\x00\x5d\x00\x22\xfa\x45\x06\x23\x2a\xc8\xcf\x32\x42\xe6\x32\xd5\xc5\x05\x38\xe7\xc5\xbb\x24\xfd\x64\x1e\x27\x21\x3d\x4f\xbe\x41\x80\x62\x90\x82\xe4\x3e\xea\xac\xde\xb8\xd3\x49\x9e\x8e\x42\xf7\xd0\x87\x3b\x5b\xf9\x10\xf2\xb4\x00\x35\x45\x42\xd3\x39\x81\xc8\xa7\x8d\xc1\x9a\x5c\xed\x9a\xa5\x30\x54\x59\x61\x4a\x74\xc4\x0b\xe0\xb3\x4f\x1c\x05\xda\xfd\x2c\xa2\xb9\x8a\xa7\xa9\xff\x91\xdd\x6b\x24\x02\xd1\xd4\xe9\x28\xe7\xf2\x03\x14\xac\xe1\x92\xb3\x5c\x80\xcb\x2d\x60\xe4\xf9\xf5\x4b\x78\x57\x12\x96\x6b\x0f\x88\x30\xe0\x02\xb2\x29\x7f\x2e\xc0\x0b\x70\x2e\x16\x84\xa3\x61\xd5\x8c\xd6\x41\x82\x86\xf5\x53\xcd\xcd\x22\x10\x9b\x85\x24\xb3\x88\x64\x16\xad\x1c\x76\xe2\xb2\xb1\x78\xc9\xe1\x1a\x4e\x83\xc3\x9b\xa2\xa0\xc5\x0b\xf0\xfa\x41\x78\x17\x11\xa8\x2f\xb2\x1c\x6f\xc2\xb7\xb3\xd8\x76\x78\xfe\x52\xc4\xb8\x92\xba\xc5\xa8\x2b\x4b\xd4\x86\x87\xfd\x3e\x60\x94\xff\xf5\x41\x3d\x60\x81\x72\xcd\xf0\xb8\x6e\x19\xeb\x2e\x78\x4f\x2f\x86\x2c\x0e\x8f\x56\x13\xea\x7a\x17\xe0\x25\x13\xb9\x32\x57\x05\x87\x51\x9d\x97\xa3\x13\x0f\xee\x73\x6d\x38\x0b\x68\x93\xc4\x4f\x3f\x10\xbd\x4d\x2d\x4f\xf9\x5c\xea\xa2\x55\x0d\xf5\xfb\x5a\x14\x56\xb2\x01\x76\x23\xd2\x2a\x74\x01\x20\xec\x34\x21\x09\x8c\xee\xb7\x20\x1b\x50\xe1\x2f\x8d\x5a\x8f\x4b\xb3\x14\xef\x8b\xd4\x6a\x48\xe0\x95\x90\xd0\x50\x41\x04\xa1\xe2\x72\x88\xd3\xec\xea\x2a\x81\xad\x26\xa8\x23\xc2\x6b\xf5\xa6\x3b\xa3\x55\xbf\xc4\x86\xdb\xc3\x54\x21\x7b\x15\x63\x38\xcd\x5b\x6f\x88\x76\xc1\x3e\x8e\x83\xe6\x97\x20\x4b\x77\x6f\x91\x3f\x9b\xb1\x46\x2a\x23\x02\x3f\x06\x89\xcf\x04\xa9\x32\xe3\x8d\x5a\x8d\x66\x0a\x97\xa3\x1a\x13\x93\x39\xc6\x94\x33\x4d\x39\x4d\xb2\xbc\xf0\x92\xd8\x2f\x83\x73\x88\x58\xd1\xeb\x38\x0c\x21\x65\x29\x9a\x43\xce\x9d\x60\x15\x1e\xe0\x3c\xf0\xb6\xf3\xa2\xb8\x46\xe3\x17\x7a\x79\xc6\xb6\xc2\xb3\xc1\xba\x4c\x43\xe6\x71\x20\x78\x9f\x05\xed\xbe\xea\xb5\x53\xbc\xd6\x16\x2d\x24\x80\x00\xe8\x18\xfc\xeb\x57\x89\xe9\x45\x06\x74\x80\x6f\xb2\xaa\x6b\xc0\x5e\x80\x18\xde\xaf\x3d\xf4\xcd\xda\x83\xd0\x28\x78\x24\x8d\xba\x9b\x5e\x5f\xf6\xcb\xa8\xa4\x3f\x8a\x4a\xa4\x7f\xd5\x05\x2c\x5b\xea\xb9\xee\x7e\xb5\x0a\x5d\x00\x7f\x73\x93\xbc\x26\x5a\xdf\x66\xb3\xd4\x05\xc8\xb7\x60\xaa\xb1\x99\xa9\x86\x78\x01\xea\x29\xfe\xbb\xc5\x42\x7a\xf7\x90\x0d\x0b\x2d\xb2\xed\xc8\xd6\x4d\x57\xd3\x74\x27\x82\x76\xa0\xa9\x9a\xe5\x69\x13\x43\x0f\x54\xc7\x56\x3d\xcf\x35\xbc\x89\xaf\x95\x9b\xaa\x8e\xab\xa9\xae\x66\xd9\xa6\xe6\xe9\xae\x6a\x58\x9a\xf9\x03\xce\xf4\xff\xbb\x61\xf1\x4d\x36\x2c\x1e\xa5\x37\xba\xa5\x77\x7d\xd9\x2f\xd3\x1b\xc6\xa3\xf4\x06\x19\x42\xd5\x35\x4d\x5b\xea\x8d\xee\x7e\xb5\x0a\x5d\x80\xd9\xf6\x7a\x63\x7d\x9b\xcd\x52\x17\x17\x4b\x80\xe1\x74\x96\xf8\x78\xf5\xfe\xcb\xd5\x74\xb5\xa4\x39\x11\xa8\x75\x26\x54\x70\x82\x81\x07\xca\xac\xb5\x8d\xa4\xb5\xd7\xa6\x08\x58\x32\xc6\x93\xfd\x1b\xc9\x00\x46\x3b\x4b\x6c\x99\x0f\xdc\xe4\x93\xd5\xd2\x37\x75\x9e\x75\x1b\x88\xbe\x08\x58\x42\xeb\x83\x90\xe6\xc4\x24\x3e\x05\xe8\xb8\x49\x4d\x21\x53\xe0\x21\xf9\xbc\x0f\x6f\x68\x5e\x9f\xa2\x8d\x32\xd1\xb5\x53\xe5\x1c\x75\xf9\x3c\xa9\x75\xae\x5c\x0f\x88\x33\x11\x78\x15\xd6\x9a\x0a\x34\xb5\x23\x91\xb9\x46\xcb\x69\x5a\x5d\x50\x07\x9a\xbe\x29\xf5\xb9\x51\x92\xc8\x68\xa7\x43\xd7\x3a\xb2\xc6\x6a\xd6\x3d\x09\xd0\x35\xfb\xcb\x12\xa0\x5f\xe1\x2f\x4a\x07\xdb\xca\x84\xce\xb0\xf6\xea\x77\xfa\xfd\xb9\x6e\xf5\x7a\x2a\xa6\xab\x75\xf6\x72\x93\x2e\x96\xac\xac\x1e\x74\xe7\x8d\x2d\xb2\xd1\xea\x9c\xe4\xd9\x7c\x36\x5a\x9d\xcb\x46\xeb\x80\x43\xbc\x45\x36\x5a\x77\xdb\x6c\xb4\x1e\x18\xe2\x87\x65\xa3\xbd\xe7\x07\x4d\xe6\xac\xb6\x46\x80\xa1\x3d\x66\x08\x1c\xa1\x2c\xe4\xc7\x80\xa1\xb7\x06\x81\x61\xf0\xe2\xa1\x73\x10\xcd\x95\x71\x60\x58\x60\x35\xa7\x3c\x2d\x67\xaf\x8e\x03\xc3\x01\xba\xb3\xa9\x7b\x6e\x7b\x1c\x18\x5e\x7b\x1c\x98\x6a\x7b\x1c\x98\x5a\x3b\xd1\xb5\x0e\xf4\x7a\xf4\x9a\xc6\x9a\x71\x60\x9a\x6b\xc6\x81\x69\x81\xf1\x57\x1c\x07\xa6\xdd\x1e\x07\xa6\x73\xff\x38\x30\xdd\xae\x71\x60\x7a\x6c\x55\xec\xde\x81\x60\xa9\xf5\x40\xa8\x01\x5b\x1a\x3f\x10\x8c\x5a\x69\x5b\x3a\x78\xbf\xc5\x40\xb0\x8c\x2d\x07\x82\x65\x82\xc9\xd7\x1d\x08\x0d\xa2\x5a\x56\x5b\x3c\x2c\xbb\x9d\x5c\xdb\x2a\x08\x4d\x29\xd1\x45\x65\xab\xa6\xb2\xa1\x57\x22\x64\x79\xc0\xa8\x65\xd1\x56\xd7\x65\x4b\xd7\xd6\x88\x90\xad\x83\x6b\x22\x42\xeb\x72\xe0\x6f\x97\x59\xdb\x36\x2a\x16\x1a\x75\xd2\x7c\xdb\xdc\x9c\xec\xdc\xb6\xc0\x0d\xa1\xbc\x76\x5f\xb2\x73\xdb\x06\x47\xdb\x15\x74\xc0\x74\x3d\x2f\xd7\x66\x45\xa7\xa4\x73\xdb\x3c\xb1\xbd\x7b\x78\xe2\xa8\x5d\x3c\x71\x34\x60\xd4\xe6\xcd\xd1\xd7\xf0\xc4\x31\xd6\xa5\xb0\x37\xc1\xf1\x97\x0d\x6b\xda\x7c\x6d\x5f\x8c\x5a\x69\x3a\xf6\x66\x9e\x38\x0e\x78\xf5\x08\x0a\x36\x48\xe9\xb8\x6d\x91\x77\xbc\x36\x79\xdd\x12\x48\xb1\x74\xd8\x45\x61\x57\xeb\xa2\xb0\xab\x03\xa3\x56\x9c\xee\x3a\xc5\xe9\xae\x53\x9c\xae\x05\xee\xbe\x4c\xea\x29\x5c\x7b\x05\xff\x72\xad\xaa\x46\xc0\xa9\x79\x50\xab\x36\xd7\x6d\x58\x02\xa2\x2c\x5d\xaf\x5c\xef\x15\x1f\xa4\x5d\x3c\xb5\x4d\x56\x4f\xbb\x9f\xac\x9e\xde\x45\x56\xcf\x00\x66\x9d\xa6\xdf\x33\xd7\x90\xd5\xb3\xd6\x90\xd5\xb3\xc1\xf3\x2f\x13\x5c\x0a\xd7\xb9\x8f\xac\x9e\x5b\x91\xd5\xe4\xfa\xed\xb5\xc8\xaa\xa9\xea\xe3\xe8\xaa\xa9\x5a\x93\xb0\xd4\x1f\x55\x75\x40\xef\xd5\xf5\xe7\x61\x8c\x77\x93\xec\xea\x8a\xee\x64\x99\x1b\x5d\x67\xd5\xe8\xf0\x93\x55\xb3\xcd\x37\x4d\xb5\xee\x67\x9c\xa6\xda\x5d\x9c\xd3\x54\x07\x98\x9c\x6f\xae\xae\xf5\xa9\xd5\x75\x4e\xb5\xa6\xa9\xe0\xec\xcb\xb9\xa7\x69\xab\xe2\xd7\x62\x9f\xa6\xe9\x35\xff\x38\xa2\x68\xc6\x6a\xd7\x28\x0f\xc9\x44\x43\x18\xcc\x71\x36\xf5\x31\x64\xe7\xfa\xe9\x45\xd6\x11\xbb\x2d\xa2\x79\xae\xff\x84\x9e\xeb\xdf\x9e\xd9\xd5\x8f\xbb\xf4\xa3\xa4\xf1\xd3\x16\xcd\xee\xe0\x9b\xe6\x74\xf0\xad\x9c\xc0\xb0\x40\xa6\x4e\xae\x69\x5e\x7b\x12\xa4\xab\xc0\xe4\xe0\xe9\xda\x3a\x96\x95\x73\x91\x36\xcb\x74\x03\xec\x7f\x05\x96\x91\x29\x4b\x5e\xcc\xc8\x4d\x9b\x03\x6c\xd5\x3e\x96\xc9\x83\xb5\xc1\x9f\x04\xac\x0e\xc4\xf4\x8a\xeb\x2f\x30\xdd\xb6\x1d\xd2\x74\x67\xb3\xc9\xd1\x74\x17\x7c\xb8\xd7\xe6\xb0\x92\x1e\x78\xf3\x48\xfb\xae\x19\x1d\xaa\x52\x33\xb4\x7b\x59\x67\xe8\x6d\xd6\x19\x06\x30\x3d\xae\xc8\x3a\x4d\xa9\x19\xeb\x54\xa5\x66\xd8\xe0\xe3\x97\x9b\x20\xcd\x70\x6a\xd6\x59\x2a\x07\xd8\xed\x66\x9d\xe1\x81\x67\xdb\xb3\xce\x54\xd7\xb3\x8e\xad\x01\x74\xba\x64\xf5\xd8\x5d\xab\x1a\x9b\xbd\x30\x8d\x0e\xde\x94\xd3\x9e\x0d\xbc\x31\xad\x36\x6f\x4c\x1b\x58\x7c\x2b\xce\x3a\xde\x98\xee\x3a\xde\x98\x1e\xb8\xdd\xc4\x1b\x4b\xdf\x8a\x37\x64\x62\x53\xf1\xc6\xa8\x01\x5b\x5a\x37\x6f\x2c\x1d\x7c\xda\x9e\x37\x9b\x26\x38\x0c\xbc\xb9\x99\x37\xd6\xbd\xce\x1c\x83\xb3\x32\x59\x61\xa8\x3a\xe0\x17\x0c\x34\x1d\x94\x76\xcc\x5a\x99\x27\xb1\x52\x2e\xc8\x10\xd0\x1d\x50\x3a\x7f\x16\x37\x96\x2d\x0f\x44\x5d\x1f\x7f\xf9\xed\x03\x87\x86\x0c\xf4\x72\x11\xef\x37\xfb\x57\x89\xdf\xf2\xc6\x75\x02\x58\x5a\xfe\xe3\xcc\x96\x18\x8a\xb4\x24\xdd\xa4\x04\xb8\x9d\xdd\xa8\x2a\xcc\xb8\x38\xfb\xed\x4c\xc2\x4a\x11\x40\x71\x7a\x37\x83\xfb\xc5\xf5\xde\x19\x3a\x8d\x71\x02\x87\x7e\x0e\x59\xab\xf8\x54\x32\xaa\xca\x06\x0f\xa9\x88\xa0\xba\x83\xca\xd9\xcb\x3f\x25\xc3\x02\x27\x08\xe0\x76\x22\xdf\x1a\x72\x03\x4f\xb6\x1d\x0d\x30\x97\x39\xb6\x89\x62\xa3\x3f\xf9\x75\x76\x4b\xec\x1d\x0d\xdd\x90\x5a\x71\x39\x72\x77\xdd\x15\x0c\x9d\x0e\x0c\x8f\x50\x16\x7e\x13\x14\x5b\xb1\x31\x35\x14\x97\x63\xc1\x35\x9e\x26\x34\x5d\xc3\x2b\x32\xa2\x73\x85\x8b\x69\xa9\xe8\x6f\x79\x2b\xac\xce\xbd\xa1\xd4\x0c\x46\xc1\x0a\x0c\xe9\xf6\x29\xcd\xef\x35\x38\x3a\xba\x1c\xed\x8f\x4f\xc7\x87\x07\xca\xe9\xcb\xe7\x4f\x8b\x81\xe7\x27\x62\x4f\x14\xbb\xfa\xc0\x85\xc5\x00\x5c\x66\xb1\xcd\xd0\x28\x9d\x4f\x95\xb3\xc1\xab\xf1\xfe\xe5\xf0\xd5\x9b\x93\xd3\xd1\xf1\xe5\xc1\xe0\xf5\xa8\x4b\xf0\x36\xb5\xf0\xf6\xc5\xf8\x74\x74\x72\x34\x18\x3e\xb8\xe6\xf1\xe8\xb7\x37\xe3\xe3\xd1\x7e\x55\xcf\xd9\x40\xba\x3a\x54\xa7\xa2\x9c\xa3\x75\x89\xee\x83\x20\x6e\x62\xd6\xfa\x80\x9c\x0a\x03\x57\xaf\xfb\xac\x6d\x68\xaa\x1d\x2b\x53\x35\xe1\xd5\xe3\xcf\xae\x3b\x51\xf8\x8c\xed\x96\xd8\xc5\x6f\x03\xe2\xad\xbf\x62\xce\xba\xbc\x56\x83\x48\x75\x04\x4d\xf1\xbe\x22\xdf\xbd\x82\xda\x11\x18\x53\xa1\xac\xa9\x4e\xdd\x6d\x63\x43\x2b\x75\x58\x4b\x5d\xb7\x58\x4e\x6b\xe9\x9b\xc6\x70\x1c\x7c\xea\x1c\x8c\x0f\x62\xed\x96\x42\xd8\xca\x34\x7f\xf9\xe6\x60\xfc\xdb\x9b\xd1\x56\x42\xb9\x1a\x2e\x53\x77\xd3\x58\xa3\x56\x8b\x6e\x16\x19\xfc\xf8\x04\x94\x8b\x45\xc7\x4b\x8e\x84\x4f\xc9\xe7\xde\xba\xaf\xab\x59\x48\x1b\xb0\xaf\xe3\x3f\x24\x51\x10\x59\x42\xf8\x56\xa2\x1f\x49\x64\x75\x45\x19\x88\x82\xb8\x75\xbf\x1b\xa1\x39\x75\xc7\x0b\x67\xfb\x3b\x76\xbc\x99\x7e\xee\x81\x3d\x67\x95\x57\xba\xce\x89\x5c\x33\x7a\x08\x88\x4f\xea\x2b\xea\x76\xcb\xdb\x3f\x89\x19\x08\xfd\x24\x4b\x61\xf9\x6a\x77\x9a\x85\x50\xdc\x64\xc2\xdb\x66\xea\x41\x85\xe5\x25\x08\x63\x04\x03\x1c\xdf\xc0\xbc\x77\x7e\x06\x95\xcb\x77\xe0\x0c\x2a\xbf\xbe\x22\xff\xe6\x57\xe0\x12\x2a\x87\x16\xf9\x77\xfa\x01\x7c\x80\xca\x9f\x37\xaf\xc8\x9f\xd7\x57\x2f\xc9\x9f\x5f\xa7\x7f\x80\x37\x50\xf9\x83\xfc\x4e\xff\x7c\x47\xfe\x5c\x9a\xaf\x49\xcd\x67\xf4\xdd\x5b\x4b\xa3\x8d\xfd\x4a\xfe\x9d\x93\x37\x77\x79\x46\x1a\xcb\xaf\xc8\xc3\xf0\xb5\x4d\xfe\x3c\xb7\x2c\xf2\xe7\xe3\xf1\x11\x29\x96\xee\x53\x38\x1f\x3c\xf2\xe7\xdd\xa5\x49\xfe\x1c\x8d\xae\xc9\xa7\xb7\x09\x79\x78\xf9\x72\x08\x46\x58\x39\x21\xbf\xc3\xd3\x1b\xf2\x61\xf4\x2b\x79\xc8\xf0\x5b\xf2\xf0\xee\x80\xfc\xfb\x12\x91\x57\x67\x7f\x0e\x40\x84\x15\x8a\xfa\xd8\xfb\x44\xfe\x7c\xda\x7f\x76\x01\x72\x7c\x97\x90\xfe\x8a\x4a\x15\x5b\x7b\x7e\x99\x5e\x15\x5e\xec\xee\xbf\x86\x87\xaf\x8f\xfe\x75\xf1\x79\x56\x44\x1b\xf5\x10\x4c\x7c\x42\xa2\xbd\x04\x46\xb8\x67\x1a\xff\x5a\x2a\x75\x14\x77\x57\x4d\x0c\x3f\xe2\x5d\x3f\x89\xaf\xd2\x5e\x00\x53\x0c\x51\x51\xa1\x4c\xe5\xd5\x55\x67\x92\x7d\xdc\xcd\xaf\xfd\x30\xbb\xed\xa9\x82\xa2\x59\x08\x4e\x05\x55\x50\x85\x1b\x1f\x49\xbb\xbb\xd4\x5d\x25\x4d\x54\x21\xea\xbb\x75\x85\xdd\x20\x4b\x32\x24\xef\x4d\x32\x14\x42\xb4\x4b\xbb\xd7\xcb\xb3\x24\x0e\xf7\x30\xf2\xd3\x9c\xe8\xec\x1e\xfd\x95\xf8\x18\xbe\x93\x76\x15\x0d\xc1\xa9\xcc\x3e\xb2\x2e\xb2\xaa\x82\xa2\xe7\x02\xf4\x73\x08\xaa\x7a\xd5\xab\xb2\x75\x0a\xab\xf7\x0f\xcd\xf1\x26\xa1\xd1\x7c\xb9\x01\xd5\xba\x14\x10\x8a\xba\xf2\x52\xb9\xf6\x77\xcb\x0d\xea\x2e\x92\x14\x61\xe1\xbd\x38\x4d\xe2\x14\xb2\xa0\xfb\xa5\x82\x60\x84\x60\x7e\xbd\x3b\xc1\x9d\x5c\x0b\xe6\x28\xcf\x50\x6f\x96\xc5\x84\xf0\x7b\x53\x1f\x5d\xc5\x29\x0d\x15\xeb\x69\xea\xec\xe3\xde\x63\x1a\x15\x04\xa1\x2a\x41\x6d\x6a\xa7\xb8\xf8\x61\x18\xa7\x57\x3d\x6b\xf6\x71\xaf\x2d\x3a\x38\x9b\xf5\xf4\xd9\xc7\x25\x35\x4c\xbb\xf8\x6e\x06\xeb\x79\x4c\x57\x6b\x53\xff\xe3\xee\x6d\x1c\xe2\xeb\x9e\xa5\xfe\x8b\xaf\xc5\x64\x68\x5b\x72\xed\xd5\xed\xe8\xba\x3a\xfb\xb8\x24\x15\xaf\xb3\x9c\xef\x9a\x20\x70\x73\x39\xa1\x63\x5e\xc7\x21\x63\xa8\xa4\x11\xa5\x88\x79\xa4\xfe\xec\x20\xbc\x21\xfe\x6b\xa7\x50\x97\x28\xa5\x59\x0a\x97\xe2\xc5\x52\x06\x70\x29\xc9\xe0\x06\xf5\xb9\x3d\xce\xf2\xa7\x00\x25\xf9\x73\x06\x69\x12\x31\x00\xe5\x65\xb1\xf7\xe9\x43\x09\x52\x85\x0f\xce\x8b\x34\xa9\x7e\x04\x59\x3a\xbe\x4d\xb9\xce\x16\x0b\x51\xa4\xd9\xc6\x28\xc4\x23\xd4\xff\x4c\x33\x96\x15\x99\x08\xf3\xde\xf9\xe7\xd4\x9f\xc2\xde\x11\x54\xce\x8e\x86\x2c\x75\xe2\x0c\xc5\x53\x1f\xdd\x15\x27\x23\x7a\x4f\xd4\x25\x68\x14\x3a\x18\xbd\xbd\x1c\x8e\xf7\x8f\x01\x95\x81\x9e\x78\x76\x34\x14\xc8\xb3\xb8\x52\xae\x4c\xf4\xd6\x5d\x18\x84\xd9\x41\x86\x07\x73\x9c\x1d\xc3\x1c\x67\x08\xb6\x01\x55\x0d\x8c\xf7\xf9\xea\xe3\x7d\x11\x14\x47\x16\xf3\x5f\xfc\xe0\x03\x4c\x69\xd6\xb5\x0e\x44\x0f\x0f\x2e\x69\xa8\xd5\xc1\xe8\xf4\xf2\xd9\x60\x38\x3e\x78\x0e\x42\x18\xf9\xf3\x04\xb3\xf4\xbb\x4f\x34\x10\xe7\xbf\x64\x59\x02\xfd\xb4\xf7\x44\x2d\x81\x9c\xbe\x18\x9f\x08\xe3\x13\xe1\xe0\xf0\x54\x18\x1c\x08\x65\x13\x02\x6b\x42\x38\x3b\x1a\x8a\xcb\x8b\xe5\x5e\xc5\xb0\x29\x5a\x09\x27\xc1\x2f\xde\x4a\x2a\xb0\xb9\x80\x91\xb5\xab\x38\xf5\xce\x8b\x0e\xc4\x7c\xe6\xa7\x62\xc7\xd2\x81\xbc\xac\x60\x1d\x17\xb0\xe2\x48\xaa\xc0\xdd\xa5\x1f\x25\x95\x07\x55\x2e\x1e\x14\x6b\x44\x34\xea\xa0\xd9\x2c\x9d\x44\xd3\xb9\x73\x95\x05\x56\xf9\x67\x3c\x9d\x25\x71\x10\xe3\xbd\xb6\xf1\x2c\xce\x71\x20\x25\x5e\xb5\xad\xa5\x53\x40\x3e\x51\xbb\xbf\xac\x91\x7d\xd5\x4d\x18\xcd\xf8\x16\x94\xb9\x5b\x03\xec\x6b\xb2\x81\x90\xea\x79\x63\xd4\xb2\x4c\xb5\xfc\xc8\x3b\x85\x12\x02\x90\x65\x46\xc7\xfd\x39\x94\x90\x5c\x8b\x0a\x2a\xb3\x30\xc7\x65\x7a\xbb\x72\xa4\x23\x19\x48\x71\x1f\x2b\x81\x9f\x24\xf4\x8d\x2c\x97\xce\x75\x9c\xa5\xc5\xb5\xbb\x7d\x08\x62\xa5\x14\xe1\x59\xf0\xc2\xcf\x87\xd7\x7e\x7a\x05\xc3\x3e\x11\x65\xa5\x3c\xa9\x7d\x36\x0b\xf2\xfe\xf9\x05\x88\x95\x24\xf3\x89\x36\x1e\xf1\x1f\x68\xd1\xba\x91\x41\x18\x22\x98\xe7\x7d\x51\x53\x15\xfa\xff\xcf\x9a\x2d\x82\x98\xd3\x3b\xa8\x54\x39\x29\xbc\x2d\xd2\x3e\x8e\x4b\xc0\x6b\xb2\x0b\x97\x0a\xe8\x89\xf4\x04\x96\xa9\xe7\x83\x39\x2a\x6a\xcb\x3b\x3b\xf0\x49\xbf\xbf\xf2\xb6\x4a\xcb\xc8\xc0\x8c\xc3\xc7\x03\x19\x87\x6d\x10\xe3\xb0\x02\x90\xa5\x05\x48\xd6\xfe\x9a\x74\xfb\xb4\xee\xba\x2e\x4b\x50\xae\x0b\xd5\x7d\xe8\x43\xb0\x92\xe6\x92\x2b\x95\x40\x1f\x1d\xd0\xf6\x8a\x98\xb5\x5c\x2a\xb2\xbe\xf2\x8c\x6b\xe4\xf7\xe7\x3f\x28\x53\x7f\xd6\x9d\x6e\x39\x0e\x97\x32\x4b\x94\x8c\x98\x2e\x65\x09\x5b\x3b\xd4\xe8\x11\x02\x58\x5e\x96\xd9\xf7\x39\xb1\x38\x2b\xe7\x71\xb9\x24\x2f\x61\x42\x03\x42\x4b\x9c\xb9\x62\xab\x88\xe7\x10\xb3\x1e\xf1\xf5\xf7\x68\xa6\xcc\x29\xcc\x73\x98\x5e\x41\xc4\x66\x53\xf9\x75\x91\x87\xf2\x15\x54\x5e\x29\x83\xb7\x27\x97\xa5\xc1\xb9\x1c\xbe\x18\x1c\x3c\x1f\xed\x83\x99\x7f\x47\xe4\xb5\xf7\xb9\xc8\x17\xda\x83\xcb\x32\x2d\x2e\x66\xc6\xe8\x04\xc3\xd9\x7e\x9d\x5d\x8f\x31\x44\x92\x97\x15\x67\x3b\x68\xdc\x91\xd0\xb3\xee\x1a\x25\x14\x4d\x93\x4d\x13\x77\xae\x58\x38\xb9\xd9\x6e\x07\x1d\x36\xe6\xae\xae\x57\x0f\xc8\x84\xa9\x83\x1d\x32\xc0\xdb\x14\xa4\xa8\xb0\x4c\xe0\x4c\xf6\x44\x51\x06\x90\x75\x80\xa7\x3b\x80\x4a\x91\x5b\x9b\x94\x1a\xa4\x21\xfd\x18\xe3\x3b\xc2\xad\x66\x6d\xdc\x51\x1b\xaf\xad\x5d\x8f\xcc\xab\xc3\x74\x9c\xc6\x78\x73\xca\xee\x00\x4a\x21\x94\x90\x32\x43\x19\xce\x08\xcf\x65\xc0\xd5\xa4\xba\x8d\x53\x73\xa0\x91\x57\xf5\x59\x86\xa6\x65\x6e\x55\x7a\x16\x90\xbc\x90\x9a\x44\x02\x9b\xf3\xab\x1e\xa1\x42\x68\x56\x26\xda\x7d\x0a\xa8\x74\x7f\xde\xe0\x38\x89\x71\x0c\x69\xea\xf3\xba\xd4\x6b\x7f\x26\x55\x0d\xd0\xb1\xb4\xcf\x34\x25\x6b\xa3\xfe\x86\xe0\x55\x4c\x66\x91\xc5\xe7\x67\x71\x02\xc7\x45\xba\x98\x17\x7e\x1a\x26\x10\x31\xac\xe1\x0d\x4c\x1b\x5f\xc1\xfd\x4d\xd0\x29\xf5\xa6\x56\x68\x81\x95\x56\x0e\x53\xca\xb8\x62\x4c\xf0\x0e\x1d\x2d\xb6\xa2\xf3\x94\x49\x9c\x86\x85\x9d\x01\xe7\x5d\x12\xb7\x3e\xf7\x75\x17\x3c\x0c\xf8\x52\xf7\x2b\x80\x83\xd1\xe9\xdb\xc3\xe3\x97\x97\x27\xa7\xa3\xa3\xcb\xe7\xa3\xd3\xcb\x83\xc3\xcb\xa3\xe3\xc3\xdf\xdf\x5d\x8e\x0f\x9e\x1d\xd6\xaa\x20\x4e\xa3\xac\x27\xe1\xa7\xf8\xdf\x22\xa0\x4b\xb2\xff\x16\x35\xdb\x53\x74\xcb\x2c\x4d\x15\xd1\x11\xf0\x3e\x05\x21\x2f\x0b\x39\xab\x91\xca\xe7\x13\x52\x6e\x02\xa5\x4a\x23\x1d\x8f\x9e\x8f\x0f\x0f\x2a\x7d\xc4\x49\x37\x6c\xd9\xd6\x62\xfc\xf1\xa9\xf9\x3b\x47\xf8\x36\xe5\x98\xae\x61\x7c\x9a\xa7\x15\x62\x05\xca\x61\x9d\x6e\xf8\x98\xd2\x1e\xf9\x48\xc9\x31\x9c\x9d\x54\x3d\xa0\x1e\x44\xd5\x0d\x42\xce\xaa\xed\xb3\xa3\xe1\x49\x29\x01\xcf\x20\x0e\xae\x61\x48\x8d\x09\xcf\xff\xfb\xe5\xa8\xcb\x95\x2e\x1a\x3d\xc8\xd2\x32\xbf\xc5\x33\x3f\x20\x14\x3a\x1a\x76\xc8\xd8\xfd\x30\x78\x3b\x55\xb4\xcd\x0a\x70\x7a\x97\x6f\x92\x33\xe7\x84\xed\x27\xd8\x27\xc3\x6b\xad\xba\xa7\xc7\x1c\x88\x0a\x8a\xfd\xa4\x18\x0a\x12\xdf\x06\x47\x9c\x2e\x87\xa0\x65\x8e\xfb\x85\xde\xe9\x76\xb1\xb8\x86\xd7\x13\xa8\x0b\xce\x76\xb6\x73\x30\x3e\x7e\x3e\x38\x3a\x1a\xed\x53\x2b\xca\x04\xb6\x1a\x34\x4f\xd4\x7e\xbf\x0f\xb9\xf4\xec\x5d\x7d\x5f\xab\xc2\x39\xdf\x65\x6f\xbd\x71\x22\x8a\x45\xae\x6d\x0a\xac\x81\x75\xb8\x04\xeb\x78\xb2\xc6\x93\xe5\x9b\xea\x74\x51\xd6\xb5\xd7\xf0\x96\xd8\x09\xe7\xff\xa3\xee\xec\x6c\x67\x8b\x8b\xce\x94\xf6\xb0\x9d\xa1\xbf\xe6\x68\x4b\x2c\xef\xf7\x20\x57\xbd\x59\xea\x3f\x36\xbc\xd3\x3e\xdc\x5b\xe7\xf8\xb1\xc5\x5a\xa9\x23\x29\x38\x56\xe2\x90\x31\x7b\xaf\xf4\xc7\x78\x4d\x73\xe2\x47\x30\xb9\xeb\xd4\x37\x00\xef\xec\xe0\x8a\x48\x4f\xf1\xb9\x7a\xa1\x04\x71\x88\xe8\xb6\xd7\x76\x42\x48\xf4\xcc\xc9\x9b\x5f\x0e\x46\xa7\x27\x0d\xdf\x6d\x1c\x32\xcf\x6d\x7b\x37\xb0\xd0\xb8\x0f\xf5\xf6\xc2\xbb\xd4\x9f\xc6\x01\x57\x66\xb3\x3f\x56\x5a\xfa\x86\x16\xa6\x92\x5c\x3a\x62\x9d\x25\x9a\x74\x7b\xa2\xca\x00\x6d\x53\x7a\xbc\x4f\xca\xd6\x69\xcc\x1b\xd3\x82\x9d\x1d\xb4\xb3\x83\x9f\x8a\x67\x47\xc3\xff\x8f\xb9\x2b\x61\x6e\x13\xd9\xd6\x7f\x85\x30\xf3\xf2\xe0\xa6\x4d\xb1\x23\xe4\xeb\xca\x93\x25\x39\xd6\x24\x5e\xae\xe5\xd8\x77\xc6\xe5\x72\x21\xd1\xc4\x4c\x24\xa1\x00\xde\xe5\xff\xfe\xaa\x37\x68\xa0\xb5\x79\x2a\xf7\x4e\x4d\xd5\xc4\x82\x5e\x4e\x6f\xa7\xbb\x39\xdf\x77\x4e\x5b\x92\x3f\xa4\x1f\x64\xfc\x59\x04\xfd\x9d\xb7\x69\xda\xe3\xfe\x25\x4d\x70\x0c\x1f\xe4\xb6\x3c\x9c\xc3\x71\x1c\x3d\xe1\xf8\x45\x2c\xea\x39\xa6\xf2\x74\x2e\x87\x72\xb9\x68\xd0\xa1\xe5\x2b\x3d\x4e\x2d\x5b\x29\x95\x44\x07\x69\x32\xa5\x1f\x84\xc4\x67\x1f\x3e\x3e\x3e\x4a\xc1\xc2\xd7\x9f\x41\x6d\xf0\xd7\xc2\xd7\x6f\x19\xb0\xfe\x7e\x3e\x5e\x1b\xa7\xde\xf2\x48\x98\x7a\x57\x10\xa5\x9e\xc8\x22\x70\xca\xd2\xf0\xae\x52\x92\x04\xf7\x17\x0b\x65\x9f\xf3\x03\x84\xb9\x53\x0f\x34\xdc\xbc\x61\xd9\x9e\xab\x9b\x7e\xcb\x72\xc6\x46\xe4\x3a\x4e\x64\xdb\x2e\xb4\x22\x1c\x5e\x68\xe4\xb9\xa6\x1f\x85\xd6\x28\xb0\x59\x88\x13\xaf\xa5\x9b\xba\x6b\xb8\xa6\xdf\xf2\x5c\xd7\xf5\xed\x36\x1e\x4d\x3a\x88\xd4\xa3\x15\x12\xaf\x81\x4a\x58\xe9\x00\x65\x03\xf7\x11\x65\x83\x0e\x17\x0b\xe5\x90\x36\xa8\xf0\xed\x86\x5a\xc6\x7b\x8f\xf5\x6c\x33\xf4\x6d\x3b\x08\x43\xcb\xf1\x22\xcb\x32\x46\x91\x61\x58\x16\x0c\x23\x7d\x6c\xd9\xd0\x36\x47\x4e\xe4\xe8\xd4\x91\x97\x63\x1b\x8e\x6b\xdb\xba\xe3\x38\xad\x96\x67\x79\xd6\xdf\x91\xe7\x48\x28\x65\x52\x30\x2b\x1d\xda\xe1\xae\x4f\x93\xe9\x7f\x39\xb8\x63\x83\xdd\x68\x34\xd9\x8d\x8d\x47\xff\x30\x7e\x26\xbb\xd1\x10\xb1\x1b\x79\x72\xe3\xdf\xc9\xb5\xce\x12\xc2\x20\xb7\x85\x0e\xc4\x5e\x37\xaa\x29\xfe\xa2\xb3\x88\xa5\xfe\x59\xca\x95\x77\xb4\x58\x28\x47\xa2\x95\x87\x36\x5e\x1a\xe2\x24\x1a\xe9\x9e\xe3\x1b\xa1\xee\xeb\x01\x6c\x8d\x7c\xcb\x37\xf4\xd6\xc8\x37\x4d\x7b\xe4\xb6\x46\x56\xe4\x59\xd0\x6b\x59\x54\xa1\xb4\x7c\xcf\xf7\x5a\xa6\x67\xb5\x2c\xc7\x77\x3c\xaf\xa5\xff\x1d\x1d\xba\x9f\xc1\x20\xdc\x49\x66\x93\x27\x12\x34\x8c\x99\x00\xa4\x20\xcb\x92\x71\x1c\xe4\x30\x64\xa1\x21\x99\xb3\x3f\x18\x56\x16\xe9\x7f\x76\x39\x36\x42\x11\xfd\x62\x36\x63\xad\x36\x1e\xfd\xc3\xfc\x99\xb1\x56\x4d\x51\xac\x55\xd3\xac\xb2\x8d\x57\x7a\xe7\xe1\xe6\x7a\x37\x0e\xd3\x86\x8b\x1e\xec\xda\x82\x10\x59\xc2\x38\xa3\x2e\x68\x2c\x20\xa7\x30\x08\xd1\xd8\xf1\x1e\x32\x36\xf0\x1a\x33\x13\x5c\x7a\x84\x72\x2d\x49\xb8\xc6\x6b\x0c\x8e\x8a\x17\x67\x38\x76\x73\x30\x93\x62\x5a\x82\x14\xe1\x22\xb0\x89\x86\x5f\x78\xbf\x2d\x16\xca\x6f\xcc\x8b\xe5\x43\x86\xd7\xdc\x2c\x69\xe4\xa3\xbb\x74\x64\x8f\x42\xd3\xf0\x7c\x2f\xf4\x7d\xc7\x1f\x59\x30\xf0\x1d\xc3\x1d\x9b\xad\x30\x18\x8f\x82\x71\x6b\x1c\x05\x23\x3f\xa4\x5e\x89\x5d\xc3\xb4\x9d\x96\xef\x9b\xba\x6f\xe3\x20\x82\x86\x4b\x83\xf6\xad\x14\xef\xbf\xbc\x24\x4f\x2b\x7e\x31\x07\xbd\x4c\xca\x6e\x93\xbb\x49\x38\xfb\x5f\xec\x60\x93\x46\xf1\x23\xae\x60\x83\xd9\x93\xa8\xb3\x7e\xfa\xc2\xfc\xa5\x19\x98\x48\x10\x97\xa8\x19\x96\xe8\x6d\x51\x89\x36\x5c\x88\xc2\x10\x44\x5c\x04\xa2\xb7\xf9\x78\x79\x1b\x45\x9d\x5a\xb4\x6e\x6d\x46\x4d\x1f\xf6\xee\x15\x13\x98\x4d\x90\xae\x45\x78\x29\xe8\xe8\xbc\x83\x4a\xd8\x99\xf1\x27\x4b\x50\x12\x43\x36\xa4\xac\xaf\x86\x5d\x7b\x0d\xd0\x75\x0b\x94\x7c\x37\x7f\x29\xf3\x84\x87\x5b\xf3\xbc\x13\x30\x4d\x57\x70\x18\x36\xa4\x30\x94\x50\x6b\xbf\xac\xd2\xe2\x6c\xa5\x1c\xed\xdf\x06\x67\xa9\x08\x67\x4d\x61\x89\x35\xfc\xf3\x1a\x98\xb5\xbb\x1a\x65\xed\x01\xb9\xe2\xa1\xb7\x72\x38\xe5\x9c\xf3\xae\xa5\xac\x30\xaa\x7c\x6d\xb4\x8c\x75\x1c\x45\xb3\xe4\x28\x1a\x25\x61\xc8\x34\x78\x0e\xb3\xb9\x8c\xa3\x68\x5a\xe2\x41\x33\x6d\xf0\xe5\x2f\x0d\x5a\x8d\x01\x6f\x94\xac\x51\x73\x05\x43\x71\x4d\xf7\x98\x5e\x63\x7a\x9b\xcd\x1e\x33\xfd\xf5\x34\x2b\xab\x4e\x4d\x6c\x90\x98\x2c\xa3\x14\x9e\xa3\x9e\x9b\xa2\xce\xb6\x2c\xde\xdf\xc1\x52\xb6\x48\x95\x2c\x52\x76\xb6\xe5\x82\xa7\xbf\xd4\xd9\x1b\xff\xb1\x25\xda\x9e\xc3\x2c\x36\xef\xb3\x2b\xa1\xf7\xab\xe0\xb4\x95\x53\x7b\x89\x1e\x5e\x83\x84\xad\x98\x58\x0b\x08\x83\xbe\x59\x3d\xe8\xc4\x54\xd4\x64\x1a\x22\x78\x61\x71\x4e\x02\xef\xf4\xf5\x88\xc2\x1e\x2c\xb1\x7b\x55\x28\x21\xc5\x17\xf2\x88\xc2\x3a\xb8\x8f\x41\x09\x79\x9c\x5f\x1d\x4f\x78\xf1\xa3\xc3\x60\x85\x05\x12\xf1\xf1\xec\x74\x15\x9e\x50\x80\x0b\x64\x7a\xe3\x8a\xb5\xee\x5a\x8c\xd9\xc3\xb8\xb6\x51\x92\xe7\xc9\xb4\x6d\xcc\x1f\x25\x8c\xba\x93\x7e\xf1\x7d\x9f\x83\x3b\x5d\xa4\x7b\x13\xa8\x98\xa6\x6e\x39\x2a\xe8\x91\x1f\x3e\xb4\x54\xf0\x03\xff\x6d\x39\x0e\x5a\x12\xdf\xf1\x0f\xdb\x34\x91\xfa\xf9\x4a\xde\xf8\xba\xe7\xa8\xe0\x11\xff\x30\x3c\xdb\x6a\xa9\xe0\x00\xff\xf0\x0c\x0b\x0d\xe1\x03\xfe\xe1\xdb\x96\x63\xa9\xe0\x99\x94\xec\xea\x8e\xa7\x82\x4b\x5a\xb4\xe5\x9b\x1c\x0a\xe3\x5f\x15\x10\x0d\x43\xc0\x3c\x41\xad\x3f\x3f\x50\xd4\x5d\x11\xa4\x86\x2d\x65\x93\xa9\x45\xe2\xa9\x82\x7e\xc6\x17\x58\xe5\x9f\xa0\xd6\x3d\x3c\x52\xc8\xb4\x49\x1e\x1f\x14\x55\x4b\x66\xc4\x7a\x77\x10\x4f\xe0\x90\xde\x73\x14\x48\x9d\x58\x54\xfd\x48\x94\x5e\xe8\xa8\xe6\x5b\xe2\x18\xa3\xa8\x65\x97\x7c\xe6\x7c\x82\xda\x51\x27\x53\xcc\xe2\xab\x5c\xa3\xf2\x7d\x5c\x2e\xf6\xa1\xa1\xa8\xef\xdf\x43\x6d\x4c\xfe\x7c\x2d\x4e\x10\x36\x53\x58\x55\xb4\x10\x87\xeb\xf9\x7d\xfb\xfe\x63\xcd\xa1\x1e\x4b\x56\xfb\xf9\x68\xf4\x9d\xa9\x6a\xf0\x11\x49\xdf\xe5\x3d\x54\xf1\x42\x9b\x0d\x27\x0f\x75\xa1\xf7\xb7\x10\x1a\x6f\xec\xe4\xcc\x84\x7d\x62\x15\xde\x2c\x5b\x3c\x4e\x08\xbd\xc6\x2a\xac\x76\x9c\xe2\x75\x39\xe3\x88\x7a\x8d\x23\x96\xd1\xe2\xcf\x58\xc5\x70\xfb\x6f\xe9\x1f\x55\x23\xd1\xbb\x59\x8f\xa0\x93\x85\xc0\xa1\x89\xc7\x8d\x83\xfe\xb6\x7a\x52\x78\x1f\xc3\x87\xea\x30\xbc\x33\xb8\x81\x68\x31\x6f\x35\x15\xaa\x97\x0f\x7e\xa7\x3b\x54\xf5\x44\xb5\xcc\x99\x0a\x19\xbc\x38\x52\x0a\x84\x5a\xbc\xc7\x64\x10\xc0\xd3\x08\x16\x40\x06\x31\x87\x0a\x10\x29\x69\xc1\x2e\x14\xaf\xd8\x85\xb8\x9d\xa4\xbc\x13\xc7\x1a\xfd\xbb\x87\xbb\x9c\xac\x27\x21\x28\x8e\x24\x90\x50\x96\xd5\xf4\x31\x20\x4b\x14\x93\xce\xe1\xe6\xb9\xca\xeb\xb8\x79\x01\x6c\x9e\x2c\x8f\x9d\x28\x4d\xa6\x6c\xca\xca\xea\x2b\x06\xac\x1d\xa6\x7b\x4d\xfd\xf4\x72\x1b\x87\x18\x60\x03\x8e\xd2\xbd\xab\x97\xe0\xb9\x7d\x0a\xb5\xe3\x93\x5e\x7f\xd8\x3f\xc7\xd6\x8b\xce\x1f\x37\x06\xa8\x53\x13\xea\x89\x2e\x4e\xbb\x37\xa7\x67\x83\x8b\xce\x79\x9f\x5a\x82\x68\x26\x8e\x3f\x21\xcc\xf3\x75\xff\xcb\xa0\x5b\x66\x11\x7b\x1a\x6b\xdf\xe4\x5a\xa4\x5d\x9e\x9c\x7d\xee\x9f\xdd\xa0\x22\x6e\x06\xc7\xc3\xf3\xce\x71\xb7\x8f\x8d\x36\xaf\x40\x2c\xb6\xf9\x16\xb1\xcd\xed\xc5\x36\x97\x89\x5d\xcb\x49\x1a\x80\x91\x4e\xe6\x32\x99\xad\xb7\xc8\x6c\x6d\x2f\xb3\xb5\xbd\xcc\xd6\xeb\x35\xf8\x0d\xcd\x91\x79\x90\xdf\xb6\x65\x19\x8c\x93\xe9\x3c\x99\xc1\x59\xde\xb4\xb2\x6d\x83\x83\xc4\x5e\xbc\x13\x30\x01\x01\x18\x93\xfc\x99\x08\x13\x99\xf1\x98\x48\x00\xc1\x18\x04\x20\x56\xd9\x7e\xc0\x70\x91\x33\x90\x69\xf1\x94\x7f\x92\x80\x4c\x0b\xe6\x71\x77\x12\xc3\x59\xbe\x37\x01\x99\x08\xd0\x98\xdd\xcd\xe7\x93\x27\x1e\x9d\xd3\xbf\xc7\x47\xe6\x86\xd5\x8c\x66\x2e\xac\x96\xdd\x93\xe3\x83\xc1\xa7\x9b\x83\xc1\x97\xfe\xcd\xe0\xe8\xf4\xe4\xec\xbc\xdf\x2b\x4d\x70\xb5\x62\x31\x5c\xe7\xed\x25\xdf\xf4\xcf\xce\x4e\xce\x6a\xa5\x5f\x16\x8a\x6e\x69\x99\x72\xe7\x72\x48\x92\xc9\xb5\xcc\xd8\xb2\x2a\x36\x0f\x52\x13\x19\xb6\x01\x76\x1e\xb2\x53\xf2\x25\x28\x3d\x48\xd2\x29\x60\x0f\x2f\xe6\xe3\xca\x6f\x34\x9b\x86\xc4\x20\x59\x3e\x3f\x82\x79\x10\x52\x44\x57\x99\x12\xe6\x68\x02\x96\xcf\x06\x21\x9c\xe5\x71\xfe\x54\x49\x75\x92\x0d\xa6\xc1\x37\x58\x3e\xeb\xc2\x78\x8e\x7e\x5d\x6f\x82\x44\xdb\x12\x7e\x56\x01\xa6\xd0\xd9\x53\xe2\x1b\x19\xc4\xe6\x3c\xa9\xbf\x42\xd7\x1d\x6d\x1a\xa4\xdf\x3b\x59\x2f\x4e\x09\xc8\x0e\x1b\xaf\x91\x56\x67\x10\xb6\x0c\xe6\x58\xcb\x2b\xe5\xab\x0f\x32\xb6\xd7\x96\x78\x82\x6f\x30\x3f\x25\xd6\xf3\x95\xd6\x6b\x90\xef\xbd\x04\x0f\x59\x87\x58\xa8\x4e\x83\x34\x98\x66\xed\x97\xd7\xd7\xdd\xcf\xb0\x89\xd4\x4a\xd5\x97\x5c\xab\xa7\xbe\x4a\xaf\xf7\x60\xcd\x68\x7d\x0f\xb5\xd3\xb3\x93\x8b\x41\xaf\x7f\x06\x52\xb4\x8d\xe7\x18\xd0\x32\x0a\x26\x48\x35\xa4\xc3\xf1\x2d\x9c\x42\xf2\x81\x36\x98\x14\x56\x6f\x8a\x99\xaf\x96\x73\x71\xda\x05\xcb\xe1\x42\x18\x82\x58\xd0\x4e\x45\xf6\xf3\xfb\x8a\x0a\x02\x35\x8d\x34\x1c\x1e\xde\x7c\xee\xff\x4e\x59\xb5\xb9\x90\x54\x89\x9d\x7b\x6c\x5f\x74\xf7\xac\x8f\xb4\x6a\xf7\xcb\xc9\xd7\xde\xcd\xc1\xc9\xd9\x11\xb6\x9a\xa8\x8b\xc5\x3b\x03\xe4\x3c\xcd\x78\x83\xa2\xf1\x96\x55\x65\x00\xe7\x1a\xfd\x54\x71\x3a\x09\x66\xf0\x60\x12\xdc\x27\x25\x7e\x60\x98\x27\x29\x0c\x39\x46\x5a\xad\xc0\x7a\xf6\x63\xca\xaf\xde\x40\x14\x61\xbd\x7b\x7b\xe3\x5c\xfb\xe3\x19\x0d\x7a\xef\x23\x16\xb6\xb2\xa7\xde\xa0\xe7\x6d\xc1\xf3\x5e\xff\x02\x89\xd2\xe4\xde\xae\x9e\x13\x2b\x7a\x7d\xbf\x33\xc4\x71\x65\x0e\x4f\x86\xe7\x37\xfd\xe3\xce\xfe\x97\x7e\x8f\xec\x16\x42\x74\x85\xa8\x9f\x8f\x3a\xdd\xc3\xc1\x71\xff\xe6\xb0\xdf\xf9\x72\x7e\x78\xd3\x3d\xec\x77\x3f\x0f\xcb\xb2\x0a\x8c\x4c\x93\x7c\xcc\x84\xc7\x50\xa9\x14\xe4\xda\xfd\x7c\xbc\xf7\x82\xf1\x2f\xe2\xba\xb9\xc9\x5d\x85\xed\xa1\x3d\x78\xd0\xdb\x22\xd7\xa0\xa7\x82\xe0\x39\x2b\x72\x74\x18\xfb\x32\x53\x72\xf5\x15\xe4\x02\x56\xf2\xe6\x7d\x8c\xbb\x85\x74\xc0\x4d\xe7\x6b\x6f\x70\x7e\xf3\xe5\xe4\xd3\x27\x32\x8f\x50\x19\xf1\x2c\x66\xca\xe6\x32\xce\x6f\xbb\xc9\x74\x9a\xcc\x50\xc5\x20\xe7\x51\x57\x07\x69\x32\x5d\xa6\x93\x08\xb4\xe9\x3e\x89\x43\x49\x7f\xb7\xb7\x57\xff\xd9\xd0\x3a\x6a\x94\xa4\x0a\x39\x04\xe8\x20\xdd\x3b\x19\xfd\x09\xc7\xb9\xf6\x1d\x3e\x65\x8a\x20\xf1\x6e\xfe\xcf\x94\xa2\x92\x76\xf3\x0f\x1f\xd8\xd9\x3f\xbd\xca\xaf\x77\x4b\x5c\x0a\x81\x6d\x63\xf2\x53\x45\x83\xc5\xa0\x59\xe4\x55\x7c\xcd\x10\xef\x82\xac\x1b\x6a\x1c\x00\x2b\x9c\xf9\x5a\x71\x74\x58\xde\xa4\x66\x00\x5c\xae\xca\x1a\x15\x89\xe5\x6e\xe8\x1c\x0c\x3a\xe5\x9c\x23\x30\x68\xd8\x3a\x65\x83\xf2\x35\x54\x86\x2a\x7c\xba\xb7\xb7\x77\x9e\x6b\xf1\x77\xad\xd7\xbf\xf8\xb8\xb9\x94\x0d\xa5\x52\x2b\x9c\xa9\x37\xb5\xbd\xb2\x52\xa4\xa5\x28\xae\xef\x0d\xd5\xa2\xdc\xcb\xea\x7d\xdb\xd0\x8a\x74\x19\x80\x42\x4f\x05\x9b\x95\xbf\x5e\xbd\x01\xb8\x5c\xad\xad\x98\x37\x62\x8d\x04\x20\x52\x80\x1f\xf1\xff\x35\xa2\xd0\x30\x4b\x60\xa9\xac\xab\xf7\x7a\x00\x57\x1c\x22\xb6\xea\x02\x91\x2a\x03\x50\xe4\xb8\x81\x2b\x15\x1d\x4f\x51\xc1\x48\xc1\xdc\xcf\xc7\xcb\x7a\x43\x4e\xca\x63\xa6\x0c\xd8\x2f\x19\x40\x2d\xc9\xb4\x19\xb7\x70\x82\x7b\x48\x14\x25\x29\x95\x53\x8e\x0a\xac\xd1\x17\xd8\xb9\x8f\x30\x29\xc8\xe1\xfb\x3c\x9e\xc2\x2c\x0f\xa6\x73\xa5\xc6\x5b\xe0\x90\x8c\x55\xb9\x45\x3a\x17\xbe\x7f\x4f\x9a\x33\xe8\x7d\x54\x36\x19\x5e\x0c\xfd\xe7\x89\x48\xdb\x4d\x0a\x8c\x75\x84\x18\x12\xba\x59\x4e\x7a\xd1\xc4\xf7\x74\x9c\x59\x30\x83\xc4\x19\xe9\xad\x76\xfb\x9c\x8d\x19\x3c\xe8\xa9\x6a\x7b\xab\xde\x39\xee\x5f\x6e\x56\x57\xc1\x7a\xa5\x7d\x52\x9b\x70\x68\xfb\x86\x1c\x26\x9d\x7b\xbe\x64\x07\x85\xef\xdf\x43\x2d\x78\xce\xe8\x3f\x05\x14\x97\xdb\x2f\xf1\x0b\x90\xee\x31\x9c\x2e\x88\xf7\xf4\xdd\xf8\x9f\xe9\x6e\xfc\xe1\x83\x5a\x56\xdf\x79\x46\xea\x8b\x4e\xf9\xfc\x2a\xbe\x06\x47\x29\xde\xf5\x2a\xc2\xf0\xa9\x9a\x22\x81\x9c\x47\x86\xae\xd0\xa7\xb9\x16\x3c\x03\x48\xd7\x07\x9e\xfb\xc1\x7c\xce\x4f\xfd\x38\x3b\x4a\x42\x48\x37\x99\x61\xe1\xcd\x41\x51\x17\x8b\x0d\x2b\x10\x7f\xa2\x00\x90\x7b\x21\xd4\xd5\xcb\xca\xab\x7d\x25\x01\xf7\xa9\x56\x92\xa7\x15\x58\xf1\xf6\x81\x66\xd0\x36\xe5\xf2\x9f\x6c\x9a\x05\xf3\x6f\x51\xc9\xfc\x9d\xaf\xf3\x8c\x0b\x17\x5e\xc3\xf1\x70\xd0\x0f\x75\x98\xd1\xbc\xfe\x40\x8c\xe6\x8a\x0a\xaa\x3d\xd4\xde\x6a\x7c\x3e\xe6\x1b\x55\x23\x1e\x1d\x15\x90\x5e\x44\xcf\xbb\x1b\x1d\xa3\x31\xee\xba\x04\x3a\xaf\x4d\x5f\xd7\x2f\x6a\x5b\x96\x01\xed\xe1\x9f\x58\x6b\x5d\x39\x91\x6a\x2b\x33\x66\xab\x5a\x99\xce\x5a\x52\x75\xb5\xaf\x6b\x33\x97\x6f\xf2\x7f\xa6\x72\xbe\x2e\x54\xfb\x6b\x65\x06\x17\x37\x17\x91\x8a\x23\x2a\xec\xaa\xb8\xe6\x94\xd3\x5d\x39\x4a\xaf\xf4\xeb\x65\x27\xb0\xeb\xe2\xde\xb6\xed\x3d\xbe\xf3\xc7\x8d\xa9\xbe\x7f\x9f\x6b\xf3\xbb\xec\x56\x59\x52\xb1\xb1\xb4\x62\xba\xee\xb7\xac\xd1\x5a\x5b\xa3\xb9\xaa\xc6\x92\xa3\x83\x2f\x01\x67\x38\x68\x77\x30\xa1\xcb\x73\x85\x67\x07\x5c\x59\xf1\x81\x93\xde\x21\x3a\x97\xc3\x5a\x09\x3c\x33\xe7\x1b\xcc\x8f\xba\x2b\xbf\x18\x6e\xd0\xe7\xcd\x0f\x1c\x7c\xf9\xfd\xc7\x1c\xce\xc2\xee\x24\xee\x4e\x05\xbb\xcc\x16\xd5\x6c\xf6\x89\xe6\xe3\xd5\x4b\x9c\x9d\xa6\x30\x8a\x1f\x4f\x22\x12\x49\xae\x3b\x0d\xdb\xef\x74\x30\x9e\x22\xb5\xdd\x96\xf3\x60\xf6\x7c\x27\xc9\xa8\xff\xc7\x41\x5e\x0c\x51\xb7\xb4\xc7\x20\xc5\x27\x7a\xda\x1e\xe7\xda\xe5\x54\x3b\x2a\x6c\x2d\x40\x66\xd6\x16\x69\x0e\xd3\x69\x9c\x65\x71\x32\xcb\xa4\xe0\x21\x93\x32\x98\xcb\xea\xeb\x75\xfb\xea\x9a\xef\x8c\xee\x24\x5e\xbe\x30\x66\xf0\x41\x0a\x72\xed\x3b\x48\xf7\x5e\x48\xdc\x9d\xd3\x20\xbf\x6d\x43\xc0\x99\x8a\xda\x42\xc1\x00\x77\xb7\x2b\x52\x90\x81\x55\x54\x00\xf9\x11\x28\x5e\x57\xc6\x45\x51\x5f\xcb\x6f\x23\x44\x4e\x25\x2d\x87\x31\x98\xcf\x27\x4f\xe7\xdf\xbf\x11\x23\xdf\x9a\x41\x2c\x67\x20\xc9\xf6\xf9\x13\xc9\x76\x90\xa4\x9d\xcb\xa1\xf2\x32\x27\xdf\x29\x99\x1c\xec\xdc\xac\x72\xec\x34\x1a\x6a\x1e\xf6\x1f\x99\x71\x7c\xe3\x3a\x89\x11\xe0\x2d\x95\xc6\x85\x25\x9e\x72\xbe\x04\x64\xbc\x72\x13\x7e\xf7\x2e\xd7\xe2\xd9\x78\x72\x17\xc2\x4c\x91\x3b\x97\xc3\x1b\x59\x5d\x2c\x14\x1c\x3f\x4e\x81\x1f\xe4\x02\xeb\x29\x61\x97\x0d\x98\x4a\x50\x0b\xa6\x14\x4f\xe0\x3b\x59\x05\xef\x0c\x91\x0c\x67\xb4\x0b\xd8\xd5\x1c\xcb\xbf\xf9\xe2\x27\x05\x2d\xeb\x86\x17\x54\x37\xc5\x6c\x64\x98\x99\x25\x90\xe0\x34\x4d\xc6\x30\xcb\xd6\x08\x00\x72\x90\xb2\x73\x62\xe5\x2b\x91\x52\xb2\x91\x33\x98\x9f\x27\x07\x71\x9a\xe5\xc3\x1c\xce\xd9\x57\xf1\x8a\x71\x86\x51\xc1\x88\x75\x64\x78\x37\x46\x55\xe3\xfe\xe6\x48\x76\x0d\xb8\xc2\xd2\xaf\xe3\xef\xf4\xca\x96\x11\x67\x27\x33\xae\xfe\xc5\x42\x81\x7b\xd4\x24\xaa\xc8\xa4\xd4\x78\xf6\x4d\x7a\x88\x27\x13\x29\xb9\x87\xe9\x43\x1a\xe7\x10\xa3\x5c\xc3\x20\x0f\xa4\xa7\xe4\x4e\xba\x0d\xee\xa1\x84\x5d\x56\xc1\x50\x93\x70\xdf\x30\x90\x3a\x69\xc8\x47\x59\x55\x01\x6c\x48\xcb\x23\x3b\x96\x2f\xfd\x17\xcc\xe6\xa6\xcd\x6e\x53\x3b\x83\xd0\x10\x85\xd6\x33\x66\x7e\x07\xf1\xe4\x2e\x85\xe2\xb4\xa5\x75\x49\x51\x01\x1a\xeb\x36\xd4\xf2\x20\xfd\x06\xb1\x97\x37\x98\xa1\xbd\xb6\x70\xd3\xd7\xe6\x46\x83\x9f\xfd\x60\x44\x3c\xe9\xd4\xdf\x0b\x67\x26\xc7\xc2\x05\xc9\xac\xd2\x90\xd5\x33\xaa\x9a\xb1\xd2\xaa\x15\x13\x84\xa6\x7b\xdd\x15\x24\x24\xbf\x94\x1c\x73\xc0\x49\xa3\x71\xb7\xef\xc9\xa5\xcd\xab\x66\xc6\x92\xc1\x37\x98\x37\x75\x0b\x39\x68\xf3\x5f\x13\xb1\xb9\xa6\x2d\x0f\x82\x60\x28\xb1\x02\x64\x10\x96\x6c\xc3\xb6\xcc\xba\x0f\x73\x17\xd0\xaa\xa7\xc8\xe9\x94\x31\x89\x30\x82\x5a\xfe\x50\x9a\x7f\x40\x6c\xb4\x66\xed\x17\xbe\x6c\x94\x07\x65\xc9\x72\x38\x27\xd1\x71\xab\x95\x34\x13\x71\xaf\xe5\x57\x30\x9e\x04\xcf\xcf\xed\x5f\xe1\x2b\xdf\xe2\x9a\x4d\x6e\x5d\xa3\x2b\x37\x1b\x2c\x5b\x96\x6b\x33\x22\x72\x37\xc8\x20\x73\x61\x22\x80\x31\xa8\x1f\x4a\xf8\x02\xad\x31\xab\xb5\x80\x31\x17\x51\x2f\xa5\x30\x4b\xee\xd2\x31\xcc\x24\x34\xe5\xd0\x4a\x44\x4f\xab\x3b\xb4\xb0\x1e\x20\x4b\xf4\xb9\xac\xfe\xb4\x5e\xbc\x4d\x2b\xbd\x48\x2d\x9d\xeb\x7a\x0f\x9d\xb6\xa9\x2c\x1c\x9d\x6f\x49\x27\x08\xe9\x9b\xd5\x06\xdd\xcf\xc7\x4b\xdb\x51\xbc\x13\x89\xff\xa9\x2a\xfe\x09\xff\x85\x4b\xd8\x84\xe2\x28\xc6\x25\x55\x26\x9c\x22\xae\x1a\x6d\x97\x95\x82\x27\x4b\x94\xa4\xd3\xcb\x38\xbf\x3d\xb9\x87\x69\x1a\xa3\xad\x12\x17\xce\xdb\x7c\x5f\x96\x4e\x0b\x76\xb4\x3a\x4d\x42\xea\x4d\x8c\xfb\x7e\xd1\xb4\xc2\x0a\x36\x83\xb7\xfb\x77\x60\xb4\x7b\xa1\xa7\x05\x4a\x46\x56\xae\x2a\xbc\xe7\x93\xe1\xcd\xe0\xa8\xf3\xa9\x3f\xbc\x06\x2f\x29\x3e\x72\xb7\xa1\x46\x49\xd0\xaf\xab\x1c\x37\x88\x8b\xab\xba\x6b\xa8\xbc\x6a\xf8\x54\x1d\x5e\x57\x4f\x4f\x55\xcb\xf5\x6a\xd7\x2c\xcb\xe5\x62\xe5\x28\x2b\xe4\x6a\x8e\x3b\xe4\x4e\x21\xdf\x60\x7e\x71\xda\x45\xa7\x4b\x20\x23\x95\x0d\x43\x29\x4f\x24\x76\xba\x93\x26\x71\x96\x4b\x49\x54\x01\xb8\x67\x84\x7e\x89\x89\x5f\x78\x2e\xc4\x90\x1c\x9e\xa8\x05\x47\x93\x57\x75\xa5\x58\xe4\x66\x7f\xad\x97\xbb\x73\x39\xec\xdc\x07\xf1\x24\x18\xc5\x93\x38\x7f\xfa\x23\x99\xc1\xb5\xed\x08\xb8\x0c\xd2\x33\xca\xf1\x13\x1a\xc3\xe8\xf5\x02\x42\x75\xb3\x09\xd4\x6b\x2b\x36\x23\xae\x92\x1c\x2b\x20\x92\xf6\x27\x88\x8c\xbf\x94\x9c\xff\x7e\xda\xdf\x50\x6a\x76\x1b\x5e\x2f\x37\x0e\x64\x99\xa3\xa4\x3f\x41\xec\x62\x41\x6f\x26\xf5\xc9\x10\xab\xcb\xf5\x42\x9f\x0c\xa5\x18\xa7\x5c\x26\x33\x92\x0f\xa6\x1a\x07\x08\x11\x40\x5d\x57\xaf\x6a\xea\x31\x82\x3f\x17\x91\x5f\x0a\x3d\x93\xd7\x2f\x58\xe8\xa0\x58\x71\xea\x43\x3d\x54\x12\x87\xec\x39\xd6\x2f\x84\xe2\x7f\x91\x6a\x7f\xbc\x99\xe2\xdf\x87\xda\x01\xa5\xd5\x58\xae\x72\x01\xb5\x1f\x77\xc5\xaf\x5e\xaa\x9d\x17\x3f\x7e\xa4\xda\xef\xc5\x8f\xef\xa9\x36\x39\x2d\x7e\x7d\x4d\xb5\xde\x63\xf1\xeb\x09\x6a\xc3\xfd\x1f\x5b\xb9\x0d\x78\xc8\x76\x28\x3c\x74\x85\xd3\x00\xc3\x26\x4e\x03\xfc\xd5\x4e\x03\x98\x9f\xfc\x2a\x17\x1f\xc8\xd3\xd1\x8e\xa9\x37\x39\xf9\x7c\x4c\xf2\x20\x25\x49\xc3\x38\x95\x81\x4c\x63\x76\x53\xfe\xb3\xa5\x97\x8c\xc7\x22\xfa\x78\x1e\xa0\xc3\x32\x7c\x94\x81\xac\xd7\xe9\x8f\xe8\xe4\x24\x03\xf9\x3b\x7c\x1a\x25\x41\x1a\x7e\x41\xf3\x79\xc6\xd1\x38\xb3\x9d\x78\x16\x25\x34\xe1\xce\x24\x9e\x7d\x17\xc5\x2b\x67\xfe\x0e\x8c\x0a\x57\xf2\xf3\x62\xa1\x7c\x66\x41\x91\x71\xc7\x49\xf8\x54\x42\xe8\x8e\xbe\x6d\x04\x91\xe9\xc3\xd6\xd8\x37\x5a\x9e\x13\x85\x23\xd7\xb6\x5d\xd3\xd5\xc3\x51\xab\x15\xba\xde\x28\x1c\x85\x7a\x34\x1a\xd3\x08\xc8\xae\x61\xb8\x86\xe7\xb8\x8e\x6e\x3a\xb6\xe1\xbb\x2d\xb3\x46\x47\xec\x0d\x2e\x6a\x74\x40\xf4\xa4\x84\xce\x36\xa8\xcc\xec\xa4\x99\xcc\xa4\xce\x34\x78\x4e\x66\xd2\x25\x1c\x49\x6c\xf7\x93\x2a\x04\x42\xb7\xc1\xd4\xab\x3f\xd1\x4b\xe2\x9e\x81\xc3\x44\xef\xc0\xb1\x49\x02\xcb\xe3\x41\x49\xa2\x28\x83\xf9\x4e\x9e\xcc\x77\x4c\xca\xfc\x6e\x84\xc0\xb7\x00\xc3\x1f\x93\x09\x30\xca\xd1\xf0\x8d\xf2\xd9\x0e\xf5\xa4\x8a\x26\x48\x8e\x26\x08\xc0\x70\x70\x06\x24\x6e\x0c\x07\x61\xd0\xcf\x93\x49\x9c\xc3\x82\x66\x4e\x23\xe9\x53\xe6\x6d\x14\xd3\x58\xf6\xe8\x8f\x1d\x16\x3a\x0c\x30\x22\x02\x4a\x89\xde\x7c\x9d\x13\xe8\x86\xdc\x10\x29\xb9\xcb\x27\xf1\x0c\x33\xf1\xf1\xcd\x69\x07\xbf\xe2\xe6\x46\x39\x11\x7e\x5d\x2c\x94\x5f\xe9\x44\x20\x89\x6b\xdf\x34\xc8\x54\x25\x23\xad\x87\xe3\x96\xad\x07\x86\xee\xeb\xa1\xe5\x8e\x42\x67\x14\xfa\x30\x32\x5c\xc7\x31\x0c\xdf\xf6\xa1\xed\xf8\x51\xe4\x38\x06\x73\x84\xe1\x3b\x9e\x61\xb8\xb6\x6d\xb8\x86\x6f\x19\xba\x6d\xb7\x25\x72\xd9\x93\x2a\x7a\x6f\x0b\x8f\x18\xac\x93\x05\x9e\x31\x50\xc3\x4b\xd0\xf9\xf2\x51\x22\x20\xfa\xa2\x4b\x44\x43\xb5\xa4\x33\x61\x18\xaf\xea\xca\x3f\x17\x0b\xe5\x4f\xda\x95\xec\xdc\x9d\x48\x74\x75\xa1\x2b\x00\xca\x5f\xe9\xcf\xc0\x8c\xcc\xc8\xf0\xf5\xb1\x3d\xf2\xbd\x91\x17\x42\x68\x79\x86\x1f\x44\x63\x3b\x74\x47\xba\x0e\x47\x46\x68\x3b\xa6\xcf\x1c\x70\x78\xba\x67\xb6\x5a\x96\xab\x9b\xbe\x69\x5a\x86\x8f\xfa\xb3\x8f\xca\x14\xf6\x66\xa5\x11\x44\x3b\xd0\x4d\x67\x45\x1b\xfe\xbd\x58\x28\xff\x2e\x9c\x17\xac\x99\x0e\xbe\xeb\xfa\xd1\x78\x14\x39\x76\xa0\x47\xfa\x18\x5a\x6e\xe4\x5b\x2d\xc3\x0c\x61\xcb\x0d\x3c\xc7\xb6\x83\xc8\x1c\x59\xf6\x88\x79\x51\x71\x5a\xba\x63\xe9\x2d\xdf\xf0\x74\xd7\xf1\x6d\xdf\x6c\x4b\x64\xb7\x12\x35\x60\x73\xb6\x2c\x26\x5a\x54\x78\x28\xcd\x40\xce\xf8\x89\xc9\x33\x36\x4a\x8e\x9d\xb5\x01\x49\x22\xd7\x66\xc1\x7d\xfc\x2d\xc8\xa1\x42\xc2\x89\x9c\x9d\x7c\x3d\xef\x0f\xb5\x2f\x9d\xe3\xde\xe0\xf8\x93\x88\xde\x63\x03\xf9\xd6\x64\x2c\x44\x1c\xa5\x93\xd2\x0f\x71\x54\x4c\x2a\x92\xbb\x84\xac\x87\xa3\x30\x82\x7f\xa5\xc0\xd9\x9c\x4e\x41\x63\x42\x63\x0e\xf0\x6d\x90\xc2\x70\x27\x84\x13\x98\x43\x1c\xb6\x75\x67\x9e\xcc\xef\xe6\x3c\xb7\xc5\xe7\xe8\xc2\x94\xd8\xb8\x93\xc1\x9c\x0f\x25\x6d\xe8\xe5\x56\xb5\x09\x65\x25\x17\x33\x47\x74\x8e\xb0\x62\x18\x40\x96\xce\xfa\x17\x83\xfe\xa5\x44\x40\xd0\x5f\xcf\xb0\xd2\x5f\x1a\xae\x8d\x31\x7b\xc9\xa0\x72\x04\x5e\x0b\xec\xa7\xc0\xd0\x81\xb3\x8a\xc1\x5b\x27\x33\xd6\x83\xe0\x78\xe0\x30\x05\x4c\xee\x32\x24\x8d\xcb\x51\x06\x37\x8c\x0a\xe4\x88\xb8\x28\x1b\x90\x3a\x88\xd6\x15\x86\x3e\x60\x8c\x97\x7c\x0d\xe3\xa5\x4c\x97\xb2\x03\xb0\x28\x59\xa9\xea\xde\xe1\x13\x2e\x41\xae\x94\x1e\x40\xc5\xe4\x4a\x12\x50\x81\x75\x50\x95\xf3\x58\x89\x96\xf0\x98\x6a\x87\x24\x06\xc1\x41\xaa\x7d\x05\x0f\xa9\x76\x4c\x83\x2a\x3c\xa7\xda\x10\x5c\xa6\xda\x21\xc7\x3b\x14\x3a\x67\x27\x93\x0d\x53\x12\x83\xf1\x38\x49\xc3\x38\x99\xed\xdc\xc2\x00\x33\x0f\xf1\xbb\x97\x28\x99\xe5\x3b\xe8\x48\xd5\x36\xec\xf9\xe3\x2e\xf3\x44\xef\xcf\x1f\x25\xa3\x35\x7f\xdc\xa5\x3e\xfb\x6d\x0f\xfd\x27\x76\x01\xbf\xbe\x16\xa9\xf6\x92\x05\xcf\xc7\x1a\xe3\x85\x55\x31\xf6\x3c\x6b\xfc\xca\x14\x89\x56\x1c\xc3\xc4\x3e\xee\xb1\x6f\x7e\xec\x25\xa0\x8d\xe5\xac\xfa\xee\x17\x7b\xd1\xc7\x5e\xfc\xa3\x49\x12\xe4\x6d\x74\x98\x7c\xbd\x35\x57\x94\x8d\x32\xe8\xaf\xff\x37\x85\x61\x1c\x48\x4a\xe9\xc7\x5e\x72\x3c\x77\xfe\xa8\xbe\x68\x95\x1d\x72\xc3\x58\x0e\xeb\xf2\x48\x92\xa4\x95\x3b\xaa\x20\x01\x90\x36\x2a\x83\xed\xad\x22\xb1\x48\x33\x0c\x5d\xff\x9f\xd7\x92\x69\xfa\x7a\x0d\x3e\x0b\x9c\x74\x07\x50\x59\xe6\x63\x7f\xeb\x1b\x4e\x79\xff\x98\x26\x21\x66\xa6\x75\xf6\xd9\xfd\x03\xfb\x23\x25\x2f\xe3\xd9\x9f\xe8\xe5\xf8\xb7\xa1\xf2\x42\x16\x33\xba\x93\xf4\xa1\xb6\xff\xac\x45\x49\xda\xbd\x8d\x27\xa1\xf2\x5b\xaa\x5e\x03\xfc\xac\xa0\xca\xfe\xfa\xf7\x13\x9f\x7d\xd8\xce\xda\x57\xc7\xb9\x76\x76\x0d\xca\xf6\xdc\x40\x0d\x3e\x83\xcf\x29\xe8\x40\x6d\x0a\x8e\xa1\xf6\x25\x98\xa1\x95\x77\x94\x84\x77\x13\x08\xe6\x50\x1b\x5d\x17\x63\xf3\x7a\xad\xbe\x2a\xea\xee\xff\x07\x00\x00\xff\xff\x73\xb2\xc8\xf3\x1b\xa4\x01\x00") - -func bindataTkgWebDistTkgkickstartui917es5811d90b19a852dcbc427JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartui917es5811d90b19a852dcbc427Js, - "tkg/web/dist/tkg-kickstart-ui/917-es5.811d90b19a852dcbc427.js", - ) -} - -func bindataTkgWebDistTkgkickstartui917es5811d90b19a852dcbc427Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartui917es5811d90b19a852dcbc427JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/917-es5.811d90b19a852dcbc427.js", - size: 107547, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiAssetsImagesAwsec2Svg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x93\x41\x6f\xdb\x30\x0c\x85\xcf\xcd\xaf\x10\xb4\xab\x47\x53\x94\x48\x49\x85\x9d\x62\xc3\xd0\x53\x7a\x19\xb6\xc3\x8e\x41\xe3\x39\xc6\x52\x3b\x88\x8d\xc4\x3f\x7f\x70\x63\xd8\x75\xd7\x01\xb9\xe9\xd9\xef\xf1\x83\x44\x32\x7b\xe8\x5f\x0e\xea\x5c\x9c\xda\xaa\xa9\x73\x6d\x00\xb5\x2a\xea\xe7\x66\x57\xd5\x65\xae\x7f\xfe\x78\xfc\x1c\xb4\x6a\xbb\x6d\xbd\xdb\x1e\x9a\xba\xc8\x75\xdd\xe8\x87\xf5\x2a\x6b\xcf\xa5\xba\x54\xbb\x6e\x9f\x6b\x62\x39\xf6\x5a\xed\x8b\xaa\xdc\x77\xb9\xb6\x06\x07\x79\xae\x8a\xcb\xd7\xa6\xcf\x35\x2a\x54\xc4\xa2\xac\x41\xfd\x16\x64\xb4\xea\x5f\x0e\x75\x9b\xeb\x7d\xd7\x1d\xef\xd3\xf4\x72\xb9\xc0\xc5\x42\x73\x2a\x53\x42\xc4\xb4\x3d\x97\xa3\xe5\xbe\x3f\x54\xf5\x9f\x8f\x8c\x26\xc6\x98\xbe\xfe\xd5\xea\x78\x2a\xda\xe2\x74\x2e\xbe\xb4\xc7\xe2\xb9\xfb\xbe\xed\xaa\x26\xd7\xfd\x53\xb5\xfb\xf5\x54\xed\xf4\x7a\x75\x97\x95\xeb\xd5\xdd\x5d\x76\xdc\x76\x7b\xb5\xcb\xf5\x93\x23\xf0\xec\x12\x72\x0e\x5c\x64\xb5\x31\x04\xc1\x4a\x42\x6c\xc0\x92\x99\x34\x7b\x60\x61\xb5\x19\xed\xe2\xc0\xa1\x9b\xe4\x98\xd6\xea\x77\x75\x38\xe4\xfa\xd3\xa3\x04\xb6\xa2\xd7\x59\x3a\x70\x96\xc0\x80\x80\x81\x12\x62\x86\x68\xcd\x5c\x42\x04\xd8\xc6\x49\x3b\x02\x31\xa4\x36\xa3\x9d\x2d\x10\xfa\x49\x8e\xe9\x9b\x80\x86\x3c\x44\x91\x84\xc4\x83\x04\x33\xd7\x08\x0c\x84\x3c\x6b\x0b\xd1\xc9\x70\xe3\xab\xdf\x19\x70\x42\xb3\x1e\xf3\x37\x31\x89\x25\x21\xc7\x80\x3e\xce\x05\x2c\x46\xc0\xf8\x86\x80\x6a\x33\x18\xc5\x01\x1a\x7f\x3d\x8f\xa1\xdb\x2e\x86\x04\xce\xb9\xc4\x10\x78\xb1\x8b\xb2\xff\x22\x47\x2f\x45\x01\x6b\xfd\xfc\xe1\x1a\x9e\x78\xf1\x1b\x23\xf1\xc7\x3c\x41\xb0\xc4\x89\xb5\x10\x68\xf9\x6a\xb4\x78\x54\xc3\x4e\x6d\x46\x33\x79\x06\xf2\x32\xe9\xd7\xf0\x4d\x34\xf2\x80\x46\x12\x46\x70\xde\x2f\xc6\x02\xc3\x62\x6a\x5c\x08\x6a\x33\xba\x89\x03\x88\x71\x93\xbe\xa6\x6f\xe2\xbd\x1b\x74\x4c\xc4\x42\x0c\x76\x38\x0d\x4d\x31\x43\x87\xde\x2c\x07\xdb\xf7\xcb\xf1\x7f\x4a\x96\x96\xeb\x55\x36\xec\xf2\xfa\x6f\x00\x00\x00\xff\xff\xdf\x91\x36\x0e\x6b\x04\x00\x00") - -func bindataTkgWebDistTkgkickstartuiAssetsImagesAwsec2SvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiAssetsImagesAwsec2Svg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/aws-ec2.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiAssetsImagesAwsec2Svg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiAssetsImagesAwsec2SvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/assets/images/aws-ec2.svg", - size: 1131, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiAssetsImagesDockerSvg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x4b\x8f\x1c\x47\x72\xbe\xeb\x57\x24\x7a\x2f\xf6\x81\xc1\x8c\x77\x86\xa1\x11\x20\x17\x64\xf0\xd0\x86\x0d\x18\x3b\x07\xde\x08\x71\x96\x24\xcc\xa5\x08\x92\x22\x77\xff\xbd\x11\x91\xf5\xe8\x19\x72\x6d\x88\xdb\x02\x0c\x2c\x01\x41\x9c\xaf\xa3\xaa\xbe\xcc\xc8\xc8\x78\x64\x45\x7d\xff\xfe\xe3\x8b\xf6\xe9\xd5\xf3\x0f\x2f\x6f\x4e\xd6\x4f\xed\xe5\xdd\xab\x17\x2f\x3f\xcc\xbf\x3f\xbe\xba\xfb\xf4\xaf\xbf\xfc\xe5\xe6\xd4\x5b\x6f\x96\xff\x9d\xda\x9f\x5e\xbd\x7e\x7d\x73\x7a\xf3\xcb\x9b\xbb\x53\xfb\xcb\x9f\x5f\xbf\x79\x7f\x73\x7a\xf9\xe1\xc3\xdb\x7f\x79\xfc\xf8\xd3\xa7\x4f\xf0\x89\xe1\x97\x77\x2f\x1e\x53\xef\xfd\xf1\xfb\x8f\x2f\x4e\x3f\x7c\xf7\xfd\x8b\xf6\xf3\xeb\x57\x6f\x1f\xbd\x7d\x96\x0c\xbf\xbe\x7b\xfd\x4f\x7f\x48\xdc\xff\x39\x65\xf9\x63\x3d\xf1\xd1\xbb\x5f\x5f\xdf\xdd\x9c\xee\x3e\xde\xbd\xf9\xe5\xf9\xf3\xd3\xbc\xe5\xc1\x6f\xcf\x6f\x4e\xff\x8e\x04\x9d\x58\x1a\x0d\x10\xf3\xf1\x04\x07\x10\x0e\xbe\x25\x82\xc1\x86\x4f\x56\xf9\xed\x2a\x7f\xba\x8d\xf7\x0f\x62\x3f\xca\x4f\xfd\xf4\xf8\x6b\x48\x05\xbc\x13\xc7\x41\xda\x61\x84\xd3\x4e\xba\xca\xcf\x0f\xae\xbb\x0e\x39\x06\xb0\x88\xef\xe4\xa4\xa0\x1c\x07\xf9\x2a\xbf\xee\x8c\xc9\xc0\x4c\xc7\x4e\xca\x04\xc3\xba\xec\xa4\xab\xfc\xba\xa4\xcc\x10\xc3\x0e\x52\xe9\x80\x03\x7d\x27\x5d\xe5\xd7\x25\xdd\x0d\x0a\xc1\x7b\xc4\x6e\x50\x68\xd0\x7d\x5c\x18\xd4\x94\x5f\x79\x4d\x57\xd2\x6d\x4d\x77\xd2\x6d\x4d\xaf\x49\xba\xaf\xe9\x4a\xba\xad\xe9\x46\xba\xaf\xe9\xef\x41\x8a\x02\xa1\x78\x90\x06\x30\x75\xde\x39\x57\xf1\x75\x38\x75\x80\x31\x59\x23\x01\x75\x19\x8b\x3a\xb0\x61\x23\x06\xc7\x68\x2a\xd0\xa9\x7b\x42\x56\xd6\xa6\x08\x1a\x18\x79\x75\xef\x3e\x16\x45\x10\x43\x4b\x35\xe9\x18\xd2\xb4\x03\x21\x7b\xc3\x00\x95\xb0\x26\x0e\xc1\xa8\x0d\x1d\xdc\x91\xcf\xe2\xd0\x87\x45\x62\xea\xa2\x67\x31\x50\x62\x6e\x38\xa0\xab\xc4\x22\x0a\x82\x29\x0f\x70\x16\x6f\x92\x53\xed\xb5\x0c\xe1\x34\x9a\x28\x20\xda\x4e\x2f\x0a\x24\x1a\x8d\x14\xc8\x90\x52\x6c\x83\xb0\xa5\xa6\xbc\x5b\xdb\x1e\x4f\x0e\x16\x54\xd7\x0f\x2f\x97\x83\xc1\xa3\x09\xc3\x70\x19\x8d\x02\xd0\x30\x9a\x20\xa0\xf3\xc4\xd8\xe5\xdc\x21\xba\xab\xc8\xf6\xc3\xd2\x01\x03\xc5\xbd\x31\x03\x1b\x71\x43\x10\x74\xb7\x26\x01\x4a\x9d\x1a\xf5\x9a\xc7\x86\x17\x66\x18\x91\x03\x5b\xe5\x39\x60\x4b\x5e\x0a\xf7\xd4\x96\x98\x6a\xe3\x0e\x24\x82\x8b\x12\xa0\x0f\x29\xec\xc4\x4d\x0d\xbc\xf7\xc2\xaa\x88\x4d\x07\x04\x32\xe5\xf4\xc8\x95\x97\xc4\x66\x51\xb8\xb3\x35\x0d\x10\x37\x49\x75\xa0\xa0\x3f\xc4\xe7\x07\x6b\xfd\x45\x03\xfa\xf3\xb3\xf7\xff\xdd\x5e\x3d\xbf\x39\xe5\x1f\xfd\xd4\xf2\x9f\x47\x1f\xfe\xfa\xf6\xee\xe6\xf4\xec\xf5\xdb\x97\xcf\xe6\x2f\x7f\x7c\xf3\xea\xc3\xfb\x9b\xd3\xaf\xef\xef\xde\xfd\xd7\xdb\x67\x3f\xdf\xfd\xc7\x9b\x3f\xbe\xcf\x10\x77\x73\xd2\x53\xfb\xeb\xcd\x49\xf0\xb4\x85\x49\xba\x08\x93\xb1\x87\xb1\xda\xd8\x0a\x3e\x72\x91\x11\x86\x30\x2f\x88\x80\xd1\x31\xd5\x23\xec\xcd\x80\x84\xd1\x13\x9a\xb9\x35\x05\xea\x41\x5c\x98\xd0\x96\x01\xa6\x1a\x94\x8b\x2c\xa1\x9a\xbb\xc6\xc3\x2c\x6d\x34\x30\x38\x67\x19\x18\xa3\xc9\x80\x41\xe4\x0b\x31\x74\x47\x4c\x9c\xdb\x29\x6d\xce\xb1\x73\xde\x6f\x1c\xd2\x1e\x0c\x67\xd7\xce\xa7\x97\xaf\x3e\xdc\x95\x6e\x1e\xe7\xd4\x2b\x48\xe7\x1f\x6b\x7c\x2e\x3d\x55\x7c\xbe\xa7\x3a\xfc\xed\xaa\x7b\xc4\x54\xca\x7b\x84\xb2\x6b\x0f\xd1\x0e\xf5\x25\xb8\x54\xe0\x23\x46\x60\x8e\xd1\xb0\x23\x20\xea\x79\x30\xa8\x28\x7f\x86\x1f\x21\x83\x5b\xe8\x79\xbf\xe3\xf3\x5f\xd6\x7b\x7e\xcb\xb4\xf1\xeb\xd2\x12\x02\x0e\x56\x6d\xda\x9f\x90\x83\xb3\xc6\x2d\x07\x74\x72\x7d\xb2\x8a\xce\xc7\x25\x5f\x1a\xcf\x8b\xed\x7f\xbf\x3d\x96\x28\x90\xa3\x35\xe9\x30\x14\x17\x64\xe8\xd6\xa3\x09\x01\x22\x79\xc3\x0e\x12\x63\x24\x1e\x84\xdc\x1c\x7c\x20\xf3\x86\x17\x03\xe9\xc2\xb8\xcb\x15\xba\x77\xd5\xc4\xc6\xb9\x71\x61\x74\xd4\x92\x53\x28\x2f\x02\xd6\xb5\xd7\x86\x37\xb1\xf6\xbf\xc2\x45\x6b\x73\x4a\x79\x25\x19\xd1\x0c\x2c\x64\xda\x7b\xa8\xca\x31\x98\x89\x17\xec\x19\x7a\xc6\x2e\x47\x06\x11\x2c\x39\x8e\x88\xb4\xe7\x91\xbe\x7b\xdf\x5e\x0a\x46\x6c\x89\x15\x9d\x53\x2e\x92\xf6\x9f\xdb\x0e\x0b\x5f\xe8\xe6\x70\x0e\xcc\x8e\x0b\x7e\x75\xec\x56\xf5\x7c\x24\xa2\xe1\x42\x3d\xf5\x44\x1b\xae\xb0\x81\x32\x1a\x07\x10\xb3\x1f\x78\x00\x8a\xe2\xb2\x63\x87\xae\xa6\x6d\xbb\x9f\x2d\x1d\x75\x85\x89\x7c\xfc\x0a\x17\x1c\x20\xae\x72\x88\x1d\x34\x46\xec\xb7\xef\x78\x7d\xfc\x8e\x57\xfa\xed\xfe\x6d\x78\xf7\x47\xff\x05\x4b\xfc\x1a\x7d\x0c\x45\xc9\x11\x69\xa0\x2c\x17\x58\xb0\x6b\x32\x86\x74\x4f\x4c\x9a\xd9\x5d\x4f\x9f\x55\x72\x54\xa6\xbc\x3e\xd0\xe7\x8c\x9c\xad\xe2\xa4\x98\x16\x26\xe1\x1a\xb1\x11\x6d\x38\x35\x12\x22\x17\xf2\x01\x22\x3c\xf9\x69\x8c\x03\x0f\x40\xed\x63\xb9\xc0\xee\x54\x1a\x99\xf7\x07\x90\x3b\x1e\xcf\x9f\x38\x17\x14\xc7\x2e\xcd\xe5\x19\x88\xfb\xdd\x17\x38\x9f\x7e\x4e\xec\x62\x89\xfb\xb0\xbc\x59\x43\xe7\x6a\xd3\xe0\xbc\x5c\x7b\xcc\xe5\xd1\x51\x8f\x13\x4c\xf2\x89\x8b\xac\xf3\x8e\xdb\x85\xf2\xa2\x8b\xb4\x07\xca\xbd\x0c\x6f\xda\x75\xf9\xea\xfc\x48\x4c\x3d\xa3\x89\x38\x5a\xe6\x47\x1a\xca\x99\x11\x45\xc6\x6a\x35\xe8\x88\x95\x30\x59\x66\x28\x2a\xc0\x3e\xe5\x89\x17\x65\x10\x42\x3a\xe4\x04\x22\x51\x19\x95\xbb\xf9\x97\x32\x2a\x1d\x21\xf5\x7c\x5d\xe5\xc3\x0a\x76\x8d\x09\xa9\x1e\x3f\x54\x2b\x65\x60\xd5\xf9\x78\xed\xd1\x94\x81\x84\xea\xf1\xaa\xa1\x39\x1c\xa4\x21\x1b\x5e\x54\x61\x54\x0a\xb4\xc9\x7d\x06\xbf\x7c\x3e\xf5\x4a\x31\x2e\xa7\x7b\xe8\xf0\x27\xff\x89\x7f\xfa\x4a\x2f\x90\x35\x89\x7a\x65\x41\xac\x5d\x32\x12\x2b\x69\x65\x4d\x84\xac\x49\x46\x48\x95\x35\x75\x1e\xf1\x79\xe4\x16\xe8\xca\x91\x58\x87\x53\xa3\x74\xb7\x56\xf2\x1e\xb3\x1c\xe9\x2e\x94\xd9\x26\x0a\x46\x66\x5d\x21\x56\x91\x7d\xd0\x28\x07\xcb\x4e\xb5\xaf\x89\xb0\xf2\xae\xe8\xb9\xbb\x04\x8c\xdc\xce\x99\xc5\x52\xe6\x7d\x99\xad\x45\x25\xb5\xae\x13\x0e\x9e\x3a\xa7\x51\x3a\x1d\x16\xbc\xae\x81\x1c\x6b\x50\x4b\x84\xf7\xd7\x28\x74\x5d\xc2\x31\x97\x98\x8e\x15\x2e\x0b\x18\xab\x05\x8c\x36\x2d\x44\x56\x0b\x89\xd5\x82\x76\xbc\x4c\x0b\xa3\x43\x5e\x16\x28\x87\x05\xd6\x92\x8d\x75\xc9\x7c\x29\xbc\xae\x20\xf9\x14\x8f\x15\x67\x92\x98\x4e\xae\xcb\xc4\x32\xce\x5a\xd5\xc5\xc8\x24\xb1\x2b\x72\x26\x89\x23\xa8\x92\xc6\xd0\x91\xec\x51\x06\x92\x9e\x27\xed\x91\xc0\x62\x70\xe5\xa8\x58\x09\xbf\x67\x50\x9a\x70\xd1\xca\x54\xc7\x85\x54\xba\xae\x52\xc2\x2a\x0f\xdc\x68\xe2\x4a\xf6\x7b\x54\xf4\xa4\xfc\x51\x81\xa2\x16\x59\x7c\xb4\x07\x36\xf3\xcd\x10\xbf\x19\xe2\xff\x33\x43\x14\x0c\x5d\x7e\xfc\xca\x3c\x80\x01\x29\xaa\x16\xb1\xc1\xbc\x04\x50\x48\xe6\x7e\x59\xa8\x0a\x37\x03\x35\x0f\xce\x7a\x71\x48\xd6\x24\xe9\xa5\x47\x54\xaa\xa8\x59\xc8\xc2\xe0\x4c\xec\x13\x47\xba\x7d\xe8\xdc\xa9\xe4\x4e\x9a\x89\x29\x91\x73\xe5\x92\xae\x26\x8b\x65\x19\x6d\x96\xcf\x73\x64\x6b\xc9\x67\xe4\xc9\xc7\x63\x58\x43\x02\xb1\xac\x4c\x07\x08\x75\x59\x90\xc0\x46\x2f\xc3\x56\xcc\xfa\x9d\x20\x7a\xe6\x9e\x03\x34\xa2\x72\xcd\xcb\xf1\x5f\x67\x77\x3e\x1c\xc4\x1c\x24\xef\x83\x9c\x93\xa0\x75\x12\x3a\x27\xb9\x4e\x3a\x27\xa9\x40\xa3\x8a\xef\x2c\x6d\xb2\x78\x00\x16\xe9\x5a\xd8\x45\x5a\xae\x32\x49\xd5\x97\x3e\x28\x16\x87\x1e\x94\x4a\x50\xc0\x0c\xe9\x01\x1c\x81\x36\x77\x6f\xd7\x87\x4a\xf9\x07\x9b\xe4\xdf\x63\xde\x02\x2a\x14\x35\x28\x4d\x3f\xd8\x81\xd1\xdc\x29\x53\x37\x13\x91\xd6\xa1\x77\x16\x25\x8a\xc6\x04\x3d\xd4\x5a\x07\x74\x1d\x9d\x72\x83\xab\x0d\x79\xd2\xb3\x6c\x51\xf7\xa5\x67\x11\xeb\xdd\xf2\x52\x1c\xad\x43\xa0\xe6\x26\xe6\xac\x88\xba\x34\x01\x14\x4f\xe3\x26\xe0\x21\xb6\x08\x74\xce\x02\x27\xb1\x1a\x36\x4e\x87\x41\x55\xe5\x55\x81\x55\x55\x5a\x6e\x8e\xbd\x4a\x23\x23\xaf\x42\xaa\x3b\x36\x01\xd1\xe0\x3a\x77\x90\x9e\xf5\xd4\xfd\xc9\x5c\xc7\x0c\x1c\xc4\xcc\x67\x25\x89\x03\x17\x03\x26\x45\x4a\xec\x51\xab\x8e\xa2\x35\xe4\x59\x29\xe6\x0c\x75\x9f\xe1\x54\x01\x1e\x2a\x28\x15\x59\x1c\x2a\x4a\xd5\xa5\xef\x5d\x75\x49\x20\x69\x36\x0b\x41\x18\x6a\xb9\xb8\xde\xd3\xa9\x01\x91\xce\x7c\xde\xcc\xb0\x3d\x18\xd6\x3f\xe6\x5c\xff\x2e\xc7\x1e\x90\xd9\xbf\x04\x88\xba\x65\x85\x49\x82\xb2\xe1\xac\xb1\xbb\x64\xc2\x10\x80\x9e\x25\x4c\xf9\xd1\x3d\x0c\x4c\x37\x4b\x87\x9b\x2d\x37\xec\x97\x6e\x58\x8c\xf4\xc2\x79\xe4\x66\xde\xf7\xf2\xdc\xeb\xfb\x56\x2f\x57\xb0\x06\x81\x74\x05\x59\x15\x8f\x19\x44\x46\x98\xa6\xab\xf1\x0a\x74\x97\x07\x0c\xa4\xfb\x01\xc3\x00\xcc\xb2\x6d\x97\x67\x6d\xa8\x73\x23\x84\xa8\xb6\x31\x3d\x4e\x42\xd2\xb1\x20\x82\xb2\x62\xd2\x87\xce\xf3\x34\x91\x75\x74\x34\xaa\xd8\xef\x35\xd9\x1c\x2d\x4b\x16\xf7\x9d\x59\x26\xa6\x28\xb9\xb2\xaf\xf8\xf3\x64\x6a\x26\x5b\x7e\x24\x5b\x0f\x93\xb1\x4a\xd6\xfc\x32\x59\xbb\x9f\xcc\xdd\x4b\xf6\xec\x41\x60\xd7\x1c\xcf\xe0\x79\x96\x2b\x54\x47\xb9\xa3\x13\x1f\x4b\x77\x6f\x65\xaf\x14\x0c\xbe\x59\xcb\x37\x6b\xf9\x0d\x7e\xf4\xfe\x01\x60\xae\x08\x77\xdf\x35\x5e\x2b\x16\xb6\xaf\xd8\x4c\x05\x68\x5f\xd1\x99\x2a\xd8\x9a\x2a\x94\xe3\x1d\xaa\x17\x99\x44\xe6\x8c\x78\x91\x69\x64\x4e\x69\x7b\x4e\x39\x73\xce\x3d\xe5\x9c\x29\xa9\x5d\xa4\xa4\xd6\x1d\x67\x8a\x8a\x9a\x29\xab\xba\x62\x2d\xb8\x7a\x50\x85\x51\x9e\xc7\x93\x95\x13\x54\x98\x9d\xf4\x6b\x98\x25\xa3\x39\xfa\x8c\xc2\x0f\x8f\x52\x2b\x88\x67\x26\xbc\x06\xf1\x0a\xf2\x81\x7b\x90\xaf\xb0\x31\x64\x0f\x1b\x15\x55\x7c\x6c\x51\xa5\x62\xce\x3c\xb9\xcd\x98\x53\xbe\x3f\xf6\x88\xe4\x30\xbc\x47\x8d\x95\x10\xdb\x00\xee\xa6\x73\xe8\xa3\x70\x9a\xee\xd8\x6d\x37\x4d\xdb\x3a\x5d\x98\x36\xa2\xa2\xfe\xad\x93\xda\x6f\xab\xff\x6d\xf5\xeb\x20\xbd\xdb\xf8\xf1\xdf\xbe\xf2\x18\xb2\x0e\x10\xb0\x91\x03\x0b\xea\x13\x03\x0e\x1c\x72\x9b\xb5\xb7\x11\x3f\x59\xe5\xb7\xab\xfc\x82\x94\xbe\xfe\xf4\xde\x41\x71\xf0\x41\x3a\xa0\x0f\x24\xdc\x49\x57\xf9\x75\x49\x03\xa8\xbb\xdb\x4e\x1a\xe0\xde\x07\xef\xa4\xab\xfc\xba\xa4\x19\x59\x25\x62\x27\x45\xce\xea\x6b\xe7\x5c\xc5\x57\xe6\xcc\x2d\x15\x72\x70\xd6\x8e\xb5\x83\x74\xca\xaf\x4c\x6a\xf3\xe0\x7f\x27\xcd\x2c\x00\xe3\x20\x9d\xf2\xeb\x92\x52\x07\xf1\x7e\x68\xb7\x62\xf9\x61\xbb\xab\xf8\xca\x9c\x04\x68\xfd\xd0\x2e\x11\x38\xf1\xa1\xdd\x55\x7e\x65\x52\x86\x71\x69\x46\x24\x20\xc8\xc7\x86\x59\xe5\x57\x26\x75\xf0\x40\x3f\x48\x07\xb0\xea\x05\xe9\x94\x5f\x99\x34\x40\xc6\x05\x29\x77\xe8\x22\x17\xea\x9d\xf2\xeb\x92\x32\x02\x5e\xda\x11\x23\x38\xcb\xb1\x4d\x57\xf9\x95\x49\x15\x10\xf9\xe0\x54\x30\xb7\xc3\x78\xa7\xf8\xca\x94\x96\xc9\xe4\x85\x72\x1d\xb8\x9a\x8d\x36\xce\x29\xbf\x32\xe9\x00\xc9\x7a\x60\x27\x0d\xe8\xaa\x17\xca\x9d\xf2\xdf\xc9\x07\x76\xd0\xc1\xb2\xfb\xc0\xb5\x3f\xe8\xf0\x81\x53\x7e\x65\x1f\xb8\x91\xae\x3e\x70\x27\xdd\x7c\xe0\x35\x49\x77\x1f\xb8\x92\xae\x3e\x70\xe3\xdc\x7d\xe0\x55\x39\x37\x1f\xb8\x71\xae\x3e\x70\x27\xdd\x7c\xe0\x55\x49\x37\x1f\xb8\x91\xae\x3e\x70\x27\xdd\x7c\xe0\x55\x49\x37\x1f\xb8\x91\xae\x3e\x70\x27\xdd\x7c\xe0\x55\x49\x37\x1f\xb8\x92\x6e\x3e\x70\x27\xdd\x7c\xe0\x35\x49\x77\x1f\xb8\x91\xae\x3e\x70\x23\xdd\x7d\xe0\xef\x31\x53\x64\x18\xa4\x7e\xcc\xb4\x67\x2e\x6c\xfb\x4c\x57\xf9\x75\xd7\x74\x23\xdd\xd7\x74\x23\x5d\xd7\xf4\xaa\xa4\x9b\x7a\xf7\x99\x6e\xea\x5d\x49\x37\xf5\x5e\x95\x74\xcf\x3e\x37\x87\x34\xb3\xcf\xdd\x1f\x6d\xd9\xe7\xff\xb5\xa4\x5b\xbf\x42\x16\x68\xa4\xc0\x23\xe6\x4b\xb8\x7a\xa9\xa7\xa0\x8c\xa3\xe9\x98\x9d\x8b\xa4\x60\x59\xb5\x24\x46\xd3\xc4\x2e\xa8\x79\x3d\x05\x15\x8c\x14\x92\x17\x18\xf9\x63\x42\xf4\xba\x36\xc8\xb8\x7a\x45\x07\x56\xc8\x50\x41\x6b\x6a\x80\xca\xdc\x68\x80\x2a\x55\xf3\x81\x86\xd5\x89\x3e\xf6\x8e\x8b\x32\xb0\xf1\x3c\xa9\x65\x96\xa6\x04\x24\x59\xd4\x04\x18\x77\x6e\xda\x41\x1d\xb5\xe4\xa1\x31\x5f\xe2\x49\xac\x78\xbe\xc5\x5b\xa5\xbc\xbe\xc3\x1b\x53\x3a\x62\x9c\x25\x60\x04\x4e\xc8\x9e\xd0\xc5\x4a\x1c\xa2\xb6\x88\xc0\xa0\x3e\xdf\x0a\xf4\x4e\x8d\x05\xba\xe1\x3c\x00\x32\xf5\xd9\x3d\x32\x62\xc3\x0b\xe6\xca\xc7\x21\x37\x10\xc1\x2c\x0b\x53\x33\x98\x25\xaa\xe2\xf0\x7a\x97\xab\xa2\x0b\x01\x47\x1f\xf5\x86\x43\xa9\x7b\x43\x30\x67\xc3\xc6\x06\x24\x41\x0d\x81\xab\x2f\x84\xb3\x8a\x14\x5c\x10\xb0\x0b\x61\x63\x02\xce\xfc\x02\xa1\x3b\x99\x35\xee\xb3\xa3\x07\x81\x3a\xd2\xd8\x66\xf7\x24\xeb\x68\x43\xb9\xad\xd9\x0b\x9e\x05\x81\xfb\x98\xd3\x0d\xc1\xdb\x39\x6d\x5a\xb2\x6a\xe5\x31\x75\xac\xd5\x30\x6b\x94\x4a\xcb\x59\x64\x41\x6c\x60\x8e\xb5\x44\x5d\x45\xcf\xe2\x80\x4c\x31\x3b\x64\x35\xce\x62\xe0\x36\x97\x94\x84\x63\x11\x83\x6e\x6c\x8d\xb2\xe0\x9c\x2f\x10\x0d\x05\xab\xa5\x54\xe7\xf1\x9d\x78\xd8\x7c\x25\x8d\xba\x88\x02\x63\x54\xc3\xee\x18\x3e\x5f\x38\xc6\xec\xd5\xf1\xc8\x9a\xdb\xc0\xa3\xfa\x8a\x68\xf4\xa8\x7e\x60\xb1\xd1\xd0\x21\x3a\xd7\x70\xa4\x5b\x8a\x51\xc4\x16\xc9\xc9\xd1\xda\xe9\x43\x3e\x5f\xf2\xae\xad\xe0\xb9\x61\xb4\xc3\xe0\xf9\xbe\x3c\x14\xe5\x9c\xd8\xb1\x0e\xf7\x4c\x46\xbd\x4f\x57\xc1\xf9\x8a\xd9\x46\x19\xa0\xb3\xd4\x0b\xf1\x91\x35\xa6\x5a\xda\x46\x8a\xd1\xea\x85\x34\xd2\x3c\x2a\x0c\x1d\xe3\xac\x69\xc6\xa3\xb6\x0e\x29\x56\xbb\xad\xf2\xa8\x17\xd4\x14\x54\x5b\x47\x71\x62\x66\xe6\xf6\x60\xeb\x3d\x9d\x9f\x42\xcc\xa3\xc3\xfa\xf8\xa0\xbe\x84\xd0\xf3\xfa\x6f\xb5\xee\xeb\xf6\x45\x84\x9d\xef\x5f\xfd\x74\x6d\xb6\xdf\x7f\x38\xcf\x66\x7b\xd9\xf0\xed\x7a\xfb\x79\xbf\xee\x21\x7e\xf8\xa0\xbd\x61\x7e\x3e\x68\xeb\x5d\x3f\x6e\x98\x78\xeb\x71\x7f\xba\x76\xde\xc7\x3e\x81\xd9\x79\xef\x1b\xf3\xda\x79\x1f\xb7\x07\xd3\x7a\xc3\xde\x25\xbf\xdd\xb0\x7d\x2f\xb0\xde\xb0\x33\xcc\x96\xf6\x83\x61\x76\xbc\xeb\xce\xb0\xca\x0f\x86\xed\x86\xf5\x09\xe7\xf5\x86\xcf\xf0\xfe\xb1\xc0\xfa\x80\xcf\x18\xab\xd9\x80\x62\xbf\x61\xc5\x6b\x73\xfd\x38\xef\x44\x13\xdf\xae\xf2\xa7\xeb\x87\x17\xc7\x90\xf7\x0f\x2f\xd6\x21\xaf\xf2\x63\xc8\x3a\xd2\x58\xeb\x00\x1a\xd3\xa9\x79\xee\xa4\xea\xa2\xc0\x9e\x4e\x4d\xd2\x01\x68\x3e\xcf\xd3\x31\x2b\xc2\x88\xd9\xd1\x45\xa4\x32\x9b\x3a\xb8\x92\xb8\x10\x2f\x27\xc9\x5d\xb5\x5a\xf3\xbc\xd7\x2b\xf8\x6e\x52\xcd\x8d\x44\x5c\x2d\xf5\xce\x42\xa9\x11\xe6\xdc\x62\x9a\x7e\xad\xb6\x98\x29\x73\xfa\x41\x47\x1e\xb9\xa7\x38\x50\x9a\x08\x54\x0b\x7b\x6a\x8c\x55\x13\xb3\x8e\xd9\xe0\x66\x56\x7e\x53\x02\xcb\xe9\x93\x58\x8a\xc7\x98\x3d\xe7\x32\x66\x47\xbb\xd2\xac\x8f\x44\xdd\xf3\x72\xb5\x59\xbb\x44\x60\x1d\xb2\xc5\x88\xf9\x45\x4e\xc6\x90\xdd\x6f\xa5\xba\x50\x77\xd3\x58\xd5\x76\xde\xd4\x3b\x5b\xf4\xe3\xbc\x9a\xd0\x86\xb7\xf5\xd9\x36\xd3\x71\xff\xf4\x8f\xe7\xf5\xdf\x7d\x73\x75\x20\x56\x31\x3b\xf7\x74\x58\x31\x3f\xd3\x09\x1a\xb4\x3c\xea\xe9\xda\x08\xc3\xab\x0d\x84\xbb\xb5\xfc\x49\x23\xcc\xe7\xcb\x45\xae\xb7\x8d\x44\x14\xe2\x15\x2f\x86\xeb\x92\x31\xca\x33\xd0\xb0\x81\x0a\x4b\x79\x76\x1b\xd5\xc6\x98\xd7\x11\x28\x1b\x4b\x4e\xb4\x47\x06\x60\x30\xab\x13\x4e\x03\xef\xe9\xd8\xf3\x7a\xcd\xf0\xb5\x87\x1c\xed\x0b\x4b\x86\xe5\x0c\x71\xd3\xa5\xce\x93\x57\xee\x5c\x51\xcf\x44\xab\x57\xc5\x19\xa9\x5a\xfe\xb2\x50\x4b\x6c\x64\x4d\x19\xac\x77\x4c\x6c\x8a\x94\x06\x15\xe6\x91\x18\xbd\xdb\xa2\x06\xee\xb3\x71\x46\x79\xf6\xdd\x10\x53\xaa\x81\xd3\xd7\x6a\x00\x75\xab\x6f\x26\xc4\x33\x48\x07\x90\xf5\xe9\xf1\x3d\x7d\x6c\xee\xd9\x5e\x72\xc2\x89\xab\x4b\x33\x93\x02\x67\xcb\xeb\xd5\x11\x67\x02\x31\x28\xe5\x15\x30\xd6\x40\xa1\x01\xde\x67\xfe\x21\x1e\x91\x97\x7b\x39\x59\x05\xc9\xc0\x93\xb8\xbe\xee\x29\xa7\xa9\x85\xc7\xcc\x31\xb8\xf7\x38\x5b\x87\x9e\xe1\x9a\x04\x86\x9a\x9e\xef\xef\xa6\x2f\xe6\x42\xd5\x1a\xfe\xfc\xee\x4f\xef\x7f\xf8\xee\xfb\x4c\xb9\xfe\x33\x73\xa3\x57\xcf\x6f\x4e\xf5\x29\xdd\xe9\x87\xef\xbe\x7f\x77\xf7\xf3\x87\xbf\xf5\x19\xdf\x67\xdd\xe6\xdb\x23\xf2\xef\xf5\xa9\x8f\xdf\x7f\x7c\xf1\xc3\x77\xff\x13\x00\x00\xff\xff\x4a\x9f\x98\x51\x0d\x38\x00\x00") - -func bindataTkgWebDistTkgkickstartuiAssetsImagesDockerSvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiAssetsImagesDockerSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/docker.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiAssetsImagesDockerSvg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiAssetsImagesDockerSvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/assets/images/docker.svg", - size: 14349, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiAssetsImagesMsazureSvg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x5c\x8f\x3f\x4f\x84\x40\x10\x47\x7b\x3e\xc5\x64\xad\x1d\x66\xf6\x0f\xbb\x6b\x58\x0a\x6d\xae\xd8\x6b\x2d\xae\x33\xb2\x02\x09\x02\x39\x90\xbd\x8f\x6f\xd0\x18\x93\xeb\x26\x2f\x79\x93\xdf\xab\xd7\xbd\x83\x3c\xb4\x5b\x1f\x84\x76\x02\xfa\x34\x74\xfd\xf6\x7b\xef\x43\xca\xcf\xf3\x2d\x08\x02\x02\xed\xe0\x60\x1f\xc3\x38\x06\x31\xcd\x53\x12\x70\xfb\x1c\xa7\x35\x88\x7e\xdb\x96\xa7\xb2\xcc\x39\x63\x56\x38\x5f\xbb\x52\x12\x51\xb9\xee\x9d\x68\x8a\x7a\x79\xdb\xfa\x1f\xeb\xf1\xfa\x35\xa6\x20\xd2\x9e\xa6\xb9\x6d\x05\xbc\x8f\xc3\x72\xcf\xda\x20\xce\x2c\x91\xc8\x31\xb0\x45\xaf\x8c\x8e\xb2\x42\x66\x5b\x41\x15\x99\xd0\x93\xd5\xa0\x3c\xb2\xad\xcc\xab\xf2\x48\xd6\xa8\x13\xc5\x3b\xe7\x72\x3e\xd6\x2a\xd4\xcc\xee\xc4\x8c\xd2\x6b\x8e\x4a\xa1\x65\xef\x0f\x5b\x1b\xe3\xa3\x94\xc8\xc6\x80\x34\x68\x8c\x77\x51\x3a\x64\xe7\x3c\x38\x74\x52\x19\x15\xff\x3f\x5c\xfe\xaa\x1f\x88\xac\x7c\xa9\x44\xd9\x14\xf5\x91\xd7\x14\xdf\x01\x00\x00\xff\xff\x0d\x5a\xfe\x05\x3e\x01\x00\x00") - -func bindataTkgWebDistTkgkickstartuiAssetsImagesMsazureSvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiAssetsImagesMsazureSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/ms-azure.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiAssetsImagesMsazureSvg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiAssetsImagesMsazureSvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/assets/images/ms-azure.svg", - size: 318, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiAssetsImagesTanzulogoSvg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x94\xd1\x6e\x1b\x37\x13\x85\xaf\x57\x4f\x31\x3f\xff\xab\x02\xe4\x88\x33\x24\x97\xa4\xa2\x55\x60\x27\x41\x1a\x40\x01\x0a\x14\xc8\x6d\x21\x4b\x1b\x59\x08\xb3\x2b\x68\xd7\x96\x9c\xa2\xef\x5e\x90\x52\x6d\xa3\x35\x5a\x5f\x68\x77\x75\x34\xfa\xe6\xcc\x19\x51\xf3\xb7\xa7\xef\x09\xee\xdb\xc3\xb0\xeb\xbb\x46\x10\x6a\x01\x6d\xb7\xee\x37\xbb\x6e\xdb\x88\xbb\xf1\xab\x0a\xe2\xed\x62\x32\xff\x9f\x52\xf0\xb1\xed\xda\xc3\x6a\xec\x0f\x33\xb8\xda\xf4\x37\x2d\x7c\x4a\xe9\x6e\x18\x8b\x04\xcc\x48\xa8\x25\xfc\xfa\xe5\x23\x7c\x38\xed\xfb\xc3\x08\xbf\xa4\xbb\xad\xfa\xd4\x01\x16\xf1\xcb\xb9\xc7\x0c\x6a\xd4\x1a\xae\xef\x76\x69\x03\xfa\x27\x00\xa5\x16\x93\xf9\x70\xbf\x7d\x6e\x82\x04\x9c\xbe\xa7\x6e\x68\xc4\xed\x38\xee\x67\xd3\xe9\xf1\x78\xc4\xa3\xc1\xfe\xb0\x9d\xb2\xd6\x7a\x3a\xdc\x6f\x2f\x25\xb3\x53\xda\x75\xdf\x5e\x2a\xa4\x18\xe3\xb4\x7c\x2a\xe0\xd4\x08\xbd\x3f\x09\x78\x38\xdf\x27\x15\xdc\xef\xda\xe3\x75\x9f\x75\xd0\x60\x75\x79\x09\x18\xc6\x87\xd4\x36\xa2\xed\x56\x37\xa9\x55\x37\xab\xf5\xb7\xed\xa1\xbf\xeb\x36\xb3\xae\x3d\xc2\xb3\xca\x37\xa5\xfb\x6c\xd8\xaf\xd6\x6d\x23\xf6\x87\x76\x68\x0f\xf7\xad\xc8\x93\x64\x02\x8c\x0f\xfb\xb6\x11\x63\x7b\x1a\xa7\xeb\x61\x10\x8b\x49\x85\xc3\xa8\x7f\xff\xba\x4b\x69\xf6\x7f\xad\x23\xbd\xbf\x7a\xf3\x47\x11\xe9\x51\x7c\x47\xef\xdd\x45\xe4\x8b\xe8\xc3\xf5\x07\xd6\x17\xd1\x5c\x44\xba\xb2\x1c\xf2\xd7\xe7\xd3\xd2\x6c\x31\x99\x6f\x61\xb7\x69\xc4\x72\xf5\xd0\x1e\x7e\xe3\xec\x62\xba\xfd\x9b\x4a\xd9\xc3\x7c\xbb\x98\x54\xd5\x7c\xbf\x1a\x6f\x61\x9d\x56\xc3\xd0\x88\x61\xd4\x02\x36\x8d\xf8\xcc\x2e\xa2\x91\xc6\x11\xda\x9f\xc9\x44\x8c\x6b\x65\xd1\x4b\xad\x22\xb2\x62\x24\x45\xf9\xe2\x30\x24\xe5\x1d\x3a\x15\x2d\xfa\xb5\x32\xca\xa0\x57\x16\x49\x05\x0c\x8a\x31\x2a\x32\x68\x13\xe7\x77\x44\xf5\xa4\xaa\xaa\x35\x21\x29\x8b\x56\x5a\x15\x90\x64\xc8\x28\x8d\xb4\xa4\x68\xa4\xf3\x18\xd7\x16\x8d\x62\x64\x19\xd1\x95\x3b\x19\x0c\x52\x27\xd2\x41\x3a\x83\x6e\x6d\x91\x24\x23\x49\x8f\x24\x1d\x06\x19\x72\x8d\x46\x93\xd8\xa3\x95\x44\x0e\x63\xee\x21\x8b\xdd\x42\x31\x99\x61\x72\xf3\xa4\x7c\x9d\xd1\x16\xfd\x3b\xae\x03\x5a\x69\x6c\x9e\x93\x6b\x7b\x9e\x55\x3e\x9b\xfb\x07\x7c\x26\xab\x91\xa5\x31\x0e\xed\x2d\x51\xc0\x98\xbc\xc3\x98\x87\xb5\x49\xb1\x47\xa3\x72\x3f\xbb\x64\xad\xa5\x67\x34\xcb\x68\xd0\x4b\x62\x87\xf5\xb2\x76\x92\x2d\x21\xe5\xbe\xcb\x67\xa0\x1f\x62\x5a\x62\x2f\xe1\x57\xf3\x7d\x9f\x1e\xb6\x7d\xf7\xb4\x00\x12\xb0\xef\x77\xdd\x38\x34\xc2\x18\x2f\xa3\x46\x02\xe3\x34\x3a\xe9\x03\x46\x60\x9d\x47\x36\xe5\xce\x35\x32\x54\x55\x75\x26\xbe\xc0\xe2\x27\x16\x5b\x64\xc9\xce\x61\x84\x1a\x43\x99\x33\x00\xe9\x3a\x4f\x1b\x2c\xd6\x40\x94\x93\x35\x75\x40\xff\xaf\xcc\x67\xfe\x28\x72\xf6\x60\x20\x3f\x04\xb4\xe0\x08\xcd\xd9\x66\x9d\x57\x1c\xf5\x7f\xf8\x33\x4f\x2c\x67\x31\x4a\xd2\x06\x19\x6c\xa6\x44\x42\x07\x26\x6f\xc4\x5a\x64\x60\x9d\x4d\x5b\x8d\xe6\xb5\x40\xe3\xcb\x66\xad\x46\x0b\x26\xd6\x58\x5f\x48\xa6\xd6\xd9\x5a\xc1\xdb\x3a\xaf\x4b\x33\x86\xd7\xc6\x68\xbc\xcb\xa4\x92\x23\x07\x8b\xa1\x24\x16\x81\x23\x63\x5d\x92\x0c\x60\xa2\xc9\xbf\xd1\x92\xf0\x6b\x93\xe4\x80\x4e\x66\xb8\x07\x62\x8d\x5e\x9a\x48\xe8\x81\x7d\x3e\x24\x7f\x3d\xeb\xbc\xac\x52\xf3\x88\x2d\x47\xfb\x7c\xfd\xe7\x29\xb7\x2f\x9e\x7d\xf3\xa8\xe6\xff\xcd\xc5\xe4\xcf\x00\x00\x00\xff\xff\x7c\x22\xe6\xa5\xf4\x05\x00\x00") - -func bindataTkgWebDistTkgkickstartuiAssetsImagesTanzulogoSvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiAssetsImagesTanzulogoSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/tanzu-logo.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiAssetsImagesTanzulogoSvg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiAssetsImagesTanzulogoSvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/assets/images/tanzu-logo.svg", - size: 1524, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiAssetsImagesTcelogoSvg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x7c\x54\x5b\x6f\xdb\x36\x14\x7e\xb6\x7e\x05\xc7\x3d\x0d\x20\x8f\x78\x78\x11\x49\xc7\x72\xd1\xb8\x45\x57\xc0\x03\x06\x14\xe8\xeb\xe0\xc8\xaa\x6b\x94\x95\x0d\x51\xbe\xa4\x43\xff\xfb\x40\xca\x4e\x8c\x35\xc8\x0b\x49\x7d\xe7\x7c\x17\x9e\x30\x9e\xbd\x39\x7f\x0f\xe4\xd8\xf6\x71\xbb\xeb\x6a\x8a\x20\x28\x69\xbb\x66\xb7\xde\x76\x9b\x9a\x1e\x86\x2f\xdc\xd1\x37\xf3\x62\xf6\x1b\xe7\xe4\x43\xdb\xb5\xfd\x6a\xd8\xf5\x53\xf2\x76\xbd\x7b\x68\xc9\xc7\x10\x0e\x71\xc8\x10\x91\x06\x24\x08\x46\x3e\x7d\xfe\x40\xde\x9f\xf7\xbb\x7e\x20\x7f\x87\xc3\x86\x7f\xec\x08\x64\xf0\xf3\xe8\x31\x25\x15\x08\x41\xee\x0f\xdb\xb0\x26\xe2\x0f\x42\x38\x9f\x17\xb3\x78\xdc\xdc\x86\x40\x4a\xb6\xeb\x9a\x2e\x57\x8f\x6d\xff\x0f\x52\x72\xfe\x1e\xba\x58\xd3\xaf\xc3\xb0\x9f\x96\xe5\xe9\x74\x82\x93\x82\x5d\xbf\x29\xa5\x10\xa2\x8c\xc7\xcd\xa5\x65\x7a\x0e\xdb\xee\xdb\x4b\x8d\xe8\xbd\x2f\x73\x95\x92\x73\x4d\xc5\xfe\x4c\xc9\xe3\xb8\x17\x13\x72\xdc\xb6\xa7\xfb\x5d\xc2\x89\x20\x52\x3a\xa8\xc6\x95\x92\x38\x3c\x86\xb6\xa6\x6d\xb7\x7a\x08\x2d\x7f\x58\x35\xdf\x36\xfd\xee\xd0\xad\xa7\x5d\x7b\x22\xff\xeb\xbe\xcb\x29\xa6\x71\xbf\x6a\xda\x9a\xee\xfb\x36\xb6\xfd\xb1\xa5\xe9\x7a\x49\x85\x0c\x8f\xfb\xb6\xa6\x43\x7b\x1e\xca\x26\x46\x3a\x2f\x26\x10\x07\xf1\xef\x97\x6d\x08\xd3\xdf\xad\xbb\x7f\x2f\xc5\xdd\xcf\x0c\xe2\x05\xc4\xfb\x05\xbe\x33\x17\x50\x5e\xc1\x77\x5a\xba\xb7\x17\x50\x5d\xe9\x68\x85\xd5\x77\x3f\x8b\x59\x99\xcd\xe6\xc5\x6c\x73\x33\x43\x95\x52\x94\x9b\x84\xce\x8b\xc9\x6c\xbf\x1a\xbe\x92\x26\xac\x62\xac\x69\x1c\x04\x25\xeb\x9a\xfe\x85\x46\x83\x64\xe8\x3c\xc8\xc0\xd1\x81\xe5\xda\x81\x6d\xb8\x04\xc5\x2b\x90\x4c\x82\xe7\x28\xc1\x33\x0f\x86\x23\x82\x0f\x06\xc1\x31\x0b\xd5\xf2\x86\xfa\x83\x96\xbf\x3a\xe0\xc5\xc1\x3a\xd0\xcc\xb8\x64\xa0\x93\x92\x74\xa0\x1b\x6e\xa0\x62\x0a\x2c\x47\x05\xc8\x44\xda\x2a\x5e\x25\x55\x74\xb9\x63\xf9\xcc\x7b\x51\xfd\x92\xdf\x2b\x86\x5a\x80\x59\x5a\x0d\x2a\x85\xc9\x26\xc8\x8d\x4a\x41\x35\xb7\xa0\x17\x5e\x00\x32\x94\x16\x2a\xe6\x0d\x68\x86\x2a\x05\xbf\x32\x5f\x54\x97\xa3\xba\xf5\xe9\x86\xa8\x40\x87\x34\x17\xc5\xd0\x04\x34\xe0\x78\xa5\xc0\x07\x55\x31\xa5\x01\x17\x2e\x29\xa3\x50\x20\x99\x4b\xd7\x42\x44\xd0\xec\x99\xfb\x9a\x03\xfa\x74\x4b\x94\x0e\x5c\xb6\xf0\x1c\x4d\xc3\x2b\xd0\x1c\xc1\x73\x97\x76\x01\xc8\x15\x28\x8e\x1a\x5c\x50\x16\x24\x57\x1a\xcc\xf2\x86\xf9\xea\xf8\x51\x80\x66\x32\xcd\x05\x0c\x33\x02\x4c\xc3\x05\x54\xac\x82\x8a\xbb\x94\x50\x24\x69\x95\x11\xbd\x4c\x33\xcb\x33\x5f\x5e\x79\xaf\x69\xbb\xd4\x8d\x5e\x82\x0a\xd2\x80\xe2\x5a\x37\x29\xa8\x01\xc7\xd2\x53\x19\x0f\x06\x24\x13\xa9\x8e\x4c\xeb\x3f\x13\xe5\x45\x49\x75\x8d\x9b\xfe\x8e\x62\x61\x30\xd1\x98\x60\x97\x43\xc6\x63\xfe\x18\x5b\x6e\xd6\x98\x57\xfe\x5c\xe4\x79\xfd\x84\xd6\x82\xbe\x72\x99\xf8\x41\xb2\xba\x65\x12\x15\xd8\x62\x32\x69\xb8\x31\xf9\xf1\xf9\xf4\xb8\xb5\x86\x6a\x3c\x79\x0f\xb6\x11\xdc\x68\xf0\xec\x09\x65\xd7\x92\x89\xf9\x33\x15\xd8\x53\x61\x21\x51\xa7\x59\x54\x3e\x3d\xb5\xca\x83\x1b\x5d\xd8\x8d\x63\xbe\xf6\xf8\xff\x98\x7e\xbd\xe6\xc5\x7f\x01\x00\x00\xff\xff\x14\x9f\x78\x2d\x87\x05\x00\x00") - -func bindataTkgWebDistTkgkickstartuiAssetsImagesTcelogoSvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiAssetsImagesTcelogoSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/tce-logo.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiAssetsImagesTcelogoSvg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiAssetsImagesTcelogoSvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/assets/images/tce-logo.svg", - size: 1415, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiAssetsImagesVmwlogoSvg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x54\xc1\x8e\xe2\x38\x10\xbd\xef\x57\x58\xde\xab\x5d\xb8\x5c\x76\x6c\xb7\x08\x12\x7b\xee\xbe\xec\x4a\x2b\xcd\xdc\x32\x10\x20\x9a\x34\x41\x24\x13\xe8\xbf\x1f\x95\x13\xa0\x85\x66\x4e\x03\xd2\x4b\x39\xaf\xfc\xa8\x3c\xbf\xb0\xec\xc7\xbd\x18\xeb\x73\xdf\x74\xc7\x52\x22\xa0\x14\x63\x53\x5f\xfe\xe9\xae\xa5\x34\xc2\x08\x2a\x04\x15\x52\x9c\xce\x75\x5f\x9f\xc7\x7a\xdd\x9f\xea\xcd\xf0\x6f\x35\x34\x5d\x29\xaf\x6f\xcd\xf6\xcb\x5b\xb3\x15\xef\x75\x3d\x48\x71\x7d\x6f\x8f\x7d\x29\x0f\xc3\x70\x7a\x59\x2c\x2e\x97\x0b\x5c\x08\xba\xf3\x7e\x61\x8d\x31\x8b\x7e\xdc\xcf\x2d\x2f\xd7\xb6\x39\x7e\xff\x55\x23\xa6\x94\x16\x99\x95\x62\xd7\x6d\x7e\xf4\xd5\xb7\xb6\x2e\xe5\xae\x6a\xfb\x5a\x8a\x73\xc7\x8b\xe6\x7d\x2f\x57\xcb\x73\xbd\x19\xc4\xa5\xd9\x0e\x87\x52\xf2\x7c\x87\xba\xd9\x1f\x86\xa9\x3e\x5f\x4b\x49\x52\xec\x9a\xb6\x2d\xe5\xdf\xbb\xfc\x91\xa2\x3b\x55\x9b\x66\xf8\x28\xa5\x01\xf4\x52\xf4\xc3\x47\x56\xeb\xbb\x96\x1f\xe6\xf8\x32\x55\xb5\x5c\x2d\x17\x2c\xbe\x5a\x9e\xaa\xe1\x20\xb6\xa5\x7c\x23\x08\x49\xa1\x83\x48\x15\x82\x49\x2a\x83\xe1\xaf\x46\x70\x41\x83\x2f\xd4\x33\x01\xde\x29\x04\x97\x5a\x0b\x2e\x28\x0f\x6e\x03\x94\x20\x7a\x88\x0a\xc1\x72\xab\x0f\xb9\xfa\x2f\x28\x6b\x55\x00\x4a\xca\x22\x60\xd1\x5a\xc0\xa0\x1d\x84\x50\x01\x11\x10\x65\x41\x54\x40\xa8\xc1\x02\x79\x20\x7f\xbf\xc5\x8b\xd1\x41\x81\x15\x02\x7a\x95\xc1\x4c\x2c\x20\x0f\x40\x5c\x84\x09\xee\x44\xd0\x08\xf4\x3f\x06\xa0\xf8\xb4\x0f\x79\x24\xab\x11\x2c\xdf\xa3\x09\x6e\x04\xe6\xd1\x47\xe2\xd1\x3e\xab\xa2\x32\xca\x02\x59\x65\xfe\x58\x93\x7d\xc4\xe2\xa1\x89\xac\x59\x40\x2c\x2a\x0b\x45\x52\x19\x26\x7f\x2d\x84\xa8\xf3\x9a\xd8\xc9\x0c\x37\xc6\xf1\x68\xc6\x2b\x0b\x61\x86\x1b\x43\x51\x33\xb3\x26\x48\xa4\x32\xcc\xa6\x58\x85\x1e\xac\xad\x2c\x44\xab\x32\xdc\xb6\x98\x79\x8b\x05\xcf\x62\xfe\x66\x70\x00\xc7\x7b\x62\x7a\xf5\xdc\x8e\x09\x0a\x6a\xb5\xd5\x0e\xe2\x73\xf4\x56\xcb\x05\x67\xe9\x73\xa2\x88\xf3\x84\x71\x3d\x1f\x13\xba\x59\x95\x10\x92\x42\xdf\x6a\x04\xe4\x47\x0b\xf4\x6a\x13\x78\xfe\x25\xe3\xab\xd9\x2f\x8c\xf7\xf4\xa1\xd7\x10\xc3\x41\x03\x27\x80\x0d\xb6\x9f\x28\x88\xe1\x21\x84\x5c\x45\xcd\xd5\x73\x58\x98\x41\xd6\x61\xdb\xe2\x04\x77\x82\x45\x0d\x33\x45\x9c\x60\x1a\x14\x10\xbc\x6b\xad\xf2\xc0\x07\x67\x73\x96\x1f\x11\xe3\x35\x5f\xdc\x04\xf7\xdb\x1a\x12\xb5\x7c\x25\x28\x32\xa7\xb8\x60\x01\x9e\xc7\x3e\xc2\x6b\x0b\x48\xb4\x7e\x16\x26\xcb\xef\x88\x7f\xa5\x6c\x7d\xe0\xd7\x31\x70\x43\xb8\x35\xf0\x69\x81\x63\x5b\xf3\xc8\xe6\xbe\x71\xf6\xfb\xeb\x6f\x8f\x86\xff\x9e\x56\x7f\xfd\x0c\x00\x00\xff\xff\x5f\x89\x07\x43\x0d\x05\x00\x00") - -func bindataTkgWebDistTkgkickstartuiAssetsImagesVmwlogoSvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiAssetsImagesVmwlogoSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/vmw-logo.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiAssetsImagesVmwlogoSvg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiAssetsImagesVmwlogoSvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/assets/images/vmw-logo.svg", - size: 1293, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiAssetsImagesVsphereSvg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x58\xc7\x8e\xeb\xc8\x92\xdd\xf7\x57\x5c\xd4\xdb\xbc\x01\x07\x8f\x4e\x74\x3d\x7d\x1b\x48\x5a\x89\xa2\x13\x45\xbf\xa3\x27\x25\x7a\x4f\x7e\xfd\x40\xaa\xba\x66\x80\xe9\xaa\x45\x48\x62\x66\x46\xe4\x89\x13\x27\x02\xfc\x6b\x5c\xf2\x6f\x6b\x99\x4c\xc5\xf7\x0f\x02\xfb\xf8\x56\xa4\x65\x5e\x4c\x9f\x9f\x97\x32\x5d\xd9\x76\xfb\xfe\x81\x7c\x43\xbe\x11\xd8\xb7\xd7\x6f\x59\x59\x55\xdf\x3f\x9a\xb6\x49\x3f\xbe\x6d\x75\xd5\x8c\xdf\x3f\x8a\x69\xea\xfe\x84\xe1\x75\x5d\xff\xb3\xe2\xff\x69\x87\x1c\xc6\x10\x04\x81\xc7\x25\xff\x5a\xf2\xe7\x56\x95\xcd\xf3\xff\x5b\x88\x32\x0c\x03\xbf\x9f\x7e\xfc\xfd\xc7\x5f\x43\x1a\x4f\xff\x14\xcb\xa7\xdf\x79\xa8\xfe\xfd\xaf\x2e\x9c\xa6\x74\x68\x90\xff\xfa\x80\xff\xfe\xe3\xaf\x24\xcd\xc6\xbf\xff\xf8\xeb\xeb\xc7\x6f\x65\xf2\xfd\xe3\xc7\x82\x8f\x6f\x5f\x9f\xb8\xb6\x99\xd2\x66\xb2\x9b\x72\x1a\xbf\x7f\xb4\xd1\x23\x8d\x27\xb6\x9d\x9b\xa4\x6c\x72\xb6\xdd\x3e\x7e\x38\x45\x7f\xf9\x44\x5f\x01\xcd\x63\xfa\xed\x1d\xdd\x9f\xc5\x90\x66\xdf\x3f\xfe\x55\xd6\x61\x9e\x22\x1f\xdf\xa6\x21\x6c\xc6\xac\x1d\xea\xef\x1f\x63\x1c\x56\xe9\xbf\x91\xff\x20\x08\xfe\xfe\xfb\x8c\x0a\xfe\xf2\xfc\xf7\x1f\x7f\xbd\xf7\xbc\xe3\xfa\xb1\xfb\xcb\x1b\x8e\x20\xbf\xfc\xbd\xbf\xfc\xee\x2b\x09\xa7\xf0\xcf\xf7\x0e\xb8\x6b\xf2\xff\x89\xc2\x31\x25\x4f\xff\x5d\x3a\xac\x6e\xae\xc8\x55\xca\x5b\x00\x00\xd0\xee\x76\x21\xd8\x39\x00\xe0\xbe\x02\x00\x84\x91\x03\x3e\x00\x80\x25\x32\x9f\x40\x01\x00\xfa\x49\xa8\x84\x9b\x63\x9e\xb0\x19\x4f\x3c\x7f\x8b\x09\xf4\x79\xa6\xf9\x54\x96\x6f\xe9\x95\x08\x29\xbc\x51\x74\xfd\x76\x10\xa1\x19\x9a\xbd\xb0\x6f\xd7\x13\x72\x01\x7b\xe8\xee\xcf\x8b\x00\xd4\x16\xeb\x39\x29\xd3\x6b\xcb\xde\xc1\x7c\x53\x9e\x32\x7f\xb2\x39\xe7\x40\x50\xf3\xf6\xbc\x8d\x76\x3a\x89\x97\xdb\xed\x29\xf8\xb6\xd2\x63\x99\xbe\xdd\xef\xa8\x5f\x9a\xe5\xf5\x01\xac\xc9\x71\x2e\xa2\x7c\x67\x6d\xa1\xf6\x3c\xab\x11\x20\x5a\xba\x36\x3b\x3e\xc6\x1c\xe2\xf6\x77\x4b\x1e\x28\x9a\x0c\xea\x84\xc9\xd2\xc1\xba\x9a\x5e\xe4\x52\xb0\x4e\x2f\x78\xd3\x1c\x5a\x13\x08\x82\xf9\x0f\xff\xb7\x5a\xb9\xa4\x7d\x6d\xcd\xd7\x22\xa9\xa9\x4a\xef\xc6\x73\x00\x11\x08\x42\x26\x6d\x61\x2a\x13\x4a\x65\x06\x45\x3d\xba\xe6\x74\x40\x84\x26\x36\x16\x69\x3b\xd0\x13\xde\xae\xcc\x70\x6f\xd1\xc8\x0b\x86\xa4\x60\xba\x20\xaa\x53\xb2\x71\x11\x2a\xbb\x28\xf7\x81\xba\x52\xe5\xde\x31\x2a\x1f\x11\xee\x4d\x5f\xe4\x7e\x4f\x95\x60\x40\x56\x87\x74\x32\xb5\xd3\xcf\xb0\xa1\x66\x87\x17\x38\x8e\x25\x37\xb4\x5b\x2f\xc5\x31\xe4\xb3\xe8\x0a\xe8\x30\x45\x0a\x73\x47\xd5\x3a\x63\xe8\x21\x90\x20\x9c\x56\xe3\xc5\x9c\x3c\x76\x5a\x08\x8a\x0a\xa4\xa3\x44\x57\xec\xa8\x07\x85\x34\xa7\xb3\x0a\xdb\x25\xc5\x22\xf9\xca\x4e\x35\x25\x2a\xd1\xd3\x4a\x22\x85\xc4\xad\x80\xbe\xf6\xdd\xa2\xfa\x4e\x40\xc1\x09\x80\xd0\xf4\x22\x28\x67\x0b\x0d\x57\xbb\xec\x12\x92\x8e\x19\x44\x64\xd4\x78\x4f\x27\xa5\x62\xe2\xc7\x4e\xf3\x7e\xe8\xd9\x5d\x38\xdc\xab\xcc\xd7\xe4\x43\x46\x98\xdb\x95\x0a\xd1\xe0\x9a\x25\x29\x55\x1a\x31\x6c\x64\x71\x71\x6b\x6e\x2d\x44\xcc\xab\x16\x42\xd6\xb6\x62\x8d\xdd\xa5\x4c\xb7\xb8\x9e\x09\x5d\xd2\x8b\xed\x78\x51\xde\x4e\x08\x41\xcf\xe4\xbc\x23\x27\xc7\xea\xe3\xce\x4d\x8e\x7e\x79\x06\xc8\xc3\xcc\xcd\x75\x4e\x70\x74\xc9\x40\x44\xc4\xfd\xb1\x48\xc2\x5e\x29\xd5\x32\xe1\x4d\x7e\x5a\x1e\x16\x0d\x78\x51\x6a\x04\x03\xe5\xa3\xd8\xb6\xb2\xbe\x6c\x1d\xab\xf7\xd2\x11\x26\xc8\x99\xe0\x37\xed\x81\x72\xf4\xb9\x86\x56\x0f\x5d\x74\x35\x86\xc5\xb4\xb2\x3a\xa6\x6d\x10\x02\x0b\xe5\x46\x0e\xbd\xc1\xa2\x8f\xc3\x8a\x7a\xb8\x49\x2a\x85\x3a\xdd\x0c\xd8\xef\x4b\x07\xb3\xcf\x43\x7a\x6f\xd7\xb0\xb7\xcc\x53\x0c\x9d\xab\xac\xc3\xe1\x74\xa0\xae\xe9\xd8\xb4\x47\x45\x59\xd3\x96\xcc\x6a\xdc\x6c\x6b\x3a\xa4\xa6\xd9\x1f\x59\xb9\x49\x69\x24\x9e\x7c\x81\x24\x3d\x0c\xef\xee\xe8\xe4\x71\x1a\x1a\xe8\x9b\x25\x1f\x09\x5e\x2b\x58\x0b\xe1\xca\xc2\x89\x0d\xbc\xb9\x8a\x46\x2b\x63\x84\x51\xd1\xdc\x92\x06\xb1\x14\x8f\xeb\x1e\x5b\xb4\x7b\x4b\x02\xbc\xf1\xa1\x08\xc6\x31\x23\x81\x1f\x84\x1d\xd9\x37\xd2\xc5\x52\xb2\xf0\xe8\xd4\xd3\xe1\xc4\xd7\x83\xfa\xb2\xef\x92\xa2\x43\x74\x98\x2d\x44\x73\x64\xf0\x45\x9a\x02\x48\x98\xf5\x1b\x6f\x2d\xbd\x88\xc8\xd5\x6d\x52\x74\x75\x00\xf5\x99\xdb\x07\xb9\xd0\x51\xf6\x04\x44\x85\x15\x73\x2e\x62\x85\x1c\xd8\xa3\x0f\xea\xf5\x65\x05\x17\xc8\xa3\x70\x07\xec\x7d\xcb\xb9\x88\x03\xec\x7d\x35\x5f\xcf\xcc\x0b\x10\x15\x09\xc8\xe3\xe5\x73\xdf\x9e\xde\x41\x92\x09\x96\xad\xcd\xd9\x1d\x41\x1d\x3c\x83\x11\x0f\xf8\x23\x69\x6d\x3e\x7d\xd2\x9e\xee\x71\xbe\x30\xb3\x83\x62\xa3\xb5\x64\x34\x71\xa6\x6d\x0a\xc7\x57\x61\x24\xe7\x9b\x91\xce\x9e\x7a\x04\x0b\xea\x10\x29\xcb\x86\x07\xfe\x60\x9c\x32\x6e\x16\xba\x69\xe1\xa7\x13\x05\xfd\x4a\x76\x38\x2c\xd6\x53\x04\x47\x57\x86\xd7\xa3\xdc\x0c\xd7\xdc\x70\xa1\x78\x79\x08\x87\xe1\x5f\x9c\x6c\xc6\x05\x0e\xf6\x3b\xbd\xdd\x99\x18\x4f\xcb\xa0\x8e\xf2\xbb\x9b\x80\xeb\xdc\x8e\xb9\xa6\x3b\x73\xcb\x78\xa5\x0c\x01\xe7\x71\xe7\x23\xbe\x67\x64\x53\xeb\x93\x13\x3f\x48\x34\x7b\x47\x7c\xdd\x59\x66\xdd\x66\x0f\x69\xc2\xb6\xab\x96\x76\x78\xe7\x0b\xe2\x00\x50\xc2\x7b\xe3\x20\x28\xae\xda\x29\xb7\x1a\xb0\x1c\xfa\xb8\x9a\x5e\xcc\x56\x5d\xaf\x87\x93\xd2\x60\xc5\x74\xc9\xef\x1e\xb0\x3b\xfc\xdc\xd7\x8f\x9a\x1a\x1a\xdc\x55\x72\xdd\x05\x97\x11\x4d\xaa\xc1\x99\x71\x65\x35\x82\xe7\x64\x56\x3e\xb8\x4d\x7e\xe3\x11\xb1\xe0\xbe\xce\xc9\x39\x05\x08\xee\x08\x4c\x1f\x94\x2f\x3c\x05\xe5\xb5\x07\x98\xe1\xfa\x4a\xc1\xfb\xd9\x0b\x57\x20\xb9\x40\x18\x05\x57\x05\x5c\x95\x03\xe5\xd3\xb2\x4a\xce\xd9\x9c\x22\x01\xf6\x7e\x7a\xe7\xe0\x65\xab\x95\xbd\xb0\xe2\xc0\x01\x39\x06\xdc\x97\xbd\xfb\x97\x27\xe0\xd0\xd2\xe2\xa6\x68\xbf\x48\x2b\x65\xdc\x1e\x94\x55\x42\x02\x31\x6e\x9c\xce\xa6\xf0\xd0\x57\xf8\x60\x25\x1e\x3b\x4b\x1b\x71\x1f\x68\xda\xd0\x34\x0c\xb4\x23\x48\xfc\x3a\xf7\x1c\x4c\x4d\xd6\x54\x83\xc0\x63\x74\x02\x56\x3b\xdf\x13\xef\xde\xf0\x04\x0a\x75\x2b\x42\xe4\x5c\x04\x30\xe9\xba\x2b\x32\x39\x5f\x1c\x6b\x73\x3c\x9f\x37\xe6\x7e\x16\xe1\x25\x6e\x4e\xe1\x4d\x54\x24\x16\x95\xfa\xe3\x34\xce\x21\x78\x32\x8e\xd3\x0b\xa2\x9f\x46\xb6\x3a\x9f\x84\x6a\xd5\x3a\x30\xea\x8a\x4c\x16\x4d\xee\x5d\xdd\x7e\x2d\x68\xf6\x7e\xe2\xd0\x9b\x0f\x53\x58\xa7\x16\xe5\xb6\x4c\x86\xb4\xcf\x56\x87\x74\x2b\x45\x73\x9f\xcf\x20\x6a\x2c\xf8\x19\x8c\xb8\xa3\xb8\x5f\xbc\x93\x7e\xda\x57\x6e\x00\xe8\x7c\xf0\xc3\xde\xd7\x57\xde\xb8\xd0\x50\xd8\xf4\x3a\xea\x69\x18\xd6\x27\x23\x77\xd7\x1c\xb8\xa3\x7a\x0b\x86\x7a\x0e\x0a\x69\x8a\xcf\x2f\x4c\x3f\xf1\xe2\xf6\x8b\x2f\xfc\x3c\xab\x2e\xef\x2b\x5f\xd9\x47\x82\x1e\x71\xc0\x6a\x2e\x7c\x1f\xb4\xfc\x66\x8f\xfe\x05\x29\x5c\x63\x7e\x95\xa5\xfe\xd6\xd7\xc0\x92\xf1\xa5\xe4\x8d\x80\xf7\xc8\xb8\x2e\xef\x13\xed\x33\x05\x8d\x90\xaf\xb5\x40\x1c\x36\xbd\xf2\xb0\x04\x25\x9e\xf0\x56\xc0\x97\x33\xc4\xda\x03\x00\x45\xb8\xea\x79\xe3\x66\xa9\x3b\xcb\x57\x68\x57\x68\x3f\x23\x74\xc7\x17\x4f\x40\x78\xf9\xef\x71\x2d\x3f\x3b\x88\x82\x6e\x64\x4f\xcc\xd4\xa5\x87\x6f\x01\xf7\xe6\x21\xdf\x2b\x62\x41\x55\xf4\xd5\x5d\xd4\x8a\xa4\x63\x29\x63\x4d\xee\x7d\xa7\xa3\x55\x9c\xa6\xdf\xc2\xc1\xb8\x90\x9e\xef\x1b\xe3\x85\xad\x32\xab\xd5\x9c\x9a\xde\x20\x44\x68\xae\x18\x60\x77\xb8\x43\xce\xfd\x81\x81\x66\xa2\x57\xd1\xb8\xbd\xf8\x36\x08\x70\xb3\xde\x87\x9e\x10\x16\xf0\xf3\xbb\x3b\x2c\x23\xd5\x21\xe4\x2a\x23\x2f\x0d\x20\x19\x2d\x19\x2f\x7d\xe5\x92\xf4\xd2\x2f\x26\xcb\xa0\xcf\x17\x46\x6e\x07\x6b\x39\xe3\xc3\xcb\xac\xd6\x62\x52\xbf\xce\xef\xd5\x6d\xad\x87\x3a\x9a\x1a\xc3\x1c\x8f\x81\x51\x0f\x33\x40\x62\xea\xc8\xba\x00\x5e\xb4\x47\x4b\x4b\xb3\xd7\x32\x2f\x3f\xf9\xd9\x23\xcc\x73\x09\x2d\x80\x5c\x9b\x71\x19\x28\x36\x33\x41\xb9\xe5\xc0\x9d\x8f\xd5\xeb\x8a\x9a\x85\x5a\x9c\x21\x6c\xb7\x8c\x70\xfc\x3c\x8e\xde\x25\x76\xdf\x75\x22\x8f\x92\xb3\xcc\xa6\x9a\x4e\xa7\x6b\x96\x0b\x76\xfb\xca\x3f\x3b\xe9\x55\x7e\xde\xb1\x03\x47\x24\xce\x19\x09\x46\xe2\x06\x0e\xb0\xe1\xa6\xb1\xd8\xc8\x48\x90\x76\x31\x64\xbb\x60\x9d\x07\x00\x53\xe0\xe7\x17\xdb\xfa\xac\x6b\x70\xff\xb2\x5c\x95\x23\xf2\x6f\x7c\xfa\xc9\xab\xfd\x14\x22\xc6\xf8\x6b\xdd\x8b\x2b\x2f\x2d\x04\xf1\x2c\x4d\x3c\x05\x84\xfa\x8b\x7b\x45\xf8\xce\x83\xd5\xca\x68\xaf\x50\x45\xd5\x8e\x30\xba\x99\xde\x82\x74\xc7\x7b\x2f\x8b\x08\x21\x4e\xde\x22\x6e\x94\xb0\x88\xa4\xad\x6e\x39\xc1\x31\x4c\xd4\xba\x67\x66\xd6\xed\x18\xaf\xab\x31\x6a\x27\xad\xa7\xbd\x27\xb3\xe4\xcc\x99\xae\x87\x88\xb5\xc9\x15\x5c\xdc\x91\x6f\x15\x74\x16\x2c\x95\x19\x1f\xce\x05\xa6\xc2\x03\xff\xe2\x10\xe3\xda\xae\x7d\x6e\xae\xfb\x3b\xa6\xc7\x2d\xf1\x13\xaf\xbd\x6a\xef\x38\x01\xc9\x33\x11\x63\xd1\x4c\x65\x06\x2e\xc4\x9a\x5d\xfe\xd6\xa0\x5b\x32\x18\x3e\x34\xe4\x3f\xb5\x8d\xdb\x8d\xf1\xd7\xbd\xae\xee\xaf\xfb\x0c\x00\x5a\x3f\xd7\x89\x03\x36\x82\xab\xff\xd4\xc2\x33\xf6\xd2\x1b\xb6\xca\xfc\x97\xee\x2f\x77\xe8\xa5\x4b\x92\xcc\xbb\x05\xf3\x3e\x7f\x55\x2e\xd0\x0a\xae\x2e\xef\x56\xcc\x6b\xef\x78\x7f\xc1\xf4\x79\xb6\x6b\x32\x3f\x71\x03\x5d\xe4\x3f\x35\xff\xfc\x3b\xa6\x58\xc0\xbb\x2c\xfa\x00\xcf\x27\xb1\xec\x86\x43\xc3\xb8\xb0\xbc\xdc\xfc\x8a\xf5\x37\xfc\x6f\x93\xff\xc9\x97\xb1\x5f\xbd\x01\x1d\x68\x75\xa2\xfc\x30\x9c\x5e\x78\x5d\x00\x0a\x5c\x30\xf1\xf4\x15\x43\x4e\xfa\xaa\xac\x84\x13\x63\x7e\xd1\x28\x5a\x91\x9f\x3d\x27\xdc\xd8\x57\xa3\x59\x87\x47\xd1\x88\xb4\x31\xc5\x21\x48\xcb\xc8\xeb\x25\x93\xf0\x25\xd4\xdb\x70\x78\x6c\x56\xa0\xb8\x62\xea\xa9\x65\x04\x18\x7e\x32\x1e\xb4\x63\xa2\xab\x3d\xde\x7d\x09\xcf\x49\x77\xa8\x50\x4b\x19\xd9\x17\x46\xf3\xc1\xd1\x25\x88\xeb\x4b\x68\x89\x11\x2b\xb9\x73\x66\x54\xba\xc4\x12\xc4\xbc\x8a\xce\x03\xcc\xbd\x22\xf8\xd6\x50\xb5\x25\xb4\x6a\x03\xaf\x4f\x55\xc9\x78\x6d\x9a\x3c\x61\x5e\x57\x23\x56\x82\x94\x72\x31\xcc\x7a\xd7\x45\x76\x79\xdd\x49\x42\xd9\x65\x6b\xe0\xcc\xa7\x67\x9e\xbe\x54\xb2\x2e\x3e\xd9\x7e\xd5\x0d\x12\xc3\x51\xc4\x57\x50\x7a\x32\x0a\xb0\x43\x8e\x1f\x43\x4f\x34\x79\xee\xb2\x24\x72\x60\xdf\x72\xeb\x8e\x7e\xe2\xf1\x03\x97\x1f\xd6\x9e\x3f\xf1\xb2\x67\xa0\xa5\x4e\x6e\x25\xda\xea\x16\xf4\xcf\x5e\xf1\xe6\xfd\xbb\xdf\xb0\x55\x76\x33\xfd\x57\xee\x00\x98\x7c\xad\xbc\xaf\xac\xf8\xd2\xd2\x08\x7d\xd7\x2b\xb0\xdf\xfd\x29\x12\x1e\xc3\x85\x7e\xe7\x61\xfc\x91\xd7\xd7\x5c\x10\xd8\x5a\x78\x5e\xbf\xfa\xd6\x97\x86\xbe\x6a\xe3\x5d\x3f\xf9\xe5\xff\xe4\xef\xd3\x2f\xda\xfd\xee\xef\xa7\xdf\xde\x42\x7f\xf6\x48\xe9\x87\xe5\x83\xa7\x16\x9c\x7f\xce\x25\x92\xc3\x83\xe7\xeb\x5e\x6b\x84\x2c\xed\xe5\xb3\x57\x0a\xee\x28\x6d\x97\x1f\x73\x0b\xb9\x1b\x6f\x0e\xbf\xee\x30\x96\x12\xfb\xd5\x17\xc7\xc7\x0a\xbe\xea\xfe\xac\x14\xf9\xfd\xd3\xf7\x9b\xb3\x6f\xde\x54\x78\x0c\x9b\x93\x07\xa6\xcf\xb9\xa6\x36\x10\xd4\x26\xa0\x4d\x7c\xe3\xa9\x16\x44\xae\xa5\xcd\xc2\x0f\x93\xc1\x13\x59\xf4\x59\xfb\xe5\xde\xa7\x8d\xb3\xdf\x68\xdb\xc9\xa2\xe5\x06\x51\x96\x76\x24\xae\xfd\x15\xb3\xd2\x6a\x8e\xd7\x3b\x70\x95\x64\x1d\x94\x9e\xb1\xd0\xf3\xe3\xb7\xde\xd4\xdb\x95\x2a\x27\x5c\x8e\x9d\x92\xa9\x96\x69\x77\xbb\xd3\xa0\x5d\xd1\x45\xed\xa0\x17\x6f\x40\x15\x9e\x89\x0a\x66\x16\xd8\x9b\x98\xfa\x26\x7d\x61\xfa\xb0\x05\x3a\x36\x1e\xd2\x71\x76\x3e\x6b\x74\xae\x88\x86\xde\x23\xa2\xb3\x72\x0d\xfd\xbc\x1b\xe7\xf4\xf1\x30\x30\x57\xb8\xb1\xa0\x20\xd2\xa7\xe7\xfa\x9e\x13\xb8\x0e\x26\xc7\x1e\x76\xc2\x05\x57\xea\x66\x5c\x11\xfe\x95\x8b\x2e\xa1\xa4\x6b\xb5\x4c\x0a\x7d\x40\xd9\x35\x8e\xd8\x37\x67\x16\x31\xed\xb5\xf6\x39\xd2\x49\xe8\x52\x11\xf7\xc5\xa7\xc6\x22\x82\xc9\x79\x30\x58\xa5\x90\x59\x80\x2e\x92\xf2\xd2\xd8\xbd\x5b\xea\x10\x45\xfa\x79\xcf\x89\x89\x1c\xf3\x8b\xfb\xd6\xb2\x4b\xc8\x24\xa1\xd4\x8e\x38\x1c\x4f\x60\x19\x5f\xf9\x65\x6e\x67\x57\x9f\x7b\x18\x9b\x68\x33\xd2\xa1\x03\xeb\xcc\x48\x7c\xc5\xa6\x8f\xfc\xa0\x8b\x29\x53\xba\x83\x19\xe8\xe9\xa1\x2f\x48\xb2\x13\x50\x38\x1a\x77\xf6\x80\x4e\x27\x2b\x15\xc1\xf8\xd2\x0d\xc2\xcb\x56\x2a\xe2\xc9\x32\x62\xe4\xbe\x2d\x72\x41\x71\x35\x55\x75\x0a\xf6\x53\x7b\x58\x39\x07\xf1\x42\x7e\xf2\xe9\xf2\x9e\xaf\xce\xb7\xfb\x00\x7b\x50\xdd\xf5\xfd\x0d\xac\x93\x2f\x3d\x22\xc9\x7f\x4d\x53\xb7\x5f\x6b\xbe\x72\x2f\x2a\xbf\xe9\xcc\x8f\x79\x4b\x1c\x78\x09\xf2\xc4\x2c\x3d\xe4\x67\x1c\xe8\x09\x4b\xa3\x4e\xff\x14\x4f\x48\xb6\x2a\x23\x1f\xac\xb6\x2e\x4b\xfa\x5a\x47\x3d\xea\x1b\x35\x4e\xb3\x68\xee\xeb\x7b\x3f\xf3\x31\xc7\xce\x93\xe8\xf9\x9e\x71\xee\xc2\xda\x25\x78\x96\xc6\xe1\xf5\x3a\xf2\xe6\x6e\xab\x7b\xc6\x31\xc3\xa3\x38\x3f\xa0\x43\xe0\x48\x10\x30\x28\x0a\x3f\xd7\xe0\xdc\x94\x10\xe7\x2c\xda\xb2\xb2\x43\xbe\x26\x55\x77\x5b\x33\xdd\xc1\x24\x03\xf7\xee\x6e\x95\x26\x51\x24\x92\xcb\xed\x44\x1d\x11\x0d\x42\x42\x95\x02\xef\x79\x9b\x1a\x94\x12\x8c\x48\xe4\x93\x87\x80\x30\x3e\x21\x28\x68\xb3\x44\xf5\x2e\xb0\xa4\x42\xc2\xa1\x1c\x5b\x4c\x00\xec\x85\xe7\x2f\xbd\x9f\xad\x92\x7b\x33\x5f\x33\x3e\x2f\xc0\xf2\xc4\xf3\x96\xda\xfa\xcb\x49\x74\x39\x05\x20\x0f\x36\x2f\xb3\x27\x5e\x6c\x5d\x6d\xab\x16\xcd\x51\xac\x90\x5f\x9d\x62\x65\x95\x23\x5a\x4f\xe8\x71\xe5\x2e\x90\x99\xe4\x65\x50\xf0\xfc\x4d\x77\xeb\x33\x73\xf4\x92\x20\x99\xf1\x0e\x03\x61\x11\xce\x52\xeb\x8f\xaa\x45\xd7\x88\xaa\xa9\xfb\x6b\x86\x95\xdc\x92\x6f\x6c\x55\xe2\x64\xc8\x4a\xcf\x36\x33\xaf\x78\xc9\x33\xad\x2b\xa4\x2a\x09\x5b\x34\xd5\x56\xab\x76\x5d\x9f\x96\x39\xc2\xf5\x7d\x57\x3c\x72\x19\x21\x3a\x1b\xf4\x7b\x96\x08\x33\xe8\x5c\xe1\x11\xa2\x85\x19\x9c\x20\x88\xa2\xd3\x09\x29\x75\x52\x8e\xf9\xfb\x28\x0b\xa8\x22\xc2\x3e\x1d\x49\xa5\xb5\x50\x93\x61\x52\x8b\x4e\x49\x50\xb2\x70\x1d\x01\xa2\x44\xa8\xd9\x0e\x53\xf3\x70\x6a\xe2\x2e\xd2\x6b\x87\x74\xb3\x94\x0f\x31\xda\x5a\x68\xa2\xe9\x09\xc8\xaf\x91\xc9\xbb\x6a\x11\x28\x57\x4d\xc2\x1a\xde\x1d\xac\xd9\x23\x1e\x94\x6d\xec\x10\x8f\xb8\x71\x35\xc1\x9b\xce\xc1\x02\x0c\x13\xf4\x40\xec\x8c\xe0\xf8\x9c\xa2\x09\xab\x9a\xc1\xb5\x47\x6b\xc2\xa1\x30\x6d\x7d\x79\x10\xe8\x01\x34\x01\xd6\x16\xf8\xe1\xa8\x9b\xb1\x2b\x45\x5b\xfb\xd9\x8a\x5b\x2a\x7f\x86\x89\x0a\xe6\x4d\x75\x87\x43\xb9\xbc\x40\x49\xbc\xf2\xa6\x71\x44\xf0\x09\xb5\x54\x8b\x2e\x4f\xa1\x5c\x9f\x69\x0d\x39\xc0\x06\x43\x41\xb6\x22\x96\xba\x60\xa5\x5f\x1a\x8d\xa7\x02\xc4\xa2\x31\x18\xd2\xec\x43\x80\x2f\xb3\x54\x06\x05\xcc\xfb\x33\xba\x50\xd5\xd4\x13\xae\x75\xb7\xcb\xc5\x3a\xd3\xb1\x2b\xe9\x76\x8e\xb9\x58\xca\x94\x12\x91\x7a\x63\x47\x62\xb1\xa5\xde\xac\xa4\xc3\x21\xa6\xe2\x0f\x0f\x73\x07\xa7\xc6\x04\xdd\x94\x8d\x3b\xa2\xf3\x4e\x98\x18\x2e\xff\x0c\x18\x7a\x35\x9e\x35\xe2\xc1\xfb\x60\xc5\x86\x01\xf3\xf7\x11\x87\xea\x34\x10\x4f\x49\xe7\x0e\x8c\x5e\xc1\x13\x4a\x0f\x06\x7e\xce\x17\xcf\xb5\x90\x60\xdb\xb6\x84\xab\xc6\xd2\x19\xe8\x94\x80\x1b\xb4\x8d\xd9\x1e\x19\xa0\x35\x2d\x35\x3d\xd2\x0e\x7e\x25\xc8\xdd\x7f\x20\xd1\x83\x8e\xcf\x83\x4c\xaa\x2e\xec\xe3\x7e\x3a\x56\x83\x48\x84\x1b\xb3\x7a\x4e\xc3\xdb\xbe\xe8\x1c\x06\x95\xea\xdb\xe8\x5d\xad\x22\xd1\xe8\xce\x81\x6a\x8f\xc4\x70\xe8\x38\xf5\xb2\x6b\x2b\x7d\x92\x1d\x38\xb9\x3b\x7b\x0a\x7b\xa2\xd5\x21\x13\x68\x7a\x2a\x1b\x22\x83\xb2\x8f\x96\x09\x76\x47\xc0\xe9\xa5\xd4\xeb\x9d\x4c\x6b\x2d\x14\xab\x4a\xb6\xec\x27\x4e\x3a\x3a\x2c\x4b\x58\x2a\xab\x69\x37\xb8\xc2\x8c\x7b\x05\x14\xd1\x2e\x3b\xee\xb9\xcb\xf7\x89\x59\x8d\xd9\xb0\x2c\x02\x01\xad\xb8\x17\x0d\xdd\xbe\xf7\xf3\x31\x63\x72\xe9\xf1\x61\x72\xaf\x48\xc4\x4b\x67\x6f\x7c\x84\x56\x8b\x3c\xeb\xe1\x1e\x11\x4f\x55\xf6\xc8\x61\x9a\x4e\xc7\x92\x0d\x94\x18\x5f\x90\x48\x88\x95\x26\xae\xe8\xb4\xa0\xf6\x0e\xf4\x8c\x4d\xae\xcf\x31\xd5\x35\x55\x5c\x12\xfc\xb6\xd1\x18\x9c\x41\xe9\x89\x5b\x44\x79\x59\x36\x03\xd2\x28\x74\x27\x6a\x7f\x4f\x78\xf3\x8c\xd2\x57\x34\x0d\x0c\x14\xeb\x26\x9e\x0f\xe7\x90\x99\x27\x17\x0a\xe5\xec\x06\x4d\x34\x53\x92\xa2\x92\xe1\xa2\x76\xa1\xb5\x94\xa6\x6e\x7d\x59\x4f\x4f\x0a\x84\x23\xa1\xb9\x76\x0c\x27\xb5\x93\x75\xea\x29\xf0\x2c\x1b\x75\x48\x67\xde\x1e\x85\x93\x61\xde\x73\x60\x63\x7f\x65\x08\x97\x7a\x36\xa4\x93\x65\xe7\xbb\x72\x83\x67\x04\xbd\x5a\xee\x02\x5b\x03\x63\xc0\x57\x7d\x78\x6a\x28\x9a\x37\x27\xfe\x69\x65\xc1\x03\x4e\xfd\xd2\x13\x69\x1c\x97\xba\xdd\xaa\xac\x20\x5c\x0e\x72\x0a\xe5\xab\xd1\xc5\x0b\x65\xb0\x83\x46\xe8\x36\xd3\x1a\x14\xd6\x2d\x4d\x5a\x79\x7b\xef\x15\x23\xfc\x54\x28\xfd\xc1\x40\x59\x6c\xe4\xfd\x21\x0d\x0e\xa4\xc4\x70\x85\xa6\x5d\x04\x7b\x0a\xa1\x1b\x1b\x0c\xa7\x98\x47\x90\xf9\x86\x40\x96\x95\x26\xe7\x0e\x22\x54\xec\x8a\x99\x64\x3d\xa3\xcd\x8a\x32\x98\x40\x39\xf6\x3f\xbc\x03\xe3\xfc\x09\x5e\xa7\xe9\x5a\x9c\x68\x3a\x2c\xf9\x76\x05\x00\x00\x56\x36\x6d\x42\x18\x9e\x72\x9e\xe7\xdf\xbf\x7f\xbe\x80\xfc\x7a\x2f\x0a\x8f\x4b\xfe\xf7\x1f\xff\x1b\x00\x00\xff\xff\x13\xa9\xc2\x7d\xe6\x15\x00\x00") - -func bindataTkgWebDistTkgkickstartuiAssetsImagesVsphereSvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiAssetsImagesVsphereSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/vsphere.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiAssetsImagesVsphereSvg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiAssetsImagesVsphereSvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/assets/images/vsphere.svg", - size: 5606, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiAssetsImagesWelcomeintroSvg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5c\x4b\xb3\xdb\xb6\x92\xfe\x2b\x2c\x65\x13\x57\x01\x6d\xf4\x03\xaf\x94\xe5\xaa\x4c\x16\xe3\x85\xa7\x66\x91\xb9\xb3\xc8\x8e\x22\x25\x1f\xcd\x95\x8f\x5c\x92\xe2\xc7\xbf\x9f\x6a\x90\x94\x28\x89\xe7\x44\x49\xae\x8f\x6e\x25\xa6\x09\x10\x8f\x0f\xdd\x1f\x1a\xdd\x10\xe0\x37\xfb\xcf\x1f\xaa\xaf\x1f\x37\x8f\xfb\xf9\xec\xe1\x70\xf8\xf4\xd3\xeb\xd7\x5f\xbe\x7c\x81\x2f\x0c\xdb\xdd\x87\xd7\xe4\x9c\x7b\xbd\xff\xfc\x61\xd6\x15\xf9\xe9\xeb\x66\xfd\xf8\xcf\xa9\x82\x98\x73\x7e\x5d\xbe\xce\xaa\x2f\xeb\xf6\xf0\x30\x9f\x05\x26\xe0\x3c\xab\x1e\x96\xeb\x0f\x0f\x87\xf9\x8c\x83\x03\xe6\x59\xf5\x79\xbd\xfc\xf2\x1f\xdb\xaf\xf3\x99\xab\x5c\xd5\x15\xaa\xfa\x6f\x6f\xdf\xb4\xcb\xd5\xfe\xed\x9b\xcd\xfa\x71\x59\xef\xfe\x73\x57\xb7\xeb\xe5\xe3\xa1\x5a\xb7\xf3\x19\x35\x98\xdc\xd2\x93\xcd\x75\x9b\xac\x2c\x70\x65\x6b\xe2\x95\x45\x5e\x2c\x62\x58\xd6\x21\xb8\x38\xab\xbe\xe2\x7c\x26\x81\x40\xfc\xac\xfa\x86\xf3\x19\x65\x06\xf2\xb3\xea\x2b\xcd\x67\xe8\x19\xd2\xac\xfa\x46\xa7\xec\x0f\x7d\x0f\xff\x78\x5c\x1f\xf6\xf3\xd9\xef\xfb\xe5\xee\xd7\x4f\x75\xb3\xfc\xef\xc7\x7f\xec\x97\xb3\xb7\x6f\xf6\x87\xed\xa7\x6a\xbb\x5a\xed\x97\x87\xf9\xcc\xcd\x2a\x4d\xdb\x66\xbb\xd9\xee\xe6\xb3\x1f\x56\xab\xd5\xec\xf5\x65\x19\x40\xbe\x28\xb6\x58\xb6\xcb\x15\x4e\x94\x64\xbc\x28\x19\xea\x85\xb4\x53\x6d\x8a\x5c\x94\x64\x9f\x73\xcb\x13\x25\xfd\x65\x9b\x84\x69\xd5\x94\x36\x5f\x9f\x0b\x75\x52\xc8\x8e\x24\xd6\x4b\x0a\x36\xf9\xd4\x5a\x69\x73\xb4\x69\xe1\x9d\xf5\x3e\xc5\x58\xd7\x1e\x9b\xb4\xec\x84\x8c\x42\x80\xb1\x13\x32\x7b\x07\x94\x7a\x21\x0f\xf9\x2a\x65\x4f\x05\xfa\x77\x90\xb2\xea\xfa\xac\x58\xbb\x5a\x85\x55\x9e\x28\x49\x97\xfa\xa8\x79\x19\x96\xed\x94\x3e\x2e\xdb\x8c\xd4\xa6\xa5\xdc\x22\x65\x59\x34\x6d\x3b\xd5\x66\xb8\xec\x9d\x5d\xe3\xdb\x38\x51\x32\x5e\xea\x18\x57\x0d\xb6\x53\xbd\xa7\xcb\x36\x31\x2f\x56\x1d\x1b\x6e\xd2\x71\x6e\x39\x84\x15\xda\x95\xf8\xc6\x8a\xb8\x85\x4d\x0b\xac\x6d\xc2\x3a\x3a\x89\xa9\x95\x45\xe8\x74\xcc\x21\x82\x0f\x9d\x8e\xb3\x07\x4f\x9d\x8a\x8f\xd9\xaa\xe2\x94\x40\xf8\x6f\xaa\x98\x68\x91\x6b\xdf\x67\x6e\x3f\xd5\xcd\xfa\xf0\x4d\x4b\x4d\x4c\xae\x70\x45\xef\x45\xae\xd3\x55\x55\x70\x53\x93\x43\x8d\xd1\x79\x6d\xb7\xa8\x17\xee\xba\x36\x4e\x4d\xd7\xe0\x2f\xc5\xde\x2e\x9a\x45\x73\x5d\x9b\xfc\x44\xed\x7c\xa5\xb4\x7a\xb1\x6c\x96\xd7\xb5\xe5\xba\xf6\x25\xdb\x7a\x7d\x5f\x55\xf5\xb7\x52\x20\x26\x17\x17\x4b\x5c\x58\x89\x4a\x81\x95\x8b\x36\xe5\x2c\xd6\x27\xe4\x66\x21\xcd\xa2\x75\x3d\x05\x44\x12\xf8\x7e\x9a\x67\x29\xf2\x57\x0a\x1c\xb3\xff\x32\x05\x00\xaf\xf8\x3e\x3d\xaa\xa9\x29\x7d\x63\x55\xed\x63\x82\x05\x97\x1c\x7a\xaa\x36\xa5\x29\x53\x7c\x6b\x6d\x9e\x9a\xe4\xfe\x56\xe4\x53\xc0\xaf\x6c\xc9\x9f\xea\xfa\xda\xbe\x3c\x35\xec\x29\x2b\x9a\xd2\xad\x22\xff\xcb\xf4\xbd\x99\xbc\x6d\x8b\x5e\xea\xd6\xae\x5a\x5a\x59\x49\x91\x6d\x4a\x75\x63\x73\x6e\x04\x57\x3e\xfb\xb8\xe4\x8e\xbc\xc9\xc5\x0c\x82\x1d\x7b\x2d\x26\x2c\xc3\x50\xfe\x9e\xbe\xd0\x7c\x66\x89\x13\xc4\x13\x81\xff\x67\x57\x3f\xee\x57\xdb\xdd\xc7\xf9\xec\xa0\xaf\x9b\xfa\xb0\xfc\x31\x89\x13\xf0\x5c\x91\x83\x88\xaf\xaa\xdd\xf6\xa0\xb9\x98\xdc\xab\xbf\x69\xfc\x12\x36\xba\x1c\xdd\x42\xfb\x4b\x41\x3e\x51\x75\xda\xf8\x5d\x5a\xaf\xa7\x2a\x4f\x99\xbe\xab\x15\xe7\xa9\xca\x74\xdd\xf3\xad\xa0\x6f\x5e\xbf\xf2\x4a\x56\x9c\x97\xd9\x62\x83\xde\x4a\x08\x68\xeb\xdc\xd6\x36\xb7\x84\x18\x23\x3b\x5a\xe4\x4e\xff\x44\x09\x58\x06\x1f\x05\x8b\xf3\xa9\xda\x3f\xe6\x17\x1f\x45\x80\xe8\xfb\xf8\x28\x97\x22\x5f\x89\xfe\x37\xb5\xac\x5d\x79\x33\x8b\xb6\x99\xf4\x27\x2e\x15\xd1\xe4\x66\xd1\x34\xb7\xb8\x8c\x8b\x65\xe3\x1a\x9a\x32\x2b\x97\x05\x17\x8b\x76\x71\xb3\xc7\x98\xda\x56\x68\xe5\x17\xd6\xe3\xa2\xb1\xd2\xc8\xc2\x26\xe7\x9c\x5d\xb6\x8d\x5f\xd5\x94\x53\xae\x9b\x7e\x29\x41\x51\xeb\xd0\xb9\xe5\x8e\xc0\xe7\x7e\x2d\x19\xf2\x8b\x36\xba\x69\x39\x31\x15\x3f\xd6\x87\xdd\xfa\xeb\x8f\x68\x2a\x57\xfe\xef\x5f\x5e\xcd\xaa\x12\x75\xfc\xf4\xb0\x5b\xae\xd4\x67\xbb\xc5\x3a\xe8\xd8\xba\x40\xe3\xb0\x3e\x6c\x96\x6f\x9b\xed\xe3\x61\xb7\xdd\x54\xbb\xed\xf6\xe3\x9b\xd7\x5d\xde\x9b\x0f\xd5\xfe\xf0\x6d\xb3\x9c\xcf\xd6\xfb\xed\xa6\x3e\xac\xb7\x8f\x3f\x75\x6f\x4a\x87\x0f\x65\xf0\x8b\xec\xc2\xca\x61\xb2\x0b\x69\x5b\x2b\x14\x17\x36\xb7\x71\x69\x29\xc7\x20\x84\x2e\x34\xca\xf4\xb6\x3e\xd4\xf6\xb1\xfe\xb8\x9c\xcf\xde\xd7\xdf\x96\xbb\x0a\x67\x6f\xdf\x7c\xda\x6e\xbe\xa9\x38\xab\x4f\xdb\xf5\xa3\x32\x8e\x5c\x86\x50\xa1\x0f\x90\x7c\xd5\x25\x12\x90\xaf\x98\x3c\x20\x9d\xbd\x23\x39\x08\x34\xab\x56\xeb\xcd\x66\x3e\x7b\xdc\x3e\x16\x37\x62\xb7\xfd\xe7\x52\xe7\x57\xd3\xae\x96\x79\xc8\xb0\xda\x47\x53\x7f\x9a\xcf\x76\xdb\xdf\x1f\xdb\xb3\xec\xff\xdb\xae\x1f\x2f\xf3\xfb\xd0\x0d\x35\x38\x79\xfd\xf6\x4d\xb3\xde\x35\x9b\x65\xd5\x7c\x55\xc7\xbe\xeb\xb4\xf9\x36\x9f\xa1\x8b\x90\x68\x56\xed\xe6\x33\x82\xfc\xd2\x40\xbc\x14\x7f\x43\x81\x64\x84\x7c\x37\x1c\x11\x01\x4f\xf2\xe0\x74\x2f\x1c\x29\x41\x8c\x1d\x90\x98\x8a\x7b\xf3\x72\x38\x0a\x85\x8f\xf1\x60\x6f\x6b\xd1\x79\xe0\x63\xd0\x4d\xc5\x5f\xd3\xd9\x9d\xb9\xac\x24\x2f\x89\xca\x47\xa0\xc1\x7d\x65\xf0\xfd\x02\x80\x21\xab\x9b\x53\x40\x29\x58\xc4\x97\x45\x95\x4e\xa8\x52\xb7\xba\x16\x54\x91\x20\x0e\xa0\x04\x72\x7c\x59\x50\x94\x8e\xbb\x26\x59\x20\xf7\x9e\x3e\x3a\xd6\x45\xa7\xa8\xaf\xcb\xbd\x13\xa6\x14\x4a\xfc\xd6\x61\x0a\x20\xfd\x4e\x4e\x9f\x7d\x27\x50\xb1\xb3\x83\x1d\x28\x57\xcc\x92\x82\xea\xb3\x5f\xd6\x0c\x04\x81\xde\x0a\x30\x95\x5d\x28\xb5\x02\x01\x72\x7a\x09\x20\x57\xcb\x99\xc2\x09\xb9\xf2\x80\xbe\xea\xdf\x0b\xac\x0a\x39\x42\xa4\xaa\xc7\xf8\xa2\x16\x8a\x21\xe4\x4e\x6f\x92\xc1\x0d\x04\xef\xe4\xa6\x6a\xbb\x03\x26\xb5\x8e\xd4\x61\xf2\xe1\xdf\x04\x13\x45\xc8\xbd\x9c\xfa\xde\x3b\x7e\xa7\xe3\xae\xcf\x7d\x41\x89\x53\xe1\x14\x4c\x18\xa0\x87\xd4\x65\xde\x0b\x51\x2e\xf6\x7c\xb0\x4d\x8e\x7a\x4c\x5d\xf6\xcb\xcc\xbe\x0f\xdb\xc7\x93\x2f\x29\x0c\x4e\x2a\x12\xf0\xb1\x22\x89\x90\x53\x85\x19\x02\x57\xe4\x09\x32\x1f\xbf\x9c\x8a\xbd\xa8\xec\x8a\x7b\x3b\x6c\xd0\x17\xb7\xa1\xec\x2b\x16\xef\x76\xd8\xa0\x2f\xd9\xf7\xc1\x84\x7e\x20\xd8\x18\x52\x97\xfb\x92\x88\xd0\x9f\x7e\xc7\x20\xf5\x35\x4b\xf0\xca\x02\xb1\xf7\x5d\xba\xdc\x97\x84\x14\x18\x1c\x5f\x41\x4a\xbe\xc4\xd6\xf7\x81\x94\x3d\x64\xbc\x84\xc4\x98\xca\x7e\xc9\x4b\x42\x7a\x62\x16\x72\x82\xe0\x87\x59\xc8\x0c\x11\x87\x59\x38\x7c\x39\x15\xbb\x17\xe3\x85\xcb\x32\x74\x49\xf9\x3e\xfb\x4e\x9c\xe7\x00\x98\xae\x49\xdf\x67\xdf\x89\xf5\x63\x50\x23\xda\xdf\x01\xd4\x88\xf7\x23\x50\x8c\x5c\x36\x9e\x5e\x14\xd4\x13\xcc\xf7\x04\x91\x07\xe6\x4b\x84\x98\x07\xe6\x0f\x5f\x4e\xc5\xee\xc5\x7c\x1f\x81\xaf\x89\xdf\xe5\xde\x89\xf7\xde\x01\x85\x6b\xde\xf7\xd9\x77\xe2\xfd\x18\x54\xa2\xa3\x8b\x73\x07\x50\x23\xde\x8f\x40\x8d\x0d\xfe\x8b\x81\x7a\x82\xf7\xd1\x43\x96\x81\xf7\x1a\xe0\x1f\x79\x3f\x7c\x39\x15\xbb\x17\xef\x23\x96\x1d\xab\x4b\xe2\xf7\xd9\x77\x62\x7e\x90\xb2\x2f\x7f\xc9\xfc\x3e\xfb\x4e\xcc\x1f\x83\x1a\x59\xfc\x3b\x80\x1a\x31\x7f\x04\x6a\xcc\xfc\x17\x03\xf5\x04\xf3\x03\x42\x3a\x46\x1c\x21\x40\x3a\xfa\x3a\xc3\x97\x53\xb1\x7b\x31\x3f\xf9\xf2\x23\xee\x25\xf3\xfb\xec\x3b\x31\x3f\x26\x10\xba\x66\x7e\x9f\x7d\x27\xe6\x8f\x41\x8d\x98\x7f\x07\x50\x23\xe6\x8f\x40\x31\x52\xd9\x67\x7e\x51\x50\x4f\x30\x3f\x0b\xe4\x23\xf3\xb3\x03\x77\x8c\xb5\x87\x2f\xa7\x62\xf7\x62\x7e\xce\xe5\x00\xc2\x25\xf3\xfb\xec\x3b\x31\x3f\x13\xf8\x6b\xe2\x77\xb9\x77\xe2\xfd\x08\xd2\x88\xf6\x2f\x0f\x69\xc4\xfa\x13\xa4\xb1\xb9\x7f\x29\x48\x4f\x70\x1e\x9d\x07\x87\xc7\x0d\x26\x97\x21\xfb\x81\xf5\xc7\x6f\xa3\x92\x77\xdb\xcf\x41\x2e\x3f\x5d\x5e\xed\xe8\xf4\xf9\x77\x62\x3e\xba\x00\x7e\x22\xc0\x1d\xf2\xef\xc4\xfe\x33\x58\x23\xfe\xdf\x03\xd6\x68\x06\x8c\x61\x8d\x83\xdc\x97\x83\xf5\xd4\x2c\x20\x06\x3c\x86\xb9\x88\x09\xf0\xe8\xef\x1f\xbf\x8d\x4a\xde\x6d\x16\x50\x1c\xb6\x35\x8f\x72\xa5\x63\xf6\xbd\xe6\x00\x39\x08\x13\xc1\xee\x90\x7f\xaf\x39\x30\x86\x35\x9e\x03\x77\x80\x35\x9e\x03\x23\x58\xe3\x75\xe0\x1e\xb0\xc6\x4a\x54\xc5\x4d\xc4\x6d\x43\xfe\x0b\x4c\xcd\xfa\xf0\x50\xb5\xf3\xd9\x7f\x91\x38\xc0\x6c\x98\x12\x78\x43\x39\x19\x66\x01\x0e\x3f\x53\x06\x1f\x4c\xf7\x74\xc6\x19\x34\x5c\x0e\xd1\x18\x96\xbc\x41\x60\x32\x08\x31\xbe\x23\x46\x70\xfe\xb7\x01\xf2\x0f\x3e\xf9\xec\x17\xda\xc3\x6e\xd9\x1c\xaa\xaf\xa7\x4b\x04\xa7\x73\xaf\x3d\x14\x76\xdd\x06\xee\x70\xdb\x21\x43\x38\x0e\xfd\xf7\xdd\xe6\xc7\x1f\x6e\xb9\xc0\xf0\xea\x6c\x30\x58\xcc\x9c\xe9\xce\x04\xed\xd1\x19\x55\x79\xb2\x08\xc1\x50\x80\x8c\x8d\x07\x12\x43\x90\xd8\x90\x46\x2f\xc6\x03\xe5\xd1\xeb\xc6\x22\x24\x6f\xc9\x43\x1c\x8d\x29\x46\x4f\x9c\x2e\x3a\x8a\x80\xd1\xa0\xf7\x40\xa1\x21\x40\x31\x88\x40\xde\x44\x6d\x0a\x03\x48\x36\x98\x21\x8a\x41\x0f\x2e\x19\x74\xe0\xbd\x45\x20\x32\x48\x40\x16\x1d\x88\xd7\x2a\x18\x2d\x11\x88\x7e\xe3\x64\x31\xd8\x0c\x21\x59\x8c\x10\xa3\xc5\x04\x01\x2d\x06\x70\xe9\x57\x44\x6f\x50\xb4\x97\x51\xc7\x53\x10\xc7\x3f\x70\x53\x86\x18\xfa\x03\x37\x92\xcb\x71\xfd\xdd\x7c\x86\xa9\x5c\xa4\x78\x66\x70\xa2\x0b\x84\xd1\xea\x79\x8f\x08\x01\x75\x2c\x3e\x58\x14\x48\xd9\x90\x83\x28\x35\x0a\x84\x6c\xba\x67\xe1\x87\x45\xc8\xac\xe3\xc7\xbd\x33\x11\x50\x2c\xb2\x92\x47\x5f\x1b\x1d\xb0\x0f\x36\x42\xf6\x9a\xcd\x64\x49\xac\x80\x8f\x96\x09\x28\xff\x82\xaa\x03\x32\xa8\x32\xd3\x56\x4f\x00\xce\x12\xa7\x01\x3b\x87\xde\x97\x73\xb7\xcb\xcd\x66\xfd\x69\xdf\x8f\x98\xa9\x9c\x86\x2b\x23\xf6\xd2\x1d\xed\xf9\x3a\x9f\x49\x39\x3b\xb7\xfb\x36\x9f\x85\xe2\x55\x1d\xa6\x0e\xac\x5a\x0a\x20\xa9\xa2\x08\x42\xc7\xf3\xaa\x0a\x3c\x86\x57\x7f\x20\x68\xc7\x65\x6a\x97\x6e\x99\xcb\x5d\x8b\xdd\x7c\x96\x46\xa7\x3f\x46\x80\x4f\x72\x0e\xac\xf4\xc3\x88\x90\x71\x8f\x11\x24\x19\x76\x90\x54\xc2\xec\x0d\x07\xf0\x6c\x04\x32\x19\x8c\x3a\xf3\x4e\xaf\xef\x31\x24\x43\x18\xc1\xc7\x8e\xec\xd1\x60\xe4\xe7\x19\x2b\x09\x92\x18\x8c\x11\x90\xf6\x96\x0b\xe1\xc5\x8a\xa8\xca\xe2\xaf\x19\x55\xfe\xe4\xa2\xc9\xb9\xbc\x61\x86\x42\x37\x31\x24\x1e\x42\x32\x88\xa4\x16\xa2\x9c\xfe\xdc\x4b\xa1\x34\x7b\x23\x1e\x9c\x1a\x08\xe5\x6b\xd0\x79\x74\x7c\x99\xd2\xd5\x09\x4d\x4a\xc5\xbc\x50\x00\x17\x36\x96\x33\x44\xb2\x92\x20\xcb\x5e\xf9\x11\xd8\x24\x50\xba\x84\x6e\xa2\xc6\x26\xea\xd8\x89\x80\x8d\x38\x48\x68\x38\x1c\x5f\x9e\xef\x68\x84\xfa\x17\x44\x35\x56\x86\x02\x41\x0c\x65\xa0\x68\x28\x91\x41\xa7\x82\x4f\x4d\x52\x0d\x90\x57\x64\x48\x80\x68\x84\x8a\xa1\x3b\xbd\x3f\xf8\x0c\xcc\x7b\x8b\xd9\x26\x0f\x11\x2d\x21\x64\x9b\x75\x14\x35\x06\x40\x32\xdd\xb3\x9b\x11\xc0\xd1\x22\xc4\xb4\xb1\x22\xaa\x40\x04\x92\x5f\x0a\x22\x85\xc4\x90\x42\x27\x55\x1d\xa4\x9c\x09\xf8\xb7\x33\x43\x78\xcb\x25\xa3\x73\x43\x48\x0e\xb5\x2d\x46\x60\xff\x2b\xb9\x64\x88\xd0\x90\xd2\x54\xff\x12\xf0\xd2\x58\xaf\x06\x06\xa3\x21\xd6\x89\xcb\xca\xa5\xd3\xeb\xc6\xaa\x5e\x89\x61\xc4\xaa\x3a\xc6\x85\xac\xce\xfb\x51\x07\x6d\x60\xcb\x83\x6b\xd0\xe9\xa0\x9c\x4a\x21\x5b\x82\x2c\x6a\x81\xbd\xa8\xe5\x10\xde\x60\xb1\x0a\x04\x48\x0d\x48\xd4\xb7\x84\x36\x41\x54\x29\x62\xb4\x9d\x91\x21\x04\x7a\x70\x35\x66\x50\xcd\x94\xa7\x4a\xd3\xe9\xe7\x54\x8c\xea\xc6\x99\x22\xc3\x5f\xca\x80\x0c\x39\x75\x37\x0c\xa9\x61\xf5\x1d\x14\x34\x67\xc0\x9e\x1f\x82\x20\x44\x83\x49\x6d\x44\xc3\x80\xc1\x72\x61\x3e\x90\x57\x7b\x25\x96\x6d\x86\x8c\x56\xf4\x41\x65\x39\x71\x20\x6c\x3d\xf8\x62\xa8\x3d\x5a\x0f\x41\x59\x9b\x52\x87\x92\xca\x62\x20\x5c\x10\xeb\xfc\x86\xe8\x2d\x24\x6f\x92\x7e\x62\x40\x43\xc5\xa8\x1e\xdf\x1e\x32\x48\xae\xbd\xb2\xac\x3c\xca\x78\x8d\xb7\x02\x94\x36\x90\xc8\x7a\x93\x81\x83\x65\x03\x98\x6d\x68\x9c\x25\x88\xd1\x20\xa0\x42\x44\x32\x01\x38\xdb\xa0\xa5\x83\x81\x88\xa7\xf1\x22\x8b\x0b\x8b\x4b\x33\x59\x84\xd3\x1f\x7d\x22\x57\x4e\xba\xab\x95\x0c\xc5\x76\xaa\x95\x94\xb2\x6e\x4c\x5a\x49\xd2\xc9\x50\x89\xb6\x10\x4e\x56\x32\x65\x48\xfe\xd5\xf3\x62\x4e\x9d\x30\x12\xb8\xb0\xb7\x65\x8e\x97\x05\x20\xaa\xfb\xa1\xa6\xae\xb1\xac\x54\xd0\x81\xa2\x2f\x53\x47\x20\xf3\xf8\x7d\x83\x09\x92\x11\xd5\x42\x36\x04\x21\x4f\x0d\xf4\x32\xe8\xf0\xc1\x81\xa7\xaa\x5c\xc7\xaa\x38\x44\x08\x58\x75\x9e\x48\x85\x51\x95\x3e\xa4\x38\x04\x48\xb9\xca\x01\x50\xaa\x71\xad\xf3\xb9\x78\xc3\x65\xb0\x57\x53\x38\xfa\x7b\x9b\xe5\x4e\x50\x25\xe2\xc0\xc5\xa1\x67\x0a\xea\xf6\x0d\x29\xf1\x2a\x0d\x2d\x18\x72\x35\xae\x75\x86\xe3\x96\x1b\x49\x05\xc7\xf1\x54\xf6\xc7\xf5\x57\xbb\xd8\x2c\x1f\x5b\xfb\x71\xdb\x2e\x7f\xfa\xf8\xfb\xe6\xb0\xfe\xb4\xf9\x36\x3b\x5b\xca\xbc\x63\x08\xa9\x5f\xca\xc8\x97\xfb\x1f\x3b\x65\xc9\x68\xff\xf9\x87\x66\xb9\x0c\xab\x78\xb1\x08\x9e\xd5\x4c\x0c\x91\xfe\x4a\x4d\x9d\x8d\xde\x3f\x5b\xf3\xf5\x87\x93\x73\x49\x51\x5d\xad\xce\xbb\xec\x4f\xc8\xf7\xde\x65\x72\x10\x47\xce\xa5\x0f\x10\xe2\xc4\x42\x31\x34\xc4\x91\x0b\xe7\xa7\x1b\xca\x7f\xa6\xa1\x0c\x09\xfb\x86\x52\xb9\x55\x30\xdc\xee\x4d\xa5\x87\xa1\x21\xb5\x79\x27\xf7\x00\x5b\xa1\x54\x8f\x1b\xa2\xd4\x15\xb8\x6e\x88\xb0\x38\x31\x43\x43\x12\x80\xe9\x99\x86\xd8\x85\x6e\x03\xe7\x6f\x37\xa4\xbe\x7e\xfa\x57\x34\x34\x92\x11\x53\x39\x64\x3c\xc4\x04\x5c\x7e\x28\x1d\xc9\x28\xe4\x67\x1a\x12\xf4\x65\x3f\xea\x4f\x36\xe4\x5c\xc6\xb6\x3e\x33\x4f\xe2\x45\x17\xcc\xa2\xfa\x07\x04\xc1\x9a\xd4\x3a\x03\xf6\xc1\x4f\x9f\xfa\xec\x09\x24\x9c\x7f\xb3\x7d\xea\x5d\x69\xa3\x76\xbd\xf9\x2e\x5f\xff\xb7\x6b\xf1\xe7\x53\xe6\xb8\xa3\x93\xf9\xea\xef\xc3\x5c\xda\x8c\x52\xb8\xc2\xec\xca\xe1\x97\x42\xd1\x63\xca\x47\x20\xa9\x34\x62\x24\x5f\x09\x47\xc8\xf9\x98\x1a\x55\x9b\x72\x8e\x2e\x7a\xd1\xa6\x62\x1a\x1a\xa6\x18\xcb\xd6\x4b\x9f\xea\xec\x60\xdf\x30\x0b\x02\xc5\x63\x6a\x5c\xef\x39\x27\x4c\x58\x97\x2f\xa3\xde\xb9\x4b\xef\x38\xe8\xd4\xdc\x58\x06\x5f\xe4\x16\xdf\x09\xa7\x0d\x06\x4d\xea\xec\x4a\x25\xb2\xd4\x60\x29\xab\xa0\xbd\x29\x8f\x4e\x7e\x10\xd5\xad\x60\x7a\x2f\x82\x20\x46\x9d\xed\x80\x3f\x53\x59\xea\x07\xbf\xcb\x99\xb3\xfe\xae\x85\x7c\x5c\x92\x82\xf4\x65\x46\x60\x1e\x8a\xe1\xb8\x84\x23\x0a\x27\x2a\x9c\x58\x4a\x0d\x70\x92\xa2\x89\x9b\x2e\x48\xb3\x1a\x94\xe1\x1f\x2a\x95\x32\x97\x8d\xde\x72\x73\xa7\x62\xc9\x90\xb8\xea\x08\x31\x68\xf5\x22\xd5\x95\x3c\xab\x77\xbe\x16\xdc\x70\x85\xe7\xdc\x3f\xec\x5a\xfe\x7b\x7c\x7f\xb0\xa5\xde\x1f\xf0\xfd\xac\xa7\xa7\x75\x81\x89\x0c\x79\x02\xde\xb0\xc6\xcb\x29\x01\xa7\x07\x8d\x8f\xc2\x26\x40\x62\x8b\x4e\x00\x51\x43\xb4\xa0\x2e\x43\xe4\x77\xea\xfc\x11\xa9\xe6\x38\x41\x4a\x3f\xab\x63\xc2\xa6\x7b\xf6\x9d\x0f\x6d\xfe\x36\x61\x42\x4e\xa2\xe0\x60\x28\x29\xcb\x37\xea\xd9\xb9\x68\x03\x04\xb2\x48\x06\x32\x59\x81\x58\xdc\x2b\x55\x7b\x10\x43\x20\x75\xf1\xe2\xca\xa3\xf7\xd3\xd4\x45\x55\x8e\xaa\x7b\x12\x92\x05\x1f\x9f\x77\x38\x0b\x4d\x0c\x69\x7c\x17\x37\xe4\xb4\x25\x41\xc3\x09\x84\xd4\xb1\xcb\x9f\x05\x42\xe3\x0c\x03\x69\x50\x4d\xea\x27\x89\x58\xaf\xc1\x49\xd4\x78\x44\x9d\x61\x0d\x11\xd5\x0b\x4e\xde\x0a\x6a\x18\x2e\x1b\x4b\xd9\xb2\x7a\x6e\x8d\x45\x54\x7f\x34\x26\xa3\xe4\xb6\xa4\xd6\x56\x5d\xf2\x14\xba\xf7\x49\x79\x5c\xb2\x94\x1d\x60\xac\x8a\x59\xc5\x6a\x48\x11\x41\x0e\x4a\xcf\xe1\x15\x73\x02\x09\x15\xb1\x00\x53\x75\x56\xe9\x39\xa1\x53\xc8\xaa\x27\x46\xdc\x68\x18\xa0\xe2\xcd\x10\xf9\x3d\x21\x76\x31\x5f\xaa\x23\x90\xd1\x3f\x9d\xf3\x1f\x80\x45\xfd\xc3\xf0\x0e\x75\xc9\xc7\x9a\x4b\xb4\xac\x8f\xae\x00\x83\xe4\x92\xfe\x9c\xd5\xb7\x7c\x40\xc7\xef\x49\xdd\x90\xa0\xbd\x9c\xc7\x53\xb7\x5c\x88\x7c\x75\xb5\x25\x12\xd0\xa0\x8f\xc0\x79\x83\x0e\x82\x3a\xa0\x1e\x8d\x46\x8a\x4a\x92\x6c\x58\x1d\xf8\x6c\xca\xa3\x9b\x27\x41\x63\x80\xde\xd4\x49\x09\x2b\x94\x45\x4e\xe3\xda\xc4\x3a\xa2\x60\x09\xc2\xf3\x1b\x4d\x1d\x3b\xd5\x2f\xac\x11\x4b\x60\x8a\xc3\x8e\x9c\xd3\x50\x29\xa2\x71\x53\x01\xf0\xc8\xbd\x92\x9c\x87\x7b\x0e\xa8\x4a\x9b\xf2\xae\xfa\xe9\xf8\x44\xad\xde\x05\xfa\x73\xb5\x88\x53\x59\x9b\x9f\xaa\x75\x75\x01\xa2\xd4\xad\x88\x44\xed\x61\x9f\xd0\x36\xb8\xf2\xea\x2a\x33\x3e\x7d\xe8\xed\x74\x41\xba\xec\x75\x7e\x5c\x1f\x96\xbb\xcd\xfa\xe3\xfa\x30\x9f\xa1\xbb\xde\x02\xf5\xf1\x19\x00\x18\x62\xdf\x7b\x37\xee\xca\xab\x55\x08\xd5\x20\x85\xef\x0f\xc0\xe5\x12\x22\x74\x89\xa2\xb1\xca\xbb\xd4\x2d\xbc\x54\x3c\xb0\x7f\x1d\x86\x0f\xd5\xd9\x8d\xe2\xd1\x7e\x35\x27\x5f\x3c\xf1\x72\x4c\x58\x27\xf4\xf0\x43\xf8\x90\x3f\xba\x0b\x3c\x89\x47\x52\x0e\x2d\xde\x88\x87\xfb\x7f\x7a\xe0\xd4\x7d\xa6\xce\x21\xbf\xec\x7e\xc8\xff\xde\xdd\xe7\x72\x11\xe8\xba\xfb\x3e\xff\xfb\x76\x2f\x4e\xc3\xe2\xeb\xee\x8f\xf9\xdf\xa5\x7b\x8d\xac\xae\x49\x89\x02\xd4\x9d\x4a\x72\xa1\x12\x5d\x60\x2b\x12\x51\x3b\x2f\xba\x1c\xa7\x4a\x43\xfb\xa8\x3e\xa8\x2e\xce\x65\xce\x46\x8d\x70\xbb\x85\x43\x04\x42\x25\xde\x95\x36\x38\x94\x5f\x66\xa6\xe9\xdb\x92\xf3\xfe\x46\xc4\x0e\x12\xfd\xa5\x60\x29\x9d\xcc\x50\x6c\x88\x26\x77\x0c\x38\x47\x48\xa9\xc2\x14\x80\x52\xc5\x31\x8c\x53\x81\x40\xfd\xec\xf2\xcb\x3d\x27\x86\x8c\xc7\xd4\xb8\xda\x0d\x2b\xac\x8a\x32\xc9\xd0\xb0\x38\x54\xbb\x37\x74\x93\x22\xa4\x30\xb4\x2c\x2e\x8d\x53\xe3\x7a\xb7\xf4\x23\x11\x8e\xf8\x55\x65\x31\x1f\x53\xea\x41\xd0\xb1\x61\xe6\x71\x6a\x54\xed\x86\x5e\x38\x97\x63\x9b\x18\x18\x10\x2b\x0e\xf9\x2c\xf5\x8c\xd0\x46\xd5\xa6\x02\xb4\xab\xc1\x94\xdf\x87\x31\x3a\x75\x90\x0b\x1b\x4f\x29\xcc\x10\xa9\xc2\x50\x9c\x67\x11\x77\x96\x1a\xd5\xbb\x85\x03\x0e\x95\xda\xbd\x9c\xd4\x3f\x1c\xa5\x42\x50\xcb\xdc\x0d\x80\x52\x84\x78\x1a\xce\xb8\xda\x2d\x52\xf3\x08\xe1\xa8\x74\xe7\xe1\xa8\x1a\x2a\x37\xb5\x8f\xed\x72\xd4\x85\x70\x48\x8d\x6a\xdd\x20\xb3\x67\xc7\x12\x19\xc2\x51\x51\x94\xa5\xac\x80\x9d\xd6\x26\xc7\xf2\x8c\x6a\x34\xea\xf4\x15\x95\xfd\xce\x8e\x5a\xe9\x18\xe5\x74\xb1\xeb\x45\xaa\x8b\x72\xba\x68\x75\x9c\x18\x1a\x39\x73\xda\x6e\xf9\x77\x13\x26\x37\xde\xc8\x07\xed\x8d\xa5\x8c\xbb\xf3\x3c\x2b\x46\x57\xb4\x17\x4b\x4c\x35\xa4\x7c\x86\x18\x2b\x96\x50\x8e\x5e\x8e\xeb\x1d\xc7\x9f\x5c\xc2\x24\xe7\xce\xac\xfa\x64\xde\x90\x86\xc3\x79\xe3\x11\xbc\x98\xcc\xe0\xe5\xc1\x7a\xc8\xf2\x9e\x9c\x3f\x6e\xec\x3f\xb8\x9f\x03\x64\x0d\x29\x32\x0d\xa1\xd6\xb8\xfa\x6f\x67\xd6\x71\x6c\xe1\x02\x97\x28\xfb\x5b\xb7\xa1\x43\xf1\xb4\xd5\x91\xcb\x4f\xd9\xc7\x0d\x2a\xa0\x6e\x3b\x97\x20\x74\xbb\xb9\xe5\xe5\x0a\xbe\x1a\xfb\xf2\x67\xff\xf9\xc3\xdb\xff\x0f\x00\x00\xff\xff\x39\xa4\xd6\x32\xd4\x4e\x00\x00") - -func bindataTkgWebDistTkgkickstartuiAssetsImagesWelcomeintroSvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiAssetsImagesWelcomeintroSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/welcome-intro.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiAssetsImagesWelcomeintroSvg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiAssetsImagesWelcomeintroSvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/assets/images/welcome-intro.svg", - size: 20180, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiAwsec21241b36c8e9e94dcf23eSvg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x93\x41\x6f\xdb\x30\x0c\x85\xcf\xcd\xaf\x10\xb4\xab\x47\x53\x94\x48\x49\x85\x9d\x62\xc3\xd0\x53\x7a\x19\xb6\xc3\x8e\x41\xe3\x39\xc6\x52\x3b\x88\x8d\xc4\x3f\x7f\x70\x63\xd8\x75\xd7\x01\xb9\xe9\xd9\xef\xf1\x83\x44\x32\x7b\xe8\x5f\x0e\xea\x5c\x9c\xda\xaa\xa9\x73\x6d\x00\xb5\x2a\xea\xe7\x66\x57\xd5\x65\xae\x7f\xfe\x78\xfc\x1c\xb4\x6a\xbb\x6d\xbd\xdb\x1e\x9a\xba\xc8\x75\xdd\xe8\x87\xf5\x2a\x6b\xcf\xa5\xba\x54\xbb\x6e\x9f\x6b\x62\x39\xf6\x5a\xed\x8b\xaa\xdc\x77\xb9\xb6\x06\x07\x79\xae\x8a\xcb\xd7\xa6\xcf\x35\x2a\x54\xc4\xa2\xac\x41\xfd\x16\x64\xb4\xea\x5f\x0e\x75\x9b\xeb\x7d\xd7\x1d\xef\xd3\xf4\x72\xb9\xc0\xc5\x42\x73\x2a\x53\x42\xc4\xb4\x3d\x97\xa3\xe5\xbe\x3f\x54\xf5\x9f\x8f\x8c\x26\xc6\x98\xbe\xfe\xd5\xea\x78\x2a\xda\xe2\x74\x2e\xbe\xb4\xc7\xe2\xb9\xfb\xbe\xed\xaa\x26\xd7\xfd\x53\xb5\xfb\xf5\x54\xed\xf4\x7a\x75\x97\x95\xeb\xd5\xdd\x5d\x76\xdc\x76\x7b\xb5\xcb\xf5\x93\x23\xf0\xec\x12\x72\x0e\x5c\x64\xb5\x31\x04\xc1\x4a\x42\x6c\xc0\x92\x99\x34\x7b\x60\x61\xb5\x19\xed\xe2\xc0\xa1\x9b\xe4\x98\xd6\xea\x77\x75\x38\xe4\xfa\xd3\xa3\x04\xb6\xa2\xd7\x59\x3a\x70\x96\xc0\x80\x80\x81\x12\x62\x86\x68\xcd\x5c\x42\x04\xd8\xc6\x49\x3b\x02\x31\xa4\x36\xa3\x9d\x2d\x10\xfa\x49\x8e\xe9\x9b\x80\x86\x3c\x44\x91\x84\xc4\x83\x04\x33\xd7\x08\x0c\x84\x3c\x6b\x0b\xd1\xc9\x70\xe3\xab\xdf\x19\x70\x42\xb3\x1e\xf3\x37\x31\x89\x25\x21\xc7\x80\x3e\xce\x05\x2c\x46\xc0\xf8\x86\x80\x6a\x33\x18\xc5\x01\x1a\x7f\x3d\x8f\xa1\xdb\x2e\x86\x04\xce\xb9\xc4\x10\x78\xb1\x8b\xb2\xff\x22\x47\x2f\x45\x01\x6b\xfd\xfc\xe1\x1a\x9e\x78\xf1\x1b\x23\xf1\xc7\x3c\x41\xb0\xc4\x89\xb5\x10\x68\xf9\x6a\xb4\x78\x54\xc3\x4e\x6d\x46\x33\x79\x06\xf2\x32\xe9\xd7\xf0\x4d\x34\xf2\x80\x46\x12\x46\x70\xde\x2f\xc6\x02\xc3\x62\x6a\x5c\x08\x6a\x33\xba\x89\x03\x88\x71\x93\xbe\xa6\x6f\xe2\xbd\x1b\x74\x4c\xc4\x42\x0c\x76\x38\x0d\x4d\x31\x43\x87\xde\x2c\x07\xdb\xf7\xcb\xf1\x7f\x4a\x96\x96\xeb\x55\x36\xec\xf2\xfa\x6f\x00\x00\x00\xff\xff\xdf\x91\x36\x0e\x6b\x04\x00\x00") - -func bindataTkgWebDistTkgkickstartuiAwsec21241b36c8e9e94dcf23eSvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiAwsec21241b36c8e9e94dcf23eSvg, - "tkg/web/dist/tkg-kickstart-ui/aws-ec2.1241b36c8e9e94dcf23e.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiAwsec21241b36c8e9e94dcf23eSvg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiAwsec21241b36c8e9e94dcf23eSvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/aws-ec2.1241b36c8e9e94dcf23e.svg", - size: 1131, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiClruidarkMinCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\xbd\x69\x93\x9b\xcc\xb2\xa8\xfb\x57\xde\xbb\x6e\xec\x88\xb3\x0f\xf6\xcb\x3c\xd9\x71\x76\x1c\x90\x98\x24\x40\x68\x62\xda\xb1\x3e\x30\x83\x18\xc5\x2c\x1c\xfe\xef\x37\xa4\x6e\x77\xb7\xda\x6a\x5b\xed\x5e\xeb\xee\xfe\x60\xab\xaa\x32\xab\xb2\x32\x93\x7a\x4a\x0c\xe2\xff\x7a\xb1\x53\x37\x41\xfb\xd7\x3f\xf6\x3b\xfe\x33\xf5\x8f\xaf\x5f\xea\xb2\x6c\xbf\x7d\xfe\xec\xf9\xcd\xe7\x28\x2b\x5d\x27\xfb\xec\x3a\x4d\xf0\x05\x81\xbe\xc7\x6d\x9e\x7d\x0b\xcb\xa2\xfd\x1c\x3a\x79\x92\x9d\xbe\x34\x4e\xd1\x7c\x6e\x82\x3a\x09\xbf\x66\x49\x11\x7c\x8e\x83\x24\x8a\xdb\x2f\xf0\xdf\x30\xfe\xf5\x73\xde\x7c\x6e\x83\xb1\xfd\xdc\x24\x53\xf0\xd9\xf1\x0f\x5d\xd3\x7e\x81\x21\xe8\x3f\xbe\x7e\x1e\x02\x37\x4d\xda\xdb\xad\xdf\xdd\xd2\x3f\x7d\xcb\x9d\x3a\x4a\x8a\x2f\xd0\x77\xa7\x6e\x13\x2f\x0b\x3e\x39\x4d\xe2\x07\x9f\xfc\xa0\x75\x92\xac\xf9\x14\x26\x91\xe7\x54\x6d\x52\x16\xe7\x8f\x5d\x1d\x7c\x0a\xcb\xb2\x0d\xea\x4f\x71\xe0\xf8\x41\xfd\x29\x77\x92\xe2\x53\x1e\x14\xdd\xa7\xc2\xe9\x3f\x35\x81\x77\x11\x6d\xba\x3c\x77\xea\xd3\x37\x3f\x69\xaa\xcc\x39\x7d\x71\xb3\xd2\x4b\xbf\x3b\x9d\x9f\x94\x9f\x3c\xa7\xe8\x9d\xe6\x53\x55\x97\x51\x1d\x34\xcd\xa7\x3e\xf1\x83\xf2\x49\x32\x29\x2e\xd3\x7b\xa1\xf0\xa5\x28\xdb\xff\xf5\xdf\x5e\x59\xb4\x75\x99\x35\xff\xfc\xcf\x27\xd1\xa2\x2c\x82\xaf\x8f\x7e\x80\xbe\xff\xe8\xef\x5b\x1f\x9c\x27\xe2\x64\x9f\x9d\x2c\x89\x8a\x2f\x67\x8f\x9e\xbb\xfc\xde\x06\x79\x95\x39\x6d\xf0\xe9\xbf\xe3\xc4\xf7\x83\xe2\x9f\x57\x1d\x7d\x77\xbe\xb9\x8e\x97\x46\x75\xd9\x15\xfe\x67\xaf\xcc\xca\xfa\x4b\x5b\x3b\x45\x53\x39\x75\x50\xb4\xd7\x9e\xf4\x03\xaf\xac\x9d\xf3\x4c\x3f\x37\x69\x52\x7d\x29\xdd\x43\xe0\xb5\xcd\x77\xe7\x8b\xe3\xb5\x49\x1f\x7c\x72\xbe\xc4\x65\x1f\xd4\xdf\xca\xae\xbd\x4c\x67\x48\xfc\x36\x3e\xfb\xd8\x75\xeb\xff\x6e\x93\x36\x0b\xfe\xf9\xcd\x2d\x6b\x3f\xa8\x3f\xbb\x65\xdb\x96\xf9\xc3\x64\x5e\x75\xfe\xa5\x2b\xfc\xa0\x3e\x77\xf0\xd6\xf0\xcf\x12\x7f\xf9\x65\xdb\x06\xfe\xdb\x5d\x3c\x0a\x7c\x77\x3f\x35\x6d\x5d\x16\xd1\x43\x76\x0d\x0f\xee\x4b\x8a\x38\xa8\x93\xf6\x76\xa3\x5b\x66\x7e\x50\x7f\xf7\xc3\xe2\xa1\xba\x69\x4f\x59\xf0\x25\x69\x9d\x2c\xf1\xbe\xc7\xf0\x63\x65\x32\x05\x5f\x90\x20\xff\xfa\x98\x4f\x7f\x13\x64\x90\xff\x05\x7d\xcf\x9d\x3a\xfd\xd9\xb3\xff\x6f\x18\x42\x5f\x1f\x3f\x42\x10\xf4\xbd\xc9\x9d\x2c\x7b\xd1\x11\x05\xfd\xc7\xf7\xa6\x73\x3f\x35\x5d\xf5\xa2\x96\xc4\xff\xe3\x2a\xf9\xa1\xaf\x55\xd9\x24\x97\x69\xd6\x41\xe6\x9c\x3d\xff\xf5\xad\xe8\x37\x9d\xfb\xed\xd1\xd5\x9f\xff\x46\xf0\x20\xff\x7e\xee\xbb\x2d\xab\x2f\x9f\xff\x3e\x97\x92\x3c\xfa\x11\x91\x87\xf9\x5d\x92\xa2\xe9\xa3\x4b\xfa\x5d\x8e\xd4\xff\xfc\x76\x8e\x69\x98\x95\xc3\x97\x87\x0c\xfa\xee\x95\x7e\xf0\x29\x75\xfd\x4f\x55\x1d\x7c\x6a\x9c\xbc\xba\x3a\x64\xf3\xb2\x28\x9b\xca\xf1\x82\xaf\xcf\x53\x80\x83\xfc\xfb\xc3\x71\xf4\xe3\xc0\x83\x83\xfc\x2f\x0c\xaa\xc6\xef\x71\xfd\xcd\x2d\xc7\xb3\x58\x52\x44\x5f\xce\xf9\x1e\x14\xed\x67\xb7\x1c\x9f\x72\xfc\xeb\xd3\xf8\x7d\xd2\x24\x6e\x16\x7c\x77\xbb\xb6\x2d\x8b\x4f\x49\x51\x75\xed\xa7\xb2\x6a\xcf\x4e\xae\x3e\x35\x41\x16\x78\xed\xa7\x73\x2a\x38\x75\xe0\x5c\x8c\xfa\x11\xe2\xaf\x4f\xc7\xfb\x53\xf3\xeb\xf5\xe4\xfb\x8f\x8e\xae\xb2\x80\x84\xa0\xab\xe1\xbe\xbd\x65\xcc\xc3\xe8\xdf\x2e\x89\x78\x39\x82\xc2\xb2\x7e\xc8\xef\x1f\x12\xe7\xc5\xed\xaf\xff\x6e\x4f\x55\xf0\x7f\x1e\x6a\xfe\xf9\xe9\xa1\x54\x07\x4d\xd0\xfe\x28\x34\x9d\x9b\x27\xed\x3f\xbf\xfd\x48\x7d\xa7\xaa\x02\xa7\x76\x0a\x2f\xf8\xf2\xa0\xf5\xd8\xdd\x97\x2f\x9f\xf3\x72\xfa\x1c\x96\x5e\xd7\x7c\x4e\x8a\x22\xa8\x3f\x5d\xf5\xfd\x66\xfb\xc3\x68\x6f\x36\x3f\x8e\xff\x73\xfb\xcf\x79\xf2\xb5\x72\x7c\xff\x1c\xb5\x1f\x2e\x7a\xa1\x53\x27\x45\xf4\xca\xa0\x9b\x8d\x8f\xd6\xdc\x6c\xfb\x61\xca\x75\xe3\x8f\xd5\xe5\x0b\x5c\x8d\x8f\x47\xf7\x5f\xec\x65\x88\x5d\x30\xb6\xdf\xc3\x24\xc8\xfc\x26\x68\x1f\xcd\xbd\x48\x35\x65\x96\xf8\x7f\x35\x49\xd6\x07\xf5\x53\x26\xfc\x85\x54\xe3\xd3\x0c\xfe\x46\xf1\x20\xff\xeb\x6f\x02\xb9\xfc\x47\x9e\x0f\x8d\x2c\x88\x82\xc2\x7f\x99\x9c\x4f\x4b\xd7\xf8\x78\x10\xff\x48\xae\x1f\x2b\x6a\xeb\xb8\x59\xf0\x35\x77\xc6\xc7\x95\xef\x02\xa3\x27\x27\x7d\x1d\xe2\xa4\x0d\x3e\x5f\x8e\x8d\x2f\x45\x59\xe7\x4e\xf6\x9c\x8d\x4f\x69\xe5\x74\x6d\xf9\xfd\x61\xfe\x5e\x1c\x78\xa9\x5b\x8e\x4f\x79\xe2\xf8\x49\xf9\xcf\x37\x2c\x7a\x8e\xc5\x83\x70\xd1\xe5\x6e\x50\x9f\xe3\xf8\x98\x48\x97\x20\x7e\x6e\xaa\xa4\xf8\xfc\x98\x90\x6f\x08\x96\x5d\x7b\x2d\xf8\xed\xf1\x28\x79\x61\x5a\x13\x38\xb5\x17\xdf\xcc\xd2\xf3\x94\x2e\x41\xf8\xfa\x03\x03\x65\x18\x36\x41\xfb\xe5\x33\x52\x8d\xd7\xea\xcf\x63\x3e\x54\x7c\xf6\xce\x3d\x64\xd7\xf6\xbd\x25\xfb\xbc\xda\xdf\xb2\xe2\x72\xe0\x3d\xeb\x84\x49\x16\x7c\xee\xaa\xac\x74\xfc\x1f\x93\x7a\xf3\x00\xfb\xfa\x72\xe1\xf8\xfe\xb7\x97\xd5\x0f\xab\xea\xe7\x1f\xab\xea\x5b\xac\xfd\x7f\x92\xbc\x2a\xeb\xd6\x29\xae\xb4\xda\xb2\x7a\xad\xd0\x96\xd5\x6d\xd9\x3c\xf1\xfd\xec\xa7\xfe\x1f\x6a\x6f\x6b\x3c\x2c\xee\x3f\x59\x74\xa9\x7d\xc3\x9e\xf3\x0a\x75\x5b\xed\x45\xd3\x2f\x74\x6f\x4d\xe8\xb1\xfe\xb5\x96\x97\x05\x4e\x1d\x26\xe3\x97\x2f\x4e\xd8\x06\xf5\xb7\xc7\xe5\xfd\xcb\x3f\xfe\xf1\xea\x98\xb9\x08\x9e\xcd\x8e\x1f\x14\x1f\x5b\x1f\x36\x44\xd7\xfb\xa9\xd7\x63\xfc\x10\x7d\xb9\x85\xba\xb9\xaf\xfa\xb5\xe2\x2b\x95\xd7\xc2\x61\x16\x8c\x9f\xeb\x72\xf8\x76\xf9\xe0\x27\xf5\xc3\x96\xef\x4b\x5d\x0e\x37\x45\xbd\x32\xeb\xf2\xe2\xb5\xf4\x43\xed\x5b\x7d\x7f\xae\x83\x3e\xa8\x9b\xe0\xc6\x18\x3f\x9a\x7e\x31\xd6\x5b\xda\xd7\xad\x37\x3b\x18\x6a\xa7\xfa\xf6\xf4\xe9\xcb\xf9\x9f\x9b\x72\x45\xf9\x4a\xf2\xa1\xe2\xcd\x3e\xaf\x4d\x7a\xea\xfb\x97\xb6\x84\xc9\x79\x4b\x94\x05\xe3\x17\xf8\x2f\xf8\xaf\xf3\x92\x73\x53\x2c\x3a\x3b\x05\xfa\xf6\xf4\xf9\x0b\xf4\xb6\x18\xfc\x42\x0c\xbe\x29\xd6\xc4\x75\x52\xa4\x3f\xfa\x7b\x28\xbd\xd1\xe3\xa3\x28\x7c\x25\xfa\x53\xaf\xe7\x6f\x1b\x49\x78\xfa\xfc\x63\x3f\xd3\xb4\x4e\xdd\x7e\x7b\x55\xfb\xe5\xa1\x8b\x73\xd3\xef\xf4\xcf\x24\xba\xa9\x1d\x14\xfe\xef\x74\xbd\xa0\x38\x1f\x7b\xaf\xd5\x1f\xaa\x7f\xa7\xec\x06\xed\x10\x04\xc5\x4f\xda\x17\x8a\xfd\x68\xfd\x5d\x27\xce\x65\x13\xfc\x46\x1f\x0f\x8d\xb7\xd7\x9b\xa4\x0d\xf2\xe6\xd1\x79\x2f\x6a\x7e\xe1\xb8\x97\x7a\x67\xa7\xfd\xa4\x75\xc3\x61\x2f\x75\x1e\x9d\xf5\x52\xed\xb6\xa3\x5e\x2a\x3d\x81\xe1\xa5\xda\xaf\xa9\xf0\x63\x66\x75\xd0\x7a\xf1\x95\xde\x63\xdd\x6d\xb5\xeb\x7c\xba\xaa\xfb\xad\x53\x5e\xe6\xd2\x0d\xcd\x37\x1d\xf3\x2a\x8f\xae\x55\x7f\xe5\x9c\xd7\x39\x74\xad\xf9\xcb\x0c\xba\xee\xe0\x31\x7f\x6e\xe9\xff\x2a\x7b\x9e\x9d\xf5\xd2\xcb\x4f\xfa\xbf\xf2\x73\x13\x64\xe1\xe7\xf3\xe2\xf3\xed\xb9\xfc\xe5\xd6\x62\xf4\x42\xfc\x65\x4c\x2e\xf2\xbf\x0b\xc8\x45\xeb\x39\x1a\xcf\x3a\x6f\x86\xe2\xa2\x71\x15\x87\x8b\xd2\xaf\x82\x70\x51\x79\x95\xa0\x17\xa5\x5f\xe7\xe7\xe3\x8c\x5e\x3a\xee\xa2\xf5\xb3\xd7\xfe\x6f\x1e\xf8\x89\xf3\xd7\xff\xca\x93\xe2\x71\xdb\x8b\x93\x44\x35\xfe\xe7\xb7\x17\x6b\x66\xfe\x1e\x74\x36\xf9\xfb\xe9\xf9\x30\xc2\x9f\x02\xf4\x69\xc4\x0f\x30\xb4\xc9\xef\xc6\x68\x93\xbf\x8b\xa4\x8f\x3d\xff\x09\x4c\x9b\xfc\x5e\x9e\x36\xf9\xbd\x48\xfd\x21\x79\x07\x55\xf3\x77\x81\x35\xff\x53\xb6\xe6\x1f\xc6\x6b\x93\x7f\x88\xb0\xe7\xfc\xf9\x08\x64\x9b\xfc\x5f\xc3\xd9\x26\xff\x30\x6a\xf3\x3f\xa6\xed\xa3\x0f\xdf\x0b\xdc\x67\xdf\xbd\x8f\xb9\x67\x9f\xfd\x31\x76\xf3\x0f\x90\x37\xff\x10\x7c\xaf\xbc\xf4\x3e\xfe\xbe\xf6\xd4\x7b\x10\xfc\x22\xc3\xfe\x98\xc2\xcf\xd9\xf5\xc7\x20\x7e\xed\xf7\xfb\x59\x7c\x1e\xfc\x9d\x38\xce\xff\x90\xc8\x57\x21\xba\x17\xca\xaf\x83\x73\x1f\x97\x7f\x4e\xe2\xbb\xd1\xfc\xda\x95\x6f\xd0\xf9\x06\x9e\x49\x82\xba\xc6\x73\xee\xbf\x07\xcf\xb9\xff\x7e\x3c\x3f\x8c\xf0\xa7\x78\x7e\x1a\xf1\x03\x78\xce\xfd\xbb\xf1\x9c\xfb\xef\xc2\xf3\x63\xcf\x7f\x82\xe7\xdc\xbf\x17\xcf\xb9\x7f\x2f\x9e\x7f\x48\xfe\x1e\xcf\xb9\xff\x1e\x3c\x3f\x4b\xbf\x13\xcf\x67\xc5\x0f\xe2\x39\xf7\x3f\x84\xe7\x73\xfe\x7c\x04\xcf\xb9\xff\xaf\xc1\x73\xee\x7f\x14\xcf\x4f\xbe\x7c\x3f\x9e\x1f\x7d\xf8\x5e\x3c\x3f\xfb\xee\x7d\x78\x3e\xfb\xec\x4f\xf1\x7c\x99\xe5\x1f\xe2\xf9\x95\x87\xde\x8b\xe7\x2b\x2f\xbd\x0f\xcf\xaf\x3d\xf5\x1e\x3c\xbf\xc8\xb0\x3f\xc6\xf3\x73\x76\xfd\x29\x9e\x7f\xf2\xfb\xfd\x78\x3e\x0f\xfe\x3e\x3c\xbf\x0a\xd4\xfd\x78\xbe\x0a\xd1\xbd\x78\x7e\x1d\x9c\xfb\xf0\xfc\x73\x12\xdf\x8b\xe7\x9f\x5c\x79\x3f\x9e\x69\x1a\xb9\xc6\x73\x16\xbd\x07\xcf\x59\xf4\x7e\x3c\x3f\x8c\xf0\xa7\x78\x7e\x1a\xf1\x03\x78\xce\xa2\xbb\xf1\x9c\x45\xef\xc2\xf3\x63\xcf\x7f\x82\xe7\x2c\xba\x17\xcf\x59\x74\x2f\x9e\x7f\x48\xfe\x1e\xcf\x59\xf4\x1e\x3c\x3f\x4b\xbf\x13\xcf\x67\xc5\x0f\xe2\x39\x8b\x3e\x84\xe7\x73\xfe\x7c\x04\xcf\x59\xf4\xaf\xc1\x73\x16\x7d\x14\xcf\x4f\xbe\x7c\x3f\x9e\x1f\x7d\xf8\x5e\x3c\x3f\xfb\xee\x7d\x78\x3e\xfb\xec\x4f\xf1\x7c\x99\xe5\x1f\xe2\xf9\x95\x87\xde\x8b\xe7\x2b\x2f\xbd\x0f\xcf\xaf\x3d\xf5\x1e\x3c\xbf\xc8\xb0\x3f\xc6\xf3\x73\x76\xfd\x29\x9e\x7f\xf2\xfb\xfd\x78\x3e\x0f\xfe\x3e\x3c\xbf\x0a\xd4\xfd\x78\xbe\x0a\xd1\xbd\x78\x7e\x1d\x9c\xfb\xf0\xfc\x73\x12\xdf\x8b\xe7\x9f\x5c\x79\x3f\x9e\x61\x04\x82\xae\xf9\x3c\x66\xef\xe1\xf3\x98\xbd\x9f\xcf\x0f\x23\xfc\x29\x9f\x9f\x46\xfc\x00\x9f\xc7\xec\x6e\x3e\x8f\xd9\xbb\xf8\xfc\xd8\xf3\x9f\xf0\x79\xcc\xee\xe5\xf3\x98\xdd\xcb\xe7\x1f\x92\xbf\xe7\xf3\x98\xbd\x87\xcf\xcf\xd2\xef\xe4\xf3\x59\xf1\x83\x7c\x1e\xb3\x0f\xf1\xf9\x9c\x3f\x1f\xe1\xf3\x98\xfd\x6b\xf8\x3c\x66\x1f\xe5\xf3\x93\x2f\xdf\xcf\xe7\x47\x1f\xbe\x97\xcf\xcf\xbe\x7b\x1f\x9f\xc7\xec\xcf\xf9\x7c\x99\xe5\x1f\xf2\xf9\x95\x87\xde\xcb\xe7\x2b\x2f\xbd\x8f\xcf\xaf\x3d\xf5\x1e\x3e\xbf\xc8\xb0\x3f\xe6\xf3\x73\x76\xfd\x29\x9f\x7f\xf2\xfb\xfd\x7c\x3e\x0f\xfe\x3e\x3e\xbf\x0a\xd4\xfd\x7c\xbe\x0a\xd1\xbd\x7c\x7e\x1d\x9c\xfb\xf8\xfc\x73\x12\xdf\xcb\xe7\x9f\x5c\xf9\x16\x9f\x5f\x2c\xb0\xcd\xe7\x30\xa9\x9b\xf6\xdb\xc3\x6d\x9f\x9f\xe1\xeb\xb6\xcc\x79\x6a\x7a\xd5\xd2\x15\x97\xea\xc0\x7f\x6c\x86\x5e\x34\x3f\x1e\x50\xcd\xe5\x9e\xb7\xdb\x8b\xc6\x2d\xe9\xc7\xdb\xf8\x7e\x3e\xe4\x6f\x09\x3f\xde\x8a\x77\x6b\x65\xb9\x36\xf4\xd9\x86\x57\xd1\xbe\x16\xbb\x1a\xfc\x45\xa0\xae\xa5\xae\x46\xbd\x4a\x83\x5b\x36\x66\x41\xf8\x2b\x00\xdd\x52\xf9\x25\x32\x6e\x29\xd4\x49\x14\xbf\x31\xc8\x1b\x56\xdd\x41\x83\x9b\x0e\xbf\x07\x46\x77\xde\xd6\xf0\x66\xca\x35\xf9\x5b\x29\xd7\xe4\x37\x52\xee\x9e\xe1\x9e\xae\x5d\xbe\x23\x19\x9b\xfc\x1d\xc9\xd8\xe4\xbf\x4c\xc6\x3b\x5d\x72\x4f\x9a\xbe\x36\xeb\x76\x9a\xbe\xb6\xe7\x3a\x4d\xdf\xe5\xb2\xf7\x26\xf0\xef\xae\xe8\xdf\x52\x78\x67\x02\xdf\x77\xb1\xfe\x66\x90\xee\x4a\xe0\x3b\xaf\xfc\xbd\x99\xc1\xb9\xff\x56\x06\xe7\xfe\x7d\x19\xfc\xd3\x70\x4f\xa7\xf7\xdf\x91\xc1\xb9\xff\x8e\x0c\xce\xfd\xf7\x66\xf0\x2d\x97\xdc\x93\xc1\xaf\xcd\xba\x9d\xc1\xaf\xed\xf9\x6d\x06\xbf\xed\xb2\xf7\x66\xf0\xef\x2e\x7a\xdd\x52\x78\x67\x06\xdf\x77\x3d\xeb\x66\x90\xfe\x34\x83\x6f\x9d\x1c\x7f\x33\x83\xb3\xe8\xad\x0c\xce\xa2\xfb\x32\xf8\xa7\xe1\x9e\xce\x80\xbd\x23\x83\xb3\xe8\x1d\x19\x9c\x45\xef\xcd\xe0\x5b\x2e\xb9\x27\x83\x5f\x9b\x75\x3b\x83\x5f\xdb\xf3\xdb\x0c\x7e\xdb\x65\xef\xcd\xe0\xdf\x9d\x17\xbe\xa5\xf0\xce\x0c\xbe\xef\x94\xef\xcd\x20\xfd\x69\x06\xdf\x3c\x7f\xf4\xf6\xce\x35\x7b\x73\xe7\x9a\xdd\x97\xc2\x3f\x8f\xf7\xf4\x2d\xf1\x3d\x9b\xda\xec\x3d\x9b\xda\xec\xbd\x39\x7c\xd3\x29\x77\xed\x77\xb3\xbb\xf6\xbb\xd9\x3b\x93\xf8\x17\x4e\x7b\xf7\x56\xf8\x37\x67\x4f\x6e\x29\xbc\x77\x2b\x7c\xd7\x89\x91\x9b\x61\xba\x2f\x8b\x1f\x35\x4b\xa7\x7d\xfa\x32\x70\x29\x7d\x39\x7f\xfc\xf9\x74\xd7\xa3\xdc\xc3\x2c\x1e\x04\x2f\x9f\xdf\x94\x2c\xca\x22\x78\x14\x3c\x7f\x7c\x21\xf7\xbb\x3d\xde\xb9\x83\x1f\xdb\xbb\xdf\x99\xf4\xb4\x45\xfb\xad\x49\x97\x1b\x74\xdf\x32\xe9\xb7\xd4\x3e\xf7\xf0\x03\xd8\xbf\xb3\xe9\x09\xba\xbf\xb5\xe9\x72\x57\xd2\x3b\x6c\xba\x5e\x87\xcf\x3d\xfc\x58\x82\x7f\x67\xd3\xd3\x32\xfa\x5b\x9b\x2e\x97\x62\xdf\x61\xd3\xab\xc3\xea\x12\xfd\xec\xce\x7c\xca\xee\xce\xa7\xec\x57\x46\x5d\x04\x93\xe2\xf1\xe1\xdd\x6f\x97\xff\x93\x2c\x69\x4f\x8f\x0f\x37\xbf\xee\xf3\xa1\xf6\x72\x9e\xa0\xba\x7a\x72\xfe\x56\x92\x3e\x3d\xf8\x89\x93\xf8\xdf\xf4\x73\x4e\x3c\x77\xe2\x97\x43\xf1\x56\x37\xbf\x49\xf6\xc7\x4e\xce\x5f\x1f\xdf\xb4\xe4\x86\x29\x24\x41\xde\x30\xa5\xc9\xdf\x6b\xca\xcb\x1c\x7f\xec\xe4\xfc\x3d\xe0\x3d\xa6\xd0\x34\x7c\xc3\x94\xdc\x7f\xaf\x29\x2f\x53\xfb\xb1\x93\xf3\x86\xee\x3d\xa6\xc0\x30\x4d\xdf\xb0\x25\x8b\xde\x6b\xcb\x55\x4a\xff\x88\x73\xf6\x2b\x63\x5e\x49\xfe\x6a\xbc\x8b\xe8\x63\xaa\x7e\xae\xea\xa4\x68\x5f\x3d\xde\x78\x3b\x11\x2f\x92\xdf\x7e\xab\xfc\xfa\xa1\xc8\x5b\xc3\xbd\x7a\x36\xf2\x9d\xe3\xfd\xee\xc9\xca\xb7\x47\xfc\xd8\x3c\xdf\xf3\x28\xe8\x8d\xce\x1e\x83\xf3\x50\xf3\xcb\x30\xd6\xe5\xf0\x24\x70\x26\xeb\xd7\xeb\xab\x57\x8f\xcf\x9a\x3f\xac\x5c\x5f\x3e\xff\x4d\xd4\x4f\xbf\x14\x71\x59\xf5\x1e\xab\x1e\xfa\x2a\xca\xcf\x51\xd7\xb6\x41\xdd\x7c\xbb\x52\x83\xae\x34\xa0\xd7\xc2\xff\x75\x29\x7b\x65\xf6\xe9\x75\xc3\x7f\x7b\x99\xd3\x34\xff\xfb\xff\x3c\xb6\x7f\xfe\xe7\xb7\xc7\x67\xc4\x9f\x3a\xfe\x51\x7e\xd9\xf3\x59\x72\x7c\xec\xec\xe1\xf3\xe5\xd4\xf4\x55\x05\x8c\x5c\x17\xe1\xeb\x22\x74\x55\xa4\xaf\x4a\xd4\x55\x89\xbc\x2a\x11\x57\x25\xfc\xaa\x84\x5d\x95\xd0\xab\xd2\x2b\x6b\x9e\x4b\x59\xf4\xf2\xf3\xab\x79\x64\xd1\xd5\x3c\xce\x45\xf8\xba\x08\x5d\x15\xe9\xab\x12\x75\x55\x22\xaf\x4a\xc4\x55\x09\xbf\x2a\x61\x57\x25\xf4\xaa\xf4\xca\x9a\xe7\x52\xee\xbf\xfc\xfc\x6a\x1e\xb9\x7f\x35\x8f\x73\x11\xbe\x2e\x42\x57\x45\xfa\xaa\x44\x5d\x95\xc8\xab\x12\x71\x55\xc2\xaf\x4a\xd8\x55\x09\xbd\x2a\xbd\xb2\xe6\xb9\xd4\xe4\x2f\x3f\xbf\x9a\x47\x93\x5f\xcd\xe3\x5c\x84\xaf\x8b\xd0\x55\x91\xbe\x2a\x51\x57\x25\xf2\xaa\x44\x5c\x95\xf0\xab\x12\x76\x55\x42\xaf\x4a\xaf\xac\xf9\x74\x7d\xa4\x9d\xab\xaf\x67\xf0\xd2\xfc\x97\xb6\xbf\x34\xfc\x85\xd5\x2f\x4c\x7e\x61\xef\x0b\x63\x5f\x58\xfa\xc2\xcc\x17\x36\xbe\x1c\xef\xdb\x8b\x9f\x9c\x38\xe3\xe9\xf1\x37\x1b\xfe\x86\xf0\xf3\xa2\x73\x7d\xe4\x3f\x2c\x44\x57\x47\xff\x8b\x85\xc8\x2b\x1f\x2e\xa9\x7f\x76\x9d\x26\x69\xbe\x40\x5f\x5f\x5c\x09\x7f\xf5\xe3\x16\xdf\xaf\x3c\xf1\x70\x21\x1e\xfa\x0b\xba\x5c\x88\xff\xfa\x20\x76\xf9\xf8\xac\x75\xf9\x5d\x86\x17\x56\x3f\xa9\x50\x7f\xa3\x4f\x7f\xff\xf1\x42\xe1\xaa\xfe\x59\x13\x79\xd6\x84\x89\xbf\x89\x1f\x7f\xe4\x4b\xd5\xeb\x86\x67\x5d\xf4\x59\x17\xc1\x5f\x2a\x20\xf8\x0b\x29\xec\x59\x0a\x45\xdf\x30\xee\xba\xe1\x59\x17\x7f\xd6\xc5\xe0\x37\xac\xbb\x6e\x78\xd6\x25\x9e\x75\x71\xe8\xa5\x02\xfe\xd2\xdf\xe4\x0b\xa9\xb7\x5c\x87\xbf\xe1\x3b\xea\x59\x97\x78\xcb\x77\xc4\x1b\xbe\xa3\x9f\x75\xc9\x2b\xdf\x91\x2f\x7d\x07\x43\x2f\x02\xfb\x96\xf3\xa8\x37\x9c\x07\xbf\xc8\x0a\xfa\x2d\xef\xd1\x6f\x78\x0f\x7e\x99\x18\xd0\x95\xff\x9e\x13\xf6\xe1\x57\x53\x6e\x9d\x74\x79\x68\x79\x79\xca\x05\x7d\xd9\x00\x5d\x5f\x23\x7c\xa8\x84\xaf\xcf\xce\x3c\x54\x22\x8f\x95\xc8\xcb\x4a\xf4\xb1\xf2\xaa\x4f\xec\xb1\x12\x7b\x59\x89\x3f\x56\xe2\x2f\x2b\x89\xc7\x4a\xe2\x65\x25\xf9\x58\x49\xbe\xac\xa4\x1e\x2b\xa9\x97\x95\xf4\x63\x25\x7d\x65\xfc\x8f\x29\xc1\xd7\x73\x7a\x9a\xd4\xd5\xac\xe0\x1f\xd3\x82\x7f\xcc\xeb\xf2\xd3\x2e\x9f\xe1\x6f\x2f\xf7\x28\x37\xd2\xee\x51\x0e\xb9\x92\xbb\x75\x7c\x3e\x0a\xa2\x57\x82\x4f\xc7\xe5\x63\x2b\x76\xd5\x7a\xeb\x20\x7c\x14\xc4\xaf\x04\x6f\x1d\x71\x8f\x82\xc4\x95\xe0\xd3\x91\xf6\xd8\x4a\x5e\xb7\xbe\x3d\x3f\xea\x4a\xf0\xd6\x31\xf4\x28\x48\x5f\x09\x92\xaf\xe6\x07\x43\xd7\xfe\x7c\x7b\x82\xf0\xb5\xe7\x5f\x1d\x15\xbf\xfe\x42\xf9\xc0\xb5\xf7\x2f\xf5\x3f\x1e\xc5\x7b\xf7\x6a\x7f\x86\xe8\x1f\x2f\xf8\x67\x1e\x7f\x60\xcd\x3f\xc3\xfd\xae\x65\xff\xbc\x27\xf8\xc0\xca\x7f\xde\x60\x7c\x60\xf1\x3f\xef\x56\xee\x5a\xff\xcf\x9b\x9c\x0f\x20\xe0\xbc\x63\xfa\x00\x05\xce\xdb\xaf\xbb\x40\x70\xd9\xb6\x7d\x80\x05\x97\x5d\xe0\x07\x70\x70\xd9\x54\xde\x4d\x84\x37\x2e\xe8\x3f\x35\xbe\xc9\x85\x26\xbf\x8d\x86\x4b\xc6\xdf\xa0\xc3\x25\x99\x6f\x00\xe2\x92\xa5\x37\x18\x71\x49\xca\x1b\x98\xb8\x64\xdb\x0d\x52\x5c\xd2\xe8\x06\x2c\x2e\x59\x73\x83\x17\x97\x74\xb8\x81\x8c\x4b\x9c\x6f\x50\xe3\x21\xac\xb7\xc0\xf1\x10\xb0\x5b\xec\x78\x08\xc5\x4d\x7c\x5c\xdc\x77\xe3\x5b\xee\x73\xf3\xbd\x80\xb9\x38\xf6\x4e\xc6\x5c\x9c\xfd\x2b\xcc\x5c\xbc\x7e\x27\x69\x2e\x91\xb8\x13\x36\x97\xe8\xfc\x8a\x37\x97\x30\xdd\x89\x9c\x4b\xe8\xee\xa4\xce\x25\x9c\xbf\x02\xcf\x43\x5c\xef\x64\xcf\x43\xa8\x7f\x81\x9f\xdf\x9c\x45\x7c\xf8\x7e\xf8\x7e\xfe\xfc\x78\xd6\xec\xdd\xfc\x39\x7f\x19\xfd\x63\xfe\x9c\xbf\xd7\x7e\x80\x3f\xe7\x2f\xc9\x77\xf1\xe7\xfc\xdd\xfa\x03\xfc\x39\x7f\x51\xff\x00\x7f\xce\xdf\xfa\xef\xe2\x4f\xee\x7f\x88\x3f\xb9\xff\x21\xfe\xe4\xfe\x9d\xfc\xb9\x9c\xfe\xf8\x00\x7f\x2e\x67\x53\x3e\xc0\x9f\xcb\xc9\x99\xbb\xf9\xf3\xc6\xed\x38\x4f\x8d\x6f\xf2\x27\xf7\x6f\xf3\xe7\x92\xf1\x37\xf8\x73\x49\xe6\x1b\xfc\xb9\x64\xe9\x0d\xfe\x5c\x92\xf2\x06\x7f\x2e\xd9\x76\x83\x3f\x97\x34\xba\xc1\x9f\x4b\xd6\xdc\xe0\xcf\x25\x1d\x6e\xf0\xe7\x12\xe7\x1b\xfc\x79\x08\xeb\x2d\xfe\x3c\x04\xec\x16\x7f\x1e\x42\x71\x93\x3f\x17\xf7\xbd\xcd\x9f\x8b\x17\xef\xe3\xcf\xc5\xb1\x77\xf2\xe7\xe2\xec\x5f\xf1\xe7\xe2\xf5\x3b\xf9\x73\x89\xc4\x9d\xfc\xb9\x44\xe7\x57\xfc\xb9\x84\xe9\x4e\xfe\x5c\x42\x77\x27\x7f\x2e\xe1\xfc\x15\x7f\x1e\xe2\x7a\x27\x7f\x1e\x42\xfd\x3e\xfe\xbc\xbc\x74\xf4\x70\x9e\xf5\xfd\xfc\xf9\xf1\x30\xd5\xbb\xf9\x93\x45\x1f\xe0\x4f\x16\x7d\x88\x3f\x59\x74\x27\x7f\xb2\xe8\x43\xfc\xc9\xa2\x0f\xf1\x27\x8b\xee\xe4\x4f\x16\x7d\x88\x3f\x59\xf4\x21\xfe\x64\xd1\x9d\xfc\xb9\x5c\x46\xf8\x00\x7f\x2e\x57\x25\x3e\xc0\x9f\xcb\x45\x8e\xbb\xf9\xf3\xc6\xcd\x74\x4f\x8d\x6f\xf2\x27\x8b\x6e\xf3\xe7\x92\xf1\x37\xf8\x73\x49\xe6\x1b\xfc\xb9\x64\xe9\x0d\xfe\x5c\x92\xf2\x06\x7f\x2e\xd9\x76\x83\x3f\x97\x34\xba\xc1\x9f\x4b\xd6\xdc\xe0\xcf\x25\x1d\x6e\xf0\xe7\x12\xe7\x1b\xfc\x79\x08\xeb\x2d\xfe\x3c\x04\xec\x16\x7f\x1e\x42\x71\x93\x3f\x17\xf7\xbd\xcd\x9f\x8b\x17\xef\xe3\xcf\xc5\xb1\x77\xf2\xe7\xe2\xec\x5f\xf1\xe7\xe2\xf5\x3b\xf9\x73\x89\xc4\x9d\xfc\xb9\x44\xe7\x57\xfc\xb9\x84\xe9\x4e\xfe\x5c\x42\x77\x27\x7f\x2e\xe1\xfc\x15\x7f\x1e\xe2\x7a\x27\x7f\x1e\x42\xfd\x3e\xfe\x5c\xdd\x2e\xf0\x70\xc1\xf2\xfd\x00\x1a\xff\xf4\x72\xcb\xf8\x91\x2b\x2e\xe3\xc7\x2e\xba\x8c\xf7\x5e\x77\x19\x3f\x76\xe9\x65\xfc\xd8\xd5\x97\xf1\xde\x0b\x30\xe3\xc7\xae\xc1\x8c\x1f\xbb\x0c\x33\xde\x7b\x25\x66\xfc\xe0\xc5\x98\xf1\x83\xd7\x63\xc6\x77\x5d\x92\x79\xe3\x56\xd8\xa7\xc6\x37\x01\x34\x66\xb7\x01\x74\xc9\xf8\x1b\x00\xba\x24\xf3\x0d\x00\x5d\xb2\xf4\x06\x80\x2e\x49\x79\x03\x40\x97\x6c\xbb\x01\xa0\x4b\x1a\xdd\x00\xd0\x25\x6b\x6e\x00\xe8\x92\x0e\x37\x00\x74\x89\xf3\x0d\x00\x3d\x84\xf5\x16\x80\x1e\x02\x76\x0b\x40\x0f\xa1\xb8\x09\xa0\x8b\xfb\xde\x06\xd0\xc5\x8b\xf7\x01\xe8\xe2\xd8\x3b\x01\x74\x71\xf6\xaf\x00\x74\xf1\xfa\x9d\x00\xba\x44\xe2\x4e\x00\x5d\xa2\xf3\x2b\x00\x5d\xc2\x74\x27\x80\x2e\xa1\xbb\x13\x40\x97\x70\xfe\x0a\x40\x0f\x71\xbd\x13\x40\x0f\xa1\xfe\x15\x80\x2e\xd2\x6e\x1d\x38\xe9\xe5\x56\xa5\x17\x07\xdd\xff\xfe\xf4\xc5\x0d\xc2\xb2\x0e\x3e\x3d\xfe\x34\xff\xcd\xb7\x4a\x7c\xaf\x9e\xdf\xd8\x72\xb9\x43\xe0\x2f\xe8\x52\xf5\x28\xf1\xf8\x2a\x1b\xcf\xf3\xbe\x3e\xd6\x3c\x8c\xf0\x78\xd3\xc1\xd5\x0b\x43\x2e\xef\xe0\xf8\x51\x55\x3b\x7e\xd2\x35\x5f\xfe\x86\xcf\x72\xe7\x1e\xff\xf2\x4a\x3f\xf8\xf6\xf2\x05\x19\x55\x1d\x5c\x5e\x34\xf3\xb8\x92\xf8\xc1\xb7\x1f\xa3\x21\xb0\x0f\x41\x2f\x5e\xab\xf1\xfc\x9a\x9d\xf3\x12\xf3\xbd\xcb\xfe\xce\x92\xa6\xfd\xdc\x15\x97\x81\xfd\xc7\x17\x29\xf9\xcd\xe7\x73\xf5\x3f\xff\xf3\xdb\xf5\x5d\x4f\xd7\x77\x57\x7d\xbd\xa8\x5e\x14\x3f\x3f\xbd\x65\xa7\xec\xda\x26\xf1\x83\xdf\xf6\xfc\x57\x96\x7c\xf9\x92\x3b\x75\x7a\x79\xd3\xc1\xab\x57\x29\x7d\xef\xb2\xd7\xf2\x9f\xca\x9f\xaa\xbe\xdd\x1a\x3f\x29\xce\xc3\xbf\x32\xf4\xb1\xd4\x96\xd5\x73\xe1\xf1\x4d\x3f\x3f\xdd\xd8\xf5\x68\xf8\x8d\xf1\x6f\xd6\xdf\x34\xe2\xd1\x09\x57\x56\xc0\x7f\xc3\x41\xfe\x56\xef\x7f\x7b\x65\x5e\x39\x5e\xfb\xd6\x28\x3f\xda\xaf\x5e\xc4\xf3\x37\x5d\xff\xbe\xc7\xff\xca\x92\xdf\x75\xfa\x5f\x59\xf2\xed\xda\x29\x7f\xa3\xf7\xf5\xfc\xe5\xcc\x98\xcf\x5e\x9c\x64\xfe\x1d\x83\xbc\x90\x7e\x35\x1e\xf4\x23\xe0\xd7\x39\xf3\x9f\xaf\x3b\xfb\xaf\x2c\xf9\xaf\xd7\x89\x75\x23\x31\x6e\x89\x7d\xfb\x39\x16\x17\xa9\x9f\xe2\x79\x2b\x57\x7e\x0e\xe0\xe7\xcb\xdb\x8f\x7e\xa9\x7c\x23\x89\x1f\x54\x2f\xc7\x6c\x7d\xc3\xee\x97\xcd\x2f\xbb\x82\xff\x46\xce\xf1\x88\xe1\x67\x85\x36\x18\xcf\xe3\x3d\x1e\xe6\x81\x13\xf8\x21\xf4\xf5\xe5\xbb\x98\x10\xe8\xb1\xfc\xf8\xa6\x29\x25\x68\xeb\xb2\x2a\xb3\xa4\xf9\xf4\x0f\xa6\x0f\x8a\xa4\xfe\x4b\x0d\xc6\xf6\x1f\x9f\xfe\x21\x06\x59\x1f\xb4\x89\xe7\xfc\xa5\x06\x5d\xf0\x8f\x4f\x4c\x9d\x38\xd9\xa7\x17\x2f\x93\x7b\xf1\x6a\xaa\x87\x9b\xa1\xb2\xa0\x7d\x78\xeb\x8d\xe3\x9d\x57\x95\x87\xd7\xf3\x5c\xbd\x76\x0b\xf9\x1b\x7b\x71\xfb\xe6\xf3\x1c\x5e\x1f\x7c\xdf\x63\xe4\x7f\x7e\x4e\xd8\xbf\x7a\x4e\xe8\xff\xfc\x9c\xe0\xfb\xe6\x74\x3d\x83\x5f\xcd\x09\xfb\x9f\x9e\xd3\x65\xb5\xfb\x97\x4e\x09\x7f\xc7\x94\xb0\x7f\xcb\x94\xa8\x1b\x53\xfa\x1b\x82\xcf\x95\x7f\x34\x23\xe2\xad\x19\x39\x9e\xeb\x78\xe8\xd5\x8c\xf0\x7f\xcb\x8c\xc8\x7f\x71\x90\xdc\xd2\x3f\xbd\x63\x52\x4f\x61\xfa\x80\x35\x4f\x1b\x83\x7f\x91\x77\x5e\x32\xe1\xc5\x4d\xf1\xe7\x99\xfd\x55\xfd\xff\x3c\xb7\xdf\x78\xfa\xaf\xbf\x2b\xe8\xb5\x45\x9f\x1e\x0c\xbd\xd1\x72\xcf\x0a\xf0\xb0\x1c\xfd\x7b\x4c\xfd\x09\x1d\x4f\xa6\xbe\x09\x95\x5f\x1d\x07\x0f\x6e\x25\xf0\x7f\x8f\xb1\x3f\x31\xe1\xc9\xd8\x37\x69\xf1\xfb\x1c\xf8\x77\x19\xfb\xd3\x62\xff\x64\xec\x7b\x30\x40\xbc\x32\xf6\xdf\x63\xeb\x4f\xab\xf8\x93\xad\x7f\xb4\xbe\xff\x5b\x6d\xfd\x69\x7d\x7e\xb2\xf5\xcd\x95\xfb\xf7\x7e\xc5\x6f\x25\xc1\xdf\x10\xfa\x8a\x22\x57\x0f\xd4\xfc\xde\x54\xf2\x4d\x53\x7f\x6a\xb9\xdf\xad\xff\x1e\x53\xa9\x37\x4d\xfd\xa9\xe5\x1d\xa6\xfe\x4b\x2d\xfd\xfb\xf2\xd2\xbf\xec\xe1\xa1\xcc\xeb\x75\xf2\xb1\xed\xe1\x81\xcd\xcb\xc7\xcb\x73\xd7\x3f\x3f\xb5\x79\x69\x7b\x7c\x3c\xfa\x85\xdc\xcf\xbf\x2c\xf5\x30\x56\x10\x5e\x75\xf7\xfa\x69\xd1\x4b\xd3\xe3\xa3\xcc\x2f\xe5\x1e\xab\x5e\x88\xc6\x6d\x9e\xdd\xe3\xc7\x7f\xe9\x06\x16\xc1\xff\xe3\xfb\xff\x7d\xec\xd6\x0b\xae\xde\x99\xfb\x8f\xe7\x11\xfe\xf1\xb5\xa9\xbd\x2f\x5d\x9d\xfd\x2f\xdf\x69\x9d\x2f\x4e\x55\x65\x89\x77\x79\xcd\x25\xf8\xe0\xe5\x32\x0c\xbf\x3e\xbe\x52\xfb\xff\x74\x6d\xf8\x99\xfa\xea\x3a\x4d\x40\x60\x9f\x7c\x88\x16\x36\x11\xc3\x32\xe7\x3f\x7e\x1d\x31\xac\x72\xf9\x98\x53\x0c\xc3\xac\x99\x5f\xfc\xb1\xc2\x26\xdb\xa8\xe7\x0f\xc7\x4b\x71\x38\xff\xeb\x85\xaa\x88\xe3\xa9\xcf\x6d\xf6\x16\xc3\x30\x22\x77\xae\xdc\x9d\xfb\x11\x24\x11\x5e\x87\xd4\x06\x66\xb5\xfd\x59\x34\x3e\x57\x7a\x0e\xc3\x30\x2b\xff\x70\x02\x82\x43\x26\xee\x61\x7d\xc6\x30\xcc\xe2\x62\xc1\xec\x32\x48\xb4\x11\x6d\xc5\xdf\xd3\x3b\x79\x92\x18\x86\xc9\xd6\xcf\xfd\xb1\xa5\x76\x9c\x6a\x0b\x81\x63\xef\x2c\x7e\xee\x89\x59\x34\x0c\xc3\xcc\x8b\xc2\x9f\xcf\x49\xfe\xe0\x17\xeb\x88\x61\x18\x65\x7e\x6e\xba\xfc\xc3\x50\x9c\x85\xb1\x07\xc1\x1e\x6c\x04\x62\x18\x66\x38\xcf\x52\x58\x45\x0c\x33\xdf\xd8\x88\x2d\xc2\x88\x8d\xf0\xd3\xb9\x3f\xae\x38\xab\x32\xd2\x93\x29\x2c\x5b\xb8\x62\x96\x33\x0c\xb3\x3d\xb7\xa8\x85\xc2\x30\x42\xb4\x1f\x79\x29\x52\x91\x38\xb3\x8c\x35\xc3\x70\x87\x73\xa7\x8c\x7a\x16\x98\x5b\xb2\x65\x45\x7b\x47\x88\x33\x6b\xcd\x30\xdb\xed\xc5\x3f\xf1\xc5\x4a\xc6\x47\xd8\xf9\xa2\x74\xcd\x0d\xc6\x30\xec\x62\x7f\xae\x2c\xcf\x4a\xbb\xae\xd3\x24\x90\x17\xc6\xde\x42\x38\x86\xe1\xfa\xb3\x13\x67\xde\xb9\xa9\x38\x2e\x9c\x82\x1d\x5c\x83\xc7\xce\xf6\xed\xd2\x4b\x7f\x8f\x46\x2e\x39\x26\xc8\x3a\xcb\x80\x33\x86\x61\x57\xee\xb9\xd2\x3a\x9b\xae\x1a\xb2\x3f\xe3\x68\x93\xed\x3d\xf4\x6c\x1f\x78\x56\x9a\x97\x6b\x86\x61\x13\xc1\xe4\x0f\xc8\xd2\x13\x17\xd9\xb9\xbf\x3d\x7e\x76\xea\xec\x92\x07\x87\x4d\xb6\x66\x62\x16\xb5\x8d\x45\xce\x30\xec\x5e\xb8\xb8\xee\x6c\x0a\x23\xd0\x45\x6c\xe5\x97\xf2\x25\xb4\x0c\xcc\x0b\xb0\x73\xb1\x62\xbe\x1b\x6c\xe4\x41\x54\xdd\x02\x55\xaf\x63\x48\x84\x28\xeb\xf5\x91\x5b\xb3\x73\x8e\x4b\x43\x48\x91\xb5\x32\x24\x4f\x95\x0c\xce\xcb\xd0\x0c\x75\x70\x02\x19\x29\xda\xcc\xa0\xdd\x7a\x26\x6f\x08\xcf\xe7\x37\xe9\x41\x6f\x4a\x52\x9c\x76\x3d\x3c\xc7\x58\x32\xc7\x20\x8c\x9a\xaf\xb2\xb2\x52\xb3\x9e\xc0\xf0\x6d\x60\x9a\xf2\x0e\x87\x1b\x73\xda\x3a\x80\x81\x32\x3c\x7a\x1e\x4f\x3c\x38\x07\xdd\x63\x5d\xde\xd5\xf9\x90\x5c\x75\x61\x00\xf4\x20\x24\x1b\x5c\x29\xcf\x58\x68\xbe\x8f\xd3\x71\x67\x18\xdc\x76\xaf\x0b\x89\xa1\xf0\x8d\xae\xcd\x73\x8e\x13\xed\xac\xf3\x2c\x02\x5e\x93\xec\xc1\x4e\xe6\xfc\x52\xb4\x8f\x19\x61\x4d\xf3\x79\xc5\x41\x47\xe6\xa4\xa8\x0d\xbb\x6e\xb6\xcb\x53\x75\xec\x57\xab\xbd\x9f\x5a\x84\x15\x5b\xfc\x20\x9e\xe6\x56\x0e\x91\x05\x3f\xd3\x64\xa4\x0f\x55\x80\xe0\xe9\xb2\x05\x05\xfe\x40\xad\x70\x9a\x86\xc9\x69\x2a\x42\xd2\xcd\x79\x46\x89\x13\x25\xb6\x67\x78\x6b\x1a\xf2\xde\x62\xb5\x39\x22\x59\xd3\x01\x90\xe0\x19\x16\xe7\x14\x5a\xef\x77\x55\x92\x53\x88\xea\xb0\xd4\xc6\x5b\x2d\xd9\x06\x13\x40\x2f\x2b\x57\x89\x1a\x8f\x00\x70\x12\x24\x68\x91\x0b\x52\x10\x0f\xf5\xbe\xb3\x70\x48\xe5\xab\xec\x08\xd5\xfb\xa4\x8c\xc2\x53\x38\xd7\x41\x61\xe9\x01\xeb\xc5\x52\x86\xd8\xb5\x40\x06\x5b\x06\x71\x0e\xac\x4d\x25\x59\xc1\xaf\xc5\x52\x9b\xec\xe5\xe0\xad\x37\x82\x40\x19\x1b\xf0\x40\xf6\x07\xd2\xe4\xfb\x90\xdd\xcc\x41\x29\x05\x05\x51\x4e\x5b\x4c\x25\x00\x32\x46\xc1\x1e\xd0\xc6\x89\xf2\xbd\xd2\x44\xe3\x78\xb0\x81\xc3\x08\x1e\x34\x6f\xa5\xb8\x12\x4d\x96\x3d\xba\x70\x0f\x12\x4a\x75\x60\x0f\xa5\x03\xc2\xe2\xe3\x92\x5c\xa5\xb9\x12\x2b\x3b\x44\x40\xb4\xd4\x2b\x8f\x51\x22\x1e\x87\x44\x23\xf6\x3b\x86\xc7\x22\x49\xc1\x52\xa5\x4e\xb8\xa5\x22\x35\xa5\x2d\xe0\x45\x03\x2f\xea\x99\x22\xd2\x00\xcb\x17\x5a\x1a\x71\x76\x7d\xe2\xc1\xd8\x93\x06\xab\xe3\xb0\x99\x3e\xf3\xec\xf9\x00\x30\x5a\xec\xd9\x6b\x09\x98\x2b\x1b\x6c\x17\x6d\xb0\x1d\x94\x0c\x79\x9a\x44\x03\x20\xcd\x15\x6c\x1d\x3b\x53\x50\xc1\x43\xbb\xa8\x17\x5b\x59\xd9\x97\x19\x2b\x55\x92\xed\x2f\x97\x66\xea\x2d\xf1\x3e\x43\xda\x55\x99\x46\x15\xe0\x9d\xf6\xb1\xdf\x91\xd0\x28\x94\x85\x5f\xd8\x89\x7b\xf2\x56\x39\xe7\xed\xcb\x85\x55\x8e\x8c\x94\x24\x90\xce\x71\x9b\x7a\x0c\x1d\x62\xbd\x61\x17\xf6\x62\xc1\xf3\x5c\xcf\xec\x34\xa5\xc6\xdd\xfd\x3a\x0e\x4b\x5b\x2d\x34\x8a\x0b\x1b\x12\x47\xb0\x34\x21\x67\xeb\x13\xc2\xed\xf7\x18\xeb\x73\x6c\xdd\x2d\x98\xc3\x28\xda\x1a\x43\xed\x2d\x86\xde\xcc\x38\x22\xd9\xcb\xcd\x82\x94\x4b\xa9\x96\xcb\x45\x2d\x97\x92\xbb\xc0\xb2\xcd\x9c\xca\xe3\xb9\xbc\x2b\x37\x68\x32\x93\xa9\x64\x7f\x98\xca\xca\x32\x5b\x77\xc4\x4e\x50\x37\xf4\xcc\x4e\x4e\xc8\x80\x0a\x94\x4e\xce\x26\xee\x14\xf7\x39\x61\xce\xb0\x62\x31\xa5\x4b\x53\x36\x96\x82\x5d\xcf\x84\x2c\x18\xdb\x56\xb5\x21\xbc\x50\xa6\xd9\x98\x57\xac\x50\x7b\xf3\xc0\xa1\xe6\x48\x63\x27\x68\x3f\x4e\x25\x84\x0d\x7c\x8e\xed\x79\xa1\xc7\x95\x8d\xe6\xf9\xcb\xbe\x89\x96\x62\xbe\xcb\x0e\xf5\x22\x19\xe1\xbc\x82\xa6\x69\x21\xb8\xad\x3d\xfa\x27\x54\x95\xb3\x30\x38\x82\xfe\x40\x07\x69\x62\x72\x5a\x45\xd6\xc8\xde\x0c\x5a\xca\xa5\x84\xbd\xd3\xa9\x73\xd1\x12\xe5\xf2\xe4\x6d\x0f\x73\x29\x23\x02\xb1\x67\xbb\x62\x4a\xba\x80\x06\xab\x12\x65\x07\xd4\x9c\x4e\x5b\xb4\xae\x30\x8f\x1c\x71\x68\x21\x80\xc8\x3c\x58\x7a\xed\x8a\xcb\x67\xd6\xde\x3c\x29\x9e\x9b\xec\x29\x37\x51\x66\x59\x2c\x6d\xf8\x90\x2b\xf1\xd3\xe6\xc8\xf1\xab\x79\x1e\x97\x7b\x71\xbf\xe5\xc4\xfd\x26\xcd\x36\x4e\xdd\xf2\x49\x36\x6e\xcb\x56\xcf\x42\x5e\xf1\xe4\x98\x5d\xf1\x43\x5a\x30\xd8\x76\xd8\x7a\xd2\x49\xb2\x97\x5b\xd5\x86\x61\xee\x94\x64\x43\x6e\x07\xdb\xb4\xcc\x25\x9d\xdf\xa4\x3d\x46\xe6\x40\x19\x2f\x4d\x6e\xbf\xb7\xb6\xeb\x61\xaa\xac\xa6\x32\xf7\x68\x25\x1f\x43\x08\xd8\x6f\x01\xa8\x46\x79\x0e\x30\xf9\x74\x12\xb2\x0e\x9f\xb6\xc0\x64\x76\xf2\xb6\xea\xf7\xc6\xbe\x39\xf6\xea\x72\x37\x19\xc1\xb1\x68\x7a\xc5\xdd\x76\x29\x92\xd0\x8e\x6e\x4f\xdc\xd6\x5d\xfa\x1b\xbb\x18\xfb\x5d\xbd\x93\x01\x27\x99\xb2\x4d\x13\x58\xc9\x8e\xdc\x36\x41\x28\x16\x4b\xba\xb2\xf9\x83\x74\xda\x39\x64\x4c\x36\x99\x56\xc3\x95\xd0\x49\x07\xb8\xab\xf4\x51\x36\xf6\xa9\x6b\x8d\xa9\x34\xe2\x07\x95\x03\xa3\xed\xee\xc4\xd7\xd6\x58\xae\x4e\x9a\x3d\xf8\xbd\x75\xf2\x55\x84\xb2\xd7\xb4\xa6\x42\x23\xdc\x31\xe9\x0e\x75\x56\x8b\xf1\xc0\xa3\x9e\x3d\x64\x20\xef\x79\x96\x5c\x19\x3b\x71\xb6\x4a\x8f\x8b\xa3\xb3\xe2\x3a\x7a\xb7\xe6\x6a\xb5\x46\xa4\x7c\xb5\x61\x35\x29\xf4\x46\xb0\x25\x4e\x26\x5f\x64\x9c\x9a\x1e\x49\x77\xa1\x17\xf6\x22\x6c\x52\x13\xdd\xca\x0e\x28\x33\xbb\x34\x8d\x01\xdd\x5f\x6d\x85\x02\xe7\x34\xdc\x50\x88\x0a\x26\x06\x83\x40\xa2\x16\xa6\x52\x42\x77\x5a\x28\x6e\xc8\x6d\xa7\x1f\x6b\xdf\xad\xa4\x0c\x38\xb4\x41\x19\x1a\xc4\xa9\xf2\x4b\x30\x2c\x57\x05\x2c\x19\xa8\x31\x77\x5b\xa9\xed\x52\x88\xf4\x65\x1f\x21\x0a\xb2\x85\x76\x21\x24\x9b\xb0\x7b\x40\x92\xb0\x68\x77\x28\xbd\xd5\xe8\x51\xe1\x79\xb7\x8a\x6a\xcf\xd0\x7c\x96\x0f\xe3\xba\xd8\xed\x50\x55\xef\xda\xba\x5f\xc9\x26\x83\x76\x8d\xd9\xa9\xbd\xa7\xfa\x44\x40\x9e\x26\x03\x17\xc9\x98\x44\xd7\x5a\x37\x02\x78\x0c\x03\x16\xd2\x9d\x42\x1f\x42\x08\x31\xa0\xc9\xd6\xd7\xd1\x4e\x0d\x83\x1c\x20\xd1\xda\x0f\x00\xcc\x02\x88\x9e\x8c\xc1\x0e\x05\x88\x46\x87\xc1\x68\x03\xc6\x5b\x8d\xc2\x35\x9a\x57\xa9\xca\x06\xbb\x23\x08\x79\x1a\x45\xf5\xf4\x3c\x24\x0d\x70\xdc\x82\x27\x04\x44\x97\x20\x74\x04\x61\x27\xc4\xe9\x90\x84\x7b\x4a\x42\x89\x83\x0b\xfa\x2e\xb8\x53\x81\x8c\x06\x0f\x34\x98\x75\x20\x59\x82\x18\x03\xe2\x03\x88\xfb\x21\xb5\x0c\xa9\x18\x24\x0e\x20\x82\x63\x9c\x82\xf0\x52\xb8\x29\x77\xa3\x32\xcf\xd4\xb9\x6e\x47\x1b\xbb\x34\xf0\x72\xe7\xee\xe3\xbd\x1e\x6f\xdd\x88\x46\x59\xf1\x38\x10\xc7\x61\xd1\x0e\x3b\xb8\x34\xc4\x75\xde\x5b\xdc\xdc\xe1\x65\x83\x77\x09\x26\x21\xd7\x48\x68\x89\x68\x3d\x13\x00\xa1\xa5\x44\x0b\xe3\xfa\x7a\x76\x0a\x59\x00\x98\xc5\x14\x97\x08\xcb\x32\x17\x28\x71\x8f\x10\x29\x3d\x36\x9a\x0a\x60\x63\x11\xcf\x87\x3c\x82\xdc\x83\xa6\x21\x05\x0e\x1e\x72\x6a\xa8\x0f\x5b\x00\x2e\xe2\x6c\xc8\xaa\x9c\xee\x4d\xc1\xc3\x86\x3a\x9b\xd3\x3b\x7c\x5d\x1f\x8e\xd8\xa9\xe6\x20\x87\xf6\xdc\x0e\xd8\x09\xd8\x10\x12\xe6\xe8\x6a\x1a\x2a\x54\xd4\x38\x41\xbb\xc3\x88\x41\x85\xb0\x0f\x85\x19\x3c\xd0\xc0\xb6\x38\x54\x0d\x6f\x87\xf8\xde\xb4\x30\x14\x97\x11\x9e\x42\xcc\x44\xf6\x0c\x05\x3c\x91\x12\xe4\xd7\x5a\xaf\x14\xa4\x1e\x28\xab\xac\x10\x5c\x86\xe4\x7a\x3c\xe8\x94\x25\x19\x56\x61\xad\x50\xab\x13\x6f\x9a\x96\x74\xc2\xc7\x92\x72\x61\xd0\x9b\x1a\xda\xcf\x90\xb0\xef\x8b\x95\x33\x39\xf0\x2c\xc8\x14\x5f\x0d\x0c\x2f\xb0\x56\xa1\xde\xaa\x05\xa5\xe3\x11\x88\xe2\x78\xbf\x32\x86\x31\x80\xb3\x00\x6f\x95\x92\x6d\x23\x24\x3f\x96\x09\x8a\xd3\x79\xbb\x3b\xc2\xee\x9e\x38\xe6\xee\x9a\x70\xfc\x6d\xa5\x15\x2a\x32\x55\xa0\xe2\xec\x56\x24\xea\x40\x78\x4d\x13\xde\x18\x11\x0e\x6a\x6b\x56\x67\x1f\x73\x41\xef\xdc\x3d\xba\xc4\x4e\x0b\x20\x90\x3c\xd4\x65\x5c\xcd\x34\x4a\x68\xb5\x08\x55\xff\xd8\x30\xae\xbb\xa4\x83\x1c\x51\x50\xa9\x35\x5b\x46\x04\x32\xc4\xf0\x4f\xaa\x5f\xe1\x6b\xdf\xc4\xc1\x7e\x2d\x98\x76\x57\xe4\xee\x3a\x01\x42\xdb\x68\x48\x20\x00\x72\x04\x40\xd7\x4d\xab\x90\x60\x25\x39\x01\xb4\x35\x0b\x44\x5c\x69\x92\xc6\x69\x76\x38\x69\xa4\x5b\x76\x1d\xdc\x0d\xe8\xe4\xe1\x61\xb7\x75\x81\x85\x9b\x1e\xd1\x82\xde\x54\xe1\x02\xad\x15\xd2\x27\x8f\x24\x18\x0d\xe1\x4a\x17\x27\x03\x3d\x9a\x51\x87\x34\xc7\x06\x5f\x52\xbb\x03\x42\xfa\x89\x41\x5a\x9a\x3c\x3b\xf4\x2c\xde\x37\xeb\x53\x2e\xf1\x47\xba\x9e\xa5\x1e\x46\x47\x28\x88\x25\x01\x5a\x6f\xbb\x7d\xe8\x08\xa4\xc9\xad\x7a\xaf\x04\x33\x02\x4e\x45\xa4\x3c\x24\x87\xf9\x2e\x18\xa7\x92\x2e\x2a\xb7\x13\x7b\x2d\xed\x24\xaf\xeb\xb3\x02\x11\x4d\x83\x72\x3a\xd8\x4b\x50\x04\xda\x90\xbd\x07\xa7\x1b\x04\x2c\x82\xac\xb7\x00\x17\x4f\xfa\x00\xa8\x49\x11\xeb\x1b\x68\x05\x44\x91\x86\xcd\x33\x1a\xaa\x40\x7e\x1e\xc0\x7a\x37\xce\xa9\x0c\x9b\xf3\x08\xd6\x8b\x65\xb3\x20\x9d\x53\xb8\x5a\x9a\x82\x03\xe6\x90\xb1\x0e\x64\xa4\xa2\xe6\xa4\xb7\xd5\x49\xcd\xcd\x02\xae\xf1\x4f\x75\x14\xf3\xea\x40\xef\x29\xda\xdc\x53\xb8\x05\x5b\x93\xca\x99\x3b\xb9\x03\x95\x09\x6f\x5c\x31\x10\x84\x0e\x2d\x22\xca\x95\x0f\xae\x67\xd3\x63\x1e\xaa\x5b\x72\x96\x91\x07\xcd\x2b\x46\x53\xc9\xa4\x28\xb6\x97\xba\x14\xa7\x9d\x74\xc2\x68\xc8\xa4\x98\x36\x5b\x9a\xc6\xf3\x3e\x70\x79\xde\xff\x8b\x11\xc3\x6e\x38\x5b\xd1\x2f\xfb\xe6\x87\x2f\x0f\x20\x48\xfd\xf8\xbe\x80\x21\xb9\x1a\xd9\xf5\x22\x2a\x94\x39\x73\x6a\xe6\x33\x58\xd9\xef\x07\x6f\xce\x60\x0c\x12\x0b\x81\x62\x6d\xd8\x83\x1a\x89\xa7\x88\x67\x4f\x83\x72\x9a\xb1\xfb\x15\x3d\x68\x83\x25\xb2\x91\xa9\x6b\xd4\xb4\x05\x31\xc8\x16\x16\x89\xa6\x1c\xcb\xa3\x32\x67\x15\xb6\x49\xc7\x66\xb7\x6c\x59\x58\x5a\xce\xb9\x81\x19\x33\x6f\x79\xd9\x7b\x8b\x07\xa7\xb5\x55\x7b\x2f\xe1\x1b\x51\xb1\x41\x90\xf4\x69\x6e\x5b\xee\xe9\xd0\x45\x1c\x5f\x15\xca\x78\xc3\xd3\x47\x53\xea\xab\x6d\x83\xb8\xcb\x1e\xd9\xd4\x35\xc7\xa9\xfc\xbe\x49\x82\xc5\x52\xb1\x39\x58\xdd\xb5\x71\xdf\x75\x73\xfd\x70\x90\x49\x2d\xd3\xfb\x6e\xce\xa2\xa2\x0e\x0d\xd3\x24\xc7\x27\xbb\xc5\x27\xb4\xd0\x56\xc5\x2a\xf0\x02\x9b\x0c\x45\x74\x16\x13\x43\xcb\xfa\x12\xbd\x27\xaa\x14\xc3\x09\x7c\x5b\x2b\x5e\x76\x50\x56\x6a\x64\x6f\x86\x64\xaa\x3b\x28\x8d\x76\x93\xbb\x5b\x2f\x62\x6c\x2b\x49\x4a\xba\x63\x6c\xb9\x98\x6d\x16\xc7\xe3\x46\xae\xd2\x93\x2e\x2a\xf9\x6e\x9d\xe4\x5b\x2e\xd1\xf4\x40\x30\x28\x1f\x4b\x4f\x07\xbc\x6b\xf1\x58\x9b\x12\x40\xef\x58\xbd\x66\xf5\x63\x9c\x35\xc4\xb2\xb1\x74\x87\xf0\x7d\x30\x17\xc1\x4c\x5d\x9a\x88\x38\x5a\x50\x80\x94\x74\x85\xe1\x05\xb6\x2d\xa8\x71\xdc\x3a\x63\x9a\x44\x55\x9a\x58\x76\x9a\x98\x76\x9a\x34\x7c\x93\x72\x88\x03\x20\xe6\x98\x75\x6d\xe8\xc5\x8d\xe2\xf7\xea\x84\xdb\x31\xab\xc7\xac\x5e\xc6\xbb\x80\x48\x74\x3a\x6d\xdd\x50\x5f\xf7\xb0\xa8\xc1\xba\x6c\xd4\x7a\xaf\x4b\xaa\xd3\x89\xc7\x34\x85\x8f\x91\xad\xd7\x40\xbd\x57\x75\xa3\x76\xb2\x2d\x7c\xcc\x96\xfa\x31\x5d\xea\xc7\xdd\xea\xa8\x2f\xd0\x32\x54\x57\x36\x6c\x17\x10\x68\xaf\x0e\x28\x2f\x46\x27\x31\xe4\x10\x26\x74\xc0\x60\x00\xfc\x04\x20\x73\x1a\x2d\x01\xb5\x1e\xbb\x40\x1b\x62\x9c\x45\x4f\x3a\x1c\x80\x4e\x98\xbb\x45\x44\xa6\xc0\x4c\x33\x86\xed\x01\xa0\x40\x2c\x86\x5c\x73\xbb\xf1\x3d\xdf\x74\xbb\x60\x35\x5b\xf0\x34\x89\x61\x5c\xd3\x83\xab\x58\x15\xc1\x3a\xd9\x0d\x33\x96\x5e\x2a\x20\x33\x44\x89\x21\x78\xd4\x76\xe9\x05\x49\x9a\x5b\xbb\x64\xed\x09\xd8\x6a\x21\x2d\xa4\xb2\x2c\xb3\x78\x26\x8b\x1c\xb7\xa7\x66\xc9\x7a\xcc\x04\x2e\x55\x16\x78\xba\x39\xcc\xb6\xbc\xce\x39\x9b\xcd\xe1\x78\x10\xf6\x8a\x90\x5b\x93\x3e\x09\xeb\xb1\x88\x32\xc5\x66\x97\xbb\xdc\x5b\xec\xab\x83\xe0\x0b\xc6\x76\x37\x40\x63\x9e\x7a\x6d\x83\x1f\x66\x66\xe0\x8d\x05\xb3\x6e\xed\x51\x58\xa8\x46\x4c\xe2\xf2\xd2\x60\xec\xed\x58\xc4\x26\x09\xce\x0b\xe7\x94\x23\xd2\xca\xb3\xa7\x5d\xc6\xab\x02\x1b\x78\xf8\xe6\xa4\xeb\xba\xb8\xda\x08\x09\x3e\xc6\x5e\xbf\xf7\x2a\xb3\x46\xd5\xf5\x1e\x34\x76\x90\x1a\x21\x4e\x65\x76\x4e\x55\xd1\x2d\xef\x74\xb0\xe8\xf3\x0d\x26\x9c\x50\x15\x68\xed\x12\x6c\xfd\x42\x3b\xb4\x7a\xc7\x87\xa2\x3c\x32\x9a\xdd\xda\x88\xa1\x66\xb2\xdd\xa4\x9b\x92\x76\x11\x05\x1b\xc9\x79\x94\x9a\x9a\x62\x2f\x75\x81\x60\x92\x25\x56\xa2\x5e\x50\x0a\xb9\xc1\xf2\x90\x46\xf9\x70\x91\x54\x63\x3c\xca\x4b\xb5\x37\xc6\x4c\x44\x1b\x6c\xe0\x78\x7f\x0b\x36\xf8\x90\x09\xb4\x6f\xc7\xdb\x5d\x21\x6c\x61\xf2\xe8\x04\x35\xbf\xea\x95\x8d\x1b\xaa\x51\x19\x56\x15\x38\x8d\xc0\x7a\x72\xea\x32\x50\xab\x83\xa5\x30\x33\x51\x12\xd7\x69\x23\x6c\x9d\x1d\x34\x67\x68\xb5\x5b\x64\x96\x10\xf7\x54\x3c\xa9\x32\x78\xb0\x33\x04\x04\xc1\x99\x2f\xb1\x0b\x4a\x03\x4c\x10\xc5\x22\x2d\x9a\x4b\xda\x1a\x4a\x02\xf5\xd8\xea\x79\x86\x42\x90\xb5\xcf\xdc\x31\x93\xc6\xd6\x76\x78\x5e\x1e\xa1\x93\x57\xb5\xa2\x54\xb1\xdb\x19\xb3\x56\xd9\xa4\x83\x67\xdd\x21\x76\x97\x10\x5f\x55\xbb\x78\x41\x0f\x06\x01\x99\x70\x48\x2d\x69\xdc\x6b\xab\x89\x98\xfb\x80\xd1\x51\x2e\xb2\x75\xd8\x78\x41\x22\x30\x0b\x42\x64\x73\x22\x15\x04\x70\x03\x43\x39\x65\x33\xf6\x80\x3a\x14\xb7\x4e\x26\x5f\xb5\x1c\x23\x3b\x25\x68\xd0\x20\xc5\x7e\x74\x55\x76\x25\x20\xce\x92\x24\xb3\x59\xc5\x85\xe0\xde\xe9\xf7\xce\x41\xda\x05\x4d\xb8\x20\x94\x88\x19\x35\xb9\xb6\x14\x08\x64\x67\xf0\x89\xdf\xa5\xeb\x04\x15\xf7\x65\xd5\x6c\x8b\xd2\xac\xa0\x13\x44\xfb\x8e\x82\x38\xa0\x8e\x64\xfb\x25\x1f\x8e\x14\xbe\xee\xd8\x59\x6f\x82\xee\xa4\x18\x10\x1c\xee\x65\x64\x75\xb4\x4c\x86\xcb\x36\x89\xce\x94\x33\x6e\x1b\x36\xce\x42\xcd\x15\x75\x1f\xcc\xec\xea\x00\x6e\x86\x89\xa4\x75\x9a\x31\x00\x27\x75\xe6\x40\x17\xd3\xc9\xa6\x9e\x75\x05\xcd\x51\x25\x58\xac\x67\xa5\x12\x35\x4a\x02\x45\xd0\x6c\xbb\x0f\x03\x34\x6a\x66\x71\xcb\xca\xd6\x02\x5e\x49\x18\x5f\x18\x47\xb0\xdb\x67\x5b\x32\xab\xa4\x06\x63\x0e\x8b\x79\x3c\x2d\x96\x43\x02\x8c\x82\xe1\xa1\xa6\xc2\x39\x74\x1b\x2f\xb5\x15\xd3\x6f\x17\x7b\xa1\x32\xc2\x69\x2f\x1e\x93\xa5\x5d\x0e\x9c\x42\x67\xb3\x21\x3e\x21\x6b\xb0\xd6\xeb\xf5\x16\x98\xcb\x12\x8b\x49\x86\x5e\xa0\xa5\xcc\x10\xad\xeb\x03\x71\xbd\x94\x82\x09\xc1\xec\xe3\x76\xb3\x5b\xad\x4f\xd9\x12\xe7\x47\x62\xef\xec\x91\x36\xca\x9b\x81\x9b\x67\x0b\x18\x3e\x72\xde\xc2\x2f\x4c\xc6\xa1\x27\x55\x60\xbb\x99\x4f\xcc\x78\x45\x60\x97\xdd\x32\xf6\x49\xdd\x68\x8b\x48\x9c\x1f\xc9\x64\x02\x0c\xb2\x03\xe8\x5d\x60\xf4\xeb\xa2\xc3\x23\xc4\xd4\x98\xb5\x7f\x8a\x8e\xbb\x4d\x36\x9a\xe6\x16\x98\x4b\xed\xb4\x6d\x96\xb3\x74\x84\xfa\xfd\x06\xb2\xe5\xad\x95\xb3\x11\x6e\xed\x32\xd5\xb2\xf5\x03\xba\xa6\x3b\x9a\x58\xcc\xb7\x8c\xbb\x17\x80\x56\x29\xdb\xc4\x9c\x06\x63\x0a\xca\x3d\xa7\x57\xb0\xa4\x23\xe5\x60\x88\x9b\x6a\x2b\x31\x15\x1b\x93\xa7\xba\x67\x47\xa6\x8b\x38\x95\xca\x23\xbe\x84\x04\x45\x64\x6b\x41\x4d\x14\x62\xb1\x96\x6c\x47\x61\xba\xb9\x99\xc7\x8e\xe4\xcc\xe2\x8a\x81\x62\xc8\xdd\x43\x55\x19\xda\x93\x65\x46\xa7\xd4\x41\x17\x4b\x54\xdc\x54\xfa\x96\xea\x01\x28\x2f\x4f\x4e\xb0\x1f\x35\xc2\x2d\xe6\x44\x6f\x09\x9a\x6b\x80\x66\x8c\x09\x8c\xa1\x98\xec\x11\x01\xbc\x29\x59\xc8\xfd\x28\x85\x98\x82\xa5\x5a\xbe\x98\x1d\x37\x72\xbb\xa3\xf3\xc5\x4a\x74\x54\x28\x27\x9a\x36\xb7\x41\x65\x7b\x9a\x6a\x6b\xdb\x6f\x29\x96\x0f\x58\x7b\x58\x70\xfb\x52\x03\x55\x6f\xea\x64\x7f\xcf\xb2\xd6\xa0\x5a\xd0\x90\x18\x23\x66\xf3\x70\x97\x3b\x41\xe5\x1c\xb6\xe9\x41\xcd\x96\xba\x6a\x03\x42\xb5\x6d\x8e\xaa\x34\x9f\xc3\x03\x38\x2f\xb7\xed\x2c\xd7\xe8\xc9\x57\xd7\x50\x1c\x4d\xa6\x6b\xb9\x23\x66\x8f\xaa\x8f\x4c\xf5\x4a\x95\xa0\x43\x7b\x10\x5c\xc9\xcb\x75\xe1\x74\x2a\xb8\x6d\x60\x6c\xf0\x8d\x67\xd7\x99\x75\xaa\x57\x8d\x38\x7a\xa3\x9e\x1b\x1b\xd8\xf0\x2c\x24\xaf\x3a\x29\xcc\xb8\x53\xdd\xd9\x61\x9e\x26\x7d\x6b\x69\x47\x35\x5d\x00\xc0\x7e\x86\xf3\xf1\xd2\xaa\x52\xb4\x63\x64\xac\x9d\x37\x72\xa7\xa7\x3a\x9a\x4e\x7b\xff\x48\x66\xaa\xea\xe3\x0e\xcc\x05\xfb\xc1\x56\x85\x03\x18\x83\x49\xb0\x2e\x26\x11\x5b\xf8\x4c\x38\x9b\xa6\x44\x02\x33\xcf\xdb\x89\xfb\x44\x02\xb2\x6c\x25\x1d\x90\x3d\x4b\xb9\x82\xb7\x29\x86\xa6\x80\x6c\x4a\x16\xbc\xb5\x08\x75\xd9\x86\x4f\xc3\x3d\x14\xb2\xa4\x10\x95\x9a\xe8\xb2\x10\x61\x72\xb0\xae\x52\x7a\xd9\x2d\xc5\x45\xe3\xa1\x8a\xb4\xeb\x18\x06\xf6\xf6\x8c\x6e\xeb\xdb\x2d\xca\x72\xe1\xc9\x65\x30\xa0\xce\x3a\xc7\x83\x17\xab\x03\xe7\xda\x14\xb2\x48\x4a\x5a\x18\x23\x0e\xe8\xa6\x66\x9a\x13\xad\xb6\x2c\x78\x07\x00\x1b\x2f\x10\xdc\xcc\xda\xae\xb0\x22\x6c\x1c\x1c\xcd\x0e\x54\x04\xcc\x43\xac\x31\xed\x6d\x0a\x38\x7b\x7c\xf0\x96\xc1\x9a\x11\x13\xaa\xa7\x56\x18\xaf\x8b\x8b\xd2\x5f\x1d\x83\xe5\xae\x81\xb4\x01\xdc\x9b\xc2\x4c\x20\x66\xe1\x7a\x8f\x28\x27\x4b\x2a\x93\xb8\x0e\xc3\xd5\xee\xb4\xad\x55\x3b\x9d\x0c\x68\x16\xd3\x1a\x3b\x2f\x6b\xa4\x11\x28\x67\x4f\x28\x12\xb1\xcf\xda\x65\xbc\x10\x22\xae\x8d\x08\xdc\x86\xe6\xbb\x23\x05\x9c\x5a\x3b\xe3\x96\x7b\x03\x4f\x7a\x52\x25\x97\xce\xd2\x22\xb9\xbd\x3d\x49\x4c\xb5\x5c\x6d\xf3\xc6\x9d\x37\x24\xb1\xe1\x8c\x2c\x22\x8f\x41\x01\x41\xde\x3c\xdb\xb4\x47\xb9\x48\x06\xd8\x80\xed\x31\x76\x21\x91\x44\x34\x69\xda\x8e\xb8\x0a\x2f\x82\x6e\x96\x56\xe4\xde\x70\xf7\xcb\x80\x3a\x31\xd2\xaa\xb3\x39\xba\x9b\x39\x33\x03\x39\xf4\x4d\x59\x25\xdb\x2c\x29\xa5\x03\x26\xb9\x6b\x93\x24\x0d\x95\x5b\x24\xd0\x14\x9d\x08\x56\xca\x37\x63\x53\x4b\x1a\x69\x95\xfe\xca\x59\xce\xfc\x48\x0e\x83\x56\x3a\x92\x74\x3b\x23\x3d\x1a\xa6\x12\x66\xc8\x71\xb8\xc3\x21\xc1\x48\x1d\x79\x32\x37\x26\xec\x14\xb0\x0e\xb7\x51\xa9\x13\xa0\xb7\xdb\x50\x22\x44\x11\x43\x13\x58\xe6\x66\x93\x69\x72\xd1\x87\x45\xbc\x6b\x74\xc2\xe3\xba\xf5\x42\xd0\x51\x07\x24\xd3\x62\xa4\x0f\xbd\x41\xee\xab\x85\xd6\x36\xa6\x5f\x14\x89\xbf\x2f\x75\x2a\x03\x18\x16\xd2\xba\x4c\xf3\x12\x21\x35\x36\x0d\x9c\x64\x9c\x07\xf4\x06\x1a\x9d\x36\xbb\xb4\x1c\x53\x7d\x12\xd9\x10\x82\x62\xb2\x4d\x32\x33\x2c\x61\xd4\xf2\x01\xe4\xa0\x67\xa3\xa1\xcb\x52\x68\xfb\xac\xee\xab\x76\x37\x1c\x3c\xc0\x1c\x0e\xc7\xf5\xac\x5c\x1a\xc7\x75\xa2\x17\x11\x61\xcf\x09\xb7\xb0\xeb\xa1\xb1\xb7\x98\xcc\x99\x5e\x83\xec\xcc\x4d\xb8\xf6\xb5\x19\xe7\x63\x35\x85\x8d\xb2\x09\x12\xf4\x78\xe2\xd5\x53\x72\x8a\x17\xbe\xa3\x7a\x8b\xd3\xda\x6f\xc5\x53\x5f\xd6\x5b\x83\x4c\x31\xef\xb8\xc9\xc3\xb6\x17\xc6\xa2\x8c\xe1\x85\x0a\x44\x4e\x54\xe1\x92\x7c\x38\x00\x66\xc7\x74\x87\xd1\xac\xf8\x15\x39\x51\x43\xa8\x98\x14\x8f\xe0\x7d\x64\x15\x6b\x07\x38\x76\x91\x32\xb2\x72\x51\x5b\x12\x97\x9c\xea\x00\x4a\x89\xdc\xcc\x58\x2a\x16\xd2\x05\xc5\x99\xfa\xba\x56\x66\x01\x53\x30\xb6\x36\x3b\x39\x55\x46\x54\x11\x11\xd9\xb8\x63\xef\x07\xde\xb2\xd6\xc4\x5c\x0f\xac\xc1\x10\x94\x55\x84\x1a\x70\x44\xe0\xa8\x10\x44\xba\xc4\xaf\x0e\x3a\x6d\xac\x72\x6f\xc2\xd7\x4a\xe6\x0d\xf3\xd3\x0e\xda\x99\xb9\x63\x6e\xfd\x60\x73\xa4\xc7\xc3\x49\x75\x6b\x56\x9d\x03\x2c\xdc\x36\x45\x34\x77\xdd\x85\x24\x6c\xdd\xf9\x4c\xce\x75\x86\x43\x72\x65\x15\x0d\x9b\x41\xc8\xa9\x31\x6e\x96\x26\xed\x95\x02\xd2\xea\x80\x82\xb6\x1b\x40\x31\x2b\x19\xa0\xcc\xd2\x0d\x20\xb3\x44\x03\xc8\xc4\xa6\x00\x36\xb1\x31\x48\x41\x72\x0c\x62\x1a\xd7\x62\xaf\xc5\x98\x90\x60\x79\x9f\xd5\x86\x21\xb2\x3d\x46\x03\x96\x29\x41\x73\xb3\xcd\x21\x1c\x0f\xb2\x85\xb7\xa3\x2c\x15\x12\x05\x8f\xc8\x38\x69\x8d\x98\x50\x34\xec\x6b\xf4\xfe\xd0\x07\xcb\x89\xd5\x96\xcb\x69\xd4\x24\x5a\xed\xad\x0a\x42\x31\xa9\xe4\x15\x60\xbe\x64\x77\x5a\xb4\x44\xc5\x05\xda\x13\x20\xbc\x55\x57\xe0\x76\x3b\xdf\xf5\x10\x14\x41\x24\x38\x3f\x1d\xdc\x18\x18\xd6\x27\xcc\xf2\x38\xa5\xe3\x45\x6f\x46\x43\x34\xd8\x2e\x0e\xd3\x8e\xc6\x87\xf5\x09\xb4\x3d\x4e\xe9\x61\xb3\x16\x86\x5d\x98\x36\x11\x87\xe2\x9a\xc4\x6a\xdd\x71\x81\x00\xbb\x65\x3d\xd9\xb4\x01\x1f\xcd\x40\x86\x32\x0d\x46\x70\x18\x45\xb4\xd4\xb5\x77\x2b\x42\xfe\xf1\xfd\x22\x04\x41\x86\xa1\x31\xa4\xd6\xe9\x99\x19\xbb\x3a\x5e\x94\xab\xc0\x5f\x76\x95\x94\x21\x2e\xee\xc8\x5e\xe7\xd6\xaa\x69\x38\x79\x37\xf5\xca\xc1\xdc\x92\x43\xef\xb9\x13\xbf\xdd\x8c\x85\x87\x9f\xa0\xa5\x8e\x6e\xb3\x04\x8b\x2b\x79\xad\xf2\xcc\x71\xcf\x18\xb6\x15\xd7\x58\x07\x2d\x79\x65\x8b\x2f\x11\x7f\x29\xb6\xfc\x2c\x5e\x23\x47\x51\x9e\x0b\x00\x13\x78\x8a\x88\xaf\xa1\x49\x16\x40\x8b\x3d\x94\x83\x6b\x42\x34\x38\x15\xa8\x99\xe5\x08\xb9\x74\x87\x70\x0b\xc0\x0b\xad\x3f\xd6\x1a\x88\xd3\xc0\x7e\x9f\x39\x22\xdf\x6e\x77\x00\xbf\xf2\x05\x71\x59\x31\x7e\xb7\x99\x99\xed\x96\x83\x92\x44\xec\x5a\x66\xed\x95\xf9\x0a\x2d\xc6\x22\x98\x9c\x9d\xcb\x90\x04\x71\xec\x6a\x91\x5b\x66\xeb\xbd\xba\x36\xb6\xcb\x86\x5e\x47\x01\x5a\x11\x50\x00\xa0\x8b\x76\x1e\xf8\x3b\x4d\x6b\x52\xcc\x0f\x61\x27\x84\x84\x10\x49\x51\x6a\xb6\x6b\xb5\x23\x09\x95\x36\x7c\x9a\xb9\x3b\x80\xd7\xb6\x0d\x79\xa8\x35\xb4\x25\x48\xa0\x6f\xfb\x00\x00\xd0\xd4\xd1\x2a\x32\x40\x69\x28\xe9\x71\xda\x25\x0f\x87\x0d\x71\x28\x0e\x5d\x07\x50\xc0\x84\x73\x87\x76\xc0\x14\x54\xf4\xa1\x72\xc5\xf3\x64\xee\xd3\x62\x4d\x89\x61\x8e\x11\xf0\x21\x1a\xb0\x79\x23\xf5\x03\x8c\xad\x8a\xc6\x3d\xd0\xd3\x1a\x2f\xa7\xbe\xd7\xe4\x25\x4b\x00\x94\x97\xfb\xd4\xb8\xd1\xd0\x81\xa1\x67\x2c\x87\xf4\xe0\x86\xf0\x25\x20\xb4\xd0\x7e\x4c\x24\x4a\xb2\xe4\xed\x92\x3b\xa5\xde\x46\xf2\x4f\x5b\xb6\x58\x79\xe9\xd8\xef\x9c\xf9\x5a\xcf\x8b\x25\xb8\x5f\x16\x59\x61\xf0\x75\xda\x2b\x04\xd3\x65\xfb\x45\x5b\x1c\x1b\xb5\x85\xd0\x1e\x9d\xe3\xe5\x4e\x20\x5d\xdb\x3e\x12\x5d\x8b\x2f\xc6\x34\xf0\xf9\xb6\x21\x0f\x3e\x5f\x35\x6e\xe9\xee\x61\x55\x8a\xc2\xd1\xd0\xd2\x14\x37\xd4\x23\x73\x8a\xb7\x11\x19\x88\x10\x0f\xa1\xc9\x8c\x32\xd7\xe1\xd4\x65\x1c\xdd\xe5\x22\xd4\x8b\x61\xe1\x1e\xf8\x7d\xb9\x55\xa5\xd3\xc8\x2b\x1c\x8f\x21\x56\xb9\x8a\x43\x79\x4b\x41\xcd\x34\xf6\x22\xb9\xd1\x39\x17\x0a\x72\x7e\x1f\x0d\x79\x25\x09\x6a\xa7\xec\x99\xb0\x99\x01\x9b\xe2\x40\x3b\x48\x4a\x57\xdd\x6c\x6e\x48\xfa\x26\xd4\xe1\x66\x0e\x91\x49\x6d\xea\xfa\xca\x90\x59\x7d\xa9\x4d\x07\x87\x5a\x59\x3b\x70\x11\xa0\x55\x9b\xd5\xc8\x69\xdb\xdb\x12\x15\x80\x22\xb4\x05\x4f\xee\x24\xa1\xb9\x80\xa8\x6d\xe3\xf6\x91\xef\xa0\x38\xd2\x0c\xe4\xe4\x7b\x55\x48\xc3\x51\xd8\x27\xdd\xc4\xa3\x98\x43\xd3\xaa\x36\xb8\x20\xd4\x9e\xff\x27\x41\xa8\xa5\xf8\xad\xe2\x1a\x62\xb2\xdf\x50\x51\x98\xae\xb7\xdc\x7e\x83\xc3\x89\xdc\xb9\x28\xec\xeb\x46\x87\x0f\x48\x43\x14\x8a\xb5\x72\xa4\x79\xb2\x5a\x1d\x66\xf3\x59\x6a\x37\x9b\x4d\x1f\x19\xb3\xdc\x81\x58\x91\x1d\xcb\x5a\xc8\xab\xa3\x8d\xed\xe9\x31\xe6\x4f\xa3\x83\xc6\x22\x92\x19\x1a\x93\x9a\x6b\x85\x25\x95\x55\x35\xce\xe7\x84\xbe\x0e\xec\x81\xb7\x45\x0e\x0b\x8a\x28\x83\x11\x09\xf3\xa6\x62\x8d\x87\xc2\x6e\x7b\xdc\xb3\x6b\x69\x21\xee\xd3\x0d\x9c\x4c\x54\x56\x3a\xab\x70\x2c\x07\xdf\xa1\x01\x97\x5b\x8e\xf6\xbc\xaf\x8a\x12\x0f\x80\x35\x5d\x36\xe4\x2a\x75\x86\xc0\xb0\x21\xa2\x73\x70\x55\x0d\xfd\x13\xe2\x1d\xea\x5d\x53\x7b\x86\x09\xd7\x47\x31\x75\xf9\xda\x44\x0c\xc3\x73\x43\x5d\x08\x56\x99\x4a\x03\xf8\xc2\x5c\xac\x10\xd0\xc6\x42\xb7\x32\x4e\x12\x91\x1b\xf3\x32\x84\x16\xc7\x51\x4d\x80\x45\x0d\x42\x26\x90\x99\xc3\x42\x51\xf6\xcb\x6a\xb4\x45\x31\x48\x78\x28\x54\x75\x4f\x5c\xc4\x12\xed\x18\x96\x33\xed\xb0\xd8\x48\xd7\xe8\x71\xbe\x2b\x28\xc5\xd9\x6d\xca\xc4\x98\x2d\xb7\x86\x85\x71\x39\xb9\x18\xd9\xd5\xea\x08\xcc\x05\x74\xa9\x15\x11\xcd\x64\x60\x65\xfb\xdc\x7c\x93\x81\x61\x94\x71\x80\x8d\x2f\x06\xba\x28\xda\x53\xc2\x9e\xc4\x75\x56\xd8\x73\x03\xf4\x1d\x83\x65\xe6\xc9\x7e\x33\x8f\x28\x44\xd8\x2f\xa5\x03\x64\xe3\x0b\xd5\x5b\xbb\xd6\x51\x60\x6a\x1f\x37\x74\x18\xce\xda\x75\xa2\x37\x8b\xe2\xb4\x9e\x67\xfd\x1c\x6e\x53\x6c\x66\xbb\x8c\xe3\x20\x5e\x37\xf1\xdb\xe0\x04\xef\x97\x2c\x21\xa0\x3a\x92\x9f\x56\x0b\xb5\x40\xc2\x11\xe8\x43\x30\xd4\x19\x65\xbe\xb6\x92\x35\x39\x0b\xc6\x0d\x78\xe4\xd5\x23\x59\x0f\x39\x3c\x12\x8b\x56\x36\x44\xca\xdf\x30\xcb\x79\x64\x65\x2e\xb0\x6c\x7d\x41\xec\xd6\x71\x70\xe0\x48\xce\x40\x6d\xa1\xc4\x57\x8b\xac\x4c\x4b\xb4\xde\x13\xf1\x8e\xc2\x52\x05\x53\xe6\xf9\x6e\xc7\xd0\xf2\x48\x70\x1b\xd9\x4a\x24\xa3\xb0\x4e\xe8\x8e\xb3\x76\x0c\x5e\x40\x92\x06\x2d\xe9\x26\x88\xab\xda\x0c\xd3\x51\x4b\x15\x8b\xa5\x05\x2d\xd6\xcc\xee\x24\x6d\x40\x18\x56\x0d\xc2\x84\xb0\xb9\xbc\xe2\x65\x2d\x95\xaa\x44\xcb\xb0\x99\x52\x38\x8a\x53\x76\xc3\x32\x5e\x54\x8e\x94\xa4\x12\x91\x0b\x1e\xa7\x4e\x1d\xcf\x89\xf9\x72\xaf\x12\xf5\x49\xf5\x39\xd0\xc6\x4a\x94\x55\x29\x5c\x81\x8f\xc5\xa1\xb0\x0e\xdd\x34\x2b\x7a\xa8\x92\x54\x76\x25\x6a\xab\x6a\x48\x13\x47\xa7\x17\x53\xa7\xe1\x2b\x72\x84\x39\x53\xe0\x70\x31\xa6\xd4\xd1\xc3\x9b\x4a\xda\x9f\x9c\x4d\xcf\xd7\x84\xcf\xfb\x2d\xb8\xdf\x84\xf5\x21\x85\xc2\x43\x05\xb6\x45\x5e\xe6\x3b\x60\x40\xe5\xe5\xba\x43\xd2\x68\xd5\x25\xf2\x41\xda\xcd\x25\x0a\xc5\xf7\x36\x88\xed\x7a\x9e\x81\x43\x31\x76\xa8\xc3\x48\x67\xb1\xaa\x13\x51\x2c\x20\x64\x67\x1c\x20\xd4\xa7\x5a\x0b\x06\x89\x35\xc1\xe8\x09\x23\x12\xac\x96\x72\x40\xb2\x1f\xca\x55\x51\x07\x8c\x15\x27\xd5\xec\xb4\x28\xb6\x94\xb0\x58\xc6\x1c\xad\xd0\x38\xc0\x2a\xfd\xbe\x95\x6c\x13\x3d\x70\x64\xb2\x1a\x44\xa3\x63\x25\x58\x8f\x48\x64\xc4\xb3\x2d\x83\x9d\xc0\x34\x02\x4b\x7a\x8e\x36\xe5\xb1\x02\x18\x3a\x93\x44\x03\x70\xf7\xb8\x38\x53\xb5\xc1\x4f\x88\x18\x82\x9d\x82\x89\x26\xb5\xb2\x61\xa6\x2f\xac\x42\x9b\x0a\x99\x2c\xd2\x46\xf4\x3b\xcc\x1e\x51\x18\xa3\xfb\x6e\x25\x8a\x1d\x88\x90\x3d\x4a\xea\xf3\x13\xc6\x59\xb3\x65\x84\x4f\x99\x57\x81\xee\x6e\xbd\xa3\x0a\x89\x74\x9a\xb9\x3c\xb7\x3a\x6b\x8f\x93\x88\x58\x86\x67\x10\xc2\x13\xec\x07\x07\xb1\x6b\x55\x40\x0c\xa3\x1c\x13\xe1\x70\x5d\xab\x12\x2f\xf7\x94\xb0\xd0\x16\xa2\x8f\x8c\x9b\xca\x57\x8f\x90\x8f\xf1\xb4\x95\xb8\xe5\x6e\x6e\x48\xab\x0d\x7f\x54\x74\xd1\xb7\x8f\xa7\xcd\x82\x77\x56\x90\x45\x0a\x98\x31\xad\x07\xcd\xf6\x17\xea\xe0\x97\x8e\x0a\x01\x23\x07\xbb\xce\xc1\x2c\x22\xb6\x60\x8f\xeb\x30\x3a\xe4\x40\x21\x0c\xd6\x9c\x32\x48\x59\x27\x9c\x83\x38\x6c\x25\xc9\x96\x65\x66\xd1\xc6\x53\x37\x40\x84\x6e\xcc\x44\x88\xe2\x01\x9b\x44\x63\xed\xe4\x1f\x50\x9d\x42\x04\x74\x17\x24\xa5\x7d\xaa\x3d\x57\x71\xa8\xa3\x07\x99\x4c\x6a\x27\xe0\x8e\x12\x9c\x76\x6c\xe5\x06\x1a\x0b\x65\x58\x4e\x50\xd7\x54\x4b\x39\xdf\xed\x9c\x06\xa2\xf4\x93\xc3\xf9\x1b\xa1\x90\x80\xa1\xc4\xd0\x64\xda\x75\x8a\xb4\xb2\x06\xa2\xf7\x73\xc6\x9d\xe4\xda\x81\x8f\x8e\x43\x8d\xba\x26\x84\x5b\x07\x3b\x51\xc6\x86\x69\xf8\x44\xed\xe1\x55\xac\x9a\x7c\x76\xd8\x99\xaa\x7c\xf0\xf1\x06\x3e\xb4\x0e\x46\xd8\xa7\xba\x11\xa5\xdc\xdc\x38\x1c\x4c\xe5\x9c\x10\x25\xb9\x98\xec\xf4\x3c\x4c\x4e\x71\xd3\x00\x45\x52\xaf\x11\x20\x67\xb1\x9e\x80\x44\x7e\xbb\xcb\x64\x29\x61\x96\x0c\x37\x96\x2b\x07\xb1\xd8\x0c\xe3\x26\x8b\xc1\x5a\x86\x2c\x76\x25\x1d\x46\x9e\xe7\xce\x97\xa8\x4e\xf9\x9b\x98\x3c\x86\x1b\x65\x7f\xca\x9d\xc5\xca\x0c\xa7\x39\x88\x9a\x1a\xe1\xae\x34\x5c\x05\xa2\xc6\x77\x51\xb9\x55\xc5\x52\x21\xf7\xbb\xec\x34\x4b\x67\x84\xb3\x60\x79\xc7\x60\x14\x71\x30\x92\x03\xc2\x50\x18\x5a\x4b\x25\x12\xce\x17\xc7\x56\x52\x05\x4f\x0d\x8d\x18\xa3\x39\x8e\x37\x50\xa0\xcb\x8e\x63\x66\x91\x7a\x5c\x10\xf2\x0a\x65\x94\xa3\xcc\x2f\xdb\xb9\x9a\x16\x3c\x2c\x6e\x8e\xc2\xb6\x74\x64\x91\xcc\x8b\x79\x21\x6f\x97\x16\x0c\x37\x1a\xa5\x44\xd6\x44\x89\xd4\xd8\x55\x6d\x3a\x0b\x99\x45\x38\x47\xa4\xa2\x5a\x6f\xda\x4d\x6e\x01\x73\xe6\x44\x18\x47\xce\xdb\x3b\x46\x79\xdc\xf2\x4b\x8a\xae\x3a\x78\x03\x8a\xe2\x69\x4f\xc7\x66\xca\x35\x15\xb6\x9a\xe1\x0a\x6b\x9e\x46\x75\xab\x97\xfb\x82\x25\xb6\x24\x4b\xc5\x1a\x8a\x0e\xb6\x12\x16\x0e\xe3\x4e\x89\x20\xa6\x5b\x84\x6f\xe8\xa4\x8c\xd5\x88\x8f\x9b\x71\x5a\x98\xc3\x6c\x6e\x21\x6b\xe9\x18\xd9\xd8\x91\x38\xf5\xf5\x31\x3e\x29\x73\xa0\x8a\x24\xbb\x56\x43\x89\x48\xf7\x93\xd8\xb8\xce\x86\x63\xa2\x81\xc1\x50\x4f\x9b\xd7\x38\xe9\x74\x35\x84\xad\xe6\xd5\x31\x9c\xd8\xdd\xca\x8e\xb4\x82\x2a\xd3\x29\xdf\xab\x00\x42\xdb\x88\x99\x91\x35\x4c\x92\x30\x6e\x77\x86\xdf\xe3\xf4\xc1\xee\xfc\x02\x3d\x94\x44\x50\xd8\x0d\xb9\xa2\xec\x68\xcf\xa0\xbd\x8b\xcd\x28\xf8\x24\xa0\x06\xa3\x8b\xa7\xb5\x40\x6d\xf2\x6d\x77\x58\x73\xe0\x38\xac\x6b\x66\x84\xc2\x69\x66\xf1\x24\xbe\x42\xe1\x39\x61\x71\x4d\xce\x22\xb6\xb3\x3b\xc2\x2b\x89\x36\x00\x76\x17\x64\xb1\x76\x22\xf7\x32\xe3\xa8\xb6\xcb\xf8\x03\x63\xcf\x36\x71\x84\x09\x6e\x77\x98\x35\x4d\x62\x1d\x16\x82\xa7\x1d\x67\x42\x8d\x1d\x0b\x4d\xdf\x81\xa9\x6e\x4e\x83\x27\x8b\x4b\x6c\x36\x80\x39\x34\x2c\x0b\x48\xed\xe0\xb2\xcb\x17\x85\x2c\xd6\xb4\xb7\x0a\x62\x54\x3d\x28\x2d\xc8\x2e\x8e\x4e\xd1\x9a\xe0\xd2\xac\xaa\x8a\x60\xf0\x90\x1c\x43\x72\x6f\x1d\xc9\x1e\x56\x67\x73\x2a\xce\x05\x66\x81\x3b\xf9\x1c\x50\xba\x46\x5f\xf9\x93\xa9\xe0\xeb\xd5\x2c\x8e\x4d\x46\x49\x67\xdb\xf5\xd0\xcc\xbc\xb2\x38\xa8\x5c\xc7\x94\x32\x63\xa5\x0b\x5f\xce\x96\x8e\x7f\x58\x4c\xf3\xa3\x5a\x14\x34\x78\xa0\xb5\x15\x30\x4b\x09\xc7\x93\xe8\x62\x69\x08\x8d\x55\xe1\x48\x2b\x98\xb9\xba\x3a\x10\xd6\xde\xcd\x07\xa6\x1f\xcd\x5d\x6a\x24\xfd\x51\xc3\x47\xfe\x80\x41\xea\x69\x15\xb9\x3c\x3d\x79\xab\xcd\xc4\x2d\x76\x81\x26\xd2\xc0\x56\x6b\x19\x04\xf1\xf7\x38\x62\xd2\x8b\x8a\x40\xaa\x6e\x67\x98\xb4\xb6\x27\x09\x94\x03\x7d\x14\xe8\x57\x80\x3f\xab\xa0\xe5\x41\x30\xc9\xb6\xcc\x32\x05\x44\xec\x30\xc8\x85\x39\xc1\x61\x33\x88\xa7\x66\xf4\xdc\x8e\xd7\x7a\x0e\x41\xd6\x5e\x64\xb9\x0a\xd3\x69\x8b\xd9\x11\x44\xc6\x31\xd2\x66\x95\xf1\x76\x39\x96\x34\x5f\xaa\x91\xa4\xce\x70\x7b\xd9\x65\x04\xb8\xc0\x92\x1d\xd3\xea\x56\x6f\xa4\x2c\x46\x77\xe9\x34\xf6\xc3\xa4\x25\x59\x86\xd5\xdb\x69\xa4\x9b\xe1\x44\x4b\x9d\x85\x89\x21\x66\xf7\xa9\x42\x2e\x71\x7a\x2d\x78\xa2\x3c\xd3\x18\x78\x4f\xa2\x1c\x13\x8c\xca\x71\xe5\x2c\x58\x81\xc3\x96\x68\x25\x08\x8c\x95\x36\xa7\x6a\x41\x4a\x38\xe3\xec\x45\xe4\x60\x31\xc8\x9e\xe1\x52\x40\x83\x2a\x3d\x5c\x3a\x4c\x76\xa0\x01\x9d\xd8\xe2\x81\xb3\xa7\xb5\x58\x58\xec\x66\xeb\x7c\x03\x37\x2a\x20\x69\xdb\x35\x3a\x85\xe6\xca\x3f\xd9\x20\xce\xd5\x44\x4a\x0b\x16\x95\x0d\x88\xb6\x39\xf1\x4c\x69\x60\x86\xd9\x65\x78\xbf\xdd\x80\x12\x4d\x9c\x20\x05\x8e\xa1\x21\xae\x69\x6f\x61\x77\xd0\x4a\x25\x47\x03\x8b\xa4\x12\xe3\x8e\x65\x6c\xac\x21\x1b\x1a\x04\x09\x32\x52\x62\x8a\xa2\x2a\xc9\x24\x8f\x3f\xb6\xa7\xa4\x8a\x9c\x38\x3f\x3a\x4e\xba\xa4\x36\xab\xcc\x27\xc1\x35\x47\x2f\x95\x8d\x64\x6c\xe4\x4c\x62\x77\x72\x21\x9e\x98\x34\x6d\xda\xf8\x40\x35\x44\xe4\x96\xe9\xd6\x1d\x03\x0c\x47\x7c\x1b\x2d\x35\x13\xce\x29\x75\x67\xad\x10\x9b\x2e\xd1\x15\x0e\xda\xc5\xf1\x84\xd6\x34\x87\x8b\xd6\x46\x9e\xc0\x46\xce\x4e\xe8\xc8\x02\x8a\xb8\x1a\x56\x28\xd0\x10\x54\x4a\xea\x20\x99\x0f\x4b\xd2\xc0\x9c\xc2\xc5\x91\xa9\x72\xbb\x4c\x09\xe5\x01\xd7\xda\x01\x42\x6b\x9d\x34\x2c\x7b\x62\x91\x89\x1b\x56\x49\x65\x1e\x07\x56\xb0\x24\x5b\xd5\x39\x20\x5e\x14\xdd\xbc\x2d\x7b\x67\xee\x79\x32\x43\x93\x50\x8c\x91\x8a\x94\x14\x95\x18\x1e\x32\x62\xd7\xcf\x17\xab\xba\xcb\x2a\x03\x85\x34\x38\xd9\xec\x98\xd2\x72\x59\x69\x3d\x1d\x68\xab\xa1\xd5\x18\x62\xdd\x43\x3f\xe3\x07\x9e\xc5\x36\x15\xc1\x30\x4b\xa1\x41\x16\x9e\x34\x2e\x63\x4f\x8a\xa1\x8d\x5a\xed\xea\x9d\x19\xe7\xb9\x65\x0b\x31\x37\xb7\x8d\xd5\x3e\x40\xd6\xc8\x71\xb3\x5e\x86\xcc\x71\x48\xf9\x7c\xb1\x07\x53\xd2\xe0\x30\xcb\x06\x8b\x05\xbe\x43\xa6\xde\x46\xe7\xa8\xe7\x11\xab\x92\x86\x0f\xa4\x89\x4e\xbd\xed\x41\xbe\x07\x71\x25\xa0\x6c\x38\x96\x4c\x24\x80\x33\x0a\x2b\xdb\xb7\xab\xcd\x69\x89\x43\x56\x16\xc8\x47\x63\x0f\x20\xa4\x19\x92\xd5\x41\xae\x8e\xf6\xa1\xb1\xb3\xbd\xdb\xba\x39\xa2\x02\x76\x61\x80\x6c\x8b\xb6\xa7\x30\xa3\x45\x0b\x59\x89\x32\xce\xd6\x92\x2a\xf1\xe6\x84\xad\x89\xde\x4e\xc8\x15\xb4\x62\x43\x09\x68\x55\x13\x87\x61\x73\x06\x6d\x7a\xc8\x9a\x53\x6b\x44\x2e\x8d\x19\x9f\xc9\x7a\xc9\xec\x57\x6a\xd4\x8f\x53\x26\x24\xc4\x96\x0f\x7a\x42\x9d\x9b\x3b\x91\x71\x80\xb0\x70\xe9\xb9\x56\xe0\x6b\x68\x5b\xcc\xfc\x5c\x24\xe2\x41\x62\x67\x98\xc9\xaf\x7a\x8d\x42\x97\xce\x8e\x44\x64\xac\x91\x56\x7e\xc8\xf4\x73\xa6\x97\xd3\xb1\x5a\x99\xcd\x9e\x23\xd6\x10\x1d\x8c\x11\x8f\xcf\xa1\x53\x8e\xa9\x3e\x1b\x36\xb3\xd3\xa6\xa1\xc5\xb5\xae\x9e\xf6\x47\x77\xa5\x27\xb5\x04\x57\xad\xd1\xb6\xa4\xa7\xf3\x73\xd6\xa7\x66\xa9\x5e\x1e\x43\x19\x8b\x8c\x74\x48\xe3\x94\xd6\xd2\x86\x5f\x9f\xd6\xce\x66\xa7\x32\xb0\xce\x2d\xb8\x36\x5e\x2c\x54\xc0\xdb\xa0\x70\x96\x54\xbe\x2c\x1b\x5b\x71\x75\x2c\x98\x05\x79\xa0\x32\x07\x9c\xd7\x56\x30\x1a\xc3\x3c\xc6\x16\x27\x69\x0b\x46\xcc\x60\x2a\x22\xe6\x85\x00\x4f\x29\xe9\x38\xaa\x58\x63\x34\xfb\x6d\xce\x98\x3e\x3c\x07\x1a\x89\xe0\x35\xa3\x55\xe9\x6e\xec\xad\x26\x4c\x09\x82\xb1\x41\xde\xb4\x33\x93\x82\x28\xb0\x30\x42\x92\xe4\xd4\x70\x11\x98\x98\x39\xb0\x6e\xe0\xaf\x4b\x38\x53\xbc\x0a\xb1\x02\x84\xc3\xbc\x5c\xd7\x2d\xad\x13\x4a\x39\x63\x17\xab\x1d\x99\x71\xfd\x16\xd4\xfa\x09\xdd\x57\x47\x1a\x4c\x74\xd0\x1e\xc9\x5c\xe4\x56\xf2\xb8\xac\x57\x27\x4f\xf0\x90\x6d\xbc\x72\x00\xd4\x51\xcc\xc1\xc0\x8b\x71\x75\x2a\x20\xc7\x2e\x06\x98\x3a\x1d\x7d\x88\x44\x91\x00\x1c\xda\x41\xa2\x8e\x38\xa7\xda\x4a\xb0\x1f\x84\x6d\x2e\x8f\x8b\x9d\xea\x4d\xf3\x91\xd8\x2e\xed\xf5\x98\x03\x7c\xde\x40\xbb\x06\xb1\x4e\x80\x79\xea\xdc\x09\x58\x66\xf4\x7a\x33\x06\xc9\xa9\x81\xe1\xba\xc1\x95\xce\x90\x70\x10\x9a\x48\xf4\xb8\xed\xab\x53\x4a\x92\x03\xd8\xaf\xe8\x0e\xc8\xb9\xba\x73\x03\x6a\x3c\x02\x33\xda\x88\xfb\x86\x9a\xdb\x08\x50\xc9\x23\x5e\x29\xad\x42\x15\xd2\x54\x4d\xa3\xb6\x37\x72\x55\x87\x0b\x7b\x05\x23\x6e\x14\xe0\x3c\x6a\x1c\x66\xfa\x41\x06\x76\x35\xc3\x38\xe2\x66\x0d\x6e\xbc\x08\xd3\x4b\x7a\x01\xf9\x96\xe0\x9f\x24\x80\x84\xed\xc1\x85\x11\x4b\xf6\x56\xc2\x1a\xe2\x18\x54\x62\x36\x68\x76\xaa\xcb\x13\x34\x43\xf1\x01\x8a\x63\xbf\x61\x39\x5a\xac\xba\xd9\xce\x2a\x89\x65\xa1\xea\x11\xd8\x96\x08\xeb\x39\x24\x1b\x8b\x35\xea\xef\x52\x74\xaf\x46\x5b\x8b\x58\x23\x5e\xd8\x19\x49\xe1\x1a\xcc\x71\x0b\xef\x17\x05\x2b\x75\xe4\x82\x96\x71\xd2\x9c\xb6\x2b\xff\x90\xd1\x09\xba\xf5\xcc\x41\x71\x6a\x2e\x35\xb8\x91\xc9\xc6\x50\x88\x98\x68\xc1\x69\xec\xa2\x9c\xf5\xe9\x9c\x19\xe5\x56\x6e\x17\x85\xb0\x96\x67\xd2\x2a\x6b\xfc\xe9\x78\xda\xd9\x27\xdb\x23\x20\x37\xcf\x84\x31\xf3\x4b\xc1\x3c\xb6\xa2\x32\x1d\x57\x9a\xb8\x2f\xbc\x10\x24\x2d\x5d\x07\x70\xac\x49\xe6\x1b\x5c\xdd\x35\x46\x52\xf4\x39\x81\x2c\x76\xa4\x87\x8a\x2b\xaa\x37\xcd\xb5\x95\x63\x7d\x82\xed\x8e\x04\x5d\xce\x13\x1c\xb4\x3b\x70\xe2\xb3\x10\x46\x49\xaf\x09\xa7\xac\x76\x50\x9a\x0b\x51\x41\x89\xc8\xa0\xc0\xa6\x74\xa3\x11\xdd\xf1\x30\x1f\x09\x1c\x9c\xb5\xa6\xd8\x4f\x0d\xd4\x6c\x32\xc1\x65\xe7\x1c\x2e\x2c\x6c\x0d\x5c\xf4\x55\x82\xea\x74\x4f\xec\x00\x42\x58\x8b\x49\xec\x83\xf6\x81\x3a\xf5\x45\xd6\xfb\x80\x5d\x8b\x02\x06\x5a\x68\x2f\x5b\x94\x93\xb4\x32\x3e\x29\xf2\xd1\xb5\x58\xbf\xb3\x54\x4a\xb3\x61\x4c\x6b\xa8\xad\xb6\x1c\x84\xf9\x22\x62\x94\x41\xb2\x66\xb3\xa8\x62\x9c\x74\xc5\x1a\xb5\xc5\x6f\xd6\x87\xfd\xb1\x87\xf1\xb0\x3a\x21\x6b\xbd\x5b\x1f\xd3\x95\x42\x2b\xc8\x91\xd9\xa4\xc4\x08\x91\x01\xc3\x1c\xda\x55\x38\x80\x61\x18\x52\x14\x8d\xab\xd3\x11\x5e\xf6\xd8\x41\x5c\x0b\x91\x8c\x85\xe3\x81\x12\x30\x38\x98\x55\xad\x21\x75\xcd\x06\xc1\xb4\x61\x88\x06\xa2\x9c\x77\xdb\x83\x1f\x17\x2b\xbd\xe0\xd6\x94\x7e\x30\xc6\x55\xe6\x91\xf9\x51\xc6\x96\x79\xef\x16\x6b\x54\x3f\xa4\x5c\x46\xed\x75\xc7\x67\xa6\x8d\x99\x1c\x18\x8d\x8d\x8e\xdd\x91\x99\xf2\x15\xba\xac\x29\x09\x40\xf9\xda\x4f\x88\xcd\x41\x0e\xd1\x6a\x63\x91\xd5\x12\x8c\xf7\x4a\x58\x06\xaa\xaf\x85\xad\x82\xaa\x74\x88\x0a\xa8\xd4\x29\xad\xb0\x15\x0b\xdf\x90\x49\x3b\xc3\x63\x19\x83\x6b\x1c\x3a\x76\xa0\x09\x1d\xb5\x83\xb8\x81\x0f\x50\x4e\x55\x22\x21\x9e\x88\x41\x65\x2a\x72\x5f\x2e\x4a\xa7\x36\x3d\xeb\x94\x24\xeb\xc3\xb2\x6e\x11\x57\x64\xe3\xc1\x52\x1d\x9d\xd5\x06\x96\x88\xe4\x2d\xa9\x02\x60\x31\x55\x79\xa0\x35\xfd\xda\x5b\xa1\x72\x83\x79\x4b\x2b\xe3\xea\x32\x55\x51\x52\x1e\x95\x75\x8b\x91\x99\xbc\xae\x04\x43\x19\x94\x7c\x25\xe7\x59\x30\xd0\xb9\x71\x52\xd5\xc4\x29\xd0\x5d\x4a\x00\xee\xa9\xde\x88\x02\x5c\x45\xe8\x2a\xf6\xc4\x8e\x23\x74\x1f\xb1\xeb\xfd\x7e\x50\xd6\x8a\x17\xe9\xca\xe2\xa8\xa9\x56\xbd\x75\x49\x89\x13\x88\xb6\x1b\x8f\x59\x64\x8f\x59\xca\x83\xdb\x98\x0b\x0b\x72\x11\x5a\x9d\x4c\xc3\xe8\x89\xc2\x41\x0d\x9d\x2c\x20\x6c\x7b\x0a\x0c\x76\x1e\x59\x53\x40\xa8\x45\x53\x37\x75\x02\x4a\xaa\x35\x0c\xa1\xf3\x23\x45\x8d\xc0\x8e\x5a\x50\x94\x1e\x69\xc9\x6a\x99\x8c\x82\xbe\x84\x17\xfe\xb6\x56\xa4\xf2\xd8\x51\x06\xdb\xe6\x7a\x69\x6f\xe8\x22\x61\x9d\xdc\xc8\x40\x5e\x58\x9b\x68\x18\x11\xc4\x0e\xc5\x76\x4d\x36\x07\xb1\x4d\x17\x1c\xe1\x7e\xb6\x81\x53\x53\xf5\xe3\x50\xdc\x29\x32\xc6\xaa\x56\xca\xfa\xe6\xb4\x24\xfc\xa4\x3c\x96\x25\x6b\x8e\xc9\x3a\xb2\x48\x25\x60\x31\x17\xf1\x7a\x41\xdb\x9a\x3e\x54\x6a\x60\xb1\x46\x09\xdd\xd4\x95\x20\xc3\xd1\xa1\xc8\xf0\x3d\x5f\x35\xac\x03\xc9\x5e\x68\x70\x8e\xbc\x51\x12\xdf\x3f\x72\x9c\xd2\xd9\x91\x42\x1e\x67\xee\xd2\x98\x8d\xa5\x40\x30\x1b\xb6\x3e\x9d\xf2\xc0\xdb\xa8\xb1\xdc\x57\x8d\x2a\x07\x20\x27\x36\xb2\x99\x1d\x3a\x9e\xf7\xcb\xf9\xdc\xa7\x18\xd6\x6c\xa9\x4c\x44\xe6\xc4\x46\x55\x51\x4a\x10\xab\x1e\x50\x70\x60\x7d\x70\xb9\x4c\x84\x67\x1a\x12\x50\x44\x32\xe0\x44\x63\xed\xa4\x55\xb2\x83\x79\x33\x83\x78\xb1\xea\xbb\x2c\x3c\xa6\xcb\x96\xcd\x8d\x7c\x85\x19\x66\x9a\x61\x0b\x38\x58\x40\x47\xa9\xc4\x8a\xa6\x5a\x05\x7c\xd7\xe5\x68\xb5\xf0\x87\xe3\x01\x6b\x80\x49\x3c\x35\x7a\x57\x33\x86\xec\xe3\xb6\xa8\x6c\xe6\x0b\x7c\xb1\x77\xb6\xf4\x71\x01\x71\x4d\xe7\xd9\xce\xac\x5d\xcb\x82\x9c\xb3\x9e\x5a\x56\xc9\x69\xb7\x58\x13\xeb\x93\x57\x30\xf2\x91\x5d\xe6\x30\x35\x47\xad\x06\xb2\xf5\x48\x58\xb8\x8a\xb8\x9b\x6c\xae\x30\x5b\x77\xe8\x21\x96\x73\x86\x69\x8f\x7a\x27\xb1\x81\x79\xbf\x76\x93\x10\xdf\x24\xa1\xed\x43\x43\x3c\x91\xd6\x32\xaa\x91\x39\xe6\x8e\xfc\x71\x6e\xa6\x9d\xe5\x2b\x9a\x42\x51\xee\xa2\xc8\x56\xf5\xb8\x95\x65\x88\xd8\x32\xe9\xe0\x44\xb3\x0d\xeb\x03\xd0\x86\x22\x9c\x09\x5a\xa6\xb8\xba\x25\x01\x52\x68\xad\xba\x58\x6f\x7d\x60\x2a\x2a\xd0\x3c\xa4\x30\xd7\x28\x61\x0f\x0d\x72\xc9\x8f\xad\xbe\x2e\x6c\xab\xcb\xcb\x89\x23\x52\x4e\x28\x36\x7a\xc5\x96\x52\x8f\x30\x38\x96\xb2\xfb\x65\x6a\xd6\x9c\xbc\x17\x48\x78\x4d\x0c\x60\xe5\xf0\x61\xbd\x04\x64\x14\x59\xf8\x6a\xca\xfb\xd9\x20\x28\xdc\x91\x8e\x22\x56\xb3\x64\x44\xf2\xe1\x32\x4f\x68\xb9\x86\x56\x19\x62\xcc\x43\x50\x24\xe2\xf5\xa2\x69\x68\x50\x6f\x42\x7a\x8b\xb9\xb2\xef\x2c\xdd\x05\xb1\x49\x75\xae\x8d\x75\x66\x92\xa9\xa6\x3a\x68\x11\x76\x98\xb7\xfc\x21\xb0\x24\x65\x28\x92\xf9\x11\xa2\xd7\x60\xda\x8e\x80\x18\x82\x1a\x30\x1e\xf3\xa0\x68\x7a\xb0\x67\x22\xb7\x47\x0f\x34\x45\x29\xa6\x38\x75\xd2\x09\x9b\x35\x0d\x1e\xac\xc0\x2d\x94\x7b\x9a\x9f\x12\xb4\x8b\xca\xa7\x5e\x57\x4e\xe8\x61\x81\xaf\x45\x11\x91\x56\x93\xca\x8a\x83\x28\x0b\xaa\xc5\xda\xcc\x31\x26\x72\xd7\x56\x91\xcd\x1c\x6e\x1a\x95\x6e\x1a\xbb\xe8\x70\x73\x1d\x41\xc4\x32\xda\xa1\xb0\x16\x69\xa6\xd3\x9f\x2a\x87\xdf\xea\x03\xed\x09\xba\x36\xe1\xfb\x39\x08\x85\x1c\x1f\x2a\xc5\xae\x39\x81\x3b\x85\x80\x45\x8f\x98\x8b\x0b\x75\x18\xa9\x29\xc2\x96\x13\x14\xce\x39\xc5\x15\x58\x1d\x6f\xd6\x0a\xed\xb4\x75\xb2\x26\x15\x6d\xe5\xb0\xf8\x7c\x26\xc6\x74\xa8\x56\x88\x1c\xb6\x2d\xdc\xcd\xe9\x7c\xde\xec\x67\x6b\x25\x17\xd6\x38\x87\x03\xd1\xb4\x15\x78\x9b\x6f\x94\x55\xef\x2d\xa4\x7a\x41\x9e\x16\xaa\x05\x41\x24\x06\xfb\x88\xec\x94\x83\x51\x75\x58\xd5\xe5\x04\x9b\x51\xec\x56\x3e\x1c\x91\x74\xd3\x5b\xa9\x17\x99\xcc\xcc\xa0\x35\x94\xf2\xba\x85\x45\xf1\xb3\xa3\xc0\x8f\x3c\x35\x3b\x8a\xb4\x35\xa7\x16\xea\x9a\xad\xf0\x63\x7e\x22\x66\xcb\xe5\x6a\x54\x25\x33\x08\xa7\x93\x22\xe9\x4d\x45\x5a\xb2\x6e\xb8\x23\xdb\x58\x12\xcf\xee\xaa\x76\x6f\x71\xd6\xca\x3c\xb8\x20\xa1\x1c\xe6\x13\x96\x2a\x3e\x2f\x37\xf6\xda\x42\x42\xa5\xd7\xf1\x8d\x4c\x59\xc0\x9c\x54\x25\xc3\x23\x39\x9f\x3a\xec\x77\xd2\xfe\x14\x4b\xb8\x6d\xce\x77\x1d\x9c\xac\x6b\x7d\xc9\xeb\xbb\xfd\x49\x6f\xd2\x1a\x93\x4a\x4c\xea\xb1\xe5\x32\x2a\x0f\xdb\xe6\xb8\x4d\x66\xe5\x3a\xef\x7c\x60\xca\xbd\x59\x4a\xd2\x54\x8f\x56\xd0\x82\x77\xa1\x51\x55\x03\x8c\x0e\x42\xbd\x10\xb7\x0d\xd5\x2e\x20\x39\xc6\xe8\xc2\xda\xab\xab\xa0\x84\xfd\x20\xdf\x35\xa3\xd5\x9c\x32\xa3\xa4\xb1\x15\x89\xd8\x75\x52\xa3\xb4\x18\x23\x3b\x70\xb1\x76\x50\xcd\x43\x00\xbd\x76\xcc\x15\xee\x03\xa0\x22\x27\x9b\x4c\x8b\x23\x5e\x60\xa0\x49\xdc\x6b\x08\xbc\xd9\x29\xdb\x36\xc7\xcb\xe3\xc1\x41\x98\x16\xa9\x36\x41\x39\x86\x50\xbd\xef\x95\x9a\xf3\xa6\xa5\x5c\x1a\x2b\x7c\x60\xc0\x29\x5d\x80\x2b\x70\x29\xf9\x56\x35\x17\x01\x2d\xa9\xfd\x7c\x33\x05\xce\x74\x74\x96\x16\x75\x44\x54\x99\x99\xcc\x22\x4e\xf7\xcd\x30\x4d\xa3\xc2\x4d\x7b\xc2\xd9\x18\x88\x3b\x2c\x08\x43\xef\x3b\xc5\x17\xbd\x90\x24\x04\x6a\x6a\xb1\x49\x72\x60\x13\x96\x36\x88\xbf\xa5\xfa\xc6\x5a\xcd\x9c\x59\xb3\xda\x77\x6b\xa2\x04\xe7\xb2\x59\x9a\x83\x02\x30\x2e\xde\xf5\x6b\x8d\x01\x67\xf3\x9d\x1f\x73\xdd\x96\xa0\xc8\x44\x12\xad\xf3\x37\x5c\x2e\x75\x36\x69\x33\xe8\x71\x91\x01\x14\x53\x3a\x7c\xb2\x48\x4c\x01\x09\x02\x66\x9f\xa5\x65\x9b\x39\x8b\x85\x4a\x58\x60\xa1\x06\x52\x1f\x12\xb1\x3b\x0d\x13\xb0\x30\xfa\x39\x88\x50\xf8\xd8\x87\xa4\x24\xc6\x45\x22\xd3\xe4\x5c\xe7\xfd\x23\x0d\x98\x19\x56\x9c\x78\xf6\xa4\x00\x6a\x3b\xb0\x8d\xba\x8a\x23\xe7\x50\x11\xa7\x02\x5c\x6c\xe4\xd5\xca\x19\x0d\x69\xb3\xe4\xc7\x38\xdb\xcd\xd2\xc8\x42\x56\x3b\x44\xf4\x71\x89\x06\x54\x29\xc3\x09\x97\x2a\x42\x70\x77\x5c\x2c\x08\x93\x6c\x3c\x80\x58\xfb\x98\xd8\x01\x82\x8f\x53\x54\x1b\x99\x82\x16\xa9\x07\x02\x16\x5a\x63\x89\x1e\x22\x26\x92\xe7\x1c\x39\xb2\x7c\xc4\x11\x51\xb6\x1e\xcb\xf5\x61\x06\xe5\x20\xa2\x15\xbb\x02\xa2\x25\x90\xa0\x34\x1d\x10\xc0\xf4\x80\x69\xe5\x88\x98\x61\xea\x8a\x4e\x19\x8c\x1b\xde\xec\xf6\x68\xd2\x75\x74\xba\xec\x4b\x63\x96\x53\x50\xd2\xb0\x7a\x61\x6f\xbc\xf9\x4c\xa3\x11\x50\x9a\x41\x3c\x49\xc5\xbb\x40\x91\x8f\x04\x55\x6c\x4d\xdf\xf4\x7a\xa3\x6e\xba\x53\x68\xf4\x4d\xe4\x26\x0a\x18\x2e\x5a\xc3\x64\xa5\xf5\x0c\xc6\x77\xda\x04\xa3\xe4\x31\x4c\x63\x02\xa9\xf5\xae\x22\x4d\xb3\x3d\x90\x3a\x4f\xc1\x93\x05\xec\x19\x1c\x32\x00\x88\x31\xab\x85\x5f\xb2\x09\x3c\x88\xa3\x1e\x87\x59\x0a\xd2\xc3\xa9\xcc\x4b\x9b\xf6\xc3\x2d\xe0\xcf\x89\x90\xc3\x23\x20\xcf\xb0\xd6\x63\x21\x0d\x80\xe2\x1e\x19\x69\x6a\x1c\x7c\xad\x54\xc0\x68\x04\xf6\x5e\xd0\xcd\xc8\x34\x01\x09\x66\xde\x4d\xf5\xc9\x50\xe6\x1a\x8c\xf1\x44\x1b\xf0\x51\x47\xf0\x33\x50\x5d\x17\x4d\x14\xfa\x80\x8c\xaa\x26\x00\x41\x28\x0e\x31\x4b\x30\xa8\x75\x1d\xc8\x9d\xca\xd5\xd1\x34\x83\x6b\x1c\x11\x08\xf6\xe0\x0a\xea\x01\x3f\xac\xa2\xb5\xc6\xcc\x36\xa9\xdd\x1b\x6c\xb1\x2b\x70\x53\xee\x16\x89\x8a\xa5\x32\xa4\x86\x0b\xa0\xad\xa3\x0a\x9f\x53\x0a\xaa\xf3\xf1\x5c\xa4\x8e\xa3\x5d\x91\x01\x49\x53\x56\x03\xec\x6b\x3e\x46\x4c\x00\x8e\x6a\x62\x38\x01\x52\xb4\x2c\x59\x0c\x75\x96\x18\x6c\x58\xd0\x14\xb3\x12\x93\x44\xa3\x1f\xea\xce\x21\xf7\xf5\x54\x53\x8d\x25\xb2\x72\x04\xbd\x5f\xf8\x66\x62\x5a\xa3\xb1\xe9\x75\xab\x82\x57\xba\x7c\x08\xac\x7c\x45\x30\x08\x00\x54\x31\xce\x7b\x5a\x0d\x9a\x4e\xc4\x60\x92\xe5\xf9\x0c\x6f\x36\x44\xbe\x44\x38\x57\x1f\x64\x87\x05\xfe\x3f\xe6\xee\x5b\x87\x43\x6c\xcf\x0f\xf8\xab\x58\x5b\x79\x45\x41\x4e\x85\x0b\x72\xf8\x93\x33\x74\xe4\x9c\x33\x4f\x6f\xcd\xcc\xce\xf5\xdd\x62\xda\x95\x5b\x84\x90\x38\xd2\xf9\x85\xe6\xfb\x59\x4b\xe1\xae\xac\x45\x40\x27\xa8\x3d\x81\xd3\xfd\x24\x8d\x7c\xfe\xb8\x1d\xb3\xb8\xc0\x20\x26\xc2\x6f\x34\xec\xb8\x4e\x9f\x6f\x4e\xb4\x32\x6f\xd8\x65\x9f\x9d\xef\xef\x28\xa1\x22\x55\x5f\x0d\xa6\x37\x9c\xde\x43\x77\xc3\x75\x02\xf5\x82\x0a\x3d\xb8\x94\xc4\xd5\x1a\x7a\x63\x83\xda\x63\x46\x84\x5a\x18\x09\x16\xdb\xd9\xe2\xec\x79\xf3\xcd\xa9\x87\x4b\x7a\x22\x77\xe6\x73\x0c\x5f\x1f\xbf\x49\x09\x2b\xc0\xd0\x84\xf5\x10\x3e\x1b\xf1\xe7\xb3\xe3\xc5\xb3\x37\xd1\xf2\x9a\x90\x96\xbf\xd3\xf9\x70\x70\x26\x3d\x3c\x9f\x28\x30\x92\x01\xcc\xfc\x5c\xdb\xd5\xa9\x09\x2a\xb8\x1b\x99\xdc\x8c\xc3\x14\xb8\x8b\x89\x5c\x32\x69\x4b\xc3\x85\x69\x41\xe9\x5f\xe1\xf7\x68\x36\xe7\xa4\x59\x23\xa8\x4f\x46\xd0\xcd\x21\xa5\xcf\xc8\x1d\xc8\x9e\x1c\x7d\xd8\x68\x8b\x1c\x98\x94\x67\xef\xc0\x57\x5a\x26\xdd\xb1\x9c\x3d\xcd\x4f\xbb\x36\x9e\x5c\xc5\xba\x18\x28\xe2\x72\xa9\x4c\x9a\x52\x19\xac\x0e\x6f\x59\x45\xb4\x8b\xdf\x5c\xaa\x37\x7c\x1c\xf7\x2c\xaf\xff\xf8\x30\x39\x58\x72\x64\x80\x6d\x42\xd0\xcd\xc8\x8c\x48\x5e\x64\xb5\x26\x63\x42\xda\x3c\x36\x2f\x07\xd2\x35\x6c\xf2\x34\x7e\xb0\xee\x93\xd2\x0f\x0b\x6d\xb5\xac\x73\xc5\xf8\xdd\x25\x7d\xf5\x2b\x9b\xa9\x99\x26\xd7\xeb\x19\x35\x01\x66\x7c\x92\xa2\x3a\x13\xf4\xaa\xe6\x66\xe2\x99\x37\xc5\xe6\xf4\xec\xc9\xc9\x9a\x6c\x43\x03\x4b\x10\xda\xeb\xe3\x19\x17\xfb\xed\x38\x0f\x8b\x18\x77\xb2\x42\x75\xeb\x88\x4a\xac\x6d\xc0\x79\xaf\xa4\x40\xb7\x2d\x40\x38\x3f\xd4\x97\x96\x63\xe8\xda\x5e\xae\xbc\xb6\xab\xb0\x9e\xeb\x9a\x1e\x68\x40\xa9\x39\xcf\x33\x26\xe1\x2f\x94\xbe\x87\xca\x71\x0f\x86\xdc\xf7\x9e\x5c\x22\xdc\x03\xe8\x35\x5b\x90\x7c\x03\x5c\x19\x40\xdc\x09\x1a\x69\x46\x47\xb2\x50\x01\xad\x35\xa2\xe3\x67\x7a\x6a\xb6\x1e\x11\x3b\xa9\xb3\x13\x0c\x7b\x09\x39\x43\xe6\xf4\xf4\xc9\x25\xb3\x2f\x50\xb8\x02\x8d\x62\x1a\x58\x4c\xd3\x04\xb3\xa2\x54\xbd\x8c\x45\xb1\x0e\xce\xa6\x5e\x20\x6f\xd2\xce\x9c\x27\x34\x38\xdd\xf2\x2a\xdd\xce\xff\x06\xd6\x5c\x60\x84\xf3\x5c\xe9\x37\x26\xf7\x0c\x45\x76\x35\x7a\xb2\x44\x1d\xf6\xca\x24\x43\x70\x17\xd0\x31\x68\x04\x1e\xab\x31\x7e\x85\x2f\xc2\x46\xd6\x89\x04\x25\x4e\x44\x54\xf3\x8d\xd2\x68\x19\x71\x82\x82\x3b\x3c\x5c\x9f\xfe\x59\xf4\x1a\xb8\xfd\xed\x48\x33\xdd\x88\x87\xd7\x6f\x4d\x06\xe4\x12\x02\xe5\x94\xee\x97\x9f\x43\x64\x30\x60\xcc\xfa\x6a\x0b\x31\x34\x74\x54\xaf\xb5\xdd\xb6\x68\xf3\xa1\xcc\x95\x80\xd4\x89\xa4\x12\xe6\x26\xf2\x44\x33\x0f\xec\x9e\x8a\xa7\x14\x54\xec\x18\x0e\x62\x7c\x43\xb5\x09\x04\xb7\xa9\x3c\xb6\x0c\xf2\x64\x95\x78\xd2\x9e\x72\x36\x47\xea\xab\xde\x9c\xd4\x18\x33\x22\xe1\x28\xfb\x6a\x8e\x40\xbe\x76\x9f\x3b\xd0\xc6\x8d\x68\xda\xbd\x49\x84\x98\xc9\x28\xb4\x12\xa7\x8b\x1e\x64\x77\x64\x85\xb9\x1c\xca\xf7\x4b\x3d\x08\x94\xb1\x42\x55\xe7\xa5\xc8\xca\xa1\x4a\x98\x2a\x3c\x8f\x04\x00\x7b\x70\x72\xc9\x52\x8f\x98\xae\xbd\x84\xc8\x5a\xed\x83\xcb\x9f\xe1\x8e\xc8\x6b\xf4\x4f\xbe\x60\xa7\x9c\x05\xe4\xe3\xa3\x18\xf9\x38\x96\x45\x57\x5a\x80\x8c\x13\x7e\x36\xdf\x67\x7b\x8e\xad\x55\x3f\x5e\xb4\xd5\xbb\x4c\x61\xbf\x3a\x3d\xa8\x5b\x19\x7f\x92\x23\x8e\x59\x71\x8c\xda\xc3\xf0\x52\x3c\xa0\x6c\x14\x53\x05\x50\x8d\x8c\x9d\x39\x0a\x2c\x6f\x9a\x05\x1a\x2c\x74\x16\x5d\x79\x68\x34\x18\x98\x00\x44\xfd\x7e\x4b\xb4\xe2\x81\xbc\x52\x82\xde\x10\x02\x98\x51\xf6\x53\x34\x37\x42\x17\xd4\x99\x98\xe1\x28\x10\x4f\xa3\x13\xd1\x35\x4a\xbd\x13\xb7\x65\x21\xd3\x32\x3c\x53\x63\x8c\x09\xa9\x46\xfc\xda\xbd\xee\x02\x38\xd6\xc4\x23\xfb\x08\x76\x7e\x41\xfa\xf0\x52\xd6\x9a\x15\x89\xa6\x8d\x3c\xc3\x38\x40\x56\x70\x78\x67\x97\x34\x3e\x46\xac\x6b\x25\xf5\xd9\xea\xbc\x59\x8d\xf0\xb3\xa4\x48\x73\x4e\x9f\x8c\xbc\xd8\x89\xe2\x4d\x7e\xd5\x1e\x8e\xf1\xdf\x1a\x53\x44\x76\x7f\x6f\xbd\x95\x42\x0a\xcd\x3a\xb8\x8b\xc7\x57\x55\x13\xbc\x54\xef\xb2\x83\x7a\xc5\x2e\x5a\x41\xfb\xde\xf7\xdb\x34\xd2\x36\x74\xb4\xe6\xdd\x9b\x5f\xcb\x47\x95\x68\x6c\x36\xd8\x1a\xb5\x25\xa2\x7c\x43\x72\x4e\x03\x8f\x72\x36\xe1\x4b\xe3\x77\x9b\x25\x8e\x12\x11\x31\x03\x63\x53\xd3\x5e\xb0\xa7\xb2\x65\xe3\x82\x42\xb3\xaa\x29\x82\x2a\x9b\x37\xc3\xe6\x0d\x70\x27\xa7\xa7\xab\xe2\xcf\xdf\x56\x84\xf0\xd0\xd2\x18\xc6\x0e\x0a\x1b\xbc\x12\x82\x2b\x26\xf7\x8a\x44\x24\x0c\x73\xb2\x22\x25\x19\xa4\x75\x20\x45\xda\x3c\xe8\x4c\x02\x9b\x47\x39\x37\x7b\x46\xe3\xb2\x85\xce\x7d\x7a\xc5\x56\x90\x5e\x5e\xcc\xfb\xa2\xec\x40\xe5\x8e\x80\xea\x0f\x7a\xd1\x5a\x23\x01\x17\x20\x82\x06\x58\x05\x24\x7f\x6b\xd0\x3d\xc8\x07\xfe\x1d\x10\x90\x10\x60\x8e\xc2\xa3\x20\x34\x16\x4e\xfb\x40\x2b\x87\xe7\xaf\x20\x12\x46\x65\x83\xdb\x3f\x5a\xa1\xa7\x7e\x55\x9d\x58\x7f\x94\x2b\x0f\x19\x46\xa9\xaf\xd7\x4a\x56\x1c\xdc\xa0\xc7\x6c\x9b\xaf\x74\xc4\x08\xf4\xe8\x8a\xca\xfc\x7c\xaa\x92\x96\x9b\xd2\xb3\x06\x73\x76\x59\xc7\xae\x84\x94\x94\xd1\xa5\x81\x6f\x59\x44\x94\xb7\x91\x62\x6e\x14\x09\x17\xde\x13\x8c\x98\xb3\x20\x5a\x1a\x0c\xb8\x13\x0c\x38\xf2\x52\xf1\x05\xe3\x07\x3c\x14\x00\x35\x63\xd3\x5f\x52\x99\x44\xf8\x8b\x99\xfd\xfc\x69\xef\x18\x07\xba\x0c\x84\x99\x9a\x00\x9e\x8b\xed\x03\xd5\x8c\xbf\x9a\x9e\x6c\x16\xfb\x85\x54\xc3\xcf\x7e\x5d\x6e\xf3\xc5\xf9\x49\x7f\x65\x6d\x6e\x35\xf1\xf1\xdc\x5b\x69\x37\xf4\x16\xb8\xee\xbb\x73\x94\x33\xfc\x32\x87\x95\x47\x05\xe2\xab\x16\x66\xa4\x1d\x86\xdc\x9b\x32\xbd\x75\xc3\x8e\x92\x50\x6b\x99\xb3\x49\x5e\x35\xb7\x7c\xe8\x49\x3b\xd2\xcd\xe5\xf2\xea\x17\x22\x21\x88\x93\x32\xd2\xed\xb1\xc3\x5a\x08\xbf\x12\x4a\x68\x80\x15\x8c\x47\x4b\x67\x91\x78\xf3\x5e\x32\x74\x41\xc6\xe7\x62\x17\xbe\x12\x5f\x02\x31\x3e\x4b\xc4\xd7\x84\xef\xfd\xcf\x47\x5a\x6f\x47\x34\x9c\x0e\x0a\xf7\xcb\x5e\x81\x46\xf8\xf2\xae\x3e\x05\x80\x9d\x19\x84\xc4\x17\xcc\x09\x77\xd8\x90\x63\x2a\x3a\x3e\xd7\x97\xfd\x35\xaa\xa1\xbd\x5c\x14\x88\x0d\xef\x24\xf7\x1d\xa2\xc1\x6d\x43\xe3\x31\x5c\x7f\xc0\xb3\x06\xdb\x8d\xe7\x5a\x03\xce\xbc\xae\x80\xef\xfd\xb4\xd3\xeb\x27\xfc\x94\x7b\x72\xfb\xf0\x2b\x92\x51\x5a\xe1\x89\x7d\x1b\xa6\x9e\xe9\x63\x1c\xeb\xad\xc5\xca\x08\xcf\x19\x36\xe7\x82\x59\x9e\x56\xae\x6d\x8d\xcb\x10\xe3\x10\xea\x09\x0a\x77\xe8\xd1\x43\xba\xc2\x16\xad\x7f\x16\x4e\x93\x9f\x1c\x20\xc8\x62\xd0\xf3\xd6\x24\x22\x62\xa9\x16\x09\x29\xc5\x0b\xd5\x66\x99\x0c\x7a\x82\x41\xd0\x4d\xa2\x94\xb3\xf9\x9f\x25\xeb\xd0\x29\x15\x02\x57\x10\xd2\xe7\x57\x90\xe2\x97\x2a\x97\x2e\x3f\x49\x2e\x46\xda\x68\xc1\x2f\x77\xb2\xc5\x49\xbc\xe2\x1d\x52\xbc\xb6\x00\xad\x9f\xa4\xcc\x3d\x9c\x1b\x95\x28\x86\xb5\x0d\x07\xfb\xe4\xe5\xe7\x67\x7e\x29\x76\xa5\x06\x74\xc1\x23\xa4\x50\xda\x10\x42\xba\x8e\xcb\x39\x8b\x75\xec\xa4\x62\xe0\xc5\x07\xea\xed\x65\x85\x7c\xf2\x0a\xf7\xf6\xd4\x5a\x98\xef\x2e\xbc\xae\x31\xf4\x23\x8e\x4d\x45\x8c\xc6\x6f\x7b\xe1\xae\xdc\x8e\xab\x84\x2e\xbd\xa1\xf1\x0a\x00\x78\xc0\xa6\x81\x1f\x43\x75\xde\xc9\xc9\x84\x74\xc1\x7c\xf4\x82\x86\x08\xdc\x4b\x25\x54\x71\xf8\x86\x05\x6c\x49\x29\xc9\x49\x7b\x37\xac\x44\xce\xc7\x32\x37\xbc\xb5\xf2\x3b\xdc\x4b\x16\x98\x27\xb5\x8c\xa4\x81\x92\xc5\xa4\xc4\x04\x20\x69\x9a\x6c\x32\x14\x1e\x00\xc3\xac\xe4\x89\x1c\xcf\x92\x06\x65\xe0\x88\x22\xf4\x79\x82\x6a\xee\xe4\xac\x38\xb3\xf8\xc5\x62\xf1\x65\xef\x63\x9d\x55\x92\xed\x3b\x5d\x60\x82\x39\x3e\xe7\x9f\x94\xf9\xdf\x9b\x89\xcb\x19\xcd\xa9\xa4\x37\x05\x12\xc7\xe4\x3e\x3f\xe0\xd3\x54\x48\x78\x1c\x64\xba\x5c\x16\x5e\x01\x38\x88\xfb\x07\x70\xad\x7b\xfa\x76\x77\x97\x70\x6b\xb9\x75\x78\x3b\x68\xd7\xb7\x13\x8b\x59\x84\xee\x77\xb1\x45\x3d\x55\xf5\x34\xa2\x7a\x6a\x8a\x05\x99\x76\x3b\x5a\x5b\xe7\x90\x54\x4a\x05\x89\x2c\x61\x77\x5b\x54\x7b\x68\x0a\xb9\xdc\x5e\x64\xc6\x77\x23\x0d\x41\x0d\xdf\xcd\xca\x4c\x50\xe3\x92\xfa\xce\xac\xd6\xcd\x7e\x1a\x06\xb6\x6d\xe0\x4d\xc8\x3d\x61\xe3\xe6\x22\xf3\x2c\xd8\xd4\x68\xf5\xb7\x5b\x10\x0c\xff\x92\x95\x26\xdc\x7b\x2a\xd6\x3c\x17\x4d\x71\x91\xd4\x4f\x5e\x86\x01\x54\x8e\x3d\xa4\x29\xc0\x4c\xf9\xeb\xd5\xce\xef\x63\xc9\x2f\x1e\x4a\xd0\x46\x9b\x69\xf5\x50\xea\x16\x43\x44\x5d\x42\xd2\xa2\x99\x0a\xce\x23\xd8\x98\xaf\xd1\x2c\x8d\xa4\xff\x5a\x1b\x90\x05\xd2\x27\x4c\xfd\x7e\x91\x60\xeb\x88\x1f\x79\x90\x92\xba\xc6\x2e\xad\xa9\x81\xdb\xcf\xbf\x19\x44\x7a\x0b\xdd\xc1\x50\x6e\x34\xba\x1c\x33\x8d\x1b\x59\xc7\x18\x15\xea\x54\xf1\xf0\x80\x1c\xd6\xf0\xc7\x2f\xb1\x87\x8b\xfb\x0e\x36\x63\xbc\xa1\x96\x89\xf0\x39\xd7\xaf\x48\xed\x90\xa1\xb3\x4c\x42\xa3\x9b\x73\x73\x37\x7e\x77\x93\x95\x9f\xfd\x71\xcd\x0f\x9c\x9a\xcc\xa8\x05\xb2\x74\xf3\xdd\xb8\xbe\xa6\x34\x92\xfd\xdd\xb3\x2b\xfd\xa5\x1a\x6c\x57\xa4\x4e\x96\x53\xdc\xa2\x0e\xcc\x54\x1e\xe8\xca\x34\xd2\x6c\xeb\x9d\xa3\x98\x61\x11\xdc\x2d\x59\xdf\xd8\x7a\xb4\xd0\xf4\xa7\x62\xbd\x18\x2d\xec\xa1\x9a\xa6\x6f\x72\x54\xa9\x6c\xcd\xad\x10\x38\x74\xf7\x43\x4c\xae\xfb\xa2\x55\x5d\xf8\xb8\xf5\x07\xa0\xe9\xbc\xb6\x74\x7a\xed\x60\xcc\xbe\xa1\x03\x6c\x1d\x81\x38\x32\x39\x4e\xda\xa8\x42\xf6\x65\x70\xf1\xd7\xe8\xa1\x44\x00\x81\x72\xd8\x66\x07\x26\x29\xf6\xf5\x47\x3f\xc1\x37\x1c\xc1\x66\x22\x9e\x98\x72\x30\xeb\x14\x61\x34\x8c\x96\xd0\xce\xc3\x21\x89\xcd\x7e\xd2\x84\xd3\x38\x39\xaa\x2d\x61\xf1\xeb\x23\x79\x93\xac\x8d\x8b\x6a\xfe\xea\x06\x24\xe9\xe2\x0b\x57\xb4\x29\xef\x35\x2a\x1d\x25\xca\x08\x00\x3f\xb9\x0a\x38\x88\xcf\x71\x04\x36\x04\x00\x94\xdc\x81\xe9\x67\x93\xb7\x73\x3b\xae\x70\xf3\x7f\x72\xf2\xd8\x3e\xfd\x15\x1e\x34\x7d\xe1\x9e\xae\xcb\x79\x59\xed\x54\x9f\x58\xe8\xe5\x27\xee\x8b\x4d\x9c\xc6\x91\x74\x5a\x83\x24\xcc\x44\xa0\x4a\x73\x3b\x9d\x09\x46\xc9\x47\xd2\x32\xfd\xeb\xa9\xd4\x37\xbc\xb8\x43\x8d\x2b\xca\x52\x50\x70\xd2\xf0\xe2\xff\xe8\x8e\xb2\x0e\xbe\x5a\x7f\x5b\x7f\xa0\x97\x1b\x26\xf1\x71\xd0\x32\xb5\xe9\x3e\xf4\x60\x85\xa0\x4a\x86\xac\xd5\xf9\x5b\xe8\x85\x1a\x90\xcf\xab\xd8\x65\x0e\xec\x7e\x74\x92\xdb\x4a\xc0\xa4\x8e\x16\x38\x38\x0f\x86\xee\x84\xc6\x01\xa5\x53\x4f\x66\xfd\x1f\x03\x6c\x29\x1b\xb6\x97\xe9\x96\x52\xeb\x32\x62\xf3\x9f\x66\x74\xed\x7a\xdf\x9e\x2f\x32\x68\x33\xec\x47\x1c\x6e\x69\x1e\x01\xee\x1d\xbe\xf0\xca\x4d\xe9\xd0\xbb\x49\xb3\xa3\x0e\x76\xe2\x9b\xc0\xbe\xb4\x44\x59\x2d\xd2\xc0\x38\x8e\x27\x3e\x50\xf2\x28\xe4\x00\xeb\x71\x5f\x08\x6e\x65\xd3\xb6\xcd\x3a\x5a\x71\x03\x1c\x66\xf2\x47\xbc\x05\x49\xb1\x0f\x5e\x9b\x01\x7b\xf0\xca\xe5\x26\xcc\xc8\xd5\xca\xab\x53\xd5\xd0\x2f\x69\x77\xeb\x3f\x2f\x44\x6c\xc2\x67\x8a\xdf\xee\x6a\x45\x78\x79\xe4\xb5\xce\xeb\x5c\xa8\x81\x9a\x3c\x9e\xb5\xf7\x25\x70\x8e\xeb\xa2\x81\xda\x84\x71\x60\x9c\x78\x52\x44\x25\x60\x40\x8f\xca\x0d\x2f\xfe\x5b\x0a\x77\x39\x68\x0f\x42\x7d\x6d\x4a\x75\xc9\x01\x58\xdf\x5c\xf5\x3f\xd4\xab\xbb\xcb\xe7\xcd\x63\x7b\x8a\x09\x03\x3c\xfa\x23\x9d\xe2\x4b\xb4\x68\xc5\x30\x05\x34\x09\xcc\x58\xb4\x5a\xb7\x26\x4c\x73\xd8\x0a\x2a\xfc\x8a\x53\xdf\x71\xde\x4c\x1a\x66\x9e\xe7\x78\x90\x4f\x82\xb2\x58\x54\xd8\xdf\xb7\xe8\x2c\x1c\x2c\xab\x05\x86\x88\x06\xb8\xe9\x77\xe5\x74\x71\x41\x5d\xd8\xe7\xd9\x31\x16\x2f\x00\x9f\x61\x0a\x4d\x11\xfc\x15\x6a\x59\xb4\x60\xed\xd0\xdc\x94\x33\x90\xb9\x08\xc5\x23\x45\x8a\xea\xd0\x1e\x1b\x0f\xba\x94\xfe\x66\xad\x88\xa3\x1c\xd6\x7b\x15\xc0\x36\xcb\xe3\x89\x41\xa3\xc2\x70\x6f\xcb\x19\x1e\xed\x54\xdd\x90\x02\x5b\x27\x2f\x63\x92\x74\x67\x1f\xb5\x2c\xa9\xb1\xbc\x37\x01\xae\x43\xaf\x64\xcc\x1a\x7d\x43\x59\x17\xbf\x2c\x66\xb6\x0d\x79\xbf\xa1\xb6\x20\x49\x44\xce\xde\xb7\xd2\xfb\x17\x17\xd1\x4a\x1a\xf5\xde\x7e\x6e\x00\x2b\x49\x15\xe0\xa0\xe1\xdc\x3e\xcc\x3e\x84\xe6\x7c\x5a\x12\x1c\xec\xb5\x9e\xb7\xd6\x0c\xfe\x08\x88\xd2\xad\x05\xb9\xbf\x6a\x99\x0f\x38\x38\x5a\xa4\xed\x79\xd1\x9c\xbb\x1a\xd6\x3a\x5f\x54\x1c\xad\x1f\x23\xff\x1c\x35\xee\x72\x55\xe0\x37\x33\x6d\x1a\x37\x07\x48\x6b\x47\x39\x9d\xb2\xaa\x5c\x29\x87\x4d\x7d\x9e\x8e\x05\xa9\x0f\x1b\x6c\x00\x6e\xe9\x49\xfa\xad\x85\x6a\x03\xde\xcd\xf4\x22\xb4\xd9\x77\x93\xd8\xb1\x04\x9d\x39\xe3\xf7\x6e\xf9\x01\x07\x82\xa4\x90\x78\x09\x9e\xa8\x09\x8f\xda\xad\xea\xa9\x24\xc8\x5a\xd9\xbf\xef\x76\x25\x71\x43\x47\xe4\xe5\xc4\x04\x47\x2d\x77\x74\x91\xd7\x35\xea\x72\x34\x80\xfc\x24\x89\x57\x28\x92\x1f\x85\x7a\x04\x24\x54\x8e\x88\xf3\x00\xb3\xcb\x13\xee\xb9\x85\x56\xcc\xf9\x43\xe1\x07\xb2\x3c\x3e\x82\x30\x65\x15\x49\x99\xd1\x9e\xa2\x31\x26\xd0\xf3\x25\x07\x5e\x2f\x9f\xec\x87\x55\x4f\x9f\xf6\x17\x22\x80\xef\x74\x72\xab\x11\xf4\x1e\x23\xb9\x4c\x09\xf4\x23\x75\x6c\x5d\x67\x62\x35\xcb\xaf\xd2\x66\x30\x6d\xd7\xbc\x48\x6b\xbc\x59\xd6\xf0\x7b\x27\x75\xaf\x2d\x22\xc4\xed\x41\x45\x26\x21\xbc\xbc\xb1\x14\x86\xcb\x21\xf0\x17\x37\x07\xac\x14\x8b\x5d\xdc\x05\xed\xb4\x26\xaa\xf8\x63\x9a\x9a\x0b\x1a\xff\xb5\x26\x68\xbc\x48\x07\xe4\x0f\x87\x2b\xf0\x6a\x4d\x05\x48\x1a\x38\x27\xa9\x20\xfe\xba\x1d\x22\xfa\xf5\x8f\x06\x8b\xc3\x5a\xda\x76\x0a\x68\x64\x7f\x13\x92\xc1\xdf\x66\x57\xd4\x69\xe7\x1b\x63\xd6\xaf\x8c\x02\x6a\x7a\x29\x41\xdc\xb5\xc8\x29\xf7\xfe\x6e\xb8\x62\x24\xfa\x47\xd9\xa0\xff\x9a\x7e\xec\x50\xb2\x27\x2e\x8c\xb6\x14\x37\x1f\x92\x6e\x0c\xbd\x79\x22\xe9\xa8\x31\xcb\x98\x0d\x2f\x34\x7d\xaa\xf0\x72\x09\xf4\x65\xb7\xde\x01\xef\x01\xde\x96\xb2\x2e\x8f\x35\x2c\x76\xe3\xe7\xf0\x18\xea\x1c\xec\xd3\xdd\x06\xa5\xc3\x52\x2e\x32\xc4\x2c\x2d\x92\x2f\x06\xd7\xc4\x27\xf5\xea\x27\x65\x13\x6e\x03\xf7\x96\x12\x6c\x9d\x7e\x52\x9d\x78\x4f\xad\x40\x0c\x5a\x1b\x1d\x74\x7d\x4c\xbd\xe8\xf4\x38\xeb\x72\x40\x0f\x88\x7f\x2a\xe1\x2e\x0c\xf2\xf3\xde\x57\xae\x4f\x11\x75\x7f\x12\x4b\x7f\x06\x75\xf7\x01\x76\x66\x93\x91\x57\xde\x6d\x8c\xb0\xb9\x8e\x08\xc3\x8e\x64\xbe\xec\x70\x1e\x27\x6f\x47\x70\x2b\xfe\x79\x0b\xb0\xc1\xc2\x41\xe6\xc6\xbe\xcd\x2d\x35\x6d\x3e\x79\x34\xb3\x1c\x3c\x29\x6c\xc6\xf8\x3e\xd2\xe7\x0e\xda\x9a\x54\xc6\xc8\xa1\xbe\xbf\x2b\x01\xe0\xcb\xa5\x37\xca\x24\x3d\x5c\x81\x4f\xcb\xd2\x49\xe7\x88\x76\x64\xab\x8b\x79\x75\xa6\x32\x1a\xb9\x07\x1a\xd6\xf4\xcb\x0e\x07\x82\x3b\x3f\x7e\xe6\xd9\x70\xdc\x45\x6a\xfc\x80\x12\xc5\xcc\xcf\x8d\xdf\x56\x7e\xf6\x67\xdf\xef\x82\x7c\x05\x24\x55\x92\x0f\xab\x76\x17\xbd\xf5\xfa\xda\x16\xde\x1e\x80\xd7\xe3\x98\xe4\x0c\x8e\x0f\x13\x40\x0d\x02\x4f\x6f\xa5\xdc\x09\x9a\x58\x51\x05\x88\x59\x4d\x03\x8f\x0e\x61\x5b\x3b\x77\xcc\x8b\xf4\x33\x18\xa9\xa8\x92\x6f\xeb\xa8\xf1\xee\xd5\x70\x0d\x87\x5b\xbe\x11\xd6\x50\x71\xc5\x17\x22\x26\x46\xdf\x48\xe6\x13\x6b\x56\xb2\x54\x44\x8f\xe3\xe7\xaf\x4d\xe7\xf4\xf4\x21\x20\xd9\x99\xab\xb9\x43\x8b\xdf\x08\xd6\x91\xb3\x5d\x76\x04\xfc\x2e\xc1\x81\x14\x86\x46\xf9\x72\x99\x33\xce\x5f\x06\x41\xa8\xfb\x51\x0e\xc6\xc9\x6b\xbe\x12\x70\x10\xa0\x2c\xf9\xd8\x7b\x1b\x70\xca\x48\x32\x94\x7a\xfc\xb2\x80\xee\x8c\x14\x00\xe6\x72\xb8\x2e\xc4\x7b\xf3\x61\x6d\xae\xd4\x59\xca\x01\x69\x49\x91\x99\xac\x69\x59\xd6\x30\x47\xcc\x7d\xeb\x92\x49\x30\x12\x41\x4d\xaa\x8d\x70\xe8\xa5\x63\xd9\x02\xa9\x66\x32\x0d\x3e\x7d\x0d\xaf\xfa\x3e\x37\x55\xd1\x53\xc5\xbc\xaf\x53\x1f\x00\x65\x9d\xe8\xf9\x02\xa0\xaf\xeb\x73\x43\x79\x21\xb4\x04\x63\x10\x04\xa2\x05\x88\x32\xbf\x15\xa4\x42\xea\x34\x3c\xf0\xea\x63\x88\xab\x81\xbc\x32\x84\x97\xab\x0a\x66\x02\x9c\x71\xaa\xae\xd0\xda\xf6\x3b\xe6\x50\x02\xe6\xb5\xd1\x81\x99\xa9\xb2\x51\xc2\xdb\x37\xa5\x7a\x6e\xcf\x83\xec\xb5\xf2\xe8\xb5\x2a\x8c\x64\xa6\x10\xb7\xd4\x61\xda\x7e\x10\xed\x97\xe9\xdf\x3a\x18\x66\xbe\x4f\xee\x8e\x93\x39\x7e\x75\x84\x45\x9f\x10\x90\xf6\x48\x9d\x99\x54\x7d\x65\x87\xda\x6f\x9d\xac\xfb\x68\x86\x24\xc1\x18\xd2\x03\x85\x06\x6b\xfe\xc1\xb4\x9e\x3c\xc6\xe9\xa7\x0f\xdb\xa1\x8d\x6c\xd9\xda\x79\xde\xc2\xe9\xcf\xe2\x0f\x61\xf1\xdf\x70\x23\xdc\x9a\x0f\x3e\xd6\x60\xbf\xa9\xc7\xed\x66\xde\xdb\x86\xbf\x61\x50\x81\xcc\x0e\xc7\x71\x45\xef\x02\x7d\x77\x52\xeb\x58\xc6\x62\x64\xeb\x62\x5a\xd8\xa2\x1f\x3d\x8b\xcf\x27\xa9\x64\x9d\xe5\x14\x42\x43\xf2\xf5\x5f\x22\xd5\x0a\xd7\xc0\x87\x23\xbc\x44\x12\x3e\xfb\x45\x9c\x0e\x64\xa7\x97\x85\x81\x85\x70\x71\x77\xef\x27\x3f\x52\xce\xb3\x85\x8e\x15\x71\x88\x44\x0f\x04\x16\xbd\x1c\xa8\xf3\x78\xc1\x40\x1a\xa7\xcd\x2d\x51\x95\x6c\x7a\x85\xbc\x3b\x83\x2e\xd1\x99\x60\xdb\x2a\x93\x80\x4a\x54\x7a\xdc\x4c\x60\xc5\xe3\x0a\x4f\x87\xa3\x13\x2c\x26\xa8\x12\x4e\x79\xfb\xae\x58\x2f\xe6\xa7\x1f\xb1\x4c\xce\x81\xc3\xad\x59\xd9\x0c\x48\x5c\xdf\xb9\x47\x46\xec\xcb\x8e\x90\xe8\x05\x5d\x9a\xf2\x7a\x99\xb2\x60\x01\xaa\xac\x09\xae\xd2\xd8\x82\xf9\x1c\x3c\x27\x2e\x47\x8d\x8b\xaa\x74\x99\x3b\xf5\x6a\x72\x69\xe2\xdb\x7a\x8d\x8c\x61\xdf\xbc\xf5\xb4\x3e\xab\x3c\x4a\x79\xde\xf1\x65\x8d\x80\x64\xf9\x31\xfd\xb4\x56\x51\x99\xf7\x57\x4e\x2e\x0f\x95\x3f\xaf\x1f\xff\x63\x31\xaa\x9b\x0f\x3e\x35\x43\xc2\xef\x12\xee\x50\x3a\x39\x05\x23\x2d\xd9\x0d\x47\x87\xa4\x62\x46\x42\x09\x82\x72\x31\xce\xfc\xe3\x36\xa1\xc1\x27\xe5\xb8\x6e\x87\x92\x56\xdb\x04\xdd\x77\xd1\x3f\x11\x55\xe2\xb8\xd6\x88\x26\xba\x1a\x68\xb0\x9e\x99\xd3\xd9\x84\xfe\x30\x3c\x97\xf8\x6d\x7b\x6d\x90\x3e\x52\x6b\x50\xf0\x7c\x46\x99\xfc\xa2\x25\xea\x22\x19\x8d\xca\xf3\x3c\xa5\x62\x21\xd3\x48\x9e\x8b\x8a\x63\x6e\xf4\xc0\x3d\x68\xda\x5d\x72\x19\x94\x7e\xe1\xf7\xc5\xa2\xf3\xc6\xd9\xe7\x9f\xd1\xc5\x92\xb8\x5b\x6e\x96\x0d\x39\xda\xb7\x88\xd1\x42\xfd\x83\x19\xec\x3a\x93\xe3\x60\x14\xf9\x8c\x0d\x43\xed\x85\xe5\xfd\xd5\x2f\xa1\x90\xbd\x97\x43\x04\xef\xa4\xe7\x13\x2f\x10\xc2\x86\x2b\xb5\xad\x56\xb8\x46\xa7\x35\x61\xee\xc9\x15\x41\x59\x63\x8d\x47\xda\x03\xf7\x9b\x56\x3d\x5b\xb3\x45\xad\xf9\x28\x24\x7a\x76\xa9\xf6\x2b\x9c\xb7\x12\x52\x32\x5f\x80\x54\x91\x2b\x6f\xe4\x60\xea\x48\x65\xf5\x4b\x7f\x99\x55\x9d\x56\xca\x4c\x41\x5c\x70\x62\x3b\x84\xc2\xd0\x05\x64\x4e\x55\x0e\xf5\x4b\x8b\x22\xec\x8b\x4d\x3a\x7d\x07\x6f\x6d\xc9\x81\x30\xba\xdc\x09\xbd\x2f\x8d\x3d\x86\x3a\xa7\x6d\x17\xe3\xf5\x54\xaf\x05\x55\x56\xe7\xbe\x4a\x39\xb5\xed\x31\xd3\x50\x2c\xb1\xb3\xb4\x08\x00\x79\xc0\x77\x78\x4a\xa8\xfa\x29\xcf\x47\xb3\x2c\x79\xf5\x49\x72\x23\xf0\x3e\xa9\x55\x4f\x79\x54\x7d\x3c\x94\x58\xb3\xa3\x36\x35\xc0\xd5\x1b\x17\x28\xa1\x1f\xd5\xcc\x28\xd8\x77\x1f\x50\x55\xda\x27\x53\x96\x4c\xd2\x1d\x96\x5f\x67\x37\xc1\xe3\xb5\x22\xf5\x50\xdd\x60\x6a\x37\xde\x21\xa4\x48\xf0\xfd\x8e\x94\x03\x66\x26\x65\x74\x64\x25\x7c\x9d\xa7\x06\x1c\xbf\xc9\x80\x75\xe1\xfd\x65\xf0\xaf\xfd\xd2\x74\xd9\xc5\x66\x1f\x34\x4a\xe2\x5e\xfc\xdc\x56\x22\x15\xa1\x1e\x63\x2e\x2c\x2d\x88\xfd\xb7\xf4\xbf\x36\x60\xd8\x5f\xcb\x2f\x6e\xa1\xee\xe4\x0e\x97\x65\xf5\x58\x2d\xf0\x0b\x6e\xca\x88\xe8\xc8\x2d\x08\x1e\x0c\xc5\x0f\xa7\xde\x69\xbc\xad\x63\x0f\x78\x96\x7e\xbb\xc1\xd3\x9f\xd1\xfc\xb2\x64\x4a\x4a\x49\x39\xed\xf7\xa9\x4c\x8d\xff\x68\x81\xbf\x8e\xd4\xe2\x55\xf4\x18\x93\x33\xfd\xd6\x88\x83\x37\x72\x93\x24\x68\xc0\x83\x81\x56\xc8\xf1\xb8\x10\xdc\xf8\x91\xfb\x08\x93\x10\xc4\x5e\xa6\x13\x0b\xa6\x0f\xfb\xdf\xef\x92\x82\x51\x06\x5e\x8e\xc7\x5e\x1c\xf1\x26\x74\xbe\x82\x1d\xb0\x30\xd2\x14\x3f\x18\x8c\xa6\xde\xa4\x34\xe4\x2c\xd5\x77\xe2\x28\xd0\x28\xb1\xb5\xb2\x08\x06\x70\xa0\xfc\x1a\xd0\x21\x94\xbf\xc5\x78\xfb\xbe\xa0\x70\x13\x87\x5c\x09\xbf\xb5\x55\x0a\xda\xc3\x86\xef\xcb\xa5\xc4\x76\x83\x1c\x32\x5c\x7d\x51\x12\x5f\xa4\xcf\x7c\x47\x59\xf0\x54\x58\x4d\x04\x0a\x77\x88\xea\x15\x18\x69\xa3\x30\x8e\x58\xa6\xf8\x38\xf6\x0d\xe0\x94\xcf\xc5\x5f\x91\xc9\xcb\x3a\x3b\xb1\x6c\xe5\xc2\xf9\x6b\xf1\xf5\x66\x48\x51\xbf\xa0\x45\xcb\x40\xac\x1b\x36\x93\xe2\xa3\x40\x55\x51\x23\x82\xdb\x2b\x3e\x99\x1f\xe5\x42\x53\x28\x91\xc6\xc6\xc4\xaa\x66\x1d\xf6\x6e\x6c\x83\x61\xae\x90\xd4\xa1\x52\xd8\x63\x6a\xf3\xbb\x27\x5d\xfa\xc2\x88\xbf\x4b\x8f\x34\xa7\x37\xa4\xd4\xb0\x4b\x66\x6d\x0f\x7f\x1c\x6d\x64\x93\xd8\x9a\xf7\xd8\xfb\x9b\x1d\x62\x49\x6f\xdc\x80\x9e\xb1\x44\x45\x48\x58\x88\x5f\xa9\xd5\xf9\xd8\x8f\x64\x9b\x51\x74\xcc\x63\xe4\xbc\x74\xa0\x8a\x4e\xd2\xa8\x50\x0b\xf1\xc4\x29\x5d\x20\x7b\x1e\xb0\x9c\x9a\x03\x83\xa1\x53\xa9\xf8\xe6\x51\xf8\x04\x4a\x53\x1b\xd1\xdd\x11\x1c\xf3\xe8\xac\xc1\x80\x3f\x4f\x00\x91\x73\x4c\x62\xa5\xb3\xc7\x2d\xfc\x75\x64\xb1\xac\x13\x12\xce\x96\x4e\x12\xd5\x2e\x07\x96\xaf\xbb\xf7\x54\x9b\x3e\xe2\x3a\xf4\x0c\xb8\x4e\x0b\xe2\x9b\x48\x32\xbd\xfd\xb2\x92\x80\x22\xe4\xb0\xac\xf4\x9d\x94\x5b\x40\x7d\x45\xea\x4c\x80\xcc\x6a\xf3\xfd\x57\xc9\x78\xd5\x05\x5b\xa2\x8c\xed\x94\x3e\xb7\xf5\xb3\x46\x16\xd4\x89\x4e\x79\x7a\xca\x07\x19\x5e\x16\x35\x04\x08\x15\x20\x4c\xaa\x2d\xa9\xfb\x1b\x34\x06\x2d\x2f\x10\x90\xb5\x10\xd6\xa6\xb5\xcc\xbd\x9a\xfc\x97\x1f\xd4\xad\x55\xe6\xd9\x6c\xc1\xf2\xd5\x2b\x31\x36\x46\xe0\x83\x2d\xbe\x2b\xa4\x17\x63\xbf\x42\x11\x25\x4c\x48\x98\xa7\x65\x67\xd0\xc1\x7b\xf3\x73\x89\x48\x12\x43\xf8\xc7\x1d\x86\x4b\x8c\xeb\xb6\x6e\x08\x17\x6b\x35\x25\xf2\xc9\x3c\x84\x94\x41\x8f\x75\x24\xdb\x8d\x0b\x74\xe1\xa6\x8a\x77\x30\xd2\xda\xa5\xeb\x27\xcd\xe6\xab\x2e\xcd\xa9\x95\xf9\x06\xdc\x80\x79\x05\x52\xc5\x91\x8d\xc2\x4e\x4d\xd0\x2f\x48\x0d\xa8\x6c\xcf\x2c\xe3\x3b\x39\xbd\xc7\x1a\x48\x20\x2f\xd1\x73\x48\xa8\xbf\x56\x63\xc5\xdc\x06\x03\xd7\x78\xe3\x5f\x6b\x53\xad\xef\x1b\x93\x4a\x46\x31\x81\x00\xa3\x9b\xb0\x3e\x11\x0a\xf0\x63\x02\xbe\x32\xad\xf3\x79\xee\x0c\x77\x18\x1b\x5c\x74\x93\x30\xdf\x7c\x11\x17\xfc\x9c\x7f\x58\xe4\x31\xc9\xed\xc3\xaa\x69\x2f\xcc\x6b\xd2\xbb\xa5\x41\xc6\xb8\x2a\x51\xc0\xa0\xc2\xdb\xfc\x00\x4e\xc1\xcf\x16\x41\xe7\xd7\x5b\x08\x90\x51\xcb\x88\x02\x03\xdc\x04\x09\x8e\x2c\xfc\xd0\xaa\x9e\xf3\xbe\xc6\x86\x97\x8e\xeb\x75\xec\x26\x8d\xd3\x96\xa6\x6b\x73\x8a\x19\x3f\x92\xc1\xde\x54\xb7\x96\x9c\x22\x58\x24\x24\x91\x9f\xb1\xc4\x10\x2b\x1f\x58\xab\x4c\x28\xad\xcc\x30\x50\xa0\x0c\xae\xda\xdb\x78\x82\xcc\x86\x19\xb8\xaf\x5e\x1a\x48\x0a\x1a\x4a\xc1\xf9\xb6\x0c\x97\xa6\xd9\x46\x6a\xe2\x31\xd8\xb0\x7b\xc4\xd1\x65\x8c\x99\xfe\xc4\x63\x56\x90\xb6\x43\x74\x84\x9f\x4f\x5c\x4a\x27\xd4\x57\x52\xcd\x4e\xaf\xa6\xb7\x81\xf7\x4e\xe3\x83\xf7\xd2\x7e\x3f\xbc\xe4\x0b\xe7\xd1\xc7\xc6\x7d\xe1\xd8\x24\xe2\x70\xa2\xeb\x26\x4b\xa0\xd5\x67\xf8\x4e\x1a\x35\xc8\x35\xae\xbb\x98\x91\x2e\x65\xdb\x50\xf1\x74\x17\xc2\x0f\xef\xd5\x32\xb0\x72\xe0\x2d\xe7\x6a\x21\xa0\xb2\x70\xf4\x0a\x7d\x59\xb2\xcb\xc9\x83\x5d\x28\x50\x43\x94\xca\x08\x00\x2e\xaa\xd0\xe1\x47\x6d\xab\x1f\xa8\xf6\x41\xb6\x93\x63\x63\xc8\x6e\x36\x82\x3a\x52\x17\xc1\xd2\x8a\x35\x63\xfb\xb1\x98\xa6\x41\x56\x89\x10\xe9\xb5\x6a\xcd\x0b\xf9\xe5\x52\xd4\x4c\x32\x5f\xfe\x6e\xd0\xe5\x12\xd4\xf3\x6d\xeb\x3f\x34\x0a\x3c\x43\xfd\xc5\xda\xd7\x62\xdd\x24\xc6\x79\x99\x44\x79\x30\x43\x6f\xcc\xd8\x62\x1c\x46\xf0\xc3\xa7\xb3\x93\x89\x44\x0a\xb9\xb0\x1d\x89\xd5\x16\x6b\xf7\xea\x74\xc7\x80\xeb\x54\x28\xe6\x89\xfe\x9e\x4d\x66\xd3\x12\xe9\x4c\x2b\xe2\x73\x11\xdf\xf3\xbe\x7e\xb2\xef\x1a\xe7\xfe\x61\x28\x38\x34\x9a\xe1\x07\x39\x47\xf5\xcd\x4d\x78\xdd\x20\x96\x7d\xbd\xf4\x38\x36\x24\x35\x98\xb0\xdd\x29\x14\x33\xc0\x71\xfa\x3a\x21\x68\x36\xf1\x79\x3f\x03\x4a\x6b\x79\x0b\x3e\xfa\x66\x15\x5b\x52\x87\x74\x8d\x3b\x64\x85\xa0\x84\xb1\xf8\x66\x8b\x36\x3b\xd3\xd4\x5f\x31\x06\xfa\x67\x86\x30\x7b\x3d\xa5\x76\xa3\x4f\xca\x27\xa7\x2b\x96\xae\xcc\x15\xdb\xa1\xbd\xa9\x82\x16\x74\x9c\xe8\x52\x48\x8f\xa3\xa7\xf5\xe1\xce\x1d\x7b\x7c\xb2\x97\xf8\x33\x9b\x7d\xc8\x92\x33\x37\xa4\xf6\xb0\xc6\x5b\x51\xef\x52\xbf\x6e\x1a\xee\x5e\x94\x8d\x01\xbd\x82\x42\x6b\x93\x0d\x60\x3d\xca\x3e\x09\x77\x6f\xee\x1e\x2a\x4c\xc5\xee\xa3\x33\x68\xa8\xcc\x2a\x35\xa8\x4a\xf0\x46\xec\x3d\x7e\x11\x30\x45\x87\x9e\x28\x64\x7d\x61\x3e\x24\xe9\x9e\x50\xb4\xa4\x37\xad\x83\xb2\x36\x16\x3f\xef\xf2\xdc\x85\xc2\x07\x57\x78\xea\x4a\xe6\x0f\xe1\x1d\xc8\x90\x88\xe6\x1b\x69\x75\x0e\x6a\x62\x9e\x07\xdb\x82\x89\xc8\xe6\x8a\x70\x7f\x0d\x55\xeb\xba\xfe\x78\x51\x5e\x28\x17\x80\x38\x4b\x9e\x2c\x07\x1f\x8e\x1e\x6e\x69\x31\x37\xbd\x16\x22\x4b\xb3\x35\x38\xb7\x77\xf5\xd6\xd6\x73\x56\xd8\xe9\xaf\xbc\xc3\x55\x20\x0b\xe2\xac\xdc\x9e\x61\x8f\x74\xa6\x31\x17\x20\x8c\xb2\xf7\x12\xb3\x15\x98\xce\x6d\x3e\x88\xba\x95\x09\xd3\x9f\x72\x84\x42\xd1\x9b\x84\x80\x8a\x32\x00\x31\x92\x52\x71\x43\x58\x07\xcf\x00\xb4\x55\x2f\x90\x1d\xd2\x9f\x31\x18\x1c\xba\x81\x7a\x75\xfa\xb2\x22\xc1\x6b\xe6\xf0\x98\x70\x6e\x9e\x67\x7a\x6d\x38\x06\x31\xf1\xad\x48\x34\x8b\x92\xbb\x5e\x96\xc4\x56\x92\xb7\xc0\xeb\xea\x33\x05\xcc\xa9\x19\x56\xf9\xe7\xbb\x1d\xf3\xfe\xde\x81\xf0\xf8\x0e\xf4\xf4\xd9\x1e\xf8\x79\xd3\xd3\xc6\x9c\xe9\x46\xee\x69\x46\x36\xcd\x5e\xb9\x22\x12\x2c\xdc\xe8\x78\x47\x5a\x52\x99\xbc\x1a\x84\xe9\x3d\x0b\x4c\xaf\x09\x5d\xe5\xd7\x4e\xd4\xae\x3c\x7b\x8d\xbe\x3a\x05\x4e\xd5\x2f\xa6\x0f\x12\x8b\x12\xae\x46\x10\x06\x81\x8f\xbb\x49\x35\x16\xc1\xf5\xd2\x95\xd6\xc2\x62\x5b\xfb\x5a\xb4\xd6\x72\x14\x1e\x40\x83\x83\x7a\x15\x18\xb8\x2b\x32\x35\xe9\xba\x3b\x02\x86\x57\x79\x30\x35\xd8\x19\xe0\x28\x85\x3a\x56\x20\x92\x96\xda\x23\x91\xfb\xaa\x92\x19\xf8\x66\x41\x7f\x6c\xe6\x12\x55\x61\x96\x1d\x28\x42\x9e\x32\x51\x9e\x78\xa7\x71\xbd\x51\x9c\x59\x66\x1e\x6f\x3d\x35\x7f\x08\xdd\x7d\x70\x5f\x88\x8b\x99\xe5\x7e\x70\x0e\x4b\x64\xf3\x18\x23\x0c\xa8\x89\xda\xcb\xa1\x2e\x31\x24\x5a\xee\x8a\x96\x81\x73\x28\x74\xf1\x59\xe9\x68\x32\x80\x51\x3d\xa1\x9d\x6b\x8b\xfa\x14\xea\x7d\xa7\x9f\xb9\x1c\xda\x70\xc6\xcf\x8e\x77\x78\x02\x31\x31\x11\xa7\x76\x9a\xbd\x41\x33\x32\x3a\x52\x42\x8f\x09\xef\x23\xec\xf5\x49\x9d\x8c\x25\x22\x2a\x9d\x00\x78\x89\xd0\xa7\x40\x2e\x42\x6d\x04\x93\x47\xdf\x55\xa7\xdd\x45\x01\x82\x69\x6d\x26\x51\xaa\x07\xbd\x6b\x8d\xfd\xfa\x71\xee\x7f\xa7\x16\xda\x78\x57\xc3\xcd\xa6\x99\x06\x1c\xfc\xba\x75\x28\x57\xdc\x5d\xfd\xf8\xd1\xb1\xb3\xa4\x04\x2a\xd5\xa2\xdf\xcd\x36\x16\x9e\x57\x32\x05\x5b\x98\xad\x59\x10\x33\xa5\xd2\xc3\x32\x80\xd2\xa1\x49\x64\x3e\xdd\x35\x90\xb0\x6e\x9b\x7a\x35\xf8\x9c\x43\xf7\x61\x25\x8e\x0f\x9b\x4e\x40\x9e\x54\xb9\x48\x91\xa3\x46\x8f\xc9\xe1\x36\x13\x85\x9e\xf8\x55\x39\xdb\xd8\x97\xf3\x31\x57\x13\xfd\x44\x46\x91\x69\xf5\x47\x67\x7c\x1a\xde\x34\x0c\xea\xe2\x09\x1b\x20\xcf\x46\xf8\xe0\xe8\xe2\x05\x2a\x0f\x6d\xfa\x6e\xe5\x87\xc8\x4e\x61\x61\xa6\x17\x5d\x43\xb3\x21\x38\xd2\x79\x77\x11\x8f\x6a\x12\x08\x14\x61\xc3\x69\xbd\xd0\xc6\x9b\x53\xad\x09\x00\x07\x14\x2b\x13\x9f\x60\x94\xdf\xe1\x3a\xf0\xf0\x22\x72\x52\xba\xf2\x43\x31\xae\x25\xef\xe9\x48\xba\x42\x30\xdf\x1c\xda\xa6\xea\xe2\x1e\xee\xf4\xf5\x4b\x5f\xfb\x59\x9a\x10\x2e\x32\x50\x53\xe6\xe8\x42\x64\xb0\xca\x73\x53\xe6\xad\xaa\xf9\x45\x16\x7f\x0d\xb5\x42\xb5\x9d\x5c\x80\xe5\x05\xba\x68\x75\x92\xc1\x40\xd5\x48\x3c\x64\xea\x5b\x95\x56\xea\xc5\x43\x71\x67\x9a\x4a\x41\x6d\xb1\x39\x03\xdf\x35\x8f\x3c\x17\x45\x01\x3d\x9b\x2d\x60\x57\x90\x5e\xa1\x17\x27\xad\x80\x4d\x01\x1c\x12\xce\x0c\x53\x92\x5f\xc0\xe5\x1e\x0c\x03\xb4\xe1\xb7\xb2\x28\x47\x5a\xbc\x48\x7c\x5f\x44\x78\x1a\x86\x61\xfa\x3e\xb1\x5f\x98\x65\x66\x71\x21\x64\x72\x94\x6d\x95\xf6\x28\x2f\x9f\xec\xd8\xd9\x28\xc3\x96\xe4\x0d\xf0\x2e\x12\xb9\x36\x50\x75\x9e\xbd\x2f\x85\xcd\x37\x51\xda\x0a\x4e\xe7\x2a\x71\x9f\x1a\x9a\x62\x18\xf4\x58\xa7\x67\xf9\x11\xc9\x25\xba\x8f\x38\xfb\x19\x54\x88\x3f\x1e\x9b\x02\x4f\x38\xa6\xe9\x45\x10\xca\xac\x5b\xfb\x66\x18\x3f\xb0\x23\x3d\x66\x28\x5f\x79\x94\x69\xe9\x99\x92\x02\xb4\xc6\xdf\x6f\x63\x2a\xac\x4c\xac\x36\x0b\x2e\x1e\xe2\xb2\x9e\xc6\x4c\x8a\xbb\x69\x3a\xc1\xb3\xf1\x49\x7f\x84\x47\x0c\x2f\x73\x01\x60\x91\xaf\x24\xcd\xcb\xf4\x94\x54\x2f\xfc\x46\xe6\x73\x76\x2d\xf2\xcd\xef\xfb\x6d\xc7\x2f\x17\x41\x33\x49\xbd\x6d\x52\xad\x68\xcd\x9d\x30\x46\xf6\x76\x25\x7a\x0f\x72\xce\x56\xa7\xa7\xd4\xff\x81\x0e\x51\x40\x10\x31\xe0\x05\x97\xfe\x8a\x65\x68\x36\xd1\xa2\xbb\x42\x32\x72\xb1\xf2\x44\xd5\xe1\x77\xfe\xe8\x6b\xe8\xfc\x1d\x0c\x71\x3e\x5e\x2c\x07\x2d\x58\xb6\xe8\x7e\x61\x78\xcf\x2f\x4f\xb6\xa9\x76\x41\x1d\xf6\x7a\x64\x85\xea\x74\xeb\x9b\x54\x8f\x50\x78\x12\x71\x87\x0c\x5e\xb3\xd6\xd1\xd3\xa7\x0f\x43\x62\x00\x50\xe5\xc2\x0a\x50\x5f\x20\x81\x74\x07\x29\x8b\x50\xd6\x26\xd2\x5e\x29\x1b\x14\x31\xba\xa5\x74\x98\xc8\x93\x80\xed\xbb\xf0\xc3\x92\xaf\xfb\xf6\xf9\x96\xfa\x24\x5e\x78\x68\x55\x02\x4b\x2f\x02\xe8\x4d\x78\x48\xe8\x8f\x7f\xf8\x91\x4a\x04\xb3\xc0\x51\xe7\xd7\xbe\x25\x3b\xa3\x49\xf1\x40\x31\x8f\x39\xde\x71\x48\x0e\x07\xba\x3f\xfa\x60\x80\xdf\x00\x26\x2e\x73\x72\x54\x5e\x4e\x3b\x9b\x47\xef\xc3\x8a\x1f\x45\xff\x24\x47\xb3\xad\xae\x4d\x23\xe6\x18\x46\x7c\x26\x4f\xa8\x73\xc3\x49\x4c\xbf\xca\xea\x11\x74\xe4\x71\x6b\xbd\x6c\xf5\x90\xe1\x5d\x02\x17\x2a\x5a\x03\x6b\xd3\xa9\xf5\x48\x1d\x66\x22\xdd\x10\x56\xf4\x52\x3c\xe1\x20\xd7\x3c\x25\xb5\x53\x35\xfe\xfd\xa2\x04\x83\xb1\x5d\x88\x69\x9c\x4b\x85\x54\xd9\x16\xd1\x7d\x04\xc7\xc7\x1d\x07\x0f\xd3\x59\x17\x21\xd3\xd7\x6e\x26\xe1\xfb\x6c\xbd\xcb\xa0\xb3\x8e\x59\x90\x73\x22\xab\x1c\xfb\x7e\xce\xb4\xbf\x35\xa6\xee\x81\x7d\xed\xad\xf6\xf1\x6c\x6c\xc2\xa5\xd0\x72\x75\x44\x81\xbd\x10\xc7\xec\x23\x3b\x16\xc0\x3d\xcb\x23\xc4\x1f\xae\x0b\x86\x83\x8b\x91\xa3\x9e\xc2\xca\xf7\xe1\x7d\x22\x6a\x26\xd9\x50\x59\xa8\xac\x36\xc5\xc6\xcd\x2c\x53\x32\x77\xeb\x8e\x9e\x15\x3d\x71\x04\xaf\x55\x95\x95\x96\xcb\x48\x49\x96\x2c\x06\x1b\xae\x61\x4b\x46\xc4\x53\x24\x37\x9e\xb1\x0f\x8b\xc8\xa0\x3d\xa1\xe7\xd4\xed\xaa\x1c\x89\xea\x96\x16\xf5\xb9\x5c\x22\x93\xa8\x1e\x47\x51\x8e\xba\x9f\xca\xec\x10\x87\x98\x58\x7b\x67\xc8\x3d\x31\xf3\x4a\x28\x99\xab\xac\x27\xef\xf0\x08\xd5\xdf\xf2\x5d\xfc\x72\xbe\x74\xa3\x1c\x4c\xb3\xb1\xbb\x03\xe4\x76\x6c\x76\xd0\xc5\xb1\x78\x1f\x62\x81\xaa\xae\x9f\x5a\xda\xdf\xf5\xe7\x33\x7e\x5d\x47\x7c\x8d\x92\x2f\xd9\x34\x5a\x08\x47\x10\xdb\xbb\xaf\xf8\x6f\x14\x26\x38\xec\x2e\x68\xe4\x36\xb9\x8a\x81\xa6\x5b\xb2\xf9\xa3\x28\xa4\xd4\xaa\x66\xec\x6e\xa4\x9e\xb7\xee\x31\xee\xf5\x49\x5c\x8b\x08\xfa\x29\x1f\xad\x60\xc8\xfd\x2a\x41\x91\x93\x62\x42\x28\x38\xef\x98\x26\x2d\x23\xa3\xed\x50\xbb\x00\x36\x7b\xce\x40\x73\x7f\x23\x3a\x8d\x19\x0c\x4f\xa4\xaf\x64\x31\x5e\x73\x61\x70\x53\x23\x47\xe8\x56\xde\xca\x2a\xd9\x44\x8b\xfc\x9b\x2c\x72\x6b\x0e\x11\xd2\xad\x6b\x05\x35\xa2\xaa\xd4\x42\xdc\xb4\xa8\x52\x75\x34\x11\x0d\xda\xe8\x7a\xb2\x94\xb2\xdf\xf6\xdb\xd7\x92\x79\x57\x7e\x78\x8f\x40\x5a\xbd\x9c\xb8\x4f\x09\xde\x53\x91\x2d\xd9\x8b\xde\x9e\xd7\xb1\xc4\xa2\xd8\x77\x12\x25\x52\x92\xe1\xc8\x86\x40\x03\x46\x4b\x5b\x79\xdc\x71\x8b\x48\x51\xa1\x9d\x54\xf0\x70\xaa\xd0\x6f\x41\x0d\x4d\x22\x60\x6c\x0c\x2f\x6f\x78\x85\xb6\x33\x30\xb1\xb3\x1c\x94\xa3\xcc\x5f\x5f\x1b\x4d\x34\x71\xad\x46\x9c\xce\x0d\x4f\xae\x7c\x53\x63\x70\x37\xa3\xeb\xa7\x13\xa9\xb9\x8a\x6a\xfe\x57\xa5\x78\x70\xb3\x96\x18\x72\x1c\xaa\x00\xd6\x19\x90\x25\x5e\x03\xcf\xcf\xba\xc4\xd2\x97\x27\xd1\xfb\x18\x80\xc7\x37\x37\xa0\x13\x07\xc4\x28\x62\xb6\x64\xcb\xd4\xd6\x5f\x77\x45\x9c\x84\x62\x5c\x4d\x04\xb1\xa2\x6d\x02\x91\x61\xfe\x19\xcd\x9d\x4e\x07\xfc\x0f\x98\x18\xc3\xa2\xc2\xc0\x81\x97\xde\x8f\x54\x8b\xfc\xd6\x81\xbe\x3d\x92\x26\xbb\x84\x96\x61\x9e\xf0\x3b\x30\x9f\xfc\x80\xf6\x9e\x8c\x20\x0e\xc1\x40\x40\x87\x8e\x16\x28\x22\xd0\x3d\x99\x36\x8d\x38\xe0\xab\x21\xb9\x73\xde\x30\x76\xc4\x8b\x1f\xc1\x96\xf1\x26\x18\xe9\x65\xa0\xc2\xf7\xfc\x1e\x06\x0f\x12\xe4\x8a\x87\xd3\x47\xc3\xec\x5a\xdb\x95\x4c\x65\x63\x09\x9f\x17\x6c\xef\x52\xc9\x01\xf0\x4b\x96\x43\x25\xd0\x04\x1c\xbe\x68\xaf\x3c\xff\xeb\x1c\x1c\xdc\x32\xf1\x49\x51\xf9\x67\x38\x8b\x20\xdb\x1f\xa4\x93\x81\xbb\x84\x92\xde\xc7\xc8\x1b\x9d\x24\xf4\x9d\x13\xb4\x97\xc4\x6b\x99\x5a\x4b\xe6\x4b\x8c\x7d\xdd\x0d\xd8\xdc\x15\x22\x4e\x57\x88\x0a\x75\xc7\x10\x6c\x88\xc1\xd8\xab\x9b\xd3\xc6\x60\x00\x35\x4a\x70\x65\xda\xa7\x5c\xe4\x03\x2c\x5c\x37\x3e\x47\x56\xc4\xce\xda\xc0\x9b\x72\x1a\x70\xe1\x4a\x24\x84\xf4\x16\x5c\x64\x5a\x0e\x3c\x6c\xf1\xb1\xa0\xab\xf0\x06\x95\x64\xf8\x99\x9c\xdf\x54\xe6\x01\x49\xa5\x84\x01\x99\x67\x1d\x3b\xf0\xf8\xf5\xe8\x4b\x14\x67\x4c\x58\x6e\xdc\x11\xa9\x9f\xbd\xed\xe3\x7c\x12\x2a\xbf\x0d\xa5\x3c\x64\x08\x4f\xc1\x53\xe5\x3d\x4a\x77\x89\x64\x93\xfc\x4a\x6f\xd3\x8a\x66\x38\xe8\x62\xaf\x76\x51\x05\x39\x7e\xef\x09\xb8\x72\xbe\x90\xb7\x21\x2e\xa2\xd1\xba\x75\xb1\xa5\xdc\xa9\x6f\x56\xfa\xf3\x7b\xe6\x95\x8e\xbc\xe6\x71\x6b\x07\x30\xc9\x2f\xc1\x31\xb1\x37\x07\xbd\xcd\x2e\x51\x93\xad\xf8\x8e\x10\xf0\xf2\x2b\x95\x79\x02\xc1\x16\x53\xb6\xab\x44\xc5\xb2\x11\xd0\xd4\xa1\x04\x0a\x35\x40\x31\x5e\xee\xd3\xe2\x20\x35\x7c\x47\x53\x46\x49\x08\x7c\x07\xde\xb8\xbb\x05\x7b\xe1\x83\x92\xe5\xf4\xe0\xe8\x0c\xb6\x32\xd6\xdc\xab\x1a\x75\x19\x5d\xfc\x66\x9d\x55\xf4\x6d\x06\x96\x0d\x2f\x83\xb1\xc1\xdc\xe2\x82\x95\xa1\xb4\x3e\xbe\xcb\x3f\xee\x51\x30\xc7\xa4\xc3\x9c\x43\xb3\xaa\x1a\xc9\x08\x13\x18\xbf\x90\xbb\x7e\x0d\xd8\xec\x0b\x38\x2f\x13\x94\xa3\xd5\xf2\x0d\x35\x68\xce\xe3\x8a\xac\x76\x7d\xc5\xa6\xe0\x1e\xf0\xef\x3c\x86\x5e\x29\xcf\xc4\x42\x81\x25\x12\x72\xf5\x3b\xac\x64\x6f\x34\xb8\xca\x69\x49\x0a\x15\x85\x8c\xf0\xd5\xa9\xb6\x0f\xa1\x8a\x8e\x5a\x9d\x0f\x43\xea\xf5\xa0\x5a\x64\x0e\x22\x44\xd8\xab\xd3\x18\x4e\x11\xb0\xab\x84\x41\x02\x0c\x45\xf9\x62\x44\x5f\xeb\xd5\xd9\x0a\xc7\xae\x7c\xae\x7c\x07\x34\x33\x5d\xaf\x22\x38\xc3\x15\x60\xe1\xbd\x27\x7a\xe0\x2b\x04\x1e\x50\x8a\x34\x7a\x43\x4d\x36\xd5\x80\x1d\x0b\x80\x86\x14\xed\x37\xa2\xfc\x92\x24\xed\x9f\x7c\xf9\xe5\x8a\x26\x56\xee\x69\x07\x83\xd9\x93\xa0\x63\x3b\x04\x87\x76\x81\xe5\x10\xea\x30\x8e\xba\x9d\x44\x7f\x45\x60\xa2\xed\x5f\x56\x55\xa2\xe9\xc6\xdf\x71\xb9\xfd\x9c\x21\x19\x40\xfb\x4d\x27\xf3\xda\x73\xa6\x20\x88\x40\x77\x04\x1e\x53\x9f\x67\x49\x4f\xc2\x5b\x29\x76\x9b\xf0\x7c\xfd\x61\xa3\xf7\x34\x54\x43\x04\x4d\x94\xcb\xcc\x4f\x09\x56\x60\x5d\x2d\x7c\x6b\x16\x6b\x43\x9f\x56\x8a\x42\x71\xde\x65\xd0\xb2\x4e\x88\x4c\x65\x91\xcb\xa2\x4c\x8f\x41\xe0\x7c\xcf\xfa\x65\x2f\xfb\x89\x45\xc9\x7e\x62\x78\xba\x35\x4d\x5c\xf6\x99\xac\xac\xdd\x4a\x27\xae\x48\xd7\x01\x31\x45\x12\x32\xc1\xef\xe8\x85\xc0\x40\xbf\x4d\x8a\x56\x2a\xf5\x36\xae\x05\x88\xd3\xaa\x57\xcc\x5a\xfb\x8a\x34\x6b\x12\x03\xdb\x92\xdb\xfb\x8c\x2e\x10\x14\x33\x21\xde\xb2\xfa\xd5\xde\x1d\x65\x20\x44\xf1\x9a\x88\x45\xfa\x01\x80\x96\xc4\xeb\x9d\xbd\x1d\x86\x3d\x17\x16\xca\x57\x10\x00\xee\xb7\x3b\x8b\x64\xfc\x50\xf5\x3c\x29\x16\x44\xc3\xf4\xd8\x0e\x15\xc6\x80\x4b\x59\xde\x95\xa7\xb6\x2d\x01\x36\xea\x47\x90\xb9\x0f\xf7\xb4\xe3\x1e\x90\x72\x45\xd6\x96\x17\xaf\x61\x81\xc8\x04\x07\x32\xb5\x91\x04\x50\x6a\x2f\x6a\x80\x04\x06\xb2\xf2\xd5\x83\xe2\x24\x59\xcc\xda\xc8\x31\x97\xd5\x2d\x23\xc1\x38\x06\xbe\x1b\x9f\xdb\x72\xc5\x33\x30\x56\xf6\x00\x98\x4c\x95\x63\x55\x68\x91\xb2\xce\x08\xdc\x20\xbe\x5d\x44\xc8\xad\xf7\x31\x10\xa0\x03\x23\x66\xc1\x25\x79\x52\x84\x91\x18\x00\x74\xf6\x39\x99\x99\x9a\x6e\xc8\x0a\xfa\xb0\xbd\x23\xb0\x7b\x34\xdd\xc7\xe4\x4e\x4f\x08\x6e\x40\x34\x99\x53\x2b\x0d\x66\xfd\x01\x20\xf0\x93\xa3\xb4\x1a\x7d\x0c\xa4\x8f\x46\x37\xaf\x5d\x89\xf1\x14\x62\x7d\x29\x9a\x12\x39\xf6\x9b\x31\x9d\xe6\x4a\x42\x00\x47\xe4\x53\x53\x14\x28\x2e\xa0\x33\x2e\x4a\xfa\x32\x9a\x74\x8f\x15\xc1\x79\xbc\x47\x40\xe2\xa1\x4c\xfe\xce\x95\x0a\x6a\xac\xf5\xaa\x68\x14\x07\x49\x1f\xbc\x65\x66\xb8\xa8\xaf\xb6\x22\xf0\x67\x73\x74\xf0\xb6\x06\x7c\xf1\x15\x54\xec\xa3\x7c\x24\xed\xc4\x34\x68\xfc\x56\x8c\x36\xb1\x17\xde\x98\xd5\xab\x7d\x40\x51\x18\x9d\x87\xb7\x81\x89\xa3\xee\x2c\xd9\x1b\xe9\x75\xa1\xb6\x34\x30\x75\x88\x56\xc5\x69\x34\x92\x83\x88\x75\x49\x31\x51\x5e\x55\xac\x69\x6d\x42\xad\x45\x3b\x09\xd0\x2f\x26\x83\x53\x19\x24\x16\xd0\xac\xd6\x9c\x8c\x93\x9d\x57\xae\x8b\xf2\xbd\x96\x3c\x7d\x7e\x0d\x83\x01\xa8\xde\x1a\xae\xbb\x4f\x3b\xe2\x1c\xea\x63\x14\x76\x61\xc4\x4f\xa1\x7d\x80\xdd\xea\x85\x95\xa6\xf5\x2a\x70\xc5\xf2\x5b\xb9\x98\x65\x5d\xe8\x56\x00\x6a\x75\xed\xec\x57\x76\xa3\x6f\x33\x09\x57\x50\x90\xd5\x45\x2d\xf8\x0b\x5a\xc4\x44\x35\xef\x42\xbc\xe8\x47\x44\x71\x91\x3b\x08\x96\x04\x8d\x06\x24\x1f\xd9\x3f\xb9\xe5\x26\x68\x6f\x44\x8b\x66\xc2\x28\x0d\x79\x98\x5a\xdc\x74\x43\xe6\x6d\x37\x15\xf2\xb6\xe6\x28\x12\x15\x9b\xba\x83\xb7\xee\x9d\xc1\x72\x1d\x2e\x84\x96\xd0\x2f\x24\xbf\xc6\x7c\x2f\x71\xb8\x99\x02\xe6\x31\x83\x1b\x10\x36\xf7\x48\x6c\xa1\x3b\x95\x70\xde\xc7\x2b\x04\x3e\xc0\x62\x66\x2b\x6f\xdb\xc2\x82\x24\x22\xe2\xeb\x99\x5d\x8f\x59\x7c\x62\x51\x8b\x02\x7c\x43\x1f\x4e\xa1\xa1\x6d\xa1\xc3\x75\xe7\x8b\x23\x68\x62\xfd\x59\xaf\x81\x87\xf0\x76\xcf\xb2\x89\x7b\x03\xcb\x9e\x9c\x20\x0c\x07\x56\x1b\x12\x08\x5a\x2f\x47\x4d\x37\x4d\xb7\x3d\x58\x91\xe4\x3d\x69\x00\x01\x58\x3d\x4f\x4c\x06\x44\x1b\x5a\x8b\x03\x57\x47\x63\x62\x7a\x54\x24\x95\xfd\x64\x7a\xaf\x60\xa5\xce\x05\xe8\xb4\x9f\xda\x96\x74\x11\x68\x29\xb8\x4c\xa1\x38\x16\xd9\xb6\x5d\x47\x3b\xd4\x2a\x9e\x59\x8e\x26\x5f\x86\x7d\x78\x7c\xde\xd9\x64\x0d\xdc\x74\xc5\x9a\x57\xc3\x18\x72\x41\xd9\x7d\x0a\xc0\x76\x23\xb4\xa7\x2d\x25\x12\xe4\xc8\xee\x68\xd7\x50\x70\x1e\xeb\xcb\x7b\x8a\x3a\x5e\x08\x0f\x77\x1b\x03\x00\x7b\xe5\xc4\x0f\xee\x89\xc3\x1e\x53\xe1\x70\x5b\xcd\x1a\x25\x40\xe3\xb6\xaa\x14\x3a\x01\x78\xc5\xad\xb9\xba\x19\xab\x9a\x1e\x9c\x61\xfe\xcb\x4f\xb0\x19\xe6\xe0\x72\xe6\x1e\x28\xcb\xb2\x7c\x46\xbe\xad\xf9\xaf\x3c\x7c\x8b\x9d\xe2\xf8\xaf\xbc\x7c\x8d\x18\xe9\x8a\x0e\xc1\x93\x12\x42\xc6\x12\xff\xcb\x17\xe0\xfe\x56\x15\xfe\xcc\x5f\x94\x9c\x3a\xe6\x49\x82\xfc\x62\x9e\x81\x2e\x19\x24\x79\xb0\x87\xfb\x56\x52\x98\xf6\x55\x78\x47\xaa\xb9\xa1\xa9\xd3\xeb\xaf\xf7\x57\x63\x10\xe0\x59\x80\x05\xbf\xc9\x01\xb2\xc7\x7d\xed\xf6\x28\x9f\x75\x87\x55\x18\xce\x6c\xf9\x21\x0d\x9f\xc6\xd0\xc0\x3a\x59\xe6\x6f\x6e\x37\xc5\x4e\xda\x87\x0d\xf7\x14\x69\xbc\x85\x84\x78\x48\x84\xf0\x08\x51\x54\xf5\xbc\x7f\xe5\x27\x9b\xc9\xa7\xa3\xd7\xe3\x69\xfc\x7e\x80\xa0\xfb\xe1\xf0\xf4\x8a\x0b\x61\xd3\x75\xa6\x6b\x14\xb9\xf5\x2c\xf3\xc6\x67\xe2\x19\x4d\x90\x38\x0e\xe3\xcb\x1c\x7f\x98\x4e\xe9\xbe\x9d\xcf\x0c\x5d\xe5\x0e\x49\x51\x8e\xe8\x99\x0a\x40\xee\xb6\xa0\x94\x33\xdb\x57\x50\x08\x4a\x90\x60\x89\x9f\xfd\xb9\xfa\xfc\xee\x4c\xa5\x8e\x5c\xdb\xef\xd8\xec\xe2\x04\x88\xf8\x2a\xd4\x66\xca\x95\xfd\xdc\xcc\xd1\xf8\x9b\xd4\x58\x31\x60\xdc\x9d\x68\x42\x08\xff\x3c\x46\x54\xaf\x2c\x83\x65\xfd\x24\xb4\x09\xb2\x46\x4f\x87\x49\xd9\xf8\xa5\xaa\x7f\xa5\xaa\x2a\x4b\x6a\x8e\xc3\x47\xa6\x70\x45\x1c\xac\xee\x76\x45\xaf\x64\xb1\x01\x79\x61\xcd\x8d\xea\x6e\x2a\x43\x66\xae\xef\x4a\x02\x7b\x8b\x07\xa2\x10\x5f\x52\x4d\xb2\x9d\x72\x9a\x38\xfd\x57\xc6\xb0\x57\x49\xe1\x22\x85\x2a\xd6\x28\x57\x79\x47\x29\xd9\x8d\xda\xc8\xc4\x29\x8e\x37\xe1\x8d\x4e\xb4\xb0\xb0\x25\x80\xba\xae\xde\x45\x65\x6b\xff\x50\x76\x30\xe8\x4d\xf1\x26\xd9\x79\x16\x92\xd7\xfb\xbe\xda\x9b\x86\x63\x9d\x91\xa2\x03\x52\x31\xea\xaf\x95\x23\xcd\x14\x65\x8d\x88\x7e\x64\x52\x0e\x95\x3c\xfe\x2e\x28\x67\x85\x47\xa7\x86\x27\xac\x88\x2a\x96\x68\x55\x56\x6d\x9a\x94\x20\x06\x80\x82\x38\xbf\x0b\xf9\x13\x93\x5c\x35\xad\x51\x8d\xb6\x05\xc0\xda\x62\x87\x1a\xeb\x14\xe2\xaf\xfd\x88\xef\x51\xb7\xe9\x35\x1a\xb8\x73\xcd\x1f\x0f\xda\xd4\x5b\xed\x83\x6a\x4e\xd1\x3a\xe4\xd9\x6b\x0d\xe6\x3a\x81\x2b\xea\x2d\xcd\xed\x9e\x5b\x05\xd8\x16\xb1\x9c\x1f\xeb\x22\x40\x01\xc9\xaa\x37\x3f\xf1\x3a\x81\xdb\x52\x91\x4e\x02\x4c\xcc\xaf\xbc\x02\x76\xd2\x7e\x8b\x95\xb5\x60\x7b\xf8\x7f\x94\xc0\x0c\xe7\x29\x77\x42\x5c\x97\x7a\x45\x12\x86\xed\xb1\x3e\x06\xf8\xda\xc8\x00\x58\x2b\x60\xfd\xfc\x6a\x8a\x4c\x45\x0b\xd0\xa9\x00\x26\x7c\xee\xc8\xf8\x3a\xe9\xcf\x83\x03\x0b\x75\x8c\x11\x96\xbe\xe5\x3a\x0a\x95\x44\xd6\x5c\x43\xd7\xc8\x31\x71\xbb\x21\x23\x6b\xbc\xa5\xd1\xb6\x8c\x39\x4c\x9a\x2e\xcc\x1d\xa3\x91\xcf\x2b\x27\x36\xd0\x0e\xe6\x2a\x0c\xae\x14\x7e\x24\xfd\xf0\xb8\x32\x19\xb2\xcf\xc7\xf8\x31\x8c\x0c\xff\x36\x27\xe2\x99\xbe\xb5\x3a\x3b\x79\x84\x39\xd0\x4e\x76\x7e\xf2\x2d\x38\x03\x89\x83\x60\x71\x5e\x54\xbe\x6f\x7c\xc6\x8d\xc5\x3e\x0a\xf1\x5f\x07\x0d\xbc\x0d\x9f\xf8\x08\xbd\xa5\x8c\x76\xc0\x04\x67\x8c\xe9\xc8\xa6\x44\x22\x9b\x40\xac\x2c\xe9\x7d\x3c\xef\x96\x17\x27\x5f\xf1\x8e\xf5\x2c\x56\xde\xcf\x51\x1e\xde\x69\x79\x87\xeb\x0d\x4a\x0a\xbe\x7f\x9f\xcb\x36\x61\x23\x35\x71\xa7\x4d\x41\x08\x01\xb2\x82\x1d\x58\xd9\x80\x6d\x32\xb2\xc0\x5d\x66\x16\xe8\xeb\xa5\xb1\x18\xf7\x00\x2b\x52\x2d\x30\x8c\xc4\x7f\x17\x6c\x58\x26\x18\x12\x14\x40\x10\x11\x40\x9f\xe5\x59\x16\xc5\x23\x38\x82\xa7\x0a\x76\x6b\xf7\x71\xdf\x41\x82\x21\xf2\x8e\x60\x5b\x36\xa4\xf6\x0f\xd3\x2d\x4a\xf4\x2a\x2d\x5b\x77\xca\xe8\x0a\x8d\x72\xc7\x8a\x6b\x10\x3d\x5b\x3b\xf7\x5d\xaa\x72\x6b\xb7\x4a\x6b\xb7\x65\x53\xbb\xfa\xe8\xed\x89\x0d\x76\xc0\x7d\x4b\x37\xa8\x80\x25\x96\xbc\x3c\xfd\xfb\xb2\xf9\xce\x3c\xec\xb6\xd4\x59\x57\x0d\x38\x30\x0a\x24\xdd\x46\xef\x07\x1a\x3e\x90\xf1\xd4\x0d\xb7\xb4\xf0\x26\xf4\xf8\x58\xe2\xea\xc1\x6d\xb4\xcd\x2f\xbc\x20\xa4\x50\x20\x3b\xbe\xd3\x64\x6a\x5a\x45\x98\x11\x3a\x8a\x80\xb5\x5d\x2b\xcc\xd4\xd7\xac\x66\x17\x03\x67\x2a\x79\xc9\xc5\xf4\xf5\x7c\x91\x3c\x1d\xfc\x3c\x4d\xec\x65\x0e\xf3\xf1\x6d\xd9\x82\x44\x51\x10\x49\x88\xc7\x18\x6a\x2d\xf2\x14\xfb\xed\xcc\x80\xa0\xb6\x75\xfa\x55\x4e\x16\xb4\xcf\x97\x6b\x4c\x25\x3e\x80\x6a\x74\x10\x91\xe1\xc1\xcb\x9a\xcd\x55\x71\x6a\x5e\x7e\x76\x8d\x5a\x55\x5f\x95\xb8\x5c\xcd\x50\x3d\x55\xd5\xe3\x20\xa4\x82\xe8\x05\x5e\x1b\xa5\x86\x80\xa0\x96\x2c\x06\xd4\x3d\xd8\x0c\x20\x1e\x57\xa4\x04\x76\x5d\xed\xb0\xec\xc0\x41\x7b\x2d\x2f\x8a\x97\xfa\x0e\x40\xb4\x66\xe6\x28\xdb\x6a\xc9\xab\x35\x11\x72\xc8\x70\xdd\x2d\x83\x23\x53\x76\xba\x20\xed\xb6\x1b\xde\x4e\xfa\x58\x72\xaa\xa2\x21\x73\x9d\x8c\x24\xe7\x0c\x56\xdd\x6b\x75\x4b\x13\x21\x1e\x20\x63\x32\x0e\x83\xe9\x3e\xec\xb7\x26\x28\xf0\x84\xca\xa2\xac\x6a\x3d\xe6\xc5\xa8\xdd\xa0\x3c\x7b\xed\x8f\xae\x3c\xbd\x8e\xff\x7a\x08\x61\x23\xb8\x5b\x50\x83\xe0\xab\x81\xcc\x07\xea\xf3\xf3\x1f\x3f\x5d\x9a\x9e\xb0\x67\xd0\xe6\xa2\xd5\xd5\x0e\x7d\xa2\x99\x80\x76\xb2\x6a\x8e\xa0\x57\x37\xc3\x68\xf5\x54\x03\x4f\xba\x79\xbf\x4d\x65\x7f\x9e\x2c\x8e\xb2\x4c\x98\x36\x06\xe6\x4f\x05\xc8\xfd\x22\x1f\xb2\xab\xdf\xb6\x89\xc4\x84\xed\x8e\x49\x26\xb6\xcc\xdc\xb1\x76\x4f\x06\x58\xb7\xc2\x9c\x0a\xb7\x44\xb0\xa7\xc1\x5e\x42\x9f\x80\x51\x5c\xfe\xae\xdb\x4c\x68\x32\xfb\x56\xdf\x5b\x4b\xa9\xdf\x08\xb1\xce\xf4\x48\xfe\xa3\x3e\x99\xa0\x65\x42\x5f\x35\xc1\x16\x5f\xa8\x11\x87\xf5\x71\xb0\x51\xca\x61\x15\xd7\x55\x2c\x0f\x88\xe1\xeb\x7e\x84\x3a\x7c\xf6\xa2\xad\xe1\xa0\xc1\x6a\xc4\x9e\x21\xa3\xe9\x13\x9f\x0f\xbf\xb2\x77\xaa\x7e\x12\x5f\xbb\x00\x42\xb7\xe2\x60\x54\x99\x45\xe5\xb7\xfc\x8c\x80\x33\x8e\xc4\x7f\x93\xc0\x4b\x03\x2b\x0d\xf7\x89\x9b\x23\x77\x30\x96\x9f\x03\x05\xbe\x2c\x06\x81\x50\xf9\x8f\x4c\x8f\x70\xf2\xa4\x7e\x0e\xb4\xb6\xea\xaa\x5d\x9f\x7f\x50\x7c\x23\x73\x0e\x2f\x61\x09\xb3\x29\x70\x48\x55\x60\x57\x30\x51\x41\x61\x04\xab\x11\x1d\x45\x74\x9c\x00\xeb\x07\x2e\xd7\x5d\xb2\x17\x74\x30\x97\xfb\x67\x0b\xfc\xa3\x3f\xb2\x16\xc3\xc6\x0c\x33\x33\xd6\xcd\x08\x7f\xaa\x35\x0c\x83\x33\xca\xfe\x47\x07\xe4\x19\x27\x66\x98\x9b\x61\x4b\x63\x15\xfb\x1d\x36\xef\x9e\xf1\x9b\x9c\xf2\x55\x85\x97\x7e\xbc\x70\x4a\x4d\x41\x33\xd5\xe0\x29\xe5\xe2\xde\x50\x62\x2b\xf7\x4c\x0a\x0d\x23\x28\x03\x73\x3c\xb1\x17\x51\xdc\x04\x79\xd5\x83\x33\x05\x82\x15\x27\x9a\x36\x71\xd5\x1c\x2b\xcf\xf6\x42\x4f\xa2\xd4\x8b\xd3\xf4\x8b\x43\xf7\x4f\xc1\x6c\x9d\x5d\x25\x46\xb8\x39\xa9\xd2\xdd\x23\x8e\x14\x34\xb9\x79\x6d\xbd\x6b\xb1\xc7\x98\x5a\xee\x73\x97\xa7\x18\x55\xbf\x98\x51\x1e\xad\x7d\x90\x85\x24\x7d\x62\xbb\xd3\xd5\x68\x3a\xe3\xe6\x08\x1c\xb1\xb4\xfb\xa9\xe0\x08\xba\xf6\x22\xe8\xb7\xbd\xbf\xf5\x9a\xc3\x6a\x97\x08\xa1\x51\x01\xc7\xe0\x53\x21\x7a\x18\x84\xda\x7f\x57\xcb\x6e\x53\x8c\x62\xd6\xcd\xdb\xab\xa9\x70\x86\x74\x3f\x38\xd6\xa5\x69\xaa\xcb\xc3\xeb\x90\xf8\x22\x4f\xaf\xc8\x9f\x8f\xff\x33\x56\x3d\x25\x86\x18\xdc\x7a\xe5\xcc\xcf\x1d\xdc\x74\xd2\x95\x4c\xa6\xd9\xf4\x9c\x74\xbd\x2e\xc6\x05\x3c\x42\x65\x1d\x58\x0c\xfe\xd7\xf8\x52\x12\xb4\xce\xf0\xb3\xaa\xe0\xab\x39\xc9\xcf\x7b\x24\xc1\x33\x01\xc7\xbf\xdf\xd1\x80\xe9\xe0\x62\xfb\xd2\x78\xe2\x59\x41\xc9\xba\x9a\x2b\xed\xb6\x91\xa7\x22\x61\xa6\xaf\x96\xee\xe1\x5d\x8e\x75\xa0\xb6\xc2\xbf\xad\xf7\x81\x85\x8f\x0a\x70\x40\x2f\x1a\xd5\x41\xf5\x3b\x8b\x85\xaf\x4f\xeb\x1c\x48\xf3\xa8\xb2\x13\x48\xf1\x37\xfd\xb2\x30\x82\xf0\x72\x57\x87\x30\x3a\x6f\x03\xe0\x5c\x6a\xbc\x8b\x71\x43\x8a\xa0\xf0\xc6\x79\x4c\xa6\x18\x4b\x11\xd0\xcd\xf1\x61\xe5\x83\x9c\x40\xc1\xe0\x5a\x5f\x16\x1d\x68\x73\x7d\x12\xd9\x09\x97\x78\x72\x11\x29\x22\x5f\x74\x07\x2c\xfa\x27\x1e\xa5\x9e\x22\x0d\xe8\x00\x18\x8d\x7f\x7b\x98\xe7\xbb\x89\x0c\x76\xfe\x4c\x0e\xc0\x48\x6d\x5b\x5f\xf9\x9f\xf9\xed\x59\x62\x44\x19\xfb\x04\xa2\x92\x82\x28\x29\xa2\xa8\x97\x98\x24\x09\x47\x0f\x4c\xa2\x0f\xd7\x9f\x29\x55\x3e\xf1\x9b\x9f\x79\xf9\x09\x6e\x9e\x92\x31\x52\x3d\x65\x53\x49\x27\x2a\xee\x67\x6d\x73\x72\xcf\xdf\x77\x67\x0d\x9c\xc3\xd1\x5c\xeb\x60\xf6\x4f\x8d\xa0\x68\x97\xa1\x68\xec\x59\x00\xcc\xb9\x00\xeb\xc9\xdd\xa0\xc0\x67\x2c\x28\x9c\xfa\x68\x1a\x6b\x38\xb4\x2c\x24\x84\x29\x41\xd2\xf0\x47\x94\xb0\x1f\xfb\x7d\xdf\x5c\x92\x27\xf8\x7b\xdf\x5f\xc9\xd8\xb5\xa6\x2f\x4a\x93\x7c\x52\x6c\xe6\x44\xb5\xe2\xa4\xc9\x34\xee\xd3\xea\xfe\x11\xbf\xdd\x2f\xdc\xb1\x5f\xb0\x49\x0a\x9c\xc2\x9d\x66\x1e\xe9\x57\xc7\xf0\x1e\x77\x46\x86\xe8\x33\x72\x0c\x96\xce\xf7\xf3\xac\xfa\x75\x82\x07\x8e\xed\x3a\x51\x00\x6b\x9c\x17\x15\xee\x3b\x7e\xe8\x9e\x38\x34\x0c\x1b\x06\xa3\xbc\x52\x9a\x4a\x31\xa8\x39\x6f\x3d\x78\xb1\x09\xf5\x98\xdc\x7c\x8d\xae\xc2\x30\x04\x51\xba\x53\x76\xc3\x4f\x06\xa1\x1c\xfb\x6a\x7e\x32\x99\x7e\x21\x39\x6c\x4a\x4f\x6c\x5c\x4e\xbc\xf6\x0e\x6c\x02\x4e\x7c\x58\x2b\x7c\xe4\x4f\xbc\xcb\x0e\x7c\x1a\x4b\xbc\x81\x64\x0e\x15\x5a\x41\x24\x45\xbc\x6b\x0a\x6c\x48\x0a\x6c\x0c\x2a\x6c\x68\xe5\x12\xe3\x83\x12\x87\x09\x09\x88\xc3\xac\x54\x77\xb4\x8c\x2f\xaf\xd2\x01\x2b\xd2\x73\xd1\x61\x87\x66\x60\x9b\x27\x6b\x65\xd6\x09\x5e\xe5\x7e\xea\xa5\x5f\x9e\x66\x32\x29\xec\x7d\x6d\x2f\xd2\xdf\x21\xd2\xd5\x0e\xd5\xb7\x21\xd2\xe3\x20\xd2\x7b\x0b\xd4\xbd\xee\x3d\x14\x3d\x71\x0f\xd9\xba\x26\xbc\x25\x29\x5c\xc5\xdd\xcd\x32\x03\xed\x37\x70\x0d\xb3\xac\x8b\xb2\xa3\x6e\xa6\xa3\x4d\x80\x92\x5e\xa4\xa3\x5e\xc5\xa1\xb6\xdd\xa2\x6d\x41\x93\x4e\xdc\xa2\x8e\xdf\xa2\x5e\xbe\xa2\x75\x4e\x92\xb6\xbb\xa2\x6e\xba\xa2\x4e\xb8\xa2\x5e\x39\xa2\xb6\x33\xa2\xad\x75\x92\x51\x32\xa2\x4e\x30\xa2\x5e\xd1\x04\x5b\x03\x6d\x58\xfd\x81\x78\xbf\xd2\xfe\xba\xf2\xbf\xe0\x87\xfd\x82\x74\xf9\xc1\xe9\xe6\x78\x27\xec\x6e\x51\xb2\x75\x60\xb2\xca\x10\x30\x7b\x57\xb0\xfa\x9c\x51\x51\x18\xcc\x5d\xfa\x31\x55\x3a\x27\x57\xba\x3b\x5d\x7a\x3e\xa5\xc3\xef\xa3\xd7\x43\x64\x69\x77\x35\x1a\xd8\x3f\xbf\x05\x72\x95\x2a\x58\x5d\x1c\x5e\xa1\x42\x86\xf5\x9d\xb7\xf4\xba\xb3\xf4\x85\xb7\xf4\x1b\x46\x7f\x61\x67\xe9\xa6\x67\xfd\x7c\xa0\x1a\x52\xb0\x3b\x47\x8c\x9d\x1c\x4e\x45\x83\xdf\x50\xc7\x41\xd0\xbb\x48\x73\x3d\xf0\x0c\x67\xb1\x9b\x7b\xf4\xb0\x4a\x57\x76\x70\xcf\x47\xd7\xc0\x8b\x85\xa0\xd6\x49\x79\x6b\xec\x5d\xb5\x5f\x36\xfc\xb4\x08\xd4\xf7\x4e\x4d\xa5\x0b\xd7\x5e\x0b\x8f\xf6\xe1\x31\x8a\xc0\x4f\x55\x95\xf0\x94\x6e\xd9\x07\x47\x04\xa4\x7f\x15\xd5\x7e\x7b\x87\x6c\xbd\x25\xdd\x91\x63\x23\xcd\x63\x76\x33\x9e\xa8\x9a\xf3\x99\x9c\x75\x1f\xd3\x74\xf9\x31\x76\x4d\xc2\xe7\xef\x99\x8e\xec\xb2\xde\x2b\x95\x04\x87\xa6\x1a\x42\x95\x27\xf1\xc6\xa1\x5f\xc9\xc1\x9e\xd1\x9e\x14\xa2\x96\x4c\xe5\x6e\x7f\x56\xb1\x18\xe5\xf1\x8a\x17\x65\x66\x4a\x28\xc4\x04\xdf\x16\x6d\x4d\x67\xde\x38\x43\xc9\x1a\xba\xb5\xef\x8c\xb8\xb9\x43\xb2\xf3\x79\xb3\x67\x7e\x35\x6e\x25\x73\x61\x40\x39\xf3\x12\x9e\x11\xc6\x1c\x4a\xad\x72\x0b\x2d\x9b\xfd\x10\x9a\x65\xc0\x23\xe1\xf6\x63\x9a\xc9\xe3\x9b\x0c\xa3\x61\x75\x8e\x69\xf1\x66\x3a\x41\x3a\xcd\x7f\x13\x35\xb8\x63\x22\x81\x0f\x7d\xb1\x83\x24\xb2\xd9\xd7\xad\x8d\x68\x76\xf6\x27\x93\x99\x2e\x62\xcd\x49\x6a\x10\x6b\x79\xc8\x51\x5c\xc9\xf2\x40\x7d\x41\x81\x55\xb1\x7a\x10\x51\x16\x53\xd7\xc4\xc1\x19\xbe\x9a\xd8\x2d\xc4\x03\x23\xdb\x6f\xd8\x8c\x90\xb4\xd3\xe7\x93\xa2\xd2\x83\x9d\xf5\x87\xc4\x18\x2d\x3e\xa0\x26\x7d\xc4\x01\x45\xe1\x38\x5f\xc7\xd2\x75\x79\x2e\x75\x18\x02\x58\xa3\x0e\x61\xae\x46\x1b\x43\xe3\x0a\x97\x13\xe3\x9b\x9c\xc7\x58\x24\xbb\xbb\x51\xfb\x68\x3c\xe3\xae\x97\xcf\xbf\xdf\xa2\xe4\xf9\x7a\x8c\x9a\x5a\xe9\x67\xf1\xf8\x1d\x4a\xae\xc5\xd0\x7b\x11\x8d\x94\x3d\x16\xab\x50\x05\x71\x2e\x81\x16\xe6\x7b\x5b\x07\xdd\xf1\x19\x39\x1e\x09\x1e\x5c\x33\xe4\xc9\xca\x2b\xcd\x27\xf6\x66\x53\x88\x18\x76\xe9\x84\xf7\xa4\x21\x2a\x49\x34\x00\x9a\x64\x79\xf3\xf7\x7e\x47\x19\x24\x9b\x73\xca\x1c\xb7\x7a\x17\xc3\x60\xcf\xee\x69\x21\x33\x77\xce\xeb\xbd\x28\x3d\x53\x3c\x79\x89\xaa\x77\xea\x5c\x3b\x6d\x56\x7a\x75\x6c\xba\xcc\xae\x7b\xf1\xdd\x52\xc6\x22\x92\x3a\xcf\xbc\x3a\xaf\xe2\xbc\x41\x64\xae\xc6\xe4\xcb\x98\x4c\x7c\xb2\xea\x5a\x2c\x38\xed\x73\xa7\x42\x17\xb7\xc6\xd7\xee\x87\x64\x38\xec\x25\x42\x39\xcf\xbc\xa6\x66\x43\xc5\xeb\x32\x8e\xe2\xba\xb6\x9d\x99\x59\x17\x9b\x9e\x83\xec\x32\x76\xa1\x3e\xef\x02\xb4\xa4\xd6\x69\xf4\xa5\xf7\x92\x31\xf7\xa9\xd5\x3c\x20\x73\x41\xfd\xd7\x46\x2a\xc6\xa3\x95\xa0\x0c\xc3\xfc\x9f\xff\xfc\x5f\xd5\xbc\x8d\xe9\xf1\xbf\xff\xe3\x9e\xab\xea\x3f\xfe\xf3\x1f\xa4\xdb\xe3\x1d\xca\xff\x42\x42\xff\x07\xe9\x42\xbf\xff\x9b\x2e\x5c\xec\xfa\x7f\x82\x2e\x8c\xfe\xa2\x0b\x71\xaa\x12\x9e\x7f\xd1\x85\xda\x3f\xd3\x85\xfa\xbf\xd3\x85\xf6\xef\xfb\xfe\x45\x17\x26\xf7\x3f\xd2\x85\xdc\xbf\xd3\x85\xe9\xcd\x2e\xff\x8f\x2e\xc4\xfe\x99\x2e\xb4\xff\x91\x2e\xac\x18\x86\x31\xb0\x9b\x61\x64\x09\x03\x49\x59\xe2\xa5\xbf\xe9\xc2\x59\xf9\x77\xba\x30\x89\x6b\xf7\x5f\x74\x61\xcf\xfc\x3b\x5d\x48\xb0\x1c\xfb\x37\x5d\xf8\x4b\xfe\xa4\x0b\xff\x38\x2f\x2f\x5d\x61\x1d\x08\xc2\xbf\xe9\xc2\xef\xcf\xb9\x2e\xff\xe3\xd7\xa6\xc5\x20\x3b\x6d\xfc\x17\x5d\x88\x30\xff\x9d\x2e\x5c\xc4\xbf\xe9\x42\xeb\xcf\x87\xd1\x1f\x47\xaf\xdb\x0a\xf0\x60\xf1\xdf\x74\xa1\xc8\x43\xff\x44\x17\x06\x6a\xfd\x4f\x74\x61\x20\xff\x37\xba\xb0\xf8\xff\x95\x2e\x34\x32\x35\x0b\xc4\xe8\x2f\xba\x10\xa5\xcb\xab\xfe\x85\xbe\x4c\x08\xb5\x12\xd4\x19\xf4\x38\xd2\xc8\xb4\x6f\xea\x34\xbe\xf3\xae\x6e\xd7\xf6\x69\x72\x65\xdd\xa4\x58\x0f\x8c\x08\x9f\x78\x56\x58\x1e\xd6\xa1\xdf\x94\x32\xcf\x0c\x8b\x60\xf5\x0f\x52\x73\x6d\xdc\x47\xd2\x39\xc7\xcf\xf3\xc5\xdc\x5b\x3f\x7f\xd1\x85\x6c\x3c\x42\xc0\xc0\x39\xf2\x84\x5e\x66\x45\xef\x1c\x68\x67\xa7\xae\xf2\x58\xf1\x91\xe8\x75\x59\x65\x4e\x1d\x40\x1e\x32\x2b\xc7\x08\x49\xfd\x1b\x83\x27\xb2\x6e\x03\x2f\xe5\xd9\x7e\x50\x9e\x72\x08\xf6\xce\x49\xb2\x30\x19\x2a\xc8\x49\xd0\x31\x99\x32\xc8\x81\x4a\x9f\x72\x2b\x99\x79\x2a\xf1\xc2\xbc\x27\xad\xa6\x60\x6c\xfd\xe6\xc5\x68\xcc\x9d\x56\x2d\x8f\x32\xed\xfa\x58\xcb\xc4\x50\x1d\x1b\xf9\x51\x80\x91\x6e\x45\x4a\x37\x06\x9a\x79\xc2\xdc\x86\xf5\xc8\xc0\x15\x4e\x0d\x95\xc1\x12\xf2\xa3\xfe\x29\x20\x5b\x7a\xaa\xd2\xad\x82\x7f\x45\xed\x5b\x51\x76\x41\x25\x19\xe6\xca\x77\x6e\x55\xaf\x8a\x02\xf4\x83\x5b\x55\x51\x76\x27\x5e\x80\x19\xa8\x02\x66\x45\x93\x1d\x77\x7e\x88\x49\xcb\x6f\x69\x51\x21\x59\x36\x5d\x22\x4c\x95\x74\x3e\x46\x8e\x77\x20\x77\x91\xb4\x06\x19\x50\x99\x7b\xe6\xb7\xb0\x9d\xe9\x89\xf9\x13\xd2\xb9\xd3\x0e\x1b\x17\x3b\x5e\xa3\xc7\xb1\x02\xf0\xb7\x13\x3b\xaf\x73\xa3\x75\xdb\xdd\x83\xc0\x45\x3a\xd9\x27\xc1\xaa\xd4\x8e\x46\x39\x96\x59\xa9\xb6\xf2\x59\xcd\x0f\x18\xa8\x91\xfd\x51\x76\x3d\xe4\xea\xe3\xca\x1c\x06\xa1\x1c\xf6\xd5\x0e\x25\xe6\xed\xdd\xf7\xed\xbd\x1d\x42\xa3\x19\x02\x7f\x52\x9e\x99\xdc\x93\x3b\xb4\xb4\x47\x0e\xa9\xc7\xba\xbd\xa7\x2f\xb6\x72\x06\xae\xb7\x12\x36\x77\xa9\x75\xb0\x65\xcc\xe1\x17\x9e\xea\x5a\xf8\x57\x85\x02\xa2\x4d\x9e\x40\x9c\x05\x62\x8c\xea\x95\x40\x58\xcc\xff\x1c\xe7\x81\x9d\xfa\x38\x15\xa6\x59\x15\x7f\xff\xe4\x1a\xbe\x9b\xd6\x75\x5f\x97\xfb\x69\xaa\xc9\x3e\x96\x3e\xe1\x2b\xd6\xbb\x20\xa3\x6e\x66\x45\x2f\x99\xa9\x51\x9a\x6f\x2f\x47\x23\xe0\x19\x57\xbd\xa5\x22\x2b\xb1\x5d\x3a\x0f\x76\x08\x7c\x4b\x39\x65\x79\xf7\xee\xc1\x4a\x83\xc4\x58\xbe\xcf\x90\xbe\xcf\xc8\x7e\xce\x96\xf3\xcc\x57\x82\xa2\x55\xc2\xa8\x25\x6d\xc5\x20\x7e\xbc\x82\x82\x34\x94\xb0\xf5\x6b\x87\xa6\xb8\x4a\x7b\x0c\x07\x84\xc5\xa9\x24\x8e\x32\x74\x7a\xf4\x81\x91\xf4\x81\x8e\x5e\x3a\xea\x55\xa1\x64\x57\x3a\x7e\x6d\x38\xdc\x73\x17\xde\x4c\x2c\x86\xe5\xbc\xd2\x3d\x89\x95\xf0\x51\x67\xc5\x55\x71\x50\x2a\x6f\xe1\x49\x59\x86\x51\xc0\xe5\x51\x08\xe5\x31\x82\x90\xa7\x73\x5a\xe2\xeb\x7f\xc4\x57\x2b\x41\x76\x9a\xdc\x81\xf4\x8b\x4f\xbc\xb8\x99\x1f\xf8\x11\x3c\x13\xb4\xf5\xd7\x39\xf0\xf4\x4e\xa3\x5c\x69\x74\xda\x8e\xc2\x59\x98\x9d\xe3\x69\x5a\xc0\x22\x6d\x5e\xe6\xa2\x0e\x8a\x65\xa6\xa3\xd7\x23\x01\x58\xc6\xd5\xa1\x5e\xf3\xf9\x95\x44\xc1\x54\xd5\xe1\x95\xfc\xbe\x50\xe5\x86\x4f\x79\xb5\x74\x01\x9b\xa0\x82\x02\x50\xe2\xa4\xc9\x6c\x43\x98\xd7\xae\x98\xc7\xa3\xb1\x27\x5b\xbe\xc7\x68\xdc\xaf\x55\x16\xb2\x9f\x04\xdb\x88\xc7\xc5\xf6\x31\xb3\x1d\xe2\xf6\x1e\xe2\x76\x87\xc6\x5f\x20\xae\x27\x14\xfe\x22\x91\x58\x67\xcc\xf6\xda\x5c\x69\x1e\x53\xb8\x89\x4a\x60\x84\xa8\x15\x3a\xc2\x1d\xc0\xf0\x48\x40\x48\x01\xcb\x08\x3c\xff\x45\x17\xb6\x36\xd9\x02\x73\x9d\x44\x42\x1a\xcd\x2e\x68\xbf\x7f\xd3\x85\xdb\xfa\x7f\x69\xba\x6b\x9c\xed\x79\x06\x0d\xc3\x0b\x4a\x11\xa6\x32\x9c\x3b\xcc\xd4\x85\x99\x39\xab\x1f\xbd\xcf\x7c\x7f\xeb\xc2\xf5\x79\xc9\x96\x8e\x0e\x0a\xb1\x71\xff\xa3\x0b\x91\xa8\x7d\x93\xc9\x8d\x02\x79\x89\x9c\x0d\x15\x97\x10\x5d\xe5\x5f\x08\xfb\xe1\xb0\x3c\x8b\x05\x67\x88\x46\x88\x53\xe4\x66\x5e\x69\xa8\x97\xc8\xb1\xd6\x60\xce\xfb\x97\x80\x0b\xbc\x0c\xd4\xf1\x2c\xef\x1c\xfe\x4e\x47\x81\xb7\xd0\xb3\x9e\xc4\xf1\x2e\xcd\xee\x71\xe9\x45\xbb\x73\xba\x3e\x68\x1d\x4d\x81\x4f\xbf\x08\x8d\x9f\x4d\x6c\x8d\xe4\xf3\xbb\x10\xe3\x06\x89\xfa\x6c\x04\x63\x87\x3d\x11\x9c\x4c\xd2\x87\x10\xdd\x63\x64\xda\xd2\x62\xa1\x3f\x0d\xc2\xe1\x9a\xf7\xc9\x2f\x61\x0b\xac\x9e\xc8\x3c\x73\x59\x54\xca\x7f\x41\x83\x8f\xa5\x18\x21\xfb\x8c\xbb\x99\xb9\xaf\xf8\x4b\x21\xd0\x63\xbe\x19\x12\x8f\xa6\x93\x5b\xbf\x29\x7f\xc0\x86\x78\xed\xa1\x52\x85\x4d\x11\x42\xc4\xed\xac\x37\xca\x12\x35\x3b\x07\x1b\x26\x22\x06\x55\xe2\x6e\x9f\xc9\xbc\xdf\xcc\x97\x29\x5e\xaf\x25\x66\x18\x53\x43\xc2\xe6\x0e\x98\x15\xd3\x2d\xf3\x89\xa0\xad\x66\x2d\x58\x27\xba\x58\x6b\x1d\x0c\xca\xcb\xa7\x27\xe2\x56\x0e\x68\x2e\xa0\xd1\x23\xc6\x2f\x5b\x54\x18\x58\x08\x34\x7d\x8f\xb3\xb7\xb2\xe2\x07\x9e\x70\x05\x13\xbe\x01\xba\x31\xbd\x2e\x0b\xe8\xd3\x60\xc0\x80\xc5\xc4\x39\x04\x10\xa9\xa8\xcb\xa0\xdf\x0f\x86\x60\xf2\x72\xc8\x3a\x46\x21\x1f\x7e\x0f\x72\x58\xb2\x39\x25\x1f\x14\x2d\xd0\x12\x00\xf0\x67\x2b\x78\xfa\xe3\xc9\x46\x46\x7d\x30\xff\x0e\x7a\x3d\xf2\xe7\xca\x77\x84\xd8\x4a\x6a\x3a\xf2\x13\x3e\x27\xf0\xe4\x4b\x4a\x2f\xf2\x10\x20\x05\x80\xbc\xc8\x05\x3c\x51\x00\xf3\xb6\x8f\xbc\x00\xb0\x56\x2d\xba\xb6\x68\x38\x04\x9e\x19\x7c\x0c\x70\xbe\x80\x7d\x00\xd6\x05\x3c\x49\xd0\xfd\x40\xbe\xa2\x19\x94\x28\x23\xc0\x01\x09\xa5\xc2\xc4\x88\x18\x2a\x4a\xbd\x28\x17\x06\x66\x14\x34\x33\x30\x27\xc1\x90\xac\xb0\x00\x44\x59\xf0\x69\x2a\xda\x05\x31\x08\xc4\x75\x10\xe3\x2b\x0a\xaf\x38\x1e\xf3\xed\xa1\x8f\x05\x6e\xe3\x5b\x91\x29\xd2\xdd\x8a\x75\x4e\xce\x85\x73\xe1\xaa\xb0\xfe\xe9\x94\x49\x63\x19\x76\x9b\xef\xfd\xf3\x4a\xa9\xd9\xb9\x9b\x12\x97\x8d\x5f\x37\x06\xd9\x18\x20\xb3\x91\x2b\x16\x8a\x8d\x9b\x36\x06\x25\x19\x4a\xbe\xe1\xab\x09\xcd\x5a\x5f\x28\x83\xc4\x72\xeb\xce\x63\x7b\x6e\xa7\xed\x29\xda\x2f\xcc\x4a\x7b\x78\x26\x3f\x89\x16\xff\x1e\xe7\x27\xfb\x34\x13\x7a\x61\xb0\x4f\xf3\x18\x7e\xba\x3c\xb1\xf0\xf6\xe6\xbb\x80\x3c\x2f\xa1\xc7\x90\x33\xb0\x60\x73\x40\xa6\xd6\xa7\x12\x57\xd8\x0b\x16\xeb\x49\x5c\xca\x3a\x0f\x2c\x4d\x53\xc1\x4f\x0a\xb2\x46\xa0\x24\xb0\x1b\x95\xc4\x3c\xc1\x31\x28\x43\xa5\xef\xa5\xa8\x54\x3b\x91\x82\xd6\x9f\xb3\x03\x52\xba\xf6\x78\x03\x80\xb7\x76\x69\x81\xf0\x34\xe4\xf4\xc3\x9f\xe9\xd2\x61\x1c\x56\xd2\x3c\xd1\xad\x43\x9d\x46\x9c\xda\xb2\x0c\xd4\xe8\xd4\x18\x00\x77\xbd\xbc\x4b\x1a\x30\xa4\xd2\x03\x32\x7e\xf2\xa7\x3c\x91\xe8\xba\x50\x33\xfd\xc0\xe4\x3c\xdd\x8d\x6f\x3f\x63\xba\x76\xcf\x84\x65\x57\x01\xd2\xcb\x98\xc8\xc8\xdb\x78\xfc\xa4\x07\x24\xf9\x7e\xe0\x2a\x6d\xf0\x8c\x20\xed\xda\xae\x37\xf8\x95\xab\x0f\x6b\x31\xbe\x86\x99\x4b\xac\x8e\xb3\x80\xf3\x8e\xf4\x01\xa8\xaf\x95\x48\x0a\xc8\x49\xa4\x0a\xd1\x3e\x0b\x79\x03\x1f\xdd\x06\xc8\x9e\x26\xeb\x13\x18\xe7\x42\x6f\x1a\x40\x33\xcf\x82\xd6\x44\x0a\xba\xe6\x06\x25\xb4\x81\x03\xc5\x5e\xad\x6b\xee\x2d\x47\x67\xbc\x5a\x40\xba\x11\x20\x6d\x96\xb5\x90\x99\xe1\x06\x61\x41\xa7\x39\x4a\xa8\xa9\x9e\x1c\xaa\x9a\x98\x50\xf4\x59\x78\x48\x6c\x15\x5e\xb4\x34\xb4\x5a\x3d\x3a\xf2\x74\x10\x0e\x91\x34\x8d\x6e\x6e\x40\xb4\x45\xf7\xd5\x52\x65\xf2\x4c\x76\x3c\xb9\x1b\x53\x32\x94\x57\x1b\xbd\x51\xd0\x56\x45\x1e\xac\xd3\xde\x0d\xa6\x7a\x90\x17\x0d\x02\xac\x96\xbc\xeb\xb9\x47\xf9\x02\x98\xc4\x9a\x0c\xa9\x0b\x13\xc3\x04\x13\x78\x23\x42\x4f\x89\xb0\x02\xf0\xe0\x45\xcc\x8f\xc6\xf3\x43\x8f\x18\xda\x26\x72\x97\x68\xb0\xf6\x20\x9a\x28\x1e\x9a\x8c\xe1\x34\x5b\x10\x52\x46\x81\x6b\xdc\x67\x20\x10\x40\xe8\x79\xd0\x3d\xbf\xad\x98\x28\xc9\x9e\xfc\xb0\xaf\xf5\xb7\x0d\xf7\xad\x84\xce\x48\x69\xeb\xc2\x2a\x23\xab\x86\x9e\xe6\xec\xc1\xc8\xf2\xbe\xa2\x70\x07\xad\x22\xdb\xd0\x4b\x05\x1e\x60\x23\x45\x1e\x6c\x7e\x32\xc5\x22\x00\xa1\xe3\xed\x9e\x41\x2b\x0c\xb0\x95\x70\x31\xbe\x09\x0a\xf6\x21\x2e\x56\x56\x1a\xb8\x93\x12\x2f\x4a\x41\xad\x6b\x3d\x9d\x0f\x08\x2e\x2a\xd0\xe5\x1d\xe2\x51\xdb\xcb\x79\xfa\xda\x9d\x34\x43\x59\x69\x2e\x8a\x65\xfa\xd0\x67\xf2\xf3\x06\x21\x64\xf5\xd9\x40\x3a\x3e\x28\x7b\xed\x6f\xa5\x37\xd8\x76\x89\x23\x06\x3b\x81\x99\x19\x1a\xe5\x46\x27\x75\x73\x80\xfa\x4d\x8a\x8b\xf5\xfe\x22\x3a\x84\x8b\x53\x9b\x07\xda\x15\xd1\x11\x99\x6a\xff\x8f\x36\x9f\x19\x99\x61\x4a\x86\x11\x05\xa7\x7f\xfc\x7f\x49\xfa\xff\x63\x82\x07\xff\xa0\xec\xff\xfa\x2c\x46\xd8\x31\x1f\xb9\xfc\xd6\x79\xf5\xd6\x35\xff\x71\x3c\xf6\xd6\xf9\x9a\x4f\x85\x04\x7b\x1a\x41\xd2\x11\xa6\x52\x19\x5f\xd6\x98\xef\xf7\x13\x6d\x12\x65\x40\xb6\xce\x25\xb6\xf0\xc1\x3f\x2e\xcd\xe9\xe3\xf1\x47\xbd\x6b\xbb\xdf\xba\x70\x4b\xaf\x27\x3d\xfa\x0a\xc9\x7e\x3d\xeb\x1e\xc3\x2b\x89\xbd\xfc\xf7\xf4\xb7\xc2\x3d\x3c\xd8\xdd\x20\xe4\xcf\x04\x82\x07\x0a\x39\x6a\xe3\xc1\xf4\x95\x2c\x10\x94\xb6\xa2\x10\x21\x4b\xde\x02\x83\xfa\x25\xfb\x0a\x26\xd2\xb9\xdb\x36\x14\xb8\xaf\x82\xf5\xf3\xd3\x7b\x3e\x6c\x22\x12\x40\x60\x46\x68\xea\xd7\x0e\x04\x21\x80\xe9\x72\x5e\x44\x1e\x6f\xe9\xa7\xac\x8c\xe8\xf4\xaf\xee\x88\x1c\xc7\x1f\x7c\x3a\xa8\x2a\x57\xe5\x8d\x83\x44\xa8\x83\xbd\x75\xf4\xba\x69\x1b\xd4\xfd\x79\x43\xfd\xc6\x10\x76\x90\x39\xcd\x3c\x49\xd7\x65\x2d\xe3\x30\x98\x51\x6e\x7e\x75\xfd\x3a\x3a\xdb\x9f\xb9\x22\x8c\xeb\x22\x9c\xa3\xa7\xf8\xf9\x9b\x18\x9c\x9a\xfc\xdc\x1f\x1d\x60\x49\xf6\xa0\xad\xa7\x5a\x23\x81\x8e\x02\x68\x6a\x78\x88\x89\xe1\x2e\x86\xab\x14\x7e\xf3\xfa\x34\xc1\xb6\xc0\x28\x10\x57\x80\x0f\x2d\x55\x5c\x89\x9d\x43\xa6\x1d\x32\x75\x63\xd5\xa8\xd5\x27\x8b\xca\x26\xb9\x2a\x37\xba\x4a\x33\xba\x4a\x31\xba\xea\x1d\xbe\xb6\x97\x6c\x64\x52\x49\x21\x01\xd3\xaf\x74\x3f\x08\x85\x5a\xc3\x28\x88\xa1\x20\x86\xad\x68\x90\xab\x12\x21\x2e\x7c\xd0\x01\x07\xfa\x39\x18\xf8\x47\x7a\x84\xb4\x5f\xc3\x2b\x56\xae\xae\x17\xae\xec\x10\x5e\xc4\x61\xc3\x41\x7a\xac\x81\x16\xae\xfe\x12\xae\xf6\x12\x2e\x3a\xb1\xf8\x53\xd9\x50\x10\x3e\x05\x63\xe5\xd1\x3d\x61\xe5\x7e\xc9\xff\x0a\xca\x8b\x59\x7a\xa3\x49\x1e\x47\x34\xf2\xcc\xd0\xb2\xc3\x90\x4b\xc2\x31\x90\x93\x7b\xb9\x52\xa2\x80\xa4\x17\x20\x39\x4b\xfe\xf4\xb0\x1f\x9d\xb1\xaa\x45\x7e\x60\x2b\x3b\x47\xa1\x88\xf0\x03\x17\x27\x8e\x61\xbf\x3e\x42\xaf\xae\x76\x5f\x90\x22\x04\xa8\x02\x4e\xc5\x62\x7e\x32\x34\x7f\x14\xcf\x71\x4a\x9c\x7c\xcf\x6f\x79\x08\xd5\x4d\x1a\x53\x61\xef\xac\xc6\xfa\xba\x6f\xdb\xb6\x0d\x85\xdf\x9e\xdb\x8e\x77\xab\x0a\x2f\xfd\x31\xc7\xd3\xe8\x48\xba\xf2\x0b\x7c\x67\x11\x25\x73\xd5\x13\xfb\x4e\x93\xce\x88\xf4\x84\x97\x4a\xce\x7f\x7a\x61\x31\x93\x7b\x70\x47\x3d\x81\x92\x44\xb1\x78\x4f\x4a\x9d\x17\xf9\x46\x5d\x29\xf0\x4f\xca\x59\x0e\x9e\x84\xb8\x87\x53\xf9\xea\xf7\x25\x66\x07\x4d\x2a\xc5\xea\xa2\xcc\x62\x53\xb3\xb8\xc6\x9f\xc9\x30\x7d\x1f\x8a\x45\xfc\x1b\x64\x25\x08\xfc\x1c\x17\x52\x6d\x92\xc4\x97\x76\xde\xa1\xbc\x72\x98\xf5\xe8\xc4\xb2\x11\x3e\x59\x87\x12\x5f\xc7\x09\x81\x82\x95\xf4\x0b\x28\xfc\xea\x4c\xcb\x51\x02\x1e\x3b\x00\x46\x72\xc0\x84\x43\x2c\xa0\xf2\x4b\x60\xe8\x11\x9e\x92\x18\xf1\x8f\xf1\x75\xa4\x0e\xbe\xe2\xaf\x93\x77\x93\x73\x72\xea\xe9\x17\x3f\x9b\xb9\xdf\xd6\x76\xc5\x43\xd4\x69\x12\x0b\x91\x0d\x3e\x68\x58\xaa\x93\x24\x0b\xfb\x8c\xd0\x99\xe4\x57\xe5\xd7\x31\x76\x00\x6b\xc0\x37\x71\x7e\x06\xc3\xa3\xa8\x98\x79\xa2\x45\xe7\xb2\x10\xbb\x4f\x50\x8f\x78\x50\x08\xd7\x00\xe3\x04\x5a\x32\xce\x1b\xeb\xd9\xfc\xd1\xa2\x37\xa3\x51\x75\xc1\x25\x77\x32\x2c\x96\xad\xf3\x10\x82\x8d\x41\x9d\x4a\xe0\x2b\xeb\xd0\x05\x18\x63\x94\x81\x20\xa5\x40\x9d\x30\xdd\x20\x5e\x81\x55\xcb\x00\x8c\x4e\x5b\x7c\xd0\x60\xc8\x0a\x87\x69\x54\x79\x4e\xe3\x06\x97\xe4\x77\x12\x3c\xcc\xbe\x7f\xc9\x9e\xf2\x8e\x50\xde\xf6\xe2\xef\xc7\x32\x90\xa4\x92\xbe\x4a\x98\xe2\xbe\xd9\xe1\x38\x98\xc2\x84\xb2\xd9\xe6\x54\x01\x78\x6f\xe8\xf0\x22\x93\x35\x1b\x28\x9e\x92\xcf\x95\x28\xb3\x24\x4c\x57\xe6\xcb\xa0\x77\x7e\xda\xfe\x65\xf8\x81\xc7\x9f\xea\xff\x24\xab\xd8\x6e\x87\xd3\x0c\x08\x6e\x96\x34\x52\xb5\x82\xf8\xd2\xc2\x13\x77\x48\xc0\xb2\x64\xde\xae\xd3\x57\x7b\x07\xa4\x9d\x95\x76\x56\xbd\x31\x88\x87\x9a\xe6\x97\xe1\x05\xea\x3c\xea\xcf\xa3\x04\x2d\xfa\x05\xa6\xc3\x69\x79\xe1\xb6\xe3\xa3\x96\x4d\x39\x79\x9a\x07\xc3\xf3\x97\x6c\x74\x94\x06\xf6\x1c\x80\xf2\x37\x70\x98\xa0\xd2\x15\x7d\xe9\x4f\xe6\x05\xb4\x7d\xc5\xc4\xd2\xe4\x8c\x1b\x48\x8a\xcf\xd5\x3f\x47\x01\x9e\xb9\x47\xe2\x1b\x76\x30\x65\x1c\x2d\x5a\xe6\xad\x0b\x8e\x20\x36\xc3\x57\x67\xb6\x08\x42\x46\x14\x69\x57\x89\x0a\xf2\xde\x0e\x28\x18\xb5\x7e\xb9\xfb\xd5\x5c\xde\x56\x14\x87\x26\x4b\xee\x56\x25\x48\x38\xea\xc9\xc7\xba\x3a\x2c\xd2\x0d\xc0\xdd\x40\x3b\xc3\xbe\xfd\x6a\x4e\xef\x4d\x59\xef\x37\x4e\x23\x85\x24\xf9\x8a\xfc\x76\x36\x04\x11\x66\x0a\xe3\xe8\xdf\x60\xa7\x43\x02\x1a\x76\xb9\xfe\x96\xb1\x63\xec\x0f\xf1\x35\x4e\xd6\x12\x1e\x38\xc2\x83\xd5\x30\x7d\xaf\xe5\xba\x49\xc2\xaa\xac\x77\x7e\x85\x0f\x94\x90\xf6\xb9\x21\xad\xac\x19\x17\x45\xd4\x71\x5e\xf5\xb7\x3e\x92\x17\x67\xf1\x52\x84\x4b\x3f\xc6\x36\xfd\x29\x0a\x67\xe7\x1e\x90\x22\x67\x37\x54\x87\x62\x09\x53\xd0\xf9\xe7\xdf\xb1\xb0\x62\xab\x88\x1e\x41\x8a\x94\x4c\x6e\x6e\xa7\x66\xe1\xd9\x49\x92\xb0\x81\xa7\x34\x57\x92\x23\x9f\xe4\x14\xcb\xa2\x2a\xb7\x18\x52\x24\x16\x85\x86\xe9\x2d\x6a\xa8\xf7\xac\x7a\xb2\x4b\x3b\xb2\xd3\x1f\x4a\x1b\x4b\xfc\xd0\x98\x3e\xdc\x0c\xa1\x55\xf0\x08\x89\xce\xbd\xf1\x63\x0f\x3b\x23\xa0\xb7\x45\x94\xca\x62\x33\x83\x68\x6c\x27\x9c\xfc\x26\x4a\x3b\x36\x2e\xa4\xe1\x57\x73\xbd\x24\x5f\xea\x49\xc9\x02\x47\x30\x36\xfa\xa6\x4c\xd8\xd9\xf1\x9d\x4b\x7b\x8c\xfc\xbe\x79\x60\x9a\x61\xbe\x39\xcc\x28\x53\x71\x6e\x66\x55\xea\x79\x57\x76\x0e\xcf\x1d\x1b\x7a\x32\x9a\x92\x57\x9d\x2d\xef\xb7\xbc\x90\x86\x40\x7b\x41\xd2\x4d\x3b\x65\xc1\x3d\x01\x5c\xce\xdc\x5a\xe9\x3a\xa6\x8f\x8c\x2e\xe5\x3a\x66\xe3\x27\x97\xb6\x0c\xff\xcc\x5f\x7f\x82\x42\x03\xd6\x5f\x6b\x03\x71\xaf\x2e\xc2\x09\x5b\x48\xdc\x63\xc5\x8c\xba\xd9\xfa\x22\xc9\x44\x3d\x9a\x66\x1e\x8d\x4a\x6b\xb7\x10\x60\xe2\xc4\xf4\x8e\x5b\x83\x14\xfc\x99\xd8\x01\xdb\x82\xd8\x31\x70\xe7\x71\x4a\x26\x37\x7d\x14\x12\xc9\x42\x0c\xab\xa1\xba\x3a\xe2\x2f\x3e\x3c\x61\xe9\xa0\xbe\x33\x54\xeb\x56\xc4\x53\x66\xa3\x42\x6a\x0c\xa2\x06\x04\xf3\xae\xc4\x1b\xc5\xd1\x5c\x72\x33\x09\x30\x9a\x99\x3b\x06\x75\xae\x89\xe8\xc9\xde\xbc\x89\x9f\x69\x6a\xee\x28\x78\x22\x0f\xe2\x33\x9e\x41\xa7\xee\xc4\x5d\x89\x9f\x18\x26\x89\x1c\x24\x4f\x97\xa6\x23\xd6\x00\xbe\xa7\x9e\xf8\x00\xa4\xae\x0a\xc0\x35\x30\x23\xf6\x44\xe2\xb6\xd6\x87\xc2\xd2\x8e\x5e\x89\x31\x57\x0b\x99\xf7\x89\x87\x4e\x54\x7a\x86\x83\x6c\xa7\x0f\xc1\xe8\xb0\xf9\x0e\xee\xb1\x3d\x94\x5a\x80\x0c\x28\x38\x57\xe9\x55\x3d\x40\x2c\xa5\x59\xe6\xaf\x03\x82\xe7\xd1\x0b\xf7\xd7\x11\xa1\x8f\xb5\x56\x62\xcb\xcf\x9e\x3c\x52\xc5\xbd\x95\x33\xdd\x7b\xf2\x30\x95\x4b\x04\x42\xe8\xd0\x9e\x43\xc9\x7b\xca\xd5\x54\xb1\xcb\xde\x92\x7b\x81\x8f\x3e\x61\x8b\xcd\xf9\xf8\x7c\xf9\xdd\x98\x18\xc3\x07\x8f\xcd\x06\x43\xa0\x68\xb9\xe0\x80\xca\xce\x77\xc4\x19\xe2\xcb\xe7\xf7\x84\xee\x1c\xd3\x17\x8f\x6a\x07\x65\x12\xe3\x11\xa4\xf9\xe9\xd6\x0a\x51\x6b\x1e\x6c\x24\xf0\x3c\x58\x72\x06\xcd\x8f\x6c\x0b\xe0\xd9\xa6\x32\xb4\x5e\x1e\x33\xc0\xf6\x29\x06\xd5\xc3\x17\x6f\x62\xef\x05\x67\x98\x52\x7b\xc1\x9b\xac\x03\x3f\x1f\x1b\x88\x58\xb0\xc5\xfc\x6c\x90\xa7\x9d\x3c\xfe\x65\xb3\x42\xb3\x5e\xfc\x29\x75\xdb\xaa\xd2\x41\x53\xb8\xa5\xa8\x3b\x3c\x7a\x46\x66\xab\x32\x44\x09\x66\x7b\xa5\x77\xf6\x2c\xde\x7c\x77\x8b\x1b\x42\xab\xd0\xa7\x8c\x8b\xf0\xdb\x30\xd9\x86\xb9\x7d\xa4\x0a\x8f\xbe\xbd\x38\xd9\xa8\x82\x3b\xba\x2f\xf3\xd2\xed\x8e\x33\xe9\x35\xd7\xcf\xb8\x9a\x3e\xbb\xf9\x5d\x8b\xe0\xa4\x21\x7f\x2e\x44\xe5\x39\xb7\x19\x48\xc8\x7c\x96\x1a\x1f\x64\xc1\x24\x89\x97\x5d\x5d\x31\xd5\x19\x9a\xdc\xa3\xfe\x40\x60\xaa\x3b\x1d\x4e\x72\xd8\x0b\xf9\xfd\x98\x9a\xc0\x7b\x0f\xc1\x94\x59\xc9\x52\x13\x78\xdb\x51\x51\x43\xb5\x6e\xad\xba\x39\xd8\xea\x3a\x62\xc8\x1e\x35\xcf\xe4\xb5\x59\x68\x13\x59\x7a\xf7\x1a\x3c\xda\x06\xc2\xe7\x59\x41\x98\x83\x26\xa0\x76\xbb\x10\x48\x3b\x3e\x34\x7a\x7f\x3c\x97\x4d\x21\x39\xd9\x49\xea\xcc\x97\x51\x88\x55\xb0\x56\x41\x14\x22\x5c\x13\x6d\xf4\x63\xc8\x77\xe5\x7d\x1b\xf7\xe0\x4d\x21\x4a\x3e\x75\x96\x34\x50\x8a\xe6\x13\x2d\xb7\x8b\x33\x7d\x12\x15\x1b\x78\xba\x95\x8c\x98\x74\x76\xb8\x7d\x0f\x20\x4f\x81\x94\xa5\x02\xbb\x4d\xf4\x46\x18\x23\xdb\x00\xe1\xd3\xef\x2f\x75\x12\xe9\x0b\x55\xdf\xf9\x08\x3a\x2b\x79\x45\x34\xdd\x4e\x72\x22\x3d\x17\x41\xcf\x95\x4f\x44\x0d\x0a\xa0\x8b\x8a\x06\x25\x53\x23\x8c\xc4\xc4\xdf\x1b\x7a\x80\xc4\x00\x82\x47\x92\x33\x3e\xbc\xe2\xcc\x85\x51\xeb\x25\x5d\x38\x25\x2c\xf9\xa5\xb7\x96\xb3\x18\x2f\xee\x19\xb4\x7a\x77\x8a\xf7\x4b\x8c\x42\xa4\x59\x88\xfa\x39\x68\x7b\x7d\x9d\x70\x54\xe0\x86\xca\x3f\x1f\x55\x35\x55\x18\xe0\x19\xbe\x27\x85\x45\xa0\x4a\x05\xda\x43\xc9\x4e\xaf\x79\x17\x29\x01\x10\x2a\x93\xca\x56\xf6\x7b\x94\x60\x57\x6e\xea\xeb\xd3\xb4\xf0\x12\xe3\x08\x4b\x2c\x7b\x9f\xbc\xac\x8f\xa5\x9e\xea\x8e\xb2\x11\x60\xdb\x82\xdd\x88\x95\x60\x3e\x41\x38\xcb\xa3\xae\x5d\x4d\x3d\x48\xd7\x5b\x93\xd2\x97\x5f\x21\xb5\xa7\xdb\x29\x02\x6e\xbf\x15\x8c\xcb\xd9\x9e\xd2\x94\x75\x8c\xd6\x91\x5f\xd9\x69\x58\x06\x8f\x09\x9a\x86\x9f\x8d\x00\xef\xd8\x38\xbe\x09\xbe\xc8\x42\x7e\x9b\xf2\x84\x60\xfd\xda\x27\x8c\x08\x8e\x89\xe4\xb3\x06\xe6\x0d\x3e\xc6\x52\x2c\xc7\x28\x93\xa5\x50\x60\x5c\xda\x50\xc9\xfa\xc1\xe7\x2e\x40\x16\x26\x87\xc8\x5b\x32\xc6\xb1\xf7\x75\xa2\xec\xfa\xef\x4c\x7c\xc6\x4b\xff\x5d\xc7\xca\x4c\x9a\x7d\x92\x74\x2f\x15\xfc\xd6\x59\x0a\xff\xf1\x84\x32\xf6\x94\xfd\x45\x3e\x65\x73\x90\x4e\xd9\x15\xa4\x53\x75\x06\x19\x54\x9d\x48\x78\xe0\x25\x12\x32\xda\x03\xe2\x8b\xd6\x2c\x38\x0b\x01\x24\x80\x3c\xc7\x0e\x37\x03\x62\xab\xb7\x41\xb6\x22\x19\xa0\xa4\x1f\xdd\x88\x0a\x7b\x9b\x77\x5f\x24\x67\xb2\x0e\xdc\xa5\xf6\xa1\x01\x04\xc2\xae\x49\x63\x9b\x2e\x50\xf3\x66\x09\x54\x07\x21\x74\x3b\x79\x55\xdd\xd6\xfe\x87\xe9\xb3\xa8\x03\xcc\x96\xe7\x53\x09\x6e\x60\xf0\x83\x48\x5a\xf9\x19\x26\xe8\xb9\xbc\x77\x51\x96\x6a\x9c\x32\xc9\xf2\x5a\xd3\xdc\xf6\x8b\xf9\xc5\xad\xa1\x1e\x0a\x40\xa3\x65\x58\xe8\xc4\xf2\x1a\x3d\xdc\xf6\x0b\x06\xe5\x9e\xb1\x06\xe0\xbe\x8c\x57\xf5\x54\x2d\x00\xc4\x3c\x65\xb8\xbe\x5e\xc6\x04\x67\xe1\x52\x60\x97\xeb\x83\x51\x36\x45\x55\x0c\x38\xc7\xa0\x93\xf3\xfe\xdf\x57\x40\x16\x04\x29\x86\x47\xbb\xf4\x88\x20\xa5\x94\xac\xa0\x2c\x6b\x1c\x87\x56\xa2\xef\xaa\xa3\x1f\x03\x1c\x72\xc9\x6c\x6f\xbd\x0c\xd9\x9e\xec\xd8\x1e\xf5\x38\xdf\xe7\x01\xac\xc4\x52\xf0\xe6\x39\xf5\x44\x62\x5a\x4f\xb2\x3b\x8d\x17\xf6\x9f\xe2\xba\xbd\xeb\x1b\x1c\x52\x3b\x1c\xc7\x3f\x69\x2a\xf6\xe3\xad\xb1\xba\x58\x37\x95\xdb\xc6\x9a\xc2\xd1\xc7\xb8\x39\x09\xb2\xd9\x0b\xcd\x44\xee\x21\x0c\x1a\xb0\xf3\x2f\x40\x51\x38\x0d\xad\xaf\x92\x53\x3a\x90\x61\x72\x4c\x8d\x80\x79\x1e\x20\x38\x41\xb8\xdd\x04\x73\xea\x21\x9c\xf5\x5e\x71\x1f\x73\xd0\xfb\x7b\xf6\xf7\x07\xa7\x3e\xf3\xc0\x33\x8a\x41\x75\xf8\x28\x2f\xc8\x32\x11\x44\xb5\xf2\x38\xc1\x25\xbe\xad\x69\x0b\x13\x93\x9f\xb0\xbe\x10\x90\xb6\x39\xf9\x26\x14\x7c\x8f\x79\x23\x0e\xa2\x9d\x21\x67\x8f\xfb\x94\x3b\xd5\x12\x56\xd0\x58\x41\x53\x84\x71\x1e\xa2\xbd\x24\xfc\xcb\xe0\x56\x70\xda\x52\xb6\xf0\x81\x94\xc0\x8a\xc2\x0d\xeb\xbb\x29\x8b\xe7\xf9\x1b\x20\x27\x9d\x6c\xb0\x52\xe4\x6f\x8a\xcc\xe4\x8f\xec\xf3\x06\x7f\xad\xeb\xbb\x6f\x0a\xe7\x1b\x04\xab\x24\xf4\xc2\x28\xa5\xeb\x4e\xea\x97\xa9\x69\x15\x71\x15\x7d\x5a\xe5\x2f\x95\x40\x3d\xaf\x0d\x50\x9a\x64\x94\xdf\x7a\x1d\x2d\xc4\x89\xdf\xa9\xd2\xb2\xd0\x8c\x02\xa4\x07\x83\x9d\x01\xb9\x3b\x40\xe0\x94\xa5\x02\x1f\x94\x90\xa6\x91\x23\x73\x24\x2b\x38\x49\x87\x1c\x85\x5b\xb9\x94\xe7\x58\x29\x14\x83\xda\xde\x74\xd5\xb7\x57\xd9\x56\xc7\x95\x2a\x17\xd8\x3d\x98\x54\x17\x72\xf1\xa0\xf2\xb0\xa5\xfc\x76\x7a\xc2\xc7\x3d\x93\x0a\x19\x47\x95\xbb\x11\x09\x36\xf8\x20\x79\x59\x1d\xbf\xd1\xbc\x08\x36\x8b\x8f\xb3\x98\x10\xc4\xa5\x72\x00\x0b\xd3\xb3\xe7\x27\x1f\x2e\xee\x33\x01\x67\xd6\x62\x39\x41\x09\x14\x75\x00\x85\x32\xfc\x87\x0c\x82\x77\xb6\xf2\x97\x98\xd5\xfe\x8d\xee\x17\xf4\xa1\xed\xb7\x5c\xfc\xd3\x1e\xb7\xf5\xc2\x74\xec\x5f\x63\x1b\x66\xdb\xa9\x02\x37\xb0\x03\x67\x05\xfd\x84\x75\x13\xc1\x25\xb2\xdd\x75\x68\xfa\xe6\x71\x21\xbd\xc4\x3b\xf5\x80\x05\x4b\xf1\xfe\x07\x29\x46\x67\xa3\xb0\xfe\x43\xe8\x6f\x48\xb6\xc6\xf6\x33\xba\x9a\xc0\xe7\x17\x33\x62\x6b\xb6\x21\x6a\x4f\x88\x40\xb5\xf7\x84\xb5\xbf\x6b\x77\x88\xb8\xc2\x2e\x42\x8b\xd2\x95\x32\xf8\xba\xba\xea\x04\xec\x90\xd3\x72\x68\xe4\xb0\x5c\x99\x2e\x66\x14\x3d\xa7\xb3\xa6\x01\xf5\xbc\xe8\x8e\x12\x41\x30\x04\x91\x8b\x82\x40\xa3\x02\xd5\x9e\x79\x0f\x99\x08\x1b\x7d\xca\x56\x56\xc4\x7d\xe7\x58\xbd\x3b\xcb\x98\x96\x98\xae\x94\x0c\xd3\x2e\xf1\x83\xb5\x13\xa5\xde\xf5\x19\x29\x75\xd9\x8e\xb3\x91\x87\x95\x00\x41\x67\x84\xf6\x4c\xd3\x43\xdb\x58\x9b\xbb\x9d\x3b\x98\x85\xca\xc2\x85\x27\xd9\xb4\x9f\xd3\x41\xb6\x94\x33\x96\x7b\x87\x42\x58\xa1\xf4\xfb\xfb\xec\xba\x84\x29\x36\xb3\xd8\x54\x64\x5f\x87\x02\x85\x0e\x59\x36\xa8\x80\xd0\xfd\x42\x68\x00\xdf\xdf\x83\x84\x53\x12\x69\x93\x49\x43\xf1\x9c\x44\x0d\x3f\x73\xc3\xdf\x3b\x3a\x2b\x08\x0a\xf3\x63\xa6\x5f\x86\x7a\xc0\x11\x91\x96\x91\x7c\x27\xf2\x50\x11\x00\x2e\x2b\x0e\x1e\x52\x8a\xd2\xde\x31\xe9\x15\x52\x5c\xb0\x65\xf8\xe6\x71\x26\x92\xe3\xf3\xec\x58\xd6\x7b\x38\xf7\x5e\x43\x57\xd4\x98\xe1\xca\xc4\x70\xa6\x9e\xf3\x4b\x03\xff\x4e\x60\x88\xc6\x57\xec\xb1\xd9\xff\x8d\x81\xe8\xb4\xdb\x20\xd7\xc1\x9a\xb0\xe9\x0c\xff\x2a\xdb\x9e\xc5\xb0\x4d\xe3\xb8\xbf\xe1\x5a\xc4\xe3\xad\x51\x95\x9f\xd4\x8a\x6a\x74\x8d\xae\x47\x43\x5c\x00\xdc\x1c\xa6\x8e\x9b\x02\x60\xd1\x2f\x10\x21\x77\xe3\x10\x3f\x53\x69\x8e\x11\x90\x43\x39\x57\xf9\xbd\xa2\xec\x74\xaf\x2b\x41\x1a\xca\xe8\xed\xb5\xa5\x0f\x12\x9a\xe4\x29\x14\xe4\x54\x1c\x27\x62\x52\x60\xb1\x89\xd2\xcf\x9b\x8b\x8c\x4b\xa4\x01\x30\x52\x06\x8b\x4d\xa1\xee\x26\x9b\x55\xfd\x1b\x46\xb0\xbb\x41\xa4\xb7\xde\x51\x97\x08\x90\xd0\x55\x66\x01\xa9\x78\x80\xe7\x12\x18\x88\x33\x89\x48\xf8\x5f\x14\xab\x20\x39\xe7\x2a\x0e\x03\xc6\x82\xcd\x9b\x0f\xa3\x47\xc8\x25\x6f\x91\x51\x0d\x25\x22\xba\x21\xa8\x30\xa6\x26\xbe\x5e\xe8\x84\x6c\x7b\x5a\x43\x2b\x73\x37\xc1\x5b\xd6\x9c\xb0\x59\xf4\x89\xe8\x1f\xbc\x19\x98\x4f\x9b\xa7\x36\xe8\x7d\x04\x2b\xea\x0a\xa1\x16\x3f\xd2\xee\x10\x16\x64\xc6\x25\x01\x1f\x08\x77\x13\x5c\xe4\x1b\x9b\xb1\x3a\xd3\x26\x19\x48\xbe\x7c\xc8\xa0\xa3\x10\x16\xb3\x86\xfb\x31\x84\xce\x2a\xea\x28\xfd\x88\xa8\x0e\xee\x43\x72\x7d\x5b\x8d\x75\x7d\x16\xd9\x6c\xa4\xad\x44\x1c\x4f\xcd\xac\x2d\x13\xee\xd2\xc8\xdd\x6c\x61\x90\x89\x00\x81\x22\x54\x14\x28\x9f\xbc\x6f\x60\xdf\x63\x2f\x58\x82\xd9\xc9\x18\x58\xa5\x81\xe1\x57\xca\x1f\x83\x6c\xac\xd7\x0f\x37\x4d\xff\x60\xd0\x2e\xc9\x65\xcc\x33\x02\x33\xbf\x29\x17\xa1\xd8\xba\x10\xf0\x42\x8f\xce\xd7\x8b\xb9\xaa\x26\xeb\xc8\x83\x09\xe8\x2e\x8a\x0f\x8c\xa9\xf9\x4e\x29\xf9\x2e\x11\xac\x76\x1e\x00\x77\xcf\x81\xa1\x03\xfa\xb0\x7a\x31\xd9\x5b\x72\xea\xdc\x98\xf1\xab\xfb\x01\x28\xca\x0f\x90\x30\xbe\xe6\xa3\xfe\x3a\x3a\x93\x43\x7c\xeb\xd2\x97\x9e\x36\xfc\x84\x13\x4a\xa5\x63\x8c\xff\x6e\xb6\xb2\x6b\xc0\x61\x83\x9f\xc9\x8d\x6e\x91\x31\xa2\xb0\xaa\xe5\xd1\xe0\xd8\xce\x72\x91\xfb\x03\xb7\xfe\x57\x01\xbf\xc1\x6d\x65\xef\xc4\x09\xa4\x64\x86\xfd\x79\x78\x6d\x7f\x48\x47\xd1\x16\x94\x38\x61\x69\x86\xa1\xeb\x38\x85\xaa\x2f\xcd\xc3\xd9\xae\x02\x91\xd7\x9c\x55\x79\xf9\xb6\x66\x73\xe2\xd8\xca\x39\x82\x1f\x1d\xb8\xb0\xb0\xe5\xb2\xa4\x1f\x6a\x68\x4c\xc8\x66\xaa\xdd\x83\x11\x87\xc1\xd1\x3b\x4a\x92\xf6\x65\x71\x5f\x88\x90\x34\xe1\x6b\xdb\xd7\xe4\x40\x6e\x22\xf8\x63\x73\x85\x60\x36\x28\x0b\x66\x5a\xe5\x47\xf3\x4b\xc9\x9d\x87\xf2\x4c\x13\xb4\xa0\xe8\x74\x0d\xbe\x07\x1f\x8c\x92\x75\x93\x20\x07\xf7\x01\x34\x9d\xa4\x95\x96\x71\xc0\x55\xd5\xc4\x25\xb8\x00\xd7\xed\x89\x57\x63\xa7\x37\x43\x13\x68\x05\xa1\x6f\x23\xb9\x5a\x20\x96\xef\xf9\x39\xd2\xba\x10\x73\xda\x93\xf1\x0a\x6d\xcc\xa9\xf9\xdc\xbe\xa1\x4c\xd8\x37\xeb\xea\xfb\x8c\xc2\xdf\x0e\x40\xcd\x00\xe9\xcb\x58\xff\xa4\xe3\x4c\x30\xbb\x8d\x38\x10\x21\xa2\xef\xa6\x41\x05\x50\x79\x44\xa7\xc1\x19\x29\x96\x23\xe7\x41\xab\xa3\xc8\x58\x27\xec\xd9\x45\x0f\x1b\x04\x5a\x50\xc0\xfd\x34\x93\x02\xf0\xce\x62\x52\x55\x0a\xd0\x89\x37\x04\x9b\x48\x02\x9e\x61\xb1\xf1\x82\x23\x87\xc3\x25\x50\x82\x25\x60\x7d\xb8\xce\xf9\x3a\x64\xe9\xc5\x57\x9c\x25\xf8\x2d\x9b\x8e\xc0\xb0\x3d\xb3\x2b\xe9\x07\x62\x35\x20\xdc\x11\x8a\xc8\x29\x6f\x6b\x17\x85\xad\xb0\x65\x2b\x2f\xe1\x92\x69\x84\xc1\x7a\x40\xe6\x06\x97\x0b\x6c\x04\x2a\x1d\xb6\xaa\xe8\x92\x9e\xb2\x48\x9b\xbb\xb4\x70\xe0\x54\x65\xbf\x4b\xf0\x63\x13\xee\xb8\xfc\x44\xd1\x6f\x23\x5a\x35\x62\x7e\x13\x99\x93\xa1\x19\xf6\xa7\xa5\x4c\x10\x33\x90\xef\xb1\x09\x3e\x56\x22\x32\x09\xe7\xce\x21\x02\x34\xa4\xf3\xa3\xc2\x75\xbb\x94\x9e\xfc\xfd\xae\x8f\xd7\x5c\x00\x18\x65\x72\x51\xbc\xad\xa4\xad\xd5\x20\xb8\x10\x92\x41\xde\x1a\x6b\xfb\x75\x00\xfd\x05\x6a\xc1\x29\xed\xdb\x87\x30\x86\x8a\x18\xff\x51\x28\x0c\x0a\xe0\x81\x79\x0f\x9f\x94\x73\xa9\x9b\x3d\x26\x28\x20\x11\xc5\x10\x26\x92\xd3\x5d\x03\xed\x0d\xc5\xda\xc6\xce\x46\xd4\xfd\x58\x16\x9d\x63\x0e\x2b\x1b\xa8\xf8\xcc\x1a\x32\xc9\xf3\xee\xc5\x8b\x87\xfc\x11\x99\xa0\xd1\x3e\x29\x90\x01\x95\xc0\xaf\x09\xd6\xaa\x39\xa3\xcd\x74\xdf\x67\xdf\xc5\x69\xfc\x9c\x09\x06\x7f\x4f\x62\x5a\x15\xb6\x78\xd5\x60\xf4\x01\x46\x30\xfc\x00\x55\x7e\xcd\xfd\xde\x3e\x3c\xb1\xef\x5c\x8c\x63\xc5\xa2\xea\x7e\x09\x29\xfd\xe3\xc8\x5e\x16\xf7\x6e\x23\x49\x42\x1a\xf5\xef\x60\x33\xfc\xd5\xbc\x5e\xde\x34\x46\x39\xdc\x20\xab\xd5\xf3\x95\x23\xdd\xac\x7b\x39\xde\xef\x68\xae\xad\x04\xf2\xb2\x4d\x0a\xeb\xab\x1b\x5d\x4e\x67\xe6\xcd\xb0\x14\x59\x98\x5b\x91\x51\xfa\x45\xef\x3c\xce\x23\x66\xd3\xeb\x1f\x20\x9f\x30\x2b\x0a\x81\x8a\xa4\xfb\xb0\x03\xc0\x8d\xa0\xf7\xa0\x05\xc0\x75\xa5\xa7\xe7\x29\xaa\x90\xb5\xa2\xbd\x0c\x45\x94\xc6\x16\x42\x79\x83\x6b\xc2\x47\xa2\x18\x55\xee\x92\x99\x04\x1e\x58\x87\x61\x61\xa6\x29\xc9\x5f\xd8\x0d\x3f\xa6\x54\x7d\xbc\xa1\x8a\xb8\x25\x2a\xc8\xa9\x63\x02\x4a\x80\x1f\x61\xc0\x56\x04\x14\x44\xc2\xb3\x5a\xb2\xe9\xb4\x42\xa7\xc8\xaf\x48\x41\xe6\x4b\x02\xae\x3a\x9f\xb9\x48\xfb\x8b\x98\xdd\xa3\xb6\x62\x5b\x68\xd3\x3a\x31\x1f\x67\xdd\x04\x8d\x13\xc6\x0e\x74\xc2\x0e\xa6\x1a\xb8\x8e\x25\xdd\x0d\xc6\x73\x5a\x03\xe2\x47\x6b\x9f\xc8\x69\x58\x74\x13\xe8\xd2\xc7\x69\x43\x22\xc5\x09\xbe\x4a\x12\x03\x68\x54\xce\x06\x69\x61\x86\x48\xaa\x40\x9c\x00\xa6\xc6\xa4\x59\x89\xa3\x85\x10\x72\x32\xb0\xe5\xc8\x57\x10\x31\x90\x95\x86\x02\x80\x52\xc9\x2d\x0d\x38\x64\x90\xc4\xbd\x1f\x1c\x6b\x39\xd9\xdf\x3d\xef\xee\xcc\x7d\xf8\x27\x63\x06\xd8\x13\xc6\x51\x26\xe8\x1c\xb3\x6a\x4c\x31\x12\x9b\xae\xa8\x4b\x10\x28\x1e\xd9\x8b\x46\xb4\x53\xde\x4c\x47\xa2\x04\xdf\xd0\xe2\xe2\x0e\xbf\x2e\x32\xb3\xd5\xa3\xe1\xb7\x5c\xea\x71\x5c\xef\x2b\xb4\x01\x80\x87\x37\x9d\xd6\x61\x83\x7b\x64\x55\xa0\xe4\x10\x95\x55\xb5\xbe\xfc\xca\x16\xb9\x4d\x02\x64\x6e\x57\x32\x96\xe0\x1e\x02\x2a\x55\xae\xcd\xa8\x3a\xbe\xec\xb6\x07\x42\xd7\xcc\x69\x36\xe4\xd5\xc4\xc9\xd7\x50\x55\x54\x37\x56\xc7\x4d\x1b\xdd\x03\xd0\x06\x91\xf7\x24\x35\x52\x80\x49\x8c\x15\x07\xb7\x19\x72\x6f\x11\xaf\x98\xd0\x63\x5b\xa0\x71\x72\xc7\x70\x60\xe5\xdf\xf5\x0f\x50\x22\x15\x6e\xd7\x4d\x7d\xf7\x6d\x7d\xa5\xb3\x53\x67\xd5\xd8\x68\x6f\xa3\x4d\x55\x9d\xa4\xf5\x26\x97\xbd\xc2\xbe\xe3\xee\xc4\xa8\x69\x68\x60\x59\x8d\xab\x22\xad\x07\xe4\x36\xc0\x96\x1e\x10\xa4\x60\xb0\xa9\xc9\x0e\x33\xe7\x97\x60\x7c\xd7\xd2\x21\xac\x23\xfa\x03\x1a\x3b\x36\x4a\xa5\x59\x98\x31\xe3\xf3\x38\x91\x70\x98\xd9\xa5\x7e\x0a\x33\x68\xa7\x80\x32\x6b\xed\x18\x59\x07\x39\x2b\x2d\xb3\x0b\x33\x40\x6d\xaf\xc4\xb4\x68\x11\xfe\xa8\xe3\x8f\xfc\x26\x74\x2e\xff\xbe\xfd\xe2\x89\x22\xa3\x7b\x52\xef\xa2\x22\xc2\xe4\xe3\x4d\xa8\xd0\x19\x73\x39\x00\x77\x19\xed\x82\x08\x76\xb4\x0d\x35\x30\x4a\x6c\xce\xa2\xa5\xab\x86\x01\xae\xc0\xc6\x75\xf6\x4e\x37\x5f\x8b\x0d\x46\x4e\xb1\x8b\x01\xbc\xb0\x0e\xf6\xf5\xe0\xa3\x19\x33\x51\xaa\xf0\xdd\xe5\xf7\xef\xc4\x49\x05\x5f\x54\xf7\x59\x43\x12\x31\x54\x3a\xfd\xe7\x2c\xec\x86\x3c\x7b\x16\x7e\xcf\xb9\x8a\xdf\x55\x54\x9b\x8f\x59\x65\xb3\x7a\xa2\xaf\xe2\x6c\x6b\x47\x02\xcf\x95\x2e\xdb\x73\x78\x2b\x88\xa1\x22\x38\xaa\x1e\xe5\x85\xec\xb4\x58\x7a\x7e\x48\x48\xff\x50\x0f\xac\x8e\xf4\x1e\x30\xa5\xd7\x1e\xd4\x93\x65\x77\xa3\x26\x88\x7c\xae\x4a\x6a\x97\x70\xcb\xb1\xb6\x01\xf8\xc6\xc6\x4a\xa2\xba\xd4\xcb\x3d\xc0\x3c\xe5\xe0\xb3\x00\x8f\x29\x1b\xba\x91\x88\xbf\xbe\x3a\x7e\xb9\xfe\x03\xb9\xe3\xcc\x4d\x88\x1f\xf8\xe4\xe9\xc4\xd4\x6c\x96\xd1\xa5\x99\xba\xfd\xf9\x0e\x3f\x58\x49\xb7\x50\x2a\x23\xd6\x60\xc2\xc3\xfe\xb6\x77\xfc\x64\xdc\xac\x5b\xbe\x06\x22\x5e\x38\x48\x42\x21\xf1\xf6\x27\x5e\x9c\xd8\xb5\x4a\xb0\xc4\xd8\xef\xc5\xdc\x36\x7e\x13\x82\xd0\xbd\xae\xe4\xb5\x35\x27\x7b\xf1\x21\xda\x0a\x83\x35\xce\xca\xd4\xa6\xa4\x4b\x6a\xfe\x63\xcd\x6d\x13\xec\x0d\x62\xb5\xb9\x93\xab\xf0\xa0\x5d\xa8\x14\xef\xc7\x81\x89\xb4\xd9\xd4\x33\x7f\x5a\x99\x7d\x70\x66\xb2\xf5\x99\xde\x0c\xb5\x02\x9b\x8d\x1b\xf5\x3e\x23\x1f\xba\x74\x19\x58\xe7\x45\xd4\xb1\x50\x5e\xf4\xd5\x04\x2d\x25\x19\x7b\x94\x66\xfa\x1d\xf7\x2b\x37\x5d\x0a\x7b\xe4\xc9\x2e\xfe\x62\x9d\xd7\xf7\xe5\x09\xbb\xa6\xcb\x1a\x01\x77\x89\x48\xe7\x89\x16\x69\x31\x4a\x94\xf6\xb5\x05\x91\xbc\x48\x78\x55\x68\xd1\x02\x28\x26\x60\xf0\xb3\xbd\x57\x69\xb0\xda\xf3\x38\xc7\x8f\x9c\x06\xf9\xa0\xab\x0a\xa7\xbc\x18\x29\x2b\xb4\xe8\xf6\x18\x1c\x29\xa2\xc4\x72\xb6\xdb\x60\x8e\xf9\x62\xa1\x0e\xa1\xad\x8e\xb8\x20\x61\x23\x3b\xc2\x38\x9a\x9b\x7f\x83\xff\xda\x05\xae\x99\x32\x9a\x6b\x09\x40\x3e\x65\x71\xc5\x21\x51\xd6\xb8\x6c\x83\x75\xd5\x7f\xe0\x60\x25\xd7\xac\xf0\x35\x69\xfc\xdc\xdb\x07\x82\xc9\x9a\xeb\x1b\x8b\x7d\x13\x8c\xcd\xb6\x96\x7b\xd4\x4c\x3c\x9c\x6c\x6d\xe0\xae\xe9\x62\xca\x80\x9d\xc9\x47\x1b\x64\x88\x97\xd9\x37\xbc\x2c\xfd\x8a\x34\x44\x62\x9b\x9e\xe5\xf4\xa4\x10\xf6\x03\x7b\x88\x42\x75\x3e\xd8\xe7\xb6\x35\xbc\x2c\xa5\xdf\x2e\x72\x6f\x5d\x27\x2b\xe8\x9a\x24\x9e\x0e\x5e\x49\x30\x20\x7b\xc5\x85\xf0\x20\xd8\x14\xde\x44\x66\xdf\x63\xdc\x41\xb6\x9e\xa1\x3f\x0a\x4a\x3a\x05\xe4\xe9\x8f\x4a\xb8\x80\x23\x3c\x82\x2b\x4c\x21\x0f\x19\x97\x0e\x3c\xa2\xff\x11\x22\x2f\x8d\x46\x91\x77\x39\xa4\x60\x2c\x87\x62\x85\x89\x2d\x60\x1e\xc5\x14\x05\x5a\x14\x69\xfe\xe6\xc8\xec\x9d\x8d\xf2\x30\x4e\xf9\x4d\xbf\x61\x7c\x3b\xc0\x1f\x74\x53\xe4\x5c\x56\x13\xea\x7d\x62\x1a\xff\x38\xf7\x99\x25\x4a\xc8\x03\x69\x0b\x0b\xc1\x29\x3e\xbf\x69\xa2\xd5\xca\xd3\xcd\xdc\x47\xea\x49\xcf\x97\x8f\xeb\xd8\xe9\x37\x37\x9d\xbb\x19\x2f\xb7\x00\x92\x19\x80\x4a\x51\x80\x20\x68\x19\xdd\x05\x74\x34\x9b\xa0\xde\x75\x61\x24\xc8\xae\x79\xf5\xa2\xef\x2c\xd8\x6f\xba\x8e\xeb\x22\xdd\x96\x4f\xc6\xc7\xad\xdb\xa8\x98\xf7\xf6\xbb\x73\x41\xa8\x4a\xb7\xba\x26\xbb\xb1\x5c\x32\x7e\x65\x61\x79\xdd\xeb\xd9\xb0\x09\xdf\x64\x58\xc1\x40\x12\x42\xc0\x71\xd6\x81\xd1\xfe\x56\xad\x2c\xb5\xe6\x37\xf5\x5d\x09\xd2\x73\x2c\x53\xd0\xbe\x16\x93\xd3\x02\x3c\x8d\x7b\x2e\x04\x04\xb3\xdb\xd5\x64\x8d\x0b\x1e\x59\xec\x5d\x96\x99\x74\x90\xe5\xfe\x98\xd3\xd0\x14\xa2\x5b\x71\x8f\xdd\xcc\xe5\xd6\xdc\x3e\x80\x72\x19\x3d\x1b\x76\x2a\xbb\x96\xfc\xfa\x8b\x1a\x65\x36\x6b\xdf\xaa\x60\xa1\xe7\x6d\x83\x6d\xb2\xc0\xd9\x01\xc8\x71\xe8\xf8\x58\x5b\x8f\x9c\xc6\x13\xcd\x0e\x6c\xd1\xa1\x00\x59\x7f\xcc\xe8\x72\xed\xa4\xcc\x81\xed\x4b\x5b\xf5\xab\xfb\xa6\xae\x75\x36\x85\xc3\xa1\x96\x6e\xb3\x0b\x7c\x5a\xf3\x6d\x8f\xa3\xc4\xa0\xfd\x5a\x8e\x80\x7b\xa0\xa7\xbd\x43\x83\x1a\xe8\xe1\xf8\x78\x67\x64\xb5\x49\x7f\x44\x13\x69\xf4\x92\x70\x71\x22\xb3\x4f\xc0\x31\x83\x7a\x66\x07\xac\x89\x62\xc8\xc4\xef\xf2\x8c\x51\x58\x21\x7e\x04\xba\x74\x3c\xf6\x77\x3d\xec\xd4\xb4\xb4\x9e\x80\xad\xb7\x54\x6d\x74\xb4\x51\xd5\xb8\x3a\xf2\xa9\x50\xa7\xdb\x1a\x43\xea\xf4\x0c\xd3\x6d\x3f\x23\x19\x70\xe8\x8d\x70\xcf\x5f\x7b\x7c\xdc\x66\x86\x1d\x4f\x3e\xad\x75\x1b\x70\x16\x8c\xa2\x2e\x2c\xda\x3e\x12\x42\x4c\x79\x8e\xb8\xce\xdf\x10\x22\x27\xf1\x26\x77\x1b\x74\x23\x9c\x1b\x0e\xd4\x0a\x92\x7b\xba\x8b\xc9\x02\x25\x32\x8c\x56\x31\xe0\x22\xaf\x8b\x43\x67\x89\xe7\x7c\xcb\x0a\x5c\xcb\x30\x69\x1f\x93\xeb\x63\xbc\x41\xc4\xe9\xb1\xbc\x32\x41\x17\x10\x31\xaa\x2a\xa5\x1a\x2f\x11\x9f\x82\xcd\xdb\x22\x71\xaa\x34\x13\x41\x2d\xe7\x34\xe0\x90\xf2\xf0\x4a\x22\x7c\x4a\x49\xf4\x5e\xe4\xb4\x36\xe9\xc5\x49\x62\x28\xd7\xaa\x20\xe0\x96\xcc\x84\xcd\x77\xa6\xb5\x35\xbf\xa5\xb5\x1f\xbb\x62\x5c\x54\xe1\x21\xbe\x6c\x55\x06\x67\x15\xcd\x90\xea\xe7\x76\x6d\x03\x66\xb4\x7e\xb6\xa5\xb3\x8e\x87\x8f\xf1\xe4\xc3\x5b\x69\x3f\x20\xea\xf5\xec\x8e\x92\x83\x5b\xe6\xf5\xe9\xa3\x6a\xfd\x01\x25\x8f\xcc\x61\x9d\x77\x04\xe1\xec\x04\x29\x95\xa6\xf1\xdf\xbf\xfd\x43\xab\x1f\x91\x02\xf7\xc7\x54\x2c\xa0\x57\xcf\x27\xc1\x98\x18\xe2\x90\x46\xbf\x0e\x61\x9b\x3c\xc7\x73\x5d\xcd\xbd\x92\x3f\x04\x69\xde\xb3\x78\xf8\x3b\x8b\xc4\xc2\x49\x2d\x92\x2a\xcf\x5c\xba\x35\x42\x83\x60\x83\x8a\x5d\x3f\xba\x54\x1e\xdb\xa9\x90\xee\xd0\x12\xa0\x5d\x1d\x8e\x7e\x06\xc9\x9f\x45\xbf\x09\x72\xc8\x05\x44\x33\xb0\x38\xa0\xcb\xf7\x21\x06\x48\x03\x4e\x4f\x63\x34\x38\x16\x2f\xa2\x55\x83\x46\xf5\x4e\x76\xb4\x3a\x01\x1f\x1c\xb6\xbc\x27\x30\x3f\x68\x65\x14\x7c\x69\x5d\x9c\x87\x6a\xd3\xb3\xad\xe4\x23\x1b\xc6\xb1\x1a\x1f\xa5\x2a\x7a\x33\x87\x6e\xfd\x0d\x49\x62\x47\x42\xaf\xc5\xbb\xfa\xde\x71\x24\x75\x4f\x0d\xed\x8a\x1c\x85\x0d\x3e\xe8\xed\xc6\xe9\xbe\xdc\x35\xba\x45\x1e\x20\x88\x19\x5a\xac\x39\xd0\x83\x42\x4b\x4b\x4d\xf6\x98\xa3\xf3\xbb\x97\xaa\x56\x14\xf7\x1b\xd4\xd1\x74\x5c\x5f\x5d\xfb\xce\x74\x71\x3e\x54\x05\xc7\x48\xcc\x56\xe2\x0b\x27\x55\x03\xf3\x2b\x4a\xd8\xa5\xcb\xa8\xf9\x71\x6f\x6f\x29\x6d\x3c\x43\x0c\xe7\xc3\xe1\xf0\x06\xec\xb2\x75\x1a\x79\x6b\xb3\x40\xe9\xf5\x2c\xe5\x8c\xc2\x55\x39\x17\x6a\xe0\xd5\x85\xa6\xa5\x71\x14\x98\x9f\xaf\x61\x3c\xc9\xf9\x21\xce\x19\x81\xf5\x5e\x86\xda\x74\xd9\xb9\x85\x6e\xc5\x57\x99\x9f\xff\xe9\xaf\x11\x23\x3b\x98\xa0\x67\x55\x57\x13\x11\x6b\xb8\x2a\x0a\x04\xf2\x3a\x6f\x46\x8c\x84\xaa\x38\x5c\x66\xe4\x61\x6a\x90\xc6\xac\x6e\x93\xcc\x07\x36\x3e\xc3\x53\x8b\xa2\xeb\x04\x54\x16\x36\x1e\x8f\x4c\x95\xc5\xe7\x5c\x77\x18\x56\x83\x08\x1c\xa0\x87\x33\x83\x72\xe0\x99\x0c\x13\x5c\xb8\x08\x54\x39\xa1\x4a\x63\xac\xeb\x8e\xec\x8c\x2c\xad\x6e\xf3\xfb\x0c\xe0\x13\x12\xf8\x05\x2c\x93\x12\xc4\x6f\x03\x59\x16\x88\xa6\x82\x07\xaa\xc1\xd1\xc4\x5e\xc1\x1b\xc5\x95\xea\xd6\x51\xc5\x9e\x9d\x0d\xb7\x76\x9a\xb7\x0f\xfd\x18\xf1\x7f\x70\x44\x65\x80\x9d\xef\xcf\xbd\x4a\xf8\xe9\x4f\x0b\xcc\xe6\x0a\x5d\x68\x7c\x4b\x4e\x4f\x54\x74\x71\x75\x55\x82\xd0\x5d\x4c\xeb\x03\x62\x4c\x93\xdb\x79\xf5\xec\xb1\x82\xc4\x35\x0b\xd7\x07\x22\xc8\x95\xec\x55\x1c\x15\x24\x6a\x80\x66\x47\xf3\x05\x25\xb2\xcd\x47\xe6\xf7\x68\xad\x9e\xdc\xf7\x74\x54\x4b\xc5\x64\x12\x11\xb0\x9f\x50\xca\xeb\xbb\x5e\x40\x07\x28\x78\xf5\x50\xbc\xee\x17\x20\xce\x57\x2a\x96\x8f\x6a\x1c\x1a\x79\xd9\x99\x81\x6c\x16\x3d\x79\xc1\x82\x1f\xe5\xac\x4b\x4c\x04\x75\x84\xca\x9e\xf8\x7b\xb7\x31\x7c\x43\x7a\xfd\x21\x52\xde\x89\x17\x92\x41\x2c\xdc\x09\x1e\x3b\x4a\x90\x7f\xe3\x0a\xb5\x73\x3f\xc5\x0c\xea\x00\x91\x0f\x21\xbd\x98\x6d\x8e\x3c\xb6\x88\xd9\x34\x7c\x95\x0f\xb4\x61\x09\x4e\x79\xab\x98\x76\x6c\xe4\x6b\x38\x52\xbe\x15\x67\x60\x1a\x57\x40\x71\x3d\x63\xc0\x89\x65\x1a\x9c\xd0\xeb\x06\xe4\xbc\x97\xba\x60\x51\x46\xd3\x13\x3f\x4e\x9f\x73\x1d\x38\xa0\x90\xaf\xf7\x8e\x68\x9f\x47\x30\x20\xc6\xfd\xc1\x19\x9c\x5c\x72\x0e\xd3\xa8\x9e\x47\xf9\x48\xe7\xf7\x17\x8e\xe0\x6e\x5b\x4b\x44\xa6\x14\x57\xe1\xd6\x51\x25\xa5\x69\xde\x5a\x9d\x4a\x62\xa1\x14\xa1\x84\xa4\xfc\x9c\x2a\x36\xa4\x14\xc2\xda\xc3\xe6\xb5\xcc\x1b\xc2\x28\x8f\x40\x43\xa5\x43\xec\xc8\xc4\x9c\x59\x64\xed\x15\xe1\x37\x13\x5e\x85\x4a\x11\x27\x03\x34\x5e\xd9\x7d\xf2\x4e\xc3\x66\x13\x34\x4c\x3a\x07\x68\xe2\x22\x13\xf4\xb4\x03\xdd\x52\x0c\xac\x05\x56\x12\x94\x09\xc5\x44\x82\x04\x4f\x9d\x0c\xf5\x44\x12\xae\x23\x7d\xc0\xb9\x7d\x0c\xe3\x42\x25\xee\xdc\x8d\x4a\x8f\x0e\x8e\x3b\x3a\x16\x07\xdb\x01\x1e\xa6\xdc\x58\xd7\x1c\x25\xed\xfd\x71\x83\x5a\x05\x5a\xc8\x83\x7d\x93\x87\x58\x19\x0b\x82\xb7\x45\x2a\x3d\x30\x41\x44\x3e\x99\xa5\xa2\x6a\x66\xc5\xd4\xd4\xa5\xf1\x0f\x12\xbf\x32\x7e\xab\x93\x95\x19\x7a\x91\x2d\x0b\x6d\x4f\x3c\xf4\x2b\x89\x9d\xbb\x6a\x23\x34\xd5\x9b\x73\xc5\x88\x81\xb9\xc0\xe3\x38\x8f\x11\xc7\x73\xf5\xe2\x64\xcd\x31\x38\x21\x51\x73\x4e\x59\x9e\x1d\xcb\x9c\x4e\xb6\x4a\x1f\x2e\xff\x43\xf8\x05\xd1\x17\x9f\x30\xa3\x18\x68\x3f\x5f\x5b\x89\x5d\xc3\xa9\xda\x8b\xdc\x93\xaf\xdf\xa3\xc8\x00\xb3\x21\xf5\xe6\x67\x5c\xa5\x17\x37\x6d\x9c\xb2\xf7\x88\xf8\x7d\x01\x40\x6b\xcb\x6c\x86\xfb\x33\x6c\x38\xec\xf8\x44\x14\xc2\xd2\xcf\xac\x04\x95\x94\x93\xbf\x2e\x6a\x60\x24\x5e\xd0\x4a\x15\x1c\x95\x76\x99\x49\xb8\xd4\xd5\x6a\x97\x30\xf7\x3e\x5d\xf4\x2b\xc8\xe5\x3b\xa6\x9b\xaa\xb0\x41\xf2\x39\x3c\x20\x4b\x72\x03\x5a\x6a\x5d\xb1\x86\x7f\x8d\xbc\x42\x7d\x0c\xf6\xac\x91\x07\x9c\x66\xa8\xce\x68\xb9\xd6\x61\x1a\x23\x2b\x5e\xeb\x38\x12\xa2\x7b\x9d\x05\xb8\xae\x6e\xa1\x4e\x65\x66\x6f\x47\x8a\x59\xd6\xdf\x63\x60\x7d\x7e\x15\xd8\x24\xaf\x74\x5f\xfd\xca\x73\x54\x51\x19\x79\x4e\x2b\x36\x73\xff\x8a\x83\xfe\x67\xc8\xf8\x06\x40\x04\x28\x7d\xa1\x9d\x12\x91\x4e\xe1\x6c\x97\x50\xc8\x3d\xf0\xe4\x89\xa0\x52\x65\x03\xae\x2d\x4c\x80\x17\x81\x2d\xe6\x29\xc3\x2d\xae\x3f\x95\x5e\x37\xdb\xee\x8d\x5d\x14\x31\x55\x33\xf1\x57\xc1\xe1\x58\x4d\x2f\x5f\xb0\xd8\xa4\x10\x8f\x71\x9d\xc5\xcf\x11\xdc\xa3\xae\xe8\x37\xe7\x4c\x93\x26\x23\xa8\xc2\xd6\x45\xfe\x35\x72\xf5\xec\xfb\xcb\x86\x06\xe8\xcc\xf9\xb0\xfd\x4e\xf8\x68\x90\xdf\xf1\x23\xb1\x82\x25\x28\xa2\xcf\x9a\xf5\xbc\x34\x15\x9c\x78\x7f\x8c\x58\x41\x80\x13\x3e\x24\x62\xf2\xea\xf6\x94\xab\x4a\xb4\x59\x5e\x65\x99\xf1\x5f\x56\x20\x27\x19\x20\xe4\x8c\xbc\x87\x1d\xf3\x9e\x62\xe8\xdf\x29\x51\x73\x46\x2b\x6f\x82\xe1\x3d\x37\x32\x28\xa2\x39\xe7\xcc\x76\x1e\x41\x78\x00\xed\xbe\xf1\x21\x8d\xca\x30\xe5\x4c\x37\xdd\x2a\xb0\x9c\x8e\x4e\xf7\x33\xeb\xec\xb7\x76\x10\xa5\x94\x0c\xba\xbc\xe8\x7b\xd7\x4e\x5f\x7f\xc5\x33\xe5\xc9\xfb\x39\x42\xaf\x04\x83\x27\x01\x9f\x66\xf2\x16\xd7\x48\x00\xe9\x39\xea\x32\x38\x7a\xe7\xba\xca\xc1\xb4\x90\xc1\xaf\xda\xb2\xae\x3b\x47\x53\x46\x35\x73\x91\xd4\x6f\x0d\x7a\xa3\x6b\x6e\x6f\x1e\x96\x7c\xc7\x78\xa5\x9e\x26\x4b\x71\x23\xa6\xa4\x6a\x8b\x6a\xe8\xea\x96\x81\xd8\x61\x97\xc1\xb2\xb8\xef\xe9\x5f\x06\x31\x70\x21\x50\x63\x89\x47\xd9\x90\x0d\x7d\xfa\x36\xbf\x59\x15\x0e\x65\xdf\x12\x7c\x16\x33\x49\x76\x54\xb5\xef\xbb\xa2\xff\x40\xae\xc4\x55\xd2\xca\x4e\xd0\xdc\x92\x27\x33\x2a\xb4\x1a\x37\x22\x05\x68\x93\x41\x79\xd0\x86\x97\xf8\x03\xb3\xd7\xf4\xd2\x1d\x7d\x8b\x9f\x50\x29\x68\xfc\x82\x4c\x04\xfa\xab\xc4\xce\xa6\x4c\xaa\xf5\x38\xbf\xa3\x69\x66\x77\xc8\xdb\x3e\xd9\x71\xea\x28\xfe\x78\x67\x2f\x12\x65\xc5\x40\x00\x04\xb2\x66\xd4\xce\x8a\x6e\xc8\xef\xf8\x2a\x4c\x3c\xce\xa2\x7a\x7e\xd7\x87\x98\x5b\xf6\xec\x36\x74\xd3\x7b\x51\x67\x7c\xb0\xba\x46\xba\xb0\x2a\xcf\x5b\x8a\xe9\x5d\x2c\x23\x89\xc7\xeb\x3e\xb3\xdd\x51\x40\x01\x14\x25\x37\x59\x34\x10\x95\xa8\x6e\xc2\x80\x66\xe1\x0a\xc9\x41\xe4\xd8\x9d\x5e\x35\x87\x3c\x74\xc3\x5b\xbd\x03\x6f\x4f\x71\x08\x41\x5f\x22\xd5\x91\x74\xfc\x11\xc6\xa8\x0a\xf4\x4b\x33\xf6\xc2\xf0\x40\xed\x39\xf7\xa4\xc8\x39\x63\x6d\x17\x8c\xd4\x56\xe7\x31\xc8\x0e\xe2\x97\x02\x22\xe0\x26\xe7\x3c\x88\x23\x6e\x90\x8e\x8e\xc8\x68\x56\x97\xd0\x67\xda\x75\x24\xae\x54\x47\x4a\xe3\xe7\x2b\xc9\xe7\x75\x6d\x0a\x28\x7a\xc8\xd7\xe4\x4f\xc0\x5c\xb0\x7f\x62\x52\x74\xe6\x7b\x38\x33\x40\xb2\xbd\x3a\x35\x01\xb7\xb9\xa4\x7d\x46\xdf\xa8\x0d\x04\x4a\x67\x71\xf3\x0d\xb2\x1d\x55\xe8\x06\x92\x59\xa5\x37\xa1\x25\x05\xd8\x71\x69\x61\xe0\x75\x43\xcf\x8b\x7e\x6b\x6d\x76\xae\x7d\xdc\xa6\x94\x0c\x8f\x33\x2e\x0d\xd9\xf5\xb8\x82\xe2\xd8\xad\x76\x4e\xdd\x39\x5b\x51\x15\x16\x30\xd3\x98\xd4\x8c\x08\x6e\xd6\xed\x47\xd0\x1e\x48\x31\x30\xfc\x65\x17\x4a\x27\x12\x49\x4b\x49\x67\xde\x79\x16\xdf\x7d\x61\x34\x0f\xc3\xd6\x3f\x67\x8f\xc0\x73\xf3\x7e\x6b\x45\xbc\xac\x12\x2f\x22\xc5\x83\x4b\x1a\x16\xd4\x4a\xf0\x3d\x3b\xe1\x37\x54\x0b\xdd\xb8\xbf\xe9\x4e\xee\x52\x42\xa0\xd7\x2f\xb8\x91\x0a\xe3\xdf\x53\x40\xdd\x1f\xfa\x30\xf4\xde\xea\x20\xd0\xcb\x6e\xa2\x9b\xdc\xdc\xa4\x42\xdd\x60\x10\x90\x26\xd2\x92\xb2\xae\x7a\x68\xf9\x2b\x3b\x4c\x4c\x84\xaa\x2f\xe9\x5a\x26\xbd\x2b\x64\xec\x6f\xba\x3e\xee\x1c\xfa\x8a\xfc\x46\x1d\x34\x98\xa3\xec\xfa\x07\x3c\x74\x21\xf4\xba\x19\x75\x2a\x5d\x74\x2c\x37\xac\xd6\x9f\x0f\xd2\xe1\x95\x81\x25\x8e\x2a\xf6\x87\x67\x32\xf1\x25\x2b\xa6\xfe\xcb\xc1\x67\x0a\x42\x4f\x08\xed\xab\x0c\x6b\x73\xae\x23\x15\x13\x0c\x1a\x70\xf2\x14\x10\x16\x00\xb4\x34\xc9\x7f\x4d\xdc\xf4\xb6\x7e\x62\x30\x44\x2e\x86\xda\x84\xfb\xcf\xa0\x77\xdc\x2a\x1a\x99\x36\xec\xe2\x45\xe9\x2e\x84\x37\x81\x84\xbe\xde\x4b\x79\xc6\xd4\x8e\x79\x07\x13\x08\xcf\xd0\xa2\x7f\x8e\x3b\xe2\xda\xd2\x16\x15\x6a\x12\x5e\x7e\xe3\x25\xc6\xb0\xa2\x22\x0c\x21\xc9\xff\x71\x14\x46\xb3\x33\x93\x46\x61\x72\x29\x96\xaa\x4c\xfd\x4c\x78\xe9\x51\x16\x0c\x6e\x7c\x65\xbb\x1e\x94\x14\x11\xb1\x70\x60\xa7\x5e\xd4\x3d\xef\xc7\x6d\xd2\x09\xa9\xd0\x71\x44\x07\x21\x04\xaf\xc4\xd6\x8e\x9c\x76\x42\x07\x66\x0b\xed\xd7\x09\x49\x1a\x8d\x91\xd8\xc6\xde\xe9\xe9\x59\x7e\x95\xea\x4f\x2f\xd5\x20\x54\x22\x59\x8a\x8c\x31\x61\x22\x55\x86\x8c\x31\xd9\x46\x24\xf4\x8c\x1f\x02\x4b\x0d\x4a\x33\x0c\x3e\x80\x27\x9a\xca\x95\xc9\x52\x49\x4a\xd2\xf8\x5c\x48\xf4\x45\xc2\xaa\x8f\x21\x3d\x89\x19\x5f\x56\xcb\xd6\x90\x79\x72\x06\x6f\x69\x8c\xc7\x2a\x82\xc8\x40\x31\x2e\x37\x65\x38\x78\x41\xf7\xd9\xe6\x4c\xaf\xf3\xd8\x1d\x45\x61\x68\x32\xd3\x18\xbf\xa7\x1b\x44\xc4\xa3\xe2\x03\xc3\xe8\x11\x5e\xd9\x17\x75\xe4\xbd\x0f\x6c\x3a\x7b\x87\x0e\x09\x91\x4c\x02\xb6\x43\x3c\xf0\x59\x0e\x47\x25\x83\x83\xf0\xc2\xad\xf7\x66\x27\xe9\xb3\x58\xc8\xc5\x99\xed\xae\xed\x23\xee\x09\xdf\x08\x56\x2d\xb2\xa3\x8d\x52\x0d\x75\xfa\x07\x18\x0f\x51\x8e\x49\x6c\x5f\x02\x57\x5a\x4e\xbf\x23\x98\x3f\x0b\x65\xd0\xd7\xe0\x29\xf2\xe7\xe1\x4d\xc9\x8b\x1b\x5f\x4a\xfc\xc4\x99\x06\xda\x25\xb3\x12\xc9\xe4\x9b\x3d\xf2\x4e\x18\xc8\xef\x9f\xe5\x59\x6d\xed\xe9\xdf\x8c\x2e\x2b\x61\x9b\x96\x78\x37\x5e\x33\xb7\xf5\x8f\xbb\xf0\xa4\x98\xdf\xb5\xfd\xd1\xdf\xf8\x63\xb3\xac\x2a\xe3\xad\x0a\xfc\x7a\x38\x29\x5e\x46\x57\xac\xac\x82\x51\x7a\x92\xb6\x28\x26\x68\x81\xee\x49\x7b\xee\x34\x4a\x7b\x4b\xe7\xa3\xd4\x8a\xbc\x18\x2f\x75\x74\x7b\xe1\xe3\x3e\x69\x7f\x19\xa9\x81\x11\xd1\xf5\x2a\x7b\x1f\xc7\x88\x6e\xa6\xb2\xd0\x9c\x96\xcf\x9c\x9e\x0d\xc7\x70\xd0\x19\x00\xde\x20\xa1\xb3\xa7\x65\xb5\x60\xc4\xd3\x3a\x6e\x6b\xdf\x53\xb9\x7c\xed\xf9\x08\xdc\x06\x96\xd4\x45\x1b\x11\x77\x83\x5d\x35\x70\xb5\xd9\x92\x82\x7d\xcf\xe5\xb1\x51\x6a\x37\xb2\x54\xea\xb0\x57\xdb\xe8\xec\x3b\xc8\x93\x2d\x82\x6e\x18\x55\xb8\x19\xc8\x1e\x77\x10\xa1\x9c\x1c\x3a\xe5\x7a\xab\x33\x86\x70\xa1\x9d\xf5\x8d\x86\x28\x0a\x49\xb2\xe2\x92\x04\x50\x0c\x37\x22\x29\x33\xd4\x77\x13\x77\x46\x6b\x0d\x28\xa5\x93\x56\xcc\xc7\x4c\xd5\x91\xa2\x21\xcc\x44\xfb\x27\x65\x64\x0a\x75\x00\x39\x7d\xd7\x41\x94\x03\x61\x35\xc6\x6b\xbc\x95\x0a\x53\x79\x06\xee\xbb\x79\xdd\xfd\x1d\x7e\xc3\xc0\xb6\xdb\x88\x49\xf4\x1f\x24\x82\xcb\x72\x39\x78\xdf\x6c\x8a\x89\x38\x6b\x70\x78\x49\x0e\xe1\xab\x6f\x3c\x60\xbb\x31\xb0\x3d\x4d\x6b\xcf\x8e\x48\xf7\x96\x19\x54\xbe\x03\xf0\x5c\x47\x1b\xc9\x07\x58\xbb\x75\x4e\x75\x4a\x54\xc7\xf9\x65\xb7\x91\x07\xc2\x0e\x3e\x61\x14\x89\x44\x71\xce\x28\x7e\x69\xd1\x55\x5e\x49\x34\xa2\xf7\xfb\x92\xe3\x20\xbb\x76\x04\xb0\x1c\x94\xf4\x54\xe1\x42\x96\xc8\x77\x13\x97\xfc\xac\x77\xd1\x92\xd9\xf1\x36\x90\x96\xcd\x8b\x78\xcc\x05\x87\xb8\xb2\x93\xb5\x0a\x48\x1b\x1c\x37\x33\x63\x17\x7b\xaa\xd1\xb1\x0d\x1e\xc5\x99\x2d\x70\xdd\xf5\xb1\xc7\xa9\x7a\xb2\xc2\x38\x1a\xaa\x64\xe9\x0f\xe0\xf4\x6d\xc5\xf8\x7a\xa8\x70\xb8\xc4\xa6\x0c\x6b\x06\xa8\x18\xe3\xe9\xbc\x25\x27\x53\x46\xa3\x68\x1b\x83\x4e\x04\xda\x22\x87\x9e\x32\xf9\x6e\x93\x22\x7e\x9a\xea\x10\xa1\xa7\x64\xeb\x0c\x59\xf8\x69\x0f\xd0\x57\x37\x4c\x48\x4d\x4a\xd4\xd1\x0f\x00\x9d\x4d\xad\xb4\x59\x27\x15\xd9\x09\x0e\x2f\xca\xa3\x1c\xc8\x17\x83\x9c\x6e\x27\xf8\xb5\x34\x6f\xc3\xa3\x0f\x99\xfc\x9b\x54\x4a\xff\x33\x0d\xe5\x5a\xb7\x35\x92\x2b\xa4\xdb\x6f\xf0\x9a\x37\x02\x1e\x96\x8a\x3f\x07\xd3\x45\x7f\xb8\xb3\xd8\xb6\x3f\xa4\xa1\xe7\x7a\x3f\x9e\xcd\x83\xf2\x89\x6e\x3f\x3b\xb8\x06\xe7\x76\xb1\x0a\x42\x17\x96\xac\xe4\x08\x34\xa6\x6f\x45\x7e\x67\x03\xab\x0f\x22\x36\xf2\x83\x21\xc0\x8f\x2c\x1d\x3f\xb9\x6d\x77\xc5\x41\x2b\xc2\x77\x58\xdc\x5e\xbd\xdb\x54\x36\x19\x41\x1b\xe0\x18\x6f\x65\x89\x35\xcd\x77\xcf\x44\x37\x3b\x5b\x9b\xa3\x90\x1b\xdb\x98\xb8\x9c\x23\xb1\x68\x3f\x1d\xc9\x50\x5a\x09\x9e\x75\x98\x8d\x3d\xc0\x7d\x04\x16\x3c\x7e\xa5\xf0\xab\x3a\xe4\xf8\x32\xf0\x79\x49\x1c\x62\xbe\x2e\xcb\x5f\x1d\x70\xe4\x9d\x9e\x62\xf1\x4b\x68\x42\xd8\xa8\x08\xd6\x99\xc4\x65\x42\x50\x42\xec\xda\x9b\xdf\x18\x05\x68\xf5\xed\xba\xad\x07\x4c\x16\x4e\x54\x56\xd8\x06\x3a\x6c\xdd\x81\x59\x69\xa7\x17\x3b\xcf\x8e\x10\x3e\xb4\xcd\xee\xed\xbd\xc0\xb3\x1b\xb5\xf1\x8f\xf3\x17\x2e\xf5\x05\x5d\x30\x1b\xb9\x0d\x0d\xdd\x21\xd9\xe7\xe7\x69\x64\xab\x95\x2d\x8c\x78\xfa\xb1\x53\xae\x35\x02\x3a\xfa\x9b\x9b\x26\x17\x58\x5a\x4f\x4f\xc2\x20\xb2\xa4\x46\x29\xa1\x99\xb6\x95\xb7\x1b\xe6\x85\xd0\x4d\xda\x44\x69\x36\x4f\x6e\x3b\x85\xbb\x4a\xf7\x39\x01\x30\x07\xee\x4d\xd7\xd7\x24\x5f\x97\xe6\x0f\x13\x8f\x55\xd8\x2f\x86\x7b\x0e\x9f\x58\x21\x1b\x10\x60\xd0\xae\xc4\x7e\x9b\x69\xf4\xf1\xbd\x10\x0e\x21\xb4\x1f\xfd\xde\xe9\x53\x12\xce\xcf\x1b\x6c\x6e\xf7\x33\xce\x8b\xce\x52\x26\x40\x21\x53\x0d\x10\xf6\x53\x04\xdd\x20\xd7\x9d\x16\xcc\x23\xed\x7d\x2e\xd1\x5c\x9b\x02\xca\x4f\x98\xf1\xeb\xcb\x5d\xde\x78\xf4\xd6\xc2\x8b\xfc\x53\x01\x34\x4c\x08\x6e\xc0\x5e\x74\xfa\x60\x51\xd8\x8c\x60\xa2\x9a\x51\x25\x65\xc3\x9f\xcd\x69\x48\x1d\x8a\x42\x2d\x45\xd2\x63\xad\xf9\x15\x14\x3a\x62\x74\x4e\x51\x69\x8e\x26\x99\xad\x4b\xf3\x13\x6e\x5a\x58\x5d\xb9\x24\x1a\xa2\xda\x68\xf3\x03\xdd\x9d\x8b\x8d\x40\x92\x0c\x2d\x55\x30\xdb\x33\xb9\x3f\xfe\xa2\xe3\xbd\xf1\x9b\x91\xc5\xba\x16\x63\x3d\xe4\xb1\x59\x53\xad\x43\x63\x85\x81\x61\xbb\xa1\x95\xca\x93\x93\xc2\xfe\x15\xee\xb6\xa3\x35\x31\xff\xdc\xc2\xe5\xa3\x30\xdd\xd0\x6f\xb7\xb4\x38\x66\x3d\x31\xdb\x00\x29\x21\x85\x3b\x96\xfa\x84\x50\xc2\x5b\xd1\x4e\x17\xf5\x5d\xbe\x69\x3f\x4f\xae\xc5\x27\x69\xc0\x94\xdb\xaa\x14\xdb\xcd\xdd\x1c\xbf\xb2\x31\xd1\xcb\x46\x9f\x96\x1f\xac\x71\xa7\x73\xeb\x20\x3e\xe5\xd6\x76\x40\x02\x09\x9f\xe4\x14\x54\xa7\x17\x88\x49\xbb\x9f\xd9\x4d\x1a\xf5\x23\xaa\xb4\xee\x24\x4f\xe3\xed\x16\xae\x33\xce\x70\x29\x23\x4b\x8c\xed\xac\x2a\xbd\xdb\xb8\x88\x47\x05\x08\x04\x5a\x4d\x87\x18\x6f\xf2\x3e\x77\x23\x70\xe6\xe5\x9c\x5e\x19\x20\xb9\x34\x1b\xf0\x25\x8b\xde\x96\xa2\x44\xae\xf3\x2b\xbb\x3d\xb9\x01\x57\xa4\x20\x7e\x87\x13\x89\x00\xac\x76\x3f\xf7\x1c\xd5\x63\xa5\xdb\x54\x42\xb6\x07\xce\x06\x13\xae\xdc\xfa\x31\x0f\xba\x27\x81\x61\xa6\x67\x66\x4c\x0b\x86\x3c\x7b\xa3\x33\x89\x16\x60\x91\x2b\xf7\x4e\x4c\xaa\x5c\x20\xcf\x34\xa3\x16\x13\x0b\x77\xb4\xd6\x68\xfb\xf4\x75\x18\x7d\x61\x98\xf2\x56\xac\xe2\xf3\x12\x6f\xc9\x85\x78\x0a\x4a\x95\x32\xf8\xfd\x5a\x96\xca\xfd\x7c\xe6\x86\x22\xb6\xb4\x7e\x12\x7a\x50\xb1\x87\xd1\x27\x92\x84\x04\x80\x84\x53\x00\x23\x97\xfe\x4d\xb6\xe5\xad\x15\x00\xfc\x68\xef\xcc\x2c\x18\x6d\x67\x63\xf0\x26\x66\xba\x39\x5c\xca\xa8\x20\x15\xd4\xec\x93\x00\x36\xf6\x67\xae\x22\x0d\x3c\x56\x7c\x70\xde\x67\xaa\xdf\x7e\x32\x07\x25\x2c\x92\xe0\x59\xd1\x6e\x77\x48\x5a\x19\x2e\x25\xcd\xc0\x69\xc6\x04\x2d\x9f\xbc\x74\xbe\x80\x49\x2f\xe2\x12\x09\x61\x2b\xef\x55\xeb\xb9\xb8\xd4\xe7\xb4\xbf\xf4\xa3\xd4\xe7\x34\x7b\x34\xf2\x13\xb1\x14\x1b\xdc\xef\x1c\xdd\xcb\xe7\x5e\x72\xdd\x51\x5d\x02\xc4\x3e\x3b\x0f\xd2\xb8\x40\x62\x91\x0f\x0b\xc7\x98\x2f\xbc\x4b\x0b\xca\x60\xe1\xfe\x5a\xbe\xee\x4d\x42\x04\x57\x90\x56\x2a\xc4\x02\x87\x69\x43\xe1\x18\xd2\xab\x13\x8d\x10\xaa\x12\x48\xeb\x9b\xcd\xdf\x4b\x76\x2c\xd0\x59\x48\x77\x61\xd7\xf1\xb1\xf5\x42\x9b\x8d\x26\x26\xfc\x28\x89\xab\xce\xa8\xea\x01\xcc\xe2\x1d\x49\x62\xdf\x38\xb5\x1e\xd4\xba\xc8\x0b\x39\xb8\x88\x07\x2d\x54\xbb\x1b\xb7\x73\x23\x80\x54\x36\x90\x05\x4a\x7e\x4f\x82\x54\xe7\x74\x4d\x30\x8c\xe3\x74\x10\xee\xd1\x74\xe1\x78\x16\xe5\x24\x30\x62\x5d\x79\x78\x0f\x13\x75\xc4\x3a\x9e\xa1\xda\x4b\xd7\x2f\x6e\x98\x6c\x1c\x66\x77\x28\x49\xa2\xd8\x8e\xcf\xa4\xe0\xd6\x2c\xee\xd2\x0d\x51\x75\xf6\x3d\x3b\x7d\x6e\x39\x71\x6a\x2a\xe8\xa2\xde\x2c\x4e\x8a\x18\xb2\xea\x9d\x80\xb0\x02\xf2\xe3\xcc\x8a\xc0\x54\x16\x30\x52\xd2\xc1\x28\xfa\xb9\xc5\xcd\xea\xc3\x90\xfe\x52\xb2\xfd\x43\x85\xb9\x8c\x02\x44\x36\xb5\xe8\xe9\x81\xfa\x22\x5f\x53\xc5\x7e\x60\x89\x02\xac\x89\x07\xa8\x00\x15\x84\x1d\xa1\x5f\x56\x8e\xdf\x4e\x7f\x7b\x6c\x6c\x26\x28\x95\xd4\xf4\xdd\xb2\xcf\x3a\x5d\x3a\x32\x66\x7d\x4f\x13\xf7\xf0\xc2\x30\xef\x5c\xfd\x30\xf3\x33\xd2\x6c\xba\xda\xed\xc0\x9d\x2c\xc0\x67\x3f\xdc\x71\x12\x74\x5c\x87\x63\x6b\x8d\x49\xad\x09\xac\x5d\x7c\xcc\x49\x9f\x94\xbe\x83\x7a\x27\x44\x24\x0f\xae\x08\x0d\x37\x3e\xc2\x41\xa3\x4d\x11\xa0\x22\x2e\xcb\xf8\x91\x92\x55\x64\xf1\x50\x2f\x30\xfa\x04\x96\x41\x2c\xed\xb8\xad\xe8\x20\x10\xa2\x50\xf8\x50\x4b\x5b\x72\x38\x0b\x90\x57\xc3\xe3\x19\xf1\x80\x26\x1f\x13\x87\x42\x29\x7c\xbc\x17\x09\xac\xb6\xe0\x00\x5b\x85\xce\x48\x84\x14\x6b\xd6\xc3\x18\x4c\xe1\xd6\xa2\xc7\x2a\x8c\x81\x22\x67\x5e\xc2\xcb\x16\xbe\xbe\xd9\x71\x3d\xb7\x43\xcd\x66\xf2\x89\x63\x83\xca\xe5\x4b\x21\xcc\x48\xcf\xd8\x96\x3a\xc2\xd0\x5a\xfe\x72\x8f\xab\x22\x38\xbc\x46\x55\xcb\x50\x7a\x3d\x27\xca\x9b\xf1\x2d\xd3\xe5\xb0\xc3\x72\xd7\x28\x42\x05\xe2\x8a\x14\x39\x67\x48\x8f\x82\x4f\x9d\xf0\x28\xf9\x78\x07\xbe\xc6\x07\x11\xda\xaf\x9c\xa0\x82\x2f\xd9\xb0\xe2\x0d\x20\xe0\xc0\x96\xb8\x42\x18\x15\x8f\x5f\x7e\x67\x0d\x8e\x2a\xd7\x6e\xdf\x89\x7a\x5a\x23\x3c\x95\xf5\xf6\xa8\xf4\x66\x9e\x1f\x1c\x48\xe2\xa3\xa4\x4e\x0e\xa8\xfa\x22\x78\x51\x02\xce\x88\x07\xdd\xe2\xe6\xf1\x6f\xe9\x8e\x91\xa2\x75\x91\xc8\x19\x84\x19\x15\x7d\xe6\x78\x60\xb8\xa5\xcf\x07\xa8\xe8\xeb\xb9\xab\x0d\x11\xaa\x1a\x43\x46\xe1\xa5\xdb\x13\x7a\x7e\xe0\x1e\x8a\x18\x83\xc7\x9d\xde\x9a\x7f\xf4\xf2\x2a\xd3\xb0\x66\x96\xee\xf0\xb2\xb7\xf7\x51\x87\xb5\xf2\x32\xa7\xfd\xca\x4d\x7a\xad\xc7\x9e\xdb\x2f\x7e\x40\x93\xad\x54\xba\x41\x77\xb2\x23\xe3\xe1\x46\x4d\x73\x35\x0e\x06\x33\x9b\xd4\x24\x79\xa4\x20\xcb\x4d\x3d\x12\x33\x69\xd7\xa9\xc3\x00\x53\x6e\xa8\x73\x5c\xe7\x08\x18\xae\x76\xfa\x37\xff\x8b\xb0\xe8\x13\x33\x0a\x27\xa1\x78\xda\xcb\xb3\x64\xea\x27\x78\x84\xed\x02\x97\x43\x0c\xbd\x30\x13\x9e\xb2\xdc\x4d\x5f\xa6\x70\x8b\x36\x6e\x6b\xf7\x77\x84\x4b\xb7\xce\xfe\x3e\x39\x9c\xc6\xd1\x6d\xdf\x96\xfd\x4d\xd0\xb4\xf8\x1e\xaa\xf3\xb7\x43\xd4\xe9\x26\x47\xe4\xef\x1e\x42\x2d\xb9\x76\x77\x97\xbb\x85\x1b\xd5\x44\x03\x8e\x8a\x22\x0d\x9e\xb3\x4d\xbe\xc6\xca\x11\x3e\x0a\x30\x34\x1d\x19\x44\x42\x9a\x56\x17\x14\x29\x73\xa2\x27\x9d\x99\x84\x5d\x47\x56\x4d\x58\x9b\xda\x0b\x8d\xc5\xc3\x2d\x3a\x65\xbf\xa1\x93\x83\xa4\x26\x95\x54\x37\x27\x37\xfd\x27\xc0\x42\x66\x27\x62\xbe\x86\x4a\xaf\x7c\x18\x00\x8d\x3f\x48\x3a\x53\x47\x08\xa0\x51\x73\x87\x06\xef\xe0\xc1\xb4\x7f\x71\xe5\x9c\x3c\xb6\x63\x00\x48\x1f\xcb\x96\x83\xfc\x07\x98\xc0\x8c\x3f\x87\xb5\x8c\x89\xa7\x40\x24\xc3\x7d\xb8\x8e\x16\x60\x0e\xb6\xba\x56\x32\x14\x7e\xa3\x2a\x61\x2e\x93\x0c\xfb\x80\x37\x31\x22\x1e\x3a\x6c\x1f\xba\x83\x6d\x9b\x52\xa2\x0f\x43\x01\xb3\x43\x96\x29\x0e\x2c\x5e\x08\x80\x40\xe4\x87\x9b\xa8\xf4\x10\x0e\xba\x8f\x0c\x2a\x9d\xdb\xc6\x57\x0e\x0a\xd6\x24\x86\xcc\x69\x0b\xfc\x2a\xcc\x49\x20\x8d\x85\x9d\x9f\x02\x30\x0c\x30\x93\x3d\x83\x93\x3c\x8c\x33\xa4\x46\x05\xa0\x27\x9b\x1f\x3b\x09\x14\xfd\xc2\x6f\x02\x28\x2e\x98\x17\x21\x54\xa1\xf9\xc7\x82\x68\x6f\x52\x49\x76\xaa\xd4\x97\x81\x80\x3a\x10\xb2\x4e\xb3\x6e\xf8\x30\xcd\xd2\x76\xb9\xa3\x47\x17\x4b\x4c\x75\xdc\x0a\x8c\x58\x6b\xaf\xee\x8e\x8c\x52\x85\xeb\x80\x2c\x99\xc1\x26\xbe\x8e\xae\xfd\x02\x5c\x75\x2c\x91\xf5\x58\xcb\x39\xb4\x49\xdf\x89\x1e\x11\x0e\xcf\x1e\x50\x99\x70\xe4\x3d\x12\x28\x5a\xd0\x80\xd6\x42\x6d\xa4\xf1\xc1\x16\x0f\xeb\x6b\xc9\xe3\x3f\x0e\x35\x85\x14\x27\xaf\x91\xe1\x25\xe9\xf7\x43\x0c\x7c\xa1\x90\xb0\xbd\x0d\xde\x49\xb5\x44\xdc\xcd\xad\xad\x1c\x90\x66\xf4\x6c\xb2\x0f\x04\xbf\xcc\xb4\xfe\x51\xc6\xf1\xdb\xed\x2e\x1a\x1e\xa4\x3f\xb7\x07\xae\xb1\x1f\x5b\x07\xf0\x63\xe8\xd4\xc9\xb8\x04\x15\x4a\xe6\x00\x98\xfb\xbd\xab\xca\xb8\x73\x21\x1f\x7a\xc1\x09\x63\x81\x96\x36\xe3\x23\x75\x54\xc1\x2f\x9e\x2d\xca\x39\xd8\x16\x40\x14\xfc\xf0\x38\xe5\xa8\xdf\x2a\x5f\x53\x05\xae\x78\x18\xc2\xcd\x94\x31\x8c\xf1\x20\x36\x04\x97\x6d\x0e\x05\xab\x28\x59\x36\x52\xfe\x54\x62\x1d\xd2\x2d\x4c\x29\x38\x38\xd7\x2f\x50\x3a\xe6\xf4\xab\x06\x95\x41\xe9\xdb\x60\x63\x31\xab\xb2\xd9\xb0\x0d\x4f\x88\x81\xf2\xa8\x17\x3c\x1d\xd6\xca\x47\x61\xa5\x93\x74\x71\x19\x2a\x12\x7a\x3b\x72\x0f\xde\xd5\x89\xdb\x36\xb6\xdd\xc1\xd5\x1f\x45\x76\x87\xb1\xe9\x4f\x87\x97\xf3\x28\x05\x4a\x98\x90\xfe\x95\xae\xae\x18\x5a\xb5\xae\x35\x1e\x36\x5a\x46\x52\x69\x03\x37\xdd\x47\x01\x23\x49\xc7\x8f\x08\xfb\xa4\xbc\x80\x90\xf6\x19\x72\x87\xc1\xe5\x4f\x53\x61\x82\x15\x6f\x7e\x72\x37\x00\x35\xc8\x52\xae\x9f\x90\x19\x6f\xdb\x81\x34\x9f\x3d\x12\xbc\x53\x79\xbe\x38\xc2\x21\x85\x20\x2b\x14\x96\x48\xaa\xe9\x93\x45\x17\x0d\x2d\x96\x14\x5f\x4c\x39\xde\x5c\x78\xee\x6e\x0e\xff\xa5\x08\x56\x0d\xe1\x3d\x0d\x12\x77\xc7\xd0\xd0\x7f\x8b\x1a\x9d\x7d\x2e\xe6\x1d\x2f\x3c\x3f\x3e\x2f\xeb\x60\x7d\xe6\x9a\x2f\xd7\xa1\x67\xe0\xc1\x57\x3a\x77\xc5\x66\x3d\xbd\xc2\x99\x37\x98\x84\x40\x85\xe9\x5d\xd9\x30\xfc\xe1\x8c\x5b\x48\x39\xa9\x30\x3f\x9b\xdf\xd4\x96\x99\xb0\xd3\x01\x2e\x74\x47\xaf\x79\x87\xf0\xdf\x0d\xe2\x4e\x8f\x1b\x3c\xb4\x4d\xd9\x1e\xa0\xf8\x4b\x0e\x65\x65\x2b\xe2\x64\xfa\xcf\x4b\xf7\xc4\x6b\x3d\xe0\x0d\x34\x69\xbb\x0a\x37\xb3\x65\xe2\xc6\xa0\xcf\xac\x6b\x48\x4f\xfe\x2c\xaa\x7f\x50\x24\xad\xea\x9f\x4e\x20\x0b\x66\xc7\xeb\x96\x28\xe5\xa2\xc4\x26\x33\xfa\x27\xa2\xcc\x2d\x01\x66\xec\x5a\xd2\xd8\x8f\x2b\x7e\x00\xc7\x1d\xe7\x79\x38\x66\x76\xd6\x3e\x72\xb0\x8a\x29\x87\x4f\xb4\x4f\x0c\x5e\x63\x10\x99\xe8\xb9\x7a\x98\x56\x88\xb6\x81\x35\x52\x5b\xaf\x60\x0e\xaf\x1d\x44\xff\xa3\x53\x8d\x37\xe5\xaf\x74\x22\xa5\xc3\xce\x9f\xf7\x24\xc0\xce\xda\x9d\xaf\xec\xa8\xf0\x66\x87\xb7\x03\x67\x6a\xe4\xf7\x90\x63\x73\xc4\x37\x9d\xeb\x65\x9b\x37\x40\x24\x41\xb8\x3c\xcf\x33\x4a\x12\x5f\x4f\xc4\x91\x61\xae\x81\xc8\xd3\x9f\x98\xab\xe6\xa8\xf1\x8d\xaa\xbc\x20\xed\x17\x4f\x38\x9f\x32\x20\x59\xec\x50\x98\x58\xd5\xf2\xf1\x84\xbc\x95\xcb\xcc\x67\x04\xec\xbc\xa8\x5e\x8d\xe9\x69\x6d\x61\x45\xc7\x67\x24\xdd\x33\xd1\x19\x7e\xc9\x5e\x23\xbd\xee\xe0\x77\xea\x3b\x45\x86\x10\x95\x45\x3b\x88\xf7\xae\xb3\xa7\x86\x98\xde\x74\xc5\x3e\xfc\x4a\x81\xfb\x24\xd0\xb6\x90\x43\xba\x65\x1c\xc3\x54\x39\x36\xb7\x3b\xc6\x38\xc7\x2e\xb2\xe8\xfd\x8b\x41\x8e\xbb\x4a\x41\x7d\x5c\x7c\xb1\x10\x41\x97\xac\xcd\x48\x06\x3f\x89\x5a\xb9\x0d\xb3\x92\x36\x10\x69\x4d\xab\x18\xac\x5e\x7f\xb3\x66\x3f\x2f\xf8\xe1\xda\xe4\xf8\xde\x40\x93\xc3\x85\x55\x3c\x21\xf2\x53\x39\xe5\xc5\x95\x4e\xa0\x22\x9c\x03\x30\x82\x8f\x51\xdf\xb2\xca\x4b\x1c\xb8\xf4\x72\xa7\x80\x6e\x70\xc7\x57\x7f\xf2\x02\x51\x40\x47\x0f\x04\xbb\x72\x19\x5b\x8e\xb7\x8d\x91\x1d\x7c\xdf\x1c\x98\xf4\x55\x51\xa8\x19\xeb\x85\x1b\x47\x34\xbb\xf0\x09\x21\x89\x59\x11\x1f\x4b\x24\x8e\x55\xdd\x63\x6d\x56\x8e\x02\x8e\x18\xb3\x34\x81\x63\xad\xe1\x04\x18\x48\x6b\x57\x2b\x63\x56\x94\x9a\xee\xa6\xea\x98\x88\x82\x56\x7c\x87\xc4\xd5\x7c\xb5\x63\x15\x4b\xe0\xde\x35\xa7\x43\x34\x06\xf0\x9e\x0d\x86\x72\xa3\xe2\xe8\x73\x7d\x84\x82\xc0\x6d\x36\x0a\x1f\xed\x1a\xf8\xab\xcc\xba\xca\x60\x95\x44\x5c\x71\xbe\x5f\xc5\xa1\x0f\x90\xe4\xb0\x6f\xe4\xaf\xa0\x96\xc9\x3a\xf2\x2f\xb0\x69\xbd\xd5\xd8\x21\x18\xe3\x76\xad\x81\xbc\x72\x2f\xac\xe6\x30\x80\x5f\xff\x8f\xb8\xfb\xd6\xc1\x5e\xc9\xd2\x43\x7d\x41\x0c\xe8\x5d\x70\x02\x7a\xef\x3d\x33\xfa\x8f\xde\xdb\xab\x3f\xf8\x77\xf7\x1e\xf5\x40\xd3\x1a\x41\x81\x94\x13\x55\x05\x02\xab\x6a\xbd\x24\x50\x4f\x3f\xf3\xeb\x70\xda\x05\x28\xfc\x34\xc3\x5a\x98\x08\xf3\x69\xdd\xc7\x3b\x19\xeb\xd6\x47\x58\x07\xb6\x55\xc8\xde\x67\xe7\xdb\x6f\xe5\x61\xdc\x47\xfe\x90\x85\x00\x74\xef\x34\x51\x2a\x5f\x7a\x41\x4c\xa4\xe3\xb4\x90\x95\x7b\x27\x9d\x47\x6e\xf4\x03\x89\x0f\x4a\xba\x32\x12\x7c\x2c\x9b\x09\x31\xec\x62\x52\x9b\x3f\x21\x64\xb4\x15\xb4\xb6\x01\x4e\x7b\x26\x17\x4f\xeb\xb3\x65\x1e\x3a\xfa\xa0\x49\x24\x44\xbd\xd1\x41\x0f\x45\x69\xf0\xa0\x01\x1b\xc3\x28\xb5\x2b\x2e\xc4\x01\x2d\x36\x4e\x49\x6a\x2f\x5b\xce\x44\xc0\xf6\x45\x7f\xa7\x98\x0d\x98\x67\xfb\x78\xdd\x90\x56\x82\xb8\xb4\x04\xe6\x7f\xb2\x8d\x79\x4b\x94\x2d\xa9\x7a\xb9\xed\x6f\x42\x7f\x92\x8d\x8a\xe9\x40\xf2\x65\x9c\x20\x21\x4e\x41\x30\xb4\xe7\x0f\x3d\x06\xe5\x13\xb6\x9f\x08\x2c\xb7\x31\x87\x62\x9a\xb5\x5d\x3d\x71\xc9\x8f\xcb\xa3\xf9\x50\x33\x3a\x4c\x69\x9f\x98\xfc\xd3\x4b\x15\x55\x6a\x73\x3e\xbc\xec\xe1\x38\xe8\x25\xf2\x72\x3d\xde\xaa\x7c\xcb\xfc\x12\x08\x76\x3a\x98\xf5\xe8\x95\xcf\x38\xee\xd3\xd2\xe5\xea\x90\x0a\x13\x81\xb9\xc5\x64\x1b\x57\x02\xd5\xce\xaa\xd8\x2f\xc5\x8a\x43\xfe\x81\x91\xf3\x07\x57\xcb\xcd\x9a\xf7\x6e\xe3\x13\xea\xcc\xdb\x2b\x44\x3a\x6e\xe9\x22\xe5\xb8\x81\xc1\x20\xf0\x78\x06\xe7\xfd\x0e\xfb\x4a\x8d\x9a\xb2\x7c\xda\x28\x1c\x74\x01\x23\x25\x44\x8f\x5e\x00\x43\xf5\xe0\x64\x3c\x4e\x2c\xea\x31\x19\x18\xe8\xeb\x56\xfa\xa4\x94\xe2\x7a\x18\x2a\xc1\x74\x8e\x9f\xb5\x46\x75\x15\xc5\xca\x42\xc9\x14\x1e\x33\x97\x59\x57\x14\xb7\xdc\x54\x10\xe8\x52\xa0\xf9\x56\xef\x7d\x8a\x64\x0d\x7a\x17\x8e\x97\xd9\x86\x01\xe9\x44\x01\x4a\x89\x8a\x1d\x14\x93\xf6\x84\x0c\x7e\xd1\x3d\x4d\xdd\x9c\x35\x3b\xcd\x32\x80\xcc\xce\x4f\x9b\x5b\x5b\x1d\x9c\x8c\x99\xb2\xbd\x32\xd9\xfb\xdb\x06\x16\x4d\xc2\x48\x64\x17\x77\x0c\xb2\xa8\x0f\xdd\x3d\xd4\x06\xed\x69\x0f\x57\x51\xb3\x25\xd4\xe8\x20\x53\x86\xf2\x40\x78\x05\x1e\xc2\x80\x1b\xaa\xc0\x03\x82\xa8\xbb\x3d\x96\x83\x22\x17\xda\xf5\x82\x94\x98\x01\x39\xe6\xf2\xd7\xcc\x0c\xbb\x1a\xe8\x46\x45\x33\x8b\xcb\xca\x5d\x05\x56\x55\x0f\x92\xc6\x62\xc0\x9b\x2b\xf7\xa3\xc0\xdb\xa3\x00\x25\xdd\xb3\xe0\xd3\xd8\xb6\xe3\x25\xe0\x87\x1b\x2d\x30\x3f\x97\x67\x43\x59\xbc\xa5\xa4\x0e\x7c\xa5\x38\xc7\x26\xea\x6f\xb9\xbb\xa8\x3c\x24\x28\xb4\xcc\xa3\xb9\xf8\x7b\xb2\xcf\x0d\xfb\x5f\x9b\x10\x96\xcb\x09\xd4\xe4\x5f\x9e\x71\xe8\xbb\x01\x56\x22\x72\x1a\x14\xfd\xca\x6a\xf1\x03\xdb\x48\x95\xf6\xfc\xa6\x48\xd9\x59\x07\xa5\x59\xc7\x56\x6d\x50\xd7\x75\x17\x03\xce\x55\x6b\xe8\x1d\x5f\xea\xc3\xc9\xcc\x43\x5d\x48\xc9\x21\x7a\x5a\x04\x69\x8b\x70\x0b\x0c\xee\xc7\xe8\x0c\xcf\x5c\xcb\x87\xda\x5f\xa0\xed\x3d\xb4\xf6\x65\x71\xc6\xf0\x7c\xac\x69\x25\x99\x57\xcd\x2d\x2d\x1a\xea\xc7\x12\x43\xb3\x92\x38\xd6\xe0\x8d\xf3\x3b\xd7\x0a\x76\x76\xa7\x3a\x6e\x29\xed\xa4\xb3\xdc\xda\xd9\xd0\x9b\xcb\x3e\x17\xf6\xa0\xb5\x43\x1b\xd9\x7c\xea\xea\xe0\xc4\x1c\xc7\x78\xe8\xb9\x36\x9c\x5f\xed\xc0\xf7\x1b\xe3\x8a\x86\x45\x77\x01\x1f\xba\x4a\x6e\x8e\x34\xcc\xcd\x61\x47\x61\xd6\x19\x05\xb4\xe4\xf1\xfb\x23\xea\x01\x3f\x3b\x2a\xea\x9e\x0a\xb5\x71\xa3\xc0\x6b\x76\x20\xaf\x0b\xd3\x2e\x13\xe5\x9f\x69\x0c\x3b\x90\xfe\xa1\x1d\xc6\x43\xba\x11\xdb\x3e\xbd\x62\x27\x0a\xf2\xe4\x47\xc7\x5f\x0e\xac\xe8\x47\x5d\x80\x6f\x83\xf8\x08\xec\xb5\x88\x03\x94\x61\xcf\xf1\x4b\xc7\x8a\x4a\xb1\xa4\x37\x29\xe6\x5a\x9a\xd6\x9a\xac\xe4\xfa\x9b\x0e\x78\x4d\x7c\x25\xd3\x2e\x56\xc0\xf7\x9e\x90\xce\x35\x00\xeb\x89\xe0\xcb\x11\xa5\x57\x4f\x5d\x36\x80\x35\xc5\xfb\xa8\x9b\x27\xca\x23\xb3\x4b\x48\xee\xf9\xaa\xfa\xa9\xa2\xc1\x6c\xda\xaf\x4f\xed\x61\xa4\x43\x69\x68\x4a\x44\xec\x73\x4e\x1b\x31\x63\x02\x58\x2a\xee\xdf\x62\x84\xde\x4a\x06\x5a\xdc\x96\xdd\x67\x41\xe2\x8a\xaf\x03\xb0\xb0\x8f\xb8\xb5\xa4\xa6\x3e\x28\x04\x62\xa3\xb4\x9b\x72\xf3\xb8\x23\xc8\x0d\xae\x48\xc4\xf3\x31\x57\x61\x3d\x4e\xdb\xbc\x9a\xe8\x1b\xb1\x9e\xa2\xce\x24\x0c\x31\xf9\x38\x45\xee\xa4\xc8\x3e\x7a\x45\x71\x49\xd1\x27\x4f\x12\x11\x4d\x7d\x1c\x3c\x43\xa8\xbc\x9d\x70\x17\xcd\x2b\x8b\xca\x48\x81\xa1\x51\x41\x7a\xbe\xde\x42\x9f\x4b\xb7\xb3\x7a\xa2\xe1\xee\x9f\xb5\xf2\x54\x11\xfd\x01\x1a\x38\x4d\x70\x7e\xea\x13\x0e\xaa\x1d\x0a\x62\x75\x7a\xcb\xcb\xc1\xc1\x8b\x92\x63\xa3\x02\x3a\x5d\x4b\x76\x34\xca\x3b\x38\x03\x8e\xbf\x5e\xd1\x04\x6f\x0f\xdf\xd9\x58\xad\xf8\x77\xcd\x84\x40\x8b\x90\xb2\xe2\x1b\x9b\xe9\xb9\xeb\x6b\xbf\x48\x77\x04\x5b\x4b\xcb\xf4\x97\x0e\xb5\x77\xaf\x0f\x7f\x12\x98\xf5\x53\xd1\x3d\x11\x5d\x3f\x23\x21\x6c\x74\x38\xe3\xb1\xd4\xd6\x1c\xdf\x60\xb3\xfd\x38\x2b\xa7\x92\x06\x9c\xf7\xf8\x95\x3d\x85\xde\x14\x18\x7a\xbf\xaa\x47\x95\x07\x26\x8e\xc4\x88\x10\xdc\x0e\x30\x01\xf9\xf5\xf5\x00\x94\x5f\x38\xab\xe7\x52\x12\xcd\x83\xc9\xf2\x3d\x88\xf2\x13\x6f\x45\x15\x12\x43\x05\x3b\xee\x0c\x7c\x79\x36\xc9\x62\x51\xc3\xfa\x4a\xca\x48\xb1\x2d\x85\x5b\x14\xcd\x39\x3c\xfe\x5a\x7d\x4f\x39\xed\x66\xdd\x98\x12\xe8\x61\x49\x17\x59\xd9\x24\x68\x2b\x2e\x6c\x85\x9b\x69\x78\x8c\xb1\xb8\xd2\xe9\x16\x3a\x75\x80\xf5\x28\x37\xa5\xdd\xef\x5d\x15\x99\x94\xed\x85\x27\x85\x27\x31\x0d\x53\x82\x61\xbb\xa6\x82\x31\xf6\x61\xe8\xdd\x4f\x14\x57\xa3\x6e\x9b\x5a\x0b\x64\x9d\x59\x41\xbf\x2c\xfb\x73\x10\x15\xa6\x55\x0c\xa7\xf5\x93\x65\x51\x60\xc8\xbc\xe6\x41\x71\x90\xac\xb8\xba\x13\x31\xe8\x0e\x7c\xb4\x7c\x41\x1e\x35\xa8\x88\xec\x0a\x6c\x05\x6b\x78\x83\x40\xfd\x2b\xe4\x79\x97\xdb\xe3\xac\xff\xec\xe5\x91\xa1\xd6\x72\x63\xfd\x30\xe0\x0d\x9f\x6b\x30\x82\xfc\xcd\x71\x4a\x31\xd5\xeb\xec\x1b\xb9\xc6\x63\xc3\x6a\x11\xdb\x1a\x7e\x2a\x0a\xd7\x68\x97\x44\x61\x73\x8c\x50\x95\xa0\x54\x91\x66\x2e\x70\x5f\x30\x32\xbf\x62\xe1\xbf\xf5\xf1\x75\xfd\x0f\x89\x36\xb1\x7c\xec\x28\xb7\x40\x9b\xf8\x52\xd1\x28\x4a\x50\xa7\x26\xac\xea\x32\x9f\x1f\xae\x94\xd6\x57\x8a\xcf\xf2\xf4\xbb\xce\x23\x99\x9e\xb2\xf8\x58\xfa\x98\x41\x6e\x7b\xbc\x85\x5d\x4c\xd1\xdf\x38\x97\x8b\x76\x67\x75\x19\x34\xbd\xa9\xb7\x4a\xd4\xa2\x4a\x23\xcf\x84\xe6\x76\xdc\xc4\x6c\xfb\xa2\xed\x23\xec\x90\xd8\x61\xe3\x80\x9b\x28\x40\x99\x33\xa6\x6c\x33\xb3\x35\x62\x2f\xb9\x64\x6d\x2b\xf6\x2d\x51\x1f\x82\x13\xb0\x27\x40\x75\xff\xda\x94\x9c\x41\xb2\x26\x2f\x90\x53\x9f\x95\xb0\xf0\x6b\xb3\xa9\x43\xa3\xd9\x1b\xa9\x08\xc3\xed\x48\x95\xb3\xbd\xc9\x2e\x71\xcc\x60\x26\x48\x0e\x18\xb5\xfe\xe6\xf1\x9c\xd6\x65\xa6\xd3\xdf\x9a\x71\x8a\xfa\xfb\x3c\x2e\x6a\xbc\x37\x64\x4a\x06\x80\x79\x35\x15\x09\xa4\xcb\x75\xe7\x99\x7c\xb7\xf0\x30\xca\x55\x31\xfe\x30\x98\xcc\xf5\x03\x37\x04\x02\x52\x92\x9e\x06\x5b\xaf\x10\x95\xca\x25\xcd\xe4\xa2\x8b\x87\xfb\x2e\x15\x8b\x11\x88\x03\x66\xce\xb0\xec\x34\xfa\x80\xa7\x0a\xbb\xbd\xa0\x02\xba\x1c\x39\x66\x2f\x8f\xa5\xfa\xb9\x3b\x22\xcb\xad\xcf\x59\xdf\xb8\xfb\xa4\xaa\x95\x90\x61\xc2\x37\x98\x3a\x26\xa2\x3d\x34\xf7\xf5\x18\x3a\x4d\x4e\xc0\xe4\x42\x9c\x76\x16\x00\xd3\x01\x2f\xc0\xed\x65\x0f\x8f\x7c\xa5\x12\x04\xf7\x72\xbf\x96\x22\x89\x4d\xa9\x13\xe7\x7e\x3a\x38\x73\xb6\x71\x5d\xba\x4a\x0f\x35\x08\x8b\xed\x03\xca\x54\x6c\xcc\xf5\xd3\xfa\x00\x25\x95\x62\x1d\x80\x4a\x9d\x0b\xd9\x95\xb3\x22\x0a\x9a\x5e\x8c\xe9\x61\x6c\xd5\x3f\x33\x01\xf6\x0d\x06\xd7\x0a\xda\xd5\xb8\x14\x0b\x94\x05\xdc\x82\x66\xc7\x49\x8f\x5d\x6e\x20\x7e\xd2\x38\x36\x5f\x6c\x72\x66\x04\x09\xb9\xe7\xd7\x82\xc8\xef\x5f\xd0\x59\xe8\x07\x49\xb6\xb6\x5b\xf6\x35\x91\xfb\x9d\x88\x50\xd6\x0d\xbb\xfe\xda\x6d\x0f\x18\x2c\x17\x66\x4d\x62\x7b\x78\x71\x9a\xb9\xdb\x67\x42\xa5\xc5\xa7\xd4\x7d\xaf\xbf\x1e\x11\x99\x8e\xfd\xac\x22\x49\xaa\xf3\xe3\x55\xd2\xf1\xb9\x61\x24\x12\xce\x6d\x9f\x48\x27\x8d\x56\xd9\x08\x3e\x10\x76\x8b\x13\xbc\x6b\x01\x39\xe8\xc1\xf4\x0d\x1c\x6a\x3b\x78\xfb\x86\x09\x64\xe4\xd0\xe0\x54\xb5\xef\x7c\x83\x7d\xd0\x45\x46\x6a\xb8\xb9\x7e\x6e\x3d\x02\x20\xb1\x7f\x63\xf8\x91\x54\x93\x9f\xe3\x55\xe4\xee\xa5\x02\xf7\x6b\xcf\x91\x3e\x7e\xec\x85\x22\xdf\xf6\x00\x15\xe2\xb0\x43\x6d\xe0\x58\xb3\x41\xd8\x8b\x12\xef\xb6\x3e\x8c\x84\x00\xdf\xb9\xaf\x4d\x00\xba\xd1\xa1\x12\xa6\x8a\x15\x50\x22\x6b\xb3\x51\x43\x5d\x03\xe0\xcc\xec\x78\x13\xd9\x0a\xae\x28\xbf\xd3\x60\xb9\x8b\x01\xdd\xa9\x33\x2a\x10\xd1\x06\x37\x06\x8d\x26\x81\x4a\xd0\x60\x78\x83\x74\x24\xa8\xaf\x95\x91\x17\x47\xd1\xe0\x07\xd6\x6e\x2e\x6f\x2f\xa9\x5b\x4b\xa2\xcd\xf0\xfd\xde\xb3\x9d\x18\xa0\xd3\x11\x8a\xdf\x82\x71\x34\xe8\x96\xd7\x1b\x22\x43\x9f\x12\xf1\x4c\x7d\x29\x15\xce\xdc\x0c\x51\x5a\x1d\xc9\x88\x9c\x72\x6c\x70\x57\xb5\xa2\x96\xb0\x43\x8d\x57\x56\xd7\xd9\x4c\x36\xcd\x76\x25\xc7\xac\xa8\xee\xa5\xfb\x48\xca\xa5\x8c\xf3\x7d\x66\x1a\x06\x88\x08\x48\xf8\xfa\x38\x00\x26\x02\x34\x45\xe2\x07\x4b\xf1\x53\x1d\xf8\x91\xfa\xcf\x8e\x2e\xe6\x5a\x84\x06\xd4\x9a\x84\x56\x44\x13\x44\x5c\x50\x04\x47\xdb\xfe\xbb\xfd\x59\x30\x27\x56\xa7\x7b\x59\xbd\xcd\x38\xf2\xf2\x1d\x91\x62\xe1\x87\xb8\xcb\x8e\xfa\xc9\x06\xb6\xa4\x7e\x72\x64\x57\xc1\x59\x4c\xf9\xf0\x75\xcc\x57\xd0\x0f\xa8\x90\x4d\x67\xda\x49\x48\x98\x5a\x9f\x9e\xd6\xef\x6c\x8a\x40\xf6\x1e\x0d\x34\x90\xc2\xb4\xe4\x04\x7e\x20\xbf\xd2\xb0\x28\xbd\xd2\x8c\x81\xdd\x7b\x9b\xab\x20\x51\x23\x16\x56\xf1\x18\xc5\xc8\x7a\xdb\xfc\x49\x70\x24\x9d\x03\xdf\x9a\x44\x78\x13\x19\x26\xdc\xbf\x40\xe8\x79\x23\x51\xb3\x3d\x5b\x5d\xba\x66\x32\xa9\xc3\x1d\x7d\xa8\xe6\x56\xd4\xd5\x1b\x9c\x74\x5b\xbd\xaf\x22\x49\xef\xd3\xc3\xc2\x48\x8b\x3d\x0a\x23\xe6\x43\xbd\x96\xab\x20\xa1\xa9\xad\x7e\x9d\xa1\xb8\xfc\x60\xc7\x25\xda\x34\xa8\x0a\x28\x59\x60\x67\x81\xc6\x8b\x64\xf6\x5e\xc6\x73\x2e\x1c\xf9\x22\x5e\x97\x38\x1a\x83\xdf\x23\xc5\x13\xf2\x62\xc1\x7b\x66\x57\xe4\x64\x61\x66\x91\x10\x27\x28\x80\x7a\x3b\x5c\x15\x56\x5d\x90\x9b\x1e\xc7\x97\x93\x64\x90\xf1\x75\x79\x0e\xea\x24\xf1\x7a\x70\xea\x13\xe8\x19\x28\xc8\x61\xb7\x2a\xc3\x15\x74\xb4\xec\x07\x08\xe6\x10\x19\x28\xca\x92\x34\xf5\x9b\x7a\xd5\x91\x0d\x0c\xac\x58\x15\xff\x2d\x62\xef\x67\x07\x87\x75\xfc\x0b\xba\x1b\x1e\xfd\x88\x32\x2e\xfc\xe9\x80\xc2\xb3\xd8\x14\x57\x17\xf7\xb7\x19\xa9\xd5\xc0\x02\x58\x93\xde\xb4\x1c\x3a\x83\x57\x87\x2a\x5f\xa9\x8e\xef\xbb\x5c\xa4\xb9\x5f\xf2\xf8\x0f\xd1\x17\x31\x35\x79\x6d\x4a\xf2\x55\xde\x0a\xea\x9d\x4c\x98\x19\x54\x52\xa0\x86\x26\x3f\xbe\x65\x33\xfc\xbe\x36\x63\x1c\x1d\xd5\xb4\x43\x5f\xce\x28\x4f\x9d\x38\xd5\xc2\xe1\xa9\x35\x8f\xee\x7b\x9c\xe1\x4d\x28\x0b\xa0\x28\xa3\x72\x5d\x84\x6b\x85\x0b\xdb\xef\xfe\xb6\x0d\xf9\x82\x16\x5c\x00\xb8\x24\x3c\x91\x59\x50\xe7\xb4\x61\xfe\xe7\x37\x3a\x25\xd6\xa6\xda\x51\xdb\x0b\x98\x12\xfd\xb0\x7f\x4a\x2c\x8b\x71\xf5\x9a\x8a\xa1\xcf\x6c\x25\xe9\xf4\x22\x26\x2c\x2c\xea\xf5\xfd\x9c\x39\x5a\x2a\xc1\x56\x46\xa5\x82\xfd\xc0\xc8\x90\x37\xdb\xa3\x20\xe0\xc3\x89\x17\x18\x81\x3e\x4d\x82\xc9\x86\xd4\xdc\xb1\x14\x46\x30\xef\x1f\xc8\x4a\xf0\xb8\xf0\x49\x54\xaa\x19\x6a\x79\x27\x8a\xc5\x71\x8b\x03\xee\x93\xd8\x2f\x39\x0a\x04\xd3\xa2\x0e\x67\xed\x98\x92\x7d\x46\x77\xd4\xa3\xdf\x45\x30\x56\x3b\xdd\xc2\x3e\xef\xb2\x2c\x93\x18\xa6\x41\x28\x75\x2c\xc7\xfa\x91\xab\x01\x09\x2a\xa6\x74\x3c\x23\xcb\x77\x5d\xbf\xa2\x13\x85\xde\x4b\x7f\xa2\x01\x4c\x36\x5d\x90\x76\xfa\x81\x6f\x1f\x3b\xd9\x78\x5b\x29\xa3\x92\x2a\x18\x37\x94\x01\xe2\xf9\x5a\x13\xfd\xef\x8c\x05\x0b\x57\xcc\xc1\x8d\xda\xb6\x5f\xa8\x23\xf4\xdc\x0d\xb7\x34\x8f\x42\xf7\xbd\x9b\xf7\xa6\x0f\x7a\x3e\x59\x36\xbc\x53\xfd\x00\xef\xf1\x5a\x1c\x36\x72\x39\x12\x92\x02\x31\x2a\xd6\xcf\x91\x80\xc4\xa9\xea\x7f\xec\x6e\x58\x9c\x4f\x82\x91\xa3\xf2\x64\x63\xe3\xd3\xe9\xf0\x73\xbe\x65\x33\x79\x5f\x93\x71\xf0\xa4\x7e\x13\x2a\x8f\xab\x95\x7c\x60\x5b\xcb\x12\xa7\x8f\x32\xc4\x1c\xb5\x67\x40\xf6\x09\x7c\xac\xa5\x44\xe8\x67\x41\x4e\xa0\x87\xae\x02\xd1\xcc\xcf\xcf\x57\x1f\xbc\xb5\x3c\x79\xfe\x21\x9e\xa3\x3f\xbf\xe9\x28\x16\x50\xed\x8b\xc3\x39\xc3\x26\xd9\x7a\x79\xf2\x10\xfd\x1a\xc1\x1b\x3f\xad\x34\xcb\x0f\x8b\x91\xbc\x1f\x25\x53\x64\xd0\xb0\xcb\xfc\xf5\x36\x90\x36\x3b\xfc\x86\xf4\x31\x67\xc2\x00\xca\xea\x29\xfb\x66\x20\x61\x1f\x2c\xfe\x6c\x1d\x00\x02\xad\x59\x21\x27\xc1\xcb\x54\x71\x90\x4f\xa4\xbd\x85\x13\x0b\x17\x1e\xc8\x8a\xa6\x62\x1a\x20\x01\x8c\x47\x79\xc6\xe2\x0f\xdc\x5a\x0c\x60\xaa\x52\xed\x3e\xb5\x9a\x0c\x2f\x00\xbb\x48\x08\xe9\x00\x7f\x39\x87\xdc\xc0\xa7\x2d\xe8\xbb\x77\xb9\x7f\x8c\x54\x30\x83\x35\x30\x31\xb2\xe4\x46\xb4\x89\x99\x1b\xa2\x8d\xaf\xee\x6c\xb8\xd2\x81\x06\x67\xab\x29\x78\x43\x7f\x41\xe1\x10\x69\x62\x60\x79\x0f\x61\x3d\xd0\xe9\xf2\x2b\x69\x2d\xc6\xa3\x69\x27\x3f\x94\x64\xf6\x59\x06\xee\xb3\x58\xcd\xe2\x97\xe9\x3d\xc4\x0c\x58\xe4\x6d\x18\xfa\x7d\x00\x4f\x9b\xf6\xdd\xd6\x24\x4a\x1e\x6b\xe2\x50\x1e\x24\x58\x35\x98\x87\x41\xf5\x55\x90\x9b\xd5\xf5\xad\xe6\x58\xf8\x8a\x1d\x1e\x6e\xcb\xb0\x84\x9c\x17\x30\x6d\x72\x55\xea\x54\x24\x80\x97\x26\x06\x7a\xbb\xd9\x23\x05\x86\x49\x3f\xe1\x77\xaf\xc2\x9b\x6f\xe8\xe5\x86\xc7\x0d\x6b\x00\xf2\x72\x56\xc4\x6d\x23\x25\x05\xab\xf5\x6d\x4a\x3c\x2f\x97\x9d\x30\x13\xc0\x6b\x5e\x13\xba\xea\x38\x04\xab\x24\xb0\xbd\x4b\xa6\x61\x3e\x35\xbc\xcc\xf9\x50\xa7\x45\x17\x21\x2f\x17\xb1\x65\x91\x11\x45\x0e\xc9\xe4\xc3\x79\x0a\x3f\x19\x8e\x42\x43\x65\x80\xdf\x5c\xf5\x44\x09\xb2\xb0\xdc\x9b\x1e\x3f\x5a\x1e\x5c\x35\x36\x04\xbe\x5a\xa4\x7b\x4b\x90\x09\x01\xe9\xfb\xdb\xd2\x63\x72\x36\x57\x11\x1e\xd6\x41\x8e\x0f\xb5\x92\x6c\x86\x19\x91\x6a\x75\x0b\xa7\x9a\x83\xed\xbc\xa0\x1a\x3e\x94\xc5\x62\x56\x11\xe0\x46\x03\x98\xf9\x14\x37\x02\xf7\x58\xa5\xb1\x24\xfe\x00\xb6\xae\xd5\x01\x02\x6e\x4a\x44\xb5\xdc\x71\x7a\x59\x1c\x53\x48\x4d\xf5\xe3\xea\xe6\xd4\xad\xa8\x19\xe0\xec\x72\x4f\x44\x1a\xc8\xf6\x96\x9a\x79\x91\x24\xe0\x46\xa5\xcb\x82\x47\xd5\xe2\xb8\xe5\xc0\x23\x53\x58\x11\xc5\x30\x2a\xfd\x99\x60\x02\x93\xc8\x65\x8d\x03\x1c\xb9\xb5\xd9\xe7\xca\x64\x59\x05\x0f\xfe\x9b\x01\xe4\xa1\xb1\x5a\xcf\x3c\x0c\x34\x84\xb1\xa5\x0e\xdb\x49\x6b\x53\xed\xeb\x0b\xfd\x35\xeb\xf8\x56\xbe\xdc\xd6\x39\xb0\x07\x20\xf0\x72\x7b\xeb\xe6\xee\x39\x5c\x67\xcf\x7b\x35\x26\x46\x3e\xd5\x42\xdc\xe4\x02\x15\x73\x64\xb6\x07\xfa\xda\x90\xcb\xd4\x59\x9b\xe4\xfa\xbb\xe7\x5f\xe5\x59\xc3\xf6\xeb\xd6\x2f\x54\xd8\x71\x25\xb8\xa8\x09\x4e\xac\xe6\x05\xe6\x7b\x09\x7a\x84\x42\xfc\x6d\xaf\x19\x5f\x02\xe7\xe8\xd2\xf9\x4e\x13\xcc\xb9\x58\x50\x38\x5d\x54\x77\xe9\x50\x3a\xdf\xd6\x29\x4c\x63\xa0\x83\x11\xc9\xa5\xc5\x22\x9f\xbe\x01\x44\x56\xd5\xef\x88\x56\xc5\xdd\x26\xd0\xa4\xd5\x56\x77\x96\x56\xc9\x1d\x37\x7d\x97\x76\xe4\x55\xa1\xb8\x64\x40\x17\xe1\xf3\xa7\xd1\x65\x23\xa1\xcb\x18\x7a\x67\xd4\x51\xe7\x76\xa2\x86\xf2\xde\xe5\x55\x53\xb5\x73\xe2\x34\x33\xee\xb7\x24\xda\xd8\x34\xfb\x02\xaf\xe3\x97\x59\x81\x2a\xa7\xeb\xa9\x15\xf2\x99\x41\xfb\xd5\x1a\xc2\xf5\xdf\x16\x7e\x61\xdc\x7c\x0c\x6f\x98\x36\x11\x04\xa2\xa3\x6b\x03\x26\x46\x83\x5a\xf2\x62\x42\x68\x76\xd4\xab\xfb\x09\xb7\x53\x1a\x6d\x04\x2d\x4a\xc2\x4e\xb4\xa9\x13\x89\x42\x6e\x28\x1f\xb7\x19\x1b\xcf\x1d\x5c\xab\x2f\xc6\xe1\xcc\x27\x76\xd8\x3e\xff\xf6\x0d\x73\xe0\x71\x5b\xc8\xd5\x4f\xde\xdd\x9c\xa4\xa3\xd0\xfd\xe9\x22\x15\xfd\x9e\x3e\xe8\xb8\xf9\xca\x5f\x89\xd3\x48\x01\x8b\x7f\x59\xaf\x73\x70\x74\x68\x85\x1a\x47\xbb\xfd\x66\x44\x86\xe8\xb1\x44\x0d\x97\x17\x11\x7a\x01\x2c\xad\xe5\x7e\xda\x4c\x34\x1f\x1e\xaf\x50\xf1\xd9\x35\x52\x57\x1f\x4a\xf7\x67\xd7\xa1\xd8\x73\xe1\x93\x02\x6b\xb4\xb8\xa8\x76\x93\x6f\x2f\xa0\xe3\xba\x96\x30\x79\x84\x1d\xc3\x63\x70\xd5\x31\x76\x69\xbd\x4b\xdc\x24\x68\xb1\x6e\xc4\x5e\x5d\xe1\x9f\x6e\x93\x31\xff\xce\x26\x3d\x0c\xec\x81\x07\xbc\x57\xe8\x20\xeb\xe8\x59\x35\x4a\xba\x3d\x00\x15\x9b\x72\x1a\xfb\x53\x20\xc3\xee\xd6\x38\x24\x6d\xfb\x05\x74\x35\x65\xf7\x62\x58\x76\x60\x22\x44\x50\x5b\xde\xf2\x1a\x8f\x2a\xa3\x52\xca\x7c\x11\xa7\xea\x2b\x84\x57\x04\xe0\x8b\x44\x18\xe1\x71\xe3\xb9\xcd\xa1\x3b\xeb\x10\x7c\x16\x9f\xf5\x3e\x6f\xdc\x4b\x07\xdf\x15\x8e\x26\xc6\x6f\x57\xb2\xce\x6d\x6c\x6d\x7e\xc4\xed\xc5\x08\x3d\x95\x88\x6c\x7c\x29\xd3\x0d\x96\x13\x1d\xd3\x69\xba\xca\x0d\x0e\x7a\xc1\xdd\xaa\x3c\x7d\x33\xfe\xec\xcd\xc3\x97\x27\x0e\x24\xb4\xca\xe6\xaf\x8b\x4d\xc4\x07\x90\xbc\x99\xd1\xf8\x17\x4d\x72\x29\x87\x03\xf6\x28\x61\x76\xd7\x5b\x67\x45\x8c\x74\xea\xf8\x73\x6a\xcf\x55\x35\xfa\x4c\x2e\xa2\x2e\x7a\xce\x42\x99\x73\x0c\x7b\x63\xad\x44\x71\x9f\x25\x08\x4b\xc6\x1d\xb4\x7d\x58\x85\xc6\x6d\x57\x1e\xd0\x7c\x4f\xf5\x79\x9b\x55\x28\xc0\x9d\xb7\xee\x27\x4e\xc4\xc0\x45\xf2\xae\xee\x8e\x4a\x91\xb0\xd8\x48\x7c\xec\x77\x5b\xcf\xb7\xaa\x73\xd4\x49\xd0\x30\xe3\x1e\xe0\xb6\x24\x2c\xdf\xc0\x54\xb1\x00\xd1\x57\x01\xfd\x95\x7e\x80\x4e\x08\x47\xc1\x6e\x50\x29\xd6\x75\xad\xd4\x85\x6c\x81\xc7\x7e\x00\x0b\xe1\x02\x83\x5a\xe3\x40\xa5\x01\x0b\xa9\xd0\x70\xd4\x05\xf0\x05\xd9\x1e\x68\xb7\x74\xcc\xf3\x12\x9d\xe6\x7e\x0b\xa3\x79\x1c\xe0\x90\xb4\xf1\x52\x57\x8a\xb5\x89\xef\x9c\x32\xee\x0b\x95\x89\x71\x2a\x85\xe2\x12\x04\x00\x49\x98\x78\x98\x6b\xda\x86\x81\x87\x3e\x1a\x23\xb0\xc8\x23\x27\x4d\x3a\x28\x00\xc8\xbb\xd3\x3c\x91\xb3\x54\x61\xd1\xd4\xd3\x9f\xd4\x84\x5b\x68\xbd\x6b\x3c\x2d\x5d\x3b\x61\xdc\x42\xef\x14\x83\xb6\x1a\x8b\x2d\x79\x82\x2b\xd0\x08\x8b\x96\x6b\x3e\x51\x6c\x83\x5f\x88\x2d\x4f\xa5\x92\x40\x60\xd3\x54\x0e\xb1\x17\xeb\xa4\xcd\xb3\xee\x58\xf3\x0e\x8d\xa2\x1d\x7c\xb0\x98\x89\x30\x67\xae\xdb\xc3\x5d\xfb\xc2\x21\x9d\xf7\x0d\x0f\x91\x66\xcd\x9b\x27\x53\x08\x1b\xa1\x85\x25\xd9\x2a\xfa\x7c\xcd\x4d\x4f\xa2\x83\xa6\x2c\xe0\xc3\xc0\x4c\x88\x05\xc8\x2e\x90\xe3\x98\x02\xb3\xf8\xbe\x59\x72\x16\x87\xd2\xa1\x98\x9e\xee\x9f\xe2\x7a\xef\xcf\xea\xea\x5d\xba\xf6\x3c\x26\xf3\x11\x1c\xb6\x4e\xd8\xc8\xc9\x85\x63\x63\xfe\xeb\xdb\x45\x6c\x37\xb0\xc3\xf6\x0c\xb8\x7a\x86\xa9\xc7\xad\x24\x87\x8d\x70\x88\x1c\x47\x31\x09\x30\x2f\xa2\x81\x77\x78\x93\x81\xe4\x51\x63\x88\x26\x46\x61\xe3\xcc\x9a\x49\x37\x27\x48\x68\x55\x0b\x4f\x99\xd5\xb6\x80\x59\xe6\xd3\x90\xee\x0b\xea\x9f\xa1\x02\xab\xec\xd1\x34\x77\x15\xaa\x9e\x94\x92\xb5\x20\xf8\x1a\x31\xc3\x89\xa0\x30\xf2\x7b\xf0\x26\x7e\xdb\x16\xff\xcc\x11\xe7\x53\x11\x00\x05\xf9\x15\xcb\x0e\x37\xd4\x1d\x65\x72\x85\xc9\xf0\xdf\xf5\xcd\xfe\xf3\x63\x67\x7d\x13\x30\xf3\x9b\xb4\x10\xad\x5e\x48\x13\x41\xca\x99\x9d\x74\x59\xe1\xcc\x51\x9d\x4d\xad\x5c\x86\x56\x76\x9f\x1b\x86\x12\xc8\x67\x21\x36\xe1\x1e\x82\xcf\xd5\xcf\xa3\xb5\x97\xc8\x28\xb6\x1d\x52\xf2\x9d\xe4\xf0\x03\xab\x03\x1b\x16\x48\x91\xfa\x79\x59\xa0\x2b\x23\xac\xd5\x5a\x6b\x0b\xd6\x8d\x55\xde\x62\x16\x73\xd4\xcb\x8c\x5f\xfc\x1c\x9d\x58\xc2\xd5\x5a\x36\x22\x0f\x4a\xda\x80\xef\x60\xde\x75\x66\x26\xd1\x39\xb9\xa2\xf0\x42\x27\xb5\xfb\xc5\xca\x0d\x65\x37\x9c\x7a\xcb\x69\xdb\xfd\xf3\x28\x68\xdd\x4d\x2c\x46\xbf\x75\x34\x1c\x17\x4d\xa2\x3a\x98\xf9\x46\x8a\x6f\x53\xef\xd7\x8a\xcd\x6a\x43\x21\x3b\xba\x7c\xf5\xf4\x18\x54\xad\x28\xaf\x67\xab\x53\x11\xf0\xc3\xc4\x11\x1c\xda\x3a\x01\x5b\x28\xd3\x80\x0a\x54\x69\x1e\xb0\x53\xe1\x47\xaa\x00\x4e\xaa\xf4\x07\x19\xb5\x42\xa6\xe8\x79\xe5\x59\xfe\x8e\x96\x99\x7f\x64\xb7\xc5\x49\x89\x97\x03\xea\x25\xe5\xc2\x3d\xf2\x98\xa1\x3e\xf4\x3b\xae\x0b\x3f\xbb\xbd\x86\xd1\x1d\x56\xf3\xb8\xa1\x12\x3f\x00\xfd\x2e\x20\x0e\x21\xa0\x30\xef\xc2\x2b\x41\x87\x4d\x6e\xcd\x03\x7c\xe1\x64\x9a\xe6\xec\xe9\xbe\xa6\xf7\x74\xa2\x45\x3e\x2f\xa1\xbc\x84\x06\xb1\x62\xfb\x23\x15\x9d\xa8\x39\xc0\x56\x4e\xf3\x91\x09\x7d\x14\xec\x46\xc5\xcd\xb7\x46\xa5\xa2\xac\xdd\xb3\x56\x18\x8c\xf9\xa6\x80\x62\xcf\xfe\xe9\xa7\xcd\x09\x6a\x5c\xd2\xf2\xd2\x88\xd7\x9a\xd7\x1e\x18\xb6\x8b\xf7\x7e\xdf\x06\xa7\xf4\xb5\xad\x17\x98\xbe\xa0\xd0\xd5\x2f\x9a\xe0\x50\x81\x00\x51\x4a\xdf\x31\x93\xbe\x9c\x18\x86\x00\xed\x9a\xd5\x5a\x69\x1c\x41\xd0\x03\x61\x7a\xac\x3e\xf3\xde\xa3\x78\xee\x6e\xbb\xf3\xe8\x2e\xf9\xac\x9b\x88\x24\xc9\x94\x16\x18\xc6\x01\x06\x6e\x92\xdc\x7e\x2f\x2a\x9d\x9a\x14\xf8\x11\xbf\xe7\x74\x99\xfa\x04\x2a\xdf\x12\x5e\x20\x64\xd3\x12\x78\xa2\xd7\xd2\xa9\x1f\x65\x16\x6f\xbf\xab\xf6\x5c\x32\x00\xea\x91\x40\xea\x15\xe4\xaa\x1d\xc5\xcd\xd2\x0e\x82\xad\xe2\x98\x64\x07\x59\xad\x7a\x18\x80\x3a\xe8\xf5\x66\xa9\x5c\xb6\xbe\x4d\x7a\xba\x15\x78\x4c\x8a\x78\xba\x09\xf0\x19\xb5\xea\x32\x9d\x6e\xd8\xa3\x29\x80\xa9\xa0\xec\xc5\xfc\x9d\x26\xe1\x73\xb4\x2a\x00\x03\xaa\x73\xbd\x25\xca\xa8\x0c\xb5\xbc\x76\x4b\xcf\x45\x5d\xef\xc9\xb7\x70\x04\x5f\xdc\xe5\x88\x6a\x17\xba\xd1\xb9\x8a\x6e\x28\xca\xf4\xd1\x6f\x72\xa6\x88\x6e\xc4\xed\x07\xd1\x05\x78\x20\xca\x60\x1e\x9c\x77\x2b\x97\x3d\xaa\x82\x72\xa5\x9c\xd0\xe1\x99\x00\x0e\x8b\x08\x12\xe3\xc3\x15\x7b\xdb\xc2\x61\x4b\x5d\x4b\xf3\x3a\xa6\x1e\x58\x47\xc3\x5a\x44\x9b\x8c\x4a\xf7\xdb\x43\xaf\xdd\xe5\x8e\x7d\x34\x34\xf4\x14\x07\x20\xe0\xf6\xc2\x83\xcd\xa8\xee\xd5\x78\x7d\xb0\x98\xbb\xe8\x43\x83\xf7\xe1\xc7\x6d\x4b\x28\x60\x11\xd5\x3d\x39\x02\x38\xf8\xc1\x60\x15\xda\x99\x3e\x31\x4b\x4d\x08\xfe\x15\x27\x5f\xcb\x9d\x5c\xe9\xad\x2e\xc1\x6d\xfe\x46\xef\x4c\x73\x34\xfa\x5e\x33\x40\x4f\x6e\x18\x49\x17\x18\x5a\x0a\x14\xb8\xe2\xf5\x79\x29\x4f\x7b\x95\x8f\x95\x58\x28\xc5\x65\x7b\xf2\x13\x13\xdb\xe6\x79\x82\x34\x2d\x22\x27\x3f\x2e\x35\x82\x1c\xda\x50\x3f\xf1\x3d\x7f\xd2\x56\x54\xb8\x23\xfa\xca\x14\x0f\x42\xa8\x33\x50\x18\x46\x65\x96\x9f\x9b\x98\x2a\x5b\x64\xe1\xa1\x63\x43\x4c\xb3\xc1\xcf\xdb\xb7\x34\x2d\xcc\x1d\x81\xf9\x3c\x91\x23\x71\x43\x59\xee\xcb\x36\xf4\x6c\x0f\xf6\x3a\x91\x42\x01\x22\xf9\x7e\xb2\xec\x77\xb1\xc8\xcd\x2c\xa1\xe9\x7b\x9d\xc0\x13\x75\x28\x5a\x78\x43\x4a\x28\x90\xc7\xc1\x58\x00\x97\xa4\x96\xef\x4f\x1f\x8e\xde\x84\x59\x04\xc8\x7b\x6b\x4d\x96\x0e\xec\xef\x79\x2a\xa4\x34\x62\x70\x54\xb9\xac\x0e\x7b\x61\xaa\x3a\xd7\x1e\xab\x64\x08\x0c\xb3\x0a\xb1\x60\x9b\x73\xe3\x21\x17\x0e\xbe\x8d\xd6\x91\x7a\x47\x58\x4f\x5f\xb0\x43\x41\x8b\x89\x82\xd9\xb4\x19\x96\x0e\x6c\x27\xd4\x62\xff\xea\xaa\xeb\x1d\xc1\xc7\xda\x23\xb5\x5f\xad\x95\x5f\x39\x83\x0b\xa7\x78\x9e\x84\x32\x8f\x08\x86\x5a\x51\xfd\x92\xc8\xfb\x71\x6d\xc4\xf8\xc2\xf6\x50\x2b\x7c\x20\x3f\x93\xec\x64\xf7\xbb\x64\xb3\x7b\xb9\x06\x5b\x2e\xcc\x4f\x57\xf2\x57\xb6\x4b\x54\x7c\x55\x55\xb2\x52\xbb\x8f\x3e\x74\x3d\xea\x86\x53\xa0\x8d\xe3\x80\x6e\x3e\x05\x68\xbf\x06\xe8\x62\xd5\xa9\x4d\x4f\x2d\xf9\x84\x60\x8b\x3e\x02\x1a\x34\x08\xbc\x6c\xfc\x5e\xde\xf4\xe1\x4c\xc6\x30\x09\x4c\xaf\x2a\xbd\x14\xee\xfe\xdc\x1a\x2f\xc8\xaa\xf1\x0b\x72\x5e\xac\xd5\xe3\x57\x34\x16\xfa\x25\x33\xab\xd0\xc3\x08\xc2\x90\x20\x53\x83\x85\xc0\x82\xa0\xec\x83\x70\x12\x05\x74\x60\xc4\x31\xd6\xb3\x08\x88\xf8\xad\xe6\x2b\x98\x71\x74\xfd\x16\x56\x0f\x8c\x3c\x90\xff\x6c\xa8\x8a\x53\xb4\xc7\x6e\x5d\xc8\x61\x32\xde\xd6\xb3\x8d\x09\xe0\xfa\x41\x40\x88\xa7\xc0\x36\xbc\xb9\x53\x53\x36\xf2\x01\x05\x74\xff\x0f\x2a\x12\xc5\xaf\xf1\xf7\xdf\x53\x91\x2e\x78\x42\x42\xe2\xfc\x37\x54\xe4\x9b\xf0\x0c\x75\x09\x20\x26\x83\x11\xdc\x78\x52\xf2\x0f\x2a\x52\x60\xb8\x41\x61\xb2\xbf\xe9\x11\x78\xe0\x69\x23\x80\x85\xe0\xd9\xe8\x2f\x6e\xaa\xb6\xa1\x64\xd6\xf1\xf6\x8c\x0f\x9d\xa3\x26\x22\x56\x1b\x7f\x87\xaa\xe9\xde\xd2\xa2\xf6\xcc\x8b\xd9\x4d\xb1\x3d\xc4\x34\xaa\xde\x27\x1e\x46\xb9\x8c\x73\x6a\x2d\xf3\x3a\x25\x2f\x0b\x5f\x11\x8b\x77\x71\xf0\xac\xcb\x25\xf2\xe4\xfc\xf4\x3c\x69\xbd\x97\xf1\x5d\x1c\x2d\x4e\x3d\x52\x73\x64\xfa\xf0\xa3\x02\x4b\x00\xc0\x70\x14\x44\xab\x21\x8e\x0b\xb6\x03\xbc\x65\xc6\xdd\xae\x66\x07\x79\x36\x33\x47\xf0\x65\xc8\x22\x44\x28\x93\x3f\x4b\xe9\x3d\x76\x0c\x0c\x9c\x18\x90\x2a\xc1\x80\xaf\x92\x5a\x93\x63\x8e\x1e\xeb\x3a\x93\x20\x15\x67\xe3\xc6\x8d\x16\xa6\xf9\x6b\xe7\x2c\xf6\x97\x30\xfd\x1c\x80\x76\xe1\xc7\x18\x80\xab\x10\xf0\xaa\xf0\xf7\xe3\xb9\xec\xd3\xfd\xfc\x8c\xa2\x7e\x01\xa9\xa9\x0e\x8d\xf1\x87\x35\x5f\xb2\x19\xc6\xaf\xb5\xb7\x0f\x42\x38\x3d\xd5\xcd\x9a\x1d\x95\xe0\x47\x75\x0d\x1c\x03\xfc\x64\x99\x29\xd9\x0e\x81\xf3\x60\x0a\xf5\x23\xbd\x3e\xc4\xc0\xb7\x7f\xbb\xce\x28\xee\x6f\x81\xb9\x11\xce\xee\xb9\xa1\x0d\xd4\x91\xbe\x7a\x8e\xf4\x7c\x65\x40\x7f\x35\x77\x54\xb1\xad\x32\xa3\xbc\x38\x55\x39\x1f\xc9\xf8\x9a\x54\x54\xcf\x87\x64\x81\xdc\x12\xb0\xcb\x7e\x02\xf1\xba\x28\x0c\xbd\x3f\xd4\xaa\x0b\x7f\x4a\x17\x59\x32\x7e\x6a\xc2\x77\xe4\x2c\x38\xcf\x8f\xf5\x86\x4b\x6a\x47\x72\x6b\xc0\xb2\x32\xc1\xf1\x65\x4d\xe2\x54\x12\x64\xac\x38\x4a\xb7\x68\x74\x27\x8b\xbe\x1b\x4f\xe1\xaa\x62\x67\x31\xe6\xc7\xc0\x3a\x8d\x49\x5e\x9f\xac\x35\xeb\xea\xd2\x16\xd1\x60\x7c\xc0\x89\xdb\x9d\x26\x36\xba\xb2\x26\x2c\xb1\x06\xab\xe6\xcc\xbd\x1d\xd0\xe0\xd8\xa7\xfc\x60\xe9\x22\x33\x6a\x5d\x0d\xc7\xb3\x6d\xfb\x32\xf7\xdf\xc6\x64\xf5\xc7\x83\xaf\x0a\xc7\x10\x7d\xaa\xc1\x93\x1f\x2b\x11\x09\x86\x85\x2f\xa0\x85\xc4\x00\x14\x55\x74\x23\x5d\xd6\xfa\x6d\xaf\xbd\xe8\x51\x0b\x02\xe0\xc7\xd7\x84\x09\x79\xd1\xca\xc6\x11\xac\x83\x47\x9c\x07\xbb\x48\x65\x3b\x05\x56\x7f\xc6\xfa\x90\xa8\xa3\x91\x65\x0b\x0f\x13\x3f\x40\x67\x3e\x5c\xfa\x8e\x09\xb8\x9e\x4e\xad\x1e\x7f\x74\x04\x49\x2f\xbc\x1d\x07\x3d\x40\xeb\x71\x6d\x76\xa1\x5f\xc9\xe9\x31\xf1\x94\x02\x13\x93\xa6\x0c\xb6\xff\xf0\x4c\xcc\x7d\xe5\x82\x66\x78\xa4\xe8\x9c\x58\x09\x19\x7f\x0f\x6c\xe5\xf9\xa0\x11\x9b\xe5\x8b\xab\x3c\xda\x07\x93\xaf\x80\x2a\x59\x9e\xc5\x1a\x7c\x33\x9a\x2b\xc4\xae\x72\x47\x27\x5d\xf8\xb6\x72\x87\x36\x6d\x50\x23\x31\x7d\xd8\xd3\x15\x09\x3f\x5d\x27\xd5\x5e\xfb\xec\x27\x36\xfa\x60\x58\xed\x52\x21\x3a\xbc\x72\x70\x6e\xb3\x75\x2b\x33\x53\x22\x82\x71\x17\xbe\xb9\xe3\x9c\xfc\x3a\x99\x45\x8c\x1b\x7b\xbf\x18\x21\xae\x48\x29\xad\xb1\x60\x2b\x7a\xb9\xe8\x6d\xd4\x9d\x78\x49\x8b\xc3\x61\x75\xe6\x7f\xa8\xd7\x3e\xd9\xea\xbb\x15\x3f\xef\xa7\xfc\x90\x53\x01\x7f\x4b\x2d\x83\x78\x4d\xba\xdf\xbd\xfc\xa3\xbe\xcc\x7b\xa0\x15\x69\x12\x18\x46\x62\x3e\x10\xf7\xaa\x85\x88\x97\xaa\x24\xca\x03\x34\xa8\x8d\xbc\xfc\x6f\x01\x40\x08\x31\x0c\x24\x30\x85\xd6\xf0\xef\xb9\xa8\x14\xc5\x15\x68\x97\xa1\x7e\x82\x2f\xb6\x3f\xe1\x27\xb8\x0c\xe5\x0a\x1d\x21\x74\xac\xe0\x19\x49\xa6\xb8\xca\xab\xb4\x96\xc8\xff\x0c\x47\xe9\x5d\xe1\xfd\x35\xdf\xe2\x78\x5e\xff\x23\xd1\x3d\x89\xdf\xda\x5d\xcd\x14\x5c\xab\xc6\x72\x27\x86\x3d\x32\x68\xbd\x52\x01\x20\x58\x5a\x9e\x1c\x2b\x6e\x08\xa4\xf4\xb3\x72\x16\xae\x15\xda\x56\x6f\x5b\x53\x99\x16\x2e\xa2\xb9\x08\x3b\x29\xb2\x3b\x19\x9b\xbc\xa7\xb2\xc2\x88\x28\xca\xa0\x33\x93\xcc\x64\xac\x90\x33\x2c\x17\x54\x43\x2b\x2d\x64\x8d\x96\x75\xcc\x44\x1c\x5d\xee\xa7\xfe\xf2\xf8\x0b\x11\xc1\x5d\x33\x27\xae\x7c\xe9\x1e\x26\x6f\x58\xb7\x81\xc9\xa3\x5f\xe0\x7b\x26\xb9\x1a\xe1\x21\x05\x70\xc4\x0c\x1b\xca\x2f\x17\x18\x31\xf4\x61\x84\x47\xf9\xda\x89\x27\x4d\x7d\xea\x3b\x38\xb2\x95\x32\xe9\x5c\x88\x0e\x66\xe3\x55\x5d\x8a\xa5\x2e\x1d\x2a\x76\xa1\x55\x19\x54\x39\xa5\xa5\x52\x56\xec\x0a\x3c\x6b\xe2\x27\x7b\x13\x45\x37\x47\x7c\xa7\x7a\xbc\x5e\x45\xe1\x34\x76\x92\xbf\x20\xbe\x43\x94\x72\xf4\x8a\x89\x41\x3c\x10\x28\x0d\xc7\xcc\x0f\x47\x26\xbc\xea\x5d\xe7\x76\x2d\x4f\xf0\x8a\x57\x55\x16\xa3\x87\xc7\x97\x7d\x53\x15\xba\x7a\x36\x1e\x74\x7b\x50\x7e\x44\x8b\x84\xf3\xa1\x06\xbf\x7d\x71\xab\x6c\x6b\xbf\x78\xfa\xd0\x45\x47\xef\xe9\xda\xea\xcc\x5d\xaa\x25\xae\x16\xb9\x9e\x1d\x72\x51\x26\x5a\x9e\x36\x1a\x7b\x78\xd6\x6c\xe3\xce\xf4\x7d\x65\x4d\x13\x3c\x4b\x78\xdb\x72\x89\x7a\x84\xec\xc3\x93\x81\xaf\xa9\x29\x23\xa4\x5d\xe0\x21\xcb\x65\x28\x53\xd2\xde\xed\xe1\x68\x2a\x94\x38\x50\x40\x9a\xc0\x82\xa9\x69\x80\xbe\x2b\xfa\x7e\x4a\x6a\xa1\x31\x64\x29\x7a\xf4\x6a\xa7\xc6\x16\x1d\x7e\xb8\xa5\xac\x91\xeb\x4b\x79\x41\x3c\x02\xf1\x13\xc4\xc4\x0b\x14\x2e\xec\x46\x9f\xee\xea\xea\x40\x88\x8e\xd9\xe1\x67\xcf\x0d\x7e\xdc\xf5\x8b\xaf\xe6\xa0\x85\x50\xa8\x39\xe3\x6c\xa5\xab\x1d\xb6\x66\x92\xe7\x71\x4a\x86\x68\x6f\x7d\x50\x38\x8e\xd6\x57\xd7\x60\x23\x42\x9c\x18\xf8\xc5\xb3\xb1\x46\xd8\x33\xc6\xe9\x94\xa4\x98\x0b\x42\x48\x1b\x2d\xb5\x54\x65\xc2\xc3\x01\x0f\x42\x22\xde\x41\xed\x17\xab\xbe\x4e\x8d\x41\xc2\xd1\x35\xf7\xc5\x0c\x09\x32\x9a\xc4\x30\x58\x3f\x2b\x8a\x30\x32\x91\x9e\xb0\x21\xc5\x74\x55\x23\x67\x42\x0b\xe1\xf2\xf1\xf2\x11\xe4\x38\xfc\x84\x31\x5b\xd1\xe8\xfb\xcd\x43\xe7\xcd\x6c\x20\xcf\x9e\x1f\x73\xcd\xca\x8c\xc8\x00\xd3\x0f\x0e\x32\xf8\xc8\x30\xc7\x5e\x57\x89\x9e\xc2\x75\x02\xc1\x8e\xb6\xbf\xc7\xfa\x6e\x0d\x69\x1c\xb8\x61\x6c\xb9\xd1\x5c\xf8\xd1\xef\x5b\x17\x91\x0e\x6e\x3a\x44\x8e\x15\x7b\x69\xc3\xa0\xc6\xe6\x5f\xa8\xc8\x86\x61\xe6\x3f\xc7\xe4\xff\x4c\x45\xe6\xc1\xdf\x54\xa4\xf9\x17\x15\x39\x30\xce\xaf\xa0\x0f\x28\x61\x32\x8c\xd2\xb0\x44\x92\x08\xc3\x22\x84\xa6\x71\x5a\xbd\x0b\x77\x91\x77\xbc\xdb\x83\x14\x66\x11\x33\xbd\x88\x85\x2d\x00\x5b\xf8\x2a\xee\x67\xa1\x62\x48\x41\x6c\x8c\x37\xb1\xaa\x3b\x02\x35\x81\x1e\x13\x08\x81\x92\x22\xd2\xb1\xc4\x16\x46\xcd\x6f\x8e\x35\xd6\xde\xd1\xee\xf7\x2d\xfb\x5f\x14\x55\x4e\x97\xdd\x2d\x6b\xfe\x04\x24\x2a\x38\xaf\xba\x7f\xdd\xf5\x93\x32\xff\x51\xf8\x4f\x07\x94\xf2\x16\xa6\x61\xe0\xb4\xca\x09\x9b\xf8\x57\xb9\x6e\xe0\xc7\x0d\xcb\xc7\xc1\x06\x2a\x4e\x48\x7b\x39\xc5\x8b\x07\xcd\x6d\x54\x93\x65\xb7\x76\x21\xba\x15\x31\x20\x8e\x06\x7e\xb6\xeb\x02\x2f\xe2\x15\xd6\x24\x05\x5b\x9d\x1d\xff\xc3\x42\xd2\x9e\xa6\xe4\xd5\x44\x25\x1b\x2c\x98\xb0\x8e\xed\xc3\x7e\x05\x0e\x60\x77\x46\xf9\x05\x87\xb8\x8e\x9b\x96\xf8\xb4\x92\x7d\xb2\xfe\x4a\x17\xfb\x60\xc3\xca\x16\xd7\x0b\xe5\x81\x40\x63\x73\x26\x9e\xdf\x9b\xae\x8b\xde\x52\x5d\x36\x19\x96\x42\xc1\x78\x34\xdd\x38\x2f\x00\x90\x45\x77\x60\xd5\x21\xd3\x8d\x99\x6e\x0f\x2e\xc5\x3e\xb1\xbe\x43\x27\x33\xb5\xd3\xaf\x05\x3b\x19\x2e\xd8\xab\x53\x67\xf6\x55\x5b\x32\x69\x28\xf8\x59\x7f\xa1\x90\x45\x04\xb8\xc4\x69\x58\xc7\x65\xa6\xad\x52\x34\x9f\x1f\x6e\x15\x7d\xe4\xc3\xab\xbd\x1a\x5d\x37\xe1\xad\x57\xeb\x75\xa9\xfb\x90\x5f\xd3\xe4\x32\x9a\x57\x14\xf9\xbb\x9f\x83\x39\x26\xf3\x1d\x92\x7a\x83\x33\x84\x87\xb4\x3c\x62\x1e\x46\xc9\x49\x15\xc7\xd5\x92\x6d\xa0\x43\x74\xb0\x63\x0b\x01\x6c\x2b\x3a\xbf\x68\xb0\x04\x7b\x82\x6d\xd7\x69\x31\x6d\x5f\xdb\x14\x73\x15\x57\xfc\xfb\xfe\xd9\xbf\x1c\x3d\x5c\xee\xb2\x18\x04\xbf\x0d\xac\xf7\xb8\x2e\xcd\x9e\xbc\xae\xb0\x96\xe3\xab\x16\x34\x0f\xdf\x1e\x52\xec\xd4\x17\x7f\x48\xc3\x55\x9f\xed\xe8\x52\x50\x24\x44\x2a\x23\x8b\xe8\x25\x58\x46\xa9\x1c\x9b\xe7\x0c\x20\x50\x05\x1d\xd2\x54\xf9\xc7\xcc\x43\xed\x56\x77\xed\x56\x99\x23\x93\xf4\xad\xc6\xad\x7f\xde\xe8\x07\x4a\x29\xfa\x4d\x9f\x8d\xa2\xad\xa0\x97\x38\x94\x27\x2c\x09\xee\xb0\x97\xd7\x0b\x2f\xf2\xba\xae\xde\x49\x55\xc7\xb6\xae\x2c\x18\xcb\x31\xfb\xdb\xb7\xe2\x64\xa4\x0d\xfe\x2d\xc0\x36\xed\x18\x27\xea\x92\xf2\x78\x70\xa7\x19\x4b\xf6\x35\x4b\xb4\x27\x5d\xb8\x45\xc6\x4e\xc0\x9b\xc5\x76\xd1\xd3\x1a\xf0\x95\xbc\x5d\x86\x04\xd4\x6d\x79\x6d\x33\x78\xec\x34\x84\x22\xab\x8a\x65\x1c\xec\xaa\x59\xc2\xba\x96\xdb\xd5\x33\xc8\x68\x1c\x40\x10\xd3\x29\xe9\x32\xa7\x1d\x75\xc8\x1a\x17\x9a\x0d\xe9\xf9\x4d\x25\x5b\xc2\x3d\xc5\xb1\xef\xdf\x8f\x48\x58\xc1\x5c\x83\xee\xd7\x59\x8c\x55\x60\x9c\x37\xed\x7a\x5b\xae\x64\x9b\x8d\xe4\xc8\x5a\x68\x5b\x13\xe4\x18\x2d\xe0\x98\x58\xe4\x68\x9e\xe8\x58\xa5\xe4\x28\x3b\x85\x5e\x78\x8a\x13\xef\xf1\x68\x89\x68\x1b\x0e\x68\x9b\x86\x60\x1b\x29\x25\xd9\x98\x21\x39\xc5\x73\x8e\xff\xd2\x03\x1b\xbf\x12\x6f\x69\x93\xfa\x30\xba\x78\xee\x50\x90\x22\x29\x90\x64\xf1\x54\x0a\x51\x8c\x95\x8e\x97\xb8\xd1\x9b\x24\xa9\x20\xbf\x4e\x57\x59\xb3\xf8\xb4\xb0\xb8\x47\xbb\x78\xcf\xb0\x78\x7e\x61\xf1\x3a\x20\xf5\x58\xb6\x06\x35\xcf\xa0\x41\x05\x00\xd4\xa3\x7e\x7d\xfd\x34\x68\x3b\x85\x07\xfb\x1a\x68\x02\x37\xae\x7d\xfb\x95\xea\xfe\x55\x62\x5c\x1f\x66\xf1\x95\x26\xa5\x97\x2c\xa7\x57\x2a\x8a\x1e\x62\xab\x97\xa2\xa7\x97\xe6\xbb\x55\xec\x77\x1d\xac\xb6\x95\xea\xba\x95\x62\xb6\x95\x26\x91\x97\xac\x94\x57\x0a\x40\x1e\xe5\x98\x97\x62\x94\x97\x26\x22\x46\xa7\xec\x5d\x2d\x6f\x83\xa3\xb7\xc1\xde\x3a\x1b\x4b\xb0\x35\x4b\xb8\xf6\x5b\xb8\x1e\xa2\x45\x86\xda\x51\x8e\xa7\x4d\x8f\x73\xed\x13\x3f\x8b\x8e\x16\x47\x81\xc1\xaf\x0b\x34\xea\x45\x4a\xea\x56\x4a\xea\xd1\x2a\xea\x79\xcb\x35\xd8\x6c\x64\x85\x02\x19\xd6\x66\x44\x0e\x3d\xd2\x9a\x5c\xe5\x47\x47\x8b\x3e\x45\x9b\x0b\xd5\xc1\x7b\x1b\xd4\xcb\x19\xd4\xdb\x1b\xd4\xc7\xc7\xc5\x92\x19\xd4\x8d\x1b\xd4\xe2\xe3\x40\xb8\x01\x16\x91\x37\x52\x29\x28\x53\x19\xac\x11\xfb\x0b\x23\x57\xcf\x24\x50\x8e\xba\xf0\xf8\xa9\x8f\x8d\x44\x73\x46\x9f\x90\x2e\xdb\x08\x4f\xea\xbf\x9c\x3a\x8d\xf4\x55\x90\xd7\x04\x5e\x9a\x8f\x25\x3d\xf7\x3c\x57\xe2\x9f\xb5\xd7\x34\xa0\xb7\x2b\x37\x43\x92\x18\x9b\xfb\xfe\x97\x61\x39\x53\xfa\x40\x9e\x83\xd0\x02\xbe\xba\xf5\xda\xd9\xe9\x50\x39\x5b\x8a\x7c\x26\x0b\x84\xd5\x0d\x7d\x7f\xc8\x06\xa6\x80\x1c\x52\x55\xb4\xdb\xb5\x40\xe1\x9b\xde\xb3\x7f\xd9\x5d\xbc\xce\x8f\xca\xc3\x04\x1b\x72\x97\x36\x12\x03\x81\x5e\x7a\x84\x24\xbc\x7a\x06\x28\x38\xc6\x92\x78\x78\x83\x46\x7a\x98\x40\x95\x08\xbc\xf1\xfd\x97\xb8\xdd\x6c\xa9\x88\xc6\xc3\x87\x95\x75\xee\xb8\xa4\x1a\xeb\x4a\x79\x4f\x7c\x4e\x29\x9b\xd6\xcf\x20\x2d\xbe\xa7\xc7\x1f\x84\xba\x37\xaf\x2f\x06\x9c\x36\x7a\xfd\xce\x95\xee\x8d\x07\x2f\xcf\x3b\x85\x46\xf9\xa2\x79\xe9\xb2\x57\xb9\x3a\x46\x09\x04\x98\x02\x46\x19\xf8\x5a\x3b\x1f\x64\x5b\xf5\x1b\x6a\x69\x9f\x83\x32\x42\x49\x41\x12\x88\x97\x65\xad\x42\x40\x98\xbc\x51\x1f\xfb\x1d\xb7\x12\xb9\x5f\x8e\x40\xdb\x19\x8c\xd0\xe3\x24\x7b\x2e\xfa\xd1\x34\xb2\xd8\xfe\x82\x23\x95\x25\xfe\x22\x3c\x57\xf6\xc8\x9a\x36\x39\xce\xf6\x35\xda\xe1\xfc\x60\x37\xd9\x48\x4b\xdc\x0e\xa5\x79\x4b\xbb\x0e\x8a\x65\x6a\xcf\xed\x15\x75\xcb\x2c\x6b\x01\x64\xb4\xcc\xe7\xce\xec\x2e\xc7\x80\xe4\xf3\x7f\xca\x05\x21\x91\xa8\x78\xb4\xd8\x8d\x7b\xf9\x74\xbf\xa2\xd4\x6e\x84\xf5\xcb\xb6\x1b\x54\xf3\x6d\xe6\xb5\xff\x3d\xef\x8a\x24\xfb\x40\xbd\x38\x2a\x7a\x76\x7d\x2e\x48\xe4\x9a\x35\x9a\x12\xfe\xaf\x99\x5c\xd0\x51\xf5\xad\x84\x48\x9d\x01\x50\xc4\x30\xaf\x33\x83\xa7\x21\x02\x3a\xd7\x28\x3a\x25\x6b\xc9\x4e\x3d\xcb\x3c\x81\x59\x5c\xcc\xb9\xe2\x4a\xa6\x6b\x95\xc9\x72\x38\x5e\xe1\xcf\x71\x87\x21\xa3\x7d\xa3\xbb\x78\x2b\xed\xaf\x55\x5e\xb3\x8b\x01\x47\x7a\x16\xa8\xe0\xd9\xdb\x78\x9d\x20\x97\xca\xb6\x34\xfb\xfe\x35\xc6\x96\x95\xd4\x03\xb7\xd8\x06\x57\xb8\xfb\x31\x3b\x4e\xbf\x91\x3e\xde\x6f\x83\x57\x6e\x63\xea\x0d\x74\x39\x94\x9d\x7d\xc7\x74\x2c\xcc\x71\xbe\x8f\xc6\x95\x74\x99\x9d\x3d\xb3\x55\x50\x4b\x7b\xa1\x04\x16\x24\x2a\x76\xff\x3c\x8f\x1d\xbc\x8b\xaa\x0a\x2b\xfc\x54\x95\x65\x77\xfc\x34\x1b\xdc\x94\xb3\xbb\x6e\xc1\xd2\x31\x75\x12\x4a\x46\x76\xa9\xcd\x8d\x1b\x76\x9e\xc3\x4e\xc6\xc6\x0a\x35\xfa\x67\xf8\x0c\xdb\x84\x9e\xfe\xe4\xd4\xff\xef\x7f\xcd\x42\x62\xff\x8f\x59\xc8\xf8\xfe\x9b\x85\x9c\x2d\xe6\xff\x8c\x85\xd4\xfc\x5c\x17\xfe\xb7\x59\xc8\xfa\x1f\x2c\x24\xf0\xab\x63\xf7\x3f\x58\x48\xf3\xdf\xb3\x90\xc1\x5f\xe3\x35\xff\x60\x21\xd7\x0c\x05\xfe\x83\x85\xcc\x9c\x7f\xcb\x42\x0a\xff\xca\x42\x96\x14\xfb\x22\x7f\xb3\x90\x0f\xf3\xef\x59\xc8\xfb\xdf\xb2\x90\xbf\x3f\x8b\xe6\x7b\x86\x91\x20\x6a\x37\xa5\xd7\x8c\xfe\x66\x21\x37\xe6\x5f\x59\xc8\x0c\x4b\xe4\xff\x60\x21\xaf\xe6\x5f\x58\xc8\x4a\xf8\x17\x16\x52\xff\x8b\x5d\xfc\xeb\x26\x6c\x3f\xdb\xa7\x06\xb7\xc7\xbf\x59\x48\x64\xfe\x33\x7d\xfe\x0f\x16\xf2\x0d\xc3\x3a\xfb\x9b\x85\x0c\xd8\xe6\x5f\x59\x48\x97\xf9\xe1\x7f\xb3\x90\x8e\xf5\x97\xe2\xf8\xe7\x55\x99\xbd\x0e\x64\x92\x37\xfd\xcd\x42\xfe\x35\xd3\x7f\xcd\x42\xfe\x59\xff\xbf\x61\x21\x89\x7f\x65\x21\x25\xf8\x3f\xb3\x90\x9c\x97\x9c\xff\x15\x0b\x69\x1d\xff\xb7\x59\x48\x3d\x17\xc3\x50\x1c\x50\xb2\xb6\xf0\x0d\xbd\x8d\x7d\x89\x5f\x21\x68\xfa\x5f\xc0\xfc\xa2\x5f\xc7\xb5\x9c\x66\x3e\xe3\xb0\x28\xee\x33\xee\x2c\x03\x25\x66\x82\xd5\xbd\x41\x07\xa9\x96\x4b\xaf\x54\x04\x5f\xd0\xad\x8f\x2a\x69\xa9\xa0\x3b\xc6\xb1\x34\x6c\xe0\x8b\x6b\xff\xab\x38\x9b\x50\x94\xba\x51\x85\xf6\x16\x34\x44\xa7\x19\x6f\xce\x14\x6a\x81\xd1\x18\xaa\x0b\xe1\x22\xd3\xf3\xd1\x42\xb4\x46\xad\xba\x2e\x76\xb0\xac\x70\x00\xfd\x14\x86\xf7\x24\x65\x5e\x7a\x63\x5d\xc7\x61\x0e\x6e\x53\xe2\x0d\xc5\x1f\x64\x4c\x62\xa7\xda\x8a\xcf\xa9\x9f\xc7\xf8\xe8\x50\xf7\x0d\xbe\x05\xfa\xca\x1b\x9f\x1a\x10\x9f\x4d\x15\x73\xf7\x2a\xfc\xb2\xda\xe5\xa5\x24\xdb\x1e\x44\x49\xb2\xf1\xd1\x6d\x76\xde\x21\x31\x18\x32\x81\x67\x7e\x84\x3f\x39\x1d\xf6\x04\x32\x54\xa9\x59\xf1\x5b\x99\x39\x7f\x59\xcc\xdf\x1d\x0d\x54\x54\x8f\x35\xcc\x5b\xc2\xa9\x9e\xc9\x02\x43\xb2\xf3\xf6\x53\x10\x01\xc9\x19\x12\xfd\x5d\xa7\x8b\xbf\x35\xa5\x9e\xa0\x42\x8e\x04\x3d\x21\x2c\xb3\x80\x14\xc8\x81\x40\x59\x62\x91\x75\x71\xe6\x51\x05\x35\xf2\x3b\x7a\x4a\xa1\xd0\xdf\x1d\xb3\xdb\x4f\xb7\x6a\xcc\x02\x2d\x4e\x84\x91\xf6\xe2\xbf\x5d\x11\x53\xe3\xd7\x71\x3e\x43\x4f\x47\x9f\x38\xec\x2f\x12\x1e\x27\x12\x6e\xb8\xe3\x30\xb0\x14\x1a\x5b\x14\xb8\x5f\xe1\xb3\xe9\x8f\x11\x79\x0d\x15\xe0\x71\x71\x13\xb7\xd1\x2a\x72\xfa\x98\x42\xf9\xb0\xf7\x9a\x6d\x5a\x74\x2e\xc6\x53\xe2\x36\x35\xe4\x36\x2e\xe4\xb6\x2e\xcc\x9f\x5d\xc9\x0f\xc7\xda\x6d\xc0\xd9\x4c\x2a\x54\xcc\xdc\x17\x0a\xea\x32\xf3\xd4\x0a\x6a\x44\x3e\xd5\x29\xfe\xd4\x45\x4b\x95\x56\x14\xd6\x47\x54\x4d\x7d\x51\x1c\xaa\x57\x43\xb3\x00\xa0\x27\x34\xfa\xdb\xee\x2c\x4d\x30\x61\xf4\x92\xac\xce\x22\x33\x22\x21\x0a\x92\x5e\x9b\x9e\x1b\x58\x51\xd4\xb4\xcc\x93\x8c\xac\x2f\x44\x0a\x35\x82\x70\xee\x1b\xae\xf3\x7c\xc7\xe3\xef\xea\xe9\x37\x2b\x7f\x1d\x8d\x72\x7f\x51\x01\x62\x3e\xc0\x81\x93\x0d\xc1\xfd\xae\x8a\x4a\xe2\x9a\x6e\x63\x55\x8a\xc8\x27\x3e\x1b\xb7\x95\x67\x09\xe2\xdc\xb0\x79\x2b\x68\x90\x30\xc7\x89\xbb\x7a\xae\x5a\xea\x89\xbf\x7a\x4f\x03\x75\x5d\x19\xe8\xb7\xda\x4a\xd9\xe4\x30\x72\xcb\xdc\x80\x7a\x6a\x94\x64\x20\x3a\x94\xdf\xd8\x97\x5c\xf1\x25\x77\x66\x4b\x5b\x94\x65\x20\x7a\x0f\x92\xde\x04\xf6\x44\x48\x61\x83\xfb\x4d\x6f\xac\x47\x9c\xe4\x6e\x96\x34\x54\xf7\x31\x9a\x29\x04\xca\xc6\xc7\xb8\x63\xca\x63\x11\xa6\x01\xf3\x8d\xc3\xc9\x2b\xce\xe7\xe3\xeb\x14\x03\x16\x0f\x77\x53\x37\x30\x23\x06\x21\x0f\x11\xd5\x86\x11\x25\xc2\x51\xde\x51\x1b\xdd\xf6\x5b\x99\x3a\xa4\x95\x09\xd3\x8a\x75\x97\x9e\x4c\xd6\x40\x0e\xf1\x07\x08\x79\xb0\x57\x58\x05\xab\x75\x44\x8c\xe4\xef\xe2\xc9\xfc\xf0\x56\x85\x96\xf1\x97\xbf\x5e\x35\x96\xf6\xf1\xad\x6c\xdc\x87\xf2\x18\xc8\x01\xb2\x39\x41\xbe\x01\x04\x1e\x0b\xec\xc9\x47\x3c\x0b\x17\xcd\xa4\xb4\x17\x90\xc4\x95\x4e\x7e\xcf\xef\x69\x83\xb5\x4d\x05\x33\x12\x6f\x3e\x12\x1f\xbd\x12\x6f\xb9\x12\x9e\xfe\x6e\xe7\x56\x8d\x0a\x81\x18\xd8\x90\x81\x25\x38\xe2\x1d\xa7\xf1\x13\x87\x71\xb3\xac\x14\xb5\x16\x4e\xb3\xc3\xd4\xda\xd2\x0f\x30\x57\x6c\x0a\xb5\xbd\x09\x4e\x39\x6b\x2e\x01\x7c\x97\xe3\xe8\xc5\xaf\x37\xa4\xaf\x89\xde\x3e\xb4\x18\x55\x83\xa0\x94\xb4\xb6\x79\x3d\x27\xfc\xea\x84\xf7\x2d\xc5\xd7\x67\xbf\x76\x9d\x25\xd9\x57\x34\xeb\xbc\x3c\x20\x97\xf0\x61\xd5\xc5\x3f\x4d\x15\xea\x84\x1e\xd6\x06\x04\xff\xbc\x0f\xe9\x8a\x2c\x74\xad\x19\x5a\x96\x50\xab\x02\x79\xdc\xa9\xf0\x2a\x36\x57\xc6\x4b\x97\x16\x08\x38\xfb\x54\xd7\x6d\x16\x18\x59\x0b\xad\x8c\xae\xb0\x46\xb2\xd8\x78\xdd\xb6\x87\x4e\xaa\xef\x74\xf5\x27\x82\xc1\x21\x46\x3b\xce\x79\x46\xac\x3c\xe8\x83\xd3\xd5\x10\x3c\xf7\x38\xee\x30\x19\x19\xd9\x9b\x74\x59\xe4\xf4\x2b\xc8\x60\x33\xda\x73\x3e\xa1\xa8\xc4\xd3\xb9\x10\xf6\xf4\x0c\x44\x77\x1a\x5a\xe5\xb8\x87\xa3\x85\x5c\xc9\x91\x62\xfc\x75\xe3\x70\x49\x73\x72\x0e\x5c\xf6\x71\x7f\x6d\x3b\x46\x6b\x8a\x99\x15\x32\x48\xda\x4d\x44\x50\x4b\x4f\xb5\xbe\x06\x43\x36\x80\x9a\x7f\x38\xd1\xa0\xca\xf9\x58\x83\xc7\x3e\x3c\xd1\xcb\x59\xaf\x77\xe4\x8a\x35\xf4\xd7\x88\x78\x7a\xae\xc6\x07\xb5\xe4\x7b\xdf\xd0\xfd\xf4\xbc\xc1\x0d\x6a\x61\xcd\xed\xe0\xdb\x4f\x9d\x6f\xce\xc1\x18\x13\x23\xcc\xdc\x30\x9e\xe5\x5c\xc7\x1b\xfe\x27\x45\xe3\x7b\x78\x49\x16\x65\xd2\x59\x92\x45\x2e\x65\x39\x1b\x65\xee\x59\x14\xbb\x71\x03\x19\x7b\x59\x73\x14\xa1\xd1\xb8\x96\x46\x4b\x0f\x7b\xb4\x43\xc8\x4e\xd9\xbb\xa9\x5f\xa6\x7c\x98\x23\xd2\x23\xb2\x15\x69\xd6\x88\x53\x7b\x2e\xb1\x24\x22\x29\xe4\xad\xe6\x69\x12\x67\x81\x1c\x19\xd7\xc1\xda\x07\x9e\xe7\x59\x3c\x0e\x1b\x19\xc7\x08\x3b\x9d\xfa\x55\xd8\x11\x92\x83\x79\x05\xc0\x34\xbd\x80\x48\x4c\xe6\x2e\xb8\x17\x40\x96\x5e\x07\x7b\x9d\x5c\x5d\x84\x23\xe9\x5e\x88\x5c\x9f\x15\x1a\xed\x36\x22\xd8\x08\x87\x5e\x06\x38\xb2\x60\xb9\x27\xe1\x29\x12\xe7\xc3\xc0\x90\x43\x3f\xb7\x49\xaf\x66\xe9\x56\xb8\x4d\xfe\x34\x93\x0a\xcd\xb2\xb4\x4b\x5f\xae\xfc\x93\x42\xcd\xe2\xbe\x4a\x34\x22\xd4\x08\xc0\xa3\x53\xa8\x0b\x6d\xab\xa5\x2d\xb6\x37\xd4\xcb\xd0\x27\x82\x61\x84\x86\xf3\x7c\xa9\xc9\xdb\x82\x3f\x96\x86\x7f\x34\x1e\x93\xf0\x85\xce\xfe\xb4\x4d\x10\x49\x2a\x34\x68\x0d\xf5\xda\x5c\xf4\x13\x02\x93\x0a\x36\x3a\x68\x86\xd7\x9e\xda\xd4\x67\x53\x74\x8d\x8f\x36\xbd\x5f\x94\x72\x51\x76\x4c\xa4\x35\xcd\xa0\x80\x50\xd3\xd9\x06\x46\x36\x10\xe6\xa0\x94\xd7\xc4\x56\xe3\x72\x4c\x4c\x28\x80\xa2\x00\x9f\xd7\x64\x77\x51\x42\x0c\x16\xe0\xe3\x34\x9c\xa2\x54\x36\x8b\xc2\x69\x6b\xe2\x6d\xac\x0d\xc5\x16\xbe\x09\xe5\x26\x9b\xf9\xee\xd3\x18\x6b\xda\x63\x50\x61\x3e\x70\x55\xaa\xbf\xe8\xab\x20\x0d\x1d\x9d\x61\x86\x7b\xf2\x28\x63\xa3\xb7\x0d\xef\x2f\xd6\xfa\xd7\x94\xae\x5a\xfb\xf0\x23\xf4\x8f\xe1\x6d\x6d\x61\xa2\xc9\x62\x9e\x60\xde\xd4\xce\x60\xc0\x17\x59\x95\x80\x82\x46\xcc\xab\x4f\xf1\x7a\x3b\xc7\x30\x00\x05\xc4\x82\x81\x6d\xbf\x97\xf6\xb8\xc2\x01\xa7\x7e\x63\x18\xc9\xfa\x95\x51\xb8\x5f\x87\x22\x99\x0e\x95\x61\xac\x26\x12\x66\x78\x28\x8f\xd6\x07\x26\xc8\x8c\x8e\xd9\xb1\x97\xd8\xbb\xbc\x2d\xaa\xd1\x51\x95\x20\xc5\xb1\xd2\x17\x86\x3e\xe0\x64\x94\xfb\xde\x09\xf0\x5b\x23\xb2\x31\x59\xb0\xec\xab\xd5\x7c\x85\x28\xe8\x6d\x87\x53\xd8\x6b\x8e\x6c\x82\x3f\x62\x6f\x43\x20\x7e\x1f\x02\xb9\x4d\x75\xd1\x62\x77\x23\x52\x0a\xc8\x3e\x6e\x3d\x56\x94\xd9\x67\x4f\x2a\xfa\xb9\xa8\x95\xc1\x31\x19\xe9\xdd\x3a\xa0\xcb\x27\xd9\x83\x4f\x82\x45\x67\xc1\xbe\x6f\x45\xda\x77\x44\xf2\xa1\xd6\xf0\x97\x5a\x12\x78\xad\x39\x9c\x64\xa0\xe7\x12\xd7\xb3\x4d\x3e\x1d\xa2\x74\x74\x16\xa0\x2b\x3c\xfa\x76\xe0\x1a\xed\x00\x90\x77\x36\xbf\xc3\x5e\xbf\x6d\xe9\x20\xd0\x59\x14\x77\xc4\xe6\xb9\x27\xab\x3a\xb8\xba\x18\x21\xd0\x9b\x16\x91\xec\x06\x96\x2b\x90\xdf\xe3\x48\x0d\xed\x0c\x76\x62\x56\x71\x9a\x8e\x2d\x84\x34\xf3\x75\x83\x4d\xa2\x2b\x27\x7d\x20\x26\x46\x07\xe2\x6f\x48\xb5\xc8\xcb\xf1\xb7\xb0\x68\x34\x45\x29\xae\x4c\x9f\xb5\x58\xc0\xd2\xa3\x4c\x3c\xfc\xd6\x47\x38\x60\x5b\xde\x3a\x24\x8b\x7d\x8e\x48\x9c\x1a\x93\x23\xba\xd5\x92\x8f\x77\xab\xe7\x17\x54\xf5\xf9\xe4\x18\xdd\xfa\x10\x4d\x1c\x2f\x4d\x27\x78\xb6\xa9\x08\xc9\x83\x97\x25\xda\xd9\x4f\x5a\x95\x6b\x1b\xb5\x9a\xa0\x4a\xcb\xc4\xd1\xba\x8e\x12\x67\x29\x37\x9d\x25\xed\xed\x8b\xf4\x78\xdc\x01\x12\x79\x38\xfa\x4a\xe0\xc9\x85\x41\x9e\x2e\xb3\x97\x02\x61\xb5\xa2\xc1\x90\x94\x89\x6b\xef\x2d\xe0\x37\x20\xd8\xe0\x57\xc4\x4c\x74\x71\x04\x04\x6b\xcd\x15\x55\x47\x1a\x3e\x0f\x69\x3a\x7d\xb8\x11\x39\xd4\xbd\x6c\xc3\xa7\xd8\xf3\x5c\xa4\x84\x7a\xc1\x1c\xb8\x95\x1f\xe5\xef\xa0\xe1\xf7\xd7\xe5\x9a\x49\xd0\x3a\xe0\x9d\x3a\x50\x9c\x1b\xe4\x1c\x2e\x4d\x47\x64\x85\x87\xf6\xda\xee\xe9\x9d\x91\x02\xf1\x86\xb7\x88\x6a\x04\x1e\x80\xf0\xfa\xc1\xa1\x7f\xf2\x36\xa8\xd0\x07\x20\x22\x5e\x30\xb2\xa2\xb0\x64\xc6\xa1\xfa\xd5\x14\x97\x50\x46\xd3\x03\x4e\x43\xff\xfc\x0c\xc9\x70\x0d\x53\x30\x2c\xc6\x30\x81\x2b\xf9\xa2\xf3\xa7\x6f\xfe\x47\x93\x68\x83\xe0\x7f\xfe\x0d\x97\xbe\x29\xf8\x71\xb7\xb1\x31\xf7\xe1\x8b\xa2\x21\x33\xb7\xc5\x98\xb3\x3b\x75\x92\xe0\x24\x5f\xc2\x52\x6c\x97\x48\x96\xc4\x4e\x0e\xa3\xfd\xd0\x53\x04\x78\x06\x33\xb8\x75\x01\x47\x2d\x06\xa5\xcf\xb8\x0d\x95\xee\x61\x51\x6c\x12\xb5\x31\xfa\xd1\x6c\xd3\x70\xb6\x17\xd6\x49\x46\x86\xbf\x73\x67\x85\xff\x8a\x89\x5b\xe4\x47\x21\x67\x05\xee\x27\xd5\x20\x80\xd6\xae\xb0\x8a\x76\xfc\x27\x14\xfb\xee\xaa\x04\x6e\x9d\x0d\xaf\x4e\x04\x9b\x39\xbe\x1b\xdd\x67\xc4\xc3\xf2\x6e\xa8\x2b\x53\xeb\x75\x92\x6b\xfa\x01\x99\xe4\xe4\xd6\xc0\x09\xf6\x02\x1f\x1e\xe6\x64\x73\x97\x0f\x5c\x1a\x06\xf5\x62\xc5\x98\x57\x05\x8d\x7f\xdf\xf2\x4d\x93\x3c\x56\xe8\x43\xdf\x73\xb5\xeb\x4e\xec\xd9\xa1\xb5\xa6\x96\x55\x9d\xc1\xfa\xc9\x6a\xf2\xf1\x5d\x22\x05\x85\xb2\x13\xe4\xa1\x2a\x02\x85\x40\x10\x97\x54\x42\xcb\xf1\xaa\x70\x4b\x1e\x7e\xf7\x5e\xb6\xf6\x1e\x91\x1a\x83\xfb\xa9\x3d\xa4\x2c\xfd\x4f\xe9\xe0\xf8\x37\x5c\x72\xa5\x1a\x33\x90\x6f\x55\xe2\x53\xd8\x35\xe4\x4d\x98\xdd\x61\x36\xa7\xb9\xd5\x6e\x92\x18\x9d\x53\x5c\xe3\x3f\x10\xf7\xbd\x81\xfe\x51\x91\x29\x1f\xab\x9d\x55\x56\x0a\x08\x0b\x68\x14\xc1\xb8\xa7\xca\xac\xa5\xca\x28\xa5\xca\x80\xa4\xca\xc6\xe6\x2a\x6b\x8e\xd7\x31\x50\x69\xbe\xc5\xa8\x92\xf3\x72\xfe\x15\x40\x94\x38\x61\xe2\x84\x99\x12\xa0\xe7\x3c\xd4\xa9\x1e\xa1\x70\xa0\xd3\xee\x47\x87\x1e\xbc\xc2\x39\xec\xf1\xd1\xf6\x23\x16\xd5\xcc\x66\x29\xcc\xc0\x15\xe6\xc3\x70\x45\x96\xe0\xc8\x16\x6f\xc8\x16\x6e\xc8\xfa\x6f\x1d\xbc\x92\x90\x3f\x7f\x2c\xa3\x94\xb6\x11\x7f\xa6\x1f\x17\x33\x7e\xe8\x63\x36\x32\x72\xa1\xbb\x3d\x25\xd7\x89\x5f\x25\x61\x77\x19\x95\x4f\x1d\xa5\x54\x4e\x49\x0d\x65\x7c\x21\x13\x3e\xe2\x98\x85\xdb\x4d\x07\xef\xc2\x0c\x5e\x36\xa0\x94\x12\x0c\xf5\x71\x2c\x87\x08\x39\x75\x4d\xeb\xd6\x15\x60\xb1\xba\x0e\x7e\xb3\xef\x82\x04\xd6\x53\x4c\x53\x7b\x9d\x7d\x1b\x8a\x32\xfc\x26\x5b\x68\x27\x79\x5e\xd4\x51\xc0\x7a\x99\x3d\xf9\xd6\xe3\x3c\x4d\xd3\xd4\xc4\x69\x9f\x87\x15\x6d\x66\xee\x8d\xd4\xfd\xa9\x3c\x57\xa5\x42\x72\xf7\xbf\xd0\x95\xfa\x20\x21\xe6\x67\xe0\xd9\x65\x34\xe0\xe2\xe9\x8d\x14\x53\x7d\xc9\xf1\x7a\x7c\xe2\x42\x2d\x79\x26\x77\xe8\x7b\xca\x34\xd2\x45\xd6\x73\x2b\xb9\x07\x74\x32\xd2\x5b\xd0\xa3\xc2\x6d\xfd\x70\xae\x00\xef\x1d\x1a\x29\xd8\x53\x2c\x04\xc0\x1b\x47\xf6\xe5\x68\xf9\x49\x2a\x20\xdc\xf5\xdd\x26\x9e\xac\xa0\x18\xc2\xd0\xfd\x7a\x77\x3e\x8b\x24\xd6\x61\x59\x0b\x09\xfa\x0b\x44\x1b\xee\x69\x3e\x31\xc7\x35\x24\xc7\x35\xab\x73\x37\xda\x0e\x17\x75\x73\x8b\xdd\x8f\xaf\xde\xa2\xcc\x26\xe3\xf4\xc3\xc8\x30\xff\xc5\xcf\x4b\x39\x3c\x92\x47\xe5\xd0\xa5\x1e\x92\xab\x42\x66\x47\x74\x67\x19\xd5\x8d\xa9\xe2\xf7\x49\xde\xe0\x9e\x8d\xd2\x9e\x9a\x89\xca\x2b\xbb\x0c\x8d\x5b\xf2\xa0\x5c\xa6\xd8\x5a\x24\x85\xf7\x76\x39\xbc\xa7\x2e\x4d\x5a\x06\xcb\xc6\xc1\x45\x5a\x85\xea\x5e\x71\x94\x04\x3d\xfe\xf4\x47\x45\x8c\xd3\xfa\xf8\xdb\x27\x44\xe8\x97\x68\x32\x91\xd5\x14\x55\xf7\x06\xb2\x12\x7f\x31\xae\x3c\xc3\x2c\x1a\x6b\x28\xf7\xaf\x93\x7a\x9a\xb9\x6d\x3f\x6f\xd3\x88\x9d\x73\x50\x29\x3e\x0f\xc4\x90\xb4\xbc\x40\xf0\x9e\x3c\xd5\xab\x79\x70\x00\x69\x40\xe1\x31\x06\xd9\x29\x73\x9f\xba\x6c\x0b\xd3\xa5\xa4\x4d\x49\x54\x23\x2a\xf5\x8c\x3c\x8a\x7e\xae\x47\x95\xc6\xa4\xe5\xee\xab\x39\x41\xd3\x08\xbc\x93\x6c\x87\xb3\xcd\x58\xf4\x1e\x6c\x96\x05\x98\x57\x17\xe2\x79\x88\x74\x0c\x72\x57\x15\xeb\x59\x01\x34\x68\x3d\x6c\x97\x44\xf7\x63\x93\x78\x15\x7d\x38\x35\x6d\x91\xc6\xf9\x99\xd7\x88\x0e\x9d\xb1\x38\x4d\x42\x23\x17\x2b\x28\x3b\xea\x47\xd2\xb0\x14\xf3\x81\x6e\xe6\x02\x1b\xd1\xe7\xf8\xbf\x63\x6c\x4f\x00\x77\x56\x57\x06\x61\x69\x83\xa5\xf9\x15\xd0\x4d\x7e\xab\x4e\x61\x0c\xff\x25\x10\xde\xb4\x6f\xe7\x28\x7e\x01\x2e\x28\xc7\x03\x6b\x5a\x2e\x2c\x84\x48\x94\xc6\x61\xc7\x51\x67\x8e\x17\x5c\x2e\x21\xf7\x8b\xa9\xda\x0a\xf4\xc6\xd9\x60\x10\xa1\x3e\xf1\x30\x63\x98\xa3\xbb\x75\x14\x6f\x56\x0d\x92\xc1\xd1\x98\x9f\x30\x91\x52\xeb\xa7\x1d\x1f\xca\xcd\x98\x25\x20\x54\x18\x00\x18\xd6\x8e\x78\x8d\x8b\xd4\x80\xdb\x5c\x27\x7d\x76\x6f\x0b\xe8\xda\x9a\x8d\x43\xcc\xca\x2b\x3a\xaf\x1c\x8a\xc9\xf4\x83\x8c\x1e\x98\xce\xcc\xb9\xe3\x21\x5c\xe9\xb7\x16\x9b\xc2\xeb\x45\x0e\x6a\x70\xe2\x99\xa7\x5b\x8c\xf2\x3a\x58\xf1\x7a\xbb\x72\xed\xee\x30\x99\xf0\xc7\x4a\x57\x9e\x78\xdd\xd7\xe8\x50\x1b\xb2\x6b\x38\x51\x30\x4b\xcc\xed\x98\x19\x2c\x6f\xa7\xce\xae\x14\x47\x6f\x13\x70\x06\x09\x57\xf3\xbe\x4c\xc5\x89\x43\x4a\x13\xdc\x6d\x6d\x11\x5a\xcf\xd9\xdb\xca\x3b\x7d\x4a\x59\xdf\x07\x5f\x6f\x2c\xde\xe9\x16\xd5\x20\x0d\xe6\x96\xa8\x9b\xc1\x32\xb8\x57\x96\xd9\x4f\xe6\xe2\x14\xbe\xa5\xab\xf8\xdc\x26\x6f\xa6\xaa\xf9\xf9\x6c\xe3\x6d\xed\x1c\x57\x70\xb8\xa5\x18\x7b\x13\x27\xb6\x83\xc3\x49\x5e\x57\x80\x0e\x1b\xa4\x92\x67\x62\x0e\xdf\x2d\xc8\xc5\xac\xf5\x50\x5a\x84\x30\x74\x35\xaf\x5e\x40\x1b\xd7\x2c\x46\xa9\xc3\x42\x29\x79\xd0\xa8\x36\x89\x15\x09\xb8\x1f\x49\x61\x42\x43\x76\x7e\x55\xad\x03\x35\x12\xcc\x5e\x9b\xaf\xe9\xc9\x40\x51\xe2\x8e\xae\x22\x2b\x66\xa5\x27\x96\xab\x21\xfe\xa0\x2c\x68\x19\xcd\x49\x2a\x6a\x25\xef\xc2\xd1\x67\x96\xaf\xd5\x99\xcd\x4c\xb6\x63\xef\xec\xe9\x92\xce\x6a\x03\x4e\x8a\x3a\x46\x6f\x60\x7c\x8e\x5a\xa9\x99\x33\xc7\xfc\xb3\x87\x98\x5a\x26\x23\x05\x22\x62\xc6\x22\x1d\xaf\x77\x3c\x50\x16\x06\x97\x0e\x1e\xea\x6a\x8c\xd3\x60\xf8\xc0\x88\xdf\xc0\x86\xb0\x1d\x02\x5f\x30\x56\xb1\x8d\xd8\x89\x77\x76\x5c\x93\x81\xb5\x1e\x49\x79\x32\xc0\x5b\x2a\x8f\xb7\xce\xda\x7b\x64\x00\xa6\xad\xff\x43\xba\x52\x3d\x37\x3d\x1d\xeb\x4f\xd8\x77\x02\x11\x36\xe8\x62\xdc\xb8\x89\x0a\xce\x15\x35\x1e\xfc\x62\x83\x6c\xd1\x90\x71\x22\x83\x8f\x4c\x43\x19\xf6\x4a\x72\xcb\x7c\x19\xa7\x35\x9a\xa1\x45\xf9\x52\x6f\xf0\xa3\xfa\xb7\x06\x9b\xd6\x79\xcc\x4d\x17\xf6\x4d\x08\x9b\xb3\x74\x60\x81\xfa\x81\xa9\x24\x06\x8c\x20\x12\x55\x49\x85\x1f\x97\x3b\xf1\x75\x9e\xa9\x90\xc9\x33\xbe\xb2\x3a\xb8\xfb\xbe\x3c\xc2\x34\xf4\x55\x10\x4b\x19\x1e\x19\xeb\xb7\xb1\x54\x6c\x84\xe9\xd0\x97\xe1\x24\x99\xcb\x9a\xb7\x32\xee\x1a\x2b\x39\xc6\xf8\xa2\x6c\x64\xc4\x13\x5d\xca\xd5\xd7\xc0\x9c\x6e\xe2\x8d\x5a\x6a\x92\x0d\x07\xe8\x0e\xc9\x91\x43\x2a\x96\xb8\x01\xcb\xd9\x89\xfb\x7e\x5c\x45\x87\x2b\x0f\x86\xe4\xbb\x33\x88\xd5\xd8\xd4\xab\xd4\x03\x70\xb1\x23\xdf\x3b\x85\xb5\x36\x1e\xcb\xc2\x03\x2b\xad\xbd\xa4\x7e\xab\xd0\x03\x53\x4b\xcf\x24\xa4\x94\xae\xd2\x52\xcd\x3d\x93\xc0\xd2\xfa\x12\xb8\xa9\x0c\x9b\xf2\x5d\x3d\xb3\xc6\x3f\xc8\x5d\x5a\xc3\x63\x86\x7e\x2d\x66\x7a\xfb\x7b\x73\xd9\xfc\x38\x81\x6c\x18\x33\x16\x19\x31\x0a\x83\xfe\xb8\x5d\x99\x1a\x6f\xcb\x5e\xf1\x7c\x9c\x4c\xcf\x9f\x1f\x09\xa9\xcd\x36\x59\x6d\x77\x4f\x58\x7b\xdb\x49\xe3\x06\x36\xff\x5d\x9e\xe8\xba\x48\x59\xfe\x8d\x78\x24\x74\xa7\x8a\x92\xd2\x59\xe2\x09\xa8\xd8\x0d\x0a\xe8\x22\x12\x2c\xf6\x38\x58\x85\xcc\x4d\x3d\xc3\x62\x97\x0e\xf2\x27\x1b\xba\x6f\x26\xfb\xeb\xd4\xf6\xa4\xc9\x53\x36\x2c\x3e\xcd\xef\x6c\x26\x48\x34\x3b\x63\xe4\x34\x65\xce\x50\xf4\xeb\xa9\x7e\xfd\xa2\xd4\x80\x0f\x66\xae\xfd\xdb\x21\x34\x7a\x63\x2f\x69\xb0\x3a\xce\x1a\xd4\xdc\x9b\x3d\x77\x66\xf5\xc4\x3a\xa3\x92\x81\x88\xcb\xde\xb7\x28\x75\xb9\x41\x3c\x93\x0d\xf8\xaa\x77\x6c\x47\xeb\x11\xa5\xe2\x65\x34\xaf\xeb\x97\x4d\xba\x49\x0b\xe8\x5d\x71\x49\x2c\x62\x5a\x68\x53\x66\xf0\x20\xcf\x5a\x1c\xdb\xcd\xf0\x88\x8a\x24\xa2\x59\x80\xee\x5e\x03\xda\x2b\xbf\xf4\xe2\xad\x59\xb4\x0a\x16\x47\x98\x9b\x2e\xa3\xe1\xf8\x6d\x74\xed\xbc\x19\x9b\xe1\x98\x49\x52\xd3\x92\x7e\x49\x56\x4e\x01\x38\x09\x12\x01\x00\xee\x5c\x2e\x39\x0c\xcc\x38\x1b\x4f\xed\x8b\x5c\x7b\x79\x00\xd1\x64\x7f\x6c\x9b\x29\xe1\x50\x74\xf3\xb4\x13\xcc\x9d\x13\xb5\xcb\x5a\x69\x0c\xf5\x2c\xf3\xb3\x64\x87\x45\x6a\x29\x18\x0a\xe9\x68\xa1\xc3\x32\x4f\x34\xb1\xba\x50\x01\xaa\x59\xda\xb6\x76\x5d\x1e\x45\x28\x48\xfd\x17\x27\x51\x1c\x0b\x48\xb1\x9a\x58\xbd\xe7\xdc\xa1\x44\x2e\x00\x57\xa9\x3a\x21\xe1\x13\xd6\x3c\x9f\xcc\x45\x34\xc5\xb1\x29\xd4\xc4\x5a\xad\x1b\xa6\xe4\xc9\xc5\x47\x95\xdf\x22\xf6\xb9\x99\x2c\xae\x6c\x6f\xf0\x81\x19\x7d\x80\x6b\x46\x2a\x16\xcf\x1d\xd3\xa6\x52\x91\xc9\x12\xa2\x84\x59\x22\x72\x7d\xcc\x70\x5a\x84\x83\xf7\xca\x48\xec\x84\xb1\x1f\xe5\xbb\x82\xda\x03\xa5\x10\x3d\xb3\x72\xc3\xda\x2b\x43\x8a\x59\xa3\x03\x8c\x38\x92\x51\xba\x14\x9c\xdc\x23\xa2\xba\xd9\xc3\x50\x0c\xc9\xfe\xfd\x93\x2b\x0d\xb4\x0c\x0f\x06\x81\xab\x28\x7e\x7e\x31\xef\xb3\x17\x47\x5d\xcc\x15\xbd\x9c\xbb\xd4\x46\x68\xd0\x70\xe2\x96\xac\xf5\xe9\x44\xe6\xcf\x9e\x12\x4a\xe9\xf9\xf5\x2c\xcd\x5a\xe5\x71\x18\x06\x0e\x64\xa3\xcf\x54\x48\xb8\xfe\x49\x81\x86\xfc\x89\x20\x5b\x9e\x39\x26\xa9\x90\x74\xad\xdb\xcc\x1b\x8e\x87\x13\x08\xc7\x2a\xfb\x8a\x1e\xaa\xb5\x0c\xb8\x53\x2b\xee\xc2\xd5\xac\x08\x07\xda\xc7\x4c\x8d\x7a\x4b\xfe\xbd\x8f\x6b\x5a\xad\x89\x35\x4b\x55\x34\x86\x06\x1b\x49\x82\xd5\xc0\xf1\x68\x88\xbf\x8e\x9f\x4d\xf8\x48\xac\xb3\x7c\xa6\x59\xf4\x58\x7f\x86\xeb\xb0\x5b\x26\x03\x08\x78\x35\x36\x18\xaa\xa7\x05\x18\x1f\x07\x68\x8a\xfb\xec\x2a\x12\xaa\x8b\x88\xdb\x77\xc0\xa6\xcc\x73\x15\x63\x10\xe4\xf5\xd8\x7e\xbc\xef\x16\x1f\x1c\xd6\x5c\x3a\x7e\x36\x84\x82\x5d\x2e\x23\xc9\xb9\x01\x8c\x35\xf6\xd8\xc2\xba\x33\xc9\xa0\xee\x44\xc2\x03\x2f\x91\x90\xd0\x43\x24\x4c\xf4\x10\x01\x03\x3d\x42\xc0\x88\x17\x1b\xa0\xe2\xb9\xae\x7c\x2c\xd6\x2b\x46\x06\x1a\x37\x76\x7c\xca\x50\xa4\x98\xe1\xc1\x76\xb1\x2e\x97\xe9\x13\x94\x4a\x5e\xc4\xca\x0b\xef\x55\x5f\xdb\x2c\xca\xbd\xf8\x48\x16\xbb\xec\x32\xf6\xc1\x50\x21\xd1\x76\xbf\xfd\xb7\xdd\x29\xff\xb5\xfd\x1c\xd1\x4a\x13\xe0\x34\xd6\xb7\x9b\xb7\x09\x3e\x8c\x3b\x9e\xb7\x24\x81\x8b\x0e\x3a\xff\x82\xfa\x06\x22\x69\x53\x31\x2d\xf0\xa6\x66\x04\xab\x77\xc1\x38\x25\x99\xe5\xf5\x9f\x8b\x32\x57\x69\xd7\xa4\x97\x50\x10\x58\x15\x82\x71\x21\x31\xcb\xeb\x74\x48\x3c\xbb\x80\xe2\xba\xc2\x9a\x80\xff\x32\x3e\xb9\xb6\xe5\xd5\xbf\x2b\x85\xd4\xe1\x91\x0d\x68\x4b\xab\x3e\x5d\x9e\x65\x49\x77\xf8\xff\x4f\x82\x5d\xa2\xdb\x8e\x00\x30\x00\x5e\x50\x45\x99\x64\xb9\xa7\xcc\xe4\xca\xcc\xdc\xd5\xcf\x77\xe7\xa9\x44\x46\xfc\x2a\x12\xe2\x7f\x67\xfb\xff\x0f\xcf\x32\x8c\x0c\x82\x37\x63\x95\xc6\x0a\x57\xf6\x80\x25\x62\x98\x10\xfc\x34\x05\x47\x78\x68\xe9\xe4\x4f\xab\xfb\xc2\x09\x31\xf4\xc7\xe2\xae\xe5\xbb\x90\xc2\x31\x10\x91\x33\x91\x25\xd6\x5f\x6e\xb4\x2c\xab\xb8\x10\xbf\x40\xb4\x59\x26\x63\xfb\xc0\x99\x64\x21\x7b\x7c\xc1\x66\xe1\x3e\x65\xc5\xd5\x4f\x9c\x47\x62\x13\x8c\xd6\x5a\xdd\x34\x67\x72\x1e\x51\x51\x92\xb3\x6a\x92\xa0\x04\x52\xf8\xea\xb2\x80\x2a\x0f\xd1\xf0\x33\xbc\xae\xa2\x09\xce\x0b\x4c\x92\xfe\xc0\xb4\xaa\x3e\x10\xac\x30\x55\x4f\x25\x81\x6e\x3d\xea\x2c\x15\x8e\xd1\xf4\x56\x71\x17\xa6\x82\x53\xc6\x4f\x7b\xa1\x48\x99\x36\x48\xc4\x9b\x9e\x4a\xe4\x20\xd2\xa4\xcf\xbc\xc6\x0e\x83\x6d\xdf\x9b\x38\x31\x18\x3b\x89\xd1\x20\xdd\x68\x7f\x33\x17\xc3\xbc\x3e\x33\xa1\xd6\xd2\x55\x13\x99\x16\x4d\xa9\xa3\x16\x1b\x98\x3f\x70\x91\xd0\xd6\xf5\x3b\x52\xd3\xd5\x87\x35\x97\x89\x93\xf1\x0a\xe0\xa7\x8a\x42\x01\xa2\x64\xd1\x85\x90\xa7\xb6\x7e\x80\x0a\xa6\x2f\x0f\x92\xcd\xe9\x99\xa6\xab\x6e\x75\x9a\x7c\xac\x8b\x61\x6e\x1a\xeb\x9e\x1b\x37\x3e\xfe\xbe\xf5\x85\x81\x0b\x4a\xb3\x80\x0b\x66\x37\xf4\x26\xf1\xb4\xbb\x66\x89\xbd\x05\x19\x33\x4c\xf6\x20\x41\xa1\x38\x33\x32\x91\x0b\x18\x86\x83\xd0\x8a\xe4\x28\xd8\xce\x76\x35\x80\x55\xac\xee\xda\x31\xb4\x0d\x30\xaf\x39\x34\x73\x30\x14\xf7\x0f\x13\xf4\x64\x66\x5c\xd1\x1f\x85\x50\xe0\x84\x3d\xd5\x98\xe6\x8c\x03\xb7\x83\x82\x1a\x6a\x7c\x71\xeb\x83\x04\x82\xe9\xd1\xab\x0f\x2a\x70\x3b\x1f\x51\x1c\xfd\x5c\x20\x6b\x9a\xbe\xc1\x83\xd6\xdc\x68\xa8\x9d\x9a\x13\x4e\x9e\x94\x82\xb2\x88\xfb\x54\x6f\x44\x76\xa9\x73\x15\x82\xa5\x72\x50\x14\x8b\xa6\x9b\x2f\x33\xfe\xd7\x60\xf7\x4f\xb4\xa7\x1b\x74\x03\xe1\xb9\x51\xe6\x78\x8e\x26\x62\x80\xd5\xd1\xcd\x84\x89\x4f\xf3\xa7\xc2\x8c\x2e\x88\x18\x12\xdb\x46\xb3\x2b\x7b\x1c\x48\xec\xef\xb7\x11\x6c\x66\x3a\x84\x15\x85\x1b\x13\x7b\x71\x2b\x75\x9c\x18\x84\x83\x52\xb0\x2a\x44\x2f\x6e\x26\x64\xcf\x56\x64\x39\x08\x28\x78\x14\xc4\xde\x6f\x01\xa0\x84\x1e\x23\xa0\xef\x01\x68\x55\x49\xe1\xec\x35\x50\xca\x76\xf7\x3a\x94\x57\x25\x7f\x27\x60\x78\x82\x7d\x1e\x0f\x60\x45\xa1\x04\x32\x1d\x41\x8b\x38\x91\xef\x16\x6a\x94\x88\x75\x3d\x4e\x59\x7e\x1f\xc6\x81\x48\x58\x7d\x1f\xa6\xfe\xa5\x83\x71\x09\x64\xcd\x22\xd4\x67\xa5\xcd\xfa\x73\xcb\xa9\xb3\x35\xe8\xd9\x5a\x19\xb8\x95\x46\xe2\x5f\x49\x0c\x57\x6b\xe2\x66\x66\x42\xb8\x67\x95\x54\xe4\x3c\xec\x47\xa0\x66\x07\xf9\xeb\x16\xd8\xec\xce\x46\xee\xfd\x10\x83\x6d\x9a\xf0\xbb\x3c\xcb\xbd\x6e\x82\xb7\x20\xd2\x15\x85\xd8\x23\xca\x49\x18\x73\x25\xf7\x60\x51\x9c\x86\x87\x6a\xe4\x3f\x1e\x9a\xb2\x71\x5f\x07\x54\x2e\xbb\x1f\xd9\xc1\xaf\xa2\x8d\x57\x51\x6e\xea\x53\x64\x00\xe5\x18\x91\x9b\x14\xb2\x80\x06\xc6\x45\x11\x50\xa2\x62\x98\x1a\x26\x44\x7b\x25\x43\x83\xdc\xa0\xba\xa0\xe5\x90\x3c\x8b\xd8\xed\xc4\x97\x1d\xb2\x49\xa0\x20\xa1\x8c\xd9\x7d\x62\x29\x71\x9f\x92\xb8\x51\x10\x0a\x27\x05\x1a\xf2\xb4\xb2\x3f\x7c\xfb\x6a\xdb\xf5\x1a\x1b\xce\x4d\x71\xe4\x1d\xb5\x39\x6f\x29\x64\x81\xaa\x35\xa4\x54\xfa\xe2\x5e\x42\x29\xe9\x8f\x8a\x09\x2d\xc0\x45\x73\xb5\x51\xc2\x72\xe4\xde\x4f\xf9\xa1\x6e\xc7\x13\xa6\x98\xf2\x65\xf6\xd1\xf7\x5b\x8e\x4d\x1a\x58\x31\x68\x8d\x79\x8c\x79\x29\xf6\xba\xe6\xfc\xc3\x31\xa3\x4f\xac\x7d\xb4\x54\x67\x05\xb7\xf2\xa5\xf6\x1b\x46\x38\xb3\xb9\x84\xb3\x2f\xa7\x27\x7b\x13\xe3\x20\x89\xf8\x3a\xe0\x76\xad\xc8\x52\x58\xac\x83\x2d\x5c\x67\xbe\xeb\x57\xd9\x09\x87\x27\x4a\xb3\xc3\xae\x43\xff\xa9\x57\x51\x81\x61\x63\x26\x9d\x84\xf9\xdd\x84\xdb\x09\xd5\xf2\x09\xd5\x9c\xa8\x17\x04\x4e\x85\xd6\xba\xa9\x61\x91\xde\xf2\x80\x34\x31\x3a\xe3\xb1\x3a\x21\xf3\x02\x09\x61\x61\x57\x76\xf6\x94\xee\x2d\x0e\xff\xf3\xbb\xb6\xe0\x4b\x93\xfe\x69\xde\xd7\x6f\xc4\xd6\xd1\x92\xd0\x76\x56\x0e\x77\x42\xd5\x9d\xcf\x9c\x2a\xa3\xf6\xb4\xd1\x4c\x1d\x5e\xaa\x80\xe4\xaf\x93\x4e\x74\x6f\xf9\x00\x72\xaf\x6b\x55\x00\xc5\x01\x6a\xac\x26\xb6\x6b\xc1\x28\x42\x4a\xb9\xb2\x3d\x58\x23\xaf\x70\x34\xb7\x35\x82\xb9\xd4\xba\x34\x52\xd9\xf4\xc4\x9d\x92\x56\x62\x55\xad\xd2\x1f\x7f\x8d\xf3\x13\x09\x9d\xe5\x15\x2e\x75\xf6\x8b\x29\x4f\x7c\x1f\x96\xda\xfc\xc5\xc9\xac\x72\x12\xbb\x00\xd7\x9c\xf6\x0d\x9e\x5e\xa8\xe3\x2a\xc0\x54\xb6\x2b\x84\x65\x9c\xb9\x01\x96\xb6\xce\xcb\x16\x60\xe9\x25\xeb\xe8\x52\x40\x04\x14\xa3\x33\x72\x3c\xd4\x94\xc5\x50\x6d\x98\x43\xbf\x32\xd7\x5e\xd2\x10\x8c\x2a\x5a\xb1\xaa\x94\xa1\xad\x93\xee\x25\x8e\xf5\x09\x34\x2c\x16\x91\xe9\x48\xc6\x94\x78\x80\x3e\x0c\x39\x72\x18\x3e\x89\xe6\x7a\x64\x48\x8f\xb9\xcc\x08\xd0\x6c\x53\x3c\x59\xc7\x65\x57\x94\x51\x21\x4d\x33\xde\x7d\xbf\xc2\x97\x7c\xa3\xbb\x54\xb6\x29\xcf\x7d\xe8\xe4\xfe\x3a\x28\x62\x17\x64\xd8\x53\xfe\xce\xdd\x94\xa0\xe1\xe8\x43\xf2\x71\xfc\xd4\xdf\xcf\x5e\x26\x42\x9f\xde\xd8\xfa\x75\xe6\x9b\xfc\xda\x45\x44\xac\xac\xf5\xc3\x92\xb9\x75\xe7\x28\xa3\xbe\x01\xd6\xf2\x88\xb6\x2a\x4b\xc9\x48\xa0\x64\xea\x6f\x2a\x30\xd1\x27\x69\xfd\x9e\x59\x26\xd0\x4d\x27\x5b\xcb\xfa\xed\x6a\x6f\x12\x0a\xd3\x22\x26\xec\x09\x4f\x8f\xc6\x7c\x4d\x71\xed\xc3\x94\xd7\x25\xab\x70\x1e\x6e\x11\xae\x90\x12\xe2\x80\x05\xb5\x92\x11\xdd\x39\x86\x85\x46\x2b\x2c\x1a\x5e\x5a\xa4\x88\x78\xcc\x88\x3a\xc2\x62\xaa\x9f\x8e\x20\xe0\x1f\x68\x78\xe7\x18\x3b\xc8\x4a\xf3\xfc\x5a\x8e\xd3\xd6\x91\x30\x2e\x7c\xde\x74\x54\x65\x91\x9f\x16\xbd\x71\x88\x1a\xdd\x9c\xfc\xf2\xd6\x8c\x99\xb3\x99\x58\xa9\xf9\xc9\x7e\x20\xa2\x0d\x7c\x0e\x8d\xe0\xea\xdc\xd3\xac\xfa\xc1\xb6\x07\xb1\xb1\xa1\x8b\xa7\x4c\x29\xc2\xa9\x20\xfc\x98\x72\xe4\x2d\x72\x27\x91\xf0\x67\x59\xe1\x5b\xb8\xee\xec\x26\xcb\x72\xb9\x66\x23\x03\x34\x78\x71\x20\x5f\xd5\xb4\x1d\xe7\xfc\x25\x57\x7d\x3d\xa2\x1c\x88\x4f\x17\x2a\xfa\x0c\xf7\x30\x86\x25\x46\xa4\x51\x70\x3c\x7b\x24\x75\x35\x5c\x87\xb2\xdf\x87\x5c\xe2\x63\xd2\xd0\xe8\xb8\xf9\x42\x76\x76\xc8\xba\x79\xa1\x0d\xa5\x39\x2a\xf1\x77\x08\x21\xe7\x0d\x19\x4f\x98\x1a\xbb\xdf\x76\x07\x1c\x93\xa4\xe0\x4c\x87\x32\x6b\xaa\xf2\x39\x49\x5d\xe3\x52\xc8\xb0\x0c\xe9\x86\xe9\xaa\x9a\x4c\x9d\xcd\x3c\x3b\xec\x4e\xbd\x24\xb5\x40\xc7\x9e\xea\x2b\x13\x39\x31\x64\xa7\xab\xe2\x21\xd6\x82\xbd\x1f\xd2\x06\x87\x2b\x5d\xc4\xdc\xe5\x87\x57\xd0\xf6\x7a\xb5\xed\x6c\x98\x54\xf3\xe1\xf4\x58\xc2\xb6\x7d\x59\x7f\xcc\xdb\x52\x49\xca\xb5\x4c\x70\x19\xb2\xe1\xed\x35\x9e\xe7\xc3\x29\x41\xd2\x0b\x79\x2c\x32\x48\x4a\xe3\xa9\x80\x22\x4a\xb7\xb2\x2c\xb3\x84\xd8\xa2\xd8\x30\x2f\xc5\x03\x25\x23\xb0\xe9\x5e\xc6\x18\x47\xba\x6d\x1a\xc0\x88\x40\xc1\xf1\x6f\x59\xef\xd6\x79\x2c\xed\x02\xc7\xb0\x42\x2c\xec\xa4\xbf\x0f\x23\x41\xf0\xfb\x0e\x0d\x60\xe9\xf0\xb2\x0f\x5a\x84\x57\x96\xc3\x75\x8a\x57\x53\x91\x6b\xf4\x90\xf3\xeb\x1f\xea\x4a\x32\xc7\x78\x50\x30\x9e\xc8\xac\x59\xaa\x78\x8f\x5e\x9e\x77\x0d\xa2\x3d\x82\x40\x37\x81\x09\x83\xa7\x00\x91\xe9\xee\x80\xb6\x8b\x62\x10\x59\x7f\xa7\xaa\x0b\xb4\x64\x2e\xe7\x98\xc7\x7e\xfc\x4b\x06\x47\x30\x49\x83\x9c\x0a\x5c\xda\x94\x02\xe8\xbe\x0b\xdd\xaf\x08\xaa\x17\x9c\x12\xf2\x18\xf5\x63\xd8\x9a\x30\xde\xbf\xe9\xd6\x50\x3d\x29\xee\x79\xa1\x66\x58\x69\x3e\x4a\x65\xd8\xfb\x18\xc2\x49\xbb\x89\x2e\x30\x00\xea\x80\xaa\xab\xdb\x7f\xb6\x60\xe4\xc6\x71\x3a\x28\x2d\x5e\xc0\x91\x09\x64\xaf\xe9\xf3\x73\x00\x5e\x6c\xb2\x50\xc4\x6b\x47\xdc\x56\x7a\xa8\x36\x11\xac\xf9\x30\x0e\x5b\x21\xd7\xf1\x18\xc8\x96\xe1\xfd\x19\x9e\x5f\x3c\xf0\x66\x66\x8b\x82\xa3\x1a\x99\x3a\xcf\x4b\x2b\xe2\xa6\x36\x4b\xe0\x6a\x28\xd7\x20\xf7\x3d\x6c\x8c\x1c\xd8\x7d\x8a\xcb\xc6\x77\x8f\x2e\x99\x81\x76\x31\x5d\xb9\x44\x66\x79\x65\x31\xcd\x93\x98\x1c\xda\x82\x44\x0d\x65\x8c\x68\x49\x03\x53\x00\x47\x17\x4a\x66\x07\x5a\x54\x91\x07\x3c\x09\xb1\x3d\x50\x71\xa5\x29\x4a\xe3\x9b\x03\x85\x07\x29\xd9\x78\x8d\x66\x75\x5e\x68\xb1\x59\x7a\x9a\xb8\x2b\x3e\x87\x49\xa7\xe0\xa2\x92\xae\x45\x9d\x9f\x8e\xe5\x2c\x50\xd6\xb2\x18\x11\xd8\x84\xc7\x3a\xd1\x2b\x6d\x1f\x6a\x77\x03\x74\x3c\x42\xee\x5e\x39\x76\x18\xd8\xdf\xa6\xfa\x29\x3c\x66\xbc\xc2\xe9\x3b\x9b\xb6\x6c\xdf\xa8\x92\xd7\x7a\xf4\x5a\x70\x77\xbd\x4c\xe6\x4e\xf6\xec\xef\xf7\x64\x51\x11\x8a\x62\x3a\x5f\x8d\x32\x4c\x79\xe8\xb1\xbb\x07\x7a\xc6\xb5\x65\xce\xb2\xa6\x89\x6f\x00\x6c\x87\x94\x66\x11\x7f\x3a\x1a\x9f\xb2\x52\x95\x65\x46\xfa\xbb\xb3\x9c\x84\xf4\x58\x07\xfe\xac\x91\x79\xad\x97\x5c\xad\x9f\xe3\xa5\x88\x8c\xb2\x09\x13\x5a\xd1\xac\xe2\x7a\x09\xf5\x4f\x67\x5a\xfc\xa8\xf3\xb3\xce\x84\xe3\xc9\xca\xec\xfb\x71\x6f\x52\x8f\x3f\xe1\x8d\xb9\x73\x32\x15\x6a\x7b\xb3\x3d\xda\x8d\xb5\xc6\x84\xeb\x27\xd5\xaa\x92\x31\xda\x60\x36\x7d\xff\xd8\x96\x6d\x86\x63\x77\x39\x87\x3c\x10\xf3\xfc\x21\xd5\xd7\x44\xc8\x03\x61\xb0\xb1\x7e\x29\x32\x53\x23\x80\x14\xa8\x11\x96\x13\xb3\xc0\x5a\xf4\x62\x20\xda\x91\xae\x74\xc9\x9e\x59\x04\x37\x90\xe8\xeb\x96\x9f\x7d\x38\xe8\x4b\x25\x96\xa8\xf2\xea\x85\x9f\x6d\x26\x01\x68\x9e\x57\xc2\x24\x19\x07\xe4\x39\x1c\x68\x52\xf5\x85\xc9\xc9\x19\x3c\x31\xe7\x23\xf5\x12\x5c\x57\x49\xc7\xbc\xd4\xaf\x31\x39\xe4\x62\x38\xe9\x33\x44\x9f\x29\x7c\xa2\x0f\xbf\xb4\x53\x12\x6e\xbe\x45\x9b\xb5\x90\x78\x9b\xa3\x9f\x55\xea\x02\x9e\xae\x59\xb4\x78\x70\x2f\x56\xea\x05\xf5\xcc\x68\x45\xd1\x85\x51\x96\x72\x91\xf8\x24\x44\x78\x2a\xe1\x27\x8d\x33\x60\xa1\x7d\x14\xbf\x62\x18\x57\x49\x4d\xdb\xf1\x5a\x30\x85\xe3\x5d\xd3\xf5\xa6\xb3\xd2\xc5\x4c\xcd\xc0\x52\x2c\xbc\xd8\x3f\x41\x63\x86\xa9\x46\xa6\xbd\xcb\x77\x26\xa7\xe0\xe9\x60\x3c\x9a\xe7\x9b\x9a\x70\x9d\xbe\x8b\x97\xe6\xed\x8b\xd6\xff\x51\x26\x68\x1a\x3f\xf8\xa0\xd5\x2f\x81\xc0\x2b\xd1\x81\x5a\x88\xe8\x10\x58\xd5\x33\x21\xbe\x2f\x15\x2a\x74\x75\xe4\x0f\xf7\x2d\xf2\x39\xae\xb4\x69\x8c\xa0\x94\xa3\x27\x6e\x1d\x7c\x55\xab\x2b\x14\x4e\x93\x25\x97\x1a\xfd\xde\x59\xba\x42\x9e\xb4\x8d\xed\xb8\x35\x87\xfd\x9d\x4a\xd0\x9a\x3a\x21\x70\x69\xaa\xb9\x5c\xd2\x44\x83\xa1\xd6\x3f\x0a\xfe\x09\x36\xdc\x27\x9f\x4a\x10\x9a\xf9\xa1\xf6\x75\xb9\x36\xcf\xf5\x2c\xb6\xeb\x6f\x66\x36\xf7\xac\xbd\xad\x78\xf5\x1b\x23\x73\xa6\x34\x69\x90\xb3\x0c\x3d\x46\x95\x04\xf5\xe4\x56\xd4\xc9\x64\x31\x7c\x25\x41\xe4\xd9\xfd\x41\xce\xb3\x4e\xc2\xd6\xad\xfe\xef\x24\x8d\xaf\xf3\x50\x4f\x09\x42\xbe\x2b\x3b\x0f\xac\x4a\x8d\x9b\x00\x52\x43\xf0\x8f\x78\x80\xa3\xe7\x05\xc0\x28\x33\x90\x86\x91\x6c\x8d\x69\x43\x5e\xb3\x09\x94\x5d\xa1\x68\x33\x25\x73\xe5\xba\x2e\xb0\x31\xa1\x7c\xbc\x5f\x18\x14\xe1\xa4\xa2\xb0\xcb\xd8\x4c\x26\x1b\x46\xb4\xa0\x86\x61\x71\x13\xd0\xc5\x8b\xb8\x58\xab\x37\xc2\xb5\x30\x96\xd6\xac\x6f\x31\x94\xa6\x90\xe1\x0f\x57\xc8\xb8\x9e\x31\x4e\x16\x29\x96\x91\x50\x42\xbf\x20\x00\xb5\x85\x84\x5b\x7f\xc4\x4f\x65\x48\x05\x82\x18\x5d\xd2\xcd\xdb\xea\x6f\x32\x80\x1d\x5b\x81\xd3\x69\x7d\xc6\x86\x0e\xb3\x7a\xc7\xd5\xb3\x5d\x7f\x75\xbc\x6a\x5d\xfa\x2d\x9c\xdd\xa7\xe6\x3b\x1f\x1f\xa4\x03\x6d\x63\xf7\xca\xd1\x26\x40\x45\x26\xd7\x9e\x9d\xe0\x76\x65\xea\x06\x50\x6b\x79\x27\xd9\x19\x55\xf0\xd4\xc0\xca\xd7\x03\xe8\x71\x22\x89\x77\x45\x47\x77\xdf\x32\x98\xcb\xcf\xb5\x7d\x3d\x82\xd0\xeb\xf3\xc1\x21\xb5\x92\x03\xae\x0e\x3f\x70\x08\xc9\x02\x8f\xb4\x2b\x45\x80\xa2\x05\x54\xeb\xd8\xab\xd5\xa4\xe7\x0c\x1b\x11\x8e\x56\xc2\xb3\x51\x81\x85\x39\x4d\x55\x19\x80\xb6\x05\x70\x58\x3a\xd2\xf8\x2d\x69\xd8\x71\xe4\x7d\xb7\x25\x2c\x10\x00\x98\x5d\x1f\x9f\xfb\xde\x55\x49\x0f\x86\xb0\x7f\xbb\xf7\xb0\x79\x98\xf8\xae\x6f\xa5\xa9\xf6\x31\x31\xa7\xa9\x74\x71\x49\x07\xde\xdc\x1a\xb2\x64\xc0\xaf\x05\x63\x67\xa9\xcc\x24\xfd\x6d\x6d\x06\x60\x49\x92\x7f\x99\x55\x92\x08\x9f\x45\xd0\x03\x4d\x1f\xf2\xe5\x49\x46\x7e\x50\x5f\xcd\xc6\x66\xd1\xcb\x78\xd4\xe5\xac\xcd\x36\x57\x62\x6b\xfe\x8e\xfa\xb2\x19\x90\x3e\x17\x6a\x0b\xa3\xab\xfe\x8c\x8d\xfe\x9c\x3b\x75\x84\x8f\xe2\xca\xde\x16\xd7\xa2\x19\xb0\xc7\x20\xf4\x49\xa5\x58\xd5\xef\x6c\xfd\xd4\xf1\xde\xb6\xba\x77\xbc\x01\x14\x7e\xbb\x77\x88\x07\xc3\x3e\xe8\xd9\x72\xa2\xac\xd1\xc1\x64\xd3\x9c\xa8\x6a\x2f\x5d\x3a\x79\xcc\xe5\x6e\x1a\xfd\xe6\xe5\x72\x2d\x21\x56\xba\xfb\xf2\x5d\x66\x4d\x67\x4c\xda\xc2\x08\x5a\x23\x29\xae\xcf\x65\xf0\x62\x3f\x41\xb7\x3e\x4f\x05\x08\x28\xb1\x04\xa6\x02\xd8\x80\x2b\x5b\xf9\x4d\xdc\x7e\xbd\x60\xbe\xe0\x31\x96\xb3\xd3\x60\xd0\x05\x4c\x5e\xc9\xf7\xb7\x2e\xee\x38\x41\x20\x40\x52\x51\xd9\x97\x57\x06\xb7\xe0\x94\xe1\xa3\xac\x0b\x4e\xe7\xad\xf1\xbd\xdc\x4a\xb7\x94\xcb\xe7\x9a\x9b\xdf\x01\xac\xab\x03\x91\xbf\xd0\x79\xc3\xf3\x14\x4a\xc5\xe6\x2d\x17\xc2\x87\x02\xe7\x85\x99\x24\x0f\x7a\x1b\x17\x42\xf8\x20\x9d\x90\x68\x3d\xce\x39\x62\xc3\xc8\xd4\x21\xed\x12\x76\xbf\xae\x5a\x10\xcf\xa8\xb8\x39\x03\x74\x0e\x74\x11\x88\xee\x87\xb0\x68\x00\xfd\xba\x9f\x8c\x13\xf6\xa3\x6b\xc9\x57\x93\x20\xf1\x98\x44\x57\xe5\xd0\xc7\xe0\x88\x76\xa0\x79\x91\xce\x9b\xb5\xd8\x14\x26\xea\x5f\xb9\x9e\xa7\x09\xcb\x81\x51\x04\x58\x30\x21\xa3\xee\x69\x69\xea\x81\x77\x4d\x52\x9b\x0b\xf8\x51\x48\x3e\x1e\xf1\x46\x08\x33\xde\x13\x34\x63\x2f\xfe\xf6\xa9\xde\xec\x98\xf9\x9b\x55\xfb\xe3\xc9\x91\xbd\xf3\x85\x8d\x53\xd3\x2e\x98\x38\xeb\x94\x6e\x7e\xe2\x2c\xc1\x85\x50\xd1\xc2\xf9\xf1\x4b\x27\xd5\x15\xc2\x8f\xa8\x98\x88\x5c\x15\x85\x2c\x5a\x85\x5b\x09\xf6\x39\x7a\x7d\x96\x79\x12\xed\xf4\x46\x7e\x86\xb3\x4b\x37\xb0\xa4\x05\xa1\xf3\x7c\xba\x8f\xb0\xdd\xd7\xd3\xcf\x40\xd7\x6f\x45\xe1\x72\x12\xc2\xda\x3f\xe9\x47\x5b\x13\x86\x07\xb6\x45\xcd\xe5\x39\x21\x94\xe9\x92\x1b\x3b\x68\x7c\xa5\xb1\x55\x04\x32\x59\x5f\x6d\x18\xcd\x38\x5a\xfb\x6a\xb8\xd8\x89\x2e\x45\xfc\xce\x43\xbc\x7a\xa1\x15\x59\x3d\x25\x5e\xad\xd1\xf4\xf8\xca\xb7\x79\xf0\xc6\x8d\x26\xe5\x60\x05\x01\x6a\x9f\x06\x07\xcf\x3c\x9d\x16\xe7\x86\x14\xdb\xe0\xb3\x91\xf0\x28\xbe\x30\x3c\xa9\x0f\x21\x4a\xed\x50\x31\xbe\x20\x5f\x6a\x73\x40\xf4\xad\x10\xed\x03\x88\x7d\xe2\xad\x78\x2f\xde\xf7\xc0\xdf\xfd\xa8\x4a\x11\xfa\x84\xb4\x2e\xb6\x91\x30\xa7\xe0\xc1\xcb\xeb\xd2\xb4\xe0\x41\xb0\x0c\x95\xdb\x77\xb2\x7b\x59\x5d\x2d\x52\xda\x76\xab\x08\x22\x1c\x00\x5d\x2f\xeb\xac\x43\xa9\xd7\x75\x5c\xc7\x93\x88\x41\x53\xb3\x08\xc2\xd2\x00\x0f\xb8\xaf\xed\x9d\xb5\x52\x13\x9e\xa3\xcd\x9d\x2c\x7e\x4c\x58\xaf\x32\xa4\x22\x82\x7b\xab\xae\xda\xb9\x43\x3b\xb1\xc2\x24\x9d\x8d\x50\xb0\x6e\x4e\x64\x9c\x5e\xf1\xa5\x83\x6b\x82\x2c\xe4\x6f\x1f\x3a\xa4\x8d\xce\x33\xda\x4f\xce\xb1\x49\x79\xb1\x09\x93\xf4\xe9\x91\xd8\x51\x1d\xeb\xc0\x01\x61\xae\x96\x8b\x32\xd0\x7b\x02\x7b\xd0\xd8\x7a\x0f\x94\x18\x9a\x8b\x18\x80\xb8\x73\xe8\x6d\x38\x25\x6f\x65\xb3\x53\x8f\xdf\x6f\x68\x58\x16\xbe\xbb\x21\xe1\x0f\xc3\xa5\xfa\x9f\xbe\xfd\xce\x38\xd4\x59\x54\xf3\x91\xf5\x2b\xdb\x43\xab\x1c\xbc\xda\xf3\x23\x8d\xdb\x53\x09\xcc\x31\x61\xb2\xc5\xf9\xc9\xfb\x03\x11\x0b\x8c\x48\x43\x64\xed\x5f\x5b\x27\x19\xee\xf0\x5f\x09\x15\x30\x34\x0b\x06\xc1\x1a\x39\x4a\x5f\x36\x74\x5d\xce\x4a\x80\xec\x4d\x10\x57\x5f\x49\x36\x85\x76\xdd\xbe\x16\x5d\x06\x75\x76\x71\x3f\xb4\x0e\xd3\x3e\x5c\xc1\x01\xb1\xba\xa7\x43\x58\x73\x94\xd4\xa0\x68\x1b\x59\xc9\x67\x4f\xd8\x35\xf3\x5b\xa4\xfe\xa0\xac\xa6\x24\x35\xa1\x6a\xc9\xc1\xc1\x59\x20\x53\xa3\x8a\x2f\xd6\xab\x94\x5a\x8d\xdc\xbf\x39\x9b\x97\xe7\x89\x11\x19\xc9\x3f\x08\x51\x21\xd3\x0c\xef\x4e\x1d\x6b\xd2\x43\x43\x0f\x08\xe2\x53\xf9\xec\x11\x13\x9b\x5a\xf8\xab\x2c\x16\xc0\xcb\x90\xec\xae\xb8\x3f\x6f\xcd\xc1\xd2\x53\x76\x5a\x2c\x6b\x6b\x97\xec\x4f\xe4\xd6\x70\xfb\x92\x91\x04\xf1\x0a\x13\x6f\xd1\x1e\xd2\xed\x3c\x7e\x06\x23\x59\x2c\x3e\x99\xd4\x74\x4a\x85\x55\xf3\x43\xcb\x5e\x1a\xd8\xe4\x20\x2f\x66\x11\xe4\xbb\xc8\xf5\xe1\x74\x99\xff\xf0\x17\x1b\x2a\xd0\x8c\x44\xba\x02\x29\xf2\x39\x68\xeb\xdb\x69\x1a\xbb\xf8\xc6\xa3\xc8\xe3\xc3\xef\x54\xde\x30\xe2\xf7\x4c\x31\xb2\x4b\xcc\x2f\x82\xee\xa9\x1e\x44\xfd\x11\xc5\x7d\x10\x49\x67\xd3\x99\x73\x0d\xec\x2c\xf6\x5f\x82\x26\x85\x1b\x3a\x6a\xf4\x68\x8b\x7d\x79\xbf\x72\x41\x2c\x8c\x3a\x07\x8b\xca\xab\xbe\xf7\x28\xf6\xd3\xf0\x21\x0f\x2e\x0d\xd7\xbe\x16\x69\x78\xf0\x4e\xfc\xfe\xee\x17\x30\x30\x96\x27\x5a\x82\x80\x27\x28\x9d\x63\x78\x32\x99\x14\xad\x48\xb7\x08\x18\xd0\x26\xca\x08\x68\xd5\xa0\xa8\xc0\x16\x94\x00\xc9\x38\x03\x28\x55\x09\x94\x5a\x3f\x99\x46\x58\x38\x43\x5c\x46\x4b\xda\xe1\x96\x15\x22\x1a\x02\x16\x25\xef\x04\x45\x6a\x40\x13\x79\xd3\x89\x3c\xa2\xe8\x3c\x24\xf0\x40\xa0\xd2\xed\x41\xb0\x33\x72\xf1\x3a\x35\x2c\x8d\x2c\x99\xdf\xa0\x31\x0d\x1d\x0b\xa3\x0c\xa0\xa7\x20\xba\x10\x0c\xf2\x77\xed\xd4\x07\x18\x1b\x9e\x00\x72\x08\x76\x21\xdd\xa6\x04\x73\x05\xd4\x8b\xec\x94\x7c\xd7\x17\x10\x93\x92\x4f\xf2\x63\xcc\xee\x7a\x4b\xf0\x9d\xbf\x45\x2e\x60\xf0\xe2\x66\x27\x03\xde\x9e\xe2\x46\xb8\x94\x82\xe6\xa7\xfb\x15\x7b\xf6\xea\x1b\x21\xef\x8d\x6a\xb9\x07\x35\xe0\x84\x17\xed\x35\x8c\xcf\x2b\x55\x24\x95\xa2\x49\x62\xe0\x02\xec\x54\x79\xb7\x21\xc4\x51\x40\x8c\x9b\xcd\x87\x5c\xb5\x75\x12\xf6\x81\xf5\x6f\x8d\xd3\x9c\x9a\xc7\x66\xdc\x13\xa1\x67\xe2\xe9\xf7\x1d\x6c\xde\xb4\x1f\x32\xd7\x65\x82\xfb\x0f\x3e\xda\xd9\xb4\xef\xe5\x49\xd7\x60\x52\x14\x39\xc2\xbf\x2f\xaa\xa1\x65\xa2\xcf\x1b\x45\x9c\x69\x9e\x1d\xa2\x4b\x91\xa0\x82\x5c\x3b\x96\x10\xe6\xc2\x67\x0a\x1c\x8c\x91\xca\x47\xfd\x19\x37\xfb\x6f\x67\xda\xec\x96\xd4\xa8\x48\x4e\x9d\xd0\xc3\x49\x74\x6d\x0b\xa9\x91\x6b\x9e\xe0\x49\xaa\xb2\xe2\x07\x62\xe4\x86\x82\x43\xe5\x20\x1c\x01\xed\xd5\xd3\x5e\x0e\x4c\x78\x59\x5e\x5a\xcf\x80\xb6\xd4\x2f\xbe\xb8\xe8\x7b\xf5\xe3\x70\xe4\x64\x91\x86\xab\x95\x30\xc0\xc1\xa1\x30\x4d\xe1\xd0\x3c\xfb\x1a\x12\x26\xd7\x6d\x1e\xf7\xa6\xe6\x16\x32\xbe\xb4\x2c\xe2\xb2\x64\xea\xdf\x8f\xcf\xaf\x3c\x39\x70\x33\xfd\xd4\x8b\xff\x6a\xd1\x6a\x0f\xe5\x68\x59\xa4\x8c\x2a\x70\x4a\x93\x6a\x97\xf2\xf3\xe2\x2b\xe6\x52\x40\x6f\xa2\xd5\x6c\x1b\x2c\xaa\xe3\x3a\x0c\x5b\x75\xe7\x75\x7a\x17\x03\x90\xe8\x47\xc5\xcb\xe9\x4c\x60\x29\xa3\x5a\x4b\x6b\x09\xd0\x86\x97\x20\xe8\x29\x6e\xdd\xb4\x9d\x06\x57\xe2\x00\x15\x08\x82\x37\x5e\x0d\x4c\x5d\xce\xd4\xc9\xd2\x2e\x89\x4c\x00\x78\x58\x34\xaa\x2e\x3f\x6c\xcf\x4a\x6d\x81\x40\x4a\x12\xe7\x72\x97\xd8\x15\x2b\xb0\xce\xd3\x0a\x46\x1a\x60\xc0\xbc\x8d\xce\xfa\xc9\x16\x2b\xc5\x4e\xc6\x2c\xb5\x3a\xce\xf1\x40\x31\xec\x1b\x86\x62\x57\xef\xac\x8f\x71\x38\x1a\xfa\x4a\x68\xb2\x1b\x40\x9b\xd9\xd4\xd1\xdc\xde\x22\xc9\x26\xa2\xad\x10\xd3\xa0\x67\xef\xd4\x15\x4f\x07\x82\x6a\xe0\x3e\x9b\x05\xf0\x8e\xfb\xb8\x1f\xd7\x2d\x75\x37\x02\x1d\x37\xfd\xcb\x88\xe5\xc1\x54\x06\xa9\xb8\x84\x65\xe8\x46\x50\x61\x56\x76\x56\xb6\xb9\xb5\xdb\x9a\x61\x51\x64\x12\xd8\x4c\xe8\x3a\x59\x6b\x40\x5c\x2b\x56\xd4\x99\xe2\xa9\x5f\x75\xd4\x4b\x07\x32\x4d\xf8\x44\x66\x26\xa0\xae\xd3\xae\xc8\x06\xd6\xe4\x25\x00\x70\x95\x93\xcf\x21\xb2\xe2\x22\x1d\x80\xe3\x03\x74\x21\x08\x3e\x07\xa2\xab\x50\x4a\x27\x05\xeb\x2f\xc2\x1e\x4d\x22\x23\x70\xda\xfe\xb9\xab\xb5\x40\x6a\xcc\x01\x8d\x6e\xd7\x46\xdb\xf6\x27\xd6\x69\x4e\x1a\xa6\x9e\xa2\x31\xb8\xb9\x1f\xc1\xba\x80\xaa\xf4\x1d\x76\xc5\x6e\xa0\xf7\x76\xdc\xe8\xe5\x2b\xf6\xdb\x73\xcb\x5b\x6e\x10\x2c\x2a\x54\xe3\x4d\xdf\xad\x10\x4b\x9f\xbc\x26\x84\x30\x1c\x04\xb9\x0c\xfd\xb8\xfd\x8a\xf7\xb6\x33\x44\x28\xb5\x10\xd0\x65\x0f\x5c\xdc\x6e\x16\x12\x85\x53\x01\x03\x99\x0b\xd2\xa6\xb5\x93\x38\xf0\xd6\x55\x9a\x43\x5e\xf0\x68\xd1\xa7\x31\x8d\xf7\x4a\x3b\xb3\xdd\x32\x24\xd2\xa1\xc3\xd1\x35\xd4\x88\x27\x43\x9d\x36\xae\x9e\x3b\xa7\xf2\xa0\x4a\xad\x68\x81\xe7\xee\xc5\x50\xb6\x18\xe8\x79\x37\x2f\x7f\x2c\xd2\x4d\xe9\xef\x69\xaf\x73\xe2\x57\xc3\xcf\x42\xc0\xcd\xa1\xc2\x43\xf5\xce\x8e\x9c\x22\xe6\xa0\xe7\xd4\x50\xf8\x65\x8b\x14\xe7\x32\xc2\x60\xbb\x13\x1f\x3b\x31\xd0\x5b\xde\xaa\xdc\x54\xca\x19\xc5\x54\xcf\x49\xd9\x6b\xd4\xd6\xb5\x40\xd5\xa9\x7b\xd8\x05\x4d\xf0\xf5\xbe\x7c\x4a\xe6\x33\x05\x60\xe7\xfc\x3b\xc8\x99\x47\xe3\x2b\xe9\x55\x33\x69\xcd\x3d\x5a\x16\xef\x74\x6e\x96\x7d\x55\x60\x8d\xb8\xf6\xda\xbf\xf6\xf8\xb8\xeb\x38\xbf\x17\x94\x71\xfc\x4c\x71\x40\xdf\xe6\xac\xb0\xc6\xdd\x3b\x46\xaa\x3a\x07\xe8\x81\xe4\x71\x67\xa0\x5b\x2e\xd4\x80\x02\x4b\x3d\xcf\x86\x4e\xfa\xf1\x44\xd9\xc4\xe1\x99\x6a\xf5\xea\xfa\x8d\xeb\x46\x86\xc4\xad\x39\x34\x74\x33\x2b\xc2\xfc\x9b\x55\x3d\x89\x83\xc2\x45\x3a\xa0\x2d\x49\xd6\x06\x22\x72\xa0\x59\x40\xad\x5e\xb6\x68\x71\x25\xd3\x11\xfa\xa0\x24\xfc\xad\x72\xd3\x29\xdc\x70\x0e\x85\xfc\xa3\x71\xc1\xea\x0e\xe3\xa2\xab\x72\x55\x4f\x80\x80\xc6\x11\x3a\xbd\x77\x5c\x58\xd6\xf5\xd5\x6f\x44\x27\xd5\x39\x6b\x81\xa8\x52\xde\xfe\xed\x29\xae\x61\x30\x4a\xfc\x06\x8d\x54\x16\xbc\xa6\x18\x74\x98\x21\x41\x8e\x9a\x5f\xd2\xad\x31\x22\x99\x29\x9a\x64\x7c\xbc\x3d\xee\xa5\x0b\xdb\x0c\xed\x06\xf9\x28\x24\x7f\x77\x2b\x4d\x93\xde\xbc\xbb\xd2\x15\x55\x00\x2a\x12\x20\x97\xd3\x46\x11\x0f\x16\xc1\x24\x80\xec\xc9\x24\xff\x03\x5e\x82\xb9\x3a\x4a\xaa\xca\xc3\x29\xd3\xc4\x77\xd0\xfe\x52\xe8\xa6\xcf\xe8\x4f\xfa\x46\xb2\xb7\x46\x59\x5b\x57\xa7\x8a\x2a\x10\x45\xbf\xb9\x03\xcb\x78\xd6\x76\xae\x1a\x16\x52\xb6\x0a\xb5\xa5\x15\x00\xda\xde\x6c\x4e\xc9\xb2\x25\xde\x1e\xa0\x5e\xe9\x98\x64\xa0\xe2\x90\x29\xd9\xa4\x4f\x4a\x4b\x72\xac\x29\xe5\xba\x4f\xc0\x43\x7b\x49\x5d\x44\x0b\xab\x91\x0b\x34\x7a\xf9\x87\xed\x6e\xfa\x58\x11\x0d\x58\x2b\x99\x7b\x20\x4e\x1e\x17\x74\x2d\x0a\x13\x5a\x0c\x0c\xee\xc9\x64\x5d\xba\x04\x94\x24\x13\x36\xfb\x2d\x88\x24\x08\x56\xb3\x08\x6a\x39\xf9\xb0\xbb\xb8\x4b\x15\x3c\x00\xba\x28\x8f\xa4\xa0\x32\x5b\xd7\x44\x56\xa7\x56\xc2\x9d\xce\x9b\x83\x70\x75\xc1\x03\x91\x9c\x63\xe6\xed\x51\x62\x44\xff\x04\xb9\xba\x40\x52\xb9\xb4\xa0\xf6\x2a\x0b\x02\x30\x0f\x50\x2c\x8c\xc3\x5f\x44\x3e\xf2\x82\xc8\x4f\xcc\x56\xd7\x8f\xe3\x24\xdd\x53\xcd\x61\x01\xfc\xf9\x01\x74\x02\x96\x0a\x0b\xb9\xe0\x06\xaa\xc0\x03\xf3\x01\x73\xfa\xfa\x8f\x3d\xb6\x09\xa6\x41\x4a\x59\x90\xef\x90\xb1\x01\xc9\x50\xc0\x60\x9e\xe8\xa9\xb6\xf8\xe7\xe1\xda\xf9\x30\x6c\x1d\x3b\xfa\xe6\x41\x94\xa1\x7f\xe8\x11\x1f\xfd\xae\x9c\x14\x33\xa2\xc5\xa6\x42\x49\x38\x28\x4b\x45\xcf\x92\xd5\x32\x95\x51\xa2\x48\xf1\x20\x58\x31\x37\x14\x52\xc9\x13\xaa\x96\x1b\x8b\x5f\x0d\x4f\xd9\x6a\xc5\x8a\x9c\x81\xc4\xf9\x13\x74\xf6\x29\x08\x4e\xa8\x8b\xef\xf6\x76\x11\xd7\xad\x07\x3b\xdd\x24\x4b\x36\x53\x60\x73\x3b\xec\xc8\x87\x7a\xe9\xf4\x6a\x8b\x55\x7f\x04\x1d\x31\x6f\x0a\x6d\xd6\xec\x89\xe4\x1b\x67\xfa\x2b\xbb\x96\x71\x62\xe9\xc9\x42\x95\x7c\xcf\x55\x3d\x17\xcd\x5b\x5c\xb4\xae\x6d\xb0\x97\x71\xb3\x6e\x9f\xef\x4a\x28\xfa\xf2\x32\xa9\xe6\xc6\xa0\xbb\x0e\x44\x39\x77\xd0\x00\x9d\x4b\xef\x52\x75\x3e\x55\x39\xee\x4b\x75\xe7\xb7\xcb\xe6\x9a\xf3\x0e\x98\x25\x78\x0e\x16\x73\xba\xda\xa4\x9d\x3e\x13\x0f\xf5\x17\x3f\xc7\x5d\x49\x9a\x4a\x9b\xad\xef\xbc\xa4\xcf\x79\x8a\x92\x9a\x10\x3b\x89\xe6\x10\x5c\x78\x02\x90\x6c\xb2\x6d\xe0\x7a\xfd\x10\x6f\x9d\x54\x2f\xc9\x84\x9a\xe0\xd9\xf6\x30\x14\x09\xbf\x3b\xc1\xa0\xc3\x62\x28\x6c\x7d\xce\x2e\xc5\xef\xac\x5b\x4a\x74\x69\xc6\xf4\x0a\x5e\x70\x8c\xbd\x46\x58\x83\x1e\x07\xda\x5d\xe5\xca\xdb\x79\x66\xfe\xd6\x23\xd4\xce\x0c\xe3\x12\x16\x02\x83\x38\xcb\xbb\xc4\xaa\x92\x2b\xc1\xdc\x91\xcf\xe6\x51\x40\x9a\x8b\x67\x07\x46\xdd\xdd\x3b\xb0\x32\x16\x07\xc8\x79\xb3\xbe\xf6\x20\x90\x25\x5e\xf8\xe6\x9d\x23\x84\xbe\x3b\xc3\xf3\x3b\x28\xce\x9a\x71\xd9\x1a\x76\xfc\x89\x22\x22\x53\xcd\x85\xfb\x15\x47\xe3\xce\xb5\x1c\x1a\x17\xc2\x8e\x5a\x78\x6b\x3a\xcc\x05\xb7\x06\xe3\x8c\xbf\xe3\x3c\x33\x95\xdf\x30\x32\x10\xce\xba\xa3\xa3\x4c\x83\xab\x1e\xcf\x2b\xfe\xc8\xbe\xbf\x32\x3f\x86\xf2\xdb\xb5\xac\x3f\x09\x17\xa1\xab\xc3\xf8\xd1\x7b\xd6\x2c\xbd\xd9\x44\x53\x81\xce\x92\xd0\x4a\x0b\xf2\x63\xa7\x55\x2d\x29\x53\x1e\x29\xa8\x33\x6e\xcc\x40\x3d\xd6\x95\x80\x79\xdf\xfc\x46\x7f\x1e\xcb\x6b\xfd\xc5\x72\xbe\x8e\xa3\x31\x30\x15\x72\x04\x07\x33\x5d\x25\x2e\xa4\x6b\x25\x87\xbc\xf1\x9b\xa5\x2b\x3c\xa1\xae\x13\x95\xe2\xda\x59\xf3\x8e\x6b\x96\xe7\x37\x54\x48\x57\xff\xc2\x88\x95\x3c\x52\x21\x81\x01\xd2\x1f\x0c\xa9\xdb\xaf\xa8\xe8\xfd\x97\x01\x01\xd9\x00\x21\xe7\x11\x96\xc2\x5d\xc9\x21\x03\x3d\x10\xf0\xa2\x3f\xec\x17\x4a\x79\xe2\xbb\x5e\xc9\xd7\x47\x89\xb6\x28\x13\x7c\x6d\xe8\x33\x58\xb4\x81\xbd\xd6\x45\xe8\xa0\x98\x9b\xe1\x91\xed\x08\xf9\x00\x06\x92\x3d\xe6\xbd\xb1\xa0\x76\xb4\xbe\xa7\xa6\x3c\xf4\x83\xbb\x86\xc0\xeb\xfb\x61\x59\x1b\x4f\x3e\x1d\x8f\x26\xed\x31\x0b\xe9\x7d\xea\x82\x1c\xc9\x4d\xb3\x85\xb1\xdb\xd8\x8e\xd0\x3e\xbe\x62\x0f\xff\x39\xaa\xa8\x5b\xe4\xa9\x6c\x45\xb5\x34\xc5\x34\x2a\x27\x12\xdf\xc6\xb9\x3c\x65\x60\xa7\xcc\x6e\xa1\xf7\x1e\xc3\x12\x1c\x3d\x09\x7c\x47\xb0\xd7\xe3\x52\x29\x85\xd6\xaf\xb6\x5b\xe6\x2b\xf5\x8e\xc4\xbb\x9f\x75\x96\xa0\x87\x90\x94\x13\x25\xdb\x8a\xed\x8b\x27\x5c\x95\xb8\xf7\x28\xa6\x34\x34\x92\xea\x4e\xd0\x4e\x47\xa8\xf6\xf3\x27\x0c\xe7\x30\x0c\xae\x5a\x79\xda\x2c\x0d\x41\xfe\x72\x02\xd2\xb0\x35\x10\xcc\xbf\xb6\x5e\x3d\x22\xf6\x65\x46\x2f\x5c\x05\x0d\x36\x17\x9c\x74\x2a\xad\x27\x1c\xb9\xda\x54\x95\x89\xbb\x06\x87\x62\xa7\x44\x3d\x5b\xfc\xb2\xa2\xe0\x2b\x8a\xe4\xe7\xae\x64\x04\xba\x52\xf4\x27\xd1\x66\x20\x6e\xfd\xda\x4e\xc9\x6f\xa4\x4c\xc3\x9b\x12\xc8\xe3\xc7\xd3\x42\x4f\x0f\xf5\xf9\x47\x82\x89\xe2\xf7\x03\xb8\x47\x38\xc2\x26\xfd\xcc\xb0\x6d\xd5\x16\x02\x92\x6e\x27\xd5\x1f\xcb\xf7\x72\xda\x1b\x72\xb0\x0e\xcd\xc9\x39\x6b\xab\x7f\x1f\xaf\x0e\x88\xd2\x2a\xdf\x4f\xb4\xa9\xbb\xbf\x97\x9f\x31\x0b\x6c\xab\xbe\x6b\xbd\x36\xeb\xb6\xae\xc8\xc0\x30\xce\x7a\xeb\x6c\xac\xb3\x6a\xab\x3e\x41\x99\x20\xe4\x16\xc0\xd8\x0f\x15\xfa\x57\x5d\x77\x14\x74\x11\xf9\x32\x52\xa3\x5c\x7c\xad\xd9\x8d\x6d\x99\xd6\x48\x7d\x8e\xaa\xc0\x1c\xaa\x7a\xd0\x23\x1d\xb8\x95\x97\xc1\x8b\xc0\xcf\x88\x68\x07\xe7\x47\xaf\x04\xd2\xbc\x8d\x68\x3d\x61\x73\x1d\x1d\x59\x16\x91\x72\x53\x92\x33\xe9\x9b\x22\x9f\x63\x76\xdd\x3a\x4f\x81\x3a\xc3\x58\xe0\xd9\x35\x1b\x17\x3c\x6e\x60\x59\x63\xd0\x29\x8d\x55\x49\x5d\xd1\x66\x8c\x3d\xea\xf1\x21\x0e\x6d\x13\xee\xfa\x4d\x67\x27\xb9\x67\x28\x64\x64\xe0\xcf\x0a\x33\x87\xaf\x6a\x53\xf7\x77\xee\xb0\xd2\x8b\x27\x09\xb6\x61\xdc\xad\x89\x8d\xaa\xb7\x95\x25\x10\x27\x0d\xa3\xaf\x09\xbb\x0b\x52\xf2\x05\x10\x83\x54\xb9\x2d\x8b\x36\xc4\x35\x3c\x24\xec\x13\x3b\xa3\x28\x46\x80\x37\x00\xeb\xb4\x47\x82\x15\xd6\xcc\x9d\xc4\xac\xd3\xc3\x59\x90\xe9\x36\xb5\x66\x3c\xfc\x08\x5e\x6c\x8e\xfc\x7b\x79\xdc\x2d\x5b\x13\x42\x67\x80\x1b\xf7\x18\xc4\x08\x8a\xa8\x2b\xc3\x99\x08\x99\x59\xfb\xb8\xc7\xdd\x0a\xc8\x5f\x9d\x8c\xe5\xba\xae\xa6\xf1\xdc\x07\x40\x54\x6c\x73\x53\x7e\x33\x9c\xc9\x33\x01\xc4\x38\xcc\xfc\xd4\x8f\xee\x63\x02\x04\x0f\x8d\x38\xf9\x07\x50\xbd\xd5\xd5\x83\x85\x39\x9e\xa4\xe5\xf3\xc1\x39\xe0\x18\x16\x21\xb1\x5e\xd4\x1d\x9f\x19\x4b\x2f\x79\x57\x3f\x1b\x81\xe1\x7e\x6d\x61\x8d\x30\xc5\x79\xaa\xe8\x14\xa2\xf6\xb9\xfe\xb9\x3c\x8f\x2c\x92\x95\x00\x85\x81\x5c\x2b\x9b\x72\x1e\x8f\xe0\x51\xa9\xc6\xf5\x1b\xf5\x38\xa1\xfc\x7c\xdb\x2b\xa0\xe4\x67\x61\x28\xa1\xa7\x56\x65\xdf\xca\xb6\xa1\xd9\x19\x5f\x3b\xc0\x31\x67\x9d\x60\xf1\x78\x58\xb6\xc8\xa0\x96\x3b\x28\x08\x9a\xd7\xf0\x0f\xc7\x6c\x94\xd4\xc6\x20\xfd\x3e\x98\xa3\x9b\x23\x97\xe3\x08\x51\xa9\x0c\xdd\x3f\x2b\x22\xd9\x84\xcc\xef\xf6\x31\xec\x38\x6e\x67\x3d\x32\xc7\x93\xc4\x49\x9a\x56\x70\xbe\xa1\xd3\xf3\x71\xc8\x05\x25\x31\xb0\xb0\x09\x64\xbf\xab\xcd\x74\x90\xf6\xa3\x44\x8a\x35\x3c\x73\x41\xa4\xf6\xb6\x6f\xfc\xc7\x29\xd6\xad\xba\x6a\x1f\x75\x71\x06\xcd\x4c\x16\x91\xc0\x1b\x7d\x76\x62\x76\xf6\xcf\x9d\x81\x3e\x53\xcc\xd9\xa6\x31\x04\x02\x07\xef\x9d\x24\xa4\x5d\xf5\x50\x78\x33\x7d\x0b\x35\xae\xc9\x8e\x7e\x20\x7d\x2e\x58\x0f\x23\x3d\x9b\x85\x4c\xf6\xd0\x65\x71\x4c\xae\x88\xa0\x2e\xae\xd6\xc7\xa3\x7e\xda\xf1\x0f\xfa\xc1\xd5\xe9\x7d\x21\x00\x03\x27\x4d\x37\x8c\x35\x76\xf3\xe8\x15\x4d\x4d\x2b\x0a\x50\x94\x80\x40\x02\x49\xb7\x20\x3b\x67\x95\x96\xce\x01\xb2\x47\xee\xd2\x6f\x47\x3f\x72\x39\x00\x7a\xf6\xb9\x91\x3e\xa4\x72\x31\xdc\x9c\x5a\x2c\x6c\x40\x54\xf1\xab\xe4\xdf\x0e\xff\x9e\xb0\x0a\x77\x09\x94\xb7\xa3\x36\x1c\xcb\x5c\x65\xdb\x28\xce\xc4\x4c\xd3\x9e\xda\xd7\x15\xef\x0d\xd9\x17\x2f\xb2\xf7\xcc\x86\x29\x96\x8e\x4a\xda\xcc\x6f\xf3\x55\x4f\x1c\x7c\x47\x56\x88\xac\xb4\x06\xf3\x76\x84\x9f\x6c\xd4\xc5\x20\x37\xe3\xf3\xdc\x07\x3d\x5d\xcd\xe9\xd9\xa7\xdf\x06\x7f\xc9\x56\x26\x68\xe5\xe9\xe8\xe2\xfa\x7e\xda\xa2\xcb\x5e\xc7\xb1\xb5\xfa\xc9\xca\xdc\x9a\x84\x7a\x77\x60\x92\xb3\x2d\x1e\xdb\x5d\xf9\xc5\x7c\x21\x28\xb4\x99\x33\x06\xb7\x57\xc8\x78\x5b\xe9\xa7\x1f\x57\x43\x48\x59\xd6\x21\xcb\x2b\x67\xf5\x75\x5b\x0f\xce\x60\x4f\xfb\xea\x18\x6c\x25\xba\x3a\x22\x30\x2f\xe6\x5f\xb6\x1b\xba\x4f\x5b\x88\x45\xf2\xde\x72\x51\x53\x47\xd1\x57\x92\x16\xf6\x38\xd6\x6a\xe6\x8a\x53\xe4\x2c\xfb\x7c\x11\x98\x3b\x84\x92\x1b\x44\xb6\xbb\xa3\xea\x3e\x22\xef\xc8\x7b\x5c\xb4\x8b\xc0\x3e\xc2\x91\x3d\x21\x1c\x98\x1a\xf9\xb8\x73\xf8\x75\xeb\x8f\x06\x06\xd7\xe1\xa1\x7c\x46\xf9\x43\x3c\xdc\x13\x1c\xf1\xfc\xb2\xaa\xf9\xb9\x51\x9b\x2a\x72\x59\xac\x1f\x1f\x95\xe8\x29\xe3\x13\xf2\x7c\x89\x83\x4a\xc6\x8c\xf6\x93\xc2\x78\xd4\x04\x58\x49\x20\x95\xcb\x00\x0a\xd5\xac\x6d\x94\x3b\x4c\xb7\x48\xf9\x58\x26\xc5\x3a\xc7\xaa\xb5\xe2\xbb\x23\x47\xaa\x1b\x00\x81\x8a\x35\x1f\x9d\x82\xba\x5e\xd0\x5a\xce\xcd\xfb\x67\x3d\x6f\x9f\x94\xee\x97\x48\xd1\x8f\x99\x85\xb4\xb6\x74\xb4\x46\x16\xbb\xa5\xe3\xdd\x73\x31\x6f\x4d\x1e\x11\xd2\x44\x6a\x3f\x26\x69\x55\xbf\x1c\x97\x46\x7c\x26\x06\x2b\xaf\x90\x87\x01\x23\x27\x8f\xa5\x75\xb1\xce\xa6\xf7\xbe\xd8\xfa\x84\x4e\xeb\x09\xd3\xa8\x83\x4d\x6d\xd7\x7d\xc9\x90\x82\x79\xf4\x00\xf7\x8d\x87\x7c\x86\x6e\x54\xe5\x27\xd8\x12\xb9\x39\xd3\x19\x8c\xdd\x4f\x96\x9c\x8a\xe9\xf6\x25\xac\x47\x6c\x8f\x09\xe9\x8c\xc5\x1d\xc0\xc3\xb5\xbf\x7e\x4c\x07\x41\x0c\xe7\x32\x09\x9a\x32\x23\xaa\xe9\xec\xa6\x91\x2b\x2b\xf8\xb8\x49\x04\x41\x8e\x7d\xcc\x3c\x68\x3c\xc9\xa5\xd0\xd4\x39\x48\xe0\x85\x56\x37\x03\xd5\xc5\x13\xc4\x7b\x14\x4e\x19\x11\xc2\x7a\x74\x73\x63\xc9\xcb\x41\x82\x60\x3b\x2d\x41\x0c\x56\x8b\x99\xe3\xae\x4a\xf1\xd6\x16\xe8\xd7\xd1\x34\xb6\xa2\x7a\xda\xcb\xa6\xc9\x0f\x59\xf2\xba\x2a\xde\xc1\x48\x28\x33\xa7\x6d\x0e\xaf\x6c\x3d\x22\xc3\xf2\xa9\x12\x3b\xf1\x9c\x3c\x18\x13\xce\x0f\xd5\x21\x4d\x45\x57\xe0\x1f\x4b\x91\x05\xae\xaf\x13\x8b\xbb\x69\xf6\x17\xe8\x53\xc3\x7d\x7b\xdf\x14\xbe\xbb\xe1\xa6\x3d\xf7\xf6\x27\xb2\x9b\x97\x8e\x7a\x71\xe0\x84\x10\xc1\xa0\x48\x92\xdf\x04\x78\xf7\x51\x03\xca\xc7\x14\xb0\x2e\x76\xb9\xb0\x3a\xfd\x0f\x3e\x0c\x2a\xbd\x49\xb1\x34\xe7\xc4\xbb\xa6\xcf\xf8\x02\x1d\x9d\x60\x18\x28\x0c\xca\x30\x00\x82\x97\x0f\x40\xc9\x08\xb1\x4a\x51\x50\x30\xa0\x1d\xc5\x11\xc3\x30\xce\x36\xc3\x63\x26\x71\x6c\xd4\x50\x08\xa9\x88\xef\x87\xe6\x20\x07\x56\x25\xee\x43\xdc\x0e\x2e\x75\xb3\x45\x1f\xdc\x3c\x0f\x43\x81\x62\xf2\x2a\x69\x90\xf4\xd0\x0f\x3e\x13\xeb\xb2\xa6\xaa\x45\x52\x0a\x00\xbf\x2f\xdc\x50\x14\xa0\x10\x5a\xcd\x68\x16\x70\xe9\x44\x76\x3d\x14\x4a\x89\x28\xd1\xb9\x98\xae\xdd\xc1\xfb\x61\xf2\x2f\x0a\xac\xd6\x12\xf8\x89\x1c\x65\x21\xf5\x03\xd1\x98\x73\x42\x33\x5a\x91\xcd\x52\xd5\x6e\xef\x72\x43\xc3\x00\x80\x16\x0a\x3f\xb4\x48\x9b\xae\xba\x27\x76\x90\x2a\x9f\xb3\x2c\x7e\x70\x38\x3a\xdf\x12\x0f\xa5\x39\xcf\xe0\x39\xa5\x8f\x86\x59\x78\xd8\xb3\x14\x76\x82\xec\xc8\x5f\x42\x99\xbe\x51\x77\xe9\xfd\x2e\x80\x04\x97\xe1\x72\x59\x43\xf2\xa2\x41\x1d\x60\xf0\x54\x2b\x7b\x96\x65\x9e\x68\x39\x41\x97\xd5\xab\x00\x27\xaa\x9b\xd9\xe8\x7b\x9c\xc7\x43\x2a\xf5\x14\x6e\xe9\xee\x78\xea\xd2\x4f\xd3\x5f\x0b\xd1\xa1\x38\x0a\x1c\xd0\x87\xf9\x5a\x1a\x6c\xa7\x1d\xea\xfd\x63\x0d\x55\x8e\x23\x61\x2d\x33\xf9\x09\xd5\x41\x3f\x84\xcc\xc0\xab\xae\xdc\x33\xff\x11\xf3\xcb\xe3\x9a\x0c\x39\x60\x6c\x60\x66\x59\x77\xcf\xa1\xcb\x68\xcb\xf3\x79\x2f\xab\x44\x02\xdd\x56\xec\xac\x5c\x86\x8e\x88\x6c\x36\xc9\xe3\x9a\x69\xbe\x1c\xb9\x7b\xf2\x78\xb9\x08\xe1\x27\x4e\x4e\xc9\x2c\x5f\xda\xbe\x66\xce\x89\x51\xa4\xeb\x41\x7e\x7c\x7f\x2f\x96\xca\x43\x70\xc3\xe3\x04\xe0\x22\x01\xbc\x85\xcd\x02\x34\xf7\x9d\x36\x04\x2c\xcd\x74\xc7\x3c\xf9\x3b\x93\x33\xf2\x4a\xcc\x9e\x52\x13\x43\x04\x07\x86\xb3\x83\x5d\xe2\x84\x60\xfb\x35\x4e\x94\xb1\xb7\xf9\x57\xb5\x2d\xaa\x9e\x43\x86\xde\x3d\x04\xce\xda\xfb\x1c\xe5\x7a\x69\x12\xe4\xcc\xaa\xa6\x28\x44\x36\x3c\xe1\xea\x40\x35\xe7\x54\x53\xe2\xba\x52\xa1\x8e\xc4\xd5\xce\xd0\xc1\x28\x88\x2f\x81\x08\x62\x97\xa1\xb3\x8a\xef\x11\xd7\x68\xba\x9a\xd3\x12\xc7\x39\x82\x94\x0e\x40\x94\x37\xf7\x77\x86\x22\x10\x55\x73\xaf\x77\xaf\x45\x1d\x96\xa3\x0d\x35\xca\xe6\x34\x3d\x41\x5a\x19\x67\x5a\x78\xfb\xef\x4e\xd8\xe9\x6a\x8f\x81\x6c\xe6\x0b\xba\xd3\xda\x33\xcf\xa0\xac\xf1\xc2\x59\xa6\x4c\x8b\x78\x95\xc2\x9a\xd1\x58\xe3\xfe\xad\x8c\x22\xab\x5e\x3b\x9b\x5a\x28\x6e\x50\x1e\x75\xc5\xbf\x51\x67\x5c\x1a\x53\xc3\x78\x7d\xfb\x43\x43\x39\x42\xbe\xd2\x86\x71\xa9\x8f\xaa\x98\x45\x9a\x92\xcc\x23\x7b\x39\x1f\xc8\x5f\x6e\x2e\x18\xfc\x8d\x56\x64\x88\x40\x9e\xb5\xdb\xec\x4d\x0c\xc8\x00\x4c\x57\x23\x1b\x6b\xe1\xaf\xea\x4d\x7e\x9e\x8d\x10\x0e\x75\x72\xb0\x1b\x57\x26\x21\xcd\xc1\x81\x81\x5a\x80\x39\x64\x5c\xb1\x90\x92\xe1\x9f\xe6\x38\x08\xe0\x22\xc0\xb0\x80\x96\x9d\x75\x25\x91\xe2\x70\xb3\x45\x83\x5e\xa7\x5b\x76\x0b\xb1\x24\x8e\x0c\x99\xec\xc3\x44\x21\x61\x9e\xfd\xf5\x34\x7f\xa4\x26\xc6\x3b\xc4\xfe\xd7\x7a\x6e\x24\xd9\x0e\x8f\xec\x0f\x93\x0a\xab\x30\xc5\xf9\x7d\xdd\xdf\x38\xf8\x7d\x7b\xbc\xb8\xf3\x7d\xcb\x4a\x3d\x2b\x7f\x27\xcc\x0e\xf3\x9d\x76\x76\xd0\x72\xfc\xf6\x12\xd6\x0b\xd2\xe0\x82\x18\x5f\x08\x67\xcf\xc2\xaa\x5b\xfd\x37\x73\xf7\x84\x49\x4f\xea\xbe\x43\x4f\x77\xb3\x06\xc7\xc9\x6c\x24\xce\xb9\x4a\x9b\x3b\x32\xe8\x81\xac\xb4\x05\x79\x51\x9e\x27\xfa\x6e\x47\x08\x5f\x38\xc7\x37\x96\x1c\x26\x06\x98\xf6\xed\xdf\x03\x71\xc4\xe6\x1e\x63\x2f\xe4\x25\xcd\x39\x92\xce\xe6\xad\x32\xd2\x71\xd2\x4b\x07\x76\xe5\x7f\x8e\xba\x33\xa1\x3c\x8a\x3e\xd4\xcf\x8d\x0b\x4a\x94\xd5\x39\x25\x49\xbe\x43\x4a\xe5\x4d\x4a\x93\x21\x6f\x47\xfc\x8d\x8f\x2c\x04\xe4\xb5\x04\x62\x2a\x83\x2e\xfb\x85\xae\xbf\xc5\xc2\xd2\xeb\x97\xbf\x34\xad\xec\x5c\xd3\x8e\x5c\x7a\x30\x17\xf2\xde\x16\xe1\x06\x2b\xf7\xbb\x1b\x2b\x4b\x2c\xde\x66\x54\x2b\x05\xa0\x76\xb6\x5a\x3a\x0c\xb6\xa5\x08\x92\xe8\x7c\xe8\xce\x52\x9b\x32\x59\x78\x80\xf6\xae\x55\x07\x6f\x87\xd8\x7c\x51\x01\x65\xf0\x46\x9f\x08\xcf\x15\x28\x14\xed\x11\xe3\x37\x68\x7d\xbe\x48\xa6\x5c\xb4\xdf\xb6\xdc\x13\x88\x00\x37\x45\x04\x73\xd0\xb5\x44\x8d\x88\x2e\x46\xb3\xcd\x0e\x11\xc4\x4a\x46\x6e\xf6\x7a\xe3\x87\xe1\x64\xe9\x14\x64\x22\xd2\x9a\x49\xde\x03\xeb\x0f\xc3\x52\x7e\x11\xb4\x51\x59\x8f\x00\xf5\x5d\x54\xba\x8f\x6d\x0f\x39\x4b\x38\x18\x25\xfc\x58\x9a\x18\x85\xcb\x32\xee\x59\xd6\xc6\xe3\x88\x76\xb2\xa6\x36\xe9\x8b\xbf\xda\x9e\x10\xfa\x40\x93\x23\x5e\xdf\x5f\x15\x79\xbb\x5a\x45\x65\x1b\xd0\x5c\x64\xcb\x61\x42\x28\x63\xeb\x76\x8c\xad\x76\xbf\x31\xd0\x47\xc8\x73\xb7\x5d\xb6\x67\xc1\xed\xaf\x86\x78\x22\x0c\xab\x2a\xde\xf9\xa6\xf2\xa4\x09\x05\x5e\x45\x56\xf7\x36\x1e\x1e\x63\xb6\x84\x82\xce\xc0\x59\x2a\xd0\x15\x7d\x7e\x94\x1a\xfd\x99\x2b\xbc\xbc\xbd\xeb\xdb\xf5\x21\x56\x9f\x7f\xf9\x8c\x89\x42\x2c\x87\x73\x2c\x23\xc9\xc5\xc1\xea\x3a\x4c\x4f\xe2\x2b\x41\x16\xcb\x28\x7e\x02\x5b\xfa\x6e\xdb\x86\x38\xe3\x36\xee\x7d\x6e\xb8\x18\xd1\x0a\xef\x9d\xe2\x49\xdb\x4e\x7f\x17\xc5\xb0\x47\x38\x3e\x01\x99\x47\x84\xab\xd6\x14\x22\xb2\xbe\x20\xfb\xa4\xf6\xf3\x91\x19\x81\xf6\xaf\x5c\xba\x78\xe3\xa7\x0b\x31\x48\xf9\x90\x1d\x2b\x06\x6a\xf2\x13\x08\x5e\x05\x2c\x4c\xa6\x87\x7d\x1f\xb5\xb0\xb3\x16\x77\xad\xf8\x8d\x93\x29\xe2\x07\xd5\xe6\x20\x4a\x9d\xf8\xc4\x75\x19\xe3\xb5\xe4\xc0\x38\x01\xad\xc5\x31\x1e\x66\xb2\x08\xe9\x24\x8b\x3e\x2a\xb8\x69\x56\x98\x7a\x30\xb0\xc7\xc9\xf5\x9a\x2e\xb6\x23\x68\xb6\xd4\xa9\xe8\xe7\xb8\x7c\x49\xe3\x66\xe6\x77\x68\xc2\x88\xad\xd4\x21\xae\xf2\x7a\xfe\xca\x43\xaa\xe6\x9c\x6a\xc0\x52\x17\x2c\x30\xc6\x95\xd1\x45\x6b\x6f\x94\x64\xef\x62\x26\x31\xa8\xf7\x5f\x5d\xa2\x8c\x3c\x52\xcd\xa3\x33\xd5\x36\xf3\x1d\xb7\x9d\x99\x18\x42\x1a\x94\x37\xe3\x2b\x95\xde\x14\x75\xf7\x40\xe7\xaf\xae\x7f\x8f\xee\x46\xb5\x9e\x24\x8c\xe8\x55\x1f\xef\x25\x44\xf4\x36\xc8\x40\xe4\xba\xc2\x52\x07\xb7\x1b\x1a\x3c\x22\x36\xc3\xf9\x59\xce\x14\x6b\x42\x3d\xab\x35\xc0\x8d\xf2\xe1\xe1\x23\x1a\x63\x73\xf4\x71\xe8\x72\xae\xdd\x07\x9d\x22\xfb\x9d\x9b\x70\xea\xcd\xe5\xa2\xf4\xba\x75\xaa\x1c\x5a\x36\xf1\x1a\xe1\x19\xc2\xd5\x1e\x68\xbf\xbe\x01\x8c\xf6\x95\xa9\x41\x73\xf5\xe8\x65\xdf\x69\x56\xd9\xf5\x40\xb4\x2e\x3c\xaf\x0c\x46\x16\x72\x82\xdd\x11\xed\xca\x18\xfa\xf9\xb0\x4b\x95\xd4\x12\x71\x8c\x4c\x93\x8e\xc5\xb7\x11\x85\xb4\xd7\x02\xc8\x19\x84\x8d\xcf\xb6\x6d\x25\x55\x7f\x98\xc8\x59\xa3\x36\xc9\x4c\x3c\x22\x38\x35\x32\x33\xc5\xc1\x48\xaf\xb4\x9f\xe5\x70\x1c\xc4\xda\xd3\x3e\x93\x85\x75\x8f\x5e\x52\xf8\x79\x92\xf3\x71\xf8\x16\x39\x18\xbe\xc3\x38\x2f\x83\x61\x9f\xff\x62\x3f\xad\xc9\x88\x29\x06\x6c\x0a\x3c\x9f\x62\xc7\x8b\xdd\xc7\x2e\xfe\x64\x34\x9b\xae\x7c\xa4\xf2\x53\xab\x73\x49\x22\xd0\x59\xa5\x93\x30\x0b\x0b\x9d\xce\xc1\x4a\xc7\xe7\x77\x78\xfd\x16\xd3\xe8\x75\xa7\x42\xb2\x47\xa4\xac\xeb\x7d\x50\xcf\xf2\xa7\xb6\xe7\x77\x0c\x35\xcc\x9a\x41\x71\x1d\x6d\xb0\x7c\xc3\x5a\x5d\x91\xe6\xd3\xa9\xfb\xa1\xad\xda\xd4\xa5\x3c\x90\x4c\x8e\x4f\xd1\x92\x09\x73\x14\xde\x31\xc5\xcc\x97\x9a\xea\x52\xba\x5a\xf8\xfe\xcb\xd4\xfb\x37\x51\x20\x01\x90\x19\xc4\x10\x3f\x4e\x81\xed\xfb\xc1\xd9\x49\xa7\x3e\x62\xbb\x65\xe9\x39\x63\x0f\xab\x8c\xc4\x22\x29\x11\x3f\x28\x76\x99\x3d\xa3\x01\xcb\x6f\xbf\xc8\xa4\xab\x74\xb6\x5a\x57\x31\xa3\xe9\xc9\xb4\xbd\xc1\xd0\x0e\x6a\x46\xc3\x67\x96\x8a\x89\x67\xd2\xa0\x0c\xa5\xe7\xfe\xd1\xaf\xfb\x8c\x1b\x15\x19\xdc\x7e\x6b\xb6\x91\x27\x94\xfc\x13\x70\x4f\x18\x37\xa1\xd7\x19\xb4\x5f\xd5\xd9\xe2\x1f\x18\x9d\x5e\x98\xe2\x99\x8d\x48\x70\xe0\x28\x3f\x40\x19\x72\xae\x69\xce\x50\xf7\x80\xc3\x2f\xb0\xdf\xd1\x6a\x2d\x48\x31\xa6\xc4\xe3\x9a\xff\x8e\x8f\x14\x26\xf9\x49\x85\x96\x26\xe5\x7c\x9c\x4e\x8d\xf6\xa2\x13\xdd\xb7\xc5\x97\xf1\xb2\x6e\x3e\x72\xc8\x9b\x6a\xc7\xdd\x07\x0c\x16\x4c\x99\xbd\xb2\x70\xb3\xe5\xf4\x93\x47\x23\xca\x43\xee\x9a\x4f\x1f\x7d\x5b\x20\xd1\xd1\x58\xac\x14\x1b\xb7\x99\x6d\x9e\x0a\xa6\x93\x89\x59\x69\xb0\xdf\x73\x8f\x67\xb2\x9f\x97\x24\x7f\x24\x44\xe6\x00\x81\x90\xc7\x65\x16\x19\x49\xa2\x2c\x3a\xa1\x07\xaa\x58\x63\x55\x56\x36\xf1\x94\x9d\x3f\x38\x58\x10\x9e\x45\xda\xe5\xa4\x02\x12\xd4\x2f\xf5\x87\x22\x8b\x86\xa4\x85\x0f\xc9\xcf\x54\x3b\x70\xba\x6f\x5f\x53\x96\x68\x4f\x79\xb1\x24\xda\xfe\x7e\xbf\x85\xd6\xba\x72\x28\x82\xc3\x14\x04\xa1\x86\x14\x7a\x31\xbd\xd6\xc1\x7e\x04\x1d\x89\xd5\xd2\x70\xf1\xe5\x61\x36\x57\x4c\x7c\x31\x24\xcf\x1c\x3a\x4f\x43\x31\xb4\xa7\xee\xaf\xaf\xe8\x6d\xbe\xf5\x0f\x8f\x41\x5d\x74\x12\x62\xe4\x4f\x2f\x5c\x7a\x2c\x80\x67\xee\x8a\x4b\xd2\x0f\xd4\x8d\x2e\xe7\x53\xcf\xcf\x3b\xda\xaf\x46\x45\x74\x92\xa6\x2f\xc9\x7d\xe7\x1b\x53\x36\x89\x8b\x50\xf4\xb2\x55\x3d\x25\xf7\x51\x9a\x43\x8b\x8a\x66\xa3\x31\x58\x15\x94\xae\xe5\xcb\x44\x8e\x4c\x7c\x9d\xaa\xfb\x8e\xfb\x2b\x3c\x7e\xa9\x00\x5d\xf6\x0a\x5b\x37\xa1\x88\x5c\xf1\xe9\x54\x4b\x3c\x1c\xef\x2a\x24\xc2\xb4\x94\x1d\xad\x72\x5f\xa9\x8c\x63\xe0\x12\xfe\x39\x53\x39\xf1\x03\x30\x66\xc7\xb7\x2d\xb9\x03\x3a\xed\xcc\x2a\x87\xcf\xa4\x2b\xfc\xb3\x03\xa3\xfc\x99\x30\x04\x2f\x29\x28\x31\x57\xc6\xdc\xec\x74\x13\xd1\x30\xae\x26\x4c\x85\x4b\x81\x4b\x36\x0d\x9b\x94\x18\x15\x82\x33\xa5\x9a\x4c\xb1\xd4\xbd\x5e\xed\x15\x79\xc7\xf8\x45\x93\xb4\x0c\x13\xed\x38\xcc\x64\x38\x02\x9d\x86\x36\x8d\x2e\xa8\x2c\x95\xc0\x6b\xa0\x93\x77\x77\xaf\x56\x09\x28\xde\xf5\x22\x70\x60\xe5\xbd\x68\xe6\x73\xb5\xab\x75\x65\x98\x82\x11\x16\x7d\xd6\x0b\x01\x88\x1c\xef\x52\x79\x3e\x3f\x5a\xc2\x13\xf0\x35\xd2\x21\x76\x1d\x48\x2b\xc1\x3e\xa4\xe6\xab\x7a\xab\xcc\x2f\x26\xe0\xbc\x13\x1d\x7f\x59\x16\x37\x9f\x61\xb7\x1d\x88\x3a\x2f\xd3\x67\x68\xcd\xe4\x33\xe5\xb1\x06\x20\x28\x44\x13\xb4\xa4\xae\x3b\x17\x0e\x52\x31\xa6\x0c\xc2\xbb\x3d\x72\xb3\x71\x39\x87\xb9\xd0\xb6\x25\xd4\x96\x36\x42\x2d\xaf\x90\xde\x12\xdf\x27\xb3\x10\xd2\x96\x4c\xe0\x67\xec\x74\xf5\x34\x13\x9c\x59\x29\x66\xbb\x0e\xe6\x7a\x2c\xff\xc4\x5a\xa4\x74\x49\x46\x9e\x1e\x86\xae\xde\x96\x99\x41\x31\xf4\x22\x8a\x23\xa7\x89\xb5\xad\x15\xa7\xc0\x01\x18\x80\xc4\xe7\xa1\x48\x9d\xac\x7b\x69\x76\x7c\xa2\x94\x0f\xf3\x8d\x5a\x86\x12\x5b\x18\x83\xdb\x20\xc0\x45\x73\x77\x5e\x93\x77\x3a\xfe\x41\xd8\x1e\xc8\x55\x27\x07\x12\xf3\x4a\x6d\x37\x2d\xc8\xd9\x48\x78\x2b\x17\xb2\xc4\x9a\xe2\x9b\x51\x48\x66\x19\x44\xb5\x10\x96\x70\xcb\xdc\x3c\x84\xd2\x0a\xb5\x56\xa1\x2a\xe5\x01\x3f\xf5\x4f\x58\xa4\xaa\x1f\x11\x48\xb2\xc3\x95\xcd\x2c\xe5\x46\xed\x3c\xd9\x4f\x24\x4f\xf5\xfc\x45\xde\xa6\x68\x7a\xbf\x1e\xf5\xcf\x4c\x25\xd5\x00\x74\xb1\x26\xc0\xc4\x29\x6a\x67\xb0\x61\xe3\xc8\xa2\x1f\xed\xc6\x69\xf9\xac\x29\x31\x58\x70\x5b\xb4\x7e\xce\xe6\x93\x87\xd6\xfc\x6d\xf3\xb6\x7f\x99\x9b\xc8\xbb\xa8\x56\xf4\xb1\xc5\x7f\xad\x0f\xc9\x57\xcb\x7e\xe6\xc4\x9f\x97\x25\x0e\xd5\xb5\x66\xa6\x33\x41\xd1\x31\x92\x85\xa0\x06\x53\x27\x47\x57\xc0\xb8\xa1\x84\x66\x15\xf7\xdb\xab\x94\x41\x3d\x4d\x47\xca\x61\xc3\x90\x88\xd5\x7e\x87\xf0\x1a\x78\x62\x21\x58\x17\x39\x8f\xba\xf6\x88\xb6\xf0\x13\x90\x59\x00\x3b\xaf\xeb\x68\xec\xd9\x2b\x78\x4b\x1a\xf5\xc2\xcf\x4a\xf2\x95\x0f\xd5\x63\xe1\x59\xa9\x30\x86\x40\xed\x55\x4c\xe0\x88\x16\x13\xf8\x14\x63\xb4\x67\x9c\xc2\x3b\x64\xc7\x06\x67\x18\xb1\xb3\xed\x3c\x5f\x42\x73\x7f\xa0\xad\x28\x0d\x4d\x64\x12\x9e\x93\xd7\x2f\x2e\x7c\x41\xe5\x50\x06\x8d\x9c\x19\xc3\xe8\x9d\x7b\xee\xad\xee\x00\x8f\x39\x1c\x0f\x7d\x1a\xee\x43\x9b\x16\x65\x27\x07\x9c\x4f\x51\x12\xde\xe8\xe6\x81\xac\x1d\x56\x44\x0a\x51\x19\xa5\x52\xf2\xd8\xdb\x9c\x2b\x92\xdd\x38\x9e\x8c\x47\xcc\xb1\xd4\x8a\xde\x9f\x34\x1a\xab\x6a\x7e\x40\x5f\xd9\x84\xa9\x2b\xb3\xd2\x82\x02\x1d\x39\xa0\xb0\x5d\xb5\xd8\x38\x82\x2b\xde\xc2\xab\x25\x19\x43\xd9\x82\x49\x50\xfa\xce\x67\xb6\x68\xb0\x06\x0b\xd0\xc4\xc2\xc1\xd6\x54\x85\xa8\xf6\x4f\xc1\x22\x4a\xfa\x28\x64\x07\x11\xf0\x06\x1b\xb0\xff\x50\x4a\xff\x00\x64\xaf\x6e\x02\xcc\x5b\xc0\xd2\x68\x29\x5d\x7d\xf2\xf5\x02\x5b\x0a\x8e\xac\xec\x34\xe4\x07\xdb\x99\x3a\x2c\x16\x9f\x75\x56\x3b\x97\x4f\xb7\x54\x76\xec\xdd\x53\x19\x7e\x45\x3f\xd0\x0a\x1f\xdd\x6f\xca\x28\x46\x40\x87\xc6\x5d\x50\x97\xf6\x22\x97\x96\xde\x2a\xe0\x2b\xfc\x88\xbc\xfb\x1a\x1a\x12\x40\x36\x0c\xac\xfa\x5a\xbe\xb4\xec\x4b\xad\xa3\x89\xd0\x33\x38\x01\x18\xde\x3f\x10\x8d\xd0\x07\xb2\x99\x05\x93\xa1\x5d\x35\x56\x9a\xb2\xce\xe9\x00\xd6\x7a\x60\xd9\xc1\x07\xe7\xe6\x53\x47\x03\x41\x4b\x32\x0e\x1b\x6a\x19\x62\x09\xf9\x61\x98\x19\x15\x3e\x6c\x75\x9b\x83\xb0\xfb\xbc\xd5\xef\x44\xa0\x9b\x06\xa3\x04\x32\xfc\x10\x13\x6e\x29\xf3\xa1\xf2\x4e\x14\x40\xca\xfb\x81\xea\x0b\xf5\xa7\x06\x56\x23\xe5\xa1\x2a\xa5\x95\x19\x06\x46\x50\xb1\x83\xcb\xd5\x21\x75\x39\xe1\x4e\x9d\x57\xad\x18\x6e\x98\x88\x6a\x16\x07\xa6\xdb\xf4\x01\x11\x81\xd2\xc3\x98\x5f\x45\x36\x39\xc2\x36\x9e\x48\xad\x47\xf9\x50\xcb\xc7\x26\x5a\xe6\xc7\x0a\x9a\xe7\x0a\x46\x6f\x51\x7b\xaf\xd1\x88\x6b\xbb\x00\x2c\x60\x77\x47\xb3\x5e\xc0\x6c\x69\x10\xf7\x3d\xb1\x0e\xdb\xd6\xe1\x12\x4b\x15\x76\x94\x9a\xc2\x96\x4b\xf5\xf2\xda\xb6\x6a\xf5\xe2\x96\x46\xc4\x70\xdd\x1a\x38\xa8\xf3\xc1\xd9\xb1\xc6\xf5\x46\x91\x43\xe0\x86\xbe\x82\xe9\x0e\x53\x27\xe1\x7e\x13\x2e\xaf\xb1\xec\x7c\xa6\xc5\xb7\xad\x0d\x46\xac\xa0\x8b\x98\xec\xc6\x54\xaf\xeb\x42\x5f\x69\xc6\x45\x19\x12\x7e\x2b\x43\x6a\x47\xc6\xa7\x17\x0c\x5f\xdd\x66\x93\xe9\xbd\xc5\x86\xb1\x5c\x69\xa2\xea\xe1\x48\x25\x07\x7e\xa7\x59\xfb\x2c\x7b\x6c\x0b\x42\xf2\xd5\x58\x7e\x5a\x76\x22\x80\x09\xd8\xe0\x15\xc7\x36\xc4\xbc\xd1\x7b\xf5\x52\xbf\x13\x07\xfd\x47\x55\xc9\xf9\xa2\x28\xa1\x8a\x38\x05\xfc\x58\x30\x1e\x1b\x09\xca\xdb\x20\x34\x9b\xc6\x75\xef\x7c\x83\x51\x50\x2b\x9e\xcc\xfa\x31\x06\x4a\x39\x88\xd6\xd3\xea\x86\x36\x71\x75\x49\x1f\xd2\xcd\xe0\x4e\x3f\x67\xd7\xfe\x8e\x69\x30\x89\x52\xe1\xd7\x33\x8f\xc4\xa8\xde\xc9\x21\xfa\xc3\xb9\x25\x88\x8f\x56\x14\x69\xc9\x63\x0d\x02\x40\x00\x90\x43\x5a\xac\xa0\x9a\x6f\x0c\x38\x7d\x70\x88\x7a\x49\x95\x95\x5b\x4a\xd8\xe4\x96\x1f\x73\x79\x23\x24\x10\xea\x40\x35\xff\xca\x2f\xb3\x7e\x21\x0c\xee\xb4\x15\xc7\x51\xb0\x95\xc3\x6b\x16\x37\xa5\x00\xba\x94\xf3\xa9\x12\xf0\x52\x34\x0c\x4f\x8e\xb7\x1d\x81\xb0\x29\xd8\x1c\x3b\x58\x00\xd1\x3e\x11\x26\x9f\x6a\x67\xcc\x77\x69\x0d\xa0\xc9\x3c\x92\x66\xb1\x4b\x92\xfb\x52\x99\x4b\x7b\x08\x27\x22\x4f\x65\x80\x9e\xdb\x87\xfd\x71\xfb\x2c\x1d\xfe\x2a\xa5\x65\x71\x3d\x3b\x9a\x75\xdf\x35\xb5\x2a\x5b\x5a\x87\x78\xcb\x1d\xc6\x42\x8e\xa1\x50\x7c\xca\x48\x5c\x72\x29\x35\x3f\x09\x4b\x03\x96\x7d\x11\x6b\x4e\x23\x3a\x0e\x30\xf5\x19\x02\xe0\x37\x42\x6d\x7d\x94\x55\x2b\x97\x18\x47\x2f\x5f\x11\xca\xa2\x58\xfa\x43\xe2\x64\xcb\xd7\x5d\xd7\x3a\x36\x06\xab\x1f\x58\x1b\xb4\xe2\x49\x37\xdd\x93\x20\xbb\x2f\x7c\xa6\x49\xc3\x7c\x39\xb3\x13\xe1\xc3\x9c\x87\xea\x92\x66\x99\x0c\x11\x84\x6a\x5b\x72\xcc\x5a\x04\x32\xfd\x53\x4a\x91\x97\x43\x98\xe2\xfc\x31\x0c\x11\x34\x3c\x0f\x50\xdc\x46\xcc\xd9\xe6\xb0\xb0\xbd\x3c\x08\x97\x84\xa3\xd8\x07\x5e\x2f\x1c\x17\xb9\x03\x5d\x95\xa9\xff\xe8\x60\x68\x6c\x94\x4d\x71\xa6\x98\x05\x0b\x07\x1e\xf8\xc8\xc2\x65\x9c\x33\xfb\x16\x48\x49\x80\x9b\x0d\x16\xf6\x97\x10\x86\x23\xb6\x0c\x5c\xb3\xd7\x96\x59\x17\x7d\x68\x14\x1e\x0a\x92\x37\x89\x7b\x78\x09\x37\xb3\x5c\x80\xf5\x75\x3f\xbf\x76\xa5\x17\x9c\x51\x65\xb3\x5c\x50\x4c\xa5\x2f\x06\x87\x1e\x5e\x86\x0b\x6c\x4e\xbc\x3e\xc5\x44\x04\x67\x1c\x3e\x28\x75\x21\x35\x37\x1a\x50\xdb\xcc\x0a\x9e\xd8\xd2\x69\x88\xd2\xb8\x83\x89\xec\x57\x22\x22\x10\x22\xac\x79\x4d\xa6\x8c\xbc\x48\x17\x85\x46\xfb\xa2\x56\x86\x1c\x1f\x88\x67\x54\xfd\x31\x3c\xff\x8b\x5b\x9a\x61\x95\xad\x67\x63\x05\x0b\x75\xc6\xe7\x24\x7e\x90\x98\xc5\x03\xbf\xe1\x35\x71\xd2\xaf\x3d\x68\x6b\xbe\x70\x8f\x32\x76\x69\x21\xee\x9c\x3e\x57\x5a\x83\x8e\x71\x0f\xa9\x4e\x8c\xba\xee\x5b\x18\xbb\x70\x9a\x77\xfc\x47\x04\x74\x3b\xb0\x38\x55\x73\x17\x34\x91\x53\x2e\x13\x53\x47\x1f\xe1\x02\x16\x04\x5f\xcf\xc2\xc7\x29\xf7\xdd\x97\x30\xfe\xcd\xbd\xb6\x9a\xa8\x74\x65\x53\xef\xb3\xf0\x4b\xc4\xd2\x0e\x82\xe3\x68\x6e\x65\x50\xd3\x9e\x2f\x02\xb4\x70\xac\xdf\xde\xaf\x53\x59\x47\x9e\x2c\x4c\xf8\xb2\xf7\x69\x9a\x06\x55\xce\xa2\xfd\x05\xf6\xa0\x0c\x44\x3a\x6e\x9e\x68\xc9\x3c\xc8\x12\xde\x22\x1a\xb0\x83\x44\xd2\xe6\x2c\xea\xe3\xb1\x91\xb1\x8a\x3e\xe8\xe6\xda\xcf\xec\x78\xe9\xe3\x73\xf2\xcc\x29\x40\x06\xca\xa0\xa8\x40\x52\xf5\x8a\xeb\x5a\x63\x2a\x45\x8e\x5e\x46\xb6\x68\x52\x20\xc5\x3a\xfe\x2a\x3f\xac\x5b\x15\x61\x4c\x94\x90\x3c\xcd\x22\xd5\xd2\x54\x38\xa8\xf6\xf1\x98\x79\xc5\x4a\x0d\x35\x5e\xef\x6b\x5e\x3e\xc2\x33\x8a\xbf\x52\x9a\x02\x2f\x09\xdf\x99\x55\xad\x54\xa9\x30\xcf\x44\x3f\x45\x5a\x99\x3d\x68\xbe\xc1\x0f\x3c\x01\x57\xbc\xb7\x0b\xda\xf9\x95\xc7\x65\xfc\x61\x5d\x28\xd1\xea\xf3\x36\x65\xa4\x36\x03\x43\x97\x63\x25\x39\x1b\xa2\x0a\x5c\x92\xee\x2c\xf2\x63\xc2\x9b\x1d\xeb\xa1\x62\x2f\xc7\xe1\xcb\x14\x70\xd6\xcb\xd3\x0c\xa3\xde\x32\xad\xa3\x4e\x08\xd3\x24\x53\x72\x6d\x60\xdc\xe2\x9f\xaa\x8a\x3b\x68\x6d\x4f\xc1\xe1\xeb\x1c\x36\xb6\xd9\x00\x17\x2f\x24\x95\x25\x8f\x1b\xc4\xc2\x63\x1c\xd0\x2f\xf4\x3b\x90\xf0\x10\xaf\x55\x7a\x19\x9c\xae\x32\x19\xc9\xb5\xfc\x37\x85\x44\x3d\x43\xcb\x69\x44\xf5\xe8\x8f\x60\x9f\x21\xa7\x3f\x95\xcd\x3e\xa9\x99\x98\x5e\x6f\x9e\x0b\xf2\x8d\x14\x98\x7b\x62\xc8\x1e\x74\xb4\xb1\xc9\xf1\x97\x11\x4c\x74\xc5\x62\xa8\x42\xe3\x8c\x8b\x69\x18\x16\x74\xe9\x1f\xd9\xd4\xd3\x5a\x1a\xba\x02\x41\x3c\x5e\x3e\x5c\x4b\x42\x7a\x66\x4f\xe6\x22\xb2\x49\xb6\xbf\x7b\x57\x75\xb3\xd8\x1d\x53\xaa\x6f\x1b\xab\x53\x15\xbd\x6c\x85\x81\xc3\x51\x2b\x6e\xcf\xdc\x65\x63\x02\x1f\xc9\xb8\x2f\x95\xad\xf3\xb8\x5c\xb4\x19\xeb\x6d\x0d\x44\x34\xc8\xbe\x36\x0b\xd9\x56\x44\x2f\x04\x40\x43\xb5\x6d\xc7\x9c\x14\x44\x16\xfb\x48\xbc\xa0\xe6\x7b\x9c\xb5\xe7\xa2\xcc\x18\xe3\x52\x1a\xdb\x08\xd2\x2c\x87\xeb\xfa\x07\x9f\xa4\xd2\xd9\xac\xe0\x41\x7c\x7e\x9a\x96\x0e\x32\xaa\x5f\x7c\x6c\x2e\x40\xb4\x98\x51\x5e\x80\x40\x2b\x48\x1e\x06\x41\x50\xd4\x95\xce\xd7\xdb\x0a\x7f\x20\x98\xc4\xc9\xa5\x18\xf0\xb5\xa9\x48\xb3\x28\xb5\x97\x46\x5a\xe0\x45\xc4\x71\x28\xf8\x9d\x14\x04\x1f\xb7\x4f\x7b\x09\x60\x07\xf7\x55\x54\x81\xfe\xb0\x75\x08\x7d\x73\xe3\x60\x09\x20\x4d\x96\x66\x35\x7f\xf2\x61\x6a\x5b\x49\xf3\xdb\xad\xeb\xe6\x74\x16\xcc\xfe\xb3\xa6\xda\x6d\xa2\xb2\x62\xf2\x9f\x8a\x7d\x0c\x4c\x44\x03\x1e\x69\x2f\x57\xdc\x69\x30\xf7\x6b\xc4\xaf\x04\xee\xf8\x5a\x99\x0c\x72\x58\x58\xeb\xb9\xe7\xb5\xad\xbd\xbd\x74\x6f\x90\xf1\x25\x85\xd3\x6d\x6c\x14\x87\x64\x1a\xe2\x04\x84\xc9\x90\xdd\x94\x4a\xa7\x40\xeb\x8c\x04\x5e\x64\x68\xdd\x6a\xc4\x50\xaf\x04\x4e\x38\x3e\x08\xe2\x2f\x08\x1f\x5f\xf0\x8a\xeb\xaf\x8a\x94\x90\x2b\xe3\x9d\xbc\xc6\xdf\xfa\x71\x99\x47\xe5\x38\x6c\x69\x13\x1c\x5e\x41\x2e\xec\x2f\xa2\x8f\x72\x84\xd3\x64\x0c\xbe\xc6\x4f\x1c\xd3\x6a\x32\x7c\xb0\xff\x18\x85\x45\x9f\x1e\x7e\x5c\x25\xe9\xb8\x89\xb8\x8d\xa1\x92\x53\x1a\x76\x9f\xef\xc0\x00\x9e\x35\xf2\x59\x03\x92\x99\x91\xad\xda\x25\x20\xa6\x84\xbe\xa9\x66\xc0\xf7\x42\xc7\x52\xc4\xd9\xd2\x34\xf2\x6a\xc2\x17\x7a\xf8\x82\xee\xd2\x0a\x99\xf6\xe1\x0b\x0d\xb5\xea\x96\xe4\xdf\xb6\x35\x55\xce\x7c\x3f\x5b\xc7\xa0\x5f\x64\xea\xb7\xc8\xc6\x59\x84\xf1\x44\x47\x33\x16\x6d\x51\x1f\x64\x88\xd9\x92\x16\x9b\x15\xdb\xf1\xf7\xcb\xcd\x1c\xbd\x3b\x9e\x02\x07\x45\xa3\xd9\x1f\x93\xa3\x98\xa1\x9c\x3a\x3b\x71\x30\xcb\xc3\xce\xba\x08\xa8\x58\xc5\xe1\xcc\x28\xd3\xb6\xb1\x91\x27\x0a\xad\xeb\x1d\xa2\x02\x8c\x81\x34\x65\x47\xb8\x4d\x30\xbc\x07\xe2\xce\x08\x51\x7a\x71\x3f\xda\xb2\xca\xa6\xc0\xaa\xf7\xf2\xb9\x68\x49\xa3\x49\x87\xfc\xf1\xf7\xb6\xdd\xb8\xd4\x95\x87\x5d\xa8\x6d\x57\x2d\xe0\x10\xd7\xf0\xa4\xb9\x46\x0a\x1f\x65\x00\xfe\x8d\x67\xf8\x59\x56\x85\xa6\x91\xfb\xc7\x1b\x1c\xee\xc9\x0f\x4d\x2a\x36\x62\x74\xcd\x9b\x3d\xb7\xb3\x2d\x4a\x7a\x6b\x1a\xe6\x3d\x93\xe5\xf2\xe3\xf1\x26\xaf\x8f\xaa\xa3\x3d\xd5\x94\x53\x65\x98\xb3\x50\xf4\x50\xf4\x13\x8e\xa6\x61\x55\x7c\xe1\x3d\x21\x24\x22\x21\x1b\x2a\x26\xc7\x25\xc7\x44\xc3\x50\xc7\xa3\x6e\x4c\x4d\x61\x95\x2b\x4e\xe1\x87\xea\x89\xcc\xe6\xc3\x2e\x55\x28\x22\xed\x2d\x39\x61\xb5\x85\x61\xfe\x82\x78\x87\xe9\x99\x6e\x4c\xb4\x0b\x99\xc5\x49\xf1\x5c\x57\x7b\x4d\xd8\x43\x17\xb6\x71\x16\x38\xc0\x73\x5f\x98\xef\xf9\x71\x2e\x95\x75\xb3\x22\x8c\x8d\x38\x21\x71\xbb\x8c\x05\xf4\x41\x48\xef\x39\xe2\x55\x89\x23\x8c\x87\x2a\x91\x4b\xd7\xb3\x1a\xf9\xee\x8a\xc5\x14\xed\xa9\x64\xe8\x9f\x2c\xb5\x6f\x78\xbc\xd2\x8a\x4c\xe7\x93\x70\x9e\xb9\xa4\x6c\x68\xfd\xad\x18\xb1\xd0\x64\xd5\xf3\xf4\x43\x51\x85\x45\xb9\x44\x22\x0b\x71\xb4\x40\x65\xb6\x5a\x2a\x58\xe2\xdd\x4b\x9d\x68\x76\x42\xaa\x32\x3d\xd5\x8d\xe4\xb2\xd3\x62\xfd\x41\x8b\x9c\xac\x87\x60\x83\x42\x26\x0c\x47\x1c\xbe\xa9\x9e\xb6\x3e\xd1\x98\xd7\x07\xc3\x25\x8d\x5d\x32\x4d\xe7\xa4\x57\x98\x25\x19\xc7\x10\x93\xf3\x53\xf5\xdf\x20\xd9\x8e\xaf\xbb\x5c\x46\x57\xb3\xeb\x6a\xf9\x34\x2e\x8b\x0d\x62\x31\x18\xc1\x3e\x8b\x46\xd3\x5e\x8b\x4c\x1d\xde\xda\x8d\x36\x83\xfc\xe9\x03\x31\x1c\x5d\x98\x65\xfc\x92\x34\xf6\x31\x58\x32\x99\x96\xdf\x1c\x5b\x86\xfe\x7d\x86\x9a\x95\x10\x26\x33\x6f\x49\x8a\x9e\x7f\x46\xa9\xa5\xe6\x54\x16\x65\x6b\xbb\x11\xe1\xa3\x16\x95\xac\xe3\x18\x29\x05\xfc\xe5\xe1\x90\x5b\x80\xbf\xf7\x5a\x94\xa5\x80\xcf\x4b\x46\x0a\x62\x4c\xac\x8d\xc6\x9a\x94\xc0\xf8\x11\x2d\x24\x60\x2a\xc3\xfb\x54\xe9\x03\xb0\xd5\x4a\x96\x2a\x64\x4c\xf8\x95\x7e\x4d\x69\x98\x68\x21\x8f\x9c\xb1\xb4\x66\x70\xcc\x7e\x5d\xd7\xc9\xb8\xa7\x5f\x68\x79\x99\x70\x9c\x3c\x1d\xed\x4d\x16\x71\x54\xd2\x13\x9a\xd0\x37\x22\xa5\x67\xe9\x80\x95\xa9\x22\x3d\xad\x87\x86\x7f\x13\x8f\xa3\xbd\xf0\x46\x91\x37\xa5\xcf\x79\xd6\x17\x5d\x50\x71\xd0\xe1\x61\x94\x46\x1e\x21\xac\x1f\xfb\xc4\x81\x00\xb1\x2e\x73\xa6\x7c\x62\x0d\x39\xf3\xe9\xd4\x00\x59\xfd\x49\x5e\xc5\x42\x15\x89\x57\xd1\x3b\x72\xda\xca\x85\x86\x5b\x16\xfd\x24\x34\xdd\x92\x6e\xdb\x19\x84\x8f\xc6\xb3\xe6\xfb\x98\x2a\x2c\x48\x56\xc1\x80\x11\x49\x51\xf1\x35\x63\xce\x0a\x47\xee\xc9\x74\xdb\xe0\x76\x24\xb8\x0f\x40\x91\x6d\x78\xe7\xc4\x42\x71\xf7\xf8\x26\x24\xe3\x1f\xe8\x75\x94\xb7\xcc\xe8\xf8\x9b\x7c\x39\xac\xab\x8e\x9b\x4f\x22\x64\x22\xa7\x3d\x23\xa6\x27\x42\x08\x13\x39\x3a\x27\x54\x2a\xc7\x25\xc3\x7c\x4b\xf5\x6c\x03\x41\xfd\x58\xdb\x6a\x55\x48\xc9\xc7\xee\x3f\xf6\xee\x5a\x09\x63\x64\x59\x0c\xf0\x03\x29\x10\x53\x28\xd6\x2f\x66\xca\xc4\xcc\xac\xa7\x77\xed\x81\xf5\x5e\x97\xb7\xec\x72\x60\x3b\x38\x81\x12\x41\x4b\xa5\x64\xba\x67\xa6\xfa\xab\x0e\x4b\xba\xc2\xb0\x7b\x5b\x84\xe4\xb3\xeb\x16\x57\x34\x16\x4a\x03\x41\xc8\x14\x96\x0b\x0a\xf6\x09\x0e\x19\x47\x24\x95\xaf\x37\x71\x71\xc8\xc2\xb4\x4a\xd5\xf4\xfc\x92\x9b\xaf\xd2\x76\xa1\xbb\x1a\xaf\xd4\x0b\x98\x82\xb1\x07\xc9\xf1\x54\x36\x86\x17\xcf\x41\x02\x6f\xbb\xca\x52\xb7\x5b\xa9\x34\x04\x63\x10\xba\x0c\xe4\xda\x23\x80\x1d\xcb\xe8\x98\xc9\x68\x95\x64\xd6\xcd\x16\x3f\x3d\x34\x9e\xd4\x7e\xef\x4f\xbd\x05\xef\xfa\x2d\x2e\x2a\xd6\x0c\x4c\xaa\xae\x34\x4d\xaf\x2b\x21\xad\xed\x41\xd8\xa7\x9f\xb5\xb2\x83\x26\x22\x1b\x8d\x90\xb2\xba\x61\xc5\x0d\x6e\x22\xd0\x6b\x24\x17\x83\x87\x66\xa6\xa5\x10\x64\x28\xf1\x4f\x69\x70\xfd\x98\x67\x82\x94\xdd\x6c\x35\xaa\x45\x8c\xaa\xf8\x07\x6c\x3f\xe8\xdb\x4d\x8a\x27\x49\x78\x42\x6f\xd3\x1c\x69\x16\x3f\x5f\x4c\x5e\x5e\xf8\xe5\xee\xcb\xc2\xcd\xe1\xa8\xaa\x5a\x23\x42\x35\x25\xd9\x72\x95\x43\xd7\x7e\x08\xf6\x4d\xa5\x48\x54\x2b\xa3\xaf\xc0\x70\x46\x91\xa0\x35\xa5\x36\xd4\x78\x37\x60\xf3\x5a\x12\x53\xff\xad\x7f\x63\xed\x17\xdb\xfb\xf5\x67\x74\xfd\xea\xc7\xde\xe1\xb2\xca\x08\x06\xed\x97\xad\x58\x07\x75\x2a\xe4\x85\x18\xd8\xf5\xd7\xad\x63\xcc\x3d\x8e\x19\x20\x37\x32\x4f\x8d\x9f\x9d\x8c\xe8\x19\x9a\xda\x20\xb1\xe4\x1e\x4f\x5c\x9f\xdc\xd4\x60\x60\x1d\x22\x3d\x02\xe1\xc8\xee\x32\x63\x14\x38\xc9\xf9\x71\xca\x05\xcf\xc8\x00\x8f\xbe\x5a\x21\x4f\x53\xd3\x7a\x75\x2e\x12\x03\x8d\x4b\xb2\xd0\xbf\xf9\x30\xcc\x59\x94\xa0\xa4\x3e\xce\x7b\x3f\x90\x48\x79\xd8\x84\x1c\x80\xbc\x39\x4c\xef\x15\x7e\xf8\x39\x63\x05\xb6\x59\xef\x19\xa9\x1f\x45\x30\x8d\x8b\x7b\x1c\x35\xe9\xc7\xa7\xab\x12\x88\xe2\x1a\x7f\x1b\xeb\x4b\x21\x50\x38\xdc\x65\x3c\x92\x95\x36\xdf\x4c\x46\xb2\x56\x76\x8c\xa8\xf5\x80\xcb\x83\x85\x58\x8f\x12\xe5\xd3\xd0\xc8\x24\xa4\xfc\xa4\x43\x98\xed\xdc\xe1\xbd\xc5\x01\x83\xed\x8f\x31\x1c\x86\x45\x4d\x32\x7c\x19\xba\xa0\xd9\x2a\x1b\x4f\xa0\x7d\x97\xd4\x14\x1f\xbd\x30\x52\x3f\x7b\x24\xc8\xea\x67\x95\x3a\xda\xa5\xc7\x01\x04\x2d\x8f\x61\x1d\x4c\x4d\x68\xae\xf0\x1f\x69\xc4\x86\x4b\xf4\x79\x66\xb1\x38\x6a\x95\x79\x20\x82\xea\x5d\xe6\x04\x23\x9b\x05\x43\x82\xbf\x0e\x21\x5b\xff\x58\xdc\xed\x57\x18\x82\x27\x84\xa0\xd8\xca\x44\x32\x18\x42\x74\xb5\x09\x2e\x6e\x98\x28\x50\x1a\x53\x90\x2f\xe0\xa8\x22\xbc\x24\x7b\x0f\x53\x07\xb4\x00\x5e\x68\x12\x67\xb9\x7a\x9d\x2b\x16\x31\xc6\x85\xe7\x2f\xa4\xe7\x76\x13\xae\xcc\x77\x95\x64\xd4\xb0\xe5\x87\x8b\xbd\xe3\xc2\x84\x9f\x7f\xdb\x79\xdd\x99\x66\xb0\xee\xaa\xf6\x77\x43\x3e\x25\xa6\xc6\x95\x17\xbf\x93\x51\x52\x46\x1d\x9a\xa7\x0a\xab\xa2\x33\x92\x63\x08\xfd\x54\xed\x5a\x2d\x25\xff\xda\x05\xd7\x2e\x9e\x42\x83\x2b\xa5\x36\x53\x6e\xa9\x2d\x61\x9e\x6c\xea\xd3\xed\x48\x5b\x5c\x4e\xea\xa8\xd8\x7f\xa1\x89\xb0\x50\xd9\x19\x31\x91\x88\xc7\xe6\xe2\x44\x16\x59\x34\x9b\x86\x08\x8b\xc0\xdb\x5b\xba\xc6\x75\x12\x2b\xc4\x16\x20\x8a\x7c\x27\x54\xf9\xf8\xe9\x02\x26\x2b\xc3\x29\x6c\x25\xc7\xb6\x42\xc5\x54\x20\x0d\xe9\x3b\x7d\x44\xd0\x7b\x8c\x66\x1c\x11\x9e\x8b\x25\xd2\x3f\x8c\xd5\xe1\xdf\xf2\xf9\xa4\xc6\x90\x2c\x37\xf2\x3f\x26\x5c\xe9\xf2\x69\x1c\x91\xf8\x71\x25\xc4\xe1\x64\xbf\x04\xfc\x78\xfd\x06\x4a\x04\xaa\xfe\x3a\x54\x0a\xca\x2c\xe8\x3e\xaf\x1d\x21\x2d\xe3\x83\xb4\x19\xb4\x3e\x95\x44\x3a\x0c\x84\xfb\xf8\x40\xc9\x83\xa0\x2b\x07\xc0\x81\xd6\xe5\xb2\x3a\x2c\xcd\x17\x8e\x14\x6a\xa0\x17\xc5\x6c\x2f\xe2\xb8\x32\xed\x01\x8b\x24\xc9\x51\x0d\x25\xbd\x6d\xb4\x84\xe8\x16\x4b\x9b\x44\xfc\x9c\x94\x8c\x47\x4d\xbb\x8f\x6e\x19\xd6\xc7\x0f\x11\x05\x4a\x46\x78\x59\x2c\xc8\x8d\x0d\xcb\xf3\x51\x31\xdf\xdc\xea\x86\x18\x31\x03\x69\x58\xde\x43\x8c\xf5\x40\xd4\x9c\x75\x5e\xfd\x9a\x88\x5e\x5c\x5a\x57\x49\xeb\x3c\x55\x95\x43\xf5\x1e\x1e\x3d\xc5\x13\x89\x24\xf0\xfe\x01\x95\x6c\x07\xe5\x77\x74\xd2\x7b\x90\x76\xc1\x9c\x13\xcd\x17\xbe\xf4\x89\xca\x91\x32\xbf\x34\xa9\xe0\xf0\xc7\x9a\xf2\x8d\x04\xb7\xbd\x5e\x2a\xa2\x32\x57\x44\xd3\x5e\x01\x17\xbe\xdf\x4e\x09\xe4\x94\xb3\x40\x80\xee\xaf\x03\xad\xe2\x17\x60\x3f\x30\xb7\x0e\xac\xbb\xee\xd2\xd6\xe6\x2c\x0c\x84\x6d\x84\x24\x48\x60\x93\x6e\x2e\xec\x77\x1e\xc3\x80\x31\x9f\x50\xd2\xf9\x45\x53\x4c\x81\x99\xa0\xef\x4e\xcf\x91\x69\x09\x23\x12\xfd\x1a\xa5\xcc\x93\xeb\xb4\x0a\x12\xe5\x86\xdc\x29\x71\x68\xe8\xc6\x77\x25\x54\x16\xb5\xb1\x20\x47\xaf\x98\x6e\xb2\xb4\x45\x89\x1c\xe5\x6e\x59\x50\x7b\xc7\xc4\x20\xf5\xfa\x5b\x3e\x94\x2e\x4e\x98\x72\x54\x8c\x64\xed\x09\xb6\x1a\xca\x40\xfd\xdc\x9f\xae\x4b\xba\xfd\x54\xb3\xaf\xc2\xba\xfc\x6b\xd3\x4a\x9f\x83\x17\x74\xa5\x42\xc5\x5e\x30\xeb\x98\x00\x79\xe0\x11\x78\xce\x2c\x5b\x66\x64\xef\x01\x84\x7e\x89\x43\x0a\xa5\xc2\x58\x77\xd6\xf6\x83\x68\xd7\x49\x40\x00\x69\x3e\xba\xc1\xf3\x62\xc1\x5d\x9c\x7f\x42\x12\xbd\x6d\x2d\x1c\x3f\xa9\xfc\x9d\x5b\x3a\x91\x59\x92\xf3\x71\x90\xd1\x4c\x35\xcc\x75\x9b\x5b\x15\xc7\xda\x95\xaa\x62\x78\x6c\x99\x05\xa9\x00\x2a\x1e\x01\xc7\x44\xf4\xc0\x51\x31\x6b\xac\xee\x2c\xae\x02\x22\xda\x4b\xc0\x09\x31\xdb\x08\x3c\x3f\x24\xea\x07\xb0\xae\x7d\xd8\x0a\x82\x00\x9b\xec\xfc\x08\x6d\xe6\x53\x1e\xfa\xf2\x4f\xbb\x23\xf6\x00\x36\xa9\x4e\x0e\x1e\x0f\x6f\xe5\xcd\xc1\xee\xe6\x80\xc0\x38\xae\xae\xf9\x40\x1e\x92\x8f\xd2\x15\x59\xc9\x11\x51\xc9\x06\x6c\xd1\xaf\xcf\x12\x50\x3b\x02\x98\x8d\x80\x0a\x20\xab\xb9\xb6\x72\xda\x9e\xb0\x90\x02\xbc\xe3\xb4\xc8\x0f\x37\xe9\x01\x68\x19\x56\x1f\xad\x49\xb2\x3f\x4d\x87\xee\x57\x5a\x25\x16\xdb\x2c\xf4\x8d\x78\x4a\xb4\x19\x34\x7b\xe8\xa5\x7a\xf5\x28\xe5\xa8\xcc\x3e\xba\xd1\xbe\xca\x96\x36\x81\x56\x0a\x50\x6d\x82\x36\x48\x3e\x4d\xfc\x70\x2c\x5a\xf2\xb4\xae\xdb\x4a\x80\xad\xe0\x70\xbd\x1d\xf8\x73\x9b\xb3\x01\x43\x04\x12\x2a\xe7\x02\x07\x7c\x81\x30\x08\xac\x5f\xc2\xfd\x6e\xcd\x18\x78\x91\x90\x8a\x25\x17\xf4\x6a\x79\x52\x52\x78\xd1\x61\xa7\xe7\x88\x62\xab\xac\xa7\x6b\x08\x45\x78\x2b\x63\x51\x2a\xac\x92\x9d\xe2\xb8\x13\x61\x98\xa4\xbd\xb4\xd4\x78\x64\x15\xce\x3c\x66\x04\xc7\x1d\x49\xba\x91\x86\xd2\x91\x12\xcc\x86\xb2\x5f\xc9\xbb\x7f\x4e\x3a\xf3\x4d\x1d\x7f\xc5\x2f\x73\x9e\xec\x04\x0c\x7f\x97\x08\x39\x0d\xc2\xc5\xba\x2c\x1c\xf3\xab\x5f\x0d\x05\x8d\xd5\x51\xc8\x87\x02\x52\x59\x2c\x2f\x45\x38\xfd\xdc\xbf\x71\x7c\x89\xcd\xc5\x5c\x61\x62\x8c\x8b\x36\x77\xe1\x93\x99\xc4\x2c\xc0\x30\x15\x03\x28\x30\x7d\xf7\x86\x45\x40\xf9\xd4\x40\x59\x4e\x57\x74\x75\x0c\x55\xd8\x5a\x61\x19\x66\xc1\xa2\xbb\xe5\xd5\xaf\x13\x91\x18\xb8\x03\x7a\xb3\xa2\xcc\xef\xee\x7a\x5b\xf2\xe8\x02\x9f\xbf\x75\x03\x2c\xa8\x8e\x7c\xf3\x77\x00\x6f\xa5\xe7\xd8\x93\xee\x5a\xe9\x80\x57\xef\x5a\x45\x98\xec\x86\x39\xea\x44\x47\xe3\x71\x0b\xdc\x9c\x9b\x7a\xbb\x64\xc3\xe2\xaf\x4f\xe9\x80\x56\xdd\x0c\x16\x6d\x30\x89\x3c\xb4\xd9\xfa\x2c\x0e\x71\x0d\x88\xa0\x4d\x39\x4e\x04\x05\xe2\x7d\x0d\x8f\x93\x63\x8d\x1f\x62\x26\x9d\xa6\x46\x10\x96\x4c\x0e\x52\x20\x19\xb4\xf5\x14\xa2\xf3\x96\x27\x9e\xa3\x5a\x7c\x3e\x9a\x81\x8d\x1f\x3c\x20\x58\x6f\x44\xe3\x67\xd5\x4c\xcf\x3f\xf5\x48\xaf\xd5\x03\xa9\x9f\x2a\xef\xfd\x7a\x61\x8f\xb0\x54\x96\x8a\xc2\x17\xae\x82\x73\x43\xa5\x15\x85\x25\x11\x85\x63\xa3\x84\xb2\x74\xf3\x56\xd4\x23\xd6\x5f\x58\x39\x6a\x84\x69\x40\x67\x00\x31\xc5\xd8\xc9\xb7\xa9\x98\x76\xde\x22\x5a\x57\x07\x82\xa2\x28\x4a\x76\x45\x75\xf0\xf4\x73\xe7\xe2\x16\xda\xd2\x69\xcf\x82\x27\x89\x37\x46\x3a\xc9\x66\x81\x1d\x8b\x26\x20\x40\x9b\x9c\xa8\x00\xf7\x75\xed\x0f\x74\xbb\x60\x6f\xa2\x6e\x97\x72\xbf\x2f\x3c\xe3\x46\x9a\x36\xb9\xfe\x0d\x09\xe1\x2c\x76\x6e\xb2\x99\xf6\xec\xb7\x1e\x2a\xfb\xbc\xf9\xe6\xe9\xcc\x91\x0e\x1d\x26\xee\x08\x36\xc0\xe2\x22\x9f\x48\x04\xd2\xac\x9b\x66\x77\xe6\x6c\xf8\xa5\xa6\xf2\xec\x4a\x3f\xa2\x8d\xc8\xb7\x28\x4e\xa3\xeb\x6e\x89\x5b\xa9\xc1\xe0\x39\x0d\xaf\xf0\x3b\xbd\xa9\xb6\xda\x1e\x97\x5b\xdc\x84\x61\xa5\xa5\x58\x55\xfa\xcf\x10\x74\xf2\xa5\x93\x6b\x84\x05\x6d\xec\x93\xd3\x48\x35\x95\x08\xa3\x98\x93\x0e\xe8\xca\xb7\x6c\x5f\xcc\x7d\x3c\xd0\x93\xa0\x4a\x92\xa3\x4e\x86\x8b\xca\x12\xee\x49\x15\xa9\x13\x02\x98\x2f\x95\x94\x33\xa0\x2e\xc6\x24\x99\x06\xc5\xc6\x29\x2b\xaf\x71\xd4\x31\x05\xb8\xe1\xe3\x9c\x2c\xc8\x08\x02\x2f\x3a\x4c\x25\x5e\xa9\x5f\xa6\x6f\x8a\x8d\x0e\xb4\x46\xf3\x61\x60\x89\xb4\x28\x6c\x1d\x12\xd1\x6c\x0b\x0e\x5a\x8d\xe6\x5c\x84\x4f\x50\x2b\x44\x68\x95\x90\x07\x8a\x8b\x4e\xf7\xea\x3a\xb4\x41\x2e\x77\x61\x3b\xba\x85\xfd\xe7\x34\xe3\xca\xcc\x6e\x20\xb8\xf7\x0b\x8b\x56\xed\x4a\xf2\x22\x27\xd5\x69\x00\x75\xcb\x29\x2f\x9b\xbe\xd8\x19\x0f\x37\x58\x07\x3f\xb0\xaa\xd4\xaa\x5d\xc0\x6a\xc8\x4d\xf0\xac\x1f\xdc\x23\x54\xab\x74\x8a\x9a\xd1\xaf\xb6\xd6\xcd\x75\x82\x10\x9e\xef\x62\x52\xd2\x97\x56\x6f\xc8\xf0\x27\x1b\xaa\xdc\x47\x14\xd9\xf9\xa9\x22\xd0\xdb\x14\xf6\x76\x4d\xa3\x17\x6d\xff\xfa\x01\xb9\xca\xaf\x9a\xac\x8d\xc7\xfd\x09\xc8\xb6\xdb\xa2\x48\x1f\x58\xe0\x4b\xe4\xf8\x86\x12\x1d\x54\xc7\x41\xb3\xa6\x4e\xd4\x90\xe6\xd8\xec\x61\x0f\x18\x51\x96\xe0\xd3\x02\xcb\x2e\xa3\x38\xab\x94\x2e\x46\x88\x07\x79\x9c\xa7\x84\xf6\xc7\xfc\x9b\xc1\xfc\x67\x4b\x5d\x8a\x93\x80\xa7\xe2\xbf\x0f\x66\x58\x8a\xff\xa7\xcf\xf0\x3f\xfa\x0b\x17\x68\x83\xe4\xcc\xca\x3e\xff\xda\xff\xa2\x22\xea\x7f\x35\xe1\xfd\x47\x7f\x4f\xb6\x8f\x25\x06\x00\x4a\x4a\x65\x6e\x4b\x9b\x2f\xd0\x04\xdf\x23\x76\x9b\x91\xf9\xed\x2d\x03\x39\x0c\xb3\x54\x3f\x69\xbd\xff\x79\x7f\x91\xd8\x60\xaa\x18\x8e\xa8\x47\xd6\x15\x50\x92\xe3\xbc\x7b\x28\x8a\x7b\xfa\xc9\xa1\xd2\xbb\x29\x7c\x34\xeb\x9d\xc7\xd0\x13\xb8\x9e\x2b\x1e\x5b\x0d\xfd\xa2\x3c\x60\x9c\x3d\xe5\x16\xec\x54\xdc\xdd\xc6\x4e\xec\x74\x7a\x41\x84\x76\xe2\x74\x42\xf0\xfe\x5a\x4c\x25\x3c\x53\x18\xfc\x70\xac\xe7\x90\xd9\x60\x8a\x7e\xa6\x5f\x27\x29\x5c\x9c\x57\x65\x35\x95\x25\x58\x96\x05\x89\x4d\x2f\x5e\x0b\x16\xae\x0e\xe1\xda\x17\xaf\xde\x6c\xbc\xd4\xb3\x76\x86\xfc\xf8\x16\xd0\x5b\x9e\x14\xb2\xf5\xa9\x5d\x8e\x68\xa6\x7b\xd3\xaa\xf2\x8b\x72\xd7\xed\x39\xbf\xe8\xb9\x4e\x4c\x3a\xc2\xa6\xa8\xa7\x82\x94\x68\x1e\x3a\x24\x03\x60\x22\xec\x10\x35\xf2\x60\xce\x25\x8c\x98\x2e\xad\xd8\x07\xac\xfc\x7a\x2c\x6b\xcb\x29\xfc\xdd\xa4\x18\x7f\xe4\x4a\x8d\x37\x49\xdd\x0c\x2a\xa4\xdd\xa3\x3d\x3f\x5c\xf6\x4c\xdf\x81\x87\xec\x95\x0e\x85\x98\xda\xeb\xa3\x85\x70\xdc\x7f\xa9\x79\x20\xba\x9a\x2a\x93\x5d\xb1\x1b\xea\xbd\x72\x5f\x8a\xa5\x06\xee\x50\x4d\xa2\xa7\xf5\x6d\x22\x72\xfd\x08\x5b\x93\x34\x01\x66\xee\xca\x5e\x2e\xcb\x17\x90\xcf\x0f\x89\xef\xe3\x66\xe2\xc3\x9b\xf0\x75\x49\xa2\x71\xa0\x8a\x8a\x3e\x95\x3d\x59\x52\x8a\x16\x98\x0d\xa6\xf2\x1d\x9a\xf1\x34\xe2\xf4\x37\x09\x26\x89\x8e\xde\x61\xda\x4f\xc7\xc5\xe5\x8d\x6b\x60\xe4\xad\x8e\x7d\x6f\x2c\xca\xbe\x7d\x96\xe0\x90\x63\x60\xf4\x97\xb0\x49\xa2\xa6\x22\x9f\x4d\x6c\xd9\x4d\xd0\x08\x99\xb7\x31\xfb\x7e\x47\x4a\x50\x8e\xa0\x76\x51\x9e\xf6\x69\xae\xbe\x28\x52\xed\x7d\xe9\x0a\x4b\xd1\xe8\x61\xc6\x48\x0c\xbb\xf5\x15\x0a\x7b\x66\x77\xaf\x76\xaa\xd7\x66\xcc\x1a\xd6\xda\x42\x92\x9b\x86\x03\x6c\x91\x5c\x16\x01\x53\xbb\x99\x0b\xf2\xd6\xb5\xce\x36\x0c\x62\x16\xee\xbc\xb8\x1b\x91\xa8\xc1\x89\x25\xb5\xe2\xbe\xd4\x47\x02\x04\x12\xcb\x00\x1e\xe2\x34\x0d\x53\xf8\xc7\x33\x68\xf7\x2c\x57\xfc\xd1\x2a\xb8\x21\xdd\x45\x0c\x2f\xa7\xc1\x4e\x0a\xbe\x20\x77\x95\x70\xbe\xbc\xb1\xe7\x81\xeb\x18\x01\x63\x4e\x4b\x04\x5d\x21\x9b\x1a\xc1\xd9\x75\x44\x29\x3f\xb5\x67\xd0\x82\xc0\xca\xef\x2f\xde\x65\xcb\x27\x1c\x29\x9a\x95\x49\xa1\x6e\x1f\xf1\xa1\x02\x89\x6e\xca\x84\xbe\xab\x15\x35\xfa\x5e\xe7\x21\x83\x1d\x1c\x4a\xe3\xec\x09\xbd\xad\x9c\x7d\xf0\xb5\x6e\x31\xd5\x05\x82\xda\xdf\x3b\x23\x3b\x37\x97\x9d\x2f\xfd\xa4\xc5\xb9\xfd\x34\xf1\x2c\x89\xbd\xa1\x4e\xec\x09\x52\xb3\xe8\xe4\x0b\x91\xe9\x9a\xc0\x64\x63\x4e\xc6\x09\x1c\x0a\x4a\x7e\x43\xe1\xd2\x4e\xd6\x8d\xad\xc2\xf0\x1e\x4b\x2a\x2c\x41\x18\x56\xbe\x9a\xe1\x8f\x97\x31\x2e\xdf\x52\x3a\x7d\xbf\xc3\x7a\xa7\xed\xa7\x97\xba\x0f\xd2\x37\x1c\xae\x79\xc9\x3c\x8d\xfc\x69\x97\x5e\xa6\xee\x56\xa9\xf1\xd5\xff\xae\xfe\xa7\x80\xfe\x41\xde\x5b\xe9\x62\x02\x87\x52\x7a\x5f\x0f\x4e\x8c\x83\x77\xa5\x35\x54\x89\x83\x4a\x2e\xa1\xef\xf7\x5a\x98\xd4\xe1\xd5\x7d\x30\x2c\x86\xf4\x11\x17\xf9\x75\x9a\xdb\x0c\x93\x6b\xe7\xa9\x93\xd4\xa9\x7f\x97\x85\xa0\x63\x55\x2e\x34\x3e\x5d\xe0\x47\xf6\x42\x6b\xb7\x0a\xf7\x5b\x7f\x53\x5b\xca\x7c\xcb\xd6\x4f\xbc\xbb\xbf\xf6\x57\x3f\x4f\x83\x4b\x8e\x60\x5b\x82\xfb\x73\xf6\x38\xa7\x79\x66\x54\x04\x57\xe8\xe8\x86\xe9\x7e\xbd\xd3\x76\x0a\xd3\x08\xcd\xaf\xd5\xfd\xf4\xd7\x19\x9d\x16\x5b\x0f\x60\x2c\xc7\x41\x25\x00\x45\x86\x66\xb4\xb9\xbb\xe6\x17\x0c\x12\xfc\x3c\x15\x92\x51\x34\xba\x8a\xa4\xb8\x4d\x09\xe3\x19\x8a\xd7\x00\x91\x07\xc4\xf4\x43\x3a\xcb\xef\x29\x25\x4e\x18\xdf\xdf\x9c\x8e\x6e\x26\x72\x92\xd1\x60\xda\xf2\xa8\x04\xe4\xf2\xdc\xad\x2b\x94\x19\x5f\x66\xa0\x89\xec\x6f\xfc\xc0\xa1\x21\xa1\x42\xf1\xfc\xb1\xdb\xb3\x45\xa3\x39\xf1\xc5\x99\x5b\x67\x51\x95\xcb\x03\x5c\x8e\x55\x99\x25\x9f\x03\xca\x82\x49\x6d\xca\x2a\x74\xdb\x12\x8d\x09\xd4\x4f\xd8\x8b\x59\x95\x83\xa4\xbc\x41\x1e\x3a\xae\x20\x7a\x81\x52\x02\x1a\x43\x15\x4d\xd5\x84\x49\x4f\x9d\xe4\xbc\xe8\x81\xc3\x04\x96\x11\x0b\xe5\xd2\x70\x57\x96\xee\xb4\xd9\xdd\xa4\x8f\x2c\xc7\x65\xcd\x28\x69\xcc\x85\xb7\x9c\xd5\x8a\x21\x0b\x6a\x44\x71\x16\x15\x17\xf5\xaf\xab\xd3\x8f\x49\xa2\xba\x01\x38\x11\x73\x24\xe5\xd7\x1b\xbf\x9e\xf2\x5b\xde\x6c\xed\xe3\x76\x49\xb7\xec\x16\xa5\xea\x5f\xc6\xc6\xbd\x31\xfb\xb1\x91\x6a\xa0\x9c\x87\xbe\x6e\x86\x4b\x96\x2a\x9d\x22\xd3\x1a\x2c\xa9\x36\x4a\xbc\x8c\xfa\x6f\x6e\xfd\xc5\xed\x61\x37\x7c\x0f\xc1\xee\x8a\x9f\xa0\x15\x1c\x23\xaf\xb2\xe7\x29\xcb\xa2\x3b\x50\x18\x47\xd0\xfe\xb8\xeb\xfe\xa4\x59\xac\x66\x99\x50\x8d\xe6\x85\x38\x5b\x16\x77\x7b\x7e\xf7\xf0\x07\xc3\xaf\x91\xa2\x42\x21\x9f\x22\x0d\x32\x04\xf8\x3d\xe0\xa3\x54\x84\x7a\xdd\xfd\x86\x45\x2a\x26\x6f\x84\x65\xb3\x02\x74\xf7\x0e\xa3\xb0\xc3\xe2\xf0\x33\xf7\x3b\x59\x2e\x94\xeb\xa1\x10\x5c\xb4\xfd\x9d\x6a\xfa\xeb\x97\xdd\x15\x11\x45\xb0\xd3\x61\x4b\x7b\x06\x18\x3f\x5a\x0c\x89\x7e\xdc\xdc\xec\x19\x9d\x3c\x1a\xb8\xaa\xad\xae\x77\x2e\x5e\xdb\x23\x02\x0d\xf0\xab\x7c\x30\x4e\x15\xc2\x44\x1f\x48\xfd\x90\x08\x8f\x7b\x5d\x22\x25\x08\x0c\x2f\x5d\xbd\x74\x4c\x7e\x1d\x98\x48\x6d\x5a\xdb\x5a\xb8\x7e\x48\x7d\x1c\x51\x71\xb9\xf9\x31\x4f\xa4\xef\x92\x90\x46\xca\x87\xd1\xb0\x1b\xdb\x91\x42\x7b\xc9\xeb\x26\x92\x72\xa1\x38\x53\x21\xc9\x34\x2b\xd0\x5b\x0a\xae\x66\x86\xf4\x20\xb6\x7a\x54\xf8\x50\x1a\x8c\xc9\x1c\xc3\xd6\xbc\xf0\xf2\x09\xc2\x38\x17\x13\x67\x3f\x86\x52\x31\xe6\xc9\xeb\x05\xa8\x81\x04\x60\xa5\xdf\xeb\x18\x63\x6a\x58\xa5\xf5\x5b\xd9\xf9\x98\xf1\x70\x56\xe8\x75\x44\xe0\x1b\x46\xf1\x93\x4c\x8e\x71\x1f\xa7\x6a\xac\xef\x20\x59\x85\x20\xa6\xe8\xd4\x3d\x42\xfc\x08\xaf\x11\x4c\xc7\xef\x9f\xc6\xd4\x1f\x87\x77\x33\x71\xcd\xa8\x0c\x4f\x31\x2c\xc3\x70\x0c\x57\x33\xa6\xcd\x69\x7f\x0c\x7b\x3d\x23\xb2\x0c\xa3\x33\x4c\xd4\xa5\x4d\xa2\x19\xde\xae\x30\xe2\x2f\xb0\xb8\x67\xfd\x35\x2a\xf3\x68\xdb\xb2\x46\x5a\xeb\x5d\x6f\x1d\x47\xd2\x96\x73\xd2\xdc\x0f\x0b\xa4\xb8\x4c\xd0\xee\x05\x13\x0a\x30\x28\x1a\x1f\xff\xd8\xd5\x83\x33\x5d\x0e\xd4\xd0\x19\x4d\x35\x81\x72\x4c\x3c\xf4\x48\x0a\x8c\xd1\x75\x9e\x9e\x89\x32\x08\x63\xc8\x58\xc3\xb6\x6f\xce\xca\xd6\x2f\xdb\xb1\xc4\xd8\xf6\x74\xff\x61\xf0\x86\x39\x1d\x22\x30\x9d\xec\xe7\xae\x47\xb1\xaa\xde\xe6\xd4\x9b\x93\x80\x20\xbc\xcd\xda\x4c\x8c\xdb\x0c\x71\x10\xed\x92\x29\x4e\xe3\x18\x4b\xbd\x75\x37\xe3\x9e\xe2\x20\xb7\x42\xdd\x92\x97\xe2\x94\x99\x75\x82\x39\x55\x4f\xbb\x68\x13\xbc\x0e\xe4\x82\xb5\x91\x56\xf0\xfb\x99\xd4\x23\x69\x2b\xcf\x90\x75\x8c\xb1\x58\x59\x9e\x6d\xfd\xe2\x66\x56\x9a\x4e\xe4\xb0\x98\x38\x08\xf5\xe1\xf4\xe8\x7a\xf6\x5b\xd7\x03\x67\x0e\x50\xdf\x3b\x46\xa7\xa6\x49\xeb\x3d\x96\xf9\xa2\x3c\xa5\xb9\xea\x5a\x61\x4c\x83\x40\x7a\x23\x6e\xa3\x9a\xbd\xa8\x24\x33\x69\x77\x0a\x90\x1d\xa3\x3b\x33\xf6\xcb\xe1\x0f\x49\xf0\x27\x0c\x3e\x19\x14\x23\x05\xdb\xd7\x6e\x5d\x0b\x33\xed\xf1\x20\x1a\x3e\x03\x9b\x1e\xb1\xf3\x8f\x00\xf9\x89\x9e\x79\x34\x1e\x9d\x6c\xbd\x4e\x65\x7c\xa8\x04\x1f\x80\x53\x65\x13\x41\xc6\xa9\xce\xf5\x83\x0a\x28\x06\xdc\x2b\x0a\x92\x82\x91\x9f\xf1\x8b\x86\x3e\x06\x1d\x61\x43\x4b\xcc\xf9\x5a\x40\xef\xb7\x1e\xf6\x7c\x01\xa9\x1e\x24\x78\x78\xfa\x97\xa1\x5d\x84\x5e\xce\xe6\x5c\xbd\x78\xd0\x2f\xc1\xb2\xba\x39\xa4\x1e\xd8\x20\xcb\xaa\x0f\x8e\xbf\x09\xef\x07\x27\xf5\xf5\x53\x8a\x6b\xe9\x66\x38\x71\x1e\x1b\x47\x0d\xae\xb6\x96\x0b\x82\xaf\x89\x1e\x9d\xf4\x81\x79\xf2\xb2\x63\xea\x69\xbe\xab\x96\xc5\x2a\x0e\xba\xff\x30\x99\xff\x61\x32\xff\xc3\x64\xfe\x87\xc9\xfc\x0f\x93\xf9\xff\x11\x93\x29\xdd\xff\x6b\x26\x13\xff\x7f\xcc\x64\xa6\xc2\x9f\x4c\xe6\xf9\x7f\xc8\x64\x1a\x32\x8e\xf7\xff\xdb\x4c\x66\xfc\x0f\x26\xb3\xe7\xb9\x6a\x49\xfe\x64\x32\xb5\xbf\x67\x32\xf5\xff\x1e\x8f\x5d\x84\x95\x52\xfe\x64\x32\x93\xfb\x6f\x99\x4c\xee\xaf\x4c\x66\x23\xb0\x54\xf8\x6f\x26\xf3\xc6\xfe\x9e\xc9\xb4\xff\x96\xc9\xfc\x87\xed\xa9\xdf\x0c\x23\x51\xbd\x5c\x90\xf1\x80\xfc\x9b\xc9\x3c\x7e\x7f\x65\x32\x73\xac\x76\xfe\x64\x32\x31\xe6\xaf\x4c\xa6\xf3\x57\x26\x73\xf9\xc7\x0f\xbf\xff\xc1\x64\x9e\x31\x06\x29\xc8\xbf\x99\x4c\xec\x8f\x93\x5c\xf1\xc7\xf5\x69\xf3\x01\x72\x42\xfe\x64\x32\x55\xfb\xaf\x4c\xa6\xcf\xc0\xec\x9f\x4c\xe6\x3f\xf0\xcf\xf8\x8f\x17\x1a\x84\x5e\xb7\xbf\xf0\x4f\x26\x53\xf1\xff\x96\xc9\xac\xea\xbf\x63\x32\xc3\xea\xaf\x4c\xe6\xd4\xfc\x57\x26\x53\x94\xe0\xf4\x7f\xc6\x64\x5e\xc1\xff\x6d\x26\xd3\xc8\x94\x2c\x10\x23\xd2\x3c\xab\x12\x88\xc0\x3d\x48\xdb\x69\x70\x80\x3a\xfe\xc5\x76\x93\x7a\x73\xed\x29\x76\x2d\xf5\x31\x01\x3d\x8e\xff\x0c\x37\x9c\x6a\xd9\x32\xfd\xf4\xa6\xe3\x65\xce\x38\x73\x35\x47\x98\x90\x59\x76\x30\x72\x7d\xcd\x06\x60\xa8\xaf\xd7\x9d\x9b\xb2\xb0\x8f\xe3\xdb\x39\x1e\x2e\x61\x35\x7e\xe6\x19\x49\x4c\x97\x47\x9f\xed\x83\x5d\x02\xf4\x43\xaf\x92\x07\xaf\xf0\x38\x74\x80\x28\x2c\x2f\x07\x68\x12\x45\x2f\xb3\x2c\x71\x94\xac\x73\xb6\xd7\x73\x0c\x16\xb4\x11\x36\xec\xc3\x66\x05\xca\x8a\x9b\xce\xb4\x30\x47\x35\xbe\x36\x7b\x09\x90\x7f\x02\xed\xda\x70\x4a\x77\xd7\x48\x13\x89\x77\xd4\x0c\xb6\xfa\xd4\xf4\xeb\xbb\x98\xca\x7a\xaa\x19\x75\x5d\x59\x3a\x39\xf6\xbe\x35\x12\x76\x42\x6a\x91\x2f\x70\xa3\xb4\xfe\xd5\xd6\x5b\x32\x41\x25\xa9\x3e\x60\xff\x56\x6b\x56\x6b\xe5\xc0\x19\x7e\x69\x15\xba\xaa\xed\x3d\x7e\xb9\xbc\x39\x73\xe5\x35\x07\xe1\xf5\xe3\x47\x41\x8a\xce\xbb\xda\x04\xb0\x78\xca\x13\x74\x8a\x35\x2b\x09\xe5\x7b\x5f\x03\x4b\x6d\xf0\x10\xe0\x02\x0e\x40\x11\xd8\x00\x6d\xbe\x5b\x91\x3a\x06\x03\x05\xe0\x8e\xe3\xd2\x8b\x01\x79\xcb\x27\x40\xe9\x40\x5d\x06\xc1\x7e\xe5\x2f\x04\xb0\x22\x6c\x46\x1f\xe7\x4c\x60\x8d\xd7\xe9\xba\x98\x08\x59\x95\x66\xa5\xb9\x01\x0f\x6d\x74\xc5\x56\x01\x5b\x70\x63\xef\x74\x6e\x2d\x90\x04\xc9\xb7\x9f\xfc\x3b\xbd\x21\x58\x14\x4e\xcc\xba\x04\x7f\xf1\xae\xee\x74\x40\xde\x88\xe2\x51\x39\xf1\x9e\x58\xf9\xee\x44\x3b\xd7\x3a\x23\xd7\x3a\x89\x15\xef\x76\xee\x6e\xb6\x91\x1b\x9e\x95\x1b\x4d\x91\x79\xd3\x55\x65\x1a\x1b\xda\xe0\xa4\xf9\xad\x89\xbd\xd2\x1d\x3d\xbd\x71\xb4\x33\x71\x3d\x95\x70\x39\xeb\xb7\x06\x5f\x64\x1d\x6f\xe0\x29\x25\x8f\x7d\xad\xc3\x67\x05\xb9\x74\x87\x03\x91\x08\x29\xa1\xb2\x5d\xe9\xbf\x78\xb1\xed\xc7\xeb\x9c\x56\xb5\x00\xdf\x56\x86\x53\x23\x23\x4e\x52\x14\x4d\xf9\xfd\xe6\xbd\x8f\x39\xbd\xc4\xc0\x47\x9a\x9b\x16\xbc\xdb\xcc\xac\x6e\x15\xc4\xab\x67\x6a\x59\x65\x57\x50\x2d\xb6\x1d\xaf\xa1\x21\xdb\xdc\x7c\xdb\x99\xda\xe2\x2d\x7f\xc2\x7c\xb7\x44\x2b\x49\xb0\xa0\x47\xb1\x57\x46\xb6\x5d\x96\x77\x43\x1d\x8d\x86\x5b\xc2\x64\x5f\xec\x64\xb7\x37\x29\xc4\x98\xa7\x54\xf5\xd4\x97\x89\xa8\xb9\xf4\x5a\x56\x52\x38\x20\x2c\xce\x25\x71\x94\xa1\xd3\x33\x34\xf9\xf5\x43\x6c\x81\x42\xc3\x21\x12\x06\x33\x6f\x5c\x2c\xed\xfc\xcf\xf8\x09\xf0\x36\x26\xc7\x42\xaa\x23\x84\x8f\x89\x94\x7f\x3f\xbf\xfd\xf8\x82\x14\x72\x94\xd2\x55\x78\xfa\xc1\xf0\xc9\x4d\xa5\xc2\x26\xa1\x5e\xcd\xc7\x67\xb6\x38\x3c\x29\x22\x3c\xb1\x35\xf1\xe5\x7a\x90\xed\x7c\x90\xad\x9a\x5c\xbd\xd7\x82\xec\xfa\x46\xa0\xbf\x6e\xa8\x80\x99\x2b\x6e\x14\x79\x27\x59\xb0\x96\x8d\x4c\xd7\xec\x34\xa8\x08\x24\xfc\xf4\x34\x28\x13\x48\x18\xbf\x2a\x15\x8e\x84\x28\xc0\xc3\xbd\x6f\xb1\xf2\xb0\xa2\x36\xb0\xae\x28\x57\xa7\x95\x97\x26\xa1\xf3\xf7\x51\x45\x82\x11\x50\x05\x16\x61\x59\x1d\x48\xe9\x2b\x5f\xe7\x34\x4a\x3d\x8a\x22\xd5\xc8\x12\xd6\x59\x12\x36\x31\x4d\xec\x0a\x4e\xf4\x48\x66\xde\xa7\x0d\xeb\xd5\xf8\x9c\x8a\x1c\x2c\x34\x12\x2c\x24\x8a\x1f\xae\xa4\x13\x2f\xb9\xbf\x6a\x41\x12\x39\x4e\xd5\xe4\xca\x72\x13\x5c\x9c\x5b\x2d\xc3\x69\x8d\xe4\xf0\x8a\xd0\x6c\xe6\x61\x4b\xfe\x5c\x2a\xbb\xf5\x73\xfd\x48\x54\xdb\xf9\x0d\xfb\xe4\xab\x7c\x3f\xd8\x5a\x56\xd5\x7f\x76\x9c\x08\x73\xe4\x93\x6b\x0a\x0d\x30\x4b\x04\x54\xbb\xf7\x1b\x2a\xf6\x80\xdf\xba\xc5\xe4\x4e\xb9\xb8\x54\xc5\x8c\x8a\x87\x8f\xae\x9a\x1a\x06\x6e\x34\x24\xf8\x6a\x89\x11\xea\x52\x1e\x73\xf6\x44\x4b\xa7\x49\xa2\xf9\x6e\xac\x1a\x45\x32\xf1\x93\xb7\x7d\x16\x9d\xb6\xf2\xe8\xe8\x41\xda\xf2\x9f\xb3\x8f\x59\xfb\xbd\x5b\x1a\x3a\xc9\xab\x0f\xe3\x89\x17\xa7\xe7\x11\x54\xea\x74\x6d\x45\x67\xab\x91\xbb\x70\xaf\xfc\x10\x7d\x61\x46\x4b\xc7\xe7\x89\xe2\xdc\xd2\xee\xf4\xae\x9c\x53\x27\x33\x8d\x25\x33\x8d\xd3\x24\x3b\xed\x2a\x9e\x42\x44\x2e\xfb\x4b\xe0\x02\xab\x09\x89\x1a\xa1\x0e\x50\x32\x27\x92\x25\x9d\x08\x06\x27\x6d\x90\xc1\xb2\x30\x85\x8c\x34\xfd\x06\x43\xe8\x31\xbf\x0d\x89\x7b\x62\xfe\xe4\xbe\xa7\x3e\x50\x1e\xfa\x8d\x00\x82\x26\x4d\x34\x03\x6a\x9f\x2c\x89\xab\xbd\x5f\x8a\xa1\x03\xde\x88\x41\x95\x5f\xb7\xd7\x8a\xe9\xc2\xd7\x4b\x5e\xef\x34\x3c\xee\x86\xf6\x07\x04\x88\xe9\x5a\x1a\xd0\x3c\x64\x9b\xa1\x20\x8d\x81\xb4\x06\x7c\x0e\xd4\x56\xe4\x24\x1d\xe2\xc5\xa2\x1f\xd0\x52\x10\x57\x0a\xda\x0d\x9a\x72\x16\xd1\x66\xc5\xdc\xd3\x5b\x4b\x26\xeb\x08\x90\xe1\x55\xad\xea\xb5\xae\x57\x4a\x94\x25\x2c\xe1\xb4\xf3\x82\xb3\x63\xe7\xd1\xe9\x4b\x27\xfa\x83\xa1\x98\x7e\x30\x83\x1a\x8c\x62\x28\xc9\x31\x24\x90\x93\x96\x8d\xfc\xbe\x72\xb2\xc4\x37\xb2\x21\x51\x39\xab\xf2\x2d\xfa\x59\x27\x53\x15\x1f\x0d\x5d\x91\x6a\x91\x47\x74\xb9\x60\x8e\x1f\xf9\x0b\x60\x03\xfc\xca\x08\x50\x01\xc4\x45\x8e\xfc\x76\x75\xdb\x7e\xd2\x78\x45\x1e\xe0\xb9\x03\x94\xb9\x6a\x95\x3a\x5e\x94\x6a\x51\x21\x0f\xb2\x01\x38\x2e\x60\x33\x83\x2f\x05\x3e\x47\x85\x8f\x15\x71\x54\x84\x06\x36\x24\x18\xa1\x80\x13\x01\x0d\x49\xb2\x1b\x18\x6d\x60\x6e\x02\x6f\x08\x22\x5f\x44\x6c\x28\x20\xa2\x40\x52\xd1\xf2\x06\x56\x32\xc8\xc9\x20\x2b\x82\xf7\x02\x22\x19\x78\xa0\x60\x74\x01\xfe\xc5\x34\x32\xb5\x71\x94\xc8\x24\xcf\x1c\x2a\xb3\xb7\xe8\xdc\x67\x71\x7c\x2a\x8c\xf0\x2f\xc2\x67\x8f\xcc\xa5\x12\x33\x5b\x4a\x7d\x77\x5e\xcb\x65\x3a\x15\x1a\x4a\x95\x28\xa9\x8b\x45\x2d\x15\x16\xc8\xd0\x52\x06\x3e\xe2\xa8\x8a\x25\x18\x53\x36\x2c\x8b\x6c\x24\xc7\xa4\x6c\xe3\x4d\x40\xe4\x4e\xb6\x6e\xda\x55\x61\x2d\x16\xd9\x0a\xfe\xc4\xef\xa8\x45\xf2\x14\x7e\x7c\x4a\x89\x13\xfa\x59\xa7\x2e\x92\x3a\x67\x04\x9e\xa8\x55\x29\xf7\xe9\x42\x0c\x86\xdd\xf3\x23\x3e\x69\xf5\x06\x05\x58\xf2\x25\x78\x8e\x4a\xce\x1b\x4d\x4e\x4b\xb5\x44\xfa\xe7\xd2\x2b\x18\xb2\x30\xdc\x7b\x9e\xfc\xf1\xbe\x3c\x09\x9e\x35\x92\x0e\xb2\x11\x71\x36\xeb\x82\x0a\xf9\xa6\xfd\x12\x42\xe9\x02\xac\xf9\x26\x3b\xe3\x34\x60\x30\xbc\x51\x25\x92\xb2\x2b\x76\x31\x10\x95\xba\x08\xc2\xff\x48\x72\x4c\xa2\x47\xa7\xd5\x2e\x26\xca\x23\x5e\x98\xc0\x89\xb3\xb5\xa8\x20\xea\xa6\x3c\xdd\x4a\xbc\xc1\x81\xcf\xa3\x2a\x38\x19\xb3\xe9\xc0\x82\x30\xb3\xae\xf2\xd1\x3d\xe7\xd2\x2b\x3c\xc2\x77\x30\xd9\x5f\x40\xbc\x3e\x0d\xdb\x7a\x70\x82\xb4\x0c\xde\x25\x08\xdd\x46\xd0\x47\x47\x0f\x42\x8f\x10\x36\xd7\x65\x84\xcc\x71\xf2\x57\x0f\xd3\x8a\x5d\xaa\x3e\xa9\x87\x4b\xa2\xc8\xca\x60\xa4\xd9\x18\x86\xc7\x09\x82\x76\x7b\x87\xbd\xc8\x74\xd3\xee\x32\x3c\x23\xab\x46\x4d\xb0\xc6\x02\xae\x0d\x6f\x59\xcd\x0e\x0c\x66\x88\x5d\x8f\xd2\x7a\x5b\x9f\xad\xc0\xc7\xfd\x34\x22\x45\x3e\x7f\x08\xa6\x2a\x9c\x14\xa4\x09\x9d\xce\x0a\xc6\xfc\x9d\xe8\x9a\xf8\x44\x24\x5c\x63\x79\xf2\xdc\x4b\x47\xc7\x8f\x0e\xc2\x21\x92\xbc\xcd\x48\xc7\x7d\xa0\x22\xf0\xa4\x10\x0f\x78\x09\x09\x7b\x01\x80\x1e\x13\xb8\x3c\xbb\x2c\x1f\x54\xaa\xb2\xaa\xf4\x71\x11\xaf\x32\xb5\xe4\x3b\xbb\x1e\x64\xaf\x30\x5f\xad\xf1\x42\xfd\x8b\x2f\x8d\x44\x4c\xdc\x90\x98\xa6\x01\x21\xdb\x01\xba\xcf\x50\x94\x47\x5d\xcd\x42\x86\xf4\x72\x06\x26\x43\x43\xc5\x5d\x7a\x44\x37\xc4\xb0\xbc\x6f\x43\x05\xed\xec\x86\xe1\x9a\xe4\x7d\xbb\x82\x2c\xda\x6d\x34\x12\x74\xe3\x13\xac\xae\xcc\xa7\x12\x0f\xab\xab\x5c\x94\x77\x3d\x06\x14\x90\xa2\x92\x32\x8b\x15\x19\x2e\xed\x34\x8e\xe2\xca\x0a\x39\x83\xbe\xe0\xb9\xb8\xef\xaa\x22\xf3\xa0\x23\x24\x43\x53\xa4\x94\x41\x4e\x37\x31\xf1\xa4\xa0\x04\x15\x79\xe0\x09\x91\xd8\xfb\x84\x8b\xc1\x4c\x50\x9c\x0f\xb1\xb1\xb2\xd2\x00\x9c\x94\xb8\x49\x24\x76\x14\x11\x6f\xd4\xf1\x63\xac\xd2\x85\x49\x39\x1e\x24\x7d\x40\xbb\xb0\x10\x7a\x54\x80\x8b\x0f\xc9\x4e\xfc\x95\x59\xe7\xa6\x53\x63\x3b\xf4\x0e\x3f\x32\x29\x97\x9c\x4f\xa1\x60\xab\x93\x9f\x9d\x4a\x26\x92\xdb\x3b\xcf\x24\x59\x11\xec\x4b\x80\x14\x8f\xd7\x9f\x9c\xe0\xb7\x97\xee\xe8\xdc\x81\x96\x16\x50\x05\x32\xe8\x4f\x9c\xb3\xfc\x5f\xf5\xc1\xcc\xc8\x0c\x53\x32\x8c\x28\x38\xfd\xe3\xff\x91\x92\xfe\xb3\x98\xe0\x41\xf0\xfe\x2f\xcb\x72\x23\x35\x86\x6a\x2c\xb1\x43\x2c\xc9\x2b\x73\xfc\x74\xde\xc0\xec\xb1\x93\x4c\x3b\xf6\x1c\x5e\x6f\xa6\x58\x2a\x19\xe6\xb5\x47\x06\x32\xe7\x82\xac\xab\xfa\x36\xf9\xfa\x9c\xab\xe4\x9c\xc0\xa7\xbe\xf5\xcf\xcc\x63\xde\xf1\x63\x89\x4b\x79\x5c\x69\xe2\xb1\x88\x79\xd5\xf6\x25\xa5\xe6\xa8\xd6\x9e\xb7\x7f\x4e\x7b\xad\x70\x0f\x0f\x76\x37\x08\xf9\x33\x81\xe0\x81\x42\x8e\xda\x78\x30\x7d\x25\x0b\x04\xa5\xad\x28\x44\xc8\x92\xb7\xc0\xa0\x7e\xc9\xbe\x82\x89\x74\xee\xb6\x0d\x05\xee\xab\x60\xfd\xfc\xf4\x9e\x0f\x9b\x88\x04\x10\x98\x11\x9a\xfa\xb5\x03\x41\x08\x60\xba\x9c\x17\x91\xc7\x5b\xfa\x29\x2b\x23\x3a\x59\x65\x4e\x11\x39\x8e\x3f\xf8\x74\x50\x55\xae\xca\x1b\x07\x89\x50\x07\x7b\xeb\xe8\x75\xd3\x36\xa8\xfb\xf3\x86\xfa\x8d\x21\xec\x20\x73\x9a\x79\x92\xae\xcb\x5a\xc6\x61\x30\xa3\xdc\xfc\xea\xfa\x75\x74\xb6\x3f\x73\x45\x18\xd7\x45\x38\x47\x4f\xf1\xf3\x37\x31\x38\x35\xf9\xb9\x3f\x3a\xc0\x92\xec\x41\x5b\x4f\xb5\x46\x02\x1d\x05\xd0\xd4\xf0\x10\x13\xc3\x5d\x0c\x57\x29\xfc\xe6\xf5\x69\x82\x6d\x81\x51\x20\xae\x00\x1f\x5a\xaa\xb8\x12\x3b\x87\x4c\x3b\x64\xea\xc6\xaa\x51\xab\x4f\x16\x95\x4d\x72\x55\x6e\x74\x95\x66\x74\x95\x62\x74\xd5\x3b\x7c\x6d\x2f\xd9\xc8\xa4\x92\x42\x02\xa6\x5f\xe9\x7e\x10\x0a\xb5\x86\x51\x10\x43\x41\x0c\x5b\xd1\x20\x57\x25\x42\x5c\xf8\xa0\x03\x0e\xf4\x73\x30\xf0\x8f\xf4\x08\x69\xbf\x86\x57\xac\x5c\x5d\x2f\x5c\xd9\x21\xbc\x88\xc3\x86\x83\xf4\x58\x03\x2d\x5c\xfd\x25\x5c\xed\x25\x5c\x74\x62\xf1\xa7\xb2\xa1\x20\x7c\x0a\xc6\xca\xa3\x7b\xc2\xca\xfd\x92\xff\x15\x94\x17\xb3\xf4\x46\x93\x3c\x8e\x68\xe4\x99\xa1\x65\x87\x21\x97\x84\x63\x20\x27\xf7\x72\xa5\x44\x01\x49\x2f\x40\x72\x96\xfc\xe9\x61\x3f\x3a\x63\x55\x8b\xfc\xc0\x56\x76\x8e\x42\x11\xe1\x07\x2e\x4e\x1c\xc3\x7e\x7d\x84\x5e\x5d\xed\xbe\x20\x45\x08\x50\x05\x9c\x8a\xc5\xfc\x64\x68\xfe\x28\x9e\xe3\x94\x38\xf9\x9e\xdf\xf2\x10\xaa\x9b\x34\xa6\xc2\xde\x59\x8d\xf5\x75\xdf\xb6\x6d\x1b\x0a\xbf\x3d\xb7\x1d\xef\x56\x15\x5e\xf2\x63\xd7\xbe\xa7\xd1\x91\x74\xe5\x17\xf8\xce\x22\x4a\xe6\xaa\x27\xf6\x9d\x26\x9d\x11\xe9\x09\x2f\x95\x9c\xff\xf4\xc2\x62\x26\xf7\xe0\x8e\x7a\x02\x25\x89\x62\xf1\x9e\x94\x3a\x2f\xf2\x8d\xba\x52\xe0\x9f\x94\xb3\x1c\x3c\x09\x71\x0f\xa7\xf2\xd5\xef\x4b\xcc\x0e\x9a\x54\x8a\xd5\x45\x99\xc5\xa6\x66\x71\x8d\x3f\x93\x61\xfa\x3e\x14\x8b\xf8\x37\xc8\x4a\x10\xf8\x39\x2e\xa4\xda\x24\x89\x2f\xed\xbc\x43\x79\xe5\x30\xeb\xd1\x89\x65\x23\x7c\xb2\x0e\x25\xbe\x8e\x13\x02\x05\x2b\xe9\x17\x50\xf8\xd5\x99\x96\xa3\x04\x3c\x76\x00\x8c\xe4\x80\x09\x87\x58\x40\xe5\x97\xc0\xd0\x23\x3c\x25\x31\xe2\x1f\xe3\xeb\x48\x1d\x7c\xc5\x5f\x27\xef\x26\xe7\xe4\xd4\xd3\x2f\x7e\x36\x73\xbf\xad\xed\x8a\x87\xa8\xd3\x24\x16\x22\x1b\x7c\xd0\xb0\x54\x27\x49\x16\xf6\x19\xa1\x33\xc9\xaf\xca\xaf\x63\xec\x00\xd6\x80\x6f\xe2\xfc\x0c\x86\x47\x51\x31\xf3\x44\x8b\xce\x65\x21\x76\x9f\xa0\x1e\xf1\xa0\x10\xae\x01\xc6\x09\xb4\x64\x9c\x37\xd6\xb3\xc1\x90\xd1\xa8\x6f\x46\x53\x6b\x8f\xe3\x7f\xb1\xb1\x58\xb6\xce\x43\x08\x36\x06\x75\x2a\x81\xaf\xac\x43\x17\x60\x8c\x51\x06\x82\x94\x02\x75\xd0\x74\x83\x78\x05\x56\x2d\x03\x30\x66\xac\xf1\xf5\x82\x21\x2b\x1c\xa6\x51\xe5\x39\x8d\x1b\x5c\x92\xdf\x49\xf0\x30\xfb\xfe\x25\x7b\xca\x3b\x42\x79\xdb\x8b\xbf\x1f\xcb\x40\x92\x4a\xfa\x2a\x61\x8a\xfb\x66\x87\xe3\x60\x0a\x13\xca\x66\x9b\x53\x05\xe0\xbd\xa1\xc3\x8b\x4c\xd6\x6c\xa0\x78\x4a\x3e\x57\xa2\xcc\x92\x30\x5d\x99\x2f\x83\xde\xf9\x69\xfb\x97\xe1\x07\x1e\x7f\xaa\xff\x93\xac\x62\xbb\x1d\x4e\x33\x20\xb8\x59\xd2\x48\xd5\x0a\xe2\x4b\x0b\x4f\xdc\x21\x01\xcb\x92\x79\xbb\x4e\x5f\xed\x1d\x90\x76\x56\xda\x59\xf5\xc6\x20\x1e\x6a\x9a\x5f\x86\x17\xa8\xf3\xa8\x3f\x8f\x12\xb4\xe8\x17\x98\x0e\xa7\xe5\x85\xdb\x8e\x8f\x5a\x36\xe5\xe4\x69\x1e\x0c\xcf\x5f\xb2\xd1\x51\x1a\xd8\x73\x00\xca\xdf\xc0\x61\x82\x4a\x57\xf4\xa5\x3f\x99\x17\xd0\xf6\x15\x13\x4b\x93\x33\x6e\x20\x29\x3e\x57\xff\x1c\x05\x78\xe6\x1e\x89\x6f\xd8\xc1\x94\x71\xb4\x68\x99\xb7\x2e\x38\x82\xd8\x0c\x5f\x9d\xd9\x22\x08\x19\x51\xa4\x5d\x25\x2a\xc8\x7b\x3b\xa0\x60\xd4\xfa\xe5\xee\x57\x73\x79\x5b\x51\x1c\x9a\x2c\xb9\x5b\x95\x20\xe1\xa8\x27\x1f\xeb\xea\xb0\x48\x37\x00\x77\x03\xed\x0c\xfb\xf6\xab\x39\xbd\x37\x65\xbd\xdf\x38\x8d\x14\x92\xe4\x2b\xf2\xdb\xd9\x10\x44\x98\x29\x8c\xa3\x7f\x83\x9d\x0e\x09\x68\xd8\xe5\xfa\x5b\xc6\x8e\xb1\x3f\xc4\xd7\x38\x59\x4b\x78\xe0\x08\x0f\x56\xc3\xf4\xbd\x96\xeb\x26\x09\xab\xb2\xde\xf9\x15\x3e\x50\x42\xda\xe7\x86\xb4\xb2\x66\x5c\x14\x51\xc7\x79\xd5\xdf\xfa\x48\x5e\x9c\xc5\x4b\x11\x2e\xfd\x18\xdb\xf4\xa7\x28\x9c\x9d\x7b\x40\x8a\x9c\xdd\x50\x1d\x8a\x25\x4c\x41\xe7\x9f\x7f\xc7\xc2\x8a\xad\x22\x7a\x04\x29\x52\x32\xb9\xb9\x9d\x9a\x85\x67\x27\x49\xc2\x06\x9e\xd2\x5c\x49\x8e\x7c\x92\x53\x2c\x8b\xaa\xdc\x62\x48\x91\x58\x14\x1a\xa6\xb7\xa8\xa1\xde\xb3\xea\xc9\x2e\xed\xc8\x4e\x7f\x28\x6d\x2c\xf1\x43\x63\xfa\x70\x33\x84\x56\xc1\x23\x24\x3a\xf7\xc6\x8f\x3d\xec\x8c\x80\xde\x16\x51\x2a\x8b\xcd\x0c\xa2\xb1\x9d\x70\xf2\x9b\x28\xed\xd8\xb8\x90\x86\x5f\xcd\xf5\x92\x7c\xa9\x27\x25\x0b\x1c\xc1\xd8\xe8\x9b\x32\x61\x67\xc7\x77\x2e\xed\x31\xf2\xfb\xe6\x81\x69\x86\xf9\xe6\x30\xa3\x4c\xc5\xb9\x99\x55\xa9\xe7\x5d\xd9\x39\x3c\x77\x6c\xe8\xc9\x68\x4a\x5e\x75\xb6\xbc\xdf\xf2\x42\x1a\x02\xed\x05\x49\x37\xed\x94\x05\xf7\x04\x70\x39\x73\x6b\xa5\xeb\x98\x3e\x32\xba\x94\xeb\x98\x8d\x9f\x5c\xda\x32\xfc\x33\x7f\xfd\x09\x0a\x0d\x58\x7f\xad\x0d\xc4\xbd\xba\x08\x27\x6c\x21\x71\x8f\x15\x33\xea\x66\xeb\x8b\x24\x13\xf5\x68\x9a\x79\x34\x2a\xad\xdd\x42\x80\x89\x13\xd3\x3b\x6e\x0d\x52\xf0\x67\x62\x07\x6c\x0b\x62\xc7\xc0\x9d\xc7\x29\x99\xdc\xf4\x51\x48\x24\x0b\x31\xac\x86\xea\xea\x88\xbf\xf8\xf0\x84\xa5\x83\xfa\xce\x50\xad\x5b\x11\x4f\x99\x8d\x0a\xa9\x31\x88\x1a\x10\xcc\xbb\x12\x6f\x14\x47\x73\xc9\xcd\x24\xc0\x68\x66\xee\x18\xd4\xb9\x26\xa2\x27\x7b\xf3\x26\x7e\xa6\xa9\xb9\xa3\xe0\x89\x3c\x88\xcf\x78\x06\x9d\xba\x13\x77\x25\x7e\x62\x98\x24\x72\x90\x3c\x5d\x9a\x8e\x58\x03\xf8\x9e\x7a\xe2\x03\x90\xba\x2a\x00\xd7\xc0\x8c\xd8\x13\x89\xdb\x5a\x1f\x0a\x4b\x3b\x7a\x25\xc6\x5c\x2d\x64\xde\x27\x1e\x3a\x51\xe9\x19\x0e\xb2\x9d\x3e\x04\xa3\xc3\xe6\x3b\xb8\xc7\xf6\x50\x6a\x01\x32\xa0\xe0\x5c\xa5\x57\xf5\x00\xb1\x94\x66\x99\xbf\x0e\x08\x9e\x47\x2f\xdc\x5f\x47\x84\x3e\xd6\x5a\x89\x2d\x3f\x7b\xf2\x48\x15\xf7\x56\xce\x74\xef\xc9\xc3\x54\x2e\x11\x08\xa1\x43\x7b\x0e\x25\xef\x29\x57\x53\xc5\x2e\x7b\x4b\xee\x05\x3e\xfa\x84\x2d\x36\xe7\xe3\xf3\xe5\x77\x63\x62\x0c\x1f\x3c\x36\x1b\x0c\x81\xa2\xe5\x82\x03\x2a\x3b\xdf\x11\x67\x88\x2f\x9f\xdf\x13\xba\x73\x4c\x5f\x3c\xaa\x1d\x94\x49\x8c\x47\x90\xe6\xa7\x5b\x2b\x44\xad\x79\xb0\x91\xc0\xf3\x60\xc9\x19\x34\x3f\xb2\x2d\x80\x67\x9b\xca\xd0\x7a\x79\xcc\x00\xdb\xa7\x18\x54\x0f\x5f\xbc\x89\xbd\x17\x9c\x61\x4a\xed\x05\x6f\xb2\x0e\xfc\x7c\x6c\x20\x62\xc1\x16\xf3\xb3\x41\x9e\x76\xf2\xf8\x97\xcd\x0a\xcd\x7a\xf1\xa7\xd4\x6d\xab\x4a\x07\x4d\xe1\x96\xa2\xee\xf0\xe8\x19\x99\xad\xca\x10\x25\x98\xed\x95\xde\xd9\xb3\x78\xf3\xdd\x2d\x6e\x08\xad\x42\x9f\x32\x2e\xc2\x6f\xc3\x64\x1b\xe6\xf6\x91\x2a\x3c\xfa\xf6\xe2\x64\xa3\x0a\xee\xe8\xbe\xcc\x4b\xb7\x3b\xce\xa4\xd7\x5c\x3f\xe3\x6a\xfa\xec\xe6\x77\x2d\x82\x93\x86\xfc\xb9\x10\x95\xe7\xdc\x66\x20\x21\xf3\x59\x6a\x7c\x90\x05\x93\x24\x5e\x76\x75\xc5\x54\x67\x68\x72\x8f\xfa\x03\x81\xa9\xee\x74\x38\xc9\x61\x2f\xe4\xf7\x63\x6a\x02\xef\x3d\x04\x53\x66\x25\x4b\x4d\xe0\x6d\x47\x45\x0d\xd5\xba\xb5\xea\xe6\x60\xab\xeb\x88\x21\x7b\xd4\x3c\x93\xd7\x66\xa1\x4d\x64\xe9\xdd\x6b\xf0\x68\x1b\x08\x9f\x67\x05\x61\x0e\x9a\x80\xda\xed\x42\x20\xed\xf8\xd0\xe8\xfd\xf1\x5c\x36\x85\xe4\x64\x27\xa9\x33\x5f\x46\x21\x56\xc1\x5a\x05\x51\x88\x70\x4d\xb4\xd1\x8f\x21\xdf\x95\xf7\x6d\xdc\x83\x37\x85\x28\xf9\xd4\x59\xd2\x40\x29\x9a\x4f\xb4\xdc\x2e\xce\xf4\x49\x54\x6c\xe0\xe9\x56\x32\x62\xd2\xd9\xe1\xf6\x3d\x80\x3c\x05\x52\x96\x0a\xec\x36\xd1\x1b\x61\x8c\x6c\x03\x84\x4f\xbf\xbf\xd4\x49\xa4\x2f\x54\x7d\xe7\x23\xe8\xac\xe4\x15\xd1\x74\x3b\xc9\x89\xf4\x5c\x04\x3d\x57\x3e\x11\x35\x28\x80\x2e\x2a\x1a\x94\x4c\x8d\x30\x12\x13\x7f\x6f\xe8\x01\x12\x03\x08\x1e\x49\xce\xf8\xf0\x8a\x33\x17\x46\xad\x97\x74\xe1\x94\xb0\xe4\x97\xde\x5a\xce\x62\xbc\xb8\x67\xd0\xea\xdd\x29\xde\x2f\x31\x0a\x91\x66\x21\xea\xe7\xa0\xed\xf5\x75\xc2\x51\x81\x1b\x2a\xff\x7c\x54\xd5\x54\x61\x80\x67\xf8\x9e\x14\x16\x81\x2a\x15\x68\x0f\x25\x3b\xbd\xe6\x5d\xa4\x04\x40\xa8\x4c\x2a\x5b\xd9\xef\x51\x82\x5d\xb9\xa9\xaf\x4f\xd3\xc2\x4b\x8c\x23\x2c\xb1\xec\x7d\xf2\xb2\x3e\x96\x7a\xaa\x3b\xca\x46\x80\x6d\x0b\x76\x23\x56\x82\xf9\x04\xe1\x2c\x8f\xba\x76\x35\xf5\x20\x5d\x6f\x4d\x4a\x5f\x7e\x85\xd4\x9e\x6e\xa7\x08\xb8\xfd\x56\x30\x2e\x67\x7b\x4a\x53\xd6\x31\x5a\x47\x7e\x65\xa7\x61\x19\x3c\x26\x68\x1a\x7e\x36\x02\xbc\x63\xe3\xf8\x26\xf8\x22\x0b\xf9\x6d\xca\x13\x82\xf5\x6b\x9f\x30\x22\x38\x26\x92\xcf\x1a\x98\x37\xf8\x18\x4b\xb1\x1c\xa3\x4c\x96\x42\x81\x71\x69\x43\x25\xeb\x07\x9f\xbb\x00\x59\x98\x1c\x22\x6f\xc9\x18\xc7\xde\xd7\x89\xb2\xeb\xbf\x33\xf1\x19\x2f\xfd\x23\x1c\x2b\x33\x69\xf6\x49\xd2\xbd\x54\xf0\x5b\x67\x29\x1c\x61\x5f\x09\xcb\xd8\x53\xf6\x17\xf9\x94\xcd\x41\x3a\x65\x57\x90\x4e\xd5\x19\x64\x50\x75\x22\xe1\x81\x97\x48\xc8\x68\x0f\x88\x2f\x5a\xb3\xe0\x2c\x04\x90\x00\xf2\x1c\x3b\xdc\x0c\x88\xad\xde\x06\xd9\x8a\x64\x80\x92\x7e\x74\x23\x2a\xec\x6d\xde\x7d\x91\x9c\xc9\x3a\x70\x97\xda\x87\x06\x10\x08\xbb\x26\x8d\x6d\xba\x40\xcd\x9b\x25\x50\x1d\x84\xd0\xed\xe4\x55\x75\x5b\xfb\x1f\xa6\xcf\xa2\x0e\x30\x5b\x9e\x4f\x25\xb8\x81\xc1\x0f\x22\x69\xe5\x67\x98\xa0\xe7\xf2\xde\x45\x59\xaa\x71\xca\x24\xcb\x6b\x4d\x73\xdb\x2f\xe6\x17\xb7\x86\x7a\x28\x00\x8d\x96\x61\xa1\x13\xcb\x6b\xf4\x70\xdb\x2f\x18\x94\x7b\xc6\x1a\x80\xfb\x32\x5e\xd5\x53\xb5\x00\x10\xf3\x94\xe1\xfa\x7a\x19\x13\x9c\x85\x4b\x81\x5d\xae\x0f\x46\xd9\x14\x55\x31\xe0\x1c\x83\x4e\xce\xfb\xbf\xb6\x05\xb2\x20\x48\x31\x3c\xda\xa5\x47\x04\x29\x85\xf8\x89\x43\xd8\x04\x57\x49\xa2\xe5\x60\x6e\x34\x9e\xf9\xc8\xb0\xd2\x6e\x81\x1c\xf0\xa1\xac\x47\x95\x00\xe1\xf8\x1d\x2b\x02\xf7\x88\x93\xbe\x3b\x87\x2a\x88\xc4\x66\xc9\x66\x3e\x7a\xc9\xd9\xac\xfd\x6b\x14\x1d\xef\x6b\xcc\xb5\xe3\xef\xd7\xc4\x4a\xc2\xfc\x38\xfb\x0b\xdd\xb8\xf9\x66\x05\xac\xce\xd8\x52\xee\xd1\x73\x4b\xae\x52\x64\xe0\xf5\x78\xac\xe9\xa9\x91\x99\x2e\xe2\x58\xaf\x22\xdd\x72\x08\xa3\x28\x30\xf6\xd7\x8b\xbc\x82\x0b\x5e\x4f\x1c\xc8\x68\x64\x75\xda\x18\xba\x92\x4f\x90\x9f\x82\x72\x05\x1e\x7f\x7f\x90\xea\xdb\x6c\x30\x3b\xce\xea\x9c\xc8\xcc\x3f\x91\x3a\xad\x84\x79\x2c\x09\x14\x7f\xbf\x94\x4b\xe2\x40\x8c\xba\xdd\x58\x4d\xf3\x27\x1a\x87\x67\x02\x28\xf0\x06\x28\xd4\xc0\xb7\x02\x9b\x6c\xc0\xff\x86\x3d\xa3\xdc\xcb\x08\x4f\x68\xbc\x20\x8d\x84\xf8\x00\xd6\xd2\xf2\x09\x25\xc3\xaf\x27\x1f\xec\xba\xb7\x2b\x1e\xe0\x39\x8b\xa8\x2c\xc9\x73\x27\x2a\x92\xd8\x6e\x80\x3c\x89\xf3\x4a\x50\xa0\xa4\x88\x8b\x04\xb9\x8b\xa6\x41\xf0\x7a\x70\x10\x24\xe9\x02\x41\x8b\x72\xc2\xcf\x14\xec\xad\x46\xa4\x51\x00\x32\x00\x40\x1b\xba\x39\xd4\x36\xf8\x64\xf6\xcb\xb8\xd6\x0c\x38\x57\x44\x06\xde\x37\xd8\xbf\xe2\xfc\x62\x8c\x2a\xcd\xae\x88\x74\x00\xb9\x28\xea\xa7\xdb\x76\x70\x46\x28\xe4\x5e\xfd\x7d\xec\x59\x2b\xe1\xcc\x28\xe9\x4b\x23\x72\x70\x2f\x0a\x2d\xcf\x75\x37\xa6\xd5\x62\x9c\x40\xe6\x80\x00\x5f\xb3\xbe\x08\xe8\xba\x06\x90\xe8\x5c\x2d\x5a\xa6\x11\xd9\xa3\xfa\xa1\xa7\x08\xb7\xb1\xe5\x02\xfd\x89\x48\x8e\xaa\xb6\x9a\x28\x16\x5e\x8b\xcd\x74\x06\x6c\x54\x92\x0f\xc2\x18\x01\xd2\xec\x86\x03\x2c\x4c\xd6\x9c\x57\x4a\x53\xec\x62\xde\x0a\xbd\x80\x30\x30\x9c\x3b\x55\x88\x89\x97\x71\x9b\x1f\x18\x36\xfa\x61\x5f\x19\x05\x45\x5c\xf1\xd3\x58\xd6\x14\x78\xbc\x7d\xa0\xb0\x2e\x0e\x63\x7b\x59\xa1\x7f\x3d\xf1\xd0\x1f\x89\xbb\x79\x60\xbe\x7f\xd5\xd0\x73\xaa\xf4\x42\x8b\xd2\xa6\xa6\xbf\xa9\xed\x77\xdf\x97\x59\xd0\xe7\x0d\xae\xae\x2b\x2d\xa9\xed\xf7\x8c\xb2\xd0\xcb\x61\xee\x07\xd0\x3f\x32\x36\x94\x8b\x69\x03\x82\x7c\xd9\x93\x4d\x94\x6d\x42\x14\x91\x0b\x26\x28\x4d\x7d\x9d\x6e\x91\x14\xc9\x0c\xd1\x64\x1d\x14\x29\x7c\x00\x2f\xcb\x34\x25\x72\x3c\x02\x12\xa0\x58\x4c\x98\x01\x9e\x0f\x2e\xd7\xca\xf8\xe2\x65\xf1\xd3\xc0\xfe\x53\x7b\x91\x15\x05\x5d\x31\x9d\x54\x03\xf6\x53\xe3\x36\xa8\x1c\x68\x78\xd7\xfb\x26\x74\x2c\x8e\x91\x5b\x2b\xe7\x41\x8b\x63\x75\x90\x63\x35\x78\x5e\x0d\xe7\x14\x6f\xb6\xb0\x1d\xe9\x37\x31\x8b\x0c\x35\xf8\xa5\xce\x02\x9b\x85\x63\x7d\xe4\xf9\xd6\xb8\xd6\xe9\x9f\x8f\x94\x1b\xa1\x8a\xc6\xa4\x14\x30\x46\xfe\xd3\xa0\x89\x3f\x61\x80\x26\x09\xa0\xce\x27\x1c\xc8\x7d\xfa\x44\x00\xec\x5c\xff\xf8\xa4\xe6\xc1\x83\x1a\x93\xe6\x17\x44\x86\xce\x2b\x24\xc7\xe9\xb7\xe3\x38\x89\x92\x98\x0a\x10\x22\x93\x3a\x8e\x3e\x17\x2d\xe0\x4e\xa2\x49\x2f\xbd\x06\x15\xa2\xde\x6d\xe7\xcd\xb4\x32\xe8\xd4\x57\xfb\x6a\x53\xc1\xdb\x41\x68\xe3\xd7\x11\x6b\x08\xc2\xc8\xdd\x8f\x25\xbb\xf7\x24\x93\xd7\xf0\xea\x14\x54\x51\x69\x4a\x9d\xa9\x79\xae\x23\x26\xcd\x85\x86\xd3\x01\xa5\xd3\x32\x8f\x04\x65\x1c\x53\xf0\x33\x64\x7f\xdc\x50\xb1\x64\x1d\xe1\xed\xe3\x0a\xb6\x4d\xcd\x7e\x83\x02\x9c\x27\x84\x8d\x9b\xd3\xfd\xc8\x09\x6c\x62\x22\x93\x54\xb7\x91\xa2\xde\x28\x8e\x9b\xb6\xa4\xd9\x35\x1b\x1a\xb3\x9e\x15\xcf\x9a\xf6\xb3\x09\xd3\x69\x38\x90\x47\xce\x19\x21\x02\x6f\x31\x64\x2c\x5e\x34\x70\xf9\x7a\x13\xd8\x1b\x20\x83\x53\x17\x46\x73\x50\x62\xbf\x49\xd2\x86\xff\x30\x5c\xe5\x7f\x64\xae\xfd\xca\xdd\x6c\x5f\xac\x66\x4d\xac\x66\xf9\x98\x60\xb9\x42\xdb\x29\x37\xf3\xc6\xaa\x2e\xca\xb3\x2a\x97\x39\x6c\xa0\x53\x4b\x4e\x93\x9d\xb3\x75\xb7\x2e\x94\x30\x05\xba\xbd\x47\x61\x16\xeb\xc2\x55\x19\x1c\x4b\xda\x5c\x13\xcf\xd6\xc0\x54\x65\x9c\x39\x26\x5a\x1e\xb5\x13\xd3\xf0\x2b\x43\xf7\xf7\xb1\xe9\x17\x02\xe9\xd8\xe7\xd5\x17\x17\xed\x57\x0e\x2b\x62\x2c\x89\xfb\x7b\xc2\x21\x27\x83\xc1\xe2\x7f\x4c\xe6\x51\x41\xed\x5d\xb1\x3f\xa3\x60\x1b\x81\x50\x57\x3a\x19\x21\xbc\x83\x90\x1b\xe9\xcf\x3c\x33\x1f\x11\x5c\x6c\x53\x5d\x6c\xd5\xd9\x5e\xf4\x6b\x82\xd2\x16\x86\x7d\x8f\x02\x63\x77\xcf\xd4\x89\x5a\x8e\x43\x33\x66\xca\x74\xd9\xae\x8c\x5c\x9f\x73\xf3\x41\x02\xb3\x9e\xf4\x12\xb8\xc0\xf2\x58\xca\x61\x9e\x30\xaf\x23\x65\x62\xb7\x92\xea\xc2\xf1\x52\xe5\xde\x99\x92\x35\xf2\x68\xd3\xe1\xfb\x92\xd9\x42\x6e\x5d\xe4\xa6\x4f\x37\xf1\xbb\xd6\xe0\x3a\xb4\xb6\xce\x36\xb5\x89\xa3\xcb\x80\xb4\x8c\xb8\xd6\xd5\x25\xb2\x4d\xa0\xf3\x79\x12\x16\x92\x3b\x96\x65\x1e\xdd\xfe\x43\x1c\x53\xa3\x0b\x6f\xe8\x62\x30\xf0\xb6\x00\xf5\xee\x7c\x33\x29\x53\xe9\x7d\x0f\xce\x05\xf4\x8b\xb5\x06\x5e\x65\xa8\xbe\x7a\x0a\xf0\x86\xad\xad\x73\x2d\x85\x66\x05\x9b\x55\x85\x20\x5c\x60\x41\x43\x5d\xfc\x72\x89\x10\x67\xfb\x1e\x22\x19\xd2\x12\x76\xe0\x50\x4d\x35\xd6\x85\x95\xe4\xe9\xe9\xf9\xe3\x17\x9b\x9c\x29\x06\x50\xc3\xa6\xf8\xeb\xa0\x2f\xc0\x59\x0c\x59\x5d\xc1\x0d\x89\x45\x42\xd8\x7b\x49\xf6\x21\xd4\x51\xd9\xb0\x82\x4c\x0c\xd8\x9b\x6a\x03\xbf\xaf\x8c\x96\x5c\x42\xf4\x55\x39\xe1\x61\x07\x59\x75\x82\x8f\xdc\x52\xea\x44\x7e\xb0\xf2\x03\x3e\x02\x28\xc6\x0f\xfc\xb4\xf2\x28\x51\xae\x77\x0d\x2b\x33\x8f\x31\xcb\x2d\x3b\x38\xb2\xd4\x3d\xb8\x30\x7e\x25\x17\xaf\x6b\xd5\xbb\x6f\xcb\x43\x6c\xd3\xae\xc1\x0f\xc1\x31\x2c\x3f\x3d\xee\x58\xb1\x87\x30\xad\x29\x26\x9e\x83\x39\x41\x19\xa0\xba\x6a\x8e\x46\x7f\x68\x8e\xb1\x99\xd6\x74\xad\xb9\x48\xff\xe5\x2c\x13\xea\x85\xd3\xf2\x21\xf5\x6a\x21\x41\xf5\x3a\xa5\xe2\x32\x0f\xce\xf2\xcf\x2c\x47\xe5\x0c\xcd\x73\x59\x19\xeb\x4d\x1c\x67\x76\xd9\xa5\xb9\xbc\xb9\xf6\x40\xe6\x89\x1a\xce\x02\x63\x8e\xf5\x6a\xf2\x1d\x87\x8b\xc5\x2f\xb5\x4a\xdf\xef\x99\x57\x47\xed\x9d\x6c\x8d\x16\xe7\x05\xc8\x58\xf7\x5d\xc5\x4d\xc5\x42\xbb\x6a\x9f\x60\x38\xb3\xef\x6a\x4e\xa3\x6a\x76\xc0\xa1\xd1\x0f\xdd\xe0\x61\x6f\x22\x86\xa5\x11\xc2\x2f\x2d\x6e\xc3\x90\x40\x06\x38\x20\xb6\x68\xcc\xd1\x96\x49\xae\x26\xb4\x51\x81\x96\xf7\x77\x33\x09\x4f\xac\x7d\x92\xc3\x1a\xcc\xe4\x6a\x76\x1f\xca\xcd\xa5\xef\xf3\x5e\xd6\x28\xf9\x35\x2c\x3c\xdb\xbb\x3d\x08\x31\x09\xf2\x58\x7f\xfa\x78\xb3\xd3\xd5\x66\x99\x29\xef\xc6\xf2\x2f\xa5\x2c\x45\x9f\xc7\x4b\xdd\xd9\xb9\x48\xf4\xa5\x81\xe0\x49\x73\x92\xbd\xbe\xbc\xaa\xde\xf9\xb9\x12\x83\x74\xdf\x0a\x33\xc7\x1b\xfe\xe7\xb1\x5e\x9c\x52\x53\x38\x56\xdc\x2f\xed\x52\xcd\x98\x37\x3d\xe5\xb9\xd8\x40\x07\x64\x5e\xd1\x20\x91\x59\x4f\x96\xc3\x36\x14\x95\x1f\x92\x08\x49\x63\xc6\x2c\xc4\x1c\xd9\xc1\x88\x98\xfc\xc5\x82\x58\x30\xbc\xcf\x24\xb8\x54\x9b\x47\xb3\xec\xce\x31\x0f\xb6\x7f\xdf\xe2\xca\x07\x96\xaf\xb6\x89\x82\x25\xe5\x09\x3c\x1a\x85\xa9\xbf\x28\x1a\x3a\x8c\x5a\x8a\xa5\xc2\xa7\xc1\xa9\x6c\x8d\x16\xc4\xde\x09\xb0\xe4\x99\x69\xc2\x48\x30\xfe\xb6\x7b\x42\xd5\x01\xd6\x15\xbd\x1e\x93\x67\x2a\x76\xc7\xcd\x5b\x5c\x59\xa0\x23\x25\x7d\x4c\xd8\x28\xa3\xa1\xad\xb2\xf4\x3d\x11\xe3\x50\x29\x82\xd6\x01\x8c\x01\x4b\xf6\x60\xb3\x5f\xd6\xdb\x24\xd2\xcb\x38\xd3\xa7\x42\x2c\xd8\x08\xb2\x4c\x1e\x09\x66\x11\xe6\x7d\x43\x47\x76\x97\x60\x9a\x49\xb1\x71\x89\x85\xc9\xd3\x48\x4c\xf0\x02\x17\x0c\x87\x68\xfb\x93\xd8\xe4\xa7\xd7\xbe\xf8\x63\xb6\xbc\x45\xfb\x5f\xe1\x13\xe1\xa6\x86\x82\x0b\x82\xc9\xd5\xe3\x20\x8b\xbe\x2a\xda\x9e\x51\x96\xb9\xde\x0e\x72\x3b\x02\xd6\x3c\xe1\xae\xbc\x44\xe1\x2b\x7e\x83\x2e\x4a\xc2\x74\x1b\x09\xa4\x14\x15\xd4\x72\xf5\xf2\xf5\x6b\x57\x8d\x7a\x45\xa5\xdc\x6a\xf6\x4a\x3a\x6d\x0a\x6f\x89\x9b\x11\x9b\xdd\x8d\x8e\x7b\x93\x2c\x73\x99\x1a\xf4\x7a\x84\x25\xe2\x6d\x85\xcb\x85\xeb\xa5\x46\x63\x22\xd1\xbd\xdd\x53\x54\x9a\xed\x94\x1b\x00\x28\x27\xf9\xab\x20\x83\x27\x95\xf3\x90\x31\x50\x76\x80\x6b\x7d\x4a\xf9\xdd\xd1\x4d\x23\x75\xd0\xfa\x78\x00\x2c\xc1\x8a\xa7\x40\xa9\x40\x34\x34\xc9\x2f\x34\xda\xe8\x12\x3d\x68\x2d\xe4\xb1\x98\x71\x8d\x1a\x7a\xb5\x57\xad\x22\x86\xeb\x45\x86\xad\x18\xf8\xdd\x62\xfc\xb5\x1a\xe0\x31\x9b\x6e\x5e\xfa\x9e\x4c\x99\x17\x2c\x07\xeb\x23\xc0\xc1\xec\x33\x99\x9f\x90\x34\x78\x1e\x63\x93\xe3\x40\x69\x46\x81\x62\xdb\x7d\x76\xf6\x7b\x1c\x19\xfa\x61\x5e\x86\xe5\x15\xd8\x94\x61\x46\x4a\x9c\xfd\x96\x90\x0c\x65\x77\x01\x5b\x5b\x29\xbc\x97\x3d\x1c\x5c\xd5\x5c\x41\xf0\xf7\xf4\x6a\x41\xb8\x21\x99\xfb\xcb\x95\x07\x5d\x0f\xd0\x08\x6f\x15\xc9\x04\xbc\xd5\xf1\x84\x8b\x3c\x5e\xcb\x95\xcb\xeb\xb1\xac\xe9\x5e\x54\x72\xd5\x19\x0e\x9c\x65\x27\x01\xc4\x89\x40\x9f\x8f\x73\x4b\x71\x30\x05\x84\xa4\xa3\x62\x12\x33\x3a\xb0\xdc\x4a\xc7\x40\x88\xf0\x63\x68\x57\xaa\x21\x01\x64\x04\x30\xfc\x6c\xf6\xbb\x7b\xc6\x86\x76\xda\x56\x4a\x76\xa0\x06\x40\x54\x67\x83\xad\x3e\xa6\x77\xe3\x80\x49\xd2\xa5\xef\xaf\x48\x27\xfb\x76\x59\xd4\xe2\x21\x2b\xa6\x17\x4b\x14\x2c\xe5\x82\x52\x35\x1b\x45\x0b\x0c\x45\x78\x8a\x42\x0d\x39\x82\x61\x1b\x95\x9b\x2d\x06\xa8\x11\x20\xe8\x8b\x0c\x8f\x15\x7d\xbf\x5c\x0f\x3d\x75\x69\xd3\x45\xf0\xd1\xb0\x65\x1b\x50\x2a\x2a\x71\x56\x07\x0c\x2e\x54\x05\x71\x10\x2b\x6b\x0c\x84\xb8\x32\x03\x2e\x6e\x6b\xaa\x61\x05\x43\xec\x01\x33\x30\x09\x59\xf1\xb4\x13\x2f\x06\xa5\x7e\xdc\xdc\x7c\x43\xcd\xca\xe4\x24\xab\x9c\x39\x16\x0d\x85\x26\x7c\x92\xe9\xd8\x87\x63\xa2\x6e\x86\x0f\xb4\x71\x22\xc8\x72\xd5\x01\x5b\xba\x2e\x4a\x3f\x76\x82\xe3\xf2\x00\xb8\x03\x47\x92\xd1\xbb\xd0\x1e\xe5\x1e\xc0\x76\x7a\xb0\x60\xf0\x9f\x24\x8a\xc0\x67\xf6\x1e\xf3\xdc\xf0\x2d\x9b\xaa\x1a\x63\xf9\xcc\x5c\x9f\x26\xb8\xcc\xb7\x09\x25\x13\xe3\x10\xa3\x0a\xfc\xf9\x62\xbf\x44\x99\x33\xba\xf0\x31\xa6\x06\x8e\xfb\xc4\x74\xb6\x69\xcd\xdb\x0a\x1c\x3d\xb0\x1b\x27\xad\x6f\x37\x86\x93\x6c\xfb\xc0\x5b\xe7\x7d\x74\x26\xd9\xb9\x4a\x9d\xae\x81\x46\x50\xfb\xde\xc0\x91\x4b\x2d\x73\x50\xd4\x53\xda\x33\x4a\xd6\xbc\x3f\x78\x77\xc5\x0c\xec\xdc\xc3\x09\x9b\xc7\x0d\x98\xca\x72\x84\xb4\x07\x12\x8e\x4e\x82\x18\xc2\x2c\x78\xa1\xb0\xa7\x8c\x14\x58\xfe\xfc\x18\x8b\x09\x62\x05\x73\xef\x68\xcd\x33\x41\x90\x1e\xc2\x72\xb9\xac\xc1\x87\x2e\xdd\x85\x98\x36\x20\x47\x16\x9e\x8e\x67\x5d\x99\x21\xb1\x39\x3e\xdb\x98\x6b\x76\x86\xa7\x8c\xd5\x35\xdb\x72\x36\x97\xec\x37\x68\xad\x6d\x57\xb2\x38\x22\xd4\xeb\x3d\xbf\x3b\x27\xcf\x91\xdc\x2f\xb0\x2a\xb1\xe8\x40\xe4\x03\x0c\xe4\xb3\x35\x61\x1b\x1b\x0a\x33\x88\x8c\xa7\x26\x41\x55\x3f\x8a\xd8\xc2\x59\xaf\x6a\xb5\x2f\xda\x09\x60\x06\x60\x2b\x0d\xbc\x07\xa7\x0a\x29\xc1\x96\xf5\xdd\xcb\x54\x20\x03\xd5\xa7\xc2\x43\xcc\xa7\x13\xd7\x9f\x8e\xd6\xa9\xe4\x14\x5a\xdb\x8d\x41\xc5\x53\x9e\x90\x9d\x75\x45\x2f\xd7\x29\xbf\x29\x12\x65\xe1\x3b\xb8\x9a\x6f\xb5\x11\x05\x7c\x4f\x48\x68\x2c\x95\xa1\x3a\x0b\xa8\x41\x93\x26\xdd\xea\x6a\x61\x7f\x8f\x56\x99\x72\x58\xef\x81\xd6\xa9\xf9\xcd\x0e\x81\x43\xaf\xef\x42\x2a\xc6\xfb\x3b\x09\x05\x2e\xdc\xd4\xe6\xd0\xfd\x58\xde\x13\x96\x30\x10\x19\x33\x58\xf3\x55\x1a\xc7\x55\x6d\xb0\xe5\x6d\xe7\x12\xeb\xd3\xf5\xe8\xbc\x5b\x17\x3d\x1d\x47\x97\x30\xba\xea\x2a\x4b\xb8\xc8\x7f\xc0\x2e\xea\xe1\x53\xd6\x29\xa4\x08\x9f\x94\x3c\x67\x10\x2d\xf8\x48\xb1\x49\x68\x62\x81\x43\x02\x9a\x3d\x03\xa0\x64\x45\xa8\xa2\x8b\x1c\xee\x7e\xf4\x2c\xd3\xbc\xc0\xdb\x42\xd8\x43\x67\xcd\x59\xce\xec\xa0\xca\xed\xf0\x72\xa4\x43\x6b\x15\xdb\x37\x5d\xb2\x68\x3b\xde\xfc\x1b\x0d\x76\x3f\x65\xcd\xc0\xf5\xc9\x17\x5a\xe6\xd6\x9e\x97\xc5\x25\x7a\xdb\x09\x18\xfa\x93\xc5\xb5\x29\xdc\xc9\x16\x81\xf6\x30\x30\x8d\x91\x6a\x76\x33\x97\x76\x97\x77\x27\xf0\x80\x94\x25\xec\x30\x9e\x5d\x16\x63\x27\x6b\xaf\xfd\x64\xab\x9e\xb1\x88\xdf\x3a\x8e\x37\x0f\xc9\x45\xe5\xc3\x6c\x7f\xf3\x78\x60\xce\xd1\x94\xc1\xcb\x2c\x15\xc2\x8e\xa6\x81\x73\xd6\x78\x6b\x35\x60\xfd\x0d\x60\x95\xeb\x9f\x22\xf2\xf1\xc1\x8b\xa6\x5e\x78\xf5\xef\xe7\x95\x15\x43\x32\xe1\x53\x4b\xe8\xed\x1f\xb0\x51\x78\x7e\x16\xb5\x82\xb5\x5f\x36\xf5\x6a\x4a\x2c\x68\x0a\xa6\x39\x84\xdc\x39\xbd\xe3\x47\xfe\x61\x70\x06\x67\x74\xcc\x2c\x96\x4b\x55\x09\xee\xa7\xe9\x4b\x81\x74\xe7\xef\x4a\xda\x42\x61\xd3\xdf\x55\xfd\x9c\xbd\xbf\x7e\xfc\xdc\x12\xa2\x33\x56\xf7\xd5\xe0\x95\x79\x7a\xaf\xd3\x0d\xf7\xe7\xa5\x5e\xef\xbe\x12\xd8\xd8\x95\x10\xf7\x18\xbf\xe3\xfe\x2b\xa2\xf2\x94\x4e\x94\x1b\x0d\x19\xc8\xb2\xb2\x32\xd1\x50\xf1\xf2\x3c\x85\x7d\x67\x79\x30\x1d\x2e\x72\x20\x57\xd5\x16\x33\xc0\x3c\x8f\x27\xec\x28\xb1\x0c\x2c\x5c\xc1\xd2\x05\x58\x1f\x93\xec\x0e\x80\xb5\xfc\x7b\xbb\xd2\xb6\x1b\x96\xed\x1b\x62\xfb\xb5\x1e\x43\xd1\xce\x0b\x53\xa2\xeb\xf9\x5f\xc0\x80\x68\x55\x4f\xef\xdc\xd0\xd7\x39\x35\x89\xae\xe9\x0a\x06\x48\x3f\x3a\x92\x30\x8a\xc1\xa0\x21\xc2\x70\xaf\xdc\x4a\x90\x67\x11\x81\x1a\x70\x97\x10\x1f\x9a\xca\x4d\x5c\xde\x3f\xa0\xc5\x50\xe1\xbc\xb0\xa1\x62\x0a\xfc\xfe\x7d\xf4\x3a\xc0\x3b\x34\x4d\x0c\x07\xdc\x87\x3f\xd6\x76\x21\xd4\x24\xf3\x6a\xdd\xe7\x6c\x41\x1b\xf4\x05\x6e\xb1\x04\xb8\x7c\x5f\xcf\xdb\x69\x92\x4d\xee\xca\xb4\xb8\x18\x6c\x5d\x79\xb9\x9b\x5a\x85\xca\x9c\x41\x15\x9d\x4b\x05\x48\xdb\x08\x3d\x55\x97\x47\x01\x96\x7c\xb1\xdb\x49\xd2\x31\x1c\x60\x71\x06\xdc\xa9\xbb\x55\x3e\x29\x91\xe7\x95\x03\x1f\x6e\xbd\x3b\xab\x0b\xf2\x83\x57\xb9\x16\x52\x75\xe7\x0a\x71\x47\x28\xda\x4e\x2f\x65\xc4\xd9\x69\x23\x3d\xbb\xc1\xaf\xf7\x77\x6c\xb9\x23\x04\x6d\xec\xc0\x5d\x20\x58\xd5\xba\xcb\x82\x0b\xf3\x8d\xe0\x05\x2e\xd9\xb6\xd9\x2a\x9c\x38\xbf\x9e\x31\x77\x85\xcc\xcd\xf1\x66\x5d\x98\x90\x24\x2d\x49\x00\xf9\xb5\xd9\x4a\xc2\xcd\xcd\x19\x5e\x20\xef\xce\x52\x9a\xef\x7b\xfe\xf1\xb3\x50\x0a\x5f\xa1\xde\x4d\x1e\x61\x6e\x3b\x63\x37\xd3\x4e\x50\x98\xa0\x60\x7e\x5e\x81\xe1\x10\x7f\x15\x47\x13\x0c\xfd\x7d\x8a\xb1\xca\xd6\x66\xf8\x7a\x95\x79\x94\x6d\x5d\xc7\x45\x68\x47\x2b\x55\xa8\x77\xc3\x1c\xae\x95\x07\x57\x77\x14\xce\xf7\x3d\x24\xc4\xd5\x09\xaa\x31\x6d\x96\x40\x11\xde\xa4\x60\x31\x79\x00\x07\x9e\x59\x41\x47\xc1\x31\x9c\xaa\xf3\xa8\x3c\x84\x43\x72\x88\xac\xc4\x94\x24\x78\x8a\x93\x49\x78\x62\x5b\xb6\xb6\x31\xb0\x7b\x10\xca\x56\x23\xdd\xdd\x18\x84\xc6\x35\x1e\xce\x00\x7c\xa2\x97\x88\x0a\xad\xb8\xc8\x3c\x5f\x08\x19\x3f\x3d\x0d\xb9\x77\x51\x77\xc2\x74\x29\x6f\x54\x28\xea\xbb\x30\x93\x87\x04\xec\x00\x3a\xa0\x43\xf6\x59\x50\xe1\xb9\x26\x32\x6f\x9a\xba\x95\x28\x09\x76\x0c\xbd\xf5\x13\x7f\x7e\xf8\xa3\x10\x2e\xb5\xa8\xb5\x8c\xee\x93\xbe\x25\x71\x95\xbe\xe8\xba\xad\x0e\xf2\xc4\xd3\xa5\xdd\x6a\x39\xf4\x1c\xf7\x9c\x9e\x8a\xc1\xf1\x83\x29\xa4\x1c\x71\x10\xbf\xde\xdb\x11\xf9\xb6\x14\x30\xd6\x43\x71\x79\x54\x12\xaf\x38\xb3\xf0\x10\xd4\x3f\xa9\x13\x3b\x7f\x5d\xa8\xbd\x14\xca\x88\x89\xc1\x82\x02\x4a\x53\x96\x57\x51\x1b\x6f\xc3\xc2\x37\x52\xac\x00\xb6\x60\x4c\xdf\x2e\x70\x19\x74\x2b\x1e\xc7\x2c\x0c\xde\xec\x08\x64\x04\xa1\x74\xc4\xed\x35\x08\x62\x4a\x67\xce\xa9\x95\x9c\x02\x62\x6b\x3d\x67\x48\xc2\x36\xed\x45\x21\x11\x1c\xe9\x6c\x38\xd9\xcb\x65\xc3\x6c\xe4\x4c\x35\x37\xa9\x65\x01\xe9\x51\x9c\x12\x49\x8e\xc9\xc3\x2b\xba\x52\x7b\x60\x8f\x32\xf6\x10\xae\x3c\x70\xfe\x5e\x29\x79\xf4\x43\x8b\xc7\x6b\xb2\x1f\xa4\x18\x93\x4b\xa8\xcf\x47\xa8\x36\xba\x2b\x7d\x52\xc2\x57\x54\x94\x34\x0b\xfe\x45\xdc\x91\xd3\xdb\xf5\x78\x66\x93\x68\xe0\x6d\x05\x1c\x1d\xd6\xc5\x47\x49\xfb\x10\x72\xd2\x69\x13\x9c\x69\x38\xb3\x33\xec\xa9\x23\xc5\xa1\xc3\x1c\x41\x44\xe3\x41\x1b\x2a\x98\xf0\x53\xd4\x9a\x90\xef\xce\x51\x06\xc9\x37\x3a\x24\x91\x73\x60\x34\x25\x0a\xbc\x10\xb4\x00\x48\x8a\x23\x7b\xd8\x1a\x7c\xd4\x2f\x1a\x24\xc2\x73\xa1\x2a\x06\x99\x9e\xc0\x68\x97\x34\xcd\xac\xa6\x64\xc0\x13\x2d\x85\xe3\x60\x9f\xe1\x29\x10\xc8\xee\x73\x45\x1b\xb6\x16\x71\x4e\x32\xb7\x3b\xaf\x3d\xa0\xe4\xaf\xd4\x14\x4d\x9d\xe3\x5e\x82\xda\x76\xd5\x90\xd2\xbf\xcf\x17\x3d\x73\x6d\x2c\xe7\xbe\xe9\xbe\xa6\x36\x57\xff\x8e\x6f\x30\x7d\x0c\x0c\x03\xce\x10\xac\x7a\xa8\xaa\x6c\xfd\xa0\x9d\xcf\x4c\x66\x14\x46\xfb\x7a\x27\x2d\x72\xb8\x50\x4c\x27\x3b\xd2\x2f\x49\x13\x2f\x53\x31\x74\x45\x26\xb7\xc7\x58\x3b\x4e\x9b\x5f\x4f\x21\x35\xd3\x6f\x35\xd4\x86\x2f\x0c\xb3\x76\x53\x82\x90\xdf\xee\x01\x75\x88\xe6\xfd\x08\x6d\x83\x2b\xcc\xd0\x12\x04\x58\xf2\xb1\x4a\x87\x03\x0b\xa0\x3f\xe6\xb6\x3a\xf0\xa7\xac\x42\xd7\x8e\xc4\x6d\xb4\x96\x2a\xb8\x1c\x31\x78\x43\x73\xaf\x4a\x01\x95\xcb\x23\xca\x19\xad\x69\x1c\x21\x4b\x75\xc0\xff\xe0\x4d\xa7\x67\x2b\x20\xc7\x29\x23\x1e\x55\x7b\xcd\x13\xf0\x21\x00\xbe\xea\x10\x07\x60\x6e\x46\x91\x98\xcd\x8b\x8b\x37\x5e\x92\x31\x47\xe6\x26\x96\x61\x71\x36\xc8\xd4\xbf\x20\x85\x7e\x93\xe9\xdc\x1c\x7d\x33\x97\xc0\x59\x0c\xff\x21\xa8\xa1\x63\xd3\xdc\x2e\xb5\x86\x45\x5e\xe3\x17\x08\x7e\xd3\x87\x48\x03\x0f\x51\xc8\xd5\x72\xa3\x81\x87\xd7\xa1\x37\x9a\xc3\x08\x68\x8d\x9e\xa8\x28\xa5\x4f\xb0\x07\x18\xc5\x64\xba\xc5\x18\x7e\x8a\xfa\xbe\xf2\x91\x8e\x60\x21\x4b\x01\xd6\xe5\x03\x0f\x2b\x36\xc0\xf0\xd0\x35\x79\x96\xa1\x00\x61\x7d\x58\x9d\x54\xe8\xd5\x3d\x62\x49\x40\xd1\x9a\xf7\x1e\x44\x61\x61\x50\xbf\x06\x5d\xdb\x83\x8a\x93\xfb\x32\x61\x70\x04\x17\x55\x63\x07\x6b\x49\xa6\x2d\xf2\xf8\x9b\xc4\x56\x68\x50\xc1\x6e\x2d\xe7\x8b\x6d\x27\x36\xe9\xd6\xac\x6e\x25\x96\x00\xbf\xc7\xaf\xad\x63\x4a\x9c\xbc\x4b\x76\x64\x25\x66\xd6\x20\x93\xe6\x4b\x9f\xb4\xbf\x65\xbe\x4e\x6d\xbd\xdf\x76\x3e\x79\x18\x3f\x47\x95\x9c\x5f\xc0\x25\xf9\x2f\x38\x0f\x76\xe8\xcb\x7d\xaa\xbb\x88\xd6\xaa\x7a\x58\x52\x72\xca\xd9\x73\x22\xdf\x06\x2a\x12\xd2\xd8\xe1\xfb\xd4\x9d\x0d\x62\xd9\x07\xb2\x7e\x6c\xf2\xf4\x5f\x0d\xf8\xef\x74\x53\xf2\x11\x17\xaa\xd9\x43\x71\x5e\x1b\xcc\xa3\xcb\x73\x1a\xa0\xb4\x0e\x38\x88\x59\x59\x1f\x4c\x14\xfa\x7d\xba\xd5\x33\x5a\x0a\x8f\x47\x49\x7e\x56\x54\x55\x6a\xa0\xbf\xba\xad\x58\x5d\x91\x5f\x20\x2e\xbf\x6c\x48\xb3\xe2\x92\x64\x76\xa8\x8b\x00\x30\x04\x71\x72\x3d\xa4\x76\x21\x8a\x5a\x0d\x73\xda\x8d\x16\x3f\x34\x8c\x4e\xfb\x47\x49\x84\xde\xe2\x4b\x8d\x4a\x38\x69\xac\x58\xc5\x32\x10\x6b\x3e\xe3\xac\xf3\x31\x51\x14\xa5\x85\x46\x2b\x5d\x54\xf3\xa8\x66\xcf\x0f\xe3\x29\x92\x96\x40\xb7\xdf\x8e\x1e\x7d\x1d\x2a\x52\xff\x1b\x4d\x77\x89\x86\xb9\xa2\x83\x01\x78\x41\x15\x65\x92\x65\x66\xfe\x5d\x99\x99\xbb\xfa\xfb\x9c\x99\x3b\x2a\x22\x51\x11\xf9\x5c\xde\x85\x54\x0d\x25\x2a\xca\x4e\xa1\xf7\xae\x69\x05\x31\x92\x41\x0c\xd2\x06\xff\xed\xa6\x34\xbe\x07\x40\xae\x16\x32\xf6\xc6\x26\xef\x71\x3c\xb2\xa7\xab\x95\x23\x1c\x39\x06\x12\x5c\x96\xed\x3b\xc1\xc3\x52\x7d\x55\xb6\xb6\xfa\xec\x8b\xd0\xda\x2c\xfb\x33\x1e\xaa\x98\xd2\x87\x80\xda\xa9\xd2\x3c\x3d\x7f\x3f\xdf\xc2\xdd\xaa\x23\x6d\x6a\x58\x0e\x69\xfd\x18\x4d\x10\x03\x16\xa2\x7d\xd1\xdb\x94\x7c\x19\x3b\x33\xff\xa6\x17\x15\x53\xd4\x0e\xef\x13\xea\x3d\xdc\x26\x0e\x12\x55\xa4\x3d\x3b\x49\x71\xaf\xb0\xec\x24\x8f\x8b\x94\xc1\xd6\xe4\xc8\x45\x66\xd1\x03\xe4\x3d\x1c\xd2\x75\x07\xce\x62\x87\x6a\x4f\x6a\x25\x91\x66\xae\x20\x78\x50\x76\x5e\x04\xe3\x03\x8f\xd7\x94\xe4\x7e\x44\x5d\x36\xf0\x6c\x3b\x02\xa7\x5a\x5f\x9d\x40\xa7\x8a\x5c\x73\xb1\xed\x1d\x39\xb1\xb0\x25\xa8\xa1\x61\x36\xef\xf6\xf8\xaa\x18\x19\x49\xe7\x61\x85\x17\xef\x59\x88\x48\xa2\x66\x48\x9a\x1e\x42\xbc\x19\x54\x19\x3d\x6e\x73\x10\x93\x91\x71\x44\xb0\x8a\xf3\x22\xff\x12\xa4\x79\x60\x88\xce\xe4\xdb\x8e\x36\xc4\x8c\x2c\x7d\xa9\xbd\x70\xf9\x21\xa5\x5f\x73\xe5\xc6\x73\xd1\x22\xbe\x99\x0b\x44\xe9\x33\x6f\x41\xc1\x62\x8c\x0b\x79\xa6\x18\x44\xac\xa1\x4b\x82\x92\x5d\x87\xc3\x2f\x3d\x1d\x1a\x0b\x4d\x65\x94\x90\x34\x26\x19\x93\x21\x08\x6a\x6b\x1e\x07\x06\x46\xd3\x14\xbe\x92\x3e\x2f\x21\x64\xb3\x11\x35\x2f\x13\x69\x52\xc2\xf1\x85\xa8\x98\x04\x63\x7b\xa9\xda\x5d\x97\x1f\x12\x52\x69\x95\xc7\x81\x38\xb7\x2e\x42\x11\xeb\x1c\x87\x8b\x0d\x13\xd6\xbb\x2b\x2b\x8f\xdb\xa1\xbc\xac\x99\x61\xeb\x69\x0d\xd1\xf2\xa2\xc4\x86\x8f\xbc\x2e\x5c\xaa\x1a\xf5\x8a\x3a\x55\x8b\x2e\xc1\x71\x6d\xf4\xf9\x4b\x01\x20\xbc\xb2\x12\x7c\x0b\x32\x32\xbf\xed\x37\x74\x97\x67\xa1\x26\xf8\x0b\x64\xa8\x1e\x2d\xf0\x40\xd0\xe9\xd1\x01\x0c\xee\xf0\x33\x93\xd6\x72\x94\x3c\x59\xaa\x21\x6b\xdd\xe5\x13\x9f\xa7\x68\xdc\x57\xba\xf7\xdb\xf4\xc7\x0d\x61\x70\xa2\xb4\xdb\x3f\xd0\xab\x75\x7e\x34\x3f\x97\xe6\x8d\xbd\xad\x36\x13\x45\x11\xa9\x44\xbc\x5d\xcd\x50\x21\xc5\xa8\x4c\x4a\x7b\xcd\x52\xda\x4e\xdc\xa0\x84\xb2\x3e\x20\xca\x28\x18\xcd\x95\x20\x0b\xe2\xa1\x02\x0b\x09\xfd\x90\xc7\x97\xbf\x56\xa0\x9d\x9d\xc7\xfb\x6c\x10\xf3\x68\x0d\xc9\x49\x46\x17\x18\x90\xfb\xf3\x3d\x49\x54\xe2\x2f\x58\x76\xa1\x63\xff\x3b\xa3\x7c\xba\x86\x1d\x47\x32\x6f\xbb\x26\x3c\x16\x50\x02\xcd\x0f\xdb\x2a\xa1\x04\x8b\x07\xe8\x86\x27\x7a\xa4\xbc\x99\xf2\x28\xb0\x0d\x0b\x2e\x5d\x77\xbd\x8f\xea\x22\x2f\x56\x1c\xee\x78\x27\x23\x29\xbb\x9f\xf0\xb0\x42\x35\x9b\xc2\x4e\xa2\x02\x15\x7f\x8d\xed\x8e\x36\x3e\xe9\xbd\xea\xd9\x85\x96\xe0\x2d\x13\x0d\xf0\x45\xff\xaa\x49\xad\x4e\x3f\xd0\x18\x74\x5b\xad\xc9\xdf\x8d\xd8\x7e\xd0\x0f\x8a\xc8\xf2\x34\x77\x2b\x37\xdf\x94\x20\x09\x71\xf6\x05\xe6\xaf\x8c\x5e\x55\x07\xc1\x34\x26\xb3\x1e\x8e\xed\x1a\xb8\x64\x40\x6d\xb9\x9e\x48\xc9\x22\x47\x0a\x02\xf0\xa1\x4e\x46\x08\x69\xc7\x89\x90\x3f\xee\xe7\x50\x29\x25\x9e\xc6\x02\x26\xcb\xa9\x16\x3e\xcd\xc0\xca\x37\xa2\x94\x83\xa9\x82\x62\x97\xda\x13\xff\x7d\x24\xaa\x64\x1e\x55\x59\xe4\x0f\x7f\x48\xc6\xc2\x63\xfb\xaa\xfa\x71\xda\x1d\x12\x45\x6f\x1f\xe8\xbc\xb9\x3c\x5e\xc6\x3b\x9d\xb6\xcf\x97\x2a\xdc\xc6\xa5\xcf\x56\x5e\xaf\x82\x04\x09\x1a\x76\x07\x04\x0e\x77\xa8\x0a\x38\xb7\x98\x1c\x6c\x80\x7c\xa6\xfa\x36\xca\xb0\xfd\xda\x23\x13\x8d\x40\x2f\x89\x0a\x1e\x6f\xe0\x29\x4d\x0d\x69\xf7\x0c\x40\x2a\x3f\xae\x31\x52\x42\xc6\x74\xb9\x79\x86\xe2\xaa\x67\xcb\x37\xd2\xf9\x21\xa0\x84\xd3\x3f\x60\xcd\x7f\xa0\x6e\x8b\x52\x1a\x71\x08\x88\xb0\x78\x78\x3d\x9c\xdd\x03\x1d\x75\x53\x12\xe4\x8e\x47\x7b\xda\x9f\xc1\x5b\xe7\x05\xf1\x91\x5d\xdd\x37\xb5\x65\xb8\x7d\x65\xc3\xf4\xdb\x13\xb2\x29\xc0\xab\x1a\x70\x90\xb3\xcd\x7d\xf8\x71\x27\x4f\x8e\x3b\xd9\xc6\xfe\x33\x78\x15\xe2\x44\xa8\x5c\x10\x97\xec\x0c\x4c\x90\xf1\xb4\xc1\x13\x53\x0b\x65\xec\x01\xe3\x63\x37\x0e\x09\x26\xe3\x09\x29\x73\x54\xd2\xb2\x31\x1e\xd0\xb9\x61\x27\x38\xfa\x16\x1d\x8c\x67\xe6\x95\x89\x5f\x7b\xa4\x20\xc7\x03\xc6\x99\xab\x38\xe5\xd1\x60\xa5\xc8\x1b\x63\xe8\xcc\xae\x2a\x84\xf1\x43\xdc\x2b\xe0\x8d\xc5\x57\xce\xe5\x51\x17\x24\x40\xd9\x7c\xb2\x49\x92\x84\x34\xb1\xb8\xf9\x13\x04\x81\x04\x25\x7e\x6f\x80\x07\x66\x9f\x5c\x83\x58\x4a\x35\x4e\x20\x96\x2f\xf3\xfc\xe1\xd4\x0a\x27\xe8\x2a\x4d\x38\x47\xf6\x5c\xdd\x67\xbc\x1e\x7f\x03\x4e\x98\x5a\xc7\x90\x79\x48\xf2\xac\x94\x82\x96\x3c\x93\x28\x5f\x12\xd0\x76\xe9\x48\xd9\xf3\x34\x68\x4f\xe0\x84\x4d\x5d\x75\xcb\x74\xaa\xde\xaa\xe8\x60\x20\x44\x7c\x25\x61\x02\xb1\x11\x63\xc4\x22\x23\x8a\x6c\xe4\xf5\x0e\xbd\x2b\xde\xdc\x60\x9d\xc3\x7a\xf5\xc6\xa2\x2d\xed\x49\x2d\xa6\x9e\xcd\x98\xf2\x8f\x63\x49\x1d\x33\xcf\xcd\x18\x8a\x19\x52\x57\x27\x24\xcf\x8e\xa6\x2a\xb6\x0f\xea\xf3\x82\xa4\xc8\xe0\xc4\xed\xaa\x3e\xb5\x65\x29\x08\x13\x01\xee\xc3\xa0\xea\xe7\x27\x6e\xcc\x27\x46\x96\xba\x58\xbf\xa4\x48\x8c\x65\xc7\x75\x66\x03\xa6\x2d\x72\x19\x15\x00\x75\x10\xd1\x75\x91\xc8\x96\xbc\x2e\x01\x86\xe4\xb6\x6a\xc3\xe0\x41\xea\xd9\x35\x36\xf9\x55\x67\xd0\x3e\x08\xeb\x99\x61\x1d\x57\xb0\x72\x99\x4d\x8a\x3e\xf6\x0f\x4a\x5b\x48\xf5\x94\x63\x5b\x96\xda\xd0\x88\xd3\xc0\xcd\xdf\x2e\xe5\x56\xa8\x2c\xc0\xa3\x15\xd3\xbb\xe7\xc4\x9d\x78\xee\x54\x7f\xd8\xc1\x00\x4c\x33\x0b\x4b\xb5\x9d\x82\xb1\x0f\xb5\xb9\x1e\xfe\xaa\x65\x37\x61\xfa\x2c\x6c\xf7\x58\x08\x4e\x31\x33\x48\x76\x06\x47\xaf\x7f\x23\x01\x58\x6c\x29\x06\xa4\x0c\xa3\x9a\x5f\x84\xed\x73\xb8\x8b\x86\xe3\x7f\x7b\xde\x6b\x06\xc1\x3d\xf0\xd0\xb8\x44\xe2\xff\x90\x13\x35\x4d\xa0\x63\x39\x3c\xaf\x2c\xa3\xef\x37\x0d\x23\x31\x20\xb7\x0f\x32\x29\xc8\xf1\x2a\x83\xc9\x7f\x7e\xc7\x5a\xe2\x95\x7d\x21\xfe\x34\xb4\x4e\x9b\x21\x7a\x56\x5a\x9d\xfa\xa5\xc1\x90\xd3\x4e\x88\x07\xe0\x6a\x11\x7e\x33\x52\xe7\x46\x83\xe5\xb6\x82\x20\xb2\xd5\x1b\xb4\x31\xa3\x8b\x63\x78\xac\x3c\x91\x25\x8f\xc6\xaf\x9b\xf6\x4e\x4e\x64\x8a\x32\xf8\x02\x02\x20\xf9\xae\x6d\x4b\x3e\x35\x05\x44\xdc\x52\x96\x27\x50\x34\x5c\x2b\x4b\x75\xc6\x9a\x00\x70\xb1\xf8\xd0\x95\x81\x7a\xd5\x56\xac\xea\xe0\xdc\x0e\xd5\x24\xa2\x43\x67\xb2\x2e\x54\x48\x20\x38\x0d\xbb\x01\xf0\xfd\x38\x55\xba\x3b\x94\x9c\x25\x9c\x45\xf9\x34\x14\xee\xa5\x5e\x2e\x4c\xc1\x7a\x73\xe1\x5a\x79\xba\x25\x4c\xda\x45\xfd\x36\x21\x81\xb8\xb1\xa5\x75\x8e\xe9\xc6\x69\x8d\x9d\xce\x2c\x8e\x67\x19\xed\x42\xc8\xb1\x84\x2b\x84\x1a\xb9\xb0\x98\xb0\x61\x08\x7f\x5b\x21\x45\x98\x15\x49\xcb\xa6\x1b\xc6\x2b\x0d\x7c\x87\x67\xad\x59\xbc\x71\x23\x1a\xf4\xc8\x7e\x90\x16\x99\xdc\xfe\x77\xa2\xa1\x92\x3d\x80\xee\xdd\xf0\xd8\xfe\xa2\x80\x62\x27\xff\x63\x78\xb1\x3f\x7f\xb0\x53\x8f\xf2\x78\x94\x03\x43\x02\x9b\x52\x97\xdf\x0c\xf3\xd2\x86\x5a\x31\x7c\x2f\x94\x97\xa1\xa2\xab\xf8\x2e\xec\x7c\xae\xf4\x3c\x5d\x8f\x1b\x0b\x8c\x5d\x5f\x90\x3e\xc6\x60\x3f\x4c\x48\x3e\xdf\xcb\xdb\xc7\x95\xba\x04\x76\xc4\xe0\xa6\x57\x48\xd7\x22\xa8\xe6\x55\xe6\x7d\x8e\x02\xc6\xd3\x97\x81\xa6\x23\xbd\xfc\x88\xc7\xb1\xe3\x28\x78\x4d\xfe\x40\xb0\xe2\x9c\xca\x71\x77\x8f\x2b\x0d\xf6\x11\x21\xba\x93\xe9\xf3\x4c\xc7\x79\x90\x49\x28\x5a\xc1\x8f\x3d\x32\x5d\x7e\xe2\x1a\x4f\x1b\x14\x4e\xf4\x4c\x17\x36\x00\xe6\x81\x33\xa6\x6f\xe0\x39\xaa\x2b\x68\x27\x2e\xe9\xdb\x8b\x8d\xd3\x95\x7b\x9a\xe1\x1a\xe7\x14\xc5\xe9\x5d\xc7\xaf\xec\x2d\xbb\x15\xdc\xd7\x04\x26\x02\x5e\x5f\x65\xe9\xa4\xb4\xb6\x02\xb1\x86\x57\xa6\x4e\x24\xad\xc8\xe8\xa2\x1f\x0c\xa3\x10\xbe\x7e\xcc\xd7\x4b\xf7\x29\xb1\xfd\xa1\x84\x56\x05\x9c\xb9\x57\x44\x41\xc2\x91\xec\xa9\x98\xe9\xef\x91\xda\x55\x63\xd4\xdc\xc5\x4b\xb4\xbf\x49\xa6\x70\x47\x6d\x4e\xe8\x5b\x9e\xbc\x20\xd9\xe0\xfa\x86\xdc\xdc\x73\x75\x12\x11\xe2\x82\x98\xcf\x75\x6a\x7b\x39\x74\xfa\xd1\xe3\xfc\xcf\x60\x87\xc6\xad\x35\x09\x3f\x57\xb6\xcf\x63\xf5\x90\xee\xa8\x91\x96\x64\x64\x72\xd1\x95\x2e\xc6\x31\xce\x68\x78\xcd\x40\x6e\x4f\xbb\x99\x8d\x7b\xda\xd4\x5b\x63\xbd\x3e\x6a\xb2\x2c\xcc\x63\x06\xa3\x0a\xe4\x52\xb7\x21\x58\x8f\x64\xab\x8d\xc0\x39\x4b\x73\x28\x22\x60\x7d\x54\xfe\xa4\x16\x64\x21\x77\xeb\xc8\x82\x82\xe8\x97\x2a\xf6\x6f\xc4\x3c\x32\xd7\xee\xb2\xd4\xa9\x5c\xad\x2a\x0a\xca\x23\x9b\x7d\xdd\xb8\x7e\x21\x03\x72\xdc\xeb\x9c\x2c\x21\x1a\x19\xc4\xcc\x4c\x5f\x2a\x23\xde\x2e\x41\x3d\x68\x46\x0c\x83\x60\xf6\xd2\xf2\x86\x86\xca\x6d\xf7\x07\xc0\x90\x16\xee\xc3\xe6\xe6\x0f\x94\x18\x9b\x81\x2e\xa3\x1e\x34\x91\xa9\x5d\x01\x42\xa7\x66\xb6\x5b\xc5\x90\xec\x3b\x45\xe8\x25\x13\x6d\x23\xe3\xa8\xf9\x2b\x0d\x28\x3b\xdc\x90\x1b\x88\xa1\xe2\x72\xc1\x87\xf5\x12\x19\x11\x89\xc6\x63\x68\x14\x17\x7e\x89\xa0\xfc\x6d\x8c\x3e\x1b\xe6\x43\xeb\x23\xf8\x09\xc5\xb8\xb0\xe2\x7a\x11\xe7\xc3\xa0\x16\xcc\xbc\xeb\x61\x2c\xff\xe6\xe5\xac\x32\x5c\xaa\xea\x0b\x88\xba\x2d\xfe\x94\x69\xfc\xb8\x4b\x61\xdf\x5e\x44\xe1\x0e\x85\x5e\x40\x73\x6f\xee\x7b\x15\xe0\xf7\xe9\x01\xed\xc0\x6f\x56\x8d\x51\x58\x47\x71\x46\x8d\xed\x4b\xb0\x26\x29\x81\xeb\xba\xf6\xa7\xb6\xae\xa7\x65\xf7\x5e\xa6\x1c\x51\xff\x55\x62\x5f\xc8\xc3\x41\xb4\x1f\x0c\x02\xdf\xa5\x29\xc0\x74\x57\x48\x0f\x1c\x42\x23\xed\xb3\x65\xbd\xfd\x2a\xdb\x52\xb2\xd7\x86\x9a\x45\xa4\x1b\xb0\xda\x87\x15\x18\x3a\x0b\x0c\xa3\xb6\x1e\x62\x6d\x19\xa6\x58\x49\x33\x00\x13\x11\x2b\x04\x2a\xa7\x48\xd9\xf6\x85\x3f\x01\x28\xfb\xf2\x23\x8b\x2e\xc9\x6a\xd0\x28\xe0\xa1\x65\xbf\x58\xd9\x79\xa4\x52\xa5\x67\x19\xde\x9b\xd0\xb7\x3e\xf3\xdc\x62\x03\x4c\x6e\x48\x26\x79\x12\x56\xb3\x68\x0e\xcf\x78\x7f\x48\x62\xfb\xac\x83\x5e\x7c\x01\x34\xc9\x4d\x58\xb9\xa8\x81\x9b\x09\x80\x99\x33\x9f\x08\x68\x61\xef\x18\x31\x93\x01\x6c\xdb\x56\xf9\x58\xf8\x12\xb6\xc4\xc0\x3c\xd1\x5d\x01\x14\x1c\x5c\x28\x58\x30\x20\x35\xfa\x36\x49\x55\xc3\xbb\x5e\x97\xff\x50\x2c\xdc\x7e\x72\x0c\xb4\x18\x21\x84\xd2\x40\x0d\xb0\x4e\xaf\x18\x65\xdc\x01\x4c\x07\x7e\xfe\xce\xcc\xc7\x4f\xb8\xb4\x50\xa4\x6a\x45\x9f\x7a\xa6\xc0\xa9\x6a\xd4\x9a\x64\x04\x13\xad\x03\x45\xf9\x80\x78\x25\x4c\xac\x54\x8e\x98\xd3\x21\x8c\x0b\x3b\x4b\x6c\xe2\xde\xf0\x62\x82\x03\x4f\xcb\xa9\xf5\x80\x5f\x32\xed\xbb\x43\x14\x20\x6a\xc1\x2a\x94\x3a\x95\x62\x29\x9c\x42\x1e\x73\xa4\x01\x2d\x43\x8b\x69\xb3\x32\x33\x14\xcf\xde\xbb\x2b\x07\xd0\x30\x9f\xf1\x8e\x5a\x74\xe6\x7b\x6a\x3f\x00\x86\x38\xa0\x39\x6c\x51\xf6\x64\x7e\x01\x1a\x15\x95\xad\xf5\x29\xd1\x22\x79\xa6\x33\x67\x7a\x88\x18\x40\x07\xfb\x66\xd1\xee\x35\x8e\xf4\x52\xcd\x07\x96\x75\x7c\x32\xad\xa2\x4a\xf3\x26\x6e\xba\x16\xd5\x59\x96\x1e\xf5\x91\xce\x31\xf1\xa1\xec\xeb\xcf\x12\xf3\x69\x5d\xbb\xf2\xc5\x83\xbd\xc3\xd2\x05\xa6\xe2\x21\x51\x16\x3f\xe4\x22\x73\xdf\x82\x76\xdc\x3f\x5c\xe6\x96\xb5\x7b\x99\x43\xbc\x38\x5f\xac\xba\x6a\x2e\x84\x8f\x3b\xcd\x6a\x8c\xef\xa9\x32\x2e\xb4\x3e\x27\x14\x68\xf4\xbd\xfc\xd5\x8e\x8c\x48\x27\xa2\x3f\x39\xbf\x10\x0a\x28\x02\xab\xb5\xde\x9f\x78\xaf\x2b\x78\xd1\x06\xc3\x01\xec\xf5\x60\xd1\x76\x96\x32\x57\xec\x6c\x08\x81\xdc\x6b\x34\xe0\x9c\x37\xf8\x38\x79\xc2\x8b\xdb\x75\xf5\x31\x82\xc7\x02\x47\x80\xa3\xcd\x26\xf6\x8b\x49\x72\xc2\x4d\x6e\x72\xd0\xe7\x08\x77\x42\xda\xf0\x81\x64\x68\x4d\x81\x56\x8e\x43\x37\x40\xb0\x0c\xa6\xfe\x85\xf9\xe8\xfd\xdf\xf9\x05\x47\xfe\x70\x47\xfb\x62\x29\x41\x70\xc2\xeb\x62\x91\xb2\x0f\xf1\xab\x86\x6b\x7c\x79\x92\x9e\xf0\xaa\x04\xd5\x0f\x67\x1b\xdf\x03\xa9\x60\x35\xc2\x6c\x70\x1d\xa0\xac\x88\x51\x95\x7a\x7e\xb1\x2e\x02\x94\x38\x6b\xe4\x9b\x2b\xa2\x47\x17\x3e\xbe\xfd\xf6\x40\xad\xd8\x1f\xf2\x6b\x27\x96\x2f\x95\x52\x03\x0d\x17\x65\xe7\x6f\x43\xdb\x17\xe6\x61\x8c\x6f\x1c\x03\xfa\x38\xeb\x59\xdd\xac\x27\xfb\xea\x43\x52\xe4\xfb\x41\x54\x5b\xd1\x31\x42\x69\x27\x53\x06\xc7\x7c\x80\xf6\x2f\x6d\x28\x20\x40\x29\x06\x6d\x4a\xb5\x8a\x5c\xbb\x62\x19\x1d\xf2\x27\x8c\x8b\x3e\x35\x60\x60\x3c\xb4\xb0\x20\x9f\xa7\xab\xcd\x06\x81\xc6\x6a\x0c\xb6\xb4\x2b\x8d\x04\xed\xfc\x5d\x28\xae\x2a\x19\xbd\x87\xde\xe1\x0d\x06\x65\x3f\xe7\x3a\x8d\xcd\x36\x60\x46\xd7\xe4\x58\x02\xe0\xf3\x25\x8d\x75\xe9\xbb\xe8\x2f\x5d\x21\x85\x40\xfa\x5a\xab\x74\x9a\x8a\x32\x85\x8c\xf9\xc1\xc7\x3d\x22\xa5\xd8\x24\x3c\x47\xfa\x8c\x06\x18\x70\x57\x17\x48\xe6\x0e\x8b\x3b\x39\x62\x2b\xa6\xa1\xb6\x66\xc6\xc9\x3d\x68\x7d\x7f\xe4\x53\xb4\x8d\x90\xc6\x79\x7d\x37\x7f\x18\x76\x77\xd0\x13\x1d\xc8\x96\xfd\xfa\xdf\x1d\xc2\x42\xae\x51\x71\x00\x9f\xf0\xec\xb3\xf9\xa3\x88\x74\x90\x42\x68\xc7\x42\xf0\xdc\xfa\xf7\x6d\xa1\xd3\xd7\x75\x5e\x54\x56\x2a\xf0\x3c\xd6\xf4\x43\xe7\x91\x66\x01\x82\x24\x31\xfe\x95\xa1\x20\x54\x5b\xeb\xe3\x3c\xde\xb6\x57\x7d\x2a\xf7\xf4\x47\x07\xbf\xd0\x76\x8c\xd5\xdd\xa2\xd2\x8a\xa5\x21\x24\xcf\x55\x9a\xb9\x30\x50\xf5\x4d\x0a\x2b\x46\x8c\xf8\x4d\xf0\x7b\xca\x95\xa0\x48\xc2\xa3\x02\xd0\x1a\x22\x2d\xb4\x80\x8f\x79\x23\x22\xd8\xd4\x31\xa7\xba\x3a\x03\x2f\xf4\x53\x2c\x24\xa0\x86\x39\x68\x73\xa3\x03\x27\x0d\xfb\xf0\x0b\x00\xc8\x82\x3b\x88\x3c\xfd\x45\xa6\xf2\x42\x06\x27\x67\xf2\x29\x9a\x3f\x49\xbb\x04\x85\x03\x16\xdb\x2f\x56\x68\x87\x03\xd0\x18\xc7\xe5\x7d\xa0\xa8\x4e\xfc\xdd\x54\x25\x7f\x67\xd3\x1b\xd3\xf4\x35\x2f\x6e\xcf\x1d\x64\x59\x13\xc5\x7d\x74\x1c\xcf\x7a\x4c\x18\xd4\xa1\xea\x17\x33\x03\x3e\x4c\xbc\x3f\x95\x45\x23\xe8\xe7\xc4\x9f\xb7\x30\xe8\xad\xab\x51\xea\xde\x16\xfb\x10\xc3\xf6\x06\xcc\x8e\x29\xbe\xf7\x53\xfd\xeb\x75\x11\x8a\xcc\xe9\x04\x8a\xd1\x09\xf5\xfd\xb8\xa4\x29\x05\x95\x65\xaa\x94\x96\x24\xaf\xaa\xe1\xc2\x0d\xe0\x40\xcb\xa4\x86\x9c\x8c\x42\xa2\x0d\xee\xcc\x83\x69\x02\x24\x19\xd2\xa3\x0c\x82\xaa\xf2\xf6\x6a\x17\x8a\x2a\x66\xb1\xfc\x19\x60\xe6\x8e\x10\xee\x11\x08\xc7\x3e\xd0\x55\x65\xa2\x5c\x1f\x80\xb2\x2f\x2a\xd4\xae\x32\x9f\x3e\xae\x33\xd2\xe1\xed\x2d\xbe\x79\x16\x0c\x6f\x45\x31\xff\x8c\xe3\x6d\xb4\x29\x7b\x91\x4a\xb9\x2f\xa6\xad\x50\xaf\x7d\x04\xd2\x0c\x57\xe7\x6b\x1c\x59\x39\x99\x33\x40\x97\xf7\x4a\x21\x49\x51\x90\x16\x94\x9f\x66\x6f\x1a\xc8\x1b\x78\x50\x2b\x7e\xf5\xe9\x4d\x2e\x85\xa7\x56\x51\xb1\xc4\x8c\xa5\x14\xb1\x59\x51\x2b\xbf\x16\x74\xa8\xc7\xfd\xcc\x43\x26\xc8\x66\x58\x22\x1b\x7a\xb9\xc7\x59\x35\x6a\xf4\xa7\xd6\x59\x23\x3a\xa6\x52\x6f\xad\x78\xea\xf0\x09\x0c\x5a\x3b\x7b\x7e\x03\x9a\xf3\xba\x49\xb0\xfa\xc8\xe6\x49\x7e\x85\x9f\xe3\x46\xc6\xf7\x3e\x8b\x98\x5f\x94\xd9\x4d\x7c\xa4\xdf\xe2\x0b\x0f\x62\xc1\x07\x19\xa1\x62\xb1\x48\xfc\x0f\x53\x00\x89\x54\xe7\x73\x27\xca\x05\x6d\xd2\x9d\x6a\x46\xd1\xda\xc9\x69\xc0\x69\xbe\xda\xab\x2f\xc0\xb7\x90\xc2\x84\xca\x20\x8b\x77\x81\x8b\xb0\x69\xcd\x10\xc1\xca\xeb\x67\x33\x0c\xc8\x2e\x09\xb8\x9f\x81\x0f\x5b\x95\xdc\x09\xf9\x33\x0e\xce\x06\x35\x4c\xb9\x78\xf1\xe4\xca\xba\x78\x49\x7c\xac\xd4\x88\x49\xf8\xac\xa1\x62\x32\xfb\xf3\x8c\x9b\x71\x40\x3f\x0c\xb1\x5b\x84\x35\x81\xef\xa0\x40\x4a\x55\xde\x44\x88\xac\x2b\x45\xcc\xb9\x6d\x23\x8d\xb3\x6c\x30\x44\x5f\x8c\xf1\xb8\x28\x96\xd4\x94\x87\xd8\xb2\x34\xb1\x0c\x7d\xc4\x2c\xe8\x88\x03\xad\xd5\x2a\xec\x40\xc4\xa3\x68\x80\x05\xcd\x05\x59\x1a\x90\x46\xb2\xb1\x0d\x27\x88\x09\xbe\x13\xa8\x06\xd4\xbf\x57\x82\xd3\xc3\x89\xe0\xe6\x03\xd5\x90\x60\x0b\xe3\x02\xd2\x0f\xf6\x0d\xc2\x92\x56\x67\x0c\x6d\x4b\x18\x0f\xeb\x1c\x09\x18\xa9\xc5\xf1\x6b\x83\xab\x65\x7c\x50\xbd\x46\x23\xda\x36\xa7\x84\x41\xb5\x18\xf5\x78\x6d\xa2\xe8\x38\xb9\x18\xf0\x8d\x75\xc0\xa9\xae\xec\x34\x83\x1b\x04\xfc\x09\x16\x35\x8f\x24\xf6\x01\x60\x08\x17\x0f\x08\x31\xf4\xf8\x2d\xb9\xc5\xa2\x7d\x41\xe9\x33\xde\x4d\xbf\xd1\xe8\xbb\x0d\xd5\x7b\x6b\xf1\xe2\x73\xd0\xf8\xa6\x65\x91\x16\x7e\x39\x01\x2e\x19\x16\xd3\xc0\x0b\xa1\x43\x60\xd6\xc2\xa1\xa2\xca\x13\x39\xd1\x41\x78\x22\x98\x4e\x04\x15\xff\xd9\x4b\xc9\x3f\xa6\x2e\xab\x36\x7a\xf1\xae\x6f\x65\x4a\x2e\xe2\x71\xf3\xb4\x07\xc1\x9c\xd9\xc0\x56\x66\x5f\xe0\x68\x16\x57\xed\x20\x9b\x64\x7f\x84\x0b\xb4\x7d\x4b\x4b\xd4\x49\x91\xef\x2f\xa4\x2a\x91\xd5\x4a\x2a\xdc\xd3\xfa\x29\x52\x76\xee\xa2\x92\x30\x8a\xba\xd1\xde\xef\xfc\x84\x76\xbf\x7b\x3e\x93\x34\xf1\xc2\xc6\xd9\x94\x0a\xf5\xc8\x66\x2b\xaa\xc4\x39\x38\x78\x69\xf8\x6b\x4f\xe8\xaa\x87\x51\xcd\xe4\xbe\x1c\x87\xea\xf9\x0e\x72\xc4\x0b\xc2\xc4\xdf\x88\x1a\xad\xcb\xc6\x93\xaa\x28\x7d\x9f\x22\xcd\xa5\x9c\x01\x23\x6e\x11\x1c\xe5\xb2\xf3\x50\x51\x02\x60\xa6\x40\xc0\x4f\x44\xb1\x52\x3c\x48\x62\xb7\x4f\x28\xc6\x94\x86\xc7\xd0\x3c\xcb\x15\xfc\x5c\x9d\x98\x93\xa5\xee\xdd\x87\xcc\x8b\x23\x6c\x6c\xd0\xb3\x1d\x61\x3e\x08\x86\xf4\x8c\x3f\x95\xe8\x3d\x88\x26\xa4\x46\xdc\xee\x36\x19\xed\x9a\xc6\xad\x2c\xdb\x06\x29\x0a\xac\xe8\x7e\x4c\xfd\x3c\x07\xeb\x61\x97\x78\x16\x10\x44\x99\x50\x96\x5f\x90\x6e\x3c\x3b\x71\xe4\x6b\xc4\x51\x04\xbb\x76\x7e\x70\xee\xd8\x34\x7a\xc5\x1c\x11\xcc\x25\x90\xb3\x07\x41\xdc\x40\x35\x30\xb7\xe3\xca\x1b\x9d\x4f\xae\x39\x4d\x5e\xdc\x9d\xea\x5c\x6f\xb3\xf3\x58\x72\x4a\x95\xc6\xbc\x29\x81\x58\xa2\xb5\xbd\x9d\xc4\x25\x1f\x71\xc4\xdc\xbb\x15\x7d\x44\x75\x64\x10\x3f\xd6\xbc\x79\x1d\x19\xf1\x3e\x90\x29\x1d\xed\x51\x35\xee\x43\xa9\x2f\x02\x26\xb5\x35\x01\xf0\x73\xcc\x8c\xc7\xc1\x86\xbd\x59\xb8\xf4\x8e\xb8\x6b\xf2\x6b\xcf\x9f\xad\xef\x32\x88\xff\x0a\xd5\x9a\x6a\x56\x63\x11\x4f\xb9\xcd\x91\xfb\x10\x34\x98\x4c\x5c\xd5\xdd\x42\x5f\x49\x7b\x18\x78\xee\x63\xc5\xee\x2b\x80\x96\x33\x06\x38\xde\xab\xa4\x4c\x47\xa4\x24\x28\xf7\x28\x11\xb2\xac\xa9\x6b\x2d\xc8\x08\x22\xd7\xa1\xd2\xda\x02\xd5\x69\x48\xa8\xfc\xb2\x23\x09\xf9\xc2\x4c\x84\x39\x44\xfd\x37\x10\x86\xc3\x89\x41\x38\x7f\xbd\x78\x61\x08\x8e\x28\x87\xe4\x41\x67\x0b\xfd\xf4\xcb\x0d\x0e\x7d\x06\xdd\xf8\x73\xf3\xeb\xc0\x8c\x9f\x91\xd8\xc5\xb9\xc8\xa6\x5e\x00\x62\x9b\xe3\x8b\xca\xdf\x8d\x92\xb0\xec\x71\xa8\x14\xcb\x77\x08\xb3\x4b\xc4\x8c\xb5\x67\xec\x34\x7d\xd5\x47\x19\x39\x06\xdb\x56\xf2\xaf\xe1\xb2\xf5\x66\xee\x48\x0d\x88\xc8\x59\xb3\xf8\x94\x8b\x75\x6f\x2e\x4b\xdb\x0d\xa5\x0b\x63\x6e\x3c\x44\x8e\x57\x55\x12\xa8\x7b\xab\x19\x8a\x41\xf6\xee\x33\xe5\xef\x3a\x19\xff\xe4\x69\x3d\xa9\x13\x62\x2a\x1e\x2f\x05\x81\x4c\x29\x76\xa5\x3a\x9b\xa2\xc7\xbc\x46\x06\x24\x26\x4a\xcb\xe4\xf3\x77\xac\x4b\x18\xb6\xd2\x87\x96\xb7\x8a\x07\x6d\xaa\xe6\x01\xb5\x30\xf5\xea\x70\x96\x02\x77\x58\x9c\x3c\xea\x44\x22\xd7\xcf\xc1\x6a\xdb\x53\x38\xbd\x90\xba\x91\x35\xe0\x2c\x8f\xb5\xf4\x15\x5e\x77\x6f\xaa\xf8\x6c\x60\x64\x88\x4c\x37\x31\xdb\x41\x3b\x1f\x98\xd5\xda\xc1\x77\x12\x34\xd0\x78\x09\x76\x06\x78\x7b\x11\x43\x3a\xc4\xf9\x9d\xe2\xad\x45\x4d\x67\xbc\xad\xcd\xf8\xc9\xa7\x61\x46\x4e\x58\xd5\x24\xab\x0b\x49\x56\x76\xdf\x6b\xf3\xc1\xed\x80\x40\x3c\x8e\x29\x5f\x32\x96\xd3\x11\xa5\x64\x25\xc2\x33\x1b\xc3\xc1\xf2\x23\xc5\xe4\x2f\xa5\xf7\x73\x42\x9f\xcc\x64\x50\x00\x71\xe3\xb4\x24\x58\x0e\x9d\x71\x97\xfa\x1d\xcf\xfd\x50\xa7\x33\x4b\x29\xc3\x00\x2d\xc8\xca\xe1\x70\xf5\x8e\x78\x0d\x59\x77\x84\x9d\xeb\x0f\xec\xec\xb2\x8c\x3b\x3a\x5d\xd3\x40\x2c\xf6\xd6\x22\x15\x2e\x39\x6f\x87\x8b\x97\xd0\x05\xee\x26\xa6\x55\xde\x56\xca\x3e\xd7\xba\x66\x9f\xc6\xcc\x7b\x98\x29\xfd\xaa\xc3\x7e\x8c\xa1\x47\x7d\xf5\xbd\x98\x39\xfb\x7c\x4b\x36\xc6\x57\x3e\x99\x1c\x57\x15\x1c\xf1\x31\xbc\x38\x8e\xf6\xf7\xaa\xbf\x92\x49\x34\xb6\xf1\xdb\x82\x62\xf9\xf1\xa1\xa0\x49\x48\x08\x8a\x6e\x06\x07\x81\x52\xeb\x4c\x05\x47\x8a\x0a\x9f\x66\xcd\xca\xd2\x27\xbb\x2c\x23\x7b\xe7\x34\x6a\x39\x49\xc3\x99\x93\xba\x06\x2b\x63\x4e\xbc\x6c\x03\xa8\x1a\xbe\x0a\x6f\xfb\x6f\x4f\xac\x0e\xb9\x8f\x86\xd6\xd9\x6a\xa9\x85\x44\x45\xea\xa6\x41\x23\x38\x46\xb5\x35\xc8\xc6\x21\x85\x83\x19\xa3\x13\xd2\xc4\xed\x2e\x15\x5b\x96\x66\x8e\x11\x0c\x02\x0b\x08\x7b\xde\xe7\xda\x29\x10\x94\x95\x13\xed\xad\x80\x6d\xfd\x2e\x24\x0c\x08\xbb\x58\x8c\x46\x31\x17\x30\x73\x6e\x9c\xfd\xf2\xab\x01\x55\x7b\x12\x89\xec\x70\x48\xdf\x38\xb4\xc0\x89\xe9\xb6\x68\x08\x65\xdb\xa5\x04\xb7\x68\x29\x02\x8c\x66\x2e\xf3\x99\x1c\xb8\x26\x13\x4e\xdd\xf8\x16\xd3\x83\x4d\xa6\xa7\x5c\xf3\x8d\xe3\xf2\x5f\x6c\x29\x39\x08\x53\x4a\xee\x2a\xf4\xc1\x4c\x26\x57\xdf\xe2\xcf\xd2\x67\xf5\xb3\xc5\xdd\x46\xed\x7b\xa2\xa4\x9d\xb2\xa7\x97\x46\x6a\x93\x47\x8f\x68\x52\xe8\x09\xa8\xd0\x0d\xa8\xa5\xf1\x19\x20\xdc\x60\x2a\xf6\x5c\x01\x36\xaa\xb0\xe3\x66\xfc\x5f\x69\xa9\x94\x6d\x9c\xf6\x86\x19\x6c\x8a\xc5\x5d\xc6\xbf\xd4\x44\x4e\x83\x0b\xa7\x36\x8b\x78\x2b\x37\xe0\xc0\x1b\xcd\xa9\x37\x70\x19\xaa\x7f\x29\x84\xd7\xc8\x6e\x07\x6a\x82\x11\x5b\xff\xa3\xec\x0a\xda\xde\x96\x9e\x00\x97\xcf\xa1\xf7\xb6\xc8\x04\xde\x54\x35\xe3\x18\x2d\x9a\x26\xb5\x8c\x20\xc9\x40\x8a\xc1\xe0\x31\xec\x01\x9f\x7a\xf3\x80\xab\x2b\x10\x4a\x59\x21\x1d\xe0\xe5\x7d\x08\x17\x4b\xe7\x94\x16\x4f\x81\x3b\xba\x7c\x70\xca\x9e\x34\x67\xd8\x95\x2c\x9a\x72\x0d\x2d\xd8\x3b\xab\x28\xc9\xa7\xb0\xb7\x39\x4a\xf4\x2e\xe8\x4a\x7d\x02\xf5\xed\x68\x69\xf9\x53\x9a\xfd\x91\x35\x52\xde\xe4\x11\x0d\xbf\x18\xd9\xb8\x38\x5c\x93\x27\x73\x16\xf0\x69\x42\x23\x59\x5e\x88\xce\x21\xba\x23\x92\x50\x87\x7c\x3c\x66\xf9\x31\x95\xf0\x13\x4e\x3e\x89\xda\x99\x4d\x5c\x53\x2f\x0f\xb1\x7a\xb1\x19\xcc\xcb\xb2\x62\xa6\xa8\x94\x3f\x1a\x7b\x72\xa3\x2c\x0e\x1c\x34\xaf\x0e\xd0\x11\x4b\x7b\xc3\xce\xee\x58\x77\x0f\xdc\xb8\x5c\xa8\x14\xd2\x09\xa8\x19\x1e\xb1\xea\xcd\xe4\x20\x64\xb7\x49\x2f\x9f\xaf\x13\xb8\x14\x27\x6d\x4f\xb6\x75\xc3\x87\x5a\x8b\xbc\x54\x18\x18\x1c\x67\xf3\x22\xf2\x94\xaf\x8e\xcf\xfc\x70\xe5\x8d\x90\x34\x2b\x3d\x79\x6a\x8b\xda\x79\xd5\x52\x21\x0c\x11\x56\x7c\x76\x16\x6a\x91\x50\xfd\xb4\x1f\x77\xac\x6b\xfe\x28\x97\x8a\x19\x29\x4d\xc1\xa1\x68\xb5\x12\x6b\xf7\xd3\x7d\x95\x39\x8a\x5f\x45\x75\x6e\xdd\x0b\x18\xb8\x20\x8c\x3e\xae\xa0\xef\x84\xbb\x4e\x84\x2d\x6d\xcf\xf7\x33\xb4\xf1\x48\xbc\x0e\x2c\x85\xfc\xb0\x0e\x85\x17\xe2\xf7\x51\x04\x02\xef\x5f\x3c\x95\x6b\x23\x0c\xd0\xb7\x81\x0f\x71\x32\x4f\x25\xdc\xdc\x53\xad\xf6\xe6\x59\x85\xb0\x80\xaa\x53\x9b\x3b\x11\xb6\x36\x47\x98\x67\x4f\xed\x5c\x47\x00\xe1\xc2\xe7\x0f\x4b\x5b\xa6\x99\x08\xf8\x6c\x88\x43\x76\x3c\xe4\x58\xea\x49\xf5\x25\xe4\xf0\xf2\x15\x3a\xd0\xe3\x87\x1c\xee\x74\x65\x1c\x31\xe1\x0f\xa1\xc1\x8b\x3c\xa8\x6c\x77\xb3\x21\x21\x17\x49\x25\xe8\x12\x51\xa9\x59\x61\x33\xcb\xa8\xd1\x60\xf7\x5e\x55\x7a\xd9\xe9\x8d\xbe\xe9\x43\x74\x2a\x6a\xac\xd5\xaa\x2d\xde\x71\x76\x0b\x9c\xa4\xf1\xea\x35\x78\x17\x86\x95\x1c\x35\x39\x71\x3e\xbf\x34\xbb\x16\xd8\x85\x4c\x1e\x00\x8e\x35\x8e\x34\xaf\x62\x8b\xbe\x3a\x97\x9f\x01\x76\x87\x29\x57\x03\x8b\x61\x33\x9b\x06\x97\x63\x30\xcf\xf6\x84\x7e\x09\x76\xef\xae\x74\xe1\x20\x47\x4f\x34\x24\xf8\x74\xc7\xc6\xe9\x43\xc3\x88\x3f\x6c\x45\x33\x15\x4f\xf2\xe1\x36\xc5\xa4\x36\x2a\xd8\xe2\x06\xc4\xe2\xbb\xba\xa3\x9a\xe5\x95\xa2\x71\x31\xe5\x55\x26\x40\x63\x64\xc7\x67\xae\xad\xc0\x4e\x1a\x40\x18\xca\x05\x3c\xa8\x3e\x84\xae\x9a\xa4\x1e\x08\x7c\xc4\x47\x26\xcd\x89\x0e\x38\xe1\xa5\x14\x0b\x5e\xe2\x79\x42\xb6\xeb\xec\x4b\xa7\xc5\x4f\x47\x99\xa2\xac\x86\xf1\x9b\xdc\xf1\x27\x2b\x87\x76\x16\xbb\x05\xc3\x6e\x79\x8f\xda\x74\x5f\xa7\xf6\x92\x89\x39\xa0\x96\x2f\x0c\x1a\x52\xbe\xd2\xd5\x67\x27\xe0\xf1\xc5\xd3\xd9\xf0\xc6\xbd\x1c\x76\x0e\x8e\x02\x41\xa9\x34\xc6\x99\xd1\x7c\x27\x7d\x0f\x59\xbc\x8f\x6f\x73\xdb\x2f\xa2\xe1\xf2\x21\x8b\x12\x8c\x84\x1f\x8a\xf0\xfc\x4c\x4a\xe2\x5d\x8d\x65\xfa\xd6\x31\xeb\x35\x87\x98\x80\x4c\x1e\x9e\xff\xe9\x98\xf0\x26\xaa\xb3\x8c\x67\xa2\x9d\x99\x58\x45\x61\x39\xa4\x86\x61\x48\x09\xb7\x3b\xcf\x0c\x35\xcb\x59\x83\xf6\x1e\x24\xc6\x3c\x09\xa6\x34\x32\xa3\xc8\x05\xad\x5c\xd7\x1f\xd4\xce\x34\xb5\xfb\x80\x98\x7e\x6e\xca\x5a\x37\xb4\x14\x0c\x0e\x3f\xc4\xa4\x9a\x3a\xdf\x65\x89\xc9\x69\x5f\x99\xe5\xcf\x92\x82\xe0\x34\x22\x20\x0e\x4e\x41\xe4\xc0\xf5\xfe\x79\xf8\x65\xd4\x68\xaa\xf6\xa7\xa5\x47\xfb\xf6\x22\x4a\xb8\x2c\xee\x55\x8a\x17\x62\xc4\xbc\x31\xbc\xa5\xb7\x86\x9e\xc2\x75\x6a\x9a\xbf\x5b\x8e\xa8\x4d\xef\xbd\x5b\xf3\xc3\x74\x01\xe7\x27\x98\xb9\x07\x15\x84\xcf\xe3\xb7\x07\x36\x3f\x66\xf6\x50\xbf\xdf\xb0\xc1\xc7\xcf\x4d\xbe\xcb\xc2\x77\xb5\xc2\xad\x6b\x97\x93\x8a\xc7\x93\x92\xa4\x1b\xbc\x5a\x13\x73\x39\xb7\x15\xa9\xe2\xc2\x4d\x65\x50\x47\xf6\x10\xc5\x2b\x8b\x3f\xf8\x77\x5c\x12\xe2\xba\x8f\x22\x7e\x70\xd3\x77\xe8\xe9\x1d\x2d\xad\x2d\xc5\x70\x28\x72\xa2\xbd\x6c\x05\xb7\x4a\x11\x85\x1d\x97\x47\x19\x3c\xaa\x4f\xda\x48\x3f\x2a\x85\x24\xf3\xf5\x5c\x7e\x2b\xf2\xde\x11\xaa\xc0\x6c\x02\xae\x62\xea\x8f\xcd\x5d\x5c\x91\x0c\x5f\x72\x45\xaf\x73\xe7\x5a\x73\x25\x1e\x9a\xa1\x5a\xe0\x3d\xe7\x0d\xf3\xb8\xd5\x60\x52\xdd\x9b\x7c\x1f\x1c\x7a\xa3\x99\xc5\x8d\x14\x8e\x24\x2b\x9d\xc9\xf7\x80\xb0\xe4\x14\xb8\x2b\x6c\x3f\x55\xe2\xc0\x93\xf2\x57\x52\xd7\x0b\xeb\x2b\x08\x6d\xd2\x70\x78\x1d\xa6\xdd\xd5\x0b\x83\x27\xcc\xfe\xd0\xf8\xe7\xa7\xab\x4f\x49\xe3\x11\x11\x47\x5e\xb5\xd2\x36\xc5\x83\x36\xf4\xb4\x28\x99\xc4\x36\x83\xdb\x85\x8c\xd0\x1d\x47\x2b\xf8\x11\x4e\x0e\x22\x1e\x3b\x03\x03\x99\x4d\xb7\x48\xda\xf4\x27\xcb\xf4\x01\xde\xc7\xb1\xfd\x54\x00\x1d\x7f\x34\x48\x9f\xfc\x41\x99\xac\xf4\xe9\x67\x4c\x3a\x37\x20\x82\x5c\x51\xe8\x51\x45\x5d\x14\x88\x55\x78\x51\x54\x4d\x79\x34\x70\x07\xc8\x13\x7a\x3a\x38\x20\xaf\x51\x8a\x9a\x20\xe2\xc1\xc9\x76\xf4\x0b\x06\x1d\x0b\xe2\xd8\xd7\xc4\x25\x39\x4b\x5d\x4f\xc5\xce\xdc\x83\x22\x61\x11\x33\x85\x22\xe4\x35\x15\x0b\x3f\x9e\x44\xa9\xc5\xcb\x43\xf8\x33\x52\x4a\xe6\x94\x6c\x91\x9d\xc9\x74\xf7\x13\x57\x4b\x23\x1e\xde\x01\xb2\xef\x91\xde\x49\x72\x18\x4a\xbb\xe9\x7d\xea\xe0\x60\x9c\xb4\x28\xcb\x73\xf7\x83\x60\x13\x1c\xf5\xf1\x14\x1a\x30\xc0\x2a\xa8\xab\x11\x54\x52\x00\x0b\x3b\x46\xf6\xdb\x2e\xcc\x1b\x85\xe5\x7d\x37\xf8\x2a\x8b\xe9\x5f\x3e\xa5\xcf\xda\x82\x19\x31\x5c\xc0\x37\xf7\x2b\x98\xc2\xc7\x40\x0f\x49\x52\x05\xbb\xbe\xbf\x7e\x8b\xaa\xef\x52\x00\xfa\xdc\x3d\xc5\x2e\x3c\x40\xd5\x74\x29\xee\x97\x1d\x12\xfc\xdb\x53\x95\x4d\xb7\x8e\x44\xd7\x06\x90\x60\xb2\x65\xe0\xe9\x0d\xe7\xf0\x6d\x8e\x39\xa8\x0a\x30\x0c\x16\x1c\x54\xa8\xef\xf0\x55\x8a\x06\x62\xab\xc5\x57\xcf\xe0\x49\xb5\xa8\x87\xa2\x9a\x8c\x78\x45\x9d\x2e\x7e\x08\x92\x6c\x0c\x40\x33\xef\xe6\xa4\xe9\x41\xd5\x87\x99\x70\xb3\x15\xe7\xb2\x94\x13\xf6\xd3\xaf\xfa\x0c\x07\x43\x45\xf0\x24\x1a\x13\x73\xb5\xb3\xd5\x32\x01\xdd\x93\x46\xcf\x32\x47\xf1\xa1\xe7\xb7\x3a\x42\x26\xdc\x1f\xdf\x2e\x0e\x15\x7c\xee\xad\xd5\x28\xaa\xf8\xc4\x2b\xcd\xaf\x5f\x9d\xb6\x80\xae\x43\xeb\x26\x7e\x05\xa4\xe6\x07\x6a\xb4\xf1\x17\x42\xf0\x7f\x95\xae\x2e\x3a\xac\x48\x0d\xe2\x2f\x7c\xef\xd6\xeb\x1c\x63\xef\x86\x9f\x1f\x57\xb8\x83\xcd\x3f\xd0\x6f\x64\x31\x8f\x96\x00\x72\x9e\x95\x8b\xbd\x7e\xd1\xe6\x5d\xee\x37\xc4\xa0\xac\xdd\xc6\x31\x57\x00\x84\x57\x9f\x9d\xf3\xd5\xe3\x82\xb9\x40\xd3\x28\x30\xb2\xa9\x35\x28\x29\x3f\xab\x42\x73\x6f\x12\x08\x0f\xa0\x49\x51\x8a\x61\xd9\x75\xc3\xc7\x4f\x4c\x5e\xcb\x59\xc9\xbb\x1e\x6c\xde\x75\x16\x2b\xe2\x62\x74\x15\x84\x52\x99\xc5\x3a\x32\xdd\x91\x3b\x8d\xf0\x4b\x8f\x00\x2c\x0e\x91\x88\xd8\x73\x85\xee\x41\x75\xe2\x26\x52\x99\x63\x51\xe2\x95\xff\xa2\xa1\x2c\xf9\xe7\x6e\xc3\x04\x45\x64\x30\x0b\x9f\xa7\xc0\xd1\x54\x84\xc0\xac\x2a\x9c\x81\x4d\xa3\x83\x0b\xad\xf7\xf5\xa6\xfb\x6e\xec\x7e\x4b\xac\x16\x23\xe6\x74\x19\x8f\x9f\xaf\xff\x6c\x33\xe0\xca\x91\x2d\x3a\xa3\xa0\xef\xc9\xfc\x4d\x28\xd7\xa8\x64\x75\x60\xd1\x07\xbc\x73\x5d\xa2\x9a\x7f\x98\xa4\x0a\xcc\xa8\x18\xa0\x3f\x0b\xbd\x04\x64\xae\xe5\xb6\x66\x34\xef\x8b\x23\x6c\xb9\x17\xed\x64\x94\x33\xe1\xd9\xba\xe6\x19\xc1\xeb\xbf\x11\x91\x83\xcb\xa6\x9b\xe8\x16\x43\x0f\x56\xb5\xf3\xde\x4d\x36\x26\x98\x8b\x20\xe3\x94\x7c\x21\xe0\xd3\xd1\xb5\x0c\x85\x5b\x56\xa6\x97\x8c\x17\xad\x5b\x7d\xc2\xbc\x0b\xe0\xe2\xcc\x2a\x3e\xb2\x4b\x97\x36\x8d\xa4\x49\x6e\x42\xc4\xc2\x49\x44\x13\xc8\x01\x5d\xa8\xa2\xf0\xa0\x03\xa1\x42\x3f\xb4\xa7\xd0\x5a\xcb\xf8\xce\x34\x2f\x6f\xa1\x63\x32\xf3\x38\x50\x49\xeb\x77\x80\x9c\x23\xa7\xe4\x7b\x88\xb4\xfc\x6a\x9a\x8e\xab\x6f\x98\xf3\x13\x25\xe1\x83\xd4\xe8\x7c\x61\x4f\x2a\x56\x30\x49\x4a\xc7\x87\x37\x44\xb5\x16\x71\x7f\xc6\x22\x67\x1c\xd6\x24\x26\xc4\x3b\xb2\xdd\x2a\xbe\x1d\xf4\x10\xb4\xbb\x1a\xf3\xc8\x4b\x2d\x4e\xef\xad\xf6\x2f\x70\x65\xbd\xb9\x8c\xae\x6c\xb3\xb8\xfd\x3c\x17\xef\x44\x79\x2d\x31\x04\x06\xca\x4e\xa8\xcc\x67\xe6\x3b\x2b\xe7\x24\xd7\xcf\x8c\x3d\x31\xc7\x56\xde\xf3\x40\x7e\x44\x07\xba\xae\xf8\x5c\x77\x5f\xb6\xa2\x05\xad\xf1\xfb\x08\x7e\x12\x0d\x02\xd4\xa6\x39\x4c\x3b\xad\x63\x3e\x5d\xc9\x3a\x79\x1f\x8b\xd7\x8e\x07\x6b\xc1\xe8\xf9\x9d\x94\xbd\x64\x1a\x39\xfc\xc2\xe2\x04\x2d\xbc\xe9\x81\x67\x54\x43\xb8\x49\x32\xc8\x1e\x4c\x64\xc0\x3d\xe4\x51\x77\xc9\x0a\xa9\xf7\x4a\x92\x7d\x4b\xdc\xa3\x44\x39\xab\x23\x4c\xe7\x79\x3a\xb5\xa5\x38\x9f\x03\xf8\xd7\x2d\x90\x9e\xa7\x1a\x85\x62\x28\x1f\xc4\x85\xda\x61\xa5\xcf\x3d\x59\x56\xfd\x54\x78\x47\x00\x0e\x74\x55\x21\xf9\x16\xb3\x98\x7a\xc6\xd0\xb7\xda\xca\x52\x6d\x7a\x93\xb1\x89\x0c\x96\x87\x08\xc6\x7e\xb6\x17\x20\x21\x38\x6d\xac\x5d\x4c\x6e\x37\x0b\xed\x42\x34\xe7\x43\xdd\x56\x57\x34\xf9\x15\x3e\x12\x9d\x3e\x5a\xb1\x62\xb4\x89\x6b\x57\xb6\x90\xf0\xdb\xf4\xe9\xe2\x6a\xa8\x6b\x63\x2e\x51\xd3\x43\xee\x94\x98\x73\x75\xc2\x48\xa4\xb3\xb9\x49\xae\xd9\xbc\xbd\x1e\x2d\xe0\x4d\x9b\x9f\xb2\x6c\x9b\xfe\x41\xb5\x0b\x39\x45\x75\x81\xf5\x0a\xa7\xfd\x1f\x78\x01\xdb\x9a\x8e\x8b\x0b\x4e\x44\x3b\x96\x3e\xf5\xf4\x14\xd6\xeb\xa9\x4d\x11\xd6\x64\x57\x64\xf8\x45\x05\x7c\x38\x45\x31\xa6\x31\xe7\x20\xb3\x4b\xef\xd0\x90\x7d\xc0\xed\x31\x65\xb2\x4d\xab\xc0\x97\x0d\x3d\xfd\x24\x8d\x33\xdb\x4d\x60\x77\x18\xb6\xca\x41\x96\x69\x38\x5a\x55\x44\x77\x80\xe9\x54\x3d\x4f\xa8\x03\xd7\xa0\x97\xf9\xc4\xcc\x61\x75\x2d\x7d\xd1\x43\x7b\xaf\x20\xc1\x33\x78\xde\x7a\x82\x06\xeb\xca\x33\x88\xa6\x49\xbe\xb0\x52\x17\x96\xa4\xc9\x23\xcd\x59\x8a\x37\xc1\x7c\x26\x3f\x76\x75\xeb\x04\x65\xed\x0c\x52\xe3\xdd\xfa\x6e\x7c\xdb\x91\x72\x86\x65\x8f\x97\x23\xde\xec\x56\x00\x8d\xf1\x62\xb9\x2f\x3a\xdb\x61\xbe\xd0\xdd\x06\x31\xb2\x4d\x44\x1f\x9c\xfd\xb5\x7f\x62\xb2\x2c\x8a\xf4\x5a\xa5\x49\x4b\x64\x50\x1f\xb2\x73\xca\x0c\x29\xdf\x9f\x68\x37\xbe\x91\xf3\x8a\x9b\x74\xc3\xe1\xe1\x00\x1f\x86\xc6\x96\x12\x63\xbc\xd2\xaf\x05\xd7\xd7\x08\x6f\x6e\x42\xac\x88\x42\xc4\x3f\xf8\x28\x3c\xf1\x13\x34\xe5\xc4\x3d\x7a\x75\xc4\x78\x3f\xfc\xa5\xd9\x9b\x31\xb9\xf6\xc8\x0d\x68\xc7\xc0\xdc\xa8\xfc\xc5\xb1\x29\x01\x5e\xc3\xbb\x57\x3f\x17\x15\x01\x38\x59\xe8\x22\x2c\xf9\xc3\x47\xb3\x5d\x67\x84\x58\xaf\x0d\xb9\x54\x22\x41\xd6\x8e\xdd\x5a\x33\x1a\xfc\x4c\x5b\x41\xbf\xca\x4a\x4a\xaf\x58\xcd\xbe\x84\xae\xea\x13\xf9\x66\x76\xf8\x55\x66\x6f\x65\x62\x7a\x0c\x4e\xf2\x78\x16\x1d\xe8\xb4\xdd\x80\x98\x79\x01\xcd\x56\x39\xbb\x59\xf0\x88\xf9\xa3\xaa\xb3\x65\xaf\x3c\x48\x61\xee\x13\xde\x38\x77\x3c\x3e\x3b\x08\x25\xfc\x7e\x8d\x87\xab\x00\xbb\xab\xf3\x7a\xa5\x70\x95\xc1\x56\x3f\x99\x37\x02\xce\xa3\xda\xbe\x5a\x71\x60\xce\x16\x41\x63\xf8\x9a\xfd\x62\x95\x14\x66\x0f\x3b\x44\x5d\x0c\x04\xb6\xe4\x32\xa7\xe3\x15\x1d\x69\xba\x2c\xfe\x5b\x3d\x42\xd5\xaa\x91\x58\x31\xb1\x48\x8e\x85\x69\xc3\x45\x62\xca\x54\x32\xcd\x39\x23\x97\x22\x1d\xd3\xa2\xeb\x3b\x27\xef\x44\x9b\xd3\x8a\x5d\xe2\xb1\x41\xab\x84\xe8\xa6\x60\xe5\x5a\x9f\x71\x91\xa7\x3a\x83\x87\x10\x98\x6d\x28\xd7\xaf\x83\x52\x91\x84\xe5\xb3\x58\x7d\xf6\xee\x55\x13\xf7\x6e\x7f\xf7\xb9\x45\xdc\x74\xb3\x86\x5a\x18\x9d\x2d\xfc\x32\x80\x71\x2b\x08\x81\x53\x74\x4e\x02\x88\x09\xce\xb3\xb3\x82\x6d\xea\x3c\x0c\xce\x15\x72\x07\x4a\x8c\x52\xf4\xf5\xf3\x17\x1a\xec\x7e\x53\xfb\x33\xf5\xb3\xb1\x22\x01\xad\x45\x2f\xbb\xce\xc1\x8a\xe0\x50\x3b\x81\xe6\x0a\x9a\x96\xc5\xe0\xad\xfa\x45\x1b\x55\xc9\x3f\xdd\xcc\xce\x0d\x01\x20\xd9\x59\x5d\x41\x85\xd4\xb0\x33\x92\x7c\x09\x2d\x0a\xb0\xdf\x73\xef\xf4\x74\xd0\x75\xf7\xa7\x85\x6c\xc9\x7c\xac\x78\x20\x63\x38\x3c\x3f\xb6\x51\xc7\xea\x40\x24\x75\x1f\xcc\x62\xe8\x61\x32\xa7\x72\x60\xc3\x13\x3d\xd3\xc4\x4f\xb3\xe5\x71\x42\xbe\xae\x87\xeb\x45\x82\x6b\xed\x46\x1f\x2d\xbd\x6c\x08\x30\x81\x08\x1d\xd4\x69\xd1\xc8\x61\x96\x80\x63\x33\x24\xa6\xeb\xa2\xe3\x75\x8a\xcd\xcc\x7d\x82\xd4\xf1\x13\x20\x17\x1a\xcd\x1c\x28\xd2\x41\x48\xbc\x1c\x94\x9b\x54\x6c\x5a\x20\x74\x2c\xd9\xb7\x95\x41\x1b\x8c\x01\x4c\x1e\xed\xd7\x4a\xd5\xb2\xc2\xd4\x6a\x41\xcf\x65\xfc\xd1\xee\x0c\xce\xbf\x6f\x0a\xde\x0f\x50\x71\x2c\x24\x18\x29\x0c\x1b\xdb\xaa\x71\xfe\xb2\x72\x76\xb7\xd1\x9f\x0e\xcc\xb4\x63\xd3\x15\x0e\xe2\x2c\xdf\xc9\x2a\xc1\xd3\xa8\x31\xd4\x6e\x57\x4a\x58\xb5\xbf\x1e\x0b\xde\xc1\x43\x1c\x97\x1e\x25\x7e\xf0\x73\xf9\x47\x55\x0e\x13\x5d\xd2\xef\x47\xe0\x84\x40\x1d\x64\xe6\x5a\x6f\x34\x40\x9b\x93\x20\x2f\x82\x7b\x3f\xca\x63\x6c\x10\x80\xb5\x49\x7c\xb2\xbc\x75\x5f\x15\x6b\x41\xad\x1a\x53\xa3\x40\x69\x19\xa9\x7c\xef\x06\x2e\x96\xb5\x72\x7a\xef\x7b\x77\x25\x1c\x48\x49\xe1\xb8\xfd\x4d\xcd\x16\x80\x05\xf4\xdb\xcf\x2f\x24\x7f\x38\x70\xd4\x53\x96\x89\x5b\x7a\xae\x7a\x36\x64\x64\xfd\x06\x37\x0d\x6c\x5f\x9e\xdb\xd8\x9b\x4a\x4d\x0f\x98\x58\x86\x87\x2f\xe5\x83\xbc\x4b\xa9\x98\x73\x0d\x87\x98\xaf\x67\x54\x20\xcd\x16\xf6\xac\x3c\x80\x15\x67\x96\x7d\x63\x0f\x10\x46\x1c\x2d\xe8\x4b\x35\xfa\xe4\xbf\xb8\x3c\x02\x30\xda\x06\x4a\xe6\xe8\xc6\xac\xe1\xd2\xe0\x17\x37\xf3\xdf\x8d\xb5\x7f\xb4\x2f\xf0\xc0\x71\x8f\x1f\xb9\x06\x5f\x60\x24\xf4\x2a\xe5\x45\xba\x18\xc5\x02\xaf\x8c\x8f\xe0\x5f\x5d\xf5\x54\x35\xe2\x19\x87\x37\x89\xab\x1e\x87\x4a\x48\x5b\x74\xc5\xa7\xe9\x21\x00\x9c\xbd\xb2\xd9\xae\x64\xb3\x73\x8f\x77\x39\x76\x96\x58\xb3\xa8\xe9\x93\x41\x94\x96\x24\xd4\x88\x67\x4c\x9d\xec\x6e\x57\x98\x5e\xcf\xab\x73\xc2\x58\x3e\x0f\x15\x69\xe5\x3a\x6c\x49\xaa\x88\xfa\x32\x7f\xbd\x07\x43\x79\x64\x93\xef\x94\x5d\x72\xb9\xbd\xa0\x73\x7e\x05\x0b\x52\xba\x35\x14\xe5\xba\x6f\x39\xd4\x59\xb2\x41\xde\x6e\xf5\x2e\x3e\x7c\xd3\x14\x30\x6e\x22\x1e\x04\xe0\x40\x8e\x3b\xf7\xd9\xe6\x67\x90\xec\x68\x44\x55\x4d\x02\xec\x0f\x8e\x0d\x7a\x3e\x3b\x74\x7f\xba\xc0\x87\xac\x65\x29\xe1\x7b\xe7\x6f\xc1\x20\xae\x40\x44\x6f\x49\xe9\xe7\xb5\x1d\x64\xe3\xf5\xbc\xbc\x51\xad\xd6\xf3\x6b\x87\xe5\xde\xf2\xd7\x07\x88\xb1\x06\x2c\x30\xb7\x70\xc8\x16\x28\x3e\x19\xec\x6d\xe0\xb9\x84\x85\x6f\xb1\x84\xd4\xc3\x76\x07\x50\x47\xa8\x65\x75\xd6\xc2\x73\x72\x4f\x59\xf4\x81\xab\xec\x8d\x6b\x97\xc1\x51\xd4\xe7\x7a\x36\x47\x74\xd6\x4f\xd1\xf4\x6a\x80\xd5\xab\x8b\xe0\xec\xe8\x90\x75\x5f\x21\xf4\xe3\x2e\x5f\x1a\x8f\x39\xc8\xdf\x01\x3a\x83\x78\x3e\x55\x8a\x10\x89\xe5\xca\x13\xdd\x35\xd7\xf8\x25\x69\x7b\x03\x14\x3d\xb6\x61\x3b\x25\x4f\x0e\xb7\xbf\x18\x20\x9d\x00\xb0\x73\x19\x33\x89\xf8\x25\xbc\x3d\x8f\xa7\xb1\x80\xfb\x73\xa3\x6c\x97\x70\xe9\x04\xfc\xd7\x23\x29\x28\xb3\xcf\x03\x79\x36\x8a\xb4\x6c\x2a\x05\x32\x3b\x91\xa7\x1a\xf9\xfa\x1f\x3c\x31\xc0\x8e\xa1\x70\x69\x42\xa8\x5c\xba\x41\x85\x23\xf8\x01\xa2\x37\x89\x7c\x60\x55\x17\x44\xe4\x01\x1b\x23\xa5\xfd\xa5\xb9\x19\x14\x34\x72\x51\x25\x0d\x7c\x1a\x8c\xa6\xf7\x7d\xa9\xd1\x5b\x5d\x96\x15\x46\x4c\xb3\xe9\xb9\xea\x74\xdb\x36\xcc\x6b\x5a\x68\x1a\x29\x91\xcf\xe8\x6a\x96\x41\x4a\xd2\xed\x5c\x88\x88\xd9\xa0\xfc\x3a\x85\xeb\x53\xe4\x96\xd9\x76\x71\x74\x00\x16\x2c\x9d\x3f\xa7\x48\xbc\x28\x2d\x6a\x33\x98\x84\x5d\x93\x88\xf4\xcd\x08\xce\xb9\x55\x85\x24\xa6\xcd\xa4\x9a\xa5\x7c\x28\xac\x54\x87\x8f\x21\xf0\x4a\xe4\xae\x68\xd1\x93\x63\xc7\x73\xd2\xed\xb9\xa3\x42\xe8\x89\x2e\xa9\x37\xf6\xca\xf9\x26\x34\xe0\x5a\xfc\xf9\x51\x95\xb6\x9e\xfc\x5a\x6f\xa5\x5a\x7c\xe4\x37\x5c\x29\x9f\x30\x6b\xa2\xce\x7e\xde\x5a\xa4\x67\xa6\xab\xd6\xac\x99\x53\x6a\xc2\x48\x19\x71\x84\xbf\x31\x92\x3f\x40\x13\x64\xb0\xe2\x75\xe6\x57\x5c\x4f\xd8\x2f\x3d\xeb\x01\x12\x2e\x3d\x6d\xe8\x05\x5b\x28\x50\xb1\xe8\xf9\xb9\x1a\x13\x1d\x4c\x40\x56\x07\xe0\xd8\xc7\xc5\x8f\x74\x16\xe9\x9f\x60\xca\x7e\xe7\x05\xe5\xa5\xbf\x36\xaf\x6b\x2b\xd8\xe9\x8c\xd4\xe4\xaa\xfd\x5b\xec\x9a\x55\xbd\x22\xe3\xe2\xf3\x98\x53\x83\x66\xc4\xb8\x7c\x5f\x81\xe1\x76\x4c\xb2\x26\x44\x3c\xfa\x5a\x1f\xb6\x52\x1f\xcc\xc4\x5e\x2f\x63\xcd\x06\x04\x69\x19\xec\xae\x53\x3b\x1a\x09\x6d\x94\xbb\x55\x1b\x1e\xb8\x36\xc3\x18\xb7\xe0\xf0\x16\x7b\x81\xaf\xff\x92\xa2\x1b\x56\xf5\x96\x28\xd8\x49\x7d\x8e\x31\xaa\xb1\xf7\xa3\x43\xa8\xa7\x07\x8b\x6b\xa9\x2c\x08\x62\x6a\x34\x22\x9e\xc2\xf4\x5d\x94\xf3\x33\xe4\x01\x64\xe9\xde\x82\x76\x10\x72\xb8\xca\x3d\xce\x94\xd1\x24\xcc\x9b\xc7\xa7\x36\xf5\xfe\x35\x90\x54\x55\xaa\x30\x33\x09\x39\x26\xf6\x37\x31\x18\x2a\x96\x66\x84\xdd\x19\xc3\x84\x4c\x22\xa9\x09\xed\x27\x5e\x6d\xe9\xc3\x1f\xd6\xc6\xe8\xef\xb7\x4f\xeb\xd0\xe5\xa2\x92\x4d\xe7\xe4\x4e\x2a\x94\xa0\x4d\x14\xcd\x13\x82\x7f\x8e\xaf\xa9\xe4\x5c\x3a\x89\x1a\x1a\x10\x92\xc6\x35\x1b\x7c\xfe\x36\x17\xa7\x30\xd3\xc5\x85\xda\xac\xc7\xe4\xdc\x52\xb8\x6f\xde\x0f\x15\x92\xd7\x2e\x95\x17\x57\xaa\xed\x2f\x94\xa6\x37\x5e\xa0\x97\xec\x2a\xc2\xf0\xd8\xad\x3d\x79\x31\x57\xf2\xde\x41\x9d\x1d\x11\x0b\xb5\x0a\xb0\x90\xf8\xd9\x40\x8e\xdb\xd8\x74\x46\x69\xd1\x51\xcb\x66\xf1\xfa\x4f\x9a\x09\x91\x8f\x6e\xf9\x23\xa2\xea\x05\x32\xef\xf8\xdd\x5a\x06\x1e\xef\xd1\xff\x84\x15\x96\x8d\xad\xa2\xeb\x2c\x1c\x0e\xc6\xb8\x32\x86\xba\x0b\x89\x8e\xea\xda\xa4\x21\x14\xfb\x1d\x0d\x5c\x45\xcc\xc6\xc1\x3c\x31\x4d\xb3\xf4\x74\x38\xc1\x08\x84\xb9\x9a\x1c\xe9\x00\xba\xbb\x59\x33\xb8\xaf\xec\xe1\xfa\x4b\xe6\x7c\x0f\x3c\x59\xb1\x73\x20\x88\x9a\x82\x8e\xce\xd4\x82\xec\x3f\x06\xf1\x9b\x03\x7d\x1e\x73\x52\x1e\x61\xd6\x7f\x09\x9b\x2f\x7a\xf2\xb7\x9f\xbb\xf2\x54\xd0\x4c\xdb\x49\x98\x27\x52\x39\x44\x3a\xbc\xd6\xbb\x5a\xe1\x32\x8a\x45\x16\xee\x6a\xd3\x5d\x7d\x5d\xf2\x72\xa8\x68\x70\x26\x2a\xdd\x68\xbf\x8d\xa2\xc3\x26\x23\x5c\x70\x8c\x49\xf2\x55\x13\xc5\x1e\xff\x0b\x7f\xb7\x77\x65\x19\x9f\x02\x36\xb4\xe1\x60\x85\xbf\x43\x95\x05\xe1\xe4\xe7\x59\x2c\xdb\x0e\xc9\x10\x04\xf3\x42\xc0\x81\x90\x4b\x40\x52\x5b\x34\xa5\x0e\x3d\x3e\xc6\xb4\xbf\x77\xfb\xe5\x60\xf1\x4e\x86\x87\x43\xe9\x94\x7e\x15\x9c\xaa\x42\x01\x29\x6b\x41\xe5\x3a\xb6\x27\x71\xcc\x01\xd2\x59\xc4\x9f\x40\x03\xb4\x33\x65\xa3\x4e\x25\x9a\x70\x2d\x87\xaf\xa0\x2e\xb7\x3e\x12\x47\x90\xe5\x91\x52\x57\xac\x71\xf8\x92\x3e\x6e\x32\xf6\x0c\x9e\x25\xf4\x44\x60\xd7\x08\x31\xe8\x06\x28\x6d\x71\xe7\x2a\xb6\xc5\xa8\x5f\xf6\x29\x90\x61\xd9\x8b\x74\x3e\xda\x61\x44\x3d\xe9\x99\x7c\x64\x49\x86\xd7\x30\x8e\x60\xc7\x1a\xe1\x33\x0a\x4a\xac\x85\x3c\xf6\xef\x68\xae\x61\x99\xba\xcc\xa3\x97\x6f\x4f\x25\x76\x22\x61\x8e\x7e\x63\x5f\xe2\xdb\x8a\xdc\xdb\x5a\xac\x60\x68\x7a\x8c\x9f\x63\xad\xa3\x92\x69\x71\x79\xdc\xc0\x73\xf8\xf8\xab\x6f\x6e\x1f\x85\xad\xc2\xd3\x93\x04\xca\xbe\x04\xdc\xc5\xb2\xc5\xa8\x89\x9b\x7a\x88\xb6\x65\xbb\x94\xe5\x82\xaa\x00\x56\xf2\x09\x65\x32\xf3\x19\xfb\x20\x61\x75\x52\x15\xf9\x68\xe1\x8a\x90\x78\x74\x2f\x3b\x85\xf1\x40\x2f\xb2\xd5\xf6\xa2\xb1\x9a\xfc\x8d\x18\xb2\x48\xb5\x43\xff\x93\x49\xd8\xc7\x89\x39\xa1\x2f\x47\xf6\x36\x72\xac\x6f\x21\x5b\xa7\x24\xe1\x24\x69\x82\x32\xb8\xe4\x27\x25\x38\x94\xd7\xc2\xe7\x80\xab\xcc\x7a\xee\xa7\x07\xbc\x8f\x6d\x4e\xdb\xb9\xfe\xc5\x1e\x38\x60\x9d\xed\x13\x2f\x7c\xe4\x71\x4b\x53\x94\x6e\x4f\xbc\x26\xc4\x91\x8f\x0d\x9f\x8a\x7f\x48\xb5\x01\x47\xb6\x0f\x07\x0b\x79\xda\xdb\x5b\x85\x4f\x4b\xfa\x9d\xd1\xcf\xf5\xeb\x4c\x5d\x2c\x09\xef\x17\x9d\xad\xd9\xc8\xab\x13\x24\x88\xf0\x9e\xd8\x10\x9d\x9a\x5a\x48\xd9\x54\x45\x28\x4b\xfe\x90\x02\x76\x96\xc4\x47\x2f\xf5\xdd\xa8\xea\xa2\x71\xbe\xfc\x6a\x9f\x9e\xac\x66\xa7\xa6\x0b\x73\x33\xd2\x4e\xd8\x2b\xaa\x21\xe4\x9b\x9f\x04\xa9\x9b\x79\xf3\xb9\xb4\xca\xeb\x8f\x1e\xe7\x19\xa0\x4b\xa7\xbc\xad\xbe\x87\xb0\x84\xbb\x02\x6b\x4a\xfb\x12\x99\x85\x72\x22\xf7\xc7\xf9\x68\xe0\x8a\x44\x49\x59\xe8\x45\xbf\x0c\x33\x07\x05\x99\xb4\x73\xd2\xb3\x7c\x6c\xa4\xd4\xfe\x75\xb7\xbc\x4f\x73\xfb\x52\x5f\x80\x8d\xe5\xf2\xc1\x89\x6c\xa9\xfa\xbb\x43\x68\x74\x7c\xb6\xce\xae\x95\xb0\x2c\xda\xce\x55\xf9\x68\xb9\x0d\xfb\x43\x0e\x61\x70\xd9\x6e\x38\x9f\x88\x53\xb2\xec\xd7\xf9\x58\x05\xe5\xf6\x85\x84\x72\x8a\x32\x66\x90\x7a\xb3\xb4\x73\xa1\x43\xc8\x5c\x26\xb3\x38\xfd\x2c\xdc\x9e\x47\x7b\x85\xdb\x5f\xb1\x98\xf0\xb9\xe3\x0d\xbd\x04\x29\xe1\x50\x4d\xab\xb7\x18\x8c\xa6\xa4\xa7\x0a\x76\xdc\x16\x2d\x7e\x04\x21\x85\x63\x41\x79\xea\x9a\xdd\xac\x01\x6a\xb1\xe8\xef\xf2\x9a\x52\x73\x59\xcf\xc4\xab\x5a\xce\x2b\x8c\x5f\x2c\x90\x2a\x3e\x16\xd7\x68\xb7\x8c\x51\xfc\x2c\xc3\x4b\x79\x77\x6d\x6f\x30\x0d\xc8\xa6\x6f\x05\x4b\x9c\xcd\x4c\x9a\x4b\x77\x7b\xb6\x29\xed\x83\x81\xa8\x51\xd4\xf0\xed\x74\xdb\xcf\x14\x4a\x2d\xf2\x25\x16\xab\x72\x2e\x07\x0d\x56\xa0\xcd\x3c\xa4\x70\x43\x5a\x42\x98\x02\xfe\x11\x7e\x07\x0f\x28\x13\x4a\xca\x87\x53\xbc\x1e\x04\xfe\xb0\xe3\x84\xf2\x6c\x58\x27\x0d\x9d\xb2\x96\x1e\x91\x1c\x68\x36\x9b\xc7\x8b\x6c\x15\xa7\x10\x48\xcf\x89\xfc\xe8\x12\xc0\xf5\xcb\x86\x49\xf8\x57\x2a\x3a\x5f\xf9\xa6\x33\x96\x3f\x24\xbf\x45\x9a\x04\xe4\x90\x9a\x4a\xf0\x40\xb5\xfa\xb3\xe1\x07\xd4\xe9\xc5\x92\xb7\x03\xea\x63\x90\xf6\xcc\x01\xa8\x4c\x4c\x41\x36\x2e\x3e\xdc\x13\xfc\x3d\x02\x41\xf5\x03\xaa\x93\x43\xd6\xa1\xfc\x06\x19\x88\xce\x5e\x25\x4d\x91\x1d\x45\x8f\x64\x87\xce\xe6\x4f\x4a\x75\x80\x33\x67\x7d\x20\xfd\x12\x36\x5b\x14\x63\x80\x26\xa4\x6a\xff\xf6\x7d\xb9\x1b\x33\x02\x1e\xef\x19\xff\xbe\x16\x86\xf9\xc6\xde\x26\x1c\xc5\x9d\x5d\x7f\x4d\x64\xbb\x36\x89\xf9\xda\x91\x27\xa1\x12\x54\xd8\xa2\x7e\xae\x1e\x22\xa8\x0e\xe5\x54\xdd\x23\x59\x9c\x2d\xb9\x0c\xb0\xa7\x63\xe4\xd2\xd5\x79\xa1\x75\xbf\xad\x73\x33\xe7\x40\xf5\xf5\x5e\xe4\x30\xc5\x2a\x4e\x3d\x26\xc6\x6a\x33\x1f\x48\xd3\x0f\xba\x8f\x0c\x29\xa7\xd1\x87\x02\x94\x8a\x91\x1e\x01\xb0\xbb\xcc\xb2\x29\x06\x93\x8b\xe1\x31\x96\xf2\x0b\x8d\xeb\xea\x56\xf9\x2b\x59\x05\xe4\x07\x2e\x23\x75\xa9\xc5\xef\xf3\xb6\xc3\xdf\xf6\x35\x05\xb6\x76\x50\x92\x31\x94\x80\x18\x20\x9e\x88\xa7\x73\x61\xa6\x2e\x0b\xe0\x71\xf3\x45\xe5\x36\x94\x80\xf4\xa6\x93\xdc\x17\x43\x3c\x54\xc2\xd3\xd7\xf3\xdd\x22\x33\x1f\x80\x3d\x93\x3b\x89\x83\xc7\x63\x8c\xb5\x33\x5d\x4f\x16\x0f\x6e\x38\x60\x20\x1c\x5e\x24\x6c\x3a\xc9\x1e\x6d\xbc\xaa\xab\xcb\x7b\x81\xba\x34\x96\xb9\xf3\x49\xbf\xe6\x19\x09\xc8\xcb\xb6\x3c\xa3\x16\xf5\x0a\x4c\x9e\x5e\x21\xf4\xd2\x43\x21\xba\xaf\x95\x06\x02\x28\xa3\x9b\xb3\x46\x40\x23\x2a\xf2\x68\x5e\x64\x69\xf6\xc4\x1f\xbc\x61\xf8\x0f\x69\x5e\x42\x5b\x55\x23\x1e\x1c\xf9\xe8\xd2\x00\x3f\x17\x32\x6a\x56\xd4\x66\xb3\x42\xfc\xc0\x26\x02\x5d\x2d\x04\x3f\xeb\x57\xf3\x11\x4d\x62\x21\x0a\xf2\x7c\x83\xf7\x15\xd0\xca\x58\xb8\x0d\x39\xbd\xa1\x64\x7c\x6b\x68\xcd\xee\x94\xb1\x82\xa5\x50\xd0\x36\x9c\xfa\xc0\x1b\x50\x1a\x0c\x4a\x35\x25\xfb\x1b\x95\xbb\xa0\x04\x13\xda\x21\x7c\xe5\xfc\x6c\xc9\x33\xed\x6c\x71\x8b\xf2\x32\xd2\x20\x48\xfe\x96\xe4\x2c\x17\x1c\x84\xa9\x0b\x65\x18\xb6\xf2\x31\xc6\x91\x44\x68\x20\x17\xa7\x61\xec\x4a\x55\x40\xd2\xb4\xcb\x17\x07\x3a\x7a\xe4\x51\x62\x9a\x14\xba\xac\xe5\x4a\x13\x78\xa2\x89\x3a\x39\x68\xe7\x28\xe8\x25\x75\x5a\xd6\xca\x21\x0c\x39\x77\x32\x97\xba\x93\x51\xe7\x10\xe1\x41\x3b\xc9\x43\xb9\x70\x48\x78\xef\xb0\xed\x5c\xdc\xf8\x60\x13\x12\x5a\x58\xcf\xd7\x10\xb0\x54\x2e\xa4\x7c\xe5\x03\x59\x1f\x10\x2d\x57\x1e\x85\xcc\xa3\x80\x46\x7a\x35\xcc\x39\x0e\xba\x18\xd8\x25\x41\xef\x7e\xde\x29\x51\xe0\x8c\x9e\x12\xcb\x2f\xcb\x92\x4e\xc4\x47\x22\x8a\xc7\xb7\x2e\xb4\x50\x50\x37\x0a\xce\x14\x33\x5a\x6a\xb3\x69\xc7\x91\x07\xbe\xd0\x44\xf2\x9a\x10\x55\xd6\xa6\xbc\x22\xcb\x0e\x1d\x9d\x9e\xbe\x3e\x40\x44\x8e\xb6\x9c\x4f\x62\x44\x21\xc9\x46\x68\x39\x31\xa0\x92\xde\xef\x20\xea\x05\x93\x52\xcf\x1e\xa7\x9a\x83\xa5\x25\x83\xdc\xd3\x12\x46\xa1\xc9\x4e\xc7\xd0\xe0\xb3\x19\x62\xc6\xa3\xb8\xe8\xc7\x6c\xd2\x64\x02\xf0\xe5\x76\x9f\x1d\xc0\x0c\xfe\xdb\x8a\x32\x5b\xbc\x12\x06\xc1\x8c\x53\x0f\x2a\x41\x6c\xe9\xe5\x60\x44\x66\x72\x88\x43\x31\x78\x81\xb7\x92\x51\x37\x1f\xe3\xb7\x89\xe6\xaf\x8c\x78\xdd\xfd\xbc\x62\x6a\x29\x07\x8c\x9c\xe2\x0d\x98\xe3\xa0\xf8\x58\xd4\xba\x2e\x5c\xa3\xd1\x09\x5a\x69\x70\xc5\x49\x3b\x12\xcb\x12\xde\x0f\x09\xed\xe5\x25\xe9\x7c\x8a\xa3\x94\x5b\x98\x9a\x69\xb8\x62\x31\xe1\x77\x08\x1c\x43\xd3\xee\x31\x4b\x28\xc5\xc9\xfd\xe5\xb8\xf8\xf4\xdd\x51\x54\xb0\xfa\xdc\xa3\x75\xc5\xda\x3b\xe7\x45\xd1\xa5\xa8\xc8\x63\xc8\x6b\x49\x58\xfb\xd9\x38\xf4\xd1\x4b\xf9\x5a\x46\x4b\x76\xc7\xc1\x47\xdb\x06\x9a\xf1\xcf\xea\xa0\xec\x5a\x78\xe4\x0e\xfd\xe3\x61\x69\x93\xb0\xf4\xf6\x8a\x51\xba\xba\x3e\x4f\x03\x1b\xb0\x15\xbe\x8f\xf8\xbf\x13\xc1\x32\x0c\x1b\x0a\x9b\x0f\xc4\x37\x45\xd1\x0e\x53\x31\xc0\x5f\xb3\x13\xa2\xa4\xa2\xf9\xeb\x47\x04\xd7\x9a\xc1\xe0\x97\x01\xd8\xed\x69\x0c\x85\xfd\xdf\xdf\x50\xfe\x79\x23\x7f\xfe\x93\xfe\x24\xb6\xb6\xaf\xea\xb2\x19\x83\x7f\x81\x0c\xfc\x5d\xf4\x17\xe9\x73\x52\x73\xba\x52\x9b\x82\xc3\x68\xb9\xc9\x6e\xf5\xdf\xf9\x29\x0a\xbe\x68\xf7\x03\xd7\x17\x3f\x12\xfa\x44\x41\x50\x10\xc1\x75\x9c\xf9\x93\x12\xe1\x31\xd6\x7e\x84\xa1\x68\x3e\xd2\x68\x69\xd9\xe8\xda\xdd\xf5\x49\x44\x58\x89\xf5\xc1\x23\x02\xc1\x11\xfb\x14\x17\xdc\x10\xc1\x72\x38\x5e\xa0\x39\xd4\x0a\x34\x6d\x38\x26\xa6\x39\xc8\x75\xce\x83\xe3\xb8\x26\xd4\x66\x8f\x30\xf0\x0f\xfb\x84\xc5\x4a\x73\xbe\xfb\xa8\x82\xa0\x4a\x14\xbc\x3e\xa3\xf6\xfc\xd9\x00\xad\x60\x11\x57\xd7\x59\x8d\x19\xf0\xfc\x56\x6a\x04\xac\x21\xdd\xd4\x87\xb9\xec\xa7\xb0\xd0\xf2\xb2\x3e\x1a\x98\xd3\xc8\xe8\x1d\xc2\xd6\xcf\x57\xe9\x4f\xe9\x0e\x60\x3c\xf7\xf4\x44\x84\x28\xaa\x62\xf4\x35\xc3\xa2\xad\x50\x17\x36\x5e\xc1\x58\x3c\x0e\x41\x77\x03\x44\xb4\x23\x46\x77\xf7\x6b\x73\x08\x46\xe1\xc0\x7c\xb7\x57\x92\x03\xa3\xf8\x73\x8a\x96\x7c\xe4\x51\xe7\xac\xdd\x48\xaf\xd9\xb0\x42\xa4\x41\x21\x2e\x2c\x42\x1f\xe6\x28\x0a\x9c\xdb\xb9\xe1\xa5\x3e\x27\x40\x67\xe9\xce\x9e\x1d\xf4\xfb\x5b\xe5\x1e\x18\x4a\x99\x2e\x89\x9a\xa8\x80\x6f\x7c\xf4\x21\xea\x77\x2a\x83\x1a\x40\x01\x84\x70\x87\xcd\x2a\xb9\xe5\x61\xa3\x39\x82\xc0\xdd\xd5\xda\xad\xdf\x50\xf6\x58\xb4\x8b\xe6\x46\x87\xd4\xfb\x2d\x9b\xe6\x59\x7d\x11\xf2\x1e\x4b\x56\xde\xde\xb5\xcc\x20\x60\xdd\xa2\x4a\x7b\x75\x63\x8c\x42\xcf\x57\x80\x93\x2e\x23\xcf\xda\x4b\xdf\x35\x7f\x89\x64\xb4\x22\x38\xf5\x94\x99\x52\xf9\x6a\x7e\x8f\xe9\x0f\xd7\xef\x67\x5f\xdf\x06\x22\x8e\x97\xf4\xef\x96\xe4\xcb\x56\x89\x7d\xd5\x79\x9d\xa1\x8d\x6d\x68\xd0\x3f\x4e\x9e\x94\xaa\x90\xae\xd2\x39\xf0\x75\xe0\xa7\x68\x5f\x2e\x14\x5d\xa4\x07\xf6\x63\xd1\x76\x78\xc4\x2b\x86\xe2\xc3\xd5\xb8\x9e\x10\x71\x72\x33\x70\xf8\x81\xbd\xb4\x67\x36\xc2\x87\xaa\x73\x45\xe8\x33\x83\x40\xf7\xdb\xd0\xb9\xaf\x65\x52\x5c\x87\xd1\xf9\xe9\x18\x9d\xef\x18\x54\x59\xe5\xa2\xbc\xe1\x7a\x29\x25\x24\xa1\xf1\xde\x9e\x51\xe9\x23\xcf\xd2\xb9\x36\x6c\x54\x34\xaf\x68\x15\x3d\xc2\xef\xa4\x36\xd9\xf5\xa6\xbf\xea\x35\x76\x72\x82\x53\xe4\x44\xce\x2b\x3c\x89\xbb\x38\xad\x52\x03\x22\x1d\x34\xf2\x23\x7b\x76\x75\x4d\xc1\xb8\xf3\xcf\x28\x36\xe9\xed\x6a\x7e\x76\xa4\xd2\x19\x36\x9d\x24\xb2\xcb\x18\xd6\x00\x28\xf3\xfb\x31\xd8\xde\x00\x18\x45\xc9\xb2\xf0\x63\x9c\x27\x41\x2e\xfa\xc8\x86\xe7\x17\x01\x2c\xf0\xca\x3d\xc8\x90\xd1\x5b\x3c\x69\x71\xac\x79\x94\x25\xd4\xe1\x4f\x1f\xe9\x2b\xd1\x69\x21\xb6\x51\xad\x36\xf2\x5d\x75\x3e\x36\x64\x6a\xdf\x29\x89\xe9\xc3\x5e\x04\x07\xf6\xe9\x3c\xc9\x47\xc2\x04\xba\x6e\xba\x70\x29\xfe\x6b\xf8\x4b\xf9\x11\x3e\xc8\x1b\xe1\x48\x77\xc8\xd0\xfa\x45\x6e\x66\x80\x6d\xd1\x98\x6f\xb1\x69\xc0\x93\xbd\x9d\x9f\x94\xb9\xbb\x6e\x0a\x92\xfa\xfa\x88\x3a\x1d\x5c\x10\xe0\xc1\xa4\x8e\x85\x94\x4a\x75\x7a\x6e\x27\xde\x24\x82\x04\x4d\x17\x76\xf7\x59\x78\x46\x9c\xd4\x0a\xd4\x54\xb3\x2f\x09\x5d\x59\xa5\xb9\x88\xf7\x00\x2b\xd8\xc4\x30\x8c\xcd\xc1\xc3\x01\x9c\xc6\x72\x58\x34\x2a\x03\x26\x51\x66\x16\x59\xe2\x66\x20\x12\x7d\x6b\xb7\x1c\x0b\xb6\x2d\xd3\xaa\xf2\x4c\x28\x96\xe5\x60\xca\xaa\xc9\xca\xeb\xb7\x3d\x8b\x59\xfd\x8f\x53\x2c\x41\x69\x95\x53\x53\x04\x7d\x94\x7b\xab\x6e\x92\xde\xb1\x15\x57\x70\x5d\xd0\xa9\x95\x43\xe5\x5f\x4e\x70\x69\x54\xbd\x41\x19\x73\x58\x29\x06\x90\x24\x43\x4e\x82\x3b\x4d\xe1\x63\x50\x40\xe8\x00\x66\x39\x8b\x0a\x9c\xed\x93\x3e\x15\xf7\x27\x38\xaa\xaa\xf0\xc7\x20\x13\x1d\xd4\xd9\xf9\x4e\xe3\x6f\xc6\x9a\x52\x42\x18\x19\xf5\x2c\x14\xf4\xa3\x88\x15\xcf\xf8\x64\x1f\xb4\xf0\xc0\xd3\x4f\x87\x3b\x7b\x6b\x21\x04\xf2\x8b\x0e\xc9\xcc\x12\x69\x16\xe4\xee\xe8\x6d\x22\xe5\x81\x7c\x1c\x01\x17\x66\x82\x9b\x81\x24\x98\x22\xdb\xda\x64\xdb\x8e\x02\xa3\x19\x04\x5b\x86\xc2\x10\x12\xbe\xd8\x09\x57\xa0\x1b\x80\xab\x20\xdc\xeb\x8c\x80\x0b\xa5\x77\x10\x8d\xc9\x75\x8c\xa5\x30\x2e\x11\xb6\x4d\xe4\xab\xbe\x5b\x84\x18\xe8\x2f\x74\x22\xfc\x4e\x40\xc6\x4b\x48\xe1\x47\x32\xcc\xb7\x2b\x84\x4c\x41\x0f\x99\x2f\xf8\xe6\x53\xe7\x56\x42\x25\xe5\xd1\xb8\x2f\x1b\xa1\x0f\xf0\x4b\xf9\x18\x17\x26\x56\xe4\x9a\xa0\xf0\x76\x6d\xef\x45\x9e\x17\x26\xc7\xa4\xa6\x83\xa7\x0f\xd6\x20\xa0\x7b\x2a\xbf\xb1\x2c\x3e\xf7\x5e\xd0\xc6\x76\x3b\x8c\xb5\xb7\x01\x2e\x69\xf4\xf0\xf8\xb2\xc1\xeb\xe3\x99\x62\x4c\x83\xe9\x87\x56\xb5\x7a\x4f\x38\xcb\xe9\xc2\x5d\xa1\xb1\x00\x3d\x5e\xce\x62\x39\x17\xd5\xa2\x0c\x90\xa6\x32\x2a\x5a\xc7\x5b\x2d\x05\x3c\xc3\x64\x2f\xc3\xfa\x4a\xc2\x4e\x57\x2d\x89\x1e\xcb\x44\x24\xa3\xa0\x4d\x2b\xec\xb7\x9a\x53\x72\x30\x32\xe5\xf8\xc4\x7e\xa2\xc6\x69\x88\x46\x2c\x8a\x48\x16\x22\x9d\xb7\x0e\xd6\x73\x7a\xff\x8e\x5a\xa1\xbb\x51\x57\x5f\x9b\xc1\x3f\x16\x8d\x0d\x93\x6c\xc3\x9e\x4b\x10\x39\x5d\x45\x82\xe0\x87\x9d\xdb\x2e\x2e\xb4\x5b\xb5\x41\xc7\xa0\xa2\xf2\x8a\x1a\x22\xe0\xe9\xc0\x5b\x77\x04\x2f\x66\x94\x8d\x30\xb4\x3d\x60\x75\xed\x5e\x87\x5b\x2b\x6e\xcd\x2f\x45\xfb\x61\x33\x56\x39\x25\x45\xdc\x47\xad\x55\x5a\xd5\x51\x5e\x8d\x8b\x45\x63\x62\xfd\xe9\xc9\x23\x74\xf5\xea\xa0\x08\xa2\x85\x50\x04\x48\x9f\x90\x40\x5c\xc3\x2b\xe8\xe5\x74\x48\x88\xde\x00\x06\xed\x77\x86\x26\x10\x70\xe7\xcb\x16\xaf\x9f\x92\xba\x9c\x47\x7d\xc9\x86\x11\xf4\x8b\xfa\x7d\x65\x77\x8d\x8d\x06\x29\x37\xdb\x9e\x14\x39\x52\xcf\xb5\x95\xd4\xd2\x50\xb4\xd7\xce\x5e\x54\x30\xdd\x46\x98\x43\xe1\x40\x43\xd6\x66\x5a\x2f\xf3\x22\x7d\x41\x41\x3d\x77\x0b\xd5\x2d\xed\x68\xd8\x22\xa0\xe5\x48\xf2\xb2\x69\x56\xe2\xfb\xd1\x51\x0e\x2e\x6e\x81\x3a\x19\xe8\xca\x60\x30\x80\x6d\x78\xb5\xe4\xd5\x04\x15\x9f\x01\xea\x8f\x30\x71\x90\xe2\x78\x96\x37\xde\x3f\xf9\xc8\xb0\x36\xc3\xce\x0c\x33\x33\x8e\xf3\x5f\x68\x2a\x8c\xc6\x30\x38\xa3\xec\x0c\xc3\x70\x3e\x33\xee\x0c\x73\x33\x6c\x69\xae\x66\xbf\x1f\xd6\xdd\x33\x41\x73\x51\x91\xa9\xf1\x92\xc6\xcb\xd2\x6e\x6d\x9a\xc4\x5a\xf8\x5a\xb2\x47\x52\x78\x77\x50\xb8\x4a\xa3\x41\xb5\xe8\x6e\x6c\xd2\x0e\x52\x5c\xcd\x48\x36\x7c\x04\x2f\x12\xe5\xad\x20\x36\xc6\xdb\x58\xf1\xb5\x87\x89\xe8\xca\xa2\xc2\x17\x7e\x7d\x93\xfd\x59\x13\xeb\xf2\xbc\x05\xe9\xce\x3d\x08\x8c\x85\x3e\xc4\x26\x49\xd6\xfa\x90\x9b\x24\x14\xbe\xa5\x38\x26\xca\xac\xf2\x9e\xa8\x32\xe6\xc9\x02\xe5\x09\x54\x27\xf6\x87\xd2\x3c\xac\xdb\xef\x8a\xfb\xc8\xb1\x3f\xbb\xf2\x9e\xfa\xb8\x3d\x1a\x73\xea\x80\x9c\x80\x77\xde\x4d\x69\x7e\x6b\xf5\xdf\xdd\x03\x09\x7c\x96\xe2\x84\xcb\x9e\x89\x85\x95\x60\xca\xd9\xbd\x52\x09\x94\xd2\x24\xc8\xfe\xb8\x58\x07\x79\x73\x7c\xa1\xdc\x31\x64\xf1\x5c\xe6\x5b\x89\xd8\xf2\xc3\x7e\x8b\xca\x4a\xc3\xe0\x0e\xb0\xc6\x9d\xb3\xef\x14\xf9\x22\x7e\x2d\xdc\x17\xf8\x80\xd5\xb5\xa3\x1a\x78\x37\x69\x6f\x94\x54\x95\x1a\xaa\x43\x10\xa7\xc1\xb6\xc3\xb2\x2c\x4d\x5d\x4b\xe0\xce\x14\xa5\xa3\xd7\xc3\xf0\x24\x19\xf1\xcf\x7b\x7c\x60\x9b\x0e\x97\xc5\x80\x80\xe0\xc3\xce\x05\x60\xef\x79\xf0\x90\xdd\xd6\x9f\x91\xa1\x14\x76\x47\x26\xe4\x01\x3f\x87\x18\xa1\xf5\xd2\xee\x02\x32\xfc\x81\x44\xfc\x58\xd2\x4e\x97\x7f\x36\x34\x91\xcf\x2a\xb5\x51\xf4\x2b\x4f\xf8\x3d\x92\xa4\x7f\xe8\xc0\xfe\xc1\x17\x7e\xd4\x7a\xcc\x4a\x06\x02\xa3\xb8\xe5\x92\xfa\xda\xe9\x5b\x4e\x56\xca\x06\xfc\xe6\xfe\x47\xd2\xa3\x47\xa3\xf0\x8a\xa4\x2f\xf9\xa1\x24\x59\xa1\xc7\xef\xd7\x93\xe1\xef\x5e\xe4\xaf\x9a\xe3\x40\x20\xc6\xb0\x70\xeb\xd7\xda\x92\x6e\x2c\x0d\x05\x0e\xaf\xa6\x7c\x64\xfb\xb1\xad\xdf\xe3\xff\x88\x99\xe8\xa6\x57\xac\x2c\x36\x79\xb8\xf0\x4a\x3a\xb9\x0d\x4c\x9b\x62\xf5\xe6\xd7\xe0\xf9\x1f\x5f\x21\xfb\x99\x71\xc6\x3e\xa1\xa8\xa4\x20\x4a\x8a\x28\xea\xff\x2c\x92\x84\xe3\x07\x26\xd1\x87\xeb\xcf\x94\x2a\x9f\xe4\xcd\xcf\xbc\xfc\x04\x2f\x4f\xc9\x04\xa9\x9e\xb2\xa9\xa4\x13\x15\xf7\xb3\x76\x38\xb9\xe7\xef\xbb\xb3\x07\xce\xe5\x68\xae\x75\x31\x47\x53\x63\x28\xde\x65\x28\x1e\x7b\x16\x00\x73\x2e\xc4\x7a\x72\x37\x29\xf0\x19\x0b\x0a\xa7\x3e\x9a\xc6\x1a\x0e\x2d\x0b\x09\x61\x4a\x90\x34\x83\x11\x25\x9c\xc7\x79\xdf\x37\x97\xe4\x09\xfe\xde\x57\x2b\x19\xa7\xd6\x8d\x45\x69\x7e\x9f\x94\x58\x39\x51\xad\x38\x69\x31\x8d\xf7\xb4\x46\x70\x24\x6f\xa7\x45\x3b\xa6\x85\x9b\xa4\xc0\x29\xdc\xe9\xd6\x91\x7e\x75\x02\xef\x49\x67\x66\x88\x31\x23\xc7\x60\x1b\x7c\x3f\xcf\x6a\x50\xff\xfe\xc7\xde\x9f\x38\xb9\x6d\x23\x8b\xe3\xf8\xbf\xa2\x6f\xb6\x54\xe5\x79\x1e\x32\x3c\x75\x4d\xad\xeb\xd9\xe3\x38\x4e\xe2\xc9\x61\x3b\x87\xbd\x95\xcf\x2b\x4a\xa2\x34\xb4\x29\x51\x26\x39\x97\x55\xf3\xfe\xf6\x5f\x11\x07\x89\xa3\x01\x82\x94\xbc\xf6\xbe\x9f\x37\x9b\xd8\x22\xba\x1b\x8d\x46\xa3\x01\x34\x1a\x8d\xf0\x8f\x97\xbf\xbd\x7a\xf9\xd7\x1f\xee\x8b\xf3\xd7\x7f\x2d\x5f\xdd\x6d\x3e\xfa\xc5\xdb\x97\x53\xd7\xfd\xf9\xe7\xc7\x3f\xdc\x7d\x1f\x45\xdf\xbf\xf9\xf6\xc5\xcb\xbb\x75\xfa\xfa\xcd\x2f\xce\xfb\xe0\xf9\xe5\xc7\xcb\x8b\x1f\x5d\xd7\x71\x26\x17\x2f\xe3\x77\xe9\x4f\xcf\xbf\x75\x16\xc1\xc7\xf5\xd3\xed\x2f\x8f\xdf\xef\xc6\xe7\xc1\x36\xba\x0a\x36\xbb\xab\x70\xfd\xba\x0c\xb6\x0f\xaf\xc2\xf4\xc3\x2a\xdc\x3c\xbd\x0a\xdf\xcd\xcb\x70\xbb\x89\xc3\x4b\xe7\xf9\xb9\xff\x5d\xf2\xdd\xb3\xf1\xb3\xf0\xdd\xe5\x32\x48\xdf\x2e\x83\xcd\x1f\xab\x20\x4d\x9e\xc7\xc1\xd3\x3f\xe2\xd0\x1d\x7d\xff\xf0\xcd\x9f\xf3\xf8\xc7\xc2\x8f\xdf\x5c\xbf\x5e\x5d\x3c\xfc\xf5\xaf\x8b\xc5\xb3\x97\x4f\xd2\xcb\xf4\xc9\xe5\xed\x3c\x79\xfe\xe4\xe5\x1f\x77\x3f\xdc\xdc\xae\x77\xef\x77\xb7\x97\xdb\x5f\x26\xc1\xdd\xdd\x6f\xaf\xff\xba\xb8\x4b\xff\xba\xf8\xf1\x9d\x7f\x91\xa7\x7f\x5d\xbc\xf9\xe3\xaf\x8b\xf7\xbf\x7e\x7b\xf1\xfa\xdd\x5d\xf9\xc3\xc5\xdb\x57\xe5\xf3\x5f\xaf\xb7\x61\x32\x9e\x84\x3f\x86\xaf\xf2\x5f\x7f\xf9\xe3\xc5\x4f\xe9\xf9\xe5\xe3\xdd\x87\xdd\x0f\x85\xff\x6a\x7e\xe1\x5f\xfe\xe1\x8f\x5f\xff\x75\xe1\xbf\x5e\x9d\xfb\xbf\xfd\x96\xf8\xc9\x72\x3a\x7e\xf9\x26\xf1\x5f\xfe\x9e\xf8\xaf\x17\x1f\xfc\xf5\x62\x3c\xfe\xed\xd5\x07\xff\x55\xf4\xc1\x7f\xf9\xe7\x07\xff\x75\xbc\xf1\x7f\x7b\xb9\xf1\x93\x5f\xaf\xc6\x7f\xbd\xdd\xf8\x2f\xff\xd8\xf8\xaf\x97\x97\x7f\xe4\x97\x4e\x1e\xac\x3f\x7e\x1b\xbe\xff\x30\xfd\xfd\xc3\x87\xa7\x3f\xfd\xf1\x53\xf0\xd3\x1f\xd1\xee\x27\x37\xca\x5f\xbe\xbe\x72\x5f\xe5\x7f\xbd\xcd\xdf\x7d\xfb\xf6\xc3\x73\xe7\x61\xf6\xfa\xfa\x8f\x0f\xbf\x9f\xff\xbc\x9a\x04\xee\xf9\xf5\x45\xb9\x5d\x5d\x9c\x3f\x5f\x5d\xbc\xda\x5e\x5f\x2c\xb6\x51\xfa\xd3\xc7\xe9\x87\xf2\xd9\x93\xe9\xab\x0f\x3f\x5f\xba\xbf\x5f\x7d\xdc\x39\xaf\x7e\x58\xfd\xf1\xe1\x55\xe8\x7e\x70\x96\xcf\xdd\x8b\xe2\xe9\xaf\x17\xeb\x77\xbf\x5e\xec\x9e\xfe\x7a\x71\xe3\xfa\x3f\xfd\xf9\xee\xd7\x8b\x5f\x5e\xff\xfa\xd3\xef\x0f\x57\x69\xf4\xed\xbb\xab\x4d\xf0\x64\xfb\xf2\xfc\x47\xff\x8f\x9f\xd2\xf5\x9b\x3f\xfe\x78\xff\xca\xbb\xbc\xbe\x75\x33\x77\xfe\xe6\xd5\xe2\xf5\x34\xfd\xf0\xfd\xf5\xbc\x3c\xbf\xfd\x38\x5d\x3f\xbc\x0b\xfe\xfc\xf6\xc5\xbb\xef\x17\xc9\xcf\xc5\xbb\x55\x71\xfd\x9b\x7b\x9b\x78\xce\xfb\xf7\x2f\xd7\x93\x68\x77\x9e\x5c\xef\x9e\xfa\xef\xff\x2c\x37\xcf\x1e\xfe\xf4\xe3\x8f\x3f\xfc\x79\xf5\xfd\xcd\xf3\xdf\xbf\xdd\x78\xdf\x4e\x7f\x5a\x4d\x92\x8f\xc5\x3b\x2f\x7f\xff\xeb\xf7\x37\x7f\xbd\xfc\xcd\xbb\xbc\xfd\xe5\x5d\x16\xbe\xfd\xf1\xc5\xcb\x8f\xbf\x9c\xff\x7a\x53\x6e\xb7\xd7\xbf\xbf\x09\xae\xb7\xdf\x7d\xfc\xbd\x98\x5f\x78\xc5\xf3\x8b\xf7\x3f\xac\xbe\x77\xff\xfc\xe5\xc7\x3f\x9d\xd5\xeb\xef\x9f\xfe\x5c\x5e\x5c\xbf\x2d\x9f\x5c\xfd\x55\xbc\x5d\x3e\x7b\xf1\x76\x1b\x17\xbf\x7d\xfc\x75\xb9\xfb\x39\x2e\xef\x9e\x5d\x4f\x7e\x99\xff\xf0\xe7\x77\x6f\x46\x4f\x93\x65\xb2\x9e\xce\x5f\x6f\x32\xe7\xed\x87\x3f\x5f\xad\x7f\x7f\xb9\x09\x7f\x29\x9c\xe7\x2f\x3f\xbe\xce\x5e\xff\xf2\x71\x1d\xfe\xfa\x36\x5b\xfe\xec\x2c\x1e\xdf\x8d\x5e\xff\xfc\xe7\x9b\x73\x7f\xf2\xe1\x79\xe2\xec\xf2\xdf\x6e\x47\x2f\x7e\xfd\xd9\xdd\x8c\x5e\xbd\xdf\x44\xf3\xe7\x9b\xbb\xb7\xe9\xe6\xe7\x5f\xdf\xbd\xfc\xe5\xd7\xa7\xbf\x44\x5b\xe7\x62\xfa\xf4\xe3\x76\x92\xbe\xda\xbc\xfd\xfe\xdb\xdb\xe9\xf5\x93\xf4\xfb\x67\x4f\xe6\x1f\xdf\x7d\xb8\x7c\xf6\xcb\xbb\xdf\x3e\x3e\x1f\xcf\x2f\x9e\x05\x97\x57\xe3\x17\xce\x93\x5f\x5f\x7b\xe5\xf2\xfa\xed\xee\xd6\x79\xbf\x9c\x7c\xbb\x5a\x7e\x78\xed\x8c\xe2\xe5\xf6\xdd\xe5\x9b\x3f\xae\xfe\xbc\x7b\xf1\xec\xdd\x6e\x74\xeb\x7a\xf9\x4f\x69\xfe\xf3\x9f\xe3\xdf\xa2\xdb\x8f\xdf\xff\x15\xbf\x76\x5f\x7e\xf8\xc9\x7b\x13\x4c\x9f\xdd\x7e\xfb\xe2\xfb\x8f\xa3\xd2\xf9\xeb\xcf\x4d\x76\x5d\xee\xde\xbd\x5b\x2c\xbe\x7f\x17\x78\x0f\x7f\xdd\x5c\x38\xc1\xab\x17\xd3\x9f\xd3\xcb\x57\xdf\x5d\xbf\x7c\x13\xe6\xcf\x17\x6f\x82\xbf\x9e\xbf\x2a\x7e\x5e\xff\xee\xbf\xc9\xc2\x57\xaf\x17\xd9\x4f\x3f\xed\x7e\x58\x2c\x3e\x94\x9b\x17\x3f\xae\x2e\xae\x96\xb7\xbf\xbf\xf3\xc7\x1f\x96\xe9\xfb\xd7\x7f\x4d\xbd\xf8\x7d\xf0\xe6\x47\x67\xe5\x9c\xbf\x1a\xf9\xcb\x5f\xee\x6e\x7e\x2d\xa7\xef\x9e\xce\xc7\x9b\xf2\x6d\xf8\xc7\x75\xe6\xbc\x7e\xfe\xc3\xdd\xf7\xd9\x55\x70\x37\xdf\xfe\xe9\xfd\xfc\x5b\xfc\xf2\xcf\x9b\xed\x0b\xef\xc7\xf1\xe8\xf2\xa1\xff\x76\xbe\xb8\x24\xcf\x18\xbf\x9b\xfc\x3c\x7e\xb2\x38\xff\x21\x7b\x93\x5c\xbc\x7b\xe3\x7e\xfb\xfe\x49\x11\x2d\x9f\x3f\xbe\x59\x3c\xbd\x78\xff\xec\xfb\xdb\xed\x9b\xed\xeb\xb7\x3f\x5e\xbc\xfb\x31\x5b\xbf\x4c\xe6\xf1\xeb\xf5\x9b\x5f\x5e\x3d\x2e\x2e\x5e\xbf\xb9\x49\x26\x3f\xef\x9e\x8d\x2f\x9e\x3e\xbe\xbb\x78\xfa\x63\xf8\xf4\xe7\xd1\xfc\xd5\x8b\xc7\x8b\xdd\xe6\xed\xf6\xe9\xdb\x0f\x17\x2f\xde\x7c\xf7\x32\xb9\xbd\x89\xbe\x7b\xf7\x26\xf9\xf9\x63\x52\x94\xdf\xff\xfc\xf2\xc9\xf5\x33\x67\xf1\xf4\xf1\xdd\x2f\x2f\x7e\x73\x96\x77\xaf\x1e\xbf\xfc\xe1\xd5\xab\xdf\x7e\x9b\xff\x32\x7f\xf7\xe6\x97\xd7\x2f\xab\xd5\xfb\xb5\xff\xfb\xd3\x57\x0f\xa7\xdf\xff\xb8\x8e\xfe\xfa\x18\xdd\xec\xe6\x8f\x6f\xae\x5e\xac\x9f\x3e\x7c\x7e\xfe\x07\xde\xd0\x3e\x7e\xf6\x66\xf3\xeb\x5b\xff\xf1\xe3\xc7\xfa\xa7\x3e\x47\xe0\x53\x9f\x97\xe5\x26\xdd\xcf\xb3\x5b\xab\x48\x3e\x26\xdb\xf5\x6c\x9e\xe5\xcb\x38\xb7\xe6\xd9\xed\xfd\x7f\x9d\xce\x66\xf3\x78\x95\xe5\xf1\xe9\x6c\x16\xad\xca\x38\x67\x01\x93\xed\x65\x9c\x27\x25\x26\x60\x6d\x0a\x2b\xbb\x8e\xf3\x55\x9a\xdd\x10\xfa\xc5\x22\xcf\xd2\x74\x1e\xe5\x67\xd6\x4d\x3c\x7f\x9f\x94\x56\x19\xed\xac\xcb\x64\x7d\x99\x56\xec\x58\x8b\x2c\xcd\xf2\x59\x99\x47\xdb\x62\x17\xe5\xf1\xb6\xbc\x4f\x36\xeb\xfd\x75\x9c\x97\xc9\x22\x4a\xad\x28\x4d\xd6\xdb\xd9\x26\x59\x2e\xd3\xf8\xfe\x5f\x79\x96\xc6\xff\x9c\x5f\x95\x65\xb6\xfd\x7b\xbf\xb8\xca\x8b\x2c\x9f\xed\xb2\x64\x5b\xc6\xf9\x7d\x74\x1a\xe5\x71\x74\x8a\x4b\x4f\x39\xd0\xd3\x64\xbb\xbb\x2a\x4f\xd3\x68\x1e\xa7\xa7\x45\x9c\xc6\x8b\xf2\xb4\xb8\xda\x6c\xa2\xfc\xee\xb4\x8c\x6f\xcb\x0a\x71\x5f\x66\x57\x8b\x4b\x2b\x5a\x94\x49\xb6\x9d\x6d\xa2\x6d\xb2\xbb\x4a\xd1\x4b\xa6\xf7\x98\xca\x6c\x95\x2d\xae\x8a\x7d\x76\x55\xa6\xc9\x36\x9e\x79\xbb\xdb\x41\x91\xa5\xc9\x72\x40\xdb\x85\xca\xad\x3c\xd9\xae\x71\xa3\xce\x08\xa8\x95\xad\x56\x45\x5c\xce\xdc\xdd\x2d\x25\x65\x6d\xb2\x8f\x18\xbe\x02\x3f\xfd\x57\x79\xb7\xab\x99\x85\x0b\xf3\xb8\x88\x4b\x45\x59\x71\x35\xdf\x24\x52\x21\xc0\xe9\x73\x2a\x75\x88\x35\x2c\x23\x22\x3e\x22\xa4\x5a\x38\x44\x1d\xf2\x68\x99\x5c\x15\x33\x07\x03\x13\xce\xa2\x65\x92\xfd\x3d\x5b\x26\x45\x34\x4f\xe3\xe5\x29\x53\xb4\xb8\x8c\x17\xef\xe7\xd9\x6d\x53\x4a\x3b\x6d\x9b\x95\x56\x94\xa6\xd9\x4d\xbc\x64\x69\x2d\xa3\x32\xfe\x9b\xa5\x50\x26\x1b\xfe\x43\x05\x51\x7d\xb4\xd2\x6c\x11\xa5\x5c\xd1\x26\xdb\x96\x97\x7f\xef\x69\x77\x44\xbb\x5d\x1c\xe5\xd1\x76\x11\xcf\xd2\xa4\x28\x2b\x4d\xae\x9b\x93\xc7\x45\xf2\x31\x9e\x51\x2d\xbb\x5f\x25\x71\xba\x2c\xe2\x72\xbf\x49\xb6\xd6\x4d\xb2\x2c\x2f\x67\xce\xd9\x2e\x5a\x2e\x2b\x0d\x77\xce\x36\x51\xbe\x4e\xb6\x33\xe7\x0c\x8b\x61\xe6\xdc\xa7\xf1\x3a\xde\x2e\xf7\xcb\xa4\xd8\xa5\xd1\xdd\x6c\x9e\x66\x8b\xf7\x67\x18\xd1\x75\x9c\x21\x83\x8b\xc4\x7c\x89\x87\x1e\x1d\x2b\x0c\xd3\x45\x1c\xe5\x0b\x98\xeb\x6d\xb6\x8d\xef\xff\x75\x99\x2c\x97\xf1\xf6\xef\xba\xaa\xea\xeb\xff\x97\x6c\x76\x59\x5e\x46\xdb\xf2\x7e\x99\xee\x31\x77\xd6\x3c\x2b\xcb\x6c\x53\x73\x6b\x95\xd9\x6e\xe6\xe6\xf1\xe6\xbe\xac\x24\x4f\x7b\xb0\xd8\x45\x0b\xc4\xd8\x7d\x34\x4b\x93\xed\xfb\x3d\x1e\x7f\xff\x08\xa2\x28\x5e\x4e\xcf\x2a\x09\x59\xcb\x78\x91\xe5\x48\xf5\x31\x0f\xd1\xec\x3a\x29\x92\xb2\xea\x3d\x0c\x3c\x5d\x44\x51\xec\xa9\x80\x2f\x2b\x0b\xd0\x42\xf7\x6a\xbb\x8c\xf3\x4a\x34\xf7\xd1\xac\x1a\x72\xd7\xb1\x31\x82\xbd\x48\x73\xab\xc8\xad\x6c\x9b\xde\xed\x77\x59\x91\xa0\xf2\x68\x5e\x64\xe9\x55\x19\x9f\x2d\xd2\x64\x37\xcb\xe3\x45\xf9\xc0\xdd\xdd\x9e\x32\xff\x9e\xa0\x22\x6b\x17\x95\x97\xb3\x64\x5b\xc4\xe5\x83\xd0\x19\x9e\x30\x3d\x45\x3b\xf7\x8c\xf4\x96\xbb\xbb\xa5\x5d\xba\xbb\x3d\xa3\x66\x6d\x86\x3b\xe4\xec\xe6\x32\x29\x63\x24\xce\xaa\xa7\x6e\xf2\x68\x77\x56\x49\xdc\x39\x4b\xe3\x55\x39\x73\xee\xed\x28\x8d\xf3\xd2\x4a\x16\xd9\xf6\x14\xb1\x5c\xfd\xad\xee\xc5\x64\x8b\xf4\x02\xeb\x0d\xa9\xcf\x9e\xe4\xf1\x86\xd4\x88\xff\xce\xf0\x16\x2d\xde\xaf\xf3\xec\x6a\xbb\xb4\xf2\x78\x17\x47\xe5\x6c\x9b\x91\xbf\xb1\x65\x48\xab\x17\xd9\xb6\x8c\x92\xed\x19\x6c\x43\x19\xbe\x6a\xb6\xac\x9b\x28\xdf\x56\xf6\x84\x2d\xe4\x0b\x28\x28\x80\x53\x17\xb1\x9f\xf7\x0c\x57\xc9\x26\x5a\xc7\xcd\x23\xd1\xe8\xe7\xb7\xc5\xf5\xfa\xe1\xed\x26\x65\x1f\x87\x9e\x9c\x0e\xfd\xf3\xe2\x7a\x3d\xf4\x9c\xeb\x38\x2f\x92\x6c\x3b\xf4\x9f\x0e\x3d\xcf\xb5\xdd\xa1\xe7\x55\x5f\x93\xf8\xe6\x49\x76\x8b\xbf\x86\x43\xcf\xa9\xfe\xf5\x46\xe4\x3f\x15\xc4\xae\xb2\x93\xf9\x75\xfc\xb8\xd8\xc5\x8b\xf2\x65\xa5\x3b\x18\xfa\xf6\x22\x59\xbe\xb9\x48\x96\x43\xcf\xd9\xc4\x71\x89\xa1\x6f\x37\xe9\xb6\xc0\xe5\x97\x65\xb9\x1b\xfa\x8f\x87\xde\xb3\xa1\xf7\xec\xe6\xe6\xc6\xbe\xf1\xed\x2c\x5f\x0f\xbd\x67\x9e\xe3\x38\x43\xef\x19\xe2\x8b\x41\x7a\x7c\x5b\x0d\x9f\x36\x64\x77\x3a\x9d\x0e\xbd\x67\x18\xd6\xf3\x86\xfe\x77\x43\xff\x7c\x19\xaf\x0a\xfc\x37\x34\x45\x0e\x3d\xa7\x32\x05\x98\x54\xa5\xf7\x43\xef\xd9\xa2\x28\x08\xb8\xf3\x78\xe8\x4c\xb1\x8c\x2d\x62\xb5\x87\xe3\x27\xab\x24\x4d\xad\xfc\x2a\x8d\x87\xfe\xe3\xf8\x3a\xde\x66\xcb\xe5\xd0\x7f\x82\x14\x5c\xfa\x5a\xc1\x22\xee\xfc\x71\x50\xfd\x33\xf4\x9f\x0c\xc7\x4f\x87\xfe\x79\xd5\x2a\xc4\x00\xe2\x65\xe8\x3d\xa3\x8c\x39\x8f\x87\x9e\xd3\xed\xff\xfe\x79\x99\x94\x88\x54\x7c\xbb\x48\xa3\x0d\x1a\xb5\x56\x99\x27\xd1\x76\x9d\xc6\x16\x62\x1b\xd5\x41\xc1\xfa\x55\x52\x8d\xde\xa1\xe7\x2c\xd2\xa8\x20\x1d\xc7\x4b\xa6\x2a\x62\x7e\xa3\xd1\x6e\x11\xed\x59\x62\x84\x0b\x77\x32\xf4\xce\x3d\xd7\xf6\xbd\xc8\xb5\xfd\xa1\x77\x8e\xff\xeb\x30\xff\xba\xb6\x6f\xb9\xb6\xff\x87\x1b\x48\x20\x6e\xf5\xa7\xe5\xd9\xa3\xea\xcf\xeb\xd1\x63\x25\x89\xba\x96\xb7\x75\xc7\x0f\xbd\x67\xa8\x01\xe8\xc7\x22\xc9\x17\x69\xdc\xb9\x31\x1e\x6e\xcc\x82\x8c\x02\x77\x6c\x4f\x43\xf2\xe9\x0e\x7f\xf2\x02\xdb\x1b\xe3\x4f\x39\x1d\x40\x21\xcb\x03\xa9\x19\xfd\xec\x25\x50\x9f\x17\xa8\xef\xd8\x7e\xd5\x7c\x2f\xb4\xc3\xa0\xfa\xd3\xb1\xc3\xe9\xd0\x3b\x1f\xdb\xa3\xa8\xfa\xce\x89\xc6\x0a\x11\x77\xe7\xce\x8b\xd0\x0e\xc7\x14\xeb\xb1\x04\x37\xf4\xce\x27\xb6\x57\x49\xdb\x77\x9e\x7b\x63\x7b\x34\x95\x69\x55\xd8\xf6\x28\xb0\x02\x3b\xf0\xdf\x6e\x2c\xd7\x1e\x4f\x50\x5f\x4c\x83\xc8\xa5\x5d\x45\xbb\xc3\xb2\x27\x23\x3b\x98\x3e\xaf\x88\x82\xa5\x13\xcb\xb5\x83\xc9\x0b\x77\x6c\x3b\x63\x54\x79\x18\xca\x70\x88\xfc\x18\xf5\x7d\x3a\xb5\xc7\x55\x6b\xab\x1e\x08\x1e\x43\x90\x5e\x45\xa3\xfa\x73\x6c\x07\x13\x50\x0b\x0c\xc7\x00\x1e\xaa\xd7\xeb\xa1\xff\xdd\x89\xd6\x80\x5b\x68\x56\xd2\x58\x6b\x0c\xf0\xd5\x38\x7f\x81\xc6\x79\x85\xfe\xf7\xd5\x38\x7f\x35\xce\x5f\x8d\xf3\xff\x19\xe3\x7c\xbd\xb9\xb1\xd2\x6c\x9d\x09\x26\x99\x7e\x86\x0d\xf1\x37\xe6\x96\x98\xb5\xb9\x15\x37\xd5\xbf\xfe\x88\xfc\xc7\x53\xda\xea\xcf\x62\x5b\x05\x79\x36\x46\xe9\x7a\x33\xf4\x9c\xf9\xd5\x5a\x6f\x83\x58\xd3\xac\x36\x87\xfe\x79\x25\x97\x84\x68\xff\xf3\x38\x5a\xc6\x79\x81\xf9\x2f\xca\x3c\x7b\x4f\x2c\x79\xb5\x55\x65\xbf\xe2\x4d\x3f\x91\x12\x2e\xc0\x96\x99\x07\x66\x2c\x7b\x55\x40\xcd\x38\xd8\x3e\x35\x57\xe7\x2f\x2c\xc2\x98\xf5\x6a\x17\x2f\x08\x7b\xc8\x05\xb6\xca\xf2\x0d\x99\x6b\xaa\x9f\x69\x54\xc6\x0f\x2c\x6f\xe4\xd9\x0e\xfa\xdf\xd0\x3b\x1f\x7a\x8e\xe5\x8e\x43\xf2\xe1\xa4\xbd\x6e\x35\x1f\x8e\xdb\x52\xb3\xe7\x4f\xb8\x8a\xdd\x91\xdf\xaf\x5e\x35\x0f\xd7\x1b\xab\xea\xf9\x16\x3e\x02\x7b\xec\xf8\x6e\xb5\xaa\x40\x6c\x78\x87\x73\xc1\x73\x94\xc7\x8b\x92\x61\xea\x65\xbc\x28\xf1\xd4\x18\x78\x4c\xc7\x67\xbb\x68\x91\x94\xc4\x90\x3b\xb6\x17\x8a\x8a\x32\xf4\xfc\xa7\xe8\x7f\xb8\x40\x80\x27\x23\xb2\x19\xad\xd5\xaf\x3b\xee\x17\xa3\x85\x74\x00\x63\xe7\x00\xff\x2d\x27\x34\x7c\xd6\x6c\xa1\x36\x1c\x43\x18\x64\xd6\xa1\x13\xc8\xd8\x1e\xf9\xd3\x60\xe2\x23\xc3\xea\xfa\xf6\x64\x3c\xf2\x02\xa7\x62\xe3\x7c\x6c\xfb\x9e\x37\x0a\x7d\x2f\xc0\x45\x9e\x33\x1d\x3b\x93\xaa\x68\x64\x87\xfe\x74\x3c\x71\x43\xaf\x2a\xf1\xec\xa9\x33\x09\x5d\x7f\x5a\xad\x0a\xed\x89\x33\xf5\x7c\x27\xf0\x08\x8e\x3b\x9d\xfa\x41\x45\x2d\xb4\x9d\xf1\x78\xec\x3a\x81\x8f\x4b\x42\xdf\xf3\x26\xfe\x78\xe8\x39\x41\x85\xe3\x7b\x41\x35\x99\x9e\xbb\x81\xed\xbb\x8e\x3f\x9a\xba\x88\x9a\xeb\x4f\xc7\x9e\x83\x66\x05\x37\xb0\xa7\xe3\xd1\xd4\x71\xab\x92\x17\x13\xdb\x73\xc6\x5e\x38\xc5\xb3\x9e\x6b\xfb\xe3\x20\x98\x56\x22\x73\xce\x27\xf6\x68\x32\x1d\x8f\x3d\x84\xe5\x79\xb6\x3f\x9e\x04\x63\xbf\x5a\xaf\x4e\x6d\x77\x3a\x09\x82\x60\xea\xe2\x92\xa9\xe3\x8f\x9d\xa0\x62\xcf\x75\x6c\x37\xf4\x26\xae\x27\x95\x9c\xbb\xae\xed\x8e\x3d\x67\x8a\xe7\x13\x0e\xc9\xb5\x47\xee\x68\xe2\x39\x53\x52\x91\xef\x3a\xa3\x6a\x3a\x46\x3a\x3c\x9d\xf8\xa3\x60\x24\x71\xa7\x2e\x72\x03\x7b\x3c\x0e\x82\xd1\x04\xc9\x2e\xb4\x11\xdb\x81\x8b\x4b\x26\x8e\x1b\x4e\xf1\xa4\x17\xda\x63\xaf\xaa\x37\x44\xe4\x02\x7b\xe2\x4d\xc6\xde\x68\x84\x8b\x46\xa3\xd1\x68\xec\x13\x72\x53\x37\x98\x86\x93\x09\x2e\x09\x26\x23\xdf\x9b\x54\xb3\x87\x1b\xda\xee\x64\x5c\x75\x0d\x2d\x19\x7b\x21\xea\x58\xf4\xcb\x1d\x4f\x5c\xca\x43\x30\x75\x9c\x60\x8c\x71\x46\xae\x33\xf2\xa6\x01\xad\x27\x1c\x07\x3e\x54\x32\x75\xdc\xc9\xa8\xd2\x0c\xe7\x05\x57\x54\xb5\x75\x54\x89\xdf\x27\x15\x31\x45\x9e\xed\xb9\x9e\x33\x46\x6c\x8f\x6c\x67\x3a\x9e\x4e\x46\xb2\xb8\xc7\xb6\xe3\x07\x53\xd7\x0f\xe4\x3e\x1a\xdb\xd3\xb1\x3b\x09\x1c\x5f\x42\x9a\xd8\xc1\x78\x12\x8e\x43\xa9\x1e\xae\x80\xe5\xed\x05\x57\xe4\x8e\xec\xc9\x74\x14\x86\x0e\x66\x5b\x28\x72\x7c\x7f\x32\x46\xc3\xc5\x9d\xda\xae\xe7\x4e\xbd\x90\x88\x21\x18\x07\x5e\x80\x26\x6b\xcf\xa9\x0c\xda\xd8\x9d\xf8\x62\x49\xb5\x5c\x9b\x8c\x27\x61\xe0\x49\x45\x9e\x6b\x07\x23\x7f\x1c\x62\xa4\x91\xed\x84\x5e\x30\xaa\x46\xa2\x54\xd2\x70\xf7\x82\x2b\xe2\xe5\xcd\x17\x31\x72\xf0\x5c\x7b\x1a\x7a\xce\x04\x8d\x58\x4e\x74\x9e\x67\x4f\x26\x13\x07\x33\xc7\xcb\xdb\xf3\xed\x89\x17\x38\x8e\x2c\x6f\x2f\xb0\x7d\xdf\x1b\x8d\x7d\x57\xac\x87\x2b\xe0\xe4\xcd\x15\xf1\xf2\x16\x8b\x1a\x79\x7b\x95\x39\x08\x9d\x30\x90\x45\x17\xda\x93\xd0\x9f\x04\x63\x4f\x96\xf7\xc8\x1e\xfb\xce\xd8\x01\xe4\x3d\xb6\x7d\x77\x34\x99\x8c\x5d\x49\xde\x42\x09\x2b\x6f\xb6\x48\x90\x37\x57\xc4\xca\x61\x6c\x4f\x9c\xd0\x73\x7d\xc9\xd2\x78\x13\x7b\x1c\x78\xae\xac\xdd\xde\xd4\x1e\x8d\xc7\xae\x27\x9b\x2d\xdf\xb1\xdd\x49\x30\xf1\x25\x69\xf3\x05\x9c\xb4\xb9\x22\x77\x64\x7b\xe3\x89\x4f\x46\x3f\x5f\x14\xd8\x81\x33\x76\x82\xca\x7e\x54\xbc\x8d\xdc\x89\x8b\x6d\xaa\xeb\xdb\xce\x74\xe4\x4d\x43\xbc\xfd\x67\x45\xca\x96\x54\x9d\x37\x09\x42\xcf\x73\x47\x12\x92\x5f\x19\x10\xd7\x71\x46\xc4\xe4\x07\xe3\x30\xf4\xf5\x25\x95\xd2\x39\xfe\xd8\x0b\xe9\x04\x52\x59\xba\xa9\x8f\x15\xb5\xb2\xd0\x5e\x50\x33\x37\xf6\x3c\x64\x81\x3c\xc7\x1e\x3b\x93\xe9\x44\x2e\x39\xaf\xc6\xeb\x28\x08\x43\xa9\xc4\x1d\xdb\x13\xd7\x9b\x06\x32\x07\xea\x92\xca\x00\xb9\x93\xc0\xf5\x02\x57\x64\xce\x1d\xd9\xae\x1b\x06\xde\x48\xae\x28\xb4\x3d\xdf\x99\x78\x4e\x20\x33\xe7\xdb\x93\x91\x3b\x1e\xf9\x13\x09\xc9\xab\x26\x89\x51\x38\x26\x13\xec\x68\x1c\x06\xd8\xd0\x79\xb6\xeb\xba\x53\x6f\x4a\xb4\xde\xf5\x1d\x0f\x69\x9f\xf3\x82\x9b\xdc\xdc\xa9\x1d\x8e\x9c\x89\x3b\xa9\xa6\xeb\x17\xca\xe9\xdf\x63\x16\x4c\xcf\xaa\xe5\x51\x00\x2c\x87\x9e\xa1\xff\x1d\xb0\xbb\x92\x76\x5a\xeb\xae\x5b\xb3\x36\x04\x25\x10\x57\xc0\xec\xf2\xbe\x39\xb9\xb7\x93\xc2\xca\x56\x2b\xab\x58\xe4\x71\xbc\x6d\x4e\xa1\x56\xc9\x6d\xbc\x6c\x4e\xe7\xea\x23\x25\xe6\x53\x73\xb8\xc4\x7c\xac\x8f\x99\x98\x6f\xf8\x1c\x89\xf9\x50\x66\xbb\x99\xb5\xc8\xb6\xd7\x71\x5e\x3e\x89\x8a\xb8\xda\xf2\xbf\xce\xaa\xbf\x79\xce\x03\xf7\x84\x81\x14\xce\xaa\x98\x92\xeb\xa4\x48\xe6\x49\x9a\x94\x77\x72\x59\x7d\xda\xc4\x7c\xa3\x27\x9f\x03\x67\xa0\xa9\x7a\xc0\xa0\xe0\xf3\xb9\x5d\xb6\xab\x98\xa8\x70\xca\x78\x5b\x0a\x12\x3a\xfb\x68\x25\xdb\x65\x7c\x3b\x73\x9d\xd0\xb9\xb7\xe7\xe5\x56\x38\xcc\x3f\x03\xcf\xc9\x14\x67\xa4\x92\xbc\xe9\x31\xb5\xed\x86\x79\xbc\xa1\x1f\xc9\xc1\x9a\xc3\x7e\x23\x21\x0a\x59\x9a\x2c\xcf\x9a\xa3\x5f\xdf\x1e\x55\x30\x9b\xe8\x96\x7c\x70\xf1\xc9\x1c\x70\xe2\x17\xdf\x96\x75\xc0\xc3\x2c\x4e\xd3\x64\x57\x24\x85\x74\x56\x88\xc0\xf0\x29\xdc\x22\x46\xed\x83\x8e\x4e\xf1\xc7\x7a\x13\x34\xbb\xda\xed\xe2\x7c\x11\x15\x31\x7c\x92\x47\xdb\xc0\x9f\x9b\x32\x0e\x05\x29\xb2\xe2\x8c\x07\x65\x4f\xa6\x5d\x7c\xe0\x98\xc6\x65\xc9\x1c\x12\xdb\xae\x17\x6f\x48\xb0\x48\xf2\x31\x9e\x61\xb9\xb0\xc1\x24\xa1\xd3\x1c\x97\x0a\x67\x96\x03\x04\x8d\x7a\x97\x1c\x09\x83\xe7\xc5\x55\xf9\x60\xb1\x2c\xc8\x49\x29\xfa\x45\x4f\x4b\x39\x7e\x31\x25\xe1\x24\x9a\x2d\xc2\x95\x48\x02\xc8\xd7\xf3\xe8\x81\x17\x86\xa7\xf4\x5f\xdb\x3d\xa1\x92\x08\xc7\x8b\x49\x1c\x61\x74\x72\x0c\x8d\x42\x5b\x2e\xa3\x65\x76\x53\x35\xc1\xcd\xe3\xcd\xa0\xd2\xfe\x7f\x38\x8e\x33\x40\xc7\xc6\x67\x0a\x88\xeb\x28\x7f\x60\x59\x15\xef\xf3\x72\x6b\x2d\xe3\x55\x74\x95\x96\x56\x03\x8c\xd9\x39\x1d\xcc\xd3\x68\xf1\xfe\x04\xd3\x42\x35\xdb\x75\xe8\x04\xe2\xa3\x09\x95\xc0\x3c\xae\x56\xab\x33\x39\x6a\xe2\x8c\x6c\x2e\x67\x76\xa0\xef\x73\x5e\x4b\x2a\x62\x0c\xff\x75\x0f\x58\x15\xfe\xee\x11\x27\x7e\xa1\x33\x1a\xc5\xac\x37\xe6\xfe\xf2\x81\x73\x6a\x21\x11\x9c\x3a\x27\x32\x21\xbe\x57\xc9\xaf\x3d\x13\x9f\x60\xd9\x6e\x40\x95\x04\x61\x17\xf1\x22\xdb\x2e\xa3\xfc\xee\xb4\xfe\x94\x6c\x57\x59\xf3\x8b\xb8\x3a\x9b\x0f\xbb\x3c\xd9\x44\xf9\x9d\x5c\x50\x93\x92\x8b\x6a\x7f\x29\xc6\x95\x0b\x14\x6c\x70\x94\x1a\xa0\x41\xf5\xf3\xb4\x86\x62\x7e\x12\x78\xe6\x8b\xc0\x2e\x53\x22\xf1\x2b\xd3\xa1\xd8\x40\x89\x8a\x19\x0d\xb1\x9a\xd7\xfd\x81\x96\x04\xe8\x3e\xbe\xef\xc5\x32\x56\xc1\x1a\xb1\xc9\x28\xf8\xb3\x04\x4d\x9b\x24\x23\xd4\x25\x12\x8e\x28\x77\x19\x57\x82\x90\x68\xc8\x3d\xa4\x69\xa5\x86\x8e\xd8\x9b\xca\x76\x34\x10\x4a\x1a\x3a\x89\x03\x30\xa0\xe4\x35\xcd\xe1\x8b\x59\x6c\x41\xe3\x78\x5c\xa9\x90\xc3\xac\x15\x4f\x40\x62\xbe\x73\xf0\xac\x0a\x0b\x28\x7c\x11\x87\x05\x8d\x34\x01\x1b\x06\x81\x5b\xa9\xa3\xa3\x02\x82\x5a\xc1\x8d\x61\xb8\x35\x02\x08\x48\x45\x2b\x7d\x15\x90\xd4\x0b\xba\x46\x01\xe5\x20\x27\xaa\xde\x04\xca\xd5\xf3\x3a\x2f\x46\x3a\xcb\xf3\x7a\x28\x7f\xa5\x11\x8e\x52\x81\xd0\xb1\x32\x80\xd4\x63\x4a\xe2\x94\x96\x1a\xa0\x85\x6d\xb0\x06\xa1\x6b\xf8\xb2\x5a\x62\xfc\x67\xb6\x2f\xf8\x12\x48\x8f\x15\xd5\x69\x60\x20\xed\x83\x21\xda\x98\x37\xa8\x44\x6a\x63\xbb\x52\xa0\xf5\x9d\xa0\x12\xc2\x37\x2a\x6a\xe1\xb3\xa8\x0e\x42\xb1\xac\x0c\x30\xd9\x5a\x15\x14\xc5\x5a\x56\x01\xda\xa2\x1c\x99\x92\x46\x3c\xcc\x47\x4e\xaa\xcc\x77\xb0\xfb\xa1\x6a\x94\x10\x60\xd7\x03\xe5\x7a\x86\x5b\xc9\x0b\xad\xea\xbd\x56\x17\x14\x03\xaf\xdc\x05\xcd\x10\x3f\x52\xf1\x8b\xdf\x45\xdd\x10\xcb\x65\xe5\x50\x50\xae\xb5\x43\x55\xae\x67\x18\x22\x2f\xca\x9b\x2d\x6a\x64\xc9\x7e\xe5\x7a\x80\x2d\x00\x75\x04\xac\x4a\x0d\x02\x6a\x09\x04\xd0\xc2\x76\x7b\x0d\x62\xe3\x3e\xc7\xae\x8c\x13\x0a\xbf\x47\x13\xf4\x4f\x2e\xab\xf8\x07\x50\x90\x62\xca\x9f\x49\xab\x01\x04\xaa\x13\x72\x89\xd0\x9f\x00\xae\xa8\xd8\x9a\x16\x68\xa8\xc8\xea\xaf\xe4\x92\xd6\xa8\x6e\x47\x3d\x44\xd4\x10\x3a\x89\xcb\x03\x09\x16\xb1\xa6\x39\xdc\x48\xe3\x8a\x05\xa5\xb5\x75\x85\x02\x66\xad\xad\xb6\xe2\xbb\x00\xcf\xaa\xbf\xad\x2e\x12\xb0\xa0\x11\x6c\xb7\x83\xa8\x5a\xa9\xa3\xa3\xb0\x05\x20\xab\x9c\x35\x80\x5b\xc3\x1b\x0c\x18\x44\x2b\x7d\x85\x5d\x91\xa5\xad\x6b\x94\x6c\x79\xe0\x4a\x54\xbd\x29\xdb\xa6\xcf\xe2\xa9\x61\x3b\x9a\xeb\xf5\x2e\x5b\x79\x5a\x40\x7e\x39\x8e\x23\xd1\x56\xef\x90\xe1\x7d\x96\x66\x7f\x05\xaf\xfe\xa1\x4a\xc1\x65\x2d\xb8\x4c\x04\xb1\xe5\x35\x91\x76\xb5\x41\x96\x14\x3a\x29\x40\x73\xa8\xe1\xc4\x34\x0a\xa3\x65\x97\xb9\x89\x0e\x5e\x79\x6e\x22\xc4\xa4\xd9\x49\x6d\x6f\x41\x3b\xab\x1b\xa9\xe0\x08\x65\x64\xdd\x55\xaf\x89\xfa\x1a\x2b\x74\x71\xb5\x58\xc4\x45\x71\xca\xfe\x80\x14\x7a\xe4\xce\xc7\x6e\x08\xd4\x47\x0a\xa0\xae\xa4\xe4\x00\x67\x0d\x2d\xe1\xb7\xfc\x4c\xf5\xe2\x46\x9f\x2b\xd2\x29\x34\x81\x14\x76\x61\x0c\xba\x56\xa1\x29\x36\xbb\x88\x67\x71\x55\x0a\x3d\x09\x16\x63\x17\x56\x68\x4a\x92\x5b\xf3\xb1\x34\x5b\x14\xda\x1b\x8f\xe6\xdd\x16\x5b\x84\x3a\xa4\xd0\x98\x98\xbc\xdc\xc2\x18\xd0\x32\x84\x70\x2f\xcc\x53\x0c\xff\xe2\x14\xc6\x36\xed\x33\x28\xf4\x32\xda\xae\xd9\x2d\x60\x7d\x5b\xaa\x29\x64\x5c\xb2\xa4\x14\xd2\xf8\x55\x18\x3a\xc1\x18\x62\x08\x17\x40\x7d\x4d\xe8\xcb\x0a\x4f\x0b\x24\x37\x20\x65\x40\x46\xa9\x4b\xb8\x31\xc2\xb4\x40\x18\x22\x5c\x09\x87\xc3\x36\x52\x40\xe2\x8b\x74\xe3\x0a\x93\x97\x3d\x2d\x84\x02\x3f\xde\x18\x5e\xf8\x02\xb6\x3e\xed\x40\x24\xd5\x09\xfb\x79\x5a\x19\x33\x3c\xd9\xaa\x98\xcf\x5c\x45\xaa\x51\xbb\x5a\x8d\xa6\x23\x57\xd3\x93\xd2\x86\x91\x32\xc0\x0e\x66\x96\x03\xf6\x3b\xc7\x42\xcb\x20\x5f\x8c\x3d\xb7\xe3\x8e\x0a\xd5\x0a\x8d\x71\x4c\x4b\x1a\xe3\x18\x01\x18\xe2\xa4\xa9\x72\x01\x69\x00\x80\x42\xc5\xc0\x0f\x7d\x46\x10\xb6\xb2\x44\xc0\x61\x85\x64\xab\x8b\x3e\x87\x25\x51\x9d\x5e\x35\xe6\xc3\x16\x97\xb7\x8a\x05\xaf\xbc\x93\xaa\xcf\xd6\x38\xb8\xe3\x9d\x07\xf5\x39\xa9\x51\xbb\xa4\x81\xe2\x23\x9e\x67\x1c\xe8\x0f\x97\xe4\xaa\x39\x90\x91\xcf\xb5\x3a\x9f\x71\xa8\xdc\xa5\x6d\xee\x6c\xd9\x18\x4a\x8d\xeb\xe2\xcf\x95\x9a\xd5\xee\xb2\x6e\xe3\x1c\x76\xae\x8a\x96\x55\xe6\xda\xd0\x19\x29\x73\xac\xf5\xb0\x1e\xe6\xa3\x6c\x71\x19\x4a\xc6\x5a\x6e\x95\xb1\xef\x4c\x6e\x57\x8b\x5f\xf0\xd8\x3e\x35\x5a\xb7\xa9\x6f\xad\x8f\xd7\x4b\xbd\xbd\x97\x5b\x79\x4c\xdf\xd0\x81\xbe\x05\xa9\x6f\x34\xce\x2d\xd9\x47\xd8\xd9\x5f\xf4\xef\xf7\x47\xd0\xa5\xbe\x6a\xae\x02\xf7\x77\xf2\xdc\x24\x82\x77\xd9\x01\x02\xb3\x11\x06\x55\x72\xa9\xde\x10\xb6\xcf\x4e\x9a\x4d\xa5\x04\x01\x6d\x2e\x75\xf6\x1e\x06\x81\x4f\x81\xd5\x5b\x55\x18\x44\x98\x3d\x5a\x24\xa4\x39\xf3\xd4\x6c\x6f\x0d\x4e\xff\x74\x1b\xe1\x36\x9e\x54\x87\x6f\xca\x2d\x73\xeb\xb1\x94\xc9\xd6\x5a\x67\xf5\xf1\xae\x5b\xcd\xb1\xf2\x40\x48\xbd\x25\x6f\x3f\x22\xe9\xb2\x77\xef\x68\xd1\x05\x1e\xcc\x4f\x4b\x78\x3c\xf5\x36\xde\xe0\x2c\x41\xed\x0a\x10\xa5\x07\xee\xfb\xb5\xde\x6d\x48\xc4\x0a\x87\xb3\xda\xc1\x00\xf6\xc3\xe7\xb3\xc0\x64\x1f\xa6\x34\xc0\x0a\x7f\x84\x1a\x01\x70\x58\x68\x0c\xb6\xca\xa3\xa1\x41\xe9\xe1\xf3\x00\x6c\x3c\x06\x55\xc9\x41\xe9\x02\x31\xb0\xf0\x4a\x27\x8a\x08\xa0\x72\xa6\x68\x98\x90\x20\x94\x5c\xa8\x1d\x33\x12\x04\xe0\xa0\xd1\x4d\x33\x20\x04\x38\xcb\xa8\x9d\x3d\x20\x04\xe4\xf4\xd1\x31\x02\x83\x80\x9c\x68\x5c\x48\x30\x88\x30\xdf\xe9\xb5\x45\x3d\xdd\xb5\x78\x9d\xda\x09\x68\xdc\x53\x06\xd3\x65\x9b\x1f\xcb\x80\x84\xce\xe3\xd5\x22\x15\xc5\x84\xab\x75\x8d\xb5\x21\x2b\x3d\x68\xad\x93\xb5\xde\xd1\xd6\x8a\x6e\xe2\x90\xd3\xcd\xf5\xd8\x57\xa7\x94\x95\x6a\xaa\xd7\xfb\xf1\x5a\xd1\xd5\xfe\xbe\xf6\x85\x42\x8b\x5f\xb0\x9d\x40\x17\x07\x62\xd7\xbd\x23\xd7\x06\xe3\x85\x06\x8f\xa6\xf4\x25\x1a\x2c\x33\x94\xde\x48\xa1\xe3\x94\xbe\x47\x0d\x13\x62\xe7\xaa\x2b\x51\x7b\x38\x45\x05\x80\xfc\x99\xba\xb5\x0e\xa4\x24\xf0\x3a\x46\xed\x35\x85\x14\x09\x74\x91\xea\x18\x01\xb5\x0d\xae\x47\xe3\x8b\x05\x55\xf2\xf3\x2d\xba\xd2\x64\xfb\xfe\xb4\xfe\x1b\xb0\x92\xe1\xe8\xf6\xf0\x9f\x22\xb2\xf2\xd4\x8f\x3f\x73\x33\x64\xcd\x80\x30\x2d\x32\xdf\x5b\x3c\x87\x15\x24\x3f\x77\xd4\xb8\x6d\xae\x3b\x84\xca\x18\xdb\x06\x51\x61\x61\x81\xa6\x8b\xae\x33\x44\x93\x35\x47\x0d\x51\xd9\x06\xc9\xdd\x02\x8c\x25\x44\x91\xd7\xa7\x9a\xa6\xad\xf8\xfe\x49\x95\x8b\x2f\x50\x34\x26\xd9\x5e\xc7\x79\x11\xd3\xd4\x8c\xd1\x6e\x67\xa5\xf1\x75\x9c\x0e\x68\xaa\x99\x32\xde\x30\xab\x6b\x02\x0e\xad\xaa\xe3\x28\x5e\xae\x1c\x23\x3d\xc4\xa0\x12\x13\x8c\x6e\xb5\x71\x03\xfa\xde\x09\x91\x5a\x71\xdb\x89\x08\x1e\xfa\xa6\x6d\x92\x73\x9e\x2d\x12\x34\x5d\xd1\x9a\x46\xd9\xdb\xf8\x10\x3d\xe2\x4d\x5d\xe2\xc8\x50\x55\x45\x06\x47\x6b\x45\x9c\x13\x9b\xa9\x46\xb7\x52\x71\x4e\xab\x7f\xb8\x35\xca\x4a\xe6\x80\x0e\xa5\x56\x16\x78\x8f\x33\xc3\x43\xcb\xd4\x1f\x4d\xe6\xe1\xbc\x53\xc4\x0b\xa1\x0e\x1d\x1e\x62\x62\xd2\xc4\x4f\x30\x98\xd1\xda\xd6\x1c\xd0\xcf\x8b\x25\x62\x4e\x44\xf2\x06\x37\x52\x91\x1c\xc1\x8c\xc0\x3e\xa3\x3f\x76\x63\x6a\x2f\x0a\xfc\x63\x9f\x72\x97\x41\xf1\xc5\x59\xf1\x36\xa8\x33\xf6\xf9\xeb\xa0\x61\xa8\xbd\x0f\xea\xa9\xee\x83\xe2\xfb\xbc\xea\xec\xc9\xcc\xcd\x5b\xc7\x19\xe2\x0b\xc2\xcc\xad\x41\xdb\xc7\xd7\x73\xd9\xb4\xc7\xdc\xb7\x1c\xe7\xd3\x1d\x31\x9f\x68\x56\x5e\x76\x32\xd8\x73\xe0\x42\x61\x37\xe3\xdb\xd0\x54\x59\xf8\x7b\x22\xee\xaa\xeb\x1f\xd4\xe0\x27\x1d\xac\xa1\x0a\x73\x4f\x6e\x36\xa3\xe6\xd2\x5c\xc2\xe8\x87\xfa\xca\x26\xba\x05\x5d\xdf\xd9\x04\xb8\x32\x36\xf4\x2a\x4c\x35\x57\xfc\xfd\xcf\x5a\x27\xf0\xdd\xd0\x26\xff\x76\xf3\x55\x1c\x63\x8b\x0c\x1c\x5b\xcc\xfd\x53\xf4\xb7\x3a\xa6\x6d\x99\x67\xbb\x65\x76\x53\x55\xb9\x5e\xa7\xc4\xb4\x35\x70\xb5\x07\xaf\x05\xae\x5e\x74\xb6\xc0\xd1\x75\xb2\x00\x76\x58\x68\xa6\x41\xbb\x84\x29\xd1\x04\x81\x9b\x5e\xdb\x25\xa2\xac\x41\x8d\xa0\xa8\x41\x25\x4b\x65\x0d\x6a\x04\x45\x0d\x8a\x5e\x50\x56\xa0\x84\x57\x44\x23\x19\xc8\x97\x5f\x36\xb4\x4b\x4b\x05\xaf\x6a\xbb\x0a\x5e\xd1\x14\x55\xa0\x93\x49\x4b\x98\x75\x89\x41\x3b\x40\x68\x65\x2b\x40\x68\x55\x1b\xba\x85\xf2\x9a\x34\x8d\x5d\xef\x18\xb4\x0d\x06\x57\x36\x0e\x06\x57\xb5\xee\xf3\x06\x15\x1b\x48\x4b\x30\xc5\x06\xe2\x55\x21\xa8\x04\xac\xac\x41\xd9\x23\x2a\x04\x55\x9f\x28\x6b\x50\x76\xa2\x0a\x41\xd1\x8d\xca\x0a\x54\xdd\xfe\xef\x8d\x2a\x93\x19\x6a\x18\xe0\x29\x2c\x16\x0b\x11\x03\xef\x8c\xb5\x53\xdb\x01\x4e\x8f\xb6\x8a\x94\xd6\x5b\x01\xad\x76\x79\xb4\xe1\x6a\x5c\x1e\xad\xa8\xbd\x9c\x1e\xad\x54\x35\x5e\x8f\x36\x5c\xa5\x42\xc2\x35\x7d\x4e\x9f\x07\x3b\xe0\xf1\x02\x13\x7f\xa9\xb3\xec\x3c\x92\x97\x5f\x6d\x4b\xd4\x86\xa6\x11\xc1\x7f\xe3\x5e\x88\x3e\x90\x83\xf7\x63\xf4\x97\x85\xb3\x1e\xe1\x8f\xe8\x79\x1d\xe6\xaf\x4c\xe1\xbe\xa6\xc7\x53\x1a\xe0\x87\x8e\x20\x7a\xb4\xa8\xa6\xca\x7d\x90\x00\x85\x2d\x5a\x2a\xbf\x65\x23\xb6\xe9\x4c\x78\x95\x89\x67\x0c\x7a\x1b\xe8\x21\xaa\xa9\x7e\x62\xca\x1c\x01\x3d\x45\x05\xb7\xb2\x4b\x3d\xa6\x78\xf8\xe5\x2b\x92\xd0\x8a\x28\x6c\x23\x46\xe9\x41\x24\xb1\x3a\x03\x50\xd2\x20\xa9\x2b\xcc\x68\x1b\x61\x40\x8d\x68\x15\xf8\x0c\xfd\x2d\x5e\x3e\x14\xf4\xca\x10\xe1\x51\xb3\x44\xef\x8c\x59\x9b\x7b\xd3\xde\x52\xf1\xda\x0d\x0f\x60\xb9\x2b\x01\xba\x0d\x6e\xdb\xe0\xa1\x8d\x6b\xa7\xd1\xbb\x67\x5d\x23\x2c\x26\xb6\x9a\xf5\x1d\xc9\xae\x5d\xd9\x19\x5d\xd1\xb1\x3d\xe8\x48\xdd\x6c\xb3\x41\x99\xfd\x5a\x62\x88\xa9\x6b\x84\x31\x09\x35\xff\xf4\xbc\xab\x57\x13\xcc\x91\x75\xad\xe8\x42\x45\xdd\x10\xf1\x6e\x71\xaf\x06\x75\x27\xa2\x6b\x58\x1f\x6a\xea\x06\xca\x97\x9e\x0f\x1b\x40\x47\x6a\x64\x3f\x7a\xad\x0a\x59\x6f\xd8\x0e\x51\xcc\x0e\x44\x0c\x14\xb4\x13\xb5\xf6\x06\x1e\x68\x08\xfb\x90\x31\x69\xe4\x31\x0d\xe3\x61\x9a\xda\x91\x42\x9b\xa1\x3c\xb2\x7e\xf6\x37\xfc\x1d\x29\x98\x74\x5a\xff\x89\x80\x99\xbd\x0f\x98\x9e\x0f\xa1\xa2\x5f\xcb\x1c\x63\xb2\x16\xc9\x75\xee\xba\x9e\x04\x0c\x5a\x76\xbc\x8e\xeb\x33\xd4\xfa\xd3\x30\x68\xda\x41\xc3\x4d\x24\x76\xc8\xec\x7e\x38\x2d\x83\xd6\x1e\x65\xae\x57\xea\xfd\x51\xda\x7d\xa4\x99\xff\x38\x64\x4d\xf5\xb9\xd7\x3a\xe0\x70\x5a\xe6\xfa\x7d\xd8\xaa\x40\x45\xf4\x38\x66\xf8\x48\x6b\x84\xe3\x90\x35\x32\xcb\x47\x51\xf4\xc3\x17\x0e\x07\x53\x34\xee\xe8\x83\xe7\xa2\xc3\x57\x13\x07\x53\xec\xed\x4a\x60\x2d\xe7\x41\x1b\xb6\xe3\x6c\xd4\x8e\x3a\x55\x1d\x63\x8a\x3a\xea\xd4\x74\x60\x57\x3a\xce\xd8\x8b\x7c\x7d\x57\xd2\x23\xb0\x7e\x1b\x53\x63\x64\xed\x76\xb4\x03\x95\xf6\xf9\xb7\x47\x7b\xfa\xd3\x30\x99\x6b\xbb\xb7\xce\x2c\x0b\x8f\x24\x47\x72\xf2\xd6\xab\x27\x8d\x71\x75\x1d\xd9\x81\x88\x7a\xb3\x46\x4f\x4c\x7b\x35\xc3\x1c\x59\xd7\x8e\x2e\x54\x5a\x15\xb2\x47\xaf\xf4\x26\x61\xa0\x8e\x87\xf4\x91\x48\xab\x4f\x57\xf5\xa7\x61\xd0\xb8\x1e\x1d\x07\x8c\x35\x9c\x65\x46\x3f\xd6\xd0\x29\x67\x2f\x15\x35\xc4\xd4\xe9\xa7\x31\x89\xd6\x1e\xec\xdc\x8c\x9e\x04\x0c\xfa\xae\x6b\xa3\x8c\x0e\xc3\xe9\x11\xbb\x24\x42\x1a\x54\x6b\xd2\x76\xed\x59\x30\x4b\xb9\xaf\xcf\xcc\x94\x95\x47\x86\x81\x9d\x1d\x79\xd2\x7b\xe1\xcc\x99\x33\x8b\xef\xec\xcc\x9c\xc1\x26\xe4\xc8\x7d\x79\x84\x03\xc1\x4f\xdc\xb3\xc7\x3c\x7a\xfc\xc4\xfd\x7c\xb4\x43\x4e\xe0\x0a\x65\xc8\xdf\x4f\xd0\x9c\x87\x8b\x5d\x66\x0c\xca\xc8\xae\x03\x4e\x2d\xa2\x2f\x8e\x25\xb3\x1d\x1f\x1c\xcb\x61\xc3\xe7\xc5\x75\x99\xad\x74\xfc\xb6\xb4\xb8\x1b\x22\xd4\xfe\xae\x14\xe4\x0e\xb2\x21\xdf\xae\x09\xdf\x26\x38\x4a\x96\xcd\x90\x15\xdc\x02\xde\x0d\x13\x86\x0d\xd1\x94\x3c\x1b\xe3\x2b\xd8\xd6\xf8\x5d\x4d\xd8\xef\x88\xae\x6c\x46\x67\x3a\x8a\xe6\x68\x9d\xa9\x9d\x14\xff\xe0\x26\xf5\xa0\xa4\x57\x2d\xc8\x11\xd1\x41\xc5\x4c\xd1\xdb\x54\xcd\x9c\x4e\x4b\x73\x7a\x1b\xa7\xce\x04\x5a\x9b\x74\x1c\x63\xd5\x57\xe7\xba\xe0\x6a\x8d\xd7\xd1\x34\xad\x8f\xe9\xed\x82\xdb\xda\x21\x07\x99\xe2\xaf\xb3\xde\xd7\x59\xef\xeb\xac\xf7\x75\xd6\xfb\x3a\xeb\x7d\x9d\xf5\xfe\xef\xce\x7a\x1d\x37\x8f\xb6\xe2\x28\xab\x83\xbd\x3b\xd4\xce\x1d\x6a\xae\xbf\x74\xb6\xcd\x4e\xfd\x04\x7b\x29\x9f\x48\x19\x19\x6c\x33\x34\xb5\x99\x36\xc5\x57\xcd\x38\xff\x19\x6c\x9b\x1d\xde\xf1\x75\xc8\x87\x32\x26\x2d\x33\xc3\x52\x36\xcc\x14\x5d\xd1\x1d\xc0\x59\x8b\x09\xd3\x86\x68\x4a\xae\x8d\xf1\x15\x6c\x7f\x15\xf5\x27\x13\xb5\xd9\x51\x1a\x38\xba\x7a\x2f\x22\xbb\xa1\xb7\x0d\xf2\xa3\x4d\xeb\x3d\x6d\x55\x47\xf4\xf6\xd5\xd6\x71\x4c\xee\xd7\xde\xf9\x22\x7a\x07\x18\x5f\xfc\x13\x55\xc0\x5c\x2f\x24\xeb\xeb\x65\xf6\x0e\xee\xbf\xae\x64\x5a\xba\xaf\x9f\x09\xef\x86\xdd\xda\x79\xc7\x31\xe9\x7d\x3b\xa6\x23\x7a\x9b\x89\x3f\x5a\xd7\xf4\x9c\xa9\x3a\xa2\xb7\x76\xce\x71\x16\x09\x5f\x47\xcd\xd7\x51\xf3\x75\xd4\x74\x9a\x8f\xf8\x07\xe4\x80\xf9\x48\x8c\xf2\x31\x69\xa7\x09\x8e\xb2\x71\x66\xc8\x8a\x0e\xfa\xb2\xb9\xed\x14\x01\xc5\xd7\x03\x84\x7b\xc0\x6d\xd3\x86\x78\xd4\x34\xbb\xfb\xe1\x8c\xaa\x37\x8d\x8a\x31\xe6\x43\xe3\xd3\x33\x64\xc8\x2c\xf6\xa5\x03\x43\x4a\x2f\xa7\x61\x07\x1d\x2a\xd8\xc3\xe4\xd0\x27\x4a\x67\x4e\xd3\xa5\xd4\x99\x40\x70\x84\x90\xb5\x4a\xe3\x5b\x20\xdd\x22\x83\x81\xb2\xef\xd0\xd4\x2a\xca\x94\x41\x65\xb6\x43\xb9\x19\xad\x8a\xf5\xab\x62\xe6\xd0\x74\x31\x38\xaf\x23\x5c\x56\x21\xa1\x4a\x55\x58\x7c\xa1\x8a\xa9\x59\x1a\x15\xa5\xb5\xb8\x4c\xd2\xa5\x96\x3f\x8e\x1a\xc9\x07\xa3\xa9\x0f\x43\xb0\x95\xda\x4d\x02\xcb\x99\x73\x76\x1d\xe7\x65\xb2\x88\x52\x2b\x4a\x93\xf5\x76\x56\x66\xbb\x33\x9a\x8b\x66\x76\x99\x2c\x97\xf1\x56\xc4\x25\x71\x3c\x34\x99\x0c\xcd\x89\xc9\x42\xc8\x4a\xb0\xca\x16\x57\xc5\xa9\x06\x0e\x69\x09\x8a\xea\x42\xa0\x7b\xeb\x26\x9e\xbf\x4f\xd0\x38\x89\xa3\x3c\xda\x2e\x62\x94\x20\xe4\x4c\xfc\x4d\xf3\xfe\xb8\x67\x65\xb6\x9b\x35\x39\x6e\x1c\x67\xc8\x26\xf1\xe4\xf2\x93\x39\x03\xdb\xab\xa4\x32\xf8\x47\xe8\x2e\xe6\x71\xac\x28\xe5\x93\x97\xe1\x3c\x3d\x88\x39\x3a\xef\x9d\x52\x02\x27\x75\xe2\x19\x2c\xee\x8a\x06\xfe\x0b\xdf\x41\x24\x0b\xa5\xc3\x7e\x2b\xca\xbb\x34\x9e\x15\x59\x9a\x2c\x85\x94\x59\x98\xb6\xa9\x70\x67\x33\x6b\x53\x58\x48\x8c\x1d\xe4\xcc\x60\xd5\x83\x4a\x48\x7f\xd4\x24\xd6\x9c\xad\x92\x9c\xea\xe8\x49\xaf\x31\x03\x93\x6d\x34\xff\x44\xa9\xe9\xe6\x83\xca\x2e\xb3\x2c\x2d\x93\x9d\xcc\x32\x97\x87\xba\x3f\xdf\x1c\x7d\x86\x77\x89\x7c\xbf\x06\xd8\xac\x37\x5f\x5f\x99\x32\xef\x1d\x24\x5a\x65\x0a\xbb\x4e\x55\x70\x2f\x0c\xb5\x55\x41\x53\xcc\x75\xaa\x81\xcd\xec\xdf\x56\x41\x9d\x24\xaf\x53\x0d\x5c\xc2\x7e\x49\x03\x6b\xd3\xc8\x4f\x28\x8e\x60\x47\x79\x81\xd7\x06\x7b\x13\x6f\xaf\xf4\x82\x6b\x07\x95\x32\xf3\x29\x21\xe5\x24\x81\x35\x68\xdd\x0e\x86\xe7\x47\xcd\x5f\xeb\x8c\x63\xfb\x5d\x56\x24\x65\x92\x6d\x67\x79\x9c\x46\x65\x72\x1d\xb7\x20\x30\xc2\x92\x87\x18\x42\x60\xbf\xd0\xf1\x00\x4e\x58\x7d\xc7\x60\x1b\x5b\x4c\xfd\x66\x0c\x89\x76\xe9\x21\x3b\x94\x51\xb6\x66\xc9\x28\x9a\x59\x19\x18\x97\xd6\x20\x34\xa1\x15\xb3\x59\xe9\x4b\x2b\x04\x29\x57\x71\x83\x50\x2d\xb7\x9a\x2c\xd2\xcd\xe3\x10\x2d\x28\x3a\xa0\x81\x4d\xd7\x81\x56\x99\x94\x69\xcc\xcd\x1d\x67\x65\x7c\x5b\x5a\x4d\xba\x67\xa9\xf9\x22\xef\x5c\x5e\x37\x18\x12\xa9\x35\x90\x6f\x51\x02\xa1\x49\x16\x95\x93\x99\x30\x52\x14\xed\xc0\x0b\xcb\xe6\xfa\x07\x59\xee\x42\x83\x85\x82\x80\xb3\xec\x29\x58\x8c\xe7\x6d\x42\x53\x81\x27\x95\x61\xa4\x86\x83\x68\x5e\x64\xe9\x55\x19\x93\x85\x0f\xce\x29\x4e\xd7\x3f\x0e\x59\xfc\x38\xf5\x02\xc9\xb9\xb7\x17\x51\xbe\xb4\x56\x59\x56\x56\xc6\x85\x56\x65\xb3\x59\xbe\x58\x80\x66\x2b\x82\x17\x7c\xa9\x9c\x88\xf0\x9e\x97\x26\x12\xe6\xfc\xaa\x2c\x33\xaa\xd9\xd5\xd7\xfd\x75\x52\x24\xf3\x24\xad\x98\x40\x7f\x4d\xe3\x7b\x0c\x64\x2f\xd2\xac\x88\x9b\xc4\x81\x42\xba\x3e\x26\x91\x63\xb5\x2c\x23\xb6\x61\xe6\x9c\x29\xd6\x86\xf7\x84\xde\x2a\xcd\xa2\x72\x86\xcc\x36\x93\x13\xd1\xb5\x27\x75\x16\x72\x2c\x40\xb4\xcc\x1a\x54\xcd\x8a\xf2\x81\xed\x15\x5c\xbe\x44\xcf\x71\xb0\x1e\x33\x39\x21\xc1\x94\x83\xf4\xbc\xca\x5f\xac\x96\x21\x61\x81\xd1\x54\xf2\x9b\xaa\xe5\x2a\x49\x53\x01\x98\xae\x8d\xf1\x0f\x92\x7f\x18\xff\x20\x59\x36\x9b\x35\x2e\x77\x21\xb7\x41\x16\xeb\xa3\x5f\x9b\xcb\x1b\x0d\x6d\x09\x96\x7c\x15\x60\x71\xd5\x12\x30\xfd\xcc\xb7\x47\xe4\x67\x4f\x16\xc8\xb3\xe7\xc9\xfa\x32\xad\xc4\x35\x40\x0b\x5c\x9c\x19\xf8\x8c\x96\xd2\x7e\xc4\x8b\xea\x3c\xd9\xae\xf1\xd2\x17\x02\xb6\xb2\xd5\xaa\x88\x9b\x79\x98\x6c\x9a\x2b\x1e\xf8\xb4\x96\x64\xd1\x8f\x7f\xb0\xf9\xf6\x2d\x32\xf7\x70\x19\xdf\x3d\x81\x98\x75\x93\x57\x5a\x95\xef\xab\x2d\x25\xda\x0c\xb8\x78\x37\x70\x86\xf6\x47\x56\x11\xa7\xab\x59\x51\x46\x79\x9d\x6b\x12\x3f\x02\x80\x97\xf4\x34\xb3\xfc\x94\xa5\x5a\xc6\x1b\x4c\xcd\x1d\xb8\x83\xe8\xaa\xcc\xce\xa8\x91\x41\xdb\xd6\xea\x3f\xa8\xd6\xd9\x36\xab\xfe\x38\xab\x2c\x2e\x4b\x08\x7a\x5b\x80\x25\xce\x4c\x7c\x7b\x1e\xd4\x61\xc1\x0a\x81\x09\x54\x2f\x9a\x38\x17\x59\x7a\xb5\xd9\x0e\x48\xf5\xf5\x4e\x06\xef\x5f\x70\x26\x51\x96\x63\x96\xe8\xa3\x62\x17\xd5\x2e\x8d\x6a\xb8\x88\x3b\x73\x9c\xaa\x13\xd5\xb5\xce\xb3\x9b\x99\x8b\xff\x5e\x5c\xe6\xc9\xf6\x3d\xfd\x35\x8f\x8a\xa4\x98\x4d\x27\xec\x5b\x0b\xf8\x97\xf4\x80\x02\x1a\x92\x78\xab\x5a\x75\x2a\xe1\x65\xcf\xa4\x3e\x1d\x41\x19\x52\xb7\x59\xbe\x89\x52\x6e\xfc\x62\xd9\x4a\xf6\x1c\xef\x05\x93\x8f\x15\x56\xbd\x18\xb9\x05\xba\x6c\x99\xe4\xf1\x02\xa3\x66\x37\x44\xeb\x90\x60\xc1\x05\x8f\xf4\x60\x04\x63\xdb\xfe\xe1\xac\xc2\x78\xe2\x9c\x09\x2f\xe3\x60\x6b\x87\x35\x6b\x00\xec\x0f\xb9\xe7\x1c\x90\x18\x06\xec\xa8\x10\xde\x80\xe1\x00\x22\xc4\x38\xb3\x16\x95\xe7\x64\x5d\x22\x67\x90\xda\x29\xfd\xa8\xa6\x04\xe2\xe1\x65\x2d\x8c\x6b\x03\xaf\x71\x6a\xc8\x50\x4b\xaa\x2a\x66\xdf\xbd\x01\x8a\xb9\x47\x69\x40\x5e\x84\x0a\x20\x08\xbe\x0e\x08\xa2\x4e\x9d\x6c\xdc\x2c\x03\xc6\xc0\x5c\xed\x4e\x58\x27\x6b\x5f\xad\x56\x34\xb7\x3a\x50\x8b\x46\x70\x1a\xa1\xb5\xf0\xa5\x17\x96\x5e\x50\xb4\x3d\x6c\xce\x67\x59\x50\x78\xba\x67\x60\xea\x89\x92\x07\x11\x1f\x10\x19\xc0\xb3\xb2\x44\x5a\x68\x01\x37\x41\x73\xdf\x64\x6e\x45\x4e\xe8\xc8\xdc\xae\xb2\xfd\xa7\x18\xfa\x0c\xfd\x56\x2b\x00\xc0\x1e\xc7\x20\x28\x09\x9f\x02\xe5\xad\x66\x42\x49\x8d\xb1\x18\x3a\x8a\x5a\xe3\xa1\x25\xce\xf5\xbb\x1e\x92\xd5\x06\x3d\x24\x37\x58\xda\xf8\x56\x73\xd0\x66\x73\x5a\x81\x5b\xcc\xcf\x31\x1b\xd1\xd5\x28\x29\xeb\x36\xeb\x10\xb3\xce\x30\x6f\x83\x71\x27\x18\x77\x80\x89\x59\xe3\xf0\x5b\x2d\x9c\x0c\x2d\x1a\x3b\x08\x42\x65\xf7\x64\x58\xb5\x0c\x64\x6b\x08\x14\x1b\x1b\x46\xe2\x1d\xe3\x6c\xa3\xe7\x84\xa1\xe7\x1d\xcd\x36\xd6\x0e\x38\x33\xf3\x28\x80\x1f\xd5\x42\x82\xb4\x4f\x61\x10\x53\x3b\x09\xd2\x94\x4d\xa5\xf2\xa5\x13\x03\x6b\xa9\xac\x02\xd2\x12\x35\x30\xa0\x33\x6a\x60\x68\xb4\xea\xda\xa0\x65\xc5\xd0\x78\x6a\xe1\xcd\xec\xe7\x11\x1b\xd4\xd3\x8a\x82\x1c\x18\x77\x94\x71\x27\x75\x6a\x4f\x97\xce\xe9\xd2\x31\x1d\xec\x6a\x4d\xc2\xd4\xb4\xf2\x08\x0a\xeb\x2a\x02\xb5\x18\x58\x1e\x5c\x2b\x15\xa5\x99\x15\x20\x8c\x2d\x2d\x39\x32\xe0\x2c\xed\xc4\x1d\x8d\x9d\xe9\xd1\x2c\x6d\x7d\x2a\x61\x66\x69\x05\xf0\xa3\x5a\x5a\x90\xf6\x29\x0c\x62\x6a\x69\x41\x9a\xb2\xa5\x55\xbe\xf8\x64\x60\x69\x95\x55\x40\xba\xa2\x06\x06\xd4\x46\x0d\x0c\x0d\x64\x5d\x1b\xb4\xac\x18\x5a\x5a\x2d\xbc\x99\xa5\x3d\x62\x83\x7a\x5a\x5a\x90\x03\xe3\x8e\x32\xee\xa4\x4e\xed\xe9\xd2\x39\x5d\x3a\xa6\x83\xa5\xad\x49\x98\x5a\x5a\x1e\x41\x61\x69\x45\xa0\x16\x4b\xcb\x83\x6b\xa5\xa2\xb4\xb4\x02\x84\xb1\xa5\xc5\xc7\xb8\xbc\xa1\x1d\x79\x4b\xdf\x3d\x9a\xa1\xa5\x07\xc5\x66\x76\x96\x87\x3e\xaa\x99\x85\x48\x9f\x82\x10\xa6\x46\x16\xa2\x28\xdb\x58\xd5\x9b\x77\x06\x26\x56\x55\x01\xa4\x23\x4a\x58\x40\x5b\x94\xb0\xd0\xf0\xd5\xf0\xaf\xe3\xc3\xd0\xba\xea\xc0\xcd\x8c\xeb\xd1\x1a\xd3\xd3\xb4\x42\xf5\x9b\x76\x90\x69\xe7\x74\x69\x4b\x87\x4e\xe9\xd0\x21\x1d\x8c\x2a\xa5\x60\x6a\x53\x39\x78\x85\x49\x15\x60\x5a\x2c\x2a\x07\xad\x93\x87\xd2\x9e\xf2\x00\xed\xe6\x54\xc8\x0e\x47\xf9\xe3\xce\x71\x48\x64\xdd\x54\x7e\x77\x9b\x39\x2e\x83\x09\x3d\x24\x5f\xd1\xf1\x15\x3d\xd4\xa3\x2f\x74\x1b\xe2\xd1\xd7\xcf\x84\xc7\xcc\x38\x6c\x62\x70\x9b\x93\x45\x74\x5a\x74\x73\x99\x94\x31\x3a\xa7\x8a\xc9\x01\x60\xdb\x59\x0d\x70\xde\x87\x9b\x4a\xdf\xaf\xd6\xa3\xe3\x03\x49\x22\xee\x68\x31\x8f\x16\x3e\xfb\x72\xe0\x18\x9d\x9e\x71\x47\xfd\x9e\xf2\x40\x0d\x3e\x4c\x50\x44\x54\xf1\x91\xb9\x00\xa2\xf2\x04\x09\x1d\xfa\x2d\xe3\x45\x96\x47\xa8\x82\xab\xed\x32\xce\x71\x7c\x06\x40\x66\x40\x82\x0b\xc4\x41\x46\x9f\x06\x3f\xd9\x0b\x71\x05\x42\xd4\x01\x27\x9a\x7b\x05\x4f\x0c\x35\xf0\xc4\x53\x11\xba\x20\x1c\x5d\x70\x67\xd5\xfc\xeb\x86\xb5\xf4\x51\xd4\x02\x73\x1a\x1d\xa0\x43\x71\x44\xce\x75\x9c\xfa\x14\x9a\x08\xd7\x63\x85\x6b\x76\xf8\xc1\xbf\x80\xce\x9e\x63\xd3\xe7\x26\x29\x9b\x6e\x28\x51\xff\x5f\x66\x68\x3c\x12\x14\x5d\x60\x6d\xd4\x05\x99\xff\xa9\x54\x79\x96\x68\x13\x52\xdf\x84\xf0\xd5\x21\x23\xfc\xa1\xac\x53\xc7\x38\x5b\x77\xe4\xd0\x96\x59\xa4\x49\x6f\x9e\xf7\x59\xa1\x01\x01\xfe\xe2\xbb\xdd\x0a\x38\xf3\x85\x59\xc3\x9a\x65\x4c\x17\xb8\x7f\xa0\xa6\xde\x42\x8b\x59\x8f\x69\xe8\x01\x8b\x31\x33\xd2\xdc\xe4\xa2\x05\x64\x27\x19\x2d\x20\x37\xd5\xb7\xf0\xac\xac\xbe\x6d\xf5\xd5\x06\x0b\x2e\xbd\x0c\x45\xd2\xa9\x01\x6d\x8b\x2e\xc7\x71\xb8\x45\x97\xaa\x66\xa3\x8e\x30\xea\x04\x63\xfe\x4d\x85\x6f\x2a\x78\x61\x99\xe1\x08\xa9\x05\x24\x74\x6e\x7d\x55\x41\xd7\xef\x0b\x4f\x54\xd0\xa2\xa1\x05\x00\xf8\xa5\x95\xa6\x66\x65\xf3\xe5\x45\x95\x5c\x2a\x37\x55\x5c\x51\x35\x38\xd4\x36\x89\xe7\xd2\x47\xb6\x81\x4c\x35\xa6\xe6\x10\x40\x39\xb6\x65\x54\x56\x21\x89\x96\x83\xec\x60\x2f\x95\x35\x80\xa6\x53\x57\x8b\xa1\x15\xd5\x56\xa8\xd0\x2a\x3d\x0e\xac\x6b\x7a\x1c\xc5\x28\x6f\x6b\x9f\x09\x7f\xe6\xc6\xb7\x15\xcd\xd8\x0e\x7f\x9a\xc6\xf6\xb7\xce\x4a\x7e\xba\x76\x70\xd7\xce\xed\xd3\xd6\x1e\x9d\xda\xa3\x43\xbb\xd9\x77\x8e\x52\x17\x53\x2f\x23\xaa\xad\x3e\x04\xdb\x3e\x01\xc8\x58\x26\x02\xd4\x4d\x0b\x00\x60\x8f\x19\x02\x70\x66\xf2\x57\xb6\x8f\x35\x47\xa8\x7d\x9a\x1a\x71\xf5\x75\x6d\x76\x9a\x27\x34\x4e\x4e\x25\x6c\xf7\xb9\xa2\xc5\xf1\x69\x5a\x53\xb7\xf9\xc2\xc8\x19\x6a\x8e\xa5\x55\x44\x33\x9f\x62\x97\x76\x9a\x71\xd9\x79\xe6\xe8\xec\x3e\xed\x23\xe0\xfe\x8d\x3e\x78\xfe\x68\x75\xae\x9a\x61\x74\xee\xec\x7e\x6d\xee\xd5\xc9\xbd\x3a\xb8\xd7\x5c\x02\x3a\x66\xcd\x66\x13\xad\x8f\xb6\x0d\xda\x78\x46\x51\xfb\x6d\x5b\x40\x8d\x44\xd8\x7b\x5e\x81\xc2\x11\x56\xcb\xa5\xe3\x4c\x8e\x3d\xb1\x68\xa2\x12\x34\x62\xeb\x1d\x9c\xd0\x69\x6a\xd1\x85\x29\xa8\x81\xbb\x4f\x2e\x6d\xa1\x0b\xc6\x75\x75\x9b\x5e\xcc\xc2\x19\x3a\xa0\x69\x75\xd2\x30\x22\xa0\x53\x5b\x0d\x19\xed\x3c\xc7\x74\x0f\x80\xe8\x25\xe6\x03\x1a\x7e\xf0\x34\xd3\x1e\x1e\x61\x88\xd2\xbd\xd3\x7b\xb6\xbb\x5f\x67\xf7\xeb\xe8\x5e\x93\x0d\x1c\x5a\x61\x36\xdb\xe8\xa3\x2c\x5a\xc1\x8d\xe7\x1b\x4d\xe4\x45\x1b\xac\x99\x20\x7b\x4f\x39\x50\xac\xb1\xbf\x98\x84\x9c\xe8\xc5\x23\x1b\x15\x95\x8e\xd3\x49\xef\xa8\xe2\x4e\xd3\x89\x2e\xbe\x58\x0d\xdc\x7d\x3a\x69\x8b\x39\x36\xae\xab\xdb\x74\x62\x16\x87\xdc\x01\x4d\xab\x70\x86\xa1\xbc\x9d\xda\x6a\xc8\x68\xe7\xe9\xa4\x7b\xe4\x72\x2f\x31\x1f\xd0\xf0\x83\xa7\x93\xf6\xb8\x66\x43\x94\xee\x9d\xde\xb3\xdd\xfd\x3a\xbb\x5f\x47\xf7\x9a\x4e\xe0\x98\x68\xb3\xe9\x44\x1f\x1e\xdd\x0a\x6e\x3c\x9d\x68\x42\xa6\xdb\x60\xcd\x04\xd9\x7d\x3a\x61\xc3\x42\x9a\xd3\xee\xe6\x8a\x2f\xfd\x02\x5d\xdc\x06\x89\xec\xdf\x5d\x15\x65\xb2\xba\xb3\x68\x14\xc9\x22\x46\x11\x09\xf8\xea\x39\xaa\x86\x7e\x62\x2e\x89\xbb\xdc\x25\x76\x90\xb0\x98\x10\x46\x03\xca\xdd\xe8\x96\x20\x50\x8c\x0c\x09\x46\x70\x07\x38\xf7\x97\x8a\x18\x7b\x9b\x9e\xbd\xfe\xcc\x46\x11\xc8\x47\x6e\x7c\xdc\x83\x94\x8a\x0c\xc6\xea\x70\xf4\xc6\xdf\xfe\x57\xb0\xa2\x9d\x36\xdb\xe3\x53\x98\xe0\x1f\xab\xd8\xb0\x97\xd3\x43\xd3\xcb\xe9\x13\x86\xb1\x62\x03\x6a\x1a\xcd\x35\xc6\xb7\x82\x07\xde\x03\x49\x0a\x84\x74\x02\x9e\x12\xd9\x20\xb1\x00\x83\xc0\x76\x37\x5b\x6b\x9d\x92\x44\xd5\x26\xa6\x57\x48\x9e\x06\x4f\x9b\xa6\x81\x67\x92\xd3\xd7\xa6\x08\x29\xaa\x32\x10\x0c\x01\x72\xc9\x47\x08\x90\xc3\x46\xda\x78\x5c\x28\x8c\x07\x07\x46\x49\x14\x25\x5d\x64\x4a\xd4\x4a\x78\x26\x44\x72\x71\xf9\x24\x5c\x26\x08\x47\xe6\x02\x27\xc4\xf8\xef\x4d\xbc\x4c\xa2\x41\xb1\xc8\xe3\x78\x3b\x88\xb6\xcb\xc1\x83\x26\x99\xc2\x78\x34\xd9\xdd\x9e\xec\x31\x43\x9c\x7e\x34\xd9\x27\x80\xd0\x33\x59\x88\x0e\x9b\xa1\xa1\xce\xb0\x57\xfd\x8d\x4d\xe4\x50\x5b\x05\x30\xf4\xcd\xad\x84\xeb\x38\x43\x3e\x81\x06\x8e\x34\xe2\xc2\xef\x38\x01\x17\xd6\x2e\x5a\x1b\x5a\x12\xbe\x52\x56\xb7\x3c\x32\x58\x28\x12\x36\x2b\x42\xb2\xa0\x45\x94\x2f\x09\x11\x6a\x33\x91\xf2\x0c\x9c\x7b\x7b\x93\x2d\x23\x5a\xc3\x43\xfc\xcb\xba\x8c\xa3\x65\x35\xc1\xa8\xcb\x2c\x2b\x42\xb3\x4c\x32\x4f\x63\xae\x05\x4c\xf8\x52\x41\xbb\x45\xba\x22\xee\x84\xa3\x71\x24\x40\x01\xc7\x31\xd3\xa9\x3b\xae\xe7\xcf\x82\xdf\x2d\xf1\x41\xe8\xab\x30\x92\x00\xc1\x0b\x98\x61\xe8\x35\x80\xa4\x03\x98\x40\x4d\xc3\xac\x1b\x38\x1f\x4f\x25\x7f\x7e\xda\x9a\x08\x09\x3d\xc8\xd4\x46\x54\x16\xe8\x7c\x92\x5b\x48\x99\x1b\xd2\xda\x64\x1f\x81\x8f\x85\xfc\x2d\x93\x3e\xd5\x21\x63\x4d\x36\x22\x65\xf0\x18\xb3\x78\x45\xb8\x62\x3c\x21\x13\xc6\xcb\x85\x16\xd2\xb4\x47\x50\x9b\x04\x48\x08\x46\xb4\x2c\x62\x29\xb5\x2e\x52\xec\x30\x05\xac\x96\x15\x79\x96\xee\xb9\x64\x26\x52\x66\x12\x65\x44\x2a\x26\x63\x55\x33\x1f\x37\xa8\xb8\xc4\x3b\xbe\x6f\xfb\xfe\x90\xc7\xb8\xda\xf1\x56\xa4\x0d\x21\xc7\x96\x87\x2f\xaf\x46\xa5\xb0\x6d\x70\x99\x6d\x43\xec\x8e\xdc\x39\x9c\x7b\xa5\x57\xf2\x4d\x4c\x10\x57\x6b\x2f\xd2\x64\xf1\x3e\x9a\xd3\x45\xb9\x9a\x0d\x77\x3c\x9d\x2f\xfd\x7e\x35\x12\x5c\x21\x1a\x15\x5a\x5b\x9c\x35\xb9\xd5\xd0\xdf\xd2\xa8\x8c\xdf\x3c\xc0\xe1\xbf\x27\x6c\x86\x2b\x5c\xc1\xc0\xf6\x8a\x41\x1c\x15\xf1\x69\x8d\x57\x7f\x22\x49\xc1\x50\xcc\xe9\x00\xff\x7d\x99\x5c\x27\xc8\x9e\x61\x3b\x88\xbe\xa1\xe4\x68\xfc\x97\xf8\xb6\xe4\x3e\xa0\xf9\x07\x13\xa2\xdf\xd3\xa4\x28\xd9\xbf\x5b\x57\x5b\xd4\xfc\x25\x6b\x03\x1d\x71\x41\x82\x6d\xa2\x8a\x2d\x66\x51\x22\x73\xa8\x2c\x8c\x6f\x4b\x55\x19\xc3\x37\x00\x52\xb1\xad\xf8\x5c\xb7\x46\xbb\x4e\xc2\xfa\x53\x55\x94\x6c\xd6\x8f\x92\xcd\x1a\x93\x78\x54\x7f\x63\x73\x07\x32\x94\x1a\x50\x8a\xb8\x07\x03\x84\x71\x10\x79\x93\xe8\xb6\x99\x9f\xf1\xea\x1c\x0d\x1b\x39\xcb\x11\x4f\x4b\x4e\xc7\xee\xb9\xbe\xef\xcf\x79\xc2\x75\x97\xd1\x89\x19\xcb\x82\x26\x15\x64\x53\x05\x36\x56\x54\x1c\x41\xc4\x3a\x91\xec\x69\xf7\x44\x18\x8d\xa6\x3c\x12\x34\xa5\x5e\xec\x8e\xd0\x5a\x77\xca\x54\x8c\x00\x71\x3e\x68\x3e\x6c\x5f\xd0\x28\xe7\x0c\x41\xe2\x91\xc7\x4e\xf1\x0d\x01\x6e\xb1\xcc\xd6\x25\x85\xc6\x2b\x45\xc5\x67\xae\x84\x86\x3e\x29\x02\x2c\x00\x29\xe1\x4d\xcf\x7f\x17\x57\xbb\x5d\x96\x97\xc5\xe0\x41\x35\x87\x25\x9b\x98\xcc\x93\x55\x97\x9f\xec\x49\x1b\xe8\x5e\xe4\x91\xe4\x09\x98\x45\xab\x32\xce\xe1\xf0\x74\x6e\x01\x3a\xc2\x2b\x22\xa4\x6b\x74\x2d\xd3\x0c\x3f\x2e\x2b\xa0\xba\x3b\x78\x4c\x9c\x4c\x91\xbf\xe6\x26\x66\xd7\x63\x24\x3b\xd5\xdc\x30\xa8\x07\xf0\x5e\xe8\x8a\x7b\x70\x08\xa1\x91\x22\x4f\xd8\x60\xba\x51\x39\x19\x29\x98\x3a\xbb\xae\x86\x1f\x9d\xaa\x5a\x80\xdc\xa5\xe6\x69\xba\x0f\x31\x17\x8a\xcc\xa6\xac\x25\x45\xae\x59\xe1\x43\x3d\x80\x4f\x65\xa3\xcb\x7c\xa6\x69\x21\x1b\x12\xcc\x17\x91\x46\x9d\x64\x92\x12\xa9\x9d\x0f\x03\xac\x39\xce\xc0\x91\x38\x63\xb2\xa3\xca\x35\x40\xc9\xcb\x95\x3a\xbb\x3f\xfa\x60\x64\x6b\x92\xe6\x03\x69\xf6\xe0\xeb\x67\x6c\x0e\x9d\xc5\x04\x5b\xfe\x89\xd8\x05\xa6\x4f\x61\xa7\x2d\xdf\x97\xb2\xd8\xfb\x54\x95\xa5\xe1\x9a\xfe\x10\x58\x22\xe0\x6a\x1e\xc2\xed\x63\x9a\xce\x4c\xb4\x7b\x3e\x9f\xa0\x58\xcc\xcd\xcc\xc9\x26\x5a\x8b\x79\x59\x99\xb4\x82\xcd\x4d\x2a\x32\x21\xfa\xcc\xd2\x12\xb7\xee\xd6\x62\x8b\x9a\x09\xd2\x6f\x86\x87\xaa\xf2\x65\x5c\x2c\xf2\x64\x57\xcd\x9d\x7b\x5d\x0a\x40\x9c\x42\xb1\xde\x44\xa0\xc5\x20\xbb\x90\x51\xd1\x87\x92\xce\x5a\x24\x0d\xae\x84\x88\x3d\x1d\x7a\x7a\xaa\x14\x8c\x32\x39\xbb\x5a\xd9\xef\xc1\x76\x28\x80\x95\x92\xe1\x37\xc9\xe2\xd8\x66\x67\x77\xf6\x8b\x3c\xc7\x3b\xa0\x17\xa3\x5e\x55\x84\xe3\x11\xf2\x62\x20\x42\x98\xd3\x62\x8f\xff\xb4\x16\xd9\xd5\xb6\x9c\xa1\xb7\x4b\xab\x9f\xeb\x88\x6c\xae\xcf\xe6\x79\x1c\xbd\xb7\x92\x6d\x91\x2c\xe3\x59\x74\x9d\x25\x4b\x0a\x83\x5c\xce\xf3\x28\xad\xf6\x80\x75\x4a\xd9\x5d\x9c\x17\xbb\x18\x39\x81\x67\xee\x3d\x57\x15\xf7\xc3\xf2\xf8\x9a\x3d\x1d\x6c\xc0\xc3\x06\x3c\x2c\x16\xab\x6e\x9e\xa6\xbe\x2b\x01\xab\x5e\x52\x51\xe6\xab\xb5\xc9\x2a\x5a\xc4\x16\x93\x71\x17\x7b\x38\xce\xd4\x45\xf7\x86\x0b\x0d\x55\xbe\xe0\xa6\xc4\xc2\xac\xcb\x00\x42\x26\x61\xee\xb3\x84\x04\xab\xef\x3d\x98\x0c\x5d\xfe\xd6\x3c\x13\x0d\x96\x26\xdb\x55\x06\x16\xd0\x17\x1d\x34\x65\x34\xd9\xbb\x16\x46\x5f\xbd\xf0\x5e\x92\x16\x06\x7b\x78\xf4\x95\x61\x9f\x0d\x08\xa3\x41\xd7\xb5\x43\xc7\x99\xae\x3a\x3c\xf7\x0b\x05\xdc\x95\x53\x75\x29\x9e\x5a\xf6\x82\xaf\x1f\xef\x7c\xeb\x8f\x71\x9a\x26\xbb\x22\x29\xe4\x0c\xb0\x94\x8e\x66\x97\xc3\x5b\x42\xf5\x59\x3b\xf4\xac\x0c\x70\xf8\xa2\x38\xa6\x91\xeb\xaf\x9d\x4a\xb2\x4f\x45\x74\x0d\xa9\xb9\x7a\xf4\x5f\xcc\x82\x47\x09\x55\xbb\x7f\xfe\x55\x5c\x46\xbb\xf8\xff\xfd\x73\x11\xe5\x71\xf9\xf7\x69\x07\x8c\x68\xbb\x4e\x63\x28\xc1\x38\xb7\x65\xab\xdd\xf9\xcc\xd5\x50\x9b\x4f\x06\x0e\x54\x45\x3c\x57\x1d\x98\x13\x30\x0e\x64\xee\xcc\xb2\x2a\x8a\xeb\x34\x9b\x47\x29\xee\x08\x6b\x3c\x73\xda\x18\x47\xcb\x4d\xfe\x88\x80\x38\xaf\x78\xed\xbc\xc2\x27\xd6\x5a\x3a\x8d\x83\x4e\x4c\x8d\xdf\x82\xd6\x55\x76\x5c\x65\x1d\xb1\x40\xa9\x77\xad\x8b\xf4\x15\x77\x45\x57\x49\x81\xb9\x49\x5d\xaf\x03\x9a\x4d\x02\x97\x08\xc1\x80\x46\x77\x69\xb1\xb8\x5d\x65\xa6\xa9\xb7\x55\x72\x9a\x7a\x39\xf9\xb1\x83\xbe\xeb\xcd\xf6\xda\x83\x0d\x5f\x71\xe7\x84\x8a\xac\xf2\xa3\xff\x12\x76\x26\x90\x33\x98\xc3\x30\x59\x16\xc3\x4f\x16\x20\xaf\x12\x75\xd8\xd4\x8b\xbc\x11\xbf\x46\x77\x27\x62\xb2\x6c\xde\xdd\xd2\xd1\xa9\xeb\x88\xce\xfc\x7a\x67\x2e\x87\xa3\x10\xbf\x2e\x7a\x96\xcc\x39\xad\xfe\xb1\xc3\x13\xce\x5d\xee\x32\x47\x56\xc4\x23\xe2\x9c\xc9\x6b\xaf\x8f\x56\xb2\x5d\xc6\xb7\x33\xd7\x09\x1d\x69\x1d\x23\xce\x82\xca\xc4\x0c\xa3\xda\x1b\x45\x7c\x28\x23\xc7\x51\x1c\xb8\x08\xe3\x08\x48\x7b\x2e\x4f\x28\x5f\x97\x55\xff\x99\xcb\xaa\x96\x4c\x1e\xac\xc2\x04\x4a\x85\x31\x34\x1b\x6a\x07\x34\xf4\x30\x46\xb3\xf8\x69\x9c\xc8\xe0\xcb\x30\x72\xbb\x69\xc8\x8e\x4e\x11\x35\x30\x95\x3a\x6a\x8a\xe9\xf3\x13\xad\x10\xb4\x4b\x0d\x20\x4d\xd8\x12\xd4\xd4\x00\x12\x6b\x9b\x49\xf5\x58\x87\x34\x90\xad\xa4\xda\xdb\xda\xce\x77\x3b\x1b\x95\x42\x2b\x8a\x39\xb5\xa6\x07\x6d\xb2\xb7\x7d\x12\x38\xc1\x92\x4f\xd2\x02\x1e\x92\x41\x7a\x65\xd3\x00\x3e\x9d\x62\xe9\x80\x2a\xcd\xd2\x95\x93\xfe\x30\x00\xa1\xf2\x36\x01\x35\x62\x4d\xd0\x2e\x13\x50\xac\x13\x46\x1c\xe0\x8e\xd5\x81\xb6\x13\x33\x68\xb1\x01\xf3\x06\xac\xa0\xb7\xae\x14\xe5\x9c\x96\xd9\x34\x1a\x95\x8d\x04\xf7\x82\xd5\xc8\x53\x2f\x91\x06\x5c\x04\xac\xd6\x42\xb5\x28\x92\xae\x9c\xda\x28\x73\x45\x32\x01\x35\x62\x4d\x34\x53\xc6\x8a\x64\xc4\x01\xb1\x10\xad\x8a\xa4\x83\x30\x68\xb1\x01\xf3\x06\xac\x20\x6b\x65\xa2\x48\x40\x58\xb3\x72\x6e\x23\xa1\xab\x5a\xcd\x51\xc3\x20\xc5\x51\x17\x53\xbd\x69\x85\xa8\x85\xd8\x0e\x69\xc2\x96\xa8\x34\xed\x90\xa4\x9b\x0d\xaa\x27\xfd\xa4\x86\x6c\x25\xd5\xde\xd6\x76\xbe\xdb\xd9\x40\xda\x02\x17\xf3\xca\x82\xdf\xc8\xa2\xdb\x82\xfa\x28\x1c\x98\xaf\x96\x49\x11\xcd\xd3\x78\x09\xd5\x37\xd3\x15\x32\x73\x86\x19\x98\x9e\x1a\x9a\xf7\x5a\x21\xf4\x34\xe8\xdc\x68\x02\x64\x44\xa9\x9e\x50\xba\x00\x9b\x51\x36\x94\x9e\x3c\x42\x8c\xc0\xe9\x2c\xd7\x05\xd8\x8c\x32\x99\x84\x3b\xc0\x1a\xca\x83\x4c\xba\x5d\x80\xf5\x94\x4d\x38\x35\xe1\xd0\x48\x07\x8c\xfa\xde\xa8\x57\x8c\x7a\xc3\x48\x5a\x46\x52\x42\x2b\x99\x56\x08\x35\x0d\x7e\xb5\x63\x06\x56\x53\xa3\x31\x89\xdb\xac\xb4\xa2\x34\xcd\x6e\xe2\x65\x73\x21\x24\xa8\x8f\xcc\xae\x8a\x6a\x43\x19\xa7\xf1\x02\xa7\xbd\x3c\x13\x3f\x68\x2d\x9b\x7a\xaf\x30\x6b\x07\x01\xc6\xa9\xd1\xd6\xd1\x00\x98\xb3\x78\x6d\x7b\x4d\x03\x38\xd1\xfa\x19\xec\x4f\xcd\x41\xa5\x51\xd0\x61\x6f\xdb\x01\xa5\x93\xb4\xd5\xb6\xd1\x7c\x8b\xdc\xa5\x1e\x71\x64\x1a\x6f\xaf\xbb\x54\x22\x58\x24\xf3\x9d\x79\x27\x89\x09\x96\xa1\x75\x57\x6f\x42\xdc\x9c\xf3\x0e\xba\xd4\x41\x87\x3a\xf4\x68\x87\x9e\xec\x20\xdd\x0e\x52\xe5\xac\x6e\x9b\x33\xa3\x05\x0e\xb6\xc0\x46\x2e\x10\x1e\x58\xf0\xed\xeb\x8d\xaa\x7a\x4f\x33\x33\x80\x81\x06\xba\xd1\x86\xd7\x04\x9a\x37\xac\x6d\x5b\x64\x13\x40\xc9\xb4\x1a\xec\xab\x3b\xc0\xca\x03\xa2\xc3\xa6\xbc\x0b\x4e\x37\xa9\x6b\xec\x6b\x07\x2f\x51\x0f\x9c\x4e\xf5\x88\x06\xca\xdc\x99\xd0\x49\x06\xa2\x19\xe8\xe0\x89\x30\xc1\xe9\xd0\x8a\x0e\xdc\x77\xd1\xab\x2e\xfa\xd4\xa5\x6f\xbb\xf4\x69\x17\x29\x77\x91\x2e\x6f\x6e\xdb\xdc\x31\x6d\x80\x0a\x83\x6b\xe4\xc5\x11\xa0\xe5\xe3\xd4\x56\xef\x8e\x1d\xdf\xee\xa2\xed\xb2\xa2\xd2\x62\x59\x5b\x00\x91\x99\x6c\x81\xa1\x86\xcf\x0c\xac\xd6\x37\x43\x70\x63\x56\x45\x9b\x62\x08\x4e\x06\x95\x29\x37\x44\xf9\x5a\xc0\xcd\x88\x1a\x4a\xc2\xb0\x41\x86\xac\x21\x35\xd7\xc0\xf0\x8a\xdb\x00\x82\x77\xa7\xc0\xdc\xea\x5a\x75\x24\x2f\x14\x18\x6b\xa5\x0e\x5e\x50\x4e\x1d\xa8\xac\xa3\x06\xd0\x40\x07\x99\x60\x75\x6d\x86\x5a\x71\x4d\xb0\x24\x55\x33\x62\x51\xd2\x15\x1d\x56\xa7\x2a\xba\xc9\xac\x5b\x9b\xbb\xb1\x2d\x68\xba\x0a\x54\xa5\xf0\xe2\x5b\x1a\xdf\x7c\x43\xae\x90\x22\x65\xaf\x43\xbc\x46\x4c\x88\x17\x7e\x1b\xbe\x3e\x57\xce\xb3\x32\x2a\xe3\x07\xd6\xd4\x59\xc6\xeb\x13\xf6\xce\x0e\x8a\x26\x9f\x5d\xe5\xe9\x83\x65\x54\x46\x33\xf4\xf3\xdb\xe2\x7a\xfd\xf0\x76\x93\x9e\x2d\x2e\xa3\xbc\x88\xcb\x7f\x5e\x95\xab\xc9\xe9\xd0\x3f\x2f\xae\xd7\x43\xcf\xb9\xdd\xa4\xdb\x62\xe8\x3f\x1d\x7a\xde\x65\x59\xee\x86\xfe\xe3\xa1\xf7\x6c\xe8\x3d\xbb\xb9\xb9\xb1\x6f\x7c\x3b\xcb\xd7\x43\xef\x99\xe7\x38\xce\xd0\x7b\x86\x30\xbc\xa1\xe7\x5c\x27\xf1\xcd\x93\xec\x16\xa3\x39\x43\xaf\x2a\x75\x5c\x8f\xfc\xc7\x1b\xfa\xdf\x0d\x9d\xc7\x43\x54\x42\xfe\xef\x9f\x2f\xe3\x55\x01\x14\xf0\x40\x28\xb8\x65\xe8\x7f\x67\x2f\xd2\xc2\x72\x87\xe3\x27\xab\x24\x4d\x11\x4f\xfe\x34\xaa\xfe\x19\xfa\x4f\x86\xe3\xa7\x43\xff\xbc\x62\x87\x00\xcb\x75\x0d\xbd\x67\x8a\xea\xfc\x73\x14\x94\x3e\xf4\xbf\x3b\x8f\xf2\xb8\xc4\xb0\xf4\x93\x0c\xbc\x8b\xca\xcb\xa1\xe7\x2c\xd2\xa8\x20\x42\xc2\x8c\x21\x29\x2c\xf1\x97\x8b\xd1\xd0\x3b\x9f\xbe\x70\x6d\x6f\xe8\x9d\x07\xb6\x17\x39\xf6\x68\x32\xf4\xce\xe9\x1f\xe4\x5f\xb7\xfa\xd7\x72\x5f\x54\xd0\x63\xdb\xa9\x8a\xa6\xf6\x24\x18\x7a\xe7\xbe\xed\x05\x00\x92\xcb\xfe\xfb\x16\x55\xf9\x8c\x30\x89\x9b\x7f\xbd\xc6\x3f\x39\x15\xc8\xe3\x5d\x1c\x95\xb3\x6d\x46\xfe\xc6\x96\xa1\xc8\x89\x4a\xef\xa2\x64\x7b\x76\x1d\xe7\x65\xb2\x88\x52\x12\x6d\xba\x49\x96\xcb\x34\x96\xee\xcb\x1a\x85\xd0\x70\xaa\x2e\x26\x70\x20\xd7\xe9\xb4\x37\xf8\x69\xec\x7b\xff\xba\x7c\xa6\x2a\x75\x14\x12\xbd\xbf\x21\x06\x1e\x1d\xf1\x86\x8a\xe3\x9c\x89\xb7\xea\xe7\xf4\x7e\x4f\x1d\x51\x69\x67\xbb\x98\xbd\xd3\x56\xb1\x79\x6a\x08\x47\xd3\x50\x48\xe8\x65\x34\x2f\x5a\x6a\x68\x05\x51\x12\xa7\x3f\x61\xba\xba\x52\x05\xc9\x3d\x13\x49\x86\xfe\x9a\xc6\xa0\xa4\x98\xfb\x66\x26\x02\x63\x6f\x9f\xb5\x34\x5f\x47\x19\x84\x84\x89\xd6\x6d\xd7\xd1\x13\x81\x20\x52\xfb\x3a\x6c\x90\x5c\xac\x42\xb1\x47\x54\x99\x5c\xe6\xf6\x49\x47\x31\x99\x37\xdb\xa0\x2d\x7b\x12\xd3\x98\xd7\xe1\x51\x3a\x7e\x3a\xf4\x83\x99\x74\x41\xc1\xd1\xec\x1d\x88\x35\x25\x4b\xf4\x7e\xa4\x89\x1a\xd5\xb7\x25\x5b\x78\x57\xd2\x94\xc1\x5a\xda\xa7\xa4\xc4\x41\x28\xf5\x06\x3f\xf3\x83\xf5\x86\xb9\xd0\x8c\x2e\x6b\x11\xdd\xe9\x26\x14\xc3\x76\xb6\xf1\x6f\xa8\x2e\x5d\xe4\x6d\x20\xc8\x03\xb4\x04\x5d\x6c\x2d\xb3\x9d\x89\x96\x20\x58\x2c\xf4\x16\xbe\x95\x54\x01\x30\x05\xc1\xba\x81\x4a\x5a\x3c\x04\x48\x86\x08\xa1\x09\x4e\x66\x6d\x4c\xad\x29\x0a\x5d\xe9\xd8\x5c\xa3\x76\xc0\x5c\xe2\xcc\x09\x8c\x19\xec\xd6\x55\x86\xb2\x6f\x93\xe8\xbe\xbe\x61\x4f\x47\x18\xc8\x06\xbe\xe9\x6c\xa8\x32\x18\xd8\x48\x88\x6a\xba\x10\x5c\x9b\xb4\xd5\xd4\x04\x10\xb8\x47\x70\x2a\x94\x4a\x6d\x9a\x91\x2c\x5c\x08\xc5\xcf\xf3\x1d\xa3\xcd\x66\x6d\x39\x44\x75\xba\xc9\xd6\x40\x6a\x7d\xb5\x07\xcc\x8d\x0a\x70\xa2\x81\x93\x0b\x06\x12\x27\xe2\x35\x01\xe9\xce\x82\x9e\xb7\x2e\x56\xb1\x1d\xcb\x6c\x05\x6b\x52\x7b\x47\x84\xd6\xd5\xad\x49\x9d\xe6\xb0\xaa\x95\xaf\xa4\xa2\x8c\x29\x66\xec\x33\x97\xc5\x62\x0a\xa5\x51\xf3\x14\x23\x6e\x60\x32\xec\x7b\xa1\x75\xee\x3a\xc3\x81\x76\x48\xd5\x40\x87\xb4\x0f\xdb\xfe\x15\xaa\xba\x0f\x36\x8e\x50\xf7\x31\x79\x00\x4d\x86\x9d\xc2\x1a\xf6\x44\xec\x37\xf8\x4c\x8c\xf7\x61\xd5\xab\x86\x55\xcb\x5c\x70\x48\xa5\xd2\xc2\xd9\xd1\x0e\x44\x02\x74\xe8\x58\xec\xd3\x9d\x1a\xcc\x9e\x23\xb2\x63\x87\xf6\x61\x40\x39\xd4\xcc\xbb\xb4\x7b\xb5\xaa\x3e\x55\x8c\x4e\xb8\x4f\xf9\x01\x1a\x2d\xe5\x0c\x1d\xe8\x3a\x20\xec\x41\x33\xbf\x51\xdd\x5c\x0b\xb4\xc7\xa1\x78\x11\x70\xb4\x18\x8f\x27\x41\xed\x0e\xc6\x00\xec\x45\x24\x7a\xb9\x89\xbf\xf0\x17\x0a\x59\x9d\xd8\xbc\x93\xd5\x02\xdf\x83\x9f\x90\x86\xae\x70\xcb\xb9\x0b\xd9\x5c\xcb\x48\x2c\xc8\x73\x53\xc6\xcb\xbd\x54\x82\xff\x6b\xad\xf3\xe8\xee\x94\xfb\xe2\xee\x81\x56\xaa\xd0\x77\x57\xf9\x2e\x8d\x79\x02\x1e\x47\x20\x8a\xc7\xfe\x62\xaa\x24\x30\x4f\xaf\x04\x74\x5f\xc8\x3e\x39\x1e\xcf\x27\x4a\xf4\x2c\x8f\xb6\x6b\x81\x40\xc0\x3f\xe6\xb2\x9a\x2e\x7c\x5f\x49\x20\xc5\x0a\x2c\x71\x11\xf2\x29\x2b\xe7\x8b\xc5\x72\xa5\x24\xd2\xfe\x7c\x25\x0f\x0f\x25\xbb\x1c\xb9\x91\xe7\x39\x4a\x14\x93\xf7\xcf\x78\x0c\xa3\x97\x6d\xee\xff\x67\x86\x72\x6e\x6c\x77\x57\xa5\xb5\x4b\xa3\x45\x7c\x99\xa5\x28\x67\x1f\x22\x72\x3a\xcb\xb3\xac\x24\x3f\x18\xbf\x31\x73\x3f\xd5\x69\xcd\xdf\xa1\x45\xbe\xb7\x71\x4e\x8e\x08\xff\x29\x27\x2b\x6e\xb9\x41\x68\x3b\xbe\x78\xc3\x74\xc4\xbe\x66\xcd\x9a\x03\xf3\xf4\xd6\xd2\x4d\x70\x71\x14\x33\x4e\x69\xcd\xab\x40\xff\x98\x2c\xaa\x7f\xce\xf8\x5c\xb9\xcc\x6e\x1e\x39\xa0\x69\xfa\x79\x30\x4b\x03\x73\x0d\x08\x09\x88\x0e\x68\x2a\x30\x71\x80\x33\x90\xe4\x2a\x00\xfe\x41\x02\xbe\xf0\x0f\x12\x8c\x10\x71\x80\x11\x07\x19\x71\xa0\x8a\x14\xd3\x08\x44\xcc\x4e\x79\x2a\x7d\xe6\xab\x93\xe0\xe5\xef\xc0\xb5\xa8\x70\x5c\xfd\x23\x57\xa9\xa4\xdd\x96\xe8\x1f\x1b\x36\x9c\xeb\x1f\xbc\x7f\x5d\x41\x5d\x47\xf9\x03\xcb\x5a\xa4\xb9\x85\xc8\x23\x6b\x69\xcd\xd7\xb8\x7b\x4f\x29\x91\x13\x42\x05\x4c\x8b\x69\x87\xbb\xdb\x13\xca\x77\x43\xe5\x94\xfb\xe2\xd6\x0d\x60\x20\xf8\x4f\xee\xbe\x5d\xdd\x30\x3b\x92\x90\x18\xa2\x8a\x2e\x62\x21\x54\x12\x95\xa9\x68\x41\x34\x8a\x73\x66\xd0\xb1\x5d\x39\xfa\xc2\xbb\xfb\x11\xb1\xa7\x72\x37\x93\x92\xb6\x49\x97\x45\xa3\x93\x2e\xfb\xcd\x13\x48\x13\x18\xfe\xa3\x67\xa0\x43\x78\xbe\x56\xf5\x07\x26\xab\xd7\x22\x02\xd3\xd2\x6b\x1c\xa5\x16\xa0\xe3\xe8\x52\x27\xbe\xda\xf4\x09\x8b\xa9\xa3\x3e\x61\xda\xac\x46\x61\x32\x5d\x35\x0a\xd3\x81\x75\x8a\x2b\x6b\x5b\x89\xb1\x88\x78\x0d\xc4\x7e\xf1\x05\xd2\x08\x82\xff\xe4\x1b\x68\x14\x5e\xc2\xa9\x7a\xa5\x22\xaa\xd7\x27\x04\xd1\xd2\x6b\x0c\x15\x2d\xc8\x71\x34\xc9\x98\xa3\xf6\xd7\x66\x2a\xd1\x74\xd4\xa2\x8a\x32\xab\x43\x98\x48\x57\x1d\xaa\xa8\xc0\x1a\xc4\x94\xb4\x2d\xc5\x59\x34\xba\x14\x67\xbf\x05\x02\x69\x02\xc3\x7f\x0c\x0c\x74\x08\xaf\xe2\x55\xfd\x81\xc9\xea\xb5\x88\xc0\xb4\xf4\x1a\x47\xa9\x05\xe8\x38\xba\xd4\x89\xaf\x36\x7d\xc2\x62\xea\xa8\x4f\x98\x36\xab\x51\x98\x4c\x57\x8d\xc2\x74\x60\x9d\xe2\xca\xda\xf6\x67\x2c\x22\xbb\x3f\x63\xbf\x87\x42\x05\x0c\x1c\x5f\x10\x1a\x68\x17\xde\xde\xa9\x7a\xa8\x21\xad\xd7\x30\x06\xae\xa5\x37\x25\x8a\x06\x80\xc7\xd1\xb6\x5e\x3c\xb6\x69\x1d\x16\x5f\x47\xad\x6b\xe8\xb3\x9a\x87\x49\x75\xd5\xbc\x86\x16\xac\x7d\x52\x79\xdb\xe6\x9e\x45\x46\xc9\x85\x22\xe9\x13\x6f\x1a\x57\x61\x3c\xe1\x5e\x5e\x30\x98\x16\x11\x0e\x5f\x17\xcd\xc5\x13\x41\x5f\xf9\xb7\x31\x9c\x30\xf4\xbc\x6e\x35\x62\x1c\xbe\x46\x9a\x19\x28\x82\xbe\xf2\x62\x72\x47\x63\x67\xda\xad\x46\x8c\xc3\xd7\x48\x52\x18\x45\xc0\x47\xbe\xbe\x91\xb7\xf4\xdd\x8e\xf5\x21\x1c\x52\x9f\xa0\x0b\xb4\xeb\xeb\xdd\xb7\x65\x07\x44\x3b\x71\x20\xdd\x7f\xa3\xf7\x3b\x96\xd9\xe2\x6a\x13\x6f\xcb\xc1\x55\x9e\x5a\xbb\x3c\x5e\x25\xb7\x0f\x4e\xf6\x98\x44\xed\xa5\x10\x1c\x8b\xd8\x49\x79\x7f\x6f\xa7\xd9\x3a\x69\x9e\x21\xe2\x52\x93\x51\x1f\x00\x0a\x1f\x6a\x9a\x79\x95\xa7\x0f\xbe\x31\x88\x05\x1d\xfa\xcf\x6e\x37\xe9\xd0\x73\xae\xe3\xbc\x48\xb2\x2d\x8e\x6c\x74\x6d\x07\x47\x3a\xc6\xdb\x45\xb6\x4c\xb6\x6b\xfc\xf9\xf7\xd7\xcf\xac\x09\x2e\x28\xca\x68\xbb\x8c\xd2\x6c\x1b\xe3\xa2\x6d\x86\xc2\x3f\x51\x9c\x22\x8d\x30\x45\x2e\x4e\x5c\x3c\xf6\x47\xbb\x5b\x8c\x89\x19\xc6\x9f\x27\xfe\x84\x7e\x06\x23\x4b\xc7\xfe\x68\xe8\x39\x13\x9f\x54\x2a\xf0\x48\xa2\x31\x7b\x05\xb2\x12\xa4\xc7\xb7\x69\xb2\x7d\xdf\x86\xec\x4e\xa7\xd3\xa1\xf7\x0c\xc3\xe2\x28\xd7\x26\x9c\xf4\x3a\x5e\x94\x59\x3e\xf4\x9c\x28\x17\xa3\x4a\xfd\xf3\x65\x5c\x2c\x86\xfe\x77\xe7\x79\x1c\x95\xf1\x12\xc9\x04\xc5\x95\xbe\x7a\x1f\x97\x8b\x4b\x9b\x46\xac\x22\x20\x26\x54\x96\x0b\x64\xf5\xcf\x2b\x61\x26\x24\xe8\xb4\xb8\xdb\xcc\xb3\xb4\xa0\xbd\x90\x67\xef\xeb\x1e\xd8\xc6\xec\x57\x8b\x11\x3f\x91\x14\x8e\xa9\xe5\x81\xab\x6f\x56\x7e\x95\x12\x2a\xf1\x75\xbc\xcd\x96\xcb\xba\x95\x6c\xd5\x2f\x2a\x2d\xc4\x58\xb5\x05\xc5\x25\xb5\x19\x7d\x60\x85\x4e\x60\x3b\xe8\x7f\x43\xef\xbc\xea\x46\xf2\xeb\x04\x24\x99\xc7\xc8\x39\x58\xcd\x0f\x38\x86\xb9\x85\x7c\x37\xea\xb8\x6b\xac\xaa\x63\x5a\xb8\x1e\x4f\x38\xb2\xd6\xc4\x93\x08\xe7\xf1\xa2\x64\x68\xbf\x8c\x17\x25\x4a\x68\x68\xe1\x50\x61\x5e\xbe\x43\xcf\xf7\x3c\x3f\xf0\xbf\x23\xda\x56\xab\x75\xf5\xeb\x8e\xfc\xb2\xa9\x5e\xb3\x3d\xe5\x7a\x63\x3b\x0c\xe5\xa1\x32\xf5\x5c\x7b\xe4\xd5\xdc\x0c\xbd\x67\x88\x21\xf4\x63\x97\xa5\x77\xeb\x6c\xcb\x70\xf7\xea\x32\xda\xc5\x10\x53\xcf\x46\xe1\xf8\x09\x2e\x40\xe9\xcf\x8a\x66\xc0\xf9\xb6\x33\x22\xe3\x2e\x9c\x4e\x6d\x2f\x18\x7a\x8e\x37\x9d\xd8\x6e\xf5\x17\xdf\x71\xed\xc0\x67\xab\xa7\x95\x76\xe4\x20\xf0\x27\xe1\x74\x0c\x73\x10\x38\x13\x7b\x14\x8a\x3c\x4c\x43\xdb\x9b\x56\x1f\xaa\xbe\x1f\x1d\x81\x05\x95\x10\xa6\xee\xc4\xae\x86\x8a\x53\xc9\x7a\x5a\xf1\x31\x71\x27\xf6\xc8\xaf\xfe\xe2\x79\x76\xf5\xe7\xd8\x9d\xd8\x93\x29\x03\x72\x30\x33\xfe\x93\x71\x38\xf9\x4e\x66\x46\xaa\x5a\xea\x0a\x5e\x4a\xd5\x8f\x51\x18\xda\x4e\x45\xc8\x1b\x8d\xec\x90\x6b\xc9\xf1\x19\x0f\xc7\xd3\xef\x9e\x78\x32\xe3\xa1\xeb\xd9\xa3\x31\x5b\xb7\xd8\x81\x10\xe3\x81\x5d\x29\x85\xe3\x8d\xc6\x18\xe4\x78\xf2\x0d\x82\x27\x21\xa0\x6f\xb2\x88\x38\x09\x3a\xc7\xe4\xe1\xf1\xf8\x7c\xfa\x34\x94\x79\x70\x5d\x6f\x42\x67\xba\xe9\xd4\x0e\xe9\x0f\xf2\xdd\xf7\xa6\xf6\xe4\x18\x63\x4e\x25\x03\xa1\x1e\x9e\x89\xaa\x83\xa6\xe4\xef\xb2\xee\x49\xea\x49\x68\x85\xae\x6f\xbb\x13\x25\xcf\x43\xef\xd9\xda\xf0\x6f\xf8\x96\xc3\x37\x27\xd2\x3d\x06\x61\xa9\x63\xd5\x21\x4d\x5e\x88\x4e\x39\x07\x8e\xee\x5a\x84\xb0\x98\x1a\xe0\x9f\xdc\x0a\xd1\x9d\x7b\x91\xef\x01\x79\xaf\x0d\x72\xc2\xaa\x72\x68\x93\x83\x1f\x7c\x51\x61\xe0\x33\xaf\x20\xe2\x53\x69\xe6\x01\x39\xc7\xb9\xbe\x24\x17\x80\x48\x8b\x60\x9e\x07\xb6\xf1\x73\x34\xab\x68\x93\xa4\x77\xb3\x8b\xb8\xcc\xb3\x5d\x96\x26\xc5\xe9\x37\x8f\xaf\xe3\x6d\x92\x0f\x7e\x8e\x6f\xcb\x6f\x4e\xbf\x79\x1e\xa7\xd7\x71\xb5\xf4\x1c\xfc\x1c\x5f\xc5\xdf\x9c\x3e\xce\x93\x28\x3d\x2d\xa2\x6d\x61\x15\x71\x9e\xb0\x6f\xe2\xb9\x24\xf9\x6a\xeb\x63\x9f\x2e\x79\x19\x53\xc3\xfb\xc0\xbe\x89\xd3\x45\xb6\x89\xf7\x9d\x11\x2f\x93\x6d\x29\x34\x9d\x7b\xca\x49\x3c\x0f\x1f\xeb\x48\xe6\xd1\x32\xde\x44\xf9\xfb\x7f\xbf\x2c\x03\xcd\x13\x41\x30\xb3\xc5\xd5\x1c\xf7\xbb\xc8\x1d\xc0\xfb\x71\x79\x75\x8f\xd1\xef\xf8\x2b\x7e\xde\xca\x24\xc7\x32\x19\x38\x1e\x92\x14\xbd\x07\xd1\x4a\x7a\x60\x47\x57\xe5\xa5\x55\x64\x57\xf9\x22\x3e\x35\x81\xbf\x2a\xe2\x7c\x1b\x6d\xcc\x80\x77\x51\x51\xdc\x64\xf9\xd2\x08\x98\xbe\x23\x61\x06\x9c\xe6\x56\xb5\x42\xa5\x8f\x1a\x1a\x23\xd5\xaf\x55\xf0\x6f\x13\xd7\xaf\x97\xa0\x04\xc9\x86\xb2\x43\xf4\x70\xfd\x16\xb9\x35\x26\xbd\xed\xc3\x3e\xc6\xd6\x97\x24\xfe\x8c\x53\x2a\x51\x74\xf3\x06\xeb\xa8\xed\x8f\xc7\x1e\x8e\x61\xa8\x83\x8e\xea\x4f\x9f\xaa\x8a\x7f\x03\xeb\x64\xf8\xf1\x6f\xea\xb1\xf9\x8c\x85\x6b\xd8\x81\xe1\x80\x3e\x80\x19\x59\xb0\x8b\x28\x5d\x3c\xa8\xb8\x19\x58\xe4\x7e\xdf\x89\x11\x0b\x65\x96\xa5\x65\xb2\xb3\xae\xa3\x34\x59\x46\xcc\x43\x3e\xec\xdd\xc6\x5e\x74\x3a\x1a\x09\x88\x00\x35\x1c\x7b\xf8\x05\x42\xb3\xe1\x19\xe7\x79\xc6\x3f\x45\x75\x26\x3f\x55\xd4\x24\x70\xc7\xde\x28\x12\x5a\xc2\x2c\x73\x16\x9e\xbb\x6c\xa6\x0d\xb2\xe8\x01\xd3\xc8\x4b\x89\xd6\xcd\xd9\xa4\x97\x9e\xc1\x67\x80\x98\x9b\xd0\x82\xeb\xca\xf8\x16\x33\xec\x12\xe2\x9c\x49\xd5\xda\x3e\x44\x7b\x0b\xf2\x1f\xb4\x0c\xce\xe3\x22\xce\xaf\xe3\xc7\xe8\x59\xa4\x97\x55\xf7\x60\xe8\xdb\x8b\x64\xf9\xe6\x22\x59\x0e\x3d\x67\x13\xc7\xe5\x67\x75\x31\x35\x1e\x20\xe6\x7a\x74\x6e\x25\xf4\xda\x3d\x77\x4d\x1a\x77\x20\x78\x4d\x5a\x77\x2f\xda\xe4\xff\x8d\xb3\x2b\xbe\x5d\xa4\xd1\x06\x29\xb3\xb5\x48\xf2\x45\x1a\x5b\x88\x11\xed\x6d\x6a\xb3\x2a\xa0\x1b\xd7\x6c\x5b\xab\x22\xe6\x37\x72\xbb\x88\x17\xb2\xab\x9d\xc7\xf9\xe8\xb1\xeb\x0d\xbd\x73\xf4\x1f\x7a\x9d\xba\xfa\xd3\x47\x3f\x26\xb4\xa8\x2e\xaf\xef\x69\x23\xe4\xb7\x9b\xea\xef\x9e\xf7\xd8\x45\xdf\x1c\xe1\x4e\xb6\x37\xa9\x89\x70\xe5\x35\xcc\x04\x01\xbd\xe5\x76\x40\x55\xcb\xf0\x96\xad\x4f\x1b\x3d\xa0\x8d\x9e\x63\x3b\xe3\xc8\xad\x76\x5e\xe7\xf8\xbf\x35\x13\x96\x6b\xfb\xd5\xbf\xd7\xd6\x48\x02\xa8\x5b\x61\x8f\xaa\x2f\xd7\xa3\xc7\x20\x89\xba\x1d\x55\x2d\x8a\xa6\xe0\xde\xef\xdc\x18\x1f\x37\x66\x41\xc6\xa6\x3b\x26\x3b\x6c\xcf\x59\x10\xb7\x98\xe7\xa3\x1d\x78\xf5\x29\xa7\xc3\x9a\xdb\x84\x93\x9a\xcd\xf5\x8c\xd9\x4e\x9e\xd4\x96\x92\x3c\x86\x41\x0d\x26\xf7\x9a\x3f\x4d\xbf\x60\x3c\xed\x21\x53\x47\xb3\x6e\xf3\x8f\x00\x76\xc4\xa6\xf6\xb2\x7e\x03\xd0\x9c\x09\xe6\x09\x49\xbf\x7e\x68\x66\xc0\x3e\x6d\x4f\xa2\xeb\x0c\x39\x7a\xc8\x52\x24\x1b\x57\xf3\xf5\x77\x91\xac\xb7\xcd\x03\xd9\xf5\xab\xf0\xd2\x4b\x0e\x52\xb0\x31\x4c\x9d\xbc\xfa\x0a\xbd\x93\x54\xcf\x21\xd0\x02\x95\x84\x46\x2a\x4e\x49\xd0\x95\xa8\x3a\xf7\xa7\x7b\x86\x6f\x78\xd0\xc8\x7e\xb7\x35\x7d\xc1\x78\x34\x41\xe9\x0b\xf8\xf3\x19\x85\x0f\x40\x76\x31\x28\x7c\x11\xf2\xda\x80\xdc\xa5\x15\xbc\x08\x9e\x6a\x85\x48\x84\x45\xeb\x47\xdd\x6e\x96\x87\x01\xe4\x47\xa8\xd6\x0d\x87\xf7\xf7\xf6\x26\x4a\xb6\xc0\xe6\x40\xb3\x95\xe3\xfc\x1b\x90\x30\x78\x92\x03\xfc\x74\x3a\x79\xc7\x3f\xda\xed\xac\x34\xbe\x8e\xd3\x3d\xff\x3a\x26\xbd\xb2\x60\xdd\xd2\x77\xff\x44\x32\xf4\x19\x55\x91\x3a\x79\x98\xa6\x26\x87\x17\x86\x22\x54\x71\x35\xb7\xb6\xd1\xb5\x8c\x5e\x5c\xcd\xb7\xd1\x75\x83\x4e\x77\xbd\x22\xdc\x95\xd5\x5d\x52\x88\xa8\x3b\x70\xf9\x26\xaa\x1a\x68\x93\x7e\xd6\xd5\xd1\x50\x63\x3c\x4d\x78\x6c\x18\xd0\x6b\x3e\x45\x79\x1c\xed\x61\xf6\xac\x3b\xec\xca\xa2\xf9\x73\xeb\xef\xc5\x22\xcf\xd2\xb4\x52\xa0\x32\xbb\x5a\x5c\x8a\x5a\x0c\xfd\xd1\x99\xa7\x47\xec\xfb\xc1\x7b\x7e\x45\x6d\x40\xaa\x48\x96\x31\xd7\x9b\xb8\x65\xe8\x58\xd8\x72\x7b\xf4\x00\xde\xf2\xd4\xc7\xb9\x6a\xda\x74\x58\xee\xf2\x64\x5b\xee\xc5\x51\xc5\xb8\x08\xef\xef\xe7\xd9\xf2\xce\xde\x66\x8d\x3c\x4f\xab\x2f\xff\x5a\x2c\x0b\x2b\x8d\xee\xb2\xab\xf2\x9f\x6c\xe1\xdf\xe2\xc3\x83\x32\xfe\xa0\xab\x94\xf5\x15\x76\x26\x27\x71\x68\x6f\xb2\x65\x94\x36\x46\x7e\x95\xdc\xc6\xcb\x33\xee\xda\x1d\xb5\xce\x0e\x7d\x62\x8b\x7d\x85\xea\x00\x07\xad\x26\x58\x1f\xbb\x9e\xcc\xec\x27\x69\x00\xfb\x76\xd6\x3d\x69\x96\xb5\x4c\xa2\x34\x5b\x03\xcf\x39\x72\x4d\x20\x8e\xdf\x09\x5e\x88\x88\xcf\xde\xb3\x94\xc8\x8f\x62\x43\x27\x8c\x00\x33\x0a\x01\xa5\x6b\x02\x14\xf8\x74\x80\xc9\x40\xb7\xe9\x9e\xb6\x86\x64\x5e\x63\x81\x06\xe4\x17\x11\x9c\x34\x2b\x00\x7f\xb4\xbe\x2a\x6f\xf2\x5a\x59\xf3\x5f\xf6\xc9\x32\xef\x84\x72\x57\xdb\x77\xe6\x97\x65\x45\x28\xb4\x25\x99\xa7\x31\xf0\x68\x35\x73\x0f\xc3\xa1\x1c\x3b\xf7\x6a\x0a\x9c\x5a\x89\x0a\x84\x1f\x5d\x9c\xc7\xe5\x4d\x1c\x6f\x39\x3d\x42\x0a\x58\x94\x51\x5e\xf2\xb4\xa9\x24\xd1\x7e\x49\xcd\x38\x07\x06\xba\xba\x99\x25\x81\x33\xa0\xef\xa2\x2b\x6b\x42\xef\xe9\xa1\xd1\x5b\xad\xb9\xfe\x3e\x31\xac\x59\x44\xdb\x4b\x2e\xe1\x63\xba\x9a\x19\x7f\x36\xef\x53\xf6\x34\x8e\x72\xbe\xc9\x8b\x34\x2b\xb4\x62\x45\x00\x7b\xee\x9a\xae\x03\xde\xec\x14\xce\x10\x5c\x7c\x63\x4e\xe6\x0b\xe4\xa0\x7e\x3a\xb1\x95\x15\x05\x64\x5d\x4a\x9e\x51\x34\xa0\x43\x5f\xe2\x44\x6f\x40\xd3\x57\xa4\x78\x11\x12\x5b\xc1\xf1\x8d\xfa\xb9\x5e\xbe\xe2\xe9\x1d\x2c\xe3\x14\xe3\xd1\xa5\x2f\xce\xb4\xa8\xb0\x9a\x24\x18\x2f\x74\xfd\x4c\xf9\xb8\x5a\xf7\x89\xab\x05\x69\xfd\xa6\xd4\x68\x96\xac\x76\xba\x07\xa0\x99\x27\xec\xf9\xfb\x9f\x35\x3c\x7e\x92\x5f\x3f\xd2\xd1\x78\x8e\xb7\x4b\x71\x05\x43\x36\x45\x2c\x21\x6e\x37\xc6\xbe\x9b\x6e\xb0\x9d\xc0\x5f\xb3\x3c\x89\xb7\x25\x0e\xc6\x4c\xa3\xed\xb2\x58\x44\xbb\x98\xce\x30\x4a\x19\x87\xe1\xf5\xa5\xe1\x52\x1f\xb6\xe6\x74\xe3\x88\xff\x84\xd4\x5b\x63\x69\x9b\xae\x23\x92\x21\xd4\xda\x34\x03\x71\xcd\x77\x04\xcf\x4f\x23\xe8\x7a\x36\xad\xa6\x96\x65\x9e\xed\xba\xad\x16\xa4\x09\x89\x9d\x53\x26\xe1\x49\xb3\x19\x9c\x84\xcc\xbc\x1c\xd0\x26\xd0\x01\x50\x2d\xe8\x58\x07\xec\x3d\x95\x0d\xd9\x55\x70\x7a\x44\x43\x0d\xa3\xea\x1f\x60\x4e\xf4\x57\xc1\x32\x5c\xf1\x0f\xfd\xcb\xef\x93\x62\xca\xa4\x02\xcb\xa5\x55\xd5\x1f\x80\x47\xe5\x30\x61\x01\xd3\x13\x31\x3d\x00\xd3\x0d\x43\x77\x14\x0a\x98\xbe\x88\xe9\x43\x98\xd3\x60\x3e\x76\x04\xcc\x40\xc4\x0c\x00\xcc\x70\xee\x07\xa1\x2b\x60\x86\x22\x66\x08\xb5\x33\x0e\xfc\x51\x24\x60\x8e\x44\xcc\x11\x80\xe9\xc4\xee\xc8\x9d\x0b\x98\x63\x11\x73\x0c\xd5\xe9\x04\x5e\x28\xb6\x73\x22\x62\x4e\xa0\x3a\x57\xee\xd8\x5d\xdc\x53\x23\x3f\xcf\xa3\xed\x12\x3d\xa2\x29\x7e\x01\xb6\x71\xf5\xfe\xa1\xb9\x42\xee\x3a\x5c\xea\xdc\x7a\xf0\xb1\xfa\x24\x55\xf6\x28\x3a\x95\x3e\xd9\xdb\xe8\x9a\xbc\xcc\x09\x80\xcb\xdf\x6a\x78\xd3\xf7\xc5\xf5\x0c\x91\x90\x75\xa0\x80\x44\x94\xab\x19\x50\xa1\x36\x00\x34\x4d\xb6\xb2\x5a\xa8\x44\x89\x24\x56\xac\x83\xd0\x5d\x74\x05\xea\xc4\x77\x66\x35\xf4\xc8\xed\x5b\x25\xaa\x8e\x17\xfc\x40\x17\xf5\xc7\x66\xab\x55\x11\xd7\xeb\x1c\x89\x19\x72\x6a\x57\x2d\x3c\xa4\xa2\x7a\xc1\x22\x97\xd4\x8b\x15\x0d\x3d\xb9\xac\x59\x01\x29\x29\xa2\x75\x89\xb5\xce\xab\xdd\x01\xde\xdb\x15\x97\x79\xd5\x2a\xe7\x8c\x0b\x3c\xa8\x57\x38\x13\x39\xe3\x41\xa0\x68\x29\x59\x89\x2b\x0a\xf6\xbc\x01\x17\x6f\x8e\x1f\x3d\xd2\x02\x73\x2e\x5d\x48\x77\x85\xb5\xa7\x5f\xbb\x4f\x55\x7a\x55\xc4\x65\x99\x6c\xd7\x8d\x3e\x11\xab\xb4\x8d\xae\xc5\x4f\x11\xda\x24\x33\xea\x53\xe3\xda\x00\xb2\xf8\x8d\x60\xef\xa1\x11\x4e\x09\x0d\x90\x1e\x56\xfc\x02\xec\xa8\x0b\x09\x69\x06\x40\x62\x11\x2a\x03\x49\x2b\xd8\x6e\x20\xb8\x98\x9a\xd0\x71\xe4\x46\x48\x63\x82\xa9\x48\x55\x46\xab\x91\xf5\x5f\x26\x0b\x35\x40\x59\x28\x12\xe6\x15\x55\xd1\x03\x2a\xee\x95\x85\x9c\x94\x14\xfc\x03\x65\x20\x69\x6d\x0f\xa0\x26\x70\xab\x20\x34\x92\x35\xda\x84\x66\x2b\x55\x85\x50\x21\x57\x1f\x3f\xd7\x01\x94\x95\x6d\x01\x4b\x25\xda\x80\xab\x07\x3c\x06\x97\xf3\xad\xd4\xab\xdf\x29\xe3\x4c\xe1\xad\x50\xbd\x50\xad\x97\x69\x50\x13\x84\x99\x11\x00\x10\x26\x57\xa8\xa5\x02\x11\x10\x04\x26\x23\x89\x04\x26\x25\x83\x89\x53\xaf\xb2\x65\x3a\x08\x91\x88\xa6\x6d\x7a\x18\x05\x21\x55\xeb\xda\xe1\x4c\x16\x05\x40\x83\xe2\x2d\xfb\xca\x92\x96\x65\x2d\xa8\xcc\x10\x0f\xae\x13\xaa\x02\xd2\x80\x89\x76\xb1\x70\xf0\x7b\xaa\xe1\xae\x4e\x24\xf5\xdb\x7f\x5a\x46\x54\x50\x32\x0b\xcd\x5b\x82\x26\x95\xea\x9b\xaf\x04\x53\x57\x0b\xbc\x4d\xa8\x69\xfd\xc0\x5e\x45\x9a\xb1\x6d\x60\xef\x25\x2a\x30\x80\xd1\xd4\xa0\xa2\x05\x00\xb5\xcd\x24\x35\x29\x6d\x79\xfb\x9c\x23\xd3\x69\x69\x5f\x6b\x4f\x81\xd4\x34\x2d\x94\xbc\xa5\xba\xee\x94\x96\xd5\x10\x8c\x66\x01\xa2\xa1\x04\x43\xb5\x2c\x58\xda\xe9\x01\x90\xea\x45\x0e\x40\x4e\x0b\xa4\x5b\x13\xe9\x68\xe9\xdb\xda\xde\x79\x4a\x8a\xea\xd6\x02\x81\x09\x65\xb6\x9b\x85\x34\xdb\x72\xf5\x17\xe0\xd6\xf1\x03\x2b\x74\x86\xa7\xd5\x7f\x4e\x74\x6e\x5a\xb5\x90\x6a\x3d\x43\xcb\x57\x13\x05\x12\x31\x4c\xd4\xa9\xad\x16\x13\x1c\x53\x55\x33\xac\xab\x15\xcf\x40\x0d\x55\x55\x75\x40\x31\x52\xd1\xd6\x7a\xba\xc8\xaf\x55\x27\x4d\x6b\x33\x95\x20\xb0\x8a\xad\x53\x2d\x36\x59\x33\x1b\xe5\x66\xe2\x51\x71\xdc\x4a\x57\x25\x6e\xdf\x27\x76\x41\x6a\x6b\x66\xeb\xbe\xd2\x0c\xa7\x13\x8b\x5d\xbb\xa2\xd9\x9f\x82\xf1\x40\xf8\xa7\xdd\xb2\x4f\x6a\xe6\xa4\x87\x66\x12\x36\x41\xd0\xcc\x7c\x0f\x8d\x24\xab\x87\x37\x66\xab\xc3\x8c\xdc\x60\x41\x1e\x7c\xb0\xf7\x0d\xf6\x48\x0a\x18\xb9\x67\xdb\x77\x36\x12\x88\xae\xbe\x76\x55\x92\x93\xde\xa1\x33\x0f\x2f\x0c\x4f\xe9\xbf\xb6\xcb\x9c\x7c\x68\x97\xdb\xbc\x7b\x12\x5c\xf5\x82\x20\xf2\x8a\x57\xf0\x56\x2a\xeb\xd2\x2f\xb1\x61\x18\x45\x6d\x6d\x9e\xcf\xa6\x06\xa8\x56\x8d\x37\x1e\xa0\xc0\x1c\x39\x32\x0e\xd8\xe6\xe3\x0c\xc7\xe8\x41\x15\x19\xa2\xf2\xe1\x7d\x7a\x29\xa1\xc3\xd2\x6c\x65\x95\x77\xbb\x96\xad\x3e\xaa\x86\x42\xb6\xc8\x9e\xa3\xaa\x87\x65\xc9\xca\x13\x4a\x07\xee\x67\xf4\xd5\x35\xe3\xea\x34\x92\x6e\xad\xc4\xbc\x51\xb4\x53\x40\x07\x8f\x36\x6a\x95\x4b\x5a\x24\xf8\x76\xdc\x90\xfb\x3b\x59\x22\x32\x0b\x44\x12\xb8\x80\xc2\x6b\xf1\x55\x0d\x3c\x33\x34\x4f\x9d\x1c\xbd\xd5\x20\x0e\x79\xed\x45\x5f\x5b\xf7\x5e\x81\x24\x4c\x4e\x74\xb5\x55\xd1\x60\xea\xee\xaa\x43\x31\x3b\xf3\xaa\xaf\xd2\x08\x15\x6a\x2d\x38\xc8\x55\x7e\x7d\x73\x27\x3e\x75\xd8\x93\x50\x4e\x72\xa8\x68\x14\xfd\x20\x71\xd1\x24\xe2\x66\x52\x72\x97\xd9\x7a\x9d\xaa\xa6\x43\x1d\x86\xc4\xbb\x11\xb0\x31\x7d\x60\x35\x2b\x9d\xa9\xb0\x7f\x87\xa7\x8c\x0e\xbe\x58\x0d\x2f\x46\x4e\x3a\x73\xfc\x2e\x92\x33\x73\xcd\x19\x13\xd0\xf8\xea\x74\x34\x5a\xdc\x72\x46\xa8\x9d\x5a\xdd\xe6\x91\x33\xc1\x35\x71\xd1\x3d\x82\x5e\x64\xc1\x74\xea\x75\x68\xbd\x33\xc3\x01\x76\xc5\x65\xb4\x8b\xff\xdf\x3f\x51\x4a\x99\xbf\x4f\xa4\x0d\xbc\x19\x45\xb2\x65\xd3\x52\x54\xb5\xf8\x50\x4e\xfb\xd0\xd5\xf1\xab\xe9\xd8\xbe\xac\xf6\x24\x69\xc4\xe5\xb1\xc5\x7a\x10\x61\x0d\xc7\x1a\x4f\x15\x98\x16\x4f\x70\x4e\xb9\xac\x73\x0a\xfd\x60\xdf\x6f\x3e\x6c\x20\xf0\x9c\x1e\x36\x04\x14\xb4\x0e\xe8\xa5\x23\x52\x84\x79\x3c\x4c\xe1\x8f\x43\xac\x85\xb3\xe3\x89\xef\x18\xea\xcd\x93\xdc\x33\x6f\x86\x23\x95\x0e\x82\x61\x67\x7d\xd4\xf8\x38\x8c\x50\x3b\x8b\x5d\xe7\xbd\x30\xc1\xe5\x62\x2e\x27\x38\x48\xb2\xe7\x58\xe4\xdc\x85\x07\x8e\x45\xce\x83\x78\x94\x91\x63\xc2\x5d\x1f\x8a\x47\x1a\x8b\x3a\xf6\x7a\x12\x3b\xea\x58\x34\xe2\xef\x68\xf2\xdb\x1f\x3c\x29\x1c\x60\x5f\xfb\xd9\xbe\x43\x2c\xd2\xbe\x09\x54\x11\x52\x67\xc8\x11\x44\x0d\x3d\xed\xfb\xb7\xed\x68\xd0\xab\xac\x6d\x4d\x30\xaa\xb2\x0d\x19\x7c\x0e\xb6\x67\x33\x0d\xf0\xb4\xd5\xf5\x6a\xa8\x31\x36\xf4\xac\x6d\x35\xb3\x4c\x42\xdd\xcc\xc2\xb8\xea\x0e\x92\xb7\x29\x1d\x8d\x0c\x3b\x93\x38\x90\x17\x3a\x07\xbb\xa1\xf1\xb8\x37\x12\x85\xf4\xf4\xa5\x39\xe9\x2e\xc3\x1a\x35\x81\xbb\x17\xe4\xd5\x3e\x35\xe6\x6d\x38\xdd\xa0\x1e\xb0\x92\xea\xd8\x48\x35\xaa\xae\xbd\x06\x58\xdd\x6b\xdc\x0b\x71\xb3\x7c\x77\x46\xf9\xe2\xd2\x9a\x67\xb7\xa7\xfc\x27\x96\xcd\x1a\x44\xf8\xc6\x7b\xd1\x81\x20\x71\x21\xcc\xbd\xb9\xff\x88\x6f\x37\x36\x61\xee\x9c\x9b\xc6\xc4\x1f\x43\x59\x52\xb8\x5d\x30\x80\xda\xa7\xa2\x40\xb7\x75\xf8\xa0\x5f\xa4\x26\x24\xb9\x3f\x08\x09\xc8\xb7\x21\x23\x89\x15\x9b\xf9\x27\x28\x9d\x47\xf2\x4c\x8b\x0b\x1f\x81\xf3\x28\x80\x66\xab\xf0\xf6\xe2\x3b\x54\xf8\x4d\x2e\x69\x31\x40\x69\x0e\x70\x0e\x6c\xbe\x80\x7c\x04\x58\x80\x4b\xf0\x57\xd8\xfd\xce\x2a\x8a\xe4\xec\xe3\xce\x50\x49\xf0\x85\x9c\x93\x42\xc5\x86\xe4\x53\x66\xb9\x91\xbd\xbf\x4a\x74\xb0\x35\xb3\xee\xc9\x93\x70\x12\xe5\x6e\x29\x94\x7a\x25\x37\x02\xd3\x75\xa3\x6c\xdd\xfe\x48\x9f\xbf\xa8\xb0\x5c\x2e\x6f\xd1\x0a\xfd\xaf\x3d\x6f\x51\x93\x84\xe8\x15\x92\x91\x94\x6b\x9b\xcd\xfc\x5c\xe9\x61\x51\xf3\x01\xa5\xdd\x29\xa4\xdc\x41\xe1\xd0\x3b\x0f\x6c\x27\x7c\xec\x3a\x28\x29\xcd\x39\xfd\x93\xcd\x9c\x53\x01\x54\x7f\x45\xff\x71\xe9\x7f\xb8\xcc\x39\x94\x0e\xa6\xe8\x3d\x76\x51\x86\x1d\x5f\xc8\x46\x84\x13\x09\x85\xb4\xc8\xf5\xc5\x6c\x44\x08\x19\x25\xdf\xf1\x9e\x19\x34\x83\x69\x89\xef\xdb\xe3\xaa\x1a\xdf\xb3\xbd\x69\x6a\x8d\x6d\x7f\x6c\x8d\xed\xc0\xb3\x5c\x3b\x40\x99\x8f\xec\xa0\x2a\xae\xbe\xa3\x3f\x02\x2f\x72\x19\xce\xea\x3f\x09\x8a\xcb\x31\x01\xe4\x68\x3d\xd1\xe5\x5b\x95\xd2\xb7\x92\x64\x00\x67\xc4\x4c\xa1\x7c\xb4\xcd\xe5\x20\xd6\xbf\xc4\xbc\x69\x47\x9f\xa7\x17\x9f\xde\x2c\xb3\x9d\x72\x6c\x0e\x50\x36\x39\x70\x64\x92\x22\xe5\xb8\x84\xcb\xd9\xb2\x3d\x70\x3b\x99\xa6\x16\x22\x99\x16\x01\xe2\x08\xf5\x5f\xe5\xdd\x2e\xfe\x27\xba\x4c\x2d\x32\x27\x95\x43\x1c\xb6\x01\x49\x00\xf4\xa5\x12\xf6\xfa\x63\x35\xc5\x0a\xb3\x66\x33\xb3\x82\xef\x9b\x9a\xb4\x47\x38\xfc\xd7\x41\x0a\xf1\x12\x0a\xd6\x41\x82\x4a\x62\x26\xd2\x92\x03\x0f\x5a\x79\x6c\x93\x2f\x4c\x52\x45\x6e\xcf\x77\x82\x74\x1b\xe9\x21\x5d\x4d\xa9\x0a\xf8\x65\x95\x84\xa6\x2c\xa9\xf0\x34\x67\xef\x22\x38\x3d\xf5\xd4\x91\x93\x4e\x46\x55\x44\xb4\x4c\x7d\x59\x67\xe7\x46\x19\x9f\x8e\xb3\x16\xe6\x4f\x5f\x95\xd7\xcd\x85\x04\x5e\x9f\x76\x05\xd5\x58\x01\xf0\xf6\xcd\xe7\x58\xfe\xe0\xa5\x99\x8e\x8f\x4f\x6b\xea\xc1\x30\xb1\xcf\x3f\x5c\x14\xa1\x01\x14\xec\xa1\x1c\x26\xc0\x16\xf2\x7b\x42\x01\x44\x89\x2b\xe1\x01\x72\x7d\x08\x84\x1d\x68\x6a\xb6\x95\x55\x4b\x25\x3c\x26\x70\x94\x0f\x47\x65\x41\xac\x89\xdd\xa5\x66\x10\x86\x6c\xa3\xa4\xa2\xa2\x95\x97\x16\xc8\x88\x5e\x2b\x2d\x05\x9d\x2f\xc5\xf6\xde\x47\x76\x9a\x6c\xdf\x5b\x38\xb3\xcb\x0c\xdd\xa2\x23\xab\x14\xf2\xf6\x35\x78\x67\x8a\x60\xa1\x3d\x77\xbc\x34\x41\xbb\xda\x2e\xe3\xbc\x6a\x2a\xc5\x45\xef\x94\xf5\xc4\x25\x6f\x25\x73\xb8\xd3\x45\x14\xc5\x1e\xcc\xae\x2d\x85\x13\xf2\x37\x98\xd3\xa4\x28\x2d\xb4\x0b\xc2\xb1\x40\x28\xa4\x1a\xf0\x95\xd4\x59\x80\xd8\x2c\xce\xf2\x63\xcf\x5c\x5e\x25\xab\x7e\x3b\xed\x1f\xc1\x34\x9c\x8c\x42\xfc\x26\x1a\xe2\x89\x04\xc9\x96\xf1\x06\xd6\x07\xce\x29\x44\x73\x83\x70\x78\x24\x94\x89\xc9\x0d\xc0\xbd\xb3\xd5\x89\x0f\x16\x9d\xa4\xb2\x11\x93\x47\xb6\x3c\xe2\xad\x4c\x4e\x0f\xdf\xc3\x14\x33\xcf\xb0\x0c\xd7\xfd\xc6\x84\x6d\xcd\xcb\x2d\xbe\xc2\x07\x06\xbf\xcf\xea\x07\x09\x48\x32\x12\x9a\x65\x88\xcf\x7d\xe5\x08\x54\xa9\x5b\x09\x8c\x73\x85\xae\x25\x12\x11\x25\xdb\xcb\x38\x4f\x44\xf9\x81\xd4\x6c\xe8\xe1\x3d\x8b\x3e\x9d\x3e\x20\x6a\xcf\xbe\x95\x87\xad\x40\x03\x3f\xb0\xbd\x62\x10\x47\x45\x6c\x25\xdb\x43\xf9\x57\x30\xa7\x1c\x38\x32\x28\xa3\x62\x82\x42\x88\x08\xb5\x7a\x83\x9a\x5c\xe7\x7a\x24\xb9\x1d\xb9\x11\xaa\x52\xde\xc5\x62\x41\x24\x65\x9e\x18\x4c\x4a\x08\x5a\x27\x4f\x19\x7b\x81\x37\x3f\x13\x1e\x52\x20\x7c\xa1\x76\x50\xe6\xd0\x0f\x21\x13\x23\xe0\xca\x6a\x90\xa3\x22\x59\xc6\x35\x36\xfa\x25\xa4\x24\x6c\xf3\xcc\xf2\x23\x48\x4c\x37\x22\xd4\xc4\xe6\x5c\xe2\x6b\x85\xb2\x31\xd1\x2c\x3d\xe2\xe1\x59\x9d\x98\x11\xdc\x6d\xd7\xae\xe1\x10\x1f\xfa\x73\x39\x51\xd8\x54\x10\x93\x61\x3d\xe8\x98\xc4\x97\xf8\xa5\xbf\xc1\x3f\xdc\xd0\xf3\xbc\x89\x41\xee\xc0\x9a\x9d\x3a\x61\x64\x9d\x3e\x49\x91\x12\x53\x4c\x6a\x45\x4d\x41\x2d\x32\x05\x3d\xc6\x00\x0a\xd6\x82\x36\xa4\xcc\x76\xa8\x9f\xa5\x14\x7a\x4c\xae\x3b\x08\x40\xe1\x4a\x64\x2c\x88\xe8\x98\x01\x5f\x06\x65\x73\x12\xaa\x1a\xc1\x4c\x02\x72\x12\x61\xf2\x40\x0b\x7f\x83\x65\xc4\xb8\xf2\x59\x8b\xdf\x24\x64\xf8\x04\xc9\x36\xc6\x70\x4e\x37\x55\xae\xb9\xf6\xd6\x12\xd7\x3f\xbb\x3e\xf2\xbd\x60\x35\xf2\x4c\x90\x81\xeb\x1a\x04\x9b\x7b\x48\xb4\x26\x54\xe1\xe1\xd7\x1c\xd4\x72\xab\x93\x94\xb0\x0d\x06\x67\x4a\xee\x05\x1d\xf6\x1e\x22\xdf\xd1\x75\xa5\x54\x4f\x8b\xf2\x14\x2a\x15\x76\x94\x83\x26\x4f\xae\xa8\x64\xa0\x5a\x4a\x79\x90\xe9\x91\x82\x9e\x95\x7d\xb3\x7c\xe2\x2e\xa3\x91\xfc\x70\x3a\x54\x66\xdc\x71\x6f\x1e\x70\x16\x8f\x2a\x31\x93\xe2\xcc\x94\xaa\x89\x6a\x68\x09\xf4\x56\x0f\xd2\x17\xff\x29\x83\xab\xe1\x9b\xf1\xa2\xd1\x27\x6e\xfe\x86\xd2\x80\xa7\xc9\x6e\x56\x99\xeb\x07\xee\xee\xf6\x94\xf9\xf7\x04\x15\xa1\xe4\xf3\x33\x34\x4f\x3f\x40\x01\x8d\x8d\x9b\xa3\x76\x8e\x52\x0e\x77\xb7\x54\xf3\x76\xb7\x62\xea\x5f\x68\x79\x8d\x33\xce\x91\x0d\x8c\x69\x13\xf0\x8a\xe8\x21\xee\x15\x12\x64\x3e\xfb\x87\x3f\x9f\x4e\x57\x0b\x34\x89\x0c\xc8\xe5\xa4\x86\xe0\x22\x4b\xd3\x68\x87\x13\x3e\xc2\x23\xcb\x6f\x41\x10\x1c\x07\xdf\x7c\x73\xb6\x4a\xb3\xa8\x9c\x55\xbc\xd7\x09\xf0\x43\x66\x97\x86\x37\x69\x72\x58\xe8\x5f\x0f\x2c\x74\x1a\x7b\x32\x60\x1f\x50\xf6\x2b\xf0\x93\x2f\xe6\x34\xca\xf5\xc8\x7f\x3c\xe0\xad\x80\xe6\x70\x4a\xf3\x88\x80\xf6\xdc\x6a\x1a\x55\xff\x80\xe7\x56\x52\x5d\xea\xe7\x37\x9a\x53\xad\xf3\x28\x8f\xc5\x07\x64\x25\x60\xa3\x93\xac\xd1\xd0\x3b\x9f\xbe\x70\x6d\x0f\x1d\x44\x79\x91\x63\x8f\x26\x43\xef\x9c\xfe\xc1\x9e\x55\x59\xee\x8b\x11\x3a\x03\x72\xaa\xa2\xa9\x3d\x09\x86\xde\xb9\x6f\x7b\x01\x80\xe4\xb2\xff\x32\x67\x42\xce\x63\xf6\x30\x68\xe8\x3c\xee\x77\x1e\x04\x1e\x3a\xd4\x86\x5f\xa1\xd6\xe0\xd0\x42\x7f\x8b\x97\xff\x0b\x4d\x4e\xc6\xc8\x57\x29\x4d\x45\xd4\xa4\x95\xc6\x7b\x10\x63\x5a\xbd\x18\x60\x2a\x46\x4e\xac\x1e\xac\xb3\x63\xbd\x19\xbc\x79\x56\xa2\x8c\x03\x53\x67\x19\xaf\x99\x81\x5b\x8d\x65\x3c\x72\xd9\xc1\x4c\xc6\xf7\xbd\x9c\xc7\xdc\xfc\xd1\x36\xfc\xea\xc3\x94\x59\x46\x78\xfc\x32\x1d\x67\xd6\x56\xef\x83\x6e\x92\x34\xb5\x16\x97\xd1\x76\x1d\xcf\x10\x06\xbb\x1b\x45\x1f\xd8\x8d\xa8\x95\x5d\x95\x32\xbf\xd8\x10\x2f\x93\xeb\x64\x59\xcd\xbc\xfc\xc3\xe5\xbe\x17\xfb\x01\x5d\x34\xe3\x15\x03\xf7\xfc\x37\xe7\xac\xa2\xc7\x7b\x34\xa7\x29\x5c\x13\xdd\x11\xf4\x4e\xf3\xaf\xcc\x8c\xab\xaa\x91\x7f\x4b\x0f\x2f\x9d\xf8\x9d\x9d\xea\xa5\x49\xb2\xbf\xd4\x90\x85\x9b\xc3\xad\x22\x8c\xf0\x81\xad\x3a\x90\x52\x13\x2f\x64\xe4\x23\xaa\x0e\x35\xd4\x87\x06\xcc\x24\x07\xdf\x78\x60\x92\xc4\x92\x4b\x93\xa4\xb7\xc9\x4e\xaa\x59\x61\x5d\x47\xf9\x03\xcb\xaa\x78\xa8\x6a\xc5\xf5\x58\x8d\x3f\x00\xb3\x0f\x0c\x15\x35\x97\x6c\x7e\x18\x94\xaa\x79\xb5\x5a\x19\xe1\x93\x05\xa4\x56\x8c\xde\x24\x70\x82\xa5\xc2\xf3\x68\x50\x07\xb3\x08\xd6\xf8\x17\x1c\x66\x1c\x2b\x07\x03\x40\x97\x89\x10\xe2\x1d\x15\xc6\x14\xd8\xb0\xf7\x9e\x24\x84\x3c\x00\x7c\xc3\x3a\x0a\xe9\x21\x53\x28\x67\x15\x50\xd0\x2a\xf3\x64\xbd\x8e\xf3\x53\x6d\x55\x04\x48\x7c\x63\x44\x5e\xb1\x0a\x1e\x19\x59\x27\x90\xd9\xdc\x45\x79\xbc\x95\xb6\xf7\x8a\x3b\xf1\x7a\xbe\x85\x48\x72\x1c\xf5\x6d\x2d\xb3\xab\x39\x8a\x27\x6f\xc1\xe5\x42\xc6\xcd\x70\x39\x81\xf4\xaa\x5d\xa0\xa0\xe1\x61\x6f\x64\xde\x68\xe7\xb4\x79\xcd\xc0\x53\x5d\xf4\x28\x80\xd0\x7d\x5c\xdc\xe9\xb4\x55\x9f\xc1\xfa\xf9\xf1\xca\xbb\x75\xc4\x9d\x0c\x13\xe4\x56\xe9\xbd\x51\x6d\xc0\x27\x26\x37\x6b\x9d\x8f\x95\x79\x3e\x8b\x88\xa4\x88\xd3\x15\x7f\x6a\x41\x5d\x71\xcd\x16\x83\xd8\xe8\x34\x35\x9d\xd4\x39\x0e\x58\x93\x42\x42\x47\x8f\x5b\xcd\x43\x6e\x7a\x67\xdc\x70\xe0\x62\xa2\x2a\x00\x16\x14\xd5\x67\x6e\x51\xc1\x2d\x95\x46\xed\xbd\x8e\xae\x0b\xc1\x10\xc8\x62\xab\x9c\xb4\x34\xaf\x3b\xdd\x7f\xcb\x47\x22\xdd\x0c\x41\x3b\x3b\x38\x9f\x2a\xa7\x90\xc0\xe6\x19\xd4\xca\xfa\x63\x9c\xa6\xc9\xae\x48\x0a\x15\x17\x29\x9b\x7d\xda\x7c\x69\xa2\x38\x3c\x38\x7c\x45\xc2\xde\xe6\xff\xe2\x16\x22\x0c\x73\x5d\xd6\x1f\x8c\xdf\xea\xd8\xcb\x0e\x7c\x14\xbd\x57\x6a\x29\xe3\x48\x1a\x89\xc7\x7d\xa3\x0e\xc7\x7d\xaa\xfa\x6b\xd3\xd5\xbc\xb4\x07\xd8\x2b\xd5\xcb\x80\xea\x02\xf6\x8d\xad\x09\xbf\xe5\x81\xb2\x52\xa3\x38\x64\x38\xe6\x4e\x66\x5c\xfc\x40\x97\x25\x97\x49\xba\xcc\xe3\x2d\xbf\x0f\x50\x35\x7c\x5e\x6e\xe1\xb5\xdd\x8c\x79\x5a\x46\x08\x16\xac\x57\x1d\x3d\x17\x10\x6c\x7e\x79\xed\xd6\xe9\x91\xb0\xfe\x64\x5f\x57\x53\xab\xe8\xc3\xf6\x85\x53\x47\x74\xd1\xd0\x19\x2d\xec\x9a\x95\x25\x83\xd8\xb6\xbe\xb4\x2f\xa3\xa2\xe9\x4b\x2e\x03\xb1\x11\x28\xe3\x2e\xd6\xd9\x65\x43\x5c\x2a\x3c\x7e\xb0\x19\x72\xcd\x6b\x23\xbb\x95\x10\x4f\x66\x41\x72\x28\x6e\xbb\x85\x12\x27\x4d\x8f\x38\x3d\x35\xb3\x14\x35\xc8\xdb\xac\x7c\x60\x27\x85\x15\xdf\xee\xa2\xed\x32\x5e\x9e\x40\xfb\x5c\xe5\x1c\x40\x26\x70\x7c\x50\xe5\x32\xe7\x87\x47\xd8\x1d\x76\xe1\xb0\xf7\xd6\x51\x9a\x04\xfe\x17\xe8\x74\x55\xf3\x3b\xd6\x80\xe7\x0b\xb3\x0a\xf0\xbc\x21\x57\x50\x4b\x83\xf8\xbd\x6a\x71\xa8\x46\x3b\xfc\xb2\x9b\xf8\x58\x1f\x79\xce\x2a\x8d\x8a\xe2\xbf\xfe\x99\xed\xe2\x6d\xf3\x50\xe1\x26\xde\x5e\xfd\x7d\x22\x03\x5c\x46\x9b\xf9\x55\x5e\xad\x34\x31\x84\xfc\xb8\x1f\xc7\xe6\x9e\x73\x6e\x49\xde\x2e\xde\x7c\xfe\xfb\xd9\xe3\xb7\x2f\xfc\x4c\xe4\x42\x0f\x42\xfe\xbb\x58\xe2\xee\x0e\x71\x19\x24\xc1\xa7\x35\xff\x5d\x6c\x69\x7d\x23\xd5\xe4\xe2\xd1\x67\xf7\xbe\x24\xf6\xa0\xb1\x27\xac\x74\x14\xe7\x3a\x13\x74\x88\x43\xd4\xd3\x8a\xaf\xe3\x6d\x59\x90\x29\xef\xf3\xb4\x10\x4f\x84\x9f\x53\xba\x54\x80\xf5\x22\xe9\xf3\x76\xb6\xc0\x4e\xbd\xac\xf8\x02\x78\xaa\x1d\x2b\x2a\x47\x01\xf4\x54\x8b\xcd\x3e\xbe\xc7\x4c\xb0\xfc\x32\xf9\x4b\x69\x20\xf1\x3d\xa9\x1a\xc8\x34\xe9\xb3\x32\xfc\xb9\x46\x0c\xb7\x25\xff\x3c\x66\x03\x5c\x49\x8a\x1b\xa3\xcf\xcd\x94\xe4\xba\xf8\xfc\x2c\xb1\x7b\x87\xcf\xcd\x0b\xde\x37\x7d\xb9\x61\x1e\x52\x63\x58\x87\x24\x89\xbf\xe3\x57\x5a\xb8\x7e\x4f\x88\x46\xea\x4c\x07\x74\x43\x92\x78\x3f\xd0\x13\x49\xca\x00\x67\x24\x29\xe1\xfc\x91\x8d\x9f\x92\x7b\x29\x97\x65\x17\xd5\xcf\x3c\xa1\x3a\xb3\xc7\x08\xd5\x22\xf5\x37\x1b\x22\xf4\xdb\xda\xc6\x57\x65\x1e\xa5\x56\xe8\x38\x27\x02\x05\x1a\x2c\xcc\x7f\xc4\xc9\x7a\x65\x72\x79\x5c\xec\xb2\x6d\x51\xed\xaf\x58\x29\xcd\xd7\xf5\x1e\x8b\xdc\x6d\x68\x74\xaf\x3e\x67\x21\x25\xb5\xda\x8a\xee\x73\x6c\xa9\x54\xf8\x8f\x8a\x5d\x54\xdf\x78\x57\x14\x8b\x97\x99\x94\x60\xe4\x5e\x06\xd7\x66\x52\x81\xfc\xad\xa1\x0a\x95\x69\xee\x6e\x50\xff\x93\x2b\xbe\x26\xc0\x5f\xdc\x40\x61\xf9\xf2\x5b\xcc\xad\xa2\x90\xb9\x01\xae\xe3\x28\x7c\x5a\x9f\x58\x8c\x26\x22\xd3\x3a\x65\xe9\x18\x37\xe4\x53\xcd\xc1\x1e\x1f\xe6\xf8\x06\x12\xd5\xb6\x07\xf3\x5c\x5f\x23\x68\xa1\x47\xef\x60\x00\x1d\xc5\x16\x89\xf7\x50\x8d\xe8\xb5\xf7\x0e\x0f\x0d\x35\x0a\xa6\xa7\x01\xc1\xcd\x67\x17\x86\xf5\xd6\xc5\xca\xf2\xa4\x32\x41\xd3\x21\x7b\xb8\x53\x17\x0f\xec\x11\x3e\xe2\xe9\xda\xba\x56\x86\xe5\xc0\x9a\x20\x5c\xc6\x6b\x8d\x0d\xea\x2a\x18\x55\xfc\x8e\x50\x8f\x68\xd1\x78\x53\x05\x96\x4a\x9d\xa8\x80\xfa\xf7\x1a\x2a\xf6\x76\x98\x89\x9d\xf2\xd8\x41\xa0\x90\xc2\x11\xac\xd4\xa7\x91\xe0\xb1\x6d\x54\x0b\x97\xad\x26\x2a\x68\x15\x66\x17\x03\xa5\xa5\x76\xa0\x79\xd2\x91\x6b\xed\x96\x4f\x66\x9c\xd4\xb3\x2d\xea\x28\x0b\x9f\xf1\x48\x66\xcb\xf2\x4d\xed\x96\x59\xb3\x0f\x37\x5b\x87\x4a\xac\xc5\x6a\x69\xef\xd6\x4f\xa7\x1e\x7e\x99\x9c\xdb\x7b\x0c\x34\xab\x3a\x05\xa4\x72\x95\xc7\x19\x1e\x65\x56\x0c\xfe\x7c\x8b\x7d\xc0\x4b\x7c\x57\xf9\x4c\x4e\xfc\x87\x1d\x6c\xf8\x8a\x00\xf0\xb2\x23\xb0\xb1\x50\xe7\xae\x32\x96\x04\xbd\x5f\x67\x28\x0f\xfd\x73\x18\xe6\xb5\x0a\x99\xb0\x4c\x6b\x57\xa5\xc8\x32\xaf\xb8\x49\x82\x65\x5a\xa7\x2e\x3b\x96\x8a\x48\xb5\x1d\xa3\xaa\x9e\xc6\xd7\x71\x6a\xb9\x72\x85\xf8\x6a\x9b\x11\x9c\x21\x41\x1c\xef\xdb\x0e\x28\x6d\x1d\x05\x0c\xa3\x48\x5d\xe8\xf1\xfc\xbc\x89\x16\x15\x23\x13\xd8\x39\xd9\x9d\x7b\x91\xef\x31\xaf\xe4\xfb\xd3\x7a\x73\xed\x38\xd7\x97\x0a\x07\xb3\x8b\x1d\xcc\xb0\xd9\xf3\xa9\xd9\x33\xee\x12\xcf\xb0\x4b\x60\x38\x43\x82\x60\x97\x00\x80\x2d\x5d\xe2\x1d\xd8\x25\x62\xa4\x08\xee\xa2\x83\xbb\xa4\x5f\x8f\x28\x84\xb2\xaf\x5d\x29\xf5\x8d\x64\xb3\x21\x43\xae\xb7\x1a\x02\x93\xeb\xac\x86\xa3\x4c\x4d\x1b\x84\x56\x13\x07\x1a\xdc\x85\x6f\xaf\x1b\xdf\x1a\xda\x20\x74\x73\xab\x57\x56\x2b\x36\x34\xb1\x28\xf3\xb8\x5c\x5c\x1a\xf7\x4c\x47\x61\x77\x13\x5f\x47\x89\xe0\x36\xc2\x67\xbd\xdc\x6d\xc5\x43\xb5\xae\x9b\x1e\x1d\xde\x79\x15\x74\xcb\x91\x8e\xb6\x11\xe4\x10\xb5\x8c\x37\xdd\x9a\xd3\x82\xa7\x62\xb5\x7b\x75\x22\xde\x1e\x8c\x7f\x55\x1c\xf6\x18\x34\x1d\x3a\x27\x34\x69\xba\x12\x4f\xdf\x84\x2e\xd5\x89\x78\xea\x90\x37\xee\xce\x6b\x7d\xc1\xbd\xfa\x69\x16\x29\x29\x66\x97\x38\xf4\xbe\xb8\x10\x4f\xd9\xab\x53\xea\xb7\xea\xfa\xf5\x8d\x0e\xbd\x5d\xd4\x1d\x2b\x57\xa0\xf7\x0d\x13\x3d\x44\x5e\xcd\xb6\xee\x20\xb9\x69\xc9\x18\x0b\xa0\x2b\x33\x2d\x64\x3e\x47\x54\xec\x21\x7d\xd1\x44\xa8\x1c\xd8\x1b\x2d\x84\x8c\x05\xd9\x9d\xa1\x56\x42\x6c\x3c\x59\x2f\x59\xa9\xf6\x81\x66\x02\xd2\x60\xb7\x37\xa6\x5b\xd5\x30\xf6\x01\xe1\xcd\xc7\x16\xd7\x27\xb7\xa9\x87\x75\xd5\x61\x16\xf9\xa0\x8e\x3e\xd0\x9c\x1f\xa6\x27\x40\xe2\x24\x45\xff\xc3\x7b\x78\x03\x3e\xda\x10\xd5\xed\x87\xb7\x63\x7d\xab\xf4\x54\x53\x20\xbd\x4e\x04\xe5\xb0\xe8\xed\xca\x38\xd6\x06\xbb\xbb\x97\xc4\xdb\x73\x99\x81\xe0\xee\x54\xb9\x15\x0d\x26\x7c\x95\x3f\x8a\x38\x4a\xb5\x19\xf6\xbe\x8c\x9c\x7c\x67\xaa\xbd\x88\x98\xa3\x72\xcf\x2c\x58\x85\x8b\xde\x8e\xb8\x7a\x55\x53\x53\xf9\xfc\x1e\x36\xf5\xb4\x6d\x92\xcc\x49\x61\xf5\x80\x67\xd1\x2e\x54\xd2\x6c\x9d\x1d\x44\xa1\x79\xa5\xfd\x10\x22\xf4\xc5\x76\x5d\xf8\x95\xdc\x6f\x0f\x55\x4a\xda\xca\xcc\x36\xba\x56\x22\x4b\x17\xf2\x44\x46\x6c\x20\x4c\x48\xaa\xa1\x52\xe8\x65\x9e\x49\xd1\x6c\xb6\x1c\x84\xa4\xc4\xdd\x83\x1e\x35\x71\x75\x59\x7b\xd8\x98\x21\xe4\x38\x4e\x33\x66\x26\xa1\x78\x32\xc0\xb8\xd9\x26\xbd\x5a\xa7\xb5\xf4\x70\x93\x3b\x53\xf4\xda\x28\xea\x85\xd8\x83\xc5\xae\x04\x3d\x28\xa8\x1a\xa7\x40\xa0\x47\x03\xfa\x6d\xe8\xe1\xb2\x56\xaf\xa6\x8f\x41\x7b\x15\x1d\xbf\x2f\x8f\xce\xb1\x67\xc2\xf1\x01\xba\xd2\xc6\xf0\x41\xa4\x8f\xc5\x6f\x07\x01\x1f\x44\x7a\x15\x69\x6d\xf4\xb1\x14\x1a\x0a\xe5\x3c\x96\xea\xa9\x69\x1f\xac\x24\xc7\x23\x0d\x72\xad\x7a\x4e\xa5\xde\xfc\x01\xf9\xca\xea\xdc\x6f\x3e\xc9\xfd\xe6\x37\x4f\xda\x08\x67\xba\xe8\x0e\xaa\x74\xdb\xed\xd3\x59\xac\x87\x9f\xbc\xab\x4d\x6a\x39\x8a\x65\x38\x76\x25\x2d\x2d\x01\x15\xe1\xf8\x5d\xa5\xd8\xb2\x1d\xde\x3b\x5a\xc2\x07\x74\xc8\x51\xe9\x2a\x37\x92\x07\xfa\x52\x8f\xd6\x2f\x2a\xcf\xe6\xd1\xfa\x47\x5f\xc1\xe1\xfd\x74\x5c\xfa\x6a\xfe\x3f\xbf\xcf\xf6\x68\x7d\xfe\x29\x57\x4f\x86\x55\x1c\xde\xef\x9f\x70\x85\xd2\xc1\x37\x7c\x78\x9f\xc0\x8e\xa9\xc3\x3b\x42\x47\xf7\x00\xe9\x1f\x93\xac\xc4\xed\xd1\x7c\xd0\x47\x1b\x2a\x8f\x3e\xe1\xf2\xc2\xb0\x8a\xc3\x87\xca\xb1\x6b\xd0\xb5\x41\xcc\xc7\x6f\x22\x34\xd1\x49\x49\x16\xab\xb0\x1b\x06\x64\x59\x4b\xe1\x80\xcd\x46\xe3\x74\x83\x9c\x28\xc4\xca\x4b\xb7\xa7\x48\xda\x75\x21\x4d\x3b\xfa\xdd\x38\x4d\x02\x07\xce\x58\xdf\x87\x3d\x26\x67\x48\x8b\xa7\xd1\x8c\x9e\xda\x31\x68\x8a\x0f\xb9\x04\x0d\x71\x55\xce\x40\x53\x74\xd1\x0d\xd8\x7f\x79\x2b\xb1\x44\xf2\xa5\x5d\x6f\xac\xf9\xd5\xfa\xef\x03\x19\x3c\x0a\x31\xac\xf9\x9b\x1b\xab\x12\x38\x90\x5e\x62\xb2\xa8\xfe\x51\x5c\x72\xea\x57\x23\x4a\xcf\xcb\x5a\x6a\x45\x28\x46\x2f\x4d\xe4\x62\xab\xe1\x51\xc7\xc4\x67\x92\x01\xc8\x05\xfc\x29\x62\xfc\x50\xa0\x89\x2a\xca\x6f\x04\x47\xf9\x19\xb0\x08\xbe\x46\xd5\x9d\x0c\x1c\xf3\xdf\x8f\x4c\xb7\x15\x3d\x84\x7f\x94\x1b\x47\x87\x31\xaf\x8e\xd4\x3f\xac\x51\xea\x0b\x45\xe6\x83\xc1\xe4\xe4\x0d\xc6\x37\x8b\x96\x56\xe2\x1e\x50\xb1\xd9\x51\xa4\xd9\xf4\x2c\x45\x5a\xb3\xb7\x64\x03\xf2\x86\x30\x34\x0a\x9d\x8e\x51\xb6\x5d\x3b\x41\x7a\x58\xe2\x90\x5e\xe9\x4f\xec\x98\xac\xa9\x0e\xc4\x7b\x51\x6b\xeb\x48\xf9\x61\x17\xc5\xc3\x2d\xc6\x8b\x48\x68\xf1\x68\xb4\xa0\x33\x0b\x62\x57\xa1\xf6\xaf\xd6\xec\x24\xde\x68\x0d\x2a\x1d\xb5\x1f\x71\x4c\x7c\xe9\xc2\xe6\x4c\x42\x07\xad\x31\x9e\xfe\xd9\x2b\x00\xed\xd3\xbf\x75\xc8\xfc\xaf\x63\xd1\x7c\xfa\xd7\x51\x31\x9f\xfd\x5b\xa9\x74\xf2\x86\xa9\xa7\xc9\x4f\x77\xa1\xef\xa0\x56\x75\x5b\x15\x18\xb7\xf6\xeb\xa2\xe0\x13\x2c\x0a\xc4\x8b\x30\xba\x6d\xf1\x7f\xa6\x91\xfb\xfc\x33\x8a\x4e\xa4\xfa\xcb\xa6\xe1\x78\xa4\xb9\x6c\x0a\x46\x35\x8d\xed\xbe\x61\x4d\x26\x2a\xfa\x45\x5f\x25\x54\x4c\x2a\x01\x7d\x25\xc4\xb8\xd9\xff\x59\xd7\xf5\xe0\xad\xb4\xa2\xd5\x86\x8e\x34\xa2\xa2\x01\x49\x0f\xd9\x28\x6d\x00\xe6\x11\xfc\x6a\x72\x8f\x60\x72\x0f\x13\xf6\xa7\x72\xc9\x84\x9f\xd9\x21\xf3\x75\x7a\x31\x9c\x5e\xba\xa9\xcf\xbf\x6b\x45\xdf\x5b\x7d\x3a\xaf\xe7\xef\xed\x5d\x9e\xad\xf3\xb8\x28\x4e\xeb\xbf\x59\x45\x19\x95\xc9\x42\xf6\xb8\xb2\x6f\x8d\x88\x97\xd1\x9a\x5c\x0a\x74\x80\xd2\x30\xe4\xe6\x7d\x25\x07\xc9\x99\xae\xbf\xc7\x62\x3e\x75\x34\x05\x8b\x07\x0e\xfc\xe3\x47\xec\x2d\x50\xca\xee\x23\xfa\x97\xbd\x75\x13\xcf\xdf\x27\xa5\x15\xed\x76\x71\x94\x47\xdb\x05\x79\x25\xd2\xda\x64\x1f\x81\x8f\x85\xfc\x2d\x93\x3e\xf1\xef\x85\xf3\xdc\x00\x21\x0e\x6e\x10\x06\xb1\x9c\x91\x0e\x3d\xdf\xad\xe3\x7d\x36\xa3\xcc\xd7\xbd\x70\x1d\xa5\x57\x31\xe0\xf6\xc6\xac\xc0\x34\xaa\x86\xd6\x04\xe6\x11\x94\x94\x59\x89\xfe\x2f\x54\xe1\x3f\xbf\x71\xbe\xf9\x1b\xa2\xf4\x09\x85\x4b\xa4\xd6\xfe\x7a\x18\xa7\x80\xe2\x5b\x84\xd8\x1a\xb6\x34\x0b\x16\x32\xfd\xcc\x8c\x38\xc4\x9f\xf0\xdb\xac\xdf\x90\xd8\xc5\xab\x9a\x0a\x4d\x31\xa3\x98\x6c\xb7\x71\x6e\xc5\x69\xbc\x89\xb7\xe5\xa7\xe8\x88\x2e\x0a\x09\xc8\x8a\xbe\xd7\xe6\xd7\x8f\xae\x40\xaf\xb9\x31\xa5\xd2\x3b\xe9\xb4\x0e\xbb\xb8\x5a\x2c\xb8\x31\x4d\xc4\x35\x72\xe7\x63\x37\xd4\x00\x76\x18\x40\x26\xb4\x0c\x06\x92\x44\xe6\x26\xca\xb7\xc9\x76\x2d\xf1\xbe\x0a\x43\x27\x18\x6b\x00\x3b\xf0\x6e\x42\xcb\x80\x77\x89\xcc\x32\xda\xae\xe3\xbc\x9d\x75\x01\xee\x10\xce\x65\x52\x7d\x18\x47\x2f\x22\xc6\x4b\x69\xf6\xa2\x05\x40\x56\x30\xfe\x29\x72\xbf\x9a\xec\x45\x72\x24\x85\x95\x82\x26\xf6\x69\x09\xcf\xf2\x35\xb9\x84\xe2\x8d\x22\x88\x2a\x74\x86\xcd\x82\x80\x8d\x44\x15\xdf\x88\xf2\xc7\x61\xbc\xb9\xff\xef\xf7\xf1\xdd\x2a\x8f\x36\x71\x81\xce\x55\x6b\x66\x56\xd1\x32\xde\x3b\x43\x26\xbd\x4e\x99\xd5\x3f\x1c\x66\x4a\xb7\x39\x14\xc9\x22\xba\x8e\xf3\xcd\xdf\xa7\x9d\xa0\x1f\xa2\x96\x47\xdb\x64\x83\xe3\x53\x24\xbe\x90\x6f\xb7\x6a\x5b\x94\x0f\xec\xb0\x18\xac\xb2\xfc\x26\xca\x97\x05\xc3\xd4\x2a\x8d\x8a\x4b\x4b\xe8\xfd\x53\xa1\xbc\xd1\x44\xc6\x92\x20\x1d\x18\xd8\x2e\x31\x24\xd9\x55\x39\x70\x5b\x29\xab\x54\x54\x59\xe3\x61\x96\xef\x54\xd4\x59\x9e\x5f\xdb\x2f\xf4\xb6\xb1\x1d\xbf\xad\xc1\x06\x13\x9e\xb2\xed\x9f\x64\xb2\x54\xf6\x8b\x38\xde\x75\x5d\x22\xaf\x47\xaa\x2f\x5f\x58\x57\xc0\x83\x46\x39\x87\x69\x70\x0e\x99\xce\xf4\x64\xfb\xcc\x6c\xdc\x10\xd7\xd1\x57\x59\x13\x1d\x8e\x81\x4d\x19\xd5\x36\xc5\x35\x37\x29\x60\x1f\x48\xf3\x47\x3b\xea\x21\x73\x9c\x11\x75\xf3\x69\x4f\x35\x23\xa4\x59\xb6\x8b\xf3\x6a\x4e\xc0\x47\x18\x68\x93\x51\x66\xf8\x17\xfa\xc1\x4e\x71\x19\x7b\x71\xae\x09\xc2\xe6\x00\x1a\xfb\x2b\x6e\xc8\xa4\x95\xb8\x0a\xd3\x5c\x6e\x66\xc4\xda\xc5\xf4\xe9\xe9\xd0\x3d\xb4\x42\x5b\x71\x3f\x0c\xf8\xc7\x07\x07\xc9\x76\x95\x6c\x13\xf6\x3a\xef\xe0\x1b\x45\x50\xb5\xbc\x6e\x68\xdb\x71\x92\x8d\x29\x71\x63\x87\x43\x81\x61\xb2\xca\xaa\xf3\x3b\xf2\x85\x64\xf1\x58\x67\xf9\x34\x58\x6e\x55\x68\x64\xbd\xac\x46\xa3\x06\x64\x4b\xf2\x01\x0d\xec\x46\xfe\xe4\x58\x0a\x27\x1d\x17\x5d\x0e\xf2\x62\xad\xde\x4a\x43\xdb\x67\x82\xf6\xa8\xf9\xb0\x89\x61\x8e\xc8\x16\x93\x97\xa6\x2a\xd4\x9d\x66\xc4\xa3\x9d\x53\x27\x2e\x6a\xa9\xb7\x3e\xca\x53\x76\x53\xbf\x5e\x27\x47\x12\x43\x56\x81\x5a\x99\xf9\xd7\x32\x2a\x23\x8b\x9a\x9a\xca\xd0\xd0\xd3\xd3\x2e\x88\x5e\x5f\x44\xbf\x41\xa4\xaf\x26\xb5\x77\x1c\x47\x21\xe8\x5b\x75\xd8\x17\x71\xd4\x17\x71\x2c\x35\x36\xec\xd8\xd8\x49\xdf\xaa\xa7\x7d\x11\x5d\xa7\x37\x66\x6f\x6d\x72\x3d\x49\x50\xae\xc1\x78\xe6\x69\xf8\xbd\x6b\xef\xad\x51\x6e\x6f\x95\x72\x7b\xeb\x94\x2b\x2b\x95\xdb\x55\xab\xdc\xde\x6a\xe5\xf6\xd6\x2b\xaf\xb7\x5e\x79\xfd\xad\x94\xac\x57\x5e\x57\xbd\xf2\x7a\xeb\x95\xd7\x5b\xaf\xbc\xde\x7a\xe5\xf5\xd6\x2b\x4f\xd6\x2b\xaf\xab\x5e\x79\xbd\xf5\xca\xeb\xad\x57\x7e\x6f\xbd\xf2\x7b\xeb\x95\x2f\xeb\x95\xdf\x55\xaf\xfc\xde\x7a\xe5\xf7\xd6\x2b\xbf\xb7\x5e\xf9\xbd\xf5\xca\x97\xf5\xca\xef\xaa\x57\x7e\x6f\xbd\xf2\x7b\xeb\x55\xd0\x5b\xaf\x82\xde\x7a\x15\xc8\x7a\x15\x74\xd5\xab\xa0\xb7\x5e\x05\xbd\xf5\x2a\xe8\xad\x57\x41\x6f\xbd\x0a\x64\xbd\x0a\xba\xea\x55\xd0\x5b\xaf\x82\xde\x7a\x15\xf6\xd6\xab\xb0\xb7\x5e\x85\xb2\x5e\x85\x5d\xf5\x2a\xec\xad\x57\x61\xff\x15\x7b\x6f\xbd\x0a\x7b\xeb\x55\x08\x2c\xda\xbb\xea\x55\xd8\x5b\xaf\xc2\xde\x7a\x35\xea\xad\x57\xa3\xde\x7a\x35\x92\xf5\x6a\xd4\x55\xaf\x46\xbd\xf5\x6a\xd4\x5b\xaf\x46\xfd\xb7\x82\xbd\xf5\x6a\x24\xeb\xd5\xa8\xab\x5e\x8d\x7a\xeb\xd5\xa8\xb7\x5e\x8d\x7b\xeb\xd5\xb8\xb7\x5e\x8d\x65\xbd\x1a\x77\xd5\xab\x71\x6f\xbd\x1a\xf7\xd6\xab\x71\x6f\xbd\x1a\xf7\xf7\x31\xc8\x7a\x35\xee\xaa\x57\xe3\xde\x7a\x35\xee\xad\x57\x93\xde\x7a\x35\xe9\xad\x57\x13\x59\xaf\x26\x5d\xf5\x6a\xd2\x5b\xaf\x26\xbd\xf5\x6a\xd2\x5b\xaf\x26\xbd\xf5\x6a\x22\xeb\xd5\xa4\xb3\xf7\xaa\xb7\x5e\x4d\x7a\xeb\xd5\xb4\xb7\x5e\x4d\x7b\xeb\xd5\x54\xd6\xab\x69\x57\xbd\x9a\xf6\xd6\xab\x69\x6f\xbd\x9a\xf6\xd6\xab\xe9\x48\x6e\x71\x57\xed\x98\x8e\x7b\xd7\xde\xdf\x2d\x3a\x95\xf9\x9e\x74\xf5\x9e\x39\x0e\xe0\xae\x04\xfa\xbb\x8e\x0b\x11\xa8\xed\x81\x08\x13\x8a\x42\x63\x8e\x04\x14\xcd\x11\x82\x78\x2a\x4b\x29\xd1\x08\x20\x73\x4a\xe2\xa9\x0e\xa5\x44\xce\x29\xbb\x13\x5a\x44\xf9\x12\x27\x21\x68\x4e\x7a\x4e\xc1\xaf\xa4\x2a\x52\xb8\xca\xb2\x32\xce\x25\x1c\xf1\x33\x3d\x1d\x62\xc2\x48\x99\x60\x99\x11\xf3\x72\x97\xed\x4e\xf0\x8b\xb5\xea\x67\xf5\x20\xae\x1e\x19\x31\x2d\x0a\x46\xc1\xad\x48\x4c\xd1\x1a\x49\x59\x5a\x9b\x00\xf3\x6e\x97\xd9\x4e\xcb\x36\x03\x20\xb2\xa2\x29\x62\x90\xf7\xec\xbb\xc6\x67\xe4\xe4\x4e\x3e\xda\x3b\x05\xbe\x49\x3d\x57\xc7\xfa\x06\x52\xf4\x6f\x1d\x88\xcd\x7f\xa1\xfd\x26\x13\x7f\x64\x50\xb3\x52\xca\xe6\x0c\x00\xfd\x50\xd3\x44\x12\xe7\x9f\x7e\x62\xde\xf5\x60\x1f\xe6\x21\xcf\xd8\xc0\xaf\xdb\x88\x14\x1f\xfd\x97\x90\x2e\x95\x0f\x59\x43\x2a\x2f\xe1\xcc\x56\x49\x5e\x94\xd6\xe2\x32\x49\x97\x7b\x01\x61\x0a\x22\xa4\x91\x02\xde\x91\x60\x91\x85\xdb\xb3\xb9\x0f\x47\x8e\x0c\xc5\xe8\x82\xaa\x84\x6a\x04\x69\x9f\x3b\xc0\x09\x84\x95\xe0\xf8\x85\x77\xf8\xe1\x23\xd2\x4f\x48\x42\x1c\xbd\x33\x45\x8f\xb4\xd5\x83\x23\xe6\xf3\xec\x86\x4b\x71\xec\x48\x0f\xd8\x18\x52\x79\x44\x9f\x4d\x5f\xe0\x17\xb3\xad\xbf\x85\x04\xd7\x67\x92\xd8\xc1\x71\x8c\xb5\x8c\x30\x41\x0e\x8f\xb1\xd9\xab\x1f\x9b\xd1\x61\xb2\xfd\xcc\x13\xd1\xa2\x91\x3e\x6f\xae\x46\xf8\xfe\x90\x0b\x5b\x24\x5a\xa5\xa6\xd0\x3a\x19\xc0\x06\x0b\x88\x02\xa0\x35\x8e\xfc\x69\x98\xf3\xd1\x92\xda\x36\x98\x9b\x78\x11\x1c\xb6\xf5\x66\x0d\xe8\x58\x57\x9b\xa9\x22\x8d\xbe\xff\x9f\x99\xb5\x29\xac\x64\xbb\xbb\x2a\xad\x5d\x1a\x2d\xe2\xcb\x2c\x5d\x72\x36\x9b\xe9\xb7\xd3\x59\x9e\x65\xa5\xa2\x4f\xe1\xf4\x41\xc5\x0e\x05\x9a\x03\xe2\xd7\xbd\xee\xeb\x63\x4d\x24\x2a\x82\x7f\x30\x66\x95\xf9\xc2\x81\x34\x11\x34\x55\xb5\x03\xb7\x8e\xf0\xaa\xa3\x65\xea\x39\x83\x79\xe9\xbf\xb9\x46\x7e\x95\xa7\x0f\xaa\xc5\xda\x0c\x05\xff\x7f\x5b\x5c\xaf\x1f\xde\x6e\xd2\xb3\xc5\x65\x94\x17\x71\xf9\xcf\xab\x72\x35\x39\x1d\xfa\xe7\xc5\xf5\x7a\xe8\x39\xc9\x72\xe8\x3f\x1d\x7a\xde\x8b\xe8\x2e\xce\xff\xc7\x1b\x7a\xde\xd0\x73\xd0\x52\x6f\x1b\x6d\x62\xa6\x6c\xe8\x39\xa4\xf4\x76\x93\x6e\x0b\x5c\x72\x59\x96\xbb\xa1\xff\x78\xe8\x3d\x1b\x7a\xcf\x6e\x6e\x6e\xec\x1b\xdf\xce\xf2\xf5\xd0\x7b\xe6\x39\x8e\x33\xf4\x9e\xa1\x4a\x2a\xa4\xeb\x24\xbe\x79\x92\xdd\x62\x34\x67\xe8\x55\xa5\xce\xd8\x23\xff\xf1\x86\xfe\x77\x43\xe7\xf1\x10\x95\x90\xff\xfb\xe7\xcb\x78\x55\x00\x05\x3c\x10\x7a\xe2\xbf\x05\x8a\xf9\xbf\xbd\x48\x0b\xcb\x1d\x7a\xe7\x5d\xe0\x2b\x36\x87\xe3\x27\x86\x28\xec\xff\x57\x49\x9a\x22\x01\x39\xdb\x6c\x1b\x0f\xfd\x3e\x34\x8a\x32\xcf\xde\xc7\xd6\x26\x29\xe3\x3c\x4d\x36\x49\x89\x09\xba\xce\x41\xe4\x90\xca\x61\x4a\xe1\xee\xb6\x03\xa9\xf1\xd3\x8e\xa2\xee\x29\x3a\xcc\x27\xe6\x70\xe8\xf9\x38\x4c\xe9\xa0\x26\x93\x40\x70\x22\xbe\x4f\xd6\xe4\xfe\xda\x22\x34\x19\x47\x46\x1d\x8d\x4f\xff\xbc\x1a\x90\x8a\xe1\x82\x0a\x15\x03\xce\x3f\x47\xc9\xbf\x86\xfe\x77\xbf\xe6\x71\x9a\x45\xcb\x38\xff\x9f\xb1\x77\xeb\x61\x24\x5a\x26\x63\x2d\x92\x7c\x91\xc6\x43\xcf\x41\x73\x3d\x1e\xfa\x44\x27\x2a\x19\x2d\x88\x35\xf0\x47\xe4\xf7\x1d\xff\x3b\x27\x3f\x7d\xf4\xf3\x19\x58\xc5\x2e\x2a\x2f\xe5\x0a\xa8\x19\xc3\x5f\x2e\xdc\xc0\xf6\x87\xde\xf9\xc8\xb1\xa7\x8f\x2b\x6a\xe7\xe8\x3f\x0e\xf9\xb7\x32\x06\x55\x95\xe7\xbe\xca\x0e\x0d\xbd\x67\xa8\x1e\x5c\x86\xc5\x78\xbd\xc6\x3f\x4f\x70\x1e\xb4\x64\xbb\xac\xd6\xac\xe0\x9b\x75\xf2\xeb\xc7\xf5\x84\x42\xff\xb4\x36\x4b\xe1\x61\x40\x9a\x7d\x63\x22\x4c\x1a\xcc\x17\x16\x44\xa6\x88\x27\xa4\x53\xe9\x7b\x51\x3f\x41\x88\x16\x29\x34\x59\xed\x54\x5c\xf3\x4f\xf9\x6a\xc8\x8a\x06\xae\x65\x2f\xbc\x26\x8f\x44\x82\x17\x52\x10\xca\x75\x9c\x17\xec\x9e\xf9\xeb\x8c\x65\x62\x46\xbf\xce\x58\xff\x61\x33\xd6\x0a\xfd\xef\x78\x33\x96\x63\xbb\xe1\x97\x3f\x69\x8d\x83\x85\x1b\x7b\x5f\x27\xad\x2f\x7a\xd2\x92\xad\xf2\x36\xbe\x2a\xf3\x28\xb5\x9c\xaf\x76\xf9\xab\x5d\xee\x46\xee\x3f\xcd\x2e\x33\x77\x58\xfe\xff\x6a\x3b\xd1\x79\x3e\xfa\x6a\x99\xbf\x04\xcb\xbc\xb8\x8c\x17\xef\x99\x6b\x55\xe8\x46\x69\x5f\x23\x5d\x2d\xbd\x93\x6c\x8b\x5b\xe2\xda\xae\xc6\xa4\x56\x8d\x70\xa8\xf0\x76\x79\x5c\xc4\xf9\x75\xfc\xb8\xd8\xc5\x8b\xf2\x65\xc5\x09\x86\xbe\xbd\x48\x96\x6f\x2e\x92\xe5\xd0\x73\x36\x71\x5c\x1e\x60\xd7\x09\xd2\xe3\xdb\x34\xd9\xbe\x6f\x43\x76\xa7\xd3\xe9\xd0\x7b\x86\x61\x11\xfa\x2a\x5b\x5c\x15\xd1\x3c\x25\x33\xcd\x2a\x4a\x8b\x18\x97\x44\x79\x12\x59\x78\x2f\x86\xcb\xca\xfc\x8a\x14\xe5\x19\x85\x4f\x36\x6b\xd2\x5f\xb5\x16\x60\x8b\xfb\x14\x41\xd2\xbd\x38\xd6\x2c\x56\x3d\x72\x2b\xb1\xb2\xab\xb2\xda\x06\xa1\x22\xe6\xb7\x55\x11\xa2\xea\x59\x6b\x8f\x6f\x57\xf3\xd4\xb9\x37\xb6\x47\xd3\x4a\x4d\x6c\xaf\xfa\xc3\x1d\xdb\xde\x38\x72\x89\x02\xb1\xca\xe4\xda\x81\x6b\x55\xff\x49\x2b\xb8\xe9\x0b\xdf\xc5\x18\x63\xdb\x9b\x2a\x11\xc8\x1f\x6f\xeb\x36\x31\x4a\xc7\x68\xdc\xc9\xbd\x3d\x2f\xb7\x56\xb1\x19\x50\x75\x3b\xb5\xa3\x34\xce\x51\x0a\x0d\x9c\x10\x68\x40\x3e\xe0\x33\xa4\x79\xb9\xad\x41\x1b\x2f\x6c\xc8\x6c\x24\xf1\x0f\x76\x27\xd9\x7c\x61\x41\x70\xcd\xc9\x02\x69\x74\xf9\x80\xf0\x71\xd2\x50\x67\x1f\x85\x6f\x76\xbb\xd5\x4f\x42\xd8\x61\x6b\x69\x0e\x0c\x68\xd2\x5a\xc7\x19\xb2\xb7\x42\x2b\xb2\x7b\x67\x28\x67\x7d\x74\x50\xce\xc7\x32\x93\x4b\xfc\x11\x2e\xbb\xb7\xcb\x4a\xb1\x68\xea\x92\x45\x96\xa6\xd1\xae\x88\x67\x45\xbc\x8b\xf2\xa8\xa4\x37\xf1\x2c\x64\x0c\x67\x45\x96\x26\x4b\xfa\x89\x7b\x64\xb4\xc1\x47\xf7\xde\xa6\xe1\x64\x14\x82\x39\xda\xa1\x57\x30\x5c\xdf\xf7\xe7\xfc\x93\x80\x67\xd0\xa9\x2f\x49\xd8\x29\xbc\xa3\xcf\x1e\xf4\xa0\xc6\x0c\xca\xcb\x53\xfa\xb7\xe5\xbe\x49\xd1\x40\x7a\x8b\x3b\xcc\x18\x33\xcc\x97\xd9\x0e\x6a\x67\xf5\x19\x6a\x6b\xf5\x9d\x6f\x6f\xfd\xa8\x58\x58\xc1\x0d\x90\xcb\x7b\x80\x7f\x60\x57\x0a\x76\x21\x90\x43\x41\xd1\xb1\x90\xed\x1a\xfe\xed\x34\x5e\x95\x4d\x23\xd0\xcf\x3d\x43\xa2\xfa\x2d\x40\xb3\x07\x81\x02\x26\x78\x46\x88\x93\xa1\xfb\x48\x5d\x29\x21\x7a\x5f\x3a\x8e\xe2\xe5\x8a\xcd\xee\x44\x1a\x21\x9c\x04\x9e\xa5\x71\x59\x56\xca\x51\xad\x16\xaa\x76\x3b\x3e\xd8\xc1\xee\xdc\x8b\x7c\x4f\x6c\x30\x56\x66\x2a\x4d\xfc\x0b\x92\x3f\x29\x81\xba\x80\x14\x81\x5a\x87\x4e\x89\x06\x38\x27\x01\x69\xdf\x3c\x5b\xde\x0d\xca\x9c\x15\x47\xa5\x21\x7a\x84\x87\xe8\xbf\xfb\x23\xe9\x48\x23\xeb\x38\x5a\x0e\xca\x4b\xae\x6b\xa4\xfc\x41\x0d\x91\xaa\xb7\x9a\x81\xc4\x75\x1a\x21\xc4\x1c\xf7\x69\xe8\xa0\x23\x47\x98\x50\xd5\x4c\x86\x4a\x25\x28\xf6\xd7\xd2\x84\x55\xd2\x21\x6a\x6e\x5b\x2b\x69\x6f\x06\xa9\x43\xd9\x12\x6b\x91\x6d\x76\xd1\xa2\x6c\xcc\x40\xf3\x65\xc9\xa5\x71\xc6\x39\x7f\x05\xe3\x6a\x7b\x61\x43\x8b\xe0\x53\xcd\xad\xa5\xbd\xaf\x2f\x28\x8b\x4c\xf2\x2f\xb3\x28\x88\xec\xb9\xa6\xf0\x3d\x74\x90\x05\x52\xda\x14\x89\x07\x6a\x23\x00\xe6\x04\x3b\x03\xda\x76\x25\x59\xc0\x0c\xc9\x55\x80\xaa\x84\xfa\x13\x68\x3d\x2e\x80\xda\x8f\x4b\x84\xd1\xaf\xb2\x3e\x52\x14\x03\xcc\x1b\x52\x50\xcc\x5e\xb6\xb2\xca\xbb\x5d\x2c\x59\x8c\x4b\x55\xbb\x0c\x70\xd5\xd6\xa6\x17\x27\x26\xd2\x36\xe1\xea\x50\x33\xd4\x8f\xf9\x66\xac\x1f\xc4\xfb\x81\x96\x0f\xae\x54\x6d\xa3\xcc\x85\xfe\x69\x8d\x69\x77\xbe\x0d\xe5\xfd\x69\xcd\x33\xa9\x73\x9b\x61\x78\x80\x0c\x7d\x34\x50\xdc\x0e\x2a\xf3\x51\xce\x1c\x98\x36\xb2\xb4\x06\xe9\x2c\x3b\x2d\x23\xe4\x3a\x94\xd6\xac\x05\x11\xb0\x05\x67\xdc\xf4\x34\x52\x4a\x4d\xa5\x41\x06\xb5\x02\x0b\x8f\xd3\x16\x50\x75\xa7\x2b\x2b\x51\x91\x94\x28\xfc\x7f\xc9\x66\x97\xe5\x65\xb4\x2d\x8d\xe4\xab\xa4\xab\x5e\xe3\x0a\x4c\x4a\xab\x83\x23\xad\x11\x08\x7e\x9b\x28\x54\x60\x62\xad\x21\x54\x2d\x59\xad\x67\x59\x5a\x26\x3b\xf8\xd9\x63\x39\x8c\x47\x9c\xce\xeb\x33\xdc\xeb\xa4\x48\xe6\x69\x5c\x13\x7c\x44\xff\x52\x3f\x96\x82\x20\x92\x34\x29\xef\xe8\x81\x6f\x9d\x70\x8e\x4d\xa2\x45\x3e\x32\x59\xe0\xa0\x27\x94\x9b\x14\xb8\xa1\x53\xd7\x89\x5f\x49\x94\x6a\x3e\xad\xcb\x91\xef\x43\xcb\x19\x69\x46\xf3\xb8\x7c\x1b\xf1\x59\xbc\xd9\x95\x77\x6d\x55\x60\x28\x9d\x08\xee\x79\x0a\x7b\xe2\x1a\x91\x0a\xf8\x18\x4d\xea\x40\xc9\x56\xab\x22\x2e\xe9\x8a\x86\x7e\xe5\x96\x39\xf4\x23\xcd\x66\x33\x9f\x4e\x57\x8b\xfa\x2b\xb3\x54\x52\x77\x61\xdd\xca\xba\xa0\x9e\x0b\xd5\xb0\x03\xb1\x44\x46\xa6\x3b\x45\xc7\xe1\xb6\x89\x23\x69\x9b\x18\xc8\xdb\x44\xa2\x0f\x40\x60\xf9\x6a\x05\xfb\x0c\xa4\xf8\x43\x39\x4c\xcc\x0e\x9a\x3d\x37\x75\x09\x78\x70\x4c\x78\x35\xc0\x50\xbc\x28\xe3\x4e\xc1\x01\xc7\x4d\xaa\x46\x52\xae\x9a\x87\x6b\xb7\x04\x1d\x99\x13\x76\x64\xca\xba\x54\xdf\x66\x30\xef\x0d\x09\xc7\xa0\x57\xea\xa0\x7d\xb9\xd1\x84\x51\xcb\x0e\x9a\x47\x4f\x9c\x46\x14\x4c\xab\x99\x57\x81\x89\x00\x1a\x57\xc1\x00\xa9\xdb\x80\xed\x29\x64\xae\x90\x3d\x04\x0a\x49\x20\x32\x83\xaa\x9c\x7e\x79\x22\x5c\x32\x2e\x48\x68\x15\x4f\x7d\x35\x18\x79\x53\xfe\xaf\x29\x30\x16\x75\x48\x55\x19\x50\x60\x6e\x49\xa6\xd7\xe0\x76\x51\x77\x54\x4f\xc4\x93\xb1\x76\xd2\x74\xa9\x75\x43\x9b\x26\xc9\xda\x29\xeb\x98\xb1\x7a\x4a\x8a\x7d\x0c\xed\x64\xa5\xdd\x47\x43\x59\xfc\xff\x64\x2d\x25\x82\x43\xbd\x86\xbc\xb7\x2d\x66\x56\xdc\x5f\x72\xae\x5f\x85\x7a\x6a\x65\xdd\x41\x45\x59\x3a\x1a\x35\xc5\x57\x8f\x38\x0b\xca\xb6\xb2\xbf\x11\x85\x94\xac\xb3\x1d\x95\x54\xdd\x44\x4d\xfb\xda\x51\x06\xfd\xff\x9c\x92\x6a\x4c\xa9\xe4\x49\xe8\xa0\xa5\x87\xda\x51\x86\x8c\xa1\x8e\x52\x3b\xca\xb6\xb2\xbf\x29\x6d\x53\x52\x13\x6b\xda\x4d\x47\x7b\xdb\x50\x6c\x3c\x65\xe1\x88\xcf\xba\xa0\xee\xa6\x49\xba\x59\x29\xfd\xc7\xa8\x74\x9b\xf1\xc4\x9d\x02\xeb\xe5\xc1\x66\xd3\xc4\x5e\x3a\xf4\x81\xbd\x80\xb8\x6e\x0d\xed\x65\xbd\xf9\x56\x9b\x43\x95\x22\xb2\xdb\x65\xb5\x2a\x62\xc9\x18\xeb\x62\x5f\x43\x89\x2c\xa4\xe2\x62\x2a\x23\x85\xff\x53\x9a\x08\x5b\x48\xd2\x6b\xb0\x2e\x1e\x6a\x1c\x0d\xac\x22\x4d\xe9\x0a\xa9\xa2\xce\x2a\xea\x34\x51\x56\xa2\xee\x8a\x08\x68\xb3\x56\x13\x6f\x65\x67\x85\x81\x80\x6e\x8b\x3d\x7b\x15\x4b\x26\x5b\x6c\xfa\x90\x2d\x36\x34\xdd\x0d\x48\x74\xb3\xec\x43\x74\xb3\xdc\x33\x9a\x05\x28\xcb\xba\xd7\x48\x5c\xef\xb9\x17\x1a\xeb\xdd\xfa\xbc\xdc\x3e\xec\xe4\x38\x31\x47\xc0\x6a\x0d\xc1\x8b\x37\x3b\x43\x83\x05\xae\x59\xbd\xdc\x72\x43\x57\x35\x52\x6c\xb8\x5e\x4d\x85\xdc\x2d\x59\xdb\xe3\x45\x89\x82\x84\x16\xd9\x76\x2f\x5e\x9e\xa5\x10\xc5\xf5\x7a\xbf\xcb\x92\x6d\x65\xa7\xe2\xeb\x78\x5b\x16\xf4\xa8\x94\x4a\x2d\x4f\xd6\xeb\x38\xc7\xae\x33\xb9\x72\xd9\xf1\x77\x8f\x2a\x5d\x46\x65\x2c\x3e\x05\x88\x2f\x4d\xde\xe4\xd1\x6e\x17\xe7\xcc\x95\x56\x94\x0c\x7c\x95\x94\x94\x28\x13\x51\xc2\x7c\xc5\x74\xd1\x63\xb0\xd5\x97\x3c\x4b\xf7\x72\x2c\x0a\x77\xe5\x18\xbe\xaf\xcc\xde\x07\x47\x10\x45\x19\xe5\x00\xf5\x01\x62\x77\x86\xae\x7b\xe6\xf1\x75\x1c\xa5\xa7\x5a\x98\x45\x1a\x47\xf9\x9e\x3f\x6f\x16\xe1\xad\x65\x82\x02\xc7\x96\xf5\x6b\x04\xd1\x38\x9a\xb8\x1a\xc0\x01\xbe\x47\xaa\x01\xb0\xf1\xbd\x66\xfc\x15\xdf\x2c\x35\x26\xde\x74\x4b\x6b\x0d\x65\x7c\x5b\x46\x79\x1c\xb5\x02\x16\x71\x1a\x2f\x4a\x9e\x07\xf8\x64\xa7\x9d\x3f\xc4\xda\xbf\xca\xbb\x5d\xfc\xcf\x3c\xda\xae\x63\xe6\x19\x80\x22\x4d\xd0\x64\x70\x79\xb5\x99\x43\x79\x3a\xcc\xda\x5e\x5c\xcd\xab\x86\xb5\x4a\x6c\x73\x95\x96\x89\x78\x01\x3e\xcf\x6e\xb0\x8e\x55\x2a\x3d\xc3\xb7\xad\x60\x4c\xa8\x93\xd8\x38\x29\xb9\x94\xcf\x3d\xce\xc7\x62\x69\xd7\x1d\x28\x0e\x08\xb8\x1f\xce\xd4\x50\x0f\x4b\xc5\x15\x64\x16\x96\xdc\xba\x92\xc7\x55\xdd\x66\x32\xa0\xe8\x3c\x2d\x0e\x29\x9e\x10\x24\x08\xf0\xdc\x84\x5f\xa3\x30\x8b\x1b\x9c\xa9\x80\xed\x3b\xd5\x13\x40\x24\x48\x8a\x13\x06\x22\x04\x45\xb6\x35\xab\x0a\x8e\x78\x6d\xad\x50\xb3\xe6\x51\x91\x14\x78\x69\xc8\x0a\x04\x63\x5c\x47\x69\x82\xac\x1e\xb2\xb7\xf5\x1d\x3a\x4f\x7a\xe0\x9a\xbb\x62\xe7\x89\x57\xec\x3c\x86\x43\x9c\xd9\xe5\x6c\x95\xa4\x69\xfd\x83\x35\x30\xdc\xa6\xc2\xa2\xaf\xa0\x63\xf6\x51\x62\x1b\x66\x80\xef\xe1\x21\x48\xd2\xd9\x48\x38\x7c\x6b\xc0\x2e\xe2\x48\x10\x26\xc9\x0f\x8e\x2f\x15\x5b\xc2\xd8\x1b\x8f\x62\xc7\x8d\x30\x5c\x9c\xe7\x59\x0e\x31\x22\x13\x06\xaf\xc5\x4b\x54\x84\xba\xea\x94\x39\x74\xb4\x5e\x66\x79\xf2\xb1\x1a\x16\xe9\x40\x1a\xc2\x8f\x64\x9d\x3d\xed\x82\xc9\x7e\xe9\x6c\x1f\xa6\x58\x65\xf1\xa8\xba\xcc\x93\xed\x7b\xc1\xc5\xe1\x86\xb5\x74\x05\x7e\x68\x02\x0c\x35\xf1\x66\x2c\xb5\x36\x05\xb0\x00\x9c\x21\xe4\x2c\x1f\x3e\xb9\x35\x11\x24\xdf\xca\x66\x1c\x4c\xc9\xa2\xb8\x9d\x68\x9d\xe6\x43\xdb\x4a\x86\xb4\xd0\x68\x8e\x30\x8f\xae\x13\xb3\x92\x9f\x36\x41\x71\x9d\xa7\x6b\xa4\xda\x5a\x37\x36\x47\xc6\x12\x8d\x22\x64\x54\x9b\x73\x74\x76\x38\xb1\xe6\x43\xa6\x2b\x8f\xa5\x53\x25\x07\xc0\x18\xe7\x32\xb9\x18\xd4\xc1\x8d\x7a\xa3\x9a\xd4\x76\x42\x59\x9f\xc6\xc6\x73\xf9\x6b\x64\xcb\x52\xd1\xda\xd7\x3b\x70\x9f\x97\x1b\x4e\x96\x03\x94\xa2\xeb\x15\xf3\xec\xb6\xae\x10\x78\xff\x07\x82\x83\x74\x53\x74\x35\x70\x93\x20\x4c\xe6\x7f\xcd\xe4\x04\xa3\xe9\xf4\x4a\xc1\x35\xb3\x78\xa3\x65\x7f\x03\xae\x00\x26\x84\xa1\x76\x46\x52\x6f\x3e\x9d\xb6\x99\x7b\xea\xc4\x5f\x01\xd6\x88\x45\x63\x98\x39\x45\x9e\x86\xb9\x30\x15\x17\x05\x49\x71\x39\x6e\xce\x16\x57\x79\x91\xe5\x33\xb2\x5f\xe2\x5f\x0f\xe4\x26\x6e\xbc\xb4\xe8\x20\x97\x87\x88\xf5\x16\x87\x89\xcd\x1e\x74\x30\x7e\x11\x5d\x62\x18\x49\x74\x34\x46\x0b\xc7\x34\x0c\xb8\xd0\x4e\x7e\x61\x04\x79\xa4\x3a\x34\x89\xec\x18\xf9\x86\xd1\x98\x8c\xe7\xc9\xfa\x32\xad\x18\x24\x0e\x16\x2c\x6c\x5a\x4a\xd7\xf8\x88\x82\x95\x57\x7d\x82\x9f\x7e\x03\x80\xf9\xc0\x8d\x1e\x22\xc7\x4f\x21\xc9\x12\x07\x04\x8c\xd6\x5c\x75\x5e\x32\xf6\x2a\x4a\xc0\x78\xdc\xf0\x46\xdc\x95\xa4\x4b\x3d\x0b\x72\x09\xe3\x53\x14\xfa\x19\xff\x15\x78\xa0\xfa\x81\x73\x8a\xca\x4e\x06\xe4\x06\x89\x15\x84\xe8\x06\x49\x87\x0e\x42\x7f\x8b\x97\x42\x17\x31\xf7\xbd\xe8\x83\x49\x4d\x58\x5f\x6f\xe2\x58\xca\x07\x5a\x0f\xb2\x9a\x5d\xc6\x65\x9c\x6f\x92\x6d\x54\xc6\x3c\xef\xa7\x1d\xf8\xd3\x90\xd9\x9b\x0e\x91\xa3\xb0\x4e\xde\x04\x3b\x90\x73\xf2\x08\x18\xa3\x81\x38\x5a\x13\x5a\xf4\x93\xf1\x0d\x9a\x0d\x9d\xaa\xc1\xcd\xe5\x3f\x1e\xbe\x5f\x34\x20\x7f\xcc\x5d\x24\xb3\xe8\xe8\x63\xa9\x79\xb5\x90\xf6\x15\x0a\x6f\x0d\x3c\x71\x91\xe9\x65\x9b\x95\x56\x94\xa6\xd9\x4d\xbc\xec\x4e\xa9\x9d\xe5\x76\x5f\xd2\x51\x8c\x07\x15\xc9\x64\x35\x9d\x47\xbe\x60\x42\x8e\x5d\xbb\xac\xfd\x9d\xec\x2f\x3a\xa9\x63\x8c\x30\x38\x6a\x1c\xe7\xc8\xcc\x1b\x99\x84\x63\x55\xd6\xc5\x6a\x28\x77\x24\xe2\xfa\x55\xb8\xf9\xd7\x67\xd0\x9f\x71\xeb\x27\xd3\x9a\xff\x57\xb9\xb9\x10\x17\xe3\x5a\x32\xc7\xb4\x23\xfd\x6a\x13\x52\x28\x56\x74\x92\x34\x56\x6f\x10\x14\xde\x2a\x16\xa9\xe7\x6e\x81\x25\x61\xb8\x53\x90\x51\xda\x77\x09\x3c\xa7\xf3\x72\x5b\x67\xa5\x6d\xca\xf7\xf5\x45\x5b\xf2\xe6\x22\xb3\x47\x10\x33\x5e\xc9\xeb\x36\x1a\xd7\x6c\xb9\xca\xed\x3a\x2b\x62\x41\x87\x81\x0e\xd1\xe2\xf7\xd4\xc4\x36\x69\xcb\x5b\x8b\xee\xcc\x00\xdb\x93\xae\xad\x6b\x53\x59\x61\x0b\xe4\x4c\x0c\x19\xc5\x3d\x0f\xb4\x8f\x3f\x22\x92\xd3\x99\xb1\x99\x81\x25\xbc\xfa\x51\xec\x0a\x3b\xca\xa3\x2d\x42\xdb\xc6\x67\xe8\x80\x49\xfe\x58\xc8\xdf\x32\xe9\x13\x94\x00\x53\x75\xd9\x50\x7d\x57\x66\xe6\x0c\x9c\x33\x70\xab\x48\xee\xf6\x0a\x73\x94\xc3\x9e\x60\xeb\xd6\x6b\x35\x57\x03\xea\xd1\x11\xe4\x23\x9d\x16\x30\x02\x93\x03\xe5\xeb\xa2\x7f\xe5\x71\xb4\xcc\xb6\xe9\xdd\xdf\x7b\x7e\xea\xc6\x88\xdb\xac\x7c\xd0\x80\x9c\xb0\x9b\x06\x7c\xe3\xc0\x5a\x57\x52\x89\xb7\xe5\x83\x32\x1b\xe0\x56\x9d\x32\xa7\xe8\x83\x69\x38\x3c\x25\xdb\x8b\xea\xef\x27\x83\x6d\x66\xe5\xf1\x2e\x8e\x4a\x36\x3e\x02\xb1\xed\x0c\x70\x30\x46\x73\xc1\x41\x80\x18\xd8\xe4\xad\x5f\x0d\x87\xb8\xa9\xa7\x6a\x00\xa2\xb5\x95\x3c\xe0\x6b\x48\x64\x2b\x24\x30\x57\xb1\x36\x68\x0e\x71\x30\x69\xf8\x94\xef\x4c\xb5\xbe\x63\x96\xa0\x0a\xe9\x42\x0c\x91\xf3\x80\x7e\x92\xc7\xc8\xc7\x96\x7c\x5b\x43\xd8\x4e\x68\x83\x6d\xeb\x0f\xa9\xf9\x60\x7f\x70\x9e\xe2\xda\x17\xae\x3a\x88\x5e\x44\xe9\xe2\x01\xa2\x60\x0d\x5c\x76\xcf\x23\x5b\x33\x6c\x70\xf8\xc9\x43\x0b\xdb\x65\xa2\xc0\xe6\x96\xca\x42\x3e\xc4\x01\x97\xd1\xcc\x41\x82\xc8\x5c\xd3\xae\x87\x75\xbb\x9a\x93\x54\x29\x97\xf1\x9e\xdf\xe4\xc2\x09\x8f\x45\x20\x43\x28\x75\x19\xd3\x33\xd8\x83\x7a\x1c\x03\xf9\x65\x58\x26\x31\x49\x86\x72\xea\x43\x4d\x97\x8c\x15\xfe\x7c\x44\x13\x25\x11\x14\x97\xb3\x0c\x14\xa7\x7f\xfc\x8c\x56\xcf\x84\x7c\x78\xc9\x19\x34\x2e\x60\x8a\xb0\x89\xd8\x4b\x92\x3e\x03\x66\x21\x42\x8c\x04\x1c\xa8\x01\xf0\xc8\x43\x50\xf5\x02\x04\xff\x94\x44\x8c\x61\xd1\x50\x02\x11\xda\x6a\x61\x3e\x58\xd1\x72\x99\x6d\x5b\x94\x5c\x81\x05\xdd\x9e\x44\xef\x10\x38\x03\x1c\x2c\x67\x4c\x48\x7e\x5d\x60\x46\x69\x54\xe4\x0c\xe8\x54\xeb\x51\x2b\x42\xe7\x57\x5f\xfa\x02\x8b\x1f\x07\x62\x7b\xef\xe7\x57\x65\x99\x6d\xbb\xb5\x98\x77\xf9\x77\x13\xd7\x60\xb1\x2c\x98\x03\x2c\x73\x34\x1a\xb4\xa5\xcc\x9e\x0b\x79\xe9\x2c\x6c\x13\x4f\xc9\x9f\x27\x66\x71\x3f\x50\x93\x7b\x2d\x5a\x88\xd1\xfe\x4f\x5d\xaa\xc8\x86\x17\x86\x38\xe2\xb2\x44\x3c\x6e\x67\xc5\x28\x4c\x17\xf2\x0b\x15\x29\x1e\x15\x99\xc6\x55\xa0\xda\x43\x72\x78\x3d\xbd\x05\x1c\x0d\x43\x77\x01\x80\xd3\xee\x2f\xe0\x99\xe5\xe2\xc1\x96\x49\x76\xdc\xf3\x44\xbe\xae\x2f\xf2\x30\x11\x60\x91\x5c\x8c\x16\xef\xd8\x1b\x08\xef\xcb\x3f\x74\x0c\xe9\x80\x69\x69\x89\xca\x1b\xdd\x4c\x17\xc9\xb6\x88\xcb\x01\x99\x42\x51\xfc\x37\x7c\xb8\xd5\x56\xd1\xe7\x3b\xd4\x34\xe2\x4c\x21\x88\x2f\x83\x43\x3a\xfd\xc0\xa7\x6d\xdc\xec\xce\x75\x17\xca\xdb\xf6\x8f\x78\x52\xfd\xd3\x49\x1d\x94\x35\x4a\xa7\x14\xd8\xeb\xaf\xd3\x16\xb6\x7a\xcd\xa4\x0a\xd9\x10\x83\x29\xb4\xdb\x48\x6d\x3d\x74\xd2\x06\xee\x98\x05\xc7\xf0\xb3\xcb\xbf\xcd\xd3\xaf\x99\x24\x8c\x9d\xab\xad\x13\xdc\xf1\x7c\xfc\xad\x55\xc9\x1e\x57\x7e\x5f\x71\xaa\xda\x70\x00\x33\x0f\xf4\xba\x43\xcb\xd6\x46\xb3\x93\xf9\xc2\xd7\xf2\x9f\xc4\x59\x2a\x89\xb4\xd9\x23\xe0\x29\x9a\x8e\x77\x71\x76\x96\x42\xae\xe9\x29\x83\xa7\xe9\x02\x76\x35\xa9\xee\x08\xd8\x09\x0b\x83\xa2\xcd\x32\x22\xb5\x4b\xe3\xbf\x4f\x5a\x49\x0b\xf0\x5f\x94\x9b\xd6\x88\x63\x56\x84\x46\x08\xcd\xfa\xbc\xab\x70\x0c\x7b\x4b\x59\xdf\x21\x3e\x19\xb0\xaa\xa6\x16\x33\xd6\x44\x78\x60\xd6\xaf\x4c\x99\xe9\xa4\xdf\xc0\xea\xfa\x0b\xa5\xf4\xd1\xf5\x4f\xb5\xa9\xbc\x8e\x5b\xc5\xca\xd0\xd1\x40\x61\x62\xfc\xfc\x97\xaf\xe7\xd1\x03\xcf\xf3\x4e\xe9\xbf\x76\x78\xc2\x1a\x13\xa8\x5c\xd7\x22\x3a\x9f\xb7\x32\xd3\xd1\xcb\x0f\x12\x19\x64\xbb\x6a\xa8\xb4\xd5\x45\xc0\x68\x4d\xee\xd8\x0b\xbc\xb9\xae\x11\xc8\x1b\x1b\xdf\xee\xa2\x6d\x7b\x3b\x18\x58\xe0\xfa\x92\x30\x2b\xc9\xe7\x4b\xea\xbd\x1b\x8f\x6a\x14\x69\x47\x37\x10\x6c\x6c\x1d\xce\xd7\xdb\x64\xe1\x62\x6e\xc5\xb3\xe3\x0a\xe5\x24\xef\x96\xa2\xfc\x78\x8f\x42\xb8\x1e\xf9\xcf\x11\x1e\x85\x20\x4f\x10\x8c\x9f\xd4\xef\x30\xf8\x73\xf4\xcf\xd0\x7f\x32\x1c\x3f\x3d\x46\x36\xfc\xf3\x28\x8f\xcb\xb6\x24\xf8\x70\x86\x7a\x21\xc7\xf8\x08\x25\x0a\x77\x6d\x6f\xe8\x9d\x07\xb6\x17\x39\xf6\x68\x32\xf4\xce\xe9\x1f\x6c\xae\x70\xcb\x7d\x31\x42\xc9\xc4\x9d\xaa\x68\x6a\x4f\x02\x9c\x93\x3c\x00\x90\x5c\xf6\xdf\xb7\x5c\x1a\x7d\xf1\x51\x2c\x46\x05\xf0\xcc\x34\x53\xcf\x51\x24\x96\x5e\xcc\xcb\xba\x49\x96\xcb\xb4\x59\xbd\x80\xda\x8b\x0c\x14\xd5\x61\x1a\xdb\xb4\xa8\xfe\x91\x2f\x9b\x40\x7a\x4f\x6c\x24\x17\x1c\x0f\x8e\x0f\x72\xff\xdc\x6e\xf6\x55\xd0\xea\x50\xbe\x0b\x00\x8d\xf0\x56\xc7\x8c\x38\x73\x9c\x92\x0f\x95\xb4\xfe\xde\x83\x6f\x3e\xd2\xfc\xe0\xed\x5b\x7a\x26\x94\x8a\xbf\xd6\xce\x3e\x19\xdb\x5c\xcc\x40\x97\x21\xa4\xa9\x0c\x4f\x0c\xd2\x67\x32\xad\xb0\xec\xf2\xa0\xf8\x13\x9d\x30\x54\xec\xb3\xc1\x5d\x62\x1d\xd4\x36\xb3\x04\xa9\x21\xae\xa3\xfb\x5d\x7c\xfb\xde\x97\x16\xa9\xac\x56\xa8\x56\x63\x6a\x07\xa2\x8c\xdd\x20\xf6\x8b\x39\xc4\x54\xec\x8e\x93\x96\x39\x41\x70\x80\x60\xbb\xd5\x95\xd4\x23\x76\x07\xd3\x8a\xd6\x73\x3a\xee\xcc\x0e\xbb\x44\xe9\xcc\x14\x46\x86\x8f\xcf\xa0\x98\x62\x79\xa7\x09\x19\x01\x79\x73\x49\x6f\xe9\xea\x42\x68\xb8\xcd\x3b\x1c\x4f\x26\x92\x31\xbc\x62\x43\xd1\x14\x47\xea\xa8\x82\x13\x6e\xf4\xe7\x31\xb2\xcb\xd4\x1e\x73\x76\x06\xaf\x72\xcc\x5d\x87\xe0\x1e\x91\x37\x3c\x4d\xd2\x8c\x26\x67\x06\x1c\x1f\x43\x9b\xf2\x49\x96\xd2\x35\xf1\xfe\x81\x22\xb5\xa8\xd5\xc6\x40\xba\x40\x36\xa8\x91\x14\x8e\x0d\x21\x4c\x42\x52\x26\x5d\xb7\xaa\xf4\x16\x20\xd2\x1e\x83\x06\xeb\x1f\xa0\x5e\xba\xb0\x0b\x3d\x11\x23\xdf\x52\x99\xad\xd7\x4c\xd4\x1a\x78\xa3\xe9\x13\xf8\x51\xa0\xca\x85\x1b\xc5\xf0\x0a\x46\x7d\x5a\xa1\xf2\x71\x81\xed\xd4\x78\xc9\xe4\x1a\x04\x4f\x09\x18\x70\x88\xe4\xea\x71\x87\x20\xdc\x51\x96\x89\x9c\x15\xc7\x13\xbe\xb8\x25\x50\x9e\x41\x30\x89\x62\x0d\xeb\x6c\x3d\x20\x51\xdc\x8b\xfe\xff\xb1\xf7\xf5\x3f\x8e\xe3\xc6\x82\xbf\xdf\x5f\xe1\xdb\x5c\x03\xd3\x59\x4b\x4f\xdf\xb2\x66\x90\x41\x92\xd9\xdb\x9f\xf6\xe1\x1d\xee\x2e\xc0\xbd\x0b\x06\x0f\x6a\x5b\xed\x56\x5a\x2d\xf9\x24\x79\x7a\x3a\x46\xdf\xdf\xfe\x20\x7e\x48\x45\xb2\x48\x51\xb6\x67\x32\xbb\x99\x2c\x76\xd3\x16\xc9\x62\xb1\x48\x16\x8b\xac\x2f\xe5\x3a\x93\x41\x27\xf0\x24\x86\x1a\x11\xd5\x1a\x9d\xb3\xac\x08\xc9\xe4\x42\x25\x4e\x24\x84\x10\x2b\x98\x7c\x55\xc7\x60\x63\xd4\x57\x9a\x11\x7f\x7a\x9d\x71\x76\xc7\x96\x66\x79\x72\xfd\xb8\x83\x05\x7d\xf9\x34\xb0\xae\xfb\x63\x4d\x9d\x56\x8b\xbc\x2b\x9c\xb2\x86\x55\x0e\x6d\x73\x28\xda\xfe\xe5\x2d\xc4\x6e\x2d\x63\x65\x4d\xe7\x7f\xa0\x56\xc5\x06\x3b\x9d\x72\x09\x4e\x4c\x9c\xe7\x41\xe0\x21\x13\xc3\x0a\xbe\x4d\xc2\xcf\xf9\xc0\xd9\xae\xef\x14\xec\x35\x98\xc2\xc7\x90\x93\xe8\x3e\x1f\xfe\x31\xe4\x33\x9a\x54\x80\x58\xc4\x2c\xda\x1a\x68\x78\xa5\xe5\xfe\x25\x16\x3b\xe9\x62\x4d\x73\xfd\x9c\xb9\x76\xe0\x15\xcf\x99\x34\xab\x8e\xcf\x46\xf1\x75\x51\x76\xc5\x28\x33\x27\xce\x21\xdd\x48\x2b\x82\xe8\x00\x9c\xbd\x71\xb6\x5b\x8c\x9d\x6d\xb7\x5b\x7b\x1a\x8b\x5a\x3e\xad\xba\x6d\x39\x28\x83\xc2\x10\x44\x15\xbb\x1c\xe5\xd1\x11\xc7\xd4\x0d\xdb\x4b\x3e\xd8\x4a\xc8\xae\x01\x54\xd5\x5b\x0f\x49\x01\x0d\x16\xac\x63\xb3\x0e\xf7\x8a\x73\xaa\xeb\x4f\xf0\x58\x02\x44\xd2\x72\x22\xd9\x08\x84\x6f\xb5\x4b\xe7\x0a\x1e\xab\xe8\xd6\xa0\x41\xf7\x48\x9b\x95\xa0\x0b\x5c\x26\x0c\x09\x70\x2c\x84\x14\xec\xd8\xbf\x08\x2e\x64\x59\x3a\xf6\x3a\xf2\x1b\x2d\xa7\x99\xeb\x0d\x67\x94\x5a\xe6\x38\xdb\xa1\x49\xed\x0b\x02\x05\xc1\x60\x8d\x1a\x73\x29\x2c\x80\x91\x7d\x5f\x33\x2a\x66\x01\x75\xf2\xdd\x24\x7c\x0b\xed\xc5\x15\x24\x5c\xc3\x21\x38\x8b\x25\x43\xda\x1e\xeb\xae\xe8\x79\x44\x46\x64\xd9\xcc\x43\x03\x53\x26\x00\x33\x4d\x1f\xa9\x62\xd9\x8f\x61\x89\x88\xc8\x5f\xa5\x33\xc3\xae\x97\x46\xa7\x5c\x17\xe7\x87\x60\x0d\x3d\xc0\x61\x5f\xb0\x30\xa5\x35\x94\x02\xeb\x9d\x7a\x6f\xf2\x3c\x14\x9e\x8d\xfe\x76\xec\xfa\xf2\xfe\x05\x33\xf3\x50\xe2\xeb\x15\xf5\x4e\x62\xcf\x1a\x3b\x06\x01\x83\x95\x7b\x5f\x56\x15\x33\x3b\xd7\xc4\x6b\xf5\xcc\x56\x68\x2c\xc6\xb4\x12\xdc\x50\xbe\xb2\x4e\x99\x50\x90\x53\x8b\x2a\x70\x01\x82\x27\x23\x21\x58\x32\xc9\x59\x22\x00\x80\x92\xc6\x51\xfc\xf6\xa3\x48\x06\x61\x2c\x34\x3e\xaa\x2a\xed\x28\x51\xf3\xc0\x43\xbe\xee\xb5\x42\x32\x90\x0c\x5a\x34\x73\x64\xe8\x47\x71\x54\xa8\x1d\x28\x61\xf9\xda\x63\x5d\x93\x8c\x3a\x7d\x9b\x6f\x1f\x4f\x02\x58\x89\xfa\x17\xf4\x42\x83\xff\xe9\x86\x04\x1e\x9a\x1c\xc6\x82\xd4\xab\x85\xfe\x06\xa3\x5b\x09\x18\x5a\x4f\xcd\xdf\xd9\xea\xbd\xf2\x78\x01\x60\x1a\xe8\x50\x72\xb8\xb8\xf6\xe0\xfe\xd8\x1d\x0f\x87\xa6\xed\xbb\xd5\x1b\xe2\xcf\xf3\x54\xb0\x07\xa6\x61\xad\xdd\x9e\x66\xb6\xa9\xaa\x3d\x16\xea\xba\x87\xb6\xd9\xb7\x45\xd7\x39\x43\x1b\x34\xb8\xe3\x13\x2d\x73\x86\x85\xdc\x9e\x66\x56\xa3\x6e\x42\x64\x2a\xd9\x2f\x7b\xb2\x33\x35\x78\xd1\x99\x1d\x21\x8e\x7d\x5c\x6f\xae\x3b\xc3\x24\xcb\x0f\xda\xe7\x4d\xef\xeb\x7f\x50\x12\x1f\xab\xaa\xdb\xb6\x45\x51\xaf\xcc\x33\xba\x7e\xdb\x36\x4d\x3f\x53\x49\x9c\x76\x8b\x1e\x96\xae\x03\x2d\x16\x5f\x68\x41\x29\x43\xd0\xcd\x16\x8d\x85\xcb\xd0\x33\x57\x52\x13\x57\x59\x74\xa3\x83\x7c\xe1\x02\xb7\x1e\xdf\xb0\xe2\x67\x46\x47\x36\x85\x8a\xce\x59\x9b\xc2\x1a\xaf\x61\x97\xcc\xe0\xf5\x85\x37\x12\xed\x76\x5b\xb5\x3f\xe5\x7d\x5e\x95\x5d\x0f\x0e\xa7\x6d\x5e\x15\xf5\x2e\x6f\x9d\x43\xb9\x7d\x2c\x48\x88\x8f\x72\x9b\xf7\x8d\x14\x1c\x78\x4b\xa3\x24\x93\xd6\x78\xa4\x64\x21\x90\xdc\x74\x47\x14\x43\x2b\xcb\x37\x05\x22\x95\x40\xf1\x83\x49\x24\x98\xd0\x35\x40\x62\x48\xb2\x30\xcf\x93\x96\x61\x23\x07\x26\xdd\x40\x05\x9a\xb7\x9a\x26\x7b\x4a\x19\xc8\x54\x70\x65\xfd\x50\xb4\x65\xaf\x33\xfd\x54\x12\x8f\x53\xdf\x2d\x93\x3b\x04\xf5\xd1\x50\xd1\x5d\x21\xdf\xa8\x76\x92\x86\x23\xe5\xc2\xdb\x82\x96\x4c\x53\x4b\xdb\xc7\xe9\x76\x53\xe4\x58\x7b\xa0\xba\xb3\x50\x30\x63\xbd\x49\xf1\x19\x7c\xa0\xbb\xf0\xd9\xf5\x8b\x2a\x5b\x09\x8f\x1d\xa6\xf5\xad\xbf\xf2\x57\x54\x69\x37\x81\x33\xc6\x9b\x64\x21\xaf\x47\xb5\x67\x22\x79\xa1\x50\x8d\x09\x9b\xe1\x90\xbe\x0e\x71\x1c\x62\x79\x0b\x5c\xc3\xf2\x03\x18\xfd\x7a\x2b\x06\x80\xd9\x50\x10\x3b\x3d\x6f\x3d\xfc\xe3\xc6\xb7\x4a\xa0\x0f\x31\x5d\xe1\xb8\xc7\x1e\x8a\x7c\x27\x13\x41\x96\xc9\xc9\xa2\x77\xee\x8a\xfe\xb9\x28\x6a\x64\x6f\x00\x70\xdd\x73\xd9\x6f\x1f\x8a\xb6\x5b\xbb\x2f\x05\xfc\x7d\x42\x5c\xee\xfe\xfd\x8d\x43\x26\xea\x56\x8a\x06\x2c\xb5\x24\x53\xe7\xad\x3c\x32\x75\x8c\xd8\x31\x8d\x18\x47\x71\xe9\x8a\xea\x5e\x45\x85\x64\xa4\x14\xe7\x5d\xc8\xad\x3f\x56\xdc\x16\x55\xb5\x96\xda\xad\xc4\x62\x69\x5b\x0b\x5b\x5a\x70\x5d\x9a\xd9\xf5\x6a\xda\xfc\x61\x29\xbe\x68\xfc\xb7\x9e\x8b\xe2\x71\x97\xbf\x00\x0a\xf0\x9d\xcc\x4a\x4e\x50\xf7\x8e\x04\xb2\x06\x83\x14\xe2\x85\x7c\x73\xbc\x09\x1a\x11\x64\xf2\x40\x02\x79\x20\xa3\x25\x09\xfc\x26\xfb\x3d\xbf\xfd\x5d\xb0\x89\xbc\x68\xf7\x8a\x55\x03\xc6\xe2\xbb\xfc\xe5\x5b\x27\x0e\x70\x1c\x11\xfa\x19\x91\xe7\x04\xe1\x3f\xf5\xb4\x10\x6b\xa8\x64\x70\xcb\x41\xe2\x1a\x96\x16\x78\x1b\x56\x56\x15\xa8\x5c\x7c\xde\x56\xc7\x5d\xb1\x03\xba\x0f\xb4\x1c\x35\xe0\x11\x6a\x52\xdb\x9c\x62\x27\xe0\x1d\x06\xd1\x7d\x12\xbc\x9b\x90\x41\x9b\x20\x03\xa6\x0d\x85\xda\xe3\x89\x03\xd4\x34\x68\xea\x06\xa4\x8d\x06\x7d\x49\x54\xe9\x24\xb3\x42\xce\xc3\x4e\xd2\x5b\x08\xff\x0e\x1c\x9c\xa7\x4f\x73\xce\xcb\xaf\xee\x53\x53\xf7\x0f\xe2\x61\x48\xd9\xad\x74\x40\x4e\x8b\x38\xa0\xec\x72\xb2\xfb\x80\xf6\x76\xcc\xc4\x5e\x61\x4d\x88\xc8\xa3\x9c\x2a\xa4\xd1\xf8\xb1\xa8\xaa\xf2\xd0\x95\x9d\x80\x22\x44\xed\x04\x99\x65\x44\x90\xd2\xd6\xa5\x7f\x77\x36\xe7\xb3\x84\x15\x02\x92\xf2\xd0\xc9\xcb\x8a\x55\xa1\x85\x9c\xd4\x9c\x4a\x32\xd9\x80\x23\x3c\x10\x00\xbe\xf6\xfe\x4f\xa8\xb0\x31\xc3\x29\x65\x5d\xbd\xc3\xb5\x35\x64\xbc\x9c\x51\xd0\x1f\xcc\x2b\x62\x20\x01\x2f\x20\x7f\xeb\xd9\x87\xda\x4e\x61\x24\xa4\x0a\xdc\x3a\xb4\xe2\xa2\x0d\xa8\xc0\x80\xe8\x59\x6c\xcb\xb1\x3d\x67\x10\x53\x4b\x5b\x2e\xa3\x80\x80\xa3\xb6\xe4\x3d\x04\xc6\xe9\xaa\xfb\x8a\x2c\x57\x44\x88\xa0\xef\xd4\x4f\x77\xcd\x20\x20\x0a\xe1\xd4\xa1\xb8\xd6\xf5\x6d\xd1\x6f\x1f\x0c\xd5\xcd\x81\xc4\x71\xcf\xc7\xed\xb1\x03\x77\x34\xdd\x95\x6f\xbc\x24\xfa\xd3\x92\x16\xb2\x6e\x93\x4f\x53\xc0\x17\x43\x52\x55\x0f\xba\xa4\x8b\x46\xc0\x30\x67\xdc\x28\x32\xb7\xfa\x3c\xfe\x30\x2a\xfd\x14\xc6\x65\xb2\x8a\x03\x94\x98\x1f\xa8\x68\x3c\xc8\xa8\xab\x57\x08\x40\xdf\xb9\x00\xfa\xce\x99\x12\x5c\x6c\x28\x4b\x52\xfc\xe9\xae\x1d\xec\x87\x8f\x49\xb4\xf6\xc6\xec\x51\xf4\x4a\x74\xaf\xf0\x53\xff\x4e\x9a\x00\x0c\x04\x2b\x42\x20\xa1\x81\x77\x0d\x81\xb5\x25\xaa\xbb\x34\xef\xcc\x44\x3e\x62\x77\xf9\x54\xd6\x6f\xfe\xdb\x50\xbd\xde\x0b\x66\xc1\x63\xb5\x35\x71\x2d\xbb\xbd\x55\x12\xd6\x1b\xba\x02\x0f\x0f\x62\x39\x8c\x14\xa7\xc8\x0f\x18\xce\x65\x4d\x36\xdd\xbc\x79\x3b\x8e\x82\xd8\xb1\xc6\x64\x9a\x0d\x68\x7a\x68\x9e\x81\xd5\x16\x4f\xcd\xa7\x82\x08\xca\xba\x10\x46\xd2\x39\x26\x5b\xf8\xfb\x70\x99\xde\xdd\x0f\xff\xe8\x7a\x26\x8a\xb6\xe9\xfb\xa1\xac\xb8\xda\x4d\xf0\x17\x58\x91\xee\x95\x15\xeb\xdf\x05\x79\x18\xd8\xae\x58\xc8\x1e\xef\xf2\xae\x18\x36\x83\xee\xea\x2d\x18\x12\xd2\xb0\xbc\x40\x34\xe0\xee\xaf\x81\x61\x89\x20\x23\x93\x08\x3d\x7c\x1a\x93\x83\x09\xd4\x52\x33\xf3\xc8\x1a\x78\x18\xb0\xe7\x4c\x64\xb8\x40\xfa\xd7\xee\x21\x3f\x14\x7f\x78\x2e\xeb\x5d\xf3\xec\x6c\xab\xa6\x2b\x3e\xae\x97\xc0\x61\x52\x2c\x06\xe7\x64\xb5\x08\xd4\xa5\x3c\xb2\xd2\x49\xbc\x32\x6d\x27\x2e\x05\x8b\xb9\x83\xe8\x32\x22\x8f\x01\xba\xac\x8a\x6c\x6f\x78\x53\xba\x59\xdd\x8a\x27\xe3\xd8\x1e\xdb\xb6\xa8\xfb\x0f\xc3\x0f\x79\x13\x48\x4e\xc9\x32\x6e\xb2\xfd\xfa\xa7\xbc\x7d\xe3\x38\x43\xcd\xbb\xbe\x76\xaa\xb2\x7e\x1c\x25\x1d\x66\xa9\xb8\xfa\x5d\x92\x24\xb7\xef\xe0\x65\x0b\x03\x2c\xcf\x63\x5e\xef\x2b\x65\x02\xc7\xba\xe2\x5c\xd1\xba\xc6\x49\xa2\x4e\x3c\x56\xa2\x39\x4e\xe4\x29\x77\xb6\x27\x39\x30\xc1\xd0\x67\x1b\xe3\xfb\xd9\xd2\xc3\xe8\xf2\x27\x35\x21\x9f\x8d\xe0\x0e\x41\x22\x6c\x78\xef\x14\x1d\x85\xf0\xea\x36\xd1\xa2\xeb\xf3\xbe\xdc\x0a\xb1\x46\xc9\xea\xe4\x02\x9f\xf3\xf2\xb6\xdb\xb6\x4d\x55\xbd\xd3\xa5\x07\x94\xa7\x62\x85\x7e\x75\xaa\x26\x1f\x10\x94\xdd\xad\x7c\x8c\x2f\x58\x41\x32\x97\x12\xe7\x00\x31\x92\x0e\x4c\xdf\x62\xd7\x13\x09\xc7\x83\x41\x4a\x74\x90\x4e\xda\xf4\x6e\x29\xc6\x26\xe7\xb2\xca\x1a\x8f\x35\xd1\x06\x0a\xba\xe2\xc0\x8b\x1b\xbf\x08\x8e\xfa\x1c\xf0\x84\x43\xa4\xf7\xe9\x35\x14\x39\x82\xe9\xa8\x94\xbb\xcd\x28\x92\x91\xcb\x98\x94\x85\x8d\x40\xdd\x15\xdb\x86\x19\xbd\x6a\xc1\xba\x88\x4b\x1f\x72\xff\xc1\x10\x1a\xbd\xc7\x85\xc0\x13\x78\x5d\x2a\xef\xf0\xe5\x3f\x3e\x58\x61\x08\x89\xe6\x1b\x32\x20\x83\x9e\x00\xb0\xc1\x51\x7f\x77\xec\x0a\xee\x43\x46\x15\x78\xf2\x07\x33\x0e\xd0\x49\x4d\x87\x89\xee\x2d\xc8\x04\x16\x7a\xf1\x6b\xe1\xaa\x33\x43\x57\xe2\x3c\xb9\xc1\x0d\x46\xb7\x5e\x16\xec\x41\x0d\xbb\xf8\xe3\x53\xb1\x2b\xf3\x15\xd3\x2d\xe6\xf5\x6e\xf5\x66\x62\xd6\x71\x9a\x1c\x3e\x33\x03\x87\x85\x9d\x84\xa0\x8f\x05\x58\x1a\xa6\x0a\x6f\xc0\x57\x3e\x96\x82\x84\xd7\x5c\xe8\x50\xa6\xb4\xc3\xe4\x96\xb5\x55\xd5\x49\xc2\xb6\xab\xcf\xc5\x1b\xad\xfa\xac\xac\x06\x2e\xf7\x30\x7a\x7f\xdc\x09\x71\xe9\x62\xcf\x03\x77\xc6\xe2\xde\x7b\x75\xbb\x3e\xdf\x3e\x72\x85\x90\x2e\x86\x9d\xa2\x1e\xe5\xd6\x59\x62\xfb\x15\xfb\x45\xbc\xe3\x65\xc3\x51\x41\x25\x23\x2e\x03\x0f\x07\x43\x23\x2b\x76\x18\x20\xae\x18\x32\x36\x14\x7f\x8e\x46\x28\x63\x74\x2a\x76\xb6\x58\x43\xa0\x81\xf7\x47\xc1\xc5\x93\x9f\x08\x17\x82\x22\xa2\x9e\x68\x59\xe8\x08\x70\x3e\x95\xc5\xb3\xfe\x94\xd3\x24\x4f\x57\x03\xe2\xe1\x27\x1f\xa6\xdc\x5f\x26\x5b\xc5\x49\x12\xa5\x3e\x2e\x5e\x01\x99\x86\xcc\xb7\xf6\xc2\xf6\xdc\xb4\x3b\xfa\x40\x7b\xd7\x16\xf9\xa3\x33\xfc\x86\xe3\x5f\xed\x76\x6b\xe1\xe7\xe8\x75\xc8\x9e\x30\x88\xf9\xe4\x64\xac\xc0\x1f\xa9\x40\x13\xf6\x37\x59\x3d\x88\xf0\x4a\xde\xda\xda\xe6\x79\x45\x9e\xe4\xae\xf7\x6c\xc1\xc8\x03\x28\xc1\xdf\xa9\x27\xdc\xde\x43\xdc\x40\xd4\x59\x38\xe4\xf7\xe0\xfb\x4a\xad\xdf\xdc\x3b\xfd\xcb\xa1\x38\xa9\x57\x7c\x54\xc6\xf5\x56\x0c\x31\x2d\x89\x9c\xed\x43\x5e\xef\x8b\x9d\x80\x9b\xa3\xda\xe2\x3b\x3c\xa6\xee\x0c\x9c\xd1\x60\x7a\xf4\x80\x5a\xfd\x80\x38\x44\x2a\xd9\x2b\xd8\x80\x88\xdc\x1d\xa9\x3a\xf3\xbe\x39\x4c\x42\x7e\x12\xe7\x3b\x29\x11\x7d\xa4\x4b\x44\xaf\x43\x97\x45\xae\x14\x18\x13\x7d\xf9\xd7\x2d\x5e\xc3\xd0\xd9\x55\x5e\x69\x39\x8a\x44\xda\x96\x79\x5b\xf4\x27\x44\xc3\x6d\x46\x9b\xe1\x95\x05\xd9\x5d\x1e\x9b\xb9\x44\xbc\x84\x4b\x88\x5c\x5b\xd2\x73\x99\x30\x1a\x67\x7d\xce\x19\xee\xbe\x6a\xf2\x9e\x38\x24\xe8\x0d\x8a\xf8\x33\x50\x48\xaf\x69\x41\xc4\xdf\x81\x90\x37\x71\x33\x56\xa2\xe2\x82\x6a\x49\xa8\xa3\xb9\xce\x25\x12\x83\x38\xfc\xed\x3c\x16\x2f\x93\x8a\x3e\x22\x49\x50\xb8\x58\x14\x79\x37\x73\x33\x3c\x33\x56\xbe\x8a\x03\xfa\xee\x4b\xcc\x6a\xb2\x2c\x9b\x5f\x71\xd2\x71\x81\xd8\x41\x24\x53\xbe\x96\xf1\xcd\x43\x3a\x45\x66\xbb\x79\x2f\x84\xda\x16\x7d\xd3\x67\x9b\x82\xe0\xda\x12\x1e\x58\x63\x52\xb1\x2d\x6a\xd4\x20\x84\x3e\xd9\xeb\x1b\x89\xbc\xdf\xc0\xa6\x4d\x40\x6c\x98\xb4\xd2\xe6\xeb\x31\x6d\x74\xac\x3c\xe1\xb2\x6d\x75\x2d\xc3\x62\xaf\x2f\x0b\x3b\x3e\x49\x71\x7c\x03\xe3\x41\x41\xa3\x68\x0d\xe2\x2e\x76\xe6\xc8\xb1\xc4\xcf\x82\x82\xf9\x24\xfe\x96\x43\x5f\xdd\x93\xff\x7d\x0f\x7d\xf5\x65\x43\x5f\x4d\xef\x39\x3c\x9d\x68\xe6\xed\x8a\xfd\x18\xac\x05\xc6\x43\x55\x24\xfb\x05\xab\x17\xdb\xc7\xe6\x66\x7c\x3f\xe3\x71\x25\xa9\xaf\x3f\x57\xba\x3a\x65\xed\x34\xc7\x7e\x8d\x7e\xb5\xc1\x98\x05\x31\xaa\x9b\xfe\x0d\x52\xa3\xd8\xdd\x62\xdb\x1a\xb1\x67\x66\x0a\x74\x73\x87\xa8\x60\x3a\x6e\x6f\x65\x46\x3c\x9a\xde\xf5\x0c\x98\x5a\x0c\x85\x17\x33\x00\x18\x18\x55\x0f\x72\xc9\xc7\xb5\xa6\xf0\x90\x77\xdd\x70\xcd\xd1\x56\xa8\x8f\x4f\x77\x45\xab\x2d\x2e\x9e\xf2\xb2\xd2\x96\x1e\x5b\x7d\x59\x5f\xe8\xcb\x76\x79\x5f\xe8\x1b\x96\x4f\xfa\xc2\xa1\xe5\x50\xc1\xa9\x9a\x6d\x2e\x75\xe0\xb2\xb0\xb9\xa8\x14\x28\x6d\xaa\xbe\x39\x60\xe1\x84\x45\x19\xc1\x71\x33\xe5\xd6\xf1\x9d\xf0\x5a\xc2\xf3\xb0\xc5\x92\x87\xee\x99\xec\xc4\x4c\xe9\x73\x21\xe1\xd3\x72\x2e\x34\x6c\x0e\xcf\x85\x85\x4c\xf8\xb9\xa0\x94\xd5\x71\x3e\xdd\xaf\x04\x48\x5d\x77\x67\xa3\xa4\x2c\xd2\x4b\x70\x02\x2b\x5a\x73\x7c\x09\x61\x91\xd7\x88\x54\x7f\xce\x21\x86\xe3\x26\x6d\x23\x88\xcf\x57\xe8\x96\x7b\x38\x83\x6e\xcf\xea\x48\x3e\xdf\xce\xdd\xce\x16\x70\xac\x37\xb3\x05\x2c\xcb\xad\x6c\x01\xc9\x6e\x23\x5b\x00\xb2\xd9\xc6\x56\xd4\xbe\x0a\x18\xab\x2d\x6c\x83\x8e\xcd\x06\xb6\xc4\x07\x6e\x5f\xf4\xc2\xad\x04\xe3\x5a\x12\x54\xdd\xf3\xd2\x20\x0f\xaf\x19\x54\xfd\x3a\x3b\x87\xdb\x89\x5e\x07\xda\xa4\xd8\xbb\xe6\x8e\xbc\x1a\x8e\x23\xc4\xab\xe2\xc9\x76\xfb\xd5\xb0\x64\xf0\xae\x8a\x23\xe5\x23\x57\x43\x91\x82\xbb\x2a\x86\x03\x83\xba\x1a\x7e\x03\xb0\xab\x62\x37\xf0\xbd\x2b\x6e\x95\x2b\x63\x47\xd8\xe9\xd5\xd0\x23\xd0\xae\x4b\xbd\x81\x4d\x5f\x8f\x7c\x03\xb4\xab\xd3\x0f\xb0\xff\xab\x52\x12\xc0\x85\x66\x0f\xd8\x01\x43\xcf\x08\x53\xf2\x88\xf3\x30\x92\x64\x41\xc3\xe1\x76\x61\x0f\x9a\x78\xe9\x4f\xcd\x2e\xaf\xa0\x0a\x82\xdf\xea\xe2\xf8\xd3\x83\xfc\xa4\x2f\xa0\x30\x10\x0c\xf4\xa7\x11\x45\x4d\x5a\x1c\xae\xb0\xa1\xb6\x28\xea\xe8\xc6\xb7\x60\xa9\xab\x8b\x1e\xa5\xd1\xa7\xe4\x8d\xe6\x02\xbb\x00\x03\x3e\xaa\x85\x98\x28\x2a\xad\xcb\x88\xc1\x48\xba\xfc\x8d\x5e\xb2\xb4\x03\x01\xb1\xda\xa2\x70\xea\x66\x27\x99\x5e\x48\x85\x1c\x0e\xe2\x0c\xaf\xf1\x82\x9f\x00\xc0\xf6\x27\xbd\x6e\x10\xf3\xa4\x57\x13\x19\x8d\x6a\xdc\x59\xf7\x0d\xa4\x82\xa8\xc1\x4c\x02\x81\x08\x10\x4d\x2c\x29\x2c\x5f\x4b\x86\x66\x52\x16\x52\xb5\x58\x76\xd8\x53\x02\xe7\x8a\x4f\x59\xa1\x36\xfc\xb0\xdc\x3f\x51\x0f\x02\xdf\xdf\x24\x10\x9d\x89\xe5\x68\x11\xbc\xc6\x18\x28\x37\x40\xdc\xcd\x24\xeb\xe5\x31\xf8\x37\x6a\xb8\xac\x78\x91\xa9\x08\x32\x6b\x38\xd9\x76\x10\x2c\xb2\xa1\xd6\x0c\x85\x6c\xc8\xd1\x1d\xca\xba\x2e\x5a\xb0\x58\x8d\xc3\x9e\x42\x95\xfb\x2a\xe6\x0c\x96\x61\xca\x26\x17\x1c\xd9\x21\x18\x24\xbc\x9c\x28\xc1\x55\x93\xd0\x2c\xc2\x77\x7d\xa6\xd3\xad\x2a\x66\x02\xf1\x96\xc2\xc4\x4c\x41\x04\x78\xc4\x1e\xc8\x14\x9b\x8b\xdc\x6a\x80\x51\xa9\x9a\x38\x6c\xca\xbd\x77\xde\x0a\xc0\xcc\x59\x81\x92\x1d\xc4\x0d\x84\x48\x0f\x37\xb8\xc7\x35\xf2\xfd\x53\xd9\x95\x3d\xb7\xf1\x14\x8b\xa0\x6d\xa4\x58\x02\x97\x96\x60\x42\x8a\x54\xc3\xda\xeb\x1c\x19\x0d\xd6\xb2\x18\x00\xc9\x8a\x5f\xa8\xb2\xc0\x9c\xd6\xc0\x77\xdf\x53\xdb\x3e\x16\xe6\x4e\x0d\x59\x6e\x58\xe0\xd4\x2c\x26\x80\xf6\xe8\xec\x3c\x90\x16\xfe\xa2\xae\x31\xad\xbe\x05\xab\x74\x55\xe3\x20\x6a\x00\x6e\x13\x17\xcb\x0a\x1a\xf5\xc0\x62\xa1\x6e\xa8\x5b\x08\x48\x89\xbf\x32\x01\x82\x61\x90\x16\xf4\xe5\xee\xf2\x3e\xdf\xb7\x93\x43\xd6\xb6\xa9\xaa\xfc\xd0\x15\x6f\xbb\xe2\x90\xb7\x79\x5f\x18\x0c\xe4\x0c\x01\x9c\xa3\x2c\xde\x24\xf1\x9c\x8b\xb0\xe4\x87\x27\x6e\xd9\x71\xd7\x03\xbb\x8b\xd1\xd1\x45\x48\x38\x09\x8d\x24\xf8\x78\x56\xe3\x5f\x0e\x75\xd6\x58\xa3\x45\x45\x55\x9d\x14\x33\x22\xc8\x1d\x84\x88\xd5\xc3\x29\x8e\xd0\x61\xf8\x8c\xd1\x02\xd8\x6e\x31\x7a\x8c\x7c\x3b\x8e\x47\xbb\xab\x15\x73\x78\x52\x5d\x69\x55\xc5\x91\x61\x7c\xee\x30\xad\xda\x41\x92\xd2\x93\xc2\xe2\xcc\xd0\xe0\x3e\x31\x43\xd6\x4b\x1f\xcc\x45\x42\xdb\xd1\x49\xf4\xed\x34\xba\x81\x25\xaa\x7f\x83\xeb\x85\x06\xcb\x35\x99\x82\x54\xce\xb2\xb6\x70\x34\x98\x45\xa2\xcb\x9c\x58\x06\xad\x78\x98\x05\x65\xc0\x77\xcd\xee\x05\xfc\x6c\x9b\x67\x48\x36\x79\x55\xda\xc3\xfc\x51\xfc\x79\xba\xd2\x62\x45\xfb\xe3\x36\xbf\xd2\x2c\x0a\xf3\x6f\x2d\x02\xeb\x56\x86\xae\x13\x60\x51\x65\xe8\x43\x72\x82\xd6\x75\x32\x90\x4a\xb0\x5e\x12\x26\x06\x2d\x18\xe6\xc5\x66\xa4\xa8\x38\x7f\x6d\x3c\xe6\x89\x81\x3b\x85\x0b\x78\x4c\x39\x51\xb4\xdc\x12\xab\x32\xac\x4f\xe1\x84\x0e\xe1\x01\xcd\xfd\x89\x03\xf1\x84\x71\x1e\x9a\xae\xd7\x19\x26\xd3\x5e\x57\x2c\x60\x80\x62\x36\xab\x9e\x53\x08\x8d\x8d\x03\xf7\x48\x76\x95\x51\x34\xa5\x1b\x83\x24\x5c\x39\xf6\xcd\x43\x49\x10\xa7\x6e\x69\x77\x79\x3b\x45\x2c\x20\x77\x3e\xf1\x06\x08\x1d\xe5\x12\x99\x9a\x5c\x7a\x9f\x72\xe8\xa8\x56\xaa\x86\x43\x00\xc0\x9a\x1e\x2c\xd8\x5d\x69\xf2\x5b\xa1\xd6\xa1\xc0\xf1\x18\x0d\xbc\xa4\x81\xb3\xd2\x17\x39\x77\xc7\xbe\x6f\xea\x6f\x3d\xf9\xaf\x2e\xa7\x4c\x0c\xc5\x48\x42\x4d\x3a\x9e\x8b\x68\x21\x9b\xe5\x9d\x05\x8b\xdc\x0f\x31\xe9\xc6\x81\xd1\xf6\xcf\x06\xbd\xea\x3e\xed\xa1\xf2\x74\xb4\x0e\x52\x15\xa8\x86\x3e\xf8\xb5\x51\x4d\xfa\xa5\x6d\xa4\x1c\xe6\x76\x4b\x9b\xf2\xf7\xb5\xc8\x03\xd7\x02\xe3\x5b\x9b\x18\x12\x09\x69\x36\xfe\xbc\x2f\x3f\x17\x23\x02\xd2\x8b\x10\x04\x79\xfd\x73\x11\x1c\xe1\x92\xa5\xeb\x40\x3c\xf1\xcc\x26\x75\xcd\x4e\x8f\x58\x65\xf1\x38\x70\xba\xbe\xdc\x3e\xbe\x58\x42\x98\x7e\x8c\x71\x61\x60\xe2\x08\xad\x61\x9a\x19\x06\x8e\xd1\x62\xc0\x00\x0c\x75\x15\x1a\x79\x33\x12\xcf\x1b\x71\x93\x16\x1c\x18\xde\x29\x77\xb2\xf3\x6e\x2d\x52\xa2\x7f\xd4\x63\xda\x8f\xbc\x35\xff\xd7\x0d\xe2\x5b\x53\x83\xc9\xe5\x7d\x1c\xec\xa1\x39\x0c\x03\xed\x9c\xa9\x19\xf7\x7e\x1f\xc1\xaf\xa6\xff\x78\x43\x17\xb7\xf8\x3d\x4a\xf6\x89\xd2\x04\xf1\xb4\x20\xb9\xea\xbb\xf2\x83\xc6\xb7\x3d\xf6\x6e\x58\xe4\x00\x72\xf3\x52\xbc\x59\x84\xc8\xd3\xa1\xb8\x8d\x98\xb3\x89\xe2\xab\x22\x07\x74\x31\xd7\xa2\xa7\x3a\x9b\x44\xd8\x03\x2d\xc0\x72\x05\x91\x02\x90\xcb\xd3\x9a\x2a\x5c\x3f\x71\x4d\xa2\x04\xb1\x4c\x95\x00\x77\xe1\x91\xc9\x32\x53\x4d\xa0\x8b\x18\xf3\xdb\x8a\x30\xdc\x00\xde\x8e\x36\x2b\x97\x7d\x28\xfb\xe2\x69\xc6\x45\xfd\x8a\x2e\xe9\x52\x54\xd4\x18\x06\x2c\x9b\x58\x82\x07\x1c\x7b\x45\xef\x19\xe2\x7f\x83\x3d\x17\x2c\x18\xed\x14\x8f\x70\x79\x53\xb3\x17\xb3\xe6\xe5\xee\x8c\x8e\xb0\x87\x3b\xd1\xb3\x7e\xc1\x3e\xc0\x86\x20\x04\x57\x5c\x8e\xde\xe4\x15\x7f\x0e\x0a\xd7\xf7\x9a\xbf\x64\x0c\x97\xac\x87\x19\xaf\xfb\x8b\xd0\xe2\x2f\xcf\x17\x01\x61\xba\xed\x8b\xc6\x76\x01\x22\x6f\x45\x44\x66\xa3\x07\x9c\xd1\x05\xd0\x80\x9d\xd5\x9a\x2b\xc8\xe6\x5c\x27\xc6\xc0\xc0\xe1\xee\x8d\xb7\x66\x71\xde\xd6\xde\xed\x77\xb1\xe8\xb7\x27\x16\xf1\x83\x7f\x94\x04\xbe\x8b\x45\x73\x44\xf9\x2e\x16\x7d\x17\x8b\xbe\x8b\x45\xdf\xc5\xa2\xef\x62\xd1\x77\xb1\xe8\x1f\x26\x16\x9d\x13\x74\xef\xdb\x15\x8b\x28\x9a\xbf\x46\xa9\x08\x18\x93\xad\x8c\x32\xcb\xd5\xc4\xa8\x6f\x48\xf8\xe1\x21\x31\x60\x58\x63\x31\x36\xe4\x15\xc4\xa3\xef\x02\xcd\x57\x10\x68\x30\xb9\x05\xb3\x7e\x41\xde\xee\xbf\x0b\x34\xdf\x05\x9a\xef\x02\xcd\x3f\x85\x40\xd3\x36\xcf\xce\xae\xe8\xf3\xb2\x1a\x4d\x23\x4d\xe1\xa8\x66\xa1\x00\xdb\x03\x8b\xda\x26\xb3\x8e\x89\x5b\x6b\x01\x31\x27\x11\x60\x40\x1c\x89\xba\x5e\xa9\x7a\xb9\xaf\x0f\x4d\xd7\x4f\x89\xd6\xf8\x17\x1e\xb6\xd0\xa1\x96\xfe\x2b\x60\xf7\x1d\x84\xc9\x79\x30\xa7\xbf\xe4\x0c\x76\xdc\xe6\x17\x4b\xeb\x6d\x20\x19\x53\x76\xf2\xc0\xaf\xb1\xcc\x5b\x0d\xfa\x59\x7a\x80\xab\xd6\x2f\x24\x26\xa0\x6c\xf6\x42\xc1\xf0\x18\xd2\x53\x77\x01\xda\x9d\xde\x32\x48\x15\x56\x04\x09\x97\x0d\x9c\xa4\x0d\x20\x6e\x43\xce\x8a\xd8\x4d\xdc\x22\x32\x0d\x0f\x17\x0e\x32\xe6\x23\xc9\x30\x10\x05\x39\xb3\xaa\x41\xf2\x95\xd9\x98\x02\x69\x61\xb9\x65\xe7\xb4\x05\xb1\x8e\xdd\x9d\xa4\xe8\xdc\x6d\xf3\x6c\xd5\x0e\x2e\x22\x52\x81\x44\x43\x2b\xaa\x4a\x4a\xcb\xa6\x05\x66\x32\x51\x53\xca\x1c\x66\x51\x2b\xa7\x7a\x14\x81\x0f\x1d\xdb\xd1\x69\x58\x9e\x28\x91\x86\x2a\x38\x67\xb8\x1a\x24\x23\xd7\x78\xd5\x92\x75\x8d\x95\x50\x88\x48\xbc\xf5\x89\x02\x33\xa8\x32\x3e\x7d\x97\x0b\xc6\x2b\xca\x7e\x9e\xaa\xfd\x7f\x80\x87\xe8\x2c\x01\xf7\x02\x05\x70\xfb\x0e\x05\xc6\x22\xc9\xca\x5b\x96\xb2\xcd\x69\xc7\xfa\xef\x50\x6e\xac\xb1\x70\x44\x02\xa5\x99\x1a\x11\xa3\x96\x99\x14\x11\xdc\x12\xe5\xea\x46\xaf\x33\x88\xd9\x1a\xae\xf0\x10\x93\x46\x60\x5a\xc3\x99\x05\xad\xaf\x8a\x90\xcc\xd4\xb4\xcc\x87\xe4\x5b\x1c\xcf\x75\xc3\x12\x87\x69\x71\xc4\x1b\x0b\x4d\xf5\x68\x91\x8d\x40\x04\x48\x7d\xd3\xd4\x14\xfc\x32\x64\xc9\x14\x15\x97\x1e\xe4\x9a\x6c\xb9\xca\x37\xae\x49\x0c\x88\xa8\x63\x91\x61\xc0\x48\x54\x24\x44\xda\xc0\x3b\x96\x2e\x27\xba\x98\x96\xec\xda\x4b\xd3\x19\x28\x4e\x5f\x92\x25\x2c\xde\x13\x91\xfb\x76\x7b\x16\x70\x7a\x6d\x5b\xbd\xeb\x09\x16\x0b\x5b\xd5\xc7\xa7\xa2\x2d\xb7\xac\x99\x38\xe5\x94\x34\x59\x26\x3c\x5e\x59\xcd\x12\xf8\xc0\xc2\x66\x53\xcf\x12\xf2\xf6\xc3\x2d\x55\x69\x0c\x2a\x3c\x53\xa7\x3d\x7c\x71\x00\x2c\x47\x0f\xcb\xc9\xc7\xd2\xfb\x2d\x46\xb6\x6f\xf6\xfb\xaa\xf8\x95\xd9\xa4\xd2\x68\xaf\x44\x66\xd2\xc4\xd4\x9b\x0b\x8c\x0a\x1f\x27\x97\x07\xf2\x53\x2c\x5f\x17\x52\x5b\x6b\xf5\xba\x0c\x0e\x76\xe7\x5a\x0a\x81\xdf\xbb\x24\x2f\xf1\x33\xe1\xb1\xb3\xe0\x62\xbc\x38\x1c\x09\x3b\xea\x93\x7f\x36\x76\xca\xe7\xe6\x50\xd4\x97\x23\xab\x01\xfb\x65\x71\x2f\x76\xd7\x47\x7c\x80\x79\x25\xac\x4f\x63\xa6\x9e\x56\x7d\x91\x65\xf1\x88\x4d\x8a\x84\xec\x9f\xd3\x9a\x62\x39\xa1\xd5\xb9\x25\x89\xb2\x46\x99\x08\xc8\x10\x64\x26\xae\xde\xc3\xca\x25\x3f\x4f\x94\x27\x4b\x32\xf5\xd9\x5d\xe4\x87\x43\xf5\xa2\x06\x76\xfe\xbe\x0c\xbf\x2f\xc3\x7f\xf2\x65\x38\xbb\xe6\x90\xc5\xfa\x7d\x19\xfe\x33\x2e\x43\x08\xe6\x73\xb1\xa3\x2b\x47\xfb\xf4\x36\x8b\x1c\x7b\x66\x23\x2f\x68\xfa\x8b\xe7\x19\x10\x69\x9e\x9f\x6f\xfd\x06\xa2\x66\x4c\x03\x37\x73\xec\x6d\x40\x88\x5b\xa3\xa4\xe2\x10\xd5\x0e\x8b\xef\x13\x02\xe9\xce\xbf\x4e\x40\x30\xe8\xc3\x3e\x48\x59\x64\x78\xdb\x1f\xe3\x6b\x9c\xdb\x33\x16\x46\x82\xe7\xac\x22\xb9\xa5\xc5\xcc\x31\x54\xad\x1f\x6d\xac\xae\xbc\x32\x6d\x61\xcf\xec\xe5\x4b\xd6\x24\x1f\xeb\x5d\xd1\x92\x6c\xae\x4b\x49\x6b\xea\x6c\xe5\x76\x4d\xdb\x23\xe2\xb5\xf2\xe8\xa0\xbf\xbe\x6a\x82\xdd\x2c\xa6\xfb\xf4\x58\xae\xe6\xd0\x99\x32\x26\xbe\xc3\xb2\x65\xb0\xa3\x87\xee\x23\xdf\xf3\xb4\xd8\x63\x0f\x6d\x4b\x50\xb3\x32\x06\x51\x1e\x96\x7f\x64\x6e\x91\x0e\x3b\xb9\x6e\x45\xb4\x87\xa5\x43\x2a\x3b\x6e\xfc\x7b\x5a\xf3\xc7\xb1\x26\x4f\x0b\x3e\xaf\x79\x59\x3c\x18\xb5\xe8\x21\xaf\x77\xdf\x3e\xdf\x53\x29\xce\x5f\xb4\x08\x39\x79\xc2\xb1\x90\xd3\x96\xfd\xc9\xf6\xcd\xb6\xa9\x9c\xb6\xe8\xca\xbf\x5b\x4d\x14\x78\xd7\x3f\x9b\x23\xce\x13\xfc\x62\x6e\x69\xe8\x82\x8e\xd5\xe9\xdb\x7c\xfb\x08\xd5\x17\x82\xed\x92\x23\xbe\x06\x12\xaa\x63\x8a\x43\x0f\x33\xa5\xde\x35\x7d\x5f\xe0\x06\x5b\x69\xb6\x4d\x8a\x04\xb5\xcc\x66\x6b\x5f\xd5\xa2\xff\x9f\x37\xde\xad\x3a\x59\x5f\x92\x28\x6e\x53\x3b\x79\xdb\x36\x24\xf5\x11\x2b\x9b\xf1\xae\x16\x5d\xab\xcf\xc0\xa8\xf8\xbc\x2d\x8a\x5d\xb1\x73\x9e\xf2\xcf\x27\xd1\x0e\x8c\x4a\xb7\x94\xaa\x54\x5e\x0d\xfc\x6c\x1d\x86\x6b\x6f\xed\x86\xb7\x4b\xba\xbd\x8e\xf2\xfd\x82\x6e\x2e\xd4\xc7\xcf\x09\x91\xd4\x16\x61\xf6\xb1\x69\xfa\x2d\xbb\xb3\x2f\x68\x3a\x2c\x0f\x9e\xb7\x11\x44\x23\xa2\x17\xa1\x49\x0d\xe2\xcf\xbe\x7a\x93\x00\x44\x82\x70\x36\xab\x54\xb1\x51\x93\x14\x55\x75\xa1\x74\x8d\x40\x60\x5a\x1f\x10\xb4\x2f\x93\xa2\x31\x9d\x35\x7e\x9c\xaa\x5a\x1b\x29\x33\x88\x6b\x85\xcd\xc0\x7a\xf9\x2a\x6a\xa7\xa2\x82\xda\x75\xa6\xb3\xfe\x55\x28\x41\xe6\x8f\x44\xd3\xd8\xec\x4f\x3d\x03\x14\xab\x27\x67\x63\x7b\xe9\x79\x99\xe7\xd1\x3d\x0b\x1a\xb3\x88\xbb\x14\xa9\x11\xcc\x79\xb8\x91\x88\x70\x04\xd0\xf8\xca\x20\xdc\x52\x92\x44\x09\xb8\x17\xcd\x70\x5e\x10\x94\x0e\xc4\xbc\x31\x58\xad\xfc\xed\xd8\xf5\xe5\xfd\xcb\xa8\x8e\x16\x83\xa5\x1a\x22\x72\xe8\xe2\x6c\x09\x72\x83\x1d\xa6\x27\xe4\x01\x0b\x35\x11\x36\xc0\x00\x7c\xe6\xe9\xd0\xbf\x08\x41\xba\xc4\x84\xf9\x56\xd6\x4d\xd8\x45\x5c\x26\xd5\xa4\xb9\x87\x06\xd7\xe4\x20\x60\xc4\xb9\x0b\x87\x7f\xec\x06\xa0\x99\x44\x92\x14\x8e\x1f\xc6\xe1\x74\xa7\x0b\xd5\xcc\x44\x4a\xae\x50\xeb\xe4\x62\xe0\xfb\x28\x77\xf2\x85\x80\xa5\xab\xfb\x61\x67\x9b\xaf\x0e\x4d\x3d\x97\x0c\xff\x49\x03\x96\x9c\xae\x68\xbb\xb2\xa9\x69\x0d\xdf\x65\xc9\xda\xce\xca\x73\xc7\x1a\xfd\xe9\x73\x55\xd6\x8f\x73\x8d\xfd\x2c\xcb\x6e\x82\x9f\x69\xdd\x4b\x92\xe0\x15\x55\x55\x1e\xba\xe2\x26\xf0\x4a\x96\x62\xee\x90\xf7\x0f\x3c\xeb\xdc\x96\x8d\x3d\xf4\xd8\xef\x17\xfa\x3b\xf1\xdd\x34\x19\xfe\x97\xd2\xef\x2d\xab\xe7\xc7\x6e\x14\xfb\x41\xe6\x45\xec\x3b\xab\x1f\xb9\x69\x48\xff\xc7\x90\x25\x49\xe5\x78\xdf\x73\x38\x3e\xe5\xdd\x23\x40\x70\xf8\xe9\x30\xfa\x0f\x7f\x7f\xa0\x2b\xfa\x2f\x75\xd9\x33\xa2\x1f\xbb\xa2\xfd\x5f\x87\x7c\x5b\xfc\x5b\xfd\x97\x61\x6c\xbc\x26\xa8\xd2\xdc\xfd\xad\xd8\xf6\x7f\x1e\x96\x46\x59\xef\x87\x49\xa6\x93\x30\xce\xf5\xf0\xeb\x45\xf8\x45\x96\x2e\xa7\x87\x9b\x79\x41\xbc\xf1\x36\xb4\x88\xae\x70\x5a\x96\xb9\x51\x02\x69\x43\xb3\x0a\x0e\x25\xc4\x37\x06\x9f\x2d\xfd\xe0\x8f\x64\x72\xd8\xa2\xf8\xd3\x43\x5b\xdc\x53\x60\x37\x41\x38\xcd\x14\xa7\xe8\xd1\x82\x9a\x37\xc1\xcf\x84\xa0\x4b\x73\x19\xee\xc1\x14\xfc\x8f\x7c\x5f\xf0\x35\xd2\xf5\x6d\xf3\x58\xd0\xef\xc3\xe9\x0d\xbf\x3a\x80\x66\xbe\x4c\x8e\xa9\xf2\xf0\xcd\x69\x8f\x15\x83\x52\x7c\x2a\xea\x66\xb7\x9b\xa7\x94\x88\xd4\x9f\xda\xfe\xae\xc9\x5b\x8b\x76\x18\x85\x39\x94\x7f\xfb\x94\x57\x8e\xef\xa9\x63\xbb\x09\xc2\x0f\xfe\x4f\x3f\xff\xf7\x9f\xa7\xf5\xc4\x56\x5b\x5b\xbd\xb9\x09\x42\xba\x2c\x6f\x75\xc3\x0f\xdc\x8d\x50\x34\x48\x6f\xdb\xfc\x40\x0b\xbb\xff\x77\xcc\x5b\x91\x72\xbb\xbc\x7b\xc8\xdb\x36\x67\x6b\x30\xbc\x09\x3e\x24\x37\xc1\x87\xe1\xff\x63\xb6\x56\xaf\xb5\x26\xd0\x34\x94\x3c\xe1\x64\xb8\x71\xa3\xc4\x0f\x93\x28\xbd\x09\x3e\xf8\x1b\xd7\x4f\xa2\x20\x8a\x93\x9b\xc0\xfb\x65\xd8\x05\x9b\xcc\xf3\xc3\xa1\x28\x8c\xdc\xcc\x8f\xfc\x4d\x44\x8b\xfc\x9b\xe0\xc3\xd0\xc4\xfb\x25\x0c\xdc\x38\x4b\xd3\x74\x33\xa0\x1e\x25\x6e\xec\x27\x69\x10\x26\x4a\x91\x08\x20\xf6\x5d\x2f\x49\xc3\xc0\xdf\x0c\xdd\xc6\x6e\x1a\x27\x5e\x14\xc4\x37\x81\xf7\x41\x5f\x14\x6d\xdc\x24\xc8\x62\x3f\x19\x28\xe5\x27\x6e\x12\x47\x41\x96\x64\x43\x49\xe4\x66\x49\xb0\xc9\x3c\x52\x92\xba\x61\x98\x05\x61\x18\x0d\xe0\x22\xdf\x0d\xb2\x24\x48\xa2\x84\x0e\xd0\x0b\x22\x3f\x19\xb8\xab\xa7\x1f\xba\xbe\x84\xe6\xce\x04\x1b\x65\x98\x8e\x2c\x96\xd7\xbe\xb0\x98\xf8\x4c\x11\xca\x5f\x30\x55\x91\x9b\x46\x49\x98\x05\x01\x19\x49\xe0\xc6\x49\xe2\x6f\xe2\x81\x30\xbf\x44\x6e\x12\x78\x49\x9c\xf2\x22\x3f\xf1\xe2\x30\xda\x10\x4a\xbb\x61\xec\xc7\x91\x1f\x0d\x25\xbe\xeb\x27\x41\xec\x45\x11\x2d\x49\xd3\x24\x08\xc2\x4d\xcc\x8a\xe2\x2c\x0b\x07\xc2\xfc\x92\xb8\x81\x97\x85\x49\xe8\x65\xac\xa7\x38\x0d\xa3\x8d\x4f\x7b\xd2\x21\xf1\x7f\x6f\x02\xef\x5f\x0d\x2d\x13\x37\x0c\xe2\x28\x48\xc2\x80\x16\x65\xa1\x9f\x66\x31\xc1\x24\xd8\xb8\x51\x96\x84\x04\xce\xb0\x50\x36\x69\x96\xa4\xfe\x46\x29\x8a\x52\x77\xe3\x65\x49\x92\xf9\x6c\x79\x25\x74\xcd\x45\x9b\x30\x89\xfd\x10\x7c\x1c\x80\x64\x59\x10\x26\x84\x3c\x71\xe8\x66\x69\x18\x65\x11\xed\x39\xf5\xc2\x78\x43\xab\x4b\x25\x41\xb2\xd9\x04\x9e\x6f\xa6\x01\x19\x68\x1c\xbb\xe1\xd8\xd0\x73\x37\x89\x17\x86\x29\x5d\xda\xb0\x24\x1c\x40\x7a\x49\x42\x86\x19\x92\x0c\xad\xb1\x1b\x25\x61\x1a\xf8\xc9\xf8\x29\x4a\xdd\xd8\x0b\xe2\x88\x76\x1c\xa4\xae\x37\x8d\x38\xe3\x47\xab\x52\x34\x02\xca\xe8\x64\x7a\x99\x9f\x66\xc9\x66\x43\xbb\x4d\x36\x5e\x1c\x05\x74\xc6\x42\x3f\x0c\xe2\xd0\xf3\xf9\x0a\xd8\xa4\x29\x45\x48\x3b\x08\x74\x99\x47\x19\xb2\xcc\xd3\x9f\xff\xfc\xd3\x4f\x3f\x5d\xb4\xcc\x55\x19\x85\x30\x69\xac\xb7\x9f\xc9\xff\xcc\xc2\x8b\xef\xbb\xe9\x26\x4e\xe2\x48\x94\x5d\x86\x05\x0b\x65\x96\x84\xd5\xf2\xfc\xe5\x32\x8b\x99\xa3\x7a\x94\x07\xf9\xa9\x1f\x0e\x02\x84\xf7\x21\x4c\xdc\x4d\x9a\x06\x7e\x9a\x4a\x25\x51\xe8\x86\xbe\x1f\x04\x9b\x80\x32\xb4\x28\xf1\xbd\x94\xac\x82\x68\xe3\x7a\xa1\x1f\x84\xa9\x4f\x99\x60\x10\x64\x81\x3f\x70\x37\xef\x43\xec\xb9\x41\x9a\xa6\x89\x4f\x8a\x22\x37\x89\x82\x4d\x36\x80\xf6\xe2\xc0\xf5\x62\x2f\x4d\xfc\x8c\xae\x81\x2c\x1e\xf6\x11\x29\x09\xdd\x20\xf0\x93\x80\xf0\xed\x61\x51\x86\x71\x94\xa5\x21\x01\x17\xb9\x7e\x16\x0e\xa4\xa0\xeb\x3c\x09\xe3\x78\xb3\x19\x7a\x8a\x23\x97\xb3\x13\x3f\x8d\x37\x64\xd3\xf1\x6f\x13\x8d\x09\x04\xf6\x2d\x8a\xc3\xd4\xdf\x64\xb4\x1e\x80\xea\xb9\x59\x18\xa7\xfe\xb0\xce\x24\x54\x3c\x37\x1c\xf6\xa2\x97\x12\x40\x10\xff\xcc\x4d\xfc\x30\x8c\xbc\x81\x5d\x78\xc2\x98\x37\x6e\x16\x6c\x22\xdf\x23\xfc\x5d\x20\xd4\xc6\x0d\xa3\xc0\xcb\x52\x72\xc6\x7c\x10\xa8\x9b\xba\xbe\xef\x05\x61\x3a\xf0\x6a\x4f\x98\x90\xc4\x1d\xe0\x90\x59\xa3\x7f\x7e\x08\x42\xd7\x0f\x82\x74\x43\x4f\x65\xf2\x6d\x38\x6d\x36\x9b\x94\x30\x25\x11\x96\xef\xbb\x59\xb2\x49\x93\x20\x53\x10\xc8\xdc\x34\x18\xf8\xeb\x40\x4d\x11\xeb\xd4\xcd\xa2\x2c\x08\x37\x84\x2b\x0b\x23\x4d\xdc\xe1\xbc\x4c\x93\x4d\xa6\x92\xc7\xdd\x78\x89\x1f\x85\x2a\x49\xdd\x48\xa1\x3f\xff\x04\xa6\xc9\x8d\x94\xd9\x84\x10\xe1\xd4\x8b\x58\x08\xeb\x45\x40\x5d\x58\x64\xc2\x70\x85\x85\x29\xd0\x48\x5c\xcd\x02\x61\x85\x2d\x20\xcc\x02\xdc\x35\xca\x06\x23\x0c\x99\x7e\xdd\xb8\xf1\xb8\xed\xfc\xd8\x4d\x22\x2f\xce\xe8\x1a\x04\x25\x11\xc5\x22\x0e\xc3\x20\x19\x6e\x7a\x9e\x42\xab\x88\x4c\x98\x17\x6e\xbc\xc8\x4b\x87\x26\x02\xac\x98\x23\x41\xe4\x95\x28\x72\xc3\x38\x8b\xbc\x90\x17\xc5\x89\xdc\x3a\x56\xf7\x4c\xa2\xe0\x00\xc1\x40\x6c\x95\x81\x49\xcc\x99\x32\x4b\xe7\x43\x73\x78\xf9\x32\xfc\x59\xe2\x6f\xfe\xc6\x0d\x12\x6f\x93\x44\x21\xdd\x0a\x51\x9c\x04\xd9\x86\x1e\xd6\x81\x9b\x06\x69\x18\x33\xf9\x2c\xf3\xa2\x34\x88\x7c\xb2\xa5\x74\x25\x7e\xec\x86\x9e\x97\xc4\x19\x63\x81\x61\xe6\xfb\xe9\x00\xda\xf3\x87\x3d\x9f\x78\x1e\x63\x73\x69\xec\xfb\x71\xc6\x36\x42\x10\xfb\x61\x14\x50\x7e\x1a\xba\xbe\xef\xfb\x11\xa1\xbc\x1b\x6e\xbc\xd0\xf7\x3c\x46\xef\x4d\xb0\x89\x42\x2f\x40\x4a\x86\x73\x3e\x0b\xa9\xbc\x29\x14\x79\x83\x30\x11\x6c\x06\xee\xe4\x0d\x82\x5f\x12\x86\x7e\x1c\x90\x5d\x1a\xf9\x9b\x34\x4d\xc9\xb9\x3d\x1c\xa3\xc3\xc0\x43\x32\xd3\x71\x1a\x06\x11\x3d\x87\x07\x4c\xe3\x28\x0b\x09\x0b\x4b\xdd\x78\xb3\xf1\xd3\x28\x23\xd9\xec\xb5\x64\xd3\x97\xe0\xd2\x66\x72\x2d\x69\x93\xd4\xdb\xeb\x6e\x8a\x7b\x35\x41\xfc\x0f\x26\xc5\x11\x4d\xda\xa2\xa8\x3c\x94\x38\xbc\xb6\xed\x8a\xaa\x32\x79\xbc\xcd\x7b\xe3\xc9\xcf\xf0\x24\x03\xbb\xf6\xc5\xff\x56\x2a\x07\x4a\x05\xb9\x88\x6a\x8c\x6e\x17\x62\xa7\x77\x83\x13\x83\x18\x08\x4f\xaa\x72\x0c\xe4\xa5\xb0\x35\x64\xbe\x06\xea\x3a\x95\x09\x0b\x4e\xbd\x10\x6f\xb8\x60\xf8\xcb\x30\x8c\x5b\xe1\xc1\xb8\x16\xa8\xc3\xe8\x52\xf0\xf2\x2c\xe8\x63\x30\xdf\x37\x4d\xcf\x1f\xaa\x47\xa3\x91\x59\xa7\x48\xe5\x49\x96\x78\xce\x38\x77\x45\xff\x5c\x14\xb5\xf0\x86\xdb\xf5\x6d\xd1\x6f\x1f\x40\xa2\x22\xfa\x5c\x2a\xa5\xf1\x9a\x6c\x09\x61\xaa\x8b\x39\x57\x3e\x7d\x24\x1a\xf1\x79\x5c\x13\xc5\x5a\x70\x03\xb4\xcb\x15\x60\x95\xa3\x4c\xa1\xef\xca\x3d\xe4\xfb\xb2\x26\x96\x4a\x73\x39\xd7\x80\x13\x34\x4a\x6a\x52\x5c\xd4\x3b\x89\x82\x9b\xb9\x7e\x09\x61\xa5\xfd\x28\xea\x27\xd4\x00\x38\xef\x0c\xc6\x97\x9a\x1e\xa8\x76\x85\xb2\x91\x31\xbb\x10\xcf\x66\x8d\x24\x08\x30\x82\x39\xe4\xfb\x82\xfc\xe4\x5e\xf5\xd3\x0a\x01\x69\xb0\x1c\x60\xfd\x24\x68\xca\x11\xe5\xf9\xac\x35\x96\x06\x9f\x1f\xe1\x87\x5d\xd1\x6d\xdb\xf2\x40\x66\x53\x4c\x96\x14\xcc\x0e\x0e\xb6\x35\x46\x1c\x42\xda\x56\xe5\x68\x98\x00\x3b\x9c\xcb\xc0\x87\x00\xe5\xf6\x16\xcf\x65\xbf\x7d\x18\x95\x60\xaa\x5d\x99\x81\x2f\x9c\xdf\x0f\x0b\xd1\x32\x96\x32\x55\x1c\x3b\x92\x30\xdd\xe0\x45\xe0\xe6\xdc\x63\x8c\xc0\x35\x50\x61\x78\x87\x4c\x49\xc5\x35\x2a\xbe\x98\xc5\x8a\x77\x61\x6f\x8b\x49\x62\x4b\x0b\xc5\x75\xec\x1c\xa8\x7a\x07\xb2\x4b\xa0\x5d\x67\xd6\xe8\xe7\xd3\xb2\xa4\x5b\x5a\x0b\x7d\xe9\x18\xf9\x06\x4d\xf4\x6d\xbd\x60\xc6\xc3\x8f\xa9\x7b\x03\x9a\x2a\xc4\xc2\xa5\x9a\x1b\xfc\xf9\x5e\xbc\x7c\x59\xd3\xcf\x2b\x97\x15\xb3\x88\x01\x46\xbd\xb8\x28\x59\xc8\x31\xdb\x64\xfd\xaf\x9c\x70\x07\x11\x35\x34\x2c\xfa\x0c\xc4\x99\xe5\xb0\xc2\x0b\x54\xfb\x91\x4b\xfb\xe3\x89\x57\x9f\xf2\xcf\xe3\x40\xa8\x45\xef\x94\x58\x52\xf6\x99\x0f\xe4\xb8\x33\x97\xf4\xbc\xaa\xca\x13\x72\x98\x8a\x79\xcd\xfc\x2b\xf4\xc7\x1b\xdd\xf5\xfc\x68\xbd\x26\x1d\x79\x23\x66\x4c\x42\xb8\xb3\x79\xf9\x71\x69\xeb\xab\x72\x9e\xdf\x88\xbf\x90\xc8\x8c\xbe\x73\x9a\xaf\xc1\x69\xb4\x16\x30\x97\xf7\x2e\x66\xfe\xbd\xe8\x40\xbe\x88\xb1\xf9\x4a\x1a\xb5\xef\x9c\xed\xca\x9c\x8d\xa4\xd9\x6f\x9f\x46\x4f\x9e\x31\xec\xe0\xdc\xdd\x55\x70\x23\xd1\x82\x59\xc9\x5d\xb2\xeb\x1d\xee\x53\x44\x62\x66\xfc\xb5\x7f\x39\x14\x7f\xe0\x65\x1f\xdf\x92\xbf\x8a\xdd\x8f\xd4\xc7\x88\x59\x4a\xee\x8a\xfb\xfc\x58\xf5\x52\x02\xee\x68\x4a\x65\xfd\x55\xb0\x19\xa3\xc1\xaa\x6c\x9e\xcb\xdb\x5f\x11\x17\x7a\xf3\x66\x47\x06\x79\xaa\x80\x89\xa9\xb0\x60\x46\x24\x81\xf1\xf4\x20\xc8\xa2\x41\xa9\x7e\x11\x36\xe6\x8c\xc8\x12\x01\x59\x6a\xc7\xf7\x00\x34\xee\x5a\x42\x1c\x4c\x14\x22\x92\x03\xc7\x5b\x0f\xff\xb8\x31\x70\x40\xc9\x84\x28\x5b\x84\x6a\xa8\x3b\x1a\xc8\xf4\x9d\x00\x5b\x3e\x16\x76\x36\x52\x37\x7f\x3a\x97\x1f\x92\x1d\x2e\x22\x8b\xb2\x4b\x2a\x69\xe1\x4a\x85\x39\xe1\x70\x37\xa8\xc9\x0f\x07\xf8\x48\x05\x8a\x93\x94\x19\x91\xa2\xaa\xa6\xeb\x96\x48\x0d\xd5\xd6\xd1\xe1\x86\xe2\xaa\x5f\xca\xbf\xbf\x71\xec\xfb\x63\x97\x45\xdb\xfe\xe6\x21\xba\x77\xf9\x6e\x5f\x88\xf0\x60\x94\xdc\x09\xa0\x6c\x20\xab\x02\x54\x9e\x7f\x4d\x66\xf1\xf3\xcd\xf1\x44\x82\xf3\xe3\xfa\xed\xe5\xa9\x14\xcf\x58\xee\x10\x11\xa0\x5e\x01\x01\x96\xae\xf2\x2a\x44\xd2\xda\xd5\x5f\x06\x1d\xac\x67\xe1\x3c\x9f\x87\x2a\xbd\xd6\x63\x42\xc1\x22\x20\x54\x0f\xb2\x3c\x1d\xad\xda\xc9\x12\xcf\xa5\x71\x53\x13\x95\xd2\x5f\xbb\x87\xfc\x50\xfc\xa1\xac\xef\x1b\x67\x5b\xb6\xdb\xaa\xf8\xb8\x66\xdf\x8a\xcf\xdb\x2a\x7f\xa2\x4f\x9a\x7d\x5b\xe6\xf5\x5e\x53\x28\xb5\x23\x27\x9b\xfc\x71\xe8\x60\x6a\xdc\xb6\x4d\xfb\xf1\xd6\x98\xaa\x77\xd9\x90\x18\x5f\xfc\x87\x0f\xe9\x34\x6e\x1d\x4f\x48\xea\x3a\xcf\xcc\x98\x86\xc7\xac\x7f\x99\x67\x46\x88\x22\xc3\x78\xdb\xd1\x43\x58\xf6\xce\xca\x99\x0f\xce\x1f\xac\xfa\xfb\x6a\x62\xa8\x1c\xeb\x93\x41\x85\x4f\xfe\x48\x14\x4f\x18\xef\x16\x51\xc1\x88\x1a\x1b\x59\x21\xc3\xb9\xf3\x00\x6e\xe5\xbd\x2a\xda\x82\xe1\x3f\xec\xa5\x80\x30\xe4\xe5\xaa\x3d\x44\x92\x63\x3a\x3d\xa5\x37\x41\x59\xb1\x3d\xb6\xed\x70\xb5\x93\x03\x57\xab\x2a\xbd\x34\x88\x02\xf9\xd5\x75\x5e\x7f\x87\xa5\x29\x12\x5e\x59\x90\x5b\x9d\xa2\x60\x84\x7e\x79\x01\xea\x00\xf7\x0e\xf8\xb9\x0e\x14\xfc\xaf\xe5\xd3\xa1\x69\xfb\xbc\xee\xad\x86\xcf\xc3\x88\x5b\x54\x65\x0b\x15\x0d\xf6\x4d\x8e\x5b\xa8\x28\x96\xc9\x95\xe7\xc5\x2e\x13\x5f\x75\xc6\x77\x1d\x4d\xe9\xf4\xce\xb3\xaf\x9a\xbb\xbc\x72\x28\x48\x42\x8e\xf5\xca\x63\xb2\x1c\xfa\x1c\x34\xe1\x4e\x03\x27\x32\x64\xa8\xdb\x1f\x7b\x18\x62\xbd\xde\x2a\x64\x7a\xff\x7b\xc8\x8c\x7c\xba\x8f\x4d\xf4\x21\xf9\x84\xcd\x24\xac\xf2\xb9\x1a\x87\xb6\xf8\x54\x36\x73\x53\x51\x17\x9f\xfb\xd9\x4b\xee\x39\xd1\x07\xe7\x07\xf8\x76\xca\x0c\x30\x37\x52\xcb\xaa\x7c\xc8\x96\xd5\x87\xb1\x83\x04\x03\x74\x61\x15\x79\xb1\xbb\xf7\xa6\xdc\x02\x71\x72\xf1\x5c\x71\xb4\x4e\xe2\x35\x3d\x99\x5d\x07\xf3\x93\x4c\xa6\x4f\x51\x0a\xab\x50\x7f\x1d\xd2\xb2\x38\x05\x92\xd4\xca\x24\x63\xcd\xc8\xf4\x22\x6e\x51\x55\x94\xe3\x39\x7f\x2f\xda\xe6\xc4\x71\x9b\xd8\xda\x84\x38\xf8\xc6\x93\xb5\x08\xfa\x60\x50\x3e\xf1\x51\xd8\x4a\x38\xba\x20\xe3\x1c\xd1\x69\x8e\xc3\x01\xa9\x0d\x06\x2c\x06\x11\xa6\x9f\xf6\x6d\xf3\xfc\xd6\x1f\x1f\x08\xe5\x88\xaf\xe4\xa2\x65\x05\x11\xc4\x08\x46\x81\xc2\xc3\x41\x12\x36\x58\x72\x02\x12\x34\x72\xfc\x0a\xb3\xa9\x0b\x56\x23\x62\x50\x08\xd9\x02\x07\x85\x25\x0d\x83\xb9\x1e\x46\x37\xb3\xed\x50\x3f\xd4\xf5\x5c\x2b\x90\x0b\x5e\x88\xb1\xa0\xb3\x49\xc2\xa1\x30\x49\xd3\x60\x3f\xe3\xe9\x60\x00\xa9\x12\x75\x40\xd5\x54\x86\xa2\x15\x97\x00\x95\x10\xcc\x54\xe4\xb2\xc4\x5e\x6b\x6f\xa1\x6a\xf2\x41\x96\x8a\x01\x94\x6a\x3d\xa1\xaf\x8b\xe4\x8b\xc2\x02\x0d\x23\x91\x5c\xb8\x28\x60\x4e\x75\x44\x39\x87\x36\xf7\xa3\x28\x63\x51\x63\xbc\x29\x32\x8c\x61\x8c\x6a\x74\x9f\x85\x68\x47\x36\xa9\x29\x45\x9d\xd8\x64\x2b\x38\x46\xae\x91\x2f\x3d\x0c\xc3\x43\x5e\x0b\x0f\x40\xcc\x2f\xf7\x9c\x44\x66\xa2\xf8\x49\x8e\x12\x68\x2b\xa6\x6c\x71\xd4\x30\x0c\xad\xa1\x7a\x5c\x8f\x4c\x87\x9a\x31\xbe\x53\x4d\xb4\x28\x7b\x0a\x18\x17\x4e\x12\x64\x67\x0c\x63\x1f\xb5\x29\x16\x5c\x4f\xe4\x74\x78\xf4\x27\x06\x9a\xc4\x40\x17\xef\x2d\x93\xfc\xa6\xdc\xfb\x58\x23\xf6\x26\x2a\xda\x0f\x01\xf1\x3b\x43\x6c\x00\x37\xca\xdb\xab\x2f\x3c\x09\x52\x9f\xf2\x99\x43\x42\x87\xca\x4a\xf3\x9d\xc5\x63\x43\xc7\x47\x57\xd1\xc6\x30\x40\x15\x2a\x9d\x08\x16\x50\x90\xc1\xf4\x05\x95\xa1\x3c\x06\x0b\xc5\x8c\x75\x9f\x44\xbd\x34\xfc\xeb\x54\x65\xfd\x28\x6c\x86\x8d\xfa\x16\x6a\xb2\x53\x3a\xb3\xcb\xe9\x65\x57\x17\x92\x81\x01\x10\x43\x91\x78\xc6\xc8\x23\xb0\x89\xe6\xad\x8c\x26\xb1\xe3\xba\x1e\xb4\xa5\x3a\x88\x5f\xd3\xd3\xa9\x14\x4e\x5d\x1f\xc3\x45\x79\x33\x5d\x40\x03\xad\xd8\x68\x0f\xc3\x2d\x3b\x7a\x1c\xaa\x17\x7d\x16\x39\x0f\xbb\xac\x5f\xd4\x95\xae\x16\x5c\x86\xa2\x52\xcb\xa6\x0f\x75\x11\x0b\x11\x60\x7d\x13\xd6\xd8\x7b\x7f\xa8\x6f\xa0\x7b\xba\x65\xe7\x1e\x0b\xba\xa6\x18\xcc\xf3\x83\xf9\x53\xd1\x56\xf9\x0b\x2a\xdf\xbc\xd7\x88\xda\xef\xe7\x04\x66\x8d\x90\x4a\xbb\xc2\xd9\x01\x54\x32\xa2\x02\x24\x3e\xf3\x7f\x7c\x2a\x76\x65\xbe\xea\xb6\x6d\x51\xd4\xab\xbc\xde\xad\xde\x4c\xe1\x93\xe2\x34\x39\x7c\xbe\x3d\x7d\x8d\xb1\x5d\x30\x84\x57\x1b\xa3\x1f\xc9\x34\xef\x0c\x13\xa0\x5f\x61\xde\xd5\x0b\x8d\x7e\xbe\x39\x63\x1e\xa3\x99\xcc\x83\xbf\x9e\xa9\x10\xcc\x55\x08\xe7\x2a\x44\x73\x15\xe2\xb9\x0a\x09\x96\xb3\xd4\x40\x1b\xe4\x19\x75\x52\x72\x7d\x19\xa3\xa5\xb3\x8d\x91\xbe\x80\x91\xd1\xb5\x8c\x87\xce\x33\x0a\xfa\x92\xc6\x3e\x34\xcc\xb9\x55\x54\xf3\xb3\x99\x92\x6c\x8f\xfc\x0d\xb2\xa8\x85\x51\xcd\x2f\x0e\x5a\x7e\x79\x4c\xf2\x73\x43\x8e\x7f\xcf\x13\x7e\x95\xc5\x60\x4e\x14\xfe\xd5\x53\x83\xcf\x65\xf9\xa6\x1e\x29\x2b\xc1\xd5\x4d\xca\x19\x6e\x42\xff\x37\x97\xdc\xfb\xb7\x9e\xce\x7b\x51\x02\xef\x2f\x98\xb2\x7b\x59\x92\x6e\x11\x0c\x9e\xaa\xfb\xcc\xe4\xdc\x4b\xd3\x71\xff\xa3\x12\x70\x9f\x97\x72\xfb\x2a\x49\xb6\xcf\x4c\xab\x7d\x5e\x22\xed\x33\x53\x67\x7f\x91\x64\xd9\x4b\xd3\x63\x7f\x91\x84\xd8\xfe\xe1\xb3\x98\x0d\xfb\xa1\xe9\xe0\x9b\x40\x5e\x6d\x8f\x43\x6d\xe7\xa9\xd9\x49\x1e\xbc\x96\x8d\x26\x59\x61\xbd\xb4\x01\x13\x36\x97\xb7\x6b\x9b\x67\xe7\x29\xef\xce\x6e\xbb\xad\xca\xed\xa3\x90\xe8\x53\x4e\xfe\x6a\x07\x8b\x17\x10\xd3\x2c\x01\x1e\xf9\xf5\x8e\xe6\x23\xad\xf2\x97\xe6\xa8\xa4\x8f\x3c\xb7\x0b\x4d\x99\x74\x71\xa5\x3d\xb3\x67\xe8\x61\xb9\x1e\xbe\x74\xd7\x8a\xb9\xb1\x84\xcb\xb6\xa8\x2a\x25\xba\xf6\xd7\x47\xea\x12\x53\x20\xc3\xd3\x19\x96\x60\x55\xd4\xb1\x43\x49\x2f\x11\xef\xc2\x14\x82\x24\x01\xb8\x5e\x28\xdd\x90\x15\x9b\x72\x1f\xb3\x6a\xf6\xae\x4b\xd3\xb6\x79\x96\x26\x52\x54\x84\x5c\xa7\x0b\x5d\x68\x0f\xc3\xd2\x81\x04\x4c\x14\xa3\x2c\x2a\x54\x2d\x9b\xb0\x33\x46\x25\x67\x4f\xb9\x8c\x9d\xe0\x81\x9e\x2f\x83\x29\xc4\x92\x17\x41\xdd\xe7\xbb\xe2\xc4\x05\x0b\x0f\x1a\xa3\xb1\x8f\x53\xca\x85\xb2\x76\x9a\xe3\x20\x14\x56\x95\xb3\x7d\xc8\xeb\x7d\xc1\xeb\x50\x30\x6e\x59\x8f\x90\x7c\xfa\xe9\xa7\xe6\xb9\x96\xa1\x8b\x27\xd4\x70\x3e\x05\xf1\xcd\xad\x45\xcf\x6b\x24\x0d\x84\x1e\xa7\xa9\xf6\x84\x8a\x80\xa1\x06\x9b\xe1\xa0\x6c\xee\xef\xe9\x73\x31\x0f\x34\x5f\xdc\x35\x24\xff\xcf\x74\xa5\x25\x24\x05\xa6\x28\x88\x9d\x0b\x97\xbe\x0f\x9f\x15\x43\x17\xf1\x1b\xbd\x41\x81\x0f\xe4\x16\xb3\x6d\xea\x61\x79\xfe\x39\xef\x8a\x61\x51\xff\xef\x66\xf8\x2b\xf0\xde\xf8\xb7\xa0\xa6\xa4\xdb\x05\x25\x9f\xca\xae\xbc\x2b\xab\x61\xa8\x4a\x19\x66\x81\xc3\x2f\x07\x2b\x6f\x65\xe8\x7a\xe5\xe1\x5d\x90\x3f\x2b\x68\xbc\x28\x3c\xbb\x9f\x3a\xfa\x0a\xfb\xd7\xbc\x2d\x73\x16\x4e\xe7\x0f\x7d\x7b\x2c\x3e\x8a\xcb\xf1\xf5\xaf\xc3\x9a\x35\x54\x60\x8a\x99\x3a\xff\x44\x15\x90\xb2\x92\x8b\x5c\x26\xa6\x89\xdd\xe6\x87\xb2\xcf\xab\xf2\xef\x05\xb4\x20\x7a\x75\xfb\xfc\xae\x43\xde\x29\x26\xc3\x0a\xa1\xc2\x8a\xf4\x47\xee\x6f\xb2\xb1\x46\x9f\xdf\x29\x5a\x71\x6a\xaa\xf0\xfa\x1f\x6f\x9d\xa7\xce\xb9\x3f\x56\x15\x53\x3d\xc0\xca\xeb\xb7\x6d\xd3\xf4\x2b\x43\x7b\x66\xea\x00\xaf\x60\x04\x29\xce\xb2\x84\xf7\x38\xa9\xec\xfd\x80\x30\xb7\xe8\x26\x2f\x8f\xb2\xf2\x0f\x7f\x1c\xc7\xe2\xea\x08\x23\xe6\xbe\x14\x82\x72\x9f\x86\x4b\x7f\x68\xcb\xfa\x11\xde\x2d\xa1\x0b\x46\x20\xda\xc2\x72\xd7\x71\x15\xe9\xd5\x34\xb5\xf2\x65\x54\x36\x30\x1f\xef\xc1\x52\xb0\x74\x7a\x72\x8b\x48\x09\x0a\x7e\xf8\xc6\xe4\xe9\x09\x2c\xe1\x63\x5c\x03\xfa\x56\xfc\x9a\x61\xaa\xc4\x6f\x4f\xd3\x1c\x95\x75\x57\xf4\xfc\xf1\x69\xd8\x92\xcc\xd8\xd5\xaa\x33\xe4\xd6\x1b\x06\xd1\x7d\x12\x98\x5b\xd3\x40\x5d\x14\xc4\xad\x36\xfd\x3f\x87\x34\xdc\x45\x9e\xcb\xbf\xe7\xed\x6e\xe5\x3e\x35\xbb\xbc\x72\x76\x65\x5e\x35\x7b\x1b\xdb\x10\xcc\xe4\x15\x7d\x7b\x9b\xfe\x0b\x9d\xf2\x82\x5b\xce\x5a\x63\x12\xa2\xe7\xb3\xa3\x78\x85\x8a\x98\xf1\x0d\xa6\x09\xc4\x74\x81\xb1\x8d\xb4\xab\x26\x85\x03\x31\xcd\x08\x56\x01\x4c\x92\x96\x24\x37\xef\xc6\xe4\x3b\x65\x5f\xe6\x95\xd6\x34\x47\xb1\x0c\x86\x29\x09\x30\x9a\x62\xc3\xa6\xd2\xef\x5a\x5b\xe2\x38\xf9\x76\x5b\x74\x84\x71\x9f\xb0\xac\x6e\xe4\xa5\x8d\x8f\x89\x3d\x12\xb9\x19\x9d\x9b\x70\x7a\x38\xc2\xfa\x66\x49\x08\x05\xe1\x77\xce\xfa\x12\x74\x2a\xbe\x5e\x85\xb1\xea\x48\xe9\xc7\x89\xa6\x6b\xc4\x9c\x48\x7c\x75\x83\x3b\x5e\x6d\x2e\xbb\xb3\xbc\xd3\x47\x98\x63\xdc\x90\xe1\x19\xb9\x23\x97\x93\xbe\x4c\x2b\x34\x12\xb8\xe2\x30\xd2\x91\xee\x11\x42\xcb\xe9\x6f\x47\x50\xe0\x80\xf4\x3f\x03\x0c\xe9\xc6\xae\x99\x0d\xa7\x87\xb6\xe7\xc2\x21\xc3\x90\xf0\x95\xc9\x07\xcf\x5d\x3a\xa8\xa2\x09\xa9\x8e\xaa\x6c\xc5\xb1\xa0\x80\x63\x23\x36\x4d\x9e\x68\x15\x05\xc2\x6d\x89\xf6\x43\x66\x12\x09\x7d\x9c\x0c\xae\x80\xd3\xdc\x4e\x14\x95\xfd\x34\x8c\xce\x1d\x3e\x4b\x68\x07\x9d\xae\xa1\x00\x4b\x73\x12\x0d\x20\xf2\x76\x90\x55\xed\x50\x5e\xe5\x72\xd8\x24\x9b\x56\xfc\xc1\xce\xaa\x2e\x3f\x8d\xac\x2a\xd3\xa7\x2e\xf8\x52\x6a\x35\x8a\xe9\x55\xcb\xae\x3a\x7f\xd4\x9a\x1e\xab\xe1\x84\xf9\xa6\x19\xef\xfa\xe2\x30\x1c\x5f\xd2\x72\x12\xd6\x71\x18\xdd\x80\xfd\x32\xfc\xb2\xb1\x5e\x24\xa2\x85\xe3\x2b\x0c\x5a\xd6\xe8\x4a\x8a\x7d\xfd\xe2\xd1\x67\xe0\x43\x12\xfa\x89\x4e\x47\x50\x99\xe2\xc7\x41\x10\x6c\xa0\x3d\xe5\x6c\x0c\x43\xec\xb8\x53\x43\x0a\x5a\xc4\x1c\x34\x4f\xc2\x09\x33\xac\x94\x4c\x4d\x25\x75\x87\x8e\x2d\xcb\xd9\x83\x67\x66\x9f\x58\x51\x8b\x3d\xc9\x07\xf3\xb6\x39\x0e\x62\x86\xd3\x16\x5d\xd1\xbf\xcd\x31\x37\x38\x28\x2d\x4f\x4e\x6d\x4e\xff\x72\x90\x6d\xed\x74\x9c\x0e\x41\x8d\xc8\x8b\x5a\xd4\x98\xda\x65\x10\xef\xc2\xbb\x68\x13\x15\x2b\x22\xf7\x09\x57\x31\x26\x0b\x79\xa2\x9e\x74\xfa\xcd\x98\x65\xa4\xd2\x53\x51\x31\x5b\xe0\xca\x25\x48\x10\xc2\x01\x82\x89\x97\x81\xd1\xcc\xd6\x70\x6d\xd3\xc8\x95\x5f\x79\xcd\x52\x64\xb7\xcd\xd3\xa1\x2a\xfa\xe2\x84\x4f\x4d\xe2\xdf\xa5\x7e\xcc\xa6\x06\x30\xf9\xa9\x36\x7c\x8e\xb0\xeb\x92\x38\xdd\x6a\xfa\xbb\x8f\x63\x2f\x4a\xaf\xdb\x5f\xdd\xd0\xe7\x6e\x6e\x32\xc3\x74\x86\x4e\xf1\xa9\xa8\xfb\x8e\x3d\x05\xcd\x6e\xb3\xfa\xf1\x84\x48\x1d\x84\x8d\xd2\x59\xe4\x39\x25\x11\x01\x1f\x7a\xe4\xb1\x5b\x8d\x2b\xc7\x64\x4d\x65\x65\xf8\x98\xa3\x12\xd5\x8b\xca\x17\x44\xe9\xee\x2f\x6c\x5a\xab\xd1\x69\x0b\x9c\xee\x78\x7f\x5f\x7e\x36\x9b\xc0\xb0\x81\x2a\x92\x84\x24\xc2\x84\x56\x0b\xd3\x06\x1d\xed\x74\x3b\x64\x79\xd1\x53\x55\xa2\xc7\x7d\x59\x55\x6f\xd9\x12\xd3\x22\x81\x09\xef\xc2\x0d\x1a\x11\x82\x31\xee\x2f\x8d\x3c\x41\x2c\xe1\xb8\x68\xa5\x31\xe3\x67\xc2\x00\x6a\x29\xa7\xbb\xe6\x2d\xf2\xf6\xa2\xe6\xf3\xc3\x72\x86\x47\x2a\x58\xe5\xf6\xd7\xcb\xc9\xb4\x86\x7e\x96\x9e\x60\xb4\xd4\x66\x4e\xdc\x74\x67\x76\x8a\x65\x8f\x44\x45\xd5\x42\xce\x06\xea\x32\x0f\x38\xe8\x30\xae\x37\xf4\xd2\x5f\x54\x44\x79\x6c\xbc\x57\xc0\xc7\x7b\xc4\x8c\x4d\xbd\xcf\xe1\x50\xe7\xde\x10\x0d\x20\x26\xc7\x05\x68\x02\x87\x57\x97\x5f\xe5\x90\xcb\x15\xa8\x7d\xc8\xf7\x05\x8d\xe1\xa0\x60\x77\x7b\x12\xaf\xd0\xa2\xf3\x47\xa6\x88\x49\x86\xb7\x15\xb6\x9c\xd2\xf8\xd3\x83\xee\xe6\x0b\x12\x4e\x0a\x0b\x17\x91\x7a\x99\x4f\x22\x2e\xce\xb8\x6c\x60\x4f\x32\x0e\x30\x02\xa4\x2f\x5d\x6f\x83\x58\xd9\x9c\x2a\x1c\xfe\x02\xaa\xa9\x64\x10\xef\xed\x7b\x32\x01\x99\xf8\xb3\xc7\x7d\x56\x3e\x8b\x6e\x98\x2a\xcc\x6a\xbf\x80\x0a\xa1\xbc\x92\x55\x28\x06\x1a\x0c\x95\xec\x68\x60\xec\x67\x68\x73\xc8\xeb\xa2\x3a\xa7\x0f\xd1\x2f\x15\x12\x28\x62\x2f\xb7\x2a\xcc\xcf\x95\x7e\xb1\x42\xea\xc8\x7b\x14\xb6\x37\x22\xfd\xb9\x3a\x17\xe9\x18\xe1\x2d\xcc\x83\x82\x3e\x7a\xb2\x1f\x0e\x7d\x14\x61\x29\x0b\x48\x12\xd7\xb6\x28\xea\x66\x57\xf0\x28\x65\xb7\x27\xc2\xab\x48\x20\xac\x98\x84\xca\x8a\xdd\x94\x06\xc8\xc2\xcd\xd6\x22\x71\x57\x11\x3e\xf1\xfe\x2d\x71\x62\x77\xb6\x0f\x65\xb5\x83\xf6\xb1\x9e\xb9\xea\x92\x76\xe4\xc4\x87\xd5\x21\xd3\xb1\xa8\xff\xde\x25\x11\x4d\x08\x43\xb2\xeb\x96\x11\x4f\xba\xed\xe0\xcc\x85\x57\x7e\x3f\x7c\x22\x8b\xe6\x3d\x5d\x3b\xa2\x95\x15\x8c\x2b\xc2\x3f\x29\x9e\xa7\x18\xdc\xd5\x08\xf7\xa4\x39\xd6\xb5\x1c\x77\x04\x41\x11\x02\xef\x80\xe3\x04\x77\x7d\xde\x97\x5b\x41\x60\x30\x48\x09\x12\xc0\x95\xcb\xc5\x85\x49\xb9\x7b\x76\x4b\xb0\x63\x38\x90\x2c\xe3\xe3\xcc\x32\x33\x34\xf9\x6d\x5c\x32\x61\x9a\x6d\xa9\x72\x42\x93\x1c\xc5\xfd\x2e\x64\x51\x48\x02\x2e\x9e\x61\x76\x84\x19\xcd\x3c\x88\x49\xf3\x7a\xb6\x22\x7c\xf7\xe6\x76\xd0\x3a\x09\x62\x82\x50\xe7\x9f\x86\x7f\x7f\x29\xbb\xde\xb0\x99\xa4\x0e\x29\x8d\x24\x5a\xc3\xa1\x4e\x93\x9a\xb7\x45\x7e\x92\x9e\x97\x8c\x84\xca\xb7\x8f\xbb\xb6\x39\x9c\x46\x13\x58\x6e\x13\x3b\x3f\x16\x5c\x5e\xc6\xb4\x7f\xb3\x33\xa0\xe7\xc8\xd8\x44\x18\x94\x33\x9a\x75\x44\x25\x47\x9b\xed\xa5\xc7\x04\x2b\x5b\x86\x1d\xfa\xe0\xa5\xc5\xa8\x6e\xc6\x8b\x3a\x4a\xe9\xb5\xb9\x36\xdb\x58\xc6\x1d\x59\x37\xf4\x96\x86\xdc\xdb\xf4\xd3\x8f\x36\x92\x9f\xef\xa6\x3b\x9d\xa4\xc2\x97\xcf\x8c\x59\x5d\xfe\x1f\xbb\xe3\xe1\xd0\xb4\x7d\xb7\x7a\xe3\x3c\x75\x4e\xf9\x54\xb0\x7b\xcd\x30\xa7\xb7\x27\xbb\x67\x7c\x35\xde\xe2\xeb\xeb\x18\x46\x0d\xd5\x66\x4c\xc5\xdc\x87\x47\x72\x3a\x45\xc2\xb1\x29\x49\x17\xa4\x6b\x96\xea\x4a\x44\xaf\xc5\x06\x60\xe0\x1d\xdc\x50\x47\x79\xfc\x56\xb4\x15\x86\x2e\xf8\xd3\xbf\xb6\x82\xf4\x9c\xc7\x75\xc8\x48\x7d\xbe\x42\x05\x1f\x28\xf3\x10\x34\x4d\xa4\x11\x51\x11\x9b\x3d\x78\x6f\x84\xf1\xf0\x20\x78\x88\x63\x12\x1a\xf6\xe1\x55\xe9\x5b\x7d\x47\x84\x96\xfb\x46\x49\x7f\x23\xe9\xea\xa8\x49\x02\x72\x99\x99\x89\x40\x31\x66\x32\x11\x1d\x0b\x65\x4c\xc5\xa5\xc8\xe2\x08\xab\xd5\x56\x2e\x73\x2b\x71\xd8\x6a\x55\xb9\xbb\x22\x67\x5a\x40\x41\x7c\x44\xce\x81\xeb\xf2\x67\x58\xa5\x83\x35\x5e\x97\x1a\x26\xdb\xd6\x26\x0f\x1c\x2a\x05\xa0\x93\x46\x02\x7c\x38\xa8\x8f\x0f\x8b\xb9\x9a\x88\x2b\x6b\x16\x61\x46\x91\x65\x78\x9b\x1b\xe1\xe8\x8f\xb1\x9a\x35\xa3\x18\x3d\x51\xa8\xf1\x8a\x3f\x37\x8e\xb1\x68\x38\x4b\x66\x42\xe1\xd8\x93\x43\xf4\x4b\x4e\x70\x4f\x18\x29\x3a\xca\x62\x62\x2f\xe8\xc4\xd8\x87\x66\x76\xa4\x00\x43\x1a\xf8\xa4\xf3\x78\x38\xb1\xcf\x98\xf9\x05\x5d\x18\x47\xc0\x96\x8a\x69\x2e\xa1\x32\x43\x37\x95\xe6\x0d\x63\x81\xa4\x79\x2e\xad\x16\xf4\x25\xa4\x00\x43\xb5\xe1\x11\xac\xba\x3d\x53\x81\xdb\x42\x4b\x26\xe8\x92\x0d\x59\x0b\x95\x38\xe2\x33\x50\xd7\xb3\x09\xf3\x08\x66\xdb\x59\x4d\x08\x36\x1e\x18\xe9\x48\xc3\x61\x84\x01\xa1\x0b\x53\x0d\x3b\xb6\x90\x2e\x57\x61\x32\x16\x84\xbf\x06\x9f\x31\xcf\x94\xdd\xe2\x6f\xb9\x8d\xda\x62\xf8\x8b\xf6\x18\xa7\x58\x62\x1e\x8a\x89\xe7\xc8\xea\x55\xc3\xcc\x7e\x41\x9e\xb3\x64\x95\x5f\xc2\x76\xc8\x48\xfb\xe6\x60\xc3\x42\x48\x5d\x7b\x8e\x43\xaa\xd3\x71\xd8\x2f\x7f\xc2\x6e\xc6\x59\x5c\x88\xb3\x9e\x69\x98\x50\x9f\x69\xa5\x19\xc1\xdc\xfe\x62\x7c\xc6\x88\xfe\x45\xf2\x8b\x96\x0a\x3a\xf1\x4a\x74\xe4\x15\xe3\xf3\x2f\xa6\xb1\x4d\x27\xf4\xd4\x48\x40\x34\x39\x1d\xc3\x35\x4d\x8f\x81\x97\xcb\x9d\xc5\xde\x8d\x26\x57\x42\xec\xdd\xdc\x2e\xec\x77\xfe\x28\x91\xbb\x67\x36\x4c\x6c\x67\xa7\x86\xa1\xf2\x35\x75\xfe\xd9\x62\xb3\xb9\x2c\x50\x9e\x59\x00\x76\x6b\xff\x5a\xa4\xa1\x83\xb6\x64\x46\xb4\xb2\x3d\x37\xa2\xf5\x67\x28\xa6\x72\x52\xc2\x8f\x18\xda\x1a\x76\xa4\x47\x5b\xcf\x59\x8c\xd8\xcf\x35\xb3\x9b\x15\x64\x2c\x4c\xf4\x81\x91\x52\x4c\xa3\xb9\x44\x24\xd7\x13\xe5\x2a\xec\x69\x96\xe6\x0b\xf9\x93\xb6\x8b\x7f\x00\x53\xb2\x59\x1b\x8b\xb7\x9e\xb6\x9f\x59\x56\x64\x37\xd3\x5f\x92\x15\x2d\x59\xf5\x17\x10\xc4\x2a\xd4\xd5\x98\x10\x5a\x55\x71\x02\x05\x8f\xf2\x14\xc7\x8d\xb7\x98\x92\x04\x25\x36\x6a\xce\x77\x46\xa8\x17\x5d\xb0\x33\xf8\x28\xa7\xbe\xd9\x21\xf4\x20\xce\x03\x92\xbd\x06\x7c\x13\x8c\x90\xb0\x4e\xaf\xee\xae\xcd\xf7\xce\x43\x5e\xef\xaa\x82\x3f\xf1\xed\xdb\xfc\xee\xd5\x2d\x6b\x67\x28\x83\x1f\xef\xca\x7a\xbf\x24\x7c\x03\x03\xb1\xfa\x3d\x6e\xb4\xc7\x8b\x09\x0e\xfb\xfc\xae\x2a\xdc\xbb\xa2\xac\xf7\xe4\xeb\xbe\xd8\x8d\xfe\x8e\x6e\xf2\x3a\xd5\x71\xf6\x0f\x4d\xd7\x4b\xde\x8c\x92\xb5\xae\xe2\x40\x38\x52\x33\xf0\xa3\x34\xda\x84\x49\x94\xbe\x43\x70\x12\x9c\x31\x87\x9d\xb4\xa6\x6e\xb5\x62\xdf\xef\xa7\x0f\x20\x07\xc7\xe4\x3d\x2a\x55\x77\x77\x6d\x73\x38\x80\xe1\x78\xaf\xf4\x13\x19\xf1\x54\xf9\x29\x9f\xe2\xe3\xf1\xf0\x26\xbb\xbc\x7b\x28\x76\xab\xdf\x6d\xbd\xcc\xdb\xc5\x78\x3b\xe6\x80\x85\x35\x4b\x36\x9e\x97\x45\x54\x93\x92\x6f\xb7\x4d\xbb\x83\x49\xd6\x29\xad\x24\xfb\x62\x5e\x4b\x72\x4d\x83\xa6\x6b\x63\x1d\xa6\xbe\x45\x14\xd2\x53\x15\xb6\x4b\x95\xc4\x6a\xc6\x8c\x0d\xdc\xab\x5d\x76\x2a\x0b\x47\x4b\xd3\xe0\x2e\x0a\x62\x4f\x08\xca\xc4\x4c\xc7\x81\xd9\x69\x5e\x55\xab\xc0\xf3\x9e\x44\x87\x5b\x91\xf5\x78\x82\xf1\xb6\x14\xdf\x4d\x32\xd3\xc4\xc7\xa6\xf5\x37\xa3\x08\xa1\x34\x7b\x5b\xe5\xdc\x2c\x61\x25\x95\x0b\xf6\x35\xf6\xcd\x18\x9d\xc5\x63\x1f\x61\x3d\xac\x04\x63\x54\x62\xaa\x3b\x1e\xd8\x5c\xec\xa6\x3e\x3e\xdd\x89\x19\x73\x04\x2b\xb0\x49\x71\x27\x37\x51\x82\x3d\xb1\x75\xf7\x66\xac\x78\xbb\xfa\xc1\xfd\x61\x5c\x8e\x65\xbd\x6d\x8b\xa7\xa1\xe2\x58\x01\x27\x3f\x8f\xcf\x6a\xc8\xde\x42\xac\x01\x47\x93\x49\x51\xb9\x3f\xba\x62\xea\x62\x50\x92\x28\x29\xb2\xbd\xae\x14\xbf\x08\x04\x52\x65\x8a\xc7\x37\x93\x06\x87\xc7\xe9\x34\x21\x2f\xe0\xfb\x2a\x0f\xb4\xeb\xf3\xfe\xd8\x71\x03\x66\xba\x34\x51\xd5\x0e\x16\x13\x40\x04\x25\xea\x59\x05\x15\x95\x16\xf3\x01\x42\xd7\x17\x07\xda\x18\x05\x38\xb5\xd9\xb8\x49\xc4\xe2\x7e\x62\xe3\x7d\xc8\x3b\x18\x98\x5e\x5e\xc5\x0c\xda\xa4\xeb\x0a\x51\xbe\x03\xb3\x06\xa1\x84\x00\x5e\x33\x34\xbe\xa6\xf5\xbc\x40\xd0\xd0\xdb\x96\x92\x5d\x19\x96\xaa\xcd\xbb\x2c\x30\xa0\x18\xd0\x63\xe4\x51\xb2\x2f\x8f\xb8\x58\x4d\xbb\x4f\xb0\x02\x18\x64\x5a\xd9\x7e\x54\xa9\xea\xd6\xfb\x51\xbd\x39\xd5\xb5\xa5\x1f\x27\x88\x80\xe1\x2a\xa0\x97\x48\xb9\x47\x6a\xba\x86\x36\xb1\xee\xd0\x00\x43\xd7\x2d\x49\x41\x76\x9a\x3d\x28\xa6\x6b\x40\xdb\xf4\x79\x5f\xbc\xc9\xbc\x5b\x19\xd4\x64\xae\x2e\x33\x6c\xee\x9a\x31\xa7\x24\x17\x66\x0f\xf1\xef\x5b\x01\x0b\x40\xe9\x38\x60\x11\x9e\xf1\x09\x30\x9e\xca\xfa\xe6\x94\x36\x6a\x78\x04\x95\x1a\xfe\xc6\xdb\x15\x7b\x85\x22\x7a\xd0\xfc\x88\x02\x5b\x05\xba\x64\xcb\x20\x38\x01\xd5\x01\x42\xc2\xa2\xdb\x9f\x6d\xa6\x38\xcf\x83\x40\x59\xe6\x66\xe8\xba\xf1\x2f\x83\x32\x9e\xc6\x7a\x09\xc6\x0e\xb9\x69\x2f\x9e\x3f\xcd\x64\x8d\xda\xc8\x0b\x26\x99\x6c\x1b\xf8\x3b\x31\x32\xa5\x32\x22\x5e\xc5\xe8\x78\x6f\x85\x1c\x70\x02\x31\xcd\x2f\xed\x70\x01\x5c\x2a\x8a\xa0\xa2\x95\x76\x2a\xb9\xc4\xa3\x5c\x20\xb7\x55\x79\x78\xdb\x16\xdb\xfe\x8d\x7f\xf8\xbc\x06\xff\xde\x92\x22\xe7\x90\xf7\x0f\x94\x48\x6f\x62\xef\xe6\x16\x8b\x73\x3f\x85\x59\x99\x82\xab\x28\xbc\x1e\x71\xf8\xa3\xae\x2c\x34\x0a\x84\x34\xfc\xc9\x00\x78\x38\xb2\x0f\x05\x65\xfa\xdd\xed\xfc\x0a\x45\x4e\x0f\x5b\x60\x54\x38\x05\xb6\xb6\xe6\xd5\x66\x76\x89\xd3\xc4\x34\xb8\x08\xb5\xa5\xe2\xf6\xb5\xa0\xa3\x52\xf9\xac\x37\xe0\xf5\x46\xcf\x12\x78\x88\x7e\x90\x4a\xe4\xa9\x8b\x96\xd0\x28\xc2\x02\xa0\x42\xec\xaa\x70\x0c\x5d\x75\x66\x3f\xf2\xd9\x7e\xee\x92\xd7\x48\x0a\x2c\x1c\x44\x7a\x01\x25\x04\x01\xdd\xcd\x2e\x18\x2b\x85\x24\x39\xa2\x9f\x0d\x45\x36\x68\x4b\x81\x41\x5b\xba\x48\xaa\x98\x5d\xc8\x9e\x12\x50\x0a\x57\x8d\xe9\xaa\xc1\x92\x57\x75\x88\xe8\xc6\x73\xca\x1a\x7a\xeb\x1a\x0e\x71\xca\x4a\xad\xe1\x2e\x11\x8c\x2c\x80\xb2\xe5\x31\x49\xb2\x21\xd8\x0e\xc6\x96\xec\xf0\xc1\x4d\x0a\xc7\x7b\x99\x74\x03\xe6\x57\x20\x29\xce\x1e\x6d\xd0\x97\x4f\x85\xe0\xec\x40\xee\xcb\xe3\x66\x48\x94\x8a\xa4\x0b\x9b\xd0\x38\xd0\xf3\x10\x5c\x07\xd3\x58\x09\x8e\xad\xe9\x44\x5a\xf5\x52\x99\x62\x6e\xba\x81\x92\xb4\x6c\x13\x09\xbe\xc0\x2a\xa6\x5e\x79\xda\x61\x96\x70\xd8\x80\x83\x58\xf3\x24\x99\xd5\xce\xf6\xb0\x6b\x7a\xc7\xbe\x17\x50\x5b\x36\x86\x9d\xed\xa9\x3b\x12\x6f\x81\x61\x01\xd6\xbb\xbc\xdd\xd9\xf4\xa7\xb4\xe1\xbd\x52\x67\x72\x8b\x5e\xa9\xf4\xb6\xa4\x4f\xa9\xc5\xf8\x5a\x08\x7c\x7d\x85\xf6\x84\x0f\xd2\x63\xb7\xb9\x27\x71\x0e\x18\x0b\x14\x6a\x91\x17\x71\x2c\xc8\x38\xbc\x81\xb0\x88\x03\x9c\x43\x82\x00\x1e\xc4\x53\x6a\x58\xce\x2b\x87\xbe\x72\x0d\xff\xef\x13\x87\x29\x2c\xfc\x9e\x4f\x38\xea\xda\xa1\x51\x86\x6e\x11\xac\xa5\xb7\x50\x18\x57\x53\x1b\x06\x92\xdc\xef\x11\x09\x50\x0a\x1c\x16\xe1\x6b\x9b\xea\x04\xe6\xf7\xae\xae\xa9\x69\x47\xb2\x0a\x73\x36\xd3\x60\x0b\xf2\xc8\x51\x60\x9b\xb2\x4f\xb3\xfd\xcf\xee\x4d\xb4\xba\x79\xa3\xa1\x4d\x6c\x76\x0c\xda\x70\x7e\xd1\x8b\x04\xb3\x1d\x91\x96\x19\xd8\x36\x59\x30\x22\x9b\x4d\xc9\x54\x63\xd8\x8c\x09\xbe\xf7\x6a\x98\xf8\x44\x49\x18\x30\xc8\xa2\xea\x6a\x87\x59\x37\x22\x35\x3e\x2c\x4b\x16\xa5\x76\x0f\x5f\xee\xb4\x48\xc4\xea\x16\xd3\x9c\x0b\xc2\x33\xe5\xdc\x09\xab\xdd\x80\x10\x48\xf9\xb4\x3f\x09\xee\xf9\xa6\xe6\x22\xac\x31\x72\x22\x7e\xf4\x82\x63\x4e\x3d\x5b\x71\x48\x08\xbf\x94\x81\xb7\xcd\xb3\x14\x70\x10\x51\x43\x9e\xd5\x13\xc2\xbf\x4f\xb2\xbe\x49\x9d\x96\x4b\xc0\xcf\x1e\x0f\x3a\x05\x31\x3d\x11\xd8\x5a\x99\x8e\x84\x1f\x69\x5e\x39\xfc\x28\x70\x7c\xba\xce\xd6\x3e\x99\xd8\xdb\x33\x87\xc1\xcf\x0b\x25\xac\x82\x78\x1e\x90\x80\x22\xcf\x4d\xbb\x73\xee\xda\x22\x7f\x7c\x4b\xfe\xeb\x0c\x1f\x78\x18\x29\x91\x0d\xc3\x64\x25\x30\xbc\x85\x9c\x90\x4d\x8d\xcb\x7c\xde\x28\xf8\x9b\xbe\xec\x7c\xbb\x1c\x92\xe5\x69\x26\x88\x9f\x19\x2a\x7d\x2a\x83\x7d\xfd\xe3\x63\xf1\x72\xdf\xe6\x4f\x45\xb7\xea\x0e\x65\x7d\xf2\x6e\x4e\xca\x8b\x27\x7d\xef\xec\x1b\xb5\x24\x4c\x68\xd9\x2b\xe7\xa1\x6e\xd9\x39\xfb\xb6\x28\xea\x35\xfc\xc2\x78\xf1\x89\x86\x32\x61\x02\x15\xac\xd0\x16\x3b\xa1\xc1\x2e\xaf\xf7\x45\x2b\x7c\xa2\xf1\x77\x84\x60\x28\xb0\xf8\x39\x6f\xeb\xb2\xde\xf3\x0a\xbb\x9d\xe7\x6d\x84\x0a\x77\xd5\xb1\x10\x00\x96\xf5\x7d\xc3\xaa\x33\xc1\x52\x80\x37\xac\x35\xa9\xfe\xa7\xa2\xed\x0a\xde\xc3\xfd\xbd\x50\xff\xa1\xdc\x3f\x54\xc3\xaa\x92\x40\x8e\xa7\x25\xb9\x0b\xf1\x53\xe9\xa3\x44\x0a\xa9\x16\x1d\xfe\x47\x69\xb4\x52\x25\x36\xe2\x8f\xd2\x90\xa5\x5a\xc3\x28\x3f\x6a\x70\x62\x23\xfa\x08\x87\x24\x35\x1f\x87\x25\xc1\xf8\x2f\xff\xf2\xfb\xdf\xad\xba\xe6\xd8\x6e\x8b\x7f\xcd\x0f\x87\xb2\xde\xff\xe5\x7f\xfe\xf2\x87\x81\x20\xc7\xd2\xd9\xe5\xed\xa3\xfb\x54\xd6\xee\xb6\xeb\xdc\xa7\xfc\xb0\xfa\xfd\xbf\xfc\x67\x00\x00\x00\xff\xff\x46\x5d\xc7\x3b\x48\x9d\x06\x00") - -func bindataTkgWebDistTkgkickstartuiClruidarkMinCssBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiClruidarkMinCss, - "tkg/web/dist/tkg-kickstart-ui/clr-ui-dark.min.css", - ) -} - -func bindataTkgWebDistTkgkickstartuiClruidarkMinCss() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiClruidarkMinCssBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/clr-ui-dark.min.css", - size: 433480, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiClruiMinCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\xbd\x69\x73\xa3\xcc\xb2\x2e\xfa\x57\xfa\xae\x1d\x3b\x62\xaf\xa3\xee\x97\x79\x72\xc7\xd9\x71\x40\x42\x80\x24\xd0\x2c\x01\x3b\xd6\x07\x66\x10\xa3\x98\x45\x47\xff\xf7\x1b\x42\xb2\x2d\xd9\xc8\x96\xda\xeb\x3d\x71\xaf\x1d\xd1\xad\xaa\xcc\xac\xca\xca\x7c\xaa\x9e\x12\x85\xe1\x29\x8d\xe3\xfc\xd7\x8f\x1f\x86\x99\xfd\x70\x82\x58\xd7\x82\x1f\xba\x96\x59\x4f\x30\xf8\xdb\xcd\xc3\xe0\x97\x1d\x47\xf9\x0f\x5b\x0b\xbd\xe0\xf0\x94\x69\x51\xf6\x23\xb3\x52\xcf\xfe\x19\x78\x91\xf5\xc3\xb5\x3c\xc7\xcd\x9f\xa0\xbf\x20\xec\xe7\x8f\x30\xfb\x91\x5b\x75\xfe\x23\xf3\x1a\xeb\x87\x66\xee\x8a\x2c\x7f\x82\x40\xf0\x3f\x7f\xfe\xa8\x2c\xdd\xf7\xf2\x6e\xe9\x6f\x3d\x36\x0f\xbf\x42\x2d\x75\xbc\xe8\x09\xfc\xad\xa5\xb9\x67\x04\xd6\x77\x2d\xf3\x4c\xeb\xbb\x69\xe5\x9a\x17\x64\xdf\x6d\xcf\x31\xb4\x24\xf7\xe2\xe8\xf8\xb1\x48\xad\xef\x76\x1c\xe7\x56\xfa\xdd\xb5\x34\xd3\x4a\xbf\x87\x9a\x17\x7d\x0f\xad\xa8\xf8\x1e\x69\xe5\xf7\xcc\x32\x5a\xd5\xac\x08\x43\x2d\x3d\xfc\x32\xbd\x2c\x09\xb4\xc3\x93\x1e\xc4\x86\xff\x5b\x2b\x4c\x2f\xfe\x6e\x68\x51\xa9\x65\xdf\x93\x34\x76\x52\x2b\xcb\xbe\x97\x9e\x69\xc5\x2f\x9a\x5e\xd4\x0e\xef\xc2\xe0\x29\x8a\xf3\xff\xfa\x1f\x23\x8e\xf2\x34\x0e\xb2\x7f\xfd\xf3\x45\x35\x8a\x23\xeb\xe7\x39\x0e\xe0\xef\xe7\xf6\x7e\x95\xd6\x71\x20\x5a\xf0\x43\x0b\x3c\x27\x7a\x3a\x46\xf4\xd8\xe4\xef\xdc\x0a\x93\x40\xcb\xad\xef\xff\xe3\x7a\xa6\x69\x45\xff\xba\x6a\xe8\xb7\xf6\x4b\xd7\x0c\xdf\x49\xe3\x22\x32\x7f\x18\x71\x10\xa7\x4f\x79\xaa\x45\x59\xa2\xa5\x56\x94\x5f\x47\xd2\xb4\x8c\x38\xd5\x8e\x23\xfd\x91\xf9\x5e\xf2\x14\xeb\x3b\xcb\xc8\xb3\xdf\xda\x93\x66\xe4\x5e\x69\x7d\xd7\x9e\xdc\xb8\xb4\xd2\x5f\x71\x91\xb7\xc3\xa9\x3c\x33\x77\x8f\x31\xd6\xf5\xf4\x7f\x72\x2f\x0f\xac\x7f\xfd\xd2\xe3\xd4\xb4\xd2\x1f\x7a\x9c\xe7\x71\x78\x1a\xcc\x9b\xc6\x9f\x8a\xc8\xb4\xd2\x63\x03\xb7\xba\x7f\xd5\xf8\x66\xc6\x79\x6e\x99\xb7\x9b\x38\x2b\xfc\xd6\xbf\x67\x79\x1a\x47\xce\x09\x5d\xd5\x29\x7c\x5e\xe4\x5a\xa9\x97\x77\x0b\xf5\x38\x30\xad\xf4\xb7\x69\x47\xa7\xea\x2c\x3f\x04\xd6\x93\x97\x6b\x81\x67\xfc\x76\xa1\x73\xa5\xd7\x58\x4f\xb0\x15\xfe\x3c\xe3\xe9\x2f\x9c\xb0\xc2\x6f\xe0\xef\x50\x4b\xfd\xf7\x91\xfd\x0f\xdb\x06\x7f\x9e\x3f\x82\x20\xf8\x3b\x0b\xb5\x20\xb8\x68\x88\x04\xff\xf3\x77\x56\xe8\xdf\xb3\x22\xb9\xa8\x25\xb0\xff\xbc\x02\x3f\xf8\x33\x89\x33\xaf\x1d\x66\x6a\x05\xda\x31\xf2\x3f\x6f\x65\x3f\x2b\xf4\x5f\xe7\x50\xff\xf8\x0b\xc6\xac\xf0\xf7\xb1\xed\x3c\x4e\x9e\x7e\xfc\x75\x2c\x79\xa1\xf3\x9c\x91\xd3\xf8\x5a\x50\x64\xa5\xd3\xc2\xaf\x9d\xa9\xff\xfc\x75\xcc\xa9\x1d\xc4\xd5\xd3\x09\x41\xbf\x8d\xd8\xb4\xbe\xfb\xba\xf9\x3d\x49\xad\xef\x99\x16\x26\x57\x53\x36\x8c\xa3\x38\x4b\x34\xc3\xfa\xf9\x3a\x04\xc8\x0a\x7f\x9f\xe6\xd1\xf3\xc4\x83\xac\xf0\x1b\x0a\x26\xf5\x6f\x37\xfd\xa5\xc7\xf5\x51\xcd\x8b\x9c\xa7\x23\xde\xad\x28\xff\xa1\xc7\xf5\x0b\xc6\x7f\xbe\xf4\x5f\x7a\x99\xa7\x07\xd6\x6f\xbd\xc8\xf3\x38\xfa\xee\x45\x49\x91\x7f\x8f\x93\xfc\x18\xe4\xe4\x7b\x66\x05\x96\x91\x7f\x3f\x42\x41\x4b\x2d\xad\x75\xea\x39\xc5\x3f\x5f\xe6\xfb\x8b\xf8\xed\x7a\xf2\xfb\xb9\xa1\x2b\x14\x10\x20\x78\xd5\xdd\xaf\x5b\xce\x9c\x7a\xff\xd5\x02\xb1\x9d\x41\x76\x9c\x9e\xf0\xfd\xac\x71\x5c\xdc\xbe\xfd\x4f\x7e\x48\xac\xff\x7d\xaa\xf9\xd7\xf7\x53\x29\xb5\x32\x2b\x7f\x2e\x64\x85\x1e\x7a\xf9\xbf\x7e\x3d\x43\x5f\x4b\x12\x4b\x4b\xb5\xc8\xb0\x9e\x4e\x56\xe7\xe6\x9e\x9e\x7e\x84\x71\xf3\xc3\x8e\x8d\x22\xfb\xe1\x45\x91\x95\x7e\xbf\x6a\xfb\xa6\xfc\xd4\xdb\x4d\xf1\xb9\xff\xf7\xf2\xf7\x38\xf9\x99\x68\xa6\x79\xcc\xda\x73\x88\x2e\x6c\x52\x2f\x72\xde\x38\xd4\x29\x3c\x7b\xd3\x29\x7b\x76\xe5\x5a\xf8\xbc\xba\x3c\x41\x49\x7d\x9e\xdd\xdf\x98\xb6\x8b\x95\x55\xe7\xbf\x6d\xcf\x0a\xcc\xcc\xca\xcf\xee\xb6\x5a\x59\x1c\x78\xe6\xb7\xcc\x0b\x4a\x2b\x7d\x41\xc2\x37\x38\xa9\x5f\x46\xf0\x17\x82\x59\xe1\xb7\xbf\x70\xb8\xfd\x8f\x38\x4e\x8d\xc0\x72\xac\xc8\xbc\x04\xe7\xcb\xd2\x55\x9f\x27\xf1\x33\xb8\x9e\x57\xd4\x5c\xd3\x03\xeb\x67\xa8\xd5\xe7\x95\xaf\x25\xa3\x97\x20\xfd\xac\x5c\x2f\xb7\x7e\xb4\x73\xe3\x29\x8a\xd3\x50\x0b\x5e\xd1\xf8\x02\x2b\xad\xc8\xe3\xdf\xa7\xf1\x1b\xae\x65\xf8\x7a\x5c\xbf\xe0\x44\x33\xbd\xf8\x5f\x37\x3c\x7a\xcd\xc5\x49\x39\x2a\x42\xdd\x4a\x8f\x79\x3c\x03\xa9\x4d\xe2\x8f\x2c\xf1\xa2\x1f\x67\x40\xde\x50\x8c\x8b\xfc\x5a\xf1\xd7\x79\x96\x5c\xb8\x96\x59\x5a\x6a\xb8\x9d\x28\x3d\x0e\xa9\x4d\xc2\xcf\x67\x1a\x88\x6d\x3b\xb3\xf2\xa7\x1f\x70\x52\x5f\x9b\xbf\xf6\x79\xaa\xf8\x61\x1c\x5b\x08\xae\xfd\xbb\xa5\xfb\xba\xda\x77\x79\xd1\x4e\xbc\x57\x1b\xdb\x0b\xac\x1f\x45\x12\xc4\x9a\xf9\x3c\xa8\x9b\x13\xec\xe7\xe5\xc2\xf1\xfb\x65\xb7\x12\xa4\xa7\x55\xfc\x47\x64\x15\x79\xaa\x05\x3f\xc0\xa7\x36\xa1\x3f\xbb\x64\x18\xf8\xf4\x1f\xb6\x76\xfc\xed\x14\x43\xe0\x51\x0e\x1f\x7f\x3b\xe5\xf0\x51\x6e\x91\xc7\xdf\x4e\x39\x72\x94\x9b\xd6\xf1\xb7\x53\x8e\x1e\xe5\x46\xfb\x73\xc3\x3d\xf0\xe9\x3f\x74\xe4\xf8\xdb\x29\xc7\x8f\x72\xd2\x38\xfe\x76\xca\x89\xa3\x1c\x6f\x7f\x3a\xe5\xe4\x51\x8e\x62\xc7\xdf\x4e\x39\x75\x94\x23\xed\xcf\xad\xf8\x80\x4f\x7a\xa0\x19\xfe\x95\x38\x8e\x2e\x82\xff\xa1\x18\xfb\x44\x0e\x7d\xd6\x3e\xfc\x99\x02\xf2\x99\x02\xfa\x99\x02\xf6\x99\xc2\x31\x0b\xef\x21\x76\xa1\x40\x7c\xa6\x40\x7e\xa6\x40\x7d\xa6\xd0\x66\xe2\xbd\x86\xd6\x6e\x78\x5b\x98\x5b\x88\x8d\xd9\x46\x97\xb4\x45\xb9\x41\x5a\x9a\x4d\x75\x89\x5b\x90\x53\xba\x49\xda\x48\x97\xb8\xc5\x38\x41\x19\xb8\x85\x77\x89\x5b\x88\xa3\x94\x66\x99\x5a\xb7\x67\xe0\xd3\x7f\x40\x04\xa5\x9b\x9d\x8d\xb7\x00\x07\x41\x02\xd6\x3a\xc5\xc4\x49\x8c\xa3\xa4\xdd\x25\x26\x4f\x62\x0c\x27\x3a\xfb\xa6\x4e\x62\x54\xc7\xf5\x1b\x61\x69\xe5\x08\x8e\x9a\x6f\xc3\xfe\x1a\xd7\x4e\x64\x5c\x04\xf6\x23\xf9\x4d\xf0\x5e\x84\xf6\x23\xf9\x4d\xe8\x5e\x04\xf7\x23\xf9\x4d\xe0\x5e\x84\xf7\x23\xf9\x4d\xd8\x5e\x04\xf8\x23\xf9\x0d\xd0\x66\x96\x11\x47\xa6\x96\x1e\x2e\xe1\x6b\x13\x16\x6e\xdb\x1f\xeb\xb5\x40\xb6\x70\x43\xb3\xa1\x8f\x15\x5b\x48\x9b\xb0\xa6\x59\xe8\xc7\x8a\x2d\xb8\x0d\x90\x02\x4d\xec\x63\xc5\x16\xe6\x9a\x4d\x20\x06\xf5\xd9\x58\x8e\xb3\xc9\xc2\x08\xdd\xf8\x58\xf1\xb4\xb6\x6b\x08\xa5\x7d\xa2\xd8\x4e\x02\x82\x84\x4c\xea\x93\xf0\xb4\xd3\x01\x27\x41\x90\xfa\x64\xd4\xed\xc4\x40\x6d\x10\x24\xc0\x4f\x03\x7e\x24\x08\x18\x04\x51\xe2\x6d\x8e\xbb\xb2\xd8\x09\xc6\xce\x34\xde\xa7\x79\x73\x02\x75\x26\xf2\x3e\xcd\x9b\x93\xaa\x33\x95\x9d\xf0\xee\xcc\xe5\x7d\x9a\x37\xa7\x5c\x67\x36\xef\xd3\xbc\x39\x0d\xbb\xf3\xf9\x5e\xd5\xd4\x22\xc7\x4a\x4f\xd3\xd0\xb6\x61\x1b\xec\x92\x9e\xf6\x4a\x96\x69\x9a\x44\x97\xb8\x9d\x72\xb6\x61\x60\xba\xde\x25\x6e\x27\x9a\x8d\x51\xd6\x9b\x95\xfc\x2c\x46\x4f\x1b\x31\x82\xc2\x91\x6e\xcf\x8e\x62\x04\xb3\x50\xb4\x4b\x8c\x9f\x1a\x87\x4d\x50\xeb\x12\xb7\x13\xc8\xd4\x61\x08\xec\x1c\x58\x3b\x6d\x0c\x18\x32\xbb\xc5\xed\x64\xa1\x28\x88\xe8\x16\x9f\xa6\x08\x8e\x83\xf6\x1b\x79\x1c\x5d\xc4\xb5\x13\x70\x17\x81\xfd\x48\x7e\x73\x12\x5c\x84\xf6\x23\xf9\x4d\xc0\x5f\x04\xf7\x23\x39\xfe\x89\xfc\x26\xa4\x2f\xe2\xfb\x91\xfc\x26\x7c\x2f\x23\xfc\x5e\xa1\xd2\xd2\xc8\x8b\x9c\x67\xd4\x6a\x6f\xb6\x27\xcf\xe2\x13\x6c\x6d\x1b\x35\x88\x4e\xf9\x09\xb7\xb6\x65\x69\x64\xa7\xfc\x04\x5c\xcb\x82\x09\xb8\x53\x7e\x42\x2e\x69\xd8\xb0\x76\xc3\xbd\x23\x67\xd9\x06\x08\x76\xfb\x87\x9f\x38\x4d\x07\xdf\xc0\xe7\x59\x7e\x02\x2f\x4e\x69\x37\xe4\x2d\x7a\x35\x93\xc0\x6f\xc8\x5b\xf8\x92\x36\x76\xcb\xfe\x8c\x5f\xe8\xb8\xc8\xbf\x4d\xc0\x45\x88\x3b\x01\x70\x19\xe3\x0f\x15\x6e\x42\xf8\x32\xca\x1f\x2a\xdc\x04\xf1\x65\x9c\x3f\x54\xb8\x09\xe3\xcb\x48\x7f\xa8\x40\x7e\xa6\x40\x7d\xa6\x70\x6b\x43\x54\x18\x86\x95\x65\x2d\x94\x4d\xdb\x06\x4d\xb0\x53\xdc\x42\x59\x37\x2c\x94\xd2\x3a\xe5\x2d\x94\x09\xc4\x34\xa0\xee\xe6\x91\xd3\xfe\xc0\x20\xa0\x6e\xfb\x16\xca\x98\xa5\x13\x10\x76\xc3\xbd\xa3\x5c\xd3\x60\xb8\xdb\xbf\x16\xca\xa8\x4e\x11\xa0\xd1\x29\x6f\xa1\x8c\x18\x24\x06\x76\xdb\xb7\x50\x46\xc0\xe3\x5c\xe8\x94\xb7\x50\x86\x31\xec\x2d\x52\x2f\xe2\x73\xfc\xb2\x61\xa1\x1d\x50\xbe\x08\x71\x37\xf9\x5f\xc4\xf8\x43\x85\xdb\x5b\x92\x8b\x28\x7f\xa8\x70\x7b\x03\x72\x11\xe7\x0f\x15\x6e\x42\xf9\x32\xd2\xdd\x3b\x82\x8b\x50\x7f\xa8\x70\x7b\x4f\x71\x19\xec\x56\xe3\xea\xd2\xcc\xf3\x41\x52\x7b\x41\x2c\xd5\x4c\xaf\xc8\x9e\xc0\xbf\x20\x2c\xb5\xc2\x9f\x1d\x1a\xe7\x93\x89\xbf\xc0\xf7\x0a\x5a\x92\xfc\x78\xbd\x72\xff\xe6\x32\xce\x59\xe7\x74\xb1\xf7\xb8\xb3\x69\xfd\x7b\xfa\x0f\x93\xb4\x10\x8b\xba\x56\x6a\x37\x42\xd7\x7a\x97\xc1\x3b\x6b\xb5\x27\x26\xcf\xcd\x5c\x5d\xf2\x39\x2b\x3c\x5f\x12\x3f\x9d\x3c\xfd\x68\x2f\x4e\xdf\x6c\xed\x42\x7a\x7d\x7d\xe6\xd9\xf1\x73\x14\xcf\x2a\x57\x93\xea\xac\x62\xa5\x69\xfc\xe2\xd0\xf5\xf6\x24\x88\x33\xeb\x9c\x91\x1f\xa7\x0b\x98\x6f\xaf\x12\xbd\xd7\xf8\x11\x27\x9a\xe1\xe5\x87\x27\xf0\x2f\xb8\x4b\xab\x1d\xff\x35\xaa\xde\x89\x2f\xda\x78\x5e\x21\x92\x38\x69\x25\xed\xc5\x50\x57\x33\xe3\xea\xec\x72\xea\xe8\xda\x7f\x41\x28\xf8\xfd\xdb\xeb\x3f\xe0\x5f\x30\xf6\xcf\x2b\xb8\xb4\x97\xf8\x44\x2b\x4f\xe3\x24\x0e\xbc\xec\xfb\x37\xba\xb4\x22\x2f\xfd\x26\x59\x75\xfe\xfd\x1b\x6f\x05\xa5\x95\x7b\x86\xf6\x4d\xb2\x0a\xeb\xfb\x37\x3a\xf5\xb4\xe0\xfb\xb7\x8b\xc3\xc8\x53\x2b\xe7\xeb\xbe\xa7\xd6\x4a\x2d\xfd\xaf\xd7\xc6\xff\xf9\xf3\xf5\xf3\xf9\x2c\xe1\x47\xd0\x5e\x45\x7d\x5d\x24\x2e\x65\xa9\xe5\x14\x81\x96\x3e\xa1\x9d\xd2\xcc\x0a\x3d\x3d\x0e\xcc\x27\xac\x53\xdc\x8a\xf0\x4e\x91\x55\xe7\xa9\xf6\x46\xee\x42\xe7\x58\xbd\xba\xfc\x19\xd6\xfe\xf9\x6a\x7a\x79\x3a\x72\x3d\xe6\xab\x71\xbe\xb5\x38\x9f\x0e\xbd\x5a\x5c\x06\xef\x45\x19\xfe\x73\xcf\xe0\x87\x3d\x83\x1f\xf1\x0c\xf9\x73\xcf\x90\x87\x3d\x43\x1e\xf1\x0c\xfd\x73\xcf\xd0\x87\x3d\x43\x1f\xf1\x0c\xbb\xe5\x59\x87\x2b\xd8\x1d\xae\x9c\x27\xc9\x5b\x9b\xfb\x9c\xc1\xdf\x39\x73\x5a\x62\x2e\x2e\x85\x5e\xe8\x7e\xee\xcc\xf3\x9c\x7c\x6b\x74\x97\x37\x09\x78\x7f\x68\x12\xf0\xd1\x2c\x25\x37\x27\x78\x47\xeb\xf7\xcc\xe8\x37\x81\x4f\x6e\x4e\xd3\x8e\xf6\xef\x99\x97\x6f\x63\x99\xdc\x9c\x6d\x1d\x1d\xdc\x33\xbd\xde\x0e\xe0\xe6\x9c\xe9\x68\xff\x9e\x49\x72\xe5\xfc\x03\xb0\x4f\xfe\x00\xf6\xc9\x7b\x24\xdf\x6e\xff\x1e\x24\x5f\x39\x4f\x3c\xd0\x38\xf1\x07\xce\x93\x0f\xb4\x4f\x3e\xd0\xfe\xef\xbf\x8e\x92\xf6\xf6\x87\x1f\xcf\xb7\x3f\xdc\xba\x29\xe6\xff\xf1\xc2\x24\x4e\x73\x2d\xca\x2f\xad\xf2\x38\x79\x6b\x90\xc7\x49\xb7\x6e\xe8\x99\x66\xf0\xae\xfd\x53\x6d\xb7\xc5\xe9\x2e\x8c\x77\x1e\xb5\xb5\x37\xfc\xb1\xea\xfc\x86\xd9\x85\xe8\x03\xdb\xae\x01\x9d\xeb\xdf\x5a\x19\x81\xa5\xa5\xb6\x57\x3f\x3d\x69\x76\x6e\xa5\xbf\xce\xd4\xf1\xf4\x8f\x7f\xbc\x39\xdc\x6e\x15\x8f\x6e\xbb\x27\xc3\xe7\xc5\xad\xbd\x73\xe9\xfa\xc6\xa7\xb7\x7d\x3c\xab\x5e\xde\xeb\xd4\x79\x03\xd4\xc7\x86\x6f\x4c\xde\x2a\xdb\x81\x55\xff\x48\xe3\xea\x57\xfb\xc1\xf4\xd2\xd3\x06\xfc\x29\x8d\xab\x4e\x55\x23\x0e\x8a\x30\x7a\xab\x7d\xaa\xbd\xd5\xf6\x8f\xd4\x2a\xad\x34\xb3\x3a\xfa\x78\x16\x7d\xd0\xd7\x2d\xeb\x6b\x69\x67\x03\x55\xaa\x25\xbf\x5e\x3e\x3d\x1d\xff\xe9\xd4\x8b\xe2\x37\x9a\xa7\x8a\x9b\x6d\x5e\xbb\xf4\xd2\xf6\x87\xbe\xd8\x5e\x10\xb4\xfa\x4f\xd0\x37\xe8\x9b\x56\xe4\x71\xa7\x9a\x73\x0c\x0a\xf8\xeb\xe5\xf3\x13\x78\x5b\x0d\xba\x50\x83\x3a\xd5\x32\x37\xf5\x22\xff\xb9\xbd\x53\xe9\x46\x8b\x67\x55\xe8\x4a\xf5\x5d\xab\xbb\x22\xcb\x3d\xfb\xf0\xb2\x57\xca\x72\x2d\xcd\x7f\xbd\xa9\x7d\x3a\x35\x71\x14\x7d\x66\x6f\x45\x66\xb7\xb5\x15\x99\x9f\xd9\x1a\x56\x74\x9c\x7b\x6f\xcd\x4f\xd5\x9f\x19\xeb\x56\x5e\x59\x56\xf4\xce\xba\xbd\xdd\xe4\x59\xfa\x59\x23\x5a\xfb\x9d\xf7\x46\x1b\x27\x61\xf7\x7a\xe3\xe5\x56\x98\x9d\x83\x77\x51\xf3\x41\xe0\x2e\xed\x8e\x41\x7b\x67\xd5\x11\xb0\x4b\x9b\x73\xb0\x2e\xcd\xba\x03\x75\x69\xf4\x42\x0c\x97\x66\x1f\xb3\xc2\xf3\xc8\x52\x2b\x37\xdc\x2b\xbb\x73\x5d\xb7\xd9\x35\x9e\xae\xea\x3e\x0d\xca\x25\x96\x3a\x2c\x6f\x06\xe6\x0d\x8e\xae\x4d\x3f\x0a\xce\x5b\x0c\x5d\x5b\x7e\x88\xa0\xeb\x06\xce\xf8\xe9\xb2\xff\x08\x3d\xaf\xc1\xba\x8c\xf2\x8b\xfd\x47\x71\xce\xac\xc0\xfe\x71\x5c\x7c\x7e\xbd\x96\x9f\xba\x16\xa3\x0b\xf5\xcb\x9c\xb4\xfa\x9f\x25\xa4\xb5\x7a\xcd\xc6\xab\xcd\xcd\x54\xb4\x16\x57\x79\x68\x8d\x3e\x4a\x42\x6b\xf2\x06\xa0\xad\xd1\xc7\xf8\x3c\x8f\xe8\x32\x70\xad\xd5\xfb\xa8\xfd\x9f\xd0\x32\x3d\xed\xdb\x7f\x85\x5e\x74\xbe\x3f\x0d\x23\xf0\xa4\xfe\xe7\xaf\x8b\x35\x33\x7c\x84\x3a\xb3\xf0\x71\xf6\x3c\xf5\xf0\xa7\x04\xfa\xd2\xe3\x17\x38\x34\x0b\xef\xa6\xd1\x2c\x7c\x88\x49\xcf\x2d\xff\x09\x99\x66\xe1\xbd\x7c\x9a\x85\xf7\x52\xea\xb3\xe6\x1d\xac\x1a\x3e\x44\xac\xe1\x9f\x72\x6b\xf8\x65\x7a\xcd\xc2\x2f\x31\xec\x11\x3f\x5f\x21\xd9\x2c\xfc\xf7\xf0\x6c\x16\x7e\x99\x6a\xc3\x3f\x66\xdb\x73\x0c\x1f\x25\xdc\xd7\xd8\x3d\xc6\xb9\xc7\x98\xfd\x31\xed\x86\x5f\x60\xde\xf0\x4b\xe4\x7b\x15\xa5\xc7\xf8\xf7\x6d\xa4\x1e\xa1\xe0\x0b\x84\xfd\x31\x0b\xbf\xa2\xeb\x8f\x89\xf8\x6d\xdc\xef\xe7\xe2\x63\xe7\x0f\xd2\x71\xf8\x87\x8c\x7c\x95\xa2\x7b\x49\xf9\x6d\x72\xee\xe3\xe5\xf7\x20\xbe\x9b\x9a\xdf\x86\xf2\x06\x3b\x77\xd0\x33\x81\x93\xd7\xf4\x1c\x9a\x8f\xd0\x73\x68\x3e\x4e\xcf\xa7\x1e\xfe\x94\x9e\x5f\x7a\xfc\x02\x3d\x87\xe6\xdd\xf4\x1c\x9a\x0f\xd1\xf3\xb9\xe5\x3f\xa1\xe7\xd0\xbc\x97\x9e\x43\xf3\x5e\x7a\x7e\xd6\xfc\x9c\x9e\x43\xf3\x11\x7a\x7e\xd5\x7e\x90\x9e\x8f\x86\x5f\xa4\xe7\xd0\xfc\x12\x3d\x1f\xf1\xf3\x15\x7a\x0e\xcd\x7f\x0f\x3d\x87\xe6\x57\xe9\xf9\x25\x96\x8f\xd3\xf3\x39\x86\x8f\xd2\xf3\x6b\xec\x1e\xa3\xe7\x63\xcc\xfe\x94\x9e\xdb\x51\xfe\x21\x3d\xbf\x89\xd0\xa3\xf4\x7c\x15\xa5\xc7\xe8\xf9\x6d\xa4\x1e\xa1\xe7\x0b\x84\xfd\x31\x3d\xbf\xa2\xeb\x4f\xe9\xf9\x5d\xdc\xef\xa7\xe7\x63\xe7\x8f\xd1\xf3\x9b\x44\xdd\x4f\xcf\x57\x29\xba\x97\x9e\xdf\x26\xe7\x3e\x7a\x7e\x0f\xe2\x7b\xe9\xf9\x5d\x28\xef\xa7\x67\x8a\x82\xaf\xe9\x39\x70\x1e\xa1\xe7\xc0\x79\x9c\x9e\x4f\x3d\xfc\x29\x3d\xbf\xf4\xf8\x05\x7a\x0e\x9c\xbb\xe9\x39\x70\x1e\xa2\xe7\x73\xcb\x7f\x42\xcf\x81\x73\x2f\x3d\x07\xce\xbd\xf4\xfc\xac\xf9\x39\x3d\x07\xce\x23\xf4\xfc\xaa\xfd\x20\x3d\x1f\x0d\xbf\x48\xcf\x81\xf3\x25\x7a\x3e\xe2\xe7\x2b\xf4\x1c\x38\xff\x1e\x7a\x0e\x9c\xaf\xd2\xf3\x4b\x2c\x1f\xa7\xe7\x73\x0c\x1f\xa5\xe7\xd7\xd8\x3d\x46\xcf\xc7\x98\xfd\x29\x3d\xb7\xa3\xfc\x43\x7a\x7e\x13\xa1\x47\xe9\xf9\x2a\x4a\x8f\xd1\xf3\xdb\x48\x3d\x42\xcf\x17\x08\xfb\x63\x7a\x7e\x45\xd7\x9f\xd2\xf3\xbb\xb8\xdf\x4f\xcf\xc7\xce\x1f\xa3\xe7\x37\x89\xba\x9f\x9e\xaf\x52\x74\x2f\x3d\xbf\x4d\xce\x7d\xf4\xfc\x1e\xc4\xf7\xd2\xf3\xbb\x50\xde\x4f\xcf\x10\x0c\x82\xd7\xfc\x5c\x07\x8f\xf0\x73\x1d\x3c\xce\xcf\xa7\x1e\xfe\x94\x9f\x5f\x7a\xfc\x02\x3f\xd7\xc1\xdd\xfc\x5c\x07\x0f\xf1\xf3\xb9\xe5\x3f\xe1\xe7\x3a\xb8\x97\x9f\xeb\xe0\x5e\x7e\x7e\xd6\xfc\x9c\x9f\xeb\xe0\x11\x7e\x7e\xd5\x7e\x90\x9f\x8f\x86\x5f\xe4\xe7\x3a\xf8\x12\x3f\x1f\xf1\xf3\x15\x7e\xae\x83\x7f\x0f\x3f\xd7\xc1\x57\xf9\xf9\x25\x96\x8f\xf3\xf3\x39\x86\x8f\xf2\xf3\x6b\xec\x1e\xe3\xe7\x3a\xf8\x73\x7e\x6e\x47\xf9\x87\xfc\xfc\x26\x42\x8f\xf2\xf3\x55\x94\x1e\xe3\xe7\xb7\x91\x7a\x84\x9f\x2f\x10\xf6\xc7\xfc\xfc\x8a\xae\x3f\xe5\xe7\x77\x71\xbf\x9f\x9f\x8f\x9d\x3f\xc6\xcf\x6f\x12\x75\x3f\x3f\x5f\xa5\xe8\x5e\x7e\x7e\x9b\x9c\xfb\xf8\xf9\x3d\x88\xef\xe5\xe7\x77\xa1\xbc\xc5\xcf\x17\x0b\x6c\xf6\xc3\xf6\xd2\x2c\xff\x75\x7a\x3e\xcb\x0f\xe8\x5a\x16\x68\x2f\xa2\x37\x92\x22\x6a\xab\x2d\xf3\x2c\x06\x2f\xc4\xe7\x09\x95\xb5\xf7\xbc\x75\x2f\x1a\x5d\xda\xe7\xdb\xf8\xde\x4f\xf9\x2e\xe5\xf3\xad\x78\x5d\x2b\xcb\xb5\xa3\xaf\x3e\xbc\xc9\xf6\xb5\xda\x55\xe7\x17\x89\xba\xd6\xba\xea\xf5\x0a\x06\x5d\x3e\x06\x96\xfd\x11\x01\x75\x99\x7c\x48\x19\x5d\x06\xa9\xe7\xb8\x37\x3a\xb9\xe1\xd5\x1d\x6c\xd0\x19\xf0\x7b\xc8\xe8\xce\xdb\x1a\x6e\x42\x2e\x0b\x6f\x41\x2e\x0b\x3b\x20\x77\x4f\x77\x2f\x67\x97\x0f\x80\x31\x0b\x1f\x00\x63\x16\x7e\x08\xc6\x3b\x43\x72\x0f\x4c\xdf\xba\xd5\x0d\xd3\xb7\xfe\x5c\xc3\xf4\xa1\x90\x3d\x0a\xe0\xcf\x4e\xf4\xbb\x0c\x1e\x04\xf0\x7d\x87\xf5\x9d\x49\xba\x0b\xc0\x77\x9e\xfc\xdd\x44\x70\x68\xde\x42\x70\x68\xde\x87\xe0\x77\xdd\xbd\x5c\xde\x7f\x00\xc1\xa1\xf9\x00\x82\x43\xf3\x51\x04\x77\x85\xe4\x1e\x04\xbf\x75\xab\x1b\xc1\x6f\xfd\xf9\x14\xc1\xb7\x43\xf6\x28\x82\x3f\x3b\xf4\xea\x32\x78\x10\xc1\xf7\x9d\x67\x75\x26\xe9\x4f\x11\xdc\x75\x71\xfc\x26\x82\x03\xe7\x16\x82\x03\xe7\x3e\x04\xbf\xeb\xee\xe5\x0a\xd8\x03\x08\x0e\x9c\x07\x10\x1c\x38\x8f\x22\xb8\x2b\x24\xf7\x20\xf8\xad\x5b\xdd\x08\x7e\xeb\xcf\xa7\x08\xbe\x1d\xb2\x47\x11\xfc\xd9\x75\xe1\x2e\x83\x07\x11\x7c\xdf\x25\xdf\xce\x24\xfd\x29\x82\x3b\xaf\x1f\xdd\xde\xb9\x06\x37\x77\xae\xc1\x7d\x10\x7e\xdf\xdf\xcb\xb7\xc4\x47\x36\xb5\xc1\x23\x9b\xda\xe0\x51\x0c\x77\x06\xe5\xae\xfd\x6e\x70\xd7\x7e\x37\x78\x10\xc4\x1f\x04\xed\xe1\xad\xf0\x27\x57\x4f\xba\x0c\x1e\xdd\x0a\xdf\x75\x61\xa4\x33\x4d\xf7\xa1\xf8\x6c\x19\x6b\xf9\xcb\x97\x81\xb6\xf4\x74\xfc\xf8\xfe\x72\xd7\x59\xef\x34\x8a\x93\x62\xfb\xf9\xa6\x66\x14\x47\xd6\x59\xf1\xf8\xf1\x42\xef\xb3\x3d\xde\xb1\x81\xe7\xed\xdd\x67\x2e\xbd\x6c\xd1\x3e\x75\xa9\xbd\x41\xf7\x96\x4b\x9f\xb2\xf6\xb1\x85\x67\xc2\xfe\xcc\xa7\x17\xd2\xfd\xd4\xa7\xf6\xae\xa4\x07\x7c\xba\x5e\x87\x8f\x2d\x3c\x2f\xc1\x9f\xf9\xf4\xb2\x8c\x7e\xea\x53\x7b\x14\xfb\x80\x4f\x6f\xa6\x55\x9b\xfd\xe0\x4e\x3c\x05\x77\xe3\x29\xf8\xc8\xa9\x56\xd1\x8b\xce\x4f\xd9\xfd\xd5\xfe\xef\x05\x5e\x7e\x38\x3f\x85\xf8\x6d\x9b\xa7\xda\xf6\x3a\x41\x72\xf5\x88\xeb\x2e\x90\xbe\x3c\xa1\x15\x23\xb0\xbf\xa8\x57\x4c\xbc\x36\x62\xc6\x55\x74\xab\x99\x4f\xc0\x7e\x6e\xe4\xf8\xf5\xf1\xa6\x27\x1d\xae\x10\x38\xd1\xe1\x4a\x16\x3e\xea\xca\x25\xc6\xcf\x8d\x1c\xbf\x07\x3c\xe2\x0a\x45\x41\x1d\xae\x84\xe6\xa3\xae\x5c\x42\xfb\xdc\xc8\x71\x43\xf7\x88\x2b\x10\x44\x51\x1d\xbe\x04\xce\xa3\xbe\x5c\x41\xfa\x39\xcf\xc1\x47\xce\xbc\xd1\xfc\xa8\xbf\x56\xf5\x0c\xd5\x1f\x49\xea\x45\xf9\x9b\x3f\x6f\xec\x06\x62\xab\xf9\xeb\x53\xe3\xb7\x7f\x14\xd9\xd5\xdd\x9b\xbf\x8d\x7c\xb0\xbf\xcf\xfe\xb2\xf2\x76\x8f\x5f\x1b\xe7\x23\x7f\x0a\xda\xd1\xd8\x39\x39\xa7\x9a\x0f\xd3\x98\xc6\xd5\x8b\xc2\x91\x59\x7f\x5e\x9f\x5e\x9d\x1f\x0a\x7d\x5a\xb9\x9e\x7e\xfc\x85\xa7\x2f\x8f\x74\x6f\x57\xbd\x73\xd5\xa9\xad\x28\xfe\xe1\x14\x79\x6e\xa5\xd9\xaf\x2b\x33\xf0\xca\x02\x7c\xab\xfc\xdf\x6d\xd9\x88\x83\xef\x6f\x05\xff\x63\x04\x5a\x96\xfd\xaf\xff\x7d\x96\xff\xf8\xd7\xaf\xf3\xc3\x9c\x5f\x1a\x7e\x2e\x5f\xb6\x7c\xd4\xac\xcf\x8d\x9d\x3e\xb7\x97\xa6\xaf\x2a\x20\xf8\xba\x08\x5d\x17\xc1\xab\x22\x75\x55\x22\xaf\x4a\xc4\x55\x09\xbf\x2a\x61\x57\x25\xf4\xaa\x84\x5c\x95\xde\x78\xf3\x5a\x0a\x9c\xcb\xcf\x6f\xc6\x11\x38\x57\xe3\x38\x16\xa1\xeb\x22\x78\x55\xa4\xae\x4a\xe4\x55\x89\xb8\x2a\xe1\x57\x25\xec\xaa\x84\x5e\x95\x90\xab\xd2\x1b\x6f\x5e\x4b\xa1\x79\xf9\xf9\xcd\x38\x42\xf3\x6a\x1c\xc7\x22\x74\x5d\x04\xaf\x8a\xd4\x55\x89\xbc\x2a\x11\x57\x25\xfc\xaa\x84\x5d\x95\xd0\xab\x12\x72\x55\x7a\xe3\xcd\x6b\x29\x0b\x2f\x3f\xbf\x19\x47\x16\x5e\x8d\xe3\x58\x84\xae\x8b\xe0\x55\x91\xba\x2a\x91\x57\x25\xe2\xaa\x84\x5f\x95\xb0\xab\x12\x7a\x55\x42\xae\x4a\x6f\xbc\xf9\x7e\x3d\xd3\x8e\xd5\xd7\x23\xb8\x74\xff\xd2\xf7\x4b\xc7\x2f\xbc\xbe\x70\xf9\xc2\xdf\x0b\x67\x2f\x3c\xbd\x70\xf3\xc2\xc7\xcb\xfe\x7e\x5d\x3c\x1b\xfe\x48\x4f\xe7\x87\xab\x9f\x1f\x45\x75\x3d\xf3\x4f\x0b\xd1\xd5\xec\xbf\x58\x88\x8c\xf8\x74\xa4\xfe\x43\xd7\x32\x2f\x7b\x02\x7f\x5e\x9c\x84\xbf\x79\x0a\xfd\xef\xab\x48\x9c\x0e\xe2\xc1\x6f\x60\x7b\x10\xff\xf3\xa4\xd6\x7e\x7c\xb5\x6a\x1f\xa0\x7e\xe1\xf5\x8b\x09\xf9\x17\xf2\xf2\xf3\x9f\x17\x06\x57\xf5\xaf\x96\xf0\xab\x25\x84\xff\x85\x3f\xff\x10\x97\xa6\xd7\x82\x57\x5b\xe4\xd5\x16\xc6\x2e\x0d\x60\xec\x42\x0b\x7d\xd5\x42\x90\x1b\xce\x5d\x0b\x5e\x6d\xb1\x57\x5b\x14\xba\xe1\xdd\xb5\xe0\xd5\x16\x7f\xb5\xc5\xc0\x4b\x03\xec\x32\xde\xc4\x85\xd6\xad\xd0\x61\x37\x62\x47\xbe\xda\xe2\xb7\x62\x87\xdf\x88\x1d\xf5\x6a\x4b\x5c\xc5\x8e\xb8\x8c\x1d\x04\x5e\x24\xf6\x56\xf0\xc8\x1b\xc1\x83\x2e\x50\x41\xdd\x8a\x1e\x75\x23\x7a\xd0\x25\x30\xc0\xab\xf8\xbd\x02\xf6\xf4\x7a\x83\xae\x8b\x2e\x27\xc9\xe5\x25\x17\xe4\x52\x00\x5e\x9f\x11\x9e\x2a\xa1\xeb\xab\x33\xa7\x4a\xf8\x5c\x09\x5f\x56\x22\xe7\xca\xab\x36\xd1\x73\x25\x7a\x59\x89\x9d\x2b\xb1\xcb\x4a\xfc\x5c\x89\x5f\x56\x12\xe7\x4a\xe2\xb2\x92\x3c\x57\x92\x97\x95\xd4\xb9\x92\xba\x72\xfe\x79\x48\xd0\xf5\x98\x5e\x06\x75\x35\x2a\xe8\x79\x58\xd0\xf3\xb8\xda\x77\x30\xfc\x80\x7e\x5d\xee\x51\x3a\x60\x77\xd6\x83\xaf\xf4\xba\xe6\xe7\x59\x11\xb9\x52\x7c\x99\x97\x67\x29\x7a\x25\xed\x9a\x84\x67\x45\xec\x4a\xb1\x6b\xc6\x9d\x15\xf1\x2b\xc5\x97\x99\x76\x96\x12\xd7\xd2\xdb\xe3\x23\xaf\x14\xbb\xe6\xd0\x59\x91\xba\x52\x24\xde\x8c\x0f\x02\xaf\xe3\x79\x7b\x80\xd0\x75\xe4\xdf\xcc\x8a\x8f\xbf\x50\x9e\x78\xed\xf1\xa5\xfe\xf9\x4f\xf1\x1e\x5e\xed\x8f\x24\xfa\xc7\x0b\xfe\x91\x8f\xbf\xb0\xe6\x1f\xc9\xfd\xae\x65\xff\xb8\x27\xf8\xc2\xca\x7f\xdc\x60\x7c\x61\xf1\x3f\xee\x56\xee\x5a\xff\x8f\x9b\x9c\x2f\x50\xc0\x71\xc7\xf4\x05\x16\x38\x6e\xbf\xee\x22\x82\x76\xdb\xf6\x05\x2e\x68\x77\x81\x5f\xa0\x83\x76\x53\x79\x37\x23\xdc\x38\xd0\x7f\x11\xde\xe4\x85\x2c\xec\xa6\x86\x16\xf1\x1d\xec\xd0\x82\xb9\x83\x20\x5a\x94\x76\x70\x44\x0b\xca\x0e\x9a\x68\xd1\xd6\xc1\x14\x2d\x8c\x3a\xc8\xa2\x45\x4d\x07\x5f\xb4\x70\xe8\xa0\x8c\x36\xcf\x1d\xac\x71\x4a\x6b\x17\x71\x9c\x12\xd6\xc5\x1d\xa7\x54\x74\xd2\x47\x1b\xbe\x8e\x6f\xb9\xaf\xe2\x7b\x09\xa6\x0d\xec\x9d\x1c\xd3\x06\xfb\x23\x9a\x69\xa3\x7e\x27\xd3\xb4\x99\xb8\x93\x6c\xda\xec\x7c\xc4\x37\x6d\x9a\xee\xa4\x9c\x36\x75\x77\xb2\x4e\x9b\xce\x8f\x88\xe7\x94\xd7\x3b\xb9\xe7\x94\xea\x0f\xe8\xe7\x93\xab\x88\xa7\xef\x87\x8f\xf3\xcf\xf3\xdf\x9a\x3d\xcc\x3f\xc7\x2f\xa3\x7f\xcc\x3f\xc7\xef\xb5\x5f\xe0\x9f\xe3\x97\xe4\xbb\xf8\xe7\xf8\xdd\xfa\x0b\xfc\x73\xfc\xa2\xfe\x05\xfe\x39\x7e\xeb\xbf\x8b\x7f\x42\xf3\x4b\xfc\x13\x9a\x5f\xe2\x9f\xd0\xbc\x93\x7f\xda\xcb\x1f\x5f\xe0\x9f\xf6\x6a\xca\x17\xf8\xa7\xbd\x38\x73\x37\xff\xdc\xb8\x1d\xe7\x45\x78\x93\x7f\x42\xb3\x9b\x7f\x5a\xc4\x77\xf0\x4f\x0b\xe6\x0e\xfe\x69\x51\xda\xc1\x3f\x2d\x28\x3b\xf8\xa7\x45\x5b\x07\xff\xb4\x30\xea\xe0\x9f\x16\x35\x1d\xfc\xd3\xc2\xa1\x83\x7f\xda\x3c\x77\xf0\xcf\x29\xad\x5d\xfc\x73\x4a\x58\x17\xff\x9c\x52\xd1\xc9\x3f\x6d\xf8\x6e\xf3\x4f\x1b\xc5\xfb\xf8\xa7\x0d\xec\x9d\xfc\xd3\x06\xfb\x23\xfe\x69\xa3\x7e\x27\xff\xb4\x99\xb8\x93\x7f\xda\xec\x7c\xc4\x3f\x6d\x9a\xee\xe4\x9f\x36\x75\x77\xf2\x4f\x9b\xce\x8f\xf8\xe7\x94\xd7\x3b\xf9\xe7\x94\xea\xc7\xf8\xe7\xf2\xe8\xe8\x74\x9d\xf5\x71\xfe\x79\xfe\x63\xaa\x87\xf9\x27\x70\xbe\xc0\x3f\x81\xf3\x25\xfe\x09\x9c\x3b\xf9\x27\x70\xbe\xc4\x3f\x81\xf3\x25\xfe\x09\x9c\x3b\xf9\x27\x70\xbe\xc4\x3f\x81\xf3\x25\xfe\x09\x9c\x3b\xf9\xa7\x3d\x46\xf8\x02\xff\xb4\xa7\x12\x5f\xe0\x9f\xf6\x90\xe3\x6e\xfe\xb9\x71\x33\xdd\x8b\xf0\x26\xff\x04\x4e\x37\xff\xb4\x88\xef\xe0\x9f\x16\xcc\x1d\xfc\xd3\xa2\xb4\x83\x7f\x5a\x50\x76\xf0\x4f\x8b\xb6\x0e\xfe\x69\x61\xd4\xc1\x3f\x2d\x6a\x3a\xf8\xa7\x85\x43\x07\xff\xb4\x79\xee\xe0\x9f\x53\x5a\xbb\xf8\xe7\x94\xb0\x2e\xfe\x39\xa5\xa2\x93\x7f\xda\xf0\xdd\xe6\x9f\x36\x8a\xf7\xf1\x4f\x1b\xd8\x3b\xf9\xa7\x0d\xf6\x47\xfc\xd3\x46\xfd\x4e\xfe\x69\x33\x71\x27\xff\xb4\xd9\xf9\x88\x7f\xda\x34\xdd\xc9\x3f\x6d\xea\xee\xe4\x9f\x36\x9d\x1f\xf1\xcf\x29\xaf\x77\xf2\xcf\x29\xd5\x8f\xf1\xcf\xd5\xed\x02\xa7\x03\xcb\xc7\x09\xa8\xfe\xd3\xe3\x96\xfa\x2b\x27\x2e\xf5\xd7\x0e\x5d\xea\x7b\xcf\x5d\xea\xaf\x1d\xbd\xd4\x5f\x3b\x7d\xa9\xef\x3d\x80\xa9\xbf\x76\x06\x53\x7f\xed\x18\xa6\xbe\xf7\x24\xa6\xfe\xe2\x61\x4c\xfd\xc5\xf3\x98\xfa\xa1\x23\x99\x1b\xb7\xc2\xbe\x08\x6f\x12\x50\x1d\x74\x13\x50\x8b\xf8\x0e\x02\x6a\xc1\xdc\x41\x40\x2d\x4a\x3b\x08\xa8\x05\x65\x07\x01\xb5\x68\xeb\x20\xa0\x16\x46\x1d\x04\xd4\xa2\xa6\x83\x80\x5a\x38\x74\x10\x50\x9b\xe7\x0e\x02\x3a\xa5\xb5\x8b\x80\x4e\x09\xeb\x22\xa0\x53\x2a\x3a\x09\xa8\x0d\xdf\x6d\x02\x6a\xa3\x78\x1f\x01\xb5\x81\xbd\x93\x80\xda\x60\x7f\x44\x40\x6d\xd4\xef\x24\xa0\x36\x13\x77\x12\x50\x9b\x9d\x8f\x08\xa8\x4d\xd3\x9d\x04\xd4\xa6\xee\x4e\x02\x6a\xd3\xf9\x11\x01\x9d\xf2\x7a\x27\x01\x9d\x52\xfd\x11\x01\xb5\xda\x7a\x6a\x69\x7e\x7b\xab\xd2\xc5\xa4\xfb\x5f\xdf\x9f\x74\xcb\x8e\x53\xeb\xfb\xf9\xd1\xfc\x9d\xaf\x7f\xff\x9d\xa4\xd6\xb9\x83\xd3\x1d\x02\xdf\xc0\xb6\xea\xac\xf1\xfc\x36\x27\xc3\xf8\x79\x55\x73\xeb\x5d\x28\x28\x08\x7e\xff\x76\x7e\x81\xf8\x3f\x9f\x4d\x4e\x4e\x9d\xef\x53\xb8\xaa\x7b\xf7\x2e\x87\x8b\x97\x6c\x7d\xff\x76\x7e\xcb\xd6\x4b\x3b\x59\x7e\x08\xac\xa7\xf6\x9d\xfc\xcf\x55\xe7\x17\x76\x9d\xdf\xd7\x75\x5d\x79\xa3\xf1\x93\xf4\xd8\x7a\x6b\xf4\xcf\xe3\x70\xbf\x19\xb1\x69\xfd\xba\x7c\xcd\x7e\x92\x5a\xbf\x8f\x95\xe7\x65\xce\xb4\x7e\x5d\xbf\xd8\xaa\x3b\x0c\xaf\x2f\x90\x3c\x46\xa1\xd5\xfc\xe7\xc5\x7b\xfc\x2f\xde\x0e\x06\x7e\x03\x7f\x17\xc1\x5f\x81\x97\xe5\x3f\x8a\xa8\x1d\x99\xf9\x14\xc5\xf9\x7f\xfd\x8f\x61\x66\x3f\x8e\xd5\xff\xfa\xe7\xaf\xeb\xbb\xb7\xae\xef\x12\xfb\xd9\x9a\xb6\x86\x3f\x92\x38\xf3\xda\xe7\x3c\xc4\x45\x9e\x79\xa6\xf5\x69\xcb\xdf\x02\xef\xe9\x29\xd4\x52\xbf\x7d\x63\xc3\x71\x24\x79\xaa\x45\x59\xa2\xa5\x56\x94\xff\x2e\x82\xb7\xfa\xdf\xe3\x77\x55\xbf\xba\xfa\xf7\xa2\x63\xf7\x6f\x1c\x3d\x97\xf2\x38\x79\x2d\x9c\x6e\xd6\x7f\x7f\x83\xda\xd9\xf1\x8e\xfe\x3b\xeb\x3b\x9d\x38\x07\xe1\xca\x0b\xe8\x2f\xc8\x0a\x6f\xb5\xfe\x97\x11\x87\x89\x66\xe4\xb7\x7a\x79\x96\xff\x6a\x6f\x2f\x7c\xbe\xed\x86\x4a\x3f\x6f\xf1\xbf\x03\xef\xb3\x46\xff\x3b\xf0\x7e\x5d\x07\xe5\x2f\xe4\xbe\x96\x9f\x8e\x5c\xf9\xc3\x70\xbd\xc0\xbc\xa3\x93\x0b\xed\x37\xfd\x81\xcf\x09\xbf\xc6\xcc\x3f\xdf\x36\xf6\xdf\x81\xf7\xdf\x6f\x81\xd5\x01\x8c\x2e\xb5\x5f\xef\x73\xd1\x6a\xbd\xcb\x67\x17\x56\xde\x27\xf0\xb8\x7d\x2e\x92\x0f\x8d\x3b\x40\x7c\x32\x6d\xa7\x77\xda\xe1\xf7\xa5\xf8\xb2\x29\xe8\x2f\xf8\x98\x0f\x17\x7a\x35\xc8\xad\xfa\xd8\xdf\x79\x45\x00\x3b\x96\x83\xe7\x37\xa5\x7d\xff\xd6\xbe\xa0\xee\x9f\x3f\x2f\xdf\x47\x03\x83\xe0\xcf\xee\xf7\xd3\x5c\xbf\x25\xed\xfb\x37\xf8\xb8\x7e\x5c\xbe\x1c\xea\xe2\xcd\x73\xff\xb8\x78\xf3\xdc\x3f\xbe\xff\xe3\xfa\xd5\x73\xff\xf8\x7e\x7a\xf5\xdc\xc5\x9b\xe7\xba\xdf\x31\x75\xfd\x96\xb5\xef\xdf\x2e\x5f\x6d\x77\xdd\xc3\xb7\x77\x5d\xbc\x7f\xbd\xdd\xd9\xd9\xcc\x6b\xac\x27\xe8\x74\x0f\x5a\x60\xe5\xf9\x71\xed\x4e\x34\xe3\xb8\x08\x9e\xde\xed\xf7\xf3\x72\x26\xc1\x7f\xa1\x17\x77\xcd\xbe\x86\xfc\xed\x5a\xf1\xdb\x85\x1f\x4a\x01\xfc\x67\x29\x80\xff\xaf\xa7\x00\xfe\xfb\x52\x80\xfe\xbb\x53\x80\x3c\x94\x02\xe4\xcf\x52\x80\xfc\x5f\x4f\x01\xf2\xf7\xa5\x00\xba\x2f\x05\xd7\x01\xff\x28\x05\xe8\x43\x29\x40\xff\x2c\x05\xe8\xff\xf5\x14\xa0\x7f\x57\x0a\x5a\xa6\xfe\xb7\x66\x00\xbb\x95\x01\x1c\xc7\xdf\x67\x00\x7b\xce\xc0\xf9\xc5\xaa\xd7\x39\x40\x6f\xe7\x00\xbb\xce\x01\xfa\xf7\xe7\x00\xfb\xdb\x72\x40\x76\xe4\xe0\x2f\x10\x3a\x56\xfe\x51\x0a\xf0\x5b\x29\x40\x10\xe4\x7d\x0a\xf0\x97\x14\x9c\xbe\x65\x5d\xa7\x00\xbb\x9d\x02\xfc\x3a\x05\xd8\xdf\x9f\x02\xfc\x6f\x4b\x01\xf1\x6f\x9e\x06\x7a\x6c\x1e\x1e\x99\x08\x09\xf4\x87\x13\x21\x81\x6e\x4d\x84\x2f\x0c\xec\xe5\x1b\xc8\xdf\x9a\xce\x63\xed\xd7\x93\x78\xb9\xb1\xbd\xf8\x0b\xa5\x63\x02\xbe\x25\xff\xff\x4d\xc1\x27\xd8\xfa\xf6\x57\x02\xbe\x1d\xdc\xf7\xd3\x98\x3b\x24\x1f\x0e\x1b\xfc\x70\xd8\xb7\x69\xf0\xfa\x0d\xaa\x97\x34\x78\x22\xf7\xbf\x67\xd4\xef\xb6\xb9\x2f\xa3\xbe\xb9\x01\xee\x1c\x35\xfc\xe1\xa8\x6f\xaf\x7a\x09\x7c\x6b\xd5\x3b\x25\x1b\xc7\xfe\x9e\x71\xbf\xdb\x5b\xbe\x8c\xfb\xe6\xae\xb3\x73\xdc\xc8\x9f\x82\x1c\xf9\x18\xe4\x7f\xd7\xb8\xdf\x6d\xe8\x5e\xc6\x7d\x73\xab\xd7\x39\x6e\xf4\xc3\x71\xe3\xb7\xc7\xfd\x66\xb3\x87\xbf\x1d\xf7\xdf\x33\xec\x77\xbb\xa8\x97\x61\x3f\xb4\xbf\x4a\xfe\x74\x7f\x95\xdc\xdc\x5f\xfd\xad\xc3\x7e\xb7\x73\x79\x19\xf6\xcd\x3d\x4d\xe7\xb0\xf1\x3f\xcd\x36\xfe\x71\xb6\xb1\x2e\x94\xff\x05\x22\x6f\xb6\x6a\x57\x7f\xea\xfa\xf9\xa8\x89\x9b\xa3\x7e\x27\xf9\x70\xd4\xc4\x9f\x26\x9b\xf8\x38\xd9\x7f\xcf\xa8\xc9\x9b\xa3\x7e\x27\xf9\x70\xd4\xe4\x9f\x8e\x9a\xfc\x64\xd4\xff\xd6\x41\xff\xd5\xbe\x24\x38\x38\x3d\xc4\xe1\x2e\x7e\x7d\xf7\x22\xf2\x13\xc5\x9e\x5b\x3a\x3d\x0e\xa2\xfd\xd8\x3e\xd5\xe5\xfd\x33\x21\x5a\xd9\xf9\xe1\x2b\x17\x7a\xef\x9f\x5b\x79\xf2\xcc\xb2\xaf\x9a\x7b\xfb\x2c\x8a\x56\x74\x7e\x50\xca\xa5\xde\xb9\xea\x42\xd5\xcd\xc3\xe0\x91\x04\xbe\x7b\x53\xf5\xdb\x4c\xfe\x7f\x7b\xff\x79\xb1\xe3\x81\xb1\xff\xfc\xfd\x7f\xce\x7d\x19\xd6\xaf\xcb\x5e\xff\xf1\xda\xcd\x3f\x7e\x66\xa9\xf1\x54\xa4\xc1\x7f\x99\x5a\xae\x3d\x69\x49\x12\x78\x86\x96\x7b\x71\x04\x9c\x52\x1e\xdb\xf6\x4f\xc3\xd5\xd2\xcc\xca\xff\x77\x91\xdb\x3f\xc8\x9f\xba\x96\x59\x38\xfa\xdd\x04\x29\x6e\xe1\xd0\x0c\x7d\xfc\x19\xce\x1d\x9a\x11\xdb\x8f\x21\x49\xd3\xf4\x9c\xfe\xe0\x87\xe1\x16\xc1\x42\x3a\x7e\xd8\xb7\xc5\xea\xf8\xaf\x61\x4b\x3c\x86\xf9\x26\xbb\x58\x2b\x34\x4d\xf3\xec\xb1\x72\x75\x6c\x87\x13\x78\x68\x6e\x93\x0b\x88\x99\xad\x8f\xaa\xee\xb1\xd2\xd0\x68\x9a\x9e\x9a\xbb\x43\xcf\xda\x05\xfc\x1a\xda\xf4\x69\x9a\x1e\xb5\x1e\xf4\xdb\x4e\x9c\x05\xaf\x8a\xe6\x9a\x5a\x4d\x1a\x81\xa6\xe9\x60\xfe\xda\x1e\x13\xcf\xf6\x4d\xaa\xc0\x90\x6b\x1c\xd5\x8f\x2d\xd1\xa3\x8c\xa6\xe9\x41\x14\x99\x83\x01\x31\xdc\x99\xd1\xdc\xa1\x69\x5a\x1c\x1c\x45\xed\x3f\x34\xc9\x2a\x28\xb3\xe3\xd4\x4a\x85\x41\x9a\xa6\xab\xe3\x28\xb9\xa9\x43\xd3\x83\x85\x0a\xab\x3c\x04\xab\xf0\xb0\x39\xb6\xc7\x46\x47\x53\x5a\x78\x71\x85\x61\x22\x9d\x0f\x42\x9a\xa6\x97\x47\x89\x14\x89\x34\xcd\x39\xeb\x7a\x28\x38\x12\xec\x06\xca\x76\x4e\xd3\xec\xee\xd8\x28\x2d\x1d\x15\x06\xca\x44\x51\x9c\xb5\xc6\xb9\x81\x32\xa7\xe9\xe5\xb2\x8d\x8f\xdb\x7a\x49\x9b\x30\x33\x18\xc5\xba\xbc\x40\x69\x9a\x19\xad\x8f\x95\xf1\xd1\x68\x55\x14\x33\x01\x18\x72\x75\xa9\xc0\x2c\x4d\xb3\xe5\x31\x88\x7d\xe3\x28\x8a\xf6\x23\x2d\x62\x2a\x7d\x3b\x44\x8f\xfe\xad\xfc\xb6\xbd\xb3\x93\x63\x96\xb6\x82\x42\xd9\x42\x01\x4d\x33\x53\xfd\x58\xa9\x1c\x5d\x97\xb6\x13\xb3\xcf\x52\x32\x53\x1a\xc8\xd1\x3f\xe0\x68\x34\x88\xe7\x34\xcd\x78\x9c\x3c\xdc\xc1\x63\x83\x1f\x05\xc7\xf6\xd6\xd8\x31\xa8\xfd\x16\x07\xbb\x45\x30\xa7\x5d\x06\x51\xb7\xa3\x90\xa6\x99\x35\xd7\x86\xee\xe8\x0a\xcd\x51\x91\xab\x84\x6d\xb9\x4d\x2d\x0d\x0d\x39\x48\x6b\xbd\x18\xac\x2a\x15\x3e\xa9\x4a\xcb\x5e\x52\x6e\x50\xd8\x81\xc5\xf9\x7c\xcf\xce\x99\x01\xcb\xfa\x36\x28\x4e\x66\xb1\x4d\x1c\x92\x09\x30\x88\x6d\xd9\xde\x00\x0d\x40\x0b\xce\xa2\x0f\xae\xe6\xfd\xc9\x02\x37\xcc\xe1\xc2\xdf\x6d\xb2\x98\xe0\x9b\x55\x09\x0d\x50\x86\x08\x51\x10\x25\x07\xd3\x20\x4e\xa4\xa0\xc4\x51\x6c\x69\xc9\xf2\x64\x85\x41\x99\xdc\x2c\xb5\xde\x16\xa1\x87\xc8\xb1\x3f\x7e\xa7\xed\x36\x06\xa3\x0f\xf5\xcd\xd0\x26\xa6\x85\x6d\xf5\x4a\x00\x9c\x6c\xd9\x78\xd2\x67\xc0\xc1\xda\xf5\xeb\xd5\x76\xcb\x2e\xd7\x1b\xce\xdb\x8a\xc3\x6c\x33\x1b\x84\x2c\xcb\xab\x41\x61\x28\x38\x34\x27\x98\x9d\xea\x0d\x86\x63\x5e\xdd\x07\xb8\xd2\x0c\x06\x09\x0b\xee\xe9\x83\x28\x65\xcc\x3c\x5b\x8e\x0f\xc9\xbe\x9c\x4e\xd7\xa6\xaf\xe0\x8a\xab\x0c\x2b\xfe\x30\x50\x42\x90\x88\x86\xfd\xd9\x04\x2e\x6d\xa9\x87\x0f\xa9\x38\x07\xb8\xe1\x8e\x9c\x62\x14\x05\x11\x4d\x13\xd9\x84\x1e\x0e\x69\xd1\xf5\x44\x57\xed\x63\xb9\xbc\x9d\xac\x15\x66\x36\x80\x05\xa5\xd9\xf5\x04\xa8\x8f\xba\x21\x89\xa4\xeb\x55\xe2\x85\x24\x2c\x69\x0c\xb9\x30\xa6\x63\x26\x43\x39\xc0\x08\xe2\xa9\x27\xb9\x75\xaf\x77\xe0\x04\x70\x14\x72\x82\xe5\x56\xe9\xba\x50\x30\x50\x1a\x26\xc1\x1e\x4c\xd7\x5e\xec\xd8\x07\x7b\xb0\x01\xb8\xb1\xd1\x9b\x8f\xc6\x13\x90\x99\x73\x84\xb5\xa4\x61\x6d\xc7\xa8\xa4\x17\x44\xc3\x39\x1f\xcf\x1a\x75\x5c\x19\xf3\x05\xc7\x91\xdb\x05\xb0\x23\xca\x1d\x21\x0f\x4b\x9b\x59\x0c\x00\xc1\x07\x38\x7e\xe2\xe7\xa8\x84\xf7\x08\x17\x01\xca\xde\xac\x6e\x48\xd3\x88\x65\xc4\x75\x2b\xb5\xb7\xab\x81\xdd\xcc\x98\x8a\xba\x40\x11\x71\x89\x8c\xf4\x9d\x80\x90\x05\x50\x82\x7e\x05\x33\x58\x3d\x26\xa6\x7e\x28\xba\xe2\x0a\xe6\xe0\x99\x6f\xc4\x7b\xc7\xe3\xf7\x95\x37\xc3\xd7\x2b\x7a\x88\x3a\x82\x88\xfa\x62\xea\xb1\x63\x51\xc8\x62\x95\xc3\xa2\x0c\x1a\xa5\x7d\x91\xa7\x7a\xcc\x30\x9a\xf9\x0e\xab\xa6\x87\x21\xe0\x1a\x42\xa5\x14\x2c\xda\xdf\xf4\x0d\x75\x50\xf5\xe8\x99\x6b\xa8\x73\xa1\x37\x10\x17\xe8\xca\x59\xa0\x2b\xd0\xab\x42\xdf\x73\xaa\x9e\x30\x10\xd1\xb9\xab\x35\x56\x02\x55\xf9\x28\x1d\x2d\x27\xe2\x3a\x0e\x18\x21\x11\x54\x73\x3c\x96\x7d\x63\x8c\x95\x01\x9c\x4f\x63\xdf\x49\x7a\xc6\x61\xed\x9a\x05\x01\xd6\x5c\x1c\x99\x91\xea\xe9\x07\x63\x1a\xb2\xc6\x3a\x1e\x29\x71\x4d\x0b\x9e\x07\x6e\x58\x76\x91\xd6\xb6\x86\xcf\x17\xcc\x48\x1d\x8d\x86\x43\xb6\xa4\x57\x33\x31\xc5\xf4\xf5\xdc\xb5\x63\x55\x8a\x66\x24\x6b\x67\x04\x06\xa3\xbe\x47\xf4\xe7\x07\x98\x5d\xaf\x51\xc6\x64\x99\xb4\x18\xd1\xbb\x9a\x57\x67\x34\xb9\x56\x68\x6a\xd1\x67\x71\x6f\x3d\xc9\x46\xc4\x24\x16\xd2\x49\x3c\x4a\x27\xb1\xa0\x8f\xd0\x60\x31\x20\x43\x77\x30\x59\xc5\x0b\xc4\xeb\x4f\x48\x6f\xbd\x6b\xe2\x44\x91\x73\xbd\x46\x0f\x60\x51\x95\xf4\x6a\xe2\x11\x16\x69\x89\xc5\x24\x68\xd8\x83\x5b\x86\xb8\xdc\x47\xa3\x51\xe3\x8f\xe5\xc9\x76\xcc\xa9\x69\x9f\x0b\xac\x3a\xcf\x25\x15\xc4\x22\xb1\xe9\xd7\x61\xc2\x70\xa9\x31\xb0\x34\x72\x00\x67\xaa\x87\x94\x75\x13\x83\x68\x35\x0c\xd1\xf5\x90\x2b\x31\x71\x31\x33\xcc\x71\x99\x39\x63\x3e\x5c\x05\xbb\x74\xe4\xd5\x50\x98\x80\x4d\x33\xe2\xf4\x5c\xad\xcd\x03\x22\x4d\x02\xdb\xda\x03\x66\x45\x59\xbe\x27\xb3\xb3\x84\x48\xe1\xb5\x6c\xe5\xa4\x4e\x72\x6b\xad\x90\x06\xbc\xc2\x4f\xe2\x83\xb1\xdc\x0d\x84\x00\xb7\xf8\x92\x29\xa2\xc6\x2b\x2c\x0a\x48\x62\x84\xa9\x10\xb9\x39\x2c\x91\x34\x41\x0d\xa2\xc6\xc0\x11\x07\xc0\x03\x6b\x6c\xe4\x53\x36\xec\x2b\x6b\xf9\x20\x1a\xba\xb7\x26\x75\x4f\xec\x07\xae\xb0\x18\xda\x6c\x8c\x1d\x16\x7b\x76\x38\x1d\x84\x6e\xbc\xe6\xd7\x4b\x96\x5f\x2f\xfc\x60\xa1\xa5\xf9\xd0\x0b\xea\x65\x9c\x6f\x02\x7b\x28\x1a\x13\x97\x99\x0e\x2b\x3f\xa2\xd1\x65\xb5\x34\x84\x83\xa0\x8e\x97\x92\x0a\x41\xec\xc1\x0b\xaa\x50\xb5\x96\x7e\x1c\x0a\x9b\xe1\xc2\x2f\x51\x22\xec\xc5\xee\x58\x66\xd7\x6b\x65\x39\xaf\x9a\x44\xc9\x12\x79\x8d\x24\x93\xbd\x0d\xf6\xd6\xcb\x1e\x98\x22\x43\xb6\x27\x0f\xfd\x86\x0b\x0a\xac\x59\xf6\x1a\xb9\x98\x2c\x93\x72\xbd\x5d\x67\xfb\x52\x1a\xaf\x9a\xad\xb5\x8f\xb2\x52\xd4\x97\x85\x0f\x7b\x94\xb6\x51\x1b\x76\xa9\x8f\xcd\x85\x1a\xd5\xe5\x2a\x5d\x4d\x7a\x9a\xd7\x04\x8b\xcc\x52\xbc\x15\xb1\xcc\x2c\x9b\x8f\xc6\x54\xa2\x0e\x77\xc2\x61\xa5\x11\x2e\x91\x05\xb3\x14\x4a\xb8\x42\xd8\x41\x45\xb2\xa9\x27\xdb\xb5\xaf\x2b\xb5\x2f\xd4\xd8\x4e\x62\x01\x67\xb9\x3a\x0c\x53\xa5\x8e\xa7\x87\x99\x5a\x99\xa5\x72\x30\x25\x98\x54\xe7\xd4\x4c\x02\x6b\xa8\xa0\xfd\x15\xa2\x4d\x47\xf5\x6e\x88\x18\x6a\x15\x00\x43\xc3\x50\x26\xc9\x76\xc5\xf7\xa7\xfe\x7e\xb4\xd7\xa6\x6c\x41\xad\xe6\x6c\x2a\xa5\xb0\x10\x4e\x17\xcc\x4c\xb0\x8d\x1a\xc8\xf1\x83\x3c\x8c\x02\x56\xf2\xf7\x84\x3e\xda\x44\xea\xc8\xce\x7c\x19\x59\x4e\x34\x60\x42\xaf\x7c\xdf\xed\x6d\xcc\xe9\x92\x8b\x30\x76\x86\x6d\x45\x3c\x81\xf0\x6a\x8b\xc3\x4e\x0e\x91\x3e\xbe\xd1\x72\xd0\xcd\x88\x65\xb1\xd9\xa7\xa6\x9e\x08\x41\x6f\x97\x5b\xb1\xbd\xc5\x0f\x89\x19\x03\x76\x3c\x8d\x20\x61\x8b\x6c\x07\x7a\x2e\xe4\x85\x0f\x12\xe6\xc4\x84\xf1\x88\xc8\xc1\x95\x0d\x4e\x64\x48\xdf\xc1\x9e\x1d\xe5\x2b\x84\x5a\xce\xa8\x5a\x1c\x0e\xf5\xc4\x49\x8d\xed\xcc\x64\x86\xb6\x9b\x46\xab\x15\x22\x6d\x8a\x3c\x2d\xa7\x13\x99\x46\x8a\x4c\x2e\xa4\xd2\x90\x4c\xdc\x22\x0e\xcd\x16\xe3\x09\x97\x40\xe6\xb3\xa2\xee\x61\x2e\xd4\x53\xe0\xe2\x60\x9b\x20\x8c\xf3\x16\x45\xe4\xe6\x06\x29\x24\xdb\x0a\x7b\x04\x92\x9a\x56\x0f\x55\x7a\x78\x49\xb8\x40\x81\xf4\xf0\x6c\x03\x01\xce\x02\x70\x97\x33\x12\x9b\x51\x43\x89\x4c\x54\xa0\xd8\x03\xa0\x31\x23\xc9\x92\x1a\xd8\xc4\x16\xa8\x97\xc0\x01\x06\x90\x31\x00\xee\x01\x48\xb3\x31\xca\x26\xa0\x92\x14\x10\x7c\xa7\x03\xa6\x0e\xac\xa4\x5e\x40\x01\x3b\x0a\x08\x0a\x80\x88\x01\x94\x06\xb0\x0a\xc0\x4c\x9b\x1c\xdb\xa4\x0b\xe0\x3b\x00\xc6\x50\x56\x84\x87\x82\xbd\x88\x57\xb5\x38\x08\xa4\xc1\x46\x75\x16\x6a\xbc\xc5\xe2\x95\xbe\x76\xd7\x1b\x77\xa9\x3b\x14\xc2\xf0\xfb\x0a\xdf\x57\xa3\xbc\x5a\x41\xf1\x96\x9f\x87\xa5\xc2\x0e\xb4\xe1\x64\x3b\xd4\x71\xda\x23\xe6\xb0\xad\xf0\x48\xda\xe7\x7a\x5c\x4e\xf2\x0a\xca\x96\x69\xff\x60\x33\xbd\x5e\xdf\x25\x59\x8f\x1b\xc7\x21\x47\xf2\x6b\x18\xf7\xa9\x3a\x9b\x49\x3d\xb4\x8e\xdc\x41\x15\x3a\xa0\xbe\x9b\xcd\xe0\x08\x03\x76\x21\x59\xa5\xbb\x65\x0f\x8a\xdc\xa0\x0a\x92\x90\x2a\x65\xce\x40\xab\x34\x18\x50\x2b\x6c\x9e\xee\xf6\xe8\x21\x65\x41\x8d\x32\xf4\xa2\xb7\xe2\xd0\xca\xc6\xe5\x5a\x9f\xcd\x10\x2e\x21\xeb\x06\x5c\xed\x6a\x14\x8c\xb8\xb5\xcd\xf5\xa1\x8a\xea\x2d\xa3\x5d\x92\x0d\x55\x1b\x5b\xcb\x0a\x8a\x60\x13\x78\x48\xc2\xb2\x37\x31\xb6\x22\x70\x20\x04\xd0\x4c\x67\xa5\x18\x11\x1b\x4b\x9c\x06\x11\xa7\xd3\x04\x5b\x62\x56\x21\x8e\x09\x3b\xb1\x53\x91\x9c\x1e\x86\xb2\xac\x08\x07\xac\x8e\x49\x1d\x02\x8c\x26\xa3\xcc\x00\xb6\xcb\x32\x9a\x6a\x8d\x06\xf5\xad\x40\x34\x25\x6b\x6b\x58\xca\xd4\xde\xe4\x52\x44\x6e\x30\x07\x40\x30\xac\x9c\x6e\xab\xda\x82\x02\x0b\xcb\xc5\x98\xc9\x1d\x38\xdc\xc7\x1e\x82\x51\x61\xbe\xda\x43\xfa\x1a\xdf\x87\xfa\x1c\xd7\xcc\x65\x32\x8b\x24\xb8\x49\x00\x51\x5b\x4d\x09\x44\x03\xb1\x94\xc2\x8d\xda\xc1\x35\x44\x9d\x29\x85\xba\x0f\xb9\x4d\xa1\xaf\x91\x31\x7a\x18\xf5\x2c\xc1\x40\x74\x5a\x9f\xc9\xdb\x18\x9c\x8e\x6c\xc9\xdc\x67\xb4\xae\x8f\x29\x2b\x84\x45\x44\xc8\xe5\x9c\xe6\x7b\x01\xbc\x35\x0f\x92\x99\x60\x73\x53\xc6\x80\x72\xce\xc9\x6a\x11\x85\xfa\xdc\xeb\xd9\xea\x36\x23\x7a\x56\x2f\x84\x7b\xc8\x3c\xcb\x45\x02\x48\x04\xcd\x02\x97\x72\x04\xf3\xd3\x99\x30\x63\x67\xaa\xdd\xcc\x08\x3d\x2e\x0a\xa8\xa8\x90\xc6\xc0\xec\x62\xa9\xf7\x46\xba\xbf\x47\x22\x6a\x91\xd8\x23\x24\x15\x09\x93\xd8\x13\x80\x53\xd9\xd3\x0d\xdf\x6c\x91\xbd\xec\x14\x70\xb6\xcf\xb0\x31\xb9\xda\xc1\x84\xe9\x6d\x09\x65\x36\xe9\xef\x4a\x06\x2b\xb3\xf9\x21\x14\x86\x7b\x2a\xed\xfb\x06\x4a\x39\x08\x80\x7a\x16\x92\x2e\x8b\xb5\xad\x71\x84\xcc\x4e\x4b\x23\x06\x02\x1c\xf2\x79\x38\xde\x79\xbb\xc1\xca\xaa\x9b\x98\x8a\x12\xbd\xe0\xcb\x99\x5f\x08\x46\x51\x06\x11\xcc\xcb\x5b\x52\x2b\x20\xc3\x43\x60\x70\x41\x94\x06\xe4\x2f\x60\x20\xb2\x82\x52\xe9\xe9\x98\x57\x5a\xbd\x94\xe0\xd1\x32\x03\xa7\x3d\xc7\x99\xa1\x83\x80\x02\x13\x60\x38\xb0\xa0\x4d\x51\x0f\xc8\x00\x1d\x0c\x61\xb4\xe4\xe3\x6c\x44\x68\x07\x7b\x3a\x96\x39\x0d\x08\xc1\xed\xdc\x9a\xc0\x09\x39\x20\x8c\xe5\x86\x98\xe9\x81\xc5\x66\xe6\x21\x75\xdc\xa1\x54\x51\x6b\x92\x92\xd7\x24\xa6\x40\x4a\x23\xb1\xf2\x6a\x52\x00\x62\x83\x65\x3a\x6f\x71\x5c\x81\x44\x0e\xa9\x4f\x76\xba\xa1\x52\x75\x68\x4b\x4b\xa2\x1f\x10\xbb\x99\x11\xd5\xb2\x18\x08\x8e\xab\x8e\x37\x82\xeb\x17\xc2\x01\xa5\x40\x99\xa4\xf3\x60\x2c\x6f\x5f\xf7\x81\xe3\xe3\xfe\x9f\x77\x68\x66\xc1\xaa\xe2\xa6\xdd\x37\x9f\xbe\x3c\x00\x00\xf9\xfc\x7d\x01\x85\x43\xc9\x51\xd3\x91\x13\x89\x03\xfa\x90\x0d\xfa\x90\xb8\x5e\x57\xc6\x80\x46\x69\xd8\xe5\x2c\x51\x59\x30\x3b\xc9\xe1\x0f\xce\x90\x39\x54\xe2\xa1\xcf\xac\xa7\x54\x35\xab\x14\x9e\x71\xe4\xcd\x8c\x6c\x96\x00\x0a\xaa\xdc\xc8\x9b\x89\xfb\x78\x2f\x0e\x18\x91\xc9\xfc\x3a\x5b\x8d\x73\x06\x12\xc6\x03\xb6\xa2\xeb\xc0\x18\xb7\x7b\x6f\x7e\xa7\xe5\xaa\xa4\xae\x05\x6c\xc1\x8b\x2a\x00\x10\x26\xc5\x2e\xe3\x35\x65\xeb\xb0\x66\x4a\x5c\xec\x2e\x86\xd4\x5e\x16\xca\x64\x99\xc1\xfa\xb8\x84\x17\x69\xca\xb2\xd2\x70\x9d\x79\xd6\x68\x2c\xaa\x2c\x24\xad\x72\xb7\x2c\x8a\xc1\x66\xb7\x9b\x10\xb3\x60\x53\x16\x03\x06\xe1\x37\x60\xd5\x34\x13\xf7\xa0\xe6\x58\x83\x44\xb3\x69\x34\xb5\x0c\x4b\x25\x6c\x1e\xe9\xbb\x78\x95\x33\xa6\x40\xad\xf1\xc4\x47\x31\x1c\x5b\xa6\xa2\x11\xec\xc4\xa9\xe4\xa8\x8b\xca\x6b\xd2\x02\xf4\x9d\x55\xa3\xaf\xe6\x23\x17\x5d\x0a\x82\xe8\xaf\x68\x75\x12\xf5\x17\xa3\xfd\x7e\x31\x49\xfc\xc3\x86\x17\xc3\xd5\xdc\x0b\x97\xac\x37\xdb\x58\xdc\x96\x34\x51\xff\xb0\xc3\x8a\x1c\x73\x67\x8d\xd7\xdb\x14\xcc\x26\x65\x36\x7b\x37\xc8\xf0\x71\xa6\x6c\x34\xdc\x34\x81\x90\x07\x02\x69\x2c\xc3\x7c\xad\x80\x16\x1c\x53\x09\x8a\x45\xe8\x32\x22\xeb\x7a\xa9\xd5\xbe\xe7\x24\xbe\xa7\xa8\xbe\x27\xab\xbe\x97\x0d\x33\x9f\x85\xb5\x1e\x2c\xd7\x41\x91\xdb\x86\x9b\x89\x66\x29\x35\x98\xea\x32\x1b\x97\xd9\xc4\xee\xca\xc2\xbd\x0d\xe5\xe7\xba\xbd\x99\x97\x10\x3f\x83\x36\x93\x6d\xba\x29\x37\x82\xa4\x15\xfc\xde\xf7\xa1\xbd\xa3\x6e\xd2\x5e\xba\x96\x36\xdb\x54\x0b\x96\xd0\x3e\x18\x6f\xf6\xfe\x78\xb3\x5f\x4d\xf7\x9b\x11\x12\xdb\xd2\x54\x85\xd4\x08\x04\xd4\xe9\x0e\x19\xf2\xce\x81\xb7\x59\x98\xb6\x35\xc0\xaa\x7a\xa6\xd7\x23\x42\x0a\x89\x7b\x52\x5a\x17\xd6\xac\x72\x31\x06\x39\x6c\x20\x0b\xd0\xec\x50\x8f\x1c\xc2\xef\xf5\x67\xdb\x6a\xb9\xeb\x91\x00\xea\x82\xba\xbc\x5c\x98\x86\x29\xeb\x85\x35\xed\x8f\x86\x14\x81\xa2\x6c\x56\x02\x53\x57\xe2\x81\xd4\x5b\x55\x7d\x86\x1a\x8b\x00\x5d\x39\xde\x96\x33\xc8\xe5\xd8\xb0\x3c\x3f\x54\x56\xde\xdc\xe0\xd0\xe9\x48\x18\x09\x71\x1c\x07\x6e\x7f\xc2\xb3\xec\x9a\xec\x7b\xf3\x3a\xe0\x58\x5f\x1c\x61\xfe\x62\xd7\x5f\x0e\x37\xac\xb6\x58\xec\xf6\x3b\x6e\x2d\x72\xa1\xd2\x6c\x1a\x6e\x5e\x47\x4e\x20\xaa\xcc\x78\x15\x1a\xa3\x75\xb2\xe3\x4c\x6e\xbb\x5c\x55\x60\x1d\xfa\x46\x9e\x61\xbb\xbe\x6c\x19\x75\x44\xcf\x73\xb5\xe6\x46\xd2\xd6\x25\xb0\xc9\x78\x4b\xab\xcb\x3a\x72\x65\x02\x18\x44\xda\x21\x84\x85\xa9\xa1\x36\xab\x60\x28\x71\x8c\x65\x60\x8b\xc3\x66\xb3\xe1\xa7\x0b\xce\xc3\x6a\xd7\x28\xd7\x46\x22\xa7\x88\x34\x5f\x03\xdb\x15\x28\x39\xb0\x96\xc8\x85\x96\x24\x54\x3e\xd4\x0a\x88\x37\x87\x19\xca\x1d\x10\xa9\x97\xab\x31\x90\x9b\xd1\x6c\x97\x6f\x8a\xa1\xcd\x4f\x6a\x7a\xa6\xe6\x2a\xbc\x95\x82\x89\x9a\xf9\x8b\x98\xd2\x61\x11\xad\x89\x81\xe3\xcb\x33\x51\x1d\x6f\x38\x9c\xf6\xc6\x68\x8c\x18\x56\xcc\x85\x5b\x66\x08\xce\x48\x13\x8a\xbc\xa4\x76\xeb\xc9\x58\x2a\xb7\x75\xc0\x23\x19\x5a\xb1\x43\x73\x09\x64\x58\x15\x70\x94\xa9\xba\xcb\x55\xc4\x2d\x21\x62\xaf\x59\xe9\x70\x5a\x8a\x0b\xdd\x96\x9c\xd8\x4e\x12\xa0\xa9\x7b\xf3\x46\x4b\x63\x4b\x4a\x76\x8a\x48\xf7\x79\x81\x9f\xfb\x19\xb7\xd4\x56\xe0\x80\xa6\xa4\x62\x14\x28\x9c\x5b\x92\x6e\x23\x4d\x80\x9d\x1a\xc0\x00\x00\xf4\x4d\x81\x19\x91\xb3\x9e\x0c\x20\xa8\x33\x73\x06\xc2\x6c\x0e\x7a\x96\xb4\xcf\x37\x61\x80\x80\xa0\xb2\x0e\xf4\x3a\x10\xea\x5c\xd5\x86\xc3\x49\x0d\x1e\x8c\x24\xe7\x85\x84\x59\xf6\xe9\xb9\xc4\x78\x05\xd4\x2f\x76\xae\x3e\x06\x87\x49\xb2\x72\x47\x54\xb5\xc5\x41\x19\xb2\xc9\x31\x85\x19\x79\xd2\xe0\x03\xb3\xb7\x2d\x48\x1d\x5e\x6a\x8c\x3b\x22\x60\x88\x01\x40\x22\x3b\x10\x22\xdc\xd3\xad\xad\x78\x08\xfa\xcc\x0e\xd1\x48\x76\xee\x35\xa6\xa4\x68\xdb\xe0\xe0\x21\x56\x06\x47\xeb\x5a\x97\x98\x29\x07\x6b\x63\x82\x08\xfa\x09\x6b\x03\x6b\xad\x5c\x6b\x3b\x61\x65\x65\xf6\x08\x17\x1d\xba\x9e\x4d\x52\x45\x04\x01\xa6\x0f\x1d\x86\x2b\x7f\xee\x21\xfc\x3a\x4e\xb2\x65\x14\xcb\x09\x78\x00\x29\x53\x13\x61\x0d\xd8\xc0\xc1\x7a\x3c\xb4\x6b\x12\x9b\x17\x4c\xbf\x94\x01\xbd\x11\xb7\x20\x64\xaf\x27\xf0\x74\xaf\xc8\x34\x1b\x2c\xbc\x0d\x1d\xf7\xd9\xa5\x9d\x69\x23\x29\x14\xa5\xb5\xd5\x57\x93\x1d\xb0\xa8\x1a\x82\xda\x50\xf4\xb6\xa7\xf9\xda\xa0\x57\xb8\x94\xb7\x48\xfb\x45\x44\xb1\x64\x0c\x44\xf3\x7e\x2c\x3a\x99\xe8\x81\x0e\xd8\x5f\xae\x6d\x0b\x71\xb2\xbe\x9b\x33\x13\x65\x04\x4d\x05\x74\x18\x6d\xf7\x40\xb1\x0e\x96\x44\x90\x08\x19\x4a\xef\x46\x03\xb7\x19\x8d\x2b\xaf\x57\x73\x5b\x03\x91\x45\x56\xa3\x72\x77\x3c\x9b\xd2\xe5\x72\xb4\xe6\x92\xad\xdd\xac\xf9\xbd\x37\x56\xe3\x8a\x15\xa9\xa0\x5f\xb9\x07\x78\x0e\xa4\x9b\x74\xbe\xec\x0d\x26\x02\x83\x0a\xdb\x4d\x84\xc4\x13\x1a\xcf\x75\xb3\xe7\xa6\x63\xc1\x6a\x60\x54\xdd\x2f\x17\xab\xe9\xfc\x10\x8c\xb1\x61\x8d\xaf\xb5\x35\x9c\x3b\x61\x56\xb1\x83\x60\x04\x41\x7b\xd6\x18\x99\x91\x4c\x6b\x54\x23\x71\x4c\xd1\x37\xf1\xfe\x50\xe4\x98\x71\x31\x76\x4d\x62\xb3\xcd\x23\x87\x1f\xec\x09\xaf\xe9\x6d\x89\xa2\x47\xad\xac\x6d\x39\x8f\x0a\xcc\x81\xe5\x19\x3d\x37\x0f\xce\x7e\xb5\x08\x6a\x59\x5e\xf6\x06\x42\xde\x2c\xb3\x71\xdf\xaf\xc1\x72\xbd\x00\xd5\xc9\x52\x09\x19\x07\x53\x56\x81\xa4\xa8\x9b\x1d\x32\xa7\x0a\x0a\x1f\x0d\x96\xb4\xbe\xe6\x7a\xb9\x18\xe7\x9e\xdc\x54\xdb\xc6\x8a\xd7\xec\x26\x81\x84\x0d\x1c\x57\x5b\x7e\x91\x2c\x05\x3a\x61\x5c\xe2\x90\x96\x4c\x4d\x17\x0e\x2b\x91\xa1\x33\x8c\x41\x4e\xe4\x99\x94\x93\x3c\x11\x1f\xcd\x05\x55\x13\xe9\x62\x20\x87\xae\x26\x68\x7d\x37\xa1\x41\x17\xd4\xd7\x60\x12\xdb\x6a\xa3\xc8\xce\xc1\xd7\x90\xd1\x18\xe1\x17\xc9\x66\x49\x96\x3d\x30\x8c\x0f\x9a\xb5\xae\x67\xb8\x1e\x0d\xf0\x52\xe1\x66\xfa\x16\x90\x5d\x94\xa3\xb7\xa2\xcc\xec\xe1\x9e\xd1\x78\xa3\x49\x59\x0b\x36\x2a\xa2\xfe\x2c\x1c\xf5\xf7\x8b\x49\xbe\xa2\xc2\xd1\x94\xd7\x24\x30\xc4\xb3\x3c\x54\x01\x71\x79\x68\x52\x65\x59\x2e\x49\x66\x68\x31\x6a\x35\x62\xd7\xf1\x0c\x90\x8c\xa6\x98\x98\x6b\x86\x51\x2a\x49\x01\x2b\x6f\x5b\xa3\xea\x10\x2a\x42\xcd\x4a\xb4\xdd\xd2\xdf\x49\xc1\x78\x23\xa9\x3d\x2e\x59\x66\x7b\x49\x18\x0c\xa0\x0a\x18\xc4\xcb\xbc\x1f\xce\xa8\xc6\x94\xe6\xa0\xeb\x34\xb2\xae\xe8\x35\xaa\xd6\x92\x09\x37\xe9\x54\x12\xc0\x5d\xbe\xe3\x74\xc1\x08\x37\xdc\xe1\x10\xb1\x4b\x6b\xbb\xc0\x16\x86\x9a\x06\xca\x21\x9d\x66\x7c\x6d\xd4\x9b\x70\xbb\x80\xb6\x86\x02\x87\x49\x21\xd8\x01\x7b\x48\x0b\xd5\x0e\x7d\xaf\xcc\x95\xd9\x5e\xf2\x47\xbd\xde\xba\x8f\x0d\xdd\xb1\x92\xf8\x48\x41\x4f\xd0\x7c\x90\x4d\x8a\x8d\xbf\x41\xfc\x66\x6d\xee\x89\x40\x92\x4c\x4c\x83\x58\x6b\x5d\xa9\x12\xb7\x03\x5c\xc0\xb3\xe6\x51\xc3\xa3\x23\x93\xb6\xfb\x4d\xe3\x09\x40\x60\x18\x2b\x7e\xed\x09\xbd\x20\x98\x0a\x3b\x78\xcd\x90\x3a\x67\x2c\xa2\x2a\x8b\x40\x95\x9c\x70\xc6\x9c\x07\x8b\x60\x31\xf4\xed\x35\x68\x33\x04\xe7\xc4\x33\x5e\x67\x40\x5c\x66\xa1\x8d\x44\x6e\xe2\x62\xcc\x8f\x32\x03\x11\x85\x55\x41\xd3\x90\xb1\xa6\x37\xea\x66\xb9\x44\x18\xd6\x3e\xe8\x34\xda\x4b\x83\x42\x33\xa0\xd1\x74\xc7\xea\x2a\x09\x8f\xbc\x98\xe2\x6a\x87\xed\x15\x4d\xd6\x0c\xf0\x7c\x36\x8e\x86\x5a\x0f\xc8\x0c\x8b\xd3\x03\x65\x39\x45\x23\x3b\xd3\x30\x24\xd8\x91\x4e\x6f\x60\xa3\x99\xac\x2e\xfd\x9e\xb6\xc6\x2a\x63\x6c\xcd\x69\xde\x23\x4b\x72\x8a\x0e\x37\xfc\x28\x36\xa7\x7b\x6b\xbc\xca\xc0\x59\x05\xac\x65\xae\xcf\xe1\x7d\x7b\xbe\x86\xc5\x83\x22\xc4\x9e\x9b\xda\xf6\x74\x75\x58\xa6\x92\xea\x37\x5b\xb0\xef\x52\x33\x66\x10\xa7\x70\xc6\x91\xda\x1a\x17\x05\x7c\x1d\xe4\x63\x77\xc4\x39\x6c\xee\xe0\x98\x0a\x0e\x56\x7b\xb2\x77\xc8\xd5\x80\x1d\xaf\xb7\x98\x57\x12\x12\x31\xd6\xc6\x0a\xc1\xae\xd5\x46\xa0\x93\xf1\x74\x19\x66\xfa\x20\x23\xf0\x05\xbb\x0d\x1c\x62\x6f\x45\x20\x68\x0c\x82\x45\xbe\x9f\x44\x5e\x05\x6d\x21\xb5\x76\x75\x90\x27\xe0\x99\xd0\x2c\x6b\x4c\x82\x46\x56\xd1\xf7\x13\x62\xbd\xd5\xd7\x63\x8b\x3c\xd0\xc2\xb4\x50\x59\xaa\xe8\x6b\xfd\x2d\xbc\x2b\xb3\x38\xf1\x96\x81\x17\x0b\x3b\x54\xd0\xe7\x32\x41\x6c\x25\x76\xe4\x81\x8d\x73\xc0\x19\x21\x5c\xd4\x59\x2a\xcc\x08\x25\x36\xa7\xda\xb8\x6f\x3a\x13\xdb\xca\x85\x3d\x41\xe5\x7d\xc2\xa0\x20\xd2\xa3\xab\x10\x83\x0a\x0c\xe4\xb6\xbe\x36\x69\xe4\x85\x0c\x69\x11\xb4\x81\x72\x27\xde\xe0\x80\xb1\x5a\x90\x3c\x48\xe2\x55\x66\x29\xf2\x62\x11\xcc\x26\x51\x69\x47\xee\x2a\xdb\xe0\x06\x5b\xcc\x47\xdc\x06\xd1\x00\xc2\x8f\x6a\x6a\x57\x6e\x89\x75\x32\x9a\xe5\x99\x6c\x46\x91\x67\xae\xe3\x0d\x19\xf4\x68\x06\x9c\x15\xc1\xcc\xf0\x38\x7f\xbb\xc8\x20\x2f\x60\x8d\x5e\xb9\x45\x9c\xc3\x62\xe5\xc7\xb5\xbf\x69\x78\xc6\x06\x41\x97\xc8\xbd\x40\xb6\x63\x08\x51\xcc\x1e\xbc\xdb\x04\xf5\x76\x33\x11\x6c\xd5\x64\x36\xa6\xa4\x16\xd5\xce\xe8\xc9\xd5\x6e\x3f\xef\xc7\xe3\xed\x7e\xee\x6d\x22\x07\x57\x07\xb8\x1e\xa9\x69\x95\xa9\x4b\x74\xc2\xca\x46\x06\xaf\xe4\x85\x3d\x37\x67\x7d\xd6\x44\x53\x12\xad\x27\x32\x80\x53\xf5\x61\x28\x1d\xbc\x83\x3b\x32\x35\xc9\x18\x1d\xe6\x66\xce\x1f\xca\x38\x5d\x6e\x09\x1f\x35\xf6\x8b\xd0\xce\x4b\xae\x8e\x62\x17\x1a\x49\x3d\x47\x73\x12\x4c\x98\xec\x76\x3d\xb9\xa0\x8b\x5d\x2d\x27\xc3\x29\xd1\x90\x95\x2d\xca\xe4\x10\xc6\x4a\x47\x89\xe6\x5a\x6f\x5f\x38\x62\xcd\x4c\xa2\x54\x11\x58\xef\x90\x5a\xa0\x8f\x87\x72\xc0\x90\x2e\xe7\x8f\x48\x56\xde\xcc\x53\xb1\x6f\xd1\x11\xad\xce\xfa\x07\x2d\x09\xf0\xc4\xc1\x1d\x15\xd3\xd4\x75\x35\x54\x94\x39\x3e\xd8\x58\x4a\xb5\xe5\xc4\xa9\x83\x6c\x21\x07\xc7\x10\xce\x72\x36\xc2\x70\xba\xdb\x50\xdb\x69\x68\x34\xd8\x5c\x0c\x8c\x6a\x70\x58\x81\x2b\x39\xd4\xe4\xa5\x69\x2d\xf6\x54\xbd\x3b\x48\x7a\xca\x48\x83\x1e\x03\xe5\x59\xe4\x0c\x74\x7d\x24\x70\x4b\x7d\xd0\x9f\x84\x1b\x9a\x85\x43\x71\xea\x54\x8b\x8a\x0b\xc9\xda\xcd\xc6\x32\x65\xc4\x1c\x9c\x6f\x7a\x22\x92\x2f\x7a\xa2\x9c\x4c\x7a\xa4\x1c\xeb\x16\x28\xc7\x88\x05\xca\x68\x63\x41\x32\x5a\x5b\x3e\x40\xd4\x96\x4b\x61\x33\xd7\xc8\x51\xda\xc6\x99\xa1\xc9\xcc\xaa\xca\x51\x0d\x7a\xd6\x1b\xfb\x38\xc5\xf6\x17\x3b\xbb\xde\x4d\x14\x2c\xaf\x27\x42\x24\x90\x50\x0d\xd7\xcd\x2c\xe3\x3d\x92\x82\xcc\x19\xb5\xde\x95\xd6\xb8\x61\x66\xe3\x71\x53\xcf\x04\x4a\x2a\x95\x04\x44\x50\x21\x1e\x8a\xbd\xc1\x98\x59\xcd\x9c\x31\xc2\x8f\x90\x12\x07\xa0\xa5\x34\x05\x96\xcb\xc1\xaa\x04\x41\x07\x24\x80\xc1\x61\xa7\xbb\xbd\x6a\x7e\x40\x15\x83\x15\x8b\x21\x6f\xf4\x29\x90\x02\xf2\xd1\xae\x59\x51\x58\x35\x3f\x00\xaa\xc1\x8a\x25\x24\xa7\x5c\xb5\xb2\xfd\xcc\x61\x11\x6c\x26\x30\xb3\x62\x3f\x82\x7b\xab\x71\xda\xa8\xd4\x16\xda\xcb\xd6\x04\x0c\x66\x10\x8c\x41\x08\x3c\xf3\x75\x75\x35\xc5\x27\xcf\xdf\x2f\x6c\x00\xa0\x69\x0a\x85\xd3\x0d\xd5\x97\x5d\x7d\x83\x45\xf1\xd4\x32\xc7\x45\x22\x04\xb0\x8e\x69\x13\xa3\xd0\x53\x49\xde\x6a\x61\xd1\x94\xe2\x4e\x5e\x12\x55\x69\xe8\xcd\x70\xb9\xa8\x23\x03\x3b\x80\xe3\x0d\xb2\x0c\x3c\xd4\x4d\x26\x73\x69\x48\xef\xd7\xf4\x56\x55\xdc\x14\x2d\xc0\xf1\x50\x5c\x62\x63\xd8\x1c\xf3\xf9\xb0\xef\xce\xe1\x3d\x3f\x19\x70\x3d\xda\x32\x44\x1e\x9b\x83\xcd\x84\x03\x14\x66\x17\x57\xba\x0c\x52\x40\x13\x21\x72\x10\xc2\xc4\x58\xaf\xec\x65\x0f\x1a\xcd\xca\x7d\x3a\x03\x30\xaa\xb7\x5e\x07\x1a\x3f\xcc\x97\xab\xde\x70\x6a\x72\xfc\x38\xa1\xcd\x62\xd1\x97\xf3\x25\x0b\x7a\x1e\x5f\xe4\xf4\xdc\x88\xc3\x29\x12\xd5\x91\xd5\x68\x2b\x9d\x26\x70\x7c\x5f\xa4\x3c\x3b\x0e\xe6\x6b\x69\xbe\x5d\x8e\x33\x6a\xee\x58\x48\x82\x83\x56\x0f\x19\xe5\x03\xcb\x5c\xcd\x66\x99\x8f\x9a\x36\xa4\xd9\x20\x67\xc3\x3e\x42\xf6\x57\xf9\x6c\x4f\x80\xb1\x0a\x1d\xfa\xfa\xaa\x37\x9c\x2d\x33\x62\x97\xce\x90\x1c\x27\x7a\x65\x5e\x5a\xbd\x1e\xe2\x6b\xb3\x84\xb0\x10\x0a\xf4\x4a\x8c\xd2\x89\xdd\x6e\x81\xef\xa2\x5d\x51\xf4\xc8\x5e\x83\xb1\xbb\xbc\x42\x45\x84\x37\xc1\x78\x3a\x1c\x12\xa1\x49\xf1\x29\xc9\xdb\x21\x8a\x43\x3b\xa7\x42\x07\x99\x50\x56\x10\x3a\x8d\x32\x7d\x47\x35\x73\x2c\x6e\xca\x72\x36\x19\x33\x78\x8f\x34\x42\x93\xac\x17\x33\xa4\xa2\xa9\x3e\xc3\xc2\x25\xb0\xc0\x4d\xa1\x67\x2b\x48\x59\x7b\x02\x29\x28\x93\xe5\x98\x3d\xf8\xc6\x42\x30\x0f\x4b\x26\x9a\x1a\x7e\x5d\xae\xb4\xc1\x7c\x13\x46\x63\x60\x3d\x8e\x82\x68\x3b\x4c\xfd\x52\xc4\xe9\x22\x58\x8f\xf2\x68\x9f\x49\x39\x88\x94\xc8\x00\x8b\x57\x1c\xa1\xab\xea\x1e\x2f\x72\x6c\x54\xfb\x96\x39\xcc\x33\x62\x67\x0e\x93\x4c\x8f\xf5\x35\x24\x09\x8e\x5d\x6f\x67\xbe\x8f\x6d\xa5\x3d\x7d\x70\x97\x0e\x61\xf1\xe0\x10\x44\xbc\x3e\x29\xcf\xed\xa6\x08\x58\xaa\x08\x79\xb0\xe4\xed\x48\xdf\x0d\xd7\xf1\x52\x12\x0e\xf5\x50\x64\x87\x28\xac\xc4\x53\xd7\x9e\x2c\x49\x30\x6b\xea\x92\x27\x16\x1b\x56\x07\xad\x70\xb8\x76\xaa\x30\x11\x38\xa9\x10\xd7\xb4\x9d\xf5\x7b\x8b\x68\x47\x69\xb0\x4f\x25\x45\x7f\xb0\x15\x36\x0b\x7b\x03\x65\x03\x90\xf0\x52\x79\xb3\x99\x6e\x27\xcc\x66\x3c\x6b\x76\x1a\x39\x55\x56\xc0\xc8\x42\x92\x3c\x48\xe1\xc3\xb2\x54\x05\xd2\x02\x78\x70\x09\x1c\xf4\x46\x40\x42\x0e\x96\xf2\x4c\x2f\x1d\x53\x43\x30\x38\xab\x88\xc6\x34\x12\x9b\x82\x1c\xbb\xf4\x8a\x66\x88\xa0\x1a\x45\x49\xb3\x4a\x07\xc0\xfc\xf8\x3f\x01\x80\x39\x39\x5c\x8a\xfa\x96\xf7\xd6\x0b\xd2\xb1\xfd\xf9\x92\x5d\x2f\x30\xc8\x9b\x14\x3a\x02\x99\x9b\x6d\x81\x55\x70\x86\x47\xa2\x32\xd5\x84\x81\x37\x9d\xee\xfa\x83\xbe\xaf\x66\x8b\x45\xe9\x6c\xfb\xa1\x06\x32\x3c\x53\xc7\x29\x17\x26\x7b\x15\x5d\x53\xb5\x3b\x3c\xd4\x1a\xe2\xf2\x70\xb0\x9d\xd1\xbe\x3c\x17\x19\x42\x9c\x26\xf5\x60\x80\x6f\xe6\x96\x5a\x0d\x55\x9e\x45\xad\xc8\x09\x20\x58\x40\x8d\x26\x9a\x63\x36\xb7\x5a\xee\xd7\xcc\x5c\x18\xf1\x6b\x7f\x01\x79\x0d\x19\xc4\xda\xd4\xae\xe3\xca\xd4\xa8\x9e\xce\x8e\x6b\x75\x50\x26\x51\x8c\x59\xbd\x39\x15\x67\xc4\xd4\xd7\x2a\x6b\xab\x82\x78\xa1\x61\x92\x64\x9b\x07\xd8\xd8\xa5\xab\x2c\x35\xb6\x32\x94\xee\x79\x5f\x1f\xa6\x32\xbc\xdd\x1a\xba\xbd\xe1\xac\x69\x20\x51\x3d\x6c\x24\x8f\xa6\x30\xa0\xa2\xb6\x9e\x6c\x0f\x02\x1e\x6e\x07\xb1\x0d\x8e\xf6\xb5\xe4\xf5\x46\x29\x00\xca\xbd\x40\xae\x46\xa2\xb8\x1e\x27\xb5\xca\xf3\x96\x37\x04\x6d\x69\x63\xf0\x23\x57\xa0\xb4\xad\xa2\x35\x2b\xd4\xdd\xfa\x73\x64\x3f\x58\x45\xa4\xa8\xad\x16\xb1\xb7\xed\x8f\x97\x5b\x05\x65\x43\x62\x54\x33\xd3\xe9\xbe\x37\xe0\x90\xf1\x2c\x72\x28\x3a\x00\x12\xd5\x64\x07\x8b\x00\xb0\x9d\x80\xed\xa9\xd8\xa8\xa2\xa2\x28\x3f\x78\xcc\x81\x9f\x07\x91\x3a\xd8\x02\xa6\xb6\x65\xe8\x81\xb7\x5e\x0c\x1c\x12\xe6\xd6\x63\x61\x07\xaa\xd8\x48\x32\xe6\xba\xb2\xe7\xe8\xd4\xc4\xb6\x1b\x08\x0a\xf2\xb9\xb7\xc9\x46\xd1\x61\x3e\x08\xca\x01\x94\xfb\x68\x5f\xd5\x69\x4d\x83\x8d\xa2\x19\x2e\xad\x03\xb4\x1e\x33\x38\x87\x6c\xe0\xf0\x30\x1d\x49\x11\x6c\xd7\xbd\xd2\x06\xec\x0d\x2d\x0e\xe6\x8a\x37\x27\xfa\x56\xbd\x00\xf6\x43\x69\x4f\xa4\x55\x08\xd5\xf8\x28\x9f\x6c\x79\xd2\x5c\xd0\xe3\x81\xa3\x04\x7a\x6f\x9c\x9b\x1c\x5f\xcc\x5d\x6b\xc7\x12\xec\x16\x51\xb9\x18\x9b\x8e\x82\xd8\x8f\x91\x74\x8d\xbb\x2b\x12\xf5\x45\x54\x1c\x84\xab\x15\x4d\x4d\x6a\x9c\x5d\x4c\x14\x4f\xd8\x46\xca\x01\x59\xb1\xca\x8a\xc6\x22\x50\x98\x81\x63\x2a\xb3\xdc\x24\x95\x6d\xbf\x9e\xf9\xa2\xc2\x50\xdc\xcc\x9d\xc9\xc5\x41\x58\x00\x10\x24\x6d\x71\x19\x44\x07\x93\xe9\x70\x32\xf3\x85\xc4\x9b\x05\x68\x5f\x8c\x34\x51\x8b\x8b\x6a\xec\x8e\x12\x4d\xf0\x7c\x01\x0f\x39\x83\x95\x9a\x62\xc8\xf2\xe1\x78\x2d\xe1\xe9\x41\x32\x59\x40\x45\x63\x84\x91\x48\x4c\x84\xf6\xd1\x2e\x52\x76\x45\xd3\x8f\x4a\x30\x11\x24\x66\xca\xcf\xa6\x49\xe5\x7b\xda\x86\x1a\x35\xc5\x0c\x9b\x12\x35\xc4\xca\x1c\x8b\xf1\x2e\x29\xd5\x06\x96\x25\xc2\xfa\xa0\x2d\xca\x61\x8a\x9b\x43\x33\x07\xd6\x0b\x3b\xdd\xf9\xa0\xbd\x4b\x80\x3c\x0a\xe3\x70\xd5\xab\x90\xc9\x78\x5e\xc0\xbe\x33\x2d\xbc\xc9\x4e\x58\x0d\x04\x12\xc1\xd6\x2a\x80\xae\xca\x21\x0d\xd9\xbc\xab\x91\xbb\x9a\x0a\x5c\x69\x83\x3b\x2e\x07\x13\xc5\x76\x07\x22\x26\x99\x2b\x10\x80\xcf\x71\x7a\xe3\xd1\x3c\xce\xcc\x7c\xb6\xe7\xad\xab\x78\x1a\xa5\x16\xad\xb8\x5e\xd2\x3f\x8c\xa2\x25\xc9\x8d\xc6\x2e\x4b\x89\x14\xd6\x63\xc4\x72\x9d\x0b\xaa\x8c\xec\x58\xc2\x9b\x56\xfc\xb6\x60\x04\x68\xe3\x10\x70\x8d\x05\x4b\x1a\x3d\x00\xbe\x03\xc4\xd4\x00\xc9\xe2\x7d\xd2\xa3\xa9\x40\xe0\xb7\x3d\x7d\x8d\xf1\x7d\x69\x56\x99\x1e\xee\x82\x90\x16\xd1\x4e\x23\x25\x2a\x44\x97\x91\x12\xcd\x9a\x68\x42\x44\x7e\xc6\x9b\x05\xaa\xd6\x08\x84\x52\x65\x31\xe5\xf9\x02\x80\x89\x12\x21\x36\x83\x03\xca\x2a\xfd\xb1\x83\x35\x81\x91\x00\xfa\x6a\xbe\x22\x23\x81\xd0\xb2\xc1\x64\xa0\x14\xca\x1a\x23\x60\x3e\xb6\x8f\x44\x08\x35\x90\x69\xed\xf8\x22\x97\x7a\xbc\xed\x84\x28\x0f\xd9\xf3\x54\x12\x86\x93\x92\xe4\x46\xb3\x11\x6f\xc2\xf5\x22\x31\xa5\x3d\x68\xa2\x43\x4a\xf1\xf4\x78\x35\xd8\x0a\xd3\xc5\x70\x2f\x6e\x78\x53\xdd\x1f\x16\xa3\xa1\x36\x05\x15\x82\x43\xb7\xcd\xbc\x9a\xa9\xe6\x48\xaa\xcc\x58\x93\xc0\x5e\xcd\x42\xba\xb6\x93\x23\x87\x89\x98\xfd\xdc\x76\x76\x61\x2f\xe2\x2a\x65\x40\x6e\x89\xc9\x06\xd7\x76\x7c\xb5\x14\x04\x75\x32\xa1\x47\xb9\xdb\x14\x15\x88\x6f\xb6\x7d\x1e\x24\x87\x3d\x95\x40\xdc\xd9\xc1\xdc\x21\x1b\x12\xe6\x90\x95\xe5\xc5\xea\x21\x35\x74\x51\x23\xf7\x06\x28\xd3\xbe\xea\x01\x2b\x92\xd3\xf2\x3a\x9f\x64\x60\x1d\x89\xd5\xb8\x01\x8b\x2c\x19\x4f\xc2\xd5\x4a\xcb\x40\x72\x73\xd0\x58\x73\xc1\x45\x42\xaf\x8a\x51\xc4\x6b\x56\x85\x28\x4c\x95\x0a\x2f\xcd\x90\xd6\x9b\x49\xaa\x41\x7b\x4d\x23\xeb\xcd\x8c\xb3\x97\x1a\x7a\x20\xb7\x0b\x3a\x1b\x7a\x52\x09\x4d\x5d\x49\x1e\x06\xbb\x95\x2c\x4d\x76\x26\x96\x41\xbb\x5c\x43\x71\xf5\x90\x66\xbc\x10\xca\x0b\x8d\x85\xc8\x90\xe5\x1c\x2f\xe4\xbd\xd5\x26\xb4\xbd\x83\x9b\x65\xbd\xc8\x4b\xe7\x70\x2f\x64\xd0\x12\x07\xf9\xe1\x72\x15\x4c\x04\x8f\x1e\xd3\x6c\x1d\x4f\x35\x58\x61\x02\x94\x6d\x14\x1a\xcd\x69\x22\x5a\xc5\x94\xed\x18\x86\x3e\x18\x23\x1b\xd2\x5c\xb8\xc4\xde\x5e\x88\xeb\x43\xa8\x8d\xa6\xb2\xdd\x0c\x00\x44\x9e\xe1\xfa\x74\x86\x49\x3d\x27\x33\x75\x64\x92\x4b\x7c\x2c\x12\xeb\x55\x70\xe8\xfb\x7d\x5c\x1b\x31\x43\x6d\x4b\x8b\x7c\xb5\xf5\x76\x30\x4d\xa2\x48\x2a\xc4\xb0\x3d\x18\xed\x73\x41\xe2\x0c\xc9\xde\xba\x28\xc5\xb2\xc3\x2d\xd2\x2b\x82\x7d\x1d\x28\xc4\xc6\x8d\xf0\xc9\x14\xa1\xc5\xfd\x64\x38\xce\x07\x92\x1f\x0d\x21\x7e\xb1\xe7\x96\xb1\x36\xe1\x89\x30\x1a\x44\x93\xe5\x58\x81\xa0\x6c\x46\x8a\x8e\xd2\x90\x3c\x59\x17\x49\xee\xf7\x6d\x7a\x64\x0f\x60\x21\x4a\xe6\x8b\x7c\x11\x2a\xbd\x01\x7d\xc0\xb7\x7b\xd6\x58\x6b\xdb\x78\xbf\x1c\x8e\x49\x2a\x29\xa0\x05\xc0\xf3\x87\x35\xe5\xca\x3e\x9b\x25\xe8\xb4\x8f\x89\x8c\x7c\xa8\xa5\xe5\x26\x5e\x47\x0c\xbe\x24\x18\xd2\x9d\x21\x48\xa5\x8a\x76\xa4\xd1\x7a\xe3\x71\xbc\xbf\x84\x87\x19\xe5\xc5\xae\xe4\x0c\xdd\xac\x6e\x46\x72\xd5\x1f\x28\xf0\x5c\xd8\x3b\x2a\xba\xc7\x0f\x65\xba\x77\x0f\xe2\xa0\x97\x38\x82\x9a\x4a\xb6\x80\xfb\xeb\x86\xcf\x74\x6d\xc1\xd2\x4e\x45\xa3\x88\x31\x1b\xa4\x18\xa1\x15\x29\x88\x4e\x07\xc9\xde\x6e\x98\xd5\x54\x75\x66\x11\x19\xfb\x4d\xb8\x96\x7a\x30\xa5\xc2\x72\x40\xa4\x10\x41\x40\x98\x5a\x6c\xcd\x12\xa3\x76\x6a\x61\x46\xc8\x2e\xc6\xad\x48\xcd\x88\x29\xa9\x3a\x6b\x1a\x29\x75\xb4\x4f\x42\x07\x0e\xd9\xd2\x1b\xfe\x30\xe7\xc8\x45\xb8\x2c\x76\x73\x16\xa8\xab\x79\x4a\xd7\xa0\xdd\xf4\x95\x21\x81\x4d\x11\x68\x80\x2b\x6c\x16\x32\xb0\xaa\xad\xf6\xd0\x54\xa0\xb6\x3d\x66\x65\x05\xee\xec\x40\xac\x27\xb4\x26\xa9\x3a\x6d\x56\xb4\xda\x5f\xb8\x0e\xca\xe9\xc5\xae\x9f\x65\x9e\xb2\x1b\x71\xc6\x6c\xdf\xe7\x52\x74\x1f\xcd\x36\x2b\xc0\xdf\xc8\x4d\x65\x4c\xf8\x31\xda\xaf\x80\x10\xac\xc6\x11\x28\x15\x50\x5c\x84\xa3\x68\xc2\xa7\x94\x31\xb5\x5c\x44\xda\x89\x39\xc0\x8c\xf6\x5a\x94\xcb\xc0\x58\x4e\x92\x04\xa7\x31\x9b\xa8\x6d\x62\xad\xec\x89\x12\x92\xfa\x03\xd2\x0d\x39\x7a\x84\x69\xe1\xa0\x27\x16\xd9\x66\x6a\x36\xb2\x88\xcd\xa7\x7d\xd7\x95\x69\xd1\xef\x2f\xe7\x55\xd6\x37\xe2\x68\x27\xb1\x05\x1d\x4f\x68\xc5\x1f\x99\x93\x60\xac\x99\xbb\x51\x33\xd8\x4b\x51\x44\x01\x3b\x6a\x36\xed\xf5\x7d\x5c\x33\x04\x2a\x1a\x6f\xb9\x4c\x49\x30\x38\xe7\xe4\x50\x9a\xee\x70\x65\xad\x87\x15\x5d\xd6\xf2\xca\xdf\x7a\xe5\x7e\x86\xd5\xc3\x1d\x0a\x4a\x87\xa9\xa3\x0f\xa9\xc6\x98\x2e\x1a\x76\xb4\xb2\x66\x3c\xd5\x5b\xce\x72\x1a\x86\xcd\x35\x06\xcb\xd4\x28\xc1\xe1\xa4\x58\x6d\x65\x6a\xb6\x26\x70\x84\x05\x4c\xa4\x57\x4e\x7b\x66\x3f\x01\xc7\x3b\x4e\x26\xf2\x38\x08\x44\x00\x56\x6d\x2b\xe4\x06\x38\x8b\xf6\xc1\x21\xd9\xa7\x06\xaa\x3b\xdf\x84\x20\xa8\xac\x79\x86\x4d\xd0\x0d\xa5\xd0\x2b\x1c\x0f\x58\x5a\x58\x4c\x83\xa1\x1a\xd7\x31\x35\x8c\x25\x47\x90\xfa\x98\x3a\x2e\x02\x1c\x18\xa1\xde\x8a\xce\x37\x4a\xb9\xf5\x19\x94\x2a\xfc\xa6\x2e\xab\x66\xe6\x05\x01\x9a\x2e\x9b\x9a\xca\xaa\x03\x25\x14\x0a\xca\xdb\xa8\x5a\xfa\x22\x31\xc6\xa8\x39\x67\xf0\x93\xfe\x8c\x86\xd6\x04\xc2\xd2\x56\x2d\xee\xa7\xda\x88\xe1\x58\x74\x8c\x24\x1c\x47\x2b\x7e\x76\x48\x46\x84\x80\xd1\xda\x9a\x87\x77\x0a\x0d\xaf\x69\xd6\xef\xcd\xc0\x64\x63\x8f\x35\x3a\xd8\x51\xbd\x0d\xbe\xc4\x2c\x6d\x4d\xcd\x5c\x6e\xb4\xea\xcf\xc3\x05\x94\x49\x3d\x61\xb6\x9c\x23\x8d\x2d\x4f\xcd\x83\x0a\x60\x6c\x8a\xfb\x14\xa7\x90\x41\x05\xcf\x16\x87\x21\x1d\x6f\xd1\xad\x5c\x04\x58\xb9\x5c\x00\x02\x85\x1f\x40\x11\x72\xc1\xca\x4d\x29\x63\xa4\x16\xe0\x54\x22\xea\x2d\xea\x08\x31\xca\xee\x63\x77\x3b\x07\x55\xb0\xe2\x04\x70\xeb\xe3\x8d\xe3\x24\x5e\x20\x18\xc3\x7d\x7e\xf0\x12\x47\x73\xc3\xbd\xa6\xf9\x63\x72\x31\x0d\x4c\x02\x98\xb3\xd4\x58\x5c\x08\xdb\xc5\x24\x10\x98\xd5\x24\xe2\x0f\xb4\xef\x67\xb9\xbb\x23\x33\xdc\xd1\x63\x7f\xa9\xd7\x16\x8a\xc1\xa6\x8a\xc4\x33\x19\x0a\x49\x69\xa5\x4c\x61\x95\x8a\x91\x29\x06\xa8\xd1\xfe\x80\xa4\x14\x8b\xf1\xca\x62\xd2\x00\xd9\x24\x38\x20\x35\xd3\x13\xf9\x69\x35\x45\x7a\x19\x4e\xfa\xc4\x06\x20\xc2\x6a\x4c\x6c\x51\x2d\xd2\x31\xb8\x49\xf4\x22\x10\xed\x49\x85\xcd\xf2\x0a\x44\xd2\x0d\xb1\x55\xd4\x86\x81\x1b\xb6\x9a\x7a\x89\xbc\xaf\x18\x4e\x11\x54\x69\xc3\xf6\xdc\x51\x54\x0c\xf2\xb8\xd4\x06\x86\x31\xa1\x29\x02\x74\x51\x42\x14\xbc\x28\xe1\xed\x5d\x80\xaf\xca\xc1\x68\x9a\x16\x41\xb2\x45\xc0\x19\xe4\x2d\x56\x74\xac\xe8\x8c\x30\x6f\x76\x94\x92\x51\x92\x0b\x32\xfa\xae\xec\x0f\xab\x21\x83\x2e\x12\x9c\xa6\xc7\x5c\x06\x8f\x0c\xa1\x1e\xbb\x86\xe0\x82\x0b\x29\x59\xa5\x2b\xd9\x0d\x43\x45\xe5\x5c\x76\xa0\x6e\xa7\x6b\x0b\x9e\xc3\xfb\xc5\x7c\x6c\xd3\xfb\xca\x1f\x86\xa3\x35\xe0\x13\x5b\x16\x55\x54\x20\x1a\x61\x2b\xb8\x29\x55\x64\x80\x18\x06\x3e\x8d\x29\x68\x47\xc8\x48\x53\xaa\x06\x68\x1a\x20\x1b\xf7\xc4\x05\xcb\x10\x9e\xd0\x63\xb7\x91\x12\xac\xf3\xe9\xe2\x30\xc6\x40\x25\xb0\x26\xfb\xed\xba\x07\x13\xb2\x4d\x24\xbb\x49\xb2\x57\x77\x99\x1a\xac\xf5\x5c\x0f\x61\xa9\xa7\x46\x5b\x80\xc9\x91\xfc\x60\x07\x14\xaf\xc0\x53\x7e\x82\x31\xa9\x20\x09\x43\xb9\x41\xe7\x78\xa9\x7a\xc4\x14\x9c\x32\xb6\xd0\xcb\x25\x19\x83\x20\xb9\x0f\x2e\x4a\x50\x19\x90\x73\x78\x12\x6f\xfb\xc3\x60\xb2\x89\xe9\xf5\x54\x72\xca\xba\x09\x38\x0f\x5f\x0e\xad\x12\x97\x06\xf2\x8a\xa7\xb5\x9e\x1d\xe9\xd4\x60\x16\x61\x73\x70\x19\xf5\xcd\x90\xc7\xdd\x4a\x60\xfa\xa8\x3c\x9c\x96\x33\x12\x19\x6b\x2b\x02\x9e\xa0\x99\x30\x35\x6d\xba\x1c\xd0\xe5\xc4\xaf\x93\xa9\x9c\xad\x59\x7c\x0e\x52\x56\xed\x0c\xb1\x01\x78\x08\x51\xc9\x64\xec\xac\x7f\x58\x64\x14\x3f\xdf\x48\x87\xf5\x5e\x9f\x6e\xbc\x54\x80\x92\x7c\x9b\xe7\x84\xb1\x19\x0e\x18\x93\xec\xfb\x9b\x78\x6f\x4f\x50\x67\xeb\x57\xbe\xeb\x53\x33\x3f\x1b\xce\x0f\x73\x6d\xb1\x92\x68\x68\xc3\x8e\xd8\xdc\x1d\x8d\xa4\x9e\xb1\x40\xa0\xc0\x4b\xcc\xc9\x64\xbb\xe4\xa7\xfb\x88\x1e\x11\x3b\x32\xd0\x80\x41\xaa\x58\xf5\xb6\x1a\xb8\xe8\xe8\x20\x2c\x01\x87\xae\x64\x91\x47\x0d\xbb\x37\x24\x45\xbf\xae\x25\x34\xdb\x66\xeb\x65\x48\xcb\x26\x34\xe8\x65\x02\x3e\x9c\x6d\x73\x89\x2a\xea\x52\xc9\x6c\x1f\xc7\x69\x15\x18\xca\x6a\x20\x93\x20\x09\x44\x5b\x9b\x20\x58\xc9\x1e\x59\x32\x2a\x57\x8c\x6e\x99\xf3\x18\x0a\x44\x23\x81\x15\x0b\x66\x51\x23\xdc\x6c\x94\x59\xc1\xc5\x93\x80\x19\x4d\x57\x44\xc0\x96\x4b\x60\x56\x36\xc8\x3a\xd9\x53\x80\xb7\x01\xd4\x9a\x08\x79\x76\x3a\xa9\xc7\xe9\xf4\x60\x70\x06\xbc\x74\xa7\x5a\x0f\xd1\x44\xb9\xda\x62\x51\x3d\x3d\x44\xa0\xa6\x46\x15\x44\x1e\xf6\x26\x48\x20\xb0\x05\x54\x79\x25\x90\x7b\x8c\x95\x54\xd1\x5a\x57\xdc\x32\x9c\xd4\xa3\x95\x64\x34\x83\x1a\x5f\x8e\xd5\x79\x1d\xf6\x86\x61\x06\xae\x32\x58\x39\xf4\xe4\x43\xa1\x37\xbd\x71\x40\xcd\x17\xb5\xe5\x1d\x32\x08\x4a\x33\x4c\x2c\xb6\x02\x06\x80\x0d\x81\xec\x97\x65\x72\xf0\x09\xa2\x02\xca\x29\x55\xf4\x42\x36\x2d\x74\x8b\xac\xf7\xbd\x3e\xb5\x75\xcb\x8c\x1c\xa8\x70\x2f\x99\xd4\x58\x22\xe6\x22\x19\x09\x4d\xd2\xd4\xb3\xf5\x36\x94\x36\x50\xa4\x4e\x21\x58\x77\x2c\x6c\x88\x6c\x77\xfd\xcd\x6e\xd2\x5b\xa5\x34\xad\xf1\x8b\x39\xb0\x30\x1c\x74\x13\x53\x23\xd0\x54\x38\xf3\x20\xf4\x08\x48\xad\x74\x08\x56\x26\xc6\x94\x9b\x83\x2c\x8d\x08\xf4\x02\x09\x0e\x69\x7c\x00\xfb\x08\x56\x81\xae\x6b\x66\x0c\x4b\xf1\x49\xd1\x5f\x29\x31\x3e\x8e\xa4\x8d\x03\xe4\x31\xcc\x18\x1a\xc1\xb8\x7c\x8a\x98\x2b\x1f\x59\x4b\xce\x52\xc1\xe7\xb0\x61\x17\x5b\x2f\xd2\xb7\xf4\x7e\x09\xad\x47\x11\x23\x14\xc4\x88\x9a\x60\x84\xdc\x2c\xa7\xe6\x2e\xa0\x3c\x64\x69\xc8\x95\xa8\xa5\xac\xbf\x65\x6b\x3a\xa8\x6d\xce\xa1\x9d\x11\x3b\x63\x46\x71\xbf\xf4\x07\x74\x3d\xc9\x27\xf9\x28\xe2\xe6\x93\xbe\x30\x0d\x32\xb3\xd9\x1f\x56\xea\x41\x35\x70\x50\x0f\x03\xae\x0e\xcc\x98\x93\xf7\x39\x2f\x36\xfb\xe9\x8c\x5f\x47\x86\x0d\x10\xca\x66\xd3\xc3\xd0\xcc\x1b\x2c\x30\x69\x95\x6d\xbd\xa8\x0c\x71\x78\xb4\x22\x0c\x84\x9f\x92\xa5\x2c\xcf\x95\x10\x2d\x3d\x74\xb5\xc7\xa9\x78\xe0\x61\x80\x5a\x00\xcd\x30\xb0\x21\x84\x30\x32\xbb\x09\x52\x0d\xa1\x58\x1b\xe1\x44\x87\xb0\x22\xb4\xf1\x17\x33\xbc\xd8\xef\x06\x35\x8e\x01\xfd\x5c\xe6\xcb\x26\x03\xb3\x45\xc0\xe9\xcc\x80\xc5\xb8\x91\x3a\x03\x46\x65\xe2\x21\x1b\xaa\xc4\x57\x3d\x9c\x9b\xf3\x9e\x6b\x02\xea\x8e\x3c\x94\x51\x50\x9a\x3d\x35\xe5\x39\x14\x50\x90\x72\xa2\x90\x9a\x97\x4f\xb0\x46\x9c\xec\x75\x85\x31\x0b\x45\x22\x67\x2a\x84\xce\x32\x72\x39\x1b\x57\xdc\x60\xe4\xd0\x62\x25\x28\xfd\xbe\x93\xd0\x9a\x3f\x65\xb6\xa9\x32\x5c\xcc\x77\xeb\x7d\x09\x61\x76\x72\x80\xe7\x9b\x62\xbe\xf7\xa7\x22\x25\xc2\x7b\x7a\xe1\xe3\x35\x48\x58\x34\xbd\xcb\xa7\x76\x05\xd8\xb6\x4d\x92\x14\x26\x35\x7b\x68\x5c\xa2\x3b\x7e\xce\x39\x13\xd4\xae\x77\x24\x87\x42\x56\x3f\xc9\xb7\x42\x91\x2d\x60\x74\x56\x55\x4e\x85\xc7\x83\x62\xb9\x33\xdd\x68\xba\x89\xd8\x39\xb9\xd9\x6d\xeb\x69\x60\x10\xe1\x7e\x82\x8e\xc3\x52\x8f\xe6\xc8\x66\xe7\xb3\x01\xb9\xde\x68\x26\xdd\x2c\x64\x6f\x47\xcf\x18\x67\x5f\xec\xe9\x26\x9c\x22\xe3\x94\x14\x7a\xc8\x30\x35\x3d\x7c\xb1\x9b\xd8\x48\xb2\x50\x88\x64\x0c\xb8\x6b\xd1\x8e\x2d\xc9\x9c\xd9\xb9\x88\x48\x94\x8d\x70\x88\x50\x88\x39\xb7\xe4\x23\x73\x3b\x21\xd4\x00\x73\x27\x28\x94\x62\xe0\xbe\x00\x64\x70\x3f\xdb\xf1\x0b\x68\x07\x86\x64\xc2\xe3\xfc\x01\xaf\x24\x3a\x21\xd6\xf1\x28\xd6\x52\xd9\x50\x0e\x9e\x37\xdf\x8d\xd3\x1c\xd6\x79\xc6\xad\x14\x49\xdb\x30\xb3\x8a\xc1\x9d\xc9\x92\x90\x7a\x40\xd4\x24\xa1\x35\xcb\xca\xb9\x31\x45\x26\x19\x6a\x8c\x95\x80\x4d\x63\x5f\x42\x88\x49\x2d\xce\x73\x94\x08\x26\xf3\x84\xdb\x8a\x95\x18\x4e\x27\x61\x60\x55\x54\xb8\x3d\x48\x92\xa7\x45\xc8\xca\xc7\x7b\xfa\x21\x5d\xf0\x1c\x94\x38\xc8\xd4\x35\xf8\x82\xc5\x37\x26\xac\xa6\xeb\x75\x25\xce\x45\xc3\xd9\x88\xa3\xfd\x4c\x52\xd2\xa5\x4e\x08\x2c\x87\xe7\x45\xbd\x0f\x1c\xb5\x0e\xfc\x21\xb0\x74\x59\x3b\x22\x46\xb6\x52\x4c\x28\x08\x39\x90\x18\x30\x43\x1a\xa5\x67\xe7\x25\x09\x58\x2b\x83\x48\xc9\x9e\x3d\x73\x9a\xa2\x29\x38\x84\x90\x52\x08\x44\x06\x7b\x92\xac\x7b\x2b\x72\x44\x92\x1b\x67\xe6\x4d\xc7\x5e\xcd\x6d\xc6\xd0\xc8\x5c\xa6\xa2\x10\xef\x0b\x72\xcb\xe4\xe1\x26\x56\x17\x54\xe4\x31\x5a\xb8\x0d\x80\x21\x37\x97\x11\xdb\xc1\xf1\x15\x82\xae\xb2\x60\x00\xa0\x8b\xc2\xda\x43\x65\x7f\x01\xf9\xb2\x64\xba\x36\xbf\x12\x27\x28\x23\x29\x3e\x63\xca\xcd\x18\x37\xbd\x78\x1f\xc7\x8c\x5c\x7b\x73\x47\x21\x44\x8b\x41\x75\xd8\x28\xb9\xd9\x52\x36\xc1\x78\x06\x44\x73\x04\xdf\xc8\x1b\xd1\x0a\x30\xa4\x8a\x02\x6c\x3d\x4c\x32\x46\x03\x27\x86\xbd\x65\xb5\xc9\x42\xf4\x4c\x73\xcf\xb2\x62\xa1\x3a\x22\xb1\xef\xeb\xe3\x6d\xbf\x8e\x39\x9c\x5e\x30\xe9\xe1\x10\x5a\xc6\x42\x72\x27\x65\x92\x49\x13\x0b\x60\xf9\x6c\x22\x07\xbb\x62\x38\x34\xe3\xc1\xc0\x24\x69\x46\xce\xc9\x80\x87\x07\xf8\x42\x92\x10\x92\xe3\x93\xb2\x27\x62\xbd\xf9\x4e\x67\x03\x1e\xea\xcf\x60\x8b\xc4\xbd\x0a\xc3\x33\x65\x25\x4c\xbd\x15\x34\x94\x03\x70\xc8\x27\x65\x11\xd8\x7b\x7f\x9c\x33\xe1\x36\x9c\xa2\x5b\xd9\x0f\xd0\x11\x64\x8d\xc0\xbd\x10\xa3\x51\x96\x4c\xad\x61\x51\x84\x48\x32\x32\xab\xfd\x0e\xcd\x7a\x0d\x7f\xc8\x36\x45\x4a\x6f\x27\x26\xa6\xf2\xe2\x62\x30\xc2\x46\x6b\x6d\x49\xed\x47\x20\x9b\x15\x86\xaa\xf5\xf3\xf9\x84\x9b\x84\x8c\x21\xc5\x89\x77\x58\x8d\xe6\xf8\xfc\x60\x44\xf4\x64\xcf\x8c\x43\x88\x1c\x20\x4a\x06\xaa\x1b\x87\x1b\xe9\x22\xbf\x6a\x54\x36\x92\x73\xbd\x2a\x41\x86\xd5\xaa\x66\x8d\x18\x07\x3e\x83\x86\x66\xaa\x7b\x36\xb6\xf0\x6c\xd5\x04\x2b\xb7\x21\x94\xb1\x93\xc2\x03\x54\xaf\x87\xfb\x81\xec\x17\x8a\x29\xce\x44\x92\xd4\x47\x51\x30\x4d\xeb\xe5\x64\x02\xe2\x4b\xda\xaf\x34\xa7\xbf\x60\xcc\x1e\xb8\x20\x71\xad\x01\xc7\x3e\x26\x2d\x89\x1e\xc1\xe5\x4a\x1a\xcd\x97\x66\xaf\x89\x12\x40\xde\xf9\x10\x9b\x89\x76\x09\x56\x93\x78\x58\xe7\x9b\x79\xa4\x2a\x45\x18\x37\x2c\xee\xb3\x5c\xb4\xd8\x24\x4c\x2c\x94\x30\x8d\xa1\x3e\xb3\x1e\xfb\x72\xca\x4e\xd6\x1c\x01\xcd\xf1\x0a\x48\xb4\xa1\x9d\x8e\x7b\x13\x04\x1e\x99\x92\x3f\x34\x83\x8a\x13\xd9\x3d\xe5\x38\xcc\x4c\x99\xc0\x82\x09\xc5\xa1\x47\x4d\x52\x70\x1a\xc0\xdb\x81\x0d\xf0\xb8\x3b\x1f\x65\x19\x05\x6c\x32\x9b\x5a\xa2\xfa\xc4\xd4\xc6\xfa\x08\x5f\xf8\x1b\x36\x77\x37\x74\x33\x21\xb3\x64\x37\x73\xd0\xdd\x20\x1f\xee\x2c\x45\x10\xab\xc8\x1b\xec\x41\x6a\x0e\xf8\x79\xdd\xe3\x6d\x60\xd6\xab\xf7\xa1\x15\x65\x25\x50\xd2\x8e\x5e\x22\x3b\x8a\x24\x45\x99\x6f\x0a\xe1\x80\xf6\xb3\x0c\xb3\xa6\xc0\x12\x0c\x8d\x99\xe9\xe3\x94\x8e\x4c\x0e\xe5\x46\x3c\x20\xbb\x11\x36\xe7\x79\x58\x98\x36\x12\xc3\x57\xfc\x84\x93\x14\x46\xa5\xf7\x2e\x1e\xea\xaa\x04\x2f\x06\x50\x96\x49\x54\x96\xa9\x51\x81\xc9\x73\x07\xc4\xc7\xce\x0a\x81\x66\xce\x4c\xd6\xca\x43\xa2\x0d\x97\x9b\x8a\x32\xb8\xcd\xac\xc1\xd6\x03\x00\xb4\xd9\xa1\x2d\x46\xab\xec\x00\xac\x44\x1c\xe2\x0d\x7c\xc0\x8f\xa4\xaa\x26\x1b\x07\x1d\x37\xa0\x3d\x60\x45\x9d\x63\x36\x58\x36\x17\x29\x2d\x4f\xbd\x39\x21\xce\xa6\x1a\x83\x0d\xfa\xbc\x4b\xd9\x52\x02\x4f\xec\x3c\x87\x8a\x01\x15\x0e\xb2\x75\x7f\x2e\x86\xdc\x1c\x63\xb1\x9e\xd3\x2c\xb9\xa1\x3a\xcc\xc4\x69\x69\x8c\x84\x74\x44\x1c\x46\x92\x02\x82\x04\x0a\x99\xf0\x44\x8b\xab\x6d\x52\xa0\x49\x11\xe2\x4c\x40\x32\xcb\xc9\x6e\x0f\xfb\x8b\x52\xf1\x0d\x47\xa6\xfb\x5b\x6a\x86\x90\x46\x31\x52\xc8\x61\x7f\xcf\x0d\xeb\x21\xd9\xdf\xf3\x94\x32\x20\x47\xd2\x9c\x49\xb0\x7d\x78\xc0\xfb\xe3\xf1\xb4\x96\x04\xd9\xb2\x9b\x83\x28\x6c\xb2\x84\x50\x26\x9b\xad\x5e\x33\x99\x22\x0c\x99\x55\x92\xaf\x15\x56\x99\xca\x3b\xfd\xff\xe5\xed\xbe\x75\xb8\x47\xb2\xec\x80\xbf\x8a\xb0\x91\x04\x06\xf4\x2e\x50\x40\xf3\xa7\xf7\x9e\xcc\xe8\xbd\xf7\x7c\x7a\xe1\x9b\xde\x1e\x4d\xd2\xe9\xe6\x04\x83\x02\xea\xde\x3a\xc9\xf9\x81\x84\xde\xf1\x1f\xd6\xeb\x85\xa0\xed\x89\x1d\x23\x95\x7e\x05\xb8\xa3\x51\x31\xc0\x93\x86\x1c\xe6\xe4\xaf\xa0\x3a\xdf\x93\xfd\xb7\x91\xf1\x24\xe2\xbd\x13\x6e\xed\x2d\x50\x85\xc0\xf3\xdf\x60\xef\x37\x4c\x9e\x31\xf9\xc2\x54\xb5\x9e\x3b\x77\x5f\xdd\x96\x9b\xed\xf1\x2c\x80\x6f\xcc\xb9\x9e\xa4\xa9\x0b\x5d\x20\x45\xc8\xa0\xc7\x30\x4a\x8c\x2e\xab\x60\x92\xdc\x9d\x3a\x14\x48\x6b\x30\x7a\x8a\x7d\xc3\x2c\x67\xb8\x28\x47\x6f\x7f\xe2\xfd\x1d\xc2\x99\xc6\x4c\x12\x49\xb6\x76\x43\x69\xa9\x41\x3c\x50\xb1\x53\xd4\xca\x11\x20\xd8\xd2\xc8\xc4\x0b\x00\xd4\xb5\xd6\x19\xac\xa6\x16\x44\x06\xfa\x24\xdf\x42\x60\xc7\xd3\xdd\x63\xc4\xe7\xb5\x4b\x11\xe6\x40\x16\xa7\x9c\x9f\x0a\xda\xfc\x4b\xdf\x7e\xf9\xa7\x6a\x73\x68\xe2\x37\x03\x7e\xbd\x02\x9a\xa0\x2a\x17\xf1\xc2\x4b\x80\xd5\x6e\xc5\xe8\x7c\x65\xfa\xad\xa9\x1a\x53\x2b\x62\x68\xcc\x17\x4d\x4d\xef\xef\xf7\xf7\x3d\xfa\xef\xf3\x89\xd4\x09\x91\xec\x56\x88\x30\xb8\x4e\xbd\x90\xf2\x8a\x24\x44\xea\x3b\xb0\x4f\x4e\xe1\x08\x96\x1d\xa4\x70\xa9\x6b\x8f\x4d\x2e\xe5\x76\xd3\x3f\x6d\x62\x06\x79\x2d\x9a\xa3\x5b\x07\x98\x0c\x3f\x2f\xdb\x62\x40\x8e\xf7\x8a\xe6\x77\xba\x04\x45\xb6\xb2\x14\xff\x49\xb8\xbf\x3e\x75\xfa\xfd\x0e\x9a\x69\x00\x28\x66\x4e\x85\x56\x69\x23\x11\x29\x4b\xc6\x1f\xfa\xf9\x18\x52\x45\x31\x88\x18\x9c\x8c\x52\xbe\x2a\xa2\xc9\xbe\xfb\x03\x94\xf0\xe2\x41\x84\xc2\x9f\xab\x22\x65\xa9\x99\x5a\x8d\x26\xf9\x40\x28\x56\x1a\x88\x06\x6c\x7a\x05\xf6\xd5\x01\xe3\xb8\xd9\xdd\x30\x9b\x3a\xed\x16\xe2\x9d\x40\xc5\xd1\x4c\x33\x7d\x42\xd9\x51\x85\xa7\x19\x3c\xae\xaf\x63\xc4\xf4\x10\xa9\xc0\x65\x1a\x30\xe4\x01\x27\x32\x6a\xaa\x40\x6f\x55\x14\x22\x22\xf7\x1c\x20\xec\x02\x93\x4e\x40\x2c\x70\x8a\x3a\xea\x48\xb4\x6a\xa3\x23\x60\xf1\x08\x55\xb4\xab\x99\x5a\xe3\x7f\xe4\xc3\x0a\xf5\x8f\xa8\x07\xfb\x99\xed\x8e\x83\x46\x10\xb1\x26\x6f\x82\x68\x19\x24\x28\x2b\x00\x44\xb0\xef\x30\x6b\x7e\x90\xa8\xea\x33\x29\x9d\xcb\xc7\x11\xa2\xd3\x47\xdb\xf3\xa4\x7b\xf5\x9a\x43\x6e\xa4\xa0\x76\x67\x83\x29\x71\x72\x9e\xb3\x68\x04\x94\x39\x48\x20\xa9\xc6\x2b\x75\x6d\x25\xa8\xc9\x8d\x8a\x28\xbf\xc2\x6d\x3f\xdf\x2a\xbc\xf6\x3a\x6b\x75\xb0\x52\x8e\x30\x62\x65\x9b\x83\x71\xcf\xfa\x60\x94\x5c\xab\xbe\x21\x90\x2d\x38\x17\x32\x8a\x8e\x8e\x0c\x04\x0a\xfe\x62\xc0\x67\x70\x28\x04\x20\x26\x5a\x94\x62\x66\x5b\xf8\x96\x9e\xa0\xa9\x86\x1e\xa4\xef\x77\x1e\xe7\x84\x2e\x2a\x17\x28\x78\xa2\xfa\xe1\x35\x30\x0e\xd8\x91\xb3\x90\x05\x40\xcd\x85\x3c\x34\xf5\xdc\x85\x35\xeb\x60\xfd\x00\x7e\x5e\x9e\x1c\xd9\xb7\x20\xc1\xf0\xe7\xb7\xbd\xa1\xce\x5b\x30\x26\x10\x47\x29\xd4\x27\x21\x70\xa0\x61\x4f\x7b\x5d\x15\x80\x86\x1a\x11\x00\x41\x28\x0e\x31\x2a\x58\x6e\x41\x00\x8c\xe9\x92\x05\x68\x3f\xc0\x1b\x8e\x88\x04\xdb\x65\xa2\xd1\xe1\x9d\x59\xdb\x16\xc3\x39\x7d\x72\x85\xec\xe4\x4d\x78\xa4\x9d\x4a\x6b\x60\xbd\x06\x19\x95\x02\x1c\x5b\xbd\xe0\x3c\xa5\xa3\x81\xd0\xf0\x12\xb5\x3e\xc9\x42\x96\x24\x4d\xc5\x3b\xe0\x6f\x42\x83\x44\x00\x5c\x6f\xc4\xfd\x02\x72\xad\xce\x2c\x86\xa6\x2a\x06\x87\x31\xf4\x35\xac\xcc\xb4\xf5\x53\x54\x41\xda\x8d\x45\xd0\x5b\x46\xa8\x22\x66\x2a\x06\x97\x52\x44\x6d\x14\x3f\xa1\x73\x05\xf1\x02\x9b\x81\xd6\x95\xf1\x68\x12\x0c\x02\x00\x4b\x83\x0b\xb9\xb5\x81\x51\x5a\x33\x98\x1c\xe7\x05\x23\x44\x3b\x31\xaa\xc8\x2f\x0b\x6e\x2d\x65\x81\xb5\xfc\xdd\x95\xb5\xfc\xd0\x09\x6a\x4f\xe0\x74\x3f\x51\x23\x9f\x3f\xb7\x63\x16\x16\x18\xc4\x04\xf8\x8d\x86\x1d\xd7\xe9\xf3\xcd\x89\x56\xe2\x0d\xbb\xec\xb3\xf3\x55\x8f\x12\x2a\x52\xe5\xd5\x60\x7a\xc3\xe9\x3d\x74\x37\x5c\x27\x50\x2f\xa8\xd0\x83\x4b\x49\x5c\xa9\xa1\x37\x36\xa8\x3d\x66\x04\xa8\x85\x91\x60\xb1\x9d\x2d\xce\x9e\x37\xdf\x9c\x7a\xb8\xc4\x27\x72\x67\x3e\xc7\xf0\xf5\xf1\x9b\x94\xb0\x02\x0c\x4d\x58\x0f\xe1\xb3\x11\x7f\x3e\x3b\x5e\x3c\x7b\x13\x2c\xaf\x09\x69\xe9\x3b\x9d\x0f\x07\x67\xd2\xc3\xf3\x89\x02\x23\x09\xc0\xcc\xcf\xb5\x5d\x9d\x9a\xa0\x82\xbb\x91\xc9\xcd\x38\x4c\x86\xbb\x98\xc8\x45\x93\xb6\x34\xfc\x37\x2d\x28\xad\x16\x7e\x8f\x66\x73\x4e\x9a\x35\x82\xfa\x64\x04\xdd\x1c\x52\xfa\x8c\xd4\x81\xec\xc9\xd1\x87\x8d\xb6\xc8\x81\x89\x79\xf6\x0e\x7c\xa5\x65\xe2\x1d\x4b\xd9\xd3\xa8\xda\xb5\xf1\xe4\x2a\xd4\xc5\x40\x11\x97\x4b\x65\xe2\x94\x4a\x60\x75\x78\xcb\x2a\xa0\x5d\xfc\xe6\x62\xbd\xe1\xe3\xb8\x67\x79\xfd\xe7\xc7\xe4\x60\x49\x91\x01\xb6\x09\x41\x37\x23\x33\x22\x79\x91\xd5\x9a\x84\xfd\xd2\xe6\xb1\x79\x29\x10\xaf\x61\x93\xa6\xf1\x83\x75\x9f\x14\x55\x2c\xb4\x95\xb2\xce\x65\x43\xbd\x4b\xfa\xea\x57\x36\x53\x32\x4d\xaa\xd7\x33\x6a\x02\xcc\xf8\x44\x59\x71\x26\xe8\x55\xcc\xcd\xc4\x33\x6f\x8a\xcd\xe9\xd9\x93\x93\x35\xd9\x86\x06\x96\x20\xb4\xd7\xc7\x33\x2e\xf6\xdb\x71\x1e\x16\x30\xee\x64\x7f\xd5\xad\x23\x0a\xb1\xb6\x01\xe7\xbd\xa2\x0c\xdd\xf6\x0f\xc2\xf9\xa1\xbe\xb4\x1c\x43\xd7\xf6\x72\xa5\xb5\x5d\x7f\xeb\xb9\xae\xe9\x81\x06\x94\x92\xf3\x3c\x63\x12\xfe\x42\xe9\x7b\x28\x1f\xf7\x60\x48\x7d\xef\x49\x25\xc2\x3d\x80\x5e\xb3\x05\xc9\x37\xc0\x95\x01\xc4\x9d\xa0\x91\x66\x74\x24\x0b\x15\xd0\x5a\x23\x3a\x7e\xa6\xa7\x66\xeb\x11\xb1\x93\x3a\x3b\xc1\xb0\x97\x90\x33\x64\x4e\x4f\x9f\x5c\x12\xfb\x02\x85\xfb\xa3\x51\x4c\x03\x8b\x69\x9a\x60\x56\x10\xab\x97\xb1\x28\xd6\xc1\xd9\xd4\x0b\xa4\x4d\xdc\x99\xf3\x84\x06\xa7\x5b\x5e\xb9\xdb\x79\x75\x60\xcd\x05\x46\x38\xcf\x15\xd5\x31\xb9\x67\x28\xb2\xab\xd1\x93\x44\xea\xb0\x57\x26\x19\x82\xbb\x80\x8e\x41\x23\xf0\x58\x89\xf1\x2b\x7c\x11\x36\xb2\x4e\x24\x28\x71\x22\xa2\x9a\x6f\x14\x47\xcb\x88\x13\x14\xdc\xe1\xe1\xfa\xf4\xcf\xa2\xd7\xc0\xed\x6f\x47\x9c\xe9\x46\x38\xbc\x7e\x6b\x32\x20\x17\x11\x28\xa7\x74\xbf\xfc\x1c\x22\x83\x01\x63\xd6\x57\xfb\x17\x43\x43\x47\xf5\x5a\xdb\x6d\x8b\x36\x1f\xf2\x5c\xfd\x90\x3a\x11\x15\xc2\xdc\x04\x9e\x68\xe6\x81\xdd\x53\xe1\x14\x83\x8a\x1d\xc3\x41\x88\x6f\xa8\x36\x81\xe0\x36\xe5\xc7\x96\x40\x9e\xac\x12\x4f\xdc\x53\xce\xe6\x48\x7d\xd5\x9b\x93\x1a\x63\x46\x20\x1c\x79\x5f\xcd\x11\xc8\xd7\xee\x73\x07\xda\xb8\x11\x4d\xbb\x37\x91\x10\x32\x09\x85\x56\xe2\x74\xd1\x83\xec\x8e\xac\x30\x97\x43\xfe\xd4\xd4\x83\x40\x09\x2b\x14\x65\x5e\x8a\xac\x1c\xaa\x84\xa9\xc2\xf3\x48\x00\xb0\x07\x27\x97\x2c\xf5\x88\xe9\xda\xeb\x17\x59\xab\x7d\x70\xf9\x33\xdc\x11\x79\x8d\xfe\xc9\x17\xec\x94\xb3\x80\x74\x7c\x14\x23\x1d\xc7\xb2\xe8\x72\x0b\x90\x71\xc2\xcf\xe6\xfb\x6c\xcf\xb1\xb5\xca\xc7\x0b\xb6\x72\x97\x29\xec\x57\xa7\x07\x75\x2b\xe3\x4f\x52\xc4\x31\x2b\x8e\x51\x7b\x18\x5e\xb2\x07\x94\x8d\x6c\x2a\x00\xaa\x91\xb1\x33\x47\x81\xe5\x4d\xf3\x8f\x06\x0b\x9d\x45\x57\x1e\x1a\x0d\x06\x26\x00\x41\xbf\xdf\x12\xad\x78\x20\xaf\xe4\xa0\x37\x7e\x01\xcc\xc8\xfb\x29\x98\x1b\xa1\xff\x94\x99\x98\xe1\x28\x10\x4e\xa3\x13\xd0\x35\x4a\xbd\x13\xb7\xa5\x5f\xa6\x65\x78\xa6\xc4\x18\x13\x52\x8d\xf0\xb5\x7b\xdd\x05\x70\xac\x09\x47\xf6\x11\xec\xfc\x82\xf4\xe1\xa5\xac\x35\xcb\x22\x4d\x1b\x79\x86\x71\x80\x24\xe3\xf0\xce\x2e\x69\x7c\x8c\x58\xd7\x8a\xca\xb3\xd5\x79\xb3\x1a\xe1\x67\x89\x91\xe6\x9c\x3e\x19\x79\xb1\x13\xc5\x9b\xf4\x2a\x3d\x1c\xe3\xea\x1a\x53\x44\x76\x7f\x6f\xbd\x95\xbf\x14\x9a\x75\x70\x17\x8e\xaf\xaa\x26\x78\xa9\xde\x65\x07\xf5\x8a\x5d\xb4\x82\xf6\xbd\x4f\xdd\x34\xd2\x36\x74\xb4\xe6\xdd\x9b\x5f\xcb\x47\x11\x69\x6c\x36\xd8\x1a\xb5\x45\xa2\x7c\x43\x72\x4e\x03\x8f\x72\xb6\xdf\x97\xc6\xef\x36\x8b\x1c\x25\x20\x42\x06\xc6\xa6\xa6\xbd\x60\x4f\x65\xcb\xc6\x05\x85\x66\x55\x53\x04\x55\x36\x6f\x86\xcd\x1b\xe0\x4e\x4e\x4f\x57\xc5\x9f\xea\x56\x84\xf0\xd0\xd2\x18\xc6\x0e\x32\x1b\xbc\x22\x82\xcb\x26\xf7\x0a\x44\xf4\x1b\xe6\x64\x45\x4a\x32\x48\xeb\x40\x8c\xb4\x79\xd0\x99\x04\x36\x8f\x72\x6e\xf6\x8c\xc6\x25\x0b\x9d\xfb\xf4\x8a\xad\x20\xbd\xbc\x98\xf7\x05\xc9\x81\xca\x1d\x01\x15\x15\x7a\xd1\x5a\x23\x01\x17\x20\x82\x06\x58\x7f\x48\xfe\xd6\xa0\x7b\x90\x0f\xac\x1e\x10\x90\x10\x60\x8e\xc2\xe3\xef\xd7\x58\x38\xed\x03\xad\x14\x9e\x6a\x41\x24\x8c\xc2\x06\xb7\x7f\xb4\xbf\x9e\x52\xab\x3a\xb1\xfe\x8c\x2b\x0f\x19\x46\xb1\xaf\xd7\x4a\x92\x1d\xdc\xa0\xc7\x6c\x9b\xaf\x74\xc4\x08\xf4\xe8\x8a\xca\xfc\x7c\xaa\x12\x97\x9b\xd2\xb3\x06\x73\x76\x49\xc7\xae\x84\x14\xe5\xd1\xa5\x81\x6f\x59\x04\x94\xb7\x91\x62\x6e\x64\x11\xff\xbd\x27\x18\x31\x67\x41\xb4\x34\x18\x70\x27\x18\x70\xe4\xa5\xe0\x0b\xc6\x0f\x78\xf8\x03\x94\x8c\x4d\xd5\xa4\x32\x89\x50\x8d\x99\xfd\x54\xb5\x77\x8c\x03\x5d\x02\xc2\x4c\x49\x00\xcf\xc5\xf6\x81\x6a\x46\xb5\xa6\x27\x9b\xc5\xd4\x90\x6a\xf8\xd9\xaf\xcb\x6d\xbe\x38\x3f\xe9\xaf\xac\xcd\xad\x26\x3e\x9e\x7b\x2b\xed\x86\xde\x02\xd7\x7d\x77\x8e\x72\x06\x35\x73\x58\x69\x94\x21\xbe\x6a\x61\x46\xdc\x61\xc8\xbd\x29\xd3\x5b\x37\xec\x28\x09\xa5\x96\x38\x9b\xe4\x15\x73\xcb\x87\x9e\xb4\x23\xdd\x5c\x2e\xaf\x7e\x21\x12\x82\x38\x31\x23\xdd\x1e\x3b\xac\x85\xf0\xab\x5f\x09\x0d\xb0\x8c\xf1\x68\xe9\x2c\x22\x6f\xde\x4b\x86\x2e\xc8\xf8\x5c\xec\xc2\x57\xc2\x4b\x20\xc6\x67\x09\xf8\x9a\xf0\xbd\xff\xf9\x48\xeb\xed\x88\x86\xd3\x41\xe1\x7e\xd9\xfb\xa3\x11\xbe\xbc\xab\x4f\x06\x60\x67\x06\x21\xe1\x05\x73\xc2\x1d\x36\xe4\x98\x8a\x8e\xcf\xf5\x65\x7f\x8d\x6a\x68\x2f\x17\x05\x62\xc3\x3b\xc9\x7d\x87\x68\x70\xdb\xd0\x78\x0c\x57\x15\x78\xd6\x60\xbb\xf1\x5c\x6b\xc0\x99\xd7\x65\xf0\xbd\x9f\x76\x7a\xfd\x84\x9f\x72\x4f\x6a\x1f\x7e\x45\x32\x4a\x2b\x3c\xa1\x6f\xc3\xd4\x33\x7d\x8c\x63\xbd\xb5\x58\x99\xdf\x73\x86\xcd\xb9\x60\x96\xa7\x95\x6b\x5b\xe3\x12\xc4\x38\x84\x72\x82\xbf\x3b\xf4\xe8\x21\x5d\x61\x8b\xd6\x3f\x0b\xa7\xc9\x4f\x0a\x10\x64\x31\xe8\x79\x6b\x12\x01\xb1\x14\x8b\x84\xe4\xe2\x85\x6a\xb3\x4c\x06\x3d\xc1\x20\xe8\x26\x51\xca\xd9\xfc\xcf\x92\x74\xe8\x14\x8b\x1f\x57\x10\xe2\xe7\x57\x90\xec\x97\x0a\x97\x2e\xaa\x28\x15\x23\x6d\xb4\xe0\x97\x3b\xd9\xe2\x24\x5e\xf1\x0e\x29\x5e\x5b\x80\xd6\x4f\x62\xe6\x1e\xce\x8d\x8a\x14\xc3\xda\x86\x83\x7d\xd2\xa2\xfa\x99\x5f\x0a\x5d\xa9\x01\x5d\xf0\xfc\x52\x28\x6d\x88\x5f\xba\x8e\xcb\x39\x0b\x75\xec\xa4\x42\xe0\xc5\x07\xea\xed\x65\x85\x7c\xd2\x0a\xf7\xf6\xd4\x5a\x98\xef\x2e\xbc\xae\x31\xf4\x23\x8c\x4d\x45\x8c\x86\xba\xbd\x70\x57\x6e\xc7\x55\x42\x97\xde\xd0\x78\x05\x00\x3c\x60\xd3\x80\xca\x50\x9d\x77\x72\x12\x21\x5e\x30\x1f\xbd\xa0\x21\x00\xf7\x52\xfd\xaa\x38\x7c\xc3\x02\xb6\xc4\x94\xe4\xc4\xbd\x1b\x56\x22\xe7\x63\x89\x1b\xde\x5a\x56\x0f\xf7\x92\x7e\xcc\x93\x5a\x46\xd2\x40\xc9\x62\x52\x42\x02\x90\x34\x4d\x36\x19\x0a\x0f\x80\x61\x56\xd2\x44\x8e\x67\x49\x83\x12\x70\x44\x11\xfa\x3c\x41\x35\x77\x52\x56\x9c\x59\xfc\x62\xb1\xf0\xb2\xf7\xb1\xce\x0a\xc9\xf6\x9d\xfe\x63\x82\x39\x3e\x67\x55\xcc\xfc\xef\xcd\x84\xe5\x8c\xe6\x54\xd4\x9b\x02\x89\x63\x72\x9f\x1f\xf0\x69\x2a\x24\x3c\x0e\x32\x5d\x2e\x0b\xaf\x00\x1c\xc4\xfd\x03\xb8\xd6\x3d\x7d\xbb\xbb\x4b\xb8\xb5\xdc\x3a\xbc\x1d\xb4\xeb\xdb\x89\xc5\x2c\x42\xf7\xbb\xd8\xa2\x9e\xaa\x7a\x1a\x51\x3d\x35\x85\x82\x4c\xbb\x1d\xad\xad\x73\x48\x2a\xb9\x82\x04\x96\xb0\xbb\x2d\xaa\x3d\x34\x85\x5c\x6e\x2f\x32\xe3\xbb\x91\x86\xa0\x86\xef\x66\x25\x26\xa8\x71\x51\x79\x67\x56\xeb\x66\x3f\x0d\x03\xdb\x36\xf0\x26\xe4\x9e\xb0\x71\x73\x81\x79\x16\x6c\x6a\xb4\xfa\xdb\x2d\x08\x86\xd5\x64\xa5\x09\xf7\x9e\x8a\x35\xcf\x05\x53\x58\x44\xe5\x93\x96\x61\x00\xe5\x63\x0f\x69\x0a\x30\x53\xfe\x7a\xb5\xf3\xfb\x58\xf2\x8b\x87\x12\xb4\xd1\x66\x5a\x3d\x94\xba\x85\x10\x51\x96\x90\xb4\x68\xa6\x82\xf3\x08\x36\xe6\x6b\x34\x4b\x23\xe9\xbf\xd6\x06\xa4\x1f\xe9\x13\xa6\x7e\xbf\x48\xb0\x75\x84\x4a\x1e\xa4\xa8\xac\xb1\x4b\x6b\x4a\xe0\xf6\xb3\x3a\x83\x48\x6f\xa1\x3b\x18\x4a\x8d\x46\x97\x63\xa6\x71\x23\xeb\x18\xa3\x4c\x9d\x0a\x1e\x1e\x90\xc3\x1a\xfe\xf8\x25\xf6\x70\x71\xdf\xc1\x66\x8c\x37\xd4\x12\x11\x3e\xe7\xfa\x15\xa9\x1d\x32\x74\x96\x89\x68\x74\x73\x6e\xee\xc6\xef\x6e\xb2\xd2\xb3\x3f\xae\xf9\x81\x53\x93\x19\xf5\x8f\x2c\xdd\x7c\x37\xae\xaf\x29\x8d\x64\x7f\xf7\xec\x4a\xd5\x54\x83\xed\x8a\xd4\xc9\x72\x8a\x5b\xd4\x81\x99\xca\x03\x5d\x89\x46\x9a\x6d\xbd\x73\x14\x33\x2c\x82\xbb\x45\xeb\x1b\x5b\x8f\xfe\x35\xfd\x29\x5b\x2f\x46\xff\xf6\x50\x49\xd3\x37\x39\xaa\x54\xb2\xe6\xf6\x17\x38\x74\xa7\x22\x26\xd7\x7d\xd1\xaa\x2c\x7c\xdc\xfa\x03\xd0\x74\x5e\x5b\x3a\xbd\x76\x30\x66\xdf\xd0\x01\xb6\x8e\x40\x1c\x99\x1c\x27\x6e\x54\x21\xf9\x12\xb8\xf8\x6b\xf4\x50\x02\x80\x40\x39\x6c\xb3\x03\x93\x14\xfb\xaa\xd2\x4f\xf0\x0d\x47\xb0\x99\x88\x27\xa4\x1c\xcc\x3a\x45\x18\x0d\xa3\xf5\x6b\xe7\xe1\x10\x85\x66\x3f\x69\xc2\x69\x9c\x1c\xd5\x96\xb0\x50\xfb\x48\xda\x44\x6b\xe3\xa2\x9a\xbf\xba\x01\x49\xba\xf8\xc2\x65\x6d\xca\x7b\x8d\x4a\x47\x91\x32\x02\xc0\x4f\xae\x02\x0e\xe2\x73\x1c\x81\x0d\x01\x00\x39\x77\x60\xfa\xd9\xa4\xed\xdc\x8e\x2b\xdc\x7c\x55\x4a\x1e\xdb\xa7\xbf\xc2\x83\xa6\x2f\xdc\xd3\x75\x39\x2f\xab\x9d\xea\x13\x0b\xbd\xfc\xc4\x7d\xa1\x89\xd3\x38\x12\x4f\x6b\x10\x7f\x33\x11\x28\xe2\xdc\x4e\x67\x82\x51\xd2\x91\xb4\x4c\xff\x7a\x0a\xf5\x0d\x2f\xee\x50\xe3\x8a\xb2\x14\x14\x9c\x34\xbc\xf8\x2a\xdd\x51\xd6\xc1\x57\xab\xba\xf5\x07\x7a\xb9\x61\x12\x1f\x07\x2d\x51\x9b\xee\x43\x0f\x56\xfc\x14\xd1\x90\xb4\x3a\x7f\x0b\xbd\x50\x02\xf2\x79\x65\xbb\xcc\x81\xdd\x8f\x4e\x72\x5b\x09\x98\xd4\xd1\x02\x07\xe7\xc1\xd0\x9d\xd0\x38\xa0\x74\xea\xc9\xac\xff\xf3\x80\x2d\x25\xc3\xf6\x32\xdd\x92\x6b\x5d\x42\x6c\xfe\xd3\x8c\xae\x5d\xef\xdb\xf3\x05\x06\x6d\x86\xfd\x88\xc3\x2d\xcd\x23\xc0\xbd\xc3\x17\x5e\xb9\x29\x1d\x7a\x37\x69\x76\xd4\xc1\x4e\x7c\xfb\xb1\x2f\x2d\x52\x56\x8b\x34\x30\x8e\xe3\x89\x0f\x94\x3c\x0a\x39\xc0\x7a\xdc\x17\x82\x5b\xd9\xb4\x6d\xb3\x8e\x56\xdc\x00\x87\x99\xf4\x11\x6f\x41\x52\xec\x83\xd7\x66\xc0\x1e\xbc\x7c\xb9\x09\x33\x72\xb5\xfc\xea\x54\x35\xf4\x4b\xda\xdd\xba\xea\x85\x88\x4d\xf8\x4c\xa1\xee\xae\x56\x84\x97\x47\x5e\xeb\xbc\xce\x85\x12\x28\xc9\xe3\x59\x7b\x5f\x02\xe7\xb8\x2e\x1a\xa8\x4d\x18\x07\xc6\x89\x27\x46\x54\x02\x06\xf4\x28\xdf\xf0\xe2\xbf\xe5\xef\x2e\x07\xed\x41\xa8\xaf\x4d\xa9\x2e\x39\x00\xeb\x9b\xab\x5e\x45\xbd\xba\xbb\x7c\xde\x3c\xb6\xa7\x98\x30\xc0\xa3\x3f\xd2\x29\xbe\x44\x8b\x56\x0c\x93\x41\x93\xc0\x8c\x45\xab\x75\x6b\xc2\x34\x87\xad\xa0\xc2\xaf\x38\xe5\x1d\xe7\xcd\xa4\x61\xe6\x79\x8e\x07\xf9\x44\x28\x8b\x05\x99\x55\xbf\x45\x67\xe1\x60\x59\x2d\x30\x44\x34\xc0\x4d\xbf\x2b\xa7\x8b\x0b\xea\xc2\x3e\xcf\x8e\xb1\x78\x01\xf8\x0c\x53\x68\x8a\xe0\xaf\x50\xca\xa2\x05\x6b\x87\xe6\xa6\x9c\x81\xcc\xe5\x57\x3c\x62\x24\x2b\x0e\xed\xb1\xf1\xa0\x8b\xa9\x3a\x6b\x45\x1c\xe5\xb0\xde\x2b\x00\xb6\x59\x1e\x4f\x0c\x1a\x15\x86\x7b\x5b\xce\xf0\x68\xa7\xca\x86\x14\xd8\x3a\x79\x19\x93\xa4\x3b\xfb\x28\x65\x49\x8d\xe5\xbd\xfd\xe0\x3a\xf4\x4a\xc6\xac\xd1\x37\x94\x74\xe1\xcb\x62\x66\xdb\x90\xf7\x1b\x6a\x0b\x12\x05\xe4\xec\x7d\x2b\xbd\xd5\xb8\x88\x56\xd2\xa8\xf7\xf6\x73\x03\x58\x4e\xaa\x00\x07\x0d\xe7\xf6\x61\xf6\x21\x34\xe7\xd3\x92\xe0\x60\xaf\xf5\xbc\xb5\x66\xf0\x47\x40\x10\x6f\x2d\xc8\xfd\x55\xcb\x7c\xc0\xc1\xd1\x22\x6d\xcf\x8b\xe6\xdc\xd5\xb0\xd6\xf9\xa2\xe2\x68\xfd\x18\x49\x75\x94\xb8\xcb\x95\x1f\xbf\x99\x69\xd3\xb8\x39\x40\x5a\x3b\xca\xe9\x94\x55\xe5\x72\x39\x6c\xca\xf3\x74\x2c\x48\x7d\xd8\x60\x03\x70\x4b\x4f\xa2\xba\x16\x8a\x0d\x78\x37\xd3\x0b\xd0\x66\xdf\x4d\x62\xc7\x22\x74\xe6\x8c\xdf\xbb\xe5\x07\x1c\x08\x92\x42\xc2\xf5\xf3\x04\xed\xf7\x28\xdd\xaa\x9c\x72\x82\xac\x95\xad\x7e\xb7\x2b\x0a\x1b\x3a\x22\x2f\x27\x24\x38\x6a\xb9\xa3\x8b\xbc\xae\x51\x97\xa3\x01\xe4\x27\x49\xbc\xbf\x22\x51\x29\xd4\x23\xa0\x5f\xe5\x08\x38\x0f\x30\xbb\x34\xe1\x9e\x5b\x68\xc5\x9c\x3f\x14\x7e\x20\xcb\xe3\x23\x08\x53\x56\x91\x98\x19\xed\x29\x18\x63\x02\x3d\x5f\x72\xe0\xf5\xf2\x49\x7e\x58\xf5\xf4\x69\x7f\x21\x02\xf8\x4e\x27\xb5\x1a\x41\xef\x31\x92\x4b\xd4\x8f\x7e\xc4\x8e\xad\xeb\x4c\xa8\x66\xe9\x95\xdb\x0c\xa6\xed\x9a\x17\x68\x8d\x37\xcb\x1a\x7e\xef\xa4\xee\xb5\x45\x80\xb8\x3d\xa8\xc8\x24\x84\x97\x37\x16\xc3\x70\x39\x7e\xfc\xc5\xcd\x01\x2b\xc6\x42\x17\x77\x41\x3b\xad\x89\x22\xa8\x4c\x53\x73\x41\xe3\xbf\xd6\x04\x8d\x17\xe9\x80\xfc\xe1\x70\x05\x5e\xad\xe9\x0f\x12\x07\xce\x49\x2a\x88\xbf\x6e\x87\x88\xd4\xfe\xd1\x60\x61\x58\x4b\xdb\x4e\x01\x8d\xec\x6f\x42\x34\xf8\xdb\xec\x8a\x3a\xed\x7c\x63\xcc\xfa\x95\x91\x41\x4d\x2f\x45\x88\xbb\x16\x29\xe5\x5e\xf5\x86\x2b\x46\xa4\x55\xca\x06\xfd\xd7\xf4\x63\x87\x92\x3c\x61\x61\xb4\xa5\xb8\xf9\x90\x74\x63\xe8\xcd\x13\x51\x47\x8d\x59\xc2\x6c\x78\xa1\xe9\x53\x81\x97\xeb\x47\x5f\x76\xeb\x1d\xf0\x1e\xe0\x6d\x29\xe9\xd2\x58\xc3\x42\x37\x7e\x0e\x8f\xa1\xce\xc1\x3e\xdd\x6d\x50\x3a\x2c\xe6\x02\x43\xcc\xe2\x22\xfa\x42\x70\x4d\x7c\x52\xaf\x7e\x52\x36\xe1\x36\x70\x6f\x29\xc2\xd6\xe9\x27\xd5\x89\xf7\xd4\x0a\xc4\xa0\xb5\xd1\x41\xd7\xc7\xd4\x8b\x4e\x8f\xb3\x2e\x07\xf4\x80\xf8\xa7\x10\xee\xc2\x20\xaa\xf7\xbe\x52\x7d\x0a\xa8\xab\x8a\x2c\xfd\x19\xd4\xdd\x07\xd8\x99\x4d\x46\x5e\x79\xb7\x31\xc2\xe6\x3a\x22\x0c\x3b\x92\xf9\xb2\xc3\x79\x9c\xbc\x1d\xc1\xad\xf8\xe7\x2d\xc0\x06\xff\x0e\x32\x37\xf6\x6d\x6e\xa9\x69\xf3\xc9\xa3\x99\xa5\xe0\x49\x61\x33\xc6\xf7\x91\x3e\x77\xd0\xd6\xc4\x32\x46\x0e\xe5\x55\xaf\x04\x80\x2f\x97\xde\x28\x93\xf4\x70\x19\x3e\x2d\x4b\x27\x9d\x23\xda\x91\xad\x2e\xe6\xd5\x99\xca\x68\xe4\x1e\x68\x58\xd3\x2f\x3b\x1c\x08\xee\xfc\xf8\x99\x67\xc3\x71\x17\xb1\xf1\x03\x4a\x10\x32\x3f\x37\xd4\xad\xfc\xec\xcf\xbe\xdf\x05\xf9\x0a\x48\xac\x44\x1f\x56\xec\x2e\x7a\xeb\xf5\xb5\x2d\xbc\x3d\x00\xaf\xc7\x31\xd1\x19\x1c\x1f\x26\x80\x1a\x04\x9e\xde\x4a\xb9\x13\x34\xb1\xa2\x0a\x10\xb3\x9a\x06\x1e\x1d\xc2\xb6\x76\xee\x98\x17\xe8\x67\x30\x52\x41\x21\xdf\xd6\x51\xe2\xdd\xab\xe1\x1a\x0e\xb7\x7c\x23\xac\xa1\xe2\x8a\x2f\x44\x4c\x8c\xbe\x91\xcc\x27\xd6\xac\x64\xa9\x88\x1e\xc7\xcf\x5f\x9b\xce\xe9\xe9\xe3\x87\x64\x67\xae\xe4\x0e\x2d\x7c\x23\x58\x47\xce\x76\xd9\x11\xa0\x5e\x3f\x07\x92\x19\x1a\xe5\xcb\x65\xce\x38\x7f\x19\x7e\xbf\xba\x1f\xa5\x60\x9c\xbc\xe6\x2b\x01\x07\x01\xca\x92\x8f\xbd\xb7\x01\xa7\x8c\x24\x43\xb1\xc7\x2f\x0b\xe8\xce\x48\x06\x60\x2e\x87\xeb\x42\xb8\x37\x1f\xd6\xe6\x4a\x99\xc5\x1c\x10\x97\x14\x99\xc9\x9a\x96\x24\x0d\x73\x84\xdc\xb7\x2e\x89\x04\x23\x01\xd4\xc4\xda\x08\x87\x5e\x3c\x96\x2d\x10\x6b\x26\xd3\xe0\xd3\xd7\xf0\xaa\xef\x73\x53\x11\x3c\x45\xc8\xfb\x3a\xf5\x01\x50\xd2\x89\x9e\x2f\x00\xfa\xba\x3e\x37\x94\x16\x42\x4b\x30\x06\x41\x20\xfa\x07\x51\xe6\xb7\x82\x54\x48\x9d\x86\x07\x5e\x7d\x0c\x71\x35\x90\x57\xc6\xef\xe5\xaa\x82\x99\x00\x67\x9c\xaa\x2b\xb4\xb6\xfd\x8e\x39\x94\x80\x79\x6d\x74\x60\x66\xaa\x6c\x94\xf0\xf6\x4d\xae\x9e\xdb\xf3\x20\x7b\xad\x3c\x7a\xad\x0a\x23\x99\x29\xc4\x2d\x75\x98\xb6\x1f\x44\x53\x33\xfd\x5b\x07\xc3\xcc\xf7\xc9\xdd\x71\x32\xc7\xaf\x8e\xb0\xe8\x13\x02\xd2\x1e\xa9\x33\x93\xaa\xaf\xec\x50\xfa\xad\x93\x74\x1f\xcd\x90\x24\x18\x43\x7a\xa0\xd0\x60\xcd\x3f\x98\xd6\x93\xc7\x38\xfd\xf4\x61\x3b\xb4\x91\x2c\x5b\x3b\xcf\xfb\x77\xfa\xb3\xa0\x22\x2c\xae\x0e\x37\xc2\xad\xf9\xe0\x63\x0d\xa6\x4e\x3d\x6e\x37\xf3\xde\x36\xfc\x0d\x83\x32\x64\x76\x38\x8e\xcb\x7a\x17\xe8\xbb\x93\x5a\xc7\x32\x16\x23\x5b\x17\xd3\xc2\x16\xfd\xe8\x59\x7c\x3e\x89\x25\xeb\x2c\xe7\x2f\x34\x44\x5f\x57\x13\xb1\x96\xb9\x06\x3e\x9c\xdf\x4b\x24\xe1\xb3\x5f\xc4\xe9\x40\x76\x7a\x59\x18\x58\xfc\x2e\xee\xee\xfd\x44\x25\xa5\x3c\x5b\xe8\x58\x16\x86\x48\xf0\x40\x60\xd1\xcb\x81\x3a\x8f\x17\x0c\xc4\x71\xda\xdc\x12\x55\xc8\xa6\x97\xc9\xbb\x33\xe8\x12\x9d\x09\xb6\xad\x32\x11\xa8\x04\xb9\xc7\xcd\x04\x96\x3d\xae\xf0\x74\x38\x3a\xc1\x62\x82\xaa\xdf\x29\x6d\xdf\x15\xeb\xc5\xfc\xf4\x23\x96\x49\x39\x70\xb8\x35\x2b\x99\x01\x89\xeb\x3b\xf7\x48\x88\x7d\xd9\x11\x12\xbd\xa0\x4b\x53\x5e\x2f\x51\x16\xfc\x83\x2a\x6b\x82\xab\x34\xb6\x60\x3e\x07\xcf\x89\xcb\x51\xe3\xa2\x2a\x5d\xe2\x4e\xbd\x9a\x5c\x9a\xf8\xb6\x5e\x23\x63\xd8\x37\x6f\x3d\xad\xcf\x2a\x8f\x52\x9e\x77\x7c\x49\x23\x20\x49\x7a\x4c\x3f\xad\x15\x54\xe2\xfd\x95\x93\xca\x43\xe1\xcf\x4b\xe5\x55\x16\xa3\xba\xf9\xe0\x53\x33\x24\xfc\x2e\xe1\x0e\xb9\x93\x52\x30\xd2\x92\xdd\x70\x74\x48\x2c\x66\x24\x14\x21\x28\x17\xe2\xcc\x3f\x6e\x13\x1a\x7c\x52\x8a\xeb\x76\x28\x69\xa5\x4d\xd0\x7d\x17\xfc\x13\x51\x44\x8e\x6b\x8d\x68\xa2\xab\x81\x06\xeb\x99\x39\x9d\xed\xd7\x1f\x86\xe7\x12\xea\xb6\xd7\x06\xe9\x23\xb5\x06\x05\xcf\x67\x94\x89\x1a\x2d\x51\x17\x49\x68\x54\x9e\xe7\x29\x16\x0b\x99\x46\xd2\x5c\x54\x1c\x73\xa3\x07\xee\x41\xd3\xee\x92\xcb\x20\xf7\x0b\xbf\x2f\x16\x9d\x37\xce\x3e\xab\x46\x17\x8b\xc2\x6e\xb9\x59\x36\xe4\x68\xdf\x22\x46\x0b\xf5\x0f\x66\xb0\xeb\x4c\x8e\x83\x51\xe4\x33\x36\x0c\xb5\x17\x96\xf7\x57\xbf\x84\x4c\xf6\x5e\x0e\x11\xbc\x93\x9e\x4f\xbc\x40\x08\x1b\xae\xd4\xb6\x5a\xe1\x1a\x9d\xd6\x84\xb9\x27\x57\x04\x65\x8d\x35\x1e\x69\x0f\x9c\x3a\xad\x7a\xb6\x66\x8b\x52\xf3\x51\x48\xf4\xec\x52\xed\x57\x38\x6f\x25\x24\x67\xfe\x0f\x52\x04\xae\xbc\x91\x83\xa9\x23\x85\xd5\x2f\xfd\x65\x56\x65\x5a\x29\x33\x05\xf1\x9f\x13\xdb\x21\x14\x86\x2e\x20\x71\x8a\x7c\x28\x5f\x5a\x14\x61\x5f\x6c\xe2\xe9\x3b\x78\x6b\x8b\x0e\x84\xd1\xe5\x4e\xe8\x7d\x69\xec\x31\xd4\x39\x6d\xbb\x18\xaf\xa7\x78\x2d\xa8\xb0\x3a\xf7\x55\xf2\xa9\x6d\x8f\x99\x86\x42\x89\x9d\xa5\x45\x00\xc8\x03\xbe\xc3\x53\x42\x95\x2a\x3f\x1f\xcd\xb2\xe4\xd5\x27\xc9\x8d\xc0\xfb\xa4\x54\x3d\xe5\x51\xf5\xf1\x50\x42\xcd\x8e\xda\xd4\x00\x57\x6f\x5c\xa0\x88\x7e\x54\x33\xa3\x60\xdf\x7d\x40\x55\x69\x9f\x44\x59\x12\x49\x77\x58\x7e\x9d\xdd\x04\x8f\xd7\x8a\xd4\x43\x75\x83\xa9\xdd\x78\xc7\x2f\x45\x82\x4f\x3d\x52\x0e\x98\x99\x94\xd1\x91\x95\xf0\x75\x9e\x1a\x70\xfc\x26\x03\xd6\x85\xf7\x97\xc1\xbf\xf6\x4b\xd3\x65\x17\x9a\x7d\xd0\x28\x91\x7b\xf1\x73\x5b\x89\x54\x80\x7a\x8c\xb9\xb0\xb4\x20\x76\x75\xe9\xd5\x36\x60\x58\xb5\xe5\x17\xb7\x50\x76\x72\x87\xcb\xb2\x7a\xac\x16\x50\x83\x9b\x32\x22\x3a\x72\x0b\x82\x07\x43\xe1\xc3\xa9\x77\x1a\x6f\xeb\xd8\x03\x9e\xa5\xdf\x6e\xf0\xf4\x67\x34\xbf\x2c\x99\x92\x52\x94\x4f\xfb\x7d\x2a\x53\xe3\x3f\xfa\xc7\x5f\x47\x6a\xf1\x0a\x7a\x8c\xc9\x99\x7e\x6b\xc4\xc1\x1b\xb9\x89\x22\x34\xe0\xc1\x40\xcb\xe4\x78\x5c\x08\x6e\xa8\xe4\x3e\xc2\x24\x04\xb1\x97\xe9\xc4\x3f\xd3\x87\xfd\x4f\xbd\xc4\x60\x94\x80\x97\xe3\xb1\x17\x47\xbc\x09\x9d\xaf\x60\x07\x2c\x8c\x34\x85\x0f\x06\xa3\xa9\x37\x29\x0d\x39\x4b\xe5\x9d\x38\x0a\x34\x4a\x6c\xad\x2c\x82\x01\x1c\x28\xbf\x06\x74\x08\xa5\x6f\x31\xde\xbe\x2f\x28\xdc\xc4\x21\x57\xc4\x6f\x6d\x15\x83\xf6\xb0\xe1\xfb\x72\x29\xa1\xdd\x20\x87\x0c\x57\x5f\x10\x85\x17\xe9\x33\xdf\x91\x17\x3c\xfd\xad\x26\x02\x85\x3b\x44\xf5\x32\x8c\xb4\x51\x18\x47\x2c\x53\x7c\x1c\xfb\x06\x70\xca\xe7\x82\x5a\x64\xd2\xb2\xce\x4e\x2c\x59\xf9\xef\x54\x5b\x7c\xbd\x19\x52\xd0\x2f\x68\xd1\x32\x10\xeb\x86\xcd\xa4\xf8\x28\x50\x14\xd4\x88\xe0\xf6\x8a\x4f\x46\xa5\x5c\x68\x0a\x45\xd2\xd8\x98\x58\xd1\xac\xc3\xde\x8d\x6d\x30\xcc\x15\x12\x3b\x54\x0c\x7b\x4c\x69\xd4\x7b\xd2\xc5\x2f\x8c\xf8\xbb\xf4\x48\x73\x7a\x43\x4a\x09\xbb\x64\xd6\xf6\x50\xe5\x68\x23\x9b\x84\xd6\xbc\xc7\xde\xdf\xec\x10\x4b\x7a\xe3\x06\xf4\x8c\x25\x2a\x42\xc4\x42\xfc\x4a\xad\xce\xc7\x54\x92\x6d\x46\xc1\x31\x8f\x91\xf3\xd2\x81\x2a\x3a\x51\xa3\x42\x2d\xc4\x13\xa7\x74\x81\xec\x79\xc0\x72\x6a\x0e\x0c\x86\x4e\xb9\xe2\x9b\x47\xe6\x13\x28\x4d\x6d\x44\x77\x47\x70\xcc\xa3\xb3\x06\x03\xfe\x3c\x01\x44\xca\x31\x91\x15\xcf\x1e\xb7\xf0\xd7\x91\x84\xb2\x4e\x48\x38\x5b\x3a\x51\x50\xba\x1c\x58\xbe\xee\xde\x53\x6d\xfa\x88\xeb\xd0\x33\xe0\x3a\x2d\x88\x6f\x22\xd1\xf4\xf6\xcb\x4a\x02\x8a\x90\xc2\xb2\xd2\x77\x52\x6a\x01\xe5\x15\xa8\x33\x01\x32\xab\xcd\x77\xb5\x92\xf0\xaa\x0b\xb6\x44\x1e\xdb\x29\x7d\x6e\x4b\xb5\x46\x16\xd4\x89\x4e\x7e\x7a\xca\x07\x19\x5e\x12\x34\x04\x08\x65\x20\x4c\xaa\x2d\xa9\xfb\x1b\x34\x06\x2d\x2f\x10\x90\xb5\x10\xd6\xa6\xb5\xcc\xbd\x9a\x5c\xcd\x0f\xea\xd6\x2a\xf3\x6c\xb6\x60\xf9\xea\x95\x18\x1b\x23\xf0\xc1\x16\xdf\x65\xd2\x8b\x31\xb5\x90\x05\x11\xfb\x25\xcc\xd3\xb2\x33\xe8\xe0\xbd\xf9\xb9\x44\x24\x0a\x21\xac\x72\x87\xe1\x12\xe3\xba\xad\x1b\xc2\xc5\x5a\x4d\x09\x7c\x32\x0f\x21\x65\xd0\x63\x1d\x49\x76\xe3\x02\x5d\xb8\x29\xc2\x1d\x8c\xb4\x76\xe9\xfa\x49\xb3\xf9\xaa\x8b\x73\x6a\x65\xbe\x01\x37\x60\x5e\x81\x54\x71\x64\xe3\x6f\xa7\x26\x48\x0d\x52\x03\x2a\xdb\x33\xcb\xf8\x4e\x4a\xef\xb1\x06\x12\xc8\x4b\xf4\x1c\xfa\xd5\x5f\xab\xb1\x42\x6e\x83\x81\x6b\xbc\xb1\xda\xda\x54\xeb\xfb\xc6\xa4\x90\x51\x4c\x20\xc0\xe8\x26\xac\x4f\x84\x3f\xf8\x31\x01\x5f\x9e\xd6\xf9\x3c\x77\x86\x3b\x8c\x0d\x2e\xba\xe9\x37\xdf\x7c\x11\x17\xfc\x9c\x7f\x58\xe4\x31\xc9\xed\xc3\x8a\x69\x2f\xcc\x6b\xd2\xbb\xa5\x41\xc6\xb8\xca\x51\xc0\xa0\xbf\xb7\x51\x01\x4e\xc6\xcf\x16\x41\xe7\xd7\x5b\x08\x90\x51\xca\x88\x02\x03\xdc\x04\x09\x8e\x2c\xfc\xd0\xaa\x9e\xf3\xbe\xc6\x86\x17\x8f\xeb\x75\xec\x26\x8d\xd3\x96\xa6\x6b\x73\x8a\x19\x3f\x92\xc0\xde\x54\xb6\x96\x9c\x22\x58\x20\x44\x81\x9f\xb1\xc4\x10\x2a\x1f\x58\xab\xec\x57\x5a\x99\x61\xa0\x40\x19\x5c\xb5\xb7\xf1\x04\x99\x0d\x33\x70\x5f\xbd\x38\x90\x14\x34\x94\x3f\xe7\xdb\x32\x5c\x9c\x66\x1b\xa9\x89\xc7\x60\xc3\xee\x11\x46\x97\x31\x66\xfa\x13\x8e\x59\x46\xda\x0e\xd1\x11\x7e\x3e\x71\x31\x9d\x50\x5f\x4e\x35\x3b\xbd\x9a\xde\x06\xde\x3b\x8d\x0f\xde\x4b\xfb\xfd\xf0\x92\x2f\x9c\x47\x1f\x1b\xf7\x85\x63\x93\x88\xc3\x89\xae\x9b\xac\x1f\xad\x3c\xc3\x77\xd2\xa8\x41\xae\x71\xdd\xc5\x8c\x78\xc9\xdb\x86\x0a\xa7\xbb\x10\x7e\x78\xaf\x96\x81\x95\x03\x6f\x39\x57\x0b\x01\x95\x85\xa3\x57\xe8\x4b\xa2\x5d\x4e\x1e\xec\x42\x81\x12\xa2\x54\x46\x00\x70\x51\x85\x0e\x3f\x6a\x5b\xfd\x40\xb5\x0f\xb2\x9d\x14\x1b\x43\x76\xb3\x11\xd4\x91\xba\x00\x96\x56\xac\x19\x9b\xca\x62\x9a\x06\x59\x25\x42\xa4\xd7\xaa\x35\x2f\xe4\x97\x4b\x51\x33\xc9\x7c\xf9\xbb\x41\x97\x4b\x50\xcf\xb7\xad\xab\x68\x14\x78\x86\xa2\xc6\xda\xd7\x62\xdd\x24\xc4\x79\x99\x44\x79\x30\x43\x6f\xcc\xd8\x42\x1c\x46\xf0\xc3\xa7\xb3\x93\x09\x44\x0a\xb9\xb0\x1d\x09\xd5\x16\x6b\xf7\xea\x74\xc7\x80\xeb\x54\x28\xe4\x89\xfe\x9e\x4d\x66\xd3\x22\xe9\x4c\x2b\xe2\x73\x11\xdf\xf3\xbe\x7e\xb2\xef\x1a\xe7\xfe\x61\xc8\x38\x34\x9a\xe1\x07\x39\x47\xf5\xcd\x4d\x78\xdd\x20\x96\x7d\xbd\xf8\x38\x36\x24\x36\xd8\x6f\xbb\x53\x28\x66\x80\xe3\xf4\x75\xe2\xa7\xd9\xc4\xe7\xa9\x06\x94\xd6\xd2\x16\x7c\xf4\xcd\xca\xb6\xa8\x0c\xe9\x1a\x77\xc8\x0a\x41\x09\x63\xf1\xcd\x16\x6d\x76\xa6\x29\x6a\x31\x06\xfa\x67\x86\x30\x7b\x3d\xa5\x76\xa3\x4f\xca\x27\xa7\x2b\x94\xae\xc4\x15\xdb\xa1\xbd\xa9\x8c\x16\x74\x9c\xe8\x62\x48\x8f\xa3\xa7\xf5\xe1\xce\x1d\x7b\x7c\xb2\x97\xa0\x9a\xcd\x3e\x64\xc9\x99\x1b\x62\x7b\x58\xe3\x2d\x2b\x77\xa9\x5f\x37\x0d\x77\x2f\xca\xc6\x80\x5e\x41\xa1\xb5\x49\x06\xb0\x1e\x65\x9f\x84\xbb\x37\x77\x0f\x15\xa6\x42\xf7\xd1\x19\x34\x54\x66\x95\x1a\x54\xf5\xf3\x46\xec\x3d\xd4\x08\x98\xa2\x43\x4f\x64\xb2\xbe\x30\x1f\x12\x75\xef\x57\xb4\xa4\x37\xad\x83\xbc\x36\x16\x3f\xef\xd2\xdc\x85\xbf\x0f\xae\xf0\xd4\x15\x4d\x15\xe1\x1d\xc8\x10\x89\xe6\x1b\x69\x65\x0e\x6a\x62\x9e\x07\xdb\x82\x89\xc8\xe6\x8a\x70\x7f\x0d\x45\xeb\xba\xfe\x78\x51\xfe\x57\x2e\x00\x71\x96\x3c\x59\x0e\x3e\x1c\x3d\xdc\xd2\x62\x6e\x7a\x2d\x44\x96\x66\x6b\x70\x6e\xef\xea\xad\xad\xe7\xac\xb0\xd3\x5f\x79\x87\x2b\x40\x16\xc4\x59\xb9\x3d\xc3\x1e\xe9\x4c\x63\x2e\x40\x18\x65\xef\x25\x64\x2b\x30\x9d\xdb\x7c\x10\x75\x2b\x11\xa6\x3f\xe5\x08\x85\xa2\x37\x09\x01\x15\x65\x00\x42\x24\xa6\xc2\x86\xb0\x0e\x9e\x01\x68\xab\x5c\x20\x3b\xa4\xaa\x31\x18\x1c\xba\x81\x7a\x75\xfa\x92\x2c\xc2\x6b\xe6\xf0\xd8\xef\xdc\x3c\xcf\xf4\xda\x70\x0c\x62\xe2\x5b\x91\x68\x16\x44\x77\xbd\x2c\x91\xad\x44\x6f\x81\xd7\xd5\x67\x0a\x98\x53\x32\xac\xf2\xcf\x77\x3b\xe6\xfd\xbd\x83\xdf\xe3\x3b\xd0\xd3\x67\x7b\xe0\xe7\x4d\x4f\x1b\x73\xa6\x1b\xb9\xa7\x19\xd9\x34\x7b\xe5\x8a\x88\xf0\xef\x46\xc7\x3b\xd2\x92\xca\xe4\x95\x20\x4c\xef\xf9\xc7\xf4\xda\xaf\xab\xfc\xda\x89\xda\x95\x67\xaf\xd1\x57\xa6\xc0\xa9\xfa\xc5\xf4\x41\x62\x91\xc3\xd5\x08\xc2\x20\xf0\x71\x37\xa9\xc6\x22\xb8\x5e\xba\xd2\x5a\x58\x68\x6b\x5f\x8b\xd6\x5a\x8a\xc2\x03\x68\x70\x50\xaf\x02\x03\x77\x05\xa6\x26\x5d\x77\x47\xc0\xf0\x2a\x0f\xa6\x06\x3b\x03\x1c\xc5\x50\xc7\x0a\x44\xd4\x52\x7b\x24\x72\x5f\x91\x33\x03\xdf\x2c\xe8\x4f\x32\x17\xa9\x0a\xb3\xec\x40\xfe\xe5\x29\x13\xe5\x89\x77\x1a\xd7\x1b\xc5\x99\x65\xe6\xf1\xd6\x53\xf3\x87\xd0\xdd\x07\xf7\x85\xb0\x98\x59\xee\x07\xe7\xb0\x44\x36\x8f\x31\xbf\x01\x35\x51\x7b\x39\x94\x25\x86\x04\xcb\x5d\xd1\x32\x70\x0e\x99\x2e\x3e\x2b\x1d\x4d\x06\x30\xaa\x27\xb4\x73\x6d\x51\x9e\x42\xb9\xef\xf4\x33\x97\x43\x1b\xce\xf8\xd9\xf1\x0e\x4f\x20\x26\x26\xe2\xd4\x4e\xb3\x37\x68\x46\x46\x47\x4a\xe8\x31\xe1\x7d\x84\xbd\x3e\xa9\x93\xb1\x44\x04\xb9\xfb\x01\x5e\xf2\xeb\x53\x20\x17\xa0\x36\x82\xc9\xa3\xef\xaa\xd3\xee\xa2\x00\xc1\xb4\x36\x13\x29\xc5\x83\xde\xb5\xc6\xd4\x7e\x9c\x7b\xf5\xd4\x42\x1b\xef\x6a\xb8\xd9\x34\xd3\x80\x03\xb5\x5b\x87\x72\xc5\xdd\xd5\x8f\x1f\x1d\x3b\x4b\xea\x47\xa5\x5a\xa4\xde\x6c\x63\xe1\x79\x25\x51\xb0\x85\xd9\x9a\x05\x31\x53\x2a\x3e\x2c\x03\xc8\x1d\x9a\x44\xe6\xd3\x5d\x03\x09\xeb\xb6\xa9\x57\x83\xcf\x39\x74\x1f\x56\xc2\xf8\xb0\xe9\x04\xe4\x49\x95\x0b\x14\x39\x6a\xf4\x98\x1c\x6e\x33\x51\xe8\x89\x5f\x95\xb3\x8d\x7d\x39\x1f\x73\x35\xd1\x4f\x64\x14\x99\x56\x7f\x74\xc6\xa7\xe1\x4d\xc3\xa0\x2e\x9c\xb0\x01\xf2\x6c\x84\x0f\x8e\x2e\x5c\xa0\xfc\xd0\xa6\xef\x56\x7e\x88\xec\x14\x16\x66\x7a\xd1\x35\x34\x1b\x82\x23\x9d\x77\x17\xf1\x28\x26\x81\x40\x11\x36\x9c\xd6\x0b\x6d\xbc\x39\xd5\xda\x0f\xe0\x80\x62\x65\xe2\x13\x8c\xf2\x3b\x5c\x07\x1e\x5e\x04\x4e\x4c\x57\x7e\x28\xc6\xb5\xe4\x3d\x1d\x49\x57\x08\xe6\x9b\x43\xdb\x14\x5d\xd8\xc3\x9d\xbe\xd4\xf4\xb5\x9f\xa5\x09\xe1\x22\x03\x35\x79\x8e\x2e\x44\x02\xab\x3c\x37\x25\xde\xaa\x1a\x35\xb2\xf8\x6b\xa8\x65\xaa\xed\xa4\x02\x2c\x2f\xd0\x45\xab\x93\x0c\x06\xaa\x46\xe2\x21\x53\xde\xaa\xb4\x52\x2f\x1e\x8a\x3b\xd3\x14\x0a\x6a\x8b\xcd\x19\xf8\xae\x79\xa4\xb9\x28\x0a\xe8\xd9\xec\x1f\x76\x05\xe9\x15\x7a\x71\xd2\xfe\xb0\x29\x80\x43\xc2\x99\x61\x4a\xf4\x0b\xb8\xdc\x83\x61\x80\x36\xfc\x96\x17\xf9\x48\x8b\x17\x89\xef\x8b\x08\x4f\xc3\x30\x4c\xdf\x27\xf6\x0b\xb3\xcc\x2c\x2e\x7e\x99\x14\x65\x5b\xa5\x3d\xf2\xcb\x27\x3b\x76\x36\xf2\xb0\x25\x79\x03\xbc\x8b\x48\xae\x0d\x54\x9d\x67\xef\x8b\x61\xf3\x4d\x94\xb6\x82\xd3\xb9\x8a\xdc\xa7\x84\xa6\x10\x06\x3d\xd6\xe9\x59\x7e\x44\x52\x89\xee\x23\xce\x7e\x06\x15\xe2\x8f\xc7\xa6\xc0\x13\x8e\x69\x7a\x11\x84\x3c\xeb\xd6\xbe\x19\x86\x0a\x76\xa4\xc7\x0c\xe5\x2b\x8d\x12\x2d\x3e\x53\x52\x80\xd6\xa8\xaa\x1b\x53\x61\x65\x62\xb5\x59\x70\xf1\x10\x97\xf5\x34\x66\x52\xdc\x4d\xd3\x09\x9e\x8d\x4f\xaa\x12\x1e\x31\xbc\xcc\x05\x80\x45\xbe\x92\x34\x2f\xd1\x53\x52\xbd\xf0\x1b\x99\xcf\xd9\xb5\xc8\x37\xbf\xef\xb7\x1d\x6a\x2e\x80\x66\x92\x7a\xdb\xa4\x58\xd1\x9a\x3b\x61\x8c\xec\xed\x4a\xf4\x1e\xe4\x9c\xad\x4e\x4f\xa9\xaf\x82\x0e\x51\x40\x10\x31\xe0\x05\x97\xaa\xc5\x32\x34\x9b\x60\xd1\x5d\x21\x1a\xb9\x50\x79\x82\xe2\xf0\x3b\x7f\xf4\x35\x74\xaa\x07\x43\x9c\x8f\x17\x4b\x41\x0b\x96\x2d\xba\x5f\x18\xde\xf3\xcb\x93\x6d\x8a\x5d\x50\x87\xbd\x1e\x59\xa1\x38\xdd\xfa\x26\xd5\xf3\x2b\x3c\x91\xb8\x43\x06\xaf\x59\xeb\xe8\xe9\xd3\x87\x21\x21\x00\xa8\x72\x61\x7f\x50\x5f\x20\x81\x78\x07\x29\x8b\x50\xd6\x26\xd0\x5e\x29\x19\x14\x31\xba\xa5\x78\x98\xc8\x93\x80\xed\xbb\xf0\xc3\x92\xaf\xfb\xf6\xf9\x96\xf2\x24\x5e\x78\x68\x55\x02\x8b\x2f\x02\xe8\x4d\x78\x88\xa8\xca\x3f\xfc\x48\x25\x3f\xb3\xc0\x51\x47\x6d\xdf\x92\x9d\xd1\xa4\x78\xa0\x98\xc7\x1c\xef\x38\x44\x87\x03\x5d\x95\x3e\x18\x40\x1d\xc0\xc4\x65\x4e\x8e\xca\xcb\x69\x67\xf3\xe8\x7d\x58\xe1\xa3\x68\x55\x74\x34\xdb\xea\xda\x34\x62\x8e\x61\xc4\x67\xf2\x84\x3a\x37\x9c\x84\xf4\xab\xac\x1e\x41\x47\x1e\xb7\xd6\xcb\x56\x0e\x09\xde\x45\x70\xa1\xa2\x35\xb0\x36\x9d\x5a\x8f\xd4\x61\x26\xd2\x0d\x61\x59\x2f\x85\x13\x0e\x72\xcd\x93\x53\x3b\x55\x62\x55\x8d\x12\x0c\xc6\xf6\x5f\x4c\xe3\x5c\xfa\x4b\xe5\x6d\x11\xdc\xe7\xe7\xf8\xb8\xe3\xe0\x61\x3a\xeb\x02\x64\xfa\xda\xcd\x24\x7c\x9f\xad\x77\x19\x74\xd6\x31\xff\xa4\x9c\xc8\x2a\xc7\xbe\x9f\x33\xed\x6f\x8d\xa9\x7b\x60\x5f\x7b\xab\x7d\x3c\x1b\x9b\x70\x31\xb4\x5c\x1d\x91\x61\x2f\xc4\x31\xfb\xc8\x8e\x05\x70\xcf\xf2\x08\xf1\x87\xeb\x82\xe1\xe0\x62\xe4\xa8\xa7\xb0\xf2\x7d\x78\x9f\x88\x9a\x49\x36\x54\xfa\x55\x56\x9b\x62\xe3\x66\x96\x29\x99\xbb\x75\x47\xcf\xb2\x9e\x38\x3f\xaf\x55\xe4\x95\x96\xca\x48\x4e\x96\x2c\x06\x1b\xae\x61\x4b\x46\xc0\x53\x24\x37\x9e\xb1\x0f\x8b\xc8\xa0\xbd\x5f\xcf\x29\xdb\x55\x39\x22\xd5\x2d\x2d\xea\x73\xb9\x48\x26\x51\x3d\x8e\x82\x14\x75\xaa\xc2\xec\x10\x87\x98\x58\x7b\x67\xc8\x3d\x31\xf3\x4a\xc8\x99\x2b\xaf\x27\xef\xf0\x08\xd5\xdf\xd2\x5d\xa8\x39\x5f\xba\x51\x0e\xa6\xd9\xd8\xdd\x01\x72\x3b\x36\x3b\xe8\xc2\x58\xbc\x0f\xb1\x40\x55\xd7\x4f\x2d\xed\xef\xfa\xf3\x19\x6a\xd7\x11\x5f\x23\xe7\x4b\x36\x8d\x16\xc2\x11\xc4\xf6\xee\x2b\xae\x8e\xbf\x09\x0e\xbb\x0b\x1a\xb9\x4d\xaa\x62\xa0\xe9\x96\x6c\xfe\x28\x0a\x29\xb5\xaa\x19\xbb\x1b\xa9\xe7\xad\x7b\x8c\x7b\x7d\x12\xd7\x22\x82\x7e\xca\x47\x2b\x18\x72\xbf\x4a\x50\xe4\xa4\x98\x10\x0a\xce\x3b\xa6\x49\xcb\xc8\x68\x3b\xd4\x2e\x80\xcd\x9e\x33\xd0\x5c\x75\x44\xa7\x31\x83\xe1\x89\xf4\xe5\x2c\xc6\x6b\x2e\x0c\x6e\x6a\xe4\x08\xdd\xca\x5b\x49\x21\x9b\x68\x91\xd4\xc9\x22\xb7\xe6\x10\x20\xdd\xba\x56\x50\x23\xaa\x4a\x29\x84\x4d\x8b\x2a\x45\x47\x13\xc1\xa0\x8d\xae\x27\x4b\x31\x53\x37\x75\x5f\x4b\xe6\x5d\xf9\xe1\x3d\x02\x71\xf5\x72\xe2\x3e\x45\x78\x4f\x05\xb6\x64\x2f\x7a\x7b\x5e\xc7\x12\x8a\x62\xdf\x49\x94\x48\x49\x86\x23\x1b\x02\x0d\x18\x2d\x6d\xa5\x71\xc7\x2d\x22\x45\x7f\xed\xa4\x80\x87\x53\x85\x7e\x0b\x6a\x68\x12\x01\x63\x63\x78\x79\xc3\xcb\xb4\x9d\x81\x89\x9d\xe5\xa0\x14\x65\xfe\xfa\xda\x68\xa2\x09\x6b\x35\xe2\x74\x6e\x78\x52\xe5\x9b\x1a\x83\xbb\x19\x5d\x3f\x9d\x40\xcd\x55\x54\xf3\x6a\x95\xe2\xc1\xcd\x5a\x42\xc8\x71\xa8\x0c\x58\x67\x40\x96\x78\x0d\x3c\xaa\x75\x09\xa5\x2f\x4d\x82\xf7\x31\x00\x8f\x6f\x6e\x40\x27\x0e\x88\x51\xc4\x6c\x49\x96\xa9\xad\x6a\x77\x45\x9c\x88\x62\x5c\x4d\x04\xb1\xac\x6d\x3f\x22\xc3\xfc\x33\x9a\x3b\x9d\x0e\x78\x15\x98\x18\xc3\xa2\xc2\xc0\x81\x97\xde\x8f\x14\x8b\xfc\xd6\x81\xbe\x3d\x92\x26\xbb\x84\x96\x60\x9e\xf0\x3b\x30\x9f\xfc\x80\xf6\x9e\x8c\x20\x8e\x9f\x81\x80\x0e\x1d\x2d\x50\x44\xa0\x7b\x32\x6d\x1a\x71\xc0\x57\x43\x72\xe7\xbc\x61\xec\x88\x17\x2a\xc1\x96\xf1\xf6\x33\xd2\xcb\x40\x7f\xdf\xa3\x3e\x0c\x1e\x24\xc8\x15\x0f\xa7\x8f\x86\xd9\xb5\xb6\x2b\x99\x4a\xc6\x12\x3e\x2f\xd8\xde\xa5\x9c\x03\xe0\x97\x2c\x87\x42\xa0\x09\x38\x7c\xd1\x5e\x79\xfe\xd7\x39\x38\xb8\x65\xc2\x93\xa2\x92\x6a\x38\xcb\x4f\xb2\x3f\x48\x27\x03\x77\x09\x45\xbd\x8f\x91\x37\x3a\x49\xe8\x3b\x27\x68\x2f\x89\xd7\x32\xb5\x96\xcc\x97\x18\xfb\xba\x1b\xb0\xb9\x2b\x44\x9c\xae\x10\x64\xea\x8e\x21\xd8\x10\x82\xb1\x57\x36\xa7\x8d\xc1\x00\x6a\xe4\xe0\xca\xb4\x4f\xbe\xc8\x07\x58\xb8\x6e\x7c\x8e\xac\x88\x9d\xb5\x81\x37\xf9\x34\xe0\xc2\x15\x49\x08\xe9\x2d\xb8\xc8\xb4\x1c\x78\xd8\xe2\x63\x41\x57\xe6\x0d\x2a\xc9\xf0\x33\x39\xbf\xa9\xcc\x03\x92\x4a\x09\x03\x32\xcf\x3a\x76\xe0\xf1\xeb\xd1\x97\x28\xce\x98\xb0\xdc\xb8\x23\x52\x3f\x7b\xdb\xc7\xf9\x44\x54\x7a\x1b\x4a\x7e\xc8\x10\x9e\x82\xa7\xca\x7b\x94\xee\x12\xd1\x26\xf9\x95\xde\xa6\x15\xcd\x70\xd0\xc5\x5e\xed\xa2\x0a\x72\xfc\xde\x13\x70\xa5\x7c\x21\x6f\x43\x58\x04\xa3\x75\xeb\x62\x4b\xb9\x53\xdf\xac\x54\xf5\x7b\xe6\x15\x8f\xbc\xe6\x71\x6b\x07\x30\xd1\x2f\xc1\x31\xb1\x37\x07\xbd\xcd\x2e\x51\x92\xad\xf8\x8e\x10\xf0\xf2\x2b\x95\x78\x02\xc1\x16\x53\xb2\xab\x44\xc1\xb2\x11\xd0\x94\xa1\x04\x0a\x25\x40\x31\x5e\xea\xd3\xe2\x20\x35\x7c\x47\x53\x46\x4e\x08\x7c\x07\xde\xb8\xbb\x7f\xf6\xc2\x07\x25\xcb\xe9\xc1\xd1\x19\x6c\x65\xac\xb9\x57\x35\xca\x32\xba\xf8\xcd\x3a\xab\xe0\xdb\x0c\x2c\x19\x5e\x06\x63\x83\xb9\xc5\x05\x2b\x41\x69\x7d\x7c\x97\x7f\xdc\xe3\xcf\x1c\x93\x0e\x73\x0e\xcd\xaa\x6a\x24\x23\x4c\x60\xfc\x42\xee\x52\x1b\xb0\xd9\x17\x70\x5e\x26\x28\x47\xab\xe5\x1b\x6a\xd0\x9c\xc7\x15\x59\xed\xfa\x8a\xcd\x9f\x7b\xc0\xea\x79\x0c\xbd\x5c\x9e\x89\x85\x02\x4b\xf4\xcb\x95\xef\xb0\x92\xbd\xd1\xe0\x2a\xa7\x45\x31\x94\x65\x32\xc2\x57\xa7\xda\x3e\x84\x2a\x3a\x6a\x75\x3e\x0c\xa9\xd7\x83\x6a\x91\x39\x88\x90\xdf\x5e\x9d\xc6\x70\x0a\x80\x5d\x25\x0c\x12\x60\x28\xca\x17\x23\xfa\x5a\xaf\xce\x56\x38\x76\xe5\x73\xe5\x3b\xa0\x99\xe9\x7a\x15\xc1\x19\x2e\x03\x0b\xef\x3d\xd1\x03\x5f\x21\xf0\x80\x62\xa4\xd1\x1b\x6a\xb2\xa9\x06\xec\x58\x00\x34\xa4\x60\xbf\x11\xe5\x97\x24\x69\xab\xd2\xe5\x97\x2b\x9a\x58\xb9\xa7\x1d\x0c\x66\x4f\x3f\x1d\xdb\x21\x38\xb4\x0b\x2c\x87\x50\x87\x71\x94\xed\x24\xfa\x2b\x02\x13\x6d\xff\xb2\xaa\x12\x4c\x37\xfe\x8e\xcb\xed\xe7\x0c\xc9\x00\xda\x6f\x3a\x89\xd7\x9e\x33\x05\x41\x04\xba\x23\xf0\x98\xfa\x3c\x4b\x7a\x12\xde\x4a\xa1\xdb\x7e\xcf\xd7\x1f\x36\x7a\x4f\x43\x35\x44\xd0\x44\xb9\xcc\xfc\x94\x60\x05\xd6\xd5\xc2\xb7\x66\xb1\x36\xf4\x69\xa5\x28\x14\xe7\x5d\x06\x2d\xeb\x84\x48\x54\x16\xb9\x2c\xca\xf4\x18\x04\xce\xf7\xac\x5f\xf6\xb2\x9f\x58\x94\xec\x27\x86\xa7\x5b\xd3\xc4\x65\x9f\x49\xf2\xda\xad\x74\xe2\x0a\x74\x1d\x10\x53\x24\x22\x13\xfc\x8e\x5e\x08\x0c\xf4\xdb\xa4\x68\xa5\x50\x6f\xe3\x5a\x80\x30\xad\x7a\xc5\xac\xb5\x2f\x8b\xb3\x26\x32\xb0\x2d\xba\xbd\xcf\xe8\x3f\x82\x62\x26\xc4\x5b\x56\xbf\xda\xbb\xa3\x0c\x7e\x51\xbc\x26\x42\x91\x7e\x00\xa0\x25\xf1\x7a\x67\x6f\x87\x61\xcf\x85\x85\xd2\x15\x04\x80\xfb\xed\xce\x22\x1a\x2a\xaa\x9c\x27\xc5\x82\x68\x98\x1e\xdb\xa1\xc0\x18\x70\xc9\xcb\xbb\xf2\xd4\xb6\x25\xc0\x46\xa9\x04\x99\xfb\x70\x4f\x3b\xee\x01\xc9\x57\x64\x6d\x79\xf1\x1a\x16\x88\x4c\x70\x20\x51\x1b\x49\x00\xa5\xf6\xa2\x06\x48\x60\x20\x2b\x5d\x3d\x28\x4c\xa2\xc5\xac\x8d\x14\x73\x59\xdd\x32\x22\x8c\x63\xe0\xbb\xf1\xb9\x2d\x55\x3c\x03\x63\x65\x0f\x80\xc9\x54\x39\x56\x85\x16\x29\xeb\x8c\xc0\x0d\xe2\xdb\x45\x84\xdc\x7a\x1f\x03\x01\x3a\x30\x62\x16\x5c\x92\x27\x45\x18\x09\x01\x40\x67\x9f\x93\x99\xa9\xe9\x86\xec\x4f\x1f\xb6\x77\x04\x76\x8f\xa6\xfb\x98\xdc\xe9\x09\xc1\x0d\x88\x26\x73\x6a\xa5\xc1\xac\x3f\x00\x04\x7e\x72\x94\x56\xa2\x8f\x81\xf4\xd1\xe8\xe6\xb5\x2b\x31\x9e\x42\xac\x2f\x45\x53\x22\xc7\xd4\x19\xd3\x69\xae\x24\x7e\xe0\x88\x7c\x4a\x8a\x02\xc5\x05\x74\xc6\x45\x89\x5f\x46\x93\xee\xb1\x22\x38\x8f\xf7\x08\x48\x3c\x94\xc9\xdf\xb9\x5c\x41\x8d\xb5\x5e\x15\x8d\xe2\x20\xe9\x83\xb7\xc4\x0c\x17\xf5\xd5\x56\x04\xaa\x36\x47\x07\x6f\x6b\xc0\x17\x5f\x41\xc5\x3e\x4a\x47\xd2\x4e\x4c\x83\xc6\x6f\xc5\x68\x13\x7b\xe1\x8d\x59\xbd\xda\x07\x14\x85\xd1\x79\x78\x1b\x98\x38\xea\xce\xa2\xbd\x91\x5e\x17\x6a\x4b\x03\x53\x87\x60\x55\x9c\x46\x23\x39\x88\x58\x97\x18\x13\xe5\x55\xc5\x9a\xd6\x26\xd4\x5a\xb4\xd3\x0f\x52\x63\x32\x38\xe5\x41\x64\x01\xcd\x6a\xcd\xc9\x38\xd9\x79\xe5\xba\x28\xdf\x6b\xd1\xd3\xe7\xd7\x30\x18\x80\xea\xad\xe1\xba\xfb\xb4\x23\xce\xa1\x3e\xc6\xdf\xfe\x1b\xf1\xf3\xd7\x3e\xc0\x6e\xf5\xbf\x95\xa6\xf5\x2a\x70\x85\xf2\x5b\xb9\x98\x65\x5d\xe8\x96\x01\x6a\x75\xed\x4c\x2d\xbb\xd1\xb7\x99\x84\x2b\x28\xc8\xea\xa2\x16\x54\x83\x16\x31\x51\xcd\xbb\x10\x2f\x52\x89\x28\x2e\x72\x07\xc1\x92\xa0\xd1\x80\xe4\x23\xfb\x27\xb7\xdc\x04\xed\x8d\x68\xd1\x4c\x18\xa5\x21\x0f\x53\x8a\x9b\x6e\xc8\xbc\xed\xa6\x42\xda\xd6\x1c\x45\xa2\x62\x53\x76\xf0\xd6\xbd\x33\x58\xae\xc3\x85\xd0\x12\x52\x43\xf2\x6b\xcc\xf7\x12\x86\x9b\x29\x60\x1e\x33\xb8\x01\x61\x73\x8f\xc4\x16\xba\x53\x08\xe7\x7d\xbc\xe2\xc7\x07\x58\xcc\x6c\xe5\x6d\x5b\x58\x90\x44\x44\x7c\x3d\xb3\xeb\x31\x8b\x4f\x2c\x4a\x51\x80\x6f\xe8\xc3\x29\x34\xb4\x2d\x74\xb8\xee\x7c\x71\x04\x4d\xac\xaa\xf5\x1a\x78\x08\x6f\xf7\x2c\x99\xb8\x37\xb0\xec\xc9\xfd\x7e\xc3\x81\xd5\x86\x08\x82\xd6\xcb\x51\xd3\x4d\xd3\x6d\x0f\x56\x24\x79\x4f\x1a\x40\x00\x56\xcf\x13\x93\x01\xd1\x86\xd6\xe2\xc0\xd5\xd1\x98\x90\x1e\x15\x49\x65\xaa\x44\xef\x15\x2c\xd7\xf9\x0f\x3a\xed\xa7\xb6\x45\x5d\x00\x5a\x0a\x2e\x53\x28\x8e\x05\xb6\x6d\xd7\xd1\x0e\xb5\x8a\x67\x96\xa3\xc9\x97\x61\x1f\x1e\x9f\x77\x36\x49\x03\x37\x5d\xb6\xe6\xd5\x30\x86\xfc\x27\xef\x3e\x05\x60\xbb\x11\xda\xd3\x96\x12\x09\x72\x64\x77\xb4\x6b\x28\x38\x8f\xf5\xe5\x3d\x45\x1d\x2f\x84\x87\xbb\x8d\x01\x80\xbd\x7c\xe2\x07\xf7\xc4\x61\x8f\x29\x70\xb8\xad\x66\x8d\x12\xa0\x71\x5b\x55\x0a\x9d\x00\xbc\xe2\xd6\x5c\xdd\x8c\x55\x4d\x0f\xce\x30\xff\xed\x27\xd8\x0c\x73\x70\x39\x73\x0f\x94\x65\x59\x3e\x23\xdd\xd6\xfc\x57\x1f\xbe\xc5\x4e\x71\xfc\x57\x5f\xbe\x46\x8c\x74\x45\x87\xe0\x49\xfd\x42\xc6\x12\xfe\xdb\x17\xe0\xfe\x56\x15\xfe\xd5\xbf\x28\x3a\x75\xcc\x93\x04\xf9\xc5\x3c\x03\x5d\x12\x48\xf2\x60\x0f\xf7\xad\x28\x33\xed\x2b\xf3\x8e\x58\x73\x43\x53\xa7\xd7\x5f\xdf\xaf\xc6\xf0\x83\xe7\x1f\xfc\xf3\x9b\x1c\x20\x7b\xdc\xd7\x6e\x8f\xf2\x59\x77\x58\x7f\xc3\x99\x2d\x2a\xd2\xf0\x69\x0c\x0d\xac\x93\x65\xfe\xe6\x76\x53\xec\xa4\x7d\xd8\x70\x4f\x91\xc6\x5b\x48\x08\x87\x48\xfc\x9e\x5f\x14\x55\x3d\xef\x5f\xf9\xc9\x66\xd2\xe9\xe8\xf5\x78\x1a\xaa\x0a\xfc\x74\x3f\x1c\x9e\x5e\x76\x21\x6c\xba\xce\x74\x8d\x22\xb7\x9e\x25\xde\xf8\x4c\x3c\xa3\x09\x12\xc7\x61\x7c\x99\xe3\x0f\xd3\x29\xdd\xb7\xf3\x99\xa1\xab\xdc\x21\x29\xca\x11\x3c\x53\x06\xc8\xdd\xfe\xc9\xe5\xcc\xf6\x15\x14\x82\x22\xf4\xb3\x84\xcf\xfe\x5c\x7d\x7e\x77\xa6\x52\x46\xae\xed\x77\x6c\x76\x71\x02\x44\x7c\x05\x6a\x33\xf9\xca\x54\x37\x73\x34\xfe\x26\x35\x56\x08\x18\x77\x27\x9a\x10\xc2\x3f\x8f\x11\x94\x2b\xcb\x60\x49\x3f\x09\x6d\x82\xac\xd1\xd3\x61\x52\x32\xd4\x54\xf1\xaf\x54\x51\x24\x51\xc9\x71\xf8\xc8\x64\xae\x88\x83\xd5\xdd\xae\xe8\x15\x2d\x36\x20\x2f\xac\xb9\x51\xdd\x4d\x25\xc8\xcc\xf5\x5d\x4e\x60\x6f\xf1\x40\x14\xe2\x4b\xaa\x49\xb6\x53\x4a\x13\xa7\xff\xca\x18\xf6\x2a\x31\x5c\xc4\x50\xc1\x1a\xf9\x2a\xef\x28\x25\xbb\x51\x1b\x99\x38\xc5\xf1\x26\xbc\xd1\x89\xfe\x2d\x6c\x09\xa0\xae\xab\x77\x51\xd9\xda\x2a\xca\x0e\x06\xbd\xc9\xde\x24\x39\xcf\x42\xf2\x7a\xdf\x57\x7b\xd3\x70\xac\x33\x52\x74\x40\xca\x46\xfd\xb5\x52\xa4\x99\x82\xa4\x11\x91\x4a\x26\xe5\x50\x49\xa3\x7a\x41\x39\xfb\x7b\x74\x6a\x78\xc2\x8a\xa8\x62\x91\x56\x24\xc5\xa6\x49\x11\x62\x00\x28\x88\xf3\xbb\x90\x3e\x21\xc9\x15\xd3\x1a\x95\x68\x5b\x00\xac\x2d\x76\xa8\xb1\xce\x5f\xfc\xb5\x1f\xf1\x3d\xca\x36\xbd\x46\x03\x77\xae\xa9\xf2\xa0\x4d\xbd\xd5\x3e\x28\xe6\x14\xad\x43\x9e\xbd\xd6\x60\xae\x13\xb8\xa2\xde\xd2\xdc\xee\xb9\x55\x80\x6d\x11\xcb\xf9\xb1\x2e\x02\x14\x90\xa4\x78\xf3\x13\xaf\x13\xb8\x2d\x15\xe9\x24\xc0\xc4\xa8\xe5\x15\xb0\x93\xa6\x2e\x56\xd6\x82\xed\xe1\xff\x19\x81\x19\xce\x53\xee\x84\xb8\x2e\xf5\x0a\x24\x0c\xdb\x63\x7d\x0c\xf0\xb5\x91\x01\xb0\x56\xc0\xfa\xf9\xd5\x14\x99\xb2\x16\xa0\x53\x01\x4c\xf8\xdc\x91\xf1\x75\xd2\x9f\x07\x07\x16\xea\x18\x23\x2c\x7e\xcb\x75\x14\x0a\x89\xac\xb9\x86\xae\x91\x63\xe2\x76\x43\x46\xd6\x78\x8b\xa3\x6d\x19\x73\x98\x34\x5d\x98\x3b\x46\x23\x9d\x57\x4e\x6c\xa0\x1d\xcc\x55\x18\x5c\x29\xfc\x88\xfa\xe1\x71\x65\x32\x64\x9f\x8f\xf1\x63\x18\x19\xfe\x6d\x4e\xc4\x33\x7d\x6b\x75\x76\xd2\x08\x73\xa0\x9d\xec\xfc\xe4\x5b\x70\x06\x12\x07\xc1\xe2\xbc\x20\x7f\xdf\xf8\x8c\x1b\x8b\x7d\x14\xe2\xbf\x0e\x1a\x78\x1b\x3e\xf1\x11\x7a\x8b\x19\xed\x80\x09\xce\x18\xd3\x91\x4d\x89\x48\x36\x81\x50\x59\xe2\xfb\x78\xde\x2d\x2d\x4e\xbe\xe2\x1d\xeb\x59\xac\xb4\x9f\xa3\x34\xbc\xd3\xf2\x0e\xd7\x1b\x94\x14\x7c\xab\x9f\xcb\x36\x61\x23\x36\x71\xa7\x4d\x41\x08\x01\x92\x8c\x1d\x58\xd9\x80\x6d\x32\xb2\xc0\x5d\x66\x16\xe8\xeb\xa5\xb1\x18\xf7\x00\xcb\x62\xfd\x63\x18\x91\xff\x2e\xd8\xb0\x4c\x30\x24\x28\x80\x20\x22\x80\x3e\xcb\xb3\x2c\x8a\xe7\xe7\xfc\x3c\xe5\x67\xb7\x76\x1f\xf7\x1d\xf4\x33\x04\xde\xf9\xd9\x96\x0d\x29\xfd\xc3\x74\x8b\x1c\xbd\x72\xcb\xd6\x9d\x3c\xba\xbf\x46\xbe\x63\xd9\x35\x88\x9e\xad\x9d\xfb\x2e\x15\xa9\xb5\x5b\xb9\xb5\xdb\xb2\xa9\x5d\x7d\xf4\xf6\xc4\x06\x3b\xe0\xbe\xc5\x1b\x94\xc1\x12\x4b\x5e\x9e\x56\xbf\x6c\xbe\x33\x0f\xbb\x2d\x65\xd6\x15\x03\x0e\x8c\x02\x49\xb7\xd1\x53\x41\xc3\x07\x32\x9e\xba\xe1\x96\xfe\xbd\x09\x3d\x3e\x96\xb0\x7a\x70\x1b\x6d\xf3\x0b\x2f\x08\xf9\x2b\x90\x1d\xdf\x69\x32\x35\xad\x22\xcc\x08\x1d\x45\xc0\xda\xae\x65\x66\xea\x6b\x56\xb3\x8b\x81\x33\xe5\xbc\xe4\x62\xfa\x7a\xbe\x48\x9a\x0e\x7e\x9e\x26\xf6\x32\x87\xf9\xf8\xb6\x6c\x41\xa2\x28\x88\x44\xc4\x63\x0c\xa5\x16\x78\x8a\xfd\x76\x66\x40\x50\xdb\x3a\xfd\x2a\x27\x0b\xda\xe7\xcb\x35\xa6\x12\x1f\x40\x35\x3a\x88\xc8\xf0\xe0\x25\xcd\xe6\xaa\x38\x35\x2f\x3f\xbb\x46\xad\xaa\xaf\x4a\x58\xae\x66\xa8\x9e\xaa\xea\x71\x10\x52\x40\xf4\x02\xaf\x8d\x52\x42\xe0\xa7\x94\x2c\x06\xd4\x3d\xd8\x0c\x20\x1e\x57\xa4\x08\x76\x5d\xed\xb0\xec\xc0\x41\x7b\x2d\x2d\xb2\x97\xfa\x0e\x40\xb4\x66\xe6\xc8\xdb\x6a\x49\xab\x35\x11\x52\xc8\x70\xdd\x2d\x81\x23\x53\x76\xfa\x4f\xdc\x6d\x37\xbc\x9d\xf4\xb1\xa4\x54\x41\x43\xe6\x3a\x19\x51\xca\x19\xac\xba\xd7\xea\x16\x27\x42\x38\x40\xc6\x64\x1c\x06\xd3\x7d\xd8\x6f\x4d\xf0\xc7\x13\x0a\x8b\xb2\x8a\xf5\x98\x17\xa3\x74\x83\xfc\xec\xb5\x3f\xba\xd2\xf4\x3a\xfe\xeb\x21\x84\x8d\xe0\x6e\x41\x0d\x3f\x5f\x09\x24\x3e\x50\x1e\xd5\x7f\xfc\x74\x69\x7a\xc2\x9e\x41\x9b\x8b\x56\x57\x3b\xf4\x89\x66\x02\xda\xc9\xaa\x39\x82\x5e\xdd\x0c\xa3\xd5\x53\x0c\x3c\xe9\xe6\xfd\x36\xe5\xfd\x79\xb2\x38\xca\xb2\xdf\xb4\x31\x30\x7f\xca\x40\xee\x17\xf9\x90\x5d\xfd\xb6\x4d\x24\xf6\xdb\xee\x98\x64\x62\xcb\xcc\x1d\x6b\xf7\x24\x80\x75\x2b\xcc\xa9\x70\x4b\x00\x7b\x1a\xec\x45\xf4\x09\x18\xd9\xe5\xef\xba\xcd\x7e\x4d\x66\xdf\xca\x7b\x6b\x29\xa5\x8e\x10\xeb\x4c\x8f\xe8\x3f\xca\x93\xfd\xb4\xec\xd7\x57\x4d\xb0\xc5\x17\x6a\xc4\x61\x7d\x1c\x6c\x94\x72\x58\xc5\x75\x15\xcb\x03\x42\xf8\xba\x1f\xa1\x0c\x9f\xbd\x68\x6b\x38\x68\xb0\x12\xb1\x67\xc8\x68\xfa\xc4\xe7\x83\x5a\xf6\x4e\xd5\x4f\xc2\x6b\x17\x40\xe8\x56\x1c\x8c\xca\xb3\x20\xab\x8b\x6a\x04\x9c\x71\x24\xfe\x9b\x04\x5e\x1a\x58\x69\xb8\x4f\xdc\x1c\xb9\x83\xb1\xa8\x0e\x14\xf8\x92\x10\x04\xbf\xca\x7f\x24\x7a\x84\x93\x27\xf5\x73\xa0\xb5\x15\x57\xe9\xfa\xfc\x83\xe2\x1b\x99\x73\x78\x09\x4b\x98\x4d\x81\x43\xac\x02\xbb\x82\x89\x0a\x0a\x23\x58\x89\xe8\x28\xa2\xe3\x04\x58\x3f\x70\xb9\xee\x92\xbd\xa0\x83\xb9\xdc\x7f\xad\xc0\x3f\xfb\x91\xb5\x18\x36\x66\x98\x99\xb1\x6e\xe6\xf7\x2f\xb5\x86\x61\x70\x46\xde\xff\x6c\x40\x9e\x71\x62\x86\xb9\x19\xb6\x34\x56\xa1\xdf\x61\xf3\xee\x19\xbf\xc9\x29\x5f\x91\x79\x51\xe5\x7f\xa7\xd8\x14\x34\x53\x0d\x9e\x5c\x2e\xee\x0d\x25\xb6\x7c\xcf\xe4\xaf\x61\x7e\xf2\xc0\x1c\x4f\xec\x45\x14\x37\x41\x5e\xf5\xe0\x4c\x81\x60\xc5\x89\xa6\x4d\x5c\x35\xc7\xca\xb3\xfd\xaf\x27\x51\xea\xc5\x69\xfa\xc5\xa1\x5b\x95\x31\x5b\x67\x57\x91\xf9\xdd\x9c\x58\xe9\xee\x11\x47\x32\x9a\xdc\xbc\xb6\xde\xb5\xd0\x63\x4c\x2d\xf5\xb9\xcb\x53\x8c\xa2\x5f\xcc\x28\x8d\xd6\x3e\x48\xbf\x24\x7d\x62\xbb\xd3\x95\x68\x3a\xe3\xe6\x08\x1c\xa1\xb4\xfb\xa9\xe0\x08\xba\xf6\x22\x48\xdd\x5e\x75\xbd\xe6\xb0\xda\x45\xe2\xd7\x28\x80\x63\xf0\xe9\x2f\x7a\x18\x84\xda\xd5\xab\x65\xb7\x29\x46\x31\xeb\xe6\xed\xd5\x94\x39\x43\xbc\x1f\x1c\xeb\xd2\x34\xd5\xa5\xe1\x75\x48\x7c\x91\xa6\x57\xe0\xcf\xc7\x57\x8d\x55\x4f\x89\x21\x06\xb7\x5e\x3e\xf3\x73\x07\x37\x9d\x74\x45\x93\x69\x36\x3d\x27\x5d\xaf\x8b\xf1\x1f\x1e\xa1\x92\x0e\x2c\x06\xaf\x36\xbe\x98\x04\xad\x33\xa8\x56\x15\x7c\x35\x27\xfa\x79\x8f\x24\x78\xf6\xc3\xf1\x4f\x3d\x1a\x30\x1d\x5c\x6c\x5f\x1a\x4f\x38\x2b\x28\x59\x57\x73\xa5\xdd\x36\xf2\x14\x24\xcc\xf4\xd5\xd2\x3d\xbc\xcb\xb1\x0e\xd4\x56\x58\xdd\x7a\x1f\x58\xf8\xa8\x00\x07\xf4\xa2\x51\x1d\x54\xbe\xb3\x58\xf8\xfa\xb4\xce\x81\x34\x8f\x2a\x3b\x81\x14\x7f\xd3\x2f\x0b\x23\x08\x2f\x77\x65\x08\xa3\xf3\x36\x00\xce\xa5\xc6\xbb\x18\x37\xa4\x08\x0a\x6f\x9c\xc7\x64\x8a\xb1\x14\x01\xdd\x1c\x1f\x56\x3e\xc8\x09\x14\x0c\xae\xf5\x65\xd1\x81\x36\xd7\x27\x91\x9c\x70\x89\x27\x17\x11\x23\xf2\x45\x77\xc0\xa2\x55\xe1\x28\xf5\x14\x69\x40\x07\xc0\x68\xfc\xdb\xc3\x3c\xdf\x4d\x64\xb0\xf3\x67\x72\x00\x46\x6c\xdb\xfa\xca\xff\xd5\xdf\x9e\x25\x46\x94\xb1\x4f\x20\xc8\x29\x88\x92\x02\x8a\x7a\x89\x49\x92\x70\xf4\xc0\x24\xfa\x70\xfd\x99\x52\xe5\x13\xbf\xf9\x99\x97\xdf\xcf\xcd\x53\x32\x46\xaa\xa7\x6c\x2a\xf1\x44\x85\xfd\xac\x6d\x4e\xea\xf9\xfb\xee\xac\x81\x73\x38\x9a\x6b\x1d\xcc\x56\x95\x08\x8a\x76\x09\x8a\xc6\x9e\x05\xc0\x9c\x0b\xb0\x9e\xdc\x0d\x0a\x7c\xc6\x82\xc2\xa9\x8f\xa6\xb1\x86\x43\xcb\x42\x44\x98\x12\x24\x0d\x7f\x44\x09\xfb\xb1\xdf\xf7\xcd\x45\x69\x82\xbf\xf7\x55\x4b\xc6\xae\x35\x7d\x91\x9b\xe4\x13\x63\x33\x27\xaa\x15\x27\x4d\xa6\x71\x9f\x56\xf7\x8f\xf8\xed\xd4\x70\xc7\xd4\x60\x13\x65\x38\x85\x3b\xcd\x3c\xd2\xaf\x8e\xe1\x3d\xee\x8c\x0c\xd1\x67\xe4\x18\x2c\x9d\xef\xe7\x59\xf1\xeb\x04\x0f\x1c\xdb\x75\xa2\x00\xd6\x38\x2f\x2a\xdc\x77\xfc\xd0\x3d\x71\x68\x18\x36\x0c\x46\x7e\xc5\x34\x15\x63\x50\x73\xde\x7a\xf0\x62\x13\xea\x31\xa9\xf9\x1a\x5d\x81\x61\x08\xa2\x74\xa7\xec\x06\x55\x02\xa1\x1c\xfb\x6a\x7e\x32\x99\x7e\x21\x39\x6c\x4a\x4f\x6c\x5c\x4e\xbc\xf6\x0e\x6c\x02\x4e\x7c\x58\x2b\x7c\xe4\x4f\xbc\xcb\x0e\x7c\x1a\x4b\xbc\x81\x24\x0e\xfd\xb5\x3f\x81\x14\xf0\xae\x29\xb0\x21\x29\xb0\x31\xa8\xb0\xa1\x95\x4a\x8c\x0f\x4a\x1c\x26\x44\x20\x0e\xb3\x52\xd9\xd1\x32\xbe\xbc\x4a\x07\xac\x48\xcf\x05\x87\x1d\x9a\x81\x6d\x9e\xac\x95\x58\x27\x78\xe5\xfb\xa9\x97\x7e\x79\x9a\xc9\xa4\xb0\xf7\xb5\xbd\x48\x7f\x87\x48\x57\x3a\x54\xdf\x86\x48\x8f\x83\x48\xef\x2d\x50\xf7\xba\xf7\x90\xf5\xc4\x3d\x24\xeb\x9a\xf0\x96\xa4\x70\x05\x77\x37\xcb\x0c\x34\x75\xe0\x1a\x66\x59\x17\x79\x47\xdd\x4c\x47\x9b\x00\x25\xbd\x48\x47\xbd\x8a\x43\x6d\xbb\x45\xdb\x82\x26\x9d\xb8\x45\x1d\xbf\x45\xbd\x7c\x45\xeb\x9c\x24\x6d\x77\x45\xdd\x74\x45\x9d\x70\x45\xbd\x72\x44\x6d\x67\x44\x5b\xeb\x24\xa3\x64\x44\x9d\x60\x44\xbd\xa2\x09\xb6\x06\xda\xb0\xfa\x03\xf1\x7e\xa5\xfd\x75\xe5\xd5\x40\xc5\xd4\x20\x5d\x54\x38\xdd\x1c\xef\x84\xdd\x2d\x4a\xb6\x0e\x4c\x56\x09\x02\x66\xef\x0a\x56\x9f\x33\x2a\x0a\x83\xb9\x4b\x3f\xa6\x4a\xe7\xa4\x4a\x77\xa7\x4b\xcf\xa7\x74\x50\x3f\x7a\x3d\x04\x96\x76\x57\xa3\x81\xfd\xf3\x5b\x20\x57\xae\x82\xd5\xc5\xe1\x15\x2a\x24\x58\xdf\x79\x4b\xaf\x3b\x4b\x5f\x78\x4b\xbf\x61\x54\x0d\x3b\x4b\x37\x3d\x4b\xf5\x81\x6a\x48\xc1\xee\x1c\x31\x76\x72\x38\x05\x0d\xd4\xa1\x8e\x83\xa0\x77\x91\xe6\x7a\xe0\x19\xce\x62\x37\xf7\xe8\x61\x15\xaf\xec\xe0\x9e\x8f\xae\x81\x17\x0b\x41\xad\x13\xf3\xd6\xd8\xbb\x6a\xbf\x6c\xf8\x69\x11\xa8\xef\x9d\x9a\x4a\x17\xae\xbd\x16\x1e\xed\xc3\x63\x14\x00\x55\x51\xe4\xf0\x14\x6f\xc9\x07\x47\x04\xa4\xd5\x8a\x6a\xbf\xbd\x43\xb6\xde\x12\xef\xc8\xb1\x91\xe6\x31\xbb\x19\x4f\x14\xcd\xf9\x4c\xce\xba\x8f\x69\xba\xfc\x18\xbb\xa6\xdf\xe7\xef\x99\x8e\xec\x92\xde\xcb\x95\x08\x87\xa6\x12\x42\x95\x27\xf2\xc6\xa1\x5f\xc9\xc1\x9e\xd1\x9e\x14\x82\x96\x4c\xe5\x6e\x7f\x56\xb1\x18\xe5\xf1\x0a\x17\x65\x66\x72\xf8\x8b\x09\xbe\x2d\xda\x9a\xce\xbc\x71\x86\x92\x35\x74\x6b\xdf\x19\x71\x73\x87\x24\xe7\xf3\x66\xcf\xfc\x6a\xdc\x4a\xe6\xc2\x80\x72\xe6\x25\x3c\x23\x8c\x39\x94\x5a\xa5\x16\x5a\x36\xfb\x21\x34\xcb\x80\x47\xc2\xed\xc7\x34\x93\xc6\x37\x19\x46\xc3\xea\x1c\xd3\xe2\xcd\x74\x82\x74\x9a\xff\x26\x6a\x70\xc7\x44\x04\x1f\xfa\x62\x07\x51\x60\xb3\xaf\x5b\x1b\xc1\xec\xec\x4f\x22\x33\x5d\xc0\x9a\x93\xd4\x20\xd6\xf2\x90\xa3\xb8\x92\xe5\x81\xfa\x82\x02\xab\x62\xf5\x20\xa2\x2c\xa6\xae\x89\x83\x33\x7c\x35\xa1\x5b\x88\x07\x46\x36\x75\xd8\x8c\x90\xb4\xd3\xe7\x13\xa3\xd2\x83\x9d\x55\x45\x62\x8c\x16\x1e\x50\x13\x3f\xe2\x80\xa2\x70\x9c\xaf\x63\xe9\xba\x3c\x17\x3b\x0c\x01\xac\x51\x87\x30\x57\xa3\x8d\xa1\x71\x7f\x97\x13\xe3\x9b\x94\xc7\x58\x24\xb9\xbb\x51\xfb\x68\x3c\xe3\xae\x97\xcf\xaa\xba\xc8\x79\xbe\x1e\xa3\xa6\x54\xfa\x59\x3c\x7e\x87\x92\x6b\x31\xf4\x5e\x44\x23\x65\x8f\xc5\x0a\x54\x41\x9c\x4b\xa0\x85\xf9\xde\xd6\x41\x77\x7c\x46\x8e\x47\x82\x07\xd7\x0c\x79\x92\xfc\x8a\xf3\x89\xbd\xd9\x14\x22\x86\x5d\x3a\xe1\x3d\x69\x88\x42\x12\x0d\x80\x26\x59\xde\xfc\x9d\xef\x28\x83\x64\x73\x4e\x9e\xe3\x56\xef\x62\x18\xec\xd9\x3d\x2d\x24\xe6\xce\x79\xbd\x17\xc4\x67\x8a\x27\x2f\x51\xf4\x4e\x99\x6b\xa7\xcd\x4a\xaf\x8e\x4d\x97\xd9\x75\x2f\xbe\x5b\xca\x58\x04\x52\xe7\x99\x57\xe7\x15\x9c\x37\x88\xcc\xd5\x98\x7c\x19\x93\x89\x4f\x56\x5d\x8b\x7f\x4e\xfb\xdc\xe9\xaf\x8b\x5b\xe3\x6b\xf7\x43\x34\x1c\xf6\x12\xa0\x9c\x67\x5e\x53\xb3\xa1\xe2\x75\x19\x47\x76\x5d\xdb\xce\xcc\xac\x8b\x4d\xcf\x41\x76\x09\xbb\x50\x9f\x77\x01\x5a\x54\xea\x34\xfa\xd2\x7b\xc9\x98\xfb\xd4\x6a\x1e\x90\xb8\xa0\xfe\x2b\x91\x0a\xf1\x68\x25\x28\xc3\x30\xff\xf7\xff\xfc\xaf\x6a\xde\xc6\xf4\xf8\xdf\xff\x75\xcf\x55\xf5\x5f\xff\x80\x3a\xef\xc7\x3b\x94\xff\x0d\xb7\xfe\x0f\xd2\x85\x7e\xff\x37\x5d\xb8\xd8\xf5\xff\x04\x5d\x18\xfd\x45\x17\xe2\x54\xf5\x7b\xfe\x4d\x17\x6a\xff\x4c\x17\xea\xff\x49\x17\xda\xea\xf7\xfd\x9b\x2e\x4c\xee\x7f\xa4\x0b\xb9\xff\xa4\x0b\xd3\x9b\x5d\xfe\x3f\x5d\x88\xfd\x33\x5d\x68\xff\x23\x5d\x58\x31\x0c\x63\x60\x37\xc3\x48\x22\x06\x92\x92\xc8\x8b\x7f\xd3\x85\xb3\xfc\x9f\x74\x61\x12\xd7\xee\xbf\xe9\xc2\x9e\xf9\x4f\xba\x90\x60\x39\xf6\x6f\xba\x50\x4d\xfe\x45\x17\xfe\x39\xaf\xff\xc7\xdc\x5d\xeb\xf0\xce\x5c\x5b\x00\x7f\x20\x17\x66\x2a\xcd\xf4\x37\xb3\x3b\x33\x33\xfb\xe9\xaf\xce\x49\xbe\x48\x29\xd2\xdf\x76\x17\x23\xcd\x54\x6b\x69\xb6\xf4\xf3\xd2\x15\xd6\x81\x20\xfc\x87\x2e\xfc\xfe\xe6\xba\xfc\xcf\xd5\xa6\xc5\x20\xbb\xdf\xf8\x1f\xba\x10\x61\xfe\x9b\x2e\x5c\xc4\x7f\xe8\x42\xeb\xef\x30\xfa\xf3\xf4\xba\xad\x00\x0f\x16\xff\x43\x17\x8a\x3c\xf4\xbf\xe8\xc2\x40\xad\xff\x17\x5d\x18\xc8\xff\x45\x17\x16\xff\x5f\xe9\x42\x23\x53\xb3\x40\x8c\xfe\x45\x17\xa2\x74\x79\xd5\x5a\xe8\xcb\x84\x50\x2b\x41\x9d\x41\x8f\x23\x8d\x4c\xfb\xa6\x4e\xe3\x3b\xef\xea\x76\x6d\x9f\x26\x57\xd6\x4d\x8a\xf5\xc0\x88\xf0\x89\x67\x85\xe5\x61\x1d\xfa\x4d\x29\xf3\xcc\xb0\x08\x56\xff\x20\x35\xd7\xc6\x7d\x24\x9d\x73\xfc\x3c\x5f\xcc\xbd\xf5\xf3\x2f\xba\x90\x8d\x47\x08\x18\x38\x47\x9e\xd0\xcb\xac\xe8\x9d\x03\xed\xec\xd4\x55\x1e\x2b\x3e\x12\xbd\x2e\xab\xcc\xa9\x03\xc8\x43\x66\xe5\x18\x21\xa9\xb5\x31\x78\x22\xeb\x36\xf0\x52\x9e\xed\x07\xe5\x29\x87\x60\xef\x9c\x24\x0b\x93\xa1\x82\x9c\x04\x1d\x93\x29\x83\x1c\xa8\xf4\x29\xb7\x92\x99\xa7\x12\x2f\xcc\x7b\xd2\x6a\x0a\xc6\xd6\x6f\x5e\x8c\xc6\xdc\x69\xd5\xf2\x28\xd3\xae\x8f\x7f\x99\x18\xaa\x63\x23\x3f\x0a\x30\xd2\xad\x48\xe9\xc6\x40\x33\x4f\x98\xdb\xb0\x1e\x19\xb8\xc2\xa9\xa1\x32\x58\x42\x7e\xd4\x9a\x02\xb2\xa5\xa7\x2a\xdd\x2a\xf8\x57\xd4\xbe\x15\x65\x17\x54\x92\x61\xae\x7c\xe7\x56\xf5\xaa\x28\x40\x3f\xb8\x55\x15\x65\x77\xe2\x05\x98\x81\x2a\x60\x56\x34\xd9\x71\xe7\x87\x98\xb4\xfc\x96\x16\x15\x92\x65\xd3\x25\xc2\x54\x49\xe7\x63\xe4\x78\x07\x72\x17\x49\xff\x20\x03\x2a\x73\xcf\xfc\x16\xb6\x33\x3d\x31\x7f\x42\x3a\x77\xda\x61\xe3\x62\xc7\x6b\xf4\x38\x56\x00\xfe\x76\x62\xe7\x75\x6e\xb4\x6e\xbb\x7b\x10\xb8\x48\x27\xfb\x24\x58\x95\xda\xf9\x51\x8e\x65\x56\xaa\xad\x7c\x56\xa3\x01\x03\x35\xb2\x1a\x65\xd7\x43\xae\x3e\xae\xcc\x61\x10\xca\x61\x5f\xed\x50\x62\xde\xde\x7d\xdf\xde\xdb\x21\x34\x3f\x43\xe0\x4f\xca\x33\x93\x7b\x72\x87\x96\xf6\xc8\x21\xf5\x58\xb7\xf7\xf4\xc5\x56\xce\xc0\xf5\x56\xc2\xe6\x2e\xb5\x0e\xb6\x8c\x39\xfc\xc2\x53\x5d\x0b\xff\xaa\x50\x40\x7e\x93\x27\x10\x67\x81\x18\xa3\x7a\x25\x10\x16\xf3\x9a\xe3\x3c\xb0\x53\x1f\xa7\xc2\x34\xab\xe2\xef\x9f\x5c\xc3\x77\xd3\xba\xee\xeb\x72\xda\x4f\x35\xd9\xc7\xd2\x27\x7c\xc5\x7a\x17\x64\xd4\xcd\xac\xe8\x25\x33\x7f\xd4\xcf\xb7\x97\xa3\x11\xf0\x8c\xab\xde\x52\x91\x95\xd8\x2e\x9d\x07\x3b\x04\xbe\xa5\x9c\xb2\xbc\x7b\xf7\x60\xa5\x41\x62\x2c\xdf\x67\x48\xdf\x67\x64\x3f\x67\xcb\x79\xe6\x2b\x41\xf9\x55\xc2\xf8\x4b\xda\x8a\x41\xfc\x78\x05\x05\x69\x28\x61\x4b\x6b\x87\xa6\xb8\x4a\x7b\x0c\x07\x84\xc5\xa9\x24\x8e\x32\x74\x7a\xf4\x81\x91\xf4\x81\x8e\x5e\x3a\xea\x55\xa1\x64\x57\x3a\x7e\x6d\x38\xdc\x73\x17\xde\x4c\x2c\x86\xe5\xbc\xd2\x3d\x89\x95\xf0\x51\x67\xc5\x55\x71\x50\x2a\x6f\xe1\x49\x59\x86\x51\xc0\xe5\x51\x08\xe5\x31\x82\x90\xa7\x73\x5a\xe2\xeb\x35\xe2\xab\x95\x20\x3b\x4d\xee\x40\xfa\xc5\x27\x5e\xdc\xcc\x0f\xfc\x08\x9e\x09\xda\xfa\xeb\x1c\x78\x7a\xa7\x51\xae\x34\xba\xdf\x8e\xc2\x59\x98\x9d\xe3\x69\x5a\xc0\x22\x6d\x5e\xe6\xa2\x0e\x8a\x65\xa6\xa3\xd7\x23\x01\x58\xc6\xd5\xa1\x5e\xf3\xf9\x95\x44\xc1\x54\xd5\xe1\x95\xfc\xbe\x50\xe5\x86\x4f\x79\xb5\x74\x01\x9b\xa0\x82\x02\x50\xe2\xa4\xc9\x6c\x43\x98\xd7\xae\x98\xc7\xa3\xb1\x27\x5b\xbe\xc7\xfc\x38\xad\x55\x16\xb2\x9f\x04\xdb\x88\xc7\xc5\xf6\x31\xb3\x1d\xe2\xf6\x1e\xe2\x76\x87\x46\x2d\x10\xd7\x13\x0a\xb5\x48\x24\xd6\x19\xb3\xbd\x36\x57\x9a\xc7\x14\x6e\xa2\x12\x18\x21\x6a\x85\x8e\x70\x07\x30\x3c\x12\x10\x52\xc0\x32\x02\xcf\xff\xd0\x85\xad\x4d\xb6\xc0\x5c\x27\x91\x90\x46\xb3\x0b\xda\xef\x3f\x74\xe1\xb6\x76\x50\x88\x8d\xfb\x5f\xba\x10\x89\xda\x37\x99\xdc\x28\x90\x97\xc8\xd9\x50\x71\x09\xd1\x55\x56\x42\xd8\x0f\x87\xe5\x59\x2c\x38\x43\x7e\x84\x38\x45\x6e\xe6\x95\x86\x76\x89\x1c\x6b\x0d\xe6\xbc\x7f\x09\xb8\xc0\xcb\x40\x1d\xcf\xf2\xce\xa1\x72\x3a\x2a\xbc\x85\x9e\xf5\x24\x8e\x77\xfd\xec\x1e\x97\x5e\xb4\x3b\xa7\xeb\x83\xd6\xd1\x14\xf8\xf4\x8b\xd0\xf8\xd9\xc4\xd6\x48\x3e\xbf\x0b\x31\x6e\x90\xa8\xcf\x46\x30\x76\xd8\x13\xc1\xc9\x24\x7d\x08\xd1\x3d\x46\xa6\x2d\x2d\x16\xfa\xfb\x41\x38\x5c\xf3\x3e\xf9\x25\x6c\x81\xd5\x13\x99\x67\x2e\x8b\x4a\xb9\x12\x34\xf8\x58\x8a\x11\xb2\xcf\xb8\x9b\x99\xfb\x8a\xbf\x14\x02\x3d\xe6\x9b\x21\xf1\x68\x3a\xb9\xa5\x4c\xf9\x03\x36\xc4\x6b\x0f\x95\x26\x6c\xaa\x10\x22\x6e\x67\xbd\x51\x96\x68\xd9\x39\xd8\x30\x11\x31\xa8\x1a\x77\xfb\x4c\xe6\xfd\x66\xbe\x4c\xf1\x7a\x2d\x31\xc3\x98\x16\x12\x36\x77\xc0\xac\x98\x6e\x99\x4f\x04\x6d\x35\xff\x82\x75\xa2\x8b\xb5\xd6\xc1\xa0\xbc\x7c\x7a\x22\x6e\xf5\x80\xe6\x02\x1a\x3d\x62\xfc\xb2\x45\x83\x81\x85\x40\xd3\xf7\x38\x7b\x2b\x2b\x14\xf0\x84\x2b\x98\xf0\x0d\xd0\x8d\xe9\x75\x59\x40\x9f\x06\x03\x06\x2c\x26\xce\x21\x80\x48\x43\x5d\x06\xfd\x14\x18\x82\xc9\xcb\x21\xeb\x18\x85\x7c\xf8\x3d\xc8\x61\xc9\xe6\x94\x7c\x50\xb4\x40\x4b\x00\xc0\x9f\xad\xe0\xe9\x8f\x27\x1b\x19\xf5\xc1\xfc\x3b\xe8\xf5\xc8\x9f\x2b\xdf\x11\x62\x2b\xa9\xe9\xc8\x4f\xf8\x9c\xc0\x93\x2f\x29\xbd\xc8\x43\x80\x14\x00\xf2\x22\x17\xf0\x44\x01\xcc\xdb\x3e\xf2\x02\xc0\x5a\xb3\xe8\xda\xa2\xe1\x10\x78\x66\xf0\x31\xc0\xf9\x02\xf6\x01\x58\x17\xf0\x24\x41\xf7\x03\xf9\x8a\x66\x50\xa2\x8c\x00\x07\x24\xd4\x0a\x13\x23\x62\xa8\x28\xed\xa2\x5c\x18\x98\x51\xd0\xcc\xc0\x9c\x04\x43\xb2\xc2\x02\x10\x65\xc1\xa7\xa9\x68\x17\xc4\x20\x10\xd7\x41\x8c\xaf\x28\xbc\xe2\x78\xcc\xb7\x87\x3e\x16\xb8\x8d\x6f\x45\xa6\x48\x77\x2b\xd6\x39\x39\x17\xce\x85\xab\xc2\x5a\xd1\x29\x93\xc6\x32\xec\x36\xdf\x5b\xf1\x4a\xa9\xd9\xb9\x9b\x12\x97\x8d\x5f\x37\x06\xd9\x18\x20\xb3\x91\x2b\x16\x8a\x8d\x9b\x36\x06\x25\x19\x4a\xbe\xe1\xab\x09\xcd\x5a\x5f\x28\x83\xc4\x72\xeb\xce\x63\x7b\x6e\xa7\xed\x29\xda\x2f\xcc\x4a\x7b\x78\x26\x3f\x89\x16\xff\x1e\xe7\x27\xfb\x7e\x26\xf4\xc2\x60\x9f\xe6\x31\xfc\x74\x79\x62\xe1\xed\xcd\x77\x01\x79\x5e\x42\x8f\x21\x67\x60\xc1\xe6\x80\x4c\xad\x4f\x25\xae\xb0\x17\x2c\xd6\x93\xb8\x94\x75\x1e\x58\x9a\xa6\x8a\x9f\x14\x64\x8d\x40\x49\x60\x37\x2a\x89\x79\x82\x63\x50\x86\x4a\xdf\x4b\x51\xe9\xef\x44\x0a\x5a\x7f\xce\x0e\x48\xe9\xda\xe3\x0d\x00\xde\xda\xa5\x05\xc2\xd3\x90\xd3\x0f\x7f\xa6\x4b\x87\x71\x58\x4d\xf3\x44\xb7\x0e\x6d\x1a\x71\x6a\xcb\x32\xf0\x47\xa7\xc6\x00\xb8\xeb\xe5\x5d\xd2\x80\x21\x95\x1e\x90\xf1\x93\x3f\xe5\x89\x44\xd7\x85\x9a\xe9\x07\x26\xe7\xe9\x6e\x7c\xfb\x19\xd3\xb5\x7b\x26\x2c\xbb\x2a\x90\x5e\xc6\x44\x46\xde\xc6\xe3\x27\x3d\x20\xc9\xa7\x80\xab\xb4\xc1\x33\x82\xb4\x6b\xbb\xde\xe0\x57\xae\x3e\xfc\x8b\xf1\x35\xcc\x5c\x62\x75\x9c\x05\x9c\x77\xa4\x0f\x40\x7d\xad\x44\x52\x40\x4e\x22\x55\x89\xf6\x59\xc8\x1b\xf8\xe8\x36\x40\xf6\x34\x59\x9f\xc0\x38\x17\x7a\xfb\x01\x34\xf3\x2c\x68\x4d\xa4\xa0\x6b\x6e\x50\x42\x1b\x38\x50\xec\xd5\xba\xe6\xde\x72\x74\xc6\xfb\x0b\x48\x37\x02\xa4\xcd\xb2\x16\x32\x33\xdc\x20\x2c\xe8\x34\x47\x09\x2d\xd5\x93\x43\xd3\x12\x13\x8a\x3e\x0b\x0f\x89\xad\xc2\x8b\x96\x86\x56\xab\x47\x47\x9e\x0e\xc2\x21\x92\xa6\xd1\xcd\x0d\x88\xb6\xe8\xbe\x5a\xaa\x4c\x9e\xc9\x8e\x27\x77\x63\x4a\x86\xf2\x6a\xa3\x37\x0a\xda\xaa\xc8\x83\x75\xda\xbb\xc1\xd4\x0e\xf2\xa2\x41\x80\xfd\x25\xef\x7a\xee\x51\xbe\x00\x26\xb1\x26\x43\xea\xc2\xc4\x30\xc1\x04\xde\x88\xd0\x53\x22\xac\x00\x3c\x78\x11\xf3\xa3\xf1\x28\xe8\x11\x43\xdb\x44\xee\x12\x0d\xd6\x1e\x44\x13\xc5\x43\x93\x31\x9c\x66\x0b\x42\xca\x28\x70\x8d\xfb\x0c\x04\x02\x08\x3d\x0f\xba\xe7\xb7\x15\x13\x25\xd9\x93\x1f\xf6\xb5\xfe\xb6\xe1\xbe\x95\xd0\x19\x29\x6d\x5d\x58\x65\x64\xd5\xd0\xd3\x9c\x3d\x18\x59\xde\x57\x14\xee\xa0\x55\x64\x1b\x7a\x69\xc0\x03\x6c\xa4\xc8\x83\x8d\x22\x53\x2c\x02\x10\x3a\xde\xee\x19\xb4\xc2\x00\x5b\x09\x17\xe3\x9b\xa0\x60\x1f\xe2\x62\x65\xa5\x81\x3b\x29\xf1\xa2\x14\xd4\xba\xd6\xd3\xf9\x80\xe0\xa2\x02\x5d\xde\x21\x1e\xb5\xbd\x9c\xa7\xaf\xdd\x49\x33\x94\x95\xe6\xa2\x5a\xa6\x0f\x7d\x26\x3f\x6f\x10\x42\x56\x9f\x0d\xa4\xe3\x83\xb2\xd7\xfe\x56\x7a\x83\x6d\x97\x38\x62\xb0\x13\x98\x99\xf1\xa3\xdc\xe8\xa4\x6e\x0e\xd0\xbe\x49\x75\xb1\xde\x5f\x44\x87\x70\x71\x6a\xf3\x40\xbb\x22\x3a\x22\xd3\xec\x7f\x68\xf3\x99\x91\x19\xa6\x64\x18\x51\x70\xfa\xc7\xff\x13\x49\xff\x55\x26\x78\xf0\x2f\x94\xfd\xef\x7c\x16\x23\xec\x98\x8f\x5c\x7e\xeb\xbc\x76\xeb\x3f\xff\x71\x3c\xf6\xd6\xf9\x9a\x4f\x85\x04\x7b\x1a\x41\xd2\x11\xa6\xd2\x18\x5f\xfe\x31\x9f\xa2\x88\x36\x89\x32\x20\x5b\xe7\x12\x5b\xf8\xe0\x5f\x2e\xcd\xe9\xe3\x51\xa1\xde\xb5\xdd\x6f\x5d\xb8\xa5\xd7\x93\x1e\x7d\x85\x64\xbf\x9e\x75\x8f\xe1\xd5\xc4\x5e\xfe\xfd\xf5\xb7\xc2\x3d\x3c\xd8\xdd\x20\xe4\xcf\x04\x82\x07\x0a\x39\x5a\xe3\xc1\xf4\x95\x2c\x10\x94\xb6\xa2\x10\x21\x4b\xde\x02\x83\xf6\x25\xfb\x0a\x26\xd2\xb9\xdb\x36\x14\xb8\xaf\x8a\xf5\xf3\xd3\x7b\x3e\x6c\x22\x12\x40\x60\x46\x68\xea\xd7\x0e\x04\x21\x80\xe9\x72\x5e\x44\x1e\x6f\xe9\xa7\xac\x8e\xe8\xf4\x27\xdd\x11\x39\x8e\x3f\xf8\x74\x50\x55\xae\xc9\x1b\x07\x89\x50\x07\x7b\xeb\xe8\x75\xd3\x36\x68\xfb\xf3\x86\xfa\x8d\x21\xec\x20\x73\x3f\xf3\x24\x5d\x97\xb5\x8c\xc3\x60\x46\xb9\x51\xea\xfa\x75\x74\xb6\x3f\x73\x55\x18\xd7\x45\x38\x47\x4f\xf5\xf3\x37\x31\x38\x2d\x51\x5c\x85\x0e\xb0\x24\x7b\xd0\xd6\xd3\xac\x91\x40\x47\x01\x34\x7f\x78\x88\x89\xe1\x2e\x86\xab\x14\x7e\xf3\xfa\x34\xc1\xb6\xc0\x28\x10\x57\x80\x0f\x2d\x55\x5c\x89\x9d\x43\xa6\x1d\x32\x75\x63\xd5\x68\xd5\x27\x8b\xea\x26\xb9\x1a\x37\xba\x6a\x33\xba\x6a\x31\xba\xda\x1d\xbe\xb6\x97\x6c\x64\x52\x49\x21\x01\xd3\xaf\x74\x3f\x08\x85\x5a\xc3\x28\x88\xa1\x20\x86\xad\x68\x90\xab\x1a\x21\x2e\x7c\xd0\x01\x07\xfa\x39\x18\xf8\x47\x7a\x84\xb4\x5f\xc3\x2b\x56\xae\xae\x17\xae\xec\x10\x5e\xc4\x61\xc3\x41\x7a\xac\xc1\x2f\x5c\xfd\x25\x5c\xed\x25\x5c\x74\x62\xf1\xa7\xb2\xa1\x20\x7c\x0a\xc6\xca\xa3\x7b\xc2\xca\xfd\x92\x57\x0a\xca\x8b\x59\x7a\xa3\x49\x1e\x47\x7e\xe4\x99\xa1\x65\x87\x21\x97\x84\x63\x20\x27\xf7\x72\xa5\x46\x01\x49\x2f\x40\x72\x96\xfc\xe9\x61\x0a\x9d\xb1\x9a\x45\x7e\x60\x2b\x3b\x47\xa1\x8a\xf0\x03\x17\x27\x8e\x61\x4a\x1f\xa1\x57\x57\xbb\x2f\x48\x11\x02\x54\x01\xa7\x6a\x31\x8a\x0c\xcd\x1f\xc5\x73\x9c\x1a\x27\xdf\xa3\x2c\x0f\xa1\xb9\x49\x63\xaa\xec\x9d\xd5\x58\x5f\xf7\x6d\xdb\xb6\xa1\xa0\xec\xb9\xed\x78\xb7\xa6\xf2\xd2\x5f\xe6\x78\x1a\x1d\x49\x57\x95\xc0\x77\x16\x51\x32\x57\x3d\xb1\xef\x34\xe9\x8c\x48\x4f\x78\xa9\xe4\xfc\xa7\x17\x16\x33\xb9\x07\x77\xd4\x13\x28\x49\x54\x8b\xf7\xa4\xd4\x79\x91\x6f\xd4\xd5\x02\xff\xa4\x9c\xe5\xe0\x49\x88\x7b\x38\x95\xaf\x7e\x5f\x62\x76\xf8\x49\xa5\x58\x5d\x94\x59\x6c\x5a\x16\xd7\xf8\x33\x19\xa6\xef\x43\xb1\x88\x7f\x83\xac\x06\x81\x9f\xe3\x42\xfa\x9b\x24\xf1\xa5\x9d\x77\x28\xaf\x1c\x66\x3d\x3a\xb1\x6c\x84\x4f\xd6\xa1\xc4\xd7\x71\x42\xa0\x60\x25\xfd\x02\x0a\xbf\x3a\xfb\xe5\x28\x01\x8f\x1d\x00\x23\x39\x60\xc2\x21\x16\x50\xf9\x25\x30\xf4\x08\x4f\x49\x8c\xf8\xc7\xf8\x3a\x52\x07\x5f\xf1\xd7\xc9\xbb\xc9\x39\x39\xf5\xf4\x8b\x9f\xcd\x9c\xb2\xb5\x5d\xf1\x10\x75\x9a\xc4\x42\x64\x83\x0f\x1a\x96\xda\x24\xc9\xc2\x3e\x23\x74\x26\xf9\x55\xf9\x75\x8c\x1d\xc0\x3f\xe0\x9b\x38\x3f\x83\xe1\x51\x54\xcd\x3c\xf9\x45\xe7\xb2\x10\xbb\x4f\x50\x8f\x78\x50\x08\xd7\x00\xe3\x04\x5a\x32\xce\x1b\xeb\xd9\xfc\xa5\x45\x6f\xe6\x47\xd5\x05\x97\xdc\xc9\xb0\x58\xb6\xce\x43\x08\x36\x06\x75\x2a\x81\xaf\xac\x43\x17\x60\x8c\x51\x06\x82\x94\x0a\x75\xc2\x74\x83\x78\x05\x56\x2d\x03\x30\x3a\x6d\xf1\x41\x83\x21\x2b\x1c\xa6\x51\xe5\x39\x8d\x1b\x5c\x92\xdf\x49\xf0\x30\xfb\xfe\x25\x7b\xea\x3b\x42\x79\xdb\x8b\x8a\xc2\x32\x90\xa4\x91\xbe\x46\x98\xe2\xbe\xd9\xe1\x38\x98\xc2\x84\xb2\xd9\xe6\x54\x01\x78\x6f\xe8\xf0\x22\x93\x35\x1b\x28\x9e\x92\xcf\x95\xa8\xb3\x24\x4c\x57\xe6\xcb\xa0\x77\x7e\xbf\xfd\xcb\xf0\x03\x8f\x3f\xcd\x57\x24\xab\xd8\x6e\x87\xfb\x19\x10\xdc\x2c\x69\xa4\xfd\x0a\xe2\x4b\x0b\x4f\xdc\x21\x01\xcb\x92\x79\xbb\x4e\x5f\xeb\x1d\x90\x76\x56\xda\x59\xf5\xc6\x20\x1e\x6a\x9a\x5f\x86\x17\xa8\xf3\xa8\x3f\x8f\x12\x7e\x91\x12\x98\x0e\xf7\xcb\x0b\xb7\x1d\x1f\xad\x6c\xca\xc9\xfb\x79\x30\x3c\x7f\xc9\x46\x47\x69\x60\xcf\x01\x28\x7f\x03\x87\x09\x1a\x5d\xd1\x97\xfe\x64\x5e\x40\xdb\x57\x4c\x2c\x4d\xce\xb8\x81\xa4\xfa\x5c\xad\x38\x2a\xf0\xcc\x3d\x12\xdf\xb0\x83\xa9\xe3\x68\xd1\x32\x6f\x5d\x70\x04\xb1\x19\xbe\x3a\xb3\x45\x10\x32\xa2\x4a\xbb\x46\x54\x90\xf7\x76\x40\xc1\x68\xf5\xcb\xdd\xef\xcf\xe5\x6d\x55\x75\x68\xb2\xe4\x6e\x4d\x82\x84\xa3\x9e\x7c\xac\xab\xc3\x22\xdd\x00\xdc\x0d\x7e\x67\xd8\xb7\x5f\xcd\xe9\xbd\x29\xeb\xfd\xc6\xfd\x48\x21\x49\xbe\x22\xbf\x9d\x0d\x41\x84\x99\xc2\x38\x5a\x19\xec\x74\x48\x40\xc3\x2e\x57\x65\x19\x3b\xc6\xfe\x10\xff\xc7\xc9\xbf\x84\x07\x8e\xf0\x60\x7f\x98\xbe\xd7\x72\xdd\x24\x61\x55\xd6\x3b\xbf\xc2\x07\x4a\x48\xfb\xdc\x90\x56\xd6\x8c\x8b\x2a\xea\x38\xaf\xf9\x5b\x1f\xc9\x8b\xb3\x78\x29\xc2\xa5\x1f\x63\x9b\xfe\x14\x85\xb3\x73\x0f\x48\x91\xb3\x1b\xaa\x43\xb1\x84\xa9\xe8\xac\xf8\x77\x2c\xac\xd8\x2a\xa2\x47\x90\x22\x25\x93\x9b\xdb\xf9\xb3\xf0\xec\x24\x49\xd8\xc0\x53\x9a\x2b\xc9\x91\x4f\x72\x8a\x65\x51\x8d\x5b\x0c\x29\x12\x8b\xe2\x87\xe9\x2d\x6a\x68\xf7\xac\x79\xb2\x4b\x3b\xb2\xd3\x1f\x6a\x1b\x4b\xfc\xd0\x98\x3e\xdc\x0c\xa1\x55\xf0\x08\x89\xce\xbd\xa1\xb0\x87\x9d\x11\xd0\xdb\x22\x6a\x65\xb1\x99\x41\x34\xb6\x13\x4e\x7e\x13\xa5\x1d\x1b\x17\xd2\xa0\xd4\x5c\x2f\xc9\x97\x76\x52\xb2\xc0\x11\x8c\x8d\xbe\x29\x13\x76\x76\x7c\xe7\xd2\x1e\x23\xca\x37\x0f\x4c\x33\xcc\x37\x87\x19\x65\x2a\xce\xcd\xac\x49\x3d\xef\xca\xce\xe1\xb9\x63\x43\x4f\x46\x53\xf2\x9a\xb3\xe5\xfd\x96\x17\xd2\x10\xfc\x5e\x90\x74\xd3\x4e\x5d\x70\x4f\x00\x97\x33\xb7\x56\xba\x8e\xe9\x23\xa3\x4b\xb9\x8e\xd9\xf8\xc9\xa5\x2d\xc3\x3f\x53\xe9\x4f\x50\x68\xc0\xfa\x6b\x6d\x20\xee\xb5\x45\x38\x61\x0b\x89\x7b\xac\x98\x51\x37\x5b\x5f\x24\x99\xa8\xe7\xf7\x33\x8f\x46\xa3\x7f\xb7\x10\x60\xe2\xc4\xf4\x8e\x5b\x83\x14\xfc\x99\xd8\x01\xdb\x82\xd8\x31\x70\xe7\x71\x6a\x26\x37\x7d\x14\x12\xc9\x42\x0c\xab\xa1\xb9\x3a\xe2\x2f\x3e\x3c\x61\xe9\xa0\xbd\x33\x54\xeb\x56\xc4\x53\x66\xa3\x41\x5a\x0c\xa2\x06\x04\xf3\xae\xc4\x1b\xc5\xd1\x5c\x72\x33\x09\x30\x9a\x99\x3b\x06\x75\xae\x89\xe8\xc9\xde\xbc\x89\x9f\xfd\xb4\xdc\x51\xf1\x44\x1e\xc4\x67\x3c\x83\x4e\xdb\x89\xbb\x12\x3f\x31\x4c\x12\x39\x48\x9e\x2e\x4d\x47\xac\x01\x7c\x4f\x3b\xf1\x01\x48\x5d\x0d\x80\x6b\x60\x46\xec\x89\xc4\xed\x5f\x1f\x0a\x4b\x3b\x7a\x25\xc6\x5c\x2d\x64\xde\x27\x1e\x3a\x51\xe9\x19\x0e\xb2\x9d\x3e\x04\xa3\xc3\xe6\x3b\xb8\xc7\xf6\x50\x6a\x01\x32\xa0\xe2\x5c\xa5\x57\xf5\x00\xb1\xd4\xcf\x32\x95\x0e\x08\x9e\x47\x2f\x5c\xa5\x23\x42\x1f\x6b\xad\xc4\x96\x9f\x3d\x79\xa4\x8a\x7b\x2b\x67\xba\xf7\xe4\x61\x2a\x97\x08\x84\xd0\xa1\x3d\x87\x92\xf7\x94\xab\xa9\x62\x97\xbd\x25\xf7\x02\x1f\x7d\xc2\x16\x9b\xf3\xf1\xf9\xf2\xbb\x31\x31\x86\x0f\x1e\x9b\x0d\x86\x40\xfd\xe5\x82\x03\xaa\x3b\xdf\x11\x67\x88\x2f\x9f\xdf\x13\xba\x73\x4c\x5f\x3c\x6a\x1d\x94\x49\x8c\x47\x90\xe6\xa7\x5b\x2b\x44\xad\x79\xb0\x91\xc0\xf3\x60\xc9\x19\x34\x0a\xd9\x16\xc0\xb3\x4d\x65\x68\xbd\x3c\x66\x80\xed\x53\x0c\x9a\x87\x2f\xde\xc4\xde\x0b\xce\x30\xe5\xef\x05\x6f\xb2\x0e\xfc\x7c\x6c\x20\x62\xc1\x16\xf3\xb3\x41\x9e\x76\xf2\x58\xc9\x66\x95\x66\xbd\xf8\x53\xeb\xb6\xd5\xa4\x83\xa6\x70\x4b\xd5\x76\x78\xf4\x8c\xcc\xd6\x64\x88\x12\xcc\xf6\x4a\xef\xec\x59\xbc\xf9\xee\x16\x37\x84\x56\xa1\x4f\x19\x17\xe1\xb7\x61\xb2\x0d\x73\xfb\x48\x0d\x1e\x7d\x7b\x71\xb2\x51\x03\x77\x74\x5f\xe6\xa5\xdb\x1d\x67\xd2\x6b\xae\x9f\x71\x2d\x7d\x76\xf3\xbb\x16\xc1\x49\x43\xfe\x5c\x88\xca\x73\x6e\x33\x90\x90\xf9\x2c\x7f\x7c\x90\x05\x93\x24\x5e\x76\x75\xc5\x54\x67\xfc\xe4\x1e\xf5\x07\x02\xd3\xdc\xe9\x70\x92\xc3\x5e\xc8\x4f\x61\x6a\x02\xef\x3d\x04\x53\x67\x35\x4b\x4d\xe0\x6d\x47\x55\x0b\xb5\xba\xb5\xea\xe6\x60\xab\xeb\x88\x21\x7b\xfc\x79\x26\xff\x9b\x85\x36\x91\xa5\x77\xaf\xc1\xa3\x6d\x20\x7c\x9e\x55\x84\x39\x68\x02\x6a\xb7\x0b\x81\x7e\xc7\x87\x46\xaf\xc2\x73\xd9\x14\x92\x93\x9d\xa4\xce\x7c\x19\x85\x58\x05\x6b\x15\x44\x21\xc2\x35\xd1\x46\x3f\x86\x7c\x57\xde\xb7\x71\x0f\xde\x14\xa2\xe4\x53\x67\x49\x03\xa5\x68\x3e\xd1\x72\xbb\x38\xd3\x27\x51\xb1\x81\xa7\x5b\xc9\x88\x49\x67\x87\xdb\xf7\x00\xf2\x14\x48\x59\xaa\xb0\xdb\x44\x6f\x84\x31\xb2\x0d\x10\x3e\xfd\x2a\xa9\x93\x48\x5f\xa8\xf9\xce\x47\xd0\x59\xc9\xab\xa2\xe9\x76\x92\x13\xe9\xb9\x08\x7a\xae\x7c\x22\x5a\x50\x00\x5d\x54\x34\x28\x99\x1a\x61\x24\x26\xfe\xde\xd0\x03\x24\x06\x10\x3c\x92\x9c\xf1\xe1\x15\x67\x2e\x8c\x56\x2f\xe9\xc2\xa9\x61\xc9\x2f\xbd\xb5\x9c\xc5\x78\x71\xcf\xf0\xab\x77\xa7\x78\xbf\xc4\x28\x44\x9a\x85\x28\xc5\x41\xdb\xeb\xeb\x84\xa3\x02\x37\x54\x56\x7c\x54\xfb\x69\xc2\x00\xcf\xf0\x3d\xa9\x2c\x02\x55\x1a\xd0\x1e\x6a\x76\x7a\xcd\xbb\x48\x09\x80\x50\x99\x54\xb6\xb2\xdf\xa3\x04\xbb\x72\x53\x5f\x9f\xa6\x85\x97\x18\x47\x58\x62\xd9\xfb\xe4\x65\x7d\x2c\xf5\x54\x77\x94\x8d\x00\xdb\x16\xec\x46\xac\x04\xf3\x09\xc2\x59\x1e\x75\xed\xfe\xb4\x83\x74\xbd\x35\x29\x7d\xf9\x15\x52\x7b\xba\x9d\x22\xe0\xf6\x5b\xc5\xb8\x9c\xed\xa9\x9f\xba\x8e\xd1\x3a\xf2\x2b\x3b\x0d\xcb\xe0\x31\x41\xd3\xf0\xb3\x11\xe0\x1d\x1b\xc7\x37\xc1\x17\x59\xc8\x6f\x53\x9e\x10\xac\x5f\xfb\x84\x11\xc1\x31\x91\x7c\xd6\xc0\xbc\xc1\xc7\x58\xaa\xe5\x18\x65\xb2\x14\x2a\x8c\x4b\x1b\x2a\x59\x0a\x7c\xee\x02\x64\x61\x72\x88\xbc\x25\x63\x1c\x7b\x5f\x27\xea\xae\x2b\x67\xe2\x33\x5e\xfa\xe7\x38\x56\x66\xd2\xec\x93\xa4\x7b\xa9\xe0\xb7\xce\x52\xf8\x2f\x4f\x28\x63\x4f\xd9\x5f\xe4\x53\x36\x07\xe9\x94\x5d\x41\x3a\x55\x67\x90\x41\xd5\x89\x84\x07\x5e\x22\x21\xa3\x3d\x20\xbe\x68\xcd\x82\xb3\x10\x40\x02\xc8\x73\xec\x70\x33\x20\xb6\x7a\x1b\x64\xab\x92\x01\x4a\xfa\xd1\x8d\xa8\xb0\xb7\x79\xf7\x45\x72\x26\xeb\xc0\x5d\xfe\x3e\x34\x80\x40\xd8\x35\x69\x6c\xd3\x05\x6a\xde\x2c\x81\xea\x20\x84\x6e\x27\xaf\xaa\xdb\xda\xff\x30\x7d\x16\x75\x80\xd9\xf2\x7c\x2a\xc1\x0d\x0c\x14\x88\xa4\x55\xc5\x30\x41\xcf\xe5\xbd\x8b\xb2\x34\xe3\x94\x49\x96\xff\x35\xcd\x6d\xbf\x98\x5f\xdc\x3f\xd4\x43\x01\x68\xb4\x0c\x0b\x9d\x58\xfe\x47\x0f\xb7\xfd\x82\x41\xb9\x67\xac\x01\xb8\x2f\xe3\x55\x3d\x55\x0b\x00\x31\x4f\x19\xae\xaf\x97\x31\xc1\x59\xb8\x14\xd8\xe5\xfa\x60\x94\x4d\x51\x15\x03\xce\x31\xe8\xe4\xbc\xff\x7b\x15\x90\x05\x41\x8a\xe1\xd1\x2e\x3d\x22\x48\x2d\x25\x2b\x28\xcb\x1a\xc7\xa1\x95\xe8\xbb\xea\xe8\xc7\x00\x87\x5c\x32\xdb\x5b\x2f\x43\xb6\x27\x3b\xb6\x47\x3b\xce\xf7\x79\x00\x2b\xb1\x54\xbc\x79\x4e\x3d\x91\x98\xd6\x93\xec\xee\xc7\x0b\xbb\xa2\xba\x6e\xef\xfa\x06\x87\xd4\x0e\xc7\xf1\x4f\x9a\x8a\xfd\x78\xff\x58\x5d\xac\x9b\xca\x6d\xe3\x9f\xca\xd1\xc7\xb8\x39\x09\xb2\xd9\x0b\xcd\x44\xee\x21\x0c\x3f\x60\xe7\x5f\x80\xa2\x70\x1a\x5a\x5f\x35\xa7\x74\x20\xc3\xe4\x98\x1a\x01\xf3\x3c\x40\x70\x82\x70\xbb\x09\xe6\xd4\x43\x38\xeb\xbd\xe2\x3e\xe6\xa0\x57\x79\xf6\x57\x81\x53\x9f\x79\xe0\x19\xc5\xa0\x3a\x7c\xd4\x17\x64\x99\x08\xa2\x5a\x79\x9c\xe0\x12\xdf\xd6\xb4\x85\x89\xc9\x4f\x58\x5f\x08\x48\xdb\x9c\x7c\x13\x0a\xbe\xc7\xbc\x11\x07\xf9\x9d\x21\x67\x8f\xfb\x94\x3b\xd5\x12\x56\xd0\x58\x41\x53\x84\x71\x1e\xf2\x7b\x49\x58\xc9\xe0\x56\x70\xda\x52\xb6\xf0\x81\x94\xc0\x8a\xc2\x0d\xeb\xbb\x29\x8b\xe7\xf9\x1b\x20\x27\x9d\x6c\xb0\x52\xe4\x6f\x8a\xcc\xe4\x8f\xec\xf3\x06\x7f\xad\xeb\xbb\x6f\x0a\xe7\x1b\x04\xab\x24\xf4\xc2\x28\xb5\xeb\x4e\x4a\xc9\xb4\xb4\x8a\xb8\x8a\x3e\xad\x52\x49\x25\x50\xcf\x6b\x03\x94\x26\x19\xe5\xb7\x5e\x47\x0b\x71\xe2\x77\xaa\xb4\x2c\x34\xa3\x00\xe9\xc1\x60\x67\x40\xee\x0e\x10\x38\x75\xa9\xc0\x07\x25\xa4\x69\xe4\xc8\x1c\xc9\x0a\x4e\xd2\x21\x47\xe5\x56\x2e\xe5\x39\x56\x0a\xc5\xa0\xb6\x37\x5d\xf3\xed\x55\xb6\xb5\x71\xa5\xca\x05\x76\x0f\x26\xd5\x85\x5c\x3c\xa8\x3c\x6c\x29\xbf\x9d\x9e\xf0\x71\xcf\xa4\x42\xc6\x51\xe3\x6e\x44\x82\x0d\x3e\x48\x5e\x56\xc7\x6f\x34\x2f\x82\xcd\xe2\xe3\x2c\x26\x04\x71\xa9\x1c\xc0\xc2\xf4\xec\x51\xe4\xc3\xc5\x7d\x26\xe0\xcc\x5a\x2c\x27\x28\x81\xa2\x0e\xa0\x50\x86\xff\x90\x41\xf0\xce\x56\xfe\x12\xb3\xda\xbf\xd1\xfd\x82\x3e\xb4\xfd\x96\x8b\x95\xdf\xe3\xb6\x5e\x98\x8e\xfd\x6b\x6c\xc3\x6c\x3b\x55\xe0\x06\x76\xe0\xac\xa0\x9f\xb0\x6e\x22\xb8\x44\xb6\xbb\x0e\x4d\xdf\x3c\x2e\xa4\x97\x78\xa7\x1e\xb0\x60\x29\xde\x2b\x90\x6a\x74\x36\x0a\xeb\x0a\x42\x7f\x43\xb2\x35\xb6\x9f\xd1\xd5\x04\x3e\x4a\xcc\x88\xad\xd9\x86\xa8\x3d\x21\x02\xd5\xde\x13\xd6\x2a\xd7\xee\x10\x71\x85\x5d\xc4\x2f\x4a\x57\xca\xe0\xeb\xea\xaa\x13\xb0\x43\x4e\xcb\xa1\x91\xc3\x72\x65\xba\x98\x51\xf4\x9c\xce\x9a\x06\xb4\xf3\xa2\x3b\x4a\x04\xc1\x10\x44\x2e\x0a\x02\x8d\x0a\xd4\x7a\xe6\x3d\x64\x22\x6c\xf4\x29\x5b\x59\x11\xf7\x9d\x63\xf5\xee\x2c\x63\x5a\x62\xba\x52\x32\x4c\xbb\xc4\x0f\xd6\x4e\x94\x7a\xd7\x67\xa4\xd4\x65\x3b\xce\x46\x1e\x56\x02\x04\x9d\x11\xda\x33\x4d\x8f\xdf\xc6\xda\xdc\xed\xdc\xc1\x2c\x54\x16\x2e\x3c\xc9\xf6\x53\x9c\x0e\xb2\xa5\x9c\xb1\xdc\x3b\x14\xc2\x0a\xa5\x5f\xe5\xb3\xeb\x12\xa6\xd8\xcc\x62\x53\x91\x7d\x1d\x0a\x14\x3a\x64\xd9\xa0\x02\x42\xf7\x0b\xa1\x01\x7c\x7f\x0f\x12\x4e\x49\xa4\x4d\xa6\x1f\x8a\xe7\x24\x6a\xf8\x99\x1b\x2a\xef\xe8\xac\x20\x28\xcc\x8f\x99\x7e\x19\xea\x01\x47\x44\x5a\x46\xf2\x9d\xc8\x43\x45\x00\xb8\xac\x38\x78\x48\x29\x4a\x7b\xc7\xa4\x57\x48\x71\xc1\x96\xe1\x9b\xc7\x99\x48\x8e\xcf\xb3\x63\x59\xef\xe1\xdc\x7b\x0d\x5d\x51\x63\x86\xab\x13\xc3\x99\x7a\xce\x2f\x0d\xac\x9c\xc0\x10\x8d\xaf\xd8\x63\xb3\xaf\x8c\x81\xe8\xb4\xdb\x20\xd7\xc1\x9a\xb0\xe9\x0c\x2b\x95\x6d\xcf\x62\xd8\xa6\x71\xdc\xdf\x70\x2d\xe2\xf1\xd6\x68\xaa\x22\xb5\xa2\x16\x5d\xa3\xeb\xd1\x10\x17\x00\x37\x87\x69\xe3\xa6\x02\x58\xa4\x04\x22\xe4\x6e\x1c\xe2\x67\x1a\xcd\x31\x02\x72\xa8\xe7\x2a\xbf\x57\x94\x9d\xee\x75\x25\x48\x43\x19\xbd\xbd\xb6\xf4\x41\x42\x93\x3c\x85\x82\x9c\x8a\xe3\x44\x4c\x2a\x2c\x36\x51\xfa\x79\x73\x91\x71\x89\x34\x00\x46\xca\x60\xb1\x29\xd4\xdd\x64\xb3\x9a\x7f\xc3\x08\x76\x37\x88\xf4\xd6\x3b\xea\x12\x01\x12\xba\xea\x2c\x20\x15\x0f\xf0\x5c\x02\x03\x71\x26\x11\x09\xaf\x44\xb1\x06\x92\x73\xae\xe1\x30\x60\x2c\xd8\xbc\xf9\x30\x7a\x84\x5c\xf2\x16\x19\xd5\x50\x22\xa2\x1b\x82\x06\x63\x5a\xe2\xeb\x85\x4e\xc8\xb6\xf7\x6b\x68\x75\xee\x26\x78\xcb\x9a\x13\x36\x8b\x3e\x11\xfd\x83\x37\x03\xf3\x69\xf3\xd4\x06\xbd\x8f\x60\x45\x5d\x25\xb4\x42\x21\xed\x0e\x61\x41\x66\x5c\x12\xf0\x81\x70\x37\xc1\x45\xbe\xb1\x19\xab\x33\x6d\x92\x81\xe4\xcb\x87\x0c\x3a\x0a\x61\x31\x6b\x38\x85\x21\x74\x56\xd5\x46\x49\x21\xa2\x3a\xb8\x0f\xc9\xf5\x6d\x2d\xd6\xf5\x59\x64\xb3\x91\xb6\x12\x71\x3c\x7f\x66\x6d\x99\x70\x97\x46\xee\x66\x0b\x83\x4c\x04\x08\x14\xa1\xa2\x40\xf9\xe4\x7d\x03\xfb\x1e\x7b\xc1\x12\xcc\x4e\xc6\xc0\x1a\x0d\x0c\x4a\x29\x7f\x0c\xb2\xb1\x5e\x3f\xdc\x34\xad\xc0\xa0\x5d\x92\xcb\x98\x67\x04\x66\x7e\x53\x2e\x42\xb1\x75\x21\xe0\x85\x1e\x9d\xaf\x17\x73\x55\x4d\xd6\x91\x07\x13\xd0\x5d\x14\x1f\x18\x53\xf3\x9d\x52\xf2\x5d\x22\x58\xed\x3c\x00\xee\x9e\x03\x43\x07\xf4\x61\xf5\x62\xb2\xb7\xe4\xd4\xb9\x31\xe3\x57\xa7\x00\x28\xca\x0f\x90\x30\xbe\xe6\xa3\x29\x1d\x9d\xc9\x21\xbe\x75\xe9\x4b\x4f\x1b\x7e\xc2\x09\xa5\xd1\x31\xc6\x7f\x37\x5b\xd9\x35\xe0\xb0\x81\x62\x72\xa3\x5b\x64\x8c\x28\xac\x5a\x79\x34\x38\xb6\xb3\x5c\xe4\x2a\xe0\xd6\x2b\x15\xa0\x0c\x6e\x2b\x7b\x27\x4e\x20\x25\x33\xec\xcf\xc3\xff\xf6\x87\x74\xd4\xdf\x82\x12\x27\x2c\xcd\x30\x74\x1d\xa7\x50\xf5\xa5\x79\x38\xdb\x55\x20\xf2\x9a\xb3\x1a\x2f\xdf\xd6\x6c\x4e\x1c\x5b\x39\x47\xa0\xd0\x81\x0b\x0b\x5b\x2e\x4b\xfa\xa1\x85\xc6\x84\x6c\xa6\xd6\x3d\x18\x71\x18\x1c\xbd\xa3\x24\x69\x5f\x16\xf7\x85\x08\x49\x13\xfe\x6f\xfb\x9a\x1c\xc8\x4d\x04\x7f\x6c\xae\x10\xcc\x06\x65\xc1\xec\x57\xf9\xd1\xfc\x52\x72\xe7\xa1\x3c\xd3\x04\x2d\x28\x3a\x5d\x83\xef\xc1\x07\xa3\x64\xdd\x24\xc8\xc1\x7d\x00\x4d\x27\x69\xf5\xcb\x38\xe0\xaa\x6a\xe2\x12\x5c\x80\xeb\xf6\xc4\xab\xb1\xd3\x9b\xa1\x09\xb4\x82\xd0\xb7\x91\x5c\x2b\x10\xcb\xf7\xfc\x1c\x69\x5d\x88\x39\xed\xc9\x78\x85\x36\xe6\xb4\x7c\x6e\xdf\x50\x26\xec\x9b\x75\xf5\x7d\x46\xe1\x6f\x07\xa0\x66\x80\xf4\x65\xac\x15\xe9\x38\x13\xcc\x6e\x23\x0e\x44\x88\xe8\xbb\x69\x50\x05\x34\x1e\xd1\x69\x70\x46\x8a\xe5\xc8\x79\xd0\xea\x28\x32\xd6\x09\x7b\x76\xd1\xc3\x06\x81\x16\x14\x70\x3f\xcd\xa4\x00\xbc\xb3\x98\xd4\xd4\x02\x74\xe2\x0d\xc1\x26\x92\x80\x67\x58\x6c\xbc\xe0\xc8\xe1\x70\x09\xd4\x60\x09\x58\x1f\xae\x73\xbe\x0e\x59\x7a\xf1\x55\x67\x09\x94\x65\xd3\x11\x18\xb6\x67\x76\x25\xfd\x40\xac\x06\x84\x3b\x42\x11\x39\xe5\x6d\xed\xa2\xb0\x15\xb6\x6c\xe5\x25\x5c\x32\x8d\x30\x58\x0f\xc8\xdc\xe0\x72\x81\x8d\x40\xa3\xc3\x56\x13\x5d\xd2\x53\x17\x69\x73\x97\x16\x0e\x9c\xaa\xec\x77\x09\x7e\x6c\xc2\x1d\x17\x45\x14\xfd\x36\xa2\x35\x23\xe6\x37\x91\x39\x19\x9a\x61\x95\x5f\xca\x04\x31\x03\xf9\x1e\x9b\xe0\x63\x25\x22\x93\x70\xee\x1c\x22\x40\x43\x3a\x3f\x1a\x5c\xb7\x4b\xe9\xc9\x9f\x72\x7d\xfc\xcf\x05\x80\x51\x26\x17\xd5\xdb\x4a\xda\x5a\x0d\x82\x0b\x21\x19\xe4\xad\xb1\xb6\x5f\x07\xd0\x5f\xa0\x16\x9c\xd2\xbe\x7d\x08\x63\xa8\x88\xf1\x1f\x95\xc2\xa0\x00\x1e\x98\xf7\xf0\x49\x39\x97\xba\xd9\x63\x82\x02\x12\x51\x0c\x61\x22\x39\xdd\x7f\xa0\xbd\xa1\x58\xdb\xd8\xd9\x88\xba\x1f\xcb\xa2\x73\xcc\x61\x65\x03\x15\x9f\x59\x43\x26\x79\xde\xbd\x78\xf1\x90\x3f\x22\x13\x34\xda\x27\x05\x32\xa0\x1a\xf8\x35\xc1\x5a\x35\x67\xb4\x99\xee\xfb\xec\xbb\x38\x8d\x9f\x33\xc1\xe0\xef\x49\x4c\x6b\xc2\x16\xaf\x3f\x18\x7d\x80\x11\x0c\x3f\x40\x93\x5f\x73\xbf\xb7\x0f\x4f\xec\x3b\x17\xe3\x58\xb5\xa8\xba\x5f\x42\x4a\xff\x38\xb2\x97\xc5\xbd\xdb\x48\x92\x90\x46\xfd\x3b\xd8\x0c\x7f\x7f\x5e\x2f\x6f\x3f\x46\x3d\xdc\x20\xab\xb5\xf3\x95\x23\xdd\xac\x7b\x39\xde\xef\x68\xae\xad\x04\xf2\xb2\x4d\x0a\xeb\xab\x1b\x5d\x4e\x67\xe6\xcd\xb0\x54\x59\x98\x5b\x91\x51\xfb\x45\xef\x3c\xce\x23\x66\xd3\xeb\x1f\x20\x9f\x30\x2b\x0a\x81\x8a\xa4\xfb\xb0\x03\xc0\x8d\xa0\xf7\xa0\x05\xc0\x75\xa5\xa7\xe7\x29\xaa\x90\xb5\xa2\xbd\x0c\x45\x94\xc6\x16\x42\x7d\x83\x6b\xc2\x47\xa2\x18\x35\xee\x92\x99\x04\x1e\x58\x87\x61\x61\xa6\x29\x49\x25\xec\x06\x85\x29\x35\x1f\x6f\xa8\x22\x6e\x89\x0a\x72\xea\x98\x80\x12\x40\x21\x0c\xd8\x8a\x80\x82\x48\x78\xf6\x97\x6c\x3a\xad\xd2\x29\xa2\x14\x29\xc8\x7c\x49\xc0\x55\xe7\x33\x17\x69\x7f\x11\xb3\x7b\xd4\x56\x6c\x0b\x6d\x5a\x27\xe6\xe3\xac\x9b\xf0\xe3\x84\xb1\x03\x9d\xb0\x83\xa9\x06\xae\x63\x49\x77\x83\xf1\x9c\xd6\x80\x50\xe8\xdf\x27\x72\x3f\x2c\xba\x09\x74\xe9\xe3\xb4\x21\x91\xe2\x04\x5f\x35\x89\x01\x34\x2a\x67\x83\xb4\x30\x43\x24\x35\x20\x4e\x00\xf3\xc7\xa4\x59\x89\xa3\x85\x10\x72\x32\xb0\xe5\xc8\x57\x10\x31\x90\x95\x86\x0a\x80\x52\xc9\x2d\x0d\x38\x64\x90\xc4\xbd\x1f\x1c\xff\x72\xb2\xbf\x7b\xde\xdd\x99\xfb\xf0\x4f\xc6\x0c\xb0\x27\x8c\xa3\x4c\xd0\x39\x66\xfd\x31\xc5\x48\x6c\xba\xaa\x2d\x41\xa0\x7a\x64\x2f\x1a\xd1\x4e\x79\x33\x1d\x89\x12\x7c\x43\x8b\x8b\x3b\xfc\xba\xc8\xcc\x56\x8f\x86\xdf\x72\xa9\xc7\x71\xbd\xaf\xd2\x06\x00\x1e\xde\x74\x5a\x87\x0d\xee\x91\x55\x81\x92\x43\x54\x56\xd5\xfa\xf2\x2b\x5b\xe4\x36\x09\x90\xb9\x5d\xc9\x58\x82\x7b\x08\x68\x54\xb9\x36\xa3\xe6\xf8\xb2\xdb\x1e\x08\x5d\x33\xa7\xd9\x90\x57\x13\x27\x5f\x43\x55\x51\xdd\x58\x1d\x37\x6d\x74\x0f\x40\x1b\x44\xde\x93\xd4\x48\x01\x26\x31\x56\x1c\xdc\x66\xc8\xbd\x45\xbc\x62\x42\x8f\x6d\xc1\x8f\x93\x3b\x86\x03\x2b\xff\xae\x15\x40\x8d\x34\xb8\x5d\x37\xed\xdd\xb7\xf5\x95\xce\x4e\x9b\x35\x63\xa3\xbd\x8d\x36\x35\x6d\x92\xd6\x9b\x5c\xf6\x0a\xfb\x8e\xbb\x13\xa3\xa6\xa1\x81\x65\x35\xae\x8a\xb4\x1e\x90\xdb\x00\x5b\x7a\x40\x90\x82\xc1\xa6\x26\x3b\xcc\x9c\x5f\x82\xf1\x5d\x4b\x87\xb0\x8e\xe8\x0f\x68\xec\xd8\x28\x95\x66\x61\xc6\x8c\xcf\xe3\x44\xc2\x61\x66\x97\x52\x54\x66\xf8\x9d\x02\xca\xac\xb5\x63\x64\x1d\xe4\xac\xb4\xcc\x2e\xcc\x00\xb5\xbd\x1a\xd3\xa2\x45\xf8\xa3\x8e\x3f\xf2\x9b\xd0\xb9\xac\x7c\xfb\xc5\x13\x45\x46\xf7\xa4\xde\x45\x45\x84\xc9\xc7\x9b\x50\xa1\x33\xe6\x72\x00\xee\x32\xda\x05\x11\xec\xfc\x36\xd4\xc0\x28\xb1\x39\x8b\x96\xae\x1a\x06\xb8\x02\x1b\xd7\xd9\x3b\xdd\xfc\x5f\x6c\x30\x72\x8a\x5d\x0c\xe0\x85\x75\xb0\xaf\x07\x1f\xcd\x98\x89\x52\x85\xef\x2e\xca\x9f\x89\x93\x0a\xbe\xa8\xed\xf3\x0f\x49\xc4\x50\xed\x74\xc5\x59\xd8\x0d\x79\xf6\x2c\xfc\x9e\x73\x15\xbf\xab\xa8\x36\x1f\xb3\xca\x66\xf5\x44\x5f\xc3\xd9\xd6\x8e\x04\x9e\x2b\x5d\xb6\xe7\xf0\x56\x10\x43\x55\x70\x34\x3d\xca\x0b\xd9\x69\xb1\xf4\xfc\x90\x90\x56\x50\x0f\xac\x8e\xf4\x1e\x30\xb5\xff\x3d\xa8\x27\xcb\xee\x46\x4d\x10\xf9\x5c\x95\xd4\x2e\xe1\x96\x63\x6d\x03\xf0\x8d\x8d\x95\x44\x75\x69\x97\x7b\x80\x79\xca\xc1\x67\x01\x1e\x53\x36\x74\x23\x11\x7f\x7d\x75\x28\xb9\xae\x80\xdc\x71\xe6\x26\xc4\x0f\x7c\xf2\x74\x62\x6a\x36\xcb\xe8\xd2\x4c\xdd\x2a\xbe\xc3\x0f\x56\xd2\x2d\x94\xc6\x88\x35\x98\xf0\xb0\xbf\xed\x1d\x3f\x19\x37\xeb\x96\xaf\x81\x88\x17\x0e\x92\x50\x48\xbc\xfd\x89\x17\x27\x76\xad\x12\x2c\x31\xf6\x7b\x31\xb7\x8d\xdf\x84\x20\x74\xaf\x2b\x79\x6d\xcd\xc9\x5e\x7c\x88\xb6\xca\x60\x8d\xb3\x32\xb5\x29\xe9\x92\x96\x2b\xac\xb9\x6d\x82\xbd\x41\xec\x6f\xee\xe4\x2a\x3c\x68\x17\x2a\xc5\xfb\x71\x60\x22\x6d\x36\xed\xcc\x9f\x56\x66\x1f\x9c\x99\x6c\x7d\xa6\x37\x43\xab\xc0\x66\xe3\x46\xbd\xcf\xc8\x87\x2e\x5d\x06\xd6\x79\x11\x75\x2c\x94\x17\x7d\x2d\x41\x4b\x49\xc6\x1e\xb5\x99\x94\xe3\x7e\xe5\xa6\x4b\x61\x8f\x3c\xd9\xc5\x5f\xac\xf3\xfa\xbe\x3c\x61\xd7\x74\x59\x23\xe0\x2e\x11\xe9\x3c\xd1\x22\x2d\x46\x89\xfa\x7d\x6d\x41\x24\x2f\x12\x5e\x15\x5a\xb4\x00\x8a\x09\x18\xfc\x6c\xef\x55\x1a\xec\xef\x79\x9c\x43\x21\xa7\x41\x3e\xe8\xaa\xc2\x29\x2f\x46\xca\x0a\x2d\xba\x3d\x06\x47\x8a\x28\xb1\x9c\xed\x36\x98\x63\xbe\x58\xa8\x43\x68\xab\x23\x2e\x48\xd8\xc8\x8e\x30\x8e\xe6\x66\x65\xf0\x5f\xbb\xc0\x7f\xa6\x8c\xe6\xbf\x04\x20\x9f\xb2\xb8\xe2\x90\x28\x6b\x5c\xb6\xc1\xba\xea\x3f\x70\xb0\x92\x6b\x56\xf9\x9a\x34\x14\xf7\xf6\x81\x60\xb2\xe6\xfa\xc6\x62\xdf\x04\x63\xb3\xad\xe5\x1e\x35\x13\x0f\x27\x5b\x1b\xb8\x6b\xba\x98\x32\x60\x67\xf2\xd1\x06\x19\xe2\x65\xf6\x0d\x2f\x4b\xbf\x22\x0d\x91\xd8\xa6\x67\x39\x3d\x29\x84\xfd\xc0\x1e\xa2\x50\x9b\x0f\xf6\xb9\xed\x1f\x5e\x96\x92\xb2\x8b\xdc\x5b\xd7\xc9\x0a\xba\x26\x89\xa7\x83\x57\x12\x0c\xc8\x5e\x71\x21\x3c\x08\x36\x85\x37\x91\xd9\xf7\x18\x77\x90\xad\x67\xa8\x42\x41\x49\xa7\x82\x3c\xfd\x51\x09\x17\x70\x84\x47\x70\x85\x29\xe4\x21\xe3\xd2\x81\x47\xf4\x0a\x21\xf2\xd2\x68\x14\x79\x97\x43\x2a\xc6\x72\x28\x56\x98\xd8\x02\xe6\x51\x4c\x51\xa0\x45\x91\xa6\x32\x47\x66\xef\x6c\x94\x87\x71\xaa\x32\x29\xc3\xf8\x76\x80\x3f\xe8\xa6\xc8\xb9\xec\x4f\xa8\xf7\x89\x69\xfc\xe3\xdc\x67\x96\x28\x21\x0f\xa4\x2d\x2c\x04\xa7\xf8\xfc\xa6\x89\xd6\x2a\x4f\x37\x73\x1f\xa9\x27\x3d\x5f\x3e\xae\x63\x27\x65\x6e\x3a\x77\x33\x5e\x6e\x01\x24\x33\x00\xd5\xa2\x00\x41\xd0\x32\xba\x0b\xe8\x68\x36\x41\xbd\xeb\xc2\x48\x90\x5d\xf3\xea\x45\xdf\x59\xb0\xdf\x74\x1d\xd7\x45\xba\x2d\x9f\x8c\x8f\x5b\xb7\x51\x31\xef\xed\x77\xe7\x82\x50\x93\x6e\x6d\x4d\x76\x63\xb9\x64\xfc\xca\xc2\xf2\xba\xd7\xb3\x61\x13\xbe\xc9\xb0\x82\x81\x24\x84\x80\xe3\xac\x03\xa3\xfd\xad\x5a\x59\x6a\xcd\x6f\xea\xbb\x12\xa4\xe7\x58\xa6\xa0\x7d\x2d\x26\xa7\x05\x78\x1a\xf7\x5c\x08\x08\x66\xb7\xab\xc9\x1a\x17\x3c\xb2\xd8\xbb\x2c\x33\xe9\x20\xcb\xfd\x31\xa7\xa1\x29\x44\xb7\xe2\x1e\xbb\x99\xcb\xad\xb9\x7d\x00\xf5\x32\x7a\x36\xec\x34\x76\x2d\xf9\x55\x89\x1a\x75\x36\x6b\xdf\xaa\x60\xa1\xe7\x6d\x83\x6d\xb2\xc0\xd9\x01\xc8\x71\xe8\xf8\x58\x5b\x8f\x9c\xc6\x13\xcd\x0e\x6c\xd1\xa1\x00\x59\x15\x66\x74\xb9\x76\x52\xe7\xc0\xf6\xa5\xad\x52\xea\xbe\xa9\x6b\x9d\x4d\xe1\x70\xa8\xa5\xdb\xec\x02\x9f\xfe\xf9\xb6\xc7\x51\x62\xd0\x7e\x2d\x47\xc0\x3d\xd0\xd3\xde\xf1\x83\x1a\xe8\xe1\xf8\x78\x67\x64\xad\x49\x15\xa2\x89\x7e\xf4\x92\x70\x71\x22\xb3\x4f\xc0\x31\x83\x76\x66\x07\xfc\x13\xc5\x90\x89\xdf\xe5\x19\xa3\xb0\x42\xfc\x08\x74\xe9\x78\xec\xef\x7a\xd8\xa9\x69\x69\x3d\x01\x5b\x6f\xa9\xda\xe8\x68\xa3\xaa\x71\x75\xe4\x53\xa5\x4e\xb7\x35\x86\xd4\xe9\x19\xa6\xdb\x14\x23\x19\x70\xe8\x8d\x70\xcf\x5f\x7b\x7c\xdc\x66\x86\x1d\x4f\x3e\xad\x75\x1b\x70\x16\x8c\xa2\x2e\x2c\xda\x3e\x12\x42\x4c\x79\x8e\xb8\xce\xdf\x10\x22\x27\xf1\x26\x77\x1b\x74\x23\x9c\x1b\x0e\xb4\x0a\x92\x7b\xba\x8b\xc9\x02\x25\x32\x8c\xd6\x30\xe0\x22\xaf\x8b\x43\x67\x89\xe7\x7c\xcb\x0a\x5c\xcb\x30\x69\x1f\x93\xeb\x63\xbc\x41\xc4\xe9\xb1\xbc\x32\x41\x17\x10\x31\xaa\x2a\xa5\x1a\x2f\x11\x9f\x82\xcd\xdb\x22\x71\xaa\x34\x13\x41\x2b\xe7\x34\xe0\x90\xf2\xf0\x4a\x22\x7c\x4a\x49\xf4\x5e\xe4\xb4\x36\xe9\xc5\x49\x62\x28\xd7\xaa\x20\xe0\x96\xcc\x84\xcd\x77\xa6\xb5\x35\xbf\xa5\xb5\x1f\xbb\x62\x5c\x54\xe5\x21\xbe\x6c\x35\x06\x67\xd5\x9f\x21\xd5\xcf\xed\xda\x06\xcc\xfc\xfa\xd9\x96\xce\x3a\x1e\x3e\xc6\x93\x0f\x6f\xa5\xfd\x80\xa8\xd7\xb3\x3b\x4a\x0e\x6e\x99\xd7\xa7\x8f\xaa\xf5\x07\x94\x3c\x32\x87\x75\xde\x11\x84\xb3\x13\xa4\x34\x9a\xc6\x95\x3f\xfd\x87\xd6\x3e\x22\x05\xee\x8f\xa9\x58\x40\xaf\x9e\x4f\x82\x31\x31\xc4\xa1\x1f\xfd\x3a\x84\x6d\xf2\x1c\xcf\x75\x35\xf7\x4a\xfe\x10\xa4\x79\xcf\xe2\xa1\x72\x16\x89\x85\x93\xbf\x48\xaa\x3c\x73\xe9\xd6\x08\x0d\x82\x0d\x2a\x76\xfd\xe8\x52\x79\x6c\xa7\x42\xba\x43\x4b\x80\x76\x6d\x38\xfa\x19\x24\x15\x8b\x7e\x13\xe4\x90\x0b\x88\x66\x60\x71\x40\x97\xef\x43\x0c\x90\x06\x9c\x9e\xc6\x68\x70\x2c\x5e\xe4\x57\x0d\x3f\xaa\x77\xb2\xa3\xd5\x09\xf8\xe0\xb0\xe5\x3d\x81\xf9\x41\x2b\xa3\xe0\x4b\xeb\xe2\x3c\xf4\x37\x3d\xdb\x4a\x3e\xb2\x61\x1c\xab\xf1\x51\x9a\xaa\x37\x73\xe8\xd6\xdf\x90\x24\x76\x24\xf4\xbf\x78\xd7\xde\x3b\x8e\xa4\xee\xa9\xa1\x5d\x95\xa3\xb0\xc1\x07\xbd\xdd\x38\xdd\x97\xbb\x46\xb7\xc8\x03\x04\x31\xe3\x17\xff\x1c\xe8\x41\xa1\xa5\xa5\x26\x7b\xcc\xd1\xf9\xdd\x4b\xed\x57\x14\xf7\x1b\xd4\xd1\x74\x5c\x5f\x5d\xfb\xce\x74\x71\x3e\x54\x05\xc7\x48\xcc\x56\xe2\x0b\x27\x55\x03\xf3\x2b\x4a\xd8\xa5\xcb\xa8\xf9\x71\x6f\x6f\xa9\x6d\x3c\x43\x0c\xe7\xc3\xe1\xf0\x06\xec\xb2\x75\x3f\xf2\xfe\xcd\x02\xa5\xd7\xb3\x94\x33\x2a\x57\xe5\x5c\xf8\x03\xaf\x2e\x34\xad\x1f\x47\x81\xf9\xf9\x1a\xc6\x93\x9c\x1f\xe2\x9c\x11\x58\xef\x65\xf8\x9b\x2e\x3b\xb7\xd0\xad\xf8\x2a\xf3\xf3\x3f\xfd\x35\x62\x64\x07\x13\xf4\xac\xea\x6a\x22\xe2\x1f\xae\x89\x02\x81\xbc\xce\x9b\x11\x23\xa1\xa9\x0e\x97\x19\x79\x98\x1a\xa4\x31\x6b\xdb\x24\xf3\x81\x8d\xcf\xf0\xd4\xa2\xe8\x3a\x01\x95\x85\x8d\xc7\x23\x53\x65\xf1\x39\xd7\x1d\x86\xd5\x20\x02\x07\xe8\xe1\xcc\xa0\x1e\x78\x26\xc3\x04\x17\x2e\x02\x55\x4e\xa8\xda\x18\xeb\xba\x23\x3b\x23\x4b\xab\xdb\x28\x9f\x01\x7c\x42\x02\xbf\x80\x65\x52\x82\xf8\x6d\x20\xcb\x02\xd1\x54\xf0\x40\x35\x38\x3f\xb1\x57\xf1\x46\x75\xa5\xba\x75\x34\xb1\x67\x67\xc3\xad\x9d\xe6\xed\x43\x3f\x46\x7c\x05\x8e\xa8\x0c\xb0\xf3\xfd\xb9\x57\x09\x3f\xfd\x69\x81\xd9\x5c\xa5\x8b\x1f\xdf\x92\xd3\x13\x15\x5d\x5c\x5d\x95\x20\x74\x17\xd3\xfa\x80\x18\xd3\xe4\x76\x5e\x3d\x7b\xac\x20\x71\xcd\xc2\xf5\x81\x08\x72\x25\x7b\x15\x47\x05\x89\x1a\xa0\xd9\xd1\x7c\x41\x89\x6c\xf3\x91\xf9\x3d\x5a\xab\x27\xf7\x3d\x1d\xd5\x52\x31\x99\x44\x04\xec\x27\x94\xf2\xfa\xae\x17\xd0\x01\x0a\x5e\x3d\x14\xaf\xfb\x05\x88\xf3\x95\xaa\xe5\xa3\x3f\x0e\x8d\xbc\xec\xcc\x40\x36\x8b\x9e\xbc\x60\xc1\x8f\x72\xd6\x25\x26\x82\x3a\x42\x65\x4f\x54\xde\x6d\x0c\xdf\x90\x5e\x15\x44\xca\x3b\xf1\x42\x32\x88\x85\x3b\xc1\x63\x47\x09\xf2\x6f\x5c\xa5\x76\x4e\x51\xcd\xa0\x0e\x10\xf9\x10\xd2\x8b\xd9\xe6\xc8\x63\x8b\x98\x4d\xc3\x57\xfd\x40\x1b\x96\xe0\x94\xb7\x8a\x69\xc7\x46\xbe\x86\x23\xf5\x5b\x71\x06\xa6\x71\x15\x14\xd7\x33\x06\x9c\x58\xa6\xc1\x09\xbd\x6e\x40\xce\x7b\xa9\x0b\x16\x75\x34\x3d\xf1\xe3\xf4\x39\xd7\x81\x03\x0a\xf9\x7a\xef\x88\xf6\x79\x04\x03\x62\x5c\x05\xce\xe0\xe4\x92\x73\x98\x46\xf5\x3c\xca\x47\x3a\xbf\xbf\x70\x04\x77\xdb\x5a\x22\x32\xa5\xb8\x0a\xb7\x8e\x2a\x29\x4d\xf3\xfe\xd5\xa9\x24\x16\x6a\x11\x4a\x48\xca\xcf\xa9\x6a\x43\x6a\x21\xac\x3d\x6c\x5e\xcb\xbc\x21\x8c\xfa\x08\x34\x54\x3a\xc4\x8e\x4c\xcc\x99\x45\xd6\x5e\x11\x7e\x33\xe1\x55\xa8\x16\x71\x32\x40\xe3\x95\xdd\x27\xef\x34\x6c\x36\x41\xc3\xa4\x73\xc0\x4f\x5c\x64\x82\x9e\x76\xa0\x5b\x8a\x81\xb5\xc0\x4a\x82\x32\xa1\x98\x48\x90\xe0\xa9\x93\xa1\x9e\x48\xc2\x75\xa4\x0f\x38\xb7\x8f\x61\x5c\xa8\xc4\x9d\xbb\x51\xe9\xd1\xc1\x71\x47\xc7\xe2\x60\x3b\xc0\xc3\xd4\x1b\xeb\x9a\xa3\xa4\xbd\xbf\xdc\xe0\xaf\x02\x2d\xe4\xc1\xbe\xc9\x43\xac\x8c\x05\xc1\xdb\x22\xd5\x1e\x98\x20\x22\x9f\xcc\x52\xd5\x7e\x66\xc5\xd4\xd4\xf5\xe3\x1f\x24\x7e\x65\xfc\xd6\x26\x2b\x33\xf4\x22\x5b\x16\xda\x9e\x78\x48\x29\x89\x9d\xbb\x6a\x23\x34\xb5\x9b\x73\xc5\x88\x81\xb9\xc0\xe3\x38\x8f\x11\xc7\x73\xf5\xe2\x64\xcd\x31\x38\x21\x51\x73\x4e\x59\x9e\x1d\xcb\x9c\x4e\xb6\x4a\x1f\x2e\xff\x43\xf8\x05\xd1\x17\x9f\x30\xa3\x18\x68\x3f\xff\xb7\x12\xfb\x0f\xa7\x6a\x2f\x72\x4f\xbe\x7e\x8f\x22\x03\xcc\x86\xd4\x1b\xc5\xb8\x4a\x2f\x6e\xda\x38\x65\xef\x11\xf1\xfb\x02\x80\xd6\x96\xd9\x0c\x57\x31\x6c\x38\xec\xf8\x44\x14\xc2\xd2\xcf\xac\x04\x95\xd4\x93\xbf\x2e\x6a\x60\x24\x5e\xf8\x95\x1a\x38\xaa\xed\x32\x93\x70\xa9\x6b\xd5\x2e\x61\xee\x7d\xba\xe8\x57\x90\xcb\x77\x4c\x37\x55\x61\x83\xe4\x73\x78\x40\x96\xe4\x06\xb4\xd4\xba\x62\x0d\xff\x1a\x79\x85\xfa\x18\xec\x59\x23\x0f\x38\xcd\x50\x9d\xd1\x72\xad\xc3\x34\x46\x56\xbc\xd6\x71\x24\x44\xf7\x3a\x0b\x70\x5d\xdd\x42\x9d\xca\xcc\xde\x8e\x14\xb3\xac\xca\x63\x60\x7d\x7e\x15\xd8\x24\xaf\x74\x5f\x29\xe5\x39\x6a\xa8\x8c\x3c\xa7\x15\x9b\xb9\x7f\xc5\x41\xaf\x18\x32\xbe\x01\x10\x01\x4a\x5f\x68\xa7\x44\xa4\x53\x38\xdb\x25\x14\x72\x0f\x3c\x79\x22\xa8\x54\xd9\x80\x6b\x0b\x13\xe0\x45\x60\x8b\x79\xea\x70\x8b\xab\xa2\xd1\xeb\x66\xdb\xbd\xb1\x8b\x22\xa6\xfd\x4c\xfc\x55\x71\x38\xd6\xd2\xcb\x17\x2c\x36\x29\xc4\x63\x5c\x67\xf1\x73\x04\xf7\xa8\x2b\xfa\xcd\x39\xd3\xa4\xc9\x08\xaa\xb0\x75\x91\x95\x46\xae\x9e\x7d\x7f\xd9\xd0\x00\x9d\x39\x1f\x36\xe5\x84\x8f\x06\x51\x0e\x85\xc4\x0a\x96\xa0\x88\x3e\x6b\xd6\xf3\xfa\x69\xe0\xc4\xfb\x63\xc4\x0a\x02\x9c\xf0\x21\x11\x93\x57\xb7\xa7\x5c\x55\xa2\xcd\xf2\xaa\xcb\x8c\x2b\x59\x81\x9c\x64\x80\x90\x33\xf2\x1e\x76\xcc\x7b\xaa\xa1\x7f\xa7\x44\xcd\x19\xad\xbe\x09\x86\xf7\xdc\xc8\xa0\xc8\xcf\x39\x67\xb6\xf3\x08\xc2\x03\x68\xf7\x8d\x0f\x69\x54\x87\x29\x67\xba\xe9\xd6\x80\xe5\x74\x74\xba\x9f\x59\x67\xbf\x7f\x07\x51\x4a\xc9\xa0\xcb\x8b\xbe\x77\xed\xf4\xf5\x57\x3c\x53\x9e\xbc\x9f\x23\xf4\x4a\x30\x78\x12\xf0\x69\x26\x6f\x71\x8d\x04\x90\x9e\xa3\x2e\x83\xa3\x77\xae\xab\x1c\x4c\x0b\x19\x28\xd5\x96\x75\xdd\x39\x9a\x32\xfa\x33\x17\x49\xfb\xd6\xa0\x37\xba\xe6\xf6\xe6\x61\xc9\x77\x8c\x57\xeb\x69\xb2\x54\x37\x62\x4a\xaa\xb6\xa8\x86\xae\x6e\x19\x88\x1d\x76\x19\x2c\x8b\xfb\x9e\xfe\x65\x10\x03\x17\x02\x2d\x96\x78\x94\x0d\xd9\xd0\xa7\x6f\xf3\x9b\x35\xe1\x50\xf7\x2d\xc1\x67\x31\x93\x64\x47\xd3\xfa\xbe\x2b\xfa\x0f\xe4\x4a\x5c\x23\xad\xec\x04\xcd\x2d\x79\x32\xa3\x42\xab\x71\x23\x52\x80\x36\x19\x94\x07\x6d\x78\x89\x3f\x30\x7b\x4d\x2f\xdd\xd1\xb7\x50\x84\x4a\x45\xe3\x17\x64\x22\xd0\x5f\x25\x76\x36\x65\x52\xab\xc7\xf9\x1d\x4d\x33\xbb\x43\xde\xf6\xc9\x8e\xd3\x46\x51\xe1\x9d\xbd\x48\xd4\x15\x03\x01\x10\xc8\x9a\xf1\x77\x56\x74\x43\x7e\xc7\x57\x61\xe2\x71\x16\xd5\xa3\x5c\x1f\x62\x6e\xd9\xb3\xdb\xd0\x4d\xef\x45\x9d\xf1\xc1\xea\x1a\xe9\xc2\x6a\x3c\x6f\xa9\xa6\x77\xb1\x8c\x24\x1e\xaf\xfb\xcc\x76\x47\x01\x05\x50\x94\xdc\x64\xd1\x40\x54\xa2\xba\x09\x03\x3f\x0b\x57\x49\x0e\x22\xc7\xee\xf4\xaa\x39\xe4\xa1\x1b\xde\xea\x1d\x78\x7b\x8a\x43\x08\xfa\x12\xa9\x8e\xa4\xe3\x8f\x30\x46\x4d\xa0\x5f\x9a\xb1\x17\x86\x07\x6a\xcf\xb9\x27\x55\xce\x19\x6b\xbb\x60\xa4\xb6\x3a\x8f\x41\x76\x10\xbf\x54\x10\x01\x37\x39\xe7\x41\x1c\x71\x83\x74\x74\x44\xe6\x67\x75\x09\x7d\xa6\x5d\x47\xe2\x6a\x75\xa4\x34\x7e\xbe\x92\x7c\x5e\xd7\xa6\x82\xa2\x87\x7c\x4d\xfe\x04\xcc\x05\xfb\x27\x26\x45\x67\xbe\x87\x33\x03\x24\xdb\xab\x53\x13\x70\x9b\x4b\xda\x67\xf4\x8d\xda\x40\xa0\x76\x16\x37\xdf\x20\xdb\x51\x85\x6e\x20\x99\x55\x7a\x13\x5a\x52\x80\x1d\x97\x16\x06\x5e\x37\xf4\xbc\xe8\xb7\xd6\x66\xe7\xda\xc7\x6d\x4a\xc9\xf0\x38\xe3\xd2\x90\x5d\x8f\xab\x28\x8e\xdd\x5a\xe7\xd4\x9d\xb3\x15\x55\x61\x01\x33\x8d\x49\xcd\x88\xe0\x66\xdd\x7e\x04\xed\x81\x14\x03\xc3\x5f\x76\xa1\x74\x22\x91\xb4\x94\x74\xe6\x9d\x67\xf1\xdd\x17\x46\xf3\x30\x6c\xad\x38\x7b\x04\x9e\x9b\xa7\xac\x15\xf1\xb2\x6a\xbc\x88\x14\x0f\x2e\x69\x58\x50\x2b\xc1\xf7\xec\x84\xdf\x50\x2d\x74\xe3\xfe\xa6\x3b\xb9\x4b\x09\x81\x5e\x4a\x70\x23\x15\xc6\xbf\xa7\x80\xba\x0a\xfa\x30\xf4\xde\xea\x20\xd0\xcb\x6e\xa2\x9b\xdc\xdc\xa4\x42\xdd\x60\x10\x90\x26\xd2\x92\xb2\xae\x76\xfc\xf2\x57\x76\x98\x98\x08\x35\x5f\xd2\x7f\x99\xf4\xae\x90\xb1\xbf\xe9\xfa\xb8\x73\xe8\xab\xf2\x1b\x75\xd0\x60\x8e\xb2\xeb\x1f\xf0\xd0\x85\xd0\xeb\x66\xd4\xa9\x76\xd1\xb1\xdc\xb0\x56\x7f\x3e\x48\x87\x57\x06\x96\x38\xaa\xda\x1f\x9e\xc9\xc4\x97\xac\x98\xf6\x27\x0e\x3e\x53\x10\x7a\x42\x68\x5f\x65\x58\x9b\x73\x1d\x69\x98\x60\xd0\x80\x93\xa7\x80\xb0\x00\xa0\xf5\x93\xfc\xd7\xc4\x4d\x6f\xeb\x27\x06\x43\xe4\x62\xa8\x4d\xb8\xff\x0c\x7a\xc7\xad\xa2\x91\x69\xc3\x2e\x5e\x94\xee\x42\x78\x13\x48\xe8\xeb\xbd\x94\x67\xcc\xdf\x31\xef\x60\x02\xe1\x19\x5a\xf4\xcf\x71\x47\x5c\x5b\xda\xa2\x4a\x4d\xc2\xcb\x6f\xbc\xc4\x18\x56\x54\x84\x21\x24\xf9\x0a\x47\x61\x34\x3b\x33\x69\x14\x26\x97\x6a\x69\xea\xd4\xcf\x84\x97\x1e\x65\xc1\xe0\xc6\x57\xb6\xeb\x41\x49\x11\x11\x0b\x07\x76\xea\x45\xdd\xf3\x7e\xdc\x26\x9d\x90\x0a\x1d\x47\x74\x10\x42\xf0\x6a\x6c\xed\xc8\x69\x27\x74\x60\xb6\xd0\x7e\x9d\x90\xf4\xa3\x31\x12\xdb\xd8\x3b\x3d\x3d\xcb\xaf\x52\xfd\xe9\xa5\x1a\x84\x4a\x24\x4b\x91\x31\x26\x4c\xa4\xca\x90\x31\x26\xdb\x88\x84\x9e\xf1\x43\x60\xa9\x41\x69\x86\xc1\x07\xf0\x44\x53\xb9\x32\x59\x2a\x49\x49\x1a\x9f\x0b\x89\xbe\x48\x58\xf3\x31\xa4\x27\x31\xe3\xcb\x6a\xd9\x1a\x32\x4f\xce\xe0\x2d\x8d\xf1\x58\x43\x10\x19\x28\xc6\xe5\xa6\x0c\x07\x2f\xe8\x3e\xdb\x9c\xe9\x75\x1e\xbb\xa3\x28\x0c\x4d\x66\x1a\xe3\xf7\x74\x83\x88\x78\x54\x7d\x60\x18\x3d\xc2\x2b\xfb\xa2\x8e\xbc\xf7\x81\x4d\x67\xef\xd0\x21\x21\x92\x49\xc0\x76\x88\x07\x3e\xcb\xe1\xa8\x64\x70\x10\x5e\xb8\xf5\xde\xec\x24\x7d\x16\x0b\xb9\x38\xb3\xdd\xb5\x7d\xc4\x3d\xe1\x1b\xc1\xaa\x45\x76\x7e\xa3\x54\x43\x9d\xfe\x01\xc6\x43\x94\x63\x12\xdb\x97\xc0\x95\x96\xd3\xef\x08\xe6\xcf\x42\x19\xf4\x35\x78\x8a\xfc\x79\x78\x53\xf2\xe2\xc6\x97\x12\x8a\x38\xd3\x40\xbb\x64\x56\x22\x99\x7c\xb3\x47\xde\x09\x03\xf9\xad\x58\x9e\xd5\xd6\x9e\xfe\xcd\xe8\xb2\x12\xb6\x69\x89\x77\xe3\x35\x73\x5b\x2b\xdc\x85\x27\xc5\xfc\xae\xad\x42\x7f\xa3\xc2\x66\x59\x55\xc6\x5b\x15\xf8\xf5\x70\x52\xbc\x8c\xae\x58\x59\x05\xa3\xf4\x24\x6d\x51\x4c\xd0\x02\xdd\xd3\xef\xb9\xd3\x28\xed\x2d\x9d\x8f\x52\x2b\xf2\x62\xbc\xd4\xd1\xed\x85\x8f\xfb\xa4\xfd\x65\xa4\x06\x46\x44\xd7\xab\xec\x7d\x1c\x23\xba\x99\xca\x42\x73\x5a\x3e\x73\x7a\x36\x1c\xc3\x41\x67\x00\x78\x83\x84\xce\x9e\x96\xb5\x82\x11\x4f\xeb\xb8\xad\x7d\x4f\xe5\xf2\xb5\xe7\x23\x70\x1b\x58\xd2\x96\xdf\x88\xb8\x1b\xec\x6a\x81\xfb\x9b\x2d\x29\xd8\xf7\x5c\x1e\x1b\xb5\x76\x23\x4b\xa3\x0e\x7b\xb5\x8d\xce\xbe\x83\x3c\xd9\x22\xe8\x86\x51\x95\x9b\x81\xec\x71\x07\x11\xca\xc9\xa1\x53\xaf\xb7\x3a\x63\x08\x17\xda\x59\xdf\x68\x88\xa2\x90\x24\x2b\x2e\x49\x00\xc5\x70\x23\x92\x32\x43\x7d\x37\x71\x67\xb4\xfe\x01\xa5\x74\xd2\xaa\xf9\x98\xa9\x36\x52\x34\x84\x99\x68\xff\xa4\x8c\x4c\xa1\x0e\x20\xa7\xef\x3a\x88\x72\x20\xac\xc6\x78\x8d\xb7\x5a\x61\x1a\xcf\xc0\x7d\x37\xaf\xbb\xbf\xc3\x6f\x18\xd8\x76\x1b\x31\x89\xae\x40\x22\xb8\x2c\x97\x83\xf7\xcd\xa6\x9a\x88\xb3\x06\x87\x97\xe4\x10\xbe\xfa\xc6\x03\xb6\x1b\x03\xdb\xd3\xb4\xf6\xec\x88\x74\x6f\x99\x41\xe5\x3b\x00\xcf\x75\xb4\x91\x7c\x80\xb5\x5b\xe7\x54\xa7\x46\x75\x9c\x5f\x76\x1b\x79\x20\xec\xe0\x13\x46\x91\x48\x14\xe7\x8c\xea\x97\x16\x5d\xe5\x95\x44\x23\x7a\xbf\x2f\x39\x0e\xb2\x6b\x47\x00\xcb\x41\x49\x4f\x15\x2e\x64\x89\x7c\x37\x71\xc9\xcf\x7a\x17\x2d\x99\x1d\x6f\x03\xfd\xb2\x79\x11\x8f\xb9\xe0\x10\x57\x76\xb2\x56\x05\x69\x83\xe3\x66\x66\xec\x62\x4f\x33\x3a\xb6\xc1\xa3\x38\xb3\x05\xae\xbb\x3e\xf6\x38\x35\x4f\x56\x19\xe7\x87\xaa\x59\xaa\x00\x9c\xbe\xad\x18\x5f\x0f\x15\x0e\x97\xd8\x94\x61\xcd\x00\x15\x63\x3c\x9d\xb7\xe4\x64\xea\x68\x14\x6d\x63\xd0\x89\x40\x5b\xe4\xd0\x53\x26\xdf\x6d\x52\xc4\x4f\x53\x1d\x22\xf4\x94\x6c\x9d\x21\x0b\xca\xef\x01\xfa\xea\x86\x09\xa9\x49\x89\x3a\x52\x00\xd0\xd9\xb4\xea\x37\xeb\xa4\x2a\x3b\xc1\xe1\x45\x79\x94\x03\xf9\x62\x90\xd3\xed\x04\x4a\x4b\xf3\x36\x3c\xfa\x90\xc9\xbf\x49\xa5\xf6\x8a\x69\xa8\xd7\xba\xad\x91\x5c\x21\xdd\x7e\x83\xd7\xbc\x11\xf0\xb0\x54\xfc\x39\x98\x2e\xaa\xe0\xce\x62\xdb\xfe\x90\x86\x9e\xeb\x29\x3c\x9b\x07\xe5\x13\xdd\x7e\x76\x70\x0d\xce\xed\x62\x15\x84\x2e\x2c\x59\xc9\x11\xfc\x98\xbe\x15\xf9\x9d\x0d\xac\x3e\x88\xd8\xc8\x0f\x86\x00\x3f\xb2\x74\xfc\xe4\xb6\xdd\x55\x07\xad\x08\xdf\x61\x71\x7b\xf5\x6e\x53\xdd\x64\x04\x6d\x80\x63\xbc\xd5\x25\xfe\xfd\x7c\xf7\x4c\x74\xb3\xb3\x7f\x73\x14\x72\x63\x1b\x13\x97\x73\x24\x16\xed\xa7\x23\x19\x4a\x2b\xc1\xb3\x0e\xb3\xb1\x07\xb8\x8f\xc0\x82\xc7\xaf\x14\x7e\x55\x87\x1c\x5f\x06\x3e\x2f\x89\x43\xcc\xd7\x65\xf9\xab\x03\x8e\xbc\xd3\x53\x2c\x7e\x09\x4d\x08\x1b\x15\xc1\x3a\x93\xb8\x4c\x08\x4a\x88\x5d\x7b\xf3\x1b\xa3\x00\xad\xbd\x5d\xb7\xf5\x80\xc9\xc2\x89\xc6\x0a\xdb\x40\x87\xad\x3b\x30\x2b\xed\xf4\x62\xe7\xd9\x11\xc2\x87\xb6\xd9\xbd\xbd\x17\x78\x76\xa3\x35\xfe\x71\x2a\xe1\x52\x5f\xd0\x05\xb3\x91\xdb\xd0\xd0\x1d\x92\x7d\x7e\x9e\x46\xb6\x5a\xd9\xc2\x88\xa7\x1f\x3b\xe5\x5a\x23\xa0\xa3\xbf\xb9\x69\x72\x81\xf5\xeb\xe9\x49\x18\x44\x96\xfc\x51\x6a\x68\xa6\x6d\xe5\xed\x86\x79\x21\x74\x93\x36\x51\x9a\xcd\x93\xdb\x4e\xe1\xae\xd1\x7d\x4e\x00\xcc\x81\x7b\xd3\xf5\x35\xc9\xd7\xa5\xf9\xc3\xc4\x63\x15\xf6\x8b\xe1\x9e\xc3\x27\x56\xc8\x06\x04\x18\xb4\xab\xb1\xdf\x66\x3f\xfa\xf8\x5e\x08\x87\x10\xda\x8f\x94\x77\xfa\xd4\x84\xf3\xf3\x06\x9b\xdb\xfd\x8c\xf3\xa2\xb3\xd4\x09\x50\xc9\xf4\x07\x08\xfb\x29\x82\x6e\x90\xeb\x4e\x0b\xe6\xd1\xef\x7d\x2e\xd1\x5c\x9b\x02\xca\x4f\x98\xf1\xeb\xcb\x5d\xde\x78\xf4\xd6\xc2\x8b\xfc\x53\x05\x7e\x98\x10\xdc\x80\xbd\xe8\xf4\xc1\xa2\xb0\x19\xc1\x44\x35\xa3\x6a\xca\x86\x8a\xcd\xfd\x90\x3a\x14\x85\x5a\x8a\xa4\xc7\x5a\xf3\x2b\x28\x74\xc4\xe8\x9c\xa2\xfa\x39\x3f\xc9\x6c\x5d\x9a\x9f\x70\xd3\xc2\xea\xca\x25\xd1\x10\xfd\x8d\x36\x3f\xd0\xdd\xb9\xd8\x08\x24\xc9\xd0\x52\x05\xb3\x3d\x93\xfb\xe3\x2f\x3a\xde\x1b\xca\x8c\x2c\xd6\xb5\x18\xeb\x21\x8f\xcd\x9a\xfe\x3a\x34\x56\x19\x18\xb6\x1b\x5a\xad\x3c\x39\x29\x6c\xa5\x70\xb7\x1d\xad\x89\x59\x71\x0b\x97\x8f\xc2\x74\x43\xbf\xdd\xfa\xc5\x31\xeb\x89\xd9\x06\x48\x09\x29\xdc\xb1\xd4\x27\x84\x1a\xde\xea\xef\x74\x51\xdf\xe5\x9b\xf6\xf3\xe4\x5a\x7c\x92\x06\x4c\xb9\xad\x4a\xb1\xdd\xdc\xcd\xf1\x2b\x1b\x13\xbd\x6c\xf4\x69\xf9\xc1\x1a\x77\x3a\xb7\x0e\xe2\x53\xef\xdf\x0e\x48\x20\xe1\x93\x9c\x8a\xea\xf4\x02\x31\x69\xa7\x98\xdd\xf4\xa3\x14\xa2\x4a\xeb\x4e\xf2\x7e\xbc\xdd\xc2\x75\xc6\x19\x2e\x65\x64\x89\xb1\x9d\x55\xa5\x77\x1b\x17\xf1\xa8\x00\x81\x40\xfb\xd3\x21\xc6\x9b\xbc\xcf\xdd\x08\x9c\x79\x39\xa7\x57\x07\x48\x2e\xcd\x06\x7c\xc9\xa2\xb7\xa5\x28\x91\xeb\xfc\xca\x6e\x4f\x6e\xc0\x15\x29\x08\xe5\x70\x22\x11\x80\xb5\x4e\x71\xcf\x51\x3b\x56\xba\x4d\x25\x64\x7b\xe0\x6c\x30\xe1\xca\xad\x1f\xf3\xa0\x7b\x12\x18\x66\x7a\x66\xc6\xb4\x60\xc8\xb3\x37\x3a\x93\x68\x01\x16\xb9\x72\xef\xc4\xa4\xca\x05\xf2\xec\x67\xd4\x62\x62\xe1\xce\xaf\x35\xda\x3e\x7d\x1d\x46\x5f\x18\xa6\xbc\x55\xab\xf8\xbc\xc4\x5b\x72\x21\x9e\x82\x52\xa3\x0c\x7e\xbf\x96\xa5\x72\x3f\x9f\xb9\xa1\x88\x2d\x2d\x45\x42\x0f\x2a\xf6\x30\xfa\x44\x92\x90\x00\x90\x70\x0a\x60\xe4\xd2\xbf\xc9\xb6\xbc\xb5\x02\x00\x85\xf6\xce\xcc\x82\xd1\x76\x36\x06\x6f\x62\xa6\x9b\xc3\xa5\x8c\x0a\x52\x41\xcb\x3e\x09\x60\x63\x7f\xe6\x2a\xd2\xc0\x63\xd5\x07\xe7\x7d\xa6\xfa\x4d\x91\x39\x28\x61\x91\x04\xcf\x8a\x76\xbb\x43\xd2\xca\x70\x29\x69\x06\xee\x67\x4c\xd0\xf2\xc9\x4b\xe7\x0b\x98\xf4\x22\x2e\x91\x10\xb6\xfa\x5e\xb5\x9e\x8b\x4b\x7d\x4e\xfb\x4b\x3f\x6a\x7d\x4e\xb3\x47\x23\x8a\x88\xa5\xd8\xe0\x7e\xe7\xe8\x5e\x3e\xf7\x92\xeb\x8e\xea\x12\x20\xf6\xd9\x79\x90\xc6\x05\x12\x8b\x7c\x58\x38\xc6\x7c\xe1\x5d\x5a\x50\x06\x0b\xf7\xd7\xf2\x75\x6f\x12\x22\xb8\x82\xb4\x5a\x21\x16\x38\x4c\x1b\x0a\xc7\x90\x5e\x9d\x68\x84\x50\x95\x40\x5a\xdf\x6c\x2a\x2f\xd9\xb1\x40\x67\x21\xdd\x85\x5d\xc7\xc7\xd6\x0b\x6d\x36\x3f\x31\xe1\x47\x49\x5c\x75\x46\xd3\x0e\x60\x16\xef\x48\x12\xfb\xc6\xa9\xf5\xa0\xd6\x45\x5e\xc8\xc1\x45\x3c\x68\xa1\xda\xdd\xb8\x9d\x1b\x01\xa4\xb2\x81\x2c\x50\xf2\x7b\x12\xa4\x3a\xa7\x6b\x82\x61\x1c\xa7\x83\x70\x8f\xa6\x0b\xc7\xb3\x28\x27\x81\x11\xeb\xca\xc3\x7b\x98\xa8\x23\xd6\xf1\x0c\xb5\x5e\xba\x94\xb8\x61\xb2\x71\x98\xdd\xa1\x24\x89\x62\x3b\x3e\x93\x82\x5b\xb3\xb8\x4b\x37\x44\xb5\xd9\xf7\xec\xf4\xb9\xe5\xc4\xa9\xa9\xa0\x8b\x7a\xb3\x38\x29\x62\xc8\xaa\x77\x02\xc2\x0a\xc8\x8f\x33\x2b\x02\x53\x5d\xc0\x48\x4d\x07\xa3\xe8\xe7\x16\x37\xab\x0f\x43\xfa\x4b\xcd\xf6\x0f\x15\xe6\x32\x0a\x10\xd9\xfc\x45\x4f\x0f\xd4\x17\xf9\x9a\x1a\xa6\x80\x25\x0a\xb0\x26\x1e\xa0\x02\x54\x10\x76\x84\x7e\x59\x39\x7e\x3b\xfd\xed\xb1\xb1\x99\xa0\x54\x52\xd3\x77\xcb\x3e\xeb\x74\xe9\xc8\x98\xf5\x3d\x4d\xdc\xc3\x0b\xc3\xbc\x73\xf5\xc3\xcc\xcf\x48\xb3\xe9\x6a\xb7\x03\x77\xb2\x00\x9f\x29\xb8\xe3\x24\xe8\xb8\x0e\xc7\xd6\x1a\x93\x56\x13\x58\xbb\xf8\x98\x93\x3e\x29\x7d\x07\xf5\x4e\x88\x48\x1e\x5c\x11\x1a\x6e\x7c\x84\x83\x46\x9b\x22\x40\x45\x5c\x96\xa1\x90\x92\x55\x64\xf1\x50\x2f\x30\xfa\x04\x96\x41\x2c\xed\xb8\xad\xe8\x20\x10\xa2\x50\xf8\x50\x4b\x5b\x72\x38\x0b\x90\x57\xc3\xe3\x19\xf1\xc0\x4f\x3e\x26\x0e\x85\x52\xf8\x78\x2f\x12\x58\x6d\xc1\x01\xb6\x0a\x9d\x91\x08\x29\xd6\xac\x87\x31\x98\xc2\xad\x45\x8f\x35\x18\x03\x45\xce\xbc\x84\x97\x2d\x7c\x7d\xb3\xe3\x7a\x6e\x87\x9a\xcd\xe4\x13\xc7\x06\x8d\xcb\x97\x42\x98\x91\x9e\xb1\x2d\x6d\x84\xa1\xb5\x54\x72\x8f\xab\x22\x38\xbc\x46\xed\x97\xa1\xf4\x7a\x4e\x94\x37\xe3\x5b\xa6\xcb\x61\x87\xe5\xae\x51\x84\x2a\xc4\x15\x29\x72\xce\x90\x1e\x05\x9f\x36\xe1\x51\xf2\xf1\x0e\x7c\x8d\x0f\x22\xb4\x5f\x39\x41\x05\x5f\xb2\x61\xc5\x1b\x40\xc0\x81\x2d\x71\x85\x30\x2a\x1e\x4a\x7e\x67\x0d\x8e\xaa\xd7\x6e\xdf\x89\x76\x5a\x23\x3c\x95\xf5\xf6\x68\xf4\x66\x9e\x1f\x1c\x48\xe2\xa3\xa6\x4e\x0e\x68\xfa\x22\x78\x51\x02\xce\x88\x07\xdd\xe2\xe6\xf1\x6f\xe9\x8e\x91\xfa\xeb\x22\x91\x33\x08\x33\x2a\xfa\xcc\xf1\xc0\x70\x4b\x9f\x0f\xd0\xd0\xd7\x73\x57\x1b\x22\x34\x2d\x86\x8c\xc2\x4b\xb7\x27\xf4\xfc\xc0\x3d\x54\x31\x06\x8f\x3b\xbd\x7f\xfe\xd1\xcb\xab\x4c\xc3\x3f\xb3\x74\x87\x97\xbd\xbd\x8f\x3a\xac\x95\x97\xb9\x9f\x52\x6e\xd2\x6b\x3d\xf6\xdc\x7e\xf1\x03\x9a\x6c\xa5\xd1\x0d\xba\x93\x1d\x19\x0f\x37\x6a\x9a\xab\x71\x30\x98\xd9\xa4\x26\xc9\x23\x05\x59\x6e\xda\x91\x98\x49\xbb\x4e\x1d\x06\x98\x72\x43\x9d\xe3\x3a\x47\xc0\x70\xb5\xd3\x9f\xfa\x5f\x84\x45\x9f\x98\x51\x38\x09\xc5\xd3\x5e\x9e\x25\x53\x8a\xe0\x11\xb6\x0b\x5c\x0e\x31\xf4\xc2\x4c\x78\xea\x72\x37\x7d\x99\xc2\x2d\xda\xb8\xad\xdd\xdf\x11\x2e\xdd\x3a\xab\x7c\x72\x38\x8d\xa3\xdb\xbe\x2d\xab\x4c\xd0\xb4\xf8\x1e\xaa\xf3\xb7\x43\xd4\xe9\x26\x47\xa4\x72\x0f\xe1\x2f\xb9\x76\x77\x97\xbb\x85\x1b\xb5\xe4\x07\x1c\x15\x45\x1a\x3c\x67\x9b\x7c\x8d\x95\x23\x7c\x14\x60\x68\x3a\x32\x88\x84\x34\xad\x2d\x28\x52\xe6\x44\x4f\x3a\x33\x09\xbb\x8e\xac\x99\xf0\x6f\x6a\x2f\x34\x16\x0f\xb7\xe8\xd4\xfd\x86\x4e\x0e\x92\x9a\x54\xd2\xdc\x9c\xdc\x74\x45\x80\x85\xcc\x4e\xc4\x7c\x0d\xd5\x5e\xfd\x30\x00\x1a\x15\x48\x3a\x53\x47\x08\xa0\xf1\xe7\x0e\x0d\xde\xc1\x83\x69\x2b\x71\xe5\x9c\x3c\xb6\x63\x00\x48\x1f\xcb\x96\x83\xfc\x07\x98\xc0\x8c\x3f\x87\xb5\x8c\x89\xa7\x42\x24\xc3\x7d\xb8\x8e\x16\x60\x0e\xb6\xfa\xaf\x64\x28\xfc\x46\x35\xc2\x5c\x26\x19\xf6\x01\x6f\x62\x44\x3c\x74\xd8\x3e\x74\x07\xdb\x36\xa5\x44\x1f\x86\x02\x66\x87\x2c\x53\x1d\x58\xbc\x10\x00\x81\xc8\x0f\x37\x51\xe9\x21\x1c\x74\x1f\x19\x54\x3a\xb7\x8d\xaf\x1c\x14\xac\x49\x0c\x99\xd3\x16\x50\x2a\xcc\x49\xa0\x1f\x0b\x3b\x8a\x0a\x30\x0c\x30\x93\x3d\x83\x93\x3c\x8c\x33\xe4\x8f\x0a\x40\x4f\x36\x3f\x76\x12\x28\xfa\x85\xdf\x04\x50\x5d\x30\x2f\x42\xa8\x42\xf3\x8f\x05\xd1\xde\xa4\x92\xec\xd4\xa8\x2f\x03\x01\x6d\x20\x64\x9d\x66\xdd\xf0\x61\x9a\xa5\xed\x72\x47\x8f\x2e\x96\x98\xea\xb8\x15\x18\xb1\xfe\xbd\xba\x3b\x32\x6a\x15\xae\x03\xb2\x64\x06\x9b\xf8\x3a\xba\xf6\x0b\x70\xd5\xb1\x44\xd6\x63\x2d\xe7\xd0\x26\x7d\x27\x7a\x44\x38\x3c\x7b\x40\x65\xc2\x91\xf7\x48\xa0\x68\x41\x03\x5a\x0b\xb5\x91\xc6\x07\x5b\x3c\xac\xff\x4b\x1e\xff\x71\xa8\x29\xa4\x38\x79\x8d\x0c\x2f\x49\x3f\x05\x31\xf0\x85\x42\xc2\xf6\x36\x78\x27\xfd\x25\xe2\x6e\x6e\x6d\xe5\x80\x34\xa3\x67\x93\x7d\x20\xf8\x65\xa6\xb5\x42\x19\x87\xb2\xdb\x5d\x34\x3c\x48\x7f\x6e\x0f\x5c\x63\x0a\x5b\x07\xf0\x63\xe8\xd4\xc9\xb8\x04\x15\x4a\xe6\x00\x98\xfb\xbd\x6b\xea\xb8\x73\x21\x1f\x7a\xc1\x09\x63\xc1\x2f\x6d\xc6\x47\xea\xa8\x82\x5f\x3c\x5b\x94\x73\xb0\x2d\x80\x28\x50\xf0\x38\xe5\x28\x65\x95\xaf\xe9\xff\x88\xbb\x6f\x1d\xec\x95\x2c\x3d\xd4\x17\xc4\x80\xde\x05\x27\x20\x3f\x7a\xef\x5d\x46\xef\xbd\xe7\xd5\x1f\xfc\xbb\x7b\x8f\x7a\xa0\x69\x8d\xa0\x40\xca\x89\xaa\x02\x81\x55\xb5\x5e\x12\xa8\xa7\x02\x57\x3c\x0c\xe1\x66\xca\x18\xc6\x78\x10\x1b\x82\xcb\x36\x87\x82\x55\x10\x2d\x1b\x29\x65\x95\x58\x87\x74\x0b\x53\x0a\x0e\xce\xf5\x0b\x94\x8e\x39\xfd\xaa\x41\x25\x50\xfc\x36\xd8\x58\xcc\xaa\x6c\x36\x6c\xc3\x13\x62\xa0\x3c\xea\x05\x4f\x87\xb5\xf2\x91\x5f\xe9\x24\x5d\x5c\x86\x8a\xf8\xde\x8e\xdc\x83\x73\x75\xe2\xb6\x8d\x6d\x77\x70\x55\xa6\xc8\xee\x30\x36\xfd\xe9\xf0\x72\x1e\xc5\x40\x09\x13\xd2\xbf\xd2\xd5\x15\x42\xab\xd6\xb5\xc6\xc3\x46\xcb\x48\x2a\x6d\xf8\x4d\xf7\x51\xc0\x48\xd2\x71\x23\xc2\x3e\x29\xc7\x23\xa4\x7d\x86\xbf\xc3\xf8\xe5\x4f\x53\x61\xbc\x15\x6f\x7e\x72\x37\x00\x35\x48\x62\xae\x9f\x90\x19\x6f\xdb\x81\x34\x9f\x3d\x12\x9c\x53\x79\xbe\x30\xc2\x21\x85\x20\x2b\x14\x96\x48\xaa\xe9\x93\x45\x17\x0d\x2d\x94\x14\x57\x4c\x39\xde\x5c\x78\xee\x6e\x0e\xf7\xa5\x08\x56\x0d\xe1\x3d\x0d\xe2\xef\x8e\xa1\xa1\xff\x16\x35\x3a\xfb\x5c\xc8\x3b\x8e\x7f\x64\x2e\x2f\xeb\x60\x7d\xe6\x9a\x2b\xd7\xa1\x67\xe0\xc1\x57\x3a\x77\xc5\x66\x3d\xbd\xc2\x99\x33\x98\x84\x40\xf9\xe9\x5d\xd9\x30\x94\x71\xc6\x2d\xc4\x9c\x54\x18\xd9\xe6\x36\xb5\x65\x26\xec\x74\x80\x0b\xdd\xd1\x6b\xde\x21\x5c\xbe\x41\xdc\xe9\x71\x83\x83\xb6\x29\xdb\x03\x14\x7f\xc9\xa1\xac\x6c\x45\x98\x4c\xff\x79\xe9\x9e\x78\xad\x07\xbc\x81\x26\x6d\x57\xfe\x66\xb6\x4c\xd8\x18\xf4\x99\x75\x0d\xe9\x49\xd9\xa2\xfa\x07\x45\xd2\xaa\x96\x75\x02\x59\x30\x3b\x5e\xb7\x44\x29\x17\x25\x36\x99\xd1\x3f\x11\x65\x6e\x09\x30\x63\xd7\x92\xc6\xe4\x5f\x21\x03\xbf\xdf\x71\x9e\x87\x63\x66\x67\xed\x23\x07\xab\x98\x52\xf8\x44\xfb\xc4\xe0\x35\x06\x91\x89\x9e\xab\x87\x69\x85\x68\x1b\x58\x23\xb5\xf5\x0a\xe6\x70\xda\x41\xf4\x32\x9d\x6a\x9c\x29\x7d\xa5\x13\x29\x1d\x76\xca\xde\x93\x00\x3b\x6b\x77\xbe\xb2\xa3\xfc\x9b\x1d\xde\x0e\x9c\xa9\x91\xdf\x43\x8e\xcd\x11\xd7\x74\xae\x97\x6d\xde\x00\x91\x04\xe1\x72\x1c\xc7\x28\x49\x7c\x3d\xd1\x8f\x0c\x73\x0d\x44\x9e\xfe\xc4\x5c\x35\x47\x8d\x6f\x54\xa5\x05\x69\xbf\x78\xc2\xb9\x94\x01\xc9\x62\x87\xc2\xc4\xaa\x96\x8f\x23\xa4\xad\x5c\x66\x2e\x23\x60\xe7\x45\xf5\x6a\x4c\x4f\x6b\x0b\x2b\x3a\x3e\x23\xf1\x9e\x89\xce\xf0\x4b\xf6\x1a\xe9\x75\x07\xbf\x53\xdf\x29\x32\x84\xa8\x2c\xda\x41\xbc\x77\x9d\x3d\x35\x84\xf4\xa6\x2b\xf6\xe1\x56\x0a\xdc\x27\x9e\xb6\xf9\x1c\xd2\x2d\xe3\x18\xa6\xca\xb1\x7f\xbb\x63\x8c\x73\xec\x22\x8b\xde\xbf\x18\xe4\xb8\xab\x18\xd4\xc7\xc5\x15\x0b\x11\x74\xc9\xda\x8c\x64\x20\x8b\xd4\xfa\xdb\x30\x2b\x69\x03\x81\xd6\xb4\x8a\xc1\xea\x55\x9e\x35\xfb\x79\xc1\x0f\xd7\x26\xc7\xf7\x06\x9a\x1c\x2e\xac\xe2\x08\x81\x9b\xca\x29\x2f\xae\x74\x02\x15\xfe\x1c\x80\x11\x7c\x8c\xfa\x96\x54\x4e\xfc\x81\x4b\x2f\x75\x0a\xe8\x06\x77\x7c\xf5\x27\xc7\x13\x05\x74\xf4\x40\xb0\x2b\x97\xb1\xe5\x78\xdb\x18\xd9\xc1\xf5\xcd\x81\x89\x5f\x15\x85\x9a\xb1\x5e\xb8\x71\x44\xb3\x0b\x9f\x10\x92\x98\x15\xf1\xb1\x44\xe2\x58\xd5\x3d\xd6\x66\xe5\x28\xe0\x88\x31\x4b\x13\x38\xd6\x1a\x4e\x80\x81\xb4\x76\xb5\x32\x66\x45\xa9\xe9\x6e\xaa\x8e\x89\x28\x68\xc5\x75\x48\x5c\xcd\x57\x3b\x56\xb1\x08\xee\x5d\x73\x3a\x44\x63\x00\xef\xd9\x60\xe8\x6f\x54\x1c\x7d\xae\x8f\x90\xe7\x7f\x9b\x8d\xc2\x47\xbb\x06\xfe\x2a\xb1\xae\x32\x58\x25\x11\x57\x3f\xdf\xaf\xe2\xd0\x07\x48\x72\xd8\x37\x52\x2e\xa8\x65\xb2\x8e\xfc\x0b\x6c\x5a\x6f\x35\x76\x08\xc6\xb8\x5d\x6b\x20\xaf\xdc\x0b\xab\x7f\x18\xc0\xad\xfd\xcc\xad\xc3\x69\xe5\x20\xdf\xa8\xba\xb9\x30\x21\xe6\xd1\x9a\x87\x77\x12\xd6\xad\x0f\xbf\x0e\x6c\x2b\x93\xbd\xc7\xce\xb7\xd7\x4a\xc3\xb8\x8f\xdc\x21\xf1\x3e\xe8\xdc\x49\x2c\x97\x9e\xf8\x82\x98\x40\x47\x49\x2e\xc9\xf7\x4e\xda\x8f\x54\x6b\x07\x12\x1d\x94\x78\xa5\x24\xf8\x98\x16\x13\x60\xd8\xc5\x24\x16\x77\x42\xc8\x68\xc9\x68\x65\x01\x3f\xf5\x99\x1c\x3c\xa9\xce\x96\x79\xe8\xf0\x83\x26\x81\x10\xb4\x5a\x03\x5d\x14\xa5\xc1\x83\x06\x2c\x0c\xa3\x94\x2e\xbf\x10\x1b\x34\xd9\x28\x21\xa9\xbd\x68\x7f\x06\x02\xb6\x2f\xda\x9c\x42\x3a\x60\xae\xe5\xe1\x55\x4d\x9a\x31\xe2\xd0\x22\x98\xfd\xc9\x36\xc6\x2d\x52\x96\xa8\x68\xc5\xb6\xbf\x31\xfd\x89\x16\x2a\x24\x03\xc9\x15\x51\x8c\x04\x38\x05\xc1\xd0\x9e\x3d\xf4\xe8\x17\x4f\xd0\x7e\x02\xb0\xdc\xfa\x1c\x08\x49\xda\x76\xd5\xf4\x8b\x9b\x5f\x16\xce\x87\x92\xd2\x41\x42\x7b\xc4\xe4\x9d\x6e\x22\x2b\x62\x9b\x71\xc1\x65\x0d\xc7\x41\x2f\xa1\x9b\x69\xd1\x56\x66\x5b\xea\x15\x80\xbf\xd3\xfe\xac\x85\xaf\x74\x46\x51\x9f\x14\xce\xaf\x0a\xa8\x20\xe6\x99\x5b\x88\xb7\x71\x25\x50\xf5\x2c\xf3\xfd\x92\xcd\x28\xe0\x1e\x18\x39\x1b\xb8\x5c\x6e\xd6\xb8\x77\x0b\x9f\x50\x7b\xde\x5e\x3e\xd4\x70\x53\x13\x28\xdb\xf1\x75\x06\x81\xc7\xd3\x3f\xef\x77\xd8\x57\x6a\x54\xe5\xe5\x53\x47\xfe\xa0\x73\x18\x29\x20\x7a\x74\x7d\x18\xaa\x06\x3b\xe5\x70\x62\x51\x8e\x49\xc7\x40\x4f\x33\x93\x27\xa1\x64\xc7\xc5\x50\x11\xa6\x33\xfc\xac\x54\xaa\x2b\x29\x56\xe2\x0b\x26\x77\x99\xb9\x48\xbb\x3c\xbf\xa5\xba\x84\x40\x87\x02\x8d\xb7\x7c\xef\x53\x20\x2b\xd0\xbd\x70\xbc\x48\x37\x0c\x48\x26\x0a\x90\x0b\x54\xe8\xa0\x88\xb4\x26\x64\xf0\xf2\xee\xa9\xab\xfa\xac\xd8\x69\x96\x00\x64\xb6\x1b\x75\x6e\x2d\x65\xb0\x53\x66\x4a\xf7\xd2\x60\xef\x6f\x1b\x58\x34\x0e\x42\x81\x5d\x9c\xd1\x4f\xc3\x3e\x70\xf6\x40\x1d\xd4\xa7\x3d\x1c\x59\x49\x97\x40\xa5\xfd\x54\x1e\x8a\x03\xe1\x64\x78\x08\xfc\xdf\x50\xfa\x2e\xe0\x87\xdd\xed\xb2\x3f\x28\x74\xa0\x5d\xcb\x49\x91\x19\x90\x63\x2e\x9a\x7a\x66\xd8\x55\x47\x37\x2a\x9c\x59\x5c\x92\xef\xd2\x37\xcb\x6a\x10\x55\x16\x03\xde\x4c\xbe\x1f\x19\xde\x1e\x19\x28\xe8\x9e\x05\x9f\xda\xb2\x6c\x37\x06\x3f\x5c\x6f\x81\xf9\xb9\x5c\x0b\x4a\xa3\x2d\x21\x35\xe0\x2b\x84\x39\x32\x50\x6f\xcb\x9c\x45\xe1\x20\x5e\xa6\x25\x0e\xcd\x84\xe6\x49\x3f\x27\xe8\x9b\x36\x26\x4c\xe7\xc7\x53\x93\x77\xb9\xfa\xa1\xed\x3a\x58\x0a\xc8\xa9\x53\xf4\x2b\x29\x79\x03\xb6\xa1\x22\xee\xd9\x4d\x91\x92\xbd\x0e\x72\xbd\x8e\xad\x52\xa3\x8e\xe3\x2c\x3a\x9c\x29\xe6\xd0\xdb\x9e\xd8\x07\x93\x91\x05\x1a\x9f\x90\x43\xf8\xb4\x08\xd2\xe6\xc1\xe6\xeb\xbf\x86\xd1\x18\x8e\xb9\x96\x0f\xb5\x3e\x5f\xdd\x7b\x68\xed\x8b\xfc\x8c\xe0\xf9\x58\x93\x52\x34\xae\xea\xb7\xb4\x68\xa0\x1d\x4b\x04\xcd\x72\x6c\x9b\x83\x3b\xce\xef\x5c\xc9\xd8\xd9\x9d\xca\xb8\x25\xb4\x9d\xcc\x52\x6b\xa5\x43\x6f\x2c\xfb\x9c\x5b\x83\xda\x0e\x6d\x68\x71\x89\xa3\x81\x13\x73\x1c\xe3\xa1\x65\xea\x70\x7e\x95\x0d\xdf\x6f\x84\xcb\x2a\x16\xde\x39\x7c\x68\x0a\xb9\xd9\xe2\x30\xd7\x87\x15\x06\x69\xa7\xe7\xd0\x92\x45\x6f\x43\x54\x03\x7e\x76\x54\xd8\x3d\x25\x6a\xe1\x7a\x8e\x57\xec\x40\x5e\x17\xa6\x5e\x06\xca\x3d\xd3\x18\x74\x20\xdd\xa0\x1d\xc6\x41\x9a\x1e\x59\x1e\xbd\x62\x27\x0a\x72\xe4\x47\x47\x5f\x06\xac\xe8\x47\x5d\x80\x67\x81\xf8\x08\xec\x95\x80\x03\x94\x6e\xcd\xd1\x4b\x47\xb2\x42\xb1\xa4\x3b\xc9\xc6\x5a\x18\xe6\x1a\xaf\xe4\xda\x4c\x07\xbc\xc6\x9e\x9c\xaa\x17\xcb\xe3\x7b\x4f\x88\xe7\xea\x83\xd5\x44\x70\xc5\x88\xd2\xab\xab\x2c\x1b\xc0\x1a\xc2\x7d\x54\xf5\x13\x66\xa1\xd1\xc5\xe4\xef\xf9\xca\xea\x29\xc3\xc1\xa8\xdb\xaf\x4f\xac\x61\xa4\x03\x71\xa8\x0b\x44\xe8\xb3\x9f\x3a\x62\xfa\x04\xb0\x54\xd4\xbf\xf9\x08\xbd\xa5\x04\xb4\xb8\x25\x39\xcf\x82\x44\x25\x57\xf9\x60\x6e\x1d\x51\x6b\x8a\x75\x75\x50\x08\xc4\x86\x49\x37\x65\xc6\x71\x87\x90\xe3\x5f\xa1\x80\x67\x63\xa6\xc0\x5a\x94\xb4\x59\x39\xd1\x37\x62\x3e\x79\x95\x8a\x18\x62\x70\x51\x82\xdc\x71\x9e\x7e\xf4\x8a\xe2\xa2\xac\x4d\xae\x28\x20\xaa\xf2\xd8\x78\x8a\x50\x59\x3b\xe1\x0e\x9a\x95\x26\x95\x92\x3c\x43\xa3\xbc\xf8\x7c\xbd\x89\x3e\x97\x66\xa5\xd5\x44\xc3\xdd\x3f\x6b\xe5\x29\x43\xfa\x03\x54\x70\x9a\xe0\xec\xd4\x26\x1c\x54\x3a\x14\xc4\xaa\xe4\x96\x96\xe3\x07\x2f\x72\x86\x8d\x32\x68\x77\x2d\xd9\xd1\x28\x67\xe3\x0c\x38\x36\xbd\xac\xf2\xee\x1e\xbc\xb3\xbe\x9a\x51\x73\xcd\x04\x4f\x0b\x90\xbc\xe2\x1b\x9b\x6a\x99\xe3\xa9\x4d\xa8\xd9\xbc\xa5\x26\x45\xd2\x24\x43\xe5\xde\xeb\xc3\x9d\x04\x66\x36\x0a\xba\xc7\x82\xe3\xa5\x24\x84\x8d\xf6\x4f\x7f\x4c\xa5\x35\xc6\xd7\xdf\x2c\x2f\x4a\x8b\xa9\xa0\x01\xfb\x3d\x9a\xa2\xa7\xd0\x9b\x02\x03\xb7\x29\x7b\x54\x7e\x60\xe2\x88\xf5\x10\xc1\x2d\x1f\xe3\x91\xa6\xaf\x06\xa0\xf8\x82\x59\x39\x97\x82\xa8\x1f\x4c\x92\xee\x41\x90\x9e\x68\xcb\xcb\x80\x18\x4a\xd8\x76\x66\xe0\xcb\xd2\x49\x12\xf2\x0a\xd6\x56\x52\x42\xf2\x6d\xc9\x9d\x3c\xaf\xcf\xe1\xf1\xd6\xf2\x7b\x8a\x69\x37\xaa\xda\x10\x41\x17\x8b\xbb\xd0\x4c\x27\x5e\x5d\x71\x7e\xcb\x9d\x54\xc5\x23\x8c\xc5\xe5\x4e\x33\xd1\xa9\x03\xcc\x47\xbe\x29\xf5\x7e\xef\x32\x4f\xc5\x74\xcf\x5d\x31\x38\x89\x69\x98\x62\x0c\xdb\x55\x05\x8c\xb0\x0f\x43\xef\x7e\xa2\x7e\x15\xea\xb4\x89\xb9\x40\xe6\x99\xe6\xf4\xcb\xb2\x8d\x8d\x28\x30\xad\x60\x38\xad\x9d\x2c\x8b\x02\x43\xea\xd6\x0f\x8a\x83\x64\xf9\xab\x3a\x01\x83\x6e\xdf\x43\x8b\x17\xe4\x50\x9d\x0a\xc9\x2e\xc7\x56\xb0\x82\x37\x08\xd4\xbe\x5c\x9a\x77\xa9\x3d\xce\xea\xcf\x5e\x1e\xea\x4a\x25\xd5\x66\x83\x01\x6f\xf0\x5c\x83\xee\x67\x6f\x86\x53\xb2\xa1\x5c\x67\x5f\x4b\x15\x1e\xe9\x66\x8b\x58\xe6\xd0\x28\x28\x5c\xa1\x5d\x1c\x06\xf5\x31\x42\x65\x8c\x52\x79\x92\x3a\xc0\x7d\xc1\xc8\xfc\x0a\xb9\xf7\x56\xc7\xd7\xf5\x0d\x12\x6e\x42\xf1\x58\x61\x66\x82\x16\xf1\x25\x82\x9e\x17\xa0\x46\x4d\x58\xd9\xa5\x1e\x37\x5c\x09\xad\xad\x14\x97\x66\xc9\x77\x9d\x47\x3c\x3d\x45\xfe\xb1\xf4\x31\x83\xbf\xed\x71\x17\x76\x31\x04\x6f\xfb\x39\xbf\x70\xb7\x57\x87\x41\x93\x9b\x7a\xcb\x58\xc9\xcb\x24\x74\x0d\x68\x6e\xc7\x4d\x48\xb7\x2f\xdc\x3e\xc2\x0a\x88\x1d\xd6\x0f\xb8\x0e\x7d\x94\x39\x23\xca\x32\x52\x4b\x25\xf6\xe2\x17\xaf\x6d\xc9\xbe\x05\xea\x41\x70\x0c\xf6\x04\xa8\xec\x5f\x9b\x90\x33\x48\x56\xe4\x05\xfe\x94\x67\x25\x4c\xfc\xda\x2c\xea\x50\x69\xf6\x46\x4a\x42\x77\x3a\x52\xf9\x59\xee\x64\x15\x38\xa6\x33\x13\x24\xf9\x8c\x52\x7d\xf3\x78\x4e\xeb\x32\xd3\x49\xb3\xa6\x3f\x59\x69\x3e\xf7\x17\xd6\xee\x1b\x30\x05\x03\xc0\x9c\x92\x08\x04\xd2\x65\x9a\xfd\x4c\x9e\x93\xbb\x18\xe5\x28\x18\x77\xe8\x4c\xea\x78\xbe\x13\x00\x3e\x29\x8a\x4f\x8d\xad\x57\x80\x8a\xc5\x92\xa4\x52\xde\x45\xc3\x7d\x17\xb2\xc9\xf0\xc4\x01\x33\x67\x50\x74\x2a\x7d\xc0\x53\x89\xdd\xae\x5f\x02\x5d\x86\x1c\xb3\x9b\x45\x62\xf5\xdc\x1d\x91\x66\xe6\x67\xaf\x6f\xd4\x7d\x62\xd9\x8a\xc8\x30\xe1\x1b\x4c\x1d\x13\xd1\x1e\xaa\xf3\xba\x0c\x9d\xc4\x27\x60\xfc\x02\x9c\xb6\x17\x00\xd3\x00\xd7\xc7\xad\x65\x0f\x8e\x6c\xa5\x62\x04\x77\x33\xaf\x12\x43\x91\x4d\xa8\x13\xff\x35\x1a\x38\xff\x2c\xfd\xba\x34\x85\x1e\x2a\x10\x16\xda\x07\x94\xa8\x48\x9f\xab\xa7\xf5\x00\x4a\x2c\x84\xca\x07\xe5\x2a\xe3\xd3\x2b\x63\x05\x14\x34\xdc\x08\xd3\x82\xc8\xac\x1a\x23\x06\xf6\x0d\x06\xd7\x12\xda\x95\xa8\x10\x72\x94\x05\x9c\x9c\x66\xc7\x49\x8b\x9c\xdf\x40\x34\xe2\x38\xd6\x5f\x64\xfc\x8c\x10\xe2\x33\xd7\xab\x78\x81\xdb\x3f\xbf\x33\xd1\x0f\x12\x2d\x75\x37\xad\x6b\x22\xf7\x3b\x16\xa0\xb4\x1b\x76\xed\xb5\xda\x1e\xd0\xd9\x5f\x90\xd6\xb1\xe5\xe2\xf9\x69\x64\x4e\x9f\xf2\xa5\x1a\x9d\x62\xf7\xbd\xde\x7a\x84\x64\x32\xf6\xb3\x82\xc4\x89\xc6\x8d\x57\x41\x47\xe7\x86\x91\x48\x30\xb7\x7d\x2c\x9e\x34\x5a\xa6\x23\xf8\x40\xd8\x2d\x4c\xf0\xae\xfa\xe4\xa0\xf9\xd3\x37\xfc\x50\xcb\xc6\xdb\x37\x88\x21\x3d\x83\x06\xbb\xac\x3c\xfb\x1b\xac\x83\xce\x53\x52\xc5\x8d\xf5\x73\xaa\x11\x00\x89\xfd\x1b\x83\x8f\xa4\xea\xec\x1c\xaf\x3c\x73\x2e\x05\xb8\x5f\x6b\x0e\xb5\xf1\x63\x2f\x14\xf9\xb6\x07\x28\x11\x9b\x1d\x2a\x1d\xc7\xea\x0d\xc2\x5e\x94\x78\xb7\xf5\x61\x44\x04\xf8\xce\x7d\xad\x7d\xd0\x09\x0f\x85\x30\x14\x2c\x87\x62\x49\x9d\xf5\x0a\xea\x6a\x00\x67\x66\xdb\x9d\xc8\x96\x77\x04\xe9\x9d\x06\xd3\x59\x74\xe8\x4e\xec\x51\x86\x88\xd6\xbf\x31\x68\x34\x08\x54\x84\x06\xdd\x1d\xc4\x23\x46\x3d\xb5\x08\xdd\x28\x0c\x07\xcf\x37\x77\x63\x79\x7b\x51\xd9\x5a\x12\xad\x87\xaf\x79\xcf\x76\x62\x80\x4e\x43\x28\x6e\xf3\xc7\x51\xa7\x5b\x4e\xab\x89\x14\x7d\x0a\xc4\x35\xb4\xa5\x90\x7f\xc6\xa6\x0b\xe2\x6a\x8b\x7a\x68\x17\x63\x8d\x3b\x8a\x19\xb6\x84\x15\xa8\x9c\xbc\x3a\xf6\x66\xb0\x49\xba\xcb\x19\x66\x86\x55\x2f\xde\x47\x5c\x2c\x45\x94\xed\x33\x53\x33\x40\x48\x40\xfc\xd7\x47\x3e\x30\x11\xa0\x21\x10\x0d\x2c\x46\x4f\x79\xe0\x47\xe2\x3d\x3b\xba\x18\x6b\x1e\xe8\x50\x6b\x10\x6a\x1e\x4e\x10\x71\x41\x21\x1c\x6e\x7b\x73\x7b\x33\x6f\x4c\xac\x46\xf7\x92\x72\x1b\x51\xe8\x66\x3b\x22\x46\x7c\x83\x38\xcb\x8e\x7a\xf1\x06\xb6\xa4\x76\xfe\xc8\xae\x84\xd3\x88\xf2\xe0\xeb\x98\x2f\xbf\x1f\x50\x3e\x9d\xce\xa4\x13\x91\x20\x31\x3f\x2d\xa9\xde\xd9\x10\x80\xf4\x3d\x6a\x68\x20\xf9\x69\xc9\x08\xfc\x40\x9a\x42\x37\x29\xad\x54\xf5\x81\xdd\x7b\xeb\x57\x42\x82\x4a\x2c\xac\xec\x32\xb2\x9e\xf6\x96\xd1\x88\x70\x28\x9e\x03\xd7\x1a\x44\x70\x13\x29\xc6\xdf\x8d\xcf\xf7\x9c\x1e\x2b\xe9\x9e\xae\x0e\x5d\x31\xa9\xd8\xe1\xb6\x36\x94\x73\x2b\x68\xca\x0d\x4e\x9a\xa5\xdc\x57\x1e\x27\xf7\xe9\x62\x41\xa8\x46\x2e\x85\x11\xf3\xa1\x5c\xcb\x95\x93\xd0\xd4\x96\x4d\xa7\xcb\x0e\x37\x58\x51\x81\xd6\x35\xaa\x00\x72\xea\x5b\xa9\xaf\x72\x02\x99\xbe\x97\xfe\x9c\xcb\x8f\x7c\x11\xb7\x8b\x6d\x95\xc1\xef\x91\xe2\x08\x69\x31\xe1\x3d\xb5\x4a\x72\x32\x31\x23\x8f\x89\x13\xe4\x41\xad\x1d\xae\x12\x2b\x2f\xc8\x49\x8e\xe3\xcb\x48\xd2\x4f\xb9\xaa\x38\x07\x65\x12\x39\xcd\x3f\xb5\x09\x74\x75\x14\xfc\x61\xb7\x22\xc1\x25\x74\xb4\xec\x07\xf0\xc6\x10\xea\x28\xca\x92\x34\xd5\x4c\xbd\x62\x4b\x3a\x06\x96\xac\x82\x37\x8b\xd0\x7b\xe9\xf1\xc3\x3a\xee\x05\x9d\x0d\x0f\x1b\xa2\x88\x72\x6f\x3a\xa0\xe0\xcc\x37\xd9\xd1\x84\xfd\xad\x47\x6a\xd5\x31\x1f\x56\xc5\x37\x29\x86\x4e\xe7\x94\xa1\xcc\x56\xaa\xe3\xfa\x2e\x13\xe8\x5f\x13\x3f\xde\x43\xf4\x79\x44\x4d\x6e\x9b\x90\x5c\x99\xb5\xbc\x72\xc7\x13\x66\xf8\xa5\xe8\x2b\x81\xc1\x8d\x6f\x51\x0f\xcd\xd7\xa6\x8c\xad\xa1\xaa\x7a\x68\xcb\x19\x66\x89\x1d\x25\x6a\x30\x3c\x95\xea\xd2\x7d\x8f\x33\x9c\x01\xa5\x3e\x14\xa6\x54\xa6\x09\x70\x25\xff\x82\xf6\xbb\xbf\x6d\x43\x3e\xbf\x05\x17\x00\x2e\x08\x57\x60\x16\xd4\x3e\x2d\x98\x6b\xbc\x5a\xa3\x84\xca\x50\x3a\x6a\x7b\x01\x43\xa4\x1f\xf6\x4f\x89\xa5\x11\xae\x5c\x53\x3e\xf4\xa9\x25\xc7\x9d\x96\x47\x84\x89\x85\xbd\xb6\x9f\xf3\x8f\x16\x0b\xb0\x95\x50\x31\x67\x3f\x30\xd4\xa5\xcd\x72\x29\x08\xf8\x70\xe2\x05\x46\xa0\x4f\x62\x7f\xb2\x20\x25\xb3\x4d\x99\xe1\x8d\xbb\x01\x59\x11\x1e\x17\x2e\x0e\x0b\x25\x45\x4d\xf7\x44\xb1\x28\x6a\x71\xc0\x79\x62\xeb\x25\x47\x9e\x60\x5a\xd4\xfe\x99\x3b\x26\xa7\x9f\xde\x1d\xd5\xe8\x75\x21\x8c\x55\x76\xb7\xb0\xcf\xbb\x2c\xcb\x24\x04\x89\x1f\x88\x1d\xfb\x63\xbd\xd0\x51\x81\x18\x15\x12\x3a\x9a\x91\xe5\xbb\xae\x26\xef\x04\xbe\x77\x93\x46\xd0\x81\xc9\xa2\x73\xd2\x4a\x3e\xf0\xed\x23\x3b\x1d\x6f\x33\x61\x14\x52\x01\xa3\x9a\xd2\x41\x3c\x5b\x2b\xa2\x6f\xce\x88\x37\x71\xd9\x18\x9c\xb0\x6d\xfb\x85\x3a\x02\xd7\xd9\x70\x53\x75\x29\x74\xdf\xbb\x79\xaf\x7b\xbf\xe7\xe2\x65\xc3\x3b\xc5\xf3\xf1\x1e\xaf\x84\x61\x23\x97\x23\x26\x29\x10\xa3\x22\xed\x1c\x09\x48\x98\xca\xbe\x61\x77\xdd\xfc\x79\x24\x18\xda\x0a\x47\xd6\x16\x3e\x9d\x36\x37\x67\x5b\x3a\x93\xf7\x35\xe9\x07\x47\x6a\x37\xa1\x70\xb8\x52\x4a\x07\xb6\xb5\x2c\x71\x7a\x28\x43\xcc\x61\x7b\xfa\x64\x1f\xc3\xc7\x5a\x88\x84\x76\xe6\xe4\x04\xba\xe8\xca\x13\xf5\xfc\x34\x9e\xf2\xe0\xad\xe9\x4a\x73\x83\xb8\xb6\xf6\x34\xd3\x91\x2f\xa0\xd2\xe7\x87\x7d\x06\x75\xbc\xf5\xd2\xe4\x22\xda\x35\x82\x37\x7e\x9a\x49\x9a\x1d\x26\x23\xba\x0d\x25\x51\xa4\x5f\xb3\xcb\xfc\xf5\x16\x90\xd4\x3b\xfc\x06\xf4\x31\xa7\xfc\x00\x4a\xca\x29\x79\x86\x2f\x62\x1f\x2c\x34\x96\x06\x00\xbe\x5a\xaf\x90\x1d\xe3\x45\x22\xdb\xc8\x27\xd0\xee\xf2\x13\x72\x07\x1e\xc8\x92\xa6\x22\x1a\x20\x01\x8c\x43\x39\xc6\xe4\x0e\xdc\x5c\x74\x60\x2a\x13\xf5\x3e\xd5\x8a\x0c\x2e\x00\xbb\x48\x08\xe9\x00\x6f\x39\x87\x4c\xc7\xa7\xcd\xef\xbb\x77\xb9\x1b\x46\xcc\x99\xc1\x1c\x98\x08\x59\x32\x3d\xdc\x84\xd4\x09\xd0\xda\x53\x76\x36\x58\x69\x5f\x85\xd3\xd5\xe0\xdd\xa1\xbf\xa0\x60\x08\x55\xc1\x37\xdd\x87\x30\x1f\xe8\x74\xb8\x95\x34\x17\xfd\x51\xd5\x93\x1b\x0a\x32\xfd\x4c\x1d\xf7\x58\xac\x62\xf1\xcb\x70\x1f\x62\x06\x4c\xf2\xd6\x75\xed\x3e\x80\xa7\x4d\xfa\x6e\xab\x63\x39\x8b\x54\x61\x28\x0e\x12\x2c\x6b\xcc\xc5\xa0\xea\xca\xc9\xcd\xec\xfa\x56\xb5\x4d\x7c\xc5\x0e\x17\xb7\x24\x58\x44\xce\x0b\x98\x36\xa9\x2c\x34\x2a\xe4\xc1\x4b\x15\x7c\xad\xdd\xac\x91\x02\x83\xb8\x9f\xf0\xbb\x57\xe0\xcd\xd3\xb5\x62\xc3\xa3\x9a\xd5\x01\x69\x39\x4b\xe2\xb6\x90\x82\x82\x95\xea\x36\x44\x8e\x93\x8a\x8e\x9f\x09\xe0\x35\xae\x09\x5d\x35\x1c\x82\x15\x12\xd8\xde\x25\x55\x31\x8f\x1a\x5e\xe6\x7c\xa8\xd3\xa4\xf3\x80\x93\xf2\xc8\x34\xc9\x90\x22\x87\x78\xf2\xe0\x2c\x81\x9f\x14\x47\xa1\xa1\xd4\xc1\x6f\x2e\x7b\xa2\x00\x59\x58\xea\x0d\x97\x1b\x4d\x17\x2e\x6b\x0b\x02\x5f\x35\xd4\xdc\xc5\x4f\x79\x9f\xf4\xbc\x6d\xe9\x31\x29\x9d\xcb\x10\x0f\x2a\x3f\xc3\x87\x4a\x8e\x37\xdd\x08\x49\xa5\xbc\xf9\x53\xc9\xc0\x76\x5e\x50\x15\x1f\x8a\x7c\x31\xca\x10\x70\xc2\x01\x4c\x3d\xea\x37\x02\xf7\x58\x26\x91\x28\x34\x00\x5b\x55\xca\x00\x01\x37\x25\xa0\x6a\x66\xdb\xbd\x24\x8c\x09\xa4\x24\xda\x71\x75\x73\xe2\x94\xd4\x0c\xfc\xac\x62\x8f\x05\x1a\x48\xf7\x96\x9a\x39\x81\x24\xe0\x5a\xa1\x8b\x9c\x43\x95\xfc\xb8\x25\xdf\x25\x13\x58\x16\x84\x20\x2c\xbc\x99\x60\x7c\x83\xc8\x24\xf5\x07\xd8\x52\x6b\xb1\xcf\x95\x4a\x92\x02\x1e\xdc\x37\x03\xc8\x43\x63\x95\x96\xba\x18\xa8\xf3\x63\x4b\x1d\x96\x9d\x54\x86\xd2\x57\x17\xda\xd4\xeb\xf8\x96\x9e\xd4\x56\x19\xb0\xfb\x20\xf0\xfe\xf6\xd6\xc9\x9c\x73\xb8\xce\x9e\x73\x2b\x4c\x08\x3d\xaa\x85\x7e\x93\x03\x94\xcc\x91\x5a\x2e\xe8\xa9\x43\x26\x51\x67\x65\x90\x6b\x73\xcf\x4d\xe9\x9a\xc3\xd6\x74\xeb\x17\xc8\xec\xb8\x12\xbf\xb0\xf6\x4f\xac\xe2\x78\xe6\x7b\x09\x7a\x84\x02\xfc\x6d\xaf\x19\x5f\x7c\xfb\xe8\x92\xf9\x4e\x62\xcc\xbe\x58\x90\x3f\x1d\x54\x73\xe8\x40\x3c\xdf\xd6\xce\x0d\x7d\xa0\xfd\x11\xc9\xc4\xc5\x24\x9f\xbe\x06\x04\x56\xd1\xee\x90\x56\x84\xdd\x22\xd0\xb8\x55\x57\x67\x16\x57\xd1\x19\x37\x6d\x17\x77\xe4\x55\xa0\xa8\x60\x40\x07\xe1\xb2\xa7\xd6\x24\x3d\xa6\x8b\x08\x7a\x67\xd4\x56\xe6\x76\xa2\x86\xe2\xde\xa5\x55\x55\xd4\x73\xfa\xa9\x46\xd4\x6f\x71\xb8\xb1\x49\xfa\xf9\x6e\xc7\x2d\xb3\x0c\x95\x76\xd7\x53\x2b\xe4\x31\x83\xda\x54\x2a\xf2\xeb\xbf\x2d\xf8\x82\xa8\xfe\x18\x4e\x37\x2c\xc2\xf7\x05\x5b\x53\x07\x4c\x08\x07\xa5\xe0\x84\x98\x50\xad\xb0\x57\xf6\x13\x6e\xa7\x24\xdc\x08\x5a\x10\xf9\x9d\x68\x13\x3b\x14\xf8\x4c\x97\xbf\xdf\xa6\x6f\xdc\xef\xf8\xb5\xda\xa2\x1f\xf6\x7c\x62\x87\xe5\x71\x6f\x5f\x33\x07\x1e\xb5\xb9\x54\x36\xd2\xee\x64\x24\x1d\x06\x4e\xa3\x09\x54\xd8\x3c\xbd\xdf\xfd\xe6\x2b\x7b\xc5\x9f\x4a\xf2\x58\xd4\xa4\xbd\xf6\x83\xc3\x43\xcd\x95\x28\xdc\xad\x37\x25\x52\x44\x8b\x44\x6a\xb8\xdc\x90\xd0\x72\x60\x69\x4d\xe7\x53\x67\xa2\xfe\xf0\x68\x85\xf2\xcf\xaa\x90\xaa\xfc\x50\xba\x3f\xbb\x0e\xc5\x9e\x0b\x9f\x64\x58\xa5\x85\x45\xb1\xea\x6c\x7b\x01\x0d\xd7\xd4\x98\xc9\x42\xec\x18\x1e\xfd\x57\x1e\x63\x97\x54\xbb\xf8\x9b\x78\x35\xd2\xf4\xc8\xad\x4a\xfc\xd3\x2c\x32\xe2\xde\xd9\xa0\x87\x81\x3d\x70\x9f\x73\x73\x0d\x64\x6d\x2d\x2d\x47\x51\xb3\x06\xa0\x64\x93\x9f\xca\x36\x32\xa4\x5b\xdd\x1a\x05\xa4\x65\xbd\x80\xa6\x24\xec\x9e\x0f\xcb\x0e\x4c\x84\x00\xaa\xcb\x5b\x5c\xe3\x51\xa6\x54\x42\x19\x2f\x62\x97\x7d\x89\x70\x32\x0f\x7c\xa1\x00\x23\x1c\xae\x3f\xb7\x31\x74\x67\x15\x80\xcf\xe2\xb1\xee\xe7\x8e\x7b\x61\xe3\xbb\xfc\xa3\x89\xf1\xdb\xe5\xb4\x73\x6a\x4b\x9d\x1f\x61\x7b\x31\x42\x4b\x44\x22\x1d\x5f\xca\x70\xfc\xe5\x44\xc7\x64\x9a\xae\x62\x83\xfd\x9e\x77\xb6\x32\x4b\xde\x94\x3b\x7b\xe3\xf0\xa4\xe9\x07\x12\x6a\x69\x71\xd7\xc5\xc6\xc2\x03\x88\xee\xcc\xa8\xdc\x8b\xc6\x99\x98\xc1\x3e\x7b\x14\x30\xbb\x6b\xad\xbd\x22\x7a\x32\x75\xdc\x39\xb5\xe7\xaa\xe8\x7d\x2a\xe5\x61\x17\x3e\x67\x2e\xcf\x19\x86\xbd\x91\x5a\xa0\xb8\xc7\x12\x84\x29\xe1\x36\xda\x3e\xac\x4c\xe3\x96\x23\x0d\x68\xb6\x27\xda\xbc\xcd\x0a\xe4\xe3\xf6\x5b\xf5\xd3\x4f\xc0\xc0\x45\x74\xaf\xee\x0e\x0b\x81\x30\xd9\x50\x78\xac\x77\x5b\xcf\xb7\xac\x32\xd4\x8e\xd1\x20\xfd\x3d\xc0\x6d\x8a\x58\xb6\x81\x89\x6c\x02\x82\xa7\x00\xda\x2b\x36\x80\x46\xf0\x47\xce\x6e\x50\x21\x54\x55\x25\x57\xb9\x64\x82\xc7\x7e\x00\x0b\xe1\x00\x83\x52\xe1\x40\xa9\x02\x0b\x29\xd3\x70\xd8\xf9\xf0\x05\x59\x2e\x68\xb5\x74\xc4\x71\x22\x9d\x64\x5e\x0b\xa3\x59\xe4\xe3\x90\xb8\x71\x62\x57\x08\x95\x81\xef\x3f\x79\xdc\x17\x2a\x15\xa2\x44\x0c\x84\xc5\xf7\x01\x92\x30\xf0\x20\x53\xd5\x0d\x03\x0f\x6d\xd4\x47\x60\x91\xc6\x9f\x38\x69\x20\x0f\x20\xef\x4e\x73\x44\xc6\x52\xb9\x49\x53\x4f\x7f\x52\x13\x6e\xa2\xd5\xae\x72\xb4\x78\xed\x84\x7e\xf3\xbd\x9d\x0f\xea\xaa\x2f\x96\xe8\xf2\x0e\x4f\x23\x2c\x5a\xac\xd9\x44\xb1\x35\x7e\x21\x96\x34\x15\x72\x0c\x81\x75\x5d\xda\xc4\x9e\xaf\x93\x3a\xcf\x9a\x6d\xce\x3b\x34\x0a\x96\xff\xc1\x42\x2a\xc0\x3f\x63\xdd\x9e\xdf\xb5\x2f\x3f\xa4\x73\xbf\xe1\x21\x92\xb4\x7e\xb3\x78\x0a\x60\x3d\x30\xb1\x38\x5d\x05\x8f\xab\x7e\xd3\x13\x6b\xa0\x21\xf1\xf8\x30\x30\x13\x62\x02\x92\x03\x64\x38\x26\xc3\x2c\xbe\x6f\xa6\x94\x46\x81\x78\xc8\x86\xab\x79\xa7\xb0\xde\xfb\xb3\x3a\x5a\x97\xac\x3d\x87\x49\x5c\x08\x07\xad\x1d\xd4\x52\x7c\xe1\xd8\x98\x35\x7d\xbb\x08\xed\x06\x76\xd8\x9e\x02\x57\xcf\x30\xd5\xb8\x15\xe4\xb0\x11\x36\x91\xe1\x28\x26\x02\xc6\x45\xd4\xf0\x0e\x6f\x12\x10\x3f\x4a\x04\xd1\xc4\xc8\x6f\x3f\xa3\x62\x92\xcd\xf6\x63\x5a\x51\x83\x53\x62\xd5\xcd\x67\x96\xf9\xd4\xc5\xfb\x82\xfa\x67\x28\xc1\x32\x7d\x54\xd5\x59\xf9\xb2\x27\xc5\x78\xcd\x09\xae\x42\x8c\x60\x22\x28\x8c\xfc\x1e\xbc\x8e\xde\xb6\xc5\x3f\x63\xc4\xb9\x44\x00\x40\x5e\x7a\x85\xa2\xc3\x75\x65\x47\x99\x4c\x66\x52\xbc\xb9\xbe\xd9\x7b\x1a\x76\xd6\x36\x1e\x33\xbe\x49\x0d\xd0\xf2\x85\x54\x01\xa4\xec\xd9\x4e\x96\x15\x4e\x6d\xc5\xde\x94\xd2\x61\x68\x79\xf7\x7e\xc3\x50\x00\xd9\xcc\x47\x06\xdc\x43\xf0\xb9\x7a\x59\xb8\xf6\x22\x19\x46\x96\x4d\x8a\x9e\x1d\x1f\x9e\x6f\x76\x60\xcd\x02\x09\x52\x3d\x2f\x0b\x74\x45\x88\xb5\x6a\x6b\x6e\xfe\xba\xb1\xf2\x9b\xcf\x42\x86\xba\xa9\xde\x44\xcf\xd1\x09\x05\x5c\xae\x45\x2d\x70\xa0\xa8\x0e\xf8\x0e\x66\x5d\x67\xa4\x22\x9d\x91\x2b\x0a\x2f\x74\x5c\x39\x5f\x24\xdf\x50\x7a\xc3\x89\xbb\x9c\x96\xd5\x3f\x8f\x8c\x56\xdd\xc4\x62\xf4\x5b\x85\xc3\x71\xd1\x24\xaa\x81\xa9\xa7\x27\xf8\x36\xf5\x5e\x25\x5b\xac\x3a\xe4\x92\xad\x49\x57\x4f\x8f\x7e\xd9\x0a\xd2\x7a\xb6\x1a\x15\x02\x0d\x26\x8c\xe0\xd0\x56\x31\xd8\x42\xa9\x0a\x94\xa0\x42\x73\x80\x95\xf0\x0d\xa9\x00\x38\xa9\xd0\x1f\xa4\x57\x32\x99\xa0\xe7\x95\xa5\xd9\x3b\x9a\x46\xf6\x91\xdd\x16\xc5\x05\x5e\x0c\xa8\x1b\x17\xcb\xef\x91\xc6\x14\xf5\xa0\xe6\xb8\x2e\xfc\xec\xf6\x0a\x46\x77\x58\xc9\xa2\x9a\x8a\x3d\x1f\xf4\x3a\x9f\x38\x78\x9f\xc2\xdc\x0b\x2f\x79\x0d\x36\x7e\x6b\xe6\xe3\xcb\x4f\xa2\xe9\x9f\x35\xdd\xd7\xf4\x9e\x76\xb8\x48\xe7\xc5\x17\x17\x5f\x23\x66\x64\x7d\xa4\xac\x11\xd5\x0f\xb0\xe4\xd3\x78\x24\x42\x1b\x79\xab\x56\x70\xe3\xad\x50\x31\x2f\x2a\xe7\xac\x64\x06\x63\xbe\xc9\xa7\xd8\xb3\x7f\xfa\x69\xb3\xfd\x0a\x17\xd5\xac\xd0\xa3\xb5\xe2\xd4\x07\x86\xad\xfc\xbd\xdf\xb7\xc6\x29\x6d\x6d\xab\x05\xa6\x2f\x28\x70\xb4\x8b\x26\x7e\x28\x4f\x80\x28\xa5\xed\x98\x41\x5f\x76\x04\x43\x80\x7a\xcd\x4a\x25\xd7\x36\xcf\x6b\x3e\x3f\x3d\x66\x9f\xba\xef\x91\x3f\x77\xb7\xdd\x59\x78\x17\x5c\xda\x4d\x44\x1c\xa7\x72\x0b\x0c\xe3\x00\x03\x37\x49\x6e\xcd\x8b\x8a\xa7\x2a\xfa\x5e\xc8\xed\x19\x5d\x24\x1e\x81\x4a\xb7\x88\xe7\x08\x59\xb7\x04\x1e\x6b\x95\x78\x6a\x47\x91\x46\x5b\x73\x55\xae\x43\xfa\x40\x35\x12\x48\xb5\x82\xbf\x72\x47\x71\xa3\xb0\x7c\x7f\x2b\x7f\x4c\xbc\x83\xac\x5a\x3e\x0c\x40\x1d\xf4\x7a\xb3\x54\x26\x99\xdf\x26\x3e\xdd\x0a\x3c\x06\x45\x3c\xdd\x04\x78\x8c\x52\x76\xa9\x46\xd7\xec\x51\xe7\xc0\x94\x53\xd6\x62\x34\xa7\x41\x78\x3f\x5a\xe1\x81\x01\xd5\x7e\xbd\x29\x48\xa8\x04\xb5\x9c\x7a\x8b\xcf\x45\x5d\xef\xc9\xb5\x70\x08\x5f\xbf\xcb\x16\x94\x2e\x70\xc2\x73\x15\x9c\x40\x90\xe8\xa3\xdf\xa4\x54\x16\x9c\xf0\xb7\x1f\x44\xe7\xe3\xbe\x20\x81\x99\x7f\xde\xad\x54\xf4\xa8\x02\x4a\xa5\x7c\x42\x87\x6b\x00\x38\x2c\x20\x48\x84\x0f\x57\xe4\x6e\xcb\x0f\x5b\xaa\x4a\x9c\xd7\x31\x71\xc1\x2a\x1c\xd6\x3c\xdc\x24\x54\xbc\xdf\x1e\x7a\xad\x2e\xb3\xad\xa3\xa6\xa1\x27\x3f\x00\x1e\xb7\x16\x0e\xac\x47\x65\x2f\xc7\xeb\x83\x85\xcc\x41\x1f\x1a\xbc\x0f\x2f\x6a\x5b\x42\x06\xf3\xb0\xea\xc9\x11\xc0\xc1\x0f\x06\xcb\xc0\x4a\xb5\x89\x59\x2a\x82\xf7\xae\x28\xfe\xda\xdf\xf9\x2b\xdc\xd5\x21\x7e\x9b\xb7\xd1\x3b\x53\x1f\xb5\xb6\x57\x0c\xd0\x93\x1b\x46\xd2\x39\x86\x16\x3c\x05\xae\x78\x75\x5e\xf2\xd3\x5e\xc5\x63\xc6\x26\x4a\xfd\xd2\x3d\x6e\x84\xd8\xb2\x38\x8e\x20\x0d\x93\xc8\xc8\xef\x97\xe8\x7e\x06\x6d\xa8\x17\x7b\xae\x37\xa9\x2b\xca\xdf\x21\x7d\xa5\xb2\x0b\x21\xd4\xe9\xcb\x0c\xa3\x30\x4b\xe3\xc4\x86\xc2\xe6\x69\x70\x68\xd8\x10\xd1\xac\xdf\xb8\xfb\x96\x24\xb9\xb1\x23\x30\x97\xc5\x52\x28\x6c\x28\xfb\xfb\xd2\x0d\x3d\xdb\x83\xbd\x4e\x24\x97\x81\x50\xba\x9f\x34\x6d\x2e\x16\xb9\x99\x25\x30\x3c\xb7\xe3\x39\xa2\x0a\x04\x13\xaf\x49\x11\x05\xb2\xc8\x1f\x73\xe0\x12\x95\xe2\x6d\xb4\xe1\xe8\x0d\x98\x45\x80\xac\x37\xd7\x78\xe9\xc0\xfe\x9e\xa7\x5c\x4c\x42\x06\x47\xe5\xcb\xec\xb0\x17\xa6\xca\x73\xed\xb1\x52\x82\xc0\x20\x2d\x11\x13\xb6\x7e\x4e\x34\x64\xfc\xc1\xb5\xe1\x3a\x52\xef\x08\x6b\xc9\x0b\x76\x28\x68\x32\xa1\x3f\x1b\x16\xc3\xd2\xbe\x65\x07\x6a\xe4\x5d\x5d\x79\xbd\x23\xf8\x98\x7b\xa8\xf4\xab\xb9\x72\xeb\x4f\xff\x05\x53\x34\x4f\x7c\x91\x85\x04\x43\xad\xa8\x76\x89\xe4\xfd\x38\x16\xa2\x7f\x41\x7b\x28\x25\x3e\x90\x9f\x41\x76\x92\xf3\x5d\x92\xd1\xbd\xbf\x1a\x5b\x2e\xcc\x4b\x56\xb2\x29\xda\x25\xcc\xbf\xb2\x2c\x58\xb1\xdd\x47\x0f\xba\x1e\x65\xc3\x29\xd0\xc2\x71\x40\x33\x9e\x1c\xb4\x5e\x1d\x74\xb0\xf2\x54\xa7\xa7\x12\x3d\x82\xb7\x04\x0f\x01\x75\x1a\x04\x5e\x36\x7a\x2f\x77\xfa\x70\x26\x65\x98\x18\xa6\x57\x85\x5e\x72\x67\x7f\x6e\x95\xe3\x25\x45\x6f\xfc\x8c\x13\x2a\xe5\x68\xf2\xda\x44\xbf\x78\x66\x65\x7a\x18\x41\x18\xe2\x25\x6a\x30\x11\x98\xe7\xe5\x7d\xe0\x4f\x22\x87\x0e\x8c\x38\xc6\x6a\x16\x00\x01\xbf\x95\x6c\x05\xd3\x1f\x5d\xbd\xb9\xd9\x03\x23\x07\x64\x8d\x05\x95\x51\x82\xf6\xd8\xad\xf1\x19\x4c\x46\xdb\x7a\xb6\x11\x01\x5c\x0d\x04\x04\x78\x02\x6c\xc3\x9b\xd9\x15\x65\x21\x1f\x90\x43\xf7\xff\xa0\x22\x51\xfc\x1a\x9b\xff\x9e\x8a\x74\xc0\x13\xe2\x63\xfb\xbf\xa1\x22\xdf\x98\x63\xa8\x8b\x07\x31\x09\x0c\xe1\xda\x15\xe3\x7f\x50\x91\x3c\xf3\x1b\x64\x26\xfd\x9b\x1e\x81\x07\x8e\xd6\x7d\x98\xf7\x9f\x8d\xfe\xa2\xba\x6c\x6b\x4a\x62\x6d\x77\x4f\xb9\xc0\x3e\x2a\x22\x64\xd5\xb1\x39\x14\x55\x73\x97\x16\xb5\x66\x4e\x48\x6f\x8a\xed\x21\xa6\x56\xb4\x3e\x76\x31\xca\x61\xec\x53\x6d\x99\xd7\x2e\x38\x89\xff\xf2\x48\xb8\xf3\x83\x63\x9d\x5f\x2c\x4d\x76\xa3\x65\x71\xeb\xbe\x8c\xe7\xe0\x68\x7e\x6a\xa1\x92\x21\xd3\x87\x1f\x25\x58\x00\x00\x86\xa3\x20\x5a\x0e\x51\x94\xb3\x1d\xe0\x2e\x33\xee\x74\x15\x3b\x48\xb3\x91\xda\xbc\x27\x41\x26\x21\x40\xa9\xf4\x99\x72\xef\xb2\xa3\xaf\xe3\xc4\x80\x94\x31\x06\x7c\xa5\xd8\x1a\x3f\xe6\xe8\xb1\xae\x33\x08\x52\xb6\xb7\xdf\xb8\xd1\xfc\x34\x7f\xed\x9c\x46\xde\x12\x24\x9f\x0d\xd0\x0e\xfc\xe8\x03\x70\xe5\x3c\x5e\xe6\xde\x7e\x3c\x97\x75\x3a\x9f\x97\x52\x54\xe3\x93\xaa\x62\xd3\x18\x77\x98\xf3\x25\x19\x41\xf4\x9a\x7b\xfb\x20\x84\xdd\x53\xdd\xac\x5a\x61\x01\x7e\x54\x57\xc3\x11\xc0\x4d\xa6\x91\x90\xed\xe0\xdb\x0f\x26\x53\x0d\xe9\xf6\x01\x06\xbe\xfd\xdb\x75\x7a\x7e\x7f\x0b\xfc\x1b\xe1\xf4\x9e\x6b\x5a\x47\x6d\xf1\xab\xe6\x50\xcb\x56\x06\xf4\x56\x63\x47\x65\xcb\x2c\x52\xca\x8d\x12\xe5\xe7\x21\x29\x57\x91\xb2\xe2\x7a\x90\xc4\x93\x5b\x0c\x76\x69\xc3\x13\xaf\x83\xc2\xd0\xdb\xa0\x66\x95\x7b\x53\xb2\x48\xa2\xde\x28\x31\xd7\x91\x33\x6f\x3f\x0d\xeb\x0e\x97\xd8\x8e\xe4\x56\x83\x45\x69\x80\xe3\xcb\x1a\xc4\x29\xc7\xc8\x58\xfe\x28\xcd\xa4\xd1\x9d\xcc\xfb\x6e\x3c\xf9\xab\x8c\xec\x45\x9f\x1f\x1d\xeb\x54\x26\x7e\x3d\xb2\x52\xcd\xab\x4b\x5a\x44\x85\xf1\x01\x27\x6e\x67\x9a\xd8\xf0\x4a\xeb\xa0\xc0\x6a\xac\x9c\x53\xe7\xb6\x41\xfd\xc7\x3e\xc5\x07\x8b\x17\x99\x52\xeb\xaa\xdb\xae\x65\x59\x97\xb1\x37\x1b\x93\x56\x1f\x07\xbe\x0a\x1c\x41\xf4\xa9\xf8\x4f\x76\xac\x44\xc8\xeb\x26\xbe\x80\x26\x12\x01\x50\x58\xd2\xb5\x78\x99\xeb\xb7\xbd\xd6\xa2\x85\x2d\x08\x80\x1f\x57\x11\x06\xe4\x86\x2b\x1b\x85\xb0\x06\x1e\x51\xe6\xef\x02\x95\xee\x14\x58\xfe\x19\xeb\x43\xc2\x8e\x46\x96\x2d\x38\x0c\xfc\x00\xed\xf9\x70\xe8\x3b\x22\xe0\x6a\x3a\xd5\x6a\x6c\xe8\x10\x12\x5f\x78\x3b\x0e\x7a\x80\xd6\xe3\xda\xac\x5c\xbb\xe2\xd3\x65\xa2\x29\x01\x26\x26\x49\x18\x6c\x6f\xf0\x54\xc8\x3c\xf9\x82\x66\x78\xa4\xe8\x8c\x58\x09\x09\x7f\x0f\x6c\xe5\x38\xbf\x16\xea\xe5\x8b\xca\x2c\xdc\x07\x83\x2b\x81\x32\x5e\x9e\xc5\x1c\x3c\x23\x9c\x4b\xc4\x2a\x33\x5b\x23\x1d\xf8\x36\x33\x9b\x36\x2c\x50\x25\x31\x6d\xd8\x93\x15\x09\x3e\x4d\x23\x95\x5e\xfd\xac\x27\xd2\x7b\x7f\x58\xad\x42\x26\x3a\xbc\xb4\xf1\xdf\x66\x69\x66\x6a\x24\x44\x08\xe3\x0e\x7c\xff\x8e\x73\xf2\xaa\x78\x16\xb0\xdf\xd8\x7b\xf9\x08\xfd\xf2\x84\x52\x6b\x13\x36\xc3\xf7\x17\xbe\xb5\xb2\x13\x2f\x69\xfe\x70\x58\x99\xb9\x06\x75\xdb\x27\x5d\x3d\xa7\xe4\xe6\xfd\x94\x1e\x72\xca\xe1\x6f\xa9\x24\x10\xaf\x48\xe7\xbb\x97\x7f\xd4\x97\x71\x0f\xb4\x2c\x4e\x3c\xc3\x88\xcc\x07\xe2\x6e\xb9\x10\xd1\x52\x16\x44\x71\x80\x3a\xb5\x91\x97\xf7\x2d\x00\x08\x21\xba\x8e\xf8\x06\xdf\xea\xde\x3d\xe7\xa5\x2c\x3b\x3c\xed\x30\x54\xc3\x7b\x42\xdb\xf0\x0d\xef\x30\x94\xc3\x77\x04\xdf\xb1\xbc\xab\xc7\xa9\xec\xc8\xaf\xdc\x9a\x02\xd7\xe8\xb6\xdc\x3b\xfc\xdb\xd4\xdf\x62\xbb\x6e\xdf\x90\xe8\x1e\x47\x6f\xe5\xac\x46\x02\xae\x65\x6d\x3a\x13\xc3\x1e\x29\xb4\x5e\x09\x0f\x10\x2c\x2d\x4d\xb6\x19\xd5\x04\x52\x78\x69\x31\xf3\xd7\x0a\x6d\xab\xbb\xad\x89\x44\xf3\x17\x51\x5f\x84\x15\xe7\xe9\x1d\x8f\x75\xd6\x53\x69\xae\x87\x14\xa5\xd3\xa9\x41\xa6\x12\x96\x4b\x29\x96\xf1\x8a\xae\x16\x26\xb2\x86\xcb\x3a\xa6\x02\x8e\x2e\xf7\x53\x7d\x59\xf4\x05\x08\xef\xac\xa9\x1d\x95\x9e\x78\x0f\x93\x3b\xac\xdb\xc0\x64\x61\xe3\x7b\xae\x41\xae\x7a\x70\x88\x3e\x1c\x32\xc3\x86\x72\xcb\x05\x86\x0c\x7d\xe8\xc1\x51\xbc\x56\xec\x8a\x53\x9f\x78\x36\x8e\x6c\x85\x44\xda\x17\xa2\x81\xe9\x78\x95\x97\x6c\x2a\x4b\x87\x0a\x5d\x60\x96\x3a\x55\x4c\x49\x21\x17\x25\xbb\x02\xcf\x1a\x7b\xf1\x5e\x87\xe1\xfd\x23\xbe\x53\x39\x5e\xb7\xa4\x70\x1a\x3b\xc9\xc6\x8f\xee\x00\xa5\x6c\xad\x64\x22\x10\xf7\x79\x4a\xc5\x31\xe3\xc3\x91\x09\x2f\x7b\xc7\xbe\x1d\xd3\xe5\xdd\xfc\x55\xe4\x45\xef\xe1\xf1\x65\xdf\x44\x81\xae\x9e\x8d\x06\xcd\x1a\xe4\x86\x68\x91\x60\x3e\x14\xbf\xd9\x17\xa7\x4c\xb7\xf6\x8b\xa6\x0f\x5d\x34\xf4\x9e\xae\xad\x4a\x9d\xa5\x5c\xa2\x72\x91\xaa\xd9\x26\x17\x79\xa2\xa5\x69\xa3\xb1\x87\x63\x8d\x36\xea\x0c\xcf\x93\xd7\x24\xc6\xd3\x98\xb3\x4c\x87\xa8\x46\xc8\x3a\x5c\x09\xf8\xea\x8a\xd2\x03\xda\x01\x1e\xb2\x58\x86\x22\x21\xad\xdd\x1a\x8e\xba\x44\x89\x03\x05\xc4\x09\xcc\x99\x8a\x06\xe8\xbb\xa4\xef\xa7\xa0\x16\x1a\x43\x96\xbc\x47\xaf\x76\xaa\x2d\xc1\xe6\x86\x5b\x4c\x6b\xa9\xba\xe4\x17\xc4\x43\x10\x3f\x41\x4c\xb8\x40\xfe\xc2\x6e\xf4\xe9\xae\xae\xf2\xf9\xf0\x98\x6d\x6e\x76\x1d\xbf\xf9\x5d\x4d\x74\xd5\x07\xcd\x07\x7c\xf5\xd3\xcf\x56\xbc\xda\x61\xab\x27\x69\x1e\xa7\x78\x08\xf7\xd6\x03\xf9\xe3\x68\x3d\x65\xf5\x37\x22\xc0\x89\x81\x5b\x5c\x0b\xab\xf9\x3d\x65\xec\x4e\x8e\xf3\x39\x27\xf8\xa4\x56\x13\x53\x91\x27\x3c\x18\x70\x3f\x20\xa2\x1d\x54\x9b\x48\xf1\x34\x6a\xf4\xe3\x1f\x5d\xfd\xbe\x88\x21\x41\x46\x15\x19\x06\xeb\x67\x59\xe6\x47\x26\xd4\x62\x36\xa0\x98\xae\xac\xa5\x94\x6f\x21\x5c\x3a\x5e\x2e\x84\x6c\x9b\x9b\x30\x66\xcb\x6b\x6d\xbf\x39\xe8\xbc\x99\x0d\xe4\xd8\xf3\x63\xae\x59\x9e\x11\x09\x60\xfa\xc1\x46\x06\x0f\x19\xe6\xc8\xed\x4a\xc1\x95\x7f\x1d\x4f\xb0\xa3\xe5\xed\x91\xb6\x9b\x43\x12\xf9\x4e\x10\x99\x4e\x38\xe7\x5e\xd8\x7c\xeb\x22\xd0\xfe\x4d\x07\xc8\xb1\x62\x2f\xad\xeb\xd4\x58\xff\x0b\x15\x59\x33\xcc\xfc\xe7\x98\xfc\x9f\xa9\xc8\xcc\xff\x9b\x8a\x34\xfe\xa2\x22\x07\xc6\x6e\x72\xfa\x80\x62\x26\xc5\x28\x15\x8b\x45\x91\xd0\x4d\x82\xaf\x6b\xbb\xd5\xba\x60\x17\x38\xdb\xbd\x5d\x48\x66\x16\x21\xd5\xf2\x88\xdf\x7c\xb0\x85\xaf\xfc\x7e\x16\x2a\x82\x64\xc4\xc2\x38\x03\x2b\xbb\xc3\x57\x62\xe8\x31\x80\x00\x28\x28\x22\x19\x0b\x6c\x61\x94\xec\xfe\xb1\xfa\xda\xdb\xea\xfd\xbe\x45\xdf\x84\x61\x69\x77\xe9\xdd\xb2\x46\xc3\x23\x61\xfe\x73\xcb\xbb\xe9\xae\x46\x4c\xbd\x47\xe6\x3e\x0d\x90\x8b\x9b\x9f\x86\xe1\xa7\x96\x76\x50\x47\x4d\xe9\x38\xbe\x17\xd5\x2c\x17\xf9\x1b\x28\xdb\x01\xed\x66\x14\x27\x1c\xf4\x6f\xa3\xea\x34\xbd\xd5\x0b\xd1\xcc\x90\x01\x71\xd4\xf7\xd2\x5d\xe3\x39\x01\x2f\xb1\x3a\xce\xd9\xf2\xec\xb8\x06\x0b\x48\x6b\x9a\xe2\x57\x15\xe4\x74\x30\x61\xc2\x3c\xb6\x0f\x6b\x72\x1c\xc0\xee\x94\xf2\xf2\x1f\xe2\xd8\x4e\x52\xe0\xd3\x4a\xf6\xf1\xda\x14\x0e\xf6\xc1\xba\x99\x2e\x8e\x1b\x48\x03\x81\x46\xc6\x4c\x3c\xcd\x9b\xac\x8b\xd6\x52\x5d\x3a\xe9\xa6\x4c\xc1\x78\x38\xdd\x38\xc7\x03\x90\x49\x77\x60\xd9\x21\xd3\x8d\x19\x4e\x0f\x2e\xf9\x3e\xb1\x9e\x4d\xc7\x33\xb5\xd3\xaf\x09\xdb\x29\xce\x5b\xab\x5d\xa5\xd6\x55\x99\x12\xa9\xcb\xf8\x59\x7d\x01\x9f\x86\x04\xb8\x44\x49\x50\x45\x45\xaa\xae\x62\x38\x9f\x1f\x6e\xe6\x7d\xe8\xc1\xab\xb5\xea\x5d\x37\xe1\xad\x5b\x69\x55\xa1\x79\x90\x57\xd1\xe4\x32\x1a\x57\x18\x7a\xbb\x97\x81\x19\x26\x71\x1d\x92\xb8\x83\x3d\x04\x87\xb8\x3c\x42\x16\x84\xf1\x49\xe5\xc7\xd5\x92\xad\xaf\x41\xb4\xbf\x63\x0b\x01\x6c\x2b\x3a\xbf\xa8\xbf\xf8\x7b\x8c\x6d\xd7\x69\x32\x6d\x5f\x59\x14\x73\xe5\x57\xd4\x7c\xff\xec\x5f\x8e\x1e\x2e\x76\x49\xf0\xfd\x66\x03\xab\x3d\xaa\x0a\xa3\x27\xaf\x2b\xa8\xa4\xe8\xaa\x78\xd5\xc5\xb7\x87\x14\x3a\xe5\xc5\x1f\x52\x77\x94\x67\x3b\xba\x04\x14\x08\x81\x4a\xc9\x3c\x7c\x09\x96\x91\x4b\xdb\xe2\x7e\x3a\xe0\x2b\xbc\x06\xa9\x8a\xd4\x30\xf3\x50\x39\xe5\x5d\x39\x65\x6a\x4b\x24\x7d\x2b\x51\xeb\x9d\x37\xfa\x81\x62\x82\x7e\xd3\x67\xa1\x68\xcb\x6b\x05\x0e\x65\x31\x4b\x82\x3b\xec\x66\xd5\xc2\x09\x9c\xa6\x29\x77\x5c\x56\x91\xa5\xc9\x0b\xc6\xfe\x98\xfd\xed\x5b\x61\xd2\x93\x1a\xff\x16\x60\x9b\x76\xec\x27\x68\xa2\xfc\xb8\x70\xa7\xea\x4b\xfa\xd5\x4b\xb8\xc7\x5d\xb0\x85\xfa\x4e\xc0\x9b\xc9\x76\xe1\xd3\xea\xf0\x15\xbf\x5d\x8a\xf8\xd4\x6d\xba\x6d\x3d\xb8\xec\x34\x04\x02\xab\x08\x45\xe4\xef\x8a\x51\xc0\x9a\x9a\x59\xe5\x33\x48\x68\xe4\x43\x10\xd3\xc9\xc9\x32\x27\x1d\x75\x48\xea\x2f\x30\x6a\xd2\xf5\xea\x52\x32\xf9\x7b\x8a\x22\xcf\xbb\x1f\x81\x30\xfd\xb9\x02\x9d\xaf\x33\x19\x33\xc7\x7e\xee\xb4\x6b\x6d\xb1\x92\x6d\x3a\x92\x23\x6b\xa2\x6d\x45\x90\x63\xb8\x80\x63\x6c\x92\xa3\x71\xa2\x63\x99\x90\xa3\x64\xe7\x5a\xee\xca\x76\xb4\x47\xa3\x29\xa0\x6d\x30\xa0\x6d\x12\x80\x6d\x28\x17\x64\x6d\x04\xe4\x14\xcd\x19\xde\x24\x07\x36\x7e\x05\xde\xd2\x06\xf5\x61\x74\xfe\xdc\x01\x2f\x86\xa2\x2f\x4a\xc2\x29\xe7\x82\x10\xc9\x1d\x27\xfe\x46\x77\x12\xc5\x9c\xfc\x3a\x4d\x61\x8d\xfc\x53\x83\xfc\x1e\xad\xfc\x3d\x83\xfc\x69\x82\xfc\xb5\x41\xea\x31\x2d\x15\xaa\x9f\x41\x85\x72\x00\xa8\x46\xed\xfa\xfa\x69\x50\x77\x0a\xf7\xf7\xd5\x57\xf9\xdf\xb8\xf6\xed\x57\x28\xfb\x57\x0a\x51\x75\x18\xf9\x57\x18\x94\x56\xb0\x3f\xad\x54\x50\xf4\x10\x5a\xad\x10\x5c\xad\x30\xde\xad\x64\xbf\xeb\x60\xd5\xad\x50\xd6\xad\x10\xd2\xad\x30\x88\xac\x60\xc5\xac\x94\x01\xf2\x28\xc6\xac\x10\xc2\xac\x30\x10\x21\x3c\x25\xf7\x6a\x39\x0b\x1c\xdd\x0d\x76\xd7\x59\x5f\xfc\xad\x5e\x82\xb5\xdf\x82\xf5\x10\x4c\x32\x50\x8f\x62\x3c\x2d\x7a\x9c\x2b\x8f\x68\x4c\x3a\x5c\x6c\x19\x06\xbf\xce\x57\xa9\x17\x29\xa8\x5b\x2e\xa8\x47\x2d\xa9\xe7\x2d\x56\x7f\xb3\x90\x15\xf2\x25\x58\x9d\x11\x29\x70\x49\x73\x72\xe4\x86\x0e\x17\x6d\x0a\x37\x07\xaa\xfc\xf7\xd6\xa9\xf7\xa7\x53\x6f\xaf\x53\x1f\x17\xe5\x4b\xaa\x53\x37\xae\x53\x8b\x87\x03\xc1\x06\x98\x44\x56\x8b\x05\x2f\x4f\x85\xbf\x86\x6c\x13\x84\x8e\x96\x8a\xa0\x14\x76\xc1\xd1\x28\x8f\x85\x84\x73\x4a\x9f\x90\x26\x59\x08\x47\x6a\x4d\x46\x9d\x7a\xf2\xca\xc8\x6b\x00\x2f\xcd\x45\xa2\x96\xb9\xae\x23\x72\xcf\xda\xab\x2a\xd0\x5b\xa5\x93\x22\x71\x84\xcd\x7d\xdf\xa4\x58\xc6\x14\x1e\x90\x65\x20\xb4\x80\xaf\x66\xbe\x56\x7a\xda\x54\xc6\x16\x02\x97\x4a\x3c\x61\x76\x43\xdf\x1f\x92\x8e\xc9\xe0\x0f\x29\x4b\xda\xe9\x5a\x20\xf7\x0c\xf7\xd9\xbf\xf4\xce\x5f\xbb\xa1\xb2\x20\xc6\x86\xcc\xa1\xf5\x58\x47\xa0\x97\x1e\x21\x11\x2f\x9f\x01\xf2\x8f\xb1\x20\x1e\x4e\xa7\x91\x1e\x26\x50\x39\x04\x6f\x7c\x6f\x62\xa7\x9b\x4d\x05\x51\x39\xf8\x30\xd3\xce\x19\x97\x44\x65\x1d\x31\xeb\x89\xcf\x2e\x24\xc3\x6c\x74\xd2\xe4\x7a\x7a\x6c\x20\xd4\xb9\x39\x6d\xd1\xe1\xa4\xd6\xaa\x77\x2e\x35\x77\x3c\x38\x69\xde\x29\x34\xcc\x16\xd5\x4d\x96\xbd\xcc\x94\x31\x8c\x21\xc0\xe0\x31\x4a\xc7\xd7\xca\xfe\x20\xcb\xac\xde\x40\x4d\xfa\x0c\x94\x10\x4a\xf4\x63\x5f\xb8\x4c\x73\xe5\x7d\xc2\xe0\xf4\xea\xd8\xef\xa8\x15\xc9\xfd\xb2\x79\xda\x4a\x61\x84\x1e\x27\xc9\x75\xd0\x8f\xa6\x91\xc5\xf2\x16\x1c\x29\x4d\xa1\x09\xf1\x4c\xde\x43\x73\xda\xa4\x28\xdd\xd7\x70\x87\xb3\x83\xdd\x24\x3d\x29\x70\x2b\x10\xe7\x2d\xe9\x3a\x28\x92\xa8\x3d\xb3\x56\xd4\x29\xd2\xb4\x05\x90\xd1\x34\x9e\x3b\xb5\xba\x0c\x03\xe2\xcf\x6b\xe4\x0b\x42\x42\x41\x76\x69\xa1\x1b\xf7\xe2\xe9\x9a\xbc\x50\x6f\x84\xf5\x8a\xb6\x1b\x14\xe3\xad\xe7\xb5\x6f\x9e\x77\x45\xe2\x7d\xa0\x5e\x1c\x15\x5c\xab\x3a\x17\x24\x74\x8c\x0a\x4d\x08\xaf\xa9\x27\x07\xb4\x15\x6d\x2b\x20\x52\x63\x00\x14\xd1\x8d\xeb\x4c\xe1\x69\x08\x81\xce\xd1\xf3\x4e\x4e\x5b\xb2\x53\xce\x22\x8b\x61\x16\x17\xb2\x5f\x7e\xc5\xd3\xb5\x4a\x64\x31\x1c\x2f\xff\xe7\xb8\xc3\x90\xd1\xba\xd1\x5d\xb8\xe5\xb6\x69\xe5\xd7\xe8\x22\xc0\x16\x9f\x05\xca\x39\xf6\xd6\x5f\xdb\xcf\xc4\xa2\x2d\x8c\xbe\x7f\xf5\xb1\x65\x45\xe5\xc0\x4d\xb6\xc6\xe5\xdf\xfd\x18\xdd\x4f\xbb\x91\x3e\xda\x6f\x9d\x93\x6f\x7d\xea\x75\x74\x39\xe4\x9d\x7d\xc7\x64\xcc\x8d\x71\xbe\x8f\xda\x11\x35\x89\x9d\x5d\xa3\x95\x51\x53\x7d\xa1\x18\xe6\x45\x2a\x72\xfe\x3c\x8f\x1d\x9c\x83\x2a\x32\xcb\x37\x8a\xc2\xb2\x3b\x7e\x1a\x35\x6e\x48\xe9\x5d\xb5\x60\x61\x1b\x1a\x09\xc5\x23\xbb\x54\xc6\xf6\x1b\x76\xee\x87\x9d\x8c\x85\xe5\x4a\xf8\xcf\xf0\x19\xb4\x31\x3d\xfd\xc9\xa9\xff\xdf\xff\x9a\x85\xc4\xfe\x1f\xb3\x90\xd1\xfd\x37\x0b\x39\x9b\xcc\xff\x19\x0b\xa9\x7a\x99\xc6\xff\x6f\xb3\x90\xd5\x3f\x58\x48\xa0\xa9\x22\xe7\x3f\x58\x48\xe3\xdf\xb3\x90\xfe\x5f\xe3\xd5\xff\x60\x21\xd7\x14\x05\xfe\x83\x85\x4c\xed\x7f\xcb\x42\xf2\xff\xca\x42\x16\x14\xfb\x22\x7f\xb3\x90\x0f\xf3\xef\x59\xc8\xfb\xdf\xb2\x90\xcd\x9f\x45\x73\x3d\xc3\x88\x10\xb5\x1b\xe2\x6b\x84\x7f\xb3\x90\x1b\xf3\xaf\x2c\x64\x8a\xc5\xd2\x7f\xb0\x90\x57\xfd\x2f\x2c\x64\xc9\xff\x0b\x0b\xa9\xfd\xc5\x2e\xfe\x75\x13\xb6\x97\xee\x53\x8d\x5b\xe3\xdf\x2c\x24\x32\xff\x99\x3e\xfb\x07\x0b\xf9\x06\x41\x95\xfe\xcd\x42\xfa\x6c\xfd\xaf\x2c\xa4\xc3\x34\xf8\xdf\x2c\xa4\x6d\xfe\xa5\x38\xfe\x79\x55\x46\xaf\x01\xa9\xe8\x4e\x7f\xb3\x90\x7f\xcd\xf4\x5f\xb3\x90\x7f\xd6\xff\x6f\x58\x48\xe2\x5f\x59\x48\x11\xfe\xcf\x2c\xe4\xcf\x8d\xcf\xff\x8a\x85\x34\x8f\xff\xdb\x2c\xa4\x96\x09\x41\x20\x0c\x28\x59\x99\xf8\x86\xde\xfa\xbe\x44\x2f\xef\xd7\x7d\xe3\x33\x4d\xd8\x74\xbf\xf6\xa7\x1a\xcf\x38\x2c\xb2\xf3\x8c\x3b\xcb\x40\xb1\x11\x63\x55\xaf\xd3\x7e\xa2\x66\xe2\x2b\xe6\xfe\xe7\x77\xeb\xa3\x88\x6a\xc2\x6b\xb6\x7e\x2c\x35\xeb\x7b\xc2\xda\x37\xe5\xcf\x22\x64\xb9\xaa\x15\xbe\xbd\x79\x15\xd1\x68\xc6\x9d\x53\x99\x5a\x60\x34\x82\xaa\x9c\xbf\xc8\xe4\x7c\xd4\x00\xad\x50\xb3\xaa\xf2\x1d\x2c\x4a\x1c\x40\x3f\x99\xe1\x5c\x51\x9e\x97\x5e\x5f\xd7\x71\x98\xfd\xdb\x10\x39\x5d\xf6\x06\x09\x13\xd9\xa9\x32\xa3\x73\xea\xe7\x31\x3a\x3a\xd4\x79\xfd\x6f\x81\xbe\xe2\xc6\xa7\x1a\xc4\x67\x43\xc1\x9c\xbd\x0c\xbe\xb4\x72\x38\x31\x4e\xb7\x07\x91\xe3\x74\x7c\x34\x8b\x9d\x77\x48\xf0\x87\x94\xe7\x98\x86\xf0\x26\xbb\xc3\x1e\x5f\x82\x4a\x25\xcd\x9b\x95\x99\xb3\x97\xc5\xbc\xdd\x56\x41\x59\x71\x59\xdd\xb8\x45\x9c\xea\x99\xd4\xd7\x45\x2b\x6b\x3f\x19\xe1\x91\x8c\x21\xd1\xe6\x3a\x1d\xfc\xad\x28\xe5\x04\x65\x72\x24\xe8\x09\x61\x99\x05\xa4\xc0\x1f\x08\x14\x05\x16\x9a\xd7\xcf\x38\x4a\xbf\x42\x9a\xa3\xa7\x64\x0a\x6d\xee\x88\xdd\x1a\xcd\xac\x30\x13\x34\x7f\x02\x8c\xb4\x17\xf7\xed\xb2\x90\xe8\x4d\xf7\xf3\x18\x7a\x3a\xfa\xd8\x66\x9b\x90\x7f\xec\x90\xbf\xe1\xee\x87\x81\x05\x5f\x5b\x02\xff\x6b\x72\x8f\x4d\x1a\x46\xe0\x54\x94\x87\xc7\xc5\x89\x9d\x5a\x2d\xc9\xe9\x63\x72\xf9\xc3\xde\x6b\xb6\x68\xc1\xbe\x18\x57\x8e\xda\x44\x97\xda\x28\x97\xda\x2a\x37\x1a\xab\x94\x9e\x1f\x6b\xb5\xfe\xcf\x62\x12\xbe\x64\xe6\x3e\x97\x51\x87\x99\xa7\x96\x57\x42\xf2\x29\x4f\xa1\x51\x16\x35\x91\x5b\x81\x5f\x1f\x41\x31\xb4\x45\xb6\xa9\x5e\x09\x8c\x1c\x80\x9e\x40\xef\x6f\xab\x33\x55\xde\x80\xd1\x4b\x34\x3b\x93\x4c\x89\x98\xc8\x49\x7a\xad\xfb\xdf\xc0\x0a\x82\xaa\xa6\xae\xa8\xa7\x7d\x2e\x50\xa8\xee\x07\x73\x5f\xff\x3a\xd7\xb3\x5d\xee\x2e\x9f\x7e\x33\xb3\xd7\x56\x29\xa7\x09\x73\x10\xf3\x80\x1f\x38\x59\x10\xdc\xef\x8a\x20\xc7\x8e\xe1\xd4\x66\x29\x0b\x5c\xec\xb1\x51\x5b\xba\x26\x2f\xcc\x35\x9b\xb5\xbc\x0a\xf1\x73\x14\x3b\xab\xeb\x28\x85\x16\x7b\xab\xfb\xd4\x50\xd7\x15\xbe\x76\x2b\xad\x98\x4e\x36\x23\xb5\xcc\x0d\x28\xa7\x4a\x89\x3a\xa2\x41\xd9\x8d\x7d\xf1\x15\x5d\x52\x67\xb4\xb4\x49\x99\x3a\xa2\xf5\x20\xe9\x4e\x60\x4f\x04\x14\x36\x38\xdf\xf4\x46\x5a\xf8\x13\x9d\xcd\x14\x87\xf2\x3e\x46\x23\x81\x40\x49\xff\x18\x67\x4c\x38\x2c\xc4\x54\x60\xbe\x71\x38\x7e\x85\xf9\x7c\x3c\x8d\x62\xc0\xfc\xf9\xdd\xd4\x0d\xcc\x88\x4e\x48\x43\x48\xb5\x41\x48\x09\x70\x98\x75\xd4\x46\xb7\xfd\x56\x24\x36\x69\xa6\xfc\xb4\x62\xdd\xa5\xc5\x93\x39\x90\x43\xf4\x01\x7c\xe6\xef\x25\x56\xc2\x4a\x15\x12\x23\xd9\x5c\x1c\x99\x1d\xee\x2a\xd3\x12\xfe\x72\xd7\xab\x44\xe2\x3e\xbe\xa5\x85\x7b\x50\x16\x01\x19\x40\xd6\x27\xc8\xd5\x00\xcf\x61\xbe\x35\x79\x88\x6b\xe2\x82\x11\x17\xd6\x02\x92\xb8\xdc\x49\xef\xf9\x3d\xad\xbf\xb6\x09\x6f\x84\xc2\xcd\x85\xc2\xa3\x95\xc2\x2d\x95\xfc\xd3\xdf\xed\xdc\x2a\x61\xce\x13\x03\x1b\x30\xb0\x08\x87\x9c\x6d\xd7\x5e\x6c\x33\x4e\x9a\x16\x82\xda\xc2\x49\x7a\x18\x6a\x5b\x78\x3e\xe6\x08\x75\xae\xb4\x37\xf1\x93\xcf\xea\x17\x03\x9e\xf3\xfb\xd1\x8b\x57\x6d\x48\x5f\x11\xbd\x75\xa8\x11\xaa\xf8\x7e\x21\xaa\x6d\xfd\xba\x76\xf0\x55\x31\xe7\x99\xb2\xa7\xcd\x5e\xe5\xd8\x4b\xbc\xaf\x68\xda\xb9\x99\x4f\x2e\xc1\xc3\x2a\x8b\x77\x1a\x0a\xd4\xf1\x3d\xac\x0e\x08\xfe\xb9\x1f\xd2\xe5\x69\xe0\x98\x33\xb4\x2c\x81\x5a\xfa\xd2\xb8\x53\xc1\x95\x6f\x8e\x84\x17\x0e\xcd\x13\x70\xfa\x29\x8e\x53\x2f\x30\xb2\xe6\x6a\x11\x5e\x41\x85\xa4\x91\xfe\x3a\x6d\x0f\x9d\x54\xdf\x69\x4a\x23\x80\xfe\x21\x84\x3b\xfe\x73\xf5\x48\x7e\xd0\x07\xa7\xcb\xc1\x7f\xee\x71\xdc\x61\x32\xd4\xd3\x37\xee\xd2\xd0\xee\x57\x90\xc1\x66\xb4\xff\x79\x84\xac\x10\x4f\xe7\x40\xd8\xd3\x33\x10\xdd\xa9\x68\x99\xe1\x2e\x8e\xe6\x52\x29\x85\xb2\xfe\xd7\x8d\xc3\x05\xfd\x93\x32\xe0\xb2\x8e\xfb\x6b\xdb\x31\x5c\x13\xcc\x28\x91\x41\x54\x6f\x22\x84\x5a\x7a\xaa\xb4\xd5\x1f\xd2\x01\x54\xbd\xc3\x0e\x07\x45\xca\xc6\x0a\x3c\xf6\xe1\x09\xdf\x9f\xf9\xba\x47\x26\x9b\x43\x7f\x8d\x88\xab\x65\x4a\x74\x50\x4b\xb6\xf7\x35\xdd\x4f\xcf\xeb\xdf\xa0\x1a\x54\xbf\x1d\x7c\xfb\xa9\xf3\x8c\xd9\x1f\x23\x62\x84\x99\x1b\xc6\xd3\xec\xd7\x71\xba\xf7\x89\xe1\xf8\x1e\x6e\x9c\x86\xa9\x78\x16\x64\x9e\x89\x69\xc6\x86\xa9\x73\xe6\xf9\xae\xdf\x40\xca\x5e\xe6\x1c\x86\x68\x38\xae\x85\xde\xd2\xc3\x1e\xee\x10\xb2\x53\xd6\x6e\x68\x97\x21\x1d\xc6\x88\xf4\x88\x64\x86\xaa\x39\xe2\xd4\x9e\x89\x2c\x89\x88\x32\x79\x2b\x59\x12\x47\xa9\x2f\x85\xfa\x75\xb0\xd6\x81\x67\x59\x1a\x8d\xc3\x46\x46\x11\xc2\x4e\xa7\x76\xe5\x56\x88\x64\x60\x56\x02\x30\x4d\x2f\x20\x12\x91\x99\x03\xee\x39\x90\x26\xd7\xc1\x5e\xe7\xaf\xca\x83\x91\x74\x2e\x44\xaa\xce\x12\x0d\x77\x0b\xe1\x2d\xe4\x87\x5e\x3a\x38\xb2\x60\xb1\xc7\xc1\x29\x10\xe7\xc3\xc0\x90\x4d\x3f\xb7\x41\xaf\x46\xe1\x94\xb8\x45\x36\xaa\x41\x05\x46\x51\x58\x85\x27\x95\xde\x49\xa1\x46\x7e\x5f\x05\x1a\x12\x4a\x08\xe0\xe1\xc9\x57\xb9\xba\x55\xe2\x16\x59\x1b\xea\xa6\xe8\x13\xc2\x30\x42\xc3\x59\xb6\x54\xe4\x6d\xc2\x1f\x4b\xc3\x0d\x8d\x47\x24\x7c\xa1\xb3\x37\x6d\x13\x44\x92\x32\x0d\x9a\x43\xb5\xd6\x17\xfd\x04\xc0\xa4\x80\xb5\x06\x1a\xc1\xb5\x27\x16\xf5\x59\x14\x5d\xe1\xa3\x45\xef\x17\x25\x5f\x94\x15\x11\x49\x45\x33\x28\xc0\x57\x74\xba\x81\xa1\x05\x04\x19\x28\x66\x15\xb1\x55\xb8\x14\x11\x13\x0a\xa0\x28\xc0\x65\x15\xd9\x5d\x14\x1f\x81\x39\xf8\xd8\xf5\x4f\x96\x4b\x8b\x45\xe1\xa4\x35\xf0\x36\x52\x87\x7c\x0b\xde\x98\x72\xe2\xcd\x78\xf7\x69\x8c\x54\xf5\xd1\xa9\x20\x1b\x7e\x65\xa2\xbd\xe8\x2b\x23\x35\x1d\x9e\x41\x8a\xbb\xd2\x28\x61\xa3\xbb\x0d\x6f\x13\xa9\xfd\x6b\x88\x57\xa5\x7e\xf8\x11\x78\xc7\xf0\xb6\x16\x3f\xd1\x64\x3e\x4f\x30\x67\xa8\xa7\x3f\xe0\x8b\xa4\x88\x40\x4e\x23\xc6\xd5\x27\x78\xb5\x9d\x63\xe0\x83\x3c\x62\xc2\xc0\xb6\xdf\x4b\x7b\x5c\xc1\x80\x53\xcd\x18\x84\x92\x76\xa5\x14\xee\x55\x81\x40\x26\x43\xa9\xeb\xab\x81\x04\x29\x1e\x48\xa3\xf9\x81\x31\x32\xa3\x63\x7a\xec\x05\xf6\x2e\x6f\x8b\xaa\x74\x58\xc6\x48\x7e\xac\xf4\x85\xa1\x0f\x38\xe9\xc5\xbe\x77\x3c\xfc\x56\x88\xa4\x4f\x26\x2c\x79\x4a\x39\x5f\x01\x0a\xba\xdb\x61\xe7\xd6\x9a\x21\x1b\xef\x8d\xd8\x5b\x13\x88\xd7\x07\x40\x66\x51\x5d\xb8\x58\xdd\x88\x14\x3c\xb2\x8f\x5b\x8f\xe5\x45\xfa\x59\x93\x82\x7e\x0e\x6a\xa6\x70\x44\x86\x5a\xb7\x0e\xe8\xf2\x89\xd6\xe0\x91\x60\xde\x99\xb0\xe7\x99\xa1\xfa\x1d\xa1\x74\x28\x15\xfc\x25\xa6\x08\x5e\x6b\x06\xc7\x29\xe8\x3a\xc4\xf5\x6c\x93\x47\x07\x28\x1d\x9e\x39\xe8\xf0\x8f\xb6\x1d\xb8\x4a\xdb\x00\xe4\x9e\x75\x73\x58\xeb\xb7\x2d\x1d\x04\xda\x8b\xec\x8c\xd8\x3c\xf7\x64\x59\xf9\x57\x17\x21\x04\x7a\xd3\x02\x92\xde\xc0\x72\xf9\xd2\x7b\x1c\x89\xae\x9e\xfe\x4e\xcc\x0a\x4e\xd3\x91\x89\x90\x46\xb6\x6e\xb0\x41\x74\xc5\xa4\x0d\xc4\xc4\x68\x40\xf4\x0d\x89\x1a\xba\x19\xfe\xe6\x26\x8d\x26\x28\xf5\x2b\x92\x67\xcd\x17\xb0\x70\x29\x03\x0f\xbe\xf5\xe1\x0f\xd8\x92\xb6\x0e\x49\x23\xef\x47\xc4\x76\x85\x49\x21\xdd\xaa\xf1\xc7\x39\xe5\xd3\xf8\x65\x75\x3e\x19\x46\xb7\x1e\x44\x13\xc7\x4b\xd3\x31\x9e\x6e\x0a\x42\x72\xe0\x65\x0a\x56\xda\x88\xab\x7c\x6d\xa3\x5a\x11\x54\x61\x1a\x38\x5a\x55\x61\x6c\x2f\xc5\xa6\xb1\xa4\xb5\x7d\xa1\x16\x8d\x3b\x40\x22\xcf\x8f\xbe\x62\x78\x72\x60\x90\xa3\x8b\xf4\xa5\x40\x58\x29\x69\x30\x20\x25\xe2\xda\x7b\x13\x68\x06\x04\x1b\xbc\x92\x98\x89\x2e\x0a\x01\x7f\xad\x7e\x79\xd9\x91\xba\xc7\x41\xaa\x46\x1f\x4e\x48\x0e\x55\x2f\x59\xf0\x29\xf4\xdc\x2f\x94\x03\x2d\x67\x0e\xdc\xcc\x8e\xa2\x39\x68\xf8\x6d\xba\x4c\x35\x08\x5a\x03\xdc\x53\x03\xf2\x73\x83\xec\xc3\xa1\xe9\x90\x2c\xf1\xc0\x5a\xdb\x3d\xb9\x53\x92\x27\xde\xe0\x16\x50\x95\xc0\x7d\x10\x5e\x3f\x38\xf0\x4e\xce\x02\x65\xfa\x00\x04\xc4\xf5\x47\x56\xe0\x97\x54\x3f\x14\xaf\x9c\xa2\x02\x4a\x69\x7a\xc0\x69\xe8\x9f\x9f\x21\x99\x5f\xcd\xe4\x0c\x8b\x31\x8c\xef\x88\x9e\x60\xff\xe9\x9b\xff\xd1\x24\x5a\x20\xf8\x9f\x7f\xc3\x25\x6f\x02\x7e\xbf\x5b\xdf\x98\xfb\xf0\x04\x41\x97\x98\xdb\x64\x8c\xd9\x99\x3a\x91\xb7\xe3\x2f\x66\x29\xb6\x8b\x45\x53\x64\x27\x9b\x51\x1b\xf4\x14\x00\x8e\xc1\xf4\xdf\xba\x80\xa3\x1a\x81\xe2\xa7\xdf\xba\x42\xf7\xb0\x20\xd4\xb1\x52\xeb\xfd\x68\xb4\x49\x30\x5b\x0b\x6b\xc7\x23\xc3\xdd\x99\xbd\xc2\x7f\xc5\xc4\x2d\xf4\xc2\xe0\x67\xfa\xce\x27\x56\x20\x80\x56\x0e\xbf\x0a\x56\xf4\x27\x14\x7b\xce\x2a\xfb\x4e\x95\x0e\xaf\x46\xf8\x9b\x31\xbe\x1b\xdd\xa7\xc4\xc3\x72\x4e\xa0\xc9\x53\xeb\x76\xa2\x63\x78\x3e\x19\x67\xe4\x56\xc3\x31\xf6\x02\x1f\x1e\x64\x64\x7d\x17\x0f\x5c\xe8\x3a\xf5\x62\xf9\x98\x95\x39\x8d\x7f\xdf\xf2\x4d\x93\x34\x96\xe8\x43\xdf\x73\xb9\x6b\x76\xe4\x5a\x81\xb9\x26\xa6\x59\x9e\xfe\xfa\x49\x4a\xfc\x71\x5d\x2c\xfa\xb9\xbc\x13\xe4\xa1\xc8\x3c\x85\x40\xd0\x2f\x2e\xf9\xf6\xc7\x29\xfc\x2d\xba\xf8\xdd\xbb\xe9\xda\xbb\x44\xa2\x0f\xce\xa7\xf4\x90\xbc\xf4\x8d\xdc\xc1\x51\x33\x5c\x52\xa9\xe8\x33\x90\x6d\x65\xec\x51\xd8\x35\x64\x75\x90\xde\x41\x3a\x27\x99\xd9\x6e\xa2\x10\x9e\x53\x54\xe1\x0d\x88\x7b\xee\x40\x37\x54\x68\x48\xc7\x6a\xa5\xa5\x99\x00\xfc\x02\xea\xb9\x3f\xee\x89\x3c\xab\x89\x3c\x8a\x89\x3c\x20\x89\xbc\xb1\x99\xc2\x1a\xe3\x75\x0c\x54\x92\x6d\x11\x2a\x67\x9c\x94\x7d\x39\x10\xc6\x76\x10\xdb\x41\x2a\xfb\xe8\x39\x0f\x55\xa2\x85\x28\xec\x6b\xb4\xf3\xd1\x81\x0b\xaf\x70\x06\xbb\x5c\xb8\x35\xc4\xa2\x18\xe9\x2c\x06\x29\xb8\xc2\x5c\x10\xac\xc8\xe2\x1f\xe9\xe2\x0e\xe9\xf2\x1b\xd2\xfe\x5b\x07\xb7\x20\xa4\xcf\x1b\x8b\x30\xa1\x2d\xc4\x9b\xe9\xc7\xc1\xf4\x06\x7d\x8c\x5a\x42\x2e\x74\xb7\xa6\xf8\x3a\xf1\xab\x20\xac\x2e\xa5\xb2\xa9\xa3\xe4\xd2\x2e\xa8\xa1\x88\x2e\x64\xc2\x47\x1c\x33\x71\xab\xee\xe0\x9d\x9f\xc1\xcb\x02\xe4\x42\x84\xa1\x3e\x8a\xa4\x00\x21\xa7\xae\x6e\x9d\xaa\x04\x4c\x56\xd3\xc0\x6f\xf6\x1c\x90\xc0\x7a\x8a\xa9\x2b\xb7\xb3\x6e\x5d\x96\x87\x66\xb2\xf8\x76\x92\xe6\x45\x19\x79\xac\x97\xd8\x93\x6b\xdd\x9f\xab\xaa\xaa\x12\xdb\xed\xf3\xb0\x82\xc5\xcc\xbd\x9e\x38\x8d\xc2\xfd\xca\x84\x8f\xef\xbe\x09\x1c\xb1\xf7\x63\x62\x7e\x06\x8e\x5d\x46\x1d\xce\x9f\x5e\x4f\x30\xc5\x13\x6d\xb7\xc7\xa7\x5f\xa0\xc6\xcf\xe4\x0c\x7d\x4f\x19\x7a\xb2\x48\x5a\x66\xc6\xf7\x80\x4e\x7a\x72\xf3\x5a\x98\x3b\xad\x17\xcc\x25\xe0\xbe\x43\x2d\xfa\x7b\x82\x05\x00\x78\xe3\xc8\xbe\x1c\x2d\x37\x89\x39\x84\x3b\x9e\x53\x47\x93\xe9\xe7\x43\x10\x38\x5f\xef\xcc\x67\x1e\x47\x1a\x2c\xa9\x01\x41\x7f\xbe\x60\xc1\x3d\xcd\xc5\xc6\xb8\x06\xe4\xb8\xa6\x55\xe6\x84\xdb\xe1\xa0\x4e\x66\xb2\xfb\xf1\x55\x5b\x98\x5a\x64\x94\x7c\x18\x19\x64\x4d\xf4\xbc\x94\xcd\x21\x59\x58\x0c\x5d\xe2\x22\x99\xc2\xa7\x56\x48\x77\xa6\x5e\xde\x98\x22\x7c\x9f\xe8\x0e\xce\x59\xcb\xed\xa9\x1a\xa8\xb4\xb2\xcb\x50\x3b\x05\x07\x4a\x45\x82\xad\x79\x9c\xbb\x6f\x97\xc1\x7b\xe2\xd0\xa4\xa9\xb3\x6c\xe4\x5f\xa4\x99\x2b\xce\x15\x85\xb1\xdf\xe3\x4f\x7f\x94\xc4\x38\xad\x8f\xb7\x7d\x7c\x88\x7e\xb1\x2a\x11\x69\x45\x51\x55\xaf\x23\x2b\xf1\x17\xe3\xca\x31\xcc\xa2\xb2\xba\x7c\x37\x9d\xd8\xd3\xcc\x6d\x79\x59\x9b\x84\xec\x9c\x81\x72\xfe\xb9\x20\x86\x24\xc5\x05\x82\xf7\xe4\x2a\x6e\xc5\x81\x03\x48\x03\x32\x87\x31\xc8\x4e\x19\xfb\xd4\xa5\x5b\x90\x2c\x05\x6d\x88\x82\x12\x52\x89\xab\x67\x61\xd8\x38\x2e\x55\xe8\x93\x9a\x39\xaf\x6a\xfb\x75\xcd\x73\x76\xbc\x1d\xf6\x36\x63\xe1\x7b\xb0\x69\xea\x63\x6e\x95\x0b\xe7\x21\xd0\x11\xf8\xbb\xca\x48\x4b\x73\xa0\x46\xab\x61\xbb\x44\xba\x1f\xeb\xd8\x2d\xe9\xc3\xae\x68\x93\xd4\xcf\xcf\xb8\x46\x74\xe8\xf4\xc5\xae\x63\x1a\xb9\x58\x5e\xde\x51\x2f\x14\x87\x25\x9f\x0f\x74\x33\x16\x58\x0f\x3f\xdb\x6b\x8e\xb1\x3d\x01\xdc\x5e\x1d\x09\x84\xc5\x0d\x16\xe7\x97\x47\x37\xe9\x2d\x3b\x99\xd1\xbd\x97\x40\x38\xc3\xba\xed\x23\x6f\x7c\x9c\x97\x8f\x07\x56\xd5\x8c\x5f\x08\x81\x28\xf4\xc3\x8a\xc2\xce\x18\x2f\xb8\x58\x82\x5f\x13\x51\x95\xe9\x6b\xb5\xbd\xc1\x20\x42\x7d\xc2\x61\x44\xf0\x8f\xee\xd6\x51\xb8\x59\xc5\x8f\x07\x5b\x65\x1a\x7e\x22\xc5\xd6\x4b\x3a\x2e\x90\xea\x31\x8d\x41\x28\xd7\x01\x30\xa8\x6c\xe1\x1a\x17\xb1\x06\xb7\xb9\x8a\xfb\xf4\xde\x16\xd0\xb1\x54\x0b\x87\x98\x95\x93\x35\x4e\x3e\x64\x83\xe9\x07\x09\x3d\x30\x8d\x99\x33\xdb\x45\x7e\x85\xd7\x9a\x6c\x02\xaf\x17\x39\x28\xfe\x89\xa7\xae\x66\x32\xf2\x6b\x63\xf9\xeb\xee\xf2\xb5\x3b\xc3\x64\xc0\x1f\x2b\x5e\x59\xec\x76\x5f\xad\x41\x6d\xc0\xae\xc1\x44\xc1\x2c\x31\xb7\x63\xaa\xb3\x9c\x95\xd8\xbb\x9c\x1f\xbd\x45\xc0\x29\xc4\x5f\xf5\xfb\x32\xe5\x4f\x18\x12\x9a\xf8\xdd\xe6\x16\xa2\xd5\x9c\xbe\xad\xb4\xd3\xa7\x98\xf6\xbd\xff\xf5\xfa\xe2\x9e\x4e\x5e\x0e\xe2\x60\x6c\xb1\xb2\xe9\x2c\x83\xbb\x45\x91\x36\xd2\x2f\x4a\xe0\x5b\xbc\xf2\xcf\xa9\xb3\x7a\x2a\xeb\xc6\x63\x6b\x77\x6b\xe7\xa8\x84\x83\x2d\xc1\xd8\x9b\x38\xb1\x1d\x1c\x4e\xf2\xba\x7c\x74\xd8\x20\x85\x3c\x63\x63\xf8\x6e\x5e\xca\x67\xb5\x87\x92\x3c\x80\xa1\xab\x7e\xb5\x1c\xda\x7e\xf5\xa2\x17\x1a\xcc\x17\xa2\x0b\x8d\x4a\x1d\x9b\x21\x8f\x7b\xa1\x18\xc4\x34\x64\x65\x57\xd9\xda\x50\x2d\xc2\xec\xb5\x79\xaa\x16\x0f\x14\x25\xec\xe8\x2a\xb0\x42\x5a\xb8\x42\xb1\xea\x42\x03\xa5\x7e\xcb\xa8\x76\x5c\x52\x2b\x79\xe7\xb6\x36\xb3\x5c\xa5\xcc\x6c\x6a\xb0\x1d\x7b\xa7\x4f\x17\x77\x66\xeb\xff\xc4\xb0\x63\xb4\x1a\xc6\xe7\xb0\x15\xeb\x39\xb5\x8d\x3f\x7b\x88\xa1\xa6\x12\x92\x23\x02\xa6\x2f\xe2\xf1\xba\xc7\x03\xa5\x81\x7f\x69\xe0\xa1\xac\xfa\x38\x0d\xba\x07\x8c\xf8\x0d\x6c\x08\xdb\x21\xf0\x05\x63\x25\x5b\x0b\x9d\x70\xa7\xc7\x35\xe9\x58\xeb\x92\x94\x2b\x01\x9c\xa9\x70\x78\x6b\xaf\xbd\x4b\xfa\x60\xd2\x7a\x0d\xd2\x15\xca\xb9\x69\xc9\x58\x7d\xfc\xbe\x13\x08\xbf\x41\x17\xe3\x44\x75\x98\xff\x1c\x41\xe5\xc0\x2f\xd2\xc9\x16\x0d\x18\x3b\xd4\xb9\xd0\xd0\xe5\x61\x2f\x45\xa7\xc8\x96\x71\x5a\xc3\x19\x5a\xe4\x2f\x71\x07\x2f\xac\x9a\xd5\xdf\xd4\xce\x65\x6e\x3a\xb7\x6e\x82\xdf\xec\xa5\x03\x73\xd4\xf3\x0d\x39\xd6\x61\x04\x11\xa9\x52\xcc\xbd\xa8\xd8\x89\xaf\x73\x0d\x99\x8c\x9f\xf1\x95\x94\xc1\xd9\xf7\xe5\xe1\xa7\xa1\x2f\xfd\x48\x4c\xf1\x50\x5f\xbf\x8d\xa5\x22\x3d\x48\x86\xbe\x08\x26\xd1\x58\xd6\xac\x95\x70\x47\x5f\xc9\x31\xc2\x17\x79\x23\x43\x8e\xe8\x92\x5f\x75\x0d\xcc\xe9\xc4\xee\xa8\x26\x06\x59\xff\x00\xcd\x26\x7f\xe4\x90\x08\x05\xae\xc3\x52\x7a\xe2\x9e\x17\x95\xe1\xe1\x48\x83\x2e\x7a\xce\x0c\x62\x15\x36\xf5\x0a\xf5\x00\xbf\xc8\x96\xee\x9d\xc2\x5a\x0b\x8f\x24\xfe\x81\xe5\xd6\x5a\x12\xaf\x95\xe9\x81\xa9\xc4\x67\xe2\x13\x4a\x53\x68\xb1\xfa\x3d\x13\xcf\xd2\xda\xe2\x3b\x89\x04\x1b\xd2\x5d\x3e\xb3\xca\x3d\xc8\x5d\x98\xc3\x63\x04\x5e\x25\xa4\x5a\xdb\xbc\x99\x64\x7c\x3f\x9e\xac\x19\x23\x12\x18\x21\x0c\xfc\xfe\xb8\x1d\x89\x1a\x6f\xd3\x5a\xf1\x6c\xfc\xff\x49\xb0\x4b\x74\xdb\x11\x00\x06\xc0\x0b\xaa\x28\x93\x2c\xf7\x94\x99\x5c\x99\x99\xbb\xfa\xf9\xee\x3c\x95\xc8\x88\x5f\x65\x32\x5c\x6f\x7e\x24\xa4\x32\xda\x78\xb5\x9c\x3d\x66\xad\x6d\x27\xf5\x1b\xd8\xbc\x77\x79\xc2\xeb\x22\x65\xb9\x19\xf1\x50\xe8\x4e\x05\x25\xa5\xb3\xc0\x63\xf0\x67\xd5\x28\xa0\x89\x88\xbf\x58\xe3\x60\xe6\x32\x37\xf5\x0c\x8b\x5d\x1a\xc8\x9f\x6c\xe0\xbc\xa9\xec\xad\x53\xdb\x93\x06\x4f\x59\xb0\xf8\xd4\xcd\x59\x4f\x90\x68\x74\xfa\xc8\xa9\xbf\x39\x45\xd1\xaf\xa7\xfa\xf5\x0b\x13\x1d\x3e\x98\xb9\xf2\x6e\x9b\x50\xe9\x8d\xbd\xa4\xc1\xec\x38\x73\x50\x32\x77\x76\x9d\x99\xd5\x62\xf3\x0c\x0b\x06\x22\x2e\x6b\xdf\xc2\xc4\xe1\x06\xf1\x8c\x37\xe0\x2b\xdf\xb1\x1d\xcd\x47\x94\xf2\x97\x51\xdd\xae\x5f\x36\xe9\x26\x4d\xa0\x77\xc4\x25\x36\x89\x69\xa1\x0d\x99\xc1\xfd\x2c\x6d\x71\x6c\x37\x82\x23\xcc\xe3\x90\x66\x01\xba\x7b\x75\x68\x2f\xbd\xc2\x8d\xb6\x7a\x51\x4b\x58\x1c\x61\x6e\xba\xf4\x9a\xe3\xb7\xd1\xb1\xb2\x7a\xac\x87\x63\x26\x49\x55\x8d\xfb\x25\x5e\xb9\x1f\xc0\x49\x90\x08\x00\x70\xe7\x70\xf1\xa1\x63\xfa\x59\xbb\x4a\x9f\x67\xea\xcb\x03\x88\x2a\x7b\x63\x5b\x4f\x31\x87\xa2\x9b\xab\x9e\x60\x66\x9f\xa8\x55\x54\xbf\x5a\x57\xce\x22\x3b\x0b\x76\x58\xa4\x96\x82\xa1\x80\x0e\x17\x3a\x28\xb2\x58\x15\xcb\x0b\x15\xa0\x8a\xa5\x2d\x73\xd7\xe4\x51\x84\xfc\xc4\x7b\x71\x12\xc5\x31\x9f\x14\xcb\x89\xd5\x7a\xce\x19\x0a\xe4\x02\x70\x85\xaa\x62\x12\x3e\x61\xd5\xf5\xc8\x4c\x44\x13\x1c\x9b\x02\x55\xac\x94\xaa\x66\x0a\x9e\x5c\x3c\xf4\xd7\x2c\x62\x9f\x19\xf1\xe2\xc8\xd6\x06\x1f\x98\xde\xfb\xb8\xaa\x27\x62\xfe\xdc\x11\x6d\xfc\x4a\x32\x5e\x02\x94\x30\x0a\x44\xae\x8e\x19\x4e\xf2\x60\x70\x5f\x19\x89\xec\x20\xf2\xc2\x6c\xff\xa1\xd6\x40\xfd\x88\x9e\x59\xb9\x61\xed\x7f\x43\x82\x99\xa3\x0d\x8c\x38\x92\x52\x9a\xe4\x9f\xdc\x23\xa2\x9a\xd1\xc3\x50\x04\xc9\xde\xdd\xc8\xa5\x0a\x9a\xba\x0b\x83\xc0\x95\xe7\x8d\x97\xcf\xfb\xec\x46\x61\x17\x71\x79\x2f\x67\x0e\xb5\x11\x2a\x34\x9c\xb8\x29\xab\x7d\x32\x91\xd9\xb3\x27\xc4\xaf\x70\xbd\x6a\x96\x66\xb5\x74\x39\x0c\x03\x07\xb2\xd6\x66\x2a\x20\x1c\xef\xa4\x40\x5d\xfe\x44\x90\x2d\xce\x0c\x93\x14\x48\xba\xd6\x6d\xe6\x75\xdb\xc5\x09\x84\x63\x7f\xfb\x8a\x1e\x8a\xb9\x0c\xb8\x5d\xfd\x9c\x85\xab\x58\x11\xf6\xd5\x8f\x99\x6a\xe5\x96\xbc\x7b\x1f\xd7\xa4\x5c\x63\x73\x96\xca\x70\x0c\x74\x36\x94\x04\xb3\x86\xa3\x51\x17\x9b\x8e\x9f\x0d\xf8\x88\xcd\xb3\x78\xa6\x59\x74\x59\x6f\x86\xab\xa0\x5b\x26\x1d\xf0\x79\x25\xd2\x19\xaa\xa7\x05\x18\x1f\x07\x68\x8a\xfa\xf4\xca\x63\xaa\x0b\x89\xdb\xb3\xc1\xba\xc8\x32\x05\x63\x10\xe4\x75\xd9\x7e\xbc\xef\x16\x1f\x6c\xd6\x58\x3a\x7e\xd6\x85\x9c\x5d\x2e\x3d\xce\xb8\x01\x8c\x54\xf6\xd8\x82\xaa\x33\x48\xbf\xea\x44\xc2\x05\x2f\x91\x90\xd0\x43\x24\x0c\xf4\x10\x01\x1d\x3d\x02\x40\x8f\x16\x0b\xa0\xa2\xb9\x2a\x3d\x2c\xd2\x4a\x46\x06\x6a\x27\xb2\x3d\x4a\xff\x49\x11\xc3\x83\xed\x62\x5e\x0e\xd3\xc7\x28\x15\xbf\x88\x99\xe5\xee\xab\xbc\x96\x91\x17\x7b\xfe\x91\x2c\x76\x59\x45\xe4\x81\xc1\x8f\x44\xdb\xfd\xf6\xde\x76\xa7\xbc\xd7\xf2\x32\x44\x2d\x0c\x80\x53\x59\xcf\xaa\xdf\xda\xff\x30\xee\x78\xde\x82\x04\x2e\xda\xef\xbc\x0b\xea\x6b\x88\xa4\x8d\x9f\x61\x82\x37\x35\x23\x58\xb5\x0b\xfa\x29\xc9\x2c\xaf\x35\x0e\xca\x5c\x85\x55\x91\x6e\x4c\x41\x60\x99\x0b\xfa\x85\x44\x2c\xaf\xd1\x01\xf1\xec\x02\x8a\x6b\x3f\xd6\x00\xbc\x97\xf1\xc8\xb5\x2d\xae\xfe\x5d\x29\xa4\x0a\x8e\x74\x40\x5b\x5a\xf1\xe8\xe2\x2c\x0a\xba\xc3\x25\xc4\xff\xce\xf6\xff\x1f\x9e\x65\x18\x19\x04\x6f\xc6\x2a\x8d\x15\xae\xec\x01\x4b\xc4\x30\x21\xf8\x69\x0a\x8e\xf0\xd0\xd2\xc9\x9f\x56\xf7\x85\x13\x62\xe8\x8f\xc5\x5d\xcb\x77\x21\x85\x63\x20\x22\x67\x22\x4b\xac\xbf\xdc\x68\x59\x56\x71\x21\x7e\x81\x68\xb3\x4c\xc6\xf6\x81\x33\xc9\x42\xf6\xf8\x82\xcd\xc2\x7d\xca\x8a\xab\x9f\x38\x8f\xc4\x26\x18\xad\xb5\xba\x69\xce\xe4\x3c\xa2\xa2\x24\x67\xd5\x24\x41\x09\xa4\xf0\xd5\x65\x01\x55\x1e\xa2\xe1\x67\x78\x5d\x45\x13\x9c\x17\x98\x24\xfd\x81\x69\x55\x7d\x20\x58\x61\xaa\x9e\x4a\x02\xdd\x7a\xd4\x59\x2a\x1c\xa3\xe9\xad\xe2\x2e\x4c\x05\xa7\x8c\x9f\xf6\x42\x91\x32\x6d\x90\x88\x37\x3d\x95\xc8\x41\xa4\x49\x9f\x79\x8d\x1d\x06\xdb\xbe\x37\x71\x62\x30\x76\x12\xa3\x41\xba\xd1\xfe\x66\x2e\x86\x79\x7d\x66\x42\xad\xa5\xab\x26\x32\x2d\x9a\x52\x47\x2d\x36\x30\x7f\xe0\x22\xa1\xad\xeb\x77\xa4\xa6\xab\x0f\x6b\x2e\x13\x27\xe3\x15\xc0\x4f\x15\x85\x02\x44\xc9\xa2\x0b\x21\x4f\x6d\xfd\x00\x15\x4c\x5f\x1e\x24\x9b\xd3\x33\x4d\x57\xdd\xea\x34\xf9\x58\x17\xc3\xdc\x34\xd6\x3d\x37\x6e\x7c\xfc\x7d\xeb\x0b\x03\x17\x94\x66\x01\x17\xcc\x6e\xe8\x4d\xe2\x69\x77\xcd\x12\x7b\x0b\x32\x66\x98\xec\x41\x82\x42\x71\x66\x64\x22\x17\x30\x0c\x07\xa1\x15\xc9\x51\xb0\x9d\xed\x6a\x00\xab\x58\xdd\xb5\x63\x68\x1b\x60\x5e\x73\x68\xe6\x60\x28\xee\x1f\x26\xe8\xc9\xcc\xb8\xa2\x3f\x0a\xa1\xc0\x09\x7b\xaa\x31\xcd\x19\x07\x6e\x07\x05\x35\xd4\xf8\xe2\xd6\x07\x09\x04\xd3\xa3\x57\x1f\x54\xe0\x76\x3e\xa2\x38\xfa\xb9\x40\xd6\x34\x7d\x83\x07\xad\xb9\xd1\x50\x3b\x35\x27\x9c\x3c\x29\x05\x65\x11\xf7\xa9\xde\x88\xec\x52\xe7\x2a\x04\x4b\xe5\xa0\x28\x16\x4d\x37\x5f\x66\xfc\xaf\xc1\xee\x9f\x68\x4f\x37\xe8\x06\xc2\x73\xa3\xcc\xf1\x1c\x4d\xc4\x00\xab\xa3\x9b\x09\x13\x9f\xe6\x4f\x85\x19\x5d\x10\x31\x24\xb6\x8d\x66\x57\xf6\x38\x90\xd8\xdf\x6f\x23\xd8\xcc\x74\x08\x2b\x0a\x37\x26\xf6\xe2\x56\xea\x38\x31\x08\x07\xa5\x60\x55\x88\x5e\xdc\x4c\xc8\x9e\xad\xc8\x72\x10\x50\xf0\x28\x88\xbd\xdf\x02\x40\x09\x3d\x46\x40\xdf\x03\xd0\xaa\x92\xc2\xd9\x6b\xa0\x94\xed\xee\x75\x28\xaf\x4a\xfe\x4e\xc0\xf0\x04\xfb\x3c\x1e\xc0\x8a\x42\x09\x64\x3a\x82\x16\x71\x22\xdf\x2d\xd4\x28\x11\xeb\x7a\x9c\xb2\xfc\x3e\x8c\x03\x91\xb0\xfa\x3e\x4c\xfd\x4b\x07\xe3\x12\xc8\x9a\x45\xa8\xcf\x4a\x9b\xf5\xe7\x96\x53\x67\x6b\xd0\xb3\xb5\x32\x70\x2b\x8d\xc4\xbf\x92\x18\xae\xd6\xc4\xcd\xcc\x84\x70\xcf\x2a\xa9\xc8\x79\xd8\x8f\x40\xcd\x0e\xf2\xd7\x2d\xb0\xd9\x9d\x8d\xdc\xfb\x21\x06\xdb\x34\xe1\x77\x79\x96\x7b\xdd\x04\x6f\x41\xa4\x2b\x0a\xb1\x47\x94\x93\x30\xe6\x4a\xee\xc1\xa2\x38\x0d\x0f\xd5\xc8\x7f\x3c\x34\x65\xe3\xbe\x0e\xa8\x5c\x76\x3f\xb2\x83\x5f\x45\x1b\xaf\xa2\xdc\xd4\xa7\xc8\x00\xca\x31\x22\x37\x29\x64\x01\x0d\x8c\x8b\x22\xa0\x44\xc5\x30\x35\x4c\x88\xf6\x4a\x86\x06\xb9\x41\x75\x41\xcb\x21\x79\x16\xb1\xdb\x89\x2f\x3b\x64\x93\x40\x41\x42\x19\xb3\xfb\xc4\x52\xe2\x3e\x25\x71\xa3\x20\x14\x4e\x0a\x34\xe4\x69\x65\x7f\xf8\xf6\xd5\xb6\xeb\x35\x36\x9c\x9b\xe2\xc8\x3b\x6a\x73\xde\x52\xc8\x02\x55\x6b\x48\xa9\xf4\xc5\xbd\x84\x52\xd2\x1f\x15\x13\x5a\x80\x8b\xe6\x6a\xa3\x84\xe5\xc8\xbd\x9f\xf2\x43\xdd\x8e\x27\x4c\x31\xe5\xcb\xec\xa3\xef\xb7\x1c\x9b\x34\xb0\x62\xd0\x1a\xf3\x18\xf3\x52\xec\x75\xcd\xf9\x87\x63\x46\x9f\x58\xfb\x68\xa9\xce\x0a\x6e\xe5\x4b\xed\x37\x8c\x70\x66\x73\x09\x67\x5f\x4e\x4f\xf6\x26\xc6\x41\x12\xf1\x75\xc0\xed\x5a\x91\xa5\xb0\x58\x07\x5b\xb8\xce\x7c\xd7\xaf\xb2\x13\x0e\x4f\x94\x66\x87\x5d\x87\xfe\x53\xaf\xa2\x02\xc3\xc6\x4c\x3a\x09\xf3\xbb\x09\xb7\x13\xaa\xe5\x13\xaa\x39\x51\x2f\x08\x9c\x0a\xad\x75\x53\xc3\x22\xbd\xe5\x01\x69\x62\x74\xc6\x63\x75\x42\xe6\x05\x12\xc2\xc2\xae\xec\xec\x29\xdd\x5b\x1c\xfe\xe7\x77\x6d\xc1\x97\x26\xfd\xd3\xbc\xaf\xdf\x88\xad\xa3\x25\xa1\xed\xac\x1c\xee\x84\xaa\x3b\x9f\x39\x55\x46\xed\x69\xa3\x99\x3a\xbc\x54\x01\xc9\x5f\x27\x9d\xe8\xde\xf2\x01\xe4\x5e\xd7\xaa\x00\x8a\x03\xd4\x58\x4d\x6c\xd7\x82\x51\x84\x94\x72\x65\x7b\xb0\x46\x5e\xe1\x68\x6e\x6b\x04\x73\xa9\x75\x69\xa4\xb2\xe9\x89\x3b\x25\xad\xc4\xaa\x5a\xa5\x3f\xfe\x1a\xe7\x27\x12\x3a\xcb\x2b\x5c\xea\xec\x17\x53\x9e\xf8\x3e\x2c\xb5\xf9\x8b\x93\x59\xe5\x24\x76\x01\xae\x39\xed\x1b\x3c\xbd\x50\xc7\x55\x80\xa9\x6c\x57\x08\xcb\x38\x73\x03\x2c\x6d\x9d\x97\x2d\xc0\xd2\x4b\xd6\xd1\xa5\x80\x08\x28\x46\x67\xe4\x78\xa8\x29\x8b\xa1\xda\x30\x87\x7e\x65\xae\xbd\xa4\x21\x18\x55\xb4\x62\x55\x29\x43\x5b\x27\xdd\x4b\x1c\xeb\x13\x68\x58\x2c\x22\xd3\x91\x8c\x29\xf1\x00\x7d\x18\x72\xe4\x30\x7c\x12\xcd\xf5\xc8\x90\x1e\x73\x99\x11\xa0\xd9\xa6\x78\xb2\x8e\xcb\xae\x28\xa3\x42\x9a\x66\xbc\xfb\x7e\x85\x2f\xf9\x46\x77\xa9\x6c\x53\x9e\xfb\xd0\xc9\xfd\x75\x50\xc4\x2e\xc8\xb0\xa7\xfc\x9d\xbb\x29\x41\xc3\xd1\x87\xe4\xe3\xf8\xa9\xbf\x9f\xbd\x4c\x84\x3e\xbd\xb1\xf5\xeb\xcc\x37\xf9\xb5\x8b\x88\x58\x59\xeb\x87\x25\x73\xeb\xce\x51\x46\x7d\x03\xac\xe5\x11\x6d\x55\x96\x92\x91\x40\xc9\xd4\xdf\x54\x60\xa2\x4f\xd2\xfa\x3d\xb3\x4c\xa0\x9b\x4e\xb6\x96\xf5\xdb\xd5\xde\x24\x14\xa6\x45\x4c\xd8\x13\x9e\x1e\x8d\xf9\x9a\xe2\xda\x87\x29\xaf\x4b\x56\xe1\x3c\xdc\x22\x5c\x21\x25\xc4\x01\x0b\x6a\x25\x23\xba\x73\x0c\x0b\x8d\x56\x58\x34\xbc\xb4\x48\x11\xf1\x98\x11\x75\x84\xc5\x54\x3f\x1d\x41\xc0\x3f\xd0\xf0\xce\x31\x76\x90\x95\xe6\xf9\xb5\x1c\xa7\xad\x23\x61\x5c\xf8\xbc\xe9\xa8\xca\x22\x3f\x2d\x7a\xe3\x10\x35\xba\x39\xf9\xe5\xad\x19\x33\x67\x33\xb1\x52\xf3\x93\xfd\x40\x44\x1b\xf8\x1c\x1a\xc1\xd5\xb9\xa7\x59\xf5\x83\x6d\x0f\x62\x63\x43\x17\x4f\x99\x52\x84\x53\x41\xf8\x31\xe5\xc8\x5b\xe4\x4e\x22\xe1\xcf\xb2\xc2\xb7\x70\xdd\xd9\x4d\x96\xe5\x72\xcd\x46\x06\x68\xf0\xe2\x40\xbe\xaa\x69\x3b\xce\xf9\x4b\xae\xfa\x7a\x44\x39\x10\x9f\x2e\x54\xf4\x19\xee\x61\x0c\x4b\x8c\x48\xa3\xe0\x78\xf6\x48\xea\x6a\xb8\x0e\x65\xbf\x0f\xb9\xc4\xc7\xa4\xa1\xd1\x71\xf3\x85\xec\xec\x90\x75\xf3\x42\x1b\x4a\x73\x54\xe2\xef\x10\x42\xce\x1b\x32\x9e\x30\x35\x76\xbf\xed\x0e\x38\x26\x49\xc1\x99\x0e\x65\xd6\x54\xe5\x73\x92\xba\xc6\xa5\x90\x61\x19\xd2\x0d\xd3\x55\x35\x99\x3a\x9b\x79\x76\xd8\x9d\x7a\x49\x6a\x81\x8e\x3d\xd5\x57\x26\x72\x62\xc8\x4e\x57\xc5\x43\xac\x05\x7b\x3f\xa4\x0d\x0e\x57\xba\x88\xb9\xcb\x0f\xaf\xa0\xed\xf5\x6a\xdb\xd9\x30\xa9\xe6\xc3\xe9\xb1\x84\x6d\xfb\xb2\xfe\x98\xb7\xa5\x92\x94\x6b\x99\xe0\x32\x64\xc3\xdb\x6b\x3c\xcf\x87\x53\x82\xa4\x17\xf2\x58\x64\x90\x94\xc6\x53\x01\x45\x94\x6e\x65\x59\x66\x09\xb1\x45\xb1\x61\x5e\x8a\x07\x4a\x46\x60\xd3\xbd\x8c\x31\x8e\x74\xdb\x34\x80\x11\x81\x82\xe3\xdf\xb2\xde\xad\xf3\x58\xda\x05\x8e\x61\x85\x58\xd8\x49\x7f\x1f\x46\x82\xe0\xf7\x1d\x1a\xc0\xd2\xe1\x65\x1f\xb4\x08\xaf\x2c\x87\xeb\x14\xaf\xa6\x22\xd7\xe8\x21\xe7\xd7\x3f\xd4\x95\x64\x8e\xf1\xa0\x60\x3c\x91\x59\xb3\x54\xf1\x1e\xbd\x3c\xef\x1a\x44\x7b\x04\x81\x6e\x02\x13\x06\x4f\x01\x22\xd3\xdd\x01\x6d\x17\xc5\x20\xb2\xfe\x4e\x55\x17\x68\xc9\x5c\xce\x31\x8f\xfd\xf8\x97\x0c\x8e\x60\x92\x06\x39\x15\xb8\xb4\x29\x05\xd0\x7d\x17\xba\x5f\x11\x54\x2f\x38\x25\xe4\x31\xea\xc7\xb0\x35\x61\xbc\x7f\xd3\xad\xa1\x7a\x52\xdc\xf3\x42\xcd\xb0\xd2\x7c\x94\xca\xb0\xf7\x31\x84\x93\x76\x13\x5d\x60\x00\xd4\x01\x55\x57\xb7\xff\x6c\xc1\xc8\x8d\xe3\x74\x50\x5a\xbc\x80\x23\x13\xc8\x5e\xd3\xe7\xe7\x00\xbc\xd8\x64\xa1\x88\xd7\x8e\xb8\xad\xf4\x50\x6d\x22\x58\xf3\x61\x1c\xb6\x42\xae\xe3\x31\x90\x2d\xc3\xfb\x33\x3c\xbf\x78\xe0\xcd\xcc\x16\x05\x47\x35\x32\x75\x9e\x97\x56\xc4\x4d\x6d\x96\xc0\xd5\x50\xae\x41\xee\x7b\xd8\x18\x39\xb0\xfb\x14\x97\x8d\xef\x1e\x5d\x32\x03\xed\x62\xba\x72\x89\xcc\xf2\xca\x62\x9a\x27\x31\x39\xb4\x05\x89\x1a\xca\x18\xd1\x92\x06\xa6\x00\x8e\x2e\x94\xcc\x0e\xb4\xa8\x22\x0f\x78\x12\x62\x7b\xa0\xe2\x4a\x53\x94\xc6\x37\x07\x0a\x0f\x52\xb2\xf1\x1a\xcd\xea\xbc\xd0\x62\xb3\xf4\x34\x71\x57\x7c\x0e\x93\x4e\xc1\x45\x25\x5d\x8b\x3a\x3f\x1d\xcb\x59\xa0\xac\x65\x31\x22\xb0\x09\x8f\x75\xa2\x57\xda\x3e\xd4\xee\x06\xe8\x78\x84\xdc\xbd\x72\xec\x30\xb0\xbf\x4d\xf5\x53\x78\xcc\x78\x85\xd3\x77\x36\x6d\xd9\xbe\x51\x25\xaf\xf5\xe8\xb5\xe0\xee\x7a\x99\xcc\x9d\xec\xd9\xdf\xef\xc9\xa2\x22\x14\xc5\x74\xbe\x1a\x65\x98\xf2\xd0\x63\x77\x0f\xf4\x8c\x6b\xcb\x9c\x65\x4d\x13\xdf\x00\xd8\x0e\x29\xcd\x22\xfe\x74\x34\x3e\x65\xa5\x2a\xcb\x8c\xf4\x77\x67\x39\x09\xe9\xb1\x0e\xfc\x59\x23\xf3\x5a\x2f\xb9\x5a\x3f\xc7\x4b\x11\x19\x65\x13\x26\xb4\xa2\x59\xc5\xf5\x12\xea\x9f\xce\xb4\xf8\x51\xe7\x67\x9d\x09\xc7\x93\x95\xd9\xf7\xe3\xde\xa4\x1e\x7f\xc2\x1b\x73\xe7\x64\x2a\xd4\xf6\x66\x7b\xb4\x1b\x6b\x8d\x09\xd7\x4f\xaa\x55\x25\x63\xb4\xc1\x6c\xfa\xfe\xb1\x2d\xdb\x0c\xc7\xee\x72\x0e\x79\x20\xe6\xf9\x43\xaa\xaf\x89\x90\x07\xc2\x60\x63\xfd\x52\x64\xa6\x46\x00\x29\x50\x23\x2c\x27\x66\x81\xb5\xe8\xc5\x40\xb4\x23\x5d\xe9\x92\x3d\xb3\x08\x6e\x20\xd1\xd7\x2d\x3f\xfb\x70\xd0\x97\x4a\x2c\x51\xe5\xd5\x0b\x3f\xdb\x4c\x02\xd0\x3c\xaf\x84\x49\x32\x0e\xc8\x73\x38\xd0\xa4\xea\x0b\x93\x93\x33\x78\x62\xce\x47\xea\x25\xb8\xae\x92\x8e\x79\xa9\x5f\x63\x72\xc8\xc5\x70\xd2\x67\x88\x3e\x53\xf8\x44\x1f\x7e\x69\xa7\x24\xdc\x7c\x8b\x36\x6b\x21\xf1\x36\x47\x3f\xab\xd4\x05\x3c\x5d\xb3\x68\xf1\xe0\x5e\xac\xd4\x0b\xea\x99\xd1\x8a\xa2\x0b\xa3\x2c\xe5\x22\xf1\x49\x88\xf0\x54\xc2\x4f\x1a\x67\xc0\x42\xfb\x28\x7e\xc5\x30\xae\x92\x9a\xb6\xe3\xb5\x60\x0a\xc7\xbb\xa6\xeb\x4d\x67\xa5\x8b\x99\x9a\x81\xa5\x58\x78\xb1\x7f\x82\xc6\x0c\x53\x8d\x4c\x7b\x97\xef\x4c\x4e\xc1\xd3\xc1\x78\x34\xcf\x37\x35\xe1\x3a\x7d\x17\x2f\xcd\xdb\x17\xad\xff\xa3\x4c\xd0\x34\x7e\xf0\x41\xab\x5f\x02\x81\x57\xa2\x03\xb5\x10\xd1\x21\xb0\xaa\x67\x42\x7c\x5f\x2a\x54\xe8\xea\xc8\x1f\xee\x5b\xe4\x73\x5c\x69\xd3\x18\x41\x29\x47\x4f\xdc\x3a\xf8\xaa\x56\x57\x28\x9c\x26\x4b\x2e\x35\xfa\xbd\xb3\x74\x85\x3c\x69\x1b\xdb\x71\x6b\x0e\xfb\x3b\x95\xa0\x35\x75\x42\xe0\xd2\x54\x73\xb9\xa4\x89\x06\x43\xad\x7f\x14\xfc\x13\x6c\xb8\x4f\x3e\x95\x20\x34\xf3\x43\xed\xeb\x72\x6d\x9e\xeb\x59\x6c\xd7\xdf\xcc\x6c\xee\x59\x7b\x5b\xf1\xea\x37\x46\xe6\x4c\x69\xd2\x20\x67\x19\x7a\x8c\x2a\x09\xea\xc9\xad\xa8\x93\xc9\x62\xf8\x4a\x82\xc8\xb3\xfb\x83\x9c\x67\x9d\x84\xad\x5b\xfd\xdf\x49\x1a\x5f\xe7\xa1\x9e\x12\x84\x7c\x57\x76\x1e\x58\x95\x1a\x37\x01\xa4\x86\xe0\x1f\xf1\x00\x47\xcf\x0b\x80\x51\x66\x20\x0d\x23\xd9\x1a\xd3\x86\xbc\x66\x13\x28\xbb\x42\xd1\x66\x4a\xe6\xca\x75\x5d\x60\x63\x42\xf9\x78\xbf\x30\x28\xc2\x49\x45\x61\x97\xb1\x99\x4c\x36\x8c\x68\x41\x0d\xc3\xe2\x26\xa0\x8b\x17\x71\xb1\x56\x6f\x84\x6b\x61\x2c\xad\x59\xdf\x62\x28\x4d\x21\xc3\x1f\xae\x90\x71\x3d\x63\x9c\x2c\x52\x2c\x23\xa1\x84\x7e\x41\x00\x6a\x0b\x09\xb7\xfe\x88\x9f\xca\x90\x0a\x04\x31\xba\xa4\x9b\xb7\xd5\xdf\x64\x00\x3b\xb6\x02\xa7\xd3\xfa\x8c\x0d\x1d\x66\xf5\x8e\xab\x67\xbb\xfe\xea\x78\xd5\xba\xf4\x5b\x38\xbb\x4f\xcd\x77\x3e\x3e\x48\x07\xda\xc6\xee\x95\xa3\x4d\x80\x8a\x4c\xae\x3d\x3b\xc1\xed\xca\xd4\x0d\xa0\xd6\xf2\x4e\xb2\x33\xaa\xe0\xa9\x81\x95\xaf\x07\xd0\xe3\x44\x12\xef\x8a\x8e\xee\xbe\x65\x30\x97\x9f\x6b\xfb\x7a\x04\xa1\xd7\xe7\x83\x43\x6a\x25\x07\x5c\x1d\x7e\xe0\x10\x92\x05\x1e\x69\x57\x8a\x00\x45\x0b\xa8\xd6\xb1\x57\xab\x49\xcf\x19\x36\x22\x1c\xad\x84\x67\xa3\x02\x0b\x73\x9a\xaa\x32\x00\x6d\x0b\xe0\xb0\x74\xa4\xf1\x5b\xd2\xb0\xe3\xc8\xfb\x6e\x4b\x58\x20\x00\x30\xbb\x3e\x3e\xf7\xbd\xab\x92\x1e\x0c\x61\xff\x76\xef\x61\xf3\x30\xf1\x5d\xdf\x4a\x53\xed\x63\x62\x4e\x53\xe9\xe2\x92\x0e\xbc\xb9\x35\x64\xc9\x80\x5f\x0b\xc6\xce\x52\x99\x49\xfa\xdb\xda\x0c\xc0\x92\x24\xff\x32\xab\x24\x11\x3e\x8b\xa0\x07\x9a\x3e\xe4\xcb\x93\x8c\xfc\xa0\xbe\x9a\x8d\xcd\xa2\x97\xf1\xa8\xcb\x59\x9b\x6d\xae\xc4\xd6\xfc\x1d\xf5\x65\x33\x20\x7d\x2e\xd4\x16\x46\x57\xfd\x19\x1b\xfd\x39\x77\xea\x08\x1f\xc5\x95\xbd\x2d\xae\x45\x33\x60\x8f\x41\xe8\x93\x4a\xb1\xaa\xdf\xd9\xfa\xa9\xe3\xbd\x6d\x75\xef\x78\x03\x28\xfc\x76\xef\x10\x0f\x86\x7d\xd0\xb3\xe5\x44\x59\xa3\x83\xc9\xa6\x39\x51\xd5\x5e\xba\x74\xf2\x98\xcb\xdd\x34\xfa\xcd\xcb\xe5\x5a\x42\xac\x74\xf7\xe5\xbb\xcc\x9a\xce\x98\xb4\x85\x11\xb4\x46\x52\x5c\x9f\xcb\xe0\xc5\x7e\x82\x6e\x7d\x9e\x0a\x10\x50\x62\x09\x4c\x05\xb0\x01\x57\xb6\xf2\x9b\xb8\xfd\x7a\xc1\x7c\xc1\x63\x2c\x67\xa7\xc1\xa0\x0b\x98\xbc\x92\xef\x6f\x5d\xdc\x71\x82\x40\x80\xa4\xa2\xb2\x2f\xaf\x0c\x6e\xc1\x29\xc3\x47\x59\x17\x9c\xce\x5b\xe3\x7b\xb9\x95\x6e\x29\x97\xcf\x35\x37\xbf\x03\x58\x57\x07\x22\x7f\xa1\xf3\x86\xe7\x29\x94\x8a\xcd\x5b\x2e\x84\x0f\x05\xce\x0b\x33\x49\x1e\xf4\x36\x2e\x84\xf0\x41\x3a\x21\xd1\x7a\x9c\x73\xc4\x86\x91\xa9\x43\xda\x25\xec\x7e\x5d\xb5\x20\x9e\x51\x71\x73\x06\xe8\x1c\xe8\x22\x10\xdd\x0f\x61\xd1\x00\xfa\x75\x3f\x19\x27\xec\x47\xd7\x92\xaf\x26\x41\xe2\x31\x89\xae\xca\xa1\x8f\xc1\x11\xed\x40\xf3\x22\x9d\x37\x6b\xb1\x29\x4c\xd4\xbf\x72\x3d\x4f\x13\x96\x03\xa3\x08\xb0\x60\x42\x46\xdd\xd3\xd2\xd4\x03\xef\x9a\xa4\x36\x17\xf0\xa3\x90\x7c\x3c\xe2\x8d\x10\x66\xbc\x27\x68\xc6\x5e\xfc\xed\x53\xbd\xd9\x31\xf3\x37\xab\xf6\xc7\x93\x23\x7b\xe7\x0b\x1b\xa7\xa6\x5d\x30\x71\xd6\x29\xdd\xfc\xc4\x59\x82\x0b\xa1\xa2\x85\xf3\xe3\x97\x4e\xaa\x2b\x84\x1f\x51\x31\x11\xb9\x2a\x0a\x59\xb4\x0a\xb7\x12\xec\x73\xf4\xfa\x2c\xf3\x24\xda\xe9\x8d\xfc\x0c\x67\x97\x6e\x60\x49\x0b\x42\xe7\xf9\x74\x1f\x61\xbb\xaf\xa7\x9f\x81\xae\xdf\x8a\xc2\xe5\x24\x84\xb5\x7f\xd2\x8f\xb6\x26\x0c\x0f\x6c\x8b\x9a\xcb\x73\x42\x28\xd3\x25\x37\x76\xd0\xf8\x4a\x63\xab\x08\x64\xb2\xbe\xda\x30\x9a\x71\xb4\xf6\xd5\x70\xb1\x13\x5d\x8a\xf8\x9d\x87\x78\xf5\x42\x2b\xb2\x7a\x4a\xbc\x5a\xa3\xe9\xf1\x95\x6f\xf3\xe0\x8d\x1b\x4d\xca\xc1\x0a\x02\xd4\x3e\x0d\x0e\x9e\x79\x3a\x2d\xce\x0d\x29\xb6\xc1\x67\x23\xe1\x51\x7c\x61\x78\x52\x1f\x42\x94\xda\xa1\x62\x7c\x41\xbe\xd4\xe6\x80\xe8\x5b\x21\xda\x07\x10\xfb\xc4\x5b\xf1\x5e\xbc\xef\x81\xbf\xfb\x51\x95\x22\xf4\x09\x69\x5d\x6c\x23\x61\x4e\xc1\x83\x97\xd7\xa5\x69\xc1\x83\x60\x19\x2a\xb7\xef\x64\xf7\xb2\xba\x5a\xa4\xb4\xed\x56\x11\x44\x38\x00\xba\x5e\xd6\x59\x87\x52\xaf\xeb\xb8\x8e\x27\x11\x83\xa6\x66\x11\x84\xa5\x01\x1e\x70\x5f\xdb\x3b\x6b\xa5\x26\x3c\x47\x9b\x3b\x59\xfc\x98\xb0\x5e\x65\x48\x45\x04\xf7\x56\x5d\xb5\x73\x87\x76\x62\x85\x49\x3a\x1b\xa1\x60\xdd\x9c\xc8\x38\xbd\xe2\x4b\x07\xd7\x04\x59\xc8\xdf\x3e\x74\x48\x1b\x9d\x67\xb4\x9f\x9c\x63\x93\xf2\x62\x13\x26\xe9\xd3\x23\xb1\xa3\x3a\xd6\x81\x03\xc2\x5c\x2d\x17\x65\xa0\xf7\x04\xf6\xa0\xb1\xf5\x1e\x28\x31\x34\x17\x31\x00\x71\xe7\xd0\xdb\x70\x4a\xde\xca\x66\xa7\x1e\xbf\xdf\xd0\xb0\x2c\x7c\x77\x43\xc2\x1f\x86\x4b\xf5\x3f\x7d\xfb\x9d\x71\xa8\xb3\xa8\xe6\x23\xeb\x57\xb6\x87\x56\x39\x78\xb5\xe7\x47\x1a\xb7\xa7\x12\x98\x63\xc2\x64\x8b\xf3\x93\xf7\x07\x22\x16\x18\x91\x86\xc8\xda\xbf\xb6\x4e\x32\xdc\xe1\xbf\x12\x2a\x60\x68\x16\x0c\x82\x35\x72\x94\xbe\x6c\xe8\xba\x9c\x95\x00\xd9\x9b\x20\xae\xbe\x92\x6c\x0a\xed\xba\x7d\x2d\xba\x0c\xea\xec\xe2\x7e\x68\x1d\xa6\x7d\xb8\x82\x03\x62\x75\x4f\x87\xb0\xe6\x28\xa9\x41\xd1\x36\xb2\x92\xcf\x9e\xb0\x6b\xe6\xb7\x48\xfd\x41\x59\x4d\x49\x6a\x42\xd5\x92\x83\x83\xb3\x40\xa6\x46\x15\x5f\xac\x57\x29\xb5\x1a\xb9\x7f\x73\x36\x2f\xcf\x13\x23\x32\x92\x7f\x10\xa2\x42\xa6\x19\xde\x9d\x3a\xd6\xa4\x87\x86\x1e\x10\xc4\xa7\xf2\xd9\x23\x26\x36\xb5\xf0\x57\x59\x2c\x80\x97\x21\xd9\x5d\x71\x7f\xde\x9a\x83\xa5\xa7\xec\xb4\x58\xd6\xd6\x2e\xd9\x9f\xc8\xad\xe1\xf6\x25\x23\x09\xe2\x15\x26\xde\xa2\x3d\xa4\xdb\x79\xfc\x0c\x46\xb2\x58\x7c\x32\xa9\xe9\x94\x0a\xab\xe6\x87\x96\xbd\x34\xb0\xc9\x41\x5e\xcc\x22\xc8\x77\x91\xeb\xc3\xe9\x32\xff\xe1\x2f\x36\x54\xa0\x19\x89\x74\x05\x52\xe4\x73\xd0\xd6\xb7\xd3\x34\x76\xf1\x8d\x47\x91\xc7\x87\xdf\xa9\xbc\x61\xc4\xef\x99\x62\x64\x97\x98\x5f\x04\xdd\x53\x3d\x88\xfa\x23\x8a\xfb\x20\x92\xce\xa6\x33\xe7\x1a\xd8\x59\xec\xbf\x04\x4d\x0a\x37\x74\xd4\xe8\xd1\x16\xfb\xf2\x7e\xe5\x82\x58\x18\x75\x0e\x16\x95\x57\x7d\xef\x51\xec\xa7\xe1\x43\x1e\x5c\x1a\xae\x7d\x2d\xd2\xf0\xe0\x9d\xf8\xfd\xdd\x2f\x60\x60\x2c\x4f\xb4\x04\x01\x4f\x50\x3a\xc7\xf0\x64\x32\x29\x5a\x91\x6e\x11\x30\xa0\x4d\x94\x11\xd0\xaa\x41\x51\x81\x2d\x28\x01\x92\x71\x06\x50\xaa\x12\x28\xb5\x7e\x32\x8d\xb0\x70\x86\xb8\x8c\x96\xb4\xc3\x2d\x2b\x44\x34\x04\x2c\x4a\xde\x09\x8a\xd4\x80\x26\xf2\xa6\x13\x79\x44\xd1\x79\x48\xe0\x81\x40\xa5\xdb\x83\x60\x67\xe4\xe2\x75\x6a\x58\x1a\x59\x32\xbf\x41\x63\x1a\x3a\x16\x46\x19\x40\x4f\x41\x74\x21\x18\xe4\xef\xda\xa9\x0f\x30\x36\x3c\x01\xe4\x10\xec\x42\xba\x4d\x09\xe6\x0a\xa8\x17\xd9\x29\xf9\xae\x2f\x20\x26\x25\x9f\xe4\xc7\x98\xdd\xf5\x96\xe0\x3b\x7f\x8b\x5c\xc0\xe0\xc5\xcd\x4e\x06\xbc\x3d\xc5\x8d\x70\x29\x05\xcd\x4f\xf7\x2b\xf6\xec\xd5\x37\x42\xde\x1b\xd5\x72\x0f\x6a\xc0\x09\x2f\xda\x6b\x18\x9f\x57\xaa\x48\x2a\x45\x93\xc4\xc0\x05\xd8\xa9\xf2\x6e\x43\x88\xa3\x80\x18\x37\x9b\x0f\xb9\x6a\xeb\x24\xec\x03\xeb\xdf\x1a\xa7\x39\x35\x8f\xcd\xb8\x27\x42\xcf\xc4\xd3\xef\x3b\xd8\xbc\x69\x3f\x64\xae\xcb\x04\xf7\x1f\x7c\xb4\xb3\x69\xdf\xcb\x93\xae\xc1\xa4\x28\x72\x84\x7f\x5f\x54\x43\xcb\x44\x9f\x37\x8a\x38\xd3\x3c\x3b\x44\x97\x22\x41\x05\xb9\x76\x2c\x21\xcc\x85\xcf\x14\x38\x18\x23\x95\x8f\xfa\x33\x6e\xf6\xdf\xce\xb4\xd9\x2d\xa9\x51\x91\x9c\x3a\xa1\x87\x93\xe8\xda\x16\x52\x23\xd7\x3c\xc1\x93\x54\x65\xc5\x0f\xc4\xc8\x0d\x05\x87\xca\x41\x38\x02\xda\xab\xa7\xbd\x1c\x98\xf0\xb2\xbc\xb4\x9e\x01\x6d\xa9\x5f\x7c\x71\xd1\xf7\xea\xc7\xe1\xc8\xc9\x22\x0d\x57\x2b\x61\x80\x83\x43\x61\x9a\xc2\xa1\x79\xf6\x35\x24\x4c\xae\xdb\x3c\xee\x4d\xcd\x2d\x64\x7c\x69\x59\xc4\x65\xc9\xd4\xbf\x1f\x9f\x5f\x79\x72\xe0\x66\xfa\xa9\x17\xff\xd5\xa2\xd5\x1e\xca\xd1\xb2\x48\x19\x55\xe0\x94\x26\xd5\x2e\xe5\xe7\xc5\x57\xcc\xa5\x80\xde\x44\xab\xd9\x36\x58\x54\xc7\x75\x18\xb6\xea\xce\xeb\xf4\x2e\x06\x20\xd1\x8f\x8a\x97\xd3\x99\xc0\x52\x46\xb5\x96\xd6\x12\xa0\x0d\x2f\x41\xd0\x53\xdc\xba\x69\x3b\x0d\xae\xc4\x01\x2a\x10\x04\x6f\xbc\x1a\x98\xba\x9c\xa9\x93\xa5\x5d\x12\x99\x00\xf0\xb0\x68\x54\x5d\x7e\xd8\x9e\x95\xda\x02\x81\x94\x24\xce\xe5\x2e\xb1\x2b\x56\x60\x9d\xa7\x15\x8c\x34\xc0\x80\x79\x1b\x9d\xf5\x93\x2d\x56\x8a\x9d\x8c\x59\x6a\x75\x9c\xe3\x81\x62\xd8\x37\x0c\xc5\xae\xde\x59\x1f\xe3\x70\x34\xf4\x95\xd0\x64\x37\x80\x36\xb3\xa9\xa3\xb9\xbd\x45\x92\x4d\x44\x5b\x21\xa6\x41\xcf\xde\xa9\x2b\x9e\x0e\x04\xd5\xc0\x7d\x36\x0b\xe0\x1d\xf7\x71\x3f\xae\x5b\xea\x6e\x04\x3a\x6e\xfa\x97\x11\xcb\x83\xa9\x0c\x52\x71\x09\xcb\xd0\x8d\xa0\xc2\xac\xec\xac\x6c\x73\x6b\xb7\x35\xc3\xa2\xc8\x24\xb0\x99\xd0\x75\xb2\xd6\x80\xb8\x56\xac\xa8\x33\xc5\x53\xbf\xea\xa8\x97\x0e\x64\x9a\xf0\x89\xcc\x4c\x40\x5d\xa7\x5d\x91\x0d\xac\xc9\x4b\x00\xe0\x2a\x27\x9f\x43\x64\xc5\x45\x3a\x00\xc7\x07\xe8\x42\x10\x7c\x0e\x44\x57\xa1\x94\x4e\x0a\xd6\x5f\x84\x3d\x9a\x44\x46\xe0\xb4\xfd\x73\x57\x6b\x81\xd4\x98\x03\x1a\xdd\xae\x8d\xb6\xed\x4f\xac\xd3\x9c\x34\x4c\x3d\x45\x63\x70\x73\x3f\x82\x75\x01\x55\xe9\x3b\xec\x8a\xdd\x40\xef\xed\xb8\xd1\xcb\x57\xec\xb7\xe7\x96\xb7\xdc\x20\x58\x54\xa8\xc6\x9b\xbe\x5b\x21\x96\x3e\x79\x4d\x08\x61\x38\x08\x72\x19\xfa\x71\xfb\x15\xef\x6d\x67\x88\x50\x6a\x21\xa0\xcb\x1e\xb8\xb8\xdd\x2c\x24\x0a\xa7\x02\x06\x32\x17\xa4\x4d\x6b\x27\x71\xe0\xad\xab\x34\x87\xbc\xe0\xd1\xa2\x4f\x63\x1a\xef\x95\x76\x66\xbb\x65\x48\xa4\x43\x87\xa3\x6b\xa8\x11\x4f\x86\x3a\x6d\x5c\x3d\x77\x4e\xe5\x41\x95\x5a\xd1\x02\xcf\xdd\x8b\xa1\x6c\x31\xd0\xf3\x6e\x5e\xfe\x58\xa4\x9b\xd2\xdf\xd3\x5e\xe7\xc4\xaf\x86\x9f\x85\x80\x9b\x43\x85\x87\xea\x9d\x1d\x39\x45\xcc\x41\xcf\xa9\xa1\xf0\xcb\x16\x29\xce\x65\x84\xc1\x76\x27\x3e\x76\x62\xa0\xb7\xbc\x55\xb9\xa9\x94\x33\x8a\xa9\x9e\x93\xb2\xd7\xa8\xad\x6b\x81\xaa\x53\xf7\xb0\x0b\x9a\xe0\xeb\x7d\xf9\x94\xcc\x67\x0a\xc0\xce\xf9\x77\x90\x33\x8f\xc6\x57\xd2\xab\x66\xd2\x9a\x7b\xb4\x2c\xde\xe9\xdc\x2c\xfb\xaa\xc0\x1a\x71\xed\xb5\x7f\xed\xf1\x71\xd7\x71\x7e\x2f\x28\xe3\xf8\x99\xe2\x80\xbe\xcd\x59\x61\x8d\xbb\x77\x8c\x54\x75\x0e\xd0\x03\xc9\xe3\xce\x40\xb7\x5c\xa8\x01\x05\x96\x7a\x9e\x0d\x9d\xf4\xe3\x89\xb2\x89\xc3\x33\xd5\xea\xd5\xf5\x1b\xd7\x8d\x0c\x89\x5b\x73\x68\xe8\x66\x56\x84\xf9\x37\xab\x7a\x12\x07\x85\x8b\x74\x40\x5b\x92\xac\x0d\x44\xe4\x40\xb3\x80\x5a\xbd\x6c\xd1\xe2\x4a\xa6\x23\xf4\x41\x49\xf8\x5b\xe5\xa6\x53\xb8\xe1\x1c\x0a\xf9\x47\xe3\x82\xd5\x1d\xc6\x45\x57\xe5\xaa\x9e\x00\x01\x8d\x23\x74\x7a\xef\xb8\xb0\xac\xeb\xab\xdf\x88\x4e\xaa\x73\xd6\x02\x51\xa5\xbc\xfd\xdb\x53\x5c\xc3\x60\x94\xf8\x0d\x1a\xa9\x2c\x78\x4d\x31\xe8\x30\x43\x82\x1c\x35\xbf\xa4\x5b\x63\x44\x32\x53\x34\xc9\xf8\x78\x7b\xdc\x4b\x17\xb6\x19\xda\x0d\xf2\x51\x48\xfe\xee\x56\x9a\x26\xbd\x79\x77\xa5\x2b\xaa\x00\x54\x24\x40\x2e\xa7\x8d\x22\x1e\x2c\x82\x49\x00\xd9\x93\x49\xfe\x07\xbc\x04\x73\x75\x94\x54\x95\x87\x53\xa6\x89\xef\xa0\xfd\xa5\xd0\x4d\x9f\xd1\x9f\xf4\x8d\x64\x6f\x8d\xb2\xb6\xae\x4e\x15\x55\x20\x8a\x7e\x73\x07\x96\xf1\xac\xed\x5c\x35\x2c\xa4\x6c\x15\x6a\x4b\x2b\x00\xb4\xbd\xd9\x9c\x92\x65\x4b\xbc\x3d\x40\xbd\xd2\x31\xc9\x40\xc5\x21\x53\xb2\x49\x9f\x94\x96\xe4\x58\x53\xca\x75\x9f\x80\x87\xf6\x92\xba\x88\x16\x56\x23\x17\x68\xf4\xf2\x0f\xdb\xdd\xf4\xb1\x22\x1a\xb0\x56\x32\xf7\x40\x9c\x3c\x2e\xe8\x5a\x14\x26\xb4\x18\x18\xdc\x93\xc9\xba\x74\x09\x28\x49\x26\x6c\xf6\x5b\x10\x49\x10\xac\x66\x11\xd4\x72\xf2\x61\x77\x71\x97\x2a\x78\x00\x74\x51\x1e\x49\x41\x65\xb6\xae\x89\xac\x4e\xad\x84\x3b\x9d\x37\x07\xe1\xea\x82\x07\x22\x39\xc7\xcc\xdb\xa3\xc4\x88\xfe\x09\x72\x75\x81\xa4\x72\x69\x41\xed\x55\x16\x04\x60\x1e\xa0\x58\x18\x87\xbf\x88\x7c\xe4\x05\x91\x9f\x98\xad\xae\x1f\xc7\x49\xba\xa7\x9a\xc3\x02\xf8\xf3\x03\xe8\x04\x2c\x15\x16\x72\xc1\x0d\x54\x81\x07\xe6\x03\xe6\xf4\xf5\x1f\x7b\x6c\x13\x4c\x83\x94\xb2\x20\xdf\x21\x63\x03\x92\xa1\x80\xc1\x3c\xd1\x53\x6d\xf1\xcf\xc3\xb5\xf3\x61\xd8\x3a\x76\xf4\xcd\x83\x28\x43\xff\xd0\x23\x3e\xfa\x5d\x39\x29\x66\x44\x8b\x4d\x85\x92\x70\x50\x96\x8a\x9e\x25\xab\x65\x2a\xa3\x44\x91\xe2\x41\xb0\x62\x6e\x28\xa4\x92\x27\x54\x2d\x37\x16\xbf\x1a\x9e\xb2\xd5\x8a\x15\x39\x03\x89\xf3\x27\xe8\xec\x53\x10\x9c\x50\x17\xdf\xed\xed\x22\xae\x5b\x0f\x76\xba\x49\x96\x6c\xa6\xc0\xe6\x76\xd8\x91\x0f\xf5\xd2\xe9\xd5\x16\xab\xfe\x08\x3a\x62\xde\x14\xda\xac\xd9\x13\xc9\x37\xce\xf4\x57\x76\x2d\xe3\xc4\xd2\x93\x85\x2a\xf9\x9e\xab\x7a\x2e\x9a\xb7\xb8\x68\x5d\xdb\x60\x2f\xe3\x66\xdd\x3e\xdf\x95\x50\xf4\xe5\x65\x52\xcd\x8d\x41\x77\x1d\x88\x72\xee\xa0\x01\x3a\x97\xde\xa5\xea\x7c\xaa\x72\xdc\x97\xea\xce\x6f\x97\xcd\x35\xe7\x1d\x30\x4b\xf0\x1c\x2c\xe6\x74\xb5\x49\x3b\x7d\x26\x1e\xea\x2f\x7e\x8e\xbb\x92\x34\x95\x36\x5b\xdf\x79\x49\x9f\xf3\x14\x25\x35\x21\x76\x12\xcd\x21\xb8\xf0\x04\x20\xd9\x64\xdb\xc0\xf5\xfa\x21\xde\x3a\xa9\x5e\x92\x09\x35\xc1\xb3\xed\x61\x28\x12\x7e\x77\x82\x41\x87\xc5\x50\xd8\xfa\x9c\x5d\x8a\xdf\x59\xb7\x94\xe8\xd2\x8c\xe9\x15\xbc\xe0\x18\x7b\x8d\xb0\x06\x3d\x0e\xb4\xbb\xca\x95\xb7\xf3\xcc\xfc\xad\x47\xa8\x9d\x19\xc6\x25\x2c\x04\x06\x71\x96\x77\x89\x55\x25\x57\x82\xb9\x23\x9f\xcd\xa3\x80\x34\x17\xcf\x0e\x8c\xba\xbb\x77\x60\x65\x2c\x0e\x90\xf3\x66\x7d\xed\x41\x20\x4b\xbc\xf0\xcd\x3b\x47\x08\x7d\x77\x86\xe7\x77\x50\x9c\x35\xe3\xb2\x35\xec\xf8\x13\x45\x44\xa6\x9a\x0b\xf7\x2b\x8e\xc6\x9d\x6b\x39\x34\x2e\x84\x1d\xb5\xf0\xd6\x74\x98\x0b\x6e\x0d\xc6\x19\x7f\xc7\x79\x66\x2a\xbf\x61\x64\x20\x9c\x75\x47\x47\x99\x06\x57\x3d\x9e\x57\xfc\x91\x7d\x7f\x65\x7e\x0c\xe5\xb7\x6b\x59\x7f\x12\x2e\x42\x57\x87\xf1\xa3\xf7\xac\x59\x7a\xb3\x89\xa6\x02\x9d\x25\xa1\x95\x16\xe4\xc7\x4e\xab\x5a\x52\xa6\x3c\x52\x50\x67\xdc\x98\x81\x7a\xac\x2b\x01\xf3\xbe\xf9\x8d\xfe\x3c\x96\xd7\xfa\x8b\xe5\x7c\x1d\x47\x63\x60\x2a\xe4\x08\x0e\x66\xba\x4a\x5c\x48\xd7\x4a\x0e\x79\xe3\x37\x4b\x57\x78\x42\x5d\x27\x2a\xc5\xb5\xb3\xe6\x1d\xd7\x2c\xcf\x6f\xa8\x90\xae\xfe\x85\x11\x2b\x79\xa4\x42\x02\x03\xa4\x3f\x18\x52\xb7\x5f\x51\xd1\xfb\x2f\x03\x02\xb2\x01\x42\xce\x23\x2c\x85\xbb\x92\x43\x06\x7a\x20\xe0\x45\x7f\xd8\x2f\x94\xf2\xc4\x77\xbd\x92\xaf\x8f\x12\x6d\x51\x26\xf8\xda\xd0\x67\xb0\x68\x03\x7b\xad\x8b\xd0\x41\x31\x37\xc3\x23\xdb\x11\xf2\x01\x0c\x24\x7b\xcc\x7b\x63\x41\xed\x68\x7d\x4f\x4d\x79\xe8\x07\x77\x0d\x81\xd7\xf7\xc3\xb2\x36\x9e\x7c\x3a\x1e\x4d\xda\x63\x16\xd2\xfb\xd4\x05\x39\x92\x9b\x66\x0b\x63\xb7\xb1\x1d\xa1\x7d\x7c\xc5\x1e\xfe\x73\x54\x51\xb7\xc8\x53\xd9\x8a\x6a\x69\x8a\x69\x54\x4e\x24\xbe\x8d\x73\x79\xca\xc0\x4e\x99\xdd\x42\xef\x3d\x86\x25\x38\x7a\x12\xf8\x8e\x60\xaf\xc7\xa5\x52\x0a\xad\x5f\x6d\xb7\xcc\x57\xea\x1d\x89\x77\x3f\xeb\x2c\x41\x0f\x21\x29\x27\x4a\xb6\x15\xdb\x17\x4f\xb8\x2a\x71\xef\x51\x4c\x69\x68\x24\xd5\x9d\xa0\x9d\x8e\x50\xed\xe7\x4f\x18\xce\x61\x18\x5c\xb5\xf2\xb4\x59\x1a\x82\xfc\xe5\x04\xa4\x61\x6b\x20\x98\x7f\x6d\xbd\x7a\x44\xec\xcb\x8c\x5e\xb8\x0a\x1a\x6c\x2e\x38\xe9\x54\x5a\x4f\x38\x72\xb5\xa9\x2a\x13\x77\x0d\x0e\xc5\x4e\x89\x7a\xb6\xf8\x65\x45\xc1\x57\x14\xc9\xcf\x5d\xc9\x08\x74\xa5\xe8\x4f\xa2\xcd\x40\xdc\xfa\xb5\x9d\x92\xdf\x48\x99\x86\x37\x25\x90\xc7\x8f\xa7\x85\x9e\x1e\xea\xf3\x8f\x04\x13\xc5\xef\x07\x70\x8f\x70\x84\x4d\xfa\x99\x61\xdb\xaa\x2d\x04\x24\xdd\x4e\xaa\x3f\x96\xef\xe5\xb4\x37\xe4\x60\x1d\x9a\x93\x73\xd6\x56\xff\x3e\x5e\x1d\x10\xa5\x55\xbe\x9f\x68\x53\x77\x7f\x2f\x3f\x63\x16\xd8\x56\x7d\xd7\x7a\x6d\xd6\x6d\x5d\x91\x81\x61\x9c\xf5\xd6\xd9\x58\x67\xd5\x56\x7d\x82\x32\x41\xc8\x2d\x80\xb1\x1f\x2a\xf4\xaf\xba\xee\x28\xe8\x22\xf2\x65\xa4\x46\xb9\xf8\x5a\xb3\x1b\xdb\x32\xad\x91\xfa\x1c\x55\x81\x39\x54\xf5\xa0\x47\x3a\x70\x2b\x2f\x83\x17\x81\x9f\x11\xd1\x0e\xce\x8f\x5e\x09\xa4\x79\x1b\xd1\x7a\xc2\xe6\x3a\x3a\xb2\x2c\x22\xe5\xa6\x24\x67\xd2\x37\x45\x3e\xc7\xec\xba\x75\x9e\x02\x75\x86\xb1\xc0\xb3\x6b\x36\x2e\x78\xdc\xc0\xb2\xc6\xa0\x53\x1a\xab\x92\xba\xa2\xcd\x18\x7b\xd4\xe3\x43\x1c\xda\x26\xdc\xf5\x9b\xce\x4e\x72\xcf\x50\xc8\xc8\xc0\x9f\x15\x66\x0e\x5f\xd5\xa6\xee\xef\xdc\x61\xa5\x17\x4f\x12\x6c\xc3\xb8\x5b\x13\x1b\x55\x6f\x2b\x4b\x20\x4e\x1a\x46\x5f\x13\x76\x17\xa4\xe4\x0b\x20\x06\xa9\x72\x5b\x16\x6d\x88\x6b\x78\x48\xd8\x27\x76\x46\x51\x8c\x00\x6f\x00\xd6\x69\x8f\x04\x2b\xac\x99\x3b\x89\x59\xa7\x87\xb3\x20\xd3\x6d\x6a\xcd\x78\xf8\x11\xbc\xd8\x1c\xf9\xf7\xf2\xb8\x5b\xb6\x26\x84\xce\x00\x37\xee\x31\x88\x11\x14\x51\x57\x86\x33\x11\x32\xb3\xf6\x71\x8f\xbb\x15\x90\xbf\x3a\x19\xcb\x75\x5d\x4d\xe3\xb9\x0f\x80\xa8\xd8\xe6\xa6\xfc\x66\x38\x93\x67\x02\x88\x71\x98\xf9\xa9\x1f\xdd\xc7\x04\x08\x1e\x1a\x71\xf2\x0f\xa0\x7a\xab\xab\x07\x0b\x73\x3c\x49\xcb\xe7\x83\x73\xc0\x31\x2c\x42\x62\xbd\xa8\x3b\x3e\x33\x96\x5e\xf2\xae\x7e\x36\x02\xc3\xfd\xda\xc2\x1a\x61\x8a\xf3\x54\xd1\x29\x44\xed\x73\xfd\x73\x79\x1e\x59\x24\x2b\x01\x0a\x03\xb9\x56\x36\xe5\x3c\x1e\xc1\xa3\x52\x8d\xeb\x37\xea\x71\x42\xf9\xf9\xb6\x57\x40\xc9\xcf\xc2\x50\x42\x4f\xad\xca\xbe\x95\x6d\x43\xb3\x33\xbe\x76\x80\x63\xce\x3a\xc1\xe2\xf1\xb0\x6c\x91\x41\x2d\x77\x50\x10\x34\xaf\xe1\x1f\x8e\xd9\x28\xa9\x8d\x41\xfa\x7d\x30\x47\x37\x47\x2e\xc7\x11\xa2\x52\x19\xba\x7f\x56\x44\xb2\x09\x99\xdf\xed\x63\xd8\x71\xdc\xce\x7a\x64\x8e\x27\x89\x93\x34\xad\xe0\x7c\x43\xa7\xe7\xe3\x90\x0b\x4a\x62\x60\x61\x13\xc8\x7e\x57\x9b\xe9\x20\xed\x47\x89\x14\x6b\x78\xe6\x82\x48\xed\x6d\xdf\xf8\x8f\x53\xac\x5b\x75\xd5\x3e\xea\xe2\x0c\x9a\x99\x2c\x22\x81\x37\xfa\xec\xc4\xec\xec\x9f\x3b\x03\x7d\xa6\x98\xb3\x4d\x63\x08\x04\x0e\xde\x3b\x49\x48\xbb\xea\xa1\xf0\x66\xfa\x16\x6a\x5c\x93\x1d\xfd\x40\xfa\x5c\xb0\x1e\x46\x7a\x36\x0b\x99\xec\xa1\xcb\xe2\x98\x5c\x11\x41\x5d\x5c\xad\x8f\x47\xfd\xb4\xe3\x1f\xf4\x83\xab\xd3\xfb\x42\x00\x06\x4e\x9a\x6e\x18\x6b\xec\xe6\xd1\x2b\x9a\x9a\x56\x14\xa0\x28\x01\x81\x04\x92\x6e\x41\x76\xce\x2a\x2d\x9d\x03\x64\x8f\xdc\xa5\xdf\x8e\x7e\xe4\x72\x00\xf4\xec\x73\x23\x7d\x48\xe5\x62\xb8\x39\xb5\x58\xd8\x80\xa8\xe2\x57\xc9\xbf\x1d\xfe\x3d\x61\x15\xee\x12\x28\x6f\x47\x6d\x38\x96\xb9\xca\xb6\x51\x9c\x89\x99\xa6\x3d\xb5\xaf\x2b\xde\x1b\xb2\x2f\x5e\x64\xef\x99\x0d\x53\x2c\x1d\x95\xb4\x99\xdf\xe6\xab\x9e\x38\xf8\x8e\xac\x10\x59\x69\x0d\xe6\xed\x08\x3f\xd9\xa8\x8b\x41\x6e\xc6\xe7\xb9\x0f\x7a\xba\x9a\xd3\xb3\x4f\xbf\x0d\xfe\x92\xad\x4c\xd0\xca\xd3\xd1\xc5\xf5\xfd\xb4\x45\x97\xbd\x8e\x63\x6b\xf5\x93\x95\xb9\x35\x09\xf5\xee\xc0\x24\x67\x5b\x3c\xb6\xbb\xf2\x8b\xf9\x42\x50\x68\x33\x67\x0c\x6e\xaf\x90\xf1\xb6\xd2\x4f\x3f\xae\x86\x90\xb2\xac\x43\x96\x57\xce\xea\xeb\xb6\x1e\x9c\xc1\x9e\xf6\xd5\x31\xd8\x4a\x74\x75\x44\x60\x5e\xcc\xbf\x6c\x37\x74\x9f\xb6\x10\x8b\xe4\xbd\xe5\xa2\xa6\x8e\xa2\xaf\x24\x2d\xec\x71\xac\xd5\xcc\x15\xa7\xc8\x59\xf6\xf9\x22\x30\x77\x08\x25\x37\x88\x6c\x77\x47\xd5\x7d\x44\xde\x91\xf7\xb8\x68\x17\x81\x7d\x84\x23\x7b\x42\x38\x30\x35\xf2\x71\xe7\xf0\xeb\xd6\x1f\x0d\x0c\xae\xc3\x43\xf9\x8c\xf2\x87\x78\xb8\x27\x38\xe2\xf9\x65\x55\xf3\x73\xa3\x36\x55\xe4\xb2\x58\x3f\x3e\x2a\xd1\x53\xc6\x27\xe4\xf9\x12\x07\x95\x8c\x19\xed\x27\x85\xf1\xa8\x09\xb0\x92\x40\x2a\x97\x01\x14\xaa\x59\xdb\x28\x77\x98\x6e\x91\xf2\xb1\x4c\x8a\x75\x8e\x55\x6b\xc5\x77\x47\x8e\x54\x37\x00\x02\x15\x6b\x3e\x3a\x05\x75\xbd\xa0\xb5\x9c\x9b\xf7\xcf\x7a\xde\x3e\x29\xdd\x2f\x91\xa2\x1f\x33\x0b\x69\x6d\xe9\x68\x8d\x2c\x76\x4b\xc7\xbb\xe7\x62\xde\x9a\x3c\x22\xa4\x89\xd4\x7e\x4c\xd2\xaa\x7e\x39\x2e\x8d\xf8\x4c\x0c\x56\x5e\x21\x0f\x03\x46\x4e\x1e\x4b\xeb\x62\x9d\x4d\xef\x7d\xb1\xf5\x09\x9d\xd6\x13\xa6\x51\x07\x9b\xda\xae\xfb\x92\x21\x05\xf3\xe8\x01\xee\x1b\x0f\xf9\x0c\xdd\xa8\xca\x4f\xb0\x25\x72\x73\xa6\x33\x18\xbb\x9f\x2c\x39\x15\xd3\xed\x4b\x58\x8f\xd8\x1e\x13\xd2\x19\x8b\x3b\x80\x87\x6b\x7f\xfd\x98\x0e\x82\x18\xce\x65\x12\x34\x65\x46\x54\xd3\xd9\x4d\x23\x57\x56\xf0\x71\x93\x08\x82\x1c\xfb\x98\x79\xd0\x78\x92\x4b\xa1\xa9\x73\x90\xc0\x0b\xad\x6e\x06\xaa\x8b\x27\x88\xf7\x28\x9c\x32\x22\x84\xf5\xe8\xe6\xc6\x92\x97\x83\x04\xc1\x76\x5a\x82\x18\xac\x16\x33\xc7\x5d\x95\xe2\xad\x2d\xd0\xaf\xa3\x69\x6c\x45\xf5\xb4\x97\x4d\x93\x1f\xb2\xe4\x75\x55\xbc\x83\x91\x50\x66\x4e\xdb\x1c\x5e\xd9\x7a\x44\x86\xe5\x53\x25\x76\xe2\x39\x79\x30\x26\x9c\x1f\xaa\x43\x9a\x8a\xae\xc0\x3f\x96\x22\x0b\x5c\x5f\x27\x16\x77\xd3\xec\x2f\xd0\xa7\x86\xfb\xf6\xbe\x29\x7c\x77\xc3\x4d\x7b\xee\xed\x4f\x64\x37\x2f\x1d\xf5\xe2\xc0\x09\x21\x82\x41\x91\x24\xbf\x09\xf0\xee\xa3\x06\x94\x8f\x29\x60\x5d\xec\x72\x61\x75\xfa\x1f\x7c\x18\x54\x7a\x93\x62\x69\xce\x89\x77\x4d\x9f\xf1\x05\x3a\x3a\xc1\x30\x50\x18\x94\x61\x00\x04\x2f\x1f\x80\x92\x11\x62\x95\xa2\xa0\x60\x40\x3b\x8a\x23\x86\x61\x9c\x6d\x86\xc7\x4c\xe2\xd8\xa8\xa1\x10\x52\x11\xdf\x0f\xcd\x41\x0e\xac\x4a\xdc\x87\xb8\x1d\x5c\xea\x66\x8b\x3e\xb8\x79\x1e\x86\x02\xc5\xe4\x55\xd2\x20\xe9\xa1\x1f\x7c\x26\xd6\x65\x4d\x55\x8b\xa4\x14\x00\x7e\x5f\xb8\xa1\x28\x40\x21\xb4\x9a\xd1\x2c\xe0\xd2\x89\xec\x7a\x28\x94\x12\x51\xa2\x73\x31\x5d\xbb\x83\xf7\xc3\xe4\x5f\x14\x58\xad\x25\xf0\x13\x39\xca\x42\xea\x07\xa2\x31\xe7\x84\x66\xb4\x22\x9b\xa5\xaa\xdd\xde\xe5\x86\x86\x01\x00\x2d\x14\x7e\x68\x91\x36\x5d\x75\x4f\xec\x20\x55\x3e\x67\x59\xfc\xe0\x70\x74\xbe\x25\x1e\x4a\x73\x9e\xc1\x73\x4a\x1f\x0d\xb3\xf0\xb0\x67\x29\xec\x04\xd9\x91\xbf\x84\x32\x7d\xa3\xee\xd2\xfb\x5d\x00\x09\x2e\xc3\xe5\xb2\x86\xe4\x45\x83\x3a\xc0\xe0\xa9\x56\xf6\x2c\xcb\x3c\xd1\x72\x82\x2e\xab\x57\x01\x4e\x54\x37\xb3\xd1\xf7\x38\x8f\x87\x54\xea\x29\xdc\xd2\xdd\xf1\xd4\xa5\x9f\xa6\xbf\x16\xa2\x43\x71\x14\x38\xa0\x0f\xf3\xb5\x34\xd8\x4e\x3b\xd4\xfb\xc7\x1a\xaa\x1c\x47\xc2\x5a\x66\xf2\x13\xaa\x83\x7e\x08\x99\x81\x57\x5d\xb9\x67\xfe\x23\xe6\x97\xc7\x35\x19\x72\xc0\xd8\xc0\xcc\xb2\xee\x9e\x43\x97\xd1\x96\xe7\xf3\x5e\x56\x89\x04\xba\xad\xd8\x59\xb9\x0c\x1d\x11\xd9\x6c\x92\xc7\x35\xd3\x7c\x39\x72\xf7\xe4\xf1\x72\x11\xc2\x4f\x9c\x9c\x92\x59\xbe\xb4\x7d\xcd\x9c\x13\xa3\x48\xd7\x83\xfc\xf8\xfe\x5e\x2c\x95\x87\xe0\x86\xc7\x09\xc0\x45\x02\x78\x0b\x9b\x05\x68\xee\x3b\x6d\x08\x58\x9a\xe9\x8e\x79\xf2\x77\x26\x67\xe4\x95\x98\x3d\xa5\x26\x86\x08\x0e\x0c\x67\x07\xbb\xc4\x09\xc1\xf6\x6b\x9c\x28\x63\x6f\xf3\xaf\x6a\x5b\x54\x3d\x87\x0c\xbd\x7b\x08\x9c\xb5\xf7\x39\xca\xf5\xd2\x24\xc8\x99\x55\x4d\x51\x88\x6c\x78\xc2\xd5\x81\x6a\xce\xa9\xa6\xc4\x75\xa5\x42\x1d\x89\xab\x9d\xa1\x83\x51\x10\x5f\x02\x11\xc4\x2e\x43\x67\x15\xdf\x23\xae\xd1\x74\x35\xa7\x25\x8e\x73\x04\x29\x1d\x80\x28\x6f\xee\xef\x0c\x45\x20\xaa\xe6\x5e\xef\x5e\x8b\x3a\x2c\x47\x1b\x6a\x94\xcd\x69\x7a\x82\xb4\x32\xce\xb4\xf0\xf6\xdf\x9d\xb0\xd3\xd5\x1e\x03\xd9\xcc\x17\x74\xa7\xb5\x67\x9e\x41\x59\xe3\x85\xb3\x4c\x99\x16\xf1\x2a\x85\x35\xa3\xb1\xc6\xfd\x5b\x19\x45\x56\xbd\x76\x36\xb5\x50\xdc\xa0\x3c\xea\x8a\x7f\xa3\xce\xb8\x34\xa6\x86\xf1\xfa\xf6\x87\x86\x72\x84\x7c\xa5\x0d\xe3\x52\x1f\x55\x31\x8b\x34\x25\x99\x47\xf6\x72\x3e\x90\xbf\xdc\x5c\x30\xf8\x1b\xad\xc8\x10\x81\x3c\x6b\xb7\xd9\x9b\x18\x90\x01\x98\xae\x46\x36\xd6\xc2\x5f\xd5\x9b\xfc\x3c\x1b\x21\x1c\xea\xe4\x60\x37\xae\x4c\x42\x9a\x83\x03\x03\xb5\x00\x73\xc8\xb8\x62\x21\x25\xc3\x3f\xcd\x71\x10\xc0\x45\x80\x61\x01\x2d\x3b\xeb\x4a\x22\xc5\xe1\x66\x8b\x06\xbd\x4e\xb7\xec\x16\x62\x49\x1c\x19\x32\xd9\x87\x89\x42\xc2\x3c\xfb\xeb\x69\xfe\x48\x4d\x8c\x77\x88\xfd\xaf\xf5\xdc\x48\xb2\x1d\x1e\xd9\x1f\x26\x15\x56\x61\x8a\xf3\xfb\xba\xbf\x71\xf0\xfb\xf6\x78\x71\xe7\xfb\x96\x95\x7a\x56\xfe\x4e\x98\x1d\xe6\x3b\xed\xec\xa0\xe5\xf8\xed\x25\xac\x17\xa4\xc1\x05\x31\xbe\x10\xce\x9e\x85\x55\xb7\xfa\x6f\xe6\xee\x09\x93\x9e\xd4\x7d\x87\x9e\xee\x66\x0d\x8e\x93\xd9\x48\x9c\x73\x95\x36\x77\x64\xd0\x03\x59\x69\x0b\xf2\xa2\x3c\x4f\xf4\xdd\x8e\x10\xbe\x70\x8e\x6f\x2c\x39\x4c\x0c\x30\xed\xdb\xbf\x07\xe2\x88\xcd\x3d\xc6\x5e\xc8\x4b\x9a\x73\x24\x9d\xcd\x5b\x65\xa4\xe3\xa4\x97\x0e\xec\xca\xff\x1c\x75\x67\x42\x79\x14\x7d\xa8\x9f\x1b\x17\x94\x28\xab\x73\x4a\x92\x7c\x87\x94\xca\x9b\x94\x26\x43\xde\x8e\xf8\x1b\x1f\x59\x08\xc8\x6b\x09\xc4\x54\x06\x5d\xf6\x0b\x5d\x7f\x8b\x85\xa5\xd7\x2f\x7f\x69\x5a\xd9\xb9\xa6\x1d\xb9\xf4\x60\x2e\xe4\xbd\x2d\xc2\x0d\x56\xee\x77\x37\x56\x96\x58\xbc\xcd\xa8\x56\x0a\x40\xed\x6c\xb5\x74\x18\x6c\x4b\x11\x24\xd1\xf9\xd0\x9d\xa5\x36\x65\xb2\xf0\x00\xed\x5d\xab\x0e\xde\x0e\xb1\xf9\xa2\x02\xca\xe0\x8d\x3e\x11\x9e\x2b\x50\x28\xda\x23\xc6\x6f\xd0\xfa\x7c\x91\x4c\xb9\x68\xbf\x6d\xb9\x27\x10\x01\x6e\x8a\x08\xe6\xa0\x6b\x89\x1a\x11\x5d\x8c\x66\x9b\x1d\x22\x88\x95\x8c\xdc\xec\xf5\xc6\x0f\xc3\xc9\xd2\x29\xc8\x44\xa4\x35\x93\xbc\x07\xd6\x1f\x86\xa5\xfc\x22\x68\xa3\xb2\x1e\x01\xea\xbb\xa8\x74\x1f\xdb\x1e\x72\x96\x70\x30\x4a\xf8\xb1\x34\x31\x0a\x97\x65\xdc\xb3\xac\x8d\xc7\x11\xed\x64\x4d\x6d\xd2\x17\x7f\xb5\x3d\x21\xf4\x81\x26\x47\xbc\xbe\xbf\x2a\xf2\x76\xb5\x8a\xca\x36\xa0\xb9\xc8\x96\xc3\x84\x50\xc6\xd6\xed\x18\x5b\xed\x7e\x63\xa0\x8f\x90\xe7\x6e\xbb\x6c\xcf\x82\xdb\x5f\x0d\xf1\x44\x18\x56\x55\xbc\xf3\x4d\xe5\x49\x13\x0a\xbc\x8a\xac\xee\x6d\x3c\x3c\xc6\x6c\x09\x05\x9d\x81\xb3\x54\xa0\x2b\xfa\xfc\x28\x35\xfa\x33\x57\x78\x79\x7b\xd7\xb7\xeb\x43\xac\x3e\xff\xf2\x19\x13\x85\x58\x0e\xe7\x58\x46\x92\x8b\x83\xd5\x75\x98\x9e\xc4\x57\x82\x2c\x96\x51\xfc\x04\xb6\xf4\xdd\xb6\x0d\x71\xc6\x6d\xdc\xfb\xdc\x70\x31\xa2\x15\xde\x3b\xc5\x93\xb6\x9d\xfe\x2e\x8a\x61\x8f\x70\x7c\x02\x32\x8f\x08\x57\xad\x29\x44\x64\x7d\x41\xf6\x49\xed\xe7\x23\x33\x02\xed\x5f\xb9\x74\xf1\xc6\x4f\x17\x62\x90\xf2\x21\x3b\x56\x0c\xd4\xe4\x27\x10\xbc\x0a\x58\x98\x4c\x0f\xfb\x3e\x6a\x61\x67\x2d\xee\x5a\xf1\x1b\x27\x53\xc4\x0f\xaa\xcd\x41\x94\x3a\xf1\x89\xeb\x32\xc6\x6b\xc9\x81\x71\x02\x5a\x8b\x63\x3c\xcc\x64\x11\xd2\x49\x16\x7d\x54\x70\xd3\xac\x30\xf5\x60\x60\x8f\x93\xeb\x35\x5d\x6c\x47\xd0\x6c\xa9\x53\xd1\xcf\x71\xf9\x92\xc6\xcd\xcc\xef\xd0\x84\x11\x5b\xa9\x43\x5c\xe5\xf5\xfc\x95\x87\x54\xcd\x39\xd5\x80\xa5\x2e\x58\x60\x8c\x2b\xa3\x8b\xd6\xde\x28\xc9\xde\xc5\x4c\x62\x50\xef\xbf\xba\x44\x19\x79\xa4\x9a\x47\x67\xaa\x6d\xe6\x3b\x6e\x3b\x33\x31\x84\x34\x28\x6f\xc6\x57\x2a\xbd\x29\xea\xee\x81\xce\x5f\x5d\xff\x1e\xdd\x8d\x6a\x3d\x49\x18\xd1\xab\x3e\xde\x4b\x88\xe8\x6d\x90\x81\xc8\x75\x85\xa5\x0e\x6e\x37\x34\x78\x44\x6c\x86\xf3\xb3\x9c\x29\xd6\x84\x7a\x56\x6b\x80\x1b\xe5\xc3\xc3\x47\x34\xc6\xe6\xe8\xe3\xd0\xe5\x5c\xbb\x0f\x3a\x45\xf6\x3b\x37\xe1\xd4\x9b\xcb\x45\xe9\x75\xeb\x54\x39\xb4\x6c\xe2\x35\xc2\x33\x84\xab\x3d\xd0\x7e\x7d\x03\x18\xed\x2b\x53\x83\xe6\xea\xd1\xcb\xbe\xd3\xac\xb2\xeb\x81\x68\x5d\x78\x5e\x19\x8c\x2c\xe4\x04\xbb\x23\xda\x95\x31\xf4\xf3\x61\x97\x2a\xa9\x25\xe2\x18\x99\x26\x1d\x8b\x6f\x23\x0a\x69\xaf\x05\x90\x33\x08\x1b\x9f\x6d\xdb\x4a\xaa\xfe\x30\x91\xb3\x46\x6d\x92\x99\x78\x44\x70\x6a\x64\x66\x8a\x83\x91\x5e\x69\x3f\xcb\xe1\x38\x88\xb5\xa7\x7d\x26\x0b\xeb\x1e\xbd\xa4\xf0\xf3\x24\xe7\xe3\xf0\x2d\x72\x30\x7c\x87\x71\x5e\x06\xc3\x3e\xff\xc5\x7e\x5a\x93\x11\x53\x0c\xd8\x14\x78\x3e\xc5\x8e\x17\xbb\x8f\x5d\xfc\xc9\x68\x36\x5d\xf9\x48\xe5\xa7\x56\xe7\x92\x44\xa0\xb3\x4a\x27\x61\x16\x16\x3a\x9d\x83\x95\x8e\xcf\xef\xf0\xfa\x2d\xa6\xd1\xeb\x4e\x85\x64\x8f\x48\x59\xd7\xfb\xa0\x9e\xe5\x4f\x6d\xcf\xef\x18\x6a\x98\x35\x83\xe2\x3a\xda\x60\xf9\x86\xb5\xba\x22\xcd\xa7\x53\xf7\x43\x5b\xb5\xa9\x4b\x79\x20\x99\x1c\x9f\xa2\x25\x13\xe6\x28\xbc\x63\x8a\x99\x2f\x35\xd5\xa5\x74\xb5\xf0\xfd\x97\xa9\xf7\x6f\xa2\x40\x02\x20\x33\x88\x21\x7e\x9c\x02\xdb\xf7\x83\xb3\x93\x4e\x7d\xc4\x76\xcb\xd2\x73\xc6\x1e\x56\x19\x89\x45\x52\x22\x7e\x50\xec\x32\x7b\x46\x03\x96\xdf\x7e\x91\x49\x57\xe9\x6c\xb5\xae\x62\x46\xd3\x93\x69\x7b\x83\xa1\x1d\xd4\x8c\x86\xcf\x2c\x15\x13\xcf\xa4\x41\x19\x4a\xcf\xfd\xa3\x5f\xf7\x19\x37\x2a\x32\xb8\xfd\xd6\x6c\x23\x4f\x28\xf9\x27\xe0\x9e\x30\x6e\x42\xaf\x33\x68\xbf\xaa\xb3\xc5\x3f\x30\x3a\xbd\x30\xc5\x33\x1b\x91\xe0\xc0\x51\x7e\x80\x32\xe4\x5c\xd3\x9c\xa1\xee\x01\x87\x5f\x60\xbf\xa3\xd5\x5a\x90\x62\x4c\x89\xc7\x35\xff\x1d\x1f\x29\x4c\xf2\x93\x0a\x2d\x4d\xca\xf9\x38\x9d\x1a\xed\x45\x27\xba\x6f\x8b\x2f\xe3\x65\xdd\x7c\xe4\x90\x37\xd5\x8e\xbb\x0f\x18\x2c\x98\x32\x7b\x65\xe1\x66\xcb\xe9\x27\x8f\x46\x94\x87\xdc\x35\x9f\x3e\xfa\xb6\x40\xa2\xa3\xb1\x58\x29\x36\x6e\x33\xdb\x3c\x15\x4c\x27\x13\xb3\xd2\x60\xbf\xe7\x1e\xcf\x64\x3f\x2f\x49\xfe\x48\x88\xcc\x01\x02\x21\x8f\xcb\x2c\x32\x92\x44\x59\x74\x42\x0f\x54\xb1\xc6\xaa\xac\x6c\xe2\x29\x3b\x7f\x70\xb0\x20\x3c\x8b\xb4\xcb\x49\x05\x24\xa8\x5f\xea\x0f\x45\x16\x0d\x49\x0b\x1f\x92\x9f\xa9\x76\xe0\x74\xdf\xbe\xa6\x2c\xd1\x9e\xf2\x62\x49\xb4\xfd\xfd\x7e\x0b\xad\x75\xe5\x50\x04\x87\x29\x08\x42\x0d\x29\xf4\x62\x7a\xad\x83\xfd\x08\x3a\x12\xab\xa5\xe1\xe2\xcb\xc3\x6c\xae\x98\xf8\x62\x48\x9e\x39\x74\x9e\x86\x62\x68\x4f\xdd\x5f\x5f\xd1\xdb\x7c\xeb\x1f\x1e\x83\xba\xe8\x24\xc4\xc8\x9f\x5e\xb8\xf4\x58\x00\xcf\xdc\x15\x97\xa4\x1f\xa8\x1b\x5d\xce\xa7\x9e\x9f\x77\xb4\x5f\x8d\x8a\xe8\x24\x4d\x5f\x92\xfb\xce\x37\xa6\x6c\x12\x17\xa1\xe8\x65\xab\x7a\x4a\xee\xa3\x34\x87\x16\x15\xcd\x46\x63\xb0\x2a\x28\x5d\xcb\x97\x89\x1c\x99\xf8\x3a\x55\xf7\x1d\xf7\x57\x78\xfc\x52\x01\xba\xec\x15\xb6\x6e\x42\x11\xb9\xe2\xd3\xa9\x96\x78\x38\xde\x55\x48\x84\x69\x29\x3b\x5a\xe5\xbe\x52\x19\xc7\xc0\x25\xfc\x73\xa6\x72\xe2\x07\x60\xcc\x8e\x6f\x5b\x72\x07\x74\xda\x99\x55\x0e\x9f\x49\x57\xf8\x67\x07\x46\xf9\x33\x61\x08\x5e\x52\x50\x62\xae\x8c\xb9\xd9\xe9\x26\xa2\x61\x5c\x4d\x98\x0a\x97\x02\x97\x6c\x1a\x36\x29\x31\x2a\x04\x67\x4a\x35\x99\x62\xa9\x7b\xbd\xda\x2b\xf2\x8e\xf1\x8b\x26\x69\x19\x26\xda\x71\x98\xc9\x70\x04\x3a\x0d\x6d\x1a\x5d\x50\x59\x2a\x81\xd7\x40\x27\xef\xee\x5e\xad\x12\x50\xbc\xeb\x45\xe0\xc0\xca\x7b\xd1\xcc\xe7\x6a\x57\xeb\xca\x30\x05\x23\x2c\xfa\xac\x17\x02\x10\x39\xde\xa5\xf2\x7c\x7e\xb4\x84\x27\xe0\x6b\xa4\x43\xec\x3a\x90\x56\x82\x7d\x48\xcd\x57\xf5\x56\x99\x5f\x4c\xc0\x79\x27\x3a\xfe\xb2\x2c\x6e\x3e\xc3\x6e\x3b\x10\x75\x5e\xa6\xcf\xd0\x9a\xc9\x67\xca\x63\x0d\x40\x50\x88\x26\x68\x49\x5d\x77\x2e\x1c\xa4\x62\x4c\x19\x84\x77\x7b\xe4\x66\xe3\x72\x0e\x73\xa1\x6d\x4b\xa8\x2d\x6d\x84\x5a\x5e\x21\xbd\x25\xbe\x4f\x66\x21\xa4\x2d\x99\xc0\xcf\xd8\xe9\xea\x69\x26\x38\xb3\x52\xcc\x76\x1d\xcc\xf5\x58\xfe\x89\xb5\x48\xe9\x92\x8c\x3c\x3d\x0c\x5d\xbd\x2d\x33\x83\x62\xe8\x45\x14\x47\x4e\x13\x6b\x5b\x2b\x4e\x81\x03\x30\x00\x89\xcf\x43\x91\x3a\x59\xf7\xd2\xec\xf8\x44\x29\x1f\xe6\x1b\xb5\x0c\x25\xb6\x30\x06\xb7\x41\x80\x8b\xe6\xee\xbc\x26\xef\x74\xfc\x83\xb0\x3d\x90\xab\x4e\x0e\x24\xe6\x95\xda\x6e\x5a\x90\xb3\x91\xf0\x56\x2e\x64\x89\x35\xc5\x37\xa3\x90\xcc\x32\x88\x6a\x21\x2c\xe1\x96\xb9\x79\x08\xa5\x15\x6a\xad\x42\x55\xca\x03\x7e\xea\x9f\xb0\x48\x55\x3f\x22\x90\x64\x87\x2b\x9b\x59\xca\x8d\xda\x79\xb2\x9f\x48\x9e\xea\xf9\x8b\xbc\x4d\xd1\xf4\x7e\x3d\xea\x9f\x99\x4a\xaa\x01\xe8\x62\x4d\x80\x89\x53\xd4\xce\x60\xc3\xc6\x91\x45\x3f\xda\x8d\xd3\xf2\x59\x53\x62\xb0\xe0\xb6\x68\xfd\x9c\xcd\x27\x0f\xad\xf9\xdb\xe6\x6d\xff\x32\x37\x91\x77\x51\xad\xe8\x63\x8b\xff\x5a\x1f\x92\xaf\x96\xfd\xcc\x89\x3f\x2f\x4b\x1c\xaa\x6b\xcd\x4c\x67\x82\xa2\x63\x24\x0b\x41\x0d\xa6\x4e\x8e\xae\x80\x71\x43\x09\xcd\x2a\xee\xb7\x57\x29\x83\x7a\x9a\x8e\x94\xc3\x86\x21\x11\xab\xfd\x0e\xe1\x35\xf0\xc4\x42\xb0\x2e\x72\x1e\x75\xed\x11\x6d\xe1\x27\x20\xb3\x00\x76\x5e\xd7\xd1\xd8\xb3\x57\xf0\x96\x34\xea\x85\x9f\x95\xe4\x2b\x1f\xaa\xc7\xc2\xb3\x52\x61\x0c\x81\xda\xab\x98\xc0\x11\x2d\x26\xf0\x29\xc6\x68\xcf\x38\x85\x77\xc8\x8e\x0d\xce\x30\x62\x67\xdb\x79\xbe\x84\xe6\xfe\x40\x5b\x51\x1a\x9a\xc8\x24\x3c\x27\xaf\x5f\x5c\xf8\x82\xca\xa1\x0c\x1a\x39\x33\x86\xd1\x3b\xf7\xdc\x5b\xdd\x01\x1e\x73\x38\x1e\xfa\x34\xdc\x87\x36\x2d\xca\x4e\x0e\x38\x9f\xa2\x24\xbc\xd1\xcd\x03\x59\x3b\xac\x88\x14\xa2\x32\x4a\xa5\xe4\xb1\xb7\x39\x57\x24\xbb\x71\x3c\x19\x8f\x98\x63\xa9\x15\xbd\x3f\x69\x34\x56\xd5\xfc\x80\xbe\xb2\x09\x53\x57\x66\xa5\x05\x05\x3a\x72\x40\x61\xbb\x6a\xb1\x71\x04\x57\xbc\x85\x57\x4b\x32\x86\xb2\x05\x93\xa0\xf4\x9d\xcf\x6c\xd1\x60\x0d\x16\xa0\x89\x85\x83\xad\xa9\x0a\x51\xed\x9f\x82\x45\x94\xf4\x51\xc8\x0e\x22\xe0\x0d\x36\x60\xff\xa1\x94\xfe\x01\xc8\x5e\xdd\x04\x98\xb7\x80\xa5\xd1\x52\xba\xfa\xe4\xeb\x05\xb6\x14\x1c\x59\xd9\x69\xc8\x0f\xb6\x33\x75\x58\x2c\x3e\xeb\xac\x76\x2e\x9f\x6e\xa9\xec\xd8\xbb\xa7\x32\xfc\x8a\x7e\xa0\x15\x3e\xba\xdf\x94\x51\x8c\x80\x0e\x8d\xbb\xa0\x2e\xed\x45\x2e\x2d\xbd\x55\xc0\x57\xf8\x11\x79\xf7\x35\x34\x24\x80\x6c\x18\x58\xf5\xb5\x7c\x69\xd9\x97\x5a\x47\x13\xa1\x67\x70\x02\x30\xbc\x7f\x20\x1a\xa1\x0f\x64\x33\x0b\x26\x43\xbb\x6a\xac\x34\x65\x9d\xd3\x01\xac\xf5\xc0\xb2\x83\x0f\xce\xcd\xa7\x8e\x06\x82\x96\x64\x1c\x36\xd4\x32\xc4\x12\xf2\xc3\x30\x33\x2a\x7c\xd8\xea\x36\x07\x61\xf7\x79\xab\xdf\x89\x40\x37\x0d\x46\x09\x64\xf8\x21\x26\xdc\x52\xe6\x43\xe5\x9d\x28\x80\x94\xf7\x03\xd5\x17\xea\x4f\x0d\xac\x46\xca\x43\x55\x4a\x2b\x33\x0c\x8c\xa0\x62\x07\x97\xab\x43\xea\x72\xc2\x9d\x3a\xaf\x5a\x31\xdc\x30\x11\xd5\x2c\x0e\x4c\xb7\xe9\x03\x22\x02\xa5\x87\x31\xbf\x8a\x6c\x72\x84\x6d\x3c\x91\x5a\x8f\xf2\xa1\x96\x8f\x4d\xb4\xcc\x8f\x15\x34\xcf\x15\x8c\xde\xa2\xf6\x5e\xa3\x11\xd7\x76\x01\x58\xc0\xee\x8e\x66\xbd\x80\xd9\xd2\x20\xee\x7b\x62\x1d\xb6\xad\xc3\x25\x96\x2a\xec\x28\x35\x85\x2d\x97\xea\xe5\xb5\x6d\xd5\xea\xc5\x2d\x8d\x88\xe1\xba\x35\x70\x50\xe7\x83\xb3\x63\x8d\xeb\x8d\x22\x87\xc0\x0d\x7d\x05\xd3\x1d\xa6\x4e\xc2\xfd\x26\x5c\x5e\x63\xd9\xf9\x4c\x8b\x6f\x5b\x1b\x8c\x58\x41\x17\x31\xd9\x8d\xa9\x5e\xd7\x85\xbe\xd2\x8c\x8b\x32\x24\xfc\x56\x86\xd4\x8e\x8c\x4f\x2f\x18\xbe\xba\xcd\x26\xd3\x7b\x8b\x0d\x63\xb9\xd2\x44\xd5\xc3\x91\x4a\x0e\xfc\x4e\xb3\xf6\x59\xf6\xd8\x16\x84\xe4\xab\xb1\xfc\xb4\xec\x44\x00\x13\xb0\xc1\x2b\x8e\x6d\x88\x79\xa3\xf7\xea\xa5\x7e\x27\x0e\xfa\x8f\xaa\x92\xf3\x45\x51\x42\x15\x71\x0a\xf8\xb1\x60\x3c\x36\x12\x94\xb7\x41\x68\x36\x8d\xeb\xde\xf9\x06\xa3\xa0\x56\x3c\x99\xf5\x63\x0c\x94\x72\x10\xad\xa7\xd5\x0d\x6d\xe2\xea\x92\x3e\xa4\x9b\xc1\x9d\x7e\xce\xae\xfd\x1d\xd3\x60\x12\xa5\xc2\xaf\x67\x1e\x89\x51\xbd\x93\x43\xf4\x87\x73\x4b\x10\x1f\xad\x28\xd2\x92\xc7\x1a\x04\x80\x00\x20\x87\xb4\x58\x41\x35\xdf\x18\x70\xfa\xe0\x10\xf5\x92\x2a\x2b\xb7\x94\xb0\xc9\x2d\x3f\xe6\xf2\x46\x48\x20\xd4\x81\x6a\xfe\x95\x5f\x66\xfd\x42\x18\xdc\x69\x2b\x8e\xa3\x60\x2b\x87\xd7\x2c\x6e\x4a\x01\x74\x29\xe7\x53\x25\xe0\xa5\x68\x18\x9e\x1c\x6f\x3b\x02\x61\x53\xb0\x39\x76\xb0\x00\xa2\x7d\x22\x4c\x3e\xd5\xce\x98\xef\xd2\x1a\x40\x93\x79\x24\xcd\x62\x97\x24\xf7\xa5\x32\x97\xf6\x10\x4e\x44\x9e\xca\x00\x3d\xb7\x0f\xfb\xe3\xf6\x59\x3a\xfc\x55\x4a\xcb\xe2\x7a\x76\x34\xeb\xbe\x6b\x6a\x55\xb6\xb4\x0e\xf1\x96\x3b\x8c\x85\x1c\x43\xa1\xf8\x94\x91\xb8\xe4\x52\x6a\x7e\x12\x96\x06\x2c\xfb\x22\xd6\x9c\x46\x74\x1c\x60\xea\x33\x04\xc0\x6f\x84\xda\xfa\x28\xab\x56\x2e\x31\x8e\x5e\xbe\x22\x94\x45\xb1\xf4\x87\xc4\xc9\x96\xaf\xbb\xae\x75\x6c\x0c\x56\x3f\xb0\x36\x68\xc5\x93\x6e\xba\x27\x41\x76\x5f\xf8\x4c\x93\x86\xf9\x72\x66\x27\xc2\x87\x39\x0f\xd5\x25\xcd\x32\x19\x22\x08\xd5\xb6\xe4\x98\xb5\x08\x64\xfa\xa7\x94\x22\x2f\x87\x30\xc5\xf9\x63\x18\x22\x68\x78\x1e\xa0\xb8\x8d\x98\xb3\xcd\x61\x61\x7b\x79\x10\x2e\x09\x47\xb1\x0f\xbc\x5e\x38\x2e\x72\x07\xba\x2a\x53\xff\xd1\xc1\xd0\xd8\x28\x9b\xe2\x4c\x31\x0b\x16\x0e\x3c\xf0\x91\x85\xcb\x38\x67\xf6\x2d\x90\x92\x00\x37\x1b\x2c\xec\x2f\x21\x0c\x47\x6c\x19\xb8\x66\xaf\x2d\xb3\x2e\xfa\xd0\x28\x3c\x14\x24\x6f\x12\xf7\xf0\x12\x6e\x66\xb9\x00\xeb\xeb\x7e\x7e\xed\x4a\x2f\x38\xa3\xca\x66\xb9\xa0\x98\x4a\x5f\x0c\x0e\x3d\xbc\x0c\x17\xd8\x9c\x78\x7d\x8a\x89\x08\xce\x38\x7c\x50\xea\x42\x6a\x6e\x34\xa0\xb6\x99\x15\x3c\xb1\xa5\xd3\x10\xa5\x71\x07\x13\xd9\xaf\x44\x44\x20\x44\x58\xf3\x9a\x4c\x19\x79\x91\x2e\x0a\x8d\xf6\x45\xad\x0c\x39\x3e\x10\xcf\xa8\xfa\x63\x78\xfe\x17\xb7\x34\xc3\x2a\x5b\xcf\xc6\x0a\x16\xea\x8c\xcf\x49\xfc\x20\x31\x8b\x07\x7e\xc3\x6b\xe2\xa4\x5f\x7b\xd0\xd6\x7c\xe1\x1e\x65\xec\xd2\x42\xdc\x39\x7d\xae\xb4\x06\x1d\xe3\x1e\x52\x9d\x18\x75\xdd\xb7\x30\x76\xe1\x34\xef\xf8\x8f\x08\xe8\x76\x60\x71\xaa\xe6\x2e\x68\x22\xa7\x5c\x26\xa6\x8e\x3e\xc2\x05\x2c\x08\xbe\x9e\x85\x8f\x53\xee\xbb\x2f\x61\xfc\x9b\x7b\x6d\x35\x51\xe9\xca\xa6\xde\x67\xe1\x97\x88\xa5\x1d\x04\xc7\xd1\xdc\xca\xa0\xa6\x3d\x5f\x04\x68\xe1\x58\xbf\xbd\x5f\xa7\xb2\x8e\x3c\x59\x98\xf0\x65\xef\xd3\x34\x0d\xaa\x9c\x45\xfb\x0b\xec\x41\x19\x88\x74\xdc\x3c\xd1\x92\x79\x90\x25\xbc\x45\x34\x60\x07\x89\xa4\xcd\x59\xd4\xc7\x63\x23\x63\x15\x7d\xd0\xcd\xb5\x9f\xd9\xf1\xd2\xc7\xe7\xe4\x99\x53\x80\x0c\x94\x41\x51\x81\xa4\xea\x15\xd7\xb5\xc6\x54\x8a\x1c\xbd\x8c\x6c\xd1\xa4\x40\x8a\x75\xfc\x55\x7e\x58\xb7\x2a\xc2\x98\x28\x21\x79\x9a\x45\xaa\xa5\xa9\x70\x50\xed\xe3\x31\xf3\x8a\x95\x1a\x6a\xbc\xde\xd7\xbc\x7c\x84\x67\x14\x7f\xa5\x34\x05\x5e\x12\xbe\x33\xab\x5a\xa9\x52\x61\x9e\x89\x7e\x8a\xb4\x32\x7b\xd0\x7c\x83\x1f\x78\x02\xae\x78\x6f\x17\xb4\xf3\x2b\x8f\xcb\xf8\xc3\xba\x50\xa2\xd5\xe7\x6d\xca\x48\x6d\x06\x86\x2e\xc7\x4a\x72\x36\x44\x15\xb8\x24\xdd\x59\xe4\xc7\x84\x37\x3b\xd6\x43\xc5\x5e\x8e\xc3\x97\x29\xe0\xac\x97\xa7\x19\x46\xbd\x65\x5a\x47\x9d\x10\xa6\x49\xa6\xe4\xda\xc0\xb8\xc5\x3f\x55\x15\x77\xd0\xda\x9e\x82\xc3\xd7\x39\x6c\x6c\xb3\x01\x2e\x5e\x48\x2a\x4b\x1e\x37\x88\x85\xc7\x38\xa0\x5f\xe8\x77\x20\xe1\x21\x5e\xab\xf4\x32\x38\x5d\x65\x32\x92\x6b\xf9\x6f\x0a\x89\x7a\x86\x96\xd3\x88\xea\xd1\x1f\xc1\x3e\x43\x4e\x7f\x2a\x9b\x7d\x52\x33\x31\xbd\xde\x3c\x17\xe4\x1b\x29\x30\xf7\xc4\x90\x3d\xe8\x68\x63\x93\xe3\x2f\x23\x98\xe8\x8a\xc5\x50\x85\xc6\x19\x17\xd3\x30\x2c\xe8\xd2\x3f\xb2\xa9\xa7\xb5\x34\x74\x05\x82\x78\xbc\x7c\xb8\x96\x84\xf4\xcc\x9e\xcc\x45\x64\x93\x6c\x7f\xf7\xae\xea\x66\xb1\x3b\xa6\x54\xdf\x36\x56\xa7\x2a\x7a\xd9\x0a\x03\x87\xa3\x56\xdc\x9e\xb9\xcb\xc6\x04\x3e\x92\x71\x5f\x2a\x5b\xe7\x71\xb9\x68\x33\xd6\xdb\x1a\x88\x68\x90\x7d\x6d\x16\xb2\xad\x88\x5e\x08\x80\x86\x6a\xdb\x8e\x39\x29\x88\x2c\xf6\x91\x78\x41\xcd\xf7\x38\x6b\xcf\x45\x99\x31\xc6\xa5\x34\xb6\x11\xa4\x59\x0e\xd7\xf5\x0f\x3e\x49\xa5\xb3\x59\xc1\x83\xf8\xfc\x34\x2d\x1d\x64\x54\xbf\xf8\xd8\x5c\x80\x68\x31\xa3\xbc\x00\x81\x56\x90\x3c\x0c\x82\xa0\xa8\x2b\x9d\xaf\xb7\x15\xfe\x40\x30\x89\x93\x4b\x31\xe0\x6b\x53\x91\x66\x51\x6a\x2f\x8d\xb4\xc0\x8b\x88\xe3\x50\xf0\x3b\x29\x08\x3e\x6e\x9f\xf6\x12\xc0\x0e\xee\xab\xa8\x02\xfd\x61\xeb\x10\xfa\xe6\xc6\xc1\x12\x40\x9a\x2c\xcd\x6a\xfe\xe4\xc3\xd4\xb6\x92\xe6\xb7\x5b\xd7\xcd\xe9\x2c\x98\xfd\x67\x4d\xb5\xdb\x44\x65\xc5\xe4\x3f\x15\xfb\x18\x98\x88\x06\x3c\xd2\x5e\xae\xb8\xd3\x60\xee\xd7\x88\x5f\x09\xdc\xf1\xb5\x32\x19\xe4\xb0\xb0\xd6\x73\xcf\x6b\x5b\x7b\x7b\xe9\xde\x20\xe3\x4b\x0a\xa7\xdb\xd8\x28\x0e\xc9\x34\xc4\x09\x08\x93\x21\xbb\x29\x95\x4e\x81\xd6\x19\x09\xbc\xc8\xd0\xba\xd5\x88\xa1\x5e\x09\x9c\x70\x7c\x10\xc4\x5f\x10\x3e\xbe\xe0\x15\xd7\x5f\x15\x29\x21\x57\xc6\x3b\x79\x8d\xbf\xf5\xe3\x32\x8f\xca\x71\xd8\xd2\x26\x38\xbc\x82\x5c\xd8\x5f\x44\x1f\xe5\x08\xa7\xc9\x18\x7c\x8d\x9f\x38\xa6\xd5\x64\xf8\x60\xff\x31\x0a\x8b\x3e\x3d\xfc\xb8\x4a\xd2\x71\x13\x71\x1b\x43\x25\xa7\x34\xec\x3e\xdf\x81\x01\x3c\x6b\xe4\xb3\x06\x24\x33\x23\x5b\xf5\x7f\xec\xdd\xb5\x12\xc6\xc8\xb2\x18\xe0\x07\x52\x20\xa6\x50\x8c\xbf\x98\x33\x31\x33\xeb\xe9\x5d\x7b\x60\xbd\xd7\xe5\x2d\xbb\x1c\xd8\x0e\x4e\xa0\x44\xd0\x52\x29\x99\xee\x99\xa9\xfe\x5c\x02\x62\x4a\xe8\x9b\x6a\x06\x7c\x2f\x74\x2c\x45\x9c\x2d\x4d\x23\xaf\x26\x7c\xa1\x87\x2f\xe8\x2e\xbd\x90\x69\x1f\xbe\xd0\x50\xaf\x6e\x49\x56\xb6\xad\xa9\x72\xe6\x53\xec\x1f\x06\x29\x91\xf9\xbb\x45\x36\xce\x22\x8c\x27\x3a\x9a\xb1\x68\x8b\xfa\x20\x43\xcc\x96\xb4\xd8\xac\xd8\x8e\x3f\x25\x37\x73\xf4\xee\x78\x0a\x1c\x54\x9d\x66\x15\x26\x47\x31\x43\x3d\x7f\xec\xc4\xc1\x2c\x0f\x3b\xeb\x22\xa0\x62\x15\x87\x33\xa3\x4e\xdb\xc6\x46\x9e\x28\xb4\xae\x77\x88\x2a\x30\x06\xd2\x94\x1d\xe1\x36\xc1\xf0\x1e\x88\x3b\x23\x44\xe9\xc5\x29\xb4\x65\x95\x4d\x81\x55\xef\xe5\x73\xd1\x92\x46\xd3\x0f\xf2\x47\xe5\x6d\xbb\x71\xa9\x2b\x0f\xbb\x50\xdb\xae\x5a\xc0\x21\xae\xe1\x49\x73\x9d\x14\x3e\xca\x00\xfc\x1b\xcf\xf0\xb3\xac\x0a\x5d\x27\xf7\x8f\x37\x38\xdc\x93\x1f\x9a\x54\x6d\xc4\xe8\x9a\x37\x7b\x6e\x67\x5b\xd4\xf4\xd6\x75\xcc\x7b\x26\xcb\xe5\xc7\xe3\x4d\x5e\x1f\xd5\x46\x7b\xaa\x29\xa7\xca\x30\x67\xa1\xe8\xa1\xe8\x27\x1c\x4d\xc3\xaa\xf8\xc2\x7b\x42\x48\x44\x42\x36\x54\x4c\x8e\x4b\x8e\x89\x86\xa1\x8e\x47\xdb\x98\x9a\xc2\x2a\x57\x9c\xc2\x0f\xfd\x25\x32\x9b\x0f\xbb\x54\xa1\x88\xb4\xb7\xe4\x84\xd5\x16\x86\xf9\x0b\xe2\x1d\xa6\x67\xba\x31\xd1\x2e\x64\x16\x27\xc5\x73\x5d\xed\x35\x61\x0f\x5d\xd8\xc6\x59\xe0\x00\xcf\x7d\x61\xbe\xe7\xc7\xb9\x54\xd6\xcd\x8a\x30\x36\xe2\x84\xc4\xed\x32\x16\xd0\x07\x21\xbd\xe7\x88\x57\x25\x8e\x30\x1e\xaa\x46\x2e\x5d\xcf\x5a\xe4\xbb\x2b\x16\x53\xb4\xa7\x91\xa1\x7f\xb2\xd4\xbe\xe1\xf1\x4a\xab\x32\x9d\x4f\xc2\x79\xe6\x92\xba\xa1\xf5\xb7\x62\xc4\x42\x93\x55\xcf\xd3\x0f\x45\x15\x16\xe5\x12\x89\x2c\xc4\xd1\x02\x95\xd9\x6a\x69\x60\x89\x77\x2f\x75\xa2\xd9\x09\x69\xea\xf4\x54\x37\x92\xcb\x4e\x8b\xf5\x07\x2d\x72\xf2\x2f\x04\x1b\x14\x32\x61\x38\xe2\xf0\x4d\xf3\xf4\xf5\x89\xc6\xbc\x3e\x18\x2e\x69\xec\x92\x69\x3a\x27\xbd\xc2\x2c\xc9\x38\x86\x98\x1c\x45\xfb\x29\x83\x64\x3b\xfe\xcf\xe5\x32\xba\x9a\x5d\x57\xcf\xa7\x71\x59\x6c\x10\x8b\xc1\x08\xf6\x59\x34\x9a\xf6\x5a\x64\xea\xf0\xd6\x6f\xb4\x19\xe4\xef\x37\x10\xc3\xd1\x85\x59\xc6\x2f\x49\x63\x1f\x83\x25\x93\x69\xf9\xcd\xb1\x65\xfc\xbe\xcf\xd0\xb2\x12\xc2\x64\xe6\x2d\x49\xd1\xf3\xcf\x28\xb5\xb4\x9c\xca\xa2\x6c\x6d\x37\x22\x7c\xb4\xa2\x92\x7f\x38\x46\x4a\x01\x7f\x79\x38\xe4\x16\xa0\xf2\x5e\x8b\xba\x14\xf0\x79\xc9\x48\x41\x8c\x89\xb5\xd1\x58\x93\x12\x18\x3f\xa2\x85\x04\x4c\x65\x78\x9f\x1a\x7d\x00\xb6\x56\xc9\x52\x85\x8c\x09\xbf\xd2\xaf\x29\x0d\x13\x2d\xe4\x91\x33\x96\xd6\x0c\x8e\x99\xd2\x75\x9d\x8c\x7b\xbf\x0b\x2d\x2f\x13\x8e\x93\xa7\xa3\xbd\xc9\x22\x8e\x4a\x7a\x42\x13\xfa\x46\xa4\xf4\xac\x1f\x60\x65\x9a\x48\x4f\xeb\xa1\xe3\xdf\xc4\xe3\x68\x2f\xbc\x51\xe4\x4d\xe9\x73\x9e\xf5\x45\x17\x54\x1c\x74\x78\x18\xa5\x91\x47\x08\xeb\xc7\x3e\x71\x20\x40\xac\xcb\x9c\x29\x9f\x58\x43\xce\x7c\x3f\x6a\x80\xac\xfe\x24\xaf\x62\xa1\x8a\xc4\xab\xe8\x1d\x39\x6d\xf5\x42\xc3\x2d\x8b\x14\x09\x4d\xb7\xa4\xdb\x76\x06\xe1\xa3\xf1\xac\xf9\x3e\xa6\x0a\x0b\x92\x35\x30\x60\x44\x52\x54\x7d\xdd\x98\xb3\xc2\x91\x7b\x32\xdd\x36\xb8\x1d\x09\xee\x03\x50\x64\x1b\xde\x39\xb1\x50\xdc\x3d\xbe\x09\xc9\xf8\x07\x7a\x1d\xf5\x2d\x33\x3a\xfe\x26\x5f\x0e\xeb\xaa\xe3\xe6\x93\x08\x99\xc8\x69\xcf\x88\xe9\x89\x10\xc2\x44\x8e\xce\x09\x8d\xca\x71\xc9\x30\xdf\x52\x3b\xdb\x40\xd0\x3e\xd6\xb6\x5a\x0d\x52\xf3\xb1\xab\x0e\x4b\xba\xc2\xb0\x7b\x5b\x84\xe4\xb3\xeb\x16\x57\x34\x16\x4a\x03\x41\xc8\x14\x96\x0b\x0a\xf6\x09\x0e\x19\x47\x24\x95\xaf\x37\x71\x71\xc8\xc2\xf4\x4a\xd3\x7f\xf9\x25\x37\x5f\xa5\xef\x42\x77\x35\x5e\xf9\x2b\x60\x0a\xc6\x1e\x24\xc7\x53\xd9\x18\x5e\x3c\x07\x09\xbc\xed\x2a\x4b\xdb\x6e\xb5\xd2\x11\x8c\x41\xe8\x32\x90\x6b\x8f\x00\x76\x2c\xa3\x63\x26\xa3\x35\x92\x59\x37\x5b\xfc\x7e\xa1\xf1\xa4\xf6\x7b\x7f\xda\x2d\x78\x97\xb2\xb8\xa8\x58\x33\x30\xa9\xb9\xd2\x34\xbd\xae\x84\xb4\xb6\x07\x61\xdf\xef\xac\xd5\x1d\x34\x11\xd9\x68\x84\x94\xfd\x19\x56\xdc\xe0\x26\x02\xbd\x46\x72\x31\x78\x68\x66\x7a\x0a\x41\x86\x1a\x2b\x6a\x83\xff\x8e\x79\x26\x48\xd9\xcd\x56\xa3\x5a\xc4\xa8\x8a\x15\x60\x53\xa0\x6f\x37\x29\x9e\x24\xe1\x09\xbd\x4d\x73\xa4\x59\xfc\x7c\x31\x79\x79\xe1\x97\xbb\x2f\x0b\x37\x87\xa3\xaa\x6a\x9d\x08\xb5\x94\x64\xcb\x55\x0e\x5d\xfb\x21\xd8\x37\x95\x22\x51\xab\x8c\xbe\x02\xc3\x19\x45\x82\xd6\x94\xda\x50\xe7\xdd\x80\xcd\x6b\x49\x4c\xfd\xb7\x56\xc6\xda\x2f\xb6\xf7\xeb\xcf\xe8\x52\xea\xc7\xde\xe1\xb2\xca\x08\x06\xed\x97\xad\x58\x07\x6d\x2a\xe4\x85\x18\xd8\x55\xe9\xd6\x31\xe6\x1e\xc7\x0c\x90\x1b\x99\xa7\xc6\xcf\x4e\x46\xf4\x0c\x5d\x6b\x90\x58\x72\x8f\x27\xae\x4f\x6e\x6a\x30\xb0\x0e\x91\x1e\x81\x70\x64\x77\x99\x31\x0a\x9c\xe4\xfc\x38\xf5\x82\x67\x64\x80\x47\x5f\xab\x90\xa7\xa9\xe9\x5f\x75\x2e\x12\x03\x8d\x4b\xb2\xd0\xca\x7c\x18\xe6\x2c\x4a\x50\x52\x1f\xe7\xbd\x1f\x48\xa4\x3e\x6c\x42\x0e\x40\xde\x1c\xa6\xf7\x0a\x0a\x7e\xce\x58\x81\x6d\xd6\x7b\x46\xda\x47\x11\x4c\xe3\xe2\x1e\x47\x4d\xbf\xe3\xfb\x69\x12\x88\xe2\x3a\x7f\x1b\xeb\x4b\x21\x50\x38\xdc\x65\x3c\x92\x95\x3e\xdf\x4c\x46\xb2\x56\x76\x8c\xa8\xf5\x80\xcb\x83\x85\x58\x8f\x12\xe5\xd3\xd0\xc8\x24\xa4\xfc\xf4\x83\x30\xdb\xb9\xc3\x7b\x8b\x03\x06\xdb\x1f\x63\x38\x0c\x8b\x9a\x64\xf8\x32\x7e\x82\x6e\x6b\x6c\x3c\x81\xf6\x5d\x52\x53\x7c\xf4\xc2\x48\x29\xf6\x48\x90\x95\x62\x95\x3f\xb4\x4b\x8f\x03\x08\x5a\x1e\xc3\x3a\x98\x9a\xd0\x5c\xe5\x3f\xd2\x88\x0d\x97\xe8\xf3\xcc\x62\x71\xd4\x2a\xf3\x40\x04\xb5\xbb\xcc\x09\x46\x36\x0b\x86\x04\x95\x0e\x21\x5b\xff\x58\xdc\x4d\x29\x0c\xc1\x13\x42\x50\x6c\x65\x22\x19\x0c\x21\xba\xda\x04\x17\x37\x4c\x14\x28\x9d\x29\xc8\x17\x70\x34\x11\x5e\x92\xbd\x87\xa9\x03\x5a\x00\x2f\x34\x89\xb3\x5c\xbd\xce\x15\x8b\x18\xe3\xc2\x53\x09\xe9\xb9\xdd\x84\x2b\xf3\x5d\x35\x19\x75\x6c\x51\x70\xb1\x77\x5c\x98\xf0\xf3\x6f\x3b\xaf\x3b\xd3\x0d\xd6\x5d\xb5\xfe\x6e\xc8\xa7\xc4\xb4\xb8\xf2\xe2\x77\x32\x4a\xca\xa8\x43\xf3\xd4\x60\x4d\x74\x46\x72\x0c\x21\x45\xd3\xaf\xd5\x52\xf3\xaf\x5d\x70\xfd\xe2\x29\x34\xb8\x52\x6a\x33\xe5\x96\xda\x12\xe6\xc9\xa6\x3e\xdd\x8e\xb4\xc5\xe5\xa4\x8e\x8a\x5d\x09\x4d\x84\x85\xca\xce\x88\x89\x44\x3c\x36\x17\x27\xb2\xc8\xa2\xd9\x34\x44\x58\x04\xde\xde\xd2\x35\xae\x93\x58\x21\xb6\x00\x51\xe4\x3b\xa1\xca\xc7\x4f\x17\x30\x59\x19\x4e\x61\x2b\x39\xb6\x15\x2a\xa6\x02\x69\x48\xdf\xe9\x23\x82\xde\x63\x34\xe3\x88\xf0\x5c\x2c\x91\x56\x30\xf6\x07\x2b\xcb\xe7\x93\x3a\x43\xb2\xdc\xc8\x2b\x4c\xb8\xd2\xe5\xd3\x38\x22\xa1\x70\x25\xc4\xe1\x64\xbf\x04\xfc\x78\x29\x03\x25\x02\x55\x7f\x1d\x1a\x05\x65\x16\x74\x9f\xd7\x8e\x90\x96\xf1\x41\xfa\x0c\x5a\x9f\x46\x22\x1d\x06\xc2\x7d\x7c\xa0\xe4\x41\xd0\x95\x03\xe0\x40\xeb\x72\x59\x1d\x96\xe6\x0b\x47\x2a\x35\xd0\x8b\x6a\xb6\x17\x71\x5c\x99\xfe\x80\x45\x92\xe4\xa8\x8e\x92\xde\x36\x5a\x42\x74\x8b\xa5\x4d\x22\x7e\x4e\x4a\xc6\xa3\xa5\xdd\x47\xb7\x0c\xeb\xe3\x87\x88\x02\x25\x23\xbc\x2c\x16\xe4\xc6\x86\xe5\xf9\xa8\x9a\x6f\x6e\x75\x43\x8c\x98\x81\x34\x2c\xef\x21\xc6\xbf\x40\xd4\x9d\x75\x5e\xfd\x9a\x88\x5e\x5c\x5a\x57\x49\xef\x3c\x4d\x93\x43\xed\x1e\x9e\x5f\x8a\x27\x12\x49\xe0\xfd\x03\xaa\xd9\x0e\xca\xef\xe8\xa4\xf7\x20\xed\x82\x39\x27\xba\x2f\x7c\xe9\x13\x95\x23\x65\x7e\x69\x52\xc1\xa1\xc2\x9a\xf2\x8d\x04\xb7\xbd\x5e\x1a\xa2\x31\x57\x44\xd3\x5e\x01\x17\xbe\xdf\x4e\x09\xe4\x94\xb3\x40\x80\xae\xd2\x81\x56\xa1\x04\x98\x02\xe6\xd6\x81\x75\xd7\x5d\xda\xfa\x9c\x85\x81\xb0\x8d\x90\x04\x09\x6c\xd2\xcd\x85\xfd\xce\x63\x18\x30\xe6\x13\x4a\x3f\x7e\xd1\x55\x53\x60\x26\xe8\xbb\xd3\x73\x64\x5a\xc2\x88\x44\xbf\x46\x29\xf3\xe4\x3a\xbd\x82\x44\xb9\x21\x77\x4a\x1c\x1a\xba\xf1\x5d\x09\x95\x45\x7d\x2c\xc8\xd1\x2b\xa6\x9b\x2c\x6d\x51\x22\x47\xb9\x5b\x16\xd4\xde\x31\x31\x48\xbd\xfe\x96\x0f\xb5\x8b\x13\xa6\x1c\x55\x23\x59\x7b\x82\xad\x86\x32\xd0\x3e\x57\xf9\xfd\xa4\x9f\xfd\x54\xb3\xaf\xc1\x3f\x59\x69\xd3\xea\x37\x07\x2f\xe8\x4a\x85\x86\xbd\x60\xd6\x31\x01\xf2\xc0\x23\xf0\x9c\x59\xb6\xcc\xc8\xde\x03\x08\xfd\x12\x87\x14\x4a\x85\xb1\xee\xac\xed\x07\xd1\xfe\x23\x01\x01\xa4\xf9\xe8\x06\xcf\x8b\x05\x77\x71\x56\x84\x24\x7a\xdb\x5a\x38\x14\xa9\x54\xce\x2d\x9d\xc8\x2c\xc9\xf9\x38\xc8\x68\xa6\x1a\xe6\xba\xcd\xad\x8a\x63\xed\x4a\xd3\x30\x3c\xb6\xcc\x82\x54\x01\x0d\x8f\x80\x63\x22\x7a\xe0\xa8\x98\x35\xd6\x76\x16\xd7\x00\x11\xed\x25\xe0\x84\x98\x6d\x04\x1e\x05\x89\xfa\x01\xac\x6b\x1f\xb6\x82\x20\xc0\x26\x3b\x3f\x42\x9b\xf9\xd4\x87\xbe\xfc\xd3\xee\x88\x3d\x80\x4d\xaa\x93\x83\xc7\xc3\x5b\x79\x73\xb0\xbb\x39\x20\x30\x8e\xab\x6b\x3e\x90\x87\xe4\xa3\x74\x45\x56\x72\x44\x34\xb2\x01\x5b\xf4\xeb\xb3\x04\xd4\x8f\x00\x66\x23\xa0\x02\xc8\x6a\xae\xad\x9c\xb6\x27\x2c\xa4\x00\xef\x38\x2d\xf2\xc3\x4d\x7a\x00\x5a\x86\xfd\x8d\xd6\x24\xd9\x9f\xfe\x83\xee\x57\x5a\x25\x16\xdb\x2c\xf4\x8d\x78\x4a\xb4\x19\x34\x7b\xe8\xa5\x7a\x7f\x51\xca\x51\x99\x7d\x74\xa3\x7d\x95\x2d\x6d\x02\xad\x14\xa0\xfa\x04\x6d\x90\x7c\x9a\xf8\xe1\x58\xb4\xe4\xe9\x5d\xb7\x95\x00\x5b\xc1\xe1\x7a\x3b\xf0\xe7\x36\x67\x03\x86\x08\x24\x54\xce\x05\x0e\xf8\x02\x61\x10\x58\xbf\x84\xfb\xdd\xba\x31\xf0\x22\x21\x15\x4b\x2e\xfc\xaa\xe5\x49\x49\xe1\x45\x87\x9d\x9e\x23\x8a\xad\xb2\x9e\xae\x21\x14\xe1\xad\x8c\x45\xa9\xb0\x4a\x76\x8a\xe3\x4e\x84\x61\x92\xf6\xd2\x53\xe3\x91\x35\x38\xf3\x98\x11\x1c\x77\x24\xe9\x46\x1a\x4a\x47\x4a\x30\x1b\xca\x7e\x25\xef\x56\x9c\x74\xe6\x9b\x3a\xfe\x0a\x25\x73\x9e\xec\x04\x0c\x7f\x97\x08\x39\x0d\xc2\xc5\xba\x2c\x1c\xf3\x2b\xa5\x86\x82\xc6\xea\x28\xe4\x43\x01\xa9\x2c\x96\x97\x22\x9c\x7e\xee\xdf\x38\xbe\xc4\xe6\x62\xae\x30\x31\xc6\x45\x9f\xbb\xf0\xc9\x4c\x62\x16\x60\x98\x8a\x01\x14\x98\xbe\x7b\xc3\x22\xa0\x7c\x6a\xa0\x2c\xa7\x2b\xba\x3a\x86\x2a\x6c\xbd\xb0\x0c\xb3\x60\xd1\xdd\xf2\xea\xd7\x89\x48\x0c\xdc\x81\x5f\xb3\xa2\x8c\x72\x77\xbd\x2d\x79\x74\x81\xcf\xdf\xba\x01\x16\x54\x47\xbe\xa9\x1c\xc0\x5b\xfd\x72\xec\x49\x77\xbd\x74\xc0\xab\x77\xad\x22\x4c\x76\xc3\x1c\x7f\x44\x47\xe3\x71\x0b\xdc\x9c\x9b\x7a\xbb\x64\xc3\xa2\xd2\xa7\x74\x40\x6b\x6e\x06\x8b\x36\x98\x44\x1e\xda\x6c\x7d\x16\x87\xb8\x0e\x44\xd0\xa6\x1e\x27\x82\x02\xf1\xbe\x86\xc7\xc9\xb1\x86\x82\x98\x49\xa7\x6b\x11\x84\x25\x93\x83\x14\x48\x06\x6d\x3d\x85\xfc\x78\xcb\x13\xcf\x51\x2b\x3e\x1f\xcd\xc0\xc6\x0f\x1e\x10\xac\x37\xa2\xf1\xb3\x6a\xa6\x67\x45\x3b\xd2\x6b\xf5\x40\x4a\xd1\xe4\xbd\x5f\x2f\xec\x11\x96\xca\xd2\x50\xf8\xc2\x35\x70\x6e\xa8\xb4\xa2\xb0\x24\xa2\x70\x6c\x94\x50\x96\x6e\xde\x8a\x7a\xc4\xfa\x0b\x2b\x47\x8b\x30\x1d\xe8\x0c\x20\xa6\x18\x3b\xf9\x36\x0d\xd3\xcf\x5b\x44\xeb\xea\x40\x50\x14\x45\xc9\xae\xa8\x0e\x9e\x7e\xee\x5c\xdc\x42\x5b\x3a\xed\x59\xf0\x24\xf1\xc6\x48\x27\xd9\x2c\xb0\x63\xd1\x04\x04\x68\x93\x13\x55\xe0\xbe\xae\xfd\x81\x6e\x17\xec\x4d\xd4\xed\x52\x4e\xf9\xc2\x33\x6e\xa4\x69\x93\x6b\x65\x48\x08\x67\xb1\x73\x93\xcd\xf4\x67\xbf\x7f\xa1\xba\xcf\x9b\x6f\x9e\xce\x1c\xfd\xa0\xc3\xc4\x1d\xc1\x06\x58\x5c\xe4\x13\x89\x40\x9a\x75\xd3\xed\xce\x9c\x0d\xbf\xd4\x35\x9e\x5d\xe9\x47\xb4\x11\xf9\x16\xc5\x69\x74\xdd\x2d\x71\x2b\x2d\x18\x3c\xa7\xe1\x55\x7e\xa7\x37\xcd\xd6\xda\xe3\x72\x8b\x9b\x30\xac\xb4\x14\xab\xea\xa7\x18\xc2\x8f\x7c\xe9\xe4\x1a\x61\x41\x1f\xfb\xe4\x34\x52\x5d\x23\xc2\x28\xe6\xa4\x03\xba\xf2\x2d\xdb\x17\x73\x1f\x0f\xf4\x24\xa8\x92\xe4\xa8\x93\xe1\xa2\xb2\x84\x7b\x52\x43\xea\x84\x00\xe6\x4b\x23\xe5\x0c\xa8\x8b\x31\x49\xa6\x41\xb5\x71\xca\xca\x6b\x1c\x75\x4c\x01\x6e\xf8\x38\x27\x0b\x32\x82\xc0\x8b\x0e\x53\x89\x57\xeb\x97\xe9\x9b\x62\xa3\x03\xbd\xd1\x7d\x18\x58\x22\x3d\x0a\x5b\x87\x44\x74\xdb\x82\x83\x56\xa7\x39\x17\xe1\x13\xd4\x0a\x11\x5a\x23\xe4\x81\xe2\xa2\xd3\xbd\xba\x0e\x6d\x90\xcb\x5d\xd8\x8e\x6e\x61\xff\x39\xcd\xb8\x32\xb3\x1b\x08\xee\xfd\xc2\xa2\x55\xbf\x92\xbc\xc8\x49\x6d\x1a\xc0\x9f\xe5\x94\x97\x4d\x5f\xec\x8c\x87\x1b\xfc\x03\x3f\xb0\xaa\xb4\xaa\x5d\xc0\x6a\xc8\x4d\xf0\xac\x1f\xdc\x23\x34\xab\x74\x8a\x9a\xf9\x5d\x6d\xfd\x33\xd7\x09\x42\x78\xbe\x8b\x49\xe9\xb7\xb4\xbf\x86\x0c\x15\xd9\xd0\xe4\x3e\xa2\xc8\xce\x4f\x55\x81\xde\xa6\xb0\xb7\x6b\x1a\xbd\x68\x5b\xe9\x07\xe4\x2a\xbf\x6a\xb2\x36\x1e\xf7\x27\x20\xdb\x6e\x8b\x22\x7d\x60\x81\x2f\x91\xe3\x1b\x4a\x74\xd0\x1f\x0e\x9a\x35\x75\xa2\x86\x34\xc7\x66\x0f\x7b\xc0\x88\xb2\x04\x9f\x16\x58\x76\x19\xc5\x59\xa5\x74\x31\x42\x3c\xc8\xe3\x3c\x25\xb4\x0a\xf3\x6f\x06\xf3\x9f\x2d\x75\x29\x4e\x02\x9e\x8a\xff\x3e\x98\x61\x29\xfe\x9f\x3e\xc3\xff\xe8\x2f\x5c\xa0\x0d\x92\x33\x2b\xfb\xfc\x6b\xff\x8b\x8a\xa8\xff\xd5\x84\xf7\x1f\xfd\x3d\xd9\x3e\x96\x18\x00\x28\x29\x8d\xb9\x2d\x7d\xbe\x40\x13\x7c\x8f\xd8\x6d\x46\x46\xd9\x5b\x06\x72\x18\x66\xa9\x14\x69\xbd\xff\x79\x7f\x91\xd8\x60\xaa\x1a\x8e\xf8\x8b\xac\x2b\xa0\x24\xc7\x79\xf7\x50\x14\xf7\xf4\x93\x43\xb5\x77\x53\xf8\x68\xd6\x3b\x8f\xa1\x27\x70\x3d\x57\x3c\xb6\x1a\x52\xa2\x3c\x60\x9c\x3d\xe5\x16\xec\x54\xdd\xdd\xc6\x4e\xec\x74\x7a\x41\x84\x76\xe2\x74\x42\xf0\xfe\x5a\x4c\x23\x3c\x53\x18\xfc\x70\xac\xe7\x90\xd9\x60\x8a\x7e\x26\xa5\x93\x54\x2e\xce\xab\xb2\x9a\xca\x12\x2c\xcb\x82\xc4\xa6\x17\xaf\x05\x0b\xd7\x86\x70\xed\x8b\xf7\xd7\x6c\xbc\xd4\xb3\x76\x86\x28\x7c\x0b\xfc\x5a\x9e\x14\xb2\xf5\xa9\x5d\x8e\x68\xa6\x7b\xd3\xab\xf2\x8b\x72\xd7\xed\x39\xbf\xe8\xb9\x4e\x4c\x3a\xc2\xa6\xa8\xa7\x82\xd4\x68\x1e\x3a\x24\x03\x60\x22\xec\x10\x2d\xf2\x60\xce\x25\x8c\x98\x2e\xad\xd8\x07\xac\xfc\x7a\x2c\x6b\xcb\x29\xfc\xdd\xa4\x18\x7f\xe4\x4a\x8b\x37\x49\xdb\x0c\x2a\xa4\xdd\xa3\x3d\x3f\x5c\xf6\x4c\xdf\x81\x87\xec\x95\x0e\x95\x98\xda\xeb\xa3\x85\x70\xdc\x95\xd4\x3c\x90\x9f\x96\xaa\x93\x5d\xb1\x1b\xea\xbd\x72\x5f\x8a\xa5\x0e\xee\x50\x4d\xa2\xa7\xf5\x6d\x22\x72\x29\x84\xad\x4b\xba\x00\x33\x77\x65\x2f\x97\xe5\x0b\xc8\xe7\x87\xc4\xf7\x71\x33\xf1\xe1\x4d\xf8\xba\x24\xd1\x38\x50\x45\x45\x9f\xc6\x9e\x2c\x29\x45\x0b\xcc\x06\x53\xf9\x0e\xcd\x78\x1a\x71\xaa\x4c\x82\x49\xa2\xa3\x77\x98\xf6\xd3\x71\x71\x79\xe3\x3a\x18\x79\xab\x63\xdf\x1b\x8b\xb2\x6f\x9f\x25\x38\xe4\x18\x18\xfd\x25\x6c\x92\x68\xa9\xc8\x67\x13\x5b\x76\x13\x34\x42\xe6\x6d\xcc\xbe\xdf\x91\x12\x94\x23\xa8\x5d\x94\xa7\x7d\x9a\xab\x2f\x8a\x54\x7b\x5f\x3f\x95\xa5\x68\xf4\x30\x63\x24\x86\xdd\xfa\x0a\x85\x3d\xb3\xbb\x57\x3f\xb5\x6b\x33\x66\x1d\x6b\x6d\x21\xc9\x4d\xc3\x01\xb6\x48\x2e\x8b\x80\xa9\xdd\xcc\x05\x79\xeb\x5a\x67\x1b\x06\x31\x0b\x77\x5e\xdc\x8d\x48\xd4\xe0\xc4\x92\x5a\x71\x5f\xea\x23\x01\x02\x89\x65\x00\x0f\x71\x9a\x86\x29\xfc\xe3\x19\xb4\x7b\x96\x2b\xfe\x68\x0d\xdc\x90\xee\x22\x86\x97\xd3\x61\x27\x05\x5f\x90\xbb\x4a\x38\x5f\xde\xd8\xf3\xc0\x75\x8c\x80\x31\xa7\x25\x82\xae\x90\x4d\x8b\xe0\xec\x3a\xa2\x94\x9f\xda\x33\x68\x41\x60\xe5\xf7\x17\xef\xb2\xe5\x13\x8e\x14\xcd\xca\xa4\xd0\xb6\x8f\xf8\x50\x81\x44\x37\x75\x42\xdf\xd5\x8a\x9a\xdf\x5e\xe7\x21\x83\x1d\x1c\x4a\xe3\xec\x09\xbd\xad\x9c\x7d\xf0\xb5\x6e\x31\xd5\x05\x82\xd6\xdf\x3b\x23\x3b\x37\x97\x9d\x2f\xfd\xa4\xc5\xb9\x29\xba\x78\x96\xc4\xde\x50\x27\xf6\x04\xa9\x59\x74\xf2\x85\xc8\x74\x4d\x60\xb2\x31\x27\xe3\x04\x0e\x05\x25\xbf\xa1\x70\xe9\x27\xeb\xc6\x56\x61\x78\x8f\x25\x15\x96\x20\x0c\x2b\x5f\xcd\xf0\xc7\xcb\x18\x97\x6f\x29\x9d\xbe\xdf\x61\xbd\xd3\xa6\xfc\xca\x9f\x0f\xd2\x37\x1c\xae\x79\xc9\x3c\x8d\xfc\xe9\xd7\xaf\x4c\xdd\xad\xd2\xe2\xab\x57\xae\x5e\x51\x41\xff\x20\xef\xad\x74\x31\x81\x43\xa9\x5f\x5f\x0f\x4e\x8c\x83\x77\xa5\x37\x54\x89\x83\x6a\x2e\xa1\xef\xf7\x5a\x98\xd4\xe1\xd5\x7d\x30\x2c\x86\xf4\x11\x17\xf9\x75\x9a\xdb\x0c\x93\xeb\xe7\xf9\x23\xa9\xf3\xf7\x5d\x16\x82\x8e\x55\xb9\xd0\xf8\x74\x81\x1f\xd9\x0b\xad\xdd\xaa\x9c\xb2\x2a\x53\x5b\xca\x7c\xcb\xd6\x4f\xbc\xbb\x4a\xab\xd4\xcf\xd3\xe0\x92\x23\xd8\x96\xe0\x2a\xce\x1e\xe7\x34\xcf\x8c\xaa\xe0\x0a\x1d\xdd\x30\x9d\xd2\x3b\x6d\xa7\x32\x8d\xd0\x28\xed\xcf\x4f\x95\xce\xe8\xf4\xd8\x7a\x00\x63\x39\x0e\x2a\x01\x28\x32\x34\xa3\xcd\xdd\x75\xbf\x60\x90\x40\xf1\x34\x48\x46\xd1\xe8\x2a\x92\xe2\x36\x25\x8c\x67\x28\x5e\x07\x44\x1e\x10\xd3\x0f\xe9\x2c\xbf\xa7\xd4\x38\x61\x7c\x7f\x73\x3a\xba\x99\xc8\x49\x46\x83\x69\xcb\xa3\x12\x90\xcb\x73\xb7\xae\x50\x66\x7c\x99\x81\x26\xb2\xbf\xf1\x03\x87\x86\x84\x0a\xc5\x53\x61\xb7\x67\x8b\x46\x73\xe2\x8b\x33\xb7\xce\xa2\x2a\x97\x07\xb8\x1c\xab\x32\x4b\x3e\x07\xd4\x05\x93\xda\x94\x55\xe9\xb6\x25\x1a\x13\xa8\x9f\xb0\x17\xb3\x2a\x07\x49\x79\x83\x3c\x74\x5c\x41\xf4\x02\xa5\x04\x34\x86\x2a\x9a\xaa\x09\x93\x9e\x3a\xc9\x79\xd1\x03\x87\x09\x2c\x23\x16\xca\xa5\xe1\xae\xac\x9f\xd3\x66\x77\x93\x3e\xb2\x1c\x97\x35\xa3\xa6\x31\x17\xde\x72\x56\xab\x86\x2c\x68\x11\xc5\x59\x54\x5c\xd4\x4a\x57\xa7\x1f\x93\x44\x75\x03\x70\x22\xe6\x48\xaa\xd2\x1b\x4a\x4f\xf9\x2d\x6f\xb6\xf6\x71\xbb\xa4\x5b\x76\x8b\x5a\xf5\x2f\x63\xe3\xde\x98\x29\x6c\xa4\x19\x28\xe7\xa1\xaf\x9b\xe1\x92\xa5\x49\xa7\xc8\xb4\x06\x4b\x6a\x8d\x1a\x2f\xe3\x4f\x99\x5b\x7f\x71\x7b\xd8\x0d\xdf\x43\xb0\xbb\x42\x11\xf4\x82\x63\xe4\x55\xf6\x3c\x75\x59\x7e\x0e\x14\xc6\x11\xb4\x3f\xee\xba\x3f\x69\x16\x6b\x59\x26\x54\xa3\x79\x21\xce\x96\xc5\xdd\x9e\xdf\x3d\xfc\xc1\xf0\x6b\xa4\xa8\x50\xc8\xa7\x48\x83\x0c\x01\x7e\x0f\xf8\xa8\x15\xa1\x5d\x77\xbf\x61\x91\x86\xc9\x1b\x61\xd9\xac\x00\xdd\xbd\xc3\xa8\xec\xb0\x38\xfc\xcc\x29\x27\xcb\x85\x72\x3d\x14\x82\x8b\xb6\xca\xa9\xa5\x4a\xbf\xec\xae\x88\xa8\x82\x9d\x0e\x5b\xda\x33\xc0\xf8\xd1\x62\x48\xf4\xe3\xe6\x66\xcf\xe8\xe4\xd1\xc0\x55\x6d\x75\xbd\x73\xf1\xda\x1e\x11\xe8\x80\x5f\xe5\x83\x71\x6a\x10\x26\xfa\x40\xea\x87\x44\x78\xdc\xeb\x12\xa9\x41\x60\x78\xe9\xea\xa5\x63\xa2\x74\x60\x22\xb5\x69\x6d\xeb\xe1\xfa\x21\xf5\x71\x44\xc5\xe5\xe6\xc7\x3c\x91\xbe\x4b\x42\x3a\x29\x1f\x46\xc3\x6e\x6c\x47\x0a\xed\x25\xaf\x9b\x48\xca\x85\xea\x4c\x85\x24\xd3\xac\x40\x6f\x29\xb8\x9a\x19\xd2\x83\xd8\xea\x51\xe1\x43\xe9\x30\x26\x73\x0c\x5b\xf3\xc2\xcb\x27\x08\xe3\x5c\x4c\x9c\x29\x0c\xa5\x61\xcc\x93\xd7\x0b\x50\x03\x09\xc0\x4a\xca\xeb\x18\x63\x6a\x58\xa5\xa5\xac\xec\x7c\xcc\x78\x38\xab\xf4\x3a\x22\xf0\x0d\xa3\xf8\x49\x26\xc7\xb8\x8f\x53\x35\xd6\x77\x90\xac\x42\x10\x53\x74\xea\x1e\x21\x7e\x84\xd7\x08\xa6\xe3\xf7\x4f\x63\xea\x8f\xc3\xbb\x99\xb8\x66\x34\x86\xa7\x18\x96\x61\x38\x86\xab\x19\xd3\xe6\xf4\x3f\x86\xbd\x9e\x11\x59\x86\xf9\x31\x4c\xd4\xa5\x4d\xa2\x1b\xde\xae\x32\xa2\x12\x58\xdc\xb3\x2a\x8d\xc6\x3c\xfa\xb6\xac\x91\xde\x7a\xd7\x5b\xc7\x91\xb4\xe5\x9c\x34\xf7\xc3\x02\xa9\x2e\x13\xb4\x7b\xc1\x84\x02\x0c\x8a\xc6\xc7\x3f\x76\xf5\xe0\x4c\x97\x03\x35\x74\x46\x53\x4d\xa0\x1c\x13\x0f\x3d\x92\x02\x63\x74\x9d\xa7\x67\xa2\x0c\xc2\x18\x32\xd6\xb0\xed\x9b\xb3\xb2\xa5\x64\x3b\x96\x18\xdb\x9e\xee\x0a\x06\x6f\x98\xd3\x21\x02\xd3\xc9\x7e\xee\x7a\x14\xab\xfd\xda\x9c\x7a\x73\x12\x10\x84\xb7\x59\x9b\x89\x71\x9b\x21\x0e\xa2\x5d\x32\xc5\x69\x1c\x63\xa9\xb7\xee\x66\xdc\x53\x1c\xe4\x56\xa8\x5b\xf2\x52\x9c\x32\xb3\x4e\x30\xa7\xea\x69\x17\x6d\x82\xd7\x81\x5c\xb0\x36\xd2\x0a\x7e\x3f\x93\x7a\x24\x7d\xe5\x19\xb2\x8e\x31\x16\x2b\xcb\xb3\xad\x5f\xdc\xcc\x4a\xd3\x89\x1c\x16\x13\x07\xa1\x3e\x9c\x1e\x5d\xcf\x7e\xeb\x7a\xe0\xcc\x01\xea\x7b\xc7\xe8\xd4\x75\x69\xbd\xc7\x32\x5f\xd4\xa7\x34\xd7\x9f\x5e\x18\xd3\x20\x90\xde\x88\xdb\xa8\x6e\x2f\x1a\xc9\x4c\xfa\x9d\x02\x64\xc7\xfc\x9c\x19\x53\x72\xf8\x43\x12\xfc\x09\x83\x4f\x06\xc5\x48\xc5\xf6\xb5\x5b\xd7\xc2\x4c\x7b\x3c\x88\x86\xcf\xc0\xa6\x47\xec\xfc\x23\x40\x14\xd1\x33\x8f\xc6\xa3\x93\xad\xff\x51\x19\x1f\xaa\xc1\x07\xe0\x54\xd9\x44\x90\x71\x6a\x73\xfd\xa0\x02\x8a\x01\xf7\x8a\x82\xa4\x60\xe4\x67\xfc\xa2\xa1\x8f\x41\x47\xd8\xd0\x12\x73\xbe\x16\xd0\xfb\xad\x87\x3d\x5f\x40\x6a\x07\x09\x1e\xde\xef\xcb\xd0\x2e\x42\x2f\x67\x73\xae\x5e\x3c\xe8\x97\x60\xd9\x9f\x39\xa4\x1e\xd8\x20\xcb\xfa\x1b\x1c\x7f\x13\xde\x0f\x4e\xea\x4b\x51\x8b\x6b\xe9\x66\x38\x71\x1e\x1b\x47\x0d\xae\xb6\x96\x0b\x82\xaf\x89\x1e\x9d\xf4\x81\x79\xf2\xb2\x63\xea\x69\xbe\xab\x96\xc5\x2a\x0e\xba\xff\x30\x99\xff\x61\x32\xff\xc3\x64\xfe\x87\xc9\xfc\x0f\x93\xf9\xff\x11\x93\x29\xdd\xff\x6b\x26\x13\xff\x7f\xcc\x64\xa6\xc2\x9f\x4c\xe6\xf9\x7f\xc8\x64\x1a\x32\x8e\xf7\xff\xdb\x4c\x66\xfc\x0f\x26\xb3\xe7\xb9\x6a\x49\xfe\x64\x32\xf5\xbf\x67\x32\x7f\xff\x3d\x1e\xbb\x08\x2b\xa5\xfe\xc9\x64\x26\xf7\xdf\x32\x99\xdc\x5f\x99\xcc\x46\x60\xa9\xf0\xdf\x4c\xe6\x8d\xfd\x3d\x93\x69\xff\x2d\x93\xf9\x0f\xdb\xf3\x77\x33\x8c\x44\xf5\x72\x41\xc6\x03\xf2\x6f\x26\xf3\x50\xfe\xca\x64\xe6\x58\xed\xfc\xc9\x64\x62\xcc\x5f\x99\x4c\xe7\xaf\x4c\xe6\xf2\x8f\x1f\x7e\xff\x83\xc9\x3c\x63\x0c\x52\x91\x7f\x33\x99\xd8\x1f\x27\xb9\xe2\x8f\xeb\xd3\xe6\x03\xe4\x84\xfc\xc9\x64\x6a\xf6\x5f\x99\x4c\x9f\x81\xd9\x3f\x99\xcc\x7f\xe0\x9f\xf1\x1f\x2f\x34\x88\x5f\xdd\x2a\xe1\x9f\x4c\xa6\xea\xff\x2d\x93\x59\xd5\x7f\xc7\x64\x86\xd5\x5f\x99\xcc\xa9\xf9\xaf\x4c\xa6\x28\xc1\xe9\xff\x8c\xc9\xbc\x82\xff\xdb\x4c\xa6\x91\xa9\x59\x20\x46\xa4\x79\x56\x25\x10\x81\x7b\x90\xb6\xd3\xe0\x00\x75\xac\xc4\x76\x93\x7a\x73\xed\xa9\x76\x2d\xf5\x31\x01\x3d\x8e\xff\x0c\x37\x9c\xea\xd9\x32\x29\xbf\xa6\xe3\x65\xce\x38\x73\x2d\x47\x98\x90\x59\x76\x30\x72\x7d\xdd\x06\x60\xa8\xaf\xd7\x9d\x9b\xb2\xb0\x8f\xe3\xdb\x39\x1e\x2e\x61\x75\x7e\xe6\x19\x49\x4c\x97\xe7\x37\xdb\x07\xbb\x04\xe8\x87\x5e\x25\x0f\x5e\xe1\x71\xfc\x00\xa2\xb0\xbc\x1c\xa0\x49\x14\xbd\xcc\xb2\xc4\x51\xb2\xce\xd9\xfe\x97\x63\xb0\xa0\x8f\xb0\x61\x1f\x36\x2b\x50\x56\xdc\x74\xa6\x85\x39\x9a\xf1\xb5\xd9\x4b\x80\xfc\x13\xe8\xd7\x86\x53\x3f\x77\x8d\x74\x91\x78\x47\xdd\x60\xab\x4f\x4b\xbf\xbe\x8b\xa9\xac\xa7\x9a\xf1\xf7\x53\x97\x4e\x8e\xbd\x6f\x8d\x84\x9d\x90\x5a\xe4\x0b\xdc\x28\xad\x95\xda\x7a\x4b\x26\xa8\x24\xcd\x07\x6c\x65\xb5\x66\xad\x56\x0f\x9c\xe1\x97\x56\xa5\xab\xda\xde\xe3\x97\xcb\x9b\x33\x57\x5f\x73\x10\x5e\x3f\x7e\x54\xa4\xe8\xbc\xab\x4d\x00\x8b\xa7\x3c\xe1\x47\xb1\x66\x25\xa1\x7c\xef\xeb\x60\xa9\x0f\x1e\x02\x5c\xc0\x01\xa8\x02\x1b\xa0\xcd\x77\xab\x52\xc7\x60\xa0\x00\xdc\x71\x5c\x7a\x31\x20\x6f\xf9\x04\xa8\x1d\xf8\x93\x41\xb0\x5f\xf9\x0b\x01\xac\x08\x9b\xd1\xc7\x39\x13\x58\xe7\x7f\x74\x5d\x4c\x84\xac\x49\xb3\xda\xdc\x80\x87\x36\x3f\xd5\xd6\x00\x5b\x70\x63\xef\x74\x6e\x3d\x90\x04\xc9\xb7\x9f\xfc\x3b\xbd\x21\x58\x54\x4e\xcc\xba\x04\x7f\xf1\xae\xee\x7e\x80\xbc\x11\xc5\xa3\x71\xe2\x3d\xb1\xf2\xdd\x89\x76\xae\x77\x46\xae\x77\x12\x2b\xde\xed\xdc\xdd\x6c\x23\x37\x3c\x2b\x37\xba\x2a\xf3\xa6\xab\xc9\x34\x36\xb4\xc1\x49\xf3\x5b\x13\x7b\xa5\x3b\x7a\xbf\xc6\xd1\xcf\xc4\xf5\x34\xc2\xe5\x2c\x65\x0d\xbe\xc8\x3a\xde\xc0\x53\x4b\x1e\xfb\x5a\x87\xcf\x0a\x72\xe9\x0e\x07\x22\x11\x52\x42\x65\xbb\xfa\x29\xf1\x62\xdb\x8f\xd7\x39\xad\x66\x01\xbe\xad\x0e\xa7\x4e\x46\x9c\xa4\xaa\xba\xaa\x28\xf3\xde\xc7\xdc\xaf\xc4\xc0\x47\x9a\x9b\x16\xbc\xdb\xcc\xac\x6e\x0d\xc4\xab\x67\x6a\x59\x75\x57\x51\x3d\xb6\x1d\xaf\xa1\x21\xdb\xdc\x7c\xdb\x99\xda\xe2\x2d\x15\x61\xbe\x5b\xa2\x95\x24\x58\xf8\x45\xb1\x57\x46\xb6\x5d\x96\x77\x43\x1d\x8d\x8e\x5b\xc2\x64\x5f\xec\x64\xb7\x37\x29\xc4\x98\xa7\x56\xf5\xd4\x97\x89\xa8\xbb\xf4\x5a\x56\x52\x38\x20\x2c\xce\x25\x71\x94\xa1\xd3\x33\x34\xf9\xa5\x20\xb6\x40\xa1\xe1\x10\x09\x83\x99\x37\x2e\x96\x76\xfe\x67\x28\x02\xbc\x8d\xc9\xb1\x90\xda\x08\xe1\x63\x22\xe5\x9f\xe2\xb7\x1f\x5f\x90\x42\x8e\x52\x3f\x0d\x9e\x14\x18\x3e\xb9\xa9\x54\xd9\x24\xfc\x55\xf3\xf1\x99\x2d\x0e\x4f\xaa\x08\x4f\x6c\x4d\x7c\xf9\x2f\xc8\x76\x3e\xc8\x56\x5d\xae\xde\x6b\x41\xf6\xdf\x46\xa0\x4a\x37\x54\xc0\xcc\x15\x37\x8a\xbc\x93\x2c\x58\xcb\x46\xa6\x6b\x76\x1a\x54\x04\x12\x7e\x7a\x1a\x94\x09\x24\x8c\x5f\x95\x2a\x47\x42\x14\xe0\xe1\xde\xb7\x58\x79\x58\x51\x1b\x58\x57\x94\xfb\xa3\xd5\x97\x26\xa1\x53\xf9\xa8\x22\xc1\x08\xa8\x02\x8b\xb0\xac\x0e\xa4\xf4\xd5\xaf\x73\x1a\xb5\x1e\x45\x91\x6a\x64\x09\xeb\x2c\x09\x9b\x98\x26\x76\x05\x27\x7a\x24\x33\xef\xd3\x86\xf5\x6a\x7c\x4e\x45\x0e\x16\x1a\x09\x16\x12\xd5\x0f\x57\xd2\x89\x97\xdc\x5f\xf5\x20\x89\x1c\xa7\x6a\x72\x75\xb9\x09\x2e\xce\xad\x96\xe1\xf4\x46\x72\x78\x55\x68\x36\xf3\xb0\x25\x7f\x2e\xd5\xdd\x52\x5c\x3f\x12\xb5\x76\x7e\xc3\x3e\xf9\x2a\xdf\x0f\xb6\x96\xd5\x7e\x8a\x1d\x27\xc2\x1c\xf9\xe4\x9a\x42\x03\xcc\x12\x01\xd5\xee\xfd\x86\x8a\x3d\xe0\xb7\x6e\x31\xb9\x53\x2e\x2e\x55\x31\xa3\xe2\xe1\xa3\xab\xae\x85\x81\x1b\x0d\x09\xbe\x5a\x62\x84\xba\x94\xc7\x9c\x3d\xd1\xd2\x69\x92\xe8\xbe\x1b\x6b\x46\x91\x4c\xfc\xe4\x6d\x9f\x45\xa7\xad\x3c\x3a\xbf\x20\x6d\xf9\xcf\xd9\xc7\xac\xfd\xde\x2d\x0d\x9d\xe4\xfd\x0d\xe3\x89\x17\xa7\xe7\x11\x54\xea\x74\x6d\x45\x67\xab\x91\xbb\x70\xaf\x2a\xc8\x6f\x61\x46\xeb\x87\xcf\x13\xc5\xb9\xa5\xdd\xfd\xba\x72\x4e\x9d\xcc\x34\x96\xcc\x34\x4e\x93\xec\xf4\xab\x78\x0a\x11\xb9\xec\x2f\x81\x0b\xac\x26\x24\x6a\x84\x3a\x40\xcd\x9c\x48\x96\x7e\x44\x30\x38\x69\x83\x0c\x96\x85\xa9\x64\xa4\xff\x6e\x30\x84\x1e\xf3\xdb\x90\xb8\x27\xe6\x4f\xee\x7b\xea\x03\xe5\xa1\xdf\x08\x20\x68\xd2\x44\x37\xa0\xf6\xc9\x92\xb8\xda\xfb\xa5\x18\x3a\xe0\x8d\x18\x54\x55\xba\xbd\x56\x4d\x17\xbe\x5e\xf2\x7a\xa7\xe1\x71\x37\xb4\x3f\x20\x40\x4c\xd7\xd2\x80\xe6\x21\xdb\x0c\x15\x69\x0c\xa4\x35\xe0\x73\xa0\xb6\x22\x27\xe9\x10\x2f\x96\xdf\x01\x2d\x05\x71\xa5\xa0\xdd\xa0\x29\x67\x11\x6d\x56\xcc\x3d\xbd\xb5\x64\xb2\x8e\x00\x19\x5e\xd5\xaa\x5d\xeb\x7a\xa5\x44\x59\xc2\x12\x4e\x3b\x2f\x38\x3b\x76\x1e\x9d\xbe\x74\xa2\x0a\x0c\xc5\xf4\x83\x19\xd4\x60\x14\x43\x49\x8e\x21\x81\x9c\xb4\x6c\xe4\xf7\x95\x93\x25\xbe\x91\x0d\x89\xca\x59\x95\x6f\x91\x62\x9d\x4c\x55\x7c\x34\x74\x45\x9a\x45\x1e\xd1\xe5\x82\x39\x7e\xe4\x2f\x80\x0d\xf0\x2b\x23\x40\x05\x10\x17\x39\xf2\xdb\xd5\x6d\xfb\x49\xe3\x15\x79\x80\xe7\x0e\x50\xe6\xaa\x57\xda\x78\x51\x9a\x45\x85\x3c\xc8\x06\xe0\xb8\x80\xcd\x0c\xbe\x14\xf8\x1c\x15\x3e\x56\xc4\x51\x11\x3a\xd8\x90\x60\x84\x02\x4e\x04\x34\x24\xc9\x6e\x60\xb4\x81\xb9\x09\xbc\x21\x88\x7c\x11\xb1\xa1\x80\x88\x02\x49\x45\xcb\x1b\x58\xc9\x20\x27\x83\xac\x08\xde\x0b\x88\x64\xe0\x81\x82\xd1\x05\xf8\x17\xd3\xc8\xd4\xc6\x51\x22\x93\x3c\x73\xa8\xce\xde\xf2\xe3\x3e\x8b\xe3\x53\x61\x84\x95\x08\x9f\x3d\x32\x97\x4a\xcc\x6c\x29\xed\xdd\x79\x3d\x97\xe9\x54\x68\x28\x4d\xa2\xa4\x2e\x16\xf5\x54\x58\x20\x43\x4f\x19\xf8\x88\xa3\x2a\x96\x60\x4c\xdd\xb0\x2c\xb2\x91\x1c\x93\xb2\x8d\x37\x01\x91\x3b\xd9\xba\x69\x57\x95\xb5\x58\x64\x2b\xf8\x13\xbf\xa3\x16\xc9\x53\xf8\xf1\x29\x35\x4e\xe8\x67\x9d\xba\x48\xea\x9c\x11\x78\xa2\x56\xa3\xdc\xa7\x0b\x31\x18\x76\xcf\x8f\xf8\xa4\xd5\x1b\x54\x60\xc9\x97\xe0\x39\x2a\x39\x6f\x74\x39\x2d\xb5\x12\xe9\x9f\xeb\x57\xc1\x90\x85\xe1\xde\xf3\xe4\x8f\xf7\xe5\x49\xf0\xac\x91\x74\x90\x8d\x88\xb3\x59\x17\x54\xc8\x37\xed\x97\x10\x4a\x17\x60\xcd\x37\xd9\x19\xa7\x01\x83\xe1\x8d\xaa\x91\x94\x5d\xb1\x8b\x81\xa8\xd4\x45\x10\xfe\x47\x92\x63\x12\x3d\x3a\xad\x76\x31\x51\x1e\xf1\xc2\x04\x4e\x9c\xad\x45\x05\x51\x37\xe5\xe9\x56\xe2\x0d\x0e\x7c\x1e\x55\xc1\xc9\x98\x4d\x07\x16\x84\x99\x75\x95\xcf\xcf\x73\xae\x5f\x85\x47\xf8\x0e\x26\xfb\x0b\x88\xd7\xa7\x63\x5b\x0f\x4e\x90\x9e\xc1\xbb\x04\xa1\xdb\x08\xfa\xe8\xe8\x41\xe8\x11\xc2\xe6\xba\x8c\x90\x39\x4e\xfe\xea\x61\x7a\xb1\x4b\xd5\x27\xf5\x70\x49\x14\x59\x19\x8c\x34\x1b\xc3\xf0\x38\x41\xd0\x6e\xef\xb0\x17\x99\x6e\xda\x5d\x86\x67\x64\xd5\xa8\x0b\xd6\x58\xc0\xb5\xe1\x2d\xab\xd9\x81\xc1\x0c\xb1\xeb\x51\x5a\x6f\xeb\xb3\x15\xf8\xb8\x9f\x4e\xa4\xc8\xe7\x0f\xc1\x54\x85\x93\x8a\x34\xa1\xd3\x59\xc1\x98\xbf\x13\x5d\x13\x9f\x88\x84\x6b\x2c\x4f\x9e\x7b\xfd\xd0\xf1\xa3\x83\x70\x88\x24\x6f\x33\xd2\x71\x1f\xa8\x08\x3c\x29\xc4\x03\x5e\x42\xc2\x5e\x00\xa0\xc7\x04\x2e\xcf\x2e\xcb\x07\x8d\xaa\xac\x2a\x7d\x5c\xc4\xab\x4c\x3d\xf9\xce\xae\x07\xd9\x2b\xcc\x57\x6b\xbc\x50\xff\xe2\x4b\x23\x11\x13\x37\x24\xa6\x69\x40\xc8\x76\x80\xee\x33\x14\xe5\xf1\xa7\x65\x21\x43\x7a\x39\x03\x93\xa1\xa1\xe1\x2e\x3d\xa2\x1b\x62\x58\xde\xb7\xa1\x82\x7e\x76\xc3\x70\x4d\xf2\xbe\x5d\x41\x16\xed\x36\x1a\x09\x3f\xe3\x13\xac\xae\xcc\xa7\x12\x0f\xab\xab\x5c\xd4\x77\x3d\x06\x14\x90\xa2\x92\x32\x8b\x15\x19\x2e\xfd\x34\x8e\xe2\xca\x0a\x39\x83\xbe\xe0\xb9\xb8\xef\xaa\x22\xf3\xa0\x23\x24\x43\x53\xa4\x94\x41\xee\x67\x62\xe2\x49\x41\x09\x2a\xf2\xc0\x13\x22\xb1\xf7\x09\x17\x83\x99\xa0\x38\x1f\x62\x63\x65\xa5\x01\x38\x29\x71\x93\x48\xec\xa8\x22\xde\x68\xe3\xc7\x58\xa5\x0b\x93\x72\x3c\x48\xbf\x01\xed\xc2\x42\xe8\x51\x01\x2e\x3e\x24\x3b\xf1\x57\x66\x9d\x9b\x4e\x8d\xed\xf8\x75\xf8\x91\x49\xb9\xe4\x7c\x2a\x05\x5b\x9d\xfc\xec\x54\x32\x91\xdc\xde\x79\x26\xc9\x8a\x60\x5f\x02\xa4\x78\xbc\xfe\xe4\x04\xca\x5e\xba\xa3\x73\x07\x7a\x5a\x40\x15\xc8\xa0\x8a\x38\x67\xf9\xbf\xea\x83\x99\x91\x19\xa6\x64\x18\x51\x70\xfa\xc7\xff\x23\x25\xfd\x67\x31\xc1\x83\xe0\xfd\x5f\x96\xe5\x46\x6a\x0c\xb5\x58\x62\x87\x58\x92\x57\xe6\x50\x7e\xbc\x81\xd9\x63\x27\x99\x76\xec\x39\xfc\xaf\x99\x62\xa9\x64\x98\xd7\x1e\x19\xc8\x9c\x0b\xb2\xae\xea\xdb\xe4\xeb\x73\xae\x92\x73\x02\x9f\xfa\xfe\x7d\x66\x1e\xf3\x8e\x1f\x4b\x5c\xca\xe3\x6a\x13\x8f\x45\xcc\x6b\xb6\x2f\xa9\x35\x47\xb5\xf6\xbc\xfd\x73\xda\x6b\x85\x7b\x78\xb0\xbb\x41\xc8\x9f\x09\x04\x0f\x14\x72\xb4\xc6\x83\xe9\x2b\x59\x20\x28\x6d\x45\x21\x42\x96\xbc\x05\x06\xed\x4b\xf6\x15\x4c\xa4\x73\xb7\x6d\x28\x70\x5f\x15\xeb\xe7\xa7\xf7\x7c\xd8\x44\x24\x80\xc0\x8c\xd0\xfc\x5d\x3b\x10\x84\x00\xf6\x93\xf3\x22\xf2\x78\xeb\x77\xca\xea\x88\x4e\x56\x99\x53\x44\x8e\xe3\x0f\x3e\x1d\x54\x95\x6b\xf2\xc6\x41\x22\xd4\xc1\xde\x3a\x7a\xdd\xb4\x0d\xda\xfe\xbc\xe1\xef\xc6\x10\x76\x90\x39\xdd\x3c\x49\xd7\x65\x2d\xe3\x30\x98\x51\x6e\x94\xba\x7e\x9d\x1f\xdb\x9f\xb9\x2a\x8c\xeb\x22\x9c\xa3\xa7\xfa\xf9\x9b\x18\x9c\x96\x28\xae\x42\x07\x58\x92\x3d\x68\xeb\x69\xd6\x48\xa0\xa3\x00\x9a\x3a\x1e\x62\x62\xb8\x8b\xe1\x2a\x85\xdf\xbc\x3e\x4d\xb0\x2d\x30\x0a\xc4\x15\xe0\x43\x4b\x15\x57\x62\xe7\x90\x69\x87\x4c\xdd\x58\x35\x5a\xf5\xc9\xa2\xba\x49\xae\xc6\x8d\xae\xda\x8c\xae\x5a\x8c\xae\x76\x87\xaf\xed\x25\x1b\x99\x54\x52\x48\xc0\xf4\x2b\xdd\x0f\x42\xa1\xd6\x30\x0a\x62\x28\x88\x61\x2b\x1a\xe4\xaa\x46\x88\x0b\x1f\x74\xc0\x81\x7e\x0e\x06\xfe\x91\x1e\x21\xed\xd7\xf0\x8a\x95\xab\xeb\x85\x2b\x3b\x84\x17\x71\xd8\x70\x90\x1e\x6b\xa0\x87\xab\xbf\x84\xab\xbd\x84\xcb\x8f\x58\xfc\xa9\x6c\x28\x08\x9f\x82\xb1\xf2\xe8\x9e\xb0\x72\xbf\xe4\x95\x82\xf2\x62\x96\xde\x68\x92\xc7\x11\x9d\x3c\x33\xb4\xec\x30\xe4\x92\x70\x0c\xe4\xe4\x5e\xae\xd4\x28\x20\xe9\x05\x48\xce\x92\x3f\x3d\x4c\xa1\x33\x56\xb3\xc8\x0f\x6c\x65\xe7\x28\x54\x11\x7e\xe0\xe2\xc4\x31\x4c\xe9\x23\xf4\xea\x6a\xf7\x05\x29\x42\x80\x2a\xe0\x54\x2d\x46\x91\xa1\xf9\xa3\x78\x8e\x53\xe3\xe4\x7b\x94\xe5\x21\x34\x37\x69\x4c\x95\xbd\xb3\x1a\xeb\xeb\xbe\x6d\xdb\x36\x14\x94\x3d\xb7\x1d\xef\xd6\x54\x5e\xf2\x63\xd7\xbe\xa7\xd1\x91\x7e\xaa\x12\xf8\xce\x22\x4a\xe6\xfa\x4b\xec\x3b\x4d\x3a\x23\xfa\x25\xbc\x54\x72\xfe\xd3\x0b\x8b\x99\xdc\x83\x3b\xfe\x12\x28\x49\x54\x8b\xf7\xa4\xd4\x79\x91\x6f\xfc\xa9\x05\xfe\x49\x39\xcb\xc1\x93\x10\xf7\x70\x2a\x5f\xfd\xbe\xc4\xec\xa0\x4b\xa5\x58\x5d\x94\x59\x6c\x5a\x16\xd7\xf8\x33\x19\xa6\xef\x43\xb1\x88\x7f\x83\xac\x06\x81\x9f\xe3\x42\xaa\x4f\x92\xf8\xd2\xce\x3b\x94\x57\x0e\xb3\x1e\x9d\x58\x36\xc2\x27\xeb\x50\xe2\xeb\x38\x21\x50\xb0\x92\x7e\x01\x85\x5f\x9d\xe9\x39\x4a\xc0\x63\x07\xc0\x48\x0e\x98\x70\x88\x05\x54\x7e\x09\x0c\x3d\xc2\x53\x12\x23\xfe\x31\xbe\x8e\xd4\xc1\x57\xfc\x75\xf2\x6e\x72\x4e\x4e\x3d\xfd\xe2\x67\x33\xa7\x6c\x6d\x57\x3c\x44\x9d\x26\xb1\x10\xd9\xe0\x83\x86\xa5\x36\x49\xb2\xb0\xcf\x08\x9d\x49\x7e\x55\x7e\x1d\x63\x07\xb0\x0e\x7c\x13\xe7\x67\x30\x3c\x8a\xaa\x99\x27\x7a\x74\x2e\x0b\xb1\xfb\x04\xf5\x88\x07\x85\x70\x0d\x30\x4e\xa0\x25\xe3\xbc\xb1\x9e\x0d\x86\x8c\x46\x7d\x33\xba\x56\x7b\x1c\xaf\xc4\xc6\x62\xd9\x3f\x1e\x42\xb0\x31\xa8\x53\x09\x7c\xe5\x1f\x74\x01\xc6\x18\x65\x20\x48\xa9\x50\x07\x4d\x37\x88\x57\x60\xd5\x32\x00\x63\xc6\x3a\x5f\x2f\x18\xb2\xc2\x61\x1a\x55\x9e\xd3\xb8\xc1\x25\xf9\x9d\x04\x0f\xb3\xef\x5f\xb2\xa7\xbe\x23\x94\xb7\xbd\xa8\x28\x2c\x03\x49\x1a\xe9\x6b\x84\x29\xee\x9b\x1d\x8e\x83\x29\x4c\x28\x9b\x6d\x4e\x15\x80\xf7\x86\x0e\x2f\x32\x59\xb3\x81\xe2\x29\xf9\x5c\x89\x3a\x4b\xc2\x74\x65\xbe\x0c\x7a\xe7\xa7\xef\x5f\x86\x1f\x78\xfc\x69\xbe\x22\x59\xc5\x76\x3b\x9c\x6e\x40\x70\xb3\xa4\x91\xa6\x17\xc4\x97\x16\x9e\xb8\x43\x02\x96\x25\xf3\x76\x9d\xbe\xd6\x3b\x20\xed\xac\xb4\xb3\xfe\x1a\x83\x78\xa8\x69\x7e\x19\x5e\xa0\xce\xa3\xfe\x3c\x4a\xd0\x23\x25\x30\x1d\x4e\xcf\x0b\xb7\x1d\x1f\xad\x6c\xca\xc9\xd3\x3d\x18\x9e\xbf\x64\xa3\xa3\x34\xb0\xe7\x00\x94\xbf\x81\xc3\x04\x8d\xae\xe8\xeb\xf7\x64\x5e\x40\xdb\x57\x4c\x2c\x4d\xce\xb8\x81\xa4\xfa\x5c\xad\x38\x2a\xf0\xcc\x3d\x12\xdf\xb0\x83\xa9\xe3\x68\xd1\x32\x6f\x5d\x70\x04\xb1\x19\xbe\x3a\xb3\x45\x10\x32\xa2\x4a\xbb\x46\x54\x90\xf7\x76\x40\xc1\x68\xf5\xcb\xdd\xaf\xee\xf2\xb6\xaa\x3a\x34\x59\x72\xb7\x26\x41\xc2\x51\x4f\x3e\xd6\xd5\x61\x91\x6e\x00\xee\x06\xfa\x19\xf6\xed\x57\x73\xbf\xde\x94\x7f\xfd\xc6\xe9\xa4\x90\x24\x5f\x91\xdf\xce\x86\x20\xc2\x4c\x61\x1c\xad\x0c\x76\x3a\x24\xa0\x61\x97\xab\xb2\x8c\x1d\x63\x7f\x88\xaf\x73\xb2\x9e\xf0\xc0\x11\x1e\xac\x8e\xfd\xf6\x5a\xae\x9b\x24\xac\xca\x7a\xe7\x57\xf8\x40\x09\x69\x9f\x1b\xd2\xca\x9a\x71\x51\xc5\x1f\xce\x6b\xfe\xd6\x47\xf2\xe2\x2c\x5e\x8a\x70\xe9\xc7\xd8\xa6\x3f\x45\xe1\xec\xdc\x03\x52\xe4\xec\x86\xfe\xa0\x58\xc2\x54\x74\x56\xfc\x3b\x16\x56\x6c\x15\xd1\x23\x48\x91\x92\xc9\xcd\xed\xd4\x2d\x3c\x3b\x49\x12\x36\xf0\x94\xe6\x4a\x72\xe4\x93\x9c\x62\x59\x54\xe3\x16\x43\x8a\xc4\xa2\xd0\xb1\x5f\x8b\x1a\xda\x3d\x6b\x9e\xec\xd2\x8e\xec\xf4\x87\xda\xc6\x12\x3f\x34\xa6\x0f\x37\x43\x68\x15\x3c\x42\xa2\x73\x6f\x28\xec\x61\x67\x04\xf4\xb6\x88\x5a\x59\x6c\x66\x10\x8d\xed\x84\x93\xdf\x44\x69\xc7\xc6\x85\x34\x28\x35\xd7\x4b\xf2\xa5\x9d\x94\x2c\x70\x04\x63\xa3\x6f\xca\x84\x9d\x1d\xdf\xb9\xb4\xc7\x88\xf2\xcd\x03\xd3\x0c\xf3\xcd\x61\x46\x99\x8a\x73\x33\x6b\x52\xcf\xbb\xb2\x73\x78\xee\xd8\xd0\x93\xd1\x94\xbc\xe6\x6c\x79\xbf\xe5\x85\x34\x04\xfa\x0b\x92\x6e\xda\xa9\x0b\xee\x09\xe0\x72\xe6\xd6\x4a\xd7\x31\x7d\x64\x74\x29\xd7\x31\x1b\x3f\xb9\xb4\x65\xf8\x67\x2a\xfd\x09\x0a\x0d\x58\x7f\xad\x0d\xc4\xbd\xb6\x08\x27\x6c\x21\x71\x8f\x15\x33\xea\x66\xeb\x8b\x24\x13\xf5\xe8\xba\x79\x34\x1a\xad\xdf\x42\x80\x89\x13\xd3\x3b\x6e\x0d\x52\xf0\x67\x62\x07\x6c\x0b\x62\xc7\xc0\x9d\xc7\xa9\x99\xdc\xf4\x51\x48\x24\x0b\x31\xac\x86\xe6\xfe\x10\x7f\xf1\xe1\x09\x4b\x07\xed\x9d\xa1\xfa\x67\x45\x3c\x65\x36\x1a\xa4\xc5\x20\x6a\x40\x30\xef\x4a\xbc\x51\x1c\xcd\x25\x37\x93\x00\xa3\x99\xb9\x63\x50\xe7\x9a\xc8\x2f\xd9\x9b\x37\xf1\x33\x5d\xcb\x1d\x15\x4f\xe4\x41\x7c\xc6\x33\xe8\xb4\x9d\xb8\x2b\xf1\x13\xc3\x24\x91\x83\xe4\xe9\xd2\x74\xc4\x1a\xc0\xf7\xb4\x13\x1f\x80\xd4\xd5\x00\xb8\x06\x66\xc4\x9e\x48\xdc\xd6\xfb\x50\x58\xda\xd1\x2b\x31\xe6\x6a\x21\xf3\x3e\xf1\xd0\x89\x4a\xcf\x70\x90\xed\xf4\x21\x18\x1d\x36\xdf\xc1\x3d\xb6\x87\x52\x0b\x90\x01\x15\xe7\xaa\x5f\x55\x0f\x10\x4b\xe9\x96\xa9\x74\x40\xf0\x3c\xbf\xc2\x55\x3a\x22\xf4\xb1\xd6\x4a\x6c\xf9\xd9\x93\x47\xaa\xb8\xb7\x72\xa6\x7b\x4f\x1e\xa6\x72\x89\x40\x08\x1d\xda\x73\x28\x79\x4f\xb9\x9a\x2a\x76\xd9\x5b\x72\x2f\xf0\xd1\x27\x6c\xb1\x39\x1f\x9f\x2f\xbf\x1b\x13\x63\xf8\xe0\xb1\xd9\x60\x08\x54\x3d\x17\x1c\x50\xdd\xf9\x8e\x38\x43\x7c\xf9\xfc\x9e\xf8\x39\xc7\xf4\xc5\xa3\xd6\x41\x99\xc4\x78\x04\x69\x7e\x3f\x6b\x85\xa8\x35\x0f\x36\x12\x78\x1e\x2c\x39\x83\x46\x21\xdb\x02\x78\xb6\xa9\x0c\xad\x97\xc7\x0c\xb0\x7d\x8a\x41\xf3\xf0\xc5\x9b\xd8\x7b\xc1\x19\xa6\xd4\x5f\xf0\x26\xeb\xc0\xcf\xc7\x06\x22\x16\x6c\x31\x3f\x1b\xe4\x69\x27\x8f\x95\x6c\x56\x69\xd6\x8b\x3f\xb5\x6e\x5b\x4d\x3a\x68\x0a\xb7\x54\x6d\x87\x47\xcf\xc8\x6c\x4d\x86\x28\xc1\x6c\xaf\xf4\xce\x9e\xc5\x9b\xef\x6e\x71\x43\x68\x15\xfa\x94\x71\x11\x7e\x1b\x26\xdb\x30\xb7\x8f\xd4\xe0\xd1\xb7\x17\x27\x1b\x35\x70\x47\xf7\x65\x5e\xba\xdd\x71\xa6\x5f\xcd\xf5\x33\xae\xa5\xcf\x6e\x7e\xd7\x22\x38\x69\xc8\x9f\x0b\x51\x79\xce\x6d\x06\x12\x32\x9f\xa5\xce\x07\x59\x30\x49\xe2\x65\x57\x57\x4c\x75\x86\x2e\xf7\xa8\x3f\x10\x98\xe6\x4e\x87\x93\x1c\xf6\x42\x7e\x0a\x53\x13\x78\xef\x21\x98\x3a\xab\x59\x6a\x02\x6f\x3b\xaa\x5a\xa8\xd5\xad\x55\x37\x07\x5b\x5d\x47\x0c\xd9\xa3\xee\x99\xbc\x3e\x0b\x6d\x22\x4b\xef\x5e\x83\x47\xdb\x40\xf8\x3c\xab\x08\x73\xd0\x04\xd4\x6e\x17\x02\xe9\xc7\x87\x46\xaf\xc2\x73\xd9\x14\x92\x93\x9d\xa4\xce\x7c\x19\x85\x58\x05\x6b\x15\x44\x21\xc2\x35\xd1\x46\x3f\x86\x7c\x57\xde\xb7\x71\x0f\xde\x14\xa2\xe4\x53\x67\x49\x03\xa5\x68\x3e\xd1\x72\xbb\x38\xd3\x27\x51\xb1\x81\xa7\x5b\xc9\x88\x49\x67\x87\xdb\xf7\x00\xf2\x14\x48\x59\xaa\xb0\xdb\x44\x6f\x84\x31\xb2\x0d\x10\x3e\xfd\x2a\xa9\x93\x48\x5f\xa8\xf9\xce\x47\xd0\x59\xc9\xab\xa2\xe9\x76\x92\x13\xfd\x72\x11\xf4\x5c\xf9\x44\xb4\xa0\x00\xba\xa8\x68\x50\x32\x35\xc2\x48\x4c\xfc\xbd\xa1\x07\x48\x0c\x20\x78\x24\x39\xe3\xc3\x2b\xce\x5c\x18\xad\x5e\xd2\x85\x53\xc3\x92\x5f\x7a\x6b\x39\x8b\xf1\xe2\x9e\x41\xaf\x77\xa7\x78\xbf\xc4\x28\x44\x9a\x85\x28\xc5\x41\xdb\xeb\xeb\x84\xa3\x02\x37\x54\x56\x7c\x54\xd3\x35\x61\x80\x67\xf8\x9e\x54\x16\x81\x2a\x0d\x68\x0f\x35\x3b\xbd\xe6\x5d\xa4\x04\x40\xa8\x4c\x2a\x5b\xd9\xef\x51\x82\x5d\xb9\xa9\xaf\x4f\xd3\xc2\x4b\x8c\x23\x2c\xb1\xec\x7d\xf2\xb2\x3e\x96\x7a\xaa\x3b\xca\x46\x80\x6d\x0b\x76\x23\x56\x82\xf9\x04\xe1\x2c\x8f\xba\x76\x75\xed\x20\x5d\x6f\x4d\x4a\x5f\x7e\x85\xd4\x9e\x6e\xa7\x08\xb8\xfd\x56\x31\x2e\x67\x7b\x4a\x57\xd7\x31\x5a\x47\x7e\x65\xa7\x61\x19\x3c\x26\x68\x1a\x7e\x36\x02\xbc\x63\xe3\xf8\x26\xf8\x22\x0b\xf9\x6d\xca\x13\x82\xf5\x6b\x9f\x30\x22\x38\x26\x92\xcf\x1a\x98\x37\xf8\x18\x4b\xb5\x1c\xa3\x4c\x96\x42\x85\x71\x69\x43\x25\x4b\x81\xcf\x5d\x80\x2c\x4c\x0e\x91\xb7\x64\x8c\x63\xef\xeb\x44\xdd\x7f\xca\x99\xf8\x8c\x97\xfe\x11\x8e\x95\x99\x34\xfb\x24\xe9\x5e\x2a\xf8\xad\xb3\x14\x8e\xb0\xaf\x84\x65\xec\x29\xfb\x8b\x7c\xca\xe6\x20\x9d\xb2\x2b\x48\xa7\xea\x0c\x32\xa8\x3a\x91\xf0\xc0\x4b\x24\x64\xb4\x07\xc4\x17\xad\x59\x70\x16\x02\x48\x00\x79\x8e\x1d\x6e\x06\xc4\x56\x6f\x83\x6c\x55\x32\x40\xe9\x77\x74\x23\x2a\xec\x6d\xde\x7d\x91\x9c\xc9\x3f\xe0\x2e\xf5\x0f\x0d\x20\x10\x76\x4d\x1a\xdb\x7e\x02\x35\x6f\x96\x40\x75\x10\x42\xb7\x93\x57\xd5\x6d\xed\x7f\xd8\x6f\x16\x7f\x00\xb3\xe5\xf9\x54\x82\x1b\x18\x28\x10\x49\xab\x8a\x61\x82\x9e\xcb\x7b\x17\x65\x69\xc6\x29\x93\x2c\xaf\x37\xcd\x6d\xbf\x98\x5f\xdc\x3a\xea\xa1\x00\x34\x5a\x86\x85\x4e\x2c\xaf\xd3\xc3\x6d\xbf\x60\x50\xee\x19\x6b\x00\xee\xcb\x78\x55\x4f\xd5\x02\x40\xcc\x53\x86\xff\xd6\xcb\x98\xe0\x2c\x5c\x0a\xec\x72\x7d\x30\xca\xa6\xa8\x8a\x01\xe7\x18\x7e\xe4\xbc\xff\x6b\x5b\x20\x0b\x82\x14\xc3\xa3\x5d\x7a\x44\x90\x5a\x88\x9f\x38\x84\x4d\x70\x95\x24\x5a\x0e\xe6\x46\xe3\x99\x8f\x0c\x2b\xed\x16\xc8\x01\x1f\xea\x7a\x54\x09\x10\x8e\xdf\xb1\x22\x70\x8f\x38\xe9\xbb\x73\xa8\x8a\x48\x6c\x96\x6c\xe6\xf3\x2b\x39\x9b\xb5\x95\x46\xfd\xe1\x7d\x8d\xb9\x76\xfc\x29\x4d\xac\x26\x8c\xc2\xd9\x5f\xe8\xc6\xcd\x37\xab\x60\x75\xc6\x96\x7a\x8f\x9e\x5b\x72\x95\x2a\x03\xaf\xc7\x63\x4d\x4f\x8d\xcc\x74\x11\xc7\x7a\x15\xe9\x96\x43\x18\x45\x81\xb1\xbf\x5e\xe4\x15\x5c\xf0\x7a\xe2\x40\x46\x23\xab\xd3\xc6\xd0\x95\x7c\x82\xfc\x14\x94\x2b\xf0\xf8\xab\x40\x9a\x6f\xb3\xc1\xec\x38\xab\x73\x22\x33\xff\x44\xda\xb4\x12\xe6\xb1\x24\x50\xfc\x29\x29\x97\xc4\x81\x18\x75\xbb\xb1\x9a\xa6\x22\x1a\x87\x67\x02\x28\xf0\x06\x28\xd4\xc0\xb7\x0a\x9b\x6c\xc0\x2b\xc3\x9e\x51\xee\x65\x84\x27\x34\x5e\x90\x4e\x42\x7c\x00\xeb\x69\xf9\x84\x92\xe1\xd7\x93\x0f\x76\xdd\xdb\x15\x0f\xf0\x9c\x45\x54\x96\xe4\xb9\x13\x15\x49\x6c\x37\x40\x9e\xc4\x79\x25\x28\x50\x52\xc4\x45\x82\xdc\x45\xd3\x20\x78\x3d\x38\x08\x92\x74\x81\xa0\x45\x39\xe1\x67\x0a\xf6\x56\x23\xd2\x28\x00\x19\x00\xa0\x0f\xdd\x1c\xea\x1b\x7c\x32\xfb\x65\x5c\x6b\x06\x9c\x2b\x22\x03\xef\x1b\xec\x5f\x71\x7e\x31\x46\x95\x66\x57\x44\x3f\x00\xb9\x28\x4a\xf9\xd9\x76\x70\x46\x28\xe4\x5e\xfd\x7d\xec\x59\x2b\xe1\xcc\x28\xfd\x96\x46\xe4\xe0\x5e\x14\x5a\x9e\xeb\x6e\x4c\xaf\xc5\x38\x81\xcc\x01\x01\xbe\x66\x7d\x11\xd0\x75\x0d\x20\xf9\x71\xb5\x68\x99\x46\x64\x8f\xda\x87\x9e\x22\xdc\xc6\x96\x0b\xf4\x27\x22\x39\x9a\xd6\xea\xa2\x58\x78\x2d\x36\xd3\x19\xb0\x51\x49\x3e\x08\x63\x04\x48\xb3\x1b\x0e\xb0\x30\x59\x73\x5e\xa9\x4d\xb1\x8b\x79\x2b\xf4\x02\xc2\xc0\x70\xee\x54\x21\x26\x5e\xc6\x6d\x7e\x60\xd8\xfc\x0e\xfb\xca\x28\x28\xe2\x0a\x45\x67\x59\x53\xe0\xf1\xf6\x81\xc2\xba\x38\x8c\xed\x65\x85\xfe\xf5\xc4\xe3\xf7\x48\xdc\xcd\x03\xf3\xad\x54\x43\xcf\x69\xd2\x0b\x2d\x6a\x9b\x9a\xfe\xa6\xb5\xdf\x7d\x5f\x66\x41\x9f\x37\xb8\xba\xae\xb4\xa4\xb6\xdf\x33\xea\x42\x2f\x87\xb9\x1f\x40\xff\xc8\xd8\x50\x2e\xa6\x0d\x08\xf2\x65\x4f\x36\x51\xb6\x09\x51\x44\x2e\x98\xa0\x34\xf5\x75\x3f\x8b\xa4\x48\x66\x88\x26\xeb\xa0\x48\xe1\x03\x78\x59\xa6\x29\x91\xe3\x11\x90\x00\xc5\x62\xc2\x0c\xf0\x7c\x70\xb9\x56\xc7\x17\x2f\x0b\x45\x07\xfb\x4f\xeb\x45\x56\x14\x7e\xaa\xe9\xa4\x3a\xb0\x9f\x3a\xb7\x41\xe5\x40\xc3\xfb\xaf\x6f\x42\xc7\xe2\x18\xb9\xb5\x72\x1e\xb4\x38\xf6\x07\x72\xac\x0e\xcf\xab\xe1\x9c\xe2\xcd\x16\xb6\x23\x29\x13\xb3\xc8\x50\x83\x5f\xda\x2c\xb0\x59\x38\xd6\x47\x9e\x6f\x8d\x6b\x9d\xfe\xf9\x48\xb9\x11\x6a\x68\x4c\x4a\x01\x63\xe4\x8a\x0e\x4d\xfc\x09\x03\x34\x49\x00\x75\x3e\xe1\x40\xee\xd3\x27\x02\x60\xe7\xfa\xc7\x27\x35\x0f\x1e\xd4\x98\x34\xbf\x20\x32\x74\x5e\x21\x39\x4e\xbf\x1d\xc7\x49\x94\xc4\x54\x80\x10\x99\xd4\x71\xf4\xb9\x68\x01\x77\x12\x4d\x7a\xe9\x35\x68\x10\xf5\x6e\x3b\x6f\xa6\x95\x41\xa7\xbe\xd6\x57\x9b\x06\xde\x0e\x42\x1b\x4a\x47\xac\x21\x08\x23\x77\x3f\x96\xec\xde\x93\x4c\x5e\xc3\xab\x53\x50\x45\xa5\xab\x75\xa6\xe5\xf9\x0f\x31\x69\x2e\x34\x9c\x0e\x28\x9d\x96\x79\x24\x28\xe3\x98\x82\x9f\x21\xfb\xe3\x86\x8a\x25\xeb\x08\x6f\x1f\x57\xb0\x6d\x6a\xf6\x1b\x14\xe0\x3c\x21\x6c\xdc\x9c\xee\x47\x4e\x60\x13\x13\x99\xa4\xba\x8d\x54\xed\x46\x71\xdc\xb4\x25\xdd\xae\xd9\xd0\x98\x7f\x59\xf1\xac\x69\x3f\x9b\x30\x9d\x86\x03\x79\xe4\x9c\x11\x22\xf0\x16\x43\xc6\xe2\x45\x03\x97\xaf\x37\x81\xbd\x01\x32\x38\x75\x61\x34\x07\x25\xf6\x9b\x24\x6d\xb8\x82\xe1\x1a\xaf\x90\xb9\xae\x94\xbb\xd9\xbe\x58\xcd\x9a\x58\xcd\xf2\x31\xc1\x72\x85\xbe\x53\x6e\xe6\x8d\x55\x5d\x94\x67\x55\x2e\x73\xd8\x40\xa7\x9e\x9c\x26\x3b\x67\xeb\x6e\x5d\x28\x61\x0a\x74\x7b\x8f\xc2\x2c\xd6\x85\xab\x31\x38\x96\xb4\xb9\x2e\x9e\xad\x81\x69\xea\x38\x73\x4c\xb4\x3c\x5a\x27\xa6\xe1\x57\x86\xae\xf2\xb1\xe9\x17\x02\xe9\xd8\xe7\xd5\x17\x17\xed\x57\x0e\x2b\x62\x2c\x89\xab\x3c\xe1\x90\x93\xc1\x60\xf1\x0a\x93\x79\x54\x50\x7b\x57\xec\xcf\x28\xd8\x46\x20\xd4\x95\x4e\x46\x08\xef\x20\xe4\x46\xaa\x98\x67\xe6\x23\x82\x8b\x6d\x9a\x8b\xad\x3f\xb6\x17\xfd\x9a\xa0\xf4\x85\x61\xdf\xa3\xc0\xd8\xdd\x33\x7f\x44\x2d\xc7\xa1\x19\x33\x65\xba\x6c\x57\x46\xae\xcf\xb9\xf9\x20\x81\x59\x4f\x7a\x09\x5c\x60\x79\x2c\xe5\x30\x4f\x98\xd7\x91\x3a\xb1\x5b\x49\x75\xe1\x78\x69\x72\xef\x4c\xc9\x1a\x79\xb4\xe9\xf0\x7d\xc9\x6c\x21\xb7\x2e\x72\xd3\xa7\x9b\xf8\x5d\x6b\x70\x1d\x7a\x5b\x67\x9b\xd6\xc4\xd1\x65\x40\x7a\x46\x5c\xeb\xea\x12\xd9\x26\xd0\xf9\x3c\x09\x0b\xc9\x1d\xcb\x32\x8f\x6e\xff\x21\x8e\xa9\xd3\x85\x37\x74\x31\x18\x78\x5b\x80\x7a\x77\xbe\x99\x94\xa9\xf6\xbe\x07\xe7\x02\xfa\xc5\x7a\x03\xaf\x32\x54\x5f\x3d\x05\x78\xc3\xd6\xd6\xb9\x9e\x42\xb3\x8a\xcd\x9a\x4a\x10\x2e\xb0\xa0\xe1\x4f\xfc\x72\x89\x10\x67\xfb\x1e\x22\x19\xd2\x13\x76\xe0\x50\x5d\x33\xd6\x85\x95\xe4\xe9\xe9\xf9\x43\x89\x4d\xce\x14\x03\xa8\x61\x53\xfc\x75\xd0\x17\xe0\x2c\x86\xac\xae\xe0\x86\xc4\x22\x21\xec\xbd\x24\xfb\x10\xea\xa8\x6c\x58\x41\x26\x06\xec\x4d\xb3\x01\xe5\x2b\xa3\x25\x97\x90\xdf\xaa\x9e\xf0\xb0\x83\xac\x36\xc1\x47\x6e\xa9\x75\x22\x3f\x58\xf9\x01\x1f\x01\x14\xe3\x07\x7e\x7a\x79\x94\x28\xd7\xbb\x86\x95\x99\xc7\x98\xe5\x96\x1d\x1c\x59\xea\x1e\x5c\x18\xbf\x92\x8b\xd7\xb5\xe6\xdd\xb7\xe5\x21\xb6\x69\xd7\xe0\x87\xe0\x18\x96\x9f\x1e\x77\xac\xd8\x43\x98\xd6\x14\x13\xcf\xc1\x9c\xa0\x0c\x50\x5d\x35\x47\xa3\x3f\x34\xc7\xd8\x4c\x6b\xba\xd6\x5c\xf4\x53\x72\x96\x09\x7f\x85\xd3\xf2\x21\xf5\xea\x21\x41\xf5\x3f\x4a\xc3\x65\x1e\x9c\x65\xc5\x2c\x47\xf5\x0c\xcd\x73\x59\x19\xeb\x4d\x1c\x67\x76\xd9\xa5\xb9\xbc\xb9\xf6\x40\xe6\x89\x1a\xce\x02\x63\x8e\xf5\x6a\xf2\x1d\x87\x8b\xc5\x2f\xad\x4a\xdf\xef\x99\x57\x47\xeb\x9d\x6c\x8d\x16\xe7\x05\xc8\xf8\xe7\xbb\xaa\x9b\x8a\x85\x7e\xd5\x3e\xc1\x70\x66\xdf\xd5\x9c\x4e\xd5\xec\x80\x43\xa3\x1f\xba\xc1\xc3\xde\x44\x0c\x4b\x23\x84\x5f\x7a\xdc\x86\x21\x81\x0c\x70\x40\x6c\xd1\x98\xa3\x2d\x93\x5c\x4d\x68\xa3\x02\x2d\xef\xef\x66\x12\x9e\x58\xfb\x24\x87\x35\x98\xc9\xd5\xec\x3e\x94\x9b\x4b\xdf\xe7\xbd\xac\x51\xa2\x34\x2c\x3c\xdb\xbb\x3d\x08\x31\x09\xf2\x58\x7f\xfa\x78\xb3\xd3\xd5\x66\x99\x29\xef\xc6\xb2\x92\x52\x96\xfa\x9b\xc7\x4b\xdb\xd9\xb9\x48\x7e\x4b\x03\xc1\x93\xee\x24\x7b\x7d\x79\x55\xbd\xf3\x73\x25\x06\xe9\xbe\x15\x66\x8e\x37\xbc\xe2\xb1\x5e\x9c\x52\x53\x38\x56\x9c\x92\x76\xa9\x6e\xcc\xdb\x2f\xe5\xb9\xd8\x40\x07\x64\x5e\xd1\x20\x91\x59\x4f\x96\xc3\x36\x14\x55\x05\x49\x84\xa4\x31\x63\x16\x62\x8e\xec\x60\x44\x4c\xfe\x62\x41\x2c\x18\xde\x67\x12\x5c\xaa\xcd\xa3\x59\x76\xe7\x98\x07\xdb\xbf\x6f\x71\xe5\x03\xcb\xd7\xda\x44\xc5\x92\xf2\x04\x1e\x9d\xc2\x34\x25\x8a\x86\x0e\xa3\x96\x62\xa9\xf0\x69\x70\x2a\x5b\xa7\x05\xb1\x77\x02\x2c\x79\x66\x9a\x30\x12\x8c\xbf\xed\x9e\xd0\x7e\x00\xeb\x8a\x5e\x8f\xc9\x33\x15\xbb\xe3\xe6\x2d\xae\x2c\xd0\x91\x9a\x3e\x26\x6c\x94\xd1\xd0\x56\x59\xfa\x9e\x88\x71\x68\x14\x41\xff\x00\x8c\x01\x4b\xf6\x60\x33\x25\xeb\x6d\x12\xe9\x65\x9c\xe9\x53\x21\x16\x6c\x04\x59\x26\x8f\x04\xb3\x08\xf3\xbe\xa1\x23\xbb\x4b\x30\xcd\xa4\xd8\xb8\xc4\xc2\xe4\x69\x24\x26\x78\x81\x0b\x86\x43\xf4\xfd\x49\x6c\xf2\xfb\xd5\xbe\xa8\x30\x5b\xde\xa2\xbd\x52\xf8\x44\xb8\x69\xa1\xe0\x82\x60\x72\xf5\x38\xc8\xa2\xaf\x86\xb6\x67\x94\x65\xae\xb7\x83\xdc\x8e\x80\x35\x4f\xb8\x2b\x2f\x51\xf8\x8a\xdf\xa0\x8b\x92\x30\xdd\x46\x02\x29\x45\x05\xb5\x5c\xbd\x7c\x29\xed\xaa\x53\xaf\xa8\x96\x5b\xcd\x5e\x49\xa7\x4f\xe1\x2d\x71\x33\x62\xb3\xbb\xd1\x71\x6f\x92\x65\x2e\x53\x83\x5e\x8f\xb0\x44\xbc\xad\x70\xb9\x70\xbd\xd4\xe8\x4c\x24\xba\xb7\x7b\x8a\x6a\xb3\x9d\x72\x03\x00\xe5\x24\x7f\x15\x64\xf0\xa4\x7a\x1e\x32\x06\xca\x0e\x70\xad\x4f\x29\xbf\x3b\xba\xe9\xe4\x0f\xb4\x3e\x1e\x00\x4b\xb0\xe2\x29\x50\x2a\x10\x1d\x4d\xf2\x0b\x8d\x36\xba\x44\x0f\x5a\x0f\x79\x2c\x66\x5c\xa3\x86\x5e\xfd\xd5\xaa\x88\xe1\x7a\x91\x61\x2b\x06\x7e\xb7\x18\x7f\xad\x06\x78\xcc\xa6\x9b\x97\xbe\x27\x53\xe6\x05\xcb\xc1\xfa\x08\x70\x30\xfb\x4c\xe6\x27\x24\x0d\x9e\xc7\xd8\xe4\x38\x50\x9b\x51\xa0\xd8\x76\x9f\x9d\xfd\x1e\x47\x86\x7e\x98\x97\x61\x79\x15\x36\x65\x98\x91\x12\x67\xbf\x25\x24\x43\xd9\x5d\xc0\xd6\x56\x0a\xef\x65\x0f\x07\x57\x33\x57\x10\x54\x9e\x5e\x2b\x08\x37\x24\x73\x7f\xb9\xf2\xa0\xeb\x01\x1a\xe1\xad\x22\x99\x80\xb7\x3a\x9e\x70\x91\xc7\x6b\xb9\x72\x79\x3d\x96\x35\xdd\x8b\x4a\xae\x3a\xc3\x81\xb3\xec\x24\x80\x38\x11\xe8\xf3\x71\x6e\x29\x0e\xa6\x80\x90\x7e\xa8\x98\xc4\xcc\x0f\x58\x6e\xb5\x63\x20\x44\x50\x18\xda\x95\x6a\x48\x00\x19\x01\x0c\x3f\x9b\xfd\xee\x9e\xb1\xa1\x9d\xb6\xd5\x92\x1d\xa8\x01\x10\xb5\xd9\x60\xab\x8f\xe9\xdd\x38\x60\x92\x74\xe9\xfb\x2b\xfa\x91\x7d\xbb\x2c\x5a\xf1\x90\x15\xd3\x8b\x25\x0a\x96\x72\x41\x69\xba\x8d\xa2\x05\x86\x22\x3c\x45\xa1\x86\x1c\xc1\xb0\x8d\xca\xcd\x16\x03\xd4\x08\x10\xf4\x45\x86\xc7\x8a\xbe\x5f\xfe\x0b\x3d\x6d\x69\xd3\x45\xf0\xd1\xb0\x65\x1b\x50\x2a\x2a\x71\xd6\x06\x0c\x2e\x34\x15\x71\x10\x2b\x6b\x0c\x84\xb8\x32\x03\x2e\x6e\x6b\xaa\x61\x15\x43\xec\x01\x33\x30\x09\x59\xf1\xb4\x13\x2f\x06\xa5\x14\x6e\x6e\xbe\xa1\x66\x65\x72\x92\x35\xce\x1c\x8b\x86\x42\x13\x3e\xc9\x7e\xd8\x87\x63\xe2\xcf\x0c\x1f\x68\xe3\x44\x90\xe5\xaa\x03\xb6\x7e\x3f\x51\x52\xd8\x09\x8e\xcb\x03\xe0\x0e\x1c\x49\x46\xef\x42\x7b\x94\x7b\x00\xdb\xe9\xc1\x82\xc1\x15\x49\x14\x81\xcf\xec\x3d\xe6\xb9\xe1\x5b\x36\x35\x2d\xc6\xf2\x99\xb9\x3e\x5d\x70\x99\x6f\x13\x4a\x26\xc6\x21\x46\x13\xf8\xf3\xc5\x94\x44\x9d\x33\xba\xf0\x31\xa6\x06\x8e\xfb\xc4\x7e\x6c\xd3\x9a\xb7\x15\x38\xbf\xc0\x6e\x9c\xb4\xbe\xdd\x18\x4e\xb2\xed\x03\xef\x1f\xef\xa3\x33\xc9\xce\x55\xea\x74\x0d\x34\x82\xfa\xf7\x06\x8e\x5c\xea\x99\x83\xa2\x9e\xda\x9e\x51\xb2\xe6\xfd\xc1\xbb\x2b\x66\x60\xe7\x1e\x4e\xd8\x3c\x6e\xc0\x54\x96\x23\xa4\x3f\x90\x70\x74\x12\xc4\x10\x66\xc1\x0b\x85\x3d\x65\xa4\xc0\xf2\xe7\xc7\x58\x4c\x10\xab\x98\x7b\x47\x6b\x9e\x09\x82\xf4\x10\x96\xcb\x65\x0d\x3e\x74\xe9\x2e\xc4\xb4\x01\x39\xb2\xf0\x74\x3c\xeb\xca\x0c\x89\xcd\xf1\xd9\xc6\x5c\xb3\x33\x3c\x65\xac\xae\xd9\x96\xb3\xb9\x64\xca\xa0\xb7\xb6\x5d\xc9\xe2\x88\x50\xaf\xf7\x28\x77\x4e\x9e\x23\xb9\x5f\x60\x55\x62\xd1\x81\xc8\x07\x18\xc8\x67\x6b\xc2\x36\x36\x14\x66\x10\x19\x4f\x4d\x82\xda\xef\x28\x62\x0b\x67\xbd\xaa\xd5\xbf\x68\x27\x80\x19\x80\xad\x34\xf0\x1e\x9c\x2a\xa4\x04\x5b\xd6\x77\x2f\x53\x81\x0c\x34\x9f\x0a\x0f\x31\x9f\x4e\xfc\xf7\x74\xf4\x8f\x4a\x4e\xa1\xb5\xdd\x18\x54\x3d\xf5\x09\xd9\xf9\xa7\xfe\xca\x75\xca\x6f\x8a\x44\x59\xf8\x0e\xae\xe6\x5b\x6d\x44\x05\xdf\x13\x12\x1a\x4b\x63\xa8\xce\x02\x6a\xd0\xa4\x49\xb7\xba\x5a\xd8\xdf\xa3\x55\xa6\x1c\xd6\x7b\xa0\x75\x6a\x94\xd9\x21\x70\xe8\xf5\x5d\x48\xc3\x78\x7f\x27\xa1\xc0\x85\x9b\xda\x1c\x3a\x85\xe5\x3d\x61\x09\x03\x91\x31\x83\x35\x5f\xa5\x71\x5c\xb5\x06\x5b\xde\x76\x2e\xb1\x3e\x5d\x8f\xce\xbb\x7f\xa2\xf7\xc3\xd1\x25\x8c\xae\xba\xca\x12\x2e\xf2\x1f\xb0\x8b\x7a\xf8\x94\x7f\x14\x52\x84\x4f\x4a\x9e\x33\x88\x16\x7c\xa4\xda\x24\x34\xb1\xc0\x21\x01\xcd\x9e\x01\x50\xb2\x22\x54\xd1\x45\x0e\x77\x3f\xbf\x2c\xd3\xbd\xc0\xdb\x42\xd8\x43\x67\xdd\x59\xce\xec\xa0\xca\xed\xf0\x72\xa4\x43\x6b\x0d\xdb\xb7\x9f\x64\xd1\x76\xbc\xf9\x37\x1a\xec\x7e\xca\x9a\x81\xeb\x93\x2f\xb4\xcc\xad\x3d\x2f\x8b\x4b\xf4\xb6\x13\x30\xf4\x27\x8b\x6b\x53\xb8\x93\x2d\x02\xed\x61\x60\x3a\x23\xd5\xec\x66\x2e\xed\x2e\xef\x4e\xe0\x01\x29\x4b\xd8\x61\x3c\xbb\x2c\xc6\x4e\xd6\x5e\xfb\xc9\x56\x3d\x63\x11\xbf\x75\x1c\x6f\x1e\x92\x8b\xea\x87\xd9\xfe\xe6\xf1\xc0\x9c\xa3\x29\x83\x97\x59\x2a\x84\x1d\x4d\x03\xe7\xac\xf3\xd6\x6a\xc0\xbf\x37\x80\x35\xae\x7f\x8a\xc8\xc7\x07\x2f\x9a\x7a\xe1\xfd\x7d\x8a\x57\x56\x0c\xc9\x84\x4f\x2d\xa1\xb7\x7f\xc0\x46\xe1\xf9\x59\xd4\x0a\xd6\x7e\xd9\xd4\xab\xab\xb1\xa0\xab\x98\xee\x10\x72\xe7\xf4\x8e\x1f\xf9\x87\xc1\x19\x9c\xd1\x31\xb3\x58\x2e\x55\x25\xb8\x9f\xfe\x5b\x0a\xa4\x3b\x95\x2b\x69\x0b\x95\x4d\x95\xab\x52\x9c\xbd\xbf\x14\x7e\x6e\x09\xd1\x19\xab\xfb\x6a\xf0\xca\x3c\xbd\xd7\xe9\x86\xfb\xf3\x52\xaf\x77\x5f\x09\x6c\xec\x4a\x88\x7b\x8c\xdf\x71\xff\x15\x51\x79\x4a\x27\xca\x8d\x86\x0c\x64\x59\x59\x9d\x68\xa8\x78\x79\x9e\xc2\xbe\xb3\x3c\x98\x0e\x17\x39\x90\xab\x6a\x8b\x19\x60\x9e\xc7\x13\x76\x94\x58\x06\x16\xae\x60\xe9\x02\xac\x8f\x49\x76\x07\xc0\x5a\x56\xde\xae\xb4\xed\x86\x65\xfb\x86\xd8\x94\xd6\x63\x28\xda\x79\x61\x4a\x74\x3d\xff\x0b\x18\x10\xad\xea\xe9\x9d\x1b\xfa\x3a\xa7\x26\xf9\xe9\x3f\x15\x03\x24\x85\x8e\x24\x8c\x62\x30\x68\x88\x30\xdc\x2b\xb7\x12\xe4\x59\x44\xa0\x06\xdc\x25\xc4\x87\xa6\x72\x13\x97\xf7\x0f\x68\x31\x54\x38\x2f\x6c\xa8\x98\x02\xbf\x95\x8f\x5e\x07\x78\x87\xa6\x89\xe1\x80\xfb\xf0\xc7\xda\x2e\x84\x9a\x64\x5e\xbd\xfb\x9c\x2d\x68\x83\xbe\xc0\x2d\x96\x00\x97\xef\xeb\x79\x3b\x4d\xb2\xc9\x5d\x99\x16\x17\x83\xad\x2b\x2f\x77\xd3\xaa\x50\x9d\x33\xa8\xa2\x73\xa9\x00\x69\x1b\xa1\xa7\xea\xf2\x28\xc0\x92\x2f\x76\x3b\x49\x3a\x86\x03\x2c\xce\x80\x3b\x75\xb7\xca\x27\x25\xf2\xbc\x72\xe0\xc3\xad\x77\x67\x7f\x82\xfc\xe0\x55\xae\x87\x54\xdd\xb9\x42\xdc\x11\xaa\xbe\xd3\x4b\x19\x71\x76\xda\x48\xcf\x6e\xf0\xeb\xfd\x1d\x5b\xee\x08\x41\x1b\x3b\x70\x17\x08\x56\xb5\xee\xb2\xe0\xc2\x7c\x23\x78\x81\x4b\xb6\x6d\xb6\x0a\x27\xce\xaf\x67\xcc\x5d\x21\x73\x73\xbc\x59\x17\x26\x24\x49\x4b\x12\x40\x7e\x6d\xb6\x92\x70\x73\x73\x86\x17\xc8\xbb\xb3\x94\xee\xfb\x9e\x7f\x28\x16\x4a\xe1\x2b\xd4\xbb\xc9\x23\xcc\x6d\x67\xec\x66\xda\x09\x2a\x13\x14\x8c\xe2\x15\x18\x0e\xf1\x57\x71\x34\xc1\xd0\xdf\xa7\x18\x6b\x6c\x6d\x86\xaf\x57\x99\x47\xd9\xd6\x75\x5c\x84\x76\xb4\x52\x85\x76\x37\xcc\xe1\x5a\x79\x70\x75\x47\xe1\x7c\xdf\x43\x42\x5c\x9d\xa0\x3a\xd3\x66\x09\x14\xe1\x4d\x0a\x16\x93\x07\x70\xe0\x99\x15\x74\x14\x1c\xc3\xa9\x39\x8f\xc6\x43\x38\x24\x87\xc8\x4a\x4c\x49\x82\xa7\x38\x99\x84\x27\xb6\x65\x6b\x1b\x03\xbb\x07\xa1\x6c\x35\xd2\xdd\x8d\x41\x68\x5c\xe3\xe1\x0c\xc0\x27\x7a\x89\xa8\xd0\x8a\x8b\xcc\xf3\x85\x90\xf1\xd3\xd3\x90\x7b\x17\x75\x27\x4c\x97\xf2\x46\x85\xe2\x6f\x17\x66\xf2\x90\x80\x1d\x40\x07\x74\xc8\x3e\x0b\x2a\x3c\xd7\x44\xe6\x4d\xd7\xb6\x12\x25\xc1\x8e\xa1\xb7\x7e\xe2\xcf\x0f\x7f\x54\xc2\xa5\x16\xad\x96\xd1\x7d\xfa\x6d\x49\x5c\xa5\x2f\xba\x6e\xab\x83\x3c\xf1\x74\xe9\xb7\x56\x0e\x3d\xc7\x3d\xa7\xa7\x61\x70\xfc\x60\x2a\x29\x47\x1c\xc4\xaf\xf7\x76\x44\xbe\x2d\x05\x8c\xf5\x50\x5c\x1e\x95\xc4\x2b\xce\x2c\x3c\x04\xb5\x22\x75\x62\xe7\xaf\x0b\xb5\x97\x42\x19\x31\x31\x58\x50\x40\x69\xca\xf2\x2a\xea\xe3\x6d\x58\xf8\x46\x8a\x15\xc0\xfe\x37\x9a\xee\x12\x0d\x73\x46\x87\x02\xf0\x82\x2a\xca\x24\xcb\xcc\xfc\xb9\x32\x33\x77\xf5\xf7\xf9\xef\xcc\xa8\x88\x44\x45\x1c\x79\xde\x82\xb1\x02\xa7\xc0\x65\xd0\xab\x78\x1c\xb3\x31\x78\x73\x62\x90\x11\x84\xd2\x15\xb7\xd7\x24\x88\x29\x9d\x39\xb7\x56\x73\x0a\x48\xec\xf5\x9c\x21\x09\xdb\xf4\x17\x85\x44\x70\xa4\xb3\xe1\x64\x2f\x8f\x8d\xb2\x91\xb3\xb4\xdc\xa2\x96\x05\xa4\x47\x71\xfa\x49\x72\x42\x1e\x7e\xd1\x95\xfa\x03\xfb\x94\xb9\x47\x70\xe5\x83\xf3\xf7\x4a\xbf\xc7\x38\xf4\x64\xbc\x26\xe7\x41\x8a\xf1\x77\x09\xf5\xf9\x08\xd5\x46\x77\x65\x40\x4a\xf8\x8a\x8a\x92\x6e\xc3\x4a\xcc\x1d\x39\xbd\x5d\x8f\x6f\x35\x3f\x1d\xbc\xed\x90\xa3\xa3\xba\xf8\x28\x69\x1f\x22\x4e\x3a\x1d\x82\xb3\x4c\x77\x76\x87\x3d\x75\xa5\x24\x72\x99\x23\x8c\x69\x3c\x6c\x23\x15\x13\x14\x55\xab\x09\xf9\xee\x5c\x75\x90\x02\xb3\x43\x7e\x72\x0e\x8c\x96\x44\x81\x17\x82\x16\x00\x49\x71\x64\x0f\xdb\x43\x80\x06\x45\x83\xc4\x78\x2e\x54\xc5\x20\xd3\x13\x18\xef\x92\xae\x5b\xd5\xf4\x1b\xf0\x9f\x9e\xc2\x49\xb8\xcf\xf0\x14\x0a\x64\xf7\x79\xa2\x03\xdb\x8b\x38\xff\x32\xaf\x3b\xaf\x3d\xa4\xe4\xaf\xd4\x55\x5d\x9b\x93\x5e\x82\xda\x76\xd5\x91\x32\xb8\xcf\x17\x3d\x73\x7d\x2c\xe7\xbe\xe9\xbe\xa6\xb6\xd6\xe0\x4e\x6e\x30\x7d\x4c\x0c\x03\xce\x08\xac\x7a\xa8\xaa\x1c\xe3\xa0\xdd\xcf\xfa\xcd\x28\x8c\xf6\xf5\x4e\xda\xe4\x70\xa1\x98\x41\x76\x64\x50\x92\x16\x5e\xa6\x62\xe4\x89\x4c\xee\x8c\x89\x7e\x9c\x0e\xbf\x9e\x42\x6a\xa5\xdf\x6a\x6a\x0d\x5f\x98\x56\xed\xa5\x04\x21\xbf\xdd\x03\x1a\x10\xcd\x07\x31\xda\x86\x57\x94\xa1\x25\x08\xb0\xe4\x63\x97\x2e\x07\x16\x40\x7f\xcc\x6d\x75\xe0\x4f\x59\x45\x9e\x13\x8b\xdb\x68\x2f\x55\x78\xb9\x62\xf8\x46\xd6\x5e\x95\x02\x2a\x97\x47\x9c\x33\x7a\xd3\xb8\x42\x96\x1a\x40\xf0\xc1\x9b\x41\xcf\x76\x48\x8e\x53\x46\x3c\x9a\xfe\x5a\x27\x10\x40\x00\x7c\xd5\x11\x0e\xc0\xdc\x8c\x22\x09\x9b\x17\x17\x6f\xbe\x24\x63\x8d\xcc\x4d\x2c\xc3\xe2\x6e\x90\x65\x7c\x61\x0a\x29\x93\xe5\xde\x1c\x7d\x33\x97\xc0\xd9\x0c\xff\x21\xa8\x69\x60\xd3\xdc\x2e\xb5\x8e\xc5\x7e\x13\x14\x08\x7e\xd3\x87\x48\x03\x0f\x51\xc8\xd5\x72\xa3\xa1\x8f\xd7\x91\x3f\x5a\xc3\x08\xe8\x8d\xf1\xd3\x50\xca\x98\x60\x1f\x30\x8b\xc9\xf2\x8a\x31\xfa\x54\xed\x7d\xe5\x23\x1d\xc1\x42\x96\x42\xac\xcb\x07\x1e\x56\x1d\x80\xe1\xa1\x6b\xf2\x6d\x53\x05\xa2\xfa\xb0\x3b\xa9\x30\xaa\x7b\xc4\x7e\x21\x45\xeb\xfe\x7b\x10\x85\x8d\x41\xfd\x1a\x76\x6d\x0f\xaa\x6e\x1e\xc8\x84\xc9\x11\x5c\x5c\x8d\x1d\xac\xff\x32\x7d\x91\x47\x65\x12\x5b\xa1\x41\x05\xa7\xb5\xdd\x2f\x71\xdc\xc4\xa2\x5b\xab\xba\xd5\x44\x02\x82\x1e\xbf\xb6\x8e\x29\x71\xf2\x2e\xd9\x91\x95\x98\x59\x87\x2c\x9a\x2f\x03\xd2\xf9\x96\xf9\x3a\xf5\xf5\x7e\xdb\xf9\xe4\x61\xfc\x1c\x35\x72\x7e\x01\x8f\xe4\xbf\xf0\x3c\xd8\xa1\x2f\xf7\xa9\xee\x62\x5a\xaf\xea\x61\x49\xc9\x29\x67\xcf\x89\x7c\x1b\xa8\xf8\x91\xe6\x0e\xdf\xa7\xe1\x6e\x10\xcb\x3e\x90\xad\xb0\xbf\xa7\xff\x6a\x20\x78\xa7\x9b\x92\x8f\xa4\xd0\xac\x1e\x4a\xf2\xda\x64\x1e\x43\x9e\xd3\x10\xa5\x0d\xc0\x45\xac\xca\xfe\x60\xa2\x30\xee\xd3\xab\x9e\xd1\x56\x79\x3c\xfe\xe5\x67\x45\x55\xa5\x0e\x06\xab\xd7\x8a\xd5\x15\x07\x05\xe2\xf1\xcb\x86\x34\x2b\x2e\x49\x56\x87\x7a\x08\x00\x43\x10\x27\xd7\x43\xea\x14\xa2\xa8\xd7\x30\xa7\xdf\x68\xa1\xa0\x51\x7c\x3a\x0a\x25\x11\x46\x8b\x2f\x35\x2a\xe1\xa4\xb9\x62\x15\xcb\x40\xac\xf5\x8c\xb3\xc1\x27\x44\x51\x94\x36\x1a\xaf\x74\x51\xcd\xa3\x96\x3d\x0a\xc6\x53\x24\x2d\x81\x5e\xbf\x1d\x3d\xfa\xba\x54\xac\x2d\xa4\x6a\x28\x51\x51\x76\x0a\xbd\x77\x4d\x2b\x88\x91\x0c\x62\x90\x36\xf8\x6f\x37\xa5\xf1\x3d\x00\x72\xb5\x90\xb1\x37\x36\x79\x8f\xe3\x91\x3d\x5d\xad\x1c\xe1\xc8\x31\x90\xe0\xb2\x6c\xdf\x09\x1e\x96\xea\xab\xb2\xb5\xd5\x67\x5f\x84\xd6\x66\xd9\x9f\xf1\x50\xc5\x94\x3e\x04\xd4\x4e\x95\xe6\xe9\xf9\xfb\xf9\x16\xee\x56\x1d\x69\x53\xc3\x72\x48\xeb\xc7\x68\x82\x18\xb0\x10\xed\x8b\xde\xa6\xe4\xcb\xd8\x99\xf9\x37\xbd\xa8\x98\xa2\x76\x78\x9f\x50\xef\xe1\x36\x71\x90\xa8\x22\xed\xd9\x49\x8a\x7b\x85\x65\x27\x79\x5c\xa4\x0c\xb6\x26\x47\x2e\x32\x8b\x1e\x20\xef\xe1\x90\xae\x3b\x70\x16\x3b\x54\x7b\x52\x2b\x89\x34\x73\x05\xc1\x83\xb2\xf3\x22\x18\x1f\x78\xbc\xa6\x24\xf7\x23\xea\xb2\x81\x67\xdb\x11\x38\xd5\xfa\xea\x04\x3a\x55\xe4\x9a\x8b\x6d\xef\xc8\x89\x85\x2d\x41\x0d\x0d\xb3\x79\xb7\xc7\x57\xc5\xc8\x48\x3a\x0f\x2b\xbc\x78\xcf\x42\x44\x12\x35\x43\xd2\xf4\x10\xe2\xcd\xa0\xca\xe8\x71\x9b\x83\x98\x8c\x8c\x23\x82\x55\x9c\x17\xf9\x97\x20\xcd\x03\x43\x74\x26\xdf\x76\xb4\x21\x66\x64\xe9\x4b\xed\x85\xcb\x0f\x29\xfd\x9a\x2b\x37\x9e\x8b\x16\xf1\xcd\x5c\x20\x4a\x9f\x79\x0b\x0a\x16\x63\x5c\xc8\x33\xc5\x20\x62\x0d\x5d\x12\x94\xec\x3a\x1c\x7e\xe9\xe9\xd0\x58\x68\x2a\xa3\x84\xa4\x31\xc9\x98\x0c\x41\x50\x5b\xf3\x38\x30\x30\x9a\xa6\xf0\x95\xf4\x79\x09\x21\x9b\x8d\xa8\x79\x99\x48\x93\x12\x8e\x2f\x44\xc5\x24\x18\xdb\x4b\xd5\xee\xba\xfc\x90\x90\x4a\xab\x3c\x0e\xc4\xb9\x75\x11\x8a\x58\xe7\x38\x5c\x6c\x98\xb0\xde\x5d\x59\x79\xdc\x0e\xe5\x65\xcd\x0c\x5b\x4f\x6b\x88\x96\x17\x25\x36\x7c\xe4\x75\xe1\x52\xd5\xa8\x57\xd4\xa9\x5a\x74\x09\x8e\x6b\xa3\xcf\x5f\x0a\x00\xe1\x95\x95\xe0\x5b\x90\x91\xf9\x6d\xbf\xa1\xbb\x3c\x0b\x35\xc1\x5f\x20\x43\xf5\x68\x81\x07\x82\x4e\x8f\x0e\x60\x70\x87\x9f\x99\xb4\x96\xa3\xe4\xc9\x52\x0d\x59\xeb\x2e\x9f\xf8\x3c\x45\xe3\xbe\xd2\xbd\xdf\xa6\x3f\x6e\x08\x83\x13\xa5\xdd\xfe\x81\x5e\xad\xf3\xa3\xf9\xb9\x34\x6f\xec\x6d\xb5\x99\x28\x8a\x48\x25\xe2\xed\x6a\x86\x0a\x29\x46\x65\x52\xda\x6b\x96\xd2\x76\xe2\x06\x25\x94\xf5\x01\x51\x46\xc1\x68\xae\x04\x59\x10\x0f\x15\x58\x48\xe8\x87\x3c\xbe\xfc\xb5\x02\xed\xec\x3c\xde\x67\x83\x98\x47\x6b\x48\x4e\x32\xba\xc0\x80\xdc\x9f\xef\x49\xa2\x12\x7f\xc1\xb2\x0b\x1d\xfb\xdf\x19\xe5\xd3\x35\xec\x38\x92\x79\xdb\x35\xe1\xb1\x80\x12\x68\x7e\xd8\x56\x09\x25\x58\x3c\x40\x37\x3c\xd1\x23\xe5\xcd\x94\x47\x81\x6d\x58\x70\xe9\xba\xeb\x7d\x54\x17\x79\xb1\xe2\x70\xc7\x3b\x19\x49\xd9\xfd\x84\x87\x15\xaa\xd9\x14\x76\x12\x15\xa8\xf8\x6b\x6c\x77\xb4\xf1\x49\xef\x55\xcf\x2e\xb4\x04\x6f\x99\x68\x80\x2f\xfa\x57\x4d\x6a\x75\xfa\x81\xc6\xa0\xdb\x6a\x4d\xfe\x6e\xc4\xf6\x83\x7e\x50\x44\x96\xa7\xb9\x5b\xb9\xf9\xa6\x04\x49\x88\xb3\x2f\x30\x7f\x65\xf4\xaa\x3a\x08\xa6\x31\x99\xf5\x70\x6c\xd7\xc0\x25\x03\x6a\xcb\xf5\x44\x4a\x16\x39\x52\x10\x80\x0f\x75\x32\x42\x48\x3b\x4e\x84\xfc\x71\x3f\x87\x4a\x29\xf1\x34\x16\x30\x59\x4e\xb5\xf0\x69\x06\x56\xbe\x11\xa5\x1c\x4c\x15\x14\xbb\xd4\x9e\xf8\xef\x23\x51\x25\xf3\xa8\xca\x22\x7f\xf8\x43\x32\x16\x1e\xdb\x57\xd5\x8f\xd3\xee\x90\x28\x7a\xfb\x40\xe7\xcd\xe5\xf1\x32\xde\xe9\xb4\x7d\xbe\x54\xe1\x36\x2e\x7d\xb6\xf2\x7a\x15\x24\x48\xd0\xb0\x3b\x20\x70\xb8\x43\x55\xc0\xb9\xc5\xe4\x60\x03\xe4\x33\xd5\xb7\x51\x86\xed\xd7\x1e\x99\x68\x04\x7a\x49\x54\xf0\x78\x03\x4f\x69\x6a\x48\xbb\x67\x00\x52\xf9\x71\x8d\x91\x12\x32\xa6\xcb\xcd\x33\x14\x57\x3d\x5b\xbe\x91\xce\x0f\x01\x25\x9c\xfe\x01\x6b\xfe\x03\x75\x5b\x94\xd2\x88\x43\x40\x84\xc5\xc3\xeb\xe1\xec\x1e\xe8\xa8\x9b\x92\x20\x77\x3c\xda\xd3\xfe\x0c\xde\x3a\x2f\x88\x8f\xec\xea\xbe\xa9\x2d\xc3\xed\x2b\x1b\xa6\xdf\x9e\x90\x4d\x01\x5e\xd5\x80\x83\x9c\x6d\xee\xc3\x8f\x3b\x79\x72\xdc\xc9\x36\xf6\x9f\xc1\xab\x10\x27\x42\xe5\x82\xb8\x64\x67\x60\x82\x8c\xa7\x0d\x9e\x98\x5a\x28\x63\x0f\x18\x1f\xbb\x71\x48\x30\x19\x4f\x48\x99\xa3\x92\x96\x8d\xf1\x80\xce\x0d\x3b\xc1\xd1\xb7\xe8\x60\x3c\x33\xaf\x4c\xfc\xda\x23\x05\x39\x1e\x30\xce\x5c\xc5\x29\x8f\x06\x2b\x45\xde\x18\x43\x67\x76\x55\x21\x8c\x1f\xe2\x5e\x01\x6f\x2c\xbe\x72\x2e\x8f\xba\x20\x01\xca\xe6\x93\x4d\x92\x24\xa4\x89\xc5\xcd\x9f\x20\x08\x24\x28\xf1\x7b\x03\x3c\x30\xfb\xe4\x1a\xc4\x52\xaa\x71\x02\xb1\x7c\x99\xe7\x0f\xa7\x56\x38\x41\x57\x69\xc2\x39\xb2\xe7\xea\x3e\xe3\xf5\xf8\x1b\x70\xc2\xd4\x3a\x86\xcc\x43\x92\x67\xa5\x14\xb4\xe4\x99\x44\xf9\x92\x80\xb6\x4b\x47\xca\x9e\xa7\x41\x7b\x02\x27\x6c\xea\xaa\x5b\xa6\x53\xf5\x56\x45\x07\x03\x21\xe2\x2b\x09\x13\x88\x8d\x18\x23\x16\x19\x51\x64\x23\xaf\x77\xe8\x5d\xf1\xe6\x06\xeb\x1c\xd6\xab\x37\x16\x6d\x69\x4f\x6a\x31\xf5\x6c\xc6\x94\x7f\x1c\x4b\xea\x98\x79\x6e\xc6\x50\xcc\x90\xba\x3a\x21\x79\x76\x34\x55\xb1\x7d\x50\x9f\x17\x24\x45\x06\x27\x6e\x57\xf5\xa9\x2d\x4b\x41\x98\x08\x70\x1f\x06\x55\x3f\x3f\x71\x63\x3e\x31\xb2\xd4\xc5\xfa\x25\x45\x62\x2c\x3b\xae\x33\x1b\x30\x6d\x91\xcb\xa8\x00\xa8\x83\x88\xae\x8b\x44\xb6\xe4\x75\x09\x30\x24\xb7\x55\x1b\x06\x0f\x52\xcf\xae\xb1\xc9\xaf\x3a\x83\xf6\x41\x58\xcf\x0c\xeb\xb8\x82\x95\xcb\x6c\x52\xf4\xb1\x7f\x50\xda\x42\xaa\xa7\x1c\xdb\xb2\xd4\x86\x46\x9c\x06\x6e\xfe\x76\x29\xb7\x42\x65\x01\x1e\xad\x98\xde\x3d\x27\xee\xc4\x73\xa7\xfa\xc3\x0e\x06\x60\x9a\x59\x58\xaa\xed\x14\x8c\x7d\xa8\xcd\xf5\xf0\x57\x2d\xbb\x09\xd3\x67\x61\xbb\xc7\x42\x70\x8a\x99\x41\xb2\x33\x38\x7a\xfd\x1b\x09\xc0\x62\x4b\x31\x20\x65\x18\xd5\xfc\x22\x6c\x9f\xc3\x5d\x34\x1c\xff\xdb\xf3\x5e\x33\x08\xee\x81\x87\xc6\x25\x12\xff\x87\x9c\xa8\x69\x02\x1d\xcb\xe1\x79\x65\x19\x7d\xbf\x69\x18\x89\x01\xb9\x7d\x90\x49\x41\x8e\x57\x19\x4c\xfe\xf3\x3b\xd6\x12\xaf\xec\x0b\xf1\xa7\xa1\x75\xda\x0c\xd1\xb3\xd2\xea\xd4\x2f\x0d\x86\x9c\x76\x42\x3c\x00\x57\x8b\xf0\x9b\x91\x3a\x37\x1a\x2c\xb7\x15\x04\x91\xad\xde\xa0\x8d\x19\x5d\x1c\xc3\x63\xe5\x89\x2c\x79\x34\x7e\xdd\xb4\x77\x72\x22\x53\x94\xc1\x17\x10\x00\xc9\x77\x6d\x5b\xf2\xa9\x29\x20\xe2\x96\xb2\x3c\x81\xa2\xe1\x5a\x59\xaa\x33\xd6\x04\x80\x8b\xc5\x87\xae\x0c\xd4\xab\xb6\x62\x55\x07\xe7\x76\xa8\x26\x11\x1d\x3a\x93\x75\xa1\x42\x02\xc1\x69\xd8\x0d\x80\xef\xc7\xa9\xd2\xdd\xa1\xe4\x2c\xe1\x2c\xca\xa7\xa1\x70\x2f\xf5\x72\x61\x0a\xd6\x9b\x0b\xd7\xca\xd3\x2d\x61\xd2\x2e\xea\xb7\x09\x09\xc4\x8d\x2d\xad\x73\x4c\x37\x4e\x6b\xec\x74\x66\x71\x3c\xcb\x68\x17\x42\x8e\x25\x5c\x21\xd4\xc8\x85\xc5\x84\x0d\x43\xf8\xdb\x0a\x29\xc2\xac\x48\x5a\x36\xdd\x30\x5e\x69\xe0\x3b\x3c\x6b\xcd\xe2\x8d\x1b\xd1\xa0\x47\xf6\x83\xb4\xc8\xe4\xf6\xbf\x13\x0d\x95\xec\x01\x74\xef\x86\xc7\xf6\x17\x05\x14\x3b\xf9\x1f\xc3\x8b\xfd\xf9\x83\x9d\x7a\x94\xc7\xa3\x1c\x18\x12\xd8\x94\xba\xfc\x66\x98\x97\x36\xd4\x8a\xe1\x7b\xa1\xbc\x0c\x15\x5d\xc5\x77\x61\xe7\x73\xa5\xe7\xe9\x7a\xdc\x58\x60\xec\xfa\x82\xf4\x31\x06\xfb\x61\x42\xf2\xf9\x5e\xde\x3e\xae\xd4\x25\xb0\x23\x06\x37\xbd\x42\xba\x16\x41\x35\xaf\x32\xef\x73\x14\x30\x9e\xbe\x0c\x34\x1d\xe9\xe5\x47\x3c\x8e\x1d\x47\xc1\x6b\xf2\x07\x82\x15\xe7\x54\x8e\xbb\x7b\x5c\x69\xb0\x8f\x08\xd1\x9d\x4c\x9f\x67\x3a\xce\x83\x4c\x42\xd1\x0a\x7e\xec\x91\xe9\xf2\x13\xd7\x78\xda\xa0\x70\xa2\x67\xba\xb0\x01\x30\x0f\x9c\x31\x7d\x03\xcf\x51\x5d\x41\x3b\x71\x49\xdf\x5e\x6c\x9c\xae\xdc\xd3\x0c\xd7\x38\xa7\x28\x4e\xef\x3a\x7e\x65\x6f\xd9\xad\xe0\xbe\x26\x30\x11\xf0\xfa\x2a\x4b\x27\xa5\xb5\x15\x88\x35\xbc\x32\x75\x22\x69\x45\x46\x17\xfd\x60\x18\x85\xf0\xf5\x63\xbe\x5e\xba\x4f\x89\xed\x0f\x25\xb4\x2a\xe0\xcc\xbd\x22\x0a\x12\x8e\x64\x4f\xc5\x4c\x7f\x8f\xd4\xae\x1a\xa3\xe6\x2e\x5e\xa2\xfd\x4d\x32\x85\x3b\x6a\x73\x42\xdf\xf2\xe4\x05\xc9\x06\xd7\x37\xe4\xe6\x9e\xab\x93\x88\x10\x17\xc4\x7c\xae\x53\xdb\xcb\xa1\xd3\x8f\x1e\xe7\x7f\x06\x3b\x34\x6e\xad\x49\xf8\xb9\xb2\x7d\x1e\xab\x87\x74\x47\x8d\xb4\x24\x23\x93\x8b\xae\x74\x31\x8e\x71\x46\xc3\x6b\x06\x72\x7b\xda\xcd\x6c\xdc\xd3\xa6\xde\x1a\xeb\xf5\x51\x93\x65\x61\x1e\x33\x18\x55\x20\x97\xba\x0d\xc1\x7a\x24\x5b\x6d\x04\xce\x59\x9a\x43\x11\x01\xeb\xa3\xf2\x27\xb5\x20\x0b\xb9\x5b\x47\x16\x14\x44\xbf\x54\xb1\x7f\x23\xe6\x91\xb9\x76\x97\xa5\x4e\xe5\x6a\x55\x51\x50\x1e\xd9\xec\xeb\xc6\xf5\x0b\x19\x90\xe3\x5e\xe7\x64\x09\xd1\xc8\x20\x66\x66\xfa\x52\x19\xf1\x76\x09\xea\x41\x33\x62\x18\x04\xb3\x97\x96\x37\x34\x54\x6e\xbb\x3f\x00\x86\xb4\x70\x1f\x36\x37\x7f\xa0\xc4\xd8\x0c\x74\x19\xf5\xa0\x89\x4c\xed\x0a\x10\x3a\x35\xb3\xdd\x2a\x86\x64\xdf\x29\x42\x2f\x99\x68\x1b\x19\x47\xcd\x5f\x69\x40\xd9\xe1\x86\xdc\x40\x0c\x15\x97\x0b\x3e\xac\x97\xc8\x88\x48\x34\x1e\x43\xa3\xb8\xf0\x4b\x04\xe5\x6f\x63\xf4\xd9\x30\x1f\x5a\x1f\xc1\x4f\x28\xc6\x85\x15\xd7\x8b\x38\x1f\x06\xb5\x60\xe6\x5d\x0f\x63\xf9\x37\x2f\x67\x95\xe1\x52\x55\x5f\x40\xd4\x6d\xf1\xa7\x4c\xe3\xc7\x5d\x0a\xfb\xf6\x22\x0a\x77\x28\xf4\x02\x9a\x7b\x73\xdf\xab\x00\xbf\x4f\x0f\x68\x07\x7e\xb3\x6a\x8c\xc2\x3a\x8a\x33\x6a\x6c\x5f\x82\x35\x49\x09\x5c\xd7\xb5\x3f\xb5\x75\x3d\x2d\xbb\xf7\x32\xe5\x88\xfa\xaf\x12\xfb\x42\x1e\x0e\xa2\xfd\x60\x10\xf8\x2e\x4d\x01\xa6\xbb\x42\x7a\xe0\x10\x1a\x69\x9f\x2d\xeb\xed\x57\xd9\x96\x92\xbd\x36\xd4\x2c\x22\xdd\x80\xd5\x3e\xac\xc0\xd0\x59\x60\x18\xb5\xf5\x10\x6b\xcb\x30\xc5\x4a\x9a\x01\x98\x88\x58\x21\x50\x39\x45\xca\xb6\x2f\xfc\x09\x40\xd9\x97\x1f\x59\x74\x49\x56\x83\x46\x01\x0f\x2d\xfb\xc5\xca\xce\x23\x95\x2a\x3d\xcb\xf0\xde\x84\xbe\xf5\x99\xe7\x16\x1b\x60\x72\x43\x32\xc9\x93\xb0\x9a\x45\x73\x78\xc6\xfb\x43\x12\xdb\x67\x1d\xf4\xe2\x0b\xa0\x49\x6e\xc2\xca\x45\x0d\xdc\x4c\x00\xcc\x9c\xf9\x44\x40\x0b\x7b\xc7\x88\x99\x0c\x60\xdb\xb6\xca\xc7\xc2\x97\xb0\x25\x06\xe6\x89\xee\x0a\xa0\xe0\xe0\x42\xc1\x82\x01\xa9\xd1\xb7\x49\xaa\x1a\xde\xf5\xba\xfc\x87\x62\xe1\xf6\x93\x63\xa0\xc5\x08\x21\x94\x06\x6a\x80\x75\x7a\xc5\x28\xe3\x0e\x60\x3a\xf0\xf3\x77\x66\x3e\x7e\xc2\xa5\x85\x22\x55\x2b\xfa\xd4\x33\x05\x4e\x55\xa3\xd6\x24\x23\x98\x68\x1d\x28\xca\x07\xc4\x2b\x61\x62\xa5\x72\xc4\x9c\x0e\x61\x5c\xd8\x59\x62\x13\xf7\x86\x17\x13\x1c\x78\x5a\x4e\xad\x07\xfc\x92\x69\xdf\x1d\xa2\x00\x51\x0b\x56\xa1\xd4\xa9\x14\x4b\xe1\x14\xf2\x98\x23\x0d\x68\x19\x5a\x4c\x9b\x95\x99\xa1\x78\xf6\xde\x5d\x39\x80\x86\xf9\x8c\x77\xd4\xa2\x33\xdf\x53\xfb\x01\x30\xc4\x01\xcd\x61\x8b\xb2\x27\xf3\x0b\xd0\xa8\xa8\x6c\xad\x4f\x89\x16\xc9\x33\x9d\x39\xd3\x43\xc4\x00\x3a\xd8\x37\x8b\x76\xaf\x71\xa4\x97\x6a\x3e\xb0\xac\xe3\x93\x69\x15\x55\x9a\x37\x71\xd3\xb5\xa8\xce\xb2\xf4\xa8\x8f\x74\x8e\x89\x0f\x65\x5f\x7f\x96\x98\x4f\xeb\xda\x95\x2f\x1e\xec\x1d\x96\x2e\x30\x15\x0f\x89\xb2\xf8\x21\x17\x99\xfb\x16\xb4\xe3\xfe\xe1\x32\xb7\xac\xdd\xcb\x1c\xe2\xc5\xf9\x62\xd5\x55\x73\x21\x7c\xdc\x69\x56\x63\x7c\x4f\x95\x71\xa1\xf5\x39\xa1\x40\xa3\xef\xe5\xaf\x76\x64\x44\x3a\x11\xfd\xc9\xf9\x85\x50\x40\x11\x58\xad\xf5\xfe\xc4\x7b\x5d\xc1\x8b\x36\x18\x0e\x60\xaf\x07\x8b\xb6\xb3\x94\xb9\x62\x67\x43\x08\xe4\x5e\xa3\x01\xe7\xbc\xc1\xc7\xc9\x13\x5e\xdc\xae\xab\x8f\x11\x3c\x16\x38\x02\x1c\x6d\x36\xb1\x5f\x4c\x92\x13\x6e\x72\x93\x83\x3e\x47\xb8\x13\xd2\x86\x0f\x24\x43\x6b\x0a\xb4\x72\x1c\xba\x01\x82\x65\x30\xf5\x2f\xcc\x47\xef\xff\xe2\x17\x1c\xf9\xc3\x1d\xed\x8b\xa5\x04\xc1\x09\xaf\x8b\x45\xca\x3e\xc4\xaf\x1a\xae\xf1\xe5\x49\x7a\xc2\xab\x12\x54\x3f\x9c\x6d\x7c\x0f\xa4\x82\xd5\x08\xb3\xc1\x75\x80\xb2\x22\x46\x55\xea\xf9\xc5\xba\x08\x50\xe2\xac\x91\x6f\xae\x88\x1e\x5d\xf8\xf8\xf6\xdb\x03\xb5\x62\x7f\xc8\xaf\x9d\x58\xbe\x54\x4a\x0d\x34\x5c\x94\x9d\xbf\x0d\x6d\x5f\x98\x87\x31\xbe\x71\x0c\xe8\xe3\xac\x67\x75\xb3\x9e\xec\xab\x0f\x49\x91\xef\x07\x51\x6d\x45\xc7\x08\xa5\x9d\x4c\x19\x1c\xf3\x01\xda\xbf\xb4\xa1\x80\x00\xa5\x18\xb4\x29\xd5\x2a\x72\xed\x8a\x65\x74\xc8\x9f\x30\x2e\xfa\xd4\x80\x81\xf1\xd0\xc2\x82\x7c\x9e\xae\x36\x1b\x04\x1a\xab\x31\xd8\xd2\xae\x34\x12\xb4\xf3\x77\xa1\xb8\xaa\x64\xf4\x1e\x7a\x87\x37\x18\x94\xfd\x9c\xeb\x34\x36\xdb\x80\x19\x5d\x93\x63\x09\x80\xcf\x97\x34\xd6\xa5\xef\xa2\xbf\x74\x85\x14\x02\xe9\x6b\xad\xd2\x69\x2a\xca\x14\x32\xe6\x07\x1f\xf7\x88\x94\x62\x93\xf0\x1c\xe9\x33\x1a\x60\xc0\x5d\x5d\x20\x99\x3b\x2c\xee\xe4\x88\xad\x98\x86\xda\x9a\x19\x27\xf7\xa0\xf5\xfd\x91\x4f\xd1\x36\x42\x1a\xe7\xf5\xdd\xfc\x61\xd8\xdd\x41\x4f\x74\x20\x5b\xf6\xeb\x7f\x77\x08\x0b\xb9\x46\xc5\x01\x7c\xc2\xb3\xcf\xe6\x8f\x22\xd2\x41\x0a\xa1\x1d\x0b\xc1\x73\xeb\xdf\xb7\x85\x4e\x5f\xd7\x79\x51\x59\xa9\xc0\xf3\x58\xd3\x0f\x9d\x47\x9a\x05\x08\x92\xc4\xf8\x57\x86\x82\x50\x6d\xad\x8f\xf3\x78\xdb\x5e\xf5\xa9\xdc\xd3\x1f\x1d\xfc\x42\xdb\x31\x56\x77\x8b\x4a\x2b\x96\x86\x90\x3c\x57\x69\xe6\xc2\x40\xd5\x37\x29\xac\x18\x31\xe2\x37\xc1\xef\x29\x57\x82\x22\x09\x8f\x0a\x40\x6b\x88\xb4\xd0\x02\x3e\xe6\x8d\x88\x60\x53\xc7\x9c\xea\xea\x0c\xbc\xd0\x4f\xb1\x90\x80\x1a\xe6\xa0\xcd\x8d\x0e\x9c\x34\xec\xc3\x2f\x00\x20\x0b\xee\x20\xf2\xf4\x17\x99\xca\x0b\x19\x9c\x9c\xc9\xa7\x68\xfe\x24\xed\x12\x14\x0e\x58\x6c\xbf\x58\xa1\x1d\x0e\x40\x63\x1c\x97\xf7\x81\xa2\x3a\xf1\x77\x53\x95\xfc\x9d\x4d\x6f\x4c\xd3\xd7\xbc\xb8\x3d\x77\x90\x65\x4d\x14\xf7\xd1\x71\x3c\xeb\x31\x61\x50\x87\xaa\x5f\xcc\x0c\xf8\x30\xf1\xfe\x54\x16\x8d\xa0\x9f\x13\x7f\xde\xc2\xa0\xb7\xae\x46\xa9\x7b\x5b\xec\x43\x0c\xdb\x1b\x30\x3b\xa6\xf8\xde\x4f\xf5\xaf\xd7\x45\x28\x32\xa7\x13\x28\x46\x27\xd4\xf7\xe3\x92\xa6\x14\x54\x96\xa9\x52\x5a\x92\xbc\xaa\x86\x0b\x37\x80\x03\x2d\x93\x1a\x72\x32\x0a\x89\x36\xb8\x33\x0f\xa6\x09\x90\x64\x48\x8f\x32\x08\xaa\xca\xdb\xab\x5d\x28\xaa\x98\xc5\xf2\x67\x80\x99\x3b\x42\xb8\x47\x20\x1c\xfb\x40\x57\x95\x89\x72\x7d\x00\xca\xbe\xa8\x50\xbb\xca\x7c\xfa\xb8\xce\x48\x87\xb7\xb7\xf8\xe6\x59\x30\xbc\x15\xc5\xfc\x33\x8e\xb7\xd1\xa6\xec\x45\x2a\xe5\xbe\x98\xb6\x42\xbd\xf6\x11\x48\x33\x5c\x9d\xaf\x71\x64\xe5\x64\xce\x00\x5d\xde\x2b\x85\x24\x45\x41\x5a\x50\x7e\x9a\xbd\x69\x20\x6f\xe0\x41\xad\xf8\xd5\xa7\x37\xb9\x14\x9e\x5a\x45\xc5\x12\x33\x96\x52\xc4\x66\x45\xad\xfc\x5a\xd0\xa1\x1e\xf7\x33\x0f\x99\x20\x9b\x61\x89\x6c\xe8\xe5\x1e\x67\xd5\xa8\xd1\x9f\x5a\x67\x8d\xe8\x98\x4a\xbd\xb5\xe2\xa9\xc3\x27\x30\x68\xed\xec\xf9\x0d\x68\xce\xeb\x26\xc1\xea\x23\x9b\x27\xf9\x15\x7e\x8e\x1b\x19\xdf\xfb\x2c\x62\x7e\x51\x66\x37\xf1\x91\x7e\x8b\x2f\x3c\x88\x05\x1f\x64\x84\x8a\xc5\x22\xf1\x3f\x4c\x01\x24\x52\x9d\xcf\x9d\x28\x17\xb4\x49\x77\xaa\x19\x45\x6b\x27\xa7\x01\xa7\xf9\x6a\xaf\xbe\x00\xdf\x42\x0a\x13\x2a\x83\x2c\xde\x05\x2e\xc2\xa6\x35\x43\x04\x2b\xaf\x9f\xcd\x30\x20\xbb\x24\xe0\x7e\x06\x3e\x6c\x55\x72\x27\xe4\xcf\x38\x38\x1b\xd4\x30\xe5\xe2\xc5\x93\x2b\xeb\xe2\x25\xf1\xb1\x52\x23\x26\xe1\xb3\x86\x8a\xc9\xec\xcf\x33\x6e\xc6\x01\xfd\x30\xc4\x6e\x11\xd6\x04\xbe\x83\x02\x29\x55\x79\x13\x21\xb2\xae\x14\x31\xe7\xb6\x8d\x34\xce\xb2\xc1\x10\x7d\x31\xc6\xe3\xa2\x58\x52\x53\x1e\x62\xcb\xd2\xc4\x32\xf4\x11\xb3\xa0\x23\x0e\xb4\x56\xab\xb0\x03\x11\x8f\xa2\x01\x16\x34\x17\x64\x69\x40\x1a\xc9\xc6\x36\x9c\x20\x26\xf8\x4e\xa0\x1a\x50\xff\x5e\x09\x4e\x0f\x27\x82\x9b\x0f\x54\x43\x82\x2d\x8c\x0b\x48\x3f\xd8\x37\x08\x4b\x5a\x9d\x31\xb4\x2d\x61\x3c\xac\x73\x24\x60\xa4\x16\xc7\xaf\x0d\xae\x96\xf1\x41\xf5\x1a\x8d\x68\xdb\x9c\x12\x06\xd5\x62\xd4\xe3\xb5\x89\xa2\xe3\xe4\x62\xc0\x37\xd6\x01\xa7\xba\xb2\xd3\x0c\x6e\x10\xf0\x27\x58\xd4\x3c\x92\xd8\x07\x80\x21\x5c\x3c\x20\xc4\xd0\xe3\xb7\xe4\x16\x8b\xf6\x05\xa5\xcf\x78\x37\xfd\x46\xa3\xef\x36\x54\xef\xad\xc5\x8b\xcf\x41\xe3\x9b\x96\x45\x5a\xf8\xe5\x04\xb8\x64\x58\x4c\x03\x2f\x84\x0e\x81\x59\x0b\x87\x8a\x2a\x4f\xe4\x44\x07\xe1\x89\x60\x3a\x11\x54\xfc\x67\x2f\x25\xff\x98\xba\xac\xda\xe8\xc5\xbb\xbe\x95\x29\xb9\x88\xc7\xcd\xd3\x1e\x04\x73\x66\x03\x5b\x99\x7d\x81\xa3\x59\x5c\xb5\x83\x6c\x92\xfd\x11\x2e\xd0\xf6\x2d\x2d\x51\x27\x45\xbe\xbf\x90\xaa\x44\x56\x2b\xa9\x70\x4f\xeb\xa7\x48\xd9\xb9\x8b\x4a\xc2\x28\xea\x46\x7b\xbf\xf3\x13\xda\xfd\xee\xf9\x4c\xd2\xc4\x0b\x1b\x67\x53\x2a\xd4\x23\x9b\xad\xa8\x12\xe7\xe0\xe0\xa5\xe1\xaf\x3d\xa1\xab\x1e\x46\x35\x93\xfb\x72\x1c\xaa\xe7\x3b\xc8\x11\x2f\x08\x13\x7f\x23\x6a\xb4\x2e\x1b\x4f\xaa\xa2\xf4\x7d\x8a\x34\x97\x72\x06\x8c\xb8\x45\x70\x94\xcb\xce\x43\x45\x09\x80\x99\x02\x01\x3f\x11\xc5\x4a\xf1\x20\x89\xdd\x3e\xa1\x18\x53\x1a\x1e\x43\xf3\x2c\x57\xf0\x73\x75\x62\x4e\x96\xba\x77\x1f\x32\x2f\x8e\xb0\xb1\x41\xcf\x76\x84\xf9\x20\x18\xd2\x33\xfe\x54\xa2\xf7\x20\x9a\x90\x1a\x71\xbb\xdb\x64\xb4\x6b\x1a\xb7\xb2\x6c\x1b\xa4\x28\xb0\xa2\xfb\x31\xf5\xf3\x1c\xac\x87\x5d\xe2\x59\x40\x10\x65\x42\x59\x7e\x41\xba\xf1\xec\xc4\x91\xaf\x11\x47\x11\xec\xda\xf9\xc1\xb9\x63\xd3\xe8\x15\x73\x44\x30\x97\x40\xce\x1e\x04\x71\x03\xd5\xc0\xdc\x8e\x2b\x6f\x74\x3e\xb9\xe6\x34\x79\x71\x77\xaa\x73\xbd\xcd\xce\x63\xc9\x29\x55\x1a\xf3\xa6\x04\x62\x89\xd6\xf6\x76\x12\x97\x7c\xc4\x11\x73\xef\x56\xf4\x11\xd5\x91\x41\xfc\x58\xf3\xe6\x75\x64\xc4\xfb\x40\xa6\x74\xb4\x47\xd5\xb8\x0f\xa5\xbe\x08\x98\xd4\xd6\x04\xc0\xcf\x31\x33\x1e\x07\x1b\xf6\x66\xe1\xd2\x3b\xe2\xae\xc9\xaf\x3d\x7f\xb6\xbe\xcb\x20\xfe\x2b\x54\x6b\xaa\x59\x8d\x45\x3c\xe5\x36\x47\xee\x43\xd0\x60\x32\x71\x55\x77\x0b\x7d\x25\xed\x61\xe0\xb9\x8f\x15\xbb\xaf\x00\x5a\xce\x18\xe0\x78\xaf\x92\x32\x1d\x91\x92\xa0\xdc\xa3\x44\xc8\xb2\xa6\xae\xb5\x20\x23\x88\x5c\x87\x4a\x6b\x0b\x54\xa7\x21\xa1\xf2\xcb\x8e\x24\xe4\x0b\x33\x11\xe6\x10\xf5\xdf\x40\x18\x0e\x27\x06\xe1\xfc\xf5\xe2\x85\x21\x38\xa2\x1c\x92\x07\x9d\x2d\xf4\xd3\x2f\x37\x38\xf4\x19\x74\xe3\xcf\xcd\xaf\x03\x33\x7e\x46\x62\x17\xe7\x22\x9b\x7a\x01\x88\x6d\x8e\x2f\x2a\x7f\x37\x4a\xc2\xb2\xc7\xa1\x52\x2c\xdf\x21\xcc\x2e\x11\x33\xd6\x9e\xb1\xd3\xf4\x55\x1f\x65\xe4\x18\x6c\x5b\xc9\xbf\x86\xcb\xd6\x9b\xb9\x23\x35\x20\x22\x67\xcd\xe2\x53\x2e\xd6\xbd\xb9\x2c\x6d\x37\x94\x2e\x8c\xb9\xf1\x10\x39\x5e\x55\x49\xa0\xee\xad\x66\x28\x06\xd9\xbb\xcf\x94\xbf\xeb\x64\xfc\x93\xa7\xf5\xa4\x4e\x88\xa9\x78\xbc\x14\x04\x32\xa5\xd8\x95\xea\x6c\x8a\x1e\xf3\x1a\x19\x90\x98\x28\x2d\x93\xcf\xdf\xb1\x2e\x61\xd8\x4a\x1f\x5a\xde\x2a\x1e\xb4\xa9\x9a\x07\xd4\xc2\xd4\xab\xc3\x59\x0a\xdc\x61\x71\xf2\xa8\x13\x89\x5c\x3f\x07\xab\x6d\x4f\xe1\xf4\x42\xea\x46\xd6\x80\xb3\x3c\xd6\xd2\x57\x78\xdd\xbd\xa9\xe2\xb3\x81\x91\x21\x32\xdd\xc4\x6c\x07\xed\x7c\x60\x56\x6b\x07\xdf\x49\xd0\x40\xe3\x25\xd8\x19\xe0\xed\x45\x0c\xe9\x10\xe7\x77\x8a\xb7\x16\x35\x9d\xf1\xb6\x36\xe3\x27\x9f\x86\x19\x39\x61\x55\x93\xac\x2e\x24\x59\xd9\x7d\xaf\xcd\x07\xb7\x03\x02\xf1\x38\xa6\x7c\xc9\x58\x4e\x47\x94\x92\x95\x08\xcf\x6c\x0c\x07\xcb\x8f\x14\x93\xbf\x94\xde\xcf\x09\x7d\x32\x93\x41\x01\xc4\x8d\xd3\x92\x60\x39\x74\xc6\x5d\xea\x77\x3c\xf7\x43\x9d\xce\x2c\xa5\x0c\x03\xb4\x20\x2b\x87\xc3\xd5\x3b\xe2\x35\x64\xdd\x11\x76\xae\x3f\xb0\xb3\xcb\x32\xee\xe8\x74\x4d\x03\xb1\xd8\x5b\x8b\x54\xb8\xe4\xbc\x1d\x2e\x5e\x42\x17\xb8\x9b\x98\x56\x79\x5b\x29\xfb\x5c\xeb\x9a\x7d\x1a\x33\xef\x61\xa6\xf4\xab\x0e\xfb\x31\x86\x1e\xf5\xd5\xf7\x62\xe6\xec\xf3\x2d\xd9\x18\x5f\xf9\x64\x72\x5c\x55\x70\xc4\xc7\xf0\xe2\x38\xda\xdf\xab\xfe\x4a\x26\xd1\xd8\xc6\x6f\x0b\x8a\xe5\xc7\x87\x82\x26\x21\x21\x28\xba\x19\x1c\x04\x4a\xad\x33\x15\x1c\x29\x2a\x7c\x9a\x35\x2b\x4b\x9f\xec\xb2\x8c\xec\x9d\xd3\xa8\xe5\x24\x0d\x67\x4e\xea\x1a\xac\x8c\x39\xf1\xb2\x0d\xa0\x6a\xf8\x2a\xbc\xed\xbf\x3d\xb1\x3a\xe4\x3e\x1a\x5a\x67\xab\xa5\x16\x12\x15\xa9\x9b\x06\x8d\xe0\x18\xd5\xd6\x20\x1b\x87\x14\x0e\x66\x8c\x4e\x48\x13\xb7\xbb\x54\x6c\x59\x9a\x39\x46\x30\x08\x2c\x20\xec\x79\x9f\x6b\xa7\x40\x50\x56\x4e\xb4\xb7\x02\xb6\xf5\xbb\x90\x30\x20\xec\x62\x31\x1a\xc5\x5c\xc0\xcc\xb9\x71\xf6\xcb\xaf\x06\x54\xed\x49\x24\xb2\xc3\x21\x7d\xe3\xd0\x02\x27\xa6\xdb\xa2\x21\x94\x6d\x97\x12\xdc\xa2\xa5\x08\x30\x9a\xb9\xcc\x67\x72\xe0\x9a\x4c\x38\x75\xe3\x5b\x4c\x0f\x36\x99\x9e\x72\xcd\x37\x8e\xcb\x7f\xb1\xa5\xe4\x20\x4c\x29\xb9\xab\xd0\x07\x33\x99\x5c\x7d\x8b\x3f\x4b\x9f\xd5\xcf\x16\x77\x1b\xb5\xef\x89\x92\x76\xca\x9e\x5e\x1a\xa9\x4d\x1e\x3d\xa2\x49\xa1\x27\xa0\x42\x37\xa0\x96\xc6\x67\x80\x70\x83\xa9\xd8\x73\x05\xd8\xa8\xc2\x8e\x9b\xf1\x7f\xa5\xa5\x52\xb6\x71\xda\x1b\x66\xb0\x29\x16\x77\x19\xff\x52\x13\x39\x0d\x2e\x9c\xda\x2c\xe2\xad\xdc\x80\x03\x6f\x34\xa7\xde\xc0\x65\xa8\xfe\xa5\x10\x5e\x23\xbb\x1d\xa8\x09\x46\x6c\xfd\x8f\xb2\x2b\x68\x7b\x5b\x7a\x02\x5c\x3e\x87\xde\xdb\x22\x13\x78\x53\xd5\x8c\x63\xb4\x68\x9a\xd4\x32\x82\x24\x03\x29\x06\x83\xc7\xb0\x07\x7c\xea\xcd\x03\xae\xae\x40\x28\x65\x85\x74\x80\x97\xf7\x21\x5c\x2c\x9d\x53\x5a\x3c\x05\xee\xe8\xf2\xc1\x29\x7b\xd2\x9c\x61\x57\xb2\x68\xca\x35\xb4\x60\xef\xac\xa2\x24\x9f\xc2\xde\xe6\x28\xd1\xbb\xa0\x2b\xf5\x09\xd4\xb7\xa3\xa5\xe5\x4f\x69\xf6\x47\xd6\x48\x79\x93\x47\x34\xfc\x62\x64\xe3\xe2\x70\x4d\x9e\xcc\x59\xc0\xa7\x09\x8d\x64\x79\x21\x3a\x87\xe8\x8e\x48\x42\x1d\xf2\xf1\x98\xe5\xc7\x54\xc2\x4f\x38\xf9\x24\x6a\x67\x36\x71\x4d\xbd\x3c\xc4\xea\xc5\x66\x30\x2f\xcb\x8a\x99\xa2\x52\xfe\x68\xec\xc9\x8d\xb2\x38\x70\xd0\xbc\x3a\x40\x47\x2c\xed\x0d\x3b\xbb\x63\xdd\x3d\x70\xe3\x72\xa1\x52\x48\x27\xa0\x66\x78\xc4\xaa\x37\x93\x83\x90\xdd\x26\xbd\x7c\xbe\x4e\xe0\x52\x9c\xb4\x3d\xd9\xd6\x0d\x1f\x6a\x2d\xf2\x52\x61\x60\x70\x9c\xcd\x8b\xc8\x53\xbe\x3a\x3e\xf3\xc3\x95\x37\x42\xd2\xac\xf4\xe4\xa9\x2d\x6a\xe7\x55\x4b\x85\x30\x44\x58\xf1\xd9\x59\xa8\x45\x42\xf5\xd3\x7e\xdc\xb1\xae\xf9\xa3\x5c\x2a\x66\xa4\x34\x05\x87\xa2\xd5\x4a\xac\xdd\x4f\xf7\x55\xe6\x28\x7e\x15\xd5\xb9\x75\x2f\x60\xe0\x82\x30\xfa\xb8\x82\xbe\x13\xee\x3a\x11\xb6\xb4\x3d\xdf\xcf\xd0\xc6\x23\xf1\x3a\xb0\x14\xf2\xc3\x3a\x14\x5e\x88\xdf\x47\x11\x08\xbc\x7f\xf1\x54\xae\x8d\x30\x40\xdf\x06\x3e\xc4\xc9\x3c\x95\x70\x73\x4f\xb5\xda\x9b\x67\x15\xc2\x02\xaa\x4e\x6d\xee\x44\xd8\xda\x1c\x61\x9e\x3d\xb5\x73\x1d\x01\x84\x0b\x9f\x3f\x2c\x6d\x99\x66\x22\xe0\xb3\x21\x0e\xd9\xf1\x90\x63\xa9\x27\xd5\x97\x90\xc3\xcb\x57\xe8\x40\x8f\x1f\x72\xb8\xd3\x95\x71\xc4\x84\x3f\x84\x06\x2f\xf2\xa0\xb2\xdd\xcd\x86\x84\x5c\x24\x95\xa0\x4b\x44\xa5\x66\x85\xcd\x2c\xa3\x46\x83\xdd\x7b\x55\xe9\x65\xa7\x37\xfa\xa6\x0f\xd1\xa9\xa8\xb1\x56\xab\xb6\x78\xc7\xd9\x2d\x70\x92\xc6\xab\xd7\xe0\x5d\x18\x56\x72\xd4\xe4\xc4\xf9\xfc\xd2\xec\x5a\x60\x17\x32\x79\x00\x38\xd6\x38\xd2\xbc\x8a\x2d\xfa\xea\x5c\x7e\x06\xd8\x1d\xa6\x5c\x0d\x2c\x86\xcd\x6c\x1a\x5c\x8e\xc1\x3c\xdb\x13\xfa\x25\xd8\xbd\xbb\xd2\x85\x83\x1c\x3d\xd1\x90\xe0\xd3\x1d\x1b\xa7\x0f\x0d\x23\xfe\xb0\x15\xcd\x54\x3c\xc9\x87\xdb\x14\x93\xda\xa8\x60\x8b\x1b\x10\x8b\xef\xea\x8e\x6a\x96\x57\x8a\xc6\xc5\x94\x57\x99\x00\x8d\x91\x1d\x9f\xb9\xb6\x02\x3b\x69\x00\x61\x28\x17\xf0\xa0\xfa\x10\xba\x6a\x92\x7a\x20\xf0\x11\x1f\x99\x34\x27\x3a\xe0\x84\x97\x52\x2c\x78\x89\xe7\x09\xd9\xae\xb3\x2f\x9d\x16\x3f\x1d\x65\x8a\xb2\x1a\xc6\x6f\x72\xc7\x9f\xac\x1c\xda\x59\xec\x16\x0c\xbb\xe5\x3d\x6a\xd3\x7d\x9d\xda\x4b\x26\xe6\x80\x5a\xbe\x30\x68\x48\xf9\x4a\x57\x9f\x9d\x80\xc7\x17\x4f\x67\xc3\x1b\xf7\x72\xd8\x39\x38\x0a\x04\xa5\xd2\x18\x67\x46\xf3\x9d\xf4\x3d\x64\xf1\x3e\xbe\xcd\x6d\xbf\x88\x86\xcb\x87\x2c\x4a\x30\x12\x7e\x28\xc2\xf3\x33\x29\x89\x77\x35\x96\xe9\x5b\xc7\xac\xd7\x1c\x62\x02\x32\x79\x78\xfe\xa7\x63\xc2\x9b\xa8\xce\x32\x9e\x89\x76\x66\x62\x15\x85\xe5\x90\x1a\x86\x21\x25\xdc\xee\x3c\x33\xd4\x2c\x67\x0d\xda\x7b\x90\x18\xf3\x24\x98\xd2\xc8\x8c\x22\x17\xb4\x72\x5d\x7f\x50\x3b\xd3\xd4\xee\x03\x62\xfa\xb9\x29\x6b\xdd\xd0\x52\x30\x38\xfc\x10\x93\x6a\xea\x7c\x97\x25\x26\xa7\x7d\x65\x96\x3f\x4b\x0a\x82\xd3\x88\x80\x38\x38\x05\x91\x03\xd7\xfb\xe7\xe1\x97\x51\xa3\xa9\xda\x9f\x96\x1e\xed\xdb\x8b\x28\xe1\xb2\xb8\x57\x29\x5e\x88\x11\xf3\xc6\xf0\x96\xde\x1a\x7a\x0a\xd7\xa9\x69\xfe\x6e\x39\xa2\x36\xbd\xf7\x6e\xcd\x0f\xd3\x05\x9c\x9f\x60\xe6\x1e\x54\x10\x3e\x8f\xdf\x1e\xd8\xfc\x98\xd9\x43\xfd\x7e\xc3\x06\x1f\x3f\x37\xf9\x2e\x0b\xdf\xd5\x0a\xb7\xae\x5d\x4e\x2a\x1e\x4f\x4a\x92\x6e\xf0\x6a\x4d\xcc\xe5\xdc\x56\xa4\x8a\x0b\x37\x95\x41\x1d\xd9\x43\x14\xaf\x2c\xfe\xe0\xdf\x71\x49\x88\xeb\x3e\x8a\xf8\xc1\x4d\xdf\xa1\xa7\x77\xb4\xb4\xb6\x14\xc3\xa1\xc8\x89\xf6\xb2\x15\xdc\x2a\x45\x14\x76\x5c\x1e\x65\xf0\xa8\x3e\x69\x23\xfd\xa8\x14\x92\xcc\xd7\x73\xf9\xad\xc8\x7b\x47\xa8\x02\xb3\x09\xb8\x8a\xa9\x3f\x36\x77\x71\x45\x32\x7c\xc9\x15\xbd\xce\x9d\x6b\xcd\x95\x78\x68\x86\x6a\x81\xf7\x9c\x37\xcc\xe3\x56\x83\x49\x75\x6f\xf2\x7d\x70\xe8\x8d\x66\x16\x37\x52\x38\x92\xac\x74\x26\xdf\x03\xc2\x92\x53\xe0\xae\xb0\xfd\x54\x89\x03\x4f\xca\x5f\x49\x5d\x2f\xac\xaf\x20\xb4\x49\xc3\xe1\x75\x98\x76\x57\x2f\x0c\x9e\x30\xfb\x43\xe3\x9f\x9f\xae\x3e\x25\x8d\x47\x44\x1c\x79\xd5\x4a\xdb\x14\x0f\xda\xd0\xd3\xa2\x64\x12\xdb\x0c\x6e\x17\x32\x42\x77\x1c\xad\xe0\x47\x38\x39\x88\x78\xec\x0c\x0c\x64\x36\xdd\x22\x69\xd3\x9f\x2c\xd3\x07\x78\x1f\xc7\xf6\x53\x01\x74\xfc\xd1\x20\x7d\xf2\x07\x65\xb2\xd2\xa7\x9f\x31\xe9\xdc\x80\x08\x72\x45\xa1\x47\x15\x75\x51\x20\x56\xe1\x45\x51\x35\xe5\xd1\xc0\x1d\x20\x4f\xe8\xe9\xe0\x80\xbc\x46\x29\x6a\x82\x88\x07\x27\xdb\xd1\x2f\x18\x74\x2c\x88\x63\x5f\x13\x97\xe4\x2c\x75\x3d\x15\x3b\x73\x0f\x8a\x84\x45\xcc\x14\x8a\x90\xd7\x54\x2c\xfc\x78\x12\xa5\x16\x2f\x0f\xe1\xcf\x48\x29\x99\x53\xb2\x45\x76\x26\xd3\xdd\x4f\x5c\x2d\x8d\x78\x78\x07\xc8\xbe\x47\x7a\x27\xc9\x61\x28\xed\xa6\xf7\xa9\x83\x83\x71\xd2\xa2\x2c\xcf\xdd\x0f\x82\x4d\x70\xd4\xc7\x53\x68\xc0\x00\xab\xa0\xae\x46\x50\x49\x01\x2c\xec\x18\xd9\x6f\xbb\x30\x6f\x14\x96\xf7\xdd\xe0\xab\x2c\xa6\x7f\xf9\x94\x3e\x6b\x0b\x66\xc4\x70\x01\xdf\xdc\xaf\x60\x0a\x1f\x03\x3d\x24\x49\x15\xec\xfa\xfe\xfa\x2d\xaa\xbe\x4b\x01\xe8\x73\xf7\x14\xbb\xf0\x00\x55\xd3\xa5\xb8\x5f\x76\x48\xf0\xef\x4f\x55\x36\xdd\x3a\x12\x5d\x1b\x40\x82\xc9\x96\x81\xa7\x37\x9c\xc3\xb7\x39\xe6\xa0\x2a\xc0\x30\x58\x70\x50\xa1\xbe\xc3\x57\x29\x1a\x88\xad\x16\x5f\x3d\x83\x27\xd5\xa2\x1e\x8a\x6a\x32\xe2\x15\x75\xba\xf8\x21\x48\xb2\x31\x00\xcd\xbc\x9b\x93\xa6\x07\x55\x1f\x66\xc2\xcd\x56\x9c\xcb\x52\x4e\xd8\x4f\xbf\xea\x33\x1c\x0c\x15\xc1\x93\x68\x4c\xcc\xd5\xce\x56\xcb\x04\x74\x4f\x1a\x3d\xcb\x1c\xc5\x87\x9e\xdf\xea\x08\x99\x70\x7f\x7c\xbb\x38\x54\xf0\xb9\xb7\x56\xa3\xa8\xe2\x13\xaf\x34\xbf\x7e\x75\xda\x02\xba\x0e\xad\x9b\xf8\x15\x90\x9a\x1f\xa8\xd1\xc6\x5f\x08\xc1\xff\x4d\xba\xba\xe8\xb0\x22\x35\x88\xbf\xf0\xbd\x5b\xaf\x73\x8c\xbd\x1b\x7e\x7e\x5c\xe1\x0e\x36\xff\x40\xbf\x91\xc5\x3c\x5a\x02\xc8\x79\x56\x2e\xf6\xfa\x45\x9b\x77\xb9\xdf\x10\x83\xb2\x76\x1b\xc7\x5c\x01\x10\x5e\x7d\x76\xce\x57\x8f\x0b\xe6\x02\x4d\xa3\xc0\xc8\xa6\xd6\xa0\xa4\xfc\xac\x0a\xcd\xbd\x49\x20\x3c\x80\x26\x45\x29\x86\x65\xd7\x0d\x1f\x3f\x31\x79\x2d\x67\x25\xef\x7a\xb0\x79\xd7\x59\xac\x88\x8b\xd1\x55\x10\x4a\x65\x16\xeb\xc8\x74\x47\xee\x34\xc2\x2f\x3d\x02\xb0\x38\x44\x22\x62\xcf\x15\xba\x07\xd5\x89\x9b\x48\x65\x8e\x45\x89\x57\xfe\x8b\x86\xb2\xe4\x9f\xbb\x0d\x13\x14\x91\xc1\x2c\x7c\x9e\x02\x47\x53\x11\x02\xb3\xaa\x70\x06\x36\x8d\x0e\x2e\xb4\xde\xd7\x9b\xee\xbb\xb1\xfb\x2d\xb1\x5a\x8c\x98\xd3\x65\x3c\x7e\xbe\xfe\xb3\xcd\x80\x2b\x47\xb6\xe8\x8c\x82\xbe\x27\xf3\x37\xa1\x5c\xa3\x92\xd5\x81\x45\x1f\xf0\xce\x75\x89\x6a\xfe\x61\x92\x2a\x30\xa3\x62\x80\xfe\x2c\xf4\x12\x90\xb9\x96\xdb\x9a\xd1\xbc\x2f\x8e\xb0\xe5\x5e\xb4\x93\x51\xce\x84\x67\xeb\x9a\x67\x04\xaf\xff\x46\x44\x0e\x2e\x9b\x6e\xa2\x5b\x0c\x3d\x58\xd5\xce\x7b\x37\xd9\x98\x60\x2e\x82\x8c\x53\xf2\x85\x80\x4f\x47\xd7\x32\x14\x6e\x59\x99\x5e\x32\x5e\xb4\x6e\xf5\x09\xf3\x2e\x80\x8b\x33\xab\xf8\xc8\x2e\x5d\xda\x34\x92\x26\xb9\x09\x11\x0b\x27\x11\x4d\x20\x07\x74\xa1\x8a\xc2\x83\x0e\x84\x0a\xfd\xd0\x9e\x42\x6b\x2d\xe3\x3b\xd3\xbc\xbc\x85\x8e\xc9\xcc\xe3\x40\x25\xad\xdf\x01\x72\x8e\x9c\x92\xef\x21\xd2\xf2\xab\x69\x3a\xae\xbe\x61\xce\x4f\x94\x84\x0f\x52\xa3\xf3\x85\x3d\xa9\x58\xc1\x24\x29\x1d\x1f\xde\x10\xd5\x5a\xc4\xfd\x19\x8b\x9c\x71\x58\x93\x98\x10\xef\xc8\x76\xab\xf8\x76\xd0\x43\xd0\xee\x6a\xcc\x23\x2f\xb5\x38\xbd\xb7\xda\xbf\xc0\x95\xf5\xe6\x32\xba\xb2\xcd\xe2\xf6\xf3\x5c\xbc\x13\xe5\xb5\xc4\x10\x18\x28\x3b\xa1\x32\x9f\x99\xef\xac\x9c\x93\x5c\x3f\x33\xf6\xc4\x1c\x5b\x79\xcf\x03\xf9\x11\x1d\xe8\xba\xe2\x73\xdd\x7d\xd9\x8a\x16\xb4\xc6\xef\x23\xf8\x49\x34\x08\x50\x9b\xe6\x30\xed\xb4\x8e\xf9\x74\x25\xeb\xe4\x7d\x2c\x5e\x3b\x1e\xac\x05\xa3\xe7\x77\x52\xf6\x92\x69\xe4\xf0\x0b\x8b\x13\xb4\xf0\xa6\x07\x9e\x51\x0d\xe1\x26\xc9\x20\x7b\x30\x91\x01\xf7\x90\x47\xdd\x25\x2b\xa4\xde\x2b\x49\xf6\x2d\x71\x8f\x12\xe5\xac\x8e\x30\x9d\xe7\xe9\xd4\x96\xe2\x7c\x0e\xe0\x5f\xb7\x40\x7a\x9e\x6a\x14\x8a\xa1\x7c\x10\x17\x6a\x87\x95\x3e\xf7\x64\x59\xf5\x53\xe1\x1d\x01\x38\xd0\x55\x85\xe4\x5b\xcc\x62\xea\x19\x43\xdf\x6a\x2b\x4b\xb5\xe9\x4d\xc6\x26\x32\x58\x1e\x22\x18\xfb\xd9\x5e\x80\x84\xe0\xb4\xb1\x76\x31\xb9\xdd\x2c\xb4\x0b\xd1\x9c\x0f\x75\x5b\x5d\xd1\xe4\x57\xf8\x48\x74\xfa\x68\xc5\x8a\xd1\x26\xae\x5d\xd9\x42\xc2\x6f\xd3\xa7\x8b\xab\xa1\xae\x8d\xb9\x44\x4d\x0f\xb9\x53\x62\xce\xd5\x09\x23\x91\xce\xe6\x26\xb9\x66\xf3\xf6\x7a\xb4\x80\x37\x6d\x7e\xca\xb2\x6d\xfa\x07\xd5\x2e\xe4\x14\xd5\x05\xd6\x2b\x9c\xf6\x7f\xe0\x05\x6c\x6b\x3a\x2e\x2e\x38\x11\xed\x58\xfa\xd4\xd3\x53\x58\xaf\xa7\x36\x45\x58\x93\x5d\x91\xe1\x17\x15\xf0\xe1\x14\xc5\x98\xc6\x9c\x83\xcc\x2e\xbd\x43\x43\xf6\x01\xb7\xc7\x94\xc9\x36\xad\x02\x5f\x36\xf4\xf4\x93\x34\xce\x6c\x37\x81\xdd\x61\xd8\x2a\x07\x59\xa6\xe1\x68\x55\x11\xdd\x01\xa6\x53\xf5\x3c\xa1\x0e\x5c\x83\x5e\xe6\x13\x33\x87\xd5\xb5\xf4\x45\x0f\xed\xbd\x82\x04\xcf\xe0\x79\xeb\x09\x1a\xac\x2b\xcf\x20\x9a\x26\xf9\xc2\x4a\x5d\x58\x92\x26\x8f\x34\x67\x29\xde\x04\xf3\x99\xfc\xd8\xd5\xad\x13\x94\xb5\x33\x48\x8d\x77\xeb\xbb\xf1\x6d\x47\xca\x19\x96\x3d\x5e\x8e\x78\xb3\x5b\x01\x34\xc6\x8b\xe5\xbe\xe8\x6c\x87\xf9\x42\x77\x1b\xc4\xc8\x36\x11\x7d\x70\xf6\xd7\xfe\x89\xc9\xb2\x28\xd2\x6b\x95\x26\x2d\x91\x41\x7d\xc8\xce\x29\x33\xa4\x7c\x7f\xa2\xdd\xf8\x46\xce\x2b\x6e\xd2\x0d\x87\x87\x03\x7c\x18\x1a\x5b\x4a\x8c\xf1\x4a\xbf\x16\x5c\x5f\x23\xbc\xb9\x09\xb1\x22\x0a\x11\xff\xe0\xa3\xf0\xc4\x4f\xd0\x94\x13\xf7\xe8\xd5\x11\xe3\xfd\xf0\x97\x66\x6f\xc6\xe4\xda\x23\x37\xa0\x1d\x03\x73\xa3\xf2\x17\xc7\xa6\x04\x78\x0d\xef\x5e\xfd\x5c\x54\x04\xe0\x64\xa1\x8b\xb0\xe4\x0f\x1f\xcd\x76\x9d\x11\x62\xbd\x36\xe4\x52\x89\x04\x59\x3b\x76\x6b\xcd\x68\xf0\x33\x6d\x05\xfd\x2a\x2b\x29\xbd\x62\x35\xfb\x12\xba\xaa\x4f\xe4\x9b\xd9\xe1\x57\x99\xbd\x95\x89\xe9\x31\x38\xc9\xe3\x59\x74\xa0\xd3\x76\x03\x62\xe6\x05\x34\x5b\xe5\xec\x66\xc1\x23\xe6\x8f\xaa\xce\x96\xbd\xf2\x20\x85\xb9\x4f\x78\xe3\xdc\xf1\xf8\xec\x20\x94\xf0\xfb\x35\x1e\xae\x02\xec\xae\xce\xeb\x95\xc2\x55\x06\x5b\xfd\x64\xde\x08\x38\x8f\x6a\xfb\x6a\xc5\x81\x39\x5b\x04\x8d\xe1\x6b\xf6\x8b\x55\x52\x98\x3d\xec\x10\x75\x31\x10\xd8\x92\xcb\x9c\x8e\x57\x74\xa4\xe9\xb2\xf8\x6f\xf5\x08\x55\xab\x46\x62\xc5\xc4\x22\x39\x16\xa6\x0d\x17\x89\x29\x53\xc9\x34\xe7\x8c\x5c\x8a\x74\x4c\x8b\xae\xef\x9c\xbc\x13\x6d\x4e\x2b\x76\x89\xc7\x06\xad\x12\xa2\x9b\x82\x95\x6b\x7d\xc6\x45\x9e\xea\x0c\x1e\x42\x60\xb6\xa1\x5c\xbf\x0e\x4a\x45\x12\x96\xcf\x62\xf5\xd9\xbb\x57\x4d\xdc\xbb\xfd\xdd\xe7\x16\x71\xd3\xcd\x1a\x6a\x61\x74\xb6\xf0\xcb\x00\xc6\xad\x20\x04\x4e\xd1\x39\x09\x20\x26\x38\xcf\xce\x0a\xb6\xa9\xf3\x30\x38\x57\xc8\x1d\x28\x31\x4a\xd1\xd7\xcf\x5f\x68\xb0\xfb\x4d\xed\xcf\xd4\xcf\xc6\x8a\x04\xb4\x16\xbd\xec\x3a\x07\x2b\x82\x43\xed\x04\x9a\x2b\x68\x5a\x16\x83\xb7\xea\x17\x6d\x54\x25\xff\x74\x33\x3b\x37\x04\x80\x64\x67\x75\x05\x15\x52\xc3\xce\x48\xf2\x25\xb4\x28\xc0\x7e\xcf\xbd\xd3\xd3\x41\xd7\xdd\x9f\x16\xb2\x25\xf3\xb1\xe2\x81\x8c\xe1\xf0\xfc\xd8\x46\x1d\xab\x03\x91\xd4\x7d\x30\x8b\xa1\x87\xc9\x9c\xca\x81\x0d\x4f\xf4\x4c\x13\x3f\xcd\x96\xc7\x09\xf9\xba\x1e\xae\x17\x09\xae\xb5\x1b\x7d\xb4\xf4\xb2\x21\xc0\x04\x22\x74\x50\xa7\x45\x23\x87\x59\x02\x8e\xcd\x90\x98\xae\x8b\x8e\xd7\x29\x36\x33\xf7\x09\x52\xc7\x4f\x80\x5c\x68\x34\x73\xa0\x48\x07\x21\xf1\x72\x50\x6e\x52\xb1\x69\x81\xd0\xb1\x64\xdf\x56\x06\x6d\x30\x06\x30\x79\xb4\x5f\x2b\x55\xcb\x0a\x53\xab\x05\x3d\x97\xf1\x47\xbb\x33\x38\xff\xbe\x29\x78\x3f\x40\xc5\xb1\x90\x60\xa4\x30\x6c\x6c\xab\xc6\xf9\xcb\xca\xd9\xdd\x46\x7f\x3a\x30\xd3\x8e\x4d\x57\x38\x88\xb3\x7c\x27\xab\x04\x4f\xa3\xc6\x50\xbb\x5d\x29\x61\xd5\xfe\x7a\x2c\x78\x07\x0f\x71\x5c\x7a\x94\xf8\xc1\xcf\xe5\x1f\x55\x39\x4c\x74\x49\xbf\x1f\x81\x13\x02\x75\x90\x99\x6b\xbd\xd1\x00\x6d\x4e\x82\xbc\x08\xee\xfd\x28\x8f\xb1\x41\x00\xd6\x26\xf1\xc9\xf2\xd6\x7d\x55\xac\x05\xb5\x6a\x4c\x8d\x02\xa5\x65\xa4\xf2\xbd\x1b\xb8\x58\xd6\xca\xe9\xbd\xef\xdd\x95\x70\x20\x25\x85\xe3\xf6\x37\x35\x5b\x00\x16\xd0\x6f\x3f\xbf\x90\xfc\xe1\xc0\x51\x4f\x59\x26\x6e\xe9\xb9\xea\xd9\x90\x91\xf5\x1b\xdc\x34\xb0\x7d\x79\x6e\x63\x6f\x2a\x35\x3d\x60\x62\x19\x1e\xbe\x94\x0f\xf2\x2e\xa5\x62\xce\x35\x1c\x62\xbe\x9e\x51\x81\x34\x5b\xd8\xb3\xf2\x00\x56\x9c\x59\xf6\x8d\x3d\x40\x18\x71\xb4\xa0\x2f\xd5\xe8\x93\xff\xe2\xf2\x08\xc0\x68\x1b\x28\x99\xa3\x1b\xb3\x86\x4b\x83\x5f\xdc\xcc\x7f\x37\xd6\xfe\xd1\xbe\xc0\x03\xc7\x3d\x7e\xe4\x1a\x7c\x81\x91\xd0\xab\x94\x17\xe9\x62\x14\x0b\xbc\x32\x3e\x82\x7f\x75\xd5\x53\xd5\x88\x67\x1c\xde\x24\xae\x7a\x1c\x2a\x21\x6d\xd1\x15\x9f\xa6\x87\x00\x70\xf6\xca\x66\xbb\x92\xcd\xce\x3d\xde\xe5\xd8\x59\x62\xcd\xa2\xa6\x4f\x06\x51\x5a\x92\x50\x23\x9e\x31\x75\xb2\xbb\x5d\x61\x7a\x3d\xaf\xce\x09\x63\xf9\x3c\x54\xa4\x95\xeb\xb0\x25\xa9\x22\xea\xcb\xfc\xf5\x1e\x0c\xe5\x91\x4d\xbe\x53\x76\xc9\xe5\xf6\x82\xce\xf9\x15\x2c\x48\xe9\xd6\x50\x94\xeb\xbe\xe5\x50\x67\xc9\x06\x79\xbb\xd5\xbb\xf8\xf0\x4d\x53\xc0\xb8\x89\x78\x10\x80\x03\x39\xee\xdc\x67\x9b\x9f\x41\xb2\xa3\x11\x55\x35\x09\xb0\x3f\x38\x36\xe8\xf9\xec\xd0\xfd\xe9\x02\x1f\xb2\x96\xa5\x84\xef\x9d\xbf\x05\x83\xb8\x02\x11\xbd\x25\xa5\x9f\xd7\x76\x90\x8d\xd7\xf3\xf2\x46\xb5\x5a\xcf\xaf\x1d\x96\x7b\xcb\x5f\x1f\x20\xc6\x1a\xb0\xc0\xdc\xc2\x21\x5b\xa0\xf8\x64\xb0\xb7\x81\xe7\x12\x16\xbe\xc5\x12\x52\x0f\xdb\x1d\x40\x1d\xa1\x96\xd5\x59\x0b\xcf\xc9\x3d\x65\xd1\x07\xae\xb2\x37\xae\x5d\x06\x47\x51\x9f\xeb\xd9\x1c\xd1\x59\x3f\x45\xd3\xab\x01\x56\xaf\x2e\x82\xb3\xa3\x43\xd6\x7d\x85\xd0\x8f\xbb\x7c\x69\x3c\xe6\x20\x7f\x07\xe8\x0c\xe2\xf9\x54\x29\x42\x24\x96\x2b\x4f\x74\xd7\x5c\xe3\x97\xa4\xed\x0d\x50\xf4\xd8\x86\xed\x94\x3c\x39\xdc\xfe\x62\x80\x74\x02\xc0\xce\x65\xcc\x24\xe2\x97\xf0\xf6\x3c\x9e\xc6\x02\xee\xcf\x8d\xb2\x5d\xc2\xa5\x13\xf0\xdf\x8e\xa4\xa0\xcc\x3e\x0f\xe4\xd9\x28\xd2\xb2\xa9\x14\xc8\xec\x44\x9e\x6a\xe4\xeb\x7f\xf0\xc4\x00\x3b\x86\xc2\xa5\x09\xa1\x72\xe9\x06\x15\x8e\xe0\x07\x88\xde\x24\xf2\x81\x55\x5d\x10\x91\x07\x6c\x8c\x94\xf6\x97\xe6\x66\x50\xd0\xc8\x45\x95\x34\xf0\x69\x30\x9a\xde\xf7\xa5\x46\x6f\x75\x59\x56\x18\x31\xcd\xa6\xe7\xaa\xd3\x6d\xdb\x30\xaf\x69\xa1\x69\xa4\x44\x3e\xa3\xab\x59\x06\x29\x49\xb7\x73\x21\x22\x66\x83\xf2\xeb\x14\xae\x4f\x91\x5b\x66\xdb\xc5\xd1\x01\x58\xb0\x74\xfe\x9c\x22\xf1\xa2\xb4\xa8\xcd\x60\x12\x76\x4d\x22\xd2\x37\x23\x38\xe7\x56\x15\x92\x98\x36\x93\x6a\x96\xf2\xa1\xb0\x52\x1d\x3e\x86\xc0\x2b\x91\xbb\xa2\x45\x4f\x8e\x1d\xcf\x49\xb7\xe7\x8e\x0a\xa1\x27\xba\xa4\xde\xd8\x2b\xe7\x9b\xd0\x80\x6b\xf1\xe7\x47\x55\xda\x7a\xf2\x6b\xbd\x95\x6a\xf1\x91\xdf\x70\xa5\x7c\xc2\xac\x89\x3a\xfb\x79\x6b\x91\x9e\x99\xae\x5a\xb3\x66\x4e\xa9\x09\x23\x65\xc4\x11\xfe\xc6\x48\xfe\x00\x4d\x90\xc1\x8a\xd7\x99\x5f\x71\x3d\x61\xbf\xf4\xac\x07\x48\xb8\xf4\xb4\xa1\x17\x6c\xa1\x40\xc5\xa2\xe7\xe7\x6a\x4c\x74\x30\x01\x59\x1d\x80\x63\x1f\x17\x3f\xd2\x59\xa4\x7f\x82\x29\xfb\x9d\x17\x94\x97\xfe\xda\xbc\xae\xad\x60\xa7\x33\x52\x93\xab\xf6\x6f\xb1\x6b\x56\xf5\x8a\x8c\x8b\xcf\x63\x4e\x0d\x9a\x11\xe3\xf2\x7d\x05\x86\xdb\x31\xc9\x9a\x10\xf1\xe8\x6b\x7d\xd8\x4a\x7d\x30\x13\x7b\xbd\x8c\x35\x1b\x10\xa4\x65\xb0\xbb\x4e\xed\x68\x24\xb4\x51\xee\x56\x6d\x78\xe0\xda\x0c\x63\xdc\x82\xc3\x5b\xec\x05\xbe\xfe\x4b\x8a\x6e\x58\xd5\x5b\xa2\x60\x27\xf5\x39\xc6\xa8\xc6\xde\x8f\x0e\xa1\x9e\x1e\x2c\xae\xa5\xb2\x20\x88\xa9\xd1\x88\x78\x0a\xd3\x77\x51\xce\xcf\x90\x07\x90\xa5\x7b\x0b\xda\x41\xc8\xe1\x2a\xf7\x38\x53\x46\x93\x30\x6f\x1e\x9f\xda\xd4\xfb\xd7\x40\x52\x55\xa9\xc2\xcc\x24\xe4\x98\xd8\xdf\xc4\x60\xa8\x58\x9a\x11\x76\x67\x0c\x13\x32\x89\xa4\x26\xb4\x9f\x78\xb5\xa5\x0f\x7f\x58\x1b\xa3\xbf\xdf\x3e\xad\x43\x97\x8b\x4a\x36\x9d\x93\x3b\xa9\x50\x82\x36\x51\x34\x4f\x08\xfe\x39\xbe\xa6\x92\x73\xe9\x24\x6a\x68\x40\x48\x1a\xd7\x6c\xf0\xf9\xdb\x5c\x9c\xc2\x4c\x17\x17\x6a\xb3\x1e\x93\x73\x4b\xe1\xbe\x79\x3f\x54\x48\x5e\xbb\x54\x5e\x5c\xa9\xb6\xbf\x50\x9a\xde\x78\x81\x5e\xb2\xab\x08\xc3\x63\xb7\xf6\xe4\xc5\x5c\xc9\x7b\x07\x75\x76\x44\x2c\xd4\x2a\xc0\x42\xe2\x67\x03\x39\x6e\x63\xd3\x19\xa5\x45\x47\x2d\x9b\xc5\xeb\x3f\x69\x26\x44\x3e\xba\xe5\x8f\x88\xaa\x17\xc8\xbc\xe3\x77\x6b\x19\x78\xbc\x47\xff\x13\x56\x58\x36\xb6\x8a\xae\xb3\x70\x38\x18\xe3\xca\x18\xea\x2e\x24\x3a\xaa\x6b\x93\x86\x50\xec\x77\x34\x70\x15\x31\x1b\x07\xf3\xc4\x34\xcd\xd2\xd3\xe1\x04\x23\x10\xe6\x6a\x72\xa4\x03\xe8\xee\x66\xcd\xe0\xbe\xb2\x87\xeb\x2f\x99\xf3\x3d\xf0\x64\xc5\xce\x81\x20\x6a\x0a\x3a\x3a\x53\x0b\xb2\xff\x18\xc4\x6f\x0e\xf4\x79\xcc\x49\x79\x84\x59\xff\x25\x6c\xbe\xe8\xc9\xdf\x7e\xee\xca\x53\x41\x33\x6d\x27\x61\x9e\x48\xe5\x10\xe9\xf0\x5a\xef\x6a\x85\xcb\x28\x16\x59\xb8\xab\x4d\x77\xf5\x75\xc9\xcb\xa1\xa2\xc1\x99\xa8\x74\xa3\xfd\x36\x8a\x0e\x9b\x8c\x70\xc1\x31\x26\xc9\x57\x4d\x14\x7b\xfc\x2f\xfc\xdd\xde\x95\x65\x7c\x0a\xd8\xd0\x86\x83\x15\xfe\x0e\x55\x16\x84\x93\x9f\x67\xb1\x6c\x3b\x24\x43\x10\xcc\x0b\x01\x07\x42\x2e\x01\x49\x6d\xd1\x94\x3a\xf4\xf8\x18\xd3\xfe\xde\xed\x97\x83\xc5\x3b\x19\x1e\x0e\xa5\x53\xfa\x55\x70\xaa\x0a\x05\xa4\xac\x05\x95\xeb\xd8\x9e\xc4\x31\x07\x48\x67\x11\x7f\x02\x0d\xd0\xce\x94\x8d\x3a\x95\x68\xc2\xb5\x1c\xbe\x82\xba\xdc\xfa\x48\x1c\x41\x96\x47\x4a\x5d\xb1\xc6\xe1\x4b\xfa\xb8\xc9\xd8\x33\x78\x96\xd0\x13\x81\x5d\x23\xc4\xa0\x1b\xa0\xb4\xc5\x9d\xab\xd8\x16\xa3\x7e\xd9\xa7\x40\x86\x65\x2f\xd2\xf9\x68\x87\x11\xf5\xa4\x67\xf2\x91\x25\x19\x5e\xc3\x38\x82\x1d\x6b\x84\xcf\x28\x28\xb1\x16\xf2\xd8\xbf\xa3\xb9\x86\x65\xea\x32\x8f\x5e\xbe\x3d\x95\xd8\x89\x84\x39\xfa\x8d\x7d\x89\x6f\x2b\x72\x6f\x6b\xb1\x82\xa1\xe9\x31\x7e\x8e\xb5\x8e\x4a\xa6\xc5\xe5\x71\x03\xcf\xe1\xe3\xaf\xbe\xb9\x7d\x14\xb6\x0a\x4f\x4f\x12\x28\xfb\x12\x70\x17\xcb\x16\xa3\x26\x6e\xea\x21\xda\x96\xed\x52\x96\x0b\xaa\x02\x58\xc9\x27\x94\xc9\xcc\x67\xec\x83\x84\xd5\x49\x55\xe4\xa3\x85\x2b\x42\xe2\xd1\xbd\xec\x14\xc6\x03\xbd\xc8\x56\xdb\x8b\xc6\x6a\xf2\x37\x62\xc8\x22\xd5\x0e\xfd\x4f\x26\x61\x1f\x27\xe6\x84\xbe\x1c\xd9\xdb\xc8\xb1\xbe\x85\x6c\x9d\x92\x84\x93\xa4\x09\xca\xe0\x92\x9f\x94\xe0\x50\x5e\x0b\x9f\x03\xae\x32\xeb\xb9\x9f\x1e\xf0\x3e\xb6\x39\x6d\xe7\xfa\x17\x7b\xe0\x80\x75\xb6\x4f\xbc\xf0\x91\xc7\x2d\x4d\x51\xba\x3d\xf1\x9a\x10\x47\x3e\x36\x7c\x2a\xfe\x21\xd5\x06\x1c\xd9\x3e\x1c\x2c\xe4\x69\x6f\x6f\x15\x3e\x2d\xe9\x77\x46\x3f\xd7\xaf\x33\x75\xb1\x24\xbc\x5f\x74\xb6\x66\x23\xaf\x4e\x90\x20\xc2\x7b\x62\x43\x74\x6a\x6a\x21\x65\x53\x15\xa1\x2c\xf9\x43\x0a\xd8\x59\x12\x1f\xbd\xd4\x77\xa3\xaa\x8b\xc6\xf9\xf2\xab\x7d\x7a\xb2\x9a\x9d\x9a\x2e\xcc\xcd\x48\x3b\x61\xaf\xa8\x86\x90\x6f\x7e\x12\xa4\x6e\xe6\xcd\xe7\xd2\x2a\xaf\x3f\x7a\x9c\x67\x80\x2e\x9d\xf2\xb6\xfa\x1e\xc2\x12\xee\x0a\xac\x29\xed\x4b\x64\x16\xca\x89\xdc\x1f\xe7\xa3\x81\x2b\x12\x25\x65\xa1\x17\xfd\x32\xcc\x1c\x14\x64\xd2\xce\x49\xcf\xf2\xb1\x91\x52\xfb\xd7\xdd\xf2\x3e\xcd\xed\x4b\x7d\x01\x36\x96\xcb\x07\x27\xb2\xa5\xea\xef\x0e\xa1\xd1\xf1\xd9\x3a\xbb\x56\xc2\xb2\x68\x3b\x57\xe5\xa3\xe5\x36\xec\x0f\x39\x84\xc1\x65\xbb\xe1\x7c\x22\x4e\xc9\xb2\x5f\xe7\x63\x15\x94\xdb\x17\x12\xca\x29\xca\x98\x41\xea\xcd\xd2\xce\x85\x0e\x21\x73\x99\xcc\xe2\xf4\xb3\x70\x7b\x1e\xed\x15\x6e\x7f\xc5\x62\xc2\xe7\x8e\x37\xf4\x12\xa4\x84\x43\x35\xad\xde\x62\x30\x9a\x92\x9e\x2a\xd8\x71\x5b\xb4\xf8\x11\x84\x14\x8e\x05\xe5\xa9\x6b\x76\xb3\x06\xa8\xc5\xa2\xbf\xcb\x6b\x4a\xcd\x65\x3d\x13\xaf\x6a\x39\xaf\x30\x7e\xb1\x40\xaa\xf8\x58\x5c\xa3\xdd\x32\x46\xf1\xb3\x0c\x2f\xe5\xdd\xb5\xbd\xc1\x34\x20\x9b\xbe\x15\x2c\x71\x36\x33\x69\x2e\xdd\xed\xd9\xa6\xb4\x0f\x06\xa2\x46\x51\xc3\xb7\xd3\x6d\x3f\x53\x28\xb5\xc8\x97\x58\xac\xca\xb9\x1c\x34\x58\x81\x36\xf3\x90\xc2\x0d\x69\x09\x61\x0a\xf8\x47\xf8\x1d\x3c\xa0\x4c\x28\x29\x1f\x4e\xf1\x7a\x10\xf8\xc3\x8e\x13\xca\xb3\x61\x9d\x34\x74\xca\x5a\x7a\x44\x72\xa0\xd9\x6c\x1e\x2f\xb2\x55\x9c\x42\x20\x3d\x27\xf2\xa3\x4b\x00\xd7\x2f\x1b\x26\xe1\x5f\xa9\xe8\x7c\xe5\x9b\xce\x58\xfe\x90\xfc\x16\x69\x12\x90\x43\x6a\x2a\xc1\x03\xd5\xea\xcf\x86\x1f\x50\xa7\x17\x4b\xde\x0e\xa8\x8f\x41\xda\x33\x07\xa0\x32\x31\x05\xd9\xb8\xf8\x70\x4f\xf0\xf7\x08\x04\xd5\x0f\xa8\x4e\x0e\x59\x87\xf2\x1b\x64\x20\x3a\x7b\x95\x34\x45\x76\x14\x3d\x92\x1d\x3a\x9b\x3f\x29\xd5\x01\xce\x9c\xf5\x81\xf4\x4b\xd8\x6c\x51\x8c\x01\x9a\x90\xaa\xfd\xdb\xf7\xe5\x6e\xcc\x08\x78\xbc\x67\xfc\xfb\x5a\x18\xe6\x1b\x7b\x9b\x70\x14\x77\x76\xfd\x35\x91\xed\xda\x24\xe6\x6b\x47\x9e\x84\x4a\x50\x61\x8b\xfa\xb9\x7a\x88\xa0\x3a\x94\x53\x75\x8f\x64\x71\xb6\xe4\x32\xc0\x9e\x8e\x91\x4b\x57\xe7\x85\xd6\xfd\xb6\xce\xcd\x9c\x03\xd5\xd7\x7b\x91\xc3\x14\xab\x38\xf5\x98\x18\xab\xcd\x7c\x20\x4d\x3f\xe8\x3e\x32\xa4\x9c\x46\x1f\x0a\x50\x2a\x46\x7a\x04\xc0\xee\x32\xcb\xa6\x18\x4c\x2e\x86\xc7\x58\xca\x2f\x34\xae\xab\x5b\xe5\xaf\x64\x15\x90\x1f\xb8\x8c\xd4\xa5\x16\xbf\xcf\xdb\x0e\x7f\xdb\xd7\x14\xd8\xda\x41\x49\xc6\x50\x02\x62\x80\x78\x22\x9e\xce\x85\x99\xba\x2c\x80\xc7\xcd\x17\x95\xdb\x50\x02\xd2\x9b\x4e\x72\x5f\x0c\xf1\x50\x09\x4f\x5f\xcf\x77\x8b\xcc\x7c\x00\xf6\x4c\xee\x24\x0e\x1e\x8f\x31\xd6\xce\x74\x3d\x59\x3c\xb8\xe1\x80\x81\x70\x78\x91\xb0\xe9\x24\x7b\xb4\xf1\xaa\xae\x2e\xef\x05\xea\xd2\x58\xe6\xce\x27\xfd\x9a\x67\x24\x20\x2f\xdb\xf2\x8c\x5a\xd4\x2b\x30\x79\x7a\x85\xd0\x4b\x0f\x85\xe8\xbe\x56\x1a\x08\xa0\x8c\x6e\xce\x1a\x01\x8d\xa8\xc8\xa3\x79\x91\xa5\xd9\x13\x7f\xf0\x86\xe1\x3f\xa4\x79\x09\x6d\x55\x8d\x78\x70\xe4\xa3\x4b\x03\xfc\x5c\xc8\xa8\x59\x51\x9b\xcd\x0a\xf1\x03\x9b\x08\x74\xb5\x10\xfc\xac\x5f\xcd\x47\x34\x89\x85\x28\xc8\xf3\x0d\xde\x57\x40\x2b\x63\xe1\x36\xe4\xf4\x86\x92\xf1\xad\xa1\x35\xbb\x53\xc6\x0a\x96\x42\x41\xdb\x70\xea\x03\x6f\x40\x69\x30\x28\xd5\x94\xec\x6f\x54\xee\x82\x12\x4c\x68\x87\xf0\x95\xf3\xb3\x25\xcf\xb4\xb3\xc5\x2d\xca\xcb\x48\x83\x20\xf9\x5b\x92\xb3\x5c\x70\x10\xa6\x2e\x94\x61\xd8\xca\xc7\x18\x47\x12\xa1\x81\x5c\x9c\x86\xb1\x2b\x55\x01\x49\xd3\x2e\x5f\x1c\xe8\xe8\x91\x47\x89\x69\x52\xe8\xb2\x96\x2b\x4d\xe0\x89\x26\xea\xe4\xa0\x9d\xa3\xa0\x97\xd4\x69\x59\x2b\x87\x30\xe4\xdc\xc9\x5c\xea\x4e\x46\x9d\x43\x84\x07\xed\x24\x0f\xe5\xc2\x21\xe1\xbd\xc3\xb6\x73\x71\xe3\x83\x4d\x48\x68\x61\x3d\x5f\x43\xc0\x52\xb9\x90\xf2\x95\x0f\x64\x7d\x40\xb4\x5c\x79\x14\x32\x8f\x02\x1a\xe9\xd5\x30\xe7\x38\xe8\x62\x60\x97\x04\xbd\xfb\x79\xa7\x44\x81\x33\x7a\x4a\x2c\xbf\x2c\x4b\x3a\x11\x1f\x89\x28\x1e\xdf\xba\xd0\x42\x41\xdd\x28\x38\x53\xcc\x68\xa9\xcd\xa6\x1d\x47\x1e\xf8\x42\x13\xc9\x6b\x42\x54\x59\x9b\xf2\x8a\x2c\x3b\x74\x74\x7a\xfa\xfa\x00\x11\x39\xda\x72\x3e\x89\x11\x85\x24\x1b\xa1\xe5\xc4\x80\x4a\x7a\xbf\x83\xa8\x17\x4c\x4a\x3d\x7b\x9c\x6a\x0e\x96\x96\x0c\x72\x4f\x4b\x18\x85\x26\x3b\x1d\x43\x83\xcf\x66\x88\x19\x8f\xe2\xa2\x1f\xb3\x49\x93\x09\xc0\x97\xdb\x7d\x76\x00\x33\xf8\x6f\x2b\xca\x6c\xf1\x4a\x18\x04\x33\x4e\x3d\xa8\x04\xb1\xa5\x97\x83\x11\x99\xc9\x21\x0e\xc5\xe0\x05\xde\x4a\x46\xdd\x7c\x8c\xdf\x26\x9a\xbf\x32\xe2\x75\xf7\xf3\x8a\xa9\xa5\x1c\x30\x72\x8a\x37\x60\x8e\x83\xe2\x63\x51\xeb\xba\x70\x8d\x46\x27\x68\xa5\xc1\x15\x27\xed\x48\x2c\x4b\x78\x3f\x24\xb4\x97\x97\xa4\xf3\x29\x8e\x52\x6e\x61\x6a\xa6\xe1\x8a\xc5\x84\xdf\x21\x70\x0c\x4d\xbb\xc7\x2c\xa1\x14\x27\xf7\x97\xe3\xe2\xd3\x77\x47\x51\xc1\xea\x73\x8f\xd6\x15\x6b\xef\x9c\x17\x45\x97\xa2\x22\x8f\x21\xaf\x25\x61\xed\x67\xe3\xd0\x47\x2f\xe5\x6b\x19\x2d\xd9\x1d\x07\x1f\x6d\x1b\x68\xc6\x3f\xab\x83\xb2\x6b\xe1\x91\x3b\xf4\x8f\x87\xa5\x4d\xc2\xd2\xdb\x2b\x46\xe9\xea\xfa\x3c\x0d\x6c\xc0\x56\xf8\x3e\xe2\xaf\x13\xc1\x32\x0c\x1b\x0a\x9b\x0f\xc4\x37\x45\xd1\x0e\x53\x31\xc0\x1f\xb3\x13\xa2\xa4\xa2\xf9\xe3\x47\x04\xd7\x9a\xc1\xe0\x97\x01\xd8\xed\x69\x0c\x85\xfd\xf5\x37\x94\x7f\xde\xc8\xff\xfb\x49\x7f\x12\x5b\xdb\x57\x75\xd9\x8c\xc1\xbf\x40\x06\xfe\x2e\xfa\x8b\xf4\x39\xa9\x39\x5d\xa9\x4d\xc1\x61\xb4\xdc\x64\xb7\xfa\xcf\xfd\x14\x05\x5f\xb4\xfb\x81\xeb\x8b\x1f\x09\x7d\xa2\x20\x28\x88\xe0\x3a\xce\xfc\x49\x89\xf0\x18\x6b\x3f\xc2\x50\x34\x1f\x69\xb4\xb4\x6c\x74\xed\xee\xfa\x24\x22\xac\xc4\xfa\xe0\x11\x81\xe0\x88\x7d\x8a\x0b\x6e\x88\x60\x39\x1c\x2f\xd0\x1c\x6a\x05\x9a\x36\x1c\x13\xd3\x1c\xe4\x3a\xe7\xc1\x71\x5c\x13\x6a\xb3\x47\x18\xf8\x87\x7d\xc2\x62\xa5\x39\xdf\x7d\x54\x41\x50\x25\x0a\x5e\x9f\x51\x7b\xfe\x6c\x80\x56\xb0\x88\xab\xeb\xac\xc6\x0c\x78\x7e\x2b\x35\x02\xd6\x90\x6e\xea\xc3\x5c\xf6\x53\x58\x68\x79\x59\x1f\x0d\xcc\x69\x64\xf4\x0e\x61\xeb\xe7\xab\xf4\xa7\x74\x07\x30\x9e\x7b\x7a\x22\x42\x14\x55\x31\xfa\x9a\x61\xd1\x56\xa8\x0b\x1b\xaf\x60\x2c\x1e\x87\xa0\xbb\x01\x22\xda\x11\xa3\xbb\xfb\xb5\x39\x04\xa3\x70\x60\xbe\xdb\x2b\xc9\x81\x51\xfc\x39\x45\x4b\x3e\xf2\xa8\x73\xd6\x6e\xa4\xd7\x6c\x58\x21\xd2\xa0\x10\x17\x16\xa1\x0f\x73\x14\x05\xce\xed\xdc\xf0\x52\x9f\x13\xa0\xb3\x74\x67\xcf\x0e\xfa\xfd\xad\x72\x0f\x0c\xa5\x4c\x97\x44\x4d\x54\xc0\x37\x3e\xfa\x10\xf5\x3b\x95\x41\x0d\xa0\x00\x42\xb8\xc3\x66\x95\xdc\xf2\xb0\xd1\x1c\x41\xe0\xee\x6a\xed\xd6\x6f\x28\x7b\x2c\xda\x45\x73\xa3\x43\xea\xfd\x96\x4d\xf3\xac\xbe\x08\x79\x8f\x25\x2b\x6f\xef\x5a\x66\x10\xb0\x6e\x51\xa5\xbd\xba\x31\x46\xa1\xe7\x2b\xc0\x49\x97\x91\x67\xed\xa5\xef\x9a\xbf\x44\x32\x5a\x11\x9c\x7a\xca\x4c\xa9\x7c\x35\xbf\xc7\xf4\x87\xeb\xf7\xb3\xaf\x6f\x03\x11\xc7\x4b\xfa\x77\x4b\xf2\x65\xab\xc4\xbe\xea\xbc\xce\xd0\xc6\x36\x34\xe8\x1f\x27\x4f\x4a\x55\x48\x57\xe9\x1c\xf8\x3a\xf0\x53\xb4\x2f\x17\x8a\x2e\xd2\x03\xfb\xb1\x68\x3b\x3c\xe2\x15\x43\xf1\xe1\x6a\x5c\x4f\x88\x38\xb9\x19\x38\xfc\xc0\x5e\xda\x33\x1b\xe1\x43\xd5\xb9\x22\xf4\x99\x41\xa0\xfb\x6d\xe8\xdc\xd7\x32\x29\xae\xc3\xe8\xfc\x74\x8c\xce\x77\x0c\xaa\xac\x72\x51\xde\x70\xbd\x94\x12\x92\xd0\x78\x6f\xcf\xa8\xf4\x91\x67\xe9\x5c\x1b\x36\x2a\x9a\x57\xb4\x8a\x1e\xe1\x77\x52\x9b\xec\x7a\xd3\x5f\xf5\x1a\x3b\x39\xc1\x29\x72\x22\xe7\x15\x9e\xc4\x5d\x9c\x56\xa9\x01\x91\x0e\x1a\xf9\x91\x3d\xbb\xba\xa6\x60\xdc\xf9\x67\x14\x9b\xf4\x76\x35\x3f\x3b\x52\xe9\x0c\x9b\x4e\x12\xd9\x65\x0c\x6b\x00\x94\xf9\xfd\x18\x6c\x6f\x00\x8c\xa2\x64\x59\xf8\x31\xce\x93\x20\x17\x7d\x64\xc3\xf3\x8b\x00\x16\x78\xe5\x1e\x64\xc8\xe8\x2d\x9e\xb4\x38\xd6\x3c\xca\x12\xea\xf0\xa7\x8f\xf4\x95\xe8\xb4\x10\xdb\xa8\x56\x1b\xf9\xae\x3a\x1f\x1b\x32\xb5\xef\x94\xc4\xf4\x61\x2f\x82\x03\xfb\x74\x9e\xe4\x23\x61\x02\x5d\x37\x5d\xb8\x14\xff\x35\xfc\xa5\xfc\x08\x1f\xe4\x8d\x70\xa4\x3b\x64\x68\xfd\x22\x37\x33\xc0\xb6\x68\xcc\xb7\xd8\x34\xe0\xc9\xde\xce\x4f\xca\xdc\x5d\x37\x05\x49\x7d\x7d\x44\x9d\x0e\x2e\x08\xf0\x60\x52\xc7\x42\x4a\xa5\x3a\x3d\xb7\x13\x6f\x12\x41\x82\xa6\x0b\xbb\xfb\x2c\x3c\x23\x4e\x6a\x05\x6a\xaa\xd9\x97\x84\xae\xac\xd2\x5c\xc4\x7b\x80\x15\x6c\x62\x18\xc6\xe6\xe0\xe1\x00\x4e\x63\x39\x2c\x1a\x95\x01\x93\x28\x33\x8b\x2c\x71\x33\x10\x89\xbe\xb5\x5b\x8e\x05\xdb\x96\x69\x55\x79\x26\x14\xcb\x72\x30\x65\xd5\x64\xe5\xf5\xdb\x9e\xc5\xac\xfe\xc7\x29\x96\xa0\xb4\xca\xa9\x29\x82\x3e\xca\xbd\x55\x37\x49\xef\xd8\x8a\x2b\xb8\x2e\xe8\xd4\xca\xa1\xf2\x2f\x27\xb8\x34\xaa\xde\xa0\x8c\x39\xac\x14\x03\x48\x92\x21\x27\xc1\x9d\xa6\xf0\x31\x28\x20\x74\x00\xb3\x9c\x45\x05\xce\xf6\x49\x9f\x8a\xfb\x13\x1c\x55\x55\xf8\x63\x90\x89\x0e\xea\xec\x7c\xa7\xf1\x37\x63\x4d\x29\x21\x8c\x8c\x7a\x16\x0a\xfa\x51\xc4\x8a\x67\x7c\xb2\x0f\x5a\x78\xe0\xe9\xa7\xc3\x9d\xbd\xb5\x10\x02\xf9\x45\x87\x64\x66\x89\x34\x0b\x72\x77\xf4\x36\x91\xf2\x40\x3e\x8e\x80\x0b\x33\xc1\xcd\x40\x12\x4c\x91\x6d\x6d\xb2\x6d\x47\x81\xd1\x0c\x82\x2d\x43\x61\x08\x09\x5f\xec\x84\x2b\xd0\x0d\xc0\x55\x10\xee\x75\x46\xc0\x85\xd2\x3b\x88\xc6\xe4\x3a\xc6\x52\x18\x97\x08\xdb\x26\xf2\x55\xdf\x2d\x42\x0c\xf4\x17\x3a\x11\x7e\x27\x20\xe3\x25\xa4\xf0\x23\x19\xe6\xdb\x15\x42\xa6\xa0\x87\xcc\x17\x7c\xf3\xa9\x73\x2b\xa1\x92\xf2\x68\xdc\x97\x8d\xd0\x07\xf8\xa5\x7c\x8c\x0b\x13\x2b\x72\x4d\x50\x78\xbb\xb6\xf7\x22\xcf\x0b\x93\x63\x52\xd3\xc1\xd3\x07\x6b\x10\xd0\x3d\x95\xdf\x58\x16\x9f\x7b\x2f\x68\x63\xbb\x1d\xc6\xda\xdb\x00\x97\x34\x7a\x78\x7c\xd9\xe0\xf5\xf1\x4c\x31\xa6\xc1\xf4\x43\xab\x5a\xbd\x27\x9c\xe5\x74\xe1\xae\xd0\x58\x80\x1e\x2f\x67\xb1\x9c\x8b\x6a\x51\x06\x48\x53\x19\x15\xad\xe3\xad\x96\x02\x9e\x61\xb2\x97\x61\x7d\x25\x61\xa7\xab\x96\x44\x8f\x65\x22\x92\x51\xd0\xa6\x15\xf6\x5b\xcd\x29\x39\x18\x99\x72\x7c\x62\x3f\x51\xe3\x34\x44\x23\x16\x45\x24\x0b\x91\xce\x5b\x07\xeb\x39\xbd\x7f\x47\xad\xd0\xdd\xa8\xab\xaf\xcd\xe0\x1f\x8b\xc6\x86\x49\xb6\x61\xcf\x25\x88\x9c\xae\x22\x41\xf0\xc3\xce\x6d\x17\x17\xda\xad\xda\xa0\xe3\xff\xd8\x7b\xf3\xe7\xb6\x71\xa5\x51\xf4\xf7\xfb\x57\xe8\x9d\x29\x55\x4d\x6e\x24\x86\x3b\x29\xb9\xbe\xa9\xcf\x4b\x9c\xd5\x59\x1c\x67\xb1\xbf\x3a\xf7\x15\x25\x51\x36\x63\x8a\x54\x48\xca\x6b\xe5\xfd\xed\xaf\x08\x80\x24\x76\x82\x92\x12\xcf\x9c\xeb\x93\x33\x89\x4d\x74\x37\xba\x1b\x8d\x46\x63\x6b\x7c\x9e\xfb\xd3\xb9\x1f\x7f\x7d\x7a\xf3\xfd\xd9\xf5\xdb\x8f\xcf\x3f\x7d\xdb\x7d\x95\xb9\x47\x6f\xf2\xcf\x7b\x6f\xdf\x5c\xff\x88\xaf\xdf\xcc\xae\xdf\x9c\x84\x87\x1f\x6e\xf6\x26\x7b\xaf\x56\x2f\x5e\x1d\xe6\x8b\x37\xd1\xab\xe8\xf5\xc7\x57\xb7\x6f\xf6\xbf\x1d\x1e\x25\x7b\x27\xc9\xcd\xf4\xab\xf5\xe3\xd3\xf9\xe7\xd9\xe7\xaf\x4b\xf7\xd5\x73\xfd\x6d\x62\x7e\x3e\xfc\xf1\xe5\xea\xf3\xe5\xcb\x20\x3e\x75\x2f\x8f\x9e\xc6\x6f\xce\x56\x5f\xde\x3d\xfd\xbc\xbf\xba\xdd\x9b\xdd\x9e\x04\xde\xdb\x97\xd3\xaf\x97\xe1\xde\x97\xaf\xfa\xd9\xd7\xcb\xfc\xc7\x5e\xfe\x66\xef\x6b\xfc\x62\xfa\x2e\xba\xf4\x0e\xf7\xbd\xb7\xd3\x37\x3f\xbc\x37\xc1\x97\xc3\x0f\x3f\xbe\x7f\x58\xbe\x7e\x16\x64\x0b\x63\xdf\x32\x3e\xbf\x31\x7f\x5c\x24\x3f\xae\xde\x5d\x79\x27\xcf\x5f\x59\x9f\x8e\xb3\x2f\xaf\xb3\xe0\xfb\xc8\x78\xef\xea\xcb\xe2\x74\x1a\x5e\x5c\xfc\x70\xef\xce\x46\x5f\xa7\xcf\x96\xc7\x33\xeb\xe3\xe4\xd9\xf1\xcb\x67\x9f\xe3\x67\xd1\x97\xab\xc8\xbb\xba\xf8\x3c\x3f\x98\x3c\x7d\x7d\xe6\xbe\x73\x9e\xf9\xfb\x07\x7b\x07\x47\xb7\x60\x7c\xdc\xdd\xfb\xb0\xbb\x97\xee\xee\xa6\xbb\x1f\x3f\x96\x83\xe6\xab\xdd\x37\xbb\xbb\xce\xee\xab\x7c\x77\x77\x77\xff\x64\x77\x91\xef\xee\x5e\xef\xee\x85\xef\x7e\xbc\xbb\xcc\x8b\xf7\xd7\x97\xbb\x9f\x2f\xae\xfc\xaf\xef\xde\x1c\xbc\x78\x73\xf0\xf2\x45\xfe\x3e\x7b\xf3\x62\xef\xbd\xf3\x23\xdc\x2b\x4e\x67\x9f\xae\x3f\xcf\x8e\x5f\x5d\xbc\xd1\xcf\x0f\x8f\xb3\xbd\xd3\x28\x7e\xf1\x6d\x9e\x9a\x93\xf8\xce\x3d\x38\x74\xc3\xeb\x57\xe6\x07\xfb\xe0\x83\x3d\xbb\x8b\x8a\x77\xe6\xdb\x57\xcb\xd7\xc6\x95\x73\x75\x97\x7c\xb8\x7b\x9f\xec\x1d\x1f\x1c\xbc\xd7\xdf\x7e\xbc\x8e\x9f\xef\xbe\xb7\x6e\xdc\xec\xc5\x8b\xf7\x3f\x6e\xbc\xec\xc5\xf3\xd9\xc9\xfb\x57\x1f\xdf\x59\xbb\x3f\x5e\xe6\xa7\xaf\x5f\xda\x9f\x5e\x3e\xf7\x3f\x3d\xf7\xbf\x1f\x5e\x16\xaf\x2e\x6e\xf6\x8e\x2f\xf3\x57\xc7\x37\x2f\xbf\x9d\xa4\xc7\x2f\xf3\xe0\xc4\xf9\xb0\x38\x4a\x83\x8f\xcf\xf6\x9f\x3b\xdf\x3f\x5d\xfb\x6f\x4e\xa2\xf7\x97\x77\xd7\x97\x4f\x4f\x8d\x55\x78\x98\x38\x2f\x3f\xbd\xb3\xbf\xcc\x9f\xbf\x7b\x39\xb9\xfe\xe1\x9f\xea\xc1\xc8\x7b\xb6\x77\xb6\xff\xed\xed\xb3\x83\x77\x8b\x5b\x7d\xfa\xf1\xe8\xe5\xe1\x6a\x99\x5e\xbf\xfa\xba\x17\xde\xd9\x67\xcb\xd7\x7b\x2f\xe2\xf8\x38\x36\xde\xec\xaf\xd2\x93\x8f\xb3\xe9\xf2\xf0\x2e\x32\x2e\x67\x4e\x6c\x9f\x9f\x7f\x7c\x7d\xe4\x7c\x4f\xde\xdc\x7e\x3d\x9d\xcf\x5f\x7f\x79\x1d\x7f\xfe\x16\x7c\xce\x72\xe3\xe5\xcb\x17\xc9\xf7\xc8\x75\x3e\x26\x5f\x83\xc5\xa7\x4b\xc3\x48\x5e\x1c\x7d\x3b\xfb\x74\x73\xf2\x34\x4b\x8a\xe3\x3d\xfb\xe9\x67\xf7\xe0\xcb\xf7\xe3\xa7\xc6\xa7\x9b\x1b\xe7\xcb\x5e\xf6\xe3\xec\x68\x62\xf9\xf6\xf5\xd7\x77\xfa\xa7\xa7\x67\x1f\xdd\x85\xfe\xe3\xea\xcd\xf5\x4c\x3f\x3a\x89\x3d\xf3\xe4\xdb\x8b\x37\xab\xe3\x83\x9b\xcc\x3a\x7d\xb9\x9a\x07\x1f\x2c\xeb\x2e\x5c\x19\xb7\xc5\xe9\xe9\xe5\xcd\xe8\xf3\x87\x33\xe3\xca\x29\xce\xdf\x7e\xdb\x7b\x71\x64\x1a\x96\xf3\xfe\xd8\x7b\xfb\xe3\xfb\xdb\x6c\xea\xcd\x5f\x65\x4f\xcf\xd2\xcb\x33\x6f\xb4\xf8\x34\xb2\x8c\x1f\x66\x70\xeb\xdd\x59\x9e\x37\xb7\x8a\xb3\xb3\x4b\xef\xcb\xd9\xf5\xf2\xe5\xdd\x3c\xfd\xf6\xf9\xb9\xbb\xf8\x32\x3b\x3e\xbf\x7d\x9f\x9d\x7e\x5f\x84\x47\xaf\x8c\x2f\x57\x17\xe1\xcd\xcb\x0f\x37\x1f\xde\x9f\xdd\x9c\x9c\xb9\xa9\xfb\x3d\xb9\x3d\x9c\xbf\xdf\x3b\xbd\xd9\xff\x72\x75\xfa\xfd\x65\xf4\xf9\xdd\x07\x7f\xef\xed\xc5\xd9\x85\x33\x05\xef\x2b\x4c\xce\xde\x7d\x9b\xec\xdd\x7c\x39\x7c\x15\x3c\xb3\xbc\x43\xcb\x3a\x39\x7b\xef\x79\xc6\xb7\x1b\xc3\xb3\x6e\xf6\x2f\x57\x81\x1f\xde\x9c\xde\x4e\x57\xd3\xf0\xee\xf9\xa7\x69\xe0\x9d\x9a\xf3\x9b\xf0\x62\xfe\x62\x65\x1d\xe6\xab\xf3\x8f\xfb\x2f\x2f\x0f\xae\xaf\xbf\x7f\x88\xf7\x8f\xf7\x47\xfb\xd1\xb1\xfd\xf1\xcd\xeb\x6f\xfa\xb7\xfc\xa5\xfe\x6d\x71\xb9\xf7\xf4\xd9\x74\xff\x8b\x7d\xe9\xe5\xef\xfc\x67\x37\x8b\x99\xef\xf8\x77\xa3\x91\x7d\xb1\x6f\x85\xb3\x17\xe6\x6e\xf8\xcc\x7b\xf7\x79\x61\xb9\x1f\x6f\x3e\xde\xde\xde\x4e\x5f\xbc\x4c\x8c\xbb\xdb\xdb\x37\xe1\xee\xc7\xf3\xb7\x47\xcb\x57\x17\x67\x77\x2f\x4e\xdf\x4f\xdd\xf9\x0f\xc7\x7b\xbf\x7b\xf1\xe9\x26\x3a\xfa\x5c\x9c\xde\x7e\x7f\xf3\x35\xb7\xdf\x7c\xc9\x5e\xbc\x32\x02\xe3\xfb\xdb\xf7\x45\x70\x77\x7e\x6a\xe4\xa7\xdf\xdf\x4d\xcc\xa3\xd4\x2c\xe2\x0f\x47\x07\x97\x69\xfa\xfa\xf3\xf9\x99\xf3\xe5\xf8\xe3\xa7\xe3\x6f\x5f\x8c\xb7\xfb\x27\xdf\x66\x9f\x6e\x17\x77\x56\x7e\x76\x3c\x32\x8c\x77\xef\x76\x5f\xdd\xbe\x08\x82\x17\xa7\xcf\xde\x1e\xdf\x9e\xc7\x27\xa7\xef\xf5\x4b\xfb\xe5\xc5\xdd\xc5\xd1\x6b\xc3\xd0\x75\xff\xe8\x38\xfc\x1e\xbf\x79\xf9\x4c\x9f\xda\x77\xe7\x07\xc9\xfb\xdd\xcb\xa5\xb7\x6f\x27\xc1\xca\x5e\x2c\x57\xce\xf9\x49\x61\x27\x4f\x57\x4e\xfc\x63\xee\x2c\x0e\x56\xce\xf7\x49\xe1\x24\x8b\xd0\xb9\xd0\x5f\xee\x5b\xcf\xa3\xe7\x87\xde\xa1\xf3\xfd\x62\x66\xc7\x67\x33\x7b\xf1\x65\x6e\xc7\xd1\xcb\xd0\x3e\xf8\x12\x3a\x86\xfb\xe2\xe9\xe9\xd7\x49\xf8\x3a\xb7\xc2\xd3\xab\x93\xf9\xd1\xd3\x0f\xdf\x8e\xa6\x87\xc7\x7b\xf1\x45\xbc\x77\x71\x33\x89\x5e\xee\x1d\x7f\xb9\x7d\x75\x7d\x73\xbe\xbc\x5c\xde\x5c\x24\xef\x7d\xfb\xf6\xf6\xe3\xc9\xb7\xa3\xdb\xf8\xdb\xd1\xeb\xef\xd6\x51\x16\x7f\x3b\x3a\xfd\xf2\xed\xe8\xf2\xc3\xb3\xa3\x93\xef\xb7\xc5\xab\xa3\xb3\x4f\xc5\xcb\x0f\x57\x89\x13\x79\xbe\xf3\xda\xf9\x94\x7d\x78\xff\xe5\xed\x9b\x78\xff\x62\x77\xf9\x63\xf9\x2a\xb7\x3e\x4d\x8e\xac\x8b\x2f\x96\x77\xf2\xed\xc8\x3a\x99\xef\x5b\x1f\x3f\x46\x56\x34\x1b\x79\xc7\xa7\x91\x75\xfc\x39\xb2\x4e\xa6\x3f\xac\xf3\xa9\xe7\x7d\xfc\xf4\xc3\xfa\x14\xfc\xb0\x8e\xbf\xfe\xb0\x4e\xc2\x85\xf5\xf1\x78\x61\x45\x1f\x56\xde\xb7\xb3\x85\x75\xfc\x65\x61\x9d\xcc\x2e\xbe\x64\x17\x7a\x66\x9f\xdf\x3d\x73\x2e\x7f\x8c\x3e\xff\xf8\x71\xf0\xe6\xcb\x1b\xfb\xcd\x97\x60\xf9\xc6\x08\xb2\xe3\x93\x95\xf1\x29\xfb\x76\x96\x7d\x7f\x76\xf6\xe3\xa5\xfe\x34\x3d\xb9\xfa\xf2\xe3\xf3\xfe\xbb\xb9\x6f\x1b\xfb\x57\x47\x45\x32\x3f\xda\x7f\x39\x3f\xfa\x94\x5c\x1d\x4d\x93\x20\x7e\x73\x37\xfa\x51\x1c\xee\x8d\x3e\xfd\x78\x77\x61\x7c\x5e\xdd\x2d\xf5\x4f\xaf\xe6\x5f\x7e\x7c\x72\x8c\x1f\xfa\xec\xa5\x71\x94\x1f\x7c\x38\x3a\xff\xfe\xe1\x68\x79\xf0\xe1\xe8\xda\xb0\xde\x7c\xfd\xfe\xe1\xe8\xfd\xc9\x87\x37\x9f\x9f\xce\xe3\xe0\xd9\xf7\xd5\xc2\xde\x4b\x8e\xf7\x5f\x5b\x5f\xde\xc4\xe7\xa7\x5f\xbe\x5c\x7e\x32\x2f\xae\x6e\x8c\xd4\x98\x9c\x7e\x9a\x9e\x8c\xe2\x1f\x2f\xae\x26\xc5\xfe\xcd\xdd\xe8\xfc\xe9\xad\xfd\xf5\xd9\xdb\xef\x2f\xa6\xd1\xbb\xfc\xfb\x3c\xbf\xfa\x68\xdc\x44\xa6\x7e\x79\x79\x7c\xee\x07\xcb\xfd\xe8\x6a\x79\x60\x5d\x7e\x2d\x16\x87\x4f\xdf\xbc\x7e\xfd\xea\xeb\xea\xc5\xf5\xcb\xcf\xcf\x16\xe6\xb3\xd1\x9b\xb9\x1f\xdd\xe5\xdf\xcd\xec\xf2\xc3\x8b\xeb\x6f\xc7\x1f\xcd\x8b\x9b\xf7\xdf\x53\xe7\xec\xf5\xdb\xe3\xbb\xf7\xfb\x1f\xae\x8b\x24\xb9\xfa\x7c\x6a\x5f\x25\xcf\xef\x3e\xe7\x93\x23\x33\x7f\x79\x74\xf9\x6a\xfe\xc2\xf8\xfa\xfe\xf5\x57\x7d\x7e\xf2\xe2\xe0\x5d\x71\x74\x75\x56\xec\xad\xbe\xe5\x67\xb3\xc3\xb7\x67\x49\x98\x7f\xbc\xfb\x30\x5b\xbe\x0b\x8b\xdb\xc3\x2b\xff\xfd\xe4\xd5\xd7\xe7\xa7\xee\x41\x34\x8b\xce\x47\x93\x93\x45\xaa\x9f\xfd\xf8\xfa\xe9\xfc\xf3\xf1\xc2\x79\x9f\xeb\x2f\x8f\xef\x4e\xd2\x93\xf7\x77\xe7\xce\x87\xb3\x74\xf6\x4e\x9f\xee\xde\xba\x27\xef\xbe\x9e\xee\x5b\xfe\x8f\x97\x91\xbe\xcc\x3e\xde\xb8\x6f\x3f\xbc\x33\x16\xee\xa7\xcb\x45\x30\x79\xb9\xb8\x3d\x8b\x17\xef\x3e\x7c\x3f\x7e\xff\xe1\xe0\x7d\x90\xe8\x47\xa3\x83\xbb\xc4\x8f\x3f\x2d\xce\x5e\x3c\xbb\x19\x5d\xed\xc5\x2f\x0e\xf7\x26\x77\xdf\x7f\x5c\x1c\xbe\xff\xfe\xf1\xee\xa5\x37\x39\x3a\xb4\x2f\x56\xde\x5b\x7d\xef\xc3\x89\x59\xcc\xae\xce\x96\x37\xfa\xe5\xcc\x7f\x36\x9f\xfd\x38\xd1\xdd\x70\x96\x7c\xbf\x38\xfd\xb2\xfa\x7a\xfb\xf6\xf0\xfb\xd2\xbd\x31\xcc\xec\x4d\x9c\xbd\xfb\xea\x7d\x0c\x6e\xee\x5e\x7c\x0b\x4f\x8c\xe3\x1f\x6f\xcc\x53\x7b\x74\x78\xf3\xec\xed\x8b\x3b\xb7\xd0\xbf\x7d\x5d\xa4\x57\xc5\xf2\xfb\xf7\xe9\xf4\xc5\x77\xdb\x7c\xfa\x61\x71\xa4\xdb\x9f\xde\x8e\xde\xc5\x17\x9f\x9e\x5f\x1d\x9f\x3a\xd9\xcb\xe9\xa9\xfd\xed\xe5\xa7\xfc\xdd\xf9\x67\xeb\x34\x75\x3e\x9d\x4c\xd3\x37\x6f\x96\xaf\xa6\xd3\x1f\xc5\xe2\xed\xeb\xf9\xd1\x6a\x76\xf3\xf9\xbb\xe5\xfd\x98\xc5\x97\x27\xdf\x46\x66\x78\x69\x9f\xbe\xd6\xe7\xfa\xfe\x27\xd7\x9a\xbd\xbf\xbd\xfe\x50\x8c\xbe\x1f\x4c\xbc\x45\x71\xe6\x7c\xb9\x4a\xf5\x93\x97\xaf\x6e\x5f\xa4\x2b\xfb\x76\x92\x7c\x35\xdf\x7d\x0c\x8f\xbf\x5e\x27\x6f\xcd\xd7\x9e\x7b\xf1\xd4\x3a\x9b\x4c\x2f\xd0\x33\xc6\xdf\xfd\x77\xde\xde\x74\xff\x55\x7a\x1a\x1d\x7d\x3f\x35\x9e\x5d\xee\xe5\xc1\xec\xe5\xee\xf5\xf4\xe0\xe8\xf2\xf0\xc5\x4d\x72\x9a\x9c\x9c\xbd\x3e\xfa\xfe\x3a\x3d\x3f\x8e\x26\xe1\xc9\xf9\xe9\xfb\x4f\xbb\xf9\xd1\xc9\xe9\x75\xe4\xbf\x5b\x1e\x7a\x47\x07\xbb\xb7\x47\x07\xaf\x9d\x83\x77\xee\xe4\xd3\xdb\xdd\xe9\x72\x71\x96\x1c\x9c\xfd\x38\x7a\x7b\xfa\xfc\x38\xba\xb9\x0e\x9e\x7f\x3f\x8d\xde\xdd\x45\x79\xf1\xe2\xdd\xf1\xde\xd5\xa1\x3e\x3d\xd8\xbd\x7d\xff\xf6\xa3\x3e\xbb\xfd\xb4\x7b\xfc\xea\xd3\xa7\x8f\x1f\x27\xef\x27\xdf\x4f\xdf\x9f\x1c\x97\xd1\xfb\x95\xf5\xf9\xe0\xd3\xd3\xd1\x8b\xd7\xe7\xc1\xb7\xbb\xe0\x7a\x39\xd9\xbd\x5e\xbd\x3d\x3f\x78\xfa\x72\xff\x0b\x9c\xd0\xee\x1e\x9e\x2e\x3e\x9c\x59\xbb\xbb\xbb\xf2\xa7\x3e\x5d\xee\x53\x9f\xe3\x2c\x4d\x8b\xfb\xe1\x70\x1a\x67\xc3\x38\x4a\x2e\x87\xc1\xb4\x88\xae\xc2\xe1\x34\x8d\xd3\x6c\x7c\x15\x64\x7f\xc2\x32\xf0\xfb\x30\x0f\xa7\x69\x32\x0b\xb2\x5b\x00\x96\x26\x43\x47\xd7\x9f\xec\x60\xd8\x7c\x34\x04\xec\x52\xc0\x17\xe9\x55\x98\x75\x43\xb9\x8a\xf2\xa8\x08\x67\x08\xe9\x22\x8f\xff\x34\x2d\x7f\xd0\xb3\x8d\xfe\xa0\xe7\x58\xfd\x0a\x76\xba\xca\x8b\x74\x01\x50\x72\x69\x35\x49\xb8\x2a\xb2\x20\x1e\x9a\xba\xfe\xe4\xe7\x45\xb1\x88\xef\x27\xe9\xcd\x30\x8f\xee\xa2\xe4\x7c\x3c\x49\xb3\x59\x98\x0d\x27\xe9\xcd\xcf\xff\x3d\x18\x8f\x27\xe1\x3c\xcd\xc2\xc1\x78\x1c\xcc\x8b\x30\xc3\x01\xa3\xe4\x22\xcc\xa2\x02\x12\x18\x2e\xf2\x61\x59\xe3\x3c\x4e\xaf\x91\xae\xf3\x69\x96\xc6\xf1\x24\xc8\x76\x86\xd7\xe1\xe4\x32\x2a\x86\x45\xb0\x1c\x5e\x44\xe7\x17\x71\xd9\x34\x88\xb7\x22\x0b\x92\x7c\x19\x64\x61\x52\xfc\x8c\x16\xe7\xf7\x57\x61\x56\x44\xd3\x20\x1e\x06\x71\x74\x9e\x8c\x17\xd1\x6c\x16\x87\x3f\xff\x27\x4b\xe3\xf0\xbf\x26\xab\xa2\x48\x93\x7f\xdf\x4f\x57\x59\x9e\x66\xe3\x65\x1a\x25\x45\x98\xfd\x0c\x06\x41\x16\x06\x03\x58\x3a\x20\x40\x07\x51\xb2\x5c\x15\x83\x38\x98\x84\xf1\x20\x0f\xe3\x70\x5a\x0c\xf2\xd5\x62\x11\x64\xb7\x83\x22\xbc\x29\x4a\xc4\xfb\x22\x5d\x4d\x2f\x90\xee\xc7\x8b\x20\x89\x96\xab\x18\xbc\xea\xfa\x13\x52\x19\xcf\xd3\xe9\x2a\xbf\x4f\x57\x45\x1c\x25\xe1\xd8\x5c\xde\xf4\xf2\x34\x8e\x66\xbd\x4a\x2e\x50\x3e\xcc\xa2\xe4\x1c\x0a\xb5\x83\x40\x87\xe9\x7c\x9e\x87\xc5\xd8\x58\xde\x54\xa4\x86\x8b\xf4\x0e\xc2\x97\xe0\x83\xff\x29\x6e\x97\x35\xb3\xfc\xc2\x2c\xcc\xc3\x42\x50\x96\xaf\x26\x8b\x88\x29\xe4\x70\xfa\xb2\xd2\x3a\x8f\x35\xa8\x23\xa4\x3e\xa4\xa4\x5a\x39\xc8\x1c\xb2\x60\x16\xad\xf2\xb1\x0e\x81\x11\x67\xc1\x2c\x4a\xff\x3d\x9e\x45\x79\x30\x89\xc3\xd9\x00\x2b\x9a\x5e\x84\xd3\xcb\x49\x7a\xd3\x94\x56\x8d\x96\xa4\xc5\x30\x88\xe3\xf4\x3a\x9c\xe1\xb4\x66\x41\x11\xfe\x1b\xa7\x50\x44\x0b\xf2\x43\x09\x51\x7e\x1c\xc6\xe9\x34\x88\x89\xa2\x45\x9a\x14\x17\xff\xbe\xaf\x9a\x23\x58\x2e\xc3\x20\x0b\x92\x69\x38\x8e\xa3\xbc\x28\x2d\xb9\x16\x27\x0b\xf3\xe8\x2e\x1c\x57\x56\xf6\x73\x1e\x85\xf1\x2c\x0f\x8b\xfb\x45\x94\x0c\xaf\xa3\x59\x71\x31\xd6\x77\x96\xc1\x6c\x56\x5a\xb8\xbe\xb3\x08\xb2\xf3\x28\x19\xeb\x3b\x50\x0d\x63\xfd\x67\x1c\x9e\x87\xc9\xec\x7e\x16\xe5\xcb\x38\xb8\x1d\x4f\xe2\x74\x7a\xb9\x03\x11\x0d\x5d\xef\x63\xb8\x40\xcd\x17\xd0\x0d\x55\x7d\x05\x63\x3a\x0f\x83\x6c\xca\xe7\x3a\x49\x93\xf0\xe7\xff\x5c\x44\xb3\x59\x98\xfc\xbb\xae\xaa\xfc\xfa\xff\x44\x8b\x65\x9a\x15\x41\x52\xfc\x9c\xc5\xf7\x90\xbb\xe1\x24\x2d\x8a\x74\x51\x73\x3b\x2c\xd2\xe5\xd8\xc8\xc2\xc5\xcf\xa2\xd4\x7c\xd5\x82\xf9\x32\x98\x02\xc6\x7e\x06\xe3\xd2\x45\xdc\xc3\xfe\xf7\x87\xae\x7b\x66\x60\xed\xd0\x9e\xa2\x71\x6c\x83\x1e\x82\x79\xb2\x53\xaa\x71\x38\x0b\xa7\x69\x06\xfa\x07\x64\x34\x18\x23\xff\x54\x51\x74\x5c\x67\x34\xf1\xf9\x14\x09\x57\x36\xe8\x21\x58\x21\x65\xe0\xc5\x54\x38\xc5\xdc\x9d\x84\xdf\x55\x32\x0b\xb3\xb2\x5d\x7e\x06\x63\xe8\xf2\x2b\xda\xa3\xd0\xf1\x26\x53\x3e\x6d\x7c\x70\x18\xf4\x10\xa8\x8c\xb8\x56\xa2\xe6\xd9\x30\x4d\xe2\xdb\xfb\x65\x9a\x47\xa0\x3c\x98\xe4\x69\xbc\x2a\xc2\x9d\x69\x1c\x2d\xc7\x59\x38\x2d\xfe\x34\x96\x37\x03\xec\xbf\x27\xa0\x68\xb8\x0c\x8a\x8b\x71\x94\xe4\x61\xf1\xa7\xa3\xf7\x9f\x60\x26\x55\x59\xe1\x0e\x32\x2b\x63\x79\x53\xd9\xde\xf2\x66\xa7\xf2\xbf\x63\x68\x39\x3b\xd7\x17\x51\x11\x82\x76\x2f\x4d\xea\x3a\x0b\x96\x3b\xa5\x69\xe8\x3b\x71\x38\x2f\xc6\xfa\x4f\x2d\x88\xc3\xac\x18\x46\xd3\x34\x19\x00\x96\xcb\x9f\x6a\x73\x8b\x12\x60\xc0\xd0\xc0\x51\x7d\x9a\x9f\x85\x0b\x54\x23\xfc\x19\xe3\x2d\x98\x5e\x9e\x67\xe9\x2a\x99\x0d\xb3\x70\x19\x06\xc5\x38\x49\xd1\x4f\x78\x19\xe8\x7e\xd3\x34\x29\x82\x28\xd9\xe1\x3b\x7b\x8c\xaf\x9a\xad\xe1\x75\x90\x25\xa5\xe3\xc3\x0b\xc9\x82\x0a\x94\x83\x53\x17\xe1\x9f\xef\x31\xae\xa2\x45\x70\x1e\x36\x2f\x7b\x83\x5f\x9f\xe5\x57\xe7\x4f\x6f\x16\x31\xfe\xa2\xb7\x3f\xe8\x5b\xfb\xf9\xd5\x79\xdf\xd4\xaf\xc2\x2c\x8f\xd2\xa4\x6f\x1d\xf4\x4d\xd3\xd0\x8c\xbe\x69\x96\x5f\xa3\xf0\x7a\x2f\xbd\x81\x5f\x9d\xbe\xa9\x97\xff\x99\x2e\xfa\xab\x84\x58\x96\x0e\x3d\xbb\x0a\x77\xf3\x65\x38\x2d\x8e\x4b\xdb\x81\xd0\x37\x47\xd1\xec\xf4\x28\x9a\xf5\x4d\x7d\x11\x86\x05\x84\xbe\x59\xc4\x49\x0e\xcb\x2f\x8a\x62\xd9\xb7\x76\xfb\xe6\x61\xdf\x3c\xbc\xbe\xbe\xd6\xae\x2d\x2d\xcd\xce\xfb\xe6\xa1\xa9\xeb\x7a\xdf\x3c\x04\x7c\x61\x48\xbb\x37\xa5\xf9\xb6\x21\x1b\xa3\xd1\xa8\x6f\x1e\x42\x58\xd3\xec\x5b\xcf\xfb\xd6\xfe\x2c\x9c\xe7\xf0\x27\x30\x96\xf7\x4d\xbd\xf4\x59\x90\x54\x69\xf7\x7d\xf3\x70\x9a\xe7\x08\x5c\xdf\xed\xeb\x23\xa8\xe3\x21\x1a\x5e\xfa\xde\xde\x3c\x8a\xe3\x61\xb6\x8a\xc3\xbe\xb5\x1b\x5e\x85\x49\x3a\x9b\xf5\xad\x3d\x60\xe0\xcc\xd7\x12\x16\x70\x67\x79\x76\xf9\xa7\x6f\xed\xf5\xbd\x83\xbe\xb5\x5f\x4a\x05\x18\x00\xbc\xf4\xcd\xc3\x8a\x31\x7d\xb7\x6f\xea\xdd\xfe\x6f\xed\x17\x51\x01\x48\x85\x37\xd3\x38\x58\x80\x5e\x3b\x2c\xb2\x28\x48\xce\xe3\x70\x08\xd8\x06\x75\x54\x60\xeb\x55\x52\xf6\xde\xbe\xa9\x4f\xe3\x20\x47\x0d\x47\x6a\xa6\x2c\xc2\x7e\x07\xbd\x7d\x88\xac\x67\x06\x11\x8e\x0c\xbf\x6f\xee\x9b\x86\x66\x99\x81\xa1\x59\x7d\x73\x1f\xfe\xad\x63\xff\x19\x9a\x35\x34\x34\xeb\x8b\x61\x33\x20\x46\xf9\xef\xd0\xd4\xdc\xf2\xdf\x2b\x77\x57\x48\xa2\xae\xe5\xac\x6e\xf8\xbe\x79\x08\x04\x00\xbf\x4c\xa3\x6c\x1a\x87\x9d\x85\x31\xa1\x30\x53\xd4\x0b\x0c\x4f\x1b\x39\xe8\xd3\x2d\xfc\x64\xda\x9a\xe9\xc1\x4f\x59\xd5\x81\x1c\x9c\x07\x54\x33\xf8\x75\x2d\x85\x5a\xa4\x42\x2d\x5d\xb3\x4a\xf1\x4d\x47\x73\xec\xf2\x5f\x5d\x73\x46\x7d\x73\xdf\xd3\xdc\xa0\xfc\x4e\xa8\x66\xe8\x00\xee\xf6\xf5\xb7\x8e\xe6\x78\x15\xd6\x2e\x03\xd7\x37\xf7\x7d\xcd\x2c\xb5\x6d\xe9\x2f\x4d\x4f\x73\x47\x2c\xad\x12\x5b\x73\xed\xa1\xad\xd9\xd6\xd9\x62\x68\x68\x9e\x0f\xda\x62\x64\x07\x46\xd5\x54\x55\x73\x0c\x35\xdf\xd5\xec\xd1\xcb\x92\x28\xb7\xd4\x1f\x1a\x9a\xed\xbf\x35\x3c\x4d\xf7\x40\xe5\x8e\xc3\xc2\x01\xf2\x1e\x68\xfb\x78\xa4\x79\xa5\xb4\x65\x0b\xd8\xbb\x3c\x48\xb3\xa4\x51\xfe\xeb\x69\xb6\xcf\xb5\x02\xc5\x3e\x00\xbb\xea\xd5\x79\xdf\x7a\xfe\x44\xea\xc0\x87\x60\x54\x92\x78\x6b\x08\xf0\xe8\x9c\xff\x86\xce\x79\x0e\xfe\xf7\xe8\x9c\x1f\x9d\xf3\xa3\x73\xfe\x8f\x71\xce\x57\x8b\xeb\x61\x9c\x9e\xa7\x94\x4b\xae\x3e\xf3\x1d\xf1\xbf\xd4\x3d\x31\xee\x73\x4b\x6e\xca\xff\x2c\x17\xfd\x65\x0a\x7d\xf5\x83\xf8\x56\x4a\x9f\x8d\x53\xba\x5a\xf4\x4d\x7d\xb2\x3a\x97\xfb\x20\xdc\x35\x8b\xdd\xa1\xb5\x5f\xea\x25\x42\xd6\xff\x32\x0c\x66\x61\x96\x43\xfe\xf3\x22\x4b\x2f\x91\x27\x2f\x67\xc0\xf8\x57\xb8\x3a\x81\xb4\x04\x0b\xa0\x67\x26\x81\x31\xcf\x5e\x16\x54\x6e\x9c\x2b\x9f\x98\xab\xfd\xb7\x43\xc4\xd8\xf0\xd3\x32\x9c\x22\xf6\xc0\x5a\xdd\x3c\xcd\x16\x68\xac\x29\x7f\x8d\x83\x22\xfc\x73\x68\xba\xa6\xa6\x83\xff\xf5\xcd\xfd\xbe\xa9\x0f\x0d\xcf\x41\x1f\x9e\xb4\xd7\x2d\xe6\x43\x37\x5a\x6a\x36\x2d\x9f\xa8\xd8\x70\xad\xf5\xea\x15\xf3\x70\xb5\x18\x96\x2d\xdf\xc2\x87\xad\x79\xba\x65\x94\x51\x05\x60\xc3\xdc\x9c\x0b\x92\xa3\x2c\x9c\x16\x18\x53\xc7\xe1\xb4\x80\x43\xa3\x6d\x62\x0d\x9f\x2e\x83\x69\x54\x20\x47\xae\x6b\xa6\x43\x1b\x4a\xdf\xb4\x0e\xc0\xff\x60\x01\x05\x8f\x7a\x64\xd3\x5b\xcb\xdf\x6e\x89\xdf\x30\x2b\xac\x3a\x30\x5c\x1c\x20\xbf\x65\x88\x86\x85\xbb\x2d\x20\xc3\x36\x94\x81\x46\x9d\x6a\x00\xf1\x34\xd7\x1a\xd9\xbe\x05\x1c\xab\x61\x69\xbe\xe7\x9a\xb6\x5e\xb2\xb1\xef\x69\x96\x69\xba\x8e\x65\xda\xb0\xc8\xd4\x47\x9e\xee\x97\x45\xae\xe6\x58\x23\xcf\x37\x1c\xb3\x2c\x31\xb5\x91\xee\x3b\x86\x35\x2a\xa3\x42\xcd\xd7\x47\xa6\xa5\xdb\x26\xc2\x31\x46\x23\xcb\x2e\xa9\x39\x9a\xee\x79\x9e\xa1\xdb\x16\x2c\x71\x2c\xd3\xf4\x2d\xaf\x6f\xea\x76\x89\x63\x99\x76\x39\x98\xee\x1b\xb6\x66\x19\xba\xe5\x8e\x0c\x40\xcd\xb0\x46\x9e\xa9\x83\x51\xc1\xb0\xb5\x91\xe7\x8e\x74\xa3\x2c\x79\xeb\x6b\xa6\xee\x99\xce\x08\x8e\x7a\x86\x66\x79\xb6\x3d\x2a\x55\xa6\xef\xfb\x9a\xeb\x8f\x3c\xcf\x04\x58\xa6\xa9\x59\x9e\x6f\x7b\x56\x19\xaf\x8e\x34\x63\xe4\xdb\xb6\x3d\x32\x60\xc9\x48\xb7\x3c\xdd\x2e\xd9\x33\x74\xcd\x70\x4c\xdf\x30\x99\x92\x7d\xc3\xd0\x0c\xcf\xd4\x47\x70\x3c\x21\x90\x0c\xcd\x35\x5c\xdf\xd4\x47\xa8\x22\xcb\xd0\xdd\x72\x38\x06\x36\x3c\xf2\x2d\xd7\x76\x19\xee\xc4\x45\x86\xad\x79\x9e\x6d\xbb\x3e\xd0\x9d\xa3\x01\xb6\x6d\x03\x96\xf8\xba\xe1\x8c\xe0\xa0\xe7\x68\x9e\x59\xd6\xeb\x00\x72\xb6\xe6\x9b\xbe\x67\xba\x2e\x2c\x72\x5d\xd7\xf5\x2c\x44\x6e\x64\xd8\x23\xc7\xf7\x61\x89\xed\xbb\x96\xe9\x97\xa3\x87\xe1\x68\x86\xef\x95\x4d\x53\x95\x78\xa6\x03\x1a\x16\xfc\x66\x78\xbe\x51\xf1\x60\x8f\x74\xdd\xf6\x20\x8e\x6b\xe8\xae\x39\xb2\xab\x7a\x1c\xcf\xb6\x78\x25\x23\xdd\xf0\xdd\xd2\x32\xf4\xb7\x44\x51\x29\xab\x5b\xaa\xdf\x42\x15\x61\x45\xa6\x66\x1a\xa6\xee\x01\xb6\x5d\x4d\x1f\x79\x23\xdf\x65\xd5\xed\x69\xba\x65\x8f\x0c\xcb\x66\xdb\xc8\xd3\x46\x9e\xe1\xdb\xba\xc5\x20\xf9\x9a\xed\xf9\x8e\xe7\x30\xf5\x10\x05\x38\x6f\x6f\x89\x22\xc3\xd5\xfc\x91\xeb\x38\x3a\x64\x9b\x2a\xd2\x2d\xcb\xf7\x40\x77\x31\x46\x9a\x61\x1a\x23\xd3\x41\x6a\xb0\x3d\xdb\xb4\xc1\x60\x6d\xea\xa5\x43\xf3\x0c\xdf\xa2\x4b\xca\x70\xcd\xf7\x7c\xc7\x36\x99\x22\xd3\xd0\x6c\xd7\xf2\x1c\x88\xe4\x6a\xba\x63\xda\x6e\xd9\x13\x99\x92\x86\xbb\xb7\x44\x11\xa9\x6f\xb2\x08\xd3\x83\x69\x68\x23\xc7\xd4\x7d\xd0\x63\x09\xd5\x99\xa6\xe6\xfb\xbe\x0e\x99\x23\xf5\x6d\x5a\x9a\x6f\xda\xba\xce\xea\xdb\xb4\x35\xcb\x32\x5d\xcf\x32\xe8\x7a\x88\x02\x42\xdf\x44\x11\xa9\x6f\xba\xa8\xd1\xb7\x59\xba\x03\x47\x77\x6c\x56\x75\x8e\xe6\x3b\x96\x6f\x7b\x26\xab\x6f\x57\xf3\x2c\xdd\xd3\x39\xfa\xf6\x34\xcb\x70\x7d\xdf\x33\x18\x7d\x53\x25\xb8\xbe\xf1\x22\x4a\xdf\x44\x11\xae\x07\x4f\xf3\x75\xc7\x34\x2c\xc6\xd3\x98\xbe\xe6\xd9\xa6\xc1\x5a\xb7\x39\xd2\x5c\xcf\x33\x4c\xd6\x6d\x59\xba\x66\xf8\xb6\x6f\x31\xda\x26\x0b\x08\x6d\x13\x45\x86\xab\x99\x9e\x6f\xa1\xde\x4f\x16\xd9\x9a\xad\x7b\xba\x5d\xfa\x8f\x92\x37\xd7\xf0\x0d\xe8\x53\x0d\x4b\xd3\x47\xae\x39\x72\xe0\xf4\x1f\x57\x29\x5e\x52\x36\x9e\x6f\x3b\xa6\x69\xb8\x0c\x92\x55\x3a\x10\x43\xd7\x5d\xe4\xf2\x6d\xcf\x71\x2c\x79\x49\x69\x74\xba\xe5\x99\x4e\x35\x80\x94\x9e\x6e\x64\x41\x43\x2d\x3d\xb4\x69\xd7\xcc\x79\xa6\x09\x3c\x90\xa9\x6b\x9e\xee\x8f\x7c\xb6\x64\xbf\xec\xaf\xae\xed\x38\x4c\x89\xe1\x69\xbe\x61\x8e\x6c\x96\x03\x71\x49\xe9\x80\x0c\xdf\x36\x4c\xdb\xa0\x99\x33\x5c\xcd\x30\x1c\xdb\x74\xd9\x8a\x1c\xcd\xb4\x74\xdf\xd4\x6d\x96\x39\x4b\xf3\x5d\xc3\x73\x2d\x9f\x41\x32\xcb\x41\xc2\x75\x3c\x34\xc0\xba\x9e\x63\x43\x47\x67\x6a\x86\x61\x8c\xcc\x11\xb2\x7a\xc3\xd2\x4d\x60\x7d\xfa\x5b\x62\x70\x33\x46\x9a\xe3\xea\xbe\xe1\x97\xc3\xf5\x5b\xe1\xf0\x6f\x62\x01\xd3\x61\x19\x1e\xd9\x9c\x70\xe8\x10\xfc\x6f\x83\xd9\x15\x33\xd3\x3a\xef\x3a\x35\x6b\x43\x10\x02\x11\x05\xd8\x2c\xef\x5f\x4f\x7e\x6a\x51\x3e\x4c\xe7\xf3\x61\x3e\xcd\xc2\x30\x69\x76\xa1\xe6\xd1\x4d\x38\x6b\xb6\x11\xeb\x2d\x25\xec\x53\xb3\xb9\x84\x7d\xac\xb7\x99\xb0\x6f\x70\x1f\x09\xfb\x50\xa4\xcb\xf1\x70\x9a\x26\x57\x61\x56\xec\x05\x79\x58\x4e\xf9\x4f\xd2\xf2\x27\x53\xff\xd3\x78\x82\x41\x52\x7b\x55\x58\xc9\x55\x94\x47\x93\x28\x8e\x8a\x5b\xb6\xac\xde\x6d\xc2\xbe\x55\x5b\xb4\x3d\xbd\x27\xa9\xba\x87\xa1\xc0\xfd\xb9\x65\xba\x44\x7b\x86\x49\x11\x26\x05\xa5\xa1\x9d\xbb\x61\x94\xcc\xc2\x9b\xb1\xa1\x3b\x3a\x71\x5e\x64\x52\x24\xc3\x7a\xdf\xaa\xaa\x5c\xb3\xb2\x70\xb1\xd3\x00\x5c\xa4\x59\x74\x97\x26\x05\x0e\xe2\x0a\x41\x6a\xb1\x68\x98\xba\x9e\x66\x9b\xad\x29\xac\xbe\x35\xbb\x95\x3c\x94\x27\x3d\xb2\x9c\xad\xf6\x09\xce\x14\x6a\x7a\xb8\xb9\x47\x7f\x1f\xe6\x8b\xb1\xa1\x99\x64\x11\x7e\xda\xc6\xd1\x71\x06\xa9\xa3\x03\x9a\xe1\x90\x98\xa8\x1c\xed\xba\x6b\x3a\x55\x5c\x2d\x19\x4d\xce\xd9\xa3\x22\x18\x58\xb3\x6f\x3e\xcc\x8b\x20\x99\x05\xd9\x6c\x88\x6f\xbd\x1b\x4c\xbd\x3c\x0c\x78\x46\x28\xba\x0b\xc7\xba\xe6\xa8\xc2\x73\xa5\xe6\x41\xd7\xac\x98\xed\x94\xeb\xa6\xee\x31\xe6\xc0\x03\x07\x4b\xe7\x88\x71\x31\x78\x39\x65\xa5\xb4\xe2\xb7\x00\x87\x45\x81\x9f\x1a\xd0\x0c\x53\x0a\x8f\x2b\xb0\x85\x0f\x25\xdd\x01\x48\x55\x66\x25\x3a\x9b\x85\xf3\x60\x15\x17\xca\x07\xae\x70\x1c\x64\xa0\x34\x2a\x43\x96\x8b\x2b\xb7\xda\x0a\x0c\x9e\x5b\xa8\x81\x05\xfc\x39\x5c\xf6\x14\x4e\x92\xf9\x22\xc1\x6e\x86\xf9\x45\x30\x4b\xaf\xdb\xea\xe5\xa2\x57\x67\x7a\x5a\x8e\x97\x79\x2d\xd8\x1c\xa9\x79\x1a\x94\xd3\xe0\x37\x11\xc9\x88\xa0\x79\xc1\x21\x25\x3e\x1f\x2a\xd6\x51\xa1\xcb\xeb\xe6\xa2\x56\xae\x6d\x9d\x6a\x6b\xb7\xd8\x6e\x9c\x44\x35\x52\x5a\xfc\x96\xa0\x8b\x65\x24\x36\x31\x64\x92\xc6\x3a\x06\xdd\x28\x65\x23\xc3\xae\xc8\x6c\x66\xe0\x0c\x95\x16\x43\xef\xa2\xe6\xad\x18\x7e\x6d\x17\x5b\xb0\x60\x71\x1f\x52\xb2\xc4\x65\x16\x2d\x82\xec\xb6\x0b\x0b\x15\x4a\xc7\x6e\x5b\xa3\xc9\x14\x27\x47\x55\xb3\x71\x5f\x86\xdc\xa1\x77\x34\x0c\xaf\x65\xd3\x15\xfa\x7a\xb6\xcc\x60\x0b\xa5\xae\x08\xd8\x6d\x04\x54\x0c\x56\x40\x64\x4d\x4f\x4d\xa3\x77\x30\xb2\x7c\x35\x9d\x86\x79\xbe\x0e\x8a\x90\xc9\x0a\x80\x52\x75\x8d\x27\x76\xe8\x34\x69\x1e\x7a\x8b\x71\x56\x60\x3e\xbf\x72\xbe\x75\x32\x9a\xe0\xf3\xdd\x62\x9f\x15\xe0\x88\x5f\xf5\x7a\x06\xca\x60\x77\x35\x50\x96\xc0\x1a\x06\x5a\x2b\x47\xee\x06\xf9\x6d\x24\x23\xb4\x56\x4b\xc8\xc3\x8a\x16\xf3\xdb\x20\x16\x60\x48\xc8\x34\xa9\xc8\x86\xa2\x39\x3b\x0a\x44\xd6\xb2\x4a\xe5\x88\xa2\x42\x10\x58\xc6\x66\x21\x85\x90\x4a\x8b\xa1\x75\x69\xad\x8d\x42\x0a\xc6\xf4\xd4\x3a\x02\xcf\x52\x54\xc8\x76\x89\x54\x82\xe4\xbc\x55\x1a\x1e\x86\xd0\xe6\x50\x39\x1d\xf5\x21\x2c\x49\x38\x4e\xd2\xe5\x20\xb7\x18\x3b\x82\xa2\x63\x5f\x1c\x57\x52\xaf\xa8\xd2\x56\xcb\x46\x70\x23\x6e\xb5\x6b\x86\xc8\x14\x72\x57\xa7\xcd\xe0\xb7\x6a\x9d\xe4\x93\x67\x20\x6d\xb1\x85\x54\xfb\x32\x7f\xdd\xa2\x7f\xb9\xb7\x96\x1a\xdb\x26\xf3\x36\x8a\x82\xac\xcf\x4b\x25\x57\x74\xd4\x08\xda\x50\xa0\xb1\x86\x15\x2a\x7b\x69\x04\x6f\x4a\xa9\x6c\x64\xd3\xca\xb3\x3e\x7e\x13\x2a\x51\x6c\xb5\x76\xbe\x24\x32\xe3\xdb\xc8\xfa\x37\x70\xcf\x9d\x2e\x4e\xd6\x08\x2d\xab\x6a\x10\x06\xd7\x92\x04\x8e\x32\xdc\x56\xc8\x2e\x93\x3e\x80\xb6\x9e\x39\x91\xa8\x2a\xec\xf1\xed\x43\x82\xc0\x34\xba\x02\x6c\x17\xe9\xa3\xe4\x2a\xcc\x72\x91\x67\xe3\x9a\x43\x85\xa2\x14\x83\xf0\x31\xe5\xc2\x54\x60\x54\xab\x67\xe7\x93\xe0\x4f\xd3\x71\x06\xbd\xe6\x2f\x5d\x33\x1c\x5e\x0d\x2a\x57\x6a\x05\x42\x51\xde\x09\xd4\xaa\x0f\x7a\xe8\xff\x9a\xc9\xad\x4f\xd1\x7e\xb8\x55\xb6\x79\x21\x5a\x6b\x72\x1a\x6b\x37\x0a\x63\x69\x5d\xf4\xbd\x86\x57\x01\xbb\x21\x42\xbd\x89\xd7\xb0\x07\xbd\x3f\x5c\xf0\x3f\x9c\xd8\x79\x96\xae\x96\xe8\x72\x6f\x75\xa5\xf6\x0f\xc7\x98\x4e\xc2\xf0\xa7\x36\x29\x12\xea\x1e\xf2\x0e\xf7\xe6\x9c\xe0\x7a\x27\xb3\x03\x5b\x6d\x93\xa1\xdd\x2a\xf2\x23\x29\x02\x51\x06\xd5\x97\x85\x8b\x27\x3b\xc4\x7e\x1a\xda\x4e\x23\xbe\x71\xc9\x80\xa2\x92\x8a\x4e\x50\x41\x77\xb8\xd3\x38\x9a\xed\x34\x77\x63\x2d\xb8\xbd\xb2\x08\x6e\xd0\x07\x03\xde\x08\xe4\xdc\x34\x0c\x6f\x8a\xfa\x46\xf8\x38\x8c\xe3\x68\x99\x47\x39\x73\x47\x11\x80\xc1\xdb\x7f\xd3\x10\x68\x91\x77\x13\x14\x7e\xac\x0f\x5f\x8e\x57\xcb\x65\x98\x4d\x83\x3c\xe4\xdf\x20\xdc\x21\x0c\xb6\xba\x37\xaa\xb0\x60\x8e\x83\x60\xd7\x48\xb1\x23\xd0\xac\x8b\x61\x0a\xe5\xbb\x19\x83\x1e\x86\xfc\x64\x87\x64\x51\x46\x80\x66\x8a\xb3\x9b\x87\x7f\x22\x89\x48\xb6\x02\x07\x3d\x88\xfd\x64\x87\xda\xf2\x83\x3b\x7e\xcd\xbe\x1e\x6c\xfa\xe6\x77\x79\x0d\x35\xdc\x00\xed\xc9\x91\x79\x19\x9c\x2a\x2f\xc3\xb5\x0a\xbb\x18\xe4\xa0\x07\xd6\x39\x49\xc1\x95\x64\xa6\xc5\x6d\x36\x0d\xa1\x64\xfc\xfd\x74\xc1\x56\xe3\xa0\x57\xed\x35\x3e\x01\xbe\x00\xdd\x54\xe6\x5e\x63\x2e\xcb\x7b\xd3\x59\x8e\x6e\xda\x82\xdf\xaa\xdb\xb6\x6b\xb7\x3f\xac\x95\xba\x79\xbd\x2e\x19\xc8\x3c\x63\xc9\x7f\x84\xd6\xdc\x99\x4f\x55\x4d\x9c\x1c\x5a\x07\x3d\x84\x8e\x19\xb9\xe3\x7a\x81\x94\x3b\xfa\x1a\x77\x89\x80\x78\x44\xf7\xb5\x9b\xb1\xb4\x6c\x38\x23\x0b\x17\x65\x4b\xf4\xfe\x30\xbc\xd1\x64\x66\xf5\xc0\xb5\xe9\x1d\x01\x90\xa8\xd3\x93\xa3\xf3\xa0\x22\xf6\x04\x52\x03\xd5\x6b\x75\x96\x03\xc0\x4c\x93\xd5\x00\x8a\xe6\xba\xae\x54\x2e\xe1\x68\xc3\x66\x45\xd8\x41\x67\xb2\xc7\x9a\xbd\x15\xc7\xc3\x44\x02\x94\x07\x22\x7d\xa5\x3f\x2d\xff\xa8\xf8\x4a\x6e\x74\x30\xe8\x21\x0a\x4f\xf0\x36\xa8\x7b\x01\x1c\x52\xff\x22\xba\x00\xd5\x21\x1a\x27\x5f\x1f\xae\xb7\x66\x7f\xea\x83\x21\x68\xc6\x81\xfe\x84\x25\x44\xf6\x2c\xf4\xdb\x3d\x96\x0c\x61\xa8\x19\x76\x16\x2e\x60\x43\x82\xe5\xa5\x2a\xa3\xcb\xa0\xfe\x14\x25\xf3\xb4\xf9\x0d\x0d\xf7\xcd\x87\x6a\x2b\x81\x29\x68\x92\xc3\x30\x45\xf5\x9d\x27\x88\xcb\x16\x08\xd8\x20\x28\x35\x40\xbd\xf2\xd7\x41\x0d\x85\xfd\x8a\xe0\xb1\x2f\x14\xbb\x58\x09\xc3\x2f\x4b\xa7\xc2\xe6\x94\x88\x98\x91\x10\xab\x79\xbd\xff\xbf\x60\x54\xe6\x98\x18\x69\x9f\x74\x19\xde\x09\x9a\xa6\x65\x51\xe0\x67\x06\xba\x52\x3b\x8b\x50\x97\x30\x38\xb4\x6d\xb0\xb8\x0c\x04\x43\x83\xb5\x22\x89\x94\x12\x3a\xb4\xc5\x09\xe5\x68\x20\x84\x34\x64\x1a\xe7\xc0\x70\x35\x2f\x11\x87\x2c\xc6\xb1\xa9\x5e\x41\xe2\x32\x85\x04\x66\xdd\x39\x28\x24\xec\x3b\x01\x8f\x77\x33\x0a\x85\x2c\x22\xb0\x78\xde\x80\xc2\xe6\x83\xf0\xa5\x94\xd1\x11\x01\xf1\xa4\x20\xfc\x0c\x5f\x1a\x0a\x84\x4b\x45\xaa\x7d\x11\x10\xd3\x0a\x32\xa1\x38\xe5\x5c\x4e\x44\xad\xc9\x29\xdf\x4e\xfc\x47\xaa\xbc\x8a\x06\x49\x9b\x65\xbf\x56\x73\x59\xa6\x80\x32\x02\x16\x80\x69\x5d\x21\xf1\x8a\x96\x18\xa0\x85\x6d\x6e\x0d\x54\x33\x92\x65\xb5\x76\xc9\xcf\x78\xbb\x91\x25\x3c\x9b\x17\x54\x27\x81\xe1\x59\x2a\x1f\xa2\x8d\x79\x85\x4a\x18\x19\xb7\x6b\x40\x20\xfc\xa6\xcc\x87\xfa\x56\x35\x0b\xf5\x99\x36\x1d\xaa\x98\x35\x1c\x3e\xd9\xda\x6c\x04\xc5\x52\x56\x39\xb4\x69\x9d\x63\x25\x8d\x2a\xb1\x8f\x44\x0b\x60\xdf\xb9\xa6\xc2\xab\x46\x08\xc1\x35\x13\x4e\xb9\x9c\xe1\x56\xf2\x94\x54\x7f\xef\x39\x1d\x65\x7d\x70\x86\x47\x99\x1f\xfd\xb1\x6a\x63\xfa\x3b\x6d\x80\x74\x39\x6b\x81\x02\xca\xb5\x09\x8a\xca\xe5\x0c\xf3\xc8\xd3\x8d\x8a\x17\x35\x0d\x86\x7f\x25\x9a\x19\x2f\xe0\x1a\x22\xb7\x2a\x31\x08\xd7\x14\x79\x00\x2d\x6c\xb7\xd7\x40\x0b\xf7\x60\xb3\x77\x42\x33\xe4\x5c\x9e\x32\x42\xb6\xac\x14\x82\x83\x02\xac\x93\xfd\x8c\x44\xe7\x20\x54\x86\xc1\x96\x50\x8d\xca\xc1\xa5\xad\x5b\x22\x81\x84\x0a\xdb\x07\x84\x5c\x56\x35\x8a\xe5\xa8\xfb\x89\x18\x42\xa6\x71\xb6\x37\xf1\x55\x2c\x11\x87\xe8\x6e\x44\x31\x65\xb9\x9a\xac\x90\xc2\xac\x4d\x56\x13\x7c\xa7\xe0\xf1\x3e\xa0\x89\x8b\x28\x2c\x5e\x37\xd6\xda\x41\x44\x52\xca\xe8\x08\x1c\x02\x97\x55\xc2\x25\xf0\xa5\x21\xbd\x06\x1f\x44\xaa\x7d\x81\x73\x61\xb5\x2d\x13\x8a\x75\x3f\xfc\x4a\x44\xad\xc9\x3a\xa8\xc7\x15\xbd\xb5\x56\xf4\x70\x53\x25\xec\x76\xbd\x25\x1f\xde\x21\x6d\xd9\x92\x4f\x4d\x52\xae\x39\xfa\xc8\x38\x46\x12\xd1\x99\xcf\xe7\xdc\xe6\x26\xce\xa7\x0f\x7a\x60\xa3\xeb\x09\x23\xb9\x78\x0d\x85\x3f\x13\x97\xcc\xc0\xf9\xf3\xc3\xcd\xd8\xe3\x4e\x7b\xb8\xd3\x88\x0d\xeb\x61\x23\x66\x79\x2c\x8a\xa2\x47\xc5\xd6\x63\x62\x51\x14\x4b\xee\x90\x91\x6d\x3b\x09\x2a\x96\x65\xe5\xe0\x44\x5c\xbf\x28\x8c\x11\x1d\xf2\x17\x87\x31\xe2\x81\x99\x3b\x20\xcb\x5c\x3a\xd7\x95\xb7\x39\x40\xfe\xbd\x82\xf5\x1d\xe0\x1f\xd3\x69\xeb\x6c\x44\x78\x1b\x61\xd0\x2b\xd1\xa7\xd3\x29\xed\xf5\x00\xd1\x76\x3f\x23\x72\x79\x0d\x51\x81\xcb\x43\x07\x54\x07\xf8\x2f\x3c\x97\x67\x4d\x7d\x47\xd7\x65\xac\xf0\x8e\xff\x0f\x7a\x08\x91\xe7\xf2\x2a\x92\x72\x95\xd1\x57\x06\x30\x92\x2d\x7d\x9d\x38\x66\xce\xf6\xf5\x4a\x58\xce\x82\x6f\x55\x42\x2e\x1b\x62\xca\xa1\x17\x0b\x89\x22\x45\x97\xa7\xc6\x1e\xb5\x8e\x83\x55\xa4\xea\xf2\x14\xeb\xc1\x17\x01\xf0\x5a\x44\x2e\xcf\xd2\xdd\x89\x7a\xeb\x31\x2e\x0f\xa2\x2b\xb7\x21\xe1\xef\x44\x22\x10\xd3\x47\x5c\x86\x16\x6f\x67\x3a\x8e\xa9\xeb\x5d\xbc\x9d\xe8\xca\xc8\xa0\x22\xc6\x4e\xda\x20\x06\x6f\x32\x83\xb8\xa7\xa2\x5d\x8c\x7f\x3a\x10\xc6\x45\x53\xf5\x76\xfc\x4b\x2a\xbf\xd6\xdb\x09\xaf\xb6\xac\xeb\xed\xa4\x57\x5d\x54\xbc\x1d\x3c\xee\xd9\xe8\xbe\x4e\xac\xdd\x14\x62\x3b\x7f\xa8\x94\xe7\x0e\x67\x13\xd3\x90\xbb\x43\xce\x71\xfa\x41\x0f\xe1\xf1\xbc\x61\x45\xb1\x25\x74\x26\x8f\xe0\x63\x14\x5b\x3a\x12\x7e\x86\x9b\xed\x41\x48\x74\xd6\x15\x56\x05\xcc\x26\x53\xa5\x1b\x16\xa5\x2e\x21\xbc\x27\xa6\x5c\xca\x79\x12\x25\x04\x0e\xae\x7f\x0a\x89\x2c\x52\xf4\xb8\x2a\x3a\x60\x17\xf1\x51\x55\xa4\x23\xc6\x98\x26\x0b\x70\xc6\x54\x3d\xb4\x12\x5f\xd4\x3a\x71\xc5\x15\xe6\xb6\x71\x9e\xb0\xcf\x04\x47\x22\x6f\x3e\x35\x8d\x99\xb2\xf5\x31\xce\x1c\x62\xab\xda\xa0\xd4\x97\x23\x69\xe9\x15\xc9\x4a\x5c\xdc\xc5\xe3\xf2\xe2\xdf\x09\x81\x5b\x5c\xff\x68\x64\x78\xdd\x5c\xbf\xe0\xd2\xc9\xa0\xa2\xc5\x78\x7e\x88\xc0\x71\xfc\x48\x54\xb6\x00\x09\xc0\x41\xa9\xd4\x40\x0e\x08\x98\x22\x34\x61\x09\x85\x83\x2b\x49\x13\x17\xa9\x2f\x27\xf0\x6e\xa9\xfc\xda\xe1\x45\x74\x07\x47\x38\xba\x94\xbc\x77\xb8\x68\x43\xb9\xee\x4a\x12\xe1\xe0\x22\x3a\x37\xd3\x8c\x28\x1a\xbd\xe4\x23\x58\x04\x62\x57\x17\xeb\x53\x3d\x04\xdc\xda\x27\x51\x78\xb7\x66\xb6\x7c\x22\x85\xbe\x17\xb2\xf6\xc9\x14\xe2\x7a\x11\x6f\xdb\x6f\x9d\xb3\x23\xe2\x4d\x72\x4e\xf1\x16\x4f\x58\x6c\xb8\x43\xcf\xd8\x84\xe4\x88\x08\x7b\xd2\xa6\xf3\xa9\x8b\x0e\x9b\xb2\xaa\xad\x24\xdc\x47\x67\xc7\x52\x46\x21\x5d\x76\x9a\x19\x55\xb4\x6f\xa6\xff\x0a\x69\xf9\xdb\xbf\xf4\x18\xcd\x4a\xaa\xb8\x5d\xca\x4a\x29\xdd\x03\xde\x78\x17\xb5\xaa\x6a\x0b\xbb\xa9\x24\x29\xe1\xae\x6a\xcb\x26\x27\x33\xfa\xb3\xaa\x54\xde\xed\x63\x95\xd9\xb2\x93\xf9\x0b\x76\x01\x1b\xc7\xac\xba\x8c\xb6\xce\x3e\x9d\x78\x43\x82\x15\x75\x9b\xbb\x59\x1b\xee\x86\x30\x0d\x24\xd9\x8e\x63\x77\x35\x3b\xef\x70\xa9\xee\xa0\x54\x55\x3e\xe0\x4e\x0a\xc3\xc2\x96\x77\x54\x58\xfa\x1d\x77\x56\xa8\x7b\xf0\x9c\xed\x53\xce\x3a\x24\x1b\x13\xd1\xe0\x9b\xad\x54\x0a\xa2\x20\xe1\x8a\x65\x87\x86\x11\xe5\x2f\xe0\x47\x41\x88\x65\x15\x42\x14\x93\x42\x0d\x8b\x97\x35\xdb\xa3\x22\xc9\xd2\x28\x03\xc1\x5b\x22\x95\xc5\x19\x7c\x10\xfe\x79\x48\xf1\x82\x2b\x1f\x84\x8a\x5a\x7e\x81\x56\x25\xa7\x00\x25\xcb\xb5\xe2\x28\x85\x2b\x08\x1d\x8f\xfc\x0a\x39\x44\xc7\xd2\x84\x8b\xc1\xad\x07\xb6\x94\x16\x8d\x67\xf3\xb9\x3e\x53\x5e\x34\x16\x46\x1b\x90\x4c\xdd\x7d\xe0\x92\xab\x92\x82\xc8\x68\x03\xad\xd5\x8a\xd5\x24\x3c\x3a\x25\x5e\x71\x6e\x3f\x4c\xd4\x65\x69\xda\x09\x27\x9e\xe1\xac\xb3\x34\x2d\x89\x24\x20\x51\xd1\x12\xb5\xec\xdc\x0d\xa5\x1e\xc9\x69\x18\xe1\x72\x37\xad\x42\xee\xda\xb6\xf4\x1c\x08\x4f\xcf\x82\xa3\x19\xe2\x45\x74\x6e\x63\x74\x5d\x4c\x7f\xc0\x91\xbf\x35\xa1\xce\x86\x23\xbf\x52\x72\x1d\x95\x91\x9f\xcc\xb0\xc0\xda\x81\x60\x49\x5e\x8c\xc0\x59\xb3\x97\x04\x0a\xa2\x45\x7d\x09\x8a\x64\xd9\xbf\x5a\x26\x55\xce\x5f\x41\x6f\x50\xa0\x85\xd2\x8d\x62\x3e\x7e\xde\x0d\x7e\x64\x81\x76\x15\x14\xe8\x50\xfb\x09\xa2\x06\x14\xee\x11\x28\x84\x15\xc2\x5d\x06\x1a\x40\xb4\xdb\x20\x61\x82\x81\x10\x72\x21\xde\xb9\x60\x20\x38\x3b\x18\xb2\xd8\x86\x0b\xc1\x0d\x6d\xc4\xbb\x21\x5c\x08\xde\xae\x88\x8c\x11\x3e\x08\x97\x13\xc9\x1e\x0b\x1f\x84\x0a\xb2\xb6\x6e\x60\xe2\x10\xab\x65\x83\xa6\x9d\x80\x64\x27\x47\x21\x44\x6b\xdb\xf2\x51\x20\x21\xdb\x1c\xda\xbe\x22\x05\x31\x9e\x74\x3f\xa9\x0d\x59\xb8\xed\xd4\x1a\x1f\xca\x77\xa7\x5a\xd1\x95\x76\xb1\xe6\xe1\x6c\x36\xf3\x3a\x3a\x50\x26\xba\x84\x54\x6a\x17\x0a\xb7\x75\x54\x1a\x86\x0c\x2e\xd1\x76\x90\xb0\x79\x44\xb1\xa5\x7c\x07\xac\x15\x5d\xbc\x53\xd6\x1e\x99\xb6\xec\xa8\xb5\x13\xe8\xb2\xf5\x36\x9f\x4e\x9d\xc9\x64\x8d\xad\x37\x49\x64\x0b\x69\x0a\xb6\xe0\x24\x81\x2d\xd5\x34\xe2\xa8\x55\xb8\x99\x47\xb5\x9e\x70\xeb\x4e\xc2\x04\xdd\xc2\xe2\x4a\xc4\x1b\x84\xb4\x15\xf0\xb6\x03\x65\xc1\x35\xcf\x52\xf8\x81\xb3\x78\xd3\x91\x67\x4d\xdc\x1d\x46\x19\x23\x5c\x93\xe3\xd7\x23\xd9\xca\xe4\xda\x65\xc7\x2d\xcd\x87\x5c\xde\x6b\xc9\xc8\x26\x8d\xf1\xd5\x76\x3b\xdb\xe2\xfb\xd6\x5d\xcf\x38\x4a\x2e\x07\xf5\x4f\x9c\xa0\x99\x90\x57\xcc\x0f\x93\xf2\x8c\x16\x6e\x03\x3d\x12\x29\xd7\x3a\x6f\x44\x36\x19\xde\x78\x3b\x3d\x40\x6a\x36\x96\x84\x9f\x89\x90\xab\xd6\x0f\x15\x67\x61\xdf\xd5\xf7\xdd\xda\x99\x22\x43\x90\xba\x92\x0e\xbb\x5d\x0a\x75\x60\x23\x75\x53\x83\x60\x78\xee\xda\x60\xf4\xc0\xcc\x6f\x36\xe1\x46\x13\x9d\xf1\x8e\xb7\xbb\x04\x64\xc0\x07\xb2\x46\x08\x76\xf4\x62\xed\x9e\xe3\x80\x01\x45\xd2\x09\xd5\x34\x35\xc1\x77\x65\x8f\xc4\xc9\xc6\xf7\x5b\xfc\x10\x3f\x95\x9f\xcc\xfb\x74\xe9\xf4\x02\xd7\x43\x11\x17\x34\x03\xca\xb1\x36\x40\xaf\x01\x07\xcb\xe5\x30\x0e\xaf\xc2\xb8\x57\x3d\x0f\x5c\x84\x0b\x6c\x8e\x8f\xc0\x79\x73\xfb\xf9\x7c\x2e\x63\x95\x97\xd8\xaf\x3a\xbe\xb4\x91\x72\xe9\x0c\x76\x7c\x43\x17\x9d\xa9\x22\x52\x14\xb2\xc7\xa9\x2a\x79\x1b\x8f\xd3\xa6\x27\xee\x79\x06\x44\xa4\x76\x67\xed\x44\xa8\x53\x0f\x8d\xd6\x99\x03\x0f\x78\x91\xe2\x41\x3e\x35\xa1\x1b\x07\xd8\xc6\x2e\x7d\xb0\xa0\x61\x49\xf5\x08\x9f\x22\x47\xc8\x5d\xb6\xf2\x43\x6c\xff\x63\xdc\x08\x3c\x6b\x9d\x8c\xb0\xfa\x0f\x24\x22\x54\xb4\x3b\xda\xcd\x0a\x33\x1b\x2a\xdb\xa2\xf4\x80\x5f\xa5\x8a\xca\xeb\xb6\xea\x82\xdc\xbf\xc7\x94\x21\x9f\x5f\xa0\xd4\x94\xe5\x1f\xcd\xac\x16\xbb\xd5\xe6\x19\xa2\x74\x97\x83\x1e\x27\xdf\x25\x33\xd9\x40\xd8\x98\xb3\x6f\x13\x91\xbb\x89\x0e\xb5\xa4\x4e\x84\xd9\x6a\x6f\x34\xc5\xec\xb2\x63\x4a\xa4\x87\x9e\xb6\xb6\xa5\x47\x1f\xe4\x00\x7f\xdd\xd8\x23\x4c\x04\x2a\x0d\x7e\x15\x9d\xb9\x60\xe8\xa9\xbc\xba\x70\x37\x7b\xa1\x3a\xde\xe4\xf0\x97\x7b\xb8\x3e\x40\x3e\xe4\x86\x7f\x13\xe6\xea\xe3\x3d\x05\x37\xe8\x19\x55\xaa\x4c\x3a\xd5\xa1\xee\x59\x64\xae\x43\xf8\x06\x9c\x42\xb2\x43\xf6\x05\xb9\xd2\xc0\x1d\x67\xfd\x8c\x87\xbc\x37\xe6\xe8\xac\x87\xa6\x4a\xd6\x43\xea\xf9\xb9\x52\x7c\x73\xbd\xcc\x87\xf4\xe3\x74\x74\xf6\x43\x98\xeb\xf4\xbe\x4a\x80\x0a\x33\x9f\xa2\x04\xa1\xba\xde\xc7\xf3\x85\xea\x7a\x1f\x26\x4f\xc5\xf2\xb3\xc1\xd7\x13\xb1\x0f\x24\x23\xd4\x6b\x8b\xa5\x7e\x2d\x20\x07\xc2\x98\xa4\x45\x91\x2e\x48\x2a\xe8\x5b\x37\x42\x19\xd0\x67\x95\xe2\x14\xfb\x44\x92\x61\x1e\x77\x6c\x52\x5c\x22\x2c\xf8\x30\x26\x19\xf4\xde\x13\x14\xa9\xc2\x6e\x31\x59\x43\x53\x14\x3c\xfe\x44\xbd\xa8\xf4\x2c\x7f\xd6\xe0\x4f\x3a\x84\x22\x22\xcc\x7b\x94\x5e\x16\x28\x89\x97\x56\x56\xfa\x48\x61\xa3\x29\x64\xbc\x90\x8e\xb2\x25\x73\x08\x89\x13\x06\x82\x84\xb6\x75\xc6\x40\x8e\x32\x94\x83\x3b\x11\xe6\xdf\x4e\x19\x64\xd2\xc3\x2a\xe7\x21\x4a\x88\x58\x67\xf1\xd5\x9b\xaf\xf4\x18\x37\x4d\xd5\xa7\x55\x9c\x64\xcb\xcd\xb4\x0a\x4b\xd3\x08\x7e\xaa\xef\x9a\xce\xb2\x74\x39\x4b\xaf\x4b\x26\xcf\xcf\x63\x14\xa0\x34\x70\xf5\xc6\x72\x0b\x5c\xbd\x34\xd5\x02\x57\xad\xa6\x51\x60\xff\xc9\x37\xd3\x15\xb4\x4e\xcd\x26\x54\x10\x88\x99\x49\x7b\x7b\x09\x6b\x10\x23\x08\x6a\x10\xb5\xb4\xb0\x06\x31\x82\xa0\x06\x81\x8d\x08\x2b\x10\xc2\x6f\x7c\x6b\x5f\xa1\x25\xc8\x49\x57\xbb\x5e\x45\xf0\x22\x2d\x89\xe0\x05\x42\x6f\x9e\x41\x40\x45\x66\x6c\x62\xa7\x20\x31\x17\x5a\x28\x2f\x17\x5a\x24\xed\x3f\x20\x93\x81\x8a\x3e\xf1\xc9\xa1\x82\x42\xf9\xe0\x42\x8d\xf2\xc1\x45\x2a\x7d\xd8\x9c\x0a\x0a\xda\xa2\xc6\x48\x05\xf5\x8a\x10\x44\x0a\x16\xd6\x20\x6c\x11\x11\x82\xa8\x4d\x84\x35\x08\x1b\x51\x84\x20\x68\x46\x61\x05\xa2\x66\x7f\xcc\x37\xa1\x78\x03\x9b\xd5\x65\xa3\x3b\x25\x26\x20\x1b\xe0\x0b\xfe\xae\x56\x53\x2d\x5d\x0d\x5c\x61\x97\x46\x4c\xff\xb9\xbb\x53\x6d\x7a\x10\x46\x05\x02\xe8\x2d\xec\x4d\xb5\x55\xb2\x8d\xbd\xa9\xd6\x3a\xfe\x11\xbb\x53\xad\x52\x48\xb6\xa7\xda\x70\x85\x1e\x8e\x5f\xd3\xe3\xe6\xd4\x3a\x9b\x53\xf8\xd8\x07\xe7\xde\xe8\x19\x9e\xea\xe1\x98\xbf\xd8\x09\x5f\xdb\xec\xbd\xa1\xa9\x44\xf0\x71\xd1\xf1\x1f\xb0\xe8\x08\xde\x86\x9a\xa4\x37\x70\xc9\xb8\xfa\x6d\x08\x9f\x5e\x82\x1f\xb3\x60\x16\xa5\xd8\x8f\x58\xe1\x7d\xcd\x0c\x49\xa9\x17\x07\x93\x30\xe6\xd2\xab\x8a\x6a\xaa\xc4\x07\x06\x90\x5a\x0b\xc5\xcd\x27\x4a\x2e\xc2\x2c\x2a\x18\x85\x90\xaf\x49\x51\x8c\x45\xc9\x72\x55\xfc\x4f\x71\xbb\x0c\xff\xab\xfa\xfe\xef\xa7\xa0\xa6\xf1\x78\x12\xce\xd3\x2c\x1c\xa8\x23\x04\xf3\xa2\x9c\xf1\xf0\xa4\xec\x52\x8f\x2a\x1e\xa8\xee\x7e\x9a\x26\x45\x98\x14\xa8\xab\x37\x6a\xc4\x30\xc1\x47\xa6\x3a\x05\x50\x24\x10\xd3\x14\x6a\xb4\x95\x30\x78\x42\xb4\x2a\x7c\x8c\x9e\x30\x7b\x4a\xd9\x95\x22\xc2\x5f\xcd\x82\x45\x67\xcc\x3a\x48\x51\x6d\x2d\x11\xaf\xdd\xf0\x38\x2c\x77\x25\x50\xad\xad\x0a\x97\xd4\x9a\x95\x86\x8e\xbd\xf7\x1e\xdf\x83\xc0\x31\xe1\x78\x53\x27\x24\xed\xda\x94\x9d\xd1\x05\x0d\xbb\x06\x1d\xa6\x99\x35\xfc\x3e\xf1\x7a\x92\x28\x62\xca\x84\x50\x26\x21\xe6\xbf\x3a\xc1\xb8\x96\x08\xea\xc8\x32\x29\xba\x50\x11\x0b\x42\x27\xf2\x5d\x4b\xa0\xee\x44\x64\x82\xad\x43\x4d\x2c\x20\x9b\x61\x78\xb3\x0e\xb4\x25\x21\xd7\xa3\xd7\x6a\x90\xf5\xaa\xcf\x26\x86\xd9\x81\x88\x82\x81\x76\xa2\xd6\x2e\xe0\x86\x8e\x70\x1d\x32\x2a\x42\x6e\xd3\x31\x6e\x66\xa9\x1d\x29\xb4\x39\xca\x2d\xdb\xe7\xfa\x8e\xbf\x23\x05\x95\x46\x5b\x7f\x20\xc0\x46\xef\x0d\x86\xe7\x4d\xa8\xc8\x63\x99\x6d\x0c\xd6\x34\xb9\xce\x4d\xb7\x26\x01\x05\xc9\xb6\xd7\x70\xeb\x74\xb5\xf5\x69\x28\x88\xb6\x51\x77\xa3\x89\x6d\x32\xba\x6f\x4e\x4b\x41\xda\xad\x8c\xf5\x42\xbb\xdf\x8a\xdc\x5b\x1a\xf9\xb7\x43\x56\xd5\x9e\xd7\x8a\x03\x36\xa7\xa5\x6e\xdf\x9b\x45\x05\x22\xa2\xdb\x71\xc3\x5b\x8a\x11\xb6\x43\x56\xc9\x2d\x6f\xc5\xd0\x37\x0f\x1c\x36\xa6\xa8\xdc\xd0\x1b\x8f\x45\x9b\x47\x13\x1b\x53\x5c\x7b\x29\x01\xf7\x9c\x1b\x4d\xd8\xb6\x33\x51\xdb\xea\x50\xb5\x8d\x21\x6a\xab\x43\xd3\x6f\x68\xca\x6a\x1f\x7d\xbd\x89\xa9\x32\xb2\x74\x3a\xda\x81\x4a\xfb\xf8\xbb\x86\x3c\xeb\xd3\x50\x19\x6b\xbb\x4b\x27\x4e\x8e\x2f\x6d\x4a\xb4\x07\xbe\x56\x4b\x2a\xe3\xca\x1a\xb2\x03\x11\xf1\x64\xad\x3a\x76\xb1\x96\x18\xea\xc8\x32\x39\xba\x50\x69\x35\xc8\x35\x5a\x65\x6d\x12\x0a\xe6\xb8\x49\x1b\xd1\xb4\xd6\x69\xaa\xf5\x69\x28\x08\xb7\x46\xc3\x89\x53\x97\x4b\xfb\x1a\xd8\xd9\x5e\xcb\x44\x15\x31\x65\xf6\xa9\x4c\xa2\xb5\x05\x3b\x8b\xb1\x26\x01\x85\xb6\xeb\x2a\x94\xfc\xc0\x05\x71\x5e\x82\xd3\x7e\xd5\x95\x25\x15\xd9\xa5\xbb\xe8\x38\xe5\x75\xd7\xcc\x54\x59\xf9\x4b\xf1\x92\x42\x47\x9e\xe4\xab\x70\xea\xcc\xa9\x5d\x1a\xe8\xcc\x9c\xc2\x24\x64\xcb\x6d\xb9\x85\x0d\xc1\x5f\xdc\xb2\xdb\xdc\x7a\xfc\xc5\xed\xbc\xb5\x4d\x4e\xfe\x9d\x54\xdc\x4b\x4b\xf6\xc3\xe9\x26\x53\x06\xc5\x74\xd7\x01\xa7\x56\xd1\xdf\x8e\x25\xb5\x69\x02\xff\x2c\x87\xc6\xdf\x2f\xae\xcb\x34\xe1\xc2\x6f\x8b\xc4\xdd\x10\x79\xf2\x77\xa5\xc0\x36\x90\xc6\x5b\xdb\x55\xe1\x5b\x05\x47\xc8\xb2\x1a\xb2\x80\x5b\xce\xea\x86\x0a\xc3\x8a\x68\x42\x9e\x95\xf1\x05\x6c\x4b\xd6\x5d\x55\xd8\xef\x88\x2e\x14\xa3\x33\x1d\x81\x38\xd2\xc5\xd4\x4e\x86\xbf\xb1\x48\x6b\x50\x92\x9b\x16\x6f\x21\xa2\x83\x89\xa9\xa2\xb7\x99\x9a\x3a\x9d\x16\x71\xd6\x76\x4e\x9d\x09\xb4\x8a\xb4\x1d\x67\xb5\xae\xcd\x75\xc1\x95\x3a\xaf\xad\x59\xda\x3a\xae\xb7\x0b\x6e\x6b\x83\x6c\xe4\x8a\x1f\x47\xbd\xc7\x51\xef\x71\xd4\x7b\x1c\xf5\x1e\x47\xbd\xc7\x51\xef\x3f\x77\xd4\xeb\x38\x79\xd4\x04\x5b\x59\x1d\xfc\xdd\xa6\x7e\x6e\x53\x77\xfd\x77\x67\x7b\x9d\x16\xe1\xec\x48\x29\x39\x6c\x35\x34\xb1\x9b\x56\xc5\x17\x8d\x38\xff\x0c\xb6\xd5\x36\xef\xc8\x3a\xd8\x4d\x19\x15\xc9\xd4\xb0\x84\x82\xa9\xa2\x0b\x9a\x83\xb3\xd7\xa2\xc2\xb4\x22\x9a\x90\x6b\x65\x7c\x01\xdb\x8f\xaa\xfe\x65\xaa\x56\xdb\x4a\xe3\xf6\xae\xb5\x83\xc8\x6e\xe8\x6d\x9d\x7c\x6b\xc3\xfa\x9a\xbe\xaa\x23\x7a\x7b\xb4\xb5\x1d\x97\xfb\xd8\x3a\x7f\x8b\xd6\xe1\x8d\x2c\xf8\x4b\x5e\xe2\x91\x65\xdd\x06\xec\x86\xdd\xe2\xfe\xb6\xd6\x7c\xeb\xb9\xf0\x6e\xd8\xad\x8d\xb7\x1d\x97\xbe\x6e\xc3\x74\x44\x6f\x73\xf1\x5b\x6b\x9a\x35\x47\xaa\x8e\xe8\xad\x8d\xb3\x9d\x20\xe1\xb1\xd7\x3c\xf6\x9a\xc7\x5e\xb3\xdd\x78\x8f\x3e\xe5\xa3\x22\xa7\x0a\x8e\x50\x38\x35\x64\x41\x03\xfd\xbd\xb9\xed\x74\x02\x8a\xac\x87\x73\xdc\x83\x2f\x9b\xf4\x88\x47\x4d\xb3\xfb\x3a\x9c\x52\xf5\xaa\xa7\x62\x94\xf9\x90\xac\xe9\x29\x32\xa4\x76\xf6\xa5\x03\x43\xc2\x55\x4e\xc5\x06\xda\x54\xb1\x9b\xe9\x61\x9d\x53\x3a\x93\x2a\xd1\x4c\x9d\x09\x04\x9e\x10\x1a\xce\xe3\xf0\x86\x93\x70\x18\xc3\x00\x39\xa3\xaa\xa4\x34\xc2\x3c\x5c\x45\xba\x04\x79\x86\x87\x25\xeb\xab\x7c\x5c\x3f\xaf\x08\x53\x1f\xf3\xcb\x4a\x24\x50\xa9\x08\x8b\x2c\x14\x31\x35\x8e\x83\xbc\x18\x4e\x2f\xa2\x78\x26\xe5\x8f\xa0\x86\x32\xe9\x48\xea\x83\x10\x78\xa5\x5a\x93\x29\x7a\xac\xef\xd4\xf9\x9b\x83\x38\x3a\x4f\xc6\x45\xba\xdc\xa9\xb2\xf8\x8c\x2f\xa2\xd9\x2c\x4c\x68\x5c\x74\x8e\xa7\x4a\x61\x53\x25\x9f\xc6\x21\x58\x23\x98\xa7\xd3\x55\x3e\x90\xc0\x01\x2b\x01\xa7\xba\x00\xe8\xfd\xf0\x3a\x9c\x5c\x46\x05\x96\xbc\x06\x24\x08\xd9\xa1\x7f\xaf\x32\x37\x19\x3b\x45\xba\x1c\xeb\x3b\x18\x5b\x78\xb6\x6c\x22\xc9\xa1\xde\xd3\xcc\x52\x2b\xbd\x3f\x1c\x63\x3a\x09\x43\x41\x29\x99\x45\x07\x66\x38\x02\xcc\x55\xe3\xde\xa0\x22\xd0\x64\xe2\x81\xea\x2e\x69\xc0\x1f\xc8\x06\x42\xa9\x8d\x75\xfc\x5b\x5e\xdc\xc6\xe1\x38\x4f\xe3\x68\x46\xe5\xbf\xab\x99\x13\xa6\x85\x92\xf2\xa4\xda\x2a\xe3\xf1\x70\x91\x0f\x81\xfe\x3b\x34\x10\x86\x55\xf7\x46\x2a\xe3\x54\x93\xe6\x79\x3c\x8f\xb2\xca\xb8\x9f\xac\xd5\xd9\xf8\x64\x9b\x2e\xf3\x44\xd8\x45\xd4\x7b\xa3\x56\xa4\x69\x5c\x44\x4b\x96\x65\xe2\x8d\x96\xf5\xf9\x26\xe8\x63\xbc\x33\xe4\xd7\x13\x40\xc3\xb7\x01\xe4\x95\x09\xb3\x6e\xf2\x54\x2b\x4c\xa0\xd9\xa9\x0a\xe2\x75\xe3\xb6\x2a\xaa\x04\x97\x9d\x6a\xc0\x1f\x79\x6b\xab\xa0\x4e\xd1\xd9\xa9\x06\xe2\xed\x36\xc6\x02\x6b\x9f\x4a\x8e\x44\xb0\xb7\x4b\x72\xdf\xe3\xce\x61\xd0\xd3\x21\x82\x42\xde\xd9\x45\x98\xac\xe4\xaa\x6e\x07\x65\x32\x89\x0a\x21\xd9\xa4\xa6\x35\x68\x2d\x39\xc6\xf3\x5f\xcd\x8f\x75\x5a\xb8\xfb\x65\x9a\x47\x45\x94\x26\xe3\x2c\x8c\x83\x22\xba\x0a\x5b\x10\x30\xf5\xb2\x9d\x12\x20\xe0\x5f\xaa\x1e\xc4\x1d\x1b\xd1\x47\xae\xe6\x61\x19\x7c\x5a\x06\xe4\x55\xdb\xb0\xa7\xb7\x89\x82\xf1\xfc\xeb\x84\xa0\x3d\xe6\x53\xdc\xc9\x80\xc7\x14\x18\x77\xad\xe6\xff\xf8\xb8\x55\x0d\x94\xd8\xad\x98\xcd\xe4\x85\x09\x7a\x98\xe4\xfa\x0d\x42\x19\x41\x36\x8f\x3c\x34\xaf\xfd\xb5\xa0\xc8\x80\x7a\x5a\x15\xda\x0e\x8b\xa8\x88\x43\x62\x54\xdb\x29\xc2\x9b\x62\xd8\x3c\x8b\xc0\x88\x4f\xf3\x4e\xa4\xaa\xe3\x43\x82\xee\xc3\x49\x7c\xca\x80\x54\xd9\x4e\x85\xc3\x2c\xd5\x23\x05\x72\xc0\x58\xb9\xb9\xd1\x82\x22\x78\x5e\xa7\xac\x40\xb8\xe3\xff\x80\x5b\x0c\x23\x0a\x44\x53\x80\xc7\x94\x41\xa4\x86\x83\x60\x92\xa7\xf1\xaa\x08\x51\x2c\x07\x9f\xfc\xa8\x42\x3a\x1d\xc5\x73\x7a\x1d\xf3\xe9\x3f\xb5\x29\xcc\xaf\x98\x16\xa5\x13\xab\xaa\xd2\xf0\xc4\x65\x38\x40\x33\xbb\x82\x31\x6c\xcc\x66\xa5\xfc\x49\x6a\x13\x28\x73\xb2\x2a\x8a\xb4\xb2\xec\xf2\xeb\xfd\x55\x94\x47\x93\x28\x2e\x99\x00\x3f\xc6\xe1\x4f\x08\xa4\x4d\xe3\x34\x0f\x9b\x5c\x88\x54\x06\x42\x2c\x81\x68\x19\x69\xa2\x7e\x3d\xd6\x77\x04\xe1\xee\x4f\x44\x6f\x1e\xa7\x41\x31\x06\x83\x07\x96\xcb\xd2\xd0\xfc\xd2\x39\x00\xb3\x84\x0a\x04\x41\x62\xaf\x14\x2b\xc8\x7a\x9a\x99\x13\x89\x2a\x4d\x5d\x87\x76\x8c\x25\x08\xe5\x66\x51\x44\xf1\x27\x7a\x99\x9f\x0e\x3c\x01\x47\x28\xf5\xf1\x30\x49\xb3\x45\x10\x37\x8f\xef\x23\x86\x31\xbb\x46\xbf\x57\x46\x3c\x8f\xe2\xb8\x26\x0d\x7e\xe9\x46\xb9\x9a\x49\xc0\x5f\x50\x9e\x79\xf8\x0b\xca\x43\xdb\xcc\x08\xea\x85\x0c\xf6\xc9\x64\xa2\x2a\x48\xa5\x37\x89\x83\xe9\x25\x59\x0f\x2d\x47\xf5\xb5\xb9\x15\xd3\xb0\xc1\xc0\xa2\xaf\x14\x2c\xe4\x92\x01\xae\x3e\x93\x7a\x2a\x59\x97\x29\x49\xcc\xf9\x3d\x9a\x0f\x8c\x5f\x46\xe7\x17\x71\xd9\xbc\x3d\x30\xc7\x80\x19\xde\x77\xaa\xd2\xca\xee\xe0\x1c\x22\x8b\x12\x94\xb3\x96\x07\x3c\x4c\xe7\xf3\x3c\xac\x22\x9a\x9f\xe3\x2c\x4d\x8b\x7b\xc8\x14\x5a\xd3\x98\x96\x46\xc8\xcc\x54\xc8\x2c\xd9\x9e\xae\x3f\xd9\xe1\x60\x41\x05\x08\x90\x9b\x83\x7a\x08\x7a\x44\x53\x81\x6a\x01\x6e\x8f\x26\xc1\x32\x27\x44\xc5\xb2\x20\x8b\x08\xe0\x7c\x0a\xe9\x34\x36\x28\xad\x88\x01\xab\x16\x85\x2a\x04\xa9\x26\x1b\x0d\x2c\x97\x0a\x5a\xe0\xd1\x96\x52\xa8\xdd\xac\xe6\xcb\xc0\x04\xa2\x00\x30\xe8\xdf\x98\xb0\xe5\x3c\x4e\x27\x41\x4c\x94\x92\xaa\x04\x27\xe5\xaa\xfc\xc9\x8c\x02\x50\x4b\x38\x3a\x07\x09\x38\xbc\x8e\x16\x08\x6b\xe3\x4f\xb3\x89\x1a\x7d\x2e\x26\x57\xdd\x0a\x78\x82\xee\xd2\x66\xae\x38\xae\xa0\xd3\x28\x1a\x2c\xa0\xd4\xda\x71\x68\x00\x39\x8d\xca\x0e\x24\x54\x10\x88\x9c\x8e\xac\x27\xf2\xc1\x54\xe8\x29\x70\x47\x00\x92\x34\xab\xd3\x04\x42\xc3\xac\x00\x68\xcb\xac\xbe\xaf\x63\x9c\x75\xa5\x32\xfb\xac\x80\x18\x43\xab\x0a\x24\x36\xda\x8a\xbb\xa6\x9d\x52\xe8\x9b\x99\x6a\x45\x6c\x43\x6b\xe5\x90\x59\xd7\x60\x39\xa4\x36\xb5\x59\x21\xc9\xcd\xcc\xb6\xda\x74\x14\x9a\x6d\x05\x60\xd0\x16\x50\x15\x28\xd8\x2d\x33\x20\xd7\xb5\xca\xec\xb6\x02\x62\x6c\xaf\x2a\x90\xd8\x6d\x2b\xee\x9a\x76\x4b\xa1\x6f\x66\xb7\x15\xb1\x0d\xed\x96\x43\x66\x5d\xbb\xe5\x90\xda\xd4\x6e\x85\x24\x37\xb3\x5b\x74\x8c\x41\x68\xb6\xa8\x9c\xb1\x5a\xf4\x7d\x1d\x67\x5b\x55\x29\xb3\x59\x04\xc3\x18\x3c\xfa\x2e\xb1\xd8\x16\xcc\x35\xed\x95\xc4\xde\xcc\x5c\x11\xad\x0d\xad\x95\xa5\xb2\xae\xb1\xb2\x94\x36\xb5\x55\x11\xc5\xb5\x4d\xb5\x0e\x89\x95\x62\x56\x57\xe7\x44\xed\xe2\xc0\x55\x31\x68\x67\x03\x58\x30\xb7\xe7\x82\x09\x27\x07\x2d\x2d\x4b\x52\x11\xd9\xaa\x48\x26\x39\x19\x91\xd1\x76\xa4\xd6\x32\xfb\xe9\x24\xa0\xdc\x78\x25\xd3\xa5\x76\x7a\x02\x13\xde\x80\x43\xa1\x09\xb7\xce\xd7\x58\xda\x4c\xb4\x70\x91\xc7\x7f\x9a\xee\xa0\x67\xe8\x7a\x7f\xd0\xb3\xfc\xbe\x04\xa7\xd5\x04\xa5\xe3\x7a\x17\x15\x48\x43\x13\xc5\x6e\xa3\x32\x38\xaf\xc1\x52\x6b\xdf\x60\x79\x6f\x25\xd6\xda\x43\xba\xd0\xdc\xa2\x6d\xab\x47\x13\x6b\x28\xf2\x17\x59\xb8\x62\x5c\xe1\xf3\x5c\x35\x2f\x40\xe0\x1a\xba\x2c\x1a\xe8\xa2\x0b\x59\x30\xa3\x68\xe6\x0a\x83\x7a\x77\x86\x5a\x8d\x9c\x61\xbc\x8d\x54\xab\x89\xab\x53\xdc\xa2\x81\x2b\x47\x20\xdd\x55\xf8\x8b\xcc\x9b\xbb\x60\xc0\xb5\x51\xe5\xf5\x0c\x8f\xd7\x15\xa4\x4b\x0b\x5d\xd4\x21\x5d\x1d\x51\xb4\x71\x95\xf5\x81\x35\x58\x6a\xb5\x72\x96\xf7\x56\x62\xad\x76\xde\x85\xe6\x16\x2d\x5d\x7d\x41\x63\x0d\x45\xfe\x22\x5b\x5f\x06\x65\x47\x02\x9b\x5a\x2d\x6b\xe5\xd5\xf3\xc8\xfc\x58\x0a\xd2\x69\x0b\xde\x7d\xf0\xc0\x67\xf5\xae\xb0\x68\xd4\x6a\xa1\x55\x81\x8d\x00\x31\x7f\xee\x04\x92\x71\xa6\x85\x56\x33\xa1\x1c\xf4\xfe\x18\x8d\x8c\xb2\x9f\xfe\xac\xce\x93\x4e\xd3\xe4\x9e\x7c\x67\x0e\x9d\x87\x83\xbf\xa0\x03\x29\x60\x8f\x75\x88\x8e\x19\x10\x4f\xdd\x9b\x60\x37\xb4\x21\x36\xbc\xce\x82\xe5\x32\xcc\xee\xe7\x71\x78\x03\xce\xc9\x19\xf0\xa0\xdc\x0e\x38\x3a\x38\xcc\xc3\x78\x3e\xce\x8b\x20\xab\x9f\x61\x03\x84\xd0\xf9\x17\xc4\x89\x36\xc2\xa9\x16\xe1\x02\x52\x33\x7a\x46\x2f\x58\x15\xe9\x4e\xb5\x59\x0d\x4e\x74\x96\x7f\x81\x5a\xc7\x49\x5a\xfe\xb3\xb3\x88\x92\x21\x4e\xa8\x62\x18\x9e\xc7\x18\x6b\x16\x45\x1c\x3b\x74\x71\x4f\x82\xea\x38\x58\x4e\x31\x01\xea\x05\x87\x36\xa6\x69\xbc\x5a\x24\x3d\x54\x7d\x7d\xc8\x0f\x1e\xed\x83\x4f\x0b\xe2\x1c\xe3\x44\xff\xca\x97\x41\x7d\xda\xb7\xb4\x50\xfa\xd0\x2a\x7c\xc5\x0e\xd4\x75\x9e\xa5\xd7\x63\x03\xfe\x9c\x5f\x64\x51\x72\x59\xfd\x36\x09\xf2\x28\x1f\x8f\xfc\xfe\xce\x22\xb8\x41\xa7\x16\xe0\x6f\xf4\x61\x57\xb8\xb5\x0b\x4f\x71\x96\x8d\x8a\x78\xb9\xc7\xde\x42\x74\xe1\xb3\x8b\xe4\x93\x89\x70\x9f\x95\xd8\x07\x86\xba\x65\xce\x05\xc0\x63\x92\xd1\x5d\x89\x55\x1f\x84\xb9\xe1\x34\xd9\x2c\xca\xc2\x29\x44\x4d\xaf\x91\xd5\x01\xc5\x76\x3a\xdb\x02\x35\x87\xef\x11\x61\x27\x74\x30\x4b\x05\xad\x8e\x6f\xac\x57\x4f\x7d\x63\x9f\x68\xaa\xc4\x5c\xbd\x79\xeb\xbb\xda\x31\xe6\xbd\x2b\xca\x9d\x88\x62\xaf\x8a\xa2\xad\x7c\x68\xee\x3d\xde\x79\xce\xea\x3d\x73\xfe\xe2\x92\x60\x26\x8f\x3f\xc6\x0a\x40\x7a\x78\xff\x26\x29\x4b\x48\x36\x3e\x5a\x48\x10\x3a\x39\xec\xd4\x18\x7b\xaa\x45\x4d\x3d\xf8\xa0\xc9\x28\x68\x88\xd1\x68\xd7\x04\x9f\x14\x97\xf1\x41\xf5\x71\x9b\x4c\x73\x6b\x82\xa7\xe3\xf8\xb5\xe1\xc7\x9d\x7e\x95\xa4\xf0\xc8\x18\x3c\x06\x21\x2a\x46\x07\x23\x44\xc5\xd5\x6b\xf2\x62\x21\xa8\x0a\x78\x10\x64\x1d\x3c\x88\xfa\x65\x60\x5c\x1f\xf6\x5c\xd7\x3d\x5d\x5d\x25\x78\xbc\x34\xe8\x21\x74\x89\x66\x14\x64\xe3\x3e\x8f\xaf\x3b\xf5\xfb\xf8\xb0\x0e\xee\xfb\xf8\x0d\x54\x77\x9e\xab\x27\xf2\x39\x9c\x4b\xda\x53\xd2\x96\x2d\xb2\xca\xdb\x50\xde\x7e\x95\x8e\xc8\x46\x5b\xb7\xb5\x76\x08\x32\xb5\x06\xe0\xe1\x26\xb5\x0e\x4a\xc7\x9a\x98\x67\x69\xce\x1e\x88\x56\x71\x05\x4b\x7a\x83\x9e\xf1\x84\x64\xa6\x47\xdd\xd3\xe9\xf1\xcf\x2f\x95\xbc\x52\xe7\x72\x94\x58\x25\x2b\xa3\xda\x87\x38\xd2\x44\x7c\xeb\xda\x16\xfc\x10\x1e\x6b\x8e\xee\x1a\x23\x02\x71\x4c\x6f\x5a\x03\x7e\xff\x7f\xcd\x18\x8c\x09\xbd\xf5\xe1\x98\x43\xfb\x1f\x37\x32\x0b\x65\x18\x70\xca\x7f\xc1\x78\x2d\xac\x1f\x1b\xba\x65\x3c\xfc\x9a\x51\x5c\xca\x15\xe1\x0b\xe4\x90\xb8\x87\x90\x43\x12\xc3\x43\x9b\xc0\x62\x0e\xda\x06\xff\x56\xe0\x5f\x1f\x07\x6c\x53\x0f\x7f\x87\xe8\x40\x28\x8f\x9a\x9d\xa8\xd9\x88\xba\x5e\x94\x6d\x43\xd9\x2e\x7e\x43\x7c\x41\x54\xff\x37\x0a\x35\x58\xbe\xe8\xa8\x83\x07\xb1\xd5\x00\x84\xad\x40\xdc\xc2\x6c\x58\xc2\x29\xfe\xfb\x47\x28\x68\x25\x92\x08\x52\x66\xf3\xb9\x3e\xd3\x65\x41\x0a\xbd\x44\x3e\xe8\x21\x24\x85\x38\x85\x5d\xc7\xed\x14\xaa\xa0\xdc\x6f\x52\xff\xc8\x5b\xeb\x1f\xf4\x10\x2a\x5f\x01\xbc\x80\x85\x48\x33\x27\xaa\x83\x30\x27\x95\x1a\xb6\x11\xb6\xf0\x16\xe2\xd7\x8f\x5c\xe4\xd4\x14\x84\x19\xf0\x41\xb6\x2c\x96\x02\x23\x6c\x20\x23\x62\x66\x9d\x58\x66\x2b\xec\xf1\x3c\x8a\x18\x98\xe3\x5f\xc4\xc0\xbc\x71\x4b\x26\xbf\x94\x15\xc5\xe8\x46\x0a\xbf\x76\x80\x23\xd9\x1b\x12\xc5\x38\x5b\x54\xcb\x2f\x89\x74\x94\x44\xe2\x05\x3b\x5c\xc1\x94\xad\x48\xd9\x82\x3a\xa9\xa9\x8b\xe5\x74\xb1\x9a\x2e\x03\xa6\x92\x42\x65\x11\x50\xcd\x84\x62\x10\x24\xda\x4c\xed\x14\x07\x89\x77\x28\x85\x63\xb3\x3c\x1a\xa2\x81\x14\x03\xa2\x76\x61\x64\xbc\x48\xdb\x5f\x18\x19\x51\x10\x6b\xb4\xf5\x16\xe2\xa3\xb6\xad\x57\xb6\x19\xd0\xd6\x24\x11\x22\xcd\xe7\x73\x7b\xea\xc9\x42\x24\xfa\xc0\xd8\xa0\x87\x90\x6a\x9b\xb4\x2c\x4b\x20\x2e\x7b\x6a\xa9\x8c\x2d\xc0\xff\x54\x42\xa4\x60\xe6\xb9\x6d\x21\x12\xef\x6c\xda\xa0\x87\x50\xf9\x0a\xe0\x85\x48\xb6\x53\xfe\x69\x11\x83\xb0\x2e\x88\x21\xaf\x61\x1b\x21\x12\xef\xd8\xd9\xfa\x21\x92\x9c\x9a\x82\x30\x03\x3e\xc8\x96\xc5\x52\x60\x84\x0d\x91\x44\xcc\xac\x13\x22\x6d\x85\x3d\x9e\x77\x11\x03\x73\x1c\x8d\x18\x98\x37\xc8\xc9\xe4\x97\xb2\xa2\x18\x22\x49\xe1\xd7\x0e\x91\x24\x27\x21\x45\x21\xd2\x16\xd5\xf2\x4b\x42\x24\x25\x91\x78\x21\x12\x57\x30\x65\x2b\x52\xb6\xa0\x4e\x6a\xea\x62\x39\x5d\xac\xa6\xcb\xb0\xa9\xa4\x50\x59\x88\x54\x33\xa1\x18\x22\x89\x8e\x0e\x77\x0a\x91\xc4\xe7\x71\x85\x63\xb3\x3c\x44\xa2\x81\x14\x43\xa4\x76\x61\x64\xbc\x48\xdb\x5f\x18\x22\x51\x10\x6b\xb4\xf5\x16\x42\xa4\xb6\x83\xc6\x6c\x33\xc0\x13\x57\x64\x84\x14\xce\x66\x33\x69\x84\x44\x1d\x38\x2e\x03\x24\x80\xa3\xb0\x86\xc4\x9c\x79\xed\xb4\x84\x04\x8f\x84\xc9\xdd\x2b\xe7\x44\x33\x73\x98\x8c\x10\x9e\x17\x1d\xa1\x8a\xa4\x35\x10\x76\xa5\x40\x7f\x1b\xb1\x11\xe7\xb0\xf2\xfa\xa1\x91\x94\x58\xbb\x24\x03\x2e\xc4\x76\x45\x6a\xe7\x82\x8d\x8a\x04\x9c\xac\x13\x14\x6d\x81\x37\x9e\x37\x11\xc2\x72\xfc\x8a\x10\x96\x37\xa4\x49\x44\x97\xf1\xa1\x18\x0e\xc9\xc0\xd7\x8e\x86\xc4\x67\xe6\x45\xc1\xd0\xd6\x34\xf2\x4b\x42\x21\x15\x79\x78\x91\x10\x4f\x2a\x55\xdb\x51\xb5\x9b\x2e\x1a\xea\x60\x2f\x1d\x6c\xa5\xcb\xb8\xa8\xa2\x49\x59\x08\x54\xb1\xa0\x18\x01\x09\x6e\x95\x74\x0a\x80\x84\xd7\x35\x44\x03\xaf\x3c\xfc\xa1\x60\x14\xa3\x9f\x56\x41\x24\x8c\xc8\x5a\x5d\x18\xfa\x90\x00\xdd\x5b\x78\x0b\x81\x4f\xcb\x0d\x14\xe2\x5c\x14\x1a\xed\xe1\xd3\xdc\x95\x4e\x89\x93\xc2\x28\xad\xe9\x88\xc9\x73\x88\x1f\xc8\xe6\x13\x7a\x8a\xbe\x82\x03\xd2\xd5\xb1\x71\x98\xf7\x4b\x19\x6f\x3c\x9e\x84\xf3\x34\x2b\x75\x98\x14\x61\x52\xa5\x98\x23\xb0\x51\x30\xd1\x9c\x5d\x07\xe7\x91\xc1\x95\x00\x70\x12\x3a\x44\x47\xcc\xdb\xce\xc4\x72\x4e\x94\x43\x51\x87\x20\x55\x52\x1b\x3a\x3c\xf2\x2e\xe9\x5b\x4d\xff\xaf\xef\x34\x60\x3d\x0a\x3b\xcb\xed\x81\xa3\xdc\x44\xfe\x32\x53\x78\xba\x9b\x7f\xe4\x50\x90\xc0\x92\xcc\xa0\xcc\x41\x14\x9e\xb4\x05\x3c\xcf\xc2\x69\x9a\x05\xa0\x82\x55\x32\x0b\x33\x98\x74\x8e\x43\xa6\x87\x32\xa6\xd1\x2e\xaf\x64\xab\x1c\x6f\x9e\xdc\x53\xc9\xd2\xa8\x54\x6a\xeb\x6a\xf1\xa7\x80\x7d\xac\x62\xee\x49\x7d\x41\xea\x36\xea\x30\x23\x71\xc7\x82\xc8\x02\x58\xa7\x26\x86\x59\xdb\xb0\x5b\x14\x36\x48\xb2\x05\xc8\x19\xba\x5e\xdf\x9e\x40\xed\x60\xe2\xed\xa0\x76\x48\x91\xb8\xc7\x61\xe0\xf7\x2f\x50\x96\xbb\xfa\x2a\x08\xca\x79\x87\x93\xf9\xff\xb0\x0e\xf7\x17\xd5\x7d\x28\xd6\xdc\x2e\xc8\xe4\xaf\xc2\x8e\x84\x13\x6d\x6e\x7f\x35\xc9\x55\xeb\x94\x79\xe4\xbd\x01\xbd\x4e\x5b\x3d\xbc\x45\x97\x0d\xb0\x39\x1a\x7a\xd9\x8e\x3f\x47\xe3\xdf\xe0\x07\x07\xf3\x4a\x2c\x3c\x07\x39\xeb\x98\x45\x57\xd4\xeb\xfb\x46\x94\x9d\x70\x12\xbf\x63\xf3\x28\x85\x2a\xf0\x11\x0a\x56\x21\xa4\xac\x3e\x83\x52\xa8\x97\x0c\xea\x09\xe1\x86\x18\x15\x51\xf0\xda\x4e\xac\x45\x0c\x4e\xe2\xfc\xed\x0a\xd3\x52\x3f\x36\x71\x92\xf0\xc0\x99\x35\xfd\x52\xad\x30\x53\x15\x29\x20\x1e\x8c\x48\x01\x89\xc0\xb7\x45\x5c\x61\xf5\x6d\xd3\xa4\x36\x58\xee\x1c\xa9\xb3\x36\xc9\x40\x58\x5d\xa9\x9d\x54\xd0\x36\x35\x9a\xcf\xe7\xea\xf3\x22\x65\x31\x88\x79\x91\x48\x18\x25\xeb\x50\xb2\x0c\x65\x95\xa8\x5a\x84\xaa\x35\x50\x31\xb2\x7a\xff\xe6\x29\x8d\x78\x51\x82\xa9\x99\x98\xfc\x28\x54\xc4\xce\x1a\x50\x2d\x55\xe4\xad\xf9\xbc\x20\xbc\x2d\xd7\xc8\xa0\xa7\x6b\x3e\xcf\x4c\xb9\xe3\x3f\x07\x80\x9c\xfb\x94\x82\xd0\x73\x1f\x35\x39\x44\x2c\x08\x9b\x98\x9d\xf5\xb0\xa5\x9d\x9b\x53\x34\xe3\xa1\x74\xcd\x9d\xef\xa8\x25\x4d\xc1\x66\x3c\x0d\xbf\x5a\x83\x78\xff\x77\x8f\x26\x30\x5e\x7f\x5d\x60\xc1\xa9\xe4\x1f\x1e\x63\x08\x25\x62\x8c\x97\x80\xfc\xc5\x91\x87\x90\x2b\x6e\x10\x22\xe3\xec\xd7\xc7\x23\x52\x5e\x05\x6e\x42\x8e\xc3\x77\x1e\x72\x1c\xc1\xd0\xd4\xa6\x1a\x15\xfe\xd4\xc3\x98\x56\xb4\xdf\x18\xd1\xfc\x1a\x75\xfd\xad\xe2\x1c\xa1\x88\x5d\xad\xae\xab\xc5\xad\xa3\xbe\x35\x2c\x6d\x0d\x2b\xfb\x6d\x91\x12\xc1\xc4\xdf\x3b\x68\x62\x59\x15\xc7\x4f\x3c\xd8\x5f\x16\x4a\xb1\x95\xa9\x18\x89\x2c\xc0\xe2\x00\xfe\xc3\x62\x2d\xce\xfe\x3a\x7a\x19\xb2\x25\xda\x62\xf7\xd8\x21\x9e\x62\xbc\xc5\xd9\x67\x57\x8c\xb8\xc4\x9b\xe2\x4a\x35\xaa\xdb\xc9\xba\xbb\xe3\x4a\x6c\x6c\x2b\xf2\x92\x90\xeb\x22\x97\xc8\xb2\x5b\x76\xcd\xd7\x16\xb5\x0b\x6f\xb2\x18\x4c\x7d\x2f\xfd\x77\x6a\xb3\x3d\xd2\x51\xda\x61\x57\xc7\x92\x8f\x8f\xaa\xbb\xee\x9d\x10\x95\x18\xdd\x6e\x4c\x26\xdb\x70\x5d\xb3\x91\xd6\x57\xdc\xaf\x89\xcc\xda\x45\x94\xc7\x66\xad\xbb\xf4\x6a\x18\x9d\xad\x70\x3d\x45\xae\x65\x7d\x6b\x59\x5e\xa7\x61\xb9\xbd\x11\x14\x22\x35\xee\xee\xbe\x52\xbd\x9b\x46\x6b\x92\x4d\x7e\x59\xbc\x26\xdd\xf0\x6f\x83\xee\x10\xb3\xb5\x48\xa9\xc4\x9e\x9a\xe1\x28\x44\x6e\xb2\xa3\x01\x5d\x1b\x6b\xfd\xe8\x4d\xfd\x74\x00\x23\x00\xef\x0a\xc9\xd4\x74\xec\xf6\x00\x8e\x73\x8d\x04\x22\x2a\x46\x70\xbc\xab\x24\x8a\x21\x9c\xe4\xda\x87\x5a\x9d\xea\x66\xb3\xf6\xfd\x0f\x35\x46\xb6\x15\xc6\xc9\xe8\x75\x12\x4d\x64\xe8\x6d\xf7\x42\xd6\x17\xb7\x13\x7b\xb2\x58\xae\xc3\x6d\x91\xdf\xab\xd3\xf6\x40\x49\xed\x0e\x49\x07\x34\xf9\x70\xaa\x7c\xaf\xa4\x1b\xa6\x1a\xaf\xdb\x8d\xe9\xa4\x17\x09\xd6\x6d\xab\x0d\xb4\xf7\x6b\xc2\x3a\x05\x29\xe5\x71\x5d\xfb\x3d\x14\x45\x94\xee\xf6\xb8\xa6\x36\xd7\xb3\xc3\xf5\x6c\xb0\xd3\xc0\xad\xd0\x16\x0a\xe1\x1d\xff\xfe\x8a\x5a\xcd\x9b\x06\x78\xb2\x6b\x2c\xb2\x08\x4f\x7e\xa5\xa5\x15\xbc\x43\x8c\xd7\x26\xa9\x1a\x87\x8a\x26\xa4\x10\xe6\x49\x2f\xbf\x74\x6e\xb4\xf5\x03\xbd\x0e\xf7\x5f\x18\x19\x78\xf9\x54\xac\xa9\xef\xb4\x47\x7a\x9c\x9c\x2a\x10\x51\x31\xd2\xe3\xe5\x55\x51\x8c\xf4\x24\x39\x50\xd4\xea\x54\xb7\x9d\xb5\x93\xa1\xa8\x31\xb2\xad\x48\x4f\x46\xaf\x93\x68\x22\x5b\x6f\x4b\x92\xb2\xbe\xb8\x9d\xd8\x93\x45\x7a\x1d\x52\xa7\xfc\x5e\x9d\xb6\x07\x50\x6a\x09\x55\x3a\xa0\xc9\x47\x57\xe5\x24\x2b\xdd\x30\xd5\x78\xdd\x6e\xa4\x27\xcd\xaa\xb1\x6e\x5b\x6d\xa0\xbd\x5f\x13\xe9\x29\x48\x29\x8f\xf4\xda\x93\xb2\x28\xa2\x74\xb7\xc7\x35\xb5\xb9\x9e\x1d\xae\x67\x83\x9d\x86\x6e\x85\xb6\x50\x88\xf4\xf8\xc9\x5c\xd4\x6a\xde\x34\xd2\x93\xe5\x74\x91\x45\x7a\xf2\xfc\x2e\xad\xe0\x1d\x22\xbd\x36\x49\xd5\x38\x54\x34\x21\x85\x48\x4f\x9a\x09\xa6\x73\xa3\xad\x1f\xe9\x75\x48\x06\xd3\xc8\x80\x5f\xbd\x69\xce\xfe\x37\x39\xf7\xab\x2f\xbc\xe7\x17\xb8\x44\xee\xbf\xaf\xf2\x22\x9a\xdf\x0e\xab\x9b\x3a\xd3\x10\x5c\xe5\x80\x0f\x48\x80\x6a\xaa\x4f\xd8\x53\x0f\x06\xf1\x14\x05\x97\x70\x0f\x0c\xd5\xd5\x1d\x01\x29\x28\xf1\x2e\x03\x03\x01\xee\x21\xa1\xab\x19\x06\x78\xf2\x4c\x7a\x6e\xbf\x7e\x13\x03\x7f\x8f\x00\xbf\x53\x81\xa3\xc1\x0e\x4b\xde\x02\xa9\x2e\x2d\x8c\x2f\xa2\xd9\x2c\x4c\xb6\x70\xe2\x93\x7c\xc3\x43\xc0\x8a\x34\x70\x6b\xbf\xd8\x83\x5d\xb0\x1a\xe6\x0b\xfc\x89\x09\x47\xf5\x89\x09\x1f\x63\x2c\x5f\x70\x2d\x0d\x69\xb2\x47\x4a\x41\x02\xdf\x73\x9e\x1a\xa1\x1e\x05\x31\x85\xc8\x0a\xcf\x83\x60\x08\x78\x73\xe3\xb5\xea\x3b\x2d\x32\x61\xad\x82\x5e\x5b\x31\xa5\x8f\xad\x90\x4c\x12\xf6\xda\x14\x01\x43\x15\x5e\xb6\x03\x80\xd0\xde\xc8\x2b\x3b\x3a\x7e\xef\xc8\x24\x2e\x06\x99\xfc\x1b\x65\x0c\x45\xc6\x16\xb1\x12\xb1\x11\xee\x50\xb7\xe5\x88\x57\x61\x0c\xec\x4a\x12\xcb\x05\x00\xfd\xf9\xdf\x8b\x70\x16\x05\xbd\x7c\x9a\x85\x61\xd2\x0b\x92\x59\xef\xcf\xe6\x49\x14\xcf\xf5\x97\x37\x4f\xee\x21\x43\x84\x7d\x34\x6f\xc8\x70\xae\xf7\xb1\x4a\xd4\xf1\x77\x56\xf4\xfe\x4e\xf3\x13\xfe\x1c\x4b\xed\x15\xb8\xd7\x0b\x8d\x52\xb9\xba\xde\x27\x9f\xc1\x81\xf7\xae\x88\x2b\x8e\x84\x82\x73\xf8\xd8\x8f\x92\x27\x21\x2b\xc5\x6d\xcb\x44\x9d\xa5\x42\x82\x6e\xa5\xbe\xd0\x06\x3b\xee\x34\xc8\x66\x88\x48\xe5\x33\x81\xf1\xf4\xf4\x9f\xda\x22\x9d\x05\x55\x0d\x4f\xe1\x6f\xc3\x8b\x30\x98\x95\x43\x9c\xb8\x6c\x38\x0c\xc0\xf8\x12\x4d\xe2\x90\x90\x00\xbb\xcc\x95\x57\xcd\xc2\x1e\xa7\x86\x39\xd9\x15\x8e\x53\x93\xef\x21\x31\xb9\xd3\xab\x2a\x38\xa7\x88\xaa\x54\x18\x4a\xa7\x88\x98\x6a\xc8\x74\x15\x39\xb9\x8c\x43\xd4\x03\x1f\x74\x52\xdd\xec\x62\x2a\x42\xef\x41\x51\x15\xf1\xd6\x5a\x4c\xc7\x31\x45\x15\x01\x6a\xf5\x98\x0f\x9f\x87\x82\xf0\x4f\x28\x6b\x53\x8a\x44\xe8\x57\xb6\xea\xd8\x43\xf1\x6d\xa1\x79\x9c\x06\x05\x78\x94\x88\x1c\xd6\x7d\xea\xd9\x22\x34\xf4\xa3\x2e\xcd\xe9\x1c\x43\x78\x65\xf4\x7e\x78\x1d\x4e\x2e\x23\xd0\x25\xc2\x20\x0b\x12\x70\x7d\x37\x09\x77\x86\x8b\xf4\x8e\xf3\x31\x67\xbf\xa5\xcc\xa7\xfa\x82\x61\x35\xfa\x48\xae\x1a\x62\x33\x30\x80\x4b\x5f\x54\xdd\x48\xa9\xe4\x35\xd7\x9f\xe8\x96\x2c\x4f\x0d\x14\x24\x0f\x86\x76\xd6\x74\x69\xe5\xb0\x37\x62\x99\xaa\xb9\x0c\xee\xb2\x34\xbe\x27\x1e\x86\x62\x1e\x6c\x12\xde\xbd\x86\x64\x86\x65\xfc\x41\xb8\x36\xe2\x11\x33\xcb\xd2\x2c\xab\x4f\x62\xac\x96\xa4\x2f\x6f\x43\x80\xa2\xdc\x13\xe5\xe3\x2c\x4d\x8b\x7b\xd4\x8b\x82\x6c\x26\x7e\x7b\xad\x7e\x59\xae\x7a\xbc\x0d\x80\xcf\xa2\xab\x48\xfc\x74\x78\x85\x63\xe9\x24\x56\x11\x15\x31\xfb\x22\xe0\x85\x0d\x3f\x71\x40\x41\xc7\xbb\x86\xfd\x88\x40\xc0\x0a\x08\x34\x64\xc1\x50\xd6\x06\xe3\x3c\x4e\x27\x41\x8c\x4a\x41\x21\x0f\x8b\x79\x9a\x8b\x40\x83\xa5\x3c\xbc\x6e\x4a\x68\x3a\x15\x8b\x48\x13\x25\x10\xa7\x71\x34\xbd\x0c\x26\x71\x28\xaf\x17\x4d\xbb\x1d\xaa\x5a\x1c\x5b\xce\x00\xbf\x9e\x27\x70\x3c\xa5\x16\x6e\x8c\x66\xe1\x66\x16\x96\x7f\x76\x44\xe5\x8c\x94\x24\x13\x4f\xba\x3d\x9a\xc6\x36\x1b\xf6\x68\x1a\x61\x04\x28\x02\x13\x18\x06\x63\x34\x25\x19\x9d\x20\x93\x17\xb7\x71\x38\xe6\xa5\x9d\xaa\x25\xe6\xb7\x06\xdd\x98\x83\x4a\x47\x48\x95\x5a\xad\x68\x38\xb7\x16\xab\xd6\xf0\x46\x93\x99\xa5\xaa\x5a\x71\x4b\xff\x3e\xd5\xd4\x1c\x8b\x55\xc3\x37\xb3\x41\x25\x2d\x3d\x40\xec\xf0\x26\x67\x3b\x45\x16\x24\xf9\x3c\xcd\x16\x63\xf0\x53\x1c\x14\xe1\xe9\x9f\x30\x47\xc5\x13\x58\x08\xdf\xf6\x83\x55\xf4\x34\x33\xef\x85\x41\x1e\x0e\x6a\xbc\xfa\x13\x6c\x13\x98\x03\xa1\xa7\xe1\x4e\x6e\x80\x02\xc9\xc6\x2f\x91\x5f\xc2\x9b\x82\xf8\x00\x02\x78\x48\xa8\xfa\x1e\x47\x79\x81\xff\x3c\x5c\x25\x40\x77\x33\x3c\x88\xd4\xe9\x19\x1d\x0c\x2a\x45\x6c\x61\xb3\x3a\x96\x43\x61\x61\x78\x53\x88\xca\x30\xbe\x39\x20\x25\xdb\x82\xcf\xb5\x34\xd2\x89\x26\x34\xf9\xb2\xa2\x68\x71\xfe\x57\xb4\x38\x87\x24\xfe\xaa\xbf\x8d\xe7\x51\x56\xa1\x63\x94\x1a\xd0\x0a\xf1\x9e\x9b\x6f\x02\x66\x3a\x81\x93\xab\x72\x56\xd2\x4c\x70\xe0\xf2\x06\xf0\x5e\xec\x63\x8f\x24\xad\x26\xc2\x21\x16\xd9\xe9\xaf\x74\x2f\x39\xa7\x62\x1b\x82\x8d\xba\x81\xab\x79\x10\xd4\xdc\xa4\x48\x86\x71\x94\x5c\xde\x97\xb1\x22\x44\xc0\x82\x32\xda\x45\xa0\xc8\x25\x4a\x2e\xc2\x2c\x2a\x7e\x22\xd5\x35\x76\xf5\x17\x65\x57\xf5\xda\x82\x0b\x96\x16\x46\x58\xc5\x00\xb0\x14\x67\x49\x65\xa2\xa1\xec\x4f\xdf\x01\x90\xb0\x93\xe3\x33\xaa\x86\x00\xb1\x36\x81\xd7\xc5\xa4\x70\xd9\x92\x62\xeb\xf7\x38\x4b\x0e\xb9\x6e\x8c\x28\xea\xe4\xcd\x10\x26\xc7\xa9\xa1\x12\xae\xdb\x27\xca\xd4\xbc\xff\x7f\xe7\xab\xe5\x32\xcd\x8a\xbc\xf7\x67\x19\xb4\x47\x8b\x10\x4d\x0c\x4a\x13\x7e\x72\x8f\xb4\x5c\x2d\x4e\xfd\xc5\x2c\xc6\x8f\x83\x79\x11\x66\xfc\xec\x2d\xc4\x8a\x84\x0b\xa7\xc8\x80\x97\x6a\x72\xdb\xb8\x13\xf4\xf3\x3c\x4d\x8b\x66\xa9\x87\x35\x18\x12\x13\x78\x97\xe6\x01\x30\x36\x85\x13\x1d\xe8\x0d\x7a\x93\x38\x98\x5e\xa2\x49\x14\x8a\xe5\xca\x19\x1d\x3f\xb6\xe3\x07\x7f\x83\x5e\x39\xa7\xc3\x8d\x6a\x24\x49\x02\x54\x7b\xba\x7b\xca\x0a\x7f\x72\x7d\x0d\x70\x29\xec\xd4\x07\xfc\x5e\xa4\x4b\xd0\x39\xf8\x61\x09\x5d\xda\x2d\x3e\x29\xb1\x41\x04\x2f\x26\x4e\x14\xab\x51\xc7\x64\x24\x7d\xa8\x48\x44\x64\xc0\x62\x29\x39\x00\xdd\x04\x45\x04\x24\xb2\xf2\x20\xba\x88\xbb\xee\xb8\x72\xbf\xb5\xa0\x93\x1c\xa7\xc1\x26\x3c\xf5\xa1\x76\xf8\x03\x76\x48\xc7\x3e\xc3\xee\x88\x93\xc0\xbe\xd0\x34\xaa\xa2\x9a\x48\xbd\x37\xd0\x83\xfd\x58\xef\xe9\x0c\x67\xd0\x75\x0b\x6a\xc0\x0a\xb1\x7d\x06\x81\x07\xb9\xff\x8f\x70\xc7\xb8\x74\x4c\x84\xc3\xc4\x43\xa4\xcc\xd8\xb8\x58\xc5\x65\x54\x74\xf2\xcf\x52\x11\x31\xaf\x67\x74\xc4\x89\x42\xa9\x15\x7f\x36\x37\xde\x10\xcf\x9d\x57\x0e\x70\x84\xbe\x9f\x72\x22\x6d\x58\xcd\x53\xbe\x52\x31\x7d\x63\xf1\xea\x3d\xf9\x3a\x39\x5d\x4c\x04\xb8\xd1\x22\x38\x0f\xc5\x8f\x94\x37\x59\xf3\x50\x5c\x69\x61\x8b\x2b\x50\xba\x9b\x21\x5e\xd4\xc4\x99\x56\x33\xc4\x88\x2a\x9f\x85\xf9\x34\x8b\x96\x65\x08\x7a\x2f\x7b\x50\x1c\x3e\xc8\x5e\x2f\xd6\x81\x69\x1e\x3e\x1f\x10\xd1\x87\xc3\x33\x4f\x38\x0e\x22\xdc\x71\x91\xd3\x13\x3d\xe8\xce\x92\xd3\xae\xb3\x60\x79\xcf\x95\x43\x00\x2c\xd4\x0c\xb9\x58\x4f\x3b\x31\x3c\xec\xc5\xbf\xb0\xc1\xaf\xce\xdd\x4d\xa9\xc3\x6d\xc7\x73\xc1\x6e\x0a\x9c\x8e\x02\x4e\xf3\x7b\xf8\xef\x70\x9a\xae\x92\x62\x0c\xde\xf3\x28\x7f\x3d\x0f\xd0\x22\xff\xce\x24\x0b\x83\xcb\x61\x94\xe4\xd1\x2c\x1c\x07\x57\x69\x34\xab\x60\xc0\x66\xfd\x24\x88\x83\x64\x1a\xee\x54\x4b\xb7\xcb\x30\xcb\x97\x21\xd8\x0e\x1f\x1b\x3f\x89\xaa\x88\x5f\x86\x26\x59\xb3\x29\x83\xb5\x49\x58\x9b\x84\x85\x6a\x95\x85\x87\xd5\x1e\x1a\x85\x55\xcf\x35\x2a\xe6\xcb\xf0\x7c\x1e\x4c\xc3\xe1\x55\x94\x47\x93\x28\x8e\x8a\x5b\xb4\x81\xbb\x23\x2e\xfa\xa9\x18\xdf\x4e\x2f\xc2\xe9\xe5\x24\xbd\x29\x87\x9a\x5e\x1c\x4c\xc2\x78\x40\x95\x0c\x21\xeb\x2c\x40\x39\xf8\xa6\x82\xcf\x0c\x12\xdf\x7c\x89\x15\xd0\x3a\xc0\x46\x67\x55\x9a\xa5\x5f\xe1\xaa\x9e\xa1\x37\xeb\x6b\x35\xba\xfa\x22\x6a\x83\xa2\xb2\x84\x68\x73\xea\x52\x5b\x81\x35\x25\x98\x9d\xd7\x4a\x6b\x0a\x60\x20\x54\x63\xdd\xe1\xab\x09\x3b\xe1\xc1\x56\x8d\x15\x32\xb8\x79\x18\x87\xd8\x71\x43\x16\x99\x02\xe0\x28\xbc\x5e\x44\x6b\x70\x97\xe9\x12\xd4\xc9\x2e\x98\x51\xd8\x5c\xcb\x58\x1a\x02\x68\xb4\x69\x28\xd7\xd0\x88\xa3\x21\x84\x88\x4f\x91\x5c\x5d\xa7\xa1\xca\xc9\x77\x0b\x71\x8f\x43\x1c\xa0\xf1\x67\x5f\x4b\x83\x58\x59\xff\xd9\x4c\x3d\x17\x61\xb2\x42\x21\x23\xfb\x6d\x98\x87\xd3\x34\x99\x05\xd9\x2d\xb7\x34\x4a\xe6\x29\xb7\x20\x5d\x15\x65\x97\x94\x95\x0d\x97\x59\xb4\x10\x11\xae\x60\xe4\xd5\x57\x50\x68\x33\x52\x0a\x03\x37\x46\xe5\x95\xc1\xed\x46\x2e\x8c\x04\x5d\x26\x87\x8c\x33\x59\x75\x70\x26\x40\x15\x10\xed\x2c\x2e\x85\x26\x76\x4f\x1d\xcc\x81\xab\xac\xf5\xc7\x30\x8e\xa3\x65\x1e\xe5\xf8\xee\x65\x19\xe9\x35\x86\x21\x59\x51\x23\xc3\x05\xf1\x79\x70\x0a\x1e\x84\x43\x9c\x93\x52\x82\x33\x55\x6c\xfd\xf5\x0e\x27\xbb\xf5\x46\x6f\x3a\x8a\xb9\xfa\xeb\x7f\x63\xd3\x1f\x21\x54\xbd\xb1\xf8\x3f\xf9\x45\xb0\x0c\xff\xcf\x7f\x4d\x83\x2c\x2c\xfe\x3d\xe8\x80\x11\x24\xe7\x71\xf8\xef\x46\x8d\xc1\x24\x4f\xe3\x55\x11\xee\x10\x0b\x7e\xf5\xd9\x1b\x2c\xab\xad\x06\x4f\x4d\x48\xaa\x42\x7b\xa2\x1d\x98\xa3\x30\x36\x64\xae\xf4\x3c\xb3\xbc\xf6\xcc\x65\x43\x0c\xbd\xb1\xde\xc6\x38\x98\x7c\x92\xe7\x79\xd0\x1e\x27\x69\x9d\x2b\x78\xa0\x57\x4a\xa7\xd9\xfa\x6d\xb6\x0a\xe0\x1c\xa2\x05\xad\xab\xee\x88\xca\x3a\x62\x71\xb5\xde\xb5\x2e\xd4\x56\x44\x76\x61\x21\x05\x2c\x09\x74\x1d\x2c\x37\x4b\x06\x3b\x92\xf5\x3d\x71\xac\x54\xad\xf4\x29\x55\xdb\x5d\xc1\x38\x6e\x57\x35\x4b\xea\x6d\x55\xb6\xa4\x5e\x42\xe5\xb8\x9f\xe8\x9a\xf2\xbb\x3e\x81\xc1\xcf\xfd\xbd\x69\x3b\x00\xdf\xff\xd7\xff\xa6\x56\x26\x78\x27\x13\x08\x0c\x95\x19\x2a\xeb\x1a\xc0\x4e\x87\xae\xf7\x77\xaa\x4d\x85\x7a\xbe\xe5\x92\xd3\x65\xc3\x27\x37\x06\xe8\x2d\x01\x9e\xb0\xa2\x0d\x01\x95\x0d\x4d\x36\xb0\xed\xb2\xa3\x39\x9d\x4e\x45\xdb\x99\xdc\x60\x7e\xd0\x2b\x51\xa6\xd3\x69\xc7\x9d\x6d\xce\x99\x03\x62\x45\x95\xbd\x13\x81\x76\x82\xb3\xf3\x49\xf0\xa7\x61\xeb\x83\xea\x3f\xcd\x74\xa4\x08\x5c\x01\x2a\xe8\x41\x43\xaf\xd7\xfc\xa5\x97\x34\x9f\x10\x87\x5c\x0c\xec\xb8\x1f\xda\x3c\xd0\x77\xd8\xf9\xe2\xdd\x30\x4a\x66\xe1\xcd\xd8\xd0\x1d\x9d\x09\x2b\xe9\xa0\x04\xa9\x9c\xf7\x9e\x26\x37\xb6\xc6\x1e\xd3\xc4\x8f\x6a\xd5\xfb\x50\x58\x08\xcd\x8f\x7b\x25\x81\xf7\xa0\xe7\x96\x31\x34\xff\xc4\x17\xe5\x3b\xc9\xa3\xbf\xd8\x5a\xd8\x98\x95\xf9\x31\x94\xfe\x87\x85\xd2\x4a\xcf\x59\x34\x53\x32\xc9\x73\x16\xb8\x0d\xda\xed\x36\x49\xcf\xd7\x06\x3d\x5b\x6c\x91\x8a\x03\x8b\x78\x07\x1d\x37\xe1\x2a\xbe\x6b\x22\xea\x66\x5f\x1b\x8c\x37\xa2\x98\xaa\x51\x6c\x75\x6d\x44\x66\xe9\x12\x98\xd2\xde\x25\xc5\xc8\x90\xda\x21\x2a\x9b\x51\x80\x54\x61\x8b\xea\x07\x0a\x90\xd0\x9c\x55\xaa\x87\x46\x2a\x81\x6c\x25\xd5\x2e\x6b\x3b\xdf\xed\x6c\x94\x3d\x46\x50\x4c\x98\x6e\x75\xb8\x89\x39\x00\x10\xfa\xe5\x1f\xd9\x19\x00\xc1\x8a\xd1\xa0\x87\x70\xa5\x0f\x0b\xca\xfb\x24\xff\xaa\x07\x2b\xa6\x56\x5d\xce\x93\x19\xb0\x0c\xa8\xb4\x60\x59\x39\x6a\x77\x05\x90\xaa\x5d\x55\x40\x95\x58\xa3\xac\x58\x05\x14\xda\x9e\x12\x07\xd0\x80\x64\xa0\xed\xc4\x14\x24\x56\x60\x5e\x81\x95\xd2\x98\x45\xe5\x84\x21\x69\xd5\xfd\x55\x2c\x6c\x9d\xf9\xa1\x15\x8e\x5a\x22\x57\x6a\x5d\x72\xd0\x43\x68\x4f\xb6\x1a\xe4\xf7\x88\xeb\xb9\x52\xa7\xdb\x62\xb3\xb2\xf2\xca\xed\xaa\xdb\xac\x0a\xa8\x12\x6b\xb4\xe7\x55\xb6\x59\x25\x0e\x90\xd3\x6b\xb5\x59\x19\x84\x82\xc4\x0a\xcc\x2b\xb0\x02\x1c\xb0\x8a\xcd\x72\xee\x5c\x0b\x87\x6b\x74\x23\x54\x6a\x39\x62\x18\x60\x38\xe2\xe2\xca\x6e\x5a\x21\x6a\x25\xb6\x43\xaa\xb0\x45\x1b\x4d\x3b\x24\x6a\x66\x85\xea\x51\x3b\x89\x21\x5b\x49\xb5\xcb\xda\xce\x77\x3b\x1b\xc0\x5a\xf8\xc5\xa4\xb1\x00\x98\xfb\x6a\xbe\x56\x1f\x38\xe4\x0c\x8d\xb3\x28\x0f\x26\x71\x38\xe3\xd5\x37\x96\x15\x62\xc3\x93\x1a\x98\x9c\x1a\x18\x62\x5b\x21\xe4\x34\xaa\x61\x58\x05\x48\x89\x52\x3d\x76\x75\x01\x56\xa3\xac\xa8\x3d\xb6\x87\x28\x81\x57\x03\x6a\x17\x60\x35\xca\x68\xbc\xef\x00\xab\xa8\x0f\x34\xbe\x77\x01\x96\x53\x56\xe1\x54\x85\x43\x25\x1b\x50\x6a\x7b\xa5\x56\x51\x6a\x0d\x25\x6d\x29\x69\x09\x04\x4d\xad\x10\x62\x1a\x64\x60\xa5\x06\x56\x53\xab\x6e\x85\x25\x69\x31\x0c\xe2\x38\xbd\x0e\x67\x4d\x7a\x07\xbb\x3e\x7f\xb1\xca\xcb\x39\x32\x88\xbd\xe0\x8d\x01\xfa\x83\xd4\xb3\x89\xa7\x3f\xe3\x76\x10\x4e\x3f\x55\x9a\x0d\x2b\x00\x13\x1e\xaf\x6d\xfa\xac\x00\x47\x7b\x3f\x85\x29\xb7\x3a\x28\xd3\x0b\x3a\x4c\xd7\x3b\xa0\x74\xd2\xb6\xd8\x37\xaa\xcf\xfa\xbb\xd4\x43\xf7\x4c\xe5\x15\x83\x2e\x95\x50\x1e\x49\x7d\xb1\xa1\x93\xc6\x28\xcf\xd0\xba\x50\xa1\x42\x5c\x9d\xf3\x0e\xb6\xd4\xc1\x86\x3a\xb4\x68\x87\x96\xec\xa0\xdd\x0e\x5a\x25\xbc\x6e\xdb\xfa\x4c\x0b\x1c\xdf\x03\x2b\xad\xea\x90\xc0\xd4\x86\x96\xdc\xa9\x8a\xe7\x34\x63\x05\x18\x5e\x47\x57\x9a\xf0\xaa\x40\x93\x8e\xb5\x6d\x8a\xac\x02\xc8\xb8\x56\x85\x79\x75\x07\x58\xb6\x43\x74\x98\x94\x77\xc1\xe9\xa6\x75\x89\x7f\xed\xb0\x20\xb5\x06\x4e\xa7\x7a\x68\x07\xa5\xbe\x98\xd0\x49\x07\xb4\x1b\xe8\xb0\x12\xa1\x82\xd3\x41\x8a\x0e\xdc\x77\xb1\xab\x2e\xf6\xd4\xa5\x6d\xbb\xb4\x69\x17\x2d\x77\xd1\x2e\xe9\x6e\xdb\x96\x63\xda\x00\x05\x0e\x57\x69\x15\x87\x82\x66\xcf\x10\xb4\xae\xee\x68\xe1\xcd\x32\x48\x66\x25\x95\x16\xcf\xda\x02\x08\xdc\x64\x0b\x4c\xe5\xf8\xd4\xc0\x6a\x7b\x53\x04\x57\x66\x95\xf6\x29\x8a\xe0\xa8\x53\xa9\x72\x83\x8c\xaf\x05\x5c\x8d\xa8\xa2\x26\x14\x05\x52\x64\x0d\x98\xb9\x04\x86\x34\xdc\x06\x90\x9b\x8a\x82\xfb\x7c\xba\xd4\x1c\xc7\x93\x70\x9e\x66\xea\x56\x29\x83\xa7\x8c\x53\x06\xca\xda\xa8\x02\x34\xa7\x81\x54\xb0\xba\x8a\x21\x36\x5c\x15\x2c\xc6\xd4\x94\x58\x64\x6c\x45\x86\xd5\xa9\x8a\x6e\x3a\xeb\x26\x73\x37\xb6\x29\x4b\x17\x81\x8a\x0c\x1e\xc1\xdf\x57\xc7\x50\xff\xf5\x2f\x94\xf7\x07\x18\x7b\x7d\x14\xd2\xc5\x8e\x42\x82\x9f\x9b\xad\xf2\x2c\x2d\x82\x22\xfc\x73\x38\xd2\x67\xe1\xf9\x13\x7c\xff\x13\x5c\x4d\x1a\xaf\xb2\xf8\xcf\x59\x50\x04\x63\xf0\xeb\xb3\xfc\xea\xfc\xe9\xcd\x22\xde\x99\x5e\x04\x59\x1e\x16\xff\xb5\x2a\xe6\xfe\xa0\x6f\xed\xe7\x57\xe7\x7d\x53\xbf\x59\xc4\x49\xde\xb7\x0e\xfa\xa6\x79\x51\x14\xcb\xbe\xb5\xdb\x37\x0f\xfb\xe6\xe1\xf5\xf5\xb5\x76\x6d\x69\x69\x76\xde\x37\x0f\x4d\x5d\xd7\xfb\xe6\x21\xc0\x30\xfb\xa6\x7e\x15\x85\xd7\x7b\xe9\x0d\x44\xd3\xfb\x66\x59\xaa\x1b\x26\xfa\xcb\xec\x5b\xcf\xfb\xfa\x6e\x1f\x94\xa0\xff\x5b\xfb\xb3\x70\x9e\x73\x0a\x48\x20\x70\x7c\xaa\x6f\x3d\xd7\xa6\x71\x3e\x34\xfa\xde\xde\x3c\x8a\x63\xc0\x93\x35\x0a\xca\x3f\x7d\x6b\xaf\xef\x1d\xf4\xad\xfd\x92\x1d\x04\xcc\xd6\xd5\x37\x0f\x05\xd5\x59\xfb\xe0\x86\x53\xdf\x7a\xbe\x1f\x64\x61\x01\x61\xab\x4f\x2c\xf0\x32\x28\x2e\xfa\xa6\x3e\x8d\x83\x1c\x29\x09\x32\x06\xb4\x30\x83\x5f\x8e\xdc\xbe\xb9\x3f\x7a\x6b\x68\x66\xdf\xdc\xb7\x35\x33\xd0\x35\xd7\xef\x9b\xfb\xd5\x3f\xe8\x3f\xa3\xfc\x6f\x68\xbc\x2d\xa1\x3d\x4d\x2f\x8b\x46\x9a\x6f\xf7\xcd\x7d\x4b\x33\x6d\x0e\x92\x81\xff\x77\x06\xaa\x3c\x44\x4c\x42\xf1\xaf\xce\xe1\xaf\x84\x09\x64\xe1\x32\x0c\x8a\x71\x92\xa2\x9f\xf0\x32\x70\x84\xa4\xb4\xbb\x20\x4a\x76\xae\xc2\xac\x88\xa6\x41\x8c\x4e\x65\x2f\xa2\xd9\x2c\x0e\x99\xf4\x43\x4a\xc7\x8e\x08\x53\xa7\xb3\x12\xa2\xa4\x05\xd2\xb4\x74\xd5\x45\xaa\xf5\xeb\xb2\xb0\xaa\xc4\xc7\xc3\xaa\xcb\x80\xf4\x21\xaf\xb5\xef\x58\xd2\x94\xb7\x74\xdf\xb2\x3a\xd9\x20\xbd\x6f\xc9\xd4\x4d\x9f\x6d\xa0\x53\xd6\x4d\xaa\xdb\xb9\xf5\x09\x68\x2d\x5d\x86\x78\x7e\x80\x52\x5d\x03\x45\xb8\x2a\xc7\x23\x83\x5e\x04\x93\xbc\xa5\x86\x56\x10\x21\xf1\xea\x57\x3e\x5d\x59\xa9\x80\xe4\x3d\x76\xd4\x10\xfc\x18\x87\x5c\x4d\x61\x97\xd8\x55\x14\x86\x5f\x48\x6f\x11\x5f\x46\x99\x0b\xc9\x27\x5a\xcb\x2e\xa3\x47\x03\xf1\x48\xdd\xd7\x07\x70\xd1\x15\x65\x70\xac\xab\x32\x26\x03\xbb\x52\xd9\x51\x4d\xea\x62\x2b\xc8\x72\x8f\x4e\x07\x67\xf5\xc9\x33\x19\x3f\x1d\xda\x41\x4d\xbb\x5c\xc5\x55\xa9\x31\x01\x6b\x42\x96\xaa\xa4\x0f\x2a\x66\x54\xe7\x70\x68\xe1\x5d\x48\x93\x05\x6b\x91\x4f\x48\x89\x80\x10\xda\x0d\xb0\x15\x64\x37\x58\xfa\x1a\x70\x03\x19\xd9\x4e\x37\xa5\x28\xca\xd9\xc6\xbf\xa2\xb9\x74\xd1\xb7\x82\x22\x37\xb0\x12\x90\x2d\xa3\x48\x97\x2a\x56\x02\x60\xa1\xd2\x5b\xf8\x16\x52\xe5\x80\x09\x08\xd6\x02\x0a\x69\x91\x10\x5c\x32\x48\x09\xcd\x31\x7f\xdc\xc7\xd4\x96\x22\xb0\x95\x8e\xe2\x2a\xc9\xc1\xe7\x12\x66\xd5\xc2\xdc\x60\xb7\xa6\x52\xd4\x7d\x9b\x46\xef\xeb\x7c\x4a\x55\x0f\xe3\xb2\x01\x93\x9f\x28\x9a\x0c\x04\x56\x52\xa2\x98\x2e\x0f\xae\x4d\xdb\x62\x6a\x14\x08\xbf\x45\x60\x86\xcb\xd2\x6c\x9a\x9e\x4c\x65\x39\x30\x40\xd8\xba\x0d\x99\xd5\x64\xd9\xc4\x74\xba\xe9\x56\x41\x6b\xeb\x5a\x0f\xf7\xbd\x1d\x0e\x27\x12\x38\xb6\xa0\xc7\x70\x82\x5f\x88\x99\x58\xe5\x9f\xd6\x3b\x31\xec\x5d\xf1\x41\x0f\xe1\x3e\x61\x6f\x0f\xc9\x65\xeb\xe2\x55\xdb\xb1\xd4\x22\x60\x95\xda\x3b\x22\xb4\x46\xc7\x2a\x75\xaa\xc3\x8a\x22\x67\xc6\xc4\x31\x57\x8e\xf9\x77\x22\xa3\xd8\x88\x97\xe3\xdc\x14\xf4\xd8\x9e\x8a\xdb\x58\x0b\xad\x73\xd3\x29\x76\xd4\x4d\xaa\xe6\x34\x48\x7b\xb7\x5f\xbf\x42\x51\xf3\xf1\x9d\x2b\xaf\xf9\xb0\x24\xfd\x2a\xdd\x4e\xe0\x4d\xd7\x44\x5c\xaf\xf3\xa9\x38\xff\xcd\xaa\x17\x75\xab\x96\xb1\x64\x93\x4a\x99\xc0\x5b\x97\x76\x44\x04\xb4\x69\x5f\x5c\xa7\x39\x25\x98\x6b\xf6\xc8\x8e\x0d\xba\x0e\x03\xc2\xae\xa6\xde\xa4\xdd\xab\x15\xb5\xa9\xa0\x77\xf2\xdb\x14\xef\xa0\x78\xba\x9a\x49\x30\x3b\x0f\x87\xb2\xdc\x99\x44\x0e\x10\xb7\xc9\x01\x02\x31\xf9\xe0\x69\x22\xc6\x00\x8f\x12\x08\xb3\xdb\xa0\x8c\xd3\x3e\x17\x4b\x31\x21\x0e\xc4\xa0\x9f\x4c\x14\xe6\xfa\x67\xea\xaa\x1f\xfe\xe9\x52\x1d\xfd\x16\x37\x83\x57\x01\xe0\xd9\x7e\x48\xd4\x4e\xf5\xa1\x67\x17\x84\xd5\xa1\xf2\x11\x5d\x59\xf5\x50\x79\x97\xba\xce\xb3\xe0\xb6\x3d\x21\x11\xd3\xd2\x00\x8d\xc6\x81\x45\xcd\x3b\x94\xc3\x18\x4f\xbc\x0e\x4b\x97\xab\x6c\x19\x87\x92\x96\xab\xb6\xbf\x38\x09\xca\x09\x0a\xeb\x54\x3e\x89\x57\x92\xaa\x45\xf6\x09\xb0\xd6\xa9\x2e\xcd\xca\x06\x59\xc7\x6c\x10\x66\xa7\x96\x8c\xa1\xf7\x51\x11\x91\xd1\x29\x86\xdb\x56\xe7\x4f\x0d\xa0\x70\xd3\xb1\xf0\x37\x1b\xd4\x93\xb4\x34\x39\x00\x34\xcf\xa1\x6f\xfd\xfb\xd3\xf2\x4f\xbd\x73\x06\x01\xf0\x6b\xa8\xd5\xd5\x56\xf2\x1a\xbd\x43\xa5\x19\xc6\xdf\x9d\x19\xeb\x3d\xe2\xf1\x21\xec\xe5\x20\x5e\x56\x18\xf6\x6d\x0e\x2c\x47\xb1\x9a\x81\x34\x6f\x44\x80\x72\xb0\x16\x5d\x84\x33\xd9\x83\x13\x4a\x84\xb4\xa6\x5b\x0e\x88\x2f\xc6\x3d\x47\x87\xdc\x2b\x68\x1c\x7f\x30\xe8\x21\x0c\xe9\x53\xb4\xb4\x47\xe0\xb3\x06\xbb\x2d\xc9\x9c\x49\xbe\x49\x13\x3a\xde\x44\xca\x1c\xe5\x3c\x06\x3d\x84\xa3\xc0\x1e\xee\x35\xf8\x0c\x96\xd6\x4f\xb2\x67\x29\xbf\xcb\xc3\x71\x2f\xcd\x6b\x3c\xed\xcc\x35\x1d\x8f\xcf\x1a\x74\x07\x24\x73\x36\xc1\x9c\x6b\x58\xc2\xe7\x6f\xb8\xce\x68\xd0\x43\x38\x0a\xec\xe1\xde\x88\xcf\x60\xe3\x3f\x48\x26\x1d\x82\xc9\x2a\xdb\xbf\x98\x49\x8e\x0f\xc3\x33\xfd\xb7\x31\x4a\xbb\x31\x3e\xb3\x9d\x5e\x5c\xe2\x04\x36\x5d\x5a\xb6\x89\x6d\xf8\xbc\x70\x9f\x8d\xd6\xdd\x89\xbc\x2d\x79\x4f\x46\x03\x24\x05\x8e\x88\x08\x88\xcf\x54\xc7\xf7\xa2\xb8\x41\x4b\xf3\x4a\x54\x3b\x4b\x78\xdc\xc2\xe7\x88\xf7\xb4\x54\xbb\xc9\xd3\x71\x5b\x17\x9b\x27\x02\xb7\x9a\xa9\xff\x77\x0c\x32\x55\x26\xcb\x55\x31\x5c\xc6\xc1\x34\xbc\x48\x63\xf0\x60\x04\x40\x1a\x80\xe8\x1b\xfd\x82\x6d\x90\x63\xc9\x54\xf4\xd6\xac\x97\x52\x64\x22\xbe\x07\x69\x2b\x99\x81\x41\x29\x15\x25\x83\x3a\x0b\xb2\xcb\x0e\x98\xb3\x70\x1e\xac\xe2\x42\x2d\xb7\xa3\xcb\xad\x17\x8c\xc6\x3a\x7a\x21\x91\x29\xc5\xd2\x5e\xe0\x65\x54\x32\x0b\x5d\xd3\x2d\x0a\x9b\xca\x5e\x0e\x37\xfe\x09\x00\x51\x56\x49\x92\x69\x93\x66\xba\x73\xa0\x8c\xa1\xd1\x38\xfc\x96\x23\x11\x37\x09\x94\x09\x0a\xeb\x54\xde\x35\x50\xc6\xb0\xd6\xa9\x6e\x9d\x40\x99\xc0\x6c\xad\xb4\xb4\x6f\x12\x73\xbd\x70\x99\xc1\x5d\xa3\x66\xa5\x59\xb2\xa3\x73\x90\x1a\xb2\xca\x6d\x02\x2b\x53\x78\x08\x8a\xc1\x54\x9e\x64\xd3\xac\x56\xdf\x25\xdc\x72\xe6\xe7\x54\xa5\x32\x8e\x85\xd8\x5d\x26\xea\x7c\x4c\x09\xcf\x9c\x44\xac\x54\xad\x32\x9e\x2b\x20\x86\x67\xc5\xc9\x3e\xc3\x31\xfa\x2e\x61\x98\x5d\x26\x20\x6b\x94\xb1\x8b\xe1\xfe\xd4\x60\xf6\xe4\x00\xfe\xcb\x3e\x6f\xdb\x7c\xe0\x76\x83\xb2\x64\xd0\x43\x9e\xfe\x89\x62\x56\x23\x66\x28\xe0\x67\x33\x82\xfe\x9f\xfa\x48\x53\x21\x8b\xc1\x71\x2d\xab\xe4\x84\xc8\xc2\x05\xc6\x09\xde\x9c\x56\xfd\x8d\x66\x26\x43\x22\x3d\x15\x75\x65\x09\xdd\x38\xc3\x57\xc9\xaa\x8b\x1d\x2c\x43\x87\xd5\x7a\xbc\xbc\x73\xd5\xcc\x8e\xdf\xa8\xe2\x51\x1b\x9b\xe2\x91\x2f\xcc\x62\xdb\xf4\xe0\x64\x59\xf5\xb2\x3e\x37\x5d\x6a\x2a\x4c\x4d\xc2\x77\xff\x4d\x5a\x12\x50\x5e\x4d\x83\x2b\x1b\xa3\xa7\xc5\xeb\x13\x46\x99\x0c\xe0\x2f\xe8\xbe\x1a\xfc\x05\xdd\xa5\x08\x08\xc0\x80\x80\x0c\x08\x50\xc1\xb3\xcf\x00\x84\x7e\xa3\x6d\xc0\x7c\x26\xab\x63\xe0\xd9\xef\x9c\x04\x32\x4c\x26\x24\xd6\x7c\x04\x09\x90\x58\x36\x85\xfc\xb0\x49\x40\xea\x84\x80\xe0\x91\x39\x68\x2d\xbd\x28\xc9\xc3\x82\x9b\x36\x90\x7c\x6a\x8e\x13\x3c\x35\x26\x87\xa8\x70\x5f\x67\xd3\x9c\xe5\x4d\xcd\x77\x43\x65\x40\x7c\x31\x6a\x01\x30\x08\xf2\x93\x71\xbf\x9d\xce\x23\x10\x81\xd1\x2c\xc6\x89\xc0\x16\x70\x08\x51\x33\xb0\x54\xa4\x20\x12\x0b\xdd\xf9\x45\x16\xd4\x55\x8a\xbf\xb9\x5d\xfd\x85\xa6\x70\xac\x3d\xa1\x92\x87\x5c\x47\xc3\x59\xaa\xd6\xd1\xf0\x6f\x26\xc5\x36\x82\x21\x3f\x9a\x0a\x1d\xa1\x5a\x82\x93\x75\x04\xe1\x22\x9c\xc8\x44\x20\x82\xbc\x33\x20\x98\x16\x43\x22\x28\xb5\x00\x3d\x5c\x97\xe8\x24\x4b\x5b\xb7\x80\xba\xed\xd8\x2d\x84\x4d\xd4\xb1\x63\x40\x3a\xfc\xae\x41\x94\x3d\xf4\x3a\x2e\xce\x18\x5c\x85\xc4\xbf\x58\x14\xeb\x00\x82\xfc\x64\x29\x74\x8e\x6a\x99\x50\xd6\x39\x04\x4b\xc0\x22\x53\x29\xc1\xe5\x1d\x03\x40\xb4\x98\x12\x46\x45\x0a\xf2\x70\x5d\x42\x59\x8a\xb6\xee\x00\xf5\xd9\xb1\x3b\x08\x1a\xa5\x63\x67\x28\xa9\xf0\xbb\x02\x56\xf2\x90\x3b\x06\x38\x4b\xd5\x8e\x01\xfe\xcd\xa6\xd8\x46\x30\xe4\x47\x5b\xa1\x23\x54\x2b\xaf\xb2\x8e\x20\xdc\x6e\x10\x99\x08\x44\x90\x77\x06\x04\xd3\x62\x48\x04\xa5\x16\xa0\x87\xeb\x12\x9d\x64\x69\xeb\x16\x50\xb7\x1d\xbb\x85\xb0\x89\x3a\x76\x0c\x48\x87\xdf\x35\x88\xb2\x87\xde\xb1\xc2\x19\xc3\x77\xac\xf0\xef\x0e\x25\x00\x06\x47\x16\x38\x0a\x1d\x45\xfe\xbc\x35\x5d\x01\x67\xcb\x4b\x64\x3c\x0d\x92\xbc\xc3\x60\x70\x2d\x86\xc6\x50\x54\x00\x7c\xb8\xce\xb3\x96\x5c\x6d\x9d\x08\xea\xbc\x63\x27\x92\x36\x5f\xc7\x8e\xd4\xd0\xe2\x77\x26\xa6\xfc\xef\xb2\xbb\x8a\x33\x09\x52\xcf\x07\xcc\x27\x72\x21\xc3\x9a\x3b\x73\x41\x84\xd8\xa0\xe0\x4c\x42\x0c\x2c\x09\x2e\x18\x59\xf9\x3d\x8a\x5a\x2a\xc7\x86\xd5\xed\xc4\x78\xcc\x92\x3a\x1b\xe7\x41\xc0\x2a\x91\x7c\xc0\xfb\x4a\xa6\x06\x9e\xcf\xf5\x99\xc0\x19\x12\x58\xb8\x4e\x20\x52\xad\x13\xb4\x6d\xcc\xe7\x99\x5d\x93\xc7\xf6\x8c\xdb\xd5\x52\x6d\x49\xcb\xd4\xc2\x5b\xba\x6f\x2a\x21\x35\x53\xa5\xdf\x0f\x78\x5f\xef\xa9\xb7\x3e\xec\xa9\x27\xd3\x0c\x67\x97\x17\x22\x35\x9a\xe1\x3c\x10\x41\xe2\x92\x6a\x41\x6f\x44\xb4\xab\x25\x98\x79\x6e\x9b\x5a\x78\xbb\x03\x83\x1e\x42\xa5\xd4\x82\x1e\x33\x08\x38\x1f\x49\xa5\x84\xb3\xd9\x4c\xaa\x14\x76\x37\x1e\xe2\xd4\x3a\x41\x1b\xfa\x82\x85\x62\x7a\x6f\x01\xdb\xcd\x57\x58\x44\x40\x67\x05\xa4\x4b\xd1\xec\x1e\x44\x53\x07\x52\x0a\xe5\x04\x2b\x9f\x57\xaf\x4b\x0f\x35\x1b\xb9\x65\x78\x87\xfd\xbf\x87\x8b\xf4\x6e\x38\x4b\xa7\xab\x45\x98\x14\xbd\x55\x16\x0f\x97\x59\x38\x8f\x6e\xfe\x7c\x72\x0f\x49\xd4\x7b\x18\xd4\x41\x35\x78\xae\x96\xda\x5d\x4f\xc1\x79\xf8\xe6\x85\x72\x4c\x86\x0b\xea\x25\x3f\x1c\x96\xbf\x9f\x71\x41\xbe\x98\x27\xc2\x9b\x07\x8b\x28\xbe\xe5\xe0\xc1\x02\x0a\x2f\x0b\x66\xe1\x22\xc8\x2e\x59\xfe\x4c\x2e\x7f\x35\xbc\x80\x47\x53\xc2\x23\x89\xcb\xf2\x69\x8a\xf9\xcc\x57\x13\x81\x1a\x2d\x1e\x9b\x35\xb8\x80\x4b\x4b\xcc\x25\x89\xca\x32\x69\x89\x99\x94\x1c\x93\x46\x4f\xed\x04\xcb\x25\x06\x25\xc2\x06\x69\x39\xfe\xa5\x90\x97\xa3\x6f\x1d\xde\x2c\xe2\xbe\xa9\x5f\x85\x59\x1e\xa5\x09\xcc\x32\x61\x68\x3a\xcc\x3a\x11\x26\xd3\x74\x16\x25\xe7\xf0\xf3\xaa\x98\x0f\x7d\x90\x72\x03\xe6\x86\x38\xa8\xd2\x43\x18\x07\xef\xf7\x4f\x4e\x3f\x3c\xef\x9b\x3a\x4c\xf4\xf1\xe1\xf3\xde\xdb\x57\xfb\x20\xb3\x85\x39\x84\x39\x3e\xbe\x82\x3c\x12\x7d\xf3\xf0\xe0\xe4\xa0\x6f\xea\x9f\xbe\xbc\xe8\x9b\xba\xa1\x19\xf0\xe3\xf3\x77\xb0\x42\x69\x66\x90\x17\x59\xb0\xbc\x88\xa6\x79\xdf\x3c\x04\xe8\x87\x10\x1d\x10\x3c\xcc\xaf\xce\x0d\x43\x9b\x15\xb3\x2a\x27\x08\xe2\xae\x64\x08\xfe\x4c\x26\x00\xa1\x04\x06\x69\x36\x78\x70\x11\xca\xbc\x91\xa4\xc3\x00\x3c\x8e\x3b\x04\x01\xa6\x08\x7c\x8d\x14\x27\x12\x32\xbb\x37\x71\x94\x5c\xb6\x91\x33\x46\xa3\x51\xdf\x3c\x84\xb0\x22\x82\x28\x7f\xca\xf2\x46\x04\x71\xdb\x0a\x01\xb7\xe6\x20\x98\xa9\x3b\x8e\xe6\x38\x62\x60\x70\x82\x16\x69\xd7\xb6\x25\x54\xb9\xf9\x5d\x10\xf9\xd2\x44\x6c\x5b\x17\xa1\x2e\xb3\x30\x0f\xb3\xab\x70\x17\x34\xcc\x31\x68\x17\x40\xe6\xe6\x28\x4a\x4e\x8f\xa2\xa4\x34\xc8\x38\x9a\x86\x84\x4d\x88\x32\xc2\xa0\xcc\x31\xf9\xb4\x6f\x3d\x7f\x5b\x76\xa8\xbe\xa9\xbf\x2a\x7b\x4f\x95\xe4\x05\x94\xb4\x13\x21\x09\x96\xdd\x21\x2f\xb2\xf4\x32\xac\xec\x28\x09\xa1\xad\xc3\xaf\x43\x5c\x51\xb0\x00\xe6\xa1\x21\x81\xcb\x6f\xc3\x6c\x15\x23\x2a\xe1\x55\x98\xa4\xb3\x19\x2c\xab\x23\x7b\x58\x56\x87\xf7\x7d\xd3\xd7\x35\x1d\xfc\xaf\x6f\x96\xbd\x71\x68\xd7\xbf\x8e\x94\x54\x52\xb2\xdf\x49\xe4\xce\x08\x24\x72\x16\x4e\x0b\x42\x01\x7d\xd3\x3a\xdc\x2d\xff\x40\x49\x1b\x2b\x31\x1b\x8b\xb5\x91\x28\xa0\x95\x00\x85\x0d\x38\x58\xa6\xf1\xed\x79\x9a\xd0\x4c\xe8\xba\xb7\xbf\xb7\x07\xab\x45\x89\x9b\x11\x2b\x9a\x5d\xb5\xe6\x6d\xd5\x38\x8b\xe8\x66\x38\x89\xc3\x64\x36\x5c\xa4\xb3\x10\xf4\x59\x7d\xb1\x8a\x8b\x68\x19\xdf\xf6\x2d\x44\x05\x3c\x6e\x84\x3c\x85\x61\xe8\xbe\x66\x5b\xd0\xda\x2d\xcd\x05\x3f\x19\xfa\x08\x64\xee\xc1\xbe\x95\x3f\xd8\x76\xdf\xd4\x3d\xcf\xd3\x3c\x42\xee\x8a\xef\xed\x8b\x3e\xb2\x0e\xfc\xfd\x5d\xae\xe8\xae\x92\xe8\xe5\x94\x3a\x0e\xf8\x92\xeb\x9a\x37\xea\x9b\xba\x65\xd9\xda\xc8\xe4\x49\xa8\x63\x10\xf6\xe8\xf7\x48\xbc\xab\x1f\x3c\x7f\xbe\x2b\x64\xd6\x34\x0c\xcd\xf7\x31\xd6\xcc\x51\xa9\x09\xdd\x19\x69\x6e\x89\x62\x7a\xba\xe6\x79\xbf\xa9\x71\xdc\x7d\xef\xe0\x90\x63\x51\xae\xae\xb9\xc0\x7d\xba\x23\x42\x8f\x23\xcd\xb3\x9a\xdf\x6a\x51\x46\xba\x66\x7a\xa5\x2c\xba\xa1\xd9\x0f\x25\xcc\xfe\xc1\x73\xeb\xf9\x73\x56\x18\x47\xb7\x00\x0f\x58\x4f\x70\x47\x9e\x66\x93\x9f\xfc\x12\xaa\x94\xd4\xb0\x2c\x4f\xb3\x4a\x21\x3c\xdd\xd5\x46\xa0\x33\x99\xb6\x0e\x3a\xd8\x43\x8a\x61\x38\xbe\x66\x41\xe6\x0d\xcd\x70\x9a\x56\xf0\x6d\x5f\xf3\xcc\xe6\x77\xc3\x36\x3d\xe8\x0e\x6c\xdb\xd3\x9c\xb2\x64\xe4\xeb\xda\xef\x6a\x85\xe7\x07\x07\xcf\x75\x96\x7d\xd3\xf1\x34\xcf\x00\xa6\x61\x68\x9e\xc3\x76\xcd\xea\x77\xc7\xb2\x34\x1b\xe4\x67\xa3\x05\xfe\x2d\x9d\x77\xb4\x3f\x3a\x70\x84\x9d\xb7\x66\x8e\xd6\xfd\xc3\x30\x7b\x78\x60\x3f\xf7\x58\x66\x7d\xdd\x85\xdd\xd0\x30\x6c\x5d\xf3\x01\xe3\xb6\xab\x8d\x4a\xf3\xf6\x7d\x43\x33\x7d\x8e\x71\x3c\x90\xb9\xfb\x87\xfb\x36\xcf\x05\x31\xec\x31\xd6\x5d\x7f\xa8\xba\x30\xa7\xa3\x3f\x8c\x4c\x9e\xbe\xaf\x1f\xec\xb3\x32\xb9\xba\xaf\x99\xc0\xd9\x18\x23\x6d\xc4\x6f\x16\x4e\xdb\xf9\xae\xa7\xb9\xc0\x35\xe9\xde\xe8\x77\xf5\x63\xd1\xd0\x60\x9b\xba\xa6\x97\xdd\xd7\x36\x47\x9a\x05\x3a\xb0\x31\xd2\x74\xd0\xb3\x2d\x5d\xb3\xcb\x22\x56\x4e\x4f\x1f\x69\xa0\x3d\x0c\x5f\x1b\x19\xbf\x47\x02\x77\x54\xf6\x0f\x56\x02\x9a\x17\x0e\xbb\x8c\xc6\xf5\x91\xeb\xc3\xe1\x61\xe4\xf9\x30\x70\xf9\x0d\x5d\xe3\xf9\x9e\xb3\xc7\x33\x23\x63\xa4\x39\x60\xfc\x35\x47\x9a\x5f\x96\x5a\x23\xe4\x96\x2c\x0d\xa4\xb6\xb4\x4c\x0f\x0d\xc8\xf0\x77\x76\x3c\x67\x9a\xf1\x21\x05\x62\x2d\x88\xfd\x42\x87\x18\xbf\xa5\x1f\xef\xef\xe9\xfb\x1c\xff\xca\xaa\x93\x8e\x77\xd8\x88\x88\x95\xe8\x61\x9a\xc0\xde\xb7\x0f\x4c\x4e\x90\x44\x0b\x40\x45\xa7\xf4\x60\xcd\x0e\xe7\x8c\x80\x0f\xd9\x42\x8e\xe5\xc1\xf9\x7f\xd5\x21\xa8\x0e\xc2\x76\xa1\x72\xdc\x86\xf1\x9f\xe3\x69\xee\xef\xea\xe1\xde\x81\x71\xc0\x99\xd7\xf8\xb6\xab\x99\x18\xfb\xb4\x38\x0f\xc2\xac\x28\x30\x1d\xe9\x23\xcd\xa7\x82\x69\x47\xd7\x0c\x30\x38\x5b\xbe\x05\x0b\xbd\x91\x4e\xcd\x51\x1f\x72\x2e\xc6\xf6\x46\xd6\xa0\xd9\xc9\x24\x3b\x5a\xab\x0c\x1d\x0f\x32\x7c\x8b\x04\xe7\xb0\xc7\x06\x1c\x23\xdd\xd2\x2c\x03\x44\x4d\x96\xa7\x79\x60\x86\xe7\xda\x15\x94\xe7\xfe\xb6\xe6\x13\xce\x4f\x75\xd7\xd1\x1c\x0f\x8a\xe1\xa0\x38\x91\x1a\xa1\xb9\x83\xf8\xdf\x49\x08\x96\x1b\x15\xe3\xf9\x9b\x09\x61\xe8\x86\x0e\xd7\x5e\x0c\xd3\xb4\x34\x03\xc6\xda\x96\xa1\x19\x2e\xb9\x1e\xc5\xc2\x3d\x28\xdb\xe5\x74\x00\x2c\x8f\x79\xba\xa7\x81\x62\xc3\x70\x3d\x0d\xc4\xaa\xde\x48\x03\x1a\x37\x5d\x1b\xa4\xb8\xd6\x7d\xcf\xd5\xd0\xd2\x80\x0b\xbd\x99\xaf\xdb\x08\x8b\x24\xf4\x9b\x42\x5b\xa1\x49\xf9\xba\xe6\x57\x33\x7f\x10\x9c\x33\x23\x05\x67\xe8\x1b\xe9\x3e\x2c\x72\xca\x22\x17\xcd\xb9\x08\x3a\x0f\x39\x9b\x65\xe2\x75\xa6\xa7\xc3\xa6\x33\xb0\xb6\x23\x45\xfa\x4d\xc1\x88\x68\xc2\xc1\xb6\x0a\xc3\x1e\x47\x84\x87\xb1\x2c\xd1\xb8\x61\xe8\x96\x0d\xcd\x06\x85\x20\x74\x88\xc2\x1a\x1a\x2b\xb6\x51\x9a\x1c\x18\x5b\x8d\x91\x0f\x16\xe0\x1e\x54\x24\x46\xc1\xdc\x0e\xee\xf8\x2e\x0a\x15\x1c\xa7\x5a\x51\xf7\x47\x9a\x01\x66\x51\x8e\xaf\xd5\xcf\x08\x3c\xd0\xa2\x02\xab\x54\xae\xe6\x59\x59\x1f\x44\x8a\x3d\x6f\xff\x39\x6f\xfe\x61\x98\x23\x13\x29\xdc\xd2\x4d\xcd\x82\x7a\xb6\x2c\xcd\x32\xc9\x71\xc4\xb7\x74\xcd\x35\xc8\x6f\xf6\xc8\xd0\x0c\x1f\xee\x7a\xc0\x38\xff\x61\xbb\x0a\x3b\x24\x8e\xec\x11\x8c\xa3\x0c\xd3\xb7\xe1\xcc\x90\xb7\x43\x63\x18\x8e\xae\x8d\xe8\x6f\x23\x43\xd3\xe1\x4a\x97\x6e\x69\xce\x6f\x72\x04\x9e\xb3\xe7\xef\x73\x16\x42\xb9\x2c\xf2\x06\xfc\x87\x61\x5b\x3c\xe0\x73\xec\xcb\x30\x4c\x4d\x87\xcc\x9a\xa6\xa6\x9b\xfc\x38\xe5\xa1\x44\x71\x9f\xef\xda\xbc\xd5\x12\x0e\x3b\xfc\x16\xe0\x75\x1f\x56\x0d\xbf\x43\x94\x5f\xbc\xff\x59\x4e\x32\xab\x69\x27\xf4\x84\x96\x61\xc0\x61\x69\x64\x9a\x70\xca\xc6\x71\x12\xba\xe1\xb8\x96\x66\xc1\x69\x84\x65\x80\x89\xdc\x83\xfa\x40\x1e\x8b\x3c\x7f\x37\xf2\x6c\xcd\xa7\x1a\xfb\x61\x44\x11\xda\xe8\x3f\x4f\x14\xa1\x3b\xf7\x0d\x13\xae\xf6\x79\xbe\xa1\x8d\xe0\xb2\x9f\x65\xc2\x39\x98\xab\x1b\x30\x2a\xe2\xd8\xe0\xdf\xcc\xb8\x58\x76\xb8\xda\x37\x75\xc7\x86\x2b\x22\xdc\x6f\xba\x69\xc1\x75\x0e\x56\x2d\xbf\x65\x54\xf2\xf7\x77\x79\x21\xf6\x7f\x86\x74\x23\x63\xdf\xe1\xed\x9d\x72\xf6\xa6\x39\x2b\x6c\x9c\x18\x83\x5d\xc8\x79\x48\x31\x78\xab\x36\xdc\x31\x98\xe3\xbd\xc1\x5c\x7c\xd4\xcc\xc5\x7f\x8b\xb1\x79\x7b\xfe\xc1\x88\xb3\xff\xc2\x9e\x1e\x60\x57\x37\x79\x2d\xc4\xb6\xe3\x43\x3a\x36\xce\xfa\x13\x6f\xe1\x8f\x13\xb9\x3e\xcc\x5a\x8e\x73\xb0\xe7\x1c\xb8\xff\x20\x39\x78\xc7\xd1\xf0\xf8\x54\x72\xf0\xce\xd0\x2d\x5f\x33\x6d\xcf\x1c\x79\xf0\xec\x9d\x61\xd8\x23\xcd\xf4\x1c\xdb\x1c\x81\xd3\x77\x3a\x7c\x59\xaf\x6f\xfa\x43\xdb\xd6\x46\x5e\x7d\x2c\x4f\xc7\xc9\x0c\x19\x3a\x43\x86\x50\x1f\x3f\x1a\x37\x72\x5d\xcd\x73\x4c\x00\x8e\x9d\x91\x33\x0c\xc3\xd5\x6c\x43\x87\x1b\xe8\xd4\xe9\x4c\x13\xb8\x4c\x93\x3a\xe1\xe9\x3a\xe0\xa8\xd0\xf6\x8e\xd6\xf1\xb4\xe9\x78\xbb\xfe\x81\xfe\xa8\xcd\xed\xb9\xee\x2e\xcb\xbc\xbc\x79\x2e\xa7\x2f\x3e\xc8\x7a\x75\x75\x50\x95\x37\xe3\xe0\x45\x47\xff\x3c\xf9\x7e\xed\x8c\x8a\xb3\xd0\x4d\x8d\xc0\xdc\x61\x9a\x8e\x82\x7f\xcb\xb8\x80\x39\x81\x7f\xac\x10\xbf\xf4\x98\x2c\x4f\x13\xec\x7c\x85\x33\xa9\x61\xd6\x3e\x1f\x72\x9c\xff\x67\x49\xb1\x7b\x78\x60\x3d\xe7\x48\x61\xea\x0e\x3c\x4f\x81\x0e\xe6\xd8\x4e\x75\xfa\xb1\xfa\xe0\xc3\x0f\xd5\xd1\x9d\x91\x6d\x6b\x3a\x7e\x96\xc7\x1b\xb9\xd5\xd2\xb4\x5e\xcd\x56\x46\xa8\xd0\xb4\x3d\xad\x1c\x6d\xb0\x49\x8d\xef\xc2\x0d\x44\x6c\x9a\xe3\xc1\x33\x1d\xc6\xc8\x1a\x69\x4e\x19\x13\x99\x23\x1b\x46\xb4\x88\x3b\xdb\xf8\x5d\xab\x8c\xbb\x7b\x23\x5e\x88\xcd\xaa\x81\x23\x35\xa5\x99\xdf\xb2\xde\xe1\xee\x3e\xe7\xcd\x3f\x59\x75\x73\xda\x84\xaf\x6f\xb2\x51\x1e\x74\x89\xc0\xf7\x6d\xb8\x23\xe8\xe9\x28\x58\xc6\xe4\xf2\x46\x70\xee\xd6\x7c\x72\x6c\xfd\xc1\x8f\xba\xb2\xbb\x18\x9c\x8d\x0d\xdd\xb0\x3c\x03\x0e\xe0\x96\x35\x42\x01\xd6\x03\xf2\xcc\xb1\x65\xc6\xde\x6d\xd3\xd1\x0c\xec\x77\x4b\x37\xe0\xfe\xa0\x61\xba\x68\x6e\xe3\xb8\x06\x70\x7e\x96\xef\x6c\x7f\x89\x82\x3b\x79\xc1\x26\xf6\xb2\x70\xdb\x1b\xf9\xda\xc8\xb1\x75\xd7\x85\x61\xb2\xe5\xfb\x9a\x37\xf2\x3d\xdf\xe8\x14\x6d\xd3\x64\x86\x34\x1d\x22\xd8\x06\x9e\xdf\x37\x6d\x9d\x0c\xb6\x2d\xc7\xd1\x46\x96\x05\x70\xa8\x60\xdb\xb2\x4c\xcd\x74\x1f\x30\xd8\x16\xad\x93\x70\xb6\x1c\x39\xc3\xda\x6f\x1f\xe9\x78\x26\xb1\x67\x3d\xdf\xad\x0e\x85\xc9\x4c\xc2\xf1\x2c\xcd\x33\x0c\xc7\x43\x33\x27\xdb\xd3\x35\xd7\xd4\xcd\x32\x5e\xa6\x4c\xc2\xc1\x6f\x99\x51\x26\x41\x93\x19\xd2\x74\x48\x93\x70\x4c\x53\x73\x7d\xc3\xf1\x09\x93\xb0\x75\x53\xd3\x7d\xc7\x74\x39\xf3\xaf\xb2\x88\x63\x12\x86\xe5\x69\xba\xf7\xab\xa7\xb3\xaa\xca\xf4\x1c\x5f\x73\x3d\xd7\x2b\xe5\x2a\xb5\xe0\x3a\x8e\xe6\xb9\x9e\x61\xea\xdd\xfa\x17\x45\x66\x48\xd3\x21\x95\xe9\xe9\x9e\xe6\xda\xae\xe7\x12\xca\x74\x4c\x5f\x33\x47\xa6\x61\x2a\xeb\xd2\x74\x6c\xca\x5d\xfd\xa2\xfe\x85\xab\x93\x0c\x24\x59\x5f\x6a\x78\x3e\x78\xe1\xbe\xf6\xb7\xf4\x79\x87\x87\x39\xbb\xe0\x5b\xfb\xfa\xbe\xaf\xb4\x29\xc1\x5b\xc6\xe6\x0c\xdf\xec\x20\xff\xcb\x7d\x84\x77\xb0\xef\x56\x27\x17\x64\x66\x6d\x8d\x1c\xcd\x31\xdc\x51\xe9\xc1\xf6\x41\x94\x64\x6a\xa5\x71\x1b\xec\x22\x8d\xcc\x47\xd0\x64\x86\x34\x1d\xd2\xac\x2d\xdb\xd6\xec\x91\x31\x22\x97\x68\x74\x5f\xf3\x74\xc3\xa9\x3e\xd3\x66\xed\xb0\x66\x6d\xb9\x1e\xf0\xbd\xbf\xd6\x45\xb8\xfe\x9e\x5f\xdd\x4f\x92\xe9\xb2\x9c\x57\x58\x86\xe5\x96\x02\xec\x83\x58\xcd\xd4\x4c\x7b\xe4\xb9\xac\x8b\x90\xe9\x92\x26\x33\xa4\xe9\x50\xfe\x76\x64\x6b\xa6\x6f\xb9\x26\xe9\x22\xf4\x91\x66\xf9\x76\xe5\x38\x14\x5c\xc4\x16\x46\x60\x80\xb6\xc6\xf5\xe3\x0e\xf7\xa1\x2d\xf2\x3a\x34\x79\x51\x5b\xbe\x06\x55\x87\xcd\x6b\xfb\x8b\xa0\xb8\xe8\x9b\x3a\xca\x2e\x70\xa4\x03\x1f\xb0\x8f\x26\x91\x6f\xd1\xaf\xbe\xad\x6b\x95\x63\xae\x12\x11\x7c\xba\x08\x96\x21\xd1\xe9\x4b\x4a\xbf\x44\xb5\x32\x38\xba\x0c\xfc\x9e\x5f\x95\x5f\xfe\x45\xa6\xa5\x08\xb3\x2c\xcd\xda\x5f\x00\x44\xc9\x58\xf0\xd4\xf4\x38\xba\x20\x61\x39\x4a\x8b\x01\x8b\x61\x29\x89\xbe\x0c\x12\x90\xb4\x2a\x69\x7b\x54\x8c\x78\xd6\x81\x46\x45\xad\x3f\xd6\x35\xe3\xa7\x06\x4b\xd1\x5b\x8a\xf5\x13\x64\x20\x4f\x7b\x95\xbd\x5c\xd7\xfb\x3b\x54\x3a\x8e\xc7\x6c\x1c\x8f\xd9\x38\x6a\x82\xc8\x8d\x3c\x66\xe3\x90\xbb\xa9\xc7\x6c\x1c\x34\xfb\x8f\xd9\x38\x1e\xb3\x71\x3c\x66\xe3\x38\x78\xcc\xc6\xf1\x98\x8d\x63\x33\x31\x1e\xb3\x71\x3c\x66\xe3\x78\xcc\xc6\xf1\x98\x8d\xe3\x31\x1b\x87\xa2\x04\x8f\xd9\x38\x1e\xb3\x71\x6c\xd8\x8f\x1f\xb3\x71\x3c\x66\xe3\x78\xcc\xc6\xd1\x12\x98\x3e\x66\xe3\x78\xcc\xc6\xf1\x98\x8d\xe3\x31\x1b\xc7\x63\x36\x8e\xc7\x6c\x1c\x1b\xb9\xac\xc7\x6c\x1c\x8f\xd9\x38\x7e\xa7\x48\x8f\xd9\x38\x1e\xb3\x71\xfc\x92\xae\xf2\x98\x8d\xe3\x31\x1b\xc7\x16\x86\x93\xc7\x6c\x1c\x8f\xd9\x38\xfe\xe6\x29\x2c\x1e\xb3\x71\x3c\x66\xe3\x78\xcc\xc6\xb1\xb5\xc1\xeb\x31\x1b\x87\x29\xf0\xde\x8f\xd9\x38\xb6\xee\xd8\xfe\xb6\x59\x2c\x1e\xb3\x71\x3c\xe6\x8f\x50\xd3\xe6\x63\x36\x8e\xc7\x6c\x1c\x8f\xd9\x38\x1e\xb3\x71\x3c\x66\xe3\x78\xcc\xc6\xf1\x37\x93\xe2\x31\x1b\x87\x8a\x96\x1e\xb3\x71\x3c\x66\xe3\x50\xed\x4e\x8f\xd9\x38\x1e\xb3\x71\x3c\x66\xe3\x78\xcc\xc6\xf1\x98\x8d\xe3\x31\x1b\x87\xda\x38\xf7\x98\x8d\xe3\x31\x1b\xc7\x63\x36\x8e\xc7\x6c\x1c\x8f\xd9\x38\xfe\x49\xd9\x38\x9e\x60\x89\x28\x86\x79\x74\x17\xd2\xd9\x29\x86\xcb\x34\x8f\x8a\x28\x4d\xc6\xa6\xa3\x99\x59\xb8\xe8\xe9\x78\x69\x16\x2e\xc3\xa0\x18\x27\x29\xfa\x89\xca\x7f\xd1\x83\xbf\xde\x63\xd9\x2e\xfe\x98\x07\xe5\x1f\x3c\x01\x46\x93\x74\x03\x22\xd3\xd9\x40\x06\x3d\x84\xf4\x64\xa7\xe6\x26\x0b\xe3\xa0\x88\xae\xc2\x1d\x22\xc3\x46\xf9\xd7\x70\x16\x95\x16\x5c\x02\x4d\xd3\x78\xb5\x48\x76\xbe\xaf\xf2\x22\x9a\xdf\x0e\xa7\x69\x52\x84\x49\x31\x9e\x86\x49\x11\x66\x3b\xcb\x60\x36\x8b\x92\xf3\xb1\x01\xe5\xb2\xb2\x70\x51\xa5\xe8\x08\x56\x45\xba\xb3\x88\x92\x61\x93\xb2\xe3\xea\x62\x07\x74\xa6\x4a\x0f\x7c\x49\x7b\x5a\x11\x15\x71\x78\x0f\xb3\x89\xfc\xa1\xeb\xfa\x0e\x9d\x58\x04\xa2\x01\xb0\x4a\xbc\x49\x1c\x4c\x2f\x9f\xec\xcc\xd3\xa4\x18\x5e\xc3\x1a\x4d\x5d\x27\x7e\xe7\xe3\x63\x10\x83\x9e\xa9\xeb\x88\xc6\x3c\x58\x44\xf1\xed\xf8\x28\x2c\xb2\x74\x99\xc6\x51\x3e\xf8\xd7\xee\x55\x98\x44\x59\xef\x5d\x78\x53\xfc\x6b\xf0\xaf\x97\x61\x7c\x15\x16\xd1\x34\xe8\xbd\x0b\x57\xe1\xbf\x06\xbb\x59\x14\xc4\x83\x3c\x48\xf2\x61\x1e\x66\xd1\x9c\x20\x23\xa9\x1a\x42\x0c\x7a\x58\x4d\x3d\xb2\xaa\x1e\x53\x57\x0f\x56\xd6\x6b\x6a\x43\x5c\x43\xf3\xd3\xdc\xb2\x1d\xe2\xb0\x28\xc2\x6c\x98\x97\x3d\x39\x39\x1f\x27\x69\xb6\x08\xe2\x1d\x90\x6d\xa5\x6a\x12\xcd\x6f\x6b\x85\x9e\x76\x1d\xc6\xd3\x74\x11\xde\x77\x46\xbc\x88\x92\x62\xbd\x46\x5c\x04\x19\x28\x4a\x97\x63\x43\x73\x4a\x59\x1a\xe1\x34\x4f\x56\x73\x16\xcc\xc2\x45\x90\x5d\x2a\xd4\x5b\x81\x6e\x62\x40\x35\x8d\x87\x31\x22\xb2\xfa\x5f\x61\x48\xb6\xd0\x90\x44\x4d\x90\xaf\x26\xb0\xfb\x76\x51\x64\x85\xc4\xd1\x63\x6b\x43\xd6\xb8\x9c\x76\xfc\xb5\xfa\x27\xb9\xfe\x15\xea\x37\xb6\xd1\x8f\xe1\xd7\x72\x30\x58\xde\x2b\x78\xfa\xca\xa5\x9b\xa0\xf1\x7b\x7a\xf9\x47\x81\x74\x4f\x0b\x56\xc5\xc5\x30\x4f\x57\xd9\x34\x1c\xa8\xc0\xaf\xf2\x30\x4b\x82\x85\x1a\xf0\x32\xc8\xf3\xeb\x34\x9b\x29\x01\x4f\x2f\xc2\xe9\xe5\x24\xbd\x51\x03\x8e\xb3\x61\x19\x3d\x81\xa1\x2d\x4b\x63\x65\xa4\xaa\x96\x3a\x51\x15\x74\x5b\x63\xcd\x82\x7a\xd3\x46\xe0\x5f\x25\xdd\xc1\x6c\x59\xa0\x7e\xf0\x6f\x10\x25\x58\xe6\xab\x49\x9c\x4e\x2f\xd1\xd0\x59\xc6\x16\xeb\x93\x84\x9f\xf3\x30\x0e\xa7\x45\x85\xae\x2e\xb0\x8c\xda\xfd\xf6\xd8\x8b\x92\xe5\xaa\xe6\xee\xaf\xe6\xd3\xaf\xaa\xe2\x37\xb0\x8e\xba\xdf\x22\xb8\x19\x36\x95\x61\x2d\x5a\xf5\xba\x61\x06\x3a\xb4\x66\x2b\x76\xe8\x0d\x98\x61\x15\x3b\x0d\xe2\xe9\x9f\x25\x37\xbd\x61\x0f\x06\x74\x4f\x94\x58\x28\xd2\x34\x2e\xa2\xe5\xf0\x2a\x88\xa3\x59\x50\xfa\x92\x7b\x6c\x04\x07\xdd\x61\x4d\x3a\x1d\x9d\x04\x8f\x40\xe5\x38\xb0\x46\xc6\xe3\x0b\xb5\xee\x09\x52\xe4\xd5\xdd\x31\x49\x93\x70\x87\xea\xec\x7a\x4f\xaf\x3d\xa7\x66\x97\x31\x4b\x0f\x46\x61\x78\xd8\x3e\x35\x8d\x99\xae\xcb\xc2\x76\x7e\x2a\xbf\x41\x0f\xa1\xd6\xc3\x21\x9a\x00\xf0\x47\x44\x49\xec\x4f\x66\xf9\xd3\x0c\x10\x5c\x89\x52\xff\x09\xd3\x03\x0e\x7a\x3a\x44\x7d\x42\x0c\x43\xc0\xe1\xa9\xeb\x73\x3c\x09\xe7\x69\x16\xd6\x6a\x8d\x12\x40\x0c\x3a\xbb\x6a\x9e\xf1\xaf\x7f\xad\x91\xe6\x0f\x66\xe5\xe3\xa5\xbc\xa3\xf2\xaf\x81\x5d\xa1\xbe\xa9\x9b\x2e\xfa\xcb\x6c\x49\xb3\x36\x3b\x3d\x8a\x66\x7d\x53\x5f\x84\x61\x81\x96\x12\xba\x67\xc0\xdb\x30\xdf\x1d\x98\x08\xcf\xc2\x79\x0e\x7f\x42\xfb\xec\xcf\x61\x77\x1e\xa6\xab\xa2\x54\x63\xdf\xdb\x83\xeb\x30\xbb\x7d\xd3\x82\xad\xdf\xb7\xf6\xfa\xde\x01\x9a\xb9\x22\xa4\x2a\xd7\x1b\x24\xb6\xd6\xcc\x1e\x84\x40\x7d\xeb\x79\x78\x33\x8d\x83\x05\xe8\x75\xc3\x69\x94\x4d\xe3\x10\x64\x76\x84\x35\x54\x40\x1b\x2d\x1e\x4c\xe3\x20\x47\xaa\x26\x65\x2d\x8b\xb0\xdf\x87\x25\xfc\x10\xb5\x77\xb5\xe2\x60\xf8\x7d\x73\xdf\xdd\x35\xcc\xbe\xb9\x0f\xfe\xd2\xcb\x1f\xd0\xbf\x16\xf8\xc5\xaf\x8a\xea\xf2\xea\x3f\x88\x7c\xb6\x28\x7f\x36\xcd\x5d\x03\x7c\xd3\x31\x22\xe5\x7f\xa6\x5f\x13\x21\xca\x6b\x18\x1f\x00\x9d\xf1\x16\x33\xd6\x94\xd1\xe4\xc8\x68\xea\x9a\xee\x05\x60\xa7\x6d\x1f\xfe\x5d\x33\x31\x34\x34\xab\xfc\xef\x6a\xe8\x32\x00\xb5\x14\x9a\x5b\x7e\xb9\x72\x77\xb9\x24\x6a\x39\xca\x5a\x04\xa2\xc0\xd6\xef\x2c\x0c\xda\xdd\x98\xd6\xeb\xf7\x68\xd5\xdd\xd4\xa7\x68\x1d\xca\xb4\xc0\x81\xdb\xf2\x53\x56\x75\x6b\x62\x61\x1e\xd5\xac\x6e\x67\xc4\x32\x4e\xe5\xd2\x75\xe8\xbe\x2b\xcf\x5e\x2d\x68\x80\x20\x1b\x8d\xd9\xaa\x01\x37\x72\x75\x5a\x30\x2d\xa2\xab\x90\x08\xbf\x3b\x63\x57\xfe\xb2\x44\x1e\x97\x23\x8e\x3a\x13\x93\xa2\x1a\x92\xc7\x16\x18\x96\xd0\x88\xd5\xc4\x23\xe5\x98\xa6\xce\xd1\x53\x9c\x22\x5a\xfb\x51\x9f\x28\xe4\xd1\x79\x02\x82\xa1\x26\x46\x70\x39\x93\xfc\x9d\x22\xbc\x29\x86\x41\x1c\x9d\x27\x68\xb9\x89\x4f\x7d\x1c\xcc\x8b\x30\xbb\xaf\x97\xb5\x82\x49\x9e\xc6\xab\x22\xc4\xc7\x10\x5e\x24\x0d\xdb\x59\x94\x51\x16\xcc\x38\x25\x23\x35\x9d\xf6\xb6\x9e\x78\x56\x99\x6c\x35\xa3\xfe\x51\x82\x8b\x40\xc0\x88\xfa\x64\x07\x44\x24\x3b\x30\x06\x1c\x82\xd9\xdf\xcf\xff\x5e\x84\xb3\x28\xe8\xe5\xd3\x2c\x0c\x93\x5e\x90\xcc\x7a\x7f\x36\xad\xe6\xb9\xfe\xf2\xe6\xc9\x3d\x95\x30\x57\xb0\x56\xb7\xad\x05\x44\xc1\xfa\x24\x1b\x5f\xc5\xe1\xbc\x18\xeb\xf4\x1a\xa1\x29\x8a\xb2\x51\x3b\x56\x5c\x03\x8b\x94\x8b\xef\x78\x2e\x2b\x7e\xc5\x0f\x55\xad\xe1\xf4\x7f\xfe\xd4\x16\x41\x94\x70\x26\x58\x92\xe9\x30\xb1\x7a\xa9\xaa\x42\x94\x34\x39\x58\x2e\x31\x3d\xe2\x1a\x24\xf9\xe8\x69\x41\x1c\x66\x05\xfc\x1b\x60\xc5\xe1\x55\x18\x37\x3d\x1d\xac\xa5\xa6\x57\x61\x36\x8f\xd3\xeb\xe1\xcd\xf8\x22\x9a\xcd\xc2\x84\x21\x73\x11\x06\xb3\x72\x3e\x47\x53\x87\xdf\x1b\x72\x30\x22\xa7\xa1\xf2\xd5\x64\x98\x04\x57\x2c\x7a\xbe\x9a\x24\xc1\x55\x83\x5e\x2d\x37\xd0\x70\xab\x61\x77\xf5\x02\xa2\x46\xcf\x20\x45\x14\x09\xa8\x21\xe3\x90\xd5\xd1\x50\xc3\x16\x9f\x61\x5f\x57\xa0\xd7\x7c\x0a\xb2\x30\xb8\xe7\xb3\x37\xbc\x85\xab\xdb\xc3\xeb\x70\x72\x19\x15\xc3\xfa\x7b\x3e\xcd\xd2\x38\x2e\xad\xae\x48\x57\xd3\x0b\xda\xf4\x79\xff\x74\xe6\xe9\xaf\xf1\x3c\xca\xf2\x62\x38\xbd\x88\xe2\xd9\x3d\x39\x95\x51\x20\x95\x47\xb3\x90\x68\x4d\x28\x59\x19\xdd\x8f\x87\xc6\x1a\x2d\x00\xe7\x9a\x57\x61\x56\x44\xd3\x20\x1e\x8a\x69\x57\x7d\x79\x99\x45\x49\x71\x4f\x77\x45\x6c\xd7\xe0\xe7\xcf\x49\x3a\xbb\xd5\x92\xb4\xd1\xe7\xa0\xfc\xf2\x3f\xd3\x59\x3e\x8c\x83\xdb\x74\x55\xfc\x17\x5e\xf8\xef\x7b\x9a\x6b\x06\xbf\xd7\x55\xcb\xf2\x0a\x3b\x93\x63\x38\x1c\x67\x69\x5a\xdc\x43\x6f\xb1\x48\x67\x41\x3c\x9c\xc6\x69\xde\x96\x42\xdd\x6d\x32\xa8\x43\xa4\xc9\x79\x0b\x06\x05\x5f\xf1\x34\x49\x6f\x86\xf9\x45\x30\x4b\xaf\x11\x7e\x76\x3e\x09\xfe\xfc\x5f\xbd\x5e\xaf\xa7\x0f\x78\xff\x68\xe6\xff\xea\xf5\xa8\xba\x83\xe9\xe5\x2c\x4b\x97\x2d\x1c\x8c\x18\x9e\x2b\xbc\x26\xe7\xbb\xef\x90\x10\xdd\x73\xd1\x43\x44\x6c\x21\x18\x43\xbb\xb0\xe0\x27\x1e\x2c\x7f\x7d\xf7\xc2\xc2\x0b\x84\x78\xcc\x6a\x76\x85\x07\x0b\x4a\x3f\x5f\xa2\x34\xa1\xc9\x3c\xba\x09\x67\x68\x94\x9f\xa4\x45\x91\x2e\xea\xe1\x5e\xdf\x41\xc3\xe5\xdd\x30\x4a\x66\xa5\xd7\xd1\x1d\x7d\x83\x9d\x39\x10\x37\x0d\xa3\x22\x5c\xe4\xf4\x66\x1d\x5c\xd9\x55\x1b\x5a\x91\x00\xd5\xca\x46\x19\xa7\xfd\x44\x62\x0d\x67\x51\x10\xa7\xe7\xf7\xec\x7e\x22\x21\x02\xda\xf1\xf3\x61\xf8\x4c\xae\x80\x91\x94\xd0\x2f\xf9\xa2\x8a\x25\x6c\xc8\x28\x0f\x28\x3e\x47\x40\xb6\x55\xb9\x51\x16\xe8\x26\xbe\xaf\xa4\x81\x9c\x13\x40\x3d\x8d\xe8\x13\x4c\xc0\xc0\xf9\x67\x87\x79\x64\xe1\x8f\xf9\x7c\xce\x7e\x6d\x2c\x82\xec\xa6\x83\xde\xf5\x45\x54\x84\x1d\xd7\x61\x38\x9d\x02\x5b\x81\x69\xba\xf2\x58\xef\x55\x73\x17\xa3\xf9\x1b\xf4\x6c\x7d\x50\xfe\xd1\xcc\x76\x70\xba\x5a\x91\xc7\xa8\x8c\x7b\x58\x07\x1d\xd8\x6f\xc3\x61\x30\x9d\x86\x79\x1e\x4d\xe2\xf0\x1e\x31\x8e\xec\x1d\x2c\x9e\x55\xaa\x86\xd1\x84\x89\xd6\xc9\x85\x14\x88\x5e\x40\xdb\x7b\xbe\x0c\xa6\xe1\x70\x12\x16\xd7\x61\x98\x10\x66\x0f\xfa\x4b\x5e\x04\x59\x41\xd2\xae\x1a\x1e\xf4\x64\x31\xe3\x04\x98\x6c\x43\x91\xf1\x3d\xd4\x46\x26\x16\x03\xeb\x3d\xd8\x6c\x12\x86\xc6\x49\x5a\xfc\x09\x46\x9e\x72\xfe\xf3\xef\x27\x8a\x0c\xd2\x68\xf7\xcc\x3e\xd2\x2f\xdd\x11\x13\xf8\xd4\x2d\x6d\x87\xb5\x6e\x23\x0a\x5c\x33\xda\x43\x24\xf7\xca\x4c\xc9\x9e\x26\xd9\x2a\x60\x48\x96\xe9\x1f\x00\xe0\x31\xd8\x10\x4d\x2a\xd1\xa7\x6a\x26\x67\x52\x9b\xd8\x06\x58\x5c\xe0\xf0\xc5\xe5\xa0\x57\xb6\x6a\x34\x4d\x93\x56\x56\x04\x90\x75\x69\x9c\xa9\xd2\x41\x90\xf7\xf3\x28\x8e\xc7\x7f\xf8\xd3\xf2\xcf\x0e\xf8\x85\x71\x10\x4d\xdc\x32\xe8\x21\xc8\x27\x3b\xa4\xb6\x91\x3f\x27\x44\x84\x8d\x55\xcd\x59\x61\xa0\xcd\x2d\x23\xcc\xfc\xaf\x0b\x8b\x8e\x79\x91\x77\x9c\xdd\x62\x1b\x71\x37\x95\x5a\xbd\x72\xda\x46\xc7\xed\xcc\x4c\x4a\xd8\x3f\x71\xb2\xd2\xc0\x9b\x03\x1d\x07\x34\x70\x35\xe4\x57\xf0\xf3\x34\x2d\xe8\x29\x0c\xed\xde\x80\x13\x0b\x93\x19\x3d\x97\x40\xcb\x2d\x38\x21\x62\x9d\x07\x94\xc3\x3d\x08\x95\x35\x04\xf8\x35\xcd\xa2\x30\x29\xc0\x1a\xee\x38\x0e\x92\x59\x3e\x0d\x96\x61\x15\x05\x08\x75\xec\x38\x57\x17\x8a\x33\x75\xfe\x88\x5b\x2d\x49\xc1\x7f\x79\x3d\x41\x32\xbc\x34\x4d\x87\x34\x83\xa8\xb5\x59\x06\xe0\x9a\x6c\x08\x92\x9f\x46\xd1\x75\xc4\x53\x85\xae\xdd\x22\x3a\x36\x68\xb0\x2c\x4b\x21\x68\x20\xe2\xeb\x41\xaf\xc4\xb2\x2c\x0b\x5b\x61\xf2\x1d\xce\x12\x13\x3f\xc8\x2e\x03\x06\xdf\x79\x82\x85\x66\x76\xa5\xa1\xaa\x7f\x95\x33\x37\x7c\x8b\x8b\x98\xa3\x20\xc5\xb7\xce\x37\xb0\x68\x1f\xa1\xcc\xa2\xab\xa8\xfc\x17\x7b\xe1\xc9\x21\x21\x92\xe0\x0a\x2b\x75\x39\xa5\x17\x65\x8f\xad\x61\x0c\x12\xc0\x6c\xb8\xfa\xc3\xf6\x9d\xc0\x0d\xc8\x72\x4b\xcc\x75\x1e\x4e\xd3\x64\x16\x64\xb7\xc3\x00\xc4\xd4\xc4\x1b\x55\x08\xdd\xc6\xc8\x9b\xb6\x37\x09\x42\xb2\xdc\x11\x93\x47\x44\x7d\x86\xa6\xdb\x8a\xc3\x61\xc4\xc3\x18\xb1\x74\xdb\x74\x74\xb2\xdc\xc7\xca\xf5\xb9\xe1\x19\x53\xb2\x1c\x0c\x3f\xf2\xd6\x73\xe8\x3a\x05\x13\x2a\x9a\x20\x17\x4b\x30\x45\x72\x88\x29\x92\x10\x91\x9d\x93\x39\xc4\x9c\xec\x67\xe5\x18\xd0\xe2\x16\xe1\x44\xe5\xbb\xa4\x0c\xfb\xf8\x06\x69\xd7\xbe\x4a\x75\x0c\xac\x9b\x22\x3f\x03\x46\x7a\x10\xf6\x83\x68\xa3\x0c\xd4\x4a\x6f\x84\xf8\x47\xec\x0f\x8d\x4a\x90\xfa\xc3\xfd\xf6\x58\xa1\xea\x32\xe9\xba\x4c\x4e\x5d\xa8\x27\xb5\x57\x67\xe2\x15\x42\x2c\xba\x42\x8b\xae\xd0\xe2\x09\x67\xea\xba\xed\x29\x54\x68\x11\x12\x02\x2c\xba\x42\x9b\xae\xd0\xe6\x54\x88\x3a\x73\x7b\x85\x36\x5e\x21\xc4\xa2\x2b\x74\xe8\x0a\x1d\x4e\x85\xba\xee\xb8\x9e\x8a\x4a\x1d\xbc\x42\x88\x45\x57\xe8\xd2\x15\xba\xdc\x0a\x2d\xd7\x9e\x29\x54\xe8\x92\x15\x96\x58\x74\x85\x1e\x5d\xa1\xc7\x6b\x43\xe8\x96\xda\x2b\xf4\x88\x36\x04\x58\x74\x85\x3e\x5d\xa1\xcf\x93\x10\xfa\xb9\xf6\x0a\x7d\x42\x42\x80\x55\x55\xd8\xd3\x26\x59\x90\x94\x03\x7f\x55\x63\xf3\x85\xb3\xbc\x5c\xaf\x6b\x2e\xa2\xa4\x5e\xca\x80\x61\x2e\x1d\x8a\xe0\x2e\x80\xa9\xec\xaf\x60\xc0\x7c\xd2\xca\xc1\x2e\x8e\x92\x4b\x96\x93\xbf\x02\xce\xb7\x1a\x9e\x3e\x44\x01\xd8\xe5\x2c\x01\xc9\x19\x1a\x83\x71\x96\x65\x2b\x18\xc3\x1d\x48\x09\xc3\x22\xd4\x06\x00\x91\xe0\x08\x86\x70\x79\x25\x42\x24\xba\x62\x19\x04\xda\x7c\x05\xdb\x89\xb3\x70\x9a\x66\x30\xc0\x05\x31\x0e\xa7\xce\x79\x3a\x5d\xe5\x32\x49\x20\x00\x8f\x5d\x51\x09\x85\x7b\x5f\xed\x7b\xa7\xf3\x79\x1e\xd6\x13\x44\x86\x19\x74\x8c\xab\x9c\xb1\x31\x45\xf5\x4c\x8f\x2d\xa9\x67\x79\x12\x7a\x6c\x59\x33\x75\x14\x52\x04\xb3\xb4\xe1\x79\x96\x5e\x8f\x75\xb8\x1a\x99\x5f\x64\xa5\x54\xfa\x0e\x71\x12\xb5\x9e\xef\xf9\xcc\x5c\x18\x9e\x8d\xe2\x48\x8a\x16\x63\x04\x05\xf7\x4a\x23\x3a\xb1\x04\x53\x0f\xe9\x78\x1c\x62\x0b\x57\x10\x44\xa1\xcb\xa0\x67\xff\xf2\xe3\xdc\xa2\xe8\x67\x9b\x87\x89\x61\x5b\x50\xcb\x1e\x9a\x6e\x50\xcb\x10\x56\xbd\xf1\x2e\xea\x29\x79\x58\x14\x51\x72\xde\xf4\x90\x26\x4e\xa7\x3f\xc1\x58\x16\xeb\x10\x35\xae\xc6\x41\xa6\xbf\x21\xec\x7b\x9e\xcf\xaa\x08\xf5\x40\xcf\x2a\xf9\xe5\xb0\x23\x2e\x44\xa4\x31\x00\x86\x45\x5e\x19\x97\xb4\x80\xed\x06\x82\x38\x09\xef\xe8\x3a\x2b\x04\xd3\xcb\xb1\x8a\x44\x65\x55\x35\x6c\x8f\x66\xc9\xf2\x04\x10\x16\xd2\x84\xd5\xba\x1e\x2f\x98\x16\xb4\x96\x48\x52\x61\x21\xa1\x51\x81\xac\x9c\x32\x2e\x69\x69\x6b\x01\x71\x89\xb0\x1d\xf8\x31\x89\xe5\x81\xb1\x5a\x54\x21\xaf\x90\xa8\x8f\x1c\xe9\x39\x94\x85\xb2\x70\x4b\x19\xda\x9c\xad\x19\xee\x61\x4b\xe6\xa0\x4d\x73\x94\x75\x84\x6d\x7e\xac\x3f\xab\xaa\x57\x2c\x5c\xde\x8a\x45\x23\x1c\xbe\x5a\xe1\x3a\x22\x03\xe2\xc4\x1b\x1c\x00\x2a\x64\xe1\x69\x90\x22\xc2\x05\xe1\x93\x61\x54\xcd\x27\xc5\x82\xd1\x01\x8d\x50\x32\x19\x04\x4d\x44\x22\x9b\x1c\x46\x40\x48\x24\x5d\x3b\x9c\x4a\xa8\xc5\x11\x28\x4c\x82\x49\x1c\xce\x54\xda\x43\x0a\xca\x32\x44\x82\xcb\x94\x2a\x80\x54\x60\xa2\x5d\x2d\x04\xfc\x7d\xb3\x8e\x25\xed\x0b\xc4\xa2\xd7\xa0\x67\x48\xbb\xc3\x2c\xca\x41\x15\x72\xe5\x89\xa0\x58\x8e\x6b\x48\x99\xca\x58\x20\x79\xad\xed\x8a\xaa\x40\xef\xa7\xab\x2c\x4f\xb3\x71\x92\x96\x8e\x29\x4e\xaf\xc3\x99\x44\xfa\x9e\x36\x0f\x24\xae\x40\x61\xd8\x61\xa8\xf0\x01\x94\x46\x28\x11\x2d\x0e\x50\xdb\x80\x56\x93\x92\x96\xb7\x0f\x7d\x2c\x9d\x16\xf9\x5a\x5b\x8a\x4b\x4d\x22\x21\xb3\x1d\x29\x6b\x4e\x66\x6e\xc3\x83\x91\xc4\x4c\x12\x4a\x7c\xa8\x96\x18\xab\x9d\x1e\x07\x52\x1c\x97\x71\xc8\x49\x81\x64\x61\x9c\x8c\x96\x5c\xd6\xf6\xc6\x13\x52\x14\x4b\xcb\x39\x85\x5b\xa4\xcb\xb1\xa3\xf7\xe1\x66\x48\xf9\x43\x9d\xaf\x60\x5c\xa7\x2a\xf8\x73\xe8\xe8\xfd\x41\xf9\x97\x74\xe7\x50\xac\xa4\xda\xce\x40\xc4\xad\x62\x40\x34\x86\x8a\x39\xb5\xd5\xa2\x82\xa3\x6a\x6a\x8a\x75\xb5\xe2\x29\x98\xa1\xa8\xaa\x0e\x28\x4a\x26\xda\x5a\x4f\x17\xfd\xb5\xda\xa4\x6a\x6d\xaa\x1a\xe4\x04\xd3\xa5\x69\x83\xa5\x40\x60\xdb\xe0\xa7\xc6\xb8\xb1\x5b\x62\xf0\x24\x74\x57\x23\x6e\x9f\xda\x76\x41\x6a\x13\xb3\x75\x2a\xac\x86\xd3\x89\xc5\xae\x4d\xd1\x4c\xa9\xb9\x27\xcc\xe1\xaf\x5a\xcb\x74\xad\x19\x93\x9e\xaa\x69\x58\x05\x41\x32\xf2\x3d\x55\xd2\xac\x1c\x5e\x99\xad\x0e\x23\x72\x83\x45\xee\xfa\x4a\x5a\x5f\x61\x4a\x25\x80\x61\x5b\xb6\x7d\x22\xc4\x80\xc8\xea\x6b\x37\x25\x34\x35\xc1\xce\xeb\x83\x93\x71\xa6\xe3\x0c\xaa\xff\x34\xc3\x69\xe6\xaa\x86\x2c\xdc\x26\xd7\x88\xb9\x51\x2f\x17\x84\x8d\x78\xa9\x25\x63\x61\x5d\xf2\x10\x9b\x0f\x23\xa8\xad\x6d\xf9\xb9\xa9\x81\x57\xab\x64\x4b\x84\x43\x01\x3b\x05\x83\xad\x82\x37\x1f\xc7\xf0\xd6\x07\xaf\x22\x45\x54\xf2\xc2\x88\x5c\x4b\xe0\xfc\x4e\x3a\x1f\x16\xb7\xcb\x96\x95\x01\x50\x4d\x05\xd9\xa2\x7b\x82\xaa\x1c\x16\x27\xcb\x0e\x28\x1d\xb8\x1f\xa3\xdb\x60\xea\x52\x48\x34\xdd\x5a\x89\xba\x50\x55\xa3\x70\xd7\x99\xa4\x57\xb4\x54\xef\xd6\x20\x16\xe4\xeb\x4c\x86\x64\x9d\x89\x3a\x90\x02\x8f\xd2\x92\xb8\x28\x06\xc5\x22\x50\x74\xae\x0f\xfe\x22\x38\x91\x0e\x0a\x4b\x72\x3a\x3c\x99\x0b\x6e\xb6\x39\x70\xd9\x7d\x5e\x9f\x07\x12\x74\x94\x0d\xdb\x80\x8b\x73\x0f\xeb\x95\xd7\xd6\xdd\x46\x78\xed\x8d\x8e\x3c\x49\xab\xaa\xee\x31\x76\x37\xe4\x0a\xb3\x33\xaf\xf2\x2a\x95\x50\x79\xd2\x72\x5d\x8e\x68\x63\x44\x7d\x17\xa4\xda\xf1\x40\xb7\x8e\xd0\x3e\xb3\xd2\xf1\x40\x86\x8b\xbf\xb4\x59\x96\x2e\x67\xe9\x75\xd2\xfc\x34\x2c\xd2\xf3\xf3\x58\x34\x38\xcb\x30\x18\xde\x95\x80\x95\xe9\x73\x62\x6b\x66\x53\x0a\xff\x99\x3f\x80\xfd\x0d\x16\xa8\x25\x32\x2a\xad\x5c\xaa\xe3\x77\x69\x11\xb5\xf5\x4a\x65\x02\xdb\x5b\xc0\x94\x55\xd9\xb2\x56\xa9\x84\xda\x49\x49\x6d\xcb\x94\x2a\xb8\x2a\xeb\x96\x0d\x76\x8f\xa6\x53\x07\xe7\xf5\x74\x15\x1e\xeb\xcf\x2f\x82\x65\xf8\x7f\xfe\x2b\x48\xce\xe3\xf0\xdf\x4f\x98\x55\x0d\x35\x8a\x68\x1e\x2b\xa5\x28\x92\x78\x53\x4e\xd7\xa1\x2b\xe3\x57\xd2\xb0\xeb\xb2\xba\x26\x49\x25\x2e\xb7\xad\xd6\x8d\x08\x4b\x38\x96\x2c\xdf\x71\x56\xed\x4e\xff\xa4\x56\xec\x0c\x7c\xc5\x0e\xfc\x92\xe1\x77\x1b\x36\x6a\x33\x92\xd3\xcd\xba\x80\x80\xd6\x06\xad\xb4\x45\x8a\x7c\x1e\x37\x33\xf8\xed\x10\x6b\xe1\x6c\x7b\xea\xdb\x86\x79\x93\x24\x51\x7c\x0a\xf3\x4c\x94\x26\x6d\xdb\xfd\xce\xf6\x28\x59\xf8\x51\x42\xed\xac\x76\xd9\x92\x8e\x0a\x2e\x71\x37\xc2\x87\x97\x19\xd6\xec\x8b\xc4\x1a\xea\x86\x7d\x91\x58\x56\xdd\x4a\xcf\x51\xe1\x6e\x1d\x8a\x5b\xea\x8b\x32\xf6\xd6\x24\xb6\xd5\xbe\xa8\xc4\xdf\xd6\xf4\x77\xbf\xf1\xa0\xb0\x81\x7f\x5d\xcf\xf7\x6d\xe2\x91\xee\x9b\x43\x44\x54\x96\x3f\xf6\x24\x58\x43\x4f\x83\x97\x89\x20\x24\x16\x6f\x2e\xc2\x64\x25\xe9\x70\x15\x5a\x39\xf1\x17\x61\x89\x44\x50\xaa\xb2\x0d\x99\x57\xb1\x44\xe5\xd2\x3a\x15\xf0\xa4\xd5\xad\x25\xa8\x32\x36\xa7\xea\xfb\x72\x64\xf1\x1d\xd9\xc8\x82\xad\x5f\x6e\xa4\x6f\x55\x3a\x12\x1d\x76\x26\xb1\x21\x2f\xd5\x18\x6c\x38\xca\xfd\x5e\x49\x15\x34\xbc\x5a\x0f\x57\x13\x8d\x42\x20\xaf\xfa\x9a\xf5\xd2\x1e\x58\xa7\x69\xef\xd4\x3d\x5c\x53\x1d\x85\x14\xa3\xca\xe4\x55\xc0\xea\x5e\xe3\x3d\x75\xa2\x9b\x6c\xce\x20\x9b\x5e\x0c\x27\xe9\xcd\x80\xfc\x84\xb3\x59\x83\x50\xdf\xc8\xad\x05\xce\xf5\x05\xea\x02\x46\x93\x4b\x02\x66\x8a\x68\x2e\x60\x10\xab\x45\x0f\xb9\x2c\x54\x89\x2a\x58\xfd\x81\x00\xe2\xa5\x1d\x01\xba\x26\xc3\xdf\xc6\xf2\x4c\x5d\x2f\xb3\x0a\x83\x6a\xe4\x2d\xb1\xb0\x48\x34\x9f\x6a\xcb\x24\x15\x9d\xbf\xd8\x01\x1f\x16\xfe\xc5\x1d\xce\x39\x68\x9a\x08\xaf\xb9\x25\x0d\xd3\xfc\x41\xa7\xc4\x06\xc7\x15\xcd\x5e\x1c\x4c\xc2\xff\x9f\xbd\x7f\xed\x71\x1c\x47\x16\x84\xe1\xef\xe7\x57\x68\x7b\x5e\x03\x95\x53\xb6\x8e\x2e\x96\x6c\x67\xa2\x0b\xd3\x93\x3d\x85\xf7\x43\x0f\x76\xb1\xfb\x2c\xb0\x7b\x1a\x8d\x03\xa5\xad\xcc\xd4\x29\x59\xf2\x23\x29\x2f\x35\x46\x9d\xdf\xfe\x40\xbc\x48\x41\x32\x48\x51\xb2\xb3\x32\x6b\x4e\x4e\x4f\x57\x97\x45\x32\x48\x06\x83\xc1\x60\x30\x2e\xb9\x34\x0c\xf6\x11\x19\x02\x5e\x42\xbf\xe2\x4f\x23\x90\x5e\x15\xd5\xa7\xf0\xbe\xcd\x0c\x63\xd4\xe0\x78\xba\x61\x28\x1a\x76\x38\x1a\x55\x17\xae\x6d\x8e\xce\xe6\x72\x7c\x14\xd7\x05\x09\xde\x3a\x2e\x96\xeb\xa4\x28\xab\x42\xa8\x57\x6f\x16\xb4\xa5\x1e\xc9\x46\x0f\x52\x99\xa3\x81\x54\xeb\x85\x2f\x06\x50\x25\xff\x1b\x0e\xa0\xda\x47\x43\xfd\x5f\x04\x47\x52\xf0\x53\x9a\xaf\x85\x67\x36\x69\xe9\xb0\xee\xc6\x81\xc5\xff\xac\x95\x20\xa6\xd1\x2c\xb8\x5e\xba\x5e\xf4\x8b\xcf\x52\xa6\xf0\xff\xc2\x10\x9e\x4b\x92\xef\xe7\x9a\x54\xf6\x7d\xfe\x87\x10\xc2\x93\xc3\xa1\x10\x83\x5f\x7c\x12\xea\x33\x94\xc2\xa2\xd2\x88\xa6\x11\x2f\xf2\x43\x39\x2c\x2a\x69\x4c\xa2\x80\x06\x9f\x2d\xa6\x01\x66\x12\x86\xee\xaa\xed\x26\x0c\xdc\x60\x93\x2f\x56\x6e\xb8\x5a\xac\xdc\x65\xb0\xf0\x49\xbe\xe3\x6b\xdf\x5d\xb6\xc5\xed\x77\xf2\x9f\x65\x90\xf8\x60\x64\xdd\x7f\x59\x13\x5f\x18\x04\x4f\xd5\xa2\x4b\xd2\x22\x67\x5c\x51\x12\xb8\xb0\x28\x5e\x57\x8c\x4d\x91\x4c\x56\xbd\xf7\x1c\x54\x73\xf5\x0e\x4e\xe4\xef\x24\xaa\x66\x17\x0b\x8d\x6e\xcf\xa6\x3c\x68\xf7\xa6\x43\xe2\x6f\xa3\x3b\x93\x15\x69\xf7\x25\x5e\x0e\xcb\x8e\x48\xdc\x13\x1e\xe3\x94\xc5\xa6\x47\x80\x93\xa6\xbf\x37\x5f\x0f\xe9\xcf\x24\x92\x8c\x3c\x38\xa5\x1c\x1b\xe1\x50\x25\xa5\x02\x8b\x12\x24\x44\x4b\x68\x4f\xfa\x13\x0e\xef\x5e\x18\x90\x16\x64\x9f\xed\x76\x79\x6a\x33\x77\xc9\x88\xc3\x54\x53\xb2\x7b\xd1\x4c\x13\x05\xa8\x05\x66\x83\x59\xd5\x80\x64\x70\x8c\x43\x6b\x81\x83\xd4\x81\x3b\x8a\x0b\xa6\xb8\xf6\x7d\xe4\x02\xa0\xae\x40\x94\x04\x95\x66\xda\x92\xb6\x9d\xc1\x86\x42\xae\xce\xdf\x8b\x4d\xe0\x94\x37\x65\x1d\x10\xe3\xa0\xde\x6d\x20\xf4\x36\x10\x56\xf1\x6c\xcf\x73\x99\x10\x5f\xd1\xb5\x71\x75\xa4\x18\xc8\x2f\x2b\xfb\xf5\x3c\x09\x75\x2d\x7b\x0d\xc1\x8d\x0a\x95\xa6\x71\xbc\xec\x21\x85\x1a\x1f\xbe\xfe\xe6\xd5\x98\x78\xf0\x6a\x1f\x55\x73\x0f\x58\x28\x5e\xaa\xa5\x2a\xda\xb6\x4a\x3b\x04\xaf\x1f\x11\xf3\x11\x43\xcf\xae\xb6\x6b\xa5\x44\x6c\x89\x98\x64\xe0\xb6\x7e\xd8\xd0\xe4\xe5\xd2\x0f\x10\xaf\x39\x04\x49\x07\xc5\x88\x2f\x63\x25\x2b\x78\x83\xb0\x34\x70\xde\x4f\x02\xec\x24\xf8\x96\xb8\x79\x56\x7c\x59\xd0\xd8\x7b\x97\xc4\x61\xb5\x0b\x5c\xb2\x0a\x92\x50\x4d\x6f\xd2\x56\xef\xc3\x94\xb4\x75\x2e\x70\x67\x75\x06\x9a\xa8\x38\xd2\x9d\x35\x6c\xaa\x12\x19\xea\xe1\xa1\xd8\xa5\x55\xbb\x90\xbc\x9b\x6d\x9e\x6d\xbf\x48\xdd\x6c\xd2\x68\x75\xb3\xc5\xbb\xa1\x82\x53\xd7\x0f\xad\x6a\xd1\xcf\x63\x56\x67\x8d\xd4\x4f\x14\x47\x9b\x9b\x35\xde\x0f\xab\xdf\x75\x44\xeb\x6a\x50\xe6\x2a\xb6\xbd\x62\x4c\x87\x3c\xab\x9b\x05\xb9\xf6\x52\x53\x38\xe2\xdf\x80\xe8\xe8\xba\x98\x97\x30\xd1\x91\x12\xfe\x48\x8c\x43\xca\xc2\x26\x3a\x9e\xf3\xa7\xed\x76\xeb\x64\x45\x9d\x36\xba\x1a\xfd\x1c\x8b\xe4\x51\x09\x4b\x3a\x27\x10\xb6\xdb\xed\x05\x85\x42\xa6\xc5\x8c\xde\x9b\x74\x8f\xef\x44\x41\x9f\xc9\xc3\xcf\x09\xed\x98\x31\x20\x08\xb8\x62\x88\x07\xca\xeb\x48\xeb\xcc\x62\x82\x7e\xff\x89\xc3\xf1\xc6\x71\xac\x1f\x2f\x07\x14\x93\xff\x5d\x28\x09\x19\xec\x22\x69\x74\xe0\xd4\x28\x1a\xb6\xa9\xec\x70\x37\x75\x39\x48\x23\x44\x54\x47\xc2\xc0\x80\xf3\xa6\x29\xa8\x27\x32\xea\x94\x73\xe9\x5d\x89\x61\x19\x79\xec\x4e\x31\x0c\xaf\x27\x41\xe5\x1a\x58\xd4\xfe\x1e\xf3\xae\x66\x98\xcf\x8a\xfb\xb4\xca\xe4\x65\x41\xa1\x75\xae\x0a\x22\x1d\xf8\x9c\x52\x28\x5f\xc2\x89\xc5\x47\x89\x85\x11\x22\x42\x33\x8c\xc7\x31\x60\x04\x51\xf4\x50\xea\xeb\x3a\x6e\x50\x3b\x69\x52\xa7\x8b\xac\x38\x15\x19\x9a\x99\x6a\x19\x92\x5a\x75\xf2\xbe\x1b\x49\xbc\x0c\x86\x42\xc3\xf2\xb0\x3a\xce\x82\x31\x11\x18\x41\x91\x66\x51\x18\x11\xb1\x1d\xdb\xe5\xda\x56\x74\x68\x5d\x0a\x07\x96\xb2\x41\x60\xe7\xdf\x89\xf1\x8c\x08\xd0\xac\x24\x26\xb1\x0c\xaa\x2d\xa1\xb2\x8b\xaa\x2d\xa5\xc3\x64\xd8\x20\x8b\xc5\x51\x42\x7e\x48\x69\x1d\x10\xf5\x7a\xdf\x38\xa9\xb3\x5d\xda\xb5\x26\xbf\xa4\xfc\x06\x43\x8f\x56\x22\x67\x93\x63\x84\x49\x3d\xc1\xb0\xb1\x62\xaf\x58\x40\x59\x1e\x68\x54\xb6\x2b\x10\xe8\x8e\x26\x7c\xe0\xf1\xc3\x87\xc9\xe8\x0a\x6d\x37\x2c\xeb\xc9\x0d\x65\x89\x4a\xdb\x69\xa0\x76\xaa\x6c\x63\x6d\x63\x18\x28\x13\x6b\x8d\xec\x37\x36\x74\x9a\xb7\x92\xa4\x2b\x83\x31\x2c\x51\x20\xe3\x13\x12\x70\x30\x4c\xcc\x56\x14\x97\x31\xde\x2b\x94\xe7\xd5\x18\x55\x31\x16\x3b\x13\x6b\xaa\x86\x98\x8a\xb1\x8c\x06\xbc\xa9\x3c\xba\x83\x8f\x8f\x0e\x1f\xd6\xc1\x97\xb2\x1e\xf0\x1c\x23\xa8\xfe\xb9\x7b\xb3\x8d\xa8\x35\x9e\x10\x46\x0f\x46\x0f\x5b\xcf\xba\xa3\x18\xe4\x70\x71\xea\x32\xcf\x76\x84\xe7\x58\x64\x47\xe8\xc6\xd2\x25\x3e\xe9\x82\x0f\x6b\x52\xbb\xc8\x21\xa1\xb9\x74\xd0\xed\x56\x0d\x3c\x20\x6a\x49\x02\x04\x9f\x45\x53\x1e\x08\x8b\xc1\xa3\xfe\xcb\xa5\x80\xdb\x0d\x11\xa4\x90\x0c\x00\xc4\xda\x37\xf4\x86\x54\x98\xd6\xa1\xe6\xd9\x0f\x48\x3c\xf2\x23\x0a\x76\xd6\x0b\xb9\x6d\x75\x18\x06\xc2\xb7\x9a\x79\x8c\xe5\x09\x17\x3d\x81\x63\xf0\xfa\x1f\x86\xea\x9d\x0f\xdb\xa3\x20\x80\xab\x14\xb7\x4b\x23\x31\xe8\x77\xee\xdc\x89\x5e\x3c\x74\x9c\x7e\xf3\x9f\x35\x78\xdc\x0a\x0f\x57\xaf\x0b\xa3\x3f\xbc\x84\xcc\x54\x01\xaa\x39\xd2\x75\xfb\x0f\xae\xe6\xd0\x9d\x29\x73\x87\x35\xbb\xb0\xe9\x14\xf1\x01\xfe\xd3\x6e\x9d\x86\xe9\xc6\xa2\x57\xe9\x3c\x99\x3b\xac\xa9\x31\x45\xb9\xf6\x3c\xe3\x62\x29\x18\x76\x5b\x8f\xa6\x09\x36\xdc\xd5\x04\x8e\x2d\x5f\xd5\x06\xa5\x5b\x84\x8f\xc3\xf8\x86\x70\xad\xd1\x9b\x9a\x90\x98\x1f\xc6\xe7\x10\x37\x6e\x37\x13\xce\x14\xeb\x66\x8e\x95\x4a\x3a\x71\xa7\x4f\x2e\x26\x33\x0d\x94\xcd\x28\x19\xe7\xb8\x39\x87\x79\x28\xc7\x5e\x93\x21\x04\x69\x60\xa1\xfc\x4d\x4d\x01\x93\x17\x12\xdf\x0a\x92\x1d\x67\x4a\x20\x1a\xbd\x2d\xd4\x97\xdc\x15\xc6\x8e\x7f\x90\x9d\xc1\x28\xe6\x9d\xa5\xbf\x22\x4b\xef\x17\x03\x3c\x08\xf3\x5c\xf8\x7f\x60\x69\x38\xf3\xec\x70\xd9\x8a\x65\x1f\xfc\xc3\xf3\x1c\xfc\x7b\x41\x8a\x48\xf2\xd7\x4b\x72\x75\xfc\x40\xdc\x89\xfa\x37\xb2\xce\x26\x80\x8f\xf0\xf0\xcc\x37\xfd\xe1\x59\x4e\x55\x87\x29\x19\x69\x5e\x06\xa6\x6f\xb6\x9d\x02\xd5\x5f\x7c\xa4\xa4\xc6\x3c\x4d\x2f\xff\x14\xde\x6c\x36\xb7\x5b\x22\x2c\x3a\x2c\x5e\x42\x0f\x70\x5b\xe6\x79\x72\xa0\x19\x54\x70\xa6\x16\x0e\x34\x90\x5e\x9d\x7e\xfa\xe9\xea\x36\x2f\x93\xe6\xb2\x1d\x7b\x97\x80\x16\x28\xdd\xe9\xdf\x11\xa7\xac\xff\xf3\x61\x41\x6c\x21\x2f\x1c\xe0\xa7\xe5\x86\x4c\x3c\x7c\x23\x46\x58\x7e\xc0\xfe\x08\x90\x5c\xbd\xbd\x4d\x96\x21\x89\xaf\xd1\x5c\x6b\x93\xb4\xff\xa0\xe6\x5a\x4a\x5f\xfa\xf4\xd7\xbd\x31\xd7\x75\x52\xa5\x8d\x39\x91\xb5\xa5\x01\x57\x3c\x0b\xae\x37\xbf\xf9\x6e\x40\xec\xaf\x82\xc4\x73\xe3\xf5\x2c\xb8\xe6\xff\x81\x26\x5a\x0b\xff\xb7\x98\x98\x3e\x79\x6d\xd1\xc6\x5d\x2f\x67\xc1\x75\xe8\x06\x4b\xa4\x91\x0f\xff\x05\xa6\x50\xde\x2f\xd0\x06\x6a\xe6\xfd\x32\xcd\x0c\x0a\xb5\x9f\xe9\xce\x5c\x0d\x59\xa3\x5b\x8b\xfc\x2d\xdd\xfd\x27\x26\x17\x58\x37\x7e\xc8\x79\x90\xd6\x3e\x41\x1e\xd5\x18\x5a\xc3\x9a\x34\x00\xd0\x31\x79\x01\x9d\x30\x74\xb8\xd7\xfb\xcd\x5b\x95\x0d\x09\x82\xb6\xf1\x76\xe9\x1d\xd8\xb8\xed\x5e\xa6\x3b\x17\x6e\x66\xb6\xbf\x05\x25\x0f\x4c\xbf\xd9\x3d\xe9\x99\x15\x27\xab\x5e\x6f\x22\xb4\x26\xe1\x96\x8c\xaa\x17\x96\xa2\x24\xd6\x01\x68\xd2\xfd\xd4\xbe\xdb\xa6\x56\x6a\x1f\x1d\x84\x41\xf5\x6a\xa0\x69\xa8\x57\x17\x69\xd4\xb3\x42\x6b\x2a\x7c\x0d\x36\x5e\x6a\x3a\xa7\x2e\x43\x14\xf5\xf6\xea\x2e\x11\x44\x95\xdd\xdd\x81\xf7\xdc\xd1\x6a\x3b\x1b\x68\xd3\x66\x67\xd4\x69\x1d\x96\x92\xf2\x48\x6e\x6e\x93\x45\x98\x5f\xfb\xc9\x1b\xf3\x06\xdc\x4b\x02\x51\xc3\x44\x33\x5f\x22\x0a\x67\x45\xca\x56\xa6\x8a\x52\x59\x2f\x68\x5f\x3d\x65\x79\xbe\xd8\xde\x27\xc5\x5d\x7a\x49\x3a\x83\x8f\x29\xe4\x03\x7c\x47\x59\x94\x0f\x8d\x3a\x55\x2a\x99\x30\x9c\x1f\x05\x9c\x13\x7d\x97\x66\x15\xac\x57\xae\x57\xd5\x73\x50\xf4\x16\x44\x54\x6a\x57\x02\xc5\x88\x6f\x61\x32\x15\x59\x53\x1e\x78\xff\xe7\x96\xa7\x3c\x3b\x17\x3e\x79\xae\x9d\x9b\x9c\x3a\x5a\x9b\xe3\x4d\xd7\x23\xbd\x72\x8b\x09\xe2\x45\x05\x3f\xe0\xf9\x30\xa7\x34\x7f\x66\x30\x80\xc5\xa7\x63\xb8\xde\x6b\x18\x69\x7f\xd1\xb7\xea\x4e\x7a\x2b\xb3\xeb\x48\x32\x4a\xe0\x8a\x85\xd1\x8f\x33\x26\xae\xda\xbd\xd4\xa8\x66\x9b\x23\xe6\xd5\x99\xae\x01\x69\x19\x0f\x5c\x00\x72\xb2\xb1\x10\x4c\x8c\xba\x99\x32\x14\xbb\xda\x1a\xde\x4b\x47\x61\x1f\xc6\xbe\x25\x49\x14\x99\xe1\x89\x94\x44\xd1\x7c\xf6\xf6\x2f\xb4\x56\x5d\x33\xfd\xc1\xcb\xac\x3b\xe1\x40\x96\xeb\x2e\x9e\x87\x80\xef\xe0\x2f\xbd\x16\x53\x03\xaa\x17\xc3\xeb\x9d\x07\x98\xbd\x96\xc7\x20\x70\x81\x4f\x90\xf8\x0c\x68\x0d\x01\xfa\xdb\x4f\x04\x21\x45\x65\x14\x27\x36\x12\x49\x1f\x41\xa1\x1a\xe3\x51\x03\x8b\x71\xf2\xb9\xb1\x2b\x56\xa9\x7f\x04\x65\x1a\x3b\xe5\xb2\x2e\xbd\x77\xaa\xb4\x43\x0e\xc8\x43\x52\xa5\x85\xf2\x48\xa0\x89\x50\x68\x1e\xb7\xe4\xc2\x4e\xdd\xcd\x17\xbb\xf2\xe1\x86\x38\xb2\x0f\xb4\x15\x7c\xd5\xed\xda\x0a\x08\x99\xd4\xbb\x04\xc1\x30\x06\x93\xe1\x83\x59\x96\xec\x15\x6a\x46\x0c\x0c\x3a\x5f\xa2\x16\xd4\x24\xbd\xb2\xb4\xe4\x82\x93\xec\x66\x70\x0f\xa0\xfd\x8b\x7b\x5c\x7c\x50\x92\x15\x3f\xc0\x15\xae\xdd\x2b\x56\xbd\x21\x9f\x40\x8a\xa3\x2e\xad\x11\x3b\x2e\xc8\xb4\x28\x4a\xea\x34\xbf\x15\x4d\xdd\xf8\xf3\x64\xaf\x91\x61\x27\x51\x9e\xdb\x8a\x7c\xc2\x08\x20\x1b\x62\x7e\xae\xe7\xed\xe6\xa3\x20\x69\x81\xf7\x47\x55\xd4\x6c\x90\xf4\xfe\x27\x88\x9b\x2d\x38\x44\xe4\x6c\x3f\x63\x62\x67\xff\xfd\x34\xd1\x53\xb8\x1e\xc4\xc3\x04\x49\xc2\xae\xe0\x35\xc8\x01\xa4\xb3\xe8\xe0\x79\x6c\xb9\x26\x55\xb5\x6b\x1b\xc7\xd7\x86\x87\x43\xf3\x0b\x09\x7b\x05\x51\x83\xa2\x1b\xa6\xfb\x98\xe6\x79\x76\xa8\xb3\x5a\x37\x8a\x1c\xe6\x97\x7b\x31\x01\x16\xb1\xf1\xfa\x91\xe5\x56\x18\x41\xf2\xcd\x89\xab\x60\x70\xdf\x49\x4a\x05\x8f\x5b\xff\x24\xc2\x29\x55\x6a\x1c\xb5\x9b\x1f\xbc\xb4\xc4\xb2\xed\x6c\xac\x7d\x79\x1a\xd0\x9b\xcc\x9d\x78\x8c\x19\xad\x6e\xec\xdd\x41\x47\xe4\x37\xdd\xe9\x26\x3c\x6e\xc2\x83\x50\x5b\x00\x2e\xc7\xfd\x07\xa1\x82\x70\x92\x11\xdf\x76\xdc\x37\x53\x1d\xb8\x82\x1d\x26\xf8\xde\x67\xf9\xae\x4a\x0b\xf1\x02\xaf\x9b\xf8\x4d\x53\xe0\xb7\x87\xce\x18\x58\x75\x40\xed\xe4\xda\x89\x22\x2a\x4c\xea\x69\xd4\x79\x7c\x92\x6e\x38\xbd\x6c\x6d\xda\x55\x1f\x87\x45\xf3\x91\xcd\xe5\xb3\xc7\xea\xea\xd0\xdf\x5d\x40\xc3\xa1\x1b\x8c\x7b\x9f\xd4\xfd\x5a\x0a\x89\xcf\xac\xaa\x82\xe7\x6c\xd3\x51\x69\xd9\x96\x23\x4f\xdc\xa8\x96\xa3\x16\xa9\x11\x5e\x56\x45\xc3\x0c\x0d\x38\x12\x0b\x60\x00\x92\x80\xcd\x80\xbd\x28\x1a\x04\x07\x7e\xfc\x14\x65\xf3\xc1\xcd\xea\x45\xfa\x7c\x48\x8a\x5d\xba\xbb\xc0\x14\x54\x2f\x73\x5c\x32\x79\x8c\x5a\x63\xf9\xc0\x7c\xef\x0c\xea\x96\x31\xd3\x7b\x0d\x5d\x8c\x72\xd4\xfe\x27\x42\x6c\x2f\x82\xf6\x91\xc3\xa3\xe7\xb2\xdd\xe8\xce\x71\xcc\xaa\xc3\xeb\xd6\x90\xbd\xa3\x75\x8b\xa8\x63\x70\xf2\x55\x94\x45\x40\x71\xf7\x49\x56\x2c\xd8\xab\x65\x5a\xd1\x08\xa7\xe4\x41\xf6\xcf\x3f\x97\x87\xb4\xe8\x64\x5e\x12\xc6\xe8\x8f\x0b\xb5\xc2\x7d\xb2\xbf\x79\xa8\xda\x2b\x05\xad\xe1\xa8\xdb\x15\x0e\xf3\x28\x3c\x2b\x28\xef\x0c\xe2\x89\xf1\xfd\x87\x27\xde\xef\xc5\xc3\x97\x46\xe1\x7a\xa5\x21\x09\x21\x78\x84\x24\x39\xec\xc0\x7a\x9d\x61\x19\x15\x8e\xed\x79\x4a\xd7\xf5\x8d\x0d\x0f\xdb\xb9\x92\x70\xa7\xb1\x13\x59\xd3\xdb\x31\x25\xcf\x45\xfa\x98\x16\x4d\xcd\x4e\xf9\xd7\x99\x21\x3d\xfb\x5f\x13\xbb\x1c\x81\x9d\x5c\xf8\xba\x8b\x2d\x0d\xa7\x93\xa4\xde\xc0\x98\x3a\x6d\xa5\x4e\x93\x86\xa5\x04\xa7\xda\x2b\x61\xc3\xfb\x91\x72\x33\x78\x2b\x13\x64\x0a\x5d\xdd\x04\xc1\x94\x5e\x75\xc0\xaf\xb5\x63\x04\xc5\xd0\xeb\xb0\x0d\x54\x78\x96\xef\x82\xaf\x3d\x28\x45\x81\xf6\xfa\x43\x82\xd7\xa5\xd7\x1e\x0b\xbd\x2a\xbe\x5d\xb3\x51\x65\x32\x50\xf3\xcc\x3c\x69\x44\x49\x8b\xf6\x1f\x48\x86\xe5\xa3\xe1\xa0\x7a\x7a\xe6\xb9\xa3\xaa\xea\x85\x82\xb3\x68\xeb\x19\x44\x44\x61\xcf\x4a\x30\x9d\xbd\x50\x74\x9a\xda\xbe\x7f\x05\xa0\x76\xfa\x50\x8d\x2f\xf9\x38\xe6\x19\x29\x39\x24\x45\x9a\x13\x82\xb2\x37\x1f\x23\x7a\x21\xfd\x95\x46\x6b\x3d\x56\xa5\xf5\xa1\x2c\xea\xf6\x02\x06\x6f\x3b\xc3\x86\x63\x52\x43\x8e\x0c\x7b\xcb\x33\x1d\x80\xf1\x4e\x8a\xf2\x1c\xba\x8d\xac\x83\x65\xd3\xb5\x06\x78\xc7\x46\x24\xf7\x38\xaa\x2e\xc5\xc7\x43\x15\xa0\xed\xea\xec\xaa\xf2\x30\x8c\x22\x68\x1d\x37\x00\x8b\x07\x38\xf1\xdc\x75\x44\xf7\x26\xd9\x6c\x79\x59\xa7\xfc\x66\xe2\xae\x22\x36\x34\x63\xa7\x11\x71\xbd\x16\x20\x70\xbf\x78\xf1\x23\x4d\xbe\xa7\x82\x1b\x20\x88\x8b\x6f\x3c\xaa\x4c\xbf\x3e\xdd\x4b\x3d\x2b\xe9\x90\x2b\x3f\xa6\xd2\x63\x59\xd7\xfe\x53\x7d\x48\xba\x28\xa9\x9a\x62\x39\x8c\x94\xb6\x1a\x8b\x88\x23\xcc\x99\x75\xa0\x7e\xeb\xa1\x62\x65\x86\xa8\x39\x5c\xbf\xec\xcb\xd9\x81\xc5\x90\x39\x82\x16\xc5\x1e\xd7\xb2\xe6\x0a\x75\x9e\x1c\xda\x15\x9a\x6d\xd4\x7b\x4d\x0e\x2e\x88\x8a\x13\x24\x1c\x93\x46\x73\xfe\xc2\x8b\x69\xb3\x70\xc6\x87\x2e\x7e\xac\x5a\x8e\x53\x3f\x82\x23\x35\x30\x08\xa9\xfc\x3d\x7d\x3e\x74\xcc\x5d\x10\x90\x01\x78\x3c\x12\x0c\xb2\x50\xb0\x48\x8e\x8a\x68\x05\x6f\x78\x75\xc4\xda\xd8\xa4\x70\x78\x86\x2a\x74\xfa\xf0\x2e\xd6\x69\x0b\x16\x65\x95\xb5\x8c\x70\x33\x83\x06\x07\x5d\xb1\xe3\xc6\xd4\xec\x60\xec\xec\x06\x07\xac\xda\xc6\x2f\xa3\x5d\x7a\x67\xd8\x38\x63\x11\xa3\x33\xc1\x97\xfa\x91\xf9\xaa\xc8\x30\xd1\x52\x65\x11\x35\xb5\xbe\x2f\xbb\x84\xc1\xbb\x5e\x9c\x5b\x06\x23\x98\x25\x2e\x16\xb4\xbc\x32\x10\x58\xa5\x66\x25\xce\xc0\x29\x5f\x66\x15\xcf\xcd\x27\x07\x46\x39\xc8\x26\x97\x90\xab\x8d\x9f\x8c\xc4\x24\x8d\xd0\x4e\x64\x91\x26\x70\x83\xcb\xf2\x62\x0c\x52\x2f\x77\x90\x85\x5a\xd0\xd7\x6c\x85\x75\x2e\x42\x5b\xde\x69\x37\xed\xd3\x59\xe7\xa9\x18\x1b\xe0\x9c\xc6\xf8\xae\x9b\x4d\x70\x78\xbe\x38\x4a\x2a\x07\xc7\x20\xdf\x6a\x6a\x6a\xe5\x5d\x81\xf9\x69\x63\x4a\x8b\x2f\xf9\xbd\xa9\x06\x5b\x51\x18\x7b\x5f\xcd\xde\x43\xf5\xea\xd4\xc9\x5b\x0d\xc3\x8f\xe9\x13\xf8\xd3\xde\xf7\x4b\x40\x61\x8d\x61\x1e\xac\xcb\x12\xcf\xe6\x04\xe2\xf6\xbd\x4a\xe9\x2c\x6c\x7b\x3f\x53\x9e\x0b\xfb\x71\xf6\x99\x2c\x6c\x87\x68\x4a\x71\xa1\x03\x52\x24\x8f\xdd\x8e\xcb\xd3\xc7\x34\x5f\xf8\x6a\x87\x34\x16\x94\x55\x3d\x4b\x80\xd4\x7b\x71\xb8\xa2\xa2\xb8\x92\x5a\x58\x79\x68\xf1\xf3\xed\x36\x7b\x4e\x77\x4c\xc3\x56\xf5\x7e\x35\xb2\xe1\x9b\x6d\x08\x04\x4c\x7b\x03\xbc\xb2\xfe\xb1\xc8\x8a\x5d\xfa\x7c\xe9\x7b\xe1\xa6\x53\x07\x7a\xde\xe3\xbd\xe6\x49\xcc\xa7\x4f\x62\x38\xc7\x0e\x39\xc7\xb6\x5e\xc6\xc0\x72\x19\xf1\x7a\x96\x00\xd1\x65\x44\x2a\x0e\x2c\x63\x70\xe2\x32\xca\xc6\x8b\x74\x59\x5f\x65\x19\xa7\xad\xa2\x06\x91\xc7\x4e\x61\xdc\x85\x70\xb4\xdb\x9a\x2c\xee\x9c\x65\x65\x16\x67\xce\x72\x37\xeb\x61\xa3\xb5\xf5\xc0\x91\x09\x8f\x19\x77\x30\x6e\xdc\x06\xd8\x68\xed\x3e\xdc\x9e\x4a\x8a\xd0\x43\xa1\x6e\xaa\xb4\xd9\xde\x5b\xaf\xcc\x48\x64\x8f\x43\xdf\x48\x8c\xd0\x39\xe2\x16\x2d\x42\x78\x9d\x53\xa9\x6e\x1c\x1d\x9d\xbe\x78\x6d\xed\x81\x87\x6b\xe3\x24\x98\xa9\x48\x93\xee\xc7\x4d\x67\xa0\x9d\x6e\xa8\xe3\xbb\x93\xdb\x1d\x51\x37\x18\xcd\x93\xb6\xc5\xd4\x31\x6b\x08\x9b\xa9\x6b\xdb\x99\xa7\x30\xa6\x3b\xb9\x9d\xde\x0e\x5a\x08\xd2\xd4\xc5\xfe\x6b\x7f\xda\x79\x25\xc8\xe1\x78\x4f\x8d\xa6\x87\xbc\x86\x9c\x3b\x7e\x9e\xb9\x8b\xd3\x9c\x27\x26\x11\x91\xcb\x83\xef\x4e\xa3\x25\x53\xf3\x61\xd2\x18\xd9\xb9\xa6\xf9\x8f\xe5\x13\x72\xca\x2a\xf5\x77\xfd\x93\x56\xcb\x08\xc6\x1a\xed\x63\x07\x33\x00\xe6\x35\x5c\x60\x4e\x59\x8b\xde\x5a\xf1\xc4\xd5\x18\x00\x64\x8d\xc8\xf1\x03\x1a\x04\x74\x26\x8b\xe8\x49\x68\xd6\xdd\xff\xed\x70\x6b\x68\x3d\x8c\x87\x71\x5d\xe3\xad\x7f\x3c\x5f\xa6\x73\xaf\xd2\x8b\x9f\x3d\xa7\x51\xc8\x69\x27\xd7\x49\xf4\x75\xe2\xb1\x77\x1a\x79\x22\x19\x04\x34\xeb\x8f\xeb\x80\x2c\xc6\x31\xd4\x50\x3f\x7f\xfc\x9a\x3d\xb5\xcb\x40\x27\x2a\x70\x6f\xf1\x29\x0f\x5d\x7c\x57\xf5\x1e\x15\x93\x95\x67\xe7\x52\xcf\x8c\xd7\xcb\x05\x47\x21\x7c\x36\x4e\x00\x3a\x7d\xba\x85\x50\xa3\xd3\x80\xb2\x17\x02\x63\x7a\xa3\xf7\x84\x48\x6a\x42\xa4\x2b\xdd\x1d\x59\x4e\x57\x76\x04\x17\x29\x29\xc0\x95\x27\xdf\xaa\xf4\xd0\x74\x3a\xef\x8f\x7d\x3f\x43\x97\x77\x7b\x50\x94\x58\x71\xb9\x65\x0c\x94\xbc\xbc\x2b\x4f\x82\xc0\x6d\xba\x4f\x03\xc2\xe6\x62\x34\x7e\x56\xd7\xed\xa3\x6e\xcb\x0c\x0e\xa6\x48\x1e\xb5\x8d\x95\x78\x11\xf2\x40\x5c\xc4\x48\x57\xe9\x81\xdb\xc5\xc9\x43\x71\x55\x13\x60\x6d\xdb\x23\xaa\x1d\x96\xe5\xf9\x4e\x5b\x0c\x36\xb4\xe7\x79\x76\x7c\x59\x63\x10\xd8\x25\x79\xe9\x76\xe9\x1a\xdb\xe1\x76\x26\x81\xed\x16\x5d\x47\x17\xf2\x2b\x21\xd0\x41\xaf\x27\xa1\xd8\x78\x5c\xe2\x78\x1f\x0d\x31\x18\x82\x68\x5e\xc9\x09\x43\x1c\x0b\x30\xc0\xfc\xaa\x68\xc4\xb6\xee\x39\xef\x9c\x2a\x92\xd3\x97\x46\x7f\xe7\x3a\x07\xec\xdb\xe4\xfc\x4b\x7f\xf6\x11\x07\x36\x23\x3e\x81\xb4\x86\x06\x7c\x12\xe8\x73\x8d\x77\x04\x82\x4f\x02\x7d\x9b\x18\xcf\x95\x73\x11\x34\xe6\xfc\x71\x2e\xd2\xd3\xc3\x3e\x99\x48\xce\x07\x1a\x1d\x35\x6e\x48\x62\x60\x48\x3a\xd7\x03\x70\xc3\x47\x82\xac\x77\xb9\x02\x42\x96\x2b\x80\xfc\x97\xab\xcc\x05\x0b\x12\x12\xdb\x43\x89\x22\xf0\x72\x4c\xee\xe3\x8b\x53\x87\x4d\x2f\x67\x61\x26\xe7\xee\x64\x60\x26\x28\xed\x9c\x7f\xa9\x34\x37\xeb\xd3\x57\xc7\x08\xf8\x84\x05\x39\x2b\x5c\xed\x7d\xff\x87\x7c\x1a\x38\x1b\x35\xe8\x14\xf5\x67\xa3\x0a\x73\x07\xa7\x53\xc7\x79\xe1\xeb\xc7\xff\xfa\x4f\x10\x67\x5b\xf3\x97\x14\xf3\x2c\xbb\x38\x7d\xdd\x5f\x50\x94\xfa\x3e\x4f\x1d\xa7\x2f\x27\xae\xf0\x3c\x7d\x0d\x4d\x70\x4f\x58\xb8\x73\x82\x55\x46\xfb\xa3\x3f\xa9\x9c\x6d\x73\x7f\x7a\x41\x31\xcc\xb2\x8b\xd3\x37\xf7\xb9\x7b\x30\xcd\x41\xce\xb3\x6c\x83\x34\x79\xed\xd9\x3d\x00\xd7\xca\xa1\x43\x36\x42\x38\xe1\x1e\xd7\xeb\x60\x31\x9d\x1a\x3b\x97\x14\x57\x76\x96\x38\x53\x4a\xb4\x49\x7e\xf7\xea\xab\xa5\x87\x67\xbc\x9d\x32\x3c\x10\xb3\x6e\x40\xf1\x6c\x07\x4f\xaf\x27\xb6\x6d\x8f\x69\x88\x2d\xdb\xea\x74\xc3\xb6\xcd\x65\xad\xf0\xf4\x6b\x80\x32\x24\x16\x11\xfa\x71\xbf\xb8\x79\xb8\xfb\xe3\xc4\x01\x9e\x05\x18\xa5\xfc\xfd\xd3\xa2\x45\x38\x12\x29\x6c\xbd\x6d\xff\x41\xfd\x68\xa7\x92\x06\xc9\xbd\x64\x4c\x8e\x38\x7c\x17\xd7\x18\x99\x4d\x22\xde\x2d\x74\x92\xc1\x37\x2a\xb0\x70\x67\x7b\x56\x30\x65\xd6\x58\x2f\x13\x13\x3a\x9d\xfd\x72\x8c\xdb\x2f\x5b\x0c\x51\x76\x3b\xb3\xe7\x4a\x5b\xd5\xcb\x4e\x76\xde\x9a\x06\x66\xdc\xb5\x05\x6b\x7f\x16\xf7\xd5\xd3\x06\xaf\x77\xb9\x3a\x6d\x52\x7a\xef\x54\xfb\xfd\x63\xf3\x92\x8c\xb7\xb7\xf3\x37\xd1\xb6\x3d\xa1\x63\xbb\xa7\x75\xbb\x13\x5d\xf1\x55\x81\x41\x44\x96\x54\xdf\x86\xee\x42\x6f\xa4\xff\xc0\xd8\x45\x50\xd2\xd4\x9e\xb2\x2a\xd3\x81\x9d\x73\x68\x3a\x93\x90\x49\xd0\x86\x16\x52\x4d\xe8\xad\x49\xd8\x6d\x2d\x77\x62\xf2\xa6\x95\x0c\x68\xe7\xd2\xa3\x6b\x3a\xbd\x5b\x3b\xcb\x12\x2b\xb1\x55\x31\x1d\x39\xe3\x9e\x78\xeb\xc8\x16\x58\xc2\x08\xaa\xb1\x3e\xfe\xa1\x43\xd4\xf0\xf1\xbf\x38\xe5\xfc\x37\x0d\xd1\xfe\xf8\x37\x41\xb1\x3f\xfd\x07\xa1\x8c\x52\xf9\xe9\x8f\xc9\x97\xf3\xcc\x3e\x69\x56\xe3\xa4\x02\xeb\xd9\xbe\x0b\x05\x2f\x20\x14\xc8\x2e\x7e\xa6\x9b\xf4\x8f\xc9\xe4\x5e\xff\x44\x31\xa1\xd4\x1c\x35\x20\x5a\xc5\x86\xa8\x01\xa8\x5d\xdc\xca\x9d\x6a\x18\x67\x43\xa2\x6f\xda\x19\x5b\x73\xa8\x2c\x59\xd6\x58\xfb\x69\xff\x58\xce\xcb\xf8\x55\x5a\x33\x6b\x4b\xdd\x1b\x23\xd1\x25\x0b\xef\xdd\x13\xed\x12\x8d\x03\xfd\xce\x72\xcf\xc0\x72\x4f\x43\xf6\x4b\xa9\x64\xa2\x57\x56\xc8\xbc\x1f\x2f\x96\xc7\xcb\x38\xf2\xf9\x5e\x12\xfd\x64\xf2\x19\x2d\xcf\x0b\x61\x51\x0f\x55\x79\x57\xa5\x75\xbd\xd8\xa5\xb7\xc9\x43\xae\x0b\x8a\xaa\xe6\xf3\xee\x1a\x26\xbc\xd1\xc2\x57\x9a\xd5\x0f\xdb\x6d\x5b\x67\x69\x6c\x17\x28\xed\x76\x49\xd1\xee\x87\xb5\xb1\x59\x08\x53\x44\x23\x50\x95\xa6\x56\x89\xbf\xbf\xb9\xbc\xfe\xbc\xfb\xdb\xa2\x6e\x92\x26\xdb\xaa\x2a\x6c\x98\x9e\x52\x76\x42\xee\x43\x06\x71\xf6\xc5\x7d\x02\x3a\xc7\x6f\x92\xd8\xe0\xb9\xcb\x87\xb4\x92\x13\x24\x11\x01\x45\x7e\xc1\x11\xd3\x10\x43\xef\x7f\x3e\xdc\x4f\xfc\x2f\xc7\xc5\x53\x7a\xf3\x25\x6b\x16\xc9\xe1\x90\x26\x55\x52\x10\x6b\xb1\x22\xbd\x5a\xec\xcb\x7f\x20\x1f\x6b\xf5\x5b\xa9\x7c\xea\x92\x4c\x92\x17\x72\x19\xa1\x38\x3d\xf5\x4f\xe3\xd2\xf0\xa7\xa4\xd9\x56\xd6\x13\x44\x01\x51\xe2\x3a\x7b\xde\xcc\x8c\xa3\xcb\x4b\x8e\xa4\x0e\xee\x63\x92\x3f\xa4\xc8\x7b\x05\x9b\xb2\xcd\xd0\x34\xb3\xc7\xfb\x6f\x17\xa3\x9f\x54\x82\x25\x55\x79\x91\xae\x7f\x27\x13\xfd\xf9\x27\xef\xa7\x3f\xb0\x51\xbc\x20\xf1\xb0\x45\x1e\xb3\xb2\xc3\x19\xda\x85\xcd\xd8\x17\x66\xfb\xe4\x2e\x65\xe7\xe6\x00\x0a\x70\x42\xe0\x9f\x01\x6f\x26\x73\x91\x7e\xdb\xd1\x16\x59\x5e\x39\x5c\xc1\x79\x37\x81\xdd\x40\xb2\xa2\x48\xab\x45\x9a\xa7\xfb\xb4\x68\x5e\x62\xad\xc7\xec\x35\x04\xc5\x3c\x1f\x7e\xd8\xa5\x2d\xc5\xb2\xe5\x83\x52\x09\xab\x7d\xf7\x2e\x3b\x85\x7a\xb6\xc8\xb0\x1c\xa5\x37\x2b\x3f\xd2\x53\x21\x38\xd9\xe6\x0e\xab\x7d\x61\x80\x3b\x82\x95\xb0\xae\x6d\x16\x78\xc2\x28\x2c\x18\xca\x19\x07\xf0\x94\x54\x45\x56\xdc\x29\xe8\xdd\x06\xfe\x0e\xc9\x44\x8c\x9d\xe4\x73\x87\xd5\x36\xc1\x1d\x81\x5e\xd6\xf5\xb8\xd9\x59\x8f\xc2\x02\xbd\x67\x1c\x00\x95\x85\x4e\xc0\x6e\x60\x03\xf6\xa5\x91\x6b\x3b\x88\x97\xc2\x2d\xde\x7f\x9e\xdc\xa4\x24\x74\x9f\x24\xe9\xf1\x02\x24\x50\x2c\x7f\x09\xa0\x52\x7e\xd8\x5e\x1b\x64\x70\x2c\xaa\xa9\x06\x26\xd5\x8e\x8b\x62\x10\x08\x2f\x99\xee\x35\x36\xa7\x91\x37\xeb\xaf\x16\xd0\x5d\x40\x4e\xa7\x1d\xae\xa2\x74\xff\xed\x2f\x5f\xd2\xaf\xb7\x55\xb2\x4f\x6b\x47\x40\xc9\x6d\xb2\x4b\x8f\xde\xac\x8f\x8c\xf8\xad\x29\xbb\x1f\xde\x37\x30\x1b\xa1\x89\x72\x62\xfa\x9e\xf7\xd3\x1f\xf3\x51\xb5\x3f\x92\x99\x27\x45\xb6\xa7\xc6\x71\xca\xb8\xc8\x2b\x51\x3b\xb7\xa4\x72\xdc\xa8\x76\x6e\xcb\xea\x29\xa9\x76\x35\x18\xd4\x6d\x9e\xd4\xf7\x0b\x89\x6e\xe6\x52\x79\xbf\x59\xc0\x91\x41\xe8\xc0\x71\x7d\x76\x62\x94\x0f\x8d\xe3\x0f\x42\xd6\x6d\x0b\x6d\x8f\xa7\x1d\x71\x73\x99\xa8\xc5\xf1\xba\x61\x6d\x3e\x04\x87\xdb\x0f\x4d\xd8\x42\x20\xd2\xce\xfd\x45\x84\x29\xed\xba\xc8\x9c\xc2\xb4\x24\xaa\x6c\xdb\x7e\x79\x63\x4b\x81\x6f\x9a\x73\x09\x2b\x86\x2e\x5e\x47\x6e\x31\x0f\xe8\xfb\x8a\x30\x02\x17\x32\x8d\x4c\xc7\xf0\x4c\x6d\x2c\xd8\x5e\xdc\xb1\x3d\xdf\x9e\xeb\xa1\x64\x72\xaa\x58\x30\xdc\xd3\xeb\x48\x0a\x56\xe3\xfa\x1e\xc2\x83\xee\x5c\xcd\xcb\xf2\x90\x56\xed\xc9\x4a\x9f\x94\x89\xba\xa1\x29\xe9\x2f\xf2\x03\x0a\x0a\x25\x74\x85\xef\x3d\x7f\x84\x0a\xfd\x29\x26\xab\x80\xd4\xfb\xee\x90\xd6\x6e\xee\x80\xda\x17\xba\x8e\xec\x97\x56\x73\xd7\x3e\xdb\x30\x86\x57\xf2\x4d\x8d\x40\x82\xc3\xd5\xae\x9a\x3d\x4f\x49\xc5\x09\xba\xb3\x82\x9c\x08\x59\x71\x9b\x15\x19\x8c\x68\xe2\xfc\xa4\x71\x36\x52\x05\xc4\x21\xad\xda\xe9\xfa\x23\xa6\x45\x5b\x45\x33\x69\xb2\x4c\x88\xef\xe2\xc2\x8b\x85\xec\xfa\xd4\x65\x07\x78\x51\x69\xbe\xed\x90\x5d\x87\xf5\x1d\x9e\x7e\x6c\x70\xdf\x12\xc7\xed\xe9\x85\x59\x5e\xd0\x34\x6e\x92\xe4\x8f\xdc\x22\x3a\x3d\x25\xa6\x9b\x64\xcd\x3e\xf5\x1f\xf6\x29\x3e\x97\xd3\x94\xa5\x22\xd1\xe8\x3c\xdd\x78\xb4\x6d\x4e\x83\x5d\xb0\xd2\x81\xe1\x76\x46\x2e\x2f\x42\x8d\xd3\x36\x06\x7b\xe8\x9f\xc1\x3d\x36\x38\x91\xdf\x77\x49\x93\x2c\xf8\x51\xd3\x1e\x34\xdc\x26\x69\x4c\xc3\x60\x6a\xc3\xb0\x6f\xc8\x73\x49\x0f\xd3\x8a\x00\x61\x39\xb5\xeb\x68\x6a\xc3\x78\x6a\xc3\x95\x32\xd9\x68\xe4\x64\xd7\x53\xbb\xde\x4c\x6d\xe8\x7b\x93\x5b\x4e\xa6\x26\x3f\x50\x10\xe5\x5b\xb0\x10\x11\x46\x38\xb9\xf7\xc9\x14\xe5\x4f\x26\x29\x7f\x32\x4d\xf9\x2a\x51\xf9\x63\xa9\xca\x9f\x4c\x56\xfe\x64\xba\x0a\x26\xd3\x55\x30\x9d\x4b\xa9\x74\x15\x8c\xa5\xab\x60\x32\x5d\x05\x93\xe9\x2a\x98\x4c\x57\xc1\x64\xba\x0a\x54\xba\x0a\xc6\xd2\x55\x30\x99\xae\x82\xc9\x74\x15\x4e\xa6\xab\x70\x32\x5d\x85\x2a\x5d\x85\x63\xe9\x2a\x9c\x4c\x57\xe1\x64\xba\x0a\x27\xd3\x55\x38\x99\xae\x42\x95\xae\xc2\xb1\x74\x15\x4e\xa6\xab\x70\x32\x5d\x2d\x27\xd3\xd5\x72\x32\x5d\x2d\x55\xba\x5a\x8e\xa5\xab\xe5\x64\xba\x5a\x4e\xa6\xab\xe5\x64\xba\x5a\x4e\xa6\xab\xa5\x4a\x57\xcb\xb1\x74\xb5\x9c\x4c\x57\xcb\xc9\x74\x15\x4d\xa6\xab\x68\x32\x5d\x45\x2a\x5d\x45\x63\xe9\x2a\x9a\x4c\x57\xd1\x74\x89\x7d\x32\x5d\x45\x93\xe9\x2a\x42\x84\xf6\xb1\x74\x15\x4d\xa6\xab\x68\x32\x5d\xc5\x93\xe9\x2a\x9e\x4c\x57\xb1\x4a\x57\xf1\x58\xba\x8a\x27\xd3\x55\x3c\x99\xae\xe2\xe9\x57\xc1\xc9\x74\x15\xab\x74\x15\x8f\xa5\xab\x78\x32\x5d\xc5\x93\xe9\x6a\x35\x99\xae\x56\x93\xe9\x6a\xa5\xd2\xd5\x6a\x2c\x5d\xad\x26\xd3\xd5\x6a\x32\x5d\xad\x26\xd3\xd5\x6a\xba\x8e\x41\xa5\xab\xd5\x58\xba\x5a\x4d\xa6\xab\xd5\x64\xba\x5a\x4f\xa6\xab\xf5\x64\xba\x5a\xab\x74\xb5\x1e\x4b\x57\xeb\xc9\x74\xb5\x9e\x4c\x57\xeb\xc9\x74\xb5\x9e\x4c\x57\x6b\x95\xae\xd6\xa3\xb5\x57\x93\xe9\x6a\x3d\x99\xae\x36\x93\xe9\x6a\x33\x99\xae\x36\x2a\x5d\x6d\xc6\xd2\xd5\x66\x32\x5d\x6d\x26\xd3\xd5\x66\x32\x5d\x6d\x62\x75\xc6\x63\xa9\x63\xb3\x9a\xdc\xfb\x74\xb5\xe8\x46\x1d\xf7\x7a\xac\xf6\xcc\xf3\x10\x75\x25\xb2\xde\x9d\x8d\x94\x04\xed\x88\x58\x5b\xf1\x26\xdc\xfe\x51\x6a\x62\x78\x7e\x38\x9f\xe1\x00\x1f\x03\x37\x12\xb4\x1f\xc3\xf9\x0c\x04\xf9\x18\xd8\xdb\xf8\x0b\x0f\x41\x78\x79\xdb\x26\xd5\x8e\xc6\x2e\xea\x9f\xc2\xe6\xe8\x57\x36\x48\x56\x78\x5b\x96\x4d\x5a\x29\x6d\xe4\xcf\xfc\xf9\x0c\x38\x4b\x00\x33\xb7\x18\xa4\x61\x76\xfd\xf5\x8a\x04\x76\xd1\xe7\x48\xc7\x46\xf5\xc9\x6a\xd0\x32\x4a\x35\xa3\x95\x81\x69\x66\xa3\x90\xf6\xe0\x14\xf0\xb1\xbb\x4d\x79\x30\x0e\x1b\x54\x90\x87\x62\x28\x02\x8d\x8f\x00\xdd\xde\x15\x7b\xda\x54\xdf\x3e\xe7\xc8\x37\x65\xe5\x3a\x8f\x96\xa5\xe2\xe3\xd2\x39\x63\x89\x5f\xf8\xba\xa9\xc0\x3f\x59\xf4\xac\xc5\xb2\xfd\x00\x90\x75\xe8\x60\x12\x8c\x8b\xc9\x70\x41\xd6\x42\x98\x76\x94\x25\xe9\xc4\x73\x77\xca\x10\x3f\xfd\x59\x8a\x77\x2f\x1a\x9b\x12\x92\x57\xda\x5c\xde\x66\x55\xdd\x2c\xb6\xf7\x59\xbe\x3b\x4a\x0d\x36\x68\x83\x3c\xd1\xd4\xf7\x94\xba\x84\x1f\x1f\x61\x68\xe9\xd8\x53\x6b\x01\x5a\xd0\x95\x70\x8a\x60\xf3\xf3\x1d\x9a\x86\x42\x5b\xbd\xe5\x48\x07\x4d\x5a\x57\xb6\x4e\x04\x43\x02\xbc\x2b\xcd\x8a\x0c\xf5\x43\xbd\xe6\xaa\xf2\x49\x48\x94\xe1\x29\xe9\x39\x2d\xa1\x7c\xfa\x7d\x9b\x27\x75\xfd\xe7\x9f\x99\x01\xca\xe2\x0f\x29\x4d\xca\x95\x82\x76\x74\x1f\x53\x2a\x63\x83\x60\x4f\xdd\x94\xed\x75\xa9\x34\x4d\x2d\xe1\x3a\x8b\x40\x8c\xcd\xd8\x9a\xf7\xee\x91\x61\x38\x13\x0c\x8e\x19\x55\xe9\x21\x0c\x1e\x06\x38\xc3\x42\xcc\x24\x78\x8f\x71\xb8\x89\x2a\xd1\xce\xd9\x38\x07\x7b\x16\x2f\x57\xc7\x79\xbd\xdd\x04\x46\xf6\x35\xc4\xaa\xd8\xa4\xbf\xfd\xfb\xe5\x62\x5f\x2f\xb2\xe2\xf0\xd0\x2c\x0e\x79\xb2\x4d\xef\xcb\x7c\x27\xf0\x6c\xb0\x6e\x73\xe2\xdc\xa9\x59\x53\x3c\xea\x60\x7d\x20\xbe\x40\x08\xfa\xd1\x40\xf7\x6c\x78\x21\xa5\x44\x46\x22\xf4\x07\x60\xab\xe0\x8b\x50\xa5\x37\x89\x6a\xbb\x75\xfc\xce\xf0\xb1\x33\x7f\xea\xce\x8c\x8e\xc8\x61\x3c\xe5\x87\x2a\xff\xd0\x8a\x96\x97\xc4\xad\xeb\x5f\xeb\xc7\xbb\x8f\xcf\xfb\xfc\x6a\x7b\x9f\x54\x75\xda\xfc\xfc\xd0\xdc\xae\xe7\xb3\xf0\xba\x7e\xbc\x9b\x05\x5e\xb6\x9b\x85\xbf\xce\x82\xe0\xb7\xe4\x6b\x5a\xfd\x7b\x30\x0b\x82\x59\xe0\x11\xc1\xb4\x48\xf6\x29\x28\x9b\x05\x1e\x2b\x7d\xde\xe7\x45\x4d\x4b\xee\x9b\xe6\x30\x0b\x7f\x99\x05\x9f\x67\xc1\xe7\xa7\xa7\x27\xf7\x29\x74\xcb\xea\x6e\x16\x7c\x0e\x3c\xcf\x9b\x05\x9f\x49\x27\x6d\xa3\xc7\x2c\x7d\xfa\x6b\xf9\x4c\x9b\x79\xb3\xa0\x2d\xf5\x56\x01\xfb\x23\x98\x85\x7f\x9b\x79\xbf\xcc\x48\x09\xfb\x7f\x78\xbd\x4b\x6f\x6b\xa4\x40\xac\x54\x37\x5f\xf3\x74\xa0\x16\xf8\xbf\xbb\xcd\xeb\x85\x3f\x0b\xae\xc7\xd4\x6f\x87\x39\x5b\xfd\xd5\xb2\x09\xfc\xff\x6d\x96\xe7\x04\x41\x5e\x51\x16\xe9\x2c\x9c\x02\xa3\x6e\xaa\xf2\x4b\xba\xd8\x67\x4d\x5a\xe5\xd9\x3e\x6b\x28\x40\xdf\x3b\x09\x1c\x21\x39\x0a\x29\x3a\x3c\x8f\x00\xb5\xfa\x75\x24\xaa\x27\xa2\x8e\x8e\x93\x8e\x70\x16\x84\x1e\xf9\xdf\x49\x53\x66\x2e\x1c\x14\xa4\xe7\xfa\xd1\x8b\xcd\x7a\x3a\xc1\x28\xb3\x5e\x05\x49\x78\xb6\x71\x86\xd7\xed\x9e\xd4\xec\x18\x52\xa8\xd9\x73\xe1\x35\x09\x1b\x3a\x0b\xff\xf6\x3f\xaa\x34\x2f\x93\x5d\x5a\xfd\xfb\x2a\x78\x0e\x68\x23\x5e\xa6\xb6\xda\x66\xd5\x36\x4f\x67\x81\x47\x8e\x7b\xba\xfb\x19\x59\xb4\x38\xda\x32\x86\x10\xc6\xec\xf7\x57\xf1\x77\xc5\x7e\x86\xe4\xe7\x67\xb4\x8b\x43\xd2\xdc\xab\x1d\x70\x4e\x46\xbf\xfc\xdd\x5f\xba\xe1\x2c\xb8\x8e\x3d\x77\xf3\x4b\x0b\xed\x9a\xfc\xe1\xb1\x7f\x5b\x7e\xd0\x76\x79\x1d\xea\x58\xd1\x2c\xf8\x4c\xfa\xa1\x65\x14\x8d\x8f\x77\xf4\x27\x0b\x87\x9a\x15\xbb\x56\x6c\x45\x93\x72\x8b\xb9\x48\x9e\xaa\xe4\xd0\x9d\x29\xfc\xbf\x8b\xfd\x4e\xca\x7c\xce\x83\x70\xad\xa5\x73\x03\x7c\x81\x55\x54\x88\xf4\x4c\x9a\x2b\xdf\xeb\x2e\xc7\x3a\x91\x53\x78\x60\xfe\x8d\x2c\xf6\x6f\xc4\x6e\x98\x50\x83\xf7\x72\xec\xc2\x4a\x10\xd1\xfe\x92\xa0\x84\xca\x52\x58\x93\xc7\xb4\xaa\xe1\x85\xfb\xfd\xd0\xb2\xe1\xa4\xef\x87\xd6\x0f\x76\x68\xdd\x92\xff\xfd\x57\x3b\xb4\x56\xcb\xad\x9f\x06\xef\x87\xd6\x9b\x3e\xb4\x54\xae\xcc\x43\xbc\x78\xef\x7c\xf9\x9d\x2f\x8f\x03\xf7\xa3\xf1\x65\xe0\x97\x74\x3e\xe6\xec\xbf\x7d\xce\x3c\xfa\x3c\x7a\xe7\xcc\x6f\x81\x33\x6f\xef\xd3\xed\x17\xe0\x2a\x47\xdc\xc1\xa7\x32\xe9\x56\xf4\xce\xca\x82\xce\xc4\x77\x7d\x03\x4b\x6d\x27\xe1\x71\xe4\x1d\xaa\xb4\x4e\xab\xc7\xf4\x97\xfa\x90\x6e\x9b\xff\xd9\x8e\x84\xd6\x7e\xfe\x7b\xb6\xfb\xbf\x7f\xcf\x76\xb3\xc0\xdb\xa7\x69\x73\x02\x5f\x67\x8d\x7e\x79\xce\xb3\xe2\xcb\x50\x63\x7f\xb3\xd9\xcc\x82\xcf\xb4\x2e\x69\x7e\x5b\x6e\x1f\xea\xe4\x26\x67\x27\xcd\x6d\x92\xd7\x29\x2d\x49\xaa\x2c\x59\xd0\xbb\x18\x2d\x6b\xaa\x07\x56\x54\x95\xbc\x7e\xb6\xbf\x63\xeb\xd5\x51\x01\xe5\xb8\xbf\x92\x9a\xfc\x2e\x4e\x29\x0b\x92\x47\xb5\xc8\x16\xe5\x43\xd3\x5e\x83\x48\x11\xf8\xbd\x68\x01\x71\xf2\xec\xa8\x27\x74\xdb\x73\xea\x3a\x58\xb9\xf1\xa6\x25\x13\x37\x68\xff\xe3\xaf\xdc\x60\x95\xf8\x8c\x80\x20\x31\xf9\xee\xd2\x5f\xb4\x7f\xe4\x6d\xbd\xcd\x6f\xa1\x4f\x5b\xac\xdc\x60\xa3\x6d\xc0\xfe\xf3\x6f\xdd\x9c\x00\xd1\x01\x8a\xbb\xf8\xe6\xde\x34\xc5\xa2\xde\x3b\x9c\xdc\xe6\x6e\x92\xa7\x15\x09\x74\x44\xe3\x02\x3a\xec\x03\x7d\x46\xba\x69\x8a\xae\x6a\xaf\x88\x05\x89\xdb\xd9\x0f\x78\x93\xec\xbf\xc0\x2a\xb4\xe7\x6c\x4b\x28\xba\xf9\xc0\xc6\x71\xd1\x43\x07\x0f\x46\xe0\xb6\xdb\xfe\x64\x80\x3d\xd8\x4b\xff\x66\xc0\x63\xd7\x7b\xde\x0c\x3a\x23\xb7\x60\x8f\xde\x4c\x0d\xfe\xec\x91\xd0\xcf\x4d\xa9\x96\x84\x31\x2d\x13\x02\x02\x36\x2d\x8d\x2d\x6e\xee\xcc\x91\xf2\xba\xb8\x7c\xcd\x7d\x9a\xec\x06\xab\x47\x7d\x7d\x02\x9e\xa7\xd5\xa6\x21\x9b\xe8\x8c\x06\x62\xf3\x81\x10\x82\x14\x06\x7d\xb9\xe4\x30\x9a\xf2\x30\x16\x00\x6b\x39\xae\x55\x55\x3e\xb1\x86\xc3\xa1\x04\xb1\xde\x58\x78\x2a\x4d\xfe\x7f\x5a\x8a\x35\xa4\xe4\xa1\x69\x46\x0a\xc5\x56\xdb\xb2\x2a\xd2\x6a\x9b\xe6\x39\x0f\x88\x45\x83\x9f\x8b\x18\x2c\x74\xf1\x1e\xf9\x34\x56\x9e\xb4\xd2\xcc\x76\x80\xe6\xca\xf9\xe6\x12\x40\xc7\x1e\x93\x79\x72\xa8\xd3\xcb\x3a\x3d\x24\x55\xd2\x70\x37\xd7\x05\x39\x45\x2f\xeb\x32\xcf\x76\xfc\x13\xdb\x2a\x1e\xcd\x97\x08\xbf\xf5\x43\x51\xe6\x3f\x77\x3c\xda\x82\x07\xfa\x13\x72\xb7\xe1\xcb\xa9\xae\x35\x48\xd7\x86\xa5\x1e\xba\xd2\xad\x14\xb2\x8e\xed\x80\x58\xe4\xce\xd1\xd9\x41\x85\x8d\xd6\xa5\x03\xed\xf1\xab\xf8\xf4\xcb\x8b\x06\x52\x16\x61\x16\x12\x2c\xc0\x3d\x08\x73\x2a\xc7\x42\x24\x00\x9d\xe6\x7e\xce\xff\xb6\x3b\xf6\x81\x88\x18\x5b\x13\x1e\xfe\x56\x00\x3d\xed\x86\x43\xd6\xb5\xfd\x8c\xad\x6d\xff\x7d\xd4\xfa\xf6\xdb\xba\xf3\x75\xd6\xef\x77\x6c\x83\x02\x77\xe7\x2e\xa1\x72\xd4\x76\xe1\x90\xf7\x28\x87\xfe\xa0\x4a\x4e\xaa\xdc\x63\x2f\xf6\xb2\xca\xaf\x3c\xf4\x08\x73\xf3\xf4\xb6\xe9\xb1\x46\x7e\x1e\x01\x88\xf6\xb7\x54\x1b\xbe\xd2\x4b\x2d\xd1\x07\x7c\x9a\xad\x28\x24\x07\x09\x07\x64\xca\x6b\x05\x76\x27\xa0\x0b\xb0\x9c\x74\x9e\xd2\x4b\xfe\x55\x9e\x36\x2d\x13\xad\x5b\x51\xbf\x45\x8d\x17\x62\x91\x15\xff\x74\x9b\xb4\xff\x18\xa9\x19\x9e\x03\x73\x87\xb5\xb8\x90\xd1\x48\x59\xfd\x95\xc8\xf8\x11\x32\x62\x25\x18\x25\x09\x45\xa3\x88\x49\x38\x67\x20\xcf\xd0\x1c\x40\x36\xac\x83\x3c\x45\x3b\x34\x64\x11\x5b\xa7\x9b\x72\xf7\xd5\x69\x2a\xb8\xac\xed\xd6\x32\x37\xf8\x48\xfe\x3c\xbe\xd6\xe6\x02\xc8\xd0\xee\x2c\x0d\x26\x7a\xfa\x4c\x93\x9d\xd3\xdc\x0b\xe4\xac\x84\xba\xec\xfb\x68\x29\xbc\xe7\xbc\xd2\x6c\x60\xa1\x3c\x0c\xf9\x68\x23\x4c\x98\x86\x70\x97\x46\x02\x0c\x20\x0c\x03\x21\x46\x18\xda\x91\x08\xa5\xe3\x87\xd2\xae\x2a\x18\x47\x4b\x17\xf0\xd7\xce\x06\x5b\x8c\x3c\xb5\x08\x43\xca\x5f\x60\xa0\xc3\xc8\x64\xe3\xd0\xe3\x13\xab\x30\x76\xa4\x8b\x6d\xb9\x3f\x24\xdb\xa6\x3f\xb7\xfa\x2f\x3b\x21\x4f\x0f\x4d\xea\x22\x89\xcd\x6e\x10\xf5\x3c\x95\xb5\xe7\x3c\xaa\x23\x9c\x63\x17\x9e\x43\x9e\xa9\x98\xad\x53\x03\xe4\x28\x4c\x57\x24\xb6\x1f\x65\x57\xeb\xcf\x3f\x65\xbe\xfc\x3c\x43\x10\x21\x9d\x89\xe7\x91\xda\xb4\xe3\x40\xce\x58\x75\x4c\xe8\x86\x23\x04\x89\x2c\x0d\x2d\xc0\x16\x07\x96\x8c\x5a\x1e\xda\x50\xc5\x00\xfc\x6e\x7b\x04\x9d\xf1\x9c\x56\x4c\xfc\x70\xf4\x11\x2e\x41\x31\x58\xde\x2e\x9a\xaf\x87\x54\x39\xe9\xee\x75\xa8\xb7\x68\xab\x3f\x25\x27\x8d\xc4\x86\x20\x6c\x46\xf5\xea\x47\xda\xb4\xd9\xf7\x1c\xfb\xa4\xc9\xbf\xfa\x29\x8a\x0f\x5b\x7f\x56\xd9\xaf\xfb\xdb\x3f\x98\xc7\xcf\xdd\x72\xd5\x7f\x80\xa3\x9e\x0d\xbc\x28\x29\x4c\x64\x2c\xcf\x8b\xfa\x3e\xd9\x95\x4f\xb2\xd2\x18\x8b\x11\xc7\x8e\x74\x1c\x36\x39\xb5\x2d\xb2\x3b\x7c\x97\x2b\x84\x3a\x36\xed\xa1\x35\xd0\x10\xe1\xa7\x57\x82\x88\x14\x2b\xc2\x10\x68\x3c\xb5\x57\xe4\x22\x30\x1f\xa8\xaa\xa7\x38\x6d\x27\x3a\x90\x0a\x84\xff\x96\xed\x0f\x65\xd5\x24\x45\x63\x85\x5f\x2d\x5c\xfd\x3d\x5d\x1a\xa4\x22\xa1\x9e\x49\x4e\x65\xed\x87\x50\xa1\xab\x26\xf7\x1a\x61\xdd\x12\x8d\x83\xa0\x0f\x2e\xcb\xbc\xc9\x0e\x8b\xc1\x18\x8b\x5c\x65\xe8\x7b\x40\x67\xc8\x1b\x4f\x50\x7e\xb2\xa6\xb6\x7a\x68\x56\x1d\xca\x31\xc0\x91\x29\x84\x05\x2d\x7f\xa1\xd5\x51\x8b\xe8\x2b\xd5\x10\x5a\x96\x63\x3b\x13\xb8\xc7\xac\xce\x6e\xf2\xb4\x03\xf8\xc9\xed\xc7\x4d\x53\xce\x92\x1a\x59\x9e\x35\x5f\xb9\xbd\x5c\x17\x6c\x1b\x06\x10\x66\x1f\x41\x04\x6c\xc9\xae\xae\xda\x27\x39\x48\x24\x14\x79\x5d\x9f\x97\xf7\xed\x70\x94\x9e\xe7\x5d\x39\x79\x3a\x32\x8e\x8c\x4d\xe3\xaa\x0f\x0a\x3e\x00\xfc\x32\xdd\x1f\x9a\xaf\x43\x5d\xd0\x5a\x26\x14\x7c\x13\x21\x1c\xd9\xcb\x92\x52\x20\x7a\xb9\xf0\xf7\xa7\xf2\xf6\xb6\x4e\x1b\x2e\x99\xf3\xaf\x82\xb8\xce\x3f\x32\x8e\x1d\xde\x6c\x36\xb7\xdb\xee\x2b\x10\xf9\xf5\x4b\xd8\xcd\xb2\x2b\xe8\x24\x1a\x7d\x5d\x47\x2e\x51\x1b\x1f\x81\x9e\x58\x39\x37\x20\xf5\x77\xca\x61\x45\x3b\x0b\xa9\x7d\xe9\x79\x57\x38\xf5\x23\x7b\x63\xee\x90\x87\x0d\x49\xfd\xc7\xa8\x0c\x0b\xd8\x68\xf4\x13\xd4\xf1\x88\xb9\x73\x93\x27\xdb\x2f\x63\xf5\xec\x18\xd3\x00\x9a\x76\xc5\x17\x45\x75\x19\x70\x97\xbd\x8a\x97\xab\xbc\x03\xdc\x3f\xb0\xe5\x85\xc4\x77\x08\xbc\xab\x51\xe7\xb3\x3e\xe0\x3e\x2b\xd7\xc9\x74\x9d\xda\x9d\x33\x51\x6a\xb1\xaa\xa3\xa7\xde\x0f\xd7\x9e\xae\x94\x36\x16\xf4\xd5\xb9\x7e\xaa\x93\x66\x03\x5d\xb8\xcb\x3e\x09\xae\xd7\xa3\x02\xcc\xba\x0b\x94\xf9\x13\x47\x40\xaf\x99\x76\xc8\xc6\x71\x28\x75\xf4\x85\xd6\xe4\x21\x48\x40\xf4\xc0\x43\x40\xa2\x9a\x8b\x21\x88\xcc\xff\x0d\x8c\x52\x2b\xcc\x89\x3d\x0b\x41\x7d\xb1\xf5\x69\x67\x38\x75\xdb\x93\x77\x82\xf7\x5d\xff\x56\x77\x3d\x25\x9a\x88\xef\x7f\x64\xd7\x0b\xd7\x19\xf3\xb6\x1f\x26\x9a\x91\x7b\x9a\x8c\xc9\x7a\x4b\xf3\x4c\x21\xdd\x44\xfb\x29\xa9\x5b\x5a\xdd\x2d\x70\x03\x6a\x34\x53\xdf\x7f\x53\x2b\x9c\xe7\x1c\x7b\x1a\xae\xec\x94\x7d\x0d\xdb\xbf\xef\xed\xb7\xb0\xb7\x19\x09\x10\x5a\x27\x0f\xe1\x03\x27\xba\xac\x9c\x13\x5e\xd1\x35\x9b\xda\x48\x35\x23\x36\x36\x84\x63\xd8\xdc\x34\xe2\x81\x70\x58\xc3\x59\x7e\xef\xf3\x1a\xdb\x64\x10\xaa\x4e\x19\x72\x96\x53\x5b\xe1\x2b\x36\xdb\x7b\xea\xa9\x0d\x9a\xbf\x6f\xee\x37\xbb\xb9\x0d\x07\xb7\xa2\x7c\x1e\xb1\xbb\x4f\x3d\xb5\x01\x18\xcb\xbd\xcd\x4f\x6d\x38\xcb\xef\x7e\x70\xbf\xd4\xee\xb6\x39\xbe\xc7\x6d\xee\xc9\x87\x36\x3d\xad\xd5\xb5\x90\x13\x7f\x13\xea\xe2\xc9\xd7\xe0\xa2\xbc\xf3\x82\xef\xce\x0b\x86\x4e\x6b\x4a\x5e\xf8\x86\x3e\xf9\x9c\xb6\x39\xa0\x59\x16\x8a\x05\x9d\x81\xfd\x01\xdd\xe9\x80\xcf\x7c\xf9\xd5\xed\xdf\x13\xd9\x82\x79\x03\xd3\x55\xb0\xde\xc1\x53\xcf\x65\x72\x20\x6b\x82\x3d\x01\x8c\xbf\xef\xdf\x37\xb9\x7f\xf1\x03\x99\x91\x2d\xbe\x83\x4f\x3d\x8b\x2d\x0e\x61\x9e\xda\x06\xdb\xc0\xa6\x43\xf8\xec\xfb\x57\xdd\x43\xe7\x13\xd9\xcd\xbb\x17\xe1\x1c\xc6\xed\xfb\xac\xea\xfc\x2d\xd6\xe2\xb9\x3e\xc2\x98\x30\x2a\xd8\x7a\x3f\x05\x6c\xbd\xe7\x51\x82\x51\xa0\xfb\xdd\x14\xa0\xfb\xdd\x11\x10\x31\x42\x97\x77\x93\xd8\xd7\x1d\x87\x2a\xa9\x8a\x6f\x9a\xe2\xe3\xa8\xf7\x07\xfb\x06\x74\x07\x61\xf5\xe5\x10\x53\x91\xc5\x95\xd7\xae\x5f\x41\x90\x36\x75\x4d\xf6\x10\xde\xaf\xa1\x43\x21\x5c\x97\x1b\x88\xa8\x24\xae\x4a\xdb\xb2\x38\xca\x51\xbc\x78\x8d\xfa\xf1\xee\x78\x28\xb3\xa2\x65\xc3\xe9\x63\x5a\x34\x35\x37\xeb\xe3\x58\xab\xb2\xbb\xbb\xb4\xa2\x2f\x50\x6a\xe7\xea\xfb\x99\xf0\x70\x7a\x5b\x56\xfb\xc5\x2e\x23\x3e\x5b\x3b\xfb\xe7\x53\xe0\x70\xd2\x42\xa8\x17\x24\x74\xd3\x40\xa3\xb5\xdc\x88\x3c\x58\xda\xbf\xd3\xd2\x46\x59\xf1\x98\xe4\x99\x6e\x80\x34\xbe\xa4\xda\x95\xa9\x0d\x8b\xcd\x09\xdd\x48\x60\x23\xc3\x28\x79\xcb\x8d\xdc\xb2\x7e\xb8\xb1\x98\x5c\x2c\x37\x03\x81\xb3\x94\xa6\xec\x15\x9a\x42\xd8\x96\x45\xdd\x54\x0f\x5d\xc2\x40\x11\x8c\xc6\x5c\x51\xec\x3c\x92\x5b\x11\x02\x4a\x87\x93\x13\xe2\x33\xed\x68\x88\x49\x04\xeb\x6d\xfb\x0f\x36\x2c\xb9\xe6\x4d\xd8\xfe\xa3\x12\x86\x45\x3d\x4a\x75\x16\x5d\xd3\x8a\xb8\xf4\x03\xbe\x2e\x6e\xca\x7c\x27\xe1\x32\x2f\xb7\x5f\x90\xf6\xad\x34\xa5\x0c\x79\xa8\x42\x52\xa5\x89\xfd\x26\x43\x76\x0b\x01\xc0\x17\xaa\x7b\x86\x76\x3c\x66\x93\xc4\xff\xf3\xa7\x78\xb3\xf5\xd2\x00\x6f\xce\x37\x90\x02\xe6\x5f\x1c\xc7\x71\xd8\x9f\x04\x8e\xfc\xd7\x3f\xdd\xde\xae\x96\x91\x88\xd9\x3a\xcd\xd3\x6d\xb3\x20\x0f\xf0\x60\x6a\x97\xd5\xdd\x4d\xf2\x81\xb4\x0a\x82\x60\xae\xf9\x8b\xe7\x46\xff\xe2\x38\x17\x18\xc0\x6d\x52\xa5\x1c\xec\xc8\x5d\x24\x40\x18\xb9\x09\x58\xdb\xf2\x40\xa8\x5d\x6e\x2c\xb3\x2d\xb4\xed\xfe\xa1\x65\xc0\x79\x6a\x5a\xe8\x01\x92\x18\x80\x6b\xb3\xbd\x15\x0e\x2d\x43\x39\xcb\x14\xd3\xaa\x2a\x2b\x4a\x49\xbd\x43\x99\x42\x23\xc4\x79\xfa\xa6\x7c\xd6\x9c\x12\xca\x09\x72\x81\xb7\x1e\x91\x40\x55\x03\x21\x2b\x76\x69\x93\x56\xfb\xac\x48\x9a\x01\x3c\x0e\xc2\xda\x27\xd5\x97\x71\x1b\xb8\x6b\x6a\x73\xde\x9a\x0f\xe6\x21\xc0\x16\x83\x53\x4f\xd6\x1e\xd1\xe3\x0d\xa1\x24\x08\xe4\x2f\xe9\x8e\x1b\x3e\x66\x45\x9d\x36\x90\xbd\x08\xac\x26\xe4\xfc\x45\x26\x09\xed\xca\x8b\xbd\xb6\x23\x29\x8d\xb4\x85\x11\x20\x06\x63\xbc\x20\xa4\xc8\x0c\x12\x20\x74\x21\x86\x57\x0d\x83\x49\xf7\x5e\x8f\x54\x2d\x3c\x11\xf9\xc6\xe1\xc1\xf5\x71\x3c\xfa\x0f\x75\x39\xe4\x9e\x8c\x6a\x63\x7e\x6e\xb0\xb6\x76\xa7\x4f\xd5\xca\x65\x20\xa1\x78\x96\xeb\xa4\x45\xdd\xc6\xa3\x10\x9a\x2a\xd9\x0e\x51\x76\x40\xc3\x7e\xe7\xad\x34\xd8\xa4\x44\x12\x4e\xb2\x22\xad\x68\xe8\x5b\x1a\xa2\xf4\xa9\x4a\x0e\x87\xb4\x02\x01\x64\x49\x2e\xe5\xdb\xac\xe1\x92\x33\xf0\x49\x05\x5f\x29\x5c\xb2\x39\xdb\x2f\x55\x99\x1f\x55\x6f\x56\x21\xc0\x2f\x1e\x1d\x18\x46\x5f\x26\x35\xea\x26\xa9\x10\xe8\x0e\x19\xee\x25\x09\xae\x5a\xa5\x8f\x69\x92\xcf\x8d\x75\xb6\x79\x9a\x54\x47\xd1\x01\x48\xae\xdf\x2d\xff\x51\x94\xac\x0c\x47\x81\x28\x62\xcd\x1d\xd6\xe4\xc2\x00\xdc\xa1\x91\x5e\x0d\x15\x5c\xba\x74\xf4\x2b\x8d\xfd\x2a\x4a\x70\xa6\x83\x42\x19\x11\x6d\x63\x1c\x51\xbf\xfe\x83\xc3\xe2\x47\xf3\x60\x45\xba\x2b\x4f\xc7\x24\x6e\xbb\xcd\xe0\x99\xdf\x34\x0c\xd2\xb5\xdd\x4a\x11\x94\xfc\xde\x7c\x3d\xa4\x3f\x93\x5d\x06\xb2\xe7\xd7\x79\x46\x34\x44\xf7\x0f\xfb\x1b\x24\x3a\x3f\x1f\xdf\x90\xa4\x73\xc2\xe0\x28\x96\xe9\x2d\xc3\x44\x1f\x43\x57\x12\x23\x89\x10\x81\x46\x0e\xe4\x5d\x95\x4f\x74\xf7\xb6\xcc\xe2\x92\x86\x8c\xc4\x5b\x62\xa4\x0c\x7d\xd8\xd5\x52\x31\xe3\x33\x9b\xd6\x32\x6a\xff\x31\x92\x3d\x9f\x0a\xad\x3a\xa0\xf1\x8d\xb5\x1a\x5f\xcd\xad\x68\xee\x10\xb6\x8b\xc5\xd1\x06\x33\xe8\x18\xaa\x26\x54\x33\xac\xcb\x42\x53\xaa\x1c\xb1\xc3\x29\x63\x85\x5c\x63\x29\x33\x43\x11\x10\x86\x68\xd4\x3a\x5a\xd4\xd6\x02\x35\x2f\x8d\xe8\x0e\x69\x4a\x5c\x0a\xc5\x19\x5d\x40\x06\x01\x64\xc3\xa4\x04\x05\x40\x4f\x7a\xc2\xb3\x6e\xd8\x61\x96\xd7\xe6\xa7\x12\x41\xc2\x4d\x52\x67\x35\x7d\x1c\x80\xe8\xa3\x2d\xc8\x15\xae\x3d\xdd\x88\xf2\xa8\x0b\x4b\x1a\xc0\xa8\xa5\x81\x12\xb5\x34\x90\xa3\x96\x06\x60\x3e\x2c\xd3\x06\x3e\x1f\x41\xeb\xd2\x67\xd7\xb8\x6a\x0f\xf2\xae\x29\xf9\x61\xdb\x12\x9e\x51\xc2\xeb\xd8\xc2\x67\x4a\x32\x8a\x19\xa2\x61\x01\xac\xfb\x88\x32\xca\x70\xbb\x8e\x06\x1f\x7f\x15\x55\xd0\xdc\x61\x0d\x2f\x90\xde\x44\x14\xa3\x54\x26\x76\x3e\xa2\x3b\x86\x37\xd6\x10\xc5\x1b\xde\x4e\x40\x94\x0e\x4f\x12\xb7\x0c\xa2\x28\x18\x18\x9e\x40\xab\xb4\x3e\x43\x09\xb9\xe1\x61\x08\x51\x47\x82\x46\x62\x57\xa0\x48\x83\x9b\x42\x75\x80\x0d\xdf\x97\x55\xf6\x8f\x96\x1f\xe5\x8e\xc2\x9b\x3f\xa9\xcc\x62\x3e\xa6\x25\xfc\x32\x9a\xf1\x6f\x28\xaf\xa0\xec\xec\xbe\xca\x8a\x2f\x92\x51\x87\x1f\x75\x8b\x27\x8d\x87\x67\x68\xd0\x03\xef\x99\xd8\xe0\x54\x10\xd6\x2b\x9c\x70\xc2\x91\x46\x3d\x7f\x6c\x10\x29\xce\xb2\x67\x29\x1b\xf6\x58\x32\x0c\xb4\xcb\x43\x61\x9c\x25\x00\x2d\x4d\x5a\x00\x2c\x36\x37\xa1\x59\x3b\x9e\x21\x44\x09\x8b\x67\x9a\xa4\xfe\x98\xec\xd9\xb7\xda\x4a\x3e\x8d\xb0\xd3\xac\xf7\xc3\x82\x9b\x0f\xb2\x4b\x15\xae\xba\xf3\xe6\xda\x11\x20\x2c\x44\x48\x35\x62\xd1\x87\xc0\x23\xac\x7a\xd2\x73\x15\x6d\x7f\x86\xe3\x52\x48\xb0\xa2\xf2\xa1\x16\xd6\xb1\x7b\x04\x0e\x45\xbc\xd1\x6c\x2e\x48\x69\x77\xb3\xe6\x1d\x2a\xbe\x57\x78\x3d\x8c\x36\x65\x15\xb1\x20\x7d\xe0\x60\xfe\xd3\x0e\x4f\x78\x33\x13\x5d\x69\x46\x0d\xae\x03\xbc\xec\x0f\xe4\x35\x1a\x78\x88\x75\xf6\x50\xdc\xee\x93\xcb\x4b\x20\x8a\x3a\x7b\x32\x47\x7b\xa4\xa8\xb1\x4c\xed\xa1\x4a\x34\x82\x9b\xa3\x4f\x3d\x7c\x85\xb4\x50\xdb\x87\xaa\x2e\xab\x4b\xf6\x8e\x26\x88\x74\xa2\x0c\x64\x94\xc0\x31\x2d\x52\x2f\x8a\x8f\x40\xe6\x47\x02\x60\xe0\xa1\xdf\x85\x76\xb4\xe0\x3d\xdf\x94\xee\x44\xc1\x37\x77\x28\xa6\x7e\x66\x8e\x10\x36\x02\xbd\x62\x1a\xaf\x6f\x9a\x2b\xab\x9d\xd5\x86\x49\xc7\xd8\x1b\x6f\x8c\xc0\x22\x7b\xf1\x14\x71\xc9\x1f\x33\xfe\xff\xd9\xdd\x7d\xde\xe2\x84\x19\x08\x50\xa2\xe0\xa5\xfc\x76\x4b\x15\xd7\x55\x4b\x3b\x64\x6e\x58\x65\xd1\x7f\x6f\xc2\x2a\x27\xb7\x0d\x64\x19\xdd\x22\x23\x6b\x4a\x64\xe1\x2e\xc1\x17\x0c\xe8\xb8\x04\xa8\xa5\x0f\xc9\xbe\xb2\xa0\xfc\x65\x5c\x2d\x01\x86\x44\xc6\x75\x46\x94\xdb\x9d\x6d\x91\x44\x93\xf4\xaf\x7d\xb4\x46\xf2\xb7\x9c\x84\x72\x9c\x93\xb2\x0b\x87\x05\x70\x5c\x2c\x23\x12\xc0\x71\xc4\xca\x32\x0d\xa6\xb4\xb6\xe0\x75\xe9\x4f\x34\x12\x28\x8c\xc0\x6a\xad\x3c\x9e\x3b\xac\xf5\x05\x70\xb7\x9f\x3c\x36\xba\xba\x27\x72\x57\x76\xbb\x01\x8f\x13\xe2\xd4\xe7\x23\xc6\x67\x00\x73\x1c\xe6\x06\x1c\xaf\x56\x54\xa2\x7f\x4e\xe9\x71\x7c\x16\x2c\x10\x24\x9f\x8c\x04\xba\x54\x70\x13\xd1\x80\x0c\xd8\x7d\x52\xc4\x83\xf1\x3e\x39\x0a\x1d\x38\xfb\x36\x6d\x23\x1c\x81\xe2\xc7\xd3\xb5\x2c\x16\xe0\xcf\xa9\x7b\x01\x12\xe3\x94\x13\x53\xa4\x59\x9e\x22\xd4\x44\xb3\xc3\x37\x49\x8d\x7a\x1a\x17\x55\x98\x40\x51\x94\xcd\x22\xc9\xf3\xf2\x29\xdd\x8d\x87\x34\x3c\xcf\x61\xe5\xf9\x59\xb8\x69\x87\xc7\xed\x76\x58\x93\x3b\xfc\x88\xa9\xc4\x0e\x91\x04\xf9\xb3\x4d\x44\xdd\xcf\xa3\x0e\x45\x60\xa2\x38\x68\xb9\x38\xfc\x62\x27\x9b\xb2\xca\xec\xc4\x4e\x37\x65\xd3\xc3\x79\x91\x69\xc5\x74\xcf\xd5\xd9\x18\xbe\xac\xbd\x5e\xcb\x97\x31\x29\x76\xec\x14\x26\x78\x25\x5c\x06\x6c\x7b\xfe\x4f\xed\x4d\x59\xbe\x59\x1a\xc1\x9c\x93\xaf\x4e\xeb\x4d\x4a\x58\xd9\xc2\xc9\xf2\x54\x7f\xdb\xd5\x68\xb1\x61\xa3\x89\x57\x5f\x08\xc2\xf2\xda\xab\x36\x19\xbe\xf2\x8a\x23\xbd\x69\x8a\x2e\x07\x70\x5f\x7e\xec\x62\x9a\x53\x24\x7b\xe0\xc2\x2b\x27\x17\x53\x85\x7b\x1e\x03\x65\xe1\x6b\x75\x4f\x10\xc5\x12\x0d\x23\x0b\x62\x6c\x3f\x91\x12\x87\xb0\xad\xde\x93\xc7\x0f\x06\xb9\x6b\x8f\x9d\xdd\x10\xc9\x4a\xf7\x79\x6f\x6d\x39\x50\xba\xf2\xc8\xfc\x44\x13\x01\x35\x73\x1c\xcc\xc3\xac\xb4\x3b\xf2\xcb\x65\xdb\x3a\xa9\x92\x82\x34\x2b\xd2\x2b\x62\x60\xa0\x7e\xac\xd5\x6f\xa5\xf2\x09\x4b\x37\xca\xce\x56\x25\xfa\xa7\x3e\xe0\xd8\xa5\xe7\x78\x57\xa8\xde\xc3\xd3\xaa\xe0\xe1\xcb\x00\x76\xc2\xa1\x97\x89\x53\x1f\xb1\x65\x45\x03\x1e\x00\x89\xa3\xc2\xe1\x3a\x51\x69\x51\x94\xc7\x51\xb0\x4a\x6a\x24\x9f\xae\xe8\xf7\x2a\x4d\x76\x65\x91\x7f\xfd\xe3\x28\xca\x2f\xb4\x61\x51\x36\x1f\xfa\x2a\x17\xf0\x56\x4a\x43\x22\x2d\xee\xda\xa5\x48\x8b\xe6\x43\x53\x3a\x74\xb6\x73\xe0\x9f\xe0\x6c\xa2\xd9\x5c\x9e\xb7\x60\x7b\xdb\xdf\x16\xda\xba\x17\x4e\x51\x2e\xaa\xf4\x90\x26\x0d\x94\xce\xc8\xb4\x3c\x87\xfa\x0e\xf5\x11\x9a\xa4\x1a\x8e\x1b\xd4\x4e\x9a\xd4\xa9\x61\x06\x14\x15\x73\x7d\x05\xb6\x95\x5a\x7c\x9d\x7a\x57\xd2\xcc\x53\x99\x58\x3b\x2d\xa7\x7f\x3b\xa7\xc3\x3a\x9f\xd9\xca\x95\x4e\x7e\x07\xf7\x12\xcd\x6a\x63\x08\x10\x2f\x20\x46\x04\xe8\x5e\x43\xcf\x42\x45\x1a\xe0\xe7\xa6\xa2\x21\x24\x41\x82\x1a\xaa\x3b\x44\x5b\x67\x45\x2d\x4a\x5b\xc2\x9b\x54\xf7\xea\xa6\xb3\x12\xdb\x26\xf9\xf6\x03\x81\xb0\x70\x7c\x78\x41\x57\x8f\x1a\x7a\x1a\x88\x27\xbb\xb1\xee\x98\x53\x9c\x9e\x85\x1c\x8f\xea\xf3\x38\x7a\xe7\x02\x4f\x96\xf2\xe0\xfa\x79\x7d\xec\xe6\xd5\x5b\x01\x29\x69\xbd\xf9\x16\x5c\xde\xc6\x7e\xbc\xd1\x6c\x41\xc5\x9b\x61\xee\xb0\x06\x17\xdf\xf0\x6c\xe1\xa7\x83\x7d\x31\xb8\xe7\x84\x06\x28\x8c\xbe\x39\xfd\xc0\xa7\xf0\x8f\x71\xfc\xc9\x09\x46\xb4\x42\x1f\x59\x0f\xe5\x44\xa4\x9f\xdf\xc8\x39\xa8\x0c\x46\xbe\x04\x82\x5a\x02\x63\x10\xe5\xc0\x4e\x7e\x14\x3d\xcf\xae\x30\x86\x85\x43\xc4\xf9\xfe\x51\x59\xa5\x2b\x44\x8c\x62\xc0\x98\xf5\xa4\xbe\x02\x65\x89\xd4\xeb\x80\x8b\xed\xf4\xa7\xb2\x3c\xb4\x2e\xe1\x71\x68\x83\xa1\x5e\xc0\x87\x45\xb2\xdb\x95\x85\x95\x35\xaa\xc6\xd0\xcb\xb6\x0f\x2c\x5c\x2b\x35\xa9\x76\xa8\x83\xaf\x35\x20\x10\x9c\x16\x48\xc6\xd4\xcf\xd9\x73\x6c\x26\xdd\xde\xf9\x98\xf9\xf5\x5b\xbf\xc4\x88\x3b\x6e\xdc\x1e\x93\xb1\xf3\xed\xe6\xa1\x69\xca\x62\x1c\x7e\xc4\x17\xe5\x71\xc8\x75\xb6\xbb\x1a\xd8\x47\xd8\x37\xe3\xbe\xa2\xda\xd4\xe1\xd8\x3b\xc2\x82\x1e\x0d\x73\xf6\x5f\x4b\x03\x69\x6c\xca\xdf\x4d\xea\x66\xa7\xe2\xbb\xac\xad\x43\x8d\x49\xc2\xb6\x3b\xab\xbe\x93\x5c\x2d\x5b\xa6\xc1\xe5\x95\x8e\x64\x6e\xc4\xd1\x79\x40\xb7\xf5\xa9\xc7\x89\x5e\x11\xa9\xd3\x50\x09\xed\x26\xea\x22\x05\x18\x96\xca\x48\xa4\xcd\xb0\x36\x52\x1c\xac\x60\x8c\xbf\xcb\xca\xf3\x9a\xde\x88\x7d\xfd\x18\x76\x37\x8a\x7f\x97\x6c\x74\x83\x4c\x8a\x05\x75\x96\x03\xa0\x5b\xa0\xfb\x9f\xd3\x38\x27\xe2\xdb\x72\x60\xf6\xba\xc7\xc2\xfe\x38\x86\xbe\x62\x34\x50\x47\x2f\xf8\x3e\xeb\x7c\xd3\x50\x0f\xb6\xb9\x23\xfa\x9d\x41\x60\xf2\xdb\xe1\xd0\xb0\x5f\xcf\x16\xc8\x6a\x64\x1a\xb4\xbe\x8d\x11\xf2\xf3\x1a\x37\x16\x11\x64\x31\x61\xf1\x05\x3f\xc1\xc1\xc5\x97\x7c\x0e\xe5\xc5\x87\xc0\xd0\x6d\xad\x25\x55\xed\xf8\x95\x07\xee\x38\x8e\x87\x1f\xb8\x07\x3c\x41\x41\xde\x42\xf3\xa6\xb0\xc5\x0b\xf7\xd6\x1c\xc0\x4f\xa8\xe2\xc7\x20\xc3\x61\x6c\xde\x42\xfa\x1a\xc7\x1a\x5f\xc6\x0a\xc3\x68\xbb\x6c\x67\x1f\x2c\x4a\x0d\xdf\xed\x7d\xd8\x70\xf8\x5b\x3f\xc9\x0d\x0a\x2e\xe7\x7b\x19\x1e\xec\x4a\x7d\xa7\x13\xef\xd5\x73\xdd\x85\x1b\x91\x28\xd4\x47\x34\x0c\xa2\x70\xb5\x37\xdc\xe4\xdf\xf8\xed\xf4\x9f\xe7\x89\x4d\x59\xc7\xfe\xf2\xec\x33\x9f\x6f\xf6\xfa\x26\x89\x7a\x8a\x5f\x22\x7f\x10\x0f\x0c\xeb\x0e\xaf\x35\xfa\xd5\xc7\x9f\xee\xf0\xaa\x44\x43\xc5\xa3\x55\xfc\x71\x31\x08\x5a\xaa\xff\x43\x3d\xee\x59\xcd\x08\xa2\xd8\xaa\x41\x7f\x91\x1c\x8b\x3c\xcb\xd5\xd4\xf6\xf7\x5a\x4a\x56\x74\x98\xfd\x08\xed\xa6\x25\xd7\x47\x44\xbd\x96\x37\xdb\x4a\x7a\x7d\x5d\xd3\x5a\x93\x68\x39\xa6\xb5\x4d\xb6\xed\x26\x1e\x5c\x12\x00\xc7\x50\x8b\x02\x13\xa5\x00\x12\xf5\x27\x08\x82\x39\xff\xd7\x8d\x2e\xcc\x22\x81\x26\x7e\xd0\xdc\xe9\x40\x39\xfd\x1f\x9e\x1b\x5d\x08\xfa\x1b\xbc\x3f\xbd\x51\xf8\xf8\xde\x4c\xf8\xe6\x32\xd7\x20\xaa\xbe\xc3\xcb\x35\xda\xb1\x43\x83\xfc\x0c\x8d\x8f\x55\x1b\x7e\x86\x42\xa2\x23\x89\x56\x89\xf8\xf4\xc9\xa3\x5c\xfa\x7c\x48\x8a\x61\x54\x81\xba\x48\x18\x0b\x49\xce\x50\x4d\x3e\xf4\x5a\x16\xb1\xa9\x95\x5b\x06\xbf\xb8\x43\x47\x0c\x9a\x88\xbd\x4f\x4d\x06\x82\x5b\x43\xc6\x92\xed\x93\xbb\xf4\xf2\xa1\xca\x3f\xec\x92\x26\xb9\x24\x3f\xff\xb5\x7e\xbc\xfb\xf8\xbc\xcf\xaf\xb6\xf7\x49\x55\xa7\xcd\xcf\x0f\xcd\xed\x7a\x3e\x0b\xaf\xeb\xc7\xbb\x59\xe0\x3d\xef\xf3\xa2\x9e\x85\xbf\xce\x82\xe0\xbe\x69\x0e\xb3\xf0\x97\x59\xf0\x79\x16\x7c\x7e\x7a\x7a\x72\x9f\x42\xb7\xac\xee\x66\xc1\xe7\xc0\xf3\xbc\x59\xf0\x99\xb4\x08\x66\x81\xf7\x98\xa5\x4f\x7f\x2d\x9f\x69\x33\x6f\x16\xb4\xa5\x9e\x1f\xb0\x3f\x82\x59\xf8\xb7\x99\xf7\xcb\x8c\x94\xb0\xff\x87\xd7\xbb\xf4\xb6\x46\x0a\xc4\x4a\x24\xe9\xd4\x2c\xfc\x9b\xbb\xcd\xeb\x85\x3f\x5b\xfd\xf5\x36\xcb\x73\x32\xa6\x90\x92\xe2\x2c\xfc\xeb\x6c\xf5\xeb\x2c\xbc\x6e\x87\xc3\x2a\xab\x7d\xcd\x82\xcf\x9a\xee\xc2\xeb\x26\x6b\x48\xab\xeb\xa4\x4a\x1b\x5a\x97\x7f\x52\x2b\x1f\x92\xe6\x7e\x16\x78\xdb\x3c\xa9\x19\x92\xe8\xc0\x08\x16\x76\xf4\xcb\xdf\xe3\x59\x70\xbd\xf9\xcd\x77\x83\x59\x70\xbd\x74\x83\xc4\x73\xe3\xf5\x2c\xb8\xe6\xff\x61\xff\xfa\xed\xbf\x0b\xff\xb7\xb6\xf6\xca\xf5\xda\xa2\x8d\xbb\x5e\xce\x82\xeb\xd0\x0d\x96\x48\x23\x1f\xfe\xfb\x6f\xa4\xcb\xcf\x6c\x90\x74\xfa\x8f\x77\xf4\xa7\x70\xb6\xd0\x63\xfd\x52\x7f\xc0\x33\x07\x51\x39\x89\xf1\x3e\xdb\xed\xf2\x5e\x1e\x45\xa9\x97\x30\x30\x4e\xc3\x56\xcf\x54\x9a\xa8\x6a\xf2\x8b\x15\xbc\x72\x61\x1b\x86\x9d\x2e\x82\xab\x28\xba\xb1\x58\x68\x63\xb7\x57\x43\x60\x17\x05\xd5\x33\x16\x63\x0d\x83\xba\x57\xf9\xcc\x9d\xb3\x0f\x2d\x9a\xff\x38\x02\x81\x1e\x78\x10\x11\x67\xa8\xc1\x93\x42\x1b\xcc\xad\xf3\x8b\x1a\x56\xe2\x19\x32\x48\x6b\xfa\x12\x45\x74\x29\x13\xa7\x9d\xbb\x1d\x12\xab\x0b\x84\x48\x66\x9c\x4d\xf2\xb0\x26\x5e\xcd\x8a\xfc\x42\xa5\x01\xe5\x33\x93\x25\x20\xa6\xc5\xaa\xf4\x13\x97\x12\x5e\x0c\xf3\x67\xc6\xb2\x32\x7f\x7e\x86\xc2\x59\xf1\x03\xb3\xf3\x15\xf6\x69\x38\xe9\xd0\xea\xbe\x67\x8a\xc4\x27\x1e\xa7\x74\x37\xea\xee\x26\x2f\xf3\xae\xa3\xf6\xdc\x77\xfa\x1d\x1d\x6f\x68\xd7\xee\x77\x90\x9c\xec\x07\x81\xb2\x5d\xe3\x88\xd4\x50\x94\x63\x82\x1e\x89\xbd\x7f\x82\xca\x91\xc1\x66\xdf\x51\xf4\x1c\x3d\x05\x78\xc1\x18\x3d\x11\xda\x18\xb7\x66\x39\xfd\xd9\x44\xa7\x2c\xc3\x0e\x2f\x55\x3f\xd6\x05\xf4\x34\xd8\x8e\x0b\xfa\x47\xdc\x91\x42\x06\x63\x19\x28\x81\x37\xd3\x98\x2b\x92\x0e\x44\xd6\x5f\xa5\x44\x10\xe1\x02\xc8\x98\xf3\x51\x1b\xbb\x74\xc4\xc1\x78\xc2\xeb\xd6\x09\x4a\x35\xf1\xfc\xec\x33\x02\xf4\x09\x01\x70\xbb\x71\x3e\xe3\x17\xb9\xd0\x77\xc0\xbf\xaf\x91\x73\x47\x32\x67\x66\xec\x4a\x0c\x14\xa7\xeb\x49\xa3\x98\x96\xec\x6f\x95\x9d\x64\xa2\x69\xdd\xa6\x45\x80\x0c\x7b\x9e\xe0\x9b\x0f\xd9\x5b\x26\x7b\x5e\x33\x90\xa1\xb7\x01\x31\xb3\xf5\xdd\x5d\x2b\xac\x30\xc2\x59\x94\xb7\xb7\x36\x91\x90\x95\x66\x85\x36\x78\x79\xa4\xb4\xba\x4f\x8a\x1d\x68\x6c\x88\x9e\x2c\x35\xec\x48\x71\x97\xde\x26\x0f\x79\x33\x3a\x54\xb1\x0e\x0e\x1b\x91\x19\x8e\x16\x4a\x79\x7b\xab\x1b\x89\xcd\xc0\x8d\x60\x55\x1c\xd9\xcc\xc1\x04\x92\x63\xff\x05\x06\x5c\xbc\x14\x54\x7b\x2c\x58\x42\x9c\x86\x04\x01\xc5\x8c\xb1\xd2\xaa\xc6\xd8\x36\x2f\xf0\x9c\x84\x75\x2e\x85\xe9\xc3\xaf\xfd\x7a\x63\x1c\xdd\x53\x1f\x3a\x4f\xc3\x63\xa1\xda\x83\xf4\x76\x83\x7a\xeb\x11\xf6\x14\x08\x36\x3e\x82\xa5\x96\x0d\x9e\x35\xb6\x34\xa1\xac\x47\xd3\x1a\xcc\x80\x8c\xec\x96\x7d\x0e\x5a\xf3\x68\xe2\xfa\x29\x3a\xc0\x0d\x8c\xac\x18\x47\xd0\x7c\x47\x75\x2d\xe7\x22\xc6\x12\x5e\xd1\x45\x35\x8d\x99\xb2\x21\xbb\x07\xd1\x23\x55\x93\x06\x0e\xcd\x94\x7b\xc9\x04\xb1\x8f\x91\xd6\xa5\xf5\xa3\x11\xfd\xd8\x52\xf7\xaf\x4f\x8b\xdd\x43\x95\x10\xdc\xb9\x7e\x54\xc3\x82\x26\xdb\xb7\x82\xcd\xed\x43\x41\x83\xa5\xa5\x49\x9d\x2e\xb2\x02\x56\x39\x54\xe5\x21\xad\x9a\xaf\x97\x82\x38\x27\x8f\xda\x7a\x55\x5f\xd1\xdc\xc7\x66\x74\x3a\x1b\x2a\x48\x06\x51\x92\x04\x81\x56\xc4\x52\x8f\xef\xb9\xc3\x9a\x60\x54\xc0\x81\x8d\xa0\x02\x08\xf0\x6d\x2e\xf2\x50\xfc\x24\xdb\x9d\xbb\x02\x5c\x64\x05\xf6\x23\xfb\xe4\x21\x7b\xf4\x36\x69\xff\x19\x58\x1c\x49\x4a\x9a\x3b\xac\x59\x77\xd1\x20\x5a\xf1\x4b\x8c\x31\x90\x44\x6f\xca\x2a\xf2\x5e\x07\x57\x51\xdf\x33\x30\x07\x95\xb6\xf3\x4b\x6c\x66\xd2\xc5\xbc\xed\x60\xf2\xde\x80\xca\xe2\x45\x6f\x54\xb9\xf0\xd9\x2c\xbe\xef\x90\x5d\x31\x78\xf9\x91\x9f\x37\xee\x52\x7b\x99\xd2\x01\x98\xcc\x18\x0c\x7a\xcc\x01\x79\x0e\xaa\x8a\xc7\x06\x77\xb1\x06\x6d\xbf\xd2\xa2\x59\x9e\xd6\xfc\x6c\x3c\x28\x83\x85\x9f\xa8\xb4\x18\x9e\x25\x90\xe0\xc7\xab\x95\x87\xae\x19\xa7\x23\xad\x8b\x8d\xf2\x92\x13\x65\x7c\xd0\x07\x6c\x10\xe1\x5c\xd3\xd0\x81\x88\xf1\x80\x4a\xf5\x7e\x2c\x52\xe4\xd6\x11\x8c\xc5\x6c\xcd\xfa\xf6\x36\xd9\xdd\x74\x5a\xd1\xcd\x58\x88\xa7\x03\xe9\xc5\x7a\xc2\xe8\xb2\x31\xaa\xd1\x1e\xab\xb2\x2b\x02\xe7\xe1\xa7\x12\x3f\x94\x47\x51\x9e\x4b\x13\x75\x92\x36\x8e\x60\xb9\x38\xee\xce\x22\xc0\xb1\xb8\x4b\x60\xf2\xf2\x49\x70\xe1\x59\xa8\x3b\xb7\xbb\x83\x4c\x7b\x84\x0d\xf5\x86\x9f\xc0\xda\x53\x77\xb0\x43\x93\x91\x2a\x08\xa9\x0f\x7c\x6d\x74\x4e\x3b\x58\xa8\x7f\xfb\xbe\x06\x0c\x62\x85\xa1\x93\xef\xa6\x3b\xb2\xd0\x5e\xa4\x20\x41\xe3\x0e\xc1\x59\x90\x0c\x69\xfb\x50\xd4\x69\xc3\xb3\xb8\x22\x64\x33\x0c\x0d\x2c\x99\x00\xcc\xb4\x7c\xa4\x8a\x65\x3f\x06\x12\x11\x07\x7f\x96\xce\x0c\xbb\x5e\x9a\x5d\x68\x8f\xaa\x01\xe6\x88\xcf\x05\x81\x7d\x02\x61\x4a\x34\xb4\x02\xfe\x18\xc5\x9d\x29\xba\x96\xf0\x42\xf4\x1f\x0f\x75\x93\xdd\x7e\xc5\x8c\xd2\x95\x1c\x42\x69\xb1\x93\xd8\xb3\xc6\xea\x5a\x18\x81\xe3\x92\x6c\x4c\xd4\x49\x5c\x93\xad\xda\x33\x7b\x36\x51\x6f\x30\x35\x4b\xa9\xac\x59\xe2\x46\xc0\x3e\x72\x57\x55\x43\xba\x6a\x1d\x34\x34\xa9\xa4\xe4\xa0\xa3\xa4\xe2\xd1\x88\xcd\x6d\x4a\xc6\x35\x88\x49\x00\x50\xb2\xfa\x13\xbf\x7d\x14\x71\x29\x20\x84\x26\x66\x56\xa5\x60\x25\xfb\x0e\x30\x58\xd1\x69\x26\x25\x5f\xbf\x40\xb2\x3e\x63\x18\xe5\x2e\x28\x76\x18\x05\xa9\xb5\xe6\xbd\xa7\xc9\x70\x6e\xa0\xea\xa1\x28\xda\xc9\x53\x00\x47\x61\x4c\xd2\xfa\xbf\xd6\x10\x69\xfa\x22\x1d\x32\xc1\xab\xd0\x82\x71\x50\xf5\xba\xae\xd7\x26\xbc\x28\x21\x63\x73\xdb\x97\xff\x80\xf8\x78\x23\x18\x07\xa3\xa2\xc9\xa2\xa4\xf8\x12\x6f\x12\xbd\x7f\xa9\x1f\x0e\x87\xb2\x6a\x6a\xe7\x03\x09\x1c\xb3\x4f\x99\x36\xbe\xdd\xac\x17\xc7\x01\x66\xa9\xda\xa7\x0a\x75\x5d\xa1\x6f\x34\xcb\xd6\x9e\x8d\xab\xe5\x04\xd5\x71\x60\x3b\xbf\x28\x5d\xc9\xeb\x65\xcf\x7c\x08\x7f\xd4\x4c\x8e\x12\x68\x07\xb1\xeb\xe3\x8d\x90\x6c\x6d\xa0\x55\xd9\xeb\xe7\x15\xa9\xf4\xdb\xbf\x53\x4a\x79\xc8\xf3\x7a\x5b\xa5\x69\xe1\x98\x09\x73\x4e\x1e\x90\x07\x2a\x89\xd4\x6b\xd1\xc3\x58\x72\xd6\x8e\xe2\x2d\xef\x0b\x05\x0f\x3a\xba\xa1\x69\xd6\xd9\x1c\xcd\x95\x60\x0e\x76\x1a\x30\xd4\xa2\x1b\x1d\xe4\x13\xf7\xa9\xf5\xfc\xda\x4d\x34\x30\x3b\xb2\xb7\xd5\xe1\x7c\xff\xbd\x6d\x3d\xa9\x76\xb3\x0f\x4c\xea\x47\xe0\x07\x74\xec\xdb\xbc\xfa\x35\x69\x92\x3c\xab\x1b\x20\xf1\x6c\x93\x3c\x2d\x76\x49\xb5\x38\x64\xdb\x2f\x29\x09\xed\x9c\x6d\x93\xa6\x94\x92\x82\x6e\x69\x76\x54\xd2\x1a\xcf\x90\x2a\x64\xc3\xe9\xf4\x26\xd0\x34\xa5\xeb\x6a\x7c\x46\xf3\xbe\xe9\x48\x03\x91\x5d\xd2\xa4\x6c\x66\x4d\x95\xdd\xdd\x8d\xc8\xdf\x8c\x34\x35\xa5\x17\x67\x00\xd6\x1e\x32\xe8\x46\xcd\x9b\xad\xeb\x55\x68\x44\xfb\x83\xe9\xb2\x15\x83\x6d\x30\x24\x05\x04\x1b\x7d\x0b\xa9\x37\x51\xf3\xa8\xca\x74\xa0\x2a\x53\xbf\x04\x5d\x52\xfa\xae\x66\x53\xee\x92\xaf\x2c\x53\x6e\xaa\xcd\xca\x8b\x65\x8d\xd6\x82\x90\x73\x50\x4a\xd5\xa9\x49\x38\xad\x6a\x20\x1d\x86\x10\x6a\x74\xd9\x19\x48\x2b\x9d\x33\x68\x0c\xa9\x67\x85\x39\x12\x1f\x2d\x12\xe0\xba\x50\xb5\x93\x98\x83\x58\x56\x37\x91\x5b\x29\xbc\x7e\xb2\x1b\x29\x76\x73\x57\x09\xb8\xb7\x28\x59\xcb\x99\x1d\xd7\xd0\xb8\xd1\x73\x7a\xfe\xfc\xdf\xb2\x7d\x2b\xf1\x26\x45\xc3\x8c\x0a\xb3\xe2\x3e\xad\xb2\x46\xe7\xed\x7c\x92\x9f\x81\x1c\xb6\xcb\x14\x0f\x66\xdd\xa1\x4b\x9c\xa4\x83\x7c\xa3\x36\xb0\x34\x89\x22\xe3\xac\x52\x12\x45\x1d\xa3\x80\x4a\x82\x11\x7d\x31\xab\x63\xde\x63\x14\xaf\x12\x8b\x1e\x45\x47\x1b\xda\x0c\xed\x17\x98\x7d\x5a\x18\x59\x63\xa3\x94\x02\x6d\xfb\xc0\x8e\xc6\x67\x3a\x46\x6a\x3c\x4c\x64\xbf\x96\xec\x2e\x7d\xc7\x77\xa8\x1d\x66\x0f\xce\x98\x05\x8f\xe5\xae\xee\x4c\x66\x63\x29\xe0\x0f\xb5\xde\x61\x14\x18\x52\xbe\xc4\xc7\x10\xc9\x07\xa3\xc1\xc2\x58\x7b\xb0\x9c\xc7\xe9\x06\x3d\x7c\x5e\xc6\xcf\x06\x04\x0a\xf0\x1c\x36\x5a\xe6\x2c\x42\x3c\x4e\xfd\xa5\x37\xe7\xff\xba\x41\x64\x6c\xd0\xf7\x79\x28\x0f\xd4\x81\xb5\xab\xcc\xe7\xd0\x01\x75\xfa\x3f\xbc\x16\xf0\x85\x12\xb3\xbe\xd7\xc5\x45\xde\x37\xb7\xc3\xc9\x7d\x9a\xec\x64\x32\x90\xb5\x66\x84\x2d\x2d\x6e\xd2\xe6\x29\x4d\x0b\x84\x7b\x01\x70\xf5\x53\xd6\x6c\xef\xd3\xaa\x9e\xbb\x5f\x53\xf8\xfb\x88\xc4\xaa\xfb\xbf\x1f\x16\x84\x54\x2f\xa4\x84\xb7\x52\x4b\x42\xbc\x9e\xe3\x11\xe2\x65\xe4\x16\xd1\x0c\x59\x74\x2c\x75\x9a\xdf\xaa\x43\x69\xda\x0d\x26\x52\xfe\x95\x60\xc9\xcb\x2b\xb6\x6c\x7f\x2e\xb5\x73\xc4\x62\x89\xf1\x0a\x4c\x57\x88\x93\x35\xc0\x97\xaf\x88\x05\x37\x55\x39\xf0\x01\xef\x92\xaf\x9a\x60\x61\x4f\x69\xfa\x65\x97\x7c\x05\x18\xe0\x5c\x93\x95\x1c\xa1\xe5\xba\x68\xc9\x0e\xf9\x14\x38\xa6\xe6\x2c\xf4\xce\x85\x9c\x38\x1a\xe0\x43\x88\x92\xff\x4f\x72\xd0\x40\x1b\xff\x8d\x0e\x53\x46\xc1\xab\xed\x7c\xa3\x60\x2e\xd0\xa6\xdc\x1e\x10\xcd\xe6\x0e\xcb\xb9\x0b\xb0\xde\xf9\xc9\xc0\x6f\x72\x90\x55\xe4\x0a\x85\xf2\x3a\x4c\xfc\x9c\xc3\x88\x42\x6a\x27\x20\xc4\x46\x4b\x34\xff\x94\x74\x00\x22\x03\x09\xa3\xeb\xa6\xcc\x17\x81\xff\x7c\x29\xfc\x8b\xf0\x55\xd4\xbb\x59\x4d\x05\x6d\x93\x9b\xbe\x59\xaa\xef\x3c\x61\xec\x92\xc4\xdb\xc8\xf7\x34\x63\xbc\x30\xc8\xf4\x79\x9b\x3f\xec\xd2\x1d\xb0\x9e\x42\xcb\x51\x47\x2e\xa1\x26\x8f\x17\x27\x60\x7b\xb7\x4e\xc3\x74\x33\x80\x6d\xd3\x15\x63\xee\x30\x18\x46\x2f\x22\xfd\x5d\xa0\x77\xd1\x44\x86\x8a\x90\xc7\x98\x01\x1b\x6e\x31\xfd\xb0\x85\x8e\x3b\xc1\x11\xd8\xaa\x21\x2f\x71\x68\x1b\xcd\x0a\x48\x9c\xaa\x96\xbc\xb4\xf9\x41\x7c\x14\x35\x1b\x7a\x29\xab\x29\x54\xd1\x9b\x03\x01\xb1\x70\xfb\x4f\x43\x71\x6e\xbf\xb9\xfb\xb2\x68\xee\x45\x01\x98\x0a\x18\x92\x50\xdc\x33\xa8\x80\x0a\x08\xbd\xfb\x8e\xe8\xab\x3b\x7a\x0a\xea\xc9\x8d\xdc\xd9\x14\xa1\x8b\x34\xea\x3e\xa6\x79\x9e\x1d\xea\xac\x16\xe6\x03\xe7\x71\x84\xb2\xc4\x92\xcc\x40\x5b\x97\xfe\xbd\xb6\x11\xe0\xa5\x51\x21\x20\xa9\x88\xd1\x47\x46\x63\x55\x68\x21\x5f\x17\x8e\x52\x19\xc7\x20\xc0\x32\xb8\x21\xfc\x18\x07\x41\x4c\xef\x30\xa8\x74\x00\x8e\x78\xc9\x40\x7c\xc1\x2d\x9d\x08\x96\xf8\x89\x41\x7f\xb0\x70\x41\x2d\xe2\x78\x01\xf9\xfb\x4b\x9d\x23\x6a\xaf\xca\x89\x42\xaa\x40\x46\x40\x2b\x8e\x62\x27\x0a\x0c\x38\x39\x0b\x26\xd3\xb5\xe7\x9c\xb3\x6f\xf9\xd6\xd9\xbe\x32\x74\x88\xed\xef\x7f\x18\x90\xe1\x1c\xcf\xca\x8e\xc8\x2e\x57\xaf\x26\x82\xf2\xb7\xdc\xdf\x94\xed\x05\xd4\xac\x86\xed\x5d\x05\x7b\xb5\x21\x6f\x29\xe8\xca\x22\xa0\xc4\xe4\x15\xc4\x1b\x3d\xdb\x1e\x78\x1d\x1e\x9a\x8f\xf1\x0c\xa9\x12\xd5\x68\x0b\xba\x87\xa0\xfd\x47\xae\x77\xc8\x30\xf5\x21\x41\x24\x5e\x55\x18\x20\x8d\x0b\x6a\xaa\x68\x1e\x25\xa9\x49\x90\xc2\x00\xb2\xa8\xc8\x32\xda\xb2\xbc\xdd\x8d\xf7\xdc\xcd\x85\xd7\xe3\x46\x74\x1d\x76\x7b\x85\xd1\x11\xde\xd1\xeb\xa6\x4a\x9b\xed\xbd\xa1\xba\x39\xab\x3f\x1e\x83\xb3\x25\xd5\xfe\xad\x61\xfa\xfb\x87\x2e\x68\x1b\x97\x05\xfc\x9e\x57\x7b\x30\x36\x1e\xf9\xd4\xe7\xfb\x50\xed\x98\x58\x2c\x45\x16\x06\x9f\x3f\x8e\x89\x81\x32\x48\xee\x4f\xf4\xf4\x41\x2a\x40\x52\xc7\x88\x51\x50\x03\x41\x20\xd4\x42\xd3\xd4\x8d\x50\xc3\xbe\x1f\xb0\x16\x47\xd9\x47\x19\xac\xe6\xf0\x62\x71\xff\xef\xa1\xc5\x1a\xf0\x01\x67\xa3\xd5\x5b\xba\xc1\x68\x92\x01\x8c\x26\xa9\xc6\x1a\xef\xa5\x8c\x35\x95\x32\x94\x08\x93\xe8\x0d\x5e\xe1\x35\x44\xe1\x41\x57\xc5\x70\x0c\xbc\xf5\xc0\x9c\x88\x43\x00\x65\x68\xc6\xa7\x38\x0d\x37\xec\xbd\x88\x08\x0c\xd9\x31\x40\x70\x90\xd2\x7b\x06\x74\xf1\x8e\x35\x0f\x7a\x08\x4f\xef\xc5\x16\x09\x41\x58\xcf\xac\x08\x19\xc0\xb9\x31\x3e\x4a\x0a\xb5\xdb\x93\xf2\x5e\x70\x49\x3c\x11\x70\x3d\x21\x41\x0d\xf6\x59\xf1\xe1\xff\xd7\x56\x2f\xee\x84\x80\x23\x5d\xb5\x39\x09\x53\x79\xd1\xe5\x30\xe9\xb3\x1b\x47\xc0\x8a\x5a\xec\x0a\xbc\xe9\xba\x2a\x19\xa8\x22\x4a\x97\x2b\x46\x19\x33\xdb\xed\xa6\xc0\x43\xa6\x21\x88\x1d\x6b\x02\xb8\xb0\x09\xf5\x16\x55\x03\xb0\xaa\x74\x5f\x3e\xa6\x44\x35\xa5\xcb\x6f\x24\x89\xfe\x72\xcc\x26\xba\xbc\xc2\x89\xab\xeb\x99\xa7\x20\x00\xe7\x35\xb7\x6d\x82\x11\xa0\x1c\xd2\xfd\x58\x97\x1d\xb3\x10\xa2\x71\xda\xd1\xee\x4d\x78\xe0\xdf\x24\x75\xda\xf2\x8e\x89\x84\xad\x0a\x30\xea\xc9\xd6\x4b\x40\x83\x0c\x40\x11\x9c\x40\x44\x75\x70\x73\xe4\xc1\x85\x03\x03\x61\x23\xeb\x21\x91\xc7\x81\x9a\x4f\x90\x67\x8b\xa3\x28\x55\x99\x07\xd8\x8b\x61\x7d\xb2\x09\x78\xe4\x44\x91\x7c\x2d\x5c\x7a\x9e\x90\x5a\x68\xe2\xf8\xb9\x3e\xe4\xf7\xfa\x3e\x39\xa4\x3f\x3f\x65\x05\x79\xde\xc9\xcb\x3a\xfd\x63\x3e\x06\x0e\x53\xa2\x60\x70\x4e\xc6\x84\xfd\x36\xef\x0e\xff\xfe\x8e\x6f\x62\x35\x5c\x6f\xc3\x95\xca\x20\x02\x01\xb5\x9f\xc6\x43\x08\x78\x5c\xba\xf3\x3a\xb7\x57\x2d\x37\x20\x93\xdd\x3e\x54\x55\x5a\x34\xd7\xed\x0f\x99\x41\x48\x81\xa5\xe5\xb1\xc9\x11\x7a\x7a\xbc\xb5\x57\xf3\x3c\x2b\xbe\xa8\x11\x79\x08\x71\x43\x75\x28\x06\x58\x5e\xfa\xa4\xb8\xcb\x95\x35\xef\xea\x8a\xcb\x4b\xeb\x9e\x7b\x5d\x69\x60\x3a\x2b\x95\x12\xbe\x2e\x44\xad\xce\x24\x6d\x31\xcc\x20\x4c\x33\xb7\xb6\x7e\x18\xde\x55\xe5\x61\x57\x3e\x15\x43\xbe\x8c\x02\x5b\xa4\xdf\x34\x7a\x23\x76\xac\x7a\x2c\x39\xd6\x49\x0e\x90\xfd\xe8\x7e\xd0\x77\x65\x30\x81\xe7\x2e\x0d\x85\xe1\x49\x19\x3e\xfd\xfb\x42\x30\x2d\x92\xcd\xc3\xbb\x52\x0c\x1f\x85\x57\xe7\x9e\x68\xea\x26\x69\xb2\xad\x90\xc1\x99\xec\x7c\xae\x9a\x58\x7c\xbd\xac\xb7\x55\x99\xe7\x10\x22\xf9\x6b\x2e\x8b\x09\x8c\x66\x1d\xf4\xeb\x22\x2f\x93\x76\x80\x72\xe0\x46\x1f\x63\xd3\x56\x90\xcc\xa5\xe4\x06\x21\x26\x21\x02\x4e\x4c\x96\x3d\x91\x4c\x46\x18\xa4\x58\x07\xe9\x08\x8e\x63\x2d\x91\xb6\xb2\x81\x72\x00\x83\x13\x6e\x85\x1d\x70\xf8\x43\x91\x08\x53\x78\x1d\x22\xa6\x7b\x79\xda\x34\xed\xa6\x6a\x19\x60\x71\x77\x59\x94\xd5\x5e\x0c\x36\x67\x92\xd7\x44\x5f\x42\x18\xbd\x0e\x2a\x71\xb9\x2a\xb9\xb3\x42\x05\xef\x7a\xe4\x1a\xd7\x9b\x1b\x20\xb2\x25\x45\x9b\xa2\xa9\xb4\xb7\x51\x85\x8c\x49\x34\xfa\xe1\x17\x9c\xc9\x4b\x42\x63\xbc\xa5\xdb\x92\x45\x3f\xd0\x0e\xdf\x45\x42\xad\x9a\xd4\x8d\x5d\xb7\x92\x35\x9c\x9d\xa2\xb4\x6b\xcd\x94\x95\xea\x5d\x19\xc7\x71\x17\x35\x5e\xc8\xa0\x81\xd7\xa5\x77\x13\xce\x32\xba\x87\x59\x6c\xee\xa2\x53\x96\x0c\xc8\x60\x5d\x05\x8e\xe5\xce\x90\xfa\xa1\x4e\x79\xf4\x49\x6a\x49\x2d\x7f\x30\x8f\x01\x86\xb7\xd4\x8d\x44\xf7\xf4\x66\x02\x0b\xa3\xf7\x6b\xe1\xaa\x44\x40\x37\xd7\x30\xba\x81\xf2\xe8\x45\xb6\xc0\x08\xa6\xa7\xe1\xcf\x7f\xd9\xa7\xbb\x2c\x71\x98\x91\x77\x52\xec\x9c\x0f\xbd\x18\x11\xad\xe2\xc3\x33\x73\xd9\x19\xd9\x49\x08\xfa\x18\x31\x4a\xc3\x3a\xe3\x0d\xf8\x0e\x9d\xca\x0b\xa4\xb1\x7d\x87\x50\x91\x4a\x5f\x98\x8c\x3f\xb7\xaa\xda\xdf\xd4\xed\xea\xf3\xab\x80\xd6\x20\x52\x52\x83\x3b\x37\x42\x52\xc7\xa8\xe3\x59\x83\xe2\xb0\x0c\x09\xc8\xc3\xf0\xc5\xa3\x6e\x92\xed\x97\xc5\x63\x96\x3e\x19\xd5\xf9\x6a\x35\x6b\xe3\x76\xd8\xd4\x3e\xf6\x22\x68\x45\xff\x4a\x4e\xca\x85\xa8\x50\xd1\x81\x09\xd1\xde\xb1\x07\x0d\x4d\x37\xf4\xee\xd9\x73\x7f\x55\x84\xed\x2f\x1a\xd8\x3c\xf9\x28\x9f\x07\xe6\xab\x0c\x94\x76\xbf\xbd\x4f\x8a\xbb\x74\xc7\xe1\x34\xe5\xc1\xda\x32\xdf\x38\xa1\x84\x70\x38\xa2\x37\x38\x69\x2d\x48\x42\xe6\x2a\x2d\xf4\x4b\x33\x00\x3b\x30\x0c\x18\x05\x3e\x61\xfc\x43\x28\xa1\xe9\x38\x5a\x2c\xab\x90\xcc\x16\xf5\x46\x80\xc4\x69\x98\x86\xd4\x9e\x32\x7b\x46\x00\x6c\x92\x80\x02\xb9\x2c\x68\x37\x27\x94\x74\xc5\x51\x40\x23\x7f\xdd\x30\xfa\x08\xdf\xc6\x1d\xf0\xcd\xa5\xad\x98\x99\xad\x2e\x0d\xad\xe2\x16\xc0\xbd\xd2\xc5\xf6\x0e\xfb\x45\xd2\x66\xc8\x51\x37\x04\x43\x57\xf1\xac\xf3\x70\x30\x74\x8f\xd4\x18\x20\x6e\x6e\x6b\x6c\x28\xfe\xec\xdc\x3e\xbb\x9c\x88\xec\xc6\x62\x0d\xc1\xbd\x69\x0a\xa0\x23\xf7\x64\xcb\x92\x91\xa0\x88\x72\x46\x0c\xcb\xb0\x10\xe0\xb4\xab\x6a\x3a\x9c\x65\x0e\x89\x5f\x9c\x62\x54\x35\x88\xe4\xbe\xc5\xaf\x45\x98\xcb\xd9\xb8\x97\x18\x83\x8a\x42\x73\x38\x4d\x55\x52\xe8\x8e\x44\xa0\xa9\x00\x57\x78\x42\x88\x53\xc2\xde\x21\xe7\x22\x88\x79\xf7\x54\x56\x3b\x6a\xa9\x74\x53\xa5\xc9\x97\x45\xfb\x1b\xae\xa8\xb3\xdb\xcd\x85\x9f\x5d\xc8\x65\xf6\xa4\x46\xa2\x69\xf4\xce\x7e\xfc\x5d\x1b\x34\x71\xc1\x56\x47\xb4\x61\xc4\x7a\xa2\x2a\x9f\x1c\x62\x64\x61\xfd\x94\x35\x45\x31\x65\xfb\x0a\xb6\x4b\xdb\x7f\x06\x5e\xc1\x6c\x24\x87\xf6\x36\x48\x60\x09\x4b\xc9\x0d\xc7\x7a\x08\x9f\x20\x8e\x2e\xf3\xa4\x6e\xe8\xf1\x04\x51\xff\x09\x7c\x77\xd4\xfa\xe5\xed\xa2\xf9\x7a\x48\x8f\xea\x53\x10\xaa\xbe\xf2\x9c\x7e\x96\x58\xa9\x89\x4c\x3b\x79\xe3\x42\xbb\xce\x5c\xb4\x10\x26\xb6\x50\xe3\x4b\x2d\x68\x94\xd7\x41\x38\x5d\x10\xa0\x2e\x44\xa5\xf3\x13\x12\x8b\x97\xb1\x08\xaf\xb3\x71\xe8\x25\x1b\x16\x4f\x56\x7c\x6e\xee\x25\x1e\x29\x35\x1e\x26\x0a\xd9\x48\x4e\x73\x39\x05\x33\x8f\xa2\x04\x3a\x77\x40\xca\x43\xfd\xc4\x59\x76\x71\xe1\xe4\xa1\x16\x81\x27\x32\x01\x3b\x71\xa7\x67\x11\x86\xb5\x61\x4f\x43\x4a\xbf\x9d\xb2\x41\xdb\xb2\x3d\xf0\x8f\x88\xbf\x89\x19\x1b\x76\xa7\x8b\x49\xc0\xb6\x3d\x74\xa2\x31\x87\x8e\x28\x2c\x48\xf6\xbe\xa6\x09\x75\x54\x3d\x14\x8d\xf5\x36\x2f\x93\x86\x04\x11\xd3\x7b\x4d\xf3\xb7\xd4\x90\xaa\xa7\x83\x25\x7f\x4c\x45\xbc\x64\xcc\xa3\x12\x4d\x1e\xa9\x75\x26\xcd\xb9\xa0\x8b\xff\x8b\x41\x24\x6b\xf1\x25\xfd\xda\xfb\xdb\x2c\xbd\x19\x78\xb9\x58\x7a\xb3\x21\x02\x19\x98\x2b\xdf\x5b\x01\x35\x69\x21\xde\x85\x2d\x6d\x48\xae\x85\xc3\x42\x27\x54\x12\x0c\x11\xbb\x28\x25\x5b\x92\xa1\x2a\x67\xcf\x1d\x06\xe2\xe2\x0a\x73\xaa\x8a\x09\xaa\xc8\x24\xbb\xc7\x39\x49\x28\x1a\x1c\xea\xa7\xcb\xdb\xac\xe2\x27\x86\x94\xbd\x61\xb0\x69\x7f\xd6\x1c\xa5\x71\x60\x8d\xf9\x5d\x0a\xf5\x2e\xa3\x66\x54\xfa\x46\xa2\x80\x80\x1e\xc8\xa2\x79\x8c\xed\x81\x6c\x7b\x7d\x84\x5a\x36\xfd\x30\x6d\xce\x68\xa5\xcd\x0f\x72\x66\xa3\x4b\x41\xb9\x81\x69\x7a\x96\xc7\xc1\x90\xf1\xc6\xa9\x57\x73\xfe\x8e\x39\x72\x66\xe2\x83\x10\x7f\xc5\xd2\xed\x8c\xfe\xd6\x8d\xc9\x34\xe2\xb3\xcb\x44\x28\x58\x68\xde\x7f\xe6\x54\x98\x94\xe7\xbe\xa7\xc2\x7c\xd9\x54\x98\xfd\xdb\x5d\x55\x36\x49\x93\x7e\x58\x6c\xbc\x5d\x7a\xd7\x1b\x05\x83\x8c\xf7\xca\x85\x7e\x04\xf5\x62\x8c\xc2\xdc\x8c\x33\x0c\x3c\x49\x37\xd9\xda\x9d\x4d\xf2\x22\x2b\x16\xe5\x43\x33\x47\xbf\xda\x8c\x98\xa5\x9f\x2b\xca\xe6\x03\x52\x23\xdd\x5d\x60\xdb\x7a\xca\x53\x8e\xa5\xd6\xce\x7c\xe8\x88\x63\x33\xf1\x0a\x65\x79\xc9\xe2\x4e\x82\x89\x4c\x57\x79\x02\x1d\x37\x5d\xa0\xf5\xb4\x7b\x18\xb5\xd7\x37\xf6\x0f\xa5\x60\xa6\x20\x2e\x51\x5b\xf3\x8f\xb9\xa6\xf0\x90\xd4\xf5\x53\x59\xed\xb4\x15\x8a\x87\xfd\x4d\x5a\x69\x8b\xd3\x7d\x92\xe5\xda\xd2\x87\x4a\x5f\xd6\xa4\xfa\xb2\x5d\xd2\xa4\xfa\x86\xd9\x5e\x5f\xd8\xb6\x6c\x2b\x2c\xf2\x72\x9b\x48\x1d\xb8\x54\xbb\x8c\xdf\x31\x24\x96\xd1\x94\x07\x24\xfa\xaf\x24\x89\x2e\xdc\x8d\x72\x67\x7f\x47\xbc\x16\xf1\x2c\x05\xe3\x51\x8a\xd9\x3c\x91\x59\x9a\x31\x3d\x15\x12\xbe\x2c\x53\xa1\x61\x6b\x38\x15\x16\xb2\xe0\x53\x41\x29\xd4\x31\x1d\xef\x67\x02\xa4\xd2\xdd\xe4\x21\x29\x44\x7a\xca\x98\x00\x45\x6b\x0e\xe7\x56\xee\xe8\x4e\xe1\x39\x72\xa7\x9a\x72\x44\xe3\x63\x93\xb6\x11\x1c\xcf\x77\xe8\x96\xc7\xbc\x06\xdd\x4e\xea\x48\x3e\x70\xa7\x6e\x67\x0b\x38\xd6\x9b\xd9\x02\x96\xe5\x56\xb6\x80\x64\xb7\x91\x2d\x00\xd9\x6c\x63\x2b\x6c\x9f\x05\x8c\xd5\x16\xb6\x19\x8e\xcd\x06\xb6\x1c\x0f\xdc\xbe\xa8\x3a\x45\xcc\xa2\x66\xf5\x92\x1e\x7b\x1e\x9a\x4a\xed\xb2\x15\x26\x92\x6a\x71\x57\x25\xbb\x2c\x2d\x9a\x0f\x4d\xe9\xb0\xb7\x0f\xa0\xe6\x76\x36\xd1\x6c\xae\x37\x2a\xe8\xb5\xe6\x6d\xc5\x0b\x47\x7f\xd5\xf1\x1c\x6a\x94\x38\xcc\x94\xce\xb5\x21\xb9\x7b\xf2\x79\xa0\xf5\x66\x62\xe7\xdc\xe8\x67\x1b\x63\x07\xf1\xac\xe3\x64\x4c\xe4\x6c\xa3\x64\xf0\xce\x3a\x46\xca\x9e\xce\x36\x44\x0a\xee\xac\x23\x6c\xf9\xde\xd9\xc6\xd7\x02\x3b\xeb\xe8\x5a\x76\x7a\xc6\xad\x72\xe6\xd1\x11\x2e\x7d\xb6\xe1\x11\x68\xe7\xc5\x5e\xcb\xfd\xcf\x87\xbe\x16\xda\xd9\xf1\x07\x4e\x95\xb3\x62\x12\xc0\x85\x46\xb4\xd8\xb9\x25\xbe\xd1\x1a\xcf\x2d\xec\x70\x51\x4e\x13\x92\x07\x5b\xf7\x3c\x61\x33\x15\x49\x36\x7d\x91\xc3\xf6\xc4\xb1\x71\x01\x56\x1c\xcd\xa8\xfe\xf7\xe5\x2e\xc9\xe1\xb3\x1e\xbf\xcb\x46\xd1\xe3\xbd\xfc\x4c\x25\x0c\x57\x7a\x36\xd7\x08\xe0\xa6\x97\x51\xfe\x08\x4a\x0d\xaf\x55\x4c\x74\xfa\x7d\xa9\xab\x93\x5e\x32\xd0\xe7\x81\xb5\xe6\xda\x3e\x62\x04\x7c\x56\x23\x47\xa2\x3c\x13\x9f\x86\x0c\x86\xd2\xf1\x0f\x3b\x92\x2b\x4e\xac\x64\x5b\xaf\xd2\x74\x31\xc2\x25\xab\xcb\x60\xdd\xb6\x2b\xca\x5d\xca\xde\x64\x89\x1b\xa0\x29\xba\x34\x66\x5a\x48\x80\x98\x5a\x3e\xd4\x24\x06\x45\x56\x7c\xa9\xb1\x38\xd1\x7d\x7b\xc9\x1a\xd3\xda\x5c\xb3\x87\x60\x61\x15\xb9\x92\x46\x0e\xa6\x3f\x64\x2e\xcb\x43\x44\x74\xed\x44\x93\x43\xa9\xb0\x7b\x2d\x53\xa3\x28\x6b\xc2\x27\xf7\x00\x60\xfb\xa3\xde\xca\x01\x0b\xc1\x2c\x19\x79\x43\xbb\x1a\x7d\x9c\x10\xb9\x14\xa4\xd9\x53\x48\x4b\x1b\x20\x64\x62\x18\x12\x63\x0f\xa2\x29\x48\x0c\xd2\x5d\x49\x58\x12\x9e\xdc\x25\x06\x62\x68\x06\x02\xb9\xe1\xc5\x72\x50\x37\x25\xb9\xb7\xa8\xb5\x25\x61\x40\xd0\xe7\x20\xb9\x7f\x62\x67\x01\x22\xa2\xc6\x81\x18\x62\x55\x4e\x4c\xc0\x6b\x74\xc9\xbc\xa5\xb4\x12\x98\xbf\xb0\xce\xb7\x02\x25\x7c\xd5\xaf\x42\x72\x2d\x56\xc2\x86\xa9\x13\x62\xfe\x41\x86\x77\x86\x21\x96\x23\xba\x61\xc9\xb5\xcd\x4b\x61\x83\xf7\xfa\x90\x15\x05\xe9\x8c\x6f\x4a\x23\x7e\x3b\x33\xb0\xa5\xaf\x4e\x99\xc1\x32\xd0\x46\x1f\x0f\x46\x8e\x3c\xca\x4e\x35\x11\x85\xdc\x98\x03\x1a\xea\xf9\xae\xcf\xac\x70\xf2\x9c\x59\xbf\x5d\x52\x98\x98\x65\xa3\x00\x8f\x18\x0e\x9b\x32\xa0\x91\x2b\x3d\x70\x39\xec\x68\x0e\x04\x44\xed\x82\xdb\x0c\x90\x1a\x66\x1b\x86\x31\x66\x60\x08\x66\x88\x6e\xc7\xcd\x7c\x80\x09\x15\xc8\xe4\x08\x27\x78\xd9\xfe\x31\x47\xbe\x3f\x66\x75\xd6\x70\xd7\x3a\xb1\x08\xba\xa4\x89\x25\x90\x7e\x05\xcf\x3d\xa4\x1a\xd6\x7e\x5c\x78\x3c\xf4\xe8\x04\xde\x97\x7a\x27\x4a\xac\x57\x29\x02\x80\x50\x65\xac\x97\xa5\xf6\x50\xb6\x7b\x4d\x9c\xbc\xcb\xe5\x23\xf3\x13\xf5\xae\x62\xf9\x11\xbb\xb0\x0c\x36\x7b\x96\xda\x9e\x06\xd0\xc3\x9b\x09\x50\xd2\x5e\x1e\xd5\x35\x66\xda\x65\x71\xcc\xb8\xaa\x05\x2e\x75\xa9\xb6\x49\xe5\x65\x05\x8d\xc6\xd2\x61\x49\x65\x68\x10\x8b\x43\x9e\x6c\xd3\xfb\x32\xdf\xf1\x20\x17\x1a\x40\x30\xe5\xd1\x88\xbe\xa0\x04\xba\x4b\x9a\xe4\xae\xca\x76\x42\x20\xb8\x64\x7b\x93\x6c\xc3\x2b\xa9\xc6\x2e\xbd\x4d\x1e\xf2\x66\x4a\x0e\x15\x0a\xa0\x3d\x04\x86\xef\x71\x4a\xb3\xaa\x7c\xb2\x77\xdb\x51\x5b\xc1\x99\xd9\xa5\xd5\x60\x10\xd8\x85\x98\x66\xde\xb4\x11\x4b\xbb\x96\x87\xe4\x2e\x2b\xc8\xce\x37\xe4\x6e\x19\x01\x40\xf4\xa3\x1c\x85\x3c\x00\x89\xc5\xe1\xd2\x04\x93\x30\xad\xb2\x35\x54\x3c\xd5\x8c\xa0\x5f\xc0\x08\xa3\x4b\x30\x60\xed\x39\xa6\x36\x3d\xc7\xb4\xd8\x10\x39\x4c\x9b\x0b\x95\x8e\xf4\xba\x98\x9c\xa3\x48\x8e\xc7\x71\x00\xac\x9d\xc4\xc3\x08\xa2\x68\xee\xf4\x7f\x78\x6e\xac\x43\x44\xad\x64\x69\xb8\xd4\x46\xd4\x90\x41\xd0\xd8\x2a\x2c\xf3\x01\xf3\x72\xb2\xd9\x3d\x11\x32\x13\x3d\x2c\x8b\x24\x48\x18\x21\xef\xd2\x26\xc9\x72\x20\x4e\x2e\xca\x43\x5a\xe8\x49\x66\x3c\x28\x0b\xf6\x84\xd0\x5f\xcf\xaa\xa7\xec\x73\xd0\x1a\x86\x27\x5d\xf7\xfe\xbd\x83\x3c\x81\x07\x14\xf0\xdc\x28\x26\xa9\x55\x48\x75\x90\x8f\x3d\x4f\x0e\x75\x7a\x59\xa7\x87\xa4\x4a\x9a\xd4\xe0\xcf\x65\x13\xcd\x86\x64\xa7\x30\xfb\x0c\x0d\xbb\x85\x41\x20\xa7\x79\x84\x09\x90\x0c\x41\x99\x2d\xed\x6a\x19\xb8\x3b\xc1\x48\xd6\x28\x28\x93\x06\x42\x6c\x23\x2e\x24\x77\x32\x39\xb0\x23\xef\x22\x4c\x75\xc1\x88\x44\x41\xbe\x5f\x3f\xc7\x95\xb6\xd2\x1c\x2d\x4a\xf3\xfc\xa8\xb8\x65\x40\x79\x9c\xa5\xc1\xe9\xb5\x05\xc8\xba\xb7\x9f\xb1\xb5\xef\xbf\x8f\x5a\x7f\xe0\x22\x24\x5a\xa1\x63\x2e\x42\x04\x5e\xcb\x30\x69\x1d\x59\x90\xee\xae\x71\x51\xd4\xb9\xf3\x38\x2c\x1a\x9a\x1a\x82\x58\xb5\xcd\x32\x20\xd4\x6d\x45\x22\x2d\x56\x49\xe9\x51\xb9\xc5\x98\xa1\x41\x19\xd3\x0c\x59\xaf\xf5\x60\x01\x7b\xb4\x1d\x99\x5c\x7a\x9a\x96\xcf\x9a\xdc\x76\xd4\x30\x72\xb1\xe7\xc9\x3e\x3a\xae\x17\x4e\xf4\x99\xa2\xfd\x77\xdb\xa7\x73\x99\x94\xd6\x85\x6a\x95\xac\x5d\x0c\x47\xb8\x34\x5a\x50\xa7\x14\x46\x72\x3b\xf4\xce\x60\xc3\xab\x88\x8b\x88\xc3\xf3\x1e\x28\x0b\x77\x53\xee\xbe\x82\x9f\x55\xf9\x04\x97\x5f\xde\xce\xf6\x30\x3f\x8a\x3f\x8f\xaf\xb5\xcb\x01\x12\xb5\x5b\x5c\x83\x41\x74\x6e\xdc\xbf\x5a\xa2\x7c\x61\xcf\x58\x6b\x4b\xed\x94\xa5\x64\x88\xdb\xb2\x2a\xd2\xaa\x5d\x04\x70\x92\xd0\xa0\xaa\x23\x46\x09\xfc\x80\x0c\x83\x94\x82\x32\x4b\xa3\xd4\x04\x64\x9e\x32\xcc\x96\x32\x04\x9f\x1a\x81\x0e\xd1\x82\x16\xb4\x0d\xb2\x51\xf5\xb1\xb5\xf6\xf8\x3b\xce\x65\x78\x49\xf0\x50\xd9\xd6\x91\xb2\xad\x27\xb3\xd8\x96\xfb\x43\xb2\x6d\x0c\xc7\x3b\x56\xa5\xe5\x0b\x82\x76\x24\x84\xca\x11\x1e\x95\x97\x69\x77\x7b\x0a\x2d\xeb\x46\xe7\x3e\x4e\x7b\x75\x58\xa0\x7e\xc5\x2f\x58\x15\x24\x91\xc5\x34\x62\xcf\xbb\x5a\xec\xeb\x2e\xd8\x3f\x63\x48\xed\xa7\xe4\xa1\x29\xef\x33\x32\x70\x1a\x64\xef\x26\xa9\xfa\x4c\x01\xe4\xa9\x44\x7c\x38\x81\x61\xff\x62\x71\x86\xbd\x32\x98\x72\x30\xda\x5a\x96\x87\x0c\x42\x04\x80\x05\xdc\x0d\xa8\x8e\xbf\x0f\x0a\x45\xdd\x43\x41\xf8\x5e\x34\x8d\x9a\x06\x8e\xa3\x2f\x5a\xdc\x3c\x34\x4d\x59\x1c\x75\x19\x95\x49\x92\x7b\xf5\x63\xad\x7e\x2b\x95\x4f\xaa\x4a\x58\x97\xf7\x44\x09\xd7\x35\x90\xcc\xa4\xd3\xe1\x45\x50\x85\x47\xb0\x49\xe7\x73\x12\x2e\x64\xbf\xb0\x49\xb0\xc8\x73\x83\xf9\xfd\x1e\xd1\x4a\x01\x73\x3d\x21\xd4\xe4\x00\xa1\x0c\x0d\xc4\xa9\x1f\xef\xa0\x35\x6c\xe7\x7f\xa2\x5a\xc4\x1a\xfa\xe0\x6f\x16\x72\xfe\x4b\x43\x23\x45\x74\xb4\xdb\x08\xf4\x60\x9b\x8b\x6c\x77\x2e\xf0\xda\xb9\x89\x7d\x91\x74\x86\xbd\x5e\x31\x7b\x4e\xbb\x01\x48\xcf\xae\x10\xe4\x8f\x2d\xbd\x00\xa1\x4e\x72\x51\x6d\x17\x4a\x94\xe2\x48\xdd\x13\x62\x3f\x2a\x1a\x4e\x31\xad\x9b\xdc\x89\x78\x4a\x2e\xea\x26\xdb\x7e\xf9\xfa\xc2\x3d\xf7\x3f\xba\xe4\x3a\x86\x47\x07\x54\x71\xd6\xa7\x40\x98\xe0\x62\x85\x9b\x1d\x88\x29\xcd\x4c\xa3\xc5\x71\xf6\x86\xa7\x00\x06\xcc\x14\x5f\xfc\x44\x3d\x22\xa9\x49\xac\x62\x1f\xeb\x94\xb3\x9d\x5a\x44\x88\xb4\x71\xa5\xbc\x90\x9c\xa8\x68\xb2\x89\x4e\x33\xac\x69\x32\xea\x89\x85\x8b\xdc\x8b\x04\x38\x1e\x54\xce\x1a\xe3\x1d\x9f\x31\x80\xb3\x1c\x1e\x4a\x93\xef\xdb\x82\x9e\xd4\xb8\x32\x3f\x69\xa2\x71\x47\xde\x8c\x85\x47\x27\x5a\x2e\x25\xd2\x0c\x38\xc9\x16\x02\xc5\x74\x67\x9b\x1a\xfd\x45\x4e\x88\x62\xae\x45\x05\x52\x46\x6d\xb0\x07\x5a\x80\x50\x26\x2d\x50\xe9\x0a\x7e\x1f\x4d\x5d\xf6\xa8\xe5\x86\x87\xe7\xc4\x6c\x10\xc9\xa8\x0d\xf0\xc8\x3a\x32\x6e\x07\xaa\x09\xc8\x15\x3a\xb1\xc3\x2e\xe1\x3c\xe3\xb0\xab\x44\x2f\xb0\xc3\xab\xe3\xb2\x0f\x59\x93\xee\xad\xa2\xa1\x0e\x85\xbf\x59\xe9\x43\xdb\x4c\x0a\x33\x2d\x25\x53\x8f\x60\x1a\xc3\x9e\xcf\x7a\x20\x38\xad\x18\xa5\x86\xc4\xb9\xc1\xd4\xc8\x23\x10\xd3\x27\x9e\x1d\xdf\xf4\x84\x30\xbe\xc3\x6f\x6f\x83\x76\x15\x13\x46\x8c\x99\x55\x98\x0c\x3e\x4c\xa2\x8f\x31\xbf\x9f\xf2\xe6\x07\xd3\xb9\x4e\x45\xb4\x90\xad\x77\xfc\xdc\xfb\xe0\xd5\x53\x86\x70\xfe\xe0\xd6\xa7\xcc\xe1\x14\xaa\x1d\x08\x8e\x7d\xd2\xb0\xb8\xa5\xd2\x49\x40\x98\xd3\xc0\x49\x73\x3b\x61\x20\x97\xe2\x40\x06\x83\x7c\x4f\xe8\x02\x98\x71\x4e\x6a\xcd\xad\x3c\x87\x02\x79\x74\x39\xff\xc3\xdd\x07\x6f\xce\x92\xf2\xcd\xbd\x77\x29\xfa\x5d\x8a\xfe\xb1\xa4\x68\x2e\xe2\x75\x32\xdf\xbb\x14\x7d\x26\x29\xda\x8c\xd9\x77\x29\xfa\x5d\x8a\x7e\x97\xa2\xdf\xa5\xe8\x77\x29\xfa\x5d\x8a\x7e\x97\xa2\x7f\x54\x29\xfa\x75\xf3\xf5\xfd\x13\x48\xd1\x74\x4e\xa2\x10\xad\x79\xb9\xf8\x67\x90\xa1\x81\x73\xa0\xf3\xf2\x12\xee\xd9\x24\xf7\x37\x24\x2a\xf3\x80\xd3\x40\x0a\x86\x32\xeb\x19\x24\xe9\x77\xf9\xf5\x6d\xc9\xaf\x98\x74\x89\xbc\x80\x9e\x59\xa8\x7d\xd3\xf2\xab\xda\x4e\x30\x19\x7f\x17\x65\xdf\x45\xd9\x77\x51\xf6\x8d\x8b\xb2\xed\xd6\x65\x8e\x43\xdc\x99\xd5\x94\xc5\x62\x10\x0a\xb0\x58\xb4\xa8\x6d\x32\x06\xed\x8f\x17\x2d\x20\x16\x6d\x07\x78\xb1\x2f\x45\x9b\x2f\xa9\x7a\x76\x57\x1c\xca\xba\xe9\xd2\x7f\xbb\xfc\x0b\x4f\xb2\xb5\xa0\xc1\x4c\x1c\x10\xe5\x20\x08\xe3\x69\x30\xfb\xbf\x75\x49\x18\x25\x67\x72\x35\xaf\x88\x11\x65\xcc\x5c\x87\x27\x72\x8d\x3c\x09\x31\x7a\x1b\xa8\x49\xee\x41\xaa\x85\x2d\xc9\x0e\x25\x9b\xd6\xd2\x4e\x79\x7a\xf2\x7e\x70\x01\x3a\x38\xbd\x09\xb3\x2a\xb3\x09\xb7\x1a\x86\xa6\x6d\x92\x6f\x3f\x90\x68\x4d\x0b\xc7\xa5\x92\xb7\x2a\xda\xf1\xe4\xf5\xbd\x14\x86\x1c\xd4\x44\xba\x1d\xc4\x89\x85\xca\x96\x99\xfb\xb6\xf5\x4d\xa1\x51\x34\x36\xca\x5a\x58\x6e\x56\x2f\xaa\x94\x78\xd2\xed\x8e\x52\xb6\xf8\xaa\x7c\xb2\x6a\x07\xe9\x94\x54\x20\x79\x5a\xd2\x3c\xaf\x8f\x52\x3a\x3a\x0d\x30\x93\x1b\x80\x52\xb6\x60\xbe\x78\x65\x25\xc5\x27\x12\x80\xb7\x1d\xdb\xe1\xa9\xdd\x01\x28\x92\xda\x2a\x38\xf3\x39\x1b\x24\x23\x63\xfa\xa6\x45\xeb\x1c\x2b\xa1\x10\x91\xfc\xff\x3d\x06\x06\x86\xca\x8e\x82\x9b\x44\xb0\x93\x55\x58\x46\x5f\xed\x3f\xc1\x38\xc4\xa0\x20\x70\x03\x51\x00\x17\x57\x28\x30\x96\x5a\x51\xde\xe7\x94\x33\xf7\xdb\xdc\xbf\x42\x19\xbe\xc6\x8b\x04\x49\x70\x62\x6a\x44\xec\x67\xcf\xe8\xb0\x25\xd9\xae\xbe\x84\xab\xd6\x88\xec\x73\x67\xf1\xd5\x1a\x40\x9f\xad\x95\xec\x64\x9c\x0e\xf4\xaf\x35\x08\x7e\xd9\x0e\x5f\x7b\xda\xf2\x99\xa0\xe5\xdd\x74\x69\xb9\xe4\x65\xe0\x10\x20\x74\x8f\x74\x09\x26\x20\x10\xce\xd7\x77\x49\xf7\x9e\x04\x90\x86\xea\xea\xa2\x55\xb5\x2d\x48\x06\x47\x19\xb2\xe4\xa7\x84\xcb\x77\x72\x4d\xb6\xdb\xe5\x4b\x7c\x2f\xa8\x2d\xa9\x2f\xb8\x61\xc2\x48\x42\x02\x44\x1e\xc4\x3b\x96\xae\x8f\xba\x64\x65\x4c\xe9\x42\x1d\xa2\x94\xa0\x52\xbe\xc8\x0f\xf1\x9e\x88\x64\xbe\xbb\x63\xc9\xaf\xe7\xb6\xd5\xeb\x86\x8c\x62\x64\xab\xe2\x61\x9f\x56\xd9\x96\x35\x13\x97\x9c\xa2\x66\xb3\x11\x94\xc4\x56\xab\x04\x3e\xb0\x14\xde\x34\xf6\x05\xd1\x5d\x72\x0f\x24\x9a\xfe\x01\x8b\xdd\x34\x06\xbe\x38\x01\xda\x0f\xeb\x20\x74\x37\x56\xf8\x56\x06\x4b\xe3\x98\xfc\x60\xbe\x46\x34\x8d\x1f\x91\x53\x35\xc9\x7a\x86\x32\xde\xc1\x47\x80\xf1\x19\x82\x14\x8f\xa6\x91\xd8\xd6\x7a\x33\x8d\x83\x83\xdd\x8a\xc7\x42\xe0\x37\x63\xb3\x5b\x94\xf8\xd4\x2a\x85\x35\x9d\xd8\x37\x3b\x6a\x4e\x9e\x03\x87\x23\xcd\x84\xc5\xb8\xc5\x67\x82\x45\xb5\x9d\x3c\x11\xe5\x73\x79\x48\x8b\xd3\xe7\xa5\x01\xfb\x66\xa6\x99\xee\xce\x3f\xc7\x16\xe6\xf7\x9f\xe0\x91\x48\xf0\x5e\xf7\x9a\x21\xbc\x5c\xb0\xac\x98\xe7\x7e\x91\xdc\xbc\x5b\xf1\xbd\x69\x2b\xbe\xf1\x54\xa4\xd2\xf8\x36\x2f\xeb\x5e\x3a\x05\xd2\x1c\x21\xb3\xb3\xf7\xe0\xb8\xe4\xe7\x91\x9e\x8e\xd2\xe5\x70\x72\x17\xc9\xe1\x90\x7f\x55\x73\x97\xbe\xef\xb1\xf7\x3d\xf6\xbe\xc7\xde\xf7\xd8\xe6\x05\xec\x68\xce\xb9\xa1\x90\xcd\xff\xbe\xc7\xde\xf7\x98\xed\x1e\x83\x60\x9e\xd3\x1d\x25\x67\xad\xf6\x7f\x70\x70\x4c\xd3\x4f\x94\xf8\x7a\xe5\xcd\x04\x88\x24\x4f\xef\x9b\xbf\xc5\xeb\xad\x6b\x0c\x11\xf3\x64\x2d\x18\xa6\x87\x13\x42\xe6\xd3\x4f\x75\x9a\xdf\xf2\x2f\xc2\x23\xec\xe8\xbb\xbb\x80\xe2\xe9\x57\x77\x08\x06\x7d\xe6\xa4\x97\x19\xf7\xa6\x29\x4c\x2f\x9d\x5d\x18\xeb\xa9\x3d\x6f\x91\x30\xc8\xec\x6b\x59\x34\x55\x99\x2f\x84\x10\xc1\xd4\x7a\x6b\xb9\xb6\x52\x2f\xc9\xb8\x85\x3d\x33\x5d\xb6\x6c\x08\xf4\x50\xec\xd2\xaa\x9d\xe0\xd5\x58\xd4\x9a\x3a\x73\xdc\xba\xac\x9a\xd3\x2e\x92\x8a\x2e\x50\xaf\x55\xd2\x84\xaa\x1f\xbd\x44\xfd\x13\xa0\x12\x7b\x89\x3e\x11\x53\x45\xa2\xc0\x7f\xc4\x87\xde\x51\xe7\x2d\xdd\xc7\xbe\xe7\x69\xa7\x8a\x29\xcb\xc7\xcc\xc3\xca\x96\x50\x79\x5b\xfb\xc8\x82\xd0\x2c\x1c\x3e\x52\x61\x8e\x2d\x49\x92\xca\x0b\x37\xfa\x33\xad\xf9\xb1\xab\xc9\x5e\xd2\x5f\xea\xc5\x7a\x34\x06\xd4\xa2\xfb\xa4\xd8\xbd\x7d\x66\xad\x2e\x13\x57\x65\x93\x35\xa0\x12\x26\xb3\x8b\x05\x26\xb2\x6c\x13\x6f\xcb\x7c\x51\xa5\x75\xf6\x0f\xab\xd5\x05\xef\xa1\x93\xd9\xf3\x30\xc2\x4f\x66\xdd\x86\x2e\xe8\x5c\x17\x4d\x95\x6c\xbf\xc0\x67\x5f\xc1\x5e\x76\x21\x3e\x03\x10\xac\x63\x56\x1a\x1e\xe6\xec\xb5\x2b\x9b\x26\xc5\x2d\x8d\x57\x9b\x6d\x9c\xc6\x66\x63\x63\x81\xcd\x85\x84\xcd\xd1\x66\x17\xa8\xcf\x99\xa7\xfa\x9c\x8d\xe2\x2c\x88\x49\xd5\xff\xf9\xe0\x5d\xa8\xe4\xf1\x92\xcb\xe0\x96\xc5\x22\xa9\xaa\xf2\x69\xf1\x25\xfd\xca\xca\x06\x42\x6e\x89\xf1\xb6\x26\x8c\x28\x7d\xde\xa6\xe9\x2e\xdd\x2d\xf6\xc9\xf3\x51\xb4\x76\xa6\x57\x07\xba\x8e\xf4\x32\x10\xf8\x9b\x79\x18\xce\xbd\xb9\x3b\x4e\x6d\x79\x1e\x4b\xac\x13\xba\x39\xd1\x38\x6b\x48\xd6\xa6\x86\x69\x83\x5a\xe5\xfe\xb7\x1c\xe3\x6c\x44\xd3\x96\x3c\xe8\xb6\xa8\x8f\x20\x02\x33\xbd\xd8\xf6\x2f\xae\xfe\xe0\x03\x1b\x09\xba\x2c\xc8\xa6\x83\xef\xb7\x36\x2f\xb2\x69\x9e\x9f\x78\x09\x41\x20\xb0\x07\x66\x90\xaf\x68\x23\x45\xa0\x9e\x34\x7f\x1c\xab\x5a\x83\x59\x33\x88\x73\x45\x5e\xc4\x7a\xf9\x2e\x2f\xdc\x69\x0e\xed\xa0\x84\xbc\x11\x6f\xfc\xf0\x1f\x3e\x84\x4d\x73\xb3\x3f\x67\x0d\x50\xac\xde\x96\x8c\xed\xed\x5e\x36\xbb\xd6\x58\xc0\xc7\x89\x63\x67\xc6\xd4\xa7\x4e\xa1\x03\x23\xcd\x04\xf5\x4e\x41\x21\xf4\xb7\xe8\xc1\x99\x10\x11\x98\x34\xea\x14\x3d\xc2\x05\x30\x8e\x95\x5c\x3c\xcb\x01\xae\x2e\x26\x41\xe0\x21\x59\x0d\xb6\x8b\xff\xf1\x50\x37\xd9\xed\xd7\xce\xaa\x46\x4c\x81\x67\x08\x01\xa9\x2a\x0c\xc7\xc6\x6c\x9c\x12\x50\xd2\x24\x00\xd9\xa1\xe5\x68\xa5\x8d\xc5\xed\x8b\x51\x8f\x1e\x43\x5f\x80\xb1\xee\x0f\xcd\x57\x21\xa0\x78\xaf\xce\x8d\x51\xb3\x22\x2c\x38\x30\xa2\x78\x91\xd7\xaf\xb7\x8a\x82\xfe\x51\xeb\x2e\xd8\x3c\xf9\x8d\xe9\x50\xb1\xfc\x17\x2d\x6e\xd7\x44\xb6\x64\xab\xad\x49\x86\xa7\x21\x3f\x21\x23\x9e\x1d\xc6\x34\xa4\x9c\xed\x93\xbb\x94\x8b\x3b\x61\x7f\xe7\x86\x3e\xa6\xdc\x39\x2d\x9e\x68\x60\x02\xbf\x77\x77\x09\xbe\x1d\xfa\x22\x32\x94\xcb\x87\x2a\xff\xf0\x53\x3b\xd4\x4b\xf2\xfb\x5f\xeb\xc7\xbb\x8f\xcf\xfb\xfc\x6a\x7b\x9f\x54\x75\xda\xfc\xfc\xd0\xdc\xae\xe7\xb3\xf0\xba\x7e\xbc\x9b\x05\xde\x63\x96\x3e\xfd\xb5\x7c\x9e\x85\xbf\xce\x82\xc0\x9b\x05\x5e\xfb\x6f\xdc\xfe\xb1\x0a\x66\x41\xd0\xd6\x48\xab\x3a\x2b\x0b\x5a\xc3\x77\x7d\xfa\xf5\x79\x9f\x17\x35\xfd\x76\xdf\x34\x87\x59\xf8\xcb\x2c\xf8\x3c\x0b\x3e\x3f\x3d\x3d\xb9\x4f\xa1\x5b\x56\x77\xb3\xe0\x73\xe0\xb5\xe0\x3e\x93\x9e\x40\xa3\x5f\x9e\xf3\xac\xf8\x32\xd4\xd8\xdf\x6c\x36\xb3\xe0\x33\xad\x1b\x04\xb3\xf0\x6f\x33\xef\x97\x19\x19\x23\xfb\x7f\x78\xbd\x4b\x6f\x6b\xa4\x40\xac\x94\xe6\x79\x76\xa8\xd3\x59\xe0\x65\x3b\xda\xe9\x21\x69\xee\x17\x6c\x22\x5b\x36\xf7\xd0\x63\xbf\xbf\xd2\xdf\xb1\xef\xae\x08\xb3\x5c\xd1\xef\x15\xab\xe7\x47\xee\x32\xf2\x83\x8d\xb7\x64\xdf\x59\xfd\xa5\xbb\x0a\xe9\xff\xd8\x60\xc3\xeb\x59\xf0\x99\xf7\x3d\x34\xc6\x7d\x52\x7f\x01\x03\x6c\x7f\x2e\x18\xfe\xdb\xbf\x5f\xd3\x2d\xf4\xbf\x8b\xac\x61\x48\x7f\xa8\xd3\xea\x7f\x1d\x92\x6d\xfa\xdf\x8b\xff\xdd\xce\x8d\xd7\x04\x55\xca\x9b\xff\x48\xb7\xcd\x5f\x5b\xd2\xc8\x8a\xbb\x76\x91\xe9\x22\x74\x6b\xdd\xfe\xfa\x2a\xfc\x22\xa4\xcb\xf1\xe1\x6e\xbc\x20\x5a\x7b\x6b\x5a\x44\x29\x9c\x96\x6d\xdc\x65\x0c\x71\x73\x9b\xe5\x39\x2d\x21\xdc\x08\x5f\x2d\xfd\xe4\x1f\xc8\xe2\x30\xa2\xf8\xe5\xbe\x4a\x6f\x29\xb0\x59\x10\xf6\x2b\xc5\x31\xfa\x60\x81\xcd\x59\xf0\x99\x20\x14\x23\x99\x59\xf0\x59\x43\x35\xe1\xf5\x1d\x58\x82\xff\x91\xdc\xa5\x9c\x46\xea\xa6\x2a\xbf\xa4\xf4\x7b\x2b\x1f\xc1\xaf\x0b\x80\x33\x5f\x46\x47\x5f\xb9\xfd\xb6\xa8\x1e\x72\x06\x25\x7d\x4c\x8b\x72\xb7\x1b\xc6\x94\x38\xa8\x5f\xaa\xe6\xa6\x4c\x2a\x8b\x76\x18\x86\x39\x94\xff\xfe\x48\x02\x64\xa8\x73\x9b\x05\xe1\xb5\xff\xeb\xe7\xbf\x7d\xee\xe9\x89\x51\x5b\x95\x7f\x98\x05\x21\x25\xcb\x0b\xdd\xf4\x03\x77\x2d\x14\xb5\xf2\xf1\x36\x39\xd0\xc2\xfa\xff\x7d\x48\x2a\x11\x73\xbb\xa4\xbe\x4f\xaa\x2a\x61\x34\x18\xce\x82\xeb\x78\x16\x5c\xb7\xff\x8d\x18\xad\x9e\x8b\x26\x44\x74\xb4\x10\x66\x81\xc7\xd0\xf1\xf7\x70\xed\x2e\x63\x3f\x8c\x97\xab\x59\x70\xed\xaf\x5d\x3f\x5e\x06\xcb\x28\x9e\x05\xde\x6f\xed\x2e\x58\x6f\x3c\x3f\x6c\x8b\xc2\xa5\xbb\xf1\x97\xfe\x7a\x49\x8b\xfc\x59\x70\xdd\x36\xf1\x7e\x0b\x03\x37\xda\xac\x56\xab\x75\x3b\xf4\x65\xec\x46\x7e\xbc\x0a\xc2\x58\x29\x12\x01\x44\xbe\xeb\xc5\xab\x30\xf0\xd7\x6d\xb7\x91\xbb\x8a\x62\x6f\x19\x44\xb3\xc0\xbb\xd6\x17\x2d\xd7\x6e\x1c\x6c\x22\x3f\x6e\x31\xe5\xc7\x6e\x1c\x2d\x83\x4d\xbc\x69\x4b\x96\xee\x26\x0e\xd6\x1b\x8f\x94\xac\xdc\x30\xdc\x04\x61\xb8\x6c\xc1\x2d\x7d\x37\xd8\xc4\x41\xbc\x8c\xe9\x04\xbd\x60\xe9\xc7\x2d\x77\xf5\xf4\x53\xd7\x97\xfc\x1b\x5d\x9b\x7e\xa3\xb4\xcb\xb1\x89\x64\xda\x17\x88\x89\xaf\x14\xc1\xfc\x09\x4b\xb5\x74\x57\xcb\x38\xdc\x04\x01\x99\x49\xe0\x46\x71\xec\xaf\xa3\x16\x31\xbf\x2d\xdd\x38\xf0\xe2\x68\xc5\x8b\xfc\xd8\x8b\xc2\xe5\x9a\x60\xda\x0d\x23\x3f\x5a\xfa\xcb\xb6\xc4\x77\xfd\x38\x88\xbc\xe5\x92\x96\xac\x56\x71\x10\x84\xeb\x88\x15\x45\x9b\x4d\xd8\x22\xe6\xb7\xd8\x0d\xbc\x4d\x18\x87\xde\x86\xf5\x14\xad\xc2\xe5\xda\xa7\x3d\xe9\x06\xf1\x6f\xb3\xc0\xfb\xbb\xa1\x65\xec\x86\x41\xb4\x0c\xe2\x30\xa0\x45\x9b\xd0\x5f\x6d\x22\x32\x92\x60\xed\x2e\x37\x71\x48\xe0\xb4\x84\xb2\x5e\x6d\xe2\x95\xbf\x56\x8a\x96\x2b\x77\xed\x6d\xe2\x78\xe3\x33\xf2\x8a\x29\xcd\x2d\xd7\x61\x1c\xf9\x21\xf8\xd8\x02\xd9\x6c\x82\x30\x26\xe8\x89\x42\x77\xb3\x0a\x97\x9b\x25\xed\x79\xe5\x85\xd1\x9a\x56\x97\x4a\x82\x78\xbd\x0e\x3c\xdf\x8c\x03\x32\xd1\x28\x72\xc3\xae\xa1\xe7\xae\x63\x2f\x0c\x57\x94\xb4\x61\x49\xd8\x82\xf4\xe2\x98\x4c\xb3\x25\xc8\xeb\x30\x72\x97\x71\xb8\x0a\xfc\xb8\xfb\xb4\x5c\xb9\x91\x17\x44\x4b\xda\x71\xb0\x72\xbd\x7e\xc6\x1b\x7e\xb4\x2a\x45\x1d\xa0\x0d\x5d\x4c\x6f\xe3\xaf\x36\xf1\x7a\x4d\xbb\x8d\xd7\x5e\xb4\x0c\xe8\x8a\x85\x7e\x18\x44\x61\x0b\x9d\x52\xc0\x7a\xb5\xa2\x03\xd2\x4e\x02\x25\xf3\xe5\x06\x21\xf3\xd5\xe7\xbf\xfe\xfa\xeb\xaf\x27\x91\xb9\x2a\xa3\x10\x26\x8d\xf5\xf6\x99\xfc\xcf\x2c\xbc\xf8\xbe\xbb\x5a\x47\x71\xb4\x14\x65\x97\x96\x60\xa1\xcc\x12\xb3\x5a\x9e\x3f\x5e\x66\x31\x73\x54\x8f\xf2\x20\x7f\xe5\x87\xad\x00\xe1\x5d\x87\xb1\xbb\x5e\xad\x02\x7f\xb5\x92\x4a\x96\xa1\x1b\xfa\x7e\x10\xac\x03\xca\xd0\x96\xb1\xef\xad\x08\x15\x2c\xd7\xae\x17\xfa\x41\xb8\xf2\x29\x13\x0c\x82\x4d\xe0\xb7\xdc\xcd\xbb\x8e\x3c\x37\x58\xad\x56\xb1\x4f\x8a\x96\x6e\xbc\x0c\xd6\x9b\x16\xb4\x17\x05\xae\x17\x79\xab\xd8\xdf\x50\x1a\xd8\x44\xed\x3e\x22\x25\xa1\x1b\x04\x7e\x1c\x10\xbe\xdd\x12\x65\x18\x2d\x37\xab\x90\x80\x5b\xba\xfe\x26\x6c\x51\x41\xe9\x3c\x0e\xa3\x68\xbd\x6e\x7b\x8a\x96\x2e\x67\x27\xfe\x2a\x5a\x93\x4d\xc7\xbf\xf5\x38\x26\x10\xd8\xb7\x65\x14\xae\xfc\xf5\x86\xd6\x03\x50\x3d\x77\x13\x46\x2b\xbf\xa5\x33\x69\x28\x9e\x1b\xb6\x7b\xd1\x5b\x11\x40\x70\xfc\x1b\x37\xf6\xc3\x70\xe9\xb5\xec\xc2\x13\xe6\xbc\x76\x37\xc1\x7a\xe9\x7b\x84\xbf\x0b\x88\x5a\xbb\xe1\x32\xf0\x36\x2b\x72\xc6\x5c\x0b\xd8\x5d\xb9\xbe\xef\x05\xe1\xaa\xe5\xd5\x9e\xb0\x20\xb1\xdb\xc2\x21\xab\x46\xff\x7a\x1d\x84\xae\x1f\x04\xab\x35\x3d\x95\xc9\xb7\xf6\xb4\x59\xaf\x57\x84\x29\x89\xb0\x7c\xdf\xdd\xc4\xeb\x55\x1c\x6c\x94\x01\x6c\xdc\x55\xd0\xf2\xd7\x16\x9b\xe2\xa8\x57\xee\x66\xb9\x09\xc2\x35\xe1\xca\xc2\x4c\x63\xb7\x3d\x2f\x57\xf1\x7a\xa3\xa2\xc7\x5d\x7b\xb1\xbf\x0c\x55\x94\xba\x4b\x05\xff\xfc\x13\x58\x26\x77\xa9\xac\x26\x84\x08\x97\x5e\x1c\x85\x40\x2f\xc2\xd0\x05\x22\x13\xa6\x2b\x10\xa6\x80\x23\x91\x9a\x05\xc4\x0a\x5b\x40\x58\x05\xb8\x6b\x94\x0d\x46\x18\x32\xfd\xba\x76\xa3\x6e\xdb\xf9\x91\x1b\x2f\xbd\x68\x43\x69\x10\x94\x2c\xe9\x28\xa2\x30\x0c\xe2\xf6\xa6\xe7\x29\xb8\x5a\x92\x05\xf3\xc2\xb5\xb7\xf4\x56\x6d\x13\x01\x56\xc4\x07\x41\xe4\x95\xe5\xd2\x0d\xa3\xcd\xd2\x0b\x79\x51\x14\xcb\xad\x23\x75\xcf\xc4\xca\x18\x20\x18\x38\x5a\x65\x62\x12\x73\xa6\xcc\x72\x71\x5d\x1e\xbe\xbe\x0c\x7f\x96\xf8\x9b\xbf\x76\x83\xd8\x5b\xc7\xcb\x90\x6e\x85\x65\x14\x07\x9b\x35\x3d\xac\x03\x77\x15\xac\xc2\x88\xc9\x67\x1b\x6f\xb9\x0a\x96\x3e\xd9\x52\xba\x12\x3f\x72\x43\xcf\x8b\xa3\x0d\x63\x81\xe1\xc6\xf7\x57\x2d\x68\xcf\x6f\xf7\x7c\xec\x79\x8c\xcd\xad\x22\xdf\x8f\x36\x6c\x23\x04\x91\x1f\x2e\x03\xca\x4f\x43\xd7\xf7\x7d\x7f\x49\x30\xef\x86\x6b\x2f\xf4\x3d\x8f\xe1\x7b\x1d\xac\x97\xa1\x17\x20\x25\xed\x39\xbf\x09\xa9\xbc\x29\x14\x79\xad\x30\x11\xac\x5b\xee\xe4\xb5\x82\x5f\x1c\x86\x7e\x14\x90\x5d\xba\xf4\xd7\xab\xd5\x8a\x9c\xdb\xed\x31\xda\x4e\x3c\x24\x2b\x1d\xad\xc2\x60\x49\xcf\xe1\x76\xa4\xd1\x72\x13\x12\x16\xb6\x72\xa3\xf5\xda\x5f\x2d\xdb\xb9\x79\x7a\xb4\xe9\x4b\x70\x69\x33\x3e\x97\xb4\x49\xea\xdd\xe9\x6e\x8a\xbc\x80\xfc\xa8\x1f\xdb\x9f\x3f\x99\xd4\x45\x34\x51\xbf\xf2\xa8\xa4\xa4\xbf\xb1\x6d\x97\xe6\xb9\xc9\xfb\x7b\xd8\x33\x5d\x7e\xe8\x28\xca\xe6\x83\xfe\x4d\xe5\x42\x2a\x07\xcf\x36\x72\x11\x7d\x93\xbb\x18\x39\x3a\xbd\x4b\xb8\x18\xe4\x48\x50\x2c\xcb\xa9\x87\xc6\xc2\xd6\xa0\xf9\x1c\x43\xd7\x3d\x4a\xb1\x9c\x50\x23\xc7\x0d\x09\x86\xeb\xc7\x61\x08\x2c\x0f\xc6\xc7\xda\x6e\xb7\x27\xc2\x96\x97\x40\xf2\xe7\x06\xd0\x6f\xcb\xb2\xe1\xba\xfa\xce\xce\x68\x30\x3a\x80\xa2\x00\x26\x3e\x90\x8b\x9b\xb4\x79\x4a\xd3\x42\xd0\x18\xd7\x4d\x95\x36\xdb\xfb\xfe\xa9\x8a\xda\x84\x48\xcf\xc6\x71\x24\xea\x8a\x59\xa6\xd2\x17\xf0\x69\x9f\x14\xba\x8f\x1b\x2d\xb6\xb8\x5a\xc8\x0f\x0f\xea\xdb\xc2\xb9\xcc\xa3\x65\xff\x7b\xbb\xac\x85\x88\xf3\xbd\x26\x6d\xa1\xd9\xbe\x58\x04\x21\x66\x79\x44\xfa\xc0\xd3\x3c\x1a\xbb\x50\xe8\xd0\x71\xfb\x2c\xd7\xa2\xd9\x2c\xf2\x08\xd1\x87\x5a\x41\x49\x92\x14\xa7\xc5\x4e\xa2\x34\xc9\xbc\x51\xed\x97\x10\xa0\xc4\xb4\xc4\xa7\x2c\x35\x64\xe1\x95\xc1\x54\x5a\xd3\x03\x7d\x88\xa3\xbc\x96\x3f\xc4\x71\x1b\x3a\x2c\xd5\xa1\x11\xcc\x21\xb9\x4b\xc9\x4f\x1e\xe9\xa7\xdf\x49\xc4\x4b\x40\xf0\x85\x8d\x81\x01\x12\x4b\x48\xad\xda\x70\x0c\x1a\x3a\x6a\xc6\xf3\x11\x7e\xd8\xa5\xf5\xb6\xca\x0e\x64\x35\xe1\x10\x14\x33\x11\x04\x18\x6c\x6b\x8c\x11\x89\xb4\xcd\xb3\xce\x3e\x06\x76\x78\x35\x40\x51\x08\x50\x31\x8d\x3d\x7f\x2f\x55\x4d\x36\x0d\xfc\x73\x7a\x3f\x2c\x3c\x5d\x57\xca\x5e\x6d\xd9\xb9\x8d\x3d\x3a\x9f\x04\xee\x8c\xee\x98\xc6\x71\x68\x06\x00\xa3\x53\x6d\xe0\x13\x34\xb3\xf3\xe4\x3f\x99\xc7\xcb\x89\xbd\x8d\xc6\x9e\x2d\xda\x4e\xf2\xab\x9e\x32\x02\xbd\x77\xf5\x29\xd0\xbe\x3b\x31\xd0\xcf\xc7\x33\xfa\xc7\x8c\x0e\xef\xd5\x3f\x02\xeb\x9c\xa1\x5e\xca\x6d\xe9\x0c\x02\xc3\x1b\xf4\x75\xb2\x75\xcf\xec\xc4\x1c\x66\xe9\x10\xd0\xcc\xb2\x16\x91\x5a\xb8\x39\xb1\xef\x45\xe3\x19\x02\xfd\xec\xb8\xac\x98\xc5\x71\x32\xda\xa9\x88\x62\xae\x1c\xca\x58\x36\x7d\x90\xf3\x33\x23\x72\xaf\xe6\x1c\x9c\x30\x70\xe6\x24\xa1\x70\x51\xd5\x56\xec\xd4\xfe\x18\x32\x88\x0d\x25\x9f\x08\x59\xb0\x2e\xd9\xf3\xd7\x4b\x39\x14\x4f\x20\x07\x1c\x3c\xa5\x67\x27\xcf\x8e\x88\xc4\x22\x9c\x17\xf2\x0d\x6d\x52\x7f\xbc\xd1\x4d\xc3\xe5\x97\x73\xe2\x91\x37\x62\xec\x93\x9c\x6b\x66\xf2\xe3\x22\xed\x3f\x35\x73\x7d\xf7\x2d\x3d\x0f\xbf\x7d\x67\xa6\xdf\x83\x99\xda\xda\xa8\x89\x83\xa0\xbd\x88\x5e\x90\xaa\xc5\xda\xe9\x13\x60\x9e\x78\x66\x21\xce\x62\x8c\x62\xc8\xed\xd3\x44\xbc\x93\xce\x11\x9f\x86\x29\x7d\x3f\x48\x5e\xee\x20\xc9\xdb\x35\xaf\xf6\x9d\x8f\x68\x17\xde\x7b\x48\x1f\x23\x38\x12\x6a\xc1\x38\x72\x97\x4c\x65\x81\x7b\xab\x92\xc8\x67\xbf\x37\x5f\x0f\xe9\xcf\xbc\xec\x8f\x4b\xf2\xb7\x74\xf7\x91\x7a\xaf\x32\x23\xf4\x5d\x7a\x9b\x3c\xe4\x0d\x57\x75\x30\x4f\x9c\x25\xa5\x96\xef\x36\x9a\x2e\x27\x85\x7a\x3e\xb2\x8b\xa1\xe1\x88\x34\xde\x11\xbf\xe3\x14\xa8\x12\x8a\x9d\x7a\x44\xad\x07\x8f\x78\xe5\xb3\x6e\x02\x9e\x7c\xb2\x8b\xe1\x3c\x01\x30\x4d\x38\x4f\x0d\x38\x18\x55\x96\xc5\x6c\x55\xbd\xf0\x6c\xcc\xcd\x11\x1a\xee\x6d\xad\xaf\x3a\x25\x1c\x1a\x52\x39\xc6\xa5\x20\xea\xec\x15\x45\x73\xfe\xaf\x1b\x23\xb5\x10\xde\x9b\x97\x09\x3d\xde\xba\xba\xec\xa8\x6f\x81\x38\xfd\x1f\x9e\x1b\x5f\x00\x37\xca\x8d\x10\x63\x97\xac\x3b\xea\xe1\xdd\x73\x50\x3a\x25\x31\x61\xc7\x52\xe5\x7a\x2b\x91\xeb\x6d\xcb\xfd\x21\x69\x61\xf7\x0f\x2e\xf4\x84\x17\x79\xf3\x50\x23\x6b\x2f\x62\xcc\x95\x94\x7b\x00\xf7\xde\xa4\xc0\x3d\x38\x50\xfc\x83\xcd\x03\x49\xf3\xbc\x57\x72\x88\xd8\x50\xad\xbb\x17\xdc\xf9\x48\xf5\x75\xfc\xbf\x1f\x16\xf6\xfd\x31\x15\x8d\x6d\x7f\xc3\x10\xdd\x9b\x64\x77\x97\x8a\xf0\x60\xde\x90\x1e\xa0\x37\x08\x50\x79\xf0\x32\xb9\x5a\x0d\x37\x77\x5c\xbe\x39\x61\x68\x9a\xe1\x79\xa9\x70\xb4\x45\x0b\x26\xa5\xbd\x6d\x17\x2b\x49\xd5\xce\x9d\xec\x02\xd4\xd3\x8c\xec\x20\x35\xdc\xc1\x19\x90\xa4\xf5\xd5\x3a\x0d\x3a\xa0\x67\x41\x90\x19\x86\x2a\x3d\x51\x62\xd2\xd0\x28\x20\xf4\xe5\x57\x78\xa5\x0d\xb1\x8b\x83\x2c\x40\xaa\x9d\x8c\xf1\x86\xed\x36\x35\x79\x44\xff\xbd\xbe\x4f\x0e\xe9\xcf\x59\x71\x5b\x2e\xb6\x59\xb5\xcd\xd3\x3f\xe6\xec\x5b\xfa\xbc\xcd\x93\x3d\x7d\x9f\x68\xaa\x2c\x29\xee\x34\x85\x52\x3b\x72\x36\xcb\x1f\xdb\x0e\xfa\xc6\x55\x55\x56\x7f\x5c\xcc\xcf\x37\x25\xc6\x17\x5f\x7d\x4a\xc7\x6e\xeb\xc0\x90\x17\xbe\x05\x33\x63\xcf\xda\xe6\x47\xe7\x61\x66\x84\xbc\x4a\x1a\xaf\x9c\x7a\x08\xe3\x5e\x42\x38\xf3\xc1\xf9\x83\x55\x7f\xdf\x4d\xfe\x96\x23\xfd\x33\xa8\xf0\xfd\x0e\x89\xe1\x0f\x53\x64\x20\xef\xa9\xe2\xf3\xab\xfc\xba\xca\xb9\x73\x0b\xce\xf1\xbe\x29\x4f\x7f\xed\x1f\x4c\x5d\x43\x18\xf2\x78\x7b\x06\x44\x42\x64\x86\x0c\x4a\x6f\xc2\xcb\xe3\xf6\xa1\xaa\xda\x3b\xad\x9c\x19\x67\xac\xb6\xac\x5d\xba\x9a\x24\x20\x4b\xaa\x34\x59\xc8\x35\x4f\x79\x90\xe8\x07\x4b\xc3\x57\xbf\xf8\xcb\x84\x4e\xed\x7f\x0e\x35\x24\x72\x7b\x57\x8c\x48\xa0\x6b\x7b\x80\xfa\x90\x5f\x81\x50\x11\x2d\xc1\xfc\xb7\x6c\x7f\x28\xab\x26\x29\x1a\xab\xd5\xe6\x69\x99\x2c\xaa\xb2\x7d\x89\x26\x4f\x22\xd2\x05\xb4\x04\x92\x56\x77\xb9\x49\xd2\x5d\x32\x79\x81\xa9\xcb\x3b\x5f\x66\x0a\x4c\xd2\x4b\x76\x9a\xc9\xbe\x2f\xa1\xd4\x6e\xc9\x51\x85\xe6\x98\x41\x29\x48\xff\xf4\x67\xc8\xc9\x7d\xca\x04\x4d\xd8\xbe\xcd\xaa\xba\x31\x2f\x48\x9e\x0c\xd5\x38\x54\xe9\x63\x56\x0e\x2d\x6c\x91\x3e\x37\x83\xaa\x91\x29\x91\xc7\x87\x27\x78\xd9\xe7\x6d\x1b\x9a\xa9\x65\x55\x3e\x65\xcb\xea\xed\xdc\x41\xfa\x37\x3b\xf7\x7b\xd0\xfe\xa6\x29\xba\x73\x49\xf6\xc8\xef\x53\xc7\x45\x71\xf7\xf7\x11\xe0\x58\x93\x96\x2c\xa3\x58\x25\xa9\xb1\xe4\xc2\x31\x73\x14\xf5\x4b\xf1\x20\x29\x0e\xd3\x19\xa1\x20\xc5\x42\x47\x85\xfa\x63\xdc\x76\x6c\x42\x17\x48\x6b\x26\xc7\x01\x94\xae\x2a\xec\x3a\xa4\x41\x87\xfe\x5e\x93\xe6\x39\xe5\xfb\x8b\x7f\xa4\x55\x79\xe4\x13\xea\x99\x7b\x3f\x5b\xf0\x8d\xe7\x36\x15\x2c\x7a\x40\x79\x7f\x9a\xc0\x56\x82\xbc\x02\x8f\x8f\x6e\x38\xe5\x43\x2b\x15\x69\x13\x98\x88\x89\x4f\xe8\xa7\xbb\xaa\x7c\xba\xf4\x3b\x75\xb8\x9c\xa5\x82\xdc\xae\xad\x20\x82\xbc\x26\x28\x50\x78\x44\x4a\x12\x26\x4b\x79\x47\x22\xd2\x77\x5f\x81\x3d\xa9\x68\x5a\x28\xc6\xb3\x92\x6d\x4d\x51\x58\xd2\x34\x98\x87\xfd\x72\x36\xd8\x0e\x0d\x3a\x31\x1f\x6a\x45\x32\x25\x21\xc1\x9a\x50\xd3\x5b\x1c\x04\xbb\x5b\x18\x2c\x2c\x3d\x1d\x0c\x70\x8f\x40\xa3\x3a\x68\x2a\x43\x61\x9a\xcb\xfc\x4a\xce\x18\x2a\x64\x5b\x8e\x5e\x6b\x2e\xa7\x5a\x57\x81\xc4\x87\x2d\x28\xd5\xf8\x4d\x5f\x17\x49\xd0\x8c\x65\x46\x41\x22\xd0\x71\x69\xc8\x9c\x19\x98\x32\x18\xa4\x60\x5c\x7a\x66\x63\xb8\x10\x6a\xa7\xde\x07\xc2\x33\xa0\x46\x8d\x80\x38\x72\xb6\x4b\xf3\x74\x85\x59\x01\xf5\xb9\x6d\xd2\x69\xf9\xc1\xbd\x37\xc1\xef\x82\xfc\xc9\x37\x6b\x36\xbb\x43\x52\x08\x5a\x46\x16\xee\xe2\xc5\xaf\x08\x23\xee\x35\xec\xfd\x67\xe0\x3a\x43\xce\x57\x68\x52\xad\xb0\x30\xf1\x3a\xa2\x14\x4f\x33\x9e\x7e\x29\x0b\xed\xf3\x84\xf8\xee\xce\x02\xea\x44\x71\xa5\xda\x3e\xd3\x53\x23\x60\x87\x63\x1c\x23\x3c\xab\x25\x91\xee\x49\xd7\xe2\x30\x12\x0f\x20\x3c\x08\x29\x03\x4d\xd2\x69\x89\x3a\x84\xfe\x3a\xa0\xe8\x60\x58\x23\xf6\x3e\x21\x1a\xe6\x82\xbb\xe1\x06\x71\x42\x58\x2b\xef\x20\xbe\xa0\x9e\xa7\x21\x74\x06\xce\x6e\xdd\x50\x1c\xcd\x77\x16\x6e\x18\x9d\x1f\xdd\x6c\x6b\xc3\x04\x55\xa8\x74\x21\x58\x5c\x6d\x06\xd3\x17\x6c\x28\xe4\x39\x58\xbc\x0e\x5b\xf7\x49\xde\xb8\xdb\x7f\x17\x79\x56\x7c\x11\x78\xc6\x5a\x7d\x97\x30\x59\xf5\x4e\xec\xb2\x7f\x65\x31\xdf\x47\xf6\xe5\x2e\xc9\x59\x38\x72\x7d\x30\x30\xd6\x99\x18\x96\xce\x33\x46\xa1\x83\x4d\x34\x3a\x6e\x9a\xb6\x9f\x3f\x4e\xa3\x2d\xd5\x09\xff\x48\x4f\x1e\x52\x16\x2f\x7d\x3c\x3f\xe5\xad\x63\x04\x0e\xb4\x92\xbf\x3d\x0c\x37\xab\xa9\x50\xa3\x2a\xe8\x98\xb1\x8c\xcd\xdb\xad\x00\x98\x44\x97\x6b\x61\x02\x3e\xdb\xc5\x99\x3e\x9f\xe6\xeb\xa4\xe9\xea\x6a\xc1\x6d\xd3\x9e\x27\x63\x67\x0c\x23\xeb\x29\x6f\xf5\x36\xc3\x3c\x35\x8c\x9f\x90\x06\xc3\x37\xed\x2e\xec\x71\x32\xd4\x37\xd0\xbd\x33\x31\xf9\x89\xc5\x39\x56\xfc\x19\xb9\x70\xf8\x98\x56\x79\xf2\x15\x15\xcd\x3f\x69\xae\x88\x9f\x86\x2e\x7a\x9a\xcb\x15\xed\x0a\xe7\x97\xd0\xa6\x43\xbd\xf8\xa0\xd4\xf9\xed\x2f\xfb\x74\x97\x25\x4e\xbd\xad\xd2\xb4\x70\x92\x62\xe7\x7c\xe8\x83\x87\x46\xab\xf8\xf0\x7c\x71\xfc\x1e\x13\x9b\x3a\xfe\x6f\x2f\x67\x03\x2b\xd9\xb7\xbf\x79\x8b\xd8\xd3\x04\xec\x1f\x31\xa3\xd1\x89\x36\xb0\x6f\xce\xb6\xd5\x68\xf2\x79\xef\xcf\x07\x2a\x04\x43\x15\xc2\xa1\x0a\xcb\xa1\x0a\xd1\x50\x85\xd8\x14\xdc\xf4\xe0\x2b\xca\xc0\x21\xdc\x21\x2f\x40\xbd\x39\xc2\x9b\xb5\xf1\x7d\x7d\xdb\xdd\x17\xb0\xc9\x3d\x97\xad\xed\x34\x1b\xda\x97\xb4\x8d\xa5\x49\xb7\x5e\x2c\xc7\xd6\x8f\xc4\xe7\x65\xa7\xae\x37\xc8\xf5\xcf\x78\xc4\xeb\x73\x6c\x9d\x9c\x42\xeb\xf4\x0c\x59\x53\x13\x60\xb1\xbd\xc0\xb7\x34\x62\x3d\x7b\xee\xdc\x71\xa1\x26\x21\xf3\x0f\x44\xf7\xff\xc5\x28\x1d\x31\xca\xd1\x53\xd0\x25\xa2\xe8\xc7\x13\xa3\x44\x5d\xca\x42\x62\x63\xcd\x1f\xdb\xba\x74\x28\x82\x25\x2b\xa0\x11\xa6\x32\xd1\xaa\xc6\xa9\x8f\xb8\x23\x04\xcb\x18\xf5\x06\x60\x49\x06\x26\x1c\x58\xe4\x3f\x1a\x8d\x82\x40\xc9\xce\xc2\x0c\x18\xf9\xbd\x07\x3c\x03\xd0\x73\xc9\xfc\x84\x20\x18\x41\xaa\xd5\xf4\xd3\xeb\x4e\xd0\xac\x49\xf7\xc6\xf8\xf4\x55\x79\xd8\x95\x4f\x05\x31\x5e\xc2\xa5\x39\x2a\xbd\x91\x74\x5a\x79\xda\x10\x13\xb4\x43\xb2\x6d\x19\x45\x51\x56\xfb\x24\x97\xb5\x49\x9d\x16\x4a\x52\x2b\x89\x7a\x6a\xc4\xb6\x4f\x95\xe5\xd8\x3e\xa4\xc2\x87\xe3\x29\x89\x3b\xd0\x57\x39\x13\x2a\xa8\x94\x36\xb7\xac\x4c\x2d\x7f\xe4\xc4\x68\x92\x06\x8d\xd3\x6c\xba\x6e\xff\xb1\xba\x41\xb2\x3e\x38\xed\x8a\x22\x1f\x85\x63\x20\x5d\x61\x8c\x2c\x4a\x04\xa2\x11\x1b\x31\x9e\xaa\x7c\xa2\x83\xe8\xbb\xbf\xea\x04\x59\x4f\x2f\xc5\x76\xed\x04\xb1\xf9\x26\x4f\xb6\x5f\x6c\xc7\x2f\x25\xfc\x30\x9c\x7b\xe2\xb4\x7b\x8b\x17\xbb\x6e\x7a\xb3\x17\x4a\x94\x45\xd9\x12\x52\x5e\x3e\xa5\xbb\xde\x74\x65\x79\xc5\x15\xb5\x0f\x75\x67\x69\x49\xd7\x5b\xfe\x30\x76\x9c\xe3\x08\x4f\x6c\xa5\x4f\xd4\x62\xd7\x35\x25\x11\xcb\xbe\xfb\x66\xcc\x4c\x6e\xe4\x88\x47\x75\x76\x29\x76\xa6\x1a\xd9\x09\x6a\x6b\xcb\x89\x63\xb1\x35\xcc\xf5\xb9\x63\x09\x1a\x44\x07\x73\x23\x09\x77\x1f\xbc\xf9\xc2\x3f\x3c\xcf\x3d\x48\xe8\xf7\x65\x0d\x55\x8f\x49\xbe\x7d\x68\x6b\x2f\xf6\xe5\x4e\x0a\x51\x64\xd9\xa8\x17\x16\xe7\x63\x1b\xb0\xab\xd4\xf8\x76\xed\xa6\xde\x27\xf5\xe4\xb6\xdb\x3c\xdb\x7e\x69\x17\x55\xa7\x21\xb4\x84\xc5\x0b\x88\xb9\xba\x00\x8f\xfc\xba\xa2\x66\x00\x79\xf2\xb5\x7c\x68\x64\x5b\x9b\xa9\x5d\x68\xca\x24\x15\x12\xed\x99\x5d\xda\x5b\x72\x3d\xbc\x74\xd7\x8a\x0b\x96\x34\x96\x6d\x9a\xe7\x4a\x16\xab\xef\x3f\x28\x51\x8a\xe7\x07\x10\x2e\xc8\x13\xf8\x2d\xbd\xd0\x72\xe9\xf4\x1b\x73\xd7\x80\xf6\x20\x16\x57\x0d\xc3\x53\x80\x1c\x45\xab\x29\x0f\x26\x03\xb9\x43\x6c\x54\x7f\xc5\x5c\xfd\xc5\x7e\x43\x73\xf1\xee\xeb\xe2\xa6\xcc\x77\x73\x27\xf6\xbc\x0b\xd5\x14\x5a\x12\xb7\x5c\x2f\x94\x34\x68\x8a\x77\xa0\x8f\xf9\xa7\x79\xe7\xa5\x84\xaa\x7c\x92\xc8\x4f\x7c\x46\x3f\x4f\x17\xba\xb0\x94\x06\x82\x87\x08\xa4\x11\x0a\x05\x5c\xad\xe0\x9b\xba\xdd\xea\x4f\x98\x95\x9c\x2f\xf6\x34\x26\x88\xa7\x6a\x3a\x0d\xa6\x90\x69\x4e\x04\x75\x9b\xec\xd2\x23\x17\x87\x3c\x68\x67\xcf\x3e\xf6\x09\x19\xb3\x62\x51\x3e\xb4\x12\x78\x9e\x2f\xb6\xf7\x49\x71\x97\xf2\x3a\x14\x8c\x9b\x15\x1d\x24\x9f\x7e\xfa\xb5\x7c\x2a\x64\xe8\xe2\xb9\xda\x9e\xaa\x41\x34\xbb\xb0\xe8\x79\x8e\x24\x89\xd4\x8f\xa9\xaf\xdd\x0f\x45\x18\xa1\x66\x34\xed\xf1\x5e\xde\xde\xd2\xe7\x34\x9e\x86\x2e\xbd\x29\x49\x72\xe4\x5e\x13\x43\x50\x0a\xec\x4b\x11\xe3\x55\x7e\xd5\x39\x3c\x2b\xd6\xab\xe2\x37\x7a\x37\x06\x1f\xc8\xd5\x72\x5b\x16\x2d\x79\xfe\x35\xa9\xd3\x96\xa8\xff\x9f\xb2\xfd\x5b\xe0\x7d\xf0\x2f\x40\x4d\xc9\x32\x08\x94\x3c\x66\x75\x76\x93\xe5\xed\x54\x95\x32\xcc\xac\x96\xdf\xc4\x1c\xcf\x31\x74\xed\x78\x78\x17\xe4\xaf\x39\xf4\xcb\xb8\xac\xca\xb2\x39\x52\xee\x57\x24\x8f\x8a\xda\x44\xeb\x46\xbe\x6c\x19\x63\xdf\x8e\x4a\x97\xc3\xcd\xfb\x18\x67\x58\xeb\x3b\xa5\x15\x53\xb6\x50\x01\x3f\xe3\x2f\xd5\xb0\xed\xbd\xa0\x33\x03\x4d\xeb\x6c\x97\xb6\x15\xf2\xac\xf8\x02\xaf\x72\xb0\x31\x29\x33\x4f\x74\x25\x0e\x95\xb4\x60\xe3\x35\x37\xf4\x3d\xa4\x25\x7e\xee\x1c\x7c\x58\xa0\xeb\x0e\x6f\x8b\x81\xbe\x10\x9f\x9b\x8f\x35\x45\xde\xef\x49\x95\x25\x2c\xc4\xef\xcf\x4d\xf5\x90\xfe\x21\xb2\x99\x6f\xbf\xb7\xbc\xc8\x50\x81\x99\x3f\xf0\x2e\x8f\xb2\x39\x0b\xb9\x91\xf7\x1b\x76\x9b\x1c\xb2\x26\xc9\xb3\x7f\xa4\xd0\xdc\xfb\x9b\xdb\x24\x37\x35\xa2\x36\xed\x0d\x61\x85\x0a\x0e\xe9\x8f\xe8\x4b\x64\xe3\xda\x26\xb9\x51\x6c\xe5\xa8\x8d\xe8\xb7\x7f\xbf\x5c\xec\xeb\xc5\xed\x43\x9e\xb3\x27\x77\x58\x79\x4e\xc8\xde\x31\xb4\x67\x36\xa6\x50\x8f\x41\x06\xc5\x8f\x22\xe1\xed\x43\x2a\xfb\xd4\x0e\x98\xfb\x5c\x92\x57\x1e\xd9\xcc\x07\x7f\x34\xc5\xc2\xfd\x0a\x33\xe6\xde\xce\x82\xc9\x1f\xcd\x19\x77\x5f\x65\xc5\x17\xa8\xa0\x81\x4e\xd2\x81\xe8\xbe\xc5\x83\x88\xa9\x83\x76\xfa\xa5\x95\x35\x3a\xb2\x0b\x68\xa7\x4c\x92\x12\xb8\x51\x89\x50\x1c\x94\x60\xf6\x07\xd5\xd7\x9e\x1e\xc1\xd2\x78\x8c\x34\xa0\x6f\xc5\x2f\xbd\xa6\x4a\xfc\x2e\xdf\xaf\x51\x56\xd4\x69\xc3\x95\xcc\x2d\xab\xed\xac\x98\x0c\x75\xc4\x1d\xa9\xe1\x87\x17\x56\xe3\x45\x94\x46\xbb\x75\x1a\xa6\x1b\x93\xd2\x08\xe1\xa3\x73\x87\xb5\x1b\xe8\x96\x06\x2e\xa7\x8d\x2f\x14\xd5\x86\xbd\xde\x4a\x65\xc7\x40\x6d\x06\x4f\x9a\xa7\xec\x1f\x49\xb5\x5b\xec\x93\x96\x70\xee\x06\xe2\x95\x70\x76\xc8\x1a\x71\xb6\x3e\xd4\x2e\x92\x1b\x92\xde\x5a\xb2\xbe\x46\xdb\x11\x0f\x22\x73\x97\x6d\x63\x6d\x7f\x1b\xcf\xd4\x6c\xc1\xd6\x46\x3d\xda\xca\x42\x77\xba\x31\x30\xc4\xae\xd5\xdc\x37\x3c\x6a\x78\xe7\x4d\x7a\xa0\x07\x3a\xbd\x68\xb5\xc2\xb7\x47\xb9\x82\xa9\x9e\x19\xa7\xc1\x50\x37\xb4\xba\x3a\x57\xfa\xbd\x7e\xd8\x6e\xd3\xba\x86\xb2\x83\x04\xa6\x23\xe0\x71\x72\x00\x83\xc2\x6e\xfe\x09\xa8\x61\x0a\x0b\x34\xdc\x7a\x41\xc9\x39\xdd\x8d\xc1\xfc\x88\x77\xa3\x01\x2c\x68\x00\x61\xfd\x20\x90\x16\xca\xb2\xde\xd7\xf9\x07\x6f\xee\x78\xb3\xb9\xb3\xde\xcc\x94\x61\x4b\xa2\x1b\x79\x2f\x6b\xab\xd3\xff\xbb\x01\x8b\x9e\x44\xeb\x3b\x2e\xb5\xfc\xdd\x65\x49\x5e\xde\xd9\x58\xaa\x63\xfe\x9c\xe8\xdb\x5e\xff\x27\x1b\x42\xfb\x8f\x1b\xe8\x9e\x02\xfb\x3f\x11\x14\x49\xec\x97\x4b\xfb\x11\x09\xe6\xdd\xdb\x66\x74\xb1\xb6\xc4\xc9\x71\xd9\x40\x35\xdb\x3d\xd1\xe9\x01\x5b\xc2\xf3\x7b\x3d\x0c\xf6\x22\x4a\x25\xbd\xa1\x0e\x31\x78\x0f\x9c\x80\xc5\x69\xe7\xde\x0a\x57\x5d\xca\xfa\xac\xc9\x92\x5c\xeb\xf0\xa0\xb8\xef\xc2\xbc\xb6\x18\x6d\x60\xb8\xa7\xdb\x71\xae\x2d\x69\xb9\x4c\xcb\x4d\xda\x0b\x8d\xe4\x9e\x00\xa2\x4f\xf1\x39\xb1\x97\x2a\x77\x43\x89\x26\xec\x5f\xaf\xb0\xbe\xa9\x2b\x81\xe1\xa5\x45\x61\xcd\xfc\x75\x65\xc8\xab\x01\x8e\x4d\x7c\x69\x0b\x23\x35\xa2\x94\x1f\xc5\x9a\x11\x22\xbe\x1c\xc3\xc3\x15\x4f\xc0\x6e\xc8\x50\x06\x53\x7b\x92\x43\x80\x5c\xe9\xf3\x90\x30\xf9\x94\x4d\x69\xe9\x76\x72\xa7\xf4\xa5\xdf\x78\x4b\x41\x4e\x6d\x91\xd2\xad\xe4\x12\x59\x1d\x48\xd4\xd0\x7c\x09\xa4\xe1\x6f\x61\x48\x1a\x7d\xcd\xfa\x12\x4c\xe0\x62\x3f\x1b\x84\xaf\x90\x13\x78\x0e\xd3\x41\x15\x3d\x30\x75\x58\x15\x0e\x9b\xba\x6b\xc4\x56\xd4\x13\xbd\x57\x40\xbe\x01\xd1\xcf\xc3\x8c\x22\xa1\x8f\xa3\x21\x7c\x52\xbf\xb6\x3d\x46\xe5\x60\x0f\xc6\x08\x11\x3e\xb5\x31\x30\x5b\x9c\xeb\x8f\x59\x60\x78\x0e\xf4\x4b\xa4\xc8\x69\xfb\x4d\x2a\xc7\x0d\x6a\xbb\x79\x3a\xc9\x80\xe1\xbb\xcd\x30\xec\xba\xe2\x4f\x87\x56\x75\xf9\x4d\xc4\xaa\x32\x7d\x74\x1b\xde\xd0\x26\x91\xa5\x7f\xef\xb5\x42\x5b\xff\x36\x67\x57\x9d\x3f\xcd\xf5\x96\x02\x90\xac\x7c\x13\x5d\x72\x31\x47\x22\x7a\x61\xb7\x85\xcb\x19\xd8\xd5\xed\x2f\x1b\x5f\x38\x72\x25\x5d\xf8\xca\xc1\x24\x5b\x5d\x4a\x86\xc2\x7a\x12\x17\x6c\x5d\xb0\x37\x0f\x58\x32\xce\xca\x8a\xb6\xc4\xe2\xb9\x40\x83\x9b\x34\x6c\xff\x31\xdb\xdc\x98\x64\xbe\xf6\x02\x46\x40\x5c\x40\xdf\xc0\x49\x09\x81\xf0\xfb\x97\x9a\x19\x08\x93\x92\xf4\x59\x6f\xe4\xd2\x89\x32\xd2\xc4\xb4\x3a\xe6\x3e\x86\x28\xf8\x88\xf9\x38\x4a\x5e\x9f\x92\xa1\x0e\xc3\x76\x18\xaa\x36\xc8\xc8\xad\x71\xee\xfc\x89\xa6\x75\xbd\x50\x8e\x48\xbe\x5f\x06\x77\x19\xf1\x4a\x17\x07\x25\x0b\x7e\xdb\xf2\xa1\x15\xc7\x17\x55\x5a\xa7\xcd\x65\x82\x05\x92\x82\xda\xac\x3e\x2c\xd4\xa2\xf9\x7a\x90\xbd\xde\x74\xe7\x1e\x32\x34\xa2\xcf\xd1\x0e\x8d\xd9\x16\x39\x1e\xd7\x21\x38\x44\xe7\x02\xab\xa0\x7b\x40\xba\xf5\x5e\x48\xda\x19\xc3\xc5\xf5\x82\xf5\x00\x95\xec\xec\x9a\xe1\x89\x46\x98\xfd\x6f\x76\x38\x2f\x4f\x5a\x5c\xd4\x38\xdf\xf8\x3a\x59\xa5\x77\x0f\x79\x52\xcd\x9d\xf6\x2e\x6d\x85\x68\xae\x5b\x1a\x3e\x55\x30\xbd\x45\x27\x2c\xc2\xa1\x45\x56\x43\xad\xd3\x7d\x46\x1f\x53\xa3\x91\x63\xd5\xd0\x73\xf1\x65\x92\x82\xcc\xa8\x6a\xe8\x55\x65\xff\xf5\xd8\x18\x45\xf9\xb6\xdc\x1f\xf2\xb4\x49\x8f\xf8\x16\x8c\xd2\x9b\x95\x1f\xbd\xf8\x16\xe4\xf4\xc6\xb7\x22\x90\x07\xfb\x4e\xe1\xc3\xa2\xdd\xe4\x48\x20\x44\xcd\xcc\xb6\x81\xbf\xf3\xbc\xf3\xf6\x57\x94\xd4\xdc\x86\x3b\xc7\x30\x53\xcb\x45\xfa\x98\x16\x4d\xcd\x1e\x75\x07\x19\x77\xf1\xe5\x88\xdc\x6a\x88\x00\x44\x89\x3b\x2b\xee\xd3\x2a\x6b\x30\xd5\x0a\x0c\xf4\xc5\x74\xd4\xd4\x7b\x4b\x3e\x91\xe0\x06\xe6\xf0\x70\x73\x52\xf9\x49\x40\x7a\xed\x11\x8e\x01\xab\xd9\x69\x0b\x16\xf5\xc3\xed\x6d\xf6\x6c\x76\x30\x61\x13\x55\x6e\x2a\xd2\x15\x29\x8c\x6c\x64\x51\x9b\xe1\x68\x97\x7b\x41\xc8\x8b\xca\xc3\x12\x3e\x6e\xb3\x3c\xbf\x64\x24\xa6\x1d\xc4\x09\xea\x06\xe1\x69\x05\xb9\x8b\x63\x12\x8a\x84\xa0\x18\x71\x9d\xe3\x37\x3c\x4d\xd4\x07\x26\xed\xa3\xae\x75\x3a\x25\xda\xa8\x98\x4d\x34\xda\x42\x4b\xf5\x50\x6a\x05\x9b\xc1\x5e\x79\xd7\xbb\x80\xd0\xcf\xd2\xdb\x9c\x76\x51\x78\x96\x4a\xb2\x81\x6b\xc5\x03\x45\xc2\xa2\xea\x32\x67\x03\x75\x5c\x1c\x2b\x18\xeb\x53\xef\x6d\xa5\xd7\x97\x88\x17\xae\x4e\xbd\x01\xad\x75\x10\x5f\x32\x55\x03\x85\x43\x1d\x7a\x5c\x36\x80\xe8\xe3\x5c\x40\x3f\x34\xbc\xba\xfc\x5c\x8b\xe8\x78\x40\xed\x43\x72\x97\xd2\xf0\xbb\xca\xe8\x2e\x8e\xa2\x6e\x50\x8c\x15\xb2\x51\x44\x79\x83\xf2\x9b\x91\xd3\x2a\x7a\xbc\xd7\xe9\xea\x3a\xdc\x4b\x84\x8b\x5c\x6b\x59\x64\x31\x5c\x8e\x76\xb9\x2a\x4f\x1e\x03\x4c\x12\xe5\x4b\x5a\xb6\x20\x52\x36\xa7\x0a\x87\x3f\x8d\x6b\x2a\x19\xee\xef\xf6\x3d\x99\x80\xf4\x6c\xdc\xe3\x21\x4e\x9e\xc5\x60\x6a\x2a\xcc\xfc\x6e\x04\x16\x42\x99\x92\x55\x28\x06\x1c\xb4\x95\xec\x70\x60\xec\xa7\x6d\x73\x48\x8a\x34\x9f\xd2\x87\x18\x5d\x0e\x22\x68\xc9\x9e\xf4\x55\x98\xcf\xb9\x9e\x58\x21\x76\xe4\x3d\x0a\xdb\x1b\x07\xdd\x56\x98\x36\xe8\x08\xe1\x2d\x2c\x9e\x04\x7d\x91\x66\x3f\x16\x54\x37\xcb\xf2\x6b\xb7\xb5\x9b\x2a\x4d\x8b\x72\x97\xf2\xc4\x15\x17\x47\xc2\xab\x48\x0e\x83\x88\x64\x39\x88\xdc\x15\x0b\x2e\x80\x3a\x0f\x2d\xc5\x5d\x45\xf8\xc4\xa7\x4b\x12\xbf\x72\xb1\xbd\xcf\xf2\x1d\x74\x52\xf5\xcc\x55\xc7\xb4\x23\x82\x01\xac\x0e\x99\x8e\x45\xfd\x4f\x2e\x09\x46\x4d\x18\x92\x5d\xb7\x0c\x79\xd2\x35\x1b\x67\x2e\xbc\xf2\xa7\x2d\x0f\xec\xf3\x89\xd2\x8e\xe8\x0c\x02\x43\x42\xf3\x4f\x54\x62\x11\x5c\xa0\x54\xb8\x4e\x07\xf7\xa8\x39\xd6\xb5\x1c\xb7\x03\x41\x07\x04\x9e\x23\xba\x05\xae\x9b\xa4\xc9\xb6\x82\xc0\x60\x90\x12\x24\x80\x8e\xcb\xc5\x85\xde\x9a\x73\x72\x4b\xb0\x63\x38\x90\xcd\x86\xcf\x73\xb3\x31\x43\x93\x5f\x1e\x25\x4f\x8b\xc1\x96\x2a\x27\x34\xc9\x51\x3c\x50\x83\x2c\x0a\x49\xc0\xc5\x33\xcc\x0e\x31\x9d\x35\x3a\x71\xbd\x9d\x0f\x56\x84\x0f\x7a\xdc\x5f\x57\x27\x41\xf4\x10\x8a\xe4\xb1\xfd\xf7\xb7\xac\x6e\x0c\x9b\x49\xea\x90\xe2\x48\xc2\x35\x9c\x6a\xbf\xa8\x49\x95\x26\x47\x49\x7f\x6c\x44\x54\xb2\xfd\xb2\xab\xca\xc3\xb1\x73\x44\xe4\x9e\x89\xc3\x73\xc1\xe5\x65\xcc\x2c\x6c\x70\x05\xf4\x1c\x19\x5b\x08\xc3\xd3\xb7\x86\x8e\xa8\xe4\x68\xb3\xbd\xf4\x23\xc1\xca\xc6\x8d\x0e\x55\xca\x6a\x47\x54\x94\xdd\x7d\x1e\xc5\xf4\xdc\x5c\x9b\x6d\x2c\xe3\x8e\x2c\x4a\x7a\x49\x43\xae\x77\xfa\xe5\x47\x1b\xc9\x2a\xe6\xfe\x4e\x27\xd9\x76\xca\x67\xc6\xa0\x91\xe7\x5f\xea\x87\xc3\xa1\xac\x9a\xda\xf9\xb0\xd8\xd7\x8b\x6c\x9f\xb2\x7b\x4d\xbb\xa6\x17\x47\xbb\xd7\x44\x35\x55\xce\x37\xc1\xc2\xab\x4b\x86\xc1\x71\x8c\x18\xe8\x6a\xec\xbc\xd4\xa6\x36\xa6\x49\x91\xa7\x02\x18\x6b\x08\x24\x37\x04\x46\xc3\x3a\x43\xe6\x15\xd2\x7a\x82\x01\x50\xd7\x96\x2b\x8a\x98\x79\x25\xb4\x66\x46\x6b\x68\x01\x64\x05\x33\xf6\xb6\x00\x25\xd7\xd5\x02\x3d\xd4\x0f\xe9\xae\xb4\x80\x28\x54\xbc\xf8\xd6\xe5\x46\x41\x9f\xdb\xfb\x62\x1e\xab\x45\x8a\x48\x87\xe4\x58\x51\x72\x9d\x4b\x17\x70\x35\xea\x8c\xe6\x39\x18\x25\x16\xf8\x12\xac\xed\x1c\x3c\x99\x1a\xea\x28\xef\xa4\xca\xf3\xbb\xa1\x0b\xfe\xc2\xac\xad\xa0\x28\xf5\xe3\xe5\x5a\x8d\x37\x67\xa0\x6b\x12\xca\xa6\x6d\x84\xcf\x94\x6f\x41\x21\xa2\x8e\x79\xe2\x9a\x26\x12\x1e\xe8\x15\x8f\xbd\xa8\xae\x05\x2c\xf0\xfc\x39\x48\x74\x1a\x34\x10\xf0\x37\xa5\x6f\xf5\x79\x00\xba\xf0\x1b\x6f\x9a\x6b\xc9\x64\x85\xda\x4a\x23\x97\xe9\x81\x98\xc4\xdc\x96\x5d\x8a\x84\x25\x8f\x54\x24\x78\x16\x7b\x57\xad\xe6\xb8\xdc\x25\x9d\xed\x09\x55\xba\x50\xee\x39\x16\x50\x90\x70\x13\x53\xe0\xba\xfc\xf1\x43\xe9\x60\x8e\xd7\xa5\xfe\xbb\xb6\xb5\x89\x82\x4d\xc5\x00\x8c\xd6\x10\x83\x48\x0e\x2c\xba\x14\x28\x1e\x64\xa2\x24\x1d\xa0\x02\xe2\xe2\xaa\xcb\xfa\x16\x8b\x04\x3a\x38\x6f\x86\xd8\x71\xd3\x37\x37\xc2\xb1\xd0\xa5\xc9\xd4\x20\x43\x0a\x6b\x61\xcb\xb1\x25\x84\x74\xe1\x95\xa8\x89\xbf\x3f\x84\x8d\xae\xa8\x15\xac\x06\x02\xbc\xdb\x23\x55\x8c\x5a\x18\x0f\xc7\x31\x19\x71\xe2\x49\x13\x06\x10\x2f\xe4\x98\xde\xa3\xa9\xe0\x75\xc7\x6d\x1c\xb6\x86\x12\xa5\xc8\xfe\xe6\x21\x57\xd2\xd3\xef\x49\x63\x26\xf3\x8f\x5a\xc1\x7d\xc2\xce\x79\xe5\x61\x1b\x31\xcd\xb6\xaf\x69\x67\xc0\xa7\x5d\xdd\xc6\x30\xf3\xc2\x57\x9a\xb8\x79\x6b\x58\x31\xae\xb7\xb6\x64\x60\x49\x6c\x8e\x29\x56\xdd\xfe\x5c\x83\xcc\x50\xbb\x9c\x30\x8c\x25\x7e\xba\xb1\x1a\x93\x0f\x38\x7a\x7d\x8b\x26\x20\x41\x7f\x58\x99\x71\x31\xd8\xce\x8a\x5c\x30\xcc\x28\x79\x90\x4f\x3c\xed\x40\xec\x63\x33\x66\xd0\x3d\xad\xa6\x74\x19\x89\xe0\xb7\x7a\xda\x59\x10\xc5\x1b\x3d\xf0\xcc\x84\xf9\x7a\x9c\xa8\xe2\x1e\x29\xa3\xc7\xfc\xea\x4c\x94\x13\x4b\x6c\x46\xb9\xe9\xf0\x93\x0d\xa7\x0c\xfb\xe4\x07\x3b\xfc\xc6\x30\xb4\xb7\x76\xfe\x91\x15\x69\xca\x83\xcd\x59\x46\xea\xda\x1f\x7d\xa4\x3a\xc5\x8d\x3d\xd3\x93\xce\xbd\x21\xae\x61\x3e\xf5\x3a\xaa\x1d\x39\x77\xfd\xd9\x65\x42\xc1\x40\x2b\x0d\x26\x86\x58\x29\x3c\xee\x86\xb0\x31\x7c\xd8\x19\xb1\x70\xd2\x6d\x4e\x8b\x4c\xdd\x95\x15\xa1\xfb\x81\x9b\xeb\x18\xaa\x97\xf3\xb8\x8f\x5e\xfc\xd7\x19\x36\x95\xd3\x62\x90\x62\x4a\x27\x99\x98\x28\xd1\x20\x3d\xe9\x43\x5c\x9e\x71\x06\x91\x37\xd3\xa4\xfe\x8f\xbc\x99\x96\x06\xed\xce\xbe\xd7\x9a\x13\xf3\x06\x61\x47\xc1\xca\xb0\x28\x7c\xa3\x4f\x17\x17\x6d\x38\xe7\x6b\xe1\x61\x60\x47\xd9\x71\xb9\x37\xbd\x88\x74\x79\x2c\xcf\x44\x5a\xd9\xfe\x50\xac\x58\xc8\x31\xe3\xda\xaa\x42\x82\x74\x2c\x0e\x0a\x08\xe6\x73\x91\xcd\x5f\x73\x2c\xea\xe7\xaf\x3f\xe1\x8c\x68\x18\x6a\x66\x47\x33\x08\x52\xe4\x94\x7e\x27\x5e\x04\x61\x48\x7d\x13\x56\x4e\xd1\xed\xe8\x91\xfb\x46\xcf\xc9\x41\x6a\x78\xf5\x83\x52\x3b\xe8\x7f\x96\xd3\xd1\x66\x73\xbd\xf6\xa4\x06\xe8\x67\xf0\x4c\xb4\xdb\x37\x3f\xdc\x99\x38\x86\xc1\xbd\xb5\xa5\xb3\xca\xdb\xc3\xcd\xd1\x11\xf3\x4b\x60\x7c\xa6\x3c\xd3\x72\xff\x13\x66\xc0\x85\x92\x85\x5d\x90\x7e\xdc\x18\x43\xf5\xbb\x7a\xf9\x9c\x09\xe2\x11\xad\x7d\x9a\xc7\x8c\x5d\xe6\xe0\x29\x72\x6c\x56\x2c\x15\xb0\x9c\x55\x02\xbe\x4c\xab\x0f\xd7\xc8\xc2\x93\x98\x13\x92\xd1\x3c\x7c\x18\x5f\x22\x09\x6e\xbe\xb9\xbb\x2a\xb9\x5b\xdc\x27\xc5\x2e\x4f\xf9\x3b\xf7\x5d\x95\xdc\x7c\x73\xb3\x62\xd1\x96\xc1\x8f\x37\x59\x71\x37\x26\xd4\x37\x03\xe1\xfc\x19\x77\xb0\xe2\xc5\x64\x0c\x77\xc9\x4d\x9e\xba\x37\x69\x56\xdc\x91\xaf\x77\xe9\xae\x8b\x32\xe9\xc6\xdf\xfa\x3a\x8b\xbb\xfb\xb2\x6e\xa4\x18\x92\x92\x5b\xaf\x12\xb6\xb1\xc3\x66\xe0\x2f\x57\xcb\x75\x18\x2f\x57\x57\xc8\x98\x84\x10\x98\x2d\x73\x9b\xd3\x60\xa6\x62\xdf\x9f\xfa\x0f\xbd\x11\x04\x88\xd9\x29\x55\x77\x77\x55\x79\x38\x80\xe9\x78\xdf\xe8\x27\x32\xe3\xbe\xf2\x3e\xe9\x13\xb7\xf1\x08\xfe\xbb\xa4\xbe\x4f\x77\xce\x9f\xb6\xde\xc6\xdb\x45\x78\x3b\x16\x1e\x0d\x6b\x16\xaf\x3d\x6f\xb3\x14\x2c\xbf\x92\xed\xb6\xac\x76\x24\x78\x6c\x97\xb9\x40\xdd\x4c\x7d\x5c\x7a\x6e\x6c\xd4\xb7\xe3\x9e\x99\x7a\xe2\x36\x47\x83\xea\x21\x75\x94\xab\x07\xa5\x31\x42\xeb\x61\x30\xbb\x37\x6b\x10\x91\x1e\x06\x8b\x8d\x66\x0b\x09\x44\xdb\x52\x40\xf5\xbe\x58\xcc\x86\x45\x37\x6c\x62\x7e\x23\x54\x8f\xb1\xea\xd4\xb5\x4c\x76\xee\x35\xd4\xe2\xc0\x22\x0c\x1a\xf5\x87\xd3\xac\x1a\x28\xc4\x56\x8c\x7a\xa1\x6a\x97\x9c\x85\x10\xd3\x34\xb7\x32\x15\x5c\x62\x78\x9d\x60\xb4\xa7\x34\x26\xd2\x8a\x18\x2d\xcf\x54\x93\x99\xd8\xd0\xd8\x29\x83\x20\x3b\xd4\x80\xc1\xe9\xf0\x66\x31\x42\xba\x0c\x28\x2c\xe3\x02\x31\xba\x22\x80\xb2\x62\x97\x6d\x93\x86\x1c\xdc\x75\xda\xfc\x8b\xe3\x38\x0e\x06\x50\x99\xf4\x05\xa9\xea\x81\x3f\x87\x9a\x59\x8c\xa6\x43\xc1\xf7\x1e\x56\xd7\xb3\x79\x7c\xcc\x49\xf4\x7b\x0f\x8e\x74\xcb\x7c\xc0\xbb\x7a\x92\x3b\x88\x14\x00\x82\xd7\x92\x62\x7b\x42\x17\xcf\xbe\x47\xea\xe6\x80\x38\x6e\xc8\x58\x30\x65\xbb\xc1\x0e\x0d\x10\xbd\x5d\x3c\x7c\x46\x66\xa6\xc2\xb9\x03\x9e\x92\x8a\x45\xf5\x0c\xa5\xc8\x13\xb8\xc3\xfb\xc0\xa6\x98\x53\x97\x72\xc7\x53\xc0\x49\x19\xe7\xe5\xc8\x2b\xa6\x2e\xe4\xc3\x03\x84\x5f\x01\xae\xeb\x49\x9e\x3b\x81\xe7\xed\xc5\xf0\xdb\xe2\x55\xc1\x13\x42\x8a\x48\xd9\x20\xfb\xdf\x86\xb1\x74\x95\x5a\x71\x78\x4d\xa4\x61\xc9\x45\x1c\x27\x04\x6d\x84\xd1\xe1\x18\x34\x23\xf0\x81\xd2\xe9\x65\x9e\x70\x97\x29\xc7\x45\x65\x85\xf9\xc8\x66\x8c\xb6\x45\x75\x0f\x72\x1b\x60\x25\xd8\x7d\x43\x28\x1a\x77\xed\x60\x4d\xd5\x4d\x20\x14\xd8\xef\x05\x19\x69\xc5\xc3\xfe\x06\x06\x7f\x73\x44\xc7\xd8\xde\x97\x41\x6e\xa2\xa4\x32\x63\x2c\xe6\x43\x57\xf1\xc2\xf9\xc9\xfd\xa9\xe3\x3c\x59\xb1\xad\xd2\x7d\x5b\xb1\xab\x80\x13\x0f\xcf\x5a\xae\xfa\xcd\x92\x80\x4f\x55\xf9\xe4\x10\x07\xe9\xce\x8b\x5c\xf4\x77\x62\x9c\xc4\xd3\x26\x1d\x26\xf9\x6d\xe4\x48\x07\x52\xc2\xac\xc9\x8c\x8c\xbb\x6e\x7c\xe8\x6d\x90\x79\xea\x67\xd3\x5c\x85\xe9\x7d\x93\xf1\x52\x37\x49\xf3\x50\xf3\x48\x11\x74\xff\xa2\xc6\xc9\x58\x1a\x05\x44\xbe\xc3\x6d\xf4\xb5\x23\x27\x97\xcd\x26\x3d\xd0\xc6\x28\xc0\xbe\xcd\xda\x8d\x97\x2c\x9b\x34\x2a\x20\x27\xf5\x62\x97\xd6\xdb\x2a\x3b\x10\xeb\x79\x1c\x5a\x6f\xad\x1d\xa2\x27\x12\x80\x80\x87\xf7\x03\x81\xc5\x68\x4a\x63\xeb\x75\x81\xa0\x61\x20\x6b\x8a\x76\x65\x5a\xaa\x3d\xba\x21\x0f\xe4\xf0\xb5\xe5\x4d\x25\x3a\xb5\x38\x56\xc5\xe3\x46\x0e\xca\x26\xee\x40\x13\x4b\x11\xbc\xbd\x6e\xcb\x6a\x2f\xc7\x09\x50\xaa\xba\xc5\x5d\xe7\x46\xd0\xd7\xb5\x5d\x65\xbe\x6c\xc2\x08\x9d\x80\xbe\x0c\xc9\x3d\x52\x17\x65\xb4\x89\x75\x87\x06\x18\xba\x6e\x93\xe2\x2e\x4f\x8f\x83\x67\x7e\xaf\x51\xae\xca\x26\x69\xd2\x0f\x1b\x4f\x61\xf2\x7d\xf4\x12\xf9\xf0\xeb\x45\x6a\xb3\x0b\x8b\xb0\x7a\x48\x38\x49\x07\x78\x7a\x4b\x47\x2b\xc9\x71\xaf\x39\x8b\xcd\x52\xa5\xbe\x39\xc5\x8d\x9a\xf7\x42\xc5\x86\xbf\xf6\x76\xe9\x1d\x2e\x2b\xa0\xa0\xf9\x71\x0f\x36\xb4\x12\x79\x0a\xdd\x24\x1a\xa5\x06\x0c\xd1\x8e\x8d\x81\xaf\x80\x8a\x21\xb8\x32\x28\x97\x63\x5b\x38\x4a\x92\x20\x50\x43\xca\xe8\xae\x8e\x73\x87\xb5\x18\x39\x20\x1d\xce\xc7\x41\xe9\xa4\x29\xbd\x44\xce\xe6\x33\x42\x22\x57\x2f\x86\x98\x68\x6e\x39\xeb\x9e\xb1\x4c\xa7\x59\xb2\xe1\x6c\x04\x49\xe3\x8d\x87\xc4\x14\xb2\xe6\xce\xf2\x8d\x70\xce\x03\x5f\x99\xef\x3f\x5d\x2f\xd6\xd8\x96\xae\xb9\x18\xaa\xbb\x8e\x27\x44\x71\x3b\x79\x47\xa1\xc8\x07\x01\x9c\x4c\x7b\x89\x61\x43\x3f\x26\xa0\x3a\xe9\x11\x3c\x62\x1c\x54\x78\x46\xef\x20\xda\x3d\xc3\x65\x74\xe5\xa5\x65\x9b\x67\x87\xcb\x2a\xdd\x36\x1f\xfc\xc3\xf3\x1c\xfc\x7b\x41\x8a\x16\x87\xa4\xb9\xa7\x2b\xfe\x21\xf2\x66\x17\x80\x6f\x77\x52\x72\x9f\x1c\xa9\x4f\x89\xa4\x1c\xe4\x48\xb8\x48\x1a\x8f\x8a\xe6\xf8\x90\xa6\xdf\x47\xf1\x68\xa5\xc6\x43\x4a\x4f\xf4\xfa\x62\x98\x15\x20\xa2\x81\x2d\x30\x7a\x8b\x03\x01\x33\xcc\xbb\x6f\x6a\xac\x3f\x8d\x3a\x51\x7d\x76\x9a\x1e\x39\x7e\xb0\x8b\x93\x30\x34\xf6\x7a\x7c\x2e\xe8\xe8\x2d\x7a\x62\x30\x44\xeb\x45\x38\x35\xbc\xfe\x4b\x2d\x05\xbd\xe6\xd8\x05\xda\x34\x68\xf0\x69\xbc\x4d\x35\xf7\x9e\x59\xb7\x23\xa9\xf8\xc9\x2b\xf1\x29\x93\x91\x6e\xb2\x60\x30\xd6\x7a\x26\xf9\x0d\x83\xbf\x5c\x4b\x89\xf1\x51\x21\xd3\x76\x98\xb2\xec\x3d\x95\x6b\x69\x24\x79\x96\x6f\x60\x15\x4d\x1f\xa1\x70\xcd\x77\x37\x27\xcc\x95\x42\x92\x22\x7e\x4f\x86\x22\x3b\x76\xaf\x80\x63\xf7\x6a\x94\xd4\x3f\xc8\x04\x3c\x25\x93\x1f\x6e\x87\xac\xab\x06\x4b\xbe\xa9\x53\x44\x99\xd6\x22\x2b\x60\x30\x5a\x83\xc0\x4b\x4f\x43\x6b\xb8\x63\x2e\x2e\x16\x40\x19\x79\xf4\x37\xcd\x10\x6c\x07\x63\x4b\x26\x3f\xe0\xae\xf5\x9d\x76\x47\x52\xbb\x71\x45\x8a\x94\xe0\x54\x78\x09\x6e\xb2\x3d\x49\x4c\xb8\x00\x11\xa2\x2c\xc2\x77\x74\xcd\x48\xbf\x8c\x07\x58\xc7\xf0\x10\x5b\x53\x6e\x66\x6e\xbc\xd2\x35\x06\xca\x9e\x09\x20\xb2\xa2\xbb\x77\x10\x68\xe3\x67\xb0\x7d\xa8\xaa\xb4\xe5\x79\xfa\xe6\x6a\x3a\xc5\x7e\x0a\xec\xa5\xd4\xd0\x1a\xc9\xc7\xd4\x35\xa7\x92\xac\xa1\xf1\x2e\x29\xee\xd2\x6a\xb1\x36\xa3\x5e\x93\xef\x30\x10\xb3\x15\xba\xb0\xb9\xa8\xda\xed\x58\x68\x4f\xcd\x42\x3f\x36\x99\x87\x60\xdc\x50\xa0\x8a\x24\xdc\x58\xc8\x47\xa7\xeb\x44\xe2\x95\x52\x99\x12\xe2\x63\x0d\xf5\x23\x72\x44\x09\xf0\x05\x56\x31\xf5\xfa\x7b\x7d\x9f\x1c\xd2\x9f\xb7\x59\xb5\xcd\xd3\x3f\x4c\x63\x10\x6b\x0e\x64\xc2\x30\x93\xaa\x9c\x0d\xc3\x38\xb4\x5d\xd9\x2c\xec\x87\x07\x6a\xf7\x91\x4b\x48\x82\x3d\xed\x10\xd5\xbd\x30\xe7\x59\xf9\x6c\xc6\xd7\x6f\x86\xa4\xd8\x25\xd5\xce\x66\x94\x4a\x1b\x3e\x56\x1a\x0a\x5b\x3f\x56\x75\xe7\xcd\x79\xfc\x6c\x9b\xb1\xf2\x9d\x67\x3f\x52\xa9\xc5\xd1\x7c\x5b\xd5\x6e\x71\xf9\xc6\x2a\xf4\x49\xc4\x02\x2a\xc1\x97\xb7\x24\xee\x3f\x93\x08\xc4\x5d\x7f\x53\xee\xbe\x2a\x6f\x3f\x3f\xfd\x24\x3c\x78\x72\x8b\x38\x4c\x61\x86\x9c\x19\xc0\x0a\x8e\xcb\x18\x20\xd7\x08\x89\xf9\xd8\x6e\x6d\x67\x41\x1f\xa7\xda\xff\xfa\xf4\x31\x12\xc9\x1c\xec\x13\x99\x64\xbe\xa0\x89\xa0\xb0\x89\x4a\xaf\xd5\x43\x7b\x47\x39\xa4\x40\x32\x1b\x73\xda\x6b\xa2\xf6\x46\xee\xce\x52\x42\xcd\x25\xce\x1c\xa8\x35\xde\x30\xf3\xd3\x35\x35\xb1\x34\x56\x61\x28\x64\x0f\xe0\x61\x3c\x23\x18\xe0\x73\xec\xd3\x60\xff\x83\xcc\x0d\xad\x6e\x66\x38\x68\x13\x1b\x1e\x80\x36\x1c\xde\x90\x22\xc2\x6c\x67\xa4\x65\x8a\xb6\x4d\x46\xcc\xc8\x86\x61\x30\xeb\x5b\x6c\xc5\x84\x08\xe5\xd8\xbb\xa7\x56\xec\x92\x73\xf0\x2b\x37\xd1\xc1\x2b\xee\x80\x58\xc1\xae\xb9\xea\xd6\x02\xc2\x29\x0f\xe2\x24\x6c\xac\x50\xb3\xb1\xe0\x1b\x9f\xf5\x8c\x15\x59\x11\x9f\x77\xa4\xb2\x01\xcd\xe1\x2f\xbc\x83\x0e\x09\xdf\x5a\x26\x01\x81\x64\xfb\xbb\xa3\x10\x41\xdd\xd4\x5c\x84\xd5\x65\x3d\xc6\xe5\x2b\x20\xcb\xa8\x02\x14\x0e\x09\x39\x3b\x64\xe0\x55\xf9\x24\x25\x0b\x46\x8c\x94\x27\xf5\x84\x9c\x65\x47\xd9\xd4\x49\x5d\x96\x53\xc0\x0f\x1e\x95\x3a\x3b\x79\x7a\xd4\x31\x5a\xe9\xcf\xba\x8f\x0e\xb9\x6e\xe1\x67\xdc\xc2\xa7\x74\x36\xf7\xc9\xc2\x5e\x4c\x9c\x06\x3f\x08\x95\xc8\xf7\xe2\x99\x45\x52\x43\x3c\x95\xd5\x6e\x71\x53\xa5\xc9\x97\x4b\xf2\xe7\xa2\xfd\xc0\x53\x79\x89\x47\x45\x08\xb6\x22\xcc\x40\x00\xe9\x31\x54\xb7\xab\x37\x75\x16\xdc\x68\x40\x8e\x8f\x3c\x1e\x92\xe5\x89\x2b\xdc\x31\x36\xe8\x15\x43\x99\xec\xb7\xbf\x7c\x49\xbf\xde\x56\xc9\x3e\xad\x9d\xfa\x90\x15\x47\x6f\x76\x54\x1e\x2b\xe9\x53\x65\x53\xaa\x25\x61\x4c\xcb\xbe\xfd\xcb\xbf\xfe\xf9\x4f\x4e\x5d\x3e\x54\xdb\xf4\xef\xc9\xe1\x90\x15\x77\xff\xfb\x7f\xfe\xf6\x73\x3b\x95\x87\xcc\xdd\x67\x85\xbb\xad\x6b\x77\x9f\x1c\x9c\x3f\xff\xeb\xff\x17\x00\x00\xff\xff\x22\x8e\x6f\x0a\xa7\xbf\x08\x00") - -func bindataTkgWebDistTkgkickstartuiClruiMinCssBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiClruiMinCss, - "tkg/web/dist/tkg-kickstart-ui/clr-ui.min.css", - ) -} - -func bindataTkgWebDistTkgkickstartuiClruiMinCss() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiClruiMinCssBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/clr-ui.min.css", - size: 573351, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiDocker05653a44fa77774eac36Svg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x4b\x8f\x1c\x47\x72\xbe\xeb\x57\x24\x7a\x2f\xf6\x81\xc1\x8c\x77\x86\xa1\x11\x20\x17\x64\xf0\xd0\x86\x0d\x18\x3b\x07\xde\x08\x71\x96\x24\xcc\xa5\x08\x92\x22\x77\xff\xbd\x11\x91\xf5\xe8\x19\x72\x6d\x88\xdb\x02\x0c\x2c\x01\x41\x9c\xaf\xa3\xaa\xbe\xcc\xc8\xc8\x78\x64\x45\x7d\xff\xfe\xe3\x8b\xf6\xe9\xd5\xf3\x0f\x2f\x6f\x4e\xd6\x4f\xed\xe5\xdd\xab\x17\x2f\x3f\xcc\xbf\x3f\xbe\xba\xfb\xf4\xaf\xbf\xfc\xe5\xe6\xd4\x5b\x6f\x96\xff\x9d\xda\x9f\x5e\xbd\x7e\x7d\x73\x7a\xf3\xcb\x9b\xbb\x53\xfb\xcb\x9f\x5f\xbf\x79\x7f\x73\x7a\xf9\xe1\xc3\xdb\x7f\x79\xfc\xf8\xd3\xa7\x4f\xf0\x89\xe1\x97\x77\x2f\x1e\x53\xef\xfd\xf1\xfb\x8f\x2f\x4e\x3f\x7c\xf7\xfd\x8b\xf6\xf3\xeb\x57\x6f\x1f\xbd\x7d\x96\x0c\xbf\xbe\x7b\xfd\x4f\x7f\x48\xdc\xff\x39\x65\xf9\x63\x3d\xf1\xd1\xbb\x5f\x5f\xdf\xdd\x9c\xee\x3e\xde\xbd\xf9\xe5\xf9\xf3\xd3\xbc\xe5\xc1\x6f\xcf\x6f\x4e\xff\x8e\x04\x9d\x58\x1a\x0d\x10\xf3\xf1\x04\x07\x10\x0e\xbe\x25\x82\xc1\x86\x4f\x56\xf9\xed\x2a\x7f\xba\x8d\xf7\x0f\x62\x3f\xca\x4f\xfd\xf4\xf8\x6b\x48\x05\xbc\x13\xc7\x41\xda\x61\x84\xd3\x4e\xba\xca\xcf\x0f\xae\xbb\x0e\x39\x06\xb0\x88\xef\xe4\xa4\xa0\x1c\x07\xf9\x2a\xbf\xee\x8c\xc9\xc0\x4c\xc7\x4e\xca\x04\xc3\xba\xec\xa4\xab\xfc\xba\xa4\xcc\x10\xc3\x0e\x52\xe9\x80\x03\x7d\x27\x5d\xe5\xd7\x25\xdd\x0d\x0a\xc1\x7b\xc4\x6e\x50\x68\xd0\x7d\x5c\x18\xd4\x94\x5f\x79\x4d\x57\xd2\x6d\x4d\x77\xd2\x6d\x4d\xaf\x49\xba\xaf\xe9\x4a\xba\xad\xe9\x46\xba\xaf\xe9\xef\x41\x8a\x02\xa1\x78\x90\x06\x30\x75\xde\x39\x57\xf1\x75\x38\x75\x80\x31\x59\x23\x01\x75\x19\x8b\x3a\xb0\x61\x23\x06\xc7\x68\x2a\xd0\xa9\x7b\x42\x56\xd6\xa6\x08\x1a\x18\x79\x75\xef\x3e\x16\x45\x10\x43\x4b\x35\xe9\x18\xd2\xb4\x03\x21\x7b\xc3\x00\x95\xb0\x26\x0e\xc1\xa8\x0d\x1d\xdc\x91\xcf\xe2\xd0\x87\x45\x62\xea\xa2\x67\x31\x50\x62\x6e\x38\xa0\xab\xc4\x22\x0a\x82\x29\x0f\x70\x16\x6f\x92\x53\xed\xb5\x0c\xe1\x34\x9a\x28\x20\xda\x4e\x2f\x0a\x24\x1a\x8d\x14\xc8\x90\x52\x6c\x83\xb0\xa5\xa6\xbc\x5b\xdb\x1e\x4f\x0e\x16\x54\xd7\x0f\x2f\x97\x83\xc1\xa3\x09\xc3\x70\x19\x8d\x02\xd0\x30\x9a\x20\xa0\xf3\xc4\xd8\xe5\xdc\x21\xba\xab\xc8\xf6\xc3\xd2\x01\x03\xc5\xbd\x31\x03\x1b\x71\x43\x10\x74\xb7\x26\x01\x4a\x9d\x1a\xf5\x9a\xc7\x86\x17\x66\x18\x91\x03\x5b\xe5\x39\x60\x4b\x5e\x0a\xf7\xd4\x96\x98\x6a\xe3\x0e\x24\x82\x8b\x12\xa0\x0f\x29\xec\xc4\x4d\x0d\xbc\xf7\xc2\xaa\x88\x4d\x07\x04\x32\xe5\xf4\xc8\x95\x97\xc4\x66\x51\xb8\xb3\x35\x0d\x10\x37\x49\x75\xa0\xa0\x3f\xc4\xe7\x07\x6b\xfd\x45\x03\xfa\xf3\xb3\xf7\xff\xdd\x5e\x3d\xbf\x39\xe5\x1f\xfd\xd4\xf2\x9f\x47\x1f\xfe\xfa\xf6\xee\xe6\xf4\xec\xf5\xdb\x97\xcf\xe6\x2f\x7f\x7c\xf3\xea\xc3\xfb\x9b\xd3\xaf\xef\xef\xde\xfd\xd7\xdb\x67\x3f\xdf\xfd\xc7\x9b\x3f\xbe\xcf\x10\x77\x73\xd2\x53\xfb\xeb\xcd\x49\xf0\xb4\x85\x49\xba\x08\x93\xb1\x87\xb1\xda\xd8\x0a\x3e\x72\x91\x11\x86\x30\x2f\x88\x80\xd1\x31\xd5\x23\xec\xcd\x80\x84\xd1\x13\x9a\xb9\x35\x05\xea\x41\x5c\x98\xd0\x96\x01\xa6\x1a\x94\x8b\x2c\xa1\x9a\xbb\xc6\xc3\x2c\x6d\x34\x30\x38\x67\x19\x18\xa3\xc9\x80\x41\xe4\x0b\x31\x74\x47\x4c\x9c\xdb\x29\x6d\xce\xb1\x73\xde\x6f\x1c\xd2\x1e\x0c\x67\xd7\xce\xa7\x97\xaf\x3e\xdc\x95\x6e\x1e\xe7\xd4\x2b\x48\xe7\x1f\x6b\x7c\x2e\x3d\x55\x7c\xbe\xa7\x3a\xfc\xed\xaa\x7b\xc4\x54\xca\x7b\x84\xb2\x6b\x0f\xd1\x0e\xf5\x25\xb8\x54\xe0\x23\x46\x60\x8e\xd1\xb0\x23\x20\xea\x79\x30\xa8\x28\x7f\x86\x1f\x21\x83\x5b\xe8\x79\xbf\xe3\xf3\x5f\xd6\x7b\x7e\xcb\xb4\xf1\xeb\xd2\x12\x02\x0e\x56\x6d\xda\x9f\x90\x83\xb3\xc6\x2d\x07\x74\x72\x7d\xb2\x8a\xce\xc7\x25\x5f\x1a\xcf\x8b\xed\x7f\xbf\x3d\x96\x28\x90\xa3\x35\xe9\x30\x14\x17\x64\xe8\xd6\xa3\x09\x01\x22\x79\xc3\x0e\x12\x63\x24\x1e\x84\xdc\x1c\x7c\x20\xf3\x86\x17\x03\xe9\xc2\xb8\xcb\x15\xba\x77\xd5\xc4\xc6\xb9\x71\x61\x74\xd4\x92\x53\x28\x2f\x02\xd6\xb5\xd7\x86\x37\xb1\xf6\xbf\xc2\x45\x6b\x73\x4a\x79\x25\x19\xd1\x0c\x2c\x64\xda\x7b\xa8\xca\x31\x98\x89\x17\xec\x19\x7a\xc6\x2e\x47\x06\x11\x2c\x39\x8e\x88\xb4\xe7\x91\xbe\x7b\xdf\x5e\x0a\x46\x6c\x89\x15\x9d\x53\x2e\x92\xf6\x9f\xdb\x0e\x0b\x5f\xe8\xe6\x70\x0e\xcc\x8e\x0b\x7e\x75\xec\x56\xf5\x7c\x24\xa2\xe1\x42\x3d\xf5\x44\x1b\xae\xb0\x81\x32\x1a\x07\x10\xb3\x1f\x78\x00\x8a\xe2\xb2\x63\x87\xae\xa6\x6d\xbb\x9f\x2d\x1d\x75\x85\x89\x7c\xfc\x0a\x17\x1c\x20\xae\x72\x88\x1d\x34\x46\xec\xb7\xef\x78\x7d\xfc\x8e\x57\xfa\xed\xfe\x6d\x78\xf7\x47\xff\x05\x4b\xfc\x1a\x7d\x0c\x45\xc9\x11\x69\xa0\x2c\x17\x58\xb0\x6b\x32\x86\x74\x4f\x4c\x9a\xd9\x5d\x4f\x9f\x55\x72\x54\xa6\xbc\x3e\xd0\xe7\x8c\x9c\xad\xe2\xa4\x98\x16\x26\xe1\x1a\xb1\x11\x6d\x38\x35\x12\x22\x17\xf2\x01\x22\x3c\xf9\x69\x8c\x03\x0f\x40\xed\x63\xb9\xc0\xee\x54\x1a\x99\xf7\x07\x90\x3b\x1e\xcf\x9f\x38\x17\x14\xc7\x2e\xcd\xe5\x19\x88\xfb\xdd\x17\x38\x9f\x7e\x4e\xec\x62\x89\xfb\xb0\xbc\x59\x43\xe7\x6a\xd3\xe0\xbc\x5c\x7b\xcc\xe5\xd1\x51\x8f\x13\x4c\xf2\x89\x8b\xac\xf3\x8e\xdb\x85\xf2\xa2\x8b\xb4\x07\xca\xbd\x0c\x6f\xda\x75\xf9\xea\xfc\x48\x4c\x3d\xa3\x89\x38\x5a\xe6\x47\x1a\xca\x99\x11\x45\xc6\x6a\x35\xe8\x88\x95\x30\x59\x66\x28\x2a\xc0\x3e\xe5\x89\x17\x65\x10\x42\x3a\xe4\x04\x22\x51\x19\x95\xbb\xf9\x97\x32\x2a\x1d\x21\xf5\x7c\x5d\xe5\xc3\x0a\x76\x8d\x09\xa9\x1e\x3f\x54\x2b\x65\x60\xd5\xf9\x78\xed\xd1\x94\x81\x84\xea\xf1\xaa\xa1\x39\x1c\xa4\x21\x1b\x5e\x54\x61\x54\x0a\xb4\xc9\x7d\x06\xbf\x7c\x3e\xf5\x4a\x31\x2e\xa7\x7b\xe8\xf0\x27\xff\x89\x7f\xfa\x4a\x2f\x90\x35\x89\x7a\x65\x41\xac\x5d\x32\x12\x2b\x69\x65\x4d\x84\xac\x49\x46\x48\x95\x35\x75\x1e\xf1\x79\xe4\x16\xe8\xca\x91\x58\x87\x53\xa3\x74\xb7\x56\xf2\x1e\xb3\x1c\xe9\x2e\x94\xd9\x26\x0a\x46\x66\x5d\x21\x56\x91\x7d\xd0\x28\x07\xcb\x4e\xb5\xaf\x89\xb0\xf2\xae\xe8\xb9\xbb\x04\x8c\xdc\xce\x99\xc5\x52\xe6\x7d\x99\xad\x45\x25\xb5\xae\x13\x0e\x9e\x3a\xa7\x51\x3a\x1d\x16\xbc\xae\x81\x1c\x6b\x50\x4b\x84\xf7\xd7\x28\x74\x5d\xc2\x31\x97\x98\x8e\x15\x2e\x0b\x18\xab\x05\x8c\x36\x2d\x44\x56\x0b\x89\xd5\x82\x76\xbc\x4c\x0b\xa3\x43\x5e\x16\x28\x87\x05\xd6\x92\x8d\x75\xc9\x7c\x29\xbc\xae\x20\xf9\x14\x8f\x15\x67\x92\x98\x4e\xae\xcb\xc4\x32\xce\x5a\xd5\xc5\xc8\x24\xb1\x2b\x72\x26\x89\x23\xa8\x92\xc6\xd0\x91\xec\x51\x06\x92\x9e\x27\xed\x91\xc0\x62\x70\xe5\xa8\x58\x09\xbf\x67\x50\x9a\x70\xd1\xca\x54\xc7\x85\x54\xba\xae\x52\xc2\x2a\x0f\xdc\x68\xe2\x4a\xf6\x7b\x54\xf4\xa4\xfc\x51\x81\xa2\x16\x59\x7c\xb4\x07\x36\xf3\xcd\x10\xbf\x19\xe2\xff\x33\x43\x14\x0c\x5d\x7e\xfc\xca\x3c\x80\x01\x29\xaa\x16\xb1\xc1\xbc\x04\x50\x48\xe6\x7e\x59\xa8\x0a\x37\x03\x35\x0f\xce\x7a\x71\x48\xd6\x24\xe9\xa5\x47\x54\xaa\xa8\x59\xc8\xc2\xe0\x4c\xec\x13\x47\xba\x7d\xe8\xdc\xa9\xe4\x4e\x9a\x89\x29\x91\x73\xe5\x92\xae\x26\x8b\x65\x19\x6d\x96\xcf\x73\x64\x6b\xc9\x67\xe4\xc9\xc7\x63\x58\x43\x02\xb1\xac\x4c\x07\x08\x75\x59\x90\xc0\x46\x2f\xc3\x56\xcc\xfa\x9d\x20\x7a\xe6\x9e\x03\x34\xa2\x72\xcd\xcb\xf1\x5f\x67\x77\x3e\x1c\xc4\x1c\x24\xef\x83\x9c\x93\xa0\x75\x12\x3a\x27\xb9\x4e\x3a\x27\xa9\x40\xa3\x8a\xef\x2c\x6d\xb2\x78\x00\x16\xe9\x5a\xd8\x45\x5a\xae\x32\x49\xd5\x97\x3e\x28\x16\x87\x1e\x94\x4a\x50\xc0\x0c\xe9\x01\x1c\x81\x36\x77\x6f\xd7\x87\x4a\xf9\x07\x9b\xe4\xdf\x63\xde\x02\x2a\x14\x35\x28\x4d\x3f\xd8\x81\xd1\xdc\x29\x53\x37\x13\x91\xd6\xa1\x77\x16\x25\x8a\xc6\x04\x3d\xd4\x5a\x07\x74\x1d\x9d\x72\x83\xab\x0d\x79\xd2\xb3\x6c\x51\xf7\xa5\x67\x11\xeb\xdd\xf2\x52\x1c\xad\x43\xa0\xe6\x26\xe6\xac\x88\xba\x34\x01\x14\x4f\xe3\x26\xe0\x21\xb6\x08\x74\xce\x02\x27\xb1\x1a\x36\x4e\x87\x41\x55\xe5\x55\x81\x55\x55\x5a\x6e\x8e\xbd\x4a\x23\x23\xaf\x42\xaa\x3b\x36\x01\xd1\xe0\x3a\x77\x90\x9e\xf5\xd4\xfd\xc9\x5c\xc7\x0c\x1c\xc4\xcc\x67\x25\x89\x03\x17\x03\x26\x45\x4a\xec\x51\xab\x8e\xa2\x35\xe4\x59\x29\xe6\x0c\x75\x9f\xe1\x54\x01\x1e\x2a\x28\x15\x59\x1c\x2a\x4a\xd5\xa5\xef\x5d\x75\x49\x20\x69\x36\x0b\x41\x18\x6a\xb9\xb8\xde\xd3\xa9\x01\x91\xce\x7c\xde\xcc\xb0\x3d\x18\xd6\x3f\xe6\x5c\xff\x2e\xc7\x1e\x90\xd9\xbf\x04\x88\xba\x65\x85\x49\x82\xb2\xe1\xac\xb1\xbb\x64\xc2\x10\x80\x9e\x25\x4c\xf9\xd1\x3d\x0c\x4c\x37\x4b\x87\x9b\x2d\x37\xec\x97\x6e\x58\x8c\xf4\xc2\x79\xe4\x66\xde\xf7\xf2\xdc\xeb\xfb\x56\x2f\x57\xb0\x06\x81\x74\x05\x59\x15\x8f\x19\x44\x46\x98\xa6\xab\xf1\x0a\x74\x97\x07\x0c\xa4\xfb\x01\xc3\x00\xcc\xb2\x6d\x97\x67\x6d\xa8\x73\x23\x84\xa8\xb6\x31\x3d\x4e\x42\xd2\xb1\x20\x82\xb2\x62\xd2\x87\xce\xf3\x34\x91\x75\x74\x34\xaa\xd8\xef\x35\xd9\x1c\x2d\x4b\x16\xf7\x9d\x59\x26\xa6\x28\xb9\xb2\xaf\xf8\xf3\x64\x6a\x26\x5b\x7e\x24\x5b\x0f\x93\xb1\x4a\xd6\xfc\x32\x59\xbb\x9f\xcc\xdd\x4b\xf6\xec\x41\x60\xd7\x1c\xcf\xe0\x79\x96\x2b\x54\x47\xb9\xa3\x13\x1f\x4b\x77\x6f\x65\xaf\x14\x0c\xbe\x59\xcb\x37\x6b\xf9\x0d\x7e\xf4\xfe\x01\x60\xae\x08\x77\xdf\x35\x5e\x2b\x16\xb6\xaf\xd8\x4c\x05\x68\x5f\xd1\x99\x2a\xd8\x9a\x2a\x94\xe3\x1d\xaa\x17\x99\x44\xe6\x8c\x78\x91\x69\x64\x4e\x69\x7b\x4e\x39\x73\xce\x3d\xe5\x9c\x29\xa9\x5d\xa4\xa4\xd6\x1d\x67\x8a\x8a\x9a\x29\xab\xba\x62\x2d\xb8\x7a\x50\x85\x51\x9e\xc7\x93\x95\x13\x54\x98\x9d\xf4\x6b\x98\x25\xa3\x39\xfa\x8c\xc2\x0f\x8f\x52\x2b\x88\x67\x26\xbc\x06\xf1\x0a\xf2\x81\x7b\x90\xaf\xb0\x31\x64\x0f\x1b\x15\x55\x7c\x6c\x51\xa5\x62\xce\x3c\xb9\xcd\x98\x53\xbe\x3f\xf6\x88\xe4\x30\xbc\x47\x8d\x95\x10\xdb\x00\xee\xa6\x73\xe8\xa3\x70\x9a\xee\xd8\x6d\x37\x4d\xdb\x3a\x5d\x98\x36\xa2\xa2\xfe\xad\x93\xda\x6f\xab\xff\x6d\xf5\xeb\x20\xbd\xdb\xf8\xf1\xdf\xbe\xf2\x18\xb2\x0e\x10\xb0\x91\x03\x0b\xea\x13\x03\x0e\x1c\x72\x9b\xb5\xb7\x11\x3f\x59\xe5\xb7\xab\xfc\x82\x94\xbe\xfe\xf4\xde\x41\x71\xf0\x41\x3a\xa0\x0f\x24\xdc\x49\x57\xf9\x75\x49\x03\xa8\xbb\xdb\x4e\x1a\xe0\xde\x07\xef\xa4\xab\xfc\xba\xa4\x19\x59\x25\x62\x27\x45\xce\xea\x6b\xe7\x5c\xc5\x57\xe6\xcc\x2d\x15\x72\x70\xd6\x8e\xb5\x83\x74\xca\xaf\x4c\x6a\xf3\xe0\x7f\x27\xcd\x2c\x00\xe3\x20\x9d\xf2\xeb\x92\x52\x07\xf1\x7e\x68\xb7\x62\xf9\x61\xbb\xab\xf8\xca\x9c\x04\x68\xfd\xd0\x2e\x11\x38\xf1\xa1\xdd\x55\x7e\x65\x52\x86\x71\x69\x46\x24\x20\xc8\xc7\x86\x59\xe5\x57\x26\x75\xf0\x40\x3f\x48\x07\xb0\xea\x05\xe9\x94\x5f\x99\x34\x40\xc6\x05\x29\x77\xe8\x22\x17\xea\x9d\xf2\xeb\x92\x32\x02\x5e\xda\x11\x23\x38\xcb\xb1\x4d\x57\xf9\x95\x49\x15\x10\xf9\xe0\x54\x30\xb7\xc3\x78\xa7\xf8\xca\x94\x96\xc9\xe4\x85\x72\x1d\xb8\x9a\x8d\x36\xce\x29\xbf\x32\xe9\x00\xc9\x7a\x60\x27\x0d\xe8\xaa\x17\xca\x9d\xf2\xdf\xc9\x07\x76\xd0\xc1\xb2\xfb\xc0\xb5\x3f\xe8\xf0\x81\x53\x7e\x65\x1f\xb8\x91\xae\x3e\x70\x27\xdd\x7c\xe0\x35\x49\x77\x1f\xb8\x92\xae\x3e\x70\xe3\xdc\x7d\xe0\x55\x39\x37\x1f\xb8\x71\xae\x3e\x70\x27\xdd\x7c\xe0\x55\x49\x37\x1f\xb8\x91\xae\x3e\x70\x27\xdd\x7c\xe0\x55\x49\x37\x1f\xb8\x91\xae\x3e\x70\x27\xdd\x7c\xe0\x55\x49\x37\x1f\xb8\x92\x6e\x3e\x70\x27\xdd\x7c\xe0\x35\x49\x77\x1f\xb8\x91\xae\x3e\x70\x23\xdd\x7d\xe0\xef\x31\x53\x64\x18\xa4\x7e\xcc\xb4\x67\x2e\x6c\xfb\x4c\x57\xf9\x75\xd7\x74\x23\xdd\xd7\x74\x23\x5d\xd7\xf4\xaa\xa4\x9b\x7a\xf7\x99\x6e\xea\x5d\x49\x37\xf5\x5e\x95\x74\xcf\x3e\x37\x87\x34\xb3\xcf\xdd\x1f\x6d\xd9\xe7\xff\xb5\xa4\x5b\xbf\x42\x16\x68\xa4\xc0\x23\xe6\x4b\xb8\x7a\xa9\xa7\xa0\x8c\xa3\xe9\x98\x9d\x8b\xa4\x60\x59\xb5\x24\x46\xd3\xc4\x2e\xa8\x79\x3d\x05\x15\x8c\x14\x92\x17\x18\xf9\x63\x42\xf4\xba\x36\xc8\xb8\x7a\x45\x07\x56\xc8\x50\x41\x6b\x6a\x80\xca\xdc\x68\x80\x2a\x55\xf3\x81\x86\xd5\x89\x3e\xf6\x8e\x8b\x32\xb0\xf1\x3c\xa9\x65\x96\xa6\x04\x24\x59\xd4\x04\x18\x77\x6e\xda\x41\x1d\xb5\xe4\xa1\x31\x5f\xe2\x49\xac\x78\xbe\xc5\x5b\xa5\xbc\xbe\xc3\x1b\x53\x3a\x62\x9c\x25\x60\x04\x4e\xc8\x9e\xd0\xc5\x4a\x1c\xa2\xb6\x88\xc0\xa0\x3e\xdf\x0a\xf4\x4e\x8d\x05\xba\xe1\x3c\x00\x32\xf5\xd9\x3d\x32\x62\xc3\x0b\xe6\xca\xc7\x21\x37\x10\xc1\x2c\x0b\x53\x33\x98\x25\xaa\xe2\xf0\x7a\x97\xab\xa2\x0b\x01\x47\x1f\xf5\x86\x43\xa9\x7b\x43\x30\x67\xc3\xc6\x06\x24\x41\x0d\x81\xab\x2f\x84\xb3\x8a\x14\x5c\x10\xb0\x0b\x61\x63\x02\xce\xfc\x02\xa1\x3b\x99\x35\xee\xb3\xa3\x07\x81\x3a\xd2\xd8\x66\xf7\x24\xeb\x68\x43\xb9\xad\xd9\x0b\x9e\x05\x81\xfb\x98\xd3\x0d\xc1\xdb\x39\x6d\x5a\xb2\x6a\xe5\x31\x75\xac\xd5\x30\x6b\x94\x4a\xcb\x59\x64\x41\x6c\x60\x8e\xb5\x44\x5d\x45\xcf\xe2\x80\x4c\x31\x3b\x64\x35\xce\x62\xe0\x36\x97\x94\x84\x63\x11\x83\x6e\x6c\x8d\xb2\xe0\x9c\x2f\x10\x0d\x05\xab\xa5\x54\xe7\xf1\x9d\x78\xd8\x7c\x25\x8d\xba\x88\x02\x63\x54\xc3\xee\x18\x3e\x5f\x38\xc6\xec\xd5\xf1\xc8\x9a\xdb\xc0\xa3\xfa\x8a\x68\xf4\xa8\x7e\x60\xb1\xd1\xd0\x21\x3a\xd7\x70\xa4\x5b\x8a\x51\xc4\x16\xc9\xc9\xd1\xda\xe9\x43\x3e\x5f\xf2\xae\xad\xe0\xb9\x61\xb4\xc3\xe0\xf9\xbe\x3c\x14\xe5\x9c\xd8\xb1\x0e\xf7\x4c\x46\xbd\x4f\x57\xc1\xf9\x8a\xd9\x46\x19\xa0\xb3\xd4\x0b\xf1\x91\x35\xa6\x5a\xda\x46\x8a\xd1\xea\x85\x34\xd2\x3c\x2a\x0c\x1d\xe3\xac\x69\xc6\xa3\xb6\x0e\x29\x56\xbb\xad\xf2\xa8\x17\xd4\x14\x54\x5b\x47\x71\x62\x66\xe6\xf6\x60\xeb\x3d\x9d\x9f\x42\xcc\xa3\xc3\xfa\xf8\xa0\xbe\x84\xd0\xf3\xfa\x6f\xb5\xee\xeb\xf6\x45\x84\x9d\xef\x5f\xfd\x74\x6d\xb6\xdf\x7f\x38\xcf\x66\x7b\xd9\xf0\xed\x7a\xfb\x79\xbf\xee\x21\x7e\xf8\xa0\xbd\x61\x7e\x3e\x68\xeb\x5d\x3f\x6e\x98\x78\xeb\x71\x7f\xba\x76\xde\xc7\x3e\x81\xd9\x79\xef\x1b\xf3\xda\x79\x1f\xb7\x07\xd3\x7a\xc3\xde\x25\xbf\xdd\xb0\x7d\x2f\xb0\xde\xb0\x33\xcc\x96\xf6\x83\x61\x76\xbc\xeb\xce\xb0\xca\x0f\x86\xed\x86\xf5\x09\xe7\xf5\x86\xcf\xf0\xfe\xb1\xc0\xfa\x80\xcf\x18\xab\xd9\x80\x62\xbf\x61\xc5\x6b\x73\xfd\x38\xef\x44\x13\xdf\xae\xf2\xa7\xeb\x87\x17\xc7\x90\xf7\x0f\x2f\xd6\x21\xaf\xf2\x63\xc8\x3a\xd2\x58\xeb\x00\x1a\xd3\xa9\x79\xee\xa4\xea\xa2\xc0\x9e\x4e\x4d\xd2\x01\x68\x3e\xcf\xd3\x31\x2b\xc2\x88\xd9\xd1\x45\xa4\x32\x9b\x3a\xb8\x92\xb8\x10\x2f\x27\xc9\x5d\xb5\x5a\xf3\xbc\xd7\x2b\xf8\x6e\x52\xcd\x8d\x44\x5c\x2d\xf5\xce\x42\xa9\x11\xe6\xdc\x62\x9a\x7e\xad\xb6\x98\x29\x73\xfa\x41\x47\x1e\xb9\xa7\x38\x50\x9a\x08\x54\x0b\x7b\x6a\x8c\x55\x13\xb3\x8e\xd9\xe0\x66\x56\x7e\x53\x02\xcb\xe9\x93\x58\x8a\xc7\x98\x3d\xe7\x32\x66\x47\xbb\xd2\xac\x8f\x44\xdd\xf3\x72\xb5\x59\xbb\x44\x60\x1d\xb2\xc5\x88\xf9\x45\x4e\xc6\x90\xdd\x6f\xa5\xba\x50\x77\xd3\x58\xd5\x76\xde\xd4\x3b\x5b\xf4\xe3\xbc\x9a\xd0\x86\xb7\xf5\xd9\x36\xd3\x71\xff\xf4\x8f\xe7\xf5\xdf\x7d\x73\x75\x20\x56\x31\x3b\xf7\x74\x58\x31\x3f\xd3\x09\x1a\xb4\x3c\xea\xe9\xda\x08\xc3\xab\x0d\x84\xbb\xb5\xfc\x49\x23\xcc\xe7\xcb\x45\xae\xb7\x8d\x44\x14\xe2\x15\x2f\x86\xeb\x92\x31\xca\x33\xd0\xb0\x81\x0a\x4b\x79\x76\x1b\xd5\xc6\x98\xd7\x11\x28\x1b\x4b\x4e\xb4\x47\x06\x60\x30\xab\x13\x4e\x03\xef\xe9\xd8\xf3\x7a\xcd\xf0\xb5\x87\x1c\xed\x0b\x4b\x86\xe5\x0c\x71\xd3\xa5\xce\x93\x57\xee\x5c\x51\xcf\x44\xab\x57\xc5\x19\xa9\x5a\xfe\xb2\x50\x4b\x6c\x64\x4d\x19\xac\x77\x4c\x6c\x8a\x94\x06\x15\xe6\x91\x18\xbd\xdb\xa2\x06\xee\xb3\x71\x46\x79\xf6\xdd\x10\x53\xaa\x81\xd3\xd7\x6a\x00\x75\xab\x6f\x26\xc4\x33\x48\x07\x90\xf5\xe9\xf1\x3d\x7d\x6c\xee\xd9\x5e\x72\xc2\x89\xab\x4b\x33\x93\x02\x67\xcb\xeb\xd5\x11\x67\x02\x31\x28\xe5\x15\x30\xd6\x40\xa1\x01\xde\x67\xfe\x21\x1e\x91\x97\x7b\x39\x59\x05\xc9\xc0\x93\xb8\xbe\xee\x29\xa7\xa9\x85\xc7\xcc\x31\xb8\xf7\x38\x5b\x87\x9e\xe1\x9a\x04\x86\x9a\x9e\xef\xef\xa6\x2f\xe6\x42\xd5\x1a\xfe\xfc\xee\x4f\xef\x7f\xf8\xee\xfb\x4c\xb9\xfe\x33\x73\xa3\x57\xcf\x6f\x4e\xf5\x29\xdd\xe9\x87\xef\xbe\x7f\x77\xf7\xf3\x87\xbf\xf5\x19\xdf\x67\xdd\xe6\xdb\x23\xf2\xef\xf5\xa9\x8f\xdf\x7f\x7c\xf1\xc3\x77\xff\x13\x00\x00\xff\xff\x4a\x9f\x98\x51\x0d\x38\x00\x00") - -func bindataTkgWebDistTkgkickstartuiDocker05653a44fa77774eac36SvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiDocker05653a44fa77774eac36Svg, - "tkg/web/dist/tkg-kickstart-ui/docker.05653a44fa77774eac36.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiDocker05653a44fa77774eac36Svg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiDocker05653a44fa77774eac36SvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/docker.05653a44fa77774eac36.svg", - size: 14349, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiFaviconIco = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x62\x60\x60\x64\x60\x64\x10\x10\x10\x60\x60\x64\x60\x61\xd0\x60\x64\x60\x10\x63\x60\x60\xd0\x60\x60\x60\x10\x60\x60\x60\x50\x60\x60\x00\x8b\xc3\x80\x30\x37\x04\x0b\x40\xf9\xef\xde\xbd\x63\xb8\x76\xf5\x2a\xc3\x99\x53\xa7\x18\x56\x2d\x5f\xce\x90\x91\x9c\xcc\x30\x75\xd2\x44\x86\xea\x8a\x72\x86\xdd\x3b\x77\x30\xf4\x75\x75\x31\x14\xe4\x64\x33\x3c\x7d\xf2\x84\x61\xe1\xbc\x79\x0c\x89\xb1\x31\x0c\xc1\x7e\xbe\x0c\x2d\x0d\xf5\x60\xfd\xdf\xee\x82\x41\x7e\x2e\x84\xbe\x76\x17\x17\x38\x3d\xd7\xfb\xec\xce\x1b\xbd\x77\x0d\x74\x03\x52\x98\x2f\xc8\x5e\x59\xc5\xd9\x00\xa2\x6f\xf3\x2d\x6f\xc8\xe1\xbe\x20\x7b\x4b\xd7\x40\xc1\x94\xe9\x81\xee\xad\xb9\x8e\x8c\x02\x8b\xb8\x62\x71\x19\x03\xb3\x07\x66\x6f\x03\x23\x03\x36\x90\xc7\xc0\xc0\x50\x02\xf5\x3e\x0c\x80\xd8\x69\x0c\x0c\x0c\xc1\x0c\x0c\x0c\x65\x20\x35\x0d\x8c\x3c\x0c\x80\x00\x00\x00\xff\xff\x38\x6f\x88\xca\x3e\x01\x00\x00") - -func bindataTkgWebDistTkgkickstartuiFaviconIcoBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiFaviconIco, - "tkg/web/dist/tkg-kickstart-ui/favicon.ico", - ) -} - -func bindataTkgWebDistTkgkickstartuiFaviconIco() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiFaviconIcoBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/favicon.ico", - size: 318, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6d\x73\xdc\x38\x92\xe6\xf7\xfe\x15\xb5\x72\x54\x6c\x7b\x4f\xa4\x41\xf0\x5d\xb6\x1c\x61\x4b\xf2\xdc\xc6\xcd\xcc\x4d\xdc\xce\xde\xc5\xc6\xc4\x7c\x60\x91\x28\x15\xd7\x2c\xb2\x8e\x64\x49\x76\xbb\xfb\xbf\x5f\x10\x20\x8b\x00\x91\x00\xc1\x92\x2d\x4d\x5f\xac\x35\xd1\x23\x15\xf2\x49\x24\x12\x4f\x02\x09\x10\x05\xbe\xfb\xa7\xdb\xff\x79\xf3\xd7\xff\xf8\xcb\xdd\x6a\xd7\xee\x8b\xf7\xef\xba\xff\xae\x8a\xa4\xbc\xbf\xbe\x20\xe5\xc5\xfb\x77\x3b\x92\x64\xef\x7f\x5a\xf5\xff\xde\x35\x69\x9d\x1f\xda\xf1\x83\xee\xdf\x43\x52\xaf\xee\x8b\x6a\x93\x14\xab\xeb\xe1\x97\x5f\x7f\x5d\x3d\xe6\x65\x56\x3d\xbe\x95\x44\x3f\x1e\xb7\x5b\x52\xaf\xae\x87\x5f\x7e\xfd\x75\xf5\xb7\xbf\xcb\x62\x87\xba\x4a\x49\xd3\xac\xae\x4f\xbf\xfd\xfa\xeb\xea\x9b\x20\xd6\xfd\x23\xe5\xc3\xd5\xea\xdb\xea\xf6\xee\xe3\xbf\xff\xe1\x6a\x75\x2c\x33\xb2\xcd\x4b\x92\xad\x7e\xbb\x94\x44\x1f\x48\xdd\xe4\x55\x79\xb5\xfa\xdb\xdf\x85\xb2\xdf\xc6\xca\xdf\xbd\x99\x36\xf0\xdd\x9e\xb4\xc9\x2a\xdd\x25\x75\x43\xda\xeb\x8b\x63\xbb\xb5\xa2\x0b\xae\xb8\xcd\xdb\x82\xbc\xff\x6b\x52\xfe\x72\x5c\xfd\x8f\xe3\x86\xd4\x25\x69\x49\xb3\xfa\x43\x9d\x67\xef\xde\xb0\xc2\x51\x78\x93\x34\x64\xb5\xab\xc9\xf6\xfa\xe2\xcd\xc5\xb4\x8e\x5d\xdb\x1e\x2c\xf2\x7f\x8f\xf9\xc3\xf5\xc5\x4d\x92\xee\x88\x75\x53\x95\x6d\x5d\x15\x17\xab\xb4\x2a\x5b\x52\xb6\xd7\x17\x65\x65\xa5\x5d\xd1\xe5\xaa\xac\xac\xa6\xad\x6a\x72\xb9\xda\x1f\x9b\xd6\xaa\xc9\x43\x52\xe4\x59\xd2\x12\xad\xde\xbf\xd4\xc9\xfd\x3e\x01\x14\x6a\x51\x77\x5f\x0e\x79\x4d\x1a\x0e\x86\x24\xf9\x32\xd9\x93\xeb\x8b\x87\x9c\x3c\x1e\xaa\xba\xe5\x44\x1f\xf3\xac\xdd\x5d\x67\xe4\x21\x4f\x89\x45\xff\xb8\x5c\xe5\x65\xde\xe6\x49\x61\x35\x69\x52\x90\x6b\x87\x57\x56\xe4\xe5\xe7\x55\x4d\x8a\xeb\x8b\x3c\xad\xca\x8b\x55\xfb\xf5\x40\xae\x2f\xf2\x7d\x72\x4f\xde\x7c\xb1\xd8\x67\xcc\x83\xdb\xe4\xa1\xfb\xd3\xce\xd3\x8a\x57\xd0\xb4\x5f\x0b\xf2\xfe\xaa\xae\xaa\xf6\x9b\x65\xa5\x59\x63\x31\x4a\x5a\x9d\xf3\xaf\x30\xfa\xad\x63\xf8\xb7\x6d\x55\xb6\xd6\x36\xd9\xe7\xc5\xd7\xab\x26\x29\x1b\xab\x21\x75\xbe\x7d\x5b\xe4\x25\xb1\x76\x24\xbf\xdf\xb5\x57\x8e\xed\xf8\x6f\xad\x7d\x63\xb5\xe4\x4b\x6b\x35\xf9\x2f\xc4\x4a\xb2\xff\x3c\x36\xed\x95\x83\xd0\xfa\xad\xf5\x48\x36\x9f\xf3\x16\x2e\xfd\x6d\x53\x65\x5f\xbf\xed\x93\xfa\x3e\x2f\xaf\xd0\x6f\x27\x6b\x8a\xda\x4a\xab\xa2\xaa\xad\x92\x1c\xdb\x3a\x29\x2c\x74\xf5\xb8\xcb\x5b\xf2\x16\x2a\xf3\xd1\xd5\xab\x6d\xd2\xfd\x80\xc5\x0e\xea\xca\x71\xf7\x03\x96\xe3\xae\x9c\x44\xdd\x0f\x58\xee\x76\xe5\x19\xe9\x7e\xc0\x72\xaf\x2b\x4f\xe9\x3f\x85\x79\xe8\xea\xd5\xc6\xed\x7e\xc0\xf2\xa0\x2b\x8f\xd2\xee\x07\x2c\x0f\xbb\xf2\x80\xfe\x03\xcb\xa3\xae\xdc\xf3\xbb\x1f\xb0\x3c\xee\xca\x5d\xfa\x4f\xe5\x1f\x74\xb5\x29\x92\xf4\xb3\x50\x5c\x95\x9c\xf3\xb5\xc5\xfe\x4c\xb9\x33\xa7\x1f\xcf\x09\xb8\x73\x02\xde\x9c\x80\x3f\x27\xd0\xf5\x82\x4c\x31\x4e\x20\x9c\x13\x88\xe6\x04\xe2\x39\x01\xda\x13\xb2\x44\x92\xb6\x79\x55\x52\x9a\x13\x77\xeb\x6f\x53\xa8\x94\xb2\x3c\x8d\x48\xb2\x8d\xa1\x62\x4a\xf2\x78\x93\x45\x5b\x17\x2a\xa6\x1c\x0f\xe3\x34\x20\x01\x54\x4c\x29\xee\xc5\x09\xc9\x12\xd8\x32\x74\xf5\xca\x09\xe3\x4d\x06\x2a\xa7\x04\x47\x28\xc4\x09\x58\x1c\xb2\xe2\xc0\x8b\xb6\x50\x71\xc4\x8a\xfd\x20\x04\xeb\x8e\x59\xb1\xb7\x09\x36\x0a\xb7\xd0\x72\x37\xf0\xb2\xa9\xdb\x47\xbf\x82\xcc\xe0\x1c\xab\x2b\x57\x92\x97\x73\xad\xae\x5c\x49\x5d\xce\xb9\xba\x72\x25\x71\x39\xf7\xea\xca\x95\xb4\xe5\x1c\xac\x2b\x57\x90\xb6\x21\x69\x55\x66\x49\xfd\x95\xa7\xef\x36\x24\xc1\x76\xab\x97\xa3\x44\x26\x41\x9a\x6c\x1d\xbd\x20\xa5\x74\x86\x93\x84\x78\x7a\x41\x4a\xee\x14\xc5\x28\xf3\xf5\x82\x94\xe6\xc9\x36\x74\xd3\x78\xae\x2d\x5d\x34\x11\x3f\xdc\xa4\x7a\x41\x36\xb6\x27\x6e\x9c\xcc\x08\xd2\x20\x08\x23\x27\x8b\x67\xdc\x43\xc3\x21\x88\x10\x8a\x67\x5a\x4d\x03\xc3\xdb\x22\x14\xa2\x59\x87\x77\x13\x04\x46\xc8\x0b\xa7\x7d\x0c\xf5\x22\x48\x46\xb0\x1b\xcd\x24\x95\x01\x04\x76\xa4\x99\xa4\x32\xa8\xc0\xae\x04\xe9\x0d\xf6\xa5\x99\xa4\x32\xe4\xc0\xde\x34\x93\x54\x86\x21\xdc\x9f\xb2\x68\x96\x94\xf7\xa4\x66\x61\xb8\xdd\xe2\x2d\x82\x4a\x59\xae\x44\xb2\x2c\x0b\xa1\x62\x1a\x72\xdb\x34\xf5\x37\x1b\xa8\x98\x06\xda\xd6\x8f\xc9\x64\x24\xef\x8b\x3d\x96\x88\x85\x71\xe0\xc2\x96\x75\xc5\xae\x4f\x3c\x0f\x2a\x0e\x98\x72\x9c\xa1\x04\x2a\xa6\x01\x94\x6d\xb0\x83\xc0\x86\xd1\xb0\x49\xb1\x93\xc1\xc5\x34\x58\xe2\xd8\x09\xe1\x62\x16\x22\x41\x80\xb6\x93\xf2\xaa\xe4\xfc\x0a\x12\x8e\x73\xac\xae\x5c\x19\x04\x9c\x6b\x75\xe5\x4a\xc2\x73\xce\xd5\x95\x07\x33\xe5\x4a\x4a\x73\xfe\xd5\x95\x2b\xe9\xcb\x7b\x58\x16\x78\x4c\xea\x32\x2f\xef\x07\xd6\x26\x93\xf4\x64\x28\x66\xb4\xdd\x6e\xbd\x34\x04\xcb\x19\x6f\xb7\x84\x24\x11\x58\xce\x88\x4b\x08\x0e\x31\x58\xce\x98\x1b\xa5\x5b\x9c\x28\xcc\xeb\xe6\xac\x6d\x8a\x10\x6c\x5f\xc0\xe6\xb4\x0d\x9a\xd0\x67\x28\x67\xe4\x0d\xe2\x44\x51\x4e\xd9\x9b\x64\x61\xa0\x28\xa7\xf4\x8d\xb6\xbe\x0a\xdf\xf3\xd7\xe9\x06\xf9\x69\x07\x70\x2e\x06\x09\xc0\xfb\x58\x2b\xa0\xa4\x30\xef\x65\xad\x80\x92\xc4\xbc\x9f\xb5\x02\x4a\x1a\xf3\x9e\xd6\x0a\x44\x73\x02\xf1\x9c\x80\x2a\x21\x3a\xa6\x29\x69\x1a\x4a\xe5\x6c\xbb\x45\x19\x02\x8b\x29\x95\x37\x29\xf1\xe2\x04\x2c\xa7\x54\x0e\xdd\x2c\x75\x60\xf5\x2e\xcb\x0f\xd2\xd0\x81\xf1\x94\xca\x3e\xd9\x84\x8e\xaf\x30\xaf\x2b\x4f\x12\x8c\x61\xfb\x28\x95\xbd\x4d\x1c\xa2\x14\x2c\xa7\x54\x76\xd3\xc8\x47\x30\x9e\x52\xd9\x45\x5d\x2c\x80\xe5\x94\xca\xd8\xf7\xa7\x4c\xe5\xfc\xd3\x2d\x36\x88\x07\x50\x99\x73\x31\x3c\xf9\x73\x3e\xd6\x0a\xa8\x53\x12\xce\xcb\x5a\x01\x75\x02\xc2\xf9\x59\x2b\xa0\xa4\x32\xef\x69\x38\x23\xe0\x5c\xad\x15\x50\xe7\x14\xbc\xb3\xa9\x84\xb0\x35\x33\x6c\x14\x55\x75\x46\xea\x3a\xc9\xf2\x63\x73\x85\x6c\xc7\xaf\xc9\xfe\x2d\x20\x41\x37\xb3\xae\x90\x8d\x64\x81\xe4\x70\xb0\x36\x49\xfa\xf9\xbe\xae\x8e\x65\x36\xd9\xc6\xe9\x65\x1a\x52\x10\x96\xd9\x50\xfb\xae\x5e\x65\x11\x71\x49\x2c\x0a\xd1\x44\x48\x94\xe3\x9d\xd7\x4b\xed\xaa\x07\x52\x0f\x6a\x84\x2d\x9f\x5e\xa0\xdf\x8d\xb3\x76\x24\xc9\x48\x6d\xd1\xdd\x2f\xa5\x36\xae\x54\xdc\x9f\x19\x0c\xef\xbd\xd8\x8b\x08\x41\xd5\x8b\x90\xba\xae\x4e\x06\x89\xe9\x49\x51\x35\xa4\xef\x11\xab\xac\xea\x7d\x52\x4c\x77\x89\x64\x09\xab\x3a\x24\x69\xde\x7e\xbd\x42\x36\x86\xa4\x68\xfb\x45\x56\x49\xc5\x9c\x8e\x61\x84\x38\x54\x07\x5a\xb2\xa9\xbe\x58\xcd\x2e\xc9\xaa\xc7\xde\xe4\xfa\x7e\x93\xfc\xec\x78\xe8\x72\x35\xfe\x07\xd9\xd8\x7f\x2d\xd0\xa5\xf3\xd3\xd5\x9f\x48\x5b\x57\x87\xaa\xc8\x9b\xcb\xd5\x87\x07\x52\xe6\xf5\xea\xcf\xe4\x4b\x7b\xb9\xfa\xef\xa4\x78\x20\x6d\x9e\x26\xab\x3f\x93\x23\xb9\x5c\x7d\xa8\xf3\xa4\xb8\x5c\x71\x9b\x8d\x4c\x4b\x96\x37\x87\x22\xf9\xca\xb4\x3d\x24\xf5\xcf\xa3\xf2\xd7\x6f\xc7\xdf\xad\x47\xba\x2b\x69\x15\x74\x6f\x72\x1c\x24\xf8\xb2\x9a\xdc\x1f\x8b\xa4\xbe\xf2\xc0\xd2\x86\xec\xf3\x4d\x55\x64\x57\x3e\x58\x4c\x8b\x02\xb0\x88\x7c\x69\xeb\x64\x52\xbe\x73\x7a\x5f\x8d\x26\xcf\x71\xed\xf5\x08\xe5\xb4\x4f\xda\x2c\xb4\x73\x8a\xe8\x37\x6c\x47\x04\xef\xbc\x93\x30\x3e\xdf\x32\xbc\xd8\x32\xbc\xc4\x32\xf7\x7c\xcb\xdc\xc5\x96\xb9\x4b\x2c\xf3\xce\xb7\xcc\x5b\x6c\x99\xb7\xc4\x32\x5f\x65\x19\x60\x8a\x6f\x60\x4a\x1f\x24\x53\x8c\x99\x31\x81\x64\x0c\x1b\x62\xb8\xad\x50\x4e\x76\xde\x98\x21\x26\xa7\x20\x23\x6b\x0e\xc8\xdc\x35\x07\xb4\xb4\x97\x0e\xca\x00\x07\xb4\x9b\x44\xf4\xc4\xf1\x07\x65\x98\x02\xfa\x4d\xe2\x72\xea\xcb\x83\x32\xda\x80\x0a\x4c\xc2\x6b\xda\x00\x65\xcc\x00\xfa\x4d\x82\x44\x30\x7e\x01\xed\x0f\x67\xd0\xfe\x20\x33\x59\xad\xdf\x84\xc9\x82\xf1\xe1\x02\xe5\xe1\x19\xc6\x47\x0b\xf4\x47\x0b\xf4\xff\xf6\x2f\x97\x57\x1b\xb2\xad\x6a\x72\x79\x95\x6c\x5b\x52\x7f\xa3\xa9\x41\xfe\x4b\x5e\xde\x5f\xb1\xa4\xaf\x4b\x16\xe8\xd3\xbd\xab\xb2\x6a\x7f\xfe\x5b\x9a\xb1\xe7\x83\x7f\x7f\xfd\x6d\xcc\x98\xde\x4e\xad\x1b\x62\xe9\x72\xd5\x27\x54\xaf\xdf\xf2\x46\x75\xf3\x35\x6c\xa4\x18\x58\x97\x2b\xaf\x1b\x5f\xe8\x27\x4d\xfe\x0b\xb9\xb2\xc3\x2e\xf3\x2c\x48\xdb\x92\xda\x6a\xba\xfc\xa6\xbc\xbf\x62\x29\xd3\xe4\x51\x26\xee\x04\xd9\xf3\x48\x6b\x53\xb5\x6d\xb5\xbf\xea\xeb\xec\x87\x1a\x2e\x8f\xb9\xe0\xf2\x98\x8b\xcb\x0b\x31\x91\xb9\xb8\x64\x89\x0c\x97\xc7\xc0\x23\x56\xf7\xe9\xe5\x8a\x4f\x8f\x44\xbd\x2b\x49\xb1\x9c\x22\xbd\x1e\x4c\x6e\xab\xc3\x15\xfa\xa7\x7c\x7f\xa8\xea\x36\x29\x5b\xfa\x0c\x77\x49\x07\x48\xf4\x98\xf6\xc4\x3f\xb6\x17\xc6\x1e\x77\xb0\xbf\x16\x92\xd0\x22\x2f\x3f\xd3\x1d\xd2\x07\xa2\x98\x9b\xa0\xad\xe1\x21\x3a\x28\x1a\x86\x8d\xbb\xc3\x82\x30\xbf\xd4\x30\x84\x3c\xe4\x4d\xde\x92\xac\x07\xed\x9a\xe2\x67\xec\x46\x97\x2b\xcf\x59\x5f\xae\x7c\x77\x3d\xc8\xa6\xc7\xa6\xad\xf6\x14\xd2\x68\xab\xe1\x1e\xaf\xbe\x66\x4f\xf3\xe1\x28\xfd\x97\xcb\xab\x53\x34\xcb\xe1\x9c\x97\x3b\x52\xe7\x8c\x4a\xdf\xac\x7d\x63\x75\x35\x6e\x8b\xea\xd1\xa2\x27\x08\xae\x9a\xb4\xae\x8a\x62\x93\xd4\xe3\x93\xfe\xe4\x60\xed\xf2\xfb\x1d\x9d\x26\x7b\xdb\xda\x3a\x29\x9b\x43\x52\x93\xb2\x15\xba\x65\xd3\x96\xd6\x03\xa9\xbb\x7e\x2d\xac\xe1\x1c\x80\xed\x8e\x0b\xc5\x4e\x60\x57\xd5\xf9\x2f\x55\xd9\xf2\x22\x81\x52\xe4\x90\x64\x59\x67\xb8\x24\x73\xaa\xe7\x24\xc1\x15\x0e\x9f\x8d\x4e\x84\x20\xaf\x57\x62\xb9\x5c\xed\x6b\xde\xa8\x61\x54\x89\x26\xc6\xf6\x13\xf1\x7e\x18\x70\xc6\x22\x7e\x78\x1b\xd7\x1f\x5d\x49\xdf\x61\xe0\x72\x9b\x2b\x87\x16\xdb\x5d\x71\x75\x6c\xe9\x48\xb7\xb9\x97\x7b\x84\x13\x4b\x0e\x07\x92\xd4\x49\x99\x12\xab\x69\x93\x2e\x1c\x32\x6b\x7a\xd8\x43\x54\x0c\x21\xc6\x38\x44\xb6\x6f\x2a\x0f\xb6\x1a\x92\x16\x07\x6b\xbd\xec\xa9\xab\x57\x12\x1d\x20\xf1\x3c\xad\xca\xc1\x70\xb5\xf8\xb6\xaa\xf7\x13\xaf\x44\x33\xc2\xe2\xd4\x83\x6c\x07\x6b\xe5\x79\x07\xce\xd8\x61\xe4\x3b\x2a\x69\x6a\xac\xc6\x67\x19\xd9\x26\xc7\xa2\x35\x1e\xd7\x78\x4c\x4f\xd0\x29\x54\x52\x0b\x62\xf5\xac\x1d\xc4\xd8\x68\x78\x12\x56\xd8\xe7\x83\xe6\x19\x0c\xd8\x91\xaa\x61\x93\x6d\x11\x65\xbd\x20\x3c\xcb\x9b\x64\x53\x9c\xc6\x7d\xd5\x28\x1e\xce\xa0\x81\x56\x43\x1e\xd4\xeb\x80\xbb\x48\x34\x44\xd1\xbd\xe9\x8e\xa4\x9f\x61\x3b\x4c\xd8\x31\xc0\xf5\x75\x83\xd0\x61\x68\x3b\xa7\xda\xd3\xb0\x38\x4f\x4e\xa1\x1a\xad\x2e\xb8\x27\xa6\xc5\x3a\x15\x4f\x21\xb2\xa8\xe3\x1c\x42\x8f\x4e\x79\x12\xb1\x07\x35\x4f\x23\xb8\xa4\x65\x86\xe8\x4b\xdc\xfc\x5d\x88\x7f\xe2\xc5\x77\x60\xb0\x3a\x86\x8c\x98\x78\xa8\xf3\x7d\x97\xc0\x2e\x30\x61\x80\x2c\x0c\xdb\x13\x4c\xe7\x38\x3d\xd4\x8c\xe3\x91\x0e\xbc\x20\x3a\x46\x83\xcf\xe2\xf4\x00\x3f\x8f\xcb\x12\x5a\xd9\x6a\xee\x40\xa3\x5e\x81\x09\x61\x15\x4a\xce\x1c\xa9\xa7\xf0\x05\x24\x13\x9f\x84\x2c\x82\x28\x8d\xe4\x1e\x83\x81\x38\xf5\x80\x3e\x55\x0d\xc1\x67\xc8\xc9\x3d\x62\x53\xa3\x75\x75\x2b\x2b\x9e\xe5\x27\xf7\xf0\x0e\xc2\x9f\x47\x50\x09\xbd\x94\xa0\xb2\x82\x33\x08\x7a\x72\x8e\x7e\x18\x84\xfb\x48\xa7\xe8\xac\x9e\xd0\xa7\x15\x33\xf4\x7b\x42\x2e\x20\xa9\xd0\x79\xd2\xd0\x0c\x43\x3a\xfb\x06\x4a\xce\x62\xa5\x71\x46\xc1\x3d\x3f\xd7\xe9\x79\x1a\xcb\x4d\x53\x0a\x55\x67\x9a\xe9\x3c\x23\xa5\x90\xa8\x67\x16\x08\x10\x53\x4c\xd4\x2e\xc9\x54\xd8\x31\xad\xe5\x08\x25\xe7\xc6\x83\x65\x10\x4a\x93\x8e\x8b\x7a\x01\xf0\x0c\xd9\xc7\x13\x6b\x4a\xac\xa6\x5e\x55\xa5\xb3\xcc\x1e\x0f\xc2\x01\xe8\x33\x53\xe4\x09\x78\xe9\xa0\x2d\xe1\x67\xbd\x2e\xda\x09\x11\x64\x2e\xb7\xd0\x7a\x5f\x37\x5e\xcf\xf8\x5f\x3f\x5a\x6b\xc9\xf6\x94\x75\xdb\x44\x83\x2e\xe6\xb5\x2d\x37\x1c\xa8\xc7\xd3\x92\xb3\x3a\xce\x60\xa1\xf1\x28\x3d\x1e\x5a\xd5\x68\x79\x12\xa7\x8d\x57\x7d\x70\x17\x1a\x69\x9c\x65\x3b\xdc\x12\x1d\xf9\x9e\xc4\xfe\x27\x0c\xcf\x8b\x9e\x4f\x9c\x00\x33\xbb\x6a\x4c\x86\xf7\x92\x46\x6e\x42\xdc\x59\xc9\x25\x8b\x3e\x0a\x3b\x8f\x4e\x22\xd4\xc4\x3c\x98\x1f\x1a\x80\xd4\xe9\x06\xb2\x4b\x5a\x9f\x97\x0f\xa4\x6e\x54\x23\x1b\x48\x87\x01\x62\x94\x83\xc0\x48\x7d\x63\x06\xb1\x49\xaf\xd3\xf3\x60\xd8\xf7\x2f\x57\xe3\x7f\x90\xed\xf8\x50\x0d\x26\x4f\xae\x14\x8d\x82\x4e\xa1\xa1\xcb\x55\xff\x3f\x1b\x83\xf5\x19\xf2\x07\xac\x72\x6e\x14\x9a\x7a\x4d\xaf\xe3\xec\x4e\x91\x98\xb6\xc4\xdf\x67\x8c\x2a\xf4\x69\x88\xd2\x6f\xea\x3d\x6c\xee\xa1\xf1\x28\x7a\x5f\x57\xc7\x83\xb5\xad\xd2\xe3\x29\x11\xbd\x7a\xe5\x3b\xe9\x86\x88\x87\x4b\x93\x82\xd4\xed\x10\x0a\xc6\xb1\x2e\xa0\x96\x3d\xe6\x8d\xa7\x5a\xd8\x99\x48\xda\xf8\xa9\x0a\xd9\x38\x25\x14\xe6\xb7\xd2\x4e\xa5\x9e\xe1\x38\xa6\xa3\xaf\x48\x12\x3b\x1c\xac\x82\x3c\x90\x62\x00\x98\x75\x7b\x07\x9b\xf7\x02\xa4\x5b\xab\x61\x3c\x53\x1a\xe9\xc4\x14\x4d\xa1\x62\xc2\x69\x63\xe9\xc4\x02\x5f\x2a\xba\x32\x2f\xb7\xd5\x82\x9d\x74\x0e\xc4\x9d\xef\x35\x66\x20\xab\xcd\x60\x53\x34\x02\x91\xa0\xbb\x0d\x70\x8a\x70\x99\xa3\x2b\x8f\x55\x04\x8d\x21\x61\xa9\xa6\xd9\xc0\x99\x0a\xe8\x75\x0c\x3c\xd0\x68\xe9\x45\xf4\x7a\x74\x91\x08\x8b\x99\xe8\x33\xb0\x4e\x10\x14\x75\x1a\x6f\x6f\x4e\x99\x39\x7c\x7e\x0e\x39\x67\xf6\x46\xc5\x8a\x25\xa2\x0d\x05\x1a\x8e\xce\x62\xcf\xe4\xe9\x04\xfe\x34\xaa\x9e\x36\xfe\x9e\xc6\x56\x40\xcd\xb9\x84\x05\x54\x3d\x95\xb3\x4a\x95\x4f\xa3\xed\xf0\x1d\x27\x25\x6d\xb9\x2f\x41\xc1\x48\x03\xde\x4a\x13\xf2\xa9\x56\x1d\x6f\xb9\x2f\x70\xc1\x68\x0d\x6f\x67\xb1\x67\xf2\x76\x02\x7f\x1a\x6f\x07\x65\x4f\xe4\x2d\xa0\xe6\x5c\xde\x02\xaa\x9e\xca\x5b\xa5\xca\xa7\xf1\xd6\x70\x33\x52\x62\x6d\xff\xf9\x39\x83\xad\x7e\x27\x53\xb5\x1b\x23\x60\x35\x8c\x9d\x41\x9e\xc9\x57\x11\xfd\x34\xba\x0e\xfb\x75\x4f\x63\xab\xac\xe5\x5c\xb2\xca\x9a\x9e\xca\x55\x95\xc6\xb3\xa9\x7a\x4a\x89\x8d\x72\x56\x6e\x47\x67\x82\x04\xe9\x6a\x98\xb4\xcb\x09\x6c\x59\x95\x04\x16\x53\x2e\x0e\x66\x7a\x56\xd4\xa2\xe2\xaa\xaa\x4d\x7a\x35\x2a\xd2\x2e\xd4\x36\xb3\xfa\x59\xd4\x40\x3d\x79\x35\xcb\xa5\x79\x7d\x0a\x0a\x3f\xc1\x42\x25\x85\x67\xd7\x6b\xb2\x6e\x29\x5b\xa0\x67\x9a\x83\xcb\x95\x83\xd0\xfa\x72\xe5\x46\x6b\x0d\x66\x96\x82\xda\x79\x7d\x89\x0b\xb4\xa9\x89\x61\xd8\x98\x4c\xce\x67\x98\x34\x1b\x1b\xb2\xed\xb3\xca\x66\x23\x64\x89\xce\xef\xc8\x6d\xf3\x6c\xe2\x0c\x47\xfe\x20\x86\x1b\xe6\x15\x11\x34\x54\x43\x09\x02\x48\x74\x5d\x36\xb0\xc4\x17\xba\x64\xc6\x90\xe6\x06\x93\xfa\x72\x83\x66\x49\x2e\x19\x3e\xa7\x6a\x96\xe2\xe6\x1a\xbf\x23\xc1\x8d\x33\x90\xe5\x2e\xfc\x41\xf4\x06\x37\x0c\x40\x8e\x9e\x73\x5c\x4b\x46\x3f\x99\x51\xda\xdd\x11\x43\x8e\x9b\xec\x0f\x9c\x61\xd2\x2c\xcb\x65\xdb\x67\x95\xcd\xf2\x7c\x89\xce\xef\xc8\x74\xf3\x0d\x8d\x33\x1c\xf9\x83\xb8\x7e\x48\xba\x40\xa2\xb7\x94\xce\xec\x95\x5f\xae\xe8\x95\x18\x8a\x5c\x8a\xe9\x31\x38\xd6\x7a\xb9\xea\xaf\x35\x54\xcf\x5a\x33\xba\xb8\x2b\x69\x2e\x57\xfd\xfd\x3f\xca\x21\x62\x46\xd7\xb8\xa0\xbc\x5c\xf5\x37\x61\x89\xb7\x38\xa4\x49\x6d\x70\xc2\xe4\x54\x3f\x15\xcf\xf2\x87\x7c\xfe\x59\x97\x8b\x44\x14\xbd\x0d\x58\xc2\x0c\x5f\xbd\x07\x44\xe1\xef\x84\x8a\x5f\xb8\x17\x60\xc2\x77\xa5\x14\xcf\x12\x68\x21\x84\x5a\xf2\x08\x82\xc7\x2d\x73\x82\xee\x0c\xc6\x54\xa9\x00\x4c\x8b\x3c\xfd\x9c\x6c\x8a\x99\xa7\xbf\xf2\x31\x67\x09\xad\x37\x00\xae\x47\xe4\x4c\x56\x57\x87\xac\x7a\x3c\x0d\x54\x06\xd1\xe5\xa0\xd1\xa2\x13\xdc\x9c\x76\x23\x64\xe1\xf9\xd3\x13\xd0\x8c\xb3\x58\x83\x5c\xcc\xae\x93\x86\x74\x97\x17\x86\x7c\xf1\x61\x37\xc1\xc3\xac\x7c\xfd\x8d\x84\x9d\xde\x9e\x23\x81\x27\x02\x80\xc3\x07\xbe\x70\x58\xd5\xcd\x31\x12\x1a\x64\xc6\xf0\x75\x70\x49\xba\xbf\x64\xc3\x78\x1b\x79\x0a\xe4\x07\x8c\xf1\xaa\x96\x93\x54\xde\x92\xbd\xf9\x76\x9f\x08\x33\xf9\x7e\xba\x18\x24\x9b\x24\xbb\x27\xdc\x2d\x48\x33\x35\xf3\x07\x79\x28\x12\x16\x17\xaf\x36\x16\x11\x46\xdb\x4b\x11\x88\x32\x0c\x43\x86\x30\x4e\x0a\xa5\xba\x96\x7e\x61\x80\x82\x96\x3c\x9c\x50\x40\x17\xd5\x67\xb8\xf8\x8b\xa7\x95\x2d\x3c\x4b\x4b\x31\xf7\x75\xa2\xf9\x8e\x8e\xb2\xa7\x29\x6c\x8a\x61\x45\x63\x4a\x28\xde\x67\xc2\x4a\x0f\xc7\xfa\x50\x80\x47\x22\xfb\x9e\xd3\x7c\x59\x5e\xd0\x70\x4e\xe5\x9b\xe2\xa8\xa9\x5a\xc5\x4f\x8a\x3a\xa7\xba\xaa\xee\x3a\xe4\x1c\xda\xf4\xc8\x45\x3d\xc9\xbe\x15\x6f\xd4\x44\xc9\xa7\x1c\x76\xae\x4e\xf1\xf2\x83\x64\x43\x0a\xc9\x0b\x46\x73\xb0\x04\xcd\x92\xfa\xf3\x02\xe4\xcc\xb7\x7f\x95\xfc\xe5\xea\x05\xbe\x48\xce\x95\x72\x77\x83\xf0\x65\xd2\x37\xae\x91\x3b\x41\x4f\xbf\x50\x1f\x4c\xd5\x2b\xa7\x53\x65\x2a\xc0\x70\x8b\x63\x95\x83\x4d\x31\x70\xcf\x89\xc0\xa7\xc4\xaa\xa0\xe1\x9c\xca\x97\xc6\x2a\x87\x3a\xa7\xba\x73\x62\x55\x40\xce\x56\xda\xf1\x5b\x44\x9e\x17\xb1\x12\xf6\x8c\x9a\x17\x9e\x5d\xe2\x40\x9a\x27\x96\xaa\x3e\x39\xe7\xe8\x12\x43\x9e\x71\x98\x45\x04\x6a\xac\x05\x52\x84\x49\xa5\x0b\x0f\xb3\x30\xf4\x39\x07\x19\x44\xe4\xb2\x83\x0c\x93\x5a\x17\x1e\x64\xe8\x87\xd2\xc5\x0f\xb1\x05\x9c\xc6\x60\x39\x53\x11\x6b\x34\x7c\x86\x2d\xce\x39\x15\xbd\x90\x08\x5e\xcb\x4f\x12\x7b\x5e\x56\xb1\x98\x77\xa0\xc5\xbc\x84\x93\xee\x15\x12\x6f\x44\x9c\xe0\xea\x24\x23\xfb\xa4\x96\x4f\xce\x0f\x57\x23\xaa\xe4\x15\x36\x62\x8d\x8d\x22\x56\xb6\x13\xab\xed\x6c\x8e\x1b\x85\x1b\x5d\xc8\xcc\x93\xb8\xc2\x4a\x57\x6d\xa5\x08\x95\x8d\x74\xd5\x46\x6a\xd6\x2f\xe0\x5d\xaf\x2a\xf4\xd5\xb1\x2e\x7e\xbe\xc8\x92\x36\xb9\x62\x2f\x33\x6a\x1e\xee\xff\xdb\x97\x7d\xf1\x76\x78\xb5\xd4\xb1\xdd\x46\x97\x6b\xf7\x66\xed\x7e\xfa\xb2\x2f\xd6\x18\xf5\xaf\xab\x5a\xbb\xb7\x6b\x8c\x1d\x1b\xad\x31\x5e\x63\x44\xca\xb4\xca\xf2\xf2\x9e\x7d\x4c\x5f\x47\xd5\x15\xb8\x9f\xd6\xee\xdd\x1a\xdd\xae\xd1\x87\x4e\x07\x76\xfa\xb7\x7a\xad\x31\x6a\x1e\xee\xd7\x18\xfd\xe5\xdf\x3f\xfe\xf1\x5f\x6f\xd6\xb8\x53\x63\xad\xf1\xa7\x35\xfe\xf4\x7f\x3a\xc1\xee\x97\xdb\xbf\xde\xae\x31\xfa\xb7\xff\xfd\x87\x35\x46\x8e\xed\xb0\x0f\xef\xfe\xcc\x2a\x5c\x63\xbc\x6b\xdb\xc3\xda\xfd\xc0\x3e\x7f\x7c\x7c\xb4\x1f\x5d\xbb\xaa\xef\xd7\xf8\xd3\x1f\xea\xe4\xb0\xcb\xd3\x66\x8d\x3f\x51\xf8\x27\x06\xa7\x0a\x3f\x35\x0f\xf7\x8e\x63\x67\x6d\x46\x0d\x1c\xad\xeb\x0c\x62\xbf\x77\xda\xc7\xff\x4d\x1a\xec\x74\x30\x48\x2e\xcf\x98\x48\x59\x59\x49\x73\x20\x69\x6b\xd5\x49\x9b\x57\x2a\xf1\x2f\xfb\xa2\x6c\x18\x42\xdd\x10\x8c\x10\x62\x26\xcf\xa8\xf9\xf0\xa5\xc8\xcb\xcf\x73\xea\x9c\x38\x8e\xd7\xf8\x13\x93\x55\x29\x64\x4a\xd0\xe1\x8b\x4a\xe2\xeb\xac\x04\xbb\xfa\x86\x89\x61\xe4\xfb\xb6\xef\xab\x85\xe9\xde\x4c\xef\x5d\xcf\xd3\x68\x7d\xc8\xc9\xe3\xc7\x6a\xb0\x6f\x8d\x3b\xd7\xa0\x5e\x7d\x47\x11\xcf\x43\x2a\xe8\xa1\x26\x0d\xa9\x1f\xc8\x07\xda\x31\xff\x8b\xf6\x0b\x55\xf3\xe5\x4f\x79\xf9\x1f\x7f\xca\xcb\x8e\x90\x45\x9e\x12\x81\x13\xa2\x0e\xe1\x7f\xee\x4d\x46\x9a\x74\xed\xde\xfd\xb1\x0b\xa8\x35\x46\xff\xda\x45\x0f\xe5\xf8\xa7\xbe\x64\x5e\x89\xa8\xb0\x0b\x87\xa6\xad\xab\xcf\x64\xe0\x51\x49\x18\xd7\xd9\xa7\x16\xef\x28\x56\xb0\xcd\x8b\x62\x2a\xdc\x7d\x66\xd5\xc7\xa2\xd7\x42\x1e\x48\x59\x65\x19\x2b\xa3\xdf\x2e\xd9\x56\xf5\x9e\x95\xd1\x3f\x8b\xa4\x25\x6b\x1c\x21\x1b\xd1\x7f\x6b\xdc\x45\xa3\xe5\x9d\xfe\x8c\x8d\x5c\xd2\x99\xbf\xa8\xc9\x8b\x01\x22\xb8\x26\x69\x2b\x38\x60\x8d\xdd\x4f\x1f\xba\x1f\xd6\xd2\x91\x25\x78\x64\xac\xd7\x37\x85\xf6\x12\xd5\xf0\x04\x0b\x0e\x55\xf1\xf5\xbe\x2a\xa7\x46\x20\x14\xde\x7c\xfc\xc8\xaa\xed\x1f\x7e\xf4\xa6\xd8\xde\xd0\x9b\x5f\x87\xce\xd9\xe7\x5f\xac\x4d\x41\xca\xcc\xda\x57\x19\xa1\x31\x8b\xf6\xc7\xa2\xcd\x0f\xc5\xd7\xb5\xdb\x6b\x39\x54\x79\xd9\xf6\x23\x85\xe3\xa0\xc8\xf6\x5c\xc6\x76\xd7\x0e\xe8\x6f\x0e\x8a\x6d\x14\x09\x9f\x75\xbf\x78\xde\x1a\xa3\x30\x0c\xed\x50\x68\xf7\x60\xf7\xf7\x6f\x7a\xec\xde\x46\x37\x1f\xc0\xa6\x07\x46\x4d\xef\x56\x7f\x45\x02\xb7\x1c\xd9\x61\xbc\xc6\xc8\x75\x3d\x3b\xc6\x50\x0b\x11\x27\xe1\xc5\xcf\xd3\xe2\x0f\xe8\xf6\xee\xee\x83\xd2\x58\xec\x38\x76\x14\x71\xa6\xe1\xb8\xf3\x04\xf2\x63\x3b\xe8\x20\x38\x44\x76\x18\x3e\x53\xe7\x04\x37\xe1\xed\x27\x80\x51\x01\xb2\x03\x3a\x7c\x06\xb1\xe0\xc7\xd8\x0e\xdd\xf1\xaf\x53\x53\x62\x64\xe3\xb0\x6b\x0b\x72\x6c\xef\xa5\x1a\x73\x73\x7b\xe7\xde\xdd\xc9\x8d\xf1\x91\x4b\x6d\xe0\x22\x21\x88\x43\xdb\x13\x3f\x8a\x3a\xa9\xae\xa5\x8e\xeb\x86\xb6\xdb\x35\x22\x44\x81\x1d\xd3\x60\xc2\x1e\xa2\x01\xf6\x92\xcd\x70\xfc\xc8\x76\x99\xf1\x8e\xed\xf8\x63\x2f\x44\x5e\x64\x87\x78\xfc\xdb\xf1\x70\xc8\x86\x03\xcf\x0b\x6d\xbf\x2b\x89\x23\x64\x3f\x57\x2f\xdc\xdd\xde\xde\x21\xd9\x7c\xec\x87\x76\xe8\x50\x6a\x38\x76\xe8\xcb\xa1\x39\xfc\xed\xbb\xae\xed\x75\x68\xa9\xc1\xcf\x12\xbc\xf1\x4d\x7c\xeb\x2b\x83\xf7\x64\xdc\xd4\xf7\x2f\x63\xec\xa7\x5b\xef\x2e\x94\x8d\x8d\x50\xc0\xc2\xd0\x71\x3c\x64\x47\xd4\x70\x2f\xb0\xe3\x8e\xde\x51\xe4\xd8\x38\x02\xc8\xf1\x42\x74\x8f\x3e\xdd\x78\xd0\x10\x24\x99\x27\xb1\xfb\xf4\xc1\x10\xc2\x40\xa0\xbf\x4c\x9b\x42\x74\x83\x6e\x6f\xe4\x36\x05\x28\xb2\x31\x1d\x6c\x9c\xd8\x8e\xe1\x6e\x01\xfa\x2e\x0a\x42\x3b\xa0\x43\x13\x0a\xe3\xe7\x8a\x63\xd5\xd4\xe0\x61\x64\xa3\x2e\x7c\x3d\x1c\xdb\x2e\x0d\x60\x27\xb6\x11\x8d\x6c\x17\xd9\x5e\x57\x24\xb7\x33\x44\xb1\x4d\xfb\xc3\x89\xec\xd8\x79\x9e\x16\x04\x71\x17\x1f\x72\x0b\xa6\xb6\x00\xe6\x4a\x1e\x47\x71\x10\xb1\xe9\x21\x0e\x23\x96\xb8\x3c\x43\x68\xdc\x7d\xf4\x3f\x42\x34\x72\x62\xdb\xa7\xf3\x2f\x8e\xed\xa8\x2b\x75\xe3\x7e\x58\x72\x6d\x87\xfe\x1f\x0e\xfb\x09\x99\xfd\x2d\xcf\xe7\x52\x37\xbe\x64\x83\x64\x06\xc9\x9f\x4c\x53\x8c\x67\x89\xe3\x9b\x8f\xe8\x06\x18\x5f\x65\x77\x4e\xf3\x1d\x39\x23\x92\x5b\xf4\x32\x5d\xe0\xdd\x78\xb7\x18\x48\x92\xa6\x0d\x98\x64\xa7\xd3\xc9\x5a\x9e\xce\xa5\x06\xbe\x64\x0f\xf9\x6e\xc8\xd6\xff\x43\x40\x4c\x02\x44\x0e\xa1\x6e\xde\x66\xf9\x9f\x1f\xda\xc1\x73\x45\x78\x78\xeb\xdc\x02\xeb\x9a\xc8\x0b\x6c\xcc\x99\x3f\x6d\xce\x8b\x18\xab\x4a\x4c\x63\x14\xdb\xd1\x24\x99\xf6\x91\xed\xd0\xc9\xd9\x8d\x5c\x56\x18\xc6\x68\xb2\x46\x7d\xc9\xb5\x98\x1c\x8d\x32\xa1\xe5\xc5\xa4\x3c\x5b\x9b\x4c\x1d\x2f\x32\x7d\xab\x1a\x0e\x98\x27\x27\x1c\x31\x72\x6d\xd7\xa1\x59\x93\x1b\xda\x21\x5d\xe1\x05\xde\x20\x15\x06\xcf\xd6\x7d\xca\xf5\x29\x0a\x7c\xdb\x0f\x59\x33\xfc\x3e\x4f\x9c\xcc\xd0\xe0\x24\xfe\x8f\xd4\x08\xd9\x1a\x13\xf2\xfc\x83\x35\xc2\x41\x0e\x62\x7b\x2f\x0e\xc6\xae\xed\xb0\x5c\xdb\x75\x6c\x27\x10\xf7\xa3\x64\xb9\x17\x35\xbb\x5b\x0e\xd0\xed\xb1\x10\x85\x36\x2d\x76\x9c\x20\xb4\x69\xae\x1a\xc6\x36\xf5\x38\x0e\x3c\x3b\xa0\x39\x79\x18\xd8\xfd\xd6\x40\xc0\x46\xb3\x08\x79\x3d\x4a\x54\xf4\x4c\xa9\xad\x92\x52\x11\xb2\xa3\x61\xe5\x4f\x93\x73\x69\xa6\x00\xa6\xbe\x18\x45\xac\xc8\xef\x8a\x82\x7e\xcd\x25\xe8\x79\xc9\xd5\xac\x94\xaf\x4b\x91\xce\xba\xce\xe1\xfa\x4e\x6c\xd2\x33\x25\x23\xaa\x05\x87\xdc\x2b\x92\x79\x40\x13\x5e\x86\x59\xaa\x79\xc3\x41\xae\xc7\x68\xd3\xa7\x20\xd3\x14\x45\x26\x9a\xdc\x6c\xa7\xa3\x1c\x9d\x5b\x9d\x38\xa2\x1b\x70\x2f\xda\x24\xc9\xc1\x60\x80\xfb\x51\xd0\xa7\x0a\xbe\x3f\xec\xa8\x47\xb1\xed\xd0\x55\x94\x1f\xd1\xd6\xbf\xe4\xa6\x82\xec\x54\xd0\xf3\x72\x5b\x5f\xa4\x15\x1f\xc3\x9b\x3b\x68\xfd\xe1\xe0\x18\xf7\x0e\x77\x11\xb6\x5d\xe6\x67\xd7\xb5\x5d\x2c\xce\x23\x91\x8b\xec\xc0\x11\x3f\xf3\x62\xc7\x76\x22\xf6\xd4\x83\xe5\xf9\x2f\x1b\x2a\xf2\x94\x18\x7b\x31\xcb\xa3\x1c\x1c\x79\x6c\x65\x08\x3d\xa1\x71\x1c\x1f\xd9\xf1\xf4\xb3\xd8\xb1\x11\xdb\xe9\x42\xae\xed\x3f\xd3\x40\x10\xfa\x1f\xa3\x1b\x60\x23\x14\x34\x11\x9a\xf0\x5f\xc6\x6c\xf5\x84\x0f\xf0\xcb\x71\xb0\x8d\x98\xb1\x18\xdb\x08\xc3\x79\xca\x4b\x35\x25\xb8\xfb\xe0\x41\xbb\x25\x80\x39\x70\x0f\x40\xe1\x23\xbb\xe1\x39\x9a\xf2\x83\x9f\x7f\x76\x8b\xcc\x61\xd9\xc9\x46\x42\xd7\x71\xd8\xb4\x14\x63\xcc\x96\x6c\xc0\x20\x81\x1c\x3f\x70\x6d\x97\x2d\x23\x5c\x87\x2e\xe4\x5e\x74\x0c\x84\x4c\x84\xc6\xbb\x38\xf4\xec\x68\xd2\xd9\x2f\xd3\x14\x25\x47\x7f\x7f\x4d\x51\x0e\xe7\x91\x83\xd9\x6e\x5f\x18\x39\x76\xcc\xb6\xfd\x5c\xcc\xd6\x60\x01\x72\x58\x56\x04\x70\xf0\x1f\x8c\x5c\xb2\x39\xa0\xf7\x31\xf2\x3d\xb6\x23\x02\x7e\x86\xb0\xcb\xf6\x39\x64\xb7\x3c\xcb\xac\x14\xdd\x7c\x80\x52\xec\xff\x3f\x5a\x17\x3b\x37\x3e\xf4\xec\x14\x78\x36\x0d\xec\xb0\x01\x39\x86\xbc\x91\xf3\x92\xcd\x80\x76\x6d\xc0\x39\x18\x18\xbd\xe9\x5a\x3c\x1e\xd7\xe2\xcf\x42\xb6\xf0\x63\x74\x1b\x03\xcf\x5f\xe4\xd3\x03\xf2\xee\x26\xd4\x43\x72\x3f\xbe\xe4\xc0\x06\xec\x3f\x41\x1b\x7f\x40\xe6\xfa\x32\x7b\x39\xfe\xed\x47\xff\x36\xf8\x1d\xb5\x03\x3a\x8e\xc6\xe7\xa7\x9a\x83\x77\x0e\x72\x23\x1b\x7b\x21\x8e\x43\x76\xf6\xce\x71\xbc\xd8\xc6\xa1\xef\xe1\x98\x9e\xbe\x43\x75\xd5\x32\x51\xcb\xf3\xec\x38\x3c\x1d\xcb\x43\xbc\x1a\x4b\xd2\x63\x49\x8a\xd6\xfc\xd1\xb8\x38\x08\xec\xd0\xc7\x54\x9c\x3b\x23\xe7\x38\x4e\x60\x7b\x0e\x62\x0f\xd0\x27\xa7\x33\x31\x1d\x32\xf1\xe4\x84\x67\xe0\xd3\xa3\x42\xdf\xef\x68\x1d\xe4\x4d\x3f\xfc\x10\xdd\xa2\xff\xf2\xe6\xf7\x1b\xba\x97\x6c\xf3\x42\xeb\x5c\x20\x16\x5f\x64\xbf\x7a\x38\xa8\x0a\xad\x38\xa0\xec\xe8\xf7\xd7\xbe\x1f\xbb\xa2\x02\x36\xba\x27\x33\x30\x38\x4d\x4f\xb3\xe0\x67\x99\x17\xb8\x41\xe0\x77\xdb\x88\x1f\x7a\x4c\x16\xf2\x84\xbc\x5e\x01\x16\x35\xd2\xde\xe7\x4b\xce\xf3\xbf\xaf\x56\x7c\xf8\x74\xeb\xde\x01\xad\xc0\xc8\x67\xe7\x29\xfa\x83\x39\x9e\x3f\x9c\x7e\x1c\x3e\x88\xd8\x07\xc3\xd1\x9d\xd8\xf3\x6c\xc4\x9f\xe5\x09\xe3\x60\xd8\x9a\x46\xc3\x6a\x25\xee\x0b\xb1\x17\xda\xdd\x6c\xc3\x2d\x6a\xa2\x80\x3d\x40\xe4\x96\x39\x21\x3b\xd3\xe1\xc4\x6e\x6c\xfb\x5d\x4e\x84\x63\x8f\x65\xb4\xbd\x75\x9e\xf3\x5c\xbb\x8c\x1f\x3e\xc6\x50\x8a\x2d\xbb\x01\x68\xf5\xc4\x33\xcf\xb2\xdf\x11\x7c\xb8\x83\xd6\x9f\xb2\xbb\x81\x3e\x81\xfd\x2d\x76\xca\x8b\x6e\x11\x44\x91\xc7\x9e\x08\x86\xa8\x4f\x96\xb9\x76\x85\x31\x5b\xbb\x8d\x1f\xf9\x1e\x7a\xf1\xa3\xae\xf2\x53\x0c\xe0\xc1\x06\x72\xdc\xd0\x61\x13\xb8\xeb\xc6\x7d\x82\xf5\x82\x36\x03\x5c\x96\xf8\xee\x61\xdf\x76\xb8\xbf\x5d\xe4\xb0\xe7\x83\x0e\x0e\xfa\xb5\x8d\x1f\x38\x74\xf0\x73\x23\xff\xfb\x6f\x51\x80\x8b\x17\x6e\x61\xaf\x4b\xb7\xc3\x38\xb2\x63\xdf\x43\x41\xc0\xd2\x64\x37\x8a\xec\x30\x8e\xc2\xc8\x59\x94\x6d\x4f\xd5\x58\x53\x3d\x42\xb2\x4d\x47\xfe\x08\x7b\x48\x4c\xb6\x5d\xdf\xb7\x63\xd7\xa5\x98\x49\xb2\xed\xba\xd8\xc6\xc1\x0b\x26\xdb\xaa\x7d\x12\xe0\x91\x23\x30\xad\x3d\xfb\x4c\x07\x51\xe2\xa3\x7b\xf7\x61\x38\x14\xa6\xa3\x84\x1f\xba\x76\xe8\x38\x7e\xd8\xaf\x9c\xbc\x10\xd9\x01\x46\xb8\xcb\x97\x27\x94\xf0\xf9\x6f\x99\x4d\x28\x31\x55\x63\x4d\xf5\x88\x94\xf0\x31\xb6\x83\xc8\xf1\x23\x81\x12\x1e\xc2\x36\x8a\x7c\x1c\x00\xeb\xaf\xae\x08\xa0\x84\xe3\x86\x36\x0a\x7f\xf4\x72\xd6\xd4\x99\xa1\x1f\xd9\x41\x18\x84\x5d\xbb\x3a\x2f\x04\xbe\x6f\x87\x41\xe8\x60\xb4\x2c\xbe\x26\x6a\xac\xa9\x1e\xd1\x99\x21\x0a\xed\xc0\x0b\xc2\x40\x70\xa6\x8f\x23\x1b\xc7\xd8\xc1\xc6\xbe\xc4\xbe\x37\x19\xae\x7e\x50\x7c\xf1\xee\x14\x13\x49\x79\x2c\x75\xc2\xc8\x8e\x3c\x6e\xbc\x9d\x9e\x77\x78\x99\xb3\x0b\x91\x7b\x83\x6e\x22\xa3\x87\x12\xd0\x36\x36\x30\x7d\xcb\x93\xfc\x0f\x1f\x23\xc2\xdb\x9b\x60\x38\xb9\xa0\xa3\xb5\x1b\xfb\xb6\xef\x04\x71\x37\x82\xdd\xd0\x2c\x09\xdb\x1d\xb9\x1d\x79\x93\x46\x37\x46\x4c\xd5\x58\x53\x3d\x22\xad\x5d\xcf\xb3\xbd\xd8\x89\xc5\x2d\x1a\x14\xd9\x21\x72\xfc\xe1\xe3\x29\xad\x7d\x99\xd6\x6e\x10\xd2\xb1\xf7\xc7\x0e\x11\x41\xf4\x31\x1a\xbe\x9f\xa4\xf3\x65\xb7\xae\x70\x1d\x37\xe8\x1a\x70\x43\x73\x35\x6c\x63\x2f\x0e\x03\x79\x88\xd0\xf9\x72\xaa\xc6\x9a\xea\x99\x8c\xb7\xb1\x67\xe3\xc8\x0d\xb0\x38\x44\xa0\xd8\x76\x23\x6f\x18\x38\x0c\x86\x88\xef\x30\x03\x53\xd8\x19\x5f\x3f\x5e\xf0\x7d\x68\x57\xfc\x3a\xb4\xf8\x45\x6d\xfd\x1e\xd4\x29\x6d\x3e\x7b\xbc\x48\xda\xdd\x1a\xa3\xfe\x76\x81\x3f\x21\x3a\x06\xdc\xf4\x8b\xc8\x3f\xf6\x7f\x46\x1e\xb2\x87\x81\x79\xb8\x88\xe0\xdf\x76\xc9\x81\x08\x41\xdf\x69\xfa\x21\xae\xd5\xc9\x4d\xcb\xe8\xdf\xcd\x43\xf7\xc9\x85\x78\x2d\x05\xa9\xeb\xaa\x9e\xbf\x9a\x4f\xbe\xe5\x5b\x80\x2f\xbf\x36\x94\xc1\x0f\x49\x49\x6f\x10\x52\xbe\xd5\x16\xbc\x75\x6b\x0a\x1d\x5f\xbd\xe6\x08\xf7\xb3\xec\xab\x2c\x29\xfa\xfb\x71\x8d\x6f\xaa\x62\x20\xf3\xeb\x38\xfb\x4a\xaa\xb2\x25\x65\xab\x78\x73\xe3\x4f\xab\xd5\x6a\x85\x2e\xa1\xff\xb3\xf1\x4f\xab\xd5\xa4\xee\x24\xfd\x9c\xd5\xd5\xc1\xfc\xea\x9d\x09\x8e\x7b\x15\x9d\x2f\x4a\x2c\xef\x27\x06\x34\xbb\x9c\x85\x97\x5d\x72\xbd\x8a\x84\x9b\xbb\xd1\x45\xe8\xe5\xfe\xc2\xcb\xd9\x1e\xe3\xfc\xd5\x43\x86\xdb\x4c\x39\xfe\xf8\xa2\x44\x99\x3c\x70\xa5\x01\x50\x0a\xbf\xcf\xaf\x17\xc0\xa3\x55\xaf\xbc\xc8\x4f\x82\x44\x2c\x77\x17\xdc\x68\xc6\x47\x40\x0f\xf7\x38\xf5\xd8\x0b\x37\x09\x11\xcb\xfd\x25\xb7\x96\xf5\x98\x60\x16\x03\x18\x12\x72\x86\xb8\xc8\xc3\x3e\x12\xcb\x23\xae\x1c\x6d\x9d\xd0\x49\xc5\x72\x83\x8b\xa6\xfc\x69\x9d\x0a\x4a\x4e\x15\x82\x28\x05\xc9\x7c\xe8\xda\x20\x19\x28\xb3\xda\x17\x58\x2d\xb0\xb3\x39\x6e\x3a\x9a\x98\x8f\x27\x54\x7a\xee\xed\xd4\xfc\xed\xbe\x62\x75\x79\x46\x98\x86\x65\x77\x03\x4f\x70\xe6\x17\xfb\x0e\xc0\xd9\xf7\x1e\x03\x77\x09\x0a\x58\xed\x1b\x4d\xa1\x69\x00\x42\x03\x6e\xd6\xdf\xed\x0b\x2a\x59\x3e\x4a\x0e\x6a\x14\xb7\xf6\xee\x02\xb8\x56\xe0\xae\x5e\x01\x04\xd0\x11\x82\xca\x84\x0c\xa0\x61\x76\x80\x4e\xad\x9b\xde\x41\x3c\xc8\x2d\xbf\xe7\xf7\x81\xd4\x6d\x9e\x26\x05\x25\xb1\xd9\x2d\xd3\xdc\x2d\xc3\x02\x9a\xde\x67\xaf\xe5\x84\xfc\x8e\x28\x51\xc1\xa2\x1b\x8e\x65\xa8\x11\x1f\x55\x1a\x66\xc3\x1d\x2b\x80\x6a\x1e\x2b\x86\x0b\x01\x3d\xf3\x6a\x7d\x20\xee\x05\x78\x5b\xdd\xdf\x17\x8a\xf7\x41\xa8\xe3\x50\x54\x51\xe7\xf7\xf7\xdc\xd4\xba\x78\x3c\x31\xd1\x76\x5e\xeb\xb4\xc1\x76\xf0\xd4\xac\x6e\x8a\x3c\x63\xaf\x2a\xe8\x32\x4e\x83\x0b\xde\x39\x56\x50\x32\x98\xde\x7b\xcd\x91\xa2\x26\xcd\xa1\x2a\x9b\x8e\x0b\x7c\xc7\xce\xf3\x61\x02\x1c\x3c\x68\x4e\x28\x95\x82\xe5\x83\xe2\xb4\x0d\xc9\x7e\x73\xac\x75\xba\x4c\xaa\x56\x28\xef\xfc\xb3\x2d\xaa\x47\xe9\xca\x5b\x3c\x5e\x79\x3b\xb5\xa7\xcf\x1b\x87\xac\x79\xd6\x45\x3c\xe9\x67\x74\xf1\x19\xb8\xc0\xa5\x43\x5d\xdd\xd7\xa4\x69\x4e\x97\x06\x9b\x8e\x6d\x27\x60\x32\x80\x2c\x47\x79\x17\xa8\xa7\xc5\x61\x83\xd5\x1d\x00\x73\xf9\x70\x01\xb4\x4a\x50\xa3\x41\x50\xf0\x4e\xcb\x5e\xb6\x70\x6f\x48\xd5\xb6\x73\xfb\xac\xf8\x98\x39\x32\xf5\x43\x5f\x31\xa2\x6c\xaa\xb6\xad\xe6\x26\x0a\xce\x9f\x4c\xc7\xb6\xaa\xda\x51\x47\x3b\xbb\x56\x93\x14\x2c\x1d\xc9\x28\xaa\x3e\xf1\xdb\x78\x1c\x11\x6a\x5b\x12\xbc\x3c\xd0\x7c\xf4\x66\xa8\xb4\xaa\x4b\x52\xa7\xa4\x28\x4e\x61\xe8\x8c\x61\x38\x78\x70\xc9\xfb\x46\x59\x4f\xf7\x2b\x08\xf6\xe2\x7d\x91\x38\x55\x55\xb4\xf9\xc1\x7c\xa8\xe5\x63\xf9\x04\x3e\xc3\x4b\x3d\xd4\x94\xb0\xbd\xb8\x62\x0e\xd2\x2c\x72\xb7\x55\xbd\xb7\xb2\xbc\xe9\x7c\x97\x99\x37\x93\x63\x50\xa7\xa1\xe9\x2f\xbd\xd5\x83\xa2\x29\x68\xe1\x3b\x4d\x18\x28\x2f\x1f\x92\x22\x37\xdf\x4f\x62\x28\x1d\x06\x78\xbf\x16\x0f\xd2\x58\x39\x20\xe3\x29\xb2\x39\x6e\x0c\x1a\x17\x4c\x61\x87\x22\x49\xc9\xae\x2a\xa0\x10\xee\xd9\xc2\x34\xa4\x55\xd9\xb4\xf5\x51\x1a\xcd\x99\x9a\xa5\x6f\x41\x61\xa8\x6d\x95\x1e\x1b\xa2\x72\x92\x3c\x73\x88\x2d\x3d\x71\xa8\x0f\xa6\x28\xed\x7e\x20\xb3\xa6\x92\x1b\xb7\xfb\x91\x89\x61\x20\xd7\x5f\xb5\x3c\x5f\xb5\x7c\xe9\xfd\xd8\x3e\xee\x53\x6b\x53\x15\xd9\xc4\x97\x45\x95\x7e\xd6\x5e\x9a\xcf\x99\x3c\x27\x90\xd4\x24\x31\x0f\x32\x20\x5a\xa8\x82\xa1\xa3\xaa\x63\x5b\xe4\x25\xb9\x42\x2b\xb4\x62\x23\xe1\xf0\x7f\xaf\x82\x38\x45\x04\xc3\xf0\x21\x80\x24\x35\x6c\xe3\xb0\xdf\x3e\xec\xf4\x4c\x7f\x7d\xb5\xdd\x86\x9e\x2f\x7a\x96\xad\x7f\x87\x44\x72\xbc\x8b\x78\xdc\x9f\xc4\x18\x5f\x2a\x7e\x41\xb6\xcf\xed\x52\x0a\x0a\xd3\xa4\x26\xad\xd1\xc2\x5f\xa6\x24\xaf\x61\x61\x10\xf4\xd8\xea\x00\xbe\xcf\x67\x3a\x6c\x81\xd8\xfe\x88\xa6\xf6\xbd\x34\x33\x94\x98\xd1\xbb\x70\x8e\x87\xb5\x7c\x97\x26\xb2\x6d\x7a\xca\xa4\x21\xfa\x00\x8e\xa4\x3b\x92\x7e\xde\x54\x5f\x14\xb3\x84\x34\x83\xbc\x86\xd1\xb3\x81\xa3\x1a\xa3\x4e\x1a\xf2\x32\x23\x2d\xa9\xf7\x79\x99\xb4\x66\x2f\xf9\x52\xeb\x02\x6f\x3f\xd7\x06\xf0\x09\x6a\x32\xdf\xea\x27\xe6\x39\xc5\x06\xc6\xc9\x33\xeb\xe8\xe8\xe5\x09\xcb\x44\x03\xfd\x85\x64\xc3\x5b\xad\xf2\xb2\x21\x2d\x3f\xbc\x08\x43\x8d\x3b\x8c\x2f\x53\x4a\x28\x7b\x5e\xac\xb5\xb3\xa4\xd2\x72\x0b\x22\x20\xa4\x63\x79\x22\x24\xe5\x0c\x13\x45\x60\x47\xcc\xf7\x1a\xa4\x93\xc5\xde\xe8\x54\xa5\x3e\xd1\xf9\x5a\xf3\xf8\xfe\x59\x21\xf6\x43\xdf\xe6\xb2\x7a\x45\xa2\xee\x07\x00\x0f\xf3\x46\x8f\x35\x9b\x7d\xd8\x1b\x44\x4e\x4b\x38\x7a\xb1\xf5\xb2\xc0\x63\x1a\xda\x3a\x49\xe7\x98\x2d\x2f\xff\xd8\xfe\xd3\xb0\x6e\xb4\xaa\xed\xd6\x64\x36\x91\x60\xa5\xe6\xed\x1c\x53\xd4\x2e\x29\x33\xdd\x9b\x65\x80\x55\x24\x03\x9e\xfa\x66\xd1\xeb\x7f\x3c\xc9\x00\x49\x4f\x6f\x91\xf1\x92\x42\xd4\x52\x6d\xb7\x2a\x4b\x4c\x0c\xd7\xaa\x95\x7d\x64\xd2\x06\x9d\xca\xc1\xfb\x3f\xc0\x60\xe5\xfb\x11\x9f\xaa\xd5\xdc\x0b\x86\x1a\xcf\x73\x82\xe0\xe2\xc9\x6b\x4c\x0b\x52\x66\x89\xc1\x53\x7d\xe0\x95\xa6\x03\x74\xe9\xbb\x25\x93\x96\x1c\xf2\xf4\x33\xa9\x4f\xdb\x76\xa6\xc3\x06\x00\xd5\xa5\x93\xf2\x93\xcb\xd1\xe8\x56\xb5\x6f\x2d\xd7\x2a\x80\x58\x7d\x7c\x7a\x24\x4d\xa6\xc0\x8b\x25\x4f\x2a\x7a\xeb\x3b\x4d\xfc\xdb\xbc\xe2\x71\xcf\x43\x29\xda\x2f\x42\xf0\x69\x11\x72\x92\x6c\xab\x2c\xf9\x4a\x9d\x63\xa5\x44\x39\x0a\x43\x59\x82\x52\x05\xfc\x4e\xc8\x93\xf8\xf0\xc4\xa3\x13\x9d\x7f\xd7\x89\xe2\x81\xda\x54\x5b\xef\xd4\xef\xaa\x73\xa1\x3f\x3a\x27\xf0\xfd\xd2\xcd\x9b\x62\xc0\x54\xfb\x4d\xd5\xcd\xc8\x7a\xea\x02\x8b\x91\x13\x52\xd0\xcf\xbd\xc5\xed\x24\x20\x04\x94\x38\x69\x4f\x65\xc6\x4d\x33\x48\x51\x5e\x1e\x8e\x2d\xbf\x82\x7b\xb5\xc5\xdd\xcf\x54\xee\x90\x43\x2e\xa7\xaf\x75\x86\x45\x05\x03\xd9\x1e\x9b\x4e\x50\x6f\x25\x95\xe4\xf6\xf8\x5e\x79\x7e\xf7\x23\xb9\x2d\x2f\xda\x2e\xde\xf3\xfb\x1d\x7b\x5f\x5f\x2f\x27\x3e\x7f\x69\xbb\x5c\xe2\x21\x27\xf2\xee\x3e\x5f\xb7\x2c\x66\x3c\x7a\xf1\x50\xf3\x44\x80\x43\xb1\x5f\xd9\x1e\x84\xb0\xb1\xac\x54\xe3\x82\xb5\x43\xde\x57\x54\xc3\x52\x64\x70\xf7\xaa\x8f\x26\xf9\x10\x84\xec\x22\x9a\x87\x6a\xdb\x2b\x19\xca\xaa\x4f\x77\x5d\x9e\x97\xcd\x6f\x81\xcb\x43\xaf\xb6\x41\x09\xa5\x6a\x7f\x98\xea\x09\x7d\x41\xdf\x33\x5c\x93\x52\xdd\x35\x06\xd9\xe9\x22\xe5\x67\xd8\x3f\xe7\x12\xf2\xe5\x90\x94\x19\x01\x5f\x4a\x3e\x73\xae\x41\xa7\x90\x3d\x06\xe9\x26\xb4\xb3\x5a\xdf\x13\xa0\x6f\x24\xc7\xc0\xbc\xdc\x91\x3a\x6f\x0d\xdb\xb4\x70\x57\x59\x65\x06\xb8\x7b\x24\x47\x80\xb8\xd0\xa8\xc9\x79\x0f\x45\x3a\x5c\x59\x65\xa4\xaf\xd6\xf8\xd0\x8b\xf0\xb8\xa1\x53\xa2\x43\x1e\x9b\x8e\x9d\x9d\x44\x03\xa5\x1d\x23\xfe\xdc\x17\x5a\x8f\x1a\x96\x3d\xcc\x9e\x36\x7f\x7e\x9a\x14\x5f\x95\x9e\xb4\xc9\x7d\x4d\x77\x34\xc7\x79\x21\x49\x37\x49\xea\xbe\x9d\x48\x9c\xbb\xa6\x3a\x29\x30\x38\xc3\x10\x00\xb0\xba\x7a\x34\x0f\x0c\x19\x65\xf2\x54\x4b\xcc\x4c\x7a\x0d\xfd\x20\xc9\x72\x7d\x93\xae\x38\x21\x0f\xc9\x7d\x5e\x26\x14\xad\x4e\x7f\x17\x28\x98\x6c\xd2\x2f\x71\x1e\xa7\xa9\x4f\x52\xe0\xde\xd3\xf6\xb2\xb1\x56\x38\x5b\x17\xe6\x1c\x88\x18\xa7\xd7\xb5\x9b\xbf\x6f\x5f\x82\x7e\x8f\x66\xf5\x26\x0e\x3a\x17\x9e\x9c\x13\xa8\x37\x6c\x38\x2d\xa3\x5c\x51\x25\xf4\x54\xcb\xf4\x59\x00\xf6\xfd\xcb\xd5\xf8\x1f\x64\x07\x2a\x47\x34\x8a\xd3\xce\x8e\x87\x2e\x57\xe3\x7f\x90\x8d\x7d\x49\x45\x5a\x15\xc7\x7d\x69\x35\x8f\x79\x9b\xee\x16\x1d\x03\x95\x5b\xa2\xd6\x65\xb0\x8e\x84\x88\x9c\x91\x36\xc9\x8b\x7e\x90\xa3\x23\x49\x75\x20\xe0\xca\xff\x5c\x55\x06\xc3\x13\xc0\x3f\xcd\x53\x47\x83\x38\xe7\xd0\xfc\x6a\x25\x1a\x33\xe8\xd9\x31\x61\x3c\xd6\xe2\x8b\xcf\xdf\x17\x1f\x5a\x7d\x3b\xe2\x4e\xa7\x2e\x67\xe0\xb2\x97\xf5\x07\xe6\xf4\x73\xa0\xf6\xb8\x9c\xea\x50\x2b\x0f\xa6\x65\xc6\xdd\x70\xfe\x31\xd7\x13\xd2\xe8\x38\xa6\xa2\x3a\x18\x0b\xa9\x16\xa7\xec\xc7\xfc\x97\xa4\xce\xac\x7d\x92\x97\xe6\xc7\x72\x7a\xd0\xe9\x48\xb1\xf1\xf9\x1c\xbe\xb6\x2e\x33\xb9\x01\x71\x55\x39\x5b\x65\x07\x56\xd6\xc7\x1d\x02\x00\x60\x56\xef\x32\x99\x48\x55\xa9\xe2\x52\xaf\x86\x1d\x11\xd7\xd6\xcd\x77\xec\x50\x79\x4b\x0e\xdc\xc9\xeb\x3e\x2a\xb9\x63\x6b\xb0\x9c\xf1\x54\xa1\x81\x03\x6d\x65\x9f\x03\xe7\xc8\x26\x6a\x4e\x61\xb7\x2c\xea\x7a\x2d\xfd\x18\x9d\xc0\xc9\xab\x32\xd3\x50\xa3\x2d\x16\xa5\x86\x73\x60\xaf\xe7\x8c\x05\x80\xc2\x0b\x0a\x45\x50\x3d\x80\x26\x4b\xea\xd6\x5d\x53\xfc\xdc\xcd\x9c\xeb\xcb\x55\x14\xaf\x25\xb3\xa1\x49\xb7\x13\x67\xff\xb3\xf1\xf4\x2b\x01\xf7\xe5\xa1\x6a\xda\x73\x96\xa5\x12\x74\xe1\x89\x95\x93\x82\xa5\x5d\x3d\x05\x1a\xcc\xe4\x21\x80\x3e\xeb\x28\x7f\x8f\xa5\x5f\x08\x3e\xa5\x7b\xc2\xec\x00\x4a\x28\x15\xe4\xe5\x43\xde\xe4\xe3\x71\x3a\x9d\xaa\xa9\xac\x52\xe9\xa1\x39\x92\xac\x32\xd0\x28\x08\x8a\xcc\x48\xd2\xb4\xaa\x33\xba\xf0\x58\xb4\x8d\x34\xe2\x86\x00\x38\x77\x67\x77\xd4\x74\x62\xd8\xe2\x67\x16\xa3\x0e\xee\x14\xae\x91\x0a\x5f\xad\x63\x7a\x4e\xc6\x7c\xbc\x95\x54\x29\x92\x2d\xd9\xec\x63\xdb\x56\xa5\xb4\x53\x2d\x89\xcb\x5f\x61\xf2\x4f\x7b\xf9\xa0\x14\xb0\x2d\x3d\xca\xb1\x93\x21\x8a\x5e\xe3\x0a\xa1\x1e\xdb\x1f\x0a\xd2\xca\xb9\xcc\xd0\xe5\xfd\x24\xa2\x80\x2f\x5d\xda\x4b\xc8\x25\x41\x2d\x81\x0b\xb2\x3d\x6d\x41\x08\x9b\xf1\xb0\x24\x3b\x01\xcb\x8e\x40\xcc\xab\x3c\xb9\x86\x33\x4e\xe5\x37\x03\x0b\x59\x37\x80\xba\xb4\x1d\xd4\xf3\x8a\x2a\xca\xcb\x2c\x4f\x93\x96\x6e\xd2\x0d\x67\x3c\x20\x85\x52\xa3\x5f\x4b\x07\x41\xe6\x60\x06\xd6\x9c\x5c\xf0\xdc\x66\x9d\x6a\xd6\xdb\xc7\xdc\xfa\xec\xc6\xd1\x6a\x27\x3b\x95\xf9\x9e\xd0\xef\x38\x1b\x7c\x47\x9a\x3f\xdc\x30\xc0\x68\x7e\xa1\xf8\x56\x9a\x72\xf2\x15\xd1\xf0\x17\x2d\xd5\x9b\x84\x02\x38\x23\x4d\x5a\xe7\xf0\x11\xb6\x79\x15\x79\x79\x62\x0a\xd5\xb6\xbc\x05\xe9\xb1\xae\xbb\x69\x45\x03\x97\xd7\x95\x63\x13\xfa\x21\x4c\x83\x06\x52\xe5\x13\x9c\xd1\x48\x03\x96\x4f\x41\x43\xae\x57\x2c\xfc\xb0\xb8\x6c\x7b\xf7\x86\x5e\x61\xf8\xfe\x5d\xb7\xa2\x5b\xd5\xa4\xb8\xbe\xa0\x1f\x34\x3b\x42\xda\x8b\xd5\xae\x26\xdb\xeb\x8b\x0e\x78\xcc\xed\x7d\x5e\xda\x69\xd3\x5c\xac\xf6\x24\xcb\x93\xeb\x8b\x43\x9d\x97\xed\xc5\xaa\x2a\x8b\x2a\xc9\xae\x2f\xda\x5d\xde\xd8\xac\xe8\x9f\x93\xa2\xf8\xe7\x8b\xf7\xef\xca\x8a\xf5\xe3\x22\xf5\xef\xdf\xbd\x39\xe1\x68\x18\x68\xc1\xec\x13\x3b\x41\x89\x13\x84\x4e\xe4\x78\x31\x71\xb7\x08\x25\x99\x83\x7e\x88\xb1\x73\xf5\xf1\xd6\xbf\x7b\xd3\xc5\x50\xdf\x88\x4d\x95\x7d\x65\xbf\xd2\x3f\xdb\xcf\xf7\xd6\xe7\x3c\xfd\xdc\xb4\x49\xdd\x5a\xc7\xdc\x4a\x0e\x87\xf7\xef\xde\x80\x1f\x33\x05\x4c\xe9\xaa\xa9\xd3\xeb\x8b\xfa\x58\x76\x7d\x6e\x91\x06\x23\xc7\xb7\xe3\x20\x0e\x43\x27\x0b\x36\x5b\x9c\xba\xc9\x26\xde\xa6\x71\x6c\xff\x67\x73\xb1\x6a\xbf\x1e\xc8\xf5\xc5\xbe\xca\x8e\x05\xe9\x4c\x1b\x0c\x83\x75\x69\x14\x95\x15\x53\xb2\xca\xc8\x96\xd4\x0a\x4d\x87\xaa\xf8\xba\xcd\x8b\xa2\xa1\xba\xbc\xad\x1f\xb9\xde\x26\xdc\xa0\x28\x42\x4e\x46\x3c\x6f\xeb\x9d\xa7\x8b\xb6\xd1\x25\x41\x9c\x05\x2e\x4e\x22\x12\x6e\x36\x71\xbc\x4d\x92\xc8\xb8\x8d\xec\xf7\xc6\xc6\x69\xea\x6e\xfc\x30\x8d\x02\x2f\xc0\x0e\x4a\x9c\x38\x48\xa9\x12\x9d\x29\x74\x67\x61\xb0\xc2\x73\xb6\x5e\x90\xa1\x4d\x1c\x27\x8e\x17\x07\xe1\xd6\x21\xc6\x56\xf4\x8a\x34\x5a\x54\xae\xf9\xe9\xa7\x77\x6f\x28\x81\xde\xbd\xd9\xb5\xfb\xe2\xfd\xff\x0b\x00\x00\xff\xff\x5e\x88\x46\x37\x75\xf1\x00\x00") - -func bindataTkgWebDistTkgkickstartuiIndexHtmlBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiIndexHtml, - "tkg/web/dist/tkg-kickstart-ui/index.html", - ) -} - -func bindataTkgWebDistTkgkickstartuiIndexHtml() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiIndexHtmlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/index.html", - size: 61813, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiMaines2015341f46d0b99a14967f1eJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x09\x73\xdb\x38\xd3\x30\xf8\x57\x64\xbe\xf9\xf4\x10\xaf\x60\x45\x72\x8e\xc9\x50\x81\xb5\x8e\x8f\xc4\x89\x63\x7b\x6c\x67\x8e\x68\xf4\x38\xb4\x08\x59\x88\x29\x52\x03\x42\x3e\x22\xe1\xfb\xed\x5b\x38\x09\x52\x50\x8e\x99\x67\xdf\xfd\xaa\x76\x2b\x55\xb1\x88\xa3\xd1\x68\x34\x1a\x8d\x46\xa3\x71\x1b\xd3\xc6\xe1\x03\x3a\xb9\xfa\x8c\x47\xac\x9d\xe0\x31\xc9\xf0\x29\xcd\x67\x98\xb2\x07\x78\xe4\xcf\x20\xb8\x80\xf7\x36\xeb\x1a\xb3\x93\xbb\xcc\xd4\xd9\xc3\xc5\x88\x92\x19\xcb\x69\x01\x93\x3d\x7f\x99\xf3\x87\xe9\x55\x9e\x16\xf0\x8d\x85\x31\xa3\x39\xcb\xd9\xc3\x0c\xb7\x27\x71\xe1\x94\x84\x27\x9e\x22\x33\x9d\x79\x58\xec\x67\xf3\x29\xa6\xf1\x55\x8a\xe1\x64\x0f\x85\x0c\x62\x48\x01\xda\xc6\x0d\x92\x35\x58\xff\xf0\x41\xa6\x2c\xb0\x2d\x15\x6d\x74\xe0\x28\xcf\xc6\xe4\x7a\x6e\xbf\xef\x28\x61\xe6\xf7\x6d\x9c\xce\x71\x44\x39\x88\xd8\x00\x0f\x11\x85\x97\xb9\x84\x0a\xd0\xf6\x62\x9c\xd3\x50\x10\x8b\x0a\xe0\x78\xb9\x0c\x31\x5a\x70\x00\xde\x3c\xb4\x47\x71\x9a\x86\xa2\xe5\x66\x73\xb2\x17\x32\x48\x21\x1e\xd0\x21\xe8\x91\x71\x98\xec\x81\xb2\x5e\x3e\x6e\x24\x7b\x21\x06\xe0\x64\x7d\x1d\x8a\xd9\x9c\x66\x0d\xc6\xe1\xf9\xd8\x34\x7d\x24\xfa\x71\xff\x20\x6a\xf6\xc2\x02\xa7\xe3\xf6\x1d\xbe\x9a\xc5\xa3\x9b\xdd\xc9\x3c\xbb\x61\x37\xd7\x97\x37\x64\x74\x53\xb0\x98\xb2\xcb\x39\x41\xdf\x2c\xb1\x5c\x0e\x86\xa0\x3d\x9b\x17\x93\x70\x30\xe8\xfe\xf4\xf3\x10\x2e\x7e\x7e\xb1\xf5\xec\x59\x34\x9e\x67\x23\x46\xf2\x2c\x64\x60\x61\x7e\x37\xb0\xf8\xd2\x68\x9d\xd2\x7c\x4a\x0a\xdc\xa6\xb8\xc8\xd3\x5b\x1c\x82\x36\x9b\xe0\x2c\xb4\xf5\xc0\x42\xf4\x14\xa3\x0c\xdf\x35\xf6\x29\xcd\x69\x18\xec\xc6\x59\x96\xb3\xc6\x98\x64\x49\x63\x9a\x27\xf3\x14\x37\xfe\x15\xb4\x58\x2b\xf8\x57\x00\x7a\x6c\x42\xf3\xbb\x06\x6e\x8f\xf2\x04\xa3\xe0\xfd\xc9\xde\x87\xa3\xfd\xcb\xe3\x93\x8b\xcb\x83\x93\x0f\xc7\x7b\x01\xc4\x1c\x70\xdc\xbe\xc1\x0f\x05\x72\xda\x50\xc8\x0c\x86\x1c\x5a\x4c\x10\x86\xb8\x4d\x12\x24\xfb\x01\x59\x1b\xdf\xcf\x72\xca\x0a\x84\x39\xec\xfe\xb4\xf5\xe4\x85\xd3\x35\xc9\x23\x8b\x60\x5e\xe0\x46\xc1\x28\x19\xb1\xa0\x47\xdb\x49\x88\xe1\x22\x7d\x12\xad\xb4\xd2\x88\x39\xbc\xfc\xec\x49\x27\x1c\x1e\xed\x7a\xd2\x33\x0e\x3f\x1e\x7b\xd2\xc7\x1c\x7e\x66\x9e\xf4\x82\xc3\x83\xa7\x9e\xf4\x39\x87\xb7\xa7\x9e\xf4\x9c\xc3\xf3\x57\x9e\xf4\x84\xc3\xdc\x97\x3e\xe2\x10\x9f\x79\xd2\x27\x1c\xfe\xfe\xc8\x93\x9e\x72\xf8\x71\xdf\x93\x7e\xcd\xe1\x4d\xd7\x93\x3e\xe5\x1c\xf4\x46\x69\x5c\x14\x0d\xb2\xe0\xea\x47\xb6\xe0\xa3\x3c\x2b\x58\x23\x46\xc1\x7f\x07\x3d\xcb\x4a\xa9\x64\x68\x5d\x73\x21\xe6\x72\xf4\x13\xcc\xe2\x29\x8e\x18\x94\x02\x86\x88\x62\x45\x84\x61\x3e\x53\xbf\x16\x9c\x73\x5b\xbd\x10\xd5\x51\x36\x4f\xd3\x2a\x8c\xa7\xb0\x60\x0f\x29\x16\xf5\x18\x99\x92\xec\xba\x88\x98\x53\x2d\x5f\x53\x6d\x0b\x16\x0c\xcf\x8a\x88\xd9\xd6\xb0\x53\x6b\x54\xb2\xbd\x2a\xfe\xdc\xb4\xc2\x60\x3e\x1e\x17\x98\x45\x02\xa4\x53\x23\x31\xbc\xe5\xd6\xea\x98\xfe\x59\x14\x4d\x63\xd4\xa9\x3a\xaf\x37\xf6\xcc\xe0\xe6\x14\x9a\x28\xf8\x9e\x9e\x74\x21\xbe\x9f\xd1\x88\xc1\x38\x23\xd3\x58\x14\x5e\xd3\xce\x4c\xb4\x53\x9f\xc4\x12\x9e\x9a\xc8\x0c\xe8\x11\x1c\x2f\xe4\x00\xd2\xf9\x88\xe5\x34\x64\xa8\x03\x31\xea\x80\x05\x9b\x90\xa2\x7d\x99\x67\x7b\x79\x86\x0f\xb2\x02\x0d\x86\xd0\x24\x9d\x0b\xe1\x52\x4b\xdb\xc3\x05\xa3\xf9\x43\x25\x55\x0a\x21\x9c\xa0\x8d\xae\x4e\x48\x54\x21\x37\x49\x70\x42\x31\x71\x53\x66\x79\x21\x79\x03\x75\x54\xc2\x2c\xa6\x38\x63\xa7\x69\xfc\x80\x15\x41\x54\x32\xcb\x59\x9c\x5e\x90\x29\x46\xac\x85\xf9\x65\x9e\x1d\x48\x48\xa1\xc1\xdc\x00\x5e\x2e\xc3\x7a\x4b\x1d\x58\xeb\x5c\x7b\x9c\xd3\xfd\x78\x34\x09\x19\xda\x66\x21\x00\xf5\x7c\x34\x18\x02\xae\xfb\x2d\xc8\x5a\x27\x84\x12\xb0\x4c\x94\x11\x35\xdc\x22\xa6\x05\xa7\x84\x22\x42\xa5\x90\x25\x9e\x2d\x37\x89\x8b\x73\x45\xbe\x72\xfe\x55\xa8\xca\xc5\x14\x0a\xc1\x82\xcf\xd2\xf8\xc1\xf4\xda\xad\x65\x3b\x6e\x10\xd7\xdd\x62\x94\x5c\x5f\x63\xfa\x9e\x8c\x68\xce\xe2\xe2\xa6\xec\xaf\x1d\xaf\x0e\x5f\x2d\xb4\x98\x85\x21\x40\xdb\x06\xa4\xa1\x36\xe0\x25\xfc\x55\xba\xac\xa3\xab\xc3\x41\x7c\x16\xcf\x0b\x2c\x3a\x42\x71\xa1\xe1\xf0\x71\x75\x2c\xcb\xe6\xb8\x66\x21\x9b\x65\x59\xca\x76\xd7\x61\x32\x3d\xd0\x55\xaa\x78\x89\x62\x1a\xf4\xf0\xf3\x7a\xe6\x70\x59\x1e\x08\xf4\x71\x49\x84\x92\xf7\x79\x81\xd9\xa9\xe6\xe9\x72\xd0\x2d\x97\x57\x99\xb9\xcf\xfe\xbb\x9a\x10\x75\xf9\xb5\x53\xbf\xca\x0b\x4e\xb5\x0a\xd0\xc7\x2b\x30\xf4\x78\xee\xc6\x69\x7a\x15\x8f\x6e\x04\x1e\x4a\x6c\x63\x14\x48\x54\x03\x84\x58\xbf\x3e\x3c\x51\x8d\x8b\x7b\x78\x85\x18\xb8\x9d\xe2\xec\x9a\x4d\x50\x87\x6b\x79\x72\x5d\x95\x27\x3f\x28\x49\x56\xe5\xc1\xf7\x48\x11\xaf\xfc\xf9\xa6\xe0\x30\x02\x46\x96\x28\x10\xeb\xa5\x58\x10\xa4\x03\x29\xea\x40\x82\x3a\x3d\x45\x22\x3d\x46\xba\x98\xee\x6f\xaf\x83\x50\xd6\x5f\x33\x27\xa2\x4a\x05\x87\x64\x0b\xd6\xd6\x22\x42\xd4\x5b\xb4\x5a\x18\xa1\xac\xd9\x5c\xe1\x72\x00\x65\x41\xcd\xeb\xba\x2c\xad\x94\x35\x99\xa6\xb0\x62\x67\x5d\x94\x54\x8a\x6a\x4e\xe7\xb2\x68\x4d\x76\xba\x88\x52\x9c\xcc\x47\x38\xd4\xaa\xe8\xfb\x98\x4d\xda\xd3\xf8\x5e\x7c\x96\x35\x00\xec\x80\xff\x09\x69\xab\xa5\xdb\x3a\x42\xb2\xb6\x2a\xf0\x7d\x62\xb9\x2e\xa2\xbc\x62\xb2\x94\x7e\x2b\xec\xf9\x3d\x72\xec\x7f\x56\xf8\xbb\x42\xdf\xe5\x73\x2d\xde\x14\x71\xa0\x57\xd4\x79\xa9\xa9\xe0\x01\x2b\x8c\xbf\x52\x52\x95\x00\x8e\xb8\x5e\x5f\xd8\x96\x01\xeb\x45\xfa\x57\xb0\x1a\xdb\x45\xa6\x2e\xf6\x5d\xfe\x77\x3f\x7e\x60\x55\xf8\x3e\x14\x6c\xc3\xff\xb1\xa5\x61\x1d\xa1\xb0\x03\xe1\xbb\x14\xa5\xf5\x4b\x8c\x11\xed\xf5\xc5\xa4\xb7\x56\x2e\xa9\x1a\x14\x31\x67\x4d\x51\x02\x80\x64\x61\x17\xe2\xc7\x4e\x06\x88\xba\x3d\xd6\x76\x9b\xa4\x42\xb6\x54\x97\x29\x05\x90\x7d\x4d\xc0\x08\x91\x8c\x10\x62\xcb\xa5\x23\x5f\xb6\x5d\x0c\x84\x32\x2d\x55\x56\xb3\x57\x16\x1f\x1b\x62\xa1\x6a\x57\x5a\x8b\x3a\xfc\x0a\x8f\x73\x8a\x6b\x7c\xe0\x97\xc0\x95\xa2\xcd\x66\x2d\x41\xca\xc9\xff\x99\xe5\x52\x42\x9c\xa2\x60\x23\xe0\xf0\xc9\x8b\x67\x2f\x9e\x7c\xd7\xd6\x75\x4a\x3d\x5b\xb3\x5d\x0e\x4f\x6e\x7d\x5b\x4e\xc6\x21\xfe\xe2\xdb\x2b\x32\x0e\xdf\x75\xfc\x9b\xce\xb7\x6f\x7d\xe9\x8c\xc3\x7b\x4f\xfa\x11\x87\xec\xbd\x27\xfd\x23\x87\x7b\xb9\x27\xfd\x9c\xc3\x5f\x2f\xfd\x9b\xe0\x3f\xb0\x27\xfd\x57\x0e\xcf\x7d\x9b\xd7\x07\x0e\xa7\x37\x9e\xf4\x57\x1c\x16\xd7\x9e\xf4\x47\x1c\x9e\x3c\xf3\xa4\xff\xc6\xe1\xa9\x6f\x73\xcf\x18\x87\x67\x07\x9e\x8c\x77\x1c\x66\x3f\x7b\xd2\x7f\xe7\x90\xf9\x76\xf1\x98\x71\x78\xe7\xdb\x66\xef\x73\x78\xe5\x1b\x81\x1d\x0e\xd3\x3b\xff\xf6\xfe\x22\xf3\xa4\xdf\x73\xb8\xef\x1b\x81\x09\xe3\xf0\xad\xaf\x07\xd7\x02\xa3\x73\x4f\xc6\x0d\x87\xef\x7d\x2d\x1c\x72\x38\xbe\xf2\xa4\x9f\x70\xf8\xe1\xc2\x93\x7e\xc1\x61\xe2\xe3\xc6\x53\x0e\x8f\x7d\x08\xcd\x05\x42\x3e\xa6\x28\x38\xbc\xda\xf3\x59\x40\x18\x87\x7f\xf9\x2d\x38\xef\x7d\x4c\xfa\x85\xc3\x37\x3e\x44\x53\xce\x41\xef\x36\xa6\x0d\x82\x68\xd8\xed\x3c\x7f\xf2\x33\x90\x4a\x60\x26\xf5\xc5\xd2\x9a\x11\xbb\x46\x1f\xd7\xc6\x01\x16\xd9\x72\x19\x66\xc8\xee\xa6\x0b\x63\x0f\xc9\xa5\x65\x8c\xb4\x4f\xd2\xd3\x30\xd8\xcb\x47\xf3\x29\xce\xd8\x45\x7e\x83\xb3\x40\xb5\x31\x42\x4a\x5b\x53\xf5\xd8\x62\x42\x0a\x96\xd3\x87\xd7\xb9\x52\x0e\x68\x7e\xd7\x70\x6c\x6b\xc7\x39\x6b\x90\xe9\x2c\xc5\x02\x0c\x4e\x02\xc0\xb9\x61\xd4\xf6\x9f\xf3\xce\xd6\x4f\xcf\xc6\xf1\xa8\xb4\x9c\xe1\x12\x5f\x7c\x17\xe2\xe5\x92\x01\x0e\x4d\xc9\x19\xcd\x6f\x51\xd8\x81\xa4\xfd\xc7\x97\x9f\x40\xb8\x18\xc7\x42\x55\x7f\x88\x12\xc8\x04\x7e\x11\x83\xa2\x04\x49\x70\x72\x98\x45\xc1\x2c\x8d\xd9\x38\xa7\xd3\x40\x68\x8f\x1c\x84\xa0\xe7\x98\x41\x4c\x33\x12\xda\xd1\xc1\x6b\x10\x4e\x80\x26\xc0\xdc\x25\xc0\x51\x3e\x92\xc6\x8a\xc6\x61\x46\x18\x89\x53\xf2\x45\xf4\x41\xd2\x61\x52\xa5\x43\x03\xdf\x33\x9c\x25\x45\x63\x54\xdf\x47\x14\xf3\x19\xa6\x56\xab\x49\xf2\x11\x62\xfa\xb7\x52\x77\xf8\xa5\xab\x34\xa6\xba\x45\x74\x47\xb2\x24\xbf\xb3\xdf\xba\x8a\xa6\xb6\xc9\xd5\x9f\x62\x11\x7b\x15\x17\xf8\x0d\xc5\xe3\x03\x9a\x4f\xf7\x4e\xde\x3b\xcc\x15\x82\xb6\x93\x1f\x5a\x3c\x84\x62\x77\x9a\xcf\xce\x59\xcc\xb0\xbb\x54\xe8\x0a\xaf\xd3\xfc\x2a\x4e\xf7\x6f\xc5\xf8\xc7\xf4\x1a\xb3\xb2\x26\x0c\x54\xfb\x81\x5d\xe1\x70\x3b\x4e\x12\x59\xf6\x88\x14\x0c\x67\x98\x86\xc1\x2c\x9f\x15\x02\x76\x00\x19\xdc\xe8\x02\x28\xc8\x85\xdb\x14\x4f\xf3\x5b\xbc\xbe\xa8\xc0\xea\x4d\x5c\x4c\x76\x27\x71\x76\xfd\xff\x08\x5e\x93\xb8\x98\x8c\x24\xf4\xef\xc0\xac\x52\x58\x6a\x0b\x8d\x89\xa0\x62\x55\xc1\x35\xa3\xd4\x16\x79\xb2\x90\x3c\x0b\x18\xe5\xe9\xba\x82\x26\x5f\x41\xcc\x0b\x96\xc5\x53\xbc\x16\xaa\xce\x57\x90\x73\xa9\xbd\xfa\xa1\xe6\x94\xa9\x42\x31\x9b\x7c\x0d\xa2\xc9\x97\x85\x0b\x1c\xd3\xd1\x64\x5d\x51\x95\xab\xf0\x8c\x8b\xb5\xc5\x44\x9e\x50\xe8\xca\xa6\x59\x8d\xa5\x6d\xa3\x88\x71\xb1\x65\xd0\x8c\xa7\x54\x86\x59\x08\xfa\x15\x16\x6f\xd7\x8b\x44\xab\xed\x21\xca\x29\x9e\xa5\xf1\x08\x7f\x03\x96\xa7\x94\x1f\xdc\x38\xa7\x77\x31\x4d\xac\x46\x6e\x00\xd8\x74\x2e\x15\xab\x7a\xb6\x4a\xe4\x8e\x2c\x2c\x6d\x91\xa6\xcc\xb5\x90\x90\x82\x8c\x0a\x8b\xda\x0e\xc9\x94\x92\xd3\xe0\x87\x85\x64\x28\xa5\x58\x98\x83\xef\x10\x97\xe3\x1f\x15\x97\x33\x8b\xeb\xc6\x46\x55\xee\x94\x63\x54\xae\x2e\xce\xd4\x10\x82\x74\x12\x96\x32\x56\xa0\x67\xcb\x5d\x2b\x4b\x3b\x19\x87\x1d\x84\x98\xd6\x2f\x81\x99\xb6\x3d\x95\x8e\x6b\xe9\xca\xd6\x41\x51\xc7\x9e\x42\xb5\x85\xd0\xfd\x8d\xb0\x49\x18\x3c\x0e\x40\xb3\x49\x5b\x2d\x88\xdb\x52\xd9\xad\x27\x6f\x21\x44\xfb\xac\x85\xdb\xc5\xfc\x4a\x28\xa7\xd9\x75\xd8\x05\x51\x57\xa7\x46\xac\x15\x3c\x0e\x5a\x4e\x4f\xa6\x95\x3d\x49\x7b\x1a\xb3\xd1\x24\x7c\xfc\x5f\xcb\x3f\xfb\xcb\x47\x8f\x01\xa4\x08\x37\x9b\xb8\x4d\xb2\x04\xdf\x2f\x97\xa6\x07\x25\x62\x45\x4a\x46\x38\xec\x40\xba\x29\x70\x10\x3b\x86\x01\xdd\xec\x0e\xfb\xdd\xa8\x03\x40\xcb\xe4\x53\x87\x24\xb7\xce\x39\x16\x6b\x36\x83\x7e\xb0\x21\x6a\x75\x86\xfd\xa0\x1f\xb4\x58\xc4\xb8\xe8\xfd\xc3\xff\x71\x0b\xf0\x95\x97\xa3\x68\x9e\x33\x0f\x37\x5d\xb9\x54\x75\x79\xc3\xce\xc5\x9e\xc3\x3e\x3b\x0e\xfb\x8c\x00\x94\x14\xcf\x29\xb9\x26\xd9\x72\x19\x04\x66\xcd\xde\x75\xd7\xec\x78\x36\x33\x6b\x9d\x5e\xaa\x77\xd6\x2c\xd5\x0f\xd5\xa5\x5a\xb3\x63\x75\xbd\x36\xf3\xc2\x68\x02\x76\xf1\x56\xab\x85\x59\x28\xb4\x01\x4f\xed\x0d\x71\xb3\x19\x6a\x1b\xd5\x4a\xfd\xb6\x6f\xa9\x06\xa6\x22\xf0\x8c\x5f\xe3\x2a\x2e\xb0\x5c\x74\x1a\x05\x66\xed\xc6\x69\x8a\x45\x82\x26\x75\x23\x6e\xc8\x23\xe1\xc6\x38\xa7\x0d\x36\xc1\x8d\x9d\xd3\xd3\xcb\x57\x3b\xe7\xfb\x97\x6f\xce\xf6\x0f\x1a\x72\x60\x1a\x39\x6d\xc4\x49\xd2\x88\x15\x28\xac\x98\xa1\xc1\x72\x59\x21\xd1\x4a\x5e\x5b\x9e\x76\x0a\x9c\xaf\x34\x7e\x08\xf3\xec\xfa\xc4\xb1\x52\x8c\x73\x1a\xf6\xd6\x74\xdf\xf0\x3f\x58\x97\x3f\xcb\x67\x21\x08\xeb\x4a\xc7\xda\xd2\xd2\xa6\xe4\x27\x61\x05\xc2\x9a\x71\x6a\xd7\xb4\x08\xe0\xea\x48\x75\xe1\x6b\x3a\xcc\x67\x14\xcf\x62\x8a\xf7\xef\x19\xa6\x59\x9c\x7e\xa0\xa9\x33\x25\xaf\xc3\x6a\x69\xa1\x0f\x88\x25\x2d\x64\x68\xa3\xeb\x48\x0a\x3f\x3e\x66\xf1\x6b\xdd\xae\xeb\x96\x5a\x68\x85\x60\x59\x53\x40\xac\x51\x66\x72\xd0\x66\x93\xf5\x3f\x3d\x5a\x60\xfe\x68\x41\xf9\xa7\x08\xd7\x97\x54\x48\x0c\x4a\xc6\x10\xbc\xda\x37\xda\xba\x0d\x09\x30\xc3\xbe\x8a\x72\x05\x62\x06\x3c\x8b\xed\x7f\xa0\x95\x15\xa0\x19\x58\x59\x86\x57\x2a\xad\x59\x8f\x57\xca\xf9\x17\x66\xe9\x02\x00\x69\x4f\x9b\x72\x42\x8a\xd6\xce\x57\xd0\xb6\x75\xc1\x72\x79\x9b\x93\xa4\xd1\x41\x08\xd1\xe5\x92\x1a\x0f\x09\xf6\xe3\x32\x55\xaf\xd7\x23\xa0\x64\x5b\xb8\x0b\x5f\xac\x2c\xdd\x52\xca\x86\x0b\x23\x5a\x8d\xb0\x75\x9a\x30\xc2\x15\x9e\x7f\xbf\x80\xfb\x4e\xe9\x66\x45\x40\x10\x7c\x4b\xde\x6d\x48\x79\x57\x97\x1c\xe0\xff\x73\xa2\xa3\x94\x04\xea\x3c\xe6\x3b\x26\xb1\xbb\x5c\x04\xff\x15\x94\x76\xb6\xed\x4e\xbf\xa6\xa6\xe0\x35\xb2\xc9\x48\x1d\x8f\x70\x2a\xf7\x40\x16\x68\xf0\x5f\x41\x0b\xfb\x65\x85\xb2\x1f\x7c\x6b\x0e\x77\x10\xca\x34\xb8\x66\x33\xcc\xbe\x25\xec\xd6\x92\xf8\x3b\x45\xcb\xff\x2c\x52\xff\xbf\x24\xfa\xc7\x92\xe8\xd7\x9a\x72\xba\x22\x7f\xf4\x19\xc0\x5c\x7a\xcc\x69\xb5\xed\x76\x86\xf5\x90\xcc\x69\xaa\xa6\x9d\x99\xcf\xce\x11\xab\xa1\xc7\x39\xa3\x31\xc3\xd7\x0f\x88\xf5\xac\xf9\xdf\x5b\xa0\x62\xf5\x58\xb7\xfc\x20\x5c\x97\x78\xd3\xf0\x4d\x48\x41\x9d\x49\x2c\x50\x57\x82\xa0\xed\x6a\x7f\xda\x78\x4a\x58\xb8\x98\xd3\x54\x1f\xa5\x0a\x99\xb0\xd1\x01\x70\x96\xcf\xa2\x8d\x0e\x94\x9b\xbb\x88\xa9\x4d\x1e\x94\x8e\x31\xac\x2d\xfe\x70\xc0\x2b\xba\x84\x2b\x62\xb2\x9c\x4e\xa5\xe5\x29\x5c\x83\x91\xaa\x07\xd6\xef\x2d\x7d\x3a\xa8\x2e\xc8\x49\xb1\x3b\xa7\xf2\x20\x2e\x66\x93\xfd\xbf\xe6\x71\x7a\xa1\xbc\x91\x82\xa0\x0a\x45\xb6\x02\x10\xaa\xe3\xd4\xba\x0d\x31\x00\xbc\x4c\x29\x99\x4c\x74\x94\x92\xd9\x05\x8d\x49\x4a\xb2\xeb\xf3\x34\x2e\x26\xa1\x7b\x56\xe0\xee\x76\x2a\x9b\x36\x06\x2a\xf2\xcf\x6e\x0f\x23\xcc\xeb\x72\xee\x8d\x68\x1e\x7c\x5d\x73\x13\x9b\xa9\xc7\x66\x33\x25\x16\x2b\x24\xb6\x7a\x2b\x0b\x40\x49\x51\x1f\x30\x7e\x6d\x08\x63\x3d\x9c\xd6\x55\xb7\xc2\x8d\x42\xb1\x7e\x42\x2b\x72\xb2\x9c\x91\xf1\xc3\x87\x15\x2e\x0f\xd7\x89\x38\x4d\x5e\x48\x57\x25\xe4\x77\x20\x52\xa9\xf2\x9f\xc4\x65\x9d\x54\xb4\x2d\x7f\x43\x2a\xda\x72\x7f\x5b\x2a\x1a\x08\xdf\x27\x15\xf3\xcc\xf6\xb3\xd4\x1c\x56\x85\x8d\x39\xc9\xae\x4b\xa3\xf3\xf9\x95\x72\x19\x26\x79\x66\x8f\x66\xbd\xb9\x0a\xcb\x42\xa5\x5c\xb9\x22\x62\x3d\xb9\xdb\x73\x9a\x42\x2d\x14\x00\x07\x80\x7f\xa5\xac\x18\x74\xfc\x95\x0e\x98\x83\x3b\x8a\xb6\x95\xc0\x05\xdc\x41\xc6\x75\xfe\x6b\x54\x25\x57\x59\x6a\x91\xe1\x7b\x16\x31\x88\xc5\x06\x34\xc2\x70\x94\x4f\x67\x29\x66\xd2\xe9\xf8\xef\x2e\x2f\x0f\x66\x79\x19\xa9\xc5\xc5\x4a\x8b\x5f\xe6\x98\x3e\x9c\xc6\x34\x9e\x16\xe8\x16\xb2\xf6\xe7\x9c\x64\x42\x02\x48\x59\x81\xae\xa1\x4f\x84\xa0\xe9\x37\x2d\x12\x97\x3f\x62\x91\xb8\xac\x5a\xac\x7e\x75\x4c\x0e\x0f\x00\xba\xf6\x07\xc7\x56\xf3\xc6\x15\x2f\x66\xa2\x85\x8f\xff\x7c\x2c\xed\x41\xed\x09\x9b\xa6\x8f\x1e\xc3\x20\x00\x5c\x30\xf3\x9d\x5a\x16\xc3\xf0\x0e\xdd\x2d\x97\x0b\x0e\x06\x77\xed\x3d\x3c\x22\xd3\x38\x45\x9d\x21\x0a\xf4\xef\x00\xde\x0d\xee\xda\xa7\x98\x8e\x70\xc6\x50\x77\x88\x02\xfd\x5b\x65\x28\x49\x3d\x7a\x40\x5b\x43\x14\x98\x0f\x95\x75\x3e\x22\x38\x63\x64\x4c\x46\xe8\xc9\x10\x05\xe5\x67\x00\xef\x80\x58\x98\xdf\x1b\x0c\xde\xa3\xf7\x0a\x83\xf7\xed\x8f\x98\xe6\xb2\x79\xf1\x23\x80\xef\x07\xef\xdb\x27\x19\x96\xed\x9e\x64\x58\x25\x5c\xdc\xe5\xb2\xb9\x8b\x3b\x5d\xe2\x00\xdf\xc9\x26\x0e\xf0\x9d\x4a\x78\x1f\x67\x0f\xe8\xe9\x10\x05\xe2\x87\x86\xc2\x26\x98\xa2\x67\x02\x8e\xf8\x15\xc0\xf7\x12\x87\x23\x83\xc3\x11\x3a\x52\x38\x1c\xb5\x0f\x04\x27\x30\x89\x85\xfa\x19\xc0\xa3\xc1\x51\xfb\x9c\xc5\x59\x12\xa7\xb9\x46\xa7\xfc\x0c\xe0\x91\x84\x75\x6f\x60\xdd\xa3\x7b\x05\xeb\xbe\x7d\x1c\x53\x9a\xdf\x49\x58\xea\x67\x00\xef\x07\xf7\xed\x9d\xab\x2b\x8a\x6f\x49\xcc\x70\x22\x81\x39\xdf\xaa\xc0\x6f\x24\xc1\xb2\x93\xe2\x87\x4a\x3a\x9f\xe4\x94\x29\x52\x8a\x5f\x01\xbc\x97\xad\x7e\x34\xad\x7e\x44\x1f\x55\xab\x1f\x75\xd1\x4e\x59\xf4\xe3\xe0\x63\xfb\x3d\x4e\xc8\x7c\x2a\x9b\x53\x3f\x55\xf2\x51\x9e\x5d\xcb\x96\xc4\x0f\x95\x74\x20\x64\x9c\x24\xe8\x3c\x4d\x03\xf8\x51\xb6\xb3\x6f\xda\xd9\x47\xfb\xaa\x9d\x7d\x3f\xbf\xec\x0f\xf6\xdb\xaf\x69\x3e\x9f\xc9\xa6\xe4\x2f\x95\x28\x44\x82\x6a\x89\x14\x4c\x25\x69\x5e\x3a\x27\xd7\x99\x6c\xd0\xf9\xd6\x05\xd2\x79\x21\x73\xc5\x68\x9a\x0f\x95\xf5\x9e\x64\x3a\x4f\x8c\xaa\xfd\x52\x99\xfb\xf7\xb3\x3c\x13\xfc\x16\xa7\xe8\xf9\x10\x05\xce\xb7\x2a\x70\x2e\x36\x9d\x5a\x46\x66\xd7\x26\x1b\xfd\x24\x68\xe6\xcd\xb2\x08\xbf\x27\x69\x8a\xd1\x0b\x85\xad\xfc\x50\x59\x87\x99\xf4\xc5\x7e\x40\x3f\x0f\x51\x60\x3e\x54\xd6\x71\x7c\x8c\xba\x8a\x07\x8e\x55\xca\x05\x99\xe2\x73\xb1\x9c\xc5\x2c\xa7\xa8\x2b\x28\x55\x49\x52\xa5\xcc\x84\x32\x74\xee\xba\xb3\xac\x42\x70\x93\xa8\x09\xff\xc4\x29\x67\x46\x00\x54\x24\xcc\xa1\x11\xbd\xc6\x54\x22\x85\xca\xe8\xba\x0b\xc4\x62\x13\xa3\xb3\x70\x90\x0d\x48\xfb\x6e\x67\xd6\xde\x8b\x1f\x0a\x35\x11\x86\xd0\x4d\x2b\x67\xc0\x70\x08\xb1\xdd\xdb\x9d\x85\x31\x74\x4d\xc8\x17\xdf\xdf\xd2\xfb\x3c\x63\x93\x95\xb6\x54\xea\x77\xb6\x76\x52\x0a\x41\xb7\x1d\x0d\xea\x80\xd0\x82\xed\xc5\x0f\x27\xe3\xdf\x30\xbe\x19\x96\xd5\x6e\x2a\xba\xdf\x59\xe8\xa9\xbb\x17\x33\x6c\x50\xc3\x4e\x8b\xa7\xaa\xaa\x51\xfc\x2b\xbd\xcb\x10\xd5\xb5\x8f\xe7\xd3\x2b\x4c\xf5\x1d\x9e\xe1\x00\x0f\x7b\x64\x1c\x5a\xdd\x20\x93\x66\x5e\x8c\x10\x5a\x19\x74\x73\xce\xb0\x06\x90\x9d\x84\x12\x60\x15\x82\x1c\xf9\x6f\xd6\x97\xa5\x86\xdc\x1e\xca\xab\x8e\x1c\x23\xd2\xbe\x39\x7a\x51\x32\xcc\x99\xea\xe6\x38\xa7\xa1\x3a\xf0\xc0\x3d\xba\xbd\xd9\xed\xd1\xcd\x4d\x60\xbb\x22\xf5\x59\x3a\xb4\x67\x23\x03\x3a\xec\xad\xd8\x8f\x85\xce\x9f\xe2\x46\x12\xb3\xb8\xb1\x73\x7a\x18\x35\x52\x27\x61\x9e\xa9\x4b\x53\x89\xb5\xa4\xef\xa1\xc7\xff\x0e\xff\x4c\x5a\xa0\xff\x67\x3b\x94\x3f\xc2\x4d\xf9\x07\xf4\x41\xff\xd1\xe3\x12\xc3\x03\xd7\xf8\x30\x8b\x69\x81\x0f\x33\x16\x32\x79\xa5\x88\x14\xc7\xf1\xb1\x50\x15\x57\xb0\x39\xcc\x6e\xe3\x94\x24\x0d\x92\x31\x7c\x8d\x69\x23\x25\x0c\xd3\x38\x6d\xdc\x4d\x70\xd6\x10\x50\x48\x76\xdd\x10\x9a\xb9\xb5\x5d\x68\xff\x84\xcf\x0b\x79\xf6\xf1\x7a\x8d\xa1\xeb\xf3\x57\x0f\xdd\x55\x97\x91\x3c\x19\x3d\x4d\xe7\x34\x4e\x77\x85\xee\x98\xd3\x07\x6d\x13\xbb\x23\x6c\x34\x09\x8f\xa5\xca\x52\x56\x10\x4c\x05\x16\xa3\xb8\xc0\x0d\xb5\x56\x46\x0a\xa9\xe0\x8b\x58\x2e\x7b\x3a\xe3\x24\xc3\x26\x5d\x2c\x4f\x26\xf9\xe2\xce\x16\x67\x77\x65\xe9\x03\x7c\x67\x92\xc7\xf8\xce\x26\x8b\xa5\xd3\xa4\x4f\xc5\x32\xda\x4b\xf0\x38\x9e\xa7\xcc\x82\x96\xeb\x28\xff\xbb\xfa\x17\x69\x17\xf9\xeb\x7f\xb0\xaf\x2f\xc7\xfd\x8b\x22\x19\x46\x38\x1b\xe5\x09\xfe\x70\x76\xb8\x9b\x4f\x95\xd0\x0e\x31\xe8\x09\x8e\xd5\x93\xb3\x91\x8f\xc5\x0e\x70\x96\x12\x16\x06\xbd\x00\x94\xce\x75\x54\x1d\x9a\x9d\x8c\xc3\x00\x05\x00\x0e\x08\xcc\x86\x68\xb3\x8b\x10\xeb\x0f\xc4\x2e\x65\x18\x0d\xa8\x3d\x3e\x63\x00\x9a\x0f\xd6\xea\x02\x39\xf3\x48\x9b\x51\x32\x15\xbb\x51\x84\x0d\xfb\x27\x78\x05\x1f\x69\x56\xb2\x86\x36\xc9\x40\xaf\xbe\x6e\x9f\x50\x56\x27\xed\x9d\xc1\xd4\x8d\xbc\x3d\x32\x1e\x4b\x3f\x6b\xbd\x2b\xb8\xc1\x0f\xbf\xc6\xe9\xdc\xa6\x1b\x03\x42\x76\xbd\x9f\x22\x6a\xad\xa5\x59\x82\x29\xa6\x88\x40\x1f\x34\xc7\xaf\xbb\x06\xcf\xcd\x21\xca\xe9\x64\x57\xe0\x8a\x1d\x4b\x08\x8d\xef\x64\x9a\x2c\x2b\xcf\xdc\x6f\xc4\x67\xdd\x26\xaa\xeb\x85\x3e\x60\xc0\xdf\x44\xa0\x36\xdc\x01\x42\xec\x61\x86\xc5\x00\xf6\xcd\x10\x3e\xfe\xb3\x68\x3d\x06\x91\x45\x22\x9e\xcd\xd2\x87\xef\x69\xc2\x53\xd0\x74\x00\x48\xe4\xb3\xeb\xdd\x6f\xa3\x6f\xab\xfc\x68\xf3\x7f\x87\xf0\x96\xc0\xdf\xa6\x07\xab\x55\x69\x36\xd5\x72\x56\x1c\x12\x50\x47\xbd\xef\xc5\xc8\xcb\x6d\xed\x31\xc9\x92\x7a\xfd\xf6\x88\x62\x69\xb5\x89\xbc\x1d\xf0\xb2\xe7\xd7\x01\x01\x9e\x5d\xef\xe5\xbb\x13\x2c\xf7\xe8\xc4\x38\x07\x55\x91\xa9\x79\xc5\xd6\x72\xdb\x09\x19\x8f\xeb\x0d\xf4\x98\x71\xe3\x97\xe3\x74\xa8\x6b\xa8\xdd\xaa\x18\x69\x8e\xd3\x02\x37\x6c\x83\x55\xa4\xeb\x0d\x56\x73\xbf\xa7\xc1\x77\xba\x86\xd3\x20\x5f\x97\xb3\x60\x66\xd7\xbc\x93\x88\x8d\x22\xc3\x53\xe9\xf7\x2a\xa1\xb1\xfc\xfa\x3a\xc5\x9a\x3f\xdb\x37\xf8\x01\xb2\xf6\x48\x19\xcc\x24\x18\x00\xa0\xad\xae\x40\xfe\x03\x00\x67\x92\xef\x2d\x80\x05\x6b\xcf\xc4\x46\x25\x9f\x17\xb2\xa8\xe9\xe1\x2a\xc8\x8d\x2e\xe0\x80\xaf\xa3\xf5\x9a\x0e\x8a\xe1\x36\xfc\xbd\x61\xf9\xbb\x4d\x18\x9e\xae\x2c\xdc\x9f\x8e\xd5\x1c\x6d\x8c\xe2\xac\x91\x67\xe9\x43\x43\x21\xd1\xd8\x3d\x3f\x6f\x8c\xd4\x84\x6b\xe0\xfb\x19\xc5\x45\x81\x93\x46\x5c\x34\x14\xe0\x02\x36\xae\x73\xd6\x78\xb4\x90\x73\x62\x27\x7e\x07\x42\xdd\x02\xff\x64\x2c\xb2\xd5\xee\x88\x4c\xb8\xd1\x51\xd7\x43\xfc\x74\x59\x5f\xad\x0b\x0c\x15\xac\x64\x00\x0b\xd6\x6c\x86\x3b\x94\xc6\x0f\x6d\x52\xc8\xbf\x21\x03\xcb\x25\x6b\x90\xac\x60\x71\x36\x12\xbd\x3e\xc7\x62\x5e\xbb\x4e\xcf\xab\x4d\x08\xa4\x40\xa4\x6f\x7a\xdf\xe0\x07\x01\xdb\x56\xc1\xbe\x2a\x18\x6e\x6c\xb0\x01\x1e\x02\x81\x55\x4d\xa6\xfd\x07\xd1\xea\xae\x47\xeb\x2b\x55\x00\xaf\x25\x62\xb0\x08\x19\x62\x7a\x65\x05\xcd\x66\x45\xd0\x5d\x57\x80\x2e\xcc\xcd\x2d\xb3\xcc\xb5\xe3\x24\xd1\x80\xec\x5a\xd8\xce\x62\x46\x6e\xf1\xbe\xf2\x36\x80\xcc\x48\x2d\x5b\xc7\x21\xc9\xd7\xaa\xfd\x3d\xab\xd3\x1f\x4f\x9e\x87\xa4\xfd\xf1\xe3\x53\x00\xcd\x47\xfc\xcb\x75\xf9\x71\xfe\xea\xaf\xf2\xe3\x97\xe2\xb3\xab\x1c\x25\x84\x22\xd2\x4e\x5f\x6f\x85\xea\xf2\x2a\x83\x05\x4e\xb1\xd0\x11\x8a\x68\x30\x08\x02\x18\xe8\x25\x2b\x10\xca\xca\x10\x92\x6c\x36\x67\x45\xb4\x90\xab\x70\x34\x08\x46\x3a\x4f\x7e\x07\x43\xa8\x4b\x47\xb6\x1a\xb7\x7a\x95\xd2\x43\x3e\x7c\x45\x0f\x79\x44\xa6\xb3\x94\x8c\x08\x33\x0a\x48\x76\x7d\x90\xd3\x93\xb1\xd1\x3b\xa4\x2a\x65\xf4\x8e\x51\x3e\xcf\x18\x22\xd2\x59\x6f\x2c\xb6\x5f\xa5\x69\x4b\xec\x7c\xca\x0a\xb2\x44\x1a\x17\x75\x4f\x42\x05\x4d\x97\x94\xd0\x36\xe5\x4d\xbe\x06\xbe\xc5\xf5\x6b\x7c\xb2\xec\xff\xda\x42\xa8\x23\x4b\xe4\x49\xe9\x57\xbb\x21\x0b\x88\x3a\x5c\xaa\x5d\x8f\xbe\xa5\x76\x99\xa5\xff\x96\xe0\xbb\xdd\x3c\x63\x31\xc9\xc4\x8a\xa6\x17\x57\x86\xa7\xb3\x34\x66\xd8\xea\x5a\x89\xd6\xbd\xa8\xd5\xbd\x14\x4d\x9c\x35\x5c\x27\xed\x11\xca\x1e\xca\xcb\x33\x49\xb9\xd6\x6b\xdd\x43\x96\x2a\x75\x0f\x03\x89\xf9\xc1\x94\x95\x2e\x68\x3c\xba\x79\xe5\x5c\x89\x62\x2a\xe1\x20\x53\x1b\x8d\x6a\xa9\x9a\xd5\xd5\x96\x75\xe0\xe9\x3e\x1a\xd9\x50\xeb\x39\x5b\xb3\x54\xbb\xf8\xd5\xfa\xa0\x71\xee\xf6\xaa\x9e\x29\x3a\x57\xe8\xd1\x1b\x2e\x51\x9a\x4d\x0c\x18\x7d\x58\x54\x08\x55\x21\xb7\xd2\x25\xb0\x55\x1f\x4a\x76\xd4\xdd\x04\x7c\x24\x9d\xe4\x3c\x8e\x68\x9f\xdc\x28\x0b\x71\x43\x41\x6c\x14\xf3\xd9\x2c\xa7\x4c\xec\xfa\x72\x29\xc2\x1a\xff\x7a\xb4\xc0\xfc\x5f\x72\xef\xf0\x30\xc3\xe2\xd3\x0d\xf9\x60\xe5\x40\x16\x4f\xc5\x4c\xd7\x8b\x16\x0f\x31\xe0\xff\x6a\x37\x8e\x05\x2e\x6a\x7d\xd2\x90\x8b\xc6\x15\xc9\x12\x01\x9f\xe5\x0d\xb3\x34\x16\x8d\x62\x3e\x9a\x88\x55\x4a\x0a\xde\xa2\xfd\x09\x70\x6e\x29\x9a\x78\x75\x90\x64\x45\xf7\xd0\x74\xac\xab\x1e\xab\x2a\x87\xb3\x12\x9b\x91\x18\x0c\x7b\x56\xb0\x9f\xcc\x30\x95\xc7\x72\xa1\x0c\xb2\x41\x80\x5a\x9a\xd5\xd9\x47\xa9\x02\x1c\x8a\xd9\x56\x5a\x3e\x3c\xd3\x45\x0f\xcb\xfe\xf4\x0a\x8b\x75\xfe\x57\x82\xef\x6a\x5c\x04\xc5\x78\x7c\x08\x57\x67\x09\xdc\xec\xc2\xcd\xae\x71\x43\x43\xa4\xaf\x2c\x0c\x11\x01\x30\x93\x87\xb4\x7f\x09\xdc\x40\x0f\xab\x13\x92\xac\xd4\xdf\x54\x0d\x02\x7c\xf8\x28\x01\xaf\x8b\x20\x6a\x80\x0a\x38\x4e\xed\x0d\x84\x68\xcd\x89\xa8\x06\xe7\x1a\xb3\x90\x1a\x75\xa1\x9a\xa5\x1a\x80\x04\xf4\x4c\x38\x07\x83\x6d\x66\xb1\x8d\x01\xe7\x6a\x67\x6a\x9d\x47\x5f\x62\xeb\xae\xd9\x6a\x69\xdc\x67\x98\x0a\x92\xe9\x53\x22\x3c\xa0\xc3\xb6\x68\x4b\x46\x3d\x69\x53\x3c\xca\x69\x52\x81\x02\x89\x17\x59\x03\xf7\x25\x91\xb0\x6b\x6c\xe4\xef\x58\x7b\x94\x67\x0c\xdf\xb3\x52\x98\xdb\x14\x2d\xd1\x9d\x14\x2b\xa1\xdc\x01\xe4\x96\x9d\x0e\x13\x9c\x31\xc2\x1e\xcc\x69\x97\x3d\x80\x5a\x6d\xda\x6a\xa2\x8a\xb7\x6c\x0b\xce\x92\x23\x15\x2b\xa1\x5b\x56\xa9\xa3\x8e\xf2\x3d\x15\xb0\xaa\x50\xb0\x98\x91\x51\x23\xbb\x36\x52\x6d\x57\x95\x7c\x3d\x8f\x69\xe2\x5a\xff\x36\x3a\x7f\x7f\x71\x2f\x2e\xaf\xca\x25\xfc\xec\x7a\x54\x7e\x88\x65\xff\x07\xd7\xf3\x83\x9c\x8a\xd5\x5c\xff\x3c\x19\xd7\x96\x76\x9d\x1a\x95\xd9\xae\xdc\xd3\xc9\xfa\xcb\xe4\xe9\xae\x9b\x4c\xfd\xb9\xb2\xf8\xff\xb5\xc6\x49\x42\xb1\x9c\x59\x88\xc4\xe8\x21\xac\x56\xd3\xdf\xbe\xcf\xc9\xc2\xbf\x96\xea\x31\x93\xf3\xe4\x0f\xb3\xbe\x4e\x70\x66\xf0\x3b\xc3\x95\x65\x54\xcc\xd4\x35\x59\xa2\x96\xe0\x09\x4f\x0d\x4f\x72\xbd\x0d\xac\x97\xbe\x43\x67\xf1\xf5\x30\x60\x25\x5d\x94\xb6\x1d\x99\xcf\x92\x98\xc9\x96\x42\x60\x61\x5d\xa8\x18\x21\x8b\xb7\x61\x60\x3e\x03\x68\x0f\x74\xeb\x38\xb0\xaf\xf7\xc4\xdb\xc2\x7e\x5a\x60\xa7\x05\xf1\xe9\xb4\x50\x27\x17\xfb\x3a\x51\x2a\x2d\x54\xbe\xd6\x51\xa4\xbf\x82\xb1\x3d\x90\xae\x2d\x06\x29\x8e\x4b\x47\xbf\xef\x1b\x94\x52\xed\x70\x08\xf2\x63\x2b\x4d\x15\x60\x95\xe7\x80\x09\x31\xe0\xa2\xf3\x5d\xe8\x7f\x85\xd5\x7c\xe8\xbb\xbd\xfd\x21\xf4\x6b\x00\x57\xd0\xff\x7f\x49\xb0\xfd\xa0\x2c\x3b\x5c\x95\x5e\x87\x52\x74\x1d\x4a\xb9\xa5\xa6\x45\xe4\x4c\x10\xc3\xc8\x51\xc9\xd2\x75\x29\xf5\x47\x45\xca\xac\xec\x4d\xca\x41\x91\x73\xb4\x16\x77\xe8\xad\x75\xae\xc7\xcd\xe6\x06\xf6\xd0\x7f\xd5\xe2\xf0\x68\xc1\x78\x63\x3a\x2f\x58\xe3\x0a\x37\xe2\x86\x3b\x2a\x8d\xab\x39\x6b\x50\x3c\xc2\xe4\x16\x27\x42\x45\x2c\xad\x0b\x52\x0f\xfc\x64\x6e\x35\xfe\xf2\x5d\xa2\xb1\x22\x09\x5c\x09\x65\x86\x5f\x62\x2b\x2f\xac\x1b\xbb\xd9\xa2\x96\x63\xb6\x17\x75\xb8\xdf\x56\xc9\xce\xf0\x78\x35\x4c\x40\xd9\xe2\x5a\xb8\x6a\x7a\x70\x9c\x8d\x73\x6a\x9d\x82\xe4\xce\x61\xa3\x02\x43\xc9\x0b\x6b\x38\xdc\xb0\xca\xaa\xce\xd7\x9f\x16\x03\xb5\xc2\xbc\xfb\xca\x0a\x53\x06\x2b\x90\x27\x14\x1f\x0a\x17\xd1\x51\x5c\xe0\x5d\xa9\xb2\x18\x92\x88\x4d\xe6\xae\x48\x15\x3b\x17\xa9\x68\xac\x64\x15\xef\xc5\xae\xc1\x86\x04\x68\x64\xd7\xe7\xea\x44\xc6\xd9\x95\xa9\x14\xc4\xa0\xdd\xc7\x96\x6d\x99\x2e\x29\xf9\xb9\xa7\xf0\x92\x80\xc3\x8d\x0e\xe0\x97\x71\x92\x88\xaf\xfa\x26\xcc\xd6\x6f\xb5\x64\x19\x5d\xb1\x6c\x55\xf7\x50\x8c\x5a\xe1\x44\x64\x28\x13\xd1\x60\x58\x86\x3e\x28\x93\xcb\x00\x1e\xf2\xce\x90\x6c\xdb\xbd\x4a\x84\x50\xb5\x57\xbd\x0a\x5a\x2b\x54\xf1\x27\x2f\x97\x78\x2d\x85\x5b\xad\xf5\xc4\xf7\x50\x2f\x5c\x4f\x3e\x7f\xdb\xe0\x6f\x8d\x2d\x80\x98\xfb\x1a\x61\xce\x76\xd6\x25\x63\xb3\xc9\x36\x0c\xb6\x0e\xb3\xf9\xf8\x8f\x59\xc5\x1c\xa3\x4e\x0f\xbf\xf4\x8c\x89\xd6\xcb\xb1\xd5\xf7\xdd\xdc\x01\x1e\xb6\x6b\x53\xe9\xc7\xcf\xda\x7e\x4c\x48\xab\xa1\x5f\x11\xd4\x2a\x39\x2a\x0b\x58\x41\x0c\x7f\xff\x4e\x23\x8a\x9d\x2c\x14\xd2\x76\xc9\xfc\x8e\x28\x91\xca\xdf\x2f\x52\x20\x56\xac\x0a\x65\x89\x1a\x35\x5c\xb0\x6d\x97\xab\xdd\x0c\x91\x02\xfe\x81\xb1\x6e\x9d\x3e\xff\x0e\xfe\xfc\xa3\x2b\x60\x89\xd0\x1a\x02\x8b\xac\xa8\x5a\xb0\x24\x34\x63\xdf\x6b\xae\x92\x67\x7e\xac\x66\x94\xc2\xf5\x33\xc0\xd2\x4a\x75\xce\x1e\x52\xec\x6a\x30\xab\xf6\x28\x59\xa4\x22\xf9\x64\x1d\x06\x6b\xc6\x9a\x72\xde\xae\x37\xd5\xb0\x6f\x9e\xf4\x7c\xbf\xb1\x43\xa2\xf1\x55\x63\x47\x81\x99\x46\xde\xba\x68\x0c\x28\x24\x43\x64\x4f\x81\xdb\x01\xe8\xa9\x2d\x7f\xa8\xa8\x20\xef\x8e\x10\x73\x8f\x89\xf0\x4f\x11\x06\x75\xd3\x72\x09\x76\xb2\xc6\x46\x4c\x21\x5e\x63\x5c\xfe\x56\x45\xb0\x6a\xa2\xf9\xfa\xa9\x43\x89\x8c\x3c\x78\x91\xde\xb7\xce\x49\x85\xe7\x04\xa9\x56\xe3\x07\x8f\x8f\xbe\x51\xfb\xef\x4f\xb6\x8a\xfd\xbb\x62\x19\xff\x1b\xc6\x70\x89\xe2\xea\x4c\x13\xa9\x91\xcd\x2e\xe7\x17\xfe\xea\xfc\xfa\xa6\x8e\x76\xbb\xb2\x11\x28\xd5\xf1\x93\x39\x4b\x31\xdb\x35\x7b\xdc\xb5\x25\xd4\x8c\xcb\xae\x4f\x32\x67\xe8\xc5\xac\x58\x29\xf9\x55\x0b\xce\x19\x1e\xf7\x2a\x48\x35\x9b\xcc\x98\xbd\x98\xf5\x72\xa8\x94\x00\xa0\xd6\x0d\x2f\x7e\x7d\xb6\x56\x75\xac\x17\xfd\x2a\x09\x80\x0a\x01\x2a\xed\x6d\x2b\x88\xae\xa9\xa3\x67\xf8\xda\xdc\x6a\x7f\x8c\x11\xc8\xdf\x0f\x83\xc6\x3f\x5b\x15\x7e\x90\x1d\xab\x28\xac\xf0\xa5\x17\xc3\x68\xa5\x9e\xce\x10\xbb\xa3\x6a\xc6\x6a\xd1\x80\xc3\x31\x8e\xd9\x9c\xe2\x22\x1a\x90\xf6\xc5\xc5\xde\x70\xd5\x73\x86\xb2\x8a\xdb\x9b\xde\xe6\x68\x8f\xa8\x53\x32\xc3\x3b\xf4\x5a\x5e\xc4\x8d\x8c\x11\x7c\x9c\xd3\xc6\x8c\x28\x2b\xb8\x73\x80\x0a\xf8\xbf\xec\x0e\x87\xb0\x85\xe2\x13\xd7\x09\xbd\x7a\xb5\x62\xc5\xb5\x1b\x6b\xd7\x6e\x65\x1a\x14\xdb\x2e\xc6\x39\xe0\x09\x29\x66\xb9\xd2\x54\x59\x7b\x9e\x95\xb5\xea\x01\xe0\x6a\x99\x26\xa2\xee\x77\x60\x22\x23\xb8\x62\xe8\x36\x5c\x69\xb7\xda\x90\x09\x35\x15\x2b\x63\x55\xc6\x60\xaa\x6f\x0c\xa9\x30\x00\xc5\x77\x89\x11\xea\x48\x0e\x31\x62\x85\x92\x9d\xee\x22\x5c\xb8\x0e\xfc\x4e\x7a\x7e\xf5\xb9\x52\xcc\x5c\x3c\xb2\xb2\xa3\x1e\xbf\xcd\x05\x64\xd6\x49\xd3\x3d\xc0\x19\x8d\xb3\x62\x9c\xd3\xa9\x7b\x92\x61\x1a\xea\x97\xba\xae\xf8\x0a\x6b\x95\x4d\x0c\xd4\x12\x82\x59\xf1\x9c\x3e\x45\xa1\x5d\x9d\x1d\xa7\x7f\xb0\xda\x79\xc0\x2b\x05\x16\x65\x77\x59\xbd\xaf\x66\x19\x12\x73\xcc\xdc\xb9\x28\x61\x16\x2b\x57\x1f\x6c\xcd\xb6\x9f\x1b\xcc\xc2\xa6\xf6\x01\x47\x25\x4e\xfa\xb6\x42\xbd\x29\x65\x36\x90\xdc\xff\xcb\xeb\x3f\xc4\x06\xdf\x38\x7c\xc5\xac\x67\x72\x0e\x9e\xde\xb8\x39\x29\xd3\x7e\x90\x7a\xca\xf1\x92\x8e\x8b\x1a\x92\x96\xf9\x56\xba\xe3\x21\xdb\x8f\xf0\x0c\x5f\xd3\xc3\x05\x43\xce\x38\x5b\x61\xea\xb6\x52\xea\x8f\xe3\xf6\x34\xa6\x37\x07\x39\xd5\x7a\xdb\x3f\x11\xa3\xaf\x4e\x60\xf7\x79\xc5\x05\x90\xcc\x30\x22\xed\x3f\x3e\xa7\xe1\x42\x46\x80\x0e\xe2\xe2\x21\x1b\x05\xfa\x5e\x1a\x9c\xcd\x29\x8e\x36\xba\x76\xd5\xce\xbf\x6b\xba\x59\x5f\xcb\x92\x57\x31\xa4\x50\xf9\xdc\x6e\xac\x9e\xe5\x6d\x98\x83\xae\xe5\x32\x08\x54\x58\x3d\xb6\x81\x18\xe0\xce\x78\xca\xa0\x56\x19\xca\x4c\x10\x5c\xd5\x46\x8f\xd1\x07\x1b\xba\xbc\x16\x80\xce\x9b\x0c\x09\xcc\x60\x0c\x53\x7b\x47\xb7\x40\x41\x00\x73\xb4\xd1\x55\x4e\xab\x07\x24\x23\x72\xeb\xa7\x72\x1d\xc2\x32\x7d\xa7\xd7\x81\x21\xa3\x0c\xc6\x57\x42\x6f\x68\x05\x01\x2c\x50\x47\x6e\x41\x43\x8a\xd2\xd2\xbb\xb1\x1d\x00\xb0\xbd\xd9\x6d\x36\xc3\x14\xa5\xf6\x92\x48\xd0\x16\x4b\x12\x00\x30\x24\x28\xd5\xb7\xfe\xc3\xc7\xf8\x31\x01\x60\xbb\xd3\x0f\xe9\xcb\x4e\xb3\x19\x52\x44\x00\xa4\x2d\xd4\x4a\xb5\xf3\x23\x69\x75\x01\x14\x60\xca\x6b\x71\x1d\x48\x00\x88\x4c\xf9\xd4\x5c\x92\x93\x31\x60\x83\x8e\xa0\x66\xda\x1e\x4d\x62\xba\xc3\x42\x02\x7a\xa4\xd5\x52\xde\xb9\x08\xa1\x30\x2e\x8b\x03\x8c\x06\x9d\x21\xa4\xa8\x2b\x8f\xe5\xa4\xd3\x71\xbc\xb9\x59\x87\x10\x83\x1e\x10\xc9\x22\x9b\x6e\x22\x02\xb1\xbc\x00\x8e\x3a\x3d\xf2\x12\xc5\x02\x3a\xcc\x5a\x2d\x80\x07\xd9\x10\x29\xb7\xe7\xd0\x69\xdd\x7a\x62\xd2\xed\xad\x2d\x79\xdf\x19\xcb\x4d\x81\x74\xf1\xdc\xea\x02\x58\x20\xba\xd9\x15\x48\x00\xb8\x48\xc8\x35\x61\x85\x58\xa7\xf4\x75\x80\xa8\x80\xda\x63\xf8\x08\x67\x11\xe5\x3c\x64\xa0\x97\x36\x9b\x61\x75\x8c\x54\xcc\x18\xc4\xda\x0a\xc0\xa0\x53\xfa\x46\x97\x67\xe0\x3a\x53\xf7\x7e\x53\x68\x69\x06\xb2\x13\x54\x46\x37\xdc\x2f\x7f\xb6\xd0\x56\x24\xc1\xe3\xbe\x85\x21\xed\x3c\x1d\xd8\x91\x51\x64\xc4\x56\xa6\x96\x23\xb4\xfb\x12\x7c\x0b\x6d\x89\xb9\x14\x8e\x80\x0a\x4b\x92\x20\xdc\x9e\x92\xec\x30\x63\x70\xae\x7e\x1e\xd0\x78\x04\x27\xe2\x77\x7c\x2f\x7e\x8b\xe1\x8a\x4b\x05\x34\xd6\x31\x68\xf6\xe4\x38\x9a\x38\x94\x3e\xd3\x69\xcc\x1b\xa4\x68\x64\x39\x53\xe1\x41\x48\xd2\x90\x78\x35\x48\x36\xce\x3f\x81\x92\x18\x83\xae\x18\x78\x36\x78\x32\x84\x04\xb1\xc1\xb3\x61\xaf\xbc\xd1\x9f\xa0\x03\x79\xdd\x4f\xa5\xd0\x66\x33\x9c\xa3\x03\x79\x33\x56\xa5\x90\xfe\x04\x1d\x84\x44\x69\x98\xb2\xc0\x7c\x7b\xd2\x6c\x86\x13\x34\x07\x7c\xa3\x3e\x23\xc9\x38\xc4\xdb\x74\x15\xd7\x8b\x09\x6e\x4c\x49\x46\xa6\xf3\x69\x23\x93\x6c\x23\x1f\xa1\x90\x54\x6c\xc4\x63\x86\x69\x63\x4c\x63\xa5\x41\x85\x42\x2d\x02\xa2\x67\x13\x72\x3d\xc1\xb4\xc1\x26\x71\x26\x63\x98\x4c\xe3\x7b\x09\x21\x7c\xb4\xa0\x1c\xb4\x3f\x29\x02\x13\x3b\xda\x30\x13\x4a\xa3\x67\xc4\xcd\xa9\xb1\x0d\x1a\x6a\xc3\x07\x63\x98\x01\x48\x15\xa0\x14\xc5\x2d\xb7\x1a\x2c\x10\x19\xa8\x4b\x00\xe9\x76\x07\x2c\x88\xe1\xe5\x32\xf8\xb0\x5b\x3a\x05\xe5\xc1\x31\x43\x69\x8f\xbd\x34\xc8\xf4\x58\xab\x05\xc8\x80\x0d\x51\x47\xea\xe8\x8b\x0c\x59\x10\x1d\x81\x80\x0b\x07\x75\xa1\xa9\x57\x96\xea\x42\x81\x5c\x17\x40\x32\xe8\x0c\xb5\x10\x52\xed\x74\x7b\xec\x65\xea\x36\x40\xc6\x61\xb1\x8d\x9e\x01\x81\xf5\x66\xf7\x65\xa7\xbc\x5f\x20\x8d\x66\xdb\x69\x0f\x6f\x6e\x02\x22\xd4\xbb\x09\x19\xb3\x15\xf6\x6d\xf5\xca\xbc\x6e\x3d\x4f\x3b\x04\x0c\xd2\xcd\xee\xb0\xd5\x92\x68\xf4\xb2\x97\x4e\x67\x62\xd0\x13\xf2\x81\x98\xa9\x21\x09\x9b\xa3\xce\x06\x42\xb1\x1e\x86\x11\xc2\x55\x32\x27\x88\xe8\xe0\xab\x67\xe4\x7a\xc2\xc2\xba\x3c\x2f\x9f\xba\x18\xd0\x21\x0a\x71\x0b\x31\xf0\xb2\xdb\xe9\xe3\x08\x6f\x76\x3b\x30\x6f\x36\xe5\x8c\x15\xb9\xcd\x26\xdd\x46\xa3\x3e\x51\xb1\x24\xa2\x5c\xd9\x23\xb7\x51\xb7\xd3\xef\x46\x1d\x0e\x3b\xa0\x97\x34\x9b\x61\xd9\xc3\xa4\xde\x43\xc0\xc3\x11\x9c\xc3\x89\xc2\x7c\x86\x46\x86\xb7\xc6\x68\xb4\xca\x52\xd7\x68\x64\x45\x87\xac\x30\x45\x83\xa1\x24\x4b\x8e\x66\x6d\x7c\x8b\xe9\x83\xd8\xe5\x6f\x30\xd0\x1b\xbf\x4c\x7a\xe3\x56\x0b\xcc\x1c\xca\x2b\x02\x8e\x5f\x76\x3c\x39\xdb\x9d\xfe\x14\xcd\x0c\xcb\x8d\xe1\xcc\xde\x8e\x0e\xa7\x68\x06\x67\x42\x9c\x9b\x39\x7e\x6b\x5a\x35\x85\xb6\x11\x6e\xa7\xd7\xe7\xe4\x0b\x6e\x36\x6f\x2d\x58\x0b\x6d\xd3\xe4\x96\x50\xe5\x9d\xcc\x50\x2c\x58\x3d\x0b\x04\xb7\x65\xa1\x1e\xf0\x83\xf8\x36\x84\x6a\xe3\x36\x1f\x16\xe8\x56\x7d\x9d\x86\x62\x7c\x01\x9c\x96\x81\x1d\x8a\x16\x12\xa9\x19\x68\x4d\x9d\x1a\xd7\x65\x4e\xe5\x26\x1a\x68\x05\xad\xa0\x75\xad\x3d\x55\x0a\x5d\xc0\x5c\x15\xb3\x17\x4c\x0a\xc4\xc4\xfa\xb9\x91\xf7\x71\x3b\xc3\xd7\xa7\x14\xb7\x8a\x96\xfc\x79\x3e\x1f\x47\xb8\x3d\xcb\x0b\x93\x36\xcb\x8b\xf3\xf9\x18\x16\x3c\x64\xd0\xe5\x44\x14\x6c\x06\xa5\x63\xce\x42\x89\xf4\xa8\x0b\xb5\x40\x8f\x3a\x50\x8b\xf3\xa8\x03\x15\xb8\x28\x08\xa0\x82\x26\x7e\xa9\x66\xf5\x2f\x9d\x26\x29\x18\x75\x60\xaa\x7f\x70\x21\x9f\x9d\xcb\x14\x42\xa0\x89\x55\x3b\x46\x44\xc8\xf0\x14\x6d\x76\x37\x10\xca\x2a\xaa\x47\x3f\x73\xec\x6e\xd1\x20\xab\x68\x0e\x59\x3b\x8d\x0b\xe5\xf8\x21\x8a\x77\x02\x20\x84\x88\x5b\xc6\x5b\x62\x08\x0b\x94\x8a\x86\x73\x94\x0e\xba\x43\xa1\xb4\xf5\xa8\x26\x12\x2a\x74\xed\xb0\x03\x8b\x12\x93\xff\x0a\x1c\xf1\x97\xa0\x4e\x2f\x79\x99\x1b\xf1\x97\xb8\x1e\x32\xb9\x51\x17\x12\xa0\x95\x0f\xd6\xa7\x66\x59\x44\xd4\x2c\x8a\x28\x69\x75\xa3\xe0\xbf\x6c\xbe\x93\x4a\xf5\x18\xb5\x10\xe3\x46\xa4\x14\x86\x08\x30\x90\xcb\x26\x55\xdc\x89\x46\x83\xee\xb0\x2f\xfe\xd3\xb8\x44\x1d\x48\x35\xef\xa3\xd1\x60\x6b\xb8\x5c\xca\x12\x61\xf9\x1b\x94\x25\x9d\x45\xd9\x44\x1e\xd9\x34\x64\xa8\x7c\x9f\xcf\xc7\xfa\x1b\x62\x14\x57\x88\xd2\xa3\x9a\xe1\x50\x5c\xd2\x0d\x83\xf2\x2e\xf1\xbf\x1e\x5f\x0b\x3d\x11\x52\xcd\x8d\x65\x39\xdc\x62\xab\xe5\x14\xa3\x5b\xa0\xb8\x65\x10\x2a\x01\x18\x94\x6c\x10\x29\xee\x0d\xc7\xe0\xb9\x8f\xa7\x34\x3a\x75\x23\x4f\xde\xa8\xe3\x21\x86\xf6\x0e\x33\x80\xa7\x21\x86\xce\x2d\x51\x00\xa0\xf8\x96\xb7\xdd\xa0\xbd\x35\x07\x29\x70\x1b\x04\xae\x07\x7a\x79\xc3\xa2\xd9\xdc\x50\x17\xc8\xb4\x16\xc9\xc0\xa6\xbc\x5f\x76\x90\xe6\x31\x13\xda\xb9\x51\xea\x6c\xbe\x18\xd6\x40\x29\x0f\x8e\x27\xfb\x9a\x23\x65\xab\x17\xa9\x0a\x9f\x9c\x07\xad\x42\x0c\x60\x26\x90\x54\x5e\x8c\xb1\xf1\x62\x94\xdb\xc8\xb8\x3d\xc5\x45\x11\x5f\xe3\xbf\x71\x32\x54\xee\xc2\xf2\xd7\xdf\xdc\x85\xe9\x8e\x54\xb7\x61\x1d\x6b\x4f\x92\x5b\x93\xfa\x56\xec\xef\x1f\x55\x4d\x73\xb1\xc8\xe6\x3b\xaf\x8c\x3d\x4d\x3a\xde\xab\x3c\x92\x7d\x46\xa4\x3d\x7a\x7b\x1e\x2e\xf4\x35\x7a\x5a\x44\x03\xf3\x3b\xfa\x0c\xe7\x85\x72\xdf\x8e\x5e\xf3\xd2\xe0\xa5\x26\x46\xc2\x50\x70\x45\xf3\xbb\x02\x53\xe7\x79\xa5\x39\x73\x6d\x1f\x08\xa1\x44\xc5\x34\x9c\x7c\xab\x43\xf5\x8b\xfe\x6b\xaf\xf7\xdb\x5b\x6c\x02\x9c\x18\xfb\x19\xab\x44\xa0\x84\x2a\x82\x25\xa8\xb9\x37\xcc\xd6\x79\x51\x99\xe8\x78\xc6\x32\xa2\xaa\x9b\x3d\xba\x7a\x66\x09\x89\xb6\x06\x1d\xd8\x19\xf2\x02\xb3\x13\x99\x66\x77\xc4\xba\x48\xdd\xd5\xbf\x2f\x5f\xe0\x88\xa4\xab\xf0\xf9\x88\xe6\x69\xba\xe6\xb1\x14\xe3\xc8\xaa\x0a\x09\xc1\x0c\xfa\x03\x07\x95\xf6\x2c\xbe\xc6\xbf\xab\x46\x61\x3d\xfd\x0f\x95\x3e\x8c\x34\x76\x12\xc6\x45\xbe\xf2\xae\x8b\xa7\x11\x6d\x49\xd2\xc0\x4c\xcd\x90\x09\xe1\x2f\xf6\x0d\xc0\x42\xdb\xc9\x46\x13\x65\x02\xb0\x2e\xc5\x1e\x78\x7a\xd6\xda\xbd\x47\x55\xf0\x94\x81\xfc\xaf\x31\xd3\xc7\x33\xaf\x1e\x0e\x93\x10\x83\xe5\xd2\x4d\x2c\x5e\x3d\x1c\xc7\x53\x1c\x62\x30\xe8\x48\x05\x9c\xda\x3b\xb7\x52\x0c\x18\xb0\x8e\x40\xd1\x96\xa8\x0b\x8a\xf1\x6f\x71\x7a\x23\x0f\xcf\xda\x57\x79\xf2\xd0\x6c\x86\xea\x87\xb1\x55\x4d\xe2\x24\xbf\x3b\xcb\x73\x26\xda\x94\x19\x31\x63\xf1\x68\xa2\x32\x80\x8b\x66\x1d\xa6\x86\x04\x8f\xf3\x04\x1f\x90\x94\x61\xda\x3e\x7f\x73\xf2\xdb\xe5\xfe\xd1\xfe\xfb\xfd\xe3\x0b\xb3\x21\xa1\xe6\x00\x47\x94\x53\x4a\x1e\xe9\x95\x8b\x09\x69\x17\x16\x07\xd1\x1d\xf6\x4d\xca\xfc\x35\xc7\xf4\xe1\x5c\x9b\xc0\xc3\x4f\x03\x19\x5f\x37\x10\x1b\xa5\x60\xf8\x09\x54\x09\xc4\x45\xfb\x19\xbe\x97\x8d\x87\xa5\x31\x49\xda\xab\xc2\x0a\xbb\x43\x06\x7a\x36\xac\x9b\x19\x68\xdd\x7a\x68\x42\xc8\xc4\x8c\xe1\xe9\x8c\x1d\xe4\xa3\x79\x21\x83\x00\x15\x98\xbd\x51\xd1\x58\xd4\xc0\x9f\x61\xf1\x11\x3b\xe2\xde\xe5\x8e\xd5\x32\xa0\x16\x45\xb1\x1a\x6d\xb6\x27\xa3\x7f\x16\xf5\x5a\xcd\x66\xe8\x49\x45\x0c\x70\x5e\x47\xbc\x12\xcf\xf5\x1a\xb3\x57\xf9\x5c\x3a\x87\xef\xa6\x04\x67\xec\x0c\x8f\x58\x28\xe3\xba\xb6\x53\x3c\x66\xad\x75\x93\x8c\x20\xdc\x66\xf9\x6c\x25\x5f\x4f\x36\xa8\x2d\xa1\x6a\xe2\x9b\xc0\x53\xf5\x79\x44\x37\x33\x31\x93\xc8\x66\x26\xe7\x52\x85\x94\xae\xa3\xfb\x58\xa6\x68\x82\xdb\x50\x9d\x62\x43\x6c\x8f\x31\x85\x22\xc4\xd7\xd3\x74\xc1\xe8\xc3\xf7\xcc\x4c\x7b\x51\x80\xa1\xb1\x8e\xa9\x5d\xa5\x3f\x58\x2e\xc7\x2c\x2c\x9f\xcb\x3c\x35\xcf\x5d\x9a\x23\xae\x5a\x71\xb3\xb2\x6e\x84\x1b\x6c\xb9\xdc\x60\x6d\xf3\x8e\x65\xb3\xb9\x21\x1f\xe2\x70\xae\x0b\x18\x14\x38\xf7\x20\xb8\x28\x2d\x7d\x1b\x1b\x4e\x4b\xcd\x66\xe5\xd3\x12\xb7\xd9\x0c\x9c\xf1\x0a\x88\x96\xa4\xaa\x94\xaf\x4d\x27\x7a\xb1\xbb\x40\x7d\xe3\xf5\xd0\x90\xc1\x60\x85\xef\x02\x73\x32\x73\xcd\x16\x9c\xc3\x9f\xbb\x2f\x9e\x76\xbf\xeb\x7d\x0c\xec\x7b\x92\xf1\xe3\x9a\xa7\x10\xbe\x70\xf8\x9b\xf7\xed\x04\x0e\x8f\x7c\x6f\x36\x3c\xb8\x0f\x06\xc8\x37\x3b\x64\xb8\x04\xfd\x76\x00\x8c\x11\x0d\xb7\x9e\xfd\xdc\xfd\x09\xc0\x14\xd1\xf0\xf9\x4f\xcf\x7e\x7a\x2a\x4d\x72\xe1\xcf\x4f\x9f\x77\xb7\x00\xcc\x11\x0d\x9f\x3e\x7b\xfa\xe4\x19\x80\x23\x44\xc3\x17\x2f\x3a\x9d\x2d\xb3\x74\x26\xe6\x4d\xc5\xb9\xf9\x31\xf1\x9a\x86\x6d\xcc\x9f\x44\x08\xf0\x42\x9e\xe4\xbc\x8f\x67\xfa\x8a\x7e\xfc\xe5\xe1\x83\x34\x98\x6b\x63\x7a\xdf\x26\x1f\x66\x84\xf9\x2e\xe2\x4a\x7d\x41\x96\x9a\xe0\x58\xa8\x26\x25\x44\xa3\xf2\xff\x99\x05\xc0\xf3\x5e\x8c\x98\xfd\x56\x13\x8f\xd4\xb6\x00\x6f\x77\x5c\x59\x6b\x6e\x9f\x63\x00\x85\xd0\x64\xf9\x51\x7e\x87\xa9\x76\xa4\xc9\x6c\x01\xdc\xea\x02\x7d\x63\x4e\x4d\xf3\x69\xfc\x70\x85\xcf\x31\x3b\xae\x74\x56\xee\x65\xa1\x8b\x6b\x7b\x12\x17\x21\xd1\xbe\x0e\x26\xed\x1a\xb3\x90\x00\x73\xc5\x22\xaa\xe4\x09\x51\x42\xe0\x20\x1b\x02\xce\x01\x8f\xd6\x77\x7e\xfd\x0d\xc5\x85\xba\xb8\xc0\x06\x78\xa8\x67\xba\x92\x64\x4e\xd7\x7a\x2b\x74\xa6\xd2\xb6\x3c\xa0\x43\xb1\x0f\x31\x71\x24\xcd\xc2\x50\x45\x8e\xea\x2e\xae\xa1\x01\x16\xfb\x79\x81\xbb\x0f\x6d\x2e\xe8\xc1\xea\xf7\xcb\xca\xd7\xa0\x5c\xb2\xb1\x2a\xce\x32\xee\x9d\xe5\x32\x55\xa9\x7a\xe5\xc9\xa5\x6f\xbd\xb2\x0d\x34\x21\xd6\x96\x32\xf8\xe6\xa0\x33\x54\x27\xe7\x92\x8e\x5e\xbc\x94\x46\x37\xa6\xf9\x34\xf4\xf1\x77\x5b\x86\x65\x2e\x34\x7e\x3b\x69\xfa\x3d\xdd\xf3\x61\xb8\x5c\x4a\x44\xe2\xd9\x0c\x67\x49\xf5\x40\x55\x54\x1d\xa5\x79\x86\xf5\xde\x81\xe9\xe7\x81\x31\xcc\x67\x51\x10\x07\x5c\x2e\xc9\x3f\x52\xa7\x10\x75\x12\x9c\x62\x86\x7f\xa4\x5a\x22\xaa\xad\x19\xf7\x52\x97\xae\x53\x48\x0c\x26\x36\x4f\x1b\xd6\x33\x05\xe2\x32\x76\x5b\xe5\x75\x0c\x2d\x0f\x0c\x03\x9a\x6f\xf7\xd6\xec\x44\xbb\xbc\xe6\xb3\x87\x03\x3b\x38\xa6\xa0\x09\xfb\xaf\x3f\x6d\x84\x10\x23\x67\xca\x93\xbc\x52\x22\xb9\x8d\xa9\x94\x95\x0b\xb6\xd2\x89\x48\xe5\x89\x1d\xaa\x57\xa6\x01\xc0\x4b\x9c\xc0\x82\xf9\xf8\xc8\x32\x82\x62\xbb\xea\xf4\x5d\x99\x72\x18\xb2\x0a\xe7\x60\xd3\xf2\x1a\x5a\xae\xa4\xeb\x4a\x5c\xac\x59\xfa\x0d\x38\x33\x71\x64\xec\x7e\x27\x82\xac\x21\x50\x6d\x18\xbe\x35\x0a\x26\x4b\x92\x1d\x62\x97\x26\x75\xa2\xaa\x37\x9f\x47\x79\x36\x8a\x59\x38\x60\x43\x00\x31\xaf\xd2\xd5\x11\xdf\x82\x07\x6b\xa2\x4b\x47\x71\x61\xed\x7c\xa6\xa2\xb6\x04\x71\x10\xc9\xbf\x45\x10\x69\xd1\xa7\x26\x65\xcf\x67\x77\x70\x04\x9d\x0c\x20\x58\x7d\x79\xe0\xab\xd2\x5d\xa1\x03\x31\xb0\x62\x35\x0c\x62\x69\x9f\x6a\xe7\xb3\x55\x11\x8f\x41\xa4\x6e\xc2\x01\xd1\xe5\x9e\xb6\x88\xb7\xdb\x6d\x5a\x93\x06\x6a\xd8\x08\xe8\x5d\x51\x1c\xdf\xc8\x58\x31\x41\x12\x44\xf6\xaa\x5c\xd9\x9b\x4c\x1d\x50\xb2\x55\x79\x87\x81\xba\xe8\x69\xfb\x81\x58\x7b\x2c\xf7\x27\x82\x79\x37\xbb\xc8\xb5\x1a\x0a\xd6\x55\x27\x68\xaa\xf3\xfd\xaa\x98\xd7\x72\x01\xaf\xe1\x32\x9b\xed\x59\xba\xe4\x4c\x2e\xbd\x90\x7e\x14\x22\xe7\x76\xc6\x55\xe4\xfc\x37\x85\xb0\x67\x1e\x31\x7f\x49\x45\xac\x55\x71\x2c\xa3\x8b\x6a\xc5\x66\xb6\x50\x51\x6f\xde\xe1\x07\x47\x9a\x4f\x65\x3c\x0b\x99\xa1\xcf\xf9\xab\x59\x2a\x32\x4d\xb5\x8e\x27\x5a\x8d\x2d\x59\x07\xe2\x2f\xab\x0d\x9c\x63\xf4\xf8\x7f\x85\x7f\x26\x83\x78\x73\xdc\xd9\xfc\x79\x08\x1e\x5f\x13\x78\x8d\x16\x4f\x3b\x51\xf0\x7f\x05\x30\x78\xb2\x13\x44\x41\x14\xc0\xad\xa7\x51\xf0\x28\x80\xc1\xd6\xae\xf8\x12\x19\xaf\x82\x28\xe8\x89\x14\xf1\xa3\x25\x52\xf6\x82\x28\x40\xe2\xc7\x41\x10\x05\x7d\x91\x25\x7e\x3c\x0e\x78\xaf\xfa\x24\x86\x11\x0a\xab\x01\x80\x1c\xab\xe4\x18\x9a\x57\xe9\xe5\xcb\xf2\xd5\x97\xf0\x50\x48\xd1\xf5\x00\x0f\x41\xb3\x69\x43\x59\xd1\x3e\x8d\x18\xf7\xbf\x86\x21\x2d\x77\x9f\xf4\x20\xd4\x82\x9a\xa3\x05\x2f\x77\x96\xca\xe7\xa2\x70\xc4\xb8\x14\x6c\x42\xe6\x3a\x69\x0a\x73\x21\x0e\xf4\xaf\xe5\x52\x5a\x8a\x20\x93\x9c\x74\x2e\x25\x83\x76\x07\x14\x09\x4a\xa5\x5a\x8d\x66\xa5\xaf\x34\x17\x33\x3c\x22\xe3\x87\xc6\x55\xce\x26\x8d\x12\x40\x23\xce\x92\x46\x59\xdd\x3e\xaf\x30\x8d\x67\x6b\x8c\x1f\x5a\x17\x2a\x8f\xa1\x4b\x7d\xcb\x09\x31\xf9\xef\x3f\xfb\x32\xb0\xa4\x51\x72\x9b\x5e\x1d\x97\xb8\x3a\xae\x8c\xb2\x94\xc1\x58\x45\x59\x22\xfd\x01\x6e\xbb\x4c\xa9\x42\x2e\x55\xd2\xac\x02\x4c\xe4\xeb\x7f\x15\xc6\x74\x1c\x12\xc0\x50\x6c\x18\xe4\x3c\xc9\x94\x34\x4b\xcd\x9d\x5b\x28\x3d\x77\xc3\x0c\xa6\x80\x03\x48\x79\xe8\x12\xb7\x32\x0e\x46\x30\x38\xb4\xd6\x82\x47\x90\xca\xab\xd7\xba\xc3\x52\x59\x23\x4b\x0d\xbe\x2c\x21\xf4\x5d\x03\x4e\x0b\xa3\xaa\x35\x8e\x82\x3e\x8d\x84\xe4\xe7\x46\x74\xc9\x86\x85\xd6\xf5\x0d\xb5\x54\x40\x54\x45\xbe\xa9\x84\x8a\xa2\xaa\x8c\x5d\x55\x1d\x35\xf3\xdb\x2a\x62\x59\x5f\x2b\x84\xdf\xaf\x99\x8a\xaa\x5a\x10\x7e\x4b\x8d\x9c\xc5\x34\x9e\xfa\xf4\x48\x55\x4f\xe3\xe8\x5c\x63\xaf\x6e\x95\xeb\xbb\x0e\xea\xf2\xe3\x80\x0e\x7b\x55\xc2\x13\xd0\x27\xd5\xb8\x22\x8a\x7b\x34\x1a\x54\xa3\xc1\x4a\x34\x40\xe4\x2f\x42\x9c\x22\xce\xc4\x17\x4b\xc7\xd7\x34\x60\x5f\x77\xbf\x47\x05\xf6\xd5\x93\x3a\x30\xcb\x15\x83\xfb\x07\x46\xfe\x56\x23\x21\x06\xa5\xba\x25\x75\x66\x44\xdb\x5d\x66\x2a\xb7\x83\x4a\x2e\x30\x00\x70\x2b\x40\x41\xcb\x53\xdb\x2c\x23\xe6\xf8\xb5\x19\x00\x0e\x9c\xb5\x3f\x90\x01\xb1\xdd\x5c\xaf\x12\xf8\x10\xea\x45\x8f\x46\x6e\x23\xdc\x79\x5e\xa0\x94\xb1\x55\x91\xab\x34\x7b\x88\xad\x58\xae\x08\xe9\x8a\xbe\xc7\x84\xb6\xa7\x35\x7d\xe3\xd8\xa2\xfb\x6b\xd4\x6f\x47\x18\x18\x17\x94\x5a\x7b\xa6\xa4\x4d\xa8\xd0\xbd\x4c\xd5\x23\x50\x57\xe2\x8d\x78\x60\xf5\xf2\x25\xd1\x8d\x82\xad\xbb\x50\xe1\xdd\xaf\xea\x9f\xf6\xc1\xa3\xba\x62\x68\x61\xb7\x25\x4f\x55\x55\x43\xcd\xeb\xb7\xa1\x56\xf5\x80\x23\x0b\x8a\xb2\x92\xd0\x3c\xab\x2a\xa2\x1b\xee\xd2\xd4\x5d\xd8\xaa\x86\xb9\x75\x93\xaa\x2e\x77\x9f\xad\xa8\x63\x25\xb1\x31\xb2\x15\xdb\x85\xc5\x41\xac\x27\x0f\xa0\xa9\xb4\xd0\x2a\x3f\x00\x0a\xbb\x95\x07\x2d\xd6\x60\x1e\xad\x43\x8b\x73\x5e\x1f\x39\xb4\xb2\xc8\x5b\xd5\xec\xca\x77\x47\xd1\x61\x19\xbf\x18\x28\x87\x5c\xab\x7e\x46\x8c\xd7\x0b\x29\x21\xaf\xb7\xaa\x0e\xa3\xb4\xcd\x2d\x32\x39\xd9\xc0\x8a\xac\xb6\x82\x64\x15\xa4\xcd\x51\x0d\x7b\xc4\x79\x29\xb7\x1d\x0b\xe5\x6e\x09\x2b\x28\xe3\x77\xda\x63\x4f\x29\x58\x5f\xcd\xf5\x1d\x21\x77\x47\xe6\xe4\x94\xd0\x76\xbe\x0e\xed\x55\x9a\x5f\xd5\xc0\x88\xa4\xb2\xfe\xf9\xd7\xeb\x1f\xe4\x74\xba\x17\xb3\xb8\x06\xc3\x24\xeb\xb1\xfb\xd5\x1f\xfe\x48\x3e\xfe\xd1\xb3\xaa\x1d\x4d\xcd\xa9\xdb\x55\x9e\x3c\x38\xea\x1c\xc5\xb3\x9c\xb2\x53\x9a\x5f\x53\x5c\x14\xf6\x2e\xea\x1d\x61\x93\x5d\x8a\x13\xe5\x0e\x52\xa6\x53\x5c\xcc\xf2\xac\xc0\x17\x0f\x33\x8c\x82\xcf\x45\x9e\xe9\x27\x6e\xa6\x98\x4d\xf2\x44\xbe\x25\xfd\x61\x36\xb3\xd6\x3e\xf7\xc0\xba\xb0\xf7\x52\xe5\x4c\xdb\xdb\x3f\xda\xbf\xd8\xd7\xb3\xfc\xf5\xfe\x85\xfe\xf5\x66\x7f\x67\x4f\xff\x3c\x39\xbd\x38\x3c\x39\x3e\xd7\x5f\x6f\xcf\x4f\x8e\x4f\x83\xc8\xda\xdb\xab\x41\x3e\x37\x3a\x5c\x9f\xc2\x28\x4c\xc0\x72\x49\xb4\x22\x24\x7b\x5c\x51\x95\x65\xf7\x33\x44\x40\x94\x21\x0a\x33\x23\xfa\xea\xb4\xd8\xc8\x6a\x49\x6b\x68\xb3\x91\xd5\xd3\x60\x56\xa1\x54\xd9\x80\x43\xbd\x6a\x11\x00\x33\xb3\x73\xaa\x19\x08\x91\xcd\x10\x65\x46\xd5\x8b\x24\x36\x20\x85\xf9\x25\xca\x48\x11\x60\xc1\xa8\x2f\x64\x92\x41\x75\x9b\x66\xae\xe6\xba\x26\xc5\x89\x11\x1d\x0a\xa4\x29\xe2\x06\xbf\xb8\x32\xef\xa7\x2b\x98\xb5\xa7\xbf\x65\x62\xbb\x5c\xce\x7b\xd6\xb9\x54\xdb\x05\x0c\x53\xfe\x46\xd8\x44\x07\xb0\xc7\xca\x81\x76\x55\x4e\x06\x7d\xa3\xfc\xd7\x2a\xb4\x42\xb9\x03\xa7\xfd\xa0\x1f\x44\x65\x54\x9a\xcd\x6e\x3f\x68\x06\x51\x10\x80\x16\xe3\xce\xb6\xd9\xd0\x41\x2c\xcb\xd0\x07\x8f\x17\x98\xaa\x67\x6a\x5f\xe5\x89\x13\x75\xca\x5d\x52\x05\x2f\xf5\x45\x42\xb4\x5b\x32\x17\x58\x2e\x77\x2a\x5f\xe7\x95\x2f\xdf\xdc\xfe\x70\x76\x74\x2e\x7d\x97\x4f\xf5\x58\xd9\x0a\xee\x54\xaf\x95\x5a\x2e\x57\x2d\xf9\x16\x29\xfb\x2b\xf2\x82\x72\x0a\x38\x03\x13\x05\x2a\x72\x94\x07\xe0\x72\x19\x5c\xe5\x79\x8a\xe3\xcc\x9b\x59\x3b\x92\xb7\xdd\xed\x8b\x69\xda\x56\x68\x92\xb1\x9b\x13\xf9\x10\xe0\x09\x66\x78\xa4\xae\x0b\x65\x4c\x4c\x84\x37\x92\x11\xd7\x53\xbf\x4a\x5d\x35\x16\x2e\xf5\xdd\x7e\x3e\xcc\xb0\xd2\xf7\x2b\xa3\xa5\xea\x7c\x85\x94\x81\x60\xf3\xc7\xb3\x34\x26\x59\xb0\x8e\x9a\x41\x3c\x13\x2b\xb5\x3c\xb6\x7a\x7c\xbf\x79\x77\x77\xb7\x39\xce\xe9\x74\x73\x4e\x53\xa5\xe4\x25\xbd\xd1\x24\xa6\x05\x66\xe8\xc3\xc5\xc1\xe6\x8b\xe0\xeb\xa4\xd6\x7e\x2b\x3f\x38\x0c\x55\x2c\xa4\x34\x56\x3b\x22\xad\x8c\xca\xed\xbd\x7c\x0f\xa4\x7c\xed\x47\xcb\x47\xb3\x1a\xcb\x0f\xe9\x1f\x37\xa7\xa9\x4e\x9c\xd3\x54\x1e\xd3\xb8\xf2\x49\x67\xb9\x49\x30\x2e\xa5\x2a\xd3\x4c\x58\xe3\x40\x98\xba\x45\x6a\x42\xb2\xbf\x92\x12\xf9\xe4\x2b\x2c\x5c\x18\x55\x81\xdc\xaf\x27\x44\x1e\x41\xae\x9d\x65\x59\x29\xf2\x5c\x89\x07\x47\x48\x2b\x4d\x26\x43\x7d\x18\x57\x1c\x64\xac\x2e\x18\xd9\x98\x4d\xae\xe9\x05\xf7\x71\xe4\x8a\x47\xa3\xd9\x3b\x38\x17\x98\xbd\xb1\xa2\x3d\x47\xd5\xcd\x78\x99\x09\xb4\xbb\x6e\x18\x62\x48\xe5\xa3\xca\x42\x4f\xa2\xd0\x2d\x23\x4d\xac\xb9\xbc\xf9\x5a\x60\x66\x84\x47\x38\x5a\x05\xaa\xf2\xbe\x0a\x53\x15\x91\x20\x47\x00\x40\xf5\x7e\x07\x85\x04\xc6\x50\x6d\xd2\x8a\x68\x04\x35\x99\xa2\x1c\xea\x0e\x46\x09\xac\xd1\xbc\x80\x2e\x5b\x44\x19\xac\x0f\x6b\xca\x01\x97\x4f\x79\x5c\x9a\xa7\x19\x2e\xd1\xa5\x7a\x9a\xe1\xb2\x7d\x8e\x33\xfd\x02\x84\x7c\xbb\xe0\x72\x70\xd9\xfe\x30\x4b\xf3\x38\xb1\x0b\x71\x77\x88\x82\x6a\x92\x2a\x76\xa6\x5b\x55\xb4\x91\x0f\x36\x54\x93\x54\xb1\xbd\xfc\x2e\xab\xc0\x7b\x32\x44\x41\x3d\xb1\x0a\x51\x3e\xe2\x60\x3e\x34\x4e\x85\x7e\x95\x43\xfc\x08\xe0\x25\x28\xfd\x9f\xde\xd4\x55\x30\xb4\xd5\xe9\x40\x8a\x82\x93\x77\x01\xa8\x1e\x34\x3a\x4c\x28\x57\x5a\xb5\x10\x15\x2c\x66\xf3\x0a\x9b\xab\x94\xbe\xf9\x11\x61\xb7\xe0\x85\xbc\x31\xea\x7c\x2c\x97\xd4\xae\x68\x66\x26\x97\x2a\x5e\x7e\x83\x9c\xca\xdb\x02\x39\xbd\xde\xa8\x94\x97\x4f\x3a\x1d\xb3\x13\xb8\xb3\x51\xe1\xdf\x78\x2c\x85\x2a\x30\xbc\xb9\xc0\x26\xa4\x11\xaa\x8f\x42\x45\xf4\x94\x9e\x73\x8d\xbb\x70\x61\x38\x69\xdd\x44\xd4\x5d\xfd\x0a\x15\x1c\xa4\x61\xd9\xfb\xa8\x4a\x8a\x1a\xa1\xa0\x7c\x50\xac\x2a\xdd\xcc\x5b\x47\xdc\xee\x80\xde\xff\xfd\x7e\x43\x8f\x92\x59\x15\x87\x2b\x22\xd9\xa1\xcb\xfb\x70\x21\xcb\x7c\x53\x92\xfe\x9f\x4c\xbd\xa3\x75\xd4\xb3\xa4\x83\x1d\x18\x7c\xc8\x6e\xb2\xfc\x4e\x5f\xde\x0d\xcc\xa9\x85\x74\xb9\x7a\xc3\xd8\x4c\x26\x97\x73\xce\xb0\xae\xd9\x79\x68\x07\xd2\x6f\xb3\x72\xff\x93\x80\xd6\x18\xc7\x24\x9d\x53\xdc\x48\xe6\xd2\x9e\x6c\xde\x47\x18\xe7\xb4\xf1\x68\xa1\x7b\x14\x84\x73\x8d\xd3\x9c\xa6\x20\xe0\x9f\xa2\x6a\x5d\x23\xd6\xbe\x5e\x2b\x92\x59\x0a\x01\xee\xfc\x16\xf4\xe3\x9f\xb4\xb5\x56\x74\x0e\x31\xf5\x57\xdb\x20\xcb\x8d\xe0\xbd\xbb\xb9\x56\xfc\x80\x57\x07\xdc\x0a\x60\xbb\x0e\xc1\xfc\xaa\xc0\xf4\x16\x47\xac\xad\x7f\x41\x2d\xb7\xcd\x92\x56\x17\xd5\xf5\xf5\xb2\x2a\xb9\xab\x4b\xfe\x8a\x18\x5f\x59\xaf\x55\xbc\xa3\x8f\xdf\x71\xb5\x71\x12\x67\x49\x8a\x29\x62\x9c\xe2\xbf\xe6\xb8\x60\x6a\xa7\x2a\x67\x83\x74\xee\x93\x5b\x55\x57\xc5\xfa\x15\x10\xc4\xd4\x9e\x40\xee\x65\x61\xdc\xcb\x10\x35\xb4\xa8\x9e\x96\xda\xe4\x48\xbd\x9a\x4e\xcb\x1d\x13\x2d\x77\x43\x31\x32\x1f\x55\x55\xce\xa4\x46\xda\x62\x57\x1a\xbf\x23\x93\xc5\x01\x80\x04\xa9\x05\x52\x20\x5e\xee\x26\xd5\x6c\xa5\xe5\x44\x87\x56\xce\x65\x76\xc0\xa8\x1d\x30\xdd\x52\x5c\x1f\x17\xfa\xd5\x71\xa1\x35\x55\x4c\x6f\xbc\xeb\xe3\x43\x57\xc6\xc7\xbc\x4c\x22\x9f\xb2\x89\xdb\xf9\x18\x48\x1f\x19\x32\xc3\xa1\xbc\x67\x70\x05\xac\x01\x4f\x8f\x90\xfe\x2b\xcd\x75\xab\x63\xb2\x5c\x06\xf8\x16\x67\xac\x08\xe4\x29\xaf\x66\x3a\x7b\xd5\x54\xeb\x4c\xa9\xd8\x6c\xea\x36\xf2\xf6\x44\xb5\xe1\xc2\x79\x0f\xec\x89\xb3\x05\x22\x15\xdd\xe4\x21\xd0\xd6\x01\xf9\x3b\xd2\x85\x48\x75\xab\xac\x0d\x84\x62\xe7\x71\x25\x4d\x32\xc6\x2a\xd0\x48\x6d\xbb\xa3\xf6\x07\x60\x02\xb5\x1b\x7b\xa7\xf6\x5b\xdd\xd0\xee\xa6\x6b\xec\x3b\x9e\x97\x57\x8c\x54\xb2\xfe\xef\x99\x5b\xa1\x1d\x94\x66\x66\x09\x98\x03\xa0\x8c\x89\x57\x69\x7e\xf5\xcf\x71\x7b\x95\xe6\x57\xdf\x83\x94\x2c\xb8\x1e\x19\x19\x8f\xe1\x87\x90\xf1\x04\xb8\x97\x1b\xa8\xef\x40\x45\xd5\xf4\x22\x53\xb5\xdb\x78\x30\xd1\xad\x00\x2e\xd1\x36\x23\x5f\xa2\x6e\x21\xac\xdc\x51\xf8\x90\x51\x1c\x8f\x26\xf1\x55\x8a\xa3\xc6\x3c\x53\xac\x9c\x34\x34\x87\xa9\xa0\xc8\x8f\x16\x96\xe5\x38\xff\x04\xb8\x73\x5a\xe1\xae\xcd\x7a\x1f\xa1\x64\x95\xb1\x55\xc9\x17\x20\x95\x95\xf3\x6b\xa5\x5f\xef\x5f\xe8\xa2\x42\x14\x7c\xbd\xac\x34\x77\xa9\xc2\x62\x52\xcf\x56\xcd\xac\xb6\xa8\x32\x80\x41\x66\x95\xf3\x50\x0a\x2c\xd0\xd6\xc7\x52\x18\xaa\x22\x97\xbb\x3b\x47\x47\xaf\x76\x76\xdf\x05\xc0\x2e\x10\x6a\x3e\x55\xa5\x8a\x92\x22\x1c\xf0\x5c\x5e\xc4\x2f\xbe\x8e\xa8\x31\xc6\x29\x5c\x67\xca\x0f\xd4\xca\x70\x6f\x95\xd3\x9d\x8b\xdd\x37\xa2\xc2\x7d\x48\x65\x7c\x82\x59\x5e\x11\xfc\xfe\x4a\x27\xe7\x17\x95\x3a\xf3\x6f\x57\xf9\x50\xa9\xf1\xc3\x17\x4c\x32\xf9\xcc\x4f\xb2\xf2\xc4\x4f\xf6\xfd\x4f\xfc\xa8\xb5\x6f\x7f\xcd\x3d\x88\x4c\x2a\xec\x26\xe4\x3c\xc3\x74\x84\x67\x2c\xa7\x08\x73\x2b\x6d\x6b\x27\x5e\xb6\x4c\xf9\xdb\x1c\xad\x64\x2a\x24\x8c\x12\xb5\x87\x2a\xba\x47\xfb\x24\x3d\x0d\x83\x37\x17\x17\xa7\x97\x87\xc7\x17\xfb\x67\xbb\xfb\xa7\x17\x27\x67\xe7\x81\xf2\x9c\xbf\xa8\x2d\xd0\x2e\xc8\x92\x1e\xb8\x14\xfd\xff\x20\x7a\xdb\x0f\x13\x4e\x76\xe3\x04\x3d\xfe\xf7\x9f\xe0\xcf\xe1\x9f\xfc\x5f\xb0\xff\x67\xf6\x58\xa2\x7d\xf3\x1d\x7a\xc5\xfd\x84\x1e\x28\xe8\x88\x39\xc4\x24\x63\x33\x5d\xa4\xd5\x51\x9b\x84\x57\xe4\xd6\x8e\x72\x1c\xc7\x49\x83\xe5\x0d\x0b\xbe\xf1\x56\x4c\xc4\x86\x66\xaf\x86\x58\x53\xf3\x39\x6b\x08\xcd\x50\xf9\xba\xcb\xfc\xf7\x79\x32\x4f\xb1\x92\xd3\x69\x8a\x13\x47\xd6\x89\x16\xd2\xf6\x43\xf5\x4c\xbd\x8a\x6d\xfb\x6a\x4e\xd2\x24\xd4\x97\xea\xf2\x19\xce\x42\x83\x26\x64\x55\xc3\xa4\xd8\xeb\xd7\xd6\xf5\x66\x33\x5c\x59\xeb\xd1\x86\xbc\x72\x6c\xbc\x6f\xcc\xe1\x9a\x76\x24\x91\xfe\x04\x67\xaa\x47\xda\xc2\xc6\x20\xd6\xc7\x97\x30\x90\x67\x73\x15\x3f\xd1\x60\x67\x24\x38\x24\x00\xcb\xa5\xa7\xae\xc9\x85\x2b\x06\x28\xd8\x28\x8d\x67\xb0\xf1\xdf\x8f\xff\x3b\x00\x70\xa3\x06\x5a\x5b\xfb\x36\x85\x14\x0a\xdc\x6b\x0b\xed\xb5\xd6\x40\x7d\xb5\x1e\xe1\x66\xd3\x87\x4e\x05\xa2\x90\x4f\xd2\xfd\xa4\xa6\x34\xd8\x56\xdc\xf4\x9a\x1f\x1c\xf5\x9d\x70\x68\x2b\x8f\x5a\x41\x79\xe9\x22\x52\xb3\x17\xf7\xd4\x83\xeb\x32\xe0\x86\xb9\x1a\x1f\x82\xca\xca\x9a\xd5\x55\x25\x8c\xba\x5b\x5b\x4f\xa4\x32\xa5\xb7\x6b\x5b\x9d\xa7\x91\xf9\x90\xee\xd3\xee\xee\x2c\x38\x79\x17\x40\x15\xa6\x5d\xa8\x4e\xca\xf1\xa1\xba\x01\x2f\x42\x00\x60\x8a\x56\x83\x85\xd8\x95\xf4\xc3\xd9\x91\x74\xeb\x57\x8e\x31\x36\xad\x5f\xf9\x8a\x1e\xff\xfb\xf7\x4d\x4d\xe5\x4d\xf9\x3d\x6d\x33\xa9\xb7\xaf\x6d\xb5\x2f\xb3\xaa\xe9\x61\x50\x81\x12\xe8\x90\x5a\x21\x95\xf7\x6f\xe6\x34\xb5\x73\x06\xd5\xac\x04\x31\xb4\xa6\x0f\x67\xb3\x4a\xe4\x86\x34\xe5\x00\x66\x1c\xa6\x8a\xbc\x29\x66\xb6\x16\x31\xb5\x32\xb7\x56\x2a\x6b\x15\x1c\xc5\x21\x80\xb9\x1a\xa1\xad\xce\x53\x31\x20\xd2\x22\x57\xbe\x7c\x6c\x49\xd0\x77\x38\x41\xa9\xf0\xe6\x53\x79\xf9\x65\xf2\xb1\xfc\xbc\xbf\xd5\xe9\x44\xfa\x3e\xfe\x08\x65\x7a\x47\x9a\x89\x7d\xa8\x74\x94\x94\xfc\x83\x50\x8d\xe9\x4a\xd5\xca\xda\x74\x73\xe7\x2a\x6f\x2f\x47\xb9\x75\x59\x3a\x81\x41\x00\x64\xb8\x96\x1c\x49\xaf\x83\x5c\x99\xd8\xe5\xb5\xce\x30\xd7\x04\x55\xf7\x32\x12\xb0\xc8\x11\x83\x23\x69\x11\xdc\xe8\xc2\x1c\x2d\x54\xb4\xaa\x04\xca\x7d\x48\x2e\xb7\xec\xfd\x10\xcb\x45\x24\x74\xed\x0f\x39\xfc\x2e\x12\x96\x7b\x7f\x00\x71\xdb\xbc\x6e\x1c\x02\x10\x61\xb5\xb7\x95\x40\x8f\x42\xdd\xee\x8f\x43\xe5\xb0\x40\xd6\xb3\x43\x3e\x06\x4f\xd4\xb0\x29\x06\xb1\x90\x99\x81\x67\x26\xc8\x72\xd9\x71\x21\xd7\xe6\x4d\xd5\xf6\x20\x5b\x25\x65\xab\x3d\x8b\x3c\xe0\xda\x5a\x6c\x2f\xf4\x8c\x10\x41\xdb\x8b\x7c\xb9\x34\x54\x8b\xc5\x04\xcb\x85\xb8\xd5\x13\x5e\xdd\xfd\x5c\xb5\x33\x42\xf1\x81\x93\x88\xb4\xd5\x0f\xde\x33\x11\x28\x76\xf3\xe9\x6c\xae\x6f\xf3\x84\x59\x9b\xe5\x2c\x4e\x11\x51\x7f\x01\x54\x72\xc6\xc3\x34\x1b\x1b\x55\xa6\x94\x95\x67\x31\x15\xf2\x5f\xda\x04\xab\xd9\x62\x84\xd4\x38\x03\x0e\x13\x49\x55\xe5\xc9\x6b\x10\xae\xda\x54\x0d\xba\xcc\xa2\xcb\x7c\xe8\x52\x8d\x2e\x33\xe8\xea\x46\x28\xe0\xf6\x66\x74\x3b\x4e\x92\x7d\xb1\x4f\x34\x6f\x6b\x87\x81\x80\x19\xc0\x54\x6c\xc8\x57\x33\xb1\x1a\x95\xc2\x9f\xcb\xc8\x14\xe7\x73\xb6\x36\x3f\xbe\x92\x2f\x07\xcb\x85\xb2\xba\x8b\x96\xe8\xae\x56\x98\x59\x9b\xef\xc8\x3a\xc3\x10\xb1\xb0\xcc\x25\x41\xca\x5f\x5f\xad\x9b\x00\xe5\xa6\x97\x25\x21\xb1\x54\x30\xa4\x3d\xc7\x19\xe3\x00\x4a\xf9\x64\xe2\x69\x7e\xa5\xd3\xde\x02\x65\xbf\xd6\x14\x70\x68\xea\xcd\x77\x09\xe7\x25\x8d\xb7\xd6\xf7\x53\xe7\x1b\xd5\x15\x81\x28\x8e\x93\x07\x19\x09\x57\x9a\x4b\xf6\x4e\x8e\xf7\x05\x08\xd9\xb9\x50\xde\xc7\xf9\x9b\xfa\x3a\x69\xbf\x3d\xf8\x47\x2a\xbb\x9c\xde\xa7\xae\x02\xfd\xfb\xf9\xd9\xc1\xe5\xee\xc9\xc9\xbb\xc3\xfd\xcb\xe3\x9d\xf7\xfb\x01\x80\xc7\x2b\xf9\x62\xc7\xb6\x7f\xa6\xf3\xb5\xe2\x7f\xa6\x5e\x58\xdd\xfb\xce\xd0\xb7\x49\x3e\x32\xdb\x01\xf3\x24\xbf\x71\xcf\x18\xe5\xf9\x0d\xc1\xc7\xf1\x14\x9b\xc8\xb7\x32\x18\xb4\x4c\x55\x87\xa6\x28\x08\xca\x8c\x0b\xd1\x51\xc7\x9d\x43\xae\x0a\x3a\x86\xb8\xd8\xa8\xca\xfc\x50\x07\x0b\x10\x3b\x41\x1a\x98\xc3\x54\xd3\x72\x25\x50\x58\xe5\x1c\x3f\xc9\x47\x1a\x1f\x15\xaa\x42\x0f\x93\x71\x1d\xab\x23\xe6\x38\x1c\xd8\xd8\xe0\x75\x4c\xe5\x6d\xf2\xf7\xf7\xc0\xfa\x89\xd9\xee\x82\x35\xbd\x65\xa0\x06\xe3\xef\xf3\xcb\xbb\x0e\x80\xea\x77\xd6\x3e\xba\x22\xe6\xe3\xf4\x1f\x70\x11\x3c\xf8\xae\xe7\x44\x24\xa4\x73\x4c\x6f\xc9\x08\x9b\x91\x57\x2b\xa3\x1c\x69\xcc\x6b\x5b\xb2\xf2\xb4\x76\x4e\xd3\x9a\x8a\x2a\x86\xf2\xf5\xfe\x85\xbb\xb3\x59\x2e\x95\x1d\xa1\x92\x24\x57\x40\xca\x0a\xb1\x93\x08\x83\x09\x63\xb3\xe8\xf1\x63\xad\xcf\xd7\x32\x0a\x99\x03\x56\x37\x82\xf6\x4e\xc6\x4a\x2f\xda\x25\x73\xd5\xdc\xd3\x89\xbc\xa1\x5a\xb9\x73\x56\xed\x2e\x10\x8c\x82\x98\x71\x07\x5d\xb1\x73\x2b\xf7\xb0\x6a\x1d\x48\x80\x52\x39\xfe\xfe\x1e\x55\xb3\xc1\x99\x19\xf6\xe3\x7f\x32\xec\x9f\xbf\x6b\xd8\xaf\xe2\xd1\x0d\xce\x92\x72\xeb\xff\x59\xde\x34\xb7\x73\x7d\x12\x93\xcc\xb8\x4a\x3b\x5b\x57\xd7\xe5\x41\x96\xa9\xf9\xd7\x18\x38\xd2\x4d\xee\x10\x0e\x86\xda\x3f\x46\xc1\x63\x95\xa8\x4f\x7a\xff\x27\x37\xbd\xa5\xa7\x9e\xc1\xcc\x46\x96\x2b\xeb\xff\x73\x0a\xcf\xcb\x59\xf6\xa5\x78\xf2\x4f\xa8\x5c\x7b\xb1\x7a\xa1\x1f\x10\x49\x48\x21\x94\x11\xeb\x23\xb2\xc8\xae\xd5\x6e\xbc\x8c\x69\x51\x89\xb5\x71\x50\xc6\xda\xb8\xe0\x43\x6e\xde\x21\x11\x1b\xe8\x13\x6d\xfa\x72\x0d\x5f\x6b\xc0\x61\x47\x58\xf5\x2d\xec\x53\x01\x5b\x05\x10\x75\x0b\xf0\x68\x30\x14\xdc\x6a\x19\xb8\xac\x71\xec\xd6\x28\x0b\x88\x1a\xc3\x7f\x12\x37\x7f\x9a\x27\x28\xfb\x4a\x30\x92\x6c\x25\x18\xc9\x01\xb4\x48\x1d\x0a\xa4\xf6\xef\x49\xc1\x48\x76\x1d\x1d\xc0\xe9\x3c\x65\x24\xda\xe8\xf0\xb2\xc8\x59\x49\xc5\x3d\x27\xd9\x21\x80\x5c\x1f\x37\x2f\x4e\xde\xed\x1f\x07\x4e\x89\x63\xb7\xc4\xa6\x5b\xc6\xc6\x3d\x81\x5f\xfe\xa3\x31\x59\x7e\x8c\x0c\x1f\x4b\x54\x93\xb2\x8f\x9f\x39\xbc\x29\x33\xe6\x15\xfa\xdc\xf0\x21\x24\x53\x79\xd3\x3e\x1a\x0c\x5e\xb7\x5d\x4e\x5a\x94\x4c\x50\x21\x08\x2c\x87\xba\x4e\x06\x30\xb4\x84\xe0\x50\xde\x2a\xff\xae\x4b\xef\x09\x7e\xed\xb9\xad\x3e\xa3\x1c\xb2\x2b\x4f\xc6\x4d\xc2\xe1\xce\xc1\xcc\x77\x51\x3e\xe1\x90\xcc\xba\x9e\x9c\xa3\x84\xc3\xdd\x8f\x6f\x3c\x39\xf7\x09\x87\x93\xd7\x3e\x04\xde\xcf\x39\xfc\xb2\xe5\xbb\x78\x7f\x3b\xe7\xb0\x78\x75\xe2\xc9\xf9\x75\xc4\xe1\x39\x49\x3d\x39\x8f\x12\x0e\x2f\x7f\x4d\x3c\x39\x7f\xe5\x1c\xee\xbf\x1d\x79\x72\xce\x12\x0e\xcf\x5f\xfd\xe5\xc9\xf9\x25\xe7\xf0\xaf\xa3\xcc\x93\xf3\x26\xe3\xf0\x76\x86\x3d\x39\x69\xc2\xe1\xf5\xfd\xbd\x2f\x90\x40\xcc\x21\x7b\x45\x3d\x39\x7b\x94\xc3\xdf\x0f\x0a\x4f\xce\x09\x87\x27\xe9\xa9\x2f\xfa\x00\xe5\xf0\x4b\xf1\xc4\x93\x93\xa5\x1c\x1e\x1e\xbe\xf2\xe4\xdc\x25\x1c\x7e\xfc\xf8\xd4\x93\x33\x1d\x71\x18\xff\x72\xed\x8b\x66\x30\xe2\xb0\xc8\x7d\x03\x77\x9c\x70\xf8\xc7\x3b\x1f\x6e\x17\x23\x0e\x6f\x9f\xf8\xba\x73\x35\xe7\x70\xd2\x21\x9e\x9c\xc3\x11\x87\xa7\xbf\x7f\xf4\xf5\x74\xce\xe1\x59\xc7\xc7\xa2\x7f\x24\x1c\x1e\x90\x3f\x3c\x39\x07\x94\x43\x7a\xf9\xc1\xc7\x6e\x09\x87\x47\x57\x3e\x0c\x4e\xc4\xc0\xfd\xbc\xe3\xeb\x4f\xc2\xe1\x2f\xc5\x67\x4f\x0e\x1b\x71\x78\xf0\x47\xee\xc9\xf9\x3d\xe7\xf0\xed\xc9\xd4\x93\xf3\x9a\x72\x78\x41\x1e\x3c\x39\x74\xc4\xe1\x5f\x4f\x7c\xb4\xbe\xca\x38\x64\xb3\x8e\x27\xe7\x33\xe5\x70\x7f\xe7\x57\x4f\xce\xb9\xa0\xdb\xb5\x8f\xe1\x8f\x46\x1c\x26\x7b\xbe\xd1\xa6\x73\x0e\xf7\x1e\x7c\x18\x4c\x29\x87\xaf\xc7\xbe\x76\xc8\x88\x43\xf2\xf3\x91\x27\xe7\x9a\x72\x58\x5c\x7a\x85\x8b\xa8\x33\xf6\xe1\x76\xc0\x21\x3e\xf0\x0d\xc2\x6c\xce\xe1\xeb\xa7\x2f\x3c\x39\x23\x91\x33\xf3\x01\xbb\xe5\xf0\x72\xf4\xcc\x37\x7d\xe7\x1c\xfe\x7a\xe4\xe3\x82\x78\xce\xe1\x68\xcb\x37\xb1\x4f\x13\x0e\xbf\x9c\x4f\x3c\x39\x1f\x62\x0e\xef\x76\x7c\xa2\xf2\xa8\xe0\xf0\xf6\x8d\x4f\x20\xee\x72\xb8\x4f\xf6\x7c\x38\x67\x1c\x4e\x77\x7f\xf3\xb1\x14\xe1\xf0\xaf\x2f\x3e\x69\xf4\x99\x70\xf8\xf6\x57\xdf\x44\xf8\x42\x38\x9c\xbd\xf2\x31\xce\x5f\x84\x43\xfc\xca\x37\x38\x1f\x08\x87\x47\xcf\x6f\x3c\x39\xaf\x44\xce\xce\xef\x3e\xb9\x4b\x38\x1c\x5d\xfb\xd6\x84\x37\x05\x87\x17\x9f\x7d\x53\xe4\x72\xce\xe1\xcd\x91\x6f\x44\xef\x0a\x0e\x1f\x26\x3e\xf9\xfe\x9a\x70\x98\xfc\xe5\xc5\x8d\xc3\xe2\xd0\x37\xa2\xe3\x94\xc3\xdd\xbf\x7c\xcb\xc8\x69\xca\xe1\x2f\xaf\x7d\x64\x3b\x49\x39\x3c\x78\xea\x6b\xe6\x26\xe5\xf0\x6c\xcf\xd7\xce\x3d\xe3\x70\x27\x7e\xe7\xc3\x80\xc3\x2f\x4f\x7c\x21\x67\x0e\xc4\x88\x9e\xf8\x04\x4b\x9a\x72\x78\x71\xe1\xe3\x8f\x73\xc6\xe1\xe5\x2b\x1f\x17\x7c\xc9\x39\xbc\x9f\x3d\xf7\xd1\x26\xe3\x70\x7e\xe8\xeb\xce\xae\x68\x27\xf7\x51\x9a\x16\x1c\xbe\xa6\xbe\x89\x70\x55\x70\x88\x6f\x7c\x58\xe3\x82\xc3\xf3\xb9\x6f\xac\x77\x13\x0e\x7f\x9f\xf9\xc4\x21\x66\x1c\xa6\xaf\xb7\x7c\xf3\x9a\x71\xf8\xc7\x97\x9f\x7c\x3c\xc5\xe1\xe8\xed\xb9\x8f\x71\x38\xcc\x77\x7c\x4b\x5f\x2a\x60\x7d\xf6\xf5\x33\x11\x39\x4f\x7c\x54\xbb\x4c\x39\xbc\xfc\xe0\x5b\x92\xee\x53\x0e\x5f\xdf\xf8\x74\x96\xc3\x94\xc3\x57\xbf\xf8\x28\xbd\x9f\x72\xf8\x90\xf9\xf4\x82\x8f\x29\x87\x7f\x7d\xf4\xc9\xbc\x23\x31\x3a\xd7\x3e\x0c\xde\xa7\x1c\xee\xcf\x7c\x18\x5c\xa4\x1c\x66\xcf\xbe\xf8\x14\x03\xca\xe1\xe1\x8d\x0f\x83\x5d\x31\x6e\x7b\xb7\xbe\xfe\xe4\x1c\xfe\xc2\x2e\x7c\x53\x24\xe7\xf0\xf8\xd2\x27\xf4\xf6\x73\x0e\x67\xbf\xf8\x96\x8a\x8b\x9c\xc3\x8f\xf7\x3e\x05\xe4\x26\xe7\x90\xbd\xf1\x49\xbd\x8f\x39\x87\x47\x07\xbe\x25\xe9\x84\x72\xf8\xe8\x85\x2f\x34\x53\x4a\x39\x3c\x4e\xde\xfa\x94\x16\x21\x0c\xce\x7c\x02\x79\x27\xe1\x30\xbf\xbf\xf3\xc9\x9c\x94\xc3\x9d\x23\x1f\x57\x93\x84\xc3\x74\xe4\x1b\x9f\x2c\xe1\xf0\x4d\xe1\x9b\xa5\x1f\x84\x68\x79\xc4\x7c\xb3\x54\x88\xa3\xe7\x3e\xac\xdf\xa4\x1c\x16\x3f\xef\xfa\xe4\x6e\xca\xe1\xfb\xd7\x3e\xbe\xfe\x2b\xe5\x70\x2f\xf1\x51\xe7\xed\x88\xc3\x5f\xdf\x79\xf5\xdd\x11\x87\xbf\x1d\xf9\xe6\xcf\xbb\x11\x87\x37\xfb\xbe\x9e\xfe\x3e\xe2\x30\x7d\xe6\xab\xc3\xc4\x3e\xe1\xb5\x0f\x83\x87\x84\xc3\xf7\x3b\x3e\x05\xf1\xd7\x94\xc3\xd9\x1f\xbe\xa9\x7d\x9f\x71\x88\x6f\x7d\x9c\x78\x94\x71\xf8\x76\xec\x93\x13\xef\x33\x0e\x77\xdf\xf8\x30\xf8\x8d\x71\x98\xbf\xf5\xc9\xd7\xdd\x8c\xc3\xa3\x73\x2f\x87\x64\x1c\xbe\x7a\x7e\xe6\x93\x95\x8c\xc3\x9b\x3f\x7c\xb8\x15\x8c\xc3\x0f\x89\x6f\x96\xb0\x82\xc3\xdf\xbc\x9a\xce\x59\xca\x61\xf2\xc2\x17\x5a\x6c\xa7\xe0\xf0\x8f\x63\x9f\xa6\x73\x9e\x72\xf8\x5b\xd7\xb7\xc8\xbd\x11\x3b\xa2\xb9\x4f\x15\x1e\x17\x1c\x9e\xfc\x35\xf7\x29\x6e\x05\x87\x13\xe2\x93\xf0\xd3\x82\xc3\x9d\xc2\x87\xdb\x6d\xc1\x61\x9a\xf9\xb8\xea\x41\xac\x24\x63\xdf\x42\x92\xb8\xa1\xd2\x74\x24\xb4\x0c\xd1\xf0\xd9\xd3\x17\xcf\x75\xa8\xb4\xe7\x4f\xb6\x5e\x6c\xa9\x50\x69\xcf\x9e\x3f\xff\xf9\x89\x0a\x95\xf6\xd3\xcf\x3f\x3d\x7f\xa6\x42\xa5\xfd\xf4\xec\x49\xf7\x67\x15\x2a\xed\xd9\xd6\xd3\xa7\x5d\x05\x30\x11\x9f\xdd\x27\x9d\x9f\x9c\x47\x81\xe6\xce\xf4\xc4\x77\x8d\xa2\x7d\xff\x4b\xe9\x53\x2b\x2f\x1a\xda\x18\xed\x0d\x92\x35\x18\x20\xe3\x90\x0d\xf0\x10\x21\x34\xb1\xc6\x4e\xfd\xda\x89\x89\x4a\x91\xcf\xd3\xa4\x61\xdf\xda\xa7\x38\x8b\xa7\x38\x69\xcc\x74\xfc\xba\x46\x9e\x35\x58\x4c\xaf\x31\xd3\x4f\xee\xb7\x03\x27\xe8\x86\x76\xde\x12\x8d\x6a\x03\xae\x68\x16\x03\xdc\x9e\xc4\x85\x13\x05\x2f\xa4\x40\xd9\x48\x57\x53\x43\x36\xa0\x43\x84\x65\x3c\x05\x0b\x77\xbc\x36\xdc\x6f\xf9\x44\x03\x19\x87\xf5\x28\xa9\x3a\x33\x18\x04\x2d\x26\x2f\xbc\x8f\xcd\x7d\x75\xd8\x08\x40\x2b\x18\x06\xe5\x4b\x08\x06\x52\x10\xb4\x54\xec\xcc\x76\x7e\x8b\x29\x25\x49\x82\x33\x69\xb3\x55\xd9\x9f\x1e\x2d\xea\x39\xfc\x93\x2a\x9f\xd5\x4a\x65\x2a\xaf\xf4\xba\xa8\x5e\x07\x54\xcd\xe2\xb2\x59\xec\xb9\x22\x2d\x63\xd0\x69\xf3\xb2\xbe\xeb\x87\x23\x5c\x09\xc5\x4d\x1d\x3a\x5d\x57\xfc\x99\x6a\x4f\xa3\xf4\xb5\x55\x15\xf7\x83\x20\xc2\x91\x6e\x5f\xe7\xe2\x3e\x8b\x58\x2b\x68\x04\x2d\xac\xfd\x3b\xa6\x68\x12\x2e\x2e\x2f\xc7\x39\xbd\x8b\x69\x72\x49\xf1\xf8\xf2\x32\x9a\x70\x87\xfb\x6e\x2b\xa1\x26\x6b\x45\xd1\x2d\x2c\x7b\x8c\x3c\x53\x55\x1a\xb8\x43\x69\x1c\x2d\x3b\xe0\x06\xb9\xb9\x0a\x19\xe8\xb3\x10\x44\x4e\xfe\x95\xe3\xcd\x61\x12\x2b\xc1\x9f\x57\x78\x6a\x0a\x44\x62\x1d\x39\x84\x6e\xb5\xe7\xfe\xae\xf5\xdc\x97\x13\x60\xd5\x8e\xad\xfc\xf7\x6d\x07\x1c\x02\x8b\x51\xee\x7f\x3a\x7e\xdd\x79\xb4\x60\x3c\x6a\x7c\x8a\x82\x80\x3f\x5a\x60\xfe\x89\xab\xd7\x88\xcc\x01\x4f\x82\x11\xe3\xfe\x4b\xd3\xab\x71\x09\x99\x1e\x18\x26\x46\x49\xf3\x0b\x03\xfe\x2b\xd3\x1e\x0a\xf4\x15\xdf\x2d\x97\xec\xeb\x97\x1c\x9b\x4d\x75\x58\xc1\x9a\x4d\x6f\xd0\x5b\xf1\xa3\xaf\xfe\x94\x00\x95\xb7\x90\x85\xba\x53\x41\xec\xd7\xea\xc1\x0d\xee\x7f\x12\x73\x5f\xd2\x23\x0a\x82\x5e\xe9\x7a\xb6\x1b\x06\x5b\x9d\x6e\x00\x3f\x1d\xe7\x0d\x63\x84\xd4\xf7\x0b\x44\xe7\x78\x63\x9c\xcf\xb3\xe4\xd1\x82\xf2\x4f\x0e\xf8\xcb\xf2\x66\xf7\x8a\xd7\xeb\xce\xf9\xf9\xfe\xd9\xc5\xe1\xc9\x71\x63\xff\xec\xec\xe4\x4c\x5e\x47\xe0\x9f\x5a\x7a\x8a\x11\x41\xc9\x4f\x8d\xc1\xfe\xfd\x0c\x8f\x18\x4e\xd0\x76\x43\x00\x6f\x3c\x5a\x10\x2e\xf1\x6b\xbc\x44\x3b\x23\x36\x8f\xd3\xe1\x27\xe0\xb4\xf8\xa6\xa4\xb4\xb1\xd5\xab\x03\x20\x37\x6c\x34\x6b\x97\x1f\xfa\xca\x51\x69\xcf\xd7\xbf\x74\x9c\x0f\xed\x6b\x51\x36\x70\xe7\x34\x50\x5a\x63\x2d\x44\x2a\x63\x5c\x58\x33\x2b\x6b\xeb\x5f\x22\xd5\x81\xf2\xde\x99\x32\x47\x21\x83\x1f\xc1\x72\x29\xfe\x1e\x3a\x5d\x39\xaa\xbd\xa4\x56\x9b\x23\x18\xf4\xc5\xaa\xa0\x1c\x69\x6c\xa5\x7b\x77\x7a\xcb\x60\xc7\xb5\x6a\xfb\xd2\x85\xa9\x96\x78\x01\x04\xb0\x7d\x0d\x4c\x71\xc3\x47\x21\x4a\x82\xf2\x04\x24\x10\x72\x04\xee\x3b\xa9\x24\xfb\xac\x12\x0f\x45\x62\x76\x7d\x28\x0f\x78\xe2\xab\x14\xef\xe1\xb1\xcc\xb8\x70\x33\x72\xaa\x93\xe5\xca\x78\x62\xee\xd4\x9d\xa0\x13\x75\xa7\xee\xa4\xad\x9f\x08\x96\xd7\xea\xf4\xef\x00\x9e\x0c\x4e\xda\x6f\xf2\x82\xc9\xfb\x74\xe2\x87\x4a\x3a\xc7\xe9\x58\xde\x9d\x13\x3f\x74\xd2\x0d\x99\xc9\xe4\xa7\x22\x59\x7f\xa8\x2c\x65\xe6\x8e\x53\xf4\x62\x88\x02\xf3\x11\xc0\x13\x60\xc2\xab\xdf\x94\x12\xf2\xd4\x0d\x87\x72\x63\x8e\x09\x6f\x10\x83\xb8\xa4\xf3\xb1\x31\x71\x9b\xa3\xc6\xf7\x4e\xd8\x16\xd2\x6c\xaa\xc8\xe4\x08\x11\x87\xd5\xfa\xd6\x61\x8b\xa8\x10\x1a\x7d\xfd\x17\x11\xc3\x75\x21\x88\x74\x5a\x44\x9b\x25\xda\xea\xee\x6f\xe5\xf2\xa6\xfc\xf8\x35\x1c\xcb\x58\x4e\x86\xc0\xee\xb2\x7e\x56\x99\x09\x6a\xfe\x47\x8c\xbb\xb7\x98\xc5\x38\xec\x99\x71\xd8\x43\x7b\x6a\x1c\xf6\xda\x27\xd9\xe9\xbc\x98\xc8\x61\x50\x3f\x03\xb8\x37\xd8\xb3\xc3\xd3\x75\x87\x67\x0f\x38\xe7\xc9\x61\x78\x80\x0e\x14\x94\x83\xf6\xfe\x74\x9e\xca\x27\xcd\x05\x1c\xf3\x11\xc0\x83\xc1\x41\xfb\x38\xcf\xb0\x1c\x3c\xf1\x43\x25\xa9\x78\xdb\x7b\xf9\x54\xde\x73\xb4\x5f\x01\x3c\x00\xa5\xdb\xc3\x67\xe4\xbb\x95\x7e\x9d\xe6\x57\x71\x7a\x31\x21\x45\xb3\x59\xfe\x86\xaf\xbd\x85\x4d\x18\x61\xf5\x17\x7e\xf1\x16\x2a\x70\x3a\x6e\x36\x7d\x39\xbf\xe5\xf4\x06\xd3\xd7\xb2\x95\xf3\x51\x3e\xc3\xcd\xa6\x28\xec\x5e\x7c\x58\x53\x04\xbe\x42\x9f\xfd\xb7\xea\x15\xce\x06\xf7\xe5\xf2\xf5\x72\xf9\x05\x7e\x40\x0b\x0e\x1f\xa1\xc1\x10\xfe\xe5\x4c\xb9\xd1\x74\xa6\xa6\xdc\x6f\x4e\x62\x42\xa8\x4a\xfc\xc3\x9d\xb2\x64\x86\x55\xea\x5b\x27\x75\x9a\x27\x2a\xf1\x17\x27\x31\xcd\x47\x2a\xf1\x9d\x93\x38\x8e\x75\xe2\xef\x4a\xa5\x38\x7e\x6d\xe2\x9a\x5f\x1e\xee\x69\xa5\x42\xc6\x1f\x64\xa8\x53\xce\x9d\x4a\x24\x95\x33\x7d\x38\xa6\xa7\xd2\x82\x43\xe3\xc4\xa5\x96\xa5\xf2\x98\xf2\x0c\x17\x79\x7a\x8b\x75\x88\x8b\x04\x8f\xe4\xb5\x2d\xf9\x17\xde\xc6\x52\xbe\x8a\x3f\x56\x4a\x2b\xcf\x11\xfd\x1e\xa7\x80\xa6\x7f\x6a\x61\x2e\x5b\x2c\xd4\x85\xb3\x42\xc8\x5e\x15\x39\xe3\x5a\xfb\xdb\x9e\xdb\xd7\x43\x59\x7b\x35\x11\x4e\xf2\x82\xbd\x22\x32\x48\xb8\x3c\xde\x77\x3e\x35\x24\x91\xf4\xab\x42\xcb\xfc\x5c\x2e\x3b\x32\x79\x87\x31\x9b\x2e\x7f\x97\x28\x89\x56\x7e\x99\x63\x4a\x70\x61\xee\xc2\xd9\x04\x5d\x4a\xf4\x38\xa6\x42\x56\xc8\x87\x4b\xb1\x79\xc1\x54\x66\xe6\x73\x56\x7e\xe0\x7b\xb1\xac\xec\x08\x48\xe6\xa7\x86\x91\xcb\x19\x2b\x5a\x90\xaf\xdc\xee\x49\xdf\x64\x92\x67\x08\x21\x33\xb3\x61\x42\x28\x96\xe1\xc4\xf7\xf0\x58\x03\x14\xfc\x52\x7e\x15\x0e\x89\xec\xef\xe5\xf2\x11\xbc\x25\xf8\x4e\xe0\x2c\x56\x4a\xfb\xdb\xac\xa1\xe6\x3d\x54\xd6\x36\x3f\x4d\xbf\x62\x16\x8b\x01\x8d\x59\x2c\xa4\x03\xc4\xd9\x28\x9e\x15\x42\x22\x90\x5c\x2c\xc7\x95\xef\xe5\xb2\x94\x1d\x90\x24\x51\x30\x0a\x60\xc1\x1e\x52\x09\x58\xfd\x10\x98\x5c\x1a\x4c\x99\xa4\x96\xfe\x1a\x4d\xf0\x34\x96\x05\xd5\x2f\x73\xa3\xf8\x57\x82\xef\xd4\xea\x06\xd5\x13\x61\x9a\x00\x85\x0c\x19\x60\xd0\x85\x31\x62\xf2\x62\x4f\x51\x3a\x05\x92\xa4\x85\x18\x6b\xb5\x20\x6d\xab\xd1\x40\x39\x93\x6f\x7d\x89\xdf\x10\x03\x48\xdb\x7a\x64\x54\x86\xfe\x00\x30\x6b\x36\xb3\x4a\xc0\x29\xf9\x90\x1a\x6d\x57\x88\x8f\x88\x0c\x6a\xed\x7b\xc4\x80\xf4\x89\x58\x0e\x54\xd4\x2f\xa2\x9f\xf5\x85\xb4\x6d\x46\x0a\xc5\x6b\xab\xc6\xfd\x38\x04\x51\xac\xaa\x66\xb6\xaa\x1b\x6a\x91\xb2\xfa\x0a\x66\x8e\x9b\x47\xd3\x59\x8f\xd4\xb0\x0c\xe5\x25\x7c\x8d\x08\x24\x25\x0e\xa1\xf4\xd2\xd7\xcd\x94\xd0\x89\x2b\x07\xe6\x2a\x82\x5d\xa9\x8d\x97\x1a\xca\xe0\xb7\xa1\xbe\x56\x5a\x51\x4b\x33\xb7\xba\xb7\xde\x1f\x6e\x3d\xfb\x66\xec\xc2\x89\x5b\x99\x7e\x4d\x14\xb9\x52\xe8\x2a\xcf\x59\xc1\x68\x3c\x8b\x58\xdb\xfe\x16\x1c\xa6\x66\xa3\xe4\x49\x23\x8e\xcc\xa7\xc8\xf6\xe8\x78\x8f\xf4\xbc\x2c\xa7\xa5\x4c\x94\xef\x62\x12\x41\xcc\xdd\x7c\x3a\x23\x29\x96\xcb\x42\xf1\x75\x96\x25\x89\x80\x9c\xe8\x6e\x56\xbd\x95\x44\x46\xb3\x19\xc6\x6c\x20\x7e\x0d\x91\xea\x09\x80\xd8\x1d\xe1\xa2\x7a\x51\xa6\x42\x02\x8a\x26\x22\x77\xa3\x03\x7a\xb4\xd2\x31\x84\x57\xfa\x49\x4d\xff\xc4\x16\xb7\xec\x29\x35\x3d\x44\xd8\xe9\xab\x8b\x40\xae\x11\x58\xd9\xae\x37\x3e\xd8\x5d\xb3\x18\x31\x6b\x78\x20\xa5\xbd\xa3\xae\xa1\x12\xfd\x42\x67\x86\xd8\x80\x0c\x61\x8c\xb2\x5a\x5c\xc1\x0c\xc8\xbb\xb2\xd9\xa0\x3b\x84\x19\xca\x06\x9d\x21\x80\x74\x90\x0d\x11\x81\xb8\xd9\x0c\xe5\x1b\x95\x71\xf9\x24\xa5\x79\x2b\x8a\x21\xcc\x4a\x9e\x49\x98\xab\x34\x39\x3c\xa2\xe2\x5f\xab\x98\xbf\x95\x45\x48\xbf\x98\x2a\xaf\x1f\x8a\xdf\xd0\x3e\x67\xac\xab\x0a\xfd\x4f\x3d\x99\xd0\x76\x9e\x0f\x5e\xb9\x4b\x5d\x7d\x25\x67\xf0\x97\x61\xef\xd2\x30\x54\xf7\xb1\x1b\xbc\xd5\x65\x64\xb0\x5f\xda\x6c\x6e\xc8\x97\x2a\x3d\xcf\x2d\xaa\xfb\x83\x63\xb9\x4d\x4b\x72\xac\x2e\x3b\x4e\xe2\x5b\xdc\xf8\x97\xd5\x0a\xfe\x65\x8d\x45\xed\xf2\x79\x24\x27\x68\xd8\xcc\xc5\xaf\x6e\xb2\x69\x36\x57\xf7\xaa\x83\xee\x70\xcd\x13\x0b\xab\xb5\x25\xe6\xd5\x1a\xd7\x6e\x8d\xce\x06\x0a\x5f\x34\x59\x7b\x9c\xc6\xd7\x85\xc3\x60\x53\xb7\xd0\x16\x42\xe1\x96\xa7\xd0\xad\x5b\xa8\x8b\x50\xd8\xf5\x14\x7a\x70\x0b\xd9\xfb\xa4\x46\xad\x70\x4c\x19\x75\xb4\x9e\x75\xb7\x9a\x6c\xb0\xe5\xda\xbd\x76\xd9\xd7\x37\x6e\xef\xc4\x5e\xeb\x9d\xd9\x6b\x49\x7b\xc6\xce\x7a\xa7\xdb\x19\xc5\xb7\x24\x9f\x17\xea\x9d\x60\xe3\x7f\xaa\x1e\x94\xa9\xbc\x1d\x3c\x26\xb4\x60\xea\x65\x7b\x44\x39\x29\x0e\xca\x6f\xc7\xda\x5b\x2b\xe9\x70\xe0\x39\x73\xcc\xdf\x8e\xf5\xe6\xd7\x0a\x67\xfa\x78\x5a\x3f\xa7\x2f\x77\x9b\x66\x39\x46\x6f\x18\x80\x97\x0e\x98\x4b\x01\xde\xf8\x03\xbe\x57\x9e\x92\x00\xaa\x30\xe9\x08\x31\xbd\x37\x12\x6a\x8b\xea\x9b\x7c\xa0\xc1\x75\x29\x35\x84\x90\x77\xcf\x10\x42\x1f\x40\x99\xa6\xc3\x70\x35\xec\x4b\x98\xca\x82\x49\x07\x6c\x88\xf0\x80\x0d\x7b\x16\xac\xe3\x74\xec\xa0\xae\xc2\x4d\x5b\x1b\x02\x2b\xcd\x16\xe6\x22\xfa\xfb\xfa\x1a\xe6\x8e\xf0\xe0\x4e\xb4\xc3\x43\x06\x17\x06\xa3\xe8\x03\xd4\x2d\xaa\x71\x06\x42\x64\x19\x24\x96\xcb\xd0\xfe\x46\x0b\x0e\xa0\xbc\x7a\xae\x6b\xc2\x42\xbb\x31\x57\x74\xc1\x01\x55\xef\xef\x15\xc3\x5e\x3c\x28\x86\xd2\xbd\x7b\x87\x85\x79\xb3\x99\x57\xb8\x01\x62\x98\x4a\xe2\x40\x21\x27\x11\xe6\xe7\x42\xc7\x3d\xcc\x26\x98\x12\x86\x36\x3a\x5a\xf0\xde\x31\x14\x5c\x5e\x66\xd7\xe7\x64\x3a\x4b\xb1\xa6\xc2\xe5\xa5\xf3\x6c\xd7\xfb\xaa\x40\xba\x63\x46\x22\x09\xfa\x1e\x39\x32\xf3\x5e\x16\x3c\x62\xc8\x19\xec\x8f\x0e\x2f\xd9\x5d\xeb\x11\xeb\x1f\xb1\xc8\xb7\x01\x32\x6f\xdc\xf4\xcd\x0f\x63\x76\xb1\x00\xf7\x1d\x6c\x36\x36\x58\x3b\x95\x8e\xfb\xe6\x36\x29\x43\xfa\x1d\xfa\x33\x9c\x25\x98\x62\x1a\x69\xff\x51\x81\x87\xa3\x12\x5c\x30\x63\x5d\xef\xd5\x85\x50\x0f\x30\xc4\x06\x9d\x61\xf9\x32\x9c\xad\x75\x52\x9d\xcf\x17\x2c\x14\x2c\xe5\x4c\xf8\x1b\x5f\x01\x65\x0d\x76\x8b\x9d\xd6\xe5\x82\x50\x87\x07\xd8\x11\x7a\xc7\xb5\x12\x95\xcc\xb3\xda\x02\x20\xf9\x5a\x97\x9c\x31\x15\xd0\x98\x0e\x3a\x4e\x8d\x3d\x77\x08\x9f\x22\x14\x3e\xad\x8b\xaa\x83\x8a\x6c\xdc\x7a\x21\xa4\xe3\xd6\x8b\x7a\xa9\xcf\xcc\x63\xa1\xc6\xca\x26\x51\xc5\xf1\xb5\x8a\x87\x3c\xe8\xbe\x18\x22\x67\xf4\xbe\x68\x00\x6c\xf0\x6c\xd8\x42\xb8\xa7\x23\xf3\xcb\xf7\x87\x9f\x0c\xf5\xc3\xb1\xd6\x0d\x3b\xd4\x0f\x2b\x4b\xcb\xf9\xe0\xd9\x70\xb9\xdc\xd4\x29\x1d\x9d\x02\x7a\x80\x28\x50\x90\x22\x02\x09\x22\x83\x27\x43\xcd\x0c\xaf\x18\x5a\xa4\x07\x54\xac\xd7\xb7\x58\xea\x1d\x00\x5e\xe9\xed\xdb\x7e\x16\x5f\xa5\x38\x89\x36\x3a\x90\x14\x87\x99\x7c\x61\xfd\x38\xd7\xdc\xff\x3e\x4f\xe4\xdb\xe7\x25\xbb\x7c\x70\xb8\xf8\x15\x6b\xd7\xa0\x94\xdd\x7b\x54\x2d\xa7\x5a\x6f\xa7\x62\xcb\x51\x16\xfa\xcb\x5b\x88\x55\x0b\xfd\xe6\x8e\x47\x59\x4a\x87\xe1\x38\x12\x85\xc5\x12\x30\x78\xe1\xd0\xfc\x0f\x01\x58\xbd\x04\xf0\x96\x85\xa0\x42\x4d\xd6\x6c\x3e\x7f\x2a\xdd\xeb\xc5\x4c\x93\x3c\xde\x9e\xc5\x52\xbc\xae\xf2\xf9\x5b\x2f\x86\x5a\xb8\x5c\x1c\xe7\x89\xb3\x0e\xfe\xe2\x4a\x73\x5b\x18\xca\x60\x63\x4e\x85\x32\x8c\x02\x29\x4e\x65\xbb\xf2\x24\x44\xa1\x50\x42\x7b\x57\x63\x6d\x0b\xb0\x47\x2b\xe0\x10\x13\xca\xa8\x86\x84\x1c\x74\x7e\xf7\xa2\x6e\x4a\x96\xe5\x98\x58\x0a\x57\x0b\xa0\x8d\x6e\x59\x06\xe3\x0a\x2c\x3f\xa3\x38\xfb\x28\xe9\xfe\xbe\xb6\xa0\x2b\x15\x09\xf6\x11\xad\xa7\x63\xf0\x1a\xfe\x3a\xcb\x73\xf5\x02\xab\x7b\x82\x24\x55\x58\x4f\x19\x31\xb2\x82\x2b\x4c\xc6\x39\x8b\xa9\xca\x01\xae\xb5\x32\xc3\x3e\xfa\xe8\x3a\xb2\x78\x59\x36\xfe\x66\xd9\x56\xab\x2c\x9d\x56\x82\x47\x97\x9c\x40\x51\xb5\x4e\x19\x39\xda\x4d\xad\x15\x6a\x31\xe8\xa8\x9c\x85\xa1\xac\x19\xad\xec\xb0\xfb\x22\x73\x09\x9a\xe3\xf5\x7c\x53\x69\x86\x7a\x08\x07\x47\x32\x54\xb8\x05\x36\xaa\x35\xa7\x19\x6f\xcf\xec\x83\x75\xb5\xb2\x42\xe2\xef\xba\xbf\x62\x65\x30\x7d\xa2\x73\xee\x25\xbb\x86\x25\xad\x2c\xb5\x71\x9a\xf8\xf1\x2d\x8b\xba\xb8\xce\xaa\x6f\xa9\x0c\xba\x76\xe9\xd8\x12\x08\xa9\x93\x23\xb5\xf5\x93\x33\x4d\x3d\x6e\xaf\x0f\x94\x06\xcf\xeb\xa7\x0c\x63\xec\xbc\xf1\x4e\x9b\xa5\xe9\x5d\x87\x45\x42\x18\x66\x88\x29\x51\xb4\x11\x12\x44\xf4\x94\xb7\x17\xf3\x96\x4b\x51\xeb\x4d\x5e\x08\x5d\x88\xa0\x19\x0e\x33\x75\x6b\x0f\xc9\xcc\x50\xec\xe0\xba\xcf\x86\xb0\xdb\x69\x12\xb5\xb7\x05\xa0\xe7\x3e\x81\x4f\xca\x17\xec\x30\x22\x90\xa1\xcc\xde\x70\xb7\x24\x41\x53\x5c\x5e\xf3\x21\x55\x49\x82\x21\x51\x12\x1a\x89\x5d\xb0\xb3\xef\xa8\x10\x4a\x00\x90\x8f\xe5\x77\x87\xbd\x12\x2c\x86\x55\xb1\x88\xa8\x51\xa9\x49\x9a\x40\x6c\xe1\x6a\xf1\x8e\x28\x5c\x11\xe1\x78\x0d\x7f\x96\xf3\x17\x5a\x86\x77\x85\xd3\xd4\x2b\x42\xac\x1a\xad\xcf\x8b\xa5\xf1\x8f\xa4\x49\xaf\xb2\x62\x23\xdc\xbf\x15\xbd\x8b\x1c\xc1\x70\x5b\xe9\xee\xc2\xed\x95\xda\xdf\x1a\x11\x29\xd6\xcc\xd4\x1a\xd1\x1c\x7b\x9a\x36\x15\x0a\x3d\x35\xc1\xf7\xd1\x66\x17\xba\x5d\xd5\xc6\x4a\xf5\x68\xe1\x1e\x9e\xb1\x89\xbc\x61\x17\x75\x8c\x76\x2c\x1f\x62\x99\xc5\x23\xdd\x9c\x77\xee\x08\xa0\xf5\xf9\xeb\xa4\x95\x0d\xd7\x67\x40\xd4\x81\x8a\xef\x22\x06\x25\x41\x74\x9f\x24\x5d\xe5\x5a\x5f\xdb\xf1\xc9\x2d\x8c\x2c\x89\x70\x45\x80\x3e\xf8\x45\x77\x7d\xbe\xda\xe5\x15\x56\xd7\x41\xbd\xeb\xd0\x9c\xa1\x3e\x34\xbf\x5e\x61\xf4\x80\x4b\x9d\x63\xd7\x6d\x48\xb4\xda\x63\xce\x32\xd5\x81\x5a\xde\x1b\x80\x15\xe2\xa3\xcd\x2e\x64\x55\x4e\xd3\xc5\x56\x06\x00\x75\x4a\x0c\x6b\x12\x4e\x01\xa9\x8d\x8e\x01\xb4\x22\x46\x65\xe9\x0a\x2f\xbb\xf5\x1d\x61\xe4\xcc\xb1\x1d\xaf\xa8\xab\x74\xc5\xd9\x96\xd6\xc4\x5c\xb5\xc7\xee\x3e\xf5\xab\x43\x74\x2a\x1f\x59\x13\x34\xa9\x53\xcd\x3d\xae\xc6\xa5\x2b\x8c\xd2\x51\x71\x69\x07\x95\x53\x53\x3e\x04\x6a\x93\xf6\xb3\xa4\x47\x5f\x92\x1e\x2d\x9f\x34\x97\xe1\x40\x84\x5e\x4f\x87\xb5\xad\x32\x5c\x64\xd7\x3b\x63\x86\xa9\x3e\x70\x90\x4f\x64\x11\x58\x4d\x94\x0a\x04\x4e\xa2\xcc\xa4\x0b\x8c\x65\xc9\xd8\x4d\x31\xc5\x52\xe8\xd8\x94\xa2\x82\x23\xdc\x23\x8a\x87\x15\xb8\x37\x79\x7e\x23\x63\x65\x57\x12\xd0\x60\x08\xf4\x93\x83\x9b\xf2\x95\xc2\xac\xd9\x0c\x7f\xa0\x12\x85\x19\x80\x65\xb6\x44\x66\xa5\x52\x99\x5a\xab\x09\x60\x2c\x51\xbc\x25\xf8\xae\xac\x65\xbf\xaa\xc8\xc5\x00\xa6\x0a\xb9\x6f\x17\xa7\x30\x95\x68\xdd\x1a\x02\x55\x8b\xaf\x41\x28\x05\xe6\xba\xb8\x32\x60\x24\x8a\x98\x65\x5d\x37\xa1\x52\xb3\xa8\xd8\x0c\xec\x8a\x78\xa4\x7e\x3d\xa9\xf8\xf8\xdc\xe1\xd2\xa4\x10\x3e\x51\x1b\x2c\x24\xdf\x4e\x38\x2a\x73\x1c\xf7\x00\xcd\x88\xe6\xf5\xc6\xad\x61\x2f\x7c\xd2\xa4\x40\x6b\x82\xb4\x89\xb6\x3a\x4f\x7f\x82\xb4\x85\xba\x50\xe4\x22\xb7\x2d\x07\xa2\x35\x5f\xa8\x1e\x92\x3e\x11\x72\x32\x46\x65\xd0\x71\xa9\x7d\xa6\xa8\x63\x5f\xeb\x77\xe2\xb9\x92\xfe\xf3\x67\xcf\x9e\x3c\x6b\xca\xfd\x5c\xd4\xe9\x15\x2f\xe3\x5e\xd1\x6a\x01\xe7\xe9\x75\x6b\xef\xc3\x83\xa2\xd5\x1d\x4a\x7d\x20\x45\x78\x50\x0c\x35\x51\x49\xb3\x99\x6e\x23\x02\xd4\x7b\x13\xd2\x48\x23\x72\x5f\xca\xf7\x24\x05\xdc\x16\x12\x8d\x3c\x07\x30\x4c\x5f\x66\x6a\xab\x27\x4d\xb9\xf7\xa2\x17\x14\x62\x19\x05\x40\x6e\x28\xc3\xa7\x5b\x3f\x3f\xfd\xb9\xd3\xfd\xe9\x79\x47\xa1\x04\x5a\x45\x6b\x0b\xc0\xc2\xd5\x47\xef\x3d\x9d\xa7\x03\x32\x7c\xd9\x81\xb1\xf8\xd1\xea\x0e\x61\x8a\xd8\x20\xeb\x6f\x8a\xe4\x48\xfc\x37\xd4\xcf\xa9\x49\x3f\xbb\xad\xe1\xf6\x76\xb7\xfb\x52\x36\xb0\xbd\xdd\x7d\xde\x6c\x3a\xe3\x25\xf7\xb0\x5b\xc3\x96\x20\xff\x0b\x19\xdd\x24\x6e\x8f\xe2\x34\x0d\x53\xc0\xc7\x24\x8b\xd3\xf4\x61\xc1\x4d\xf4\xf6\x35\xb9\xca\xe2\xf7\x11\xaf\xb5\xf8\x8d\x4d\x64\x28\xfb\x76\x41\x9e\xde\x92\xec\xda\xc6\x14\x1d\xc5\xd9\x39\xc6\x42\x0e\x9c\x9a\x03\x54\x63\x04\x54\x77\x6c\x0f\xa7\xb3\x14\x51\x87\x3b\xf7\x71\xfd\xb0\x47\x1a\x54\x74\x24\x90\x8e\xde\x33\xbe\x34\x0f\xe0\xd9\xd7\xa9\x05\xc9\xb2\x61\xcf\x37\xe0\xb1\xa4\x97\x60\x93\x58\x0d\x6e\x2f\x6b\xb5\x6c\x24\x45\x3a\xc8\x5a\xad\x21\x2c\xcc\x8f\x5c\xff\xe8\x91\xbe\xb4\x11\xee\x30\x46\xc9\xd5\x9c\xe1\x10\xc3\x02\xe6\x30\x05\x11\xae\xa4\x1f\x9f\x87\xa9\xc8\x51\x0f\x45\x2d\x0c\xdc\x58\x82\x6c\xb5\xb2\x61\xef\x02\x87\x29\xe8\x93\x66\x53\x05\x85\xb6\x6e\x31\x30\x85\x05\x88\x3c\xed\xc8\xf4\x6a\x2b\xa2\x0d\x00\xb3\x56\xab\x7c\x17\xbb\x24\xda\xa1\x1b\xe0\xec\x09\x92\x4e\x79\x4f\xd5\x9f\xe7\xf2\xfd\xe5\xd2\xae\xe4\x96\xd4\x1b\xee\xd1\x24\xa6\xbb\x79\x82\x77\x58\xd8\x71\x26\xe7\x09\xae\x9c\x89\xa8\xd8\x50\xd2\xa7\xc3\x3c\x32\xe0\xdc\xa4\x5e\x2e\xab\xcf\x0f\x20\xac\xdf\xe1\x02\x65\x84\x51\x8a\x36\xbb\x76\xf2\x12\xd4\xe9\x11\xfb\xa4\x40\x8f\x94\xeb\x52\x86\xf0\x80\x0c\x7b\x2b\xc3\x98\xf5\x29\xca\x22\x69\x58\x59\x2e\x6f\xd4\x9c\xcb\xe4\xdc\x85\xca\x75\x71\xb9\xdc\x52\x1e\x8c\x83\x56\x8b\xa8\x7d\x80\x73\xc5\xda\x31\x82\xd9\x89\x07\xf5\xcb\x84\x31\xea\x88\xa9\x66\x91\x19\xab\x87\x0f\x30\x48\x05\xca\xd6\x5e\xdb\x8b\x5f\xb2\x3a\xdf\x09\x99\x17\x4b\x76\xf1\x70\x9e\xde\x75\xa8\xe9\x28\x61\x29\xe1\x22\x12\xb7\x65\x52\x6c\xd3\xe4\x23\x82\xde\x26\xc4\x2e\x28\xf6\x37\x80\x35\x43\x93\x71\x88\x45\xdf\xdd\xdb\xed\x66\xdf\x21\xcd\x9a\x36\x3e\x96\x14\x66\x71\xab\x3b\x44\x99\x8a\x3f\x4a\xe4\x81\x86\x48\xa9\x94\x17\x49\x5b\xa2\x10\x8f\x5b\x2d\x27\x4a\x89\xf3\x95\xc9\x2f\x2e\x9f\xd6\x49\x95\x49\x5d\xbd\xad\x93\x42\xf9\x34\x71\x8c\xd2\x56\x17\x40\x9b\x2c\xaa\x76\x20\x75\x63\x9e\xd4\xf2\x08\x70\x60\xd7\xf2\x32\xd7\x3e\xe9\x70\xb1\x6c\xde\x19\xdd\xe3\xca\x5c\xd8\xfa\xe9\xf9\x4f\x4d\x27\xf7\xac\xb2\x5c\xf9\xce\x6b\x85\x24\xe5\x21\x03\x42\x7f\x52\xd2\x86\x6e\x77\x7a\x80\x20\x22\xb7\x79\x74\x73\xd3\xee\xd3\x54\x48\x12\x8c\x36\x1c\xb7\x92\x83\xca\x36\x65\xcf\x6a\x75\x7b\x58\x7a\x65\x89\x1a\x9f\xb1\xeb\x87\xf2\xba\x6e\x19\x50\xdf\x8a\x09\x37\xc4\x98\x9a\x23\xae\xf2\x59\x64\xb1\xc9\x23\x7a\x27\x27\xad\xc9\xa7\x71\xa1\x74\x02\x13\xb9\xc0\xd8\x2c\x14\x2b\xc1\x2f\x38\x24\x52\xd9\x83\x0c\x88\x0f\x0c\x95\xb9\x51\xa6\x5f\xa5\x73\x3c\xa3\x44\xef\x79\x81\xf1\x60\xca\xd0\x07\x85\x8a\x74\x35\xa8\x00\x16\xc8\x9d\x8a\x8d\x70\xa9\xc6\x1e\xcb\x7d\x31\x45\x67\x38\xcc\xf4\xbb\xd4\x83\xee\x50\xb6\x69\xe7\xbc\x90\xdf\xd9\xcb\x17\x42\xfc\x02\x3c\x88\x5b\xd9\x10\xd1\x01\x6b\x65\xc3\x25\x91\x7f\xcc\x5c\x15\x79\x2f\x86\x28\x83\xb1\x63\x98\x35\x4f\xf5\x2a\x9d\xa6\x03\xab\xff\x5c\xf3\xc8\xab\xca\xcb\x68\x72\x26\xd7\xf0\x5f\x2e\xcd\xee\x47\xb0\x99\xfa\x55\x23\x9d\xa7\x8e\xd9\x9b\x0e\x6a\x39\xad\x17\xc3\xfe\x66\x37\xaa\xa5\x96\xf8\x7c\x28\x05\x69\xd9\xec\xa6\x3e\x88\xf5\xb4\x6d\x7d\xce\xbd\xb9\xda\x24\xdd\x81\x04\xe9\x57\x76\x70\xc5\x90\x9a\xf5\xca\x41\x91\x47\xcc\xd8\xd8\x54\xe5\x64\xdf\x52\xce\xd8\x75\xfb\x49\x3f\x33\xa6\x13\x58\x13\x1f\x9b\x5d\x79\x8c\x25\xa6\xbd\xb6\x74\x48\xd4\x89\x1f\xe7\x5a\xf2\x92\xbe\x7c\xd9\x7d\xce\x0d\x24\xc7\x10\x6d\x97\xf9\x0d\xf7\xa0\x4a\x24\xa8\x68\xd5\xab\x2f\xe0\xf6\x09\xa2\xd5\xb5\x6a\xb9\xec\x44\xb4\x7e\x66\xf9\xbb\x50\xc9\x04\xf7\xfd\x3e\x34\x76\x1a\x62\x53\xd0\x67\xdc\x6a\x95\x0c\xbe\xf5\xec\x59\x93\xf4\xb0\xda\x06\xb1\x56\x98\x6d\x6f\x3f\x03\xc3\x25\xea\xbe\x7c\x99\x71\x8d\x8f\x63\x17\xaf\x9b\x92\x8c\xcf\x63\x79\x49\xe0\xd7\x10\xc3\x40\x50\xd5\xe7\xe6\xf8\x9b\xa3\xf0\xd5\x20\x98\xe7\x2e\x90\x41\x56\x4d\xcf\x0e\x42\x21\x6d\x86\xca\x85\x74\xa9\xac\x50\x00\x94\x0b\x25\x1b\xfc\x3c\x84\x31\x3a\xd5\xcf\xa9\xa9\x28\x76\x46\x3d\xe8\x67\xea\x85\x58\x48\x60\x05\xd9\xe8\x78\x35\xcd\x2a\x7d\xa7\x61\x5c\xae\x99\x7f\xe1\x90\xd4\x68\xf0\x87\xed\x03\xb2\x4e\xb0\x30\x73\x95\x04\x56\x6a\x64\xae\x78\xfd\xfa\xed\x8a\x95\x71\x75\xae\x35\xac\x8c\x6f\x9f\x0d\x7e\x1f\xea\x73\x37\x2d\x5e\x57\x17\xc6\x3e\xde\x46\x9d\xbe\x18\x60\x1c\xfd\x82\x23\xcc\x43\xaa\x22\xfb\x78\x5c\x90\x24\x76\x1b\x63\x21\x16\x19\x24\x36\x4c\x0f\xd1\x76\xbf\xfe\x5f\x42\xa6\x89\x61\x8b\x7e\x13\x65\x94\xe2\x20\x69\x6d\x26\x5a\x1c\x12\x6b\xf2\xdb\x10\xda\x10\x59\xc3\x1e\xb4\x24\xf5\x15\x0e\x81\x56\xc0\xd7\x68\xad\x65\xb8\x4b\x98\x9a\x75\x01\x16\x68\xb3\x0b\x73\x64\x91\xc3\x83\xee\xf3\xa1\x99\xbc\x52\x12\x28\xe5\x25\x55\x48\x58\x73\x67\xb3\x19\x16\x48\xe5\xf4\xb5\x44\x8a\xf0\x20\x6d\xbd\xd0\x13\xba\x68\x36\x29\x0d\x09\xdc\xe8\x82\x7e\x98\xc9\x35\x06\xa6\x42\xac\xcb\xb3\xef\x33\x1c\x16\x10\x03\x10\x09\x2d\x46\x3f\xa7\x97\x3a\x92\x46\x2d\x49\xe3\x10\xd3\x30\x86\x29\x54\x96\x05\x67\x79\x78\x27\xb4\x02\x2c\x35\x36\x02\x73\x15\xf8\x7c\x03\xa1\xb7\x36\xb4\x39\xe3\x05\xf2\xa1\x83\xcd\x2a\x22\xf3\x10\x42\x39\x68\x36\x75\x2b\x58\x62\xca\xd6\xa1\x59\xc6\x7a\x71\x86\x4d\xdb\xb2\xde\xe2\x8a\x07\xd6\x2f\xb8\x7a\xd3\x89\xd0\xf0\x0f\x16\x02\xf8\x88\x85\xae\xcb\xfe\x3b\x47\x73\x84\x31\xb0\xba\xbe\x24\x56\x81\x52\x23\x48\x5e\x88\x6d\xc4\xef\x02\x97\x54\x74\x59\x5f\x13\x98\xb2\xb0\x00\xcd\xe6\x1e\x8e\xc8\x86\x50\x98\x3a\x1b\x28\x7c\xd2\x2c\xb4\x43\x54\xa6\x07\xb4\xd9\x8c\x11\x42\x45\x3d\xe8\x53\xde\x67\x54\xee\x0c\x72\xb1\x37\x78\xeb\x9e\x28\x55\xd4\x59\x33\xf7\x4a\x37\x7f\x29\x88\x71\x01\x53\xa4\x04\x1d\x2c\x50\xb7\xf3\xf4\xc5\xb3\x9f\x9e\x35\x63\x98\xbb\x1e\x86\xca\x6e\x34\x42\xf1\xf6\xf6\x56\x07\x26\x28\xeb\x17\xad\x51\xc4\xaa\x56\x24\xb3\x98\xcf\x11\xe9\x17\x51\xd1\x1a\xf5\xe6\x2f\x93\xde\xbc\xd4\xdf\x19\x4a\x07\x73\xc9\x0c\xf3\x97\x79\xb3\x49\xd5\xf6\x60\xbe\x8d\x72\xb1\xd8\xca\xb7\x3d\x1c\xad\x66\xce\xd5\x8e\xb6\xac\x9b\xcb\xba\xac\xd9\x94\x9e\x2e\xbe\x3a\x39\x77\x68\xe3\x1c\x99\xd5\x5f\xe7\x53\x8f\xba\x1a\x8a\xa8\xde\x0b\xd8\x3e\xb5\xcf\x75\x8b\xfe\x88\xb9\xa3\xdb\xa4\x28\xeb\xa5\xe5\xde\xb6\xd9\xac\x7a\x56\xd4\x2e\x9e\x74\x02\xf8\x69\x97\xd0\xd1\x3c\x8d\x69\x23\xc1\x33\x9c\x25\x38\x1b\x3d\x34\x48\xd6\xd8\x3b\x6c\xa8\xf0\xbb\x38\x31\xef\x5d\xf0\x4f\x80\x87\xe7\x61\x3c\xa0\x43\xab\x77\x15\xe8\x00\x87\xa9\x6f\xeb\x0c\x5c\x3c\x4a\x0f\x89\x1c\xa5\xce\x6e\xba\x7f\x1a\xba\x9f\x40\xcb\x05\xc1\x24\x04\x5a\x99\xad\xc4\x97\xa2\x10\x4a\xad\x4f\xbf\x12\xaa\x30\x96\x72\x10\xe2\x55\x15\x93\x6e\x23\x52\x63\x98\x2a\x41\xec\xce\x7d\xe1\x38\xad\x48\xe3\xe1\x49\x26\xad\x83\x19\xcc\xae\xf7\x72\x69\xe2\x8a\x62\xae\x4f\x6e\x4a\xdb\xa3\xd4\x52\xca\xcd\xff\xaf\xf2\x8d\xf8\x90\xb6\x67\x14\x9f\xd0\x04\x53\x63\xed\xaa\xa5\x38\xe6\x2e\x89\xba\x93\x5f\x31\xb0\xf9\x92\x6b\x75\x79\x26\x43\x37\x7e\x7f\x83\x9d\x4d\xb1\x04\x4a\x5b\xe1\x0f\x22\x1a\xff\x03\x44\x63\x00\x78\x48\xa1\x60\x1d\xa9\xfd\xea\x55\xc5\x88\x8b\x66\xf3\x34\xcc\x01\x3c\x90\x82\x31\xad\x9a\x66\xd4\xca\xb3\x6a\x46\xc0\xd6\xba\x63\xdc\x57\x42\x3a\xc0\xad\x90\x49\xb5\xa8\xd9\x7d\xf9\xd2\xf5\x7c\xa5\xd4\x55\xb3\x37\x42\xd6\xd4\x7a\xca\x92\x59\x51\x86\x81\x36\x22\x11\xcf\xcd\x37\x69\x06\xba\x64\xfa\xb8\x5c\x7d\xa9\x63\x07\x6c\x9e\x00\x28\x71\x91\x9a\x47\x59\xc1\x2d\x0e\xa5\xf5\xcd\x35\x71\x66\x74\xbd\x43\x2d\x73\x5c\xc2\x1c\x94\x20\x45\x78\xf0\x6e\xb8\x5c\xc6\x34\x94\xdb\x17\xfd\xde\x57\xc9\x98\x4a\xa4\xe8\xe4\x6b\x69\xc7\x51\x39\x27\x52\xaf\x37\x5f\xc0\x85\xaa\x35\xf3\x66\x33\x13\x2a\x73\x45\x33\xd7\x6d\x65\x40\x4b\x3b\xe6\xee\xf5\x58\x6f\x5d\x4b\x59\x19\x51\x4e\x05\x9d\xab\xbc\x4a\x1f\xd3\xfa\x05\xc7\x4a\xdf\x63\x1a\xca\x7b\xab\xf6\x88\xbb\xd9\x14\xac\x10\xed\xb2\x8a\x4f\x73\x4a\xbd\x3e\xcd\x7a\x0f\x13\xc8\x11\x95\x97\x3a\x1d\xfd\x4d\xa4\x61\xe9\xf1\x16\x48\xc7\xf7\x5a\xbe\x72\x86\x77\x1e\xc9\x8b\x19\xa3\xca\x41\xae\x24\x8a\x35\xea\x19\x03\x91\xa4\x1e\x79\xc9\x7a\x55\x0b\xa9\xa8\x76\x28\xb7\x9f\xd6\xfa\x21\x23\x46\x03\xd2\x42\x5b\xbd\xb5\x1a\x55\x06\x04\x3c\xd2\x6a\x09\x90\x9e\x08\xd1\x12\x34\x10\xf9\xd2\x64\x25\xd6\x25\xb7\x13\xca\x24\xdb\x13\x6d\x94\x9a\x85\x72\xec\x96\xba\x82\xf5\xee\x2e\x28\x0a\x2e\x2f\xe5\x13\x12\x98\x61\x5a\x5c\x5e\x06\x30\x57\x69\x34\x9f\x5d\x5e\x4e\x31\x8b\xc5\x52\x54\x71\x62\x1b\x79\x69\xde\x6e\xb7\xf5\xc6\xd1\xb1\x37\xa9\x54\xc7\x19\x59\xfa\x10\x52\xf9\xe6\xe7\x80\xc9\x3d\xf5\x90\x3b\xb3\x21\xa9\x4d\xeb\xea\x8c\x20\x68\x24\x38\xbe\xc4\x44\xb6\xaa\x34\x76\x01\xd1\x5d\x18\xb3\x72\x9b\x17\xcf\x66\xa9\x7a\x7c\x12\xea\x00\xa2\x56\x65\x97\xf1\x5c\x15\x10\x27\x60\x71\x96\xe5\x4c\x7a\x6a\x23\x0c\x69\xd9\x1a\x95\x76\x3c\xc7\x04\xbe\xa2\xf0\x17\x54\x68\xfc\x05\x1d\x46\x7a\x46\x28\xa7\x3c\x9b\xcf\x60\x41\xe1\x42\xdd\x44\x1b\x0c\x39\x10\x45\xf5\xbc\xd3\xfc\xf4\x52\x4c\xbd\x4c\x09\x4e\xb9\xb1\xd2\x68\x85\xd9\x80\x0c\x91\xf8\x4f\xbd\xf6\x2d\x0b\x60\x00\x99\x1d\x5e\xaa\x22\x40\x9b\xf9\x67\xe6\xa4\x72\xe1\x93\x32\xda\xcc\x7a\xf9\x2c\xac\xe3\x6b\xfa\x5e\x0f\xb2\x0c\x3f\xca\x60\xe6\x10\x60\x37\x2d\x50\x06\x33\x77\xde\xce\x1d\xd5\xc5\x37\x48\x59\x7d\x90\xe2\xf5\x83\x14\xdb\x78\xb3\xdf\x1a\xa4\xb8\x3a\x48\x96\xeb\xa8\xab\x48\xd2\x8a\x94\x4c\x51\x5c\x1f\x9f\x9c\x82\x7e\x3c\xc8\xd7\x8e\x4f\x0c\x73\x3b\x3e\x0b\xce\x81\x28\xda\x4b\x07\x99\xd0\x3b\x6a\xa0\x32\xd0\x6c\x8a\x1c\x79\x31\x55\xfc\x68\xcf\xb3\x62\x42\xc6\x4c\x8a\xe4\x66\x93\x08\xd4\xa0\x44\xba\x32\x44\xf1\x77\x0e\x51\xfc\xb5\x21\x8a\x6b\x43\x14\xc3\x98\x9b\xe5\x6b\xb2\x76\xf9\x4a\x70\x61\x43\x0d\xd7\x40\xea\xbb\x8e\x24\xcf\x64\x1c\x57\x1d\x54\xd8\x09\xd4\xa9\xb5\x2d\xcf\xe6\x55\xc1\xae\xdf\x64\x43\xd8\xb9\x58\x69\x82\x01\x3b\xf0\xde\xd8\xa0\x9f\x62\xc4\x9d\x5b\xc4\xb8\x72\x8b\x58\x5d\xf8\xb4\x97\x03\xb0\xd1\xfe\x38\x00\xbc\xbc\x72\x69\x2e\xa1\x57\x3b\x21\x94\x56\xdb\x6f\xfe\xc9\xbc\x92\x32\xa3\xea\xc9\x04\x1a\x06\x3b\x59\x9c\x3e\x7c\xc1\x07\x39\xdd\xcf\x18\x7d\xd8\xcd\xa7\xb3\x3c\x93\x2f\x5a\x99\x58\xce\x63\xba\xd0\xd5\xae\x29\x9a\xd3\x30\x50\xe7\xc4\x24\x4d\x02\xa8\xbd\x61\xf5\x20\xc6\x45\x41\xae\xb3\x70\x61\xee\x75\x45\x0c\x4a\x8d\x54\xb9\x45\xfe\x6a\x2f\x78\x6d\x74\xa0\xc0\x07\x67\x49\x9c\xb1\x42\x46\xd5\xc4\x00\x8e\x29\x80\x53\x8a\x0e\x34\x5b\x3b\x81\x05\xf4\x08\x5a\x9b\x8b\xf6\x59\x03\xbd\xf2\x38\xbd\xd3\xa3\xa5\x25\x5e\x9e\x9a\xab\x45\x49\x6e\x29\xaa\x2e\xb9\x04\xf4\xa5\xf5\x9d\x69\xcf\x37\x75\xf0\xd1\x81\x14\x00\x78\x2b\xf7\xb0\x00\x44\x58\x39\x6d\xe8\x37\xf3\x89\x5d\xc5\x5d\xcf\x0d\xc3\x58\xee\x55\xac\xba\xf7\x6f\x5f\x97\x8a\xe4\x0b\x62\x8e\xbb\xbf\x15\xf2\x78\xdb\x9e\x64\xf4\xb5\xb5\x94\x82\xc8\x5a\xd3\x31\xac\xc6\x74\xd8\xa5\xd5\x47\x6a\xca\xda\x9b\x5d\x51\x3f\x9f\x85\x95\xda\x5d\x50\xf1\xdc\xdd\xa1\x55\xf3\xf5\x60\x58\x3b\xe2\x61\xf2\x6c\x87\x1a\xe1\xea\xb9\xb0\x71\x4e\x2b\xa6\x3f\x74\xa9\x40\x5a\x33\xfb\x36\xea\xf4\xd9\xa0\xbb\x24\x43\x44\xa3\x90\xa0\xff\x4d\x60\x75\xc7\xe1\x6c\xf8\x9c\x23\x9c\x4c\x5e\x31\x31\x47\xe0\x04\x58\xc5\xa0\x2b\x75\x05\x9d\x43\x20\x93\x17\x70\xc4\xff\x88\xaa\x95\x5f\x74\x20\xdb\xdc\x84\xba\x08\x1b\x64\x9b\xdd\x21\x64\x83\x6c\x08\x7a\xd9\x36\xee\x01\xf1\x13\x89\xe4\xad\x21\xcc\x36\x37\x7b\x32\xe6\x09\x85\x6c\x80\x5b\xdd\x21\x22\x9c\xcb\xcd\x16\x96\x1c\x40\x1c\xbf\x8f\x1a\xad\x4c\x47\xe5\x71\x10\xea\x58\x6d\x69\xd0\x5d\x52\x87\xc4\x97\xd5\x11\xf2\xda\x4b\x51\x07\x96\xbd\xdf\xde\x36\x8a\x67\x45\xeb\x8c\x11\x69\x85\xd9\x26\xd9\xde\xee\x02\x79\xb2\x1c\xbf\x7c\x49\x87\xe6\xec\xc8\x9a\xa9\x44\x6a\x2f\xdd\xc6\xfd\x0c\xc5\x11\x41\x71\xab\xab\x79\xf5\x7f\x87\xd9\xcb\x97\x14\x28\xc3\x68\xd7\x68\x3b\x6f\x28\x5a\x70\x78\x27\xf5\x9b\xe3\xd7\x97\x7b\x87\x97\x07\x47\x3b\xaf\x85\xce\xf3\x9e\xa2\x20\xbb\xbe\xc0\xd3\x99\x14\x1d\xa7\x31\x9b\x04\xf0\x88\xa2\xc7\x7f\x66\x8f\xaf\xa7\xf0\x5e\x56\x29\xf2\x39\x1d\xe1\x00\x7e\xa4\x68\x62\x83\xc6\xea\xc0\x14\x65\x58\x5b\x73\x85\x77\xdf\xd1\x1c\x0e\xa9\x7b\xd2\xb2\x4f\x0d\xbf\xec\xd3\xea\xfd\xf7\x0b\xf5\x62\x6c\xb9\xf5\x15\x8b\xa6\x9d\xfa\xfb\x74\xf5\xd5\x22\xb5\x7b\x0e\x41\x63\x3a\x97\x6e\x4f\x8d\x91\x7c\x80\xa8\x31\xa6\xf9\xb4\x11\x67\x0d\x62\x44\x62\x43\x7b\x30\x05\xa0\xe6\xbf\xb6\x4f\xfb\xc7\x21\xd3\xaf\x18\x8a\xd9\xba\xaf\x62\x49\x33\x88\xd7\xdc\x95\xaf\x9c\x60\x9c\xac\xa0\xac\x15\x96\x9b\xe5\xf2\x82\x02\xa9\xc4\x57\x2a\xdc\x54\x68\xe1\xcc\x41\x9f\x20\x33\x7a\xdf\x83\x8c\x85\x03\x56\x23\xdb\x10\xa0\x4e\xcc\xe5\xf5\x7f\xfb\xa0\x7c\xfd\x69\x27\x7a\x2d\x2f\x40\x14\x0d\xf9\x4e\xa0\xa2\x95\xbc\xaa\x15\x9b\x9c\xb6\x7e\x1e\x8b\x41\x5a\xf6\xc5\xa2\x86\x51\xa7\x87\x5f\x9a\x06\x7a\xd8\x3d\x01\x26\x03\x3c\x84\x31\x3a\x96\xfb\xa3\x55\xd3\x68\x5f\xda\x31\xe3\x3e\x43\x99\x0a\x99\x11\xd1\x25\x8a\x23\x86\x32\xae\x05\xac\xa4\x20\x05\x40\xfb\x71\xd8\x44\x02\x7c\x92\xf7\x94\xd6\x6f\xc9\xd0\x21\xc2\xd0\xd9\xd5\x99\x14\xe7\x9c\x91\x56\x6f\x9d\xb8\x33\xf6\x8c\xae\xba\x76\xb0\xc1\x7b\x3a\xd4\x61\x4a\xf0\xe0\x9e\x0e\x9b\xcd\xac\x54\x6f\x44\x02\x80\xcc\x3e\xc2\x5a\x17\x70\xea\x40\x60\xc1\x64\x40\x95\x3f\xf5\x8b\x37\xa3\x49\x4c\xa5\xc1\x5c\xa4\x49\x35\x20\x70\x92\xbb\xa0\xcf\x74\x24\x9f\x70\x0b\x44\x4c\x6f\x60\xc7\x21\xf6\x0c\x39\x06\x20\x43\xb8\x1a\xc4\xa8\xb1\xb9\xdd\x08\x4a\xb1\xb9\x72\x71\x0e\x1b\x67\x7e\x97\xdf\xd4\x75\x26\x21\x53\x56\xa3\x2f\x59\x97\x5b\xb1\x86\x1a\xc9\xdc\x0a\xa2\xa0\xb5\x7a\x36\x40\xea\xef\xdc\x13\x10\x8d\xc5\xf0\x01\x9e\xa1\x4f\x8b\x47\x0b\xe6\x84\x5a\xe2\xfc\x93\x1e\xd5\x4f\x8f\x16\x94\x3f\x5a\x90\x7e\x10\x06\x2d\xd2\x0a\x40\x10\x05\x01\x1f\x3c\x5a\x64\x7c\xa8\x9e\x91\x35\xcf\xfe\x1c\x51\x18\xfc\x99\x35\x44\xed\x4f\x5c\x06\x42\x6a\x59\xf2\x43\x65\xee\x87\xac\x9d\x5d\x5b\xd9\x85\x32\x28\xc7\xb0\xea\x14\xb9\x47\xd1\x29\x0d\x13\x1a\x6a\x6d\x2f\x80\x0c\x6d\x5b\x3d\x8c\x03\x00\x37\xbb\x00\x1e\xd8\x52\x36\xa2\x07\x80\x2f\x00\xfc\x6c\xd3\x6d\x10\x10\x00\x9f\xaa\xb0\x23\xaf\xa9\x89\x54\xf1\x9a\xa2\xd7\x54\xc5\xaa\x78\x4d\xdb\x87\xf2\x62\x6b\x9c\xa9\xe8\x16\xf6\x2b\x80\xaf\xa9\xc8\xde\x8b\x8b\xc9\x6e\x5c\xa8\xa0\x15\xe6\x43\x64\x3a\xc1\x29\xbe\x50\xf4\xf8\xdf\xdb\xcb\x7f\x6f\x6e\x2f\x5f\x6e\x6c\x6e\x2e\x37\x37\xb7\x97\x9b\x9b\x1b\xf2\xeb\xd1\xe3\x6b\xf8\x8a\xa2\xc7\xe1\xcb\xe5\x36\x78\xac\x2b\x7c\xa0\xea\x12\xd6\xae\x92\x77\x95\x9d\xeb\x23\xa3\xb6\x0c\x3e\x88\x39\xe2\x9c\x97\x55\x84\x92\xcf\xe8\x2a\x6a\x94\x97\xa3\xad\x55\xa2\x5f\xe7\x4d\x79\x15\xa3\xf4\xe9\x95\xa7\xe8\xbf\x39\x4b\xc1\x1f\xd5\xf9\xfb\x9b\xfa\x74\xee\x8b\xd0\xaa\x4f\xf9\x13\xeb\x53\x2e\xb7\x16\x7d\x3c\x78\x32\x74\x7d\x8d\x7f\x71\xe7\xf6\xef\x34\x64\x83\xee\x13\xf7\x9a\xd1\xbb\x95\xfc\xa7\x6e\xf6\xef\xd4\x5e\xde\x2a\xdd\x75\x37\xe4\xcd\x52\x75\x79\xeb\xa9\xef\xf2\x16\x23\xae\x1d\xdf\x1e\x26\x69\xdd\x26\x86\x29\xda\xe8\xf6\xc6\x4c\xa8\x9b\x31\x22\xd1\x4c\xfc\x6a\x36\xc3\x14\x09\x65\x18\x11\xa1\xc5\x58\x0b\xf2\x85\xc8\xec\x75\x94\x52\xaa\x71\xa0\x3a\x40\x57\xd6\x9f\x10\x79\x1c\x52\x80\x68\xae\x7f\x41\x13\x5c\x68\xa3\x03\xe4\x81\xb0\x5b\xcd\x5b\x68\x4b\xba\x70\xdf\x11\xe9\x15\x95\x82\xe8\x09\xd2\xfa\xad\x76\x42\x3c\xce\x13\x69\x7a\x54\x50\xe2\xba\x91\xb8\x7a\x58\x41\x07\x3f\x0d\x7b\xf1\xff\x4d\xdb\xbb\x70\x39\x6d\x3b\x7f\xe3\x6f\x25\xeb\xf2\xb8\x52\xa3\x0d\xc9\x42\x69\xeb\x20\xf2\x50\x58\x5a\x5a\x6e\xe5\xd2\x5b\xf0\x97\x6a\x63\x6d\xa2\xe2\xc8\x41\x56\x80\x65\x93\xef\x6b\xff\x1f\x8d\x2e\x96\x1d\x2f\xed\xef\x77\xfe\xcf\xe9\x29\xeb\xc8\xb2\xee\x1a\xcd\x8c\x66\x3e\x73\x44\x4d\xbb\x15\x4e\x53\x2d\xec\x55\x1c\x61\x44\x36\x4c\x79\x49\x27\xe3\x69\xd9\x98\x7e\x95\xf1\x89\xa1\xe6\x65\x3e\x7d\x24\x90\xf5\xaa\x26\xa6\x12\x41\x18\xde\xef\xa1\x24\x46\x8c\x4c\x1b\xe9\x44\xb8\x68\xad\x18\xb0\x31\x9b\x79\xa9\xf1\x25\xff\x68\x96\x45\x16\xff\x86\xfe\xc4\x6b\x4a\x09\xcf\x80\xf9\x8f\x6b\x6e\x1d\x1b\xcd\x68\xe1\x8c\x8f\xcc\x4e\x71\xc6\xb2\x34\x62\x77\x85\xe8\x38\xd7\xd9\x4a\xee\x55\x6b\x73\x68\xf6\x5e\x4e\x04\xa2\xf5\x49\x11\x88\xdf\xea\x7f\x7f\x6f\x88\xd8\xf6\x64\x3c\x3e\xbb\x36\xb1\x7f\x13\x8c\xf7\x86\x9a\x47\xca\x50\xd1\x51\xff\xb4\x3b\x7b\x6a\x0d\xae\x6d\xa3\x1d\xfb\xa2\x0e\xdf\x36\xa3\xe1\x92\x9e\xbc\x80\x68\xa0\x91\xee\x51\x74\xdd\xbe\xbf\xcb\x21\xbe\x9e\x07\x9b\xe3\x98\x48\x6a\xb6\xda\x74\x32\x3e\xb9\x99\xf2\xf9\x49\x0e\xee\xee\x27\x79\x4a\x8f\x27\xe3\x93\xaf\xc9\x27\x8d\xa4\xa1\x97\x10\xf7\xc9\x0a\x1c\xc2\x70\x9a\x8d\x66\x52\x44\xa6\x14\x5e\xb9\x33\xf1\x9c\x73\x50\x2f\x4e\xc6\x43\x4e\x9c\xac\x16\xdf\x27\x18\xc6\x62\xf2\x4d\x3e\x6d\x8c\x8c\xa4\xdd\x9c\x4c\x20\x09\x37\x1e\x77\xac\xb5\xa7\x3a\x9e\xe4\xf3\x9b\x39\x15\x66\x63\x87\x1b\x24\x10\x95\x4c\xd9\x78\x7a\xd4\x56\x8b\x3e\xb2\x63\xcc\xe7\x93\x49\x4e\x4e\x48\xb0\xa3\xc0\x84\x1b\xb9\xc2\xba\x16\xcc\x6f\xd9\xa7\x3d\x12\x66\x91\x0a\x1c\x6c\x10\xd9\x7c\xf2\x5d\x68\x55\x99\xa6\xe5\xa8\xe0\x9a\x2d\x56\x86\xe2\x21\x36\x9f\xe4\x98\x88\xf9\x0d\x57\x8e\x69\x93\x7f\xb2\x43\x77\xf2\xdd\x3e\x98\x24\x35\x3e\x49\xcd\x50\x1d\xa1\x93\xaf\x6f\xc1\x78\xe3\xd8\x29\x73\x32\xc9\xa7\xa7\x76\xc3\xa9\x78\xdb\xa6\xe9\x23\x4f\x8a\x6e\xc4\x5d\x89\x57\xa6\xf3\x04\x33\x74\x11\x9c\xfa\x83\x96\xb4\x12\x86\x5a\xe6\xc4\x09\xd3\x53\x3e\xf5\xc6\x56\x1e\x00\x60\x63\x56\x13\x86\x06\xdc\xc8\xa7\x91\xcd\x24\xdc\x22\x8f\xf3\xa9\x91\xa3\x15\xd5\x10\x63\xf2\x48\x39\x42\xca\xd3\xf4\x88\xcf\x6f\xe6\x69\x0a\x92\xf4\x14\x43\x31\x69\x5a\x09\x04\xb7\xaf\x1c\x13\x6e\x17\x97\x37\xd3\x71\x32\x3d\x39\xcc\xa8\xcc\x4b\x53\xd8\x9e\x53\x65\x28\x44\x4c\x19\xaa\x2b\xc6\x8d\x87\xc1\x26\xe6\x71\x47\x4f\xbe\xbe\x45\xda\xab\x00\xfa\x19\x99\x01\x78\x1a\x6a\x7a\xd3\x32\xce\xc6\xb8\x2d\x23\xab\xc6\x0c\x92\x9e\xc4\x97\xea\xc1\xe6\xf7\x08\x75\x6e\x28\xa3\xa8\x9e\x5e\x31\xdd\xc3\xd3\xb5\xc5\x00\xde\x88\x01\x4d\x35\x66\x9b\x18\x86\x2c\x87\xcd\xa9\x4c\x49\x70\x35\x68\xed\x81\x45\x6c\x0f\x1c\x8c\x85\xb9\x7d\xa9\x5b\xa6\xc4\x16\x95\xb0\x33\x24\x8d\xc2\x7f\x51\x72\x26\xb7\x1b\x62\xd8\xbf\x6f\x72\xc7\x8c\x5a\xe3\x22\x7f\xd2\x84\xe6\x32\x3a\x9e\xb2\x30\x2a\xc7\x93\x29\x33\x0d\xee\x33\x21\x51\x73\x96\x47\x17\x08\x60\xc7\x48\x4a\xda\x0f\x5d\x68\xa8\x98\xf7\x89\x26\x35\x15\x73\x09\x5f\x9c\xe4\xd6\xea\x97\x0d\x6f\xe4\xd3\xe4\xac\xaa\x4c\x4b\xa3\xc0\x91\xb3\xb2\x37\x10\x9b\xa9\x1a\xec\x7e\xb3\xea\x0e\x1d\xcf\x4c\x69\x55\x8e\x70\x66\x1e\x8e\x2b\x50\x5d\x6e\xcf\xea\x85\x12\x67\x1c\x61\x62\x7a\xb0\x6f\x2d\x76\x5f\xfd\x24\xcf\xa7\xa6\xac\x30\xa6\xcd\x88\x88\xc6\xc1\x43\x53\x39\x9c\x4c\x75\x23\x2f\xe9\xe1\x10\x8b\xb9\xce\x11\x9e\x9a\x01\xb5\x94\xc5\xcd\x01\x98\x74\xcd\x27\xd6\xaf\x23\x4d\x4f\x4d\x9f\x27\x93\x1c\x9b\x55\x3f\x99\xe4\x7e\x2d\x06\x7e\x10\x36\xe3\x37\x79\x3c\x17\x69\x0a\x62\xc9\x0d\xb3\xf4\xd5\x11\x85\xad\x05\x74\xd2\x10\xfd\xd8\x12\xb1\x21\x5c\x22\x4d\x45\x4c\xb8\x34\x8e\x6f\x21\x16\xdd\x63\xa8\x80\x04\xef\x85\x14\xab\xa4\x0a\xd1\xd6\x6d\xf0\xae\xdf\xf5\x4d\xef\x6b\x37\xc5\x82\x22\x4e\x05\xf6\xbe\xc2\x3d\xe6\xaf\x6a\x3e\x86\x9e\x9d\xa4\xc2\x81\x69\x74\x1d\x60\xba\x37\xda\x79\x1b\xe5\xc9\x6b\x48\x2c\x18\xdc\x6e\x67\x9f\x3d\xee\x53\x1c\xdd\xcd\x93\xe1\xb7\x1a\x89\x56\x8f\xb6\x2d\xde\xce\x1f\xc0\x42\xd6\x5c\xe9\xef\xf9\x79\xa5\x1a\x03\x95\x8c\xb7\xd3\x9d\xd9\x4a\xe3\x4c\x79\xc0\x77\xd8\xe8\xe4\xa0\x40\xf5\xac\x47\x9c\x14\xb7\x63\xd3\x6a\x87\x1f\xd0\x59\xab\x79\x59\xa8\x21\xf2\xa2\xec\x67\x97\xec\xa0\x3b\xd6\x28\x78\x4b\xb7\xfd\xaf\x97\xdd\x79\xbf\x77\x58\xfc\xba\x9b\xe7\xe6\xd8\x99\x7d\xcc\x00\xb1\xc0\x71\x26\xc0\xf7\xbf\x17\xe4\x42\x90\x33\x41\xee\x09\xba\x16\x8d\x0c\x70\xd7\x35\xf1\x9e\xa0\x9a\xbc\x17\xb1\x20\xf2\x42\x1c\x8a\xe3\xb0\x1c\x85\xb5\x6e\xb5\xc7\x76\x49\x97\x02\x79\xf7\xcf\xdd\xce\x1c\xd7\x90\xa1\xd9\x15\x12\x1f\xd0\x58\xd5\xd0\xd8\x9a\x8e\xa7\x75\x43\xca\xeb\xe1\x10\x6f\x04\x62\x46\x96\x9c\xd7\x39\x29\xc9\xd1\xc4\x09\xd3\x3e\xd9\xa5\x05\x9d\xfe\x7b\x91\xa6\xef\xcd\x3b\x61\x4d\xa5\x62\xf4\x53\x71\x60\x8c\x1f\x1d\xe5\xc1\xbe\xf3\x46\x1a\xae\x90\xdf\x1a\x96\x4e\x43\xeb\x6f\x36\xa9\x3f\x0a\x74\x3c\x21\x7a\xce\x3d\xe8\x83\x79\xff\x6d\xaa\xe2\xc2\xac\x43\x66\x4c\x97\xdd\xc7\xd0\x08\x85\xa7\x11\x8b\xe7\xcb\x89\xe4\x29\x85\x67\xb6\x16\x05\xd4\x56\xe1\xbd\xa1\x68\x37\x4e\x9a\x46\xfc\xa1\xa0\x69\x08\xef\x76\x2f\x35\x8a\x1b\xd3\xa8\x46\x45\x4b\x07\x1c\x64\x91\xee\xe8\xcf\xcc\xee\xce\x7e\x15\xe8\x27\x90\xd2\x6e\xe5\xd8\x54\x6b\x47\xcb\x07\x72\xef\x35\x16\x7a\x23\x0e\x90\x22\x00\xae\x52\x3b\x73\xba\xd1\x46\x55\x4e\xcb\x37\xe7\xd1\x8f\xae\x7f\xf1\x8f\x1d\xae\x77\x32\x1e\xea\xa1\x35\x99\x0d\xe7\x6d\xeb\x44\xcf\x81\x31\x9d\xe4\x91\x23\xee\x34\xa6\xf8\xf1\x58\x47\xd7\x04\xf3\x6f\x22\xfd\xd2\x07\xd1\x75\x92\x71\x1b\x74\x2a\x0e\x05\xad\x86\x50\xd8\x53\x2c\x10\x0a\x22\xcc\x9e\x8d\x13\xad\x72\xb7\x6b\xf3\xf9\x58\xc4\x56\x6f\xa4\x6c\x89\xb6\x2a\xa8\x97\xcd\x81\xea\x98\x7d\x38\x4f\xc3\xa2\x2c\x2d\x1c\x86\x61\xc8\xea\x34\xbd\xa6\xd0\x4b\x6d\x24\x43\x61\xb8\x7c\x20\xc8\x3b\x7a\x13\x93\x5b\x37\x8f\x28\xba\x75\x33\x75\x69\x18\xc3\xc2\xac\xb0\xaf\xdd\x2e\x4b\xd7\x86\xa3\x09\x26\x4e\x48\x94\xa4\x26\xac\xd1\x52\xdd\x38\x49\xab\xc6\x72\xeb\x0f\x65\x55\xff\x10\x72\xd8\x9e\x22\x15\x2d\x91\x11\xc3\xfd\xd7\x95\xf9\xba\x55\x96\xe5\x73\x26\xb7\xd2\x6a\xf6\xd1\x56\x2e\xc0\x70\x91\xe1\xac\x5d\xa7\xa2\xe5\x4c\x45\x6b\xe3\x89\x8d\x8b\x6c\x96\x5d\x74\xf0\x3d\x12\x6d\xa3\xc1\xc7\x02\x68\xba\x6e\x79\x62\xfb\x5e\x45\xee\x61\xa2\xdf\xd6\x50\x99\x05\x4a\x6a\x5a\x76\x16\xa9\x88\x17\xe9\x21\x33\x18\xf1\x9c\x15\x1d\x4f\xab\xdb\xb5\x27\x54\xd5\x70\xd8\x8c\x46\x3d\xaf\xf2\x30\x9c\x6e\xe8\x6b\x52\xce\x6f\xe4\xb6\x85\xb1\x83\xd0\x9f\x7d\x12\x70\xec\xc6\xe4\x2c\x41\xec\x91\x04\xcf\xa3\x45\x5d\xdb\x40\xca\x91\xc7\x57\xa7\x18\xc0\x0b\x57\x61\xb9\xb6\x0a\xb4\xa6\x27\x70\x1f\xd5\xa9\xca\xbe\xb1\x55\xc1\xb3\x8d\xf0\x1a\xf9\x48\x09\x23\xb7\xbc\x67\x6a\xc0\xc3\xf5\xbf\xe5\x14\x10\x8f\xf1\xc3\xe3\xcb\x81\x0b\x91\xa6\xe8\xc2\x19\xda\x7f\x3f\xd2\x6a\x5b\x6b\x5e\xbc\xbc\xd8\xf0\x1a\x63\xc3\x08\x5f\x08\xda\x4e\x76\x32\xf2\xb3\xaa\x14\x8b\x0b\x94\x30\xb9\xdc\x96\x4c\x25\xc4\xa1\xfe\xfc\xf8\xf2\xf1\xa3\xcc\x48\xf0\xc4\xfe\x7e\xb1\x50\x62\xa3\x0f\x53\x5e\x3d\xb7\xd9\xf6\xd8\x05\x1e\xd7\x38\x44\xec\xbb\x10\x7b\x84\xb1\x8f\xad\x6d\x9d\xe5\x2d\x22\x15\x1f\x35\xb5\x20\x6d\xf2\xc4\x9e\x5f\xff\x8b\xfe\x9f\x99\xfe\x9f\x7d\xa6\xff\x67\xff\xae\xff\x5f\x6c\x65\xcd\xce\xf9\xf1\xd9\xc5\x06\x66\xe9\xff\xc7\xd1\x38\xfb\x1f\x8d\x86\xbd\x80\x7e\x2a\xda\xb7\xf9\xee\x2e\x1f\x50\x48\x85\x5c\xbe\x5c\x89\xfa\x7b\xc5\xd9\xdb\xfa\xee\x66\x53\x8a\x05\x30\x81\x2f\xf8\x62\xab\x84\xbe\xa0\xba\xe7\x8e\xfc\x05\x3b\xb7\x17\x55\xf6\x16\x64\x5b\xf3\xc1\xdc\x83\xd4\xe5\xd4\xf9\x9c\x67\xfe\xee\xfc\x5f\xd5\xb3\x1f\xa0\x9a\xf3\x81\x0f\x1e\xbb\x1c\x2d\xaa\xeb\x72\x79\xbd\x76\xaf\xbf\xf8\x58\xd7\xf8\x2f\xef\xa2\xf9\x56\x04\x94\xf9\xa7\xe2\x72\xc9\xb5\x99\x0b\xb3\x01\x42\x13\x13\x33\x0a\x89\xcf\xff\xec\x9f\xf3\xbf\x80\xad\xeb\x3f\x78\xf2\x2f\x3e\x80\xa9\x0a\x5f\x3c\xff\xe7\x2f\x5e\x3d\x6f\x5a\x74\xff\x9f\xb3\x3f\xe7\xf6\xae\xd0\x7e\xd6\x38\x5c\x89\xab\xcc\x78\x9f\x8a\x99\xfe\x77\x83\x1d\x87\x00\xf8\xbb\x73\xa0\xff\x60\xca\x6f\x4e\x68\x95\xa6\xca\x72\x5f\x46\x1c\x8d\xdb\x64\x9d\xa4\x13\xf7\xe8\x15\x22\x47\xe3\xe9\x01\xcc\xe1\x73\xfe\x6e\x2b\x14\x2f\x06\x6c\x60\xb6\x05\x80\xc4\x93\xc1\xb2\xd2\x03\x66\xa1\xe3\xff\xc5\xd4\x37\xf8\x90\xa6\xb2\x08\xd7\xea\x33\xc3\x91\xa6\x60\x4e\xd8\x0c\x6d\x17\xb9\xf1\x53\xfc\xb1\x69\xf0\x5b\xd1\x32\x0c\xfc\xbe\xfb\xfe\x59\xfb\xfd\xab\xee\xfb\x27\xed\xf7\xd7\xba\xef\x9f\xb7\xdf\xbf\xeb\xbe\xbf\xdf\x7e\xff\x9b\x88\xf5\xf8\x26\xc3\x4f\x02\xf5\x18\x30\xe1\xcb\xc6\x11\xe6\xe8\x08\x99\x8c\x16\x44\x7b\x74\xff\xe9\xe3\x67\x4c\xd5\x5c\x61\x1b\x45\xfb\x81\xaa\xd6\x6e\x37\x3f\x14\x28\x49\x30\x49\x34\xff\xa8\xaf\xaf\xf4\xba\x4c\x22\x72\xe3\xca\x9a\xec\xf7\x08\xcf\x4c\x79\x7f\x08\x10\x79\xdc\xf2\xfd\xa3\x9f\xa2\x08\xc9\x95\xbe\xef\x90\xe2\x7e\xe4\xe5\x86\x2b\xaa\xf7\x4b\xae\x1f\x9a\x17\xdf\x57\xc5\x85\xd7\xaf\x9a\x2f\x68\x72\xfb\xac\x2a\x2e\xee\xdc\xb6\x07\xdf\x9d\xdb\xd7\xdd\x43\x32\xd4\x91\xb7\x09\xa7\xff\xbe\x43\xba\xdd\x9f\x91\x29\xff\x00\x6a\xe5\xaa\xa6\x8e\xfa\x1b\x9a\xa1\x36\xd3\xc8\x23\x46\x06\x6e\xa5\xed\xa0\xb5\x79\xeb\xbd\xdf\xe8\x3f\x1d\x8c\x94\x33\x61\x1b\x15\xf6\x7e\xf8\x7e\x13\xba\xbd\xd5\x26\xda\xc9\x34\x02\x3c\x40\xf3\x06\xb6\x72\x44\xec\xfd\x17\x28\xa9\x99\x14\x5a\x7c\x82\x0c\xc7\x50\x5a\xe2\x7d\xc2\x0e\x2b\x80\xc1\x39\x08\x04\x1d\x67\x68\xab\xc4\x13\x3b\xa6\xd3\x9e\x8c\xb1\xf8\x1d\x62\x7c\xf3\x7f\x51\xa4\x69\x82\x29\xb2\x2d\xd3\xe3\xfd\x55\x6b\xe6\xdf\x97\xec\x01\x42\x13\xeb\x05\xe5\xa0\x2f\x12\x0b\x3e\xe9\x64\x8c\x91\x90\x92\x2b\x33\x84\xd4\xae\x9d\x26\x64\xcc\xbf\x6e\x7a\x30\xf8\xec\x96\xd5\x9d\x3e\x0f\xa0\xf8\x18\x34\xce\xf0\xb6\xd6\x4a\x6c\xee\x6d\x6b\x5d\xad\x9f\xd4\x00\x49\x8e\x14\x26\x6a\xdf\x93\x1e\xf7\x1d\x6c\x89\x81\x11\xac\x23\xdb\xa3\x08\x38\x62\x7c\x5b\x4c\xc5\xf1\x71\x2c\xe3\x0a\xcd\xd7\x48\x60\x80\xc9\x9d\xa2\xe4\xe3\xba\x94\x75\x26\xeb\x49\x62\x1d\xc9\xc1\xcb\xbc\x89\x92\x23\xeb\x49\x96\x60\xf0\x45\xe9\x32\xa5\x0a\xef\x1d\xf4\x45\x2c\xd0\x59\xbf\xe1\x29\x56\x23\x59\x15\xfc\xa5\xf5\x5f\x79\x52\x15\x7c\xe4\xed\xf9\x9e\x3c\xbd\x7f\xfa\xf9\x6e\x53\x2b\x49\xbc\x10\x67\xa5\x90\x4b\x6f\x69\xf7\x8b\xa0\xd7\xff\x83\x66\x19\x9a\x65\x70\x40\xcc\x76\x6b\x26\x4a\x5d\xed\xce\xf5\x66\xa7\x79\xb9\x3b\x17\x25\xdf\xd5\xeb\x1a\x67\xbb\xf9\x7f\xd2\xec\xfa\xec\x8b\xfc\x2b\x34\xcb\xe6\xe6\x61\x77\x0d\xe3\xeb\x4b\x41\x7e\x36\x85\x00\xd2\x39\x9a\x65\x62\xcd\x96\xfc\xf5\x75\x34\xcb\xce\xd6\x9b\xdd\x52\x9c\xef\xfe\xde\xf0\xe5\xee\xef\xcd\x72\xb7\x91\xcb\x9d\x16\xe7\xe7\xbb\x0f\xfc\x6c\x83\x77\xef\x45\xc1\x2b\xc8\xb9\x36\x39\xd6\x9b\x9b\xbb\x6a\xb9\x34\x2f\xd7\x78\xc7\xb6\x85\xf0\x2f\x6f\xec\xaa\x25\x83\x77\xd5\x66\x5b\x63\x3c\x3d\x63\x35\xbf\x75\x93\xcc\xd9\xf1\xa7\xf1\xf1\x77\xc3\xd7\xd7\xf3\x21\xfd\xea\xda\xf5\x48\x7d\xf3\x7b\x44\xfa\x91\xa6\x21\x32\x0d\x1e\xad\x81\x9c\xfc\x22\x20\x1a\x88\xfd\xf1\xb3\xc0\x33\xc0\xe7\x34\xc7\x67\x96\x0c\xe3\x5b\x54\x79\x55\x39\xf5\xa6\x14\x1a\x25\x24\xb1\x58\xe3\x9a\xde\x31\x75\x8e\xb4\x12\x6b\x84\x71\x1c\xb9\x29\xba\x26\x94\x2d\xd0\xa9\x18\x01\x5a\x0d\x20\x90\x4d\x53\x2a\x36\xc2\x3d\x3d\x1a\x4f\x0f\xed\x4b\x94\xb7\xa9\xfe\x4c\x49\xf8\xc0\x9e\xfb\xc0\xb5\x55\x63\xb8\x2f\xd3\xa6\x96\xe6\xb6\xdc\x2d\x0c\x29\x29\x97\x28\x61\x8a\x33\x72\xa6\xc8\xa2\x2a\xc9\x4a\x11\xb1\x5e\x92\x0f\x67\x2a\xc1\x84\xd9\xf7\x8b\xaa\x5c\xaa\x6a\xbb\x21\x45\x41\x0a\x4d\x4a\x41\x36\x44\x9b\xbd\x4b\x74\x41\xf4\x79\x55\x19\xda\x4b\xf4\x8a\xb3\x82\x68\xf3\x5d\x69\xbf\x53\x1b\x02\xd4\xb3\x96\xd4\x48\x0e\x92\x28\x89\x98\x24\x50\x65\x51\x28\x5e\xd7\x84\x29\x2d\x16\x25\x27\xac\x16\x05\x27\x67\x65\xb5\x78\xfb\x6e\x5b\x69\x4e\x16\x0c\x8c\x1e\xc8\x82\x4b\xcd\x15\x29\x78\x49\x0a\xae\x99\x28\x6b\x52\x08\x56\x56\x4b\x52\x08\x45\x0a\xf1\x9e\x14\x25\x39\x17\xcb\xad\xe2\xe6\x8f\xff\xcc\x34\x8a\x2b\xb2\x9a\x90\xd5\x09\x59\xdd\x20\xab\x9b\x64\xf5\x35\x59\xdd\x72\x01\xbf\xc9\xca\x76\xc8\xf4\x56\xd6\x64\xcd\x84\x24\x6b\xb6\x21\x6b\x2e\xb7\x44\xb2\xf7\xa4\x2a\xc9\x46\x71\x52\x5b\xd9\x98\xd4\xdb\xf5\x9a\xa9\x0b\x02\xe1\x5f\xc8\xb6\x4c\x30\x36\x9d\x29\x5d\x67\x08\x3b\x3b\x53\x84\x2d\x54\x25\x2f\xd6\x04\x56\x35\x39\x23\x67\x85\x20\x67\x45\x45\xce\xc4\x12\x46\x57\x98\x6e\x55\x05\xb7\x9d\x39\x97\x84\xaf\xc9\x79\x25\x35\x11\x30\xe4\xa6\x21\x6f\xcf\x0a\x52\xb2\x33\x5e\xda\xd6\x30\xf5\x96\x6c\xc4\x42\x9b\xce\xbd\x23\x6a\x7b\x76\x41\x60\x4c\x49\x4d\x6a\xb6\xde\x90\x7a\xcd\xca\x92\x58\x76\x92\xd4\x1b\x26\x89\xa1\x0b\x6f\xb9\xf9\x53\xc9\x25\xa9\xb7\x67\xa4\xde\x6e\x88\x16\x6b\x4e\xb4\x62\x8b\xb7\x44\x6b\xb2\x25\xef\x99\x22\xb0\x31\x9b\x7e\x30\x89\x31\xa9\xec\xbc\x9d\xb1\xc5\x5b\x33\x3e\xb2\xb0\x8d\x5e\x29\x7e\x4e\x0c\xf5\x03\xa0\xa7\xb2\x92\xcb\x82\xd7\x0b\xb2\xa9\x6a\x33\xc6\xb5\x5a\x90\x8f\xa5\x90\x6f\x33\x93\x2f\xc1\x64\x61\x4b\xa9\xd5\xa2\xe6\x66\xfa\x0b\x98\x7e\x33\x97\x6e\xb8\xec\x60\x2d\x78\x5d\xbf\xe5\x17\x84\x95\x62\x29\x09\x2b\x35\x61\x5b\x5d\x6d\x4a\x76\x41\xd8\x47\x51\x93\xb3\xe5\xa2\x2a\x2b\x45\xce\x2a\x65\x66\x6c\xc1\xcb\x72\xc3\x0a\x23\x15\xc1\x73\xbd\x61\x0b\x78\x36\x2c\x02\x59\x94\x9c\xc1\x02\xae\xe0\xdf\x1a\xfe\x31\x03\xb2\xa8\xd6\x1b\xb6\xd0\x00\xdb\xa6\xec\x8b\x4a\x15\x35\x29\x98\xe6\x30\x2c\xee\x78\xb1\xcb\xa9\xfa\x20\xcb\x8a\x15\xe4\x9c\x2d\xb8\x5b\x2a\x35\x59\x71\xb1\x5c\x69\xb2\x82\xe8\x6a\x30\x18\x25\x93\x4b\xb2\x02\xe8\x30\x22\x6a\x33\x55\x66\x74\xea\x45\xb5\xe1\xf0\x64\xe4\x38\xf2\x56\x48\x3f\x99\x90\xdf\xfc\xb3\x65\x4b\x33\x80\x95\x59\x69\x85\x60\x64\xbd\xd5\xbc\x20\xb2\x82\x11\x96\xd5\x07\xc5\x36\xa4\xda\x40\x38\x27\x0e\x0d\x51\xbc\x24\x8a\xbf\x27\xaa\x2a\x39\x51\xd5\x87\x1a\xfe\x31\x1d\x53\xdb\x92\xd7\xc4\xd6\x59\x2f\x54\x55\x1a\x8a\x4f\xea\x15\x33\xbf\xc5\x27\xfb\x4f\xed\x56\x85\x5a\x40\x13\x6a\x70\xd6\x8c\x16\x33\x9c\x56\xc4\x06\xcf\x23\x5a\xe8\x92\x5b\x34\x7f\x73\xea\x13\x98\xed\x6d\xcd\x4d\xff\xde\xdb\x59\x02\x8b\x7c\xf2\xde\xf6\xfc\x83\x28\xf4\x2a\xc1\x76\x4e\x95\x60\xc7\x0c\xae\x43\x1a\xab\x6a\x62\x53\x75\xb5\x16\x0b\xf7\xbc\xd5\x95\x99\x91\x92\x6b\x6e\x53\xce\xb6\xf5\x85\x7d\x5a\x58\xd4\x2f\xf7\xa3\x2a\x17\xd5\xd6\x17\xb1\xa8\x4a\xdb\x52\xff\x0b\x7a\xe5\x7e\xb8\x79\xb5\xbf\x2c\x30\x9b\xfd\x61\x1a\xa2\xc4\x19\x2f\xce\x2e\x7c\x82\x25\x20\xf6\x87\xa8\x01\xe8\xd6\xfd\x32\xf4\xf2\xfc\x9c\x2f\xdc\xb7\xdc\x48\x5d\xde\xb2\xcb\xa6\x7c\xdc\x30\x59\xf8\xfc\xe7\x65\xf5\x41\x57\xf6\x79\xa9\xd8\xd9\x99\x7f\xb1\x62\xf5\xa6\xda\x6c\x37\xee\x97\x5d\x33\xf0\x2c\xa4\x19\x44\x97\xed\x2d\xbf\xa8\x57\x95\xd2\x8b\xad\x76\xed\xb1\x2b\xa5\x79\x2c\x9b\x76\x97\xfc\x7d\x78\x25\xde\xbb\xf6\xac\xab\x82\xb9\xc4\xf5\xb6\xd4\xa2\x14\x92\x47\x3f\xad\xf9\x3b\x90\x2b\x48\xac\x94\xf0\x6c\xaf\x4b\xf8\x20\x5d\xcd\x60\x16\xb2\xaa\x4a\xb3\xcb\x6c\x42\x55\x0b\x59\x73\x37\x14\x1b\x43\xa8\x7d\xf7\x14\x67\x45\x25\xcb\x0b\xff\xab\xe4\xef\xc3\x44\x2b\x27\xa2\xba\x5f\x55\xc9\xed\x0c\x6c\x9a\x4a\x55\xf5\x21\x9a\x56\x55\x7d\x88\xa6\xd5\x2f\x6c\xf8\xe1\x31\xec\xfc\x2f\x0d\x4b\xda\xfe\xa8\x94\xfb\x1e\x56\xe3\x9a\x7d\x8c\x7f\x09\x19\xfd\x92\xd5\x87\xe8\x97\xb5\xba\xc5\x64\xeb\xe8\x13\x34\xcd\xc6\x5e\x21\x11\xab\xeb\xbc\x37\x64\x4b\xe6\x70\xc2\x99\x13\x0e\x78\xf1\xa2\x5a\x73\xbd\x8a\x61\xab\xce\xb6\xe7\x74\x9e\xef\x7d\x0e\xe0\xe9\x14\x8f\x0d\x1f\x62\xe5\xad\x02\x00\x18\x67\xec\x00\x96\x8f\x9f\x63\xfa\x66\x8e\x99\x86\xfd\x1b\x99\xd7\x1c\x7e\xf5\xf2\xf4\x77\xf7\x89\x57\x1b\xa9\xda\x15\x0e\xca\x26\x9c\x5d\xd9\x8f\x31\x51\x69\xda\x12\xcc\x38\x8d\x7f\x46\x98\x46\x7c\x8a\x2f\x3f\xdf\x62\xc7\xa6\x72\x59\x34\xcd\xb5\x76\xbd\xd4\x35\x8c\x2f\xde\xde\x2b\xab\xb3\x33\xae\x78\x93\xc7\x5d\xc0\x38\xfe\xd5\xba\x39\xe2\x4b\x4e\xb5\x03\x3c\xe2\xff\xf4\x75\x73\x9b\xd8\xf8\x3c\xba\xd9\x71\xcc\x5a\x82\xf7\xad\x61\x6c\x49\x05\xa6\x4b\x4f\x00\xb9\xba\x7a\x54\x7d\xe0\xea\x1e\xab\xb9\x0d\x8d\x79\x54\xcb\xc3\x10\x75\x38\xae\xa2\x7f\x4c\x8f\xb6\x3d\xdf\x4d\x43\x9b\xc0\x9e\x35\xb9\x9d\x60\xd2\x4e\xe2\xb8\xe3\xf7\x78\x20\xab\x74\x6c\x40\x86\xb1\x4b\xa4\x93\x54\x00\xc6\x05\x82\x7a\x48\xda\xd7\xa5\xe2\xa0\x69\x12\x7f\x66\xa1\x83\xef\xb8\x16\x72\x6b\x21\x89\x18\xd5\x36\x96\xdb\xb4\x92\x73\x99\x43\x7c\x92\xdf\x05\x62\xd8\x70\x00\x3e\x41\x4b\x48\xe8\xf4\x77\x90\x10\x4e\xbe\xa4\xc9\x97\x64\x69\xde\x93\x2f\x93\x2f\x0f\xa7\xcb\x66\xbd\x93\x60\x72\x34\xde\x47\x0b\xe9\xdf\x4c\x58\xdf\x64\xa5\xe9\x91\xec\x4d\x46\xdd\xd9\xb8\xde\x33\x1d\xdd\x2e\xdc\x49\x30\xde\xdb\xed\xe5\x35\x37\xe1\xe5\x52\x82\x9f\x4d\xff\x2a\xf5\x57\xb2\xdc\x21\x59\xae\xcd\x92\xf5\x02\xf2\xb3\xaa\x16\xa0\x8d\xe2\x38\x85\x3d\x75\xff\xe9\xbd\x57\xb0\xa9\x9e\x3d\x7d\xf1\xf0\xe5\xc3\xa7\x4f\xde\xdc\x7b\xfa\xe4\xe5\xdd\x87\x4f\x4e\xef\xbf\xf9\xfe\x0f\xec\xb7\xde\x3f\x64\x3b\xd0\x26\x3e\x60\xa2\xe4\xc5\x40\x57\x03\x3f\xd1\x83\x95\x5e\x97\x83\x33\xbe\x60\xdb\x9a\x0f\xf4\x8a\x0f\x1c\xaa\xea\x40\xd4\x83\x85\xef\x84\x35\x87\xae\xb6\xda\x8a\xe9\xfb\xbf\x22\x91\xc2\xbb\x75\x49\x7a\x7d\xfe\x7a\x7b\xff\xdb\xf1\xf8\xf8\xf5\xf6\xfe\xf7\x0f\x1e\xe4\xe6\xe7\x3d\xfb\xf3\xc1\x83\x07\xf9\xf5\x25\x39\x97\xf4\x3a\x9a\xff\xe7\xf5\x17\xc7\xff\x1d\xec\x8e\x72\x7c\x7d\xd9\x48\x75\xcb\x7e\x33\xc6\xeb\xe9\xf5\x25\x49\x52\xb6\xde\x4c\x13\x1c\x52\x37\x92\x1c\x1a\x3f\x26\xe9\x17\xc9\x10\x4d\xc6\x27\x37\xbf\x42\x1d\x98\x98\xe3\xaf\xbf\x3e\xf9\xee\x16\x1e\xb6\xd3\x27\xf8\xf8\xeb\x5b\x37\x4e\xc6\x78\x68\xd1\x1a\x87\xc9\x34\xd9\x37\x95\x9c\x5f\x59\x49\xa7\xf4\xce\x77\xd7\x6f\x43\x93\x4b\x1d\xb7\xf8\xfa\x1d\x48\x5c\x9a\x44\xd8\x47\xeb\xd8\xcb\x2c\xb6\x0a\xb3\xd6\x6f\x5a\x5d\x5c\xae\x25\x5d\xcb\xdd\x0e\x54\x99\xce\xd1\x99\xcf\x9c\x98\xca\x71\x96\x24\x53\x45\xd7\xb2\x57\xf7\x26\x3c\x0c\xe2\xd7\x84\x51\x31\x2d\xaa\xcb\xe0\xf9\x7c\xe0\x9e\xf1\x6f\x56\x05\x04\x06\x33\x6b\x62\x2b\x6b\x60\x2f\x12\x3c\x95\xc7\xc7\x44\x50\x46\x18\x8d\x54\x38\xe4\x33\x4d\xda\x7f\x58\x89\x92\x23\x01\xf0\x8a\x7e\x05\x3d\x14\x08\x94\x94\x2b\x89\x47\x07\xa7\xe8\x85\x44\x0a\xef\x76\x0a\x37\xe6\x63\x6d\x3f\x70\x9f\xc1\x1e\xaa\x2d\xc5\x0a\x6e\xdf\x62\xc7\xef\x5a\xd6\x46\x17\xf1\xec\x46\xca\xae\x16\x5a\x45\xb4\x32\x3f\x7f\xfe\x25\x2f\x4f\x1f\x3f\x7b\x74\xf7\xe5\xa9\xf5\xbb\xf0\x84\x6a\xef\xec\x68\x6d\xf1\xd6\x30\xe0\x3d\x53\x83\x33\xe9\x2d\xf7\xcf\x24\x3d\x93\xd6\x72\xff\x4c\x8e\x9e\x3c\x7d\x72\x0a\x21\x26\xcd\x43\x42\xce\xa4\x49\x04\x15\x19\x04\x0c\x7d\xf9\xf8\x91\x4f\x7c\xf1\xf2\x8f\x47\xa7\x36\x66\xa8\x79\x0a\xc9\xf7\x9e\x3f\x7c\xf6\xd2\x86\x9d\x84\x47\xff\xe2\xd5\xf3\x47\x10\x4a\xf4\xd5\xf3\x50\xc4\xf3\xd3\x17\x4f\x5f\x3d\xbf\x77\xfa\xc6\xbc\xfb\x3a\xa7\x49\x9c\x60\x32\x81\x3f\x40\xe3\x06\xd8\xd2\x74\xbc\x90\x28\x32\xc7\x7f\x29\x10\x0f\xd3\x88\x5c\x9b\x89\xc6\xbb\x5d\x92\xe0\x0c\x2e\x4c\x6c\xeb\xb1\xc9\x0a\x17\x32\x38\x7b\x2f\xd1\x9f\x1a\x61\x72\xb7\xed\xa7\x78\xf7\x33\xf5\xb4\x2b\x79\xf5\xdc\xd7\xe1\xaa\x30\xed\xc6\x33\x28\x3e\xfb\x5d\xa0\x4e\xc1\xa6\xa8\xb0\x82\xae\xe9\xa6\x5c\x9d\xa6\x7a\x3e\x39\x89\xcc\x27\x7e\xed\xcc\xfd\xf2\xa9\x12\x4b\xb3\x12\x61\xef\x44\x36\x22\x66\x07\x5b\x17\x7c\x3d\x02\x29\xc2\xba\xde\x3b\x55\xf6\x8f\xbd\x6c\xe5\x1b\x93\x56\x95\x9c\xba\xbf\xfb\x15\x93\x45\xc9\xed\xb6\xec\xaa\x6c\xdf\x9c\x0b\x59\xb4\x6a\x47\x1a\x60\xdc\xc3\x4b\xe7\x71\x61\x01\x09\x91\xa4\x1a\xa7\xa9\x1c\xc9\x25\x64\x7e\x54\x2d\x97\x5c\xed\x76\x6f\x24\x78\x8c\xc8\xa9\x40\xad\x36\x90\x04\x02\x16\x27\x44\x63\xc2\xd3\xf4\xe0\xed\xd3\xe7\x0f\x7f\x78\xf8\xe4\xee\xa3\x81\xcb\xc6\xb1\xe1\x1b\xfb\x0b\x19\x98\x53\xe8\xf4\xf7\x97\x09\x51\x78\xdf\x69\x5a\x18\xcb\x99\x19\xcd\xfb\xfc\x6c\xeb\x3d\x45\x76\xbb\xc3\xae\xc0\xf0\x3b\x8b\xae\xde\x01\xf0\x4c\x76\x9a\x42\xd6\xa9\x37\x00\xfe\xd5\x9c\xa5\x53\xcc\xa9\x7d\xf0\xeb\xc6\x47\x28\xb3\x23\xfb\xc1\x6f\xbe\xbe\xf0\x3d\x46\xac\xe1\xb5\xbe\x2b\xc5\x1a\xc4\x27\x00\xde\x4e\xd3\xde\xe4\xdd\xae\xe6\xfa\xa5\x58\xf3\x6a\xab\x31\x00\x87\xa3\xef\xdb\x7b\xe6\x71\x7b\x1d\x55\x1f\x24\x57\x41\x3d\xee\x74\x11\xed\xa8\x29\x8f\x3e\xf3\x45\x64\xfa\xf1\xb9\x72\xcf\xaa\xe2\x22\xb2\xc1\xb8\x12\xc4\xc8\xbb\x3d\x77\x43\x9c\x9f\x76\x1c\x47\x83\x6f\x20\x8c\xf2\x34\x06\x62\x08\x86\xfb\x44\xe1\x00\x8a\x1a\x30\x20\x64\xc0\xdd\xd8\xed\x5a\x67\xa7\x3c\x9e\xe0\xdb\xf4\xc6\x49\xac\x6f\x8f\xdc\x72\x87\xca\x46\x4e\x68\x7f\x33\x54\xf6\x9b\x80\x4a\xa3\xa8\x1c\x4e\xfc\xa4\x3e\x94\x34\x91\xcb\xe3\x20\xd9\x45\x81\x92\xba\x7e\xb0\x01\x34\xa4\x81\x51\x0d\xd1\xf8\x1c\x4e\xab\x4a\xd3\x06\xc4\xc4\xf9\xda\xd8\x60\x7d\x00\x3d\x76\x2a\x91\x6c\xf3\xa0\x84\x93\x31\x0e\x17\xba\xfb\xb6\x23\xf1\x65\xa7\xc2\x43\x64\x11\xe4\x2b\xc7\x20\x1f\x76\x0a\x6f\x5f\x16\x37\x17\x8d\xe1\xa9\x71\x0b\x95\xed\x28\x49\x0e\xd8\x31\x4d\x1d\xf3\x7e\x44\xe9\xc3\x08\xce\xe7\xad\xec\x58\x55\x9a\xd3\x0d\xdd\x3c\xf2\xdf\xed\x76\x6a\xe6\xbe\xcc\x1e\xb6\xe0\x55\x3b\x63\x7a\x73\xda\xac\x09\x66\x23\xc5\xce\x73\xd2\xc6\xf7\x6b\x7b\x75\xea\xd8\xab\xd3\xa2\xb5\xe8\x39\xcf\x83\x90\x15\x85\xdb\xb1\x19\xf7\x48\x62\x07\xf0\x7d\x34\x99\xb6\x4d\x2a\x79\x6c\x52\x79\xe9\x31\xaf\xf8\xbc\x6e\x61\xe2\x86\x3d\x5e\x59\xdb\xfd\x12\x83\xe5\xa3\xc5\x5a\x14\xf4\x64\x37\x49\x05\x49\x12\x8b\x8d\x74\x04\x63\x53\x11\x05\xe7\x0b\x85\x34\x1b\x47\xc4\x5b\xec\x89\x73\xf4\x44\xa2\x00\x06\x78\x34\x99\x96\xf4\x68\xbc\x8f\x4d\xb8\x17\xf4\xdb\x54\xcc\xaa\x8c\xcf\x87\x43\xdb\x96\x6f\x53\x11\xfc\xa6\xdc\x50\xd9\xc6\x98\x55\x6a\x7f\x93\x05\x51\xf8\xca\xe2\x83\x50\x66\x6b\x28\xe8\x73\x69\x0a\x9d\xb9\xe5\x9a\x55\x44\x12\x58\x05\xf1\x8e\x2c\xae\x2a\xae\x91\xf1\xcc\x38\x99\xae\x2f\x9c\xcb\xe6\x54\xd3\xe2\x0e\x9b\x25\x49\x26\xe7\xc5\x70\x92\x77\x44\x2e\x7f\x46\x99\xaa\x2d\x5f\x33\xb5\x52\x8e\xdf\x1f\x9c\x2c\xc8\x18\xef\x76\x27\xa6\xc3\x0b\x8b\xfa\x78\xd5\x88\xb9\x31\x83\x39\x49\xd3\x23\xc8\x63\xff\x56\x51\x5e\x6b\x27\x68\x13\x7d\xb3\x4d\x01\x13\x22\x68\x65\xe6\x2e\xd8\x71\x42\x01\xbb\x5d\x64\xb6\xf0\x24\xde\x17\x63\x1b\x37\x31\x0e\x2f\x2e\x5b\xb8\x9b\xfe\xde\xbb\xc1\x37\xf5\xd8\xb4\x66\xa1\xec\x76\x47\xca\xf3\xec\x6e\x25\x4e\x65\xb3\x04\x1b\x8b\x4b\xee\xe0\xc6\x01\x3f\xb9\x45\x13\x6f\x58\xfa\x76\xcb\x1a\xa1\x9b\x79\xf0\x03\x30\xb1\x6f\x4e\xe0\x8d\x73\x9e\xe5\x16\x23\x1c\x2a\x3a\x44\xc8\x9c\xe2\x90\x23\x9e\xcc\x9b\x50\x42\x0b\xfd\x48\xe0\x4b\x39\xb4\x5b\xd5\x66\xdb\xcb\x21\x55\xb3\x49\x76\xd2\xc0\xaf\xf6\x20\x08\x04\xe4\xfe\x40\xed\x6f\x3a\x40\x82\xe3\x09\x5c\x49\xa9\xe1\x30\xf6\x20\x8f\xdd\x46\x54\x3f\x28\x75\x1b\x39\x56\xb4\x30\x94\xa6\x6a\x38\x6c\xda\x03\x66\xc0\xcd\x44\xdd\x77\x13\x45\x8f\x26\x0d\x41\xe9\x01\x0a\x17\xe7\xc8\x92\x28\x43\xb2\x15\xee\x21\x9e\x8d\x75\x90\x47\xe9\xcb\xae\x74\x85\x19\xc6\x73\x6a\xbb\xe4\x7b\x1b\x3b\xc0\xff\x03\x85\x33\xe4\xed\x88\x82\xe3\x7a\x58\xbf\x03\x1f\xbb\xcc\x6c\x83\xc3\xb6\xfd\xdd\x89\xcd\x38\x4b\x32\x59\x69\x94\x0c\xb9\xbb\x94\x04\xf7\xe5\xd8\xb6\xa7\xe5\x7a\x35\xce\x89\xa2\x66\x7b\x9c\x10\x49\x93\x84\xb0\xb0\x5e\x55\xf7\xf0\x2b\x9b\xc9\xea\xae\x30\x20\x93\x27\xa9\x88\xdd\x63\x87\x43\x95\x4f\xe5\x90\x26\xf3\x64\x58\x0e\x91\x1f\xab\x3b\xe3\xd9\x97\x34\xf9\x72\xc8\x87\x5f\x26\x5f\x66\x49\x82\x87\x49\x9e\xd8\xc3\xd0\x10\x0a\xf3\xc1\x28\x19\x96\xd9\x4d\x43\x14\x90\xf9\x39\x48\x86\xa5\xb5\x25\x05\xea\x23\xed\xb6\x2f\xe1\x1a\x73\x48\xff\x96\x88\x11\x89\xa1\xf5\x86\xbb\x2d\x09\xa3\x6c\xb7\xb3\x14\x22\x5a\x28\xfe\xdb\xe8\x1b\x4c\x3c\x89\xfc\x24\x5b\x40\x9e\xdf\xc3\x10\xbd\x92\xe8\x9d\x87\xef\x24\x77\x39\xc2\x43\x4d\x38\x6f\x41\x79\xbe\x6a\x13\x85\x23\x81\xed\xce\x45\x37\xda\x8e\x72\xc2\xc6\xf3\xec\x20\xf1\x45\xbe\x28\x3f\x72\x0b\xa7\xdb\x82\xff\x8f\xbf\xea\x7e\xf0\xc1\x7e\x00\x28\x2c\x2f\x78\xcb\x3d\xe3\x5a\x67\x45\xdc\xbe\x3d\xf9\x66\xc7\x6f\xdf\x3e\x89\x4c\xa4\xba\x60\xe5\xdf\xa4\x00\x72\x1e\x19\x49\xc5\x39\x4e\x62\x13\xd0\x3f\xe2\xbb\xf1\xc9\x8d\xc9\xf8\xd6\xb7\xa9\xc6\x77\xee\x44\xc5\xff\x24\xdb\xd8\xd9\x26\xd3\x77\xa9\xee\x34\xe2\x97\xb8\x8a\x49\x5c\xc5\xcf\x87\x7e\x5f\xad\xe8\xf1\xbd\xee\x5e\x9f\x71\x82\xb3\x80\x6f\x21\x20\x46\x40\x45\x67\x71\x15\xe0\xc4\xc3\xf2\xe9\xca\x62\x90\x77\xaa\x44\x27\x84\xcf\x59\x0e\xce\xc0\x91\x8f\xb6\x6c\x1b\xb5\x43\x6c\x87\x85\x2f\xb5\xa0\xbc\x81\x45\x0f\x91\x0c\xbc\xe3\x12\xb8\x74\x92\x62\x7e\x92\xd3\xc9\xcd\xf1\x4e\x90\x1f\x34\x2a\x30\x29\xe6\x37\x72\x5a\xcc\x27\x5f\xe7\x54\x93\x62\xfe\x6d\x4e\x15\x29\xe6\x93\x71\x4e\xcb\xdd\xce\x4a\xa1\xe3\xdc\xa4\x4c\x72\x5a\xfb\x94\x09\xa4\x9c\xe4\xb4\xf2\x29\x27\xb9\x0f\x45\x3f\xff\x2e\xa7\x0b\x97\xfc\x5d\x93\x7a\x2b\xa7\xcc\x7c\x74\x2b\xa7\x27\x51\xe8\xb3\xc9\xad\x3c\x2b\x48\x14\xec\x51\xb3\xc3\x38\x07\x21\x94\x67\xe4\x29\xc5\x30\xa3\x3c\xce\x4b\xba\x91\xec\x00\x62\xcb\x99\xea\xdf\xba\xd9\x18\xdb\xdf\xba\x99\x32\x0b\x5f\x7b\x69\xff\x52\x45\x98\xe5\x28\xa9\x20\xcc\x72\x3c\xd4\xfb\xe5\x6a\xfa\x8b\x11\xcb\x59\x07\x69\x3d\xc4\x03\xeb\xc1\x50\x77\x23\xfe\xb3\x46\x60\x7b\x1e\x03\xc2\xb7\x5a\x1c\x3c\xc9\x7f\x32\x3b\xbe\xa4\xbf\x9b\x3f\x75\xd3\xdb\x03\x3c\x0d\x6b\x53\x6f\x8b\xb7\xe1\xb3\x15\x81\x03\x30\x13\x24\x76\xbf\xb2\xc1\xb9\x5c\x2c\xae\xa8\x65\x19\x9f\xf1\x76\x5b\xb3\xe3\x09\x69\xbb\x91\xb5\x52\x4e\x65\xd1\xc9\x71\x51\x0a\xb9\x7c\xc4\x6a\xc8\xe7\xad\x85\xbf\x77\x91\x3b\x6d\x95\x30\xe4\xd9\x98\x74\xa0\x7c\xb3\xb1\xbd\xbc\xcd\x24\x81\x11\xce\x18\x59\x73\xb5\xe4\x05\x18\x0f\xd9\x4f\xcb\x6a\xc1\x4a\x08\x8a\xe5\x5b\x2f\xb4\x60\xa5\x0d\xd1\xeb\x31\x67\x84\xfd\x05\x19\xaa\xad\x6e\x7e\x80\xd8\xea\x9e\x25\xff\xa8\x5d\x04\xf1\xb6\xa7\x83\x0d\x83\xd6\x04\x2b\x73\x01\xcc\x78\x94\xcf\xc5\x5d\x03\xf0\xc7\xf8\xf9\x37\xa1\x57\xd5\x56\xff\x58\xd5\xae\x18\xc5\x6b\x51\x6c\x59\xf9\xc2\x66\x75\xed\x73\xa8\x92\xae\x26\xfb\xe3\xca\x4f\xef\xb9\xcc\xf1\xb7\x61\x38\xc7\xb6\xe2\xe6\xf7\x7e\x8f\xc6\xa4\x9c\xb1\x8c\xa5\x29\x0b\x4e\x88\xe0\xeb\x21\xbb\x68\x3e\xb1\x96\x11\x34\xfd\xcd\x4f\x1a\x20\x0e\x28\x4b\x53\x54\x3a\x8c\x05\x66\xbd\x55\x82\x30\x50\x07\xdc\x7f\xe4\x5e\xd1\x3a\x78\xdb\x33\xb8\x27\x83\x57\xe6\x81\xd6\x18\x93\x3a\x32\x1e\x62\xad\x93\x6a\x1c\x21\x21\x1f\x4f\x82\x64\xc6\x63\x31\x3e\xf2\xa1\x9d\xb2\xe1\x10\x07\xd4\x31\xa2\x23\xb2\xd6\xa4\x99\x5d\x72\x08\x8f\x18\x43\xc3\x0a\xe6\x45\xc2\x25\x87\x4b\xaf\x60\x8e\x6a\x8e\xba\xf7\x1e\x89\x2d\x3a\xe6\x9e\x32\x34\x81\x73\x31\x12\x1e\xbd\xfc\x1e\x39\xe0\x97\xb6\x60\x49\x26\x44\xe1\xe0\x14\xd3\x0e\x6a\xd1\x49\xa3\x47\x36\xaa\x88\x66\x5a\x2c\xee\xb5\x68\x7d\x9a\xba\x03\x28\xbc\xf7\x20\x71\xf0\xf2\x29\x43\x27\x24\x6a\x6e\xd3\x3a\x46\xed\xfd\x8d\x85\xaa\x9b\x36\x53\xda\xe6\x95\x3f\xc3\x44\x7e\x84\x8e\xcc\x55\x8e\x0d\x5b\xcb\xbc\x19\xac\xf0\x08\xd1\xfd\x5d\x13\xd2\x9b\x50\x40\x10\x74\xdb\xbd\xf1\xe1\x38\x40\x9f\x45\xd0\x97\x3b\x67\xf4\xaf\xc9\x3d\x80\xf2\x6d\xb0\x1e\xd8\xa1\xa7\xa3\xc9\x0b\xfe\xaf\x5f\xdf\xa2\x14\x3c\xda\xa5\x67\x99\xa7\x76\x32\xfd\x10\x70\x08\xe2\xa7\x2e\x2e\x7f\x00\xc0\xc5\x58\xbc\xef\x0f\xaf\x4a\xf5\x1e\xe9\xbe\x80\xae\x8d\x17\x71\xe9\x5b\x74\x12\x03\x1e\x58\x46\xcb\x62\xdf\x1e\x31\xc3\x7a\x95\x9d\x00\xea\x57\x30\x5c\xca\x31\x5c\x16\x55\xbd\xc5\x73\xa9\xab\x78\x2e\xe5\x78\x2e\x45\xc6\x0e\xc9\xe0\x31\xc0\xe0\x81\xa7\x75\xbf\x0e\x03\x00\x60\xfc\xf7\x7c\xca\xe9\xcf\x0a\x71\x2b\xb6\x1f\x01\x7b\x18\x44\xd4\xc6\xb3\xef\xbb\x7c\xfa\x19\x11\x21\xf6\x99\x04\x58\x8c\xf9\x8d\x7c\x0a\xb2\xea\xf8\xe4\x66\xaa\x4c\x99\x69\xfa\x49\x03\xde\x05\x51\x00\x30\x60\xde\xec\x01\x9e\x80\xfc\x8f\x5a\xd9\xb8\x8c\x4f\xc6\x53\xdd\xac\x52\x1d\x37\x83\xcf\x75\xee\x82\xb4\x4c\x1f\x58\x10\x08\xc9\x90\x30\x4b\x27\x6c\x53\xa2\xe6\xdf\xe6\xd8\xb6\x20\x68\x35\x16\x57\x6c\xb8\x9e\x69\x3c\x88\xaf\x77\x30\x8b\x07\x13\x18\xc7\xf1\x3b\x9c\xbf\x89\x9b\xba\x09\xde\x1f\x5d\x85\x33\xb0\xaa\x6a\xed\xc8\xfc\xd3\xcd\xbd\xaa\xe8\xf0\x9c\x66\x79\x37\x03\x64\xc6\x47\xf5\x8c\x8f\x00\x10\x5d\x10\x5f\x6f\x8f\xf1\x0b\x8e\xfe\xeb\xf0\x03\x1b\x20\x11\xe0\x49\x87\x43\x9d\x93\xd2\x3d\x4c\x2b\x6e\x05\x9a\x12\x58\x4e\x99\x03\xc3\xe9\x76\xec\x0b\x8e\x8e\x27\xd8\x39\xe8\x07\x9c\x9e\x3e\xa2\x53\xff\x0f\x88\xce\xe3\x16\xd1\xa9\x71\x40\x84\x8f\x69\x72\xd3\xfd\xca\x91\xc0\x8a\x88\xde\x09\x6b\x07\x1f\xfc\xe7\xd9\x0a\xb1\x0d\x0f\xa7\xea\xc4\x4d\xd5\x09\xde\x1f\x8d\x9b\x33\xf4\xd5\xa6\x38\xa0\xec\x4d\x1a\x50\x39\xb6\xdb\x79\x50\x98\x6f\x6e\x60\xf2\x19\xac\x18\x3e\xbf\x91\x03\x5c\x4c\x18\xe5\x0e\x39\x64\xbd\xe4\xd0\x70\xe1\x8c\x1e\x19\x6a\x47\x4a\x7a\x5f\xfb\xf3\x8c\xa5\xe9\x51\x99\xa6\x72\x74\xc6\x97\x42\x86\x07\x04\x81\x1d\xdd\x01\x28\x30\x89\x68\x6c\xa8\x37\x7c\xca\x65\xe1\xfe\xb4\x1a\x52\xf6\x32\xab\x77\x6d\x0b\x4e\x52\x01\xf5\xdb\x25\x62\x2a\x0b\x12\xf7\xc9\x38\x4d\x9d\xa4\x7a\x32\xb6\x22\x2c\x51\xc8\x02\x02\x34\x0b\x8b\xc5\x55\xd5\xe1\xa4\x16\xe7\x68\x09\x58\x2b\x8d\x7e\xa3\x3f\x94\x83\x3c\x08\x1e\x3a\x95\xb7\x05\x84\x69\xea\x42\x25\xc8\x7c\xca\x0f\x48\x40\x37\x05\x4d\x88\x9a\xcb\x1c\x10\x97\x22\x60\x95\xd0\xb0\xa3\x57\x1a\xe1\xdd\x0e\x1d\x7a\x2a\x07\xa1\xaf\x1b\x94\x82\xc5\x49\xa6\xed\x07\x27\xe4\x6e\xf7\x03\x07\x70\x0a\x72\xcd\x62\xae\x36\x11\xfe\x46\x2d\xe6\x37\xd2\x2e\xcb\x10\x28\x32\x62\x66\xa0\x9f\xb5\x59\x22\x17\x70\xe5\xce\xd2\xf4\x05\x73\xfe\xd2\xcd\xfe\x02\x17\x76\x52\x1b\x0e\xe2\x9a\x42\x15\x69\x48\x64\x99\xa6\x6f\x18\x1a\x93\xfa\x58\x9a\x8d\x46\xc6\xa4\xb4\xc1\x01\x9e\x6b\xe4\x7c\x0a\x08\xc7\x46\x3c\xac\x1c\x3d\x20\x8a\xbc\xd5\xd0\x76\x4c\x26\x27\xdf\x9a\x43\xe1\xe4\xdb\xe0\x08\x7d\x45\x7c\x05\x43\xa3\xba\xa3\x24\x3b\xa3\xe4\x6e\xf1\x4d\x8d\xe5\x3f\x86\xfd\x76\x4b\x90\xc5\x28\xb8\x62\xaa\x6e\xcb\xb6\x8e\x2c\x04\x8d\xb5\x78\x31\xf9\x74\xc1\x91\xc2\x24\x38\xb0\xc7\x04\xb8\xde\xed\xc6\x21\xed\x57\xa6\x6a\x2b\xc3\x86\x24\x90\x57\x70\x9a\xbe\x67\x76\x4d\x77\xa8\x25\x59\x70\x54\x86\x31\x8a\xb5\x37\x0b\xb7\x96\xe8\x5b\x1d\xaf\xee\x46\xe8\x69\xb9\xd4\x5f\xfa\x45\x0e\x43\x31\x9c\x74\x78\xe4\x00\xa9\xc2\x22\xc5\x43\x49\x85\x05\x93\x09\x41\x73\x2c\x68\x41\xa6\xe7\x65\x3e\xd5\x10\x22\x92\xd6\x2d\x98\x75\xd6\x36\x67\x02\x19\xaa\xeb\x6c\xb5\xdb\xf1\x3e\x9e\x6f\xe6\x83\x25\x6f\x0d\xd7\x6c\x45\xb0\xe6\x18\xb6\xd1\xba\x6a\xc3\xb9\x32\x65\xfe\x84\x39\xbe\xcf\xcf\xcd\xef\x8d\xd8\xf8\xc7\x86\xb7\xd5\xa3\x7a\xb1\xe2\x6b\x56\xdb\x48\xcb\xb5\xae\x5b\xf1\xb4\xb7\xec\xf3\x0a\x90\x93\xf1\x50\x90\x2d\x2d\x86\x92\xac\x68\xff\x61\x7b\x80\xf5\xcb\x63\xac\x5f\x71\xdb\x85\xf8\xfe\x24\x23\xd4\x5f\x54\x90\x2d\x26\x9b\x3e\x84\x9e\xc5\x6c\x81\x70\xb6\xf0\x79\x57\xf3\x49\x4e\xad\x6c\xae\x49\x90\x5a\xb2\x55\xb0\xef\xcc\x14\x79\x67\x09\x8e\x15\x04\x43\xd7\xb3\x9a\x34\xe1\xcd\x38\x01\x47\x97\x95\xd7\xe2\x8c\xce\x45\x59\x22\xab\x4a\xc1\xe4\x80\x77\xcd\x0a\x62\xad\x83\xab\x28\x6d\x4b\x0e\xb9\x0a\x27\xa1\xb7\x89\x50\x76\x34\x26\x9d\x33\xcd\x24\x1d\x88\x22\xd9\xd1\x84\xf4\xc9\x2f\x26\xbd\xc5\xc3\x7a\xc1\xbb\xcb\x0f\x3b\x91\x38\xe2\x96\x5a\x29\xdd\x8c\xe1\xa0\x6e\x7e\x76\xb3\xc4\xf8\x54\x5e\xe0\x06\xc4\xa6\x56\xc1\xbf\xc4\x03\xde\xf0\x2e\xae\x08\xbf\x2c\x9f\xf3\xa5\xa8\xb5\xba\xc8\xfa\xa2\x6d\xcd\x18\xc2\x19\x23\x66\xcd\x7e\x2e\x5f\x39\x2b\x11\xce\xfc\x08\x37\x5a\x06\xb7\xa8\xb3\x8a\xd8\x45\x9d\x6d\x48\xcf\x86\xca\x8e\x26\xd1\xd6\x5c\xf5\xf0\x01\xcf\x98\x39\xf7\x03\xe0\x9d\xf4\xe2\x70\x86\xa4\x07\xcd\xee\x13\x47\x9f\x98\x5d\xee\xa1\xa3\x65\xf0\x31\x8b\x89\xd3\x26\x1c\x74\x61\x77\x0c\x84\x1c\x68\xb8\x26\xe8\x1a\x2d\x8a\x56\x38\x37\x91\x4f\x91\xa2\xa1\x51\x97\xfb\x4c\xe1\xc3\x2f\x66\x6a\x2e\x72\x67\xcc\x48\x24\x86\xc8\xc0\x74\xce\x49\x13\x41\x31\x32\x62\x39\x3f\xd8\xe7\xcd\x1d\xea\x5b\x0b\xfb\x07\x17\x60\x0b\x52\x00\x85\x84\x23\xf2\xa8\xf6\xaa\x8b\x22\x4d\xd1\x82\x16\x73\x91\xe3\x19\x7a\xc0\x20\x5a\xc3\xc2\x6a\x09\xd7\x16\x58\xad\x9f\x36\x3c\x77\xf0\x33\x93\x5b\x20\xdc\xec\x76\xc8\x0a\x35\xb7\x6e\x42\xd8\x1a\x47\x8b\x31\xce\x6e\xa4\xdc\xdd\x62\x23\xd1\x03\x12\xda\x5c\xd4\x6b\x77\x0b\x6a\xe8\x7b\x92\x25\xe7\x95\x72\xa9\x2b\xbd\x2e\x1f\x54\xca\xa6\xad\x99\x5f\x47\xe6\x95\x49\xb8\x6b\x13\xb2\xc4\x9a\xb3\xe9\x75\xe9\x5e\x06\xf3\xb6\x24\x4b\xbc\x2d\xbc\x7b\x65\x7e\x3e\x35\x3f\xb3\xc4\x7b\x56\xb8\x37\x9a\x9d\x01\x4d\x48\x32\xbd\x47\x86\x1b\x74\x01\xab\xcd\x72\x95\x84\x5b\xe5\xe7\x6e\x97\x24\x44\xe0\x4c\x92\x53\x8d\x18\x9e\xb1\x56\xdc\xdf\xca\xc2\x2c\xbd\xe4\x70\x8f\x89\xaa\xf8\xe5\xac\xf5\x0b\x4e\xc5\xac\x82\x28\x15\xf1\x0a\x5b\xb2\x2e\xf0\xb9\xbd\x41\x35\x7c\x55\x5f\xf8\xbd\x36\xdb\x10\x9d\x1f\x7e\x03\x4e\x9b\x50\x73\x16\x30\xf1\xca\x13\x72\xd8\x3a\x20\xf3\xe9\x7d\x89\x14\x29\x47\x1e\xa1\xbf\x26\x47\x13\x9c\xa6\x48\xee\x76\x48\xd2\x79\x8e\xc9\x35\x8e\x3c\x63\xa6\x49\xe9\x82\x9d\x5d\x68\x54\xe2\x19\xba\x80\xf5\x84\x49\x03\x84\x5c\x62\x9c\xb9\xfd\x57\x36\x50\xcd\x21\x18\x23\x29\xfd\xe6\x10\xf6\x6c\xb9\x4c\x92\xec\x78\xb2\x8f\x8e\x7b\x86\x2f\x25\x3d\x1a\x93\x7b\x0c\x29\xaf\xda\x72\x51\x50\xfd\x43\xc3\xe1\x58\x09\x90\xf5\x48\x80\x9c\x32\x23\x01\x86\xc8\x09\xaa\x7e\x0e\x21\x94\x38\x18\xd6\x1f\x24\x22\x6e\x0d\x40\x05\x35\x94\xdd\xfc\x53\x51\xa7\xb8\x0b\xd5\x5b\xdd\x5a\x3b\x18\x6a\xa8\x3a\x62\xb6\x17\x14\xf8\x6c\x35\x8a\x94\xba\xf4\x29\x47\xad\x04\xb2\x88\x38\x28\x72\x97\xb9\x10\xe4\xe6\x08\x27\x67\x0c\x55\x64\x61\xd8\x4e\x37\x26\x8b\x03\x96\x1d\x05\xe8\x9d\x6f\x1b\xde\x6d\xd1\xe1\xdd\x5a\xc9\x77\xad\xe1\xc7\x38\x24\x18\x7e\x0e\xc7\x25\x4d\x4e\xbe\xf5\x0c\x72\x41\x17\xdd\xb8\x5e\x47\x22\x4d\x51\x31\x8a\xa2\x82\xed\x76\xf6\xe7\x43\x29\xb4\x7d\x76\x71\xc1\xb0\x8d\xa3\xdf\x8d\xa4\xa5\xaf\x8c\xa4\xe5\x98\x5c\x4c\x04\x3d\x1a\x63\x62\xa8\x57\x5f\x55\xfd\xc5\x77\x02\xf0\x7f\x36\xec\x56\xa8\xa8\x86\x8a\xaa\xe1\xf0\x2a\x45\x44\x5b\xd4\x22\x9e\x6f\x06\xeb\x7d\x6b\x08\xc2\x0c\xff\x64\x6f\x67\xed\xc1\x66\xb7\x5f\x83\xd2\x73\x20\x94\x55\xb7\x15\xa0\xf5\x44\x10\x82\x55\x4e\xec\xdd\xbd\x21\xdb\x64\xe1\x77\x87\xdc\xed\x9e\x4a\xc4\xb1\xdd\x24\x3f\x32\x08\xe9\x32\x75\x3a\xde\x85\xd9\x46\x1b\x93\x56\x99\x35\x52\x9b\x67\x30\x04\x87\x32\x2a\x52\xe3\x7d\x23\xca\xa0\x83\x20\x2d\x1e\x84\xc7\xc8\xe3\x61\xea\x6f\x61\x72\x98\xd1\xc2\xff\xb4\x32\xde\x38\xc1\x18\x88\x7f\x24\x90\x51\x46\xfc\xc1\x43\x4b\xc2\x7d\x4b\x68\xbd\x07\xea\xb0\x2f\x0f\x25\x20\x71\x8e\x78\x4c\xd0\x1a\xc6\x3f\x66\x4a\xed\xee\x8e\xf4\x5f\xed\x7b\x45\x3e\xd7\x00\xbe\x18\x6e\xc2\x62\x33\xea\x7b\x28\xb9\x31\x9e\x24\xe4\xaf\xd3\x8f\x9b\x4a\xe9\x41\x75\x3e\x90\x6c\xcd\x07\x5f\x5e\xbb\xb4\xdf\xed\xbf\x1c\xc8\x4a\x0f\xce\xab\xad\x2c\x8e\xfe\xc2\x53\xe1\x0e\xe4\xb9\x76\x82\x2f\xa0\x3c\x95\x0d\x4e\xc7\xe7\xb7\xb3\x72\xe6\x42\x24\x52\xba\xaf\x59\x3f\x04\x14\x6b\xed\xd3\xa9\xd5\xe2\x78\x33\x8e\x1e\xfd\x97\xe7\x27\x2c\xae\x6a\x4f\x0e\xb3\xc2\x83\x16\xf8\xbf\xee\x6c\x9e\xa2\x1e\xc0\xd7\x96\xb1\x20\xbf\x33\x6e\xc5\x41\x3f\x3e\xe6\x57\xc4\x41\x4f\x53\x75\x3b\xc4\xb7\x50\x7e\x48\xc6\x7b\x8c\x14\x06\x74\x68\x27\x33\x30\x4c\x54\x60\xae\xcc\xe0\x35\x83\xf1\x9e\xd9\x0d\x16\x14\x91\xf1\x18\xa4\x69\xfb\x37\x9a\xb4\xa0\x89\x2f\xdc\xb7\x61\x19\x9e\x10\x14\xab\xde\x60\xe3\x37\x3f\xa3\x0d\xef\xf9\x94\x28\xd0\x4a\xac\x5f\x71\x4b\x71\xc4\x61\x91\xdc\xad\x71\xd7\x6a\xc5\xbf\x88\xcd\x57\xd4\xbc\x49\x9f\x8b\x3c\xa7\x7a\x7a\x61\x59\x29\xa4\xe6\x49\x92\x53\x1d\xf7\xfb\x5e\xa8\x4f\x87\xdd\x46\xba\x41\x3b\x21\x58\x41\x4c\x70\x28\x1f\x2a\x72\x10\x03\x34\x06\x8a\xb9\xdb\x52\x49\x79\x24\xcc\x3c\xdc\xd6\x32\x2a\x7d\x60\x20\x73\x96\xfb\x67\x7a\x4f\x23\x39\x72\xf1\x94\x4a\xc0\x60\xf9\x93\x23\x66\x4e\x74\x89\xdd\x11\x17\x5d\x32\x99\x12\x4b\xa2\xec\x1f\xb7\x9e\xc7\x44\x10\x65\x0f\x2c\x19\x4e\x12\xf2\xc9\x7c\x1e\xdb\x73\xb3\x2e\xdf\xe2\x10\x0d\x89\xa4\x05\x33\xdc\x39\xa3\xf6\x46\xbd\xa4\x7f\x9a\xbc\x70\xa3\x2f\xad\xf0\xac\x46\x95\x7c\xb6\xad\x57\xb3\x5b\x37\xb3\xc9\x2d\x40\xb4\x63\x84\x39\xc8\x8a\xe7\x5c\x16\x5c\x71\x05\x18\x9d\x11\xc0\x31\x9e\x36\x50\x84\x34\x32\x2f\xfb\x95\x75\xf1\xef\x02\xc5\x60\xb8\x8d\xad\x17\x43\x92\x49\x0b\x46\xd6\x7d\x21\x5b\x8a\xe4\xda\x51\xec\x72\x76\x17\x31\x9c\x95\x88\x11\x01\xdc\xa3\xc4\xd3\x2b\x50\xd5\x24\x68\x9d\x32\x35\xe3\xad\x37\x80\xc7\x2d\x49\x0d\x58\x6b\xf1\x17\x26\x2d\x5a\x4f\x6f\xae\x22\x2a\x91\x51\x80\x21\xfd\xd1\x29\x63\xca\x03\x52\xdd\xb9\xe0\x28\xbb\x46\x61\x92\x96\x73\x3e\x1c\xe6\x84\xf9\x87\xda\x3d\x04\x20\xfc\x59\x53\x1a\x02\x4c\x79\xc2\x8c\x00\xc3\x3a\xca\x94\x1f\x59\xd7\x79\x86\x44\xb6\xbd\x07\xe6\x78\x92\x72\x17\x17\xd0\xf0\x27\x80\xd3\xf9\xf5\x91\xb7\xed\xed\x09\x04\x68\x2d\xe7\x0e\x84\x31\x09\xac\x6b\x4c\x2d\x0d\x07\xeb\x28\x92\x84\x08\x40\x84\x83\x21\x0a\xc6\x44\x78\x44\xdf\x41\x14\x76\x70\x48\x6f\xf6\xc8\x60\x1f\x22\x7e\x3d\x42\x37\x72\x31\x9d\xc8\xd1\x98\x1c\x4d\x88\x8d\xc9\x6f\x77\x47\xb4\x2a\x23\x1c\x46\xd6\x2f\x62\x89\x73\x04\x37\x38\x31\x0e\xf2\x24\x9f\x7e\x3b\x06\xc9\x6b\x26\xed\x56\xd3\x9d\x6b\x9d\x4c\xcd\xbf\xce\xef\x8c\xd3\xf4\x11\x03\x8c\xce\xc6\x46\x9d\xc5\xb7\x4c\xaa\x7d\xcb\xa4\xa6\x8a\xfe\xac\x62\xd8\x53\x77\xcb\xd4\x77\x8b\xc2\xc3\x2d\x4a\x50\xe2\x77\x22\x46\x3b\x5d\x7a\xd4\x36\x0e\x57\x4e\x36\x6a\x4b\xd3\x40\xee\xa3\x0d\x71\x8b\x9d\x19\xdd\x9a\xc4\x88\xa8\xff\xc6\xc6\xcf\x8c\xda\x5c\x01\x40\xf9\x03\x1b\x42\x41\x34\xf5\x88\x78\x20\x3e\xf6\x8f\xb7\xbf\x35\x43\x57\xdd\xd2\x34\xf5\xde\x8e\xaf\xdb\xa3\xc6\xb8\xfb\xf8\x98\x4e\xaa\x1c\xef\xb1\xa5\x48\xc2\xde\xc3\xd9\xcb\xb7\xc6\xd2\x9f\x75\x62\xd4\x4c\x6e\xe4\x33\x3d\x9f\xdc\x04\xa0\x7a\x9e\x41\x82\x39\x07\x4c\x12\xe5\x71\x04\xa4\xd3\x30\xa3\x53\x3d\xc5\x97\xda\x09\xe2\xc1\xcc\x17\xc2\x63\x98\x81\x3c\xb3\x11\x97\x1b\x34\x77\x3d\xd5\x94\xf7\x03\xa8\x3e\x3c\xa0\xcf\x16\xbd\x5d\xf8\xeb\x13\xe1\xaf\x4f\x2c\x9e\xf8\xc1\x4c\x2b\x7f\x45\x2e\xfd\x15\xf9\x7d\x06\xfa\x0c\xc3\x02\x79\xbf\x30\x7b\xa1\x22\x0e\x2e\x54\x5e\x42\x97\x8e\x3e\x67\x81\xde\xac\x91\xfe\x7b\xd8\x28\x83\xbd\x92\x7d\x67\xd6\x35\x81\x18\x01\xf9\x94\x31\x24\x0d\x89\x6c\xb5\x77\x8f\x74\x7b\x52\x9e\x86\x41\x58\x71\x34\xc6\x84\x5b\x8e\xd5\xd6\xf1\x96\x59\x4f\x94\x67\xaa\x5a\x8b\x9a\xbb\x18\xbc\xdc\xda\x58\xb4\x1c\x49\x9e\xb1\x56\x54\x94\x6f\x72\xc3\x90\xcc\xbf\xc9\x0d\xf9\x89\xcc\x9c\x5b\xb9\x3c\xa0\xba\xe5\x5d\xec\x73\x3b\xff\x73\xd6\xb6\xff\xf7\x94\x4d\xef\x76\x10\x5a\x1b\x18\x8e\x03\x23\xfe\x69\x37\xe2\xdc\xd4\x12\xd1\x6e\xf4\x1f\xb3\x0f\xe3\x65\xa2\xe7\xe3\xbc\x1d\x15\x55\x35\xc0\xbe\x98\xa8\xf9\x64\x12\xb9\x60\xdd\x67\xfd\xc1\x22\x66\x36\x4e\xd6\x8f\xf6\x1c\x77\xc1\xab\x01\x58\x3c\x76\xa3\x8a\x79\xbb\x07\x2d\x3e\xa6\x1f\x41\x7e\x1a\xc3\xa7\x32\x7b\x2e\xb9\x87\x8a\xf2\x79\x99\x93\x85\xbf\xd7\x28\xc3\x51\xb5\x08\x07\xd5\xac\x79\x44\x15\x44\xb0\xaf\x71\x56\xcd\xeb\x9c\xca\x68\x49\xfe\x7d\xb0\x21\x9e\x3a\x02\xad\x20\x26\xc2\x24\x27\x6d\x50\xf0\x1f\x58\xdb\xcd\x42\xcd\x7c\x9c\x5c\x67\x78\x65\xe3\x70\xc4\x36\x50\xcc\x5a\xa9\x1f\x10\xbc\x92\x8e\xa7\x65\x43\xf0\xca\x58\x48\x34\xfd\x3b\x8c\xa1\xa5\x67\x8c\xea\x6c\x42\x29\x9b\x49\xba\x34\x87\x1b\xc4\x74\x61\xa0\x86\x5b\x22\x41\xf4\x30\xc9\x06\xc9\x90\xcf\x87\xc3\x32\x1f\x26\xd3\x04\xe3\x7d\xd3\x42\x2a\x32\xff\x18\x19\x64\x51\x41\xa2\x26\x53\x99\x85\xe7\x38\x93\xf4\xa6\xbb\x2c\x04\x8d\x7c\xf8\xe4\xa7\xd3\x7b\x2f\x9f\x3e\x4f\xc8\xf1\xc4\xa3\x36\x7c\xcf\x2e\x5d\xc8\x34\xfa\xa3\xe3\xb3\x29\x85\x47\x4f\xb7\x22\x27\xe8\x27\xdb\xb2\x7c\xe8\xcc\xf1\x20\x29\x1b\x3c\xa9\x06\x9e\xfd\x75\xe1\xd6\xcf\x91\xc6\x7b\x23\xab\xb9\x28\x5c\xe0\x4f\x4f\x93\x83\x6f\x13\xc2\xf7\x5d\x57\xe8\x57\x4d\x63\x5f\x70\x3d\xf0\xf9\x07\x00\xda\x32\x4a\x30\xb9\xc6\xe8\xe5\x9e\xbc\x33\xff\x82\x54\xff\x1b\x8b\xe2\x13\xb1\x00\x63\x39\x08\x40\xa5\xbf\x99\xb1\xfe\xcd\x16\xfb\x3d\xc3\xe4\xb7\xc8\xb8\xf1\x27\x58\x1a\x96\xef\xf1\xec\x4f\x8b\x75\xf8\xc5\x29\x7c\x76\x3b\x53\x36\x11\xde\x27\xf1\x17\xd6\x86\xd7\x6b\x47\x0f\x5b\x09\x6f\x88\x46\x95\x75\x82\x57\x7c\x51\xa9\xa2\x86\x46\x3c\x66\x1b\x8f\xbb\x67\x3b\x77\x9f\x9f\x03\xa8\x2b\xbc\x7d\xc1\x1d\x2a\x5f\x25\xef\xdb\xab\x82\x76\xf2\x1b\x77\x81\xc0\x0b\x7a\xd4\x98\xa5\xcd\xf3\x29\x4f\xd3\x0b\x85\x38\x51\xf4\x8e\x6d\x80\xaa\x16\xbc\xae\x7d\x54\x7b\xa4\x88\x86\x9b\xcf\x0b\x85\x8c\xec\xac\xdb\xd9\xfc\x40\x9b\x86\x20\x4d\xe6\x39\x58\x7f\xc7\x6d\x37\x7b\x13\x7d\x62\x44\x97\x3e\x7c\xbd\x79\x8b\x23\xcb\xae\x38\xb3\x59\x52\xaf\x98\x43\x6d\x80\xc9\x73\x0a\x5c\x36\x73\x96\xab\xce\x02\x12\xde\x03\x1a\x13\x15\xbb\x5d\x0f\xfd\xb3\xba\x95\x73\xf0\x42\x5d\x72\x3d\x08\xfd\x6f\xe6\xba\x33\x30\xfb\x10\x77\xc1\x4e\x85\xd9\x19\x4a\x3f\xa9\xf4\xfd\xe6\xd3\xc3\xc1\x1c\xc3\xf9\xd9\x1e\xfa\x38\x42\x28\x38\xb0\xfa\x17\x28\x32\x86\x68\xf5\x1b\x40\x95\x7c\xf1\x4d\x39\xad\xe4\xee\xbc\xfb\xb7\xfb\x7d\xb3\x11\xe3\x50\x7e\x9f\xe9\x46\x88\x10\xf1\x50\x81\x37\xa9\x39\x57\x9f\xb9\xf9\xb1\x0c\x01\x04\x35\x51\xe9\xd3\x91\x8f\x7c\x86\x83\x92\xa1\x3b\x5f\x96\x39\x69\x10\x7e\x9b\x63\x03\x1d\x5e\x1c\x21\x46\xc1\x6b\xb8\x3b\x5f\x2c\x4d\x59\xec\x1f\xb9\x52\x38\x4d\x1f\x9b\xb2\xb9\xe1\xf5\xa3\x01\x60\x67\x25\xbf\xcf\xcf\x1f\xca\x17\x66\x79\x20\x85\x67\xba\x44\x3f\x9b\xc3\x97\x5c\x63\x38\x5a\x1e\xf1\x02\x84\x80\x63\x81\x34\xf3\x16\x9a\xc8\xea\xa2\x50\x4c\x73\x9b\xc7\x9d\xc5\xca\x45\xcb\x9f\x99\xfd\x9b\x45\x3b\x13\xfb\x40\x91\x54\x45\xa1\x22\xd3\xd4\x12\x3f\xbb\xe8\x02\xc8\xa6\x95\x45\x7b\x28\x18\xa5\xb4\x04\xf2\x06\x19\x50\x09\x81\xeb\xe0\x5f\x1b\xea\xda\xeb\xdb\x61\xf9\x12\xe1\x14\x5f\xa5\xbf\x7b\x7d\xae\x50\x49\x34\x49\x9e\xdf\xe8\x10\xc6\x68\x5b\xe0\xbd\xfb\x28\x2c\xb8\x67\x48\x62\xf2\x50\x19\x2e\xfa\x3d\x53\x03\xb6\x7f\xe3\x58\x9e\x87\x9d\x85\x85\x02\x3e\x6a\x67\xc1\xc5\xcb\xda\x64\xb0\xb3\xdf\x0a\x4b\xec\x8f\xb5\x79\x13\x43\x2d\x9e\x0b\x5f\x02\x5c\x6c\x99\xcd\x01\x9c\xf6\xb9\x91\x58\x30\xf9\xab\xe9\xcf\xbc\x13\x41\x30\xff\x6b\xdf\xb7\x8e\x03\x3a\x69\xb3\x23\x0f\xb1\x16\xc2\x61\xb0\x62\xf5\x80\x95\x8a\xb3\xe2\x62\x70\xc6\xb9\x6c\x68\xc2\x28\xc1\xfb\x7e\x8a\xe6\x55\x49\x47\x48\x53\x08\xce\x1f\xf9\xcf\x01\x5b\xf0\xb1\x81\x10\x95\x4e\x5b\x00\x48\xbe\x72\xf9\xb8\x2a\xb6\x25\xf7\xd8\xd7\x84\xd1\xb0\x45\xe4\x4c\x67\x92\x94\x14\x7c\x25\x1a\x20\x4b\x16\x6d\x24\xe7\x53\x63\xca\x37\x14\xd5\x15\xdc\x72\xc8\xb3\x6b\x59\x8c\x04\xc4\x18\xac\xd3\xf4\xa8\xf4\xfe\x83\x41\x5f\x07\x7b\xf9\x42\xa1\x90\x8b\x08\x7a\xe7\xf2\x4a\x0a\x6e\x63\x0b\xa4\x69\xb3\x9b\x75\x9a\x22\x0d\x72\x76\xb0\x48\xc6\xfb\x28\xb0\x50\xdc\x60\x8d\xff\xd1\xc2\xf2\xd2\x0f\x4b\xa6\x82\xd9\x7c\x9d\x89\x3d\xd8\x5d\x4e\x4d\x43\xbb\x27\x4c\x38\x88\x20\x10\xfd\x6e\x77\x0d\xe3\xfd\xbe\x7f\x79\xb2\xa2\x30\x5d\xf6\xaa\x9b\x7b\x1a\x31\xbc\xdb\x01\x93\x0f\xf1\xd4\xdd\xb1\x12\xd3\x05\x38\x97\x6a\x43\x38\x1a\xe3\x21\xd1\xdc\x1f\x35\xc3\x5c\xd9\xe1\x0d\x62\xae\x69\x6b\xf5\x99\xb6\x72\x52\x35\x17\x64\xf1\x94\x36\xa3\xd5\x54\xb3\xef\xfb\xbe\x61\x3c\x4b\xbf\xf6\x66\x3a\xbb\x40\xda\xac\x2e\xf7\x69\xb3\xf2\x0c\x5d\x25\xbc\x44\x0c\xc8\xa1\x5f\x72\x23\x1f\xa2\x17\x67\xba\x44\xbf\x33\xc4\xb0\xed\x2b\x10\x00\x70\x24\x2c\x91\xa1\xc7\x47\xb6\x45\x80\x67\x86\x0f\x28\xbc\xb7\xae\xbc\xe2\x00\x30\xaf\x77\x3b\xc4\x69\x53\xf3\x35\xeb\x10\x12\x82\x97\x53\x33\x09\x6f\x15\xe2\xae\x8a\x43\x0a\x0d\x71\xb8\x89\x30\xbd\xb0\x79\x9c\x10\x8e\xf7\x3d\x59\x25\xde\xc7\x54\x3b\x78\x50\x3b\xe7\x16\x4a\xaf\x31\xb8\xd6\xb0\x3f\xdf\x31\x7f\xf3\x4b\x43\x83\x10\xc6\xe4\x30\x64\xaa\xcd\x95\xa6\xe1\xc1\xb1\xf2\x48\x51\x97\x84\xd3\xf4\xe0\x33\x95\xa6\x3d\x16\x12\x2a\x3e\xf8\xdd\x09\xd6\x9c\xec\x66\xad\xfa\x22\x7d\xeb\x60\x56\xd4\xbe\xf7\x98\xb3\x1e\xbc\x47\x3a\x0a\x15\xdf\x10\x03\xbf\x2a\x2f\x50\xeb\xbd\xa3\xc0\x07\x4e\x85\x7c\x96\x30\x09\x77\xe9\x2e\x5c\x52\xc3\x6d\x65\xfd\x3b\x6b\xc5\xea\x76\x18\xb6\x9f\x5b\xd6\x54\x8f\x2d\x2c\x86\x97\x7b\x66\x61\x94\xb3\x7b\xba\x05\xcf\xde\x04\xab\x81\x40\x6c\xba\x73\xe2\x1f\x80\x27\xf9\xa0\xf6\x20\x1a\x0c\x44\x3d\x58\x8b\xba\x16\x72\x39\x60\x83\x26\xb0\xfe\x00\x70\x24\x00\xcc\x69\xf4\x17\x3e\x28\xd7\x23\x2d\xe0\x03\xf7\xda\xd8\x1c\xac\x41\x40\xe0\x77\xc6\x0d\x07\x73\xd7\xb0\xc6\xc9\x2c\xc1\x87\x30\xf1\xf7\x98\xfc\x52\x0f\xdc\x11\x3a\x60\x65\x39\xd8\x30\xc5\xd6\x5c\x73\x55\xc7\x12\x4d\x36\x40\xd7\x2e\x55\x7c\x98\xe1\xd1\x5f\x5e\x09\xd1\x16\xf0\x43\x73\x20\xca\xe1\x9f\xf9\x6e\xa7\xe7\x0f\x6d\x10\xa0\x88\xab\x8a\xbf\xe8\xb3\x59\x49\x0c\x63\x91\x34\x88\x69\x16\x45\xd9\x97\x8d\x92\x64\xa8\x3d\x6c\xef\xf5\xff\xf8\xc2\x5e\xd7\x5f\xa1\xf9\x7f\x5e\xd7\x28\x1f\xe2\xeb\x5d\x0f\x1b\x3e\x4b\x92\x8c\xcf\x27\x79\x1c\x07\xd6\xe1\x8f\x8c\x3e\x30\x25\xd1\x5f\xf7\x4f\x9f\x3d\x3f\xbd\x77\xf7\xe5\xe9\xfd\x6c\x70\xff\xa1\x99\x2a\x3b\x05\x5a\x30\x6d\x27\x0c\x62\xee\x0e\x92\x6b\x97\x6a\x9f\x0c\xf4\x8a\x99\x49\x5a\x71\x25\x74\x3d\x30\xff\xff\xdf\x87\x61\xd9\x0f\x0a\xb3\xd9\x99\x39\xb2\xcf\xb6\x7a\x50\x54\xbc\x86\xcb\x3c\xb7\xb4\x07\x95\xe4\xe6\x13\x5e\x9e\x8f\x5e\xcb\x97\x2b\x51\x0f\x3e\x88\x12\xb0\x93\xaa\x35\x1f\x30\x39\x00\x30\x98\x81\x90\x03\x36\x38\xdf\xea\xad\xe2\x83\xf7\x5c\xd5\x60\xe5\x7a\x3e\xb8\x6b\x83\x5e\x8c\x06\xcf\x4a\xce\x6a\x3e\x60\x45\x11\x57\x8e\xf0\x40\x57\x80\xbf\xe4\x9a\x0a\x92\xdb\xe8\x2f\x4c\xda\x9a\xb6\x68\x24\xfc\xda\x9e\x19\x22\xa7\x02\x85\xd1\x38\xf3\x47\x8f\x86\xec\x07\x9c\xc9\x56\x2a\xce\x16\x2b\x8b\xed\x14\x39\x3f\xb6\x35\x0f\x81\x4c\x37\x0b\xe4\x22\xaa\xfd\x9e\x46\x1c\xef\x76\x3f\x83\x1a\xd6\xac\x14\xc8\x2a\x80\xe2\x1a\x82\x10\x8e\x80\xe0\x17\x78\x68\xc6\x73\x84\x8e\xf4\x6e\x77\x04\x99\x1f\xd8\xe6\xe3\x7d\x53\x4c\x9c\x8e\x46\xa3\xd1\x5b\x85\xf4\xa8\xe0\x1b\x40\x9a\xc0\xff\xb6\xe0\xd3\x8f\xa2\x36\x6b\x21\x2e\xf9\xa9\x42\xae\x8d\xe1\x6d\xeb\x02\x06\xba\x0a\xb6\xe8\xdb\x9a\x83\x0b\xd9\x6e\xd7\x9c\x7e\xd6\x41\xa5\xa7\xd6\x23\xdb\x3c\xa8\xa8\x67\x98\xa6\xb6\x72\x33\x13\xbc\xd5\x9f\xe6\xc8\x8e\x42\x75\xea\x32\xf2\x7b\x77\x3e\x89\x9e\xbe\x69\xe7\xea\xc7\x09\x9c\x59\x99\x9a\xcd\x73\xe7\xe2\x16\x87\xb3\x2d\xe3\xc0\x09\x21\xe6\xf0\xa1\xd0\x9a\xa6\x7f\xc2\xba\x8d\x5c\x76\x55\xf4\x6d\x5f\xdc\x44\x47\x48\x44\x79\x60\x50\xd4\x03\x27\xd0\x55\x59\x78\xee\xe1\xa7\xe6\x06\x24\x2c\xea\xd1\xd5\xe2\x01\x91\x7b\x74\x69\xa8\x4a\xa6\xf6\x84\x13\x50\xaa\x5a\x1b\xa5\xd2\xea\x54\x2f\xad\xba\x43\x5f\x5a\x2b\xca\x81\xbd\xd9\x6b\x9d\xd5\x5d\x3d\xe6\x4c\xd8\x61\x4e\x12\x9c\x99\xc7\x86\x3b\x22\x3e\x92\x1d\xb1\xa4\x0c\x70\xad\x02\xde\x84\x1e\xbd\xfc\xf1\xf9\xd3\xdf\xde\x3c\x7c\xf0\xe6\xc9\xd3\x97\x6f\x1e\x3c\x7d\xf5\xe4\xbe\x11\x84\xf5\xe8\xc9\xab\x47\x8f\x9c\xfa\x86\xe8\x51\x73\x5e\xd0\x1f\x43\x00\x70\xd2\x9c\x96\x19\x9c\x89\xc4\x4f\xac\x5b\x9c\x9f\x18\xde\x1b\xd6\xf7\xcd\x9b\x27\x3f\xbc\xf1\xa8\x63\x0f\xef\xbf\x79\x43\x8f\x27\x44\xef\x5b\x6a\x62\x56\xda\x0e\xbe\xe1\x08\x62\x6b\xcf\x27\x39\xf9\x43\xb7\xdc\xda\x21\x82\xa4\x63\xa3\x7a\x80\xce\x9e\xc2\x7a\x30\x3c\xd5\x33\x6f\x98\xf3\xf4\x1c\x45\x71\xee\xf1\x28\x52\x1f\xed\x91\x76\xf6\x5a\xca\xa1\x89\x80\x48\x3f\xd7\x79\x3b\xb6\x2b\xa0\x5e\x58\x95\xb2\xa4\xdc\x0d\xc4\x62\xbd\xd9\xed\xfc\x8f\x42\xa8\x00\x82\x11\x65\x38\x14\xa5\x82\x4d\x7a\x3d\x58\x30\x69\x68\xb2\xa3\xe1\x83\x7b\x41\x5b\x9f\xe0\x69\x53\x4d\x21\x14\x88\xdd\xe1\x3a\xde\x5d\xd6\x45\x51\x17\xa6\xc1\xba\xa4\x2e\x91\xb7\x95\x31\x3c\x51\xc1\x17\x25\x53\x66\x6e\x9a\xb7\xed\x34\x1c\x9b\xa3\x94\x8d\x95\x4c\x83\xe8\x29\xdb\xb6\x18\x2a\x4d\x8b\xd2\x46\xc9\x6b\xae\xd1\x1b\x9b\xec\x92\xca\x1e\x87\x78\x96\xa6\x95\xf9\x88\x81\xf3\xc7\xc2\x3c\x96\x98\x6c\x42\x5b\x89\x0c\x8d\xde\x1c\x34\x91\xc8\x83\x36\x6f\x22\x73\x1e\x19\x9a\x6c\xaf\xe8\xd3\x54\x5a\x9b\x38\xe6\xc1\xae\xba\x3e\x1e\x53\xde\xbc\xa3\x28\xfa\x61\x35\x07\x8b\x4a\x2e\x98\x46\x07\xa5\xec\xc3\x0d\x9d\x1c\x9d\x73\x66\x0e\xc5\xda\xf2\x15\x9f\x41\xf2\x68\x5f\xdf\x4a\x0b\x6d\xf6\xd0\xce\x78\x9a\x02\xd0\x8d\xa4\x94\x96\x25\x5c\x55\x1c\x4d\xf0\x7e\xcf\x69\xff\x22\xe6\x2d\x9f\x30\xbf\x07\xc6\x8e\x16\x45\x86\xea\xba\x09\x0c\x21\xee\x98\x26\x35\x91\x21\x9c\x09\x6e\x63\x95\x40\xf9\x90\x46\x36\x0a\xb2\xb1\x84\xa3\x4f\x39\x8a\x7e\x12\x05\x26\x3d\x71\x0e\x23\x46\x42\xfc\xdc\xe0\x99\x13\x13\x69\x4d\x29\x7d\x35\xbb\xdc\x67\xe6\xe1\x9a\x21\xea\x11\x49\xae\xca\xae\x57\x5b\xe3\xcd\x15\x3d\x1b\x86\x40\x13\x61\xc8\x21\x87\x07\xa2\x6c\xd0\xc0\xd8\xce\x7f\x71\x50\x56\x67\x01\x76\x13\x5c\xa9\x44\x86\x72\x89\x74\x25\x1b\xb1\x28\x2e\xbb\x38\x28\xbb\xb5\x19\xda\x3f\x3f\xd7\x5a\x33\x33\xdb\xd2\xcd\x54\xb0\xda\x2e\xad\xfe\xe5\x68\x1b\x19\x23\x7c\x3f\x7a\x71\xb1\x3e\xab\xc0\x4c\x15\x04\x55\xa1\x39\x70\x72\x78\x5b\xd2\xe6\x57\x3b\xae\x74\xb3\x62\x22\x36\x16\xcc\xc5\xd0\x63\xb6\x89\xa8\xdf\x55\x1e\x9c\xc3\x21\x6f\x7b\x70\x4e\x13\x2e\xb5\x19\xad\xc4\x7a\xbd\x25\xb5\xf8\xc4\xdd\x73\xab\xc8\xb9\xca\x29\xa5\xad\xa4\x91\xfb\x34\x4d\xd1\xb6\xa4\x0a\xef\xc3\x51\xb3\x2d\x9d\x1a\x7f\x53\xf6\xc6\x13\xfa\xa0\xd8\x66\xc3\x0b\xaa\xf7\xee\xd8\x33\x09\x9d\x90\x49\x1b\x88\x21\xec\xde\x6f\x65\x27\xc7\xa6\x1c\x89\xfa\x37\x5b\x8c\xb5\x2e\x71\x65\x66\xa1\xcc\xf8\x7d\x2f\xb2\xdc\xa6\x8c\x38\x8f\xf3\x32\xe6\x8a\x96\xa5\x0d\x52\xd1\x3d\x7b\x77\xbb\x4e\x00\xeb\xc7\x6c\x83\xd3\xd4\xcc\x30\x58\xc6\x47\xa6\xcd\xfd\x9c\x4c\x8f\xa2\x77\xa0\x7b\xb4\xbc\x71\x51\xeb\xb2\xc3\xa8\x98\x89\x8b\x43\x02\xbe\xef\x64\x38\x72\xeb\x44\xd4\x00\xe7\x63\x15\x55\xf6\xa3\x76\xe4\xc3\x8b\xf2\xd0\x9f\x20\x14\xe6\xf9\x1b\x9b\x30\x9c\x10\x81\x77\xbb\xc8\xaa\xef\xac\xec\xf3\x05\x8c\x8a\xec\x14\x70\x42\x24\xde\xed\xa2\xcb\xa1\x7b\x3d\xb5\xc7\x80\x97\xef\x4b\x24\x09\x03\xd8\x3a\xd3\x01\x40\xc2\xe9\xc7\xbf\xf0\x97\xa2\x6f\xad\xfe\x7a\xfa\x2b\x43\x2e\x16\x2e\x61\xc4\x41\xc3\xb9\x86\xee\xd1\xaf\xa6\x44\x49\x7c\xd5\x98\xdc\x8b\xac\x01\xee\x96\x07\x16\x2e\xd0\x7c\x68\x86\xc2\x33\x3e\xbc\x8b\x14\x1e\x8a\xec\x53\x34\x12\x2f\xca\xab\x5d\x13\x00\xba\x67\x41\xa1\xf1\x05\xd5\xc3\x93\x31\xd9\xd2\x45\xd7\x1f\x63\xd6\xd7\x2f\xeb\xcb\xd4\x58\x53\x73\xe7\xfe\x64\xca\x61\xe0\xb6\x77\x93\x94\x0e\x4d\xe5\x6f\x8d\x16\xa4\xc6\x78\xba\xb4\x2e\x7e\x85\x4d\xa9\x30\x26\x6f\x38\xe2\xa4\xf0\xe7\xf8\x96\x16\xd6\x45\xab\xa6\x5b\x86\x4e\x88\x8f\x44\xca\x0f\x8d\xe9\x09\x1f\xc5\xce\x2d\xd6\x96\x87\x07\x6f\xac\x45\x57\xac\xe3\xa3\x77\xc1\x2c\x3b\x3c\x07\xbb\x03\x68\x04\xd9\xfa\xf4\x26\xf7\x88\xaf\xcf\x78\x51\xf0\xe2\x25\x44\xdb\x2e\x30\x26\xc5\x1e\x15\x64\x41\xaa\x96\xb5\x5a\xb6\xb0\x37\xdb\x45\x3e\xfd\x59\xa3\x2d\x84\x1c\xb6\x7d\x5a\xd1\x0a\xc2\x81\x5b\xe6\xf9\x5e\xb5\xb6\x91\x9c\x12\x3c\x7d\x21\xcc\x20\x90\x15\xd9\x82\x3b\xe5\x8a\x54\x98\xfc\xc9\x50\x45\xaa\x79\x91\xd3\x0f\xcc\xa4\xc0\x5b\x4c\xde\x6b\xb4\xc5\x69\x5a\x31\xf8\x62\xeb\x6d\xce\x0d\x23\x63\x3e\xd8\x92\x3a\x0e\x63\x1c\xef\xee\x27\x1a\x45\x3e\x89\x16\x1c\xf4\x91\xe9\x0b\x39\x19\x0f\xe3\x8d\xfc\x06\xd6\x49\x7c\xef\xe4\x49\x71\xbc\xec\x83\xd7\xcc\x53\x50\x6f\xe2\xec\x0f\x8e\x0c\x77\x4c\x14\xb9\x80\x60\x56\x51\x89\x3f\x96\xdd\xbb\xfa\xce\x06\x12\xcd\x06\x3a\x67\x76\x0b\xc1\xfa\x17\xb0\xfe\x05\x6c\x12\x05\x61\x68\x7f\x8c\x76\xc1\x87\xde\xad\x2d\x03\x7c\x9f\xb3\x88\x9e\x3a\x3f\x1a\xcf\x97\x02\x3a\x11\x89\x59\x85\xc7\x57\x6c\x71\xc2\xec\x8e\x28\xa9\x19\x22\x52\x53\x09\x2d\xa9\xa8\x9c\x97\x39\x95\x02\xd5\x84\x93\x03\x47\x4f\x38\xe9\x36\x6c\xc1\xcd\x8e\x62\xff\x72\x0f\x35\x61\x7d\xc3\xfe\xa9\xfc\xfe\x39\x21\xd2\xec\x93\x9a\x30\x1c\x06\xcd\x6d\xa0\xca\xbe\x28\x71\x70\x3e\xa8\xac\x65\x73\x9a\xfe\x00\x0b\xc8\x59\xbf\x9b\xa1\x0b\x19\x22\x43\xe8\x90\x2d\x36\x8e\x3e\x1a\x87\xcc\xd1\x66\x89\x76\x82\x45\xa3\x06\x53\x58\xc4\xcd\x62\xad\xf6\xc8\xd0\x30\x49\xc6\x6e\x18\x33\x16\xec\x3b\x7e\x36\x3b\xfc\x68\x1c\xfb\x2a\x44\x95\x79\xf3\x8f\x22\x4d\x4f\x39\xaa\x49\x15\xd3\x80\x85\xb7\x67\xf0\xb9\xb6\x69\x7a\x2a\x20\xd7\xb6\xd9\x55\x0b\x67\x19\xe1\x33\xad\xd2\xf4\x4f\x9b\x69\xd5\xc4\x39\x5e\x04\xf7\xde\x17\x36\x1c\x38\xb8\x6e\x8c\x29\x8d\x1c\x75\x5d\xbf\xee\xf3\x8d\x5e\xdd\xab\xb6\x52\x43\xf8\xe4\xaa\x0d\xd1\x74\x90\x69\x38\x34\x9b\x72\x61\x68\x7f\xc5\xa0\xe8\x05\x26\xb5\x79\x5a\x10\xd9\xcc\x8b\x80\x1d\x6a\x5e\x46\xb6\x7f\x86\xe5\xb2\x56\x7d\x66\xeb\x4c\x7f\xd7\x08\xcf\x34\x47\x38\x43\x9a\x06\x29\xf9\x67\x73\x5c\x1c\x4d\x70\x2c\x63\x7d\xa6\x3d\xc7\xc7\x41\x5a\x7a\x07\xbb\xac\x07\x09\xe5\x8d\x61\x9e\x35\x26\x4b\x6b\x81\xa6\xba\x53\x7b\x2a\x0b\xb8\xa9\x74\xd7\xab\x3d\x66\x25\xbd\xc0\xde\xe3\x23\x8a\x26\xb7\x52\x67\x39\x8d\xf7\x60\x65\xfd\xa1\x44\x8a\x70\x0b\x0e\xd7\x57\x52\xb4\xdc\xf8\xa1\x8d\xcb\x95\xf5\xdc\x38\xf9\x6c\x3d\x07\x05\x75\xc2\x3d\x47\x3b\x3e\xda\xfd\xc4\xcc\x48\x64\x04\xd8\x4b\xb7\x88\xb4\x54\x81\xd9\x73\xd2\x08\x99\xff\xbc\xc7\x1b\xfa\x14\xf6\x77\x49\xff\xd6\xc8\x10\x22\x52\xfb\x9d\xfe\x2d\x49\xe4\x12\x02\xf3\x30\x21\xb9\x4a\x48\xd9\x3d\xbd\x4a\xd8\xb1\x35\x29\x61\xd8\x1c\x15\xa8\x09\x94\x14\xad\xb6\x7f\xb3\x6f\x6b\x4c\xea\x3d\x2c\x58\x7b\x4d\x98\xc9\x00\xed\xf6\xb3\x46\x65\xb4\x67\x6b\x70\x3e\xa3\xe2\xea\xe3\x0b\xac\xb4\x8c\x18\x7d\x4d\xa1\xda\x74\xe9\xbd\xb6\xc0\x83\x95\x35\xec\x2b\x61\x4b\x48\x52\x02\x2b\x23\x7d\x6c\xd7\x05\x43\xe0\xb4\xd1\xd8\x4e\x76\x76\x84\x5f\xf1\xef\xfe\xc5\xf6\x20\xbc\x7f\xa5\xf3\x68\xa5\x1f\x0c\x86\x5b\xe9\x91\xa1\x65\x98\xf3\x30\xfb\xe4\xb4\xb5\x2a\x5e\x96\x8d\xc9\x89\x59\x0f\x91\x7d\x62\x8b\x3b\xd7\xbd\xd7\x48\x7a\xa4\x57\x3c\x86\x0d\xfe\x57\xdf\xd4\xdb\x33\x1b\x91\xc9\x89\xfd\xcf\x4a\xfa\x36\x92\xdd\x9e\xfc\xe3\x01\xf6\x47\x74\xe0\xde\x2f\x61\xd6\xa5\xe3\x3d\xcd\x97\x47\x47\xb0\xfc\x9f\x44\xa7\xeb\xf3\x8e\xb4\x09\x87\x7b\x6b\x07\x44\xe5\x99\x39\x7e\xce\x50\xc1\x9d\xa6\x02\xdb\xed\xa4\x6c\xe1\x13\x4c\x9e\x47\x25\xdf\xff\x0c\x23\xfa\x5e\x23\x81\xc1\x3e\xb0\xdf\x17\x98\x14\x94\xcf\xbf\xcd\xc9\xd6\x79\x14\x9b\xb5\xb2\xa2\x47\x60\xa7\x77\x23\x15\x0e\x69\x39\x14\xb8\x31\xcc\xb6\x20\x1c\x93\x73\x5a\xcf\x6a\xb4\xc1\xd9\x86\x2c\xe9\xd6\x3b\x09\xae\x69\x3d\xd3\xf4\x4e\x8d\x5e\x6a\xa4\xe7\x22\x18\x50\x66\xee\xd1\x14\x7b\x6a\xad\xbd\x1b\xdf\x31\x1b\xd4\x26\x4d\xab\x34\x45\x5d\x35\x6d\x3c\x03\xc1\x50\xb4\xb9\x30\x93\x1d\x57\xcf\xc6\xa5\xb9\x05\x87\xa0\xa9\x34\xdb\xd0\x08\xdd\xd6\x36\x5e\x02\x3a\x82\xc5\x9d\x6d\x2c\x0d\xbf\xc9\x89\x32\x39\x87\x27\x79\x17\xe1\xf9\x8e\x9a\xe9\xb9\xca\x2d\xec\xfb\x21\xd0\x6d\x9a\x22\xa8\xaf\x73\x05\x02\xd0\x60\xc2\x3b\x0b\x07\x88\x0d\x8c\xca\xd1\x9b\x37\x16\x3e\xef\x91\xa8\x35\x97\x5c\x3d\x90\x6f\xde\xec\x76\x25\x86\x17\x4f\x0c\x2f\x19\xbd\xa0\x8c\xf4\x7f\x41\x19\x59\xd1\xa3\x89\xd5\x17\x30\xfa\x77\x09\x26\x0a\x85\x8d\xc6\x1f\xd0\x9d\xd4\xa8\x84\x6f\xd0\x39\x08\x4e\xd3\xad\x33\x7f\x30\x1b\x79\x91\xa6\x0b\xef\x21\xb0\x26\x4b\xb2\x1c\x82\x9a\xaa\xac\xf9\xa0\x5d\xde\x18\x93\xf3\x11\x2b\x8a\xd3\xf7\x5c\x86\x36\x20\xcb\x6c\x91\x6d\x70\x80\xea\x96\xe7\x50\xae\x06\x57\x34\x6e\x43\x85\x57\xf1\xc1\xda\x3b\x37\x93\xb4\x0a\x17\xcb\x9b\x34\x45\xe7\x74\x33\x97\x79\xe4\x1f\x70\x1e\xdd\x46\xea\x8e\xd5\xbc\x9e\xaa\xd6\xbc\xf3\xf9\xf9\x5c\xe5\xb9\xf9\x77\x38\xc9\xf3\x66\xe3\x9b\xb6\x96\x61\xe1\x5e\x39\x24\xc2\x03\x90\x90\x63\x54\x0e\x27\xb8\x85\x09\xf3\x20\x22\x13\x51\xc8\x66\xb0\x5a\x41\x22\x32\x10\xf7\x1b\xdb\x30\xce\x12\x93\x96\x77\xff\xdf\x2d\xae\xbb\x73\x29\x31\x50\x88\x81\x16\x89\x51\x4a\xbb\x37\xb5\x22\x60\xc4\x84\xb3\x7b\xf6\x5c\x23\x1d\x50\x5a\x32\x0e\x18\x5d\x37\x4e\xac\xf3\x42\x9a\x9e\x32\x54\xda\x3d\x5e\xd3\x07\x25\xb2\xce\x4c\x0c\x93\x8a\xaa\xde\x75\x67\x15\xe5\xd5\x14\x87\xec\x15\x61\x38\x4d\x0d\x33\x5d\xf5\x7f\xe1\x37\x40\x9a\x1e\x4d\x28\xc0\x41\x21\x36\xda\x28\xfe\x1e\x98\x2a\x10\x80\x0c\x1d\x1d\xd9\x7c\x70\xf3\x06\xb8\x49\x75\x34\x24\x3f\x94\x48\xd3\x49\xcf\x0d\x4d\xb0\x05\xef\x97\xbc\xe8\xa1\x4f\xc3\x54\xdf\x19\x4f\x31\xa7\x7c\x3e\xf9\x3a\x27\x86\x99\x0b\xa6\xb1\x48\x93\xfe\x62\x30\x9e\x7f\x0b\x57\xb9\x51\x68\xf1\xb2\xeb\xd0\x13\xee\x13\xfa\xef\xcb\x41\x4c\x98\x46\x16\x75\xcd\x8a\x0c\xf6\x4c\x5f\x63\x87\x7e\x0d\x88\xdf\x01\x5c\xde\xfa\x67\x76\xef\x52\xdb\x8e\xd7\xbc\xc7\xf1\x9a\x05\x50\xef\xe4\xab\xc4\xba\x92\x37\x28\xa9\x62\x06\xf0\xd4\xb0\x8f\xb3\x07\xd2\x48\x88\xb8\x89\x56\x00\x3b\x54\x51\xd9\xe3\xfc\xf3\x7d\x19\x77\xcc\x9c\x56\xf3\xc9\xad\x7c\x7e\x0b\x2a\x3a\x02\x17\x69\x87\x96\x19\x7b\x0f\x37\xa9\xf4\xae\x42\x7a\xe6\xc9\x68\x36\x71\x18\x76\x82\xaa\x00\x4c\xeb\xf1\x6d\x16\x4d\xf0\x61\xb7\xfd\xe5\x34\x1a\xd3\xd9\xa7\xd2\x1a\x7a\x8f\x03\x68\x5c\x9a\x22\x31\xe7\xf9\xcc\xfc\x33\x6a\xe3\x7b\x52\x99\xa9\x39\xcf\xa9\x24\x02\xfe\x00\xd6\x01\x20\x54\xc6\x3b\xf8\x95\x95\xcd\xc7\x9f\xe1\x49\x0d\x9b\x05\xe2\xea\xe4\x96\xf3\xce\xb3\xca\x97\x80\xbe\xc1\xa2\x9a\xdd\x6a\x0f\x9d\xe7\x98\x18\x06\x2b\x88\x4d\xec\x4a\x54\xa4\x8f\xc2\x29\xaf\xac\xc8\xb7\x10\x56\xc6\xc6\x64\x29\x90\x72\xbc\xd9\x6e\xc7\xe7\xb7\x72\x48\xc6\x7b\xe0\x11\x58\x0c\xbf\xdc\x55\x18\xbe\x33\x09\x49\x02\x97\x86\x86\xed\xba\x16\xf1\x0c\xef\x7a\x65\xfd\x6b\x96\xb9\xb9\x6b\x18\x9a\xb6\x36\xcf\x0c\xf7\x27\xd9\x51\x27\x30\xa2\x49\x49\x18\x34\x5b\x02\x5b\xf2\x2e\xaa\xe2\xb7\xde\x2a\x34\x10\xe2\x06\x09\x81\x3b\x72\x24\x66\xef\x24\x62\x38\xfb\x03\xc2\xb0\x55\x01\x0d\x7c\x6c\x31\xe5\x10\x50\x93\xca\x9c\x90\x2d\xa7\xdd\x7a\x38\xc9\xa7\x7f\x94\x48\xcf\xeb\xdc\x2a\x0c\x2b\x40\xa0\x84\x17\x54\xcc\x7e\x91\x48\xe1\xec\x37\xf3\xaf\x91\x0b\xa0\x16\x05\xb5\x28\xbc\xaf\x40\x41\xaa\x6c\xce\xdf\xa0\xfa\x5f\x20\x4a\x5c\x04\x3a\x5d\xb6\x6e\x65\x1b\x1f\x14\xfb\xc4\x77\xbb\x03\x6d\xf1\x4c\xcf\x27\x79\xa6\xb1\xb5\x1f\x3a\x42\x47\x87\xea\x64\xcf\x40\x84\xa8\x0f\xa6\xe5\x6f\xac\xe2\xe7\x0e\x1d\x3b\xa6\xf4\xa7\x92\x5e\x1a\xa2\x74\x2a\x8b\x6c\x4c\xde\xf2\x0b\xfb\xaf\xfd\x69\xef\xd5\xdd\x5f\x48\x8a\x70\xc4\x7f\x69\xdd\xd5\xc0\xa1\x67\x0d\x50\x7f\x2a\x47\x6f\xf9\x05\xb1\x7f\x4e\x65\x11\xf5\xf4\xe7\x0e\x7f\xfa\x53\x39\x72\x95\x07\xf8\x23\x30\x75\x39\x9e\x64\x88\xd3\x50\xc2\xc1\xb5\xba\xbd\x5b\xbd\xad\xd2\xb4\x15\x22\x85\xe3\x3b\x37\x4e\xa6\x98\x0f\x87\x2d\x0a\x6c\xcb\xa1\x20\x16\xfc\x5e\x1e\x42\x65\x85\xb4\xab\xcb\xbd\x4d\x0f\x0a\x6e\x6c\x13\xea\xce\x9e\x90\x2e\x01\x56\xab\x8e\x70\x6a\x79\xdd\x9e\x68\x9b\x0f\x36\x3c\x58\xea\xc5\x90\xb6\x10\x68\x8f\xd5\xe8\x85\x22\xa2\x26\xba\xad\x5d\x17\x75\xd7\xa3\xae\x47\xe2\x8e\x93\xdc\x10\x8c\x9b\x59\xb1\xcf\xd6\x22\xaf\x79\x0c\x2f\xdc\xb4\xd0\x26\xfa\x88\xc6\x04\xa6\x0f\x46\x2b\xce\x83\x41\x98\x9f\xaa\x3b\x86\x39\xa2\x3f\x97\x60\x57\x8c\x5f\x98\x95\xf6\x4b\x89\x38\x6e\x37\x3d\x0c\xce\x95\x62\x4f\xc9\xd1\x09\x9e\xb2\x43\x34\xc4\xba\x46\x96\x1a\x08\x4c\xb8\xa3\x15\xa0\xc9\x2f\x61\x57\x16\xe6\xb5\xd3\x61\xdd\xe5\x08\xe7\x41\x5e\xd2\x44\xce\x4b\xb3\x03\xdb\x67\x77\x6b\xbf\xe9\xdd\xee\x10\xfa\x9f\xcf\xf4\x90\xf2\xac\xcf\x48\x04\x69\x7a\xee\x02\x79\x61\x4c\xf4\x1e\x7a\x4d\xda\x92\x31\xeb\xe9\xab\x23\xf9\xb6\x93\xb2\xb7\x93\xce\x43\x9b\xc5\x70\xb0\xa0\x7c\x15\xe7\x48\x35\xfd\x36\x39\x1a\x97\xd6\x9a\xca\xa8\xeb\x26\xeb\xa6\x06\xb1\x3e\x4d\x8f\x4a\x53\x26\xc3\x5e\x4a\x17\xb3\xba\x47\xa7\x93\xd5\x87\x0a\x98\x69\x74\xbd\xa4\xe8\xd2\x1c\x17\x60\xf9\x81\xc9\x07\x33\xee\x35\x29\x2d\xc8\xa3\x39\xdb\x8f\xae\xba\x68\xc0\x97\x92\xda\x46\x23\x49\xaf\xd9\xa3\xb8\xa2\x63\xb2\xa0\x63\x52\xd0\x71\x90\xa7\x66\x72\x3e\xb6\xc2\x0f\xd9\xd2\x71\xc0\x7d\x99\x31\x9f\xdc\x3a\xb6\x8b\x00\xbe\xb2\x0d\xc4\x7a\x45\xab\xb8\xb4\x6a\x38\xf1\x86\x40\x64\x43\x17\x71\x89\x8b\xe6\x95\x15\x09\xc8\xd2\x72\x5c\x05\xa5\x74\x3b\x43\xd5\x90\x9e\x90\x85\xf9\x67\xe5\x24\x84\x25\xdd\x92\x73\xba\xc1\x01\x93\x7a\x1b\x1a\x50\xa4\x69\x71\xdb\x7f\xb4\xa4\x05\xce\xd0\xc2\x3e\xda\x4f\xbc\x4c\xb6\x84\x35\xea\x47\x67\x49\xce\x61\x74\x48\xd1\x69\x75\x18\x83\x76\x8b\x9d\x5c\xb8\x77\xe3\x5e\x5a\x4d\x80\x45\xe0\xb3\x7f\x0e\xc8\x64\x60\xcd\x94\x8b\xe1\x13\x4c\x3f\xaf\x35\xa6\x2a\x39\x91\xf4\x81\x40\x36\x5a\x4e\xfb\x18\x91\xf8\x0a\xd1\x17\x50\x8e\xc0\x08\x78\xce\x72\x50\x3a\x79\xf3\xb3\x83\xad\x22\xa3\xa8\xfd\x6c\x20\xe4\x40\xe2\x83\xb0\xa4\x86\xdd\x37\xa5\x31\x28\xcf\x85\xc3\xe8\xee\x45\x99\xa6\x1c\xc5\xd0\xe3\x22\x40\x1e\x01\x8f\x12\x59\xf8\xb4\xc9\x2c\xbf\x43\xf5\xe8\x00\xb1\x2e\x32\x3a\xe8\xd9\xa5\xce\xce\xa3\xe1\x6d\x25\x1c\xe1\xd1\x8d\x85\x23\x31\x25\x85\xda\x14\x9e\x6e\x6a\x50\x0c\x5a\xb1\x92\x02\xe3\x78\x54\xa6\x29\xb2\xa2\x07\xff\x8c\xce\xa1\xe0\x3e\xd0\x25\xa3\x62\x06\x5e\xb0\x2d\xb8\xf6\x26\xc5\x62\xbf\xc7\xcd\xc2\x63\x4a\x29\x32\x5f\xb5\xd1\xdc\x9d\x36\xd5\xff\xb6\x8e\xac\x8b\x1a\x29\x5a\xd5\x16\xda\x2f\xe8\x4f\x3d\xda\x8e\x30\x74\xc9\x72\x9d\x91\x69\x40\xd9\x06\xd9\x09\x90\xfc\x21\xb6\x52\xb9\xdb\xe9\x79\x99\x7b\x50\x01\x5b\x41\x53\xba\x67\x60\xbd\x5c\xd3\x5d\xa3\x7e\x1d\xaa\x7f\xea\x82\x87\x2e\xf8\x23\x8a\xa0\x34\xd0\xf3\x77\xe6\x67\x6e\x97\x82\xc0\xd3\x60\xda\xaf\xd2\xb4\xbd\x98\x95\x1d\x83\x56\xf7\xe7\x93\x1c\x54\x5e\x30\x32\xf1\x40\x1c\x4e\x16\xd4\xf4\x8f\x8d\xc4\x39\x75\xcb\x52\x00\x8f\xe1\xd4\x12\xdd\x4e\x5b\x9b\xd2\x60\xd9\xd3\x8f\x39\xcb\xe8\x64\x78\xc5\xd8\xb3\xdb\x12\xb6\xa0\x30\x0d\x17\x44\xcf\x59\x1e\x1b\xda\x34\xf6\xc1\xe6\xad\xef\x96\xc2\x7e\x94\x0e\x7c\x22\xc0\xa7\xf5\x70\xe5\x51\x76\xb0\xf6\x28\xc3\x44\xed\x41\x25\xc3\xfb\x06\xca\xde\x9a\x5b\xbd\x1b\xfb\xa7\xd1\x22\x35\x7d\x27\x51\x69\x58\xf1\x3f\xcc\xdf\x29\x80\xa1\xa8\x00\xb6\x67\x7d\x6c\xba\xd3\x18\x81\x38\x4c\x17\x00\x76\x40\xfc\x76\x58\xec\x76\xc0\xe1\x2e\xf0\x9d\xb1\x99\xee\x82\x1a\xde\x03\x26\x61\x41\xc1\xdc\x1d\xd6\xa8\xe9\x72\xd5\x48\x7d\xef\x24\xb2\xbc\x3c\x34\xc0\x10\xd2\x6b\xd2\xea\xda\xc7\x4e\x00\xd4\x73\x6e\x92\x7f\x92\xee\x09\x34\xe2\x8e\xff\xef\xe5\x29\x26\x37\x26\xe3\x6f\x26\x36\x2a\xcc\xe4\x9b\xbd\x2b\xdf\x1f\x95\x83\xa6\x9a\x9a\x8c\x6d\x35\x80\xf6\x6c\x4b\xfc\x49\x36\xf9\x41\xa0\x98\x76\x3e\xaa\xe0\x23\x4a\x69\x3d\x03\x37\x63\x38\xe9\xec\x67\x95\xfd\x8c\x54\x54\x4c\x21\x12\x83\xfd\xe8\x37\xe9\x9e\x30\x26\x20\x33\x2d\x88\x00\x9e\xb3\xf9\x31\xe9\x9b\xcc\xf8\x8a\x56\x1f\x10\x26\xdd\x25\x4c\xce\x4f\xf4\x30\xbe\xdf\x80\x83\xec\xc1\xac\xec\x01\x30\x3e\xd0\x2e\x23\x3a\xb9\x76\xed\x21\x64\x9a\xb6\xca\xa2\xd2\x8e\x4d\x85\xc9\xc1\x22\xa2\x65\x77\x19\xd1\xd2\x2f\x48\x05\xcc\x61\x8c\xa8\x5c\xa3\x83\x00\x2f\x91\x66\xa5\xec\x62\x26\x5b\x39\x51\xf5\xef\x3a\xb3\x31\x81\xe4\x99\x61\xef\x22\x0b\x67\xf5\x70\x38\xad\x6f\x97\x10\x07\x9c\x1b\x49\xd1\x6d\x4e\x16\xed\x4c\x89\x09\x03\x27\xad\x29\xae\x1b\x59\x22\x66\xb2\x7a\x6b\xa6\x35\x44\x36\x08\xf6\x6a\xf5\x21\xf1\x9c\x64\x27\x4e\xc7\x71\x3c\xe9\xf5\x7f\xb7\x07\x38\xef\x85\x29\xe4\x73\xd6\xe3\xff\x5e\xce\x24\x2d\x33\xc3\xbb\x89\x5e\x7b\x25\xa4\x1b\x6f\x3a\x3d\x9b\xe7\xd9\x3c\x49\x88\xce\x31\x01\xd6\xbf\x24\x47\x47\x6a\xb7\xe3\xf3\xe1\x90\xe5\x5d\x37\x2c\xf8\x02\xfc\x34\x23\x93\xbe\x88\x37\x0a\x9c\x23\x78\xfd\x79\xfc\xcb\x10\x93\xc1\x5f\x3c\x38\xc0\xb8\x05\xad\xac\x8c\xbe\xaa\x7b\xcc\xdf\x07\x13\x1f\xee\x0e\x2d\xf0\x6c\x5b\x23\x6b\xfb\x21\xc9\x1f\x12\x70\xde\xb0\xe3\x03\x4d\x8f\x56\x35\xb8\xab\xf5\x14\x72\x42\x29\x3a\x71\x85\xc0\x14\x43\x41\x56\x57\x03\x78\x43\x25\xfe\xfc\xfe\x39\xf5\x5e\x38\x1c\xcb\x19\x9b\xe9\x11\x2b\x0a\xd8\x47\x08\xee\xde\x95\x5d\xe4\x8f\x44\x0d\x6f\x90\xc0\x19\x0b\x98\x49\x57\xe4\xb3\x2f\x3b\x9e\x61\xb0\x40\x45\xd0\xff\x25\xc7\x09\x9e\xd9\x0e\x66\x3f\xa8\xd1\x7d\x56\xaf\xee\xb1\x9a\xc7\x88\x6e\x4d\x3d\xb0\x8b\x01\x94\x8d\x9b\x9a\x60\x93\xb9\x57\x11\xb6\x6a\x9b\x3b\xe8\xe3\xd3\x00\xdd\x1d\xe4\x08\x94\x1c\x59\xa7\x47\x26\x75\x82\xa7\x25\xc8\x00\xd2\x69\xe5\xc6\xe4\x78\x62\xc4\xde\x1d\xfd\x41\x8d\x1e\xfa\x6c\x66\xcb\x03\xa2\x53\xd3\x1a\x19\xb7\xa7\x03\xfe\x49\xca\x59\xd2\x54\x91\x81\x59\xfa\x1e\x09\x52\x92\xa7\x1a\xdd\xb5\xb6\x55\x70\x28\x45\x72\xd9\xb6\xee\x37\xf2\x6a\xab\x8b\x9c\xb8\x11\x21\xb8\x71\x0a\xf8\x46\x8c\xb6\x37\x03\x37\xe4\x96\xcd\xf8\x7c\x92\x67\xbc\x41\x18\xac\xa0\x98\x82\xaa\xb9\x34\x8b\xb3\xf0\x42\x50\x41\x17\xb3\x6b\x7e\xd1\x41\x9e\x2d\x5d\xcc\x7e\x55\xa8\x30\x13\x5c\x81\x22\xb5\xf0\xc2\x89\xb5\x7d\x3e\x5a\xd5\x60\x42\x84\xb6\xf4\x57\x85\x38\x9c\x0b\x3e\xa9\xa6\x5b\xb3\xf8\xdc\x3a\xad\x83\x89\x85\xb6\xd5\x4a\x5a\xce\xde\x49\xb4\x02\x7d\xd4\x2a\x72\xc0\xa6\xdc\xcb\x83\xec\xdf\xf0\x9c\xf6\x23\x0d\x15\xfe\x6a\xcd\x52\xc3\xa6\x8e\xf4\x16\xab\x3a\xda\x34\x8d\x9f\x65\x04\xfd\xdb\x66\xce\xc7\x47\x14\xb9\x7b\x85\x14\xf1\xd9\xe4\x56\x76\xe3\x24\x9e\xaa\x73\xc8\x4e\x93\xa4\x6d\xd1\x44\x84\x15\xa4\xa5\xbd\xcf\x67\x54\x1c\xdc\xe7\x6b\x40\x4c\x27\x1e\x35\x0a\x67\xc2\xe3\xf3\x43\x38\x0a\x99\x53\x2e\x10\x60\xae\x10\x0e\xf7\xe1\x02\x8e\x0f\x86\x89\x8d\xa5\x15\x9b\x1e\x2c\xe3\x5e\xad\x6b\x64\x08\x1d\x49\x12\x4c\x96\x51\xd7\xd7\x07\x64\xd9\x69\x79\xef\x96\xc8\x1a\x45\x35\x8c\x99\x74\x62\xfc\xdf\xa6\x91\xb0\x4a\x25\x26\xeb\xa8\xb0\xf7\xf5\x67\x74\xa7\x9f\x37\x55\x04\x3b\x49\x09\x2b\x3f\x92\x96\x40\xe1\x40\xca\x60\x66\x38\xbc\x8b\x24\x1e\xb2\xec\x93\xdc\x83\x56\xc5\xd7\xd5\x55\xc6\xfe\xcd\x10\xb3\x2d\x2c\x31\x79\x1f\xb5\xf0\xa2\xbe\xca\x1a\x0a\x5a\x59\xf5\xb6\xb2\x7d\x71\x7c\x16\xb7\x34\xb2\x9b\x28\x39\xba\x81\x49\xd5\x6d\xeb\xf0\x2e\x2a\xf1\xb0\x86\x26\xd7\xa4\x5d\xb9\xff\xb4\x6a\x9a\x5d\xdb\x66\x57\x98\x5c\x44\xcd\x3e\x0b\xb3\x14\x94\x6b\x77\x4b\x04\x4d\x76\xd2\x64\x4b\x5d\x75\xaf\x77\x52\xff\xe7\x66\x70\x63\x4c\xee\x45\xad\xb8\xdb\x5f\xac\x38\x47\x71\x91\x07\x5a\x23\x53\xf2\xf4\x9c\x01\xb7\x63\x2b\x68\x5f\xe0\x33\x7b\x81\x6f\x7a\xe0\x5d\x7c\x6a\xa7\xe8\x7d\x51\xbb\xd3\x1a\x3c\x5c\x7f\xad\xe9\x3c\xe1\x32\x21\xf3\x79\xc2\x12\x92\x6c\x92\x9c\xcc\x93\xbb\x8f\x13\x92\x3c\x7b\x9c\xe4\xe4\x45\x9d\x9b\x57\x71\x82\x4f\x7b\x91\x90\xc4\x24\xbf\x4c\x48\xf2\x9b\xfb\xfb\x20\x21\xc9\x0b\x28\xe2\xc5\x56\x9a\xf7\x95\xf9\xf7\xe5\x96\x9b\x3c\xbc\x30\xcf\xab\xad\xc9\xa7\x84\xc9\xc9\xb4\xcf\x5b\xb0\x0b\x9b\xdd\x3e\xbc\xdc\xf2\xda\x3e\xfd\xc6\x0b\xe9\x9f\x5f\xae\xb6\xca\x3d\x3e\x50\xc2\x3e\xbc\x60\x7a\xab\xcc\xa3\x2d\x08\x0a\x81\x02\xe0\x5b\xf8\x08\xb2\x43\xd6\x24\x87\x0e\xcc\xe7\xc9\x4f\xae\xb1\xa6\x03\x77\xdd\xdf\x9f\xdc\xff\x77\xa1\x13\x24\x79\x9a\x90\xe4\x49\x42\x92\xfb\x50\xf6\x4f\xcc\x74\xe5\x01\x3f\x33\xb9\x99\x29\xef\xee\x46\xc1\xb3\x69\xc6\x4f\xd0\xdd\x9f\xb6\xa5\x49\xdf\x2e\x4d\x09\x7c\x63\xca\x58\x68\x53\x4a\xf5\xde\x94\xc3\x17\xbe\xa4\x2d\x53\x17\xb6\x34\xe5\x1e\x1f\x33\xb5\x58\xd9\x42\x45\x19\x17\xcb\x6d\xb9\x17\xb6\xe0\x6d\xad\x6d\xd9\x9a\x03\x93\x06\x35\x54\xf6\xe9\x49\xf5\xde\x27\xde\xe7\x0b\xfb\x18\x3a\xfc\x3d\x74\xcc\x54\xff\xfd\x3d\xf3\x68\x3b\x65\x23\xf7\x0d\xee\xad\x94\x80\x82\xef\x4a\x59\x0d\xee\x57\x6b\x21\x85\xf9\x74\x4c\xe6\xb7\xc8\xd8\x64\x7c\x7c\xbd\xb8\x7e\x01\xed\x7c\xfc\x78\x50\x90\x81\x7b\x0c\xcf\xa7\xa7\xa7\xa7\x64\xd0\xa4\x98\x6f\x56\xd9\x7a\x3d\x30\x8b\xca\x3c\x64\x75\xdd\x7e\x1e\x7c\x6a\xff\xfa\xf4\xe9\x13\x7c\x75\x39\xd9\x93\xc1\xe5\x78\x9f\x98\x86\x9b\x5f\x83\x2f\x99\xfe\xd2\xa7\x98\x1c\xa3\x84\xc0\x7f\xd3\x84\x24\xff\x27\x21\xc9\x30\x21\xc9\xb1\x69\x43\x42\x92\xd7\x1f\x8b\x6f\xcc\x9f\xed\xc9\xf8\xc6\xd8\x3e\x9c\x4c\xcc\x10\x3e\x61\x66\x2a\x33\xa8\xe2\x0b\xf2\xc5\x17\xe3\xd1\x17\x5f\x7c\x91\x10\xfb\xfc\x7f\xe0\x4b\x76\xd3\xbe\x18\x9b\x0f\xbf\x38\x1d\x27\x39\x49\x5e\xbd\xb8\x9f\x90\xe4\x5a\x62\x9e\x06\xf7\xab\xb2\x34\x33\x7f\xb9\x27\x49\xa9\x55\x42\xfa\xae\x63\x1f\x33\xbd\x1a\x9d\x97\x55\xa5\x10\x3c\x32\x43\x68\x30\x06\xec\xe1\x06\x9b\x63\xa4\xf8\xa6\x64\x0b\x8e\xae\xff\x67\xfe\x9f\x51\xfe\xd5\xeb\xd1\xec\xba\x39\x48\x02\xf4\x5d\x60\x59\x8d\xdc\x09\x81\xec\x66\x93\xec\xeb\xbd\x85\x41\x7e\x53\xb7\x22\xb9\xfe\x58\xc7\x0d\xe8\x61\x5a\x75\x3b\x68\x75\x53\xf9\x9b\xeb\x4b\x33\x76\xe0\x05\x3a\xb5\x7a\x99\xc7\x35\x38\x65\x9e\xa3\xc8\x3d\xdc\xd3\x26\x3e\xaa\x37\xa5\xd0\xc0\x4c\xce\xc7\x36\x40\xbc\xf9\xc0\x10\x9b\x96\x33\xb9\x21\x29\xb4\xc1\xc8\x18\xfc\x5a\x1f\xfa\x6c\x3f\x76\xee\xe3\x00\x48\xcc\x07\x86\x70\x81\xab\xb6\x5e\x71\x9f\x96\x5c\xbb\xd4\xfb\x64\xf4\x57\x44\x87\x3f\xc4\x27\x30\x74\x7c\xfe\xa8\x1e\x3d\x2b\xb7\x8a\x95\xa6\x77\x11\x70\xda\xe3\xba\xe3\x96\x31\x78\x53\xef\x76\xe8\x4d\x3d\xd7\x39\xfd\x7e\x24\x97\x69\x6a\xfe\x1d\x2d\xaa\xf5\xba\x92\xad\x1f\x16\x25\x99\xd7\xbd\x89\x73\x23\xdb\x40\x29\x80\xdd\xf2\xa8\xb6\x7e\x96\x08\x3d\xaa\xe9\xa3\x7a\xb7\xbb\xdc\x43\x9b\x1e\x41\xee\x87\x05\x1d\xe7\x34\xf1\x3f\x12\xf2\xa8\x36\x2f\xef\xb3\x8b\x67\x5c\x89\xaa\xa8\x1f\x54\x6a\xcd\x34\x9d\xe4\x34\xe9\x26\x1e\x66\x7e\xa1\x99\x2c\x58\x59\x49\x4e\x4f\x5a\x1f\x34\x2f\xa2\x8f\x7c\xd9\x37\x6c\xd6\xc3\x52\xe3\xf2\x6e\xba\x4c\x87\x25\x3d\xae\xa4\x5e\xf9\xb2\xbe\xce\x69\x12\x27\xb4\x33\x45\xe5\xdd\x0a\x19\x0f\x4b\x3c\x55\xac\xa6\xdf\xe4\x34\x31\x0f\x3e\x11\x02\x52\xdc\x67\x17\x4f\xcf\x7f\xe3\xfc\x2d\xfd\x36\xa7\x49\x3b\xc9\x67\x34\xcf\x5c\x16\xcf\x99\x5c\x72\xfa\x5d\x4e\x93\x38\xa1\xe9\x9d\xe6\x7e\x68\xc7\xd0\x35\xff\xdb\xe7\x78\x29\xd6\x21\x87\x19\xfd\xe6\x77\x5c\x46\x9c\xeb\xc4\x95\x73\x98\xf3\x09\x88\xcc\xd6\xdd\xaa\xa6\x13\x33\xe0\xad\xa4\x76\x3e\xfb\x6d\x4d\x27\x37\x43\x3e\x97\xe4\xf3\xdd\x03\x6b\xf4\xc5\xc5\xbd\xaa\xe0\x74\x62\xc6\x3c\x4e\xe9\xe6\xb2\x95\xd0\xc9\xad\x28\x9f\x4d\xeb\xe6\x7c\xc2\xd6\x9c\x4e\xbe\x89\xf2\x41\x88\x88\x76\x2e\xc1\x6b\x3a\xf9\xb6\xc9\x23\x78\x68\x97\xf3\x39\xad\x24\x2b\x85\xbe\xa0\x13\x33\xfa\xed\x34\x9f\xb3\xd9\x91\xf4\xc4\x8c\x7f\xf3\x3b\x2c\x82\x8f\x5a\xb1\xfb\x4c\x33\x7a\x62\x86\x3f\xfc\x34\xef\x01\xf3\xd1\x52\x9d\x8f\x86\x43\xf9\xc4\x95\x39\xd5\x61\x09\x25\xfa\x83\x79\x3e\xe7\x1f\x12\x92\xac\x99\x34\x87\xcd\x9f\x35\x4d\xb8\x3c\x7e\xf5\x22\x21\xa7\x35\xbd\x5c\x33\xf5\x96\xab\x2c\x71\x76\xa2\xc9\x9e\x3c\x8c\x52\x1f\xde\x7b\x95\xec\x81\xfb\x79\x19\xb6\xee\xcb\x9a\xbe\x74\x5b\xf7\x65\x3d\x7a\xf1\xe3\xc3\x07\x2f\x61\x87\xc1\x53\x42\x5e\xd6\x26\xf9\xee\xb3\x67\xa7\x4f\xee\xbf\x39\xbd\xfb\xc3\xe9\xf3\x47\x7f\xc0\x96\x6d\x27\xf9\x8c\xf7\x9e\x3e\x7e\x7c\xfa\xc4\x96\xe0\x9e\xcd\x2b\xe8\x95\xa1\xb2\x4f\x6b\xfa\x67\xdd\xd0\xef\xb7\x40\xa8\x3a\x20\xa9\xee\x36\x32\x4d\xdf\x80\x75\x31\x68\x18\x92\x23\x9a\xe0\x3d\x46\x9a\x24\xa7\x1f\x37\x7c\xa1\x79\xe1\x48\xe5\xc3\x62\xa0\xab\xc1\x19\xb7\xf8\x1b\xbc\x48\x30\xe9\x35\x1c\x7c\x5a\xd3\x7f\x3c\x0c\x22\x6a\xfb\xec\x80\x3d\xe5\xa3\x83\x98\xbf\x46\xb2\x69\xc9\xc1\x02\xcf\xc4\x7c\x9c\x67\xa2\xe3\x6f\x22\x67\x6b\x01\x77\xc6\x0a\x67\x2f\x35\x52\x10\xf7\xaf\xb1\x83\xed\x95\x74\x7a\xea\x3b\xd4\x05\xb3\x60\xe2\x29\x7c\x6c\x00\x30\x29\xe5\xce\xa4\x14\xd5\xb4\x24\x25\x95\x71\xe0\xb1\x31\x28\x72\x1c\xcc\x39\x8e\xd0\x92\x26\x53\xde\xc4\x9a\xe0\xc3\x21\xde\x0a\x50\x63\xa9\x39\x9b\xf3\x3c\x27\xe0\x90\x11\xa9\x16\x9f\x3b\x41\x16\xe0\x3f\x2c\x12\x3a\x26\xc1\x94\x73\x12\xd9\x0c\x06\x77\xda\x13\x77\x49\xde\xb8\xd3\x0a\x1b\x76\xfe\x7e\x0d\x81\x4e\x1e\x80\xba\xbe\xb9\x42\xfa\xbb\x06\xf4\xdd\x1f\xac\x16\xdf\xc1\xac\x47\x36\xb9\x75\x0c\xf2\x70\xeb\x66\xea\x7c\xd1\x23\xe3\xc1\xb6\xb0\x7d\xbf\x06\xfc\x05\x67\xbc\x77\xc7\x15\x19\x99\x09\xd6\x6d\x03\xb3\xc3\x29\xe8\x05\x0e\xe0\x78\xc6\xcd\xbc\xc7\x71\xf8\xeb\xae\xdb\xeb\x61\x59\x5d\xbd\xfe\x4c\xcd\xc7\x39\xe5\x19\xba\x2b\xd0\xb3\x9a\x3c\xa9\xcd\x70\x1e\x7c\x46\xe3\xfe\x7d\x3a\xa8\xc6\xc7\xee\xee\x78\x3c\x35\xe6\x30\x0d\x36\x90\x55\x40\xaa\xc3\xe0\x0d\xd6\x25\xc8\x6c\x13\x30\xd5\xb3\xc1\x6c\xf0\x4c\x65\xca\x1a\x49\x44\x86\x6b\x87\xfb\xc4\xfa\x2d\xdd\xba\x19\xe1\x53\x07\xc8\xb8\x1a\x54\x37\xb1\x2a\xf7\x55\xa7\x03\x7c\xae\x47\xbd\xf5\x1f\xf4\xc8\x34\xe7\xf6\x78\xf6\x5f\x95\x45\x86\x74\xd7\xea\x76\xe8\xfb\x3b\x93\x28\xea\xfd\xbb\xba\x13\xdb\xfe\x9b\x31\xc4\xb6\xbf\x33\x01\xe7\xe2\xdf\x6a\x3a\x26\x7f\xd4\x74\xdc\x10\xa8\x9f\x7a\x6e\x46\x41\x63\x62\x2f\x2b\x49\xd9\x76\x1c\x37\xdf\xd6\x8d\x8a\x39\x0a\x1a\x58\x81\x46\x1c\x38\xc4\xee\x34\x54\xb1\x1d\xed\x70\x58\xe7\x21\x16\xc3\x5c\xe7\x70\x51\xa0\x41\x53\x23\x01\xcc\x2b\x5c\x33\x77\x95\xd5\x15\xae\x3f\x08\xbd\x58\xa1\x49\x6a\x4a\x64\x35\x1f\x8c\x33\xef\xde\x78\xad\x46\x95\xa5\xc0\x05\xd9\x46\xb7\xa7\x10\xbc\x83\x2e\x08\xa3\xe7\xe0\x0e\x81\x31\x59\x40\x20\x3b\x54\x50\x41\xb6\x94\xe1\x0c\x15\xd4\xdd\xc6\x03\xe5\x5a\xe4\x8d\x89\xf5\x36\xba\x41\x82\x0a\xb6\xa6\x90\x2d\x51\x73\x9e\x93\x22\xb2\x3f\x16\xd4\xad\xd3\x38\xe4\x5e\x0f\xf4\x88\x68\x0a\x7c\x55\x03\xd0\x75\x64\x84\x08\x73\x21\x9c\x27\x07\xb8\xde\x12\x35\x17\x23\x26\x17\xab\x4a\x3d\x2c\x3e\xe6\x78\xbf\xb7\x98\xed\xd0\xf9\x49\xe6\xf5\x80\x76\x54\xc9\xc6\x0f\xef\xaf\x0c\x49\xf2\x54\xa3\xca\xcc\x7c\x0b\xde\x9f\xac\xc8\xc6\xad\x58\x5b\x52\x61\x6d\x69\xb3\x03\x1e\xfe\x95\x04\x8c\x20\x5d\x0d\x0a\xae\xb9\x5a\x0b\xc9\x81\x7f\x37\x1d\x19\x54\xe7\x83\xf5\x56\x33\xcd\x07\x66\x47\x31\xab\xc6\xab\x94\xe1\xea\xab\x7d\xf2\x97\x9b\x44\x37\x5d\x7e\xb2\x1e\xd6\x59\x7b\x19\x10\x71\xb0\x1e\x44\x0e\xce\x5d\x10\x2a\x41\x08\xb0\xd3\x34\x63\x14\xf5\xfa\xd4\x97\xc2\x7c\x29\xe5\x41\x29\xa5\x2f\xc5\xba\x03\x4a\xc2\x9c\xb9\xa8\x6a\xd9\x5d\xff\x52\xff\x0b\xd0\xe4\xd6\x2d\x8a\x9a\x33\x8b\x9a\x3c\x1c\x5a\x3f\x80\x32\x95\x3e\xf8\x54\x92\x4c\x1b\x20\x62\x36\x9c\x4c\xcb\xdb\x94\x0d\xeb\x18\x86\x98\x41\xdb\x7a\xf7\x08\xc3\x72\x48\xd9\xf4\xca\xc5\x0f\x61\x6a\xd9\xed\xb1\xc9\x76\x17\xf1\xb9\x38\xf6\x56\x14\x41\x27\xc7\xee\xdc\xb9\x73\x32\x75\x83\x7e\x23\x65\x6e\xd8\x27\x59\x53\xf9\x70\x58\xe6\xa4\xf2\x0f\x8b\x26\xce\xe7\xf4\xa0\x41\x8b\x59\xf0\x83\x86\xab\x2e\x58\x3d\x0b\xf0\x26\xac\x70\x06\xf1\xd4\x16\x10\x50\x42\x12\x9b\xab\x82\xed\x10\xcd\x94\xdf\x9c\x85\xa5\x0c\x8d\x25\x8d\xf2\x36\xaa\x05\x91\xad\x2f\x4e\xb2\xdf\xcd\x94\xc0\x56\xaa\x31\xe1\x9d\xd7\x37\xb2\x9f\xe3\xd7\xe6\x1c\xdd\xef\xf7\xfb\x56\x44\x62\x05\x66\x32\xb0\x0b\xef\x8c\xd3\xd4\x87\xd8\x6e\xc8\x2f\x7c\x2d\xcd\x50\xe1\x29\x9f\xab\x2b\x48\xf1\xed\x71\x9a\x42\x65\xca\x55\xc3\x86\x34\x36\x2d\xff\x39\x22\x9b\x76\xfa\xc5\x9c\x5f\x45\xd6\x1b\x92\x10\x2e\x28\x7f\xab\xa7\xd2\xd4\x81\x3e\xf7\x21\xfd\xaf\x24\x8c\x1e\x4f\x30\x81\x95\x6a\x18\x84\x2d\x98\x91\xcd\xa5\xa1\x0d\x2d\x83\x98\xdf\x7b\xe8\x78\x9b\xeb\xf4\x8c\x8a\x19\xca\x3a\x5c\x1e\x59\x8a\x05\x37\x4a\xca\xd3\x57\xc7\x63\xf8\xe5\x73\x79\x68\xa2\x1e\x9f\x67\x1f\x0c\xc7\x81\x36\x4c\xd5\xfc\xa1\xd4\x48\x93\xc9\x18\x10\x06\x3f\xd6\x86\xed\xe9\x5e\x13\x88\x99\xc8\x92\x4a\xaf\xb8\x4a\xf6\x88\x93\xa7\x35\x9e\x1e\x36\x4a\x60\x62\x5b\x64\x28\x28\xe4\xb5\xe4\x14\x1d\x66\x75\xef\xb1\x5b\x28\x7b\xb7\xf2\xae\xce\xe8\xb4\xa6\xb6\x7c\xc7\x1f\xec\xe1\xd0\x86\xd8\x71\x35\x18\xf9\x39\x58\x50\x5d\x79\xf3\x23\x75\xf5\x24\x05\x0e\x18\xca\xfa\xaf\x24\x61\xae\xa3\xcb\xdb\x39\x8f\xc8\xf8\x54\x38\x5a\xcf\x3d\xad\x87\xf9\x6c\xdd\x6a\x87\xaa\x1d\x3a\xa5\x6b\x58\x3b\xa2\x6b\x63\x5d\x62\x6f\xf0\xe6\xa2\x1b\x7d\x5d\xf6\xa0\xfe\x0b\x2a\x5d\x94\x13\xd1\x60\xf0\x69\xfa\x54\xb7\xce\x23\x9d\xa6\x1f\xfc\xe5\x89\xf6\x36\x0d\x95\xdf\x7e\xff\x15\x5d\x62\xca\xab\x36\x2c\x2d\xb4\x01\x60\xb7\x8f\x27\x0d\xbb\xe1\xd6\x8e\xa0\xe3\x60\x1a\xe3\xf8\xa3\x69\x00\x36\x94\xe1\xb2\x72\x2e\xf3\xec\x5a\x64\x6b\x69\x91\x50\x44\x20\xce\x31\x61\x16\xc3\x61\x58\x6d\xe5\x9d\xf1\x8c\xcf\xcb\x3c\xf3\x6c\xbb\x8d\x71\x63\xa8\x4e\x6e\x29\xde\x7f\xcb\x9c\x70\x4c\x18\x6a\x6e\xb8\x6c\x7c\x6e\x6f\xa3\x67\xe6\x12\x96\xdb\xa6\xda\xc0\x5d\x94\x7f\x8a\x3f\x09\x1b\x02\xb6\x9d\x19\x79\x4e\xc5\x34\xe0\xa5\x60\xf7\x4d\xe0\xeb\x90\xe3\x2e\xc1\x0e\xcb\x43\x05\xa9\x8a\x5e\x7f\xbd\x3d\x3f\x3f\x2f\xd0\xeb\x62\x88\xb3\xd9\xeb\xe2\x2b\xfb\xfb\xfa\x52\x10\xd1\x7e\xeb\x5e\x10\x59\xd1\xeb\xff\x79\x5d\x7f\x85\x6c\xc2\xeb\x62\x18\x7d\x87\x5f\xd7\x5f\x11\xf3\xd2\xc6\x23\xdc\x6d\x40\x40\x87\xd4\xeb\x84\x85\x02\x5f\x5f\x9f\xbd\xfe\xca\x94\x9a\x45\x25\x2f\x05\x29\xa3\x2a\xaf\xcf\xe6\x5f\x7c\x95\xf7\xb4\xab\x86\x4c\xa7\x5f\x8f\xc7\xd7\x97\xcd\xf4\x56\xd5\x55\x17\x46\x10\xea\x48\x10\xe7\xb7\xe1\x0c\x44\xeb\xdb\xb7\xbd\x48\x4e\x16\xf4\x17\x8d\xf0\x94\x53\x4a\x17\x10\x6d\xd3\x9e\xd8\xde\xea\x27\x4d\x51\xb5\xa3\x07\x92\x3a\x60\x45\xb9\x37\x4e\x1c\x6f\xa9\x6e\x1b\x9c\x79\x95\xa6\xe8\x37\x45\x01\x28\x0c\xf1\xca\xf0\x78\x76\x6d\x54\xc1\x7e\x6d\x96\x24\x19\x6b\x1c\xe2\x81\xcf\xaf\x49\x39\xbb\x71\xe2\xfc\x4d\x42\x26\xd7\x8b\xe7\x35\x52\x6d\x70\x0c\x11\x8b\x50\x3f\x6b\x54\xc4\x2e\xfe\x8b\x34\xe5\xf6\x4f\x3f\x65\x3e\x94\x9f\x82\x24\x10\x09\x4c\xbd\x39\xe9\xdc\xe2\x6b\xe4\x38\x43\x5d\x4b\x34\x7d\x64\x98\xcb\x37\x16\x62\x9e\x24\x94\x26\x78\x7f\x60\x71\x45\x8e\xc6\x5e\xf3\x00\x38\x92\x26\x79\xb0\xe2\x8a\x27\x21\xf4\x0f\x78\x8b\x2c\xc8\x16\x93\x22\x32\x54\xb9\x72\xc6\x4b\x07\x7e\xa9\x2a\x4c\x2a\x1a\x56\x06\x23\x82\xd4\x76\x7f\x95\xc0\x31\xd4\x69\xba\xad\xc0\xc2\xbb\x72\x1e\x67\xd2\x46\x00\x92\xed\xc0\x3f\xdb\xaa\xff\x2e\xd4\x6f\x37\x52\xd3\x72\x38\x99\xba\x1d\x1f\x89\x66\x5e\x3e\x29\x87\x27\x64\x11\x14\xdd\xca\x8b\x0b\x2e\xa0\x92\xbd\xa4\x1f\x4f\xb7\xb7\x17\xc1\x99\x2f\x0e\xe2\xb3\x98\x6f\x6d\x10\x9f\x74\xdb\x9c\x7d\x72\x18\xce\x3d\x6e\xce\x3d\x5f\xfb\xf1\xe4\x58\x61\x52\xec\xe8\xaa\x42\xca\x12\xcf\x24\xb1\x4c\x7e\x50\x24\x34\xc8\x7a\x36\xa8\xe2\xed\xdb\x27\x3b\x24\x66\x93\x0c\x8e\xcf\x90\x11\x6c\xa5\xb4\xe1\x64\x0b\xa2\xe7\x75\xde\xa8\x1a\xaa\x78\x1e\x56\x55\x6c\x0e\x73\xfb\x36\x5c\x50\xac\x85\x59\x04\x37\xe2\x6b\xee\x4d\x15\x60\xc1\x80\x38\x27\x09\x91\x74\x4c\x58\x70\x94\x71\x6b\x15\x71\xca\xaa\x11\xff\xc8\x17\x48\x63\x3c\xc5\x0c\xe4\x7f\x4a\xe9\x5f\x8e\x06\x7c\x75\xed\x52\xed\xed\xf3\x5f\xc0\xc7\x38\x55\x03\x14\x85\x33\x24\x86\x34\xf6\x18\x91\x5e\xbb\x31\x34\xe5\x78\xfa\x4d\x14\x44\x40\x32\xdf\x8c\x1b\xa3\xdf\xe6\x4b\x24\x5b\xa2\xf4\x79\xd5\x67\x83\x38\x0e\xee\xf0\x36\x4e\xb6\x0d\xcc\x46\x7a\x8f\xeb\xcc\x85\x23\xf5\xfe\x63\xe1\x50\xce\x18\x01\x7e\x21\x9b\xe7\xc4\x1e\xca\xe6\xc9\x1e\x43\xe6\xc9\x32\x5e\xd9\x3c\xdf\x4f\x0f\x37\x98\x9d\xa9\x55\x85\xf8\x68\xcd\x84\x74\x46\x6b\x98\x9c\x90\xe3\xc9\x71\x2b\x8d\xc0\x34\x9f\xe0\x3d\x86\x38\x65\xac\x6b\x50\x14\x29\x8d\x82\x9e\x23\xb8\xde\x85\x24\xaa\x32\xe1\xfc\x3a\xd4\x1e\xdc\xf1\xea\x66\x99\x4b\xfb\xa6\x89\xf0\xbf\x30\x23\x74\xbb\xf2\xab\x7a\x11\xcb\x23\xd5\x7c\x91\x93\xe2\x30\x5c\xe4\x67\x82\xc1\x46\xd2\x4b\xe4\x77\x14\xb6\x44\xe1\xd7\xf7\xf1\x64\x6a\xf2\xd3\xbf\x5e\x7f\xbc\xb1\x38\x3a\x3e\xb6\x6b\xa5\x59\x35\xc7\xc7\xaf\x3f\xde\xe0\x7f\xed\xf7\x25\x7d\x5f\x01\xa5\x75\x33\x6b\x19\x37\xd3\x30\xe6\xe0\x7c\x13\x4c\x0a\xbc\x2b\xfb\x62\x60\xfa\xed\x44\x26\x76\x68\x6f\x40\x60\xe5\xb2\xe5\xd1\xb6\xac\x62\x9d\x97\x99\x56\xcf\xa0\x08\x3a\x31\xcb\x3f\xa0\x14\xae\x2b\x80\x30\xf0\x7a\x53\x59\x1d\x4c\x8f\x5f\xa3\x34\xb1\x87\x2b\x98\xdc\xcf\xc6\xe6\x80\xa0\x0d\x2d\xf0\xcb\x77\x82\x0d\x55\x20\x49\xb2\xc7\x78\xda\x0e\x53\xc3\x9a\xa8\x3c\xce\x44\x67\x5e\x0e\x87\xf9\x48\x2b\xb1\x46\x78\x3a\x71\x36\x79\x71\x73\xae\x9b\x33\x7d\x96\x51\x3c\x43\xaf\x3f\x0c\xcd\x79\x7e\x9d\x24\xd7\x26\x09\x6e\x94\x92\x10\x96\xd7\x02\x7a\x07\x06\x6b\x5d\x21\x5b\x36\x9e\xf2\xe0\x86\x1e\xf2\xfb\xb8\x6e\x9e\x1e\xd9\x3d\x24\x48\xb4\x68\x33\xe9\xf6\x06\xb7\x6e\x62\x75\xa6\x22\xc6\x6f\x5d\x05\xd4\x6c\x77\x27\xe8\xb9\xbf\x30\xb0\x66\xbc\x89\xf3\x43\xb8\x3e\xbf\xdc\xe7\xd7\x97\x56\xbd\x04\x63\x22\x47\x25\xab\xad\xc5\xbe\x11\xbd\xa9\xf4\x64\x27\x0a\x6c\xc7\x1a\xbf\xff\x64\x9f\x50\xca\xe6\xe3\xdc\x82\x5d\x3a\xb6\x6c\x4c\x69\x97\x2b\x54\x2d\x02\x04\xc2\xa4\xac\x46\x9a\xd7\x1a\x29\x3c\x73\x10\x99\x4b\x43\xa0\x71\x26\x42\xb4\x73\x4e\xe5\x70\xe2\x84\x4a\xeb\x56\xfb\x2f\xca\xed\x7e\xee\x06\x35\xb9\x4c\x02\x22\x64\xd9\xfe\xaa\xa1\x76\x3e\xce\x73\x4c\xe8\xde\x57\x57\x5b\xd4\x18\x02\x65\xfe\x81\x5d\xcb\x9d\x94\xe3\xdd\xe6\xbd\x44\xe1\x58\x1b\x93\x60\x69\x58\x08\x7a\xeb\x65\x48\x9b\x10\x31\x2f\xbf\x09\xf4\xa7\xe1\x8e\x46\x4b\xae\x1f\x4a\xc3\x5e\x54\xc5\xc5\xa9\xbd\x66\x31\xcd\x5b\xd1\x0b\x89\xb6\x78\xb7\xdb\xfa\xa6\xaf\x66\x17\x4d\x3b\x2b\xb2\x20\x05\x59\x81\xa1\xe4\x18\x67\xe3\xc8\x8a\xe8\xa0\x33\x36\xb3\x5d\xf8\x5b\x3a\x26\x2b\x5a\x8f\x9a\x08\xf7\xf6\x1c\x6a\xc2\x55\x39\xe6\x51\x05\xe6\xd1\x89\xa9\xab\x91\xac\x0a\xfe\xb2\x11\x55\x9f\x54\x05\x1f\x79\xf4\xd8\x27\x4f\xef\x9f\x66\x1e\x1c\x60\x45\xce\xe9\x66\xa4\xd9\xf2\x09\x5b\xf3\xf6\x25\x89\x59\x52\xf5\x81\xbb\xca\x39\xc6\x97\x77\x0d\x57\x72\x5a\x93\x73\x88\x06\x4c\x82\xae\x84\x9e\xbb\x31\x5b\xd2\x0d\xd8\xdd\x43\x84\xc9\xba\x43\x41\x97\xbd\x14\x74\x39\x12\x9a\xaf\x2d\x8e\xbb\x8d\xbc\xd4\x69\x8d\xc3\xa8\x6f\x78\xa7\x59\x71\xd0\x38\x85\x81\x65\x2a\x3d\xa0\xbd\x21\x9d\x50\x16\x19\x93\x4a\xce\x55\x3e\xfb\x5d\x64\x0b\x78\xd0\x32\xb3\x96\x71\x2f\x2a\x70\x2a\xe2\x78\xbf\xa5\x07\x13\xb2\x22\xb5\x99\x90\xe1\x04\xef\xb6\xe4\xac\x42\x8c\xd4\xa4\xc0\xb1\xae\x11\x86\xf6\xe5\xe9\xef\xad\x71\x5d\xd2\x15\x38\x08\xde\xb3\xc8\x99\x10\xb1\x73\x4d\x97\x4d\xdb\xa7\x30\x84\xc0\x8a\xad\x0d\xdf\xbc\xb4\x23\x19\x6a\x20\x6b\xb0\x77\x84\xbe\x2c\x49\xdd\x62\xfc\x76\xdb\x96\xee\x07\x1a\xe0\x38\xfc\xb8\x0d\xef\xa9\x70\x6c\xca\x41\x5b\xac\xad\x55\xcc\xc1\x05\x02\xfd\xde\x30\x1d\x93\x31\xce\x6d\x0b\x1f\xd6\x24\x49\x6c\xdb\x80\xc5\xb0\xeb\x19\xdc\x03\xee\x85\xd1\xd8\xaf\xe8\x0a\x1c\xbf\x5f\x88\xb3\x52\xc8\x65\x80\xab\x8c\x0c\xcf\x82\xd0\x3e\xb6\xda\x8b\x86\xd9\x6b\xac\xcd\xba\x79\xbc\x8c\xfa\x5f\x1e\x82\x7f\xf0\xf8\xa2\xee\x6e\x15\x6b\x29\x1b\x6d\x71\x7c\x23\x65\xa9\x0f\x91\x57\x1d\x57\x63\xeb\xa4\xb0\x53\xb7\x6f\x4f\xf6\x68\x0c\x45\xc5\x51\x66\xab\xee\x71\x7a\xfb\xf6\x64\x37\x21\xca\xae\x2a\x27\xb5\x7a\x30\xfd\x5f\x8d\xe8\x37\x77\x92\xe7\x68\x38\xb3\x0f\x33\xfc\x3a\xbf\x4e\xde\x5c\xf9\x6e\x87\x22\xa9\xd3\x09\x9d\x4e\x5c\xbd\xbe\x24\x3f\x56\xf4\x3a\xba\x7c\x5d\x7f\x85\xd1\xaf\x77\x9f\xbf\x41\xcf\x1e\xbd\x7a\x7e\xf7\xd1\xee\xc5\xe9\xa3\xd3\x7b\x2f\x31\x7a\x63\x24\xd0\x19\x46\x46\x84\x35\xd9\x3f\x54\xf4\xfa\x25\x9a\xdf\x3d\xfe\x73\x7c\xfc\xdd\x9b\x7c\x88\xf7\xd7\x97\xe4\x71\x90\x5b\x1f\x4e\xbe\x7d\xf2\xe6\xf4\xf7\x67\x6f\xd0\xc3\x7b\xaf\xfc\xc7\x5e\x76\x25\x8f\x4c\xbe\xeb\xaf\xbf\xba\x4e\x3e\x9a\xa7\x62\xf8\x3a\x03\xd9\xfa\x7a\x23\xc7\xfe\xe9\x06\x84\x1e\x4f\x1a\x8e\xcc\x59\xa3\x3a\x4f\x56\xf0\xe5\x07\xac\x28\xe1\x91\xa3\x38\x26\xb5\x95\x62\x0f\x4c\x55\xbb\x8c\x4b\x57\x88\x31\x5f\x91\xda\x90\x75\x4f\xe0\xe7\x79\x3e\xed\xaa\xf0\x7a\xb1\xdf\x41\x93\xa5\xf7\x28\xd8\xce\x5b\x1e\x7f\xda\xba\x98\xb3\x3a\xb0\xbf\xb2\x6b\x97\xdc\x33\xed\x78\x78\x32\xe4\xb1\xdd\x92\x13\xa3\x0c\xeb\x59\x73\xa6\x16\x2b\x24\xf9\x87\xc1\x73\xbe\x3c\xfd\xb8\x41\x8e\xed\x7f\xfd\xfa\xfa\xeb\xd7\x5f\xbd\x36\xf3\x17\x17\x15\x4e\x33\x53\x75\x74\xcc\x01\x44\x26\xf8\x33\x46\x72\x75\xaf\x15\x93\xe7\x71\xea\x8a\x24\x03\x23\xa0\x4a\xec\x04\xb5\xb2\xc2\x1d\x01\xad\x68\x09\x68\x96\x8f\x2b\x9c\x78\x66\x61\x30\xb6\xb8\x61\x71\xd7\x15\x12\x78\xda\x86\x5f\x66\x2d\xf8\x65\x2b\x06\x32\x1f\x3b\x17\x4a\x10\x51\x18\x80\x62\xea\x85\x37\x90\x76\x4b\xb2\x98\x8f\x73\x38\xc5\x94\x21\xa8\x91\xfe\x59\xd0\x62\x1a\x79\x48\x1e\x35\xd7\x3e\x9f\xb9\x5f\x01\xaa\x34\x78\x78\xef\xd5\x80\x7f\xdc\x28\x5e\x43\x04\x05\x01\x31\x1c\xe4\x3e\x19\xac\x79\x5d\xb3\x25\x1f\xfd\x65\x3a\x01\xc4\xa9\x02\xdf\xb3\x2a\x6a\x8b\x22\x40\xc1\x8e\xc6\x38\x5c\x21\xef\x5b\xf0\xfe\x37\xbf\x01\x97\x81\xc8\xe1\x7d\x6c\x8e\x20\xd4\x4a\xe2\x20\x7c\x92\x93\xf1\xd0\x5a\xae\x8c\x02\xbd\x14\x31\xeb\x32\x3b\xc9\x26\x18\x3b\x47\x87\xc5\xc8\x86\xd0\x02\x93\x6a\x58\xc5\x46\xa6\x6f\xd5\x0d\x37\xa8\xb6\x99\x78\xba\x08\x41\xb7\xe6\x39\x7c\xc3\xc1\x94\x75\xbf\x6f\x62\x6f\x5f\x3a\xf9\xab\xf6\x42\x57\x05\xd6\xfe\x4e\x0c\xaa\x67\xe3\xac\xf6\x8a\x02\x38\xbd\x54\x1c\x53\xc8\x41\xa5\x91\x05\x2d\x04\x12\xa4\x06\xbf\xce\x5b\xb9\x55\x38\xd4\x86\x57\x43\x9f\x41\x86\x82\x8b\xcf\x7f\xe9\x4e\x63\x03\x68\x72\x53\x59\x45\x51\x99\x36\x1a\x28\x4c\x69\xac\x8f\x5a\xb8\xb7\x1d\xcd\x95\xcd\xd4\x4e\x24\x05\x2d\xef\xdc\xb9\xe3\x95\x62\xce\x73\x40\xcf\x8b\x20\x05\x6e\xe1\xc4\x34\x29\xb4\x9a\xc9\x0e\xea\x5b\x8d\x33\xb8\x46\xad\x31\xa0\x0f\xb9\xb3\x42\xa5\x29\x5c\x5b\x2a\xb2\xb5\x4e\x60\xfb\x3d\x46\x92\x54\xee\x63\xb2\x20\x75\x9a\x7e\x9b\xd6\x20\x36\xcf\xe4\xdc\x8d\xae\x75\x46\xc6\xa4\xe6\xa8\x65\x2e\x7d\x5a\x21\x7c\x69\x12\x63\xb5\xc2\xc3\x70\x82\xfc\x19\x74\xe6\x26\x63\x04\xcf\x56\x5d\x81\x5b\xa0\xd3\x14\xfd\x56\xef\x68\xac\xb4\xf8\xa3\x26\x37\x26\x18\x93\x3f\xea\xe1\x70\x8f\xde\x3b\xe3\x6d\x30\x99\xd6\x18\x93\x97\x55\x04\xee\x56\x75\x62\xe0\x06\xbf\xe8\x3f\xea\x46\xbd\x1d\xe4\x69\x95\x4f\xdd\xb5\xdf\xa1\x61\x4b\x26\x1c\x6f\x0c\x06\xeb\xc7\x7f\xd4\xc7\x13\xf2\x5b\x8d\xf7\xe1\xda\x7c\x6f\x8d\xbf\xad\x25\xf9\xf0\x24\x1e\x95\xb7\xd0\x6d\x7a\xb9\xef\x0f\x08\x61\xd2\x9d\x9a\xcf\xec\x9b\x5f\x9d\x1c\xa2\x23\x4f\xc7\xcb\x3d\xe1\x74\x3e\xce\xa7\x8a\xaa\x40\x0e\xdf\x54\xc4\xba\xc7\x40\xb4\x07\x47\xd1\xc4\x6e\x27\x49\x49\xf5\x9c\x41\x1c\x3b\xb8\x87\x74\xab\x74\xb7\x43\xcc\x5b\x72\xee\x12\x1c\x87\x92\x8b\x8c\x3e\x2c\x83\xf6\xb1\x02\x2e\x74\xd6\x88\xad\x8e\x2b\xca\xc6\x44\xd0\x47\xa1\x89\xd3\xd2\x32\x05\x73\xd3\x10\x9d\x43\xa4\x86\x39\xcb\x69\x89\xc9\x91\xaf\xf7\x90\xbe\x89\xc9\xb7\xe6\x38\xa8\xb5\x0b\xba\x95\x0d\xb6\x12\xea\xe5\xc5\x00\xfa\xb6\xaa\xca\x82\xab\xc1\xf1\xe0\xda\x25\xdb\xff\xd5\x60\x1a\xf2\x39\x0f\xe8\x6b\xb9\x47\x12\xe8\x30\xd7\x65\xcc\x5c\x9b\xee\xcf\x75\x6e\xd5\x53\x35\xbe\xac\xa8\xf6\x97\x41\xa6\xc8\xb9\x91\x4b\xb6\x39\x2d\xe7\x55\xb8\x20\x28\x66\xdc\xca\x8d\x59\xed\xf4\xb2\x41\x3e\x2a\x61\xf8\x16\x1c\x55\x64\x82\xc9\x76\x1f\xf4\x74\x0e\x16\xfb\x2d\xbf\xa8\x11\xc7\x41\x7e\x46\xf1\x74\xfd\x58\x11\xc7\x3e\x5a\x65\x28\xbd\xc3\xbb\xcc\xbb\xc0\xb3\xbf\xae\x5d\xaa\xfd\xb5\x4b\x3e\x17\xf9\xfe\xda\x65\xb9\xff\x2b\x03\x79\xa0\x29\xe6\x83\x2d\xa6\xef\x73\x85\x67\x7c\xae\xf2\xee\x17\x8f\xc3\x17\x36\xb8\xc4\xc1\x57\x91\xf9\x8a\xd9\x03\x46\x5c\x17\xff\xab\xb9\x33\xe7\x94\x99\x33\xbd\x1f\x7c\x10\x7a\x35\x78\xcb\x2f\xb2\x81\xe9\xd0\x5f\x91\x48\xeb\xce\x84\xa0\xe2\xdc\x63\x70\x29\xd6\x2d\xf8\xe1\x67\x2d\xc6\x16\x40\xf5\x00\xa2\xb8\xeb\x86\xd8\xf1\x6f\xd4\x31\x41\x36\x65\x18\x0a\x1c\x5c\x5b\xa2\x93\x27\xa0\x8d\x80\xdf\x85\x73\xfb\x2c\x01\x59\x27\x8b\x42\x78\x61\x52\xd1\xdf\x59\xa3\x30\x59\x58\x48\xc5\x82\x4e\xc6\x37\xbf\xfd\xfa\x9b\xaf\xd3\x45\x88\x91\x02\x3a\x0a\x5e\x03\x06\x77\xdb\x35\x94\xac\xe8\x41\xb6\x3b\x77\x4e\xc6\x71\xec\x37\x1f\xf7\xad\xb9\x86\xe3\x1f\x06\x7f\x72\x08\xa6\xfc\xa6\xc4\x64\x43\xef\x57\x00\x5d\x2c\x67\x45\x56\x0c\x57\x64\x8b\xa7\xc0\xdc\x6d\x66\xe8\x1a\x47\x3f\x70\xb4\x20\x25\x06\x65\x1f\x79\x52\x59\x8f\x9e\xa0\x48\x75\x0b\xb8\xc6\xa4\xdb\xb4\xe1\x30\x4e\x3a\x95\xc5\x70\x48\x64\x9a\xa2\x83\xf6\x0e\x5d\x8f\x6f\x05\x8d\xbf\x30\xdb\xc1\x87\x23\xcc\x90\x9a\x6f\x72\x2a\x48\x09\x7f\x5a\x7c\x4f\x68\xba\x6d\x36\x39\x0f\xbf\x4d\x0a\x26\x4b\xba\x01\x9f\x60\x53\x02\x59\xd3\x73\xf7\xe3\xdc\xde\x8d\xa7\xe9\xd1\x7a\xb7\x3b\x32\x7f\x97\xf8\xb2\xd3\xd5\x1e\xb6\xb1\xc7\x73\xd9\x8e\xa4\xd9\x7a\x6f\x1a\x63\x2c\x66\x07\xdc\x30\xd4\x4e\x7f\x44\x39\x61\x4d\xc4\x73\x1f\x07\xd0\x90\xf7\xe7\x95\x85\x5c\x4d\xd3\x23\x85\x09\xdb\x23\x39\xfb\xbb\xca\x1e\x54\xc4\x6b\x7f\x00\x8f\xb5\xc2\x53\xd3\xcc\x35\x18\x2d\x9d\xe7\x61\x04\x5d\xd0\x26\x5a\x1c\xcc\x0c\x19\xff\x3f\x9a\x9b\x22\xcc\x4d\xe1\x6e\x67\x5d\xcd\x9b\x3b\xc7\x93\xd9\x26\x3b\x37\x5d\x52\x73\x39\x3b\xcf\x36\x60\x9c\x21\x53\xc3\xd4\x42\xfb\x05\x74\x01\x7a\x70\x38\x18\xc3\x61\x7c\xad\xfb\xa4\xea\xb1\x0f\x2b\x9d\xd9\x80\xec\xf3\xa3\x3d\x3a\x6a\xa2\x48\x81\x54\x12\x66\x09\xf1\x28\xbc\x14\xc7\x51\x2c\x88\x28\x84\x1f\xb8\x43\xc6\xb7\x3b\x2e\x7a\xe8\x8f\x55\xf5\xb6\x86\x30\xef\x71\x02\x9d\xdb\xb8\x6d\xa6\x57\xbc\xbd\xbf\x34\x2d\x83\xe0\xa3\xdc\x4e\xd2\xb3\xd2\xcb\xca\x73\x41\x58\x8e\xb3\x12\x60\xf2\x9a\xab\x16\x3b\x94\x21\x17\x6b\xdd\x71\x3f\xaf\x3a\x72\xb5\x45\x91\xea\x19\x42\xa2\xe3\xe8\x8a\x1c\x1f\x4f\x22\x9b\xce\x68\x48\x1b\x38\x3e\x35\x95\xb7\x05\xe0\xf0\x19\x02\x3e\x97\xe6\x30\xd3\x01\x5a\x6f\xea\x65\xbd\xc8\xf0\x33\x2a\xc6\x65\xfb\xa1\xb2\x61\x5a\xa1\x6a\xd2\x0a\x83\xff\x77\xcf\x3c\x36\x79\x9d\x36\xd6\x87\x79\xed\x2c\xeb\x66\x44\xfb\xde\xf6\xf4\x9f\x70\xaa\x15\x52\x16\x7c\xa3\xf7\x1b\xcb\xbf\x0b\x3c\x65\x94\x07\x57\x61\x8d\xc9\x0f\x95\x95\x15\x23\xcb\xda\xa9\x6a\x78\x70\x35\x1c\x62\xe6\xc6\x74\xae\xf2\x00\xbe\x31\xcf\xc3\x97\x7e\xef\x47\x86\xaa\x55\x17\x49\x0b\x10\x3e\xe3\x32\xdd\x0e\x35\x6d\x30\xc5\xa2\x46\xa0\x8d\x2c\x41\x3f\x59\x16\x6f\x9e\x37\xd3\x4f\xef\x5c\xaa\x26\x82\xd6\x73\x1b\xc8\x4b\x51\x90\x7b\xe9\x9d\xab\xae\x76\xde\x39\x3f\xc0\x03\x2d\x41\x33\x35\x10\x47\x6a\xfa\xac\x32\x25\x59\x0f\x78\x31\x3a\x2b\xb7\x7c\xa3\x84\xd4\x44\x82\xb3\xe1\xb3\x0a\xf1\x2b\xde\x1a\x1e\xdf\x7c\x3a\x13\x48\xe3\x0c\x8e\x5d\x17\x53\xe5\xfb\xea\xd2\xc7\x72\xaf\x68\x22\x97\x21\xa0\x54\xe2\x02\xce\x5f\xab\x2e\x5d\x40\xb2\xf0\xea\x41\x88\xb4\x77\x69\x59\x85\x3e\xe7\x28\x1f\x82\xbe\x1a\x84\xf5\x30\x70\x51\xbe\x06\xe7\xd5\x56\x16\x71\xb0\xc6\xd1\xe0\xbe\x28\x06\x17\xd5\x16\xc2\x02\x0a\x6d\xc4\xe0\xff\xfb\xc4\xc5\xac\x85\xc8\x30\x17\x4d\xa4\xab\x59\xc3\x59\xf0\xf9\xab\x2a\xa7\x9a\x70\x80\xd5\x04\x9b\xd6\x77\x55\x27\x16\x5a\x73\xaf\x1a\x22\x93\x5d\xab\xba\x41\xc4\x7e\xab\xd0\x68\x34\xd2\xf8\x32\x82\xe8\xab\xda\x90\x61\xfc\xc3\xe0\x97\x0a\xb9\xa0\x20\x5e\xf7\xf5\x53\xe4\xf3\x1a\xb2\xfe\x51\xd9\x10\x0b\xd7\xc0\xb8\x00\xf6\xd2\x2f\xdd\x56\xc1\xe7\x9d\x40\x36\x92\x01\xd5\xb7\x2a\x76\xaa\xa3\x58\x6b\x87\x71\xd0\x7e\x3a\xe8\xc2\xcf\xd5\x55\xa1\x69\x7e\xa9\x66\xba\x5d\x78\xa6\xdd\xf4\xff\x5e\x5d\xc2\xa8\xe9\xc5\x95\xa3\x76\x58\xb7\xc9\xc8\x17\x46\xe6\xd9\x37\xce\x1b\x7c\x11\x8f\x84\x27\x10\x16\xe6\x9d\x3e\xd7\x30\x22\x6e\x9b\x37\x41\x14\xfb\x54\x3f\x46\xe6\xde\xa3\x8d\x06\x1b\xf3\x4c\xbb\x01\x54\x57\x37\xf0\x9f\x43\xcc\xa9\xaa\xd2\xed\x18\x73\x80\xab\x15\x3a\x00\x45\x8a\x45\xef\xa4\x9c\x1b\x39\xdb\x45\xf3\x5f\xb3\xbf\x2b\xb8\xed\xb1\x02\xd5\x08\x5c\xe3\xdc\x2b\x21\xbb\xaf\x02\xad\x33\x9c\x72\xeb\x95\xa3\x70\x27\xd8\xdd\x67\x8e\x9a\x6b\x21\xb9\x80\x15\x2a\x16\x28\x99\x9c\x8c\x4e\x46\x93\x6f\x12\xdf\x40\xd6\x6e\x20\xbe\xdc\xd7\xdb\x0d\x44\x97\x8e\x25\x69\x08\x74\xe4\x03\xff\xb5\x56\x6f\xbd\x80\x4d\xe2\x4e\xd2\x05\x85\x85\x4c\xef\x70\x57\x7c\xdd\xdf\x7f\x4b\x15\xe9\xd8\x85\xe0\x2f\x85\x7c\xcb\x8b\xe7\x36\x2c\xb0\xb5\x93\xb6\x2f\xb6\xf2\xca\x57\x1b\xc5\xdf\x8b\x6a\x5b\x3f\xd4\x3f\x72\x56\xc4\x6f\x44\x4f\xca\x4b\x26\xca\x38\x85\x15\x05\x04\x99\xad\xbb\x59\xc3\x8b\xee\x17\xeb\xea\x3d\x3f\xc8\x0d\x89\xdd\x9c\x70\x17\xc6\xca\x83\xcc\x3e\xbd\x9b\x5f\x14\x5c\x6a\xa1\x2f\xee\xad\x98\x5c\x1e\xd6\xd1\x79\xdd\xfd\x5a\x2b\xb6\x78\xfb\xfd\xc5\x03\x49\xf5\x6e\x57\x2e\xf6\x4e\x18\x7f\x68\x6f\x80\xac\x11\xc6\xd4\x5a\x8d\xc5\xc3\x13\x2c\xc2\xa7\x9c\xf2\xd1\x1b\xc9\x3f\x6a\xac\xe1\x0e\xc1\x7e\xff\xd4\x9b\x5c\x37\x01\xde\xe2\xcf\x89\xa2\x87\x9d\x25\x82\x8e\x89\x6c\x6c\xf9\xa7\x7c\xb7\x53\xd3\x86\x35\x03\x1c\x17\xc3\x42\x39\xab\x09\x60\x3b\x6f\x6f\x17\x4e\xf9\x30\xe3\x99\x22\x25\xdd\x2e\x10\xb3\x81\xd0\x6a\xca\x5a\x59\xa7\x0e\x5b\x5a\x61\x71\x7c\x0c\x92\x29\xb4\xfb\x39\xdc\x3d\x16\xc1\xac\x39\x74\xc8\x69\xf3\x2c\xa4\x33\xac\x15\x50\x5b\x8a\xe1\xd0\x4a\x70\x72\xb7\x43\x12\x98\xbb\xc0\xcc\x1d\x0b\xc2\x69\x7d\x0c\x71\x5a\x35\x40\x21\x1f\x42\x76\x47\x36\x8e\x2a\x06\xdc\x53\x79\x66\xfe\x01\x43\x17\x31\x54\x53\x7e\x9b\xb2\x34\x65\xb7\x75\x9a\x22\x78\x21\x86\x13\xbc\x97\xf3\x4e\x7b\x72\xca\x8f\xf5\x7e\x5f\x5a\xec\x26\x8d\xec\x4d\xec\xde\x4f\xc4\xb3\xb0\xce\xaf\x9a\xd0\xf6\x4e\xe8\x99\x58\x5f\x44\x6b\x82\xef\x16\x86\x8e\x5d\x59\x68\x6b\x83\xf4\x94\x09\x9f\xb7\x0a\x7c\x6c\x26\xe1\xea\x02\xc3\xfe\xe9\x29\x0c\x3e\x6d\x15\xe6\xe6\xf4\xea\xe2\xe2\x75\xd7\x53\xa2\xfb\xbe\x55\xe6\xc3\xd6\x46\xba\x62\x73\x1c\xee\xc5\x9e\xd2\xdb\x25\xd9\x4a\x0a\x71\x7e\xee\x6c\x14\x82\xeb\x9d\x8b\xb6\x7f\x04\xf4\xf3\x50\x03\x02\x7f\x06\x5a\x5d\x08\xb9\x04\x1f\x08\x71\x7e\x3e\xf8\xd2\x71\x2f\x5f\x8e\x06\x4f\x65\x79\x61\x8d\xe4\xea\x01\x93\x86\x85\xe1\x8a\x9d\x95\xbc\x1e\x30\x05\x51\xaa\xab\x0f\xbc\x68\xf8\x16\xe8\xc1\x62\xc5\x17\x6f\x41\xfd\xb0\x12\xb5\x45\x7a\x0c\x81\xca\x0d\x75\xf7\xef\xff\x3f\xf2\xfe\x85\xbd\x6d\x1b\x5b\x14\x86\xff\x8a\xac\x93\xa3\x12\xdb\x08\x23\x27\x6d\xa7\x95\x87\xd1\x71\x9d\xa4\x71\x9b\x38\x69\xec\xa4\x17\x1d\x6d\x97\x11\x61\x9b\x0d\x45\x2a\x20\x64\xc7\x91\xf9\xfd\xf6\xef\xc1\xc2\x1d\x04\x65\x39\x49\x67\x66\x9f\x77\x3f\x7b\x1a\x8b\xb8\x03\x0b\x0b\xeb\xbe\x56\x6a\x1b\x6b\xa2\x04\x17\x92\xe1\x75\xef\x79\x1a\x0c\x9e\xc6\x90\x8b\xc8\x35\x9d\xeb\x25\xf5\x33\x55\xc0\x36\x58\x24\xf4\xc3\x79\xe2\xa1\x2e\x11\xf3\x54\x59\xe6\x0e\x06\x26\x39\x5c\x19\xcb\x4a\x07\x19\xce\xd1\x38\x4a\xc1\x0a\x4c\x34\xbf\x20\x34\x3f\xbd\x7a\x45\x84\x9d\x22\x47\x55\xa5\xb4\xa4\x47\xd8\xee\x21\x67\x64\x8e\x29\xba\xbe\xd6\x90\xed\x41\x42\x89\x29\x42\x23\xdd\xef\x3c\xaf\x85\xec\x52\x75\x27\x2c\xc7\x20\x26\x37\x1c\xbf\x60\x08\x48\x32\xc4\x2d\xcd\x59\xa7\x58\x29\xc4\x0f\x44\xc0\x07\xd8\xd2\x24\xbe\x41\xe7\x45\x84\xa6\xf2\x48\x72\x81\x47\xb7\xa2\x3c\xa1\xa0\x16\x8e\x10\x8a\xb3\xaa\x24\xbb\x88\x44\xb9\xd2\x98\x36\x11\xc3\x2c\x79\xb8\x0a\xed\x2b\xfb\x32\xfb\xca\xba\xf6\x95\xad\xdd\x57\xd6\xb1\xaf\x2c\xb8\xaf\x98\x6c\x6f\x73\xfa\xc9\x02\x2c\xe2\x00\xf7\x09\xa3\xcb\x72\xc6\x89\x90\x52\x56\x9b\x55\x45\x21\xc3\x97\x4b\x72\x2a\xaf\x1f\xe5\x94\x5d\x35\x67\x7c\xfb\xc4\xdf\x51\x2b\xcb\x61\x1b\xc5\xe9\x20\xac\x1e\xb6\xf2\xbe\xdb\x68\xc7\x2b\x0a\xa0\x8e\x46\xdd\xaf\x95\x62\x7a\xe5\x8c\xa4\x39\x16\x9c\x2e\x0b\xa2\xf1\xe0\x63\xcd\x76\x59\xc2\xd4\x63\xed\xe2\x76\xf5\xdd\xe9\x32\x88\xc4\xad\x4e\x24\x12\x77\xdf\xa3\x84\xb9\x8f\x2e\x74\x18\x20\x9a\xba\xe9\xa5\x2e\x8c\x6f\x8d\x2c\x31\xfe\xfa\x91\x7d\xc2\x6b\x53\x9a\xeb\xf6\xe4\xd6\x7a\x4a\xab\x69\x0c\xec\xba\x0e\x39\x9e\x33\x25\x1b\x1b\xec\xc9\x5b\x03\xec\x8b\x93\xb5\xe7\x49\xac\xfc\x5a\x49\xc4\x94\x73\x47\x90\xe4\x95\xd1\xed\x42\x45\xf1\x19\x61\x11\x15\x86\x2c\x68\x1c\x59\x19\x35\xc5\xd5\x24\x6b\xae\x26\xc7\x57\x7a\x4a\xe2\xa2\xef\x9d\x32\x42\x23\xce\xd9\xe7\x32\x38\x71\x60\x76\x9d\x73\x0b\xcd\x2c\xff\x9c\x69\xf1\x7d\x72\xa7\x64\x41\xb5\x28\xe0\x4f\x69\x35\x93\x8f\x07\xce\x39\xe7\x15\x40\x5e\x9e\x0b\xd5\x17\xd8\x6c\x2f\xde\x62\x39\x66\x49\x68\x2b\x4b\xac\xce\x3e\x47\x23\x17\xb4\xb7\x84\xd9\xa5\xf3\x2d\xc9\x0d\x0b\x72\x5c\xf1\x0b\x52\x8b\xe8\x68\x7c\x59\x1a\xf1\x31\x19\x5c\x5e\x5f\x29\xdb\xcf\x5a\x60\x00\xab\x97\x57\xf2\x0e\x44\xf6\x9a\x00\xfa\x58\x42\x1a\x07\x7d\x79\xeb\x1d\x0c\xc2\xdb\x30\x2b\x48\x4a\x23\x0d\xbd\x01\x24\xc0\x17\xd6\xfe\x6a\x21\x1c\xcb\xe9\xc2\xc5\xb7\x4e\x6b\xfd\xc5\x42\x18\xa1\x96\xe2\xa6\xe9\x66\xe2\xa7\x68\x13\xaa\x6e\x63\x05\xdd\xc8\xfe\xe8\xd0\x8f\xc1\x01\xdb\x58\xc2\x8c\xde\x2e\x0b\x51\x8c\xa2\xdb\xa6\x75\xf5\x40\x80\xf7\x29\xa7\xa2\xd1\xca\xae\xd1\x44\x03\xe8\xc9\x75\xe0\x52\x41\x87\x62\x96\x5c\xc4\x95\x8f\x43\xac\xeb\x28\xf7\x36\x03\x6b\x37\xb4\x00\x8a\xcd\x47\xa5\x33\xa6\x86\xe7\xf6\x1a\x43\x80\x4e\x01\xce\xed\x5b\xef\xe4\x13\x76\xe1\xf7\x13\x7a\xd6\x58\x23\xd4\xf1\xba\x8e\xbc\xe7\x2d\x09\x02\xfd\x38\xf8\x42\x8e\x6e\xb8\x08\x8c\x4f\x2c\x00\x02\x5a\x77\x27\xe3\x48\x8e\x6d\x62\x60\x24\x99\x10\x93\xf5\x4b\x00\x7b\xae\xd0\x4d\x42\xb0\x77\xac\x52\xfe\xc1\xf8\x81\x42\x0d\xc5\x1a\x7b\x5d\x27\x4c\x75\x6e\x6a\x04\xd0\xbb\x06\x77\x4f\x38\x43\x2e\x7b\xd9\x0c\x85\x64\x3a\xf1\x62\xc9\xe0\xd8\x5c\x8c\x47\xf9\xfa\x35\xec\xba\x47\xb2\x1e\x7f\x35\xe6\x6f\xf7\xc2\x04\xaf\xcb\xfa\xcb\x42\xf4\x1b\x4d\x35\x0e\x75\xaf\x87\xb7\x4b\x54\xef\x12\xc5\xda\x79\xca\xd9\x69\x32\xa2\xfa\x2c\x04\xec\x19\x70\x24\x96\x41\x9a\x4b\xfe\x88\x14\x2d\x21\x2a\x27\x69\xe1\xc9\x71\x8b\x38\x1a\xad\xc1\x9b\x0c\xe9\x69\x98\x2d\x6d\x25\x8a\x09\x63\x9c\xa8\x43\x14\xe7\x9c\xb6\x8f\x90\xc2\xe7\x2d\xa8\xb0\x36\x86\x75\x61\xcd\xc6\x2a\xe3\x00\x86\x0e\x90\xe2\xfc\x26\xb9\xc8\x47\x18\x24\x47\xde\xd7\x76\x67\x21\xd9\xdc\x4d\x8f\x82\xde\xcd\x00\xf5\x62\xce\x96\x13\x3b\xfc\xf8\xd7\x92\x96\xc9\x9a\x57\x65\xbc\x86\x5e\x1d\xdd\xee\xbd\xe1\x88\x46\x0a\xe7\x2b\x4f\x22\xcb\xe7\x2c\x58\x13\x3e\x5f\xc9\x44\x69\xe6\x50\x2d\x20\x70\x8c\xe7\xa0\x71\xb3\xe1\xd7\x22\xb2\x1d\xd6\xc4\x93\xda\xfa\xf5\xfc\xf2\x47\xcb\x85\x5f\xc5\xfb\xe4\x1f\xb4\x55\xb3\xe3\xb3\x21\x3c\xac\x8f\xcf\x43\x35\x03\x2f\xb5\xda\xba\x99\x2f\x2b\x17\xad\xce\x3d\x81\x2d\xd3\x7c\x43\x9a\x65\x0a\x41\xe9\x83\xe6\xb5\x15\x54\x9f\x1b\xde\x03\x1a\x31\x75\x39\xcc\x7a\xdd\x2d\xe1\x10\xad\xab\x9b\xaa\xcc\xae\x67\x2a\xb4\x7b\xb3\x86\x42\x9c\x43\xb6\x5c\x43\x81\xcf\xa3\xd6\x24\x15\x89\x49\x77\xb5\xa4\xf5\xd1\x72\x81\xf2\xd3\x48\x85\x3d\x21\xd7\xd7\xe4\x9f\x09\x75\x80\x03\xd9\x52\x06\x6a\x49\x19\x4c\xd2\x38\x6a\x63\xd7\xc6\xa0\x7f\x0f\x1b\x3f\x5a\x2e\x0c\x42\x7e\xb4\x5c\x74\xe0\xe4\x73\x07\x23\xf3\xa5\xb6\x90\x32\x73\x50\x32\xaf\x42\x70\xeb\x4c\xd4\x21\x67\xc1\x43\x9e\xa7\x0b\xc0\x78\xcf\xd3\x45\x23\x70\x9b\x35\x5d\xbd\x48\x19\x02\x51\xb5\x00\x9e\x81\xa0\x5d\x7a\x7d\x1d\x51\x68\x3e\x9b\x61\x5d\x58\xf3\x42\x4c\x11\xc2\x34\x16\x80\x62\x4e\x44\x4b\x83\xec\x9e\x8c\x86\x8b\x8e\x69\xac\xea\x8e\x3a\x77\xd1\x4c\xcb\x7e\x58\xcd\xbc\xcc\x43\x28\xdf\x49\x5e\x94\x91\x82\x30\x02\x06\xff\x52\x84\xf2\x78\xbe\xb0\x45\x28\x43\xb5\x6b\xb0\x86\xfc\x23\x69\x24\x4b\xa0\x37\x4a\xf1\x08\x96\x4d\xc3\x72\xd6\xf6\x3c\x74\x70\x87\x15\x4c\x27\x37\x29\x23\x55\x0e\x41\x63\x08\x61\xdc\xf2\x41\x60\x45\x27\xf9\x14\xe1\x7c\x9b\x6c\x97\xf2\xf8\xce\x37\xd1\x67\x39\x8a\xcc\xe7\xe9\xe2\xfa\xfa\xcc\xd6\x70\x39\x0a\xae\xc5\x4c\x41\xc6\x22\x7c\xfd\xa9\xf5\x20\x3e\x4f\x17\x8a\x7d\x4d\x17\x2d\xd5\xd2\x62\x41\x4a\x41\x84\x86\x14\x59\xcf\xdb\x2d\x66\x61\x8d\xd0\x2c\xac\x09\xba\xbd\x4e\x6b\x63\x4d\xd5\x67\x4a\xd3\xac\x75\xac\x91\xa7\xdd\xac\xba\x92\x9b\x7a\x93\xee\x6a\x73\x95\xc9\xf3\xce\x0e\x83\x3a\x13\xf1\x26\xac\xd1\x4a\xcc\xd6\xaa\x0d\x64\xf3\xbf\x57\x0d\xf3\x45\x35\x27\x96\x52\x43\xba\x5f\x46\x1d\x77\xe7\x53\xd5\x1b\xf3\x74\x21\x94\x1b\xc2\x9b\xc1\x53\x6d\xc8\x88\x20\xea\x6e\x7d\x31\x4d\x87\x07\x4f\x4a\x3a\xdb\x75\x45\xb5\x81\xb3\x63\xff\x3a\x18\x10\x48\x86\x97\x24\x14\xa9\xfe\xae\xde\x92\x3d\x4e\x65\x4b\x82\x4c\x08\xe0\xdb\x7d\x13\xac\xf7\x7b\xd7\xf1\xec\x10\x55\xcf\x08\x7b\x41\x85\xc5\x8e\x20\xa8\x9f\x54\xf4\x67\x72\x05\x79\xfb\x77\xb5\xaa\xca\x0a\xcf\xf0\x82\xee\x41\xef\x10\x62\xa6\x69\x10\x7f\x43\x88\x00\xf3\xc1\x20\x92\x7f\x39\x42\x91\x00\x02\x20\x96\xfd\x33\x09\xc8\x6c\x35\x64\x18\x6e\x44\xec\x9f\x91\xd9\x58\x28\xcc\x0c\x21\x38\x02\xf9\xb0\x80\x6d\x33\xf2\x99\x00\xf9\x13\x9b\x57\x41\x24\xdb\xd5\xfc\x03\xfc\xc4\xee\x4f\x87\x42\x72\x78\x8b\x44\xbe\x89\x16\x3b\x39\x0b\x48\x6b\x66\x3e\xd5\x2c\x2f\xa8\x33\xff\x4f\x92\x6d\x09\x82\x5a\x6a\x22\xc2\x27\xa5\x63\x3e\xda\x1e\xbf\xb0\x14\x6d\x87\xa4\x59\x71\x79\x80\x9c\x5f\xd6\x6c\x25\x85\x2c\x2f\xa2\x06\x7f\xad\x6f\x3c\x14\x12\x02\x44\xce\x18\xb8\x6c\xb7\x29\x1c\xb7\x2f\x85\x1a\x4f\xcf\xa8\x55\x03\x8d\xbc\x51\x83\xd0\x0f\xe7\xd3\x09\xe6\x7a\x6b\x1c\x00\x3a\x4f\x6b\xcb\x95\xc1\xd8\x1f\x18\xf1\x2c\x43\xbb\x5d\xf7\x90\x62\x62\x64\x63\x92\x10\xc4\xa5\xa2\x6b\xb5\x4d\xf9\x60\x10\xe5\x0a\x84\x10\x18\xc9\x4a\x99\x56\x92\x73\x32\xcd\x62\x57\xa8\x0d\x76\xb4\xd1\xb1\x3a\xc8\x65\xef\x74\x66\x91\x6a\xee\x2c\x6b\x20\xda\x28\xef\xcb\x81\x64\x62\xcb\xad\xf6\x14\x6c\x45\xbc\xe2\x66\x3a\xa4\x20\x25\xe1\x9c\x04\xf6\xf5\x4c\xde\xdb\x77\x5b\xdd\x52\xe0\xa9\xb3\xba\xd0\x4f\xdd\xda\x0b\x7d\xa3\xb2\x6a\x8d\xae\x2a\xd8\x5f\x9b\x6c\xba\x05\xc5\x74\x5b\x62\xa9\x69\x02\x80\x06\xb0\x6b\x38\x20\x1f\x67\x41\xba\xa3\x5b\x21\x39\x07\x34\xf4\x28\x08\x35\x3e\xb0\xf8\x8c\xa6\xb3\xb8\xb0\x7c\x32\xb0\x60\x36\xba\x09\xc3\xb1\x20\x55\xc9\xd4\x84\xcc\x14\xdd\xe9\x58\x87\x32\xde\xe4\x98\xf4\x44\x3a\xb1\x34\x0b\x90\xc3\x7c\x1a\xe6\xb5\x26\x68\xe5\x93\x2b\x63\xa6\xdd\x95\x08\x1a\xd9\xee\x36\xcc\x38\x32\xd1\xe4\xa1\x50\xce\x43\xee\x3d\x49\xfe\x9f\x86\x4d\xd9\x38\x05\xc0\x5c\x69\x88\xfd\x3a\x59\xc2\x13\xff\x73\xa7\x90\x24\x24\x14\xd9\x48\xa0\xd1\x21\xfc\xb0\x9f\x35\x8b\x29\x3b\x9b\xb9\x9c\xce\x7c\x16\x4d\xf8\xbf\xe9\x6c\x8a\xc0\x7e\x73\xee\x9b\x47\x06\x4d\x19\xc1\x00\x32\x27\x75\xc2\x9a\x9a\xa5\x2c\x9f\xf5\x24\x1b\x65\xa7\x0e\xdd\x4a\xa8\x95\x6e\xcf\x34\xd2\x79\xd5\x39\x3d\x34\xab\xca\x59\xca\xd1\x78\x63\xcd\x0a\xe8\x50\xd9\x31\xf9\xc0\x80\xc8\x51\xd3\x5e\x49\x7b\xcc\x11\xc3\xcb\x9a\x48\x0b\xe2\x11\x4d\x1e\xb2\xd8\xcc\xe1\xfa\x9a\x2f\x14\xe1\x8c\x2c\xea\xd1\x64\xc2\x30\xef\xf5\x2f\x0a\xff\x3c\xa1\xd3\x69\xd3\x9c\xe6\x65\xe6\xb0\xce\xce\xba\x62\x28\x26\xc9\x43\x12\x5b\xac\x24\xb2\xf3\xe5\xab\x07\xbb\x9d\xa4\x60\x3f\x2d\xcb\x8a\xf5\x78\x17\xbd\x14\x28\x60\x42\x7b\xb2\x1b\x4e\x16\x0b\xaa\x97\x53\xc5\xac\xf9\xaa\x57\x9d\x8a\xc8\xa7\x9c\x48\x0e\xf9\x2f\x97\xe9\x9c\x5c\x5f\xab\x70\xdc\x60\x9e\xfc\xd5\x9f\xa8\xf9\x74\xab\xd5\xb3\x99\xb6\x57\x35\x61\x41\x3c\xb0\xb8\x92\x60\x71\xae\xc0\xe2\xea\xcb\x80\xc5\xbf\x11\x20\x2e\xfe\x2e\x80\xf8\x62\xa0\xf0\x59\xa7\x7a\x11\x38\xd5\xb7\x33\xe3\xd2\x94\x6c\xed\xb8\x5a\x64\xdb\x48\x93\x4c\xa8\x74\xcd\xb5\xc2\x40\xa6\x83\x81\xf4\x32\x39\x66\x51\x8a\x10\x3e\x85\x7f\x0c\xbf\xb0\xb3\x3e\x9e\x93\x0c\xc1\x65\xc7\x5f\x29\xb5\xdf\xf0\xdb\x99\x70\x0a\x15\x6a\x7a\x1d\xc9\x86\x82\xab\x30\x9f\xc4\x77\x83\x02\xa9\xf9\xc7\x33\xde\x1a\xe7\x26\x53\xf0\x83\xfb\x83\xc2\x80\xd2\xef\x54\xd0\x7a\xc2\x3c\x43\x2c\x32\xe1\x7c\x1f\xca\x75\x0c\x22\xd5\x72\xe7\x5b\xbb\xe5\x49\xae\x83\x5f\xb6\xac\xb8\x64\x5b\xb0\xe6\x77\xed\xb5\x7e\xa2\x7c\xf2\xdf\x4e\xd1\xee\xdb\x59\x04\xae\x28\x14\xac\x9b\xc0\xdf\x9c\x26\xe5\x18\x5c\x37\xfe\x12\x36\x4a\x87\xe4\x03\x1b\x09\x43\x2e\x75\xba\xb9\x7c\x5d\xf6\xbb\xc4\xf2\x27\xc5\x9b\x9c\x5c\x9a\xc7\x2e\x7b\x45\x4e\x0f\xca\xbf\x44\x08\x3d\x28\xb2\x48\xec\x57\xe4\xd4\xa1\x6f\x18\x4b\x67\xe7\x24\x3b\xae\x78\xc5\xfd\xaa\x64\x69\x5e\x12\x9a\x6c\xed\x80\x40\x87\x43\xcd\x61\x95\x91\x3a\xf2\x9c\x6f\xc4\x98\x98\x40\x52\x54\x45\xc9\xf2\x63\x02\x9f\x33\x73\x88\xe0\xfd\xc3\x7b\x9a\x55\x25\x03\xeb\x34\x57\x87\x07\xdd\x4c\xbe\x9b\x36\xb5\x55\x87\x39\x0b\x9b\x7c\x37\x4d\x84\xa4\x51\x7a\x5c\x91\xcc\xf4\x72\xff\x9b\x6f\x93\x24\xba\xff\xcd\xb7\x03\xbb\xc5\xfd\x29\x6a\x32\xcd\xe7\xdb\xbc\xfb\x2b\x72\x8a\xec\x1f\x71\x46\xf8\x06\xf0\x56\x50\xc9\x00\xcd\xda\xfd\x09\xee\xc6\xe4\x01\x5c\x88\x53\xdb\x9f\x9a\x6f\xd0\x77\x00\xdc\x63\xa2\xdd\xc0\x60\xa0\xd1\xdd\x9d\x5d\xfa\xf0\xee\xce\x60\x10\x15\xb9\x20\xf9\xf7\xa9\x10\xf7\x36\x37\x9e\x4d\x9d\x47\xf6\xc0\xca\xe4\x5f\xfc\x44\x96\x94\x83\xa1\xd5\x79\xba\xa6\xae\x88\x75\xc3\x50\x33\x4f\xe9\xbb\x27\x15\xdd\x07\x91\x08\x5a\x3d\x56\x8d\xda\xd0\xa4\x6c\x73\xe4\x58\x62\x03\x23\xf7\xc8\xee\x4f\x07\xc9\xdd\x9d\xfb\xdf\x37\x1c\xa5\x06\xcb\xaf\x93\x9d\xfb\xdf\xf1\xc6\x64\xc6\x14\x41\x88\x56\x07\x6b\xe7\x2a\x48\x25\x01\x24\x48\x48\x6f\x0e\x2b\xd3\xb8\xe5\x7c\x4f\x21\x64\xc0\x2e\xa3\x57\xd0\x31\x7c\xe4\x98\x3b\x2d\x8a\x2b\x28\x04\xff\xa4\x8d\x07\x14\x2b\xf1\x4e\xe3\x15\x39\x0d\x82\x98\x8b\xda\xfb\xc7\xe7\x79\xdd\xbb\xc8\xc9\x65\x2f\xaf\x7b\x69\x41\x49\x9a\x5d\xf5\xd4\x01\xf7\x84\xeb\x65\x71\xd5\x63\x15\x04\x37\xdf\x5b\x2c\x8a\x7c\x06\xc6\xf5\xaf\xc8\xe9\x56\x5f\x71\xad\x9d\x10\x31\x94\xc7\xf0\x84\x56\xf3\x3d\x98\x42\x84\x56\x17\x29\xed\x69\x5b\x1f\xeb\xe6\x3f\x6b\x03\x8f\x73\xa9\xc1\x15\x06\xdf\xb7\xd2\x0a\xe8\xa5\xcb\xbe\x99\xbd\xe2\x8e\x1b\x72\xcb\x2d\x60\x55\x2f\xed\x39\x3d\x58\xcb\x16\x93\xd7\x0a\xca\x3d\xf5\xac\xb7\x91\x22\x5a\xd5\xcb\x05\xa1\xc6\x00\xe4\x02\x50\x63\x0b\xd0\x8e\x15\xa0\x5d\x00\x10\xaf\x83\x25\x07\x8e\x78\xbb\x4e\x18\x12\x7d\x05\xb1\x9d\x54\x12\x02\x4e\x38\x9a\x85\x62\xcf\x04\x22\x47\xcc\x19\x68\x5e\xb6\xa8\x11\x69\xbc\x62\x91\x8c\xa3\x83\x4d\xec\x36\xbe\xc9\xfb\xb3\x88\x72\xf0\x96\x9f\xbe\xfe\x87\x4c\xd1\x31\x96\x85\xf0\x04\x69\x65\x90\x71\x14\xc3\x3b\x1c\x81\xee\x7c\x3b\x60\xca\x67\xec\xcd\x6d\x7c\xb2\x8e\x66\x8e\x37\xd6\xc9\x2c\x51\x94\x20\x7e\x2a\x5c\x8a\x6c\x9e\x01\x5f\x8a\x6f\x57\xb3\xe8\x64\x86\xf0\xf3\x59\xc0\x8b\xed\xf1\xac\xe5\xc5\xf6\xec\x36\x33\x7a\xee\xce\xe8\xc3\x2c\x79\x36\xc3\x7f\xcc\x12\xd1\x56\xc1\xcd\x87\xd6\x63\xca\xf7\x5c\xc0\x8e\x02\x9d\x8c\xcc\x8a\x54\xb8\xb8\x3c\x73\x5e\x58\xab\xe0\xd8\x5c\x42\xf9\xc8\xca\x8c\x40\x1c\x60\xa9\x54\x17\x3d\x9e\xbf\x25\x9c\x19\x13\xaf\x8c\x47\x34\x86\x7b\x8b\x19\xaf\x5c\x63\x9a\xfc\x56\x46\xe1\xe9\x60\xfe\xd6\xee\x7c\x2b\xae\x29\x89\x79\xf1\x31\x7f\xab\xad\x2c\x0b\xa5\x95\x18\x64\xb2\xf3\x8f\x69\x7b\x44\xe8\x69\xb2\x6e\x22\x92\xd2\x73\xc5\xcf\xad\x1e\x76\xbe\x9f\x7a\x36\x8f\x10\x27\x9d\x7f\x4f\x54\x2a\x09\x67\x1b\x08\x42\x38\x4f\xf9\x7b\x07\x06\xe8\x12\x82\x51\x63\x25\x9d\x7b\x3c\x73\xec\x25\xbe\xb6\x21\xfa\x0f\x41\x6a\x48\x67\x49\x09\xd5\xe2\x88\x0f\x66\x2b\xf9\xd7\xf1\x4c\x39\x99\xbe\x08\x41\xda\x93\x36\xa4\xbd\xbb\x0d\xa4\xbd\x70\x21\xed\xe5\x2c\x79\x37\xc3\x87\x3e\xa4\xbd\xdc\x00\xd2\x0a\x03\x45\x0a\xc6\xce\xab\x9a\xc1\x71\x6a\xe2\x8d\x7f\x11\x70\x48\x01\xc7\x48\x40\x73\xfc\x3f\xbd\xb6\x7e\x4b\x81\x9c\x72\x78\xcd\x41\x3f\x69\x21\x90\x9c\x6e\xd6\x7a\x91\x0a\x4d\xbe\xee\x43\x51\x42\xaf\xc9\x8d\x1d\x70\xf2\xe8\x25\x71\xc8\xa3\x57\x24\x62\xad\x7a\x98\x26\x87\xc4\x12\x91\xca\xf9\x99\xb8\xe9\x74\xfb\x3b\x8e\xcc\x1a\xb7\xdc\xa2\x6b\xad\x49\x2b\xe5\x33\x50\xfa\x50\x2a\x83\x8f\x0e\x77\x05\x29\xa8\x94\xdc\xa6\xe8\xee\x8e\xd4\xb4\x5b\xf3\x9c\x45\xfe\x59\xf9\x56\xbe\x64\x30\x20\x13\x36\x15\xfa\x4b\xd8\x2b\xd1\x5b\x8b\xe6\x35\x97\x4b\x0d\x37\x0c\x62\x0a\x5f\x1f\x1e\xba\x46\x90\x51\xcc\x11\x25\x0b\x5d\x82\x88\x35\x9f\x37\x3a\x32\x93\xf0\x62\x0e\x45\xad\xa0\x92\xa2\x73\x4f\x56\x85\x33\x10\x22\x3a\x16\x97\xd2\x2d\x7a\x30\x48\xcd\x99\xa7\x20\x55\x3f\x98\x49\x24\xc3\x84\x8f\x08\xb2\x62\x8d\x4a\xa6\x3a\xc5\x39\x16\x41\xd0\xad\xc4\xbf\xf6\x74\x0b\xc8\x5d\x2f\xf0\x1a\xc2\x45\x23\x3f\x7b\x39\x97\x24\x85\x92\x27\x9c\x8f\x92\xc4\x36\x9d\x3c\x98\x22\x0f\xa9\x6a\x4a\x5b\xa6\x95\x80\x1c\xd4\x50\x22\xc9\x55\xe2\x05\x07\xe3\x9d\x60\x11\x0a\xe5\x90\xa3\x16\x32\xe1\xaf\x25\xef\x79\x37\x57\x6d\x72\xab\x5b\xe3\x38\xab\x65\xa4\x7f\x2d\x65\xf4\xd8\x08\xfc\x56\xfc\xb3\xde\xdd\xea\x0e\xf8\xb5\x33\xdc\xce\x71\xaa\x23\xbc\xee\xe6\x0f\x87\x80\x3d\xcb\xbb\x3b\xd3\xc9\xd7\xd3\x84\x20\x9c\xff\x33\xbd\xbb\x33\x1c\x47\x84\xff\xa6\x93\x72\x8a\xdf\x72\x3e\x16\x5a\x12\x88\x8a\xa2\xe3\x30\x42\x15\xa1\x65\xe2\x2b\x48\x54\x76\xcd\x82\x73\xd8\xff\xd0\x19\x50\x8a\xc1\x80\x8a\x7f\xc2\x09\x35\xd8\xe4\xfb\xe9\x2e\x90\x0d\x7c\xf7\x26\x0f\xa6\xfc\xff\x77\xbe\x9d\x0e\x06\x11\x9b\xdc\x9f\x0a\xc7\x1c\x6d\x46\x33\xf9\x7e\x9a\x4c\xc8\x74\xa4\xa7\xd1\x44\x85\xd1\xa8\xd4\x7c\xe8\xef\xf5\xd0\xf5\x60\xa0\x0e\x5e\xbe\x89\x98\x68\x9e\x00\xb2\x63\xa7\x1c\x4c\xd4\xb4\x9f\x42\xee\x1c\x04\x19\x6f\x20\xc5\x4b\x72\x9a\x47\x35\x4e\x27\xff\x98\xfa\x77\xb0\xea\x8a\x70\x98\x4f\x86\xd3\xa4\xc4\xf9\xe4\xdb\x69\x42\x80\x04\xc6\xb9\x88\xe5\x8a\x53\xc4\xc7\x4c\xf9\x89\xd7\x10\xd6\xae\x40\x98\xc5\xdd\xd4\x3e\xdf\xf9\x47\xb3\x28\x45\x18\xf2\x02\xb1\x46\xa0\x0f\xdb\xb4\xcf\x02\x6c\x88\x7a\x60\x00\xe7\x56\x08\xc5\xe6\x19\x39\xc3\x18\x32\xe2\x69\x41\x1f\xc3\x77\x77\x38\x06\x2d\xf2\xd6\x00\x40\x33\x0e\x06\xd1\x3e\x2c\xa0\x35\x3c\x44\x8e\xcc\xa5\x8c\x02\x69\xd6\xee\xb3\x46\xd3\x76\x39\x62\x4d\xdd\x23\x8f\x35\x0d\x20\x1e\x73\x6f\x14\x92\x0c\x3d\x6b\x54\x36\xb6\x30\xf6\x36\x19\x31\x9b\x76\xe0\xbb\x6b\xf9\xf6\x7f\x67\x25\x6d\x7d\xe4\x17\x5d\x5f\x47\xfc\x9f\xc4\x09\x54\xf2\x64\x66\x5b\xbe\x99\xa0\x55\xcc\x12\x7d\x9d\xb2\x28\x47\x88\x26\xb9\xc0\x25\x42\xa0\x04\xd2\x28\x99\xba\xa6\x4c\x8e\x79\x15\x57\x1e\x04\x39\x87\x76\xcb\x84\x7a\x51\xf3\xfa\x7d\xa3\x7f\x94\xe1\x1e\x76\x97\x79\x44\xf1\x69\x0e\x9e\x32\x5e\x58\x55\x43\x30\x33\x30\x71\xb0\x63\xc2\x46\x04\x8d\x88\x13\x24\x56\xf4\xc0\x99\x15\xb3\x84\x84\x26\x97\x69\x94\x63\x22\xe0\xf8\x0f\xa0\xc6\x9c\x37\xf5\x70\x26\xb2\x35\x28\x84\xfe\xd7\x2c\x59\x35\xd2\x6f\xff\x47\xc3\x84\xbd\xaf\xc2\x4c\x98\x24\x6f\xd4\xcb\x91\xb0\x66\x4d\x48\x0f\x05\x62\x4b\xe6\x3d\xfc\xaf\x81\xd4\xb3\x3b\xb2\xed\xc6\x3e\xce\xdc\xa0\xea\x26\x64\x4b\x2f\x2f\x7b\x0c\xb1\x50\xd4\x62\x19\x67\x65\xb5\xa0\xd5\xe2\x30\x9d\x93\x11\x68\x72\x18\x99\x2f\x8a\x94\x11\xf8\x42\x1b\x2b\xf6\x8a\xe8\xfe\x07\xc1\xbc\x9c\xd3\xa8\x7f\xb4\xff\xf4\xf1\xa3\xd7\xcf\x1e\xbf\x3a\x39\x7e\xf1\xf3\xe3\xc3\x3e\x5e\xad\x8f\xfb\x70\x59\x36\x2a\x9c\xc2\x6b\xb3\x6f\x3f\x54\x6d\x89\x9e\xb3\x73\x3a\x84\xc9\x23\xce\xfe\x7a\xbb\x49\xbc\x3a\xc7\x57\x0b\xb0\xe9\xbb\x5a\xc8\x12\x11\x19\x5e\x84\x87\x90\x7f\x82\xf5\x5d\xf4\x63\xa9\x22\x40\xe0\xbe\x3e\x23\x19\xb1\xf8\x48\xd5\x84\x27\xdf\xff\x38\x0e\x7d\x1c\x4d\xa6\xca\x9c\xe1\x87\x6a\x59\x82\x21\x3b\xcc\x70\x6b\x8b\x48\x82\x73\xb1\x64\xb5\x21\x83\x3e\x4a\x0c\x60\x2f\x2f\x16\x95\x04\x8d\x59\x2d\xd9\x06\x2d\x64\x2d\x13\x76\xc2\x7f\x56\xa3\x3c\xc9\x25\x6d\xa3\x41\x67\x1c\xba\x43\xab\x33\xc2\x46\xed\x00\x87\x4c\xba\x74\xfd\x35\xb3\x88\x96\x74\x2b\x49\xfe\x9a\x5d\x5f\xe7\x09\xff\x77\x9c\x8e\x88\xf2\x65\xc3\x25\x6a\xc0\xd3\x96\x13\x0a\x82\x88\x42\x23\x86\xd3\xa4\x84\x1a\xbf\x55\xf8\x80\x21\x5c\xc8\x9f\x54\x12\x4d\x22\x86\x81\x34\x71\x28\x33\x42\x89\x4d\xc8\xda\x0b\x46\xb8\x4a\xda\xbb\xa0\x8f\x76\x32\x9c\x4e\x86\xd3\xeb\xeb\x7e\x96\x5f\xf4\xf1\x2c\xa1\xe3\x80\x48\x01\x90\x05\xd2\x4c\x8d\x68\xfc\xaa\xaa\x98\x8a\xb0\x4e\x30\x4d\x92\xe4\x49\x7c\x74\x9e\x66\xd5\xe5\xa3\x6a\x2e\xdd\x8c\x93\x56\x66\x36\x32\x66\xf1\xfb\x25\xa1\x57\x0a\x10\x00\xeb\x98\xe0\x7b\x56\x18\xec\xa4\xdf\xc7\x79\x13\xf1\xd7\xb5\xbd\x00\x52\xce\xd2\x45\xbd\x2c\x80\x9b\x44\xa3\x32\x8f\x36\xdf\x8f\x60\x7e\x74\x2f\xfd\xac\x9c\x51\xbf\xbe\xe0\x93\x4f\xc8\xb8\x7f\xce\xd8\x62\x74\xef\xde\xe5\xe5\x65\x7c\xf9\x20\xae\xe8\xd9\xbd\xfb\xc3\xe1\xf0\x1e\xaf\x30\xea\xcf\x53\x76\xde\x59\x6f\xe7\xfb\xef\xbf\xbb\xf7\x3c\x65\xe7\xcf\x9f\xdd\xeb\x4b\x51\x4a\x85\x10\xce\x02\x07\x53\x95\x2f\x97\xf5\xf9\xf8\x9b\x7f\x7c\x3b\xfa\xe6\xfe\x77\x78\x99\x04\x21\x4f\x37\x81\x6b\x54\xcf\xce\x09\x07\x53\x3a\x62\xd7\xd7\x97\x25\xe6\xbc\x4b\x39\x7a\x97\xe2\x45\x91\x5e\x11\xfa\x34\x2d\x33\x5e\x48\x04\x8f\x81\x21\xb3\xec\x68\xd8\x34\x11\xc2\xe7\xc9\x32\x8d\x86\x16\xdf\xbf\x83\x87\x21\x51\x80\x84\xba\x45\xf2\x5b\x29\xf6\xf5\x1c\x2f\x71\x66\x95\xa7\xb8\xc6\x05\x07\x78\x7e\xee\xa7\xf8\x6c\xf7\x8c\x44\x0b\x21\xfd\x52\x64\xff\xfa\x20\xd2\x40\x9b\xd3\xc9\xfd\xe1\x34\x61\x9a\xfe\x63\x69\x54\xe0\xfb\x43\x7c\x1f\xf7\xff\x17\xa7\xf4\xfb\x72\x1e\x55\x52\xc7\x73\x42\xcf\x48\xb6\xc7\x18\xad\x13\x02\x7c\x00\xfc\xbd\x6b\x68\xba\xe8\xc7\x34\xaa\x71\x85\x15\xcd\x29\x12\x83\x45\x8f\xc1\x83\x1c\x57\xfa\x63\x1d\x03\x92\x25\xf5\x60\xf0\x18\xd2\x36\x62\xfd\xc5\xaa\x53\xb3\x2b\xc8\xbc\xfe\x87\xaa\x22\x3e\x20\x64\x62\x2f\xe6\x3e\x08\x82\xdf\x69\xc6\x37\x8d\xe2\x2c\xe5\x64\xb6\x94\xbb\xc8\x63\xfe\xf6\xeb\xd1\xce\xb7\x18\x56\x8d\x6b\x9c\xe3\x19\x4e\xe5\x21\x95\xb6\x43\x68\xd1\x8e\xc8\x2d\x83\x2a\xd6\x9c\x5f\xe3\x1d\x02\xe5\x80\xaf\xf8\x7e\xd5\x08\xef\xf3\x85\xeb\xe0\x7f\x3b\x08\xde\x69\x8a\x33\x24\xc6\x4a\xb2\x26\x9a\xb5\xaf\x06\x5e\x88\xa0\x85\xf9\x69\x34\x43\xa0\x49\x7d\xcc\x47\x98\xe1\x49\xbf\x3c\xbb\x7b\x41\x68\x9d\x57\x65\x1f\x97\x33\x88\x33\xe4\x44\x18\x58\xa5\x7c\xef\x47\x0c\xcb\x7d\x1b\x91\x26\x09\xdd\xb2\x76\xfe\x92\xfb\x42\x99\x96\x9b\x18\x06\x2a\xcd\x20\x93\x31\xad\x03\xe9\x26\xef\x83\xb3\x20\x04\xb6\x4e\xf5\xc3\x9c\x62\x36\xd9\xde\xce\xa7\x68\xf4\x5d\x02\x61\x09\xa8\xca\x2c\xb1\xab\x12\x62\x6c\x1d\x96\x51\x89\x90\x08\xcd\x5f\x26\x69\x93\x6f\x6f\xab\xd4\x21\x62\x05\x44\xaf\x80\x2a\x09\x6d\x27\xe2\x04\xd6\x55\x6e\x11\x67\x46\xf8\x4c\x94\x94\x00\x40\x89\x17\x10\xf9\x68\xf6\xfa\x08\x35\xf9\x69\x74\x96\xbc\x64\xd1\x39\xbe\x3f\x44\x58\xe7\x15\x24\x86\x37\x3e\xb3\xd4\x7a\x0e\x61\x22\xe2\x3c\x84\x5f\x5d\x3b\xfa\x83\x1b\x2a\xd5\x4a\x28\xb5\x95\xe4\x63\xa1\x80\x3c\xa5\xd5\x3c\xca\x05\xc5\xcc\xa9\xa2\xb5\xd1\x29\x81\xae\x2f\x92\xae\x70\x70\xbf\xb3\x08\xed\xb2\x00\x7c\x06\x42\xcb\xc1\x89\xf8\x1f\x23\x8a\xf0\x9e\xc8\xaf\x46\xb0\x97\xe0\x88\x22\x93\x08\x86\x51\x90\xdd\xe5\x7e\xec\xd2\x1c\xed\xde\xa1\x51\x69\xb8\xc6\x94\xd3\xc1\xb9\xc5\x46\xa4\x90\x4f\x35\xe5\x57\xb1\x6c\xa2\x14\xe2\x9e\x8b\x08\x76\x06\x8d\xea\x3c\x26\x40\xd3\x17\xb8\x1c\x0c\x4a\x3b\xfe\x30\x03\xbe\x14\x52\x94\x88\xbd\xff\x65\x49\x68\x4e\x6a\x4b\x41\x0c\x09\xe0\xbc\xe2\x68\x07\x17\x98\x79\x53\x56\x74\x71\x2d\xda\xc8\xc0\x93\xa9\xbf\x87\x02\x11\xf0\x37\x05\x90\x9b\x4c\x67\x53\xeb\xe4\xdb\x16\xce\xbb\xbe\x8e\x8e\x48\x24\x05\x18\x08\xcf\x53\xc1\x8d\xd5\x78\x88\x6b\x7f\xbf\x6a\x27\x64\x27\xdf\x94\x0b\x4e\xc2\x17\x08\xe1\xa2\x51\x52\x35\x0f\x2b\x2c\xf1\x24\x2d\xa6\x20\x7a\xd5\x29\x78\xb5\x3a\x63\x9f\x44\x0e\xf9\x7f\xc7\xa7\xba\x38\x89\x89\x4f\xf1\xef\x55\x74\x86\x17\x08\x2f\xf0\x99\xb6\x7d\xba\x63\xc8\x5a\xf8\xb0\x6a\xda\x62\x4f\x01\x8e\x0e\x85\x5b\x54\x42\xcd\x95\x50\x65\x43\x57\x55\x52\xca\xa9\x9c\x83\x41\x01\x9d\x94\x58\x31\xd5\x60\xaa\xa5\xa8\x5f\x25\x34\x92\xef\x2f\xe8\x6f\x1e\x81\xae\xa7\xa2\xa0\xf0\x22\x97\xbd\xbd\x59\x94\xfb\x04\xb5\x20\x96\x37\x11\x87\x32\x4b\x92\xa9\x27\x67\xab\x97\x9d\x79\xc4\xfa\xbb\xab\x84\x75\x2b\xd9\x45\x4a\x90\xf4\x7e\xa6\x6d\xd8\xc5\x8e\xfe\x6a\x76\xf4\x20\xa0\xfa\x77\x25\xc8\x42\x76\xa7\x65\xc5\x6f\xab\x8a\xd5\x8c\xa6\x0b\x13\xbe\x30\xd1\x54\xba\x5c\x2f\x6c\x19\x96\x42\x31\x98\xcd\xfe\x5b\x53\x6b\xe6\xb1\x68\x3a\xa8\x24\x9f\xe4\x8f\x33\xa9\x2c\x57\x3c\xed\x39\xf8\x72\xe6\x09\x9b\xfc\x22\xe5\x9f\xbb\xf9\x60\xf0\xae\xd6\x1b\x1f\x9c\xd1\x1f\x65\x44\x63\x5d\xa0\xcd\xc1\x1f\x28\x11\x64\xf2\x93\x40\x22\x13\x6d\xb4\x73\x30\xc3\xcb\x9a\x80\x99\x1c\x58\x11\x37\x9a\xf1\x1a\xbd\xaf\xdc\xa2\xce\x15\x34\x53\x7c\x2a\x02\x1c\x78\xc3\x81\x07\x00\xaf\xa2\x3e\x3c\x22\xa7\x1c\x4e\x6a\xb5\xcb\x1a\xf8\xe0\x97\x10\x10\x2b\x8f\xac\xa4\x2c\xe2\xe3\xa7\xaf\x5e\xfc\x7a\x72\xf0\xe4\xe4\xf0\xc5\xf1\xc9\x93\x17\xaf\x0f\x1f\x61\x9a\xbc\x88\x1f\x89\xdc\xd6\x46\xe6\xc0\xdf\xb4\xe2\xfa\x9a\xff\x7b\x30\x13\xff\x7e\x4c\x85\x93\x42\x6b\x4e\xb2\x7b\xce\x98\x1b\x90\x73\x8d\x0f\x4c\xed\xdd\x2d\x1d\x96\x96\x64\x83\x01\x33\xd0\xe8\x9f\xb3\x8b\x11\x51\xab\x3c\xf1\xbc\x25\x14\x08\x5b\x3d\xc8\xfc\x5e\x0a\x01\xfc\x6e\xc0\xf5\xb8\x43\x29\x2b\x47\x99\x03\x27\x26\x6e\xa0\x22\xca\xce\x85\xaa\x33\x44\x68\x70\x80\x3b\x22\xcc\xc8\x4f\x7b\x2c\xb2\x9e\xad\x73\xce\x7b\x89\x20\x41\x79\x9c\x6b\xab\xa1\x72\x30\x68\x25\xc8\x93\x2e\x19\x5b\xc2\x1d\xc3\x33\xbe\x7a\xb4\x14\x3a\x77\xd2\x13\xf3\xeb\x51\x72\x96\xd7\x8c\x50\xa2\x42\x86\xb2\x06\x22\x8e\x9f\x46\x04\x35\xbd\x8b\x5a\xfc\x09\x16\x77\xa8\xf9\x13\x35\x51\x89\xdf\xcf\xe0\xbc\x4a\xfe\xde\xf1\x1f\x35\xff\x61\xbd\x7d\x29\x07\xf9\x3c\xce\xe7\x60\x12\x26\xc2\xcb\x4a\xaa\xb9\x07\xd4\x10\x44\x4c\x8f\x0a\x74\x7d\x1d\x11\x70\xf9\xe3\xef\x58\x54\x20\x04\x96\x7c\x9d\x21\x16\x7f\x95\x88\xda\xec\x2c\x66\xb6\x90\xe4\xa7\x96\x73\x5d\x4e\x22\xb4\xcd\x64\x1a\x19\x2d\x6d\x99\xe4\x53\x0e\x8b\xe5\x78\x5e\x44\x25\xce\x31\x1d\x93\x78\x96\x16\x45\x44\xd1\x88\x44\x08\x8d\x82\x02\x28\x36\x21\xd3\x06\x92\xda\x5b\x39\xcd\x67\xad\xa8\xc0\x34\x13\xe9\x13\x72\x48\x9f\xa0\x6c\xb9\x4c\x1c\xd1\x99\xfd\x48\x04\x95\xe2\xed\xe4\x9e\x64\x5b\xbb\x8a\x5e\x15\x90\xbc\x8f\x73\x22\x7c\xfa\x0c\xd7\xdb\xf7\x71\x31\xce\xc5\x02\x0a\x28\x18\x09\x41\x32\x1a\x91\x4c\x54\x40\x4d\x7b\x4e\x9c\x8d\x37\xf9\xac\x67\x2e\x8f\xb3\x76\x5e\x76\x7a\x34\x6b\x66\x6f\xf9\x6c\x2a\x39\x75\x31\xb7\x6a\xfb\x01\xae\xd5\xdc\x6a\x59\x24\x66\xc7\xdf\x6f\x31\xbf\x6a\xfb\x41\x78\x7e\x4e\x56\x41\x96\xf9\x9b\x73\xc3\x1c\x71\xa5\x66\x39\xb3\x67\xb9\x9e\xa7\x83\xdd\x15\x47\xe6\x6c\x38\xd9\xbe\x0f\x15\xaf\xaf\x81\xe4\x98\xe9\x8d\x10\xeb\x9c\x6d\x7f\x8d\x2b\xb5\xce\x4a\x17\xaa\x95\xe2\x5a\xad\x75\xb6\xfd\x75\xd7\x5a\xb1\x9d\x7d\x95\x64\xbe\x92\x82\x68\xc5\x33\x15\xb0\x2b\x68\xf1\x11\x35\x8d\x68\x16\x5e\x94\xb5\xfa\x8b\x02\xb2\xd8\x94\x72\xde\xc5\xf6\x0e\x4e\xd5\xbc\x53\x5c\xc2\x8c\xd5\x5c\x8b\x6d\x3b\xe5\x48\xee\xcd\xe8\x3d\xd3\x91\xd9\x34\xc1\xbb\x7d\x7f\xb8\x4b\x7d\xaa\x70\x1c\xf9\xa9\xcc\xc1\x3c\xd4\xb0\x09\x26\xff\xc4\x2e\x7d\xc8\x99\x86\xbb\x77\xdb\xe9\x13\x18\x24\xd4\x01\x24\xa4\xed\x05\x0d\x6e\xdb\x8f\xfa\x0f\x86\xf7\xfb\xf8\xcf\xe3\x73\xd2\x5b\xe4\xc2\x70\x98\x35\x5f\xf5\x66\xd5\xb2\xc8\x7a\x65\xc5\x7a\x6f\x89\x88\x8b\xbc\xc5\x51\x18\xc1\x34\xe6\xd5\x5e\x01\xee\xa3\x57\x08\x53\xa1\x70\x2d\xa7\x49\x8e\x73\x43\xb8\x00\x5b\xe0\x85\x44\xa7\xad\x90\xe8\x48\xf2\x2c\x76\x4b\x84\x46\x79\xa2\x7b\xd5\x88\x31\x97\xd6\xb3\x57\xd7\xd7\x91\xfe\x3b\xd9\x67\x51\x2e\x18\x62\x84\x8b\xe4\x65\x74\x52\xb8\x82\x88\x27\x60\x80\x83\x49\x92\x1a\x2c\xf6\x84\x63\x47\xdc\x56\xb6\xd1\x87\x32\xf9\x8a\x71\x0f\xd6\xc9\x58\x94\x6f\x98\x8e\x5e\xad\xbe\x21\x4c\x20\x2e\x67\x13\x51\x61\x2e\xc3\xd9\x13\x4c\x34\xc9\xfc\x32\x2a\x6c\x44\x5b\x66\x2d\xad\xed\xf6\xfd\xa1\xc9\xd6\x75\xc8\x00\x4f\x86\xee\x1c\x5a\x2d\x8a\x38\xaf\x7f\xa5\xe9\x62\x41\xb2\x88\xa0\xc1\x20\x22\xc9\xa2\x88\x97\xe5\x25\x4d\x17\xe0\x6f\x3d\x29\x49\x84\xa6\xc9\xc7\xd2\x92\x4d\x47\x1d\x6a\x01\xa6\x95\xe5\x64\x1a\x2f\x96\x94\x08\x14\x3d\xa6\x19\xff\x97\xdf\x31\x82\xd3\x98\xd1\xb4\xac\x4f\x2b\x3a\x87\x44\xfe\x23\xeb\x43\x44\xed\xd4\x6c\x69\x66\x3d\x39\x24\x79\xb8\xaa\x09\x3b\xce\xe7\xa4\x5a\x72\xf2\x44\x6a\x76\x89\x09\xf3\x9b\x79\x56\x10\x75\xfc\xe1\x17\x97\x28\x00\x13\x63\x97\x88\x3d\xc9\xeb\xbd\xfa\xaa\x9c\x25\xac\x21\xf3\x9c\x69\xc2\x41\xc4\x35\x64\xa8\xa9\x97\x6f\xeb\x19\xcd\xdf\x12\xb5\xcb\x17\x29\xed\xc1\xa5\xde\x15\x19\x4d\x19\xae\x21\x42\x8a\x8a\xb5\x8c\xf0\x2c\x01\x4d\x36\x1b\x0c\x54\x36\x2c\x2d\x7c\xb0\x45\x86\xbb\x3a\xd8\x46\x94\x27\x42\x75\x82\xae\xaf\x75\xda\xee\x5c\x61\x95\x3c\x7e\x0b\xa6\xdd\x08\xd7\xba\x41\x99\x90\x98\x70\x22\xc2\x6e\xa1\xf1\x50\xa9\x5b\xcc\x74\x8b\x14\x2c\xd7\xe7\x8b\x82\x30\x62\x37\x4a\x55\xa3\x54\x35\x6a\xdc\x9d\x19\x0c\xa2\x3a\x49\xb3\xa8\x16\x09\xc7\x0b\xfe\x77\x21\xb2\x2c\x45\x33\xfe\x63\x66\x84\x58\x59\x22\x36\xcf\x6c\xda\x8a\x2f\x6b\x54\x60\x98\xec\xa8\xc6\x6a\x0a\xa3\x99\x65\x42\x60\x7b\xc3\x54\xf1\x25\xa7\x22\x39\x21\x92\x21\x9c\xd9\x0a\xb6\x3a\xf3\xcd\x1a\x28\xa9\x97\x05\xab\x55\x74\x4a\x15\x4c\x24\x0b\x1c\xbb\x68\xc0\xcf\xf8\x51\x5e\xb3\xbc\xd4\x96\x79\x2f\xca\x42\xfb\xca\x64\x39\x65\x57\xc9\xd6\x10\x3b\xdd\x6b\x06\x45\x39\xf5\x08\x6e\x8f\x64\xc9\xd6\x8e\x5b\x60\x99\x39\xbb\xc1\xa4\x01\x0f\x27\x12\x66\x45\x79\xaa\x3f\xe8\x88\x3f\x7c\x19\x98\x26\x55\x66\xf2\x43\xec\xd2\x09\x99\x72\x44\x37\x21\xd3\xa4\xce\xa4\xa9\x9f\xb6\x19\x0c\x79\x93\xea\x68\x3d\x7a\x52\xe4\xb2\x57\x64\xda\xbc\x24\xb8\x83\x6c\xda\xcc\xd3\x45\x57\x71\x2c\xca\x9a\xd3\xbc\x80\x80\x50\x1d\xb5\x74\xb1\xf6\x55\xe8\xa8\x06\x85\x0d\x25\xd9\x72\x16\xd0\x62\xeb\x8a\x56\x85\x46\x33\x0f\x96\xeb\xb4\xe8\x4d\x17\x34\x75\x35\x6f\x87\x6c\x52\xf5\x64\x61\xc3\x2a\x61\x40\xdf\x55\x4d\x78\x7a\x34\x26\x3b\x60\xb8\x9e\x29\x6f\x84\x2b\x64\x2b\x44\xc6\x2e\x55\xf0\xb4\xa3\x95\xac\x17\x7c\x77\x76\xa3\x0e\x68\x0a\x30\x0f\x4a\xae\xb9\x95\xe8\xb7\x59\x3e\xba\x32\x6b\xb9\xc9\xec\xc7\x5a\x99\xfd\x4a\x90\x82\xe2\x34\x21\x52\x18\x4a\x45\x7c\x0a\xce\x2d\xa4\x09\x05\x9f\x89\x94\x33\x2e\xba\x4b\x29\x8a\xd9\x1a\x36\x11\xd5\x6b\x15\x51\x56\x85\x67\xaf\xba\x12\xb9\x16\x10\x27\x2a\x99\x12\xff\xc2\x81\x3a\x9f\x38\x66\x4d\x53\x2c\xc9\x90\x24\x9f\x0c\xa7\xa8\x29\x2b\x96\x9f\x5e\xbd\x28\x8d\xe1\xab\xb3\x1b\xbe\x1f\xb4\xda\x9d\xeb\xeb\xad\xb5\x57\x58\x85\x0b\x51\xed\x62\x81\xce\xcf\xf3\x1a\x35\x35\x61\x2a\x48\x84\x73\xcd\x7d\x89\x8a\x6a\xaa\x90\x94\xd6\x89\xca\xef\xcb\xd2\x20\x36\xd4\x34\x47\x57\xf3\xb7\x55\x21\x45\x27\xb3\x2c\xe8\x71\x04\xda\xaa\x67\x79\xcd\x4c\x60\x7d\x36\x3b\x97\x98\xa2\x99\x15\x55\xe9\x45\xf6\x98\x65\x91\xdb\xb0\x3d\x7d\x5d\x14\x9b\x12\x1d\x28\xc6\xc7\x7d\x93\xa9\xd5\x4a\x78\x3e\xdd\x60\x21\xaa\x6a\x5a\x9e\x36\x16\x64\x2b\x55\x88\x27\xab\x1c\xfb\x1f\x26\xc3\xe9\x88\x98\xc4\x9a\xad\x34\xeb\xd4\xf6\xc7\xe1\x84\xe7\x19\x61\x3f\x5c\x49\xd3\x0b\x9d\x56\xda\x9e\xb9\x72\x01\x3a\x28\x1f\x19\x53\x50\x3e\xfb\x69\x2c\xf7\xd1\x91\x24\x66\x59\x94\x9b\x0f\x7c\xb7\x1d\xeb\x1f\x0b\x12\xe4\x8c\x7f\xcd\xd9\xf9\x73\x71\x3a\x1c\x4f\xd8\x5e\x1a\x1b\xd4\xee\x2c\x5a\x05\xa2\x4f\xcb\x15\xd9\x51\xa8\xe5\xbe\x9e\x08\xd2\x5e\x81\x89\x04\x6a\xb5\x03\x64\x1a\x38\xf2\x65\xd6\x16\x7b\x0a\x42\x52\xcc\x7a\x41\x49\x06\x52\x06\x05\x82\xa0\xc2\x53\x72\x3b\x0a\x91\x8a\x54\x5f\xe7\x1b\x80\x8f\x34\x02\x05\x81\x70\x30\xbd\x4c\x60\x85\x74\x7b\x1b\xb9\x67\x39\x8d\x5b\xfd\xa8\x9e\x1f\x8b\xb7\x63\xb3\x7d\xf3\xf7\xc7\xe9\xa3\x21\x12\xc8\x8f\xd5\x39\x8a\x0e\x4b\x95\x0c\xc0\x9b\x75\x48\x13\x62\x19\x46\x89\xe2\xd1\x50\x85\x23\xb7\x40\x96\xa2\xd8\x1b\x8b\xd3\xdc\xc2\x57\x3f\x0c\xb5\x32\x22\x94\xec\x5a\x7a\x81\x8d\x48\x32\x29\xa7\x0e\xd8\x42\x05\x30\x02\xe1\xc4\x99\x50\x00\x2b\xb3\x91\xcf\xd9\x7e\xa7\x8f\xc6\xb9\x7d\xce\x8b\xa7\x9a\xb0\x69\xb7\x7d\xa9\x3b\x5c\x03\x31\x9e\x1c\x14\x98\x93\x96\xf0\x6e\xd1\x02\x5b\x48\x39\x2c\x90\x24\x61\x29\xe7\x23\x42\x48\x13\x1b\x6b\xcb\xf6\x9e\xde\x95\x04\xd9\x8c\x56\x75\x4d\xea\xc3\xb3\x63\xb9\x4a\x43\xaa\xa5\x8b\x45\x91\x93\xfa\xb8\x3a\x24\x1f\x84\x9c\x5f\xd3\x7b\x96\x89\x39\x2f\x10\xf1\xe3\x48\x00\xe0\xa5\xe9\xc9\xde\x62\x51\x5c\xe5\xe5\xd9\x71\xc5\xab\x03\xff\x64\xa6\x0b\xe6\xc8\x21\xb8\x5e\x33\x56\xa2\x32\x16\x9b\x90\x1e\xed\xd9\xee\x20\xef\xfc\xa1\x66\xe0\x36\x79\xf0\xe8\xdb\x0a\xfa\xd3\x67\x48\xc6\xd6\x08\x6c\x9e\xdc\xa1\x34\xcb\x00\xb1\x45\x77\x8d\x47\x08\x18\xd2\x2f\xe4\xab\xa5\x0e\x4e\x99\xc7\x07\x06\x71\x1c\x97\xdc\xb5\x0d\x06\x3b\x5b\x49\xb4\x33\x70\xba\x12\xe8\xca\xb7\xb6\x0d\xee\x9f\x8a\x74\x26\xcd\x8a\x77\x1d\x6f\xd2\xc1\xe0\xbb\x81\xf0\xde\x1c\x0c\xe4\x4b\x02\x31\x86\x10\x4d\xa8\x6a\xa0\x99\x4d\xce\x62\xc9\x76\x63\x59\x79\x74\x77\x07\xb5\xa2\x92\xb8\xf3\x6f\xbc\x83\xf7\x22\xa6\xa9\x05\x69\x84\xdc\xf6\xea\xa4\xc6\x7d\x55\x10\x75\xd4\x21\xea\x94\x74\x87\x72\x7a\xce\x03\x35\xfe\xea\xbc\x22\x69\xf6\x62\xa1\x49\xc8\xd3\x2c\x22\xb8\x54\x92\xf6\xb5\x55\x7f\x23\xa0\x20\x2d\xf1\xd6\x0e\xde\xda\x41\xd2\x1d\x95\x26\x49\xf2\x6c\x36\xfe\x7a\x40\xe4\xc6\xdd\xdc\xd1\xdd\x1d\x19\x6c\x65\x93\xe1\xa8\x1e\x6e\x6d\x6d\xdb\x63\x3f\xb1\x05\x1d\xce\xb6\x52\x19\x34\x49\x39\x83\xa0\xfc\x34\xca\x93\x24\xf9\xa5\x12\x96\x53\xef\xa4\x05\xd5\xb3\xd9\x60\xa0\x56\x84\x5c\xb0\x96\xb6\xaf\xf8\xee\x7d\xcf\x80\x52\xce\x37\x97\xf3\xb5\x80\x2a\xdc\x01\x55\x41\xa2\xba\x4a\x1b\xfd\x11\x00\xc5\x0e\x4a\x21\x91\xdd\xd8\xc1\x7c\x13\x86\xc9\x74\x64\x7f\x92\xf8\x14\x3b\xa6\x89\xa7\xbe\xac\x12\xb4\x9d\xc5\x61\x3a\x77\xe8\x39\xda\x0d\x65\xc9\x7d\x30\xde\x10\x62\x79\x2d\xe0\xa3\x93\x7c\x7b\xc7\x71\xb7\xb1\x22\x36\x64\xbe\xdc\x1d\x12\x0e\xd2\xa0\xd9\x5b\x6f\x67\x47\xf9\xd4\x48\x47\x9a\x91\x76\xb2\x91\xce\x37\xd2\xc6\x89\x60\x86\x46\x77\xef\xb7\x7a\xb2\x73\x10\xc2\xe9\xf2\x8e\xa0\xb2\x84\xd6\xc7\x33\xf3\xf3\xdd\x6c\xfc\x44\xfe\x14\xbc\x36\x64\x62\x85\xd0\xe7\xfc\xc9\x61\xc2\x35\xda\x4e\xcd\x3a\xcf\xda\x46\x7d\x60\x48\xae\x1f\xc2\x7c\x6a\xc5\x05\x2c\xd5\x71\xf8\xe9\x96\xc1\xb6\x5e\x96\xe1\xa2\x4d\xff\x5a\x6e\xe9\xc9\x7d\x33\x54\x3a\x61\x53\x95\x75\xb8\xfc\xe7\x50\xc4\x7e\x3f\x83\x10\x5a\x93\x72\x8a\x53\xc8\xd9\x88\xa9\x0b\xf5\x08\x35\x7a\x1e\x89\x0e\x31\xa5\x3f\x99\xc5\x5d\x04\x16\xa7\xe9\x7d\x97\x9c\x01\x1b\x42\xd9\x81\xed\x73\x6f\x44\xd9\x72\xa7\x4a\x4c\xd1\x26\x6b\xa3\x62\x6d\x1c\xb8\x1e\x0e\x95\xef\x7a\x31\x61\xf7\xee\xbb\xd9\x46\x60\x0f\xb6\xc1\x6c\x84\x4c\xee\x52\x7b\xdf\x76\x5a\x09\x90\xf5\xa3\x50\xf0\xbe\xc1\xd7\x20\x11\x9e\x03\x83\xc1\x45\xa6\x3c\xf8\x41\x4f\x64\xd6\x50\x4c\xbe\x9f\x5a\xa9\x32\x27\xdf\x4f\xfd\x0c\x31\x36\x81\xe9\xca\xfd\x2f\x32\xe5\x4f\x0f\x9d\xf2\xff\xd3\x32\x70\xbd\xcd\x57\x4e\x9c\x06\x90\xc3\x0a\x21\x3d\xce\x93\x25\x89\xd0\xee\x39\x89\xf2\xed\x1d\x63\x9e\x72\x92\x81\xb1\x34\x48\x0d\x05\x97\x31\x18\x3c\x62\x11\x41\xfc\x21\xba\xcf\xff\x37\x28\x5b\x0f\xa2\x95\xd5\xc7\x02\x43\x16\x0b\x71\xc4\x64\xea\x65\x04\x2e\xdb\xef\xfa\x98\xaf\x06\x32\xea\x4f\xa6\x68\x34\x17\x3f\x40\x58\xac\x7a\x49\xf1\xcf\x15\xc2\x2c\x6e\x31\xed\x46\x50\xa0\x45\x07\x26\xaa\x43\x4b\x22\x2d\xd2\x3e\x06\xec\x7c\xde\x64\x51\x0e\x04\xc4\x52\xb5\x01\xdb\x7e\xb1\x64\x90\x47\xe7\xb1\x88\xaa\xc1\x89\x18\xc9\x5f\x25\x5b\x43\x84\xf0\x11\x6f\x2a\x92\xee\x59\xd7\x77\x3f\x00\xe1\x2a\xe9\x64\xd9\x95\x74\x32\x15\xb6\x34\x6f\xb2\xa8\x54\x93\x11\x5d\xa8\xe4\xb9\x08\x77\xf8\xab\x78\x4c\x2f\xc4\x51\x72\x3f\x41\x26\x2f\xb2\x95\x24\x91\x42\xb2\x63\x3a\x31\x5e\x58\x53\x4e\x56\x68\x63\x33\xe6\x51\xd2\x77\x77\xf8\xe2\x20\x65\x8d\xdc\x13\x8a\x80\xa5\x10\x7b\xb2\xef\x8e\xb4\x35\x44\xcd\x11\x5f\x83\x80\x38\x6b\x57\xf6\x6c\xc9\xa9\xca\x54\xb8\x04\xf9\x86\x83\xda\xc8\xd4\x08\x17\x76\xc1\x97\x1b\x5b\x59\x40\x8f\x5a\xe7\x0a\xb9\x2e\xb2\xe8\xeb\x24\x89\xbe\x1e\x50\x84\x76\xcf\x85\xf5\x44\x8e\x73\xa5\x98\xd1\x0e\x3b\x80\x44\x07\x83\x08\xfe\x15\x81\xba\x33\x84\x1d\xd4\x2a\xd1\x9e\x90\x82\xe4\xb6\x2e\xe0\x4d\x66\x27\x22\x00\x3a\x59\xb6\x01\x95\x8a\x62\x4e\x05\x9b\xc4\x01\x56\xf5\x28\x58\x11\x49\xa2\x8a\x48\x07\xba\x53\xc9\x6b\x9b\x48\x36\x01\x44\x68\xc3\xd6\x53\xb7\xbe\x7c\xae\xa4\xfa\xe1\x32\x4b\x96\x34\xea\x1f\x94\x8b\x25\xeb\x63\x96\x3c\x8c\x56\x6f\x85\xd1\x95\x72\x03\x10\x56\xff\x0d\x42\xf8\xb9\xa8\xfb\x02\x8c\xc9\x6f\xaa\xfc\x2c\xd3\x2e\x00\x96\x8f\x7e\xef\xa0\xcc\x59\x9e\x16\xf9\x47\x42\xfb\x42\xf9\xf7\x21\xdb\x20\x02\x4e\xba\x58\xf0\x96\xb5\xe2\xac\xa4\xf9\x49\xf2\x6b\xa5\x7e\xff\x45\x66\x4c\xff\xcc\xf5\x28\x46\xd8\x9d\x55\x25\x71\x7e\xbc\xa4\xd5\x3c\xaf\x85\xd5\x84\xfc\x3b\x92\x19\x17\x57\xce\x20\xcc\x19\x83\x34\xa8\xa1\xcb\xd2\x5a\x48\x6d\xc7\x93\x33\x23\x4b\x22\x44\xe7\xc3\x9b\x4c\x31\x81\xcc\x9c\x2b\x6b\x3e\x43\x67\x3d\x11\x6a\x74\xfc\x4c\xb5\x64\x3f\xeb\x95\x5d\x16\xe0\xfc\x25\xa3\xa1\x6a\x4c\xe8\x54\x60\x91\x17\x45\x44\x10\x62\xca\xe7\x4c\x07\xef\x78\x59\x58\x19\x9f\xa9\xbf\x19\x10\x9f\x93\xd8\x8a\x11\xad\x09\x61\x52\x39\x42\x1b\xd4\x20\x65\x73\xc9\x49\x44\xd9\x3c\x4e\x8b\x22\x62\x28\x66\xe7\xa4\x14\x07\xcc\x97\x87\xe2\x99\x20\x1f\xcd\x26\xf3\x5d\xe5\x0c\x36\xc2\x10\x0e\x59\xeb\x1c\x89\x31\x26\xb2\x4e\x73\xd8\x8a\xe5\x73\x9a\x5a\x2e\xcb\x4e\x3a\xd8\x88\x5c\x5f\x33\x14\xbd\xa0\xd1\xb3\x0c\x7f\x87\x50\x83\xbb\xe2\xff\x28\x0f\x14\xab\xcf\xc6\xcd\x9e\xfa\x87\x03\xcf\x07\x59\x1f\xe1\xc7\x59\xa2\x6d\xaa\xfe\xc8\xec\x20\x49\x2d\x0f\xea\x3f\xef\xac\x0e\xb2\x08\x35\xee\x3f\x7f\x36\x32\x6e\xd2\xd4\x52\x17\x1d\x58\x48\x4f\xc8\xea\xc1\x76\x75\xff\x3c\xa5\xfb\x9c\x43\xfb\xfe\x1f\xdb\xcf\x53\x76\x1e\x9f\x16\x55\x45\xa3\xfb\xdf\xfc\x17\xfc\xa2\x69\x99\x55\xf3\x08\xe9\xbc\xb7\xc7\x66\xbe\x2f\x8b\x94\x9d\x56\x74\xee\x5e\x3e\xfc\x22\x54\xe3\x51\x1f\xe1\x77\xa6\x20\x5d\x2c\x7e\x50\x56\x67\x1c\xbb\x92\x52\xdf\xdb\x97\xfe\xbd\x2d\xaa\x33\x45\x3f\x54\x05\x89\xc5\xcf\xe6\x32\xa5\xa5\xfd\x59\xfe\xbe\xf5\x29\x7e\xce\xd9\x1d\x9a\x05\x3d\xe3\x7c\x05\x81\xe3\x7b\x65\xbe\x4a\xbb\xb3\x7d\x88\x2d\x37\xbb\xe2\xfb\xac\x93\xba\x3e\x6a\x09\x7c\x54\x32\x60\xe9\x28\xa3\x52\xc9\xfb\x66\xa4\x4f\x74\xd4\x2e\xa2\x94\xbd\x4f\xb2\x50\x3c\x0b\x3e\x8b\xdf\x21\xf5\x2b\xfe\x2b\x4b\x9e\x64\xf8\xc7\x60\x35\x75\xaf\x14\xae\x78\x92\x81\x77\x2d\xfe\x98\x05\xad\xce\xa1\x18\xd3\xe4\x8f\x32\x02\x93\xb1\xd8\x12\x3d\xd4\x48\x29\xa9\x14\xc2\x53\xf7\x7f\x29\x82\xac\x6b\x5f\x44\x66\x1e\xb7\xd7\x33\xce\xe7\x63\xd6\x70\xb2\xcb\x76\x3b\x7b\x24\x9e\xa8\x06\xff\x90\x25\x1f\x33\xfc\x7a\xa3\xd9\x7f\x14\xb3\x07\x50\xba\xb3\xee\x09\x50\x4a\x8e\x6a\xbe\xc8\x0b\x22\xb6\xfc\xe8\xaa\x9c\x25\x7f\x65\xb8\x5d\x22\xb4\xe2\x3f\x06\x8b\xca\x6c\xaf\x28\x8c\x51\x25\x74\xf2\xc3\x26\x35\x45\xa7\xaf\x33\xe1\x20\xbf\x9f\xce\xce\x09\x04\x45\xd6\xbf\x9e\x88\xa7\xaa\x39\x23\x4c\xf4\x70\x00\xa4\xf4\xbf\x14\xc8\xdf\xcb\x4d\xf4\x37\x7a\x88\xdc\x3c\xda\x30\xb3\xfe\xb2\xcc\xc8\x69\x5e\x92\xcc\x28\xf9\xff\xa8\x4a\x32\x7e\x9f\x59\x08\x9b\x81\x4a\x7b\xb1\x28\xae\x22\x2b\xc2\x0d\x1a\xf1\x9a\x2a\x10\x63\xac\x1c\x71\x9e\xe7\x33\x5a\x1d\xa7\xf5\xbb\xa8\xef\x7c\x62\x69\xfd\xae\x8f\x99\xd2\x72\xff\xee\x5e\xa7\x15\x29\xd3\xb7\x05\x79\x56\x95\x67\x47\x2c\x9d\xbd\x3b\xa6\xe9\x8c\x8c\x18\x7f\xa8\xeb\xf3\x6a\x59\x64\xfb\x55\x5a\x90\x7a\x46\x1e\x5f\x90\x52\x2a\xce\x84\x6e\x2d\xaf\xca\x11\x69\xd7\x7b\xb5\x2c\xfd\x5a\x10\x07\xca\x3c\xd1\xe7\x69\xfd\x92\x00\xd5\xf2\x3c\x95\xf3\xab\x35\x61\x60\x15\xe6\xad\xc2\xbc\x3e\x62\x7c\xb6\xfa\xd9\xae\xca\xd7\x65\x2d\x3e\x09\x6d\x35\xd8\xd8\xc8\x22\xdd\x01\x04\xfd\x0f\x54\x38\xea\x6a\x09\x76\x96\xf6\xf7\xae\xe3\x6a\x87\x0e\x3a\x10\x52\xbe\xde\xac\x2a\x4f\xf3\xb3\xa5\xb8\xee\xbd\xbd\xf2\x6c\x59\xa4\xb4\x47\xc9\xfb\x65\x4e\x49\x0d\x8d\xe3\xbf\xea\x3e\xda\x85\xbf\xd2\xba\x26\x94\xf1\x3f\x5f\x02\x3f\x96\x45\xc8\x09\x63\xb2\x0b\x81\x7c\x6b\x96\x97\x67\xc9\x10\xe7\xf1\x49\xb5\x64\x84\x26\x79\x7c\x92\x97\x25\xa1\x89\x0d\x10\x18\x7e\x70\x40\xe0\x67\xf9\x2e\x2f\xcf\xf8\x87\xa3\x05\x99\x89\x80\xc0\xa2\x85\xfa\x23\x3e\xad\xa8\x20\x74\x3b\x9b\x71\x9c\x33\x18\x40\x71\xe1\x80\xc9\xcd\xfd\xae\x69\x84\x10\xce\xe3\x9b\x41\x2c\xd9\xa2\x83\x01\x69\x55\x6d\x43\x59\x42\x71\x0e\x8a\xe4\x57\xe4\xfd\x92\xd4\x6c\xaf\xcc\xe7\xb0\xf9\x4f\x68\x3a\x27\x07\x59\x72\x77\x07\xe7\x32\xc7\x7b\xb0\x8a\x1d\x76\x45\xc8\x0d\x7e\x88\x69\xa8\x22\x26\xc9\x0f\xf1\x2c\x2d\x67\xa4\x70\x0b\xc0\x6f\xc8\x40\xca\x96\x0d\x29\x83\x01\x1b\x0c\x1c\x6b\x40\xd8\x9b\x93\x93\x1a\xb4\xc1\x27\x27\x51\xff\x05\xcd\xcf\xf2\x32\x2d\x1e\x91\x82\x9c\xa5\x8c\xf4\xd1\x14\x5c\xe0\x59\x42\x91\xe5\xd6\xbd\x51\xbb\x1c\x4c\xb2\xb4\x22\x73\xb5\x66\xdd\x23\x86\x45\xe9\x7e\x60\x49\x23\xd2\x34\x11\x5a\xb7\x6d\x41\xbf\x46\xc0\x5e\x4e\x60\x2a\x16\xe7\x35\x44\x6c\x13\x97\xee\xd5\xb2\x2c\xf3\xf2\xec\xfa\x1a\x02\x5e\xb0\x75\x07\x07\xcc\xf1\xba\x83\x65\xeb\xa6\x27\xec\x22\x7f\xc0\x02\x9f\xc6\xa7\xe9\x3b\x72\x5c\x2d\x00\xd2\x38\xac\x43\xe7\xfe\x47\x71\x9d\x68\x55\x19\xe4\xaa\xcb\xa2\xbe\x5f\xbb\xaf\xfa\xbe\x01\xf8\x7e\xce\x44\x12\xa9\xd0\x3e\x70\x84\xf6\xcb\xda\xf2\x9d\x46\x99\xae\xc1\x68\x8d\xfc\x87\xdf\xcd\xd6\xfc\xe3\xbc\xbc\xa8\xde\x01\xb5\x2f\x46\x15\xf6\xd8\xbb\x4c\x5d\x52\xe6\x5c\xd2\x55\xc9\x0f\xba\x9f\x0a\x1c\xd5\xc7\x0b\xc1\x4b\xe6\xa4\x1e\xad\xf2\x5a\xa2\x2e\xbe\x25\xa3\xad\x61\x83\xab\xf2\x00\x7a\xe7\x03\x49\x47\x64\x69\x1f\xcb\x37\x81\x5e\xa9\x37\xf5\x37\x41\xfe\xc8\xb9\xc0\xd6\xa9\x8a\xda\x24\x31\x62\x1b\x60\x80\xc1\xa0\x4f\xf4\x5e\x27\x49\x92\x82\xd4\xf7\xfa\xda\x6f\xdb\x46\x09\x48\xf2\x30\x4b\xa0\x77\xf5\xcc\x9d\x59\xe3\x6a\xed\xbc\x23\x53\x4d\xcf\xfa\xe6\x81\xfd\x71\x9f\xa6\xb5\xd8\x2e\x65\xb5\x0d\x4c\xdd\xb9\xf8\x1a\x41\x7a\x78\x9a\x88\x38\x54\xfd\xb9\x7a\xc6\xfb\x49\x52\x4a\x13\x92\x71\xc4\xe2\x93\xe0\xcb\x58\xc6\xba\xbe\x04\x30\x00\x23\x34\xea\xcf\xd3\x76\x3f\x20\xf4\x08\x3e\xbf\x65\xac\xeb\x73\x92\x96\x4f\xb9\xcc\x0a\x02\x8f\x9a\x3d\xed\x88\x4f\x5b\x97\x88\xa9\xb3\x98\x2e\xcb\x17\x4b\x56\xe7\x19\x91\xd0\x02\xe4\x0b\x53\x2f\xa9\xb0\xa9\x29\x91\x88\xea\x80\x9a\x28\xd7\x31\x6f\xf3\xfa\xa0\xb4\x20\x4c\x73\x5e\x5b\x9c\x15\x75\xc8\x9c\x33\xc2\xa2\xbe\x03\x8e\x7d\xdd\x8b\x78\x3e\xfd\x9e\xf2\xd3\x68\xeb\xf7\x2c\x6e\x0d\xd1\x7e\xb4\x1f\x7f\x58\x80\xb1\x50\x8f\x55\xbd\xb7\xa4\x97\x9b\x07\x9b\xb7\xc0\xbd\xb7\x4b\xd6\xcb\x59\x2f\xaf\x7b\x65\xc5\xb6\xfc\x71\x0f\xab\xd0\xd0\xb7\x1f\x59\x9a\x38\x77\x8f\xce\x47\xa6\x4b\x5f\x9b\x21\x94\x8a\xe2\x3e\x9b\x52\x5e\x11\xa0\xab\x2d\xb8\x37\xf5\x41\x58\x1f\x40\x71\x87\xf0\xf6\xc3\x87\x51\xaf\xbf\x9d\x63\x86\x7f\xca\xf0\xaf\x15\xfe\xb5\x12\x46\xcd\x5a\x55\xa0\x46\x49\xdd\x88\x95\xa5\x7c\x1f\x45\x19\x67\x36\x97\xe5\x8f\xcb\x94\x66\x24\x5b\x3f\x7b\xb7\x52\xd3\x06\x2c\xdf\x4c\x0f\x08\x21\xb1\x6e\x6d\xd2\xfb\x53\x96\xac\x2c\x86\x1e\x6e\x04\x3f\x92\x61\x22\xe2\xef\x03\x1d\x35\x18\x6c\xb1\x20\xb5\x09\x05\x8a\xd2\x44\x7c\xb5\xa6\xd1\xf6\x36\x66\x2d\xca\x52\x82\xb7\xe3\x9f\x08\x12\x79\xd5\xea\xee\x5d\xdc\x31\x96\xec\xbe\xfb\xfe\x88\x59\x58\x23\xd8\x68\xc8\x22\x87\x1b\x4b\x99\xf7\xb3\x30\x17\xe8\x20\xa5\xb7\xba\x70\x09\x3c\x85\x37\xa3\xe3\x0d\x11\xef\xcd\xef\xba\xed\xba\x22\x67\xec\x6c\xb3\x5a\x1d\x20\x2d\xb3\xd4\x1d\x38\x01\x45\xf6\xbb\x3b\xa3\x1d\x4d\x96\x6e\x7f\x77\xef\x0a\xb4\x28\x59\x20\xb2\x0c\x31\xb8\x6b\x39\x8f\xb5\x3c\xcb\xcd\x6c\xc9\x5a\x96\x24\xc8\x8e\x84\x58\x91\xd0\xe5\x97\xec\xa1\xba\x2d\x1d\x97\xcc\xab\xd5\x7d\xa7\xa2\x00\xe2\x08\x75\x02\xb1\xd3\xe9\x72\x03\xc9\xf1\x89\x60\x24\x74\xb4\xc0\x85\xd8\xc6\xfd\x6a\x59\x32\x65\xe6\x7c\x92\xd7\xc0\x16\xb8\xbb\x78\x92\xe5\xd9\xaf\x15\x7d\x67\x99\x4b\xa7\x45\xf1\x36\x9d\xbd\x33\xa6\xd5\xcc\xe3\x57\xec\x80\xd1\x97\x9c\x95\x92\x6b\x04\x48\x06\xef\x48\xc0\x15\x46\x0a\xdc\xea\xa0\x93\x33\x07\x95\x6a\xfb\x49\xf2\x39\xa6\x3e\x7f\xe1\x82\x63\x3b\xfb\x61\xc3\xb0\x6f\xf6\x6e\x66\x67\xb6\x20\xbc\x53\x3b\x4d\xa3\x3c\x12\x64\xb7\x61\x54\xe2\x0f\x7d\xb4\x66\xe0\xdf\xb3\xb8\xeb\x5d\xc3\xbf\x66\x76\x77\xe1\x53\xa3\xcb\x72\x5f\x9d\xd3\xc1\xe9\x2b\x92\x66\x57\x9c\x12\x6d\x1a\xfe\x9f\xbc\x9c\x51\x92\xd6\x44\x5e\x26\x89\x1a\x00\x18\x7c\x8b\x69\x1b\x50\xb6\x93\x1d\x1f\x26\x86\x01\x78\x6a\x32\xb2\xae\x7b\x6d\x41\x64\xb7\xb9\xab\xbb\xb6\xbf\xfe\x73\xd8\x7e\xab\x65\x79\x2f\xad\xaf\xca\x59\x4f\xb2\x86\x75\xef\x2d\x29\xaa\xcb\xde\x47\x42\xab\xbe\x9f\x28\x27\xb4\x13\xa1\x69\x2b\x04\xe2\x6f\x81\xbd\xc1\x83\x81\x4e\x56\xe8\x34\xe6\xcf\x95\x7d\xb8\x21\x4c\xd5\x84\xa7\x62\x25\xe1\x51\xe3\x23\x75\xc2\x60\x03\x35\x34\x49\xef\x54\x63\x37\x5e\x06\x6b\x15\x2f\xaa\x45\x84\x76\x41\x32\xa7\x9d\x6e\x62\x26\xfe\x3a\x00\x15\x5b\x56\x95\x64\xff\x6d\xe4\x1c\xa7\x72\x1e\x31\x37\xbe\x41\x26\x52\x19\xd3\x66\x93\x72\x65\xfc\xce\xd5\x91\x8a\xb9\x6c\xb0\x82\x3f\x19\xe9\x58\x40\x92\x87\x5b\x24\x5e\x2e\xb2\x94\x91\xfd\xb7\xd7\xd7\xd6\x8f\x88\xa1\xeb\xeb\xc8\x99\x2e\xb1\xa7\xbb\xb5\xa3\xbd\xaf\x0d\xe4\x35\x4d\x6b\x2a\xce\xb9\xf9\x38\x65\x1c\xfc\x6a\x28\x6e\xe9\x27\x91\x3c\x8c\x56\x75\xb5\xa4\x33\x32\x62\xb1\xf8\x03\x83\xcd\x75\x5e\x95\xcf\x64\xf0\x81\x91\x0c\x53\x69\x7d\xc2\x59\xca\xd2\x91\xb0\x1e\x69\x10\x1a\x4d\xa6\x4d\x9a\x65\xea\xb4\xd5\x4b\x20\x8c\x76\xee\xee\xec\x92\xc1\x80\x40\xcc\xc6\x3c\xb1\x1c\xa3\xac\x5b\x7d\xe3\x76\x32\x4e\x9a\xe8\x3d\x02\x93\x29\xcc\xdc\xf3\xc4\xe1\x03\x43\x0d\xc4\xb3\x68\xc1\x0c\x44\x38\x13\x70\x31\x62\x58\x77\x3d\xca\xb1\x3a\x27\xd0\x72\x5d\x9e\x13\x89\xb9\x2c\xf3\x2e\xaa\x2e\x80\xbf\xbf\xad\x0b\xfc\x15\x9f\x45\x8f\xc9\x2a\xbd\x8f\x55\x49\x38\x49\x2f\x65\x72\x59\x8f\x77\xdf\x5b\xa4\x75\x0d\x97\xbc\xec\x89\xb1\x7b\x6a\x9e\x9c\x44\xb7\x66\x80\xe2\xde\x41\xdd\xeb\x7f\x14\x82\xbc\x7b\x8b\x62\x79\x96\x97\xf5\x3d\x3e\x8b\xbb\x6a\x8c\x7e\xaf\xa8\xd2\x8c\x64\xe3\xaf\x24\xac\xb6\x0f\x66\x2d\xd2\x34\x1b\xb8\x29\xa2\x04\x0f\x9a\x97\x2a\xdc\x89\x4b\x06\x4c\xa6\x9f\xa4\xba\xfb\x3d\xfb\x44\xc5\x1d\xce\xd7\xd1\x07\xea\x39\x4c\x8d\x72\xda\xa4\x1d\x2d\x96\x31\xe4\x5f\xfa\x35\x2f\xb3\x4a\xa6\x3b\x68\x94\x97\xbb\xa5\xce\xb6\x53\x4b\xd8\x1d\xc5\xca\xb3\xa6\x59\x96\xc1\x66\xc1\x46\x2a\xab\x9f\xd3\xaa\x28\xac\x86\x75\x70\xda\x3a\x47\xec\x19\x61\xc7\x84\x3f\xea\x79\x91\xb3\xab\x76\x16\x78\xbb\x8d\xf0\xaa\x32\x11\x78\xf7\x8a\xc2\xb4\xcd\x6d\x2f\x2d\x2b\x7e\x4e\xa0\x9f\x8b\xb4\x58\x12\xb8\x5b\xa2\x13\x2b\x42\xda\xc6\x7d\x40\xca\x28\xc1\x5a\x64\xd6\x02\x0e\xca\x63\x4a\xe0\xae\x25\x5b\x26\xa4\x65\xb1\x8c\x3b\xea\x41\x90\x0e\x30\x2c\xfc\xd7\xa8\x5d\x00\xaa\xca\xe5\xca\x01\x15\xb4\xea\x5e\x86\x45\x12\x7b\xe9\xa3\x52\xe0\x18\x8a\x65\xc2\x80\xb2\x2d\x96\x00\x8a\xe5\x12\xd7\x4b\x4e\x6a\x54\xcb\x64\x6b\xc7\x70\x94\xb3\xa5\x78\x3c\xab\x65\x9b\x4a\x90\x99\x71\x84\x5a\xa5\xb7\xa0\x55\xd6\x9b\x57\x19\xe9\xa5\xa7\x8c\xd0\xde\x42\x29\x7a\x6b\xc2\x96\x8b\xb8\x8f\x76\xf9\x00\x3b\x30\x68\xb6\x94\x52\xde\xe5\xd2\xa8\xba\x8b\xa2\xba\x7c\xbe\x2c\x58\xbe\x28\xc8\x31\xdf\x14\xad\x17\x3d\x5f\x76\xe9\x45\xd3\xb9\x26\xb7\x61\x1f\x13\x62\xad\x74\xb1\x94\xae\x1e\x93\xa9\x31\xc8\xf9\x53\x29\xa0\x47\xbd\x3b\x2b\xd2\xfc\x89\x4b\x35\x03\xed\x01\x1c\x11\xde\x22\x79\x28\xe3\x64\x9d\x2e\x85\x59\xc3\x56\x7a\x7d\x9d\xea\x40\x2d\x00\xd5\xcb\x25\x3c\x9b\x90\x0e\x92\x45\x54\x25\x3e\x22\x48\xfd\xa5\x95\xf6\xa5\x89\x83\xb2\x35\x6c\x90\x63\x79\xc6\x92\xcd\x5b\x9a\xd0\x2a\xaf\x53\x53\xd0\x57\x9b\xdd\x6f\xd0\xae\x23\x8c\xce\x4f\xa3\x6c\x39\x18\x6c\x65\x4b\x3b\x06\x09\xff\x19\x5a\x48\x20\x3d\x04\xa1\xfc\x5d\x28\x7b\x6f\x49\xaf\x2a\x8b\xab\x1e\x7f\x4a\xd4\x68\x71\x4f\xba\x8f\x43\x7e\x0c\x95\x46\x0d\xaa\xb0\x4a\xe6\x8d\xea\xa5\xd0\x1f\x7f\x3b\xfa\x68\x37\x5b\xca\xf8\x8d\x67\x4b\xb4\x6b\xfc\xa9\xf8\x97\xe3\x4c\x06\x65\x83\x38\x5f\x5e\x24\x94\x26\x2a\x0b\x15\xb5\x7a\xa5\x63\x5c\x81\x3c\x7f\x4e\x46\x79\x63\x1c\x9b\x42\x32\x7a\x7d\x82\x01\x2d\xd6\x61\x65\x20\x95\x7c\xc8\x6b\x56\x6f\xf5\x65\x65\x77\x8b\x44\x54\x94\xc0\x1e\xed\x99\x0e\x2e\x73\x76\xae\x93\x44\x91\x92\x79\xba\xb1\xf3\x94\xd3\xd0\xa4\x94\x5b\x93\xc5\xbd\x97\x05\xa7\xe1\x55\x0e\x9d\x5e\xce\x7a\x60\x80\x17\xf7\x1d\x5f\x72\xc7\x7e\x79\x69\x50\x5d\xeb\x64\xc7\xd9\x52\xd8\x06\x73\xc8\x3d\xdb\x88\x67\x35\x81\x87\xe4\xfb\x2c\xc2\x95\x58\x2e\xbd\xb2\x77\x65\x93\xd1\x2e\x01\xcb\xa7\x46\x87\x0c\x72\x4c\x15\x5c\x6b\x40\xd7\x46\x50\x44\xf1\xd5\x96\xca\xfd\xb2\xaa\x16\x7d\x4e\xf9\x83\x33\x0f\x59\x8e\x22\x45\x73\x88\xaf\xd2\x0d\x1b\x9e\x12\x72\xd9\xfb\x3d\xeb\x50\xe9\x46\x15\x60\xb2\x7a\x89\x36\x51\xec\x6e\x6d\x49\x13\x51\xa2\x06\x20\x71\x69\xa4\x82\xb2\x6d\x5e\x9e\xf9\xbd\x05\xd4\xbf\xdd\x7d\xf1\xca\xa6\xa7\x06\x61\xda\x44\x64\xac\x4a\xa5\xe9\x35\x5e\x05\x07\x1e\xc1\x8d\x08\x16\x5d\x5f\x6f\xed\xe0\xc0\x08\x76\x13\xa7\x80\x37\x68\x10\xce\x13\x13\xbe\xe9\xf7\xcc\x20\x12\xda\x98\xc0\x1d\x46\x7c\xa0\xe4\xa9\xc1\x3b\x98\x63\xe1\x1a\x32\x92\x06\x54\x02\x9c\xc4\xc5\x64\x56\xf0\x1b\x40\xd6\x0d\x04\x61\x57\xbd\x94\x08\x17\x89\x87\x52\x9f\x96\x12\x0d\xf0\x2b\x58\x04\xef\x2b\xfc\x25\xa3\x6e\x02\x69\xaa\xef\x9f\x0c\x12\x14\xfd\x40\xab\xcb\x9a\x50\x19\x5d\xb6\x97\x97\xb3\x62\xc9\x89\x53\x73\xad\x68\x97\xf8\xc0\xa0\x64\x25\xd2\xf7\x45\x07\x8c\xbf\x0c\x8e\x6e\x80\x71\x96\x7f\x37\xb5\x22\x88\x41\x57\x57\xcb\xc8\xb9\x52\x38\xe5\x4c\xa1\xeb\x22\xcb\x41\xc1\xba\x15\x20\x85\x32\xb1\x34\x48\x92\x9b\x10\x1a\x60\x56\x07\xb1\x7f\xc0\x53\x02\xb8\x18\xbe\x39\x5d\x4b\x61\xce\x1c\x21\xba\x5e\x83\x46\xa4\x91\xed\xd1\x27\x34\x6f\xa2\x02\x53\xec\xec\x93\x77\x7c\x1f\x32\x23\x19\x88\x5b\xb6\x8b\x92\x27\x56\x76\x23\xda\xfc\x23\x7a\x57\x47\x5e\x47\x87\x19\xfe\xa3\x46\xd7\xd7\x7f\xd4\xc8\x41\x4c\x8f\x2a\x6d\x25\x16\xa5\x08\xa7\x08\xf6\xd0\xc7\x3e\x40\xc9\x99\x67\x9f\x26\xf3\x65\xb4\x6a\xac\xa0\x85\x5d\xf1\x16\xa5\x81\x94\x89\xfa\xee\xdb\xb8\xe4\xa8\x89\x86\x78\x88\x95\xb9\x21\x7f\xa0\xf8\xf4\x3a\xd1\x1f\x45\xa8\x09\xcc\xdd\xf1\x27\x76\x56\x7e\xb1\x94\x66\xee\xa1\xf0\x6c\x3a\x00\x26\xea\x28\xb7\x1e\x4e\x62\x26\x05\x89\x0e\x75\x94\x4e\xa6\x83\xa6\xc5\xe5\x99\x35\xa9\x76\xfc\xad\xe3\x73\x1d\x79\x0b\x12\xc0\x9b\x86\xd6\x63\x82\x9a\xde\x25\x7f\xd9\x54\x37\x0b\x92\x69\x55\x4e\x56\x11\x50\x25\xf5\x84\x49\x18\xe9\xf5\xff\xcf\xa1\x34\x66\x33\xb3\xeb\xf7\x4c\xa4\xc8\x5e\x59\xd1\x5e\xda\xeb\x3b\x13\xeb\xf7\xe6\x84\x9d\x57\xf6\x83\x79\x9a\x97\x04\x28\x8d\xea\x94\x53\x1f\x35\x89\xff\x44\xbb\x5d\x0b\x33\x31\x3b\xe4\x55\xd4\xae\x96\xed\x60\x6a\xad\xf7\x4e\xd7\x0d\xc7\x25\x74\x9f\xd1\x50\x86\x3b\xfd\x4c\x06\xe9\x2b\x83\xbd\x38\x79\xa0\x52\x70\x01\x99\xa0\x1b\x9a\xac\x5b\x6a\xfe\x32\x08\x83\x43\x27\x99\xc0\x72\xa8\xe3\xe9\x0e\x07\x98\xb3\xdf\xf1\x61\x57\x4e\x3f\xaf\xe6\x27\xf1\xd7\x65\xf1\xa9\x86\xb1\xc6\xf9\x68\xe9\x58\x98\xbb\xbe\x81\x80\x1e\xa5\xb5\xe1\x7c\x89\x99\x4e\x14\x9c\xd6\x75\x7e\x56\x46\xee\xaf\x55\x03\x51\x65\x45\x72\xd4\x8b\xb5\xc4\x12\xe8\x07\x20\x46\x97\xd8\x86\x8f\xb6\x98\x5f\x53\x50\x2a\xce\x23\xf9\x30\x23\xe0\x9a\x27\xdf\x28\x1d\x46\xb3\x33\x7c\x63\xad\xbb\xca\xd9\x11\x4b\xd9\xb2\x4e\x2a\x3f\x44\x63\x80\xfe\xba\xc8\xc9\xa5\xf5\x93\x0a\x0b\x8a\xe3\x7c\x66\x29\x12\x6a\x57\x66\xed\xc4\xda\x0c\x04\x96\xb4\xba\xf3\x75\x38\x47\xe2\xd9\x82\x95\x25\x66\x1f\xda\x4a\xc2\x35\x42\xfe\x8f\x52\x70\x6f\xab\x25\xf2\xd9\x3b\x29\x35\x97\x1c\xc1\x39\x60\xe1\x3c\xbe\x32\xa6\xdb\x6a\x19\x56\x2f\x46\x69\xb6\x65\x7d\x0d\xc9\x84\x3b\x6b\x68\xe5\x17\x76\x67\x17\x54\x2b\xc8\x78\x47\xd6\x6c\xf8\x73\x66\x02\x61\xc0\x53\xbe\x70\xa6\x0e\xfe\x52\xbb\x37\xf7\x4d\xdc\xed\x6c\xa9\x2c\x36\x56\x56\x6c\xd9\xd3\xfb\x12\x1b\xa3\xbd\xac\x2d\x30\x12\x1b\xb1\x35\x94\x2f\xaf\x89\x37\xea\x2c\x22\xa0\xf2\x71\x97\xe1\xaf\xc1\x9d\xba\x37\xec\xce\xe6\x27\x04\x86\x17\x48\xc7\x4e\x12\x1b\xec\x52\x5d\x98\xfa\x81\x4a\x24\x7a\xd5\xea\x4d\x8d\xc9\x20\x75\xac\x8c\x89\x70\xb8\x9c\xbf\x25\x34\x7e\xf9\xe2\xe8\xe0\xf8\xe0\xcd\xe3\x93\x83\xc3\x27\x07\x87\x07\xc7\xbf\xcb\x60\x12\xb8\x4e\xd8\x84\x19\xbf\x25\x35\x81\x21\x2e\xe3\x9f\x51\x54\xa3\x71\x04\x9e\xd7\xd5\x02\x08\x21\xf9\x90\xef\x0c\x06\xfd\x12\x3a\xb6\x62\x60\xd9\xdd\x80\x79\x9b\x6c\x86\xd0\xa8\x55\xb9\x76\x2a\xe8\xe4\x3f\x83\xc1\x8e\xe3\xe2\xc0\x26\xc3\xa9\x15\x44\x2a\x8f\xaf\xc6\xfc\xd3\x28\x1a\xe2\x34\xfe\x09\x45\x04\x45\xd1\x10\x17\x71\x89\x24\xcd\x12\x9d\xe3\x05\x84\x9d\x03\x71\xfd\x10\x67\xf1\x07\x14\xa1\x28\xe8\xb2\x6a\x23\x7e\xc9\xd5\x25\x7d\xf5\xd1\x5a\xd7\x98\xb5\xfd\x15\x7a\xac\xd1\x26\x7f\x12\x41\xeb\x9c\xcf\xb3\xf8\x10\x99\xdc\x05\x42\x51\x90\x80\x89\xe4\x12\x6a\x2a\x7b\x78\x8a\xf3\xa6\x89\x96\x88\x93\x39\xc8\x22\x06\x75\x04\xbf\x2d\x1f\xbf\x02\x1d\xda\x29\xd2\xd2\x1d\xf4\xd2\x9a\x53\x17\x94\xf4\x38\xed\x52\xb3\xbc\x28\x84\x52\xec\x9c\x56\x65\xb5\xac\x7b\xb9\x45\xdf\xf6\x24\x02\x8e\x7b\x9a\xf0\xb0\x09\x9b\xbc\x04\x31\xc9\x9f\x0e\x65\xf2\xa7\xa4\x6c\x24\x19\x03\xb9\x7d\x25\xc5\x15\x4b\xef\x07\xbe\x99\x4e\x00\xb0\x1f\xaa\xb1\xe4\xb6\x3a\x5f\x94\xb8\x3b\xa7\x4b\xe8\x1d\x90\x1e\x35\xee\x57\x63\x89\x19\x4c\x6a\xee\xe5\x15\x69\x22\x8a\x34\x87\xee\xbc\x8b\x32\x1b\x19\xc2\x26\xbb\x4e\x54\x16\xf1\xe1\xeb\x67\xcf\xf0\x64\x8a\xc9\xf5\x35\xd5\x61\xdf\xc1\xa3\x30\x29\x75\x04\x6a\x69\xef\x28\xa5\xbc\x90\xa6\xc3\xe9\x96\x2e\x75\xbe\x8e\x62\x30\xf0\x0a\xf3\xa5\x89\xf0\x3f\x18\x40\x7a\xab\x90\x84\x3c\xc5\x05\xc2\xa5\xcf\xbc\xc1\x1a\xac\x08\x37\xa5\x0e\x14\x8d\xb0\x62\xec\xcc\xe1\xe2\x12\x61\x18\x20\x2c\x84\x4f\x91\x56\x5e\x17\x55\x9a\x99\xc4\x6f\x25\xc2\x65\x23\x5e\x40\x43\x2f\x5a\xef\x78\x40\xda\xe4\x64\xa1\x85\xd7\xb3\x97\xd7\xa0\xba\x21\x59\x8f\x92\xd9\x92\xd6\xf9\x05\x29\xae\xfa\xc2\x7e\x29\x40\x1a\x0c\x8d\xc3\xb0\x00\x3b\x4d\x4b\x20\x4e\x43\x3a\x39\x59\x25\xb7\xc8\xd0\xea\x46\x04\x1c\x26\x7e\x3c\x46\xd9\x32\xea\x09\xd0\x2c\x8d\xcc\x69\xdb\x8a\xb8\xb4\x6b\x4d\xd2\xa4\x54\x8b\xfd\x0c\xb8\xa0\x3c\x71\xc3\x12\x99\x2e\x34\x3b\x0e\xbd\x40\xc4\xc8\xb8\x9d\xa0\xb7\xf1\x4e\x48\xbb\x05\x5a\x13\xb3\x40\xc1\x22\x61\x7c\x4a\x4a\xf1\x0d\x38\x70\x1d\xde\x41\x0e\x6e\x9d\x28\xbf\x83\xd2\x33\xe4\x3d\x49\x1e\x42\x86\xc6\xa6\x3c\x7b\xa1\xe1\x54\x9d\x89\xd8\x95\xcd\x38\x82\x75\x44\x9d\xf7\x28\x72\x46\xe0\x02\xf2\xac\x05\x34\x71\x62\x4c\x19\xcd\xe6\x13\x75\x6d\x58\xb0\x04\xfc\x9f\xa7\x25\xfc\xf3\xbe\x82\x7f\x3e\x7c\xaa\x1e\xce\xf0\x09\x57\x4b\xdf\x0f\x59\xe5\x6c\x23\x48\x66\xf8\x66\x71\xbd\x80\x3d\xa3\x78\x47\xd9\x4b\xbd\x5d\xaa\x34\xa5\xfb\x4b\x95\xa6\x74\x6f\x99\xac\xe4\x98\x2f\x53\x76\xfe\x92\x92\xd3\xfc\xc3\xa8\xaf\x73\x49\xf1\x8f\x47\xcb\x53\xf8\x18\x97\x67\xf2\x6b\x5f\xf8\x1b\x1d\xdd\xc0\x57\xe8\xd8\x6e\xc2\x29\xc8\x88\x61\x85\xe4\x38\x21\xd7\xd7\x7b\xcb\x86\x83\xa4\xaf\x63\xe3\xdf\xf6\x4a\x80\xd4\xbc\x00\x55\x5e\xeb\x0b\x7f\x8b\x27\x04\xe7\xd3\x44\xac\x95\x45\xfd\xff\x65\x44\x60\x26\x8e\x26\xa8\xc8\xfb\x99\xf0\x4c\xeb\x23\x4c\xa3\xef\xbf\xbb\xff\xcd\x37\x9c\x28\x30\x42\x8e\x49\x3e\x35\xbf\xde\x2c\x65\x94\x08\x4f\x0a\xa2\xd7\x11\x70\x95\x02\xf8\xe5\x73\xb4\xf2\x8b\x05\x27\x88\xcb\xa4\x7f\x78\x26\x6b\xf5\x6f\x9a\x2e\xaf\x6d\xcf\xd9\xde\xbe\xb8\x75\x6e\xdb\x64\xbb\xab\x82\x38\x43\x67\xc5\xdb\x65\x70\xcd\x9f\x04\xf0\x77\x04\xc0\xef\x2f\x3f\xdd\x3d\xd4\x38\x7b\x2f\x2d\xb3\x80\x2d\xd6\x96\xdb\x48\x3a\xe6\x34\x2f\xb3\xde\x57\x77\x56\xb4\xf9\x8a\x93\x1f\x5f\xdd\x59\x91\xe6\xab\x3f\x8d\x84\x4e\x42\xf8\xc9\x32\xe8\x2b\xb8\x2c\x8a\x06\x3f\x5d\x26\x8b\xa5\xf0\xc9\xea\xcf\x2a\x4a\xfa\x56\xe0\xff\x17\x96\xe4\xb8\xbf\x2c\xdf\x95\xd5\x65\xd9\xb7\x54\x54\x67\x4b\xe9\x74\x5a\x16\x53\xeb\x73\xbe\xd4\xbe\xa8\xe6\xe3\xcb\x4c\x7f\x9c\x22\x7c\xb9\xb4\x04\xd4\x17\x4b\x3e\xcc\x3e\xbf\x40\xfc\x6f\x51\xed\xf7\x0c\x97\x05\x7e\x5a\xe2\xf7\x15\xfe\x90\xd9\x3d\xfd\x30\xd3\x55\xa6\x41\x4f\x59\x4d\xd0\x4f\xa6\x46\x56\xd9\xc5\x76\x81\x75\x10\xd1\xb6\x40\x44\xd0\xd9\x91\x2b\xb7\x45\x2b\x62\x82\x77\x59\x53\xf9\x90\x99\x99\x7f\x50\x0b\x84\xc4\xdb\x4f\x28\x7e\x96\x4d\xed\x69\xdf\xb1\xea\xde\x31\x9b\x81\x1f\x67\xa6\xce\x7c\xb6\xd6\xf5\xb7\xf7\x74\xd6\x04\xb6\xf6\xea\x86\x56\x97\xc1\x56\x87\x61\x37\x63\x03\x1f\xef\xea\x88\x25\xec\xfa\x3a\xe4\x07\x74\x07\x82\xea\xe4\x1f\xc9\x60\xa0\xff\x14\x81\x76\x88\x14\xe9\x36\xf6\x6e\x3c\xa2\xd1\x61\x26\xe2\x64\x3d\xa1\xf0\xcf\x5f\xd4\xd9\x9c\x57\x36\xa4\xbd\x3e\x7a\xd4\x6f\x44\x8e\xa3\xe7\x37\xe8\xb8\x3e\xe9\xa6\x5e\x2c\xed\x0b\x3a\xaf\xb2\xa4\x60\xd1\x8a\xaf\x6c\xc4\xf8\x5d\x94\x05\x79\xf9\x57\x72\x69\x6b\x42\x2e\x97\xea\xa6\x36\xf8\xc1\xb7\xff\xf8\x7e\xe4\x0b\x99\xfb\xcb\x9a\x33\x11\x34\x9f\xb1\xfe\x2e\x8d\xb3\x88\xe0\xd5\xaf\x45\xe0\x44\xce\x1b\xfc\xe4\xaf\xc0\xf7\xb3\x06\xbf\x20\x81\xef\x17\xac\xc1\xfb\x8f\x03\x05\x4f\x58\x83\xdf\x2f\x03\x05\x29\x69\xf0\xe1\x41\x68\x08\xd6\xe0\x50\x83\x8f\xac\xc1\xb3\xcb\x40\xc1\x9c\x35\xb8\x3e\x0b\x14\xbc\x64\x0d\xfe\x30\x0c\x14\xbc\xe2\x43\x7c\x13\x28\xc8\x49\x83\xcb\x47\x81\x02\x42\x1a\x7c\x14\x2a\x78\xdb\xe0\xfd\xd3\xc0\xf7\xab\x06\xff\xf4\x3a\xf0\x3d\x6b\x70\x1a\x1a\xf9\x63\x83\x7f\xfa\x29\xf0\xfd\x75\x83\x7f\x7a\x16\xf8\x7e\xa7\xc1\x4f\x02\x9f\xf7\x59\x83\x5f\x94\xa1\x2b\xc6\x1a\xfc\xfc\x7d\xa0\xe0\x0d\x6b\xf0\xef\x87\x81\x82\xf7\xac\xc1\x97\x6f\x02\x05\x1f\x58\x83\x4f\x02\xdf\x8f\x59\x83\x5f\xff\x16\x28\x28\x49\x83\x7f\xf9\x47\xa0\xe0\x37\xd6\xe0\xc7\xa1\x55\xdf\x61\x0d\xfe\x39\xd4\xe2\x27\xd6\xe0\x77\x21\xa8\xd9\x6b\xf0\xc9\xef\x81\xef\xcf\x79\x4f\x34\x50\xf0\x0b\x6b\x1a\x04\x01\x54\xf2\x84\x46\x3b\xc3\x6f\x1f\x7c\x0f\x0c\x62\xf4\xe0\xbb\x6f\xbe\x7b\x20\x82\xef\x7e\xff\xf5\xd7\xc3\xfb\x08\x17\xfc\xeb\x37\xff\xf8\xe6\x3b\xc8\x35\x1c\x7d\xf7\xdd\x70\x78\x5f\x70\xc6\xd5\x66\xb4\x15\x95\xe9\xe2\x34\x6d\x25\x23\x01\xbe\x22\xa7\x4a\x66\x5b\x49\x55\x6e\xc2\xc0\xe3\x4c\x7e\x3b\xae\x96\xb3\x73\x92\x09\x1f\xbf\xa6\xa9\x09\xd3\x09\x4b\x03\xdd\xc7\x4e\xb9\x37\x90\xc7\xc8\x32\x91\x27\x5d\x70\x8a\x2f\xd4\x40\x9a\xd9\x30\x43\x33\xab\x96\x98\xa2\x55\x49\xcd\x59\xc4\xbf\xad\xf9\xf3\x95\x1d\x31\x99\x89\x04\xea\xd8\x53\xea\x67\xb2\x0a\xb8\x48\xdf\x1a\x31\xe6\xf1\xef\x0f\xbe\x8d\xf2\xf8\x97\xfa\x2f\x84\xd5\x8f\xa3\x1f\xde\xdb\xb8\x32\xcb\x69\x92\xc7\xc5\x8f\xf7\x6d\x74\x09\x06\x72\x5e\x0a\x7f\x1d\x82\xbe\x5a\xad\x9d\x88\x7c\xa9\x5b\x5a\x3b\x6d\xdd\xc4\x27\x17\x91\x24\x8f\xcb\x6f\x3e\x82\xf4\x27\xa2\x60\x66\xd5\x44\xa8\x7b\x56\xf8\x94\xa4\x6c\x49\x49\x3d\x9a\xe4\xf1\xfb\x17\x7f\x4d\x3d\xff\xf6\x4c\x4a\x71\x5f\x14\x2f\xa3\xfe\xe1\x19\x3c\x3b\x7b\xb3\x19\xa9\xeb\x8a\xf6\x11\x5e\x9a\x58\x1c\xf0\x2c\x3d\xfe\x00\xc1\x96\xcf\x46\xd1\x10\xe7\xf1\x8f\x8b\x19\x82\xb5\x9e\x23\x3c\x5f\x16\x2c\x1f\x6d\x0d\x05\x2f\x70\xde\xb1\x07\xb3\xd5\x25\xcd\x99\x78\xdd\xc2\x27\x37\x3b\x27\xb3\x77\x9b\x1c\xdc\xdf\xb4\x5f\xb5\xc9\x2a\x3b\xe9\xe7\x22\x80\x4f\x9f\x97\xf5\xb1\x98\xdb\xdb\xea\x43\x1f\xf7\x4f\x2b\x3a\xdf\xaf\x4a\x46\x2b\x88\xa7\xd7\xc7\xfd\xfe\x14\x6f\xd8\xe0\xe6\xca\x10\x04\x83\x88\x8a\x53\x6c\xe7\x6c\xf3\x32\xe0\xec\x0c\xd8\x60\x90\xc7\x87\xd9\x4f\x7c\xe7\xf8\x15\xe9\xe3\x00\xfd\x42\xf4\x0d\x8a\x58\xcc\x52\x7a\x46\x58\x2c\x37\x1a\x35\x28\xea\xbf\x2d\x96\xd4\x6a\xe8\xb4\x53\x17\x16\x35\xa8\x71\xa0\xe9\xe4\x87\x32\x9a\x2c\xa7\xfc\x86\x04\x00\x6b\xb1\x19\xe4\x9c\x59\x90\x83\x4f\x6d\x60\x04\xb9\x44\x9d\xf3\x09\x81\x25\xc8\x73\x11\x3e\x04\xcc\x7d\x3a\x6f\x58\x4b\x95\xa5\x52\x3c\x40\xfa\x4c\x4b\x90\x28\x3a\xe6\x7d\xba\x2a\xab\x5a\xf8\xe5\x4a\xd9\x72\xb0\x81\x09\x4a\xee\x75\xb4\x65\x6d\xa0\xb2\x19\x00\x91\xf8\x7b\x14\xa1\xb1\xfe\x2b\x3e\x23\xec\x75\x4d\xe8\xde\x19\x29\x59\x84\x46\x7d\xc5\xf7\xdd\x4b\xcb\x8c\x72\xd6\x2f\xfa\xbf\xd9\x36\xba\x17\x33\x52\x83\x9d\xbd\x9d\x4c\x16\x35\xfc\x7f\x37\x5d\x22\x30\x1f\xed\xab\x45\x8c\xfb\xfd\x11\x43\xcd\x89\x10\x4f\x41\x50\x2a\xde\x4c\x49\x8a\xbd\x65\xc8\x84\xc5\xed\x55\x6f\x79\xdb\xa4\x02\xdc\x1a\xd0\x42\x8d\xdd\x4a\x44\x9f\xb5\xb9\x7e\xb9\xbb\x43\xa7\x9a\x13\x08\xd7\x39\x83\x8e\x79\xb4\x06\xfd\x72\xf8\x5d\xfe\x38\x75\xf9\xd6\x0d\x91\x44\x00\x25\xe0\x07\xed\xdb\xcd\x6f\x3e\x23\x1f\x58\x4a\x49\x7a\x33\x22\xf1\xd0\xc6\xed\x3a\xf4\x3b\xb3\xd0\xca\x06\x1d\xd9\x48\x08\x4f\xfa\xf0\x45\x85\xf4\xb1\xfa\xdf\x18\x3f\xc9\x59\x04\xd1\x93\x0b\x9b\x0a\x45\x01\x18\xdf\x06\x41\x45\x7d\x0b\x5a\x6a\x0e\x7f\xe1\x46\x01\x30\xf5\x1a\x93\x32\xeb\x9a\xaa\x0f\xbb\xfe\x6c\x03\x58\x72\xd1\xc6\x92\x46\xcd\xef\xc9\x21\x12\xce\x68\xda\x31\xbb\xac\x88\x9d\x5e\xd5\xad\x84\x85\x54\x6a\xaa\x9d\xc0\x41\x57\xad\x17\x3e\xcf\x52\x0e\xbb\x7d\x84\xdf\xba\x65\x20\xbb\x72\x2a\xec\x27\xf7\xfe\x3b\x1a\x27\xf1\x6a\x07\xdf\xff\xe6\xeb\xe6\x0e\x92\x3f\xbe\xfd\xba\xf9\x3f\x68\x92\xde\xfd\xb8\x77\xf7\x8f\xe1\xdd\xef\xb7\xfe\xd7\x9d\xff\x3d\xf8\xea\xbf\xb6\xef\x25\xe3\xff\x3e\xf9\x73\x75\xdd\xfc\xff\xee\x4e\xb7\xa3\xf1\xe8\xff\xc6\x37\xd4\x41\xff\xf5\x7f\x4c\x8d\x69\x34\x1e\x99\x5f\x77\xa7\xab\x21\xfe\x76\xa7\xb1\xca\xd1\xd8\xeb\x73\x83\x16\xe8\xbf\xee\xdc\x93\xb6\xd5\x7b\x2b\xe9\xe1\x3d\xcf\x9d\x23\xe5\xc4\x72\xf2\x70\x95\x9f\x46\xf3\x48\x1d\xe3\xf5\xf5\x3c\x22\x3a\x51\x39\x84\x88\x57\xf2\xd5\x45\x4a\x6b\xf2\xa4\xa8\x52\xa6\x6b\xab\xcc\xab\x79\x7d\x98\x1e\x42\x86\x7f\xfa\x4f\x32\x5e\xcd\xf3\x72\x04\xff\x21\x38\x9d\xb1\x65\x5a\x8c\x64\x83\xa6\x11\xb6\xab\xc0\x15\x10\xe5\x78\x3e\x4f\x3f\xfc\xed\xd3\x7a\xc8\xa7\x95\x7e\x18\xc1\x7f\x36\x9b\x96\x72\xa5\xb1\xe6\x76\x04\x09\x56\xdc\xe2\x63\xba\xb4\xf2\xad\x6c\x09\x08\x86\x6e\x85\x93\xe5\x4a\x55\xe4\x4f\xbd\x6a\x4c\xe6\x69\x5e\x58\x1d\xcf\xa3\x88\x24\x0c\xe9\xd5\xee\x8b\x47\x90\xc8\x0f\xb2\x27\x68\x05\xb4\xa6\xbb\x7f\x79\xf9\x4c\x04\xa4\x6f\xed\xa2\xbd\x83\x5b\x17\xfa\x87\xe8\x4f\xfe\x92\xd7\x46\x1e\x9c\x0c\xef\xaf\x67\x2d\x7a\xd6\x5b\x26\x7f\xba\x4d\xe5\xfe\xb5\x4e\xb5\x35\xab\x37\xd6\xfe\x2d\x52\xc6\x08\xb5\x01\xd2\x33\x6a\xdf\x62\xea\xbc\x4f\x80\xfa\x21\x98\xea\x94\xf2\x5e\x3a\x6b\x36\x8e\x68\xc2\x31\xf5\x7f\xf7\x45\x5a\x8e\xf3\x94\xee\xb1\x68\x08\xf9\x5a\xb6\x93\xfe\x7f\xf7\x11\xa6\xdb\x09\xc3\xfd\x3b\x4e\x05\xa3\x83\x57\x35\xef\xf4\x11\x16\x5e\xcb\xaf\xc8\xd9\xe3\x0f\x8b\x88\x22\x34\x02\xa5\xbe\xc9\x75\x83\xf9\x51\xb5\x61\x34\x00\x9d\xb9\x02\x05\x6d\xea\x2d\xce\x35\x57\x27\x2a\x37\xc1\x6c\xf7\x4b\xf9\x81\xca\xfd\x16\xf2\xb0\xbc\x69\x9a\xc6\xda\x3b\xde\x58\xe3\x2b\x5f\x9e\x2b\xeb\x08\x74\x6d\xa7\x02\xfa\xc3\xea\x41\x96\x2a\xa9\xbd\xaa\x72\x10\x39\xf9\x2b\x8f\x1c\x10\xd5\xd0\xe3\x80\xf4\xc8\x0d\x84\xfd\xc6\xcd\x57\x76\xa1\x61\x78\x30\x20\x0e\xd0\x3c\x64\x70\x23\x3b\xe0\x8d\xb9\xf0\x46\x42\xf0\x66\x05\x31\xf5\xf7\xc0\x84\x2b\x6d\x3f\x1d\xa6\xd0\xd1\x1e\x02\x7d\xfe\xcb\x8f\xbf\x23\xc8\x01\x30\xc4\x69\xfc\x88\xff\x39\x62\xc6\xc8\x23\x8f\xf7\xdf\xbf\x40\x91\x48\x44\xa7\x3a\x79\x6e\x84\xcd\xab\xc6\x08\x9b\x2d\x1d\xdd\x8a\xc8\xfc\x19\x6c\x7c\x83\xb1\x1a\xa7\xd5\xd1\x88\xc8\xe0\x95\xb2\x18\xfc\x99\x08\x52\x81\x73\x01\x70\xac\xf1\x9f\x39\x66\x1a\x04\xbc\x2f\xb5\x2e\x51\xd7\x72\x32\x5a\x28\x0f\xcd\xf6\x3b\xbf\x05\x67\xcc\xe1\x8a\x70\x78\x1b\xb3\x11\x49\x1e\x9a\x6f\x1c\x07\x9b\x3e\xff\x68\x5d\x54\x0b\xf4\x49\xc2\x94\x8b\xe5\x53\xad\x8d\x18\x9a\x04\x4e\x62\x1d\x01\x4a\xe3\x79\x24\x56\x64\xc3\xe1\xe3\xf6\x29\x8e\xff\x88\x3e\x40\x6c\x18\xf7\xbc\x0f\xbe\xec\x9c\xd4\x23\xf3\x4c\x25\xa4\x59\x44\x97\xc8\x00\x44\xc1\x61\x84\x22\x61\x43\x13\x0d\x71\x1d\xbf\x46\xd1\x73\x67\xea\xc7\x81\xa9\x1f\x04\xa7\xfe\xc2\x39\x48\x15\xe2\x77\x3c\x21\xd3\x91\x6b\x03\xc9\xd0\x78\x12\xc7\x31\x04\xc3\x87\x90\xf8\xa6\x8f\x77\xce\x31\x9f\xd0\xf4\xd2\x90\x35\xa6\xd6\xcb\x56\x2d\x8f\x02\x32\x55\x0f\xed\xaa\xe3\xd6\x3c\xd8\x68\xc2\xa6\xa3\x89\x35\x83\x57\x6b\x8c\x37\x79\x83\x58\x5a\xea\x73\x90\x1e\xb1\x24\x49\x2c\x50\x7e\xe4\x2a\x74\x0f\xad\xe0\x91\x7c\x1e\xce\x9d\x7a\x15\x51\xcc\xd0\xf5\x35\xd5\x5a\x19\x84\xad\xd4\xa3\x4f\x9c\x69\xf0\x9e\x6c\xff\xe9\x57\x12\xc2\xf8\xb5\xfd\x6b\x03\xb7\x4e\x67\x1f\x2d\x6b\xcc\xd6\xc6\xd9\xa6\x95\x52\x87\xbf\x6f\x85\x79\x10\x0a\x77\xe0\x5f\x5d\x4d\xef\x4c\x30\x16\x63\xfb\x87\x40\x79\x23\xe5\x52\xd9\x83\x4b\xb8\x61\xbb\x3c\x33\xed\xf2\x72\xe3\x96\xb2\xaa\x69\x2b\xbd\x71\x37\x69\x2b\xab\x9a\xb6\x4a\x16\xb9\x49\x63\x55\xd7\xb4\x16\x6e\x3f\x1b\x35\x96\x55\xad\xb6\x94\x56\xd4\xf7\x63\x0f\x37\x85\x9a\xd6\x7a\x29\x48\x6b\x36\x3a\x1e\x55\xd7\x5e\xb1\x48\x50\xb6\xc1\x72\x29\xbb\x32\xed\x98\xe2\xe4\x6e\x6e\x29\xab\x9a\xb6\x35\xd8\xba\x6d\xd2\x54\xd4\x34\x2d\x97\xe5\x2d\xc6\xd5\x95\xfd\x91\xf7\x83\x69\x18\xd7\x4c\x40\x36\x70\xe0\x7a\x49\x6e\xd1\x8d\x5d\xdf\x3a\xb9\xd4\x4e\xc8\x04\x9f\x4f\x6a\xc2\xcc\xd5\xb4\x92\x26\x3a\xb7\x99\x5d\x5f\x9b\xd4\x96\x82\x2a\xca\x74\xf1\x93\x32\x79\x1c\x05\x5a\x21\xe8\xdc\xbb\xfc\xce\x08\x3e\x62\x08\x0d\xe3\xd6\x79\x52\x26\xc7\x51\x57\x7b\x64\x50\x40\x1a\xf0\x4d\x08\x4c\xdc\x38\x63\x0b\x73\xc6\x37\x37\xb5\xf5\x67\x23\x3b\x38\x31\xda\x89\x96\x1f\x45\x1b\xc9\x69\x6c\x7c\x22\x42\xce\xbd\x68\xd5\x88\xd6\x34\x0e\xfb\x2e\x84\x51\xa9\x4c\x38\xa9\x03\xfa\x02\x70\x48\x29\x99\x02\x15\x55\xa7\x39\x4f\x6b\x69\x9e\x66\x5e\x85\xad\xad\x35\x2d\x9d\x06\x7c\x13\x5b\xcd\xd7\x40\xa8\x53\x5d\x80\xe8\xa7\x3b\x91\x77\x2b\x5c\x7e\xec\x10\x07\xff\xb5\xe2\x87\x7e\x5a\xd1\xf9\xa3\x9c\x92\x19\xcb\x2f\x88\x77\x33\x3a\x2e\xcc\x7f\x96\x9e\x06\x56\xf5\xd1\x5a\x95\xfb\x32\x0b\xf9\x76\x1c\xc7\x29\x3d\x5b\x42\x80\x00\x1d\x8d\x06\x9c\x15\xad\xe0\x49\xe0\x43\x6e\x7e\x5e\xd8\xca\x1e\x91\x83\x52\x5a\x84\xfd\x10\x76\xa0\x9d\x65\x09\x6b\x72\xb8\xdf\xc0\xe2\x62\x8a\x73\xcd\x8a\x2e\xdf\xce\x73\xc6\x20\xc0\x52\xc2\xc6\xda\x3d\x34\x89\x94\xc9\xff\x2c\xb3\x53\x0d\x5b\x6e\xa3\xba\x29\x1a\x59\xcd\x72\x9d\xad\x98\x06\x3b\xa0\x3a\xd1\xba\x82\xb7\x70\xc2\xe4\x09\x9b\xca\xc8\x56\xaf\x3b\xe0\xa4\xb5\x5a\xa9\x32\xf8\x64\xc9\xf2\x47\x7c\xff\x16\xf2\xe3\x6e\x21\x70\x50\x08\xeb\xcb\x77\x85\xfc\xf5\x4d\x4a\xeb\xd1\xce\xd7\xeb\x64\xb1\xf7\x85\x2c\x96\xbc\xfb\x2b\xea\x97\x67\x77\xf5\x4b\xd6\xc7\x24\xce\xeb\xa8\x6f\x3e\x20\x04\x35\xbc\x72\xaf\x54\x3d\xfb\xaa\x58\xff\x96\xe5\xf0\xb6\xab\x42\xf1\x43\x96\x00\xf6\x56\x25\xe2\x87\x2c\x91\x74\x97\x2a\x53\x3f\xd5\x88\x82\xb2\xd2\x03\xca\x9f\xc8\x93\xb8\xda\xb7\x07\xdf\xf9\x57\x9d\xf9\x8f\x78\x67\x78\xfb\x43\xff\x91\x56\xcb\x85\x77\xe4\xfc\x3b\xf0\x09\x61\x50\x80\x26\x5e\x75\xe7\x1b\x04\x47\xc0\x0f\x78\x83\xc3\xea\x09\xfc\xb0\xfa\xd0\x1f\x6c\xb8\xf9\xf6\xff\x9b\x70\x03\xa5\x06\x71\xc9\x72\xf3\x61\x1d\x64\x19\x01\xfe\x7b\xfb\x35\xe4\x0c\x29\x89\xf9\x9b\x82\x99\xc5\x0d\xfe\x2a\xea\xfc\x22\xf4\x90\xc4\x45\xbd\xb1\xad\xce\x93\x52\x22\x2f\xc7\x90\xdf\xa2\x65\x29\x41\xc1\x2b\x48\x45\x0d\x82\xbe\x12\x8a\xcd\x17\x69\x3f\x01\x4e\x4d\xea\xdb\x23\x95\xe0\x5c\xa9\x8e\x41\x64\x2b\x02\x24\xbd\x28\x07\x83\xdf\xc4\xa3\x8f\x1a\x31\x6b\x77\x46\x8a\x39\x35\xe9\x4c\xba\xd7\x84\x30\x05\xa9\x57\x4e\x2e\xc1\x87\x82\x14\xaf\x61\x10\x19\xbf\xb8\xbd\x18\xbe\x45\x01\x7a\x4b\xfa\x3e\x9d\x18\xcf\x03\xab\x49\xc7\x3c\xbb\x77\x4e\xe9\x8d\x54\xaf\x72\x57\x94\x39\x0a\xdf\x17\x50\x3b\x79\xbb\xe2\xef\xa9\xda\x27\x2c\x01\x47\x08\x56\xed\xfa\xf3\x94\xbe\xdb\xab\x6d\x3d\x7a\x68\xa2\xf9\x69\xe4\xcf\xd5\xb7\x75\xb1\x6c\xbc\x03\x3b\x1e\xb0\x8c\x71\x77\x57\x95\x7e\xc2\x2e\xb7\x9a\x36\x9c\x9e\x61\x4e\xb6\xad\xdf\x65\x08\x9a\xad\xa1\xf1\x31\x17\xe6\x44\xbb\xde\x54\x07\x83\xd6\x52\x5b\x07\x9a\xb7\xaf\x49\xfb\xe8\x72\x84\xf0\xcf\x52\xb7\x0f\x9d\xae\xa1\xb6\x39\xe0\x5b\xa3\x54\x45\x21\x22\x59\xc8\xf1\x54\xe4\x6d\xb3\x9e\x9f\xa4\xe5\x93\x23\x6e\xb1\xf7\x53\xf3\x08\x0a\x10\xd6\x14\x46\x70\x91\x4c\xf4\x5a\xf7\x12\xbd\x8b\x98\x4e\x23\x49\x62\xcd\xdd\x8c\x21\xa9\xb7\xc5\x58\xbd\x88\x28\xb6\xca\x11\x1a\x05\x5c\xcf\x20\xbf\x88\xdb\x6e\x42\xa7\xc6\xc5\xe9\xa5\x33\x98\xcb\x13\x89\x11\x7d\x7e\xee\x45\x94\x63\xbf\x66\x78\xec\x5c\x8e\xed\xf7\x30\xc9\xa7\x26\xc1\x9d\x08\xb9\x20\x6e\x88\x30\x38\x2a\x05\xc3\x96\xb3\xab\x08\xed\xfe\xc4\xcf\xd1\xe1\x32\x71\x89\xb0\xfa\xea\xf5\x8c\x4b\x6b\x57\x7f\xb6\x82\xad\x24\x5b\x3b\x56\xa6\x42\x66\x27\x0d\xb5\x77\x50\x43\x2a\x1c\x41\x2b\x05\x6b\x8e\xf8\xd3\xa7\x03\x11\xe8\xf0\x20\xb9\x1d\x36\xcf\xeb\x72\xb7\x34\x69\xfa\x73\xed\x94\x18\x51\x81\x7c\xdd\x83\x29\x11\x6a\x1a\x7b\x66\xde\x26\xaf\x9c\x43\xfb\x8c\xe9\x79\xfd\xde\x38\x47\xff\x00\x61\xa2\x8d\x77\xad\x95\xa9\x64\xfb\xc0\xf2\xee\x03\xcb\x1d\xf9\xe4\x6f\xea\x92\x39\x8f\x92\xc1\x9a\x32\xbd\xb9\xde\x38\x78\x22\x9d\x67\x0e\xaf\xc8\x3c\x07\xeb\xa0\xe2\xb8\x7a\x93\x93\x4b\x71\xe1\x46\x10\xfc\x25\xf8\xe8\xb8\xed\x51\xe0\x95\xb4\xf2\x17\x32\x66\x3f\xdd\xe6\xbb\x0c\x45\x27\x83\x4c\x9c\xa7\xf5\x8b\xcb\xd2\x18\xe0\xcc\x81\x68\x57\xaa\xb0\xad\x1d\xe3\x38\x1c\x43\x91\xd2\xcc\x6e\xd1\x38\xaf\x9f\x40\x22\x42\x81\x26\xd0\xf5\xf5\x96\xd4\x77\xe4\x75\x44\x30\x55\x71\x69\xc5\x5c\xcd\xf8\x3a\xfb\x74\x7c\xc2\x37\xf8\xa5\x0a\x17\x08\x8c\x01\x47\x77\x4e\x60\x29\x2b\x00\x87\x64\x96\x76\xd5\x73\xc5\x79\x31\xeb\xb9\x22\xad\xe7\x8d\xd3\x24\xad\x4d\x24\xfe\x26\xfa\xed\x12\x11\x15\x5e\xcf\x37\xb7\xf6\x8b\x38\x3a\x09\xb8\xae\x38\xc7\xe5\x6e\x50\x58\x4e\xfc\xa5\x30\x3b\x20\x47\x92\x24\x67\x63\x9a\xb0\x90\x06\x45\xee\xe3\x19\x58\x46\xb1\x8a\xa3\xa8\x17\xa7\x91\xd3\x1c\x25\x49\x32\x03\x0d\x4f\x9e\xb0\x51\x99\xb0\x06\xe1\xf2\xfa\x3a\xbf\xbe\xa6\x52\xec\xa3\x17\x50\xb2\xdb\xba\x59\x89\x74\x92\x2c\xe9\xbf\xd9\x7b\x76\xf0\xa8\x8f\x0b\x96\xf4\x0f\x0e\xe5\x8f\x9a\x25\xfd\x97\x8f\x0f\x1f\x1d\x1c\xfe\xd8\xc7\x15\x4b\xfa\x8f\x0e\x8e\xf6\x7e\x78\xf6\xf8\x51\xdf\x8a\x48\xc7\xcc\x6a\xa2\x05\x13\x7a\x03\x8d\x68\xea\x91\x8e\x34\xa8\x5b\x64\x56\x8b\xb6\xd2\xe1\x31\xe8\xf1\xfc\x36\x4b\x66\x13\xb0\x7c\x1c\x08\x2e\xe1\x62\x8c\xd0\x60\xe7\x6b\x07\x3b\x0e\x0e\xb6\x60\x21\x1b\x96\x2d\xbf\xf5\x60\xd0\xaf\xe0\xf4\x2c\xdd\xb6\x94\x4d\x9c\x76\x1a\x3f\xcb\x4b\x28\xa0\xd0\x45\x3b\xc6\x9c\xac\x6a\x3d\xfd\x12\x9b\x75\x09\x4d\x14\x7f\xa2\xe3\x4a\x30\x45\x20\x9a\x2e\x5d\xf2\xc8\x51\x8c\xd8\xa2\xcf\x6e\x75\x09\x59\x23\x78\xcd\x58\x50\xf2\x7a\x93\x0c\xf5\x9c\x7d\x41\x21\x6a\x53\x3b\x0d\xba\x44\xc8\x9d\x6b\x60\x9f\x21\x7f\x85\xb1\xbd\xa6\x6b\x25\xcc\xeb\xf7\x85\x49\xa9\x1f\x25\x81\xa0\xab\xf0\xb5\x53\xcb\x24\x04\xf7\x49\x92\xa4\x6c\x8d\x46\x49\xd7\x2a\xd8\x1a\xdd\x91\xaa\x55\xb3\x75\x4a\x22\xdd\x57\xc5\xd6\x68\x83\x44\xad\x2d\x5d\xcb\xd5\xbf\x6c\x39\x60\xdc\xa1\xf2\xd8\xb2\x41\x5b\xd4\x91\x4f\x82\xbf\x47\xea\xfb\xd8\xfd\x29\x3c\xe1\xc5\x06\x8e\xad\xbf\xf5\xd3\x32\x52\x5c\x66\xb3\x99\x3a\xe2\x86\x1b\x81\x9a\xdb\x2a\x1e\x36\xb9\x30\xa8\x49\xb3\x2c\xd0\xa1\x3b\xe5\x47\x11\x0b\x5d\x70\x04\xad\xbb\xe6\x14\x98\xae\xd3\x8f\x7f\x47\x51\x43\xc9\xbc\xba\x20\x37\xce\xe6\x49\xe7\x6c\x44\x07\xb7\x98\xd0\x93\xf5\x13\x3a\x4f\xeb\x90\xb5\xcd\xab\x10\x7e\xc2\x42\xdb\xb0\xd7\xba\xb7\xed\x46\x3e\x85\x08\x29\x1d\x48\x4a\xad\x89\xc9\x29\x6b\x0c\x24\xa4\xd5\x50\xcb\x5f\x83\x72\x62\x77\xf1\x3f\xd4\x77\x19\x71\x96\xac\x1a\x59\x99\x19\x9e\xdf\x46\x04\x90\x34\xa4\x2a\x8b\xab\x23\x52\x9c\x4a\xc5\x88\x2c\xf2\x98\x7a\x86\x44\xe7\x45\x61\x31\xfa\xa2\x6f\xb7\xe2\x4a\x75\x07\xb1\x51\xe5\x68\x92\xba\xd9\x3f\xcf\x8b\x4c\x38\xb3\xb7\x3b\x93\x03\xd4\xaf\xf5\xd5\x0d\xcd\xdf\x8b\x7a\x7f\xec\x7f\xf7\x47\x5a\xa9\x85\x98\x6e\xdd\x19\x36\x68\xe3\x1d\x91\xa8\xc0\xdf\x12\x49\xc2\x5b\xb3\x35\x2f\xea\xce\x2d\xb7\x5b\x76\xa5\x7a\x7e\xa9\xb4\xd4\xc1\xce\xbd\x5c\x02\x52\xda\x75\xe3\x4e\xe8\x4e\x3f\x77\x23\xcc\xec\xf4\x7c\xe5\x4b\x60\x4d\x57\x22\xf8\x9a\xe1\x2d\x91\x5b\x85\x33\x33\xe0\xef\x20\x3b\x75\x94\xc5\x22\x31\x8a\xf5\x7d\xf3\x49\x79\x33\x40\x8d\x7c\x71\xe4\x64\x9c\x34\xc7\xb2\xcd\xf3\x94\xbe\x23\x99\xdc\x73\xdd\xaf\x8c\x1f\x24\x27\x5e\x49\x84\x21\x0c\x08\xec\x44\x1d\xce\x06\x13\x90\x57\xa9\x21\x6f\x0e\x55\xe6\xee\xbd\xd9\x7c\x4b\x68\x10\xa1\xc0\x96\x45\x46\xb1\xd5\xde\x32\x29\x59\xdd\x64\x5b\xdd\xf1\xf6\xca\x19\xa9\x85\x24\xe4\xe6\x99\xd7\xef\xf2\x85\x3a\x7a\xc8\xf9\x36\x22\x8d\xad\xc2\x75\x48\x45\x57\xd3\x0b\x81\xa6\xc4\x13\xff\x99\xc7\x92\xb2\xee\x53\x90\x03\x7c\xf2\x21\x74\x08\x6e\xec\xda\x58\x1f\xc9\xc8\x3a\x9e\xe6\xdf\xb4\xab\x3b\x08\x35\xad\x31\x35\xa9\x10\xbc\x3a\x91\x73\x77\x3a\x56\x0c\x89\xfd\x5a\x13\x53\xfe\x33\x1d\xc8\xc0\xbd\xb1\x3e\xd2\x44\x40\xd6\xbc\x14\xc4\xa9\x37\xc5\x84\x35\x5d\x13\x31\xf8\xe4\xa4\x26\x4c\x06\x22\x3d\x92\x16\x31\xc1\xab\x23\x2e\xad\xa0\x26\x8d\x43\x13\xa4\xf7\x52\x9e\x5a\x76\xbc\x14\xdd\x42\x5c\x73\xf9\x74\x2f\x4b\x8b\x98\xb7\xef\x95\x49\x32\x31\x5b\x16\x29\x23\x7a\x2a\x91\x4f\x47\xcb\xdd\xd2\x5f\x6a\xa6\xdc\x8a\x78\xf7\x3e\xf5\x60\x60\x09\xfd\x2b\x6e\xff\xcd\x58\xb5\x13\x32\x14\xc0\x1d\x53\x42\xec\x73\x32\x17\x83\xdf\xa9\x55\xf8\x92\x92\x38\xd8\x1a\x7d\xfe\x05\x6c\x02\xf0\xb1\x6a\x1f\x5c\x5a\x14\x4a\x92\xf4\x48\x33\x26\xe3\x8a\x8d\x52\xd6\x78\xc7\xee\x30\x07\x96\xe4\xda\xf9\x29\xc2\x15\x8d\xa4\x1d\x4d\xfb\x5c\x4d\x44\x28\x5f\xfe\xe9\x3d\x92\x1b\x30\xfa\x43\x6d\xe4\x7a\x19\xea\x52\x4c\x45\xc5\x18\xb5\xcb\xf2\xaa\x74\xe2\x3e\xda\xf1\x31\x88\x8e\xce\xb8\x89\x90\xa1\x96\x76\x2f\x75\x24\xa5\x93\xf2\x24\x20\x88\x60\xb3\xf6\x9a\xad\x6e\x9c\x97\xbe\xad\x6b\xea\x78\x31\x00\x37\x99\x39\x20\x1e\x39\x6b\x86\x89\xc1\x28\xea\xca\x3b\x68\x44\x41\x87\x6c\x00\x57\x91\x58\xb7\xb3\x11\x89\x30\xda\x1e\x0d\x3a\x94\x8b\x0c\x1e\x7e\x7d\x1d\xf9\xe2\x3e\xb0\x9e\x21\x2a\x48\x4e\xdc\x47\x08\xfb\x55\x44\xda\x24\x65\xae\x8c\x5a\xe2\xc4\x3c\x61\xc6\xd3\xc0\x96\x1d\xe6\x49\x6e\x87\x97\x9b\xb3\x71\xae\x04\xa2\xb5\x2f\xc4\x65\xc8\x2a\x9c\xb0\x29\x80\xef\xc8\x69\x7f\x01\x9a\xf1\xd4\xca\xf9\x81\x70\xde\xc8\x9c\x19\xbe\xb9\x94\x12\x1c\xca\xcc\x41\x7c\x87\x08\x02\xb6\xd9\xca\x0c\x4f\xe5\x7e\x8f\xd5\x1f\x6a\xe0\x75\xa6\x5b\xce\x38\xc0\xbc\xd3\xaa\x62\x91\x9d\xcd\x09\xe2\xa0\xed\x32\x85\xb8\x76\x11\x4b\xcc\x0f\x75\x85\x9b\xf0\xe9\xb2\x10\x8a\x68\xe3\xf6\x4f\xa3\x58\x43\xaf\x61\x6b\xfc\x06\xc2\x19\xbe\x78\x5b\x13\x7a\xc1\xb1\x91\xcd\x10\x6a\x5c\x2f\x7d\xd9\x2e\x16\x24\x80\xe4\x4d\x61\xd3\x9e\xba\x2b\xe0\xe8\x44\x7e\xd6\x75\x18\x17\x2a\x2c\xe1\x9a\x5b\xa5\x28\x81\xb4\xbc\x52\x1d\x3e\x4d\x2f\xd4\xa8\x35\x43\xe3\x5a\xf5\x12\xae\x52\x30\xc4\x07\xe2\x48\x37\x5c\xa1\x95\x8b\xc6\xd4\x12\xef\x88\x7e\x57\xf9\x1e\x5a\xa5\x8f\x02\x16\xba\x4e\x6b\x11\x52\x8d\xd7\x72\x1b\x1e\x07\x4d\x65\xdb\x4d\x25\x37\xa9\xdf\xc1\xf5\xac\x5a\xab\x13\xad\xf6\xf9\x74\x96\xcb\x67\x47\xdb\xdc\x72\x6b\x54\xbd\xb8\xcf\xe0\x79\x4f\xf2\xfa\x87\xea\x03\xc8\xab\x6c\x7f\xb8\xb6\x38\x7b\x30\x50\xba\xc9\xc1\xe0\xbe\xe7\xe5\xc2\x90\xd6\xc9\x49\x5f\xee\xbc\xe4\x2d\x4c\x5c\x8b\x1c\xae\xeb\x1a\x7d\xb6\x65\x9b\xda\x12\x78\x33\x20\x03\x84\x26\xe7\x88\xd1\x94\x91\x33\x30\x66\x05\xe1\xbc\x9a\x97\x6d\xc3\x10\x31\x47\xd6\x67\x95\xa1\x26\xc4\x95\x18\xa9\xe2\x60\xb0\xa5\xfc\xcc\x45\xbd\xeb\x6b\xe7\xa7\x84\x31\xed\x5d\xae\xf6\xb5\x0d\x0b\xca\x36\xf1\xcc\x18\x71\xf9\xaa\x00\xc1\x7e\x5a\x5e\xff\x33\x8e\x62\xf1\x92\x45\xd4\x4a\x51\xa6\xb7\x41\x8b\xe9\x21\x05\xe6\x93\x8a\xce\x95\xdd\x04\xd6\xb4\xb4\xb7\x49\x04\x59\xe1\xab\x1d\x7c\xf4\x29\xa4\x99\x44\xdf\x2e\x81\xd2\xa0\xc6\xa8\x3a\xed\x87\x18\x00\xc1\xcd\x15\x28\xec\x7c\x98\xb7\x30\x0d\x3b\xd6\xb3\xdc\xd2\x8f\x2a\x40\xd6\x8d\x1c\x9e\xc9\x0c\x88\xad\x4e\xde\x18\x35\xa0\x68\x74\x03\x45\x4a\x50\xb3\x48\xd9\xec\x3c\xb0\x18\x7b\x89\x48\xd9\x30\xcb\xf3\xb3\xb8\x99\x8e\x93\xf1\x24\x35\xc4\xf9\x6c\x44\x59\x9a\xdc\xd7\x83\x99\x65\x11\x3f\x67\xa3\x56\xfd\xba\x9c\xd2\xaa\x71\x91\x9b\x06\xed\x9d\x26\xfc\x52\x38\x88\x51\xdd\xd7\xee\xd0\x36\xe6\x00\xb4\xc5\x78\xc0\xbc\x89\xa1\x55\xa9\xf4\x39\xaa\x01\xa7\x30\x3a\x2d\x74\x6c\xd3\x74\x97\x37\x0e\x0e\xd3\x6e\x6d\x0d\xe7\x16\xf2\x61\x3d\xe9\x19\xdf\xa4\xa0\x12\x5a\xed\x55\x64\xdb\x46\x19\x80\x79\x51\x5e\x5f\x47\x6d\x21\x9d\x04\x4d\xcf\x00\xe0\xbc\x2d\xd7\x74\x2a\x1a\xe4\xbd\x15\x38\x58\xa4\x46\x72\x61\xc1\xb3\x24\xf0\xaf\x69\x87\x55\xc1\x10\xf1\x47\xd1\x07\x4d\x9d\x3f\xd5\xc1\xff\xe3\xe8\x86\xcb\x2b\xe1\x91\x69\x58\x19\xdb\x90\xd3\x89\x3a\x76\x1a\x34\xb2\x98\xf8\x75\xf5\x64\xc5\xee\x29\x28\xd4\x3a\xef\x46\xad\x37\x61\x55\x45\x27\x5b\xa9\x02\x82\x08\x72\x1d\x4e\x85\x22\xcb\x82\xe1\x0b\x62\x54\x05\xe9\xb2\xf7\x4e\xff\x05\x4e\x6e\x8f\xfd\x0f\xa3\xc8\xff\x92\x10\x4c\x62\x4b\x50\xc3\x59\x4a\xd7\x98\xae\xfd\x1e\x77\x3c\xc6\x90\x96\x21\xcd\x32\x6b\x66\x98\x1a\x0c\x18\x9a\xf8\xfa\x8d\x31\x9b\x41\x03\xa2\xb7\xf6\x04\x22\xa5\x27\xb2\x86\x30\xe3\x5b\x8b\x76\x3d\x43\xf8\x97\x4d\x0c\xea\xb0\xc8\xbf\xd8\xda\xe5\x4d\x17\x41\x36\x5d\x44\x4d\x58\xc7\x1e\xfe\x7d\x6b\x50\xaf\xe8\xbf\xe4\x94\xf8\xc0\x69\x5e\xb6\xa8\xfe\x6e\xfe\x35\xb0\x5a\x29\xf2\xeb\x20\x31\x4e\x20\x16\xcc\x5e\x21\xdc\xed\xeb\x97\xfc\x5d\x06\x41\x24\xf6\xa8\x53\x45\x2c\x50\x2d\x17\x81\xb8\xac\x07\xa7\x72\x07\x9e\xe7\x90\x70\x35\xa2\x1e\x7a\x98\xd0\xa9\x85\x81\x27\x74\xda\xc6\xb9\x81\x63\xbf\x41\xf2\x1c\x26\x33\xb4\x71\x49\x74\xd3\xdc\xad\xc9\xf9\x3b\x46\xa7\xb1\xdd\xf5\x17\x9b\xb0\x21\x79\x56\x8d\x73\x00\xce\xc3\x1a\x51\x9c\x73\x08\xa4\xca\x81\x6b\x92\xdf\x6e\x7c\x9f\x2d\x22\xee\xf7\x63\x8f\x4e\xea\xde\xdf\x33\xc2\x5e\x81\x76\xb7\xe5\xb1\x7b\x22\x92\xd0\xc0\x84\x29\x01\x79\xbd\x7c\x2d\x92\x87\xb0\x61\x09\xb1\x25\x26\x67\x6c\x2c\xcd\x7a\x47\x24\x76\x7a\xc5\x8c\xbf\xaa\x61\x32\xc2\xce\x4a\xed\x8d\xb7\xb5\x03\xe3\xa1\xe4\xe1\xd6\x16\xe9\xb0\x85\xbb\xbe\x66\x26\x10\xb0\x3c\xe2\x0d\xde\x15\x30\xf5\xef\x00\x6c\xe9\x5d\xef\x80\x96\x0d\x39\x8a\x81\x6b\x47\xb5\xff\xbf\x65\x4f\xfe\xdf\xb1\xce\xb6\x50\x56\xe0\xa6\xd6\x53\xad\x7b\x0a\xa1\x90\x4c\x24\x5a\xe4\x7d\xf7\xce\x68\xb5\x5c\xf4\xae\x08\x8b\x7b\x07\xa7\xbd\xab\x6a\xf9\x15\x25\xbd\x25\x24\x36\x96\xbe\x21\xd8\x74\x7e\x55\x2d\x7b\xf3\xf4\xaa\x77\x99\x96\x0c\x52\x54\xf2\x9b\xdd\x2b\xc9\x07\xd6\x83\x40\xfa\x11\x89\xcf\xe2\x1e\x44\x69\xd5\x09\xa3\x51\xac\xda\xcb\xbc\x90\x3e\xfa\x58\x1f\x7d\xd9\x5e\x82\x98\x36\x64\xc6\xeb\xdd\x59\xb1\x26\xfe\x33\x40\x35\xae\xd9\x3d\x2b\x1a\xfc\xca\x49\xba\xa2\x67\x43\xa6\xbb\x74\x30\x10\x44\x88\x14\x6c\xdb\xd4\x43\xe8\x3e\x09\x35\xaf\xff\x6e\xaf\xb7\x0b\xef\x7c\xb7\x1b\xe4\x73\x0a\x2d\x2a\x4b\x80\xaa\x2c\x6e\xf1\x11\xa7\x15\x8d\xa4\xa8\xba\x57\x9d\xf6\xba\x37\x03\x75\xef\x80\x12\x9b\xeb\xb7\x81\x20\xd8\x13\x6d\x79\x3a\x6c\x0c\xbb\xe2\x4c\x67\xf3\x4b\x1c\x29\x95\x61\x26\x05\x5a\x8a\x50\x45\x83\x81\xbc\xe1\x5a\xb9\xc2\xaf\xb0\xd7\x97\x65\x92\xcd\xdc\x4c\xfa\x2e\xae\x63\x12\xd7\x25\x24\xa2\x98\xff\x80\x40\x06\x1d\x3c\x96\xd9\x3b\x76\xc3\xde\xd9\x3b\xe4\x3d\x82\xc6\x3a\xd7\x35\x18\xed\xbe\xcd\x0f\x87\xde\x16\x34\x9d\x2f\x66\x10\x9f\x8b\x1d\xe5\x98\x43\x3b\x2a\xf2\x0d\x6c\x5f\xab\xe7\xcb\x9a\xf5\xea\x25\x67\x31\x7a\xa9\xf0\x0c\xe7\xd7\xab\xf3\x8a\x89\xc0\xe7\xfc\x92\x69\x39\xc9\xc5\xff\xb3\xc4\x7c\xca\xba\x48\xa0\x09\x9b\x36\x82\xbf\x0d\xd1\xb0\x5e\x96\x8a\x16\xd1\xb6\x31\xc9\xb6\x31\x4d\x9a\x97\x35\x11\x86\xda\x21\x7a\x54\x59\x0b\x33\x3c\x34\xe2\x08\x7f\x56\x9f\x48\x48\x2a\xdb\x2f\xf6\xa5\xc9\xf9\x8e\x15\xec\x7c\xda\xe6\xfd\xad\x54\x7b\xf7\x54\x75\x0c\xcf\x5b\x1e\xc5\x97\x27\xea\xcf\x08\xeb\x09\xdc\x12\x0e\xf9\xa0\x13\x8f\xdc\x96\x60\x37\x6e\x4b\xca\x43\x6f\x13\x3a\x3d\xe5\x6f\x87\x2d\x9c\xfb\x17\x90\xe7\x1d\x33\x85\xa9\xc8\x93\x17\xd3\x72\x7a\xf9\xc2\x64\xf8\x64\xfa\x3f\x9b\x0c\xd7\xe0\x22\x43\x5a\x31\x8f\xe8\x96\x62\xa6\x11\x73\x89\x6e\x69\x69\x69\x6b\x47\x3c\xc0\xfb\xe7\x8e\x96\xd1\xb5\xcd\x14\x37\x71\xa8\x0b\x5f\xc3\xe1\xc6\x57\xc9\xb1\x5f\xd8\x84\x43\xd0\x43\xc9\xf4\x98\x9b\xb0\x07\x78\x6b\xe7\x6f\xe2\x10\x42\x7b\xfa\x25\x99\x82\x94\xd2\xf4\xea\x5f\xcf\x14\xc0\x1b\x7c\x0b\x76\x20\xe5\x00\x99\x91\x0f\xc0\x0c\x84\x78\x01\x77\x9f\x34\x46\x90\x14\x13\x83\x3f\x6e\x26\xb9\x4d\x07\xc6\xff\xad\x8b\x7a\xd5\x57\x45\x45\x6e\x0d\x0b\xfa\xbd\xfb\x55\x57\x73\x22\x74\xab\xda\x7a\x8a\x01\x26\xd9\x90\x01\xe9\xa2\x3d\xd0\xbf\x95\x94\x54\xc7\xc3\x99\x35\xda\x08\x3a\x72\x33\xd2\xdb\xa5\x93\x21\x99\x73\x17\x79\x1d\xba\x0a\x01\x8a\xba\xbd\x37\x5f\x90\x69\x53\x41\x71\x99\x09\x4f\xfe\xe3\x9a\xf0\xe4\xfb\x0c\x35\xf8\x2d\x13\x41\x24\xfc\xfc\xd8\x90\x8e\x0f\x45\x22\x26\xf9\x3e\xeb\x88\x34\xf1\x63\xdb\x5d\x49\x50\xde\x4a\x39\xa5\xc2\x0d\x18\xdb\xe4\x4c\x85\xab\x31\x71\xd4\xc0\x4e\x68\x9e\x33\xdf\xc8\x81\x9f\x22\x7c\x9b\x33\xce\xb5\x3d\xe6\x4f\xff\x31\xc0\x63\x79\xb6\x77\xca\x08\x7d\x93\x93\xcb\x83\x32\x37\x81\xb8\xdb\x34\xbb\xa0\x42\x3a\xe2\xe4\xf0\x46\x50\x2e\x0f\xce\x7b\x77\x78\xab\x76\x18\x1d\x19\xe1\x6d\xe6\x2b\x82\x4c\x1b\x0d\x07\x8e\xec\x1b\xad\xde\x32\x93\x2a\xdd\xb3\x7e\xe5\x48\x65\x5f\xf0\xb9\xfc\x66\x43\x90\x05\xb4\xab\x1d\x1a\x13\xd2\x16\xc3\x42\xc4\x1b\xac\xab\x20\xfc\x6b\xa4\x7f\x60\x86\x4c\xc9\x06\xef\x10\x68\x7e\xfc\xf3\x31\x41\xf7\xf8\x82\xad\x75\xb4\xd6\x0b\x06\x51\x62\xce\xbe\xbc\xfd\x13\x56\x4d\x06\x03\xbe\x5c\xa7\x1b\x58\x2c\xc2\x5a\x71\x67\x66\x89\x61\x82\x69\x96\x3d\x51\xb1\x42\x3e\x65\x50\x4c\x0d\xa0\xa1\x5d\xc6\x20\xf0\x20\xee\xdc\x75\x0a\xb9\x67\x37\xda\x56\xcd\xae\x7c\xd6\xfc\xd6\x6c\x8a\x38\x1e\xa7\xf7\xb5\x07\x24\xa6\x0d\xaf\xa7\xb8\xb1\xce\x5c\x82\x6d\x0c\xd1\x0c\xc3\x19\x12\xda\x7d\xda\x2c\xda\x1a\x35\x60\xb4\x07\xf6\x51\x9e\x3f\x97\x41\x09\x43\x4c\xe5\x79\xf2\x01\x5b\xf0\x87\x5c\xec\x20\xad\xad\x10\xde\xda\x69\xaa\xf2\x15\x50\xab\x5a\x91\x54\x8b\x1d\x88\x24\xd1\x0b\x7f\xab\xd9\xc1\x6a\x54\x94\xb0\x36\x5e\x0a\xd9\x8b\xa8\xd4\x2c\x60\x70\x58\x6b\xab\x11\xeb\x5b\xcb\x80\x04\x46\xb1\xac\x48\x42\x75\x39\x69\xe0\x9e\xae\x15\xa2\xd3\x4d\x28\x3c\xf6\x0e\x42\xea\x39\x01\x25\x7d\x62\x14\x9f\x2b\xbc\x33\x54\x59\x00\xde\xde\x2e\xa2\x4f\x30\xec\x0e\xff\xdd\x0a\xd0\x53\x9e\xdd\x85\xca\x5d\x31\x79\x36\x88\xa5\x2f\xd5\xe9\x5d\xb9\x3e\x34\x58\x35\x28\xea\xc3\xb1\x76\x05\xcf\x97\x30\xd2\xa0\x06\x43\x7c\xfe\x7a\xb4\x92\x27\x32\x9a\xc8\x99\xbd\x10\xbf\xfb\xb8\x2f\x4b\xfa\xd3\x06\x57\x4b\x26\x6a\x2b\xd0\x1b\xf5\xd5\x5f\xfd\x06\x93\x0f\x8b\x8a\xb2\x3d\xd3\x47\x7f\xda\x0e\x8a\x7f\xc5\x5a\x51\xf1\xf1\x5e\xf7\x2b\x5a\x9e\xbd\x28\x9d\x87\x0c\xc8\x25\x41\x14\x1c\x5f\x2d\xb4\x9d\xab\xf3\x8e\xc5\x2e\xd2\x83\xa4\xa9\x81\xbc\xa2\x4e\x1b\x49\xfe\xbb\xfd\xb4\xf0\x13\x74\xb5\xfe\x5d\x34\xad\x5d\xe4\xa3\x9b\xba\xa1\xe7\xde\x47\x56\xd2\x11\x8e\xb6\xc6\xfa\xaf\x91\xfe\xcb\x0e\xbf\x2d\xb6\x41\x58\x4c\xdd\xf8\x86\xab\x8a\x63\xfb\x87\x3b\x4d\x69\x9f\xdd\xda\xd7\x1b\x52\xcb\xfd\x7b\x12\x17\x1d\x6d\x48\xc1\xbd\x61\x48\xa4\x24\x7a\xd3\x05\x5a\x7b\x6b\xa4\xa3\x5e\x28\x3d\x66\x84\x9b\x96\xc7\xa1\x2d\xf3\xf4\xbd\x11\x29\xba\xfd\x86\xae\x0b\x32\xf6\x8d\xc2\x4e\x9f\x81\xa9\x42\xb1\xc4\xa6\xfa\xfa\x03\xbc\x4d\xfc\x1a\xfc\x2b\xbf\xf7\xce\xcd\xb6\x6a\x04\xee\xf7\x51\xfb\x7e\xcb\xb3\x3b\xb1\xce\xee\xe3\x9a\xb3\xbb\xe4\xd4\xf7\xd3\x4d\xa8\xef\xcb\xae\xc3\xfd\xd8\x3e\x5b\x5c\x7a\xa7\xab\x08\x48\x4e\xdd\x9c\x31\x4f\xf8\x67\xd1\xe5\xe2\x89\xf2\x29\xf0\xcf\x81\x8d\x50\x1c\xc6\x9c\x45\x43\x5c\x0a\x34\xa5\xa2\xc1\x32\x07\xe7\x3d\xa9\xa8\xb4\x8c\xf6\x25\x95\x9a\xc9\x75\x98\xd1\x08\xe1\x7e\xae\x59\x38\x69\x4a\x6a\x0b\xa0\x34\x77\xc7\xe9\x39\xa6\x7c\x80\x2f\x72\x72\x09\x27\x8c\x3c\x03\x50\xcb\x7e\x0a\x82\x99\x20\xaf\x7e\x62\x15\x7d\x0e\xb6\xd5\x44\x5c\x07\xc2\x74\xd0\xda\xfb\x48\xe3\x48\x17\x31\x8e\x26\xba\x60\xfa\xc5\x90\x64\x28\x94\xd9\xca\xdf\x05\x1b\x6a\x14\x65\xd6\x78\x27\xd3\xcd\x94\x29\xd5\x4b\x7d\xc4\xd2\x32\x4b\x8b\xaa\x24\x11\x1a\x5b\xd5\xed\xef\xa3\xf0\xd3\xe7\xec\x60\x00\xb0\x87\x5f\x88\xb0\x53\xc4\xed\xcd\xb4\x9d\xbb\x1c\x27\xf8\x80\x31\x10\x96\x32\x26\xd9\x5c\x59\x0c\xab\xde\x6a\xdd\x81\xda\x4d\xa7\xcb\x5f\x9d\x29\x61\x6b\xe9\xb7\xe3\xf5\x9a\xd6\x65\x5b\x85\x4e\x44\xa7\xcb\x0a\x53\x23\xe2\xfb\x61\x3a\x07\x0d\x70\xe0\x25\xb0\x2b\x78\x1b\xef\xac\x9a\xc3\xaf\xda\x6e\x88\xe3\xda\x2a\x0d\x43\x8c\x2b\x31\x63\x68\xf5\xb4\xc5\xca\xb4\x59\x13\xe1\xb5\xd4\x32\xf7\x55\xcc\x5a\x1b\x6d\x58\xf1\x85\x0c\xa6\x71\x42\x17\x61\x9a\xf4\x21\xd6\xd0\xf5\x35\x19\x0c\xfa\xa7\x69\x51\x93\xfe\x56\x92\x90\x5d\x67\x42\x54\x59\x82\xfb\x11\xd1\x83\x71\xd2\x23\x34\xda\xa2\x5e\xc4\x62\xd5\xc0\xfb\x2c\xcd\x24\x41\x41\xfa\xa9\x8f\xef\xf7\x9d\x8f\xaf\xfc\x3b\xfb\xd4\x87\xd8\xe6\x15\x02\x39\xc4\xda\x31\x5f\x9d\xd7\x5a\xbc\xce\xd8\xec\xfc\x68\x62\x65\xc0\xb4\x71\xff\x14\x03\x5a\x36\xaf\x77\x1f\xcb\x58\x55\x53\x6c\xd3\xfd\x50\xb6\x9e\xf0\x17\x30\x30\x52\x95\xf7\x65\x70\x8f\x00\x85\x10\x22\x0e\x4e\x34\x71\x80\xf3\xf8\xf8\xf8\x91\x61\x01\x9e\x7b\x4f\xf9\xfa\xac\x99\xb7\x0b\x19\xbd\x21\xc7\x56\x9e\x1d\x42\x0a\x53\xf9\x56\x13\x8b\x37\xdb\x63\x8c\xc2\xd2\xaa\x0b\xbb\xd0\x23\x70\x9e\xb1\xcd\xb2\x1f\x7e\x60\x7e\xe2\xcc\x0f\x5d\x84\xcc\xcd\x99\x33\x83\x49\xff\x6e\x4e\xa9\x0a\xae\x8d\x11\xbf\x9b\x32\x51\x93\x95\x48\x0a\xb2\x8f\xfc\xa7\x65\xe1\x94\xf9\xce\x36\xcd\xc1\x19\xaa\x7e\x53\xd5\x4f\xca\xbf\xb9\x2e\xbf\x5d\x3b\xfd\xe6\xad\x73\xdb\x05\xd2\xca\x3d\xeb\xa4\xb0\xff\xd8\x10\x00\x8f\x5b\x00\xf8\xf8\xcb\x5d\xbf\x79\x95\x25\x79\x5c\xed\xfd\xd0\x91\x51\x3c\x8f\x67\x3f\x1d\x45\x2b\x7d\xf3\x0f\xfc\xa1\x43\x29\x48\x52\x49\x27\x43\xec\xfb\x34\xcb\xec\x00\x60\xba\x4c\x88\x65\x21\x27\x8c\x12\x2d\x2a\x8b\x2b\x91\xa1\xc8\xaf\xaf\xd2\x5f\xed\x92\x87\xc9\x70\xf7\xee\x5d\xa2\xed\x86\x4c\xa5\x09\x99\x4e\x76\xa6\xe0\x4b\x27\xd7\x0c\x9a\x17\xbf\x2b\xa9\xe0\x24\x18\x5c\x6a\x39\x18\x1b\xf2\xdd\xd4\xb2\xed\xdb\xf4\xb3\x9d\xce\x89\x10\x11\x10\xcc\xd0\x60\x40\x26\x3b\x53\xe1\x1f\xc6\xff\x8a\x4f\x73\x4a\x5e\x97\x40\x2e\x44\x56\xb6\x41\xa7\xa1\xeb\x1b\x3a\x19\x4e\xad\xb0\xfe\xfc\x97\x62\x56\x92\x04\x12\x19\x4a\xaa\x4d\xfb\x62\xf2\x61\x80\xb8\xe0\xe5\xfc\x8f\xcf\x88\xd7\xcf\xc1\x4f\x24\x93\xfa\xfd\xe3\x3f\x50\xb4\x3a\xed\x4c\xca\xcf\x19\x2a\xd6\x60\x56\xbd\x23\xe5\x88\x61\x09\xb7\xd9\x41\x39\x7a\x6c\x82\xfc\x1f\x77\x23\xc6\x36\x87\x97\x07\xd2\xbe\x0a\x4c\x48\xaf\x74\xbe\xd7\xbc\xfc\x0b\x70\x4c\x92\x63\x17\x23\xca\x1c\xd8\x6d\x81\x93\xe4\x13\xdd\xe6\x20\x7b\xfc\x18\x20\xf7\xbc\x71\x63\x00\x56\xbb\x23\xdc\x29\x8f\x32\x8d\x14\xf0\x42\xcd\xc0\x0b\x70\x52\x33\xce\x93\xf2\x13\x35\xbc\x24\x6e\x3f\x0e\x26\xad\xb2\x69\xb5\xe6\x75\x38\x39\x2d\x15\xff\xe2\x6e\x4b\x20\x98\x82\x99\xac\x02\x77\x98\x6c\xe3\xc0\xab\xec\xd7\x59\x81\x4b\xfb\x6e\x69\xd2\xd6\x62\x09\x2d\xf4\xde\x26\x7e\xbd\x0a\x7f\x43\x22\xd8\x03\x66\x3e\x7f\xac\x1f\x7c\x42\x52\x58\xf9\xb2\xd0\x34\xcb\xab\x8d\x9f\xac\x40\xed\x1b\x6a\x7e\x99\x84\xd1\xa1\x07\xeb\x76\x4f\x54\x88\x2c\xf5\xd6\x3c\x6a\x6f\x82\x30\x4d\x91\x04\x4c\xe0\x9d\xfb\xa3\xf3\x9d\x7b\xc1\xdc\x0c\xa6\xb0\x0b\xbf\xe6\xec\xfc\x89\x19\xe3\xd7\x94\x96\x10\xef\x1d\xbf\xdb\x50\x66\xf8\x52\xc9\x0c\x5f\x7e\xaa\x52\xf7\xa2\x15\x77\x2e\x0d\x47\x7c\x0c\x68\x7f\x3b\x22\x54\x3a\x02\x9b\x6a\xee\x04\x72\x09\x28\x8c\x85\x62\xd8\xa4\xfe\xe8\xd0\x1f\xb7\x72\x03\x75\x8b\xab\xc8\x0d\x32\xa9\xb9\xb2\x58\xe0\xaf\xbc\x1f\x10\x17\x68\xed\x80\x20\x49\x47\x6d\xc3\xeb\xd6\x27\x3f\xbf\x12\x88\x06\xc2\x5d\x98\x26\x55\x01\x22\x7e\x83\x13\x3a\x85\x4e\x83\x41\xf4\xb3\xa7\x4c\xb3\x94\x06\xc1\x9d\x57\x39\xc0\xdb\x45\x16\x96\xda\x2c\xb0\xf8\xdf\xa0\x64\x77\x75\xe7\x8e\x8e\xd4\xd7\x4f\x2a\x0a\xfd\x57\x20\x2e\x30\xb9\x95\xc6\xbb\xad\xf0\xc6\xe4\xb3\x14\xde\xbf\x1b\x3d\xbc\x08\x9c\x81\xc1\x04\x4b\x2b\xaf\x5d\xdd\xb5\xaf\xb9\xb6\x84\x60\xea\x9e\x2b\x5d\x61\x48\x91\x2c\xc1\xb4\x20\x69\x19\x68\x70\x2b\xc5\xb0\x9c\x89\x0a\x53\xbb\xe1\x4c\xbc\xea\x37\xcc\x44\xd7\xbe\x9d\x8a\x3a\x58\xcd\xd1\x4a\x7f\xa2\xba\xf9\xdf\xa0\x6d\xf6\xb1\xc0\xca\x87\xc2\xb5\xa1\xad\x31\xed\xb8\x02\x64\x2b\x49\xe8\x60\x10\xfd\xce\x9f\x7f\x01\x75\x08\x53\xd7\x52\x72\x30\x88\x7e\x15\x96\x0d\xc6\xb2\x84\x9a\xe0\x67\xb6\x0a\xdb\x89\xce\xd4\x92\x1e\x06\x81\xe2\x86\x3b\xca\xd8\xed\x6e\x67\xd3\x05\x4b\x3a\x9e\x12\xe0\xc3\x1b\x46\x25\x83\x81\x4b\x24\x48\xe0\x10\xe1\xf4\x1b\xc5\x8d\x6c\x3a\xa7\x26\x8c\xad\x57\x9b\xa1\xcb\x2e\x74\xeb\x61\x7b\x1d\xbe\x40\xfc\xdc\x04\x03\x37\x81\x57\x67\xf5\x4b\xf8\x3d\x30\xc3\xfc\x1c\x39\x1f\x24\xcd\x1e\x78\xf4\x3e\x59\xa9\xf7\x79\x9a\x3c\xd7\xba\xe0\x3f\xc2\x80\x80\x4f\x69\x34\x71\x66\x26\xec\x1d\xbe\x88\xd9\xc0\xbb\x2e\xc9\xa1\x24\x09\x0f\x37\x24\xf2\x5e\x29\x22\xef\xd5\x7f\x90\x62\xf8\x2f\xe6\x44\x1e\xfc\x9c\x6c\x54\x0f\xbe\x8c\xa6\xb8\x9d\xa5\xaa\xa5\x2a\xf6\xab\x28\x5d\x71\xeb\xe8\x0e\x3b\xe9\xf8\x47\x1b\x1e\xda\x13\x75\x68\x4f\x36\xa6\xcc\xbf\xec\x99\x7d\x96\x15\x8a\x7c\xd9\xbf\x84\x15\x8a\xdd\xd5\x2d\xad\x50\xfc\xa6\x5f\x42\x1f\xfa\xc5\xad\x59\xfe\xc7\xdc\x0d\x37\x53\x5b\xf0\x6e\xd8\x55\x3a\xef\xc6\xa3\xc0\xdd\xd0\x59\x13\xfe\xb2\x68\xb6\xad\xc8\xf1\xed\x78\xc5\xae\xaf\x9d\x0f\x2f\xfd\x0f\xfc\xce\x88\x5b\xf6\xe3\x86\x76\x17\x1f\xd5\x2d\xfb\x78\x2b\xb3\x0a\x9c\xfa\x37\x4d\x8a\x25\x24\x07\xbe\x5f\x95\xa7\xf9\x59\x92\xaa\xa8\x4b\x59\x76\xb3\x71\x85\xdb\xc3\x11\xbf\xb7\x5e\xd4\xe8\x2f\x6e\x78\x51\x13\xd6\x33\x2a\x33\x88\x6e\x13\xe4\x7b\x61\xfe\x1d\xf6\x16\xeb\xac\x28\x42\x76\x12\x21\xa4\xe1\x50\xf8\x10\x51\x50\x57\x47\x5f\xd0\xae\xe2\xd3\x4d\x19\xfe\x47\x99\xb0\x85\xed\x2e\x3a\xb0\xb7\x23\xe9\xdd\xc4\xaa\xa2\x43\xf9\xbc\x3e\x41\xdb\x46\x95\xa2\x2d\xe5\x2a\xa5\x2e\xcc\xf0\x6f\x41\x7c\xb6\x06\x5b\xfe\xfd\x82\xe1\xef\x3e\x3f\x8f\xa9\x41\x89\x1b\xe9\xa7\x2d\xbc\xe9\xf6\x24\x30\x67\xb7\xfe\x7a\x03\xd5\x74\x0b\xe9\xfe\x18\xa2\x25\x43\x48\xe7\x45\x39\x13\xe1\xea\x2d\x9a\xe5\x87\x0d\x75\x6c\x77\x1c\x1d\x9b\xc6\xe9\xaf\x9d\xb4\x3b\x3d\xa5\xb6\xfd\xf3\xce\x8a\x34\x7f\x8e\x22\x12\x48\x81\x43\x06\x83\x88\x24\x7d\xe1\xa6\xde\x47\xf8\xcf\x3b\x2b\xd6\x8c\x7a\xd0\x22\xae\x85\x5f\x1d\xfe\x66\x28\x13\xfa\xdf\xd9\x4c\x63\xb2\x2e\x83\xb0\xd0\xfb\x3f\x4f\x17\x80\x97\x9f\xa7\x0b\xa5\x3a\xc9\xf6\xab\x65\xc9\x08\x4d\x54\x90\xfd\x59\x35\xe7\xf7\xf1\xd7\x9c\x9d\x27\x3a\x7f\x15\xa0\x52\xab\xc4\x12\x81\x58\xd5\x59\x48\xaf\x21\x7d\xba\x76\x5d\xbb\xff\x33\xc2\x84\x51\xc2\x41\xa6\x92\xd8\x25\x89\xba\x47\x8e\xbe\x43\x40\x26\xc9\x0e\xca\x8c\x7c\xe8\xe3\xbb\x3b\x48\xa7\xe0\x7a\x2d\x98\xec\xdd\x76\x23\xa9\x41\xa7\x1b\xab\xcd\xcf\xbd\x80\x0f\x7a\x7e\x4a\xe6\x82\x1d\x7d\x49\x63\x45\x6c\x5c\x38\xac\x54\xe4\xed\xeb\xf6\x36\xb2\xd0\x64\xe3\x2d\xdc\x0f\x1d\x21\xc2\xe3\x9e\xd2\x6a\x1e\x79\xe7\x26\x62\x19\x20\x13\x06\xe1\xc4\x39\x0e\xaf\xb2\x08\x49\x8b\x99\x0e\xa8\xab\xf5\xfa\x02\xad\x7a\xcb\xb3\xc4\x19\x01\x36\x92\xa9\x08\xbe\xa3\x3e\x9a\x0c\xa7\x4d\x64\xc5\x60\xf1\xc6\x3d\x4f\xf9\x7b\x3d\x0e\x4f\x67\xc4\xfe\xfd\x16\x08\xe2\x47\x18\xc1\xe1\x07\xb8\x0f\xd7\x7b\x51\x68\x7d\x4e\xa8\xfe\x8d\x75\x3d\x53\x20\xa7\xde\xa7\xeb\x74\xbe\xb8\x15\x82\xc2\xe6\x16\x20\x8d\xfa\xd6\x8f\x10\x9e\xfd\x21\x60\xea\xff\x7e\x9d\xb6\x5f\xf2\x6d\x02\x22\x48\x41\xe6\x36\xa1\x47\x49\x99\x11\x4a\x68\x62\x74\x18\x7c\x0b\xb5\x62\x57\xfc\x54\xe4\x56\xae\x02\xbd\x8a\xcf\x71\xeb\x0a\x0a\x8a\x4f\x06\xc3\x83\xd0\x87\xc6\xe0\xd1\xeb\x4b\xf7\x61\x80\x14\x84\x98\x62\x1c\x6c\x6b\x4f\x1e\x8b\x49\x8b\x4e\x5f\xdb\x75\x90\x33\x4d\x47\x25\x6a\x7f\x17\x47\x83\x54\xe6\x2d\x47\xe7\xeb\x75\xcf\x90\xb7\xf2\x5b\x0c\xd0\x04\x7a\x5b\xb9\xfb\xec\x20\x49\xe7\x48\xe2\x12\xec\xa4\x64\x73\xac\x10\x28\x0b\x2b\xb5\x6f\xdc\x4b\x11\x66\x4d\x6d\xd5\x2d\xf7\xe9\x93\x95\xbf\x96\xbe\xd7\xd1\x04\xdf\x61\xf8\xfb\x5b\x90\x3f\x62\x19\x0e\x0b\x28\x40\x8a\xd3\x21\x6f\xc4\xc6\xb8\x8a\x4e\x4f\x06\xf2\xeb\x86\xf4\xc4\x4f\x61\x7a\xe2\xf7\xf5\xf4\x44\xbf\x86\xc7\xc4\x27\x26\xfe\xfc\x8a\x97\x7f\xf5\x27\xc4\xc4\xf8\x4c\x82\xe3\xa7\xff\xa1\x04\x87\x78\x3f\xd4\x0b\x29\xdf\x73\xec\xa7\x24\xb4\x33\x3f\x2a\xcf\xf1\x00\x51\x82\x76\x49\x22\x23\x0e\x40\x6e\x4e\xc2\x8e\x24\x29\x12\x51\x93\x31\xd2\x7a\xdc\xd1\xc3\xbb\x3b\xa8\x69\x48\x51\x93\x5e\x67\xd3\xad\x1d\xd4\xec\xfa\xef\xa3\xb6\x21\xda\x94\x5e\x51\x0b\x98\x40\xe0\x28\xe1\x37\x0e\xc1\x7d\x15\xb5\x24\x2d\x3e\xd5\x52\x59\xbb\x68\xd7\xd8\x50\x0d\x77\xc9\x3f\x95\x2b\xde\x2e\xd9\xde\x36\xc9\x6a\x59\x9c\x33\x32\xe7\xa4\x44\x19\x26\x8c\x72\x79\x6b\x77\xa9\xd0\x27\x96\x72\x03\xac\x71\xab\x4f\x19\x8f\x2f\x2b\xd7\x53\x36\xcb\xd8\x68\x12\x9c\x24\x68\x2c\x10\xa0\x98\x45\x34\x40\xb3\x59\x64\xcf\x7a\xb2\xad\x8b\xdc\xe1\x4f\x86\x50\xf3\xfc\x6b\x09\xbb\xf8\x44\x5a\x07\xfd\x47\xd1\x77\x72\x56\xff\x51\x64\x9e\x4d\x7b\x75\x1a\xed\xdc\x5c\xfb\x86\x9a\x5f\xc6\x68\x67\x2d\x81\xf7\xf7\x93\x76\xbf\x06\x48\xbb\x5f\xfe\x43\x48\x3b\x10\xd0\xdc\x86\xbc\xbb\x70\xe2\xa9\xfb\x84\xd1\xef\x5f\x9a\x8a\xe3\x35\xc6\x7f\xf7\xd0\xa3\x2e\x9a\xf1\x6f\xa2\xfc\x9c\x77\xeb\x33\x7a\x54\x58\xfc\xff\x15\x72\xf2\xa7\x7f\x31\x39\xf9\xb3\x45\x4e\x5e\xad\x21\x27\x7f\x6b\x99\x80\xff\xb6\x89\x1d\x36\x25\xef\x97\xb9\xf0\x8e\x14\x19\x67\xe4\xef\x76\x64\x49\xf1\x1d\x6e\x80\xae\xc4\x5a\xdd\x98\x5c\xd0\x3b\xc2\xe6\x59\xbb\x08\x01\xd1\xf9\xa7\x31\x8e\x0b\xa6\x2f\x88\x50\xa3\x1c\x32\x7c\xf3\x16\x35\xc4\xf8\x28\x62\x32\x07\x95\x21\x97\xb4\x56\xa0\x2b\x2c\x7f\x72\xc3\xbb\xf4\x39\x0e\x28\x7d\xdc\x57\x93\xeb\x7c\x69\xf0\x03\x6d\xec\x09\xc2\xea\xb7\xd5\x07\x15\x38\xa0\xb3\xed\xad\xda\x79\x62\x87\x56\x1b\xf1\x32\xbd\x49\x69\x3d\xda\x59\xf7\x48\xdd\x17\x8f\xd4\xf2\xe0\x5d\x64\x8d\x40\xcc\xf6\xf7\xfb\xb0\xf9\xd6\x3b\xa3\x8a\x46\xa6\x41\xe0\x85\xf9\x99\x4d\x91\xaf\x2f\x66\x64\x33\xe0\x26\xc4\x07\x6e\x42\x36\x00\x6e\x93\x67\xf6\xc4\xd7\xfd\xf4\xe7\xe9\x07\x41\x83\x4a\x47\x5a\x45\x7e\x51\x62\xdb\x96\x44\x7e\xb6\x91\x36\xc0\x76\x43\xac\xce\xf2\x3c\xf6\xa6\xf3\x89\x00\xdc\x9e\x5c\x6b\x9d\xde\xb8\x6f\xa2\x36\x7d\xa1\xdc\x63\x4c\x0a\x9b\x31\x13\xce\x42\x07\x90\x1b\x7f\x67\x88\x1a\xe9\x15\xac\xb6\x08\xa1\xd1\x49\xd3\xca\x59\x6d\x3d\xc0\xba\xe6\xdf\x7a\xc9\xcc\x91\xad\xa3\xe7\xd6\x56\xec\xae\xd4\xa6\xe2\x6e\x77\x57\xac\xee\x88\x75\x02\xc4\xec\x8d\x7f\x6d\x4c\x81\xd5\x38\x70\x71\x18\x01\xd2\xcc\xf1\xae\xa3\x3e\xf8\xff\xed\xee\x3d\xf9\x7c\x51\x51\xc6\x8f\xe2\x31\x9b\x9a\x89\xe4\xff\xbe\x89\x50\x62\xa6\x51\xfa\xd3\xa8\x59\xca\xf2\x19\x04\xd8\x13\xfa\x6a\x33\xf6\x0a\x8e\x7a\x59\x10\xe3\xa4\xc2\x41\x4c\x23\xa2\x17\x8c\x63\xa2\x37\x32\xb8\xf9\x65\x4a\xcb\x17\x65\xd8\x24\xbd\x99\xde\xe0\x56\xf7\xb7\xad\x37\xf5\xd7\x7b\xa6\xfc\x86\xe0\x05\xf6\x42\x4d\xab\x58\xce\x26\x28\x9e\x48\xaf\x87\x4b\x61\x5a\x9e\xc2\x3f\xbb\xce\xbd\x26\x83\x41\x00\x79\xf4\xb4\xb4\x81\xf9\xa6\xf0\xd7\xd7\x56\xd9\x45\xf8\xb3\xf2\x20\x6f\x38\x1f\x19\x95\x92\x5a\x20\x56\xf5\xb1\xfd\x63\x64\xcd\x8e\x57\xf3\x46\x1c\xb7\xbe\x88\x06\xb9\x6e\xa0\x93\xdc\x9b\x3f\x47\x62\x3a\x68\x14\x1a\xde\x1e\x7d\xfd\xe0\xad\xb1\xc5\xed\xe6\x90\x08\xb1\xb5\x28\x5e\xf9\x73\x4b\xb1\x9e\x43\x8e\xed\x45\x36\x22\x29\x84\x0e\x9e\xeb\x78\x54\x9d\xc9\xb8\xc3\xa8\x49\x85\x04\x4b\xd4\x30\x32\x13\x47\x88\x25\x5e\x08\x2b\x1c\xe1\xae\xd5\xd5\x05\x8b\x72\xd1\x55\x1b\x20\xb4\x88\x60\xd5\x04\xc3\x68\xbb\xf9\x16\xc8\x84\x4e\x93\xe0\x88\x13\x3a\x45\x0d\x88\x44\xfc\xa9\xe8\xa7\xd1\x35\xd4\xf5\xac\x5c\xe6\xfe\x87\x0b\xfe\x3c\xf9\x42\x3c\xc7\x8b\x3c\x62\x93\xe1\x54\x47\x93\x7a\xb8\x33\x66\x93\x1d\x91\x6c\xd1\x7c\xbc\x3f\x66\x93\xfb\xe2\xa3\xe4\xa4\x74\xe3\xdb\xf3\x08\x5f\xd6\x39\xae\x24\xea\x56\x37\xf8\xc1\xf7\xc3\x7f\x7c\x33\xf2\xd3\x6c\xf6\x21\x92\x27\xa3\xf9\x8c\xf5\x77\x69\x9c\x45\x04\xaf\xde\xde\x0f\x0c\xf2\xae\xc1\x8f\x3e\x04\xbe\x1f\x36\xf8\xfd\xb7\x81\xef\xc7\x0d\xae\x49\xe0\xfb\x9b\xa6\x41\xbb\x17\x29\xed\xe5\x09\x8d\x1e\x7c\xf7\xcd\x77\x0f\x10\x2e\x13\x1a\xed\x0c\xbf\x7d\xf0\x3d\xda\x15\x38\x27\xd5\x72\xe1\x3c\xbe\x3c\xd9\x54\x34\x5c\x2f\x17\x80\xce\x1e\xbd\x78\x0e\xb6\xc6\x35\x18\x42\x88\x1e\x0b\xdd\x63\xaa\xf0\xf7\x3c\x7d\x47\xf6\x45\xf8\x81\x08\xad\x60\xa7\x9f\x1e\xa3\x88\xef\x66\x81\x9a\xaa\xdc\x2b\xb3\x7d\x48\xc3\xea\xdd\x1c\x16\xa7\x59\x06\x03\x3c\xe3\x04\x56\x49\x68\x44\x30\x05\xdf\x04\xe1\xff\x26\x6d\x68\x82\x55\x9a\x26\xcb\x6b\x88\x52\x0c\xc5\xd2\x2e\x3f\x76\x3f\x12\xdb\x23\x95\xc5\xc2\x8a\xe5\xb0\xca\x38\x85\x68\xfd\x52\xb6\x3a\x32\x3e\x6a\x23\x6e\x85\xe4\x8e\x6d\x49\x7f\x44\x12\x22\xad\x90\xce\x08\x7b\x44\x4e\xd3\x65\xc1\x1e\x55\x33\xd8\xbd\x08\xa1\xd8\x6b\xa9\xba\x7a\xca\xe6\x85\xa9\xa6\xd6\x9f\xc9\x2f\x71\x3e\x5f\x88\x16\x60\xbf\x2d\x3b\x79\x7a\xfc\xfc\x99\x6e\xd3\x3f\x4d\xdf\x91\xe3\x9c\x15\xa4\x0f\xa6\x3b\xad\xa1\xfd\x3e\x9b\xbc\x96\xb3\xe0\x0b\x74\x44\x89\x65\x95\x91\xe3\xab\x05\x49\x92\x04\x16\xff\xf8\xd9\xe3\xe7\x8f\x0f\x8f\x4f\x0e\x5f\x3c\x7a\xdc\xe4\xf5\xd1\x79\x9a\x55\x97\xaf\xaa\x8a\x75\xe1\x03\x35\xea\x13\x9a\x9e\xc1\x58\x67\x84\xfd\x58\x54\x6f\xd3\x02\x76\xfd\x18\xa4\x61\xf6\xb6\xf5\x2f\xf3\x32\xab\x2e\x21\x24\xc5\x58\xfc\x3d\xea\xab\x99\x8a\xaf\x6c\xd4\x7f\x5b\x65\x57\xf2\x47\xcc\xff\xd6\xd6\x8e\x3f\xa4\x35\x79\x4a\xc9\xa9\x23\x0d\xae\x92\xea\xfa\x5a\xef\xe0\xfb\x25\xa1\x57\x47\x92\x14\x8d\xfa\x6f\xd3\x9a\xf4\x11\xae\xc6\x15\x3f\xa7\x3d\xc6\x68\xfe\x76\xc9\x48\xd4\x3f\xa7\xe4\xb4\x2f\xe8\x7a\xb4\xeb\x68\x6f\xa4\x43\xbe\xfd\x9a\xd6\x49\x6d\x0d\xe1\x1e\x6d\x3f\xed\x23\x0c\x26\x0d\x7e\xef\x98\x21\x6d\x49\x51\x83\xd5\x7f\x99\xce\x95\x2c\xb5\x7f\x0f\x56\x18\xcf\xce\x53\xba\xc7\xa2\x21\x1a\x93\xd1\x9f\xf7\x40\xc7\xd3\x44\x2a\x39\x1f\x5f\xaf\x1a\x07\xad\xaa\x44\xed\xc3\xeb\x9a\xd0\xbd\x33\xe7\xb8\xc5\x66\xc6\x65\x7a\x91\x9f\xf1\x87\x2a\x5e\xaa\x3a\xc2\x65\xa8\x7a\x97\x5b\x87\x0f\x57\xf3\xf9\x07\x14\x99\x45\x41\x0d\xcc\xf1\x2b\x27\x36\x6a\x2c\x46\x93\x0b\x98\x81\x66\xa8\x14\x0e\x7f\xc7\xaf\xf6\x0e\x8f\x0e\x8e\x0f\x5e\x1c\x9e\x1c\x3c\xea\x23\x9c\x25\x86\x1a\x2b\xe3\x7c\xb1\xc3\x09\xb2\x27\x3e\x6e\x75\x6e\xbc\x88\x3a\x02\xb2\xe8\x32\xde\xff\xe3\x29\x8a\xb3\xaa\x24\x2a\xd8\x94\x1f\x80\x92\x0a\xa4\xfd\x1e\x48\xc7\x84\xb8\x67\xbc\x57\x14\xd1\x9f\x35\xbb\x2a\xc8\xa4\x3c\xbb\xcb\x68\x5a\xd6\x39\x1f\x30\xe9\xdf\x59\xb1\xa6\x3f\xfd\x13\x69\x6d\x06\x4b\x86\xbb\xec\x9f\xa5\xd2\x66\xb0\xed\x6d\x44\x95\xaf\x6f\x39\x61\x53\x08\x53\x82\x33\xb2\xa8\x47\x93\x19\xce\xe3\x9f\x87\xb8\x8c\x3f\xd6\x0f\xa6\x86\x9b\x9d\x4a\x74\xba\x54\x28\x2f\x17\x66\xc9\x11\xaf\xfa\xe6\x59\x2e\x90\xdd\x12\x7c\x96\x8e\xab\x5f\xe1\x50\x40\xfc\x19\x67\xef\xdf\x01\x08\x96\x67\xcb\x22\xa5\xc7\xa4\x66\xe9\xdb\xbc\xc8\xd9\x55\xc2\x11\x59\xb2\x35\x34\xeb\xe5\x74\xc2\x69\x5e\x66\x56\xa5\x83\xf2\x98\x12\x02\xf1\x87\x77\x75\x1e\xe7\xbc\x1d\xd2\x7a\xbf\x5a\x16\x59\x4f\x47\x83\x66\xa6\x07\x08\x3f\xac\xa4\x7e\x7d\x0d\xf3\x79\x83\xcd\xdc\x8a\xa2\x35\xbd\x9c\xd4\xc2\x11\x52\x56\x70\x4a\xf8\x79\xb4\x1b\x73\x8c\x21\xa1\xd6\x6d\x6b\x17\xe8\xa6\xa7\x34\x9d\x93\xcb\x8a\xbe\x3b\x12\xfd\x7e\x24\x9c\x0a\x8d\xba\x0b\x93\xc9\x74\x5d\x5b\xa9\x56\xb2\x5c\x94\x6e\x5a\x9f\x8c\x66\x46\x75\x6a\x6b\x9c\x27\x5b\x3b\x12\xf2\x53\x87\xb6\xc8\x93\xfc\xfa\x9a\x60\x7a\xf7\x2e\x1e\x82\x57\x13\x8b\x72\xd4\xec\x9a\x3c\x9e\x36\xd6\x60\xf1\xe5\x39\x29\xf9\xd4\x0a\x12\xa5\x08\x82\xf8\x84\x8f\xb5\x95\xa0\xdb\xc9\xad\x2d\x26\x52\x26\xb0\x8d\x56\xe3\x88\x20\x97\x09\x28\xc7\xe5\x88\x8e\xf5\x5d\x89\x1d\x14\xae\x54\x41\x9d\x33\x88\x39\xeb\x8c\xb7\x86\x2a\xac\x55\x67\x3d\xf1\x5c\x2a\x91\x31\x6f\x00\x78\x09\xf0\xc6\xb9\xc7\xe8\xbc\x5d\xf2\x97\xd4\xa1\xab\x7e\x7b\xfe\xec\x29\x63\x8b\x57\xe4\xfd\x92\xd4\x9f\x23\xe7\x03\x72\xae\xe4\xb4\x5c\xb4\x52\x94\x9a\x22\xe9\xac\xde\x3c\x21\xd6\xc2\x46\x65\xf0\x4c\x3d\x4f\xcb\xf4\x8c\xd0\x97\xc5\xf2\x2c\x2f\xeb\xbe\x80\x86\xd3\xf5\xca\x14\x25\xcb\xf9\x58\x95\x44\xab\x4d\x08\xef\xed\x30\x9d\x93\xe3\x4a\x74\x66\xf4\xe9\x4e\xa2\xd7\x78\x2e\x46\x4c\x2c\x5b\xd6\x93\x85\x18\x3e\x61\x52\xc5\x8f\x62\x4a\x2e\x08\xad\x49\x04\xc8\xc4\x25\x7d\x3c\xf2\x09\x3a\xe0\x07\x26\x86\x7d\x52\xd1\x88\xa0\x36\x4d\xa5\x38\x93\x2c\xb3\x1e\xe9\x5b\xf7\xd9\xdd\x96\xbf\x34\x7f\xd8\x21\xc6\x7a\x66\x93\x1a\xaf\x2f\xdf\x2b\xaf\xbd\x79\x32\xbc\x2c\x47\x77\xc4\xa8\x4e\x5d\x4e\x59\x6e\x9a\xc6\xf0\x79\x32\xdc\xcd\xff\x49\x15\x86\xcf\x8d\xbe\x9a\x24\x74\x92\x83\x06\x9e\x68\xaa\x36\x32\x3a\xd9\xae\x39\xd4\x92\x7e\xc1\xa4\x69\xc5\x78\x3f\xac\x7a\xd0\xa0\x27\x8f\xb3\x27\x66\xd3\x3b\xad\x96\x22\x10\xbf\x2c\x96\xc1\xf7\x6f\xad\xdb\x28\xe3\x67\x4f\x7e\x8c\x16\x1c\xd9\xf1\x3f\xca\xf8\xd5\xf0\x2d\xfa\x1c\xf8\x17\x99\x9c\x5d\x50\x56\x80\x9c\x55\xb3\x84\xdd\x00\x1a\x0a\x11\x19\x0c\x13\xa6\xf7\x54\x87\x58\x9c\xde\x56\xd9\x8e\x8f\xff\xba\x94\x87\x40\x32\xb9\x4b\x42\x75\xda\xbb\xb3\x2a\x1b\x67\xef\x48\xf3\xa7\xab\xe2\x6e\x81\x75\x29\x80\x0f\xf0\xcf\x7c\x03\x39\x33\x10\x0b\xf5\x11\x11\x6e\xf9\x47\x04\x96\x7d\x04\x1f\x6d\xb0\x94\x85\xbb\xce\xdd\xf5\xbb\x00\x2d\x3b\xd3\x79\x6e\xad\x02\x08\x3c\x82\x30\x91\x7f\x68\x5f\xd6\xaa\x14\x43\xed\x65\x19\x64\x1f\x69\xdc\x0f\x0c\xad\x1a\xf1\x54\xc9\x19\x69\xc0\x68\x99\x25\xe8\xb1\x3e\x9b\x27\xde\x1c\x88\xf0\x45\x87\xb5\xd1\xdc\x07\x2b\xd7\x27\x05\xc0\x4b\xfe\xcd\xdf\x19\xce\x6f\xd4\x9e\xb9\x91\xfe\x2e\x6e\x5d\x7c\x4e\xd2\x0c\x4f\xa6\xa8\x39\xd1\xe7\x73\x5c\x3d\xad\x6a\xa6\xb5\xd9\x01\x8f\xe4\x3c\xd1\x03\xfa\x84\x3a\xec\x57\x1f\xed\xe6\x31\x23\x1f\xc0\x8b\x5e\x28\xc1\xa5\x25\x0a\x89\xd3\xc5\x82\x94\x99\x60\xfe\x72\x24\xa3\xb7\x8b\x01\x0d\x58\x4c\xa6\xd2\x24\xa8\x35\x29\xf7\x50\xb0\x15\x05\xc7\x5b\x19\xd6\xdc\xa8\xdf\xb9\x5f\x5d\xa2\x40\x88\xb1\xae\xd6\x7a\xd5\xee\x55\xe9\x5c\x03\xc0\xe4\x57\x6d\xe5\xf8\x08\xaf\x05\xcb\x04\x7f\x21\x15\x70\xbb\x33\x78\xd4\xcc\xfc\x3e\x19\xd7\x71\x92\xfb\x73\x30\x9c\x36\xcb\x03\x4f\x7e\x83\xa6\x34\xeb\x2f\x5d\xb2\xde\x26\xab\xfa\xe2\x6c\xd4\x3f\x67\x6c\x31\xba\x77\xef\xf2\xf2\x32\xbe\x7c\x10\x57\xf4\xec\xde\xfd\xe1\x70\x78\xaf\xbe\x38\xeb\xe3\x0f\xe7\x6c\x5e\x84\xaa\xec\x7c\xff\xfd\xf7\xf7\xa0\xb4\x8f\x3f\x14\x79\xf9\xae\xbb\x12\x2f\xed\xe3\x0f\xe1\x7e\x7e\x7b\xfe\x8c\x57\xfb\xee\x1e\xe7\x0a\xeb\x45\x3a\x23\x50\xb5\xac\x3b\xe7\x05\xa5\xf7\xfa\x0d\xde\x4f\xee\xfd\xef\xfd\x17\xcf\x5f\xfe\xef\x7b\x67\x66\xcd\x7b\xea\x5a\xb8\x8f\x21\x71\x1e\x43\xfe\xbd\x4c\x08\x7f\x0a\x5d\x29\x5d\x89\xc6\xbc\x83\x12\x53\x21\x6b\x8d\x29\x59\x14\xe9\x8c\x44\xfb\xe0\xae\xaf\x2c\xc6\x90\x3a\x59\xda\xe8\x81\x8f\x6c\x6b\x18\x91\x1d\xa5\x7f\x72\x52\x9e\xbd\x2e\x2f\x69\xba\x38\x39\x01\x46\x57\x3f\xb4\xbb\x5b\x3b\x49\x92\x30\xc8\x99\x18\x91\x78\x41\x01\xd1\x4b\x31\x46\x24\x52\x1b\xf0\x9a\x22\x4b\x36\xc8\x77\x20\x90\xf4\x86\xc6\x2d\xc4\xa2\xe8\x14\xc6\xa9\xcf\x53\x4a\x24\x80\x73\xf0\x56\x04\x5b\xba\x58\x1c\x64\xca\xca\x45\xd9\x4a\xfc\x70\xb5\x5f\xcd\xf9\x77\x07\x39\x65\x62\x7e\xaf\x94\xa5\x0c\x2f\x3c\x31\x62\x1d\xf5\x5d\x90\x86\x90\xaf\xe7\xfa\x7a\x8b\x38\xd4\x85\xd7\xc5\x6e\x7d\x99\xb3\xd9\x39\xe4\x79\x9c\xa5\x8b\x7a\x59\x80\xcc\x07\xad\x66\x69\x4d\x7a\x65\x9c\x9f\xce\xe2\xc7\x73\xfe\x95\x64\x23\x95\xca\x31\x34\x51\x61\xd1\x15\xe7\x99\x7e\x26\xe9\xf5\x75\x24\xa6\xf8\x34\x6a\x6d\x4a\x78\x4b\xb0\xbd\x25\x28\xbc\x23\xc2\x84\x2e\xce\x33\x4c\x11\x07\x09\xc8\xc5\xae\x10\x06\xc2\xb4\x81\x99\xef\x8c\xac\x05\x08\xfe\xe3\x51\x35\x1f\x59\x0c\xc0\xe5\xc6\x93\xe2\xbb\xb9\x2b\xf7\x6d\xa4\xb3\x20\xb5\xe6\x05\x96\x6e\x7c\x03\x8c\xed\xe1\x9e\x98\x28\x89\x05\x3e\xe6\xcf\xc8\x6e\x70\x8c\xd8\x7e\xfb\x6f\x5a\x77\xe8\x1c\xf5\x8d\x08\x15\x36\xcd\x5b\x72\x96\x97\x11\x5a\x35\xa4\xcc\x3e\x29\x5c\x81\xc0\x8c\xa7\x8a\x0a\xbc\x30\xe4\xe0\xde\x93\xc5\xe7\x93\x83\x27\x41\x72\x30\x74\x8b\xb2\x94\xa5\xca\xe8\x57\x40\xbd\x88\x06\xde\x64\xfa\x7d\xe8\x96\x97\xf6\xc8\x38\x2c\x3f\x3b\x3c\x8a\xde\x4e\xc8\x94\x73\xd5\x0c\x8d\x3a\x64\x6c\xfa\x9e\xed\x57\x73\xf9\xa1\x25\x3a\xf5\x2b\xc8\x16\xc7\xe4\xc3\x9a\xea\xbc\x54\x8a\x45\x1b\xfb\xf5\x97\x32\x64\xfb\x13\x51\x89\x25\x7f\x20\xa7\x15\xd5\x3c\x3b\x1b\x0c\x58\xec\x14\x10\xe1\xca\x64\xc9\x91\xa1\x33\x5e\xcf\xfe\x4a\x54\xa0\x42\x4b\x2a\x62\xa7\x6d\x6d\x99\x8e\xb3\x71\x87\x90\x93\xa1\x11\x03\x3a\x9b\xb6\xe9\xec\xe3\x73\xd2\x53\x8a\xf9\x9e\x90\x88\xf5\xb2\x5c\x48\x88\xe6\x29\x9b\x9d\xf7\xd2\xf2\x4a\x89\x85\x6a\x43\x69\x13\x8e\x42\x1c\x3a\xa9\xdf\xe7\x57\xdc\x88\xca\xdd\x14\x21\xfa\x73\x53\x92\x0f\xec\x28\x7f\x5b\xc8\x6c\x6c\x46\xd8\x6c\xbe\x37\x8e\xb0\x54\x07\x0f\xcc\x4f\xa3\x1c\xad\x48\x92\x6f\xf7\x47\xfd\x6d\xa2\xe5\x1e\x6f\xf9\x6b\x55\x8e\x99\x23\x63\x3d\x3c\x92\x74\xff\xc8\xfd\x2e\xb6\x1f\xec\xba\x43\x05\x2a\x41\xa7\x33\x38\x0c\x6d\x69\xe9\xde\x4e\xe8\x74\x37\x1f\xab\xf3\xb2\xc7\xcc\x31\xe1\x23\xfa\xdd\xfc\x79\x67\x45\x9b\x91\x60\x56\xd4\xe0\x7e\x1d\x02\xe4\xe4\x3e\xbf\x75\x0a\xbe\xe0\x0a\x72\x3e\x06\x98\x04\x4d\x15\x76\xd4\x91\x54\x0c\x00\x0e\x03\x9c\x65\xed\xdd\x20\x2a\xe3\x9f\x5e\xcc\xe3\x47\x69\x7d\xbe\x9f\xd6\xe4\x5a\xfc\x3c\x00\x75\x74\x5a\x32\xc4\xf7\x8f\xb7\x71\x6c\x01\xa1\xf5\xc0\xab\x3a\xee\xe7\xea\xcf\xfe\xa8\xdf\x87\x1d\x06\xf9\x2a\x99\x26\x54\x4e\xd1\x1a\x1e\xad\xe8\xc0\x1d\x5b\x0f\x25\xea\x9a\xd1\x9c\xae\xfa\xfd\xc6\x31\x4b\x94\xf7\x49\x8c\x62\x27\xde\xe4\xbb\x50\x56\x99\xd0\xf1\x27\xa4\x29\x80\xf1\x73\xe5\x15\x81\xdb\xd2\x42\x64\xeb\x84\x17\x47\x11\x55\x46\x9b\x7e\x93\x8e\xca\x4a\x0d\xf6\x54\xb3\x40\x27\x6b\x63\x62\x6a\x9f\xe5\xf9\xa2\x2a\xf9\x85\xa2\x1a\xc0\xf7\xa2\x7c\xbb\x7f\xb7\xbf\x4d\xe1\x6d\xb5\x9f\x2c\x62\x3d\x4f\xa5\xe5\xf5\x4c\x4a\x00\xec\xa4\x7f\x52\x9e\xc9\xdf\x77\x05\x45\xd8\xb7\x08\x37\xd3\xab\x6c\xaa\x62\x29\x43\x3b\xfe\x63\x7d\xa3\xc6\x7d\xe1\xc5\x4a\x62\xef\xf2\x3a\x1d\xe3\x7e\x3f\xa8\x34\x53\x52\x1b\xd1\x43\xbb\x82\x42\x3b\x81\x11\x68\x6b\xd5\x58\xa0\x22\xb9\xff\x97\xb7\xdb\xff\x2e\x5a\x90\xaf\xe0\x71\x91\x18\x4a\x44\xca\x4d\x13\x1a\xa7\x8c\xa5\xb3\x73\x41\xca\x44\xab\x79\x95\x91\x51\xbf\xfa\xff\xb3\xf7\x27\xec\x6d\xdb\xd8\xc2\x38\xfe\x55\x24\xbe\xb9\x1a\xe2\x06\x66\x25\x79\xa7\x86\xd1\xeb\x66\x6f\xb3\x35\x5b\xdb\xe8\xea\x4d\x68\x09\xb6\xd9\xd0\xa4\x0a\x42\x49\x1c\x89\xdf\xfd\xff\xe0\x60\x27\x21\xd9\x4d\xdb\x99\xf9\xff\x9e\xfb\xcc\xd4\x11\xb1\x2f\x07\x07\x07\x67\x5d\x90\x22\xa8\x37\xb4\x19\xe9\x67\xa3\xdb\x16\xb2\x77\x9c\xef\x75\x66\xef\xb5\x22\xdb\xd3\xa4\x3f\x4a\x8d\x94\x22\x35\x3c\x2c\x96\x6c\x92\x41\xa9\xa7\x2d\x73\x50\x76\x31\x49\xa7\xcd\xf9\x38\x77\x1a\x43\x75\xcd\x4f\xd6\x73\xea\x97\xf5\x29\x47\x7c\x62\x71\xc6\x8d\xa6\x62\x66\x5d\xfd\xfe\x85\xb0\x5f\xb9\x8d\xb5\x68\xdf\xb7\x0e\x0c\x38\xb9\xbc\xaa\x67\x9c\x78\xc3\x9d\xec\x34\xe4\x16\xd8\xd8\x92\xf7\xd2\x76\x1a\x72\x72\xb7\x8c\xc8\x7f\x45\x7a\x2b\x88\x86\xed\x0a\x1b\xda\x45\xf2\x15\xf4\x74\x03\xf7\xa5\xc5\xd4\x53\x40\x5f\x5b\xbc\x4e\xe5\xca\xa4\x7f\x2d\x3f\x79\xbb\x38\x5e\x12\xc9\x6d\x81\x3c\xb3\x97\x71\x7b\x07\x1b\xe4\xf9\xff\x36\xce\x81\xf4\x20\x9f\x4c\x82\x34\x67\x01\x0e\x66\x5a\x01\xf1\x92\xb0\x34\xc0\x41\x75\x91\x9d\xb1\x60\x8a\xbf\x24\xab\xe0\x7f\x4e\x83\x38\xf8\x3e\x9d\x7d\x94\xaf\xf6\xe0\x7f\xf8\x45\xf9\x3a\x3d\xe5\x3f\xbf\x1c\x9e\x05\x71\x70\x0f\x38\x32\xf0\x3d\xe0\xa5\xef\x57\xb3\x74\x41\x02\x7c\x8f\xe4\x26\xf3\x7e\x35\x33\x39\x4f\xc8\x19\x8b\x83\x13\x4a\xcb\xcf\xfc\x67\x80\x5f\x66\xe7\x17\x2a\x05\x7e\x07\xf8\xcd\x42\x7e\xbf\x59\x04\xf8\x5e\xf9\xb9\x90\x9f\xfc\x67\x80\x9f\x92\x62\x19\x07\x70\xf8\xbf\x30\xfe\x11\xe0\x57\x33\x5a\xe6\x79\x1c\x88\x7f\x9f\x94\xb3\x8f\x01\xfe\x39\x2b\xe2\xe0\xf9\xab\xa0\xc6\xef\x92\xd5\x49\x1c\x0c\x02\xfc\x7d\x1c\x0c\x03\x7c\x37\x0e\x76\x03\x7c\x2f\x0e\xf6\x02\x7c\x3f\x0e\xf6\x03\xfc\x20\x0e\x0e\x02\xfc\x30\x0e\x0e\x03\xfc\x28\x0e\x8e\x02\xfc\x38\x0e\x8e\x03\xfc\x43\x1c\xfc\x77\x80\x7f\x8c\x83\xdb\x01\x7e\x1a\x07\x3b\x01\x7e\x16\x07\x51\x80\x9f\xc7\xc1\x77\x01\x0e\x3e\x04\x71\xd0\x87\xb9\x1f\xf7\x83\x38\x78\xb6\xbc\x84\x9e\x6b\x7c\x3f\x59\xa5\x39\x8b\x81\x5d\x94\xe6\xec\x47\x72\x85\xe5\x42\x8b\xb4\x19\xa3\x39\x4f\xe4\x6b\x2e\x52\xf8\x2f\x9e\x02\xcb\x2f\x92\xe0\xe7\x8f\xe4\x4a\x68\x16\x3f\xfe\xf6\x13\x41\x9a\xba\xb1\x11\xe8\xd5\xde\x57\x42\x00\x49\xb1\xb5\x0f\x42\xa1\x10\x72\xda\xae\x43\x11\xce\x13\x26\x88\x88\xbb\x69\x9e\x9f\xa6\xb3\x8f\x61\x1a\x9d\x2d\x73\x98\x59\x21\xfd\xc9\x48\xf2\x42\x0b\x4c\x5c\x16\x77\x2b\x3b\xa2\xcb\xe2\xf9\x92\x55\xd9\x9c\x48\x09\x26\xcc\xda\x70\xb8\x6c\xdd\x1a\x82\xd3\x68\x5e\x5e\xea\x31\xe1\x1c\xa1\x5a\x8a\xab\x5b\x33\xd4\x57\x33\x89\x58\xf9\xa4\xfc\x4c\x28\xa7\xe0\x42\xa4\xec\xcc\xa2\x00\xe1\x2c\xa1\x62\xd5\x43\xe0\xe7\xf7\x93\x24\x51\x22\x96\xf5\x3a\xf8\x48\xae\xe6\x1c\xfe\xba\x49\x92\xf5\x7a\xfc\x73\xb9\x80\x8f\x0d\x42\xcc\xf7\x45\x49\x2f\xd3\x3c\xfb\x4a\x7e\x24\x57\x21\x15\xe1\x05\x85\xd0\x2d\x4d\x82\x80\xf7\xf0\xc4\xeb\x6a\xd2\x58\x72\x32\x34\x22\x77\x76\x06\xbd\x5e\x48\x6d\xcf\xef\x38\xbd\x9d\xb0\xdb\x7c\xc8\x35\xfc\x2e\x70\xbf\x6b\x8d\x94\x8f\x5b\x5d\xab\x9e\xb1\xe5\x96\x32\x5d\xee\x2c\x60\x92\xe1\x5c\xed\x60\x92\xe2\x5c\x2d\xe6\x39\x11\x1e\x18\x1f\x88\x2c\x6d\xd5\x9a\x04\x01\xa6\x8e\xf5\x9e\xf4\x7f\x1f\x7d\x24\x57\x23\x4b\xca\xcb\xdf\x1d\x32\xf9\xf1\x9c\x14\x2c\x3b\xcb\x08\xc5\xae\x0c\x38\x78\x53\x64\x2a\x6f\x1e\x8c\x48\x54\xb1\x94\xb2\x0a\x2c\x0e\x83\x37\xb7\xc1\xbd\x2f\x49\x84\xf5\x23\x48\x07\xee\x5e\xa4\xf4\x2e\xbf\x4c\xb4\x96\x38\x89\xaa\xe5\xa9\x20\x90\xc3\x21\xc2\x83\x03\x84\xf0\x2e\xbf\xdb\xa3\xbc\x9c\x01\xd7\xa9\xd7\x7b\xd7\x74\x1e\x2c\xf8\x73\xc9\xbb\x09\x99\x1a\xae\xdf\x17\xf1\x54\xb7\xcd\x0e\x69\x42\x5d\xc8\xc1\x41\x27\xe0\x10\x32\xe6\x6f\x58\x40\x90\x1c\x37\x24\xc2\x09\x28\x4d\x82\x79\xc9\x02\x84\xcd\x16\x67\xc9\x9d\x55\xd6\xe5\xb9\xf7\x27\xd9\x34\x64\xd0\xef\x6d\xfe\x0a\x14\x1b\x49\x6e\x27\x14\x13\xb5\xe6\xee\xc1\x92\x24\x9e\xda\x4c\x50\x15\x6b\xee\x4a\x81\x12\x70\x57\x92\xf1\x43\xf4\x70\x99\xd2\x39\x99\xc3\xe9\xa1\xc0\xcf\x54\x0d\xbb\x60\x69\xf4\xef\x49\x35\xe3\x83\x67\x63\xfe\x8b\x63\xea\xeb\x6c\x26\xff\xee\x4b\xea\x75\x02\xca\x26\xe4\xc1\x09\x6f\xf7\xfd\x6c\x1f\x07\xa7\xb4\xfc\x5c\x11\x1a\x60\x5b\x11\xe7\xc9\x69\x66\x34\xa3\xb3\xe8\xf4\x5e\x8d\xad\xdc\xf3\xe3\x13\x93\x6b\xdb\x7b\x46\x8e\x12\x1f\x5e\x46\x42\xc3\xa5\x36\x3a\x30\xa6\x19\x50\x91\xf1\x29\xfb\x58\x7a\x46\x45\xf4\xf2\x5e\x66\x14\x8d\x10\xd6\x8a\x69\x52\xd3\x66\x5a\x4f\x11\x7e\x9e\x4c\x26\x53\x7b\x7c\x5f\x5f\x5d\x98\xf1\x05\xb4\x2c\x59\xe0\x8c\xff\xf7\x27\xc5\xd6\x9e\x3b\x42\xca\xff\xfb\x93\xc2\xf4\x63\xea\x2f\x78\x5d\x78\x66\xc7\x4f\xf5\xc4\x64\x39\xa9\xf7\xf3\xb2\x7f\x8a\x61\x11\x37\xd4\x7b\xec\xab\x37\xad\xb1\x3d\x8d\xb7\xa6\xf8\x5b\x59\xea\x0c\x7f\xc2\xc0\xba\x9b\x3a\xd3\x79\xf0\x6b\xe9\x18\xd4\xbc\xb5\x72\x2f\x9d\x9c\x4f\x56\xce\x27\xd3\xfe\x27\x77\x14\x56\xd3\xf3\x7b\xe7\xa6\x98\xf8\x14\x45\x61\x8e\x76\xd9\x33\x53\xee\x4c\x96\x59\xe0\x56\xa9\x2c\xfa\xe1\x81\x29\x78\x61\x56\x77\x32\x9d\x02\x16\xff\xb8\x8d\x55\x2f\x9c\xe4\xb6\x15\x97\xbe\x17\x20\x2c\x54\xfd\x3b\x17\x69\xd5\x49\x73\x4a\xd2\xf9\x55\xe7\x94\x90\xa2\x93\x97\xe9\x9c\xcc\x55\xb4\xfd\x4e\x41\xc8\xbc\x23\xe2\x7a\x40\x44\xfd\xf2\xf2\xb2\x2c\x3a\xc6\x55\x71\xa7\x5a\xce\x2e\x3a\x69\xd5\x79\x76\xfe\xf8\xac\x93\x16\xf3\xce\xb3\xf3\x07\x25\xed\x70\xfc\xd8\x49\x3b\x79\xfa\xf5\x4a\x36\xd9\xb9\x84\x1e\x71\x47\xf0\x3c\x3a\x77\xa1\x29\x39\x8c\xac\xa8\x18\x49\xe7\x1c\x0f\x59\x16\x0a\xaf\x08\xfd\x44\xe8\x6b\xad\x69\x76\x73\x5b\x05\xd8\x78\xdb\x5c\x01\xd8\xed\xd6\xda\xce\x9c\xad\x86\xe2\x35\x9e\x7f\x83\xdd\x82\xc4\x38\x0c\x0f\x86\xa8\x61\xc4\x50\x6c\x31\x62\x28\x84\x11\x83\x19\xfb\x73\xac\x0d\x1a\xb2\x88\x7c\xc5\x45\x74\xf1\xf0\xa1\xc7\x57\xe2\x0b\xf7\xe0\x3d\x0b\xe1\xe4\x3f\x79\xf0\x10\x29\xac\xc7\x21\xe3\xd9\x76\xc8\xb0\x35\x11\xce\x09\x03\x2d\xd7\xa6\x2e\xc9\xbc\x9c\x45\x8c\x67\xd4\x95\x2a\x61\xd7\x14\x79\x09\x5b\xaf\x83\xe0\x2f\x45\xd3\x30\x1f\x57\x6d\xfc\x85\x4f\x3f\x5c\xa2\x2a\xb5\x40\xc1\xb2\x98\x93\xb3\xac\x20\xf3\xa0\xab\x58\x53\x42\x55\xb3\xd7\x13\xff\xd6\x78\x78\x7c\xb4\x7b\x74\x23\x35\xf2\x07\x7d\x0f\xa2\xbb\xa4\x35\xfe\xfe\xab\x27\xe3\x09\xad\x71\x7e\xd7\x93\x71\x45\xb7\x6a\x8c\xe3\x34\xa1\xe1\xc1\xe1\xfe\xe1\x1e\xa7\x65\x69\x78\xbc\xb7\xd7\x1f\x22\x5c\x25\x34\xdc\x3f\x1e\x1c\xef\x5a\xdb\x5e\x5a\x4f\x5c\xbe\xef\x69\x74\x05\xc1\x75\x80\x85\x3d\x62\xf4\x6a\x45\x13\x7e\x79\xcc\x52\xc6\x6f\x7a\xd7\x2e\x85\x44\x04\xce\x7e\xa6\xc8\x8b\x10\x94\xd7\xf2\xe8\x1e\x0a\x29\x8a\xc3\x3e\xae\xa2\x19\x0a\x11\x02\xf2\x65\x46\xb3\x53\x19\xe6\x9b\x8f\x7c\x96\xd0\x70\xb8\x7f\x3c\x38\x44\x78\xce\x7f\x1e\x0c\x07\xfb\x08\x2f\xf9\x70\xfb\x87\x7c\x12\x17\x7c\x3e\xbb\x7b\x83\x3e\xc2\x0b\x3e\xf2\xa3\xfe\xe1\x00\xe1\x33\xfe\x73\xb8\xb7\x37\x40\xf8\x3c\xa1\xe1\xe1\xf1\xe1\xc1\x3e\xc2\x97\xfc\xe7\xe1\xae\x33\xb5\x4f\x36\x33\xbe\x3b\x50\xe4\x8e\xd6\x90\x57\xb6\x0a\xc9\x10\xc8\x9a\x6e\x1f\x19\x63\x7f\x33\xd1\x2c\xca\x39\xdd\xcc\xd7\x46\xb1\x38\x35\xe7\xf0\xaa\xcd\xaf\x4a\xba\x03\x09\xcc\xe9\x6c\xb6\x04\xe9\x5f\x69\xc4\x98\x84\xcc\x35\xbb\x2a\xad\x5e\xf1\x4f\x5a\xcf\xd2\x3c\x77\x25\x2d\xd6\x72\xf1\x7e\x4f\x15\x93\xce\x6a\xd2\x34\xe8\x34\x67\xc6\x76\x6a\x14\x3b\xa2\x27\x37\xe1\xab\xd9\xe3\x35\x6e\x04\x88\x16\xaf\xaa\x01\xcb\xb0\x3f\x40\xc9\x27\x7d\x30\x62\xe6\xc5\x9a\xc7\x9c\xa7\x81\xf1\x32\x64\xaa\x13\xae\x1a\xe9\xf6\xed\x1e\x58\xfd\xbe\x90\x52\x1e\xe5\x97\x43\xcd\xc7\x69\x93\xd1\xab\x67\xa2\xdc\xc8\xac\xa7\x12\x6e\x11\x8e\x72\x85\xd6\xbd\x6c\xac\xb6\x2a\xb8\x0a\x1a\x30\xf8\xdb\xb7\x47\x0e\x94\x37\x16\x21\xb4\x56\x18\x13\xeb\x04\xb4\xba\xd3\x87\xc0\x0c\x8a\x6e\x18\x14\x45\x35\x00\xff\xdd\x84\x86\x7b\xfb\x7b\xbb\xfb\x08\x9f\x70\xd0\x1d\xf4\x8f\x2c\xc8\xb5\xe5\xf1\x1e\x74\xd7\x07\x6a\x56\x9f\xae\x98\x18\x10\x7d\x0b\x8a\x4a\x12\x04\xde\xfa\x2e\x6e\x3e\x2c\x56\xb2\x54\x7b\x27\x85\x8f\x7f\xf6\xad\x0b\xfd\x24\xfa\xf9\x7a\xa0\x7c\x1f\xda\xf5\x4d\xa7\xef\xb7\xc1\x5d\x13\xe6\xc4\x40\x24\xb4\xf1\xd7\x0d\xc8\xbc\x41\x9f\x41\x31\x8d\x97\x05\x4b\xfa\x06\x3e\x9c\x6d\xe4\x35\x54\xd4\x02\x68\x0a\x4b\xe5\x21\xa8\x76\xfb\xf6\x48\xa9\x4e\xfc\x93\x8e\x89\xf2\x56\x13\x93\x49\xf6\x5f\x74\x0a\xf6\xbd\xe5\xe5\x02\xf4\x6e\x1a\x2e\x6f\xac\x6d\x1b\x59\x81\xcf\xa0\x55\x50\x40\xbc\xd3\x6f\x58\xfc\x41\xd6\x1d\x6b\x24\x63\xf3\x33\x36\x25\xd4\xf8\xf8\xc0\x35\xbb\xb8\x48\xfa\xa3\xe2\x9f\x74\x54\x18\x3e\x71\x91\x90\xdb\xb7\xff\x8b\x8e\x84\xd0\x2d\xcc\x26\xc5\x14\xd5\x35\x8b\xcc\x80\x05\x18\x3d\xe2\x60\xb4\x77\xc0\xc1\xe8\x33\x47\x9c\xfb\xc3\xbd\x21\xc2\x4f\x39\x8a\xdc\xdb\x3b\x3a\x44\xf8\x49\x42\xc3\xa3\xa3\x3e\xc7\xfe\x5f\x78\xd9\xdd\xc1\x71\x1f\xe1\x77\x1c\xb3\xee\x0f\xf7\x0f\x11\xbe\xcf\xef\x8f\xe3\xc3\x83\x01\xc2\x8f\x79\xb5\xdd\xfe\x1e\xc2\xaf\xe1\xce\x38\x18\x0c\x39\x59\x4f\xc3\xe1\x51\x7f\xef\x18\xe1\x8f\xbc\xd6\xf1\xe1\xe1\x2e\xc2\x2f\x78\x81\xdd\x5d\xde\xd9\x33\x5e\x6b\xb0\xdb\x3f\x44\xf8\x25\xbf\x75\x8e\x8e\x39\xee\xbe\xc7\x7f\xee\x0e\x8f\x86\x4a\x4a\xfd\x60\x83\xfe\x6d\xa6\x0f\xf0\x92\xe6\x09\x51\x50\xf4\x9b\x86\xa2\x56\x45\x4c\x93\x20\xbb\x5c\x10\x0a\x7e\x2f\x02\x69\x7d\xd8\x8e\x5c\x26\x0d\x29\xb2\xb2\x78\x4d\xb3\xf3\x73\x42\x8d\x9e\x48\xc5\x4a\x2a\xfd\xc4\x26\x59\x6d\x3c\x0f\x49\x58\xff\xf0\x4c\x57\x7d\xc5\x9f\xea\x61\x36\x8f\x3b\xb7\xd4\x78\x6b\xdc\x59\xd2\x3c\xee\xfc\x43\xa6\x2c\x69\x5e\xff\x03\x7d\x50\x23\x7f\xb8\x6d\xe4\xed\x51\x2e\x69\x7e\x72\xc6\x08\x7d\x49\x04\xed\x5b\x25\x74\xeb\x80\xee\x17\xf3\x1b\x0c\x07\xd2\xdc\x76\x9d\x12\x6e\x96\x3d\xfc\xaf\x7f\x6c\xf8\x94\xa4\x55\x59\x5c\x33\x66\xc9\xd5\xfa\x23\xab\xf8\xfd\x1f\x1b\x06\x60\xe0\xeb\x56\x4e\x60\xe9\x1b\xac\x1d\xb4\xa6\x8b\xc1\x57\x6d\x86\xf6\x66\xdb\xd0\x7c\x21\xf4\x3c\x5b\x2c\x6f\xef\x8d\x00\xf8\xb2\x5c\x32\x52\xbd\x24\xb3\xf2\xbc\xc8\xbe\x92\xbf\x63\xcb\x71\x07\xba\xd7\xcd\xc2\x97\x35\xcd\x5b\xff\x82\x69\x02\x2f\xa7\xba\x7b\x41\x66\x1f\x6f\x7a\xd0\xfe\xea\x69\xfe\xbe\x7d\x9a\x26\xe8\xfd\xcd\x27\xaa\x04\x76\xe5\x32\x9f\x9f\xf0\xd7\x2c\x38\x68\xdf\x3e\xfd\xbf\xe7\x58\xfb\x27\x8f\x3b\xee\xd8\x4c\xb6\x93\x6c\x2d\xd2\xcf\xff\x0a\x90\x27\x55\x99\x7f\x22\xff\x2e\x38\xf8\xf5\x5f\x37\xc5\x7f\xe5\x5e\x9b\x09\xfe\xe0\x7d\xab\x53\x8e\x68\x12\xb6\x09\x05\x09\x57\x0e\x4f\xca\x74\x2e\xf6\x65\x91\xb2\x0b\xdd\x03\xd4\x05\xab\x48\xab\x9b\x9f\xfe\x5c\x37\x7c\x6d\xae\xef\xe4\x47\x6f\x27\x55\x91\x2e\xaa\x8b\x92\x79\xfb\x01\xa9\xaf\x04\x6d\x7d\xaf\x8b\x9e\xd4\xa2\xaa\xfa\xa2\x4f\x31\x26\xe5\x23\xdb\x93\x05\x83\x02\x2e\x85\x75\x6f\xfd\xf2\xa7\x47\x66\x56\xe0\xaf\x1c\x17\xf3\xb3\x6a\xb6\x0e\xec\xef\x5f\x2d\xf2\xa7\x46\xf5\xf7\xac\x14\xdd\xac\x99\x0c\x55\x29\x88\x26\x14\xd1\xba\x28\xa5\xad\xaa\xd2\xbe\x2d\x66\x17\x1b\x28\x11\x21\xc1\x0d\x45\x09\x33\x66\xf1\xcd\xcf\xaf\x6a\xcb\xe4\xa9\x94\xf1\x87\x46\xc2\xa4\x3f\xad\x71\xa7\x99\x38\x98\xd6\x1f\x84\x25\x9f\x98\x8f\x50\x86\x63\x49\xb0\xa0\xd9\x65\x4a\xaf\x02\x49\x8b\x17\xfe\x65\x5f\xa4\x34\xbd\xac\x12\xb6\x5e\xaf\xea\x5a\x58\xc5\xac\x5c\xd7\x14\x0b\x5a\xb2\x92\x5d\x2d\x48\x43\xd4\x14\x89\xd7\xa2\x69\x04\x8b\xa8\x14\x8d\x07\xbd\xe5\x0d\x56\xbe\xa8\x44\xe9\x09\x9b\x8e\x1c\x13\x19\xa5\xd2\x4e\xd0\x98\x4c\xfa\xd3\x98\xd4\x96\xb0\x4f\x1a\xd7\xfc\x15\x6d\xc7\x13\x32\x95\x4d\x4f\xa6\xc0\xc9\x10\xee\x41\x57\x3e\x8f\x1c\xa6\x4d\x54\x1b\xd5\xf9\x94\x35\x18\x68\x52\x75\x55\x08\x24\x59\x02\x41\xf1\x5d\x42\x38\x2b\xce\x81\x16\x0d\xcc\x83\xdf\xb5\x21\x91\x0c\xf5\x4d\xf5\xe2\x4e\x70\xdb\x48\xef\xc8\x24\x67\xd3\xa4\xdb\xc7\xc4\x0c\xaa\x64\x4d\xb7\x25\x14\x60\x5d\x89\x84\xbf\x0b\xa4\xcb\x57\xc9\x01\x63\x46\x16\x7c\xb6\xcc\x73\x10\xf5\x41\x85\xa7\x29\x9b\x5d\x80\x96\xff\x45\x5a\x01\xa2\xa2\xa4\x08\xd1\x7a\xad\xaa\x6a\xcf\xb2\xc8\x2b\x2b\x5e\xd5\x0d\xa5\xa8\xcc\xa3\x14\x45\x92\x6c\x92\x4e\xf9\x3b\x7e\x92\x2a\xfb\x3e\x4b\x42\x1a\x07\x08\x15\x13\x5b\x02\x3a\x40\xd3\x84\x8e\x40\x49\x93\x97\xee\xaa\xd1\xda\x43\x90\xdb\x0a\x5d\x2c\x2f\xc9\x3c\x66\xda\xf1\xb2\x1a\x03\xc2\x8b\xb2\x7a\x01\x3b\x1a\x17\xd6\x96\xce\x1a\x2a\x6f\x6c\xec\x7a\x66\x91\x1e\x6d\x70\x96\x10\x27\x87\xa8\x1c\xa1\xca\xbb\x5e\x77\xb3\xf5\x5a\x09\xaf\xbb\x49\xe6\x0a\xae\xbb\x03\x60\x2d\x14\x8d\x05\xa2\xf6\x02\x65\x67\x61\x91\x50\xbe\x38\xdd\x39\x0b\xd9\xa4\x98\x62\x32\x29\xa6\xc8\x34\xa1\x15\x82\xf4\xe8\xe7\x4c\x9b\x30\x34\xbd\xb8\xf4\x7a\xcd\x23\x20\x8e\x90\x1e\xa2\xb6\x9f\x36\x1d\x68\xdf\xc7\x51\x14\xb1\x69\x54\x95\x94\x85\x08\x67\xf0\x4d\xd4\xb7\x96\x24\x47\xe4\x13\xa1\x57\xa1\xf4\xc6\x9c\x4d\x88\x88\xfb\x5e\x5b\xea\x68\x16\x98\x2e\xed\xb3\x23\x86\x66\x30\xcc\xac\x2c\x66\x29\x13\x26\x0a\xe1\x64\xca\x31\x8a\xae\x78\xe1\xe8\xb8\x29\x28\xee\x8f\xd9\x84\xe9\x90\xf4\xc2\xf9\x8c\xa9\xb3\x90\xeb\x62\x5c\x05\xd3\x4e\x56\x74\x18\x6a\x05\xdd\xa5\xa8\xd7\x23\xe0\x59\x07\x53\xab\xd3\x33\xe6\x78\x5f\x28\xa2\xbb\xbf\x3f\x47\xe0\x1b\x27\x86\xcf\x9f\x1e\xfe\x0a\x9f\x8a\x01\xae\x7c\x21\x50\x41\xf5\x71\x04\xc5\x0b\xce\xa2\xf2\x0c\x19\x14\x71\xce\x92\x15\xf9\x92\xce\x98\xe6\xf2\x77\x58\x68\xd4\xa9\xbb\xef\x41\xf8\x4f\xc0\x39\x47\x85\xa9\xfe\x89\xd6\xeb\xee\xdd\x0d\x79\x38\x43\xeb\x35\x89\x84\xdf\xb9\xe7\x67\xea\xdc\xc2\x39\x69\x26\x9a\x9d\x36\x0b\x53\xf0\x85\xa1\xd1\x4c\x15\xe1\xe3\x20\xfa\x73\x52\x4c\xd7\xeb\x2e\xef\xda\x4a\xc1\xd4\xf9\xca\x7c\x20\x8a\xf9\x09\x26\x2c\xbe\x62\x35\xbe\x6c\x4d\xdb\x61\x36\xca\x23\xa8\xab\x78\x0b\xb9\x67\x4f\x21\xa4\xa4\xe1\x46\x49\x24\xf7\x7a\x8d\xd2\x02\x50\x69\x72\x07\x0e\x16\xe5\x07\x8b\x4e\x11\xaa\x71\x76\x5e\x94\x94\xcc\xe3\x10\x25\x77\x1c\x47\xf1\x9f\x58\x43\x07\xee\x9c\x4d\x04\xde\xa9\xa6\x21\xa7\x2b\x4a\x86\x89\xf8\x87\x46\x97\x29\xa3\xd9\x17\x81\x5c\x50\xaf\x77\xc9\x8b\x82\xce\xbf\x48\xe2\x15\xac\x4f\x4c\xec\x2f\xd4\xeb\x75\xc3\x00\x56\x47\x60\xe2\x33\xe9\x9c\xa5\xd7\x63\xfa\x37\x1c\x56\xf5\x61\x41\xe9\x55\x73\x94\xa7\x22\xc1\x06\x14\xab\xb8\xcc\x55\xe0\xc6\x74\x29\x75\xa8\x14\x3e\x32\x9c\x49\xab\x8c\xc2\xa8\xba\x90\xda\x6c\x80\xdb\x02\x53\x80\xc3\xc6\xd5\xc1\xc1\xb6\x80\x1e\x51\xed\xeb\xd2\xd2\x4d\xd2\x47\x80\xd9\xa3\x17\x4d\xd8\x49\x0e\xbc\x35\x0e\x38\x71\xe1\x98\x19\x38\xa5\x1c\x8e\xf9\x7a\xd9\x49\x98\x38\x5f\x5e\x40\xd6\x4b\x41\xf5\x0a\xb4\x66\x01\x32\x38\x99\xdd\xce\x54\x6d\x75\x43\x77\x72\x05\xea\xf5\xdc\xb9\x15\x38\x43\x7c\xdf\xf5\xa0\x32\x36\x45\xbd\xde\xa9\x33\xec\x8c\x4d\x31\xc1\x29\xce\x6c\xca\xe4\x6e\x13\x12\x88\xc2\xce\x04\x67\x28\xb9\xc3\x61\x72\x1a\xb2\x49\x36\x15\x64\x0d\x61\x84\x56\xc2\x39\x84\xfc\x40\x48\xd2\xc4\xfe\x88\x9e\x92\x26\x2e\x35\x31\x6c\xc1\xb0\xa2\x87\x15\x84\x26\x14\xc8\x2b\x53\xe2\x69\xba\x68\x4a\x8c\x9c\x4c\x6d\x8f\xed\xa4\x26\xa9\x54\x43\xb6\x8f\x8b\xb2\xa6\x75\x4a\xb6\x09\xf0\xce\x53\xbe\xac\x34\x03\x0d\x21\x19\xc4\x4d\xce\xef\xd5\x26\xef\x10\x6a\x1b\xd4\x0c\xd5\x8a\xab\xe9\xc9\x50\x7a\xe0\xfb\x6c\xc1\xf1\xb6\xbc\xf9\x94\x3d\x8d\xf0\x0f\x51\x3b\x27\xc0\x55\x28\x6e\xa0\xe3\x3b\x42\xa0\xd6\x4c\xde\x42\x92\x6a\xe8\x96\xb0\xe5\x99\xf8\x13\xe6\x4e\xf7\xed\xa6\xe9\x72\x64\xa6\x5f\x36\x1a\x0c\x12\x22\x43\xd6\xc9\x04\xcf\xd6\xd9\x79\x7a\xe7\xec\x44\xbd\x71\x36\x74\xe1\x76\x39\xcf\xe8\x3f\xea\xd1\x6b\xd0\x7e\xef\x5a\xa6\x31\x83\x39\x88\xc6\xf7\xcc\xd0\x22\x54\xee\x88\x28\x31\xa1\x53\x19\x0b\x5c\x9a\x7f\xb0\x95\x32\x44\x60\x2b\xd0\xb8\x6b\xfa\x10\x78\xc0\x2c\x6d\x39\x10\x50\xf1\xdb\x0f\x8a\xbe\x2c\x4b\xf6\x4a\x00\x09\x58\xbe\x42\xe2\x4f\x06\x38\x4d\xa2\xf2\xb0\x25\x02\xe7\x68\x30\x34\x3d\x7d\xf8\xee\xd6\xea\x0b\x53\x37\x49\xb7\x8f\xea\x0f\x0d\x1d\x44\x55\xb2\x71\xc3\x5d\xa6\x8b\xd0\x0e\x53\xc1\x26\x64\xc3\x9b\x87\xa2\x31\x55\xfe\x0b\x3f\xdc\x5a\xdd\x07\xaf\x6a\x09\xfc\x60\xa8\xfe\x80\xa2\xdf\xca\xac\x08\x83\x5e\x80\xe2\x46\x36\x45\xf5\x87\x1a\x45\x67\x59\xce\x08\xe5\xd5\xbb\x5d\xeb\x09\x22\x17\x7d\xfc\x61\x7c\x6b\x45\x4c\x23\xf5\x87\x38\x08\x6a\xf7\xaa\x93\x5a\x0b\xb2\x2a\x44\x59\xb9\xb5\xa2\xf5\xad\x55\xdb\xfe\x47\x23\x8f\xf1\x87\xff\x73\x6b\x05\x2e\x95\x64\x02\x26\xc5\xac\x9c\x93\x37\x2f\x1f\x87\x99\xec\x45\xbf\x77\x9f\x0a\xa7\x10\x9f\x99\xb9\xb9\x9f\xb8\xe4\xa2\x46\xc6\x72\x25\x3e\x82\x7e\xbe\x1c\xf6\x77\x81\x75\x3b\x7e\x61\x96\x39\xb0\x7b\x8f\x21\xeb\x6c\x49\x0f\x27\x76\x44\x75\x0b\x33\x8f\xbf\xb4\x70\x75\x77\x80\x62\xd0\x30\x9d\xe8\x8d\x5a\xd8\x85\x14\x1a\x59\xf1\xb7\x4d\xc6\x7a\x3d\x69\xbd\x0d\xcb\x15\x0b\x30\x01\xc7\x79\x1f\x50\x8d\xf4\xed\x7b\xa7\x2f\xa2\xd6\x84\xb7\x56\x54\xcd\x86\x4f\x07\x7d\x88\x49\xed\x09\x49\x61\x94\x23\xb6\x0c\x83\xdf\x14\xab\x2c\x11\xc3\x08\x69\x42\x25\x61\x1e\x12\xc8\x04\xaf\x18\x1b\x2a\x75\xb7\x56\xa2\x75\xc8\xb0\xf4\x61\x40\xa1\xfd\xf1\xc4\xbb\x52\xd3\x78\xa2\x8c\xf3\xbe\x70\x14\x0b\xf3\x9e\x6a\xe0\x1b\x24\x89\x7b\x20\x5a\x18\xb1\xd7\x53\xda\xe1\xce\xb6\x7c\xb8\xb5\x82\xcd\xab\xbf\xbb\xb5\x22\x93\xfe\xb4\xfe\x10\x9b\xa4\xd0\x00\xb2\x5c\x43\x0b\xfd\xbc\xb3\xe1\x49\x83\xe2\x5d\x65\x17\xc6\xcf\xa4\xb2\xc6\xfa\xee\xbf\xf6\xfa\xdf\x9d\xe3\xe0\xff\x06\x76\xda\xee\xc9\x77\xe7\x19\xe6\x2f\x5b\x2b\x71\xb8\xc7\x0b\xde\x72\xd3\xee\x42\x41\x6c\x03\xe5\x7d\xbb\xf7\x77\x8d\xde\x76\xbf\x87\x0a\x23\xbb\xc2\xe3\x2d\x15\xfe\x27\xe4\x9d\xfe\xd7\xf0\xc8\xee\xf6\x7f\x90\x48\x3c\x76\xc7\x72\x00\x4d\xf7\xec\xa6\x5f\x3b\x96\xb9\xc4\xb3\x12\xa6\xec\x73\xbb\xec\x6b\x40\x74\xba\xc3\xdb\xa2\xc3\x7e\x80\xac\x0a\x1f\xad\x0a\x1f\x6e\xad\x1e\xeb\xc8\xfb\xf5\xad\x95\xc7\x53\xae\x1f\x2b\x7e\x18\x41\x4d\x81\xc8\x78\x13\x13\x32\xb5\x50\x5d\x80\x6a\x68\x55\x5f\x4a\xf5\x07\x89\x47\x5e\xb0\xe4\xbb\xff\x37\xf9\x7f\xff\xf3\x5d\x88\xc6\xa3\xe4\xff\x4c\x6f\x7f\x67\x10\xca\x33\x57\x15\x21\x02\x3b\xdc\xf0\x85\x85\x11\x05\xdf\x2a\x08\x64\x63\x2f\x45\x63\xc9\xb8\xc7\x1b\xc2\xf7\xc4\xa7\xf8\x52\x02\x72\x3f\x53\x6e\x49\xb5\xa2\x06\x25\x97\x69\x56\x64\xc5\x79\xc2\xea\xf6\xe5\xe3\x5c\xc8\x92\xeb\x21\xe2\x79\xa4\x39\xa0\x35\x1c\x04\xca\x1a\x4c\xb7\x24\x1d\x60\x2e\x08\x11\x02\x38\xc9\x72\x19\x07\x68\x43\xce\xff\x09\xd0\x18\xdc\xea\x30\xfe\x26\x5f\xd5\x28\x36\x5f\xea\x7e\xaf\x88\x85\x26\xeb\xf6\x8d\xa8\x75\x2d\x56\xb5\x8e\x1e\xd5\x1a\xf0\x38\x40\x68\x5e\xae\x4c\x9b\xa6\x09\x0e\x55\x9f\x2f\xb2\x9c\x6c\xa8\xda\x0b\x2c\x63\x8c\xba\x71\xf9\x6e\x5f\x26\x3e\x3d\x1f\x18\x3b\x8b\x26\xbd\xa5\x35\x66\x0a\x4e\x33\xda\x2b\x2c\xef\x89\x95\x0c\x43\xe5\xdb\x18\xe5\x9b\x9f\xa3\xe1\x33\xa5\x77\xd4\x5c\xf8\x10\xb6\x44\xea\xb0\xe8\x45\xd1\xbb\x2f\x15\xa2\x9a\xb5\xbe\x0b\xf8\x63\xd2\x9f\xb5\x2d\x2f\x0c\xd0\x08\x89\x01\xa7\x0b\xb6\xa4\x44\x40\xd0\xb6\xfe\x85\x9e\x8c\x9a\xa7\xaf\x45\xe5\xf3\xdf\x69\xd2\x30\x6b\x2b\x02\x01\x85\xab\xb0\xdb\x47\xca\x9f\x9f\xb1\xe7\xd8\xb4\x28\x70\xbf\xb4\x9b\x18\x20\x84\x43\xc3\x19\x5a\xaf\xbd\xcc\x82\x3b\x7d\xa8\xcf\xaf\x83\x44\xc2\x31\xbf\x15\xa5\x99\xbc\x35\x3d\x0d\xb2\xcf\x5a\xc0\x30\xd2\xfb\x2e\x25\x0d\xcd\x41\x8e\x02\xd4\xb6\xea\xbf\x7f\xb9\x60\x57\x10\x05\xba\xb3\xa4\x79\x47\x92\x24\x9d\x59\x5a\x14\x25\xeb\x5c\xa4\x9f\x88\xa1\xb7\x2d\xb9\x9f\xee\xb6\xfe\x47\xd4\x70\xaa\xa5\x56\x95\x09\x97\xd8\x6f\x59\x08\xc8\xd9\x3a\x95\x4f\x2d\x9e\x84\x3e\x99\x6e\xa2\x7d\x34\x39\x28\x6e\x00\xda\x91\x06\x0f\xb5\xe8\x70\x2a\x1b\x87\x4e\x25\x6b\x44\xe9\x5f\x3c\xed\x64\x65\xe4\xcc\x83\x28\x18\x10\x06\x45\xfe\x81\x24\x01\xda\xba\x37\x82\xfc\x50\x8f\x37\xd9\x32\x45\xa8\x66\x93\xd7\xfc\x52\x98\x26\xaf\x81\xb6\x6d\x63\x18\x6f\x08\xaf\x26\xc6\x7f\xe9\xc3\xf8\x7f\xeb\x1c\xb7\x8d\xe6\xde\x8d\x46\xb3\x71\x49\x94\xa8\xe0\x39\x13\x11\xe8\x9e\xf3\x95\x81\x61\x35\x19\xa4\x19\xd2\xf6\x50\x6d\x37\x44\x04\x41\x3c\xb1\x09\x99\x62\x9e\x9b\x10\x78\x01\xc9\x68\x75\xc2\xb1\x02\x4f\x2e\x6a\xfb\xbc\xba\xfe\xd0\x35\x12\xd4\x98\x82\xe3\xa3\xae\x7f\x79\x10\xc7\x01\xee\x24\xf5\xe9\x1e\x19\x26\x7e\x1b\x38\xb4\x2e\x9e\x4a\x99\x28\x42\x1a\x84\x10\xc1\x77\xca\x1e\x0e\xa9\x1f\x23\x61\x14\xd7\x3a\xcc\x77\xc5\xa9\x85\x09\xc1\x71\x76\x04\xf9\x1f\x90\x64\xf4\x1b\xeb\x37\x4e\xf9\xdd\xd9\x19\x8c\x43\x60\x21\x81\x5c\x03\xb8\x68\x76\x3e\x72\x77\xa8\x68\x7c\x43\x91\x98\x6f\x66\x91\x64\xda\x2e\x3d\x4d\x7c\x97\xf0\x88\x4c\x8a\x69\xd2\x24\x94\x53\x85\x05\xc7\x29\x47\x80\xd6\x45\x9e\x1a\x3f\x05\x8d\xcb\x8a\x93\xc2\x0a\xc4\xea\x06\xa2\x6b\x85\x0f\x52\xbb\x51\xd9\x65\xea\x66\xa3\xc6\xaa\xd9\x7b\x17\x31\x7d\x6d\x58\xe4\x4f\xa3\x7d\x2d\x18\xd2\xc2\x28\x78\x3e\x1b\x8c\xb8\xd2\x9e\x87\xda\xbd\x7b\x70\xf3\x97\x05\x44\xd0\x92\xde\x56\xa2\x0f\x9a\x71\xf2\xdb\x06\x83\x07\xc1\x04\x13\xf1\x9c\xca\xb2\x49\x65\x40\xb6\x08\x90\x25\x4d\xcb\x5b\x8a\xac\xfc\x22\x78\x40\xcb\x4b\x69\x2c\xde\x7c\x58\xdf\x19\x8c\xc9\x44\x7d\xec\x48\xbf\xfa\xb5\x7a\xcd\xd8\xad\x3d\x64\xa1\x8e\x09\x07\xfe\x0a\x0c\x42\xd0\xaf\x1f\x1d\xc1\x40\x06\xed\x8a\x27\xd3\xfa\x2c\xa3\x15\x53\x2e\x05\xae\x6f\xad\xd7\xb3\x9a\xd3\xaf\x4f\x8b\x75\xda\x9f\x8a\xc6\xc5\x48\x2b\xe1\x35\xc6\x39\xe7\x5f\x37\xb5\xad\x18\xf9\xc3\xf1\x64\x1a\x3b\xd3\xde\x38\x03\xc5\x97\x20\xc9\x1d\xfe\x62\x66\x1c\xa1\x3b\x0b\xaa\xf6\xa3\xd9\x69\xb3\x21\xeb\x91\xf7\xd0\xbc\xfd\x41\x6c\x25\x4b\xa8\x51\x3a\x6c\xe6\xf2\xcc\x66\x33\xbb\xcb\x47\x1b\xfe\x4f\x1d\x51\xb6\xee\xed\xeb\xb6\xde\x26\x64\x7a\x7d\x77\x99\x58\x51\xea\x48\x76\x91\x36\x62\x58\x16\xc2\xfe\x97\x20\x9c\x19\x91\xb7\x54\xb6\xdc\xc4\x0f\x74\x82\xeb\x19\xde\xa7\x47\xb9\xe1\x35\x25\x04\xfc\x1f\xdc\xb2\x6a\xba\xaf\xe6\x37\xcc\x1f\xf6\x82\xd9\xec\x6d\xdb\x6c\x98\x4c\xe4\xb6\x44\xe5\x92\xe5\x84\x4d\x13\x88\xfd\x29\xd5\x13\x8d\xa1\x78\xf3\x54\xb6\xd5\xcc\xb5\x42\x09\xc1\x3f\x8a\x7b\x00\x33\xe4\x61\x35\xba\x9a\x22\x56\x20\x79\x33\x8b\xdf\x1b\xc2\x61\x97\x9d\xa2\x52\x39\x36\xf9\x41\x3e\x91\xf8\xff\x83\x80\xff\xcd\x18\x26\x58\xc6\xc9\x00\x26\xdf\xce\x80\x3f\xa1\x6c\xce\xe2\x4f\x2c\x0c\x02\x20\xe0\xbe\x67\x21\xc5\x93\x29\xe2\x0f\x54\xcc\x77\x0d\x1a\x9d\x47\xbf\x84\x13\x49\xdf\x41\xa3\x68\xca\xef\x6a\x95\xb5\xaa\x11\x4e\x9d\xaf\xdc\xf9\xaa\xf4\x57\x10\x20\x5c\xc2\xd7\xcf\x2c\xcc\x70\x81\x73\x5c\xe1\x54\x0c\x91\x46\xce\x89\x2c\xcd\xfa\x89\x1c\x18\xdf\x2d\x61\x70\xf0\x3d\x0b\x4b\x3e\x4c\x4c\x15\x3f\xf5\x67\x8f\xb0\x00\xf3\x1e\x52\xde\x47\xfb\x59\xbb\x70\x04\x06\xb6\x0c\x81\x36\x64\x08\x99\xe5\xc6\x4c\x9a\xe1\x0b\xc8\x48\xd2\xa6\x6b\x9e\x5c\x9e\xf2\xb3\x25\xbf\x02\x5e\xa9\xf1\x57\x12\x47\x6b\x15\xa0\x26\xaa\x76\xcb\xdb\xca\x42\x5b\xb0\xfb\x92\x11\x0a\xca\xe4\xb0\x3a\x8a\x59\xde\x7e\x6e\x3a\x45\xd5\x4d\x00\xac\x6d\x5e\xc5\x42\xc1\x5b\xaa\xd9\x88\x5a\x57\x9d\xf9\x85\x0b\x4e\x45\x73\x5b\xe8\x6a\x0e\x92\xdc\x3a\x54\x1b\x99\x5a\xd5\xfd\x72\x9c\x45\x53\x84\xa3\x12\x6c\xbd\x9c\x68\x91\x2d\x48\x18\xf6\xf1\x93\xe8\x0d\xe2\xa7\x3d\x15\x5e\x52\x1c\xa1\xc0\xd3\x74\xf1\xd7\x88\x8d\x9a\xa0\x75\x5d\xef\xd7\x89\x92\x1c\x44\x31\xde\x84\x36\xe2\x0f\x0f\x00\x9c\x14\x52\x6c\x40\x97\x8b\x1e\x45\x1c\xf2\x24\x20\xfc\x65\xf8\xbc\xc8\xaf\x02\x3b\x72\xb6\xbd\x05\x23\xed\x1a\xf4\x2c\x0c\xd2\xfc\x73\x7a\x55\x71\xc2\x94\x20\x7e\x47\x64\x5a\x78\xba\x33\x18\x65\x77\x92\xc1\xc8\x3c\x1e\xe8\x24\x9b\x62\x70\xa3\xbd\x33\x98\x0a\xca\xde\x51\x94\x13\xcf\xd8\x96\x86\x1c\xca\x76\x76\x40\xdb\x06\x9c\x1d\x98\x43\x86\x4e\x29\x49\x3f\x8e\xb2\x9d\x1d\x6d\xa7\xe9\x8d\x77\x2c\x62\x1f\x29\xa5\x90\x70\x25\x00\x20\x96\xb4\x68\x5a\x55\xd9\x79\x11\xba\x5f\xab\x1a\x33\xa5\x6c\xa5\x44\x92\x15\xc2\xfc\xe4\x5f\x5f\x8f\x97\xe2\xb5\xc4\xbf\x52\xfd\xe2\xfa\x6a\xb2\x20\xaf\xf9\x5e\xfe\x9e\xdf\xe3\x4d\xd4\x08\xab\x31\xaf\x6a\x31\x86\x55\xad\xdb\x5d\xd5\x35\xaa\x43\x25\xea\xcd\xb4\xcc\xf4\x87\xad\x68\x10\x97\x78\x86\xe7\xff\x5a\x64\x68\xed\x6b\x52\x49\x40\x5f\xd2\x5c\x32\x39\x92\x52\x26\xe5\x69\xc5\x5e\xa4\xec\xe2\x31\x18\xf8\xcd\x74\x84\x61\x98\x6e\x32\xff\x5f\x3c\xf8\xe7\xf1\xa0\x23\x0c\xad\xfe\x26\x9c\xf7\x27\x44\xe5\x42\x2b\x3b\x5c\xd2\x3c\xb6\x9e\xb2\x86\x58\xb6\xa2\xf0\x5b\x62\xb3\x7f\x60\x58\x49\x5d\xc5\x82\xb7\x71\x33\x01\xd6\x32\x76\x35\x6f\x7f\xba\x09\x49\x67\xa9\xdf\x27\x4c\x53\x73\xc4\x47\xcd\xfd\xa2\x3c\x7a\x03\x35\x63\xa1\xda\x1f\x25\x0d\x27\xa9\x6c\x67\x93\x13\x66\x69\x80\x68\x6a\x94\x24\x77\x64\x25\x4b\x3e\xf1\x4b\x43\x0a\xd0\x7e\x10\x7d\xe8\xac\x3a\xb7\x56\xcc\x7d\xb7\xfc\xc2\xd4\xa2\xe1\x4e\x80\xea\x4e\xdd\xf9\x10\x07\x81\x11\x88\xaa\xa7\xa2\x88\x24\x64\xb4\xc2\xd4\x43\x96\xe9\xab\xc6\xee\x5c\xa5\x61\x7e\x5b\x34\x2e\x9a\x11\xb3\x28\x38\x3c\x63\xa1\xa3\x6e\x84\x1d\xcd\x24\xe0\x32\xdb\x37\xa5\x30\x5b\x75\x8a\x60\x62\xab\x21\xf9\xf5\x93\x54\x3d\xad\xa2\x24\xfa\x5d\xa8\x2e\x17\xa6\xb7\x85\xd3\x91\xc2\xf5\x2e\x61\x7d\x9d\x9a\xa2\x52\xa2\xa4\x49\x7f\x44\xb5\x52\xea\xe8\xf6\x6d\x0a\x5a\x3f\x33\x47\xc9\xab\xad\xd1\x13\x12\x0e\x50\x98\xf2\xbf\x30\x26\x0e\xee\x72\x40\x3c\x49\x0c\x9e\xe3\x5a\x4c\xc5\xbd\xc2\x0b\xf1\x1f\xaa\x14\x24\x6a\xaf\xa5\x5a\x81\xbd\xb9\x15\xd8\xae\xd5\xca\x95\xad\xe8\x3d\x27\xc4\x7d\x56\xcc\x98\x12\x56\x55\xe6\x56\xec\xf5\xbc\xda\x71\x52\x47\xa2\xa5\x08\x61\xda\x90\x0a\x3f\x42\x1f\xc2\xd2\xf9\x09\x61\xfa\x18\x96\xc4\xa8\x76\xf6\x7a\xdd\xb0\xab\xf4\x5a\xba\x49\x57\x61\x6e\xd4\xeb\x99\xf4\xf5\x9a\x0f\x59\x7e\xe8\x40\x33\xf6\xa1\xa1\x8e\xc7\x56\x3e\x3a\x61\x75\xf4\x92\x2c\x2b\x22\xd0\x8e\x3c\x96\x98\xca\xe3\xa9\xc1\xdd\x56\x67\x86\xac\x51\xd6\xa2\xf0\x65\x65\xad\x81\xec\x8f\x5e\xd5\x69\x70\x43\x48\x72\xc7\x52\x0c\xcd\xf8\x0b\xdb\xd5\x7f\xdc\x32\xcc\xac\x35\x4c\xb5\x64\x62\xaa\x99\x59\x43\xb1\x9d\xb5\x78\xd2\xf1\xa7\xba\xf5\xf2\xfb\x1e\x9e\x61\xa8\x5e\x59\xbd\x9d\x80\xdf\x4a\xd5\x13\xb2\x09\x42\x4a\x18\xcd\xc8\x27\x3d\x0c\x1d\x54\x8a\x9f\x48\x8b\xe4\x13\x48\x57\xc7\x8a\x22\x21\xc1\xfc\x55\xac\xb4\x25\x5c\x05\x13\x6b\x38\x3f\x8b\xe7\x1d\x7f\x2a\x32\x71\x04\xcc\xa7\x3a\xa2\x26\xc5\xc1\x0e\x26\xd9\x1c\x7e\x93\x26\xa8\x32\x26\x89\x15\xcc\x0c\x9d\xc2\xdf\xe4\x7a\x3a\x38\x4b\xda\x7b\x24\x17\xb0\xb9\x6e\xd4\x55\x7c\xcb\x88\x85\x33\xc4\xde\x58\x37\x4f\x57\x73\x57\xec\x54\x4f\x1c\x2e\xc1\xd4\xa5\x44\x38\x0f\xed\x28\xb3\xb8\x39\xec\xbe\x82\xb7\x8e\x70\xe3\x39\x57\x7e\x69\xe6\xd9\xd9\x19\xe1\x30\x2f\x1e\x99\x81\x64\xa0\x37\xae\x86\x6e\x92\xb4\xf8\x67\xdf\x3c\x82\xcf\x19\xbb\x70\x7a\x16\xca\x63\x1c\x86\x55\x17\x01\x1a\xe9\xbb\xae\x71\x5e\xe4\x0a\xb5\x10\x68\x63\x74\x02\x93\x92\x6d\xba\x92\xd6\x21\x2f\x2c\xc7\x99\x41\x09\xa4\xb6\xa5\xd7\xa3\xf5\x31\x7a\xbd\xae\x82\x83\x0a\x7e\x4b\x31\x18\xa7\x3e\x2d\x0b\x8b\x9b\x36\xa6\xdb\x32\x75\x8d\x83\x65\x5c\x08\x99\x45\x6a\x71\x9e\xb2\x5e\x6f\xc1\x4f\x9d\xd2\xb6\x49\x27\x64\x9a\xb4\x43\x9f\x5a\x1a\x53\xac\xfe\x00\xaa\x51\xac\xfe\x50\x0b\xa0\x3e\xe1\xc8\x1f\xf8\xbf\x49\xc2\xc6\x24\xae\x88\xfc\x16\xd1\x43\x52\x7e\xa4\x8d\x99\x07\x69\xda\x65\x98\xc1\xb4\x94\x68\x0a\x50\xa2\x99\x14\xd3\x04\x38\x82\x63\x1a\xeb\xea\xb2\xef\x57\x8e\xa6\x68\xa6\x5e\x1e\x25\xf1\x69\x6b\x2a\xf9\x52\x56\x9d\x9c\x56\x65\x0e\xf6\x78\xd2\x50\x5e\x2a\x1b\xde\x2b\x97\xa7\x39\xb9\x57\x32\xfd\xfe\x98\x95\x97\x97\x69\x31\x87\xc7\x47\xaf\x67\xf4\x8c\x7a\xbd\x82\x84\x74\xd2\x9f\xb6\xb9\xe7\x01\x27\x8e\xbd\xf2\x4c\xa1\x12\x6d\x89\x35\xb5\xe4\x9b\xe3\xf3\xb3\xac\x98\x87\xa9\x40\x63\x59\xaf\x97\x75\x93\xe4\x82\x85\xd4\xd3\xc1\x4a\xee\x32\x7f\x79\x81\x9b\x29\x56\x76\x4e\x49\x87\x5d\x90\x0e\x7f\xba\x74\xe4\xa0\x03\x4e\x12\x7a\x28\x7a\x33\xff\x5e\x6f\xa0\xc4\xf5\x6a\xa2\x5a\x63\x08\x82\x3b\x3a\x59\x93\xfe\x54\x11\xaa\x33\xef\x02\x0b\x2e\x80\x98\xf8\x43\x5a\x2e\x17\xfa\x4d\x47\xcb\x19\xa9\xb4\xee\x98\x5a\x5c\xe1\x40\x85\x5a\x88\x6b\x6e\xdf\x8d\x8c\x93\xf5\x89\xa3\x6b\x81\x30\x78\xfe\x68\x6a\x13\x73\xc8\xf7\xea\xa6\x2d\x55\x7b\x7a\x9d\x9b\xb7\xa1\xe4\x24\xe0\x22\x21\x5a\x82\xb4\x02\x69\x62\xdc\x1d\xe0\x85\x7a\x05\xc6\x7d\x2c\x97\x41\x7e\x4a\xe9\x70\xf1\xcf\xd6\x60\x46\xc2\x0b\xfc\x1d\xa3\xc3\x2d\x07\x93\x8e\x2c\x62\x55\xd6\x99\x14\x53\x9c\xeb\xb0\x5e\x29\x09\x73\x24\x99\x0a\xa2\x6c\x95\x7c\xb8\xb5\xca\xeb\x0f\xb8\x4c\x4c\x4c\xb0\x9d\xc1\x98\x4e\xb2\xdb\xd2\xc0\x03\xae\x3d\x0e\x91\xc2\xf4\x26\x49\x92\x4a\xf1\x25\xce\xc2\xaa\xd7\x2b\x7b\xbd\x16\xd2\x28\xad\xd2\xa5\x42\x1a\x42\x48\x74\x4e\x42\xfe\x36\x27\xc8\x0c\x3b\xbb\x9d\x0c\x6b\xc5\xfe\x10\x05\x56\x75\xa3\xc4\xed\xba\xb8\x7d\x5b\x99\x1c\xc9\xf5\xeb\x5b\xeb\x57\xb8\xeb\x97\xd5\x8a\x02\xc0\x46\x89\x3c\x8b\xec\x32\x92\x8d\x7f\x29\x0c\xb0\xb2\x48\xb7\xd5\x5e\xf2\x46\xc0\x2b\x1b\x29\x58\x36\x4f\xba\x01\x64\xf3\x9c\x89\xa3\x13\xb7\xb1\x01\xa7\xba\xa5\x61\x87\x97\x9c\xa0\xe8\x73\x24\xa7\x25\x0d\x72\xc8\xb6\xaf\xce\x71\x1b\x5b\xad\x6a\x14\xeb\xb2\x4d\xe5\xca\xf1\x85\x82\x5c\x55\x66\x0c\xb0\xcc\x3b\x8a\x75\x9e\x65\x48\x64\x1f\x1c\xdb\xb9\x29\xb2\x08\x85\x56\xff\xa3\x55\xfb\x58\x68\x5c\xc1\x6f\x1d\x8e\xe0\xc6\xfc\x6f\xa4\x51\x0e\x48\x4a\x59\x5d\x87\xb0\x75\x0e\xf6\xce\x30\x10\x22\xc9\x9d\xb6\x2a\xab\xf0\x9b\xc9\xef\x48\xac\x48\xb4\x5e\x2f\x2c\x26\xd9\x34\x99\x3b\x77\x6a\x36\x95\x0e\xa6\x3c\x4a\x95\x70\x45\x69\xb8\xcd\x26\x64\x0a\x6d\x90\x69\xc2\xfc\x17\x42\x61\x13\x45\x17\xad\xab\xc7\x03\x25\x52\x1f\xa1\x48\xfa\xea\x7c\x53\x73\xac\x15\x7e\xa0\x93\x42\x1d\xd7\xd4\xd2\x4c\x58\x90\x30\xd5\x67\x69\xe4\xae\x7b\xc6\x49\x3b\xb9\x35\x85\x75\x79\xac\x32\xa9\x19\x20\x04\x1a\x16\x62\x20\x42\x47\x1b\x9f\xa9\xa2\x08\x17\xb7\x6f\x73\xb4\xc0\xb2\x62\x49\x94\x7d\x65\x02\x83\x18\xeb\x8e\x61\x7b\x3e\xdc\x5a\xa5\xf5\x07\x5c\x25\x85\x8b\x33\x0a\x8d\x33\xf2\x5e\xaf\x82\x61\x54\x68\x1c\xba\x63\xc8\x79\x97\x95\xe8\x2f\x19\xa2\xb8\x95\x0d\x78\xb8\xb8\x7d\x5b\x43\xbc\x9e\xe3\xaa\xb6\x40\x72\x41\xfc\xd2\x2e\x30\x43\x93\x4f\x31\x8f\xce\x73\xaf\x17\xb2\x64\xc2\x0c\xa0\xf0\x14\x88\xfe\x7e\x21\xdc\x2e\xe9\xcb\x00\xf7\xb1\x88\x49\x67\x19\xd4\x9d\xdd\xa0\x53\x68\x4c\x92\x32\x76\xdd\xf3\xa6\xf3\x75\xa6\xcc\x2a\x7b\xbd\x19\x98\xa4\x39\x6a\x92\xe2\x26\xbc\xf4\xdc\x84\x38\xb3\xcd\xa5\xe1\xc1\xf4\x8a\xd1\x94\x91\xf3\x2b\x75\x23\x4a\x1a\x14\xf8\x2d\x8a\xd4\x58\x52\xc9\x80\x51\x8c\xce\x92\x7e\x4e\xa9\xf0\xdd\x9c\x64\x75\x2a\x89\xdf\x96\xe8\xdc\x6a\x4b\x70\x7a\x94\x43\x28\xdd\xe2\xd8\xfd\x14\xa5\x04\x20\x08\x16\x2a\x51\x8d\x03\x06\x12\xbe\x57\xc0\x06\x8f\xbf\x94\xa4\x96\xa1\xdd\x0d\xf0\x93\x94\xd3\xb4\x4d\x35\x6b\x7f\xb3\x8d\x43\xf8\x86\x85\x04\x8d\xfc\xf2\x4f\x8b\xbb\x63\x8b\x41\x9b\x83\xd6\x0d\x73\x94\xc0\xaf\x14\x11\x4b\xae\xc3\x3f\x05\x1e\x31\x14\xae\xaf\xea\x49\x31\x7f\xcc\x0c\xf2\x65\x40\x5f\xd6\x9e\xf6\x1b\xd8\x43\xbc\x7e\x8b\x84\x8c\x89\x25\xeb\x87\x6b\x8b\x1f\x73\x04\xf7\x97\x11\x16\x58\x46\x53\x10\xce\x1a\x7c\x9c\x87\x99\x9c\x14\x1a\x15\x52\x8b\x67\xf3\xb2\x15\xe6\xde\x91\x8c\x96\xed\xe5\x29\x12\x36\xc2\xed\x96\x7d\xf3\x86\x1b\xe5\xba\xa5\x21\x1b\x41\x5b\xbe\xd8\xef\x11\x78\xb1\xb3\x26\x4f\x60\x2c\x47\xc0\x73\x4f\x8a\xf9\x2b\x56\x52\xd1\xc5\xab\xe5\x29\x93\x61\x79\x65\xf4\x92\xf6\x18\x9e\xc3\x12\x09\xde\xc1\x35\x4d\x58\xce\xc0\xad\x55\x76\x01\x08\x48\x0b\xca\xe9\x79\xf9\x6d\xf9\xe7\x16\x29\x72\xa0\xa1\x70\x1c\xae\x61\xb3\x2c\xc4\x48\xee\xe9\x11\xce\x43\xa9\x78\xea\x5b\x10\x06\xf1\x1a\x1a\x2b\x81\x57\x1a\x24\x5e\x92\xb3\x98\x60\xa8\x19\x33\x70\x23\x4f\xbe\xb0\x2a\xce\x6a\x54\x7b\x36\xc2\x5a\x84\x1b\x4d\x92\x0f\x9d\x53\xc6\x22\x51\x77\x3a\x36\xf3\x89\x39\xf4\x82\x56\x82\xa5\x5d\x91\xf2\x77\xb3\xad\x26\x55\x20\x74\x03\xe8\x81\x40\x1d\x19\x1a\x59\xcb\x0a\xbe\xcd\xf5\x7a\x6a\xfc\x85\xf0\x75\x2b\x8a\x55\xc0\x92\x97\xe4\x4c\x98\x96\x51\x25\x9c\xa2\xfa\x1b\x1c\xaa\x88\xe8\x5d\x7f\x16\xcd\x38\x88\xcc\xc2\x26\x0d\xed\x0b\x8e\x5a\x5a\x98\x19\xee\x24\xc2\xda\x00\x0f\xd1\x52\x9b\x5c\x04\x79\x10\x5b\x0d\xfc\xe2\xab\xff\xed\xf8\x87\x91\x30\xe3\xfb\x7f\x2d\x16\x7a\x4e\xef\xca\x98\x63\x4d\x6c\xb4\x11\xb9\x6f\x46\x44\xd7\xa1\x21\xff\x48\xc8\x75\x23\x51\xef\xf6\x8d\x28\x47\x32\x09\xb3\x36\x9f\x54\x7a\x33\xf4\xd4\xd4\xdc\x43\xab\xd6\x35\x07\xd9\x94\x04\xd2\x04\xd9\x62\x12\x05\xc6\x2f\x89\x18\x0c\x99\x73\xda\x55\x1e\x68\x88\xa0\xab\xe1\xd9\xe2\xf7\xbd\x24\x67\x98\x28\xd7\x40\xd2\xd1\x8f\xd8\x54\xa2\x8f\x90\xfa\x25\x5b\x08\x1b\xd5\x9d\x6a\x08\x7f\x22\x4a\xa4\x2d\x36\xc6\xa3\xa5\x63\x82\x6b\x92\x44\x31\xaa\x47\x64\x44\x12\xcd\xac\xd6\x8b\xe7\x30\x08\x61\x1f\x38\x3e\x79\x2f\xbc\x4e\x4b\xb6\xa1\x16\x72\x3b\xc9\xba\xb0\xd9\x6e\x5b\xeb\xcb\xfe\x6d\xef\x00\x7f\x0c\x8e\x69\x24\xfc\x59\x9b\xba\xd2\x43\xba\xf4\x1e\x45\x05\x98\x93\x26\x8e\x50\x2b\x99\x61\x62\x61\x0b\xef\x52\x4a\x40\x05\xfd\xca\x0c\x17\x5b\x48\x19\xb1\xd7\xd6\x56\xa3\xfa\x5a\x88\x17\x18\xca\x7e\x7b\x7c\x12\x1e\x9e\xf5\x65\xe0\x60\x06\x85\x89\x3e\x11\x45\x54\x5e\xb5\x88\x4a\xfb\xd6\xd5\xb6\xb8\x62\x99\x12\x62\x75\x74\x6a\xb3\x0a\x55\xaa\x45\x5d\x5b\xc6\xd1\x4e\x68\x1f\x70\x13\x9e\x16\x33\x5e\xe8\x84\xc9\xc7\xc5\x09\x49\x5e\x5d\x5d\x9e\x96\x79\x18\x3c\x7e\xf6\xf8\xf5\xe3\x93\x27\xef\xdf\x9e\x3c\x79\x73\x3f\xb0\x1d\xb5\x12\xdb\x51\xfe\x97\xe8\x33\x28\x93\x84\x7d\xbc\x8c\xd2\xdf\x50\xc8\x8c\xc8\x54\x29\x9c\xbc\x8b\x7e\x47\xe1\x00\xe1\xb0\x8f\xef\x47\xcf\x51\x78\x42\x10\x42\x48\x64\x7f\x52\x3a\x12\x2d\x9f\xc5\xc4\x52\xa2\xc8\x80\x33\xc8\xba\x49\x72\x42\xc6\x2c\x06\x6a\xeb\x84\x68\x17\xc6\x74\xbd\xee\x0e\x84\xc2\x72\x61\x89\xca\x76\x06\xbd\x5e\xf7\x2e\x47\x8c\x63\x16\x67\x88\x13\xa8\xf8\x84\xc0\x38\xee\x46\x17\x30\x6c\xd1\x24\x24\x29\xb5\x18\x58\xa6\x31\x8b\xbb\xc0\x78\x82\x2c\x39\x01\xe9\x0f\xfc\x2d\x69\x38\x04\xff\xf6\x38\xd6\xb3\xcb\x45\x52\x44\xbf\x2c\x2e\x95\x67\x73\xac\xc2\x1e\x56\xf1\x64\x12\x14\xe7\x3b\xfa\x44\x04\xd3\x29\x9e\x93\x59\x5e\xc5\x03\xfc\x29\xa5\x55\xdc\xc7\x8c\x5c\x2e\xf2\x94\x91\x86\xab\x88\x41\x8f\xf5\x7a\x45\xf4\xfe\xcd\xbb\xb0\x8f\x03\x21\xe7\xdd\x11\xe7\x20\x40\x35\x36\xfe\xe6\xdb\x4e\xb6\x27\x57\x74\x5a\x63\x27\xb4\x6b\x3c\x6c\xfb\x4d\x7f\x4f\x84\xde\x4e\x60\x30\x4b\x43\x08\x49\x8d\xab\x9b\x2c\x61\x13\x3a\x1d\x3d\x22\x61\x86\x3f\x13\x30\xc4\xb7\x0f\xca\x23\x1d\x2d\x4f\x1d\x8f\x5e\xef\xbd\xcd\x20\xe0\x14\xa0\x2e\xfd\x99\xb8\x0e\x7a\xc7\x6c\xbd\x16\x4a\x0a\x63\xd6\xeb\x75\xe5\x4f\x78\xea\x7d\xf7\x21\xee\x02\x0a\x80\x24\xf1\x8f\xe0\x63\x7f\x77\x6b\x25\xdd\xab\x7d\x88\x83\x20\xb6\x8e\xc8\x53\xe2\x17\x6f\x3b\xea\x9a\x1c\xbe\x9f\x12\x84\xa9\xf1\x85\xb3\x51\xc3\x06\xe1\x95\x21\xbd\x6a\x14\x7b\x4a\x28\x89\x2c\x35\xd8\x8f\xbf\x7f\xc1\x8d\x4e\x99\xce\xb5\xd3\x12\x9b\xca\x52\xbf\xb4\xb9\xa9\xa5\xf9\xf2\x96\x0f\xcd\x4c\xe9\x89\x1b\xf3\x52\xd4\x5b\xaf\x33\x6b\xd6\x5f\x1a\x74\x34\xb3\x6c\x9e\xa1\x3a\x84\x42\x36\x0e\x6f\x80\x39\x10\x45\x51\xab\x1c\x68\x64\x41\x4c\x5d\x68\xe9\x1d\x91\x8c\x55\x32\x8f\xbb\x03\xac\xdc\x12\x49\xe5\x9b\x2a\x9e\x4c\x71\x9e\x4a\x8d\x96\xb8\x8f\x2d\xe3\x9f\x55\x8d\x95\x87\xaf\x34\x07\x19\x9b\xae\xb4\xaa\x2d\xff\x24\xf7\xf5\x03\x5e\x58\x58\x2b\xbb\x24\x62\xfb\x46\xd2\xfe\x9d\x88\xe3\xdf\x89\x35\x9d\x74\x18\x5e\x3f\x1a\xb7\xf6\xe9\x1d\x41\xb1\x99\x4c\xff\x2f\x9c\x8c\xa2\xce\x42\x22\xd8\x7e\x84\xae\xd7\x25\x43\x21\x15\x81\x84\xb3\xb3\xb0\xab\x3c\xd6\x74\x7c\xc3\x32\x4c\xec\x7a\xb4\x60\x61\x11\x69\x0f\x4f\xae\x90\x87\x49\x8f\x82\x3a\x70\x50\xa1\x2c\x03\xe6\x46\x7b\xe3\x1a\x78\x4e\x11\x36\xb5\x26\xad\x06\x76\x06\x8e\x58\x3d\x4e\x47\x36\x7b\x78\xc3\xc2\x99\x56\xac\x05\x6c\x35\x6d\x2f\x68\xbe\x71\x3d\x25\x03\x29\xcc\x12\x6b\x19\x90\x62\x7d\xf3\xd3\x32\xce\xf8\xa2\x5b\x86\xc2\x96\xb4\x2c\x09\x66\x25\xa5\x60\x07\x11\x08\x59\xbd\x25\xfd\xd9\x20\x54\xa7\x51\x55\x5e\x92\x90\x26\x77\x5e\x2b\x58\xec\xf5\x9e\x90\x90\x22\x38\x9b\x20\xf6\x06\x5f\x2d\x9a\x0a\x97\x1c\x2d\x82\xdd\x16\x71\x66\x8a\xac\xea\x91\xe0\x4d\x67\x38\x8b\xde\x57\xe5\x92\xce\x94\x5d\x5e\xc2\x20\x49\x7c\x00\x73\xfa\xd5\x45\x76\xc6\xf4\x9d\xd7\x7c\xd6\x81\x2e\x08\x9c\x89\x54\x32\xb6\x9e\x90\x30\x95\x83\x73\x74\xb7\x35\x97\x6d\x44\xdb\x7d\xd2\x6d\x7d\xe2\x62\x02\x8d\x8a\x40\xab\xe2\xae\x13\xcc\xfe\x4c\xb1\x68\xa9\xcd\x41\xb7\x84\xd9\xed\x9e\x8a\xad\x3d\xad\x6c\x61\x53\x5c\x60\xe0\xe2\xda\x87\xb0\xae\x1b\xec\xf0\x3f\xb2\x73\xad\xdd\x4a\xdb\xd2\x81\xd6\xb6\xe1\x02\xa7\xaa\x7c\xae\x4c\xb9\xa4\x2c\x87\xef\x40\xc6\x77\x00\xba\xa0\x18\xfc\x1c\xc1\x6a\x55\x68\xfa\x67\x97\x3f\xc8\xc9\x79\x3a\xbb\x82\xbd\x1d\xb7\x24\x24\xb1\x5e\xb3\x5c\xf6\x67\x76\xe7\x9a\x53\x5e\x20\x9c\x2b\x7d\x0d\x9c\x59\x3b\x87\x0b\xb3\x75\x69\x7b\x94\xe9\x1f\xd8\xba\xb4\xb9\x75\x54\xa9\x67\xf8\xd6\xdc\x02\x9e\xbf\xb1\x7f\x63\xe2\xdf\xe0\x0b\x87\xdd\xf6\x6d\x41\xcc\x6d\xa1\x5c\x08\x76\x1d\x17\x82\x48\x2a\x17\x8b\x24\xcb\x27\x80\x15\x00\x59\x59\x81\x85\xea\x9a\xcd\xd6\x6b\xe5\x43\xe2\x35\x91\x5c\x55\xd4\xeb\x85\xc1\x7f\xff\xb7\x50\x54\x16\xee\x3b\xef\x83\x4e\x0b\xa6\x48\x5e\x19\x73\xdb\x85\x40\x93\xa9\xdd\x77\x7c\xc4\xb8\xde\xa0\xe4\xf3\xe3\x05\xf1\x3b\x25\x75\x24\xbb\xeb\x35\xbc\xde\x64\x95\x67\xfe\x2a\x4b\x9a\xbf\xa6\x84\x24\xcc\x5a\xce\x97\xc4\x1f\x70\x45\x85\x52\xe1\x49\x2f\x88\x08\x18\xaa\x2b\xdd\xbb\x41\xa5\x67\xcd\x4a\x0f\x6e\x50\x49\x5a\xbc\x3d\x2f\xf2\xab\x4e\x2a\xc5\xe2\x1d\xaa\x9c\x0a\x77\x66\x69\x21\x64\xf7\x45\x7a\x49\xe6\x1d\x29\x64\x89\x74\x89\xd7\xa5\x30\x4d\xae\xff\xf1\x01\x69\xc5\xe7\xdf\xbc\x32\x01\x8e\x17\x94\x05\x9e\xf4\xf5\x4b\x74\x9c\x11\xd0\x42\x96\x2e\x71\xb4\x9b\x7e\xb5\x7a\x19\xb6\xea\x29\xe5\xe6\x34\xcf\xcb\xcf\xc6\xf5\xb2\x0a\x27\xa2\xa2\x37\x25\x10\x44\x2e\x2c\xa2\x8b\x7e\x26\x83\x20\x5b\xc6\xcd\x8f\x25\x4f\x5f\xf6\x20\xd4\x35\x26\x53\xac\x7c\x18\x88\xae\x90\xb3\xe5\xd8\x23\x5d\xf5\x1d\x45\x68\x80\x7c\x59\xa4\x85\x3a\x4e\x50\x3d\x74\x86\x67\x77\xc3\x6f\x06\x86\x5a\x06\x09\xa2\x04\xf0\x84\xde\x88\x61\x86\x0f\x89\x36\x68\x52\x23\xb7\xd5\x38\x9d\x0c\xad\x79\x85\x4c\xd3\x8f\xa3\x1f\xa1\x69\xd0\x2e\xb0\x9f\xbc\xcf\x88\x13\x66\xa5\xb9\xb6\x03\x15\xf1\x92\x01\x03\x46\x76\x81\x46\x42\x33\xc3\x69\xe9\x85\x14\xb6\x14\x25\x1c\x7b\x01\x5e\x0c\xc5\xac\x46\xa8\x96\x0d\xb8\xea\x18\x7f\x68\xa9\xa4\xd9\x54\x6b\xbd\xc8\xa6\xf5\x02\x56\x83\xb3\x48\xdb\x57\xe6\x8f\x4e\xa9\x91\x68\x9f\x36\xd7\x36\xd8\x44\xea\x17\x4c\x8c\xa8\xf3\xe6\xe5\x93\x8e\x9c\xb6\x38\x44\x0e\xb8\xf1\x13\x55\xbb\xd3\xd9\x2c\xbe\xd5\x14\xab\x75\x77\x4a\x41\x35\x8a\x59\xc3\x71\x55\x26\x64\xe7\xbe\x75\x77\x31\x71\x47\x50\x0e\x2d\x65\x13\xda\x90\xd5\x5b\xdb\x68\x4b\x4a\x38\x42\x6e\x02\xb5\xe5\x2b\x04\xe9\x60\xed\xf6\x40\x80\x30\x20\x8e\x2b\x4b\x30\xe5\xf5\x36\xaf\x97\x62\x32\x75\x9c\x57\x36\x18\xf8\x96\x22\x27\xd2\x9e\x90\x93\x24\x29\xc6\xc6\x2a\xb2\x40\xb1\x92\xf3\xaa\x93\xac\xdc\x78\x66\x66\x1a\xaf\xa3\x53\x04\xc1\x2e\x0d\x13\xd9\x96\xdc\xa7\xc9\x17\xf1\xa4\xbf\x16\x17\xe0\x14\xfc\xfa\xb5\xd6\x27\x54\xf7\x72\xcc\xb0\x40\xb6\x71\x56\x0b\x77\x49\x9a\x37\x14\xb2\x89\x31\x88\xd4\x5e\x1d\xe1\x75\x5d\x37\xb5\xa6\x15\x4d\xe5\x09\x79\xa5\x75\xe0\x92\x3b\x99\x18\x07\x44\x14\x02\x5e\x90\xf4\xca\xa4\xfc\x90\xa2\xf8\x69\x74\x85\x5f\x85\x03\x84\x21\xbc\xd7\xe7\x68\x8e\x42\x02\xce\x4c\x1f\x45\xaf\x11\xf0\x7f\xf8\xce\x5e\x44\x3f\x72\xaa\x11\x35\x80\xcb\xa5\x0d\xdd\xc5\xa5\x8d\xc5\xcd\xe5\x41\x76\x1a\x38\x39\x4f\xf9\x79\x14\x5a\xb7\xa2\xb1\x5c\x36\x77\x3d\x6e\x7b\xa1\x70\x9b\x76\xbd\x0a\xdc\x6b\x85\xbc\xf8\xea\xe2\xb0\x8f\x9f\x47\x2f\x90\x72\x6b\x86\x55\x7b\x4a\x4c\xdf\x6c\xf3\x22\xfa\x71\xbd\x0e\xc0\x85\x87\x70\xe4\x0c\xd4\x08\xbf\x23\xe1\xa5\xf4\x11\xa0\x80\xd3\x87\xcd\x9e\x1d\x65\xae\x91\xd1\x6c\x7b\x01\x61\xd1\xcc\x90\xea\xeb\xe6\x2f\xed\x88\x8c\xef\x23\x02\xe7\x9a\x2f\xc9\xd8\xa8\x88\x44\xe6\x9e\x1e\x1b\x14\xbe\xa9\x55\xb1\xa2\x71\x2e\x85\x34\xee\x2d\x30\xde\xbe\x2d\x6f\xaa\xac\x38\x57\x85\x9d\x0d\x8f\x5f\xf2\xb9\x89\xbf\x9b\xa7\xb5\xb9\xbe\xe2\xe6\x0a\x9a\x2f\x93\xec\x2d\x33\x98\x9f\xb3\x7c\x7e\x37\xa5\xf3\x9f\x33\x76\x21\x70\xfc\xb6\x76\x05\x21\x62\x23\x9e\x97\x04\x82\x31\xff\xa1\x31\xd5\xdf\xd2\x75\xe3\x59\x2b\xd6\x98\x13\x26\xaa\xcc\x5d\xa9\x68\xc8\xe1\x83\x5a\x5b\x67\xab\x6b\xd9\xe9\x8e\x93\xec\xef\x02\x34\xbe\x47\x38\x1e\x83\x86\xf3\xac\x20\x14\xc8\x29\x45\xd3\x87\x14\x17\xe6\xb8\x7c\x8c\xbe\x9e\x23\xfe\xdc\x6b\xbe\xc4\xa9\xdd\x9b\x17\x3f\x17\x72\x21\xba\x03\x64\x20\xf5\x5b\x56\x51\x74\xad\xd9\x21\x79\x9b\x1b\x52\x59\x4c\x90\x72\x23\x9f\x63\x56\x27\xf7\xd5\x89\x03\x0e\x51\xae\xa8\x19\x00\x3a\xc9\xe2\x99\x6f\x5b\xf1\x0a\xdb\x67\x05\xcf\xf4\x0a\x64\xd7\xac\xf7\x7c\xf3\x7a\x67\x78\xde\x5c\xef\xcc\x87\xdd\xd4\x9a\x28\x17\x79\x85\xd4\xc6\x2a\x11\xc2\x29\x5f\x65\x45\x39\x6d\xc5\x06\xc2\xfd\x94\x38\x24\xae\x33\x74\x97\x73\x3a\x0e\xa9\x2b\xaa\x1a\x6b\xec\xd4\xc8\x40\x71\x8b\x5c\x87\x96\x42\x16\x65\xc5\x6f\xc0\x97\xc7\x14\x79\xee\xb0\x46\x3b\x09\xc3\xb6\x86\x14\xb2\xbd\x60\x3b\x19\x23\x17\x1e\xd2\x36\x3c\xe4\x16\x3c\x54\x72\xd7\xf9\xa1\x82\x5d\x4f\x7d\xbb\x5e\x26\x99\x5c\xce\xca\x85\xea\x73\x22\xda\x91\x56\xe0\x82\xd3\xd1\xd8\x2e\xa3\x82\xc3\xa9\x2d\x19\x65\x36\x55\xa2\xca\xaa\xf1\x88\xae\x9a\x8f\xe8\x79\xcd\x1f\x1a\x04\xe7\xb8\xc4\x29\xc2\x4b\x75\xc4\x8c\x57\x59\x6c\x79\x6f\x55\x61\xd9\xe7\x9a\xce\x5a\xfa\x95\x7a\x7d\xe4\x56\x86\x53\xbc\xdc\x48\x6e\xe5\x40\x6d\xa9\x0e\x52\xdd\x81\xdd\xdd\x86\xab\x2a\xb7\x76\xa6\x73\x91\x00\x2f\x8f\x93\x4e\x5b\x30\x44\x86\x97\x38\xc5\x73\x7c\x31\xce\x58\x5c\x70\xea\x6d\xe3\xb8\x14\xc8\x1b\x52\x16\xb9\xac\x31\x8e\x60\x5a\x3b\xe5\x37\xe3\x19\x3b\x43\xbf\x22\x96\x7b\x72\x3e\xfd\x98\xb8\xc7\x40\x33\x41\xc9\xa6\xe3\x40\xbc\xc7\x81\x2e\x8b\xbb\x69\xc1\x8f\x83\x08\xde\x64\x9f\x06\x87\xe4\x35\x18\x56\x9d\xc3\xf1\xf5\xe7\x89\x78\x8e\x13\x69\x1d\x27\xa0\x9d\xc3\x2c\x21\x58\xbd\xea\x41\xc2\x28\x5e\xf5\x15\xd3\x6f\x0e\x5e\x4d\x9b\x80\x74\x4e\xc9\x2c\x5d\x56\x42\x4f\xfe\x9c\x8f\x9d\xd3\xc9\xfc\x03\xa0\xb9\x13\xe8\x48\x2a\xe2\x8e\xad\xff\x11\x74\xc4\xc8\xc9\xbc\x73\x96\xe6\x15\xe1\x4f\x7c\xe9\xbd\xb5\x6e\x1e\xe2\x2b\x22\x89\xfa\xba\xbd\x40\x2e\xad\x4e\xa2\x99\xc8\x86\x43\x9b\x89\x98\xfe\xd9\x06\x28\xec\xf6\x91\x16\x09\x64\x20\x6b\xb2\xa9\x6f\xf1\xc6\xcf\x84\xce\x6a\xca\xdb\x0b\xf3\xa4\x40\xbd\xde\x29\xe1\xb0\x25\xba\x41\x28\x4d\x0a\xf5\x11\x6a\x6d\x0c\xd0\xe5\x3e\x25\x42\xbb\xa7\x61\x60\xf0\xb8\xf8\x94\xe6\xd9\xbc\x23\xe7\x21\x56\x2b\x40\xa3\x34\x91\x5a\x62\x7c\x0d\x72\x75\x04\xce\x58\x98\xa2\xda\x7a\x35\xc8\x55\x91\x5b\xf9\x8a\x84\x40\x50\xbe\xe0\xe4\xad\x24\x50\xbb\x20\x56\x55\x1e\xc1\x94\x84\x8d\xef\x9c\xba\x99\xb2\xe2\xbc\xc3\x4a\x70\x40\xd4\xe2\x8f\xd8\x4e\xac\x51\x1d\x7c\x50\x84\x24\x91\x36\xb1\xa4\x76\x44\xb8\x52\x74\x8b\x6a\xcf\x1d\xe5\xb8\x80\x05\x8b\x2b\xfe\xbe\x16\xba\xbf\x42\x91\xdf\xf2\xdd\x9a\x59\xa7\x54\x6c\xda\x86\x58\x02\xe6\x46\x91\x4a\xec\x2d\x27\xd7\x83\xf5\xba\x9b\xb9\x2e\xcd\xe5\x6a\x3e\x00\x0d\x0e\x7d\xe7\xa2\x51\x96\xb8\x05\xeb\xda\x7f\x85\x37\x74\x57\xdb\x77\x3d\x7f\x4b\x53\xfd\x98\xf6\x31\x9e\x84\xdb\x2c\xe0\x19\xf0\x5d\xde\x56\xdd\x4f\xce\x89\xf7\x7a\xf3\x4d\x2d\x43\x02\x58\xef\x42\xf9\x12\x97\x56\xfb\xa2\x96\xed\x21\x73\x0b\x5f\x67\x83\x19\xae\xe2\x15\xd8\xad\x38\x2f\xc0\xb6\x2e\x70\x26\x5f\x36\x3e\x1d\x64\xd6\x0a\xc0\x62\x7b\xff\xb7\xe2\xb0\x8c\x28\xb8\x78\x9b\x14\x53\xa1\x16\x02\x9f\x0c\xbc\xfb\xfa\x17\xe3\xba\x55\x83\x61\xbb\x9e\xfd\x47\x4d\xb3\xad\x85\x1d\x7b\x02\x87\x44\x58\x4a\xa5\x60\x29\xb5\x79\x1b\xa0\x2d\xa3\x27\x0f\x74\x7c\xbb\x6b\x87\x01\x42\x94\xdd\x21\x91\xd1\x73\xdc\x45\x11\x08\xfd\x2c\x2b\xe6\x2f\xa4\x78\x4d\xda\x7b\xc6\x3a\xe3\x39\x7d\x29\x8e\x84\x90\xa8\xb4\xca\xda\x11\x7a\x26\xaa\x17\x3b\xce\x8d\xc0\x92\x1b\x5d\xce\xa9\x93\xc2\x91\x85\x60\xc4\x46\x1d\x99\xc5\xfb\xe2\x69\x52\xba\x6f\xfb\x8b\xcc\x6a\x67\x6c\x16\x16\xe8\x8f\x1a\x56\xb0\xe2\x45\x9b\x29\xe7\xe9\xcc\x21\x2d\x09\xc4\x13\x9a\x71\xa2\x00\x67\x23\xaa\x2d\x60\x3a\x36\xc3\xfb\x61\x53\x27\xbd\xe1\xc9\x6a\x83\xef\x66\xb3\x30\x0f\x1b\x56\x87\x68\x64\xa1\x22\xcb\xc3\x67\xd6\xa0\x97\x94\xe2\xbc\x0e\x4e\xee\x78\x27\xc9\xce\xc2\x81\x78\xb6\x37\x90\x53\x2b\xd8\xc2\x06\xb7\xde\xa3\x4d\xa6\x25\xda\xd7\xb5\x85\x2f\x6d\x05\x2a\xbd\x46\x61\x9b\xa1\x4c\x34\x17\xfd\xab\x5f\xa4\x60\x7b\xe8\x97\x9a\x73\x2a\x79\xa2\x7f\x19\x09\xb4\x0e\xa7\xba\x49\xa5\xca\xa8\x4a\x38\x8d\xda\x4a\x55\x6f\x3c\xac\x47\x50\xa1\x57\x2b\xf0\x3b\x30\x1f\xc6\xb6\x62\x3d\xa6\x78\x22\xed\xa2\x6d\xbb\xd0\x5b\xad\xa6\x1a\x5b\xd2\x75\x14\xe5\x46\xff\x02\x55\x3d\x57\x19\x4f\x6b\x76\x84\xd9\x38\x53\x8a\x78\x8a\x3c\x8b\x29\x8a\x44\x50\x33\xcb\x1d\x98\x2d\x32\x5f\xcd\xd2\xe2\x9e\xa5\x8e\x4e\x66\x1f\x41\x17\x62\x96\x16\x27\xcd\xc4\xda\x88\x55\x85\x72\xae\x1e\x9e\x57\x47\x37\x6c\x4b\x5a\xbf\xb5\x3b\xa5\x39\x9b\x37\x34\x67\x71\x05\xda\x87\x9b\x35\xaa\xb5\x7e\x6d\xde\xeb\xa5\x8e\x37\x99\x24\xc9\x1d\x63\xea\x95\x7a\x7d\x35\xc5\xcd\xfc\xbe\x69\xeb\xe5\x51\xfd\x56\x05\xc8\x1c\x55\x9f\x33\x36\xbb\x08\x39\x98\xa4\x15\x01\xca\x54\xdc\x69\x77\x2f\xd2\xe2\x9c\x04\xb1\x14\x15\x42\xec\x14\xcb\x55\x41\xa3\xf4\x73\x6a\x5d\x87\xdb\xab\xae\xd7\xe0\x22\x62\x4b\x4c\x1e\xd1\xb8\xf4\xb6\xa4\x5a\xe9\xab\x2e\xaf\xeb\x4e\x6a\xe7\xdf\xa0\x9b\x39\x39\x4b\x97\x39\x6b\x54\xac\xeb\x30\xc7\x29\x76\x56\x9d\xbf\x45\x04\x8d\x7d\x52\xcc\x95\x72\x68\x85\x46\xe5\x18\xe8\x5d\x17\x04\x8c\x11\xd3\x57\x70\x52\x14\x87\xa9\x70\x1d\x94\x0b\xaf\x16\xa9\xeb\xf3\x28\xc9\x1b\x3e\x90\xb0\x04\xf4\xd4\xd2\xa4\xaf\xc6\xe6\xfd\x0a\xb0\x11\x0b\x56\x04\x2e\xc1\xbc\xaa\xd2\x1a\x5a\xea\x57\x94\x55\xda\x86\xbd\xd7\x83\x51\x36\xe1\xd7\x8c\xf3\x7b\x12\xea\x7a\xc6\x45\x40\x8e\xa4\xca\x75\xde\xeb\xfd\xcc\xc9\xb8\x8a\x77\x78\x83\x09\x8b\x09\x00\x9c\xdf\x64\x0e\x35\x0a\x19\x4e\xdb\x2a\xf0\x86\x4f\xa3\xf2\xa6\x88\x8f\x40\xda\xdc\xb4\x6a\x08\x03\x9c\x54\x69\x1f\xfd\x0c\xaa\x0f\xf6\x19\x23\xbc\x3a\xc2\x85\x41\x29\x3f\xb7\x90\x24\xd8\x28\xe0\x42\xdb\xea\x2b\x93\x1e\x20\xe1\xa0\x78\x61\x4d\xc9\x71\xf5\x69\x9b\xda\x88\x03\x1c\x4b\x03\x72\x7a\xed\xf2\x17\xb6\x12\x1e\x31\x0a\xc4\x96\x2a\xb1\xb5\xa1\x63\xd2\xda\x2d\x81\x56\x0a\x7d\xa7\xfd\x4a\x56\x66\x9a\x3f\x5c\x23\x9e\x66\xba\xda\x4f\x7e\x81\x72\xa1\x45\xca\xfc\xda\xd1\xce\xda\x5f\x5f\x2d\x8c\xcb\x4a\x81\x9e\x88\x2b\x50\x36\xf2\x65\x25\x5b\x16\x07\xf8\x71\x71\x41\x68\x06\x4c\x7e\x6d\xb0\x56\x28\xd7\xfb\x39\x44\x9b\x7f\x92\x15\x1f\xe1\xa8\x2d\x21\xe8\x67\x5a\x53\x15\xa2\xfb\x0f\x8b\x97\x2d\x7d\x41\xcd\xb1\x77\x9e\x3e\xdb\x7a\x6e\xc9\xa6\x6d\x43\xf3\xb6\x30\x55\x89\x4f\x71\xc6\xb4\x9f\x10\xd0\x63\xb4\x2f\xdb\xb6\xef\x4a\x49\x9a\x9d\x51\x42\xbe\x12\xf0\x1f\xe9\xa6\xb4\x15\x38\x37\x3d\x55\x90\x5f\x3a\x2d\x9d\x62\xfa\x37\x51\x7a\xca\x6c\xad\xa4\x70\x9a\x29\xfd\x61\x82\xf7\x0f\xa2\x5c\x60\xfe\xc4\xf4\xca\x37\xc5\x70\x99\xd8\x5c\xc9\xa7\x2f\x00\xab\x85\x85\xf4\x0d\x85\x8b\xda\x9b\xef\xe8\xbf\x4a\xa7\x34\xc9\xaf\x2c\x24\xd7\x80\x0d\x1a\x29\xef\x3c\x89\xbb\x62\xd4\x72\x6a\x07\xe8\xb7\x99\xad\xbc\xa3\xf8\x88\x80\xcd\xf3\xe0\x67\xc5\xbb\xf9\x1e\xdd\x97\x96\x3c\x97\xf8\xe4\xb9\x0d\x9f\x05\x96\x79\x9a\xdb\x4f\xd8\x8e\x2d\xe7\xab\xaa\xdf\xa1\xdb\x45\xb5\xc4\x47\xff\xbb\x71\x06\x41\xc8\xca\x40\x2d\x6b\x33\xd0\xa7\x5a\x18\x20\x21\x3d\x77\x20\xdd\x68\xed\xe6\xc6\xed\xf9\x2f\xfc\x19\x63\xf8\xfe\x10\xd8\x32\x54\xd1\xbc\x6c\x9c\x2e\x62\xd5\xec\x0c\x62\xe2\x49\x1e\xc4\x6e\xe1\x28\x2f\x67\x69\x4e\x38\x60\xa7\x54\x3b\xeb\x51\x14\x15\xc2\x59\xed\x59\x4f\x78\x83\x36\x96\x89\x35\x8c\x7a\xdc\x6a\x8e\x50\x40\x4a\x68\x6c\x8f\x40\x9a\xac\x66\x8a\xde\xfd\xa8\x98\xe7\xe3\x89\x74\x27\xbd\xa5\x45\x37\x44\xa0\xc1\x51\xeb\x75\xd7\xd2\xe0\x72\xd6\x18\xec\xc8\x71\x9a\x4c\xa6\x38\xe7\xbb\x6e\xc4\x13\xf2\x0d\x69\xf9\x72\xd2\xfa\x0b\xe0\xf1\x23\x72\xd4\x85\x47\x85\x42\x48\x1c\xe7\xff\xd5\xf8\x87\x82\x8f\xe0\x27\x42\xb1\xc6\xf6\x44\x84\x19\xb8\x9a\x03\x87\x73\xb7\xd5\x08\x71\x26\xae\x25\xcb\xb4\x28\x4b\xb4\xfa\x99\x78\xaa\x6b\x25\x34\x7b\x31\xd2\x24\x8b\x9a\xd2\x0c\x9c\x5b\x9e\x1f\xb4\x5c\x43\x61\xb2\x1f\x38\xd1\x90\xd9\x7e\xba\xfe\x3d\x53\x4f\x1b\x53\x57\x7e\x39\xc2\x79\xc2\x90\x61\xbe\xcf\x0d\x11\x35\x77\x19\xed\x73\xf7\xb9\x25\x65\x27\xfc\x99\xe2\x8a\x4f\xca\xa6\xf8\x64\x26\xc5\x27\xe0\x2e\xf3\xcf\x5d\x96\xc0\xb4\x9e\x2b\x01\xc8\x4c\x63\xbe\xb2\xc1\x31\xf0\x9e\x30\x9d\x5f\xe1\xd2\x70\xf0\x04\x5a\x61\x63\xa0\xa8\x26\xf2\x26\x2a\x30\x43\x53\xa5\x73\x5b\x39\x72\x96\x99\xcb\xe1\x36\x35\x26\x53\x34\x95\x57\xef\x32\xd1\x9a\x8f\xf8\xc2\x77\xca\x43\xe1\x36\x74\x39\xce\x58\x9c\x35\xc7\x72\xd1\x1c\xcb\x05\x9a\xda\x3e\x0f\x89\xe7\x36\x73\x5e\xcd\x8a\xa9\x23\x55\x35\x89\x54\x91\xd6\xeb\x4d\xac\xf5\xb6\x9c\x20\x3a\xed\x4e\xa6\x58\x6a\xf0\x12\xd6\x64\x25\xc9\x17\xfe\x8f\x40\x8e\xaf\x64\x4c\x88\x0c\x35\x7d\x3a\xf0\xc7\x3c\x38\x03\x62\xc9\x9d\xac\x3d\x4c\xd8\xf8\xb6\xfb\xae\x91\x16\xe8\xb0\xb1\xed\x6f\x4b\x21\xfa\xcc\xf2\x59\x42\xa3\x74\x3e\x0f\x85\x50\x48\x0e\xa2\x6e\x3a\x7f\x33\xb0\xf0\x0b\x78\x66\xd1\x62\x3a\x62\x91\xc8\x2c\x94\x03\x14\x92\x0f\xc5\x14\xb3\x82\xe4\x51\x15\x9a\xdc\xf2\xe3\x08\xcc\x1c\xc9\xd5\x10\xac\x76\xd2\x50\xdf\x1d\x21\x92\xb4\xd2\x54\xf3\x96\x77\x40\xbb\x25\x4c\xa1\x4a\x53\xe5\x77\xec\x4b\x8c\xfb\x37\xef\x17\xd3\xdb\x7f\xa8\x61\xf5\x92\xdf\x19\x58\x3e\xff\xa8\x63\x76\xc3\x69\x1c\x88\x31\x6f\x3c\xb6\xd1\x86\xc3\x60\x78\x79\xba\x65\x0a\xea\x84\x5f\x06\x5b\x3b\x27\xea\xa1\xc5\x44\xa1\x63\x8f\x82\x11\x08\x44\x42\x94\xdc\x21\xb6\xf4\x0a\xdc\xf1\x89\x77\x46\x4a\xb5\xff\x51\x48\x58\xb9\x26\xfd\x5a\x43\x79\x50\x4b\xd3\x76\x4e\xd8\xd4\x8e\x11\xae\x5d\x48\xdb\xd8\x5a\xcf\x1c\x08\x86\xd0\x74\x24\xe8\x86\xb2\x74\x61\xdd\x81\xf2\xba\x5e\x29\xc7\x27\xe2\x94\x15\xd1\xf3\xfc\x45\x18\xbc\x7c\xfe\xe6\xf5\xfd\x57\x01\x92\x91\xc4\x2a\xba\xc5\x29\x47\x2e\x14\x6f\x99\xf1\x11\x9c\xe5\x46\x11\xb7\x04\x89\x17\x84\xdf\x78\x92\x55\x8c\x14\x46\x1d\x57\x64\xdd\x2f\xe6\x3a\x23\xab\x85\xfc\x52\xfa\xda\x53\x82\x4a\x7a\xcb\xf0\x87\x55\xca\x68\x53\xeb\x52\xd9\xc8\x93\x63\x84\xf8\xd2\x9f\x07\x6f\x4a\xe8\x84\x4a\x83\xd8\xd0\x95\xe9\x36\x76\x9a\x2a\xcb\xf6\xd6\xc0\x9d\x3e\xad\x74\xd3\x23\x78\x3d\x00\xd9\x40\x23\xf0\xe7\x15\x09\x97\xfc\xd4\x2b\x96\x20\xf0\x03\x73\x8a\x65\x44\xf8\x22\xfa\xe5\x41\x15\xbd\x22\xf9\xd9\x5a\xfc\x54\x71\x46\x10\xd2\x96\x72\x20\x84\x68\xeb\x9c\x9a\xb5\x4a\x64\x63\xac\x46\x96\x9b\x26\x9d\xcb\x87\x71\x16\xcd\x42\x8a\x95\xde\xdd\x79\xf4\xe5\x27\x33\xf9\x67\xd1\x17\x14\x22\xf0\x62\x2d\xab\xd4\xed\x95\x33\x56\xb2\x2d\xe9\x8f\x3e\x3a\x16\xb8\x48\x41\x35\x42\xf1\x19\x0b\x59\x88\x3c\x9a\x12\x8e\x82\x5c\x11\xfd\xfa\xe3\x8b\xb1\x15\xec\x3c\x76\x1a\x55\x50\xa7\x7e\x88\xb1\x9d\x54\x57\xc5\x4c\x78\x61\x57\x6c\xeb\xd2\x85\x64\x09\xc2\x92\xde\x36\xcf\x43\xe3\x0c\x41\x91\x01\xb6\xb3\x04\xd1\xa5\x72\xbe\xc6\x17\x6c\x26\x41\xda\xb5\xa0\xd6\xde\xdd\xbc\x9d\x2a\x6b\x76\x68\xe0\x69\xba\xa8\xcb\x02\x00\x4f\x18\xbe\x0b\xe3\xfd\x79\xc3\x74\x50\x2a\x9a\x34\x6d\xfb\x39\x48\xa9\x49\x18\xfd\x66\x68\x3d\xaa\x88\x08\xe2\xe1\x36\x7f\x8f\x54\x8c\x96\x57\x64\xde\xf2\x7e\x63\x73\x6b\xd1\x88\xf4\x7a\x21\x71\xd6\xa7\x69\x26\xce\x1b\xf6\xb8\x9c\x70\x29\x1f\x35\x1a\x37\xbe\x58\x63\x01\x30\xab\x7d\x66\xff\xcd\xe5\x02\x37\xe0\xed\x15\x50\xd7\x56\x7b\x0e\x0a\xe2\x21\x8a\x14\xef\xab\xa4\xde\x35\x22\x1c\xc6\x6b\xa7\x6e\x33\xb6\x9f\x28\x2e\x58\xf6\xae\xc1\xc6\x9c\x4a\xe4\xfe\x42\x10\x58\x6f\xa8\x1d\x88\xa8\x5f\x93\x2f\x8c\xa6\x33\xa7\xcd\xfa\x92\xd0\xf3\x06\xb2\xb6\xae\xa7\xa5\x94\xd1\x08\x15\x4e\xe3\x76\x8b\xb6\x34\x56\x84\x94\xd9\x0d\x34\xbb\xa0\x76\xc3\xae\xaa\xaa\x44\xf9\x67\x34\x59\x41\xb0\xf9\x58\x86\x86\xc7\x8a\x94\x8f\x03\x19\xb3\x3e\xc0\x76\xd8\x79\x2b\xd9\x7a\x0f\xa8\xda\x35\x3e\x37\x0d\x8a\x28\xfb\xdf\xdc\xa2\xac\x5e\xc3\xa3\xef\x92\x36\x2c\xc2\xbd\xc6\x20\xc2\x07\xfe\x75\xfc\x3b\xd7\x2e\x84\xd8\x8c\x22\x09\x5e\x12\x36\xf8\x2b\x1b\x38\x72\xae\xb1\x88\x74\x69\xcf\x5f\x57\xaf\x96\x33\xbe\xd1\x67\xcb\xfc\x59\xfa\x29\x3b\x17\xa5\x2d\xfc\xb0\xa4\x94\x14\xcc\x9b\x37\xcf\xaa\x45\x59\x91\xb9\xb6\x84\xe0\xed\x3d\x91\x3d\x0a\x46\xff\xe3\xe2\xac\xb4\x6a\x14\xba\x99\xc7\xf3\xa4\xef\xf4\xf0\x22\x3d\x27\x26\x31\xab\x9e\x9d\xbf\x2b\x0b\x72\xbf\x48\x4f\x73\xab\x07\xf2\x09\xa2\x8e\x2b\xec\x2e\x13\x29\x2d\xe9\xa3\xb4\x98\xf3\x0b\x7b\x49\x95\x55\x46\x7e\x56\xd2\x4b\x32\x7f\x43\xb3\xfb\x76\x81\x0b\xea\x8c\xa5\x31\x7c\xb3\x1c\x8f\xe7\xc9\x8e\xcc\xb8\x28\xcb\x8f\x55\xb2\x3a\x25\x67\x25\x25\x2f\xa8\x42\x10\x59\x59\xc4\x0b\x8a\xd3\x33\x46\x68\x33\xd5\x3c\x3c\xa1\xdf\xac\x38\x37\xac\x53\xf2\xb9\x33\xa7\x16\x86\x76\x5d\x81\x01\xcb\x57\xd3\x16\xaf\xd2\x4b\xf2\x86\xda\x7b\x23\x61\x2d\xb8\x8e\x43\x6b\x05\xcc\xd0\x63\x79\xb3\x98\xa7\xcc\x2a\x32\x27\x67\x84\x02\xdc\x6e\xe3\xe6\x5a\x16\xaf\x2a\xd6\x5a\x31\x23\x39\x99\x9b\x51\xd9\xa5\x65\xf4\xda\xa0\x61\x79\x94\x5a\x96\x47\x26\x8c\x5a\x69\xe5\xcc\x86\x9a\xd0\x98\xe9\xc4\x97\xfd\x53\xe9\x81\xa5\x09\x13\x33\xf7\x66\x7d\xd9\x3f\xed\xf5\xe0\x9f\x28\xab\x1e\x17\x27\x05\x68\xde\xf2\x0a\xa1\x7e\x05\x57\x80\x15\xcf\xb2\xf3\x50\xbd\x8c\x25\xf4\x49\xfd\x95\x44\x69\xa0\x38\x0e\xe5\x56\xb5\xf4\xec\x22\x5a\x49\x3f\xab\xd2\x9e\x16\x44\x99\x53\x5a\x7e\xae\x08\xbd\xb6\x9c\x63\xf3\xc5\x3b\xad\x68\xc8\x11\x80\x62\x6a\x32\x9a\x9d\x9f\x13\x6a\x1c\x02\xfd\xc0\xe9\x80\xcd\xd9\x3f\x01\x99\x60\x81\x96\x74\x1d\xf7\xbb\xe4\xff\xfa\xc6\xd0\x42\x32\xb2\x3e\xa3\x69\x21\x14\x8b\x4d\x70\xa4\x55\x36\x8f\xfb\x98\xa5\xf4\x9c\xc8\x03\x1b\xf7\xb1\xdb\x68\xec\xeb\x48\x7e\xbe\x84\xa5\xf3\x96\x90\x17\x0b\x3f\xae\xb2\x80\xe7\xe8\x44\xfa\xfa\x69\xb7\x80\xf0\x92\xe6\x27\xfc\x28\x6a\xdd\xfc\x6f\x6c\x87\x5e\x33\xca\xca\x8e\x72\x22\x84\xfa\x84\x53\xbd\xe2\xf7\x82\x96\x97\x59\x45\xe2\x17\xe2\x5f\x45\x73\x85\xdd\x3e\xc2\xe2\x01\x19\x07\xd9\xe5\x82\x50\x38\x69\x01\x6f\x88\x3f\x9a\xe6\xb0\x51\xa2\x09\xd9\xa9\x72\x45\x1d\x37\xb7\xd3\x38\x1c\x12\x3b\xa1\x0b\xda\xb5\x5f\x9a\xf2\xad\x06\x64\x3d\xbb\x08\x54\x05\x85\xbe\x2a\x5e\xf9\x04\xe5\xd8\x2f\x54\xaf\x65\xa5\x97\xa4\x5a\xe6\x62\x04\x35\x6a\x22\xfb\x4a\x9c\x80\x8a\xb0\xe5\xc2\xe0\x8c\x2a\x6c\xc2\x19\x72\xfc\x02\xdb\x25\x45\x40\x11\x79\xac\x04\xe4\x85\xc2\x9f\x03\x6b\xb0\x7b\x42\x96\x38\x37\x1f\x47\x23\x30\xc5\x10\xa1\xf5\xda\x30\xc9\xa4\xa6\x6b\xac\xbc\xac\x88\xe5\x11\x4d\xd7\xed\x91\x36\xc8\x4b\x71\x0f\x19\xdd\x04\x45\xf6\x2b\x97\x31\xc0\x70\x89\xb2\xb9\xa3\x71\x78\x03\x3f\x20\x7f\xf0\x18\x48\x64\x84\x6a\x61\xac\xa3\xfc\xec\x68\x37\x39\x38\x33\xbe\x72\xac\x57\x87\x1e\xae\x56\xbe\xdc\x70\xd7\xf3\xf3\xce\xa7\x81\xb3\x22\x63\x59\x9a\xc3\xa8\x22\xe7\x34\x37\x4e\x6e\x64\x7f\x62\x89\xa0\x62\x16\x09\xd0\x57\x07\x48\x16\xab\xf0\x82\x92\x4f\x59\xb9\xb4\xf6\x3a\xde\x4a\x99\x5c\xeb\x4b\x65\x5b\x65\x84\x57\x9e\xfe\x04\xc8\x8a\x7f\x6a\x77\x19\x9d\x07\x8b\x8b\xd3\xad\x50\x2f\xb8\x48\xba\x2e\x45\xb1\x5e\xbb\xeb\x60\x15\xee\x26\x09\x5d\xaf\x69\x37\xf1\x5d\x0a\x56\x39\xd0\xda\x0d\x28\xe1\x0f\x4c\x1d\x3c\xdb\x43\x0e\xac\xd7\x85\x0a\xf3\xea\x83\x94\x36\x31\xaf\x40\x46\xf1\x22\x3e\xd1\x50\xed\x8e\x8e\x28\xda\xbc\xbe\x9c\xc9\xc0\x12\xb5\x20\xc9\xbf\x66\xd6\xd9\xe6\xe7\xf0\x6d\x9a\x2f\x49\x68\x3d\xde\x21\xda\x07\xbf\x5c\x7e\x0b\x01\xcc\x24\x9a\x90\x94\xad\x18\xaf\xdb\xb7\x86\x24\xe0\x86\x19\xcc\x89\x10\xd6\x8b\xea\xef\x75\x5c\x45\xf7\x5b\x58\x19\x3c\x04\xb7\x7d\x6c\xb8\xdc\xb4\x22\xb9\xd3\xd6\x32\x72\x44\xf4\xbf\xd9\x16\x27\x91\x34\xab\x56\xce\x11\x0a\xf7\x4c\x78\xcc\x1b\xaf\x77\xb5\xb0\xf2\x5c\x6e\x60\x33\x52\xbb\x56\xc1\x46\x65\xbe\x45\x5f\x78\x5e\x0e\x8e\x55\x37\xbe\x01\x3e\xb8\xc9\xe9\x6b\xd5\x42\x78\x75\x96\x15\x0a\x79\xb4\x26\x52\x7b\xb6\xc0\xb5\x88\x14\xbc\x94\xbc\xb5\x0b\x05\x4e\x1d\x2a\x37\xd7\xde\x2e\xd0\x8a\xd1\x2b\x2d\x89\x02\xca\x88\x98\x4a\x38\x47\x91\xa5\x9f\xd0\xb8\x40\xb2\xf1\x0f\xc2\xa3\xf0\xaf\xc4\x62\x87\x66\xa8\x9e\x81\x99\xb6\xd1\x82\xfd\x81\xf0\x54\xb1\xcb\x79\x7b\x5e\x98\x86\x9e\x54\xe4\x9a\x67\xde\x10\x02\x72\x84\x57\x8d\xbb\xde\xd9\xfe\xb6\x8e\x80\xa3\xde\x20\xc9\x45\xf7\x60\xa1\x6b\x1e\x10\x5b\x25\x47\x0e\xb0\x04\x24\x3d\x27\x54\x63\xa9\xd6\x3b\x03\xfc\x28\x09\x84\x1f\x55\x1f\xb3\x85\xfb\x44\x5c\xaf\x15\x71\xf0\xbd\x46\x3b\xa1\x07\x4e\xb0\x1a\x71\x0b\x3b\xb5\x17\xd9\xd1\xd9\x78\x73\x63\xdc\xe2\x29\xe1\xd9\x40\x16\xb9\x5b\x81\x46\x12\x91\x51\x7e\x0f\x83\x70\x59\x05\xde\xd6\x4f\x85\x3f\x84\xa2\xdd\xaa\x4a\xfc\xc6\xef\x62\xea\xde\xb6\x99\xa2\x28\x8b\x06\x19\x99\xaa\x8b\x36\xaf\x13\x26\x83\x9b\xfe\x16\x52\xcf\x0c\x33\x01\x90\x6a\x0a\x95\x31\x10\xfb\x1d\xdc\x93\xfb\x5f\x08\x9a\x02\x6d\xd2\x16\x37\x20\x71\x1a\x70\x5c\x7a\xe8\xf6\x4c\x0d\xff\x06\xc7\xa2\x0d\x50\x71\x77\x80\xe5\x1b\x94\x2f\x52\x77\x50\x83\xbd\x94\xcd\x03\xb3\xdf\x70\xf2\xe3\xa6\xb0\x65\x02\x22\x0a\x2e\x14\xae\xa2\xfb\x35\xc2\x05\x35\xb7\x5f\x73\x8a\x04\xfb\xb6\x4e\x3e\x33\x0a\xfd\xa8\xf0\xcc\x24\xb5\x27\x92\xd7\x75\xc2\x1c\xd6\x23\xf0\x25\x22\x0f\x5b\x22\x24\x78\x65\xf3\x5a\x62\x8a\xf9\xa5\x94\x41\xdf\xf0\x4a\x53\xfd\xc3\x47\x81\x7d\xab\xd8\x75\x7a\xef\x76\xf3\x5a\x72\xe8\xf5\xc1\x9f\x59\xe1\x15\x6e\xfd\xed\xa7\xac\xfd\xe4\x25\xa8\xfe\xa3\x04\xb6\x7c\xe2\xbc\x21\x61\xb3\x03\xac\x09\x5b\x93\xd2\x64\xab\x01\xa1\xed\x8b\x2a\xd6\x36\x1d\x6e\x02\x41\xd6\x7a\xd6\x15\x5b\xde\x5b\xa9\xf7\xb9\x55\xd5\x75\x42\x47\x96\xd6\x92\x2b\x4b\x57\x3a\x09\xe3\x9b\x1e\x47\xaa\x17\x44\x3e\xdf\xba\xfd\x1a\xa1\x78\x0b\x3d\x24\x64\x15\x1e\x31\x87\x8f\x40\x52\x8a\xd5\xa0\x22\x69\x07\x3d\x74\xbe\x5c\x75\x4b\xad\x4b\xdd\x4d\x85\x09\x5c\x7a\xad\x09\x5c\x9e\xa4\x20\x44\x4a\x35\x44\xe6\xc9\x2d\x12\xa6\x98\xe0\x42\x18\xc9\x54\xbc\x41\x5f\x08\x56\x30\x89\x63\xee\x08\x50\x1d\xe6\x08\x55\xc9\x19\x13\xc6\x72\x26\xc7\x28\xf4\x38\xa6\x72\xf9\x76\x53\x39\x53\x5f\x1b\xcc\x89\xc6\x4d\x73\x0a\x37\x99\xf0\xbb\xe0\x76\x01\x79\xcc\xe7\x72\xcb\x7c\x0e\x22\xd2\x59\x0a\x2a\x62\x55\xc1\x51\x48\xd6\xf0\xde\x00\xef\x51\xdc\xed\xf3\x3a\x15\xe8\x88\xb6\x36\x91\x26\x77\xa8\xed\x07\x4d\x4b\xc2\x4e\xcb\x32\x27\xa9\xe3\x2e\x36\xa4\x68\x7c\x1d\x94\x90\x86\x0b\x0b\x02\xfe\x5f\x17\xd1\x57\x14\x7a\xe3\xf2\x99\xb8\x0e\x1c\x5e\x80\x02\xfb\x11\xb8\x5d\xf6\x96\xd7\xa1\x84\x1d\x15\x4a\x2f\xf3\x9f\x47\x5f\x6b\x8c\x6d\x6e\xae\xd9\x8e\x63\x99\x69\x42\xed\x0f\xa6\xb8\x48\x88\x09\x0b\xa2\xd3\x39\x41\xf9\x89\xd0\x8a\x84\x3a\x74\xbe\xbd\x92\x46\xbd\xc4\x89\xfd\xd9\x3c\x06\x27\xb6\xdf\x60\x71\x12\x8c\xf2\x49\xdf\x72\x5a\x3b\x5e\x15\xe5\x9c\xc4\x4c\x61\x10\x52\x8b\xf7\x2b\x9f\xa0\xa5\x66\xa1\x95\xdc\x94\xbd\x56\x29\x25\x10\xd2\xcc\x8c\x44\xa2\x3e\x64\x17\x3a\x23\xe5\xc7\xa7\xc0\x24\xe2\x9d\x60\x2a\xce\x50\x7e\xfd\x19\x72\x86\x8f\xea\x30\x45\x28\xe7\x90\x9e\xb6\x32\x21\xf0\x89\x7b\x8a\xd2\xed\xa7\xc8\xa9\xae\x0f\x92\x68\x5e\xb4\xa6\x0e\x51\x7e\xfd\x21\x2a\x9c\x43\x84\xae\xc9\x0f\x45\xc0\x46\x76\xc1\xf1\xe5\x46\x20\xd9\x8e\xe0\x4e\x5a\xe8\xed\x5b\x2c\x7c\x1b\xdb\x77\x8b\x48\xa7\x45\xc6\xd0\xf7\x66\x1b\x84\xea\xb0\x40\x28\xe5\x8b\xe7\x58\x08\x40\x0c\xc4\x3f\x64\x07\x7c\xd2\x44\x6d\xa2\xd1\xd0\xd1\xfc\x49\xdb\x3b\x72\x93\x25\x97\xd8\xac\xe9\x88\xc6\x46\x65\x19\x4e\xc1\x01\x6a\x6c\x99\xd6\xfe\x11\x8a\xa0\x75\x01\x32\xe1\x55\x68\xf3\xab\xda\xc7\x79\x97\x58\xc5\xb6\x64\xbe\xcb\x57\xdc\x6e\x19\x19\x24\xb0\xc5\x9e\xb9\x41\x16\x39\x0d\xb4\x2d\x9a\x9d\x7c\xac\xf4\xc4\x04\x39\xf6\xfb\xdf\x4c\x8e\xe1\x6e\xb7\x31\xbe\x2d\xf4\x99\xe2\x8a\x36\xeb\xa8\x00\xcd\xf2\xf1\xf2\x28\xab\xa4\x12\x86\x2d\x66\x32\x8c\x84\xd7\x9a\xaf\x13\x32\x1c\x04\x08\x9c\x80\x28\xca\x1b\x34\x70\x25\x3a\x6b\x1b\xbd\xf8\x0f\x99\x8f\x13\x6a\x2f\xe2\xcf\xff\x46\x9a\xd6\xe1\xe5\x92\x2d\x6c\xdc\x6f\x25\x47\x37\x13\x9f\x05\x90\x99\xe0\x53\x78\xc3\xc2\x29\x94\x93\xf4\x1b\x4e\xc1\x8a\xc6\xa5\x4f\xdb\x94\xa1\x46\x4c\x9b\x5d\xdb\x3a\xa6\xaf\xda\x41\xc7\xa6\xc1\xac\x6a\xc7\xbd\xf1\xc6\x01\x89\x15\xf1\x30\xf3\x90\x8d\x51\xdd\xc8\xb4\x80\x21\xe5\x7b\x6f\xac\x7f\x81\xd5\x72\xac\x8c\x97\x43\x36\x29\xa6\xb2\xa5\x36\x3c\x09\xf3\x6b\x70\xa7\xf5\x4a\xfa\xb7\x17\x03\xe1\xa8\xdc\x9e\x68\x8a\xe4\xfc\xec\xf8\x70\x7a\x92\x29\x8a\xab\xe8\xbe\x20\xf9\x94\x05\x1a\x16\x63\x6d\xb9\xfc\xb3\x8a\x08\xa3\x35\x22\xa3\x2b\x5f\xcb\xbf\x93\x66\x16\xbf\x0a\x5d\x1b\x13\xf9\x1f\x5e\xba\x08\xc2\xf9\x4b\x72\x09\x0b\x45\x13\x35\x53\x3e\x99\xf4\xf6\xed\xe6\x1c\x59\x72\x27\xf5\x4e\x87\xaa\xe9\x28\x54\x7b\x0d\x1b\xaa\x85\x89\x4d\xd7\xab\x82\x7c\x61\x31\xe8\x2f\x26\xe0\x3a\xfa\x72\x91\x13\x46\x20\x65\x45\xfe\x14\x8a\x39\x61\x9d\x9c\xa4\x15\xeb\x94\x85\x72\x07\xa2\x54\xa8\x3a\xf3\x6c\x5e\xfc\x83\x75\xc8\x65\xc6\xc0\x7d\xa1\x50\xbd\x0d\x10\xaa\x6b\xb4\xed\x9d\xfc\xeb\xbf\x09\xa7\xa0\x7f\x2f\x93\xa2\xad\x24\xf1\xf7\xf2\x28\x14\x01\xa0\xd7\x7e\x13\xe1\x26\xf4\x55\x55\x84\xb4\x31\x95\xc6\xda\x42\x3a\xe8\xe8\x38\xde\x02\x1f\x91\x86\xe5\xda\xd4\xdc\x68\xdf\x91\x46\x54\x66\x24\xad\xba\xc9\x1b\xb3\xca\x6c\x31\x2d\x69\xf1\x60\x7c\x5a\x0c\x5e\xb6\x95\x4f\x77\xc1\xc7\x8f\x94\xea\x5c\x7e\xce\x97\x90\x1d\xb5\x15\x0c\xd4\xd4\xad\xb1\x62\xa3\x5d\xf2\x97\x72\x86\xdd\x79\xfc\x11\xae\x30\x5f\x39\xb9\xfd\xf0\x16\x05\x18\xc9\x92\x3b\xf0\x3a\xbc\x04\x57\x69\x9e\x69\x64\x9e\x4d\xe4\xc8\xd1\x0a\xbc\xc7\x9f\xdb\x28\x6c\x71\x8b\x36\xa9\xf8\x5c\x4f\x45\x02\x4e\x0b\xd1\x8a\x26\xdd\x7e\xad\x51\x9a\x4a\x10\x10\xf0\x32\xfa\x22\xf0\x2e\x88\xc1\x09\xdc\xd7\xb4\xd7\xeb\x66\x86\xd2\xfc\x60\x10\x5b\xe7\xf1\xbd\xce\xad\x15\x47\x3d\x75\x27\xab\x3a\x45\xc9\x3a\xe4\xf7\x65\x9a\x73\xea\x93\x5d\x90\x8e\x9c\x63\xc7\x9c\xc8\x4e\x36\xef\x48\xb2\xd4\x3e\xa6\xf5\x87\x91\xd6\xf0\xd1\x51\x82\xb7\xe8\x03\x8d\xbf\x1d\xff\x12\xe5\x0a\xf5\x9a\x52\xb5\xb2\x66\x0b\x5d\x55\x1b\x4b\x04\x65\x49\xfe\x89\x92\xfc\x93\x28\x9b\xa3\x44\xc8\xe9\x95\xe4\xd3\xaf\xee\x66\x6b\x26\x53\x41\x6b\x66\xfc\xae\xf1\xbf\xb6\xd8\x24\x67\xd3\x9a\xbf\x44\x34\x92\xb9\x4b\x42\x2a\x4c\xf1\x33\x75\x21\x59\xea\x67\x7d\xec\x5d\x22\x78\xe3\x8c\x6c\x3f\x84\x5f\x6f\x7a\x77\xd0\xe8\x92\x54\x55\x7a\x4e\x34\x63\xbf\x40\x38\x1b\x57\x84\xbd\xce\x2e\x49\xb9\x64\xf6\x43\xf2\x5a\x5c\x00\x43\x6f\x22\x10\x84\xb3\xc4\x77\x1b\x6c\x39\xcf\x36\xaa\xbe\x4e\x66\xb4\x5e\xdb\x82\xe9\x5a\x5c\x6a\xd5\xec\x82\x70\x2a\xc0\x6c\x4f\x48\xb0\xa3\x4d\x03\x6a\x2c\x19\x5e\x29\xf5\x1c\xcd\xac\x57\x3a\x3a\x3c\x81\xff\xd0\x7a\x3a\x2c\x92\xbf\x6a\x54\xe3\x3e\x32\x35\xc2\xee\x40\x5a\xb4\x6d\xdc\x9d\x91\x2d\x61\xfc\xfe\xc6\x9b\xa3\x37\x25\x43\x23\x46\xaf\x56\xa6\x4b\xa1\x5b\x62\x69\x2b\x72\x28\x92\x82\xc7\x02\xad\xd4\xe0\xc3\x02\xd5\x86\x67\x78\xbf\x46\x52\xc0\x51\x71\xcc\xd5\x90\xd5\x68\xcd\xe3\x8d\xca\xa4\xb6\x66\x11\x2f\x64\xfb\x3e\xf1\x56\xac\xcf\x09\xb3\x8e\x60\x43\x49\xda\x96\xbe\x0b\xb3\x7c\xad\x25\xd3\x42\xc9\x3e\xcd\x0a\xcc\xea\xca\x69\x5f\x4d\xc0\x6e\x18\x96\xef\x26\xd2\xe8\xc6\x50\x11\xf0\x25\xa4\x36\x8b\x05\x46\xda\x97\x3d\x7b\xd3\x00\x5a\x6d\x04\x21\x83\x8c\x37\xf1\xa1\x94\xec\xa9\xe3\xfc\xfd\x95\xbe\xa4\xb4\x06\xd2\x22\x65\x17\xa0\xff\xb5\xb2\x69\x95\x7e\x8d\xea\xad\xfd\xad\x9c\x56\x5e\x2d\x4f\xab\x19\xcd\x16\x42\xe9\x23\xdc\x98\xd7\xd0\x7e\xaa\x44\xd6\x29\x71\x03\xa7\x02\x9c\x09\xa8\x6c\x2b\xec\x3e\xa0\xe5\xa5\xba\x93\xe4\xc1\x03\x19\xe5\xab\xf6\xf1\xd3\xfa\x36\xed\x56\x30\x41\xbd\x9e\x17\xe3\xac\xa4\xd4\x92\xe1\x0a\x88\x1a\x8a\x97\x8a\xe2\xab\x13\x82\x8b\xa4\xb1\x4e\x10\x96\xd3\x40\x99\x87\x8b\x33\x92\x6e\x26\x98\xb3\x35\x58\xa7\xb6\x55\xbc\x70\xbf\x9b\x34\xde\x99\x5a\x96\x12\x16\x51\x25\xa8\x1a\x54\x6f\xc2\x3b\xfc\x01\x44\x71\x01\x38\x63\xab\xf2\x33\x11\xce\x60\x6f\xb0\xd4\xf2\x1e\x17\xa7\x45\xad\x51\xb0\x28\x17\x30\x18\x61\x21\xcc\xae\x16\x64\x6c\xd2\xe2\xe0\x22\xad\x2e\x66\xc2\xa7\x8a\x5e\x45\xf5\xa0\xaa\xcc\xab\x01\xc9\xa5\xb6\x6f\x4a\x31\xc9\x0d\x57\xa3\xbd\x8e\x68\x2c\xcb\x0a\x2d\x41\x73\x0e\x1f\xcf\x63\xdf\x21\xe3\x44\x46\xbd\x19\x64\xa4\x59\x94\x76\x69\xd4\xed\x6b\x71\x3d\xd1\xe6\xb8\x46\x13\x0a\xe6\xdd\x4e\x36\x4a\x44\xf6\x78\x40\xed\xce\x4e\x58\xaf\xbb\x74\xbd\xee\x86\xf6\x42\x09\x73\x7f\x58\xdf\x5e\xaf\xb1\xc0\x22\x79\xbd\x76\x92\xad\xd2\x6e\x33\xe6\x82\x3a\x27\xac\xb3\xa4\x79\xe8\xda\x5a\xb8\xf7\x80\x47\xd9\x14\xec\x34\x9a\x34\x47\xa3\x91\x16\x4d\x52\x37\xe8\xc6\x95\xa5\x92\x28\x30\x23\x93\xb7\x81\xf2\x0d\x8a\x56\xef\x4d\x8c\x04\x69\x03\xc0\xb4\xe5\x55\x93\x1e\xd9\xac\x0e\x5f\x17\xe7\xcf\x0b\x69\x74\xa3\x10\x94\xb4\x02\x08\x51\xad\x7f\xb5\xf1\xb5\x21\x61\xf1\x46\xcc\xa5\x68\x30\x5f\x5e\xb4\x2c\x0c\x26\xdb\xd2\x86\xb4\x11\x43\x4d\x03\x85\x7e\x3b\x66\x40\xb2\x52\xbe\x9f\x56\x4a\xc9\xe5\x75\x19\x53\xc7\x82\x23\x33\x96\x1f\x85\x9d\xa1\x08\xa5\x38\xc5\x0b\xbe\xd0\xf4\x13\x79\xa0\x0a\xe6\x1c\x87\x55\x09\x95\xaf\x97\xe6\xed\x8a\xcb\x24\x1f\xfb\x74\xff\x4c\x4f\xc0\x5b\x9b\x01\xe5\xa9\x5c\x3e\xa5\xd2\xe5\x13\x10\x64\x41\x3c\xfb\x23\x9a\x58\x6f\x7c\x2e\x12\x33\x34\x3a\xa5\x24\xfd\x28\x1d\x35\xc9\x49\xf0\x96\xaf\xa9\x2a\xab\x29\x77\x4c\xb3\x24\x93\x16\x44\xae\xe0\x6d\xd6\xeb\x85\xb2\x2d\x4a\x2e\xcb\x4f\x04\xbc\xc2\xbf\xa0\xe5\xa2\x0a\x67\xa8\xad\x73\x27\x3d\x35\xdb\x41\x99\x94\x86\x62\x4e\x42\xb9\x74\xea\x1f\xe1\xc5\x42\xf1\xfc\x1a\xae\xd2\xda\x96\x7b\x93\xfe\xb4\xd7\x13\x4e\xed\x14\x8a\x0f\xbe\x83\xe3\x3b\xe9\x6b\x07\x9b\x60\x51\x45\xc2\x6e\x1f\xe2\xc7\x8f\x04\xd7\xb5\x8f\x21\xd8\xa4\xf1\xef\xd6\x8c\x36\x09\x1d\x96\xb0\xfa\xa6\xc3\xac\xd7\x13\xab\x90\x49\x27\x81\x2a\xfa\xbf\x3f\x02\xbd\xce\xd7\xe1\xef\xc1\x3d\x9f\xc7\x02\x91\x81\x5f\x41\x06\x36\x52\x31\xab\x11\x9e\x44\x51\xc4\xf0\x4a\xd6\x8f\x49\x0d\x56\xf6\xda\x0b\xe0\x0b\xe3\x93\x50\x94\x74\x72\xa6\xb5\x6b\xea\xd8\xd5\xe3\x1f\xcb\xd2\xd3\x18\xf8\xae\x63\xde\xa2\xee\x58\x7b\x5e\x09\xe5\x12\xf4\x93\xa4\xe8\xf5\x82\x28\x10\xa1\x89\x42\xf9\x0d\x9f\x63\xfe\x60\x8d\x83\x48\x64\x8e\xc9\xed\xdb\x71\x10\x74\x93\xac\xd7\x63\xca\xc4\x1c\x02\x22\xa3\x58\x75\x59\xe3\xc9\xd4\x61\xbb\x94\x24\x14\x12\xed\x5a\xfa\x4d\x4d\x23\x56\x72\x32\xd7\xb8\x7e\x36\x10\xe2\x1a\x6e\x38\x80\x92\xfb\x9c\xae\x81\xa7\x26\x19\xdf\xc7\x86\x84\x99\x6e\x91\x03\x04\x74\xbb\x33\x10\x61\x3f\x24\x73\x27\x7a\xcf\xf1\x23\x5f\x47\x30\xf3\x36\xe4\x89\x5d\x04\xb4\x2d\x1d\x33\x75\xd9\x38\xc3\x4c\x1a\x31\x97\x0c\xf7\x8d\xb3\x95\x82\x08\x91\x3e\xf8\x6e\xe5\xd0\x39\xee\xc7\x3a\xd8\x69\x73\xfc\x1c\x46\xb3\x84\xe1\x22\x21\x38\x4d\xa8\xb0\x5d\x4f\xef\x14\xc2\x43\x6d\xba\x93\x14\x38\x83\xc8\x00\x20\x29\xf7\x78\xcb\xd4\x92\x3c\xe1\xeb\xb1\x53\x9e\x75\xfe\x11\x45\xdf\xfd\x23\x40\xa3\x22\x69\xf9\x92\xac\xdd\x29\x64\xb8\x3b\xc0\xc5\x4e\x0a\x5c\x61\xdf\x94\xf1\xc6\xc5\xba\x9d\x61\xe3\x5f\xf2\x5e\xb9\x3c\xcd\xc9\xbd\x92\x55\xa8\x06\xa5\x0d\x86\x70\x95\xe4\x4d\x37\x13\xe3\x25\x09\x73\xd7\xbb\x53\x1e\x65\xbc\x35\xe1\xb7\x0c\x56\x0c\xc5\xf3\x9b\x94\x1a\x19\xb8\x69\x14\xae\x24\xcc\xd4\x61\xe5\xc3\xa1\x98\xe1\x19\x16\x67\xbb\x1c\x97\xb1\xe0\x0d\x34\x48\x7f\x7e\xb3\x78\x95\xd2\x6a\x63\x01\xab\xc2\xc7\x36\x28\x35\xfe\xa6\xbe\xee\x2d\xde\x7a\x87\x3b\xcc\x56\x2f\xa5\xda\x7e\x21\x13\x33\xea\xed\x03\xf6\x38\x08\x35\xbe\x27\xfb\x23\x62\x82\xb9\x12\x13\xcc\x95\x26\x6c\x42\xa6\xc6\xcb\x10\x6d\xbb\x69\x7d\x7d\x41\x3a\x94\xfc\xbe\x24\x15\x23\xf3\x0e\x7f\x20\x75\x66\x65\xc1\xd2\xac\xa8\x3a\xb7\x56\xb4\xee\xc8\x5d\xe9\xa4\xac\x03\xdb\xd7\xb9\xb5\x22\xf5\x07\x50\xb7\x6d\x10\x2c\xd6\x8b\xab\x75\xc7\x23\x3e\xd3\x86\xda\xab\x43\x5b\x6d\x71\x20\x6d\x6d\x8b\x90\xc1\xc1\x5b\xdd\x30\x4b\x5a\xfe\x91\x99\x7a\xa9\x53\xa4\x8a\x6d\x32\x42\x0c\xfd\xda\xd8\xc6\x57\x46\x2d\x1d\xc8\x11\xcb\x09\x2d\x3c\x83\x92\xae\x20\xd4\x5b\x37\xfe\x19\x45\x71\x77\xe0\xcf\x3b\xa7\x28\x26\xd8\x76\xae\xdd\xf9\xb4\xc1\x22\x8c\x3f\xa6\xf4\x75\xd7\x80\xce\xd1\xf6\xba\x19\xa6\x7c\x02\x8d\xcb\xde\x2c\x78\xe3\xb5\xa5\xae\x52\xc1\x8e\x75\xe3\x00\x3b\xb4\x44\x66\x1c\xd6\x62\x52\x73\xc4\x5e\xfb\x2c\x84\x9a\xac\xca\xaa\xf1\xf6\xdd\xc0\x75\x6b\x51\xb9\x86\x8b\xe3\x5a\xa6\x2a\x16\xb7\x7c\x3f\xb6\x68\x6e\x0e\xdd\x0f\xff\x84\x70\xc7\xf3\x3a\x40\xe8\x1a\x3b\x5d\xff\xfb\xc0\x52\x51\xed\xf6\x51\x8d\x8d\x98\x40\x18\x5c\x46\x9f\x53\x5a\x84\x1f\xde\x14\x17\x00\x8d\xf3\x8e\xc5\x26\x06\x28\x8d\x3b\xb7\x56\x8c\x9f\x36\x54\x7b\x10\x8a\x45\xb1\xf1\x17\x6b\x8a\x73\x1d\x8b\x5f\x11\xdc\x0a\xca\x5a\x46\x70\x03\x05\x5d\x55\xe2\x7b\x39\xe2\x32\xf9\x44\x43\x60\x1c\xf4\x7a\xdd\x4f\x34\xac\xd4\x03\x0b\xcf\x92\xd0\xbf\x5f\x49\x52\x45\xd9\x5c\x52\xdb\xad\xb5\x18\x2b\x5c\x19\x57\x1e\x89\x40\xf3\x99\xe9\xda\xdf\x94\xbd\xde\x6c\xe3\x4c\xfa\x82\x46\x9c\xe3\x25\xbe\x18\x15\xe3\x70\x9e\x68\xf1\x30\x5e\xc2\x6f\x60\x33\x5e\x24\x85\x62\x30\xa2\xf8\x02\x18\x85\xb2\x29\x1d\xd3\x7c\x9e\x30\xbc\x4c\x88\x96\x62\x2f\x92\xdb\xb7\x5b\x6c\x26\xe8\xec\x4c\x1e\x8c\x80\x3f\xa7\x96\xcc\x92\xac\x6c\xe7\xc0\x6b\xc6\x95\x03\xd1\x10\x19\xdd\xe5\x16\x59\xb6\x72\xf8\x2c\xa1\xbd\x1e\xf5\xb0\x4e\xc6\xbe\xc4\x38\x8b\x0c\xd3\x66\xbd\xce\x3c\xec\xdf\xb1\x0a\xbc\x9b\x3a\x6c\x3f\x51\xdf\x8e\xbf\x9b\x8e\xd3\xb8\x1f\x2b\x17\x6d\x61\x7e\x4d\xf1\x7c\x9c\xc7\x7d\x74\x7b\x80\xe2\x33\x65\x3e\xee\x32\x10\x57\xd9\x3c\x5e\xb8\x56\xab\x67\x4a\x73\x9e\x34\x34\xe7\xe9\x37\x9a\xb3\x5a\x12\x29\x65\x3f\xaa\x64\xa6\x99\x36\x16\x9d\x2b\x2e\xf4\x52\xb3\x9f\x2f\xfe\x80\xb5\xe7\x0d\x2c\x3b\x6b\x84\x2f\x22\x71\x0b\xb1\xe4\x8e\x01\x5a\xe0\x1a\x33\x04\x1c\x47\x5b\x98\xd6\x72\xcb\xb1\xf9\x42\xc4\xd9\x75\x8f\x4e\xa2\x59\xff\xc0\x58\x52\x0c\xd8\x82\xd3\x1e\xe4\xd9\xb9\x35\xee\x90\x70\x34\x49\x1c\x8c\x8a\x24\xaf\x51\x03\x63\x56\xdd\x55\xe0\xca\x2e\xee\xff\xbe\x4c\xf3\xd7\x65\x48\x21\xaa\xaa\xec\xc7\x40\xdc\xd8\xad\x2a\x33\x44\x5f\x14\x07\x81\x76\x3e\x6f\x40\xbd\x54\x19\x75\x8b\xb5\x4f\x92\xee\x40\x20\x37\x8a\x45\xbc\xf0\x3f\x74\xe0\x1a\xb6\xa2\xce\xa1\xdb\x71\xaf\x91\x91\xe1\x33\x75\x0d\x3b\xa9\xd7\x93\xe2\x91\xee\x66\xc1\xa9\x07\x2e\xf9\x61\x51\xfc\x3d\x7a\x03\x49\x18\x55\xec\x3e\x1a\x29\x03\x2d\x24\xb4\x12\x89\x8f\x43\x91\x58\xcd\x67\x37\x68\x3e\x53\xcd\x67\xa6\x79\xa1\xa8\x4e\x14\xab\x07\x98\x54\x62\x97\x36\xca\x71\xbd\x36\xeb\xbc\x1e\x4f\x29\xef\x3a\xb9\x21\x6a\x6e\xf3\x85\xd8\xd4\x87\x25\x84\x59\xcb\x2b\xf2\x87\x84\x97\x9c\xf2\x50\xb6\x3c\xed\xa1\x6e\x19\x45\xed\x14\x5f\x79\xe4\xe5\x1e\xa1\xb2\x5f\x94\xef\x9d\xff\xcd\xe5\xf8\x3e\x22\x4f\x9b\x0d\x6f\x9e\xc1\x6a\xcb\x81\xda\x8e\x28\x9a\x62\xc2\x20\xd8\x86\x08\xbc\x77\xba\x87\xfc\x02\x31\xd8\x56\x29\xb0\x13\x28\xfb\xc6\x92\x52\xe2\xd3\x97\xa1\x08\xbb\x62\xc0\x0d\x63\x37\x0a\x77\x7f\xf0\x46\x76\x15\x5f\x18\x0e\xda\x17\x6a\x10\x93\x3a\x6e\x94\xab\xb5\xd4\x4f\x89\x34\xce\xd2\x99\x61\x6b\x10\xdb\x26\x35\x24\xeb\x35\x43\x61\x11\x3d\x79\xf0\x30\x2c\xa2\x7b\x57\x0f\x11\x16\x1f\x8f\x98\xfa\x35\xa3\xea\x57\x16\xfd\x4a\xd4\xef\x22\xfa\x5a\xed\x9a\x8f\x4f\xbb\x95\xf9\x78\x95\xe5\xea\x43\x72\x5a\x39\x7d\x29\x07\xb3\xa0\xe5\xa7\xa4\x88\x7e\xfd\x7a\x18\xae\x58\xf9\x91\x14\x31\xc3\x67\xc2\xb1\x56\x6c\x0d\xb8\x46\x98\xd5\x28\x44\x23\xed\xe5\xe7\x93\xe5\xc2\xce\x7e\xac\x72\xf4\x57\x73\xc2\xe7\xea\x46\xbe\x73\x74\x28\x08\x0e\x36\xda\x13\x0e\x6b\x78\xc2\x21\x0d\x5f\x58\xca\x0a\x16\x68\x94\x7b\x84\x81\x7a\x99\x0e\xa7\xac\x5c\x41\x59\x4e\x6c\xde\xeb\xc4\x97\x0d\xff\x5a\x2a\xe3\xbe\xf1\x52\x53\x44\x9f\x94\x35\xe6\x9c\x6c\xcf\x2f\xd2\x4b\x02\xb1\xbd\x19\x66\x91\xdf\x8b\x96\x2a\x06\x15\x90\x8f\x1b\xef\x4e\x3e\xda\xe4\x2d\x4b\x35\x24\xda\x78\x5c\x64\x2c\x94\x42\x19\x67\xd6\x4d\xcf\x9f\x6e\xe3\xb6\x8f\x29\xdd\xe0\x08\x22\x4c\x00\x24\x83\x76\x8f\x76\xb3\x25\xae\x94\x54\xfa\x03\x34\xe9\xca\x6e\x45\x62\x6e\xd5\x37\x44\x93\x51\x26\x2d\xfa\x34\x52\xc1\x6c\x46\xa8\x06\x89\x8b\xe5\x66\x3d\x34\x81\xd2\xdd\x39\x40\x41\x2d\xd2\xf6\x4f\xb3\xc5\x18\x13\x0b\xa6\x34\x65\x74\xc1\xc0\xe5\xb6\xe8\xf4\x48\x79\xa2\x81\xce\x5c\xf8\xf8\x4b\x7b\x6c\xc0\x9e\xa7\x3b\xf0\x7b\xed\x32\x39\x1a\x95\xc6\xbe\x44\xc3\xaa\x9b\xa7\x2c\x8d\x57\x75\x3d\x17\xee\x1d\xff\xec\xe8\xdd\x7b\x44\x35\x3a\x72\xe0\x4a\x97\xf7\xaf\xee\xb5\x67\xaf\x56\x50\xa5\xc3\xb7\x98\xba\xcc\x5f\x91\xe0\x06\xb1\x59\x54\x84\xb2\x90\x45\x17\x65\xc5\xde\x66\xe4\x33\xaa\xcd\x79\x15\x8b\xb0\xf5\x68\x68\x00\x1b\x35\x20\x63\xae\xce\xe7\xb7\x20\x94\x26\xca\x88\xc8\x65\x06\xd2\xbd\xda\x3d\x26\x52\xa4\x0a\x75\xac\x33\xd1\xde\x27\x19\x03\x49\x5b\xa4\xa5\x45\x27\xcd\x29\x49\xe7\x57\x66\xd3\x64\x38\x7b\xb5\x77\xcd\xd1\x31\x2d\xad\x0d\x49\xa2\x74\xf4\xd4\xf1\xd4\x3a\xc3\x5a\x61\x44\x7b\x56\x8c\xde\x9f\x2d\xd9\x92\x12\xf5\xd0\x71\x4d\x64\x54\x71\xcd\x02\x6d\xe3\x9a\x96\xb3\x3c\x8d\x73\x4c\xd0\x2b\xa1\x27\x75\x4a\x41\x40\xd3\xdc\x61\xa9\x39\x3c\x6a\x42\x88\x53\x6c\x26\xfb\x50\xf8\xa2\xe1\x48\x4d\xb9\x7d\x2e\x90\xef\xda\x88\x2e\x53\xfa\xf1\x41\x49\x41\x91\xbe\xb9\xe5\xce\x16\xfa\xd1\x07\xfa\x96\x0b\xfe\xd7\xdd\x03\x79\x93\xf3\x5f\x45\x54\xbd\x3f\x35\x1f\xef\xdf\xce\xf9\xc7\xad\xa3\xa7\x61\xc0\xd7\x2a\xb0\xca\x7d\xff\xdc\xbe\xbd\xe7\x19\x4d\x8a\x28\x7f\x38\x0c\x57\xec\x6a\x01\xda\x19\x24\x87\x59\x55\xf1\x64\x12\x08\xda\x64\x47\xc2\xc6\x74\x8a\xcb\x25\x5b\x2c\x59\x15\xaf\xdc\xf9\xc5\x81\xfa\x0e\x70\x13\x7c\xe3\xc0\xa4\x04\x35\x26\x5f\x16\x25\x65\x27\x55\x3c\x09\x54\xb3\x9a\x36\x10\x17\xfd\xa9\xc7\x63\xab\x4d\x4d\x6b\x77\xad\x32\x10\xa6\xb8\xf1\x4d\x14\x02\x52\xb0\x84\xd6\xe7\xd2\x2f\xa2\x46\x8a\x49\x92\xfc\xcc\xc6\xa6\x99\x98\xa7\xcc\x54\x20\x4a\xbb\xad\xd8\x6a\x29\x52\xed\x28\x67\x89\x77\xe9\x4a\xfe\x3a\xa1\xab\x85\xf0\xd5\xb2\xc5\x5d\x21\x50\x32\xaf\x6e\x42\xc9\x14\xce\x8b\x41\x4d\x52\x01\xb0\x0e\xce\x21\x7a\x74\x5c\xcb\x29\x60\xb5\x1d\x8a\x81\x45\x68\x72\x87\xf9\xbc\x89\x81\xb3\x48\x6f\xde\x4f\x3c\x4f\x6a\x28\xbd\xd0\x3d\x69\x45\xa9\x96\xc6\x91\x18\xab\xe2\x88\x36\xfd\x21\x39\x5e\x50\x1f\x82\x36\xe5\x6b\x65\x37\x60\x4f\x26\x44\x08\x59\x7c\x5b\x58\x29\xe0\xf7\xca\x5c\x17\xe9\x3a\xde\x66\x85\x67\x39\xe7\x06\x91\x6c\x62\xc0\x5b\x55\xe8\xa8\xbb\x29\xaf\x27\x3e\x1a\xaa\x72\x94\x12\x5a\x49\xae\x2e\x42\xdd\xec\x64\x53\x50\x07\x19\x36\x0e\xe4\xb3\xb6\x7b\xde\x5e\xaf\x9b\xa9\x38\x9c\xbd\x5e\xd6\x08\xce\xa5\x27\xdc\xc8\x50\xb1\x1a\x7c\xf3\x54\x21\x79\x55\x40\x5e\x15\x1a\x68\x73\xbf\x63\xb7\x35\x58\x6c\x1d\x57\x36\x43\x28\x36\x9e\xbe\x7b\xbd\x2d\x3d\x63\xcb\x23\x38\x6a\x58\xe2\x58\x1e\xa7\xef\x45\x3f\xa0\xd0\x55\xd3\xaf\x91\xde\x65\x13\xd0\xd6\x25\x63\xda\xf0\xae\xa1\x86\x80\xcf\xdf\x66\x48\xd8\xeb\x62\xd6\xe6\x9b\x82\xcd\x7a\xec\xdb\x7d\xe1\x66\x6f\xb4\xf4\xe0\xb5\xf7\xdb\x5e\x6d\x97\xf4\xfa\x57\x98\xf3\x58\xbb\x4b\xff\xc4\x73\x0c\xbf\xbd\x16\x35\x81\xca\x8c\x07\x33\x7d\xca\xc8\x67\x8e\xca\x5f\xcd\x68\x99\xdb\x5e\xb3\xe1\xbc\x18\x67\xa4\x69\xc5\x8c\x8b\x4f\x78\xf4\x03\xbb\x2b\x71\x04\x94\x8a\x9e\x00\xa6\xac\x29\x0e\xdf\xc9\xaa\xc6\x34\xaa\xa0\x9b\x17\x32\xec\xf9\x4b\x28\x2a\xde\x76\x5b\xf2\xd6\xeb\x60\x9e\x55\xe0\x39\x32\xc0\x34\x4a\x8b\xd9\x45\x49\xc5\x80\xb3\xe2\x3c\x69\xa5\xd8\xe5\x41\x61\x34\x44\x2b\x93\xa2\x18\x73\x72\x86\x9b\xbb\x95\xf8\xa3\xb9\x42\x51\x45\x98\xe4\x37\x8a\x24\xab\x4a\x18\x5c\xa6\xc5\x32\xcd\x03\xc7\xce\x42\xdc\xa0\x6d\x4d\x4f\x19\xaa\x13\x1a\x11\x65\x14\xdd\x51\x59\x69\x9e\x7a\x22\xec\x86\x5b\xb1\xf6\xb5\xe6\x1c\x42\x17\xcd\x37\x24\x6c\x36\x92\xff\x4d\x2a\xfe\xc3\xbe\x4d\xac\xfd\x97\xc1\x48\x5b\x2b\x72\x4e\xe4\x6f\xb5\x8a\x21\x6a\x01\x8a\xad\xdf\xf9\x5a\xdc\x58\x2d\x78\x69\x38\x06\x1b\x37\xbe\x1d\xa9\x4a\xdc\x47\xb1\x7b\x35\x69\x25\x34\x01\xab\x16\x17\x49\x0a\xc2\xac\xb5\x69\xdc\x28\xae\xc6\x65\x53\xd2\xa4\x23\xd2\x82\x5f\x7d\xdf\xe2\x7f\xdb\x3a\x53\x06\xcf\xec\x85\x5c\xb4\x71\xc0\xca\x85\x71\x18\x77\x1d\x78\x8e\x37\x40\x27\xfc\x78\x5d\xea\xad\x98\xf4\x71\x7f\x8a\xe2\x80\x08\xdf\xab\x37\xef\x60\x23\xfc\x37\x7b\x30\x53\x40\x31\x93\x87\xb1\xd7\xdb\xd8\x61\xe3\xb4\x5e\x33\x8f\x13\x28\x1d\xaa\x76\x51\xfc\x57\x9e\x64\xff\x5a\xd9\xc2\x53\x17\x66\x88\x83\x43\xdb\x94\x17\x7f\x86\x62\x57\x2d\xd5\x3d\x06\xe3\xe6\xc1\x32\xd0\x2f\x42\x16\x41\xb8\x54\x0f\x61\xb3\x09\x93\x28\x16\xf7\x86\x6c\x9f\xf2\xe5\x26\xe4\xa2\xe8\xa5\x0d\xd9\x0d\xda\xe9\x4f\x5f\x8c\x59\x74\xff\xe9\x5f\xc7\x90\x14\xb4\xd6\xfb\x76\x0c\x89\x97\xef\xef\x3e\x7f\xf6\xe0\xf1\xc3\x37\x2f\x4f\x5e\x3f\x7e\xfe\x2c\x40\xf8\x91\xaf\xd0\x83\xe7\x2f\x5f\x3e\x7f\xfe\xfa\xfd\xc3\x37\x27\x2f\xef\x05\x08\x7f\xa6\xc9\x24\x8b\x7e\x25\x78\xc5\x47\x92\xcd\x49\xfc\x88\xe1\x65\x45\xee\xf2\x0b\x36\xfe\xcc\x6a\x93\x71\x49\x79\x86\x7c\x2c\xb7\x3c\xf0\x08\xaf\x75\xb8\xe2\xf7\x5f\x89\x67\x8a\x2a\x9c\xc3\x18\x2e\x69\x28\x38\x06\x56\xd9\x25\x0b\x73\x13\x25\xa1\xec\xf5\xc2\xb9\xd7\x17\x75\x89\xf0\x0c\x32\x3d\x8e\xa8\x67\x4d\xd7\x2a\xcc\x31\x4d\x01\x97\xfa\x8e\xeb\x6d\x37\x1f\x61\xb6\x51\xff\x05\xea\x6e\xf4\xd0\xbd\xb9\x1e\x02\xce\x68\xcb\x09\xa6\xf0\xee\xef\xf1\x95\xed\x2d\xcd\x1b\xd9\x68\x6e\x0c\x4d\x6d\x76\xaa\xbd\xa5\xa6\x90\x19\xf8\xbc\xe5\x41\x9b\x1b\x7c\x6b\x6f\xaa\xc3\x5b\xf3\x99\x4b\x12\x8f\x1b\x6f\x4f\x49\x50\x60\x9b\x23\x5c\x45\x02\x81\xbe\xa6\xe9\x2c\x2b\xce\x7b\xbd\xb9\xff\x4a\x01\xd3\x03\x4c\x47\xc6\x3c\x40\xe9\x8a\x9c\xd3\x72\xb9\x70\x8c\x04\xd6\x6b\x12\xcd\xd2\x3c\x0f\x65\x11\xfc\x41\x08\x45\x3a\x70\xdc\x41\x77\x24\xb2\x48\x47\x60\xd1\xd4\x1f\x10\x56\x2d\xe6\xe5\x79\x68\xab\x5a\x34\x72\x84\xb5\xb9\x90\x61\x3a\x83\xb8\x5f\xcc\x1d\xe9\xe5\x7a\x4d\x9d\x71\xa0\x1a\xe1\x79\x8d\xe7\x64\x51\xc5\x93\x47\x0c\xcf\x28\x86\xc3\x07\x24\x32\x06\x12\x1a\x03\xed\x8c\x73\x8a\xdf\x53\x3c\x11\xc1\x6c\x6a\x2c\x0e\xf2\x83\xec\xd7\xa9\x2f\x6d\x5a\xf3\x96\xf4\x41\xfd\x99\xf9\x0f\x6a\x33\x52\x8d\xa5\xf2\xad\xc6\x74\x49\xa7\xd6\x89\x17\x03\xd2\xd8\xa0\x88\xee\x9f\xbc\xad\xf1\x2b\x8a\x4f\x28\x16\xa3\xf0\xb0\x14\x3a\x24\x34\x8f\x13\xb0\x47\x0c\x85\x2d\xab\xc5\x68\xe0\x0f\x0e\xd3\xcd\x7b\x40\x2c\xe0\x03\x35\x5e\x39\xc0\x10\x77\x07\x75\x3d\x35\x52\x98\xa7\x34\x74\x9c\x9a\x16\xd1\x8b\x5f\xde\x85\x81\xd8\xdc\x00\x5f\x52\x04\x1c\x8c\x27\xd7\x3c\x13\xd0\xaa\xe6\x17\x57\x36\xeb\x9c\x95\x14\xf4\x74\xad\x30\x0f\x2b\x65\xc8\x1f\x83\x05\x1e\x1f\x21\xad\xe2\xc9\x67\x8a\x1f\x43\x70\x35\x83\x28\x1d\x7c\x78\x9f\xca\x25\x9c\x5c\x52\xb3\x35\xf2\x17\x5b\xf4\xa7\xd3\x0d\x33\xa6\x10\x2b\xc9\xe4\x65\xd1\xab\x5b\x76\xc3\xef\x54\xc3\x59\x94\x7f\xc6\x13\xd9\xe0\xf7\x34\xcc\x22\xb8\x64\x0c\x64\xbc\x77\x36\xef\xad\x33\xbc\x2f\x54\xef\x30\xe6\x37\x52\xa3\xf0\x5d\x28\x7c\xff\x4b\x56\x31\xbe\xec\xa0\x56\xd3\x7e\xcc\x8e\x7d\x89\xf1\x09\x75\x40\xe6\xc5\x2f\xef\xf0\xe5\x32\x67\x59\xdc\xed\xdb\x23\x78\x4a\x6b\x3c\x79\x4d\xed\xa2\xd9\x62\xe0\x2d\xfa\x5c\x0d\xf6\xb5\x33\xc8\x17\xce\x8c\x3e\xfa\x0b\x15\x11\x3b\x75\x1a\xd5\x93\x7a\x41\xeb\xe9\xb4\xb6\x76\x5e\xf8\x79\x22\xd7\x6c\x3c\xec\xfa\xf4\x9b\xe5\x9a\x8f\x28\x3e\x52\xd7\xff\x25\xff\x6d\x5d\xfe\x97\xe5\x3c\x29\xa2\xf2\xe4\x7b\xc5\xcf\xe4\xd7\xbc\xcc\xcb\x8a\xdf\x92\x22\x9a\xfd\xf0\x0a\x82\xb7\x36\xa4\x91\x5f\x9a\xa1\x49\x14\x8d\xf7\xfc\xec\xac\x12\x51\x7e\x2b\xc2\xc4\x47\xe8\xe6\x09\x88\x79\xab\x1a\x30\x71\x4c\xde\xd9\x2f\x68\xdd\xec\xb2\x22\x8f\xd2\xea\x62\xcc\x2b\x65\xd1\xbd\x52\x44\x13\x15\x5f\xa7\x7d\xc1\x6b\xd4\x4d\xdc\xb7\x85\xa4\xe0\xbc\x85\xbf\x4c\x75\xf6\x63\x2b\x7b\x62\x6d\xd8\x9c\x3c\x74\x76\x4c\x9c\x0b\x9b\xf4\xc8\xa9\xb7\xc0\x14\x4e\xfb\xeb\xad\xa7\x5d\xd2\x95\x9a\x33\xa9\x39\x95\x99\x6d\x42\xad\x0c\x8a\xe6\x4a\xfe\xa8\x53\x28\xb8\x01\x7a\x7e\xe6\x38\x86\xb8\x57\x16\x44\x47\xf8\xa8\xd3\xc5\xe2\xb1\x30\xd7\xcc\xbe\x12\xda\x78\x25\x39\x0c\xc0\x2c\x7a\xfb\x1e\x37\xf5\xf4\x04\x46\x8c\xd8\x05\x29\xc4\x3c\xb4\xaa\xa2\x1a\xcc\x75\x1a\x7e\x22\x60\xd0\xc8\xf6\xe1\xa1\x34\xf8\x48\x72\x87\x25\x04\x61\xea\x61\x47\x72\xf4\x91\x79\xd2\xdf\xeb\x60\xaa\xe6\x0d\x02\x7e\xc0\x5a\x46\xa9\xe3\x90\x5e\x63\x90\xca\xf8\x20\xdd\x57\x99\xa7\x9d\xf5\x5a\x15\xf8\x3e\x2f\x67\x1f\x85\x4d\xc9\xa6\x0e\x37\x79\xeb\x48\x34\xa7\xd6\xdd\xdc\xb1\x7b\xf7\xc4\xa1\x17\x00\xfa\x62\xa8\xd7\x6c\x3a\xc2\xb4\x3d\x28\x50\xe9\x81\xca\xa4\x46\xf5\x69\x59\xb2\x8a\xd1\x74\xa1\x57\xa1\xe9\x99\xbf\xb9\xd8\xde\xcd\x79\xb5\x61\x73\xde\x52\x84\xd3\x0d\x9b\x99\x7b\x79\xce\x5f\x87\x0f\xd0\x88\x41\xa0\x7f\x2d\xc3\xaa\xc0\xe0\x28\x0c\xd5\xb2\x3f\x2b\x0b\x7b\xe5\x89\x6f\x8b\xac\x68\x92\xad\x5c\xd4\xeb\xa5\xbe\x85\xc1\x12\x3e\x6c\xf6\x3c\x16\xfb\x1a\x22\x9c\x46\x1b\x0c\xc2\xad\x91\xf2\x6f\x30\x33\xb9\x66\x67\xa4\x86\xb3\x15\x04\x65\x63\x49\x63\xe9\xe7\x7d\x82\x5a\x38\xa0\xff\xed\xda\x2c\x5f\xab\xdd\xbf\x44\xf1\xe4\xb9\x1b\x5f\xd1\xc5\x35\xd1\x29\x44\xdb\xb4\x50\xf0\x47\xb7\x78\x0b\x18\x75\x0d\x01\x91\x2f\xdc\x37\xa2\x20\x92\xad\x0e\x02\x54\xe3\xdd\xfe\xd1\xee\x30\x6e\x5a\xf6\x04\xcb\x8a\x74\x2a\x46\xb3\x19\x0b\x46\x34\x9a\x87\x04\xaf\x7e\x3c\x38\x31\xe5\xf4\x28\x7e\x2e\x6b\x4c\x0f\xae\x3c\x39\x69\x5a\xe3\x67\xf9\x8f\xbe\x3a\x45\x8d\xdf\xfc\xb0\xef\xc9\xc9\xd3\x1a\xbf\x7e\x7c\xe9\xc9\x79\x53\xd5\xf8\xee\xd5\xcf\x9e\x9c\x5b\x55\x8d\x1f\x1f\x7f\xf5\xe4\xfc\x5e\xd5\xf8\xc7\x1f\xef\x7a\x72\xaa\xbc\xc6\xbf\xbe\xdf\xf3\xe4\x94\x79\x8d\x5f\xdc\xbf\xf0\x8d\x2d\xaf\xf1\xdb\xdf\x7d\x6b\xf0\x5b\x5a\xe3\xbb\x4f\x0f\x3c\x39\x0f\xd3\x1a\x5f\x55\xa5\x27\xe7\x41\x5e\xe3\xf7\x7b\x4f\x7d\x75\xf2\x1a\xff\xbc\x3f\xf0\xe4\x7c\xcd\x6b\xfc\xfb\xa7\x27\x9e\x9c\x17\x45\x8d\x59\xea\x5b\xb7\x4f\xbc\xce\xc7\x63\x4f\x0e\xcd\x6b\x7c\xef\xf4\xad\x27\xe7\x2a\xaf\x71\xf1\xfb\xaf\x9e\x9c\xd3\xbc\xc6\x5f\x5e\xbe\xf0\x8d\x20\xaf\xf1\xc3\x7d\xdf\x9e\x7e\xcc\x6b\xfc\xf4\xdc\x0b\x07\x69\x8d\x67\x77\x7d\x23\xf8\xad\xa8\xf1\xd3\x17\xa7\x9e\x9c\xfb\x69\x8d\xbf\x2c\x7c\xfd\x3c\x28\x6a\xfc\x53\xf9\xd8\x93\xf3\x4b\x55\xe3\xdf\x4f\x9e\x79\x72\x1e\x95\x35\x7e\xfb\x24\xf3\xe4\x7c\x2e\x6b\xfc\xe3\xef\xcf\x3d\x39\x3f\xe6\x35\x3e\xbf\xfc\xc5\x93\xf3\x53\x5e\xe3\xb4\xf2\xf5\x43\xaa\x1a\xdf\x3b\xf9\xdd\xb7\x0b\x55\x8d\xef\x93\x9f\x3c\x39\xac\xaa\x71\xc9\x7c\x10\x9f\x57\x35\x9e\xbf\xfe\xe4\x3b\x73\x55\x8d\x9f\x0f\x1e\x7a\x72\xbe\x54\x35\xfe\xe1\x6a\xee\xc9\x79\x57\xd5\xf8\x05\xbb\xef\xc9\x79\x5a\xd5\xf8\xe7\x5d\x5f\x9d\x27\x55\x8d\x4f\xdf\xfb\x4e\xfd\x79\x5a\xe3\x17\x0b\xdf\xce\x5d\xf2\xb3\x9d\xf9\x4e\xd6\x22\xad\xf1\xab\x3d\x5f\x6b\x9f\xca\x1a\xbf\xf9\xe8\x3b\x73\xcb\xb2\xc6\x8f\x7f\xbf\xe5\xeb\xa7\xac\xf1\xf9\x8f\x3e\x38\x38\x2d\x6b\xfc\xcb\x7d\x1f\xec\xcc\xaa\x1a\x3f\x39\xf1\xc1\x75\x59\xd5\xf8\x3c\x5d\xf8\x60\xb4\xac\xf1\x49\xee\xab\xf3\x95\xf7\x33\xf4\x9d\xd3\xef\xcb\x1a\xbf\x78\xee\x1b\xf5\x9b\xb2\xc6\xe4\x68\xe8\xc3\x07\x65\x8d\x7f\xb8\xfc\xcd\xb7\x73\x65\x8d\xbf\xde\x7b\xe0\xc9\x79\x5d\xd6\xf8\xf4\xa9\x0f\x42\x9e\xf3\x3a\xcb\x7b\x3e\x18\x2d\x6b\xfc\x53\x75\xe8\x83\xb7\xb2\xc6\xcf\xbe\xfa\x46\xfd\xa8\xaa\xf1\xbb\xfd\xdc\x87\x43\xf8\xd9\x9e\xf9\xe6\xf3\x29\xad\xf1\xdc\x57\x25\x2d\xeb\x5a\x84\x04\xcf\x12\x1a\x0e\xfa\x07\xbb\xc7\x08\x17\x09\x0d\x77\x8f\xf6\x8f\x76\x95\x4a\x46\xda\x7e\xef\xc3\xc5\x7e\x56\x28\xea\xdf\x96\x95\x57\x09\xa9\x1d\x96\xaf\x2b\xc0\x77\x8a\x0a\x3b\xcd\xe7\x82\x3e\x47\xa3\x9d\x81\xf0\xdf\xec\x29\x58\x2d\xc0\x01\x33\xc3\x03\x64\x45\x9a\xcc\x1b\x01\x85\xbb\xbc\x76\xcb\x38\x9b\xf5\x7a\x60\x42\xc7\x26\xc1\xff\xfd\xbf\xaa\x6e\x9a\x7f\x07\xfa\xcd\x17\x65\x3e\x27\x34\x98\x9a\x46\x6d\x03\x36\x13\x60\x3a\x34\x8f\x43\xf0\x51\x4e\xcf\x97\xb6\xa5\xec\x7a\x9d\x87\x14\x8d\x49\xcc\x64\x2c\x18\x3e\x07\xac\x4b\xa1\xba\xe6\xab\x5c\x26\x95\xcf\x5f\xaf\xe0\x7e\xb1\xda\x22\x53\x66\x21\x4b\x3e\x67\xc5\xbc\xfc\xac\x95\x1c\x4b\x4e\x66\x68\x03\x24\xbc\x30\x85\xcf\x42\x96\x74\xfb\x52\x6d\x6f\xbd\xee\x5a\x9a\x6a\xf3\x72\x06\x23\xe8\xf5\xd4\x2f\x61\xd9\xff\x4a\x2a\xfa\x84\xc1\xa4\x38\xdf\xf9\x44\x68\x95\x95\xc5\x34\x40\xa3\x79\xc2\xc6\x41\x70\x1b\x54\x5f\x4e\x18\xa3\xd9\xe9\x92\x91\x30\x30\x85\x02\x24\x3d\xe5\x29\x52\x6e\x6e\x96\xee\x5c\x0e\x44\xf2\x16\x71\xa6\x75\x33\x7a\xbd\xf9\x7a\x1d\x2e\x13\x63\x4d\x60\x58\x7e\x86\x03\x29\x67\xec\xf7\x4f\x92\x8a\xf0\x7e\x1b\xcc\x19\xe4\xe8\x36\x59\x23\x00\x1d\xbb\x34\x23\xbd\xdc\x32\xd2\x8b\xf5\x3a\xbc\xb0\x0d\x1f\xfe\xf0\x50\xef\xde\x7b\xb5\x61\x98\xef\x81\x7a\xde\x30\x4a\x35\x87\xb1\x68\x9c\x37\x23\x2b\xa8\xac\x78\xe3\x2e\xce\x53\x96\xee\x40\x59\x5a\x96\x6c\x8a\x3b\x56\x4a\x36\x9f\x06\x68\x1c\x2c\x8b\x8f\x45\xf9\xb9\xe8\xa8\x8d\x54\x1e\x0f\xf1\x85\x59\x97\x4f\x0d\x50\x5a\xb4\x41\xc9\xed\xfa\x24\xcf\xc3\xe0\xbf\x03\xe9\x3e\x61\xa4\x4c\x85\x69\xd2\x1f\x51\x63\x2a\x4c\x6f\xdf\x46\xfc\x19\x3e\xa1\xd3\xe8\xfd\xfb\x4f\x4b\xf2\xfe\x3d\x58\xcc\x4e\xe8\x54\x78\x97\xa8\x17\x09\xd9\x38\x42\x05\x69\x0b\x33\xce\xab\x46\x94\x74\x38\xcb\xe1\x77\x93\x93\x9d\x77\xd3\xef\x20\xfe\x4d\xb0\xc3\xa1\x98\x95\x4f\xca\xcf\x84\xde\x4d\x2b\x78\x9e\xe8\xfa\xa7\x4e\xfd\xd9\x45\x4a\x4f\x58\xd8\x47\x11\x2b\xdf\x2c\x16\xaa\xfc\x6d\x26\xfd\xbe\x0f\x14\x7d\x7f\x57\x04\x4d\x06\x5e\xad\x1b\x19\x59\x31\x19\xaa\xe5\x62\x51\x52\x56\x25\xab\xdf\xaa\xb8\xdb\xc7\x67\x39\xf9\xf2\x30\x5d\xc4\x27\x21\xaa\x71\x57\xaf\xe1\x69\x39\xbf\x8a\x2e\xd2\xca\x3a\x62\xb3\x79\xb5\xa3\x6a\x07\x68\xbd\x0e\x8a\x72\xe7\xb7\x8a\x3f\x1f\xdd\x5a\xee\xc1\x74\x6b\x99\xdd\xba\x0a\x1d\xe3\x5b\x7b\x68\xc8\xf2\x69\x41\x50\x72\xe7\xc3\xad\x15\xab\x95\xe3\x3f\x55\x68\x42\xa6\x63\x12\xf3\x31\x04\xb7\x49\xfd\x01\x07\x01\x42\x11\xa3\xd9\x65\x88\x46\xee\x78\xaa\xcd\xe3\xc1\x0c\xd5\x75\x6d\x10\xd5\x49\xe8\x01\x27\xa1\x80\x70\x3f\x27\xfc\x2b\x0c\xe6\xd9\xa7\x00\x8d\x58\x54\xb1\xab\x9c\x80\x79\x69\x9e\x5e\x25\x01\x5f\xc7\x00\xab\x64\xfe\x75\x4f\xb8\xd3\x16\xd1\x4a\xf3\xe5\x65\x61\xb2\x69\xf9\xf9\x61\xba\x48\x82\xc1\x02\xea\xa4\x8b\x05\x29\x84\x16\x54\xb8\xb5\x5b\xf4\xc7\x0a\xbb\xeb\x60\x57\x64\x48\x73\x8f\x84\x17\x12\xc1\x32\x7c\x44\xb2\xf3\x0b\x66\xc5\x10\x04\x2d\xc3\x67\xe5\x9c\x48\x97\x29\xaa\x36\x26\x06\x54\x5f\x89\x2b\x57\xba\x85\x61\xc2\x2d\x0c\x47\x26\x0d\x43\x7d\x2b\xae\xb2\xff\x0a\x02\xc7\x2f\x9d\x41\xab\x22\xbb\x61\xcd\x61\xbb\xa6\x13\xcd\x79\x5b\xdd\x5d\x5f\x5d\xcb\x33\xf4\xf6\xda\x7b\xfe\xda\x56\x48\xb6\xed\xf5\xf7\x37\xd5\x37\x41\xc7\xae\x69\xe1\x60\x73\x0b\x38\xbf\x61\x1b\x87\xdb\xda\xc0\xd5\x0d\x5b\x39\xda\xde\x0a\x2e\x6f\xd8\xce\xf1\x75\xed\xe0\xd9\x4d\x21\xaa\x0d\x8b\xad\xa6\xf0\xfc\xfa\xc6\x94\x83\xa1\x96\x0a\xfb\x83\x8c\x56\xac\xa3\x8a\x76\x58\xd9\x79\x9f\xd2\x8c\x5d\x75\x2e\x97\x15\xeb\x9c\x92\x4e\xda\x29\xca\x62\xa7\x20\xe7\x20\x56\xed\x64\x05\x23\xe7\x84\x76\x8a\xb2\x73\x0e\x07\x97\x76\xd8\x45\x5a\x74\x18\x29\x02\x9b\x7c\x7c\xbb\x81\xd2\xe3\x70\xa9\xbc\x30\x35\xe8\xbc\xe6\xe9\x23\x8d\x43\x25\xa9\x40\x8b\xcc\xb3\x54\x1a\x43\x8a\x09\xaa\x91\x9e\xa8\x55\xa7\xd7\xcb\xc3\x8c\xd7\x84\x06\x36\x54\x07\x97\x38\x28\x86\x92\x5b\x7b\x88\x19\x4c\xa2\xb6\xe6\xfa\xbe\x21\xe1\xb0\xd0\x06\xbf\xb3\xc5\x1b\x60\x32\xc5\x45\xd2\xc7\x29\x44\x10\xeb\x8f\xaa\x7f\x12\x4d\xde\x16\xff\x6c\x2e\xc5\x48\x50\x4f\xa5\x55\xac\xd7\x0b\xbb\x79\x48\x26\xd5\x14\xad\xd7\xc5\x9d\x16\x95\x8c\xc6\x65\xc2\x73\xe3\xb0\x34\x79\x93\x62\x8a\x8b\xdb\xc9\x00\xe1\x6c\x52\x4d\x93\x12\xe7\x61\x89\xd6\xeb\x30\xdd\xe1\x69\xd5\xed\x64\xa0\xa3\x4a\xfc\x33\xe9\x8f\xa9\x0d\x3e\x19\x8a\x5f\x85\x29\x7e\x0f\xca\xff\x14\x49\x32\xfb\x51\xf2\xd6\x1f\x70\x06\x70\xf1\xb8\x0a\x09\xaf\xc6\xa0\xda\x64\x0a\xaa\x33\x08\x7f\x4e\x9e\x81\x7b\x1a\x08\x25\x0d\xf0\xb3\x5e\xfb\x64\xbd\xff\xfc\x27\xbc\x25\xac\x5b\xed\xa9\x25\xa5\x99\x88\xc7\x47\x47\x48\xba\xa7\xfc\xf6\x96\xf7\xf0\x82\x96\xac\xe4\x2f\x12\x2d\x07\x17\xa2\x6c\x86\x60\xcc\x4f\x5a\x63\x06\x63\xe4\x84\xfd\xb3\x3f\x56\xcb\x7b\x9b\xc5\xfa\xf2\x78\x1a\x12\x34\x26\x8a\x72\xa1\x28\x26\x13\x3a\xad\x11\xfe\xb2\x69\xee\xc2\xf9\x5b\xd3\xad\x8b\xb4\x78\x06\x1f\x8c\xfd\x51\x61\x28\x36\xa0\x68\x04\xb9\x9b\x49\x79\xc9\x28\x4b\x3e\x87\x34\x61\x93\x62\x8a\xc6\x4f\x00\xc2\xe2\x6c\x42\xc5\xee\xa9\x3d\xca\xc0\x5d\xf5\xbb\x4d\xa3\xf8\x12\x4e\x18\x5f\xf1\x49\x7f\xaa\xbd\x1f\xdc\x4f\x1e\x85\x43\x2c\x89\x11\x6d\xe3\xff\x4e\xb8\x03\xc6\x8f\x93\xfb\xe1\x6a\xf3\xc3\x2d\xee\xf6\x6b\x2c\x89\x71\xf9\x5e\x7d\xbd\x92\x32\xc9\xbc\x3c\x0f\xa3\x28\x62\x68\xf5\x31\x44\xbd\xde\x73\xfe\xc7\x56\x3c\x80\x3c\x25\xc0\x04\x0f\x19\x9b\x4a\x9b\x4c\x55\x1c\xf4\x5e\x36\x96\xb7\x72\xad\x33\xf8\xdc\x58\xac\x3d\x0e\x27\xc1\x6f\x69\x75\x99\x15\x24\x98\xda\xfc\x66\x53\xc4\x7a\x04\x90\xe2\x53\x46\xcb\x02\x68\x8d\x05\x2d\xe7\x4b\x28\x6c\x6a\xbd\xe0\x74\x15\xef\x3f\x34\x95\x12\xf3\x73\xbd\x5e\xbd\x57\x0f\x88\xc9\x14\x8b\x27\x45\xbc\x52\x49\x92\xc8\xc6\xef\x15\xdd\x16\xdf\xd5\x64\x20\x7e\x9f\x55\xa0\xd6\xf0\x82\x96\x5f\x32\x32\x8f\xbb\x03\xfc\x5e\x78\x86\x5c\x9d\x95\xb3\x65\xf5\x9a\xa6\x8b\xc7\x8c\x5c\x42\xc0\xe8\x6c\x70\x54\xbc\x24\xe7\x59\xc5\xe8\x55\xbc\xaa\x31\x11\x04\x93\x9d\x94\xcd\x4a\xa7\xc8\x65\xc9\x32\x27\xa5\xc6\xd6\x6c\xe3\x95\x99\x6e\xdc\x1d\xd4\xf8\x9c\xb0\x7b\x84\xa5\x59\x5e\xc5\xcf\x70\x5e\x9e\xab\x8f\x97\x35\xb6\x30\x9a\x88\x12\xad\x28\xb0\x60\x3f\x3a\x8a\xf6\x82\x91\xfd\xaa\x92\x73\xd7\x0c\x08\x82\xfe\xd9\x77\x96\xcf\x14\x01\xd5\x77\x62\x74\x54\x36\xbd\x84\xc2\x80\x93\x81\x81\x1b\x73\x7a\xbd\x66\x1e\x02\x59\xbd\x6f\xb0\xaf\xbf\xdf\xca\xac\x08\x83\x4e\x80\x10\xf2\xe6\x8b\x03\x7a\x67\xd0\xeb\xbd\x16\x70\x19\xbc\x5c\x16\x45\x56\x9c\x77\x2e\x4b\x4a\xc4\x4d\x57\x16\x44\x3d\xa2\x3a\xe5\x59\xe7\x6e\x2e\xee\xcb\x59\x5a\x74\x66\xe9\xb2\x22\x9d\x65\x41\xbe\x2c\x20\xc0\x7f\x27\xab\xaa\x25\xa9\xa2\xce\x8b\x9c\xf0\xab\x8c\x14\xd5\x92\x92\x4e\x59\xe4\x57\x4e\x33\x59\xd5\x11\xda\xf0\x51\x80\xea\xd0\x1d\x9a\x0b\x23\xeb\x75\xb8\x39\x33\xe9\xf6\x9d\xaa\xc2\xed\xaa\x14\xb1\x7e\xb9\x0a\x5b\x79\x78\x55\x11\x16\x6b\x27\xee\xda\x6b\xd0\xea\x23\xb9\x8a\x09\x84\x93\x8e\x5b\x95\x26\x64\xaa\x7c\x67\xc4\x54\x7b\xde\x63\x13\x32\x4d\xa8\x21\xdb\xf9\xe3\x22\x65\xb3\x0b\xa3\x88\x79\x77\x59\x31\xe5\x9e\x35\xb8\x7b\xef\xd5\xfb\x57\xaf\x4f\x5e\xdf\x7f\xff\xe6\xc5\xbd\x93\xd7\xf7\x03\xbc\x9a\x03\xb8\xc5\x59\x8d\x10\x06\xb7\xec\xf6\x9b\xf2\x99\x3e\xbb\xea\x68\x55\xb1\x67\x03\x1d\xf8\xf6\x1f\x72\xbc\xac\x08\x3d\x39\x07\xd7\x90\x42\xfa\x57\x82\xea\x80\x48\xc3\xfa\x9c\x3a\xf3\x56\x27\x56\xf2\x49\xde\xca\xd3\x7d\x16\x76\x07\x48\x25\xfe\xf0\x4a\x25\x9f\x43\x32\x60\x02\x95\x74\x09\x49\x9f\x96\x44\x25\x7c\x82\x04\x71\xda\x5f\x9d\x85\xef\xcb\x70\x55\xb7\x37\x0f\xe1\x95\x73\xa8\xed\x77\x67\xab\x70\x64\x17\x45\xcd\xd3\xbf\xbd\xaa\x5b\x18\x61\x8d\x7f\x6e\x58\xdf\xc5\x57\x2a\x68\x1b\xb3\xd2\xe7\xa0\xc3\x6b\x76\xf4\x65\x88\x56\xaf\xe1\xaa\xf8\xe1\xd5\xf3\x67\x91\xf0\x9a\x98\x9d\x5d\x85\xcf\x42\x81\x0f\xf0\x10\x29\xd6\xc0\xbd\x8d\xac\x01\x0f\x8b\x74\x32\xad\x2d\x6d\x3c\xe4\x84\x0b\x49\x43\x1f\x57\xb5\xe1\xf4\xcd\x61\x8e\x2a\x0c\x45\x6a\x69\x2c\xea\xe9\x52\xfb\x70\x24\xc9\x1d\x12\x9d\x15\xe0\x1a\x86\x95\x00\xea\xcf\x4f\x2b\x42\x3f\xa5\xa7\x39\x71\x95\x2d\xea\x7a\x74\x2f\xca\xa5\xa4\xd3\x60\xbd\x74\x3e\x87\x6a\x5a\x20\xef\x39\x29\x2c\xb9\x73\x4f\xda\x3d\x46\xe2\xd0\x20\x75\x3d\x3f\x50\xd7\xf3\x39\x61\x9d\x4a\xf8\x1e\xd2\x32\xad\x06\x62\x81\xec\xda\x94\x17\x81\xbd\x0d\x35\xf6\x40\x38\x9e\x99\xb0\xa9\x2a\x54\xe9\x42\x9c\xea\x30\xf9\x89\x6e\x86\x6f\xe7\x86\x6d\x95\xc5\xcd\xd6\xd6\x32\x45\xa8\x5a\x56\xc9\xbd\xc8\xb3\x64\xf2\xa2\xf9\x2d\x99\x28\x06\x56\x20\x1c\x74\x66\x05\x89\xff\xf1\xcf\x59\x46\x67\x39\x11\x90\x91\x00\xfa\xe7\xef\x13\x5a\xa4\xf9\xce\xbc\x64\x3b\xbb\x41\x67\xf6\x25\x09\x76\x07\xd1\x20\xe8\xcc\xae\x92\x60\x70\x14\x74\x68\x12\x0c\xa3\xe3\xe0\xbb\x3b\xd7\xd5\x1e\x8a\xda\xbc\xce\x1f\xae\x3b\x10\x75\xf7\xa2\x63\x4f\xe5\x7f\xd4\x53\xb9\x5f\x0f\xed\xfd\xa2\xf2\xa8\x99\x2d\xe3\x58\x41\x4e\x3b\xfe\x6d\x32\x98\xd6\x58\xae\x99\x7b\xd4\xd5\xea\xa7\xf3\xf9\x63\xbe\x5e\x92\x74\xf2\x95\x4d\xde\x97\x12\xd7\x78\x5b\xc2\xf2\x94\x9f\xd1\xf2\xf2\x7e\xc1\x68\x06\x56\x58\x32\x04\x22\x27\x2f\x51\x72\xa7\xfb\x30\x52\x23\xe5\x09\xc8\xee\xfe\x24\xcf\xd2\x8a\xa8\x01\x98\x38\x8d\x6e\x0b\x6e\x03\xd1\x59\x9e\xb2\xa7\xe9\x82\xe7\x62\xc2\xf3\x89\x0a\xb0\x38\x21\xd8\x29\x3b\x45\x68\xf4\x17\xcd\x8a\x98\x71\x9f\x13\xc6\x97\xed\x59\x7a\x49\x1e\xd0\xf2\xf2\xd5\x45\xba\xb0\xcf\x01\xe3\xf4\xb4\x44\x44\x5f\x93\x49\x90\x16\xe7\x39\x71\xa0\x10\x1c\x2e\xce\x93\xe0\xe9\xf0\x38\xda\x1f\xe2\xe1\x90\xff\x1d\x1c\xe1\x41\x3f\x3a\xc0\x07\xd1\xde\x91\x48\x4a\x07\xd1\x21\xe6\xff\xf5\xe1\x7f\xc3\x68\x6f\x1f\x0f\xa3\xdd\x83\x27\xbc\xe8\x7e\xb4\x77\x9c\x1f\x47\xfd\x23\x7c\x1c\xed\x1e\x7b\x8a\xee\xf0\xa2\xef\x04\xf4\xe0\xef\x93\x49\x40\xbe\xcc\xf2\xf4\x12\x54\x45\x76\x04\x34\xfa\x07\x35\x38\xc2\x07\x27\x83\x21\x1e\x0c\x71\x1f\x0f\x70\x1f\xef\xf6\x61\x70\x32\x85\xff\x8f\x17\x79\x77\xd9\xc7\xc3\xe1\xc9\xa0\x8f\x07\x90\x84\x07\x78\x78\x24\x66\x21\x52\x20\xed\x08\x0f\x8f\xf8\x20\x9c\xe6\x87\xfd\xa8\x7f\x98\x0e\xa2\x5d\xcc\xff\x83\x92\x3b\x83\x68\x97\xff\xf7\x69\xe7\xc0\xca\x80\x46\xa3\x03\xdc\xff\x74\x70\xe2\x14\xc7\xaa\x95\x77\xf6\xd9\xe2\x87\xef\x30\x3a\xde\x17\x47\x68\xb8\x1b\xf5\x87\x70\x8a\x06\xd1\x3e\x5f\x07\x5c\x95\x79\x36\xff\xa6\xa9\xee\x0c\xa2\xbd\x63\xcc\x87\xb6\x77\x8c\xe1\x8f\x18\xc6\x2e\x1f\x5a\x74\x74\xec\x64\x0c\xf0\x60\x67\x17\xf7\xdf\xc1\x54\xf7\xa3\x7d\xbe\x39\x43\x0c\x7f\xc4\x94\xf8\xcf\x1d\xfe\xe7\xc4\xce\x51\xd3\xda\x8f\xf6\xd5\xb6\xbd\x49\x26\xc1\xec\x82\xcc\x3e\xfe\x5b\x37\xec\x20\xda\xdd\xc3\xc3\xdd\xe8\x70\x2f\xdf\xd9\xdf\xd9\x4f\x07\xd0\x09\x94\x8e\xf6\xf8\xce\xed\x0d\xf2\xdd\x68\xff\x18\xc3\x9f\x83\xe8\xf0\x68\x87\xff\x69\x94\x83\x3f\xef\xfc\xfb\x00\x03\xb6\xa6\x00\xe3\x38\xb0\x66\x30\x10\x73\x7a\x77\xb9\xb3\x17\x1d\x1e\xee\x0c\xa3\x01\xec\x05\x6f\x53\xcc\x70\x67\xb8\x33\xcc\x79\xb7\x87\x7c\x00\x87\x4f\x06\xbb\x78\x70\xe8\x29\x85\x87\xf9\x3e\x3f\x47\xfc\x8f\x5a\xe5\x5b\xfc\x70\xe4\x79\xb6\xa8\xb2\x6a\xe7\xa2\xa4\xd9\xd7\xb2\x60\x69\xee\xbd\x38\x6e\x70\x3b\x5c\x7b\x05\x6c\xc6\xf3\x58\x76\xf8\x7d\x3a\x3f\x27\xf3\x7f\x59\xb7\xf5\x14\xff\x9e\x4c\x02\x71\xd9\xef\xcc\xf2\xb2\xda\x04\x69\xc7\xb0\x91\x47\xf9\x61\x34\x3c\xde\xe1\x7f\xf4\x26\xf7\x77\x34\x30\x00\x7e\x3a\xe0\xb0\x30\xe8\x47\x87\x03\x7c\xdc\x2e\x87\x45\x39\x51\xe8\x08\x4a\x70\xc0\xd7\xe5\xe0\x3f\x53\xee\x08\x43\xcf\xd0\x2d\x76\xbb\x35\x30\xa8\xb6\xf3\x67\xbe\x9d\x9c\x2e\xd8\x30\x87\x83\x68\x70\xc8\x3b\x3b\x3a\xe0\xe3\x3b\x1a\x70\x44\xe2\x05\xea\x27\xb2\xe8\x6e\x7e\x14\x1d\xec\xed\xf0\x3f\x9b\x60\xda\x02\xe5\x61\x34\xdc\xc7\x07\x8f\x86\xc7\x6f\x8f\x2e\x76\xdf\xee\xf6\x1f\xed\xbd\x3d\x7a\x74\xf8\xf6\xe0\xd1\x6e\x74\xb8\xcf\x0f\xfc\x11\x86\x3f\x12\x53\xe3\xc3\xe8\x68\xf0\x76\xb7\x1f\x0d\x8e\x5b\x99\xbc\x06\xde\x1d\x5e\x0c\x8f\xa2\x76\xcd\xdd\x3d\x0c\xb5\xde\xf2\x06\xda\xb9\x62\x18\x8d\x93\xcc\x0f\xba\xbd\x74\x3b\x83\xb7\xbb\x27\xe6\xfb\x18\xef\xbe\x3d\xb6\xbe\xa1\xbc\xdb\xc4\xf0\xc0\xd3\x84\xb5\xb9\x43\xdc\x77\x9a\x80\xf2\xd0\x04\x25\x33\xd6\xe1\x40\xba\x1b\x74\xae\x92\xe0\x20\xe8\x7c\xce\xe6\xec\x22\x09\x06\xfd\xa0\x73\x01\xc2\x98\x24\x18\xda\xa7\xe0\x24\x27\x94\x11\x17\x61\xff\xf9\x19\x98\x3d\xcf\xf7\xa3\xdd\x03\xcc\xff\x3c\x19\x1e\x44\xc3\x21\xbf\x54\x8f\x06\x56\xeb\xd1\x70\x77\x27\xda\x1b\x3c\x1a\xee\x46\x47\x06\x18\x76\x76\xa3\xe3\x3d\xf8\xe3\x03\x6a\xd1\x59\x99\x5f\x9d\x97\x45\x67\x51\x66\x05\xab\x92\x60\x38\x88\x86\xc7\x9d\x83\xce\x60\x57\xfc\x39\xea\x0c\xfb\xd1\x60\x8f\xff\x2b\x72\x5c\x10\xda\x8d\x0e\xc4\x0d\xff\x68\x77\xf8\xaf\x80\xa0\xc1\x7e\xb4\x7b\xf4\xce\x8b\x80\xbe\x61\xd9\x76\x3c\x07\xe8\x26\x6b\xf6\x17\xee\xf1\xee\x10\x0f\x76\xa3\xe1\xbf\x66\xf1\x86\xd1\xee\xde\xc9\x21\xbf\x54\xe0\x8f\xbc\xae\xe4\x08\x1a\xa7\x67\x18\x71\xdc\x30\xd8\x7d\x7b\x74\x71\x1c\x1d\x1e\xf1\x6a\x1c\xa1\x69\x7a\x42\x14\xd8\x70\x4b\xfe\x5b\x8f\x6f\x13\xc1\x5d\xec\xec\xbd\x3d\x4e\x87\xd1\x10\xf3\xff\x44\x5b\x7b\xfc\x9e\x7d\x7b\xf0\x68\x30\x8c\x86\x6f\x8f\x4f\x9c\x4c\xbe\xd0\xf8\xf8\x2d\xaf\xf7\x2f\x47\x82\x4f\x87\xfb\xd1\xf1\x1e\xdc\x49\x47\xf9\xce\x71\x74\x70\x88\xf9\x9f\x27\x03\x00\xe8\x63\x3e\xa0\xdd\x03\x0c\x7f\x24\x6e\x1f\x46\xc7\x78\x70\x9c\xef\x46\xbb\x47\x98\xff\x79\x32\xdc\xc3\x83\xbd\xe8\x00\x88\x53\x5d\x54\xd0\x72\xc7\xbb\xf0\xc7\xda\xb4\xbf\x07\x71\x59\x68\x61\x78\x10\xed\xf2\x91\x70\xd2\x66\x77\x4f\x36\x28\x06\x36\xf8\xc6\x19\xe2\xc3\x9d\xc3\x8b\x9d\xc1\x09\x74\x02\x7f\x64\xc1\x63\x7c\x1c\x1d\x1d\x3f\x01\x44\x85\xff\x2d\x7b\x6b\xa1\x27\x58\x5e\x1f\x72\xfa\xf3\xab\xdb\xe7\x07\x76\xff\xe4\x30\xe2\xe7\x78\xdf\x39\x8f\xff\x96\x49\xfb\xd1\x8a\x18\x25\xd0\xc1\xfd\x03\xbc\x1b\xf5\x8f\xfe\x56\x78\xae\xa7\xf8\x57\xfe\x06\x49\x73\x52\xcc\x53\xea\xa7\xa8\xfe\x03\x49\x1e\x45\x6c\x1c\x01\xad\x31\xd8\xd3\xc4\xc6\xd0\xa5\x35\x0c\x55\xb2\x77\xd3\x92\xc3\xfe\x8d\x4b\x1e\xdc\xb4\xa4\x1c\xe6\xf1\x8d\x87\x79\x7d\x49\x35\xcc\x1b\x94\x3c\xb8\x69\x49\x31\xcc\xe1\xf6\xf9\x04\xd6\x38\xaf\x29\x6a\x8d\xf3\x26\x25\x0f\xae\x2b\xf9\x9f\x71\x53\xfe\x25\x84\xee\xbf\x8f\x06\xfc\x3b\xcf\xce\xff\x97\xe0\xfc\xff\xbf\xc1\xfc\x1b\x1e\x28\x5b\x1e\x07\xff\x61\xf4\xf6\xff\x62\xff\xff\x3d\x15\x7f\x0e\xf9\xff\xa9\x77\xda\x86\x17\xd2\xe0\x3f\xf9\x85\x34\xe0\x37\xd8\xa3\xa3\xb7\xc3\xbd\x8b\xe1\xbb\xcb\xfe\xce\xfe\xa3\xa3\xb7\x83\x63\xeb\x37\xa4\xf3\x3b\xee\xd1\x60\xcf\x2a\x35\xd8\xb3\x8a\xf1\x0f\x53\x6e\xd8\xb7\xca\x0d\xfb\x56\x39\xfe\x61\x95\x3b\xb0\xcb\x1d\xd8\xe5\x0e\x44\xb9\xff\x98\xbb\x7d\xf3\xfb\xce\x7e\x9c\x0d\xa3\xe1\xee\x7f\xee\x3b\xea\x5f\xb7\xd5\x07\x78\xdf\xbf\xb9\x7f\xcd\x7e\xfe\xef\x6b\x50\xbd\x06\xff\xe3\x4f\x2f\x7f\x47\xfe\x90\x4c\x02\x72\x45\x76\x2e\xb2\xf9\x26\x69\xe8\x7e\x34\x38\xe6\x2f\xd8\xbd\x93\x03\xbe\x06\x07\xd6\x12\xee\x47\x07\x43\x3c\x38\x4a\x0f\xa2\xa3\x03\x0c\x7f\xc4\x51\xe5\x3f\x77\x64\xe2\xe1\xb1\xf8\x23\x0f\x71\xb4\x7b\x18\xed\xed\x82\xf0\x60\x37\x1a\xee\xa6\x7b\xbc\xb9\x3d\xd5\xe6\x00\x47\x87\x7b\x3b\x51\xff\xe0\x64\x2f\x3a\x3a\xc4\xf0\x47\xee\xf2\xae\xec\x6b\x8f\x37\xb6\xa7\x5a\x1c\xf0\xc2\xd1\xe1\x5e\x03\x50\xf6\xf8\x71\x1e\x1c\x46\xfb\xbb\xb3\x9d\xdd\x68\xf7\x70\xe7\x20\x1a\xee\xee\x1c\x47\xc3\xa3\x9d\x41\x7f\x67\xb0\x1f\x1d\x0d\x77\x38\x34\x1e\x44\x47\x43\x2c\xfe\x8a\xf1\xed\x47\xc3\xbd\xe8\x68\xff\xc9\x60\x2f\x3a\xda\x03\x80\x85\xb1\x0d\xac\x11\xee\x46\x07\xbb\x3b\xd1\xde\xe1\x6c\x3f\x3a\x00\x71\x68\x1f\x80\x25\x1a\xec\xf1\x29\x1d\xe1\xa3\x68\x6f\x37\x1d\x1c\xf2\x44\xf1\xb7\x2f\xd9\x70\xbb\x87\x78\x3f\x1a\xe4\x83\x68\x6f\x88\xf9\x9f\x74\x70\x0c\xcf\x7a\xf8\x2b\x56\x74\x7f\xe7\x20\x8f\x86\x07\x3b\xd1\x5e\x43\xdc\x07\x2b\xb1\x1f\x1d\x1e\xe5\x7b\xd1\xde\x01\xe6\x7f\x78\xf5\xfd\x21\x16\x7f\xd5\xba\x1f\x08\x49\xcc\x93\x61\xb4\x7b\x84\x07\x47\xbc\xb1\x68\xef\x68\xc6\xd7\x00\xf3\x35\xc0\x7c\x0d\xe0\x6c\xed\xc3\xd4\x61\x0d\xf8\x20\x0e\xcc\x20\x0e\xf9\x82\x0d\xa2\x83\xe3\x7c\x1f\xef\x73\xc0\xdf\xdf\x19\x44\xfb\x3b\xc3\x83\x9d\xe1\xc1\xbb\xcb\x63\x3e\x25\xf8\x73\x10\x1d\x88\x3f\xe9\x5e\x74\x34\xc0\xf0\x47\xcc\x75\x18\xed\x47\x87\xc3\xd6\x1e\x0e\x76\x23\x10\x2c\x35\x8a\x03\xcf\x03\x18\xd6\xfb\xbb\x42\xa8\xbb\xff\xff\x63\xef\x5d\xf4\xdb\xb6\x91\x85\xf1\x57\xa1\x79\xb2\x2a\x51\x43\x8c\x28\xf9\x4a\x95\xd6\x3a\x4e\x52\xa7\xb5\x93\x6c\x9c\xa4\xdb\xba\xda\x84\x16\x21\x09\x35\x45\xaa\x20\xe4\x4b\x24\x7e\x4f\xf5\x7f\x8e\xef\x99\xfe\x3f\xdc\x48\x90\x22\x65\xd9\x71\xf6\xf4\x3b\x67\x6f\x31\x85\xcb\x60\x30\x18\x0c\x66\x06\x03\x80\xff\xc3\xd8\x8a\x35\xb0\xb7\xad\x44\x84\xbd\xbd\xcd\xff\x09\x1d\x7b\x07\x3a\xf6\x0e\x1b\x9d\x7d\x5e\x7f\x5f\x35\x2d\x76\x90\xec\xf6\xa0\x29\x86\xa7\xc9\x87\xa7\xc9\x86\xa7\xc9\x86\xa7\xa9\x86\x47\x30\x48\x5b\xe9\x0e\x3b\xb6\xd3\x6e\xee\xd8\x9d\x3a\x2f\xef\x1e\xa3\xa0\xe3\xd8\xce\xee\x61\x89\xa7\xa1\xb3\xc3\x32\x76\xc2\x3d\x3e\xf8\x7b\x55\xd3\xa4\xdd\xe1\x7b\xa7\xc5\x69\x02\x35\xa0\xff\xe1\xdf\x7f\x17\xff\xee\xd9\x1d\xb8\x67\x77\xfe\xfb\x98\x2b\xed\xc3\x7f\x08\xa9\x5b\xe3\xb8\x13\x92\xee\xae\xc1\x3f\xdb\xe6\x9e\x66\xc7\xee\x40\x59\xfa\x44\xc4\x2d\xac\x41\xb4\xc4\x69\xdb\x5b\x3b\xcd\x0e\x2f\x2f\xe1\x65\xe3\x76\xea\xb0\x55\x93\x81\xe8\x1c\x39\x6d\xbe\x55\xc4\xbe\xe1\x2e\x93\xc1\xed\x7d\xb8\x05\x9d\xbd\x41\x87\x71\xda\x3e\xdc\xb3\x9d\x5d\xde\x69\x98\x75\xff\x8c\xad\x99\x5b\xd0\x69\x33\xe0\x1d\x47\xec\x25\x1f\x89\x44\x01\xa0\xdd\x61\x1c\x24\x80\xe6\x6d\x95\xe3\x51\xec\xd6\x7e\x36\xdf\xf2\x69\xe3\xf0\xf9\x54\x33\x99\x54\x8d\xdf\x26\x2d\xf6\x21\x24\x10\x63\xb6\x3d\xe5\x47\x15\xf3\x70\x49\x2e\xf1\xaa\xed\xb6\xbd\xb7\x5f\x67\x3c\xfc\x2f\x1e\x93\x42\x28\x83\xdd\xca\x62\x15\xec\x56\x87\x87\x2b\xb0\x31\x90\x7c\xfd\xb3\x1e\xb3\x71\x85\x08\xc5\x83\xfa\x88\x0d\x15\x17\xc1\xc3\x1f\x1e\x16\x39\xa1\x0a\x88\x28\x8c\xf5\x22\x36\xbe\x61\xb3\x69\x1f\xfe\xd3\x3b\x37\xaf\x30\xba\x6e\x8a\x03\x97\x49\xcd\x14\x77\xe0\xf6\xf1\xf6\x61\x1b\xaa\x48\xa0\x0e\xdc\xfd\xd8\xde\xf7\xf3\x84\x36\x6c\x1f\x77\x1c\x3d\xa1\xd9\xfe\xb8\xab\xd7\x70\x20\x53\x31\x3b\xb0\xbd\x7f\xbc\xfd\x71\x77\xbc\xf7\xdb\xc4\x69\xc1\xd6\xb1\x23\x7e\x48\x74\x28\xf5\xce\x4d\x9f\x90\xf8\xba\x46\xb9\xdb\xb5\x77\x76\x18\xbb\xed\xc8\xe0\x9e\x3d\xce\xc0\xec\xf7\x61\x1e\xf3\xb1\x2f\xd6\x82\x13\x67\x97\x59\x4b\xce\xc7\xf6\x5e\xbe\x65\xcc\x27\x24\xb3\xcc\xec\x3d\x87\xef\x3c\xb3\x92\x15\x81\x20\x99\xc6\x89\x18\x4a\x14\x4f\x50\x0d\x6d\xb2\x68\x96\x3d\xbb\xbd\xdf\xdc\xbb\x33\x9a\x65\xdf\xde\x75\x20\x2b\xa6\xd9\x0e\xec\x27\xcf\xc8\x83\x59\x78\x12\xc3\xef\x8e\x60\x96\x3d\x31\x85\x56\x07\xb3\x10\xd6\x87\x84\xa2\x69\x73\x18\x93\x6b\x9f\x04\xcd\x76\x75\x67\x76\xed\x16\x93\x54\x3c\x6a\x90\x59\xa2\xca\xf2\x6c\x89\x70\x40\x8e\x1e\xa7\xfc\xae\xed\xb4\x61\x9b\x15\x5f\x0a\x1a\xec\xec\xb0\xa2\x5b\xe3\x16\xb3\x52\xb7\x44\x60\xce\x16\x83\xba\xb5\x7b\xc8\x56\x39\xc8\xff\x51\x4b\x9f\x6c\xaf\x6c\x5a\xdb\x5b\xfb\x70\xbb\x08\xba\x29\x7f\x7d\x6c\xef\xf3\x7d\x4b\xbd\xd5\x8e\xf0\x88\xd8\xac\x85\x02\x36\x02\x90\xa2\x03\xa6\x2a\x92\xb2\x19\xf0\x17\xcb\xeb\x02\x2a\x05\x71\xf3\x38\x9d\xa6\xbd\xeb\x34\xd9\x3a\xcf\x47\x66\xaf\x03\x77\xd9\x28\x3a\xfb\xb6\xd3\xd6\x0a\x15\x46\x7b\x07\xb6\xf9\x50\x33\x9d\xc4\x39\xcc\x23\x7e\x14\xf0\x52\x8f\xf7\x99\x8d\x56\xd7\xa4\xb3\x9f\xb5\xc9\x2c\xb9\xda\x36\x99\x9c\xe5\x8d\xb6\xf7\x96\x1a\xe5\xe0\x15\x21\x22\x46\x08\x11\x1e\xdb\x1c\x11\x1c\xac\x8e\x0c\xdc\x16\x81\x4e\x61\x1b\x3a\x1f\xdb\x2d\xbb\xad\xcd\x17\x86\x61\xd3\xde\x3d\x71\x5a\x5c\x67\xec\x1c\xb7\xb7\xed\xdd\xfd\xb0\xc9\x46\x9b\x0d\x6c\xa9\x28\x2b\xb9\x0f\xdb\x7b\x0a\xd4\xce\xde\x49\x7b\xd7\xde\x66\x0a\xdf\xa1\xc3\x14\x2d\xfe\x8f\x1c\x3b\x66\x72\x7d\xd4\x3a\xdb\x6a\x3a\x4d\xe7\xb8\x30\xbd\xa0\x73\xe5\xf8\xe5\x8a\x5c\xdf\x3b\x61\x58\xb3\x06\x96\xe3\x46\x0f\x99\x02\xac\x16\xe7\x0e\xe7\x50\x95\x22\x16\x66\xc8\x6c\x4f\xd8\x69\x1d\x32\x15\x73\x4b\x2e\xc5\x1d\x11\x5c\x2b\x53\x64\x94\x63\xa7\x5d\xab\x7f\x7f\x83\x76\x72\xf0\x7b\xd0\x71\xae\x1c\xc6\x09\xf6\xb6\xad\x34\x42\xdb\xd9\xb6\x3b\xdb\xe1\x2e\x5b\xa8\x77\xed\xce\x4e\x9e\xe7\xc8\x3c\x11\x65\xaa\x57\x69\xef\xd9\x5b\xdb\x61\xc7\xde\xdf\xe6\x52\xa3\x90\xb7\xdb\x6e\xb2\xcc\x56\x73\xcf\xee\xb0\x5a\x5b\x6c\xf9\x55\xe0\xf6\x9a\xa2\x2d\xa7\xdd\xdc\xb5\xdb\xdb\x25\x3c\x58\xe6\x47\x27\x63\x37\xbf\xc4\x6e\xff\x53\xf9\xac\x82\x11\xfe\x1f\x1b\xa9\x90\x8d\x14\x8e\x86\x71\x95\x44\x28\x45\x48\x77\xa4\xda\xe1\x48\xcd\xc4\xb1\xb7\x8a\x32\x8d\xe9\xaf\xc7\xdc\x65\x78\xec\xec\x68\xeb\x53\x0b\xb6\xc7\xce\xd5\xce\xb1\xb3\xad\xad\x6d\x2c\xb1\x50\xa8\x59\x76\xf1\x7d\x8b\x00\xe5\xaf\x0a\xe7\x6e\x33\xfb\x72\x5b\x2a\x3d\xbc\x21\xd8\xce\x54\x1e\x87\xa9\x25\x42\xc1\xdf\xfe\xed\xb4\xdd\x81\xed\x2d\x5d\x6c\x43\x47\xef\xbe\xc3\xba\x3b\x6e\x7f\x74\x76\x75\x4a\x89\xd4\xad\xab\xbd\x71\x5b\x97\xe5\x0c\x94\x1a\xaf\x84\x96\x62\xf2\x29\xc1\x2b\x8e\x0a\xb0\x7e\x3b\x76\xa7\x5d\x08\x9b\x67\x0a\x03\x0f\x9b\xff\xe8\x6c\x15\xc2\xe6\x5b\xcd\xaa\xb0\x79\x21\xb9\x18\x94\x55\x61\xf3\x5b\x76\x7b\x57\x0b\x9b\xd7\x9d\xa2\x76\xa7\xc3\xe3\xd3\xb7\x78\x20\x20\x33\xa0\x77\xfc\x0e\xec\xe4\x1e\x81\x5d\xd8\x3a\xd9\xb6\xb7\x77\x45\xa9\xc3\x2c\x8f\xe9\x39\x6c\x05\x3c\x66\x6a\xe0\x7e\x5e\x07\xb6\xed\x9d\xad\xe6\x16\x33\x00\x26\x4d\xe9\xfd\xdc\xd7\xa9\x6d\xef\x31\x3d\xe0\x98\x55\x2f\xa4\xee\xb1\x95\x73\xef\xc4\xd9\xb5\x5b\xbb\x70\xcf\xde\x2e\x06\xf0\xee\xee\xc0\x56\xb8\x6f\xef\x6e\xb1\x35\x7c\x7f\x4b\x1f\x02\x56\x96\xa9\x3f\x5b\x75\x4c\xf4\x6d\x7b\x79\xea\xec\x70\x59\xd4\xb6\x77\xb7\x1e\x70\x9a\x80\x69\xbd\xf7\x3c\x4e\xc0\xaa\x28\x9e\x8b\x19\xcf\xdd\x71\x94\xa0\xb3\xa5\xad\x7e\xce\xd2\xea\x27\x16\xb5\x2d\x8e\xce\x96\xb6\xfc\xb5\x96\x96\x3f\xce\x6d\x5b\xf5\x53\x75\xcd\x86\x24\xea\x03\x86\x7a\x10\xd3\xbb\x4e\x42\x38\x8e\xbf\x0b\x77\x25\xdd\xd8\x97\xf8\xc5\x5d\xf4\xcd\xdd\xb2\x58\xfa\x16\x9d\x4d\xfb\x30\xe0\x73\x9b\x90\x98\x34\x13\xea\x47\x81\x4f\x82\xbb\x6c\xd3\xf6\x8e\xdd\xda\x91\xd3\xae\xd3\x59\xd2\x7c\xda\xf6\x8e\x3e\x01\x9c\xa6\x73\xd5\xcc\x16\x3e\x21\xc0\x5a\x57\x8e\x2e\x6c\x54\xad\x25\x51\xfc\x6f\x1b\xe0\xb6\xed\xf8\xba\x22\xc5\xbf\x0f\xcb\x8a\x94\xed\xf0\x49\xc1\x0c\xc2\xbd\xc2\x69\x0d\x07\xb6\xed\x3d\xde\xab\x62\x72\x93\x27\x8b\xf9\xb0\x67\xef\xf8\x8e\xcd\xa4\xc6\x5e\x36\x19\x98\x68\xd8\x3b\xcc\x53\xb3\x55\xc3\xce\x8e\x43\xcd\xb8\x55\x25\x9e\xbc\xae\x1e\xa1\x7f\x97\x3a\xc8\x16\x38\x4e\xa7\x62\x54\x74\xeb\x84\x1f\xf0\x82\xed\x8e\xed\x6c\x87\xcd\x9d\xe6\x8e\x6e\x73\x42\x67\x8f\x3b\x7c\x44\x91\x1d\xa1\x07\xd9\xdb\x6d\x7d\xcb\x52\xc0\xfd\x4a\x1d\xf7\x94\xab\x2e\x0c\xd2\x4e\x87\x2d\x8a\x1d\x87\x89\xbc\xdd\x1d\xb8\xcb\xa4\xa8\xb3\x34\x5e\xcd\x76\xb8\xcd\x84\x38\xfb\x87\x99\xe8\x5b\xbb\xfc\x4c\xdb\xb6\x56\x4e\x2e\xb6\x72\x24\xf8\x7d\x87\x63\xea\x11\x6b\x77\xb7\xb3\x9f\xdd\x72\x38\xa5\x73\x71\x1f\x87\xfe\xf4\x82\xf6\x66\x46\x84\xae\x8d\x21\xe5\xc7\x66\xe5\x13\x90\x43\x6a\xa0\x1b\x8a\xa2\x20\x31\xc6\xd4\x3e\x29\xdf\x93\x9e\xcc\xa6\xfc\xb2\x6a\x71\x98\x77\xec\x27\x6f\x09\xba\xf2\x36\x9c\xf4\x13\xbf\x5a\x99\x82\xb9\xb8\x32\x4d\xcf\xee\x21\xef\x5c\xbd\x7c\x77\x05\x69\xdf\x2d\xd6\x6d\x65\xcf\x40\x5e\x79\x14\xaa\x77\xea\x03\x94\x50\x1c\x89\xb7\x4a\x39\x68\x24\xef\x41\x19\xb1\x4e\xee\xed\xb5\x5a\x6d\x00\x27\xec\x7b\xbf\xd3\xd9\x6a\x03\x78\xc5\xbe\x3b\xfb\xbb\x3b\x0e\x80\xb7\xbc\xcc\xee\xb6\xb3\x0f\xe0\x05\xfb\xde\xda\xde\xea\x6c\x03\x78\x44\x3d\x8b\x58\x1d\x67\x87\xfd\x20\x96\xb3\xdd\xde\xde\x05\x00\x1e\xf2\xe4\xf6\x5e\x6b\x6b\x9f\x25\x6f\x75\x9c\xfd\x16\xff\xd8\xd9\xdd\x6b\xb3\x8f\x9d\xdd\xed\xdd\x2d\x00\xba\xc4\xda\xde\xdf\xdd\xdf\xe1\x49\xfb\x4e\x6b\x5b\x5c\x33\x79\xc6\xc9\xbe\xbf\xbb\xb3\x0d\xe0\x47\xf6\xdd\xde\x69\x3b\xdb\x00\x7e\xe2\xdf\xdb\xfb\xce\x2e\x80\xc7\xfc\x7b\xaf\xb3\x03\xe0\x35\x6f\x6d\xbf\xb5\xdb\xe1\xad\x39\xbb\xed\xce\x1e\x00\xf0\x94\xe3\xbf\xb3\xbb\x0f\xe0\x09\xad\xbb\x69\x04\xe9\x4f\x66\x51\xf1\x88\xf4\x86\x87\xf8\x83\x2a\xda\x48\x89\x4b\x1a\xcc\x37\xea\xce\x48\xfe\xe0\xd8\x04\x55\x5c\x23\xc9\xaf\xee\xc9\x9f\x0c\x28\x3e\x30\xba\x74\xc9\xcb\xd8\x4f\xde\x5c\x47\x6f\x49\x3c\x45\x84\xde\x8a\xab\x5e\x10\x94\x97\xbd\xfc\x46\xeb\x6f\x85\x81\x2f\xa8\xb7\x74\xa7\x57\x76\xaf\xcc\xa1\xba\x35\x87\x5f\x2d\xf3\x1b\x15\x80\xf3\x5b\x94\x7a\xcb\x57\xd6\xdc\x51\x97\x82\xb4\xea\x4d\x93\x1b\x6a\x99\x2c\x1f\x21\x71\x8b\x9b\x05\xe0\x2b\xea\xbd\xa0\xf0\x3d\xf5\x0e\x09\xf1\x6f\x6d\x9c\xf0\xbf\x95\xb7\xe4\x64\x97\x71\xaa\xfb\x64\x0e\xbc\x56\xa3\xa1\x61\x42\xfc\xdb\x35\x2f\xc7\xe1\x7c\xf3\x86\xd6\xdf\x9c\x29\x2e\xfd\x54\x99\xda\xb5\x9f\xe7\xe6\xd0\x8f\xa8\x9f\xdc\x36\x43\x3f\x0a\x9e\xa2\xc9\x94\xde\x9a\xfd\x5e\x4d\xba\x05\xdc\x0c\x9a\xfc\xd0\xf9\xa4\xba\x09\xbd\x44\x5d\x73\x77\x97\xd1\x9b\xae\x6c\x85\x97\xeb\xc9\xbf\x5f\x8d\x68\x06\x6e\x29\xcd\x02\xee\x7b\x26\x99\x7a\xe7\x7d\xf7\x94\xfd\x35\xcd\x0a\xde\xc8\x86\x51\x0c\xde\x9a\xe3\xc8\xc0\xcd\x53\xf7\x15\x87\x5f\x71\x15\xad\x62\xce\xd4\x02\x85\x36\xf9\x0d\x9d\x77\xc3\xef\x96\x70\xfb\x80\x23\xba\x77\x14\xfa\x93\x29\x0a\x72\x76\x43\x8b\x45\x56\xe2\x55\x44\xf7\xaa\x73\x78\xdd\xda\x4a\xce\x4e\x7d\xad\xba\xbc\x57\x11\xed\xb4\xeb\xab\xd5\xe5\xbd\x0c\x63\x7f\x75\xe6\xce\x56\x75\xe6\x33\x3c\x7a\x15\xad\xca\x65\xcd\x16\xb2\xf9\x00\x15\x79\x62\x48\xe2\x89\x65\xe6\x17\xbe\x02\x78\x49\xbd\x37\x34\x17\x82\x6f\xa9\x7e\x8f\x14\x82\xfc\xfd\xdb\x0d\x8b\xbf\xda\xc8\x16\x22\x00\xec\x20\x8e\x50\x17\xc8\x07\x64\x91\x7d\xe5\x87\x33\x94\xdd\x65\x41\xb4\xcb\x53\xa8\xba\xa0\x2c\xbf\x8e\xac\x05\x23\x8f\xa8\x0b\xa9\xf0\x0f\x91\xb8\x94\x8a\xbf\x2e\x74\x8e\xfb\x40\x5e\x4b\xb5\xd1\xea\xe2\xfc\x02\xaa\x0d\x87\x4b\xd8\x77\xd4\xab\x98\x06\x92\x8b\x70\xd2\xcb\xbe\xdc\xea\xcb\xb2\xf8\x7d\xae\xad\x0d\xbe\x38\x38\x4f\xa9\xe7\x39\x4f\x91\x4b\xf9\x9c\x43\x1b\x1e\x4a\xe1\x73\xea\x6d\xcc\x15\x13\xf2\x09\x99\x32\xee\xe4\xd2\xfe\x55\xf2\x22\x9a\x4d\x10\xe1\xd7\x43\x98\xaa\x90\x09\xe0\x4b\x6e\x0b\xe5\x14\x36\xa1\xc9\x09\xf2\x66\x68\x42\x13\x27\x6f\x15\x77\xf3\xdf\x59\x3d\x68\x56\x01\x36\xa1\x59\x5c\x63\x78\x95\x93\x78\xe0\x87\x48\x56\xec\xc3\x3f\x2a\xd6\x92\x7c\xaa\xd5\x20\x2c\x08\x2e\x6e\xf9\xf9\x51\x03\xc0\x09\x94\x5d\x1a\x56\xbc\xe0\x55\x8c\xcc\x39\xe9\x33\xc2\xe5\x03\x43\x0a\x03\x03\xbf\x30\x31\x9e\x8f\xcb\x46\x69\x5c\x2e\xd1\x6d\xb2\x58\xfc\x41\x0b\x8b\x18\x1e\xca\x9b\x4c\x2d\x0a\xd8\x78\x48\xe0\xe7\x42\x8f\xe3\x77\xf7\x8a\x7b\xeb\xfe\xa0\x8d\x06\x97\x2e\xfc\x12\x5a\xb6\xfc\x1b\x14\x30\x6d\x08\x52\xd0\x68\x58\x1b\xd1\x62\xa1\xba\xb6\xc1\x90\x6c\x34\x2c\x7c\x8e\x65\x07\xfa\x1e\x02\x5d\x3c\xb4\x9e\x53\xc0\x6a\x13\xef\xa5\xea\x5a\xd3\xe9\x92\x03\xaf\xd5\xe5\xa0\xbc\x97\xac\x8f\x1c\xe0\xc6\x8f\xd4\xc2\xb0\x02\x0c\x24\x4d\xcf\xe9\x66\xd7\xa1\x55\x2d\xae\x85\x0e\x31\x61\x5b\xb8\xab\x15\xa4\x00\x3e\x5b\xb1\xe0\xf1\x4b\xec\xcc\xd7\xb3\x30\x54\x17\xe4\x8a\x94\x0f\x51\x80\x86\x38\x42\x81\xe9\xde\x29\x2e\xe5\xc5\xb6\x7b\xb0\xe9\x14\xd4\x9a\x0f\x54\x3d\x40\x28\x24\x6f\xe4\xbd\x15\x24\x55\x05\xfc\xc2\x3c\x79\x22\x8b\x4b\x70\x00\x62\xf5\x05\xd4\xb0\xbf\xa6\x95\xfa\x19\x4b\xf7\x21\xd7\x88\xe0\x5b\xca\xef\xd7\xd2\xae\x52\x7a\xa2\xa1\x81\x87\xd6\x3b\xa1\x6c\xe5\x7c\x25\x50\x7b\xc6\x51\xc3\x43\x2b\xda\xf0\xd8\x8f\xbc\x84\xc3\x52\xd7\xd1\x09\xfe\x9c\xf9\x61\x62\xf6\x17\x8b\x8a\xc2\xa8\xa6\xb0\x6c\xe4\x1e\xe0\x1b\x8d\xba\x1c\x8b\x31\xd0\x3d\xda\x6e\x34\xea\x72\x24\x29\xaa\xf5\x07\x5e\xa6\xba\x93\x32\x73\x45\xa7\x64\x09\xa6\xcc\x89\xaf\x5a\xa4\xb3\x92\xea\x8b\x21\x25\x6f\xd2\x8c\xc4\xd5\x99\x66\xa6\x85\x9a\xae\xfc\x4d\xfc\x5b\xf9\x2d\xb5\x70\xb7\xae\x1f\x45\x35\x47\xbe\xc9\xc4\x56\xaf\x65\x85\x41\x3e\x35\x48\x81\x3d\xf1\x59\xf3\x4f\xff\x95\x31\x97\xf5\xfb\xf5\xf7\xe0\x69\xb6\x08\x89\x29\x85\x98\xae\x83\xce\x9d\x7e\x6a\x15\xda\x51\x2c\x25\x96\x04\x71\x59\x35\xbf\xf3\xd3\x7c\x16\xc7\x21\xf2\x23\x89\xba\xb8\x3c\x52\xfe\x90\xf2\x97\xf5\x43\xe1\x9e\xc9\x3a\xb4\x58\x6c\x30\x7e\xb6\xa5\xe4\xb7\x00\x44\xf9\xb7\xc6\xc1\x5a\x53\xcf\x7d\x8a\x38\xb4\x7b\xd7\xe4\x37\xa8\x9a\x6e\x76\x07\x24\xb3\x6d\xf8\x93\x43\xc2\xc8\xa1\xf6\x04\x25\x89\x3f\x12\x69\xf2\x5b\xd4\x7c\x87\x46\x2f\x6e\xa6\xa2\x0f\x76\xc2\x5f\xa1\x65\x62\x53\x7e\x2e\x16\xd4\x1e\x85\xf1\x85\x1f\xf2\x44\xf1\xc9\x12\xf1\x28\x8a\x09\x3a\xf2\x13\x51\x3a\xff\xc9\x32\xf9\xa3\x63\x21\x8e\x44\x5e\xf6\x8b\x5f\x92\x47\xf1\xe0\xf2\x56\xb4\xc0\x3f\x59\xe2\x2c\xc2\x83\x38\x10\xa5\xe5\x77\xd6\xcb\x54\xad\x44\x7e\xa6\x23\x34\x9d\xae\xcf\x45\x35\x93\x19\xe4\xdc\x67\x8b\x91\x5a\x2f\x0c\x2c\x7e\xa3\xae\xdf\xf4\x9c\xb4\xc4\x94\xa7\xfe\x54\x23\x52\x82\xbf\x08\x82\xb0\x8f\x46\x83\xc9\x44\x1b\xc9\x3b\x79\x18\xcd\xf3\x6f\xc2\x58\x65\xe0\x53\x7e\x69\x10\xc4\xd9\x2f\xd4\x07\x40\x90\xf1\x0c\xd1\x3b\x20\xf3\x11\x4c\xf2\xc1\x5c\x0f\xee\x3a\xd3\x68\x5d\x36\xd5\x78\x4c\x67\x9a\x02\x1b\xf0\x1f\x99\xca\x2c\x7f\xe7\x8a\xb2\x9e\xa0\x6b\xdd\x79\x45\xa9\x1a\x6b\x05\x8b\x29\xb9\x8a\xac\x15\x29\xa6\xe8\xea\xb0\x9e\x24\xf5\x58\x9d\x12\xcf\x66\xc3\x21\xeb\xa7\x98\x0a\xc5\x0b\x77\xa5\x8a\x18\x7a\x5f\xd4\xfa\x11\x4a\x06\xda\xf0\x58\x1a\x02\xea\xba\xda\x6c\x46\xb1\xf2\x89\x57\x1c\x95\xd8\x2b\x8c\x0b\xd7\x3a\x7c\x2f\x5c\xe2\x45\x56\x77\xe0\x85\xe7\x7e\x9f\x35\xb5\x71\x43\xad\x01\x44\x60\xb1\xd8\x78\x42\x2d\x74\x3e\xe8\x43\xca\xfe\x49\x60\xac\xcd\x60\xce\xa3\x6a\xb5\xe3\xd8\xfe\x59\xeb\xe8\x90\x6b\xe5\x79\x1f\x9e\xf7\x99\xea\xf0\xcb\x5d\xb6\xf2\x9f\xac\xc2\xa5\x70\x65\x69\x2b\xfb\xaf\x54\x2b\x1c\x5b\x14\x2c\x16\xbf\xd0\xc2\x63\x58\x3f\xe9\x25\x4e\xa8\x75\xea\x4f\xa1\x9e\xff\x8f\xa2\x4f\x84\xb2\x79\x9b\xe7\xfe\x4c\xcb\x37\xdd\x9d\xfa\x53\x4e\x35\x9e\x76\x4e\x20\xee\x33\x49\x09\x7e\xa2\xfc\x2a\x64\x9b\x3f\xb6\x08\x7f\x66\xbf\x80\xab\x7e\xe2\x4c\x6e\x6b\xa0\xff\xa9\x23\xc6\xb1\xec\xf1\xd6\x5c\x7e\xbf\x1b\x7f\xa5\xbd\x7c\xd5\x1b\xeb\xbc\x39\xcb\x34\xa6\x4c\x3c\x9f\xdd\x4e\x2e\xe2\xb0\xd1\x10\x7f\xe5\xd5\x6e\x14\x79\xc7\x56\x07\xe6\x97\x50\x6e\x54\xbb\x9c\x16\x8b\xec\x65\x88\x46\x43\xde\x63\x37\x10\x57\x4a\x8a\x9b\x50\x13\x00\x37\xd8\x02\xb0\x81\xf8\x63\x72\xc2\x2c\xd6\x3c\x28\xf2\xea\x52\x88\x8a\x8b\x93\x67\x21\x2f\xbf\x7e\x54\x7c\x09\xf0\xea\xf1\x08\xd9\x58\x28\xdf\x0d\x2c\xdc\x41\xaa\xca\x50\x7b\x4c\xd0\xb0\xe6\xc9\x0a\x1c\x0d\xc2\x59\x80\x12\xcb\x64\x30\xc2\x71\x9c\x50\x77\xa7\xd5\xda\xe1\x66\x40\xcf\x22\xb6\xa0\x94\x45\x61\x05\x6b\xe5\xf7\xc5\xda\xf2\xbd\x83\x1e\x75\x85\x93\x54\x79\x48\xf9\x33\x92\x11\xbf\x71\xf4\xc8\x0f\xc3\x0b\x7f\x70\x69\x49\x1f\xa9\x5d\x91\x23\x6f\x40\x2c\xdc\x9c\xfa\x29\x1a\x32\x63\xc8\x04\x69\x9a\x32\x5d\x0f\xe6\xb7\x05\x36\x1a\x1b\xab\xef\x7e\x2c\xdd\x44\x0b\xec\x24\x9e\xf0\xd7\x1c\x11\x5f\x23\x4a\x57\xbf\x56\xd6\xf1\xea\xaf\xc0\x5c\x02\x0f\xe7\xe7\xb4\xef\xce\xf9\x05\xa1\xae\xbc\xa6\x95\x6e\x9a\xc6\xd8\x4f\x0c\x3f\x24\xc8\x0f\x6e\x8d\x0b\x84\x22\x79\x9f\x1e\x22\x28\x30\x0b\x93\x11\xc9\x0b\x0c\xf9\xad\xbe\xaf\xac\x73\xb3\xc8\x46\x66\x1f\x34\x1a\x94\x97\x81\xd5\x7c\x96\x4f\x0e\x82\x4a\x2a\x3d\xf4\x97\x2e\xe6\x86\xa1\xe7\xff\xd0\xe9\x21\x57\x72\x19\xee\x61\xe5\x72\x19\x21\xaa\x19\x99\xcf\x91\xb8\x52\x92\x59\x58\x90\x00\x17\x73\x9d\xb3\xec\x2a\x7d\x87\x86\x21\x1a\x54\x7b\xb3\x64\x9e\x1d\xa0\x41\x4c\x7c\x8a\x40\xe8\x95\x93\x32\x7c\xbb\x28\x4c\x90\xa1\x16\xfa\xc4\xd3\x6c\xb2\x84\x09\xd7\xa4\xd9\x04\x56\xe4\xd1\xf3\x84\xd1\xc3\x0a\x3d\x8b\xf5\x22\xb2\x42\xe0\xfa\x07\xec\x83\x81\x09\x81\xcb\x3f\x00\x58\x2c\xc2\x4c\x7a\xf8\x07\x9d\x46\x23\x6c\x34\x64\x2f\x05\x77\xab\x5e\xca\x7a\x30\xe4\xef\xed\x60\xe4\x6d\x38\x30\x62\xff\x6a\x76\x10\x52\xfe\x8a\x6a\x08\x14\x12\xc8\x58\x7e\x88\x47\x33\x6e\x57\xbb\x1b\x2d\x88\x32\x2b\x9b\xfd\x1a\x21\x5a\xf5\x08\x99\xf4\xf8\xe7\x8c\x8f\x80\x78\xfe\xbf\xf0\xf0\x07\x12\x5e\xc0\x14\x26\x3a\x14\x0a\xe6\x42\xcc\x7b\xb4\xb7\x3c\x83\x98\xb5\xe5\xca\xc7\x1c\x27\xf1\x15\xd2\xa1\xa5\xa9\xc6\x32\x21\x2a\x3e\x43\x0f\xe6\x94\xdc\xce\xe5\x18\x9c\xfb\x7d\x2b\x64\xcb\x5f\x22\xf4\x95\x74\xc0\x15\xec\x81\xf6\x84\x18\x0e\x0c\x62\x0d\x40\x9a\x70\xf7\x4f\x0f\x59\x31\x70\xcb\x8f\xad\xc6\xf2\x89\x56\xcc\x0c\x3f\x8c\x16\x0b\xc9\xba\xb5\x3e\x74\xcb\x24\x71\x88\x4c\x7e\x35\x3c\xb2\x96\x4a\x43\x91\x2d\xff\x00\xc8\x46\xad\x05\x60\xb4\x16\x64\x9f\x60\xff\xc4\xbf\x40\x21\x07\xcf\x86\xba\x05\xcf\xcd\xc3\x01\xc5\x57\x88\xb1\x3c\x8a\x02\x3f\xa2\x26\x34\x0f\x69\x3c\xc1\x03\xf6\x31\xa3\xf1\x91\x7c\xf8\xd2\x84\xe6\xb3\x59\x72\x6b\x42\xf3\x68\x8c\x06\x97\x28\x60\x5f\x71\x78\x14\xcf\x78\x9d\xa3\x38\x7c\x15\x05\xe8\x46\x7c\x9e\x4d\xfd\x88\x7f\x45\x94\xc4\x61\xc2\x3e\xc5\x45\xc5\x26\x34\xc5\xec\xba\x40\xc1\xb3\x5b\xfe\x8b\xdf\x6d\xcd\xbe\xd4\xb3\xb1\x50\xe8\x66\xa7\x42\x51\x67\x3f\x6f\xa6\x7e\x14\xf0\x9c\x97\x61\x7c\xfd\x3e\x36\xa1\x79\xec\x27\x6f\xe3\xe9\x6c\xca\x3e\x71\x10\x20\xd6\xdc\xab\xe8\xca\x0f\x31\x2b\xf6\x33\xba\x3d\x1b\xc7\x84\x0e\x66\x94\x81\x16\xbd\x96\x7f\x43\xd9\xf2\x09\xba\x12\x89\xf8\x8a\x35\x72\x1a\x07\x3e\xfb\x79\xca\x14\xf6\x13\x1c\x21\xf5\x2d\xae\xbe\x96\xde\xa8\x37\x04\xa3\x88\xf2\xe5\x87\xfd\xba\x8e\x18\xf8\xb7\xda\x55\xed\xd0\x7c\x1b\x27\xaf\x22\xa6\x11\x43\xf3\x2d\x41\x49\xc2\xf1\x7e\x87\xfc\xe0\x4d\x14\xde\xf2\xcf\x10\x5d\x09\x42\xbf\x43\x7f\xce\x30\x11\x05\xe2\x10\x29\xb9\x23\x80\xbf\x8b\xaf\x15\x71\xdf\xc5\xd7\x8a\xb8\xef\xe2\x6b\x49\x5c\x81\x17\xaf\x7c\x86\xe8\x19\xfe\xc2\xf0\x3b\x8b\x09\xab\xc0\x6f\x87\x3d\xf5\x6f\xb2\x4f\x1c\xa9\xcf\xd7\xf1\xb5\xfa\x7c\x8f\x6e\xa8\xd9\xcf\x2e\xcd\xa5\xde\x41\x35\xcf\x31\xc6\x59\x7e\x68\x48\xa4\x9b\x9b\x14\x00\x75\x3b\x6c\xa2\x14\x03\x18\x23\x2f\x41\xf6\xd9\xd8\x0f\xe2\xeb\x77\x71\x4c\x1b\x0d\x2b\x5b\x90\x65\xc6\xed\xd1\xd9\xd9\x62\xa1\xfd\xb0\x23\xfe\xb2\x85\xa8\xc4\x8c\x6f\x3f\x88\xa7\x14\x05\x67\xf4\x36\x44\x67\x63\x84\x68\x62\xe2\xc8\x78\xae\xae\xe8\xcd\x30\x6c\x34\x4c\xf9\x38\x12\xcb\x3f\x3a\x3b\xcb\x6b\x68\xdd\x18\x20\x4f\xe8\x3b\x16\x80\x81\xd0\xcd\x7e\x41\xfe\x25\xd3\xcf\xc4\x2a\x3e\x43\xe5\x37\xe0\x98\xe4\x53\x6f\x1e\x7d\x7a\x32\x48\x92\x77\xfc\x7d\xd8\x27\x6c\xe6\x90\x0d\xcf\x1b\x20\x20\xde\xf1\x90\x6f\x78\x1c\x9d\x9d\x89\x12\x06\x4e\x8c\x28\xa6\x46\x06\x8f\xb1\x8f\x6d\x7c\x48\x90\xf1\x79\x16\x25\xfe\x10\x1d\x9d\x9d\x7d\x36\x62\x62\x7c\x1e\x24\xc9\x67\xbe\x8b\x87\xfc\xc0\x36\x81\xd8\x29\x1d\x24\x09\x1b\x1c\xf5\xf4\x1c\xf5\x50\x2a\x2e\x12\x56\xfd\xb2\xc4\xc6\xaa\x7c\x6f\x2e\xee\x16\xde\x0a\xa6\x6c\xbd\x8a\x51\xa3\x91\xab\x47\x4a\x27\x25\x5e\xf6\xf6\x00\x6a\x34\x1c\x6e\xa6\xa9\xe7\xab\x1a\x0d\x8b\x7a\x81\x50\xda\x98\xe6\x91\xd7\x6e\x34\x2c\x41\x84\xd8\xa3\x9c\x70\x05\x1a\x03\xf5\x34\xd5\xd9\x6d\x34\xb0\x74\xfc\x01\x24\x8d\x46\x20\xb4\x5a\x26\x97\x41\xf6\x32\x6e\xaa\x7c\x75\xa5\x35\x41\x56\x54\xd7\xbc\x8e\x91\x67\x51\x68\xdb\x36\xca\x6f\x45\x27\xf2\xb5\x21\x81\x76\x8f\x9e\xb7\xfa\x2e\xca\x5e\x7b\x12\x6b\xaa\x77\x80\x36\x19\x3f\xf3\x27\xbe\x78\x17\x0a\xe3\x07\xf2\x47\xb1\x44\x7b\x7c\x81\x8f\x84\xd9\x98\xbb\x62\xb2\x62\xdd\xc2\x28\xf3\xb9\x63\x4c\x7d\x36\xb5\x0d\x1a\x1b\xdf\x0d\x92\xe4\xbb\xfc\x6d\x95\xfc\xbd\x96\x52\x86\x78\x5c\xd8\x35\xcc\x4d\xba\x69\x0a\x66\xf8\x2e\x63\x86\xef\x18\x24\x06\x93\xbf\xf2\x12\x62\x8a\x88\x1f\x1a\xc2\x56\x86\xc6\xc5\x8c\x1a\xd4\xbf\x44\xc6\xc0\x27\x88\x95\x94\x17\xd8\x4f\xfd\x11\x32\x12\x34\x98\x11\x4c\x6f\x6d\xa6\x5d\x59\x04\x6c\xd2\x73\xbc\xe9\x30\x93\xab\xd5\xcf\x1d\x40\xe8\xda\x98\x21\x8b\x40\x0a\x07\x08\xa4\x70\x8a\xbc\x18\xf5\xa8\x77\x40\x5d\xf6\x8f\xbe\x8f\x5c\x18\xdc\x1e\x27\x23\xdf\xc4\xf7\x4c\x33\xb7\x64\x0c\x62\x08\x6f\x55\x92\xbc\x9b\x85\x28\x01\x68\x93\x99\x8e\x92\x9c\xa2\x51\x56\x55\xb6\x6b\x0a\xa3\x44\x23\x6e\x8f\xba\x74\xd3\x34\x25\x97\x31\xa4\x00\x5b\xa1\x01\xb3\x68\x28\xb7\x45\x87\x48\xb2\xf5\x28\x13\x2b\x13\xe4\x8d\x90\x4d\xc9\x2c\xa1\x28\xe0\xaf\x3c\xc3\x2b\xe4\x4d\x50\x6f\x82\xc4\xe6\xde\x19\x17\xa0\xae\x69\xc2\x5b\x5e\x54\xbe\xe3\xac\x5e\xb5\x7a\x1b\x87\xb7\x43\x1c\x86\x67\x42\x93\x87\x17\xc8\x9b\xd3\x38\x57\x11\xf4\x47\xa8\x90\x7c\x06\x47\xfa\x16\x5c\xca\x8c\x0c\xa1\x3c\x6a\xce\x27\xe9\xe6\xe6\x56\xb9\xd8\xf2\x75\x95\xf1\xc2\xba\xb8\x64\x90\xe5\x33\x00\x0e\x49\x3c\x29\x35\x2d\x5e\x95\xa3\xdd\x1a\x14\xc4\xdb\x7c\x4c\xf1\xd1\x31\x10\xee\x0e\x37\x7b\xb8\x8f\xf6\xd8\x87\x2b\x92\x99\xf1\xbf\x1a\x5b\x72\x3b\x27\x9e\x66\x43\x52\x20\x95\x1d\x0c\xe6\x02\x66\xf6\xa0\x35\x49\x53\x78\xc4\xa7\x24\x9b\x8f\x48\x3c\x64\x69\x21\xbe\xef\x46\x99\x94\x81\x87\xc8\x9b\xfb\xaa\x4f\x4c\xff\x63\xc3\xed\xca\x4d\xff\x41\x1c\x5d\x21\x42\x11\x71\x2f\x10\x24\x42\x1f\x76\x37\x1c\x38\xf6\x13\xf1\x06\x7c\xe0\x1e\xa1\x54\x4a\xe3\x33\x94\x99\x55\xc7\xef\x4f\x4f\xe4\x00\x96\x6e\x9d\x17\xe1\x27\xd2\x90\xfa\xf4\xe4\x05\x56\x26\xb7\x7c\xb0\x3f\x11\x77\x9a\xbf\x45\x51\x80\xa3\x51\xf6\x3e\xff\xd8\x97\x19\xf9\x93\xfd\x9f\x9e\xbc\x08\x79\x67\xc5\xcf\x99\x55\xb8\xcc\x5b\x7b\xa9\x5f\x39\x5f\x85\xa0\x1e\xe2\x88\xa7\x5b\x00\x5a\x72\x6c\x2c\x29\x85\xc7\x40\x09\x60\x26\x6c\x7b\x48\x86\xb9\x78\xe7\x7d\x20\x36\x0a\xa9\x7e\xf1\xb5\x11\xf3\xcb\xd6\x51\x90\x71\x44\xa2\x6e\xd5\xcf\xdb\x50\x96\xba\x77\xde\x2f\xdc\x94\x2f\x2d\x33\xa9\xea\x61\x94\x5f\x84\x6f\x95\x1e\x94\x50\x7d\x9d\xf2\x47\x94\xba\x19\x7e\x98\x09\x7f\x99\x77\xc5\xe5\x35\x86\x04\x40\x2a\x30\xc5\xfc\xf1\x20\xaa\xd0\x15\x0f\xc5\x69\x56\x00\xf2\x0e\x11\x5f\x29\x91\xb8\xf5\x9b\xc7\x9f\x64\x6c\xe0\x6d\x38\x72\x84\x34\x6a\xd5\xe0\xcd\x5a\x66\xdc\x05\x37\x90\x1d\xc5\x87\x3c\x90\x2c\x26\x8d\xc6\x86\x8c\x09\xaa\xd1\x6d\x29\xc8\x17\x38\x33\xe1\xab\xbc\x2e\x6a\xd4\xba\xef\x9a\x9f\x3e\x99\x9b\x54\xbd\x91\x3f\x42\xb4\xc2\xe4\x63\x46\x4d\x89\x34\x35\xd6\x4f\x01\x25\x48\xf9\x63\x54\xf9\x88\x56\x82\xd6\x5e\xa7\x9a\x8f\xf8\x32\xae\x8d\xe3\x39\xea\x73\x53\x87\xcd\x3c\xd1\x9b\x88\x23\x7a\x4e\xfb\x5d\x99\xef\x61\xf5\x50\xfd\x9f\x33\x94\x50\xc1\xc5\x16\x85\x11\x24\x20\x85\x2b\x4d\xb1\x2a\xdc\xde\x88\x77\x13\xf4\x4b\xd6\xab\xc7\x45\x38\x72\x16\x8b\xc3\xec\x85\x81\x7c\x2c\x33\x15\xa9\x6c\x70\xa8\x22\x81\xa9\x79\xfd\x0a\x8c\x10\x78\x1b\xad\x8c\xa9\x73\x5b\x5c\xdb\x23\x96\xaf\xe6\x72\x07\xbd\xc6\x3e\xd9\xe8\x50\x7b\xac\x58\x77\xec\x9d\xdb\xb6\x4d\xed\x71\xbf\x8e\xbd\x94\x74\xb0\xe8\x72\x5e\x2e\x44\xae\x8a\x42\xa4\xdc\xab\x69\x56\x45\x7f\x8a\x52\x31\x83\xcc\x82\x88\x23\x53\xe9\x5e\x78\xed\x4f\x10\x23\x39\xac\x2b\x20\xd8\x95\x15\xe9\x97\x17\x5c\xa6\x70\x32\x35\xa9\x38\x03\x09\xa4\xe7\xa4\x9f\xaf\x2d\x5a\xe7\xf9\x4a\x9e\x78\x05\xaa\x8b\x34\xf9\x5e\x26\xff\xe6\x0f\xbd\x94\x06\x56\x95\xca\xdd\x99\xe7\xdc\xb9\x5b\x08\x8c\x2a\xcc\x3c\x46\xb6\x33\xc6\x28\xfc\x25\x01\xcb\x79\xda\x62\xaa\xe1\x15\x22\xfc\x5d\x52\xad\x2b\x94\x75\x85\x00\x64\xcf\xa2\x64\x8c\x87\xd4\xe2\xf7\xfc\x83\x94\x7b\x42\xf2\xa1\x6d\x34\x90\x90\x3f\x22\x3b\xf7\x89\x4a\x4c\xb9\x1c\x13\x1e\x24\x89\x81\x26\x75\xba\x8a\xe3\xf4\xb7\x69\x97\xd4\x10\xd2\x23\xcb\x89\xb4\x57\x32\x75\x54\x6c\xc8\x2c\x7b\x76\x49\xf1\xca\x27\xf5\xaa\x0f\x33\xfb\xf9\x4b\x2b\x9c\xf6\x11\x9b\x73\x7c\x72\xb2\x65\x87\x66\xbc\x75\x78\x52\xe4\xad\x4f\x4f\x5e\x8c\x94\x30\x2c\x4e\x69\xfd\x29\x26\x31\xe4\x5a\xcc\xca\x78\xe9\xf9\x25\xcd\x86\xa3\x62\xca\x80\xd4\x0f\x02\x69\x80\x87\xda\xba\x05\x49\xb7\xbc\x52\x7d\x7a\xf2\xe2\xac\x72\xb1\x62\x19\xfa\x7a\xa5\x4d\x3b\x81\x71\x14\x20\x22\xcc\x3b\xb9\xde\x1e\x29\x2f\x67\xa3\x61\xe5\x2f\x0a\x53\x7b\x1c\x27\x34\xcb\x2b\x3c\x1b\xbc\x58\x10\xb5\x5f\xcf\x18\x98\x3f\x10\xba\x8c\x75\x37\xf7\x11\xe7\x28\xeb\x4e\xde\xc5\x02\x65\xef\x67\xab\x02\xf9\xcb\xdb\xe0\xe0\xe0\xa0\x05\x1d\x90\x0a\x82\xcf\x97\x28\xba\x62\x05\x15\xca\xce\xbc\x4a\x16\xf0\xc0\x88\x4c\xf7\x50\x66\x8e\x90\xd4\xcc\xc8\x0c\x11\x45\x4a\xb2\x83\x14\xa4\x62\xda\xbe\xcb\xc8\xb6\xf4\x8a\x97\x1a\x18\xf5\x8e\x78\x66\x3f\xeb\xc3\xc3\x55\x67\x96\xed\x53\xea\x0f\xc6\xc2\x5e\xb6\x96\xba\x94\x57\x7e\x53\x7c\x5d\x27\xeb\x12\x33\x00\xec\x65\x23\xdb\x43\xd9\xb3\x41\xf5\x66\x01\x75\xe5\x3b\xb4\xc2\x04\x74\x91\xfe\xf6\x4e\x36\x1f\xeb\xde\x96\xe5\x35\x4d\x00\xb1\x97\x20\x3b\xc4\xf4\x75\x1c\x0d\x50\x61\xc9\x25\x25\xbf\x78\xc4\x4a\x98\x10\x03\x48\x6c\x8a\x6e\x18\x33\x51\x14\x51\x0f\x29\x9b\xa3\xf4\xaa\x2d\x61\xf4\x06\x72\x38\xaa\x86\xfa\x4c\x0a\x3e\x94\x56\xf9\xec\xc5\xb0\xe4\x73\xac\xcc\xee\x56\x29\xc5\xd3\xc4\xb2\x3e\xbe\x6a\x25\x2a\x08\x04\x8b\xfb\xec\x8a\xd3\xbb\xcc\xd0\xe5\x59\x2d\xa7\xc1\xd2\x8e\xc9\x8a\xa9\xa5\x6d\x7c\xa8\xf8\x44\x90\x96\x30\xa1\x60\x9e\x06\x38\xa9\x27\xc1\xa3\xa2\xf9\x5c\x6b\xe9\x4e\x4c\x33\x49\x2e\x6d\x83\x0c\x35\xa9\x45\x29\x91\xfa\x33\x7f\xa1\x97\xcd\xec\x37\x22\x8b\x2b\xa3\x3c\xb8\xae\xab\x6b\x51\x05\x26\x90\x4b\x07\xe1\x9a\x45\xc6\x77\x91\x7c\x44\x9f\xd8\xd2\x3a\x51\x2b\x8b\xef\xe5\x85\xb4\x37\xd3\xf9\xae\x8e\x30\x69\x6a\x5e\x3b\xd7\x8c\x4b\xd0\xd3\x8a\xbb\x17\x08\xe8\x99\x4c\x4f\xb7\xd9\xf2\x03\xba\xb9\x39\x42\x25\x93\xf8\xbd\x4a\x7f\x76\x24\xfd\xdc\x85\x89\x12\x41\x1f\x94\x2c\x9a\x34\x95\x54\x52\xef\x6d\x76\x0b\xd6\x80\x46\x16\x18\x79\x58\x58\x00\x42\xdf\x2b\x13\x27\x83\xcb\x7e\xe6\xba\x0f\xb6\x2b\x54\xca\x08\x40\xbf\x2a\x3c\x91\xe6\x44\xe8\xcd\x0b\x26\xb0\xab\x65\xa5\xee\x32\xbd\x89\x47\xab\xe9\xad\x3d\x3d\x5f\x00\x28\x43\x3d\x33\x8a\x6b\xa4\x8d\x84\x98\x8e\xfa\x9e\x5f\xac\xc3\x24\x86\x18\x88\x25\x2a\x96\x75\x6e\xce\x85\x7c\xef\x84\x69\xb1\xba\xda\x62\x59\x16\x61\x2b\xdb\x12\xdb\x55\xaa\xde\xc0\xce\x0d\xe0\xc5\xe2\x08\x01\x4b\x2a\xfd\x10\x81\x9e\x95\x69\x0e\xac\x14\xd7\xc1\xf3\x94\xdc\x5a\x2a\x70\x6d\x71\xa0\x0a\xbe\x57\x95\x71\xa4\x2d\x5c\x47\x4a\x27\xc9\xbb\x7c\x24\x41\x13\x00\x80\x8b\xb9\x01\xb7\x51\x65\x51\x37\x1a\xba\xe1\xf8\x29\x03\xff\x87\x05\xf8\x8c\xfc\x23\xdf\xec\xe5\x79\xb9\x63\x48\x31\xc6\xf7\x16\x98\xa3\x65\x43\xbd\xd5\xa5\xe4\x76\x7e\x8b\x51\x18\x18\x88\xc3\x96\x4e\x09\x02\xe6\xf9\x26\x0b\x0f\x30\x24\xea\x71\x3a\xb6\x18\x24\x83\x31\x0a\x66\x52\xc0\x31\x8b\xb9\x1c\x17\x60\x09\x98\x94\x5b\x98\xa5\x66\x97\x9e\xd7\x14\x48\x43\x92\x6f\x25\xea\xee\x34\xa5\xf5\x65\x95\xf8\x5b\xdd\x22\x5a\x87\xca\x07\x7c\x19\x8f\xe4\xfb\x69\xa1\x38\x10\x63\xf9\x7c\xcf\x29\x84\x09\x34\x23\x74\x43\xcd\x42\x80\x41\xb2\x5c\x88\xbb\x1f\x79\xa9\x50\x0e\xa5\x58\xdd\x40\x5a\xee\x6f\xc1\x8c\x9b\x22\x32\x8c\xc9\x44\xe5\xa5\xa5\xdf\x52\xc2\xe3\xa1\x55\x39\xb6\xea\x41\xdc\x4c\xbf\x29\xe8\x3a\x25\xf5\x48\x99\xa7\x54\xf7\xc5\x48\x54\xbb\xc2\x7b\xb8\xe1\x74\x95\x5a\x90\x71\x30\x1f\x65\xa4\x94\x9d\x78\x16\x06\x12\x39\x02\x20\x92\xbc\x7f\x8d\xc3\x30\x4f\x7d\xd4\xf5\x48\x80\xbd\x6b\x25\x92\x1e\x21\x85\x02\xc8\x74\xe3\x4b\x4b\x73\x95\x09\x17\x31\xd2\x1d\x4a\x97\x16\x80\x38\x45\xd9\x74\x3c\x7c\xc1\x98\x55\xeb\x0f\x5b\x7d\x79\xf2\xbd\xd4\xdc\x7b\x76\xef\xce\x95\xb6\xec\x13\x5b\x2c\xac\x25\x2f\x59\x4b\x39\x70\x48\x06\x96\x49\x2e\x9d\x34\x2c\x21\x15\xbd\x9e\xd7\x98\x3b\xcb\xfe\x38\xbe\xad\x21\xea\xab\x8d\xc6\x12\x13\x8f\x90\x6c\x30\xcf\x4f\x2b\xd2\x0a\x75\xb8\xbc\x28\xf0\x53\xe6\xe0\xd8\x68\xa5\xb3\x2c\xa9\x68\xce\x94\xc5\x62\x15\x8f\xdb\x5c\xcd\xc8\x94\x7c\x98\xd1\x80\xcb\x51\xc9\xf0\x3a\x03\xa4\x39\x71\xe6\x69\x89\x7c\x73\x71\x82\xed\x23\xea\x9e\xa1\x82\x4b\x04\x9e\xa1\x7a\xe7\x85\x96\x29\x8d\xfb\xf3\x3e\x4b\x5b\xd2\xf7\xbd\xf9\x24\x0e\x90\x6b\xc6\x53\x14\x99\xa9\x9c\x39\xb7\x68\xb1\xb8\x45\xd6\xfc\x5d\xd1\x31\xee\x9e\xa1\x54\x73\x61\x0e\xab\x9c\xe7\xf2\xc5\xd4\x44\xb7\x45\x86\xa8\x37\x44\x6e\x7d\xd9\xdc\x7a\x34\x1d\x7b\xdb\x6e\x99\xca\x87\xf9\x29\xf3\xe9\x1f\x23\xef\x53\xc9\xa7\x7f\x8d\xbc\x63\xd4\x3b\x46\xca\xcf\x11\x87\x78\x70\x6b\x99\x21\xa6\xcd\x31\x9d\x84\x26\x9c\x8b\x8c\xe3\xf7\xa7\x27\x7c\xfb\x22\x55\x26\x3a\x3c\x45\xde\xe7\x10\xd3\x27\x4f\xe6\xd6\xa9\x4f\xc7\x36\xf1\xa3\x20\x9e\x58\x60\xd3\x34\x55\x3c\xf8\x3e\x48\x9f\x7c\x86\x27\xc8\x33\x7b\xe6\xe6\x29\x82\x37\xc8\xfb\xfc\xc3\x93\xf9\x09\x4a\x0f\x3e\xc3\xdf\x50\x66\xb4\xc0\x17\x88\xc9\x19\xd3\x04\xde\xc1\x6f\x0a\x97\xa3\x78\xc2\x4d\x18\x0a\xe0\x2b\xe4\x51\xef\x40\x39\xdd\x17\x0b\x15\x21\x92\x85\x59\x15\x62\x43\xf2\x54\xf8\x1e\x15\x4f\x97\xc1\x37\xc8\x7b\xfa\x83\xd5\x73\xad\x8d\x66\x73\xf1\xfb\xd3\xf3\x7f\xf9\xcd\x2f\x87\xcd\xdf\xfa\x60\x61\xfd\xfe\xb4\x77\x2e\x7f\x9d\xff\xeb\xe0\xf7\xa4\xff\xbd\x48\x7c\x02\xc0\xd3\x11\xbc\x44\xde\xd3\x66\xf3\xe0\xe9\x08\xbe\x45\xde\x53\xf6\xf7\x35\xf2\x44\x34\xa3\x65\x1e\x2c\xce\x8d\xdf\xe9\xef\xd1\xef\xc3\xdf\x49\x9f\x41\x3f\xff\xd7\xef\xbf\x27\xbf\x9b\xdf\x1d\x78\x4f\xfb\x9b\xc0\xd2\x72\xbf\xf7\xf4\x1f\x56\xcf\x3d\xff\x57\xf6\xfb\x77\xf3\xbb\xcf\x3f\x1c\x78\xfd\x85\xf5\xbb\xb9\xf8\x0e\x2c\x00\x58\x3c\x01\x26\x34\x47\x26\x80\xef\x90\xf7\xf4\xbb\xa7\x23\xf8\x1c\x79\x4f\xcd\xa7\x23\xf8\x12\x79\x4f\xff\x65\xf5\x5c\xe1\xf1\x5c\x70\x33\x6f\xc1\xcc\x35\x9f\x20\x7f\x41\x31\x0d\x11\x78\xf2\x14\xc3\x3f\x38\xe9\x2c\x04\x6d\xdb\x26\xc0\x3b\xb0\xe6\x9f\x9e\x84\x98\xb2\xd1\x7f\xe2\x52\x28\x1c\x32\x89\x8b\xa0\xd8\x00\x73\x49\x0a\xe0\x8f\xc8\xfb\x03\x59\x0e\x80\x5f\xf8\x47\x1b\xc0\x67\x6a\x47\x97\xcd\x54\xc1\x1e\x51\x2c\x14\x29\x13\xc0\x0f\x55\xb9\x74\x2c\x0e\xa9\x3c\x29\x6c\x00\xc3\x3f\x91\x97\x8d\xf0\x7b\x82\xd0\x2f\x7e\x78\x89\x88\xf5\x1b\x82\x4e\x7b\x5f\xbc\x94\xba\xe1\xa8\x43\xb4\xbf\x14\xf7\x89\xe7\x0a\x5b\x0a\xb5\x4e\xa0\x34\xd3\x0e\xc5\x0a\x3a\xf5\x09\x65\xd3\x81\xaf\x86\x91\xd7\x82\xbe\xa7\x5c\x9f\xa1\x16\xf3\x03\xa5\xaf\x8e\x17\x87\xe7\x31\x1c\xf4\xbd\xcc\x60\xcf\xd6\xcf\xbc\x38\xce\x40\x42\xdf\x6b\x73\x09\x6f\xfe\x90\x5c\x8d\x0e\x4c\xd7\x34\x61\xe8\xbd\x41\xdc\xef\xc6\x4a\xc4\x5e\xab\x1b\xff\x40\xba\xf1\xe6\xa6\xf6\x24\xe8\x79\x2c\xea\x13\x98\xc0\x81\xd7\x74\x60\xe0\xb5\x78\x95\x6e\xf0\x83\xda\x1b\x6e\x34\xac\xd0\x0e\xfd\x84\xf2\x28\x04\x2f\x80\x89\x17\xda\xe8\x06\x0d\xd4\x93\xe1\x1b\x9e\x97\x80\x2e\x08\x3c\xad\x18\x64\xd3\xe2\x0d\xea\x99\x1b\xcd\xa6\xe9\x79\x5e\x72\xee\xf4\x7b\xa1\x77\x89\x72\xd5\x5e\x26\xbd\x2d\x24\xb5\xfb\x3d\xeb\x25\xb2\x29\x4a\xa8\xc5\x7e\x81\x46\xc3\x8a\x32\xa6\xfe\xe1\xa9\xb9\xc9\x52\x39\xff\x01\x18\x7a\xaf\x11\xd0\x6b\x77\xfa\x3c\x46\x8a\xa5\xb2\xf6\x5f\xa3\x9e\x79\x20\x5a\x6f\xf5\x7b\x56\x28\x3d\x2c\x51\x2f\x72\xdf\x20\xde\x5f\x90\x1f\x2f\xe1\xe8\x0c\xbc\x66\xdb\xb5\x06\x7a\x4f\x9a\xac\x41\x15\x44\x46\x78\x31\x18\x7a\x5a\xb5\x4e\xbf\xf7\x1a\xb9\xdf\x99\xdf\xa9\x5f\xcf\x91\xfb\x4e\x62\xf0\x1c\x2d\x16\xec\xef\x3b\xd4\x63\x68\xf1\xb4\x4b\x99\xf6\x96\xa5\xbd\x41\x2e\x47\x18\x46\x99\xc2\x24\x06\x67\xe6\x89\x1e\x34\x1a\xf4\x3c\xde\x74\xfa\x76\x42\x19\x53\xfc\x82\xe9\xd8\x32\x9f\x1e\x98\xa0\x67\x1a\x6c\x94\xbb\xfe\xa6\x27\x69\x8d\x36\x6f\x90\x3b\x38\xf0\x5a\x3d\x0b\x0b\xb1\xcb\x14\x29\x29\xf7\x5a\x70\x00\x36\x4d\xc6\xa2\x4f\xcc\x4d\x95\x38\x00\x9b\xa7\x68\x73\x06\x5c\xc4\xfe\x5a\x4d\xc6\x42\x83\xac\xb6\x5a\xd0\x62\xe0\xce\x94\x9a\x9d\x78\xfe\x26\x3f\x05\xb5\x58\x98\x3f\xf4\x0e\x4c\xb0\x69\x29\xbe\x7b\xaa\x18\x8f\x5b\x8e\x1b\x65\x4f\xf1\x62\xb1\x41\x97\xe3\x9d\xfc\x6b\x13\x14\xc3\x28\xb0\x88\xe3\x31\x28\x9a\x4c\x43\x9f\x22\x43\xce\x30\xc3\xe7\x11\xd0\x4a\xa9\x3f\xcf\x86\xfd\x1a\xf5\xae\xd5\xf4\x65\x6b\x82\x95\x00\x37\x81\xb8\x9f\x02\x3e\x73\xba\x6a\x83\x02\x85\xde\x2f\xa8\xe4\x8b\x8a\x21\x01\xf0\x4f\x64\xcb\x97\xd4\x5f\xc7\x81\xd4\xbd\x50\xc8\x4c\x37\xca\x16\x02\xde\xbf\x92\xaf\x5f\xcb\x16\x0f\xeb\x92\x84\x72\xd7\x53\x17\x49\x4b\xdd\x02\x99\x4f\xca\xb2\x6d\x1b\xd9\x03\x96\xcd\x1a\x48\x00\x0f\xec\xef\xaa\xe5\x16\x7b\x7f\x22\x7e\x98\x90\x65\x5a\x00\x34\x1a\x2a\x66\xf1\x87\x50\x04\xfa\x3b\x9e\xe7\x61\x3b\x8a\x03\xc4\xc4\x0b\x4f\xc2\x85\x00\xba\xc4\xd2\x36\x23\xce\xf5\x7d\x03\x64\xc4\x43\x03\x17\x02\xeb\xc4\x0e\x04\x00\x7c\xc7\x0e\x45\x81\xe4\x29\xc1\x1a\x80\xbb\x52\x73\x56\x3b\x45\x9a\x8b\x7f\x70\xee\x6f\x6e\xf6\xc5\x76\x8c\x7a\x91\x3b\x1b\x06\x52\x72\x09\xe4\x46\x35\x29\xfa\xd3\x15\x17\x02\xee\xb2\xa5\xac\x09\x88\xbc\xa7\xd6\xb9\xdd\xfb\x7b\x1f\xf4\x2c\xfb\x7b\xf0\x54\xc8\x17\x02\xba\xf2\xe9\xef\x39\xdf\x49\x76\x20\xf7\xe9\xba\x11\x8c\xfc\x09\x72\x11\x93\x04\xb9\xfc\x65\xf2\xd8\x35\x6d\x7e\xd4\x93\xcd\xe5\x7f\x22\xd7\xec\x65\xbf\x10\x71\xcd\xbf\x67\xbf\x08\x71\x7f\x46\xa9\xdc\x73\x28\xb4\xb1\xa3\xda\x48\xc5\x30\x69\x64\xa4\x00\x57\x85\x15\xe2\x61\x26\xb1\xb0\x4d\xfd\x11\xa3\x2f\xd0\x89\xa1\x79\x2c\x0b\x5d\xd6\x62\x3d\xd9\x58\x1c\xb4\xc0\xbc\x50\x58\xaa\x41\xc5\xd0\x86\x4c\xa0\x8b\xe3\x89\xa8\x4b\x36\x37\x01\x56\x9c\xc6\xcf\xee\xbd\x60\x5c\x04\x0b\x4c\x05\x0b\x7d\x6c\xcb\x3e\x6e\x6e\x46\x29\xe8\x6a\x95\x91\xac\x9c\xa6\x82\x32\x78\x68\xed\x15\x79\x8f\xb3\x5e\xe0\x53\xdf\xf3\xbc\x13\x04\x2a\xc1\x32\xa0\xac\xba\x0c\x52\x6a\x3a\x62\x45\x69\x3a\xc2\xb9\x2d\xea\x67\xee\xf9\x53\x04\xe9\xa6\x03\x40\xb7\x08\x6c\x37\x07\x06\xe9\xa6\x77\x8a\x32\x62\xa5\xd1\xe6\x66\x5a\xdc\x8d\x56\xd3\xb9\xb0\x1d\xf4\x5b\x79\xb2\x9b\x4a\xa4\x98\xf9\xf1\x5c\x1b\x47\x11\x22\x4c\x6c\x78\x14\x12\xed\x61\xfc\x5f\xa5\x93\xc7\xa3\x5a\x54\x31\x33\xc8\xf9\x58\x79\x9e\xf7\x4c\x1d\xd4\x31\x50\x57\x2c\xb0\xb9\x07\xbb\xa7\x8c\xb1\xc8\x23\xf6\xa7\x27\x47\xb1\x6e\x85\x45\xca\x0a\x8b\xce\x71\xdf\xe5\xf9\x2a\x0a\x7f\xe0\xbd\xe2\xc1\xb0\x99\x99\xc6\x75\x8a\xe7\x98\x20\xae\x5e\x3f\x51\x1e\x14\x01\x3e\x56\xe5\xe2\xc2\x71\xae\x0d\xcf\x1b\x68\x1b\x30\xbe\xb7\x54\xfa\xd3\x93\xc3\x37\x3a\x46\xfe\x62\xe1\x0b\x8b\x30\x66\x9a\x4e\x1e\xfb\x35\xe8\xa9\x5e\xb9\x56\x2c\x5e\xff\x67\xba\x2f\x87\xf0\x9e\xef\x95\x63\xa0\x89\x00\xdc\xcb\x6c\x88\xd0\xb3\x12\x8f\x00\xd1\x79\xcd\x64\x08\x7b\xa1\x9b\xf0\x54\x66\x1c\x9c\xe3\xbe\x17\x4b\x12\x78\xb1\x06\x29\xe6\x91\x25\x7c\x0c\x78\x63\x67\x6c\x30\xe4\xe1\x21\x00\x63\xde\x2c\x92\x97\x94\xfc\xb4\x14\xb9\x27\x4d\xd0\x19\xb3\x8d\x94\x31\xfa\x5a\x76\x24\x4b\x78\xae\xe2\xeb\x3e\x3d\x39\x3c\x95\x21\x76\x53\x5f\xad\x02\x4b\x36\xe5\xe1\xa9\x9d\xe7\xf2\xc2\x9f\x9e\x1c\x7e\xa8\x2a\xc6\xd2\xd3\xab\xdc\xaa\xe7\xc8\xcd\x51\xe8\xce\xe5\x92\xe1\x92\x14\x72\x0d\xcf\xc5\x69\xe6\x0d\x79\x0e\x23\x4f\xdb\x9a\x53\x41\x44\xd9\xc1\x06\xce\xca\x38\x8e\xce\x06\xf1\x14\x95\xf7\xeb\x7e\x43\xc0\xc6\x93\x69\x4c\x04\xee\x04\x6e\xb4\x40\xb7\xb4\xac\x45\x9c\x4b\xfd\xe2\x62\x03\x43\xaf\x05\x13\xaf\x05\x63\x0f\x9f\xb7\xc4\xc2\x91\x3b\x33\x63\xb1\xfc\x30\x36\x8a\xc5\x7c\x55\x37\xba\xb4\x79\x12\x9b\xa8\x3d\xa1\x4b\xff\x03\x59\x3e\xf4\x39\xe4\x33\x7c\x11\xe2\x68\xc4\x89\x0b\x29\x70\x9d\x72\xd9\xd8\xe6\x03\xe5\xc3\x98\x9f\xd1\x83\xb1\x8c\x91\x4a\xb2\x2a\x3b\x59\x15\xce\x07\xac\x12\x66\x15\x64\xbe\xf2\x3c\x64\x8b\x10\xc3\x7e\x73\x33\xe9\xa7\x61\xee\x32\xd6\xf8\x5d\xa0\xde\x68\x58\x4b\xbd\xdf\xdc\xcc\xf6\xcd\xa3\x74\x9a\xdd\x58\x23\x95\x60\x3d\xd6\x8d\x37\x08\xf2\xd5\x2e\xf3\xab\xb2\x1f\xaa\x03\x3d\x8b\xf1\xf2\xe1\x2b\x19\x46\x02\x79\x58\x9c\xcc\x53\xf2\xab\x0d\x5c\x55\x88\x1f\x76\x83\x88\x89\x33\xc1\xca\xff\xa8\x08\x42\xcd\xc4\x8f\xb0\x24\x18\x51\xbc\x76\xc6\xb9\xc7\xde\x07\x54\xcf\xe3\x87\x1a\x8f\x3f\xf3\x90\xc6\xef\x44\x7c\xc7\xd2\x59\x80\x55\xd6\xd1\xc4\xcb\x65\x97\xf8\xd2\x36\x34\xb4\x2d\xde\x82\x44\x5b\x2c\x22\x7d\x4a\x54\x9c\xf0\xd9\x28\x9d\xf0\xc9\x30\xa9\x39\xc7\xc3\x20\xd5\xec\x4a\x1f\x4d\x96\xe7\xaa\x16\x0e\xcb\xba\xad\x4d\xd5\x62\x70\x2c\x6b\xb1\xab\x07\xf1\xab\x58\x58\x11\x55\xaa\x96\x39\x1e\x0c\x8b\x34\x28\x00\x52\x19\x83\xeb\x93\x1a\xf9\x70\xc8\x0b\xa0\x28\xa8\xce\x7e\x96\x4a\xc6\x10\x98\x80\x39\xe5\xe2\x8d\x33\x34\x63\x95\x57\x88\xdf\x4e\xe1\x79\xde\x07\x24\xae\xf2\x11\x6e\x05\x7e\x61\x4f\xbe\x11\x70\xbc\xc1\x0a\xe4\x4e\xc5\x77\x79\xfc\x1b\xe7\x05\xe0\xd2\xdc\xa3\x75\x78\xdc\x68\xb0\x9f\xcf\x54\x85\x91\x45\x35\x7b\x89\xda\xb9\xc9\x2a\x36\x99\x9e\x94\xf2\x15\x3d\x44\xee\x7b\x96\x6b\x51\xef\xe0\x3d\xe2\xfa\xfc\xf2\xfe\x8e\x55\x16\x5b\xe7\xd2\x08\xe7\x11\xad\x34\x26\x7d\x00\x78\x37\x19\xb8\x4b\x4b\x9d\xd5\x60\x68\xa5\x6f\x32\xda\x70\x72\x2d\xd3\x57\x1b\x0e\x1b\x47\x09\x22\xf4\x19\x1a\xc6\xe2\xec\x0f\x48\x19\x72\x73\x9d\x4a\x34\xf7\xe6\x95\xa8\xc4\xbf\xde\xf0\x90\x83\x51\xb9\x16\xa3\xed\x2b\x94\x93\x5b\xe2\xca\xdb\xd7\x84\x9b\x50\x81\xe4\x4e\xfc\x7b\x2b\x77\x1f\x28\xd9\xa2\xb9\x06\x59\x8b\xe9\x93\xf2\x7a\xa0\x7c\x1b\xba\xdb\x80\x2d\x07\x30\xf2\x96\x62\x91\x71\x86\xc4\x11\x1f\x82\x7c\xaf\xd1\x46\x61\xa3\x61\xe1\x4a\xdb\x06\xdb\xe3\xc2\x24\x07\x00\x62\x6e\x0d\x59\x4b\x7e\xe6\xc3\xe3\x1a\x37\x31\x5b\x98\x00\x9b\xe1\x20\x2b\x69\x4f\x99\x5e\xce\xf5\x3b\xa5\xe2\x32\xf9\xfc\x13\xb2\xc4\xb6\x9a\xd0\x6c\xaf\xac\x42\xd3\x5d\xca\xab\x41\x49\x2f\x54\x24\x4e\x2a\x7b\x26\x85\xef\x13\x79\x74\x50\x49\x4e\x50\x9c\xb1\x1e\x9f\xb1\x4f\x44\x60\x79\x56\x08\x2a\x9f\x0e\x27\x3d\x4a\x19\x77\xcd\xdf\xeb\x23\xa9\x3c\xdb\xbc\x51\x4d\x33\x78\x67\x65\x47\x18\x34\x82\x48\xb7\x08\x2e\x2c\x05\x91\x34\x03\xb4\xc8\xf9\x9e\x8c\x52\x22\x6a\x19\x94\xdc\x25\x94\xf0\xa5\x1f\xa5\x11\x71\x89\x87\xce\x71\x1f\xca\x15\x21\x02\x10\x6f\x6e\x76\xb1\xee\x7b\xc9\xd1\x24\x8d\x06\x2f\xf7\xac\xb0\xcc\x62\x66\xe3\x8b\xd2\x1e\x06\x29\x2f\xa9\x8b\x42\xbd\x6c\xb6\x07\xcc\xba\xa4\xed\xac\xca\xc2\x6f\x6b\x62\x73\x18\xde\x1b\x0e\xdc\x68\x31\x73\x9a\x0a\x99\x92\x4d\xd4\xae\xe6\x4e\xd2\x1b\xeb\x52\xcd\x12\xf6\x50\x9a\x26\x28\x8f\x54\xc8\x67\x43\x79\x73\xf2\xf0\x34\xef\xf3\xd1\x24\xdb\x05\xd7\x99\xf5\xed\xd2\xa6\x48\x8e\xa6\x76\x79\xdd\xcf\x95\x8b\x29\x8c\xe4\x84\xe7\x0b\xa9\xb3\xce\x42\x2a\xfd\xed\x6a\x2d\xe5\x17\x0c\xe8\x6b\x29\x2e\xae\xa5\x11\x54\xa7\xf5\x0f\xda\x4c\x80\x33\x05\xe1\xbc\xd5\xcf\x3e\x9d\xbe\x26\xce\x85\x2f\xd8\xca\xcf\xf7\x03\x7b\x88\xc3\x90\xdf\xc5\x27\x02\xa7\xd5\x41\x51\xc1\xe6\x1e\xc9\x76\xa0\x38\xca\x7c\xd1\x91\x46\xa7\x55\x19\xc7\xa9\x4c\xd2\xbb\x75\xd6\xc2\x02\x25\x14\x8f\x42\x08\x85\x44\x41\xea\x91\xe2\x06\x92\x5c\x07\x00\x85\x05\x0d\xb6\x00\xf4\xbd\x8d\x57\x62\xa5\xa8\x5c\x93\xa0\xaf\x71\xf7\xb1\x47\x0b\x42\x05\x7b\x94\xb7\xc3\x0c\x2e\xc6\xac\xd4\x8b\xce\x5b\x7d\xa6\xae\x76\xc3\x1f\xa2\xdc\x70\x66\x1a\x5c\x92\x35\x8c\xcf\xc9\x66\xd8\x87\x08\x86\x00\x26\x9e\x58\xf8\xac\x24\x6f\xfa\x3c\xec\x03\xe8\x2f\x16\x96\x40\x2d\x01\x8b\x45\xa2\xa3\xc6\xf3\x13\xbe\x06\xf7\xa8\xf7\x81\xdf\x87\xc4\x97\x04\x8b\x6e\x2a\xed\x3c\xe9\x25\xae\x69\x82\xcd\xe8\x3c\xdc\x74\xfa\x9a\x20\x3b\x0f\xfb\x5e\x92\xfa\x8d\xc6\x06\x96\xcb\xed\x1f\x6c\x5d\xfb\x83\x2f\x31\x12\xa6\x3e\x2e\x65\x57\x42\xc6\x5c\x72\x84\x55\xb9\x42\x84\x47\x56\x48\x7a\x5e\x69\x8f\xba\xfc\xbc\xb0\xe0\xf9\x7f\xe6\x71\xf3\x25\xf6\x57\xe1\xf2\xb6\x6d\xe7\x77\xe9\xc1\x7c\x26\x74\x24\xa2\x5a\xcb\xe7\x59\x63\x7d\x4f\x76\x40\xad\xeb\xea\x88\x0e\x25\xd5\x4e\x0a\x79\x32\x9a\x3c\x14\x9b\x2d\x89\x8d\xe0\x95\x32\xe5\x6a\x28\x42\x49\x89\x72\xf5\x14\x56\xf4\x22\xb5\x18\x6a\xe2\x42\x5e\x73\x99\x25\x68\x78\x6e\x97\xb5\x3a\x21\x5e\xd9\x22\x4b\xb3\x78\x3e\x52\x9a\x18\xba\x5e\x4b\x7a\xc4\xfd\x80\x80\xee\x4f\xe8\x96\xc2\xf5\x0f\x8f\x61\x24\xe9\xdf\x68\xe0\x0d\xa1\x20\x52\x7b\xe0\x4f\xe9\x8c\x20\x66\x76\xab\x6f\x96\x1c\x47\x03\x91\xc6\x3e\x58\xc2\xd4\x4f\x12\x7c\x25\xd2\xe4\x37\xf4\xbd\x8c\xb1\xb1\xd2\x38\x41\x57\xc5\xf8\x14\xc9\xf7\xe2\x0a\x45\xf4\x04\x27\x14\x45\x8c\x0a\x39\xb5\xf9\x84\x03\x6c\x16\x17\x6a\xf9\x41\xb0\xb2\x0a\x2d\xae\xfd\x63\x3f\x0a\x42\xd1\x88\x1e\xa5\x5a\x15\x3b\xa4\x6a\xf5\x72\x5d\x84\x0b\xfe\x9c\xce\xa5\xb5\x42\x2d\xb3\xd5\xba\xcd\x38\x4e\x68\x79\x28\xf4\x9e\x64\x47\x89\x79\x4b\x45\x3c\x15\xff\x60\x52\x75\x6a\xb0\x6a\xd5\xe0\xec\xb2\x53\x6f\xaa\x9d\xaa\x25\x45\x2d\x23\x64\x5d\x81\x0d\xe6\x19\x7b\x01\x35\x2f\x23\xe2\x7d\xe2\xb1\x95\xc7\x74\x12\x96\xce\x3d\xc9\x30\x83\x88\x2c\x16\x11\xb1\x7e\x41\xf0\x1f\x48\xdb\xfc\xfd\x88\xb4\x9a\x55\x9b\xbe\x1f\x51\xef\x23\x72\x97\xcb\x68\x9b\xbd\xed\xc2\x66\xaf\x4f\xbc\xfc\x5a\x09\x1e\x99\x07\x15\x8f\xfb\x5e\xee\x04\x17\x58\x69\xd1\x5c\x22\xbe\x52\xe8\xf8\x3a\x02\xb8\x87\x5d\xe1\x72\x0b\x3d\x5f\x98\x30\x6f\x7d\x42\x9f\x14\x96\xa3\x30\x77\xc0\xaa\x26\xa2\xf5\x9b\x88\x7a\x91\x38\xea\xa5\xc3\xf7\x42\xa5\xe2\x95\xec\x8f\x17\x5c\xc5\x01\x90\xaa\xe3\x6c\xa2\x45\xc6\x4f\xf3\x34\xf3\x2f\x84\xd2\xe8\x07\x30\x14\x37\x7e\x86\x04\x26\x44\x4a\xca\x38\x97\x43\x67\x6b\x4b\x4a\x81\x7d\xb6\xdf\xcf\x2f\xb4\x60\x19\xa9\x62\xaa\xe7\xca\x7b\x57\x1b\x7b\x0c\x51\x16\x96\x23\x2f\xaa\x58\x2a\x58\xb6\xe2\x69\x36\xbd\x0a\xed\x83\x5a\x62\xd2\xc5\xc2\x42\x85\x5c\x8f\x68\x3b\x26\x00\x12\x2d\x28\xa3\xa0\x87\x8b\x3a\x16\xc8\x2e\x10\x2e\xc5\xa8\x14\x10\xd0\x9d\x13\xa2\xba\xee\xad\x80\xa2\x7b\x59\x43\x1a\x89\x7c\xa2\x02\x85\xf3\x88\xde\x0a\x02\x83\x15\xa1\xc2\xf5\x97\x7c\x2c\x79\x3c\x9e\xc7\x4b\x11\x4b\x05\xc5\x78\xa3\x05\x56\xc7\xe4\x8a\xb6\xaa\x8b\x3c\xa0\x39\x87\x31\xa8\x20\xb3\x92\x32\xcf\x50\x9a\xc6\xa4\x18\x93\xc2\xa3\x66\x43\x4c\xa5\x71\xc9\x0f\x41\xab\xc6\x42\xe2\x89\xdb\xb1\xde\xb3\x36\xf3\x42\xc7\xb7\x01\xf1\x29\x92\x62\x47\xc7\x23\x24\x8b\x45\x28\xad\x8b\xbc\x2a\x9c\x9f\x64\x75\xdd\x98\xa4\x4a\x80\x0c\x6a\xe0\x57\xcb\xb5\x01\x59\x2c\x06\xc4\x2a\xc3\xca\x25\x5c\x52\x03\xae\x4a\xd8\x25\xa4\x97\x10\x77\x65\x71\x4d\xee\x75\xec\xb6\xdd\xce\xe4\x5e\x40\xbc\x31\xfa\xfc\xf7\xc1\xd8\x27\x09\xa2\x86\xf9\xe1\xfd\xcb\xe6\x9e\xd9\x75\xd9\x3c\x85\x2e\x89\x63\x3a\x6f\x36\xff\xef\xff\xd7\x76\xaf\x7c\x62\x35\x9b\x83\x20\x69\x8a\x86\x9a\xa1\x7f\x1b\xcf\x68\x33\x99\xfa\x03\xd4\xbc\x49\xa0\x31\xf0\xc3\x81\xb5\x65\x3c\x35\x96\x8a\x5e\xf8\x09\x82\x46\xbb\x05\x8c\xef\x0d\x87\xa0\x09\x00\x5d\x06\xb4\x73\x07\xd0\x64\x22\x81\xee\xdc\x03\xe8\xd6\x1d\x40\x27\x81\x04\xea\xb4\xef\x01\x75\xfb\x0e\xa8\xe1\x48\x42\x6d\xdf\x87\x00\x3b\x77\x51\x35\x54\x54\xdd\x5b\x0f\x6a\x7a\xce\xb2\x05\x8c\xff\xe3\x99\xd7\xc4\x9f\xba\x51\x1c\x21\xb3\x3f\x1f\x86\xe8\xa6\x29\x13\xd8\x9f\x0d\xe1\x8a\xf7\x23\xaa\x57\xfa\xde\x33\xfd\x10\x8f\x22\x37\xa1\x04\xd1\xc1\x58\x55\x1c\x91\xf8\xda\x75\xee\xaa\x33\x26\x38\xba\x54\x55\xc4\x2f\xbd\x52\x37\x07\xd5\xaa\x06\xf5\x7f\xbc\x71\x4c\xf0\x97\x38\xa2\x7e\xd8\x9f\x07\x38\x99\x86\xfe\xad\xcb\xaa\x89\xba\x81\xd8\x64\x8a\x23\x97\xc4\xd7\xdd\xbc\x4b\xec\x9f\xee\x1f\xb3\x84\xe2\xe1\x6d\x13\x53\x34\x49\x5c\x81\x03\xf5\x09\xed\x72\xec\x96\x93\xf9\x63\xf2\xae\xd3\x6a\xfd\xad\x3b\xf1\xc9\x08\x47\x6e\xab\x3b\xc1\x51\x53\x3c\x2d\xef\xb6\x6a\x11\x3b\xa8\xcb\x80\xeb\xd5\x50\x6f\x16\xde\x55\x9e\xa2\x1b\xda\x9f\x0b\x34\xb1\x38\xdf\xbb\x06\xd9\xaa\x46\x86\xc6\x53\xb3\x3f\xaf\xa6\xc3\xbd\x00\x85\x68\x48\xcd\xfe\x5c\x91\x5a\xed\x15\x3d\x10\x1a\x61\x84\xae\x03\x87\xa2\xe0\x5e\xc0\x14\x55\x9b\x03\x14\x51\x44\x4a\xfd\x15\x89\x92\x15\x54\x3b\x22\xf1\x5e\xad\xe4\xd9\x79\x3b\x65\xf4\x1f\x00\xf6\xbe\x38\x77\xbf\xaa\xcd\x98\x04\x88\xb8\xf2\xdc\xa3\x9a\xaf\x85\xb9\xd5\x94\x99\x0f\xa5\x4d\x2e\x3e\xca\x88\xca\x1c\x4d\x16\x38\x5f\xdd\xc8\xc1\xf7\xf3\x87\x82\xcb\x11\xd5\x29\xaf\x90\x2c\x92\xfe\x6b\x51\xbf\x2f\xbe\x07\xab\x38\x65\x2d\x59\x73\xe7\xe4\x48\x50\x38\xbc\x8b\x77\x1e\x11\x8d\xaa\xd9\x23\x64\x6f\x93\x49\x16\xd7\x9f\xd1\x58\x5b\x2f\x64\x16\x17\x13\xa5\xbc\xfb\x61\xab\xcb\x3f\xde\xe5\x35\x04\x56\x25\x20\x25\xb1\xea\x91\xbe\x1f\x3c\x29\x4f\xd7\xee\x68\xb6\x74\xcc\xb5\xd5\x6b\xd5\x3a\x29\x5e\x88\xad\x59\x02\x6b\x60\xc3\xea\xe4\x7a\xc2\xae\xbb\x1c\xac\x04\x25\x49\x71\x2f\x4c\x57\x0d\xd1\x12\xa0\xa5\x05\x65\x25\x98\xe5\x19\xb3\x8e\xc8\x5d\x09\xb2\x8a\xfb\x97\xe5\xfd\x3d\x00\xae\x5a\x35\xbe\x02\xdb\x3b\x96\x07\xc1\x52\xd5\x2b\xc4\xba\xfd\x5f\x29\x76\xef\x01\x72\xb5\xf8\xae\x59\x7b\x1e\x02\x7f\x95\xc8\xce\x20\xdc\x43\x52\xae\xae\xb3\xcc\x7c\x52\x42\xd0\x78\xca\xe5\x83\x12\x8d\x17\x31\xa5\xf1\x84\x27\x7d\x6b\x9c\xea\xb9\xb7\x76\x11\x59\x0d\x50\xc8\x8e\xe5\x8e\xdc\x29\xfb\xee\x25\x99\xef\x03\xa3\x4e\x1a\x17\x61\x8c\x08\x0e\x72\xe3\x84\xfd\xea\x16\x99\x2f\xb7\x39\x72\xc6\x63\x69\xfc\xcd\x5e\x15\xde\xa7\xde\xee\x76\x09\x9a\x22\x9f\x5a\x75\x96\xa0\x78\xe8\x37\x0e\x13\xe8\xb4\x01\x74\x86\x04\x68\x86\x4b\x05\x62\x85\x7e\x91\xf8\x3a\xe9\xcf\x8b\xed\xb2\x34\xd5\xa8\xd3\x86\xac\x7f\xa0\x02\xce\x41\x19\x50\x61\xb4\x2b\x67\xd2\x72\xfb\x15\xcb\x6f\x81\x24\x6b\xd6\xaf\xb3\x13\x96\x24\x7a\x2d\x84\x1a\xbb\xe5\x3e\x48\xac\xd4\x6e\x1f\x20\x77\x6a\x1b\x7a\x88\x4a\xfa\x2d\xf0\x78\x24\x83\x6a\x1d\x82\x2e\xad\xb1\xf7\x5e\xca\x6a\x5b\x79\xb0\x65\x75\x6f\x14\x4c\x25\x12\x92\x01\x41\x88\x2d\x90\x7e\x80\x48\x33\x8e\xc2\x5b\xb3\x3f\x9f\xc6\x09\xe6\xcb\xa7\x7f\x91\xc4\xe1\x8c\x22\x4d\xcf\x1d\x84\x78\xea\xb2\xe5\xd5\x72\xa6\x37\x50\xfb\x3f\xe0\x59\xcd\xa9\xcf\x3d\x00\x09\xa2\xd6\x76\xeb\x6f\xa0\x3b\xf5\x83\x00\x47\x23\xb7\xd5\xbd\x10\x6b\x75\xab\x2b\x9d\x16\xce\xf4\x46\x89\x87\xe9\x4d\x37\xbe\x42\x64\x18\xc6\xd7\xee\x98\xdf\x3f\xda\xbd\x1e\x63\x8a\x84\x6f\x49\x7a\x81\xba\x6c\x41\x69\x75\xb9\xb4\x6c\x65\x8a\xe4\x45\x18\x0f\x2e\x6b\x9d\x3d\xa3\xdc\xa9\xc4\x3e\x5b\x15\xd9\x37\x89\xcc\x14\x52\xed\xff\xfe\x7f\x6d\x50\x51\x2a\x99\x94\x4a\x75\xaa\x4a\x4d\x82\x52\xa9\xad\xaa\x52\xe1\xa8\x54\x6a\xbb\xec\x0c\xcb\x90\xce\xa8\x57\xb7\xd0\x98\xb2\x03\xaa\x60\xde\x89\x15\x35\x78\x67\xca\x35\x3a\xab\x6a\xf0\x8e\x95\x6b\x6c\xd5\xd7\x98\x88\x1a\xd2\x57\xb5\x46\x05\x49\x95\x72\x13\xdb\x2b\x6a\x34\x6f\x0b\x5d\xe7\xfa\x46\x55\xf7\x15\x0b\xaa\x75\x7b\x1d\x12\x35\x6f\x0a\x44\x12\x4b\x74\x15\xa5\x32\xe0\x62\x05\x5e\x87\x98\xcd\xdb\x22\x6c\x1d\xef\x4a\xd0\x25\xbc\x57\xc2\xbe\x29\x0c\x55\x11\xef\xad\xbb\xf1\x5e\x35\x42\xcd\xdb\x22\x6c\x1d\xef\x4a\xd0\x25\xbc\x57\xc2\xbe\x29\x8c\x7f\x11\xef\xed\xbb\xf1\x5e\xc9\x27\xe1\x9a\x34\x59\xaa\x48\x8b\x48\xe9\x1d\x5e\xd9\xe0\x45\xb1\x5e\x89\x0e\x85\xaa\x7f\x9f\xa0\x00\xfb\x86\x35\xc1\x51\x53\x08\xc3\xfd\xfd\xf6\xf4\x06\xcc\x97\xc4\xc6\xdf\x27\xc1\x3a\x92\x23\x2b\x76\x8f\xa9\x34\x61\x95\x6e\xc2\xe5\x09\xbb\xa3\xd7\x29\x56\x1a\xe2\xb0\x60\xd9\x6b\x05\xbf\x87\xae\x3f\xa4\x88\x40\xf7\x82\xef\x4e\xce\x2f\xe2\x9b\x66\x82\xbf\x30\x6c\xc4\x22\xd0\xbc\x88\x6f\xbe\xde\x93\xe6\xba\x49\x18\x53\x8a\x02\xeb\x7b\x50\xeb\xdb\x59\x6d\x29\xd5\x83\x58\xd3\xd4\xd2\x01\xac\x61\x75\x19\x79\xf9\x55\x0a\x40\x1d\x2e\x77\x54\x5f\xd2\x82\xc0\xc3\x6d\xb1\x6f\x8b\x69\x85\x3e\x05\xd6\xb6\xd0\xee\x80\xcd\x35\x78\xf0\x10\x63\xed\x0e\xc0\x02\x54\x05\x55\xbf\x16\xb0\xb4\x19\xc0\xba\x06\xe1\x1d\xe0\x84\x01\x51\x37\x32\xf7\xb3\x26\x97\xe5\xd3\xf6\xee\x4e\x49\x3e\xad\x8d\xd9\xdf\x6f\x92\xaf\x64\x1c\x06\xe1\xdf\xc7\xe5\x8f\x83\xef\x37\xe4\x75\x06\xfe\x5b\xb1\x3b\x83\xfd\xad\x38\x9e\xc1\x7e\x5c\xa6\x67\x10\x25\xdf\x57\x70\x71\x05\x1b\xef\xee\xec\x3d\x98\x8d\x93\xc9\xd7\xb2\x45\x32\xf9\x77\xb2\xf1\xa3\xe0\xfb\x2d\xd9\x38\x99\x7c\x3b\x36\x4e\x26\xdf\x8e\x8d\x93\xc9\x63\xb3\x71\x32\xb9\x1f\x1b\x2f\x6b\x8b\xeb\xb7\x35\x09\xbe\x96\x2d\x26\xc1\xbf\x93\x8d\x1f\x05\xdf\x6f\xc9\xc6\x93\xe0\xdb\xb1\xf1\x24\xf8\x76\x6c\x3c\x09\x1e\x9b\x8d\x99\x11\x72\x1f\x36\x76\xda\xad\xd6\x83\xf9\x38\x1c\x7d\x2d\x5f\x84\xa3\x7f\x27\x1f\x3f\x0a\xbe\xdf\x92\x8f\xc3\xd1\xb7\xe3\xe3\x70\xf4\xed\xf8\x38\x1c\x3d\x36\x1f\x87\xa3\x7b\xf2\xf1\xd6\xd6\xc3\xf9\xf8\x26\xfc\x6a\x6d\x33\xfc\xb7\x6a\xc7\x8f\x81\xef\x37\xd5\x8e\xc3\x6f\xa8\x1d\x87\xdf\x50\x3b\x0e\x1f\x5d\x3b\x0e\x57\xf1\x71\x9d\xef\xe4\x61\x3e\x80\xf5\x01\x54\xf0\xea\xfa\xa1\x3e\xdf\x1a\xb9\x4a\xc6\x7c\xe4\x00\xa0\xf5\x3c\x19\xf7\x8b\x05\x5a\xdb\x89\x51\x06\xbb\x2a\x88\xf1\xa1\x0e\x8c\xaf\xa7\x41\x2d\xdb\xae\x74\xa2\x56\x39\x29\xd6\x6e\x73\x85\xd9\x7f\x2f\x18\xdf\x90\xbd\x1f\x0b\xc5\xff\x7e\x26\xd7\x5c\x18\x8f\xc9\xe7\x45\xef\xc5\xe3\xb1\xfa\x4a\xcf\xc5\xa3\x10\x63\x1d\x86\x5f\xd3\x9f\xb1\x7e\xbb\xf5\x1e\x82\x7b\xc1\xf8\x96\x1c\xff\x48\x28\xfe\x05\x38\x3e\xf7\x76\x3c\x2a\xc7\x17\x1c\x1d\x8f\xc8\xf1\xab\x9c\x1c\x8f\x42\x8c\x07\x72\x7c\x95\xeb\x63\xfd\x76\xeb\x9d\x09\xf7\x82\xf1\x2d\x39\xfe\x91\x50\xfc\x0b\x70\x7c\xee\x18\x79\x54\x8e\x2f\xf8\x44\x1e\x91\xe3\x57\xf9\x43\x1e\x85\x18\x0f\xe4\xf8\x4a\x2f\xc9\xfa\x0d\xd7\xfb\x1d\xee\x05\xe3\x5b\xb2\xfc\x23\xa1\xf8\x17\x60\xf9\xdc\x87\xf2\xa8\x2c\x5f\x70\x9f\x3c\x22\xcb\xaf\x72\x9d\x3c\x0a\x31\x1e\xca\xf2\x55\x0e\x95\x7b\xe8\x53\xb5\x2e\x8a\x7b\xc1\xf8\xa6\x9a\xfc\xe3\xa0\xf8\x17\x60\xf9\xdc\xdd\xf2\xb8\x9a\x7c\xf8\x8d\x34\xf9\x15\x5e\x96\x47\x21\xc6\x5a\x2c\xcf\xeb\x8a\xd3\x93\xc3\x38\xa2\xcd\xa1\x3f\xc1\xe1\xed\xf2\x61\x5b\x7a\x3b\x8d\x47\xc4\x9f\x8e\x6f\x9b\x5a\x39\x68\x98\x47\xa1\x4f\x30\xbd\x35\x8e\x30\xbd\x35\xa1\x61\x1e\x5e\xa1\x08\x13\xe3\x35\x7f\x09\xc5\x48\xfc\x28\x69\x26\x88\xe0\x21\xe8\x6a\x5e\xaa\x56\xc9\x09\xd8\xd2\xf0\x28\x74\x98\xc7\xaa\xba\x32\x9e\x67\x75\x19\x11\xec\x53\x57\x48\xa3\xdc\x1d\xe0\x0a\x25\x57\x03\xcd\xdc\x5f\x77\x80\xd4\xca\xc9\x90\x24\x15\x3e\x1a\xc5\x11\xca\xfb\xfe\xbd\x27\xd3\xfb\x50\x4b\x4b\xc4\x61\x92\x42\x1a\xbf\x7c\x7f\xfd\x21\x1b\x8b\xf8\xda\x87\x8e\xdc\x20\x0e\x63\xb2\xb2\x01\x5e\xa2\xb9\xd5\x6a\xc1\xa5\x52\x22\x2b\xbb\x02\x03\xc7\x51\x73\xbf\xd5\x82\xff\xd5\x76\x3a\x9d\xce\x85\x3a\x88\x2d\xba\x75\x11\x07\xc5\xbe\x4f\x50\x92\xf8\x23\x54\xa6\x47\x1c\x05\x3e\xb9\xed\xcf\xd7\x45\x6c\xbb\x1e\xb1\x8b\xd0\x1f\x5c\xc2\xff\x6a\xb5\x5a\x45\x54\x70\x14\xe2\x08\xa9\x10\xb3\x92\xf4\x52\xc3\x27\x0a\x35\x2b\x83\x80\x8b\x03\x2a\x86\x2a\xc1\x5f\xd0\x4a\x74\x65\xf1\x66\x56\x1a\x8a\x43\xed\xad\xda\x43\xed\x85\x93\xf2\xbc\xda\x35\xd2\x62\x13\xd7\x68\x46\x94\x87\x5b\xad\x16\xe8\xf2\xee\x8c\xd7\x07\xa0\x95\x87\x8e\xed\xa0\x09\x7f\x1f\x88\x22\xc2\x43\xa7\xf3\xf8\xbf\x3b\xa0\x14\xaa\xc0\xa6\xdd\x72\xda\xdb\x68\x02\xaa\x08\x99\x4d\x21\x15\x5f\x6e\x9a\xc5\x60\x6c\x15\xdf\xdd\x92\xd1\xdd\x65\x59\xc3\x09\x6a\x2d\x1f\x22\xd1\xf0\xa2\xf1\xb4\x39\xf2\xa7\xaa\x63\xb6\xb3\xb5\xcb\xd0\x31\x36\xc5\x15\x03\x2b\xeb\xd6\x53\xc6\x68\x1a\xec\xcf\x53\xa3\x0d\xc0\xf7\x4d\x87\x81\xb3\x5b\x9d\xdd\xda\x7e\x72\x91\x72\xff\x6e\x32\xf9\x2a\xfb\x68\x39\x68\x62\x34\x97\x19\x67\x8d\xae\xae\xae\xe5\x27\x03\x7e\xc7\x48\x5e\x6d\xb7\xd5\xb9\xbb\xda\x4d\x56\x7e\xdb\x61\xfd\x7e\x74\x8a\x36\x0d\xbb\xb5\xb5\x55\xa2\xa8\x2e\x2b\xef\x9c\x80\xbc\x70\x79\xfa\xad\xb8\xa9\xe2\x41\xd3\x4f\x6b\xe4\x21\x93\x4f\x54\x2f\x91\x63\x67\x67\x67\xf7\x9e\xd3\x4f\xc2\x59\x9a\x7c\xad\xbd\x4e\xa7\x53\x49\xc4\xbf\xfa\xe4\x5b\x45\x99\xf5\xa6\x9f\xea\xe7\x7f\x26\xdf\x03\x28\x5a\x39\xfd\x94\xfa\xb2\xe6\x04\x94\xc5\x97\xa6\xe0\x23\xaf\x80\x85\x66\x1e\x32\x09\x15\x80\x22\x69\xda\xf7\x9c\x82\x19\x94\xe5\x15\xb0\x86\x8c\x7f\xf5\x29\x58\x4f\x97\xf5\x26\x60\xde\xcf\xff\x4c\xc1\x7b\x53\xb4\x72\x02\x72\xa5\x7a\xbe\xee\xc4\x60\xa5\x97\x67\xc5\x7a\x73\x37\xaf\x9b\x4f\x5c\x67\xcd\xb5\xf3\x1e\x93\x86\x37\x53\x31\x63\xb6\xda\x7b\x3b\x7c\xfe\xad\x39\x85\x05\x9c\x02\x55\xb7\xda\x7b\xdb\x65\x8e\xe4\xf4\xfb\xab\x4f\xbb\x15\x7d\xa9\x9a\x77\x65\xe9\x22\xfb\xf8\x9f\x29\x77\x7f\x6a\x56\xce\x39\x65\xb7\xae\xb9\xe8\xc9\xe2\x4b\x73\xa7\xfe\x36\xb7\x07\x2d\x7a\x85\x66\xe4\xf4\x96\xf6\xe5\x9a\xcb\xeb\xba\x53\x4b\xb5\x54\x92\x59\xdb\xf7\x5c\x1e\x33\x30\x6b\x18\x88\x8a\xe4\x7f\xf5\x99\xba\x82\x34\xeb\xad\x90\x79\x47\xff\x33\x5d\xef\x4f\xd2\x3a\x1d\x55\xb9\x94\xd6\xd6\x52\x45\x85\xa5\x29\xdb\x79\x74\x3d\x55\x6f\xe8\x81\x9a\xaa\x04\x51\xa2\x4f\xa7\xb5\x7b\x5f\x93\x51\x83\xb5\x6c\x36\xee\xee\xec\xb7\x6b\x09\xfb\x57\x9f\x96\x77\x51\x69\x6d\xed\x35\xeb\xef\x7f\x66\xe7\x03\x29\x5b\x31\x45\xff\x8f\x17\xe2\xe8\x72\x1d\x87\x2f\x2b\x27\x5c\xbb\xf5\x1e\xdf\x19\x6a\xee\xb5\x5a\xf0\xbf\x5a\xad\x9d\xd6\x9e\x0f\xf4\xf3\xdd\xac\xb1\x66\x80\x06\x31\xe1\xaf\x73\xb9\x33\x46\x26\x86\xb7\x56\x46\x9f\x78\x38\x1a\x23\x82\xa9\x7e\x73\x67\x26\x40\x96\xf2\x96\xfa\xe3\x8e\xe3\x2b\xce\x23\xeb\xf7\xaa\xc9\xab\xac\xec\xdb\xbe\xe8\xdb\xd6\xc5\xce\x05\x58\x3a\x75\xad\xb7\x7e\x85\x13\x4c\x51\xe0\x46\x31\xb5\xb4\x4c\xf1\x14\x5f\x1f\xdc\x0f\x2f\x09\xac\x0e\xb3\xd0\xbf\x12\x2c\xb7\xc3\xb0\xeb\x5c\x6c\xb5\x06\xe8\xab\xb0\x7b\x08\xed\x24\xc8\xd5\x34\xcc\x30\xdd\xe5\xdb\x14\x5b\xed\xfd\x41\x7b\x19\xd3\x00\x5f\xe1\x00\x91\xfc\x76\xa3\xc2\xac\xce\x41\xfb\x21\xf6\x93\xa6\x78\x4c\xba\x29\x8f\x9f\xf3\x19\xdf\x74\x5a\x2d\xb9\x66\xac\xb7\x64\x94\xaf\x28\xe1\xc7\xda\xf9\x33\xe1\x77\x34\xb7\x72\x36\x14\x36\x66\xda\xac\xc7\x83\x8b\x60\x2b\xd8\x03\xc0\x68\xf1\xff\x7e\x83\xae\x18\xfc\x82\x96\xe2\x88\x8f\xc6\x74\x7d\x23\x55\x2b\xd7\xe4\x55\x61\xa7\xd5\xaa\x63\x26\x34\xa4\xfd\x39\x9f\xd7\x79\x48\x6f\x75\x51\x22\xb0\xd0\xca\xf2\x94\xea\xc2\x62\x9b\xbb\x50\x5a\x24\xd5\xa0\x31\x46\xf9\xa5\x08\x76\x6b\x7b\x7a\x63\xb4\xca\xf9\x55\x6b\xa4\xb6\x2a\x34\x6d\xa7\xbd\x85\x26\x35\xeb\xc8\x32\xb0\xa5\x05\xa8\xb8\xa0\x36\xed\x76\xdb\x59\x03\xdc\xf7\xde\xb8\x5d\xd8\x80\x1b\x77\xfe\x6d\x3b\x8f\xb9\x30\x75\xec\x2d\x82\x26\x05\xbd\xa9\xdd\x6a\xc9\xad\xc9\xff\xea\x74\x3a\x05\xb1\xec\xd8\xbb\xce\x56\x07\x4d\xca\xba\x0d\xb3\x1c\x76\xb9\x21\x57\xea\xdf\x5f\x41\x3d\x51\x48\xaf\xa7\x6a\x70\xa4\xff\x37\xe9\x18\xb5\xe4\xa9\x54\xe9\x33\x26\x95\xdc\xc3\x24\x4f\x89\x45\x5a\xfb\xad\xfd\x6a\x16\xe9\xec\x74\x76\x4a\x2c\xd2\xf9\x8b\xb0\x88\x40\x7a\x4d\x16\xe9\xfc\xaf\x63\x91\x1a\xf2\xe4\x2c\xc2\xaf\xeb\x9f\xfb\x61\xa8\xee\x09\x2f\xd1\x83\xa9\x08\x17\x38\xc4\xf4\x56\xe9\x6f\xdd\x6f\x1d\x18\xc3\xc6\xc6\xc7\x91\x2b\xc2\x45\xba\x95\xd7\xd5\x68\x0a\x66\xf3\x1a\x5d\x5c\x62\xda\xf4\xa7\x53\xe4\x13\x3f\xe2\x37\x94\xe9\x0a\xea\xca\x1b\x70\x96\x95\xd2\x24\x8c\xe9\x37\x0f\xfe\x51\x44\x96\x7c\x98\x68\xed\x17\xef\xb0\xd1\xf0\x50\xf4\x5f\xc6\xbe\x50\xc7\x75\xa7\xa1\x3f\x40\xe3\x38\x0c\xd6\xd2\x07\x85\xde\xd3\x5e\x33\x56\x85\xab\xab\x5b\xc3\x1d\x67\x67\x1f\x48\xee\xb1\xce\x3f\xe1\xa4\xe9\x47\x83\x71\x4c\xfa\x00\xca\x34\x12\x87\xc8\xbb\x98\x51\x1a\x47\x4c\x75\x9e\x91\x24\x26\xee\x34\xc6\x25\x95\xa0\x02\x82\x51\xb8\x06\xa8\x0a\x5c\xa1\xc4\x9d\xb0\xf5\xaa\xe7\x01\x4e\xfc\x8b\x10\x05\x39\x4e\x51\xcc\xf4\x95\x30\xbe\x46\xc1\xda\x75\x2b\x11\xa8\x04\xd4\x95\x68\x35\xd1\x15\x1b\x67\x11\xe1\x24\x81\x0b\xc5\xb5\x0f\xa0\xfa\x2a\xc4\x41\x2d\x23\x23\x4a\x7d\xef\x0d\xfd\x30\x41\x7d\x30\xaf\xbb\x74\x4f\xd1\x74\x18\x0f\x66\x09\x47\xd7\xc6\xd1\x74\x46\xe1\x72\xc6\x39\xff\x64\xbd\xea\xab\x5c\xea\x5f\xf0\x07\x85\x3d\xb3\x65\xf6\x5d\x9e\x0f\x56\xe5\x15\x60\x14\x4b\x68\x39\xa2\xf0\x3c\x9e\x51\xb6\xe8\xd4\x69\xe8\x9c\x54\xbe\xe0\x34\x59\x14\x1e\xe3\xd1\x98\x2b\xb5\x46\x12\x87\x38\x30\xda\xd3\x1b\xd0\x95\x99\xcd\x78\x38\x4c\x50\xad\x7d\x51\x01\x4e\xd6\xe0\x57\x24\x66\x01\xae\x4a\x84\x4c\x70\xd4\x0c\xd0\x15\x1e\xa0\xe6\x14\xdf\xa0\xb0\xc9\xad\x5e\xb7\x05\xe6\xff\xa3\x48\x2a\xbb\x0b\x99\xd2\xed\xcf\x68\x6c\xa8\xfe\x73\x80\x4d\x82\xa3\x91\x98\xfa\x20\x4d\x3f\x77\xb3\x27\xe3\x67\xc4\xa2\xd0\xb6\x6d\x94\xbd\xa4\x83\xec\x61\x4c\x5e\xf8\x83\xb1\x65\x9d\x23\x48\xfa\xc0\x3b\x98\x53\x3b\xa1\xb7\x21\x3a\x47\x7d\x8f\xa4\x00\xd2\xfc\xc9\xf9\x31\xb1\xa8\xaa\xfa\x59\x2c\x50\x4f\xe6\x34\xad\x33\x91\x40\x66\x20\x7d\x96\xaf\x7e\x4d\xc5\x4b\x5b\xc0\x3b\x30\x27\x88\x8e\xe3\xc0\xe4\x0f\x95\x5e\xe2\x28\x68\x34\x90\x1d\xa0\x84\x3f\xd0\x17\x93\x46\x63\xc3\x32\xf9\x0b\xb4\x26\x66\x58\xe6\x39\xa0\x77\x36\xb4\x3e\xc5\xd6\x3c\x85\x08\xc0\xf9\x10\x47\x38\x19\x23\x62\x11\x30\x57\x8f\x43\xbd\x25\xf1\x14\x11\x7a\x6b\x21\xfb\x12\xdd\xf2\x47\xc7\x80\x3b\x67\x8d\xb8\xe6\x10\xa3\x30\x30\xe1\x25\xba\x75\xc5\xcb\xbf\x16\x80\x5c\xda\xf2\x77\x78\xcc\xf8\x3a\x32\x61\xde\x98\x3b\x4f\x61\x4c\xf0\x08\x47\x7e\xf8\x33\xba\x75\x05\x40\xb9\xce\xe2\x2f\xfc\x4d\xa2\x8a\x87\xe0\x90\xad\x15\x91\x6f\x48\x9e\xf3\xba\x7d\xaf\x90\x97\xbf\x0b\x0a\x40\x0a\xd7\xec\x4b\x3e\x9e\x43\x6d\x3c\x2c\xf1\x7e\x99\xf6\x58\x1c\xff\x44\xfa\xcb\xfb\x65\x98\x04\x52\xe0\x4e\xc5\x8b\xf4\xf9\x28\x8f\xe4\x13\xf5\xc9\x35\xa6\x83\xb1\x85\xd8\xc8\xb0\x8e\x81\xf9\xc0\x4f\x90\xc1\xdf\x03\x75\xf9\xe7\x1b\xce\xa0\xae\xe4\x25\x36\x28\x04\x0d\x43\x96\xb4\xe1\xb0\xe1\xe9\xf2\x52\xe2\x95\xd0\xca\x52\x2d\xe8\xab\xb7\x0f\xdd\x5b\x8b\x02\x38\x88\xa3\x2b\x44\x28\x22\xee\x9c\xc6\xd9\xbb\x88\x2e\xf5\x0e\xa8\x78\x73\x3a\xcd\xe1\xbe\xe6\x8f\x10\xaf\x05\x37\xaf\xf4\x2c\x8e\x43\xe4\x47\x5f\x8d\x4d\xcf\x34\xf9\x03\x6c\x70\x48\xe2\x49\x21\x4b\xd1\x31\x1f\x1a\xf9\x32\x19\x6d\x34\x4c\x73\x93\x6e\x78\x26\x17\xff\x66\xca\x9f\xe9\xcb\x30\x7b\xee\x53\x54\x4d\x4a\x1d\x8f\xa5\xe6\x22\x74\xcd\xab\x66\xc0\x02\x34\xf4\x67\x61\x61\x54\x58\x7a\x9a\x0f\xf0\x64\x99\x6d\xac\x1c\x6b\xf1\x42\x60\xf6\xc4\xa3\x78\x08\x4d\xbe\x6b\xd6\x2d\xfe\xf4\xf4\xbe\xe2\xa1\x78\xff\x97\xa0\x3f\x67\x98\xa0\xa0\xd1\xf8\x95\x4a\xce\xef\x83\xfc\xb1\xbb\xbc\xc0\xa9\xd8\xe4\x58\x2c\x72\x28\x9e\x79\xed\x93\x08\x47\x23\xb3\x88\x05\xb1\x69\x7c\x12\x0f\xfc\x10\x9d\xc4\xd7\x88\x1c\xf9\x09\xca\xde\x7d\xfb\xfc\x64\x7e\xc1\x3a\xef\x1a\x4f\xe6\x28\x35\x70\x62\xa8\x06\x0c\x1a\x1b\xb3\x04\x19\x4f\xe6\x38\x35\x06\xf1\x64\x1a\x47\x28\xa2\xb6\x71\x86\xa8\x41\xc7\xc8\xf8\xe9\xcc\x50\x53\xc1\x88\x89\x71\xfc\xfe\xf4\xc4\xc8\x68\x6b\xff\x1e\xfd\x1e\x7d\xde\xb4\x86\x16\xe8\x7d\x3e\x8c\x46\xb3\xd0\x27\xae\xf1\x03\x87\x75\xce\x5a\xea\x7b\xa6\x6d\xdb\xe6\xc1\x0f\x4f\x59\xda\xc1\xef\xd1\x67\xfe\xea\xaa\x75\xc5\x2a\x7c\x9c\x21\x55\xd8\x65\x85\x6b\xca\x4e\x58\xd9\x77\xc8\x1f\x50\x5e\xba\x82\x75\x2e\xac\x8a\x44\x6a\x27\xd3\x10\x53\xcb\x6c\x9a\xc0\x9e\xf8\x53\x4b\x0a\x55\xd4\xa3\xf6\x60\xec\x93\x43\x6a\xb5\x80\x4d\xe3\x0f\xd3\xa9\x22\xd6\x26\xb5\x93\x10\x0f\x90\xe5\x00\x4e\xcb\x8c\x8a\x2e\x05\xf6\x1f\x31\x8e\x2c\xd3\x04\x29\x7f\x72\xdc\xc2\x20\x35\x9e\xcc\x23\x0f\xc1\xc8\xe6\x27\x0d\x92\x5f\x30\x1d\x5b\xa6\x4f\xb0\x6f\x82\xde\xad\x15\x01\x37\x4a\xbd\xb9\x6d\xdb\xa9\xf1\x34\xeb\xcd\x67\x46\x40\xd5\xeb\x27\xf3\x5b\x0b\x81\xa5\x7e\xff\xe4\x5f\xf9\xf2\x11\x56\x23\x88\x07\xfc\xb5\x40\xfb\xcf\x19\x22\xb7\x67\x88\x71\x7b\x4c\xac\xef\x58\xd1\xef\x80\xcd\x47\xd3\x33\xbe\xb3\x6d\xfb\xbb\x2e\x1f\x0c\xfe\x28\x61\x94\x5a\x39\x0b\x41\xf9\x2e\x9e\x7c\x41\x98\x3f\x1e\x6e\x22\x42\x62\xc2\x16\x96\xbc\x1c\xa0\x63\x12\x5f\x1b\x2f\x58\x8e\x45\x41\xf7\xbd\xcd\xf8\xcc\x12\xaf\xe8\x81\x14\x37\x1a\xb8\xf0\x44\x73\x9a\xb2\x79\x01\x29\x80\x43\x62\x8d\x08\x17\x94\x80\x4f\x15\x4d\x4e\x5e\x2d\x4f\xa3\x8c\x61\x65\x1d\xf5\x34\x21\xe6\x6f\xa0\xcb\x19\xed\x6d\x6c\x2c\x3d\x43\xaf\xf2\x40\xa3\x91\x7d\xc3\xac\x06\x5b\x0d\x97\x6a\x64\xb2\x0a\x70\xe0\xd9\x4f\xcf\xfc\x64\x6e\xde\x5a\x04\x00\x8e\x3d\x16\x78\xa7\x29\x23\xde\x2d\x81\x17\x04\x1e\x89\x77\xdf\x2e\xd1\xed\x90\xf8\x13\x94\x18\x43\x3f\x40\xaf\xa2\xc3\x28\x78\x33\xa3\xf3\xd6\xdf\x20\x8d\xe7\xf1\xd4\x1f\x30\x93\xb1\x95\xee\x6e\xff\x2d\xfb\xe5\xa4\xd2\xdc\x6c\x0a\xf5\xc2\x1d\xcc\x08\x41\x11\x3d\x62\x3f\x2a\x83\xc8\x97\xfd\xc7\x52\x41\x10\xaf\x9c\xed\xde\x2f\x2e\x40\x98\xf4\x8f\x03\x4b\x7b\xee\xeb\xf1\x00\x3e\x2a\x82\xea\x61\xb2\xec\xb4\x94\x70\xca\x4e\x70\x10\x84\xa8\x3b\xc4\x61\xa8\x5a\xe2\xaa\x5e\xf1\x54\x83\x4a\x12\x96\x78\x42\x09\x1e\xd0\xae\xb4\x73\x94\xd1\x99\x5c\x8d\x8a\x26\x88\x32\x3c\x12\xfc\x05\x7d\xef\xdd\x24\x7d\x30\x5f\x4d\xa2\x6d\xd1\xa5\xfa\x27\xea\xd6\x1f\xbe\xfb\x81\xba\x7b\xf4\xee\x0f\xef\xf1\xd0\x2b\xd2\x31\x99\xdc\x49\xc7\xff\xcc\x83\x35\x69\x39\x09\xee\xa4\xe5\xfe\xfd\x62\xdc\x57\xa2\x7a\x4f\x58\x77\xd3\xf2\x01\x00\x1f\x11\xc1\x22\x2d\xc3\xd1\x9d\xb4\x74\x1c\x01\xbf\xf3\x18\x8c\x79\x5f\x60\x77\x53\xf3\x21\x10\x1f\x13\xc5\x92\xbc\x0c\xef\xa6\x67\x1b\xde\xf5\xa8\xe7\x3d\xe8\x79\x4f\x60\x6b\xd0\xf3\x01\x10\x1f\x13\xc5\x12\x3d\x75\x82\x72\x30\x75\xad\x74\x44\x2b\xbb\xf5\xcf\xba\x16\x76\x6b\x2b\xbc\xf1\x0f\x10\xf2\x6a\x74\xfe\x8a\x98\x69\x43\xfd\x57\x45\xef\x2f\x4b\xbc\x22\x13\x0e\x31\xcd\x99\x90\x5f\xf7\x97\x1f\xa0\x2c\x6d\x74\x64\x15\xa9\x4f\x67\x89\x97\xcc\x06\x03\x94\x30\x1d\x4a\x69\xcb\x65\x07\x9f\x28\xd8\x94\x05\xe1\x32\x72\xc2\x7d\x3f\xe2\x4f\xca\xec\xb6\x5a\xd0\xf8\xaf\xad\xf6\x9e\xd3\x42\x1a\x92\xa2\xad\xc0\x8f\x46\x88\xdc\xdd\x94\x28\x57\xdb\x12\x41\x81\x6c\x07\xb5\xda\x6d\x7e\x82\xb4\xd8\x8e\x34\xcf\xef\x6e\x48\x16\xe4\xf1\x1c\xa8\xb6\xbd\x78\x30\x26\x88\xef\x48\x18\xff\x35\x1c\xfa\x3b\x15\x2d\xe2\x68\x18\xdf\xdd\x1c\x2b\x75\x47\x5b\x59\x94\x94\x91\x85\x49\xa9\xa6\x70\xc4\x9f\xb3\xab\x6c\x66\x75\x6c\x89\xa1\x82\x4b\x14\xa8\xec\xa9\x3c\x6f\x36\xed\x83\x39\x25\x7e\x94\x0c\x63\x32\x71\x49\x4c\x7d\x8a\xac\x56\x45\xc9\x20\xbe\x8e\xaa\xca\x3a\x7b\xad\x00\x8d\x2a\x2a\x88\xb0\x8e\x8a\x1a\xfb\x35\x15\x78\xc8\x48\x45\xf9\xf6\x6e\xa1\xc2\x30\xc4\x53\xfd\xb8\xb8\x5e\x23\x19\xf8\x21\xb2\x9a\x0e\x30\x44\xdd\x7f\x96\xd1\xe3\x95\xb3\x83\xe1\xab\xaa\xfe\x9a\x55\xb5\xfd\x10\x11\x0a\xed\x0b\x3f\x18\xa1\xb9\x66\xd1\xf0\x84\xa5\x38\x9f\x2a\x56\xbe\x83\x93\x33\x46\xce\xf0\xe4\xa0\x0b\x93\x53\x6b\xec\x5b\x4c\x51\xd1\xa0\x36\x43\xd7\x68\xef\xc1\xf3\x94\xc3\xfe\xbe\x30\x4f\xd7\x68\xee\xeb\x67\xab\xe8\xa4\x34\x2c\x97\x9a\xd5\xdd\x04\xe5\x1a\x72\x7a\xaf\x81\x25\x2b\xbb\x7a\x7a\xef\xca\xe9\xbd\xbb\xef\x07\x35\xb8\x35\x29\xc1\x7e\x34\x0a\xd1\xfa\x48\xf6\x0b\x02\xe2\x9b\x8f\x5e\xc6\x9b\xf7\x6d\xf6\xab\x99\x34\xe7\x9b\xfb\x36\xfd\x48\x0c\xf4\x7d\xc6\x41\xb5\x08\xdc\xc1\x4a\xf7\x45\xfc\xde\x3c\x65\xb3\x52\x7c\x4b\x2e\xf2\xc3\x66\x10\xd3\xa6\x33\xf7\x23\x3c\x11\xd1\xb5\xba\x27\xcd\x70\xec\xbd\xc4\x40\x7e\x82\x9a\x38\x32\x5a\x89\x81\xa3\x21\x8e\x30\x45\x15\x30\xda\x77\xc3\x88\x67\xd4\xb0\xb7\xda\xed\x95\x70\x3a\x6b\xc2\xd9\xd9\xdd\xd6\xe0\xa8\x5d\xd4\x29\x41\x43\x44\x12\xc6\xa0\xb3\x01\x0a\x9a\x93\x98\x01\x02\xf3\x8a\x3e\xc3\x8a\x3e\x54\xa4\xe9\xf8\xf0\x8d\x73\x7d\x3b\xf2\x90\x14\x7c\xda\x7c\xb4\x1a\x0d\xcb\x2c\xcf\x54\xd3\xf3\x3c\x99\xbd\x58\xa8\x1d\x82\xaa\x5c\x90\x5a\x17\xc4\xbb\x25\x8b\x85\x75\x4b\xbc\x79\x0a\x80\xfd\xcc\x0f\xce\xf0\x17\xf4\xd1\x0f\x67\xc8\x33\x2f\xfc\xa0\x29\x76\x15\xe1\x05\xb1\x3f\xfa\x21\xe6\xb9\x62\x87\xca\x13\x1b\x8e\x4d\xcc\x98\x83\xf0\x4d\x08\x55\xe8\xf5\x6c\x82\x08\x1e\x2c\x95\x8b\x44\x3a\x2f\xf8\x1a\x87\x5a\x4b\x79\x11\x1c\x9a\xdd\x41\xe8\x27\x89\x71\x46\x0c\x74\x43\x51\x14\x24\x46\x4c\xe6\xda\xbe\x9c\x05\xe6\xc9\x6c\x8a\x88\x65\xdb\xb6\x4f\x46\xdc\x2b\x9e\x00\xe1\xda\xfe\x94\x8c\xfd\x29\xf2\xcc\x59\x74\x19\xf1\xdd\x49\x9e\xca\x37\xd2\xbd\x0d\x47\xfc\x92\x3c\xef\x6d\x38\xa9\x08\x26\x36\x46\x88\x1a\x7c\x17\x37\xb1\x14\x85\xcf\x03\x02\x8f\x48\x3f\xe5\x59\x0c\xa6\x95\xd3\x3e\x6f\x28\x4d\xb2\x6c\xb1\xa7\xa3\x6f\x0c\xa9\x0a\x1b\xbf\x52\x8b\x82\x46\xe3\x1f\x54\x6c\x1d\x4a\x47\xba\x04\x91\x6d\xf6\x20\x4f\x4b\xed\xea\xbd\x91\xe5\x09\xfa\x73\x86\xd4\x6e\x92\x65\xf2\x3c\x93\xef\x55\x71\x24\xf1\x97\x65\x1c\xf1\x17\x89\x22\xcb\xac\xc7\xd0\xa8\xd8\x35\x39\xa1\x96\x18\x40\x48\xc1\x62\x11\x5b\x94\xef\x77\x54\xf5\x02\x7f\xa9\xe8\x04\xfe\x92\xf5\x01\x7f\x61\x5d\x28\xb6\x2b\x4a\x13\xaf\xa2\x61\xd6\xd4\x62\x61\x72\x46\xed\xdd\x16\x39\xc5\x5d\x2e\x7f\x6e\xde\xdc\x24\x26\x34\xf9\x3f\xc9\xc4\x84\xe6\x24\x30\xa1\x19\x8e\x58\x5a\xc8\xfe\xb9\x09\xcd\xbe\xcd\x23\x0a\xde\x0c\x2d\x0a\x0e\x9a\x0e\xeb\x09\x03\x5d\x62\x69\x77\x03\x27\xaf\xfd\xd7\xd6\xd4\x27\x09\x7a\x15\xb1\x8e\x3a\x2d\xc0\x37\x19\x26\x3e\x1d\x8c\xad\xa7\xff\x3a\x6f\x35\xf7\x8d\xfe\xe6\x93\xa7\x79\xfd\x02\xb7\xbb\xb7\xa4\x30\x89\xd2\xaa\x0d\xa9\x42\x0f\x4d\xd3\x2d\xee\x26\x7a\xa6\xa9\x6f\x28\xca\xbd\x2b\xc3\x04\x30\xf2\x78\x1d\xd2\xc3\xf6\x10\x87\x14\x11\x8b\x7a\x07\x74\xc3\xf3\x10\x70\x31\xdf\xd9\x62\xbf\x3d\xcf\x43\x3d\xe2\xe6\xdb\x29\x91\x1d\xa2\x68\x44\xc7\x07\xad\x5e\x24\x37\xaf\x0c\x13\xb8\xa6\xc9\xc6\xd0\x1c\x62\x6a\x82\xd4\x42\x00\x40\xec\x6d\xc4\x16\x02\x8d\x06\xca\xc8\x25\xb2\x0f\x9a\x4e\x37\x44\xd4\x60\x08\x74\xe5\x46\x37\x91\x1b\xdc\xd5\x64\x50\x4d\x7b\x63\x92\x93\x93\xb5\x71\x15\xe3\xc0\xc2\x3d\x1e\x5b\x71\x6e\x72\xe3\xd0\x84\x26\x33\x0f\xcd\x3e\x3c\x37\x85\xe5\xa8\xa7\x64\xc6\xaf\x09\x23\xf5\x5b\x95\x8a\xfa\xc0\x2d\x42\x8a\x74\x20\xd1\x1a\xf5\xe5\x76\x72\x05\x33\xa8\xf4\x02\xff\xc9\x7e\xf1\x6d\x25\x6d\xd8\x44\x94\x48\xde\x9f\xac\x1b\x5a\xeb\x7a\xcb\xfd\x2c\x90\x04\x15\x43\x48\x4c\x33\xe5\xf3\x2c\xdb\x97\xee\xa6\xa9\xda\x66\xab\x96\x02\xf8\x8b\x14\x02\x33\xb1\xcb\x2c\xa7\x39\xb5\xc7\x7e\xc2\x16\x87\x08\x91\x37\x3c\x04\xc8\x64\x8c\x2c\xe4\x5f\x96\x76\xd0\xca\xb7\x9a\xc7\xc4\x6a\x3a\xdf\x97\x4b\x00\x88\x3c\x11\xbc\xe2\xb4\x5a\x7f\x33\x36\x8d\x27\xf3\x31\xb1\xda\xcb\xe5\x52\xf0\x59\x4c\xf8\xe4\x6a\x24\xfa\x63\xf3\x8e\x7b\x72\xd3\x31\x4f\x16\x34\x58\x4e\x17\x3b\x38\xde\x67\x1e\x24\xd3\x32\x5a\x06\xfb\xf8\x9c\xa6\xfa\x1e\xba\xec\x1d\x97\xff\x76\x29\x43\x4a\xf7\xe4\x28\x8e\x22\x34\xa0\x28\x00\x73\xc6\xb4\x34\x5f\x0d\x24\x82\xb3\x0b\x11\xb1\xc2\x6c\xbd\x97\x36\x5b\x03\x90\x80\x92\xe5\x5d\x20\x3e\x30\x26\x1e\xc4\xd1\x3b\x34\xc2\x09\x25\xb7\x32\xf8\x06\xdd\x36\x1a\x3f\xda\x44\x26\x9e\x0b\x88\x4c\x14\xf7\x1b\x0d\x36\x17\xf3\x84\x46\xc3\xa2\xda\xcf\x15\x42\x1c\x80\x14\xa4\x69\x80\x93\x81\x42\xfd\xc8\x0f\xc3\x0b\x7f\x70\x69\x81\xf9\x95\x4f\x0c\xda\x15\x3d\xae\x2e\x02\xc5\x6e\xa7\x97\x35\xa7\x75\x10\x2c\x16\x62\x0f\x94\x09\x9b\xc5\x82\xda\xb3\x28\xef\x23\x48\x09\x0f\xc0\xb5\xd6\x5d\x08\x52\xab\xba\xeb\xa0\xf7\x23\xfa\xfc\x43\x32\xf5\x23\x43\x30\xc5\xf1\xfb\xd3\x13\xcf\x7c\x32\xaf\x2e\x9e\x9a\x07\x3f\x3c\x65\xa5\x0f\x3e\xbb\x5f\x58\xc5\xab\x51\xa9\x9e\x8e\x07\x23\x00\x82\x04\x62\x18\x41\xbf\x2b\xd8\x35\xf4\x44\x94\x88\x67\x21\x4f\x6f\x43\xe1\xd3\x68\x64\xa1\x3d\xa8\x87\xdc\xbc\x88\x2d\x79\x81\xcb\xb3\x84\xc9\x57\xa6\x1b\x34\x1a\xa1\xf8\xe8\xc9\xbf\x6e\x68\xcb\xe0\xb1\x6e\x59\xe3\xda\xe0\x8a\x58\xa3\x61\x65\xb5\x7b\x0a\x17\xe2\xc9\xea\xcf\x58\xd1\x40\xc7\x82\xf4\x88\x9b\xb8\xaa\x20\xf6\x32\xf8\xcb\x45\x71\x0f\xbb\x09\x80\xf5\xcd\x44\xaa\x99\xc3\x10\x11\x5a\xac\x1c\xf5\x22\xad\x1d\x3f\x6f\xa7\xa2\xac\xdf\xf3\x59\x43\x89\x90\x30\x60\x53\x27\x3a\x23\x0f\x62\xe2\xbe\xdc\x7d\x8e\x56\x0f\x79\xdf\xfd\x30\xf5\xe9\xd8\x08\x3c\xf3\xb4\xbd\x63\xef\x6d\x1b\x8e\xed\x6c\x9d\xb4\x1d\xdb\xe9\x18\x8e\xe3\x3b\x76\x7b\xcf\xe0\xff\xb4\x8c\x56\xcb\xb1\x1d\xa3\x3d\x76\x1c\x7b\x6b\x7b\x39\xa7\xd9\x0e\x9b\xdb\xf6\x6e\xbb\xb9\x6f\xef\xed\x94\xb2\x9b\x6d\xbb\xed\x18\xad\x2f\xa6\xc1\x95\x42\xcf\xe4\x2e\x10\xd3\x78\x7a\xf0\x9d\x9b\xeb\xc0\x0c\x9b\x01\x26\x83\x10\x19\x83\x1b\xcf\xec\xb4\x4c\x63\x70\xeb\x99\x3b\xa6\x41\x3c\x73\x3b\xab\xcb\x8b\xf3\xba\x00\x22\xd9\xe9\xd4\x34\xae\x30\xba\x7e\x16\xdf\x78\x26\x93\x39\x9d\x1d\xa3\xb3\x63\x1a\x37\x93\x30\x4a\x3c\x73\x4c\xe9\xd4\x7d\xfa\xf4\xfa\xfa\xda\xbe\xee\xd8\x31\x19\x3d\x6d\xb7\x5a\xad\xa7\xc9\xd5\xc8\x34\x7c\x82\xfd\xa6\x08\x51\xf5\x4c\x4a\x66\x88\x33\xf5\xd5\xe8\xe0\x73\x9a\x12\x64\x9d\x4f\x88\x35\xa7\xb7\x53\xe4\x8a\xd9\x93\x82\x3e\x3c\x23\xf6\x94\xc4\x34\x66\xc9\x50\x29\x70\x6c\xac\x00\x5c\xaf\x06\x17\xf6\xf7\xa8\x90\xf9\xb4\x4c\x28\x46\x7d\xcd\x7a\xc3\x10\x4f\x6b\xaa\xc8\x90\xb0\x0a\xe4\x18\x47\xde\xb3\x1d\x61\x56\xde\xb7\x25\xa9\xc0\xdf\xb3\x2d\x31\xfa\x85\x3a\x57\xaa\x8e\x08\x8e\xab\x6a\x29\x5f\x3e\x0b\x35\x2d\x2b\x8b\xa5\x74\xa9\x1e\x02\x89\x52\xe0\x1d\x58\x04\x62\xe0\x1d\x70\xc9\x15\x75\xf1\xd0\xca\x44\x30\xce\x55\xbb\x7c\x36\x13\x5b\x8b\x9a\x2c\x4f\x66\xc2\x23\x19\x7d\x59\x1c\xf5\x64\x64\xa6\x0c\x08\xd5\xa3\x31\x33\xbc\x45\xc0\x26\x2e\xa0\x65\x71\x38\x20\x75\xb3\x78\x50\x02\xe0\x9c\x97\x4b\x73\x4d\x51\x45\xde\x59\xbe\xad\xba\x97\xab\xe8\x08\xcc\xa9\x85\x20\x06\x29\x80\x7e\x2a\xfb\xc1\xb0\xd7\x6c\xb3\x6e\x2e\x76\x1b\x0d\x11\xf0\x68\x07\x68\x88\x23\x3d\x8c\x12\x43\x64\x61\xa0\x96\x2d\xb6\x2a\x59\x11\x03\x9b\x02\x6b\xae\xe1\x4c\xb3\x08\x21\xe4\xcd\x47\x88\xaa\xb5\x10\xa2\x22\xbe\x6c\x0d\x28\xad\x80\x62\x59\x7b\x17\xc7\xb4\xb0\xfe\xe5\xe1\x40\xc5\x20\x2a\x93\x4d\x68\x50\x5e\x34\x78\x00\x25\x44\xdc\x6a\xf5\x2f\x42\xe4\x6e\xb4\xe0\x20\x8e\x86\x78\x34\x53\xbf\x53\x85\x09\x4a\x2b\x98\xfb\x6a\x94\x33\x0d\x42\x96\xc9\xed\xfd\x01\x9b\x8c\x67\x22\xd8\x24\xa1\xc6\x47\xe2\x51\xef\x40\x12\xbe\x47\xdd\x0f\x28\xb7\xf8\x3f\x11\xdd\x48\x53\x4c\x95\xd3\xbd\x10\x6b\x48\x6a\x62\x0d\x73\x5b\x8b\x53\xa6\xd8\x71\xca\x94\x7e\x19\x2c\x85\x14\x75\x90\x8d\x6e\xd0\x64\x4a\xdf\x44\x6c\xf9\xa9\xcd\x94\x81\xb8\x8c\xbd\x37\x48\xa3\x71\x69\x55\x96\xce\x62\xca\x1a\x8d\x0d\x9c\xe3\x82\x96\xe3\x1a\x3f\xbf\x1f\x23\xe3\x07\xa6\xf3\x1d\x18\x28\xe4\x3c\x5d\x15\x9e\xc8\x4a\x68\x41\x6c\x55\xa1\x8e\xe9\xc1\xe7\x62\x68\x1b\xaa\x0e\x6d\x23\x59\x68\x1b\x91\xa1\x6d\xcb\xf8\xfb\x49\x82\x47\x8c\x10\x1b\x0e\xe3\x2f\x91\x4f\x54\x3e\x61\x5a\x76\x16\x04\x69\x99\x49\x18\x53\xce\x48\xc4\x4e\x10\x2d\x67\xc0\x0c\x1c\x8c\x1a\x8d\xc8\xf6\xa7\xd3\xf0\x56\x2e\x43\x92\x1d\x7c\xc5\xe9\xba\x1d\x5f\x1e\xb3\x75\x99\x52\xd3\x28\x2c\x19\xa9\xea\x1d\xcc\xab\x67\xa5\x08\xe0\x4b\x81\xe5\x33\x4d\x0b\xb8\x2a\x48\xd2\x5a\x5b\xde\x88\x90\x6b\x7d\xfe\xa6\x80\x83\x03\xa9\x8c\x67\x3f\x26\x5e\x84\xae\x8d\x53\x7f\x6a\x9d\x9f\x9b\x3e\x21\xf1\x35\xbf\xf3\xd8\x84\xe6\x21\xfb\x71\xc2\x6f\x2c\x86\x2a\x8b\x48\x1b\x8a\xe7\xbd\x13\x76\x53\x96\x39\x9b\xaa\x9c\x0f\x53\x2d\x39\xe0\x4e\x1f\x91\xf1\x9c\x7d\xb3\x2c\xea\x5f\x98\xd0\x7c\xef\x5f\xf0\x5f\xe2\x7a\x6a\x68\xbe\x10\xd7\x54\xb3\x94\x64\xc0\x57\x62\xf3\x85\xf8\x60\x69\x7c\x2b\xd4\x84\xa6\x21\xcc\xd2\x78\xc2\x7e\x1c\xb3\x3f\x02\x46\xc0\x21\x04\x66\xbf\x0f\xf2\x09\x7b\xcd\x5d\x74\xd4\x9e\x12\x7e\xfa\xe5\xb9\xb0\xe1\x2c\x00\x99\x85\x17\x4f\x19\xb1\xfd\x91\x2f\xa6\x65\x2a\xbc\x5c\xa7\x0f\xf1\x72\x11\xe4\x07\x71\x14\xde\x66\x2e\x2d\x75\x52\x27\x4b\x90\xc7\x33\xb2\xdf\xfe\x80\xe2\x2b\x94\xbb\xc0\x92\x43\x7e\xf8\x28\x4b\x40\x37\xd3\x10\x0f\x30\x3d\x0a\xf1\xe0\x32\x4b\x9d\xf8\xe4\x12\x91\x33\x3c\x8a\xf0\x10\x0f\xfc\x88\x4a\x76\xc1\x28\xf1\xce\x4d\x31\xf4\x66\xe4\x73\xda\x48\x47\xa1\xa9\x50\x31\xfb\x4b\xc6\x05\xb7\x11\xc2\x98\x32\x3d\x89\xfd\xe1\xe7\x1c\x96\xec\x1d\x61\xe9\x54\x99\x39\x72\xde\x5f\xbc\xe2\xa7\x43\x5a\x92\x16\x71\x88\x3c\x53\x1c\x59\x32\x75\x23\x98\xe7\x8e\xfd\xe4\xb4\xa6\x13\xb7\x42\xbd\xd6\x3a\x7a\x48\xa9\x3f\x18\xa3\x40\xda\xc9\x22\xd1\x26\x68\x12\x5f\x21\xd5\xbc\x38\x13\x20\x60\x5a\x00\x40\x81\xed\xac\x64\x84\x8a\xdf\xcf\x38\x52\x99\x14\x48\x14\x0c\x3f\x08\x24\x6b\x9c\xcd\x2e\x26\x98\x3e\x43\x63\xff\x0a\xb3\x21\x87\xd2\x6c\x57\x03\x9c\xd9\xec\x09\xa2\xb3\xe9\x6b\x9f\x0d\xa2\x80\x9a\xd7\x49\xd1\x64\x16\xfa\x14\x1d\xf2\x21\x3e\x8d\x67\x09\x62\x9c\x6f\x49\x0a\xa8\xf1\x58\x2c\x0a\xac\xb3\x58\x58\x05\xc6\x68\x55\xc1\xf9\x30\x55\x50\x4a\xfc\x53\x62\x97\x56\xba\x02\xbf\x79\xa1\xdd\x9e\x25\x7f\x32\xa2\xbe\x60\xb3\xe4\x04\x27\x14\x45\x88\x58\xe6\x25\xba\x65\xd3\x5a\xb4\x50\x81\x4c\xc6\xfd\xd5\x75\x83\xdc\xe1\x5b\x4d\x92\x55\xf5\x27\xac\xd0\x83\x5b\xe7\xb5\xbf\xaa\xfd\x01\xa3\xa4\xac\x4d\x09\x1e\x8d\x10\xa9\x22\xe7\x1d\x24\x28\x77\xe0\x67\x74\xfb\x2c\xf6\x49\xc0\x4b\x66\x30\x80\x6b\x29\x3e\x7c\xd8\x08\x54\x56\x5c\xb7\xfb\xcb\x95\xd7\xa6\x7d\x4d\xd5\x87\xb7\x7c\x3f\xaa\xaf\x45\xaf\x1a\x92\xa7\x2b\xc0\x67\x4e\x8e\x6e\xe5\x14\x55\x33\xb8\xc7\x97\x17\x77\x83\xaf\xdd\x4c\x7a\xbc\x15\xcb\x4c\x49\x60\xc9\x1f\x85\x29\x5a\x2d\xe7\xa4\x48\xf0\xa7\x53\x14\x05\x47\x63\x1c\x06\x7a\xa9\xdc\xad\x84\xaa\x54\x47\x29\x72\xcf\x35\x33\xb8\x6f\x02\x5d\xdd\x46\x8b\x05\x62\xc8\x4f\x7d\x3a\x18\x73\x72\x58\x7c\xf9\x67\xa3\x22\x7e\x2a\xfa\xcf\x09\x62\xa4\x0b\xde\xfb\x64\x84\xa8\xcb\xfd\x9d\xfc\x04\x4a\x82\x02\xa6\xd0\x00\x00\xcd\x84\x8b\x4a\x53\x79\xd8\xd8\xe2\x53\x2d\xa7\x01\xa8\x5e\xd2\xd2\xa2\xe8\xce\xfc\x9e\x6c\x55\x12\x7d\xa9\x30\xe9\x0d\xb1\xbc\x4c\x09\x4a\x50\x44\xf9\xd2\x6d\x1a\xbd\x6c\xb9\x35\x9f\x14\x85\x6c\x6a\x1a\xf9\xe9\xc5\xa6\x63\x8a\x5d\x25\xcf\xac\x3e\xe7\x6a\x1a\x57\x62\xfb\xeb\xc9\xfc\x23\x11\xa4\xe7\x09\x20\x35\x0d\xb6\xaa\xea\x19\xec\x37\x4b\x67\xfd\xd6\xd3\xf9\x51\x33\xee\x4f\x13\x7d\x38\xf8\x0c\x91\x97\x9d\x15\x11\x5d\x7e\x21\xb4\x69\xcb\x0c\xf0\x95\x09\xba\x48\xfa\x5b\x25\x52\x9e\xc9\xb0\x32\xa1\x2f\xac\x0d\x7d\xe5\xf7\x10\xdf\x5a\x2a\x72\x4d\xb6\x9e\x6f\x58\x1b\x5a\xd9\xc5\x42\xff\x65\x4f\x7d\x82\x22\x2a\x5b\x06\xe9\x1d\xeb\xf0\x7c\x18\x13\x4b\xda\x7a\x46\x3c\x34\xee\xd2\x3e\x40\xe6\xe1\x46\x00\x48\x6c\x5a\x52\xed\xdd\x70\xd2\x55\x53\x91\xb5\xb6\x51\x3e\xbf\x95\x6b\x85\x42\xef\xeb\x6b\x1b\x2c\x95\x1b\x66\x5c\x79\x9b\x6b\xdb\x87\x97\xe8\x76\x10\x07\xda\x06\xa2\xf1\x4f\x6a\x1d\x13\xa0\xb6\x18\xfd\x20\x10\x00\x8e\xb9\x69\x20\xf6\xd0\x64\x1e\xeb\x47\xee\x6f\x3d\xe6\x46\x05\x53\xf3\x73\xf0\x47\x71\x80\x58\x15\xc1\xfb\xaa\xad\x0a\xaf\x2d\xd4\x0f\xab\x32\x4b\x42\xec\x34\xa5\xa2\xbd\xd4\x56\xb0\x10\xe0\xfb\xc0\x97\xe8\x36\xb5\x10\xa4\x00\x64\x7b\x44\x8d\x06\xd3\x29\xac\x16\xa4\xd0\xe2\xe7\x5b\xab\x44\x12\x9f\xb7\x16\x80\x5c\x22\x81\x14\xa4\x75\x0a\x8f\xf4\x5e\x17\x95\x4e\xf3\xd0\xcc\x6d\xa9\xcc\x66\x2f\x72\x4c\xb5\xd9\xae\x4e\x2e\x15\xb5\x58\x29\x07\x0a\x00\x94\xc4\x2b\x24\x4a\xc6\x0f\x71\x84\x8e\xc5\x26\x84\xd9\x92\xd2\xbb\xaa\x1c\x45\x37\xf4\x79\x76\x17\x98\x9c\x27\x65\x15\xbc\x44\x9f\x02\x62\xb0\x52\xf5\x61\x12\x85\x1f\x86\x2c\xe8\xb3\x8c\x6a\x5a\x32\x13\x45\xcf\x95\x98\xe1\x1e\x3f\xd7\x5a\xd6\x77\x2b\x40\x14\x97\x8c\xa6\xe3\xb6\x2a\x00\x16\x0b\x09\x51\xe7\xca\x83\x96\x20\xad\xd7\x4f\xe7\x1b\x65\xe1\x3b\x08\xe3\x04\x25\xd4\x32\x87\x31\x99\x98\x99\x42\x2d\xc4\x94\x94\xd9\xd5\xd2\x5b\xd2\xea\x5e\x4b\x52\xc9\xb3\xaa\x79\x08\x4f\x0b\xae\x97\x4c\x7f\xbe\xcb\x45\x58\xac\x26\x2c\x9a\x7b\x55\x11\xd6\xcf\xbd\xaa\x48\x4b\xe9\x2e\x9f\xe7\x69\xc9\x93\x2b\xcd\xaa\x55\x0e\x4c\xed\x44\xae\xa9\xd6\x21\x13\xe6\x27\x76\x2b\x7a\xac\xb1\x4e\x0d\x68\x89\xd2\x4a\x30\xd2\xdc\xfc\x0a\x08\xc2\xc0\xf8\x0a\x00\x6a\xce\x15\x41\x7c\x22\x9a\xdb\x6d\xb9\xce\xa0\xec\x19\x57\xe5\x85\xb3\x78\xa9\x42\xd1\x87\xcc\x4f\x58\x9e\xf0\xe3\x81\xea\x9c\x1f\xb3\x54\x47\x24\x9e\x45\x41\xdd\xfd\x04\xf2\x70\x60\xb3\x05\x0d\x32\xba\xf0\xad\x16\x34\xe4\xff\x00\xe8\xd6\xc5\xed\x56\xdc\x6d\x20\xa2\x3d\xeb\x62\xb1\x0a\xa1\xb7\x22\x26\xab\xe3\x6f\x05\xdb\xdb\xbc\x11\x75\x0f\x59\x4d\x00\x78\x1b\x8a\xfb\x74\xea\x03\xc9\x8d\xc2\xb9\x86\xaa\x93\x8c\xa9\x3d\x25\xf8\xca\xa7\xa8\x29\x29\xc3\x68\xdd\xac\x38\x73\x57\xc4\x45\xfe\x02\x5d\x75\x86\x52\x24\xcb\x5f\xa0\xbb\x44\xdf\x3c\x01\x74\x8b\x17\xa3\xc8\x70\x37\x71\x4f\x60\x7d\x48\x74\x1d\x69\xe5\x25\x81\x6b\x11\xd8\x69\x71\x0a\x3b\x17\xed\x8b\x4e\x1b\x68\x11\xc5\xd9\xdd\x2b\xf7\x6e\x5d\xd5\x5d\x0f\x81\x0e\x6f\xdf\x47\x17\x7b\x17\x83\xac\x7d\x57\xcc\x29\x60\xa8\x09\xa0\x05\x19\xf3\xaf\x90\x47\x17\xd7\x1d\x27\xb8\xcf\x8d\x7e\x20\xcd\xda\x28\xf6\x34\x1f\xf5\xa5\xe1\xf9\x2c\xe3\xbc\x6e\x72\x0f\xd8\x69\xb5\x07\x4c\x2d\xf7\x83\x38\x3a\xc3\x5f\x90\x67\x3a\x7b\xa6\x96\x24\x22\xbe\x28\x9e\xa0\xc4\x84\x3f\x32\x2b\xed\x15\x83\x62\x21\xba\xbc\xbf\xcd\x94\xfd\x00\x5f\xa9\x1d\x41\x9d\x47\xcd\x83\x1f\x54\x27\x0c\x19\x45\x26\xb5\xfb\xac\x95\xd4\xe4\x91\x54\xc5\x0c\xfc\x05\x71\xfd\x5b\x55\x3e\xf8\xe1\x69\x80\xaf\x0e\x3e\xdf\x11\x5c\x76\x42\xfa\xb5\xfb\x84\x37\x4b\x52\xea\x8c\xef\xfc\xdd\xb1\xcc\x54\x54\x13\x5b\x8c\x4b\x9b\x10\x2a\xe8\x90\xaf\xde\x4d\xa5\x4c\xdc\x64\xbb\x12\xbf\x11\xef\xdc\xfc\xde\xec\xe7\xae\xcd\x17\x72\x2f\x02\x0f\x2d\xa7\x41\xf9\x19\xea\xdb\xe8\xc6\x6a\x01\x88\xed\x4f\xb3\x0f\x96\xc3\x3e\x9e\xfd\xe3\xd2\x02\x00\xb6\x1b\x34\x37\xaf\xb0\x1d\xdf\x5c\x5b\x1d\xd0\xc5\xf6\xcd\x74\x47\x94\x7b\xf3\xe7\xcc\xa2\xf6\x20\x9e\x4c\xe2\x48\xa0\xcf\x95\xda\xc4\x16\xa1\xc0\xfa\xed\x0b\xaf\x96\xdb\x7d\x3f\xfa\xcd\x6a\x41\x6e\xcc\x40\x67\x8b\xc1\xfb\xf5\xf5\xc0\x72\xe0\x0b\x02\xdb\xd0\x81\x26\xbf\xcd\x85\x9f\x34\x61\x1a\x3d\xc7\xf0\xcf\xdf\x0e\x6b\x10\x03\xf6\x13\x3c\x11\x86\x22\x44\x2a\x4d\xc7\xf5\x1f\x3b\x3f\x59\x66\x34\x7a\x35\x34\xb9\x17\x97\x9f\xb2\xf0\x3c\x64\x1f\x0e\x06\x31\x09\x30\xeb\x00\x4b\xb3\xf9\x96\x82\x8e\xf9\xfb\xaf\xa3\x58\xfb\xa1\x14\x7b\xf3\x6f\x69\x57\x46\x4f\xeb\x0d\x5f\x16\x1a\xd6\xe1\xbe\x98\xbe\xe4\x44\x2d\x8c\xdc\x36\x83\xff\x3a\xf8\xc9\x32\xff\x4e\xe3\xd1\x88\x19\xa4\xdc\x0e\xd5\x76\xae\xb0\x7d\x74\x7c\x6a\x51\xc5\x95\x68\x79\xcc\xb2\x2b\x03\x64\xc6\x20\x0e\x43\x7f\x9a\xa0\xb7\x7e\x84\xc2\x37\xd1\xa1\x0a\xa7\x7d\x1e\x47\xcc\xe8\x49\x59\x9b\x0c\x0b\x47\x61\xb1\xc3\x52\x8e\x93\xc8\x6a\xc3\x76\xc6\x29\xea\x6f\xda\x66\x04\x94\x3c\x20\xb1\xcc\x66\x53\xde\xf1\xb7\x77\x76\x3c\x1b\x00\xc1\xa9\xaf\x24\xa7\x0a\x14\x14\x4e\x6d\x99\xd0\x56\x09\x1d\x99\xd0\x51\x09\x5b\x30\x53\xfc\xb7\x60\x4e\x3f\xe9\x45\xd1\x08\x97\x51\x45\xd0\x0f\x2a\xf2\x88\x2e\x70\xe2\x58\x82\x18\x87\x27\xb1\xb5\x03\x4d\x3f\xb9\x8d\x06\xa6\x6a\x67\x97\xdb\xc1\x91\x09\x77\x14\xce\x7b\xf0\x7d\xfd\xec\x62\x05\xf6\xe1\x9b\x3b\xa6\x9f\xa2\x7c\x4b\x01\xdf\xe5\x1c\xf9\xe1\x37\xcb\x71\xa0\xb6\x37\xba\x97\x25\xb7\x55\xc9\xfd\x2c\xa9\xa3\x97\x74\x5a\x59\xfa\x56\x21\xdd\xd1\x1b\x65\x83\x2b\x98\x8d\x7f\xed\x40\x67\x69\x9c\x15\x6a\xbb\x6a\x48\xda\xd9\x58\xed\xc1\x4b\x02\x3b\xf9\x60\x75\xaa\x2a\xf3\xd9\x94\xe2\xa1\x55\x98\x4f\x48\x13\x2d\x24\x13\x2d\x3c\x8e\xf2\x0e\x01\xb3\xe1\x79\x64\x49\xc0\xbc\x8a\xe4\x7a\x0e\x97\x2b\x1f\xb1\xe5\xcc\x84\x84\xd9\xf7\x7c\x74\x59\x1d\xc4\x53\x51\xc2\x4c\x74\x59\x87\xf7\x0b\x5d\xfe\xc1\x78\x86\x34\x7d\xd5\x82\xba\xa6\x75\xec\x27\x4d\xb5\x81\xc7\x83\x46\xa4\x8d\x6e\x45\x1e\xb6\xc3\xc1\x6f\xd6\x0e\x74\x76\x20\xb1\xb3\x8a\xcf\xf3\xc2\xf6\x60\xcc\x44\x51\x02\x00\x8f\x53\x72\x55\xd4\x29\x58\x2c\x6a\x2a\xc8\x7c\xd5\x0b\x1c\xc8\x0e\x64\x1d\x3f\xe6\x58\xbd\x0a\x2c\x6a\x53\x34\x99\x32\x75\xe5\x55\x00\x80\xa5\x19\x43\x84\xd9\xda\xaa\x7c\xa3\x41\x33\xa3\x96\x81\x9d\xbd\xba\x14\xd7\xb0\x34\xf3\x0a\x1b\xf5\x35\x64\x59\xc6\xbc\x24\x0e\x93\x32\x36\x47\xe2\xea\xc2\x0a\x74\x78\x35\x74\x33\xf5\xa3\x80\x35\x41\xed\x78\x8a\x22\x45\xf2\xad\xfa\x45\x64\x79\x8c\xc5\x22\x52\x31\xc0\x77\xd6\x3c\x8a\x27\xd3\x10\xd1\x8c\x3b\xf6\xb2\xca\x7f\x4f\x2e\xf1\xf4\x95\xb8\x45\xeb\x1d\x57\x87\x32\x11\x56\x45\xf4\xba\x6e\x16\xe8\x29\x7c\xa4\x26\xdc\x90\x7d\x95\xc9\xa1\x7f\x81\xc2\x10\x05\x17\xb7\x6b\x0e\x65\x6d\x4f\x39\x54\xb5\x6f\xfc\x9a\x78\xe7\xe7\xe7\x25\x96\xe5\x2f\x93\xf1\xcd\x58\x96\x9e\x50\x34\x55\x49\x7d\xb8\x54\x58\x67\xea\x42\x95\x42\x46\x1f\x32\x9d\x07\xbe\x63\xca\x4f\x45\x63\xd0\x28\xb5\x04\xeb\x5b\xd1\xca\x16\x26\x14\x6f\xe0\x39\x6b\x40\x4c\x39\xe1\x31\xd3\x15\xad\x97\xff\x4d\x8a\xd6\x1f\xeb\x2b\x5a\x2f\xff\x5a\x8a\xd6\x8f\xff\x4d\x8a\xd6\x97\xff\x2e\x45\xeb\xd9\xff\x56\x45\xeb\xc3\x7d\x15\xad\x3f\xfe\x1f\x54\xb4\x7e\xbc\x4b\xd1\xfa\xf2\x3f\x54\xd1\x7a\xf6\x1f\x45\xeb\x3f\x8a\xd6\x7f\x14\xad\xff\x46\x45\xeb\x89\xd4\x7c\xce\x28\x9a\x4e\xf9\x76\xa8\xd9\x87\x7f\xca\xc4\x93\xd8\x0f\xf8\x31\x4f\x53\x57\x57\x7e\x91\x22\xb9\xa4\x33\x70\x71\x92\x09\x0d\x25\x5e\xda\x45\x15\x81\x57\x28\xa2\xf5\xf7\x64\xca\x63\xae\x33\xca\x69\xd2\xff\xd7\x75\x97\xbd\xac\x71\xb9\x00\x89\xc6\x3b\xf9\x32\x78\xe5\x87\x98\x07\x6c\xad\xbf\x12\x66\x81\xbe\x76\x28\xe8\x20\x26\x3e\x9f\x8a\x16\xb2\xc5\x6a\xc1\xd3\xec\xe7\x2f\x5e\x1e\x7e\x38\x79\x2f\xc4\x7e\xc5\x32\xb7\xdc\xe9\x0c\x9f\xaa\x6e\xff\x74\x07\x85\xb9\xb0\x2d\x13\x56\x41\x96\x91\x22\x52\xcd\x5c\x5e\x51\xff\xa1\x03\x17\xa3\xd5\x82\x26\x67\x2f\x13\x48\xae\xf8\x59\xa8\xdf\x42\xdd\x3d\x1a\xa3\xc1\xe5\x45\x7c\x23\x78\x43\xa5\xbe\x97\x2b\xb6\x29\xb5\x6f\x01\xa0\xdf\xef\xc3\x7f\x32\xee\x39\xd7\x2a\xf6\xe1\x79\x56\xa1\x6f\xaa\xb6\x34\x8e\xa2\x78\x15\x4a\x59\x31\x54\x2c\xc6\xa8\xd0\x82\x6d\x78\x6e\x7e\x2f\x58\xdb\x4c\xc6\xf1\xf5\x31\x0a\x19\x1f\xf7\xb5\x7a\xa4\x12\x7c\xbe\xa6\x6d\x6b\x65\xf1\x1d\x65\x77\xb4\xb2\x51\x15\x3e\x9d\x12\x3e\xaf\x22\x3e\xd4\x05\x84\xfc\xaa\x8a\x5b\xa5\x8a\x1f\x55\x35\x79\xfc\x09\xf3\x21\x51\x64\x56\x06\xcf\x40\xd2\xb8\x79\x4d\x7c\x3e\x81\x95\xad\x23\xd4\x91\x3c\x39\xaf\x21\x64\x70\x73\x2c\x09\xb5\x94\x21\x62\xa8\x97\xd3\xa5\x5a\xca\xc7\x38\xc1\x9e\xc2\x05\x56\xe2\x01\x2b\x70\x80\x55\xed\xc3\x8a\xb6\x61\x75\xbb\x30\xc6\x42\x2e\xfd\x8c\x6e\x5f\xc6\x83\x59\x52\x12\x4c\x83\xf5\xd8\x28\xb8\x07\x3b\xcc\xee\xc1\x0e\xe3\x07\xb2\xe7\xf4\xa1\x6c\x34\x7c\x00\x1b\x8d\x96\xd9\x48\x90\xfb\x55\x34\x9d\xd1\x7c\x3a\x3f\x1a\xa7\x4c\x74\x4e\x39\x57\x0d\xf5\xbf\x9a\x19\xf2\x61\xbf\x5a\x6f\xd8\x6f\xef\x31\x94\x17\x77\x94\xdd\xd5\xca\x1e\xad\x33\x7c\x15\xc3\x7e\xb8\xce\xe8\x55\x0d\xfb\x59\x55\xc5\xed\xd5\xc3\xfe\xb1\x6e\xd8\x9f\xfb\xd4\x0f\x71\x42\x4b\xc3\x1f\xc8\xe4\xc7\xe6\x86\x4f\x65\x6e\x28\xb4\xcf\xb8\x22\x6b\xf9\xf1\x18\xe4\x78\x3d\x06\xb9\xc6\x6b\x2a\x1b\xca\x4e\xdc\x7d\xb0\x95\x28\x0d\x44\xa9\x29\x95\xec\x33\x69\xaf\xea\xe6\xd9\xec\x83\xb5\x6c\x1c\x2d\x19\x45\xb9\x87\x85\x6b\x02\xb9\x62\x2e\x4f\x5d\xd9\x92\x46\xc2\x88\xc8\x7e\x16\xf4\xfa\x4c\x4d\xe1\x0a\xa9\x3c\xaf\x48\x6d\xc6\x52\x3d\x13\xdd\x22\xa6\x9e\x22\xd3\x65\x9f\x66\xc1\xf2\x19\xe3\x3f\x2c\xd3\xc8\xca\x56\x3a\x36\xa6\x7e\x92\x5c\xc7\x24\x38\xc6\x01\x72\x57\x96\x38\x1b\xc7\xd7\xd0\x34\x4c\xdd\x07\x72\x7a\xc7\xa4\x74\x74\x2d\xe7\xe4\xae\xc2\x8e\x56\xf8\xe6\x81\x92\xfb\xb7\x87\x4a\xee\x17\x0f\x90\xdc\xaf\xea\xa6\xf0\x5b\x49\xb3\x6f\x20\xbc\xdf\x97\xa7\xab\x6a\xeb\x31\xe5\xf7\x9b\x95\xd3\x53\x74\xfe\x12\x6b\x0a\xe9\x3b\x3f\xc0\x71\x95\xe6\xf9\x16\x4b\xcd\x93\x97\xa8\x54\x35\x5f\xaf\x27\x0b\xde\x3d\x90\x23\x9e\xdf\x43\xb7\x78\x79\x8f\x05\xe9\x8f\x87\x72\xda\x8f\x0f\xe0\xb4\x2f\xd5\xaa\x26\x61\x44\xfd\x56\x0a\xe5\xb3\xb2\x42\x59\x6c\xed\xf1\xb8\xed\xc3\x7a\x0c\xf0\xe4\x1e\x03\xf9\xe7\x3d\x06\xf2\x97\x07\x32\xd6\xaf\x0f\x65\x80\x9f\x1e\xc0\x00\xff\xa8\x13\x35\xe2\x28\xc0\x37\x10\x34\x3f\x97\x05\x8d\x68\xe9\x31\xc5\xcc\x3f\xd7\x1b\x78\x1a\xad\x3f\xf0\xe8\x8e\xb2\xfa\xc0\x93\xe8\x61\x03\x1f\x55\xd5\x5b\xcb\xc8\xac\xaa\x78\x97\x91\x19\xd5\x0c\xfc\x7b\x74\x43\x7d\x82\xfc\x6f\x30\xf4\x49\x54\x1a\x7a\xd5\xd6\x63\x0e\xbe\x0a\x94\x57\x1b\x37\x95\x3a\x7d\xe5\x1e\x56\x57\xaa\x42\xda\xbd\x0a\xd4\x1e\xf8\x04\xd1\xe7\x2a\x45\x57\x52\x06\x51\xdd\x9e\x9a\xd0\xe7\xf6\x0a\x5b\x45\x2b\xf6\xce\xd6\xdb\x29\xa2\xfe\xe0\xf2\x23\x46\xd7\xc2\x2b\x15\xe8\x98\x04\xb5\x98\x70\x6f\xfb\x7e\xe6\x48\x2a\xfb\xe8\xaa\x50\xf9\x10\x4c\xad\xec\x8a\x23\x6a\x2b\x87\x6c\x4f\x5c\xda\xe4\xb6\x32\x8d\x11\x73\x27\xed\x08\xd1\x33\x86\x1a\x0f\xe7\x26\x28\x7a\x15\x58\xa0\xca\x91\x49\x6d\xf5\xeb\xd9\xed\xab\x20\x73\x4a\xce\xa2\x6c\xf7\x97\xf7\xb0\x99\x31\xa4\xf9\xbd\x09\x0b\x39\x3c\xf2\x94\xf3\xd1\x38\xf2\x96\xab\xf0\x0a\xcb\xc5\xe1\x34\xf2\xcc\xf3\x4f\xd1\x68\x1c\x27\xb4\xf9\xb7\xa3\x37\xa7\x6f\xff\xd6\x37\xe6\xbf\x47\x86\xfc\x8f\x8a\x6f\x35\xc4\x1b\x1d\x2a\x23\x35\xe1\xb0\x8c\x9b\xf0\xef\x67\x5b\xc9\xa3\x22\x1a\x32\x17\x16\x43\xeb\x26\xd1\x3d\x4d\x8d\xad\x7b\x9b\x1a\x6d\x20\x02\xf5\xeb\x4c\x8d\xed\xbb\xec\x88\x76\xc6\xfa\xf9\xb0\x71\xde\x0f\xc9\x11\x03\x2c\x4f\x7e\x10\xec\x9f\xb0\x2c\x9d\xf5\xae\x56\xb3\x9e\x53\xde\x29\x6c\x67\x1b\x85\xba\x91\xf3\xeb\xeb\x81\xd5\x81\x93\x48\x6c\x7d\x29\x4a\x74\xee\x66\x56\xbe\x09\xc3\x6f\x8d\xc9\x9c\xe9\xd4\x16\x5f\x40\x65\x24\x13\x96\x88\x93\xb3\x89\x1f\x86\x59\xaa\x3f\x9d\x36\x43\x74\x25\x3a\x8a\x93\xc3\xe9\xf4\x84\xfd\x5a\xde\x0d\xa2\xe2\x62\x5e\xfe\x4b\x99\x41\x9d\x25\x4f\x3b\x1b\x00\x66\x59\xe9\xb4\xb9\xad\x10\xcb\x4a\xfc\x5e\x30\xde\xa1\xfe\x85\xdc\x27\x78\x4b\xe2\x3f\xf8\x81\xe8\x77\x68\xa8\x73\xcf\x51\xbd\x8c\x51\x22\xca\xa9\x71\x13\xd7\x93\x4b\x06\xe3\x53\x3b\xdf\x09\xcb\xb6\x8e\xa8\x9d\x23\xf5\x2a\x00\x96\xa9\xed\x51\xe4\xc5\x4b\xbc\x92\x4d\x71\x5f\xb1\x08\x9f\xe6\x60\x79\x9b\x43\x82\x50\xb3\xff\xb0\x48\x05\x2e\xde\xb2\x4d\x4f\x8d\x0c\x67\xcb\x64\xc8\xf6\x82\x25\x77\x85\x58\x4e\x9d\x1f\x2f\x5f\x5a\x6d\x8d\xe7\x57\x6e\xd3\xeb\x7b\xe0\x9a\x85\x2b\x87\xf6\xbd\xdc\x63\x79\x33\xa3\x21\xe2\xd2\x50\xed\xba\xbc\x43\xc3\x0c\xd1\x2c\x51\x1f\xfb\x8f\x2b\x30\x16\xbb\xd7\x67\x91\xd8\x10\x2d\x6e\xf4\xb6\xeb\xf0\xad\xde\x06\xad\xdb\xf8\xa1\xfe\x45\xf2\x2a\xe0\x5b\x5c\xe2\xb3\xd1\xd8\xa0\x36\x8e\xde\xc8\x67\xe6\x75\x54\x3f\x2d\x2d\x98\x8c\x84\x2d\x46\xc2\x3b\x29\xf6\xf5\x84\x3a\xbe\x93\x50\x9f\x22\xe8\x2c\x13\x4a\x6c\x21\xaf\x4b\xa9\xce\xbd\x48\x55\x47\xa9\xeb\x75\x65\x39\xf7\x88\xfb\x17\x4d\xf5\xaa\x7f\x53\xbe\x8c\xab\xf6\xc4\xb9\x78\x97\xa7\xaa\x6d\x94\x0c\xee\x21\xe4\xdf\x44\xe2\x1e\x8b\x9f\xd1\xad\x05\x52\xb8\xe1\x40\x6c\xa3\xab\xf7\x60\x79\xb9\x40\xf9\x7e\x97\xf2\x49\x75\xd5\x0d\x2d\xd8\x3e\x3d\x4c\xac\x2d\xb0\x14\xf8\x21\x9a\x78\x33\xa3\x09\x0e\x10\x3f\x5c\x2b\x9e\xcc\xd2\x1b\xe2\xe7\x81\xe2\x19\x2d\xb6\x75\x17\xda\xdc\x8d\xff\x66\x46\x55\xfc\x88\x18\xdc\xe3\xa8\x2a\xdc\xc1\x59\x6b\xc5\x2a\x8f\xe7\xcb\x98\xbc\x51\x43\x7a\x82\xa3\x4b\xa9\xb5\x5d\xa1\x42\x7c\xcd\xe9\x9d\x83\x58\x16\x2d\x7c\xe1\xda\xd1\xfc\x75\x4c\xd6\xec\x6a\xe1\x25\x6a\xc1\xda\x13\xaa\x16\x1f\x5d\xed\xec\xfa\x1a\xbe\xc2\x4f\x59\x71\x6f\xa3\x95\x2a\x1a\xaf\x55\x35\x9e\xa2\x8c\x59\x25\x95\x99\x22\x70\x7f\x4f\x65\x0e\x44\x8c\x7b\xae\x4d\x6c\x2f\x87\x8b\x94\x63\x37\xd8\x68\xee\xc0\x6b\x39\x9a\x2b\xf8\xdf\xb9\x3b\xe2\xa3\x42\xb8\xf1\x85\x8b\xf5\x94\x0f\x2f\x47\xf7\x0c\x91\x2b\x3c\x40\x85\x28\x81\x3c\x30\xa3\xbc\xc8\xbd\xf7\x2f\x5e\xe5\x73\xfa\x2e\x58\x7c\x7d\xcb\xcf\xd8\x55\x02\xe1\x12\x75\xb9\x7a\xaf\xe5\x36\x1d\x60\x99\x32\x88\xb0\x52\x97\x9f\xc4\x04\x15\x50\x16\xed\xad\x59\xa3\x42\x84\x2d\x77\x42\x63\xf8\x93\xfb\x6a\xa0\x62\x8c\x1e\x55\x05\x75\xda\x0f\xd6\x41\x97\x89\xc1\x5b\xd2\x7b\x78\xb3\x6e\x0f\x57\xe8\xa4\x22\x76\x60\xe8\x07\xfc\x4e\x89\x72\xe8\x40\xad\x7c\x03\xb6\xa8\x52\x8c\x8b\x6b\xeb\x21\x67\x4b\x2e\x7d\x19\x83\xc6\x4b\x6c\x29\xed\x6d\x5b\xe5\xec\xc8\x9c\x2c\x61\xb7\x2c\x81\xf6\x64\xc2\xae\xaa\xbb\x5f\x0c\xc6\xe2\x92\xb5\x05\x4f\x4a\xea\xf4\xde\x52\xa0\x96\xb3\x64\x20\x96\xc2\xf7\x78\x5a\x07\x56\x46\x6b\x71\x08\x5b\xe5\x8e\x3a\xdb\xb5\x65\x55\xc7\x84\x00\xa9\x61\xaf\xbb\x23\x34\xc4\xc1\xab\x67\xfe\xe0\x32\x20\xf1\x74\xb1\x40\x05\xce\x5b\x77\xdb\xa4\x28\x59\x26\x71\xe0\x87\xdc\x50\x30\x93\x89\xe9\x79\xd4\xe6\xf7\x5e\xab\x0c\x7e\xdd\x74\x38\x5a\xce\x10\x57\x50\x87\x79\x46\x16\xf4\xa1\x18\x89\xef\x92\x5c\xe2\x69\x16\x42\x59\x1b\x01\xf4\xa9\x2e\x04\x88\xda\xbc\xb1\x57\x41\x41\x64\xd4\x3a\x0a\x78\x61\xa9\x50\x9f\x51\x9f\x50\x55\x8d\x8f\x4c\xb2\x7f\xa4\x14\xfd\x2a\xa8\xd5\x36\x8d\x0e\x60\xad\x76\x5f\x44\xc1\xb2\xb4\xe2\x34\xc9\xa3\x54\xa4\x09\xf0\x5b\x24\xdd\xfd\x7b\x50\x12\x35\xf2\xaf\x32\x87\x54\x96\xa8\x47\x7f\x6b\xc9\x17\x71\x70\xbb\x9c\x3a\x8c\x63\x7e\xfb\x57\xbf\x0f\x5f\x30\x0b\xc3\xce\x01\x43\xf5\x43\x05\x79\xdb\x1a\xa0\xec\x97\x02\x90\x5b\x20\xaf\x56\xa8\xa9\x4b\xd2\x6e\xeb\x0e\xa3\xa3\xbb\xb4\xf9\x26\x6f\xca\xa4\xe2\xd0\x21\xff\x05\xb4\x3d\xb9\xec\xb4\x1f\x28\x8b\x47\x96\x53\x69\x98\xbf\xaf\x75\x83\x85\xa4\x99\xc5\x61\xd5\xe8\xf8\xd5\xa2\xb8\xdc\x96\xa8\xf4\x26\xf7\x92\x50\x3c\x41\xfc\x90\x30\x0f\x8d\xcf\xbd\x25\x95\xd9\xe5\x78\xfe\x62\x6e\x31\x74\xbf\x0f\x2f\x95\xaf\xa5\xb2\x0d\x58\x0b\xbf\x2a\xa7\x00\x9b\x47\x92\xbe\x8d\x3c\x8b\xdf\x87\x21\x0e\xad\xd2\x79\x9a\x5d\x8c\xfb\xfb\xac\xd5\xde\xdd\x1e\xfa\x03\xaf\x62\x31\x88\xd0\xb5\x85\x16\x0b\x0a\x52\xa8\x4a\x06\x98\x69\xd7\xe1\x8f\x6d\x79\x80\x93\xc2\x44\x5e\xaa\x93\xb8\xb2\xa7\x9c\x49\xfa\x7d\xfe\x9e\x3c\xb0\x00\x7c\xfd\xef\x6b\x5d\xb1\xa8\xd6\xfa\xbb\xc7\x6b\x7d\x12\x07\x8c\x83\x0e\x9f\xa9\xd6\x59\x23\x32\x0f\x47\x7f\x78\xd8\x1e\xfc\x74\x66\xcd\xc5\x15\x39\x0c\xa1\xc8\x46\x5f\x72\x54\xe4\x91\xe1\xe7\xd1\x9c\x3f\xd0\xfb\x52\x22\x56\xb8\x64\x9f\x9e\x53\x15\x82\xe7\xb5\xfa\x9e\x29\xbf\x4d\xc8\x32\x4e\xde\x1c\x3e\x7f\xf5\xfa\x47\xcf\xe9\x7b\xa6\xfc\x16\x19\x67\x1f\x8e\x8e\x5e\x9c\x9d\x79\xed\xbe\x67\xca\x6f\x91\xf1\xe2\xdd\xbb\x37\xef\xbc\x4e\xdf\x33\xf9\x97\x99\x5a\x2f\xa3\xc5\xc2\x7a\x19\xf1\x17\x33\xe0\xcb\x08\x00\x19\x6c\xfc\x47\x99\x4c\xfa\x59\x66\x75\x21\x5d\x28\xef\x8e\x52\x8f\x3a\x7c\xd2\xc3\x09\xbd\x97\x91\x42\x9d\x5f\xbc\xa3\xe7\x95\xdf\x76\xd0\xf3\xf8\x1b\x0f\x85\xc2\x14\xcc\x37\xc4\xdd\x29\x94\x01\x95\x5d\x75\xe9\x62\x61\x51\xad\x15\x00\xb3\x2b\xcb\x0b\x00\xd5\x35\x1e\x45\xec\x24\xca\xaa\x0b\xf2\x06\x10\xf5\xb3\x2a\x30\x92\x02\x90\x46\xa3\x37\xd1\x73\x94\x50\x12\xdf\xaa\xcb\xe0\xea\xfa\x7c\x5f\xbe\xb2\xb0\xfd\x6b\x67\xc7\x7a\x1e\xc1\x3d\xb0\x3e\x8b\x8b\x19\xaf\x87\xb3\xf6\x21\x8e\xa6\x33\x9a\xb8\x73\x1d\x33\xb7\x14\xf6\xaa\xe7\x99\xfd\x34\x9b\x1e\x3f\xae\x1a\x77\xd9\x63\xe1\x23\x67\x4b\xa5\xba\xb7\x50\x91\x36\xbb\x53\xef\x93\xf2\xa3\x97\x53\x04\x2d\xf9\xd5\x99\x67\xd4\xbe\xf9\x87\xce\x1a\x35\x5c\xa1\x33\x04\xe3\x05\x8b\x7a\x1b\x1b\x14\x94\xc7\xba\x3c\xcc\x1e\x05\x1c\xb8\xc2\xa4\x0c\x5d\xa5\x73\xf0\x59\xa1\x0a\xf8\x2a\x2f\x6b\x20\xeb\x1b\xad\xe8\x9a\x1d\xa1\x1b\xca\x79\x45\x05\xc4\xe8\x44\x63\x04\x29\x35\x9f\xe3\x28\xf9\xac\x12\x4f\x09\xdc\x4f\xde\x5c\x24\x88\x5c\x31\xe2\x5b\x20\xad\xe4\xd2\x02\x5b\x7a\xd4\xf3\xb4\x49\x73\x6f\xae\xcc\x19\x71\x4a\xe2\x2b\x0f\xdb\xbf\x7e\xd9\xb5\xe6\x34\xbe\x44\x91\x4b\xe1\xd0\x67\x7c\x71\xeb\x6a\xd0\x72\xe9\x26\x76\xdc\x23\x6f\xce\x34\x3d\xd7\x7c\xc3\x4d\x50\xae\xbc\xba\x26\xf7\xb3\x9b\x30\x19\xc7\xd7\xae\x79\x36\x8e\xaf\x4d\x38\xc6\x01\x72\xcd\x63\xcc\x94\x26\xd1\x67\xd7\x7c\xc1\xff\x9a\x50\x1d\xd0\x71\xcd\x23\xf9\x65\x42\x66\x23\xba\xe6\x69\x4c\x18\x1c\x3e\x25\x5c\x53\xed\xe2\x8a\xdf\x87\x61\xa8\x92\x8c\xc3\x30\x34\xe1\x94\xa0\x2b\x1c\xcf\x12\xd7\x7c\x2b\xbf\x4c\xc8\x86\xcb\x35\x5f\xa3\x1b\x6a\x42\xf9\xc0\x94\x6b\xfe\x34\x9b\x4c\x0d\x1a\x1b\x32\xc1\x84\x38\x1a\xc6\xae\xf9\x2a\x1a\xc6\x26\x94\x9b\x70\xae\x79\x26\x77\xe3\xa0\x7c\x97\xc8\x35\x7f\x11\x1f\x26\x14\x07\xac\x5c\xf3\x85\xd8\xc4\x23\xf1\xf5\x21\x27\x71\xe2\x9a\x87\x57\x3e\x0e\xd9\xf8\x19\xe2\x8e\x8c\xc4\x84\x53\x3c\xb8\x3c\x8a\xc3\xd9\x84\xe5\x33\x6a\x18\x31\x31\x18\x3d\x8c\x81\x48\x15\x94\x2a\x16\x39\xca\xb2\x62\x42\xc5\x0f\xd7\x3c\x8b\x09\x95\x39\x26\xe4\x77\x28\xbf\xf5\x47\xc8\x35\x5f\xb2\x4f\x83\x7d\x9b\x30\xf4\x55\xea\x89\x9f\x25\x32\x32\x88\x44\x46\x0a\x99\xa8\xe8\x25\x32\x14\xcd\x64\xa6\xa4\x8d\xc8\x3b\x12\x3f\x64\x16\x8d\xa9\x1f\xb2\xcf\xc4\x35\xdf\xb3\x6f\x9e\x9e\x30\x8c\x42\x8a\xc8\x2b\x8a\x26\x09\xc3\x89\xfd\x30\x30\xfb\x65\xc2\x09\x8e\xc4\xab\x24\xe6\x29\x8e\x0c\x79\xad\xd0\xc4\xbf\x51\x89\xfe\x4d\x96\x58\xd6\xf8\x5d\xf3\x19\x1a\xe1\x88\x51\xde\x88\x87\xc6\x29\xcb\x37\x8e\x94\x0b\xa6\xa4\xa8\xbb\xe6\x8b\x28\xa8\x28\xa6\x11\xf8\x14\x45\x33\xed\xc8\x49\xf5\x90\x18\x13\x14\xcd\x4c\xe8\x87\xa1\xac\x25\x18\x0d\x05\xae\x79\x18\x86\x59\xa9\x44\xa6\x9a\x30\xc1\xa3\x68\x1a\x27\x54\x44\x8b\xbb\xe6\x99\xfc\x6d\xa8\x78\x73\x55\xe0\x48\x4c\x91\x2c\x5f\xce\x15\x39\xa1\x5d\x33\x13\xe2\x01\xa2\x3e\x0e\xdf\xfa\x11\x92\x64\xe0\x7f\x58\xdf\x48\x7c\x6d\x88\xdc\x44\x2f\xa6\x77\xbf\x50\x24\xc1\x11\xf7\xa8\x84\x62\x97\x25\xd3\x7a\x19\x16\x2c\x47\x76\x83\xc7\x02\x4b\x15\x54\x54\x11\x5c\xcd\xb8\x79\xb9\x8e\x9f\xe5\x65\x95\x44\x83\x2f\xb2\xf5\x43\xab\x24\xa8\x60\xb0\x59\xcd\x71\xcb\x5c\x68\x81\x4f\xfd\x11\xc1\x81\x60\x17\xad\x86\xe4\x9f\x00\xfb\x61\x3c\x2a\x97\x7b\xce\x53\x97\xe1\x8b\x71\x31\x04\x23\x72\xc1\x32\x9b\x44\x67\x68\xea\x13\x9f\xc6\x3a\x74\x31\xaa\x06\x41\xcc\xd0\x35\xc6\x7e\x14\xb0\x31\x2a\x95\x2f\x70\xc9\xeb\x98\x1a\x11\x62\x12\xc1\x27\xb7\xea\x86\x6f\x26\x8b\x0d\xe5\x92\x90\x3b\x6b\xcb\x5b\x8c\x52\x20\x1a\xe2\x41\x08\xd6\x15\xc4\x64\x82\xea\x86\x2a\x33\x8e\x59\x21\x96\xab\x97\x51\x0c\x25\x7b\x98\x67\x2c\x17\x12\x10\x9e\xfb\x14\xad\x03\x52\xac\x28\x85\xd2\x2c\x81\x97\x86\xc6\xfc\xec\xc5\xc9\x8b\xa3\xf7\x2f\x9e\x7f\x7a\x7e\xf8\xfe\x45\xaa\x57\x57\x92\xe2\x34\x8e\xe8\x58\x13\x1c\x13\xf6\x5b\x2f\x28\xc5\x86\x2c\xa7\x84\xc8\x52\x31\x26\x92\x64\x19\x2e\x9d\x96\x0a\xa8\x16\x9e\xa3\x81\x1f\xe8\xa2\x2a\xe0\x09\x65\x58\xaa\x18\x07\xb6\x5c\x44\xe2\xa1\x4a\x29\xb4\x96\x0b\x8a\x09\xc3\x31\x7b\xcf\x97\x11\xb9\xd8\x70\xfc\xa0\x41\xc7\x48\xad\x20\x22\xc9\xc0\x89\x31\x3f\x3a\x3c\x79\xf1\xfa\xf9\xe1\xbb\x4f\xa7\x6f\x5e\xbf\x3f\x4e\x97\xe1\xfd\x8a\x7c\x52\x00\x77\x8b\x7c\x52\x84\xc6\x52\x8a\xc0\x7e\x7d\x71\xf8\x2e\x35\x61\x39\x6c\xc2\x35\xb9\xfc\x34\xc4\x31\xbb\xc0\x36\xa1\x7a\xa6\xf5\xb5\x7f\xf5\x23\x89\x67\xd3\x12\xf7\xa8\x6c\x23\xf2\xaf\xb0\xb8\xde\xdb\x18\xb1\x72\x85\x9a\x77\x57\x32\xa1\x32\x42\xcf\x28\x9a\xbe\x8e\x85\xa4\x66\x08\xb1\x69\x92\x88\x1f\xc5\x42\x47\x6a\xf5\x3d\x52\xab\xae\x9e\x7b\xa6\x56\x5d\x75\x66\xad\x54\x9b\xaf\xb4\xd9\x82\xab\xe7\xbc\x25\x31\xab\xc9\x65\xe7\xab\xc8\x98\x92\x78\x44\xf8\xb2\x3d\x88\x27\x17\xf1\x45\x7c\xf3\x1c\x31\x78\xae\x29\xfe\x66\x22\xdb\x88\xe5\x79\x46\x55\xee\x0c\xf9\x64\x30\x66\x70\xbe\xcb\x3e\x8d\x61\x4c\x0c\xfe\xa0\x1a\x4a\xf8\xb7\x39\x7f\xf5\xfa\xed\x87\xf7\xa9\xf9\x9d\x56\x4f\x0a\x4f\x35\xa2\x25\xa8\x6a\xdd\x38\xcb\xd6\x0a\x95\xf7\x3a\x7e\x87\x92\x59\x48\x13\x46\x36\x26\x8b\xd8\x77\x9e\xfd\x86\x2b\x56\x62\x75\x9a\x4a\x5d\x42\x89\xc1\x5c\xc8\x66\x8b\xe3\x9b\x61\x71\xa5\xac\x2a\xfc\x22\x0a\x58\x31\xb1\x48\x54\x15\x78\x17\x5f\xcb\x35\x53\xa9\x67\x5c\xc2\x57\x8a\xec\x42\xad\x44\x84\x80\x49\xce\x1e\x10\x84\x98\x74\x65\xeb\x82\x41\x39\x88\x41\x3c\x99\xf8\x51\x90\x18\x13\xff\xd6\x88\x62\x6a\x5c\xc7\xe4\x92\xd3\xf4\x0a\xa3\x6b\x86\xb2\xd2\x99\x55\x4b\xd0\x98\x86\xc8\x4f\x10\x97\xb4\xb7\xf1\x8c\x18\x89\x0e\xf7\xbb\xc4\xb8\x20\xf1\x75\xc2\x56\x95\x00\x31\x89\xcc\xd2\xc5\x44\x12\x00\x18\xc4\x38\x41\x81\x71\x71\x5b\x94\xd4\x04\x25\xd3\x38\x4a\xf0\x15\xca\xb8\x5d\x10\xfb\x75\x3e\x2d\x84\x02\x50\x51\x52\x2e\xe0\xab\x8b\x66\xdb\x4f\x65\xb0\x6a\x13\x69\x55\xa5\xe5\x16\x4a\xb5\xae\xf1\x17\x9f\x04\x75\xf3\x26\xcf\x2d\xce\x9a\xff\x9f\xbd\x3f\xd1\x8a\xdb\xd8\x16\xc7\xe1\x57\x69\xb4\xfc\xe3\x4a\x97\x42\xb7\xdb\x19\x4e\xd2\x1c\x99\x0f\x03\xb6\x49\x18\x1c\xc0\x76\x1c\xbe\x5e\x44\xb4\xaa\x41\xb1\x90\xda\x52\x35\x18\x83\xde\xfd\xbf\x6a\xd7\x5c\x2a\xf5\x00\x1c\xdb\xb9\x37\x27\xeb\x98\x56\x0d\xbb\xe6\xaa\x3d\x6f\x43\x8b\x1d\x50\xf1\xce\x58\xaa\x60\xeb\x0a\xec\x7c\xd3\xc9\xcc\x1a\x78\x06\xcf\xe7\xa0\x1d\x4f\x59\x7c\xcd\x2a\xfa\x9c\xd7\x59\x31\x8c\x33\x1e\xcc\xd1\xcc\xe4\x61\x1d\x58\x80\x09\xdf\xfc\xba\xad\x91\x51\x38\x40\x9c\xd0\xfb\x80\x6f\xaa\x46\xd0\x48\x56\xa6\x86\xb0\x7d\xe0\x74\xf6\xb6\x56\x81\x3b\x38\x60\xa8\x88\x19\xdf\x23\x8d\xa4\x77\x80\x92\xdb\x1a\x2f\x2f\x97\x32\xc2\x1d\x89\x9e\xdd\xa6\x51\x1a\x96\x18\x62\x47\xf8\x7f\xde\x3e\xb9\x25\x75\xfd\x27\xc2\x27\x64\x00\x2c\xf9\x47\xa2\xb0\x04\x65\xd5\x14\x45\x51\xd2\x99\xd4\x48\x90\x60\xb4\x52\x9a\xe0\x64\x27\xef\x7b\x65\x51\x10\x4f\x92\xf2\x6f\xf2\xa8\xcb\xa9\xb0\x27\x39\x50\xdc\x69\x78\x90\xbd\xf6\xbd\x37\xfb\x3b\xbf\xbd\xd9\x3e\xdd\xd9\xf2\x04\x95\xf6\x31\x8f\x6e\x39\xa0\xfe\x93\x1c\x4d\x2a\xfc\xa2\xad\x7d\xc6\xd2\x4b\x56\xbd\x95\x37\xf9\xca\x4a\xcd\x56\xfe\xdd\xe3\x31\xd5\x86\x97\xe3\x28\x0d\x7f\x1f\x5f\xb6\x33\x14\x17\x77\x85\x72\x51\x54\xe4\x6d\x5c\x56\xfd\xa7\xf0\xf3\x79\x9a\x53\x0c\xba\xea\x9b\xbe\x86\xb9\xb1\xa9\xc3\xd2\xdd\x30\x6f\x5f\xea\x06\x35\xca\xcf\x05\x05\x22\x7b\xf7\x47\x89\x12\x3c\xcc\xaa\x7e\x0f\x5d\xd1\xb6\xba\x48\x28\x80\x58\xed\x08\x8e\xfa\x8b\x27\x44\x8a\x9d\xba\x01\x44\x42\x19\xc6\xe3\x6a\x92\xb1\xa0\xb9\x4f\x11\x7b\xb5\xb7\x30\xe1\xcf\x47\x57\x12\xd7\x57\x71\xd9\x79\xef\x64\x18\x4a\x8b\xff\xc8\x4b\x73\x25\x16\x86\x13\x1e\xf1\x28\x32\x88\x48\xcb\xef\xc8\x1b\xf2\x5f\x5e\xed\xbf\xcf\xef\xee\xfc\xf7\x9c\x19\xf8\x1e\x98\x81\xe8\x17\x77\x2b\xdc\xa7\x6e\xe4\x71\xa3\x5c\x0a\x73\x6f\x92\x91\x34\xf2\x2e\xe9\x1f\xaf\xf6\x7f\xa1\xd0\x7e\xe1\xd0\x7e\x51\xac\xc5\xdf\x60\x5f\xc2\x46\xf9\x35\x37\xf9\x8a\x74\x76\x98\x33\x42\xc9\x5c\x91\x8b\xb0\x93\xc8\x28\x8b\xcc\xa0\xfd\x7d\x2e\xc7\x2a\x62\xe1\x26\xf8\x93\xe6\x76\xb8\x11\x48\xa4\x18\xe3\x5c\x7e\x28\x8b\x72\x88\xd2\xc8\x5a\xad\x57\x9f\xdc\xda\xcd\xd6\x7f\xd6\x3c\xbe\xc9\xef\xb9\xeb\x4a\xab\x48\x19\x13\x7c\x7e\x13\xfd\x92\x8b\x69\xb1\xba\xbe\x59\x4c\x72\x12\xfd\x96\xaf\xac\xf0\xab\x6b\x1c\xe7\x38\xab\xa2\x5b\x16\xed\x96\x7d\xa9\x13\xae\x5f\x4b\x7a\xf9\x40\x86\x45\xd5\x12\xe1\xde\xa9\x30\x39\xe2\xbd\x90\x97\xa9\xec\x16\xe1\x0e\xad\x99\x77\x93\x32\xc1\x3c\xb0\x8b\xb8\xd3\x78\x70\x1c\x0b\x28\x9f\x4d\x6c\x04\x69\x38\xc8\x92\xd7\xac\xb3\x04\x3c\x2b\x33\x9f\x20\xf4\x5a\x5d\xea\x89\x3b\x5c\x42\x80\x2b\xe7\xd7\xdc\x77\xce\x46\x80\xec\xf6\x60\x71\x70\xad\x3b\x1b\x31\xa2\xeb\x1a\xe1\xac\x96\x5c\xb5\xd7\x04\x17\x57\x0e\x3d\xd2\xd6\x44\xf7\xf1\xbc\x91\x65\x7c\x1c\x2d\xfd\x28\x6b\xbe\x79\xb4\x8e\xd8\x05\xe5\xf6\xc2\xb5\x0d\xf4\x96\xbb\xe1\xa6\x5f\xfa\xdb\x61\x82\x08\xd3\x64\x20\xf6\x64\x50\x37\x67\xd8\x84\xc2\x7c\xb8\xe3\xe8\x99\xf2\x25\x1e\x8e\xd2\x3c\x91\x71\x72\xc3\x34\x09\x02\xbd\xb5\x84\xe1\xb3\xcd\x46\x83\xba\x86\x60\xa2\xf1\xec\xf7\x5a\xae\x1a\xac\xe6\xef\xb9\x31\x5d\x8c\xc8\xa8\x20\xeb\x2d\x09\x7f\xf7\xcd\x2a\xbc\xeb\xf0\x3a\xc3\xa0\x78\x79\x3d\xf4\x77\x13\x5a\x38\x4e\xc7\xd8\xf7\xbb\xe8\x9c\x84\x6f\x02\x3a\x60\xcc\xc6\x09\xbf\xd2\x84\x0e\x3c\x08\xdc\x7b\x5e\x35\x6d\xe6\xb6\xec\x55\x55\x5c\xcf\x17\x21\x17\x2e\x53\x11\x80\x4c\x2c\x6b\x73\x73\x5a\x60\xec\xfc\x76\x48\x2d\xdb\x4b\x81\x6a\x14\x68\x87\xe5\x3c\xde\x26\x34\x47\x91\x76\x78\x8e\xb4\x5b\xd7\x42\x31\x4e\xb7\x7b\xc9\xbf\x34\x9f\x19\xc7\x91\xd7\x0d\x9f\xca\xa0\xfb\xab\xa0\xb0\x57\xc6\xd1\x89\xdf\x45\xd7\x24\xfc\xfd\x49\xe0\x7b\x0e\x9f\x26\x3c\x1b\x1f\x06\xbe\xd7\xe7\x71\x13\x4e\x06\xc1\x20\x40\x5a\x3d\xe1\xc3\x49\x2f\x0c\xa7\x30\x7a\xd6\xf9\x6f\x99\x5c\x3c\x0f\xfc\x5b\xa1\x5e\xef\x31\x7d\x7c\xc4\x2c\x0b\xe0\xe5\x66\xa5\xfe\x22\x81\x8f\x63\xa4\x55\xe1\x45\xbc\xff\xf6\xea\x20\xa0\x4d\x0f\x50\xfa\x37\xec\x37\xd2\x1a\xf9\x6f\xda\x02\x6d\x69\x6a\x23\xb3\x61\x77\x91\xac\x02\xf1\x0a\xc4\x04\x31\x7f\x48\xd3\xae\x2f\x88\x85\x81\x72\xbe\x71\x0d\xfd\x8d\x06\x66\xc1\x35\xc9\x04\x7a\x91\x8e\x18\xdd\x2a\x92\x79\xe4\x83\xd3\x34\x89\xf2\x16\xc4\x02\x76\xfd\x81\x8e\x5d\xc8\x14\x4d\xe0\x95\x86\x57\x22\x72\xb2\xe5\x88\x27\x7a\x9f\xcb\x28\x10\xf2\xc2\x5d\xea\x02\x76\x90\x36\x24\x57\x29\x93\x59\xa5\x2a\x32\x18\xed\x1b\x01\xe1\x24\xdd\x26\xc6\xfb\x13\x39\xc7\x1a\x36\xae\x64\x86\xff\x04\xf2\xf6\xbd\x24\xe1\x59\x20\xdf\x2c\x7a\x25\x68\xe5\x7d\x22\x23\xd3\x34\x20\xab\xab\x94\x81\xb4\xe6\xa3\xad\x9a\x71\x75\x2e\x54\xd3\xbc\x29\xf5\xaa\xd2\xfc\x1b\xa6\x46\x7b\x7d\x14\xe0\xe5\x65\xa2\x5a\x30\x3e\x42\xce\x6c\x03\x06\xda\x12\x7d\x6d\x55\x96\x10\x8c\x40\x1e\x47\x2c\xe6\x1b\x51\x0b\xfc\x00\x99\x5d\x12\x3d\xd7\x7f\x37\x3b\x24\x73\xe6\xea\x8f\x7b\x9e\xdc\xe0\xcd\xa7\xce\x7e\x4e\xa6\x8c\x30\xa8\xa7\x3a\xd3\x03\xc4\x93\xa2\x3c\x22\xf8\x8a\x75\xd8\x34\x31\x69\x4f\xe1\x0d\x96\x5f\x32\x7e\x1a\xfe\x34\x69\x34\x98\x3b\x8a\xbe\x73\xfa\xa0\xee\x3c\xe1\x6d\xad\x7b\xae\x92\xa0\x12\xdb\xf7\xbc\xfa\xcf\xba\xc5\x93\x55\x4b\x43\x9c\x77\x44\x9b\xaa\xff\xcb\xac\xac\x1c\x56\xb5\xd4\xe5\x2e\xd3\x58\x30\xf8\xe6\xa1\xe2\x1d\x16\xa2\x67\x6d\x63\xfa\xae\x5b\x05\x8e\xa5\x2f\x3c\x87\x59\x37\x91\x4c\x86\xbf\x02\x42\xfb\x7c\x77\x17\x7f\xb4\xb9\xca\xc2\x73\xd0\xf2\xa3\xbf\x48\x2c\x7e\xbd\x94\x69\x4f\xf2\xe0\xbe\xe4\x3d\x0c\x86\xd2\xef\x7c\xca\x7f\x9b\xe0\x32\xc5\x26\xd9\x8e\x4a\x5d\xe9\xeb\x68\x52\xf8\x25\x7a\x97\xa3\xef\xb9\xa6\x17\xe0\xb9\x6b\x69\x98\xbe\xdc\xf3\x49\x94\x86\x9b\x87\xaf\xfc\x20\x58\x5e\xf6\xb1\xd3\xbd\x5c\x44\x82\xba\x7e\x30\xbb\x80\xf5\x9b\x31\x0a\x84\x32\x86\x38\x66\x4c\x11\x43\xee\x18\x58\xff\x2d\xe9\xcf\x42\x8b\x38\x89\xe4\x52\xba\xaa\x30\x69\xba\x27\xcb\x78\x83\x1a\x15\x13\xc2\xda\xb2\xb6\x49\xdf\x5d\x9d\x65\x7a\x35\x1a\xe1\x98\x4c\x4a\x5c\xf5\x4f\xd2\xf0\xf4\x79\xee\x9f\xbc\xcc\xd1\xc7\x7c\x00\x9a\xac\xc7\x5b\x03\x17\xaf\xe3\x50\xf0\x3a\x9e\x32\x5e\xc7\x77\x08\x1e\x5f\xba\x86\xdf\x23\xa6\x51\xc9\xe2\x98\xa6\xf1\x6a\x06\x2c\x08\x8f\x9e\xde\x92\xb1\x23\xbc\x21\xb3\x35\x63\xfc\x9a\x72\x95\x45\xb7\xd1\x2a\x7e\x87\xa4\x41\xda\x00\x9d\xf4\x6c\xdf\xb4\x42\xd5\x0e\xc9\xb8\x9d\x52\x97\xdb\x5d\x54\x46\x05\xf8\x0e\x81\x36\xa8\xe6\x41\x84\x2b\xe5\x42\x60\x54\xdd\x8b\x2d\x73\x09\xd6\x33\xfb\xe8\xea\x0c\x57\x66\x84\x38\xab\x4c\x81\xd1\x8b\x73\xe6\x40\x4c\xb3\xac\xf5\x78\x00\xd8\x46\x75\x56\xd6\x05\x38\x87\x30\x38\x0c\x30\x57\x98\xf4\x98\x5e\x81\x27\xe3\xad\x7b\xf8\xd3\x30\x8b\xd9\x05\xbb\xca\xa2\xc6\x3b\xda\x00\xae\x0f\xd7\x84\xd3\xa1\x09\x73\x62\x05\x0e\x9c\x5d\xb5\x03\x12\xbc\x22\x05\xab\x2c\x60\xa4\x25\x3e\x4f\xd5\xfc\x32\x56\x9c\x5a\xe2\xc6\xdd\x69\x2c\x76\xdb\x2e\x99\x63\xee\x05\x38\x57\x1e\xa8\x7c\xaa\x12\x83\x79\xb8\x71\xfb\xa5\x50\x28\xef\xa2\xd7\x25\xea\xfd\x8c\x7a\x3f\x39\x7d\x93\x6e\xec\x16\x7e\x4f\x3a\x40\x35\xfd\xd4\x31\x7d\x62\xe6\xfa\xb2\x87\x7a\x08\xb3\x4b\x99\xde\x82\x89\x34\xd1\xe9\x9f\xe4\xe1\xc1\x0f\x28\x0f\x2f\x3f\xa0\xfd\x7c\x80\x28\xda\xc5\x12\xaf\x06\x0d\x3e\x60\x12\x93\xb8\x7f\x1b\x8b\x97\xb4\x5f\xc6\x75\x3b\x6f\x10\xc5\x36\x5e\xfc\x85\x98\xb1\xda\x62\x28\x46\xac\x36\xff\x5f\x97\x65\x8a\xb2\xaf\x34\x2d\xd3\x7c\x7b\x3f\xf4\xa1\xe1\x4a\xbf\xdf\x00\x47\x1a\x55\x73\x30\x93\x4e\x87\x17\xc5\xb0\xa0\xed\x2b\x05\x40\x03\x53\xdf\x14\xf9\xe0\x60\x31\x5a\xea\x01\x05\x24\x6b\xd9\x84\x90\xcc\xb0\xf5\xe2\xf2\xf3\x8d\x11\xc1\x25\x13\x84\xe3\xe1\x07\xd0\xfe\x6b\x6f\x88\x07\x6a\xd3\xe0\x01\x6b\xe3\x21\x5c\x8c\x86\xda\xa6\x9c\xa8\x62\x06\xd9\x2a\xd8\xb7\x93\x33\x85\x95\xe0\x50\x75\x8d\x67\x9c\x61\x5f\x85\x34\xa4\x19\x15\x79\x91\xc5\x57\x45\x29\x90\xc7\x11\x7c\x01\xa6\xd3\x32\xbb\x5d\x8a\xfd\xc3\x52\x0a\xd2\x28\x40\xad\x85\x7b\x41\x2d\xe7\x95\x6f\x34\x6b\x6a\xf5\x4e\xe8\x5d\x70\x29\xcd\xea\xa3\x0b\x27\xb9\x1a\xd3\xbd\x91\xd0\x34\xac\x9e\x1f\x08\x9c\xb3\x8a\xa7\xaa\xd0\xca\xb5\x18\x4e\xdf\xb4\x5a\xfc\xa5\xcf\xe8\x39\x7a\xf3\x90\x0d\x71\x2f\x65\x71\x74\x98\x37\xf4\xc5\x93\x58\x86\x98\x6a\xc8\x23\x5a\x83\xac\x57\xcc\x09\xee\x5e\x91\xe0\x8c\x73\x92\xd2\xcf\x58\x1c\xb0\x58\x70\xae\xa5\x8c\xd8\x3a\x69\x9c\x07\x2d\xe4\xa1\xc0\x7c\xa6\xe9\xe7\x98\xb0\x60\x7d\x07\xa3\x9d\x5c\x20\x07\x82\x67\xe8\x2e\x47\x31\x4f\xc9\x69\x6c\xb0\x65\x59\x04\x72\x07\x37\xd6\xc5\x77\x5f\xea\x3a\x59\x9f\x7a\x14\x73\x93\xe3\xb9\xd4\x13\x1d\x72\xcf\x07\xa7\x9c\x29\xbd\xf4\x82\xe9\x4e\x32\x97\xe7\x06\x9d\xdb\x14\x04\x48\x07\xcb\xef\x73\x29\x57\x93\xca\xc2\x96\x60\xc1\x29\xb8\x08\x6a\xae\x38\x83\x8f\x8b\x7d\x50\xc4\x94\x73\xd2\x0d\x6e\x31\x8f\xb5\x69\xcc\xaf\x64\xe0\xd2\xfa\x5a\x1d\x5b\x88\x93\x04\x41\x9f\x8d\x98\xd3\xd2\x20\x08\xf4\x49\x50\x17\x57\xb8\x2c\xd3\x04\xf3\xe1\x9b\xa3\x33\x85\x0e\xf4\x88\x48\xf1\x8b\x2d\x7c\x92\x12\x07\x1c\x3d\xbb\xc5\x4c\x6c\xf4\x6f\xa7\x30\x69\xdd\x31\x0c\x90\x5a\xf4\x8d\xe2\x58\xc9\x45\x04\xbf\xbf\x06\x76\x3f\xdb\x36\xef\x52\x72\x01\x83\xa8\x4c\x31\x96\x60\x55\xd9\x03\x0d\xea\x12\xcb\xca\x4a\x66\xd7\x72\x1e\xd0\x34\xc9\x8d\x02\xe4\x13\x98\x5a\xe4\xde\x2f\x74\xbb\xab\x25\x71\x1e\x25\x4d\xa2\x01\x72\xb6\xc6\xbc\xb2\xf4\x95\x1e\xef\xfe\x46\x96\xbd\x98\x50\x2a\x6d\x96\x74\x88\x03\x7c\xe6\x86\x17\xcc\x1e\x53\xad\xa7\xb4\x6e\xf6\x86\xf0\xb5\xb1\xd1\x7b\x53\x0f\xae\x3d\x67\xd2\x24\x4b\xdc\x17\x7a\xe6\xda\x12\x11\xfc\x22\x97\xf0\xac\x8b\x1c\x59\x5a\x63\xd3\xaf\x40\xf0\x51\x62\x9e\xac\x29\x83\x16\xe7\x7b\xca\xe0\x9a\x03\xe7\x13\x52\x5b\x67\x55\x0c\x1a\xab\x4b\x52\xcb\x5c\x93\x77\x88\x73\x03\xc0\xc1\x41\x6d\x07\xc7\x9e\x13\x6c\xcf\x89\x3a\x50\xe2\x9c\xdc\xb6\xb7\xd5\x26\xad\x6d\xcc\xbc\x3e\x53\x00\xb7\xb6\x56\xb2\xf5\x28\x90\xe8\x19\x13\x69\xb2\x6d\x5a\x4f\x7d\x59\x5c\x50\x4a\x9c\x4c\x86\x58\x08\xb3\xb1\x8a\x89\xa0\x2d\xda\x3a\x59\xe9\xf5\x09\xea\x1a\xe0\xf5\x07\x69\x36\xe0\xa5\xde\x52\x14\x71\xd3\x77\x09\x0d\xa4\xa9\x13\x0b\x97\x90\xaf\x34\x89\xe7\x7d\xa5\xc7\xe6\x23\x2c\xb7\xc5\x46\x96\xc9\x44\x83\x6b\x6f\xb3\xc4\x01\xad\x4e\x62\xbe\x2a\xec\x78\x82\x6a\xa5\x26\xa8\xd5\xb0\x6e\x55\x20\x6a\xa9\x61\x23\xd6\x8e\xab\x54\xc9\xfe\x8c\xcc\x76\xf1\x62\xdb\x4d\xde\x10\xe0\x3a\x4a\xb5\x43\x9d\xf6\x82\x5a\xa0\x5b\x8a\x72\xe0\x0c\x71\xa0\x39\x74\x1e\x66\x88\x5e\xa7\x3e\xa2\xaa\xc5\x96\x62\xb3\x44\xba\x46\x27\xa4\x22\x84\x05\xdb\x71\x6d\x94\xeb\x6d\xcb\x09\x74\x4d\x09\x6f\xae\xc0\x76\xda\x4a\x31\xad\xba\xf6\xad\x37\xbf\x08\xdf\x17\xda\x25\x9a\xbc\xbd\x81\x71\x82\x2c\xf0\x86\x84\x9f\x02\x3f\x98\x81\x67\x33\xae\x2e\x5e\xb3\x03\xc6\x97\xa2\x4f\x14\xf7\xf6\x71\x94\x86\xf9\x0f\x9f\x41\x54\xe5\x97\x80\x8c\xd7\x7e\x70\x6f\x31\xb3\x72\x86\x1e\xd3\x05\x36\x74\x74\x84\xbf\xe1\xca\x44\x86\xe4\x82\x41\xf0\x7a\x1c\xac\x95\x9d\x34\xaf\x48\x9c\x0f\x71\x31\xea\xec\x91\x70\x7f\x67\xdd\x2f\x21\x1c\xf8\x46\x75\x5c\x4c\x86\x17\x14\xf1\x46\x22\x65\x2b\x2d\xc9\x0d\x7c\xb3\xdd\x00\x82\x99\x8d\x3c\x01\xcf\x86\x29\xcd\x0a\xfa\x36\xc4\xe1\xf5\xf2\xf2\x45\xec\x97\x94\x58\xcb\x40\xb5\xa8\xe5\x52\xca\x63\x87\xb8\x34\x45\x39\x8a\x51\x26\x6e\x28\xcc\x3f\xf9\xe5\x94\xc5\x64\x54\x94\x97\x3b\x52\x35\xcb\x94\xaa\xf2\x27\x91\x16\x01\xc5\xf2\xfd\xf8\x52\xca\x4e\xf3\x73\x78\x76\x21\x3d\x4a\x8d\xf7\x58\x48\x59\x5d\x02\x50\xfe\x92\xea\xc4\x62\x15\x9d\x0c\x80\x66\x91\xed\x58\x3b\xd1\x68\x7f\xbd\x99\x24\xd6\xaa\xdf\xe8\x98\xc8\x71\x4b\x5d\x67\xc2\xcd\xe9\x3f\xa4\x60\xd3\xe1\x07\x0e\xf8\xb4\x84\x26\xb9\xd5\xe5\xb5\x8c\x66\x51\x09\xc8\x16\xe0\xc2\xcf\x16\xe1\x2c\x29\xd3\xf3\x73\x5c\xd2\x57\xbb\x28\x2f\x37\xd9\x28\xde\xb2\x30\x1c\x69\x91\xef\x8c\x24\x2a\x1c\xb8\xa6\xde\x2d\x18\x5c\xea\x06\xba\x85\xec\x71\x01\xae\x76\xac\x87\x47\xce\x80\x50\xbc\xd2\x57\x2a\x1c\x4f\xaa\x0b\xdf\x2c\xc7\x9f\x65\xe3\x9e\xa0\xc3\x08\xb3\x74\x44\x7c\xfa\x3c\x8d\x49\x10\xe8\x3c\x8e\x13\x82\xf0\x80\xee\x60\xef\xed\xc6\xee\xce\x96\x47\x91\x84\xe5\x65\x6f\x67\x5f\x7e\x62\xa9\xf5\x65\x8c\xca\x79\xcb\xeb\xd2\x61\xd5\x29\x70\x31\x1a\xd4\x6e\xfb\x5e\x73\x4c\x3a\xfa\x6c\x32\x2e\x82\xda\x3d\x53\x2e\x28\x6a\x66\xac\x4e\xab\xbb\x58\xae\xf5\x19\x09\x2f\x60\xad\xfd\x2e\xca\xc3\xfd\x17\x81\x6f\x1d\xc7\x60\x79\x99\x08\xfa\x01\x54\xc0\x4c\x0e\x11\xa4\xeb\xa2\x8d\x30\x8f\x69\x23\xdb\x19\xa6\xb8\x47\x38\x62\x2e\x94\x82\xa0\x9e\x7b\x1f\xdd\x12\x83\xe6\x85\x64\xb8\x77\xcc\x79\x7d\x00\x2f\x67\xf7\x2c\x15\xbc\x1c\x25\x5d\xdc\x23\xe1\xa7\x2e\xf3\xeb\xc2\x3f\xf7\x3e\xaa\xcf\xc9\x63\xc8\x1e\xf9\x72\x28\xc9\xe3\x55\x8a\xaf\x7f\x9b\x60\x5d\x13\xda\xf6\x1e\x37\xf2\xb7\x4a\xe9\x59\x62\x8a\xbc\x51\x5f\x03\xd0\xdd\x2b\xab\x47\x97\x36\x4e\x11\xe5\x7d\x3c\xf8\xeb\x1f\x51\xde\x3f\xa2\xbc\xff\x8b\xa2\xbc\x37\xdf\xae\x28\x2f\x9d\x26\xca\x03\x35\xff\x51\xec\x54\xc0\xa7\x8f\x5a\xe4\xe5\x60\xb7\x4e\xc2\xa3\xc9\xd9\x65\x4a\x22\xaf\x82\xbf\x5e\xed\x8f\xe2\xbb\x3b\x7f\x14\x33\xe5\xfb\x51\x2c\x95\xef\xcf\xe7\x93\x3e\xf0\xb8\x69\x02\xd3\xb3\x70\x35\x8e\xea\xd1\x03\x1b\x8d\x62\xe8\x8a\xc4\xd4\x2e\x53\x1e\xa0\x2b\x5a\xea\x35\x34\xd2\x8c\x7c\x05\x23\xa2\x50\xd8\x10\x9c\x74\x9c\xc9\xb4\x9b\xf9\xc0\xf3\xce\xcb\x87\x5e\x7c\x37\x1e\xfc\x7b\x3e\x4f\xe3\x58\x7b\x73\x16\x75\xd5\x41\x7b\xa2\xdd\x4b\x9a\x0c\xf0\x5f\xd3\xae\x7f\xfe\xd8\x4c\xf7\x52\xe7\x9e\x93\xa0\x56\x01\xea\x76\x3e\x7c\xf2\xad\x8b\x36\xd0\x83\x3b\x82\x78\x52\xdc\xb0\x4b\xdd\xc0\xf7\xce\x88\xf6\x6b\x75\x5c\xa6\x97\x71\x79\xe3\x21\x6c\xac\x65\xa0\x29\xba\xc0\xd0\x4f\x1a\x43\x85\x46\x35\x47\x23\x97\x33\xb5\x37\xf9\xaa\xcb\x55\x13\x9b\x11\x3c\x5f\x5e\x2a\x63\x10\x63\x6b\x96\x2d\x24\x83\xb6\x13\xd3\x91\xbf\x64\x63\xaf\x4b\x1a\xe4\x80\x5c\x94\xc5\x35\xd8\x59\x31\x84\xc7\x3b\x66\xb6\xdc\xbc\xa9\x4e\xdc\x39\xc4\x0c\x51\xeb\x14\x65\x47\x38\x83\xed\xd0\xba\x9d\xb4\xea\x94\xf8\xe3\x24\x2d\x71\x12\x7a\xc1\x9a\x6c\x27\x32\x5b\xb4\x08\x88\xbe\xd6\xbc\x63\x00\x1a\xbe\xc8\x70\xcc\x17\x45\xd9\x10\xd8\x04\x73\x56\xa4\x6d\x1c\xe2\x0a\x2b\xa1\x5f\x53\x3d\x32\x4c\x35\x46\x45\x53\xef\xd0\xc8\x75\xe9\x1e\x5a\x27\xd5\xcd\xfe\x00\x7c\x55\x4b\x31\xc4\xb6\xd6\xad\x31\x7d\x48\x5b\x07\x7b\xd6\x60\x1e\x88\xc3\x3b\xa7\xe9\xd6\xe6\x37\x10\xc3\x26\x6f\x83\x84\x37\x16\xd9\x0f\x0c\xb1\x35\x79\xc9\xc0\x67\x04\x9b\x5e\x48\x98\x51\x19\xc6\xe3\x71\x06\x36\x0a\x88\xc9\x73\x79\xb1\xb2\xae\x83\x5a\x21\xd4\xf0\x8f\x13\xb5\xb7\xe6\xda\x60\xc2\x69\xe3\x99\x2e\xe0\xb3\x80\x58\x8c\x48\xad\x59\x42\xbb\xc8\x57\x19\xfa\x05\x57\xa9\xda\xce\x61\x7e\xce\x2e\x72\xa6\x9b\x18\xf4\x97\xac\xa2\x7a\x5d\xc2\x78\x1e\x62\xd3\xe8\x1c\x3f\x3a\xfd\x9c\xeb\x17\xd8\xd2\x1f\x3d\xcf\x94\x1b\xb4\xf0\x82\xd5\xc5\x9f\xb2\x70\x12\xeb\x27\x61\x18\x12\x04\x5c\xf1\x3e\x41\x27\x03\x7e\x52\xad\x69\x70\xf3\x20\x6b\xe7\xbe\x73\xb1\x8e\x87\x16\x3b\xec\x8a\x84\x07\x81\xa6\xc9\x59\x19\xc4\x1a\x11\xd2\x7c\xab\x17\x4d\x49\x66\x48\x8a\x8d\xb2\x8c\x6f\x7c\x65\x11\xa6\x89\xa3\xf4\x33\xf5\xb0\xf3\x78\xef\x17\x72\x8f\x84\xd5\xb9\x41\xa9\xbd\x30\x08\xb5\xf9\x89\x32\xba\x74\xea\xe1\x14\x71\x5c\x17\xd6\x08\x1d\xc7\xf3\x50\x68\xdc\x2c\xcf\xa4\xca\xbe\xbf\x17\x55\xc6\xdf\x4c\x9d\xa6\xa4\x43\xa9\x2c\xad\x50\x7d\xbe\xd9\xa3\xc9\xd7\x84\x8e\xd6\x43\x9e\x9e\xef\x0d\x1c\xf4\xdd\x24\x46\xd2\x72\x97\xc4\x68\x52\xe1\xed\x4f\x69\x45\xd2\xfc\xbc\x3f\x89\x6b\xa5\xc3\x19\x13\x52\x56\xfd\x27\xe5\xd7\x56\x13\xba\x6a\x63\x48\x56\xf1\x74\x85\xac\x47\x61\xfa\xce\xc0\xd0\xda\x36\x9b\x3e\xeb\x94\x8c\x96\xa3\xb9\x69\x1b\x4d\xe1\x60\xaf\x32\xcc\x03\x37\xd1\x8b\x06\xe3\xa1\x53\x5d\x14\x93\x2c\xe9\x50\x62\xa9\x73\x06\xee\x0d\x92\x4e\x9a\x57\x69\x82\x3b\xc5\xa8\xa3\xf5\x2f\x58\x63\xac\x5a\x4d\x4a\x01\x0a\xdd\x51\xc9\x98\xa4\xa0\x80\x63\x5d\x4e\xac\x84\xd4\xfc\x7e\x14\x85\x9b\xab\x58\x9d\xef\x97\xf9\x02\x48\xb1\x83\xe9\x82\x5a\x51\xe5\xd6\x75\x38\x7b\x3c\xdd\xbe\xfb\xea\xe9\xa0\x61\x3c\xa0\xff\x37\x68\xb7\x4d\x37\xed\xb6\x51\x96\xc5\xf5\x2e\x1e\x91\xc8\x93\x3f\x29\x15\x07\x1f\x6f\xc6\x3c\xf5\xcd\x58\xa6\x1d\xa6\xe7\x17\xa2\xf0\xa1\x08\x55\x03\x5f\x5b\xc5\x75\xce\x33\x84\xff\xdd\xe7\xf1\xf0\x43\x35\x8e\x87\x38\xf2\xe4\x4f\x9a\x7e\x1c\x9f\x45\xde\x71\x7c\x06\xe6\xe0\x39\xc1\x65\xe4\x6d\x33\xc3\x31\x12\x32\x27\xfb\x91\xc7\xfe\x02\x45\xc9\x20\x1c\x89\xda\xaf\x8a\x4b\x1c\x79\xf4\x5f\x56\x3f\xa1\xb5\x13\xaf\xf6\x37\x29\xa5\xb9\xc9\x29\xcd\x4d\xa0\x34\xd1\xc6\x94\x71\xd3\xf1\x69\x43\x63\x03\x10\x7d\xd7\x47\x6b\x0e\x94\x4d\x97\x98\x29\xbd\x77\x67\xb1\x3d\x84\x29\xfd\x75\x8c\x5d\xce\x4b\xed\x6f\xd0\xb1\x6c\xf0\xb1\x6c\x30\xaa\x59\x45\xe5\x88\x75\x5d\x8e\x28\x8a\x36\x63\x31\xa2\xbb\x3b\xfa\xbd\x21\xbf\xd7\x55\x56\x5f\x2f\x49\x87\x69\x96\xa5\x29\xeb\x7a\xb6\x51\x1e\xa6\xc0\xac\x00\x49\xeb\x46\x01\xa3\x0a\x9d\x21\xb3\x06\x4d\x59\xd7\xb3\x45\x79\x98\x3d\x59\x16\xbe\xd6\x45\xb2\x28\xc3\x66\x55\x16\x62\x9f\xeb\x32\xa3\x4f\xb4\x18\x20\xb1\xae\xd2\x40\x67\x2b\xfc\x80\x6f\x82\x35\x1f\x5b\x73\x85\x1b\x33\x82\x1b\x03\xc0\xf6\x2c\x04\x60\x9c\x55\xe2\x2b\xf0\xcc\x04\x16\xdd\x3e\x93\x71\x9d\xce\xa3\x79\x6a\xea\xa4\x14\xa6\x61\x9e\x26\x12\x87\xac\xed\x2b\xd0\x6e\x74\xe6\x8f\x8b\x31\x45\x9f\x36\xb2\xf4\x3c\xc7\x89\xe5\xc8\x52\xc1\xb5\xe5\xa3\x2a\xc7\x16\xa9\x57\xbc\x1e\x34\xaa\x94\x4f\x64\x92\xf4\x32\x69\xf5\x4c\x97\xd2\x6a\x00\x1c\xed\x42\x06\x2d\xa6\xd5\x6e\x2d\x37\xbd\x93\x66\xff\x96\xa2\x88\x3b\xcb\x94\xea\x6e\x30\xcf\xa4\x31\xcd\xca\x2b\xa6\xe8\xad\xab\x03\x2c\xb3\x4c\xcf\xd3\x3c\xce\x66\x0c\x87\xe9\xe4\x01\x62\x2e\x26\x0e\x36\xa0\x52\xc9\x32\x66\x4f\x53\xbe\x93\x2d\x99\x4b\xd9\x90\x68\x1b\xb9\xf6\x84\x98\xb9\xdb\x60\x87\x25\xf5\x86\xcc\x9a\x62\x9d\xbe\x9c\x49\x34\x7d\x7a\x5e\x39\xaf\xe0\x13\x12\xbe\xdd\x3e\x3c\xde\xd9\xdc\xd8\x05\x7f\xc2\xe2\x83\xb9\x07\x7e\x75\x70\xb8\xf3\xc7\xc1\xfe\xf1\xc6\x2e\xf8\x14\x56\x9f\x5e\xed\xbf\xa2\x57\xe3\x2b\x7e\x35\xbe\x62\xd7\xfc\x75\x5b\x1b\x47\xc7\x1b\x87\xcc\x61\x31\xfc\x62\xd0\x37\xb7\xf7\x8f\xb7\x0f\xa3\xf0\x87\x41\xe4\xb1\xdf\xdc\x29\xf1\xfe\x16\x34\xb7\xbd\xbf\xe5\xd5\xfe\x35\x6d\xe7\x9a\xb7\x73\xad\x18\x97\x7b\x5f\xf1\x89\x1f\x98\xaf\xfa\x6e\xdb\xb0\x9f\x6f\xbf\x38\x38\xdc\x8e\x56\xe9\x68\xd8\x6f\x36\xc2\x8d\x17\x74\xe0\x34\x15\x7e\x79\xb5\xbf\x4b\x47\xb9\xcb\x47\xb9\xcb\x46\xc9\x06\xf6\x29\xbe\xad\x3f\xc5\x27\x1e\x29\xc6\xab\x4c\xd0\x30\x88\x6e\xe3\x4f\x69\xd5\x7f\x15\xcb\xb5\x43\x14\x15\xec\xef\xc6\xbc\x45\x14\xe7\xc3\x8b\xa2\xec\x5f\xc7\x74\x32\x05\x6d\xc4\x3f\x6b\x24\xc0\x65\xf4\xf1\x5c\x08\x1a\xac\x9e\x0e\x0f\x12\x18\xc4\xb3\x82\x90\xe2\x72\x8e\x3e\xc2\x98\xe7\xe8\x22\x07\x38\xb3\x97\x36\xbc\x69\x9d\x84\xde\xad\x92\x62\xac\x43\x54\xfb\xba\x15\x26\xdb\x9f\xce\x6e\x32\x90\xac\xb3\x0b\x42\x9d\xd6\x53\x3a\xec\x39\x3a\xda\x58\xa2\x29\x3d\x05\x90\x73\x75\x74\xde\x85\x87\x93\xf8\xc7\x37\x80\x6c\xef\xc5\x9a\x4b\xf7\xed\xf9\x64\x1a\x38\x13\x8f\x41\x09\x4e\x14\x70\x29\x78\xc8\x8c\xe1\x2d\x3c\x78\x2b\x27\x43\xba\x3f\x6f\x29\x4a\xe0\xee\x57\x6d\xbb\x7e\x7f\xa9\xd7\xe6\x8f\x39\x1d\xf9\xd2\x33\x39\x80\x0d\x6e\xab\xeb\x94\x0c\xa5\x0a\x00\xf7\x47\x1e\xdc\x0e\xe3\x0a\x77\x54\x9b\x7d\xa3\xb7\xdc\x07\xcf\x11\xb9\xc9\xb0\xcf\x47\x64\xca\xf2\x91\x77\x9d\x26\xe4\xc2\x0b\xd0\xc2\x15\x49\x19\xe7\x15\xd0\xbf\x81\x69\x3b\xcf\x6d\x63\x2c\x58\x1b\x84\x94\xe9\xd9\x84\xb4\xc2\x93\x52\xd9\x60\xed\xac\xc4\xf1\x87\x35\x31\x34\xe9\xbd\x9d\xb3\xfc\xb6\x3f\xb1\xd8\x65\x8c\xd0\x7b\x47\xfb\xef\xdb\xfd\x07\x67\x2e\x73\x75\x9e\xff\xce\x62\x82\x3f\xfb\xdd\xa0\x31\x13\x15\x26\xf3\x77\x1d\x79\x8d\xde\x73\x6f\xfa\xd3\x7b\x6f\xd5\x01\x57\xfb\xac\x86\x63\x7f\x68\xfe\xeb\x6b\xe7\x16\xe3\x46\xde\x41\x5d\xb7\xb5\x07\x1b\xcc\x35\x16\xce\xfd\xb3\x93\xc3\x73\x4c\x9e\x17\x13\x60\x68\x6d\x66\x29\xce\xc9\x21\x1e\x12\x8b\x95\x3a\x5f\x25\x9f\x33\x4e\xe7\x5e\x2a\xb6\x41\xd1\x9f\x4f\x6e\x49\x08\xbf\xeb\xf1\xa7\x3f\x83\xfa\xfe\x4c\x88\xa3\xe7\x1f\x05\xe3\x21\x0d\x7f\xab\xfe\x5a\x80\xb7\x28\xe4\x5c\x4d\x0f\xfa\x92\xf9\xd7\x9b\x83\xf9\xc7\x83\xe8\x8a\x4d\x23\xf5\xa9\x92\x75\xcf\xeb\xe7\x93\x2c\x73\x59\x81\xab\x0a\x9a\xdd\xb6\xbd\xf4\x7d\xcf\x4e\x71\x59\x6b\x4b\xfe\xdf\x56\x6e\xf0\xff\x48\x3d\x08\x04\xe3\xef\xe3\x74\xc6\xdf\xf7\x8c\xf1\xf7\xbd\x52\xfd\x00\xb5\x8d\x23\xb8\xa5\xbc\x01\x62\x9a\x20\xec\x73\x33\xae\x84\x92\x83\x8c\xab\x22\x7e\xad\xa6\x79\x96\xe6\x33\xb3\x55\x02\x28\x29\xcc\x29\xd1\xa7\xcb\x0c\x41\x68\x90\x16\x2d\xf1\x5d\xc9\xa2\x3e\xb1\x18\xc4\x3d\x91\xf1\x14\xbd\x77\x67\x7c\x87\x7e\x69\x66\xa8\xd8\x35\xd0\x18\x17\xfd\xf3\xd1\x23\xcc\x2f\x6d\x47\x3c\x32\x6d\x46\x10\xd6\x9f\x11\x71\xcd\x2d\x56\x89\xdf\x2e\x8b\x55\x12\xb7\x47\x43\x27\xe1\xf0\x05\xca\xc3\xfc\xe7\xd9\x3a\x08\xba\xab\x21\xee\xce\x4f\xb0\xdd\x9c\x6e\x86\x34\x3f\x3d\xc5\x38\x1e\xa6\xe4\xc6\xf2\x13\xe4\x3d\xed\x76\x2f\xab\x4e\x0f\xfe\xe5\x0e\x99\x3c\xe4\xa8\xd6\x6b\x78\x0e\xea\x67\x38\xbe\xc2\xad\x8d\xd8\x1e\x8e\xe4\x16\xfb\xa6\x3a\xda\x33\x1b\xd1\xc0\x83\x57\x2a\x77\xb7\x1a\x63\xbb\x62\x9a\x77\x38\x99\x3a\x3a\x68\xe1\x47\xda\x82\x00\xfc\xe2\xfb\xc0\xd7\x7b\x25\x5f\xc7\xbe\x57\x0d\xe3\x0c\xc3\x01\xf2\x50\x31\x1a\x55\x58\xf7\xf0\x64\x0e\x41\xe4\x87\x4f\xcd\x02\x0d\x68\xbd\xf0\x29\xea\x85\x4f\x15\xc4\xf0\xfb\x19\x35\xc2\x9f\x51\xf8\xb3\x56\xfe\xc7\x59\x2d\xa0\x9e\x2a\xdd\xa3\x9b\xe0\x8b\xac\x85\xa6\xac\xb0\xf3\x95\x51\x5e\x0d\xd9\x3d\x9e\xdb\x64\xf5\xc9\x97\x34\x57\xdd\x89\xd1\x1f\x8a\xf9\x8d\x0e\xbe\x98\xb1\x3d\x68\x74\x5d\x8e\x8b\x9c\xab\x86\xb1\x07\xad\x3b\x43\x92\xd5\x10\x59\xc9\x9e\x7f\xf8\xe2\x4b\x2d\x9b\x7e\x1d\x47\x5d\xb4\x3f\x0f\x37\x33\x4d\x22\x90\x9c\xd0\x53\xa2\x14\xda\x56\xbd\x95\xce\xca\xca\xeb\x58\xfa\x2b\xd3\x68\x14\xe5\x9e\xf1\x34\x4d\x82\xc5\x1c\x8b\x59\xf0\x0c\xc6\x63\xda\x12\xb5\x26\x6d\x89\x58\xf3\xc5\x98\x60\xe8\x90\xce\xe6\xd6\xbd\x66\xb3\x2c\x32\x36\x97\x87\xff\xcc\x65\x2d\x18\x70\x2f\xe6\xd4\x1c\x64\xf3\xb7\x23\xdd\xe7\x49\x63\x11\xbe\x4b\x55\x0e\x46\x56\x8d\xc9\x68\x94\x7e\x8a\xbc\xf8\xac\x22\x65\x3c\x24\x9e\x7b\x6a\x9b\x90\xd6\x85\x03\xdf\x66\x96\xee\xd3\xd7\x6a\xa8\xfe\xb3\xef\xec\xb1\x01\x4d\xcf\x98\x0e\x8b\x62\xfa\xf7\x0e\xfa\xa5\x89\x4f\xf7\xe3\x19\x01\xc0\xe4\x0e\xff\xab\x4d\xfa\xfc\xa2\x21\x7d\x16\x26\x3d\x4a\x4e\xfc\x08\xeb\xc4\x9c\x49\xff\x27\xc6\x3c\x87\xa6\xbe\x38\xa7\xac\x13\x3a\xcd\xf6\xdd\x4c\x9a\xcd\xe7\x44\x5b\x0a\xe4\x5a\x9a\x98\x2a\x90\x93\x33\x02\x5a\xb5\x4b\xa0\xda\x60\xcb\x9c\xbf\x88\x02\x85\x0a\xc7\xf6\x95\x97\xf8\x02\x62\x36\x7c\xed\x35\xe6\xbd\xf8\xdf\xba\xc8\x9f\xe7\x72\x9d\xc3\xe6\xa2\xc5\x92\xf7\x94\x4d\x51\x65\xc9\x23\xcd\x4a\x0d\xf7\x39\x46\xae\x43\xe4\xc7\x4d\x80\xd4\x0b\x66\xd5\xd0\x1f\x2f\xde\x01\xf7\x0b\xc6\x33\x1d\x4d\xb0\xa0\x20\xca\x00\x58\x16\xfd\x3a\x52\xb3\xe7\x2d\xca\xf6\x07\xfb\xdb\x91\x47\xff\xf5\x10\x09\xc1\xf2\x2c\xe2\xf6\x68\x88\x84\xdc\x16\x2d\x92\x46\x69\xb5\xff\x3c\xbe\xbb\xf3\x9f\x73\xf9\xce\x73\x25\xc5\x7a\x33\xf5\x11\xe5\x73\xc0\x36\x5f\x59\x64\xd6\xb9\xb5\x95\x9a\x65\x1c\x0c\xcd\xa4\x4e\x21\x28\xcf\x63\xe8\xf6\x0c\xb5\x60\xbb\xad\xd0\x5a\xe2\x86\xe6\xa7\xaf\x5f\x14\xce\x9e\x69\xd0\x79\x31\xcb\xea\xcf\xe5\xc1\x88\xdb\x9e\x1d\x69\x05\xfd\xa0\x0e\x02\xb0\xca\xa3\xfb\xcb\x00\xd1\x0c\xf3\xa1\xc3\xb7\x76\x99\x13\xb4\xe4\x99\xf2\x2e\x2a\xee\xe7\xf3\xf8\xc4\xd1\xf7\xc1\x9a\xab\x25\xe5\x01\x5b\x94\x96\x2a\xad\x27\x62\x7f\xc8\x5d\x31\x08\xd3\x7c\x98\x4d\x12\xd0\xb1\x5e\x27\x7d\xb1\x40\xf5\xc3\x34\x96\xef\x71\x35\xef\xbe\x78\xe9\x7f\x36\xb4\x30\xef\x73\x56\x9e\xb8\xcf\x8a\x94\x2f\x7b\x22\x2c\x14\xa8\xe3\x28\xd1\xb2\x77\x51\x94\xe9\x67\xfa\x06\x41\xce\xe6\xc1\xde\xeb\x8d\xcd\x63\x16\x88\x02\xb0\x3e\xff\x09\x3d\x3d\x4f\xf8\xe9\x79\xa2\x4e\xcf\xc7\x39\x2e\xca\xcb\x34\x87\x68\x65\x47\xe9\x67\x1c\x71\x7d\x8f\xcb\xf8\x93\x96\xf6\x94\xdb\xb5\xc6\x37\xc5\x84\x44\x4f\x0c\x81\x98\x96\x03\xfa\xec\x95\x11\x23\xe6\x49\x2c\x15\x6e\x9f\xc4\x27\x64\x20\xdc\x62\x64\x12\xf8\x53\x16\xac\x54\x7c\xab\x68\x9c\x22\x65\xa7\x02\x83\x4a\x5f\x53\x99\x50\xb5\xf9\x55\xaa\xaa\xdb\x01\x51\x45\x46\x9d\x56\x6f\xf9\xe4\x5a\x65\xf8\xa8\x22\x3a\x2e\xb1\x12\x75\x5a\xbd\x92\x53\x3e\xa5\xbc\x9a\x87\x3a\x05\xe5\xef\x78\x68\x2b\x60\xe8\xc5\xf9\xc2\xf1\x2e\xd3\x74\x30\xf3\xf3\x0d\xd7\xb7\x40\x53\x3d\xb9\xd5\x2a\xd7\x7f\xd2\xde\xf3\x49\x70\x00\x67\xf3\xce\xfc\x80\x1c\x8c\x7c\x12\x3c\x5b\xed\xd5\x8e\xf9\x13\x55\x99\x1f\x8f\x30\xad\x76\x72\x82\xcf\xc1\xd1\xd3\xf2\x32\xe1\xfe\x6f\xf4\xdd\xb0\xbc\x4c\xfe\x1d\x35\xf6\xc3\x17\xa4\x48\xdf\xcd\x76\x58\x9e\x6a\x2e\xcb\xdd\xc8\x1b\x9b\x24\x0b\x6f\x6b\xbc\x18\xa5\x25\xe8\xe4\x36\xf7\x38\x13\x76\xf6\xee\xb7\x04\x43\xb8\xc6\x97\x65\x9a\x08\xef\xe3\x30\xf1\xc7\x60\xab\x60\x2a\x91\xce\x29\x6a\xa2\x58\x16\x47\xa5\x74\x1b\x1c\xdf\x39\x46\x2e\x6b\xb4\x47\x13\x70\xe0\x52\xc8\x14\x27\x09\xdb\x6a\x2d\x42\x26\x1d\x77\x64\xe1\xdc\x03\x7b\x7c\x22\xde\xb3\x3e\x9b\xc2\x0c\xc8\x48\x0c\xf5\xa3\xd6\x32\xca\xb6\xc1\xc3\x3a\x83\x73\x00\xb1\x9b\x79\xd7\x32\x2f\xf8\x77\x57\xb9\xf7\x59\x68\x58\xd9\x6a\xef\x69\x43\xae\x39\xa3\xea\x9f\xa2\xea\x65\x62\x1e\x46\x31\x48\x75\xb3\xfc\x19\xb4\x50\x0f\x62\x76\x46\x45\xb9\x41\x48\x39\xc3\xe2\xdf\x41\x3b\x73\x26\x86\x81\x51\xe8\x10\x23\x12\xc8\xb8\x18\x74\x89\x64\xe4\x64\x6d\x53\xf6\xbe\xf8\x5b\x69\x93\x31\x1f\xb5\xdf\x9f\xb5\xdf\x4c\xf8\x88\x74\xb1\xe4\xfc\x5a\xd0\x6c\x93\xde\x4b\xf0\x38\x2a\x4a\x4a\xdf\xf0\x39\xd4\x44\x8d\x3c\xa5\x7f\xc2\x8a\x78\xfc\x5b\xb7\xc1\x7b\x3f\x0f\x36\x6a\x5e\x38\x82\x84\x14\x3b\x3b\xf2\xbc\x5a\xa0\x8c\x6c\x03\x46\x1c\xaf\x01\x8f\x7e\xa8\x8c\x3c\x4f\xe0\x56\x69\x74\x62\x56\x46\xe5\x60\x4d\x68\x42\x70\xe5\x87\xe7\x31\x43\xaf\xfb\x29\xdb\x4c\x9c\x5a\x63\xc6\xcd\x86\x64\xfd\x79\x2c\x10\x6f\xa3\x2c\xe3\x07\x04\x62\xa5\xb1\xfb\xa0\xaf\x4a\x4f\x80\xd3\xce\x28\x9d\x64\x80\x3c\xf3\xfc\xe8\x2f\xca\xea\xd4\xf3\xd5\x51\xa7\xf8\x4f\xba\x5d\xfe\x2a\xd2\xdc\xf7\x3a\x5e\x40\x51\xe0\x4b\x3f\xa8\xd3\x3c\x15\x84\x17\x9f\x51\xba\xe4\x78\x79\x19\xab\xbe\x4a\x34\x5c\x2e\x83\x96\x89\xb4\xdf\x61\x35\xce\x52\xc2\xe0\x8b\x83\x51\x46\xcf\x6e\xcb\x10\x42\x70\x82\x61\x93\x31\x60\xc2\x15\x3c\x58\xd3\x18\x95\x80\x80\xdf\x13\xc7\xfc\x68\x91\xfc\x8b\x3e\x98\xbf\x7c\x65\xee\x87\xd8\x77\x5f\x99\xfd\x21\xba\xf1\xbf\x95\xff\xf1\xdb\x1c\x78\x91\x88\x0b\x37\x12\xa8\x01\x89\x09\x9e\x07\x35\xd2\x2f\x27\x0b\x3b\x6a\x60\x4d\xe9\x54\x3a\x3b\xb9\xc9\xe3\xcb\x74\xe8\x76\x4b\xa4\x3d\x7d\xce\x3e\xb6\x92\xc0\x9a\xd5\x1f\x57\x03\xbb\x90\x4e\xc8\x04\x73\x84\x9e\xc1\x47\x25\xe3\x0d\x12\x5e\x52\xd8\x17\xc5\x35\x6b\x51\xe2\x7a\x4b\x4b\x7a\x51\x96\xb9\x29\xa4\x6d\xcb\xcb\xfe\x8c\x7c\x6d\x5c\x91\x78\x16\xee\xee\x8c\x3a\x3c\x3c\xe9\x94\x4a\x70\xc5\x5b\xb5\xc0\x70\x6a\x4a\x1d\xfe\x30\xa8\x71\x31\xa2\xc1\xb6\x79\x35\xdb\x58\x5e\x5e\x9a\xda\x35\x09\x6c\x87\x19\x91\xb6\x83\xe3\xcd\xdb\x00\xcd\x5e\x5b\xce\x94\x75\x83\x67\x7b\xf5\x1f\x84\xf3\x18\xaf\x73\x53\x92\x62\x9d\x8d\xd0\x7c\xcc\xa7\x4c\x07\x47\xd6\x61\xd8\x4b\x6a\x16\xd7\x55\xaa\xe0\x70\x70\x67\x83\x49\xc2\xb0\x3a\x70\xfb\xcb\x11\xbc\x26\xf9\x37\x37\x2e\x5e\x5b\xb3\xe4\xe6\x9d\xf1\xbd\xd1\x38\x1f\x1a\xeb\xf1\x96\xae\x29\xd7\xe8\x53\xab\x2b\x86\x27\x0f\x85\x96\x00\xbb\x09\x69\x85\x1b\xb5\x91\xaa\xd7\xb7\xe0\x20\x09\xa1\x6f\x02\xbc\xbf\xb9\xed\x9b\xd8\x85\x9d\xbe\x8f\x15\x9e\x3a\x1d\x17\x9d\xd3\x98\xd6\x97\xf1\x55\xc0\x9a\x56\x7c\xfd\x62\x7c\xfd\x65\x7c\xbd\xa4\x5f\xb3\x0d\x6f\x01\x3d\x92\x3e\x91\x90\xb3\x4c\xcb\x36\x9c\xaf\x96\x79\xf4\xe6\xab\x63\x5d\x67\x9a\xcb\x26\xcb\x23\xf7\xaf\x0e\x63\xcf\xa8\xab\x58\x8c\x69\xfe\x17\xbc\xa1\x11\x96\x3f\xd1\x92\x91\x03\x0e\x02\x09\x02\x65\x41\x81\x2d\x73\x07\x29\x46\x91\x34\x3c\x7d\x9b\x04\x28\x76\x66\x51\x92\x63\x0d\x87\xc3\x12\xc7\x04\xcb\x6e\xfb\xe0\x97\xb3\xc8\xae\x54\x12\x8f\xed\xeb\x1f\xc4\x81\x08\x9f\x97\x45\xed\xc5\x48\x80\xe8\x2b\xb8\x56\x9d\x94\x83\xe8\x24\x36\x49\xcb\x01\x07\x50\x44\xcd\x96\x33\xc4\x9c\x46\x8b\x3f\x15\xed\x1e\x43\x2f\xfd\x6e\x80\x8a\x50\xf8\x2e\xd4\xde\xd6\x2e\x32\xa7\xac\x90\x3f\x21\x56\x2a\xc3\x30\xf4\x5b\xc3\x9a\x42\xcc\xbd\xb1\xfe\x3e\x8f\x4c\x85\x33\x6b\x2d\xa1\x09\x4f\x75\x4b\x32\x78\xa6\xcd\x63\xb6\x7c\x38\x9a\xf0\x1f\x1e\x4d\x60\x51\xc4\x99\x64\xf3\x70\x9a\x50\xcc\x3b\x7a\x35\x2c\x05\xe2\x71\x5d\xc6\xe3\x31\x2e\x8f\x6f\xc6\x4d\xe6\xd2\x74\xfc\x88\xf9\xb1\xee\x5a\x8c\xa7\x5c\x32\x9e\xe2\x35\x52\xde\xb4\x08\x38\xd8\xea\x7d\x8e\x85\x07\x03\x27\x96\xc7\x0a\xbd\x89\x83\x29\x88\x1d\x14\x79\x2f\x8a\xd0\x55\x71\xb6\xf4\x7b\x1c\xd4\xc3\x98\xd2\x9d\x59\x70\x5b\xb7\x81\x13\x11\x63\x1d\xaf\x64\x83\x48\xcb\x91\x75\x30\x5a\xbb\x30\x83\x71\xd2\xac\x10\x1a\x1b\xd2\x29\x3d\xb1\xb6\x9f\x44\x17\x5b\x5e\xc3\xb9\xb1\x48\x43\xa8\xe7\x44\x5a\x31\xd9\x28\xd3\x98\x45\xd0\x3a\xc3\xc9\x73\xf0\x64\x12\xdc\x4b\x29\xa6\xc9\x70\x6a\x65\x25\x45\x44\x8a\x75\x94\x7f\x42\x7f\x1a\x8d\x20\x80\xc9\x21\x2a\x9f\x3f\x9b\xb6\xe8\xc6\x35\xa5\x53\x36\xa6\x5b\x76\xd5\x72\x27\xa8\xe6\x84\xc4\xc8\xd9\x50\xb3\x58\x9b\x0f\x58\x08\x92\xc7\x14\xc0\xcb\x17\x65\x01\x6e\x1b\x81\xbc\xe5\x3a\x39\xe5\x4d\x53\xe8\xcb\xc8\xdf\xc6\xc5\xc9\x4e\x44\xa9\xdc\x49\xd5\x0d\x07\x5e\xcd\xea\x2c\xca\x33\x77\xfd\xa8\xdd\x1e\x48\xdc\x2c\xda\xed\xd0\x4a\x99\x4f\xe9\xd9\x56\x1c\xa8\x8b\xc3\x41\xbb\x4f\xab\xbb\x2f\x8f\x39\x11\xc7\xfc\x54\x38\xab\x71\xee\x2a\x5e\xa2\xaf\xb6\x66\x4b\xd1\xa9\xc7\xcb\x85\x6c\x4a\x51\xba\x51\xe0\x81\xa8\xbd\xf3\xf4\x01\xda\x01\x58\x65\xd3\xbf\xbc\x55\x1a\x02\x15\xae\xa5\x23\x9f\x22\x1e\x4b\x51\x84\x03\xbe\xf2\xf0\x60\x9b\x1c\xe6\x79\x2c\x67\xc0\xfb\x5f\x22\xe0\x9f\xdd\x78\x74\x57\x99\x60\xe6\x34\x1f\x6a\x40\x62\xce\xa8\x1d\xdd\x67\x6e\x41\xa4\xa6\x8a\xf2\xb6\xa4\x61\xe3\xeb\x58\x28\x2b\xf5\x89\xc2\xb7\x29\xae\xa7\x78\x3c\x41\x1b\x77\x68\xbd\x25\x3d\x4c\x13\x9a\x3a\x8c\x89\xef\xad\xd2\x91\xb6\x68\x93\xb5\x6d\x21\xab\xf2\x43\xd4\xc7\xd2\xb0\x3a\x3d\x53\xbc\xe7\xad\x9b\x97\xea\xe3\x73\xf5\x9d\xe6\x86\x27\xfe\xe1\xbe\xfc\xea\xf9\x38\xd3\xba\x9b\xba\xb3\x6c\x52\xba\xbd\xd4\x39\xae\xee\x5a\x3a\x5e\x04\x17\x75\x92\x69\xa5\xb9\xca\x49\xfa\x34\x59\x71\xaf\xf1\x0c\x24\x67\x1e\x96\x51\x03\x13\xc1\xd3\x50\x1c\x1e\x8c\x18\x27\x9c\x66\x8f\x96\x7a\x68\xe1\x37\x75\x31\xce\x0c\x22\x33\xe0\xdf\x93\xdb\x74\x11\xe7\x49\x86\xa1\x0e\x7f\xb1\x1f\x74\x13\x99\xe0\x6e\xef\x4f\xc8\x5a\xc2\x95\xb9\xf4\x20\xcb\xac\x85\x4d\x8c\x33\x37\x2b\x31\x1d\xf9\x36\xb7\x58\xf0\x32\x05\x6f\x50\x9e\xf7\x28\x15\xb4\x9a\x6b\xa2\x9d\xce\x7c\xb8\xa3\xe4\xce\x30\xce\x4d\x17\x3e\xd7\x29\xb9\x48\xf3\x4e\x0c\xce\xcb\x85\x72\x56\x47\x36\xd5\xc1\xec\xfa\xeb\x64\xe9\x07\x0c\x72\x02\xd8\xfb\x9a\xc7\xd2\xc6\x44\xeb\xdb\x92\x7b\x67\x86\x0b\x95\x79\x64\xd6\x77\x93\x71\x0f\x85\x17\x71\x65\x17\x0f\xfa\x8a\x73\x05\x31\xf6\x6b\x13\x6e\x70\xbb\x64\xce\xcc\xdd\x9d\x4f\xd6\x55\x48\x25\xfb\x70\xf0\xa8\x45\xf8\xf2\x0c\x27\x09\x4e\xde\xa6\xf8\xfa\x10\x8f\x22\x13\x06\xa7\x19\xb7\xb5\x42\xbe\xb1\x1e\xe8\x16\x3a\x67\xdc\xad\xf4\x25\x6b\xf4\xbe\x0e\xda\xce\x68\x97\xdf\xcc\x56\x4f\x84\xd0\xd6\x4c\x85\x36\xf0\x27\xa9\xe8\xd4\x92\xcd\x1a\x8d\x66\xf6\x2a\xe8\xfb\xf6\x80\x33\x1c\x97\x7e\x6b\x67\x7b\xf7\x97\x52\x36\x0e\x8f\xbc\xdc\x0f\xcf\x87\xea\x83\x3e\x15\x8b\x3a\x2d\xe5\x3b\x9a\x5b\x47\x8a\x1b\x99\xad\xcc\x89\x59\x80\xeb\xe3\x36\x65\x0a\xf2\xb8\xa6\xd3\xee\x6d\xc3\x82\xe5\x1b\x08\xb9\xc6\x58\x31\x19\xb7\xf3\x3e\xc8\x5e\xfb\xde\xce\xd1\xe9\xf1\xc1\xcb\x97\xbb\xdb\x5e\x80\xe2\x2c\x92\xe6\x97\x79\x86\x26\x15\xe6\x5c\x93\x7e\xf3\xdd\x93\x9a\x79\x4b\xbd\xa0\x66\xa6\xf4\xd9\xd4\x27\x4c\xe0\xdc\xb6\xe0\x81\xb9\x3e\x69\x0d\x8f\xd0\x2e\x29\x70\x3d\x04\x1c\x18\x11\x4f\x80\x8e\xed\x03\x5b\x4e\x0a\x50\xcf\x70\x16\x1a\xe2\xf9\xaf\x22\x8b\xcf\xb3\x45\xa5\x68\x17\x78\xf8\xe1\xac\xf8\xb4\xca\x89\x13\x19\x8a\x93\x8d\x5c\x25\x2f\x1e\x66\x3a\x46\xff\x5a\x94\xb7\x79\x6f\xcf\x82\x8d\x61\xa0\x25\x11\x80\x9d\xfb\x19\xb4\xc6\x83\x64\xb6\xc3\x66\x78\x2b\x46\x71\x36\x08\x9c\x82\xbe\xdf\x85\xa0\xef\x3b\x26\xe8\xeb\x39\x1c\xc2\xcf\x65\xb0\xfb\x6b\xa9\xc4\x7f\xfc\x47\x4f\x37\xd1\xfd\xad\x44\x3d\xd4\x45\x5c\xfb\x01\x75\x35\x13\xdc\x4f\xe3\x1f\xfd\xa7\x9a\xf9\xeb\xce\x08\xc6\x0b\x25\x9d\xde\xb7\xdf\xc5\x0d\x3b\x57\x15\x9a\xb4\x0d\x3f\x20\x4e\xfc\x80\x31\xc6\x04\x82\x90\x65\x52\x31\xcb\x38\x7d\xf1\xb4\xf0\x1d\x6b\x76\x34\x33\x37\x85\x9e\x67\x8c\xe5\xbb\x46\x96\x97\x39\x09\xa6\x35\xb1\xbc\x4c\x18\xe7\xf0\x01\xa1\xd9\x2d\xca\xc0\x26\x06\x50\xaf\x3b\x85\x1e\x40\x69\xf8\xe4\xa7\x3d\xd8\x5c\xc7\xd0\x23\x6f\xe1\x87\x63\x93\xef\x5a\xee\x83\x9f\xa7\x72\x68\x33\x9c\xfa\x15\x6d\xcb\xf6\x9b\x33\x76\x8d\x58\xb2\x14\xb1\xe3\xea\x92\x09\x93\x76\xd6\xe1\x0c\x4d\x3a\x37\x15\x91\x0a\xe6\x46\x96\xe6\x10\x4d\xb3\xc2\xa4\x03\x4e\x3c\x69\x82\xbc\xc1\x79\xbe\x57\x41\x6c\x18\x2f\x8a\xe8\x84\x15\xa3\x0e\x59\xf7\x46\x71\x56\x61\x8f\x2e\x7c\x7f\x69\x89\x89\x18\x55\x7d\x9b\xd3\x4d\x13\xa7\x88\x0d\x39\x3b\xe0\xb0\xc8\x30\x8f\xb3\xa5\x7d\xf2\xf0\x6e\x45\xc6\xb9\x01\xe2\x3e\xc1\x22\xac\xe7\xba\x77\x5e\x16\x93\xb1\xf7\x20\x4a\xb4\x55\xfe\x84\xa4\xa4\xea\x9e\xb7\xb7\x42\x82\xad\xfb\x5b\xcb\x58\xf8\x06\xaf\xb2\x79\xdc\xc2\xaa\xa9\xb2\x5c\xc3\x4e\xf5\xd8\x6e\x28\x61\xb0\xd8\x0a\x18\xe6\xdf\x50\xc4\xd0\x6d\x0e\x35\x9f\xb1\x86\x29\xa2\xf2\x2d\x41\x97\x26\x8a\x24\x0d\xb9\x4e\xbf\xfb\xf2\x53\x3a\x9e\xe0\x40\xca\xe2\x9a\xb6\xa9\x04\xaf\x1a\x35\x2d\x37\x59\xdf\x93\x3f\x5d\xce\x25\xde\xc4\xe8\x73\x8c\xde\xc7\x68\x3f\x9e\x1a\x45\xa4\x4a\x85\x76\x08\x37\xbd\xfd\xd9\x19\x46\xa4\x67\x2a\x67\x6a\xb1\x18\x9c\x71\x42\xb8\x9a\x8a\xf5\x74\xab\x68\x14\xc2\x44\x9e\x05\xb1\x98\x1e\x4a\xc3\x11\x79\x03\xb8\x4c\x17\x69\x92\x60\xf0\x50\x5f\x4e\xb0\x19\xcd\x62\x9e\xa6\xcc\x30\x1b\xae\x80\x1c\xb3\x5a\x79\x84\x4e\xf7\x5c\x7d\xd4\x61\xdf\xaf\x97\x6e\xb0\x73\xbd\xfd\x59\x6a\xbc\xfd\xcc\x59\x07\x49\xad\x07\x1f\xa5\xe1\xf1\xf9\x1f\xfe\x53\xe4\x25\xe9\x15\x77\xc6\x41\xeb\x7c\xc7\x7e\xd2\xbc\xef\x79\xde\x53\x01\xe6\x07\x84\x39\x18\x1e\xcc\x03\x82\x90\xc8\x56\x7e\x44\x25\xcf\x1e\x26\x15\x5f\xac\xef\x44\xe6\xbf\x50\xda\xc8\xfc\x5e\x64\xfe\x84\xf2\x69\x80\x7f\x46\x71\x5b\xf6\xc7\x3f\x36\x7c\xf9\xd7\x44\x62\x7a\x2d\x48\xcc\xf2\xb2\x7e\x30\x75\x87\x1f\x0a\xe3\xe3\x87\x44\x38\x4d\xc1\xa1\x3c\xa9\x1a\x50\x76\x64\x90\xa5\xb8\x21\x41\x7e\x67\xb5\x8f\x35\x4d\x04\x97\x9f\x11\x55\x86\xf3\x4e\xa7\x17\x7a\x3b\xbb\xc8\x02\x70\x5a\xc3\xaa\xbc\x8b\x21\xb2\x4a\x1b\x82\x37\xfc\xd6\x29\x4a\x94\x66\xe8\x43\x3c\x40\x69\x36\x68\x06\x14\x4c\xf4\x18\xc1\x02\x0d\x5c\x5e\xf6\x1d\xe8\x02\xe1\x6f\xf5\xb3\xa8\xdb\xf7\xce\x8a\x22\xc3\x71\xae\xe5\x2f\x2f\x13\xe6\x12\x75\x62\x4f\x08\xa8\x2e\x31\x5f\x29\xa6\x22\x10\x57\xf3\x67\x7b\xcc\xa5\x23\x74\xca\xd1\x0e\x37\x66\xc3\x73\x23\x18\x03\x87\x74\x85\xcb\xaa\x0d\x14\xe4\x29\x58\xf0\xa9\x03\x83\x04\x0d\x5a\x75\x19\x67\x4e\xd5\xa5\x53\xc8\x11\x90\x8e\xe8\x87\x82\x03\x79\x1a\x94\x4b\x9c\xa4\x93\x4b\x6b\xe0\x5a\x51\x11\x09\x93\x95\x13\x40\xf7\xe0\x4b\x41\x65\xb9\x1c\xec\x7f\xcc\x9f\x05\x3c\x7b\xdc\xab\x8d\xa1\x10\x3e\x5b\x23\x5c\x20\x1b\x70\x95\x9f\x4d\xaa\x1b\x40\x28\xc4\x95\x22\x5d\xe5\xe0\x50\xdf\x09\xca\x89\x8e\x76\xd1\x68\xdb\xc1\xc8\x87\xe5\x61\x05\xd4\x2a\x6b\x25\xaa\x4b\x00\x2f\x17\x4d\xcb\xba\x04\x8e\xbe\xb6\x12\x33\xb1\x11\xa4\xb6\x08\x4f\xe6\xcd\x8b\x05\x87\x54\xf8\x05\x69\x6c\xbd\x20\x91\xfd\xf4\xea\x2f\xab\xc7\x7a\x61\x9f\xba\xaf\xe7\x25\x66\x9c\x45\x5d\x4e\x84\x8e\x4c\xe6\xd5\x8b\xd3\x8d\xcd\xe3\x9d\xb7\xdb\xa7\x3b\x5b\x5e\x80\xce\x35\xfe\xd5\x68\x3a\xff\x6a\x65\x65\x9c\x71\xb6\xd5\xe5\xf4\xfb\x96\x8b\x64\x59\xd4\x18\xdb\x8d\x32\x23\x71\xf4\xbc\x86\x59\xb2\x9e\xe9\x72\x44\xcc\x0b\x68\x66\xc9\x2c\x81\xdf\x9b\x46\x9a\xf4\xb8\x61\x42\x35\xdc\x11\x0b\x78\xee\x7e\x7c\x41\xb5\x9d\xab\xd9\x6a\x3b\xb9\x94\x6a\x6d\xb0\x50\x91\x26\x65\x9b\x26\x32\x38\x57\xab\x40\x83\xab\xe4\x5c\xc7\x15\x03\x21\x19\x89\x2c\xa6\x91\xcb\xb1\x25\x52\x24\xe3\x46\x9e\xb0\x60\xc5\x8c\x57\x2f\x82\x03\x39\xf4\x93\x23\x57\x47\x43\x73\x1d\x5c\xd2\x2f\x47\x2b\x41\x1d\xd4\xce\x74\x25\xe1\x56\x11\x30\xd7\xb0\xe0\xa3\xc8\x21\x8a\x5d\x31\x51\x75\x71\xd0\x1c\x34\x73\xb5\x28\x72\xd4\x04\x61\xb6\xef\x58\x51\xd8\x76\x02\x60\xcb\xe8\x64\x30\x4e\xd8\x5f\xbc\x9e\x45\xcd\xb7\xd4\x94\xc3\xa8\x27\xc6\x40\xc9\xfa\x82\x92\x13\x4d\x1e\x6d\x48\x1e\x66\x71\x6d\x4d\x3e\xed\x7d\x19\x01\x97\x99\x20\xf9\x47\xd9\xa3\x0a\x22\xd8\xac\x59\x92\x08\x36\xc3\x42\x14\x21\x8b\xb0\x64\x6f\xa0\xb9\x58\xd4\x97\xbb\xaf\x17\x17\xfe\x15\x55\x6c\x8f\x39\x0e\xa3\xd4\xa0\x93\xa7\xcd\x36\x32\x11\xc7\x11\x67\x0d\x9b\xcc\xdc\x08\xd8\x21\x3c\x0d\x89\xb0\x1c\xf2\x54\x8a\x84\xe6\xb9\x14\x11\x7a\x4f\xdb\x1c\x03\x34\x45\x00\x31\x07\x37\x45\x97\x4c\xdb\x76\x81\xab\x07\xdc\x1f\xe9\x45\x33\x92\x88\x54\xfc\x12\x09\xf6\x8d\x2a\x43\x8e\x54\x7a\x21\x12\xdc\x3a\x71\x59\x67\x1b\xf2\x3e\x57\x09\x81\x7e\x52\xb4\xf0\x6e\x56\xcd\xbb\xbb\xae\xb4\xf9\x92\x67\x82\xa1\xd3\x81\xd0\xd4\x95\x67\xc7\x05\xe0\xb1\x0e\xe0\x1a\xce\x2a\xdc\x91\x3a\x4d\x73\xbb\x4e\xe5\xc2\x42\x0f\x39\x3b\x07\xac\x20\x2f\x2f\x72\xec\xe9\x4a\x4f\x0d\x99\x8e\x51\x8f\x3e\xaa\x2b\x2b\xa8\xb1\xee\xae\x3b\xa2\x51\x71\x75\xd5\xb9\xcf\xfe\x03\x32\x1f\xb8\x38\x74\x81\xa6\xc1\xd4\x6e\x78\x80\xbd\x4f\x1c\x1a\x29\xe7\xe4\xf3\x69\x8b\x3a\x79\xb2\x94\x76\xaa\x62\x22\xcb\xb8\x66\xcc\x23\xd3\x37\x2b\x35\xae\x9a\xb3\x99\x57\x4d\xa0\x0b\xeb\xac\x37\x5f\xde\x3d\xd8\xbe\x7b\x4a\x15\xfb\xa0\xfd\x55\x6f\x3e\xd9\x46\x2b\x5a\x6d\xd7\x6b\x6d\x3c\x52\x76\x73\xd2\x75\xb1\x23\x80\x44\xb3\x91\x88\xb4\x05\x87\x68\x96\xfd\x7b\x3f\x8e\xa7\xf1\xa3\x3e\x89\x07\x63\x9c\x5b\xfb\x95\xce\x91\xd8\xab\x3c\x9b\x26\x19\x7b\x54\xad\x53\x5f\x15\x6c\xec\xcd\xcd\x6f\x86\xa8\x01\xa7\x23\x1b\xd9\xa3\x38\x1d\x79\x7e\x70\xfc\x2a\xf2\xce\x0a\x72\xe1\xd5\xfe\x46\x76\x77\xe7\x6f\x64\x3c\xea\x4f\x26\xdd\x8d\x1c\xcd\xa7\x60\xc6\xb5\x76\x40\xb9\x85\x9d\x00\x15\x9b\x3d\xc2\xb0\xa7\x8d\x9b\xbc\xe1\x49\x41\x54\x37\x2f\xfc\x9a\x07\x66\xbf\x9d\x16\xf7\x7d\x1a\x00\x11\xd9\xfd\x91\x7c\x6b\xef\x9e\xa5\x0b\xef\xcd\x5f\xf1\x0d\x04\xc3\xdf\x21\xf8\x92\xed\x50\xb9\xaf\xde\xce\xa3\xfa\xd0\x9c\x5a\x19\x87\x3b\xda\xc8\x54\x68\x08\xc8\x82\xe1\x1e\xe4\xbb\x45\xac\x90\xa7\x91\x0a\xc5\xaf\xee\x3e\x93\x22\x14\x26\x0b\x8d\x90\xb1\xf4\xca\x82\xfa\xf4\xb1\xa3\x23\x00\x2f\x55\x10\x78\x31\x4c\x2b\x16\x80\x91\x85\x25\x62\x58\x84\x24\x3d\xcd\x4a\x92\x34\x63\xa1\xfc\xd2\xcf\xf8\x05\x8f\xb8\xcf\x42\xb4\x99\x2d\x58\x18\x93\x99\xbb\xee\x4a\xe4\x37\x99\x39\xd9\xbc\xa8\x9d\xaa\x02\x47\xf6\x4f\x06\xf7\xdf\x99\x73\x10\xcd\x8b\xd3\xe9\x06\x2d\x4e\x7b\x6b\x81\x36\x47\x7d\x62\xd4\x1e\xd8\x75\xdd\x03\xd2\x0a\x98\x23\x5a\x9f\x9e\xdd\xb7\xb3\xd9\xd9\xdc\x94\x53\xd0\xa8\xce\x8f\x5e\x63\x13\x6a\x1e\xa3\x44\xdf\x83\xfa\xb2\xb8\xc2\xc7\x85\x9c\xa6\x71\x51\xa5\x74\x13\xee\xe4\x87\x3c\x82\x84\xb4\x84\x30\x79\x1a\x66\x27\x82\x69\x92\xe1\x59\x11\x74\x69\xa7\x19\x61\x5d\xf9\x56\x1c\x51\xb5\x61\x1f\x43\x45\xf4\x57\x7c\x73\x56\xc4\x65\x22\x83\x36\x49\x3f\x5c\x8d\xc5\x83\x50\xc3\x24\x2e\xcf\x31\x69\x6a\xb2\xd3\x72\xaf\xf9\x44\xf9\xb2\xd8\x9a\x73\x02\x71\x63\x02\x85\x5a\xfa\xb8\xc4\x57\xbf\xe2\x9b\xd7\x25\xae\x2a\xcc\x9c\x32\xe9\xe5\xd8\xc1\xa9\xf6\x0b\xf2\x22\x2d\x2b\xbe\x29\xd9\x5e\x11\x6b\xa6\x95\x5e\xed\x71\xac\x82\xae\xf1\x5c\x50\x77\xe3\x99\x40\x57\x28\xd0\x70\x58\x24\x3c\x20\xda\xab\xe2\x12\x1b\x85\xbb\x66\xfe\x76\x2e\x0d\x58\x34\x60\xe6\xd9\xe1\xf7\xd5\x6a\x2f\x40\x10\x32\x0b\x5c\xfd\x65\xe9\xf0\x03\x4e\x68\xfe\xa6\x3a\xb6\x73\xce\x3a\x7e\xb6\xda\x33\x5b\xc5\x70\x9a\xcd\xe2\x73\x5c\x6d\x56\x3f\x95\x0f\xa8\xbe\x2b\x5b\xc6\xbe\x35\x0d\xaf\xb4\x6a\x75\xf3\x2c\xc9\x4e\x3c\x8b\xba\xcb\xcb\xe4\xdf\xed\xf3\x53\x4f\xdb\x05\xce\x5b\x6f\xb5\xf7\x2c\xea\x36\xab\xa9\x65\x76\xd6\x5a\xe9\x4d\xeb\x44\xe3\x14\xde\x3a\x0a\xcb\xa0\xca\x0e\x08\xf6\x4d\xfb\x2c\x9a\xbf\xec\x94\xa2\xab\xbd\xa0\xf1\xec\x5a\xc7\x6c\x8e\x9b\x30\xd0\x43\x54\x1b\x97\x90\x79\x71\xdb\xef\xd8\x70\x8a\x2b\xc1\xe6\xbd\x15\xd4\x8d\x23\xe9\x88\x53\xa8\xc7\xe4\x91\x68\x06\x77\x4b\xa3\x21\x1b\x7d\x61\xc6\x60\x45\x31\x5c\x13\x05\x15\xd6\xe9\x2a\x0a\xc1\x0c\x65\x59\x8a\x87\xb6\x01\x74\x04\x41\x5c\xe3\xe1\x19\x78\x95\xa5\x5e\x5d\x37\xae\xb0\xc7\x1d\xd9\x9b\xf1\x9c\xe3\xda\xc5\xa3\xd9\xc3\xb2\xa3\x3f\x42\xa5\xe6\x98\x1e\x84\xb0\xce\x2f\x6a\x33\x71\xd4\xfb\x05\x96\x3e\x9a\x4f\x83\xc8\xda\xbf\x4a\x8f\x68\x0e\x3b\x9a\x0f\xf8\x26\x81\xf0\xa8\x8e\xc0\xf3\x38\x74\x3f\xab\x35\xa8\x00\xa5\xc3\x0f\x2d\xb5\xda\x6e\xfc\xda\x88\x55\xc3\x77\x0a\x23\x24\xb7\xc4\xa7\x87\x3c\x99\xe5\x0d\x90\x76\xfe\x59\xc1\x17\x2a\x01\xdc\x4e\xa9\x2f\x5e\x58\xa1\xae\x27\xd6\x02\x98\xd9\x06\xb5\xaa\x5d\x1d\x7d\xd9\x8a\x0c\x8a\xc3\xa2\xdc\x14\xe9\x97\x15\xf8\x9d\x7e\x3b\xb4\x31\x3b\xf4\xaf\x0c\x59\xdf\xeb\x83\xd7\x07\x6f\xb7\x0f\x4f\x5f\x1d\x1c\x1d\x9f\x6e\xec\x6f\xbe\x3a\x38\xf4\x18\x65\x7b\xfd\x78\x1d\xbf\x8f\xe7\xd0\x3d\x37\x11\xff\xe6\x75\xe4\x4d\x20\x32\xf0\xd6\xc1\xbb\xfd\xc8\x4b\x78\x50\xe0\xdd\xed\x17\xc7\x11\x44\xb3\xa3\x5f\x87\x3b\x2f\x5f\x1d\x47\x2c\x0c\x9f\x57\xfb\x7b\x94\x78\xdf\xe3\xc4\xfb\x9e\x22\xde\x77\xe7\xa1\x2f\x25\x2f\x5e\x70\x95\x27\x39\x7f\x8d\x26\xf9\x10\x88\xc0\x39\x48\x9d\x12\x57\xb8\x49\xe4\x44\x84\x3f\x6c\xc7\x05\x5c\x75\xbf\xe2\x1b\xcd\xcb\xb1\xd1\x8e\x86\x90\x4b\x66\x30\xcb\xf6\x09\x12\xc7\x3f\x8c\x29\x14\x3a\x3d\x74\x54\x4b\x12\xd9\xf2\xf7\xb2\xf0\xcd\xeb\x40\x20\xed\xf7\x86\xcc\x26\xbb\x09\x9b\x2e\xc5\xc3\xa1\xb3\xc5\x6b\x42\xa7\x4b\xfb\x70\xe8\x6c\x2f\x38\xc0\xc3\x5e\xa1\x38\x46\x89\xcf\x69\xd5\x52\xb3\x8e\x0e\x9a\xec\x77\xcd\x2c\x15\x79\x24\x3e\x03\x44\xd2\x43\x5e\x57\x58\x87\xba\x56\xf4\xfe\x7d\xe7\x91\xb9\x55\xb7\x41\x38\x15\x13\xac\x68\xba\x07\x40\xe7\x61\x82\xa6\x42\xd7\x48\x4f\xe6\xa3\x43\x27\xcd\xf9\x46\x36\x89\x97\xf0\x2c\x9b\x80\xf9\x92\x89\xd8\xe9\x64\x3c\x4c\xbe\x34\xcc\x5d\xea\xad\x59\x24\x9e\xc0\x50\x84\xf9\x14\x4b\x3d\x21\x83\xb5\x72\x79\xd9\x6f\x3e\x57\x4b\x4b\xd0\xa5\x8e\xf0\x16\x52\x8c\x3a\x1b\x24\xbc\xb9\xbb\xf3\x44\x59\x4d\x6c\x14\x66\xe9\x88\x2c\x2f\x3b\xb3\x24\xb2\x18\xd4\x7e\x19\xac\x97\x7d\xbf\x8b\x4e\x49\x58\x8c\x02\xbf\x0c\x82\x36\x57\xd7\x72\x8a\x10\x8e\x96\xba\xf4\x85\x94\xe6\xf1\x8d\x19\x15\x3d\xe6\x12\x28\x3e\x34\xe9\xbc\x8a\x4f\xa1\xa8\x76\x77\xe7\x3b\xd3\xfd\x00\xd1\x67\x27\xc1\x24\x1e\x5e\xec\xc2\xc2\x6a\x1e\x8e\xac\xbd\xa0\x93\xdc\x0f\x70\x07\xdd\x88\x9d\xb7\xe8\xbd\xce\xde\x9d\x17\xe9\x7b\xc4\x7e\x91\x71\x57\x44\xb4\xcd\x6e\x55\x90\xf0\x3f\x34\x65\xb7\x93\x8f\x39\x22\x48\xea\x9f\x7c\xca\xec\xf0\x75\x35\x03\xb0\x9d\x49\xd5\x7f\x48\xb8\xe5\x6c\x7b\xc0\xa5\x6c\xba\xf2\xb2\x48\x70\x16\x45\x11\xa9\x19\xae\x27\x0f\x3a\xcb\x20\xf5\x24\xb7\x32\x2c\x68\x6a\xdd\x69\x79\x16\xbf\x2f\xad\xb6\x2f\xc7\xe4\xc6\x52\x1e\x83\x12\xf5\xb8\x18\xfb\x56\xec\x44\xc8\x58\x6b\xf6\x8a\x02\x43\xa4\x26\xc5\x11\x68\xf6\x39\xbb\xbe\x4e\x24\x25\x9d\xe0\xec\x84\x0c\xd6\x8d\xaf\xbe\xfa\x0a\x25\x9c\xa0\xef\x79\x75\x6d\x69\xe1\x30\x6b\x88\x30\x0c\xe3\xf2\x7c\x42\x09\xe3\x4a\x9c\x55\x0d\x95\x4a\x94\xbf\x78\x36\x52\xc9\x92\xe4\xf9\x4e\x86\x24\xcf\x6b\xea\xe6\x34\x27\x5c\xbf\x50\xf8\x0a\x38\x7a\xa1\xf4\x71\x40\x7d\x71\x67\x0e\xfd\x22\x1e\x4a\x53\xc5\x74\x17\x44\x27\xc5\x5e\x23\xcf\x13\x81\x76\xe8\x67\x63\xac\x9e\x27\x79\x5c\x5a\x76\xb3\x86\x35\x42\x21\xef\x84\x71\xa6\x45\xae\xc3\x7d\x45\x42\xe2\xf7\x4c\x26\x26\x85\xd4\x82\x35\x40\x9e\xce\x25\x65\x85\x49\x70\xeb\x79\x11\xcc\x19\xdf\x63\x93\x8c\xa4\xac\x41\xda\x07\x61\x0c\x8e\x39\x7e\x9b\x16\x39\xb8\x04\x61\xab\xe7\x9a\x09\xe2\x98\x08\x23\x70\x83\x3d\x9a\x86\xa2\xa5\x95\xdf\xbe\xea\xcc\x3a\x41\x3a\x86\x13\xf5\xf6\x60\xb3\x5a\xa7\x4c\xdc\x7d\x56\x29\x09\xac\x65\xaa\x35\xfe\xa9\x59\x33\x08\x78\x44\x78\xd1\x91\x25\xb5\xef\xa6\xf7\x64\xdd\x55\x46\xbb\x24\xfa\x8f\xdd\x4f\xfd\x02\x92\x53\xb6\x74\xff\x39\xd3\xe0\xdd\xa3\x37\xa0\x1f\x6b\x6e\x32\xdb\xb1\xa1\x51\x45\x7f\x86\xa7\xdd\xc6\x4b\xda\x1d\xa9\xdf\x68\x7a\x10\x04\xfb\xc6\x88\x93\x84\x03\x69\xde\xd2\xcc\x71\x88\xc8\x6e\x5c\xc8\x7e\x4b\x6b\x5c\x5f\xba\x1b\xf0\x7b\x9a\x11\xe9\x8d\x5b\xd7\x59\x87\xee\x9f\x48\xbf\x7d\xed\x22\xab\xbd\x01\x6a\x76\x2e\x30\xae\x78\x84\xa3\xd5\x1e\x6b\xb7\x8c\x3c\xcf\xd5\xb4\x8f\x9f\xad\xf6\xf4\x6b\x1e\x0f\x96\x97\xfd\x72\x25\x32\x9f\x02\x3c\xb0\x5e\x03\x48\xe8\x1b\x09\xda\x9b\x10\xe8\x4f\x85\xc0\x12\x70\xf4\xec\x96\x01\xc6\x14\x18\xfd\xa7\x8f\xb5\x4a\xa8\x5c\x89\xbc\x8e\x47\x69\xa9\x52\x38\x24\x56\xab\xe2\x7c\x2f\xc5\xae\xe4\xb7\xbb\xfc\x79\x77\x27\x14\x91\x58\x17\x18\xd2\x0a\xb8\xb8\x36\x59\xb7\xdc\xfb\x4c\xa4\xd5\xe4\x5e\x68\xd6\x0c\xee\xb3\xd8\x3c\x82\xb5\x6b\x32\x9d\xe1\x4c\x8e\xb3\x74\x88\x7d\x8c\x7a\x01\x92\xaa\x3e\xfa\x72\xb9\x5e\x76\x88\xaa\x6c\xdd\xa5\xd2\xd5\x81\xb9\xf3\xdd\xf7\x9a\xc4\x37\x5a\xce\x30\x5f\xe3\x25\xd2\x72\x7a\xcd\x47\x71\x91\x93\xfb\xe5\xf4\x52\x8f\xe7\x72\x27\x27\x34\x53\xa5\x8e\x96\xa9\xad\xc2\x95\x51\xe4\x30\x2c\x1b\x4a\x4d\x66\xce\x15\xe3\xc6\x15\x9e\x24\x05\xf0\x79\xe0\x85\xdd\xce\x84\x7e\x09\xad\xbe\x15\x93\x58\xaa\xba\x31\x26\x18\x14\x3d\xd2\x04\x52\x76\x20\x71\xe9\xa3\xf0\x90\x27\xc0\xd6\x63\x36\xb8\x75\x2b\x8c\x36\x7d\x15\xb7\x52\x8c\x58\x66\xad\xf7\xc6\x86\x63\x37\x2e\xf7\x80\xd3\xf0\x2e\xc8\x92\x01\x2f\x10\x45\x24\xcf\x80\x27\x88\xd9\x8d\x93\x84\x73\xda\x9e\x67\x93\x52\x90\x09\xe2\x55\xa7\x24\xc2\x59\xf1\xa9\x11\x41\x84\x25\xb3\x28\x25\xbc\x88\x6c\x80\x27\xcc\xd7\x00\xc1\x9f\xdc\x08\x8e\xcc\x60\xa3\x90\xc5\xd4\x38\x44\x92\x1d\x8e\xbf\x49\xc4\x7a\x88\x08\xea\x95\x2d\xcf\xb1\x06\x2e\x98\xd5\x4d\x7a\xcd\x40\x16\xa3\x70\x19\x3d\x6a\x6d\xa1\x70\x94\xe6\xc9\x0e\xbd\x55\x98\x28\x09\x7f\x9c\xc4\x59\xd5\xb2\x84\x41\xb0\x46\xa2\x28\x02\x8e\xcb\x3a\xb8\x90\xc7\x4c\xab\x10\xaf\x37\x01\x8b\x27\xa2\x8f\x57\x57\xfb\xbc\xda\xd6\xc1\xbb\xfd\xe5\x65\x5f\x54\xc5\xe2\x96\x72\x54\x5b\xc7\x51\xb7\x8f\x57\x56\x82\xc6\x61\x90\xc8\x87\x59\xf3\x04\x0f\x1c\x65\xf5\xd7\xad\x91\x1e\x4e\xcd\x0a\xab\x61\x59\x64\xd9\x4e\x4e\x0a\x50\xa0\xba\x3d\xc3\x17\xf1\x55\x5a\x94\x7d\xaf\xba\x2c\x0a\x72\xe1\xa1\xb3\xac\x18\x7e\xe8\x7b\x43\xce\x6b\x48\xb9\x0d\x47\x8e\xe3\x12\x57\xc4\xab\x83\x9a\x1e\x94\x8d\x3c\xd9\x33\x45\xdc\xcd\xc3\xa4\x64\x9a\x6a\xc5\xb8\xef\x94\xd6\x93\x37\x4e\xc7\xd8\xf7\xbb\x68\x93\x84\x1f\x03\xbf\x67\x90\xf0\xf4\xa1\xc3\x9a\x4c\x52\x41\xad\x03\xc7\xed\xc4\x14\xd0\x28\x79\xdf\xdc\x67\x8a\x91\x21\xf8\x16\x4a\xb2\x92\xd2\xa7\x88\x8b\x57\x4a\x2e\x51\x01\x29\x2c\x11\x8e\x7f\x9b\xcd\xb4\x4d\x79\x03\x5d\x95\xc1\x05\x4c\xf4\x6c\xdd\x5d\x4a\xa0\xbf\xee\xe5\xbc\xa2\x2f\x9b\x8d\xcb\x2a\xff\x74\x6a\x43\xb5\x55\x65\xdc\x0f\x3d\x00\xc3\x66\x1c\x1e\x8d\xe3\x21\x6e\x1b\xa7\xb8\x09\x9d\x13\xed\x04\xc7\x65\x44\x0c\xe0\xb8\xc4\x57\x38\x27\x74\xeb\x8d\x8b\x92\x1c\xc1\x66\x64\x54\xb3\xd2\x33\x54\x5b\x8b\xb1\x41\x01\xac\x0b\xea\x56\x71\x9d\xdf\x17\x2e\xb0\x40\x75\xc8\x42\x62\x05\x9b\x60\x09\xc4\x59\xc7\xf1\xd9\xf2\xb2\xbf\x34\xd7\x02\xde\xdd\x69\x15\x9f\xc7\xc3\x0f\xc0\x08\x04\x4d\x22\x99\xbc\x5d\x0d\xe3\xb1\xf4\x82\xed\xda\x44\x53\x26\x57\x63\x51\x4d\x19\xed\x2d\x11\x73\xb1\xc5\xc6\x03\x6c\xbd\x8a\x14\xe3\x9d\xcb\x4b\x9c\xa4\x31\xc1\xaf\xcb\x62\x1c\x9f\x0b\x17\x6d\x40\xb1\x8b\x3b\x9f\xb5\x2e\x8e\xc9\xf2\xf2\x2c\x2d\x35\x59\x54\xaa\xa5\xb5\x5e\xdc\x33\x35\xde\x1c\x0f\x06\x73\x36\x27\xd5\x52\x99\xd4\x69\x42\x0e\x46\xca\x1d\xb1\x62\xed\xb8\x26\xad\x27\x94\x67\x79\xf1\xcd\x44\xf9\x88\x32\x13\xc3\x04\x13\x3c\x24\x32\x14\x1d\x7d\xd3\xdd\xed\x29\xfd\x89\xb0\xc4\x59\x4c\x70\x72\x0c\x1a\x13\x77\x77\x49\x31\x04\x9e\x0c\x37\x3f\xe1\xaa\x0b\x6b\x06\x31\xa3\x66\x4c\x60\xdc\x3e\x0e\x38\x12\xca\x71\x01\x47\x0e\x7f\xc4\xf5\x1c\xde\x3d\xd0\x5e\xd8\x10\xb6\x28\x82\x29\xdb\x78\x7a\x9e\x75\xa5\x3a\x7c\xcb\x45\x21\x71\x57\x49\x85\x05\xf3\xbe\x51\xdd\x01\x53\x7f\xe7\x74\x18\x27\xaf\xee\x79\xe3\xb9\x30\xe9\x93\xee\x60\xea\x25\x67\x96\x36\x49\x0c\x0b\x2b\xa0\x6f\x08\x66\xb7\x1f\xf8\x43\x5b\x6b\x1b\xa4\x88\x5b\x65\x8e\xb3\xa6\x1b\xfc\x60\x2c\xc9\x0a\x25\xfd\xd1\x10\xd8\xc5\xad\xcb\x38\xbf\xf6\x49\x1e\x20\xc1\xb9\x7d\xf1\xbe\x10\x1f\x4c\xb3\x98\xfe\xda\xc9\x54\x01\x4b\x75\x73\x51\xd6\xee\x1f\x99\x7f\x9c\x31\xa9\xda\xc1\x22\x96\xd6\xe8\x33\xfa\xf8\xe5\xad\xad\xf7\x48\x38\xf9\x01\x1d\xe6\xe8\x34\x43\x69\x86\x36\x33\xb4\x17\xa3\x8b\x6c\xc0\x3e\x94\x02\xea\x87\x29\xee\x65\xa6\xf6\x99\x23\x04\x82\x92\x97\xe9\xd2\x71\x2e\x1d\x87\x8f\xa3\x34\xcc\x7f\xf8\x4c\xf1\xd4\xc0\x2f\x61\x60\xb5\x1f\x2c\x62\x05\x6c\x3b\xff\xd3\xad\x81\x7f\x5c\xc4\x75\xd4\x17\xf5\x31\xd2\xea\x43\x64\x2b\x46\xef\xa7\xfb\x10\xb9\xb4\x7d\x88\xfc\xeb\x31\x7c\x88\xb0\x69\xfc\xc7\x83\xc8\xdf\xcd\x83\xc8\xb9\xcb\x83\xc8\x70\x1e\x0f\x22\x34\xe1\x3b\xdd\x6d\x08\x05\xf2\xbd\xf2\x3c\xf6\x03\x4a\xda\x5d\x84\xfc\x88\x26\x6e\x17\x21\xc2\xc9\x07\xf3\x23\x72\x31\xcd\x55\xc8\x4f\x68\x3c\xdd\x93\xc8\x68\xaa\x27\x91\x87\x7a\x10\x79\x88\x67\x90\xc7\xf2\xfa\xf1\xc8\x1e\x46\xee\xeb\x19\xe4\xf5\xa2\xae\xdf\x94\xe3\xb7\x0f\xb6\xe3\x37\x16\xe0\xa0\xf7\x55\x5c\xb1\x2d\x6c\x14\x44\x2f\x3d\xae\xd1\x26\x1f\x8d\xa7\x8b\x3c\x1a\x29\x83\x40\x89\x89\x76\x17\x6d\xfb\xdf\xb6\xe3\x15\x89\x0a\xa4\x99\xe1\x7b\x05\x1d\x66\x51\x17\x6d\xcd\xe3\xc5\x20\x4d\x22\x98\x8e\x24\x26\x31\x45\xad\x57\xbd\x95\xce\xca\xca\x61\x26\xa4\x6a\xba\x59\x2e\x88\x16\x45\xfa\xbd\x42\x20\x48\x78\x86\x84\x2e\x6d\x89\x45\x22\x0b\x5b\x12\xb9\x2f\xc7\x18\x7e\x31\x8f\x92\x95\x98\xba\x46\x24\xbe\x86\xc5\x8d\xd3\x80\x61\xc9\x0d\x44\x70\xe3\x5b\x2c\x1b\x1a\xe5\xa7\x05\x20\x55\x85\x21\x06\xa9\xb6\x3e\x9c\x00\x6c\x40\x5b\xb7\x5b\x91\xf6\x49\x8e\x76\x23\x12\xf4\xa5\x30\xd2\x68\xeb\xeb\x44\x33\xcd\x66\x38\xd6\x36\x2f\x14\xd1\xe1\x85\xc3\x93\x6a\x8e\xdc\xd5\xa0\xa7\x39\x74\xff\x6b\x9e\x03\x09\xa4\xac\x2e\xcb\x5f\xea\x35\xb4\x16\x9c\x4a\x0b\x2e\xc9\x35\xaf\x85\xb5\xc3\x28\xca\x8a\x03\xf8\xe5\x0e\xd3\xcb\xc5\xfc\x5d\xaa\xb7\x2a\x47\x18\x11\xe9\xf1\x12\x06\x60\x3b\xa8\x74\x7a\xaf\xcc\xb5\x0a\x33\xa3\x1a\xea\x60\x0d\x3d\x7e\x57\x3c\x5f\x0a\x90\xdc\x7f\x87\xbe\x77\xc6\x33\x53\x5e\x24\xff\xca\xee\xed\x4f\x52\xde\xe3\xff\x0b\xe8\xaa\xf7\x31\xfa\x08\x74\xd5\x5f\x19\x10\x58\x19\x7a\x33\x9d\xc0\x3a\x95\x04\xd6\xd3\x47\x74\xd2\xd8\x20\xb0\x8c\x74\xe6\x54\xf4\x1f\xb2\xeb\xef\x42\x76\xbd\x75\x91\x5d\x57\xf7\x22\xbb\x74\xf7\x8d\xdf\x09\xa8\x3f\x28\x2f\x8f\x3f\xb2\x62\x26\x61\x75\x33\xcd\x41\xe3\x59\x23\xf3\x07\x1b\xc2\xcf\x68\x73\x1a\xed\xd5\xeb\xa2\x8d\xa9\xf9\x3d\x74\xf4\x0d\x10\x67\x4f\x2d\x27\xb1\x60\x1e\xc1\xef\xdd\xff\x53\x04\xdc\xe7\xc5\x7d\x77\xa3\x4c\x8b\xf0\x81\xd1\xcb\x4c\x3a\xf5\x76\x3c\x90\x6d\x68\x5b\x94\xa1\xa5\x46\x69\x67\xb4\x8f\x2d\x5e\xb5\x53\xe2\x8f\x93\xb4\xc4\x55\xe7\x0c\xa7\xf9\x79\x87\x5d\x88\x49\x27\xcd\x3b\xff\x76\xbf\x3c\xcf\xbc\xfb\xd8\xec\x2e\x84\xd9\xd2\x82\xc0\x7d\x86\xe7\x98\x4b\x0d\x9a\x86\x84\x56\x90\xb4\xe6\x5b\x8f\x13\x10\x2b\xb9\x62\xae\x31\xdf\xe7\x8e\x9c\xe6\x6c\x4f\x87\xdf\xbb\x37\xbe\xf0\x57\xd6\xea\x1c\x66\x61\x8f\xe7\x0c\x43\x5e\x98\xe0\x16\xbb\xc0\x49\x78\x4f\x0d\xd6\xad\x9b\x7a\xf1\x83\x3e\x25\x66\x92\x34\x69\xbc\x67\x7c\x25\xe1\x23\x12\x30\x7a\x84\xd5\x06\x31\x2e\x1c\x45\xfc\x4f\xa3\xfe\x9f\x7f\xdb\xd4\xff\x7e\x66\xc4\xf2\x40\x6f\xe6\x21\x2f\xc6\x25\xbe\x4a\x8b\x49\xc5\xf4\x05\xca\x78\x3c\xaf\x15\x90\xd3\xe1\x41\x13\x9a\x76\x90\x4f\x4d\xd7\x79\x9a\xe1\x10\x38\x66\x38\x93\x95\x78\x7c\x63\xa3\x59\x07\x64\x6e\x30\x2c\xac\x08\x5e\xf3\x12\x1c\x82\xed\x97\x31\x6a\xef\x61\x31\x7e\x34\x26\xc2\x68\x6a\x34\x14\x52\x23\x41\x18\x71\x23\x80\x64\x27\xef\x7b\x65\x51\x10\x4f\x2e\xdb\x93\x79\x94\xcf\x62\xe9\x30\x44\xb9\xdb\x10\x41\x77\xb5\x7b\x08\x06\x78\x5c\xc6\xc3\x0f\xca\x3b\x92\x54\x0e\x6b\x2a\xa2\x71\x9f\x6c\x59\x31\x8c\x33\x98\x20\x26\x95\x4f\x34\xa5\xf3\x22\x1f\xa5\xe7\xd1\x6d\x45\xca\x74\x48\xfa\x4b\xdd\x9a\xbf\x27\x5c\xbe\xeb\x08\xd4\x9b\x87\xbf\x76\x83\x96\x3e\x19\xfe\x03\xd9\x96\x82\x06\x34\xeb\x32\xd6\xe0\xc1\x19\x85\x18\xc6\x55\x95\x9e\xe7\xbe\x9e\x85\x98\xfe\xf8\xfa\x6d\xdd\x27\x41\x5d\xe4\xcc\xe8\x34\x6f\x58\xf3\xdb\xfe\xc5\xd6\xa6\xf7\x88\xbb\x54\xbc\xbb\x5b\x6a\x15\xce\x0b\x01\xb4\x3d\x5b\x77\x77\x58\x49\xa3\xa5\xd3\x80\xbb\x3b\xf9\x3b\x92\x61\x2f\xc6\x87\xf8\xac\x98\xe4\xc9\x36\x20\x50\x5a\x25\x43\x7c\x1e\xac\x6b\xcf\xc8\x6e\x5c\x31\x53\x7b\x5d\x45\x5f\x0e\x63\x3b\xdb\x19\x1d\x4c\x48\x95\x26\x18\x34\x62\xad\x16\xcf\x0a\x42\x8a\xcb\xc5\x1b\x05\x51\xfa\xfc\xad\x6a\xcb\x13\xb2\x9d\xb2\xee\x5c\x03\xa1\x1a\xd1\x6f\xdb\x76\xdd\xa0\x66\x0a\x8c\xb2\xed\x83\xd1\xe8\x68\x58\x62\x9c\x6f\x67\xb6\x15\x8a\xd4\x31\xe0\xce\xb0\xb8\x4b\x14\xaf\x1a\xc7\xb9\x17\x18\x8a\xc8\x0b\x19\xc1\xc9\xc2\x71\x92\xf0\x30\xf1\xc8\x2b\x46\xa3\x0a\xfa\xc1\x90\xd5\xd5\x92\xcd\x29\x2e\x69\xad\x3a\x4e\x12\x39\xc9\x15\x53\x3e\x68\xdd\x46\x52\x45\x4c\x6d\x06\x6e\x28\x36\x65\xe4\xc8\xb5\x9c\xb3\xab\x99\x71\x5a\xdc\x47\x42\x0e\x37\xcd\x2b\x5c\x92\xe7\x78\x54\x94\xd8\x27\xe1\x38\xa6\xe7\x42\x78\xe7\x6b\xf4\x19\xd1\x7b\x1d\xb8\x48\x47\xe9\x59\x96\xe6\xe7\xeb\x73\x40\xdb\x2f\x12\xec\x1c\x8a\x09\x8a\x6f\x10\xb5\x10\xe3\x31\xce\x93\xcd\x8b\x34\x4b\x66\x83\x82\xab\xfd\xb2\xb8\xc2\xc6\x8a\xcc\x54\xdf\x31\xce\xa6\xfb\xf0\xf0\xba\xfa\xbc\x70\xcd\x78\xde\x35\x1b\x90\xd0\x57\x9c\x5e\xc3\xee\x3f\x4a\x70\x86\x09\xee\x34\xa7\x5c\xcf\x68\x8c\xba\xc2\xe4\xb5\xfe\xd8\x89\x07\x51\xbc\x80\x1b\xba\x26\x8e\xd0\xd1\x73\xe5\xb1\x53\x3a\xbb\x84\x6f\x04\xd4\x9a\x32\xc1\xfe\xb4\x33\xe8\xda\x98\xc6\xb9\x5c\xed\x89\x83\xd9\x76\x9d\x48\x2a\xe3\x6d\x8a\xaf\xe7\xed\x8e\x73\x60\xd6\xc5\x62\x28\x2f\x39\xd6\xd2\x7d\xac\xcc\x32\x4a\x8b\x57\xdf\x8f\x80\x02\x8d\x0b\x4a\x13\xa5\x71\x96\xdd\xc8\xe3\xcb\x76\x2b\xb7\x1f\x0c\xc3\xd0\xdd\xc2\xc7\x09\x2e\x6f\x04\xdf\x6b\x23\xcb\xfc\xff\x3a\xb9\x28\xf1\x68\xd0\xcf\x0b\xe2\x9f\x88\xc9\x8b\xe8\xdc\x0d\x02\xd4\x39\x9b\x10\x52\xe4\x2c\x53\xf0\xe1\x06\x41\x4b\x61\xc0\x8d\xe7\x2c\xcb\x08\x85\x39\x0b\x13\xfc\x89\xc4\x25\x8e\xe7\x2c\x7e\xc2\x99\x13\x38\x49\x41\x49\x2a\x62\xbc\x9f\xb6\x31\xca\x14\x77\x81\xce\x7f\x05\x83\xda\xf9\xb6\xdd\x8e\x8a\xd2\x07\x75\xad\xa8\xbb\xc6\xfd\xe5\xb4\xac\x8c\x65\x67\x31\x32\x20\x89\xfb\x18\x1a\x11\x8f\xd1\x34\x68\x27\x64\x10\x08\x22\xdc\x82\x14\xac\x91\x95\x95\x60\xad\x76\x61\x00\x5a\x7f\xe7\xe8\xeb\x6a\x6f\x8d\x79\x02\xe2\x0e\xb1\xe2\x47\xea\xb1\x05\x28\x58\x23\xab\xab\xa2\xc3\x0d\x14\xe1\xd6\xbd\x8b\x25\x2a\xe2\x3e\x70\x02\xe1\x6a\x3b\xf6\xb5\xd9\x6f\x45\x40\x2c\x2f\xcb\x3b\xcc\x57\x76\xdc\xee\x46\x40\xf3\x6d\x9d\xb0\xa0\x50\x0e\x69\x55\xf3\x29\x11\x66\x1e\xf6\x6d\xdb\x86\xf2\xb6\xd2\x2b\x8f\xe4\xb7\x50\xe3\x00\xbc\xc9\x5a\x68\xff\xfb\xf8\x36\x94\x14\x93\x46\xed\xcf\x4b\xe2\xa7\x6d\xde\x5c\x74\x7c\xbd\x46\x4b\x3d\x4a\x94\x5f\x1d\xeb\x91\x12\x00\x8b\xd4\x1c\xad\xf0\x1e\xb0\x74\x6f\xa0\xa4\x69\x1f\xbf\x19\xe7\x24\xe8\xdd\x82\x5a\x83\xef\xd0\xfb\x2f\xcf\x2e\xf8\x10\x73\x5d\xc1\xc3\x1c\x7d\xcc\x50\x9a\x35\xbc\xab\xbc\xd7\xbd\xab\x30\x7f\x09\x01\xfa\x45\x8b\xa0\xf0\x7e\xf1\x08\xa0\xbf\x2d\x2a\xf4\x63\xfc\x4d\x19\xbe\x18\x22\xdf\x39\xf8\x9a\xb9\xcb\x04\x2b\x96\x3a\xce\x97\x45\xce\x4c\xfe\xaa\x88\xab\x32\x54\x17\xc5\xb5\xe9\x36\x53\x51\xb9\x22\xe0\xa8\xcb\x53\xe6\xc2\x22\xc2\x5b\x5d\x46\x58\x73\x71\xbb\x0c\x0a\xa8\x99\x09\xf1\xc0\xa4\x48\x59\xce\xb1\x2e\x06\x22\x4a\x1e\xaf\x61\xdb\x1f\x41\xaa\xb0\x06\x16\xcc\x54\xa8\x2a\x7f\xba\x2c\x40\x34\x4b\xbb\x8b\xe2\xfa\x01\x51\x78\x5d\xb2\x4b\x57\x2c\x3c\x25\xc5\x7c\x2f\x7f\x3d\xcf\x17\x94\x67\x8e\xe3\xaa\xba\x2e\xca\xe4\x6f\x28\xcf\xd4\x82\xbf\xb0\x95\xec\x6b\xb1\x21\x1d\xe2\x4e\xa1\x43\x8a\xfe\xca\xd0\x2f\x33\x65\x9d\xc7\xb6\xac\xb3\xd7\xfd\x5a\xc2\x4e\x2d\x0f\xa4\x56\xab\xb1\xf0\xa3\x45\x57\xd5\x43\x1e\xc3\x3f\xa1\x45\x35\xbf\xc2\x7f\xd7\xa2\x72\xcd\xbf\x95\x08\xd5\x9a\x80\xe6\x64\x9a\x13\xe6\x9a\x20\x90\x96\x8a\x96\xd3\x7c\x54\xe8\xf1\x03\xcb\xd5\x22\xcf\x6e\xfe\xf7\x4a\x6b\x77\x5c\xd2\xda\x57\x8f\x2e\xad\x65\x8a\xb1\xd7\x29\xfa\x9e\x2e\x81\x58\x2d\x87\x5a\xec\x9e\x5b\x40\xcb\xa4\xb7\xbb\x8d\xcc\x1f\x9b\xd2\xdb\x4f\x33\xa4\xb7\x7f\xcc\x90\xde\x6e\xff\x4d\xa4\xb7\x76\x74\x63\x70\x12\xc8\x2e\xbf\x47\x13\xba\xfe\x1d\x04\xbc\xbf\x3e\x50\xc0\x4b\xd0\x6f\xb6\xa2\xae\x81\x08\xc5\x2e\x44\x28\x33\x34\x7a\xe7\x95\xf4\xbe\xe6\x6f\xed\x2c\x49\x6f\xf3\x4d\x7e\xe6\x71\xeb\xa1\x36\xd4\xc9\x44\x45\x4c\x7c\x29\x65\xc4\x54\x31\xc6\x25\xb9\xf1\xf3\x06\x2b\x08\xae\x50\xb2\xee\x11\xfc\x89\x78\x7d\x4f\xb4\xee\x41\x38\x96\xff\xad\x22\xdf\xc7\x10\xf3\xea\x62\xe3\xf7\x8b\x29\x45\xb2\x87\x51\x6c\x88\x85\x14\xad\xbf\xac\xbc\x77\x51\x8d\xee\xdf\xe7\x26\xd5\x7e\x41\xbf\xa1\x6f\x4b\xab\x9b\x54\x73\x08\x78\x93\x9b\x3c\xbe\x4c\x87\xd1\x52\xaf\x11\x1a\x87\xdf\xfd\xea\xb7\x40\x62\xd9\x43\xf0\x9f\x8d\xf9\x58\xc6\x49\x5a\x28\xc4\x72\x61\x47\xb4\xef\x62\xf4\xaf\xd9\x8e\x68\x61\x58\x11\x61\x0c\x35\x23\x96\xf5\x42\xc6\x01\x66\x67\x9b\x5b\x0a\xf0\xf5\xad\x78\x10\x38\x51\xf3\xd7\x02\x35\xff\x8e\x63\xe6\x0e\xc4\x7c\x2e\xec\xe7\x83\x89\xfd\xd0\x1f\x3d\x85\xb0\x3c\x45\x07\x36\x22\x64\x3e\xff\xf6\x13\x2c\x9e\x7f\xe7\x5b\xf6\x2e\x6e\x7f\xc3\x70\x75\x6f\x2b\x13\x52\xc9\xb4\xbf\x85\x61\xc9\x21\x5d\xf9\x59\x91\xfb\xcb\xb6\xf9\xf8\x27\x72\xff\x23\x44\xee\x87\xc3\xf7\x6d\x47\xed\x67\xf7\xc3\x43\x22\xf3\xe3\x6a\x1e\xbf\xda\x6c\x2a\xfe\xef\x45\xe5\xff\x1c\xa3\x37\xf3\x44\xe5\x7f\xfe\x4f\x54\xfe\x7f\x94\xbb\xb5\x07\xf3\xb3\x8b\x5d\xb0\xff\x38\x51\xf9\x0f\xa7\x47\xe5\xdf\x9a\x16\x95\xff\xc5\x34\xa5\xef\xbf\xa6\xdb\xd2\xbe\xfc\x27\x2a\xff\xb7\x19\x95\x3f\x9d\x8e\x8e\x7f\x6d\xf5\x50\x08\xc9\x8f\x0e\x73\x93\x86\xc8\xff\x8e\x9d\x8e\xff\x36\xf8\x16\x38\x76\x71\xd1\x5e\x6d\x8c\x11\xbb\x15\xd9\xa3\x46\x00\x18\xd3\x69\x37\xb4\x43\x98\xf7\x96\x0d\xb8\x4d\x8b\x52\x77\x5d\xba\x47\xc2\x5f\xff\x65\x8c\x91\x62\x11\x41\x50\xf3\x47\x8d\x1f\x58\xd3\x3f\x33\x05\xba\x0e\xb7\x80\xe6\xa0\x46\x3e\x83\x7d\xf6\x38\x9a\x89\xdf\x0c\x4a\xc6\xfb\xf5\x10\x9c\x8c\xcd\xd9\x1c\x68\x19\xcc\xce\x98\xe2\xab\x0e\x42\xf3\x5b\x16\x49\xdd\xdb\x75\xc9\xaf\x36\xa2\xf5\xd3\x83\x10\x2d\xf3\xeb\x1f\xe4\xea\x6f\x81\x5c\xfd\xe6\x42\xae\xde\x3c\x8e\xc3\x92\x27\xd3\x1c\x96\x7c\x9c\xc7\x61\xc9\xbb\xe9\x0e\x4b\xde\x4f\x47\xb2\x7e\xf9\x06\xa4\x2a\xce\xa2\xe6\x75\xdd\x2e\x5c\xf9\x5f\x28\x39\xc9\xee\xcf\x75\x8a\xab\xbf\xb1\x6f\x13\x76\xeb\x3e\xc8\xb9\x49\xc5\x41\x4c\xe7\x85\x57\xdf\x36\x2e\xd8\xca\x07\x2f\xa6\xa0\x83\xdf\x84\x67\x33\xa1\xe9\xfa\x37\x54\x5a\xb9\x37\x86\x50\xe5\xff\x09\xe7\x66\x72\x26\xff\xe1\xc5\xfc\xdd\xd0\x85\x2c\x77\xa0\x0b\xbf\x3f\x0e\xba\x40\xf2\x29\xe8\x02\x6e\x64\x3a\xd0\x85\x32\x9f\x8a\x2e\xe4\xd3\xb2\x7f\x46\x71\x5b\xf6\x3f\xfe\xcd\x1e\x17\x07\x18\xde\x1f\x07\x28\xfe\xce\x38\xc0\x31\xbf\xf7\x1e\x84\x05\x10\x09\x64\x3a\x1e\x90\xfc\x4d\xf1\x80\x89\xdd\xef\x2f\xad\x01\x8e\xd2\x0c\x0d\x33\x74\x90\xa1\x77\x19\xda\xcf\xd0\xef\x19\x4a\x2b\x54\x55\x28\xa9\x50\x5e\xa1\xe7\x5a\x5f\x2f\xec\xbe\x4e\x2a\x5c\x6e\xe1\x51\x9a\xe3\xe4\x5d\x9a\x90\x0b\xe6\xb0\x1a\x72\x77\xd3\x8a\xd0\x39\xf7\xc1\x37\xd5\x79\x99\x26\xab\x43\x9c\x65\xab\xd7\xb4\xdc\xea\x67\x5c\x16\x5e\x60\x7a\xf6\x1d\x66\x29\x04\xb2\x87\x78\x32\x21\x94\x93\xf6\x8f\x1a\x4c\x66\xcc\x30\x0d\x2c\xc2\x35\xf3\x8a\xff\x3c\x2e\x65\xb7\x24\xa4\x62\x34\xaa\x30\x81\xf4\x55\xc2\x1b\x85\x2f\x5e\xa9\x59\x43\x4b\xbf\xbb\xeb\xd6\xc3\xe2\x72\x3c\x21\x38\x79\x85\xd3\xf3\x0b\xdd\x66\x63\x1c\x97\x15\xde\xc9\x89\x7f\x8e\xc9\x26\x2f\x74\x44\x6e\x40\x5f\x3a\x3c\x57\xea\x41\x2c\x80\x89\x77\x01\xf5\xbd\x80\x1e\xba\xda\x18\xbc\xe6\x92\xfa\x1c\x93\xe7\xc5\x04\x4e\xca\xa6\x2a\x22\x0c\x43\x6f\x49\x31\xee\xcb\x66\x71\x48\x8a\x31\x1c\x61\x66\x57\xa7\xe7\xb0\x14\xc8\xcc\xf0\x88\xe8\x59\xf4\x1b\x32\x20\x42\xa3\x9e\x03\x09\x90\x05\xd3\xab\x67\x41\x02\x64\xb1\x61\xe8\x79\x2c\x05\x86\x55\x5f\xa6\xb9\x3d\xa1\x0b\x4e\xd3\x65\x9a\xb3\xd5\xe5\x33\xc5\x4c\x61\x60\xa3\x09\x1b\x9a\x2f\xe7\xfe\x6b\x3c\xed\x96\x81\xfb\x8b\x5b\xfb\x70\xd3\x3a\x61\x68\x7e\xb9\x91\xc4\x63\x82\xa5\xa1\x7b\x45\xe2\x92\xb0\x0d\x14\x75\x41\x2c\x8d\x3f\x8d\xe3\x3c\xd9\xc8\xd3\xcb\xd8\xd0\x1c\xba\x05\xee\x68\x9f\x9f\x90\x72\x1b\x8a\x1d\x33\x5d\x22\x34\x8e\xcb\xf8\xb2\xea\xdf\x6a\xe0\xfa\x36\xfc\xba\xae\x63\x01\x75\xab\xc8\xa5\xb6\xfd\x04\x82\x78\x1f\xa9\x82\x7e\x50\x3b\xd2\x6e\x1b\xfd\xb5\x86\x14\xda\xe7\x41\x9b\x00\x2b\xe8\x3b\x3d\x3d\x8f\x61\x2f\x74\x51\x2d\xc8\x57\x65\x93\x4b\xa9\x86\x55\x39\x17\xf3\xbb\xca\xe3\xfc\xd5\x77\x2f\x36\x7c\xef\xff\x67\xad\x53\x98\x14\x39\x76\x2b\x7c\x59\xb3\xae\x94\xbd\x92\x9f\xb6\x9b\x80\x28\xaa\x61\x25\x99\x32\x67\x63\xe5\x81\x8d\x6d\xa4\xb8\x24\xd0\x17\x55\x8b\x72\xcf\xc3\xa3\x2d\x57\xf4\xc0\x56\xfd\x93\x71\x3e\x40\xf4\x26\xee\xdf\xca\xe1\xf6\x4f\xfc\x2e\xba\x26\xe1\xef\x4f\x02\xdf\x6b\x8c\x92\x67\xe2\xc3\xc0\x07\xf4\xbc\xf3\xef\xe8\x59\x87\xa9\x69\x88\xbc\xe2\x79\xe0\xdf\xf2\x6b\xc5\xbb\xbd\x35\xf6\xf2\xf8\x93\x87\x8a\x2b\x5c\x8e\xb2\xe2\xba\xef\x71\x44\xbf\x0e\x10\xab\xf9\x17\x09\x7c\xaf\x1b\x3e\xad\x3a\x38\xae\xf0\x6a\x9a\xaf\x16\x13\xe2\x21\x07\xd8\xff\xf6\xea\x20\x18\xd0\xff\x94\x31\xd6\xe8\x6b\x3f\xc5\xea\xa5\x3d\xff\x66\xba\xc2\xdf\xe8\xcb\x4a\x0f\x5a\xfd\xe2\x60\xf3\xcd\xd1\xe9\xc1\xfe\xe9\xdb\x9d\xed\x77\xa7\x3b\xfb\x3b\xc7\x5e\x80\xae\x2a\x65\x64\x75\x59\xa1\x49\x85\xe1\x06\xef\x2f\x75\x99\x15\xd5\xcd\x8c\xbb\xd3\x08\x50\xa5\x7c\x84\x68\xae\x3e\x74\x2f\x21\x07\xb9\x30\x94\x6e\xf8\x08\xe1\x66\x55\x0c\x57\x67\xa1\xa9\x84\x55\xd4\x69\x5a\x6d\xe7\xc0\x3d\x88\x5c\xa0\x2c\xbf\x20\xa9\x70\xcd\x51\xa8\x68\x1a\x1a\x54\x61\xf2\x24\x8d\xc2\x19\x6a\x32\xbf\x5d\xb8\xed\xab\xa1\xc2\x84\x3f\x84\xee\x8a\xc5\x84\x30\x79\x36\x44\xa9\xe2\x3e\x50\xc5\x80\xa4\x3a\x94\x35\xa6\xe5\x65\xef\xac\x28\x32\x1c\xeb\x61\x76\x85\x08\x4e\x9f\x0f\x97\x05\xba\x02\x28\x4c\x55\xfd\xe0\x76\x9a\x77\x91\x25\x0b\x2c\x37\x7f\x15\x53\x2a\x5c\xb5\x3a\xcd\x58\xb9\xfb\x92\xc6\xc0\x45\x67\xdb\x6c\x68\xd1\x03\x60\x1a\x9b\xa4\xd7\x5c\x8f\xfb\x19\xf9\x2f\xbe\xa2\x5e\x4e\xdf\x91\x59\x3e\x02\x1e\xcb\xdc\x76\xf7\x2c\x15\x1f\x97\x95\xf8\xc5\x7c\xde\xe8\xd4\xdf\xbd\xac\x6d\xd5\xce\xbb\x87\xcd\x2d\x5c\xd7\xae\xc7\x54\x3f\x88\xb5\xee\x9f\x56\x6c\x34\xcd\xda\xd6\xe8\x81\x2c\xa0\x9b\xdd\x9e\x7d\xf1\xeb\x95\x5f\x8c\x74\xb6\xae\xaa\x01\x6a\xbd\xf8\x37\xbf\x99\x8b\x1f\x6d\x7c\x3b\x5d\x39\x9a\x43\x69\x9c\x5b\x67\x90\x98\x60\x65\x14\x5b\xc1\xa7\xe9\xf7\x5b\x2b\x28\xbc\x7a\x61\x7e\x07\x2e\xf5\x18\x2e\xce\x6f\x54\xcb\x68\x95\x27\xc3\xb5\x8b\xad\x4b\x57\x82\x60\x4a\xa6\xd0\xae\xdb\xcf\x31\x64\xd9\x5e\x8e\x87\x59\x51\xe1\xd9\x23\xd1\xec\x5f\x9b\xa3\x60\x16\x5f\xe2\x62\x63\x5f\xe6\x15\xc9\xd2\x78\x8c\xc3\x62\x8c\x73\x8d\x64\x19\xc6\xc3\x0b\xa9\x51\xc2\x0b\x62\xd4\xec\x4f\x77\x8e\xfe\xc8\x28\xbf\x12\x7a\x5a\x1d\x16\xd7\x07\xd0\x22\x3c\x12\xeb\x9c\x9e\x81\x51\x33\x92\x45\xf6\x47\x4d\xa0\x35\x75\xd0\xc5\x5a\x07\x65\x85\x72\xd7\xfa\xc0\xdf\x1d\xa8\x42\xdf\x00\xee\xa4\xbd\x82\x8a\xb2\x5e\x57\x79\xb5\x92\x35\xbf\x20\x35\xf9\x76\x2a\x46\x24\x10\x0e\x4c\xe2\x34\xb3\x54\x7e\x14\x41\xb3\x59\x4c\x72\x4a\x43\x96\xf8\x3c\xad\x88\x72\x21\x67\x95\x58\x59\xa9\x27\xf9\x8c\x32\xab\xab\x30\x49\x17\x71\xb5\x2d\x33\x0e\x8b\x6b\x2b\xa0\xba\xd1\x9f\x90\x6f\x7b\xfe\xae\x5b\x00\x9f\xdd\x8b\xdc\xdb\x7d\xf1\xd2\x3f\xaa\x1e\x12\x0b\xe9\x2a\x2e\x3b\xa7\x7c\x6e\x7d\xdd\x85\x03\x39\x21\xe1\xbb\x9d\xad\xe3\x57\x51\x77\x10\x79\xf0\xcb\x43\x34\xf1\xd5\xce\xd6\xd6\xf6\x7e\xd4\x1b\x44\x1e\xfb\xe9\xd5\xfe\x29\x45\xf0\x4e\xab\xe8\xb6\x0e\x02\x74\x5a\x05\x14\x32\x77\xe9\xf6\x01\xdf\x54\xfe\x69\x15\x84\x97\xf1\xd8\x27\xd1\xb3\x53\xf0\x2a\x12\x8e\xd2\x8c\xce\x2e\x89\x9e\x91\x28\x8a\x24\x9f\x03\x58\x21\x2c\x34\xd3\xab\x79\x56\x1c\xeb\xb3\x5f\xb1\x05\x6e\xac\xbb\xcc\x6a\x4c\xbd\xcc\x09\xd5\x7a\xbb\xbc\x82\x2c\x06\x4b\xdf\x3d\xf7\xc5\x42\xde\x56\xf7\xb0\xdf\xda\x19\xb1\xdd\x88\xb9\x05\x97\x5c\x65\x8d\x1e\xd9\x3c\xd8\x7d\xb3\xb7\x7f\x7a\x74\xbc\x71\xbc\xed\xb1\x99\xbe\x9e\x9b\x1f\xfc\x2b\xfa\x1d\x7d\x44\x84\x20\x4c\x50\x49\x50\x4a\x50\x4e\x50\xfc\x20\xaf\xf2\xf7\xe3\x11\x1f\xe6\x68\x52\x71\x4e\xf1\x66\x85\x36\x33\xb4\x51\xa1\x51\x85\xce\x2b\x74\x01\x4e\x2f\x3e\x66\xe8\xac\xd2\x9e\xc5\xbd\xc7\x7b\xa1\x67\x2c\x05\xc8\xe3\x49\x3c\xfc\x20\x45\x45\x5a\x37\x76\xe7\xd9\xd4\x93\x3c\xfd\x38\xc1\x2a\x06\xc3\xe9\x39\xce\x71\x19\x13\x9c\xec\x24\xf0\x22\xc9\xe0\x1a\xf0\xe5\x8a\xbf\xd1\x34\xf0\x58\x5e\xf6\xc0\xb8\x63\x9d\xb3\xbd\x74\xa0\x2b\x9e\xd7\x1e\xdd\xc3\xd6\x6c\x34\x7a\xa3\x8d\x16\x84\x5c\xab\xde\x8a\x31\x04\x2e\x89\x49\x04\xfd\x07\xb1\x41\x1c\xcd\xdf\xfb\x9c\x3c\x59\xd4\xc1\x84\xd6\xd9\x85\x23\x40\x80\x91\x05\x8b\x00\x91\xba\x22\x3f\x34\xd9\x4a\x1f\xf3\xff\x18\x5b\xa9\x4d\x84\xf6\x69\x26\xef\x40\x38\x8a\x8b\x4b\x8d\xf1\x2a\x37\x1d\x76\x39\x55\x29\xf5\x3b\x55\x73\x18\x2a\x12\xb4\xa8\x31\x69\x78\x35\xc6\xfe\x52\x2f\xb0\xaf\x61\xd3\x1b\x8b\xe1\x75\x94\x05\x07\x07\x1f\x79\x25\xce\x23\x81\x38\x8d\x26\x59\x76\x43\xf7\x5e\x1a\x67\xe9\x67\x47\x0d\x48\x58\x5e\x06\xe9\x09\xf3\xb0\xc7\x90\x97\x73\xcc\xc3\x59\x26\x8c\x33\x6e\xfb\xb8\x65\x79\x1c\xf1\xb1\x9b\x7f\xd6\x15\x61\x4a\xc5\xe8\xe0\x84\x55\x16\x4c\xe5\xc2\x94\xf7\xc5\xf0\x18\xc7\x9f\x87\xc6\x10\x28\xce\xb9\xae\x95\x6b\xb4\xbe\xb2\xd2\x9f\x96\xbd\xba\xca\xe3\x61\xd3\x0d\x9c\xe1\xe4\xf9\xcd\x8e\x7d\x68\x61\x87\x3f\xcf\x8a\xe1\x87\xe3\x94\x64\x74\xab\x32\x5c\x05\xc7\x74\x6b\xef\xe2\x2b\x9c\x59\x35\xe2\x32\x8d\x21\x7d\xdd\xfc\x5c\xf1\x3c\xbd\x33\xeb\xde\xf7\x5e\xdf\xfb\xce\x6b\x5e\x09\xcd\x85\xea\xd6\x6a\x49\xec\x37\x94\xe6\x32\x2c\x92\x3d\x57\xcd\x12\x92\x8d\x21\xf7\x9b\xf1\xe9\xda\x7b\x21\xbe\x4c\x89\x59\x2b\xe0\x9e\x75\xe2\x12\x93\x2d\x26\x8d\xd6\x29\x65\xa3\xec\xba\x07\xf1\xb9\xfb\x1e\x08\x72\xd8\x75\x58\x16\x0d\x6f\x3c\xaa\x8b\xeb\xc2\x6d\x04\xb3\x54\x83\x10\xe2\xf1\x19\x8b\xbc\xdd\x5e\xa7\xab\x15\xa7\xa7\x2b\x1e\x7e\xd8\xa5\x2b\x29\xec\xd9\xdd\xf5\xec\xfd\xc8\x37\x17\x3f\x47\x00\x8c\xae\x99\x78\xfc\xdb\xdb\xb7\x86\x0c\x3a\x1f\x7d\x6e\xf9\x27\x3b\x06\xbd\x12\xfb\xad\xb1\xbb\x64\xed\x3f\xb5\x87\x4e\x6c\xce\x27\xe6\x03\x56\xff\xf9\x20\x33\x3e\x82\x7a\x4f\x05\x97\x85\xc5\x07\xbd\x97\x4b\x21\xd6\x47\x08\xed\x7d\x0f\x25\xf1\xdd\xb9\x0c\xf7\xac\x33\xe7\x54\x14\xef\xcd\x16\xe6\x9b\x86\x7c\x1e\x3f\xb2\x5e\xe0\x33\x65\x9d\x8c\x1e\x4a\xfa\xfa\xe8\x67\x59\x5a\xf3\xe8\xe3\x64\x8a\x63\x5a\xca\x2a\x96\x98\x21\x56\x07\xc4\x55\x84\x6e\x14\x55\x88\x7e\x59\xc5\xf8\x8d\x44\xcb\x58\xf7\x6c\xe0\x7b\x45\xae\xfc\x83\x34\x36\xb8\x6e\x1a\x28\xfa\xc0\x98\x51\x47\x67\x1a\xe6\x2a\xbb\x3a\x40\xaa\x13\x66\x39\xd6\x49\x4f\xeb\xf1\x00\x59\x17\xb4\xa8\xb0\x5f\x90\x74\x74\xc3\x72\x3c\xe4\x59\xa5\xbc\x01\x92\xd7\x1d\xaf\x41\xfb\xfc\x36\xc5\xd7\xbb\x6c\xb6\x3d\x99\xcf\xcb\x1e\x61\x52\xa5\x9f\xb1\x55\x9a\xa7\xf2\xf2\xe2\x8b\xd5\x78\x5d\x54\x69\x5e\x61\x62\x55\x11\xc9\xbc\x8e\xfc\x1c\xd4\xa8\x98\x10\x73\x9a\x58\x9f\xfb\xe6\x5c\xf1\x41\x2d\x82\x77\x5c\x08\xb5\xbd\x9f\x1b\x06\x94\x3d\x64\x2c\x33\x57\xd9\xfa\x0e\x01\xc6\x23\xbc\x37\x79\x1f\xf0\xcd\x64\x1c\xf2\x00\xf9\xfc\x0b\xe2\x7d\x7b\x48\xb8\x7f\x60\x9e\x1d\x74\x65\xb4\x38\x3f\x87\xf5\x12\xea\x75\xc6\x76\xa2\xd7\x73\xbb\x16\x9e\x70\x79\x84\x4c\xa5\x42\x06\xe1\x2a\xc5\xd7\xab\x1f\xf0\x8d\x91\xc8\xc1\x0a\xe4\x5b\xcb\x11\xf7\x14\x8c\xaa\x21\x15\xa4\x2d\xf3\x83\x47\xe9\x37\xee\x9f\x89\xab\x1e\x38\xf5\xf7\xf8\xb0\xec\x96\x61\x40\x6e\xa7\x4d\x26\xfc\xf9\x14\xeb\x26\xb9\x50\x92\xeb\x72\x25\x39\xe0\x3d\x03\x27\x98\xaf\x8a\xd3\x89\x86\xf1\xc2\xd6\x81\x6f\x2e\xdd\x22\x55\xf8\xfa\xce\x57\x65\x8a\x0f\x10\xe5\x87\x65\xba\xff\x0f\x85\x20\xd6\x4a\x95\xb0\xc8\x51\x0f\xf4\x13\xa5\x9a\x9f\xe6\x19\x61\x98\xa3\xa7\xb0\x0e\xe3\x38\xd7\xfc\x3f\x7d\x67\xfb\x7f\x32\x34\x03\x69\x89\x1f\x78\x89\xef\x03\x19\xc4\xa7\xd7\x30\xb6\xe4\x65\xff\x85\xda\x25\xe4\xba\x5f\xa8\x84\x76\x46\x58\x94\xfe\xe8\x50\x13\x04\xa5\x39\x46\x47\x88\xa7\x92\x96\x6a\xda\x70\xfb\x9a\xcc\x04\x87\x02\xbf\x10\xcf\x81\x7e\xa5\xeb\xef\xbf\xc8\xe7\x7a\x84\x15\xbf\xa9\x1b\xef\x7a\xbb\x22\x9f\x76\xf7\xb7\x96\xb1\xef\x7e\x5e\xf0\x07\x59\xb0\x71\xc0\xf4\x97\x67\x46\xd3\xd8\xad\x42\x38\xae\x40\x7b\x50\x93\xa8\x4b\xb2\xe7\x8f\x39\xf8\xde\xd2\xb5\xb0\x0c\x0e\x17\x5f\x39\x89\x96\x53\x5a\x72\xaf\x48\x54\x49\x9a\x90\xe6\xe7\x2e\x3a\x87\xf1\xc1\x59\xbe\x8d\x2c\xf1\x06\x05\x35\x20\xc0\x32\xbe\x38\xaf\x42\xac\xde\x49\x81\xa3\xec\x04\x71\xf4\x81\xe3\xbb\x01\x22\x22\x72\x64\x7c\xc5\x13\xb9\xc8\xf3\x3f\xea\xde\x45\xdd\xbf\xf4\x16\x93\xcf\x15\xed\x44\x5f\x3e\x72\x47\xf1\x15\x7d\x9d\x1c\xcf\xd0\x79\x6e\xba\x4c\xe9\x3a\x9e\x21\x01\x7c\x8e\x2b\x72\x64\xea\x1e\xd3\xc3\xda\xd3\xef\x4a\x9a\xf3\x54\x3b\xd8\xa6\x56\x86\xdc\x43\xdb\x73\x33\xc2\x3e\x7f\x45\xb5\xc8\x51\xd5\xe0\xec\xbd\x48\xdf\x23\xf6\x8b\x8c\xbb\xc0\xd3\xdb\xf9\x96\x87\x72\x98\xa3\x4d\x9d\x39\x77\xfc\xf5\xc4\x67\xd7\x15\xda\xae\xd0\x4e\xa5\x29\x71\x40\x1f\x0e\xaa\xdb\x8a\xc4\x24\x1d\x76\xb2\x34\xff\xf0\x3a\x66\x71\x70\x38\xf7\xc4\x88\x62\x7a\x52\x0e\x22\x1c\xd4\x5a\xe9\xb7\xb8\x24\xe9\x30\xce\x68\xf9\x68\xa9\xab\x57\xf0\x29\x80\xe8\xd9\x6d\xf9\xac\x0b\x74\xc3\x64\x1c\x91\x93\x72\xb5\x37\x08\x50\xf9\x6f\x22\x7d\x78\x43\x1e\x25\x48\x69\xee\x4a\x6f\x10\xd4\x01\xa2\x97\x08\x2f\xf0\x8c\x16\x20\x27\xdd\x01\xab\xaf\xea\x0d\x90\xf1\x25\x40\x74\x07\x41\x5d\x8b\xf9\xeb\x7c\xa8\xc4\x40\xf8\x34\x6e\x90\xf0\x86\x87\x95\xf0\xd3\xe8\xd9\x2d\xf6\x53\xa1\xcb\x92\x47\x44\x33\x49\x4e\x85\x32\x25\x2c\x56\x6e\xc6\x6f\x45\xe5\xf2\x72\xe9\xa7\x41\x5d\x07\x35\xdd\x81\xaf\xe7\xd2\x61\x91\x91\x6e\x54\xd0\x60\xa9\x9c\x82\x75\x86\x8a\x60\x41\x99\x8e\xef\xd2\x76\x57\xc1\xcd\xb8\x37\xa7\x93\x3c\x4b\x2b\x82\xf3\x17\x93\x7c\x58\x45\x27\x03\xad\xf2\xf3\x78\xf8\xe1\x20\xe7\x2f\x95\xa6\xde\x00\xe4\x02\x7b\x32\x85\x68\xf0\xb2\xb8\xc2\xc7\x05\xb8\x95\xdf\x21\xf8\xf2\xdd\x05\xce\x99\xa8\x4c\xef\x2e\xbf\x94\x2f\xe2\x3c\xc9\xf0\x61\x51\x10\xe1\xf8\xac\xb5\xf6\x6d\x73\x78\x20\xe8\x73\xfb\x1c\x96\x61\x2c\x8c\xe2\x65\x7a\x9e\xe6\x71\xb6\x7d\x05\x1c\xa8\x0a\x93\xe3\xf4\x12\x17\x13\xc2\x16\xa2\x31\x55\x7c\x28\xf0\xdc\x38\x7c\xdd\x41\xb6\x1e\x04\x63\x7d\x2f\x0b\x0f\x77\x5e\xbe\x3a\xee\xef\x65\xe1\xd6\xc1\xbb\xfd\xa0\xa6\xff\x35\x06\xb9\xd8\x50\x04\x6f\xd8\x68\x1a\x66\xbe\xd1\x31\x63\x95\x74\x2e\x08\x45\x66\xda\x16\x93\xd4\xec\x89\xe6\x5e\xe5\x1a\xfe\x95\x59\x32\x3c\xc9\xa2\x88\x72\xda\x2c\x60\xe8\x6b\xbb\xee\xd8\x4d\x9a\x89\xbf\xd4\x68\x61\xd9\x3e\x01\x32\x89\x1e\xc5\x30\x2e\xcb\xe2\x9a\x71\x98\x90\x08\x69\x67\x4e\x13\xfb\x7a\x97\x92\x0b\x58\x44\x30\x4a\xeb\xfb\x0f\x6b\x70\x32\x5e\xa4\x35\xd7\x59\x59\xa0\x31\x60\xa3\x2d\xdc\x9c\xb1\xf6\x0c\xf2\x71\xb1\x41\xe1\xfd\x8a\x6f\x2a\x5a\x90\xb1\xf2\x84\xf9\x58\x83\xa3\x2b\x32\x44\x90\x29\x5e\x4c\x8f\x33\xc5\x92\xa4\x50\xe5\x1e\x03\x24\xf1\xd9\xe2\x43\x7b\xe8\x9e\xc1\xd5\x10\x1a\x6d\x39\xbe\xfe\x5e\x16\xee\x6e\xbf\x38\xa6\xcf\x5c\x45\x8a\xf1\xeb\xb2\x18\xc7\xe7\xd2\x6b\xa2\xd8\x3c\xd6\xe1\x62\xe2\xc9\x4d\x6d\x9e\xee\x3f\x2b\xa2\x83\xff\xb1\xfd\xc5\x08\x45\x2c\xa6\x40\x50\xf1\xe1\x38\x1d\x63\xdf\xef\xa2\x4d\x12\x7e\x0c\xfc\x5e\x10\x58\x01\x23\xcd\x60\xe3\x14\x8a\x1f\x04\xe2\x65\x2b\x23\x6c\x06\xc4\xba\xbb\x73\xab\xc5\xad\x95\xcb\xcb\x53\xa3\xcb\xa8\xb8\x16\x65\x70\x77\x57\x4a\x3d\x09\x76\x75\x04\xc6\xf5\xe6\x7e\x66\x9a\x37\x25\xb8\x12\x0d\x02\xa5\x48\xa8\x83\x9c\xda\x1f\xbd\xa0\x54\x47\x64\x63\xbf\x27\x10\x56\x59\xc6\xe1\x9b\x27\xb8\x12\xaf\x09\xdc\x09\x9f\xe9\xcf\x6c\xe4\xc9\x4b\xfd\x2d\x15\xe7\x97\x62\x23\xfa\xaa\x22\xfa\x54\xb5\xce\x4a\x97\xeb\xff\x30\x68\xc7\x17\x69\x65\x40\xf2\xbb\xe8\x94\x84\xc5\x28\xe0\x2f\xc7\x54\x58\xbd\xa0\xb6\xde\x77\x73\x7f\x01\x95\xf7\x8a\x84\xc4\xef\x39\x8e\x72\xa9\x14\xfc\x5d\xc3\x93\x9b\xf3\x9c\x84\x6f\x02\x86\x28\x76\x07\xf2\x38\x32\xc4\x6c\xd1\xca\x5c\x52\x37\x5e\xac\xa6\x86\x10\xd2\x1d\x25\xe4\x32\x25\x53\x0b\x3a\xa8\x42\x13\x67\x0d\x4c\x31\x16\xcf\x97\x18\x30\x9b\x22\x7b\x0d\x90\xba\x85\x8c\x23\x2a\xa2\xce\x3b\x74\x2a\xac\x1b\x40\x3f\xab\xbe\xf3\x59\x48\x30\x89\x87\x17\xbb\x50\x07\x22\x48\xde\x57\x63\x86\xc9\x12\xe8\x2f\x69\xb9\x47\x3f\x84\xb8\x81\xfe\x3e\x8d\xc5\xaf\xdd\x4c\x15\xb6\xc2\xaa\x2c\xaa\x6b\xf3\x47\xe6\xbf\xae\xdc\x24\xdb\x55\x5c\x76\xf6\xdb\xd4\x70\x00\xe5\x3a\xdd\xdc\xde\x3f\xde\x3e\x04\x6d\x1c\x3d\x81\x29\xe5\xb0\x94\xe3\x83\xd7\xa0\x97\x23\xbf\xf4\xcc\xe7\x07\xc7\xc7\x07\x7b\xd1\x53\x99\xcf\x12\x58\x91\xe3\x83\xd7\xa2\x81\xef\x06\x91\xa7\x3e\x55\x36\x54\x8a\xbe\xe7\xb9\xf0\xa5\x32\xe9\xda\x47\x3f\xf0\x3c\xfa\xc1\xb2\x58\x13\x02\xf2\x8f\x83\xc8\x33\x52\x8c\x42\x0c\xfe\xbf\x54\x19\xad\x09\x9e\x02\xad\xfc\xa4\x4a\xa8\x86\xe8\x2f\xd1\xcc\xcf\x83\xc8\xd3\xbe\xb5\x02\x30\x3f\x5d\x91\x2d\xe7\x07\xbe\xf8\xf4\xf4\x7a\x22\x9b\x4f\x4f\xed\xef\x57\x77\x77\xfe\x3e\x57\x6e\xda\x67\xca\x4d\xec\x0d\x39\xac\x22\x2f\x3e\xab\x8a\x6c\x42\xb0\xc7\x09\xc7\xad\xca\xad\xa8\x64\x9a\x39\x31\x3b\x39\x16\x4b\x09\x32\x14\x39\x02\x91\x87\x0e\xf2\x23\x28\x21\x76\x3b\xd7\xcc\xbe\x4c\x09\x4b\x87\xe7\x34\x3c\x4b\xf3\x44\xe0\xc8\x21\x30\x34\xc2\x71\x51\xa5\x74\xef\x44\x87\x95\x4c\x23\xc5\x38\xea\xca\x2f\x66\xde\x16\x79\xf1\x84\x14\x9e\x4c\xcd\xf0\x88\x68\x85\xd8\xed\xc6\xca\xd4\x71\x3e\xbc\x90\x34\xdb\x2d\x33\x0a\xfc\xbd\x9f\x46\x5d\xc4\x7e\xbf\xef\xe7\x51\x17\x4d\xe8\x8d\x40\x0b\xb2\xab\xa2\x1f\x47\x4b\xbd\x9a\x4e\x1a\x9b\x80\x38\x49\xb4\xae\xab\x53\x4c\x02\x14\xd3\x57\x34\xd2\x03\xfd\x39\xc6\xe3\x31\x02\xdb\xe3\x53\x9f\xb5\x1b\xfc\xa1\x2a\xd2\xa7\xbc\xd5\x2e\x90\x12\xa9\x45\x94\xc1\xd0\x57\x2b\xf8\xb3\x92\xa2\x61\x94\xd1\x09\x5b\x85\x50\x7c\x2b\xf9\x5a\x75\x9d\x92\xe1\x05\xbd\x4d\x86\x71\x85\x3b\xfb\x95\xdc\x4a\x7d\x91\x20\xf6\x7c\xff\xac\xc4\xf1\x87\x35\x3d\x99\x6d\xc1\x7e\xb1\x12\x65\xcc\x0e\xf0\x7f\x9e\xae\x35\x4b\x31\x9a\x4a\xa4\xc8\xd3\xab\x55\xb3\x2a\x69\x1b\x54\x56\xd3\xce\x44\x7f\x48\x2b\x32\xc9\x85\x55\xd3\x38\x7f\x7a\x39\x34\xa5\x8f\xfa\x81\xb4\xba\x29\x3a\xe1\x04\xe4\xea\x75\xb3\xe5\x46\x73\xfa\xf5\x66\x16\xd4\x60\xd7\x7c\x61\xca\x87\x2d\xcc\x6a\x54\xdd\x67\x61\x64\xb5\x45\x17\x86\x56\x9c\x67\x61\x54\x39\x34\xa5\x8f\x73\x2c\x8c\x13\xd0\xb4\x85\x51\x15\x66\x2c\x8c\x5e\x50\x83\x5d\xb3\x03\x9a\x44\x4d\x9b\x55\xed\x54\x06\x68\xa2\xb4\x3e\x93\xf0\x32\x2e\xcf\xd3\x7c\x57\x98\xd7\x5e\x34\xf3\x0e\xa5\x81\xed\xb8\x99\x79\xcc\x8d\x79\x47\xcd\xac\xe7\xd2\x9a\x77\xa1\xa3\x3c\xcf\x2e\xf0\x29\xae\x6f\xad\x02\x23\x00\xac\x55\xa0\x64\xc2\x70\x35\x1a\xd1\x59\xba\x08\x90\x55\x8f\xb6\x27\xab\x69\x1b\x88\xd7\x1a\xd3\x4d\x3f\x51\xb5\x44\x17\xcd\x2a\xc7\x07\xaf\xa1\xfc\x8a\xb3\xbc\xab\x6b\x46\x0d\xda\xaf\x45\xb7\xf2\xdc\x7b\x70\xb1\xf1\x8e\xac\xfe\xdf\x77\x76\xbf\xd4\x3c\x69\xb7\x89\xec\x3d\x14\x9c\x75\xf3\x8e\x5b\x8b\x5a\x17\xe5\x18\xc9\xe1\xcd\xb8\x29\x45\xc9\x95\x68\x52\x1b\x72\x28\xfe\x14\x72\x7c\xa0\x8c\xf3\x8a\x52\x6c\xd1\x9f\xf0\x93\x12\xc1\xbf\xfb\x4f\x6e\xf7\x62\x72\x11\x96\xf4\xa9\xf4\x8b\xa0\x1e\x7f\x0a\x3a\x32\xfb\xbd\x99\x3d\x84\xec\x3f\x85\x7d\x03\xbc\xeb\xb6\x9d\x46\x89\x33\x1c\x57\x5a\x34\x48\x77\x17\x3c\x4f\xb0\x5a\x2f\x8b\x2b\xec\x44\x11\x82\x3a\xad\x5e\x73\x3c\x80\xd9\x91\x08\xa3\x7f\x97\x59\xbc\xc0\x18\x38\xab\xda\x03\x22\x3f\xbd\xc2\x5e\x14\x45\xf8\xee\x0e\x47\x51\x74\x58\xdd\xdd\x79\xa3\xf4\x13\x4e\x20\xb1\xb6\xf0\x2a\x49\xa1\xf0\x81\x01\x11\x03\x84\x53\x0b\x06\x63\x14\x07\xb2\xf1\x88\x84\x9f\x7e\x53\x3e\x1b\x00\xd7\x28\x23\xb2\x36\x2a\x4a\x7f\xad\x5c\x5e\x2e\x97\xa2\x48\x19\xfa\xf9\x1a\x4e\x58\xf9\x25\xdd\x6e\x10\x8d\xda\x68\xc8\xf7\x58\x01\x6f\x0a\x9a\x18\xb4\x61\x97\x8c\xc1\x52\x06\x01\x2a\xd9\x34\x30\x85\x32\x63\x5e\xcb\x20\x58\x0b\xca\xa8\xd4\xf0\xb0\x7a\xda\xaa\x40\x60\x52\x1e\x70\xba\x53\x8c\x3a\x2d\x4d\x07\xc2\x0f\xc5\xe2\xa3\x59\x6b\x1b\x0d\x23\x68\xa5\x9e\x28\x2b\x21\xe5\xa6\x7c\xd9\x86\xc5\xe5\x38\xc3\x04\xfb\x66\x84\x65\x9e\x1d\xd4\x62\xbe\xa7\xef\x27\xb1\x8d\x78\x77\xe9\xec\x85\xc2\xaa\xfa\xf7\xbb\x3b\x86\x22\x37\x52\x5d\xa5\xdf\x3b\x4b\xbf\xaf\x41\x5a\xf2\x62\x3e\x6f\x09\x6c\x69\x5e\x15\x15\x11\xd2\x11\xe6\x87\x80\x61\xde\x9a\xdc\x62\x88\x73\x92\xdd\x1c\x8c\x71\xae\xa9\xcd\x8e\x8b\x31\x6d\xf6\x80\x79\xa5\x8d\x6e\x6b\x8d\x9a\x3f\xc8\x79\xf8\xd6\xcd\x2c\x1d\x7e\x50\x72\x6f\x8e\x68\x0b\xb3\x48\x87\x0c\x86\xe5\x53\x8a\xd9\x14\xdf\x88\x7a\x40\x62\x33\x1a\x00\x7a\x49\x57\x31\xc2\x96\x79\xa7\xde\xbf\x1d\xee\xd6\x16\x4e\xd2\x56\xe5\x36\x08\x0d\x9a\xb1\x1b\xa3\x85\xc4\x0e\x3c\xfe\x3d\x27\x6e\x44\x0f\x09\x89\x87\x17\xdb\x47\x9b\x72\x9f\xaa\xf8\xaf\x87\xc6\xa4\xfa\x92\x97\x23\x2f\x3a\x6e\x5c\x8b\x1b\x20\x82\xda\x35\x71\xd0\x37\xb1\x69\x1f\xd0\x0d\x41\x9f\x19\xce\x2a\xc4\x86\xe0\x47\x24\x3d\xcf\x8b\x12\x3b\x27\x48\x97\x19\xd9\x97\x36\x1b\x8b\xbe\x31\xec\x0e\x59\x4b\xa6\x26\x43\xb7\x90\xde\xbc\xc0\xc3\x0f\x38\x71\xf5\x50\x8c\xdf\xb9\x8d\x6d\xe0\x82\x10\x35\xf7\x92\xbe\xb7\x5e\x17\xa9\xb5\x99\x9a\x29\x7c\xfb\xeb\xdc\x62\x25\x1e\x73\x32\x0a\x6b\x63\x59\xdc\xd3\xe1\xe4\x71\xcd\xde\x1a\xcd\x5d\x6c\x4a\x55\x85\x2d\x9e\x88\xf2\x6f\x59\x98\x35\xbb\x5b\x3b\xf6\xce\xad\x63\xf8\x7c\x4b\xbc\xcc\x8a\xb3\x38\xd3\x4a\x0b\x76\xb5\x78\x9d\xb4\xac\xc8\xc9\xa0\xf7\x44\x49\x4f\x8a\x04\xb8\xbc\x62\x79\x19\xcc\xbf\x96\x97\x7d\x6f\xbb\x1a\xc6\x63\x78\x82\x21\xe9\xee\x8e\xa6\xc8\x4f\x19\xa4\xbd\x95\x11\x5e\x3b\xa6\xee\xb6\xad\x9f\xd2\x60\xbd\x99\x65\xbd\x05\x8e\x12\x41\x3d\x6d\x95\x6f\xdb\x2e\x4c\xd1\xe6\x45\x51\x11\xa3\x8e\x7b\xd2\x9c\x57\x9a\x54\xb2\x14\xc2\x14\x71\x6a\x03\xfd\x10\x27\x96\x59\xbe\x99\x3a\x6f\xdb\x66\xad\xf6\x96\x2d\x8f\x01\x73\x80\xd7\xf7\x83\x82\x7a\x4b\x84\x5c\x84\x81\xe6\xf2\x71\xf3\xa1\x5a\xd7\xd7\x86\x95\xeb\x4f\x3b\x95\x62\x5b\x3c\xd6\x5a\xb5\x66\x58\xdb\xa6\x91\xef\x5c\x20\x27\xe8\x29\x45\xac\x46\xa6\x94\x9c\xb6\x28\xf6\xe6\x9f\xd6\x84\xb3\x0c\x73\x96\x61\xbf\x32\xb7\x4e\xbc\xa2\x8b\x9c\x3a\x06\x0d\xf4\xa3\x7e\x80\x37\x06\xcd\xf1\x1e\xe0\x20\xe8\xfb\xe9\x76\x91\x8b\xfb\xce\x4b\xab\xd5\x62\x34\x5a\xad\xe0\x82\x05\xe3\x2e\x75\xdf\x06\xca\x13\xc2\x5f\x5f\xdb\xc8\x1f\x6d\x66\xe8\x30\xb7\xdd\xcd\xbc\xac\xa2\x13\x16\x27\x16\x79\xd7\x71\x99\xa7\xf9\xb9\xee\x3c\x54\xf8\xfb\x1c\x00\x0d\xf2\x79\x1e\xfb\x43\xd3\xf4\x4b\x78\x7a\xc1\xa3\x78\x92\x91\x9d\x61\x91\x1f\x5d\xc4\x63\x1c\x41\x9b\xd2\xc1\x28\x43\xad\xe3\x0c\x97\x7a\x11\x23\xfd\xf8\x46\xd4\x62\xe6\x35\x32\xd1\x16\xe6\xcb\x0c\x10\xe6\xab\x62\x24\xb8\x7d\xc9\xdd\x3a\x1e\x8c\x7c\x12\x3c\x03\x45\x29\xbb\x05\x6e\xbf\x6e\x76\x45\x36\xe1\x79\xe2\x1e\xb2\x3a\xcb\xa4\x7a\xe9\xb0\xc8\x77\xf2\x51\xf1\xa2\x2c\x2e\x59\x9b\x26\xf4\x20\x04\xdd\xef\xbe\x0b\x82\xea\xad\x6a\x96\x4e\xe9\xba\xf4\xac\x62\x55\x30\x3b\xaf\xa6\x8d\x04\x4e\xf8\x91\xe7\x99\x23\x03\x53\x13\x3b\x34\xd7\xcc\x01\x10\x5a\xab\x6e\x96\x53\x54\xd0\x2d\x1b\xa3\xe7\xa1\x61\x55\x81\x17\x52\xfa\x1b\xea\xf5\x3d\xaf\x16\x7c\x34\xc2\xf8\x68\x72\xd3\xf5\x31\x9b\x9c\xc8\xf0\x6b\x4b\xca\x94\xab\xc9\xe3\x50\x80\x8b\x3c\xe8\xcf\xaa\xdc\xae\x98\xf5\x2a\x6a\x6e\x3f\xb0\x1f\x0f\x79\x41\x8d\xfb\x21\x36\xb8\xbb\x51\xb1\x2b\x9b\x4d\x8a\x73\x31\xab\x45\x56\x4e\x6f\x50\x1c\x24\xd5\xa2\xe9\x62\xb7\xd9\x96\x74\xb5\x3b\xab\x31\x5e\x90\xb7\xc6\x4f\x9a\x6c\xc7\x79\xfc\x1c\xcd\xb1\x3b\x60\x56\x5b\xb4\x94\xb8\xb8\x16\x77\xe0\xc0\x25\xa8\xa6\x0d\xd6\xa2\xbe\x1c\x9e\xcf\x13\xd7\x72\xa8\x34\xad\x81\x99\xc2\xf4\x7f\x58\x94\x14\xb7\x3d\xa7\xcd\x80\x82\x0a\x93\xb2\x64\x1c\x1d\xb3\x02\x4b\x66\xca\x42\xbc\x08\x3d\xaa\xf2\xa0\xf2\x44\x79\x42\xf9\xb7\x54\x1e\xe2\x2d\x72\xf1\x36\xbf\x71\x40\x6b\x64\x83\xae\x85\xdd\xc3\x38\xcb\x58\x3a\x57\x90\x90\xdf\x9a\x1f\x84\x25\x12\x9e\x02\xb2\x92\x18\x5d\x87\x72\x36\x38\xad\x25\x01\x51\x4b\x3a\x61\x6b\xcf\xea\x0f\xf4\x41\x32\x60\xf2\x9e\x17\x83\xb2\x01\x68\x77\x2c\x57\xbb\x9a\x34\xe6\x70\x46\x1f\x38\x8b\xe6\xee\xae\x5b\x5f\xc6\x79\x7c\xae\xec\x65\x75\x5a\x87\x57\x6c\x27\x7f\x90\x39\x5d\x32\x8c\x0f\xef\xb9\x97\x4f\x2e\xcf\x70\xa9\x99\xb9\xeb\xab\xb5\x6e\x7c\xf5\xbb\xae\xb5\xd3\xa0\xb5\x72\x14\xd4\x6a\x0d\x1b\x51\x7a\x14\xd2\xc3\xa1\x3c\xb3\xeb\xb0\x89\x10\x3b\x49\xf4\x1c\x98\xa9\x97\xf1\x27\xbf\x8b\x9c\xe5\x57\x7b\x41\x50\x07\x35\x63\x3d\x3a\x96\x4b\x7c\x44\x8e\xd5\x13\x10\xd6\xbb\x7d\xbd\xec\x4a\xaf\x1e\x97\xf8\x2a\x2d\x40\xa1\xa8\xbb\xd4\x5e\xd5\xee\xac\xf4\xfd\x62\x4c\xac\xb3\x4d\xa3\xc5\xd5\x9e\xe5\xae\x47\xb5\x5f\x27\x26\xa5\xbc\xd0\xae\xf8\x82\x7e\x67\xde\xcc\xd6\x62\x16\x7e\xf8\xe8\x93\x6a\x87\x9b\x4a\xa4\x16\x33\xc4\x10\x82\xc9\xb2\xe2\x4b\x99\xd8\x56\xde\xdc\x84\x4a\x35\x20\xad\x8e\x2e\xe3\x2c\x93\xfc\x11\x3a\xb7\xdc\xa0\x5a\x14\xd8\x18\x8f\xc1\x56\x51\x2b\x53\x6e\xd2\x25\x78\x0e\xd6\xca\x1b\x65\x1a\xef\xb2\x98\xb9\x2d\xef\x03\xbc\x25\xae\x1a\xe2\xf4\xc0\x15\xa5\x59\xe2\xc3\x37\xb7\x04\xb2\x0c\x63\x6c\x3b\xf1\xc6\x1c\x38\x56\x5a\xd7\x05\x6c\x94\x9f\x7a\x00\x99\x87\xcb\xa8\xad\xa6\x76\x03\xf2\xad\x5f\xbb\x99\x36\x66\x6f\x0c\x1d\x42\x63\x17\x06\x4d\xf4\xd4\xde\x07\xa1\x86\x96\x4e\xc5\x79\x9d\x75\xda\x10\x4a\x67\x05\x0d\x7d\x54\x2d\xb9\xa2\x7e\xe9\x35\xdd\xd8\xa2\xb3\x33\x81\xc4\x37\xa0\x5b\x6c\xb2\xcd\x47\x93\xa5\xc9\x37\x53\xac\x87\x3c\x0a\x61\x82\x09\x1e\x72\xab\xb1\xca\xe7\xcf\x26\x87\x64\xbd\xd0\x2c\x55\xde\x1e\x4b\xc6\x7e\x97\xde\x44\xc4\x66\xec\xb6\x9c\x31\xbe\xbf\x1c\xbb\x81\xc1\x75\xed\x61\x66\x43\xb5\xd4\x0d\xb8\xdf\x2f\x89\x90\x4c\xdb\xf8\xbc\xd2\xfd\xe3\xbf\x7f\xae\x14\x91\x5b\x3d\x3f\x90\xc6\xee\x95\x0a\x9b\xb6\xb0\xe1\x3b\xac\x9d\x37\x18\x68\x1e\x00\xe1\xfe\x60\x66\xc8\x6c\x3e\xd2\xcf\x18\xd2\xc0\xfd\x1f\xfb\x35\x40\x62\x9e\xb5\x82\x9b\x3c\x09\x98\x3a\xfc\xe7\x00\xa9\xfb\x46\x2b\x2a\x92\x00\xa4\xfc\xa0\x50\x9d\x37\x11\x98\x8b\xb9\x32\x3c\xc4\xe7\xd8\xea\x06\xd8\x88\xf3\x2c\x6f\x80\xe4\x0e\xd5\x8a\xd1\x4f\x0f\x79\x32\x4b\x14\x93\x87\x44\x2b\xbb\xc3\xa2\x7b\x98\xf9\x86\x0d\xb6\xb9\xd4\x7d\xab\x33\xed\x46\xd8\x9f\xe7\xf5\x29\xac\x05\x0c\x97\xb6\xcf\x6c\xf1\xf4\x28\x29\x3c\x4d\x85\xec\xe0\x54\xc6\xa5\xfc\x19\x8f\xc7\xc2\x47\x80\x69\x2d\xdd\x04\xa6\xa5\xaf\xa6\x04\x5f\xb2\xc0\x6c\x84\xcd\x1b\xf7\x6c\x81\x34\x43\xec\xa2\xc2\xdc\x6a\x1a\x38\x7a\xba\x35\xb4\x55\xa9\xd7\x2c\xae\xdb\x4c\x5f\xa7\x79\x52\x5c\xaf\xb2\x22\xf3\x59\xf7\x09\xcb\xda\x2e\xba\xca\xd1\xf7\xe8\x27\x69\xd9\x27\xdd\x44\x9b\xe1\x36\x24\x1a\xdd\x12\x83\x42\x37\x21\xf5\x4e\x4e\xf3\xf3\x8b\xa2\x22\xab\xff\x6f\xf3\x60\xef\xf5\xff\x1b\x74\x6e\x3b\x49\x5a\x8d\xb3\xf8\xa6\xdf\x01\x7b\xee\xb5\x4e\xed\x29\x53\xb5\x27\xf3\x30\x50\x0c\x4c\xe0\x01\x37\xc2\x3d\x8e\x3b\x2c\xa6\x70\x6c\xb4\x41\x08\xcd\x36\x16\xda\x9b\xbe\x23\xb9\x3d\xe6\x53\xc3\x1e\x93\xd7\x1e\x16\xb9\x11\x97\x87\x1b\xb3\xa7\x97\xe7\xb0\xea\xaa\xd4\x02\xeb\xda\x30\x6b\x3f\x7d\x03\xb6\x9b\x96\x95\xb7\x30\xc3\x06\x43\x4e\x57\xc0\x15\xb0\x9d\xe6\x7b\x0c\x4f\x79\x1d\xa5\x2b\x0d\x76\xc3\xb4\x14\x05\xce\x8a\x6d\x81\x3c\x2d\x6e\xc9\xc7\x2f\xe6\x5e\xcc\xa3\xfb\x9f\x4d\x35\xc1\x9f\x0c\xe7\x62\xef\xe6\xb6\xf9\x7c\x83\x32\x82\x9e\xa3\x8a\xa0\x8f\x5f\xc5\xfa\xf3\x2f\xdd\xfa\xf3\xfd\xd7\xe3\xab\xbe\x53\x76\x9f\xe8\x97\xf6\x6e\xec\x6f\xbc\x3d\xdd\xdd\x7e\xbb\xbd\x7b\xda\x8b\x7a\x48\xff\x7e\x1a\x3d\xe5\xdf\x9b\xbb\x07\x47\xdb\xa7\x1b\xbb\xbb\x91\x67\x7c\x7a\x3c\xff\xe0\xf5\xf6\x3e\xcb\xa2\xbf\x3c\xbd\x96\x56\x43\xa4\x1f\x1f\xbc\x7c\xb9\xcb\x33\xd8\x6f\x55\x63\xe3\xe8\xe8\xf4\xd5\xc6\xde\xf3\x37\x87\x2f\xb7\x0f\x4f\xf7\xb6\xf7\xdf\x44\x1e\xc5\x54\x56\x2f\xe2\xcb\xb3\x49\x79\x8e\xcb\xd5\x4b\x9c\x4f\xcc\x0a\x07\x6f\xb7\x0f\x5f\xec\x1e\xbc\xd3\xcb\x0b\x15\x04\x47\xf1\xe3\xc3\x9d\x97\x14\x7a\x2f\x02\x27\x34\xb8\xd4\x80\x13\x61\xce\xef\xaa\xf0\x54\x56\x90\xd0\x9d\xe5\xc5\x74\xc2\xcd\x95\xc7\x57\xec\xdd\x5a\xed\xb9\x4a\x3d\xb5\x4b\x3d\xf5\x0c\x5b\xdd\xdf\xaa\x16\x6d\x89\x53\x11\x49\x49\x33\xa2\x3f\xcd\xe3\x2b\x46\x21\x61\x69\x52\xc6\x8b\xb8\x8c\xca\x78\x16\x14\x15\x35\xed\x72\x22\x9d\x69\x72\xfc\x3a\x07\x77\xab\xc4\xd5\xb8\xc8\xab\xf4\x0a\xef\xc7\x57\xbb\x69\x45\x24\x89\x27\x4c\xb3\xf6\xe3\xab\xa3\x09\x78\xd0\x94\x66\x28\x82\x5c\x84\x4e\x59\xf9\xc0\x22\xd3\x6d\x33\x32\x5a\xa2\xe2\x5c\x30\x01\x14\x27\x2c\xd1\xe8\x7e\xb3\x45\x17\x23\x2d\x8f\xaf\x78\xe0\x62\xdb\xd3\xac\xdd\x9f\xa6\x1e\x98\x84\x4f\x1f\xc8\x25\x61\x1a\x9b\x56\xfb\xf1\xd5\xa1\xec\x19\x78\xbb\xf5\xdd\xb3\xc3\x49\xc2\xa0\x6d\x8a\x34\x5e\x4e\xa3\x6e\x10\xd4\xcd\x96\xac\x09\xb0\x9b\xb3\x45\x0c\x74\x05\x8b\x0c\x87\xb8\x2c\x8b\xd2\xf7\xf6\x78\x38\xe0\x8e\xb1\x2b\x3b\xde\x0a\x59\xf1\x3a\xb1\xf0\x82\x5e\x75\x46\xc5\x24\x4f\xc2\xce\x6b\xd0\x01\xe8\x5c\xc6\x1f\x70\xa7\x9a\x94\xb8\x43\x2e\x62\xd2\x29\xf2\xec\xa6\x53\xe4\xb8\x83\x3f\xa5\x15\xa9\xbc\x00\x82\x36\x29\xd7\xa1\x7c\xba\x8c\xb0\x3f\xd3\x7a\xba\x86\x35\x71\x48\xb3\x60\x35\xce\xd2\x21\xf6\x31\xea\xdd\x77\x16\x2b\x9c\x27\x7c\x0b\xec\xe1\xaa\x02\x96\x1e\x3d\x69\xc2\x9c\x8e\x6e\xc3\xdf\xc0\xb4\x9c\xeb\x6d\x35\x77\x06\x34\x50\x0a\x13\x2e\xb1\x45\x39\x04\x22\x20\xfc\x52\x99\x17\x2a\x5a\xfd\xf9\xe7\x9f\xa7\xc3\x7c\x90\x07\x52\x9d\x25\x24\x58\x41\x4d\xaf\x34\xb4\x73\xa4\x46\x82\x67\xc4\x9d\x94\x27\x3b\x79\xdf\x2b\x8b\x82\x78\xf2\x1d\xf9\x7d\xde\xb8\x37\x87\x78\xa4\x4c\xde\xb5\xf9\x96\x71\xc9\x9b\x7e\xf6\x64\x68\xa7\x48\xc1\xb0\xfc\xdf\xcb\x22\x42\x37\xae\xc1\xce\x74\x35\x16\xaa\xf3\xad\xf1\x56\x6e\xe9\xe4\xf6\xa5\xed\xe9\xb8\x2c\x86\xb8\xaa\xe4\xea\x83\xa9\x7f\x23\x91\xc5\xdc\x8c\xe4\x2a\x36\x9f\xab\x35\x12\xea\x17\x73\x14\xd9\x2b\xbe\xee\x5b\xc3\x15\x91\xac\xa6\x00\x55\xb4\xfc\xb4\x3a\xc6\x33\x18\x04\x7d\x12\xca\xe7\x40\x76\x83\x3f\x4d\xeb\xd6\x86\xf3\x8d\x5e\x23\x3c\xad\xf2\xd3\xe5\x65\xdf\x9a\x02\xa3\x65\xfb\x2a\x6f\xc0\x0e\x6a\x3d\x13\x36\x8d\x6a\x83\x22\x10\xeb\xf6\x68\xe3\x24\xf1\x69\x9f\xac\xe9\x6c\x94\xe3\xb3\x62\x16\x65\x28\x86\xf0\x52\xa3\x0a\x73\xe7\xe4\xd8\x6d\xc0\xf7\x88\x0c\x5a\x57\xec\x85\x5f\xab\x05\x1c\x20\x43\x10\xfb\x38\xcd\x5b\x42\xb0\xce\xad\x0b\x60\xc1\x80\x4b\x59\x1e\x6d\x52\x7c\x5d\x0d\x00\x74\x98\x6b\x78\x33\x2e\x5a\x62\x25\x56\x5f\x22\x2c\xee\xbd\xd6\xa3\x35\x24\x61\xf9\xf5\x67\xd6\x24\x4a\xd2\xc7\xeb\xd0\x0c\xd2\x1d\x62\x8a\x5e\x8e\x8b\x9c\xb9\x8a\x46\x57\x29\xbe\xfe\x6d\x82\xf5\x47\x08\x76\xa9\x72\x4c\xf9\x72\xe4\xa7\xe1\xe1\xf9\x70\x1e\xc7\x94\x82\x0c\xd7\x3d\x52\x3e\xa6\x3b\x62\xc6\x97\xb9\x51\xf1\x51\x45\x3d\x6f\x9a\x8f\xe2\xfc\x2b\x2f\xb7\xb6\xd0\xf1\xb7\x7e\x8a\x48\x7c\x56\x4d\x3d\x3b\x59\xdb\x08\x8a\xd8\xe5\x73\x07\x76\xd2\x12\x0e\xc8\x45\x59\x5c\x03\x5a\xb3\xcd\xd0\xda\x61\x56\x1e\xc7\x67\xbb\x69\xfe\xa1\x13\xe7\x49\x87\xb7\x2d\x1c\x29\x76\xaa\x8b\x62\x92\x25\x0c\x6f\x3d\xc3\x9d\x49\x85\x93\x4e\x9a\x57\x69\x82\x3b\xc5\xa8\x13\x77\x64\x5f\x83\x35\x11\x92\x55\x84\xdb\x48\x47\x1b\xc0\x44\x11\xee\x7a\xd2\x24\x2a\x81\xaa\x18\x65\xf1\x55\x61\x3b\xf3\x10\xa5\x6d\x19\x67\x9a\x3c\x20\x94\xab\x62\xa9\xc7\x85\x62\xa9\x8f\x32\x19\xdb\x27\x5b\x3c\x66\x2b\x9b\x2c\x70\xb5\x8f\xe4\x5a\x69\x5e\xdf\x5b\x97\x0c\xcc\xbd\xab\xc2\x65\xee\x1d\xbe\x3a\x38\xdc\xf9\xe3\x60\xff\x78\x63\x37\xf2\x2e\x8a\x32\xfd\x4c\xef\xcf\x8c\x92\xc5\x6f\xb7\x0f\x8f\x77\x36\x69\xfa\x15\x37\xd6\xf7\x6a\xbf\x2a\xee\xee\xfc\xaa\x60\xc6\xc9\x55\x01\xc6\xc9\x60\xd8\x6a\x9f\x30\xb7\x8e\x05\xf7\x74\x20\xa8\xcf\x2c\xbe\x29\x26\x24\xaa\x0a\xad\x1b\x2a\x5c\x06\xb1\xeb\x09\xba\x8c\xeb\x66\xd8\xae\x1d\xcc\xc2\x9a\x8e\xc4\x71\x7c\x66\x53\x91\x02\xe2\x08\x4c\x9a\xa3\x67\xc2\x09\x07\x83\x2d\x78\x09\xc7\xf1\x99\x4d\xbe\xf2\x2e\x47\xb4\xd3\x62\x86\xd6\x4f\x06\x7d\x1b\xac\x54\xb3\x00\x61\x76\x48\xd8\xe2\x85\x69\x7e\xc0\x61\xeb\xc4\x57\x83\xf2\x92\x80\x1a\x04\x97\x99\xad\x91\x59\x5f\x50\x48\x3d\x2c\xa2\x2e\x9a\x4c\x5b\x71\x79\xf6\x8d\x13\x66\x49\xab\x53\xe9\xfc\x9d\xb9\xb0\x35\xc4\xd4\xf4\x68\x5b\x5e\xb7\x48\x7c\xc6\x1f\x92\x1d\xe9\xe0\x5f\x4f\x8b\xec\x33\xb1\xea\xad\x0c\x8b\x95\x15\x26\x38\x15\x0f\xc5\x21\x1e\xc9\x9d\x45\xdf\x3e\x20\x8b\xac\x16\x35\xb0\x60\x4f\x20\x70\x0a\xee\xb5\x6c\xfb\xf2\x0c\x27\x09\x4e\x68\x9e\xd8\x8e\xb1\x10\x23\x81\x93\x74\x87\xc3\x73\xc9\xf4\x35\x0a\x0a\x47\xde\x72\x10\x33\x6a\x72\xa2\x89\x09\x45\x8d\x7a\x62\x4c\x6d\x35\x84\x9c\x16\x56\xa2\xe5\x0a\xb4\x84\xd7\xda\x4d\x68\xe2\xe3\x82\x82\x9e\x7b\xde\xe4\x36\xd6\x66\x3d\x58\x23\x6a\x47\xcf\x03\x84\x93\x12\xf7\x20\xbe\x7d\x79\xe9\x36\x2e\xe2\x6b\xf9\xab\x28\x16\x14\x80\x58\xb7\xef\x5c\x88\xd4\x59\x8e\xfe\x35\x3f\x16\x05\x7b\x53\x21\x52\x42\xae\xaa\xaf\x7b\xff\x84\xf9\x4b\xd6\xd3\xbc\xc1\x74\xa4\xeb\x69\xc3\x09\xa6\x56\xfd\x75\x59\xfc\x85\x87\x04\x27\x87\x78\x24\xde\x1a\x2e\x79\x21\xf1\xd9\x38\xce\x71\x06\xe2\x17\x7d\xf4\xd2\x6b\x33\x97\x15\x2e\x2a\x67\xdb\xcc\xd1\x53\xf4\xa3\x89\xcf\x41\x24\x45\xd4\x45\x69\xf8\xae\x77\x30\x0d\xb9\xbb\x28\xa2\x2e\xd7\x4d\x1e\x17\x7a\x28\xcc\xe3\x8d\xe7\x47\xa7\x3b\x5b\x5e\x80\x46\x85\x8a\x7f\x39\x2e\xd0\xa4\xc2\x2f\xda\x18\x2f\x12\x07\x5a\xf5\x56\x2e\x8a\x95\x95\x9a\x45\xc8\x3c\xa7\x57\xde\xe5\x1c\x57\x1e\xca\x51\x8c\x32\x54\x3d\xe0\xea\xc3\x99\xb8\xf1\x86\x23\x19\x32\xf3\x4a\x3f\x0a\x74\x5f\xc4\xcd\x7b\x32\x53\x49\x3b\x49\x54\xc9\x2f\xfa\xf2\x18\x57\x26\x4b\x50\xf7\x65\x96\xe6\x1f\x56\xbd\x95\x73\x7a\x59\xf2\xa9\x2c\x22\xd1\x83\xb0\xc4\x55\x91\x5d\xe1\x4d\x41\x35\xf0\xb9\xf3\xd3\x82\x73\xc9\xb4\xed\xba\xa9\xfc\x9e\xb9\x7a\xcd\x2f\x50\x09\xca\x2f\xd0\x55\x91\x26\x9d\xae\xf8\x73\x72\xc2\xa7\xc0\x64\x33\x0d\x06\x41\x98\x72\xb3\x2c\x16\x7f\x46\xbe\xa3\x5a\x1c\x1a\x99\xc6\xef\x3a\xad\x90\x1d\x67\x46\xe6\x38\xee\x1f\xf6\xc4\x2f\x19\x4f\x3c\xbb\x3b\x93\x84\xce\x1c\x48\xb4\x35\xad\x50\x6e\xdb\x2a\x41\xca\xf7\x40\x5c\xbd\xf3\xde\xe9\xfc\x2d\x60\xab\x33\xff\x13\x52\x19\xd5\xda\xde\x01\x55\x21\x22\xba\x73\xad\xa9\x0f\x80\xb8\xfe\x1f\xf0\x72\xf0\x41\xa5\x8e\x48\x15\x0c\xe2\x7a\xb7\xbf\xda\xfb\xcf\x5c\xe9\x56\x6c\xcd\xd3\xb7\x89\xa6\xf5\x72\x7a\xa6\xdd\xfc\xfc\xd7\xb8\x78\x10\x5a\x6e\x88\xc1\xb5\x5b\x93\xfe\x6b\x68\x2d\x0c\xe6\x0d\xd3\xa0\x87\xe1\x9c\xe2\x7c\x5d\xad\x67\xad\x84\xd5\x3b\x1f\x3e\x09\xb7\xdf\x72\x7b\x48\xd9\x75\xc3\x63\xb7\xbe\x13\x85\xd4\x9a\x0d\x97\x7b\xfc\x66\xf8\x71\xc3\x45\x38\xfc\x96\x41\x21\xce\x48\xce\x83\x41\x9c\x91\x1c\xee\x15\xa8\x6b\x1c\x9c\xc0\xf7\x40\x8a\xd1\x96\xc9\x5a\xd2\xda\x0c\x8c\xa7\x8f\x0d\x44\x7b\xf7\x58\x82\x37\x40\xea\x08\x32\x7d\x1b\xbe\x34\x3b\x32\xd9\x43\x9e\x2a\xa3\x47\x1d\xbd\x9a\x79\xb3\xcf\x7b\x9f\xeb\xf7\x71\x89\x4a\x15\xe8\x8d\xe6\x3a\xf9\x9a\xfa\xd5\xa3\x93\x04\x50\xfe\x01\x07\xef\x11\x4f\xd4\x7d\x50\xa3\x05\x62\x9f\xf8\x22\xf8\xc9\x65\x41\xb1\x23\xf1\x35\xa1\x5f\x73\x20\x4b\x6c\x95\x25\xa2\x84\xda\x4a\x71\x04\x47\xc7\xa8\x1a\x3a\x54\xe7\x19\xba\xce\xbe\x78\x0c\xad\x9b\x2f\xc6\xfd\x13\x2f\xbe\x94\x96\x6b\x08\xec\xe2\xdc\xeb\xa4\x2c\xc6\x49\x71\x9d\x73\x89\xfe\x52\x37\x78\x5c\x6e\xdf\xcc\x89\x3b\x9b\x0b\x23\x9b\x7e\x76\x4d\xef\x02\xce\x63\xac\xa3\x55\xe9\xc2\x6a\xd4\xa7\x7c\x87\x6e\x49\xe5\x1e\x99\xc5\x73\x1a\x4e\xd9\x4e\x2f\x8b\x49\x85\xc1\x6b\x23\x0f\x7c\x2b\x16\x4c\x38\xd0\x68\xb8\x15\xb6\xdb\x30\x4d\x3d\x34\xbe\x03\xd7\x9d\xb7\x28\x48\x83\xd4\x92\x48\xc4\x1c\x64\x59\xc4\xcc\x5a\x18\xd2\x04\x1e\x1e\xb5\x40\x9c\x55\x21\x03\x71\x56\x05\x04\xe2\xd4\x64\xdd\x51\x57\xda\x61\x37\xb0\x2f\x61\x56\xc7\xc1\x9a\x83\x6d\x16\xd7\x51\x27\x35\x05\x33\xe7\xc8\xe4\x11\xed\xb4\xa1\x8b\x7a\x7b\x3a\x6b\xc8\x24\x6b\xf5\x52\x12\x66\xf0\x6c\xb5\x67\xb6\xb2\xc8\x02\xe6\x09\x0b\xf0\xd5\x60\x50\x91\xf8\x6c\x27\xb1\xc7\xa7\x77\x40\x72\x88\xf8\xec\x2b\x0e\x94\x42\x05\xc2\xbf\x8a\x34\xf7\xbd\x8e\x27\xac\xfe\x37\xd9\x1b\xd2\x3a\x0f\x1f\xf0\x0d\x78\xdc\xb6\x6c\x4f\xec\xad\xc9\xa1\x49\x17\x9f\xb3\x19\x68\x3c\x3c\x9b\x68\xf6\x20\x97\x93\x44\x5a\x9d\x7b\x47\xad\xcd\xf3\x8d\x2d\xa0\x6d\x67\x9a\x7f\x6d\x3d\x39\x02\x8f\x01\x0e\xbf\x20\x2e\xb7\x19\xc2\x03\xba\x9c\x03\xf0\x15\xba\x29\xec\xbd\x98\x6b\xd7\x5f\x79\x26\x4f\x3e\x2e\xd8\x85\xc3\xf4\x50\x8c\xda\x96\x10\x5d\x78\xf4\x25\xa6\x8f\xe0\xc0\x6e\x94\x4f\xbc\x69\x4b\xa3\x6d\x2a\x71\xa0\xec\x0a\x2d\xc5\x83\xc6\xc4\x6f\x32\x17\xba\xb7\x26\x14\xcd\x6f\x7b\xe8\xd8\x26\x6e\xe7\xf0\x63\x9c\xaf\x3b\x17\x48\x58\xed\xd8\xe9\x81\xeb\xee\xa3\x60\x54\xf7\x84\xc3\xf7\x25\xab\xa4\x88\x58\xe7\x5c\xb9\xd6\xa1\x38\xe6\x83\x9b\xef\xb3\x60\xf5\xec\x3e\x5b\x72\x6c\x9d\x99\x2b\xe6\xea\x48\xb3\xd3\x53\xbc\x50\x38\xdf\x87\x13\x77\xb7\x07\xc0\x62\x36\xfa\xb1\xe8\x46\x90\x23\x67\x9e\x33\x7e\xc5\x37\x53\x37\x41\x73\x49\x25\x00\xdd\xf3\x01\x57\x25\x08\x09\xf4\x89\x3b\xc4\xd2\xe7\x8e\x65\x04\xc2\x3f\x54\xfb\x24\x13\x63\x76\xdb\xf7\xe0\xdc\xbd\xe5\xbe\x80\x0b\x41\x24\x6c\x3a\x4d\x3d\xe9\x95\x2a\x8d\x80\x84\xaf\xe3\x2b\x12\x1e\x04\xea\xce\x6f\x5c\xb1\x41\xe0\xf6\xf5\xe2\xc0\x03\xa6\x00\x71\x23\x08\x6d\x6f\x85\xac\xde\xf0\x5b\x54\x4b\xd7\x38\x82\x3f\xa8\x69\xf8\xb4\x59\x42\xb5\xce\x4e\xc0\x19\x35\x92\xce\x70\x93\x21\x8a\xab\x62\xf6\xf3\xa4\x3b\x98\x92\xa5\x91\xb1\x68\x91\xdd\xbb\x90\x55\xd5\xad\x65\x56\x75\x7f\x5f\x11\x8a\x52\x62\xee\x9b\x1b\xac\x84\xfb\x1a\xd2\x08\x11\xec\x82\xa1\x23\xaf\x0a\xf4\xfd\x5c\xe4\x52\x15\x01\xf1\x33\x8b\x61\xed\x03\xc7\x7a\x23\x47\xff\x42\x92\x5d\xf2\x72\xe4\xdf\x14\xe8\x07\x24\x39\x2b\x2f\x47\xfe\xdb\x6c\x5e\x3a\xcd\x8d\x3f\xce\xa2\xdb\xf4\x17\x7b\x6a\x59\xb1\x5d\x9c\xe1\x30\xe7\x26\x6a\x80\xf9\x2b\x45\x9e\xe0\x9e\x43\xa0\x32\x1a\x23\x82\xa1\x31\x8c\xcf\xb0\x0b\xbf\x3d\xe4\xb1\x44\x6f\xe0\x20\x2c\x2f\x33\x74\x1a\xa3\xa2\x40\xa3\x82\x92\x97\x8c\x1e\xfa\x81\xd1\x43\xdf\x6b\x8c\x78\xc5\x34\xa2\x67\x90\xb1\x98\x64\x30\x59\x0f\x79\x67\x05\xb9\x00\xfe\x7b\x1e\x5f\x89\xb8\x82\x02\xed\x60\xa5\x19\x06\x22\xe2\x4f\x02\x9a\x02\x9d\x42\x27\x60\x45\xf3\xa2\x28\x3d\xfe\xf7\x60\x24\x53\x85\x6d\x8d\x7b\x8d\x2c\x39\xc0\x98\x22\x3b\x39\xe1\x91\xe8\x58\x5f\x84\xb1\xc7\x09\x18\xfd\x1c\x73\xfa\xee\x60\x42\x32\x16\x9c\xb0\xb5\x2e\x4c\x77\xa1\x18\x34\xcc\x5f\xf4\x2a\x8b\x5a\xa2\x55\x8c\xc7\xe3\x2c\x1d\xba\xdb\x6c\x18\x12\x01\xf7\x4a\x1a\x2e\x41\xdc\x59\x5a\x07\xb8\x53\x1a\x67\x4a\xe3\x43\x29\x5a\x96\x3d\xc7\x30\xb7\xf2\xa9\xd6\x82\x4d\x2a\x13\x23\x6d\x6b\xca\x90\x73\x9e\x61\x7c\x84\xb3\x2c\x1d\x57\x69\xb5\xaa\x4b\xd6\xc1\xb3\x34\x80\x6a\x3e\xfc\x9d\xf5\xce\x7f\xa5\xf9\xa8\xf8\xaf\x4e\xbf\x93\x4f\xc0\x38\x8e\x4e\xa8\x11\xfa\x42\x86\xc6\x94\x4b\xab\x9b\x47\xcd\x2e\xdd\xb2\x46\x0a\xc8\x4c\xe1\x0d\x37\xa2\x99\x64\x66\x68\x48\x73\xe7\xe9\x6a\x06\x56\xf8\x46\x27\x9e\x2f\x63\x39\xc2\x88\x9c\xb5\x67\xe0\xd8\x5a\xf0\xc6\xb7\x3c\x3e\x23\x28\x3b\xc9\x4d\xac\x05\x70\xdc\xa3\xb7\x5a\xaf\x6b\x97\x78\xaa\x1b\xff\xbc\xfc\xf0\xc2\xff\x8e\x89\xa1\xbe\xb3\xa3\x29\x1a\xa7\x0e\xdb\xcf\xb4\xc9\x65\x2d\xae\x73\x51\x68\x27\xa9\x5c\xa1\x08\xd9\x59\x54\x70\xd4\xab\xd8\x1e\xb8\xb0\x95\x28\xe5\x31\xbb\xba\xb6\x3d\xd1\xdb\x0c\xe5\x61\x75\x8e\xb8\x61\x1a\x79\x8d\xf6\x73\x74\x53\xb4\x1b\x19\x6d\x4e\xd7\xe9\xd0\xec\x7b\x9e\x7c\x79\xab\x1e\xf0\x4d\x84\xf2\x02\x9d\x66\x03\xb4\x99\x29\xf5\xa4\x8d\xb9\x7b\xfd\x19\xa5\x0f\x52\xe4\xbe\x7f\x30\xba\x0c\x9d\x55\xdc\xbd\x12\xfd\x25\xfb\x7e\xf4\xf5\xf4\xd4\x48\x81\xca\x02\x6d\x16\x68\xa3\x50\xfd\x79\x3b\x95\xbd\x26\x88\x6a\xe1\xd6\x2b\x22\x75\x45\x8a\x31\x73\xaa\xca\x82\x53\x9a\x05\xc2\xb3\x22\xb9\x09\x4d\x1d\x62\x2f\x2f\x56\x2b\x51\xc3\x03\x3a\x7a\x72\x89\xe7\x87\x21\x69\x04\x0b\x90\x50\x2e\x6e\xab\xc7\x95\x09\xec\xe6\xef\xe9\xa0\x26\x0f\x7f\xed\x3e\xc4\x45\xcd\xab\x79\xe5\x0f\xa7\xb2\xb3\xb6\xeb\x07\x83\x1f\x29\x9c\x40\x14\x49\x9c\xed\x24\x82\x83\x79\x6a\xd0\x96\xa7\xca\x57\x69\xe2\x0a\x4a\xda\xf0\xf6\xc0\x22\x22\x3c\x8f\x87\x1f\xe8\x5b\xa9\x92\x3f\xa4\xe3\x0d\x11\x98\x36\xe2\xd1\xdd\xb9\x9b\xdd\x9b\x71\x5c\x55\x6c\x31\x45\x7f\x65\x2c\x54\x52\x8c\xc1\xa2\x59\xa6\xc4\x19\x33\x71\x76\x78\x75\x10\xf4\x87\x24\xc7\x1d\x90\x81\x47\xc3\x99\x8f\xe3\xb2\x20\x05\xdd\xf7\xe1\x45\x5c\x1d\x5c\xe7\xaf\xcb\x62\x8c\x4b\x72\x13\x0e\xe3\x2c\xf3\x09\xf2\x60\xf0\x1e\x8b\xa7\x04\xbf\x05\x89\x01\xc1\x65\xd7\xdd\x73\x1d\x5a\xdb\xbb\xdf\x52\xac\xb1\x87\x5b\xf4\xd9\x67\xd6\x33\x3d\x02\xd0\x0f\xe9\x8a\x80\xc7\x27\x6a\x2e\xa5\xe6\x4f\xc0\xf0\x85\x22\xe7\x7b\xdd\x98\x6c\xe9\x49\xa0\x6f\xfb\x3c\x58\x6a\x6d\xb5\xa7\x45\xcb\x39\x2e\xe3\x71\x58\x61\xf2\x9a\xbb\x5a\xe1\x1c\x9a\xa0\x1e\xc5\x09\xde\x2a\x72\x60\x7e\x79\x94\x68\x64\xee\x37\x49\x71\x44\x62\x22\x23\xd4\x36\x3b\x7e\x7f\x9f\x06\x6f\x75\x8a\x4b\xc5\xf1\x5f\x8c\xf6\x82\x23\x33\xb7\x3a\xcf\x93\x6c\x1e\xa5\x68\x39\x51\x8b\x13\x26\xba\xfc\x97\xc7\xd3\x66\xae\x4d\x9d\x62\x60\xbe\xe0\x35\x5a\xea\xa1\x34\x1c\xbf\x3f\x92\x16\xeb\x40\xd9\xc0\x9e\x47\x98\xcd\xba\x46\xcb\xc0\x37\x23\x65\xf6\xe8\xf0\x0f\xa0\x1c\x3f\x23\xb6\x7b\x06\x28\xe1\x76\xcf\x60\x5e\x10\x5a\xf1\x23\x23\x83\xa3\xc0\x5a\xc2\x00\x19\x97\x88\x5e\x53\x4f\xa7\x15\x8d\xef\x01\x72\xdc\x03\xfa\x40\xae\x70\x59\xa6\x09\x36\xf2\x29\x05\xd0\xac\x05\xdd\xe7\x27\x44\x83\x40\xb7\x35\x78\xac\x04\x0f\x03\x9e\x2c\x42\x8b\xcb\xa0\xfc\xac\xa7\x2c\x1a\x3f\x0b\xc3\xaf\x7b\x73\xd0\xb6\x78\xdf\x98\x62\x81\x29\x8b\xa3\xa8\x72\x37\x32\x82\xcb\x3c\x26\x98\xb5\xe5\x0e\xb8\x8f\x4e\xde\x16\x03\xb0\x69\x3f\xde\x72\xca\x2b\xb7\xf3\x69\x6e\x1f\x18\xb6\x4e\x77\x25\xa5\x5a\x94\xef\x05\x76\x00\xac\xf8\xf8\x56\xe1\x9e\x28\xa6\xd1\x67\x49\x1a\x67\xc5\xb9\xa0\xbd\x38\x14\x45\x7a\x41\xc2\x2a\x2f\xe4\x0c\x56\x2f\x0b\x09\xed\x4d\xcd\xf6\xdf\xce\x33\xd2\xb8\x01\xf0\x6a\x0c\x5e\xed\x52\xb6\x17\x55\xaf\x0f\x72\x4a\xcb\xee\xe4\x29\x31\xfa\xbe\x0a\x7e\xeb\x64\x23\x5c\x85\xed\xbe\x5e\x29\x24\x54\x8a\x66\x18\x5e\x0b\x5a\x48\x51\x5e\x5a\x1e\x09\xc3\x79\xc5\x7f\xdc\xc5\xc5\x1f\xb9\x52\xbe\xfb\x94\xa3\xde\xbf\x50\xef\xfb\xa9\x6e\x2e\xd4\xa5\xd1\xf0\x71\xf1\x24\x43\x37\xd5\x2c\x27\x17\xff\xff\xbc\xc3\xff\x27\xbd\x5d\xe4\x45\x8e\xd7\x44\x7a\x2d\x7e\x00\x19\x3c\x57\xfd\x34\xcf\x52\x1d\x82\x37\x40\x49\x4c\xe2\xfe\x6d\xac\xee\x11\xbf\x8b\xae\x49\xf8\xfb\x13\x4a\x5b\xc2\x7b\x44\x49\x79\x9e\x8a\x0f\x03\xdf\xfb\xef\x4e\xf4\xac\xc3\x51\x16\x9e\x5e\x3c\x0f\xfc\xdb\x62\x1c\x0f\x53\x72\xd3\xef\x22\x19\x3a\xa2\xef\xc9\xf0\x14\x7e\x17\x75\x56\x9f\xfe\xf0\xff\x02\xaf\x0e\x10\xab\xf5\x17\x09\x7c\xaf\x1b\x3e\xad\x3a\x38\xae\xf0\x6a\x9a\xaf\x52\x3a\x36\x18\x88\x7c\x68\x0d\x1a\xa2\x2d\xfe\xb7\x6c\xcd\x5d\x0f\xdd\xab\x2b\xc1\x40\xb5\x27\xc7\x6c\x8e\x17\xb8\xb7\x46\x07\xcc\x36\x66\x8c\xc7\xd5\xaf\xf0\xa7\x1f\xa0\x69\x64\x4f\x2b\x3c\xfa\xf7\x18\x27\x1f\x88\xa6\x9e\x73\x3d\x2f\x7a\xac\x82\x01\x30\x14\xe5\x42\x8b\x5c\x20\x74\x95\x22\xaf\xcb\xd1\x53\x11\x11\x10\x97\x20\x79\x2f\xc3\x72\x22\xc4\x17\x1b\xf9\xf9\x24\x8b\x4b\x8d\x7b\x5f\x80\x91\x39\x66\x86\xc7\x87\x98\xde\xf3\x07\x3c\xc9\x97\x71\x1f\xe3\x24\x39\x28\x0f\x81\xb4\x00\x81\x32\xe8\xbc\x71\x7c\x5a\x00\x10\x3f\x94\xef\x67\x67\xa4\x01\xad\x73\xd3\xc2\x95\xba\x61\x70\xd6\xd5\x64\xec\x21\x35\x02\x67\xe7\x6a\x2b\x8c\xc2\x7c\x80\x19\x4f\x4c\xf7\xc0\x6c\x43\x65\x72\x07\x1d\xe9\x85\x58\x24\x8d\xa1\x31\x6e\xc5\x5a\xd0\x1c\x73\x31\xf6\x03\x9f\x6b\x98\xca\xb9\x4b\xd2\x6a\x58\xe4\x39\x0b\xbc\x66\xad\xcb\x24\xcb\xea\x38\x49\x54\x2f\xcc\x3d\x41\xb1\xd4\x0d\x61\x2d\xdf\x3e\x3e\xa5\xde\x66\xec\x9a\xa0\xb6\xc7\x68\x41\x67\xd9\x8b\x34\x00\x21\x5e\x9a\x2b\x62\x6a\xd7\x37\x21\xf0\xa0\x1c\x22\x5c\x2c\x09\x87\x10\x65\xee\x15\x84\xc6\xfa\x37\xe1\xf1\x4b\xd8\xe7\xba\x58\x78\x05\xbe\xef\x5e\xb0\x7b\x9b\x3a\xf1\x88\x96\x0e\x75\xcb\xc3\xee\xd9\x42\xda\x94\x3f\xe9\x6f\xa8\xee\x68\x66\x6f\x6e\x96\xce\xd7\x71\x2f\xf3\x91\xf1\x73\x2c\x66\xce\xee\xfc\xbd\x46\xd9\xd7\x61\x44\x31\x2e\x94\xea\xf2\xa7\x79\xac\xb8\xd2\x44\xf3\x92\xcb\xe2\x68\x68\x6a\xc7\xa7\x69\x22\x7d\x24\x80\x1e\x88\xad\xc8\x4c\x0b\x58\x2e\x3b\xbe\x9c\xe5\xd2\x1f\x5f\x56\xd1\xae\x28\x32\x92\x8e\xef\xa7\x5b\x27\x2a\x33\xad\xba\x06\x01\x70\x1a\x23\x69\xd2\xf0\x2a\x43\x93\x0a\x6f\x7f\x4a\x2b\x92\xe6\xe7\x7d\x38\x86\x35\xfa\x98\xa3\x4f\xc5\x97\x56\x65\xe4\xd6\x03\xdb\x45\x74\x22\x24\x39\x19\x1e\x11\x5b\xae\x83\x3c\x52\x8c\x45\x0e\xfd\x29\x92\xc5\x5f\xc8\x1a\xa0\x1d\x0a\xe7\x13\x45\xbe\xc1\xed\xdc\x65\x42\xb3\xce\xb9\x73\xf9\xe3\x36\x43\xd4\x17\x0d\x07\x3d\xd2\x10\xd5\x36\x15\x9d\xe4\xe9\xc7\x09\x56\x2c\x32\x3e\xeb\x3b\x89\xb2\x3d\x6b\xb1\x5d\x15\xab\xbb\x98\xc1\x2a\x5f\x54\xfe\xac\xa9\x68\xa3\x22\x48\x3f\x70\x6a\xd2\xcf\x38\x82\x01\xb3\x2e\x8a\x23\x56\xb6\x9f\x28\x66\x13\xa1\x4e\xa1\x3a\x96\x77\x77\x9e\x17\x38\x8f\xa9\xd2\x7f\x34\x87\xac\x55\x66\x0d\x8e\x5b\x34\xd6\xc6\xba\xc2\xd5\x58\xd3\xd8\x12\x0e\xdb\x1d\xef\x23\xf3\x10\x0a\x39\xcd\x70\x24\x62\x46\xbd\x15\x63\x76\x84\x5e\x90\x9c\x2d\xb2\xbc\xbc\x5d\x98\x5e\x73\xd6\x49\xdf\x98\x43\xd9\x6c\x9c\x24\xf7\x6c\x93\xbb\x9b\x57\xbb\x93\xbd\x9c\x5a\xe0\x9f\xc8\x08\xc7\xd7\x0c\x03\x64\x05\x1c\xd4\xbd\xbb\xcb\xed\x7f\x2f\xa0\x7a\x38\x42\x1d\xaa\x71\xc6\x9c\x90\x8d\xa8\x80\x53\x7a\x7c\x7c\xf0\xda\x01\xb8\xbd\xc7\x73\xc0\x95\xe1\x0d\x75\xc0\xbc\xab\xc2\x07\xbd\x0b\xb4\x1e\x74\x70\xfe\x1e\xb7\x77\x55\x8b\x76\x38\xa3\xa3\x35\x6c\x7f\x7a\x1c\xed\xad\x4f\xd3\x60\xdb\x43\x26\x71\xe3\x82\x8b\xec\x3b\x0a\x47\xec\x73\x38\xff\x64\x79\x79\xc7\xb1\xc7\xe5\xad\x70\xdf\x0d\x0e\x0d\x3d\x4a\x74\x94\x57\x99\x32\x6c\x7f\x22\x19\xae\x9f\x16\x36\x15\x30\xaf\x51\xe3\xb1\xfc\x71\xe6\x63\x69\x9a\xb9\xa4\xca\xbe\x45\xe8\x51\x88\x0b\x17\xa5\xe1\x9b\x64\xec\x7b\x9c\xca\xe4\xc2\x60\xfd\xa5\x55\xd6\x8c\xc0\x3c\x97\xdc\x51\x71\x25\x30\x5e\x9f\x90\x58\x7b\xc8\x13\x19\x06\x2f\xd0\x60\x03\xa2\x34\xe9\xd3\xae\xd5\x0d\xd3\xfc\x2f\xab\x26\x7f\x30\x83\x7e\x76\x29\xd9\xb6\x3d\x0f\x82\x9c\xae\x26\x67\x4a\x5f\x9d\x7e\x68\x54\x6a\xe3\x49\x49\x13\x33\x1c\x1e\x3b\x97\x65\x1a\x6f\x61\x96\x08\x66\x69\x41\x50\x57\x17\xc5\xf5\x31\xab\xed\xb7\xab\xfe\x2e\x75\xeb\x8b\x34\xc1\x73\x14\xec\xb5\xe9\x86\x4d\x75\xb4\x7d\xcf\xe3\xa1\xd4\xc0\x3e\xdd\xc3\x8e\x8c\x0d\x46\xd7\x24\x31\xcd\xc9\x14\x61\xea\x75\x75\x03\xb2\xef\xe7\x95\x1f\x00\xe5\x8e\x73\x42\xa1\xbb\xa4\x07\xc6\xdc\x4b\x75\x8c\x39\xcb\x02\xf0\x0c\xc7\x57\x2d\xa2\x09\x63\xbd\x68\x85\xb3\x6c\xd2\xd2\x0f\xab\xa8\x54\xbc\x50\x1a\x15\x89\xd8\x35\x67\x37\xc2\x74\x4d\xdb\x48\x81\x3c\xfd\x9c\x81\xda\x38\xe9\xd2\x45\x24\x9c\x74\x79\x4c\x3e\x7c\x6d\x37\x31\x56\xc4\x25\xf4\xfa\xeb\x75\xe8\xaf\x0a\xed\x16\xe8\x83\xa6\x0c\xb0\xff\xb5\x67\xc7\xf4\x67\x72\xf8\x28\xfe\x4c\x0e\x8b\xbb\x3b\xff\x90\xfb\x33\x39\x04\x7f\x26\x68\xcb\x0d\x79\xff\xe0\xf8\xf4\xe8\x78\xe3\xf0\x78\x7b\x2b\xf2\xf2\x82\xac\x56\x24\x2e\xc1\x38\x92\x84\x9b\x6f\x0e\x0f\xb7\xf7\x8f\x23\x8f\x4b\x91\x69\xda\xeb\xc3\x83\xcd\xed\xa3\xa3\x9d\xfd\x97\x91\xc7\xbd\xd6\x41\xf0\x21\x12\x1e\xbd\xd9\xa4\x39\x91\x8c\xf1\x83\x48\xb8\x7d\x78\x78\x70\x18\x79\xe0\xf2\xd1\xab\xfd\x2d\xda\xaf\x2d\xde\xaf\x2d\xe5\x67\xe5\xc5\x3c\x1a\x19\xd2\x27\xe4\x5e\x3c\x06\x5a\x7d\x2f\x1e\xa3\x46\x4e\x58\x61\xe2\x6f\x15\xfa\xb8\xd0\x6d\x2a\x3d\x96\x7b\x22\xd0\x10\x24\x81\xca\x5a\x1f\x74\xa1\xa4\x31\x71\x9f\x19\xf9\x84\x24\xbd\xc4\x59\x9a\xe3\x23\x82\xc7\xfb\x05\x39\x62\xd3\xa2\x05\xb1\x6c\x34\xc9\xa7\xcb\x68\x2e\x29\xc8\xaa\xa3\x49\x1e\x6a\x6c\x6a\xa3\x5c\x15\x6c\x5a\x8b\x6a\x31\xf4\x46\xb9\xd1\xf9\x42\x23\x7c\x2d\x97\x72\x5a\x7b\x7c\x89\x8d\x11\xf2\xd5\xa6\xfb\x26\x4f\xe2\x32\x31\xc7\x29\xf7\xc2\xd4\xd6\x8f\x58\xa9\x69\x4d\xc3\x4e\x32\x1a\x86\x4d\xd5\xd2\xac\x08\x50\x35\xb5\x55\xa0\x7a\x6b\xa0\x06\xa5\xbb\x7c\xdb\xad\xa9\xd1\x95\x73\x4c\x7c\x12\x28\xbb\x73\x5a\xd3\x08\x2a\x31\xab\xa6\xec\xbd\xac\x09\xfd\x9d\xbb\x2a\x94\xfe\x3a\xe1\xa6\xfe\x9a\x83\x89\xc6\x8d\xa0\x0e\x0d\xc7\x47\xf3\x99\x4d\x1d\x6a\x66\x53\xff\x59\xee\x15\xdf\x00\x06\x46\x3e\x15\xd9\xd0\xd9\x57\x06\x04\x66\x11\xae\x27\x3d\xbe\x82\xf5\x8b\x2f\xce\xeb\x42\x2f\xbf\x2c\x37\x51\x4c\x5d\x45\xf0\x98\x49\xaf\x8d\xa5\xf9\x6e\x1e\x62\x49\xe1\x50\x42\x24\xbd\xd4\x95\xe8\x51\x5b\x2b\x9c\x20\xfa\xa2\x73\xfb\x79\x3e\x92\x85\x1e\x76\x29\x73\xb1\x28\x17\xda\x8f\x51\x51\x5e\xee\x48\xe3\xfc\x8a\xc4\x04\x47\xe6\x9b\x37\xcd\x3a\x86\xe0\x31\xb8\xe6\x5f\x5e\xf6\xbb\x28\x0f\xf7\x5f\x70\xb3\x1f\x05\x59\x86\x12\x96\x65\x8f\xf1\x27\x2e\xba\x91\x49\x96\xfc\x26\xcd\x73\x5c\xd2\x62\x9c\x9f\x37\xd4\x82\x90\x38\x82\xe7\xd8\xc3\x0b\xcd\x5b\x58\x8e\x4b\x41\x33\x43\x50\x4e\x87\xa4\xdd\xca\x2e\x48\xec\xd6\x5d\x00\x14\xbf\xa6\x6d\x58\x95\x7a\x36\x2d\x68\x6c\x4d\xa2\xc8\x78\xa4\xef\x4b\x81\xbd\x28\x94\xf8\x69\xf7\x2c\x5d\x94\x15\xa1\xef\xfd\x7b\x18\xe0\xbc\xd4\x2c\x63\x66\xe9\x84\xc9\xcd\xf1\x30\x63\x95\x66\xb7\x99\xbc\x40\xdc\xa2\x30\xbb\x9c\x33\x41\xc0\xad\x12\xe8\x5e\xe1\x16\x17\x51\x1f\x84\xca\xd0\xcf\xec\x3c\x7f\x67\xc4\xe5\xb0\x14\x76\x84\xfa\x0b\xfb\xb3\x9d\x81\x56\x94\x28\x67\xde\x23\x4c\xa2\x87\x4e\x0c\x44\xd8\xb3\xa3\x7a\x70\xad\x9d\x3d\x9c\xa4\x93\x4b\x4e\x01\xb7\xdc\x27\x9a\x8d\x12\xbd\x52\x0e\x72\x75\xa9\xf0\x28\x1f\x3d\xe4\x55\xe3\x38\x17\x61\x3e\x26\x6f\x7c\x43\xb9\xff\xfd\xfe\xd0\xff\x0e\xed\xe4\xe8\x29\x0b\x53\xd3\xb0\x13\xa0\x30\x84\x4e\xcc\x53\x01\xfd\x07\x96\x47\x7f\xfe\x88\x1a\xf0\xfe\x85\x8e\x73\xd4\xe3\x76\x07\x96\x23\xab\xef\x84\x23\x2b\xb6\x33\x84\x8c\x37\x0d\xf7\x36\x2a\xff\xa7\x60\x8d\xa9\xf9\x03\xc8\x83\x8f\x13\x7d\x83\xc0\x4d\xd1\x62\x06\xb0\x44\x1f\x4f\x75\xb4\x02\x5f\x2d\x05\x82\x1d\xd5\xd0\xd6\xd9\xcf\xd1\x24\x6b\xd7\xf9\x7f\xfe\x15\x9f\x34\x46\xd5\x8f\x19\x4b\xed\x3e\x22\xb3\xe9\x20\xbf\x82\x7b\x8a\x37\x5f\x71\x36\x99\x56\xdc\x63\x4d\x24\x87\xf6\x15\xe6\xf0\xc9\xdc\x62\xf4\x82\xa0\x21\x41\x09\x41\x93\xaf\x23\x4d\xbf\xc8\x06\xfc\x8f\x8a\xd3\x33\x77\xe7\x93\xaf\xd0\xe7\xbd\x02\xbd\xd3\x9d\x50\xbf\xfb\x7a\x1c\x9e\xf7\x15\x3a\xae\xe8\xec\xed\x15\x68\xb3\x42\x9b\x19\x53\xaa\x40\xc7\x31\x9a\x54\xe8\xa8\x40\xaf\x0b\xf4\xb1\x40\xe7\x15\x3a\x8b\xd1\x45\x86\xf6\x0b\xb4\x17\xa3\x27\x8a\x3d\x55\xa3\xde\x4f\x4f\x7f\xfe\xb9\x6f\xf2\x6c\xf0\x27\x80\x1f\xe9\xa9\x57\x71\xd9\xc1\xd1\x6d\xbd\x26\x12\x3b\xa5\xcf\x84\xc3\xf8\x24\x1d\x04\x82\x0d\x79\x92\x0e\x44\x75\xe0\x37\xe5\x11\x4d\x8a\x6e\x53\x94\xf5\x97\x7a\x88\x67\xf5\x6f\xeb\x5a\xb8\x64\x26\xb4\x0a\x18\x18\xe4\xa2\x26\xca\x91\xfa\x5d\x06\x28\x0f\xb3\x68\xa9\xab\xd2\xc4\x04\x97\xe1\x65\x44\x50\x19\x0e\x23\x8c\xca\x30\x89\x0c\x4c\x23\x0d\x6e\xcb\xb0\x80\xe3\x73\x77\xc7\x0d\x1c\x12\x3c\x4a\x73\x2c\xcc\x1a\xa0\xd8\x2d\xce\x27\x97\xb8\x04\x4d\xed\xa5\x2e\x3a\xc7\xa4\x9f\xd6\x41\x8d\xca\xb0\x34\xc6\xef\x4d\x72\x56\x3b\xf1\x96\x44\x1c\xdb\xa3\x9b\xcb\xb3\x22\x5b\x5e\x66\x7f\x41\x49\xbf\x4c\xf3\xf3\xe3\xf8\x5c\x9a\x54\x34\x5a\x6c\x96\x45\xb7\x57\x71\x36\xc1\x7d\x6f\xaf\x48\x26\x19\xf6\xea\x00\xb5\x55\xf6\x4e\x4f\x71\xc5\x8b\x89\x6a\x4b\x5d\xd6\x5d\x12\x39\xde\x7a\x88\x5e\x1e\x95\x3e\x09\x02\xf4\xd3\x32\xbe\xbb\xfb\x9e\x26\x79\x05\xc0\xd7\x02\xf2\x32\x4f\x1d\xa1\x02\x2f\x16\x94\xc0\x2a\xa6\x11\xef\x11\x73\x44\xe8\xd3\xb7\x39\x58\x4b\x47\x7e\x19\xd2\x5d\xd0\xd2\xdf\x14\x79\x5c\x42\xe9\xd9\xd3\xcc\xba\x4e\x80\x4d\x4d\x3b\x54\xc1\x64\xa8\x99\x25\xc1\xa8\x28\x7d\xd8\x40\x9d\x34\xef\x90\xa0\x0c\x13\x3f\x45\x39\xf2\x1d\x07\x89\x9c\xe0\x41\x1d\x84\x67\x69\x9e\x40\xcf\x50\x1e\x04\x62\x77\xa5\x74\x6a\x72\xc7\x4e\xb6\xc6\xbb\xde\x64\xa9\x13\x11\xce\xbb\x76\x04\x1a\x21\x72\xff\xd2\x9e\x61\xe4\xc5\x1e\xc2\x01\xc2\xb4\xb9\xc2\x5a\x09\x5e\x70\x4e\x23\x1b\x0c\xab\x39\x8e\x3c\x0f\x95\x7e\x19\x56\x91\x17\xfe\xcf\x98\x79\x17\xad\xfe\x87\x12\x11\xd5\xff\x54\xe5\xf0\xff\x63\xef\x5d\x98\xda\x48\xb2\x05\xe1\xbf\x52\xad\x2f\xc2\x03\xd1\x59\xc7\xf9\x7e\xd8\xc3\xdc\xa0\xd9\x99\xcb\x44\xe0\x9d\x89\xed\xbe\xdc\x58\xf7\x76\x4c\x94\x45\x19\xb4\x53\x48\xac\x24\x70\x7b\x3c\xfe\xef\x5f\x9c\x93\x59\x2f\x49\x80\x00\x81\xb1\x2d\x3f\x4a\x55\x95\x59\xf9\x38\xef\xcc\x3c\x79\xf2\x25\x2d\x6a\xc0\x7c\x36\xd8\xfd\xbc\xf3\x69\x75\x16\xd4\x47\xf4\x94\x17\x17\x23\xcc\xba\x64\x8a\x0f\x2e\x67\x65\x86\xb0\x1f\xce\x07\xaf\x57\x23\xb1\xbc\x96\xe8\x58\x09\x07\x55\x31\x1d\xcd\x3f\x92\x2c\xde\xbf\x18\xed\xc5\x99\xc1\x44\x32\xd3\x9d\xd5\xcd\xba\x9c\x8f\xaa\xd9\x4b\x72\xc3\x6e\xcc\xbd\xbc\x71\x55\xa4\x43\x76\xc6\x7b\x9f\x3e\xb3\xa2\x1b\xc5\xbd\x91\x3a\x38\xcc\xfc\xdc\x87\xe8\x32\x9b\xd4\x41\x2f\x07\xec\x13\x32\xf4\x2a\xdc\xa2\xe1\x57\x95\x7f\x4d\x19\xff\xfd\xef\x9d\xc5\x57\x34\x05\x3c\x47\xf9\xdb\x7f\x8f\x3a\xb7\x25\x65\xda\x1d\xf0\x7e\x74\x7a\x59\x93\x36\x49\xec\x16\xc7\x57\x45\x35\x3a\x29\xe6\xe5\xff\x2c\xce\xcb\x1e\x15\x8e\xde\xef\xc4\x18\xd7\xd1\x95\x73\xd9\x59\x86\x86\x97\xd9\xb8\x38\x2f\xb3\xc9\x34\x2b\xaa\x51\x31\xcb\xce\x2f\x67\xf3\xec\x5d\x99\x15\xd9\x78\x32\xce\xcb\xf3\x8b\xf9\xc7\x2c\xb2\xce\x0f\x03\xe2\xc7\x97\xff\x67\xf6\x12\xe6\xe5\x8c\xce\x3b\x5f\xbf\xc8\xf1\x24\x1e\xb1\x55\x8c\xc6\x59\x31\xfe\x98\x7d\x38\x1b\xcd\xcb\xd9\x45\x31\x2c\xb3\xe1\x59\x31\x2d\x86\xf3\x72\x3a\xc3\x2a\x52\xe8\x4e\xfe\xb9\xd7\xc9\xf1\x64\x7a\x5e\x54\xa3\x7f\x95\x54\xc1\x52\x57\x1b\x98\xcf\x27\x47\x93\x0f\xe5\xf4\xa0\x88\xdb\x6d\xba\x45\xcc\xe2\x40\xb8\xde\x5d\xbd\xc0\x41\x48\x50\xd3\xbd\x12\xe6\xd3\xd1\x79\xed\xdc\xda\x85\xec\xce\x9c\x66\x14\xe2\x04\xc2\x72\x6b\x76\xe6\xbb\x6c\xfc\xeb\xfc\xb7\x17\x2f\x4e\xca\xaa\x9c\x97\x19\x3e\xd0\x9b\xbd\x29\x8e\x3c\x31\x5f\xb3\xaf\xbb\x26\xc4\x9a\x86\x68\x83\x55\xb3\x93\x8e\x4d\x77\x57\xb7\x7c\x1f\xa1\x59\xce\xf6\x16\x59\xac\x96\x63\xa3\x3d\xce\xc6\x7b\xd3\xd7\xa3\x3f\x8e\x6b\xef\xdd\xd1\x8f\x3f\xc6\xae\x15\x7b\xe3\x5f\x47\xbf\xad\xe8\x56\xb1\x7b\xbd\x22\x29\xae\xa5\x6d\x14\x87\xac\x2f\x6f\x97\x88\xf4\x73\xbf\x13\xc5\xc9\xc9\x22\x75\xd6\x4a\xa2\x23\x93\x17\x09\xea\x0f\xbf\x9c\x95\x59\x31\x3d\xa5\xad\xa2\x2d\x71\x8e\xb3\xf8\x69\x56\x8d\xe6\xe5\xb4\xa8\xb2\x8b\x62\x16\xdd\xba\xb2\xf9\x59\x99\xbd\x9f\x54\xd5\xe4\xc3\x68\x7c\x9a\x5d\x14\xf3\x79\x39\x1d\xbf\x6a\xb7\x29\xd4\x7f\x3e\x65\x71\x9f\x46\x8e\xc4\x3a\x78\x55\x3f\x35\xa3\xc3\xec\xf3\x1f\x76\x5f\xd7\xa0\x2d\xa3\x8a\x98\x2f\x08\xd4\x9d\xb2\xde\xce\xba\x40\x5c\x3b\x25\x43\x18\x2d\xe0\xf1\xac\x98\xad\xa0\xda\x1f\x7e\x18\xff\x7a\x3d\x55\xfd\xd6\x2f\xe2\xb4\x9c\x2f\x42\xf1\x87\x79\xad\x49\xc7\xc8\x9f\x2b\x14\x5d\x0b\xd4\x5f\x3e\x5e\x94\x89\x53\xff\x36\xae\x6a\xce\x6e\x01\x3c\x9a\x65\x05\x82\xae\x06\xe5\x68\x96\x9d\x97\xf3\xb3\xc9\x09\x34\x9c\x99\xdd\xa1\xb5\xc4\xff\xcf\x1a\xeb\xbf\x0e\xa8\x8d\xf1\x91\x65\x00\xf0\xdb\x2a\xc4\x8f\xde\xef\xac\xc0\x7d\x04\xff\x78\x45\xc2\x52\x87\xf6\xc7\x34\x6d\x97\x0d\xfe\xf0\x63\xf9\xe3\xe0\xff\x0c\xb2\x8f\x93\xcb\xac\x98\x96\xd9\x7c\xfa\x11\x5b\x3c\x9f\x64\xf1\x90\x6f\x62\x71\x7c\x3c\x99\x94\xb3\xf1\x1f\xe6\xf1\x58\xb8\xba\x8b\x49\x1b\x66\xa4\x0e\xf1\x0b\x12\x99\x5d\x0a\x4c\x42\x62\x67\xcc\x6a\x12\xfc\xcc\xe6\x9f\x77\x76\x5f\x2f\xab\xd2\xe2\x33\xbb\x4d\xab\x97\x69\x66\xf4\x91\x35\x7b\x9a\x80\x5d\x4f\xb9\x2f\xd9\x1c\xa8\xcc\x1f\x60\x09\x14\x7b\x9c\x55\x7b\xcd\x76\xf4\x74\x92\x40\x6c\xd1\x4e\x9c\xaa\xda\x7d\x5d\xc5\x1d\xea\xa4\x78\x06\xa3\x59\x3e\x79\xff\x3e\x9f\x0d\xa7\x65\x39\x1e\xc4\x43\x3c\xf6\x96\xa5\xe4\xe1\x2f\x6f\x8e\xea\xa9\xe5\xe2\xe2\xa2\xfa\x48\xb3\xaf\xac\xa6\xeb\xd9\x6e\x67\xa4\x33\xd9\x89\x72\x7a\xbe\x37\x5b\x9d\xb7\x19\xcb\xc0\xb0\x9a\x22\xcc\xfe\x6b\x3c\xfa\x7f\x7f\x3d\xd9\x1b\xfc\x63\x58\x4d\xff\x81\x1d\xfe\xc7\xe0\xc7\x82\x15\x3f\xfe\xc8\xe6\x9f\x97\xac\xef\xff\x55\xbe\xaf\xca\x21\x0e\xf0\x57\x35\x34\xa5\x42\x33\x06\xde\xe9\x34\xbd\x6d\x43\x73\x58\x59\x3d\x50\xde\xbd\x0e\x8f\x13\x36\xa9\xb7\x7f\x9c\x34\x13\xd2\xb3\xbd\x76\x67\xdc\x2c\x3a\x63\xa5\xb5\x12\xb6\x33\x69\x85\xc6\xc2\x38\xa0\x0b\xc4\x26\x0f\xeb\x0e\xd7\x5f\x7d\x5a\x50\x3d\xec\xc3\x74\x34\xef\x0f\x03\x26\x9f\x3f\xef\xee\x76\x9b\x4e\x4d\x6c\x05\xd5\x3f\x8a\x8b\x8b\x72\x7c\x72\x70\x39\x9b\x4f\xce\xe3\xec\x6f\x07\x4c\x11\x31\x48\x02\x93\x71\xf9\x3f\x27\x27\xb4\xfd\xfd\xf5\x1c\x46\x27\x29\x16\x7b\x17\x23\x6c\x0e\xf3\xf2\xf7\x79\x13\xd3\x96\x32\xa4\x90\x28\x58\x30\xc2\xe3\xb8\x48\x11\xe1\x53\xb5\x67\xa3\x8a\x9c\x7a\xfb\x6d\x4a\x1c\xfd\xf3\xe8\x5f\x7d\x63\xe7\x87\xff\x79\x79\xfe\x8e\x62\x81\xfe\xfb\xdf\xcd\xed\x1f\xf9\x7f\xd4\x93\xfb\x1f\xab\x12\x3e\x8c\x4e\xe6\x67\xb4\xf3\x86\x75\xde\x9e\xd1\xde\x13\x7a\xbd\xfb\x6a\x39\xfb\xfc\xc7\xc1\x45\xbd\xbd\xa6\xf7\x41\x4c\x58\x6c\x5f\x5f\x03\xac\xb6\xc7\x66\x17\xd5\x68\x4e\x36\xe3\xee\xaf\xfc\xb7\x45\xf3\xac\x5b\x5c\xda\x3d\x54\x9e\x1c\x14\x55\xf5\xae\x18\xfe\x73\x19\x03\xd8\x30\x54\x71\xd4\xc0\xd3\xee\xa6\xa1\x38\x59\xbd\x9b\x4e\x14\x9d\x2d\x27\xb1\xc1\x78\x32\x2e\x07\x69\x75\xfe\xac\x98\x75\x32\x10\x31\xee\x36\xa3\xb6\xe5\xc2\x63\x86\xd7\x5d\x54\x22\x52\x12\x26\x7f\xd8\xdb\x2b\xeb\xc5\xa6\xe5\xd4\x7a\x85\xab\x8b\x4d\xd4\x10\x9f\xeb\x7e\x2c\xb4\x85\x18\x64\xb7\xb6\x47\xe3\xa7\x7d\x40\xaf\xea\x7e\xfd\x59\x03\x9d\x7f\xcc\xba\x16\xe7\xcf\xdd\xb3\x1f\xc7\xb7\x59\xa3\x8d\xc7\xdd\x2f\x93\x9d\x29\xeb\x8e\x86\xe7\xf0\x8f\xd1\x18\xb9\xb3\xb5\x73\x9a\x7d\x6a\x75\xd7\xb1\xec\xba\xef\x53\xf6\xc3\x68\x51\xed\xb4\xf5\x9c\x15\xb3\x9d\xeb\x3e\xdd\xad\x6d\x1a\x52\x09\xc9\x33\x9e\xaa\x26\x85\xda\xd4\x1f\x5d\x8e\x8a\xbd\x1b\xaa\x21\xef\x83\xeb\xaa\x41\x80\x15\x75\xcc\xbc\x6e\x86\xba\x86\xd4\x8e\xd7\xd7\x66\xd8\x2b\xae\x41\x65\x14\x6e\x09\x95\xd5\x2a\xba\x4a\x39\x1a\xa4\xad\x10\x13\x3f\xec\xed\x55\x0b\xc4\xd5\x4d\xde\xab\x76\xd9\x0f\xd7\x76\x2e\x36\xfd\x73\x17\x7a\x2d\xe0\xfa\xdc\xd7\xf8\x6b\xa4\x0d\xf1\xcb\x4c\x98\xb4\x7e\x04\x77\xcd\x89\x91\x35\x10\x7e\x75\xdc\x88\x2e\x99\x4f\x77\x59\xa2\x4c\xcc\x41\xd6\xd2\xb5\xa4\xb2\x92\xd2\xa7\x8d\xe7\xf5\x75\xd4\x5c\xc3\xe6\xfa\x1c\x3b\xb7\x96\x71\x37\x8e\xb8\xae\x07\xbd\xc8\x58\xc5\x12\xbc\xe7\xbb\x9f\x77\x77\x9f\x80\x1d\xae\xa7\xd3\xfb\xb2\xc8\xe7\x44\xa7\x11\xcb\xd7\x93\xe2\xf4\x06\x4a\x4c\x82\xf9\x16\x22\x6c\xf7\x90\xae\xd6\x02\xb7\xd2\xc2\xad\xa4\xb0\xac\x61\xf7\xfb\x27\x70\xac\xd4\x39\x0b\x6c\x4b\x5e\x1a\x55\xfa\xe6\xdd\xc7\xc1\x2e\x4b\x5a\xe3\xff\x5d\x96\xd3\x8f\xf5\xd2\xcb\xce\x60\x76\x75\x5a\xab\xa4\xd7\xf3\xff\xa0\xd9\xc0\x5e\x5c\xea\x9e\xd9\xb0\xfb\x47\xfe\xe2\x45\xb9\xa0\xba\x16\x6b\x62\xf3\x1f\x07\x59\xda\x2f\xd0\xff\xfa\xd5\xed\x9f\x2e\x7f\xb4\x00\x8d\x3e\x72\x7a\xfa\x1c\x1b\xff\xc3\x0d\x52\x72\x51\xff\xf5\x08\xaf\xde\x38\x4d\xee\x15\x68\xcf\x5d\x5f\x0e\xbb\x8e\xba\x5a\x3e\x5f\x44\x59\xc3\xdf\x4b\x26\xdc\xce\xee\xea\x1e\xf6\x58\x66\x89\xbe\xee\xc3\x3b\xc9\x3b\xb4\x6e\xc9\x12\x95\x5f\x37\xd0\x6a\x66\x58\x1f\x75\xda\xf4\x11\x86\x55\x2b\x47\x88\x38\x94\xba\xee\x03\xe2\xc9\xd9\xcb\xe1\x64\x5a\xe6\xf1\x3e\x7e\x51\xdd\x00\xda\x85\x21\xeb\x5e\xc5\x2a\x8a\x4c\x56\xc0\xc1\x64\x1a\x35\xc4\x6c\x97\xad\x5a\x35\x89\x81\x37\x5e\xbc\xd8\x89\x37\x8b\x03\xf4\x41\xb7\x58\x64\xd1\x3a\x5f\xbf\xba\x5d\x36\x24\x62\xaa\x83\x07\x46\x54\xd7\x5d\xc7\xef\x16\xd2\x63\x3b\x3a\x59\xd8\x78\xc5\xe8\x08\xa9\xf2\x2e\x40\xda\x3c\x6d\x34\xd0\xdb\x43\x08\x4f\xa3\xa4\x9e\x4e\x27\x1f\x3a\xcf\x3f\xcf\xcb\x8b\xbf\x4c\xa6\x1f\x8a\xe9\x89\xec\xbc\xfe\xf3\xc7\xf2\x70\x74\x52\xf6\xdf\x74\x9f\xae\x70\xd0\xd3\x3e\x1f\x14\x55\x39\x3e\x29\xa6\xdd\x9a\xc6\xa7\x55\xf9\x3f\x26\x97\xef\xaa\xee\x87\x31\xac\x69\x75\x79\x3e\xee\xb6\xea\xe7\xb2\x98\x0e\xcf\xba\xd9\xce\x7f\xba\x3c\xed\x3c\xff\x85\xce\x52\xf8\xcf\xe9\xe8\xe4\x80\x5c\x94\x57\x26\x75\xdb\x97\x02\x7f\xd6\x7e\x8d\x2b\x92\x0e\x1b\xe7\xf4\x6e\x3f\xaa\xc9\x65\xb7\x9c\xbf\x9e\x17\xa7\xdd\xca\x7e\x2a\xab\x6e\xf6\xbf\x4c\xaa\x93\x72\xfa\xb7\x8b\x72\xbc\xf4\x72\x11\x12\x9d\xe7\xff\x9a\xf5\x92\x7f\x2a\xa6\x5d\x58\x1c\x96\xd5\xc5\x5f\xc7\xef\x27\x9d\x57\xff\x5d\x4c\xc7\xa3\xf1\xe9\xcf\xc9\x81\xb8\xdb\x19\x14\x48\x2b\xde\x27\x37\xe5\x15\x29\x58\xf4\x35\xaf\x97\x40\x7b\x70\x56\x0e\xff\xb9\xf4\xf6\xcf\xbf\x0f\xab\x22\x06\x78\xb9\x29\xed\x97\xe9\xa8\x58\xe8\xf8\x2f\xa3\xf3\x1e\x31\x52\xf9\xdd\xe7\x49\x17\xe7\x87\x93\xf3\x1e\xd4\xc6\xff\x1c\x4f\x3e\x24\x07\xb7\xbb\xac\x0f\xd5\x3e\x28\x93\x69\x1e\x67\x10\xd6\x9c\x4c\xba\x3a\xcd\xe7\xc5\x69\x7e\x5a\x8e\xcb\x69\x31\x9f\xc4\x69\xa4\xd7\xd7\x35\x68\x5c\x2b\xdd\x9f\x8f\xff\x73\xe7\x0f\x7f\x8c\x9e\xf4\x19\xcd\x26\xc5\x73\xde\x46\xf9\xe4\x72\x5e\x8d\xc6\x65\xd6\x7b\xca\x2f\x8a\xf9\x59\x2e\x06\xd9\xf0\xf7\xbd\x81\x70\x60\xfc\x20\x1b\x7e\xdc\x1b\x48\x0b\x52\x0d\xb2\xe9\xde\x40\x80\x1e\xbc\xfc\xd3\xf2\x1c\xe7\x1f\xf1\xcb\xb5\x6b\x90\x83\xec\x64\x6f\xf0\x46\x6a\x70\x4c\xa8\xc2\x80\xf0\x8c\x2e\x1c\xff\xe6\x12\x84\xcd\x15\x18\xcb\x1c\xc8\x74\x89\x29\x06\x9c\xc8\x05\xf0\xb0\x2f\x04\x28\xcd\xe2\x95\xd2\x98\x90\x4c\x70\xd0\x9a\x9c\xae\x78\xfc\xaf\xf0\x53\x21\x8b\x00\x4a\x32\xba\x50\x4e\xa6\x20\xe8\x5c\x80\x93\xcc\x80\x0c\xf1\x12\x53\x34\x08\x0b\x4e\x33\x05\x52\xc4\x4b\x7c\x2f\x40\x19\x26\x41\x84\x21\x28\xc5\x24\xd8\x90\x2b\x10\x81\x29\x70\x26\x37\x58\xb2\x06\xa1\xab\x1c\xbc\x04\x61\xae\x34\x28\x5b\xc4\x86\xe0\x5f\xc9\xf8\xb1\x08\x20\xdc\x81\xd4\x60\x05\x13\x0e\x5c\x60\x52\x83\xf7\x4c\x68\xd0\x82\x25\x58\xbc\x1d\xbc\xfc\xd3\x1f\xa2\x32\xed\x10\xde\x02\x3e\xef\x04\x6b\x11\x61\xad\x14\x38\xaa\x57\x86\x2a\x17\x26\x17\xa6\x6d\x5e\x2e\xb0\x05\x1c\xdf\xb3\xee\x7b\x46\xef\xf1\x72\x24\x3c\xa3\x66\x2a\x89\xa0\x12\x1e\x9c\x58\xc8\x47\x85\xbc\xdd\x20\x71\x78\xa6\xe4\x59\x6e\x8e\xa5\x3c\x14\xea\x58\xc9\x43\x7f\x2c\xfc\x91\x65\x92\x1f\x2b\x59\x48\x26\x1b\xd8\xca\x33\x77\x2c\xf5\x99\x3d\x56\xfa\xcc\x75\x53\x72\x89\x50\x77\xb6\xca\x65\x2e\xd7\x6e\xdb\x6c\x52\x8d\x4e\xb2\xce\xfd\x02\x20\x99\x08\x4d\xdf\x45\x8e\x14\x09\x32\xb4\x10\x22\x38\xf7\x00\x14\x61\x43\x97\xaa\x0f\xfa\x08\x5d\xc6\x2b\x82\xfc\x7e\xfb\x9a\x6a\x79\x68\x8b\x13\x24\x85\x67\x44\x6e\x96\x89\x00\x5e\xdd\x19\x7a\x4b\x34\x89\xa2\x71\x03\x24\x29\x3c\x08\x26\xc4\x30\x57\x10\x18\xcf\x1d\x53\x20\x72\xc7\xdc\x4c\x81\x60\x0e\xff\x0e\x29\x85\xb9\x9c\xde\xe4\xee\x67\x29\x99\x20\xe8\xe2\x87\xff\xca\x62\x11\x52\x0d\x73\x09\x1e\xc5\x43\x2e\x41\xe6\x26\x37\x33\xfa\x65\x26\x37\x43\x4a\x61\xc8\xbb\x92\x19\x66\x7e\x96\x1c\x02\x93\x8a\xa5\x4f\xff\xb5\x39\x8a\x55\x58\x95\xd0\xe0\x8e\x14\x89\x1e\x5f\xe5\x1c\x6c\x2e\xc0\x54\x02\x74\x2e\xc1\x0e\x39\x28\x7c\xc7\x38\x48\x24\x87\x1c\x9f\x05\x84\x2a\x97\x94\x41\x0f\x73\x0e\x86\xfe\x8b\x98\x13\x53\x31\x17\xe6\xb0\x48\x2c\x15\x96\x87\x29\x58\x78\xc0\x7e\x1f\x48\xc1\x24\x18\x26\x39\x68\x26\x11\xc7\x8e\xc9\xb3\x5c\xc5\xd2\x1c\xb1\xb7\x62\xb1\x4c\xcd\x04\xc8\x23\xa1\x99\x1d\xa6\x76\x20\x59\x0a\x16\xdb\x81\xcf\xf6\x28\x00\x0a\x63\x79\x10\x00\x65\x5a\x60\x1e\x34\x33\xcc\x01\x8a\x49\x73\x64\x80\xee\x0f\x0c\xbd\xc7\x74\xcc\x67\x00\xc5\xab\xaf\xb0\x26\x09\x06\x0b\x97\x2c\x76\x05\xab\x14\x54\x99\xc0\x46\x13\x3a\x20\x1c\x60\x8b\x85\xc1\xf6\x1a\xb0\xf8\x63\x41\x5d\x61\x9b\x39\xa3\x46\x63\x32\x28\x6c\x2e\x13\x60\x90\xed\x25\x88\x2a\x16\x63\x2a\xea\x0a\x02\x14\x61\x83\xad\xa6\x0a\xf1\x25\xa7\x8f\x42\x25\x29\x83\x1e\x62\x41\x75\x61\xf1\xeb\x80\x79\x2a\x49\xb0\xd5\x95\xa0\x74\x5b\x11\x55\x40\x18\xc6\x86\x23\x24\x3c\x36\x1c\x6b\xc3\xdf\x33\x6a\x1a\x36\x8c\x45\xcc\xe0\x5b\x84\x28\xb6\x09\xd1\x10\xaa\x1a\x2f\x09\x51\xc3\x58\x8a\x4a\xad\xc2\xd6\x45\x4c\xd6\xa8\x4e\x98\x66\x11\xcb\x8a\x35\xb4\x90\x88\xa5\xaa\x89\x47\xd2\x87\xd8\xb4\xba\x9b\x08\x4f\x6a\x1e\xa6\x5f\x21\xaa\x0f\x50\x19\x22\x24\x95\xc2\xa6\x21\x5e\x1a\x72\xfc\x57\xf6\x46\x11\x5d\xe8\x2a\x57\xd4\x38\x71\x24\x3d\x62\x4a\xd4\xf0\x73\x09\x41\x48\x91\x08\x07\x51\xa5\x04\x24\x5d\xcf\x14\x11\x20\x93\xf8\x3d\x36\x92\x28\x1b\x5b\xae\x12\x89\x81\xce\x63\x37\x1d\x2a\x6f\x44\x70\x9d\x43\x1c\x61\xc5\x24\xca\x25\x7e\x87\x8d\x56\x60\x8f\x10\xf7\x3e\x7d\x9f\xd8\x40\x13\xc1\x4b\xea\x5d\xfc\x3e\x52\xbe\x22\x20\x7a\x12\xe2\xd8\x9c\x9c\x9a\x13\x59\x89\x48\x4d\xa7\x42\x5c\x2a\x04\xf1\x41\x3d\xc0\x92\xcc\x91\xa6\xbe\x5f\x51\xfd\x0a\x5b\x5a\x21\xfb\xe1\xb7\xf1\xd7\x27\xe6\xc0\xe6\xe2\xa7\xb2\x4a\x65\x1f\x39\x10\x2c\x80\xa8\xb0\x62\x45\x90\xf7\x55\x6a\xd6\x30\x56\xa9\x13\xd0\x1c\xca\x17\x6a\x77\x4c\x97\x47\xc2\x82\x65\xfa\x4c\x12\x57\xa0\x5a\x30\x47\x52\xa0\x20\x8e\x64\xd4\x90\x2b\x59\x15\x2c\x7d\x49\xa4\x59\xc3\x98\x00\x5e\x83\x3f\xa1\x63\xc8\x23\x98\xe9\x7f\x2c\x20\xe2\x8b\x53\x21\xa6\x4a\x08\x46\xc9\xad\xef\x2a\xdb\xf2\xfc\x5d\x71\x72\x5a\x9e\xac\x94\xd9\x75\x62\x92\xdd\xc4\x1b\x7e\xc8\xd1\x94\x62\xd7\x0a\xec\x59\x4e\x32\x1d\xff\x1e\x08\x0d\x51\x7a\xd3\xa7\x1a\xea\x3b\xff\xaf\xec\x8d\x54\x75\x71\x12\x7c\x4e\xa2\x1a\xc5\xf7\x0d\x72\xfd\x80\xe4\xb8\x50\x2c\x7e\x8a\x02\x28\x15\xb2\xc9\x5e\xcb\x7e\xaf\x57\x4a\x78\x91\x27\x3e\xf0\x24\x6a\x89\x47\x49\x9e\x73\x62\x72\x95\xc4\x89\x4d\x22\xc8\x93\x78\x5a\x40\xd7\x15\xf1\xc6\x96\x39\x9f\x13\x73\xaa\xa4\x37\x50\x5f\xf8\x61\xea\x92\xcf\x23\x38\x2d\xfd\x4a\x54\x45\xb1\x8b\x72\xab\x8f\xb7\xfa\x78\x4d\x7d\xbc\x5a\x40\xdd\x30\x4a\xbf\x49\x44\xa9\x85\x44\x7a\x88\x23\x78\xc5\xe3\xf0\xdd\xd2\xd0\xdd\xdc\x59\x2e\x16\x55\x39\x9d\x5f\xab\x0e\x52\x6a\x3b\xbc\xc4\x0e\xeb\x33\x1c\x0c\x5f\x71\x10\x5b\xd1\xf6\x4c\x44\x9b\x4e\xa3\x0f\x15\x87\x23\x32\xca\x27\xbd\x95\x4f\xdf\xbd\x7c\x22\xe9\x14\x10\xa2\x8e\x35\x0c\x7c\x77\xf3\xe9\x06\x31\x21\x17\xc4\xc4\x1a\xe3\x75\x02\x28\xa1\xa0\xc6\x2c\x49\x0b\x99\xc7\xee\xa8\x34\x32\x96\xb9\x3c\x8b\x7c\xb8\x30\x7b\x70\x9b\x49\x3a\xe4\xc4\xa9\x71\x04\xee\x89\xdb\x25\x58\x94\x12\x32\x21\xdf\x27\xe3\xda\xb2\xc8\x5f\xe6\x80\x2c\x4b\x89\x29\x0f\x9c\x3d\xb8\x11\x58\x6a\x31\x95\x9e\xd2\x6c\x98\x45\x44\xa1\x00\x15\x69\xd2\x24\x0e\x04\x16\x09\xd9\x27\x82\x94\x11\x82\xf4\x8b\xfd\x91\x67\x42\x90\xe0\xe9\x53\x24\x42\x53\x12\x44\x54\x2d\xb6\x12\xac\x7d\x95\x1b\x70\x79\x80\x50\x4b\x3a\x9b\x27\x42\xaa\xe1\x76\x20\x1d\x89\x02\xcf\xa4\x63\x82\xd5\x4d\x5c\x1b\x26\xb7\xcc\xb3\x49\x30\x44\x91\x2e\x8a\x7f\x93\x8b\x42\x08\xb0\x86\xc5\x6b\x9c\xb9\x84\x80\xe8\x53\xaa\x12\x60\x75\xae\x80\xbb\x02\xac\x00\x5b\xcf\x6c\x82\x10\x39\x38\x79\x24\x1d\x68\xc1\x2c\xc8\x85\x64\x27\x31\xcb\x91\x54\x60\x35\xda\x7f\x92\xea\x90\x2c\x5e\xeb\xe9\x68\x65\x73\x51\xe5\xa8\x40\x94\xd8\xef\x16\x80\xd2\xd3\x06\xa6\x0e\x51\x1c\x89\x85\xb2\x8d\x07\xad\xaa\x1c\x65\xb0\xa2\x62\x15\x8b\xd7\xa6\x58\xcf\x44\x95\x93\x24\x5d\x6e\x17\x36\xcb\x82\x64\x1e\x4c\x58\xea\x13\x02\x85\x5a\xb8\xaa\x60\x14\xef\xca\x11\xd0\x04\x5b\x6c\x94\x56\x60\xfc\x95\x02\xe5\x7b\x09\x2c\x26\xe0\xd8\x53\x31\xb1\x0c\x04\x46\x85\xaa\x23\x0b\x3c\x20\xa6\x6d\x58\xf8\x9c\xda\x74\x84\x8d\x65\x32\xc0\x62\xe1\xd4\x9d\x4a\x01\x0f\xd8\x59\xb3\x8c\x48\x2c\x1d\x82\xae\x08\x58\x6e\xe1\x6b\x02\xe4\xd9\x8a\x36\x1b\x8f\x1d\xaa\x08\x31\x7e\x19\x12\xa8\x1b\x7d\x8e\xc5\x2a\xc0\x81\x27\x58\xbb\xd4\x2e\x84\x66\x25\x41\xa1\x4c\x56\xcb\x9d\xca\x89\xfc\xf0\x4b\x94\x1f\x2b\xaa\x88\x04\x28\x03\x42\xce\xe5\x62\x09\xa8\x48\x06\xc7\x44\x1d\x7d\xc2\xe9\x90\xf7\xdb\x37\xc2\xe3\xe0\xd5\xec\xa3\xb2\x34\x24\xf9\x04\x02\x9c\x4c\x47\xcf\xda\xb7\xf4\x3e\xe6\xbd\xdb\xdc\xf0\x82\x8d\xd8\xe5\xb6\xa5\x11\xee\x32\xd7\x49\x10\x92\xc5\x6b\x4d\x45\x68\xf2\x28\xc9\x1c\xe8\x10\x2f\x71\x9e\xdb\x82\xd0\x78\xb1\x08\x23\x2f\xd3\xb5\x5e\x64\x50\x2a\x07\xed\xb7\x8c\xb4\x65\xa4\xe7\xcf\x48\xab\x46\x63\xb7\xb0\x92\xdc\xf8\x48\x2c\x55\xd8\xb7\x0a\xfa\xcc\xdb\x1f\x85\xb5\xb0\x60\x8a\x2c\x51\x03\xfa\x50\x4a\xf0\x8b\x20\x11\x1e\x19\xda\x14\x06\x8c\x62\x74\x89\x40\x21\x3a\xda\x57\x60\x71\xf0\x65\x7d\x0d\x2a\xb4\xda\x3d\x1a\xc9\x3c\xe0\x28\x4a\xe6\xe0\x71\xc4\xe4\xd5\x96\x89\xb7\x4c\xbc\x61\x26\xde\x14\x73\xc8\x9b\xcd\x69\x4f\xe3\x34\xcd\xd0\xa0\xc6\x4e\xec\x0b\x90\x38\x46\x92\xbe\x06\x97\x04\x34\xf4\xd5\xa1\x42\x4e\x58\x4a\x56\x1a\x9c\x67\x68\x3b\x06\xe0\x34\xb9\xa1\x97\x8b\x68\xaa\x59\x5e\x43\x25\x77\x93\x4d\xac\xa2\x2a\xe4\x76\xe9\x88\xf3\x68\x71\xde\x81\x74\x0b\x2b\xcc\x71\xed\x39\xb0\x70\xa4\x04\xe6\x71\x20\xc3\xe2\x22\x74\xbd\x7e\xdf\x6b\x66\xf4\x92\xd9\x44\x33\x03\xd5\xe1\x2b\x0f\x32\xe4\xbe\x5b\x3f\x6f\x97\xc7\x8f\x50\x2e\x59\x64\x9b\x00\x4e\x30\xcc\xb6\xdf\xba\x19\xe0\x23\x25\x1c\xc5\x3c\xc2\xc7\x57\xd2\xb6\xc5\x89\x45\xb7\x05\xaa\x98\x6a\x65\xfd\x5a\xfb\x5e\x0b\xbd\x5e\xaf\xf2\x1c\xda\xc8\x82\x37\x52\x9b\x92\x45\x9c\xa9\x50\x4d\x3b\x68\x50\x7b\x2c\x74\x27\x41\x90\x4c\xb4\x8c\x5f\xd9\xfd\x85\xec\xa9\x94\x3b\x28\xae\x9b\xd7\xae\x93\xb3\x4f\x30\xc9\xd9\x47\x83\x74\xc9\xd9\xe7\xae\x73\x86\x2b\x87\xb5\x49\x37\x71\x72\x9c\x31\x60\x68\xea\xc9\x20\x11\xda\x42\xb1\x5a\x4e\x1b\x90\x8e\xf1\x23\x83\x82\x80\x72\xed\x37\x69\x88\x38\xc1\x14\x3f\x24\x2a\x6f\xbf\x61\x12\x07\x7d\x1a\xb4\x7a\x7b\x9e\x0b\x62\x47\x08\xba\xeb\x9b\xe1\x2d\xe8\x70\x88\x9f\xf7\xde\xe2\x10\x56\xfb\x23\xe1\x80\x3b\x54\x29\x7d\x87\x0c\x67\x19\xaf\x02\x38\x8d\xac\x14\x74\xc7\x2b\x43\x62\x5e\xe4\x35\xed\x37\xe5\x4d\xf2\xa8\x50\x79\x23\x2c\x68\x8b\x9a\xde\x21\x6d\x69\x1c\x9f\xd7\xb6\x3a\x66\xbf\xb2\xe0\x43\x2f\x41\x30\x91\x2b\xc6\xa3\x25\x65\x41\x9a\x82\xbc\xa4\xe8\x92\x2c\x07\x54\x13\x78\xd9\xef\xa6\xd4\x06\x15\x7e\x72\x13\x3b\x25\x27\xbd\xcd\x30\x93\xdd\xa7\x71\x49\xe2\x7a\xc5\xa3\x55\xc3\x84\x6c\x39\xc5\xbe\x3d\x47\x49\xbe\x2f\x38\x13\xbc\x36\x07\x3d\x65\x4c\x6f\xea\x96\xaf\x8f\xd1\xdb\x3d\x41\x04\x4d\x14\x71\xd7\x63\x74\x91\x27\x46\xbf\xca\x6d\x8f\xd1\xd1\x98\x58\x66\xf4\xd8\x2a\x2c\x65\x33\x8c\xae\x96\x19\x5d\x01\x97\x77\x65\xf4\x9b\xc9\x79\x6d\xa4\xe4\x44\x6f\xf6\x1e\x44\x69\xe0\xae\x34\x69\x60\x99\x24\xbb\xde\xa4\xdf\x3a\x31\x5a\x50\x1a\x87\x3a\x4e\x57\xb9\xc9\x17\x9d\xcf\xa2\x69\xa0\x50\xf4\xd0\xc5\x82\xf3\x39\x5e\xae\xb3\x0f\x36\x22\xf5\x98\xf0\x1d\x78\x51\xa7\x6d\x07\x5c\x22\x02\xf0\xed\x79\xae\xc1\xd1\xda\x0e\x91\x4a\x9c\xe8\x8c\xe3\x85\x5c\x56\xd8\x4c\x87\x0d\x76\x47\x68\xc2\xb9\x15\xb9\x98\xac\x0c\x68\x1c\xf9\xe8\x65\x22\xe8\xf8\x19\x3f\xd8\x63\xb6\x61\x2e\x15\x99\x4b\x08\x08\x9b\xf5\x98\x8d\x86\x2b\x8e\x66\x0f\x45\x38\x16\xe6\x50\x74\x3d\x4c\x39\x93\x67\xe2\xca\x1e\x36\xce\x85\x22\xbd\xec\x65\xba\x83\x17\xe4\xcd\xa2\xe4\x0b\x53\xfd\xa6\xa4\x90\x64\x06\x84\x49\x4e\x8f\xd4\x30\x26\xf7\x6b\x17\x48\x72\x2b\x09\xe4\xa5\x62\xde\xbe\x91\x8a\xc9\xae\x6d\x21\x98\xe8\x02\x9b\xec\xb5\x33\x79\x2c\x5c\x17\x2f\xf1\xad\xbe\xf2\x67\xb2\x6b\x46\x60\x51\x2b\xa9\xb1\x71\x86\xdf\x94\x07\x77\x70\x89\x1c\x39\x68\xf3\x08\x1e\xdc\x82\x49\x43\xe4\xa8\x41\xac\x20\xc8\x63\x4c\x35\x0b\x6f\x1f\x87\x22\x13\xe2\x95\xde\x17\x96\x09\x9b\x90\xa2\x34\x61\x3e\xbd\x49\x84\xa6\x34\xa9\x12\xbd\x2f\x34\x13\xba\xa6\x11\x49\x39\xd3\x9b\x44\x23\x7a\x73\x14\x29\x71\xc0\xdc\xb4\x8c\xc7\x36\xed\xb7\x2d\x8b\x86\x3d\x88\xb7\xe7\x39\x08\x66\x40\xfa\x96\x2c\xf3\x05\xb2\x74\x80\x76\xa2\xf2\x6f\xcf\x15\x58\x1c\x0d\x48\x73\x96\xbb\x8e\xec\x4b\xf4\x08\xfe\x4c\x82\xb8\xca\x03\x48\x42\xc3\x8a\x74\x0d\xfa\x4a\xc8\x33\x6a\x5d\x3f\x99\x49\xf0\x4b\x44\xba\xb8\x97\x63\x43\xa3\xa2\xfd\x2e\x64\x16\x71\x16\x21\x83\x52\x44\xf1\x0e\xca\xc4\x12\xca\x22\x72\x37\x42\x50\xad\x13\xba\x20\xd0\x2c\xb8\xca\x1f\x09\x83\xa6\x89\x54\x20\x4c\x95\xdb\xdc\x76\x47\xa9\x4c\x78\x30\xaa\xce\x62\x49\xd8\x29\x30\xb2\x93\x27\x95\xbb\x41\xea\x5a\x07\x82\x6f\xa4\x47\x5d\x28\x24\x4d\xdb\x18\x50\xc8\xbd\x38\xdc\x71\x38\xac\x11\xbe\xa7\x3c\x05\x43\x15\x6b\x70\x54\x85\x97\x23\x69\x41\x3b\x26\x38\x4d\x58\xf5\x28\x45\x32\xb9\x6c\xf2\xf7\xf6\x02\x6d\x46\x9a\xb5\x9b\x51\xb8\x4d\xa2\x4c\xa9\xcd\x1a\xed\x12\x6c\xcf\x6d\x3f\x17\x57\xb9\x90\x1d\x21\x2f\x19\xbf\x12\x5d\x59\x5e\x7f\xb5\x95\x62\x7d\x29\xf6\x86\xfc\x50\x3c\x2c\x11\x15\x78\x02\x61\xff\x75\xf4\x07\x88\x06\xbe\x07\xb4\xe2\x70\x2c\xef\x1b\xf3\x9e\xd6\x9c\xf7\xdb\xb7\x8d\xc5\x00\xcb\xbb\x13\x16\x37\xa8\x6d\x89\xef\x4e\xc4\x67\x80\x5b\xc9\x9d\xc7\x61\x94\xf5\x42\x04\x9b\x1d\x08\x03\x56\x06\xef\x45\x60\x1c\xac\x0e\xd2\x5a\x65\x4c\x26\x2c\x38\xc1\x03\x0f\x82\x71\xe0\x82\x4b\x29\x82\x0a\x36\x13\x0e\xbc\x37\xfd\x77\x07\x22\x00\x37\x01\x73\xf7\x13\x24\x07\xa1\xb9\x10\x5e\xf4\xca\x96\x1c\x1c\xf7\x56\x2b\x45\xed\x90\x46\x0a\x19\xb2\x23\xa5\xc1\x04\x6f\xb5\x66\xd2\x81\xd4\xd2\x48\x69\xb2\x03\x65\xb0\x0c\xe7\x34\x0a\x5b\x90\x9a\x0b\x15\x5c\x86\x6f\x85\xd3\x4a\x1b\x26\x03\x68\x1d\x8c\x72\x2a\xc3\x12\x94\x93\xc2\xe2\x18\x03\xb4\x34\x3a\x68\x95\x1d\x28\x05\xc1\xd8\x10\x9c\x63\x4a\x80\xe6\x42\x1b\xa1\x33\x25\x21\x70\x63\x9d\xc0\x97\x21\x04\x1b\xbc\xce\x94\xc0\x61\x87\x92\xd9\x91\x06\x2e\xa5\x0a\x4a\xaa\x94\xee\x74\x90\xd9\x81\x04\xef\x34\x0f\x9c\x93\xd3\x1f\x97\x46\xdb\x10\x32\x01\x2e\x04\x2e\xbd\xa6\xcc\x5a\x39\xe3\x8c\xca\x04\x48\x2e\xb8\x55\xca\x50\x73\x8c\x0d\x42\xda\xec\x80\x83\xe5\x8a\x07\x2f\x6d\x6c\xbc\xb3\x52\x87\x90\x71\x30\x4e\x3a\xe7\x7c\x08\xd4\x53\x23\x94\x70\x58\xb4\x90\x88\x33\xa4\x07\x04\x0b\x61\xed\x68\x15\x2a\xdf\x66\x6f\xb0\x75\xde\x70\x67\x1d\x16\x21\x82\x73\xd2\x53\xa3\xad\xe3\x96\x07\x4b\x30\x34\x9e\x73\xe5\x6c\x26\x11\xf6\x3c\x38\x6a\x05\xd7\x5a\x68\xa9\x32\x04\x8a\xb7\xc6\x38\x6a\x9a\x30\x36\x38\x97\x1d\x28\x10\xca\x48\xa1\x68\xc9\xc3\x79\x27\x8d\x92\x99\x02\xa3\xa5\x51\x46\x63\xef\x38\x0f\x21\x98\x90\xe1\x43\x76\x84\x60\xb4\xc1\x29\x4d\x8f\x07\x4a\x82\x08\x21\x88\x20\xf0\xfb\x10\x82\xf7\xc6\x23\x02\x4c\xf0\x52\x3b\x4f\xa5\x3a\x25\x25\xa7\xb7\x5e\x78\xee\x25\xe5\xd5\x5c\x69\x8d\x5d\x50\x0a\xb8\x72\x41\x58\x4d\xad\x55\xca\x3a\xe3\x32\x7c\xab\xad\x33\x81\x3c\xff\x8c\x33\xda\x58\x47\x45\x68\xa1\x4c\x03\x05\xed\xbc\xcb\x8e\x84\x87\x60\x94\x77\xd8\x0b\xb0\x5a\x72\x2f\x82\xc9\x0e\x84\x07\xa7\x82\x96\xca\x32\x09\xd2\x48\xa5\xb5\xb2\x99\xf0\xa0\x64\xf0\x5a\x60\xe6\x44\xd2\xba\xa6\xfe\xce\x9b\x03\xe1\x40\x6b\x6e\xbd\x5f\xcc\xc8\x95\x30\x46\x79\x2a\x54\x38\x6b\x83\x44\xa6\xf2\xc2\xfa\x80\xb4\x0c\x16\xbf\x42\x32\x39\x5a\x8d\xb5\x4d\x8d\xc7\x35\x9a\x91\x01\x24\x79\x39\x21\xb5\xa3\x96\x57\x20\x25\xa3\x4b\x3d\x17\x69\x2d\x9a\x3e\x20\x5c\xcc\xbc\xbf\x90\x83\x69\xa6\xf4\x21\xb1\xc7\xe2\xc7\x28\xf7\x15\x0e\xe6\x4d\xd2\x0c\x82\xdf\x59\x31\x04\xf0\x66\x6d\xcd\x80\x99\x97\x37\x53\xd6\xdb\x99\x57\x99\xad\x64\xef\x19\x40\xcc\x1b\xd0\xfd\xed\x91\xca\x83\x0c\xc3\x68\xfc\xd1\xee\x54\xcd\x34\x78\x91\x5b\xb4\xa1\x0c\xb8\x59\xae\x41\x48\x30\x2e\xd7\xe0\x35\xe3\xc3\x1c\x94\xc8\x41\xba\x1c\x59\x33\x17\x39\x68\x95\x2b\xd0\x01\xb4\xa5\xf5\x33\xa6\x40\xc9\x3c\x80\xf6\x4c\xe7\x02\x2b\xa8\x72\x09\xc2\x83\xf4\xc3\x1c\x6c\xc0\xde\xd8\x5c\xc5\x55\x0b\xaf\x73\x85\x66\x9a\xe0\xb4\xc6\x67\x91\x5e\x74\xc8\x41\x61\x2b\x50\x3e\x72\xf2\xb5\xb4\xfb\x06\x0c\xdd\x85\x5a\x17\x1b\xa6\x74\x11\xc0\x28\x16\xea\x35\x5e\xce\x14\x68\x93\x83\x1b\x4a\x70\x21\x4f\x1f\x3b\x49\x3d\xa0\xbd\xb6\x39\x5a\x7a\x5d\x63\xb5\x05\xca\xdb\xc1\x5d\x14\xe7\x22\x6d\xb6\x70\x16\x01\xdb\x2d\x0a\x0d\x86\xe9\xb4\x28\xcd\x73\x0d\x06\xff\xef\xb7\x6f\x79\x5c\x54\xc6\xbc\x6f\xcf\x79\xee\x0a\x72\xac\xaf\x57\xb1\xf3\xf4\xb4\xdf\xbe\x8d\xab\xd5\xa0\xd0\xe6\xb9\x8b\x0e\xbe\xa1\xa9\x02\xbc\x60\xc2\x0c\x81\xa3\x89\x63\x11\xa9\xe0\x11\x52\x4e\xe5\xb4\x60\x9e\x93\xdb\x67\x34\xc1\x00\x47\x04\x33\x90\x48\x98\xc0\xc9\x8b\x90\x10\x2a\x6a\x84\x22\x6a\x05\xf6\x32\xe0\xa0\xc0\x89\xc2\x33\xdf\xac\x03\x49\x44\xaa\xc7\xa1\x9d\x8c\x97\x3a\x41\x98\x1c\x2c\xaa\x50\x14\x2c\x86\x7c\x5b\x4d\xf2\x41\x44\xb9\x4d\x6b\x66\x72\x16\xd7\x6d\x9d\xcf\x01\x89\xcd\x16\x0a\x04\x12\x5a\x6d\x9a\xe5\x0a\xb8\xcf\xc1\x2b\x22\x64\x6c\x68\xee\x40\x3b\x08\x3a\xc7\xce\xb0\xee\x8e\x5e\xc0\x71\xcb\x1d\x40\xa8\x56\x80\xb0\xb6\xb4\x7e\xdf\x1b\xa0\x54\x31\x5d\x17\x08\x3d\x58\x57\x3e\x5d\x8f\x19\x49\xbc\x46\x7b\xd3\xfb\x03\x34\x5a\x05\x25\x21\x83\x97\x28\x47\x14\x18\xda\x9b\xeb\x90\x35\x15\x48\x72\xbc\xb6\x08\xf3\x5c\x02\xf7\x4c\xe4\xa0\x6c\x74\x17\x44\x60\x7b\x99\x23\xb0\x90\x7b\x2b\x30\x0a\x33\xbb\x21\x48\x99\x83\x45\xa6\xe3\x26\x17\x92\x69\xf2\x83\x52\x40\x1e\x11\x02\x02\x28\x83\x8c\xea\x72\x09\x9a\xbc\xc5\x65\x0e\xce\x61\x39\xa8\x50\x89\x4f\x73\x1f\x27\xa8\x7b\xb0\x16\x8a\xc9\x99\xca\x91\xcb\x54\x74\x92\x92\x05\x78\x0f\xbe\x16\x68\xe0\x0d\x68\xf2\x4f\x76\xf1\x92\x16\xb2\x88\xc0\x9c\x18\xe6\xb4\xcd\x3d\xd7\xa0\x1c\xb9\x75\x78\x24\x30\xda\xfd\x6e\x0a\x24\x08\x46\x97\x86\x98\x3c\x53\xcc\x30\xd3\x88\x03\xee\xc1\xab\x33\x5e\xe0\xb0\x95\xf9\xae\xa0\xe0\x21\x07\x2b\x87\x24\x6e\x50\xd0\x45\xf7\x0f\xcb\x2c\xca\x31\x03\xce\x74\xc5\x44\x8b\x8e\x45\xc2\xb9\x7e\x7f\xf2\x82\x80\xa6\xf0\x13\x9b\xd8\xed\x2e\x99\x0c\x87\xba\x3f\x0f\x77\xa8\x64\xf7\x05\xdb\xe4\x44\x01\x6d\xb0\x7c\x92\x0a\x55\x53\x61\x38\xec\xae\x4d\x6a\xe6\x56\xd6\xd7\x83\x2f\x45\xfb\xb8\x4e\xf9\xe1\xc0\xd1\x15\x8e\xb9\xd4\x7e\x97\xbb\xfd\xf8\x94\xc6\x75\xc2\x91\x22\x36\x45\x24\x1e\x94\xc0\x86\x99\xfd\x9a\x94\x48\xf1\x6e\x4c\x45\xa0\x35\xec\x90\xa8\x94\x2b\x68\x6a\x3f\x4e\xf0\xd7\xb3\x86\x1a\x82\x62\x7c\xbf\xdd\xae\x6e\x68\x2e\x43\x1f\x2b\xd1\xdf\xdd\x7e\x28\xc3\xc2\xa6\x76\xca\xd7\xf9\xb2\x53\xd3\xdb\x37\x32\x30\x25\x0e\x1d\x65\x52\x85\x30\x68\xec\xc4\x6b\x32\x53\x24\xe3\x67\x7c\x53\xca\xe5\x6b\xec\xe4\xda\xfb\x82\x6e\xd0\xa9\x1d\x4a\x23\xbb\x11\x2d\x12\x01\xf6\x2c\x07\x29\x97\xbc\xcf\x24\x67\x42\x83\x6d\xa9\x0e\xa5\xb6\xce\x3d\x68\x59\x89\x1c\x47\x11\xfb\x0d\xd1\x26\x32\xbd\x47\xcb\xe5\x5a\x2d\xff\x02\x8e\x43\xd9\xe6\x76\x12\x7c\x6b\x84\xb8\xd6\x76\xe5\xf5\xc9\x10\x81\x9e\x9b\x18\x77\x46\xd3\xff\x7a\x0c\x22\x75\x6e\xc1\x86\x25\x3a\xbb\xb7\x38\x5c\x73\xd3\xf1\x4d\x36\xd5\xa2\x4f\xe9\x75\x74\x72\xe7\xad\x83\x37\x52\x89\xa5\x50\x35\x46\xae\xa2\x12\x13\x87\x7b\x02\x4d\x2d\xba\xc4\xf7\x68\xd7\x08\xf2\x6e\xa0\x4d\x50\x0d\xb0\x0d\x53\xea\x4c\xaa\x85\xf7\x8a\xe6\x5a\xcc\x55\x4e\x1f\x74\x0b\x62\x9d\xea\xd7\xb4\x30\x56\x69\x98\x0e\x08\xeb\x59\x3d\xc1\x09\x86\xee\x0e\x66\xcb\x57\x0a\xa2\x35\x9d\x89\x37\x25\xba\x6b\xc7\x61\x1c\x84\xe4\x06\x87\x95\xb7\x48\xea\xf5\x9d\x3a\x9f\xb7\x94\xbe\xad\x1f\xf7\x92\xd0\xcf\x9b\xb0\xd6\xd8\x61\xf2\x98\xa2\xf8\x6e\x8d\xda\x8c\x8c\xbd\xa5\x92\x6b\xe5\x6b\xcf\x26\xdf\xdf\x94\x7b\xa9\x0c\x60\x24\xd2\xb5\x89\x8b\x40\x1c\x68\xa0\xe6\xe3\xab\x42\xd0\xa6\xc6\x1a\xc0\x12\xb4\x61\x12\x94\x25\x1f\x59\x03\x3a\x54\x01\xc7\xc1\x01\x54\x58\x91\x95\x36\xc1\x2d\x0d\x27\x52\x74\xc1\x4d\x0c\xd8\x38\x0b\x87\xc2\x82\x96\x47\x42\x83\xc0\xb1\xa6\x97\x1d\xab\x41\xe0\x10\x94\x99\x43\xdb\x79\xa7\x99\x3b\xee\x9b\x1b\x4c\x1e\x2a\xbe\x18\xc2\x4a\xf4\x8c\x0f\x16\xc8\x1d\x85\x1f\xda\x63\xa1\xce\x1c\xf4\x0d\x98\x5c\x1e\xda\x63\x77\x66\x11\x1c\x12\x09\x5e\x81\xe9\xba\x0c\x83\x17\xa0\xc5\xa1\xe2\x77\x1d\xc9\xdd\x21\xb4\x4a\x0c\x2d\x62\x8e\x65\x78\x48\x1b\xcf\x3c\x18\x51\x38\xda\x7d\x9d\xec\x91\x9c\x26\x98\xe4\x23\x81\x59\xa1\xfc\x5f\xd8\x0f\xc6\x52\x5f\xee\xee\xc1\xb8\x96\x7d\xf4\x65\x23\x1e\x70\x62\x9b\x87\xa2\x49\x82\x53\xfb\x2a\xce\x08\x5b\xdb\x57\x9b\x47\x22\xa0\x04\x7c\x2c\xc6\x30\xb0\xfe\xc2\xf0\xdd\x46\x50\xcf\x64\xc3\xc5\x66\x3c\x15\x9f\x4c\x2e\xbd\xb1\x4c\x88\x96\x64\x9c\xbc\xeb\xc2\xfd\x1d\x76\x8a\x25\x58\x1b\xd0\xd7\xd9\x6c\x4f\x40\x7c\x8f\xd9\xe1\xaf\x98\x18\xd7\xdf\xac\x1b\xa5\xeb\x7e\x4f\xca\x93\x53\x92\x7a\x34\xbc\xdd\x28\xe6\xd7\x47\xe8\x63\x6f\xaf\x5c\x61\xa6\x50\x64\xe4\x4d\x98\x2a\x14\xed\x55\x28\x70\x88\x72\x47\xde\xe7\x8d\x95\xac\xc0\x3b\xa4\x1a\x21\x40\xd0\x6a\x55\x60\xb2\x59\x8f\x43\xeb\x95\xcc\x6d\xc9\xba\x1e\x91\x20\xf4\x91\x65\xd2\xac\x63\x78\x74\x42\x77\xe6\xf2\xbe\xba\x1c\xcd\x67\x41\x6b\x05\x78\x89\x29\x86\x62\x97\xa2\x69\x03\x4a\x77\x37\x49\xd1\x9e\x3f\x0d\x22\xe4\xc2\x00\xf2\x89\xd5\x8c\x2e\xa9\xc7\x2d\x34\xde\x92\x05\x6a\x18\x6a\x44\xc0\x31\x9f\xf7\xb9\x50\xe0\x45\x01\xd6\xb6\xca\x0d\x94\xcf\x41\x6a\x64\x2c\xbd\x7e\x88\xd3\x7b\xd8\x51\x5f\x0e\x4f\x68\x7c\xc9\x62\x71\x73\xfc\x43\xcc\xaf\xe7\x8f\xb2\xaf\xdb\x98\x23\xfd\x17\xe3\x57\x81\x3a\xba\x0b\x50\xce\x02\x68\x9a\xf8\x70\x8c\x2e\x8d\x12\x45\x89\x68\x0b\x05\x56\x31\x55\xef\x90\x15\x39\x48\x9b\x83\xb1\x8f\x45\x78\x8f\x67\x4e\x3e\x80\x02\x0b\x41\xd0\xad\x4d\x0c\xce\x80\xbb\x1c\xd4\x32\xd4\x5a\x34\x6c\x0d\xd3\xdb\x0c\xd3\xad\x16\xba\x46\xa4\x3d\x5a\x70\x85\x86\x38\x0f\x89\x20\xf6\x55\xdc\x72\x6d\xc3\x96\xe7\x9f\x96\xe7\xb7\xb6\xff\xb3\xb4\x6e\x94\xf8\x3a\x44\xc1\x93\x8e\x3d\xe8\x90\x96\x8d\x78\xb4\x80\x11\x4c\x3a\xf0\x6a\x5f\x68\xd0\x74\x6c\x44\xcd\x42\xe4\x7c\x13\x8a\xb4\xb1\x43\xb6\x92\x47\x80\x32\xb9\x06\x2f\x70\xc0\x2d\xcc\xbe\xe0\xe4\xcc\x46\xd7\x04\x4e\xf2\xfa\xd4\xa0\x8f\x15\x08\xe4\x5a\x72\xb8\x56\x9d\x10\x04\x8e\xf1\x63\x8d\x36\xce\xf2\xc7\x0e\xbf\xa5\x92\xaf\x34\xed\x94\x5f\x6c\x00\x92\x80\x4d\x8d\xeb\x37\x3a\x4f\xce\x4c\x41\xb5\x54\x98\x03\xb2\x96\xb9\x12\xfd\xc3\x33\x04\x13\x67\xd8\xf1\x1e\x11\x88\x63\xf2\x52\xee\xf8\x1f\x75\x20\xf4\xf6\x8d\x21\xa7\x2a\x4f\xe1\x00\x2c\xad\x2a\xdb\x7a\x55\x99\x26\xb4\x75\xae\xb0\x31\x52\xa7\x6b\x2a\x16\xac\xc9\x0d\x78\x13\xc1\x55\x78\x70\x9a\xd1\x25\xf9\x1d\x38\x72\xbe\xa2\xce\x16\xab\x3f\xc7\x1e\x1b\xb6\xba\x4e\xa6\x36\xbb\xc7\x5c\x69\x90\x7e\x9f\x50\x24\x6b\x81\xca\x29\x8c\x80\x67\x4a\x1e\x0a\xe4\x84\xa5\xe4\xfa\xbb\x47\x1c\x79\x3d\xa7\xa6\x2d\x47\xf0\x7e\x38\x1b\x15\x82\x43\xa0\xd3\x66\x42\x13\x11\x4d\xd8\x5c\x80\x23\x89\xa8\xe3\x85\xb7\x0b\x56\xe0\x91\x8c\x7c\x88\x97\x34\x7c\xa0\x80\xa4\xfa\xfe\xb4\x74\x88\x34\xfe\x00\xea\xde\xf7\xe0\xb1\x41\x35\x8f\x79\x46\x51\x9b\x3c\xca\x7d\x5f\x87\xe6\x41\xd1\xe0\x28\x3e\xa9\x5e\x9a\xf5\x91\x12\x0c\xb3\x43\x9e\xd3\x29\x39\x39\x68\x89\x57\xab\x0a\xf2\x53\x8e\xde\xca\x09\x3c\xe4\x0b\x29\xbe\x29\x11\xb3\xd1\x51\xb0\x78\x9c\xd0\x61\x37\x05\xd7\xf4\xb4\x1d\x42\xa8\x0a\x41\x92\x03\xb1\x03\x6a\x60\x5d\xab\xe0\xaf\x5d\xaf\x50\xc7\x40\x5d\x49\xf0\xf2\x90\x3a\xbc\xa9\xf3\x74\xc8\xc2\xc0\x41\x10\xf2\xa8\x6c\xa3\x76\x19\x34\xac\xd6\x5f\x1a\xbc\x9b\xc1\xf7\x64\x42\x75\xfd\x95\xf3\x47\xa0\xa4\x1b\x44\xeb\xe2\x34\xf7\x4d\xd2\x87\x36\xaa\x1a\xf7\x3c\xa4\xcf\xda\x84\x78\x0f\xc3\xf4\x4e\xd1\xdf\xfb\xe1\x06\xe8\x34\xc1\xeb\x7c\x81\x95\x64\xfa\xb0\xeb\xb6\x27\x99\x3d\xee\xaf\x06\x30\x79\xd8\x3f\x49\x2a\x97\xc7\x5d\xd3\x1e\x8b\x78\xfb\x46\x33\xc5\x8f\xed\xa1\x92\xc7\xea\x2e\x5e\xb3\x62\x09\x42\x6d\xdb\x3c\x51\x88\x4e\x11\x8f\x10\x89\x2a\x57\xbd\xb8\x48\x94\xfe\xf6\x9c\xe7\x1a\x2c\x0e\x10\x62\x30\x67\xd2\x02\x8e\xf0\x4f\xe1\xef\xd2\x5b\x7c\x4f\x9f\x04\x0a\x70\x72\x07\x3b\xec\x06\x07\x24\x72\xb8\x47\x86\x74\x55\x6e\x40\xe3\x68\x26\xd7\xb9\x5e\xde\x48\x6e\xb0\x66\x29\x21\x20\x79\xa8\xca\x82\x0b\x39\x5e\x8e\x44\x0c\x61\x4e\xb1\xf3\x9d\xa1\x73\xe6\x0e\x85\xa9\x3c\x68\x93\xe3\xe5\x88\x78\xea\x18\x07\xb1\x14\xab\xd9\x0b\xba\x74\x1d\xf2\xdb\x46\xdc\x69\x27\xc7\x8d\x7b\x61\x02\xed\xdb\xe9\x80\x9e\x75\x41\x5f\x67\xa0\xc0\x2d\x96\xf1\xa2\x0f\xfc\xf4\xb4\xdf\x07\x7e\x42\xc9\x83\xbc\x3c\x6f\x68\xb3\x03\x45\x81\x94\x9c\xab\x9e\x06\x05\x4b\x35\x3c\xc8\x07\xf4\x06\x8f\x30\x1a\xe6\x4a\xe4\xac\x43\x7d\x6c\x0f\x51\x22\x2e\x0e\xcb\x19\x48\x9f\xcb\x7b\x70\xb2\x90\xa0\xc8\xe4\x43\x99\xab\x6b\xa1\x5b\x57\x79\x8f\x1e\xa9\xeb\x7b\x74\x93\xc3\xd5\x5d\xab\xd1\x2b\x05\xe2\x8d\x40\xdc\x8c\xa0\x23\x11\xe2\x1b\xce\x10\x3d\xce\x48\x12\xc6\xbf\x7d\x63\x99\x74\xc7\x48\x6c\x95\xcd\x2d\xf0\xa5\x28\x4b\x1c\xa9\x4e\x04\x50\x86\x79\x34\x33\xa4\x7b\x7b\x8e\x16\x3c\xcd\xe5\x98\xca\x82\x54\x39\x5e\x48\xa2\x18\xd0\xcb\xdf\x23\x51\x22\x45\xae\xed\x22\x7b\x93\xcf\x61\xbd\xc0\xac\x3d\xa3\x4b\xa3\x7b\x9d\xbf\x17\xdc\x1a\xb2\x22\xc7\x3e\xdb\x9a\x07\x71\xfd\xf8\xeb\x00\xe2\x3a\x36\xdb\xfd\x89\xfc\x5e\x53\x51\x8b\xe1\xcd\xe8\xe8\xe0\x4d\xf8\x14\x3a\x10\x9a\x29\x75\x28\x38\x58\x79\x60\x68\xf2\x56\xc5\x50\x88\x22\x24\x6f\x83\xa2\x1b\xc8\xc9\xe7\x01\x85\xa5\xe0\x94\x4e\xd7\x44\x34\x3c\x9a\x5e\xdc\xa2\xa1\xc5\xc9\x44\xe3\x8d\xa3\x7f\xdc\xb1\x67\x8b\x26\x50\x67\x4a\xb0\xcc\x1f\x28\xda\x7d\x4e\xbe\xa9\x4a\x61\xf5\x75\xab\xde\xbe\x11\x01\x78\x60\xb4\x05\xd0\xe3\x48\xd7\x37\xc3\xdd\x9c\x1a\xe8\x2b\xce\xc0\x3b\x8a\x04\x29\xf6\x1d\x04\x1c\x9c\x87\x66\xae\x90\x9a\x3f\xa4\x8d\xcb\xe0\x1c\x8b\x71\x75\xac\xc4\x9b\x43\xaa\xe4\x40\x71\x8a\xb2\x48\x27\x72\x4a\x4f\x57\x0d\xd6\x14\xb4\xf3\x97\x2e\xb1\x36\xd4\xb2\x48\x53\x96\x8e\x9a\xf1\x39\x08\x0f\x2a\xe0\xbd\xda\xf7\x40\x91\x4a\x85\x6f\xc7\x46\xa9\xd1\x8f\x38\x09\xd3\x40\x74\x11\xd8\x9c\x81\xa4\x28\xbd\x1a\x8d\x67\x34\x84\x73\x1a\xc2\xe4\xa2\x58\x10\xf7\x74\x26\x0e\x18\xcd\xea\x3d\xaa\x22\x07\x45\x27\xe4\x56\xd1\xb1\x98\xe6\xcf\xb1\xa7\xc2\x2f\x00\x04\x0d\x63\xe5\xb0\x8f\xf6\x40\x49\xa0\xbd\xf7\x4c\x71\xda\x90\x4a\x23\x68\x4e\x3b\x3f\xc8\x4a\x1f\xe6\x8a\x36\x4d\xe7\x08\xfa\x5c\x41\x10\xf1\xce\x41\x28\xfa\x18\xa3\x03\x3c\xc0\x87\x0a\xbc\xcd\x81\xcc\x7e\xef\x16\x10\x8f\x52\x42\x84\xdc\x23\xd4\x15\xa3\x4b\x3b\x60\xf0\xcc\x15\x0e\x8c\x62\xae\x09\x79\x1d\xf7\x79\xe2\x8b\x74\x49\x7a\x93\x82\x33\x0b\x1a\x14\x60\x2f\x79\x5d\x10\xa2\x8f\x69\x5a\x20\xe0\xb4\xed\x92\x37\xc7\x13\xa3\x7c\x12\x28\xc9\x94\xed\xb0\x04\xcf\x3d\x43\x96\x18\x72\xda\x40\xc9\x34\xf2\x50\xa0\x83\x70\x2c\x1a\x9d\x44\x69\x3c\x0c\x75\x64\x15\x17\xf7\x09\x87\x78\xe3\x41\x99\xfd\x3e\x4f\xf0\x86\x59\xbe\xc5\x95\xf8\x2e\xd9\x0a\xcd\xe2\xb5\x26\x5b\x1c\x2d\x9e\xe5\x12\x31\x4e\xa1\x7f\x5b\xaa\x24\x7f\x65\xf9\x9c\xc8\x12\xe9\xcf\x32\x0f\x4d\xc8\x1e\x89\xed\xd0\x8e\xb6\xac\xf9\xfd\x45\xf9\xf8\x5c\x88\x67\xbb\xc2\xde\xba\xd3\xdf\x2a\x40\x6f\xc4\x62\x27\xbc\x61\xed\x96\x77\x50\xeb\x4d\x43\xd1\xea\x55\x9a\xa5\x50\x2a\x62\xf1\x40\x51\x7f\x50\xc7\xd5\x1a\xcf\x44\x75\xf3\x70\x2c\xde\x6d\xb2\xe9\x9e\xca\xa3\x37\xf3\x6d\xc1\xe6\x71\xfe\xf4\x5e\x12\xf4\x4b\x82\xef\xab\x3c\xfc\xa1\x27\x39\xa3\x01\x66\xba\x92\x53\xda\xb3\xdc\x5d\xbf\x43\x2b\x37\x20\xc5\xd7\x47\xd0\x5f\x8f\x13\x40\x3f\x3e\x5e\x55\x8d\x2e\x66\xa3\xd9\xe1\x64\x3a\xfa\xd7\x64\x3c\x2f\x96\x16\x89\xbb\xe3\x05\x01\x22\x6d\x54\xf4\x44\x43\x12\xc2\xc3\x76\xd9\xaf\xda\x03\x79\x8f\xa2\x57\xed\x84\xec\x14\xad\xa9\xac\x7b\x96\x7d\x4b\x44\x91\xf5\x61\x72\xdf\x6d\xc2\xf7\x80\xd1\x06\x76\xf5\xae\x0d\xb3\xf5\xe6\x5a\x1e\x79\x07\xf1\xea\xd9\x96\xc5\x1d\x6e\x35\xb1\x1f\x97\xd3\xf9\x68\x78\x23\xa9\xd7\x90\xd6\x29\x7a\xf2\x57\x42\xe9\x75\xd1\x91\x2a\x37\x4c\xea\x6b\xc3\xe4\xeb\xa2\xf4\xf5\x61\xf6\x15\x91\xfa\x5f\x46\xd5\xbc\x9c\xfe\xe7\x74\xb4\x99\xd0\xb8\x14\x66\xc1\xdb\x4a\x32\x71\x2c\x79\xf7\x5c\x17\x9e\x53\xb4\x28\x77\x84\xd6\x13\xe9\x29\x69\xc0\x85\x8a\x82\x77\x31\x0b\x66\x21\x2b\xe6\x0c\x4c\xfa\xba\x28\xeb\x8f\xa4\xa3\x65\x7a\xd4\x5b\x9a\x96\xf8\x6b\x23\x8c\x02\xd6\x1e\x0b\xd9\x9d\xc8\xce\xc5\x61\xef\xc4\x16\x26\xae\x28\x62\x70\xef\x43\xd0\x92\x09\x3a\x62\x17\x2b\xd8\x90\x1d\x8e\x5a\xf6\x0a\x87\xe2\x05\x98\x66\xa7\x32\x08\x03\xca\x54\x0e\x95\xad\xc3\x21\x13\xb4\x07\x7b\xc5\xb4\x78\x8c\x40\xf7\x13\x8a\x7e\x5b\x29\x1c\xf5\x09\xd0\xa2\x97\xe6\x64\x8e\x89\x1c\xc7\x4c\xf8\x95\x06\xa3\x9b\xe2\x7c\x1e\xeb\x12\x38\xf8\x93\x66\xa1\x1d\x98\x78\x2c\x96\x0f\x91\x69\x49\x61\x83\xe7\x0c\x7c\x1f\x04\xb1\x5e\xbc\xd4\x2f\x13\x34\x7a\x33\xa1\x98\x9f\xac\x5d\xf2\xeb\x66\xa2\xe3\xf3\x9f\x2e\x4f\x17\x39\x67\x5a\x0e\xe7\xd9\x87\xd1\xc9\xfc\x6c\x6f\xa0\xec\x20\x3b\x2b\x47\xa7\x67\xf3\x78\x3f\x45\x61\x3f\xc8\xde\x8f\xaa\x6a\x6f\xf0\xff\xbd\xa7\x3f\x83\x6c\x72\x51\x0c\x47\xf3\x8f\x7b\x03\x1c\x14\x0d\xb2\xd9\xfc\x63\x55\xee\x0d\x46\xb3\x49\x45\xa7\xd2\xbc\x8a\x77\xe5\xe0\xe5\x9f\x3a\x8b\x1f\xe0\x02\x13\x1a\xbc\x2a\x28\x48\x22\x5d\x12\xb1\x83\x76\x79\x0c\x1f\xd7\x4f\xc0\x0e\x8b\xe8\x3d\xab\x1d\x33\xa0\x87\xa0\x02\x78\x43\xe1\x29\x71\x88\x43\xae\x09\x20\xc3\xcf\x8e\x49\x8a\xf1\x17\x68\x04\x62\x2b\x09\xc2\xd1\x61\x17\x05\x28\x15\xdd\x13\xe2\x26\x13\x91\x83\x04\x85\xc8\x68\x5e\x11\x66\x34\x45\x0b\xa6\x91\x5e\x3b\xd0\xa3\x21\x4d\x3c\x45\x46\xb8\x78\x69\x12\x5c\x3c\x64\xca\xd1\xe1\x70\xbd\xef\x28\xa0\x12\x0d\x11\x9b\xb9\xb3\xe6\x0c\x1a\x10\xd4\xf4\x2b\x85\x4d\xeb\x96\x1a\x23\xc4\x2b\xc9\xf8\x83\xcb\xa4\xe1\x93\x6d\xcb\x14\x58\xa6\x05\x6f\x0b\x09\x96\x02\xb1\xb6\xae\xcb\xce\xe7\x32\xfa\xdd\xe3\x38\xb3\xf5\xf1\x20\x80\x0b\xe0\x86\x49\x70\xe9\x52\xa7\x28\x9f\x63\xca\xbe\x82\xa0\x18\x5d\x12\x50\xe8\x34\x71\x29\x0b\x09\x5e\x32\xd9\x1e\x55\x2a\x63\xec\x3f\x4e\x91\x25\x29\xb4\x64\x0d\x60\x07\x74\xae\xbf\x0f\x47\x86\xce\x37\x0d\x60\x55\x95\xcb\x5c\x83\x5f\x24\xba\x1e\x2d\x91\x3f\x9e\xc0\x61\x24\x21\xa8\x99\xd3\x54\x82\x0e\xe0\xa6\x45\x03\xec\x94\x8b\x9b\x8f\xb0\x0e\x6e\x8a\x04\xa9\x7a\xe1\x20\x8f\x81\x20\xbd\x3b\xcb\xc9\xc1\x5e\xd2\x71\xe7\x6d\x12\x78\xd7\x16\x24\xe2\x3a\x04\xc5\x98\x5c\x20\x13\x4c\x11\x39\xf9\x88\x53\xe8\x43\xbc\x34\x09\x58\x68\x0a\x5c\xd9\x73\xdf\x17\x60\x74\x25\x99\x01\x44\x99\x24\x2a\x6e\x89\x8b\x0e\x80\x16\xe4\x70\xd8\xf5\x37\x94\x39\x04\x55\xe1\xaf\x8a\x5e\xda\x92\xe1\x0d\x16\x80\xed\x91\x2d\xd9\x4a\x0b\x41\xed\x2f\x16\xac\x24\x72\x87\x39\x52\x04\x74\x87\x8c\xe8\x68\xa6\xb7\x99\x8c\xe2\x3e\x07\x8d\x60\xa5\x26\x37\x93\x54\x35\xbc\xdf\x2e\x23\xa5\x7f\x9c\x41\x59\x4c\x87\x67\x1b\xd1\xcc\x16\x99\x16\xb1\xb6\x2f\x38\x49\x47\xba\x46\xd9\x4e\x01\x54\xe9\x50\x5c\xfc\x97\xb8\xa0\xf9\xe0\x9c\x08\xce\x14\xc8\x25\xc9\xad\x82\xc5\xfb\xfa\x0d\xa1\x46\xe5\x62\x93\xfe\xc3\xca\x30\xa5\x40\x86\x2a\x77\xa0\x5c\xee\x40\x23\xb7\x6a\x19\x57\x40\xf1\x1d\x12\x7b\x1d\x6d\x9c\x54\x59\xfa\x62\x59\x48\x8f\xca\x0f\x07\x93\xea\xf2\x7c\xbc\x99\xe0\x8d\x82\x99\x43\xd3\x5d\x60\x5f\xb9\x35\x79\x21\xda\xc2\xb1\xeb\x7e\x21\x98\x79\xfb\x46\x28\x26\xc3\xa1\x39\x76\x67\xfe\xed\xb9\xe0\x8c\x1f\x8a\xf8\xb0\xd8\x01\x0a\xc1\xf2\x3f\x26\x97\xef\x36\x15\x88\x25\x9e\x3a\xd8\x3d\x73\xce\xa1\x1c\x0f\x47\xb4\x10\xe8\x15\x73\xb4\x65\x23\x40\xc7\xa6\x12\xfd\x63\x10\x29\x20\xb3\x23\x9f\x73\x27\xba\x87\xc7\xa4\xc2\x37\x79\xca\x45\xa0\xa8\x6c\xd7\xb4\x57\x84\xa6\xc1\x8a\xdf\xd0\xe0\x18\x15\xda\xd1\x8c\xe0\x62\x8b\xa9\xf8\xe5\x43\xb8\x8a\xaa\x1c\x9f\x14\x9b\x09\x20\x43\xbb\x5a\xec\xa1\x0c\xc7\xfe\x4c\x45\x97\x18\x7f\xe8\x8e\xed\xa1\xa2\x30\xa5\xf1\x74\xc0\x26\x0a\x2a\xea\x5e\x2f\x8e\xb1\x43\x61\x29\x31\x7a\xfb\xc8\x33\xe9\x61\xf9\x4b\x45\xa1\xcc\x45\x38\x76\xe4\x6d\xb5\x98\x1a\x9b\x71\x0d\x72\xc8\x70\xb9\x03\x72\x7e\xdf\x1b\xf8\x41\x86\xc3\x71\x3d\xa8\x0d\x1e\xd9\xda\x3b\xcb\x1e\x68\x77\xaf\x45\x51\x2d\x58\xfe\xa3\x56\xa3\xa9\x1a\xc9\x1f\xb9\x1a\x13\xab\xb1\x8f\x5c\x8d\xed\xa2\x26\x3c\x56\x2d\xae\x87\x9a\x47\xab\xc6\xf7\x50\xf3\x68\xd5\x84\x1e\x6a\x1e\xad\x1a\xc1\x3b\xb8\x91\x8f\x46\x01\x42\x74\x91\xf3\x88\xf5\xc8\x2e\x76\x1e\xb1\x1e\xd5\x45\xcf\x9d\xea\xb9\x9b\xb4\xd6\xc9\x5c\xe2\x74\x02\x40\x6f\xb7\x85\xea\xf8\xae\x06\xa6\x8e\xbb\x47\xff\x52\xfe\x4d\xa8\x3c\x1c\xfe\xc5\x25\xa0\x15\x0d\xe8\xcc\x67\xe0\xb8\xa6\xdb\x00\xca\xbf\x09\xb1\x2e\xa2\xf0\x40\x80\xc7\xf9\xc8\x04\x68\x24\xdc\xfb\x42\xfa\x2e\x51\x31\x7a\x4e\xa3\x8f\xab\x21\x6f\xf3\x21\xbd\x1b\x30\xd7\x9c\x72\xde\xb0\xce\x5c\x73\xee\x79\xd3\x3a\x74\xad\x99\xe8\xcd\xeb\xd4\x9b\xaa\x35\xfd\x6a\x37\xa9\x63\x6f\xaa\xd6\xae\x42\xed\x46\xd4\xc7\x4d\xb5\xba\x95\xa8\x7d\xf4\x6a\xfd\x4a\xd4\x3e\x7a\xb5\x61\x25\x6a\x1f\xbd\x5a\xc1\x57\xe0\x76\x33\x3a\xee\xc6\x6a\xc5\x2a\xe4\x3e\x41\xbd\x72\x15\x76\x9f\xa0\x5e\xb5\x0a\xbd\x9b\xd1\xf1\x37\xd6\xab\x17\x76\xb0\x3d\x85\xce\xbf\xb1\x41\x66\xc1\xcb\x89\xb6\x90\x1d\x0a\x75\xec\xcf\x02\x38\x7f\xcd\x0e\xd7\x0d\x6f\xf5\xb4\xcf\xc2\xcf\xb2\x13\xcd\x44\x3d\x8d\x31\x60\x40\x5d\xb7\x02\x74\x03\x59\xaf\x19\xb1\x7f\xe3\x5a\x7f\xad\xe8\xfa\x8f\xa1\xf7\x6f\xa8\x58\xaf\xec\xf0\x86\xc4\xf4\x0d\xf5\x9a\xd5\x1d\x7e\xfc\x8a\x6d\xbf\xe2\x0d\xeb\xc3\x1b\x2a\x76\x0b\x15\x6f\x56\x23\xde\x50\xb1\x5f\x85\xe2\x4d\xa9\x88\x1b\xea\x0d\x2b\x51\xfc\x04\x15\xa3\x0d\xb0\x02\xc7\x4f\x51\xb3\x58\x89\xe4\x4d\xe9\xc5\x9b\x6a\x96\x0b\xc2\xf8\xde\x9a\xf1\x8f\x17\x93\xea\xe3\xe9\x64\x9c\x5d\x4c\x46\xe3\xf9\x6c\x6f\x20\x05\xc8\x90\xd9\x4c\xa8\x78\xf1\xf1\x7c\x4d\xfc\x8d\x29\x1b\xed\xc7\x75\x51\xec\xbf\x66\xb7\xef\x34\x83\x7b\x96\xeb\xe3\x50\x48\x90\x4c\x42\x7d\x0a\x37\xed\xed\x3e\xb6\x87\x42\x82\x3c\x0e\xfb\x6d\x62\xdc\xc5\xea\x59\x38\xc6\xef\x9e\x7c\xb2\x19\xe9\x47\xda\x43\x7f\x2c\xf5\x99\x7c\x7b\xce\x73\x73\xe8\x8f\x45\xe8\xdc\xd3\x7b\xcb\x04\x3f\x14\xba\x93\x4b\xe8\x4e\x36\x7c\x68\xf3\x49\xde\xc9\x27\x79\x27\x1f\x3e\x74\xf2\xd9\x6e\x3e\xdb\xcd\x67\x63\xbe\x0d\x05\x5d\x78\x54\xe3\xf1\x9a\xba\xd5\xe6\xe7\x8a\x1e\xea\x99\xff\x04\x70\x58\x3f\xf6\xc3\xea\xf8\xc3\xc9\xaa\x7e\x7a\x26\xb9\x66\xbe\xa9\xde\x5c\xfa\x15\x72\xc9\x63\x47\x84\x78\xb2\x40\x89\x2b\x23\x8c\x93\x4a\xfa\x42\xa4\x42\xa3\x91\xa7\x23\x09\xcb\xcc\x6a\x22\xd8\xfc\x76\x87\x27\x94\x13\x77\x3e\xde\xe6\x99\x6c\xbe\xb8\x2a\xc7\xf3\x0d\x39\x7d\x08\x17\x3d\x32\x53\xd8\x18\xc9\xc1\x2c\xec\x26\x4f\x0b\xe4\x31\xab\xaa\x3c\x58\x9d\x7b\xf2\x82\xe9\x6f\x3a\x17\x9b\x5d\xd4\xff\x2a\x16\xc4\xef\xd4\x31\xf5\x85\x97\x8e\xf4\x17\x5e\x39\x32\x5f\x74\xe1\xa8\xa5\xef\xca\x80\xb2\x0c\x2f\x47\xd2\x82\x24\x27\xba\xa5\xa8\x27\x0b\x54\x9f\x2b\x08\x9a\x2e\x8b\xd1\x51\xee\x43\xf6\x77\x08\xf8\xf7\xc5\x27\x1d\xd5\x57\xb6\xfe\x76\xaf\x4e\xea\x67\x30\xb1\x6a\x9e\xc5\xbc\xea\x13\xd1\xdb\x9a\xd3\xa2\x77\x63\x5c\x06\x52\xe5\xa0\xc5\xa1\x54\xe0\x1f\xca\xbb\x69\x62\xe2\x41\xb3\xab\x5f\x64\x56\x43\x3f\xe7\x99\xf2\xfb\x75\xc9\x3c\x37\x73\x6c\x13\x3b\x2d\xbe\xc4\x84\x80\x7c\xb2\x09\x81\x6b\x27\x23\xae\x99\x9f\xe2\xcf\x79\x7e\x4a\x1a\x08\x9a\x09\x0b\xc6\x57\x79\x88\x21\x2c\xac\x3b\x12\x24\x96\x02\x36\x48\x21\xd9\xa8\x26\x78\xbd\x84\xc0\x44\xa8\x14\x28\x1c\x38\x2a\x7f\x14\x43\xd9\x5a\x5b\x74\xb3\xc6\x90\x72\x41\xd1\xe5\xd1\xe2\xfe\x7f\xd9\x91\xd4\xa2\x34\xef\x0e\xae\x2d\x28\x84\x07\xed\xf8\xa8\xa3\x2e\x44\xf0\x88\x7b\xc2\x99\xb9\xdc\x9d\xe5\xe2\xf9\x8e\xd8\xbf\xd9\x01\xea\x76\xaa\xf0\x19\x4d\x15\x9e\xe7\x1a\xd1\xa6\x80\xfb\x27\x16\x57\x4f\x1a\x02\xf6\xcf\x1f\x6f\x08\x00\xab\xc0\x4a\x26\x1c\x18\x35\xcc\x55\x0a\x6e\xa6\xf2\x00\xd2\xe7\x82\xe7\x68\x39\xca\x5c\xf0\x9f\x0d\xc9\x1f\x01\x8a\xa5\xdc\x47\x02\x9c\x64\xc2\x57\x20\x2d\x68\x3f\x54\x29\xe0\x92\x62\x81\x18\x80\x8e\xcd\xf4\x92\x09\x3e\x13\x12\xb4\xcd\x15\xe5\x4f\xe5\x55\x74\x56\x8a\xf6\x6f\xdf\x08\x24\x00\x2c\x42\x1d\x08\x49\x96\x28\xde\x33\xb4\x48\x51\x06\x69\x26\xfc\x90\x82\x96\x04\xe6\x41\xb8\xdc\x63\xaa\x50\xe0\xe9\xee\x67\x44\xbf\x46\xcc\x38\x49\x67\x1a\x07\x26\xfc\x41\x7c\x19\x0b\x90\x0a\xb4\x4c\x85\xb6\x75\x6d\x28\x44\xad\xf0\xb4\x31\x50\x80\x70\xfb\x16\xbc\x65\x74\x49\x1b\xdc\x4c\x8c\xb5\xde\xbe\x25\x2a\x6a\xbf\x78\x7b\x4e\x81\x54\x9d\xdc\xd7\x98\xae\xeb\x4f\x05\x43\x91\xe3\xf1\x85\x8b\x97\x44\x7e\xf4\xa9\x94\xe0\xc3\x86\xc2\xd7\x6e\x91\x7f\xb3\x01\x7a\x73\x58\x03\xe0\x4d\x08\x0f\xe0\x8a\x58\x0f\x11\xbd\xee\xe1\xf2\xcb\x4c\x7a\x38\x3a\xb9\x9e\x51\xa5\x01\x11\x50\x30\xe9\x7d\x8b\x82\xce\x76\xe4\x24\x45\xe5\xa1\x20\x68\x3d\x62\xcb\xf1\x36\x4f\x2f\x5d\x88\x97\x64\xb9\x82\x72\xa0\x15\xed\xe7\x51\x20\x55\x41\x8a\x4c\xd7\x65\x0a\x06\x4e\xe7\xc0\xed\xfe\x22\x11\x4a\x95\xea\xd2\x58\x98\xae\x4b\x14\x98\x99\x8e\x62\xd9\x08\x5f\x29\x4d\xbb\x68\x6f\x23\xcc\x42\x58\xa2\x32\xdb\x6e\xe9\x34\x20\x35\x78\x73\x24\x34\x78\x4d\x7a\x31\xaa\xe8\x4e\xd7\x14\x58\x1c\xfe\xba\xa1\x89\xe1\xbd\x05\x8f\x51\x7f\x85\x26\xd2\x62\x48\x5a\x85\x70\x14\xdd\xd2\xd5\xfb\x4b\xd1\xea\x56\x8e\x19\x10\x55\xbd\x7b\x4e\x16\x22\x90\x98\x0f\xed\x56\x53\x93\xdb\x86\xba\x37\xc3\xa3\x04\x7b\x03\xce\x57\x1a\x34\x4a\x09\x6d\xb1\x5e\x43\x9b\x52\x8d\x6c\x30\x6d\x03\x73\x20\xc3\x91\x44\xe5\xb4\x0e\x67\x22\xf0\xb0\xf5\xb6\x6d\x3d\xed\x10\x14\x60\x43\x65\x18\x9a\x2c\xce\xe4\x02\x4c\x2e\x6d\x2e\xed\xdb\x73\x8a\xf7\x49\x17\x0b\x36\x5e\x0a\x0d\x5e\x30\x5d\x07\x52\x17\xb9\x04\x93\x04\x5a\x5f\x74\x29\xd4\x9c\x9e\x2d\x64\x27\xe5\x49\x72\xc1\xa8\xb7\xe7\xb9\x00\x6d\xe8\x52\x90\xc9\x44\x97\x64\xc2\x80\x31\x74\xa9\x52\x48\x69\x44\x6b\xa0\xef\x43\x5d\x75\x9c\x9d\x07\x39\xcc\x23\x5e\x73\xc2\x6b\x8e\x78\xcd\x1b\x91\x81\x78\x8d\x94\xd5\x46\x1e\x05\x21\x73\x0b\x77\x51\x09\x37\xc6\xce\xf6\x14\xa5\x30\xa9\x84\x1e\xd7\xc5\xad\xa1\x60\xab\x74\x22\xc7\x2a\x46\x8e\xa2\x7f\x85\xd6\xa8\x0b\xdd\x44\xb8\xdf\x6f\x90\xbb\x6e\x10\xb3\xcf\x9f\xb3\x3c\x28\xe6\x41\x3d\x0b\xb2\xbf\x76\x56\x62\x71\x4b\xf5\xbc\xbc\xf8\xcb\x64\xfa\xa1\x98\x9e\xc8\x6b\x95\x96\x03\x8e\xc4\x6c\xe4\xd2\x31\x71\x74\x7e\xcd\x91\xb0\x60\x28\x00\x86\x03\x21\x29\x2e\xa7\x2f\x04\xd0\xd6\xef\x26\x97\xb2\x74\xd4\xcd\x19\xc7\x51\x29\x45\xd9\x08\xa0\x3d\xc5\xd8\xdc\x47\x88\x32\xd1\xc4\x0d\x60\x4d\x7d\x77\xd2\x43\x59\x77\x0b\x3f\x22\x37\x30\xd3\x6f\x46\x9e\x9e\x8e\x65\xa0\xb1\x78\xb7\x85\x2a\xce\xc6\x00\xb6\xa6\xd7\xf2\x58\xd0\x9d\xd4\xc0\x62\x98\xa1\xfd\xe9\x74\xf2\xe1\x7a\x93\xc0\x81\xb5\x48\x75\x36\x1e\xeb\x83\x34\xa4\xe3\x73\x67\x3b\x77\x0c\xd3\xec\x8e\x04\x0e\x6f\x3c\x1d\x76\xd3\xcc\xf0\x92\x9d\xca\xf8\x31\x26\xd0\x5c\x31\xe6\xec\x0e\x25\xd3\x0a\xcf\xdd\xe0\x59\x77\x62\x32\x2d\xa9\x17\xb3\xbd\x4f\x83\xcb\xf1\x3f\xc7\x93\x0f\xe3\x7c\x36\x2f\xe6\x97\xb3\xc1\xab\xb6\x8f\xff\x15\x53\x7e\xa6\x04\x76\x36\x39\x2f\x3b\x89\x87\x93\xf3\x92\x0d\x27\xa7\x9d\x57\x07\x93\x53\x36\x3c\x2b\x87\xff\xec\xbe\xc3\x67\x36\x1f\x9d\x97\xb3\xce\xdb\x5f\xf0\x99\x0d\xca\xdf\x87\x55\x71\x4e\x01\x40\xf2\xf9\x74\x54\x8c\x4f\xab\xb2\xdb\x80\x3f\xb7\xe9\xbf\xa4\xe4\xfe\x47\xd1\xea\xbb\xe6\x93\x18\xf4\x87\x0d\xa8\x49\x2b\xb2\x52\xd3\xea\x4c\xa3\xf1\xfb\xc9\x8a\x3c\x7f\x1d\xbf\x9f\xf4\xb2\xcc\xe6\xc5\xf8\xa4\x98\x9e\x2c\x66\xfa\x39\xbd\x67\x83\xd9\xe5\x70\x58\xce\x66\x2b\x73\xfe\x1c\xd3\xda\xcc\xe5\x74\x3a\x99\xae\xcc\xfa\x67\x4c\x69\x33\x7e\x28\xa6\xe3\xd1\xf8\x74\x65\xd6\xff\x8e\x69\x6d\xe6\xb3\xb2\xba\xc8\xb1\xb9\xdd\x5c\x87\x65\x75\x81\x2d\x65\xef\x8a\x69\x17\x17\x3f\x15\xd3\x19\xbb\x9c\x95\xd3\x2e\xe6\x67\xe5\x94\x11\xbc\x5f\x2d\xec\xd1\x67\xef\xe9\x28\xef\x57\x8b\x67\x7b\xb3\x41\x4c\xc8\x27\x17\xe5\x78\xb0\x94\xfc\xb7\x8b\x72\xcc\xde\x95\x55\xf5\xaa\x7f\x30\x1f\x1b\x9d\x17\xa7\xdd\x4a\xe8\x50\x14\x36\xac\x26\x97\x27\xaf\x16\xa2\xa9\xb3\x41\x99\xc2\xd8\xe5\x67\x4d\xd0\xc6\x1e\xc8\x96\x42\x3a\x76\x3e\xb9\x4a\xa1\xef\x56\x7d\x50\x87\xc5\x63\x83\xf7\x14\x32\x2a\x3f\x9d\x8e\x7a\x10\x6e\x23\x49\xf5\xb2\xac\x20\x98\xc5\x98\x53\x6c\x70\x75\x9e\xbf\xbb\x3c\xed\xe6\xa1\x90\x3a\x6c\x46\x91\x2f\x5e\x2d\x86\xc2\x60\x83\xab\x51\xf9\x21\x1f\xc6\x68\x0e\xbd\xcf\xda\x20\x0f\x6c\x40\xc8\xc9\x4f\x28\x62\xc2\x60\x11\x49\x31\x90\x02\x1b\xa6\xdd\xfd\xaf\x96\x37\xfc\xb3\xf2\xaa\x1c\xcf\x5f\x2d\x78\x64\xb0\xf2\x63\x17\x17\x7f\xfe\x88\xec\xf6\xb1\xcc\xcf\x46\x27\x7d\x26\x8b\x23\x22\x36\x98\xcd\xcb\x8b\xfc\x7d\xd4\x35\xb9\xec\x51\x7a\x47\x09\xb1\x02\x85\xe5\xab\x05\xe1\xf9\x99\xfd\xed\xdd\xff\x2d\x87\x73\x38\x29\xdf\x8f\xc6\xe5\xdf\xa7\x93\x8b\x72\x3a\xff\xb8\xd3\x15\x4f\x6c\x70\x36\xb9\x9c\x95\x03\x36\x82\x93\x72\x36\x9c\x8e\x2e\xe6\x93\xe9\xc1\x64\xfc\x7e\x74\xda\xcb\x07\x28\x9c\x76\x77\xd7\x2a\x71\x56\xce\xe7\xa3\xf1\xe9\xec\xf6\x42\x87\x93\xd3\x75\xcb\x8c\x7c\xbd\x46\x91\x28\x73\xd6\x2c\x74\x58\x4d\xd6\xe9\x3a\xc9\xd6\x35\x8b\x4c\x52\xe4\xd6\x42\x7f\x5d\x2d\x9a\x7f\x5b\xb3\x1a\x92\x6a\x77\xac\x24\xb1\xd2\xba\x55\x90\x74\xbb\xbd\x86\xae\x58\x5f\xb7\xe8\xf3\x72\x7c\x79\x3b\xd8\x51\x8a\xae\x59\x60\x71\x55\xcc\x8b\xdb\xe1\x01\x28\x84\xd7\xa5\x8d\x62\x5a\xce\x6f\x2f\x91\xd0\xb6\x66\x91\x27\xa3\x69\x39\x9c\x4f\xa6\x1f\x6f\x2f\x36\x8a\xfa\x35\xcb\x1d\x4f\xe6\xa3\xf7\xa3\x21\x61\x79\x0d\xb0\x96\x55\xb5\x2e\x0c\x26\x55\x55\x5c\xac\xc1\x22\xbf\xf6\xa5\xe5\x6f\xbb\xbb\x9f\xd9\x00\x5e\x5e\x4c\x27\x58\xc9\xec\xe5\x68\x38\x19\xcf\x5e\xce\xa6\xc3\x97\x97\xf3\x51\x35\x7b\xd9\x16\x96\x0f\xa9\x34\x98\xcf\x06\xaf\xde\x5f\x8e\x87\xd8\x87\x9d\x39\x2b\xd9\x74\xf7\xd3\xe0\x72\x56\x66\xb3\xf9\x74\x34\x9c\x0f\x5e\x5f\xd3\x5e\x36\xf8\xc7\x3f\xca\xd9\x9b\xc9\xc9\x65\x55\x0e\xd8\xa7\xab\xa2\xba\x2c\x5f\xfd\xc0\x3f\xa3\x11\xb6\xd8\xe4\xbd\xab\xc9\xe8\x24\xe3\xab\x52\xda\xaa\x77\x3f\x4d\xcb\xf9\xe5\x74\xfc\xa9\x1c\x5f\x9e\x97\xd3\xe2\x5d\x85\xe5\xb1\x0f\xd3\xd1\xbc\xbe\x8f\x4d\xbe\x6c\xd2\x62\xa5\xf3\xcf\x9f\x6f\xee\xf4\x0c\x41\x95\xcf\xcb\xf3\x8b\xaa\x98\x97\xf9\xe4\xdd\xac\x9c\x5e\x95\xd3\x47\xe9\x7a\xb4\x01\x53\x55\x7f\x4b\x35\xed\x95\x30\x3c\x2b\xc6\xa7\xe5\x61\x31\x3e\xa9\xca\xe9\x41\x51\x55\xef\x8a\xe1\x3f\x67\x2d\x60\xae\x49\xff\xf4\xf9\xf5\x55\x31\xcd\x46\x2d\x9c\x76\x3f\xd5\xb7\xd9\x7c\x67\xf7\xd3\xfc\x6c\x34\x83\x61\x93\xff\xba\x82\x3e\x47\xd8\x66\xab\x7b\x34\x47\xa1\x83\xe6\xd7\x10\xfb\x73\x5a\xce\x5f\x75\xaa\x4b\x5f\xce\x61\x36\x42\x52\xfb\x6b\xca\xf8\xef\x7f\xef\x2c\xbe\xda\x1b\x97\x1f\xb2\xf9\x2e\x5b\x7c\xff\x99\x75\x51\x2a\x16\xd1\xf8\x19\xbf\xb8\x98\x4e\xe6\x93\xf9\xc7\x8b\x12\x66\x97\xef\x90\x46\xde\x95\xbf\x4c\xf6\xba\xd8\xd9\xfd\x84\x90\x98\xee\x61\x8f\x5f\xd7\x8d\xea\xf5\xfe\xd7\xf9\x6f\xff\x91\x8b\xbd\xbd\xbd\xa5\xd7\x30\x1a\x9f\x94\xbf\xff\xed\xfd\x4e\xb9\xfb\xe2\xc5\x72\xea\xc5\xe5\xec\x6c\xa7\xdc\x7d\xb5\x94\xb2\xf7\x6b\xf9\x1b\xeb\xc0\x22\xe2\x62\x7a\x5d\xd9\xaf\x17\x52\x66\x17\xd5\x68\x58\xee\x8c\x98\xd8\x65\x7c\x6f\x6f\xf1\xc3\xaa\x1c\x9f\xce\xcf\x5e\xbc\x38\x29\xab\x72\x5e\x66\xfd\xd4\xcf\x9f\x7b\x50\x29\xcf\x47\xf3\x03\x42\xed\x6c\x01\x2a\x4b\x8d\x5e\xd5\xc3\xf3\xe2\x62\xa7\xcb\x6a\xf3\x9d\x72\xf7\xf3\xee\x67\x36\xff\xbc\xb3\xfb\xfa\x3a\xaa\x1d\xdd\xc2\x56\x57\xa7\xf9\xbc\x38\xcd\x4f\xcb\x71\x39\x2d\xe6\x93\xc7\x61\xa8\x76\x14\x9a\x98\xe5\x75\xef\x5d\xb7\x53\x88\x9d\x72\x6f\x30\x68\xa8\xa3\x41\xcd\xa0\x59\x30\xdc\xfd\x53\x2e\x5e\xbc\xd8\x29\x7f\xdc\x1b\x0c\x8b\x71\x7c\x9b\x0d\x90\x02\x3b\x79\xeb\x45\xf1\x85\xcc\xf4\x7a\x21\x73\x67\xce\xa2\x9b\xfd\xac\x98\xa5\x49\x8d\xc1\x2e\xdb\x29\xff\xe3\x0f\x7f\x9c\x5d\x9d\x66\x57\xe5\x74\x36\x9a\x8c\xf7\x06\x31\xbe\x78\x1c\xdb\xfe\xe1\xc7\xf2\xc7\x3f\x0c\x32\x34\x8d\x7f\x9a\xfc\xbe\x37\xe0\x19\xcf\x94\xcd\x94\x1d\x64\x17\xd3\x92\x50\xb1\x3f\xbb\x28\x87\xf3\xff\x85\x7a\x66\x6f\xf0\xfb\x9b\xd1\xc9\xff\x7e\x33\x3a\xc9\xce\xcb\x72\x3e\x88\xf3\x4c\xbf\x9f\x57\xe3\xd9\xde\xe0\x6c\x3e\xbf\x78\xf5\xf2\xe5\x87\x0f\x1f\xe0\x83\x82\xc9\xf4\xf4\xa5\xe4\x9c\x23\xa2\x06\x31\xcb\xab\xdf\xab\xd1\xf8\x9f\xab\x32\x8a\x10\xc2\x4b\x4a\x1d\x64\xef\x27\xc3\xcb\x19\x32\xe7\xde\xe0\x7d\x51\xcd\xca\x41\x36\x9d\x50\x48\xcb\xf3\xd3\xc1\x9f\xfe\xf0\x6a\x55\x5f\xbe\x9a\xd6\xef\xfe\x38\xff\x71\xf0\x47\x2c\xf4\x4f\x83\xcf\x9f\x91\x05\x94\x0e\xda\xbc\xea\x31\x07\x94\xbf\x5f\x4c\xa6\xf3\xd9\x0a\xea\xfa\xf4\xf9\x75\x23\x7f\xa7\x3b\xa3\xdd\x4f\xa3\xf7\x3b\xe5\xaf\xa3\xdf\x76\x13\xcd\xe1\x7d\xfd\x39\x89\xee\xf1\x1e\xbe\xda\xfb\x34\x62\x15\xca\xbe\x94\xf4\xea\xd3\xe7\xcf\x0d\x99\xe2\x27\xc8\xad\x3b\xe3\xfa\x4b\x36\x66\xed\xfd\x74\x97\x8d\xa1\xda\xfb\x81\xb7\xef\x6a\x71\x3e\x85\xf3\xbd\x39\x9b\xc2\x70\xaf\x64\x53\x38\xe9\x49\x06\x36\xda\xfd\x34\x85\x09\x09\x89\x7f\xff\xfb\x3a\xc1\x5f\xb2\x05\x7d\x8b\xd2\x7f\x84\x70\x99\xc2\xb4\xd7\xff\xc1\xe5\x38\x7e\x7d\x32\xf8\x61\x0f\x65\xd2\xe4\x7d\xf6\xf3\xc7\xf3\x77\x93\xea\xc5\x8b\xf8\x0b\xf3\xc9\xcf\xf3\xe9\x68\x7c\xfa\x4b\x71\xfa\xe2\xc5\x75\x35\x2e\xe7\xad\x39\x7e\x90\x24\xc0\xe7\xeb\x8c\xa4\xf9\xb5\x82\x02\x9b\x3b\x5f\x10\x8c\xa3\xf7\x3b\xe2\x45\xf9\xe2\xc5\xce\x7c\x6f\xba\x33\xdf\xdd\x65\xfe\x45\xf9\xef\x7f\x6b\x7c\x35\x98\x50\xf9\x83\xbd\xba\x23\xf3\x17\x2f\xf0\x1f\xb4\xc5\xd7\x08\x9d\x27\x05\x9c\x5a\x34\x9c\x96\xc5\xbc\xdc\x19\x5f\x56\xd5\xee\xeb\xd1\xfb\x9d\x29\x20\x15\x5c\xd3\xde\x11\x1b\x9c\x94\xef\x8b\xcb\x6a\x3e\x58\x04\x73\x6d\xba\xec\x32\x49\x0d\x9a\x11\x30\x5a\xc8\xce\x77\xdf\x4f\xa6\x3b\x44\x40\xd9\x68\x9c\xcd\x77\xa7\x70\xb2\x33\x62\x63\xd6\x8a\xf1\xb2\xd5\xcd\xbf\x96\xbf\x7d\xde\x85\x77\xa3\xf1\x09\xb5\x8c\x8d\x77\x77\x6b\xea\x1a\x21\x68\xc6\x2b\x28\x79\xa1\xbf\xff\xb1\x4a\xe5\xa7\xd6\x7f\x5e\x65\x0f\x34\xf4\x8b\x2d\x2b\xd9\xa0\x18\xb0\x72\x97\x95\x58\xdd\xa2\xe2\xee\x1b\x1f\xad\x52\x3b\x2b\x66\x7f\xfb\x30\xae\xc1\x15\x79\x00\x3f\xc0\x32\x2e\xf6\x06\x03\x36\xdd\x99\xc2\x6c\x6f\xb5\x12\x22\xab\x6e\xf6\xb2\xa8\xaa\x7c\x96\x86\x8b\xb3\xc1\xee\xe7\x9d\x4f\x77\xc8\xbe\x71\x6d\xb5\x5f\x55\x69\xf6\x31\x29\xab\x64\x31\xec\xdc\xd8\xa8\xe1\x59\x31\x9d\x77\x7b\xc1\xc6\xb7\x7e\x32\x39\x3f\x2f\xa7\xc3\xb2\xf7\x55\x71\xfb\x57\xd3\xfe\x17\xd5\x6d\x5f\x94\xb3\x59\x39\x9e\x8f\x8a\x1e\x90\xd9\xec\xb6\xcf\xce\xcb\x93\x51\xd1\xfb\x64\x72\xdb\x27\xb3\xc9\x70\xb1\x9a\xe1\x6d\xdf\xcc\xcb\xe1\xd9\x78\x52\x4d\x4e\x3f\xf6\xbe\x3b\xb9\xfd\xbb\xdf\xe7\x79\x79\x32\xea\x03\xfd\xf2\xd6\xcf\xa6\xc5\x55\xd9\x6f\xe2\xd9\xde\xaf\x45\x77\xe8\x36\x86\x83\x84\x99\xf4\xa2\x82\x3f\xd7\x20\x4c\x6f\x66\xf0\x06\xa1\x93\x9e\x26\xf0\x33\x75\x3c\x3d\x0e\xe1\x97\xa6\x4f\xe9\xd5\x25\xfc\x42\xf5\xa6\xc7\x11\x1c\x20\xb9\xa4\xa7\x13\xf8\xa5\xfc\x7d\xfe\xe7\x93\x51\x7a\xf1\x1b\xbb\x40\x1d\xd5\xa5\xc4\x8b\xd7\xb5\x28\x79\xbf\xc7\xd9\xe9\xde\xd9\xeb\xf7\x7f\x3c\x4d\xc6\xe7\xeb\xf7\x3f\xfe\x18\x05\xc2\xf9\xde\xe9\xaf\xef\x7f\x6b\xb2\x5e\xa1\xd4\x39\xdf\x3d\x5f\xe0\xd1\x9d\xab\xdd\x17\x2f\x76\x2e\x7e\xbd\xfa\x6d\xef\xfc\xd7\xab\xdf\x76\x3f\xaf\xd2\x0a\x1f\x46\xe3\x93\xc9\x87\x17\x2f\xe2\xef\x62\x09\x83\x83\xaa\x98\x8e\xe6\x1f\xd1\x82\x9b\x0d\x76\x9b\x6c\xdd\xd7\x50\x9c\x9c\xec\x5c\x5c\x3b\x96\xbd\x86\x6d\x36\xce\xcd\x1d\x40\xef\xf5\x27\x77\x0f\x2e\xa7\x57\xe5\x5e\x77\xd6\x7f\xf8\x4f\xca\xdd\x79\xf7\xf3\xb0\x98\xcf\xcb\xe9\xdf\xab\x49\xf7\xed\xdf\x47\xe5\x62\xc6\xa3\xd1\x78\xe9\xdd\x61\x59\xcc\xdf\x14\x17\x9d\x37\x34\xf1\xba\x90\x8b\x9a\xb1\xf4\xb2\x9a\x5c\x2e\xe5\xfc\xe9\xf2\xdd\xbb\x6a\x29\xeb\x4f\x93\xdf\x17\x9a\xf7\x53\x31\x5d\xcc\xb4\xff\xfb\x68\x16\xdf\xad\x25\xd3\x6e\x98\x68\xb8\x49\xae\xdd\x30\xa6\xc0\x11\xca\x72\x63\xfa\x0b\x54\x68\x49\xde\x6b\x9b\x5d\xa6\x64\x66\xb2\xa3\x4c\x67\x26\x3b\xc8\x24\xf8\x60\x32\x93\xc9\xcc\xd0\x9d\xcc\x5c\x76\x94\xc9\x4c\x06\x4c\xcc\x14\x07\xc1\x4d\xca\xa5\x44\xa6\xf1\x72\x84\x45\x28\x91\x1d\x64\x4a\x51\xb2\x12\x99\xd2\x75\x5e\xa5\xf1\xe3\x23\xfc\x75\x98\x45\xa7\x92\x53\x5e\x13\xeb\x7f\x9b\xbd\xc9\x52\x46\x4d\x55\x2a\x59\xff\xc8\x90\xd5\xfe\x7c\xf7\xda\xab\x97\x59\xe0\xdc\x65\xd2\x82\xa3\xc6\x4a\x07\x4e\xc5\x47\xec\x93\x07\x1d\xf0\xc9\x3a\xbc\x0f\x22\x93\x06\x3c\xbd\x76\x78\x2b\x5c\xcc\xa4\x32\xa9\x21\x48\xbc\xe5\x74\xef\x6c\x5d\x92\x06\xa7\xb3\xa3\xcc\x03\xe7\x82\x9e\x94\x8d\x8f\x22\x13\x02\xaf\x07\xe9\x81\x83\x54\x99\xc3\x22\x03\x38\x93\x59\x30\x19\x1d\xc1\x98\x1d\x64\x16\x44\xc0\x07\x25\x32\x8b\xbf\xd6\xe0\x2f\x7d\x7d\xd4\xef\xc0\x0d\xb0\xb8\xd9\xa7\x3f\x62\xe0\x28\x21\xe4\xa0\x8b\xa2\x16\x6d\x32\x22\x54\x47\x7c\x22\x9e\x2d\xde\xb6\x98\x8f\x38\x92\x84\xcb\x48\x24\x36\x65\x33\x44\x42\x47\x11\x9f\x07\x1d\xfc\xea\x94\x8d\xea\x47\x44\x7f\xe5\x08\xb9\x9d\x1a\xef\xb0\xf3\x0f\xc1\x45\x3b\xc6\x1a\x62\x3f\xea\x33\x82\x94\x60\x5c\x04\xb7\x04\x23\x75\x66\xc1\x5a\x4f\x0f\x5c\x64\x16\x14\xe2\x53\x02\x36\xef\xa0\x7e\x6b\xc0\x5a\x53\xe7\x37\xa0\x10\x83\x54\xcc\xdd\x18\x5d\xdf\xcc\xe8\xba\xcb\xe8\xba\xcb\xe8\xe4\x00\x1c\xb3\x29\x8f\x4f\x4e\x65\x4a\x82\xe3\x16\xfb\xca\xa5\x6d\x7b\xfd\x30\x60\x2e\x38\x42\x7f\xed\x94\x75\x1d\xab\xdf\x73\xd3\xde\x9d\xa3\x15\x3c\xd8\x2b\xbe\x45\xfe\xe3\xcb\x99\x9a\xa2\x0f\x32\x29\x20\xd8\x90\x05\x90\x4a\x21\x22\xb9\x41\xe2\x12\x99\x0c\x08\x64\xa1\x40\x23\x96\x14\x87\x48\x75\xda\x63\xab\x04\x58\x49\xe4\xa8\x65\x40\xe2\x44\x42\x47\xe2\x54\xb6\xed\xc4\xb7\x24\xac\x9e\xe2\xd8\xcd\x0d\x6d\xf3\xbc\x2b\xe9\x98\xdb\x48\xc7\x34\xe2\x2e\x91\x8e\x80\x60\x7c\xbc\xe5\xe0\xbc\x25\xe1\xa7\xd3\x35\x4a\x31\xd9\xfc\xd2\x61\x3d\x49\x73\xa6\xfb\x75\xa4\xd6\x1d\x76\x91\x7e\xed\x44\xb6\xbe\x89\x72\xb7\x4d\xaa\xcb\xdb\x87\x32\xda\xd8\xa3\x33\x01\x42\xeb\x88\x49\x81\x68\x11\xc0\x39\x36\x52\x72\x30\x2e\xe0\xb3\x17\xb4\x81\x55\x08\x62\xe6\x20\x49\x65\xf2\xe0\x88\xc9\xa9\xc7\x52\x82\xd0\x32\x3e\x93\xb6\x14\xde\xc7\x27\x9b\xd1\x16\x24\x1d\x9f\x48\x98\x29\xb0\xbe\x79\x46\xca\x04\x6b\x43\x23\x30\x0c\x28\x41\xb5\x86\x80\x2a\x11\xbc\x31\xf8\x24\xa4\x8c\x79\x7d\x6a\xa3\x8f\xa9\x11\xea\x5a\x66\xb4\x95\xa9\x69\xfe\x51\x46\x3b\x9a\xea\xde\x11\x52\x8d\xcb\x38\xc8\x10\x10\x93\x4a\xfb\xfa\xa1\x0b\x85\xdb\x2c\xc2\x3b\x6c\xc7\x7b\x7c\xa1\xdd\x72\x9e\x70\x60\xa5\x21\x49\x1b\x50\x8a\x0b\x0b\x2e\xca\x60\x8b\x94\xe8\xc0\x04\xe2\x37\xa9\x4d\x26\x12\x5c\x90\xfb\xb0\x6e\x11\x22\xda\x23\x37\x8a\x00\x12\x3f\xc1\xa7\x40\x4f\x6e\x25\xd3\x7e\x43\xd2\xfc\x21\x7b\x1d\xb7\x5c\xb5\x2e\x57\xf5\xdc\x42\x9b\x99\x81\x0d\x0d\xbc\x95\x64\xe6\x50\xef\x77\x0f\xde\x59\x75\x12\x8f\xbc\xe9\x24\x1e\xc9\xcc\xdb\x37\x9a\xc9\x70\xec\x0e\x95\x3c\x96\xe1\xed\xe0\x4f\x7f\x7c\x89\xb5\x74\xc8\x84\x30\xec\x32\xc1\x91\xe9\x54\xf3\x2b\x91\x32\x85\x00\xdd\xb9\x13\x02\x22\xbd\xda\xee\x2d\xa5\x23\xd7\x64\x77\xf2\xab\xbd\xa6\x25\x02\xd9\x99\x88\xac\xf9\x8d\x0d\x08\x4d\x53\xe8\x8e\x53\xfd\xc2\x62\x03\xba\xf7\x74\x67\xee\xd8\x1a\x75\x5d\x6b\xa4\xca\x84\x25\x1a\x69\x7e\xa9\x06\xe9\xea\xd6\xd0\x1d\x0a\x2b\xbc\xd7\x08\x99\xce\x7d\xcc\xa1\xee\xd8\x1a\xbd\xa2\x35\x8f\x3f\x92\xbf\xb3\x99\x74\xcd\x48\xde\xb4\x23\x79\x97\xd0\xa1\x9a\x5f\xa2\x2e\x22\x36\x4c\x8f\x78\x6a\x71\x5c\xe3\x3c\xd2\x00\xe6\x90\xe9\xd3\x06\xee\x35\x1e\x08\x2f\xab\xc8\xf9\xfb\x1d\x70\x9b\xcd\x0c\xb8\xbf\x84\x84\x58\x6f\x10\xff\xa5\x24\xc6\x7a\x21\x86\xbe\x94\x04\x59\x2f\x36\x50\xaf\x75\x8f\x1f\xe5\xe7\x4f\x7f\x7c\x19\x2b\xf9\xe2\x13\x07\x77\x1f\xfd\x3d\x7c\xe2\xc0\xac\x31\x71\xf0\xc4\xb2\xf1\x71\xc7\xf7\xb7\xa2\xfb\x5b\x1d\xe7\x7f\x19\x61\xb9\xde\xdc\xc1\x97\x13\x97\xeb\x85\x98\xfa\x72\x02\x73\xbd\x08\x54\xeb\xda\x16\xf7\x0c\xfe\xb4\x1d\x55\xad\x1a\x55\xad\x63\xf9\x3e\xe2\x8c\xc5\x43\x64\xc8\x17\x99\xb1\xf8\xe2\x26\xf6\x76\x62\xe1\xb1\x58\xa0\x3f\xbd\x90\x5c\x11\xbe\xd6\xd9\x05\x49\x0c\xd2\xfc\xb6\x4a\xee\x28\xa6\x22\x25\x92\xf6\xd3\xa0\x89\x3c\x51\xd8\x77\xee\x85\x07\x5f\xeb\xca\xf6\x96\x72\x44\x32\x07\xc2\x67\xa3\x4f\x3b\xb7\x0e\x64\x53\x4a\xf7\x1e\xb3\x6c\x64\xc6\x22\x64\x52\x27\x06\x4a\xbf\x51\xeb\xb7\xbf\x32\xb6\x92\xf4\x68\x52\xf5\x51\x89\x75\xef\x63\xdb\x62\x9e\xee\x3d\xe6\xa1\xaf\x49\x01\x4a\x82\x09\xa5\x74\xef\x13\x50\x62\x49\x9d\x7b\xca\xf3\xc0\x99\x90\xaf\x7a\xee\xa1\xfd\x25\xda\x6b\x88\x2d\x74\xe5\x60\xb4\x68\x10\x98\x0d\xae\x30\xc1\xd1\x8b\xfa\x47\xa7\xec\x29\xfd\x46\xac\x13\xbe\x44\xac\x52\xba\xf6\xd7\x25\x11\xec\x12\x46\x33\x9a\x68\x40\xe1\x2c\xbb\x26\x99\x23\xe1\xbc\x9d\xdd\x78\xca\xd9\x8d\xaf\x4b\x42\x3d\x6c\xc6\x24\xd1\xaa\x54\xe0\xa4\xc7\xfb\x03\x6c\x28\x02\x59\x70\x30\x81\x9a\x6d\x2c\xc9\x27\xa1\x0c\x8d\x7d\x43\x23\xac\xba\x42\xac\x2b\xac\xba\x42\x8c\xee\x25\x04\x4f\xa4\xe4\x20\x70\x52\xaf\xc2\xd1\xd2\x89\xd6\x64\x16\x29\xb4\x5a\xe8\xbd\xf2\xae\xc3\x4a\x1d\x81\xd9\x15\x67\x5d\x31\xd7\x15\x7f\xb7\x89\xb9\x7b\x4c\xdf\xdc\x73\x82\x44\x7f\x6f\x13\x24\x12\x94\x90\x99\x05\x8f\x0c\x83\x8c\x27\x33\x0f\xc6\x5a\xa4\x2c\xab\xd4\x2a\x3d\xd8\x97\x98\x0a\xb4\xa4\x9a\x02\x08\xae\xe8\x19\x5b\x0f\x32\x32\xaf\x36\x1b\x9e\x6d\x79\x2c\x6d\xd0\xc8\x7a\x03\xda\x49\xbc\x3f\xc8\x28\xf2\x2a\xb5\xc1\x48\xb4\xf1\xb4\xc1\x04\x40\x59\x89\xf5\x82\xf7\xe6\xe1\x5a\x61\x3b\xaf\xf3\xc4\xf3\x3a\x5f\x9b\x9a\x78\xd0\x5c\x51\x5f\x22\x47\x56\x36\xa0\xb4\x89\x43\x56\x2e\xe3\x20\x55\xfb\x24\x9d\x0d\x28\xdb\xbd\xbd\x4d\x43\xd4\x99\x42\x8b\x05\x79\x4f\xe1\xdf\xb5\x7d\x37\x3e\x31\xf5\x80\x69\xa4\xed\xa8\xf7\xdb\x9f\xf8\x41\x4e\xf0\x4b\xca\x4e\x70\xe0\xda\xaf\x9e\x18\xf2\x9c\x90\x68\xbc\xa2\x89\x21\x47\x7c\x24\x82\xeb\x70\xd8\x6a\x85\x79\xf3\x2c\xd0\xa3\xa9\xb7\x9e\x92\x8a\xbf\x0d\xc3\xba\x6e\x4b\x1e\x38\xa4\xd9\xce\x26\x3d\xcd\x6c\x52\x67\xbb\xcb\x77\xb5\x51\xe4\x7a\x3d\x27\x3c\x99\xa1\xc8\xcc\xd6\x38\x04\x29\xfd\xd0\xb4\xa9\x14\x71\x80\xa4\xb4\xa2\x37\xaa\xc9\xa5\xd2\x77\x0a\x99\x9a\x92\x63\xae\x38\xed\x2a\x4c\x1c\xfd\x60\x56\x7c\x13\x9a\x5c\x54\x1f\xf1\x8b\x8d\xcb\x2a\x64\x2e\x4a\xe4\x12\x1b\xcd\x81\xa8\x35\x91\x9d\xe8\xde\xc7\x16\x90\x12\x74\x4e\x35\xb9\xd3\xa2\x0d\xfd\x1e\x90\xab\x9a\x53\xe9\x6d\x52\x87\x94\x3b\xde\xc7\xd6\xe8\xa6\xe4\x94\x3b\x2d\xeb\xd0\xef\xdd\x42\xe3\x4d\xd1\x66\xbc\x69\xa1\x09\x1b\x85\xbf\x16\x64\x1c\x01\xd2\x8f\xcf\x84\x88\xcd\xf1\xe0\x02\xdd\xba\x3a\x8f\x8b\x1f\x39\x24\x7c\x4c\x4b\x39\x38\x7d\x82\x03\xd5\xba\x10\x4e\x05\xc7\x4c\x9d\x69\x19\x11\xc7\xa6\x07\x59\x00\xeb\x4c\x7c\x20\xeb\x49\xd2\x33\xdd\x6a\xaa\x39\x1a\x29\xd2\xd4\x39\x2d\x4d\xc8\xc5\xdf\x03\x92\xd6\xb2\x7e\xab\x92\xb1\x92\xc6\x1a\xa9\x5f\x2a\x0e\x72\xe9\xe3\x94\x5b\xd0\xd8\x38\xcd\xd9\xdd\x65\xd6\xed\x66\x50\x46\xa2\x3b\xa0\x5f\x1d\xc9\x29\x11\x20\x91\x86\xb4\x51\xab\x10\x69\xd9\x28\xde\x1b\xa2\x53\x11\x05\x52\x44\xc2\x4c\xb9\x38\x7d\xc7\xa3\x1d\x47\x25\x71\x2a\x5d\x74\x88\x9c\xe0\x49\x92\x92\xca\x4f\x44\x43\x5d\xb4\xd1\x04\x6b\x09\x56\xc5\x16\xd0\xc8\x8f\x88\xaa\x21\x5e\x22\x3c\xfa\x3d\x68\xc8\x91\xde\x12\x91\xaa\x0e\xc1\xaa\xd8\x1a\xdd\x94\x9c\x72\x8b\xc8\x00\xf2\x8e\x40\xd5\xd7\x03\xf5\xab\xdc\x17\x55\x33\x40\xc3\x11\x0d\x8f\xb4\x3c\x13\x79\xa8\xe1\xaa\x9a\xcd\x3a\x8c\xd7\x32\x63\x87\x3d\x13\x17\xb5\x9c\x25\x9a\x49\xcc\x5a\x8a\xb5\x72\xad\x25\xa2\x8e\xf4\x4b\x44\xd4\xca\xc8\x5a\x6a\xb6\x72\xb4\x95\xad\x1d\x69\x9b\x4a\x6a\x65\x24\xd5\x57\x53\x1e\xef\xd0\x35\xef\x52\x71\x87\xae\x13\xa5\xb7\xd4\x5f\xf3\x43\xc3\x21\x2d\xd7\x74\xf9\x28\x95\xd4\x50\x7f\xac\x6f\x3b\xe9\xfa\x08\x7b\xb8\xb6\x5a\xf7\x7e\x5a\x77\xcd\xbd\x6d\x5b\x2d\x7c\x77\x2d\xbc\xe6\xb1\x81\x5b\xad\xfc\x10\xad\xbc\xe6\xb1\x85\x2b\x80\xfc\x3d\x79\x28\x3e\xd7\xad\x8d\x5b\x7b\xe3\xe9\xed\x8d\xed\x74\xfe\x53\x4e\xe7\x6f\x0d\x90\x5b\x0d\x90\x35\xb7\xa9\x6e\x4d\x90\xfb\x98\x20\x6b\x1e\xc5\xba\x35\x42\x1e\x66\x84\xac\x79\xe0\xec\x5a\x93\x05\x5b\xaf\xdf\x6f\x70\xf1\xe7\x2b\xd8\xa7\x2c\x75\xa4\x8b\xf8\x7c\x10\x1d\x2c\xe8\xd9\x5b\x95\x14\x91\x5f\x50\x4d\xf7\xb7\x91\xa8\x24\x0f\xca\x8a\xa6\x06\x07\xba\xbb\xea\xd3\x5f\x7f\xfa\x22\xa6\xe2\xb3\x30\xd8\xb6\x4b\x58\x5f\x68\x09\xab\x13\xc6\xed\xab\xf4\x89\x96\x1c\x82\x23\x48\x49\xad\x22\x43\x2b\xa1\xe3\xa2\x30\x21\x48\x59\xb2\xe3\x94\x32\xe4\xd4\xa0\x03\xe2\x1b\x7f\x0e\x88\xf3\x50\xc4\x99\x98\x89\xc7\x4f\x2c\x15\xe0\xa9\x3c\xa9\x20\xa0\x98\x40\xe1\x45\x1f\x5a\xe9\x32\x4b\x9f\x23\x7b\x3b\x4f\x11\x04\x2c\xd5\x87\x3f\xc4\x87\xde\xe1\x50\x92\xf2\x78\xb0\xd2\x67\x1e\xc2\x42\x3b\x23\xb3\x83\x55\x68\x3c\x81\x55\x8e\x98\xde\x4b\x32\x2e\xb5\x0e\x99\x03\xef\x88\x0b\xb9\xf1\x59\x00\x23\x88\xf4\x6c\x20\x56\x17\x20\x0c\x31\xa4\x52\x1e\xbf\x77\x96\xd4\xbc\xf2\x21\xae\x82\xdb\x48\xe0\x2e\x52\xba\x42\x7a\x75\xe0\x6c\xe4\xea\xf8\x89\x30\x64\xf5\xda\x40\x2e\x54\x46\xd8\x68\x3a\x70\xe4\x70\x0e\xde\x51\xbb\xb4\xf6\xc4\x23\xc9\x10\x6b\x1b\xbb\x09\x77\x6f\x62\x35\xa2\x5e\x12\xc2\x24\x41\xe2\x8f\x49\xff\x22\x32\x11\x0b\xd8\xf9\x26\x97\x4c\xdf\x49\xea\x5c\x44\x52\x94\x30\x98\x51\x84\x68\xc8\x47\x0b\x8e\x4a\x4f\xb9\xa8\x3e\x1a\x34\x98\xe8\xfb\x42\x43\x02\x32\xa1\x78\xb4\xaa\x2c\x9d\xc5\x8f\x2f\xe8\x5e\x26\xfd\x40\x2e\x79\xd1\xa6\x4a\x89\x9a\xca\x50\x71\xd0\x60\x62\x22\xbd\xb5\xd1\xb4\x72\x31\xdc\x85\x4e\x65\xd0\x5d\x2a\x39\xe5\xa6\x1a\x53\x3b\xee\xb6\xc0\xf5\xfb\xde\xc0\x7d\x2b\xce\xe5\x8b\xcc\xd3\xe3\xac\x1e\xcf\xf5\xd9\xb1\xcf\xaa\x0b\x6c\xbc\xc0\xe4\x7d\x11\xb0\x20\x1e\x16\x84\x47\x87\x5f\xfb\x7c\xdc\x6b\x67\xa2\xa1\x48\x69\x2d\xed\xb5\xf4\xd8\xa1\xd0\x44\xb3\x2d\x1d\xd7\x94\xdd\xd2\x7a\x4b\xff\x1d\x8e\x48\x25\xb5\x74\x6c\xb6\xae\xec\x4f\xeb\xca\xbe\x55\x2c\xcf\x47\xb1\x3c\xc8\x4b\xff\xd9\x28\x1a\xbb\xa8\x68\xec\x4d\x8a\xc6\x3e\x44\xd1\xd8\xbb\x28\x9a\x35\xd7\x70\x96\x15\xcf\xd6\xbd\xff\xcb\xc7\x3f\xd8\xaa\xd0\x07\xa9\xd0\xed\x42\xc1\x53\x2e\x14\x3c\x91\x9e\xe4\x91\xde\xac\xa3\x4c\xda\xa8\x2c\x80\x0e\x12\xab\x0f\x86\x82\xbd\x89\xe8\x86\xef\x81\x73\xd2\x44\x4e\x8b\x38\x03\x42\x33\x2a\x60\x04\x0d\xf1\x6d\xa0\x09\x29\xe3\xfc\xd3\xe8\x54\x11\x40\x4a\x4f\xcd\x8c\x22\x5b\x2a\x9a\x70\x09\x81\xc8\x59\x1b\xdb\x99\xc8\x92\x68\xbd\xb4\xf3\x58\x92\x26\x24\xb0\x41\x8e\x06\x34\x1e\x6b\x0b\xe0\xad\x58\x80\xfa\x23\xed\x70\xd8\x2a\xd9\xdb\x94\xec\x9a\xab\x14\xeb\x8c\xef\xb6\x5b\x27\xbe\xc1\xd9\xf3\x07\x6d\x9d\xe8\x49\xb6\x83\x05\xb1\xd7\x97\x88\x4f\x61\x30\xf4\xe4\xcf\x82\x6c\xea\x0a\xae\xc5\x09\xf0\x67\x61\x13\x6c\xe7\xa2\xbf\xd4\x5c\x74\x7b\xce\xc8\x76\x37\xc5\x9b\xb8\xf8\xe3\x89\x45\x8d\x89\x03\xe6\xcc\x82\xa4\xa0\x57\x5a\xa6\x5b\x4a\x96\xc4\x9d\xc6\xd7\x39\x39\x48\x0a\x5d\x13\x37\x37\xaa\x78\x47\xe6\x96\xe6\x3a\x3e\x09\x0b\xca\x52\xa1\x81\x3b\x5a\x7d\x33\xb4\xf8\xa5\x9d\x8f\x2b\xd1\x64\xfc\x58\x32\xe6\x71\x90\xaf\x75\xdc\x6f\x45\xeb\xce\x5e\x19\xfc\x11\x04\x38\x91\xb6\xa5\x3b\x50\x28\x6c\x1c\x04\x4b\x96\x91\xf1\x64\xca\x70\x41\x69\xb1\xd8\x00\x0a\x3b\x2d\x41\x39\x52\x97\x06\xa5\x86\x06\x49\xd1\x73\x74\xdc\xd1\x98\xde\xd0\x66\x66\xec\x67\x4c\x0f\x40\x4b\xdc\xd8\xbd\x78\x6f\x62\x0e\x4f\x7b\x85\xb5\x6c\x72\x53\x2c\xe1\x10\x7f\x63\x04\x2b\x03\xa9\x6e\x13\xf7\xe0\x53\x87\x82\x17\xa4\xe5\x6d\xb4\x11\x3d\x99\x49\x44\xfc\xf8\x28\x69\x4e\x87\x47\x7f\x05\x65\xa9\x07\x3e\x3a\x79\xc8\x40\x7d\x37\xc9\x21\x40\x46\x88\x10\xeb\x59\x10\x86\xba\xce\x29\xa7\x10\x04\xd1\x40\x48\x12\x06\xb8\xa6\x9d\xd9\x14\x1e\x40\x83\xe2\x26\xa2\x14\x73\x09\x6a\x6c\x42\xf8\x03\x67\xd7\xbf\x4e\xa7\x7c\x15\x37\x7b\x0b\x4d\x9b\xe0\x05\x69\x08\xeb\xa2\xab\x48\x20\xf8\x73\x45\xf3\x5e\xd2\x99\x48\x74\x5e\x90\xe5\x15\x3c\xe9\x1f\xc9\x49\xd1\x08\x41\x44\xe7\x3d\x29\x09\xc5\x43\xc4\xbc\xa7\x99\x77\xae\x48\xc0\x4a\x4e\xee\x45\xfd\x80\x4d\x44\x4c\x86\x76\x98\x67\x8a\x63\x6e\x7c\xa0\x3b\x6c\x39\x27\x8f\x0a\xed\x9b\x5c\xba\xdd\x4e\x88\xa4\x1b\x87\xf9\xc2\xd3\x3d\xaa\x19\x69\xeb\xc9\x50\xd4\xcd\x96\x18\xc3\x51\x59\xc2\x47\xb1\x6d\x80\x0b\xd2\x8a\x2e\xc4\xb1\xb2\xa7\x4c\xd4\x03\x1c\x3d\xd4\x23\x12\x62\x5f\x2a\x41\xc7\x25\x71\xde\x0f\x4f\x85\x02\x80\x26\xd4\x78\x0c\x64\x8d\xf7\x36\x49\x06\x1a\xcc\x18\x59\xe7\x90\x69\x2b\xe3\x76\x1a\xf9\xc9\x9c\xf3\xb7\x42\x7c\x2b\xc4\x1f\x36\x93\xfd\xf8\xc7\xd2\x3c\x9f\x59\xd6\x67\xeb\xc3\xbd\x55\x4f\x5f\x4c\x3d\x6d\xa7\x68\x9f\x38\x34\xcb\x56\x5f\x6d\xf5\xd5\xc3\xa7\x85\xb7\x07\x12\x7d\xeb\x13\x96\x1b\x75\xf7\x75\xa0\x5d\xdc\x54\x20\x88\x9f\x15\xa2\x53\x82\xd7\x44\xe9\x8a\x88\x98\xc7\x55\x12\x07\xd2\x52\x08\xb0\xa0\x89\xab\x44\xa0\xa7\x27\xd3\x4f\x47\xdf\x99\x39\x60\x49\xca\x98\x40\x6d\x55\xde\x60\x67\x49\x34\x7b\x10\xda\x45\x21\x93\xb6\x1e\x68\x4e\xcf\x52\x90\x28\x73\x22\x7a\x5e\xc7\x1d\x36\x1b\x08\xd4\xbc\x9d\xa7\x7d\x16\xf3\xb4\xed\x19\xd1\x1b\x9a\xa6\x15\x86\x09\x77\xa8\x1b\x8f\x60\x91\xcb\x5c\x1e\xfb\xc6\x23\x58\x30\xcd\xec\xa1\x30\x6d\x06\x26\x99\xbc\x72\x9d\x0c\x54\xc4\xdb\x37\x9a\xf9\x2b\x77\x28\xcc\xb1\x7f\xd0\x69\xc6\x4a\x62\x83\xa4\x58\x6c\x51\xb7\x01\x79\xcf\x89\x79\xb9\x45\x54\xc6\xdb\x37\x52\x50\x93\x94\xbc\x6f\x93\x54\x03\x23\xc5\x97\x60\xd4\x6d\x22\x35\xe9\x36\x20\x29\x4e\x8e\xd5\x22\x42\x49\x8a\xfb\xb5\x49\x37\x60\x52\x7c\x19\x4c\x4b\x8d\xba\x0d\x4e\xd8\x28\x29\x62\xab\x94\xbc\xb9\x55\xb7\xcc\x68\xd6\x21\xb8\xd0\x24\x6a\xac\x6b\xe1\x32\x32\x3e\xa3\x9e\x12\xa4\x8b\x32\xda\xa6\x91\xd9\x8e\x75\x6d\x33\x9d\xa5\x63\x19\x92\xa1\x85\x1f\xe0\x20\x28\x65\x13\x2e\xf3\x29\x2e\x58\x14\xeb\x75\x9e\xfa\xc7\xa5\xfa\xef\xde\x7e\xd9\x99\x47\x6b\x43\x84\x45\x75\x10\x6b\x16\xa1\xa9\x26\xc4\x3e\x88\x90\x45\x23\xb3\x6e\x5e\x48\xdd\x90\x82\xfa\xa1\x24\xf5\x23\x29\x71\x1a\xd2\xda\xda\x01\xd7\xd7\x92\x35\xea\xfb\x54\x72\xca\x2a\x5c\x6a\xc7\xdd\xfb\xa1\x5a\x3c\x28\x1e\xed\x05\xde\x8e\x72\x38\x99\x09\xb5\xbd\xe0\xe3\x54\x1d\x49\xcc\xba\xf1\x09\x61\x01\x11\xd8\xc6\x5a\x3b\xe8\x76\xdd\x75\x80\x22\x45\x8a\xd7\x16\x07\x10\x75\xe1\x75\x77\x78\x6a\xc7\xdd\xfb\xa1\x5b\x7c\x50\x3f\xa4\x88\x1d\x49\x55\x63\xc9\xa1\xa9\x2d\xc4\xbe\xe0\x6f\x54\x6e\x4d\x0b\xeb\x9f\x26\x80\x1b\xc2\x35\xb4\x48\x11\x81\xa0\x1f\x6a\xb4\x50\x7f\xf0\xd7\x47\xbc\xa4\x1a\x6a\x3b\x8c\xa7\xf6\xac\x71\xf6\xe7\x8d\xc3\xd5\x9e\xdd\xf7\x65\xa4\xef\xcd\x03\x8b\x05\xc3\x74\x81\x29\x24\x07\x2e\x74\xa2\x04\x11\xc7\x8c\xd2\xd3\x13\x8e\x8c\x62\x28\xcd\x18\x5a\x53\xa7\xd0\x9a\x84\x12\x6e\x62\xea\xc3\x0e\x8e\x50\x10\xac\x6f\x5d\x6f\x94\xc2\xf1\x14\x8e\xd1\x64\xa6\x24\x04\x8a\x45\x58\xf3\x4f\x8c\x70\x7e\x23\x97\x4a\x01\xca\xc9\x28\x78\x9a\x68\x87\x0f\x83\x9f\x5a\x42\xf0\x97\x51\x1d\x37\xfb\xa7\xf4\xda\xf8\x25\x54\xc9\x76\x13\xea\xf3\x3e\x26\xf7\xeb\xd0\xe5\x6b\x8d\x37\xb6\x82\xec\xee\xd0\x53\x2b\xe8\xe1\x2b\xb2\x29\x6e\xe8\x99\x5e\x41\x17\x5f\x97\x95\x71\x5b\x0f\xb7\x62\x73\x63\x62\xf3\xee\x8b\xf1\x5f\xc8\xa0\x5b\x2f\xca\xda\xc6\x47\x39\x52\x82\x09\x8d\xdb\x00\xe6\xe2\xe4\x37\x98\xee\x95\x6b\xef\x4d\x37\x97\x93\x94\xcb\xfa\xcc\x81\xf2\x34\x1f\xe7\xb5\x27\xa5\x20\x45\xfd\x23\x4c\xbd\x84\x92\x7e\x15\x08\x9a\xd2\x53\x32\x4e\x6f\x49\x08\x4e\x46\x0f\x01\x9a\xb0\xb4\x56\xa7\xa5\x43\x69\xc3\x43\xc7\x58\x77\xdb\xa0\xf3\x65\x4d\xbd\xf5\x62\x94\x3d\x8d\xa9\xf7\xf8\x61\xcf\x6e\x13\x8c\xeb\x2e\x95\x7f\x2d\x26\xce\xad\x2b\xad\xcf\x86\xb1\xe9\x7c\x7f\x41\xa7\x86\xf0\xb8\xee\x6f\xc8\x3e\x08\xde\xd6\x4f\xb4\xf0\xaf\x6d\xf3\xac\x90\xf3\xa3\x62\x10\x7e\x73\xdc\x7b\x0b\xe8\xd4\x32\x29\x7c\x55\xd6\xcd\x75\xfd\xd2\xcb\x24\xf1\x9c\x6d\x9b\x7b\xb8\x17\xdc\x49\x4e\xf4\x66\xce\x0f\xcb\x62\xfe\xa6\xb8\xd8\xba\x37\x0f\xde\x64\xe9\xa4\x07\xd9\xfe\xd2\x02\x17\xfd\xd0\x61\x0b\x14\xc9\x0d\x89\x42\x83\xe8\xdc\xa5\xe3\x4b\x42\x7d\x92\x09\x0d\x4d\x28\x21\x1e\xa6\x15\xda\x73\xb5\x42\xe7\xb8\x17\xca\x81\xf7\x29\x6e\x5c\x5c\x0d\x6b\x4f\x43\x11\x10\x7a\xf7\xf5\xe9\x29\xed\x21\x5d\x94\xa3\x7b\x9f\x8e\x60\xb1\x6d\xb9\xc2\x80\xab\xf3\xc4\xfb\xe6\x04\x42\xd5\xbf\xaf\x4f\x23\xa4\x5c\x52\xd7\xef\xdb\xbb\xd4\x96\x58\xca\x0d\xa7\xb1\xdc\xcb\x2d\x78\xeb\xe0\xb9\x31\x07\x4f\xff\x90\x33\xe0\x6e\x21\xa9\x78\x27\x69\x4a\x20\x6e\x6e\x11\x22\x46\xc8\xa3\xb1\x84\xf4\xe9\x74\x38\xda\x0f\x87\xa6\xa9\x97\xcf\x97\x93\xbe\x00\x6f\x3c\x9d\xb7\xa5\xdc\xba\x9c\xdd\xdb\xe5\xac\x39\xf2\xa7\x73\xfc\x8f\x07\x1e\x44\x9f\x5a\xd6\xa1\x9c\x66\x77\x2c\xd1\x60\xff\x69\x15\x6b\x35\x39\x7c\xef\xfe\xd9\xb2\xcf\xc3\x98\xe1\xc9\x5c\xb9\xe4\xd6\xd1\xe2\x31\x7c\xb9\xbe\x82\x7d\x3c\x89\x77\x64\xfb\x4b\xfc\xec\x9b\x60\x83\x3c\x0d\x52\x74\xf3\x1b\x19\x8a\x37\x06\x97\x4c\xb4\x2d\xd3\x89\x57\xb6\xf9\x6d\x8e\x7f\x4e\x6f\x78\xfa\xd6\x36\xbf\xf5\x59\xec\x36\x8d\x42\x65\xfb\xdb\x68\xd3\xa6\x8c\x28\x36\x62\x0e\x61\xdb\xdf\x64\xca\xe9\xe4\xeb\xa5\x53\x0a\x6f\x7f\xd7\xd8\x42\xf3\x55\xb8\xcc\xaf\x75\xee\x68\x83\xc2\x25\xcc\x2a\x90\x2a\xee\xac\x8d\x41\x2d\x15\x1d\xb8\x26\x3d\x78\x93\xce\x24\x95\x1b\x72\xbf\xff\xb2\x54\x63\xc0\x90\xa5\x95\xe2\x03\x08\x9a\xe8\xa3\x29\x06\x6f\xc8\x6c\x14\xc1\x76\x2c\xb5\x47\xa0\xaf\xfb\xf8\xc0\x6f\xd2\x22\x79\xd6\xae\xa4\x1d\xbb\xe1\x7a\x5a\xbd\x26\xe0\xea\x17\x23\xac\xc6\xda\xb0\xbd\xfd\xef\x2b\xc9\x85\xdc\x65\xbd\x69\xef\x9f\x24\x52\x2e\xef\x01\x6a\x23\xd2\xf0\xfa\x85\xd2\xad\xc1\xb0\x11\xcf\xcc\xa3\xd1\x78\xbb\x81\x7e\x52\x7d\x3c\x9d\x8c\xb3\x8b\xc9\x68\x3c\x9f\xed\x0d\x84\x01\x4b\x0c\x27\xa5\x44\x43\x9c\x93\xb3\x75\xb0\x3e\x33\x60\x4c\x0c\x64\x47\xb3\x15\x82\xd8\xc3\xdb\x2c\x80\xe2\x44\x48\xc6\x45\xcf\xee\xa4\x8c\x88\x9c\x30\xb3\x8c\xbc\x27\x91\x9b\x88\x7c\xb4\xc3\x0e\x69\xa4\x3b\x0d\x5a\xc5\xf8\x80\x9c\xb6\x89\x08\x6d\xee\x3a\x71\x13\x3b\x70\x5f\x53\x70\x11\x61\xb6\x41\x98\xbd\x01\x61\xf6\x41\x08\xb3\x2b\x10\x86\x76\x86\x4d\xa7\x77\xc7\x23\x96\xdb\xe3\x8c\x03\x08\xda\x63\x63\x31\x49\x23\x7e\x24\x8f\x0f\xd1\x55\xdc\xd0\x59\xcd\x14\x0a\x5f\x77\xbe\x16\x58\x22\x59\x30\x71\xda\x48\xc6\x93\x8e\xf1\x49\x28\x6c\x94\x20\x97\x08\x0d\xd2\x6f\x37\x39\x3f\xfe\x1c\xd8\x57\xc2\x68\xeb\xcf\x02\x75\x19\xef\x2b\xdc\x76\xdb\x31\xae\x23\x2f\xf8\xc4\x0b\x47\x4f\xc9\x8c\x8d\xb9\x7f\xd0\xdb\x86\xdb\xdb\x9e\xbb\x82\xc0\x1f\x4d\x4c\x35\x04\xde\x1f\x5f\xf4\xc7\x1e\x1d\xd0\x6d\xb7\x9f\x7e\xc9\x08\x81\x5d\x19\x72\xd4\x97\x22\x47\x3d\x39\x72\xd4\x93\x24\x47\x7d\x59\x72\xd4\x97\x26\x47\x0b\xf2\x84\x0e\xb9\xaf\x77\x27\x11\xb7\xc8\x00\x4e\xea\xce\x73\x57\xac\x3c\x83\x19\xb5\xed\xe6\xc8\xef\x79\x73\xe4\x23\x8d\xf0\x1c\x79\x3f\x74\x43\x4a\x46\xcd\xcb\x6d\xcd\x40\x71\xd0\x17\x50\x87\x48\x11\x35\x89\x05\x17\x6b\xd5\xc4\x90\x9a\xb4\x85\x51\x91\x59\x29\xd0\xa5\x4c\xd3\xd1\xf1\xd4\x93\x5a\x49\x48\xe2\x26\x13\x11\x1a\xcc\xea\x33\xf8\xb7\x1b\xfc\x9e\xc5\x30\xf2\xef\xa3\xed\x28\xb2\x55\x49\x2e\x93\x2e\x1e\x60\x66\xbc\xc4\xfb\x40\x9b\xf8\x85\xcf\x42\xf4\x44\x09\x68\x66\x61\x5a\xca\x22\xc8\xf9\x49\x24\x47\x9b\x38\x39\x54\x07\x36\x34\xf5\xb7\x68\x4d\xe1\x8f\x4b\x15\xd0\x90\x49\x81\xd4\x14\xbe\xb5\xb6\xb3\x7a\xf7\x42\x82\xe7\x32\x36\x25\x86\x70\x34\x71\x7b\x33\x89\x05\x4b\xde\x4b\xf8\x94\xfc\x7f\x78\x0c\x76\x6a\x54\x8c\x23\x6d\x69\xf1\x99\xe6\x6f\xe8\x37\x7a\x9f\x1b\x0a\xe2\xa8\xe3\x7e\x64\xcb\x29\x6a\xa2\xb4\xa2\xd7\x94\x4d\x1c\xf7\x21\x42\x96\x02\x3b\x46\xc0\x49\xd7\x01\x68\x9c\x4a\x0a\xb5\xa3\x39\x6a\xdd\xe0\x63\x9f\xe3\xb9\x7d\xd1\xf1\xd2\x44\x1f\x4d\xe2\x16\xe5\x63\xb8\x55\xc1\xc1\x73\x11\x0d\x11\x1b\x3f\xb9\xd3\x79\x1a\x4f\xb4\xee\x72\x90\x7e\x37\xbb\xda\x12\xa9\xaa\xa5\xb2\x48\x75\x07\x1d\x3a\x6c\x48\xb3\x21\xd5\x84\x81\x1e\xf0\x89\xbe\x5b\x82\xec\x10\xa9\xa9\xe7\x30\x23\x76\x8e\xd2\x07\x07\x5d\xfc\x75\x78\x61\x7b\x44\xc5\x53\xba\x9e\x6c\x25\xd3\x63\x9c\x17\xf1\xe5\x25\xd5\x7a\xfe\xde\xdf\xed\x51\x0c\xcf\x35\x48\xd8\xf3\x97\xc6\xdb\xb9\x8c\x27\x9d\xcb\xd8\x8a\xe7\xc7\x39\x6b\xa0\x27\x86\xe3\xaf\x21\xd7\x83\xb8\x53\x32\x9d\xaf\xa9\x7d\x1c\xa6\xaa\xee\xbe\xc9\xfb\x0e\x95\x2d\x78\x25\x3a\xc7\x2d\x58\x08\x9a\xa8\xc1\x7b\x42\x82\xb0\xa0\x95\x4b\x4d\x7b\xe0\x11\x00\xdb\xe0\xff\xdb\xe9\xa2\x07\x4e\x17\x79\x4e\x48\x32\xb4\x85\x17\x8c\x23\xd2\x15\xc1\x75\x78\xe5\x68\xa5\x12\x49\x64\xdc\x27\xef\x1e\xf1\xaf\x0e\xd9\xff\xf8\x5a\x6f\x3b\x35\xf4\x2c\xa6\x86\x7e\x1e\x16\xf3\x79\x39\xfd\x7b\x35\xf9\xce\x66\x87\x1e\x10\x4d\x2a\x0b\x20\xa2\x6a\xf1\x74\x8e\xbe\x8e\x31\x1a\x05\xf2\x06\x84\xb4\x31\x8e\x0e\x64\x06\xa9\x52\xbe\x23\x1a\x3a\x04\x41\x47\x0e\x91\x22\x97\x60\x4c\x53\x08\x12\x5f\x8c\xcb\x26\x0d\xd9\xa6\x2e\xee\xee\xe3\x81\xc8\x29\x70\x8a\xd2\x66\xb8\x8b\x51\xea\x38\x8f\x8b\x2a\x9c\x48\x31\xc4\xe5\x53\xef\xc9\xe4\xb5\x3e\x56\xe2\x52\x25\xd1\x10\x36\x54\xa7\xa2\x40\x7a\x71\x11\x85\x0a\xa2\x80\x6f\x68\x44\x53\xa5\xc1\x13\x41\xca\x78\x1c\x98\x0a\x44\xac\x3c\xc6\x8d\x43\xb3\x5a\x70\x08\x92\xbc\xe5\x9c\xa3\x10\xa2\x3c\x6e\x99\x35\x36\x9e\x18\x66\x62\x37\xd1\x88\x10\x12\x34\xd9\x3d\x09\x06\x22\xc6\xc5\x0c\x31\xc0\x1e\x07\x67\x55\x86\x64\x6c\x62\xa1\x36\xf3\xe0\x1d\xb5\xc5\x90\x63\x9e\x87\x78\x4a\x93\x17\x02\x93\x6c\xf4\xcb\x53\xa1\x86\xbd\x04\x65\x52\xf1\xb6\xed\x60\x4a\xa4\xde\xc7\x32\x48\x58\x05\x2f\xeb\x07\x03\xda\xbb\x2e\x02\x1f\x14\xc4\x8b\xc4\xb0\xa3\x85\x58\xa3\x6c\x8a\x8e\xea\x69\x66\xdc\xc7\x50\x7a\x21\xe8\xe6\xc9\x82\xe2\x4d\x5e\x92\xf3\xda\xd2\x7e\x12\xe5\x6c\x74\x92\xb7\xb2\x5b\x56\xa0\xa8\x83\x12\x0b\xa1\xdd\x81\x2e\xc4\xd0\xa4\x74\xfa\x76\xa0\x5a\xd2\x59\x96\x9c\x62\x29\x4a\x0d\x41\xeb\x98\x48\x01\x50\x6d\xdc\x29\xe8\x0c\xd5\xa2\x79\x5d\x0b\x27\x8f\x50\x19\x6b\x0d\xe0\xac\x8d\xd1\x0b\x6d\x2c\x4b\x4a\x89\x42\xd1\x71\x5a\x0b\xe0\xf1\x50\x38\x5a\x24\xd0\x8e\x0c\x51\x67\x6b\x7b\x2b\x46\x60\xb5\x36\x9d\x99\x49\x76\xa2\x33\xe4\xc4\x6e\x55\xfc\xd0\xd7\x7d\x75\xb1\x16\x1a\x92\xd5\xb0\xe0\x74\xce\x0d\xc1\xcd\x07\xaa\x8e\xe2\x2d\x1a\x10\x3a\x16\x4c\x71\x1e\x83\xa1\x06\x49\x9d\xa8\x16\x05\xa7\x14\x60\x10\xa8\xd8\x67\x45\x47\xd5\x38\xd3\xa0\x43\x02\xf7\x75\x35\xaa\xdb\xd9\x94\x1e\x81\x11\xcb\xb2\x1a\x9f\x9d\xf0\xcd\x93\x01\x29\xd5\x02\x6a\x1f\x14\x57\x0d\x1b\x14\x44\x73\xf2\x0d\x4d\x46\xc8\x18\xaa\xd1\x1a\x3a\x3e\x2c\x9d\x3a\x65\xa8\x2d\x5c\x37\x59\xc9\x5b\x55\x72\x19\xd7\x45\x55\x34\x5d\x95\xed\x16\x65\xc1\x45\x2c\xb8\x28\xff\x4d\x3c\x18\xc7\x92\xf9\x0a\x4e\xd8\x68\xde\x93\x41\x40\x61\x2b\x89\x22\x04\x25\xca\x88\x55\x6c\x8a\x8b\x67\x0b\x05\x90\xa2\xae\x46\xd3\x11\x6b\x3c\x56\xeb\xc0\x70\xda\xc5\x1c\xe2\x49\xf0\x8e\xec\x15\x61\xc1\x70\xaa\xd6\x05\x9a\x04\x71\x86\xaa\x95\x69\xad\xc8\x27\xe3\x5a\xd0\xb3\x76\x12\x9f\xc8\x8c\xa1\x95\x24\xac\x25\xba\x8a\xb8\x50\x77\x56\xc4\x5a\x68\x09\x2a\x01\x03\xd3\x6d\x82\x9b\x4d\xde\x9f\x51\xfd\xd2\x01\xa4\x86\x22\xf0\xd2\xde\x7f\x6a\x11\x37\xa6\xde\x3e\x4c\xc3\x21\x65\x68\xbe\x30\x9d\x1f\x67\xbd\xac\xf1\x81\x96\x55\xa8\xeb\x71\xdd\xde\xa6\xf4\x08\x0d\x2a\x8b\x7c\x27\x8c\x8c\x47\xc1\x11\x48\xd5\x02\x5a\xef\x1f\xe4\xee\xd9\xb8\xfb\x6f\x15\xdb\x37\xa4\xd8\xb2\xad\x7a\xfa\x7e\xd4\x53\xb6\x55\x32\xdf\xbb\x92\xd9\xae\xc4\xdd\x7d\x25\x6e\x93\x41\x90\xb6\xca\xf3\x1b\x52\x9e\x9b\x0c\xe2\xb4\x55\xc3\xdf\x8d\x1a\xde\x64\x5c\xad\xad\x42\xff\xae\x14\xfa\xd7\x13\xe4\xec\xdb\x5b\xea\xdf\xaa\xee\x6f\x48\x75\x6f\xc7\xbd\xdf\x91\xc2\xdd\x8e\x7b\xb7\x6a\x72\x83\x3e\x4f\x0f\x8a\x2d\xff\x35\xfa\x3a\x3d\xa8\xc3\x4b\xf1\xd0\xb7\x7a\xf4\x1b\xd2\xa3\x0f\xa3\x8d\x15\xd1\xde\xb7\x3a\xf9\xfb\xd0\xc9\x0f\x23\x9c\xa5\x60\xfa\x5b\xfd\xfe\x3d\xe9\xf7\xfb\x11\xcd\xf6\x7c\x82\x2f\x77\xac\xcb\xb7\xb7\x93\xb6\xef\x11\xb9\x35\x6a\xbe\x21\xa3\x66\x3b\x39\xf0\x1d\x19\x22\xdb\xc9\x81\xef\xde\x78\xd8\xba\x91\x3f\x92\xe1\x30\x2d\x87\xf3\xec\xc3\xe8\x64\x7e\xb6\x37\x50\x76\x90\x9d\x95\xa3\xd3\xb3\x79\xbc\x7f\x3f\xaa\xaa\x7c\x72\x51\x0c\x47\xf3\x8f\x7b\x03\xbe\x78\x6a\xc2\x2f\xa3\xe1\x3f\xbf\xc3\x78\x04\x0f\xf1\x38\x47\x99\x16\x03\x61\xa6\x1f\x19\x83\x35\x36\xbf\xa4\x1e\x55\xfb\x1b\x63\xe6\xb4\xbf\xf4\xde\xb7\xbf\x29\x98\x69\xf3\x4b\x86\x96\x6a\x7f\x63\xa0\xd4\xf6\xb7\x0e\xb2\x13\xf3\x10\xb5\x70\x19\x17\x62\x24\x3e\xc8\x40\x0f\x58\xb4\x07\x6d\xe9\x21\x4a\x49\x0f\x01\x19\xd6\x92\x52\xf2\xa0\x3d\x3d\x60\xf6\x54\x9c\x85\x10\x28\x38\x15\xdd\x89\x6f\xc1\x8f\xb2\xe9\xcb\x51\xbf\x97\x07\x0b\x10\x58\x84\x4d\x1f\x6e\x3d\x98\x76\xa0\xdd\xa0\xa1\x83\x9a\x1a\x55\xaa\xfd\x35\x5d\xd4\xd6\xa4\xe2\xdb\x5f\xd3\x25\x8d\x9a\x54\x54\xfb\x6b\xba\xa4\x95\xbe\xf7\xcd\x8f\x89\x28\x33\x5b\x8f\xa4\xe7\xeb\x91\xf4\x5d\x4a\x8d\xc7\x0f\xf4\xb7\x5d\x47\xbf\x6e\x1d\xfd\xbb\x94\x7b\xdb\x15\xa9\x67\xbc\x22\xf5\x5d\x8a\xc0\x6d\x4c\xc2\xed\x1c\xea\xf3\x9a\x43\xfd\x2e\x15\xc3\x76\x36\xe2\x29\x58\xb0\x37\xb5\xf0\x53\x59\x55\x07\x97\xd3\xab\x72\x61\x6a\xa1\x0d\x37\xa2\x14\x93\xe1\x50\xed\x0b\x26\xe2\xe9\xb8\x4c\x31\xe9\x0e\x55\xef\x0d\xe6\xb9\x43\xd8\x39\x31\xc8\x5e\xfe\xa9\x5f\x85\x39\xcb\xc1\xca\xc2\x83\x10\x8c\x2e\xf1\x60\x5c\x9f\x5b\xb0\xee\x80\x66\xd3\x98\xd0\xa0\x35\x93\x02\x7c\x60\x0e\x82\x66\xc2\xd3\xef\x2c\x37\x60\x03\xb3\x60\x44\x6e\x41\x79\x26\x38\xa8\xb0\x5c\x16\xb3\x60\xcd\xa1\x2a\xda\x86\xf3\x5c\x9e\x81\xdd\xb7\x98\xc9\xd6\x39\x39\x0b\x60\x99\xf0\x43\x01\x5a\xe4\x0e\xbc\x67\x1a\x54\x2e\x24\xf3\xa0\x4c\x2e\xe4\x0c\x79\x8f\x69\x10\x16\xdf\x28\x26\x64\xb1\x58\x82\x65\xe6\x50\xd5\x35\x71\xba\xca\x3b\x85\x11\xcc\x6a\x44\x9d\x15\xd3\x39\xa1\x6a\xb6\xf7\x69\x50\xfc\x3e\x9a\xe5\x43\x7c\x35\x78\xd5\x22\x71\xff\xf7\xd1\x8c\xf2\xb1\xc1\xbb\x62\xba\x9c\xfe\x53\x31\xad\x93\x2f\xdf\xbd\xab\xca\x15\x39\xe8\x7d\xca\x34\xac\x26\x97\x27\xcb\x79\x0e\xf0\x75\x9d\x05\x49\x66\x45\x16\x7c\x9d\xb2\x9c\x4e\x47\x2b\x0a\xf9\xcf\xe9\xa8\x2e\x83\x7a\xbb\x94\xa1\x39\xc1\x81\x0d\x2e\x46\x2b\xd2\xeb\xd0\x9c\x6c\x30\x1f\x0d\xff\xb9\x9c\xde\xcc\x95\xb1\xc1\x2c\x86\x6a\xc8\x2f\xaa\x49\x2f\x4b\x27\x84\x03\x1b\xbc\x9b\xfc\xbe\x94\xe1\xa7\xc9\xef\x31\xf1\xac\x2c\xe6\xf9\x79\x71\xd1\x4d\x4c\x47\x98\xb2\xc1\xbb\xb2\xaa\x72\x02\x44\xef\xdb\x9a\xa1\x3e\xb3\xbf\xbd\xfb\xbf\xe5\x70\x0e\x27\xe5\xfb\xd1\xb8\xfc\xfb\x74\x72\x51\x4e\xe7\x1f\x77\x7a\x28\x65\x83\x62\x5c\x54\x1f\xe7\xa3\xe1\x6c\xc0\x46\x70\x52\xce\x86\xd3\xd1\xc5\x7c\x32\x3d\x98\x8c\xdf\x8f\x4e\xfb\x99\x7f\xed\x82\xec\xb7\xdd\x5d\x36\xb8\x1c\xc7\xc2\x4f\x06\x3f\xec\xcd\x3f\x5e\x94\x93\xf7\xd9\x87\xd1\xf8\x64\xf2\xe1\xc5\x8b\xf8\x0b\x67\xc5\xec\x6f\x1f\xc6\x4d\xe5\x83\x83\xaa\x98\x8e\xe6\x1f\x91\xcf\x67\x83\xdd\x26\x5b\xf7\x35\x14\x27\x27\xfd\x8a\x77\x3f\xb3\x01\xbc\xbc\x98\x4e\xb0\x3f\xb3\x97\x23\xcc\xf5\x72\x36\x1d\xbe\x9c\x51\xf2\xcb\xe1\xe4\xfc\xbc\x9c\x0e\xcb\x3c\x3e\xc3\x7c\x36\x78\xf5\xfe\x72\x3c\x9c\x8f\x26\xe3\x9d\x39\x2b\xd9\x74\xf7\xd3\xe0\x72\x56\x66\xb3\xf9\x74\x34\x9c\x0f\x5e\x5f\x03\x19\x36\xf8\xc7\x3f\xca\xd9\x9b\xc9\xc9\x65\x55\x0e\xd8\xa7\xab\xa2\xba\x2c\x5f\xfd\xc0\x3f\x13\x1f\xa4\x3a\x12\x2b\xb4\x00\xff\x4b\x31\x9c\x4f\xa6\x1f\x3b\x6f\xfe\x7c\x7e\x51\x4d\x3e\x96\xe5\x8a\x57\xff\x39\x9d\x5c\x5e\x74\xde\xff\xaf\xcb\x77\x55\x37\xdf\xdf\xcb\xd9\xa4\xf3\x78\x30\x19\x8d\x7f\x2a\x4e\x3b\x6f\x7e\x1a\xcd\x87\x93\xd1\xb8\xf3\xe6\x7f\x97\xdd\xa7\xff\x9e\x8c\x7b\xc5\x5f\xf4\x9a\xf1\xf7\xc9\xe5\xf8\xa4\xdb\xac\x83\xb3\x72\xf8\xcf\xce\x8b\xff\x31\xa9\xaa\x62\xfa\xd3\xa8\xaa\xba\x75\x16\xe3\x6e\x9e\x83\x69\x79\x32\x9a\x1f\x14\xd3\x93\xa5\x0f\xbb\x45\x5f\x4e\xbb\x3d\xf9\x79\x3e\x99\x76\x5b\xf2\xdf\x45\x55\x95\xf3\x6e\x86\xb3\xc9\xc5\xc5\x68\x7c\x7a\x50\x4c\xbb\xaf\xff\x3e\x3a\x3d\xfd\xb8\xd0\x80\x3a\x6b\x1f\x32\x07\x45\x35\xbc\xac\x8a\xf9\x64\xba\x77\x35\x19\x9d\x64\xfc\xf5\x55\x31\xcd\x46\x7b\xd3\x9d\xd5\xb4\x73\x39\x1f\x55\xb3\x97\x2d\xc5\xe7\x43\x22\x79\x24\x9e\x5d\x36\xbe\xe5\xb3\xd9\xd5\x69\x3e\x2f\x4e\xf3\xd3\x72\x5c\x4e\xb1\x4e\xfa\xec\xf5\xca\xd6\xac\x52\x6c\x77\x9c\x2f\x97\x9e\xc9\x43\xdf\x9c\xbe\x8e\xe2\x5d\x1f\x77\x8e\x67\xe7\x4c\x32\x79\x28\x7d\xf7\x45\x2e\x8f\x75\xe7\x0b\x2c\xe2\xed\x1b\xcf\x94\x3c\xd6\x87\xd2\x1f\x2b\x59\x9b\x3d\xed\x9f\x7b\x4d\x75\xa3\x5a\x3a\x94\x06\xac\x3b\xb6\x87\x42\x34\x2a\x87\xe7\x82\x89\x2b\x0d\xd6\x9d\xad\xac\x2a\x1d\x5e\x71\x87\x00\x1e\xcd\x39\x17\x92\xce\x65\xe2\xf5\xd5\xd3\xa9\x48\xf1\x4a\xc7\x24\xa5\xab\x7d\x78\xad\xba\xad\x55\x6a\x3a\x59\x4a\xd6\x57\x1f\xcf\x8c\xa4\x2b\x9d\x5a\x95\xae\x1b\xa8\xd5\x74\xfa\xea\xa9\x97\xcd\x3f\x4f\xe7\x42\xc5\xab\xee\x74\x7d\x03\xb5\xda\x1e\x84\xb1\x8b\xbc\xbe\xea\x4e\x17\xe9\xc0\xa9\x74\x95\x0f\xaf\xd5\xf5\x20\x2c\x65\xe7\x9f\x4e\x87\x7c\xe1\x95\x1a\x91\xae\x1b\xa8\xd5\xf7\x20\xdc\x22\xd5\x76\xaa\xe1\x1d\x50\xfb\x8d\xd4\x1a\xfa\x10\xa6\xc3\xd2\xe2\x55\x11\x3a\xe3\x35\x1e\x92\x98\xae\xfe\xe1\xb5\x0a\xde\x07\x31\xf5\x37\x5e\x15\xc7\x7a\xe2\xb5\x85\xb5\xde\x4c\xb5\xa2\x0f\x63\x22\xe4\x78\x55\x04\xda\x78\x6d\x99\xc8\xaf\xae\xf6\x8e\x6b\x4a\x1b\x13\x95\x42\x32\xe9\x0f\x05\x3f\x96\xf6\x4c\xbe\x3d\xe7\xb9\xa5\x07\xde\x79\x10\x1a\x1f\x1c\x13\xf2\x50\xb8\x6e\x3e\xd7\xcd\xe7\xba\xf9\xa4\xee\xe4\xc3\x07\xde\x79\x88\xf9\x78\xee\xb0\x70\x73\x28\xed\xd2\x70\xa9\xab\xfa\x36\xa1\x57\x0c\x13\xf2\x38\x00\x37\x85\x63\x2e\x8e\x13\x72\xa1\x19\xbf\x72\xad\x1c\x47\xb8\x60\xd3\xfc\x31\xf6\x53\xc5\xec\x86\x99\x34\x84\x11\x1c\x93\x6d\x33\xa8\x69\xf2\x9b\x63\x25\x0f\xed\xb1\xd0\x87\x01\xbf\x44\x2c\x00\x0f\xfb\x02\x82\x60\x74\x89\xa5\x1b\xbc\x55\xfa\x50\xf1\x55\xa9\x4a\x32\xfa\xec\x58\xac\xa7\xaf\x6e\x26\x0e\xa1\x58\x00\x29\x97\x5a\x2f\xcf\x10\x0a\x52\x2e\x40\x81\x12\x1e\x52\xad\xec\x80\xf9\x4a\x81\x68\x47\x7e\x39\x01\x09\xe1\xd9\x79\xcf\xdb\xf7\x2b\x68\x56\xf1\x05\x9a\x8d\x20\x59\x38\x38\xa0\x36\x97\x36\x40\x1d\x22\x80\x93\x38\x96\xd5\xae\x10\x02\xac\x61\xf1\x1a\xb5\xbb\x05\x25\xc0\xc8\x7d\xf0\xe0\x13\xe2\x85\x66\x42\x82\xa6\xf1\xaf\x10\xe9\x1a\x87\x9f\x22\xe0\xd0\x59\xc8\xa2\x93\x1d\xa4\xcf\x05\x18\xb7\x02\xc2\x37\xac\x09\x5d\x63\x8a\x0c\x7f\xdf\x1b\x48\x03\xca\xc7\xd9\x78\x61\xc1\x09\x9a\x91\x17\xa0\x56\x29\xc7\x7b\x04\x0f\x53\x06\x8c\x60\xe4\x75\xd5\xb1\x72\xc0\xeb\x1c\xfb\xa6\x40\xcb\x78\x49\x88\x04\x1e\x72\x01\x42\x32\xe1\x40\x99\x74\xad\xd3\xac\xca\x15\x38\x5f\x49\xf0\x3e\xd7\x60\xf6\x69\x52\x81\x2e\x89\xf0\x15\x73\x85\x00\xe7\x18\x5d\x92\x45\x05\x4a\xe5\x11\xb0\x32\x5d\x63\x82\x01\x15\xc0\x21\x99\x11\xca\xe8\x1a\x53\xe2\x0b\xb0\x8a\x09\x4b\x53\x16\x74\xad\xbf\x12\x16\xcb\x0c\x07\x42\x80\x12\xcc\x82\x62\x1a\xbc\xc2\xa2\x03\xd3\x4c\xb8\x43\x5d\x48\x30\x96\xd1\x25\xb6\x5d\x80\x22\xb4\x29\x6c\xad\x88\x97\x88\x63\x10\x3a\x17\xa0\x99\x00\x11\xe2\x25\xbd\xd7\x2a\x07\x8d\xf9\xb9\x8f\x97\xba\x37\x42\xe6\x02\xbc\xd9\x57\x58\x3b\x5d\x62\xe7\x49\x08\xa8\x42\xb3\xba\xa5\xa0\x14\x53\xc0\xfd\xbe\x06\x67\x19\x5d\x12\x98\x10\x1f\xc1\x54\x10\x24\x68\x5b\x08\x07\xc6\xb3\x78\x8d\x19\x04\x78\xc9\x5c\x05\x08\x7e\xbf\x2f\x15\x93\xaa\x99\x64\x91\x4c\x09\xf0\xbe\x23\xea\xc0\x19\x50\xfa\x4c\x83\x91\xdd\xb7\x41\x52\xb7\x8f\x84\x61\x32\x40\xd0\x95\x00\xe1\x41\xa8\x42\x72\x6c\x59\xbc\xc6\xbc\x9a\xf1\x21\x28\x07\x36\xa2\x0e\x61\x2f\x11\x4a\x2e\x74\x0b\xf4\xa0\xc5\x99\x06\xa5\x97\x6b\x09\xc3\x1c\x84\xcb\x41\xe7\xa0\x74\x0e\x1e\x61\xe7\x72\x01\x32\x07\xe1\x73\x30\x2a\x07\x25\x73\x81\x10\x45\x68\x9b\x7d\xa1\x40\x78\x16\xaf\x49\x38\x04\xc2\x99\x2d\x84\x04\xa2\x09\xd3\x40\x2b\x4d\x3b\xa5\xce\xfa\x1c\xac\xac\x24\x48\x9b\x1b\xf0\x62\xbf\x4d\xeb\xd0\xfa\xdb\x73\x22\x55\x66\x40\x6b\x94\x03\xca\xb1\x78\xad\x69\x59\x99\x1c\x84\x38\xe3\x85\x07\xc9\xf0\x7f\x9d\x80\x6d\xf5\x8e\x75\x78\x25\xa8\x48\xce\x42\x10\x59\x8a\x86\x4e\x11\x4c\x01\xb1\x86\x7f\x6b\x42\x43\x6a\x11\xb6\xca\x05\x70\x0b\xda\xcf\x40\x07\x26\x41\x04\x44\xa9\x02\x61\x0f\xa5\x04\x87\xf0\x92\x11\x58\x08\x0e\x6c\x8f\x6d\xef\xaa\x1c\xac\x03\x1e\x0a\xe1\x89\x64\xe9\x1a\xcb\xd7\x20\x0d\x08\x39\xcc\xc1\xda\x1c\x38\x7e\xe4\x6c\x0e\x12\xb9\x53\xe6\xa0\x0c\x56\x6c\x4c\x0e\xd2\xcd\x90\x7f\x24\x68\x85\x3c\x26\xc1\xe9\x2b\x7e\x88\x72\x51\xee\xd3\x24\x2e\x8b\xd7\x48\xed\x0e\x89\x53\x62\xc5\x88\x2e\x15\xf6\x85\x4e\x73\x87\x36\x41\x86\x59\xa4\x50\xed\x87\x60\x34\xf2\x60\x60\x16\x39\x21\x90\xcc\xc4\xfe\xe5\x1e\x8c\x2e\xc8\x0b\x90\xc5\x6b\xfc\xce\x44\x06\xd2\xbe\x02\x2b\x09\x5e\x48\x1b\xfb\x82\x83\x0c\x2c\x5e\x63\x46\xe9\x18\x15\xe1\x41\x1a\x46\x97\xf8\x5e\xe7\x60\x4d\x95\x2b\x50\x88\x4e\x19\x10\x02\xe6\x8c\x17\x12\xe1\xcc\xe2\x35\xe1\x1f\x99\x51\x83\xd7\xcc\x22\xd4\xe9\x92\x88\x0b\x50\xcc\x83\x0a\x1b\xd0\xc7\x28\x16\x3d\x78\xb7\x6f\x50\xea\xd0\x25\x36\x54\x29\x04\x91\x15\xd8\x32\x04\x3d\x5d\x23\xda\x14\xc8\x90\x63\xcb\x2a\x05\x2a\xe4\xd8\x8d\x02\x02\x84\x9a\xc4\x8c\x26\x5e\x65\x01\xac\x8b\x97\x46\xd8\xa9\x28\x1c\x59\x23\x36\x15\x08\xc5\xe4\x3e\xca\x06\xc7\xe2\x35\x51\xa3\x07\xcb\x1c\x08\x83\x92\xd1\x33\x0b\x46\x22\xc0\x5c\x92\x8c\x60\x50\x38\x22\x8a\x75\x0e\xdc\xed\x4b\xc2\x79\x2d\x95\x04\x93\x10\x10\x71\x32\x34\x1a\x1b\xa5\xa3\x21\x7a\x42\xd8\xc9\x78\xa9\xc5\x23\x72\xbb\xef\x89\x47\xd1\x15\x8f\xa8\x55\xd2\xa5\x16\x9c\x12\xf9\x48\x9a\x7d\x9a\x03\xd6\x2d\xda\x10\x61\xc2\x40\x48\x16\x4e\xc4\x97\x71\x4c\x55\x82\x11\x4d\x79\xa2\x45\x5f\xd3\x22\x5a\x16\x0e\x48\x28\x36\x72\x11\x75\x80\x0b\xac\x27\xad\x94\x3f\x53\x88\x0e\x30\x12\x41\x91\xde\xeb\x1c\x9c\x39\x12\x9a\x29\x0e\xca\x17\x48\xbe\xb5\x19\x43\x8a\x0a\x84\x1f\x42\x88\xb4\x05\xdc\x23\x49\x49\xf0\x28\x88\x0b\xf2\xa6\x66\xf1\x5a\x53\x1c\xa2\x65\x48\x8a\x8c\xea\xa7\x99\x6d\x10\x08\x30\x6f\x0a\x08\x0a\xa5\x47\x2d\xb9\x1c\x0a\x50\x05\x42\x14\x60\x4d\x63\x94\x30\xb0\x22\x07\x6f\x50\x24\xa8\x1c\x9c\x26\x79\x29\xc0\x99\x1c\x1c\x89\x2a\x87\x6c\x45\xc8\x69\x14\x2d\xa6\x22\xeb\x0f\x51\x1b\x02\x8a\x36\x99\x83\x44\x81\x83\xec\x5b\x20\xd5\x38\x16\xaf\xb5\x60\xd3\x32\x17\x2c\x59\x32\x84\x42\x47\xc2\x87\x24\x9a\xd5\xe9\xda\x74\x8b\xc4\x18\x96\xa0\xea\x6b\x8d\x19\xeb\x49\x91\x77\x54\x00\x0a\xa3\x4a\x80\x53\xb9\x06\xad\x7b\x02\x39\xb2\xca\xdb\x37\xd8\x94\x80\x75\x98\x50\x80\xb7\xe0\x6d\x03\x73\xe0\x06\x3c\xfe\x6b\xde\xe4\xb1\x41\x12\xb4\x48\xd7\x24\x82\xc0\x86\x1c\x4c\x9b\x5d\x50\x76\xb4\x14\x48\xa0\xa0\x2d\x41\xd7\xc4\x0f\x6d\x9d\x6f\xcf\x05\xd1\x00\xca\xac\x42\x90\x55\x87\x97\x64\x4e\x83\x26\x48\xe8\xfd\x6e\x0a\xb1\x84\x25\xb2\x77\xe0\x96\xad\xd6\xde\xdc\xdf\x82\xe1\x5a\x5b\x82\xbf\xef\x0d\x10\x76\x2a\x9a\x77\x12\xad\x1d\x32\xef\x24\xc8\x3b\x9c\xef\x4b\x0b\x3f\xd7\xd8\x9a\x68\x40\xba\x87\x15\x2f\x57\x14\xdf\x59\x65\x42\xde\x36\xa0\x5c\x17\xad\x12\xe9\xc1\x1c\x0a\x01\x3a\x54\x48\xc8\xf2\x50\x89\x23\x19\xd7\x75\xc2\x59\x2e\xcc\x91\x8f\x36\x8f\xe9\x59\x9d\xa8\xb3\xac\x39\xd2\x48\x45\xb2\x1d\x7c\xe5\x60\x90\x75\x82\x3c\x72\xcc\x80\xd5\x95\xa6\x17\x1a\xcc\x51\x80\x60\x50\x92\x6a\x8f\x82\x0b\x45\xdf\xbe\x04\x8b\xac\x69\x6d\x63\x12\x39\xcd\x24\xa9\xb8\x74\x49\xe8\x97\x4c\xda\x43\xe9\xc1\x76\xad\x18\x9e\x4b\x6c\xb7\xd7\x05\xea\x58\x5b\xb3\x07\x18\x9b\x8b\x0a\x69\x2d\x97\x87\x74\x72\x6c\xe7\x1b\x91\xa3\xd5\xab\xd0\xc2\x11\x3d\xf2\x6e\x80\x73\xa7\xd3\xa3\x6e\xc4\xe6\x1d\xe9\x65\x6d\xc7\x9c\x4d\x51\xd0\xda\x8e\x31\xd7\xce\xc5\x34\xd3\x3a\x1c\x9c\xc8\x5c\xdc\xa1\x91\xd1\x7a\xae\x0e\x19\xf9\x0c\x08\x9d\xc5\x0d\x23\x22\x73\x0f\x3b\x16\xe1\x06\xd2\x46\x2c\x1b\x32\x55\xd8\x37\x4e\xb9\x02\x47\x75\x1a\xfc\x75\x8b\xa9\x6b\xef\x94\xbd\x01\x98\x16\x25\xb2\x40\x33\x8b\x5c\x06\x98\x10\xfb\x02\x24\x6a\x11\xd9\x58\xf8\x92\x4c\x00\x75\x48\x8b\xfd\x4b\xc9\xb4\x56\xcf\x84\x38\xa2\x45\x7a\x2a\x6b\xb9\x88\xa6\x9a\xb7\x83\x6c\x73\x1b\x38\x37\xca\x90\x6b\xb9\x21\x6f\x8e\x1d\xd7\x72\xd4\xbd\x01\x71\x64\x6a\xb9\xc2\xa1\x7a\x74\xb5\x9d\x24\xd0\x42\xcc\x05\x5b\x78\xcb\xe8\x6d\x57\xee\x3f\xe8\x30\xaa\x9b\xf4\x0e\xa9\x6f\x53\xe5\x34\x37\xf1\xad\xab\x16\x01\xc6\xe5\x16\x82\xd8\x77\x38\x82\xa5\x4b\x1a\x53\x44\x38\xdc\x03\xcc\x7a\x3d\x62\x5b\xf4\x04\xbd\x8e\xab\xee\x1c\x1b\xec\x16\x9e\xfa\xff\xd9\x7b\x1b\x1f\x37\x92\x23\x4f\xf4\x5f\xe9\xeb\x03\x0e\x1e\x20\x33\xa6\x22\xf2\x5b\x7e\x7a\x00\xa7\xcf\x5e\x2e\x1e\x75\x36\x6e\xbc\x34\xae\x0f\x8b\x45\x0d\x45\x89\x5c\x57\x37\x05\xb2\x45\x59\x36\xfc\xbf\x3f\x44\x64\x55\xb1\x3e\xc8\x16\xbb\x45\x69\x34\xde\x19\x5b\xd5\xc5\xaa\xac\xfc\x8c\x8c\x8c\xc8\x8c\xf8\x85\x6b\x69\xbc\x21\xf1\x21\x85\x9f\xd6\xc2\x1e\x9d\x3c\xfe\xf9\x59\x7f\x4a\x12\x92\xcd\xa6\x34\x12\x84\xfc\x34\x01\x61\x4b\x96\xe1\x14\x59\xfa\x93\x64\x19\x99\x2c\xa3\x98\xea\x84\x03\x5d\xa6\xaf\x4c\x97\x34\xa0\x4b\x5f\x19\x20\x8d\xa6\x2f\xf1\xe4\x4e\x18\x12\xe4\x89\x1e\xfd\xb4\xb0\x73\xe6\x60\x9d\x69\xe6\x78\x19\xca\x38\xcb\x76\xee\x13\x4c\x95\x57\x3a\x07\x76\xc2\x4b\x9d\x92\x4b\x51\xef\x29\xab\x04\x31\xcd\x08\x81\xd2\x3f\x31\xe9\x20\x60\xde\xf1\x38\x4a\x29\x8f\xf4\xf0\x99\xc2\xdb\xcf\x2e\x6f\x7c\xaa\x1d\xa7\xa2\x69\x5d\x6a\x3e\x9c\xe1\xff\x71\xa9\xd9\xf0\x49\x07\x83\x33\x56\x72\x5e\xd9\x78\x61\x6b\x34\x6b\x02\xf7\x4f\x4d\xfd\x01\x75\x98\x04\xb0\x49\x85\x66\x1b\xf2\xe4\x6a\xfe\x89\x6e\x7e\x4c\x60\x3a\x7f\x25\xff\x44\x21\x27\x82\x7a\x0e\x36\x3d\x6a\x0b\xa8\x0b\x9c\xd3\x19\x52\xe8\xa6\x06\xe7\xa9\x6b\x7c\xa3\x71\xea\x3b\xe7\x8a\xa8\x21\xd2\xdc\x43\xa4\xc9\xc1\x28\xd4\x2b\x3f\x95\x6d\xf7\xc1\x48\xf9\x89\x51\x87\xed\xc0\x50\x8a\x72\x6e\xda\x93\x1b\x55\x28\x30\x7e\x4e\x01\x92\x99\x58\x40\xc5\xff\xf2\xf3\xc0\x0c\xc4\xc8\x61\x65\x77\x20\x71\x4e\x6e\x85\x83\x47\xe8\x7b\xeb\xbf\x42\x77\xfb\x8a\x92\x32\xc5\x34\x64\x82\x43\x54\x74\x38\x42\x74\x4a\x0a\x9c\x27\x88\x71\x62\xf8\xb9\xe9\xda\xbb\x62\x31\xa5\xb4\x77\xd3\xf6\x78\xb7\x2e\xa8\x58\x85\xdb\x3b\xd2\x81\x5f\x34\xad\x62\xea\xf7\x53\x83\x97\x3b\x79\x34\x50\x60\xcd\x03\x8a\xfa\xd8\xd1\x5d\x60\x7f\x9c\xe4\xc8\xce\x1e\x1d\xdc\xce\x38\x3a\x15\xa6\x6e\x1e\xc6\x23\xdb\x3d\x96\xcf\x03\x2b\x39\x52\x7b\x06\xa8\x8c\xf2\x10\xe3\x9e\x90\x07\x52\x8c\x8a\xcd\x61\x28\xdd\xf1\xa1\xf4\x2b\x84\x64\xfb\x5b\xb2\xa8\x21\xe1\x5e\x63\x31\x19\x1c\xf3\xa9\xa6\x11\xb7\x4c\xa8\x64\x2b\x1d\xe5\x74\xae\x34\x10\x83\x92\x4b\x51\x6f\xec\x07\xa3\xad\x1a\x3c\x56\xf9\xf1\x8c\xe9\xc3\x9f\x39\x5e\xa7\x65\x52\x19\x2b\x0b\x85\xad\x4f\x89\x13\x24\xea\x0c\x57\x7f\x57\x52\x4c\x16\x2f\x63\xbd\x67\x8a\x29\xfa\x39\xd1\x14\xed\x3e\x4e\x23\xdf\xf9\x7d\xfc\x94\x51\x0a\xf1\xb3\x0b\x99\xe9\x99\xbc\x83\x6b\x80\x82\x62\x6d\x18\x95\x03\xc4\xae\xd5\x4b\x80\x44\xca\x4e\x23\x14\x3d\xf3\x19\x96\xad\x38\xe9\x8c\xe4\x20\x93\x33\x38\x54\x53\x03\x21\xa4\x3d\xb3\x86\x4e\xdd\xc1\x7a\x59\xf9\x27\x96\x39\xbd\x6d\xcf\x60\x94\x57\x54\xb0\xd2\x66\x21\x90\xb2\x87\xc3\x3f\xa3\x11\x0a\x4e\x19\x4c\xbe\x34\xc9\x8b\xa7\x3c\xeb\x65\xe9\xe5\xf4\xd1\x51\xa7\x29\xc6\x2a\x0c\x40\x7e\x8e\x16\x30\x74\x5f\x1c\xfa\xe6\x56\x16\xd9\x58\x2f\x78\x51\xf6\xe8\x9b\x75\x36\x40\x24\x85\x61\x46\x72\x2a\x17\x23\x8b\x34\x98\x14\x86\x92\xb8\x3f\xe5\x52\xd4\x47\x8b\x26\xb0\xaa\x8d\x4d\xc2\xe2\xf1\x84\x79\xf3\x2c\xca\xea\xfb\x68\xc2\x54\xa7\x8b\x72\xaa\x10\x46\x75\xf4\xaa\x3e\x97\x06\x2f\xcb\x7d\xbd\xfb\xae\x49\x43\x8c\xb9\xdd\x33\x1e\x60\xe6\x0e\x3c\xde\x32\xad\x2c\xa0\xdf\x83\x0f\x55\xa1\x88\x95\x32\xe2\x01\xa3\x76\x91\x56\x4d\x8f\x5c\xe0\xc0\xef\x2b\x4c\x85\xc7\x4d\x71\x7e\x9d\x06\x67\x4e\x03\x26\x49\x0b\x76\x8f\xe0\x68\xc6\x29\xe3\xa7\xc9\x92\x73\xb4\x33\x39\x25\x52\x7e\x8a\xfe\xf6\x0e\x49\xce\xab\x67\xe7\xce\x94\x4a\xcc\xb1\x38\x17\x2a\x94\x5f\x59\xb0\x4e\xa6\x9b\x05\x3b\x3a\x35\x12\x0b\xf3\x4b\x88\x4f\x5c\x43\x45\x11\x6c\x6f\x89\x05\x13\x35\x18\x9a\x1c\xce\x8b\xf3\x09\x9a\x53\x4c\x8b\x3c\x67\xc6\xe2\x6d\x32\x25\xca\x71\x27\xb6\x47\xe9\x2c\x6a\xd8\xe3\xe9\x49\xac\x37\x3a\xd9\x9b\x82\xb5\xa7\x00\x5d\x71\x0c\x6b\xcb\x84\x09\xf2\x1a\xda\x0a\x35\x60\xb2\x5c\x20\x87\xba\x87\x25\x5e\xd1\x34\x41\xc2\xb2\x93\x58\xcb\xf1\xab\xea\x7e\x2e\x4f\x8e\x7c\xbb\xf2\x5c\x74\x27\x21\x15\x10\x0d\x57\xa8\x77\x64\x75\xe8\xaf\x4b\x98\xe4\x45\x45\x13\xee\x31\x5f\xd7\xc3\x88\x5b\x55\xf3\x44\x5a\x1b\x15\xdd\xde\x05\xb0\xa4\xc8\x01\x4b\x8d\x85\xf0\x4a\xb9\xe6\x9e\x4b\xac\x9e\x12\x4e\x1d\x6b\x18\x1d\xa7\x27\x4d\x2b\xb3\x28\xb4\x98\xa8\x14\xf9\x10\x98\xff\xf2\x34\xdb\xb1\x66\x64\xb2\x51\xca\x4a\x9b\xfe\x57\xd3\x04\x98\xa4\x1c\xaf\xf2\xb5\x5e\x03\x1c\x18\xe6\xbe\xac\xdb\x00\x39\x39\x84\x6f\xe4\x22\x60\xf1\x06\x90\x26\x11\x8c\x38\x66\xb5\xf5\x17\x1b\x24\x74\xab\x04\xc6\xf7\x5d\xb2\x98\x68\x8c\x29\x03\x4f\xd8\x70\x98\xb5\x3c\x16\x09\x22\x8d\x13\xc7\x50\x8e\xb2\x27\x20\x52\x56\x75\x2b\x94\xcf\x62\x8d\x91\x0a\x8d\x66\x4e\xed\xac\x71\x09\xd1\x26\x5b\x8d\xb8\xd2\x43\x42\xe5\x5b\xbb\x4d\x9e\xd7\x51\x1b\x9e\x3f\x9c\xa4\xad\x2a\xf3\x00\xc0\x34\x8f\xdc\x4f\x58\x40\x21\xc7\xcc\x45\xab\xca\x9a\xdc\xe1\x3d\xfa\x17\x4b\x02\x37\x41\x94\x43\x69\xec\x68\x9a\x62\x38\x33\xef\xee\x5d\x93\x2a\xe6\x7e\xa1\x2d\x58\x40\xed\x99\x78\x09\x28\xe9\x00\x8e\xd9\x2a\xc6\x89\x03\xe7\x95\x6b\xac\xd9\x64\x6c\xbc\x57\x28\x07\xfc\x94\x2f\xf5\x8b\x20\xe7\xed\x76\x4e\xb1\x44\x02\xa3\xe4\x92\x87\x3a\x00\x5a\x4d\x10\xec\xe4\x30\x7d\xa2\x18\x27\x79\x10\x66\x55\xa4\xfa\xda\xe6\x65\x8a\xbd\x19\x98\xd4\x9a\x62\x41\x10\x49\x67\x03\xa0\x22\x30\x55\xb2\x8a\x6b\xb4\x85\xe0\x27\x8e\x87\xcf\x1d\x0c\xcb\x9a\xae\xbe\x7d\x85\x24\x7c\xda\x81\xa1\xd2\x88\x75\x47\x6b\x7d\xa4\x59\x65\xe7\xce\x17\x93\x3e\x2b\xa6\x82\x5e\xea\xee\x8c\xca\xc6\x06\x41\xc5\x7d\x84\x28\x87\xfc\x72\xc6\x7f\xe0\x6d\x4d\xae\xb7\xaf\xc8\x82\x55\x64\xc1\xf9\x85\x66\xb2\xa4\xdc\x62\x23\x76\x57\x41\x3b\x10\x7b\xc7\x39\xf2\xbc\x5b\x80\xb7\xb5\x4d\x10\x18\x45\x0a\x1c\xb6\x1a\x98\xe8\x68\x89\xc5\x0a\x9a\x18\xe6\x59\x72\xa9\x07\xbb\x2d\xe3\xf3\xd8\x48\xff\x4b\xfe\xef\x89\x7c\xc5\xcb\x56\x87\x4b\x0b\x8d\xca\x68\x03\x9e\x6b\x1d\xad\x76\x90\x94\xdd\xd3\x68\xa6\x8b\x3d\x1d\x6b\xbf\x2e\x31\x55\x5a\x31\x67\x6b\x8d\xb4\x58\x69\x75\xe5\x78\x32\x06\xb1\x68\x33\x4a\xcc\xbc\xd2\x41\x73\xb5\xd9\x26\x28\xd9\x39\xd3\x9b\x29\x13\x0f\x58\xea\xda\x3b\x05\x31\xf4\x13\x73\x2c\xf9\xd7\x8c\x74\x42\xcd\xfc\x6e\x01\x2e\xf1\x0c\xe1\x75\xd5\x92\x36\xcc\x0a\x1d\x78\xab\x0d\x38\x9c\x7b\x18\xd4\x26\xdb\x27\x71\x0b\x22\x20\x96\x7d\x33\x29\x2e\x24\x71\xc7\x0d\x3f\x30\xdc\xc6\xe4\x4a\x26\x7d\x25\x97\x3c\xe1\x0c\x90\xd8\x5b\xe1\xde\x03\x32\x29\xc8\x06\x22\x90\x15\x63\x29\x48\xbc\x56\x94\x62\x62\x72\x30\x4b\x51\x06\x3c\xd3\x44\x24\x96\x8c\xac\xb2\xad\x9c\xca\xfc\x95\x47\xc3\x80\xfb\xac\xb5\xa5\xb1\xbb\x2e\x58\x96\xc3\x04\xde\x2e\xc4\xa0\x12\x49\x43\x48\x1a\x88\x34\x8a\x91\xa5\xd9\x3b\x08\x7e\x41\x1a\x98\xb2\x8b\xa0\x21\xf1\x6c\x32\x4c\xeb\x25\xb1\x02\x2c\x97\x66\x21\x15\x0b\xae\x38\x31\x3c\xd7\x4d\xc7\x24\xee\x50\xce\xe7\xd4\xda\x34\x46\xea\xa2\x2f\x13\xf7\x1c\x65\x9b\xa9\xd6\x64\x28\x1b\x50\x89\x54\x97\x2f\x75\x05\x80\x95\x6c\x9a\x63\x01\xce\xdd\xa0\x13\x11\xa4\x80\x56\x9f\x40\xb1\x0b\x3b\xe4\x3b\x5a\x11\x3a\x3e\x7d\x27\xfd\xb0\x49\xf9\x69\xcf\x4d\x42\xc5\x39\x0d\x05\xf7\xbe\xd5\xba\xa6\x79\x57\x88\xe6\x2c\x6e\xef\x84\xfb\x29\xa4\xa9\x9d\x59\x15\x6f\x5f\x59\x45\x71\x4e\x76\x6a\x68\x3f\xda\xe1\x7e\xa2\x29\x8f\x60\xdc\xfd\xf5\xe5\x75\xb8\xbe\xfa\xf8\xf2\xda\x5c\x37\x78\x77\x44\x1d\xbc\xbb\xe2\xfa\x6a\xfb\xd7\x97\xd7\x05\x24\x7f\x7d\xb5\xfd\xd8\xdc\x3d\x6c\xcb\xfb\xdd\x9b\xcd\xf6\xee\xe5\xb5\xdc\x56\xe5\xc3\xf2\x37\xc6\x7f\x77\xb5\xdd\x3c\xf0\x6d\x2a\xbe\xcb\x40\x79\x2f\xaf\xef\x37\xf7\xcb\xeb\xab\xdd\xc3\x76\xf3\x97\xe5\xcb\xeb\xff\x5e\x14\x45\xf3\x4b\x73\xfd\xfe\x73\xb3\xbe\x7f\x79\xbd\xdd\xbc\xbf\x7f\xdd\x3e\x6f\x2a\xf2\xfc\x83\xb9\x2f\x31\x10\x18\xa7\x76\x4e\xc5\xd4\x8c\x0e\x9f\x1f\x3b\xd6\xeb\x3b\xf0\x9f\x72\x36\x90\xaa\x82\x93\x5d\x5a\x56\x4b\x95\x03\x32\x15\x5a\x70\xe2\xb4\xde\xdf\x53\x82\x60\x66\xcc\x8e\x79\x1e\x89\xcd\x32\xb3\xca\x8e\x70\x2a\x0c\xd4\x3c\x89\x3a\x4e\x77\xa0\x15\xd3\xe8\x43\xf1\x0a\xa7\x06\x07\xc2\x39\xc5\x39\x06\xf0\x66\x4a\x7e\x4e\x6e\x8a\xa9\xfe\x89\x41\x7e\x16\xf5\xcf\xc8\xbf\x5c\x47\x38\xe6\xbc\x9f\xe4\x67\x7f\x92\x86\x1d\x14\x24\x64\x8c\xf6\x40\xc7\x1d\xdc\xc6\x21\x29\x3d\x6a\x27\xf5\xd8\x59\xac\xc0\x2b\x74\x9b\xcf\xd4\x63\xfa\xfd\xf1\x84\x26\xd9\x47\x0a\x23\xe1\xa6\xac\x20\xc6\x95\x01\xc2\x19\x46\xe6\xf7\x2c\xf9\x96\xad\x39\x65\xa1\xf9\xa6\xd2\x9e\x05\x0f\x16\x08\x25\x69\x65\x20\x69\x02\x7a\x0a\x8b\x38\xb5\x03\xfb\x33\x12\xc1\x79\x36\x2d\x97\x26\x8a\xf3\x4c\x5b\xbe\x10\x91\x9c\x67\xc0\xf2\xb3\x10\xcd\x05\xaa\xe6\x94\x5f\x64\x1d\x9b\xd5\x4c\xe2\xab\x8d\x67\xf0\xb2\x59\xcd\x11\x15\x11\x84\xa0\xe2\xe8\x80\x2b\xe7\xfd\x59\xd6\x2a\x8f\x0c\x28\x8a\x2c\xc0\xd2\x5b\x05\xce\xb3\x26\xd1\x55\xb9\xc4\x88\x17\x13\xd7\x89\x3b\xda\xb6\x82\xdb\xe1\xb3\x67\x54\xcc\x9d\xae\xd8\x63\x67\x6f\x4f\x2d\xc6\x1f\x3d\x7e\xfb\x06\x39\xc1\x79\xe6\xa6\x5f\x6c\x56\x9e\x67\x7c\xfa\x09\xe2\x47\x37\x61\x35\x43\x99\x83\x9d\x15\x15\x0a\xed\xd4\xed\x69\x6a\x70\x8e\xa7\xed\xad\xce\xb3\x3a\x3d\x5d\x3e\x26\xb0\x5e\x8e\xa1\x2b\xf0\x31\x0b\xf4\xa2\xfe\x8a\xbb\xc0\x99\x8c\x41\x21\x20\x78\x73\x83\x09\x4c\x36\x27\x11\x57\x45\xe2\xdb\xec\xb5\x98\x8b\xf8\x4c\x73\xcf\x47\x7b\xb1\x60\xe5\x88\xf5\xad\x27\x30\x0d\xe4\xaf\x4e\xd9\x4a\x9f\x69\xb8\xf9\x58\xad\x7e\x06\x9b\x90\x27\xb7\xc4\x1f\x37\x0b\x79\x64\xc2\xb4\xe2\xa8\x78\xc5\xf9\x38\x47\x2f\x44\x4a\x10\xb0\x62\x55\x95\x49\xe7\x39\x82\xe9\x2b\x0c\xdc\x92\x20\x0e\x29\x1d\xbf\x90\xa8\x8a\x19\xb9\xec\x32\x37\x95\x85\xac\xd2\x0d\xe9\xcd\xd0\x8a\x5f\xa8\x18\x81\x8e\x7b\xe0\xa4\x6a\xf0\x98\x66\xc0\x95\xa0\xc0\xaa\x14\xcf\x82\x49\xed\x3e\x83\xad\xff\x5f\x21\x09\x5c\x87\x9f\x59\x66\x59\xd4\x30\x30\xcc\xec\x8d\x7a\xfc\x0c\x70\x9c\x93\x95\xc3\x2f\x37\xe7\xc2\x8e\xbd\x27\x45\x91\xdf\x1b\x9c\x1a\x3b\x97\xfb\x71\x6d\xea\xea\x9e\xad\x7b\xfc\xd7\x68\xf9\x39\xf6\x48\xe7\xd8\x08\xd9\xa0\xc2\x61\x5b\x8a\x2c\x33\xb8\x4f\x52\x61\xc5\x7c\x52\x33\x9f\x1c\xd2\x71\xe5\x64\xef\x61\x24\x13\x7c\x8e\x0c\x34\x98\x86\x06\x2c\x4d\x02\x38\xa3\x42\xeb\xa6\xf9\x4c\x43\x9f\xb3\xa4\xda\x8b\x0b\x41\x67\x5b\x1f\x7d\x6d\xe3\xa3\xff\x2a\x33\xe7\x1c\xcb\xd6\x4f\x4a\x34\xe5\x40\xa2\xd1\x46\x3b\x20\x5f\x89\xb7\x67\xde\xee\x74\x1a\x42\x3c\x7f\xea\xe4\xa3\x0b\x85\xe0\x9d\x26\x88\xfe\x19\x73\xe3\xd4\x04\x38\xc7\xbc\xf6\x1b\x5e\xe7\xcf\x37\x61\x1d\xac\xf1\x47\x0e\xb4\x04\xb6\xec\x32\xf6\x74\x71\x6a\x3b\xa7\xfb\xa4\x68\x4e\xfe\x53\x1b\x6c\x58\xf4\x77\xd8\xe2\xed\x5d\xa1\x7c\x69\x59\xb4\xb3\x87\xd3\x03\x66\xbc\x76\x6a\x48\xf6\xdf\xc0\xd3\xde\x42\x34\x13\x07\x31\x28\xd7\x58\x3d\x49\x8f\xc9\x79\xd2\x4a\x63\x18\xbd\xb4\x8a\x0a\xb0\x76\x8e\x0e\xfc\xe8\x65\x12\xc7\xfd\x62\x75\xe4\x3b\xb1\xb1\x03\x7f\xfb\x2a\x40\x52\x58\x4c\x06\x55\x53\x56\xa1\x9d\x63\x21\x5b\xb2\x04\x85\x1f\x25\xe0\xef\xc8\x4f\xed\xed\x2b\x9e\x9d\x8a\xc6\x29\x0c\xe5\x4f\xe7\x74\xde\xa9\xce\x19\xf8\x62\xf9\xa4\xd7\x2d\xb4\x91\xd5\x4c\x7b\x30\x8a\x65\x78\xb9\x09\x80\x6e\x47\xf9\x94\x1a\x9d\x6a\x1e\xf1\x8d\xe6\x44\x72\xc3\x4f\x7e\xa4\x7c\x52\x23\xdc\xac\xc9\x53\xc6\x80\xc0\xa7\x85\x26\x70\x49\xce\x2d\x83\xa6\x7c\x86\x16\xb4\x03\xc7\x99\x23\xca\x9d\x6a\x1e\xf1\x8d\xe2\x44\x72\xc3\x4f\x7e\xa4\x82\x3f\x27\x23\x67\x39\x31\xdf\x5c\xc2\x3f\xfe\x52\x94\x28\x4a\xee\x5c\xce\x0f\x27\x0e\x44\x8b\xc0\x86\x43\x45\x08\x3c\xaa\x9c\x46\xc2\x3e\xcd\xb1\x98\xf2\xb3\x51\xc2\xfa\xfd\xad\x9c\xad\x31\x87\xef\x0e\x89\x6e\x86\x44\xb7\x43\xa2\xdb\x91\x68\xc7\xa6\x19\x12\xd5\x19\x12\xc9\x4a\x35\x79\x66\x2b\x41\x31\x4f\xa2\x71\x5d\xf9\x9d\x1c\x82\xde\x15\x1a\x8f\xb6\x46\xbe\x53\x98\xf7\xb4\x47\x03\xb0\xac\xaa\xf5\xbb\xdd\x93\xcc\x05\xb1\x41\x94\x89\xf9\xdc\xc0\xe6\x43\x03\x0b\x81\x46\x16\x29\x19\x4e\x71\xc0\x82\x64\xef\xee\x09\x2c\x88\xcb\xf4\x79\x93\xcf\xb7\x9b\x7c\xe8\xba\x9b\x7c\xc7\xf7\x07\x9f\x30\xb1\xfe\x9a\xed\x54\x3f\xbe\xbc\x26\x3c\x94\x81\x8f\x96\xf1\x2c\xc8\x1c\xab\xe2\x14\x09\x92\x29\x23\xaf\x95\xb1\xc5\xc0\x51\x42\x75\x53\x63\xe6\xe4\xa7\x66\x8e\x09\x52\x19\x6a\x6b\x93\xe6\xe8\x53\xf0\x50\xec\x9c\xc2\x70\x7b\xc6\x0e\x2c\x52\x7b\x8e\x44\x56\x7d\xb6\xcd\xa4\xcd\xb5\xf7\xe0\xc4\x0a\xc0\xc7\xd2\x03\x06\x25\x97\x9a\x05\x0b\x08\x4b\xb6\xa0\x17\x8c\x97\xfa\x39\x18\xaf\xe5\xb0\x6d\x84\x75\x93\xd1\x80\xb0\x8b\x86\x12\x30\x73\x4f\x43\xf9\x52\xb7\x5a\xbe\x57\x86\xbb\xca\x1c\x30\x83\x0c\x58\xaf\xcd\x8a\x25\xe3\x89\x38\xbc\x60\x83\xf7\x51\x64\x4c\x0b\x5e\x7d\x1d\xf8\x98\x2f\xf9\x85\x07\x92\x6a\x5b\xe5\x55\x8b\x11\x91\x0f\x01\xf7\xc5\xe4\xf0\xec\xd0\xd2\xdb\x57\x3e\x83\x86\x98\xb4\x10\xbb\x95\x22\x1f\x39\x22\xab\x0f\x26\xc3\xae\x18\x40\x73\x63\x6a\x90\x0d\x81\xc3\x10\x83\x94\xa4\xda\x4f\x2f\xc1\xfb\x1a\xd2\xc1\x32\x82\x67\x36\xe5\x9b\x1d\x26\xee\x6e\x51\x67\x0e\x60\x31\x81\x85\x90\x08\x14\x46\x6e\x7f\x82\x62\x63\xf1\x39\x54\xf4\xca\xa0\x22\xc3\x92\x2e\xe1\xd4\x20\x33\x1d\xc7\xe2\x2e\x9e\xb0\x1d\x7f\xea\xf9\xf4\xa1\xd7\xdb\xa1\xc0\x66\x78\xba\xe3\x83\x9d\x71\xec\x8f\x30\xb6\x43\x5f\xf6\x69\x42\xec\x91\x04\x65\x44\x64\xed\xb2\x4f\x4d\x85\x62\x6a\x12\xa4\x8f\x2e\xed\xc9\x50\x5b\x7d\xa0\x51\x9e\xa5\xa8\xb3\x2d\x40\x97\x9e\x79\x08\x0a\xc1\x78\xc2\x1e\xfd\xa3\x06\xe3\x21\xda\x49\x7f\xba\x60\x8f\xbe\x12\x88\x31\x81\x73\x0b\x81\xc8\x41\x08\x02\x6f\xc4\x2b\x08\x7a\x9d\xff\xec\x74\x43\x74\x5a\x70\x41\xf8\xd9\x18\xec\x4c\xd0\x6c\x2f\x61\xc5\xc4\x72\x8d\x29\xa6\xac\x80\x4e\x22\x6b\x7a\xb1\x05\x5b\x51\xe8\x58\x77\xf6\x6e\x4e\x82\xd8\x34\xdc\x19\x46\x37\x17\xf0\xac\x89\x03\xe2\xd1\xa1\xd6\x94\xa1\x90\xb5\x4e\x09\xc0\x8f\x3b\xa0\x61\x91\x55\x01\x82\xe9\xab\x9a\x51\x94\x8a\x49\xe0\x64\xa1\x49\xcb\x8a\xaf\x40\x2d\xe1\x1c\x13\x2f\xc9\x34\x30\xf5\x13\xf0\x38\xef\x6e\xd0\x28\x4a\x35\xee\x38\x77\x56\xa1\x90\xf5\xb6\x2e\xb6\x14\x06\x45\x62\xf2\xdb\x77\x08\xf8\x9a\x06\x7c\x1e\x58\x8d\x84\x24\x76\x6c\xc1\x8e\xcc\x6a\x80\x88\x45\xaf\xb8\xc8\xda\x1e\xb2\x36\xc5\x42\x16\x66\xb5\xca\xd9\x39\xa6\x15\xcb\x69\x03\x03\x3f\x02\x19\x82\x38\xb6\x33\x71\xfc\xa5\x30\x45\x93\x2f\xb5\x1c\x93\x11\xb9\x92\x9d\x0c\xad\x74\x88\x27\x4d\xca\xda\x5f\xdf\xe3\x05\x13\xd3\x04\x0d\xe7\x11\x4b\x3d\x82\xfa\xe6\xe7\x18\x56\x03\xbc\xf5\x95\x36\x7b\x82\x34\x09\xf9\xb8\xca\x37\xd5\x42\xe9\x07\x2b\x56\xa4\x63\xdb\x1c\x41\xec\x19\xd1\x7a\x46\x72\xbe\x8c\x33\x42\x14\x73\x54\x3b\xe9\x7b\xa4\x8b\xa2\x27\x6e\x23\x43\x6f\xa0\x9e\x3d\x1e\xb7\x2b\x80\x73\x25\xb7\x40\xb9\x16\xef\x8e\x7b\x55\x8d\xd3\x66\x88\xae\x89\x03\xc7\x93\xc3\xb5\x93\x23\xb3\x00\x1e\x22\x1b\xf3\xa5\xee\x9b\x20\x22\x74\xc8\x2a\x75\xd7\x8b\x8d\x35\x68\xf0\x7e\x26\xea\x85\x32\xdd\xb9\x80\xe0\xc4\xfc\x72\x86\x32\x32\x98\x56\x3c\xc4\x65\x7f\x25\x28\xc4\xb4\x2e\x8d\x9a\xf7\x35\xa7\x80\xd8\xee\xa7\x29\x0d\xad\x40\xc9\x02\xf9\x45\xa1\xb8\x65\x3c\x59\x49\xae\xa9\xf4\xcc\x65\x7d\x63\x48\x88\xda\xf3\x42\xb0\xd2\x54\x79\x5e\x99\x63\xcd\xf6\x07\x66\xa8\x02\xa0\xe9\x69\xc6\x8a\x4d\x86\xc7\x1b\xcd\xb5\x0c\x4f\xe8\x57\x16\x02\x96\x86\xa5\x18\xb9\xb4\x4b\x43\xd4\x86\x95\xa2\x42\x0b\x3c\x93\x16\x9f\x20\xcd\x25\xa7\xc1\xdc\x8b\xd9\x06\xd1\xf2\x84\xb1\xad\x11\x26\x04\x41\x08\xe4\xd5\x3b\x1c\x21\x70\x9e\xc3\x47\xfa\x80\x64\x1d\x04\x32\x4a\x2e\x45\x6b\x11\x1a\x15\xe2\x68\x42\xfc\x79\x73\x7f\x11\x5d\x9f\x7b\x68\x4a\x11\x82\xab\xc0\xe9\xf1\xf1\xd9\x94\xe4\x84\x89\x00\x83\x8e\x10\x7a\x2e\x6b\x62\x6e\xef\x67\x14\x78\x39\x46\x3b\x65\xf6\x81\x33\x14\xbd\xd0\xf7\x6c\xc9\x93\x55\xc5\x0c\x33\xae\x96\x9d\x32\x27\x99\xf9\xec\x6e\x35\x4a\x08\x36\xce\x3c\x18\x2f\xe6\xdd\x83\xc9\xe4\x21\x72\x35\x59\x6e\x1e\xbc\x09\x10\xb9\x92\x19\xa4\x89\x7a\x92\x4d\x5d\xb8\xe3\x3c\xa9\x58\x39\x30\xf1\xd1\x94\x24\x80\x71\x54\x8c\x4f\x12\xef\xb4\x83\x48\x9a\xb4\x54\x81\x08\x4c\xa5\xb9\xd3\x44\x23\x4c\x62\x74\x96\x64\xb0\x2d\xf3\x69\x7b\xfb\x2a\x0a\x31\xfa\x5c\x66\xfe\x2a\x81\xc5\xdb\x57\x88\xe0\x65\x57\xc8\xaa\xc4\x69\x48\x16\x5f\x73\xfb\x0a\x5d\xd6\xcf\x65\x30\x56\x06\x4c\x92\xf6\xde\xde\x45\xf0\x56\x45\x88\x96\x19\x40\xe4\x86\x98\x13\x72\xe6\x31\x9c\xe2\xd3\xf3\xb7\x85\x28\x0e\x10\x04\xe1\x1b\x03\x64\x78\x6f\x8c\x10\x5d\x7d\x63\xa8\x7e\x15\x9e\x80\xf0\x7d\x5a\xf8\x6b\x0b\xe5\x2e\xcf\x28\xde\xe0\x8d\xdc\x38\xa8\x91\xbe\x11\x2c\xd6\x37\x92\xe6\xf3\x0a\xed\xc2\xa7\x1b\xa0\x74\x45\x12\x31\xdc\x02\x66\x2c\x6f\x90\xb0\xd2\x57\x87\x77\x9f\x57\x5c\x17\x37\x1d\xc1\x4a\x1b\x79\xd1\x31\xf5\x8d\x97\x36\x52\x01\x12\x76\xf8\xaa\x49\xf3\x79\x85\x76\x60\xd3\x79\xd5\x89\xb9\x8d\x64\x20\xe3\x87\x23\xa4\x90\xc3\x08\x35\xef\x3e\x83\xf3\xfb\xa7\x71\xfe\x57\x94\x98\xc6\xc5\x0d\x66\x46\x19\x25\xe9\x98\x61\xb1\x20\xb4\xa0\xc8\x72\x3c\x25\x3c\xf8\x54\x69\x02\x91\x3e\x4e\x7f\x90\xb2\x8f\xd9\x34\x8c\x9c\x18\x8c\xab\x04\x02\x8f\x46\xef\x22\x4f\x5e\xd6\x2a\x7d\x3c\x62\x1e\x6c\x49\x83\xb7\xb3\xda\xd1\xc2\xae\x2c\xc4\x8a\x17\x64\x6d\x8f\x54\x43\xd5\xd5\xa0\x42\x64\xd0\x73\x52\x83\xb7\x95\x16\x43\xe0\x38\xa5\x34\x5c\x09\x02\x90\x95\x7a\xf3\x8f\x34\x0c\x62\x33\x58\x08\xfe\xcf\xf2\x22\x0b\x01\x0b\xd0\x56\x8c\xb1\x3b\x1e\xf2\x08\x9e\x75\x13\x9c\xf1\x98\x46\x5e\x95\x62\x46\xa2\xb5\xae\xc7\xb5\x3d\xab\x2a\x38\x43\x41\x34\x34\x6e\x4e\x04\x34\xc5\xae\x79\x92\xb0\x57\xbf\x72\x7b\x02\x7b\xfc\xcd\xbc\x77\xfc\x44\xd9\xc2\x3c\xae\x5c\x2f\x29\x97\x35\xc5\x34\xe7\x65\xf1\xd4\x2b\xae\xc1\xd7\x14\x6a\x22\x0b\x09\x01\x12\xaf\x7c\x82\x09\x50\x4c\x69\xe4\xb9\xc2\xeb\xc2\x9e\x4e\xbe\x38\x22\x27\x34\x66\xf6\x7e\x8a\x76\x10\x31\x89\x93\x67\x0f\xc2\xd1\x0b\xf2\xb3\x04\xc9\xa8\xec\x05\x35\x14\xef\x33\xa2\xa6\x31\xf5\x78\x16\xb1\x72\x90\x9c\x4e\xe2\xfa\x75\x24\xb1\x78\x9f\x8c\x63\x56\xd5\x31\x58\x4e\x59\xbd\x32\xa3\xe3\x65\x0f\x62\x9c\x38\xd6\x60\x5c\xc7\x54\x1c\x55\x98\xdb\x81\xc7\x4a\x98\xa2\x3f\xf6\x70\x10\x4c\x63\xde\x13\x5d\x51\xe1\xca\x8c\x9c\x4a\x28\x1d\x7f\x08\x05\xcb\x56\x45\x10\x4f\x93\xe6\x55\x60\x91\x3f\xe2\x5e\x83\xa7\x89\xec\xdd\xf8\xa6\xfb\x0b\xd5\x69\x85\x80\xe1\xa7\x95\xb8\x3d\xf5\xa5\x45\x91\xfb\x8c\x22\x30\xfe\x88\x1d\x90\x08\x19\x7e\x8a\xcc\xff\x5c\x2e\x6b\x62\x59\xa7\xb2\x87\x8d\x04\x42\x16\x7a\x29\xc8\x01\x62\x5c\xa5\x7c\xec\x30\x48\x23\x1f\xe3\x93\x23\x7c\x9d\x3c\xf5\x42\xc8\x04\x60\xc3\x14\x2d\xb8\xbd\x5f\x79\xe6\x83\x24\xfb\xfa\x6d\xf7\x80\x37\x2c\xcb\x86\xbd\x06\x1b\x27\x7d\xcf\xc5\x42\x75\x32\x39\xdb\x74\xe3\xb1\x3a\x19\x01\xd9\x74\xa5\x58\x25\x51\xb3\x8f\xc0\xc2\x32\x71\x35\xc8\x49\x55\xe7\xc8\x75\x35\x13\xf1\xf9\x92\x4b\x5d\x9b\xfa\xf3\xa7\xd8\x71\x9f\x34\xac\x3a\x7f\xe6\x1b\xb1\x91\x0a\x66\xe2\xb8\x2a\xae\xa9\x0f\xd6\xbd\x43\x61\x4a\xb8\x47\x48\x03\x80\x7b\x1e\xee\x70\xe2\xb9\x01\x72\x23\xff\x13\x14\xd7\xbf\xe0\xe6\x2c\x9d\x99\x55\xb1\xd7\x61\x9c\x86\xbf\x54\x69\x8a\x6e\x1e\xa0\xe8\xae\x77\x9c\x75\x5a\xd1\xd1\xc7\x03\x27\x5c\xa6\x60\x52\x82\x44\x89\xf9\xd2\x2c\x5a\x28\x2a\xee\xb9\x66\x3a\x66\x64\x28\xdf\xc4\x72\x3a\xc9\x35\x44\x24\x1e\xa0\x3c\xac\xb4\x1f\xe8\xde\x5d\x05\xa4\xfe\xe4\xf9\x81\xef\x88\x58\x25\x27\x7b\xa4\x98\x67\xdb\x7f\xd3\xb0\x08\x65\x68\x8a\x97\xcb\xdf\x0c\x62\xf7\xf1\x84\x35\xb4\xd2\x61\xb8\x49\xf1\x19\x16\xec\x83\xe8\x80\xcc\x16\xe2\x25\x4b\x70\xe3\x12\xc4\x0a\x95\xa2\x6a\xce\xcc\xb5\xf8\x06\xca\x86\xde\x84\x0a\xe1\x09\x45\xcb\x14\x64\x47\x52\x45\x08\x38\xa3\x20\x41\x07\xba\x3b\x25\x45\xd0\x5d\x28\x77\x12\x4d\x93\xa5\xc1\xd8\x4d\x25\xdb\x04\x96\x2a\x71\x69\x66\x4a\x1f\x83\xd9\x6b\x0f\x14\xe5\xa8\x6e\xa1\xc5\x08\xdb\x4a\xad\x58\x0d\x4b\x5a\xbc\x0a\x29\x96\x06\x3c\xcb\x71\xed\xaa\xc4\x2c\x72\x22\x9e\xe4\x72\xc9\x8f\x1d\xc4\x6c\x37\xc3\x6c\xde\x14\x53\x27\x9b\x99\xa2\x36\xb7\x5b\xd9\x1a\x81\x50\x83\x93\x70\x05\xf5\x25\xbf\x00\xeb\x64\x87\x78\x91\xbd\x10\x3d\x82\x17\x9f\xce\x28\x98\xdb\x1a\x33\x0c\x3e\x33\xe3\x03\x2b\x28\xa2\x1c\x82\x97\xa6\x80\x28\x9e\xd5\xf1\x20\xae\xc5\x50\x5b\x5f\xb0\x26\x50\x5f\x9b\x77\x36\x88\x8f\x62\x85\x60\x02\x24\x2a\xb9\xe3\x9b\x5d\x2b\xb1\x2e\x35\x60\xc3\x84\x12\xa0\x92\x4b\xfd\xc6\x67\x57\xd6\x95\x20\x96\xdb\x8c\x9d\xe4\x0e\x9f\x09\x7a\x4d\x9e\x6c\x74\xd8\x05\xcb\xfe\x94\xd1\x57\x08\x4e\x0c\x58\xb1\xe4\x55\x57\x36\x9c\x0f\x5e\x67\x86\xb4\x99\x90\xe5\x8e\xcf\xd7\x86\x05\x43\xf0\x5c\x24\x84\x58\x41\x42\x4d\xc2\x3b\x71\x86\xc8\x9a\xbe\xf8\x9c\xbb\x50\x89\x18\xe5\xc0\x86\xb2\x91\x8b\x4c\x5b\x2d\x12\x5c\x7f\x01\xf9\xaf\xaf\x45\xbd\x6f\x1a\xbd\x6c\xd9\x4f\xc8\xcb\xb9\xb6\xef\xac\xf7\x08\xc1\x3c\xcd\xc9\xc5\x1f\x16\x9b\x9e\x90\x14\xc5\xc0\x21\x40\xf4\x19\x83\x9f\xe9\x59\x5b\xb0\xa8\x59\x2f\x25\x9d\xc4\x4f\x2f\x80\xa1\x19\x33\x7f\xee\xab\xd4\xa7\x60\x1e\x2f\xd9\x29\x1c\x13\x76\x85\xc0\x0b\xa4\x9f\x12\x82\xc3\x4a\x43\x62\x69\x53\x76\x70\x48\x7c\x1c\x2d\xb4\x3b\xf2\x62\x61\x86\x89\x3b\xdf\xca\x9b\xd6\x08\x5f\x46\x48\xe2\x00\x08\x88\x37\x96\xc3\x41\xac\xc7\x07\xa2\x9f\x10\xca\x2c\x96\x6b\x3d\x44\x02\xc3\xbf\xd2\x58\x52\x94\xf5\x3a\xb6\x0b\xb6\xec\x74\x2b\xe1\x2c\x46\x36\x40\xcc\xc1\x77\x1a\x6b\xf7\x42\x89\x7c\x60\x02\xb7\xa8\x1c\x92\xaa\xb4\x31\x68\x26\xd5\xc9\x90\xc4\x51\x9c\x8f\x1d\x97\x3d\x45\x02\x53\x41\x11\x01\xc3\x4d\x90\x49\x41\xd9\xd5\x51\xe0\xc4\x6d\xbe\x93\xed\xaf\x49\x8e\xf0\x72\xc0\x52\xb7\xe2\x08\x5b\x80\x5b\xc5\x11\x24\x08\xca\x1e\x3a\x73\xac\xfe\x0b\xcd\xf5\x45\xd6\xa4\xba\xb2\x94\x30\x05\x16\xa5\x56\xbe\x1c\x3d\xe7\x7f\x13\xca\x01\x16\x5a\x0a\x6c\xa8\xe3\x29\x92\xd5\x70\x29\x8d\xe0\x9e\xbe\x98\xc6\x13\x96\x86\x27\x44\xa8\xd1\x52\x6a\x78\xbc\x9f\xb8\xd8\x3d\x26\x42\xf4\x17\x52\xd9\x54\xbd\x4c\xee\xc3\x45\x4e\x96\x51\xe4\xda\x3f\x71\x99\x3b\xbd\x19\x33\x5e\x44\xc3\xe5\xf2\xf7\x23\x01\x4b\x62\x67\x9e\xf4\x44\xcc\xf2\xe1\x94\x75\xea\x34\xf1\x3c\x55\x7c\xbb\x24\xf0\xa2\x8b\x54\xd6\x26\xdc\xf1\xe0\xef\x2b\x06\xa0\x2b\x31\x5f\x18\xa9\xda\x14\xc0\xfa\x49\x04\x6b\x55\x6c\x60\xee\x0b\x96\x86\x5d\x50\x76\xac\xbb\x25\xa0\x69\x18\xab\xfd\x46\x36\x04\x8e\xbd\x98\xf7\x8e\x1a\x45\x3a\x2e\x56\x01\x5c\x28\x87\x27\x94\xdc\x24\xed\x80\xa6\x06\x47\xd5\x14\xd5\xcd\xe7\xef\x3c\xeb\x66\xfe\xa0\xa0\xb9\x8c\xa7\x49\xac\xa0\xdd\xf1\x7c\x97\x38\x8e\x31\x94\x0e\xe4\xd0\xac\x4e\xc6\x9a\x90\x15\x25\x2e\x37\x0e\xa3\xe8\x6a\x75\x72\x72\x93\x61\xbe\x4d\xb2\xe7\xcb\xa5\x35\xde\x8c\x81\xc8\xfa\x4e\x02\xeb\x4a\x07\xc4\x95\x6a\xa1\x24\xa0\x88\x9a\x79\xc4\x00\xf0\x46\x83\x68\xf8\xf8\x3c\xc6\x51\x97\x9b\x20\xac\x1c\x2f\x08\x96\xe5\x1f\xdb\xb1\x75\x94\x83\xa6\x34\x95\x74\xcf\xe3\x13\x98\xc4\x1b\xa0\x00\x87\x39\x9b\x39\xca\x31\x4a\x98\x08\x4b\x95\x4b\x4b\x4a\x4d\xca\xe7\x71\x0c\x14\xa0\x45\x2a\xbb\xaa\x9c\xdc\x4f\x7a\xaa\x5c\x4e\x75\x7b\xc7\x25\x09\x0a\x0f\x0f\x2b\x53\x8b\x38\x9a\xb7\xf0\x6c\x9e\xc5\x42\xcb\x94\xc0\xb5\xde\x7b\x41\x8f\xe9\xef\x99\xd4\x5b\x36\x18\x20\x4e\x79\xa5\x6d\xe2\xb2\x60\xbd\x99\x16\x57\xd9\x4b\xdd\x3c\xfe\x3e\x01\xf9\x23\x1a\x20\x4b\x2e\x71\xe5\xc1\xda\xd2\xe7\xc0\x34\xb1\x11\xa4\xbc\x08\xa7\x2b\x02\xef\x0e\xb1\x60\xf2\xc9\x60\x9c\x92\x87\x22\x0d\x00\x4a\x50\xd5\xbb\x3b\x9c\x8b\xfc\xab\x97\xaf\xc2\x43\x5a\xd1\x28\x93\xa7\x30\xd5\xc1\xb9\xed\x4f\xd5\xe9\xd8\xe6\x4d\xf4\xa0\x49\xbd\xb7\xd8\xc6\x60\xa1\xc4\x0c\x69\xf0\x54\x47\xb0\x46\xf3\xec\x1b\xf0\x16\x8c\xd3\x34\x60\xaa\xb4\xa7\x23\xcf\x86\x51\xfd\xc8\xae\x46\x20\x9d\x66\x4e\xc5\xed\x2b\x34\x35\xd7\x98\x78\xd6\x3a\x7c\xc7\xae\x21\xe4\x78\xe3\xbd\x73\x3a\xed\xc1\x1a\xe5\xa7\xf8\x34\x1f\xed\xfe\x02\x27\xf1\x46\x92\xec\x74\xb8\x7d\x84\x88\x2b\x07\x81\x27\xa1\xf7\xca\x1e\x80\x47\x2d\x44\xcf\x62\xe2\xc4\xb2\xac\x62\x0f\x02\xcb\x21\x83\x67\xce\xfe\x73\xf7\x3d\x04\xed\x14\x23\x38\x3f\x45\x37\x27\x9e\xbf\xa3\x4d\x6c\x74\xfb\x93\x5b\x9a\x22\xb3\xd2\xd0\x8e\x81\xd5\x9f\x39\x53\x84\x6f\x5e\x1f\x3b\x38\xcd\xc9\xc6\x7b\xf6\x7c\xcb\x4a\x92\x5b\x85\x01\x48\x07\xaa\xc0\x0a\x81\x17\x4b\x04\x74\xd9\x3e\xb6\x68\xb7\xe8\x9c\x44\xaf\x3a\x57\xd2\x1a\x03\x00\xf4\x43\x5b\x9f\xa2\x74\x16\x36\x89\xd5\x24\x83\xa5\x13\xab\xd9\x50\x4f\x7c\xc7\x2a\x9c\x83\x30\x71\x2c\x38\xbb\x46\x7a\xce\x66\x5b\xf5\x27\xb7\x77\x85\x4e\x60\x4b\x16\x22\x4c\xfd\xa5\x44\xee\x61\xd5\x33\x4c\x44\x7d\x36\x1d\xb9\x5b\xbe\xe4\xc9\xfe\x0c\xc4\x80\x5f\x52\x9d\x69\x54\x67\xca\xe7\xff\x81\x39\x21\x15\x20\x48\x73\xbe\x61\x15\x12\xeb\xaa\x1f\x52\x50\x45\x16\x7c\xc9\xed\x0d\x38\x3f\xe4\x0e\x28\x51\x9d\xa2\x80\x9b\xc8\xb5\x61\xc5\x2c\x59\x3c\x65\x79\x37\xa3\x7a\x1a\x23\x30\x6a\x1e\x8c\x90\x3c\x0d\x36\xbf\x89\xa6\x18\x06\x5c\xae\x8f\x19\xa1\x70\x3a\x04\x91\x98\x53\x1f\x5f\x5d\x11\x89\x35\xb1\x61\xc5\x8f\x79\x9d\x07\xb3\x07\x3b\x12\xab\xec\x11\xfc\x8b\x33\x00\x0e\x5a\xa7\x7c\x42\x88\x98\x8d\x69\x03\x58\x6a\xed\x69\x9d\xe0\x8a\x34\x16\xb5\x08\xf6\xe9\xc8\x05\x1d\x62\x2c\xc4\x2c\x94\xe4\xc8\xbe\xdd\xea\x28\x74\x10\xa4\xe6\x49\x7d\x06\xd5\x42\x0c\x8a\xa5\x7f\xc0\x5e\x70\x51\x69\xee\x5e\x13\x6b\xd1\x2d\x4f\x13\x0b\x99\x28\x67\x58\x93\x90\xb7\x7b\xa8\x55\x31\x0f\x65\x3e\x49\xdd\x1f\x0f\xb6\x1c\x25\x58\x20\x53\xb2\x70\xa0\xe4\xd2\xd4\x1f\x49\x93\x62\x61\x3a\x5f\xea\x85\x38\x08\xb1\x3a\x71\xc8\x75\x4d\x58\x4c\xac\x5d\x18\x12\xee\xa9\x67\xca\x26\x0d\x33\x80\xa3\x7e\xe8\x14\xfd\x84\x26\x84\x63\xdd\xef\x05\x53\xc7\xe3\x82\x85\x4c\x31\x88\x61\x09\x5c\x83\x17\x7c\xe4\x20\xf8\x41\x8d\x70\xe1\xac\xf6\x35\x42\xb1\xcb\x97\x9a\xe1\x02\x71\x5b\x22\xa0\xcf\x97\x86\x79\x0b\xfa\x97\x18\xb2\x9b\x7c\xc9\xbd\x93\x94\x20\x55\x3a\x10\x9c\xca\x76\x01\x0c\x4a\x1c\xfc\xa4\xdb\xe8\x30\x58\x4d\x0d\x9f\xd0\xd2\x38\xe6\x20\x36\x73\x88\x68\x4a\x07\x28\x65\x37\x21\xf4\x04\xb7\x49\x62\xd8\x05\x96\x0b\xc3\x01\xa4\x17\x21\x65\xac\x2f\x9b\x2f\xf9\xa9\x65\x91\x4d\x82\x85\x19\x28\x52\xbe\xd4\x73\x55\xac\xbf\xb9\xa0\xe1\x5a\x25\x12\x98\x58\x81\xc7\x7c\xa9\xe9\x21\x1b\x9a\xf6\x3b\xc2\x40\x34\xda\x82\x78\x2a\xc8\xbb\xf6\x34\xa4\x6d\xc3\x13\xba\x22\xd5\x5d\x21\xdd\xd1\x3a\x0a\x74\x3d\x00\x10\xa8\x71\x02\x80\xe0\x5b\x3f\x80\xa7\x39\xee\xf6\x68\x4a\x3c\xa7\x20\xb8\x45\xa6\x85\x6c\x88\x5b\x5b\xc3\x69\x21\x1b\x2d\xd3\x51\x83\x35\xa5\x07\x16\xc8\x3b\xb8\xc8\x4e\x8b\x60\x44\xaa\x8e\x2d\x29\x58\x93\xd9\xc3\xc2\x9e\xbf\xa0\x1f\x23\x00\x41\xb0\xa4\xb8\x28\x54\xa6\xdd\xcc\x13\xc0\x9a\x51\x3d\x27\x82\x1a\x6f\x73\xc0\x55\xcc\x27\x9c\x4e\xe2\x31\xf4\x6a\xdb\xc9\xf4\x6c\x65\x66\x54\x31\x12\x13\x67\xcf\xea\xe0\x78\x97\xd5\xc9\xf9\x9c\x1a\x00\x8c\x2a\xf0\x11\x9c\x99\x1a\xf1\x96\x72\xbe\x84\xd0\x09\x8e\x2b\x18\x9f\x3e\x4b\x79\xf1\x20\x64\x6b\x82\xc2\x55\x5a\x44\xce\x89\xe7\x3f\xbe\x11\x3f\xc5\xdf\xb5\xa9\xc5\xd9\x5a\xc1\xb0\x25\x02\xdd\x25\xa8\x61\xa3\xd0\x91\xf5\x91\xe2\x89\x06\x6a\x52\x83\xfa\x68\x02\x0a\xda\x80\x6b\x2a\x5c\x0e\x1a\xa3\xb8\x31\xc3\x56\x83\xb7\x02\xbc\x0b\x6e\x34\x43\x4e\xee\xe7\x8c\x57\x3d\x9b\xdd\x54\xc8\x83\x4f\x67\xaf\x7a\x27\xf7\x73\x46\xab\x06\x41\x94\x83\x44\xf2\xac\x91\x26\xbb\xd7\xd8\x17\x13\xf6\x38\x25\x9a\x73\x7f\x99\x09\x15\x90\xcd\x2f\xf0\x10\xc3\x53\x61\x2c\x31\x09\x12\x9d\x5c\x6b\x9e\x2a\x07\xce\x40\xdc\xe9\x6d\x20\x61\x0d\x96\x65\x9a\xbd\x03\x8f\xab\x00\x88\x7b\xd1\x1a\x07\x02\x07\xd7\x68\x28\x73\x90\x68\xab\x07\xb1\xe3\x50\xeb\xdb\xbb\x1c\xab\xd9\xf8\x29\x0b\x64\x76\x4e\x06\xc8\x67\x29\x24\x8d\x96\x65\x48\xac\xef\xc4\x73\x0f\x93\xc3\xc8\xf9\xa8\x96\xc3\x4f\x8b\xe0\xa2\xa3\x89\x4d\x51\x1b\xe7\x1c\x55\xd0\x61\x92\x7f\xd5\xe7\x18\x4d\x9a\xda\xc5\x2a\x1d\xa2\xa5\x17\xca\x29\x37\x39\x80\xeb\xe7\xc4\xcc\x6a\x3f\x4b\xcc\x26\x09\x0b\x99\x26\xe4\xc0\x0a\x02\x60\x63\x48\xaa\x32\x24\x76\x02\x17\x4a\xcb\x83\x66\xb3\x7d\x6c\xde\x3e\x37\xd9\x7c\x68\x4e\x09\xa8\x2f\x09\x48\x3f\xbb\x4e\xe8\x55\xcc\x71\xae\xa3\xe7\xc9\x9b\xb0\xbe\xe6\x77\x49\x76\xa6\x51\x76\xe0\x5d\xac\xaf\xcd\x84\x73\x01\xfc\x73\xe0\xbc\x0e\x93\x84\x00\x6d\x2b\x1a\x1e\x5c\xad\xbc\x3c\x7e\x96\x68\x78\x4c\x96\x16\xd2\x47\xb0\x61\x4a\x71\x4f\x2b\x0b\x18\xf6\x11\x4c\x10\xb9\xd7\x80\x0d\xb5\xe8\x3b\xb2\x30\x2a\x86\x13\x4a\x4c\x22\x46\x92\x37\x75\x61\x75\x1b\xe1\x1b\x30\x8c\xe7\x82\x0d\x83\x10\x47\x75\xc5\x9e\x21\x5f\x4b\x23\xbb\x11\x5d\x3c\x44\x9f\x57\xe2\x04\xc1\x88\x77\xbc\x17\x1e\xf4\xa4\xe5\xf7\xc0\xbf\xf2\xb8\xc4\x76\x50\xc2\x33\xd8\xd6\x78\xf9\x64\x81\xaf\x0f\xf6\x7a\x42\x57\xe9\x1f\x4e\x08\xb2\x50\xd1\x8f\xc4\x56\x6b\x42\x35\x8f\xa3\x89\x11\x9b\xa4\x7c\x6d\xa7\x60\xf4\xcc\xe6\x3a\x28\xbb\x5a\xc2\x66\x18\x11\x1d\x63\xbe\xd4\xcf\x79\x3a\x99\xb9\x29\x6e\xef\xc4\x1d\x04\x03\x2b\x45\xe1\x18\x5d\xd8\xd5\xb9\xf2\x83\x19\xf2\xa1\xdf\x97\x8b\x87\xcd\xf6\xe3\xe9\x9d\x78\x93\x91\x29\x4c\x9f\xca\xa0\xf0\xb3\xda\x88\x25\xcc\x23\x50\xdf\x2c\xda\x5b\x0d\x21\xcc\xd0\x48\xa0\x64\x3b\xc5\x62\x6e\x0f\xc1\xe9\xb2\x7f\x40\xd4\x58\x69\xab\xfb\x67\x84\xd1\x01\xf5\xf0\x98\x0c\x04\x33\xef\x9b\x56\x67\x1a\xc7\x4f\x8d\x58\x1c\x30\xfa\xb6\x1d\xb7\xaf\xbc\x72\x15\x29\x71\xc9\xb6\x53\x9f\x95\xce\x62\x6a\xf3\xe6\x75\xec\x66\x24\x2d\x21\x23\x80\xe7\x05\x98\xb0\x77\xd0\xb7\xea\x02\xe7\x21\x1a\xc1\xe5\x2f\x4e\xe3\xe2\x3c\xca\x59\x1b\x0a\xaf\x9d\x48\x03\xa4\xc3\xea\x1c\x9f\x05\x20\x38\xe2\x6b\xf5\xc2\x8f\x9f\x9f\xb5\x39\x91\xb5\xfb\xfc\xac\x47\x8a\x3a\xa6\xdc\x23\xb1\x9b\x77\x17\x1a\xf4\x19\x0a\xfa\x20\x6f\xb2\x9f\x9f\xb7\x1f\xb1\x2a\x73\xb1\x7a\x87\x13\x79\x5f\xa2\xde\x71\x94\x77\xb8\x58\xbd\xd3\x89\xbc\x2f\x51\x6f\x2c\xba\x2b\x4e\x57\xfe\xcc\xe7\x6c\x56\x91\xec\x3a\x98\x79\x02\x87\x7d\xbe\x64\x1a\x20\x90\x22\xb4\x7c\xa9\xf0\x12\x6b\x2b\x20\x73\x03\x3a\x83\xb3\xb0\x70\xda\x17\x21\xeb\x82\x6f\x5f\xa1\x55\x94\xa6\x7e\x4e\x61\x15\x59\x22\xb3\x7c\x6f\x0e\xf7\x98\xf8\x5e\x7c\xba\x8a\x39\xf9\x15\xf1\x0b\x2f\x3f\x0a\xfe\x61\x95\x17\xbc\x96\xc3\x1b\xdb\x7d\x13\xbb\x6f\x62\x7e\x73\xfe\x7a\x9a\xf9\xfe\xe6\xee\x6e\xb9\x5d\x2c\x85\xf9\xef\x5e\xfe\x7d\x51\x56\x8b\xf7\x55\xf9\xb0\xd9\xbe\xe8\x18\xbf\xb5\x0f\xd5\xf5\xbb\xf5\xdb\xb7\x1f\xf5\x4f\xe5\xfd\x5f\xae\x3b\x29\xfe\xc8\x4f\x7f\x28\xef\xff\xa2\xae\x77\x75\x38\x70\xfd\x53\xf9\xb6\x9b\xa4\x09\x13\xfe\x43\xf9\xb6\x93\x68\x51\x6e\x1f\x8e\xa5\xba\x29\xb7\x0f\xea\x83\x04\xd9\x7a\x31\x8c\xba\xa5\x76\x0f\x9b\xed\xf2\xc5\x20\xd6\x8f\x5a\xbe\xdf\x6e\x5e\xf4\x03\x4c\xa8\xd7\x02\x2d\xf2\x62\x88\x35\xa2\xde\x2d\x77\xdd\xb4\x7f\x5c\xee\x36\xea\x7a\x21\x30\xca\x5c\xa5\xd7\xdd\x2a\x1d\xd0\x95\x15\x37\xfb\x45\x1f\x3d\x57\x5d\xe7\x32\xf4\x4f\xeb\xaa\xba\x1e\x95\xf4\xc3\xba\xaa\xd4\xf5\x52\x2f\x56\xcb\x45\xaf\xc7\x32\xda\x80\x7a\xb7\x79\x7f\xff\xfa\xc5\xc0\x2b\x56\x6d\xdf\xbf\x5b\x76\x1b\x28\xfe\x83\xea\xc3\xe6\xfe\x45\xcf\x85\x4a\x7d\x5c\x76\x9f\xfc\x9f\xe5\xbd\xfa\x29\x5b\x37\xbf\x18\xd9\x3b\xab\xed\xfb\x9f\xaa\x7e\x9e\x3f\x55\x4b\x75\xcd\xef\x86\x43\x55\x1b\x3b\xaa\xeb\x65\xad\x95\xe8\xb7\xdb\xcd\xfb\x77\xbd\xea\x77\xcf\x0d\x54\x93\xee\x48\x02\xf5\x26\x4b\x14\x2f\x46\x32\xc6\x3f\xd4\x1f\x7e\xfa\xcf\xe5\xe2\x01\x5e\x2f\xdf\xac\xef\x97\x7f\xdc\x6e\xde\x2d\xb7\x0f\x1f\x7f\x33\x24\x4a\x75\xbd\x2b\xf7\xeb\xfb\xb7\xbb\x6b\xb5\x86\xd7\xcb\xdd\x62\xbb\x7e\xf7\xb0\xd9\xde\x6c\xee\xdf\xac\xdf\x8e\x52\xff\xdf\x2e\x85\xfe\xfb\x77\xdf\xa9\xeb\xf7\xf7\xb9\x80\xd7\xd7\xff\xed\xe5\xc3\xc7\x77\xcb\xcd\x9b\xab\x0f\xeb\xfb\xd7\x9b\x0f\xff\xe3\x7f\xe4\xbf\xb0\x2a\x77\x7f\xf8\x70\xdf\x56\xe0\xfa\xa6\x2a\xb7\xeb\x87\x8f\x2c\xfe\xec\xae\xbf\x6b\x93\x75\x1f\x43\xf9\xfa\xf5\xa8\xec\xef\xfe\xa1\xae\xe1\xfb\x77\xdb\x0d\x37\x6b\xf7\xfd\x9a\x13\x7e\xbf\xdb\x2e\xbe\xdf\xc9\xeb\xef\x17\x9b\xed\x52\xe7\x7b\x78\xd8\x5d\xbf\x78\xf3\xfe\x7e\xf1\xb0\xde\xdc\xff\xe6\x41\x2d\xd5\xf6\xbb\xbf\x5f\xbf\xdf\x2d\xaf\x76\x0f\xdb\xf5\xe2\xe1\xfa\xb7\x27\x3a\x47\x5d\xff\xc7\x7f\x2c\x77\xaf\x36\xaf\xdf\x57\xcb\x6b\xf5\xf7\x7d\x59\xbd\x5f\xbe\xf8\x6f\xc5\x3f\xf2\x64\xde\x36\x13\xf9\xd0\xdb\x93\xed\x76\xf3\xe1\x65\x77\xb2\x2c\xdf\xfd\x7e\xb3\xfd\x50\x6e\x5f\x53\xe7\xf1\xef\x3e\x2e\xa7\xeb\xd7\xcb\xfe\x93\xee\xaf\xfd\xf2\xfe\xe1\x65\x8f\x27\x2c\xef\x5f\x97\xdb\x6e\x49\xf7\x6f\xab\xe5\xff\xdc\xc8\x99\xe9\xe1\xe9\x7c\xbd\xfc\x70\xb3\xa9\xde\xdf\xdd\x77\x6b\xf5\xe3\xb2\xdc\x2e\x56\xdd\x64\x77\x3f\xbc\x7f\xdb\xf9\xfd\xfb\x75\xf5\xb0\xdc\xfe\xcb\x76\xfd\xfa\x46\x94\x88\xa3\xaf\xba\xf5\x93\x2d\xbf\xf5\x6e\xbe\xdc\x3e\xac\x17\x65\x75\xe4\xd5\x74\xb3\x5d\xff\x6d\x73\xff\xd0\x7b\x79\x53\x6d\xde\x77\xf3\xf9\xd7\xbb\xf2\x6d\xb7\xb0\x1f\x96\x55\x37\xf9\xef\x37\xd5\xeb\xe5\xf6\x0f\xef\x96\xf7\xa3\x87\xc3\x9e\xe8\xfc\xfe\xb7\x5d\xef\xf5\x0f\xe5\xb6\xdb\x17\xd3\x65\xf5\xee\x5f\xef\xdf\x6c\x5e\x76\x19\xdd\xf6\x7e\x7d\xff\xf6\xc7\x87\x92\xfb\xb8\xd7\xce\xed\x76\xb3\x3d\xf2\xfc\xc7\xf7\x8b\xc5\x72\xb7\x3b\xf2\x86\xb3\x3e\xf1\x78\xd4\xb5\xc2\x94\x46\x4f\x7f\xf7\xd7\x45\x55\xde\x95\x4c\xaa\x8f\xbd\xfb\xd3\x76\x5d\x0e\x1a\xfe\xa7\xf5\x5d\x8f\x18\x33\xc4\x4a\x97\xd3\x74\xc7\x7c\xba\xb9\xeb\xf5\xda\xfd\x5f\xee\x37\x1f\xee\x7f\x7c\x28\x1f\xde\xef\x5e\xee\x37\xeb\xd7\x57\xc5\x6f\xf7\xe5\xf6\x6a\xfd\x72\xfb\x9b\xe3\x13\xed\xfd\xc3\xba\xda\x7d\x7f\x60\x12\x7a\x21\x5c\x82\x67\xdb\x77\xea\xfe\x13\x9f\xed\xf6\x6f\xf5\x43\xf9\x56\xbf\x5d\xde\x2f\xb7\xbc\xda\xc9\x67\xbf\x3d\x55\xa1\x81\x8a\xf4\xc4\xd0\x83\x58\xe3\xd3\x04\x70\xf5\x06\x35\x79\x20\x53\x87\xb3\x1b\xc3\x70\x9f\xf0\x02\xfa\x34\x02\x13\x59\x08\x0a\xe5\x38\xa0\x03\xb5\x53\x68\x12\xbc\x06\x70\x5e\x05\xa0\xfa\x92\xdf\xb8\x1c\xed\xa2\x90\xf8\x18\xc6\xaa\x7c\xad\x05\x1e\xd1\x6c\xac\x55\x1d\xff\x6d\xc3\x9f\x22\x95\x09\x0c\xa9\xd4\x42\xa1\x28\x03\xc9\x6a\x84\x40\x79\x4b\xd9\xb5\xe8\x16\xca\x02\xfa\x7c\x82\x4a\x98\x2f\xcd\x56\x8f\x91\x98\x0d\x69\x91\xa3\xdf\xf8\xa4\x25\x02\x89\xec\x96\xbb\x8c\x76\x81\xb6\xd2\x10\x09\xd0\xed\x6d\x37\x22\x4f\xd6\x7d\x31\x01\x86\x1b\x12\xeb\x47\x0c\x72\x4e\x61\xeb\xd0\x6c\x36\xef\x63\x2b\x1c\xfb\x04\x09\xe1\x5d\xc4\x1f\x19\x82\x94\x4b\xa9\xd2\xe8\x34\xf6\x1d\xcd\x2c\xaa\x82\x9f\x2b\x74\x7d\x00\x89\x6c\x65\x3c\xc3\xa8\xa4\x9a\x26\x6f\x52\x47\x08\x38\x48\x27\x99\x8c\xdd\xc3\x9e\x4f\x1c\x51\xac\xef\xb3\x3f\x96\x99\x1b\x9a\xc6\x39\xc6\x99\x57\x54\xcc\xfb\xc0\x54\x8a\x56\xb2\xe1\xe0\xe7\xc6\xae\xc2\x10\xb2\x2a\x41\xf0\x95\xa6\x63\xfe\xf8\xcf\x72\x5f\x93\x18\xf7\x1d\xf7\x92\x0c\x64\x92\x0e\x3d\x24\xfd\xdc\xeb\xa0\xdc\x37\x72\xa9\xfa\x5d\x5f\xdb\x70\x17\x95\xf4\x7c\x27\xcc\xa6\x94\xf2\xb9\x35\x3e\x00\x9d\x09\xb9\x89\x17\x75\x34\x4f\xee\xbd\x71\x50\x8f\xcd\x71\x6f\x93\x27\x92\x24\x46\x40\x85\xb8\xd0\x06\x92\x2a\x74\x50\x06\x50\x07\x15\x76\x06\x50\x05\xfe\xdf\x42\xde\xa8\xa0\xe5\x89\x0e\x3f\xb2\xbe\x24\xbd\xcb\x1f\xfe\xed\x2a\x67\x41\x66\xa1\x09\x22\xb3\x07\x4d\x40\xda\x69\xb7\x93\xbf\xca\x69\xb7\x90\x37\x8a\xe7\x2e\x29\xa7\x04\x51\x2d\x89\x57\x53\xfe\xf4\x6f\x97\xa3\x58\x43\x39\x30\x4a\x98\x65\x68\xd1\x58\xe9\x02\xbc\x46\x70\x15\xca\xd9\x8f\x5f\x14\x60\xb4\xd8\x4d\x88\x35\xa1\xd5\xfc\x1b\x41\x5c\x71\x39\x81\x5d\xe8\x02\x9c\xfc\xc3\x9c\x92\xdf\x72\x2a\x4e\xe1\xc5\xfc\x9c\xf3\xe3\x37\x9c\x79\xe2\x76\xdf\x50\x8e\xbb\x43\x05\x58\x25\xd1\x62\x82\x40\x84\xe4\xdc\x42\x0e\x39\xa7\x72\x9e\x12\xcc\x6b\x86\x56\xf9\x45\x5d\x0f\x31\x45\x55\xb9\x1e\xfc\xdb\xcf\x12\x08\x16\xf4\x4d\x12\x30\x24\x81\x27\x51\x4e\x10\xfa\x1c\xb8\x99\x93\x10\xd1\xe9\x46\xf4\x48\x79\x9f\xe4\xf8\x54\x80\xad\x2b\x2e\x89\xc0\x71\xe6\xa4\x72\x53\x04\x09\x5b\x0a\x43\xae\xb4\x0c\x07\xa4\x9b\x8c\x88\x99\xcd\x09\x24\x8c\x9c\x07\xb3\xe7\x3a\x17\x4a\x2a\xcd\xaf\x05\x68\x88\x14\x82\x9b\xc9\x0e\x3b\x56\x39\x1b\x57\x49\x53\xb8\x43\xb9\x6f\xb8\xd6\x52\x20\x3f\x2c\xe4\xa3\x54\x91\x24\xb0\x0b\xce\xa8\xc9\x2c\x7f\x9d\x38\x4d\x45\xd2\xb7\xb6\x42\x79\xef\x2b\xa1\x0a\x48\x8b\x5c\x71\xee\x09\x31\xcc\xe7\xd2\xf8\xef\x4a\xaa\x96\xad\x6d\x64\x64\x5c\x0d\x0e\xc2\x75\xe2\x61\x48\x55\x33\x2e\xf5\x40\x2d\x72\x2e\xa6\xae\x15\xd7\x2e\x8f\x64\x33\xd4\xf5\x48\xab\x3c\xca\x46\xb5\xb4\x50\x13\x4b\xd5\x10\x0f\xc9\x87\x5c\xb5\xa6\x99\xdc\x9f\x52\x3d\x7e\xbf\xe7\xa1\xbe\xe1\xc5\x90\x7b\xd2\x08\x16\x35\x8f\x4b\x4b\x8e\x7f\xbb\x92\x48\xce\x89\x89\xc7\x48\xe5\x70\x46\x91\x47\x0a\x9b\xfe\x0b\xf5\x00\x31\x45\x72\x3f\x60\x55\xbf\x60\xd2\x8d\xca\x08\x01\x2a\xe2\xef\xb9\x92\x42\xd9\x5c\x73\x53\x93\x18\x58\x9d\x9b\x29\x67\x1e\x3c\xc0\x4d\x0a\x71\xde\xb5\xc2\xca\x89\xbf\xe3\x4a\x1b\xf0\x33\x14\xef\x80\xfc\x7d\x3d\x0d\xac\x10\x3c\x49\xeb\xf2\xf7\x99\xf2\x8d\x74\x62\x14\x26\xce\xd5\xd1\x52\x9d\x3c\x95\x84\xd4\x6c\x9d\x49\xa8\x33\xe1\xf1\x90\x16\x70\x4e\x6e\x66\xa5\xed\x7b\x29\xdf\x70\x4d\x2b\x9e\x7e\xfc\x6d\xfe\x1b\xeb\xc9\xc1\xd5\x15\xec\xe2\xaa\xce\x7b\x16\x40\x22\x6a\x55\x5c\xb0\x84\x71\x83\x58\xd5\xd5\x5a\xe4\x22\x6d\xdd\x69\x81\xf9\x8b\xd4\x3b\xbf\xa7\x19\x7a\xf0\x62\x3a\x2a\x2e\xeb\xca\x80\x9b\x11\x32\x23\xce\x64\xd4\x92\xab\x48\x15\xaa\xfe\x52\x48\xb3\xe9\x63\xe9\xf0\xa6\xfb\xeb\xe1\x58\x14\xb9\x9b\xe5\x5f\xce\x20\x8f\x57\x21\x99\xb8\xaa\x1e\x60\xe6\xdc\xf6\xa9\xbc\xed\xbc\x18\x22\x99\x77\xcb\xdc\x88\x8b\x82\x45\x29\x75\x92\x61\xef\xb4\xf0\x74\xfe\xdf\x0d\x5a\xc8\xdc\x5b\x3e\xb5\xd0\xdc\xc5\xbf\x5d\xbd\x22\xd3\x64\x47\x10\xb5\xb0\x6a\x66\xdf\x8f\xf0\xf5\x1b\xe1\xe3\x68\x54\xfe\x94\x19\x50\x9d\xc9\x25\x5b\x4d\xfd\x56\x1f\xe5\xf0\xa8\xeb\x79\x10\xf3\xce\x1d\x8f\xbe\xf0\xf3\x42\x26\xb9\xa9\xd9\x89\xaf\x59\x50\x14\xf6\x34\x18\xae\xbd\xcc\x8d\x5f\x27\xe7\xb7\x34\x39\x4d\xbd\x6e\xf0\x7a\x11\x17\x75\x93\xa2\xce\xdd\xe9\xe5\x2f\xf1\x52\x94\x9b\x48\xbf\xae\xc7\xbf\xae\xc7\x67\xae\xc7\xc7\x19\xd4\x23\x5a\xfa\x59\xe1\x84\x7a\xb8\xec\x47\x01\xdf\x9f\xca\x17\xcf\x8b\x23\x73\x70\xc3\x42\x07\x76\xc5\xca\xf0\xbe\x00\xfc\x95\xb5\x7d\x23\xac\xcd\xd6\xda\x87\xc9\xea\x08\x65\xfe\x64\x7f\xe5\x4f\xff\xe5\xf9\x93\x70\x27\x31\x83\x0e\xaa\x9d\xc0\x4f\x17\x9f\xce\x8b\xf7\x74\x50\xf9\x1f\xd7\xd7\x8b\x0c\xf9\x0a\x62\x0c\x26\x23\x2b\xdc\x82\x74\x6e\x8e\xa9\x35\x63\xd2\xb4\xca\xf3\x70\xb0\x7b\xf0\x29\x91\x74\x51\xc8\x4c\xcd\x1a\x78\x94\xd9\x4e\xe0\x99\x4b\x50\x3d\xf8\xb1\x16\xae\xbd\xca\xf3\xcb\xdd\x88\x64\x49\x85\xc0\xc3\x7d\xd6\xee\xc1\x99\xc1\xa9\x7a\x21\x09\x9a\x78\x0a\x29\x33\x50\xac\x37\x4d\xb2\x22\x30\x24\xe4\x58\x13\x24\xe5\x1e\x94\xbf\xdc\x1e\x5a\x21\x0a\xe3\xe9\x53\x24\xf7\x26\x49\x8f\x98\x86\x6d\xd5\x7d\x1d\x2b\xed\x20\xe8\x04\xa9\xe1\x74\x5e\xd7\x84\xd4\xf4\xdb\x0d\x05\x61\x05\x51\x5c\xb7\x54\x53\xc5\xb3\xfb\xe4\x53\x10\xf5\xe2\xec\xe9\x20\x64\xf6\xef\x34\x96\x98\x5d\xc9\x0f\xbe\xe4\x1a\x12\x0f\x9f\x31\x15\xe6\xc0\xc4\x45\x28\x05\xc6\xa1\xb5\xd3\x41\xd4\x10\x68\x26\x56\x72\xca\x03\x0d\x5e\x07\xe2\x24\x33\x32\xe0\x6d\x8e\xfc\x87\x19\x24\xa2\x45\x89\x10\x93\x40\xaf\x31\x83\x9a\x19\x9c\x74\x33\x90\xd8\xbc\x49\x99\x69\x76\xe6\xe9\xe7\xed\x22\x58\x93\xd1\xc8\x24\x7c\xbf\x17\x6c\x52\x6f\x0e\xd9\x46\x85\x95\x16\x4e\x3a\xae\x17\x57\xcb\x03\xa9\x08\x2e\x8d\xda\xc4\x9d\x22\x35\x3c\x96\xb1\x58\x69\x05\xe9\x34\x54\xc3\x4a\x59\x03\x2e\xee\x0d\x98\xd8\x7b\xa1\xf2\x0b\xd6\x3d\x8d\xc2\x71\x27\x88\x8b\x81\x31\x33\xc1\x0c\x15\xbb\xdc\xc1\xe7\x52\xa7\x59\x14\x54\x87\x04\xc3\xcc\xa5\x39\x95\xc9\x58\xe5\xde\x8d\x07\x92\x73\x87\x64\x2b\xe9\xac\x30\xf8\x5a\x3a\x72\x75\xa4\xce\x2e\x72\x83\x2a\x19\x98\x38\xee\x09\x5e\x1b\xa3\xe6\x6c\xb3\xb3\x06\x78\x3f\xaa\x17\xf7\x66\x45\x60\x98\x27\x9b\x71\xa3\xb4\x90\x1f\x7f\xa9\xc5\xe3\x65\x54\x44\x26\x40\x4a\xdc\x73\x41\xe3\xa8\x53\x99\x0c\xe6\x42\x1d\x7d\xc2\xe9\x90\x77\x8e\x7b\x60\xc0\x4d\x9c\x40\x6a\xb4\x40\x61\x22\x3a\x46\x75\x78\x9a\x3d\xc1\xe4\xc5\xd3\xf6\x86\xcf\x09\xfd\x74\x7a\xd6\x65\xc4\xb2\x83\x75\xa0\x06\x2b\x60\x0c\xa4\x06\xb1\x25\xb5\x07\x14\x07\x15\xb1\xc8\x8f\x54\x5f\x9b\x43\x06\x63\x34\xd8\xf8\xeb\x44\xfa\x75\x22\x7d\xfb\x13\xe9\x98\x36\x76\x6e\x68\xb0\x8b\x69\x62\x4f\x08\x3e\x35\x9c\xbd\x82\xb9\x21\x02\xdd\x94\x08\xe2\xb0\x4b\x50\x00\x5b\x5c\xe9\xc0\x19\xe5\x0e\x41\xd1\x84\x8e\x26\x26\x03\x38\x1c\x62\x01\xe4\x08\x96\x15\x31\xdd\x19\xf0\xa4\x21\xb2\xc6\x14\xcd\xaf\x93\xf8\xd7\x49\x7c\xe1\x49\x7c\xa9\xc9\x41\x8f\x8b\xd3\x5f\x3b\x3c\xd9\xf0\x0c\xf5\x58\x44\x9f\x67\x9d\xa2\x1a\x9e\xed\x14\x64\xe6\xc9\xe1\x7c\x00\x0a\x83\x13\xe6\x7c\xf6\x9c\x54\x9a\x19\x89\xe4\x11\xfa\xb8\x02\xed\x39\xff\xa8\x9a\xd9\x4a\xe6\x12\xd5\x4c\x52\x46\xac\x22\x50\xd2\x3d\x5c\x83\xe2\x70\x3c\x2e\xf8\xa9\x02\x0a\x96\x20\xa0\xe2\x64\x1d\xfb\x55\xfe\x29\x2f\x66\x39\x0d\xc6\xfc\x88\xfc\x21\x3b\x1c\x9a\x2d\x48\xc1\x52\xaa\xea\x97\xda\xb7\x5a\xe8\xbb\x3c\x1d\xb1\x1c\xba\xc8\x81\xb7\x04\x82\xa0\xb2\x0e\xa1\xd2\xd6\x43\x94\xda\x39\xda\xce\x8b\x8c\xca\xe0\x55\xb1\xf7\x93\x41\xf2\x3a\x97\x27\x2c\x5c\x8f\x9f\x5d\xd7\xc6\x3e\xc9\xd5\xc6\x3e\x16\x28\xd4\xc6\x3e\x4f\xdd\x33\x7c\x2c\x62\x53\x06\x01\x94\x58\x0d\x39\xaa\x59\x00\x5f\x1a\xd5\xf0\x69\x27\x8e\x74\x33\x27\xc0\x25\x9c\x6a\xd2\xbe\xe3\x81\x43\x65\x8a\xa9\x50\xf9\xe1\x1b\x45\xac\xf4\x59\xb0\xe6\xf6\x4e\xa3\x4c\x47\x89\x49\x70\xb0\xcd\x88\x1e\x6c\x9a\xf2\xe7\xbd\xa7\xac\xc2\xda\x38\xc3\x00\x85\x20\xa9\xf5\x0d\x32\x82\x57\x45\x25\x88\xc3\xdc\x2b\xb6\x63\x95\x41\x9c\x96\xe7\x9a\x3d\x12\x09\xea\x79\x5a\xee\x17\xed\x15\x71\xcd\xf3\xbc\xd2\x4b\x58\x14\x89\x79\xd2\x42\xd0\x19\xa6\x2d\x88\xa9\xf7\x02\x15\x6a\xa3\x8a\x2c\x49\xf9\x0c\x16\x12\x48\x42\xa5\x34\x92\x03\x2f\x13\x7c\x99\x74\xdf\x34\x02\x95\x17\x90\x94\xd3\xd3\xa9\x36\xd2\xbb\xcc\x64\xf2\x13\xd1\x4b\x1a\x04\x8c\xec\x99\x59\x3f\xa9\x67\x8a\xbf\xbd\x63\x4e\x3e\x41\x09\x5d\x53\x8b\x83\x31\xc7\xe9\xcb\x4f\x9a\x9a\x9f\x3f\xa2\x67\x85\x16\xa4\x42\x30\x61\x3b\x33\x57\x22\x27\xf1\xbf\xbd\xf6\xbd\x89\xce\xc2\xc4\x78\xa2\xe7\x5a\x71\x2e\x97\x99\xe8\x66\x3c\xd1\x0d\x14\xf4\xd4\x89\xfe\x49\x6c\xef\xf3\x06\x25\x63\x11\xfa\x67\x10\xa5\x83\xa7\xd2\xa4\x3b\x12\xf6\xa6\x6b\x4d\xfa\xcf\x4e\x8c\x5e\x60\x13\x0d\x04\x5b\x69\xa7\x87\xc6\x67\x59\x34\x38\xa0\x6f\x7b\x08\x51\xf3\xe5\x94\x7c\x70\x11\xae\xa7\x30\x76\xfa\x4b\x1a\xed\x3b\xdd\x95\xa3\x33\xc7\xdb\x3b\x6d\x21\xc8\xd9\x8e\x90\x4a\xde\xe8\xcc\xfa\x82\x26\x89\xbd\x2f\x58\x00\x61\xc6\x22\x5c\x38\x92\x4a\x51\xe5\x32\x0e\xad\x1d\x13\x41\xc7\xce\xf8\xb3\x2d\x66\xdb\xc9\x65\x5a\x4c\x87\x74\x59\x8b\xd9\x1a\x86\x47\x91\x99\x62\x9a\xe3\x11\xc0\x46\xdc\xfb\x29\xba\x6e\x20\xae\x63\x28\x8e\x17\x59\xd1\x7f\x66\xaa\xbf\x14\x17\x12\x70\x8f\xc6\xa3\x5b\x2a\xa6\x68\xd2\xf1\xef\x76\x20\xd1\x6c\xd0\xdd\xbe\x22\xa3\xa8\x2b\x5b\xa0\xc2\x6e\x67\xd7\x71\x02\xe6\x18\xba\xe3\x92\x9f\xda\x7d\x5c\x51\x57\x8c\xe0\xac\x8e\x52\x63\x6b\x0c\x7f\x29\x0b\xee\x14\x6a\x72\x2c\xc0\xba\x2f\x60\xc1\x8d\x8a\x9c\x90\xa3\x05\x3c\x42\x90\x12\xc0\xdb\x7d\x0a\x57\xf4\x62\x32\x26\x46\x65\x6c\x07\x69\x0d\x47\x48\x6b\x42\x68\xc6\xca\x52\x62\x27\x68\x95\xe0\xc3\x60\x1d\xc3\x38\xaa\xe6\x49\x4d\x23\xf6\x72\x14\x49\xac\x30\x3f\x0e\x98\x28\x89\x6e\xef\xb4\x60\xd1\x50\x3c\x90\xa5\x1e\x90\x65\x00\x96\x13\x4d\xbc\xbd\x33\xe0\x33\xce\x96\xc0\x9f\xb6\xbc\xaf\xa6\x47\x01\x3e\xc4\xbd\x4e\x40\x32\x0c\x47\xde\x5b\xb0\x7b\xa4\x95\xd4\xae\xff\x5a\x11\xc4\x11\x91\x0e\x7d\x39\x2e\xa4\x15\x9d\x85\x8e\xc7\xf3\xb8\x33\x64\x38\x1a\xb2\x3c\xb8\x17\x21\xa8\x83\x11\x3a\x12\xe0\xc8\x54\x7e\x86\x12\x7a\x83\x0c\xa0\xab\xb4\xd7\x5d\xff\x6d\x01\x5a\x71\xa6\x49\xe2\x85\xd9\x19\x70\x5d\x77\xf1\x3a\xdf\x0b\x52\xd7\x79\xc1\x82\x04\xdc\xb5\x8e\xdf\x26\x41\x08\xc8\xb1\xba\x93\x63\xe3\xc5\xde\xe2\x89\x8a\x97\x58\xc7\x5a\x15\x5f\x66\xe4\xeb\x30\xd7\x7e\x48\x48\x74\x24\x78\x4e\xdf\x17\xe8\x32\xdc\xec\xe0\x8c\x52\xf8\x9a\x95\x19\x73\x59\xa1\x9d\xc0\xf7\xcc\xf6\x35\xee\x35\x52\x87\xc9\x0b\x96\x45\x97\x97\x37\x5f\xfd\xca\xc5\xfa\x5c\xec\x95\xd8\xa1\x44\x18\x11\x15\x44\xe9\xc2\xfe\xe3\x6c\x0f\x90\x05\xfc\x08\x2c\xc5\xb1\x2e\x1f\x5b\xf1\x5e\xce\x9c\x27\x87\xa7\xad\xc4\x00\x63\xef\x84\xa1\x83\xda\xaf\xc4\xf7\x24\xe2\x73\x50\x78\x2a\x42\x94\x40\x09\x11\x31\xf9\xab\x1b\x74\xe0\x29\xc5\x88\x49\x15\xe0\x6d\x22\xef\x8d\x73\x57\xe8\x21\x60\x91\x8a\x84\xaa\x80\x02\x0b\x22\x4c\x26\x49\x38\xbb\x18\x5d\xff\xd9\x0d\x26\x28\x5c\xe2\xd4\xfd\x17\x54\x00\xda\x02\x31\x62\x2f\x6f\x2a\x20\x14\xd1\x5b\x63\xa4\x1e\xe4\x08\x29\x5d\xcd\x8c\x05\x97\xa2\xb7\x56\xe2\xb1\x5b\x72\x44\xee\xea\xc6\x38\xce\x23\x04\x2b\x40\xeb\x64\x0b\x34\x29\x5c\xf1\x53\x0c\xd6\x58\xa7\x28\x81\xb5\xc9\x99\x60\xae\x38\x07\x13\x08\x33\x06\xbd\x25\x67\x93\x35\x57\x37\xc6\x40\x72\x3e\xa5\x20\x68\xe5\xb6\x40\xeb\xd0\x5e\x19\x82\x54\x38\x1f\x24\x3c\x41\x4a\xc9\xa7\x68\xaf\x8c\xa0\x5c\x1a\xba\x9a\x59\x28\x88\x4c\x32\x64\xea\xf7\xc1\x26\xba\xba\x21\x88\xc1\x16\xa9\x28\xc4\xe8\xaf\x20\x67\x7d\x4a\x57\x08\x21\xa5\x82\xa2\x95\xc4\xd6\x04\x17\x9c\xb9\x42\xa0\x02\x0b\x6f\x8c\x93\xea\x38\x9f\x90\xfc\xd5\x4d\x01\xbe\x30\x45\x8a\xe4\x73\xe5\x83\x27\x9b\xd2\x55\x01\x2e\x50\x08\x21\xa6\x24\x2d\x75\x68\x30\x70\xd6\x48\x3c\x66\x12\x19\x07\xc8\xca\xa8\xcd\x8e\x0d\xe5\xed\xd5\x2b\xae\x5d\x74\x45\xf0\x81\xb3\xc0\x14\x02\x45\xa9\xb4\x0f\x85\x2f\x92\xcf\x60\xf5\xb1\x28\x4c\xf0\x57\xc4\x7d\x5f\xa4\x20\xb5\x28\xac\x45\x4b\xe6\x8a\x3b\x25\x7a\xe7\x82\x54\x0d\x9d\x4f\x21\x5c\xdd\x18\x40\xe3\x08\x8d\x1c\x79\x84\x18\xc8\x19\xba\x32\xe0\x2c\x39\xe3\x2c\xb7\xae\x28\x52\x4a\x2e\x5d\xf1\x8f\xab\x19\x77\xa3\x4f\xc1\x58\xf9\x79\x63\x08\x30\xa5\x84\x49\xe2\x5f\xa4\x94\x62\x74\x91\x07\xc0\xa5\x48\x36\x44\xc9\x35\x18\xa2\x42\x9e\x46\x8c\x45\x24\x49\x6b\x0b\x63\x2d\x37\xc1\x18\x28\x4c\x48\xe8\xad\xd4\xd6\x18\x1f\x5c\xb8\xe2\xa7\xd6\x07\x97\xc4\xf2\xcf\x05\x67\x9d\x0f\x92\x85\x45\xe3\xda\x5e\xb0\x21\x86\xab\x19\x46\x48\xce\xc4\xc0\xad\x00\x6f\xa9\x88\x98\xdc\xd5\x0d\x46\x08\x26\x59\x32\x02\xf0\xe5\xc8\x58\x6b\x7c\x8e\xdf\x98\xa2\x45\x4e\x5c\x93\xb4\x6d\xa8\xbf\xf3\xe4\x06\x03\x58\x5b\xf8\x18\x87\x09\x0b\x83\xce\x99\x28\x99\x62\xf0\x3e\x11\x4f\xaa\x88\x3e\x26\xa6\x65\xf0\xfc\x15\x93\xc9\xec\xf8\xa8\x5d\x4a\x1f\xb7\x12\xef\x47\x42\x2f\x14\x10\x04\x00\xcb\x95\x75\x08\xe2\x36\xb2\x84\x13\x18\xb8\x19\x0a\xf6\x12\x27\x9e\x0c\x52\x28\xab\x8c\x9d\xca\xf4\x18\x7e\xcc\x7c\xdf\xb0\x32\xef\xea\x95\x01\x8b\x27\x2f\x0c\x09\xa2\x3b\x7b\x65\xe0\xc4\x63\x67\xca\xc6\x9d\xf9\x24\x6e\xb6\x03\x1e\x79\x37\x8c\xc3\x67\x22\x50\x5a\x64\xe1\x4f\xbc\x53\xad\xb2\x10\x05\xbb\x5c\xf0\xf3\x76\xda\x02\x12\xb8\xa0\xad\x80\x87\x2f\x34\x18\xd4\x40\x12\xe4\x8f\x34\x6a\xb0\x46\x1b\xb0\x09\xac\x97\xf3\x33\x65\xc0\x90\x4e\x60\xa3\xb2\x1a\x51\xc2\x98\x12\x60\x04\x8a\x0b\x9d\xd1\x30\xa3\xd7\x26\x9f\x5a\x44\xab\x4d\x8e\xc9\x22\x67\x7c\x9e\xe9\xc5\x26\x9d\xe3\x0a\x9a\x1c\x32\xdd\x81\xf3\x13\x07\x4e\xee\xda\x30\xdf\x4e\x19\x5b\x26\x70\x12\x7c\xba\xd9\x1f\x36\x60\x9d\x86\xb0\x20\x08\x49\xd7\x1f\x07\x92\x16\x88\xaf\xad\xf6\x7d\xb4\xad\x4e\xa7\x5c\x2a\x50\x1a\xe6\x58\xed\xa5\x05\xa7\x6c\x7d\x28\x5d\x68\x0b\x8e\xff\x4d\x0e\x4f\x8b\x7c\xa8\xcc\x69\x6f\xef\x0a\x1d\x4a\x31\xac\x87\x2e\x2c\x3c\x81\x9b\x1c\x9e\xe6\xd3\x6a\x30\xea\x29\x00\x47\x8f\x07\x2d\x43\x88\xa8\xd0\x2d\x32\x46\x9c\xe7\x41\x85\x48\x12\x6b\x5d\xcb\x81\x79\xc6\x10\xcd\x22\x18\xb0\x46\xb0\x03\x62\xc2\x14\xe8\x16\xf0\x32\xa0\xd8\x0c\x28\x0f\x2d\x72\x2b\x93\x40\x52\x61\x19\x55\x1b\x0a\x1c\x88\x07\x35\xb2\x6a\x47\xf9\xd2\xbc\x40\xa7\xc1\xf3\x12\xca\x8c\x25\x07\xad\x73\xb5\x0d\xa2\xc4\x48\x41\x0f\x8e\x76\xf9\xdc\x36\x44\x2d\xd1\xed\x7d\x29\xa0\x9a\xa6\x41\x83\x2d\xb4\xc9\xb1\x0d\x8c\x10\x32\x57\x54\x07\xb0\x01\x92\xd5\xdc\x18\xd5\xf5\xe8\x05\xd6\x5b\x9e\x1a\x3c\x6b\xd0\x85\x1d\x88\x35\xc1\x03\xef\x9a\x40\x9c\x89\x82\xf6\x78\x64\x3b\x99\x6b\xe2\x9b\xde\x57\xd0\x6a\x1c\x4d\x9f\x2f\x99\x8f\xd4\x41\x04\x43\xe0\xa9\x69\x32\xa6\xb9\xf3\xdc\xe7\x9a\x24\x7c\x8d\x06\xe3\xb3\xb9\x20\x77\x76\x24\xcd\x9d\xc5\xb3\xb7\x02\x67\x38\x71\x58\x00\x49\xf4\x52\x65\xa1\x70\x1a\x49\x59\xb1\x83\x32\x20\x16\x11\x08\x09\x8c\xe3\x89\x1a\x24\x06\x8f\x96\x19\x0e\x21\x70\x3e\x31\xc7\xf9\x29\x92\x8e\x79\x83\xba\xd7\xd7\x68\x14\xed\x8c\xce\xd0\x6a\x62\x24\x45\x25\xc4\xd8\x82\xd4\x2a\x88\x4e\xd0\x82\x58\x03\x93\x4b\x7d\x90\x25\x04\x16\x70\xa1\xc5\xcd\x5d\x5b\x89\xeb\x40\xcc\x24\x78\xfa\x60\x46\x2b\x94\xf8\x3e\x6d\x24\x2a\x25\xf1\xf3\x8c\x3a\xa0\x2d\x32\x55\x40\x34\xab\xa2\x64\xb5\x55\xc5\x2e\xa3\x28\x92\x06\x4f\x0b\x61\x37\xcc\xe8\xb2\xf9\x87\x17\x1c\x58\xed\x24\xb8\xcf\x81\x4d\x1c\x86\xe3\xd9\x98\xef\x02\x3f\x71\x09\x6f\x77\x52\x94\xa6\x76\x10\x9a\xd6\xd0\x38\xe4\xeb\xc5\x7c\x7f\x15\x7e\x9d\x02\x4d\x5b\x60\x9a\x76\xcf\x26\xad\x0a\x47\xcb\xeb\xf5\xaf\xa0\x7d\x9c\x86\xd2\x57\x18\x5a\x04\xcf\x42\x77\x11\x3c\xf3\x06\x6a\x90\x85\xd8\xb5\xc0\x9d\xa8\xbb\xc0\x9d\xb2\xf0\x5e\x6c\x89\x60\x69\x38\x30\x51\x99\x50\xca\xd6\x7e\xde\xe0\x6f\x76\x0d\x05\x02\xba\x98\x1c\xdc\xd5\x9d\xec\x65\xd8\xb9\xc1\xbe\x77\xfb\x94\xd2\xc0\xa9\x5d\xd2\x75\xbe\xec\x94\x24\xf1\x94\x0d\x4e\x83\x24\x32\x25\x0a\x48\x35\xb6\x50\xd5\xcc\x6f\x55\xb1\x2a\x2e\xb5\xb8\xfc\x12\x1b\x79\xb6\x5f\xd0\xa3\x81\x40\x5b\x4a\x13\xb9\x31\x07\xe2\xf3\x2b\x0d\x44\x23\xeb\x33\x2a\x14\x5a\xf0\x07\xaa\x63\xae\x6d\x75\x04\x4b\x95\x20\x7e\xfb\x49\x4b\xb4\x35\x99\x3e\xa3\xe6\x74\x56\xcd\x7f\x06\xc3\xa1\xab\xcb\x79\x12\xfc\xb3\x11\xe2\x59\xee\xca\xe7\x93\x21\x77\xba\x76\x19\x77\xc6\xca\xbf\x46\x07\x21\xab\x3d\xf8\x34\xa2\xb3\x67\xb3\xc3\x33\x9d\x8e\x1f\x93\xa9\x86\x36\xa5\xa7\xe8\xe4\xc9\xae\x83\x8f\x52\x89\x17\xa8\x1a\x47\xc7\xa8\xa4\x0e\xd3\x8b\x2c\x6a\x61\x13\xb6\xab\x10\xb9\x06\xc5\xba\x41\x9c\xa0\xda\xce\x76\xca\x98\x15\x99\xc1\x73\x23\x7b\x2d\x6e\xaf\xe5\x83\x6e\x46\xaa\x53\xfc\x67\x44\x46\xee\x22\xff\x36\x00\xfc\x85\xf4\xe1\x99\x80\xfb\x9f\xe2\xe8\xdf\x72\x17\x9d\x69\x4c\x7c\x29\xd6\xdd\x18\x0e\xb3\x12\xa2\x1d\xab\x95\x9f\xe0\xd4\xe7\x1b\x75\x7e\xdb\x5c\xfa\x53\xed\x78\x16\x87\xfe\xb6\x09\xeb\x0c\x0f\x93\x2f\xc9\x8a\x9f\x56\xa9\xcb\xf0\xd8\x4f\x14\x72\x92\xbf\xf6\x64\xf2\xc9\xa5\xcc\x4b\x29\x81\x93\xd8\xc3\x2e\x1f\x02\x15\x20\x8a\x5a\xcc\x8f\x4a\x14\xa7\xc6\x43\x10\x7a\xeb\x24\xbc\xbe\xd8\xc8\x3a\xb0\xa9\x4a\xac\x07\x27\x30\xe9\x48\x52\x71\x82\x1b\xa9\x13\x35\xba\xe0\x25\x14\xb6\x42\xa5\x29\x7a\xb0\x34\x43\x0b\x28\xa1\x82\xa9\x23\x35\x20\xab\xa0\xca\x4d\x7d\xe7\x99\x55\x61\xde\x17\x37\x14\x4d\x4d\x31\x84\xb0\xc2\x9e\xf0\xa1\x92\x98\xa3\x14\x53\x3f\x47\xb3\x0a\xd0\x17\x60\x34\x4d\xfd\x3c\xac\x3c\x77\x07\x49\x98\x5a\x70\x5d\x93\x61\x88\x08\x16\xa7\xa6\x78\xaa\x26\xf7\x04\x68\x95\x0c\x2d\xe2\xe6\x02\xcf\xfb\xec\x3a\xae\x22\x38\x2c\x83\x78\x5f\x37\x51\xe2\x64\x83\x89\xbe\x50\x37\x1b\xe6\xff\x03\x7f\x30\x55\xb7\xe5\xe9\x16\x8c\x67\xc9\x47\x3f\x2f\xe2\x41\x21\xd3\xe6\x73\x87\x89\x20\x98\x89\xc9\x3b\xc2\x6d\x28\x98\x7a\xd9\x9c\x61\x62\x0e\xf8\xa5\x26\x86\x83\xf3\x0f\x86\x9f\xa6\x41\x7d\x23\x0e\x17\x97\xb1\x54\xfc\x6a\x7c\xe9\x95\x57\x88\x07\x92\x09\xf4\xd4\x83\xfb\x27\x78\x8a\xd5\x7d\xed\xc0\x9e\x92\xd9\xbe\x02\xf1\x7d\xc9\x06\xff\x82\x89\xf1\x7c\x67\xdd\xcc\x5d\x27\x3d\x2e\x2f\x46\x49\xe6\x8b\x8d\xdb\xa3\x6c\xfe\xfc\x01\xfd\xd2\xee\x95\x47\xc4\x14\x41\x46\xbe\x84\xa8\x22\x68\xaf\x68\x20\xf0\x90\x07\xb1\x3e\x6f\xa5\x64\x03\x31\x30\xd5\x20\x02\xca\x69\x55\x52\xd4\x9e\xc7\xb1\xf4\x2a\xe2\x36\xa9\xae\x45\x24\xa0\x9d\x79\x45\xee\x1c\xc1\xa3\x03\xdd\xa9\xe9\xb9\x6b\x39\x8b\xcf\x28\x67\x05\x7c\xc9\x6f\x24\x3a\x92\x61\xd1\x06\x4c\x2f\x24\x8f\xf8\xfc\x59\xc0\xa4\xd1\xe5\x38\x88\x56\xc9\xa5\x6e\xf1\xa1\x37\x6e\x45\x02\x75\x12\x57\x00\x58\xe7\x8b\x51\xa3\x81\x88\x25\xf8\x4e\x9c\x33\x89\x8d\x46\x96\x27\x96\x3d\x1f\xe2\xf4\x19\x72\xd4\xcf\x37\x4e\x2c\x7c\x51\x39\x74\x8e\xff\x1c\xf1\xeb\xdb\x1f\xb2\x5f\xb6\x30\x27\xeb\x5f\xc6\xaf\x02\x33\x7b\x4a\xa7\xac\x92\x44\x50\x02\x1f\x94\x69\xc2\x83\xca\x22\x8a\x12\xf9\xd6\x80\x37\xca\x34\x1e\xb2\xa8\x81\xbc\xae\x23\x31\x7f\x09\xc2\xfb\x72\xe2\xe4\x67\x50\x60\x89\xd2\xbb\x8d\x88\x51\x28\x28\x82\x06\x33\xee\xb5\xc3\x30\xfc\x2a\x98\x7e\x4a\x30\xfd\x75\x15\x3a\xc1\xd2\xbe\x18\xb8\x42\x4b\x9c\x53\x21\x88\x89\xc9\x2e\xd7\x3e\xfd\x3a\xe7\xbf\xee\x9c\xff\x55\xf6\xff\x26\xa5\x1b\x83\xbf\x0c\x56\xf0\x55\x75\x0f\x09\xd2\x72\x11\x8b\x16\x70\xa8\x28\x40\x34\x13\xb4\x60\x25\x6c\x44\x33\x85\xc4\xf8\x26\x95\xb5\x63\x07\x1d\x38\x0f\x82\x71\xda\x42\x44\x56\xb8\xd1\x4d\xb0\x10\x63\x36\xb9\xd6\xdd\x29\x56\x9f\x16\xec\xdc\x00\xf2\xac\x15\x83\x6b\xd3\x81\x20\x08\xaa\x98\x5b\x96\x71\xc6\x1f\x07\xfe\x56\x72\xde\x5b\xf1\x94\x1f\x56\x80\x49\xc0\xd7\x95\xeb\x57\x5a\xd7\xc6\x4c\xc9\xa8\x4e\x54\x45\x9e\x5a\x6e\x8f\xfd\xe0\x19\xa8\x70\xc5\x0d\x1f\x06\xba\x8c\xe0\x62\x3f\xba\x59\xd3\x43\xb7\xaf\x24\xd4\x39\x45\x81\x03\xf0\x72\xaa\xec\x0f\x01\x7c\x09\xac\xd5\x46\x82\xb7\xdb\xfa\x5a\x67\x0b\xde\x69\x07\xd1\xe5\xee\x2a\x23\x04\xab\xe4\x52\xdb\x1d\x04\x31\xbe\x92\xc6\x96\xc7\x3f\xe7\x16\x3b\x75\xbc\x4c\x65\x2e\xeb\x63\x6e\x2c\x50\x9c\xc8\x10\x51\x27\x42\x7f\x01\x2e\x2a\x43\x53\xe4\x99\x30\x7a\xdd\x7c\xf7\x05\x35\xaf\x6f\xa9\x6a\x63\x04\xef\xcf\x9f\x46\x25\x16\x90\x24\xda\x4c\x6a\x11\xd1\x24\x10\x70\x10\x8e\x68\xf3\xa5\x38\x1c\x58\x41\x64\x32\x92\xf8\xfc\xb1\x91\x16\x32\x20\xa9\x7d\x3e\x2d\x4d\x99\xc6\x3f\x83\xba\x27\x11\x22\x57\xa8\x99\x63\x51\x09\x6a\x53\x64\xbe\x1f\x1b\x68\x1e\x66\x0d\x41\xf0\x49\xed\x68\xd7\x87\x08\x9c\xf2\x8b\x42\x4b\x94\x1c\x0d\x96\xf8\xea\x4d\x29\x76\xca\xd9\x5a\xb9\xee\x1e\xb1\x85\xc4\x7f\x2a\x16\x73\x51\x2d\x18\xbf\x0c\x74\xd8\x63\xe0\x9a\x51\xdc\x21\xd0\x54\xdc\x25\x1a\x64\x3a\xf0\x0a\x6c\x9b\x25\xf8\x97\xbe\xae\x48\xc3\xc0\xec\x09\x22\x49\x84\xf5\x27\x62\x26\x9e\x8e\xa7\x23\x12\x06\x2b\x41\x3c\x47\xe9\x80\xda\xe5\x58\xb0\x3a\xff\x68\xf0\x69\x02\xdf\x57\x63\xaa\xe7\x9f\x9c\x7f\x01\x4a\x7a\x84\xb5\x0e\xb7\xb9\x1f\xe3\x3e\xe2\xa8\xea\xc2\xb7\xc1\x7d\xce\x26\xc4\x67\x08\xa6\x4f\x42\x7f\xef\xc3\x0d\x48\x34\xc1\x93\xc1\xb4\x49\xd9\x69\xd7\x6c\x8f\x94\x9f\xf7\x4f\x03\x14\x4d\xfb\x91\xa4\x34\xcd\xbb\xa2\x3d\x67\x71\xfb\xca\x2a\x53\xcc\xfd\xd4\xd0\xdc\x3c\xc5\x6a\x16\x47\x3d\x74\xa8\x5b\x14\x0a\xb1\x35\xe2\x11\x0f\xa2\xd1\xa6\x87\x8b\x24\xef\x25\x92\x2d\x78\x56\x10\x32\x98\xb3\xac\x02\x41\xc6\x5f\xe0\xef\xea\xa7\xfc\x5c\x3e\x49\x02\x70\xf2\xe4\xd8\xd5\xc7\xaa\x48\x62\x70\xcf\x13\x32\x54\xda\x81\x65\x6d\x46\x5b\x6d\xc7\x8e\xe4\x8e\x4b\x26\x82\xc4\xe4\x61\x2a\x0f\x21\x69\xbe\xcc\x30\x43\x98\x0b\x76\x7e\x70\x12\x67\x6e\x8a\xae\x8a\x60\x9d\xe6\xcb\x4c\xe6\xd4\x9c\x95\x58\xc1\x6a\x8e\x28\x97\xae\x41\xfe\xa1\x12\x4f\xf2\xe4\x78\xd4\x17\x26\x89\xdf\x4e\xa7\xeb\x55\xb7\xeb\x9b\x04\x02\xdc\xe2\x55\x51\xf6\x3b\xbf\xfe\x35\xe9\x77\x7e\x3d\x24\x9f\x65\xe5\xf9\x48\x9d\x03\x18\x01\x52\x0a\xa1\xfa\x3a\x43\x30\x2a\xe1\xb3\x6c\x40\x1f\xb1\x08\x13\x35\x97\x78\x66\x4d\xed\xdc\x4f\x99\x23\x0e\xd5\x72\x05\x14\x35\x3d\x63\x26\x23\x81\x11\x91\x8f\x79\xae\x6d\x98\x6e\x53\xe4\x33\x5a\x64\x4e\xb7\xe8\x31\x83\xab\xa7\x16\x63\x8f\x32\xc4\x47\x3b\xf1\x32\x8c\x4e\x58\x48\x6c\x67\x06\xf6\x66\x46\xcd\x61\xe2\xed\x2b\xaf\x28\xcc\x99\xd8\x2a\xaf\x3d\x14\x23\x94\xa5\x82\xa9\x0e\x13\x18\xa7\x22\x8b\x19\x14\x6e\xef\x58\x82\x97\xbd\x1c\x57\x79\x20\xa3\xf9\x22\x1c\xc5\x81\x1d\x7f\xcf\x44\xc9\x14\xf9\x84\x78\xdb\xa7\x6d\x0e\x9b\x03\x66\x1b\x95\x5c\xda\xb5\x37\xc4\x67\xf5\x5b\x4b\x56\x62\xd8\xe7\x0f\xe2\x41\x3e\x3f\xfe\x65\x74\xe2\x39\x32\xdb\xf3\x89\xfc\x59\x5b\x51\x43\x78\x33\x09\x1d\x7c\x09\x9b\xc2\x00\x68\x95\x31\x53\x2c\xc0\xd3\x8d\x93\xcd\x5b\x93\xa1\x10\x31\xd5\xd6\x06\x65\x17\xc8\x29\xea\xc4\xcc\x12\x0b\x79\x2f\xd7\x9a\x68\x8a\x2c\x7a\x15\x9e\x05\xad\x42\x44\xb4\xa2\x35\xf4\xcf\x1e\x7b\xbe\x6c\x81\x3a\xeb\x17\x5e\xc5\x1b\x23\xde\xe7\x62\x9b\x6a\x0c\x17\xdf\xd4\xea\xf6\x15\x26\x28\x92\x12\x17\xc0\xc8\x9a\x6e\x6c\xd5\x5d\x2d\x15\x8c\x55\xa1\x20\x06\x41\x82\xc4\x49\x80\xc4\xca\x79\x6a\xf7\x0a\xa5\xfa\x0b\x71\x5c\x86\x10\x54\xc6\xd5\xf1\xc4\x37\x53\x29\xe4\xc6\x14\x82\xb2\x28\x11\x39\x29\xca\xd5\x82\x77\xa5\x78\xfe\xca\x25\x97\xc6\xab\x2c\xd3\x94\x97\x50\x33\x51\x03\x46\x30\x89\xef\xcd\x24\x82\x20\x95\x62\x3c\xe8\x46\x75\xa5\xbf\xe0\x26\x4c\xdb\xa3\xc3\xce\x2e\x14\x90\xa0\xf4\x5a\x16\x9e\x59\x10\xd6\xa2\xc2\x68\x2c\x07\xec\x5e\x62\xe2\x80\xb3\xaa\xf1\x51\x45\x0d\x46\x22\xe4\x56\xd9\xb0\x58\xf6\xcf\xb9\xa5\x18\x07\x1d\xc2\x82\xb1\x09\xdc\x46\x7f\x63\x08\xc4\xf7\x5e\x99\x42\x1c\x52\x45\x83\x2e\xc4\xf3\x43\xa4\xf4\x85\x36\xe2\x34\xad\xb9\xeb\xb5\x81\x84\xf9\x2e\x40\x2a\xfb\x23\x26\x01\x3c\x20\xa6\x0a\xa2\xd7\x20\x62\x7f\x0c\x83\x81\x67\x2e\x81\x49\x47\xee\x75\xa3\xe4\x72\x50\x18\xa2\x0a\x65\x00\x67\x54\x68\x21\xaf\xb3\x9f\x27\x3f\xa8\x2f\xf5\xba\x29\xe0\xcc\x28\x4a\x01\xb7\xb2\x68\x32\xe2\xe1\x53\x56\x0e\x08\x0a\x71\xbb\x2c\xda\xf0\xc4\xcc\x9f\x90\x39\x99\xf1\x9d\x29\x51\xe8\xa8\x78\x4a\x2c\x0a\x71\xa0\x54\x96\xe7\x50\x92\x40\x38\x9e\x85\x4e\xa1\xb4\x22\x2d\x6c\x9e\x2a\x21\xfb\x09\xa7\x7c\x13\xc1\xb8\x49\x7f\x4e\x14\xed\x64\xf9\x67\x3c\x89\xef\x92\x2d\x5a\x95\xaf\x0d\xd9\xb2\xb6\xb8\xd2\xc4\x23\x2e\xd0\xbf\x07\xaa\x14\x7b\x65\xfa\x96\xc8\x92\xe9\xcf\xab\x08\x2d\x64\x0f\x71\x3d\x6c\x10\x97\xb5\x38\x19\xf2\xc7\x6f\x85\x78\x7e\x3d\x61\x3f\x98\xd3\x7f\x92\x81\x3e\x3a\x8a\x1d\x78\xc3\xc6\x2c\xef\xa6\x59\x37\x9d\xa0\xd5\x9b\x7a\x97\xc2\x98\x3c\x8a\x37\x46\xda\xc3\x6b\x5c\xb3\xe2\xb9\xbc\xdc\x7c\xfe\x28\x3e\x6d\xb3\xe9\x99\x8b\x47\x6f\xe7\xdb\x83\xd7\x79\xff\xf4\x59\x1c\xf4\xe7\xec\xbe\x5f\x64\xf0\x87\x1e\xe7\xcc\x02\x98\xeb\x72\x4e\xf2\x2b\x1d\x4e\x7b\x68\x69\x07\x84\xbf\x3c\x82\xfe\xe5\x18\x01\xf4\xf1\xf1\xaa\x6a\xfd\x6e\xb7\xde\x4d\x37\xdb\xf5\xdf\x36\xf7\x0f\xe5\xe8\x90\xb8\xab\x2f\x20\x60\xed\xa8\x18\x85\x86\x08\xd2\xe7\x79\xd9\x1f\xf3\x81\x7c\x46\xd6\xc7\x3c\x21\x3b\x59\x5b\xc9\xeb\x99\x79\x7f\x02\x51\xe4\xfc\x3e\x79\xae\x9b\xf0\x33\xfa\xe8\x02\x5e\xbd\x67\xf7\xd9\x79\x7b\x2d\x5f\xd8\x83\xf8\xf8\x6e\xcb\xd0\xc3\xad\x21\xf6\xf9\x72\xfb\xb0\x5e\x3c\x4a\xea\x4d\x4f\xdb\x1a\x3d\xf9\x17\x42\xe9\x4d\xd6\x99\x2a\x2f\x4c\xea\x67\xf7\xc9\x2f\x8b\xd2\xcf\xef\xb3\x5f\x10\xa9\xff\x7e\x5d\x3d\x2c\xb7\xff\xb2\x5d\x5f\x06\x1a\x57\x60\x16\xa2\xaf\x48\xe1\x9c\x8a\x6e\x5c\x97\x42\x0b\x5a\x54\x98\xb1\xf4\x24\xeb\x14\x39\x08\xa9\x12\xf0\x2e\xe5\xc1\x0d\x92\x72\xca\xa4\x28\x36\x59\xf9\x38\xa3\x20\xc7\xf4\xbc\x6e\x59\x39\xe2\x6f\x84\x30\x01\xac\x9d\x23\x75\x37\xb2\x35\x4e\x7b\x11\x5b\x14\xee\x05\x31\xb8\xf7\x21\x58\x52\x28\x21\x76\xb9\x80\x0b\xc9\xe1\xbc\xca\xee\x59\x15\x2f\xc1\xb5\x9e\xca\x80\x0e\x8c\xab\x02\x2f\xb6\x81\x55\x26\x38\x04\xf6\xca\xef\x72\x18\x81\xee\x27\x82\x7e\x5b\x19\xd6\xfa\x10\x2c\xf6\xde\x05\xd2\xfc\xb2\x60\x9d\x89\xbf\xb2\xe0\x6c\x9b\x5d\xd4\xb9\x2c\x64\xe5\x8f\xdc\xa0\x1e\xfc\x72\x8e\xe3\x20\x32\x07\x52\xb8\x60\x9c\x81\xff\x1a\x04\x71\x1e\x5e\xea\xcf\x03\x1a\x7d\x19\x28\xe6\xaf\x56\x2f\xfa\x65\x4f\xa2\xf9\xdd\x0f\xef\xdf\x0e\x67\xce\x76\xb9\x78\xb8\xfa\xb0\x7e\xfd\xb0\x7a\x79\x6d\xfc\xf5\xd5\x6a\xb9\x7e\xbb\x7a\xc8\xf7\x5b\x66\xf6\xd7\x57\x6f\xd6\x55\xf5\xf2\xfa\xbf\xbf\x91\xff\xae\xaf\x36\xef\xca\xc5\xfa\xe1\xe3\xcb\x6b\x56\x8a\xae\xaf\x76\x0f\x1f\xab\xe5\xcb\xeb\xf5\x6e\x53\x49\x54\x9a\x17\xf9\x6e\x79\xfd\xfd\xff\xdb\x39\xfc\x80\x90\x14\x5a\x88\xa6\x14\x90\x44\xb9\xd4\xc4\x0e\x36\xe8\x0c\x1f\xd7\x7f\xc1\x0d\xc6\x6c\x3d\x6b\x83\x72\x60\x17\x60\x12\x44\x27\xf0\x94\xac\xe2\x88\x69\x02\x50\xfa\x31\x28\x12\x8c\xbf\x24\x1a\x88\xaf\x08\x30\x48\xb0\x8b\x12\x8c\xc9\xe6\x09\xd9\xc9\x04\x35\x10\x18\x1e\x8c\xf6\x91\x8c\x8c\x15\xb4\x60\xd1\xf4\x0e\x8a\x9e\xa8\x34\x39\x8a\x0c\x86\x7c\x69\x5f\x84\x1c\x64\x2a\x48\x70\xb8\xde\x77\x02\xa8\x24\x2a\x62\xbb\x77\xd6\xc6\xa0\x01\x94\xaa\xef\x0d\x57\xad\x9b\x6b\x46\x88\x37\xa4\x8a\xcf\xce\x53\xd4\x27\x7f\xc8\x13\x39\x4f\x0f\xd1\x97\x04\x5e\x80\x58\x0f\xa6\xcb\x21\x6a\xca\x76\xf7\xac\x67\x1e\x6c\x3c\xa4\xc3\x11\x0a\xa7\x08\x42\x7d\x69\xde\x98\xa8\xf9\xcd\xc4\x40\x32\x4a\x2e\x75\xa7\x48\x34\x71\xa2\x92\x20\x92\xa2\x43\xa8\x52\xca\xd8\x7f\x85\x20\x4b\x0a\xb4\x64\xd3\xc1\x01\x24\xae\x7f\x4c\x33\x27\xf1\x4d\x13\x78\x53\x69\xd2\x16\xe2\x90\xe8\x7a\xb4\x24\xf6\x78\xc8\x6a\xa4\x0c\x50\xbb\xa7\x69\x50\x02\x70\xcb\xa1\x01\x37\x2a\x64\xe7\x23\x2e\xa3\x70\x65\xdd\x53\xcd\xc1\x81\xce\x40\x90\x31\xac\xb4\x18\xd8\x93\x84\x3b\x3f\xbc\x82\x18\x0e\x19\x61\x3e\x87\x10\x8c\xc9\x01\x99\xf0\x1b\xd4\x62\x23\x2e\xd0\x87\x7c\x69\x5f\x70\xa6\x35\x70\x65\xcf\x7c\x1f\xc1\xd9\x8a\x94\x03\x1e\x32\x12\x2a\x3e\x10\x97\x04\x80\x46\x31\x38\xec\xda\x1b\x92\x86\x64\x2a\xfe\x6b\xb2\x95\x36\x29\xbe\xe1\x0c\xb8\x3e\x74\x20\x5b\xf2\x90\xcc\x64\x98\xb1\x21\x9e\x1d\x6e\x66\xa4\xd3\x03\x4f\xc4\x20\x3b\xbd\xed\x66\x54\x11\x35\x58\xee\x56\xa9\x72\xbb\x49\xd5\xf4\xf7\xed\x78\x50\xfa\xe1\x0c\x96\xe5\x76\xb1\xba\xc8\xca\xec\x79\xd2\xf2\xa8\x4d\xb0\x10\xee\x28\xd7\xcc\xdb\x05\x40\x55\x82\xe2\xf2\xff\xeb\x59\xd0\x7e\x70\x27\x04\xe7\x4a\x9e\x25\xb5\x59\x85\xca\xf7\xcd\x13\x19\x1a\xa3\xf1\x92\xf6\xc3\xc6\x29\x63\x80\x52\xa5\x03\x98\xa0\x03\x58\x9e\xad\x96\xf2\x09\x28\x3f\x63\x62\x6f\xd0\xc6\x65\x29\xab\xbf\x18\x33\xe9\xf5\xf2\xc3\xcd\xa6\x7a\x7f\x77\x7f\x19\xf0\x46\x54\x6e\xea\xba\x07\xec\x47\x5d\x93\x07\x68\x0b\xf3\xd0\xfd\x02\x95\xbb\x7d\x85\x46\x51\x9a\xba\x79\x58\xc5\xdb\x3b\x2c\x54\x31\xc5\xfc\x63\xd8\x00\x81\x60\xf9\x9f\x9b\xf7\x3f\x5d\x0a\x88\x25\x47\x1d\xec\xc6\x9c\x0b\xcc\xc7\xd3\x4c\x0e\x02\xa3\x51\x41\x5c\x36\x12\x74\x64\x2a\xec\x87\x41\x14\x40\xe6\x20\x36\xe7\x01\xbb\xc1\x63\xea\xcc\x2f\x19\xe5\x22\x09\x2a\xdb\x89\xfa\x62\x6a\x2b\x6c\x8a\x47\x2a\x9c\x51\xa1\x83\xec\x08\x0e\x6b\x2c\xd9\x8f\x83\x70\x95\xd5\xf2\xfe\x75\x79\x19\x00\x19\xf1\x6a\xf1\x53\x4a\xf3\xb8\x32\xd9\x24\x26\x4e\xc3\xdc\x4f\x8d\xc0\x94\xe6\xe8\x80\x2d\x0a\x2a\xaf\xbd\x11\xe7\xdc\xa0\x34\x7a\x99\xad\x7d\x68\x45\x11\xc6\x5f\x1a\x81\x32\xc7\x34\x0f\x62\x6d\x35\x7c\x9b\xab\x71\x62\x70\x44\x70\x79\xc2\xe0\xfc\xf5\xe5\x75\xbc\xbe\x62\x75\xdc\x5e\x37\x02\x0f\x1d\xe4\x9d\xb1\x05\xda\xd3\x4b\x31\x52\x0a\xe7\xff\x45\x8b\xb1\x52\x0c\x15\x5f\xb8\x18\x97\x8b\xf1\x5f\xb8\x18\xdf\x1d\x9a\xf4\xa5\x4a\x09\xbd\xa1\xf9\x62\xc5\xc4\xde\xd0\x7c\xb1\x62\x52\x6f\x68\xbe\x58\x31\x58\x74\xc6\x86\xbe\x18\x05\x20\x76\x07\xe7\x0b\x96\x43\xdd\xd1\xf9\x82\xe5\x98\xee\xf0\x3c\xa9\x9c\xa7\x71\x6b\x5b\x8b\x4b\x85\x44\x00\xe8\x79\x5b\x98\x8e\xed\x6a\x52\x66\xde\x0d\xfd\x2b\xe9\x2f\xb1\xe4\xb1\xfa\x97\x8f\x80\x8e\x54\xa0\xb3\x9f\xc1\x7a\x4d\xb7\x02\x92\xfe\x12\x6c\x1d\x33\xf3\xe0\x0e\xcf\xfb\x91\x75\x47\x33\xe1\x3e\xb7\xa7\x9f\x82\x8a\xd1\x33\x1a\xfd\xb2\x2b\xe4\xa7\x6c\x48\x9f\xd6\x99\x67\x6e\x39\x5f\x78\xcd\x3c\x73\xef\xf9\xd2\x6b\xe8\x59\x3b\xd1\x97\x5f\x53\x1f\x2b\xd6\xf5\x8b\xbd\xe4\x1a\xfb\x58\xb1\xfe\xd8\xd0\x5e\x64\xf9\x78\xac\xd4\x70\x74\x68\xbf\x78\xb1\xf1\xe8\xd0\x7e\xf1\x62\xd3\xd1\xa1\xfd\xe2\xc5\x62\x71\x64\x6c\x2f\xb3\xc6\x3d\x5a\x2c\x1e\x1b\xdc\xaf\x50\x2e\x1d\x1b\xdd\xaf\x50\xae\x39\x36\xbc\x97\x59\xe3\x1f\x2d\xd7\x0e\x3c\xd8\xbe\xc6\x9a\xff\x68\x85\xdc\xc0\xca\x49\x5c\xc8\xa6\x68\xe6\x71\x95\x20\xc4\x13\x1e\xae\x17\x76\xf5\xf4\xdf\x84\x9d\x65\x07\xcd\xc4\x7c\x1d\x61\xc0\x81\x39\x75\x02\xf4\x08\x59\x9f\x89\xd8\x7f\xf1\x55\xff\x2c\x74\xfd\x2f\xb1\xee\x3f\x52\xb0\x3d\xda\xe0\x0b\xb1\xe9\x47\xca\x75\xc7\x1b\xfc\xe5\x0b\xf6\xfd\x82\x2f\xbc\x1e\x3e\x52\x70\x18\x14\x7c\xd9\x15\xf1\x91\x82\xe3\xb1\x21\xbe\xd4\x12\xf1\x48\xb9\xe9\xe8\x10\x7f\x85\x82\x59\x06\x38\x32\xc6\x5f\xa3\x64\x3c\x3a\xc8\x97\x5a\x17\x1f\x2b\x99\x06\xcc\xf8\xd9\x2b\xe3\xff\xf3\x6e\x53\x7d\x7c\xbb\xb9\xbf\x7a\xb7\x59\xdf\x3f\xec\x5e\x5e\x13\x02\xa5\x2b\x7f\x85\x26\x5f\x62\x8e\xaf\xc9\x7f\xf3\x9b\x8b\xb6\xe3\x14\x8a\xfd\x2f\xd9\xec\xbb\xde\xc1\x5d\x69\x3b\x4f\x25\x01\x29\x82\x26\x0a\xb7\xf8\x76\xcf\xfd\x14\x09\x68\x9e\x26\x87\x97\xd9\x8b\x35\xaa\x34\xe7\xef\xbe\xfa\x66\x33\xd3\x0f\xf9\x69\x9c\x93\x5d\xd1\xed\x5d\xa1\xdd\x34\xce\x31\x75\xee\xe5\xb9\x57\x58\x4c\xd1\x76\x52\xa1\xed\x24\xe3\x1f\x87\x74\x54\x74\xd2\x51\xd1\x49\xc7\x3f\x3a\xe9\x7c\x37\x9d\xef\xa6\xf3\x39\xdd\x85\x40\x17\xbe\xa8\xf0\x78\xa2\x6c\x73\xf9\xbd\xa2\xcf\xb5\xcc\xff\x0a\xfd\x70\x3e\xf6\xc3\x71\xfc\xe1\x5a\xaa\xfe\xfa\x93\xe4\xc4\x7e\x53\xe3\x5c\xfa\x0b\x9c\x25\x5f\x1a\x11\xe2\xab\x01\x25\x1e\x45\x18\x97\x25\xe9\x67\x22\x15\xd1\x46\xbe\x1e\x49\x78\xe5\x8e\x13\xc1\xe5\xdd\x1d\xbe\x22\x9f\x78\x72\x78\x9b\x6f\xc4\xf9\x62\xbf\xbc\x7f\xb8\x90\xd1\x07\x86\x6c\x91\x59\xc3\xc6\x50\x01\x6e\xe0\x4d\x5e\x1f\x90\xe7\xa4\xa6\x8a\xe0\xad\x8e\x62\x05\xd3\x77\x3a\xc7\xcb\x1e\xea\xff\x22\x0e\xc4\x9f\xd4\x30\xf3\x33\x1f\x1d\xd9\x9f\xf9\xe4\xc8\xfd\xac\x07\x47\x07\xfa\xae\x1c\x18\xaf\xf8\x32\x23\x0f\x24\x46\x74\x23\xd4\x93\x01\xd5\x6b\x03\xc9\xca\x65\x88\x8e\xf2\x1c\xb2\x7f\x02\xe0\xdf\xcf\xbe\xe9\x68\x7e\x61\xe7\x6f\xcf\x6a\xa4\xfd\x06\x36\x56\xdd\x37\xb1\xaf\xfa\x95\xe8\xed\xcc\x6d\xd1\xa7\x4d\x5c\x05\x64\x34\x58\x9c\x92\x81\xf8\xb9\x73\xb7\xde\x98\xf8\xac\xdd\xd5\x9f\x65\x57\xc3\x7e\xcb\x3b\xe5\xcf\x6b\x92\xfb\xd6\xc4\xb1\x4b\x78\x5a\xfc\x1c\x1b\x02\xf4\xd5\x36\x04\x4e\x6e\x46\x9c\xd8\x9f\x2a\xbe\xe5\xfd\x29\x72\x90\xac\x42\x0f\x2e\x56\x3a\x65\x08\x0b\x1f\x66\x28\x6c\x29\x71\x85\x0c\x93\x8d\x69\xc1\xeb\x09\x92\xc2\x54\x19\x30\xac\x38\x9a\x38\xcb\x50\xb6\xde\x97\xdd\xa4\x19\x52\x2e\x19\xb9\x7c\x31\xdc\xff\x9f\x57\x93\x1a\x72\xf3\xae\x72\xed\xc1\x70\x7f\x88\xc7\x47\x83\xba\x90\xbb\x07\x9f\xd9\xcf\x2a\xe8\xb0\xd2\xf8\xed\x6a\xec\xff\xb4\x0a\xea\xaf\x5b\x85\xdf\xd0\x56\xe1\x9d\xb6\x3c\x6c\x06\x8a\xf8\x95\xd9\xd5\x57\x85\x80\xfd\xdd\xc7\x47\x00\x60\x0d\x78\x52\x18\xc0\x99\x85\x36\x35\xb8\x99\xd1\x09\x28\x6a\x2c\x34\x4b\x8e\xa4\xb1\xf8\xd1\x09\xff\x41\x30\xaa\x4e\x3d\x43\x08\xa4\x30\x56\x40\x1e\x6c\x5c\x98\x1a\x70\xc9\xa8\x24\x13\x40\xc2\x66\x46\x52\x58\xec\x90\xc0\x7a\x6d\x24\x7d\x9d\x5f\x25\xb1\x52\x6c\xbc\x7d\x85\x4c\x00\x9c\x85\xb9\x41\x12\x49\x94\xef\x15\x4b\xa4\xcc\x83\xac\xc2\xb8\x10\xd0\x92\xa4\x22\x60\xd0\x91\xdf\xa2\x81\x28\x77\x3f\xf2\xf0\x5b\x1e\x99\x40\x12\xd3\x38\x29\x8c\x37\xf9\x61\xce\x80\x0c\x58\xaa\x33\x3d\x94\x75\x21\x88\x5a\x8c\xe2\x18\x88\x80\x61\xe2\x21\x7a\x25\x97\xda\xc1\xcd\x65\xac\xf5\xc3\x53\xa1\xa2\xc3\x17\xb7\x77\x02\xa4\x1a\x68\x62\xf9\xbd\x6d\x3e\x45\xc5\x2c\x27\xf2\x83\x90\x2f\x35\xf9\xc9\xa7\x44\x10\xd3\x85\xe0\x6b\x7f\x1d\xfc\xc7\x05\xd0\xc7\x61\x0d\xa0\x68\x21\x3c\xa0\x30\x32\xf5\x78\xa0\xcf\x0d\x2e\x3f\x9e\xa4\xd3\xf5\xeb\xd3\x13\x95\x1c\x60\x62\xc6\x64\x27\x9e\x19\x9d\xef\xf0\x49\x41\xe5\x11\x10\xb4\x1e\xb1\x69\xbe\xd5\xf5\xc3\x90\xf2\xa5\x96\x5c\xc1\x04\xb0\x46\xfc\x79\x0c\x90\x29\x65\x21\xb3\x4d\x9e\xa8\x20\x58\x0d\x85\x9f\x0c\x89\x90\x4c\x5d\x96\xe5\xcc\x6c\x93\x23\x72\x62\x09\xc5\x72\x91\x79\x65\xac\x78\xd1\x7e\x8a\x30\x4b\xf4\x42\x65\xfe\xe0\xd2\xe9\x80\x2c\x44\x37\x43\x0b\xd1\xca\xba\x98\x97\xe8\x4e\xd3\x0c\x78\x56\x7f\xc3\xc2\x65\x78\x6f\x2c\x32\xea\x2f\x5a\x21\x2d\xc5\xa4\x55\x62\x10\x74\xcb\xd0\xf8\x97\xb2\xd4\x6d\x82\x72\x80\x55\xe3\x3d\x47\x25\x26\x61\xf3\xe9\xe0\x6a\xea\xb4\x6f\xa9\xfb\x32\x73\x54\xfa\xde\x41\x88\x95\x05\xcb\x5c\xc2\x7a\x2e\xd7\x89\x53\xaa\xa3\x76\xa4\x7d\x52\x01\x28\xcd\x88\x17\xa7\x73\x66\x26\x77\x1e\xd7\xde\x1f\x6a\x2f\x1e\x82\x08\x3e\x55\x4e\xb1\xc8\x12\x9c\x46\x70\x9a\xbc\x26\x7f\x7b\x27\x78\x9f\x72\xf1\xe0\xf3\xa5\xb4\x10\x51\xd9\x06\x48\x1d\x35\x81\xab\x19\x5a\x9f\x75\x19\x5e\x39\xa3\x1a\x24\x97\xc5\x53\xf8\x82\x33\xb7\x77\x1a\xc1\x3a\xb9\x94\x22\x32\xc9\xa5\x16\x61\xc0\x39\xb9\x54\x35\xa4\x34\x0f\x6b\x92\xef\x53\x53\x74\xde\x9d\x07\x5a\xe8\x3c\xae\x5a\xc6\x55\xf3\xb8\xea\x96\x65\xf0\xb8\x66\xca\x3a\x20\x8f\x02\x92\xf6\xf0\x94\x25\xe1\x51\xec\xec\x28\x28\x85\xf5\x92\xd0\x9b\x75\xd9\x35\x14\x7c\x55\x47\xe4\x38\x36\x91\x33\xeb\x3f\xb2\x6a\x34\x99\x5e\x02\xee\xf7\x9f\x70\x76\x3d\xc2\x66\xbf\xfd\x99\x15\xc1\xa8\x08\xe6\x9b\x20\xfb\x93\xbb\x12\x43\x97\xea\x87\xe5\xbb\xdf\x6f\xb6\x1f\xca\xed\x6b\x3a\xb9\x68\x05\x28\x98\x98\x1d\x8d\xc2\xc4\x49\xfc\x9a\x19\x7a\x70\x02\x80\x11\x00\x49\x70\x39\x63\x89\x20\xae\xdf\x6d\x2a\xe3\x25\xd4\xcd\xaa\x60\xad\x54\x50\x36\x12\xd8\x28\x18\x9b\x13\xee\x51\x85\x2d\x6e\x80\x6a\xcb\x7b\xd2\x3a\x74\xd5\x75\xe1\xe7\xc1\x4d\xca\xf5\xab\xa1\xeb\x5f\x73\x4a\xa2\x8b\x77\x6b\x68\xf2\x6e\x0c\x70\x6d\x7a\x35\xcf\x19\x3d\x69\x19\x18\xc2\x0c\x4d\xb6\xdb\xcd\x87\xd3\x22\x41\x00\xef\x99\xea\x7c\x0e\xeb\xc3\x34\x64\xf3\xef\x8e\x3b\x77\x86\x69\x0e\x33\x64\xf5\x26\x4a\xb0\x9b\x76\x87\x57\xe4\x54\x55\xcc\xf9\x85\xec\x15\x73\xca\xae\x2a\x59\x9f\xf0\x3c\xad\x3f\x9b\x46\x6c\xb6\x4b\x69\xc5\xee\xe5\xdf\xaf\xdf\xdf\xff\xe5\x7e\xf3\xe1\x5e\xef\x1e\xca\x87\xf7\xbb\xeb\x17\x87\x36\xfe\x5b\x7e\xf3\xa3\xbc\x50\xab\xcd\xdd\xb2\xf3\x72\xba\xb9\x5b\xaa\xc5\xe6\x6d\xe7\xd1\xcd\xe6\xad\x5a\xac\x96\x8b\xbf\x74\x9f\xf1\x6f\xf5\xb0\xbe\x5b\xee\x3a\x4f\xff\xc4\xbf\xd5\xf5\xf2\xaf\x8b\xaa\xbc\x13\x00\x10\xfd\xb0\x5d\x97\xf7\x6f\xab\x65\xb7\x02\xbf\x3b\xbc\xff\x53\xfd\xba\xff\x51\x96\xfa\x4e\x7c\x92\x41\x7f\xd4\xb5\x54\xe9\x48\x52\xa9\x5a\x93\x68\x7d\xff\x66\x73\x24\xcd\xbf\xde\xbf\xd9\xf4\x92\xec\x1e\xca\xfb\xd7\xe5\xf6\xf5\x30\xd1\x8f\xf5\x73\x75\xbd\x7b\xbf\x58\x2c\x77\xbb\xa3\x29\x7f\xcc\xef\x0e\x89\x97\xdb\xed\x66\x7b\x34\xe9\xef\xf8\xcd\x21\xe1\x87\x72\x7b\xbf\xbe\x7f\x7b\x34\xe9\x9f\xf3\xbb\x43\xe2\xd5\xb2\x7a\xa7\xb9\xba\xdd\x54\xd3\x65\xf5\x8e\x6b\xaa\x7e\x2a\xb7\xdd\xb1\xf8\xa1\xdc\xee\xd4\xfb\xdd\x72\xdb\x1d\xf9\xdd\x72\xab\xa4\xbf\x5f\x0c\x7c\xf4\xd5\x1b\x09\xe5\xfd\x62\x18\xdb\x5b\x5d\xe7\x17\x7a\xf3\x6e\x79\x7f\x3d\x7a\xfd\x87\x77\xcb\x7b\xf5\xd3\xb2\xaa\x5e\xf4\x03\xf3\xa9\xf5\x5d\xf9\xb6\x5b\x88\x04\x45\x51\x8b\x6a\xf3\xfe\xf5\x8b\x01\x9a\xba\xba\x5e\xd6\x30\x76\x7a\xd5\x82\x36\xf6\xba\x6c\x04\xe9\xd8\xf9\x64\x5f\x43\xdf\x1d\xfb\xa0\x81\xc5\x53\xd7\x6f\x04\x32\x4a\xbf\xdd\xae\x7b\x3d\x7c\x40\x92\xea\x25\x39\x42\x30\x43\xcc\x29\x75\xbd\xbf\xd3\x3f\xbd\x7f\xdb\x4d\x23\x90\x3a\x6a\x27\xc8\x17\x2f\x86\x50\x18\xea\x7a\xbf\x5e\x7e\xd0\x8b\x8c\xe6\xd0\xfb\xec\x00\xf2\xa0\xae\x65\x70\xf4\x6b\x41\x4c\xb8\x1e\x0e\x52\x06\x52\x50\x8b\xda\xbb\xff\xc5\xd8\xe1\x5f\x2d\xf7\xcb\xfb\x87\x17\x03\x8b\x0c\xb5\xfc\xd8\x1d\x8b\xdf\x7d\xe4\xe9\xf6\x71\xa9\x57\xeb\xd7\xfd\x49\x96\x35\x22\x75\xbd\x7b\x58\xbe\xd3\x6f\xf2\x5a\xa3\xa9\x47\xe9\x9d\x45\x48\x95\xcc\x2c\x5f\x0c\x98\xe7\x3f\xd4\x1f\x7e\xfa\xcf\xe5\xe2\x01\x5e\x2f\xdf\xac\xef\x97\x7f\xdc\x6e\xde\x2d\xb7\x0f\x1f\x7f\xd3\x65\x4f\xea\x7a\xb5\x79\xbf\x5b\x5e\xab\x35\xbc\x5e\xee\x16\xdb\xf5\xbb\x87\xcd\xf6\x66\x73\xff\x66\xfd\xb6\x97\x0e\x98\x39\x7d\xf7\xdd\x59\x39\xee\x96\x0f\x0f\xeb\xfb\xb7\xbb\x4f\x67\xba\xd8\xbc\x3d\x37\xcf\x3c\xaf\xcf\xc8\x92\x79\xce\x99\x99\x2e\xaa\xcd\x39\x4d\x17\xde\x7a\x66\x96\x35\x17\xf9\x64\xa6\xff\xf7\x38\x6b\xfe\xf7\x33\x8b\x11\xae\xf6\xc4\x42\xea\xa9\x74\x6e\x11\xc2\xdd\x3e\x5d\x42\x97\xad\x9f\x9b\xf5\xdd\xf2\xfe\xfd\xa7\xbb\x9d\xb9\xe8\x99\x19\x96\xfb\xf2\xa1\xfc\x74\x7f\x00\x33\xe1\x73\x69\xa3\xdc\x2e\x1f\x3e\x9d\xa3\x0c\xdb\x99\x59\xbe\x5e\x6f\x97\x8b\x87\xcd\xf6\xe3\xa7\xb3\xcd\xac\xfe\xcc\x7c\xef\x37\x0f\xeb\x37\xeb\x85\x8c\xf2\x19\xdd\xba\xac\xaa\x73\xfb\x60\x53\x55\xe5\xbb\x33\xa6\xc8\xff\xed\x73\xcb\x7f\xff\xee\xbb\x7f\xa8\x6b\xf8\xfe\xdd\x76\xc3\x85\xec\xbe\x5f\x2f\x36\xf7\xbb\xef\x77\xdb\xc5\xf7\x3b\x49\xff\xfd\x72\xb7\x5b\xde\x3f\xac\xcb\x4a\xef\xea\x39\xb6\xbb\x7e\xf1\xe6\xfd\xfd\x82\xdb\xf0\x9b\x07\xb5\x54\xdb\xef\xfe\x7e\xfd\x7e\xb7\xbc\xda\x3d\x6c\xd7\x8b\x87\xeb\xdf\x9e\xa8\xaf\xba\xfe\x8f\xff\x58\xee\x5e\x6d\x5e\xbf\xaf\x96\xd7\xea\xef\xfb\xb2\x7a\xbf\x7c\xf1\xdf\x8a\x7f\x74\x25\xc9\xd9\xe6\xed\xe6\xfd\xc3\xcb\xde\x83\xf5\xfd\xcb\xfe\xc2\xfd\xb2\x2b\x65\xbd\xfb\xd8\xfd\xb9\x5a\x57\xaf\xb3\x34\xda\x79\x28\x14\x3f\x7c\x3a\xa9\xca\xed\xdd\x4d\xb5\x59\xfc\xe5\x65\x6f\x69\xed\xfd\x9e\xae\x77\x4c\x04\x9d\x27\x7f\x2a\xdf\xee\xfa\x3f\xbb\xbf\xb6\xe5\x6e\xf5\x72\x20\xd9\xd5\x70\x8b\x5d\x19\xa3\xdb\xa0\x3f\x56\xef\xc7\x49\x5e\xad\xef\x4f\x3d\x1d\x7c\xfa\xb2\xb7\xda\x76\x53\xff\xb1\xd7\x6f\x79\x29\xee\xbe\xde\xbc\xfb\x43\xaf\xa7\x59\xcc\xe9\x66\xf7\x6f\xf7\x83\xce\x98\xf5\x7f\xfe\xdb\xbb\x6a\x53\xbe\xee\x3c\xf8\x9f\x9b\x0f\xf7\x83\x47\xb3\xf5\xdb\xd5\xc3\x4f\xef\xab\x9f\x5e\x0e\x56\xee\x72\xfb\x7a\x37\x78\x36\x5b\xef\xba\xd5\xf9\xf1\xe3\xfd\xa2\xf3\xf3\x7f\x2f\xdf\x6c\x97\xbd\xce\xfd\x5f\x9b\x87\x5e\x73\x97\xf7\x8b\x75\xd5\xed\xfc\xd5\x72\x7b\xb7\xb9\x5b\xf6\x9b\xfd\xc3\xfb\xee\x80\xfd\xb8\x58\xef\x76\x9b\x5e\xb3\x27\xbb\x87\xe5\x76\xbd\xeb\xb6\xf4\x87\xcd\xa6\xfb\x33\x93\xf7\xae\x57\xb9\xdd\xfa\x6f\xdd\xca\xdc\xbc\xdf\xee\x36\xdb\x69\x79\xff\xfa\xa6\x5a\xf7\x29\xac\x7d\x33\x7a\x38\xa4\x50\x96\x9b\xb8\x63\x7a\xb5\xff\xe9\xa7\xaa\x2b\xd6\x77\xfb\x63\x39\x22\xef\x3f\xbc\x79\xd3\x27\x88\x9f\x36\xe5\xb6\x5b\xf0\xe4\xf5\xeb\x3f\x2d\xff\xfa\xf0\x72\xbf\x59\xbf\xbe\x2a\xfa\x11\x7b\xee\xc7\x0d\x7a\xb5\xd9\x77\x1f\xfe\xb9\xdf\x8a\x1f\xdf\x77\xab\xf3\x6a\xb3\x19\xd3\x1f\x75\xc9\x65\x5b\xbe\xe5\x7e\xe8\x11\x2d\xcf\xe7\x3f\x6d\x6e\xaa\xf5\xbb\x61\x55\x6f\x36\xd5\x66\xfb\xc7\xf5\xe2\x2f\xfd\xe1\xdc\xae\x97\x6f\x16\xe5\xae\x9b\xc7\xef\xfe\xfa\x8e\x3b\x7e\xf4\xb9\xf0\xc7\xc1\xe3\x1f\x37\xdb\x87\x1f\xba\xf3\x7b\x22\xb2\xcb\xfa\xa7\x75\xb5\x7e\xf8\x48\xa7\x5e\x60\x37\x8b\xd5\x76\x7d\xdf\x1d\xe2\x3f\x96\xef\x96\xdb\x45\xb5\x7e\x37\x98\x9b\xff\xb2\xdd\xbc\x7f\xd7\xa3\x9a\x77\xcb\xb2\x4b\xf2\xff\xfa\xfa\x87\xf2\xf5\xdb\x3e\xab\xa8\xca\xfb\x45\xf7\xc9\x1f\xb6\x6f\xcb\xfb\xf5\xdf\x46\x83\xbf\xc9\xf5\xeb\xf2\xae\xcd\xfb\xed\x5b\x51\x86\x3b\xd5\xa8\xca\xbb\x65\x8f\x7d\x6d\xdf\x2e\x1f\x7a\x04\x56\x55\xbb\xe5\xc7\xde\x28\x6f\x97\xf7\x8b\x55\x6f\x3a\x54\x3d\x0e\xbd\xfe\x69\x5b\xf6\x78\xe4\xff\xb7\xec\xfe\xba\xdd\x6c\xee\xfa\x9c\x86\x9f\xfc\x6b\xb7\xf6\x7f\x5e\xdf\xbf\xde\x7c\xf8\xdf\x4b\x66\xb6\xcb\xd1\xf3\x57\xeb\x71\xda\x57\xe5\x5f\x47\xcf\x6e\x58\x44\xec\x36\x6e\xb3\xa9\xba\x8d\xff\xf1\xc3\xfa\xa1\xd7\x90\x3f\x7d\xd8\xfc\xb9\xfc\x28\xd3\x6e\xc8\x47\x7f\xac\xe5\xe2\x1e\xaf\xd8\x6e\xaa\xaa\xc7\x20\x5f\x6f\x7a\xc3\xd9\xfb\x39\x60\x67\xbf\x5f\x6f\x97\x1f\xca\xde\xf7\xc7\xa8\xfc\xc7\x6a\xfd\xba\x47\xe0\x7f\xde\x6c\xab\x6e\x82\x3f\x6e\xd7\xf7\xcc\xd1\xda\x19\xfb\xbb\x66\x79\xce\xcb\xfb\x68\xc6\x94\xd5\xf2\xa1\xc7\x28\x7f\xbf\xde\xee\x1e\x26\xeb\x6e\xa6\x3f\x2c\x1f\xca\x1e\x23\x7f\x18\xad\x3d\xe3\x07\xdb\xcd\x6e\xb7\x2a\xd7\x3d\xe6\x39\x67\x8d\xac\x4f\x60\x3f\xf5\xbe\xfa\xf1\x7e\xf3\xe1\x4d\x55\xfe\xa5\x57\xa1\xf7\xcb\x6e\xb7\xfc\x7e\xb3\xbd\xeb\x55\xb7\xbf\xa4\x6e\x97\xcb\x5e\xa7\x2f\x3e\xf6\xeb\x95\x19\x4d\x9f\xf3\xf1\x88\xde\xf6\xe6\xe3\x81\x0d\xb3\x32\x7e\xf4\xc5\xbf\x6c\xcb\x9f\x06\x05\x0f\xb8\xf1\x1f\x37\xdb\x87\x6d\xb9\x7e\xe8\xcd\xfd\x5d\xaf\xb3\x67\xe5\xfd\xeb\xdd\xa2\x7c\xd7\xe3\x4f\xdb\x72\xd7\x1b\xe3\x03\x27\xbc\xd9\x6c\xef\xfb\xaf\x96\x0f\xe5\xba\xda\xd5\xc3\xfd\xdb\x7d\xb9\xbd\x5a\xbf\xdc\xfe\xe6\xb8\xc0\xf6\xfe\x61\x5d\xed\xbe\x3f\x48\x7f\x7a\x21\xe2\x1f\x0b\x6c\xdf\xa9\xfb\x4f\x7c\xb6\xdb\xbf\xd5\x0f\xe5\x5b\xfd\x76\x79\xbf\xdc\x96\x0f\x9b\x6d\xfe\xac\x3c\xf9\x59\x2d\x1e\x2e\x36\xdb\x65\x47\x32\xfc\xee\xb7\xe3\xd5\xe5\x32\x20\x8c\x84\x53\xec\x58\xb5\xa9\x22\xa3\x2e\x76\x1e\xe8\x23\x46\xc4\xcf\x83\x73\x26\x85\x83\x78\xdc\xa3\xa2\xa6\xd8\x35\x5e\x91\x2f\x3e\xb7\xf4\xc6\xbf\x2f\x28\x0a\xe3\xb6\x76\xc1\xb5\x2f\xd1\x56\xdb\x86\x8f\x8e\x49\xa5\x01\x96\x36\x16\x73\x03\x84\x03\x23\xc2\x38\x25\x88\x69\x50\xaf\xb8\x77\xbd\x94\xb2\x53\x8b\xc5\xca\x42\xec\x99\xf3\xe4\x72\x46\xde\x2f\xad\x54\x72\x09\x2a\x29\x94\x29\x94\xcf\x17\x3f\x25\x9a\xdb\x69\x37\x34\xa6\x3d\x1a\x14\xb2\x18\x06\x85\xb4\x53\x73\xc4\xf0\xe8\x79\x6e\x2f\x82\x09\x9c\xc0\x98\x4a\x07\x1d\x8e\x59\x2c\x57\x41\x85\xce\x3e\x77\xeb\xad\x70\x29\x6a\x22\x40\x39\x92\x4b\x15\x04\x70\x33\xf2\x60\xbd\x8a\x8a\x9c\xf2\xe0\x24\xa4\xac\x43\x95\x00\xcd\x42\x93\x86\x18\xb4\x05\xe3\x00\xad\x96\x40\xb4\x08\x3e\x56\x1a\x02\x09\xe0\x26\x38\x2b\x17\x6d\x24\xf2\x22\x5f\xda\x76\xc8\x4f\x79\x31\x23\x39\x26\xa3\xa2\x12\xdc\xce\x40\x0b\xe4\x6f\x04\x6d\x9a\xc0\x39\x6d\x9a\x9c\xb9\x0c\x53\x11\xbf\x25\x70\x61\x46\x01\x62\xe4\xee\x8a\x8a\xac\x04\xbb\x36\x80\x15\xd8\x04\x3e\x2d\x24\xf2\xbf\x02\x72\x8a\xc0\x04\x9d\x8b\x34\x66\x86\x51\x60\x78\x11\xfc\x0d\xa6\x7c\xe0\x27\x51\xb0\xb1\x8e\x3b\xe4\xd4\xa1\x0f\xce\xea\xd4\x4f\x78\x64\x7f\x65\x22\x7b\xdc\xf6\xf7\x1c\x02\x43\x39\x11\x04\x13\xb5\x55\xf6\xab\x8e\x32\xb6\xa3\x4c\x95\xd5\x62\x19\x9a\x6b\x72\x8a\xe0\xfb\xc7\x4a\x8d\x0e\x73\x91\x05\x04\x2c\xb7\x25\xda\xd2\x41\x88\x72\xa0\x5a\x77\x94\x1c\x7a\x4a\x20\x75\x2f\xf8\xd3\xbe\x01\xa0\x46\x15\x81\x54\x00\xef\x26\x0e\x82\x51\x72\xa9\x4f\xd3\xda\xec\x2e\xc4\x28\xc8\x81\x31\x02\x2f\x6d\x4b\x48\xd0\x22\xb8\x4b\xdf\x50\xa5\x8d\x04\xcd\x72\x9e\x7b\x3d\x26\x45\x34\x81\x98\xf8\xae\x3d\x92\x6f\x3e\xbf\x10\xdf\x10\x68\x60\xdf\xab\x4b\x82\xb4\xb7\xe0\x2b\x14\xfc\xf8\x88\xf3\x04\x6e\x72\x48\xa0\xf2\x27\x97\x5a\x97\xe4\x84\xdd\x80\x35\xa5\x03\x1e\xaf\xd8\x1e\xee\x47\xd4\x10\x71\x16\x81\x87\xc4\x1c\x02\x1c\xc8\x42\xdd\x7e\xf6\xb9\xf5\x70\x6d\x3f\xd8\x12\x4d\x1d\x76\x2c\x35\xb3\x8b\x0b\x27\x08\xae\x35\x04\x30\x13\x96\x01\x1a\x73\x51\x66\x64\x24\x81\xf8\xbb\x09\xda\x68\x0a\xd2\x57\x9f\x3d\x52\xbe\xae\x21\xb3\x71\xe1\x96\x94\xa9\xd4\x44\xa6\x71\x26\xd7\xba\x30\x9e\xc1\x1e\x70\x82\xae\x0e\xc1\xde\x9a\x41\x38\x59\x0c\x00\x69\xe6\x33\xe7\x75\x6e\xc2\xcd\x14\x2b\x88\x36\x30\x6d\x04\xcc\x4d\x8a\x33\xc7\x85\x99\x42\x9a\xd3\x4e\xe1\xc0\xf3\x21\xda\x8a\xc0\x7b\x4d\x62\x68\x6a\x98\x36\xf3\xb5\x31\x2a\xe1\x11\xac\x2c\xa0\x55\x16\xd0\xcd\x0c\x65\xb8\x79\xee\xc7\x78\xfb\x8a\xd9\x7a\x80\x40\x13\x44\xf9\x14\x9b\x4f\x73\xe4\x89\x2c\x62\x35\xdd\xeb\x15\xc6\x72\x9c\x90\x80\x92\x0e\x97\xe0\xf1\x3f\x2b\xb7\xf8\x04\xf4\xc4\xe9\x89\x11\x82\x86\x48\x3c\x31\x84\x0c\x3e\x67\x62\x7c\x02\x82\xc2\x4a\x90\x7a\x84\x64\x2b\x0b\x86\x47\xd4\xf8\x1e\x7d\xd7\x06\x58\xc1\xcc\x30\x28\xb4\x73\x5e\xc1\x3b\x2e\xc6\x22\x23\xfa\x8a\x84\x6b\x81\xb1\x33\x92\xa0\x2c\x1d\xcc\x6f\x95\x23\x28\x18\xd3\x85\xee\x3e\x14\xfb\x39\x8d\x68\x38\x0c\x78\xec\xcf\x1b\x19\xed\xde\xc8\xd5\x33\xc7\xf1\xd4\x89\x32\x75\x62\x67\xea\x48\x18\xe5\x99\x67\xae\x90\xc0\xd1\x17\x9c\x39\x26\x4f\x1d\x9e\xe7\x18\x06\x53\x67\xb8\x6c\xfe\xaf\xe5\x71\x5b\x8c\xa7\xae\x98\x16\x5c\x12\x87\x3b\x0b\x45\xd4\x4e\x59\x6d\x21\x95\x28\xc6\x43\xad\xad\x95\x38\xe9\x61\x36\x43\xaf\x6d\xc9\x1b\xa2\x27\xe9\x8c\x62\xa5\x0d\xf2\x4b\xb1\x36\x3f\x28\x0e\x3c\x6f\xe3\x9c\x2c\xb0\x1e\x35\x78\xcb\xf9\x29\xf2\x53\x63\x72\xd8\x89\x7e\xc6\xc8\x74\x8e\x50\xa4\xc9\xb0\x2e\x4d\x95\x6f\x5f\x31\xef\x9d\x23\x4d\x0d\x41\x88\xdc\x82\x68\x15\xcb\x9a\x33\x43\x10\x9d\xa2\xa3\xf4\x53\xfb\x08\x3e\x65\xe9\x6e\x5c\x02\x13\x98\x74\x25\x21\xde\xaf\x3c\xa0\xb9\x42\x77\xe5\xf2\x45\xe2\xb6\xe7\x87\x9d\x5b\x1e\x53\x7b\x25\x5f\xe5\xa7\x2c\xa7\x62\xef\x1e\x5d\x7e\xdf\xfe\xe5\xdc\x2f\x50\x6b\x73\xa8\x35\x12\x17\x57\x17\x2a\x35\xea\xdd\x17\x80\xfe\x0a\x0d\x18\xec\xdd\x63\x04\xe7\x38\x8d\xeb\xdd\x06\x70\xd4\xa4\xe8\xde\x7b\x28\x9a\xf6\xf6\xee\xdd\x55\x2e\xbe\xbd\x91\xb2\x2f\xd0\x40\xdb\xf1\xd4\xb4\x52\x91\x04\xd6\x5c\x91\x81\xc2\x73\x69\x84\x75\xf9\x54\x80\x09\xf5\x5b\x4c\x50\xc8\x88\x21\xaf\xdc\x72\x93\x20\x34\x9d\x43\x05\xc4\x66\xa4\x88\xc0\xe6\x36\xa7\x2b\x6a\x7a\x8c\xdc\x61\x80\xc5\x3e\x4c\xf2\x77\x10\x25\xcf\x4e\x35\x2e\xb0\x36\x59\xe1\x29\x16\x6c\x12\x5f\x58\xd2\x5e\xa2\x9d\x42\x8c\xda\x83\x71\x1d\x9d\xdb\x18\x71\xab\x2d\xa6\x74\xd0\x3e\x34\x29\x9a\x93\x1d\xea\x27\x06\xa8\xf7\xe5\xa1\x90\xdb\x3b\x4d\x06\xbc\xe6\xd1\x9c\x32\x25\xce\xbc\x78\x21\xf1\x28\xee\x59\x8b\x98\xba\x39\xba\x29\x3f\xac\x0c\x50\xe0\xb5\x80\x9f\xac\x10\x90\x6e\x5f\x49\x3a\x85\x7e\x2a\xe4\xb0\x47\xb0\x69\x65\x80\xf6\xb8\xd2\xf2\x07\x3c\xae\x0c\x38\xb3\xc7\xa9\x90\x01\x7f\x69\xc1\xbb\xdb\x3b\x09\xc7\xea\x00\xfd\x94\x6c\xc5\xc2\xaf\xd3\x3c\xbf\x67\x54\x40\x0e\x53\x14\xa7\x32\x46\x95\xe6\x2e\x90\x5f\xac\xea\x90\xb2\x60\xcd\x4c\x46\x59\x49\x35\x88\x2a\xac\x4d\x27\xcd\x4c\x06\xa5\x7e\x6e\x46\xbc\x73\x7c\xc0\x72\x09\x5c\x8e\xc8\x0a\xd1\x42\x47\xe1\x54\x1a\xbd\xf2\x62\xc3\xea\x15\xda\x5d\x80\x3a\xce\x16\xff\x2a\xf9\xbe\xb1\x3d\xb4\x3c\xa2\xac\x98\x39\x70\x86\x15\x32\xea\x99\xbc\x39\xab\x79\xe5\x28\xb4\x97\x50\x34\x87\xd8\x2c\xca\xea\x04\x14\x6e\x8c\x55\x91\xe5\x16\xf2\x39\x9e\x90\x38\x7a\x10\xb8\xdb\x57\x24\x5d\x4b\x39\x66\xd3\x21\x0a\x1b\x33\x4b\x53\x15\xb2\x12\xb2\x7e\x18\x35\x41\xe8\xee\x0c\x41\x34\x1a\x10\xfb\x72\x45\x54\x14\xb9\x75\x2c\xbc\x71\xeb\x58\xa5\x34\x91\xff\x22\xed\x72\x43\x49\xc9\x2f\x6e\xa6\x13\x0d\xd0\x2a\x14\x41\x8f\x05\x28\x3c\x08\x50\x9d\x7a\x5d\x6a\x27\x2f\x4a\xac\x37\x33\xf0\x3b\x8b\x60\x3b\x2a\xa8\xec\x6d\x61\x3a\xd8\x23\xd6\x02\xba\x7c\x79\xa4\x22\x8f\x20\x02\x9c\x60\xb8\xdd\x00\x93\x64\xa1\xb0\xe2\x86\xc1\xd2\xcd\xe7\xf3\x83\x6f\x8e\xba\xb2\x41\x71\x02\x34\xe5\x61\xdb\xa0\xf6\x18\x12\x9b\xfa\x39\x46\x11\x24\x7a\xef\x74\x7e\x77\x7b\x97\x9f\x07\x30\xbc\xf2\x4b\x50\xa8\x18\x5a\x77\xb5\xc8\x2b\x7f\x0c\x93\xee\x9b\xda\xe9\xc8\x58\xb1\x65\x0d\xa3\x39\xdd\x9e\xa3\x5e\x62\x2a\x5b\x35\xda\xed\xd9\xc7\x3e\x33\x5d\xc5\xc1\x5e\x4f\x37\x3d\x67\x70\xfb\x8a\x47\x63\xee\x57\x71\x7f\xc4\x85\xf4\x79\xfb\x8c\x85\xb2\x53\x1a\xb0\xf9\x27\x55\x8c\x73\xb8\x7d\xc5\xcb\xc5\x85\x6a\x66\xda\x1e\xa3\x62\xea\x9f\x58\x33\xa2\x7e\x9f\x51\xc1\x9d\x66\x8a\x39\xd1\x25\xea\x66\xdb\x5e\xa3\xe2\xe9\xdd\xd6\xab\x9c\xe4\x21\x1d\xf7\x58\xed\xc6\xc8\x3a\xa7\x27\xf5\x5f\x5f\x5e\x67\xbc\xd3\x03\xf4\x27\x76\xb0\x3f\xf9\x7e\xfb\x57\x81\x03\xdd\x7e\x3c\x86\xb1\x73\x7e\x61\xbd\x68\x1e\x5f\xbc\x34\xd3\x69\x1a\x97\xf9\x65\x4b\xeb\x85\xf8\x39\xbf\xb8\x7e\x44\xa8\x8e\x5d\xc6\x45\x98\x07\xb8\xc8\x7a\x91\xe9\xc5\xb6\x4a\x56\x83\x77\x33\x5e\x1b\xbd\xeb\x68\xbb\x0e\xc8\xb1\x30\x15\x2a\xf2\x2a\x81\x8f\xdd\x8f\x0a\xc7\xec\x2f\x55\x3a\x66\xcf\x03\x17\x54\xe3\x9e\x71\xc8\x21\x6f\xae\xca\xe6\xa1\x57\x7c\xe9\x87\xd4\x02\x4a\xab\x62\x1c\x65\x4b\xf2\x34\xf9\x42\xe0\x55\x04\xeb\x7a\xf5\x35\x10\xf0\xf6\xce\x40\x91\x74\x37\xfe\x96\xca\x59\x56\x11\x42\xe2\xb5\x21\xcd\x78\x31\x0f\xe0\x90\x73\x0c\x5e\x2e\x3d\x05\x1f\x35\x82\xf7\x55\x00\xe4\x92\x68\xe6\xc1\xab\x50\x05\xd9\xe0\x44\xa0\x19\x7a\x09\xe0\x85\xfd\x32\xf4\xd1\xd8\xad\x4f\x5e\x37\x29\x29\x14\xb7\x0d\x96\x9c\x55\xf7\x30\x8f\x58\x8b\xb4\x40\x71\x86\xa4\x28\x81\xb5\xbd\xa5\x31\x26\xee\x7e\x56\xd9\x13\x37\xc9\xf1\x52\x47\x4a\x96\xb4\x9e\x47\x82\x2a\x2a\x02\xe3\x34\xc9\x52\xd6\x39\xba\xcb\x83\x92\xb8\xff\x22\x44\xcf\xdd\x84\xb6\x2f\x7f\x37\x95\x1b\x07\x29\x3b\xd8\x0f\x5d\xe4\xc0\x0c\x82\xb8\x62\x60\x2a\xd1\x88\x9b\x86\x5c\x73\x3d\x3d\x2f\xb7\x06\xa2\x99\x90\x57\xd4\x09\x18\xcb\x0a\x6a\x9c\x3b\xa0\x38\x31\x60\xb3\x6b\x49\xcd\xa9\xc1\x29\xd9\x65\xea\x3e\x14\x52\x8e\x7b\x2c\x66\x09\x64\x7b\x24\x94\x06\x42\x50\xa6\x8d\x9c\xa8\x9d\x00\x11\x4c\x0e\x07\x0e\x35\x73\xcd\x71\x09\x4b\x03\x3c\x4c\x6d\x0d\x78\x84\x7c\x65\xb9\xa6\x4e\x04\x17\x64\x19\x26\x5f\xdb\xfe\x37\x4a\x4e\x82\x58\xec\x94\x6b\xcb\xcf\xc1\xd9\x3d\x42\xa2\x72\x18\xa6\x11\x25\xf6\xa4\x1c\xb4\x0e\xdf\x68\x7e\xb3\x67\x79\xb8\x44\x11\x54\xf2\xb5\xae\xa5\x4c\xc2\xbd\xf6\x5d\x05\xea\xd0\xb3\xb7\x4c\x6a\xac\x8e\xf8\x12\x0b\x71\x30\x96\x6b\x51\x7b\x22\x7a\x15\x78\x7a\x22\x2b\x5c\x72\xa9\x65\x6d\x0b\x81\xe6\x86\xa6\x68\x01\xed\xdc\x14\x3d\x09\x4d\x83\x65\x01\xcd\xe4\x6f\xe5\xd2\xd4\x33\x92\xa6\xec\xee\x85\x36\x5f\x9a\x37\xa4\x8d\xb8\x8d\x1d\x32\x21\xa3\x59\xa3\x12\x11\x50\x1c\xed\x7a\x4e\x43\x98\x03\x99\x12\x3f\xf0\xf9\xd2\x74\xbf\x0d\xaa\xa8\x8c\x32\x7b\x03\x68\x2b\xd2\x98\xa9\xa1\xf5\x8a\x6b\xfa\x93\xe9\xc1\xaa\xd1\x63\x5f\x53\x04\x42\xac\x48\x81\x35\x73\xe4\x49\x57\x92\x65\x05\x32\x5f\xdb\x91\x46\xd1\x0a\x63\x85\xe0\x45\xb3\x34\x0b\xb0\x3c\x1c\x10\x4d\x0e\x00\x4b\x2c\xf0\x96\x68\x65\x87\xce\x1e\x76\xe8\x98\x1e\xc0\xa6\xbd\x03\x74\xed\xd7\x16\x9c\x68\x1e\xe2\xe3\x58\xb4\x2d\x4a\x4c\x69\xf4\x59\x7b\xa3\x0d\x5f\x89\xe2\xed\x65\xc1\x98\xbd\x85\x28\xf1\x58\xa5\x85\x06\xc8\x96\xe8\x01\xa5\x2c\xec\xf8\x38\x1b\x96\xb5\xf7\x0e\x22\xb5\x89\x69\xa1\x11\x50\x03\xb2\x12\x26\xd1\x8a\xb5\xe0\x3f\x30\xa1\x39\x61\xa9\x75\x42\x04\x1b\x57\xc5\xdc\x82\xb1\x25\xf1\x38\x52\x3b\x0b\x98\xb8\x78\x00\xeb\x67\xfd\x17\x3c\x88\x12\x7f\x97\xc2\xaa\xd8\x73\xef\x57\x9a\x14\xce\xd1\x81\x9f\x65\xbf\x47\xb1\x00\x20\xa6\x32\xb9\xe4\x4f\xad\x30\xc8\x64\xf2\xa5\x68\xb5\x89\x22\x55\x4c\x88\xc8\x34\x2e\xee\x85\x87\x6d\x39\x04\x23\xfc\x94\x99\xa4\xad\x2f\x0d\xa7\xad\x77\x5f\xb9\x02\x7e\x4a\x01\x42\x62\x52\xf7\xc4\xd3\x2c\x3b\xcd\x3b\xdb\x99\x66\x4e\x66\x99\x80\x83\xd4\x39\x1c\x7a\xfb\x11\x5e\x99\xad\x30\x2f\xc3\x30\x2d\xcf\x14\xcf\xc3\x13\x35\x42\xd2\x56\xe6\x15\xb1\xa2\xa4\x0d\x84\x3c\x6e\x05\xc8\x8a\xa6\x0b\x70\xda\x80\xd1\x05\xf8\x05\x41\xe4\x7b\x45\x20\x0c\x43\xa3\x46\x04\xdc\xc9\x3d\x3f\xe3\x5f\x0a\x77\x7c\x2f\x6b\x79\x3e\xb2\x1e\xa3\x72\xf0\x7f\x8b\x82\xb9\x21\xb8\x1c\x72\x17\x92\xca\x67\x72\xb8\x27\xa0\x8a\x57\x55\x8d\xac\x13\x22\x58\xf9\x67\x20\xc8\x5f\xc7\xa9\xe5\xb1\xca\xaf\x1c\xb3\x55\x5d\x00\x2a\xc7\xfc\x54\x62\x44\x17\x12\xc9\xd7\xaa\x02\x02\x8f\x8d\xdc\x1b\x48\x27\x2b\xe2\xea\x0a\x50\x5d\x89\xc4\x94\xc6\x1c\x76\x51\xa8\x5c\x4d\x9b\xb5\xb7\x15\x2f\x2e\xf9\x03\xc5\x5d\xe4\x98\x2b\x31\x53\xf5\x0b\xee\x48\x92\xbe\x49\x52\x49\xfe\x1b\x01\xf7\xda\x41\x3c\x5e\xf0\x0d\x73\x58\x1e\x0a\x09\xe7\xe9\xc5\x4b\x57\xb5\xc3\xf3\xb7\xab\x57\x11\x58\x43\xa5\x45\x51\x77\x7a\xd0\x0e\x92\xf2\x9c\xe3\x82\x9f\x14\xca\x49\x55\x83\x1c\xa1\xf8\x85\x2c\xed\xba\x80\xc8\x4b\x17\x0f\x9e\xb2\xe0\xe6\xe1\x64\xc3\xb9\xd7\x6a\x22\xf0\x42\x00\x46\x3a\x9a\x32\x65\xf0\x4b\x53\x77\x73\x5e\x0e\x69\xef\x80\x6e\x24\x9a\x32\x01\xaa\x08\x62\x9c\x20\xd3\x81\xeb\x39\xab\xff\xfe\xed\x8a\x39\x08\x33\xc1\x05\x0f\x0b\xc9\xf0\x44\xe5\x40\xbc\xd6\x79\x86\x9d\xae\x0f\x93\x02\xd3\x1c\x8f\x9d\xad\xff\x86\x3d\x01\xf2\x22\x42\x7b\x1e\xf7\x45\x21\xb4\x99\xd3\x71\xd6\x9c\x2e\xf2\xc7\x41\x1e\x20\x13\xa2\xfc\x63\xc6\x43\x8b\xfc\x50\xa3\x50\x73\x5e\x42\xec\x29\x4a\xa8\x73\xc5\x3a\x57\x29\x41\xf6\xde\xb5\xe3\x79\x91\xcb\x35\x32\x27\x72\x71\x8e\x73\x94\xef\x6c\x5d\xf3\xa4\xda\xa7\xb9\x42\xbc\xec\xc8\x5f\xe2\x34\x15\xc9\x90\xa5\xbd\xa9\x98\x62\xf0\x91\xe1\xc9\xf5\x08\xdc\x03\x3a\x87\x20\x6f\xf3\xcd\xf2\x41\x3d\x7d\x24\x0e\x34\xaf\x44\xae\xe2\xee\xb3\x7b\x6d\x85\x48\x51\x66\x45\xdd\x22\x55\xf7\x59\xef\x6b\x1e\x1c\x49\xb1\xcf\x0e\xe1\x4c\xe9\x86\x29\x96\x8e\x57\xa9\xca\x73\xd5\xd4\x53\x46\x96\xe1\x5c\x31\xae\xca\xde\x1d\xb2\xc8\x35\x48\x79\xe6\x30\x95\x4b\xeb\x11\xc2\xac\x26\x8d\xbf\x0d\x59\x5d\x6d\x81\x7e\x09\x25\x25\x29\xdb\xb7\xf0\x5a\x25\x59\x1c\x12\xab\x23\x7c\x19\xd8\x6e\xc8\x65\x66\x24\x18\x39\xce\x7b\x7e\xb9\xa4\x8a\xf9\xa5\x0c\x24\xac\xc2\xc1\x01\xe2\x5e\xea\xc5\x35\xd2\xbd\x6a\x75\x00\x8c\x67\x41\x4c\x56\x8a\x69\xa7\x5a\xe2\x4c\x3c\x1d\xc3\x30\x37\x66\xfd\x97\x01\x62\x2e\x44\x14\x49\xbc\x1a\x72\x5d\x8a\xbc\xcf\x55\x34\x9b\x58\x10\xb0\xd2\x56\x9c\xe0\x43\x67\xf7\x41\xd0\xa2\x8a\x19\x09\xc4\x42\x6f\x77\x46\x0e\x3e\xe3\xca\x8b\x53\x74\xbb\xfe\xa1\x06\x47\x9a\xa6\xfc\x7a\x86\xc4\xf2\x8c\x05\xbc\x94\x19\xa4\x21\x95\xc6\xbb\x23\x04\xd1\x2d\x58\xc0\x2c\x14\x58\x2f\x67\xa4\x49\x15\x13\x39\xb4\x52\xf9\x5a\x0f\x91\x20\xbb\xa6\x39\xe2\xd4\xd0\x9c\x70\xca\x7c\xda\x49\x8f\x88\x7c\xd0\x8a\x83\x60\x9d\xa2\xa9\xa1\xa1\x89\x14\x76\x3b\x80\xd4\x79\xc6\x5b\x67\x58\xc4\x15\x22\x32\x08\xd8\x28\x73\xe1\x98\x17\x24\x39\xad\x95\x5f\x93\xc8\x8d\x88\x4d\x4b\x0a\xd5\xf9\x42\xd0\x90\x5c\xe9\x41\xcc\xe7\x6a\x7a\xf3\xe0\xb4\x07\x37\x11\x98\x00\xdf\xe9\x01\xf9\xce\x14\xfc\xdd\x05\x36\x7a\xb9\xfb\xe4\x4c\xc6\x96\x29\x1b\xed\xb5\x25\x05\x28\xbc\x4e\x80\x61\x86\x46\x99\x9e\x15\x58\x0c\x4c\x51\xac\xcb\x90\x07\xd7\xd3\x51\x58\x3b\x4f\xb4\x8a\x60\x68\xc2\x6a\xae\x92\x4b\x4d\xa6\x87\xd2\x2e\x61\xa6\x96\x8f\xa1\x8a\x6e\xcd\x14\xee\xb9\x21\x96\x55\x15\x6b\x3a\xc5\x1a\x95\x98\x1a\xfa\x5b\xf6\xd8\xdd\x9c\x97\xec\xce\xdc\x99\x3f\xbd\x1b\xb5\x90\x0d\x22\x40\xd7\x6e\xcc\xdb\xbc\x31\x1f\x60\x04\x4e\x26\x3e\x40\x03\xd6\xf0\xb4\x40\xab\x19\x2e\x3b\xef\x47\x39\xa0\xc3\x86\x54\xec\x6c\x48\x81\x3b\x76\xc4\xfb\xbc\x20\xea\x71\x9a\x20\xfa\x49\xb6\x92\x39\x18\xc9\x48\x2c\x77\xd5\xcc\xbd\x24\x98\x5e\x53\x4a\x03\xeb\x66\xf9\xd4\xaa\x46\xf6\xf6\xca\x97\x8d\xe9\x8e\x6d\x97\x06\xb0\x49\x75\x97\x0a\x20\x56\x54\xcb\xc3\x67\xe6\x48\xee\x3c\x98\xcc\xaf\x77\x85\x16\xfd\x4b\x43\x91\x54\xe7\x7e\x32\x54\xbe\xb9\x29\xb7\xaf\x28\x2a\x53\x57\xeb\x50\xfb\xa8\x4c\x31\x17\xa3\x25\xc3\x64\x63\x32\x96\x4b\x21\xf6\x27\x31\xc7\x3f\xb8\xc0\x6e\xec\x85\x06\xed\x13\x20\xae\xcf\x1c\x30\xfc\x46\x07\x6c\x64\xcc\xd9\xf8\xd5\x5d\x60\x7d\xa5\x28\x5b\x84\x05\x24\xac\xb4\xd3\x04\x49\xe0\x9a\x82\x26\x88\xbe\x34\x80\xa8\x4c\xbb\x93\x22\x98\x96\xb2\x7f\xa3\x8c\x6a\xb5\x58\x28\x58\x73\x43\x37\x23\xd9\xcb\x09\x7e\x1e\xca\xc3\x6b\xaf\x8a\xbd\x83\xe0\x67\xc8\xec\x41\x25\x48\x58\xbf\x45\x5e\xa5\x59\x1a\x8f\x95\x63\x49\x94\x45\x0c\xe2\xaa\x8c\x0b\xd6\x82\xd9\xd9\x2f\x58\x14\x65\x19\x93\x19\x3a\x41\x7f\xb3\x82\x74\x72\x28\x5b\x76\xa8\x92\x9d\x74\x1e\xa0\xa2\x34\x97\xb4\x95\x15\xeb\x15\x88\xee\x50\x1d\x65\x34\x57\x27\x9f\xea\x5a\x45\x9d\x48\x0e\x2c\xf8\x06\x30\x7e\x86\x49\x61\xfa\xff\xd9\x7b\xb3\x66\x37\x96\x1c\x4d\xf0\xaf\x5c\xcb\xa7\x69\x33\x77\x58\x00\xf0\xf5\xa1\x1e\x58\xea\xae\x89\xb6\xa1\xa6\xcb\x3a\x6b\xa2\xcc\xce\x1b\xeb\xa4\x3a\x29\xeb\xd0\x3d\xb7\xa5\x9b\xac\xca\xfa\xf5\x63\x80\x47\x04\x63\x21\x79\xb8\xc4\xd1\x92\xa9\x07\x85\x0e\x63\xf1\x15\x0e\x07\xe0\xc0\x07\x88\xbe\x19\x4d\x2c\xf6\xc7\x9e\xd1\x6f\x33\x20\x0b\xaf\xe7\xb1\x85\x58\x3e\x8f\xb4\xc5\x60\x30\xb5\x36\xaa\xaa\x1b\xdc\x58\xcc\xea\x5e\x88\x6a\x3b\xf1\x4d\x5c\xc8\x67\xe4\xdb\x58\x9c\x8d\xc3\xd8\x50\x2c\x42\x50\xa4\x2d\x55\x52\xb2\x68\x70\x52\xf0\xd8\xcf\xab\xeb\xc9\x3a\xd6\x98\x9f\xa4\x32\x27\x95\xf9\xda\x1c\xc2\x60\x1f\x5b\x9b\xd3\xa9\xea\xfc\x04\x2b\x21\x1f\x19\x83\x0c\x01\x6d\x12\x79\x77\x64\x80\xac\xb2\x3a\x76\xb4\xa2\x5e\xca\xc8\xcb\xc8\xf8\x68\xf4\xd2\x0f\x3f\xa9\x7f\xea\xe0\x80\xc7\xe5\x3c\x43\xb4\x61\xda\x79\x91\x1d\x7d\x81\x4c\xc5\x22\x54\x40\x8c\x2d\x41\x20\x43\x5b\x14\xd1\x6d\xa7\x8e\x7a\x7a\xe9\x95\x16\xaf\xe6\x8a\x2c\xda\x14\x9b\xa8\x22\xb5\x54\x88\x7d\xad\x2a\xa4\x27\xb5\xf2\x23\x10\x43\x4a\x5b\x52\xe3\x4c\x02\xcc\x2d\x56\xc0\xc2\x87\xa5\xbd\xfa\x70\xfe\xb5\x1d\xbe\xb6\x19\x12\xda\xa8\x58\x64\x51\x1d\x17\x59\x3e\xaf\x82\x49\xf3\x8e\x1a\x07\x94\x01\xa9\x1d\x46\x62\x04\x84\xdf\x0d\xd3\xd3\x7b\x45\x87\x45\x07\xde\xed\x58\xa4\x6f\x2e\x22\x38\x2a\xa2\x99\xf3\xa2\x9d\x87\xcd\xf8\x49\x11\x0e\xfb\x8f\x54\x7a\x65\x88\xb4\x99\x7f\x8d\xea\x54\xe3\x8a\xf5\x63\xf9\xb5\xac\xc8\xeb\x3c\xbb\x5f\x71\x5e\x62\x48\x22\x5a\x8b\x94\x8a\xb2\x5b\x07\xf5\xc4\x28\x31\x08\x79\x50\x33\x14\xa1\x56\xa7\x4f\x74\x9a\x9d\x7a\x29\xfb\xbe\xb1\x42\xf7\x08\x09\x5b\x86\x6c\x59\x68\x83\x32\x90\x7a\x52\x2a\x82\xd7\xa4\xac\x82\xcc\x55\xb5\x6a\x44\x45\x08\x4e\xdd\x87\x44\x99\xec\x06\x93\x84\x01\xee\x48\x23\x46\x46\xd0\xa6\x90\x82\xb2\x88\x0d\x89\x00\x4d\x47\x4f\x83\xe3\x47\x6b\xf8\xf2\x3a\x60\xa1\x69\x72\xea\xde\xcc\xc5\x75\x7b\xd2\x59\x5b\x3a\x2b\xda\x9d\x70\xe2\xf8\xf4\xc9\x06\x48\xde\xd2\xe5\x36\x0f\x4f\x8e\x04\xc0\xa7\x1d\x9e\xfe\x3c\x5f\xf5\x37\xba\xb7\x60\x27\x48\x33\xf8\xd0\x01\x8d\x46\x88\xbd\x87\x4b\x3e\x21\x1a\xdd\x58\x01\x75\x15\x10\x38\xea\x24\x75\xe1\x05\x5d\x05\xfe\x84\xcb\xe0\x9d\x0e\x3a\x54\x60\x51\xd7\xef\x81\xeb\x2a\x60\xc8\xf9\xba\x1e\xdc\x13\xa9\x20\x7a\x26\xab\x43\x43\xde\x61\x56\x20\xbd\xdc\x03\xe9\xe9\x0e\xa3\x76\x38\x56\x5f\x38\x3b\x73\xec\xca\x5e\xf6\xf2\xd0\x5a\x36\xa8\x7b\x71\x14\xed\xaf\x5c\xbb\x3d\x39\xca\xd6\x15\xe9\x9d\x86\x27\xca\x7e\x94\x64\xc5\x29\x10\x64\xf9\x33\x50\x83\xbe\xc6\x08\xd4\xe8\xaf\x77\x48\x40\xea\xa9\x4c\x68\xb2\x7c\x94\x4b\x11\x8a\xab\xa8\x76\xda\x38\x68\x9b\x10\xd9\x46\x60\xb7\x8d\x10\x0b\xdc\xf0\xb4\x79\x7a\xfc\xd4\x22\x78\x48\x1b\xd4\x00\xb1\x72\x2d\x8b\x3c\xaa\x7a\x5b\xd5\x1e\x26\xf6\xa7\xca\x50\xad\x47\x12\x05\xbf\x53\xaf\xfd\x46\x1f\x82\x09\xa2\x2f\x07\x5d\xdf\x19\x5c\x1e\xb9\x65\x6b\x7f\x90\x5a\x84\xa4\x5c\x3e\x6f\x84\xe9\xeb\xc1\xe7\x50\x27\x26\xc3\xac\x1e\xdb\x8b\x47\x49\xc4\x08\x56\xb0\xba\xae\xa4\x89\xcd\x0c\xbd\x72\xa2\x56\xf6\x09\xb5\xb8\x6e\xa4\x69\x05\x66\x74\x30\x39\x24\xf5\x81\xa6\x3d\xce\x22\x2e\x1f\x0f\xfc\x0c\x43\x1c\x81\x47\x4d\xbf\xb2\xc3\x12\xe2\x35\x1c\xbb\x8a\x2c\x6f\xc1\xe3\x86\x65\xea\xf4\xd2\x4d\x13\x43\x14\xcd\x02\x83\x76\x39\x0c\x5d\xb6\xa4\xd6\x02\x95\xb5\xcc\x68\x90\x55\xc8\xc9\x35\x31\xf0\xd8\x69\x86\xbc\x06\xe4\x8d\x2c\x4b\x80\x22\x92\xe1\x46\xca\xd4\xdc\x0c\xdc\xab\x24\x54\xd2\x36\xec\x16\x6d\x91\x4f\x50\xdd\x11\x47\xa0\x8d\xba\x3d\x88\x26\xa8\x8e\xa8\xb1\xbb\x0c\xd2\x91\xdf\x79\xd9\x80\xfc\x70\x78\x2b\x12\x21\x5b\xbd\xc3\xe5\x52\x6e\xb3\xc1\xcd\xfc\x7b\x2c\xe5\xee\x66\xf5\x59\x14\xb5\x8a\xa0\xca\x4f\xef\x15\x14\xb5\x8a\xcf\x58\x44\x12\xd6\x83\x55\xd9\xe3\xbd\xc8\x0c\x6e\x5f\xb5\x16\xf5\x4c\xe4\x1d\xba\x92\x84\xa8\x44\x92\xf8\xa0\xdf\x99\xee\xfb\x55\xc2\x14\x57\xe2\x06\x94\x6a\xac\x20\xa6\xef\x78\x65\x4a\xe7\xaa\xa1\x73\x06\xa3\xae\xcc\x06\xfd\x9e\x1a\xf9\x6b\xb7\x7c\x27\x02\x2a\xdc\xb7\x7f\x9b\x25\xfa\x5e\xe4\x29\x2c\x2c\x4e\x44\x12\x19\xa5\xec\x07\xe5\xa7\xfb\xbd\x19\x3f\xe9\xac\x5f\xfd\x57\x4f\xea\x39\x17\x15\xed\x15\xbc\xd0\x9b\x4f\xc3\xf7\x5e\x64\x19\x9f\x36\xe3\x27\xe5\xbc\xbd\x7c\xf2\xf4\x49\x21\xc8\xab\xcd\xfc\x53\x51\xab\x8a\x20\x3d\xfb\x52\x77\xd7\xfe\x63\x04\x14\x6e\x2c\xa2\xfa\x89\xa6\xdb\x93\x4d\xd7\xfd\x5f\xa6\x3e\x3c\x14\x64\x7b\x0c\x72\x22\x59\x8f\xb4\x64\x4e\xea\x9a\xca\xa4\xa7\x77\x1e\x7a\x23\x09\xa4\x2c\x9d\x89\xe0\x5c\xb9\x74\xb7\xb3\xd7\xd8\x94\x24\xe2\x7f\xb9\x76\x34\x52\x41\xcc\x26\x43\x7c\xb6\xe0\xc0\x47\x85\xbb\x17\x55\xa3\xc0\xd4\xa6\x5a\xad\x81\xcf\x65\xf1\xa3\xa2\xf9\xc6\x8e\x16\x28\xed\x30\x15\x90\xdd\x31\xff\x4b\x49\xf4\x12\x69\x42\x7f\xe9\x9b\x80\xb6\x6b\xea\xa4\xb9\xb6\xcc\xc0\x11\x19\x56\x58\x09\x78\x3d\xb9\x45\x33\x4d\x51\x26\x0b\x96\xf5\x10\x5e\x13\x78\xe4\xde\x71\x41\x17\x72\xd6\x0c\x2b\x1b\xf5\x6b\xf7\x47\x54\x5e\xc5\xb1\xe6\x9d\x17\x8a\xf2\xc7\xc0\xc5\xce\x67\x42\x53\xa8\x90\xfe\xeb\x0b\x22\x3d\xe0\x3b\x5d\xb5\xfa\x9a\x2c\xf9\x9e\xba\xac\xa4\xa5\x54\x39\xc6\x5e\x5a\xe7\x4c\x8a\xa4\xdd\xea\xed\x10\x6a\x8c\xaa\xe2\x8e\xf4\x5a\x32\x6b\x05\xec\x53\x30\xe8\x67\xb6\x50\x62\xc8\xd4\x20\xd6\x14\x4e\x3e\x49\xbb\x60\x86\xf9\x20\x53\x35\xa2\xe3\xe3\x2e\x99\x41\xe3\x24\x0b\xd4\xc8\x3e\x78\xba\x00\xf4\x4f\xef\x65\x65\x86\xae\x20\x35\xad\x54\xc0\xc1\x3a\xe1\x75\x40\xd1\x02\xe5\x26\x0d\x86\x3a\x94\xa2\x1b\x42\x70\xae\x05\x16\x2e\xd8\xb7\xa0\x2c\xf1\xa5\xdf\x58\x07\x8f\xb5\x86\x0b\x04\x0b\x5f\x4e\xb2\x04\x29\x19\x61\x1b\xbb\x72\xba\x30\x18\x00\x65\x4f\x25\x53\x6d\x8b\x33\x0f\x17\x8f\x84\x6c\x12\xe8\x9b\xa2\x99\xf4\xe4\x5b\xdc\xb1\x0c\x69\x72\x9b\xa3\xa1\x52\x79\xd7\x16\x59\x16\x25\x93\x29\x35\x0a\x4b\x70\x9b\x59\x55\xe6\xd8\x9a\xa7\xf7\x48\xfa\x41\xa5\x47\xf7\x25\x46\x2e\xc9\x06\x17\xa3\x8d\x10\x48\x74\xf8\x10\x4c\x82\xd8\x06\x4d\x03\xa5\x61\x76\xe4\x5b\x1b\xac\x6a\xbc\x49\xd5\x67\x5d\xa5\xd7\x67\x08\xbd\xbc\x0b\xab\xd7\xcb\x23\x43\x60\x74\x98\x4b\x08\x8d\x96\xa5\xe7\xac\x2b\x25\x0e\x93\xc1\x23\x1d\xbc\xd6\x7a\xf5\xbc\xc8\xe7\xe6\x92\x34\x95\x86\x87\xd8\x26\x61\x05\x7a\x11\x76\xa7\x3c\xef\xe4\xac\x94\x82\x97\xd1\x89\x2f\xbf\x5f\xc8\x1e\x91\x0c\x57\x75\x68\x34\xb2\x87\xa8\x25\x4b\x33\x6f\xfb\xb4\xc4\x56\xa0\xb9\x7f\x36\xfa\xd6\x92\xb9\x19\x5c\xfb\x42\xfa\x11\xaf\xb2\x61\xc9\xd6\xa3\xae\x08\x2a\x04\x62\x91\x70\xfb\x71\x12\x8e\xbf\x45\x07\x9d\x3d\x34\xb4\x85\x41\xba\x92\x8b\x6c\xf2\xb6\xca\x11\xac\x09\x54\x66\xd0\xe0\x6a\xea\x53\xdb\x9d\x15\x29\x7c\x5b\x2a\x4f\x80\xb4\x28\xe3\xd8\x2e\x91\x3b\xbb\xac\x8a\x55\x6a\xad\x68\x25\x6a\x32\x50\xaf\x18\xf5\xdd\x94\xe5\x20\xf2\x54\x4b\x25\x5a\x23\xd1\x93\x48\x88\x24\x4b\xc7\x07\xdd\xf7\x65\xf3\x88\xce\x90\xda\x1c\x43\x89\x4b\x35\x0b\x1c\xff\xd7\x70\xc1\xcf\x0f\xa2\x09\x20\xa5\x17\x5f\x9c\x1d\x42\x54\xad\xef\x38\x7c\x6a\xf2\x21\xd6\x9c\x0d\xf7\x4c\xba\x8a\xa1\x6c\x79\x33\x17\x18\x4a\xd5\x65\x8c\x58\xa3\x8c\x35\xa6\xb5\xc3\xed\x57\xd3\xae\x06\xbe\xdb\x5c\x2c\x72\x45\x7d\x60\x61\x10\xe0\xcb\xd9\x24\x05\x19\xaa\x00\x2a\x77\xca\xcc\x24\x3f\x7a\xf1\xda\x54\x07\x73\xd8\xf4\x1e\xd3\x70\x8d\x13\x11\x75\x10\x41\x3d\x5f\x2f\xa2\x4c\x95\x8f\xca\x5c\xf9\x5d\xb3\x53\x97\x3f\x4d\xb2\x39\x7a\xa9\xb8\x79\x62\x36\x55\x93\x20\x7b\x51\xee\x1c\x9a\x72\x1d\xdc\x3c\xa2\x1e\x7f\xab\x9b\x2a\x95\x4b\x3f\x6f\x95\x17\xf1\x46\xe8\x3e\x75\xd7\x6e\x03\x93\x27\xc8\xc0\x41\x76\x39\x11\x18\xa7\xed\x3a\x36\x79\x69\x8f\xfe\xeb\xaf\xcf\xab\x6c\x55\x54\x62\x00\x8f\x3a\x4b\x31\xa8\xa9\xda\xc0\x0a\x0f\xa3\xd7\xb2\x71\xb2\x4a\xde\x1a\xc0\xdd\x47\x3b\xa1\x51\x7f\x9b\xb8\xf7\xe3\xa3\x11\xed\xf7\xde\xe6\x43\x9e\xe1\xd3\x53\x02\xda\x48\xa9\xbd\x0c\x36\x6a\xc0\x9a\xb9\xb4\xd5\x82\x2c\x4c\x45\xa3\x00\xaa\xbe\x36\xca\x86\x9a\x08\x49\x95\x95\xac\x39\xbf\x86\x40\x74\x2e\x7d\xdb\xa1\x57\x33\xa2\x5e\xbb\x9d\x46\xf8\x81\x48\xc7\x23\xb8\x2b\x48\x6e\x0f\x13\x08\x2c\xcd\xb5\xa1\x81\xf0\x5c\x52\xcd\x15\x0f\x10\x8d\x53\xe8\x8b\x1e\x0d\x1b\xb2\x45\xde\xa0\xda\x4d\x71\x64\x3d\x25\x95\xcd\x73\x5d\xec\xba\x73\x30\xaf\x86\xa6\x1e\xd4\xd2\xcb\x05\x71\x0c\x58\xa1\x8f\x9f\xc6\x93\x9e\xeb\xa6\xe1\x54\x97\xee\x4f\x5d\x7d\x61\xba\xa2\xc1\x6a\x09\x1f\x36\xd3\x86\xd7\xc8\xc8\xcd\xa3\x4e\xa1\x7b\xab\x5e\xb9\x01\x91\x0d\xdd\xbc\x17\x57\x00\xb2\xdd\xde\x2d\x3f\xea\xd6\x28\x90\x67\xe5\x6e\x85\x23\xd0\x5c\xf5\x55\xba\x15\xc7\xdd\x0a\x6f\xd5\xad\x74\xec\x56\xb8\xaa\x5b\x8b\xb5\x56\xb0\x7a\xd7\xd0\xe2\x84\x51\xd4\xc7\xc8\x73\xb4\xb2\x6f\xa7\x91\x3b\x87\x33\xa1\x46\x7f\x7c\x41\x76\xfa\x43\x1c\xbd\xa0\x45\x3c\xbd\x77\x26\x1d\x62\x8d\xbe\xb9\x39\x2f\xf1\x65\x6f\x37\x8c\x35\xe1\xbc\x7d\xe3\xe6\xd8\x89\x9b\xda\xb2\x7d\x5a\xc6\xd3\x7b\x42\x6d\x20\xd3\x3a\x0d\xe4\x61\xfc\xb8\x5a\x8c\xdf\xb8\xc1\xda\xc0\xd7\x06\x90\x2b\x19\x40\xc2\x32\x82\x74\x73\xb6\xfb\x4b\x3c\x81\xa4\x85\x8b\x21\x5c\x34\xf1\xb5\x31\x94\x26\x12\x96\x36\xaa\xeb\xe0\x82\x30\x8f\xc0\xd2\xe7\x54\x09\x8d\x46\x26\xbf\x43\x34\xc7\x53\x76\xfd\x1b\x2b\xb5\x63\x54\xc7\x2c\x3f\x22\xa4\x17\x3b\x2c\x87\xee\xda\xcb\x4e\x2a\xed\xc4\x64\x44\xa8\x1f\x36\x31\x51\x16\xa3\x99\x87\x72\xa0\xd1\xb8\xb1\x3d\x6d\x30\xa9\x12\xa0\xd7\xae\x20\x56\x79\xc7\xed\x30\x89\x8a\x59\xae\x83\xe2\x40\x1d\x22\x9e\x87\x98\xbb\x6b\x35\xb8\x60\x78\xb7\x49\x10\x9c\xd1\x4b\xa9\x27\x77\xd9\xf0\xb2\x39\x42\x24\xa9\xf2\xb5\x78\x53\x04\x57\xd4\x64\x39\xcb\xb2\x35\xca\x7b\xb3\x68\x90\x68\x25\x43\x5b\xa7\xdd\xb0\x22\xaf\x3b\x88\xb8\xa7\x45\x20\x8b\xf6\xde\xba\xe9\x40\x89\x42\x1d\xd5\xa6\xaf\x02\x25\x1f\x4d\xa7\x9a\xe7\x50\x0d\xb3\xf3\xb9\xb0\x32\x17\x9b\xd1\xb4\x99\x6e\x2a\xd7\x4b\x86\x19\xf4\xd0\xd5\xe3\x0e\xd2\x80\x9e\xa4\xa9\x75\xab\xd6\x72\x41\xd5\x09\x86\x01\xf9\xe0\xc1\xbb\x1a\x73\x43\xd8\xb9\x28\x90\x1e\xa5\x42\xca\xa2\x04\xe4\xcd\xb1\x00\x33\x2a\x77\xa5\x9c\x7a\xa4\xde\x58\x94\x01\xbd\x62\x63\x0c\xed\xed\x8e\x40\x40\x25\xeb\x14\x46\xdd\xd0\x8e\x84\x95\x72\xc4\x11\x89\x00\x2b\x95\xbb\x13\x35\xd3\xe4\xde\x8d\xd5\xba\x4b\x13\x14\x81\x4b\x00\x51\x96\x41\x8f\xaa\x30\xf2\xb8\x93\x25\x0d\x32\xa0\x62\x3f\xca\x7c\x8c\xdb\xa2\x33\xa9\x97\x1b\xda\x73\xce\x81\xaf\xb7\x3e\x46\x50\x5e\x79\x92\x08\xe6\x54\xa4\x97\x53\x84\x74\xa6\x3d\xb3\x84\xb9\x53\x42\x1e\xf2\x16\x7f\x3d\x32\xb9\xd4\x1e\xba\xa6\x3d\xeb\x90\xcd\xa5\x66\xf0\x15\xcd\x50\xad\x4b\x73\xfe\x79\x73\x91\x4c\x5e\x23\xb2\x3b\xda\xe7\xae\x19\xa6\xa2\x19\xa5\xe7\xca\x14\x75\xba\xf3\xa9\x67\xff\x43\x72\x71\xee\x5c\xb7\x8f\x5c\xdc\xf1\x22\xa3\x75\xdf\xe7\x3b\x86\xd4\x5f\x33\xe5\xac\xf1\xe2\x51\xf5\xd4\xaf\xb3\x07\x9b\xe3\x1e\x4c\x54\xec\x71\x2e\xee\xe6\xfd\x06\xc7\x96\xcc\x44\x14\x09\x26\x43\x7a\x6b\x59\xe4\x8e\x71\x0e\xe7\xc7\x79\x94\x56\x78\x9e\xca\xfb\xe6\x6a\xe2\xc9\x34\xe1\x5f\x81\xc9\xdd\x91\x88\xf4\x51\x86\x76\x47\xd2\xcf\x6f\x27\xbd\x7a\x08\x22\xee\x40\xd0\xcd\x2e\x05\xcb\xea\xac\x67\x47\xbc\x11\x8f\xbc\x51\x0f\xc8\x8b\xb7\xfa\x56\xf6\x49\x3c\x04\x10\x2d\xca\x01\x7f\x0b\x09\xf1\x7d\xcf\xe8\x4f\xf0\xf4\x62\x93\xec\x79\xbe\x3c\xd1\x77\x36\xc7\xc7\xc3\x36\x71\x43\xb2\xd1\xaf\x43\xaf\xe7\xd3\xed\x5f\x25\x20\xac\x41\xbf\xe7\x9b\x70\x9d\x4c\x00\xde\x04\xd9\x0f\xa2\xd1\x4b\x37\xfd\x2c\xc4\xe8\x76\x5f\x9f\x33\x7e\x97\x74\x7e\x66\x0f\x95\xad\xc4\x8f\x36\x19\x13\x9e\x3e\x59\x67\xc2\xfa\x34\x7e\x7e\x92\x2f\x48\x5c\x57\x6f\x0b\xaf\x54\xe1\xce\x6c\x09\x13\xc5\x7f\x48\x32\xb5\x4e\x52\x09\xc6\xda\xdf\x67\xeb\xbb\xc7\xc4\x24\x6c\x4a\xb3\x02\x53\x2a\xc9\x70\x21\xcd\x11\xdb\xf5\xa2\x24\xe6\x21\xf8\xc6\xcf\x32\x30\xe8\xdd\xad\x1e\xf6\x61\xf1\x0d\x1a\x8e\x35\x86\xa0\xd7\x5b\x1b\x7c\x9d\xfe\xf1\x86\x23\x76\x9d\xc2\xf1\xed\x47\xf0\x82\xd7\xef\x55\xca\xca\x84\xae\x4f\xae\x97\x5b\xc7\x6d\xd7\x7e\xf8\xfc\xfb\xd9\x99\xeb\x9e\xbe\xed\xd4\x5d\x68\x02\xcd\x9a\xf0\xbd\x92\xff\x85\x2e\xf0\xfc\xa9\xfe\xea\x5d\x85\x14\x49\x54\x1d\x37\xca\x46\x81\x1b\xd4\x1c\xeb\xbd\xf3\x57\x71\x5e\x65\x83\x5c\x33\x43\x48\x8b\xc7\x5c\xf2\xd2\xe3\x96\xd4\xa5\x4b\xca\x5a\x16\x31\x54\xb3\xb0\x82\x76\x29\xf8\x7e\x28\x56\xd8\x55\x58\xe6\xd0\xcb\x0e\x19\x20\x71\x43\xf1\x08\xc9\x59\x75\xc7\xa9\xf2\x60\x2b\xda\x5c\x9e\xfa\x64\x8d\x08\x25\x19\x36\x11\x58\x95\xb1\x49\x3a\xf1\xae\xfc\x55\x89\xe1\xcc\x92\x52\x8c\x0c\x8d\x3d\xaa\xc0\x89\x42\xfe\xe5\x88\x78\x42\xa1\x20\xb5\x28\xde\x89\x93\xdd\xf9\x8f\x8c\x10\x8c\x7e\x6a\x18\xff\xf3\x2d\xdb\x27\x9b\x3e\x6a\xe4\x51\x80\x74\xa0\x0a\xc2\x1c\x91\xe5\xcb\xd0\x2c\x19\xec\x2d\x55\x80\x26\xb5\x1a\xc0\xa4\x63\xbb\x8d\x05\xb0\x2b\xbc\x8b\x06\x9d\x09\xe5\xa0\x5f\x01\xa7\x0c\xfa\x2f\x38\x60\x68\x54\x80\xef\x12\xa8\x93\x00\x9a\x52\xef\xf0\xc7\x1b\xf5\xf1\xe4\x82\x54\x5f\xc8\x2e\x58\x0b\x9f\x3b\x60\x91\x60\x8f\x90\x36\x22\xce\xa5\xe7\x0e\x2a\xc5\x14\x24\x0e\xf9\x3f\xc9\xff\x7b\x44\xf0\x03\xc6\x07\x17\x88\x1a\x05\x43\xa1\x01\x37\x05\x3b\xfc\x12\xb2\x15\xa4\xd6\x7a\x88\x36\x43\x7e\xee\x30\x4f\x42\x87\xfe\x93\x3a\x10\x18\xff\x4e\xe8\x57\xcb\xa7\x58\x2c\x39\xda\xc4\xdb\xc7\xe4\x3b\xde\xa3\x67\x0d\xf8\xb6\x4b\xfb\xce\x4d\x1a\x6f\xd9\xa4\xa7\x47\x51\x2f\xeb\x40\x4b\x61\x82\x4a\x03\x64\x7c\xde\x90\x6c\x66\xd4\x63\x86\xa8\x47\x3b\x79\x40\xd7\x50\xda\x93\xec\x82\xc4\xbb\xd9\x3b\x16\xb2\x2a\xc6\xd7\xfb\x06\x5e\xe9\x0c\xdb\x28\x5c\xdd\x2e\x29\x54\x51\xef\xf6\x93\x0a\xee\xe4\xec\xa6\x91\x9b\x0d\xfa\x3a\x36\x53\x34\x8f\x92\xbe\x6c\xee\xa5\xf7\xf4\x1e\x3b\x30\xbc\x5d\x00\x32\x01\x86\xf4\x1e\x56\xb5\xbb\xd9\x4d\x13\xba\xd2\x91\x9e\xde\x67\xc3\xd4\x88\x06\x26\x55\xad\xe4\xac\xf9\xf6\xdd\x55\xb9\x86\xb8\xa1\xa4\x4e\xcc\x32\xa5\x32\x8f\x05\xdc\xa8\x38\xe8\x1b\x8d\x23\x21\x67\xb4\xa3\xcd\x8d\xc3\xb3\x14\x11\x4a\x16\xdf\x35\xe8\x93\x4e\xd2\xa0\x7a\x0f\x51\xef\x5a\x65\xa5\xf5\xab\x12\xe0\x62\x2a\x86\x51\xa7\x13\xa3\xbe\xc0\x90\xf1\x35\x55\x8d\xfa\x52\x6f\xa6\xe3\x45\xc1\xb8\xf9\xb8\xea\x10\x1e\x84\x37\x2d\xd2\xd9\x49\x01\x93\x86\x48\x01\x54\x00\x93\x65\xfa\x6b\xd7\xe0\x89\xb0\x9d\x7b\xe9\xf0\x3b\xef\x35\xba\x11\x21\xd3\x05\x42\x5e\x90\xa3\x26\x99\x5e\x83\x1a\xa3\x6c\xa4\x11\xf8\x99\x74\xbb\x76\x05\xaf\x4c\xff\x77\x90\x9f\x2b\x4b\x10\x15\xb4\xac\xbb\x23\xff\x3f\x5b\x7d\x59\xfe\x34\xdd\x23\xf9\xe0\x1d\x72\x91\x57\xd0\x8b\x9c\x10\xa1\x38\xcb\xe9\x5f\xff\xf9\x8b\x54\x95\x4c\x86\xf0\x4e\x6f\xe6\x82\x35\x37\xfc\xa1\x8f\x9e\x15\xba\xcb\x90\x6e\xee\x8a\x62\x27\xff\xbe\xd8\xf2\x43\x5a\x26\x37\xd2\xb3\xd5\xf7\x2c\xa9\x7c\xc0\xb6\x3c\x4a\xef\x4a\x9e\x3a\xb5\x21\xf1\xa4\xdc\x5b\xc5\x84\x8b\xee\x2d\xa0\xc6\x30\x05\x28\xcc\x16\x21\x5a\xa7\x38\x77\xc1\xca\x38\xa9\x14\xcb\xa6\x52\x99\xa7\x52\xc8\xb9\xaa\x87\x94\x4b\x9d\x20\xe4\x15\xa0\x8d\x00\x9f\xab\x0e\x34\x10\x3b\x98\xb4\x02\xd2\x86\x0a\xe3\x27\xbf\x59\xe5\x29\x6f\xbc\xca\x5b\xa1\x21\xbf\xa7\x83\x4d\xdb\xa1\x11\x6b\x74\xac\x87\x73\x62\x70\x26\xaa\x50\xa7\x08\x6f\xa6\x74\x2f\x99\x92\x32\x8d\x9f\xb1\x13\xf4\x7a\x74\x42\x99\x14\x2e\xd0\x76\x22\x11\xe6\x01\x1e\x8e\xf4\x63\xdf\x75\x7b\x18\x89\xd2\xb5\x82\x02\x77\x04\x6e\x53\x65\x53\xe5\x69\x5d\x1a\x05\xed\x56\x71\xdb\x86\xdf\xfa\x85\x48\xdb\xf8\x4c\x6a\xc0\x73\x52\x89\x5e\x9d\x22\xf1\x91\xfc\xb6\xdd\x6f\xf9\xbf\x27\x10\xd6\x51\xe7\x42\xa6\xef\x8a\xcd\x4f\x7e\x28\xde\xab\xe9\x7b\xbc\xc6\x20\xba\x51\xc6\x53\x70\x47\x31\xb6\x83\xcd\x93\x19\xb7\x32\xe3\xa7\xa8\xa3\x60\x13\xa2\xf5\x45\xc2\xb5\x51\x96\xff\x56\x16\xcf\x21\xc9\x7c\x47\xa0\xe7\x02\x45\xa9\xe8\x04\x42\x73\x42\x11\x56\x33\x35\x76\xf4\x4e\x0a\xdb\x5b\x28\xbf\x6b\xc4\x1a\xdd\xf2\x03\x64\x96\xfa\xaa\xe2\xf3\x6c\x9a\xca\x94\x0e\x13\xed\xf4\x1a\x9e\xfb\x0e\xea\x04\x2b\x5c\x62\xb7\x04\x0a\x5c\xe5\x11\x53\x10\x9f\x95\x6a\x14\x1f\x57\x45\x7e\xd2\xb5\x24\x93\x5a\xa8\x49\xef\x98\xfe\x6e\x71\xa2\xce\xa6\x00\x19\x2a\xb5\x3d\x97\x91\xf6\xfd\x19\x6e\xa9\xad\x70\x05\xb4\x4e\x79\x43\xd0\x46\x78\x19\x69\x34\x1d\xc3\x30\x05\xb6\x33\x00\xbe\x53\x46\x55\xd0\x42\xa3\xf6\xd2\x0c\xfd\x5d\x63\x0c\xc3\xa0\x55\xa9\xd9\x39\xb6\x9d\xd6\xa3\x89\x42\x7b\xce\xca\xe0\x6d\xd4\xff\xdd\xb3\xe5\x8e\x1c\x34\x94\xce\x2a\x34\x27\xb8\x0e\xc6\x21\x1e\x62\xa7\x7f\x66\x45\x16\xc5\xe3\xbf\xe7\x6a\x50\x54\xaa\x3d\x92\x2e\x65\x75\x4c\xd7\xa5\x97\xf4\xff\xd9\x6b\x8d\x94\xf8\x9f\xbf\xbc\x27\x07\x05\xdf\x8f\x0e\x36\x14\x3e\xac\x4b\x88\x95\xb3\x8a\xc6\xaa\x13\xf1\x4c\x1d\x8e\xa3\xd3\x75\xa9\x88\x4a\xe0\x1a\xae\xde\x54\xff\xc6\xe2\xf2\xee\xc0\xc7\x67\x59\x22\x46\x69\x50\x6d\xff\xbb\x00\x4e\xc3\x12\x7a\x87\x69\xa8\xb2\x25\x0d\x22\x2e\x97\x3e\xdc\xd2\x45\x2b\xef\xf9\x54\x2e\xfd\xb1\x84\x17\x7a\x61\xec\x31\x62\x06\x3f\x7e\x16\x59\x2c\x74\x60\xb8\x6f\x67\xc8\xd3\xa0\x7f\x14\x49\xc2\x6b\xeb\xba\x5e\x68\x70\xa4\x55\x08\x5a\x3d\xc6\xd8\x25\x08\xd1\xa4\x21\x14\xc3\x86\x0e\x8c\x58\x5e\x20\x07\x94\x0e\x71\x4f\x0d\x66\xf0\xb8\x8b\xa6\x3f\x2c\x71\x10\x64\xc2\x45\xf4\xa8\xb2\x49\x7d\xc8\x00\x9a\xbe\xde\x37\x32\xf1\x0d\xb9\xff\xb8\x78\x8c\xd0\x26\x81\x97\x06\xf8\x63\x9a\x4d\x91\x11\x32\x3e\x6b\x04\x6a\x65\x95\x59\x43\x86\x2a\x9c\x18\x0a\xf6\x7a\x28\xb9\x91\x75\x10\x87\xc8\x4f\x2a\xee\xf2\xb8\x0b\x90\xd5\xa2\xe2\x8e\xbd\x76\x1a\x91\x7b\x08\x40\x3a\x2c\x09\xae\x97\x28\xaf\xe9\xa9\x5b\xd8\x63\x85\x65\x64\x88\xbc\xc9\x10\x54\xa2\x19\x82\x46\x4a\x44\x70\x94\x79\x52\xa8\xee\x08\xcc\x33\x9c\x9b\x2e\xc0\x1f\xc1\x3b\x3d\xcb\x3c\xfd\x5c\xbd\x27\x74\xb9\xb2\x16\x66\x81\xd2\x46\x63\x75\x73\x4f\xd0\xea\x3b\xd7\xb5\xe4\xe9\x93\x66\x32\xcd\x90\x44\xb2\x84\xc8\x0d\x31\x78\xbf\x4b\x50\x89\x0c\x5c\x1d\xb3\xef\xb1\xa6\x82\x21\x53\xc2\x2c\xbb\x7b\x6a\xde\x59\x75\xd0\xfc\x6c\xd0\xa8\x52\xfb\xac\x03\xd1\xf0\xc0\x29\x23\xe9\x63\x36\x45\x13\xb2\x05\x04\x01\x9c\x2b\x97\x8e\x72\x0d\x90\x33\x53\x78\xfb\xde\x2d\xc4\x89\x0e\xef\x8e\x8a\x3c\x82\x4b\x16\x28\x6e\x1c\xb8\x68\x5c\x39\x2d\xc5\x62\x4c\x46\xa7\x2e\xbc\x0a\x2b\xd9\xcf\x96\xc6\x7d\xf5\x6d\x5a\xb5\xef\xe1\x92\xb1\x2d\x02\xa6\xce\x02\x46\x05\xf6\x6a\x6e\xb9\x56\x2b\x1c\x64\xac\xd9\x9d\x7a\x26\x72\xa8\x5a\xbe\x39\xc3\xd2\x34\xde\x95\xff\x86\x76\xaa\x1f\x8b\x3d\x5f\x7f\x44\xf6\xc3\x31\xe7\x6b\xfc\xfc\xfe\x16\x58\xf3\x35\xfe\x82\xbd\x72\x9b\xd4\x41\x8d\x77\x33\x1e\x20\x8a\x82\x2a\x6e\x53\xee\x50\x6c\x84\xfd\x47\x4f\x9f\x64\x32\xb3\x9a\x67\x62\x97\xac\xa1\xe7\x4f\xe5\xf7\x66\xfc\x44\x9f\x95\x8f\x11\x78\xd5\x7e\xf9\xf9\xe9\xed\xcf\x0d\xe7\x7a\xff\xbb\x5e\xfa\xe6\x68\x90\xc6\x21\x15\x50\xe5\xc2\x47\x26\x64\x6d\x34\x9e\x11\x58\x59\x51\x2e\x97\xaa\xdb\x39\x20\x24\x73\x04\xf9\x54\xb8\x8b\x20\x7c\x29\x95\x4b\xb9\xcd\xaa\x9a\xc5\xa5\xd3\x66\xd7\x84\x35\x7b\x19\x67\xbd\x24\xc8\xa2\xd3\x64\x21\xf8\x92\xe5\xf6\x08\x70\xa1\x79\x80\x9d\xdb\xcc\xbb\xa5\x39\x4e\xa2\xec\xc2\x1d\x12\xfb\xe0\x7b\x03\x49\x5d\x4f\x27\x48\x20\xc7\x2a\xd6\x3d\x38\x48\x97\x0e\x0e\x80\xb9\x9c\x1d\x78\x08\xf1\xb6\x33\xfe\x57\xb0\xa0\x55\x55\x46\xf7\x7f\xac\xee\x51\x56\x23\x2c\xaf\xe0\xe8\x09\x28\xd5\x09\xbc\xc2\xdc\xc7\x56\x36\x2a\x08\x54\x56\x49\x1e\xb9\x61\x15\x07\xe1\x82\x26\x37\x1f\xf7\xbe\xee\xb5\x40\x08\x50\x11\x9f\x12\x04\x3e\xd9\x01\x05\x7a\x54\xbc\xf0\xd8\x5d\x7b\xc2\xa8\xf4\xd0\x7c\xd6\x3c\xdd\xa6\x9d\xef\xa1\x74\xaa\x1e\xf9\x04\x8d\x37\xdc\x16\xe6\x02\xde\x41\xa0\x83\xfa\x40\x33\x64\xa7\x09\x09\xaf\x77\x1c\xb8\x9c\x1b\xbb\xa4\xf1\x70\x80\xf9\xb9\xe0\x7b\x4e\xc5\x0a\xa1\xc1\x61\x69\x31\x20\xda\x00\x94\x57\x90\x14\x2e\x27\xbb\x26\x27\xb4\x80\xea\x6d\x17\xc0\xcb\xf6\xe6\xdd\x88\x3f\x4c\x5b\x50\xb8\x44\x82\xca\xef\x01\xf3\x66\xd6\x38\x43\xba\x28\xd3\x82\x03\x8d\x2a\xb9\x61\x91\x9d\x69\xb8\xef\x40\xf3\x22\xa4\xd8\xa1\xf2\x31\x38\xaf\xab\x48\xb6\xbd\x07\xc7\x25\x1c\xb7\x24\x15\xa0\x4f\x6f\x49\x3c\xec\x47\xe1\xcc\x7e\x74\xdc\x8e\xe6\x28\xa2\xfa\xb8\xdb\x8d\x18\x34\xf3\x2c\x19\xe2\x93\x7b\x51\x69\xc2\x6d\x73\x3d\x17\xce\xa7\x5e\xa1\x53\x4d\xef\x87\x63\x17\x17\x3a\x37\xb7\x46\xfc\xa0\x0c\xe4\x42\x0f\xe7\x26\x89\x6f\xca\x52\x2e\xb4\xf3\x94\x41\xe1\x6f\x6f\x31\xcd\x2d\x00\xca\x91\x54\x53\x20\x11\xcf\x35\xaf\x74\xef\x8a\xec\x84\xd8\xdc\x66\xae\xe8\x2b\xda\x56\xca\x2d\xb0\x2c\x20\x14\xd9\x5d\xf5\x7e\x1a\xc9\xee\xd1\xe4\xb9\xb4\xaf\xce\x0e\x67\x05\x96\xdb\x7b\x72\x51\x9f\xff\x16\xde\x6c\xb7\xf4\xea\x75\x0f\xf8\x6f\xc1\xea\xa6\x8a\xff\x9d\xac\xee\x75\xcf\xfa\x1f\x9b\xd1\xbd\xee\x54\xfe\x15\xd9\xdc\x59\x11\xe4\x0a\xcf\xf4\x35\x45\x92\xf3\xd5\x9d\xd0\x9a\x7f\x58\xae\x7a\xae\x8f\x73\x35\xf7\x01\xf1\x74\xe7\xa0\xf2\xc6\x8d\x70\x70\xc0\x93\x45\x33\x09\x9c\xb0\x1e\xd0\xd9\x00\x4c\x1b\x27\xdc\x4d\x2f\xdd\xeb\xeb\x4b\xb3\xe7\xfb\x7d\x3a\xee\xed\x1a\x3f\xb3\x7f\x7e\xf9\xed\x7f\xfc\x65\x81\x7a\x73\x8f\xef\x04\x45\xc3\x5c\xfb\x19\x4a\x43\x1e\x61\x30\x78\xa3\xe0\x10\xb9\xf6\x0d\x63\x4d\xb1\x21\xdc\x53\xc3\x38\x7a\x45\x0b\x59\x37\x36\x82\x67\x3e\x8b\x94\xc1\xe7\x2d\x2a\x2c\x19\x26\x48\x67\x32\x8f\xa1\xf0\x05\x6c\x70\xee\x63\xb8\x84\xa5\xfc\xa7\x8f\xed\x4a\x88\x94\xcc\xc6\xd5\x93\x9c\xc1\xc6\x37\x01\x82\x02\x9b\x65\x83\x7d\xf8\xa8\xd0\xa9\x82\xe8\xc6\x2d\x3a\x83\xb2\xa4\x0e\x58\x01\xb5\x64\x20\x86\x06\x27\xb0\xbb\x94\x2d\x44\xdc\x2a\xf1\xe7\x26\xd4\x4c\x07\x08\xb8\x95\x65\xa7\xb6\x55\xca\xe3\x0a\x2b\x83\xb9\xad\x4a\x96\xce\x2d\x91\x61\x56\x5b\xed\x96\x35\xec\x49\x76\xe7\xa4\xe8\x9c\x03\x9e\x92\x94\x1b\x9b\x71\x96\x61\xe9\xc5\x5a\x3e\x4b\xd7\x37\x60\xec\xf2\x6f\xf1\x91\x51\xbc\xd4\xf6\x0e\xb9\xcf\x25\xe3\xf6\x96\x71\x03\x5e\x77\xc7\xbe\x1e\x07\x9e\x9a\xa0\x19\x59\x8b\x11\x8f\x7b\x76\x00\x9c\x21\xfb\x56\xf6\x72\x3a\x60\xd5\x46\x20\x3d\x71\x41\xe9\x1d\xc6\x16\xc9\x2a\x18\x1f\xab\xb5\xcd\x8f\x3b\x47\xa1\x91\x72\xa7\x75\x75\x8d\xb8\x1b\x25\xee\x9f\x3f\xfe\xba\x12\xc5\xa2\xd0\xd5\x32\xdf\xf7\x16\x33\x68\x32\xe6\x71\x9e\xed\xa3\x23\x2e\x6b\x50\x35\x3a\x48\x79\x94\xa2\xa5\x2f\x6e\x4d\x67\xbf\xa4\xe2\x8b\x07\xaf\xd0\x89\x5d\xfd\x36\x02\x99\x08\x13\xd0\x69\xf2\x1a\x80\x3d\x44\x68\x17\x88\xc4\x4a\x13\x19\x97\x78\xba\x38\xc2\x46\x49\x5d\xfa\x0c\x1e\x43\x9c\xd9\x92\x9b\x86\xa4\x78\x59\x61\xc5\x58\x98\x5a\x1b\x84\xe8\xe4\xb2\xc1\x92\x28\xa2\x1a\x81\xa8\x29\xd3\x89\x80\x13\x67\x6a\xcd\x6c\xdc\xca\xe6\xab\x62\xc7\x96\x44\x2a\x61\x82\x49\x8a\xa6\x81\x5f\xb5\x11\x9c\xb3\x6a\x98\x1c\x3e\x19\xe3\xac\xcd\xd3\xb2\x57\x25\xe5\x39\x8f\xa3\xc7\x0d\x29\xfa\x75\x05\xa7\x52\xe4\xdc\xb5\x7c\xcb\x74\x46\x3c\x4f\x1d\x89\x2e\x51\x87\x5f\x90\x46\x7c\xd8\x9e\x46\xc3\x81\xab\x4e\x8e\xcf\xd7\x4d\x0e\xd1\x62\x72\xb6\x59\x03\x25\xf5\xd0\x47\xa7\xc6\xe1\x57\x98\x9a\x56\x1a\xaa\x4d\x3e\xb5\x11\xad\x92\xac\x93\x34\x2a\xd5\xd5\x05\xf4\xaf\xe0\x7a\xa7\x5e\x68\x53\x24\x5b\x6c\xb8\x2a\x39\xba\xa6\x0f\xa3\x02\xb8\x52\x4d\x09\x30\x2e\x9e\x72\x81\xdf\xcb\x0d\x22\x64\x7a\xfa\x64\xd5\x8f\xd1\xe5\x52\xe6\xde\x86\xa7\xf7\x9a\x7a\x2d\xd4\x54\x1d\xd2\x3e\x35\x7c\x02\x7f\xf9\x32\x23\xb8\xe1\xa0\x96\x4a\xc6\x1e\x02\xce\x4d\x00\x97\xdb\x92\x70\x6c\x17\x45\x35\x88\x7d\x2c\x6d\x81\xb1\x4c\x0a\xf3\xfb\xc6\x83\xc2\xe0\xe7\x10\x0f\x96\x21\x6b\xec\x2d\x3e\x75\x28\xb6\x69\x18\x9d\x75\x0f\x1c\xe8\xbb\x08\x27\x24\x0d\xf1\x71\xcd\xd0\xd1\x26\x09\x47\x55\x85\x99\x21\x7f\x85\x49\xf0\x37\xc0\x20\xdf\xe6\xe4\xf4\xc3\x19\x47\xce\x4b\x65\x5f\x87\x3f\xbc\x27\x34\xc8\x8d\x87\xe4\x4a\x4e\x2d\x5c\x4d\x4f\x9c\xb3\x02\x95\xc6\x90\x6b\x42\xad\xae\xc5\x72\x34\x1f\x76\xfa\x40\x2f\x47\x66\x10\xdd\xd7\x61\x06\x4b\x5c\x83\xae\x99\xeb\xe9\x8d\xeb\xaf\xfa\x5b\xcf\x10\x48\xdd\xa3\x3d\xb8\x67\x4b\x25\x55\x71\x97\xf9\x3c\x5a\xee\x5c\x67\xa3\xe6\xcb\x56\xc7\x58\x75\x68\xcd\x2d\x03\x59\x0f\x5e\xa6\xa1\x9b\x85\x77\x01\x92\x71\x26\x18\x07\xdd\x76\x72\x20\x07\xf4\xac\x73\x36\x78\x68\xeb\xff\x7b\xd1\x7c\x3a\xdf\xd9\x64\xbb\x2c\xf7\x52\xac\x2e\xfe\x5a\x1a\x74\xb5\xff\xe6\xf5\x87\x0a\x3f\x7c\x5c\xe1\x54\x7b\x68\xff\xb2\x4a\xbc\x05\x57\x06\x63\x8d\xb9\x09\x13\x24\xe5\xaa\xc1\x58\x87\x69\x56\x5f\x03\x19\x87\x7c\x13\xfa\xd3\xd5\x18\x1b\xae\x66\x68\xc9\x98\x6b\xae\xa6\x79\x46\x27\xf0\xbf\xa6\x04\xd4\x4c\xba\xf3\xfe\xe3\xaf\x67\xfa\xd3\x07\x70\xc5\x1a\xab\xb9\x1d\x21\xcc\x63\x1f\x6f\x03\x86\x5f\xb6\xe0\x9d\x2e\xe0\x8b\xd8\x93\x1b\x0c\x06\xfb\x84\x75\x6a\xb6\x35\xfd\x1d\xed\x6c\x32\xf4\xf4\x49\xba\xb9\x11\x95\xb6\x8f\x9a\x61\xd2\x17\xbb\x3b\x7a\x2f\x19\x5e\x0d\xca\x9e\x9c\x0e\x10\xcd\x07\xc8\xdd\x3d\x40\x17\x41\xdf\xaf\x1e\x07\x8d\x78\xf1\xda\xb0\x12\x69\x32\x30\x71\xd6\xc6\x4d\x6f\x9a\xfb\x21\xd7\x65\x39\xbc\x32\x79\x14\x14\x38\x4c\x89\x3d\x4f\x82\xa2\x7a\x7a\x9f\xde\xd5\x11\xc4\x78\x88\xb0\xc8\x7d\x8f\x79\x3f\xbb\x7b\x2b\xf5\xad\x30\xb6\x6f\x40\x63\x97\x90\xab\xb4\x19\xa3\x86\x69\xe9\x34\x6a\x17\x96\x96\x3e\x7d\xb2\xa9\x68\x91\xbe\xc6\x0c\x1a\x77\x29\x6a\xd9\x68\xaa\x35\x0e\xa6\xc1\x20\x6f\x2c\x1f\x4a\x97\x6b\x79\x78\x08\x50\xe5\xd9\x33\x2e\xa9\x6d\xfd\xfe\xc4\xb3\xca\x5e\x4f\x3f\xf3\x6c\x89\xbb\x55\x6c\x31\xd7\xce\xdd\xfb\x32\x96\xac\x89\x0a\xf4\x5a\x06\x30\x82\xd3\x14\x1c\x5e\x43\xa8\x35\x3b\xa7\x8f\x9b\xf1\x8c\x96\x11\x26\x07\x3e\x9a\x0c\xa8\x98\x19\xaa\xae\xf0\xe4\x35\xfd\xb0\x00\xe6\x2d\x73\xf8\x7c\xfc\xf4\xe1\xd2\x5a\xb9\xb5\xcf\xb9\x60\x7e\xb4\x0e\x52\xb0\x4e\x21\x8f\x4e\x41\x7f\x24\xd0\x43\x34\xef\x5a\x79\x49\xc3\xf6\xf2\xec\xcd\x62\xf7\xc5\xa0\x02\x75\x32\x48\x1a\x5f\x42\x27\x55\x7a\x07\x31\xda\x3e\x91\x9b\xd3\xcb\xa9\x70\xf3\x95\x0d\xd9\x6e\xb2\x00\xe6\xb3\x5b\x16\x9c\x66\xa4\x30\x6e\xb4\x34\xab\xc5\xd2\x2c\x59\x9c\x56\x52\x06\xae\xe6\x18\x49\x3d\xcd\x77\x22\xd8\x20\x74\xa4\x62\xc9\x90\x26\xca\xd9\xca\x70\x07\xcd\x97\x36\x3c\xc7\x72\x84\x50\x52\x45\x43\x95\x4c\xd6\x74\x51\xa8\x93\x3c\x7e\xcb\xe8\x5b\x9a\x39\x10\x5b\xe1\xb3\x36\x28\x7f\x9c\xbe\x63\xba\xd4\xd0\x50\x2d\x53\x15\xff\xcb\xe7\xdd\x4a\x19\x33\xa2\x68\x73\xec\xea\x54\x32\xa6\x66\x0d\xdb\xec\x57\x58\x30\x8c\x8d\x26\x21\xab\x53\xc3\xb8\x83\x3c\x2c\xbf\xca\xa8\xab\x6c\xad\x05\x6c\x26\x0f\x34\x95\x5c\xf9\xac\x3b\x2e\x99\x15\xdb\x57\xba\x6e\x32\x88\x98\x4c\xae\xc7\x16\x38\x6f\x62\xad\xf7\x47\x26\xbb\x75\x73\x0c\x60\x49\x32\xc0\xa7\x60\xeb\xf1\x8c\x0a\x72\x53\x3d\xae\x64\xde\xe7\x3b\xea\xb9\x69\x14\x7d\x1f\x44\x6a\x3c\xa4\x50\x8b\x84\xdf\xb8\x1a\x1d\xe4\x46\x6f\x20\x37\x23\xc4\x75\x8d\x2d\xa5\x7d\x00\x1a\x9f\x84\xad\x77\x8a\x12\x4c\x16\x6a\x9b\x92\x4d\xd5\xc1\x08\x0b\xc5\x55\x79\x33\x7f\x28\x9a\x28\x36\xf9\xe9\x53\x36\x54\x49\x7b\xd1\xed\x75\x11\x57\xa2\x24\xeb\x8f\x95\x1c\x35\x2b\x88\x6c\x7c\x4d\xdc\xb8\x71\x2e\x4f\x34\xb4\xb7\xe3\x21\x51\xa8\x55\xd7\xf8\x81\x26\xe5\x5f\x4f\x93\xfc\x4a\xca\x81\x7f\xd9\x9d\x4d\x48\x2c\x04\x51\x81\xef\x92\x00\x77\x7f\x6a\x0a\x5d\xc7\xeb\x08\x55\x8c\xba\xd5\xe6\x2e\x0c\x9c\x8d\x83\x71\x26\x22\xf4\x90\xc9\xb8\x6d\x30\x6e\x92\x9f\x28\xb4\x95\xc9\x90\xc7\x61\xf8\x25\xc7\xb8\xc3\x56\xf1\x72\xe4\x32\x8e\xd1\xd7\x3c\xa3\x6d\x86\x2c\x3a\xde\xa8\xa8\x63\xfd\x4f\xef\xa9\x82\x40\x86\xa5\x97\x26\x94\xd8\x86\x26\xec\xa5\x9a\x63\x99\x0f\x0a\x6d\xf7\x0f\xec\xb5\xb6\xc2\x6b\x86\xba\xb5\x5c\x82\x9d\x6b\xf2\xc0\xd8\x7a\x20\x32\x72\x91\xc1\x91\x71\xdd\xce\xba\xaf\x96\xfe\x62\xee\xb7\x08\x31\x59\xb6\xfc\x8d\x66\xe9\x8e\xd1\xa1\x6b\x46\xe7\x1b\x18\x1c\x57\x03\x47\x5b\x95\xcc\x1e\x83\x46\xff\x5b\x59\xcf\x77\x42\xb2\xaf\x09\xd8\x7c\x1a\xc5\xf0\xc7\x18\xfa\xac\xc9\xcc\x11\x58\x84\xda\x10\x4a\x8e\xe1\x3e\x84\x2f\x68\xc4\x78\xd8\x8c\x9f\xc8\xb3\xe3\x47\x6b\x40\x48\x17\xc8\x71\x0f\x91\xd5\x6e\xc9\x1b\x59\xb3\x86\x7b\x74\x5b\x75\x11\xc5\x0a\x88\x5a\x2c\x9e\x7c\x2e\x6e\xbf\xde\xb8\x8d\x1e\xe8\x21\x1a\xbf\xcd\x98\x5d\x67\x6d\x7e\x9d\x2b\xba\x78\x5d\xd8\xa9\x0c\xef\xc5\xc8\x53\xe5\x8b\x2e\x9e\xe5\x8b\x6e\x91\xff\xf0\x4e\x3b\xf2\xdf\xef\x3a\xb9\x0b\xba\xfa\x14\xe3\xd2\x58\xaa\xdb\x51\x85\x4f\x1f\x9c\x2c\x85\xce\xf3\x56\x65\x66\x4d\x99\x97\x75\x1b\x56\xa7\x48\x0f\x5e\x13\x60\x2b\xd6\xcc\x30\x53\x09\x08\x8d\xaf\x45\xb7\xa5\x2d\x23\x44\x6f\xa8\x02\xe7\x65\x07\x27\xcd\x46\x5b\x69\x42\x6d\x36\x38\x16\xed\x63\x99\x17\x42\x2b\x97\xc5\x0b\x7a\x8e\x75\x4b\x2a\x93\x13\x6c\x68\x34\x9c\x11\x12\x76\xfb\xaf\x6c\xfb\xdd\xfe\xcb\x37\xc8\xcf\x17\x33\xd6\x44\x95\x39\xb2\x5a\x50\x1d\x88\x18\xa7\x59\xca\x67\x23\xa5\xc4\xe8\xeb\x82\xeb\x37\xeb\xaf\xe6\x97\x0e\x90\xf9\x90\xd5\x95\x63\xf6\x6d\x71\x5f\xe5\xb0\xc5\x92\x90\x15\x61\x39\x64\xf3\x31\x5d\xd4\x31\x6a\xe6\xd3\xfb\x2e\x45\x6a\x1e\x62\xea\x65\x02\x7d\x13\xf7\x19\x70\x5b\x62\x1f\x65\x1a\xcf\xe5\xac\x38\xad\x24\xaf\x37\x05\x0f\x67\x87\xf9\xfb\x9b\x92\x47\x13\xd8\x7c\xc7\x0b\xfe\xce\xa4\x38\x6b\x0a\x82\xe7\x60\xda\xd7\x23\xf8\x47\x55\xcb\x31\xc9\x2b\x90\x62\x77\x58\xac\x42\x97\xfa\x72\x0e\xa1\xcd\x8a\xf9\x86\xb9\xd5\x48\x6e\x0f\x24\xbb\x23\xca\x9e\x46\xb8\x9d\x53\x5e\xab\xa7\xd5\x6e\x37\x97\xdc\x14\x62\x28\xe4\xed\x0f\xb2\xba\xde\x4c\x65\xad\xa4\x93\x01\xd2\xf5\x6b\x06\x33\xc4\x6c\xd2\x85\x14\x50\xd7\xe1\xf6\x5c\xb7\x94\x49\x53\x39\x17\x6a\x08\x10\x7c\xeb\x01\x8d\xba\x26\xbc\xd9\x62\xbd\x0e\x8c\xe7\x07\x37\x03\xf8\x9b\x45\xde\xef\x90\xbf\xde\xa3\xd3\xfd\x80\x3b\x6b\xd0\xdc\xe8\x08\x91\x36\x28\x1f\xea\xa5\x48\xf8\x09\x9c\xc1\xca\x8c\x6f\xeb\x49\xc8\xf0\xc5\xcf\x21\x5b\x67\xc8\x1e\x4b\xe6\xf3\xdd\x2e\x9e\xbb\x12\x04\xad\x95\x3b\xe6\x56\xeb\xd4\x9a\x9b\xd5\x2a\xa6\x8d\x6f\xb3\x51\xdd\x10\x6a\x7f\x87\xb8\xb5\x9b\x85\x41\x5b\x06\x0e\xd6\x03\xfa\x1f\x45\x56\x7a\x8b\xc5\x7f\x4d\xd4\xff\x77\x2c\x11\x5c\x8f\x09\x30\x93\x06\x26\x06\x97\xfa\xe3\x97\xdf\x5f\x3e\xff\xf5\x92\x07\xdd\xcc\xf7\x0a\x0d\x1e\x12\x44\x6a\x3d\x64\xe3\xc6\x31\x63\x3a\x12\x29\xb5\xd6\x0b\x81\xe5\x06\x2b\xf5\xf5\x35\xa3\xe4\x70\x52\xd6\xba\x7e\x57\x0a\x1d\x17\x8e\xe1\xa8\x1a\x8b\x42\xa1\xf1\x93\x48\x25\x75\x02\x73\xfb\x04\x69\x96\xfd\xdf\x03\xfb\x89\x53\x56\x12\x2e\x44\x09\x78\x12\x1e\x57\x82\xcc\x5c\x9a\xb8\x6d\xa8\x93\xc6\x6d\xf6\x9a\xc9\xd8\xbf\x3b\x8b\x08\xff\xad\xfd\xca\x5e\x49\xdb\x2c\x8b\x3d\x81\x53\x4c\xfc\x59\x66\xa0\x11\x69\x4c\xdc\x80\x10\xd5\x68\xb9\x92\x6f\x9b\xc6\x96\x65\xb7\xc9\x90\x9d\xc9\x47\x7c\x38\xd2\xc3\xc8\x0c\x3e\xb7\x90\x14\xfa\x2f\xec\x10\xc1\xab\x5d\xd4\xfb\xce\x95\x31\x81\x67\x43\xb8\xc5\xa0\x3c\x66\x23\xcc\xa3\x1b\x50\xd3\x95\xbc\x52\xe2\xe6\x6e\xac\x6e\x1e\xa6\x7e\x09\xbd\x51\xa2\x62\xd9\xe3\x48\x19\x3c\xee\x66\xf0\x5c\x6a\x91\xd7\xe0\x3d\x8d\xe3\xc6\x2e\x9a\x1b\x0d\xda\x04\x41\xfe\x99\x39\xa0\x17\x78\xf5\x05\xd7\x74\x7a\x55\xe8\xae\xa5\x43\x59\xb8\x79\x56\xe4\x8c\x37\x31\x10\xa1\x6c\x42\x9c\x74\x8e\x15\x35\xcf\x8f\x12\xc9\x46\xe1\xbf\x29\xf7\xd3\xbc\xeb\xa7\x19\xd5\x71\x8f\xb3\xc5\x04\xb8\xaf\x16\x01\x44\x10\x15\x9d\x91\x37\x88\x8a\xca\x80\xfd\x23\x5d\x70\x52\xdf\x0f\x6f\x13\x7a\x7b\x02\x7d\xd8\x2b\x81\x21\x6a\x16\x23\xce\x7b\x4b\x13\xf6\x46\x54\x10\x08\x02\x6a\x82\xa4\x18\x5e\xe1\x92\xa3\xa2\xde\xcc\xe6\x82\xc9\xa4\x5d\x86\x24\xcc\x27\xf5\x9e\x5e\x64\x80\xb8\x63\x44\xee\x14\x23\xf2\x50\x52\x21\x7b\x3a\xc9\x8b\xa4\xd0\x37\x33\xc8\x7c\x73\xf9\xe5\x36\xdb\xcc\x95\x16\x8d\xeb\x1d\xdd\x81\xb4\xdf\x23\xcf\x3c\xd9\x2e\x32\x90\xc6\x7c\x64\x3b\xdf\xdd\xb0\x38\x92\x27\x70\xad\x37\x42\xfa\x23\x37\x3f\x72\x25\x19\x00\xa6\x27\xcd\x37\xeb\x4d\x12\xa9\x1b\x51\xb3\x26\xe9\x75\xd8\x79\x9c\x51\x95\x67\x8b\xde\x70\x05\x81\x77\x32\xf4\xbd\x28\x9b\x21\x5a\x12\x72\x5d\x41\xc5\x1f\x31\xf9\x4d\x04\x97\x34\xac\xba\x6f\x30\x89\xfc\x1e\x35\xd1\x29\x82\xe8\x0a\x7a\x1d\x31\xb9\x30\x6b\x7d\xe1\xa9\x21\x17\x70\xd0\xa1\xf5\x9b\xbe\xf5\x1d\xbd\xfa\x9d\x56\x58\xaa\xed\x6e\x3b\xf0\x0a\xd7\x19\xc1\x85\x72\xe9\xf6\x8d\xa0\xf9\x38\xdc\xc5\x7d\xe3\xfd\x71\x6c\x57\x9e\xa9\x37\x3d\x23\x5d\xf3\x80\xf4\x0a\x16\x79\xb4\xaa\x4f\xe0\xa8\x51\x73\x76\xf9\xf0\x5c\x59\xa8\x72\xf9\x87\xc9\x02\xb2\x05\x8a\xe3\x21\x9a\x8c\x2d\x96\x53\xe6\x73\xa3\x2b\x7b\xbd\x05\x87\x0b\x23\x7e\x07\xae\xb5\xa5\x0a\xa2\x33\x51\xf6\x4f\x54\x0a\xc2\xbc\x1a\x69\x29\x65\x75\x37\x19\x7c\x04\x8f\x2d\x82\x67\x29\xe1\x81\x8d\x60\x55\xaf\x88\xef\x56\x25\x3c\x93\xb3\x6f\xa6\x96\x6c\xda\xdd\xe7\x4f\x97\x75\x13\x56\xa4\x1e\xc5\x31\xf2\xd2\x60\xbd\x94\x99\x8c\xc0\xd1\x76\xe9\xa1\xab\xd4\x5d\x3b\xd9\x5a\x01\x24\x82\xdf\x78\xf5\x5f\xed\x55\x75\x75\x7d\xe8\x8a\x5b\x4b\x47\x41\x70\x9a\x76\x9a\xa5\x7d\xd1\xe8\xa5\x6f\x5f\x50\x88\x77\x75\x5b\xd1\x4b\xb9\x0f\xac\x0c\xd1\x6d\x96\xed\x3e\x96\xb6\x92\xfa\x82\x01\x9c\x42\x28\x6d\xc6\x11\x06\x05\xda\x29\x42\x4a\x5b\x2f\x82\x2c\x57\x1a\x25\x32\x08\x5f\x51\xc6\x29\xb9\x56\x28\x5d\xc9\x7d\x87\x0c\xba\xc2\x87\xe5\x15\x20\x25\x0b\x55\x6a\x49\x56\x20\x9d\x89\xb1\xd8\x52\x2a\xc6\x95\x49\xf5\x43\xa3\x9e\xde\x17\x53\x1c\x65\xc8\x1b\xdd\x42\x7a\xc1\x2b\xab\xb0\x98\x55\xd6\xee\xee\x97\x75\xdf\xbf\xbe\x92\xda\x44\x4e\x2a\xa2\x0a\xd8\xb5\x56\xb6\x05\xcb\x4d\x06\xbf\x83\xdc\x77\x55\xf3\x0a\x55\x87\xbc\x25\x07\x1a\x76\xd2\x3f\x53\x94\xaa\x98\x45\x48\xbd\x45\xe1\x75\xdf\x0f\x31\x3d\x2e\x3b\x63\x82\x14\xcc\x1d\x03\xd6\x0f\xf6\xdb\x1d\x4d\x0e\x84\xc7\x1a\xc6\xcd\xa3\x38\x6e\xec\x98\xb3\xdb\x5b\x12\x56\x5f\x45\x53\xae\x83\xf6\x19\x6d\x2e\x29\x51\x77\x23\xba\xb5\xc2\x6d\x19\x28\xbe\xf1\xa2\xf9\x29\x88\xdf\x26\x88\x7f\xa5\x45\xb3\xce\xc6\x7d\x0d\x59\xbe\x22\x63\x6d\xcb\x1f\xee\xc0\x10\xd3\x96\xf4\x90\xe7\x08\x6e\x83\x0a\x7f\xa9\xd9\x7c\xa3\xda\xce\x5c\x93\x21\xe4\xb9\xcc\x5a\x6d\x7b\x80\x52\xb6\x1e\xe8\xbb\x20\xf4\x75\x8e\x26\xbe\x35\x91\x5f\x6f\xf3\xff\x3e\x09\xfc\x91\x93\xca\x9e\xbc\x85\x22\x92\x92\x44\xea\x69\x82\x81\xd0\xa2\x13\x25\x69\xae\x9e\x95\x64\x77\xbb\x08\x5e\xa4\x36\xdf\x6f\xf6\xc5\x02\x44\xf8\x6d\x44\x97\xa7\x4f\x8a\xad\x6a\xc3\xd8\x3e\xaf\xfa\x20\x17\x47\xed\xb3\x8b\xeb\x10\xc1\xf7\xcb\x72\xac\x10\x7a\x70\x59\x91\x27\xff\x06\x0e\x53\xbf\xba\xa4\xf2\x98\x19\xfa\xed\xe4\x94\xc7\xac\xca\x57\xad\x17\x33\x64\xe2\xb1\x04\x88\x50\xf9\xa9\xac\x4c\xb2\x0e\x82\xa6\xb5\xf1\xae\x5c\xbe\xe7\x75\xf5\x37\x63\xd1\xfe\x6a\xaa\xe9\x1d\x26\xb9\xaf\xba\x67\x9c\x0a\x1f\xbd\x68\x38\x75\xdf\x95\x36\x9a\x8c\x7b\xfa\xa4\x48\x4e\x18\x65\xc0\xbe\x06\xb3\x3f\xc1\x81\x17\x67\xb6\x4a\xda\x9b\xcf\x9f\x5f\xfe\xfd\x47\x3c\xb9\xd5\x54\x4a\x14\x5a\xa1\x37\x14\xc2\x3a\x89\xbf\xa8\x43\x4b\x80\xe9\x80\x7e\x8e\xa4\x42\xad\x08\xa6\xa6\x48\xa7\x93\x4f\x2f\x31\x92\x9b\x2d\x24\xd7\x43\x24\xa0\x07\xaf\xc8\x05\x6c\x70\xc8\x13\x67\xc9\x88\x2c\x0d\xce\x20\x37\x1a\xec\x3f\x47\x51\xd0\x6d\xc6\xa2\xa2\x5b\x38\x36\x4e\x69\x6c\xfa\x8a\x42\x24\xc8\x90\x45\x88\x46\x73\xd2\x83\xcf\x9b\xc9\x4b\x7a\x3b\x82\xbf\xc5\x60\x3f\xa5\xa7\xfd\xc7\xf6\x4f\x97\xc9\x89\x1c\x24\x05\xfc\x4a\x73\xf8\x8d\xca\xcc\x00\x36\x71\x4b\x9a\x97\x18\xeb\xdc\xf0\x11\x76\xa0\x87\x88\x22\x5c\x24\xc7\x07\xf4\xad\x65\x59\x9f\x3c\x39\x03\x1c\xc8\x61\x04\xb1\x09\x94\xcd\x0c\x72\x93\xf2\x96\x65\x4b\x7b\x08\xc9\xe9\xdd\xcb\x6f\xe7\x1d\x50\x28\x83\x37\x71\x6f\x51\x46\x7e\x8c\x1e\xa3\x49\xe7\x0e\xe4\x66\xb7\xb1\x02\x6f\xd8\xed\x17\xef\xb3\x2c\x2f\xf0\x4d\x02\x3f\x7b\x52\xaa\x78\x7a\xaf\x90\xa4\x35\x62\x93\x6b\xba\xc5\x94\x75\xd1\xd1\x32\x18\x5e\x56\xe8\xc0\x1b\xaa\xfd\xe2\x81\xcc\xc2\x89\x3e\x79\x79\x3d\xd7\xa1\x71\x35\xad\xe5\x42\x41\xb2\xab\xf9\xb0\x29\x27\xe7\xc3\xc1\xb9\xf2\x48\x2e\x8d\x8b\x8b\x87\xda\xbe\xd0\x90\xb0\xdd\xc5\x43\xf9\xc2\x70\xb5\x07\x4f\x8d\x83\x2a\xd6\xf4\xc0\x31\x96\x62\x54\xfc\xc7\x3f\xfc\x21\x29\xee\x44\x38\xc2\x4e\xf0\x11\x77\x82\xd2\x1f\x7e\xf9\xfc\x1f\xff\xf0\x07\x04\xff\x87\x5f\x3e\xff\xb5\xfb\xe3\xda\x9d\x70\xea\x06\xf5\xa1\xfd\xed\x47\xe4\xe7\x24\xab\x20\xd3\x2e\x16\x39\x81\x7b\x51\x47\x25\x08\x52\x37\xbc\x81\x65\x00\x13\x44\x84\x4c\x23\x3f\xbd\xec\x8b\xe7\x9e\x88\x16\xc7\x04\x74\xdd\xd2\x16\x39\x44\xff\x55\xdd\x39\x1e\xb3\xa5\x67\x02\x0e\x2a\x09\x27\x4d\x9f\x4d\xe5\x2f\x06\x87\x07\xa8\xfc\x73\x65\x48\x65\x64\x88\x42\xf9\x4e\xb3\xa9\x6b\xc2\x55\xbf\x83\x04\x7d\xfb\x20\x06\xc8\xf4\x45\x5e\x66\x2a\xce\x80\x63\xe6\x83\x06\xf2\x7e\x8a\xee\x0c\xd9\x2a\xf0\xb7\xf3\xcf\x6c\x45\xf0\xf1\x25\x69\xab\xfe\xa7\x59\x17\x2c\x54\xfe\x9d\xa8\x0d\x49\xcf\x9c\xf4\x7c\x37\x39\xd3\xbb\x2b\x75\x43\xb5\x1e\x50\x83\xc8\x2c\x45\xb8\xa5\x00\x7d\x00\x3d\x9d\x11\x71\xef\x30\x81\x2b\xe5\x00\x46\xed\xd8\x73\x65\xd9\x12\xb0\x93\xbe\x5a\x2f\x92\x95\x87\xbf\xaf\x79\x7f\x47\xea\x3c\x8d\xd9\x74\x83\xa3\x3e\x3b\xa3\x81\x5a\x57\x4d\xbd\x7b\xaa\xd7\x88\x7a\x1b\x79\x67\x71\x41\x19\xab\xbe\x2f\xef\xac\xef\x55\xfb\x9b\x8e\x9d\x68\xdf\xae\x47\xa7\x97\x9e\xea\xe5\xe2\x50\x7c\xb2\xe8\x35\xbb\x8f\xdf\xa1\x06\x54\x97\xf3\xed\x2e\xf4\xda\x5b\xb9\x6c\xc6\x4f\xaa\x92\xb5\x35\xaa\x16\x93\xfc\xd3\x27\x14\x35\x33\x41\x15\x0e\xa8\x60\x68\x9a\xb4\x53\x2e\x83\xfa\xa2\xbe\xd1\x7b\xab\x84\xae\x75\xc9\x65\x78\x9a\xe5\xf2\x5c\x59\x9d\x43\x4b\xb2\xa0\xca\x7f\xbb\x72\x9e\xde\x1f\xa7\x4b\x83\x50\x51\x5e\xf1\x19\xc1\x47\x2b\x5d\x77\x7a\xc0\x1f\xcb\xff\xac\x28\xbc\x16\x21\x71\x41\x76\x63\xa8\xa2\x15\x8d\x51\xff\xda\x79\x60\xcd\x9d\xda\x73\x0a\x67\x3a\x47\x6e\x0e\xe5\xd2\xcb\xca\xec\xad\xc2\x9a\x4e\x64\x6c\xcd\x9a\x2d\x4a\x44\x8c\xe5\x52\xee\xaa\x36\x98\x9f\x59\xf9\x47\x10\x5d\x81\x80\xcb\x1f\x1e\x82\x30\xe8\x92\x1a\x00\x83\xba\xa1\x60\x17\x72\x9f\x35\x6b\x6a\x56\x90\xf6\x1f\xdd\x33\xe3\x6a\x81\xc1\x02\x91\x48\x5c\xe9\x27\xb1\x7d\x4f\xc4\x76\x85\xde\xb6\x7d\xf9\xf3\x99\x74\x20\x9d\x05\xd1\xd5\xa3\x5c\xc1\xa2\x7e\x51\x4d\xa9\xe1\xaa\x46\x6a\xa8\x02\xaa\xb1\x6a\xb8\x9a\xeb\x63\x69\x7c\xc3\x52\x33\x46\xa0\xa0\x13\xc9\x4b\x5e\xd3\xb3\xce\x52\xa8\x57\x3e\x99\xd4\x2f\xf1\x04\x5a\xa3\x87\x98\x45\x98\xc8\x5b\x85\x80\x34\xe9\x98\x44\x63\x06\xfe\x98\x40\x61\xc0\xdd\x0c\x7a\x78\xbc\xa7\x63\x2d\x6f\xad\x85\x65\x7b\x72\x6c\x0f\x71\x9f\xc0\x6f\x4b\xb7\xf2\x99\x0c\x2a\xda\x2b\x33\x74\x4d\xff\x9a\xd8\x95\x46\xd8\x97\xde\xa0\x5f\x67\x8a\x2e\x41\xe2\x9e\x9d\x9e\xea\xd5\x31\xdd\x9f\x0e\x7f\x3a\x09\x1a\xb7\xa4\xdd\x97\x33\x09\xac\xa4\xf2\x68\x42\x4d\x7c\xc8\x90\xf6\xd4\x84\xf1\x38\x5b\xaa\xe3\xa8\xb7\xde\x84\x13\xe3\xc3\xd3\xf1\xa9\xcf\x89\x65\x37\x6b\xd2\x49\x03\xb3\xe2\xd1\xf0\x34\xa5\x44\xae\x8a\x37\x6d\x8d\x5e\xdd\x2a\x2f\x0c\x1d\x3a\x50\xab\x07\x27\x11\x55\x4f\xae\x80\x2d\xeb\x69\x6b\x75\x4b\xeb\x2f\xaa\xdb\x6c\xdc\xed\x83\xd7\x90\x9b\x75\x07\x2d\xda\x63\x77\x14\x78\xad\x26\x3f\x25\x42\xbe\x81\x08\x57\x18\x6f\xf2\x07\xda\x7b\x40\xbe\x77\x48\xaf\x55\xd2\xff\xf9\xf3\xc7\x5f\xcf\xa5\x0d\x2b\xa6\x22\x93\x6b\x8a\x8d\xaf\x73\x93\xeb\xb8\x1b\x12\xad\x5b\x67\x9c\x0c\xa5\xe8\x1e\x8d\xba\x8f\xd7\xbe\x41\x1e\xc1\x49\x0a\xa1\x52\x1e\xdf\x30\x74\xc8\x35\x65\xa8\x92\x7c\xc9\xdc\x20\x6f\x8e\x99\xdb\xa5\xaa\xa7\xf7\xe4\x4d\xae\x11\x9b\x58\xd3\x2d\xec\xed\xf2\xa8\x1b\x4c\x75\x9a\xa1\x5a\xe7\x86\x49\xb3\xbf\x55\x7b\x9c\xc1\x36\x4a\x23\x64\x57\xc1\x86\xaa\xdb\x9a\x71\x82\x5c\x7b\xab\x0b\xc5\x0e\xee\x13\x2a\x77\x0a\xf1\x93\x56\x52\x72\xdf\xa6\xb3\xf7\x7b\x50\xbd\xb4\x7f\xfd\xf3\xcb\xaf\xbf\xfc\xf6\xf2\xf1\xd7\xdf\xbf\xfc\xc3\x1f\x18\x7f\x41\x0f\xee\x17\xc6\x5f\x94\x6a\x7e\x51\x7a\x98\xfe\xed\x7e\x61\xee\xae\xfd\xbb\xf2\xff\x5b\x79\x50\xc9\x66\x3b\xa3\x5b\x4c\x10\xdc\x59\x67\x5c\xcc\xb2\x7f\x17\x32\xdd\xcb\xce\xd8\x22\x20\x5b\xba\x66\x8d\xfc\xf4\x79\xba\xc9\x25\xe4\xcd\xc8\xf9\x2e\xfb\xc5\x83\x6b\xf9\x71\x2b\x86\xaa\xe1\x69\x11\x5e\x45\x06\xbc\x3f\x24\x08\x61\xc6\x5e\xdf\xb1\x3a\x7c\x97\x0f\x73\xff\x47\x5a\x39\xda\xea\xd2\x4a\x22\x07\x8e\x76\xd3\x74\xa5\x08\x14\x2d\x75\x5c\x9e\xc0\xc7\xf9\xc9\xbd\x15\x35\x07\x17\xc7\xfc\x7a\xf7\xa1\x45\x76\x85\x55\xe4\x6d\x8d\x2f\xfe\xd6\x58\xfe\xd7\xf6\xdf\x7c\x48\xba\x12\xdc\x3e\x9c\xd9\x4e\xc9\x1d\x82\x8c\x35\x66\x59\x0f\xd3\x0d\xf6\x93\x13\xc1\x34\x36\xc8\xfb\x55\x20\x30\x0a\x7f\xf1\xe0\x4e\x41\x40\xde\xc5\x3b\x27\xfd\xf3\xe0\x4e\x74\xe9\xef\x32\xee\xe0\x76\x2c\xc6\x23\xf3\x60\x23\xff\xca\x4a\x73\xc2\x3a\x1a\xf4\x1d\x15\x00\xd3\x62\x31\xaa\x29\xc2\xad\xbc\x5c\xa7\x74\x7b\x96\x4f\x5d\x3b\xdb\xdf\xa1\x25\x6b\x22\x67\xff\xeb\xcb\xe7\xf6\x4f\x97\xd2\xb2\x78\x67\x30\xed\x30\x8b\xb4\x5f\xae\x9d\x75\xdf\xb1\x75\x7b\x86\xb0\x43\x02\x1d\x15\xee\x9f\x04\x4d\x52\x55\x93\x87\x90\x37\x98\x21\xaa\x15\x26\xd2\x91\x3c\x4b\xde\xe7\xc5\x97\xa4\x09\xe0\xa3\x6a\x22\x89\xbb\x6b\x99\x33\xf5\xcb\x0a\xe0\xb3\x88\x40\xd1\x37\x1e\xc2\xb3\x2d\x56\x28\xf0\xa8\xa7\x0d\xd1\x54\x5f\xac\x9a\x80\xad\xfa\xf4\x1c\x02\xc4\x58\x77\x09\x11\x4e\x14\x98\x6d\x80\x20\xd5\x53\xea\xae\x43\x2b\x5c\x39\x7c\x98\xb5\xdc\x12\x64\x34\x1e\x92\x17\xa6\xee\x36\xb3\xe6\x6b\x2e\x5a\x83\xae\xce\x9a\x3d\xe3\xd4\x88\x19\x4d\xa4\x1b\x62\x77\x2d\x9f\x81\x37\x0e\x38\xd6\x01\x1c\x69\x99\xce\x94\x6b\x79\x5c\x0c\x5a\x32\xd4\xc4\x5a\xaa\xb6\x89\x8f\x18\xa3\x21\x1b\xaf\x86\xb5\x79\x4f\xe4\x19\x6a\xde\xce\xa8\x87\x02\xf1\x98\x6c\x1e\x49\x8a\xf4\x40\xe1\x10\x80\xdd\x73\x89\x08\x2c\xf6\x73\x1d\xbc\x2f\x3a\xaa\x46\x47\x55\x96\x05\x39\x19\xc3\xac\x85\x74\x8b\x8b\x21\x9a\xa0\xc6\xb5\x53\x15\x93\x85\x84\x9b\x13\xed\xf5\x10\xb0\xeb\xcf\x6e\xd9\x5b\x88\xae\x10\x4f\xd8\x2c\x47\xaa\x27\xc7\xa7\x4f\x36\x97\x2c\xf4\xac\x13\xec\x51\x1a\x17\xb4\x75\xbd\xb3\xb6\x46\xc0\x25\x90\x4e\x26\x7e\xfa\x14\xb5\x87\x1d\xf1\x60\xb9\xbb\x29\x58\x33\xe5\xda\x49\x06\x5e\x8d\xb7\xa9\xb3\x98\x0d\x61\x2f\x22\x2d\x68\xd0\x1a\xaf\x65\xe2\xf8\x6e\x53\x09\x3d\x8a\x17\x30\x3e\xc3\x7a\xab\x13\xa9\xab\x3c\xa1\x2b\x61\x0f\x1e\x62\x3c\xb9\xfa\x7f\xb2\x93\xbf\x2f\x76\xb2\x3b\x35\x52\xd6\xe9\x19\xca\xf9\xcd\xed\xd9\x42\x15\x2c\xa0\x9e\x81\x58\x60\xb6\x80\x59\xa8\xe2\x44\x2a\x5a\x17\x35\x9e\x76\x6f\x81\x35\x0a\x17\x85\x07\x25\x0b\x84\xe5\x6f\x95\x60\x26\xb1\xd9\x96\xa5\x74\x0f\x41\x27\xca\x69\x28\xb5\x1b\x3c\xf0\x06\xfa\x7d\xfa\x64\xbb\xc4\xdf\xd7\x31\xbb\xf7\xca\xc5\x76\x0b\x2e\x66\xc1\x77\xb4\x71\x15\x1b\xfc\xdb\x81\xc5\xc7\x4a\xf9\x55\xda\x51\x05\x2e\x98\x72\xed\x68\x20\x90\x71\x90\x79\x1f\xc0\xa5\x06\x19\x9c\xe6\x3d\xf3\x69\x43\x95\x0c\x57\xb9\x76\xfc\xb8\x2b\x66\x0d\xef\x60\x4d\x0d\xa6\xd5\x1d\x32\xb8\xa4\xd5\x6f\x96\xcd\x13\x0e\xa0\xcd\x9e\x36\xc5\x82\x27\xeb\xc0\x9f\x96\x3a\x6f\xf6\x06\xbe\x2e\x2f\x1a\x57\x7a\x82\xe9\x20\xa2\x42\xa4\xed\x08\x21\xa9\xe3\x4d\x4f\xcd\x26\xa8\x03\x7d\x7f\xed\xef\x76\x01\x9e\x84\xdd\xb5\x14\xaa\xd2\x7b\xd0\x3c\x95\x09\x52\x38\x44\x40\xff\xac\x2e\x29\xd2\xbd\x28\x57\x29\xe3\x8b\x52\xad\xfc\x60\x65\x1d\x52\x3b\x22\x10\xed\x4e\x17\x69\x02\x64\x7f\xa2\x19\x04\xd9\x59\xc8\x66\xd1\x68\x1b\xa0\xf2\xb5\xef\x62\x00\xb2\x33\xe5\xda\xad\x18\x3d\xe0\x4c\xb8\x77\x1b\x4d\xc5\xaa\x97\xaa\x73\x23\x17\xd6\x91\x74\x14\x4a\x89\x03\x36\xad\x4b\x3a\x39\xb5\xd3\xb3\xd5\x59\x9c\x19\x1a\x88\x41\x0b\xad\x33\x30\x6b\xb9\x7a\x62\x49\x43\xa2\x32\x3d\xbd\xf4\xbb\x45\x27\x0c\x41\x8a\x16\x92\xe2\x4a\x20\x77\xd7\x4e\x7d\x01\xdd\xaa\x4b\xf2\xbd\x46\x58\x70\x52\x16\xe7\x35\x77\x56\x61\xc1\xa9\xcb\xa3\x55\x1d\x22\x04\x57\xd2\xf4\x9d\x2a\x89\xb3\x26\x64\xdf\xcc\x63\x22\x0a\xe8\x12\x1b\xbf\x5b\x36\x9a\x81\xa2\xee\xa8\x7b\xd6\x2d\x77\xf1\xa9\xca\xf5\xd2\x6b\x8a\x80\x71\xb3\x1c\x36\x8a\x0a\x72\x9f\x76\xb3\x91\x56\x6a\xd0\x35\xaa\x2d\x9a\xce\x90\x19\x51\xe5\x0d\x7e\xde\xdf\x92\x53\x3c\x16\xe0\x55\x38\x07\x09\x39\xdf\xcb\x34\x74\xc1\xdd\xaa\xb0\xde\xe1\xcd\x34\x97\x1d\xc1\xa7\x43\x55\x33\xee\x44\x92\x32\x61\x38\xd9\xb7\x25\xf4\x77\x2f\x8b\xe2\x3e\xba\x38\xbd\x72\x3b\x72\xfb\xc9\xaa\xfe\x36\x58\x55\x2b\x32\x15\xef\x66\x69\xbf\x2d\x01\x07\x2b\xcd\x57\x10\x81\xd8\x5d\x3b\x09\x5b\x4d\x0a\x8a\x7a\xcb\xdd\xb5\x6f\x5d\x15\xc0\x9f\xf2\xa0\x13\x21\x2e\x85\x5b\xf4\x95\x6b\x03\xfb\xde\xce\xd2\x73\xce\x73\x6e\x62\xe9\xf9\x63\xfb\xf1\x4f\x17\x0e\x54\xcb\xc2\xe5\x38\xb2\xd4\x66\x93\x84\xd5\xf9\x49\x24\x90\x6f\xe4\xe6\xd1\x6e\xa6\x2a\x45\xd4\x7c\x8d\xc7\xd7\xa8\xa4\x90\xa5\x30\x2a\xad\xaf\xe0\xe9\x93\x75\xa6\x77\xe9\xe8\xd2\x53\x8e\x12\xfb\xa9\x76\xb9\x16\x36\x08\x97\x58\x0a\x1e\x99\xf9\xd8\xca\x9e\xd4\xf8\x69\xb8\xc4\x41\x56\xf7\x35\x9d\x12\xf5\x6d\xd4\xa9\xbe\x82\x57\x3a\x45\xea\x98\x94\x56\x73\x30\xd0\x0d\xcf\xbf\xda\xab\x86\x2a\x08\x78\x45\xb7\x28\x01\xe7\xb1\x8d\xbe\x54\xf0\x4a\xaf\x44\x2c\x0c\xe0\x6f\x41\x4a\xb9\xb4\xf7\x66\x93\x81\xf2\x82\xdc\x32\xf0\x8e\x15\x84\x57\x2e\xd5\xa0\x1c\x23\x9e\x98\x1e\x0f\x8e\x37\xf3\xb7\x4b\xc1\x6b\x48\xed\x25\xa0\xcc\x2f\xc7\x19\xc1\xc5\xab\x5b\x29\x1b\xda\xf2\x65\x1b\xce\x59\xdb\x6f\x93\xe7\x29\xcb\x3a\x8b\x8b\x46\x1e\xa2\xb0\xf8\xab\x47\x32\x41\xca\x8f\x35\x72\x19\x4f\xd7\x7e\xfc\xed\xdf\x5e\x76\x9f\x2f\xd8\x9b\xd5\xac\xa7\x36\xff\xb8\xa7\x86\xa9\x8e\x4d\xac\x73\xe3\xeb\xb8\x29\x0e\xe1\x72\x29\x6d\xf1\x26\x40\xc8\x0d\x13\x30\xca\x43\x79\x36\x74\x29\xa2\x61\x57\x6b\x71\xb3\x67\x25\x34\x88\xb1\x09\x6a\x9d\x9e\x3c\xeb\xaa\x5f\x2d\xf1\xbb\xec\x2f\xb2\x6d\x02\x3b\x33\x32\x4a\x90\xa2\x33\xfb\x5a\x36\xe2\xf1\x09\x44\xd4\xce\xd5\xc2\x25\x97\x1f\x61\xa5\x85\x35\x28\x12\xcd\xd3\x7b\xd2\xb3\x2a\x6a\xb4\x02\x60\x06\xe6\xe3\x96\xcc\x6c\x62\x8d\x61\xe4\xd0\x85\x52\x49\x13\xf7\x52\xf3\x6e\xf2\x7a\xf9\xf1\xa0\xc3\x5e\x7f\xfe\x8c\x5d\x8a\xda\xe3\xe1\xb3\xfc\x79\x97\x27\xc9\xeb\x95\xa4\x47\x2b\x71\xaf\x57\x42\xf4\x68\x25\xfe\x8a\x4a\xc2\xa3\x95\x84\xb5\xe7\xe4\x3a\xe3\xeb\xca\x73\x74\x9d\x65\x69\xe5\x39\xbb\xce\xb5\x60\xe5\x39\xbc\xee\xc0\xff\x12\x6b\x61\x11\xa7\xef\xe1\x00\x97\xcf\x49\xa7\x30\x05\x72\x77\x6f\xe1\x2e\x1e\xe5\xc0\xd1\x66\xe2\x5e\x61\xba\x46\xdf\x61\x57\xf4\xd7\x8c\x09\x57\x8a\xce\xb3\xe8\x9c\x76\xef\x6d\xf7\x12\x64\x91\x3b\xe6\xe3\xd7\x35\xe8\x8e\xfe\x86\x0b\xfd\xbd\xa4\x34\xdc\x5c\x51\x3c\xa9\x39\x5c\x22\xbc\x7e\x87\x26\xc0\xb8\x73\xe0\xbc\x71\x03\x66\xb2\x75\x80\x68\x79\xe3\xc0\x05\xe3\x8e\x06\x09\x74\xe6\x2b\xef\xe0\x9f\x2c\x26\xc3\xbb\x89\xef\xec\x9e\xc1\xb9\x26\x80\xe6\xfa\x66\xd1\x01\xb9\x0f\xab\x76\x10\xb8\xdb\x1f\x9d\x1b\x7f\x65\xf0\x40\x75\xc9\xb3\xa8\x27\xfe\x49\x1d\xb8\x82\xba\xa8\x54\xc5\xf7\x40\xbd\x62\x87\x5f\x98\x26\xbf\xdc\x39\xcf\x80\x1b\x9d\xc4\x3b\x52\xda\xcc\xe2\x9c\x54\x94\x08\x06\xab\xd2\xc6\x26\xdd\xde\x63\x02\xcc\xbb\x99\x87\xc4\x2b\xfc\xc0\x7d\xe3\x79\xbf\xbc\xda\xd6\x9d\xa7\x6b\x8c\x75\x8f\xac\xd1\xbb\x7c\x38\xe6\x4e\xfe\xff\xf4\xf1\xf3\x87\x7f\xdf\xb5\xed\x79\x0c\x4f\x32\xa1\x9e\xe4\x8f\x37\xa9\x99\x46\x37\x18\xaa\x99\x66\x1e\xe9\x69\x9c\xb2\x94\x4c\x78\x7a\xef\x4c\xaa\x99\x0e\x1e\xaa\x54\x13\x43\x3a\x58\x57\x13\x1d\x5c\x8d\x4e\xfe\x44\xf9\xd3\x3d\x7d\xaa\x4c\x94\xd7\x82\xbe\x96\x20\x93\x5a\x03\x62\x4d\xf1\xe0\x20\x69\x8c\xc8\x70\x0f\xbb\x7b\x09\x72\x77\xa7\xbb\xe1\x0a\xc0\xb2\xa1\xd4\x90\xd3\xaf\x09\xa8\x91\xa9\x75\xe5\xc6\xde\x22\x04\xb9\xe1\x1a\x62\x6d\xd6\x5a\x92\xbb\x3a\x4e\x15\x24\x38\xed\x6d\x78\xa4\x1b\xea\xc4\x54\x81\x4f\x3b\x06\x9f\x0c\x17\xe3\x56\xb1\x89\xaa\x79\x2d\xd3\x64\xf8\x9a\x24\xaf\xa3\x6b\x11\xd0\x5b\xba\x63\xde\xd0\x03\xa7\xd5\x46\xef\x5a\x17\xeb\x8b\x9a\xd0\xd7\xf7\x5a\x7b\xc4\x29\x7b\xe2\xba\x76\x95\xc8\x31\xb7\x49\x3a\x6f\xc1\x91\xae\x91\x46\x53\x4c\xcf\x5c\x4d\x21\xb0\x95\x86\x2e\x57\x8f\x4c\x3f\x41\x4c\x8b\x98\x56\xa0\x74\x1f\x35\x88\x84\xb6\x99\x9d\x57\x1f\xd9\xa5\x33\xe8\xbf\xa7\xc5\x7a\xaf\xea\xb1\xaa\x5c\x74\x96\xef\x5e\xb0\x34\xae\xc3\x61\x65\x89\x24\x0d\x1c\x74\x7b\x7a\xfa\x84\x95\xa9\x6a\xea\x7f\x25\x1b\x64\xfc\xaa\x3a\x36\x18\xea\x7c\x70\xfb\xd4\x60\xd8\xd3\xf8\x0f\x96\x5d\x4d\x86\x19\x69\x9f\x9a\xd4\x3d\xec\xfe\x5f\x45\x16\x39\x32\xc7\x73\x30\x99\x9a\x42\xc7\x4d\xdb\xe0\xc0\xc7\xcd\x2c\x39\xd5\x11\x46\x1c\x45\x6e\xbb\x67\x04\x3b\x5e\xb7\xc2\xb0\xdd\xef\xae\xfb\x5d\x73\xbe\x3b\x1d\x76\x2f\xf5\x49\xf3\x2e\xb9\x2c\xb3\x8b\xe0\x51\x44\x31\x36\x7a\xe9\xa4\xd2\xee\x85\x15\x25\xaa\x89\x49\x9f\x81\xa8\x99\xd3\x97\xfc\xff\x15\xd8\x66\x57\xfd\x1b\x52\xdc\xeb\x27\xb0\x6f\x28\x70\x9e\x76\xad\x59\x44\x95\x7e\xfc\xb2\x88\x29\x1d\x0c\x22\x5e\x0d\x22\x47\xcb\x4f\xbe\xcb\xa4\x75\x8a\x05\xcd\xaa\x40\x7a\xb0\x8e\x8b\xa6\xcc\xae\x8e\xf0\x60\x1d\x17\x2d\x99\xa5\x0e\xaa\x1e\xac\xe3\xa2\x21\xb3\xab\xc3\x3d\x58\xc7\x15\x76\xcc\xf4\x60\xf8\xe0\x35\x56\x4c\x7a\xb0\x8e\x78\x45\x1d\xe1\xc1\x3a\xd2\x15\xe6\xc2\xea\xc1\x3a\xf2\x15\x75\x3c\x1a\xce\x89\xd5\x2b\xb1\xf9\x54\x8f\xe5\x97\x60\x5c\x33\xe5\xa2\xa7\x42\xe8\xdd\x34\x84\xbe\x73\x70\xae\x53\xe3\x6a\xba\x25\xdd\x3f\xae\xcd\x20\x1e\x36\x79\xdf\xc1\x30\x1e\xb6\x78\xdf\xc1\x40\x1e\x36\x78\xdf\xc1\x50\xee\xb5\x77\x3f\xc0\x60\xee\x35\x27\x3f\xc2\x70\xee\x35\xe9\x3e\xc2\x80\xae\xb2\xee\xae\xcc\x90\x2e\xd5\x99\x6e\xa8\x73\xad\x18\xd5\x7c\x8d\xe0\x88\xde\xa4\x03\xed\x13\x84\xb0\x4c\x03\x98\xb2\x3d\x17\x40\x71\x91\x2f\x54\x57\x1d\xd6\xa4\x4e\x64\x65\x2a\x7c\xae\x57\xef\x27\x92\x25\x24\x91\x53\x6f\x67\xa8\xa7\xed\xc2\x5d\x95\xf7\xf4\xe9\xab\x29\xd9\x78\xb3\x96\xbd\xd6\x9e\xf3\x1e\xd9\x90\xc6\xee\x15\x71\xbd\x37\x11\x57\xa3\x1f\x22\xa5\x1f\x7f\xd0\xe8\x47\xda\x97\x70\x6e\x29\xc1\x6b\x34\x43\x6f\x49\xf6\x5d\x70\x77\xff\x0b\xc3\xe4\x17\x8d\x7f\xa5\x95\x8e\x06\x8e\x47\x00\xbe\x49\xfb\xd8\x91\x96\xa6\x60\x1b\x0c\xf7\x29\xdb\xb0\x1a\x69\x75\xf5\x7d\xd3\x41\xfc\x61\x4d\xf5\xff\xf3\xc3\x9f\x5e\x2e\xa0\xff\x1a\xa7\x29\xb6\x17\x10\x2c\xd4\x2a\x30\xb7\x07\x97\xf7\x16\x79\x83\x68\x70\x40\xb9\xa9\xa0\x8a\xaa\x98\x1e\x81\x6f\xd4\x2f\x1a\xd3\x2e\x9b\x5e\x0d\xf6\x36\x99\x0c\x55\x77\x29\x53\x99\x01\xd9\xe6\x3d\x72\x6b\x3d\x78\x27\xc5\xa7\x59\x92\xe7\xaa\x4d\x36\x42\xbe\x05\xeb\x79\x09\xfa\xfb\xff\xfd\x7a\xa9\xd3\x95\xa6\x4b\x41\x40\x27\x5d\xd3\x8e\x5a\xe9\xe8\x38\x9b\x34\xe9\xc0\x6c\x35\xb8\x07\x59\xe3\x8d\xaa\x13\x00\xe3\xb4\x8d\x9d\x1f\x2a\xba\x3d\xf2\xee\x54\x87\x4d\x36\xa3\x51\x31\x93\x0e\x7b\x8d\xf1\xa5\xdd\x68\x78\xad\x87\x2a\x58\x69\xe4\x63\xc0\xc7\x7f\x7c\xfe\xfc\x72\xe9\x84\xc6\x15\x20\xd3\x26\x80\x4f\x3b\xa7\x41\x5c\xc7\xd3\x35\x2f\xff\xf6\x16\xc3\x66\xf2\xc4\x68\x0c\x5b\x3a\x10\xef\x08\xbc\x21\xe8\xc3\xf1\xbc\xa9\x1a\x0a\x75\x04\xcc\xba\xb4\x0e\x1e\xfc\xec\xd3\xa0\xd0\xc9\x35\xf9\x45\x7d\xa6\xab\x4f\x96\x3f\xf2\xde\x52\x43\x19\xbc\x1b\x55\x51\x4c\xdc\xfa\xab\xc6\x0a\x48\x0f\x04\xa3\x71\xbd\x01\xbc\x52\xbf\x61\x02\x7f\xb0\x93\xa6\x49\xe3\xbc\xa9\x0e\x0e\xbc\x7b\xfa\xa4\xfd\x8a\x9b\xe9\x63\x26\xed\x52\x93\x01\xa9\xc6\xd4\x0f\x87\x4b\xc6\xf5\x61\x53\x8a\x2c\x2a\xa5\xaf\xe6\xa7\xa5\xc0\xdf\xe8\xc1\xbd\x49\x4f\xf7\x04\x41\x13\x28\x06\xa3\x97\x89\xe5\xb3\x05\xe7\xa4\x3f\xaf\xf5\x55\x84\x86\xe1\x44\x48\xf9\xf2\x57\xa5\x04\x7f\xd6\x25\xf7\xe7\xe9\xd0\x35\xa7\x43\x13\x8b\x24\x42\x26\x0b\x14\x0e\x18\x80\xd7\x26\xb6\x24\x04\x3c\x87\x35\x61\xa5\x9a\xcb\x14\xb6\xf7\xe0\x69\x1e\xb6\x61\x20\x85\x6f\x40\x70\x07\x8b\xe7\xb0\xcf\x7f\xd0\xe3\xa1\x07\xd8\xfb\x77\xcb\xc1\xd7\x10\x5e\xbf\x25\xeb\x75\xe0\xd1\x46\x48\xe7\xc9\x7b\x65\x96\xf9\xf3\x48\xe9\x7b\x64\x95\x93\x54\x68\x56\x2a\xcc\x6f\x41\x11\xa7\x78\xda\x8f\xa3\xb7\xfc\xd3\xc7\xf6\xc3\x1f\x3f\xfc\xfe\xfb\xc7\x5f\xff\xfc\xe5\xbc\x10\xab\x30\xf1\x1a\x23\xba\x43\x45\x94\x84\x3e\x86\xd8\x42\xd4\x74\xd3\xd4\x5a\x84\x90\x2c\xf8\xe7\x92\xa3\x9a\x5c\xc9\x53\xed\x92\x05\xca\xf2\x5a\x0b\x31\x89\x30\xef\x96\x65\x28\xe8\x3c\xc7\x56\x65\x7d\x55\x8e\x16\xef\x28\x48\x32\x68\x35\xce\x43\x0c\xbb\x08\x49\x76\xb4\xe4\x46\xdb\x1d\x30\xb5\x5a\x25\xca\x74\xa1\xa2\x0e\xc8\xa5\x2f\x02\xd1\x42\x8c\x9a\x9c\x74\x51\x3c\x22\x24\xfd\x3a\x1a\x2c\x04\x14\x85\x80\xe2\xb1\xa3\x51\x8b\xd7\x26\x76\xe0\xca\xf3\x16\x86\xbe\x81\xa2\xb9\x9c\xea\xa6\x41\xe0\xb4\xc5\x28\xdc\x91\x70\x17\x21\x38\x4d\x0d\xd5\xbf\xc1\x08\xd1\xb5\xda\x7c\x70\x71\xd1\x83\x12\xfc\x88\x78\xa0\xf9\x23\xd3\x3d\x6a\x11\x7c\x96\x4f\xa7\x67\xb7\x95\xd1\xa2\xa5\x7f\xc2\x20\x14\xdd\x73\xda\x3a\xd3\xb5\x2e\xb6\x9a\x92\xea\x44\xfb\xf5\x29\x90\x54\x21\x93\x1a\xd3\x33\x10\xcb\xb0\xb9\x08\x04\x91\x80\xf2\x96\xc8\x70\xc9\xf3\xbe\xf8\x16\x35\x88\x71\x31\xf2\xa6\xcc\x4a\xa2\xb6\x00\x2d\x78\x29\xd6\x59\xa8\x64\x00\x84\x84\x40\xa6\x3d\x4b\xbf\x14\xea\x77\xd9\xa6\x20\x64\xd1\x13\xce\xa9\x6e\xc9\xcc\x24\xe9\x79\xd6\xb9\xf9\x3f\x80\x42\x29\x4e\xc9\x32\xe4\x2d\xb3\x86\x3b\x9d\x1a\x51\x25\x8b\xa7\x4f\x42\xda\x06\x21\x70\x49\x13\x17\xc8\x02\x12\x38\xda\x05\x33\xb0\x17\xfd\x34\xb7\x32\xc9\x8a\x3a\x51\x52\xac\xa3\xe6\x20\x42\xab\x23\xb7\x0b\x32\xc6\x61\x80\x63\xb0\x08\x04\x4e\xbe\x71\xa4\x30\x14\x81\x8d\xe2\xc9\xc9\x4a\x93\xa9\xd2\x0a\x2b\x59\x44\x5a\xa3\x7c\xaf\xc0\xd8\xc7\x4c\x02\x84\xb6\x94\xa0\x8b\x43\xd8\xaa\xeb\xe1\x65\xf5\x87\x05\x22\x0b\x9c\x36\x43\x4b\x15\x38\x22\x1a\x0a\x5b\x4c\x8a\xb2\xc1\x06\x83\x21\xdf\x10\xcb\x60\xc8\x4d\x86\x2a\xb5\x9a\x60\xde\xe1\xce\x4b\x91\xfe\x18\x97\x0d\x5e\x46\x85\x78\x8b\x49\x43\x59\x5b\xab\xe9\x7c\xbd\xb2\x58\x67\x50\xc3\xc3\x0d\xb0\x02\x64\xcc\x5b\x2c\xfb\x50\xb0\xe0\x65\xb2\x51\x07\x51\xba\xb8\xd7\xf9\x81\x40\x86\x0c\x38\x61\x26\x9b\xd9\x48\x19\x8a\x20\xfb\x7b\x0b\x5c\x30\x2d\x84\x9b\x63\x71\x86\xd5\x2a\xcb\xa8\xef\x34\xb3\xda\x28\xbd\x9a\xce\x0a\x61\x5b\xa6\xab\x44\x87\x86\x9b\x6d\x1e\x97\xf2\x7b\x94\x14\xd7\x7d\xc8\x1e\xea\xb6\x50\x25\xe3\x36\x4e\x36\x60\x57\xc2\x4c\x75\xdb\x3d\xbe\xfc\xf4\x49\xf6\x15\x17\x76\xa4\x69\x7a\x0a\xaa\x8e\x86\xe1\xc9\xc2\x92\xdf\x1b\xd2\xd8\xef\x51\x22\xcf\xf2\x75\xb8\xcd\x5a\x71\x11\x83\x1b\x15\xfa\x88\xb1\x0e\x8d\xaf\x29\x1c\x62\x17\x18\x66\x18\x8e\x00\xba\xc2\x33\x1a\x3f\xc3\x8f\x1e\x03\x15\x3b\xe3\x1b\x9e\xa7\xa4\x42\x99\x71\xe1\x62\x42\x1a\x55\xda\x08\x97\x30\x7a\xe9\xa8\xa0\xab\xfa\xa6\x00\xc3\x1f\x65\x22\x56\x50\x9c\x7f\xee\xb7\x3f\xf7\xdb\x9f\xfb\xed\xcf\xfd\xf6\x6f\x7b\xbf\xbd\x16\x48\xfb\xea\x3d\x0c\x21\xc5\x2d\xb1\xe1\x37\xdf\xa1\xae\x45\xcf\xfe\xae\xb5\xfd\x6b\xfa\x72\x06\x3f\xfb\xe7\xde\xf5\x73\xef\xfa\xb9\x77\xfd\xdc\xbb\xfe\x8e\xf7\xae\xfb\x4e\x2b\xbe\x57\x95\xe5\x3e\x77\xc5\x33\xfb\xb0\xd0\xc4\x2e\xc8\x0c\x87\x11\x2d\x84\xaf\xa0\x39\xde\xeb\x03\x39\x71\xe9\xf2\x1a\xea\x4e\x10\x71\x17\xcd\x10\xf9\x65\xf1\x80\x90\xa4\x45\x13\x0d\xb9\x7b\xff\xa1\x04\x00\x6f\x7c\xa8\x75\x3a\x05\xc0\xe5\xc4\x62\xde\x8f\x2c\x03\x09\x62\xda\x91\x62\x70\x0d\x59\xe9\xd4\x36\xe0\xe3\x1d\xb6\x81\x08\x18\x94\x11\x6c\x48\x98\x1f\xf5\xe8\xac\x68\xfa\x7a\x57\x0a\x66\xf2\x9a\xaa\xc8\xc5\xd6\x0a\xbb\x94\x0d\xb4\x92\x4d\xba\x1a\xb6\x58\xc5\x30\x76\xd8\x2a\x53\x0a\x3b\xe1\xbb\x03\xc2\x18\x54\xd1\x82\x73\x5b\xae\xd4\x53\x27\x42\x9c\x3d\x77\xb2\xef\xa8\x14\x22\xfc\x6c\xd3\x53\x8a\x4a\x5c\x21\x1b\x94\x4d\x24\xa0\xa5\xd9\x67\xba\x03\xf9\xfd\xf2\xbe\xd7\x94\xee\x0a\x7a\x3b\x90\x9d\xfa\x09\x39\x08\xa8\xd5\x90\xc5\x45\x1b\xba\x26\xa8\x1c\xe2\xdc\xa2\x0b\xe0\x5c\xab\x4c\x6f\x5c\xa6\xa6\xd0\x93\x27\x96\x8c\x8c\xcb\xf4\x23\x0a\xc0\xfe\x30\x6d\x9e\x29\x77\xdb\xf2\xfe\xb1\xab\x5d\x49\xd2\x3c\x61\xb3\xb3\x6f\xb4\xfa\x2d\x66\xc3\xf3\xd2\x4a\xbb\x45\x5c\xb7\x8b\x69\x91\x5d\x3a\x83\x8f\x6d\x19\x8a\xe9\x87\x3a\x4a\xfb\xe5\x5d\x69\x76\x5b\x86\xfb\xd8\x3a\xd4\x8d\xc5\x6b\x45\xd9\xe0\xa2\x0d\xb6\x34\xc2\x79\xdd\xe9\x17\x8d\xb7\x3a\x44\x4a\x1b\x69\xd1\xc8\x42\x3b\x9c\xdb\x42\x5a\xf3\xc1\x92\xf9\x94\x4d\x32\xf1\x66\xf2\x68\x44\x95\x4f\xb2\x05\x44\x43\x09\x30\x6f\x14\xe4\xa3\x43\xfa\xc0\xc2\x56\xc8\x41\x0a\x66\xfc\xa0\xe3\xe5\xdd\x37\xb7\x64\x8e\xfb\xb9\x48\x7e\x2e\x92\x9f\x8b\x64\xb5\x83\xfa\xe9\xfe\x78\x8b\xd5\xe1\xce\xbd\xef\xaa\x23\xf9\xef\xdb\xd8\xf0\x5a\x3f\xf8\x5a\x43\xc3\x6a\xe7\xe3\x78\xb3\xaf\xcf\x4f\x6e\xf9\x93\x5b\xfe\x1d\x72\xcb\x7b\xe2\x96\xcf\xf0\xca\x47\x34\xc3\xbb\x79\xe7\xeb\x00\xbe\xaf\x2b\x84\xe1\xa4\x42\x48\x9b\x85\x56\xd4\xbd\x7e\x63\x53\x26\xba\xe0\xc4\x3f\xe7\x5f\xfe\xfd\xe5\x5f\x77\x7f\xdd\x7c\xfe\xfc\xf2\xef\xe7\xfd\x73\x0a\x7a\x3b\x06\x4d\xfa\x70\xf4\x7a\xd7\x24\x11\xe4\xb6\xe4\x21\x92\x21\xaa\x23\x24\x9e\x65\x36\xd4\x67\x5b\x22\x43\xc2\x8f\x26\x19\x5f\xa9\x64\x7c\xa5\x0c\x9e\x0d\xdd\x02\x25\x79\x39\x2f\x32\x03\x39\x4d\x5b\xed\x47\x6d\x29\xa6\xe1\x88\x5b\xf5\xfa\x92\x6d\x48\x48\x92\xa6\xc9\x16\x8b\x4b\x58\xcb\xf2\x32\x43\xe4\x69\x40\x45\x31\x06\x6f\x83\xb6\x9c\xda\x00\x88\x26\xe8\x36\x75\x8c\x27\x38\xd6\x7d\xeb\x31\xfa\xd4\xe9\xff\xdf\x3f\xfe\xfe\xbc\x3f\x3b\x1f\x1e\x22\x1a\x74\x35\x55\x8a\xb0\x42\xb5\xdc\xd8\x66\x69\x58\x02\x8a\x23\x20\xdc\x64\x02\xa4\xb0\x2d\xec\x84\x8d\x66\x2b\x41\x37\x9b\x07\xe9\xd7\x83\xa3\x3f\x24\x92\xe4\x79\xf4\x23\xaf\x1e\x61\x4f\x69\x9d\x90\xee\xcb\x47\xfe\x51\x13\xcf\x47\xcd\xda\x33\xa1\x82\x21\xb3\x31\xa1\x21\xae\xd1\x1f\xa8\xd6\x5f\x5b\x0a\xe0\x85\xd3\xc5\xf9\x00\xcb\x45\x33\x1b\xdf\x32\xcc\x17\x83\xf3\xab\x12\x08\xc9\x0f\x0e\xf3\xa5\xe0\xfc\x30\xaf\xe2\x81\xe0\xfc\x29\xcb\x79\x79\x69\x2f\xf0\x9a\x4a\x28\x1b\xc3\x34\x39\xf7\x21\xec\xa6\xe9\xb9\xdd\xf8\xb7\xc5\x06\xfd\x98\x33\x49\x19\x4f\x9f\x2c\xc8\x3e\x10\x6a\x0c\xe0\xd4\xaf\x76\xcf\x70\x73\x30\xce\x05\x69\x2d\x16\xc8\xcc\x64\x28\x43\xd0\xa5\x37\x8e\x3d\x52\x48\x24\x93\xf6\xd6\x37\x01\x2a\x3f\x0e\x25\x24\xe3\x6a\x64\x48\x22\xe1\x0a\x95\xc9\xa5\xeb\x0a\x19\x79\xb9\x49\x75\x94\xad\xec\x38\x06\x10\x51\xcf\x34\xa0\xc0\x34\xf3\xe4\x19\x65\x88\x78\x0d\x34\x89\xec\x8f\xa3\x26\x8e\xfa\xa0\xb8\x24\x61\x9f\x9a\x54\xa3\x7b\x52\xb4\x94\x58\x13\x1d\x10\x32\xd7\x4c\x05\x80\x09\x93\xfc\x42\xd7\x60\x94\x5f\x0c\x7e\x1b\xc1\x1b\xac\xf6\x84\xdb\x82\x70\xf2\x68\x0a\xff\x81\xc2\x03\xb8\xb2\xcc\x35\x51\x72\x4f\xe5\x30\x22\x42\x0f\x73\x32\xbc\xcb\x93\x1c\x0d\xe1\x38\x75\xba\xc1\x31\xf5\xe9\x01\x86\x66\x6a\x3c\xe4\x57\x87\x37\xd7\x74\xad\x71\xf1\x35\xbb\xc9\x77\x46\x5b\x18\x35\x86\xd2\xcf\x70\x22\x97\x98\x97\xec\x2e\x53\x19\x91\x51\x6c\xaf\x70\x35\xa6\x14\x2f\x18\xc8\xbf\x7e\xfc\xf5\x4f\x2f\xff\xfe\xae\x7d\xf9\xf2\xe1\x7c\x5a\x82\xac\x4a\x50\x6a\x23\x50\xb6\x72\x99\x45\x47\x96\xcd\x5c\x13\x16\x81\xcf\x06\x2b\x69\x64\x5e\xbe\x57\xd8\x7d\xf7\x52\xd2\x37\x0c\xf9\xe3\x7b\xd3\xf4\xf5\xa8\x3b\xac\x43\xad\xd6\x4c\xab\x1d\xa2\x0d\x1f\x0b\x8a\x2c\xbd\x7f\xbf\xfb\x8f\xf3\x2c\x34\xca\x76\x9f\xf7\x96\xaa\xb1\xf5\xdc\x50\x43\x7e\x4a\xc3\xfb\xf1\x1b\x85\x86\x71\x4c\x4c\xa5\xa0\xa7\x4f\x56\x38\x6a\x68\x10\xf7\x54\x35\x37\xe6\xb1\x3f\xd3\xfe\x8f\xbf\x5e\x68\xbf\xa1\x58\xe7\x11\x6d\x89\x6c\x46\x71\x7c\xc3\x3c\x16\x55\x59\x1a\xf1\x3f\x3f\x7c\xf9\xfd\xe5\xf3\x79\x22\xa2\xa4\xc4\x3a\x1d\xc4\x03\xed\xa9\xc1\xaa\xa6\xa4\xf1\xc6\x41\x7e\xcf\x07\xb1\x9a\x06\x8e\xdf\x84\x4f\x72\x91\x59\x91\x6c\x8e\x69\x3e\xab\x61\x1e\x90\xbd\x68\x50\x98\xb2\x08\x61\xf1\xc9\x50\xd0\x18\x69\x29\xe0\x21\x69\xf5\xe9\xe5\xe5\xd3\x7f\x3f\x3f\x9d\x18\x8c\xdb\x68\x16\x8f\x7e\xea\x4a\x96\xb0\xee\x8e\x4e\x68\x30\x8a\xfe\x49\x08\x19\x37\xa8\x88\xd0\x9d\x5a\xa9\xe9\xc4\xfa\x3b\x7a\x2f\x68\xbc\xed\x6a\x5e\xb6\x2c\x6a\x81\xb2\xd9\xdc\x5a\x0f\x18\xf5\xb2\xc1\x82\x56\x37\xca\xf8\x4c\x1e\xd0\x1b\x0a\xad\xfe\x2f\x97\x07\xd7\xf6\xc5\x3d\x80\x44\xef\xac\x31\x36\x38\xca\x08\xaf\xf9\x18\x5c\x8d\x38\xd5\xb2\xf6\xee\x30\x96\x87\x34\x0f\x43\x9c\x88\x48\xd5\x59\x98\x8a\xb3\x92\xf1\x62\x8a\xff\xc7\x5f\x16\xd8\x5d\x3f\xe7\xf8\xb1\x39\xae\x74\x8e\x69\x36\x9b\x69\xc5\x89\xfb\x7f\x3e\xfc\xf5\x1c\xe0\x5a\x00\xee\xb4\x35\xd9\xfb\x8e\xa8\x3c\xfa\x63\x90\xf4\xc1\xc7\x3f\xfc\xf2\x59\x24\xb2\x3f\xfc\xf2\xf9\xaf\xfa\xdf\xef\x9f\x77\xbf\x7e\xf9\x5f\x2f\x9f\x3f\xfd\xc3\x1f\xf4\xcf\x76\xf7\xfb\x87\xff\xcb\x7a\x20\xfc\x05\x11\x1c\xff\x97\x5f\x3e\xbf\xfc\xae\xf7\x9c\xff\x2f\x6b\x71\x3e\x56\x6c\xc8\x00\xa9\x85\xc0\x16\x02\x6f\xbc\xe9\xbd\x63\xc8\x99\x0c\xb2\xf9\x2a\x0a\x34\x24\xb7\x1b\x9e\xd9\xa8\x39\xc2\xb6\x0c\x55\x11\x6e\xf2\xf1\x99\xa6\xb5\xa9\x62\xeb\x81\x82\x91\xcb\xe8\x51\xf9\xac\x05\x67\xc1\x6d\x4b\xc2\x1a\x97\x14\x17\xfb\xc0\x7b\x86\x90\x0f\x08\x81\xb7\x94\x0c\xbb\x7d\x68\x28\x8a\xca\x2f\x62\x33\x53\x4d\x09\x52\x68\x2d\x42\x8c\x0a\xd5\x7b\xb0\x04\x0a\x7b\xec\xf0\x60\x59\x73\x81\xb5\x96\x2d\x6f\x51\x0d\x6b\x8c\x3b\x36\x43\xfa\x72\x4d\x81\xba\x75\xa0\xd9\xe4\x86\xfb\x1a\xee\x49\xae\x4d\xe0\x83\x95\xcb\xe8\x51\xf9\x64\xd4\x8b\xd1\x57\xfa\xb0\x95\x5d\x42\xe4\x73\x4a\x70\x13\x56\xd6\x25\x01\xfd\x5b\x52\xcf\x1a\xb1\xe3\x0b\x7a\x1a\x4d\xbe\xde\x89\x05\x8b\x96\xdb\x92\xb0\x6d\x4b\x15\x78\xd2\x2f\x4c\x3f\x94\xcd\xb7\x9a\x6c\x69\x0c\x9a\x04\x55\xd0\x93\x80\x98\xbf\x3d\xed\xbf\x99\x0f\xee\xb7\x3f\x5b\xba\xcd\x29\xf7\x95\xf3\xa5\xef\x63\xfd\x3c\xea\x5d\xf6\x93\x1b\xbf\x2d\x37\xbe\xd7\x63\x6e\x55\xc7\xae\xb3\x98\xae\x97\xc8\x42\x15\xea\x18\x5b\x08\x16\xc2\x57\xa2\x0a\x6f\xc1\x79\x43\x80\x86\x80\x5e\x23\x8b\x4f\x3a\x63\x56\x14\xfa\x6d\xd6\x04\x97\x1e\x82\x1b\x1b\x7c\x34\x97\x76\x6b\x95\xda\x26\x4a\x68\x51\xf1\xd9\x24\xe0\x30\xb6\x7c\x94\x0f\xc0\xc1\xf1\x2c\x40\x5d\x09\x13\x19\xac\x00\xd3\x4d\xa4\x88\xe0\xc9\x22\x04\xdc\x96\x03\x16\x3c\xee\x37\x2b\xc1\x7e\x4d\xe7\xe8\xdc\xbe\xb7\x51\xb1\x78\x24\x1b\xf7\xf0\x07\x04\x55\xb6\x0c\x81\x7e\x4e\xe6\xea\x93\xf9\x13\xe4\xe1\x27\x5b\xf9\x5e\x28\xf1\x07\x40\x97\xd8\x7e\xfc\xb7\xcf\xbb\xcf\x0b\x0d\x77\x6c\x48\x77\xc5\x84\xae\x71\x15\x51\xd1\x74\x12\x8d\xed\x67\xc5\x2d\x02\xc3\x96\x50\x1f\xfa\x26\x41\xa6\xa5\xf1\x5c\xd1\xe0\x62\x8d\xae\x71\x27\x9f\x93\x3c\xe7\x7a\x6c\x8b\x67\xe3\x1b\xa6\xe9\xc1\x55\x3d\xc5\x9f\xd3\xb3\x05\xa0\xd8\x6a\x3e\x67\xc2\x89\xb5\x81\x32\xf8\xd4\x7a\x75\x12\x39\x9e\xda\x56\x83\x2f\x07\xe5\xa7\xf7\x48\x26\x41\xe2\x86\xb1\xf6\x8d\xdf\xc7\xa7\xf7\xa8\x8e\xf2\xe8\x9a\xbc\xf7\x4f\x9f\x12\x78\xb4\x40\x7e\xdb\x71\x03\x86\x4c\x2d\x43\x74\xe5\x2c\x33\x00\xe7\x72\xb0\xbf\xda\xf1\x3b\x41\xf4\x32\x10\x40\x7e\x33\x0f\x63\x71\xc6\x35\xac\x27\x48\x6e\xf1\xac\xfb\x70\x25\xe7\xec\x18\x0d\x23\x54\xb9\xd5\xfc\xdb\x16\x13\x4c\x4f\xf3\x29\x5b\xf0\x49\xd7\x02\x83\xcf\xcd\xc4\xec\x6f\xb1\xc6\xd0\x30\xef\x43\x83\x0e\x42\xde\x52\x52\x80\xbf\x6b\x1b\xb7\x34\x91\xfe\xe3\x4b\x7b\xc1\x78\xa6\x9a\x25\xbb\xbd\x1d\x65\x1e\xb3\x90\x4a\x84\xda\x16\x35\x17\x35\x61\x1d\x26\x4f\xbd\x2c\x69\xd7\x62\x05\x21\x59\x8c\x63\x16\x11\x20\x38\xa3\xa7\xd2\xd5\xd8\x68\x2e\x83\x82\xda\x1d\x54\x0e\xef\xf6\x7e\x7c\xd8\x23\x2f\xb0\xbc\x20\xbc\x24\x68\x30\x4e\x1a\x97\xda\xb5\xf2\xe9\x7d\x2e\xcc\x63\x0f\x19\xb7\xc5\xe7\x07\x43\x8d\x19\x7c\x1e\x37\x50\x99\x91\x54\x16\x21\x25\xe3\xd4\xc1\x26\x6f\xa3\x36\x22\xd7\xe8\x80\xc6\x35\x27\x8d\x04\x7b\xd4\x0d\x61\x84\x0b\x04\x49\xb8\x76\xde\x80\xcb\x3d\x2c\x50\x65\xb8\x12\xbd\x45\xc3\x40\x1c\xed\xc0\x0f\x58\x5a\xe0\x8a\xaa\x5f\x8e\x81\x30\x4e\x3f\xf3\x10\x0d\x55\xfb\x08\x21\x6e\x03\x04\xc3\x0c\xe4\x77\xe0\xa9\xcf\x22\x56\x19\x70\x01\xa2\xdf\xf3\xa8\x50\xa3\x81\x50\xc2\x59\x34\x37\x75\xf2\x93\x0a\xe5\x59\xd2\x04\x4f\x29\x6f\xb9\x52\x0f\x1a\x48\xb4\x68\x6f\xe9\xc6\x2d\xab\x62\x7a\xd0\xf1\xf9\xc3\xaf\x17\x3c\x49\x34\x40\x4e\x58\x23\x62\x89\xff\x51\x36\x94\x36\x59\xb6\xfa\x7c\xdc\xef\x35\xc7\x1b\x41\xcc\xb2\x91\xb0\x03\x9f\x8d\xd0\x8e\x5e\xb6\x09\x62\x10\xde\xe9\xb3\xd1\x9d\x5a\x63\xa5\xe4\x65\xfd\x4c\xca\x8a\x46\x2f\xdd\x42\x97\x1a\x4a\x6d\xdb\x52\x73\x09\xd3\x1b\x9d\x50\x68\x36\xf7\x56\xb4\x25\x55\xb4\xc6\x3c\xf5\xd8\xe0\xa7\x4f\xd6\x43\x90\xed\x3b\x84\x6d\x97\x82\x3e\x69\xf4\x27\xf8\x08\x18\x76\x51\xea\x8c\x7d\xc5\x68\x33\x30\x5a\xbd\xa3\xff\x3a\xca\x43\x75\xa6\x4b\xad\x83\xa0\xe9\xed\x50\x0b\xd4\xa2\xb7\x19\x92\xdc\x43\x3f\x2f\xcb\x24\x70\xd2\x29\x0c\xad\x4c\x31\xf8\xb8\x65\xd9\x7f\x0d\xc5\xdb\x12\x5b\x9f\xa2\xe2\xd1\x26\x4a\x11\x90\xcb\x3e\x4a\x11\xaa\xac\x7b\x29\x02\x9f\x33\x03\x20\x02\xe1\x2f\xf2\x15\xdd\x69\x85\x7d\xf5\x60\x9a\xd5\x95\x8b\x64\x47\x0c\x51\x8d\xe7\x61\x97\x64\xb2\xf5\xd2\x71\x50\x92\x95\xe4\x8b\x50\xe3\xbb\x0b\xb2\x61\xc0\x60\x64\x19\xcd\xbf\x50\xee\x62\x90\xb6\xa5\x6c\x2e\xde\x57\x22\x88\xe9\xa5\xdf\x11\xbd\x52\x85\x17\xc5\xdc\x8b\x5c\x3b\x7d\x3e\x6a\xdd\xd3\x7b\xca\x86\xf2\xae\xc4\x3f\x16\x57\x3e\x2c\x07\x89\x9b\xf1\x3d\xb5\xf9\xcb\x9b\x77\x2f\xb0\x7f\xfc\x4b\xdb\x7e\xf9\xf0\xd7\x0b\x27\xd1\xc9\xd0\x0e\xbd\xca\x0b\x7e\x10\x18\x84\xae\x3d\xf8\xdc\x16\xa6\x9c\xc2\x0e\x9d\x76\xc7\x95\xfe\xe8\xf9\xba\x0c\x8b\xfa\xd1\x06\x0b\x31\x6d\x50\xcf\x49\xba\x23\xe7\x74\xfb\x09\xe8\xb9\x59\x55\x30\x71\xf4\x10\x77\x58\x09\xc1\x97\x6b\xe7\x40\x06\x6c\x13\x50\xd8\x62\x10\xa1\x36\xcb\x6a\x16\x91\x9b\x5c\x37\xa2\x2a\x3e\xf0\x7a\xa8\x31\x49\xd4\x93\x2a\xef\x4a\xa8\xe2\x10\x3e\x69\x9d\xa8\x9c\x2a\xc7\xaa\xc1\x29\x3d\x57\x46\xe4\xfa\xca\x08\x3f\xa8\x0c\x50\xdc\x78\x08\xc2\x96\x34\x9f\x54\x37\x46\x22\xf6\xe3\xde\x02\x39\x51\x11\x1c\x1b\xd4\xe8\xc7\x68\x5c\x4f\x36\x25\x1d\xbd\x54\xb9\x16\x5a\x4c\x02\x15\x2a\xd8\x4d\xf7\x02\x0f\x7a\xd6\x03\xd4\x7a\x19\x49\xb9\x8c\x3d\x07\xb3\xc1\xe2\x7c\xcc\xba\x56\xa8\x11\xc9\x6d\xb2\x63\xa0\xb7\xc2\x32\xa3\x2c\x1a\xcd\xc6\x3b\x7e\x98\x3c\xb0\x3f\xb8\x9a\xa7\x9b\x8c\x87\x74\xcb\x69\xfd\x29\x9f\xb3\x91\x4b\x85\xf0\xd7\xe4\x4f\xe8\x34\x6c\x79\x33\xe4\xfa\x55\x21\x53\x87\xd5\xc9\x0c\xb9\x32\x4d\xfd\x84\xc8\xb3\x51\x5e\x60\x32\xe0\x7d\xcb\x86\xc7\x92\x46\x57\xd1\x1a\xa2\xe0\x2b\xab\x0f\x65\x37\x87\x94\x37\x58\x5c\x24\xf5\x5a\x08\x3b\xc8\x36\x8c\x1e\x78\x4b\xea\x34\x5e\x74\xe5\x57\x96\xe0\x3d\xde\x3e\xea\xd2\x9b\xdd\x46\x74\xba\x68\xca\xb5\xab\x21\x98\x24\x4d\x94\x41\xd4\x44\xad\xa6\xda\x78\xd9\xe7\xf4\xd2\x39\xdd\x10\xa0\x28\x74\xcf\x42\x21\xa4\x1e\x3b\x5c\xa6\xfe\x16\xff\x9a\xbb\x69\x99\x54\xa0\x02\xf6\x9b\xf1\x64\x77\x67\xb8\xe8\xc0\x85\xaf\x40\xd1\x67\x7a\xe6\x96\xae\x87\xbb\xcf\x7f\xfe\x70\x41\x10\x4f\x86\x26\x53\xcc\x4e\x69\xb6\xbb\x53\xf5\x93\xae\xa9\x67\x36\xe8\x0c\xf6\x5c\x90\x49\x5f\xec\xee\x74\x5c\xe5\x26\xae\xf8\x1a\x15\x47\x20\xa1\x90\xa4\xdc\x79\x38\x64\x97\xdf\xc9\x4c\xd9\x76\xd7\xcc\x08\xda\x50\xaa\x84\x65\x0b\xc7\xee\x4f\xdb\x45\xf6\x29\x9e\x4c\x58\x2e\x47\x36\x18\x6f\xf2\x8f\x7c\x8d\x91\x2b\xf3\x5d\x70\x65\x8d\xed\x97\xda\xc6\x0f\xaa\x11\xbb\x96\x56\x67\x88\x71\x33\x65\x1f\x58\xb8\xf4\x9c\xaf\xac\xc8\xc1\x47\x72\x17\xa6\x22\x74\xc9\xff\x9f\xff\xe1\x0f\x4e\x45\xaf\x35\x98\x51\x54\x1f\xfa\xc5\x4a\x27\x05\x42\x28\x53\x39\x5c\x47\x53\x99\x58\x46\x05\xc3\x62\xf9\x53\x27\xf7\x9a\xf1\x83\x7e\x4c\xe4\xd9\x1a\x1c\xea\x86\x75\x41\xa5\x83\xa8\x10\x20\x7a\xed\xda\x99\xf5\x4e\x2a\x36\x96\xee\x7a\x6c\x69\x3e\x61\x81\xb8\xda\x1f\xf0\x9f\xda\xdd\xa7\xf3\xf2\x17\x23\x68\xec\x42\x08\xcf\x16\x01\xb3\x55\xfb\x75\x54\xab\x80\x88\xf6\xa3\x3f\x27\x16\x82\x28\xc2\xa6\x0d\x32\x17\xc1\x59\xb6\x1e\x28\x2d\x5e\xf8\xa3\x07\xa7\xa1\x56\x8a\x8c\xad\x42\xb1\xdf\x64\x60\x23\xff\x7a\x2b\x10\x89\x56\xf1\x8e\xa5\x97\x91\x64\x8e\x82\x29\xb8\xce\x21\x2a\xf6\x2b\x81\x4b\xef\xd4\x12\x27\xf7\x59\x5e\xd4\x2b\xa9\xd0\xd7\x59\x71\xe5\xda\x15\x38\x74\xe8\xe9\xbd\x7e\x6b\x58\x73\x8d\xc7\xf8\x2e\xc9\x5b\x4c\x46\xdd\xd0\x45\x35\x2a\x75\xef\xa2\x88\x3e\xb1\x80\x39\x14\xd3\x22\x06\xeb\x00\xf9\x19\xa2\x42\x68\xe8\x72\x92\xa1\x20\x55\x7f\xbc\xd5\xe4\x10\x2d\x9b\x69\xaf\x0d\xa4\x08\x1e\xf7\xd5\xf4\x96\x05\x8f\x5b\x69\x4a\x36\xfe\x19\x87\x20\xa0\xa0\x16\x1e\x2c\x06\x55\x24\x08\x13\xe1\x51\x51\xfb\xb1\xf4\xf2\x1d\x2b\x5f\x4a\xaa\x3f\x75\x96\xc9\xae\x67\xab\xb9\xce\x79\x99\x30\x42\x88\xfc\x6c\xb5\x87\x65\x0c\x38\xd9\x08\x09\x8f\x7f\xed\x20\x41\x1a\x26\xd9\x09\x11\x38\xd5\x18\x0b\x94\x8f\xd0\x8f\xcb\xd3\x97\xd8\x9b\xaa\x18\x7d\xc9\x29\xe0\x86\xdc\xd1\x4b\xbf\x97\x89\x72\xaf\x29\xce\x73\xb9\xf4\x66\x3c\x23\x33\x37\x3a\x70\x84\xc4\x56\xde\x8d\xa9\x5c\x3a\x1d\xd5\x07\xa1\x37\x6e\x09\x92\x36\x54\xad\x34\x52\xe4\xa8\x1d\xc5\x3d\x49\x64\x80\x28\xf5\xe9\xa5\xfb\xdc\x59\x48\x5b\xaa\x54\x5f\x0b\xad\xf2\x5f\x51\x59\x77\x4e\xd6\xa4\x2b\x8b\xb4\x37\x10\x11\x44\x1c\xec\xeb\xca\x5f\x5c\x30\x94\xf7\x04\xc8\xbb\x00\x41\xd4\xfb\x70\xac\x12\x45\x2e\x8f\x4e\xa4\x25\x5f\x2e\xbd\x0d\xed\x71\x5f\xf0\xc5\x12\x66\x7a\xc3\x25\xec\x78\x58\xc2\x78\x72\x0d\x53\x78\xae\x8c\x2f\x80\x21\x49\xf6\xcf\xe0\x4d\x92\x31\xcd\x10\x4f\xae\xe2\x04\x81\xba\x85\xec\xdc\x85\x85\xcc\xa2\xae\x62\xbf\x90\x1d\x78\xd1\x51\x82\x70\x94\xe3\xd9\x9b\x72\x56\x87\x3b\x15\xad\xf5\xd2\x4f\x99\xb7\x04\xec\x5a\x06\xf6\xea\x05\x70\x14\x97\xd0\x28\x22\x55\x8b\x1d\x39\x45\x8d\xb0\x4c\xcf\x5d\x0e\x69\x3d\xab\x66\x1b\x0b\xac\x7f\xf7\xd7\xf4\xeb\x68\xaa\x2f\x0c\xc1\x04\xa1\x39\x79\x47\x97\x81\x6c\x42\xc2\x19\x06\xba\xa1\x68\x64\x79\x85\x77\x14\xbb\xa5\xab\x12\x51\xdf\xa7\xbb\x75\xeb\xfa\xe5\x2f\x9f\xff\xac\x5f\x9e\xf5\xd0\xcd\x7a\x00\x12\x1a\x72\xa2\x57\x04\x99\x8e\xd0\xa7\x09\xae\x2c\x41\xc8\xd6\x03\x2b\xe4\x0b\x25\x8b\x9b\x00\xac\xdd\x19\xa0\x6f\x64\xff\xd9\x57\xbb\xa0\x79\x84\xd5\xd3\xa7\x5f\x8a\x81\xda\xe1\xa3\x49\xb1\xea\xb0\x88\x50\xe5\xc6\xed\x79\x16\x41\x36\xd6\xe9\xa2\x71\x7b\x3e\x44\xd1\x66\x17\x25\x14\xd9\x87\xb9\x2d\x27\x6b\x8b\x76\x09\xe7\xec\xda\x25\x1f\xd2\x10\x5d\x6b\xa4\x5d\x76\xf8\x6a\x5a\x2c\x2a\x96\x4f\xc6\x86\xa9\x8e\xf3\x48\xbc\x3c\x73\x2b\x7c\x8f\x54\xde\xde\x39\xe1\x26\x6e\x04\x74\x0f\x29\xc9\xb2\xee\x07\xe0\xc4\x0b\x98\x14\x22\x6a\xb4\x0d\x04\x6f\x21\xbb\x06\x23\xf0\xd8\xd4\xde\xdd\x97\xaf\x63\xb9\xf4\xaa\x23\x66\x29\x62\x98\x99\x45\x1d\xd4\x0f\x72\x4d\xae\x8c\xe2\xec\x15\x8d\x73\x35\xda\xce\x6e\x40\xf6\xd5\x89\x77\x30\x4d\x5a\x2a\x2d\x82\xec\x0e\x28\x5a\xcd\xa4\xfd\x27\x9a\xa9\x40\x5a\xd2\xca\x6e\xc0\xe7\x8d\x24\x77\x1c\x70\x5c\x6f\xaf\xfa\x1a\x54\xbd\xd3\x53\x82\x30\x00\xbe\x19\x19\x6c\x8b\xe5\xf0\x7f\xc7\x72\x9f\xfb\x87\x68\x21\x26\xab\xc7\x29\x10\x08\x5c\xf8\xc6\x03\xdd\xfc\x20\x74\x4b\xe0\xfc\x56\x14\x1e\xf3\x43\x71\x86\x9f\x19\x7b\x6e\xf5\x50\xf8\x5a\x0b\x76\x22\x7d\x11\xf8\x28\x52\x7c\x38\x9b\x48\xfd\x20\xc2\xff\xf7\xce\x35\x7f\x9c\xc5\x7c\x32\xfb\x66\xfe\xb1\x76\xfd\xbf\xa5\xec\x48\x3a\x06\x6e\x4f\xb3\x30\xfe\xbd\x1d\xee\x94\xbb\x37\x49\xa0\x17\x52\x0e\x89\xbe\x3e\x2e\xbd\x1b\xe4\xfd\xb4\xba\xe5\x20\xdf\x63\x73\x21\x3d\xf5\x47\x0f\x21\x6e\x82\x28\xd0\xe1\x78\xd0\x45\xbe\xcf\x0a\x55\x8b\x9e\x1e\x0e\xbe\x20\x72\xce\xde\x12\x2a\x75\x5a\x8a\x0a\xe2\xe5\xda\x3f\xcb\xa8\xe0\xfb\x07\x51\x83\x77\x8b\x17\xec\xf0\x82\x99\x15\x6b\x87\x62\xb5\xd6\x9a\xbc\xac\xdf\xb4\xa8\x5e\xdf\xb3\xa7\xab\xd7\xd2\xad\x62\xff\xcb\x4a\x55\xeb\xfb\xbc\x81\xc7\xee\xaf\x61\xc7\x7e\x74\xf2\x1e\xf6\xcb\x2b\xa4\x3a\x95\x08\xe4\xde\x15\x74\xfa\x30\x3a\x13\x12\x78\x3d\xde\xa7\x78\x72\x96\x56\x9e\xcd\x25\x35\x99\xe1\x8d\x16\xd8\x02\xc5\xbd\x6c\x6b\xe7\x1c\x4c\xb7\xa4\x06\xa9\x95\x68\xfb\x04\x6d\x8d\xc6\xe3\xd6\x01\xff\x51\xb0\xb7\x5f\xeb\xc7\xed\xb8\xdb\x8f\xaf\xa0\x7b\xfc\x09\x4f\xac\x9f\x73\x9b\xf0\xde\xe2\x75\xab\xe9\x21\xbc\xa1\xc2\x97\xca\x5a\x7a\x68\x25\x6c\x02\x90\x37\x7a\x19\x33\x75\xaf\x1d\x8b\xe5\xd2\x49\x4b\x04\x7e\xad\xd5\xb0\x06\xa7\x5f\x6e\x47\xc7\x31\x59\x11\x22\x69\x35\x57\x52\x77\x95\x2b\xe9\xff\xfb\xb2\x79\x7e\xfe\x70\xc1\xd4\xf4\xdd\x1e\x0e\x52\x54\x3b\xbb\xaf\x13\x24\xbf\x29\xc7\x2b\xfd\xe9\x8a\x88\xa3\x28\x6c\xe2\xa0\xce\x70\xf3\x87\xf2\x85\x21\xac\xb5\x88\xc5\x53\xca\xc5\x18\xda\x68\x09\xcb\xc7\x5d\xbd\x4f\x9f\x84\x88\xd5\xf8\x0a\xe4\x7b\x82\x56\xaf\x53\xa0\xd2\xaa\xc5\x03\xf9\x57\x8a\x9d\x3c\x32\xdd\xa3\xd2\xa0\xc5\x23\xb8\x09\x7a\x60\x95\x23\xad\xf7\x94\x35\x22\xb8\xaa\x75\x0c\x20\xf9\xe3\xc1\x55\x98\x0c\xcf\xf4\x91\x8e\x55\xa8\xf5\xeb\xdd\xe4\x51\xf9\x51\xe6\x63\xf2\xa0\xaf\xe9\x6e\x73\xe9\xff\xf8\xfc\xe7\xdd\xaf\x1f\xff\x73\xf7\xfb\xc7\x97\x65\x34\xfe\x4b\xfb\xd7\x3f\xbf\xfc\xfa\xcb\x6f\x2f\x1f\x7f\xfd\xfd\xcb\x3f\xfc\x21\x43\xfa\x05\x13\xa4\x5f\x28\x00\x8d\xfe\x22\x51\xbb\x7e\xa1\x28\xbf\x8f\x7f\x62\xec\x5f\x1a\xfd\xe5\xba\x1f\xfd\xff\x72\x49\xe3\x3f\x4a\x01\x79\x28\xaa\xaf\x73\xad\x43\x71\x67\x88\xeb\x39\x3a\xc3\x1c\x0b\x61\x0c\xdf\xa0\x58\x08\x34\x76\xd1\xd6\x32\x9e\xde\x3b\xc3\xd8\x90\xaf\xd1\x1d\x6e\x86\x42\x38\x7b\x68\x41\xd2\x3c\xa2\x57\xda\xb7\x40\x91\x99\xb4\x4f\x0b\x51\xd4\x94\xd2\x40\xa6\x9b\x1a\x78\x51\x26\x56\x77\xf0\x9a\x78\x56\xff\x1c\x71\x1b\x79\xde\x83\xf1\xf8\x49\x19\x4f\x9f\x2a\x9b\x6a\xe2\x43\xa8\xf1\x16\xdf\xc7\x93\xde\x46\xdf\x2f\x9d\xde\xa0\x34\x0e\x50\x65\x73\x0c\x2d\x74\xc7\xe0\x4e\xac\x4a\x68\x27\x95\xd0\xce\x2b\xc1\x8c\x2e\x22\xa3\x2d\x60\xc1\x1e\xaf\xef\x14\x09\x0d\x20\x4d\xa8\xf5\xad\x59\xdd\xd2\x67\xe7\x1f\x77\xed\xee\xd7\xe7\x0b\x20\x2d\xce\x30\x8f\x41\x14\x3a\xb8\x18\xf7\x18\x5c\xcc\xb9\x2e\x47\xed\x72\x3e\x89\x8a\x46\xe0\xd7\x42\x86\x48\x26\xd6\x63\xef\xfb\x64\x7c\x4d\xe9\xee\x2e\x5d\x56\x8e\x03\x64\x3d\xe1\x8c\x79\x17\xcb\x21\xdf\x90\xd6\xc3\x43\x42\x4b\x90\xd4\xf2\x6f\x41\xf4\x0f\x9f\x35\xd9\x07\x04\x48\x3b\x2f\xda\x88\x3f\xaa\x24\x09\x1c\x99\xaa\x3d\xbe\x6a\x4a\x5e\x90\x00\x69\x33\x2b\xda\x8c\xaa\x5d\xcb\x45\x91\x2b\xd1\xec\x30\xab\x7b\x7e\x7f\x32\x8e\x16\x22\x5b\x70\x69\x5b\x6a\x54\xbf\x35\xe9\x93\x2f\xa7\xe0\xa3\x17\x51\xf3\xbc\x04\x27\x6f\x92\x28\xa3\xf2\x94\x8f\x07\x9d\x0a\x5b\x5b\xb5\x0c\x3e\x99\x04\x14\x66\x95\x88\x2e\x76\xcb\xac\x9c\x82\xdf\x1b\xfa\x92\x45\x31\xd6\xd1\x59\x8c\x9c\x9e\x3f\x13\x42\x3f\x29\xdb\x12\x84\x91\x21\xb7\x0f\xcf\xca\xb1\xda\x1b\x3a\x12\x5e\x03\xe4\x0c\xe7\x27\x45\x2b\x94\x39\x11\xa1\x49\xc1\x33\xe3\xe9\x39\x49\x90\xfd\xd9\x39\xd9\xa2\x7e\x8a\xfc\xe0\x94\xc4\x05\xff\xf9\xef\x7f\xfa\x47\x51\x18\x2e\xea\x05\xb4\xd3\xc3\x71\x57\x86\xb1\x8b\x0f\x67\xbd\x6c\xc6\x4f\x7a\xb1\x52\xb4\x04\x1b\x20\x85\x1d\x95\x44\x3b\xa1\xf3\x93\xb2\xc3\xef\xcd\xf8\x49\xa7\x33\xa0\x2f\xba\xfe\x5a\x58\x52\x6e\xbe\xd5\x87\xd9\x56\x1f\xf7\xe9\xe9\x3d\x55\x26\xd7\x18\x1a\xb7\xbf\xa5\xee\xcb\xec\x2d\x18\xae\x9a\x02\x09\xab\xee\xab\xd0\xc3\x04\x59\x85\x22\x8e\xbc\xc9\x90\x8d\xfc\x3b\x0e\x9a\xfa\xad\xcc\x6e\x57\x42\x5a\xa4\xa5\xe8\x54\xf3\xb1\x14\x88\xdc\x70\xb5\x47\xd0\x08\xcd\x14\x37\x09\x58\x63\x2c\x47\x03\x5a\x80\xdc\xe6\x0f\x02\x38\x43\xe0\x73\xc3\x0b\x59\xfc\x6e\x16\x9b\x4c\xa8\xc9\x35\x69\xef\x1a\xa6\x3a\xe9\x1f\xa1\x4e\x23\x51\x2a\x98\xd4\x4c\x85\x41\x43\xf5\x14\xd3\xd1\x52\x93\xa6\xc8\x62\xb7\x08\x83\x97\x9d\xbb\xbf\x0f\x2a\x5e\xe1\x8c\xf1\xcd\x69\x42\xcf\xf9\x56\x23\xdd\x37\x4c\x5e\x58\xcc\xa9\xea\x93\x18\x86\x25\xdc\x24\x20\xd7\x92\x65\x70\xa1\xb9\x82\x01\x38\x08\x6e\xc3\x10\x82\xe1\xd1\xb1\x58\x29\xfa\x0d\xb3\x17\x2a\x99\x3c\xb8\x56\xa4\x84\x7b\x9a\xe8\x7e\x10\x23\xef\x35\x7d\xf1\x37\x1b\x7a\xbf\x1b\x4e\xf0\x28\x46\xcd\x7a\xfb\xdb\xe3\xf9\xcb\xfe\x46\x78\xd2\x0a\xd9\xcf\x18\x88\x1e\x5c\xd6\x0c\x7e\x13\xc1\x65\x13\x7b\x57\xda\x02\x8c\x2f\x45\xff\x2d\x24\x4a\x3b\x15\x87\x10\x21\xc6\x2e\x14\x41\xd4\xfb\x35\x60\x8f\x17\xab\x23\xce\x0d\x3d\xfb\xd3\x79\x06\x6e\x8d\x1e\x78\x95\xf8\xdf\x96\x7a\xef\x3b\x2f\x16\x79\x8d\x9b\xb4\xf7\x3d\xb1\xfa\x37\x91\xd7\x2e\x99\x41\x5e\xdb\xd8\x35\x2d\xa5\x5f\x6e\xe2\xcb\x79\x5c\x30\xb6\x87\x0e\xb5\xef\xa2\xcf\xc7\x4f\xb1\xbf\x07\x32\x7a\xfc\x68\x78\x2a\xd8\xdc\x47\x54\xa7\x04\x9b\xeb\x4f\x7c\xbf\x6f\xa1\xe6\xb5\x7e\x5c\x2d\xd0\xdc\x49\xa5\x0f\x9d\x52\x3f\xc2\x55\x1f\x4d\x84\xf3\x7d\x2c\x8f\x87\x93\xe1\x8c\xe5\x83\x3b\x57\xc7\x2d\xf2\xc1\x2d\x89\x73\xde\xea\x80\xfa\xac\x5c\x30\xb1\x43\xfd\xcf\x0f\xbf\x7d\xd8\x9d\x8e\x5d\xbd\xc1\x1e\xa4\xbe\x14\x46\x43\x65\x36\x0c\x18\x0d\x97\x20\xc4\x62\xfa\xc3\x68\x10\x6b\x4a\xe0\x34\xe8\x29\x19\x07\x7e\x96\xcc\x24\x68\xea\xed\x2d\x97\x58\xcc\x4a\x44\x53\x9f\x0c\x43\x35\x02\xc4\xb7\xc7\xf7\xa4\x2c\x93\x6b\x29\x7a\xe3\xa5\x7c\xdf\xd7\x57\x19\x57\xda\x71\x08\x80\x2d\x59\x52\x43\xdd\x69\xe2\xb8\xc1\xe8\x54\xcc\xc0\xc2\xbd\xd2\xb2\x87\xc2\x77\xd8\x90\xaf\x23\x84\x56\x3a\x68\xa7\x1d\xd4\x86\xdb\xd2\x41\xc8\xf2\x7e\x1b\xc0\xcb\x36\x9b\x71\x36\x0c\xe5\xad\x08\xb2\x16\x6a\x2d\x77\xd1\xbf\x12\x02\x93\xfc\xc1\x4a\x0f\x35\xae\xab\x74\x71\x1a\xbd\xf8\xb1\xfd\xf0\x7f\x7f\x7e\xf9\xcb\x6f\x6b\x4c\x2d\xa3\x61\x57\x23\xcf\xf3\x57\xe0\x34\x71\x43\xcd\x38\xcd\xdc\xd0\xf0\x38\x00\x5f\x4b\xd1\x8c\x20\x4c\x35\x57\x0d\x52\x2d\x9c\xfa\xf4\xa1\xc8\x0d\x73\xa3\x79\x3d\x0a\xe8\x69\x38\x9e\x19\x4d\xf2\xca\x3c\x56\x07\x8f\xeb\xa0\xea\x4d\xea\x70\x93\x3a\xdc\xb5\x75\xdc\x34\x9b\xbe\x5f\xa8\xe4\x34\xfc\xa5\xe1\x19\x3c\xd5\x38\xdb\x8d\x33\xdc\x90\x9f\xc1\x8c\x85\x47\x97\x52\xf8\x43\xb7\xad\x18\x4a\x4d\xaa\x29\x35\x71\xd6\x86\x71\x42\x92\x64\x62\x33\xcd\x75\x61\x70\x8f\x57\xb5\xe1\xbc\xf6\xd2\x11\x34\x56\x63\x82\xd6\x74\x40\xcd\xd8\xbb\x5b\xfb\xcb\x38\x87\x55\xc3\x71\x0a\x12\x29\xe5\x49\xf6\x17\x0a\xa2\xea\x93\xab\x29\x3d\x7d\xaa\xac\xd3\x5f\xd5\xf8\x17\x06\xf9\xf5\x40\xcb\xe9\x2b\x4d\xde\x79\xbd\x66\x95\x89\x9b\x30\xa9\x7f\xde\xfd\xf6\xe1\xf3\x73\xfb\x71\x15\x26\xa5\xc7\x51\x4c\x10\x36\x01\xd8\x04\x18\xa0\x73\x0d\x57\x0a\x31\xa5\xf9\xfe\x91\x37\x41\x0f\x85\x86\x5c\xe8\xc2\xbe\x49\xee\xc4\x58\x2e\xfd\x67\x84\xe0\xb6\x98\xc1\xab\x57\xda\x4e\x3d\x15\xd3\x28\x1a\x81\x3a\xa4\x89\x4d\x32\xbd\xaf\x69\x09\xc0\x76\x6e\x97\x4d\x27\x22\x58\x82\xa8\xbe\xf8\x5b\xd4\xf4\x87\x8c\x10\x86\x4c\x6a\x0a\x67\xc1\x15\x60\x12\xb1\x36\x15\xd0\x9b\x34\x4a\xa1\xc9\xd4\x95\x17\x4c\x9f\xac\x13\x21\x6a\x80\xb1\x99\x87\x83\x64\x60\x07\xec\xb7\x5e\xe1\x25\x15\xf5\xcb\x95\x08\xf2\x98\x06\xb2\xd0\xbe\xee\x1c\x90\x86\x69\x8e\x40\x01\x9d\xe1\x16\x90\x01\x79\xe7\x20\x68\x4c\x43\x1f\xc1\x15\xc0\x5b\x4d\x44\xe6\x65\x9c\x0a\xaa\x88\xf4\x4a\xfe\xf5\x82\xb7\x41\xb7\x1b\x40\x3b\x7a\x01\x30\x64\x8b\x7a\xee\xa7\x19\x2c\xe5\x52\x1e\x30\x84\x00\xc8\xad\x2d\x10\x12\x78\x74\xf4\xc4\x21\x89\x0e\x6d\xa9\x52\xf1\x5e\x23\x34\xc8\xe8\x65\x30\x50\x25\x9d\x48\x07\xcc\xc6\x8d\x72\x42\x26\x69\xc6\x2c\xc8\xb5\xa0\xc9\x30\xb0\x82\xe0\x50\x92\xf1\xf6\x69\x23\x7b\xaf\x6e\xc0\xdd\xb7\x03\xf5\x2c\x88\xf4\x8f\xfb\xcf\x1f\x7f\xfd\xdf\xab\x6c\xa3\x32\x7a\xea\xac\x8d\x6d\x06\xf2\x56\x0f\x2f\x4f\x25\x10\x22\xec\x00\x04\xdd\x34\x4b\x47\x83\xb1\x66\x9a\xc7\x5e\xac\x22\xdd\x38\x83\x79\xe6\x81\x9b\xc1\xe7\xad\x8e\x2f\x57\xc7\x96\x76\xa2\x4a\x9f\x9a\x48\x69\xcd\xe1\x14\x92\x52\x9b\x9a\x17\x43\x59\x7c\x21\x3f\xfe\xdb\xc7\xf6\xe3\xef\x7f\xc5\xf3\x67\x9f\x0e\x9c\x93\x95\x92\xdd\x2e\x02\xa3\xd1\x4b\xd5\x79\x0e\x44\x8b\x08\x29\x6d\x23\xa8\x07\x24\x04\xb7\x9b\x86\x55\x0b\x15\xeb\x05\x35\xe7\x6a\x05\xcc\x9b\x21\x71\x52\xbf\x78\x8f\x55\xac\x08\x05\xc0\x22\x9e\x86\xb8\x73\xa2\x05\x39\x18\xd2\x96\xb8\x12\x16\x8d\xb8\x19\x3f\xd1\x81\x1a\x3e\x7a\xfa\x24\x2b\x8d\x78\xa7\xc8\x3b\xd4\x7f\x2c\x0b\x07\x15\xa9\x93\x36\xe3\x27\x55\x49\x2b\xc2\xc1\x44\xb8\xe5\x4c\xfd\x95\x03\x54\xf0\xa1\xc0\xb8\xee\xad\x9f\xe4\xeb\x72\x50\xf9\x96\x0b\x46\xb3\xf7\x3b\xc5\xd2\xa3\xfe\xb8\xbc\xac\x75\xa7\xa1\x68\x22\xfc\x4e\x93\x1b\x2a\x88\xe9\x56\x91\x3a\xb2\x2c\xbd\x23\x99\x64\x08\xc1\x4c\xd2\xce\x40\xcc\x0a\x44\x30\x8a\xbd\x42\x61\x3e\x22\x56\x47\x2b\xab\x58\x04\x6f\xf5\x2c\x8e\xd6\x43\x95\x8c\x87\x98\xf6\xd5\x6e\x06\x2d\x28\x12\xb8\xe8\xab\x89\x5b\x54\x80\x2e\x70\x42\x04\x2c\xa4\xd4\x8f\x5e\x25\x4b\x9e\x12\x24\x6c\xfb\x74\x8a\xbc\x9b\xc3\x0a\x2a\xe0\x64\x05\x55\xd8\x0b\x47\x6d\x6d\xd9\x25\xfc\xa4\xcd\x8a\x32\x89\xb8\x9f\x66\xfe\x54\xac\xcd\x16\xb2\x8d\x10\x68\x32\x96\xbe\xe0\xae\x1d\x57\xcb\x71\xd8\x9f\x3e\xd9\x00\x1c\x6d\x94\x3b\x0a\x04\x29\x5a\xc1\x4e\x86\x25\xf6\xb4\x0b\x0e\x7c\x86\x84\x3d\x2e\x8f\x0c\x10\x84\x2c\x5b\x55\xf4\x06\xe3\x46\x35\xae\x7c\xd4\x18\x30\xa8\x75\xe8\x16\x2f\xd7\xcb\x2e\x7e\xae\x03\x42\x7d\x65\x7d\x06\xff\xca\xfa\x6c\x87\x04\xa8\x74\x6a\x85\xf6\x95\xac\x12\x67\x15\xa4\x39\x04\xb8\x63\x59\x40\x7c\x5c\x9c\x5c\xb0\x17\x90\x36\xe3\x27\xdd\xbc\x94\x6f\x56\x89\xbc\x0a\x8a\xa6\x24\x93\x5c\x8b\x64\x11\xff\x8f\x05\x46\x0b\xcc\x16\x42\xd0\x70\x41\x05\x0b\x71\xe5\xbc\x0b\x9d\xd1\x4b\x47\x33\x9e\x2d\x03\x45\xd9\x14\x75\x94\xb8\xad\x4c\x25\x22\x45\xe5\x8d\x1f\xe3\xb1\xea\x82\x43\x59\x70\xa8\x28\xb8\x09\xa6\xb9\xe2\x48\xd6\x82\x4f\xa3\xf5\x44\x90\x14\xc0\x95\x65\x7f\x54\x4a\xe1\x2c\x33\xa6\x53\xc6\xc3\x72\x72\x4e\xd3\x67\x1f\x97\xca\x72\x39\x45\x7f\x5c\x4e\xdd\x92\x9b\x2f\x27\x62\x79\x11\xd3\x9e\x20\xba\x33\xab\x29\x3e\xbc\x9a\xfa\x81\xbe\x1b\xfb\x67\xb2\x51\xd1\x79\x10\xa0\x4a\x6d\x91\xb8\xb7\xe4\xa6\x41\x22\x35\xba\x43\x86\xe0\xbf\x74\xbb\x69\x6b\x59\x17\x67\x35\x85\x5b\x56\x38\x66\x33\xb3\xad\x19\xe0\xa0\xe5\x1e\xdf\xcc\x42\x24\x7e\x8b\x5e\xa4\x20\x72\x7b\x07\x31\xb4\x2c\xec\x21\x03\x4f\x12\x12\x67\xd6\x65\xb7\x2c\xd1\xce\x8a\xec\xb0\x9e\x35\x89\x32\x41\x48\x7d\x4b\x1b\xe4\x7d\x82\x2a\xcc\x82\x6f\xde\x53\x65\x88\x54\x93\xe1\x9b\x3c\x76\x5e\x83\xae\xc2\xaa\xc3\xed\xd3\xf3\x60\xeb\xc6\x88\x7f\xf2\x54\xcf\x80\x3b\x5b\x9c\x1e\xfd\x1a\x1a\x6c\x77\x05\x0e\xf0\xc1\xdd\x6f\x6c\xd1\x8d\x90\x43\xb1\xb9\x79\xb5\xb9\xad\x71\x26\xc6\x95\xe8\x9a\x61\x9e\x8d\xeb\x90\x80\x43\x3f\xe8\x5b\xac\x7a\xc4\xda\x38\x89\x83\x16\xd9\x80\x64\x3e\x7d\x77\xe9\x1e\x50\x8f\x5e\x36\xac\x8e\x88\x2d\x03\x65\xd9\xac\x52\x81\x60\xde\xaa\x0f\x2b\xc4\xa9\x1e\xa8\x48\xc4\xaf\x14\x27\x0c\x09\x15\xde\x9b\x74\x9b\x3c\xd2\xc6\xab\x69\xc4\xae\xc6\xae\xfe\xe3\xcb\xe7\xdf\xff\xf1\x3c\xc6\x3a\x25\xf0\x9a\x50\x3b\xca\xfe\x37\x73\xc2\x4d\x47\xf3\xda\x3a\x7e\xb8\x23\x53\xbb\x5a\x2b\xf3\xc9\x6a\x71\x3c\x3b\xb7\x56\x7b\xf9\x30\x53\xd1\x8e\xd4\x82\x38\xaf\x76\x1f\xe0\x51\x0f\xdd\xc9\xb8\xbf\x7b\x69\xdb\xdd\x6f\x5f\x3e\xbc\xdb\x7d\xfe\xd3\x05\x00\x67\x43\x58\xcf\xcc\x23\xf3\x6c\xc9\xf5\xd4\x5c\x62\xb1\x21\x9a\x24\x68\x35\x84\x4f\x9f\x2c\x9a\x50\xbb\x86\xb8\xd6\xd8\xa4\x1b\xa6\xe9\xb2\x33\x49\x05\x44\xad\x82\x8a\xc9\x65\x37\x92\x87\xba\x4d\xd0\x4d\xc0\xb4\x84\x15\x6a\x1e\xd5\xd4\x8a\x6c\x48\x7a\xd9\x2d\x5e\x31\xd3\x72\x2e\x7a\xc8\x9c\x9e\xe5\xcb\xcc\xce\xdd\xd9\x6a\xc5\xcb\x74\x49\xd1\xd6\xd6\x6f\x35\x9f\x31\x5e\x1e\x63\x0d\x46\x99\xd7\x47\x06\xc9\x34\xcf\x22\xb5\x0a\xb0\x6a\x05\xb1\x15\x39\x32\xeb\x65\x91\xd3\xc2\x8c\x4c\xcc\x0a\x14\xab\x03\x14\x21\xc5\x5e\x80\xe2\xb8\xc8\x77\x61\xc6\x0b\xe8\x54\xb2\xc5\x3b\x01\x0c\x51\x93\x38\x11\x10\x9a\x04\x11\xe7\x8d\xa5\xd3\x8d\x15\x7d\x6f\x68\x6c\x7a\xb5\xb1\xd7\x32\xd9\xe5\x62\xff\x6f\xff\xf1\xdb\xee\xd7\x3f\xbd\xb6\xd4\x43\xcd\x63\xf9\xe9\x84\xed\x6e\xb9\xd4\xe3\x74\xa5\x07\xcd\x1a\xa2\xe9\xbc\x53\x7d\x63\x10\xe2\x45\xb6\xe8\xf4\x64\x3b\x85\x0e\xe4\x91\x5d\x2b\x0b\xd7\x94\xd5\x1b\x63\x6f\xaf\x13\x81\x26\x88\x96\x3a\x5e\x08\xe0\x63\x39\x4f\x51\x5c\xd2\x2a\xb5\xba\xe8\x4c\xb7\xf2\x06\xbc\xd3\x41\x58\xba\x89\x9b\xbf\xd6\x6a\xc2\xbe\xd5\xf1\xfe\x56\xa3\x5f\xb7\xd9\x27\x16\xfa\xfa\x84\x40\xac\xc8\xbb\x42\xcb\x0b\x50\xe7\xb2\x56\xdb\x02\x37\x38\x25\x7e\xbb\x24\xfe\x62\x08\xec\xf8\xa6\xe9\xca\xad\x46\x47\x4a\xa3\xaa\x8a\xaf\x20\x9d\xae\xb1\x82\xc4\x37\x57\x9a\x5a\xe1\x3f\x46\x2e\x8b\x2a\xd1\xc3\xd5\x49\xd9\x4f\xa0\xbb\x7f\xfe\xf8\xe1\x7f\x3d\xef\x2e\x24\x1a\xd7\xc5\xb4\x1b\xf8\xb9\x5c\x65\x13\x45\x60\xda\x45\x10\x8d\xbb\xef\x80\xaa\xcf\x7c\x4d\x9a\xfe\x0c\x29\xef\x42\x81\x55\x8c\x3d\x02\x17\x9d\x64\x30\xaf\x8b\x4f\x63\xbb\x97\x5a\x00\xe7\x07\x25\x1e\xb2\x1e\x53\x60\x12\x5d\x88\x6a\x72\x07\x1c\xa5\x1c\xd2\xc8\x74\xf9\xee\x76\x11\x6a\x46\xb2\xe4\x1a\x99\xd3\x0d\xa9\x39\x47\x63\x52\x4a\xf9\x2a\xe0\xd2\xde\x46\xc0\xc5\x43\xb5\xc2\x71\x6a\x16\x14\x7f\x48\xa3\x9c\x4d\xde\xf8\x3d\x4b\xb3\xe7\xa6\x4d\xed\x1c\x56\xd2\xb9\x38\xc2\xd9\x64\xcb\xca\xfe\x0e\x93\x9b\x86\x6b\x4a\x07\xda\xe3\xb8\x64\xeb\x4f\xad\x1c\x32\xa1\xe4\x02\x72\xbc\x01\xe7\x8f\x58\x04\xe8\x34\x6a\x7e\x1f\x01\x71\x07\x8e\x8f\xa0\xab\xe0\xdc\x6d\x13\xc8\x8b\x51\x14\x4d\x6b\xe3\x44\x3f\xd4\x4b\xd7\x22\x67\xd0\x35\xdd\xf0\x3a\x96\x11\x74\x46\x2f\xa7\x87\x77\xf2\x50\x87\xd7\xb1\x7c\x7e\x58\x16\x1d\xa0\x52\x44\x22\xa7\x03\x49\x7b\x3a\x68\x96\x80\xe1\x0c\x40\x86\x98\x44\xb5\xae\x45\x0f\xde\xa8\x32\x1c\xfa\xcf\xd1\xa8\xd5\xd7\xe5\x43\x06\xe7\x5f\x25\x7a\x79\x73\x38\x3d\x41\xeb\x8a\xf3\x90\x8f\x35\xa5\x06\x93\x9e\x46\x5f\x1c\xed\xdd\xe4\x81\xfe\x90\x6e\xa1\x7b\x7a\x4f\x41\x06\x21\xd0\xc9\x96\xa3\x52\x3e\x0d\x5d\xbc\x9b\x57\xbc\x7b\x69\x5f\x3e\xff\xf3\xc7\xe7\xff\xfd\xe1\xf3\xa5\x3d\x1c\x2b\xa8\xfc\xce\x43\x15\xd5\x1e\xd4\xef\x25\x28\xd3\x13\x37\x5e\xba\xed\x8f\x33\x40\xc1\xf0\x56\x04\xad\x64\x12\xa0\xdf\x91\xec\x25\xd4\xdb\x0b\x84\x66\xab\xd6\x42\x88\xf2\x6f\x8b\x1e\x22\x99\x04\x99\x0c\x45\xa8\x8a\xec\x9d\xda\xc1\x74\xd7\xbf\x38\x2f\xc5\x54\x96\x65\x94\xd4\x74\xc4\x90\x76\xd3\x14\x09\xc2\x68\xab\xa4\xd9\xae\x5a\x35\xe5\xea\x65\x96\x47\xa1\xf8\x85\x99\x0c\x5e\x93\x67\x07\xcd\xb0\xbd\xd3\xdc\x6b\x7c\x44\xea\x76\xc0\xde\x02\x9a\xd9\x7d\xb9\xe5\x4e\x40\xd6\xdf\xc2\xdd\x22\xb0\x61\x04\x8f\x63\x13\x84\xe2\xe9\x42\xe2\x2d\x26\x35\xe2\x38\xf0\xf1\x68\xcb\xc4\x2d\x0b\x81\x53\x04\x8a\xa3\x9c\x04\xe5\x58\x2a\x6d\x21\x65\x51\xcb\xfd\xf8\xbc\x56\xef\xcd\x92\x82\x93\x62\xac\x3a\xd6\x74\x4d\x3b\xd6\x54\x51\x72\xe9\x86\x05\xaa\x0c\xdd\xaa\x1a\x2d\x2d\x2a\xf9\x9d\x68\xab\x07\x80\x9a\xf0\x00\xcb\xfe\xa8\x60\xb4\x8f\x31\x5b\xcd\x83\x02\x7a\x22\x37\x46\x4a\xaf\x44\x4e\x0f\xa0\x58\xcd\x49\x8d\xc1\x69\xc7\x50\xf2\xb2\x1c\x53\x9e\x96\xf3\x98\x28\x1f\x25\x75\x82\x89\x1a\x94\x97\x8f\x74\xb4\xd1\x24\x3c\xdc\x63\x94\xa3\xa1\xa4\x0e\x3f\xdc\x1e\x73\xab\x4f\xf3\x77\x0c\xc9\x59\x00\x6f\xda\x8c\x27\xdb\x17\x29\x34\x7a\x28\x89\x85\x5c\x38\x35\xdb\xd4\xcd\x76\xd6\x54\x46\xae\x1d\x9d\xd4\x31\x10\x9d\x9d\x6a\x94\x89\xd1\xb9\x9e\x58\x7f\x26\x5a\x4c\xd5\x67\xe4\x93\x69\xbe\x73\xae\xd5\x6e\x9b\xae\x97\x48\x96\xd6\x98\x77\x2f\xbf\xfd\xf5\x5f\x5e\xde\xb5\x1f\x7f\xfb\xb7\x97\x4b\xda\x02\x29\xe0\x74\xad\xcc\x7f\xc7\x4a\xb6\x25\xb7\x45\xc9\x8c\xc8\x68\xaa\x5a\xe4\x5f\xd9\x11\xd0\x50\x11\xae\xb4\x93\x7a\x6e\xdb\x60\x55\x93\x6f\xc2\x89\x17\x4a\xc9\x22\x3d\x9a\x54\x23\x37\x01\xc8\x6f\x26\x50\x1d\xc8\x8a\x6d\xb3\x27\x08\xb9\x05\x24\xb5\x74\x6f\xf4\xec\x1a\x8f\xe0\xdf\x18\x34\xe3\xd2\xee\x68\x23\xe4\x2e\x25\x5c\x6a\x65\x1c\x93\xdb\x13\xe4\x07\x41\x40\x16\x54\xa4\xb9\xbb\x64\x0e\xaa\x20\x83\xc3\x0a\xaa\xed\x94\x6c\xa6\x7e\x60\xd4\x89\x97\x51\xf4\xc6\x0c\x95\xb0\x35\x12\xe1\x7e\xe2\xae\x01\xb1\x18\x86\xc7\x37\x2c\x8a\x5e\xdc\x17\xeb\xea\x92\x2e\xec\x1a\x18\xbe\xab\x96\xb7\x54\x17\xf6\xd4\x84\xe2\x7d\xab\x96\xc7\x30\x90\x9a\x52\xbe\x02\xa8\x54\xa9\x89\xf5\x32\xb3\xd1\x2d\x02\x07\x69\x2e\xc1\xd8\xc4\x3a\x37\xbe\x0e\x10\xdc\xa2\x42\xaf\x9e\x0d\x0d\x8b\xc0\xbb\x78\xa8\xc7\x32\xcc\xb5\xb4\x2a\x2c\x9e\x32\x2a\x04\x36\x37\x44\x3a\x1b\x37\x87\x81\x4f\x16\xc6\x7f\xfd\xbc\xfb\x73\xbd\xfb\xf5\x4f\xed\x42\x56\x1f\xdb\x8d\x7d\xe7\x09\x4c\x5d\x26\xad\x1b\x02\xf6\x95\x94\x4e\x15\x46\xee\xf6\xc2\x68\x5e\x18\xe1\xfd\x2d\xe3\x73\x85\xdd\xd3\x32\x77\xb6\x65\xe9\xf6\xc2\xfc\xb9\x31\xbb\xa7\xb0\xb0\xcc\xfc\xf0\xb1\xfd\xfd\xc3\xe7\x0b\xc7\x3e\x6c\x70\x62\x1d\xd5\x13\x1f\xe6\xbb\x17\xe3\x72\x53\x12\x2d\xb9\x4e\x73\xd4\xcd\x57\x6c\xef\x37\x2d\x77\x36\xc4\x13\x0f\xb8\x52\xc5\xfd\x9d\x58\x5a\x9f\xde\xbf\x9c\x40\x0c\x3a\xa2\xef\x2b\xd4\xd3\x34\x43\x26\xf8\xf0\x6c\xf5\x10\x5f\xfe\x2c\xf9\x7a\x4c\xb5\x41\x94\xfd\xa3\x13\x0a\x9c\x08\xa2\x1e\xc2\xe4\xd0\x30\xa0\xc5\x09\xac\x6c\xb4\x0a\x40\xe6\x20\x96\x4b\x27\xa8\x58\x3d\x5e\xf4\xea\xaa\xee\x8f\x27\xbd\x9a\x13\x91\xd4\x73\x58\x53\x58\x1e\x5d\xa6\x50\x64\x97\x34\xf3\xfa\xd3\x86\x3f\xbd\x57\x8d\x5a\x98\x0d\xd2\x0e\xf5\xdc\x18\xf9\xe8\x9d\x51\x59\x0a\x5a\xa6\xda\x76\xf0\x78\x5c\x6f\xc8\x00\x86\x02\x72\xd3\xb3\x3b\x4d\xd4\xc8\xe0\x79\x53\x12\x96\x96\x6b\xb7\xa3\x1d\xab\x79\x88\xa6\x32\xa8\xaf\x5b\x24\xa9\xa3\xe4\xce\xa8\x46\x68\x70\x9a\x43\xc2\x95\x8c\x54\xdd\xb5\x1b\x02\x4d\x1d\xe9\x76\x47\xa8\xb1\xaa\x84\x1d\x89\x50\x4f\xdd\xb5\x7b\xb5\x02\x85\x24\xd6\xbc\x04\x51\x7b\x1d\x87\x5e\x0f\xf5\xdf\xad\x0b\xfd\xf1\x2f\xe7\xe9\x09\x93\x09\xb0\xf4\xd7\x3c\xba\x58\x77\x2e\x54\x07\x9e\x58\x21\xba\xcf\x1e\x19\xd8\x92\x69\x26\xe4\xd9\x69\x09\xcf\xcd\x06\x07\xbb\xa8\x5a\xbf\x7b\x64\x19\x27\x60\xd2\x4c\x11\x63\xaf\x9a\xd9\x31\x73\x44\x3b\x15\x26\x3a\x13\x57\x04\x66\xe3\x35\xed\xf0\xf0\x48\x93\x99\xc9\x83\x5b\x17\xfe\x04\x38\x2e\x68\x2e\x4d\x0a\x33\xd1\x47\xb5\x9a\xb6\x17\xfc\x66\xe2\xce\x04\x70\x39\xda\xc9\xef\x62\xf8\xbf\x75\x1f\x1f\xc3\x3c\x32\x1a\x4c\x33\x87\xd5\x29\x6d\xe8\xa9\xec\x74\x82\xba\xcf\x6e\x85\x5e\x19\xf1\x38\xd5\x91\x30\xee\xed\x91\x18\xf0\x58\xd5\xdd\xac\x36\x4c\xab\x51\x22\xd0\x01\x17\xf9\x50\x0d\x31\x53\x9f\x2a\x53\x16\xe3\x94\x24\x58\x67\xc2\x12\xb8\x53\x12\xea\xad\xe0\x26\xe3\xf9\x3f\x49\x7f\x52\x9b\x9d\xb5\x6c\x76\xa0\x53\x0d\x99\xff\x4e\xd0\x48\xd1\x89\xc7\xc6\x3a\xa9\xe7\x86\x66\xa6\x69\x33\x15\xd6\xc5\x44\x3d\x1e\xaf\xd4\x94\x5e\x15\x75\x55\x87\xa2\x2a\x3f\x37\x58\xa9\x8d\xa2\x3a\x6a\x9c\xc7\xef\x34\x77\x56\x12\x21\x5c\x6f\xa5\xfe\x73\x34\xc9\x26\x40\xda\x24\xf9\x2a\x0d\xc9\x26\xbb\x4f\xe9\x16\x74\x8d\x3c\x6f\xb4\xd1\x1c\xc3\xaf\x31\xb9\xc6\x4f\xc7\xaa\xfb\xee\x16\xc6\x3b\xe7\x6f\x3e\x2d\xf8\xdb\xc4\x6f\x47\x6a\x2d\xae\xb5\x73\x0e\xe7\x6f\xca\x16\x36\x26\x6b\x67\xf2\x74\xef\xd5\xcc\xb9\x09\xdc\x6d\xbc\xeb\xd2\x71\xd9\x94\x6f\x69\x0a\xe0\x3c\x73\xc9\x55\x05\xbd\xd5\xc4\x51\x72\x99\x5a\x69\xf0\x24\x6b\xba\x14\x7f\x3b\x66\x4b\xc2\x13\x5f\x67\x4b\xf5\x6c\x36\xbb\xef\xae\xac\xf4\x0c\x4f\xaa\x75\xb2\x16\xfc\xcf\xe3\x5d\xfe\x1d\x0b\x8e\xe4\xca\x50\x96\x49\x51\x94\xdf\xd9\xb8\x15\xf7\x61\x9d\x50\x19\xf9\x71\xf0\x40\xff\xf1\x95\x75\x2f\xf8\x0f\x04\x25\x14\x9d\x32\x3b\x9d\xb2\xb1\x8f\xb5\xb6\x2f\x4d\xcf\x24\xfa\x6f\xaf\xac\x3a\x2d\x14\x91\x69\x86\x3f\xac\xae\x2b\x27\x2f\x44\x9d\x7f\xdd\xfd\x7a\xda\x0a\x73\xab\xcf\xb9\x03\x0d\x81\x28\x3b\x00\x84\x5d\xc9\xa1\x77\xf4\xdc\x45\xf5\x42\xf4\x6e\x5f\xed\x48\xcd\x96\x72\x19\xc6\xca\x43\xa0\x2d\x42\x0c\x2a\xbe\xf1\x18\xa3\x51\x61\xb6\x75\x3b\x97\x65\xc1\x9b\x59\xc1\xc6\x03\x67\xc3\x7e\x59\xae\xcc\xbc\xb7\x52\x30\xeb\x51\x54\x1e\x23\x53\x6a\x73\x9f\xde\xfb\xce\x1d\x3f\x77\xd9\x9d\xb9\x82\xe0\xf7\xd5\x96\xd4\x95\x3a\x83\x93\xdd\x8b\xa4\x54\x4a\x4f\xef\x99\x4a\x82\x6d\xce\xad\x55\xa9\xde\x6b\x48\x85\x17\xf1\x3b\xc9\xde\xe3\x01\x35\x4f\x97\x39\x7e\xb4\x52\x4c\x20\x81\x57\x97\x46\x17\x5b\x4d\x1f\xa6\x59\x86\x67\x0e\x1a\x7a\x69\xf5\x91\x19\x5e\x3a\xf9\xa6\x9e\xe7\xb6\xd3\x17\xcd\xec\x45\x33\x7d\xf1\xf8\xce\xc9\x17\x6d\x39\x21\x7e\xac\xb3\x7d\xf0\x8f\xea\x45\xea\xaf\x39\x6f\x8e\xfa\xa2\x3a\xe3\x5b\xd4\xfc\xb6\xe0\xf2\x66\xf4\x0a\x55\x25\xa5\x3b\xaa\x53\x97\x5a\x0c\x49\xf1\xa5\x4f\x8e\x54\x29\x8a\x34\xfd\xbb\x2f\x30\xd2\x14\x37\xe3\x93\x6f\x57\x52\x8f\xb9\x63\x6d\xdb\x72\x4f\x6a\x19\x57\x7c\x6c\xf1\xa3\x43\xe0\xfa\x20\x23\x51\xfe\xfd\x04\xa4\xaf\x1f\x82\x56\x73\xff\xa1\xea\x76\xfd\x65\x7e\x60\xdf\x75\x50\x57\x14\xf2\xf1\x8b\xd1\x7b\x63\x92\x19\xca\xd9\x66\x35\x85\x57\x10\xd2\xfc\x55\x2d\x77\xab\x3a\x1a\x76\x40\x2e\xe8\x44\x76\x19\x35\xf0\xd8\xec\x45\x4c\xc6\xbb\xbf\x7c\xfe\xf2\xf2\xf9\xfd\xcb\xe1\x02\x16\xa6\x02\x3a\x23\x41\x9a\x6d\x8d\x34\xf1\x1a\x2c\x7c\x7d\xcb\x15\x88\xa6\x18\x6b\xcc\x8d\x87\x14\x5a\xcd\x4f\x42\xb0\xd8\x00\xaa\xa5\x4a\x22\x02\x43\xa9\xc8\xc4\x69\xda\x3d\xa0\x3c\x95\x61\x85\xa1\x41\xdc\x6a\x6c\x6c\x0a\x0d\xc6\xba\xab\x2c\x6a\x62\x9c\x57\xa4\x4c\x32\xd5\x56\xf6\x50\xe1\x0c\x4e\xd3\xef\x5d\xb6\xbe\x5a\xa9\x6e\x5b\x1c\x51\x72\x8d\xb1\xd1\x5e\xb6\x25\x07\xcf\xa4\x6f\xb6\x34\x6c\xfc\xb5\x36\x5d\xfa\xc6\x4e\xea\x43\xe1\x51\x6e\xde\x40\x5a\x88\xc1\x5d\xf4\x0a\xba\x06\x73\x3d\xd4\x17\xcd\xac\x7b\x67\xc4\x7b\xca\x5b\x05\x9f\xbe\x55\xb3\x9d\x12\x47\xfb\xf2\xeb\x79\xba\x08\x26\xd4\x44\x07\xb7\xa7\x26\xcc\xf0\x09\xc6\x68\xbe\xce\x84\x86\x66\xf1\xf5\x7b\xd7\x10\xd5\xb7\x48\xc2\x33\xa1\x94\x2b\x83\x53\x18\x66\x4b\x86\x1a\xae\xe6\x27\xc2\xd5\xfc\x44\xd8\x8d\xb7\x1b\x29\xa5\xc8\xf1\x7a\x62\xeb\xea\x9b\xc0\xf9\x3a\x81\x75\x06\x2e\x4c\xf8\x0b\xa5\x5f\x88\xfb\x2b\x8f\x7e\xa2\xfe\xa1\x57\x0c\xf2\x47\xb9\x0e\x7f\xc8\x95\x47\xaf\xdd\x80\x6a\x3d\x17\x67\x9d\xc1\xea\x9e\x79\x41\x1a\x9d\x9d\xd0\xd5\x12\xe0\x1b\xce\x8f\x46\xd8\x72\x4d\x7c\xf0\x35\x61\x43\xac\xe1\xb5\xb8\xf7\x0d\x86\x3d\x1d\xfc\xfe\xda\xd4\xdd\xcb\x73\xaf\xff\xfa\xe1\xf7\xdd\xc7\xf6\x3c\x3c\x3f\x93\x09\xf5\xb8\x45\x64\xd2\x15\xbe\x36\x69\x0a\xb6\x1d\x34\x87\x31\xdd\xe3\x1c\x37\x19\xd4\x6c\xd0\xd5\x14\xa7\x12\x7a\x3d\x0b\xdb\xbb\x9d\x7e\x47\xc5\xa7\x35\x8b\xe7\x79\xf1\x44\x35\xe6\xd5\x8a\x9f\x69\x53\x6b\x4d\xd5\x7b\xd4\x86\xe6\x99\xf7\x37\xe6\x99\x13\xf6\xa7\x64\xdd\xe2\x2d\x9a\x3b\x88\x6b\xfc\xf7\xab\x6f\xdd\x6b\x10\x3d\x9e\x4e\xbd\x7b\xf9\xfc\xeb\xd2\x43\x64\xac\x99\xd0\xfd\x87\x37\xcb\x33\xaa\xb4\xe2\x19\xd5\x5c\x67\x7a\xec\x8c\xca\xdd\x7f\xe0\xb5\x3c\xa3\x72\xf7\x77\x73\x71\x46\x35\xb4\x6c\x95\x33\xaa\xff\xf6\x79\xf7\xe5\x92\x47\x90\x46\x0a\x09\x2b\x2f\x59\xa2\xd3\x80\xca\x93\x9c\xa5\x2d\x29\x86\x0d\x41\xf0\x3b\x02\xf9\xa3\x3f\xc2\x77\x22\x17\x69\x6c\x27\x83\xac\x1d\x48\x1a\x20\x76\x34\xfb\xbb\xad\x26\x04\x64\x5a\x9c\x7f\xcd\x4f\xa7\x6a\x0c\x10\x5d\x8b\xc9\x62\xda\xcc\x9a\x61\xfa\xf6\x3d\xbd\xc7\x92\x7b\x98\x6a\xac\x80\xc3\xd6\xa9\x82\xe6\x45\xd4\x84\xe4\xfa\x9a\x3b\x59\x57\x14\x39\x2f\xe2\x93\x27\x51\xdc\x55\x7b\x17\xf5\x8f\x81\xf5\x38\xc3\x3b\x83\x1a\x53\x4a\x01\xc8\xb7\x56\x1e\xdb\x54\x24\x63\x91\xe1\x18\xe2\x0e\x52\x10\x29\xae\xea\xfc\xad\x31\x9b\xaa\x2d\x91\x6c\x94\xa7\x0f\x81\x3c\x84\x0d\x24\x3a\xe6\xbc\x1e\xd5\x74\x3f\x17\xa7\x92\x91\xd9\x03\xb3\x88\x78\x94\x80\x63\x6b\x33\x64\xf9\xb7\x65\xe9\x05\xb9\xb9\x9e\xae\xfe\x1e\x61\x9b\xaf\x19\xf9\x3b\x77\x6c\xd7\x99\x3a\x83\x6f\x6d\x04\x96\x7f\x0b\x6b\x01\x41\x28\xd1\x4a\x2e\x1a\x8c\x50\x85\xb6\xc3\x71\xda\x76\x9f\x33\xd0\x32\xa7\xcb\xa8\xe8\xbb\x77\xea\xed\xee\xd7\x3f\x7d\x79\xde\xfd\x76\xd1\x67\xf6\xbb\xda\xab\x89\x76\x23\xe2\xa9\x0c\x78\xc5\x51\x18\xa9\x65\x45\x81\xdb\x46\x1d\xe4\x04\xa9\xa6\x04\xa8\x9e\x64\x91\x64\xfc\x26\x4a\x66\x51\x20\x37\x93\x22\x29\x6a\x2d\x31\x1d\x0f\x2c\xc1\x27\x0b\x14\xb6\x8c\x6a\xe7\x4b\xad\x65\x70\x51\xd3\xa9\x8f\xc3\x88\x47\xa1\x23\xb3\x1a\xda\xa1\xf6\x3a\x96\xf8\xe9\x48\x76\xd1\x18\xfd\xfc\x44\x79\x5b\xa7\x1a\xfb\xff\xcf\xde\xbb\x37\x37\x92\x23\x79\x82\x5f\xa5\x56\x7f\xec\x6d\x99\x01\x3e\x01\xc7\x3b\xe7\xea\x0f\xb6\xfa\xc1\xb1\xa5\xba\xea\x3a\xab\xd8\x67\xda\x3d\x5b\x8b\xa4\x98\x49\x5e\x85\x48\x1d\x49\x31\x2b\x7b\x6c\xbe\xfb\x99\x3b\x22\x82\x40\x90\x52\x89\x12\xb3\xba\x7b\x6d\xa6\xa6\x23\x45\xc4\x03\x2f\x87\xc3\x01\xb8\xff\x7e\xa1\xa1\x5c\x05\xe5\x3a\x2a\x8a\x47\xcd\xf2\x7a\x0b\xe5\x62\x73\x3c\xb2\x0f\x3e\x13\x73\x64\xce\xe0\xe0\x35\x83\x0a\x1c\x12\x1c\x35\xa6\xcf\x53\x2a\xd7\x6e\x1f\x7a\x5e\x74\xc5\x71\xa0\xa5\x56\xa4\x75\x59\x05\x36\xf7\x3f\x4f\xae\xa6\x46\x65\xce\xe3\x91\xdd\x19\xcb\x1c\x25\x68\x9c\x30\xdc\x06\xb7\x9a\x8d\x52\x43\xc8\x49\x1a\xe8\xdb\xca\x82\x09\x93\xc0\xcb\x52\x3f\xe6\xbc\x27\xe8\x40\xa7\x1b\x65\x04\x09\x87\x0f\xb0\x00\x68\xf7\xf2\x6d\xe2\x63\xe3\xe2\x87\x7a\xbb\x7b\x66\xb4\xb1\x81\x8f\x6e\x8f\x0b\xb3\xc7\xc5\x49\xc3\xfd\xdc\xc1\xd3\x05\x1d\xe9\xc4\x38\x42\x33\xe5\x31\x1f\x86\x7b\xbd\xf4\x50\xb9\x92\x2f\xf6\x11\x3d\x8e\x3b\x6f\xe5\x77\xbc\xd8\xc2\xf3\x17\xc1\x63\xc4\x5c\x94\xe9\x1b\xb7\xed\xa2\xfa\xdc\xd5\xb1\x29\xda\xaf\x65\x6c\xd1\x07\xa8\x2a\x97\xa3\x48\xbd\xf6\x38\x53\x19\x06\x3a\xc2\xbd\x39\x5a\x34\xea\x6a\x7c\x16\x87\x80\x3b\xb5\x5a\x3c\x4b\x98\x9e\x9d\xd4\x5e\x25\x48\x2f\x3b\x95\x3a\x57\x88\x9e\x3d\x7c\xea\xca\x69\xb8\x98\x07\xd4\x2f\xea\xc0\xbe\xbf\x5e\xcf\x78\xf3\x3a\x81\x78\xd9\x39\xd2\xb9\xc2\xf0\xdc\xc1\x51\xa9\x76\xd6\x9b\xdd\xa6\x5e\x9e\xc6\x24\xe4\x9c\x2d\xc3\x16\x38\x30\xf6\x54\x28\x64\x36\x27\xb5\x33\x1a\x6f\xbd\xd1\x74\xd8\xd0\x7c\xc4\xf3\x61\x31\x15\x0a\xa8\x6c\x9a\xcf\x4e\xc4\x5e\x42\x10\x3c\x2b\x4f\xdb\xc9\x30\x38\xa6\x35\x2c\x37\x76\xab\x40\x2f\x70\xc8\x96\x69\xfd\x8e\xd0\x89\x00\x3a\xd4\x27\xca\x73\x72\xf3\x1c\x05\x65\x30\xe5\xbc\xde\x64\x5b\xe2\x00\xdc\xd2\xbc\x00\xdc\xd2\x94\x78\xc2\x2d\xdd\xe0\x38\x4c\x19\xd1\xec\xd5\x0a\xf7\x52\xa5\xb9\xe1\xa9\x95\xba\x5c\x17\x53\x1d\x43\xe7\x18\xdf\xf6\xaf\x76\x0d\x4f\x9d\x92\x26\xd1\xc1\x73\x32\x3d\xe7\x05\x4f\x9d\x53\x9e\xb3\x79\xea\xa4\xd9\xb5\x08\x07\xeb\x9f\x65\x10\x29\xd3\xe8\xc4\x6b\x5e\x7c\x91\xe3\x57\x8a\x50\xd4\xa7\x4c\x07\x37\xe1\x33\x46\x8c\x8c\x91\xfa\xfa\x88\xb1\x1f\x37\xf3\xf9\x74\x39\xff\xfc\xcc\xa0\xe0\x45\x45\x11\x71\x27\xd5\xb4\xd8\x69\x50\x52\x2d\xf2\xb8\x79\x25\xd4\xde\x64\x86\x06\x7f\xe3\xf6\x5e\x6a\x49\x2a\x18\xc3\xf8\x15\x53\x78\x5e\x20\xe5\xf2\x02\x25\xaf\x01\x05\x38\xb6\x10\xa6\xaa\x24\x15\x1f\x46\x12\xfa\xe3\x58\xc4\xbd\x19\x84\x22\x1a\xc0\x29\x46\x08\x0b\x07\xfa\xc8\x38\x75\x29\x97\x08\x61\xac\xaa\x29\xaa\xf2\xdd\xc5\x51\xb8\x5a\x9e\x39\x17\xfd\xf6\xc6\x88\x30\x76\x7b\x1c\x27\xcc\x4a\xac\xc6\x0a\xa7\x2a\x1c\x87\xf2\x9c\x61\x80\x18\x11\x87\xa7\xfd\xd5\x1e\xc7\x3a\xaf\x2a\x3d\xf4\x7a\x4b\x44\x6b\xde\xcb\x0e\xfb\x37\x39\xa4\x0e\xb7\xd6\xb4\xc0\xb7\x7f\xd4\x16\x53\x92\x6a\x59\xe5\xdc\xa9\x29\xc9\xbd\x3a\xb0\xfc\xef\x21\x80\x94\x49\x36\x1d\x5c\x46\xfc\x5e\x67\x9c\x70\xf0\x44\xf5\x82\x7e\x7a\x99\x4f\xcc\x19\xd2\xf4\x32\x97\x97\x33\x24\xe9\x39\x33\xe4\xc4\x09\xe6\xb8\x5e\xdd\xfd\x69\x53\x7f\x78\xee\x14\xb3\x8a\xec\x2b\x99\x45\xea\x28\x50\x0e\x54\x9c\x49\x50\xcc\x3f\x67\xa4\xa2\x65\x3a\x82\x0a\x0c\xb8\xc4\x7f\x65\x90\x34\xc8\xe1\x6d\x34\x21\x68\x9f\x2e\x6d\x9f\x45\x41\x93\x93\x06\x63\x85\xee\xe2\x05\x2b\xd9\x62\x2b\x69\x14\x0c\xcb\xc3\x97\x2e\xe3\x10\x25\x58\x35\xe2\x58\x31\x9d\x39\x47\x28\x86\xe1\xdf\x43\x54\x33\xa9\xa0\x72\x60\xa4\x49\x90\x67\x41\xb2\x71\x61\x20\x98\x2d\x99\x40\x8c\xac\x18\xd9\xc9\x36\xd4\x68\x01\x19\x12\x0e\x33\x7f\x28\xe1\xc0\x28\x38\xc0\x6c\x83\xd5\x40\xeb\x47\x0b\xd6\xd6\x10\x11\x62\xb1\x39\xa1\x78\xa3\x8c\x1d\x93\x0f\xd8\x41\x1a\xbc\x95\x0e\x94\x1e\xa1\x05\x26\x0d\xe9\x83\xaf\xd2\x1c\x18\xf6\xd2\x82\xa5\x8a\x30\x62\x73\x7f\xe8\xdf\xb7\x37\xd3\xdd\x3a\xf6\xc0\xa4\x45\x8e\xe9\xe7\x5a\xc3\x30\x65\x76\xa4\x90\x4f\xb7\xf9\x9a\x86\x08\xd5\x43\x68\x04\xde\x27\x33\xbe\x46\x86\x4f\x4a\xd7\xf4\xb6\x05\x94\x16\x3c\xce\x24\x82\xf6\x34\xf1\x3b\xa9\x65\x00\xd4\xec\xf2\x23\x55\x05\x3a\x8e\x2c\x78\x61\xa1\x87\xec\x64\xd4\x4e\xef\xf6\x9e\x63\xe9\x33\xf8\x71\xaa\xd3\x94\xda\x7d\x56\x49\x30\x9e\xd9\x08\x5b\x40\xe6\xad\x02\x13\x5b\x24\xb6\x28\xd4\x9e\x32\x5d\x28\x08\xd3\x00\x41\xd1\xe3\x18\x78\xcf\xc5\xb7\x2f\x80\xa7\x57\x6c\x82\x2e\xa0\x7f\xbd\xdd\x3b\x08\x91\xdf\x51\x55\x03\xca\x4b\xe0\x9d\x59\xc6\xf6\xeb\x8d\x14\x15\x24\x68\x9c\xa5\xb0\x2f\x05\x36\x21\x6e\x59\x70\xa1\x61\x0c\xce\x31\xfa\xa9\x52\x10\x7c\xad\x92\x53\x44\xcc\xde\x45\x09\x5a\xcf\xd2\xde\xa5\x02\xcb\x54\xf4\xfc\xef\xf9\xf8\x86\x4f\x8c\xad\xef\x1f\xe6\xcf\x39\xf3\x53\xd7\x05\xb0\x7e\xd4\xc1\xa9\x65\x6e\x9a\x16\xbc\xad\x35\x49\x17\x5f\xd2\x00\x30\xe0\x9c\x44\x70\x46\x68\xc0\x98\x2e\xe9\x8e\xe3\x98\x52\xef\x28\x4d\xa7\x4b\x3f\xab\x3b\x09\xc6\x8d\x68\x64\x0a\x7d\x40\x15\x53\x8a\x3d\x7e\xa6\xca\x43\x30\x34\x6a\x90\xec\x71\xfa\x3c\xe3\xa6\xa9\x20\x11\x3c\x93\x53\x31\x78\x77\x5e\x0e\x61\x19\x7b\x0f\x21\xd6\x83\x31\x2d\xdb\x1d\x2c\x13\xae\x53\x88\x60\xa0\xab\xe5\xed\x65\x03\x96\x87\x5f\x98\xf1\x76\x2d\x3b\x1a\x39\x1a\x4c\x4e\x78\xa6\x31\x6f\x38\x8a\x91\x07\x5a\x3c\x7b\xa0\xcd\x94\xe4\x20\x56\x92\x1e\xe9\x13\x90\xa1\x0d\x52\x69\xb0\xee\x96\xf4\x98\x0a\x1c\x82\x80\xf5\xd1\xc0\x91\xd4\xe3\xc2\x42\x15\xd2\x06\xf3\x4c\x32\xcf\xa1\xa2\x55\x4f\xe5\x49\xdd\x49\x0b\xc1\xd3\xe8\xb1\xef\x35\x3d\x4b\x4b\x0f\x9f\x7c\x72\x94\x03\x8c\xb5\x02\xc6\x86\xea\x4c\x5d\x63\x3b\x2f\x13\x1e\x02\x16\x0f\x42\x67\x64\x02\x64\x6f\xc1\xde\x0e\xe6\x36\x82\x57\x33\xc0\x48\x89\x48\x56\x3a\x75\xa3\xf5\xc2\x80\xd5\x13\x85\xc0\x8d\xa9\xa7\xd4\x67\x75\x62\x8e\x4f\xc4\xf1\x8a\xe1\x2e\xa3\x15\xd5\x54\x39\xd0\x3c\xcc\xf6\x52\x69\x2a\x13\xcb\x73\x27\xf1\x3a\x3d\x61\x2c\x0f\x2a\x57\xe7\x65\x48\x1f\x09\xfc\x11\x0f\xc6\xd0\xb8\x49\x80\x51\xec\x04\x93\xc1\xc5\xb2\x36\xde\x93\x2e\xbc\x26\x05\x85\xec\x94\x14\x19\x7a\x8f\xc1\x71\xb3\x96\x7e\xd3\x20\xfa\xe3\xb2\x99\xdf\x3e\x01\x72\xdc\x6f\x29\x00\x4e\x15\x36\x32\x70\xc8\x76\x1c\x7b\x08\xd7\x0e\x68\x0d\xa2\x68\xd5\x44\xaa\x5c\xb8\x59\xb7\x8a\xac\x44\xb5\xa7\x32\xce\xd8\xe2\x60\x0f\x10\x6a\x44\xfe\x37\x3d\x94\x14\x0b\x5d\x17\x58\x81\xfe\x9f\xab\xff\xb9\xfb\x9f\xbb\x59\x5a\xad\x06\xd9\xbe\x22\x15\xf8\xeb\x94\xbb\x16\x6d\x29\xba\x7f\xff\xf6\x0d\xc3\x11\x80\x6b\x2c\x38\x61\xc1\x8c\x91\x83\x03\x29\x3d\xd0\xe2\xd0\x43\x9c\x04\xe1\x16\x0a\xf7\x61\x11\xa6\xba\xfa\xdb\xeb\xd7\x0a\x28\xd0\xcc\xaa\xb6\x06\x5a\xf0\x7f\x5b\x2d\xf9\x6f\xa9\xf7\xd2\x2c\xa4\x9b\xa2\xf9\xdb\x37\x0c\xae\x22\xd0\xec\x49\x75\x2c\x34\x19\x60\x66\xc6\xd5\x84\x28\x2b\xe0\xb5\xb9\x4c\x12\xec\x67\xb2\x22\x05\x0f\x1c\x39\x49\x37\x65\x7b\x33\x35\xc6\x75\xfb\x29\x48\xd8\x4a\xf4\x97\xea\xfe\x3a\xa3\x2a\x78\xe4\x56\x8e\x82\x66\x11\xca\xaf\x02\x23\x55\x32\xf3\xed\x1e\x17\x08\x78\x4d\x2a\x8a\xdd\xcb\xf9\xb9\x36\x6e\x57\xc4\x33\x32\xd4\xc3\xb6\xa3\x46\xab\x66\x5c\x7b\x32\x71\x39\x53\xa1\xb6\x15\x98\xb4\xc6\xa3\xcc\x25\x8e\xe9\xc1\x33\xb2\x19\x18\x6e\xbc\x43\xa1\xa8\xad\x79\x8a\x91\xfc\x75\xa9\xb6\x83\x3a\x8e\xe9\xb9\x33\x72\x19\x6e\x2a\xb1\x04\x58\x12\x61\xca\xa7\xac\xc1\x82\x66\xfa\x6b\xe6\x74\x55\x1c\x56\xc5\xa1\x5d\xdd\x5f\xf6\x8c\x5c\xdd\xa9\xba\x85\x4b\xd7\xcd\x1f\xad\x47\xd0\x82\x9b\xb1\x50\x0a\xc5\xe2\xc1\xc0\x9b\x34\x55\x25\x79\x96\x49\xa0\x7b\xc9\x8c\xec\xc9\xc7\xaf\x89\xf6\xf5\x61\xfe\x2f\x5b\x0b\xa1\x82\x28\xcc\x41\xa9\xf4\x2a\xc5\x42\xcc\x15\x09\xc3\x31\xb4\xca\x24\xb2\xe2\xc8\x54\x46\x6c\x55\x46\x24\x33\x24\x4e\xd2\x37\x69\x48\x86\x7e\xf4\x76\x23\x56\xb4\x0a\x67\x2b\x79\x10\xcb\x76\x10\x77\x63\x98\xdb\x1b\xbb\xf6\xee\xfa\x79\xdb\x35\xbc\x38\x8c\x97\x5f\x79\x26\x09\x05\xf6\xc2\xdf\xf5\x58\x9b\x7b\x3b\x14\xe4\xb3\xcf\x16\x4f\x4d\xc3\x0b\x72\x6d\x25\xe1\x9b\xd4\xac\x8a\xd4\xa2\x6d\x92\xa5\x69\xc7\x94\xf6\xc2\x4e\x3a\x3e\xe4\x4c\x91\xa7\xdf\x7f\xfc\xf8\xf4\x5c\x41\x86\x86\xb9\xd6\x34\xc9\x33\xb6\x80\x16\x96\x0c\x65\x2b\x2c\x9f\xa0\x37\xe9\x00\x6c\x5f\x81\x6b\x64\x64\x6f\x76\xd7\x28\x2a\x3d\x98\x89\x26\xb9\x8a\xd7\x5a\x43\x10\x81\x5e\x37\x22\x00\xa3\xd6\x7b\x70\x54\x8b\x6b\xfe\xbc\x15\x29\x97\xf6\x9f\xbf\x5d\xa5\xe6\x7c\xf5\x9e\x24\x78\xc1\xe5\x5a\x48\x75\x9d\xe2\x0c\x23\x5b\xbe\x16\xac\xa0\x29\x46\xef\x15\x28\x1e\xf3\x56\xd0\x0c\xa4\x44\xd2\xe4\x66\xc2\xfb\x2e\x80\x7b\xae\x99\x62\x6d\xce\xab\x6a\x33\xa1\x22\xdb\xa9\x5f\x20\xf8\x09\x4d\xdb\x15\x7d\x05\x21\x36\x48\xcf\xb4\xd3\x5d\x3f\x59\xca\x0a\xd4\x14\x91\x3e\x42\x93\x05\x5d\xa8\x51\x68\x09\x32\x61\xb5\x0f\x6e\xc2\xc5\x7c\xbd\xe2\x47\x4d\xb2\x10\xc0\x4d\xa8\xb0\x64\x8f\x2e\x90\x14\x7e\xd7\x45\x6d\x87\x71\x8b\xe6\xf3\x38\xa8\x43\xed\x25\xd7\x5e\x76\xb5\xef\x3f\xf9\xba\x41\xaf\x35\xf5\xa4\xca\x2a\xe8\xa8\x1f\xd2\xb2\x63\xac\xc1\x5e\x53\x95\xa9\x0b\xa8\x64\xf8\x5c\xc1\x4e\x76\x8b\xdd\x73\x3b\xd2\xa2\xcf\x50\xe3\x1a\x6a\xf5\x43\x03\x4f\xda\xfc\x5f\x3d\x18\xfe\x32\x9f\x7d\x99\x1d\xc7\xdd\x3f\x64\xe1\x33\x0c\x6a\x32\xa3\xc2\x25\x1b\x40\xb7\xff\x52\x81\x55\x4a\xe7\xf9\xb0\x4d\xa5\x7f\x1b\x4f\xcb\xe9\x59\x05\x5a\xa6\xf7\x28\xd5\xb6\xff\xa6\x89\x9b\x9e\x47\xd2\xce\xb2\x4d\x9d\x28\x1e\xe8\x55\x12\x2b\xaa\xbe\x63\x25\x61\x92\x0a\x67\xad\x97\xb4\x9f\x9f\x31\x2c\x05\x59\xba\x32\x89\x01\x9b\x24\xb3\x54\x34\xca\x26\x76\xad\x48\xc5\x9d\x65\xad\x2d\xaa\xf6\x8b\xba\x2b\x0c\x3d\x41\xdf\x6e\xa5\x39\x99\x30\x32\xc9\x6d\x94\x6d\x3c\xdd\x8c\x55\xac\x93\xae\xb5\x71\x02\x90\xcd\x6d\x26\x69\xec\xc7\x59\xf6\x41\x36\xda\xb9\x95\x14\x98\x86\xac\x79\x6c\x24\x47\x6f\x4c\x03\xd5\xa7\xb4\x59\x5a\x2b\x89\x5a\xd9\x83\xe6\x95\x8d\x17\x7c\xa8\xb1\x0f\xa0\xaf\x1d\x2d\x17\x22\x13\x69\xb0\x3e\xef\x7a\xe3\xf5\x56\xa0\x66\xd1\x54\x8d\xd4\x40\xeb\x20\xd6\xd4\xaa\xed\x0a\xd3\xfe\x8f\xca\x67\xb9\x4e\xed\x4d\xcb\x83\x3b\x50\x03\x36\x92\x4d\x03\xd0\x53\xa5\x1a\xd2\x2d\x9a\x1a\xf8\x60\x08\xf3\xff\x58\x52\x3a\xf5\xd0\x09\x36\xa4\x49\x4e\xf3\xc7\x53\x86\x36\x6d\x0e\xb1\x04\x28\xd0\x8d\x24\xb1\xc1\x2e\xe7\x4e\x3a\x90\xec\xad\x6b\xd4\xa0\x68\xf1\x2b\x50\x0b\x3e\x2f\xd2\x22\x02\x52\x2b\xf1\xe8\x31\x6d\xd6\x21\x4d\x27\x7d\xe6\xba\x2d\x8e\xef\x46\x57\x83\x10\x19\xe5\x83\xe4\x86\x8a\x9e\xac\xe1\x8a\x7d\xbe\x43\xe2\x11\x98\xb5\xda\x81\xc4\x8c\x26\xe4\x48\x36\x03\xcf\xd6\x2c\xbe\x7d\xc9\x31\xd9\x81\x74\xaf\xcf\x50\xb5\x56\x15\xe3\x40\xd3\x9d\x05\xbd\x92\xf6\x20\x0c\x8b\xad\xa5\xf5\x23\xa9\x2c\x6c\x77\x60\xf8\x2f\xd2\xd9\x6d\xe7\xbc\x41\x3f\x72\xa0\x50\x20\x91\x7b\xba\x29\x3b\x69\xe5\x2e\x6f\xa5\x96\xfe\x8d\x7b\x0d\x7a\x1c\x81\xb7\xc4\x58\x94\xa9\xa0\x54\x63\xa9\x79\x9d\x9f\x8d\x91\xc0\x23\x84\xfe\xa5\xc2\xf3\x46\x43\x3b\xda\x6d\xbb\x18\x68\xa7\x7e\x1a\x3b\x29\x0b\xdd\x26\xf2\xe0\xa2\x86\xe3\x3d\x04\x52\x93\xed\x60\x76\xdc\x85\x0e\xdc\x35\xcf\x5d\xd4\xc9\x9e\x16\x4a\x91\xd7\x4b\x63\x65\xfb\x36\x2e\x2c\x48\xb2\xea\x4c\xc3\x23\x8c\x41\x1c\x59\x22\xb3\x2a\xda\x4c\xfd\xc4\xde\xe8\xb5\xc9\xe8\xed\xd5\x97\xce\xd4\x17\xb2\xfa\xc2\x3e\x3b\x6c\xef\x75\xca\x8c\xc7\x49\x12\x48\x8c\xa9\xe7\x98\x2b\xad\x6f\xfd\xd7\x2f\x34\x90\x24\x58\x53\x17\x0c\x15\x4e\x5b\x41\x1a\x7d\x1a\x42\xc3\x90\x84\xea\x9a\xd6\x35\x81\xff\xf3\x10\x45\xb8\xf6\x60\xe8\x6f\x0e\xef\xa3\x6b\xdc\x7b\xb6\x3b\x0f\x5a\xdb\xb5\x83\x25\x14\x12\x9b\xeb\x75\x53\xe8\x75\x7d\xd0\xee\x8d\x23\x2b\xb3\xef\xe9\xbe\x29\xda\x7f\x03\x2b\xb7\x4e\xdc\x5c\xab\x4c\xc2\x44\xa1\x48\x46\x13\xa0\xd4\x59\xbe\x6f\x55\xec\x34\x27\xd9\xb6\xa3\x5d\xab\xca\x59\xe2\xae\x13\xcc\x11\xe9\x0a\xc5\xcd\xe9\x44\xd7\xae\xaf\x9c\xe4\xa9\xd5\x51\x91\xf6\xd3\xd2\x72\x55\x78\xce\x38\xaf\x21\x1a\xd2\xb7\xdc\x7e\xad\x5a\x55\x99\x8a\xe5\x06\x3e\x8c\xaf\xa4\x71\x63\xfb\xc1\xc8\xa3\x33\xef\x49\xcc\x7b\xf2\xd7\xfb\xb0\x15\xe0\xd4\x8b\xc8\x7a\x4d\x27\x05\xd8\xf7\x86\x17\xaa\x55\x94\xad\x1a\x9c\xb5\x4b\xa7\xa7\x95\x60\xb1\x14\x1e\x2e\x27\x4f\xa8\xbd\x36\xb3\x5e\xf5\xe9\x56\xf5\x69\xd1\x37\xf0\x39\x76\x4c\xb1\xf2\xf2\x22\x51\x1f\xfe\x5a\x13\x3f\xd5\xb8\x08\x6e\x1c\x49\x71\xf0\xae\x5c\xab\xf8\x42\xab\xf8\xd4\x69\xc5\x97\xc8\xd5\xed\x6b\x15\x1f\x5f\x0d\x6f\x02\x3a\xb0\x33\xc5\xa6\x03\x6f\x9b\xf2\xff\x2c\x30\x0d\xcb\xc2\x40\xa0\xd2\x1d\xac\xed\xb3\x04\x40\x9d\x3b\x88\xdb\x3e\x42\x9e\x8a\x78\xa2\x55\x49\xbf\xf1\x68\x4a\xcd\xfc\xc2\x5e\x3a\x06\xab\xf9\x71\x33\x7f\xce\xd9\x8d\x86\xb6\x02\x7f\xcd\x28\x26\x7c\x0e\x62\xd2\x76\x55\x48\x5b\x4d\x9e\xe7\x1a\x45\x82\x1b\x24\x6f\xec\xce\xa8\xed\x38\x24\x91\x37\x68\x19\xc3\x1b\x21\xee\x8f\x76\x37\xb6\xd9\x7c\x41\xcb\xd4\x29\xb2\x7e\x2f\x57\x2f\x7b\x6a\x98\xc6\x00\xa9\x7f\x3f\xcb\x1b\xa6\x85\x6d\x98\xf5\x56\x52\xdf\xcb\x29\x84\x4c\x59\x70\x7b\xa9\xc9\xac\xa2\xd6\xd5\x27\x1f\xe4\x0c\xb3\xb6\x36\xad\x63\x8b\x69\x5a\xa6\xaf\xbd\xa3\x99\x5b\xb3\x70\x85\x93\x9f\x38\xfd\xba\xe5\xe6\xc2\xbd\xa6\x19\xdf\x26\xfb\x4d\xaa\x8a\x8f\x6f\x54\x25\x55\x05\x31\x55\x56\x3a\xd6\xae\x51\x32\xd8\x8f\x54\x6a\xcb\x9c\x49\x91\x0f\x6d\x68\x08\x1b\x1e\xe6\x6c\x5a\xc9\xe4\x4c\xbc\x47\x50\xd7\xc8\x47\x52\x9e\xc6\x29\x3b\xd1\x7a\xd1\x77\xd6\x1b\x36\x24\x83\xc0\x6b\x55\xb5\x9b\xaa\x86\xa6\x7b\xd0\x3c\x20\x94\x01\x7b\x6d\x92\x4a\xf0\x22\x02\xef\x0f\x7b\xa1\x48\xfa\xf6\x54\xab\xa6\x3d\x99\xc2\x59\x66\xb6\x1e\x7a\xa9\x6f\x9f\x74\xed\xdb\x3e\x5b\x78\x35\x9a\x27\x84\xb0\x97\xdc\xe6\x29\xa2\xd1\xbf\xf8\x73\x83\x4f\x69\x32\x3a\xf6\xba\xe9\x7a\xff\x05\x05\x98\xb5\x1d\x29\xb2\x8e\x64\x49\x0a\x10\xa6\x18\x66\x9e\x27\x0f\x16\xeb\x20\x5d\xfa\xc3\xf2\xf1\xc4\x7b\xb6\x1a\xdb\x71\x71\x64\x6b\xbc\x1c\x6e\x22\xb4\x56\xd2\x41\x93\xff\xca\xb0\xb9\xe6\x9e\xc7\x74\xb0\x90\xfe\x15\x18\xde\xb0\x0f\xb3\x5d\x3c\x17\x4b\xa3\xc0\xc4\x9e\xfc\xd9\xbe\x36\xa0\x26\x5f\xa9\xb3\x27\x12\x96\x18\x42\xd5\x4c\xf2\x71\x14\x89\x53\x24\xad\x1b\x94\x74\xcc\xff\x63\xec\x04\x0d\x3b\xd9\x87\x2d\x1f\x54\x3a\x6c\xff\x99\xc9\x14\xad\x0f\x26\x4a\xcb\x36\xab\x26\x13\xcd\xc7\xf4\x97\xe1\x33\x0f\x4a\xe0\xa3\x26\x2b\x23\x04\x23\x3d\x1f\x04\x41\xc5\xab\x8f\xc8\x67\x69\x29\xed\x70\x97\xcf\xb9\xaa\x44\x90\xa8\xc1\x06\xc1\xc8\xa7\x0e\x2a\xdf\x00\x06\x09\x26\x6c\x99\x64\xc6\x2a\x88\x9a\xc9\x43\x48\x4f\x7b\xe6\x2f\x74\x1c\x96\xa1\x18\x0b\x85\x37\x32\xe9\xdf\x99\x74\x60\x23\xd5\x53\x81\xa3\x91\x54\xb5\xc4\x51\x22\x82\x71\x13\x8e\x01\x56\xa1\x01\xf4\x60\xc2\x0c\x50\x81\xa6\x92\x61\x14\x29\x14\xba\x7f\xb4\xc3\xb5\x8d\x80\xc8\xd8\x53\xa4\x3e\xc2\x35\x3a\x3e\xce\xf1\xe9\xe8\xae\xff\x63\x51\x35\x94\x13\x07\xfc\xa6\xe2\x84\x03\xb2\x30\x7d\x93\xc6\x5a\x4f\xdb\x53\x63\x05\x9a\xb9\x8d\x3a\x82\x2b\x32\x41\x9c\xd4\x53\xd4\x10\x02\xdd\x8e\x1c\xfe\x1f\x7b\xe4\x5c\x70\x4a\x9a\x46\x82\x72\x80\x6e\x51\x35\xdc\x2f\x36\x52\x6e\xde\x88\x74\xed\x4e\x1e\x99\x85\x31\xda\x82\x96\x87\x83\xa7\x87\xf4\x3d\x56\x72\x4a\xf6\x98\x84\xe0\xa7\xaa\x02\xe5\x0a\x14\xe9\x4e\x8e\xce\xf5\x51\x2a\xa5\x7f\xbd\xb9\x7f\xda\x8d\x42\x89\xc2\x75\x26\xf9\x99\xf9\xcc\x8d\xcc\x0b\x37\x46\xf5\x8c\x9f\x19\x7f\xe2\xf6\x86\x94\xf8\x18\xab\x29\xc9\xd7\xf8\xec\x38\xe5\xb2\x44\x06\xaa\x30\xf6\xa5\xab\xcf\x54\x0d\xc1\xeb\x49\x39\xb8\x09\x22\xf3\x6c\x4e\x19\x5c\x3f\x77\xf1\x69\xbf\xc3\x5c\x47\x2a\x8c\x03\x93\xb6\xbe\x22\x1e\x38\x3b\xcd\xa8\x5a\x3c\xd9\xbd\x84\xca\x35\xa0\xd9\xbc\x8d\x63\x33\x35\x0b\xac\xa6\xca\x30\xc9\x0e\x9f\xe0\x6a\x77\xc4\xe8\x5a\xfa\x1f\xe9\xa9\x1e\xba\x11\x85\x91\x66\x1a\xc3\x0e\x78\x9b\x01\xd7\xba\x2c\xdf\xe0\xcd\x8e\x3c\x5e\x7d\x23\x39\x74\x23\x27\x76\xed\x6e\xbd\x01\x8b\x4b\xa0\x83\x68\x86\x0e\x51\x10\x4c\x93\x56\x2e\x4c\xd3\x6a\x49\x4b\x41\x65\xc7\x61\x8a\x66\xe1\x40\x9b\x06\x25\x0e\x7b\xf8\x0d\xc8\x5c\x9a\x9d\x39\x98\x3e\x55\x57\x2d\x74\x9f\xae\x15\xbb\xa9\x1c\x98\x4a\x91\xb1\x08\x17\xd5\x84\x11\x15\x18\xfe\x9a\x51\x16\xb4\x82\x38\x7c\x98\xd6\x23\xae\x3d\x3f\x19\xd0\x2b\xe9\x16\xfe\xc1\xa6\x4b\x97\xea\x45\xd5\x90\x16\x97\x0a\x2a\x3f\x69\x8b\xc4\xdf\xa5\xcf\xf6\xd6\x1f\x02\xfa\xdb\x1b\xd2\x1c\x5c\xd6\xc8\x3b\x64\xce\x41\x50\x13\xe5\x5a\x37\x1b\x74\x4c\x96\xea\xc1\x37\x7d\xa8\xdd\x2d\x99\xad\xa8\xa9\xc3\x74\x6c\x7a\x1c\x63\x9c\x20\x19\x85\x4d\x1f\xdb\x77\xae\xdb\x7e\xa9\x2b\x1e\xe7\xcd\xd3\xba\x82\x5b\x56\x9b\xb1\x85\x38\x62\x70\x68\x3c\xa0\x20\x72\x2b\xaa\x38\x35\x10\xdc\x28\x8f\x42\x54\x82\xe6\xaf\xca\x8f\x99\xe3\x67\xc4\xb3\x08\x5f\x5a\xed\x41\x86\x58\x70\x53\x7e\x7b\x10\x58\xc8\xaa\x9a\xb3\xbc\xbd\xb1\x10\x85\x19\x41\xf0\x10\x3a\x3f\x11\x9b\xbd\x59\x17\x77\xd2\x8f\x31\xbf\x5d\x43\x34\x34\xe5\xb5\x77\x62\xd2\xb5\x5c\xcc\xe2\x4e\xca\xea\x2d\x81\x80\x91\x43\x29\xcd\x88\x37\xca\x7b\x97\x0b\x64\xb8\x1b\x3b\x45\x3d\x88\x27\x41\x04\xeb\x87\xa1\xc4\x07\x6f\x36\x25\x8c\x30\x8c\xc1\x55\xf8\x70\x54\xc9\x5b\xc2\x03\x2f\x01\x94\x96\x7e\x84\x34\x8d\x62\xef\x71\x93\x7c\xba\xe2\x42\x82\x3f\xa0\x15\x27\xf2\x29\x4a\x31\x6c\xfa\x76\x5e\x13\x8c\x4b\x8d\x60\x6d\xa3\x69\xfe\xf2\xa0\x5c\xe1\x19\x1d\x99\x0c\xb6\x62\x87\xb0\xa2\x56\x6d\x65\xdf\xa0\x4e\x83\x88\xe3\x90\x91\x27\x07\xe1\xc7\xea\x8d\xdc\x58\x25\x9b\x8f\x1e\x7c\x5f\xd1\x9c\x91\xd3\x35\xd3\x33\xaf\xd7\x7d\xc8\x28\x2a\x55\x28\x27\xcf\xbd\xcc\x5b\x10\x45\xb5\x77\xf9\x64\xd9\xbe\x73\xae\xae\x2b\x81\x33\x57\xeb\xcf\x1f\x9b\xfa\xe7\xa7\x57\xb8\x64\x06\x59\x32\x20\xdc\xd0\x85\x5c\x1f\xf8\x94\xb8\x09\x92\x7f\x8e\x46\x70\x39\xb9\x7f\xf6\xfe\x1b\x7c\xc6\x93\x45\x56\x31\x3a\x29\x33\xe6\xb8\x01\xd3\xdb\x69\x06\xa8\xa6\x63\x1e\x48\xf4\xb8\xcc\x96\x7b\x3e\x05\xd4\x19\x7b\xd9\x15\xd9\xde\xba\xe4\x83\x93\xe0\x19\x75\x85\x57\x1e\x1d\x78\x11\x8d\xe4\xf0\x42\xbe\x19\xb4\x10\x69\x9d\xc6\x10\x49\x56\xd7\x83\xf2\x62\x2e\x14\x87\x02\xbc\xc1\x55\xbc\x62\x6c\x36\x07\x36\xaf\x04\x9b\x9a\x8d\x44\x27\x95\xcd\x72\x64\x46\x86\x0c\xd7\x91\xfd\xbc\xbc\x04\xed\x1a\x9a\xf5\xca\x4f\x90\x21\xfd\x26\x13\x41\xd9\x82\xc4\x4b\x02\x3a\x89\x7c\x3c\x02\x3e\x4c\x3c\xcd\x5c\xb1\x54\x56\xbc\xec\x00\x8b\x13\xb2\x80\x48\x7a\x44\x02\xdf\xb5\xa0\x75\x19\xc3\xdd\x7e\xfd\xf5\xb6\x03\xfa\x96\xde\x21\x17\x4d\x49\xfd\x9f\x56\x65\x02\x91\xa6\x75\x36\xf5\xb2\x12\x26\xff\xb9\xc8\x40\x60\xb1\x8d\x89\xc5\x8c\x9d\x55\xb5\x2e\xa4\x88\x23\xf0\xf6\x00\xff\x9b\x65\xf7\xfa\x00\x3b\x9e\xb6\x8e\xbb\x9a\xfa\xa9\xe1\xae\x1e\xc4\xcb\x70\x68\xcd\xe1\x49\x0e\xb4\xd1\x9e\xc4\x42\x0c\xc4\xa2\xfd\xee\xeb\xf1\x42\x43\x0b\x01\x68\x4d\x9d\xd7\x9b\xfa\x3c\x1f\x28\x32\x41\xe0\x23\x36\xe0\x03\x6f\x82\xb6\xe2\x90\x95\x86\xf7\x01\x07\x84\x6a\xa8\x25\xa3\x2f\xb1\x58\x20\x36\xbc\xa7\x4f\xdd\x93\xbd\x77\x28\xc2\xeb\xf1\x44\x31\x32\x0f\x34\x0b\x6e\x2e\x6f\xa9\x1e\x49\x30\x94\x69\x14\x60\x94\x06\x82\xce\x66\x15\x66\xae\xf6\x9a\xcd\x6d\xc1\x0b\xdf\x24\x21\xe5\x00\x38\x6b\x6e\x3b\x06\x14\xfc\xb1\xfe\xf0\xcc\x59\x7a\x10\xda\x0c\x43\x87\x20\x62\x39\x2f\x4d\x75\xae\xf1\xc3\x79\x93\xf9\x50\xd5\x7b\x9a\x2c\x22\x0e\x32\x8d\xa0\xb2\x21\x83\x69\xa2\x89\x79\x5f\x75\x2f\xbe\x41\x7b\xbb\xe3\xca\xc6\xe7\x6a\xca\x2f\xbc\x25\x24\x87\xdd\xf7\xc3\x42\x66\x1c\xfa\xc9\xbc\x2a\x13\xde\x84\x7e\xc3\x47\x7e\x8e\x97\xd2\xa0\x72\x23\x86\x1d\xc8\x86\x39\xa9\xf3\x5a\xf0\x68\xf5\xc4\x74\x40\xe3\x5c\x88\xb5\xf0\x87\x90\x8e\x3e\x93\xb7\x2d\x2e\xa6\xeb\xe6\xf1\xfe\x19\x5c\x3a\xcb\xb1\x79\x38\x56\x78\x30\x82\xa5\x91\x66\xaa\x54\xda\x43\xd2\x4a\x58\xf0\xe5\x4c\x42\x7a\xb9\xca\x19\xdd\x34\x93\xaa\x8c\x31\x40\x70\xe5\xae\xc5\x14\x0f\xb1\x1f\xec\x86\xc7\xd9\x31\x3a\xa5\x16\xae\x31\xb4\xe6\x32\xa0\x4b\xc5\x25\x00\x15\x38\xbd\x57\x64\x67\xe7\x84\x48\x4c\x8b\xa5\xd9\x29\x3c\x84\x51\xee\xfe\x9f\xc2\x1c\xc3\xf4\x2d\x78\x68\x5a\xe4\x86\x38\x0b\x75\x57\xa7\xcc\xff\x9c\xe7\xa9\x98\x1b\x50\xb2\xe0\xf4\x4b\xd5\x2e\x54\x3c\x7f\xf9\x0d\xa3\xcd\x24\x2b\xba\x94\xfc\x71\x46\x98\xfd\x46\xbb\x9d\x67\xf9\xc3\x86\xd3\x05\x32\x18\x5a\xed\x86\x31\xff\x2e\x58\x83\xa1\x41\x61\x04\xfa\x8b\x66\xe0\x8e\x33\xd0\x63\xcc\xd5\x02\xd2\xff\x8f\xd1\xe4\x49\xf4\xd4\xb9\xf3\x78\x19\x2d\xb2\x59\x6f\xb7\x8b\x7a\xb9\x79\x1a\x50\x8d\x21\xa1\x7b\x42\x07\xce\x36\x26\x6e\xcf\x03\xc5\x03\x3f\x73\xcb\xeb\xbd\x3a\x8a\xd8\x9a\xc0\x51\xc4\x51\xfa\xc5\x4f\x85\xb3\xa2\x24\x4f\x9c\x31\xe8\x96\x8e\x8f\xca\x60\xa5\x1d\x75\xe4\x7c\x29\x7f\x7d\x7b\x5f\xc9\xd0\xd2\xf8\x29\x5e\x44\xeb\x51\x47\xea\x97\xa8\xc9\xcf\xb1\x79\x4e\x2c\x65\x8f\xa6\xdb\x30\x98\x83\x42\xb1\xbc\x7a\x4b\x50\xa8\x3a\x35\xbd\x0f\xb2\xdb\xdb\x32\xbb\xb3\x66\xbc\xc1\x88\x09\x34\x60\xf4\x80\x2d\x5b\xe2\xf8\xf5\x6b\xf5\xe3\xed\x3b\xc6\x5e\x29\x99\xb1\x25\x2e\x2c\xa8\x57\xe7\x71\x3c\xff\x5c\xf3\x91\xcf\x73\xb2\xac\xcd\x48\x39\xa1\x3a\x4b\x95\x11\x37\x45\x97\x72\x68\x49\x7a\xd4\x8c\x3a\x02\x0d\x95\x60\x68\x98\xd7\xf4\x40\xa9\x71\x26\x95\xfd\xb1\x44\xbf\xb0\x2c\xaf\xc6\x9a\x5b\xef\x7e\xbd\x3d\x94\xaa\xbd\xf0\xed\xcc\x42\x7f\xa5\x5f\x7c\x2c\x40\x0a\xe3\xab\xd7\xee\x2b\xb4\xf4\xf1\x01\xc9\xef\xe6\xbb\xfa\xc9\x56\xf0\xd0\x1e\x24\xf8\xc5\x70\x43\x99\x4f\x98\xf8\x3c\x88\x16\xf4\x26\x5d\x5a\xbb\x24\xd0\x4f\xaa\x15\x38\x9f\x2e\xdd\x1b\xfc\x02\xfb\x21\xd9\x74\x49\x6f\xd0\x6a\xd2\xe9\x31\x65\x77\x7b\x8f\xb4\x76\x44\x30\x38\x4b\x91\x54\xb4\xfc\x04\x9a\xfd\x99\x9d\x71\x2b\x41\x1b\x09\xce\xca\x94\x60\xc7\x4c\xa0\xa9\x40\xe3\xed\x3d\x3b\xba\x99\x70\xb0\x61\x94\x68\x31\x68\x3d\x3f\x36\x3d\x06\x62\x7f\xb6\xe3\x12\xce\x72\x0e\x14\xc2\xdb\xe1\x16\x50\xef\x15\x20\x13\xaa\x2a\xb7\x90\x9a\xf3\x5f\x68\xd0\x29\x65\xac\x34\xa0\xdb\x4b\xb7\x30\xe0\x90\x93\x5e\x41\xc8\x5c\x6c\xd2\x18\x95\xf2\x1d\x33\xf0\xf4\x34\x75\x8a\x4d\xb9\xa1\x02\xbf\x37\x10\xcc\x98\x1f\x7c\x05\x89\x72\x81\x73\xa1\x22\x28\x24\xd3\x4e\x63\x23\x41\x07\x88\x76\x8c\x1a\x6c\x83\x60\x8c\x74\x0b\xea\x6a\xfa\xdb\x0a\xb6\xca\x74\x60\x0c\x2a\x6a\x98\xd0\x48\x08\xb4\x9a\x55\x71\x82\x64\xad\x9e\x07\xda\x6b\x8e\x4a\xc3\x9b\x68\xba\x2a\xf0\xf3\xa8\x48\x32\x3f\xee\x52\xc2\xd3\x63\x18\xa7\x68\x17\x72\x38\x39\x94\x1b\x3d\x52\x2d\x74\x35\xb4\x8c\x8b\x57\x84\x62\xd6\xbf\x30\xe1\x43\x0a\xc6\x3b\x2e\x96\xd7\x5c\xa0\xdb\x7b\x69\xa4\x3f\x42\xa0\x40\xb0\xb1\xf3\x4e\xc8\x77\x92\x79\x37\x6d\xa1\xe2\x54\xa9\x85\x3c\x0b\x85\xc4\x72\x93\xa4\x46\x19\x62\xf3\x5a\x0e\x3e\xfc\x06\x99\x7f\x2f\x7c\x83\x2e\x81\x6b\x0d\x71\x76\x9f\xd4\x8a\xfc\xe5\x5d\x26\xdd\x55\xf2\x7b\x66\xa7\x64\xc5\x1e\x0b\xc8\x57\x2d\xaa\x71\x00\x3b\x55\xb1\xe1\xc3\x9c\x59\xe6\x08\xdc\x3a\x37\x71\xc4\xda\xb5\xe2\x11\x9e\x48\xaa\xe9\x4b\xbc\x01\x9a\xbe\xf9\x62\xff\x85\x13\xa5\x4a\xd5\xea\xfd\xd9\x75\xeb\x66\xcb\xb1\x7f\x54\x30\x1a\x7d\x24\x95\xd7\x29\x37\x47\xed\xc1\x6f\xb1\x47\x77\xf7\xfe\x8b\xdd\xa9\x86\x25\xe0\x19\x3a\x2e\xa4\x3e\x8e\x4c\xdb\x2b\x73\xe4\x91\x67\xf6\xa6\xf7\x95\xc6\xd6\x57\x9a\xee\xc7\x6b\x0f\x41\xe8\x8a\x7d\x48\x75\x95\xc2\x55\xaa\x59\xe7\x36\x66\x5b\xef\x41\xaa\x59\xeb\xc2\xd7\xf9\x48\x2d\x54\x64\x4f\xb2\xc2\x21\x77\xaa\xaa\x6b\xa6\x18\x88\x60\x78\xb3\x5a\x30\x17\xab\x12\xf1\x6f\xdf\xa4\xae\xc4\xd6\x11\x2f\x75\x65\xdf\xa1\xa4\x66\x49\x35\xe9\x59\xea\x36\xc5\x4e\x2e\x55\xda\xea\x24\x3d\x5e\x46\x9c\x74\x4e\xe7\xa9\x9e\xc9\x59\x86\x1d\xed\xe8\x59\x9d\x4a\xd5\x39\x9e\x73\x1a\xeb\xf8\x36\xb6\x2d\xa6\x98\xb6\x54\x16\xd1\x97\x2a\x05\x4e\x25\xea\xf1\x05\x0d\x96\x5e\x9b\x62\xab\x4c\x53\x19\x16\xdd\x2d\x69\xa0\x53\xa7\x53\x7a\x29\x05\x2c\x31\x4e\x9d\x5a\x48\x05\x7a\x2f\x0d\x04\xfa\x2b\xee\x25\xbd\x60\xd3\x6b\x0a\xc2\xb4\xcd\x30\xf9\x0e\xb3\x6f\x3d\x77\xde\x42\x22\xf8\x26\xb5\x26\x3d\xc8\x2a\x2d\x69\xb7\x06\xc1\x8a\xd6\x15\x70\x7c\x86\x27\x5e\xd2\x5f\x03\xef\x9b\xcd\x76\x37\x5a\x0e\xf9\x2f\x4a\x2d\xc7\x50\x80\xa8\x21\xaa\xa9\x01\x3b\xa2\xdc\xb1\x3f\xf1\x4a\x8c\xb7\xb8\x90\xbe\x2e\x6e\xc8\xf6\xd7\xf4\x42\x48\xc1\x3a\xe1\x31\xd8\x1a\xec\x21\x62\xda\x4a\xb0\x0b\x5f\x26\x51\x96\x0b\x19\x6e\x6f\x0c\xad\xf3\xc3\x58\xe3\xf4\x2c\x95\x76\x3c\xad\x52\xaf\x70\x48\x60\x0b\xb4\x5a\x27\x5f\x65\xdd\x9f\x33\xf0\x61\xfa\x14\xb9\x4b\x19\xa1\xfe\xe4\x7d\xc5\x7b\xc2\xf9\x2d\xd1\xde\x5a\x20\xf8\xa9\xc2\x27\x6f\x6b\xe6\x72\x1a\xdc\xa2\xc5\x1c\xe8\x3d\x02\x47\x66\x3d\x79\x9f\xc9\xaf\x06\xe5\x49\xb7\x68\x5e\x36\x86\x3e\x30\x2a\xdf\x3d\xd4\xf7\xf6\x46\x79\x81\x1a\xdc\x02\x21\xa8\xbd\x34\x0b\x43\xd5\x08\x0b\x69\xf6\xd2\x8c\x95\xdf\x9b\xb1\xa2\x32\x84\x85\xb9\xbd\xf7\xa0\x94\x74\x70\x1e\x8a\xd5\x61\xfe\xf8\x27\x17\x37\x34\xad\xf7\x55\xcc\x1e\x90\xf4\x27\xa9\x10\xbb\xd7\xc5\xc7\xfa\x1b\xa6\x4c\x94\x60\x49\x23\x18\x7e\xe7\xf8\x16\xcb\xd0\x51\x91\x34\xdd\xc1\xd3\x77\xcc\x51\x71\x95\x5b\xe8\xe1\xb3\xc7\xa7\x0a\xcf\x4e\xcb\xdf\x7c\x73\x82\x38\xbd\x6e\xe6\xbb\x67\x50\x2c\x51\x31\xdc\xae\x86\xca\xd6\x4c\xe5\xcc\x97\x54\x39\x12\x73\xef\x07\x00\x2d\x7c\xd2\x69\x85\x8a\xb5\x06\x6f\x18\xe0\xb4\x17\xee\x68\x25\x42\xe5\x46\x9a\xdd\xa3\x0f\xdb\x86\xec\x94\x58\x77\x9b\x07\x4a\x30\x87\x7a\x0b\x0a\x13\xd3\xa5\x33\xe9\x11\x2a\xca\x31\x50\x8e\xa1\x3f\x01\x3a\x14\xf2\xf6\x1e\xac\x61\x18\x98\x7a\x40\xa0\x2c\x79\xe3\x71\x51\x1d\x6d\x3a\x22\x33\x38\x5a\x1e\x8b\x1c\x50\xd4\xf9\x3c\x30\x70\x5d\xec\x96\x24\xa1\xdf\x8a\x64\xd6\x1f\xfe\x44\xb6\x41\xa9\x5a\xc2\x65\x5e\xb9\x24\xb7\xd1\x2e\x5f\x50\x23\x05\x96\xdd\x5e\x7a\x87\x02\x64\xc0\xdf\x00\xca\xdc\xde\xf3\xd8\x96\x60\x71\x71\x8e\x2f\xd5\x89\x85\x04\x13\x36\x69\x0d\xc1\x8f\x94\x66\xdf\x42\x7d\x70\x0b\xe1\x78\xd5\x8a\xd9\x28\x5d\x7b\xed\xf6\x36\xb0\x9a\x55\xd2\xd0\x4c\x26\x03\x59\xc4\x16\x5c\x90\x49\xb3\x05\x8e\xfc\x86\x1e\xd4\x42\x33\x40\x86\xf6\x0b\x50\x38\xd3\x09\x2b\xc2\x25\x34\x63\x13\x85\x07\x34\xc2\x80\x67\xcf\x07\x12\x0e\x49\x55\xd6\x09\x72\x15\xa3\xb0\x32\x79\xfe\x28\x46\xda\xa0\xe6\xd3\x51\x26\xf7\x95\xa0\xb6\x4a\xa4\x03\xea\x2a\x4a\xc0\xda\x01\x7a\xe1\x3a\x0c\x13\x25\x34\x5b\xe8\x09\x2b\xe3\xb0\x58\xa4\x0e\xb3\x6e\x96\xfc\x33\x03\x23\x92\x18\x26\x37\x45\xcd\x67\xe3\x8b\x6a\xa4\x3c\x68\x36\x1c\x75\xcf\x9b\xce\x4e\xf1\x9e\xc7\xbd\xd1\xed\xb5\xfd\xe4\xa1\x0d\x19\x55\xcf\x33\xc2\x84\x1b\x91\xd5\xc7\x6e\x71\xd8\xa9\x9c\xc8\xe8\x3d\xd7\x16\x7c\x14\x64\x97\x68\xc1\x56\xa2\x72\x82\x2c\x82\x91\x52\x10\xd9\xb9\xb3\x07\x36\xf1\x09\x29\xd1\xcd\x2c\x95\x84\x59\xad\x15\xad\xe4\x84\xe6\x46\x89\x10\x38\x3c\x5c\xd7\x8a\xf1\xbb\xd3\xb5\x55\x6f\xe0\x25\x2d\x3e\x17\xd5\x8c\x83\x6d\xd8\xed\x54\x43\xa4\x41\x42\xc2\x8e\x39\x11\x8c\x53\xdc\xca\x86\x7a\xd8\x74\xdd\xcc\x5e\x52\x11\xb4\x9d\x31\xa1\x15\xb5\xbb\x16\xb4\xac\x32\x09\x1b\x87\x83\xf8\x98\xd9\x50\x82\x71\x52\x03\xad\xd4\xbc\xb4\xb5\x87\xa8\x85\x3f\x70\xad\x53\xbf\x51\xd6\x33\x09\x68\x24\x3b\x4c\x71\xac\x99\x95\x16\xd0\xc9\x73\xf6\x47\x4f\x2c\x49\xa9\xdd\x05\x3a\x70\x3c\x83\x44\x81\xc5\x90\xd1\x34\xbf\x4d\x10\x39\xf4\xbf\x69\xc1\x55\x2c\xf3\x5f\xe5\xcb\x2f\x70\xe0\xd4\x0c\x68\xa9\x20\x13\x91\x9a\xe6\xf9\x93\x9f\xb6\x5b\x26\xa0\x91\x09\xed\x25\x04\x09\xce\x35\x92\x14\x08\x18\xcd\x5c\x5c\x81\x86\x76\x38\x70\xcb\xf3\xc6\x43\x64\xe7\xa1\xae\x0d\x24\x28\x93\x6d\x76\x66\xc5\x7e\xd3\x32\x59\x59\x3e\x83\xb5\x60\x23\x97\x84\x99\xfb\xfd\x01\x5a\x9c\xd1\xb7\x82\x69\x12\xe4\x32\xb3\xd3\xb1\x67\xde\x81\x53\x97\x96\x85\x5c\x73\x1b\xbb\xaa\xf7\x35\x37\xa3\x24\x92\xfd\x51\x87\x50\xe9\x50\xb7\xc0\x5b\x76\x24\x40\xdb\x4a\x92\x74\x57\xb2\x25\x59\xb2\x01\x54\x06\xde\x2b\x18\x75\x4b\x1d\x75\x91\xaa\xd8\x1b\x9b\x91\x82\x38\x96\xcf\xf5\x42\xa3\x15\xc9\xbb\x06\x86\xbc\x7e\xa2\x19\xb3\xea\xbf\x69\x7d\xaf\x78\xd8\xb2\x1b\x66\x3d\x28\x22\xd5\x85\xa4\xdc\x91\xd9\x11\x55\xba\xb4\xe3\xc6\x4a\x50\xae\x91\x69\x12\xb0\xae\x56\x49\x89\x61\x2f\x56\x68\x59\x69\x17\x72\xf6\xeb\x62\xe6\x7a\x31\x2b\xd1\xf3\x2b\xc9\x5e\x87\x94\x95\x04\x6d\xea\x96\x27\x2e\x9b\x7b\x94\x1b\x0d\xa5\xd1\xa7\x50\xc5\xa0\xeb\xa7\xa5\x31\xab\xfe\xd9\x7b\x02\x45\x33\x32\x4e\x1b\x2d\xb4\x9e\x69\x45\xd2\xe5\xe9\xd2\xb6\x22\xb2\x23\xaf\x6c\xc1\x90\x54\x0d\x3a\x1c\x14\x2f\x94\xae\x3d\xcf\x36\x60\x8d\xbc\xff\xd2\x3b\x9f\x27\xd4\x2a\x46\x16\x1d\x48\x2b\x04\x7b\xb0\x05\xa8\x59\x31\xc9\xac\x04\x15\x6b\xe4\x70\x6f\x9d\x09\x6e\x34\x24\xb8\xf4\x69\xdb\xc9\x67\xe0\xad\x43\x03\x61\x88\x71\xd5\x4a\xae\x7b\x66\xf0\x1f\x9a\xe9\xac\xad\xf4\x23\xd5\x47\x33\xb4\x0f\xf5\xa0\x68\x87\xa6\x26\xc9\x94\xa0\x26\x1c\xc8\xe1\xc0\xba\x86\x5d\x65\x9f\xd7\x7b\x87\xc1\x7f\x2c\x8f\x19\xc0\x1b\x99\x5c\x4e\x82\x0d\x13\x6a\x84\x28\x1c\x50\xc3\x19\x2f\xf8\xd2\xf6\xac\x4a\x1b\xaa\x62\xc8\x79\x71\xd0\x90\x1c\xf7\xc0\x97\x43\x53\xd9\x5c\x4f\xa6\x3a\x9e\x75\x84\x76\x6a\xa5\xc1\x4e\xbb\x54\xd0\x99\x44\x60\x52\x74\x9a\x04\x99\x87\x41\x3a\xd0\x86\xeb\xcd\xde\x30\xec\xfb\x8a\x34\x79\xf2\x06\x71\x70\x32\x40\x64\x2c\x38\x5a\xf2\x31\x12\xae\x92\x06\x2a\x7a\xcf\xd1\x57\xd4\x28\x99\xaf\xa1\x5f\xbb\x78\x32\x14\x48\xa1\xce\xe8\x19\x86\xff\x88\x32\xb0\x0f\x15\x35\x25\x29\x3c\xa6\x3e\x75\xa4\x29\x38\xe8\xdf\xd1\x1a\x04\x35\xa5\x3b\x9a\x64\x4c\xad\x3c\xa9\xf1\x74\x4d\x5f\x35\x80\x28\xc9\x40\xb9\xa6\xe2\xb2\x25\x82\x5a\xe8\xc4\x30\x6e\xc9\x96\xca\xaa\x79\x7b\xc3\x5b\x1e\x15\x58\x52\x68\xf4\xe5\x0e\xf3\x8d\x1d\x86\x7d\xd2\x52\x48\xb6\x09\x1e\xcc\x73\x95\xfc\x89\xad\x1e\x0d\xee\x70\x6d\xd8\x94\x13\xc3\xaf\xf5\xf9\xdc\xde\x24\x65\x5c\x41\xc0\x7a\xf8\xbe\x4a\x9e\xd2\x27\xbe\x1c\x79\x20\x45\x5e\xd5\x95\x5f\xe6\x20\x99\xf4\xb0\x49\x97\x94\x7e\xc8\xe6\xf6\xde\x33\x0f\xdf\x30\x3b\x06\x89\x24\x41\xa6\x09\xa7\xfc\xa8\x62\xa7\x03\xa3\x9e\x6e\x95\xa3\x12\x92\x85\x19\x41\xd9\xdb\x1b\x8e\xb3\x41\x77\xf4\xae\x4a\x16\x8d\xd5\x47\x65\x7d\xb6\xad\xb1\x6f\x6b\xbe\xdd\xef\xe0\xa6\x5c\x6e\xef\x2d\x3f\x82\x49\x27\x3d\x51\xc1\xa3\x56\x7b\x41\x59\x8e\x6a\x98\xac\x56\x5d\x81\xb1\xb7\xf7\x56\xaa\x0a\x8c\xa3\xb5\x9b\xd0\x70\x28\xae\xa3\xe5\x08\x43\x08\x5a\x9d\x2e\xdd\x1d\xc3\x0a\x93\x1d\xad\x5a\x52\x0a\x2e\x81\xe3\xe8\x5a\x4c\xb4\x38\xa6\x5b\x90\x91\x15\x95\x3e\xac\x0f\x6b\x04\x70\x31\x05\x59\x1d\x2c\x75\x52\x10\x38\x62\x02\x1a\x4c\x81\x52\xad\xc3\x88\x8f\xe2\x38\x82\xe4\x99\x55\x2c\xaf\x60\xff\xb0\xdd\xce\x57\xbb\x65\xdd\xf0\x3a\x76\xfb\xdd\xbf\x5f\xd5\x77\x77\x72\x37\xff\x65\x77\xf5\xee\xb0\xbe\x1d\xdd\xdd\xfd\x38\xff\x65\x27\xae\xea\xa6\xde\xdc\xcb\xf5\xc7\x8f\xc5\x5d\x4a\xfc\xfe\xe3\x47\xf1\xb0\x5c\x7d\x58\xd7\x9b\xbb\xec\xde\x0f\x6d\x92\x58\xcd\x3f\x67\xc9\x7f\x9e\x7f\x16\x57\x1f\x1e\x3f\x7c\x68\xe6\x72\xfe\xcb\xac\xa9\xef\xeb\xdd\x72\xbd\xca\xbf\xfa\x3b\xbe\xfb\x87\xc3\x4d\x71\xf5\x69\xb3\xbc\x93\xfb\xe5\xfc\x73\xfe\xdc\x9f\x36\xcb\xbb\xe9\x92\xbe\x37\x63\x00\x49\x59\x6f\x36\xeb\xe2\x89\x04\x2c\x39\xa2\xe4\xfe\xa1\x45\xbd\xba\x3b\x7e\x66\x5c\xaf\xee\x8a\x47\xe4\xac\x59\xce\x7e\x3e\xfd\xe0\x35\xdd\x2a\x9f\xfe\xb4\xa9\x3f\x9c\x7e\xf8\x4f\x9b\xfa\x43\xf9\xec\xfa\x61\xbe\x3a\xfd\xec\xf7\x0f\xf3\x55\xff\xec\xfd\x7a\x3f\x3f\x7e\xec\x66\xbd\x9f\x8b\xab\x8f\xcb\xcd\x76\x27\xeb\x65\x51\x93\x6e\x47\x53\x6c\xe6\xdb\xe5\xdf\xe6\xef\x72\x90\x1b\x4a\x10\xeb\x0f\xff\xef\x7c\xb6\xdb\x66\x37\xbe\x4f\x29\xe2\xc3\x7a\xfd\x73\xde\x03\xeb\xf5\xcf\xa2\xde\xee\xe6\x9b\xe5\x36\x4f\x1f\xb5\x49\xe2\xc3\xe3\xa7\xa2\xc3\x3e\x89\xed\x6c\xb9\xdd\xae\x37\xf9\xc7\xdf\xb7\x49\x62\xb7\x98\x6f\xee\xd7\xf7\xf3\xdd\x7c\x93\xdd\xfe\xf1\x90\x2a\x1e\xe6\xab\xd9\xb2\xc9\xa5\x87\x13\xc4\x6a\xbd\xcb\xeb\xf1\xe7\xf5\x6e\x2e\x36\xf3\x8f\x9b\xf9\x76\x51\x54\x8f\x53\xc4\xf6\xcb\x6a\x96\xe7\xff\x65\x35\x13\x57\x24\x35\xb2\x59\x6e\x0b\xb1\x26\xb1\x99\x2c\xb7\xbb\xf6\xf6\xac\xde\xdc\x6d\x87\xf7\xaf\x29\x51\x5c\xed\x36\xf3\xf9\x91\xe8\x75\x48\xe9\xa2\x59\x7e\x5a\xec\x3e\x3c\x36\x1f\xb2\x9b\x93\x2e\x4d\xdc\xad\x3f\xaf\x9a\x75\x9d\x0f\x8b\xdf\xb7\x49\xe2\xf1\x61\x70\xe7\x27\x4e\x10\xcd\x7a\x96\x37\xf9\x64\x3d\xfb\x59\x3c\xae\x06\xa9\x3f\x71\x82\x78\xdc\xce\x8b\x16\xff\x89\x7e\x8b\xab\x87\xf5\x03\x59\x00\x79\x81\x7f\x58\x3f\x7c\xff\xb8\x13\x1f\x19\xfa\xeb\xdd\x10\x0b\x8c\xc6\x6f\x39\x74\xe9\xc9\x79\xf9\xdc\x5c\x3c\x34\x8f\x79\x6e\x3f\x34\x8f\x5b\x71\xbf\x5c\x15\x89\x37\xf4\x5b\x5c\x71\xb2\x4c\xd1\xac\x57\xc3\xdb\xe9\x84\x5f\x5c\xd1\xf7\x4e\x3c\x43\xdf\x6d\x1f\xf9\x50\xe7\xe5\xfa\x5d\xbd\x12\x57\xbb\xe5\xfd\xfc\xd4\x5b\x3f\x52\x7a\xfb\xda\x6e\x53\x17\x02\xf2\x23\xfd\x16\xe9\x9d\x77\x43\xcf\x0b\xb1\xab\x73\x61\xfe\xb1\xfe\x44\x29\xdb\x32\x69\x2b\x16\xcb\xed\x6e\xbd\xf9\x92\x25\x8f\x53\x8a\x98\x0d\x3a\xe7\x9a\xfb\xa6\xd5\x98\x7c\xf3\x48\x67\xa6\x47\x58\x5f\xbd\xab\x0f\xb7\x5a\x45\xc5\xc5\x3a\xa1\xcd\x38\xbd\x7b\x68\xb1\x6c\xee\x4e\x3c\x43\xc9\xe9\x91\xd9\xfa\x21\x2f\xed\xf5\xfa\xe1\x8b\x58\xcc\x9b\x87\xbc\x06\xf3\xe6\x41\x34\xeb\x4f\x45\xef\x4f\xe8\x37\xa5\xae\x1f\x77\x65\xf2\xfa\x71\x27\x1e\x36\xcb\x55\x29\x42\x3f\xa4\x14\xf1\x79\xbd\x69\x72\x79\xfe\x2b\xfd\x16\xdb\x66\x79\x57\x3c\xfe\x9e\x13\xc4\xac\x59\x3e\x0c\xa7\x8c\xeb\x2e\x4d\x7c\x5c\x6e\xe6\x9f\xeb\xa6\x29\xb5\x1b\x27\x09\x1a\xcb\xc5\x68\xdb\xee\xc4\x66\x7e\xb7\x2e\x14\xc2\xdd\x5a\x3c\xae\x8a\xb4\x9f\x56\x77\x6b\xb1\x9d\x6d\xd6\xc5\x57\xdf\x73\x02\x29\xd4\x66\x2e\xb7\xf3\xdd\x6e\xb9\xfa\xb4\xbd\x1a\x08\xfe\xfb\x36\x5d\x5c\xed\x3e\xaf\xe5\xe7\xfa\x4b\x6a\xf7\xe2\xb9\x1f\x3f\xaf\xff\x5a\x7f\xe1\x96\xdf\x8a\xed\xe7\xe5\x6e\x96\x0b\xe0\x7b\x4e\x10\xbb\xf5\xba\x29\x04\x8b\x7e\x8b\xab\xcf\xcb\xd5\xdd\xfa\x33\x89\xca\xb6\x10\xe9\xbf\x72\xfa\x35\x25\xf7\x0f\xdd\xd7\xbf\x1c\x3f\x72\x53\xff\x72\x78\x60\xb9\x3a\xf1\xc0\x72\xd5\x3f\xb0\x99\x93\xd8\x9e\xc8\xe8\x2f\xe9\x86\xb8\xfa\xdb\x7a\x7d\x2f\xcb\xcf\xdc\xae\xd7\xf7\xff\xb6\x6a\x6f\x0d\x74\x0b\xdd\x23\xe5\xf2\xf3\x3c\x97\xb7\xff\x3e\xff\x22\x9a\xe5\x87\x4d\x5d\x8c\x99\x49\x4a\x11\x1f\xd6\xcd\xae\x98\x70\x9a\x9d\xf8\xbc\x99\xaf\x8a\x56\xfb\x2b\x27\x88\x0f\x8f\x4d\xb3\x9d\x7f\x99\x17\x33\x4e\x4a\x12\xbb\x7a\xf3\x69\xbe\x2b\xc6\x2a\x25\x88\x8f\x4d\x7d\x5f\xe8\x2f\xfa\x2d\x16\xeb\xc7\xcd\x27\x32\x92\xf2\x31\xd0\xa5\x89\xab\xd5\x5a\xd6\xb3\xd9\x7c\x5b\x74\xec\x9f\xd7\x23\x4e\x13\xeb\xcd\xa7\x7a\xb5\xfc\x1b\x5b\x24\xf9\x14\x9a\x25\x8b\x0f\x75\x53\xaf\x66\x45\x49\x53\x8a\xb8\x5a\xde\xc9\x0f\xf5\xdd\xa7\xa2\xdd\xff\xed\xee\x77\x94\x24\x36\xf3\x87\x79\xbd\x2b\x04\x98\x12\x5a\xb1\xfc\xb4\x59\x3f\x3e\x0c\x65\xf2\x4f\x94\x28\x1e\xea\x87\xf9\x86\x86\x52\x3e\x1e\xbb\x34\xb1\x5d\x6c\x96\xab\x5c\x33\xbd\xe7\x04\x71\x95\x6a\xb9\xfc\xb0\x6c\x96\xbb\x2f\x52\x15\xea\x29\xbf\xa5\x86\x8f\xe2\x93\x8f\xa2\xb8\xda\xae\x37\x3b\xf9\xe1\x4b\xfe\xc8\xfb\xf5\x66\xf7\xbb\x2f\xe2\x6a\xb6\x6e\x9a\xfa\x61\x3b\xe7\x99\xb6\xd0\x57\xed\x0d\x9a\x6c\xc5\xd5\xfc\x97\x07\x36\xbd\x06\x0f\xfd\x81\x93\xf9\x91\x0f\x9b\xe5\xfc\xe3\xac\xde\x16\x4d\xdc\xa5\x71\x3e\xeb\x8d\x7c\x58\xce\x7e\x9e\x6f\x06\xd9\xac\x37\x3f\x70\x32\x3d\xf4\xf0\x45\xee\xd6\xb2\x57\x41\x57\x03\x35\xf9\xe3\xfa\xa0\x89\xae\xd2\x94\x59\xd6\x3c\xcd\x9a\x28\xae\xee\x36\xf5\x27\x36\xea\xca\xb9\xe8\xc0\x98\x2a\xee\xd7\x85\xb4\xdc\xac\xd7\x2b\xb1\x7d\xcc\x93\xde\x3f\xae\xc4\xe7\x7a\x55\xa8\x4e\xb2\x46\x67\xcd\x7a\x35\x2f\xa7\x95\xd5\x5c\xdc\x25\x2e\xe1\x3c\xb3\x94\x52\x14\x46\xce\x98\xa9\xf5\x74\x99\x12\x8b\xab\x98\x33\xb9\x67\xde\xcc\x9c\x20\x9a\x8e\x03\x31\x1f\xb6\x5d\x9a\x78\x20\xb3\xb0\x90\xb6\xed\x6e\x2e\x1e\x5a\x3a\xa5\xc2\xe2\x48\x49\xad\x10\xff\x6d\x79\x24\xc2\xb7\xcb\x87\xbe\x79\x07\x0b\x8b\x1e\xa2\x54\x6c\x12\x3e\xe3\xbb\x23\xc4\x46\x41\x86\xd9\xc0\x24\x13\x1f\x97\xc5\xbc\xff\xc7\xe5\x76\x21\x3e\xae\x37\xf7\xef\x4a\xdc\x01\xf1\xf1\x71\x5e\xcc\x2d\x8f\xf3\x46\x6c\xbb\xf0\xc5\x77\x27\x42\x1a\xc5\xae\xfe\x50\x94\x82\x23\x5d\xc4\xd5\xdd\x7a\x77\xc2\x16\xe9\xbd\x18\xc5\x9e\x83\x0b\x72\xcb\x92\x13\xc4\xac\x77\x62\xce\x7b\xb8\x4f\x14\x1f\xe6\xbb\xfa\x5d\xe9\x0b\xd8\x4b\x77\x3a\x6d\x3c\x16\xef\x94\xfe\x1f\x22\x19\xf5\x70\x37\xff\xb8\x5c\xcd\x7f\xd8\xac\x1f\xe6\x9b\xdd\x97\xff\x76\xb4\xe2\x13\x57\xf3\xbb\xe5\xee\x4a\x2c\xe1\x6e\xbe\x9d\x6d\x96\x0f\xbb\xf5\xe6\x7a\xbd\xfa\xb8\xfc\x74\xfc\x2c\x24\x03\xfd\xdb\x6f\x5f\xfe\x71\x32\xdd\xe5\x19\x39\xd0\xf3\xe7\x7c\x3f\x69\xc5\x97\x7d\x9b\xed\xe4\x73\x3e\x7e\xb7\x9e\x3d\xde\xcf\x57\x2f\x2d\x3b\x49\xf8\x39\x9f\xaf\xef\xee\x5e\xda\xee\xcd\xe3\x59\x05\x9f\xd1\x64\xd3\xbc\xf0\xe3\x1f\xea\xd5\x39\xdf\xde\xcc\x79\x49\xfa\xa2\x6f\xff\x8f\xd2\x4e\xff\x7f\xce\xc9\x67\xbb\xfc\xb4\x22\xf3\xe3\x65\x95\x60\xf3\xf5\xec\xcf\x93\x09\xf3\xe2\xef\xaf\x1f\x77\xe7\x64\xc0\x6b\xc2\xd5\x72\xf5\xe9\xa5\xdd\xb0\x6e\xce\xfa\xfe\xc7\x86\x8c\xc5\x45\xbd\x79\x69\x15\x72\xcb\xe5\x2c\x31\x6d\xe6\x2f\xcd\xe3\x7f\x9c\xda\xd3\x39\xab\xd7\x1f\x96\xab\xd5\xfc\xc5\xc3\xa2\xdd\x5c\x3a\xab\x36\xbb\x5d\x3d\x5b\x9c\x31\xaa\x7b\xe3\xea\x1f\x2f\x97\xb4\xc3\x23\xef\xd6\x9f\x5f\x3a\x4c\x92\x2d\xf8\x8a\x3c\x5e\xac\x64\xd3\xf3\xdf\x7e\x2b\xae\x1e\x57\xe9\xeb\x77\x57\xff\xe5\xbb\xdd\x97\x87\xf9\xfa\xe3\x37\x69\xed\xf1\x5f\xff\x6b\xfa\x17\x16\xf5\xf6\xfb\xcf\xab\x3e\xf7\xab\xeb\xa6\xde\x2c\x77\x5f\xfe\x6d\xb6\x5e\x6d\xaf\xbe\xed\x1f\xcb\x93\xa1\xbe\xbb\x3b\xce\xf5\xdb\xff\x10\x57\xf0\x2f\x0f\x9b\x35\xef\x63\xfd\xcb\x92\x9e\xfc\x97\xed\x66\xf6\x2f\x5b\xbe\xfd\x2f\xf7\xf3\xbb\x65\x2d\xd3\x0f\xd8\x6d\xaf\xde\x7d\x7c\x5c\xcd\x48\x38\xff\xdb\x4e\xcc\xc5\xe6\xdb\x7f\xbf\x7a\xdc\xce\xbf\xd9\xee\x36\xcb\xd9\xee\xea\x5f\x9f\x68\x1b\x71\xf5\xbf\xfe\xd7\x7c\x7b\xb3\xbe\x7b\x6c\xe6\x57\xe2\xdf\xf7\x75\xf3\x38\x7f\xf7\x5f\xaa\xff\xf8\x56\xcc\xe1\x86\x32\x48\x65\xf9\x2e\xdf\xe6\x98\x6d\xd6\x0f\x8b\xf5\x6a\x7e\xf3\xb8\x9b\x9f\xbc\xf1\x5d\xbe\xdb\x74\x37\x5f\xff\xa9\x6e\x9a\xf9\xe6\xcb\x77\xc5\x22\xa0\xa9\xbf\x7c\x5f\x3c\x9a\xd2\x46\x4d\x93\xa5\xfd\xdb\x7d\xfd\x69\x7e\xfc\xfa\xcd\xe3\x76\x39\xfb\xf3\xba\xc8\xfe\x8f\xcb\xe6\xfe\xfd\x6e\xb3\x7c\xf8\x2e\xdf\x04\xa8\xef\xb8\x44\x79\x05\x92\x99\x32\x28\x7c\x4a\xfc\xe9\xe1\x28\xe9\xf7\xeb\xcf\xab\xef\xf2\x65\xc6\xe3\xc7\x8f\xcd\x51\x0d\xaf\xeb\xfb\xf9\xa6\xce\x52\x8f\x12\xfe\x58\x6f\x77\x7f\x5c\x6f\x3e\xd7\x9b\xbb\xa2\xce\x24\x0e\xdf\xe5\xa6\xe5\xe7\xf9\x26\xcf\x6f\xb7\x7e\x28\x7e\xce\x1f\x8e\xbf\xf2\x43\xfd\xb8\xcd\x8b\xf4\x43\x53\x7f\xf9\x6e\xbf\x5e\xde\x7d\x53\xfd\xeb\xbe\xde\x7c\xb3\xfc\x6e\xf3\xdf\x4e\x8b\xd2\xe3\x6e\xd9\x6c\xff\x65\xbb\xff\x24\x77\xf5\x27\xf9\x69\xbe\x9a\x6f\xea\xdd\x7a\x43\xe2\xf4\xed\xbf\x0e\x3e\xb8\x3c\xe1\x02\x76\x46\x38\x4a\xeb\x59\xef\x85\x56\xe0\x46\xc8\xc7\x3a\x74\x69\xbd\x8f\x12\xbe\xc9\xd4\x81\xc6\xa3\x9b\x51\x18\x30\x7e\xa2\xf9\xd8\x44\x39\xa8\x42\x3d\x7c\x84\x7d\x60\x26\x91\x69\x2c\xc3\x68\x70\x34\x2c\xfa\x7c\x6f\xef\x2b\x89\x16\xb4\x99\x04\x41\x59\x4d\x39\xd7\x06\x14\x54\x89\xf0\x99\x49\xb6\xa0\x72\xdd\xbb\x7c\xb2\x59\xb9\xdb\xf6\x3c\xb6\xfc\xbf\x13\x6d\xf0\x74\x34\x50\x87\xd0\xed\x52\x0d\x44\x80\x68\xb8\x5e\x83\xea\x56\xc2\x65\x45\x1b\x9c\x72\x57\x82\x8f\x29\xed\xa4\xfd\x52\x04\xef\xeb\xe1\xfb\x95\xd4\xe0\xa9\xc4\x03\x36\x6a\x12\x92\x0b\x74\xa2\x42\x88\x5a\x68\x1c\x3b\xa8\x86\x85\x57\xc2\x50\x47\x46\xea\xc8\x13\x37\x29\x51\x98\x85\x83\x70\x7c\x4f\x59\xbe\x3d\xe5\xd7\x8f\xef\xb6\x99\xde\xde\x28\x2d\xdc\xd8\x4d\x75\xb5\xf0\x2f\xee\x95\xe7\x83\x93\x5a\xf4\x81\x54\x29\xd4\xa7\x0a\x8e\xea\xb9\x6a\xf1\x3b\x4f\xd5\x4b\xe3\x73\xf5\xea\xf2\xbd\xbd\xd1\x15\x3b\xc8\x3e\x57\x31\xa6\x7e\x7c\xa1\xb8\xfd\xf2\xdd\x95\x86\x68\x07\xbc\xc8\x4a\x65\xb4\xc5\xa1\xe5\x45\x86\xca\xb7\xd4\xc8\xf4\xd7\xdb\x72\xc6\xab\x44\x97\xfc\xca\xac\x4b\xd0\x9d\x4c\xd9\x5d\x40\x6e\x6d\x3a\x32\xef\xdd\x94\x94\x44\x89\x53\x0b\xde\xf7\x8e\xc2\x24\xa1\xca\x0b\x03\x8a\xc9\x23\x50\x33\xd0\xdd\xc1\xd3\x38\xe9\x19\xb4\x8b\x6a\xc2\x0f\x6a\xc5\xd8\x5b\xfd\xdd\x36\x8b\xdb\x1b\xcb\x61\xf3\x53\xc6\x0f\x9b\x20\xf7\xb7\x0a\x17\x14\x57\xad\x58\x56\xc3\xa0\x32\x2e\x2b\x29\x4a\x5c\xe8\xfc\xb7\xc0\xa9\xae\xb2\xc2\xf2\x37\x6e\x6f\x30\x08\x1e\x4d\x7a\x7a\x29\x2d\x67\x13\xbc\xdb\xb0\x9d\x8d\x29\xdb\x99\xc1\xce\x15\xb5\x33\x07\x22\x3e\xd1\xc8\xc8\x60\x7c\x58\x36\xb2\x82\xf8\xd6\x21\xd2\x0a\xaa\xed\x04\x55\x83\xf3\xbd\xac\xfa\x13\xa2\xda\xb1\x87\x1f\x09\xe9\xfa\xe1\x12\xd2\xa9\x2b\x56\xa9\xc3\x0e\xcd\x9b\x4c\x98\xb1\xae\x9e\xed\xd1\x8a\x7b\xd4\x71\x87\x8e\x75\xf5\x64\x8f\x9e\xaf\x48\xdc\x90\x60\xdd\x43\x8c\x2f\x6f\xa5\x64\xd6\x5c\x62\xf2\x09\x02\x87\x00\x5b\x66\x10\xf7\x8d\x55\x19\x89\x8d\xea\x82\x23\x8f\xa3\x64\x41\xd9\x5a\x59\xa1\x3a\x37\x7e\x0f\x16\x25\xe6\xbe\x7f\xec\xde\xac\x05\x03\x59\xb7\x32\xad\x74\xef\xdc\xa6\x52\x54\x20\x3f\x31\xf8\x8c\xc0\xb3\xf5\x84\x94\xbc\x9a\x9d\xdf\x9d\x6c\xb7\xfe\xee\xa9\x06\x4c\xec\xb9\x19\x98\xa4\x1c\x34\x60\xf5\xba\x06\x7c\xb6\x48\x38\x28\x92\x4e\x6c\x9b\x16\x48\xbe\xc1\x98\xfa\xd0\x6a\x4a\xaa\x28\x3d\x64\x08\xaf\x32\xb5\xdb\xa8\x6b\x37\xd6\x16\xec\xa3\xad\xd8\x45\x2f\xa6\x4b\x6b\x2c\xf5\x5f\xbe\x68\x05\xf4\xf0\x6e\xda\x4d\x68\xc1\x71\x92\xb7\xbb\x32\x0c\x7a\xaf\x85\x52\x23\xc5\xd8\x92\x0c\x85\x99\xfc\xdc\x92\xeb\x96\x1e\x6b\x0d\x2e\x1c\xdd\xd6\x86\x1d\x34\xd5\x04\x23\xc3\xb9\x81\x32\xc7\x9f\xe8\xb3\x39\xbf\x66\x7c\x56\xf3\x94\xb0\xa4\x9b\xbf\xe5\x60\x7b\xae\x40\x58\x16\x28\xc5\x27\xb0\xab\xa3\x12\xd5\x28\x93\x13\x76\xb0\x64\xa6\x8c\x7a\x28\x2a\x22\x17\x15\x64\x1b\xdf\x83\x1a\xf9\x14\x90\xd0\xb9\x2a\xb5\xb1\x0f\xf6\x89\xd2\x77\xe0\xd5\x67\x96\x5f\x0f\x6e\xa6\x63\x32\xc6\xc0\xd6\x55\x02\xc0\x76\x8c\x7e\x6d\x2f\x33\xf5\x52\x07\x64\x61\xfe\xd5\x51\x98\x7f\x1a\xcf\xb7\xf7\x2c\x58\x1e\x5c\xa8\x4b\xc9\x4a\x81\x64\xec\x4b\x3b\x0d\xe0\x6c\xdd\xc6\x95\x61\xec\xfd\xca\x6c\x10\xd5\x54\x05\x18\x0a\xa5\x6a\xa1\xa0\x55\x04\x17\x18\x47\x00\x3d\xf8\x38\x8a\x09\x68\x3a\x84\x83\x29\xaf\x18\xf9\x9d\x3e\x7e\x08\x85\xe1\x00\x20\xc3\x2b\xb0\x22\xce\x46\xc9\x94\x16\x51\x30\x04\x35\x5f\x5a\x8d\xca\x8c\xa5\x96\xd1\xe5\x2b\x9f\x2e\xed\x02\x48\x5a\xf0\x6e\x34\xf8\x12\xa3\xef\x56\x80\x27\xf2\x95\x80\x27\x4a\xda\x56\xe1\x3c\xbb\x68\xa8\x1c\xf2\x5e\x1a\x6a\x3e\x1a\xff\xac\x9f\x16\xd2\x8d\x22\x03\xe2\xf7\x65\xe5\x98\x94\x10\x6b\x55\x09\x55\x75\xda\xd0\x42\xd0\x32\x88\x4b\x36\x5c\x7b\x69\xd7\xba\xc6\x4a\x04\x13\xc7\xac\xa3\x46\x83\x00\x2b\x86\xc2\x25\x35\xbb\x37\x1c\x80\x58\x88\x86\x6c\x45\xe3\x19\xb1\xd9\x83\x57\x8d\x06\xef\xa4\x03\xab\x8e\x05\xb5\xce\x04\x55\x26\x26\x6a\xf7\x72\x7d\xf2\x6b\xad\x8f\xff\x94\x6a\xbb\xad\x55\xa1\x46\x4a\x91\x3a\xa1\x21\x6b\x0f\x86\x06\x84\xe9\x44\x41\x83\xf5\x12\x58\xc4\xb5\x88\x5d\xc0\xc0\x6f\x28\x65\xe7\x0d\x4f\xcd\x71\xde\xfd\x38\x24\xf3\xaa\x55\xd7\x36\x5d\xba\xac\xa5\xa3\xba\x28\xde\xaf\x51\xed\xae\x0d\x83\x1d\xd1\xb2\x9a\x57\xdc\x1e\x8c\x13\xfe\xc0\x8c\xde\xe9\xf9\x1b\xc5\x58\xfc\xbf\xa6\xe4\x9e\x90\xf2\x33\xa6\x89\x5f\xe9\x40\x3c\x67\x8a\x18\xf0\xfb\xf1\xe6\xe1\x25\xac\x6a\xc6\xe5\xa6\x85\x56\x68\xa8\xf7\x35\x4a\x85\xf9\x82\x4c\x6a\x50\xb6\xe9\xef\xa8\xe4\x4d\x1f\x0f\xee\xd4\x95\x93\x80\x38\x52\x0c\xbf\x41\x97\xce\xd7\x58\xb8\xbd\x03\x3f\xd1\x15\xf5\x93\x01\xf3\xcc\xcb\xd9\x42\xc6\xf0\x12\x26\x5b\x0c\xa9\xc4\xe0\xef\x99\xad\xc8\xa4\x4b\xd7\x1f\xe9\x75\x66\xb1\xd4\xa0\x15\xbd\x38\x28\x87\x4c\xa3\xee\x99\xb7\x6f\x6f\x34\x0a\x5d\x35\xf4\x13\xcd\x84\xe7\x4c\x08\x53\x37\xd1\x22\xf1\x1f\xe8\x6a\xaa\x22\xe0\x71\xbf\x9f\x3f\x47\x33\xd1\x39\x37\x36\xc3\x94\xab\xc8\x7e\xfb\x4f\x35\xf6\x68\xd8\x5e\x2a\x0a\xe6\x5c\x66\x82\x07\xba\x1c\x37\xb5\x73\x2f\x6f\x6a\x4d\x1d\xf3\xd6\xd6\x2e\x8a\x22\x7f\xe5\xdd\xa3\xad\xc9\x7c\x6f\xfc\x32\xd2\xec\x79\x6f\x26\x66\x32\x2c\x21\x50\xe6\xa3\x32\x5a\x57\xd1\x74\xc3\x7b\x70\x7b\x49\x6d\xc7\x44\xf4\xd4\x35\xf5\xa9\xc2\xb3\x23\x7d\xd1\x48\xcc\xf7\xb1\x97\x98\x6f\x6d\xf0\x7e\x86\x81\x27\x86\x09\xb5\x9d\x62\xc2\x02\xa7\xa6\x16\xa2\xaa\x87\x25\x82\x98\x3e\x7b\xba\xe3\xb5\x49\x92\x21\xca\x01\x4a\xb9\xda\x89\x4a\x83\x38\x2b\x4c\xd6\x16\xb7\xf7\x95\x54\x08\x21\xed\x44\xd2\x57\xd0\x49\x85\xfd\x78\x17\x2d\x76\x74\x50\x13\x23\xa8\x64\x7b\x3c\x31\x4b\x9d\x2f\xee\x1e\xbc\x12\xfa\x64\x57\x94\xca\x42\x39\xa1\xab\xae\x1f\xd2\xee\x1a\x87\x30\x9e\xec\x88\x51\xbe\x0f\xa2\xab\x62\xa7\x84\xf1\x42\x0d\xfc\x6a\x07\x44\x66\xbe\x2f\x0b\x91\xe8\x04\x92\xf4\x9e\x7a\xf7\xe9\xd6\x6f\x35\xa7\x50\x38\x68\x7f\xde\x67\x1b\xca\x7c\x7b\x40\x74\x4a\xdc\x5b\xb8\x84\x30\x46\x03\x7e\x82\x1a\x1c\xf5\x07\xe6\x78\x06\xa8\x38\xf2\x78\xac\x0c\x60\x86\x7b\x20\xdb\x88\x67\x0c\x13\xa5\x40\x8b\x30\x36\x39\x04\x3e\xef\x17\xfd\x1a\x6c\x82\xaa\x4a\xdc\x84\x70\x7b\x4f\xa6\xcf\xd8\x4c\x55\xb5\x08\xe0\x7c\xa3\xc0\x5a\x69\x16\x1e\xac\xe3\xbf\x85\x19\xeb\xf3\x08\xfe\x4f\x0b\x15\xd5\x9b\x09\x1c\x32\xcc\x42\x99\x63\x16\xd2\xcd\xdb\x7b\xe5\xc8\x24\xa1\x79\x9d\xc3\x1d\xab\x1e\x58\x9e\x94\xa9\x07\xa3\xd2\xa5\xea\x42\x48\x8c\x38\x0b\x80\x0b\x9f\x2b\x1d\x1b\x2c\x1c\x5f\x09\x01\x7a\x9b\x39\x48\x08\x63\x07\xca\x67\xa9\x82\x29\xca\x17\x08\x66\x94\x25\x1e\x3e\xf0\x8a\x40\xe0\x53\x25\x52\x98\xa2\xc3\x6a\x0b\x96\xf9\xb3\xbb\x43\x20\x4d\x9a\xcc\x36\x49\x9c\xb5\x6f\xe3\x41\x15\x43\x4e\x33\xa0\x87\x53\x0d\x8d\x43\x3e\x2f\xb3\x60\x9d\xb0\x87\x78\xc7\xee\xab\xaf\x08\xb3\x3d\x55\xc8\x7f\x24\x61\xbe\xe1\x8d\x7b\xa5\xc1\x65\x7d\x98\x50\xe4\xb9\xb7\x8a\x44\xea\xc2\xb4\x92\x0d\xbd\x50\xaa\x42\x28\xd3\x22\xf1\x28\x64\xf1\x57\x70\x36\x4e\xf6\x64\x9a\x74\x69\xed\x50\x0f\xec\x65\xee\x32\xe1\xc0\xa8\xa6\x23\x99\x32\x39\xf8\x26\x20\xca\x00\x3a\xf6\x77\xf9\x0b\x2e\x21\x94\xb5\x6d\xa9\xc0\x32\xef\xe0\x4b\x8b\x7a\xb4\x85\x9b\x9f\x73\x5f\x62\xbf\x9b\x03\x09\x39\xae\x99\x81\x1e\x54\xbf\x69\x03\x1c\x37\x19\x45\xd6\xd7\xa0\x78\x7a\x43\xa6\xad\x72\xd3\x30\xe0\xf5\x70\x87\x68\x67\x69\x84\x99\x62\x96\x20\x8c\x30\x63\x34\x03\xb9\x40\x03\xa6\x61\x68\x17\x7d\x74\x7c\x8a\x80\x1c\x8b\x56\x14\x8b\x4c\x52\xb4\xe0\xdc\xed\x8d\xe6\x49\x81\x91\xe6\x66\x92\x5b\x58\xf2\x63\x12\x54\xa4\xdf\x13\x64\xc8\x27\xef\xa7\x18\x8e\x36\xf4\x55\x55\xec\xe8\xd3\xb0\xd8\x7b\x40\xdd\x78\x08\xd2\xd6\x90\xa4\xa0\x9d\x8a\x78\x73\xab\x4c\xaa\x3c\x28\x35\xe5\x92\x8c\x8a\x3b\x59\xa9\x2e\x30\x69\x33\x19\x20\xaf\xf5\x13\xb9\x52\xbc\x44\x9b\x6b\xa8\x42\xe3\x98\x50\xcf\xda\x91\xea\xe8\xb4\xb3\xe6\xf5\x4c\xc9\x85\xc3\x7b\x5d\x61\x8e\x26\xd1\xce\x1b\xe3\x02\xf2\x88\x09\x69\x52\xd1\x14\xc7\x44\x8d\xcc\xfb\xd7\x03\x08\x27\xc6\x0b\xa6\x91\x98\x24\xd1\xad\x42\xc3\x90\xfa\xe0\xd5\xa2\x9a\x60\x20\x8d\x69\xc0\x14\x1c\x54\x87\x57\x2a\xea\xa9\x98\xd3\x7a\xd1\xbc\xe1\xc0\x4e\x94\x4f\xac\x88\x15\x0d\x5f\xc5\x28\xf5\x2f\xe8\xbe\x17\x1c\x54\xa8\x16\x2d\xa1\xf2\xe3\xac\x50\xd4\x19\x8b\xb4\xe8\xed\x93\xd8\x1e\xb3\x13\x65\xc9\x72\xa5\x45\xb8\xe1\xa0\xcb\xb7\x15\x43\xb7\xed\xca\x0d\x83\x55\x0e\x66\x9b\xb5\x4c\xd3\x92\xdc\x8c\xb9\xfd\x27\x8a\x37\xec\x63\xce\xde\x51\x25\x73\xd1\x8e\xf3\xce\x48\x95\xa8\x7c\x13\x81\xf7\xf7\xed\xa0\x3a\xf4\xc1\x08\xb1\x91\x5a\xe4\x75\x3f\x64\x6b\x20\x5a\x69\x20\x9a\x45\xd5\xb4\xbd\x78\x24\x5d\x99\x03\xd0\x25\x04\x4c\x33\xde\x90\x65\xe6\xbc\x03\x42\x81\x65\xcc\x0e\xdb\x86\x87\x77\x71\xc1\x49\x99\xa8\x8a\x21\x14\x06\x47\x46\xa3\x40\x4f\x85\x43\x08\x31\x6a\x8e\x9d\xce\x80\x0f\x44\x96\xd9\xa5\xc4\x29\x94\x36\x3c\xb5\xa2\x04\x1b\x27\x91\xf7\xcc\x4c\x36\x39\xb7\x9a\xce\x94\x87\xd1\xe3\x48\xd6\xb3\x07\xad\xa5\x67\x70\x90\xc3\xcd\xea\x78\xfd\xc9\xec\xb0\xa1\x58\xc9\x24\xe8\x78\x23\x94\xd9\x87\x71\x64\x04\x8e\x0c\xec\x32\xd9\x09\xbc\x4e\x77\x8d\xf4\xd4\x70\x69\x7b\xfb\xd0\xd4\x5e\x81\xe6\xd9\xfc\xc4\xb1\xe8\xd9\x1a\xf2\x1f\xba\x3b\x9f\x3e\xf3\x6e\x59\x82\xb4\x11\x8c\x49\x13\x85\xc2\xb1\x1e\xd0\xfe\xa1\x1e\xd0\xfe\x05\x08\xba\x89\x34\x32\x03\x14\x9c\x7a\x15\xaf\xd1\xec\xd4\x80\xc3\xe2\xc8\xb0\xcb\xe0\x89\x31\xf5\xd3\x45\x8e\xcc\xfb\x56\x41\xfb\xb6\x2e\x10\xc3\x2e\x60\xf1\x33\x50\x15\x3c\x52\x87\xdc\x2e\x34\xa4\x68\x16\xe7\x8d\x20\x55\x88\xa9\x61\x5a\x99\x38\x52\xc8\x60\x0f\xd8\x61\x1c\x57\x24\x13\x8e\xf7\x6a\xfb\xf2\x27\x60\x80\x40\x85\x35\xa6\xbd\x1e\xaa\x80\x25\x0f\x56\x9f\xdb\x85\x54\x3b\x8f\x48\x32\x57\x2f\xa5\x15\x74\x1c\x68\x85\x3d\x9a\x97\x68\x05\xa8\xdc\x73\x8a\x41\x27\xbd\x00\x95\x9b\xba\x09\x19\x9d\x96\x81\xcf\xbe\xbe\x6a\xf8\x87\x94\xcb\xe7\x75\xc3\x3f\xb6\x4c\x3e\x4d\x46\xde\xe9\x35\x2d\x0c\x53\xe1\x0a\x85\x8b\x8c\x16\x8e\x15\xdb\x3e\x16\x48\x68\x9d\x6a\x0b\x0d\xb3\xe0\x06\x40\x73\xa4\xdb\x8c\x9e\x1a\xf0\x43\xdd\xa6\x85\x79\x42\xb1\xb1\x57\xf1\x25\x56\x47\x64\x8c\xd2\x82\x4f\x44\x50\xac\xa4\x07\x6b\xdf\xfd\x10\xfe\x92\x06\x5c\xd3\xed\x7e\xf8\x6c\xd5\x5b\x4e\xdc\x95\x00\xef\x18\x76\x27\x7b\xbd\xa2\x59\x13\x11\xbc\x6f\x2c\x84\x28\x2c\x43\xe7\x00\xcd\x37\x56\x82\x89\x0c\x3f\xe8\x2d\xef\x28\x1f\xac\xac\xd8\xee\xf2\x1a\x48\xbd\xdc\xdb\x58\x9a\xa9\xbc\x1a\xe6\xfe\xa4\xcb\x44\xb3\xb3\x99\x15\x96\x87\x98\xae\x68\x7e\xf6\x34\xe0\xbd\xcf\x5a\x36\x32\xb2\x11\x6f\x34\x99\x71\x04\x97\x53\x9c\xb2\x89\xa6\x1b\x40\x27\x01\x1d\x93\xbd\x55\x10\x2e\x65\xdb\x60\x0b\x6a\xe4\x92\x80\x33\xcf\xbc\xe9\xf5\x10\x93\x83\xd2\xca\x9b\x6e\x30\x8d\x9c\xe1\x3f\x4d\xf7\x0c\xf3\x3f\x7a\x06\xd3\x3b\x50\x90\x90\xd9\xea\x49\x5b\x5d\xca\x8e\x46\xc6\x64\x41\x9a\x69\x87\xd0\x87\x2d\x28\x77\xcd\x5b\x1b\xae\x03\xdb\x6a\x15\xa6\x06\xaf\x68\xe5\x8c\x1a\x14\x19\x1b\x0c\x38\xd3\x93\xa8\xa2\x4f\xaf\x06\xea\xac\xd0\x1f\x54\x4a\x03\x4a\x7a\xde\x90\xe8\xeb\x93\x5c\x9a\xde\x5a\x1d\xd3\xcf\x1d\x6e\x1f\x41\xd9\x06\x45\xee\xb7\x58\x49\x4d\x53\x08\x19\xea\x13\x85\x82\x59\x74\x3b\xab\xfd\x4d\xb6\x8f\x3a\x74\xb5\x7f\xb2\xab\x19\xe7\x0b\x1d\xe8\x41\x6f\x33\xce\x92\xd1\x59\x6f\x9b\xbc\xb7\xab\x33\x7b\xfb\x57\x54\xb0\x07\x66\xca\x75\x7e\x51\xd1\x42\x94\xa1\x1c\x83\x91\x7c\x82\x6b\xfd\xa2\x9a\x18\x70\x5a\xd0\xb2\x09\x5b\x25\x11\xa8\x13\x2f\x61\xc8\xa1\x06\x6c\x2c\x58\xd2\x01\x96\x74\x80\xf2\x40\x23\xcf\x00\x32\x35\x79\x4e\xb0\xde\x69\x80\x19\xf3\x18\xaa\x08\x1e\x25\x1f\x18\x57\x41\xd2\x1a\x1a\xd9\x04\x00\x65\xf8\x44\x8a\x54\x40\xc3\xb8\x91\x7c\xb9\x80\xba\x7f\xdd\x88\x30\x28\x34\x44\x3c\x74\x70\x1d\x68\xd5\xcd\x97\x6e\xaf\x82\x49\xd0\x2f\x3b\x22\x9e\x04\xef\x6e\xb1\xa8\x05\x99\xd0\xc5\x02\xd9\x39\xd6\xa2\xd2\x51\x41\x2d\xb8\x09\x56\x8c\x69\x7f\x3c\xf5\x64\x51\x2e\x97\xf1\xb0\xd4\x24\xf4\xc8\x14\xa2\xd8\x6f\x41\x72\xe6\x53\xad\xc8\x62\x1b\x21\x8d\x00\x3c\x50\xb1\x2b\xa4\xc1\xa3\x19\x2e\xdb\xf9\xa3\xdb\x91\x61\xd9\xc7\x6e\x4a\xdf\xa0\x81\x87\xbc\x0b\xde\x77\x97\x0a\xc2\x8a\xe3\x64\x9d\x6a\x3c\x55\x71\x8c\x0e\xc2\xd1\x67\x91\x9d\x35\x9c\xdf\xbb\x53\x99\xd2\x2b\x42\xab\xb1\xc6\x36\xdb\xa3\x3a\x51\x55\x6f\x6f\xa8\x70\xa8\x06\x14\x64\xa1\xfb\xec\x80\x53\x91\xd2\xc7\x6e\x8a\xea\xf6\x06\x5d\x5e\xe7\xe1\xfb\x92\x1e\xd4\xd5\x3e\xa4\xa2\x97\x8c\x94\xed\x9b\x97\x38\x5d\xfb\xb5\xde\x0a\xe9\xa0\x8d\xc6\xe5\xa1\xb7\x2a\x81\x91\x4b\x8e\xd4\x70\xc3\xdb\x81\x1b\xe4\xd5\xbd\x85\x6a\x4c\xb3\xca\xd1\x67\xa9\xd6\xd8\xf7\xd6\xd1\x5d\xff\xa2\xde\x3a\x3a\x3a\xee\xa3\xbe\x2e\xe3\x83\x6d\xc6\x2e\xb3\x8c\x06\x6e\x08\xed\x21\x43\x35\xd8\xd8\xcc\xdf\xa0\x4f\xf0\x81\x99\x1b\xbb\xa9\x1b\xeb\x37\x6f\xa3\x75\x6b\x76\x03\x2e\xc5\x99\x0c\x1c\x52\x98\x36\x9d\x77\x0f\x03\xd9\x54\x25\x2c\x7c\xda\x3c\xd7\x3c\x91\xa4\xdb\xa3\xf2\xb6\x4a\xab\xa6\xd1\xd1\x37\xfb\xec\x6e\xef\x95\x0c\xa4\x7d\x74\x0a\x8e\x12\xca\xd2\xad\x44\x90\x7f\x54\xb5\x63\xc7\xf2\xe7\x2d\x9b\x5f\xbe\xbb\x0a\xec\x59\x7e\xf0\xbd\xc7\x83\x57\xf9\x89\x83\xaf\xb3\x32\x30\x9c\x81\x32\x5f\x2f\x07\xdb\x86\xbb\x7c\xbd\x1c\x5c\xca\xc1\x7d\xbd\x1c\x7c\xd6\x0d\x94\xcf\xe5\x73\x08\x79\x3f\x7c\x9d\x2c\x62\xde\x11\x5f\x27\x0b\x55\xe5\x5d\xf1\xe2\x3c\xce\x3e\x7a\xb9\x90\x12\x22\xa3\xc2\x2f\x70\xaf\xc7\x58\xdd\xde\x28\xd3\xfe\x50\xe6\xf6\x86\xf5\xff\x38\x4c\xd1\x2d\x92\x57\x08\xfd\xf0\xf4\xb7\x63\xa6\x46\xd3\xde\x71\xa2\x1a\x63\xd5\xfe\xd0\x7c\x2e\x57\x81\x72\x13\x65\x41\x47\x52\x0f\x05\xaf\x2c\x23\x0f\x63\x98\x2a\x5d\xb2\xec\x93\xe5\x2e\x21\xaa\x09\xad\x27\x9d\x50\xbe\xdc\x00\xa0\xa4\x00\xc1\x70\x24\x12\xd2\x4c\x9f\x97\x0b\x1d\x17\x6c\xa8\xf6\x0f\x01\xc0\x6f\x53\xfb\xc7\x2e\x7c\x29\xba\x0a\x5c\x20\xb3\xd1\xcd\xa4\x82\x88\x52\x83\xe6\x2d\x1a\x69\xf8\x20\x35\x48\x52\xb8\x13\x15\x05\xd2\x14\xaa\x4d\xdd\x2f\x9b\xfb\xd5\x00\xd9\xcb\x8e\xf1\x4a\xd3\x25\xa5\x3b\xb0\x5a\x82\x51\xd7\x1e\x2c\x03\xc3\x7a\x61\x3a\x12\x71\x61\x19\x55\x33\x42\xa0\xef\x69\x2d\x6c\xff\x9e\x40\x70\x0c\x98\x8d\xb4\xba\x0f\xe9\xd2\xf6\x35\x03\x1c\x87\x51\x04\x6b\x44\xec\xb0\x33\x2b\xa1\x98\x4c\xde\xfa\x99\x4e\x20\xb3\x8a\x2b\xe4\xa5\xa1\x8f\x3a\xa8\x9c\xf4\xa0\xdd\x34\xf2\x11\x6c\xda\xad\xe3\x6b\xea\x17\x97\x70\xf8\x69\xe1\xd3\x9f\xb9\x90\x7d\xaf\x20\xf8\x91\x66\x97\x4d\x9d\x31\x21\xa0\x12\x9e\xec\x09\x03\xca\x33\xea\x3f\x68\x27\x5a\x17\xce\xc0\xde\x6e\x82\xcc\x6e\xa3\x68\x36\xd2\xf4\xac\xe3\x79\x89\x2a\x52\x1c\xcf\x68\xcd\x44\x01\xd7\x98\xc2\x39\x18\xb7\x59\x1b\xb0\x42\xf1\x09\x67\xdb\x2b\x24\xce\xa0\x39\x0e\xcc\xf9\xda\x31\x99\x6c\x0f\xd1\x2f\x2d\x93\x3d\xf3\x74\xc5\x97\xce\xf2\x77\x51\x22\x54\x7e\x26\xc1\xa5\x62\x28\x30\x56\x5a\xa8\xac\x30\xd4\xa7\x2e\x9d\xbc\x5b\x6a\x63\xdb\x2f\x09\x41\x33\xe2\x37\x83\xed\xdb\x3c\xdd\xa5\xbd\xab\x32\x1b\x06\x37\xe5\xc3\xe4\x6b\xc5\x9d\x81\x8c\x6b\xab\x38\xce\x20\x39\xe6\x65\x45\x7f\x9b\xfd\x77\x11\xd9\xc5\x58\x33\x2b\xaf\xed\xbc\xde\x49\x76\x13\x41\xc0\x53\xb2\x3b\x63\x4e\x00\xee\x2c\xc9\x2e\xb4\x16\x94\x96\x16\x22\xad\x2a\x8d\xbf\x9c\xec\xe2\x4c\x33\x9b\x81\x8a\xb4\xb4\x23\xc9\xf5\x9d\xe4\xf6\x3b\x2f\xfc\xdf\x34\x80\x89\xb3\x8e\x1e\x42\x93\x28\x0a\x0d\x01\x79\x0f\x29\x21\x90\xf7\x10\xe4\xcc\xc4\xef\xa8\xef\x1d\xbd\xe1\x5c\xf2\x35\x26\x73\x58\x20\x3d\xcd\x8e\x44\x87\x60\x08\xe7\x04\x8a\x57\x88\xe8\x50\x63\x15\x48\x06\x4f\x7b\x7d\x71\xcb\x56\x63\x4d\xcd\xa2\x98\x10\xbd\xef\x18\xc1\x74\x11\x21\x4c\x75\x05\xec\x16\x5a\xde\xd5\x2d\x97\x33\x7f\xe3\xf8\xae\x11\xfc\xda\x94\x3f\x71\x7c\xbb\xcd\xb8\x75\x83\x1d\x9b\xa9\xc2\x73\x9d\xba\x06\xa4\xf4\x96\x3d\x5b\x8d\x3d\x50\xc0\x4a\x2d\x73\x0a\xd8\xc3\x23\xa4\xeb\x0d\xb8\x11\x7b\xc3\x42\xc7\x50\xc9\x54\x6a\xc6\x8a\x43\x6a\xc5\xa1\xfc\x96\xc7\x50\x78\x03\x7b\xac\x87\x28\x30\x34\x4e\xba\xe4\xac\x49\x97\x09\x2d\x35\x68\x5d\xb6\xc0\xc6\x83\x61\x21\x73\x13\xcd\xcb\x48\xef\xf7\x12\x27\xc8\x5e\xb7\xb1\x06\xaf\xc0\x1f\xb6\x59\xaa\x46\xf2\x24\x66\x79\x66\x64\x21\xc5\x0a\xec\xd1\x63\x13\xcb\x8a\xfe\x1c\x74\xf3\x21\x0f\x7a\x45\x0a\x5a\x2f\xaa\x32\xc4\x69\x21\x11\xcb\x8d\x9f\x45\x35\x35\x0b\x7c\x03\xff\x6c\x12\x07\x3f\xf5\x47\x39\xb9\xa3\x9c\xc2\xe2\x4c\x6e\xc1\x8b\xd6\xe9\x39\xf6\xd5\xcb\xd5\xe7\xe9\x0d\xbb\xe3\x5c\xfe\xae\xa3\x37\x8d\x0e\x9d\x0f\x3b\x25\x73\xe6\xe5\x6e\x00\xd1\x23\x8c\x39\x80\x61\x21\xd1\xf4\x22\xef\x73\xb9\xe5\xa6\x69\x38\x46\x89\x2e\x1c\x12\xaf\x06\x43\x80\x9f\xe1\x71\x62\x38\x52\xea\xa5\x3b\x78\x47\xb1\x0c\x1d\xf8\xcb\x53\xba\x51\x71\x0c\x07\x3a\xc0\x32\x7e\x2b\x9d\x4f\xa5\x5d\x4b\x69\x13\x31\x87\xd1\xc9\x78\x49\xf7\x79\x43\x99\x35\x7e\xba\xb4\xd3\x1c\xa5\xd2\xd8\x7d\xe2\x35\x99\x8e\xba\xa6\x5c\xaf\xba\xdf\x83\xee\xbe\xc9\x3d\xa0\xa9\xab\xac\x61\x02\x85\xae\x30\x87\x62\xde\xde\xb3\xc9\x8c\xad\x76\x88\xac\x22\x64\xf7\xd7\x39\xe4\x1b\x47\x6c\xbe\x34\x85\xd9\x05\x4d\xbf\x0d\xd2\x24\x4f\x53\x5d\x7e\x48\x85\x10\x0d\x84\x30\xf1\x34\xed\x26\x0f\x2e\x23\x54\x1e\xf7\x0b\xce\x33\xf5\x43\x76\xc4\x62\x24\x4f\x6e\x87\x2d\x6d\xa6\xc0\x31\x38\x51\xdc\x6c\x7e\xe1\x48\x47\xab\x14\xe5\x94\xc0\xdf\x59\x4f\x33\x75\xae\xe1\x06\xea\xbf\xe6\xc8\xb4\xd7\x2c\x68\xf4\xb8\xee\x1e\xaf\xda\x20\xc1\xb3\xb5\xf7\x09\x69\xf9\x7e\x75\xda\xfc\xe7\x26\x8a\x64\x7a\xa1\x1f\x44\x3a\x2b\x53\x6a\x80\x31\xf3\x90\x91\x78\x77\xd6\x8f\x02\x05\xa8\x1b\x89\x02\x1c\xe6\xcc\xff\x95\x04\x8f\xcc\xd0\x12\x0e\x23\x8f\x7f\xb8\xa1\x6c\x09\x30\x5a\x42\xc5\xfe\x28\x4c\x5a\xb3\x57\x0a\x8a\x43\xc4\xb6\x74\xff\x29\x02\xaf\x16\x81\x02\x58\xea\x7f\x7f\x7b\xea\x2b\xce\xfd\x27\x67\xb1\xaf\x32\xf7\x0f\x59\xf5\x91\x29\x2f\x5c\xd2\xaf\xe5\x76\x30\x44\x9d\x42\x27\x5d\x7b\xe9\x44\x36\x4a\x50\xb6\x89\xe0\x79\x29\x4b\x5a\x9b\xa9\x2a\x5c\xb7\x73\xc9\xd1\x53\x13\xd5\x11\xa5\x28\xfa\x72\xe2\x9a\x6d\x95\xba\x66\xa2\x3d\xbb\x0f\x7c\xae\x9f\xdf\x14\x59\x81\x6e\xef\xc1\xf1\xba\x49\x99\x1a\x30\x1e\x42\x03\x41\x19\x3e\x19\xd7\x3d\xb1\x66\x3a\x39\x02\x1e\xd0\x7d\x12\x8a\x8a\x0b\x29\x68\xb5\x37\xfc\x42\x00\x6c\xff\xbf\x9b\xbf\x28\xc9\x37\xb2\x7b\xc3\xd5\xe5\x6d\xfe\x0b\x12\x3e\x55\xf7\x06\x17\xe3\xad\x26\xde\xdf\x75\x68\xa0\x61\x7f\x53\x05\x41\x67\x55\xcf\xb7\x94\xd8\xa1\x19\x03\x13\x64\xba\x93\x5b\x4a\xe9\x13\x39\x06\x41\xf6\xd5\x57\x1a\x8b\x5f\xc7\x24\xbd\xf0\x30\x7b\xb1\x65\x95\xc1\xf2\x3d\x39\x59\x06\x81\x66\xa6\x19\x36\xc3\xd3\xf8\x11\x5e\xfa\x69\x9c\xd1\x58\x8a\xf4\x5b\x7a\xfa\x6f\x2b\xbd\xe0\x1f\xc2\xef\xc3\xb5\x62\x26\x19\xf6\xff\xa0\x46\xe7\x38\x08\xf3\xb7\x6f\x6e\x94\x16\xf4\x26\x02\x3b\x7f\x48\x2b\xac\xb4\x5b\xe6\xfb\x11\x56\xd8\x7d\xe8\x89\x9e\x11\x82\xe4\x54\x7a\x66\x2b\xad\xe4\xc7\xa5\x9d\xc6\x21\xf3\xf1\x39\x6a\x52\x28\xbf\x90\x38\xab\x84\x05\x2b\x79\x59\x5e\x49\x8e\x6d\x7e\x1f\x04\x22\x58\x11\x84\xf2\x63\x37\xab\x84\x03\x2d\x4c\x5a\xee\xd3\xc4\xc8\x5c\x8c\x53\x8d\x0b\xa9\x8f\x18\xb7\xb7\x07\xa2\xed\x30\xa4\xc4\x4e\xf5\xd9\x26\x7e\xe7\xd4\x85\x7a\x4f\x8d\x76\x4d\xb2\x2b\x98\x01\x5a\xa7\x60\xc9\x74\x44\x76\x46\xed\x70\x38\xe9\x5f\xac\x9f\x5e\x39\x32\xfe\xf9\x5a\xf7\xb9\xd1\xf8\xc4\x38\x79\xd2\x89\x6b\xd0\x06\x8a\xc9\xe0\xd9\x7d\x9d\x8c\x24\x61\x1b\xc5\x7c\xe6\xf6\x1a\x23\x68\x3e\x23\xe3\xd8\x52\x46\x4d\x38\xbb\xef\x8f\x0c\x3e\x61\x66\xc8\x66\x6a\x36\x98\x12\xe7\xbb\xcc\x69\xf1\x15\x60\xd3\x6e\x99\xcc\xd2\xbd\xc8\x1c\xea\x2a\x71\xc2\xd3\xc0\xcc\x44\x06\x49\x60\x40\x49\x07\xb1\x1d\x98\x12\xe9\x05\x69\xf9\x13\x51\x3a\xb0\xc2\x80\x9f\x28\xde\x0b\xbc\x56\x9a\x37\xaa\x63\x3a\x06\xe4\x1d\x91\x20\x8e\xc4\xe9\xe5\x22\x9d\x7a\xd1\x81\x6b\x1c\x30\xaf\x5c\xa3\xa8\xa7\xc1\x4c\x8c\x40\x70\x13\xa4\x5c\x1a\xea\xe5\x00\x66\xaa\xfc\x8c\x66\x9f\x28\x58\xf6\xe9\xbf\x59\x3a\xcb\x44\x66\xb2\xd7\xb4\x4c\x95\xaa\xa1\xe6\x41\xc0\x6b\x64\x0a\x5e\xd7\x31\xc1\xa3\x4f\x88\x1e\x5d\x45\x6d\x62\xcb\x97\x11\x02\x7b\x77\xa8\x4a\x46\x30\xb3\x96\xb1\x9e\x25\x90\xae\x8e\xe4\x19\xd8\x65\xb3\x94\x68\xdc\xeb\x0b\x89\xf3\x35\xaa\x24\xcc\x81\xdd\x39\x05\x06\xd1\x37\x0c\xab\x54\x60\xc2\x46\x4f\xcd\xaf\xc9\x7c\x8e\x8c\x2c\x15\xf8\xea\xf7\x64\xfb\x37\x1e\x18\xd7\xe6\x9a\x39\xee\x79\x2c\x2a\xfe\x04\xef\x68\x76\x1f\x38\xa3\xa3\x8e\x36\x9f\x2e\x29\xf7\x2f\xd3\x37\x68\x85\xf2\xa7\x85\xf5\x09\x31\x6d\x18\x12\xe8\x1a\xb9\x9f\xa8\x99\xf8\x13\xdd\xbf\xe7\xe8\x86\xff\x14\xd1\x33\x44\xf4\x5c\xdb\x24\x47\x16\xfe\x77\x5a\xca\xbf\x2b\xb1\x66\xc5\x43\xfd\xb8\x2d\xa9\x18\x1e\xb7\x73\x71\xb5\xdd\xcd\x1f\xe4\xc7\x84\x14\x50\x70\x71\x1c\x90\x22\xc5\x76\xb7\x7e\x78\x57\xe2\xf3\x89\x87\xf5\xe7\x92\xd7\x87\x7e\x8b\x0d\xe3\x67\xbc\x1b\x02\x6a\x88\xab\x8f\xf5\x76\x77\x2a\x9b\x0c\xa7\x40\xcc\x38\x12\xf2\xdd\x30\xa0\x5b\x5c\xed\x69\x61\x2a\xd3\xed\x92\x77\xab\x8f\x9f\x14\xdb\x14\xb7\xf6\xee\x28\x92\x4d\x5c\x25\x56\x05\x59\xb2\xa2\x74\x51\x13\xfd\x6d\x46\xc7\x3e\x7a\xe0\xf7\xeb\xcf\xab\xfe\x91\xfb\xc7\x92\x48\xe1\xe0\xa0\x2c\x16\xbd\xc3\xd8\xbb\x53\x5e\x64\xcc\x5c\x71\x2f\xb7\xbb\xcd\x11\xb1\x45\xf2\xb5\x11\x57\xf7\x8f\xdb\xe5\x4c\xae\xd6\x65\x16\xfd\xa9\xac\xb8\x5a\xde\xd7\x9f\xe6\xf2\x53\x5a\x9f\x17\xbc\x30\xd9\x39\x88\xb8\xda\xf0\x46\x8e\xac\x9b\xe6\xea\xdd\x89\xcd\xc0\xfe\x81\xf5\x6a\x7e\xfc\xc0\xf7\xab\x79\xd7\xdc\x27\x32\xca\x37\x08\xc4\x7d\x3f\xb9\xbf\x3b\x35\xe3\x8b\xab\xc3\x03\x47\x0d\x57\x1a\x06\xff\xf1\x75\x31\xc0\xb3\x91\xf1\x6b\xf8\xdf\xdb\xf5\x6c\x59\x37\x5f\x13\x00\xfc\x3d\xe7\x70\x84\x00\x3e\xae\xb7\x8b\x5d\xfd\xe9\xbb\x82\xdd\xa3\x40\xc9\xfe\x71\xf1\x78\xff\x61\xfb\xfb\x53\x89\x05\xc4\xf6\xfb\xfa\xee\x8f\xf5\x2c\x87\xae\xfe\xf3\xfc\x71\xb7\xa9\x9b\x41\xea\xb8\x7e\x78\xf8\x32\x48\xfb\x61\x39\xdb\x3d\x6e\xf2\x94\xeb\x45\xbd\x4b\x04\x8b\x79\xae\x75\xf3\x73\x4a\xdc\x96\xc0\xe0\x9b\xdd\xef\x36\xeb\x9f\xe7\xab\x61\x6a\x8e\x3e\xbe\xfa\xb0\xfe\x25\xc7\xf0\x6e\x8a\x5a\xff\x58\x6f\x7f\xce\x3f\xfa\x87\xd5\x7e\xde\xac\x1f\xf2\xdc\x7f\xb7\x5e\xff\x7c\x5f\x6f\x7e\x2e\xea\xd2\x7c\x7c\xbf\xab\x4b\x90\xef\xf2\xe7\xa2\xde\xcc\xcf\xc1\xef\x3e\x20\xd8\xcb\x19\x43\xd8\x33\x7e\xb7\x58\xbd\x0a\xf6\x5b\xd4\x4f\xbe\xd6\x0a\xde\x6c\xbd\x99\x67\x62\x97\x03\x85\xa7\xa2\xaf\x2e\x10\xdb\xe5\x99\xd4\xb4\x0b\x73\x4f\xfb\x3a\x89\xf8\x79\xa2\x54\xc7\xcd\x6f\x6b\x93\x18\xfd\xcd\x01\xfb\x1a\x21\x34\x0a\x01\xc9\x4c\x40\x55\x5b\x5a\x66\xdb\xc4\x80\x9e\xc2\xfc\x79\x4b\xd3\x4f\x54\xd5\x46\x2f\x84\xd8\xc7\xd2\xf3\xb6\x25\x68\x4d\x1f\xa8\x1c\xe3\x36\x8f\x98\x39\xd8\x1c\x08\xee\x31\xb1\x94\xe6\x2f\x59\xc9\x47\x98\x58\x3d\x79\xe8\x92\xaa\x63\x6e\x6f\xbc\x40\x75\x78\x4a\xe4\x27\xa2\x64\x2e\xb0\x5f\x29\x3f\xab\xf1\xc9\xc7\xba\x07\x2e\x04\xd7\xfb\x4f\xd7\xd4\xc7\x10\xbc\xf5\xe6\x42\x32\xa7\xa2\x60\x48\x82\x21\x7b\x2f\x1a\x09\x3a\x34\x7c\x28\x2c\x6d\x0d\xd8\xdf\xad\x24\xa0\x15\x55\xba\x25\xec\x09\x2e\x65\x06\x14\x42\x32\xf9\x8c\x95\x01\x9c\xa9\x21\x61\x4b\x77\x5b\xec\x41\x02\x9a\x09\x82\x67\x70\x7b\xe6\xf8\x1e\xf2\x29\x63\x94\xa6\x89\xcc\x03\x9f\xbf\x2c\x00\x79\x3b\x94\x56\xfb\x01\xcc\x11\x35\xb2\x30\xec\xf6\x40\xf7\x05\xdf\x1f\xbc\xcc\x5b\xa9\x02\x8e\xab\x9c\x7c\x41\xcd\x04\xd9\x49\x49\xeb\x41\x8d\xab\x00\x68\xb8\x42\x82\x2a\x74\xc4\xbb\xdc\xb5\xe4\xed\xbd\x0c\x10\x90\x1d\x36\x8e\x99\x8f\x23\x38\x81\xbe\x49\x0d\x57\xe4\x40\x45\xa2\x76\x6d\xe4\xa1\xd1\x86\xaf\x83\xf7\x12\x41\xdb\xc6\x43\xe5\x24\x87\x80\x97\x85\x54\x5a\x82\x69\x64\x94\x27\xea\x27\x39\xc4\xc4\x35\xb2\x6f\xb9\xf2\x5d\x83\xa2\x9a\x28\xcb\x9e\x22\x27\x08\xa7\x45\x7a\x39\x35\xdd\x30\x57\x30\x93\xb4\xe7\xe2\xdd\x51\xb3\x82\xf7\x82\x0a\x3d\x61\x7f\x13\xad\xc0\x53\xa9\x55\x1f\x0c\x28\x52\xd3\x02\x42\xdf\x12\xe8\x44\x95\x8e\x67\x8f\x85\x4b\x05\xd0\x7c\xd8\xe8\x2e\xa5\x0c\xb4\x39\x29\x83\x95\x6c\x65\x50\x1e\x09\xa1\x92\x49\x08\x27\x48\x0b\x08\x4d\x63\x7c\xf8\x6e\x2b\x85\xf2\x94\x18\xd2\xeb\x0c\x9e\x74\x4a\x0e\x53\xb6\xc2\x70\x1f\x8b\xb6\x8f\x0f\xaf\xb6\xad\x35\xf1\xad\x47\x15\xaa\xe1\xfb\x42\x83\x0e\x82\x84\xa8\x39\x1e\xba\x4a\xa4\xa1\xdb\x0a\x60\xbb\x24\xeb\x74\x0f\x58\x9b\xc0\x40\xb2\x44\x08\x9a\x24\x32\x17\xcb\xf2\x7b\x69\x2c\x1f\x47\x68\x74\x73\xfe\x05\xb4\xd4\x3f\x41\x0f\x95\x2d\x52\xf6\xd0\x40\x57\x54\x22\xb2\x6b\xdc\xd1\x77\x45\xaf\x74\x5f\xd2\x71\x47\x7d\xce\x3d\x54\xf6\x53\x29\x37\xdc\x4f\x6d\xc8\x28\x0f\xa0\x45\x35\x50\x31\x5c\x35\x03\x3a\x4c\x22\x7b\xfa\x61\x51\x04\xd9\xa9\xa8\x3e\x8b\x81\x82\xab\x44\xa7\x05\x26\x3a\xed\x97\xa1\x1a\x54\x22\x69\x28\xee\xaf\xd1\x51\xf5\xad\x50\xba\xc9\xd4\x13\x1c\xea\xae\xa8\x37\x17\x4f\x61\x50\xfe\xe7\x90\xff\x7b\x0c\xf9\x1b\x34\xc0\x3e\xd1\x4a\x65\x13\x63\xf1\x28\x7a\xa1\xb1\xb7\x21\x4e\x09\x1b\xc9\xfb\xa2\x9a\x1a\x30\x66\x51\x0d\xfa\x9c\xdb\x5b\x91\x24\x1e\xcd\x48\x7c\x5e\x47\x33\xd2\xd1\x84\xc4\x42\x46\xa5\xef\x5b\xf3\x48\x4a\x0f\xe5\x3e\x52\x5b\xfd\xea\xe5\x12\xc6\x95\xe3\x41\x9e\x23\x05\x28\x09\x96\x7d\x24\xd0\x41\xc0\x46\x3a\xb2\xf6\x5c\x49\xf6\x10\x12\xb0\xd1\x74\x08\x1b\x80\x6e\x48\x84\x90\x83\x93\xa0\x60\xff\x71\xa4\xb6\x1c\xab\x6a\xca\xdf\xe0\x9c\xce\xc4\xdd\x7d\xda\x68\x76\x02\xc7\x05\xba\x58\x10\x26\xe5\x93\x39\xe6\xeb\x36\xc8\x50\x35\x54\x37\xaa\x20\x0a\x07\x4e\xd3\x25\x0f\xc0\x0e\x42\xe3\xd4\xe4\x29\x2d\x0e\x50\xd1\x1d\xfd\xfa\xf2\x12\xb3\x08\x0a\x37\x2e\x72\x14\x61\x8a\xc3\xa0\xf2\x23\x3c\xb5\x50\xc2\xa9\xb9\xdb\x1b\x5d\xb1\xbf\x53\x18\x5b\x70\xae\xf1\xd2\x93\x18\x2b\x30\x74\xd1\x71\x62\xb8\x73\xcd\x34\x82\xc5\x89\x62\x2f\x6d\x54\xac\x30\x0e\xdf\x85\x40\xd6\x96\x46\x11\x01\xd5\x5e\x79\xb0\x0d\x3b\xa7\xa7\xcb\x21\xfa\xf7\xc6\x82\x56\x22\x8c\x75\x45\x4a\x59\x79\x08\xbc\x6b\x6a\xce\xe6\x01\x3a\x03\x02\x5f\xd3\x70\x83\x2a\x4c\xd1\x81\x57\x27\xcb\x35\xb9\x54\x13\x34\x81\x61\x97\x49\x15\x7b\x30\x8c\x6e\xd8\x83\x5e\x4a\x08\xb6\x91\x81\xac\xc1\x00\xa8\x26\x6d\x53\x20\x42\x50\xf5\x00\xca\x5e\x82\x56\x12\x5f\xd1\xbb\xb4\x96\x1b\x0d\x30\x96\x45\xd7\x02\x97\x05\xc6\x7f\x01\xea\xb1\x85\x70\x26\x36\xfe\x6b\xf8\x30\x7a\x08\x76\x74\x63\x8d\xbf\x49\x37\x3b\x70\x4e\x92\x1a\x18\x27\x48\x34\xc9\xa8\xb3\x36\xef\xd6\x0a\x2a\xd7\x90\xca\x7f\x5d\x3f\x5a\x38\x43\xd1\x9d\x47\xd9\xf1\x24\x74\x3a\x55\xc3\xd3\x18\x66\x48\xdb\x12\xf6\x3c\xe1\xb9\x45\x95\x90\xd3\x4f\xdd\x96\x8a\xdd\x39\x12\x72\xfa\x53\xb0\xe9\x97\x63\x61\xd3\x5a\xe4\x98\x03\xec\xd7\xb9\x90\x79\xcb\x4a\xb0\x9a\x5d\xf8\x5e\xa1\x66\x9e\x8f\xef\xd7\x1a\x02\xc7\xcb\xf0\x01\x19\xda\x81\x98\x28\xd9\x2a\x44\x8e\x43\xc9\x0b\x54\x71\x74\xed\xa0\xf7\x17\x65\xc2\x50\x47\xf7\x79\xb1\xf6\x24\xe9\xd5\x10\x15\x89\xb9\xa5\x95\x37\xb2\x18\x2b\x71\x50\xb2\xf7\x64\x0c\x2b\x51\x91\x96\xb5\x3c\x12\x30\xd2\x45\x27\xa7\x1b\x95\x10\x46\xd0\xd3\xe5\x6c\x68\xfe\x17\x82\xd8\x27\xcc\x41\x6d\x8e\x38\x3a\xf8\x58\xd3\x51\x15\xf0\x82\x3d\xf5\x02\x6c\xf6\x23\x70\xfd\x42\xdf\xa2\x04\x8c\x1c\x61\x4b\xc6\xae\x0b\x97\xeb\x4b\x6a\x86\x78\xac\x92\x3b\x08\xfb\xdf\xae\x4b\x5f\x01\x6c\xff\x95\xb8\x4f\x5e\x45\xaf\x31\x66\x70\xc9\xa6\xb3\xc0\xcc\x05\x87\x9b\xb2\xa0\xc3\x3f\xc4\xe8\x7a\x01\xf1\x45\x8f\x9c\x11\x4d\x4b\x3b\x02\x7e\xd4\x3b\xf8\xb7\xe2\xa5\xa2\x88\x10\x22\xad\x36\x30\x7e\x8d\xe1\xf6\x64\x41\xff\xe1\x88\x95\x0a\xfb\x3b\x9d\xf7\x5c\x62\x2d\xc4\xde\xa0\xda\x8c\xc9\xd8\x28\x7c\x50\x5b\x0a\x41\xad\xa6\x09\xa2\x06\x3c\xf3\x16\x74\x03\xdf\x0b\x3b\x8e\x53\x3f\xf6\x53\x8d\x63\xa4\xbf\xd0\x4f\xed\x02\x01\xed\xe0\x33\x5a\x31\xc8\xcd\x94\x3f\x36\xb8\xd7\x65\x7f\x49\x56\x34\xc7\x81\x72\x0c\x83\xc4\x60\xcd\x24\x17\xb9\x27\x27\x92\x6d\xa0\x62\xc3\xd8\x86\x7c\xa1\xf5\x71\x5a\x4f\x97\x7e\x9d\x4f\x20\xfd\x9c\x5f\x34\x7d\x98\x4c\x14\x2d\x02\x3d\x68\x3d\x62\x60\x6b\xbe\xf4\x05\xd3\x5a\xd8\x85\x02\x1f\x7b\x00\x5b\x76\x68\xb7\xa2\xe2\xd4\xa3\x57\xd0\x71\xb0\xeb\xed\x8d\x42\x11\xc7\x68\xd2\x87\x39\xe8\xb5\x3f\xb8\xd0\xe0\xbc\xf0\x63\xac\x0a\x68\x23\x23\xaa\xa9\x1f\xab\xb4\xa1\x9e\x3d\x2f\xd3\x8f\xaf\xcb\xfb\x96\x06\x35\xb3\x4d\x38\x11\xc7\x0a\x8f\xca\xdd\xb5\x86\x1f\x2b\x57\x50\x49\x72\xb9\x17\x64\x18\x33\x38\x33\x66\xd0\xbf\x9e\x5d\xb6\x53\x9d\x06\x2d\xc5\x38\x23\x1c\x16\x9c\x50\x75\x0d\x29\x1a\x2b\xf8\x52\x28\x9a\xaf\x4a\x2e\x87\x86\x01\xd4\x6c\xda\x04\xb1\x9a\xb4\xbc\x9e\x74\xf2\x98\x07\x4c\x74\x62\xdb\x70\xd4\x02\x5d\x26\xbc\x1a\xa0\x97\x7d\x11\x37\x81\xb4\xc2\xfa\x4a\x8c\x72\x9d\x86\xe0\x22\xd3\x30\xf7\x53\x3f\x8e\x53\x3b\xf6\x03\x6d\x50\x09\xfb\xd4\x10\xaf\x04\x97\x5b\x9b\x31\x0f\xf5\xc1\x3d\xe6\xfd\x24\x15\x73\x71\x5e\x3c\xf3\x8f\xa6\xbe\xbf\x16\x2f\xde\x1b\xa4\x47\xf6\x13\x7d\xc3\xda\x8f\xf5\xe0\x57\xa4\xcc\x63\xd8\xb7\x57\x8d\x77\x04\xeb\x87\xf1\xf0\x29\x20\x48\x0c\xa3\xe4\x39\x95\x6c\x89\x52\x33\xd8\x17\x68\x86\x31\x1a\x30\x38\xf2\x40\x16\x6e\x0f\x90\x94\x0a\x7d\xc9\x66\xd1\x4f\x99\xf2\x65\xfd\xb8\x86\x5f\x79\xd8\x69\x30\x7a\x34\x6c\xc2\xaf\x42\x3f\x68\x7e\x63\xfa\xc1\x64\x59\x18\x88\x76\x41\x56\x6d\xcd\x7c\x61\xa6\x8b\x5a\xa9\x64\xe0\x53\x81\xa7\xda\x94\xd4\x1d\xa0\xab\x07\x41\x39\x3c\x88\xc0\xc5\x67\x5a\x15\x1d\xd9\x4b\x66\x70\xef\x50\x9a\xdb\x7b\xa9\x42\x86\x04\xce\x00\xab\x0b\x0d\xc6\x30\xe1\x7c\x4d\xfd\x22\xf0\x80\xe2\xc0\x00\x7b\x34\x06\x34\xd3\x91\x1e\xde\x12\x6a\x1a\x21\x8c\x95\x02\xb4\xb7\xf7\xca\x50\xff\x45\x40\x2d\x23\x24\xb4\x42\xe4\xcd\x1c\xbe\x0c\x58\x06\x51\x62\xa3\x13\x32\x05\x5b\x10\xca\x48\xba\x64\x4f\xa9\xb4\x95\xfd\xd5\xd8\x06\x91\x41\x1e\x48\xeb\x0f\x19\xd6\x64\xe2\x7b\x0a\xaa\x39\xbf\x22\xd2\x1f\xb8\x02\x4f\x2d\x23\x1a\x5a\x4a\xc5\xd4\x64\xd3\x70\x7e\x17\x80\xc1\x09\xa2\x30\xe0\x1d\xc9\x13\x89\x53\x2f\x4d\x55\x04\x15\xbf\x8a\x38\x9d\x35\x37\xfe\x27\xf1\xe0\xd3\x7b\x23\x0e\x8c\x93\x1a\xfc\xeb\x05\x80\x3b\xb1\x37\xdd\x86\xf3\x50\x9e\xca\x87\x71\x0a\x2a\xbb\x90\x60\x7f\x4b\xe5\xf3\xbc\x4a\xbf\x97\x86\xfa\x4f\x83\x57\xbf\x81\x9e\xf8\x4d\x29\x08\xd9\x23\xf2\x02\x2b\x62\x3e\x1c\x3c\xe0\x4d\x2b\xa9\xa6\x3a\x5b\x3e\x7a\xa1\xa7\x3a\x4f\x70\x97\x5d\xbe\xea\x0a\xac\x65\xc8\x98\x22\xf6\xae\x1a\x10\x4a\x93\x34\xd3\x08\x65\xcc\x2a\x26\x19\x4b\xd7\x74\xcf\x82\x22\xe9\x33\x8c\x49\x4a\x03\x12\x53\xc4\x33\x7d\x8b\x03\x25\xec\x48\x55\x1c\x2d\xce\xd7\x24\x42\x51\x20\x04\x3b\xb5\x50\x85\x51\x80\x20\x0e\xe4\x43\x4a\x03\x5a\xc1\x00\x36\xc8\xe1\x98\x99\x53\x17\xa6\xa1\xad\x0c\x04\xd3\x5e\x5b\x03\x84\x84\xd5\x8d\x14\x03\xd9\xa6\x6b\x37\x17\x32\xe5\xfe\x54\x05\x88\xb6\x56\x8e\xab\xe0\x3a\xd0\x53\x2a\xbc\x0d\x4c\x78\x76\xa9\x6a\x29\x0f\x3e\x4e\xb1\xaa\xcb\x5a\x19\x40\x7a\xa9\x0a\xe2\x15\xf5\x62\x3f\x85\xd8\x5e\xd3\x0d\x2f\x13\x89\xe8\x61\x71\x66\xad\x84\x10\xa7\x86\x41\x26\xfb\xe4\x43\x0f\x5f\xe8\x10\x21\xa1\xb9\x0c\x00\x77\x75\x0e\xb8\x8b\xa2\x9a\xe6\x20\xbb\xe9\x8d\x4b\x1d\x22\xa4\x00\x9c\xcb\x08\xec\xe8\xa8\x67\x59\xfa\x04\x8a\x27\x05\xf6\x1f\xaa\x63\xfb\x7e\x2d\x11\x97\xd8\x7b\xfb\x94\x72\x6a\xd7\x70\x3c\xa7\x42\x15\x0b\x72\x9c\x84\x3c\xcd\xf8\xe2\xba\xb1\xe0\xa3\xb4\x1c\x9f\x7e\xbc\x7e\x9b\x28\x2e\xb1\xf1\xd3\x12\x1f\x5e\xa8\x01\xec\x3c\x99\x89\xcc\x28\x14\xf8\x52\x82\x34\x74\x85\xb8\x10\x7f\x1e\x46\xb0\xc2\x8e\x11\xa7\x7e\xe1\x19\x8a\x55\x83\x53\x8d\x04\x3e\x63\xb2\x09\x4b\xd8\xf4\xab\x9d\x8a\x89\x0f\xe9\x36\xb5\x2d\x2d\x7a\x16\x7e\x6a\xc7\x0e\xec\xa8\x8d\xe9\xca\xe6\x48\xbb\xc7\x61\xb2\xa3\xc6\xd7\x0b\xd4\x83\x74\x46\x7c\x07\x3b\x3d\xfe\x50\x2a\xe0\xed\x0d\x46\xa1\xd5\xd8\x4f\x51\x2f\x34\x44\x3e\xc3\x66\x80\xb0\xde\xff\x29\xf1\x06\x8c\xf1\x52\xdc\x7d\xff\x24\x1d\xfe\xb2\x6d\x88\x67\xb8\xf6\x9e\x5d\xd8\xfe\xdd\x05\xe2\x79\x4b\xe9\xed\x52\xf1\xb2\x9d\x91\xa3\xe6\xeb\x8c\xa6\x13\x16\xcf\x85\x38\xff\x8f\x31\xbb\x37\xbb\xa7\x95\x13\xb3\x9a\x64\x5c\x62\x4a\x82\x53\x12\x50\x5d\x2b\x05\x81\xe1\xe1\xa3\x08\x2d\xd6\x01\xb3\x8e\x62\x05\x96\x0f\xd9\x19\x92\x8e\xf4\xad\x62\x25\x6c\xa2\x20\x13\xd9\x99\x99\x02\x6d\x24\x92\x49\x60\x41\x45\x69\x45\x04\x17\xa5\x06\xc7\xac\xe0\xcc\xc8\x9f\x21\x3c\x7b\xf0\x58\x0f\xd3\x2d\x68\x45\xc6\xbc\x9f\x19\x30\x31\x79\xea\x05\xd0\x16\xa2\xe1\xaf\x25\xaa\x78\x06\x7b\xd0\xed\x7a\x43\x04\x9a\x65\x30\x11\xa3\x42\xf0\xd7\xd8\x15\x1b\xd9\x47\x90\x6b\xa2\x02\x03\xc4\x23\x53\x48\x1f\xd6\x07\x6d\x2b\xdc\xde\xa8\x8a\xa6\x31\xb2\x51\x46\x16\x22\xc7\x1f\x27\x79\x30\x3c\x07\x59\x35\x93\x2a\xcd\xef\x2a\xc8\xc4\xb1\xe2\x91\xb1\xe7\x13\xa1\xed\xc8\x7a\xfe\x80\x4f\x94\x7a\xed\xb0\xd5\x15\x23\x33\x1d\xdd\x6a\x97\x51\x11\xb4\x9e\x69\x69\x40\x71\xb5\x24\x35\x22\x7f\x53\xf2\x37\xa5\x92\x28\x8d\xd4\x60\xe9\x16\x37\xad\xb3\x75\x10\x07\xbc\xf8\x68\xd2\xcc\x77\x30\x6b\xa9\x68\x95\xf0\x64\x68\xf9\x3e\xcc\x81\x9f\xa4\x25\xc2\xc8\xd3\x62\xc5\xf7\x2b\x16\x71\xa8\xf6\x85\x66\x07\xdd\x8a\x82\xec\x65\x81\x56\x20\xd2\xca\xa7\x44\xa1\x7a\x42\x14\x2a\xd9\x8b\xc2\x75\x00\x15\x13\xc8\xa3\x49\x1c\x78\xa1\x17\x39\xd9\x8b\x82\xec\x44\x41\x64\xa2\xd0\x49\x42\x26\xd3\x8a\xfd\x22\x58\x12\x0a\x60\x50\xd4\xa2\x9a\x59\x26\x9e\xa5\xf6\x89\xa0\xa3\x64\x8b\x85\xd6\x81\xb4\x4a\xbb\xd6\x26\x51\xc1\x05\xa4\x05\x71\x08\x9d\xf0\xa7\xa2\x9c\x41\xd0\x79\x3c\x4e\xdb\x40\xb1\xa7\x46\xeb\xc9\x56\xad\x62\xde\xac\x47\xcd\xc7\x6c\x21\xa6\x0d\xe5\x0e\x9d\x3c\x4b\x9e\x1e\x2c\x68\x9a\x89\x98\x3d\x45\x93\x64\x70\xcb\x7a\xa1\xa9\x3e\x5c\x4b\xb0\x28\x13\xaf\x11\x07\xc8\xa8\xc6\x02\xad\x25\x95\x66\x36\xc1\x20\x94\x1e\x29\xc7\x33\x8d\x3b\x78\xce\xaa\x48\x63\x3f\x40\xac\x3d\xb8\xc0\xec\x68\xbd\x7d\xa6\x94\xd4\x33\xcd\x2e\xcd\xcc\x84\xa2\x0d\x73\xe9\xf2\xa6\xad\x63\x3d\x9e\x06\x57\x37\xb6\xe4\x60\x6c\xa5\x61\xe4\xb2\x81\x5b\x1d\x12\xf3\x5b\x8e\x4f\x9e\x79\x68\x49\x1e\x5b\xb2\x1f\x5b\xf2\x30\xb6\xea\x7c\x94\xb3\xda\xd1\x12\xd3\xa8\xc9\x47\x08\x2d\x83\x49\x05\x79\xf0\xfc\xbf\x76\x32\x61\xff\xdf\x86\xb9\x6b\x74\xad\x12\xe8\x2a\x5f\xab\x6e\xdb\x21\x11\xeb\x38\x93\x2e\xa9\xe9\x35\x8d\x42\x92\xbb\x6b\xc6\xbf\xff\x27\x93\xe7\xaf\xa7\x10\x14\x77\x7e\xba\x76\x2a\x81\x46\xbc\x07\x5e\x47\x06\xb6\x89\xc2\x41\x80\x4d\x10\x06\xac\x9b\x60\x22\x08\xb0\x6c\xd5\xd3\xf4\x84\x8e\x71\xcf\x74\x43\xba\xda\x0b\xce\x51\x83\x23\xcd\xc7\xdb\x7b\x24\xe9\x96\x56\x25\x86\x4a\x62\x54\xad\x38\x34\x20\x5d\xdb\xee\x06\x4d\x2b\x55\x32\x03\xbc\x6f\xaf\x6d\xa7\x42\xe5\xe8\xbb\xa6\x61\x46\xd6\x3a\x52\xff\xc5\xae\xd3\xa9\x77\x43\x24\x01\x0b\xff\x7b\xab\xab\x3c\xda\xf5\x29\x75\x85\x5a\x64\x18\x43\xcc\xd6\x3f\x0e\x33\xc9\xcb\x35\x09\x46\x03\x92\xb1\x01\x5a\x4f\x8c\xd0\x55\x0e\x99\xc7\x63\x67\x1c\x20\xb8\xa9\x52\xe3\x0e\x62\x92\x9b\x57\xe8\xa9\x2e\xd8\xa1\x6c\x12\x8d\x0c\x7d\x0f\xd4\x84\x3d\xa4\x30\x8e\x11\x99\x81\x2a\x45\x43\xf9\x7e\xbf\x9e\xb9\x77\x94\x9e\xa2\x1d\xe3\x39\x04\xd9\xcf\x4a\xb8\x62\x66\xe9\x41\x59\x55\x3c\x24\x08\x2d\xf4\x18\x3d\x58\xdb\xf0\x46\xaa\x2e\x4f\x7b\x95\x38\x90\xbe\xa4\x9a\x79\x09\x71\xea\x33\x24\x5b\xca\x83\x91\xde\x92\x63\x0d\x06\xb0\x2c\xf0\x05\xd9\x6b\xb2\xdf\xc6\x6a\xb8\xcf\xe5\x07\xcd\xcb\x87\x4a\x07\xfa\x5b\x76\xc0\xf5\x50\xb9\x0b\x2d\x83\xfe\xb9\x7b\xff\xcd\xab\x23\x76\x66\x46\xdc\x47\xf0\x38\x79\x5b\x47\x21\x1e\x6f\x77\x0b\xc0\x20\xf1\x6b\xc8\x9b\x42\xd0\xfe\x09\xe7\x6c\x7c\x0a\x58\xf0\x1f\x78\x35\xf4\x54\x0f\x05\xa1\xe2\x57\x97\x2f\x65\x46\x4e\xf4\x88\xd2\x27\x88\xee\x5f\xc1\xdf\xfe\x9b\x29\x9a\x97\xf3\xb7\xff\x13\xb4\xf1\x4b\xce\x97\x7e\x75\xb3\x63\x54\x02\xcb\xb3\x9f\xb0\x0f\x5f\xa7\x3b\x9e\x18\x87\xdd\xe9\xfd\x2b\xdd\x8b\x5f\x3f\x04\x5f\xe5\x84\x3b\xb0\x1a\x32\xe0\x8c\x67\x76\x24\x10\xec\x8c\xc3\xb9\x45\x25\x95\x13\x8e\x54\x9d\x72\x42\x99\xad\x67\xab\xc8\x08\xfe\x55\xd3\xdf\xdd\x36\x32\x59\x36\x12\x5c\x68\x2c\x43\x16\x80\x2d\xcd\x24\x4b\xeb\x0d\xd3\x54\xd2\x81\xd7\x35\x63\x37\x75\x2f\xca\x08\xe8\xaf\x99\x87\xcd\xb7\x11\x62\x82\x41\xad\xb8\x20\xb7\x37\x18\xc8\xf2\x47\x03\xae\x50\xde\x1a\xc1\xeb\xa6\xa2\x25\x03\xd9\x93\x1c\x08\x5a\xec\xe6\x41\xd0\x12\x94\x1a\xf1\xf9\xc7\x61\xbd\x42\x53\xc1\x4c\xd2\x4a\x97\x6a\x47\x8b\x29\x1d\xe8\x5f\x85\xdb\x54\x51\x14\xfc\x8b\xaa\x69\xf9\xf0\xdc\x08\x85\x64\x1c\xa7\x1d\xef\xaa\x17\xbd\x43\xb9\xce\x45\x7b\x7d\x72\xca\x66\x28\x2f\x3b\x2e\xc0\x7b\x2b\x81\x63\xcc\x59\xcf\x2b\x79\x0e\xbc\x2c\x3e\x9b\x21\x1f\x8e\x62\x05\xec\xc6\x61\x07\xe4\xf1\x83\x94\xb3\xb2\xd5\xcf\x65\xab\xd2\x19\x01\x82\x1d\xa3\x01\x8f\x65\x2e\x7c\x80\x1c\xca\xb2\x9c\x0b\x7f\xfa\xf4\x32\x88\xbb\x14\x69\xa5\xee\xc1\x90\x0d\xde\xd3\x89\x28\x08\x91\xcf\xd4\x12\x71\x30\x5f\x0f\x93\xaf\xa3\xc6\x18\x0a\x81\xd4\x29\x12\x20\xd7\x1f\x5f\x5f\x34\xeb\xfc\x3d\x03\xd6\x52\xa9\x07\x81\x64\x82\xcf\xa1\x69\xb1\x72\x18\xa4\xd2\x4a\xf0\xf8\x5b\x0f\xed\x91\xea\x56\x56\x3a\x0b\x56\xe9\x7a\xe1\x4d\xe6\xdf\xb3\x22\xc6\x43\xe9\x75\xe3\xe8\x85\x5e\x77\xcf\xe4\x6e\x38\xdc\xa7\x7a\xf5\x90\x7a\xa1\x83\xdb\x33\x25\xa8\x78\x88\xa9\x22\x3f\x5a\x02\x0c\x07\x1c\xcb\xa2\xa1\x89\xae\xf4\xb0\x40\xde\xf5\xb1\x69\x30\xe6\x07\x1b\xfd\x87\x5f\x51\x74\xf3\x4c\xd1\x9f\x9b\x08\xcf\xce\xc8\x9e\x76\x74\x78\xa6\xbd\xfe\xc1\xa6\xbd\xfb\x20\xca\x75\x89\x50\xf9\xb4\xa0\x58\x51\xa2\xcd\xe1\x90\xf9\x70\xd5\xde\xde\x33\xed\xaa\xb0\xe5\xcb\xa5\x7e\xe7\xd7\x17\xcc\xbe\x78\x78\x9f\x4f\x0c\x50\xf1\x27\x14\x82\xf1\x52\x55\xc3\x95\x50\x21\x3c\x8a\xc7\x54\x29\x20\xea\x19\x01\x79\x0e\x0b\xf2\x79\xc3\x0f\x79\xfd\xe5\x84\xef\x90\xf7\x15\xe9\xd5\x04\x4a\x99\x9d\x9c\x44\x0d\xce\x0e\xa6\x8f\xb6\xa5\xd2\xae\x7b\xf1\x89\x56\x45\x1e\x69\xc8\xdf\x5a\x08\x52\x08\x5c\x7b\x6d\x27\x08\x17\xa4\x39\x2a\x6f\xd7\x16\xb7\xdd\xbc\x8d\xc3\x79\xbb\xef\xd7\xb2\x8f\x6e\xef\x99\x8e\xd7\x9e\x92\xa0\xc1\x93\xaf\x35\xdd\x5f\x34\x9e\x2d\x78\x7b\x7a\x48\xbf\xce\x6f\x69\x60\xdd\x76\x40\x71\x4f\x6e\xdf\xa3\x30\x83\x20\xdb\x53\x84\x7b\xc3\x20\x5b\x57\x86\xc2\x9b\xdb\x1b\xde\x30\xe1\x28\x62\x5d\x5d\x68\xf7\x8a\xc9\xd3\xfa\x55\xcc\x29\x0e\x25\xbe\xff\x04\x81\x12\x73\x39\xa8\x23\x02\xa5\x88\x22\x72\x8c\xcd\x65\x36\x94\x92\xef\x88\x05\xed\x1b\xc6\x2b\xb5\x60\xa4\x91\x66\x70\x82\xde\x13\x20\x21\xc4\x3d\x42\xd0\x8d\x03\x1f\x49\xf8\xe3\x44\x31\x33\xac\x0a\x0d\x19\x4e\x96\x16\x62\x76\xac\x6c\x13\x12\xe2\x86\xb1\x89\x5e\x66\x8a\x8a\x9f\xb1\x10\x14\x5f\x72\x02\xeb\x43\x21\xce\xb2\x46\x9f\x35\x46\x23\xb5\x5e\xde\xf4\x22\x6f\xfa\xee\x01\x76\xef\x73\xa2\xaa\xcb\xc6\x6f\x7f\x8d\xca\xc6\x6f\xbb\xe4\x2b\xed\x6e\x29\xcf\x47\x1f\x15\x87\x3a\xfe\x26\x5d\x70\x94\xc3\x65\x37\xa2\x8e\xf6\xed\xa6\xcc\xa5\xe1\x9e\xdb\x7b\x3b\x7f\x24\xf7\xb1\xc6\x97\xda\x5a\xd3\xbf\xcd\xd6\xda\x69\xef\xfe\x67\x1b\xf1\x32\x8a\x8e\x55\x48\x78\x86\x61\x8a\x6e\xdf\xde\x38\x81\x7e\x4a\xc2\xd6\x38\xe9\xa0\x0a\xc3\x40\xbf\x8a\xa4\x4e\x45\x5a\x50\x05\x76\x61\xf0\xb7\xf7\xc8\xd1\x64\x0a\x94\x6d\x1c\xa0\x96\x2e\x1d\x88\xd2\xaa\xe7\x28\x50\x30\xd1\x4e\x91\x44\x5e\x62\xfb\xee\x57\xb6\x92\xde\x20\x56\x27\x66\x6b\xfb\xcf\xd2\x88\xaf\xda\x9f\xbb\xd4\xe6\xd5\xe9\xf9\xfd\x08\x5b\xad\xc3\x86\x7d\x6e\xef\xaa\x5f\x54\xab\xc4\x50\x42\x86\x5a\xbf\x5c\x66\x2f\x07\xbc\xbd\xaf\x84\xae\x46\x4c\x89\xdd\x2a\x71\xcd\xf0\xf6\x5d\x4a\xef\x93\xf2\xb6\xc9\x3d\x6b\x1d\x55\x41\x88\xa9\x81\x94\xe6\x3f\x37\x4c\x27\xfc\x86\x79\x39\xfb\x3a\x5a\xa8\xec\x1b\xbe\xfe\xec\xf4\x18\x40\x69\xde\xec\x52\x75\x00\xe7\x05\x5f\x3a\xa3\x04\x9d\x74\xe3\x08\xc1\x8f\x86\xf7\xb2\xf7\xce\xda\xbc\x79\x7e\x89\xf6\x92\xde\xbd\x09\xbc\x9d\xad\x0f\x58\x1b\xad\x1f\x7d\x8e\x36\xd5\x3f\x72\x7b\x1f\x01\xd9\x55\x55\xe3\xa0\x82\x4a\xb6\x15\x44\x07\x3a\x0c\x6a\xa8\x8a\x1a\xde\x3b\x88\x5a\xf2\x1e\x47\x9e\xa7\xcc\xf3\xe4\x5e\xe2\x93\xe0\x73\x4e\x21\x8a\x21\x90\x83\x26\x3f\x79\xea\x6b\x28\x1b\x44\xa8\xdc\x82\x37\x8b\x8a\x0d\x08\x85\xaf\xde\xd2\x7b\x4e\xa9\xfe\x3d\x47\xde\xaf\x8e\x0d\xe5\xda\xb1\x61\x00\x03\x8f\x0d\x05\xe1\x4d\xa3\x23\x1f\xd9\xea\xad\xdf\xbf\x84\xcc\xdf\x7b\xee\x74\x05\x95\x1b\xae\xfb\x15\x0e\x96\x87\x0a\x4b\x5e\x6e\x7a\x51\x43\xe5\x6e\x6f\x90\x5d\x2d\x68\xf1\x0c\xcc\xe4\xd4\x7b\xd1\x04\xfa\xdf\xe8\x90\x5a\x25\x90\x3b\x7e\xf8\xf6\x5e\x92\x4c\xd3\x9d\xf2\x3d\x71\xfa\x3d\xa5\xda\x90\x84\xea\x9c\xd9\xbc\xc4\x01\x6e\xd1\xc4\xff\xf9\xe6\x81\xb7\x4b\xe3\xf3\xd2\xae\x68\xaa\xbf\xb4\xb4\x17\x73\x81\x13\x58\xd5\x51\x74\x6e\x40\x2d\x05\x33\xad\xc9\xb8\xa5\xf9\x7f\xe0\xda\x50\x04\x2f\xfc\xa1\xd7\xb5\x92\x1c\xa3\x90\x6d\x8d\x38\xa9\x00\x47\xfd\xd7\x44\x97\xc1\x6f\x3c\x63\xdc\x73\xc8\xcb\xab\xe4\x9e\xd9\xd3\x5f\x2c\xf8\x46\xb5\x82\x7f\xaf\x0c\x6f\xb6\xe6\x83\x95\xd7\x8f\xd8\xb7\x59\x25\xb9\xcd\x0e\x4d\x96\x8a\xe4\xb4\xe4\xa6\xed\x1a\x4d\x51\x69\xac\x91\x27\x78\x46\x5f\xec\x4b\xd4\xe1\xf5\x3f\x3d\xa5\x08\x74\x4c\xc4\x82\x54\x1f\xa4\x5e\xe7\xcd\x2b\xed\x85\x59\x48\x57\x2b\xc7\xf8\x3b\xae\xf7\x34\x94\x9a\xba\x9b\xaa\x3a\x4a\xc1\xf1\xe9\x9a\x0a\x6c\x84\x72\x8b\x38\x75\x35\xb2\xee\xa1\x4b\x67\xa7\xa2\x63\xfe\xf6\x19\x1f\x37\x0b\x04\x87\xc2\x81\xf5\x82\xe3\xea\x12\x91\x9f\x62\x3c\x2d\xbe\xb6\x93\x1a\xc3\x9a\x46\x35\x55\x06\x7c\xa8\x23\x47\x94\x77\x4e\xbe\x54\x92\xa8\xa4\x4e\x2e\x5f\x12\xc1\x2a\x69\x00\xa3\x8c\xa0\x78\x13\x91\x23\xf5\xf2\x38\x13\x6a\xce\x28\xf0\x3a\x85\x65\x21\x9f\x54\xb0\x63\x30\xfd\xe3\xf6\x61\xac\xcb\x20\x00\x81\x51\x60\x2f\xc0\xc0\xae\x86\x38\x53\x64\x60\x58\x30\xec\xc6\xe9\x41\x25\x0f\x61\x5f\xba\x8f\x81\x53\x80\x6a\xe1\xc0\xe0\x0c\xd3\x41\x94\x03\x6b\x25\x0a\x6a\x5a\xa9\xc1\x9d\xe7\x1c\xf5\xdc\x3e\xaa\x11\x5a\x8d\x33\x9a\xd4\xe4\xea\x32\xf4\xfa\x59\xf8\xdb\x7b\xe9\x24\x2e\xcc\x54\xd9\xf1\x59\x9c\x8f\xcf\x1e\x34\xaa\xc8\x3a\x01\x41\xe1\xb5\xf2\x60\x95\x88\x5d\x98\x50\x10\xd8\xfd\xfb\x9e\x69\xdd\x03\x3d\x28\x2c\xa0\xe5\x32\x00\xea\x1a\x23\x23\xf2\xc5\x03\xf1\xaa\x02\x43\x2d\xed\xcd\xb5\x65\x8f\xf2\x2a\x61\x29\x85\xe4\x44\x45\xff\x2c\x1c\x04\x77\x4d\x92\x41\x69\xc8\xcf\x54\x8e\xa4\x05\x43\x0b\x8a\x61\x15\x47\xb4\x25\xff\xd6\x5e\xe1\x1f\x8a\x7a\x89\x0d\x6c\x52\x17\x7a\x18\x3d\x56\x95\x87\x32\x0b\x3f\x55\x2f\xe5\x30\x3c\xe6\x33\xcb\x38\x38\x9e\x8e\x81\x12\xaa\x9a\x31\x7b\x2c\x8d\x5f\xe1\x41\x4b\x93\x84\xcc\x2c\x4e\x0c\x5f\x41\xc3\x57\x3c\x31\x7c\x39\x06\x61\x8c\x9a\x57\xc6\xe5\x08\x26\x75\xce\xbb\x60\x71\x26\x19\xb6\x5d\xd2\x10\x96\x34\x84\x39\x34\x56\x3e\x31\x84\xa9\x7c\x11\xaa\xb8\x47\x50\x7a\x38\x82\x05\x8d\x60\xa1\x67\xec\xb3\x49\x03\x98\x86\x52\xa4\x07\xda\xa8\x5f\x1a\xc0\xc5\x8e\x3b\x77\xe1\x75\x3a\xd0\xd0\x9a\x94\x08\x32\xda\x92\xe1\x7f\xab\x29\xe2\x22\x94\x7c\xc1\xf9\x20\x96\x0a\x48\xb7\x39\x64\x9d\x11\x25\x6f\x73\x82\xe2\xe0\x5c\xaa\x85\xf4\x79\xf4\x42\x25\xd0\x83\x8f\xc2\x8c\x51\x81\xf6\xd7\x2a\x70\x38\x00\x8b\xb4\x66\x3a\x5e\xe1\x2f\x38\x8e\x51\xd8\x71\x1c\x00\x15\x64\x3a\x25\x1d\x14\xd1\x1a\x48\xf8\xb1\x99\xa2\x1a\x5f\x6e\x08\x3b\x66\xbc\xd7\x10\xcc\x8c\x29\x2d\x91\xc6\x8c\x61\x20\xa8\x0a\x2a\x9f\xfd\xf9\x1e\x0d\xb5\x3b\xad\x8e\x98\x22\xd4\xab\x29\xaa\x45\x04\xef\x8f\x47\x72\x02\xd6\xe4\x91\xac\x2b\x92\x08\x4b\x52\x48\xab\x2a\x61\xda\x7f\xb8\x65\xed\xb5\x8a\xc0\x73\x47\x4b\x4b\xc7\xed\x6a\xf7\x0a\x69\xa2\x3d\x1e\xc5\x87\xd2\x5e\x62\x14\x47\x81\x7a\xc0\x30\xed\x32\x11\x88\xc2\x8e\x71\x7a\xec\xcc\xf8\xe2\x31\x9c\x78\x75\xca\xe1\x4b\x65\x39\x94\xc0\xd0\x72\x55\xeb\x51\x1a\x3b\x69\xe8\xf0\x91\x0d\x4d\x4c\x86\x61\x6a\xb2\x3b\xf4\x5f\xfb\xc6\x2b\x6c\xd7\xdc\xd7\x0d\x42\xf2\x5e\x36\x35\xb2\x47\x04\xf6\x7e\x11\x95\x34\x1c\x82\xc0\x00\xa8\x08\x3e\x5d\xd2\x1d\x0d\x86\xc6\xaa\x1a\x29\xcf\x81\x42\xbe\xe3\xed\x55\x02\x93\x33\x85\xaf\x0d\xf5\x9f\x48\xd7\xd4\xa8\x08\x41\xa6\xe7\x0f\xea\x52\x32\x2f\x49\xa6\x3e\xe9\xb7\x61\x75\x64\x0e\x4a\x89\x59\x48\xdb\xac\xe8\xff\x3b\x6d\xe4\x9d\x60\x7e\xd2\x13\xc5\x93\x4c\xc8\xc6\xe1\x02\x58\x1d\xfc\xc7\xa9\x4e\x32\x31\xc4\xe7\x99\xea\x58\x90\x65\x53\x43\x57\x76\x64\x53\xdc\x4e\x75\xd0\x55\x9e\xfd\xbc\xd5\x40\x23\x09\x08\xec\x81\xe6\x8a\x93\x41\x49\x1a\x82\x5e\xb6\xed\xb5\x35\x8f\xd8\x0a\xd2\x85\x4f\x1e\x65\xc9\x80\x07\x79\x40\xec\xa1\x6f\x6e\x6f\x98\xcb\x58\xe8\x6a\x1c\xc1\x99\x9a\x5d\x42\x44\xba\xf6\x35\x4e\xfe\xe8\x0c\x53\x64\xdb\x6b\xdb\x23\x50\x45\x3e\x84\xae\xe8\xff\x3b\x9d\x1b\x2c\x63\xab\x17\xf6\xba\x8e\xa9\xee\x69\xf2\x8e\x19\xea\x04\x38\x2f\x8d\x30\x9a\xc6\x75\xba\x76\xfb\xa3\xec\x77\x6f\x98\x5e\xc6\x64\xbc\xcf\x98\x1c\xf2\x55\x64\xa3\x32\xf6\xe4\xeb\xad\xc7\x7e\x91\xad\xe9\x32\x55\xed\xf5\x50\x46\x99\xca\x78\x14\x26\x40\x75\x92\xe0\xc3\xc8\x5a\xd2\x4d\xe9\xda\x66\xd0\x36\xd5\x2b\xb6\x18\xfe\xcf\x79\xd3\x2c\x1f\xb6\xed\x8e\xa7\x86\xa0\xfb\x5d\x37\xad\xaf\xbe\xd9\xd0\x0a\x0c\x74\xbc\xfa\x66\xf3\xa5\xfb\xeb\xdc\x75\x57\xb1\xda\x42\x32\x7f\x75\x3c\x1a\xf4\xca\x91\xa6\xb3\x47\x43\xfe\xf0\xca\x2b\x56\x50\x65\xce\x4c\x96\xa0\x4d\xad\x12\x62\x8c\x3a\x2c\xee\xf8\x67\xe1\xba\x9e\x32\x6e\xdf\x38\x23\x67\x7b\x9c\x33\x92\x4a\x39\x2b\xe7\xc3\x1b\xb7\x57\x05\x9b\x23\x8f\xa0\x73\x3e\x95\xbd\x71\x46\x25\x1c\x57\xa2\xac\x06\x2b\x65\x05\x91\xd4\xf5\x01\xcc\xa3\x57\xc9\x22\x07\x02\x69\x55\x38\x3d\x7d\xe6\xe9\xc6\x5b\xa5\xf1\x57\x1c\x8a\xbf\x92\x24\x3e\xc9\x19\x79\x62\xee\x71\x1c\xd8\xa6\x46\x29\x6c\x34\x5d\xdb\x36\x0b\x1c\x92\x63\x6a\xe4\x18\xa3\x74\x6d\x35\x38\xe9\xad\xa4\x2f\xd2\xa5\x9b\x21\xd0\xc9\x14\x59\xc7\x47\x2e\xe9\xda\xdd\xb3\x6c\xa5\x86\xc1\xcc\xa3\x4a\x6e\x70\xc1\xb3\x4e\x00\x83\xed\xf5\xf0\xb6\x48\x6f\x07\x9e\x82\x42\x3f\xdb\x71\xae\x22\xcd\x86\x48\xea\x3a\x5d\xdb\x82\x72\x10\x15\x55\x2e\x30\xd7\x6b\xe8\xfd\x42\x80\x63\xad\xca\x68\x73\x96\x9b\xc3\x7c\xc0\x68\x0f\x49\xb3\xc5\x74\xe9\x17\xd7\x1a\x0a\xad\x4d\x93\xcf\x42\xc5\xe3\x99\x67\xf8\xa6\x2c\xdf\x64\x62\x25\xca\xa3\x9c\x73\xda\x3e\xb9\xbd\x49\x7e\x90\x18\xc0\xda\xc1\x00\x53\x2d\xd0\x37\x23\x1c\x1d\x6e\xb4\x9b\x20\xdd\x4b\xb7\xf7\x9e\x27\xbd\x7a\xf8\x0c\x47\x47\xb6\x29\x79\x32\x93\x59\xf0\x5b\x6e\xf0\xd6\xb3\x59\xa2\x25\xb1\x4c\x59\xbe\x4c\x16\x3b\x8d\x38\x38\x7e\x4a\x64\x88\xcf\x19\x69\xec\xe7\x38\xa6\x0c\x4d\xa3\x68\x25\xef\xc1\xe7\x87\xf3\x28\x41\xc7\x09\x73\x58\x2b\x1c\x2b\x0b\x4a\x3d\xf3\x9c\xd2\xd4\xc1\x0a\xc7\x6e\xb0\x89\xef\xc0\xf9\x86\x37\x8c\xc2\xd8\x1c\xdf\x73\x13\x5e\x1b\x69\x55\x7c\x54\x30\xf0\x06\x90\x29\x16\xba\x85\x5e\x25\xa0\x3b\xab\x38\x48\x06\x63\x66\x0a\x34\x8b\x00\x2a\x36\x29\xde\xda\x3f\xf5\x29\xde\xa2\x69\x13\x55\x3c\xfe\x16\x72\x34\x27\x9a\x71\xb1\xe6\x65\xd7\x23\xcd\xa4\x70\xe0\x94\x0c\x63\x3d\x3c\x96\xb8\x49\x98\xc4\x88\x63\xa5\x41\x75\x8f\xd1\xd7\xce\xb6\x67\x8f\x2d\x5a\x2f\x54\xc5\x87\x3a\xd8\x28\xb2\x4f\x72\xf0\x16\x4a\xb6\xc2\x2c\x24\x0e\x46\x3e\xd7\x85\xc6\x60\xb5\xa0\x25\xe1\xf1\x9b\xca\x0b\x33\x56\xf6\xe8\x35\x1a\xa9\xd5\xd8\x97\xe9\xa1\x61\x2c\x7a\x2c\x37\x02\x00\x17\x96\xd9\xf8\x2a\xb0\x02\x91\xb7\xd6\x5e\xf2\x16\x59\x7d\xa1\x91\x64\x3b\x06\x3d\xb8\xa9\xfc\xa2\xd8\x73\x8a\x56\xa6\x52\x81\xf3\x02\xdd\x82\x01\x53\xd3\x9b\x79\x65\xa2\xd0\xb8\x18\x98\xab\xd4\x06\x9a\x57\xfc\x6e\xe1\x06\xfa\xa4\x01\x53\x36\x99\xa4\x72\xd1\x94\xea\x1b\xde\xb5\x0c\xa7\x5e\x51\x12\x07\x16\x2d\xf5\x0d\x3b\x20\x0a\x85\x6d\x43\x33\x7e\xf0\x82\x71\xda\xce\x9a\x1f\xff\x8f\x23\x6a\xd3\x7f\x9f\xd1\x3a\xeb\xdd\x60\xdd\x25\xb6\x8b\x7a\x53\x72\xf4\xd6\x9b\xb9\xd8\xee\xea\xcd\xbb\x92\x7c\x50\x5c\x2d\xea\xe6\xa3\xa4\x3b\x39\x71\x6c\xc7\xfa\x25\x3e\xb4\x3c\x3a\xef\x8e\xa9\x75\xc4\xbc\x25\x75\x79\x77\xcc\xf3\x22\x66\x75\x33\x5f\xdd\xd5\x9b\x77\x75\xc6\x32\x9c\x92\xc4\x7c\x3f\x5f\xed\xb2\x1b\x7f\xa0\xdf\x62\x57\x6f\x7f\xce\x49\x7d\x19\xb2\x5a\x7c\x6c\xea\x4f\xef\x4a\xd0\x2e\xb1\x5c\x7d\x58\xff\xf2\x6e\x80\x96\x23\x16\x49\x9b\xbd\x3b\xd2\x6f\x62\x31\xaf\x37\xbb\x77\x83\xc0\x78\x71\xc5\xc9\xf2\x03\x07\xc8\x5f\x0d\x6f\xa7\xb8\x79\x71\xb5\xab\x9b\x9f\xe5\x87\x14\x96\x7a\xf5\xee\x64\xb4\xaa\xb8\x9a\x2d\xea\x5d\xfb\x50\xfe\xcc\x21\x36\x45\x3c\x24\x47\xbe\x77\x47\xae\x7d\xd4\xfe\x0f\x0f\x5f\xe4\xc7\x7a\x36\x2f\x3b\xa0\x75\x0d\x10\x57\xab\x74\x44\x7a\xf4\x48\x76\x74\x2a\xae\xb6\xf5\xdd\xd1\x03\xed\xa1\x92\xb8\xda\xf1\x7e\xda\x80\x98\xb9\xdb\x23\xef\x6f\x0f\x89\x99\x0f\xbb\x70\xff\x21\x9e\x60\xe0\x2d\x64\x51\x5c\x7d\xac\xf7\xeb\xcd\x72\x37\xbf\x12\x4b\x38\x10\xbb\x5e\x33\xaf\xeb\xe0\x61\x20\x89\xfb\xf6\xdb\x17\x7e\x78\x7e\x5f\x2f\x9b\x97\x7c\xb5\x13\xc9\x17\x7f\xf9\xae\x7e\x59\x71\x3b\x79\xfe\xf6\xdb\xaf\x4b\xa2\x9c\x67\xfa\x6b\x2c\xca\xbb\xf9\x6c\xb1\x5a\x37\xeb\x4f\x5f\xbe\x26\x93\x72\x4f\x4a\x7d\xf3\xd7\xd1\x43\xce\x80\x3c\xbd\xc9\x7e\xfc\x65\xfd\xb8\x9b\x6f\x0a\x36\xe4\xdd\xe7\xf5\xe6\xe7\xf7\x9f\x97\xbb\xd9\xe2\x44\xfa\x7c\xb7\x5b\xae\x3e\x6d\x8f\xef\xfc\xa9\x59\x7f\x28\x59\x90\x3f\x34\xf3\x9c\xda\xf8\x66\xfd\x61\x59\xf0\x24\xff\xae\xde\xed\xe6\x9b\x2f\x59\xca\xe8\xe1\xa1\x59\xce\x6a\x6a\x86\x9c\x64\x79\x7d\x57\x7c\x78\xbe\xb9\x5f\xae\xea\x26\x4b\xfa\xfd\x72\xfb\xd0\xd4\x5f\x8a\x77\xee\x1f\x06\x35\xfb\x63\xb3\x7e\x78\xc8\x9f\xf9\xa1\x79\xfc\xb4\xcc\x33\xa2\x31\xd3\xac\xeb\xbb\xeb\x66\xfd\x78\x97\xa5\xff\xf4\x70\x2a\xf5\x0f\xbf\x3c\xac\x4b\xee\xe6\xfb\x41\xc2\xfb\xc5\x72\xde\xdc\xfd\xdf\x47\x29\x47\x09\xd7\x8b\xf9\x2c\x27\x6c\xfe\xcb\x7c\xbb\x7e\xdc\xcc\xe6\x3f\xac\xd7\x45\x35\xeb\x5d\x7d\xdd\x3c\x6e\xcb\x7a\xdd\xcc\xef\xd7\x45\x2b\x5e\xff\xf0\x53\xde\xca\x8f\xcb\xe6\x6e\xb9\xfa\x74\xba\x99\xf3\x8e\x3c\xfe\xf4\xfb\xdd\x7a\x53\x7f\x2a\x68\xb1\xd7\xdb\x5d\x51\xa2\xed\xe2\xc3\xba\xde\xdc\x15\xfd\xfc\xb8\xcd\x5f\xf9\xef\xf3\x2f\xc3\x47\x7e\x3f\xdf\x2f\x67\x05\x3b\xf6\xef\xea\xd9\xcf\x8f\x0f\x47\x09\x7f\x99\x6f\x77\xeb\x4d\xc9\xcb\xbd\xb9\xfb\xfd\x72\x5b\xb4\x56\x3d\xfb\xf9\xfd\x7c\xb3\x2f\x8a\xfe\xd7\xe5\xc7\x65\xd1\x0a\xab\xbb\x52\xf8\x9a\xf5\xec\xe7\xed\x9f\x36\xeb\x32\x57\x4a\xcd\x7e\x4f\xea\x2f\xf3\x4d\x5e\xce\x9f\x56\xcb\xd5\x76\x57\x37\x4d\xc1\xd9\x3d\x4c\xf9\xf3\x7a\x90\xfd\x0f\x8b\xf5\x6a\x3e\xae\x57\x77\xdb\x62\x48\xfc\xe5\xb1\x99\x6f\x7e\x98\xaf\x66\xcb\xa6\x25\xdf\x16\x73\xf8\xb1\x57\x0f\x47\x34\xe8\x7f\x5c\x36\xc9\x24\xc0\xbc\xdb\x96\xd7\x79\xdb\x8e\x56\xcb\xfb\xe1\x08\xfa\x91\xda\x7c\xb3\xdc\xcf\x0b\xb1\xb9\x5b\xd6\xd7\x8b\x7a\xf5\xa9\x6b\xb7\xeb\xf5\x6a\xb7\x59\x37\x93\xc7\xfc\xd5\x1f\xd6\x77\x45\xc5\x8a\xa1\xf8\xe7\xfa\x7e\xbe\x7d\x18\xd0\xa9\xaf\xef\x8a\x32\xd3\xef\x61\x33\xb7\x72\x35\xba\xab\x1f\x4a\x81\x23\xf1\x3a\x7a\xf8\xff\x7b\x5c\xe6\x65\xb8\xae\x1f\xea\xd9\x72\xb7\xde\x94\x03\x66\xb9\x2d\x93\xfe\x6d\x75\xf7\x38\x1b\x3c\x55\xdf\x15\xac\xe7\x3f\x6d\x3f\x64\xbf\xfe\xaf\xcd\x40\xd1\xf4\xad\x5d\xe8\x95\xd5\xae\x5e\xae\xe6\x9b\xe9\xba\x79\xbc\x3f\x79\x27\x4f\xbb\xfb\xfd\xfe\xae\x10\xea\x61\x1e\xa3\xdd\xfa\x3e\xff\xb9\xdd\x2e\x3f\xad\x7e\xda\x16\x5f\xf9\x61\xb3\x9e\xcd\xb7\xdb\xef\x57\x85\xe6\xfe\x5d\xf3\x38\xdf\xad\xd7\xbb\xc5\xf7\x1f\x3f\x9e\x4a\xce\x5b\xf0\xfd\xef\xf3\x0e\x99\xde\x1c\x0d\x28\x92\x0d\x1a\x55\xdb\x53\x37\xf2\xf2\xdd\xdd\x2f\x57\xcb\xed\x8e\xb9\xdb\x4b\x9a\xfa\x62\x48\x8e\xe7\xcd\xf2\x97\x62\xc0\x3f\x34\xeb\x42\x47\x91\x32\xfd\x71\x53\x7f\xfc\xb8\x9c\x0d\x93\xdf\xd3\xa4\x3d\x4c\x6c\x67\x99\x62\x28\x36\xcb\x55\x31\x58\xcb\x9f\xbf\x5f\x6e\x67\xeb\xd5\x6a\x3e\xdb\x95\xbd\x34\x48\xf9\x69\x55\x6f\x66\x8b\x41\x35\x8f\x52\xae\xe7\x9b\xdd\xf2\x23\x29\xcd\xbf\x1f\x4d\xfe\xbf\x9e\x56\x1c\xc3\xa3\xd6\x75\xf3\xe5\xd3\x7a\x75\xce\x21\xdf\xc3\x7a\xb9\xda\x6d\xbf\xbb\x8a\xdf\x28\x0f\x46\x7d\x13\xbf\x41\xff\x8d\x0a\x60\xd3\x1f\x8e\xff\xb0\xdf\x28\xd5\x5e\x55\x4c\x4f\xf1\xd3\x4f\x78\xbd\x9c\x0b\x87\x6b\x68\xc1\xa5\x91\x69\x62\x50\x60\x04\x1d\xa6\x1a\xc7\x66\x8a\x1e\x82\x1d\xbb\xbd\x54\xe0\xc6\x66\xaa\x22\xb8\xb1\x9b\xaa\x40\x7f\xab\xf4\x77\x35\x36\x53\x93\xd0\x12\x19\x0c\xa5\x62\x80\x64\x0f\xc6\x4c\x74\x42\x53\xc6\x9c\x38\x81\xb9\x3b\x07\x8b\xd3\xb1\x36\xa0\x5c\xb1\xb1\xc0\xa7\x36\x27\x38\x37\x5e\x47\x09\x63\x84\xae\x16\x66\xc8\x9b\x06\x7e\x82\x1e\x12\xc7\x7d\xc6\xda\xa2\xc0\x3b\xa9\x16\xd5\x20\x49\x28\xa8\x68\xf1\xcf\xfe\x27\x53\xcc\x59\xd7\xf8\xfb\xb7\x94\x4d\x04\x6c\x14\x44\xc3\x48\x69\x13\x0c\x4c\x71\x39\x45\x33\x46\x73\x7b\xcf\xdb\xa4\x46\x2f\xcc\x1e\xc1\x70\xd2\x4b\xaa\xf7\x6b\x64\xbe\x5d\xd7\xb1\xab\x39\x7a\xd0\x9e\x6a\x66\xbb\xaa\xd9\x9c\xca\x49\x83\x35\xa2\x6a\x2b\xe1\xa6\x2c\x4a\x7d\x2f\x15\xf1\x35\x42\x41\x44\xee\x5c\x50\x7e\x4f\x5d\x8d\xdc\xed\xfd\xaf\xbd\x03\x67\xf3\xdf\x16\x2a\xff\xd2\x6e\xbd\x51\x95\x20\x29\x71\x10\x0d\xc9\x4d\xe5\x05\xba\xdb\x7b\x0e\x7a\x64\x8a\x88\x29\x5a\x70\x61\x91\x02\x9d\xe8\x77\x04\xb4\x47\x2d\xeb\x52\x03\x96\xd1\x5f\xf9\x64\x7f\x09\xee\x26\x0f\x5e\x0b\x6d\xc1\x98\x9a\xcf\x57\xf9\x52\xb5\xae\x33\xbc\xc1\x96\x1c\x13\xf8\xda\xa6\x3b\x70\x28\x19\x8d\x59\x33\xcd\x7f\xba\xa6\x9b\x91\x6e\xa3\x1d\xf1\xa9\x29\x5f\xba\xa3\x2a\xe3\x84\x83\xca\x36\x54\xc7\x60\x0b\x52\x5c\x05\x2e\x27\xec\x50\x60\x2c\x04\xdf\x58\xa6\xfa\xab\x8b\x98\xa3\x16\xdb\x3f\x36\xec\xe5\x24\x74\x9d\x5c\x11\xd2\xb5\xdb\x58\x56\x5e\x58\x08\x71\x51\xd5\x2a\x26\xa0\x2e\xe6\x9d\xe7\xff\x5c\x3a\xc5\xaf\x62\xa3\x41\x29\x89\x34\x3a\x14\x38\x23\x54\x07\x9e\xc6\xae\x6d\x4e\x82\xc2\xc6\x83\xb5\x1c\xf9\x98\x15\x57\x5b\x76\xc4\x69\xa4\x86\x28\x34\x04\x37\x32\x7c\xec\xd7\x9d\xfa\x29\x91\x35\xea\xed\x0d\xf3\x8a\x69\x70\xa6\x91\x4c\x2e\x6d\x6b\x64\x94\x3b\x96\xd5\xb4\x03\xed\xf9\x10\x92\x7d\x08\xd2\x25\x95\x34\xb0\x27\x9d\xe5\xbd\x75\x45\x79\xa9\x1e\x28\x52\xd9\xc4\xb5\xc2\xdc\xe3\xfc\xfa\x01\x1a\x1b\xac\x04\x6f\x1a\x0d\x91\x1a\xda\x25\x52\x36\x43\xc2\xa9\x5b\x04\xbc\xdc\x7b\x16\x22\x32\x6e\x65\x72\x1b\xe2\x6b\xba\xc1\x74\xa1\x06\xbc\x4d\xad\x58\x42\x97\x49\x1a\x97\xf4\xe5\x22\x24\x56\x28\xd3\x20\x78\xa9\x01\x4f\xb0\x3f\x9d\x3d\xf8\xa9\xea\x8c\x04\xea\xd2\xb1\x3c\x97\x52\x77\xad\xe3\xd9\xed\xcc\x53\x37\x7a\x2f\x75\x0d\xce\x1f\xbc\xd6\x49\xa1\x55\x0d\x2b\x08\x95\x09\x56\x72\xe3\x4c\x61\x61\x18\x84\x06\x34\x07\x96\x2c\xf6\x44\x4b\xc7\x0d\xda\x42\x15\xdb\x6b\x2b\xf3\x1e\x94\x95\x71\xa4\x35\x1f\xab\xea\x0e\xd9\x99\xf7\x1e\x99\x1d\xbb\xd6\x2d\xea\x4a\x38\xdc\x20\x8d\x64\x1b\x0d\x86\xf3\xcb\x0a\xa2\x81\xbd\xe8\x27\x8c\x1f\x2b\x62\x0d\x8e\x33\xef\x8e\x00\xc0\x33\xe0\x2e\x95\x84\x31\xeb\x18\xea\x30\x5d\xfb\xfe\xef\x9a\xe6\x84\x92\x68\x97\x08\x17\x50\x0f\x09\xd7\xd4\x74\x14\x59\xe9\x74\xcf\x8c\x7a\x5a\x1c\xd1\x3d\x40\xea\xdf\x3d\x19\x14\x90\x10\x14\xcd\x09\xb4\xf0\x57\x4d\xe8\xe8\x98\xf4\x5b\xd1\x60\xca\x0e\x72\x50\xa7\x50\x69\x0d\xd6\xb5\xd7\x74\xc7\x32\x10\x65\xa3\x79\x2e\x81\xe0\xcb\x8d\xf0\xee\x53\x17\x9a\x8d\x55\xe0\x00\x88\x0a\x3c\x92\xd4\x06\x8e\x60\x0c\x07\x18\x55\x9e\x24\x1b\xf6\x11\x48\x47\x17\x34\xb0\x0e\x4a\x12\x25\x3b\x6a\x06\x9e\x92\xf9\xda\xde\x62\x76\xa5\x62\xbe\x51\xa0\x90\x2c\x17\x3b\xc2\xaa\x45\x38\xf1\x19\xa8\x61\x57\x8a\xb7\xd6\xcb\xf4\xec\x93\x96\x04\x1d\x47\xf8\xff\xb3\xf7\x6e\xcb\x91\x23\x39\xa2\xe0\xaf\xc8\xea\xd9\x1d\x46\xc0\xef\x0f\xfd\x10\x9b\xb3\xbb\x5c\x5b\x69\x6d\xec\xd4\x0c\x77\x4d\x6f\x31\xea\x9c\x8e\xb4\xa1\x2a\xab\x2b\xb3\x63\x4e\x9f\xaf\x5f\x03\x9c\x64\x90\x8c\x8b\x48\x06\x43\x52\x66\x69\xa6\xda\x33\xc4\x9b\xbb\xc3\x01\x38\x00\xc7\x45\x52\x81\xe4\xb6\xe5\x54\x88\xb9\x48\x94\xa4\xcd\xf5\x90\xcc\x86\xbc\xa2\x2e\x4a\x4c\xfc\x17\x12\xc4\x91\x07\x1b\x8f\xfe\x44\xb9\xc5\x79\xe3\x73\x0d\xdc\x1b\x47\x2d\xe6\xd7\xe2\x25\x89\xf1\x49\x83\x97\x9c\xa3\x08\x64\x20\x68\x49\x74\x28\x27\xe2\x9d\x17\xb7\x60\x09\x4b\x76\x9f\x2c\xf3\xd9\x04\x36\x28\xa7\x92\x72\xbc\x3e\x11\xbc\xeb\x61\x0d\x15\xe2\x33\x2b\x6d\xbb\x97\x90\x91\x24\xce\xbd\x03\x21\xe6\x9b\xb2\x4e\x12\x5f\x9f\xdb\x96\xe8\x43\xd0\x54\x33\x0a\xf0\x1e\xe5\x37\x8c\xa3\x92\xc3\xde\x75\x30\x29\xe4\xfb\x6e\x08\x26\xd9\x20\x51\x52\x57\x4a\x12\xe4\x2e\xd1\xb4\x30\xee\x1a\x0b\x88\x2a\x37\x6d\x6e\x6f\x4d\x5e\xb7\xf2\xc3\x00\xb2\x67\xcb\x69\x9c\xe4\xc2\xe2\x6c\x1f\xf3\x79\x3b\x25\x70\x56\x3c\xed\xcf\x39\xcf\xcf\xc8\xf7\x4f\x49\x66\x15\x20\x60\xcd\xbb\xb0\x78\x12\xe5\x8c\xcf\xae\xa3\x67\x1b\x34\x01\x0a\xd8\x85\xf5\xbb\x5e\x12\x5f\xc9\x5b\xf5\xa4\x85\xc6\x75\x3e\x06\x15\x52\x80\x22\xd4\x46\xa4\x45\x49\x83\x17\x64\x0b\x95\xb6\x68\x3c\x97\x3c\xef\x90\xb4\xc9\x25\x20\xda\x0d\x4d\xb2\x24\xb7\x23\xba\x66\xeb\x32\x5d\x4d\xe6\xc0\xd8\x64\xe2\x46\x12\x6b\x4a\xd3\x2e\x31\x77\xe4\x81\xc2\x3d\xca\x31\x79\x84\xb4\x21\x2b\xfe\x80\xb6\xe7\x9b\x2a\x5e\x1b\x04\x48\xdb\xa3\xa1\x6a\xb0\xbe\x05\xdb\x66\x04\x36\x75\xe8\xfa\x9a\x79\xb4\x44\x2f\x14\xc5\x92\x12\x6f\x59\x3c\x17\x8a\x2a\xb7\x4d\x6f\x3c\x99\xc4\x3b\xc4\xf1\xf2\x65\x71\x97\x07\x9a\x97\x77\x34\x0b\x25\x3e\x92\x96\x19\x46\x6e\x5b\x2a\xf1\x4c\xa9\x22\x9e\xb1\xc0\x84\xb2\xf9\x7b\x29\x47\xe7\x0f\x39\xa6\x9d\x11\xef\x27\x75\xdc\x2d\x2f\xf0\xe5\x5e\x37\x28\x11\xac\xd8\x8b\x63\xcd\xb9\x6c\xd0\xd7\x06\x3c\x0f\x61\x8b\x46\x7c\x3d\x4c\xe7\xec\xa1\x73\x4d\x07\x89\x92\xef\xe7\x82\x6f\x7a\x2c\x52\x0d\x28\xfa\x80\x10\x69\x4b\xa3\x2c\x8f\x15\x1e\xac\xf8\x6d\x52\x6e\x72\x8f\x49\xb3\x82\x96\x44\xe0\x63\xd9\xff\x04\xe5\x8e\xea\x3f\x64\x4b\xe0\x0a\xbb\xba\x29\x24\x1a\xb7\x24\x3f\x64\x35\x85\xa2\xd2\x60\x65\x8a\xd2\xb1\x6e\xc4\x38\x34\x3a\xce\x96\xc2\x2e\xbd\xf8\x69\x85\xc5\x28\x74\x58\x1c\x1f\x4a\xe9\x61\x50\xb8\x5b\xb2\x6f\x16\xfd\x4b\x79\x10\x2b\x89\x04\x58\x40\xf6\x2e\x09\x75\x50\x1e\xe2\xc0\x11\x04\x2c\x0b\x83\x7a\x78\x59\x1c\xa0\x11\xac\xb9\xc7\xa4\x88\xc0\xbb\x6a\xe0\x9c\xa0\x8a\x4a\xae\xd6\xda\x49\x9a\x5e\x1a\x65\x07\x10\x97\xd0\x39\xa3\x9f\x53\x91\xf1\xed\x66\x33\xc8\x00\x29\xe2\xe9\x0d\xf1\x81\x78\x5b\x3d\xca\x54\xd0\xf4\x3b\x71\xf7\x9a\x93\x92\x61\x7e\xdd\xc0\xb5\xca\xd5\xfe\x08\xe8\x39\xa3\x0c\xad\xc1\xa6\xa0\xeb\xcd\x50\xe3\x64\xc1\xba\xab\xcb\xd1\xbe\x9b\x82\x75\x03\xd6\x7e\x38\xf8\x59\x43\x65\xcb\x2e\x45\x7e\x98\x00\xad\x4d\xae\x10\x79\x96\x36\xd5\x0e\x8c\x72\x40\x03\x9f\x20\x0b\x41\xdc\xc8\x18\xa5\x28\x0a\x4e\xa9\xee\xd7\x28\x35\x0a\x37\x74\x8f\xd9\x19\x30\x76\x48\x68\xc6\x19\x54\xf8\xb1\x9c\xfc\x9f\x3f\x72\x9f\xeb\xca\x3a\x30\xc3\x5a\xb3\xed\x80\x57\xda\x0c\x7e\xd4\xfd\x6d\xce\x0e\xf1\x27\x59\xe5\x19\xa5\x81\x7f\x9e\xfd\xea\x74\x96\xdb\x57\xdd\xaf\x56\x45\x2f\xd6\x21\xb4\x95\xb2\x93\x12\xe8\x38\x2a\x9c\xae\x21\x4a\x32\xe6\xb7\xc5\xb3\x8f\xdd\xef\x8d\x76\xbf\xc6\x0f\x62\x25\x6b\x65\x01\xfd\x6c\x7f\x1a\xac\xd1\x80\xb5\x46\xa7\x43\xbf\x54\x5a\xb6\x17\x44\xac\x8f\x6f\x48\x55\xa3\x1a\x99\xc6\x87\x2f\x34\x25\x85\x9b\x3b\xc3\xca\x4e\xd2\xef\xe3\x83\x6b\x72\x1c\xa2\xaf\x51\x42\x7c\xbc\x24\x80\xf5\xda\xdf\x8b\xd2\x8f\xab\xe9\x3b\x12\x0d\x82\xfe\x68\xaa\xf7\x24\xd5\x48\xda\x81\x63\x9e\x90\xcc\xf5\x3e\x1b\x6b\x0b\x5f\xa3\x05\x97\x05\xce\xcd\xe1\x31\x23\xb6\x68\x71\x86\x3e\x39\x43\xee\x6e\x35\x1b\xa9\x32\xd4\x3f\x50\xbb\xb4\x50\xfd\xe1\x9b\xa2\x37\xf6\xe1\x14\x55\xf3\x0c\x4f\xc2\x1c\xd7\xdd\x2a\xa6\xd9\x19\x5f\x38\x91\x78\x6b\x04\xbb\xde\xf2\xf6\x9e\x11\xe7\xb2\x4d\xed\x0d\x91\x66\xc0\xaf\xb2\x1f\xd7\xd9\xf4\x9b\xbc\x47\xa9\x04\x05\x83\xc3\x0c\x5c\xdb\x25\x6e\x97\xaf\xaa\x7e\x54\xad\xe5\xad\x81\xfa\x86\x71\xa9\x5d\x8b\x35\x3f\x37\x48\x61\xcc\x6f\xf3\x27\xfb\xbe\xe4\xa4\x28\xb0\xdc\x39\x70\x2f\x6f\x06\xf0\xf8\x20\xd5\xf4\xf2\xd9\x41\x3e\x9f\x8b\xb9\x98\xaa\x94\xf9\xc1\xe2\xf1\x41\x42\xb2\x9c\xaf\xc5\x7c\x5f\xc4\x3d\x5a\x88\xf7\x5e\xc2\x03\xfc\xe3\x03\xca\x99\xa3\xb5\x15\x7a\xf0\xb6\x46\xd4\xdd\x43\xab\x65\x6c\x90\xb3\x2c\x67\x2a\xe9\xf2\x7e\xd4\x23\xa3\xa4\x46\xc0\xb4\x15\x3f\x7e\x73\xc8\x59\x45\x80\xe2\x7b\x9f\xa5\xd3\xde\x9c\x54\x9e\x73\x6d\x24\x89\x39\x83\x42\x0e\xe5\xad\x2c\x32\xa9\x61\xbd\xcc\x1b\x2e\x09\x4f\xea\xf1\x01\x43\x9e\x8f\x6a\x60\x5a\x0d\xc0\x7d\x36\x17\xe3\x44\x49\xed\x42\x00\xbd\x97\x18\x03\x20\xcf\xc2\x54\x60\x7c\x48\xb8\x1d\x6f\xcb\x39\x30\x30\x11\xef\xec\xe1\xd4\x5d\xcd\x77\x65\x63\x97\x3b\xfe\xe4\xc6\x9e\xfb\x59\x32\x97\x73\x85\xe4\x5f\x4c\x6b\x78\x1a\x5b\x22\x14\x51\x1b\x08\x66\x1b\x98\x95\x85\xf6\xc0\x00\x35\x31\xaa\x84\x73\xa8\x62\x99\x3a\x08\xd0\x6c\x02\x48\xc0\x3d\x76\xc9\xcc\x08\x9c\xf2\x5d\x15\x44\x54\x52\xf0\xea\xb5\x51\xc9\x00\x49\x31\x45\x9e\x92\xe9\xca\xc2\xb5\x89\x17\x17\xa2\xd8\xb2\xcc\xf3\x6b\xe6\xfb\x3c\x9b\xee\x78\xd8\xe7\xf9\x02\x35\xef\x8b\xd1\x9e\xc0\xac\x8e\xf1\x3e\x32\xe2\xca\xea\xa8\xd3\x3c\x75\xad\x24\xe2\x0e\x4c\xdc\x23\x1e\xf3\xd1\x90\xcb\x9b\x32\x1f\x8d\xca\x1c\x32\x18\x51\xae\x73\x8d\xfe\x2c\x1f\x6d\x82\x5e\x99\x89\xba\xd7\x67\xa2\xe6\x5c\x1e\xcf\x21\xe3\x18\x26\xf2\x9c\xc8\x20\x5d\xae\x2a\xdb\x2a\x3e\xcc\x00\x85\x97\x85\x21\x7b\xc4\x83\xe2\x33\xb8\x7d\xac\xf8\xd0\x79\xc5\xe7\x5c\xce\xf1\xb3\xd3\xf8\xe0\x8d\xd7\xf3\xc6\x9b\xa6\x79\x5f\x31\x05\xec\x38\x4f\x4a\x3f\x7e\xe0\x7c\x95\x56\x70\xa6\xf1\x10\x21\x0f\x5e\xc4\xa8\x50\x79\xb0\xc3\x38\x4f\xc5\x82\x48\xad\x03\x38\x6d\xc0\xba\xe3\x45\x09\x52\x70\x7e\x78\x47\x96\x61\x9f\x00\xed\x3d\x49\xd2\x24\xee\xe6\xd4\x03\x21\xf6\x63\xc7\xdb\xf5\x3b\xfe\x64\xb3\x86\x21\x63\x21\x79\x56\x13\xc4\xff\xea\x78\x9d\x8f\x47\xca\x9f\xd5\x90\x70\x57\x88\x87\xee\x20\x52\xfb\x00\x85\xc7\x67\x4d\x10\x99\x5e\xef\x49\xb2\x65\x65\x07\x29\xf1\x9b\xf2\xa1\x76\xd9\xd9\xcf\xf0\x8e\x19\x01\x95\x85\x22\xca\x45\xc5\x17\xef\xe5\x9a\x14\xa9\x60\xe4\x6b\xab\x34\xcb\x19\xb1\xc1\xfe\x73\x7c\x91\xa4\xc8\x78\xca\x5f\x7e\x7c\xf6\xe0\x72\xb9\x4b\x2d\xe5\xc2\xb9\xd5\xa6\x22\x04\x32\xf7\xf9\xb4\x9f\xec\xc0\x42\xa5\xc8\xd6\x9e\x41\x41\x10\x25\xc2\xbc\x59\xbd\x5d\x51\x45\xb9\xa1\x08\xe2\x18\x30\xf7\x64\xc1\xab\xb8\x0f\xe0\xe2\xae\xa8\x73\x5f\x8f\x0f\x86\x1a\x67\x1c\xd6\x1c\xbb\xfe\xb1\x19\x00\x31\x2c\x30\x0d\x07\x40\x7e\x30\x80\xd9\x92\xfc\x4b\x48\xb8\xd3\xb4\x2f\xea\x01\x30\xce\x4f\xab\x06\xb2\x1a\x10\xb7\xe2\xb5\x29\x4d\xc3\x4e\x28\x69\xf0\xae\xc6\x5c\x2d\xd7\xc8\x5e\x15\x15\xde\x37\x0b\xc4\x8b\x22\x0b\xca\xa8\x16\x72\x82\x7a\xde\xa4\x72\x19\x61\xb1\xaf\xcd\x45\x76\x1e\x73\x12\x97\x86\xd3\xb8\xfe\x6a\x98\x7e\x11\xcf\xa7\x23\x66\x2e\x30\x9f\xe6\x21\xa4\xb8\x30\xf9\xc7\x67\x74\x9a\xdf\x96\x6d\xa0\xe9\xe3\x04\x5d\x0d\x3a\x99\x81\x75\xb9\x97\xf3\x95\x03\x66\x68\x40\x27\x36\x75\xdb\xd3\x7a\x8e\xf6\xed\xa1\x3d\xf3\xd4\xae\xaf\x33\x17\x99\x66\xcf\x5c\x57\xed\x79\x91\xc1\x23\x41\xd8\x4a\x55\xec\xd0\x39\x57\xcb\x1e\xee\x70\x6f\xc1\xa4\xa9\x74\x77\xdf\xa4\x9a\xdc\x4a\x4e\xdd\x70\x48\x6e\x27\x6e\x57\xb5\xb6\x4c\x54\x74\x4c\x6c\x96\x55\x0d\xfa\x56\x68\xf1\x14\xd6\xbc\xcf\x87\x9c\x3b\xc1\xb9\x8e\x72\x9b\x2f\x98\x41\xac\xfc\x07\x09\xfe\x58\x24\x38\x59\x43\x1c\x4a\x47\x50\x34\x09\x7a\xbc\xfc\x5a\x5d\x37\xfc\x10\x81\x2e\xe0\xe5\x45\xc9\xe7\x80\x46\x8f\xcf\x1a\xb5\x07\x6b\xa5\x51\xa6\xc2\x62\xe8\x9b\x0b\xc6\x69\x89\x07\x3a\xc8\x1c\x37\x97\x9b\x76\x45\x45\x16\x10\x77\xc5\x79\x61\xe9\x19\x9d\x78\xe2\x59\xaf\x4c\x7e\x7a\xb2\x5c\x73\x59\xa5\x7e\x09\xab\xf6\x45\x27\xd5\x58\x73\x00\x98\x38\x59\xb7\xbc\xb3\x03\x5b\x0d\x68\x99\x3f\x6e\x0c\xe4\xea\x5b\xad\x67\x3f\xb2\x6a\x55\xa3\x54\x76\x01\x22\x4d\x80\xf6\xb4\x44\x23\x79\xa6\x5c\x2b\xd2\x68\x2b\xbe\xcb\x3f\x27\x33\x7d\xd6\x14\x15\x24\x54\x2d\xa2\x7a\x75\x84\x37\x0d\x56\x19\x84\xd8\x2e\x7b\xb6\x49\x16\xf1\x22\x07\x4d\x90\x34\x92\xa4\x2f\x3c\xa6\x82\x8e\x99\x66\xba\xb1\xfd\xcf\x43\x4c\x10\xd3\x05\xbe\x79\xad\x59\x62\x28\xb5\xa4\x49\x52\x4b\x68\xa4\x96\x40\x17\xa5\x16\x3c\x2f\xb4\xa4\x93\x42\xcb\x35\xb6\x88\x29\x02\x8b\x94\x21\xf5\x8c\x3a\xde\xf7\x24\x16\x1b\x58\x62\xb1\xd3\x68\xaa\x91\x57\xcc\x56\x32\x69\xf6\xd2\x69\x4a\x92\x4b\x91\x57\xe8\xb4\xbc\x62\xa2\xa2\xca\x9f\x96\x52\x7e\x76\x5d\xe1\xa7\xa2\xad\x89\x86\x9b\x41\x25\x82\x04\x29\xde\xde\x5e\x93\x13\x40\xac\xe1\x99\x2d\x09\xd2\x23\x18\x97\x8d\xda\xa3\x5a\xfe\x31\x88\x19\x8d\xf1\x98\xec\x00\xef\x02\xa4\x8a\x09\xbc\x1f\x7a\x0c\x1e\x12\x89\x31\x0d\x06\x89\xf1\xf2\x67\xe4\xcc\x94\x06\xf9\xce\x72\x49\xf0\x04\x34\x48\xc0\xda\x0d\x49\x0e\x04\x2d\xa0\x53\x0c\x56\x23\x99\xb5\x99\x65\x49\x72\x6c\x6b\xef\xd1\x02\x21\x93\x9f\x97\x53\x89\x1c\xa3\x28\xc9\x92\x2d\x8b\x02\x89\x17\xd8\xdd\x93\x24\x82\x24\x48\xf8\xf8\xe0\x54\x46\x20\xcc\xce\xf8\x95\x41\xb0\xfe\x5e\xaa\xae\x93\x18\xd5\xf9\x82\xab\x58\x98\xf0\x75\x86\x47\xda\xa3\x85\xab\x42\x34\xfe\x94\xa0\x7e\xce\x39\x74\xcf\x82\x72\x80\xcf\x6b\x45\x0f\x76\x21\x63\x5b\x8a\xf9\x34\xa4\x85\xa2\x41\x90\x1c\x89\xa7\x22\xb1\xb6\xe4\x85\x8b\xf8\x5e\x72\xc3\x08\x31\x69\xc9\x13\x78\x90\x0c\x57\x0a\x1f\xa3\xa3\xb0\x3d\x09\xa7\x93\x50\xff\x2e\x8f\xef\x85\x40\x2f\x71\xeb\x76\x4d\x5b\xbc\x71\xac\xde\x30\x06\x31\x40\xda\x1e\xc5\x98\xe9\xa8\x48\x86\xd7\x1f\x5b\x8e\x30\xcb\xce\x00\x4d\xdb\x48\xac\x06\x3c\xe9\xe1\x4a\x91\x04\x0a\xdb\x1c\x63\x49\x4d\x3b\x98\x4a\x80\xb4\x52\xd4\xe1\xed\x03\x50\xdf\x49\x44\xdc\x21\x6c\x6b\x4b\x81\xd9\x46\x6e\xf3\x92\x71\x4f\x41\x56\x6a\x69\x8c\xd5\x30\xb8\x8c\xf9\xab\xcf\x0e\x9d\xaf\x1e\x59\xd6\x26\xad\xc8\xe1\x91\x92\x78\xe0\x28\xb0\x52\x13\xc2\xe9\xf9\xbe\x1c\xdc\x25\x3b\x49\x6e\xda\xb5\x67\x42\x9d\x3b\xd9\xde\xf8\x56\x88\xa3\xa3\x5c\xfa\x83\x7b\x67\x8a\xb4\xd9\x65\xb8\x9d\x16\x9a\x1c\x24\xba\x38\xae\x2c\x34\x6d\x33\xe1\x22\x67\xed\x3d\xf5\x86\x06\xeb\x6a\xe0\x29\xfb\xe3\x10\xc8\xc3\x20\x4f\x6c\x0a\xbd\x4c\x58\xa3\xad\xe1\x8f\xcf\x4f\xdf\xaf\x33\xe3\x4a\xed\xc0\x5f\xee\xfe\xf9\x97\x5f\x30\xfc\x72\xf7\xdf\x5f\xfe\xfa\x7d\xf7\x97\x5f\xd0\xfe\x72\xb7\xfb\xfc\xe5\x6f\xbb\xef\x7f\xf9\xe5\x44\x3d\xa8\x65\xbd\xd2\xb0\x57\x2f\x9d\x92\xeb\x3a\xa5\x1b\xf4\x69\x4e\xce\xb4\xd7\xe9\x0b\x33\x5d\xe6\xf6\x6b\xc7\x2e\xdd\x79\x53\xc2\xcd\xc8\xfb\x5a\x61\x52\x2c\x8f\xdf\x63\x92\x1d\xb8\xc4\x62\xbf\x9e\xeb\xb4\x1b\xbb\x4e\x8b\xef\x01\x93\x55\x69\xa8\x22\x2c\x73\x09\x9e\x02\x5c\xdc\x8c\x7c\xbc\xc4\x5a\xc2\x52\xc1\x56\x72\x23\x1c\x12\x24\x68\x20\xaf\xc1\xf9\xd2\x56\x81\x5f\x0d\x58\x23\xa0\x3b\x2a\x96\x1b\x2a\x4a\x2f\x56\x35\x15\x17\x83\x07\xab\x28\x55\x64\x4a\x43\xfb\x59\x3e\xae\x17\xe7\xee\xdf\x9f\xe3\xf5\x54\x6c\x9e\x64\xfb\xed\xe8\x27\x5d\x4f\x3e\x93\xa2\x3c\xba\x0e\x7b\x5c\xe2\x06\x3d\x9a\x41\x8f\x6b\x32\xa6\x09\xc5\x8f\x57\x66\x4b\xe7\x7b\x74\xa7\x66\xb9\x0a\x53\x3a\xdf\xa7\x1f\x87\xb9\x2a\x49\x87\xb4\xd7\xe0\xf0\xb8\x54\xb1\xd4\xd6\x61\x7e\xb4\x56\xc0\x50\x18\x05\x0c\x65\x37\x91\x6d\x00\x1b\x94\x34\x8d\x6d\x0a\x7c\xd4\xe0\x32\x7b\x21\x70\x72\xde\x46\x2a\x74\x79\x17\xb4\xb8\xba\xa8\xd1\xd5\xec\x00\xb3\x84\x07\x5d\xae\xac\x6c\x15\x3a\x61\x4c\xa5\x7d\x91\x51\x2d\x0c\x38\x8a\x57\x04\x1c\x9d\x45\xbe\x33\x8a\xe1\x7a\x5c\xe3\x8c\x36\x77\xc0\xe6\x74\x35\xc9\x9e\xd1\xb1\x56\x64\x44\x67\x74\x9f\x25\x8c\x67\x49\xd6\x14\x43\xca\x2d\x40\xd9\x30\x2c\xa2\x2e\x58\x1a\x5a\x24\x7d\x2e\x54\x9c\x8a\xb0\xb3\xe0\xe2\x57\x65\x8e\x27\x39\xc4\x5a\xcc\x70\xce\x71\x40\xae\x78\xf6\x72\x05\x76\xb2\x25\x3d\x3e\x47\x6d\x98\x65\x52\x99\xfd\xf7\x29\x94\x71\x4f\xe5\x8c\x00\x8b\x49\x86\xfe\x86\x41\x67\xd1\x50\x1d\x44\xc3\x9e\xc4\x15\x8c\x36\xe3\x3a\xf2\x7b\x5f\x62\x04\x17\x4e\xc9\x72\xfc\xa5\xc7\x87\xa8\x52\xe9\xab\x50\xce\xd0\x21\x2f\x0c\xd8\x9c\x17\x2f\x45\x7a\xe2\x71\x24\x49\xa2\xd5\x8d\x03\x8c\x53\x68\x4b\xda\xc7\xd2\xd8\x56\xfe\x8b\x0a\x79\x58\xc8\xe3\x7a\x46\xaf\x0a\x9e\x2a\x86\x59\x49\x0c\x2f\x0c\xd3\xbe\x73\x49\xf0\xec\x8c\x26\x98\xdc\x33\xf6\xa2\x6d\xe0\x69\x1f\x9f\xbd\x72\xd7\xc3\xf2\x45\x8b\xfc\x1b\xd0\xcd\xb9\x31\x99\xd1\x98\x3a\xc1\xe5\x45\x01\xc2\xa6\xdc\x34\x02\x04\xc5\x23\x25\x86\x49\x8a\x5c\x96\x8f\x86\xe2\x46\xd3\xcd\x65\x92\x3a\x6b\xdd\x3a\x3f\x1b\xbb\x6a\xf4\xf1\x65\x23\x3c\x29\xa2\x8c\x36\x79\x89\x5c\x7f\x89\x70\xf6\x12\x5d\xb0\xae\x29\x7b\x02\xb0\xc6\x56\x7e\xb8\x93\xd9\x3e\x38\x25\xe5\x69\xb3\x8c\x57\x59\x81\xcc\xaa\xc8\x3a\x2a\xd8\xd3\xe4\x2c\xbf\x85\x51\xa6\xd9\x6a\x8b\xc3\x56\xfb\x0a\x36\x19\x6a\x7a\xb5\x5d\xaf\xb7\x30\x8f\x1c\xed\x1c\xc2\x7e\x8b\x58\x4b\xe2\x15\x07\x3e\x96\xa6\x00\xc7\x1b\x9d\x4d\xca\x57\x94\xa4\xd2\x28\x58\x7b\x1f\x98\xc9\xa6\x1d\x12\xb8\xd6\xf0\xc0\x97\x7a\x88\xe4\x98\x32\x23\xd8\x70\x4f\xf9\xab\x83\x24\x14\x40\x76\x82\x88\x45\x08\xa6\xef\xdd\xd2\x0e\x70\x35\xf3\xc4\x7b\xdf\x94\x56\x33\x4f\xac\x82\xbf\x53\x0d\x14\x2b\x62\xef\x24\x0b\x45\x1f\x77\xa5\xb0\xbf\x24\xbe\x1b\xed\x2c\x9a\x14\x50\xaa\x79\xfb\x48\xf6\x18\x95\x4b\xd9\x4a\xb6\xa3\xc4\x16\x5a\x8a\x74\xbf\x31\x6a\x2f\x54\x68\xd7\xdd\xc3\x26\x9c\x74\x76\x2b\x50\x40\xf4\x0c\x1f\xd3\xdf\x6c\x24\x39\x71\x78\x55\x50\x36\x8a\xd7\x60\x95\x23\x24\x73\x2f\x65\xc2\xc1\xf2\xc7\xaf\xd5\xc7\x68\x5d\x22\x3b\xaf\x6c\x5f\x4f\x54\xf3\xf5\x31\xa2\x7d\x78\x11\xfa\xf4\xf8\x4c\x51\xb9\x92\x7c\x45\x6e\xb7\x8e\xb2\x70\x94\x6d\x44\x6a\x7f\x0e\x75\x9a\x7e\x0c\x5f\x67\xc0\x17\xc5\xec\x22\x9a\x49\x6a\x94\x42\x5c\xc8\x66\xb8\x50\x4c\xd2\xbf\xde\xe7\x1e\x72\xbd\x62\x73\x6b\x34\x98\x38\x90\x96\xb3\x6f\x46\xc6\x4a\x09\xc3\x0b\xd7\x2c\xfa\x02\x0d\x01\x5f\x51\x43\x58\xc8\x50\x97\x61\xfa\xf9\x7c\xb5\x57\xe0\xc1\xd0\x55\x6c\x50\x7a\xe8\x86\x32\x3b\xbd\x89\xcc\xee\x5f\x55\x66\x67\xf5\x57\x0a\x6b\x07\xe5\xab\x5e\xe6\x12\x5e\x9e\xa2\xf2\x2c\xba\x07\x85\xe2\x13\xa0\x11\x42\xba\xcf\x15\x18\xc4\xc3\xc5\xa3\x8a\xd0\x77\xbe\x6a\x3e\x76\x03\xf1\xba\x4d\x1a\x75\x60\xe3\x09\xac\x7f\x42\x45\xb9\xfc\xb8\x41\x95\xeb\xf8\x83\xb3\xe2\x02\x5a\x99\x82\x25\x34\x02\x1b\x3f\x59\xc9\xb8\x8b\xd9\xe9\xb5\x70\x0a\x6d\xfb\x6f\x89\xae\x42\x91\xcf\xc2\x16\x05\x0c\x5d\x79\x71\x8d\x20\x75\x8a\xe9\x13\x49\x30\x00\x73\x09\xcc\xff\x18\x53\x4d\x50\x42\xf9\xb9\x4f\x2c\x4b\x10\x20\x89\x50\x21\xf5\xde\x9b\x09\xdc\xe0\x74\xf8\x7d\x6e\x1f\xeb\xa9\x20\x6b\x90\xe3\x5c\x15\x64\x05\x62\x9c\xac\x82\xbc\x44\x8a\x56\x19\x48\x03\xef\xe5\x80\xac\x92\x88\x8f\xdf\x76\x74\xf6\xa5\x11\xc8\x69\x03\x8e\xd6\xa7\xd8\x49\x47\xb0\xed\xc6\x13\xc4\x4d\xc7\x8d\x7d\xc7\x35\x44\xa6\xc1\xa3\x23\x3b\xb1\xd3\x49\x6d\x64\xdc\xd3\x2e\x40\x72\x9f\x8c\x54\xc5\x49\xe2\xff\x1c\xa8\x21\x64\x23\x94\x68\xdf\x19\x9d\xb7\x64\x7e\x98\xf7\x7a\xfa\x98\x7b\x8b\x03\xc6\x15\x88\xee\xbc\xd6\xb3\x1a\x91\x5d\x72\xe3\x9c\x44\x54\x7d\xcf\x4c\x89\x76\x88\xe0\xd6\xa6\x9b\x0b\x1e\x9a\x8c\x2f\xb9\xe2\x7f\xd8\xa0\x94\xe2\x39\x54\xe2\x11\x8d\xf3\x67\x20\x88\x66\x82\xab\xe8\x4c\x27\x54\x4d\xbb\xf7\x2f\xdb\x85\x7b\xb2\x65\xb8\x91\xaa\x39\x44\xb8\xf8\x7a\x02\xd5\xec\x73\x3e\x3c\xd6\x89\x49\x99\xb6\x4c\x3b\x2a\x12\x7f\x77\x94\x59\x18\x65\xb2\x9e\xac\xbd\x2a\x26\x60\x0e\x2b\x1c\x98\xc4\x67\x16\x48\xa4\x0f\x2b\xc5\x06\x82\x1c\x56\x18\x48\xe6\x53\x2e\x00\x24\xae\x92\xca\x48\x2d\x21\x2a\xa4\x5c\xcf\x3c\x19\xe9\xe3\xdc\xf0\xd6\xa8\x3f\xf1\x18\xf1\x25\xc4\x7f\x6b\xf1\x65\xde\x01\xe4\x95\xa2\x8b\xbf\x15\xc5\x84\xe6\x8e\x31\x80\xb9\x9e\xd5\x02\x69\xe3\x7d\x9d\x5e\xde\x14\x7d\xcf\x1f\x67\x4e\xdc\x73\x5f\x65\x25\xad\xbc\x90\x96\xed\x93\xe7\xb3\x7d\x4e\xa2\xc8\xeb\x64\x9f\x13\x96\x99\x0f\x93\xcc\x95\x26\x99\xc8\xd8\x10\x6d\x6d\xc1\x06\x6d\xc1\xda\x9d\x6e\x52\x7e\x0f\xf3\x77\x6a\xf0\x92\xa6\x0e\x7d\x57\xd7\x02\x9b\xba\x16\xe8\x6b\x6d\xf5\x90\xe1\x1e\xf2\x7f\xff\x40\x06\x9a\x04\xae\x95\x3e\x72\xe5\x4a\xab\x3f\xec\x35\x1f\xf6\x9a\x77\x61\xaf\x69\xe9\xd4\x83\x89\xda\x83\x19\xb0\x52\xde\x3f\xa0\x88\xaf\x40\x9f\x2b\x9a\x63\xd4\x58\x0c\x33\x92\x3a\x20\xaa\x1e\x05\x12\x6f\x95\x66\xc7\x84\xbc\x8a\x26\xfa\x36\x14\xfe\x67\xb2\xd4\xe4\x8f\xde\xda\xe0\x42\xbf\x0c\xdf\xe6\xff\x9b\x2e\x68\x49\x99\x99\x01\x16\x28\xfa\x89\x70\x6c\x8e\x50\x37\x25\x36\xf9\x4d\x39\xcf\x5c\xeb\x0c\x7a\xde\x45\x09\xa5\x8c\xb4\x94\xf0\xb3\x90\x70\xd3\xad\x87\x4a\x12\x84\x79\x9d\x60\x8d\x01\xcc\x8c\x8a\xc9\x33\x2c\x3a\xb3\x54\x14\x2b\x2a\x8a\x5f\xc9\xb8\x74\x2c\x1a\x82\xf7\x9d\x1a\xf1\xa4\x01\x9d\x06\x87\x1a\xbc\x63\x38\x49\x92\x47\xa7\x3d\x88\xbf\xab\xd4\x8f\x89\x49\x39\x88\xeb\xb8\xb6\x1f\x87\x43\x9e\x15\x54\x73\xb9\xee\xd7\x11\x54\x5f\x1a\xf6\x7b\x97\xb8\xae\xb5\x00\xbd\x0f\x6e\x30\xd5\x4a\xf4\x2e\x79\xc1\x54\xaf\xf4\x9b\x73\x82\x17\x4d\x32\xe7\xf8\x40\xd0\x92\x0f\x25\x24\x66\x01\xda\x40\xe1\x75\xe4\x2d\x75\xb9\x9c\x17\x3d\x83\x56\x32\xe2\x9a\xc8\xca\xdb\x4a\xd6\xa5\x6b\xa4\xa3\xb9\xd6\xa5\xf7\x40\x1a\x67\x2d\x50\x98\xf8\x63\x94\x2b\x4c\x40\xb0\x10\xec\x99\xf5\xe4\xf5\x29\x92\x8e\xe0\xcd\x0c\x11\x2a\xf0\x02\xce\x31\x8e\x9e\x37\x24\xbd\x43\xa2\x3d\x9f\x27\xe2\x0a\x22\x1d\x58\xb3\xfe\xe5\xf3\xfe\xcb\xd3\xe7\x55\xaa\x6a\x89\xeb\x59\x49\xf6\x30\x08\x4d\x8a\x8e\xe4\xc9\x5d\x3c\x0a\xad\x1f\x86\x56\xa0\x79\x7c\x2e\x14\x55\xe4\x4b\xb2\x15\x3a\x09\xaf\x30\x45\x45\x01\xfc\x8e\x85\xe1\x95\x32\xf9\x10\xef\x7a\xa5\xad\x7c\x49\x71\xef\x76\x54\xf9\xfe\xc8\x8f\x03\x6c\x2a\xa2\x11\xc0\xe9\xea\xa1\x98\xc3\x50\x7c\x99\x46\x25\x28\x27\x7e\xfe\xa5\xf4\x55\x2b\xaf\x4a\x6c\x56\x65\x05\x67\xb9\x78\x1c\x6c\x73\x04\xe4\x5d\xdc\x53\x99\xc0\x48\xcd\x04\x16\x37\x9a\x5b\x51\x91\x94\xa2\xe9\x5d\x62\xfa\x53\x58\x62\x82\x44\x7b\x0d\x26\x94\x54\x54\xa3\x25\x1e\x38\x07\xaa\x53\x14\xf1\x7f\x7f\xfe\xe7\x7f\x7c\xdd\xfe\xf1\xd7\x95\x48\x22\x96\x63\xd0\xd3\x8b\x74\x3b\xac\x0f\x4a\x2a\x4a\xea\xde\x58\xda\x0a\x8b\xd2\x9c\x62\x76\x0b\x1c\x13\x42\x8e\x1a\x36\xb7\x08\x8f\xcd\xde\xd8\x88\x37\xec\xa2\x89\x7d\x76\x37\xec\xc2\xe5\x2e\xd2\x0d\xbb\xc8\x91\xca\x64\x6e\xd8\x45\x0e\x55\xa6\x5b\x2e\x77\xec\x23\xd4\x4d\x22\xdd\xd3\x00\xa1\x6e\xd2\x05\x16\x03\x8c\xba\x4d\x1f\x38\x40\xa9\xdb\xf4\x41\x03\x9c\xba\x4d\x1f\x66\x80\x54\xb7\xe9\xc3\xf6\xfb\xe8\x59\xfe\x58\x2e\x5c\xb1\x1b\xd7\x43\xde\xbe\x7d\x71\xc5\x2e\x7c\x83\xbd\x80\xe6\x68\x32\x06\x82\x5b\x12\xa3\x72\x69\xc3\x5f\x67\xcf\x79\x90\xbc\x4a\x3b\xda\x53\x89\x89\x77\x20\xdb\xfd\xd6\x56\x37\x7f\xb8\xde\x0d\xd7\xbf\x81\x8f\x0f\x49\x91\x2d\x03\xef\xc0\xfc\xba\x76\x65\xa8\x30\xe4\xdf\x7c\x1d\x0d\xff\xe6\x2d\xbe\x79\xe1\x19\x0d\xc4\xa8\x42\x29\x90\xe2\xf7\x24\xd3\xd8\xe3\x03\x39\x85\xa9\x24\x53\x61\xd8\x51\x7e\x9d\xff\x30\xfc\x87\x61\x2d\x21\x95\xc4\xfd\xec\x18\x35\x1e\x1f\x28\xc9\xe3\xa1\xff\x78\xc8\x8f\x1f\x6f\xf7\x0f\x5f\xff\xf1\x6d\x95\x94\xac\x18\x95\xb1\x1b\x2c\x14\x36\xd2\x08\x8b\x28\xb6\x42\xda\xf6\xaf\x51\xa1\x8a\x8a\x86\xcf\xc9\x9b\x92\xc6\xd4\x76\x65\x92\x0a\x1d\x55\xac\xa8\x77\x41\x61\x3e\x99\xdf\xf4\xae\x74\x12\xcc\x0b\x18\xf3\xb2\x30\xcc\x4a\x64\xbf\x5c\x29\x6a\xac\xb0\xe8\x15\xca\x24\x55\xec\xed\xb0\xf0\xe5\x75\x42\x60\xaf\x54\x6a\x0f\x1a\x2c\xd8\x21\x6b\x2e\xdb\xfe\x35\x81\x1a\x0e\x9f\xe3\x17\x1f\x9f\x11\x8c\xe4\x86\xb7\x5b\xf9\x05\xad\x62\x48\x20\xd0\x2a\x86\x97\x95\x5c\x3e\xa5\x06\x6d\xbf\xed\x56\x93\xfa\xc8\x49\xa2\x4c\x02\x43\xb5\x76\x39\xab\x72\xc4\xce\xc5\xa2\xa9\x8f\xdd\xd4\xa8\x4e\xa4\xf9\xee\x31\x24\xaf\x59\x4a\x2b\xf9\x62\xbd\xe4\xed\xf3\x87\xc4\x7d\x0e\xe4\x80\xc1\xd6\x60\xc0\xb8\xd2\x14\x60\x6a\x30\x5a\x2c\x06\x47\x0f\x37\x9f\x79\x7c\x46\x04\x63\xc5\xf1\xa7\xf4\xe0\xfd\x16\xad\x94\x71\x95\xb6\x35\xac\x20\xea\x00\xd1\x96\x61\xaf\xa9\x34\xe0\xdc\x86\xef\xa3\xca\x6d\x86\x7d\xc8\x35\xb7\x6b\x02\x2b\xd9\x69\x9d\x6a\x4b\xc7\xe3\xbd\x14\x56\x4d\x10\xc3\x89\xf7\x30\x28\x49\x42\x6b\x40\x24\x78\x30\x32\x82\xa0\x72\x5b\xb4\xe9\x47\xe5\xf4\xc1\xa3\x44\x2f\xd2\x9e\x76\x06\x9c\xd9\x1c\x8d\x55\x51\x92\xd9\x24\x08\x27\xb0\xf7\x32\xcc\xe7\x94\xdd\x77\x4d\xae\x57\x9f\x7a\xeb\x6e\x21\x1a\x88\xee\xb0\xea\x5d\xf1\x7c\x3c\xe0\x49\x67\x71\x90\x32\x7d\xed\x57\xd6\x1c\xeb\xb8\x1e\x7e\x8e\x1b\x3c\x8e\xeb\xed\x32\x47\x4a\x3e\x5b\x7b\x48\x94\x09\x29\x67\x4f\x1f\xc0\xfa\x0c\x5e\x28\xc1\x8b\xf7\x81\x38\x27\x9e\x21\x99\xfc\xa9\xc4\x1b\xf1\x64\xe6\xae\xa4\x51\x0a\x17\xcf\xa0\xad\x2d\x3f\xe6\x54\x6e\xdb\x0d\x57\x92\x8d\x9e\x59\xd4\x85\x27\xb2\x66\xb9\xcd\x71\x29\xe7\x5e\x95\xcf\x44\xf0\x2a\x81\x8d\x4c\x0a\x34\x64\x99\x07\x42\x11\x96\x89\x99\x65\x3e\x6b\x92\x44\xda\xa1\x0c\x7b\x41\x1e\xff\x54\x68\x30\x49\x43\xe1\x34\x84\x20\xff\x22\x60\xf8\x55\x32\xdd\x93\x94\xd3\x91\x54\xd3\x98\x20\x3d\x3e\xb3\x70\xa1\xb1\x60\x94\xf2\xd2\xdc\x27\xe1\x2b\x06\x82\x6d\x91\x6e\x23\x15\xa1\x55\x6e\x9b\x6d\xbd\x45\xb9\xc7\x9c\xf7\x28\xa4\x12\x43\xc5\x98\xf6\x04\x86\x24\xc9\x77\x43\xf0\xdf\x72\x72\x5a\x05\x85\x93\x02\x6c\x36\xe5\x64\xd1\x4f\x85\x02\x93\xc4\x3b\x54\x06\xab\x78\x90\x0d\x31\xe9\x4c\x4d\x9f\xf8\xf1\xd0\x8e\xb9\x7d\xd5\x7a\xd5\xfb\xcc\x64\x9e\x30\x37\x84\xf4\xc0\x0f\x86\xee\xaa\x85\x8e\x52\xbc\x72\x1d\xe4\x7f\x68\xe8\xf3\x02\xd4\x98\x74\x4b\x0c\x8f\x0f\xe2\x47\x98\xf0\xd2\x22\x7f\x2b\xb4\xa4\xa3\xd6\x10\x4d\x19\x1e\x9f\x09\x1c\xf2\x78\xfd\xfd\x84\xa5\xac\x3b\x1c\x78\x7c\xc6\x02\x3c\xa9\x24\xd5\xa4\x3b\xfc\x83\x48\xda\x42\xc4\x03\xfa\x75\xbb\x38\x1e\x10\xb6\x67\x2d\xa6\x02\x8a\xc4\xec\x25\x99\xc7\x67\x94\x23\x4b\x1c\x2e\x31\x63\x81\x1c\x9e\xe5\x83\x0b\x88\xe6\xd7\x66\xd1\x25\x17\x2f\xff\xb6\x79\xda\x33\xf8\xc4\xb2\x3a\x05\xe7\x78\xc4\x30\x83\xcc\xd7\x6f\xdf\x57\x12\x94\xc9\x82\xd9\x52\xce\x4a\x2d\x79\x1c\xe5\xa8\xa2\xf9\x3b\x6c\xfa\x77\x8a\x2e\x77\xb7\x18\x20\x0d\xf8\x6d\x3e\xc3\xe4\x26\xa7\xf0\xe6\x9f\xba\x29\xab\x7a\xb8\xd3\x56\x95\x6f\x72\x8c\x77\xfe\x21\x68\xc0\x35\x99\x08\xe0\xa0\xb8\xa6\x83\x0e\xc6\xd2\xe4\x7a\xd2\x18\xb9\x26\x8d\x6e\x89\x85\x30\x40\xc9\x2b\xc6\x4d\x9e\x5b\x52\x16\x92\xab\x78\xb5\x59\x4b\xb1\xe2\xac\x3a\x7a\xa6\xfb\xc6\xe3\xb3\x96\x3d\x30\xf0\xc7\x62\x25\x2e\x88\x0e\x4e\x18\x04\xef\x96\x9a\xec\x08\xb2\xfb\x4c\x80\x9e\x8e\x5a\x40\x9c\x02\x9e\x25\xf6\xbb\xb6\xbf\xdc\xc7\xcc\x0e\x97\x39\x27\x1e\x79\x6e\x38\x20\xc9\xa2\xfe\xd4\x66\xd6\x26\x45\x10\xdb\xff\x7d\x23\x88\xba\xb9\xa6\x09\xe2\xaf\x98\xc0\x29\x56\x49\xa3\x22\xf7\x6b\x7e\xdb\x83\xe4\x00\xcf\xdf\xf9\x5f\x77\x0f\x98\x0e\xdf\x2c\x20\x68\x29\x75\x05\x52\x42\x97\xff\xfd\xc6\x3f\xf8\xa2\x6e\x2e\x7e\x6b\x7e\xb7\x0f\xfd\xda\x7e\x40\x32\xd1\x35\x9f\x9d\x09\xf5\x39\x4e\xc0\xad\x61\x02\x7b\x6b\xd0\x5f\x01\x7f\x66\x01\xbe\xd6\xff\xfc\xdb\xd7\xdf\xae\x73\x07\xfe\xfd\xeb\x97\xdf\xbe\x7f\xe3\xce\xc1\x28\x7f\x87\x94\x9b\x00\xfe\x8e\xb7\x3c\xfe\xb1\xe6\xf2\x1f\x39\x78\x90\x38\x80\xef\x3c\xf0\xce\xc2\x0b\x55\xc8\x1a\xa0\x2a\xc0\x6a\xbe\xa3\x43\xc5\x4f\x9c\x81\xff\xb5\x1e\xb2\xad\x8f\x86\x78\xe0\x56\x86\x4a\x2c\x2a\xdb\x25\x8d\xd2\x54\x26\x70\x9f\x22\x04\x45\x8a\xf1\x31\x28\x91\x61\x2a\x63\x77\x54\x54\xd9\x0b\x79\xdd\xa1\xbd\x90\x8e\x5a\x4a\x43\xdd\x93\x14\xbd\xc6\x27\xcd\x2b\xc4\xc8\x2b\x27\xa6\xf2\x9b\x39\x70\x7c\xe2\xbf\xf3\xff\x5c\xf3\x6f\xe4\x7f\x77\x88\xe0\x9e\x8a\x26\x6b\xbf\xd1\x52\x7e\x0e\x98\x7d\x93\x40\x9f\xaf\x20\x5f\xe5\x0f\xea\x02\xa2\xd4\xba\xd2\x09\x92\x74\xd5\xd0\x0c\x3f\xc1\x44\x19\xf9\xc9\x4f\x42\x26\xfc\x7d\x0a\xb9\x66\x81\x0c\x71\x3e\x4c\xe6\x68\x77\x3f\x29\xc7\x98\xea\x8a\xbc\x94\x5f\xac\xe0\x91\x4c\x52\xca\xc0\x3d\x35\x88\x42\xcd\xff\x4c\xf3\x3f\x57\x22\xed\x99\x6a\x91\x2a\x7e\x6e\x4d\x34\x18\x3b\xa8\x90\xf2\xb9\xab\x02\xc2\xd3\x00\x71\xb1\x19\x1b\xf2\xbe\x4f\x6b\x8e\xc1\x8d\xa0\x21\x85\x7b\x4c\x9f\x6f\x08\xed\x69\x21\x31\x60\xd1\x98\x69\x32\xbd\xc4\x47\x0c\x10\xd3\x91\x51\x68\x9a\xa2\x6c\xfc\x48\xf3\xf5\x33\xe3\x5f\xa8\xa7\xfa\x57\xd6\x53\xc9\x33\xf5\xed\x34\x86\xb3\xd3\x37\xcc\x45\xf2\x65\x01\x82\xd0\xa7\x53\xc4\x74\x29\xb9\xba\xdc\x93\x96\x82\x1b\xba\x21\x6d\xdd\x91\xb6\xef\x91\x36\x13\x7e\x9f\x19\x64\xc2\x37\xc2\xe3\xf2\x67\xfe\xd7\xdd\x03\x19\xd6\x0a\x7c\x89\xa6\x22\xdc\x61\x51\xf1\x5f\x7c\xdd\xca\x3e\x54\x0a\xde\x0a\xf6\x62\x7b\x3d\xe4\xcb\x82\xd3\xe1\xec\x46\x34\xa3\x40\x0d\x8d\x0a\xd4\x04\x96\xb7\xfe\x60\xc2\x3d\x3e\x80\xb8\x04\xf3\x39\xd1\xcb\x94\x19\x9e\x79\xd2\xa4\x0a\x6d\x20\x30\x71\xc8\xbf\x06\x42\x33\x6b\x0f\x49\x76\x01\x66\xe7\x42\x40\xed\xbf\x75\x86\x39\x65\x30\x24\xa0\x9a\xc0\x68\xbb\xd3\x68\x2f\xed\x8d\x46\xa2\x7e\x5f\x6f\x15\x67\xeb\x69\x93\xfc\x73\x6f\xbd\x54\x2f\x24\xe7\x4a\x0a\x65\x13\x56\xcd\x26\x6c\x9a\xfd\x1e\x9b\xfd\x9e\xf7\xbf\xd0\xec\xf7\x22\x34\x35\xfb\xbd\x6f\xf7\x7b\x3b\xd8\xef\x7d\xb3\xdf\x1b\x59\x69\x6a\xd8\xa6\x6d\x7e\xfb\xa6\x30\xe5\x8b\xbb\x3d\x53\x6a\xde\xf4\x65\x84\x93\x59\xec\xcc\xc0\x63\xd9\x6c\xcc\x1e\x33\xea\x31\x61\xb2\x70\xd3\xf0\xf9\xd0\x0c\xcc\x69\xd4\xac\xbf\x65\x1a\x65\x3c\xcb\x47\x38\x02\x0f\x6e\x9f\x8a\x86\x0f\x5b\xcd\x58\xca\x53\x32\x90\x5e\xe2\xc8\xf8\x89\x3c\x58\xe6\xc0\x5e\x90\x13\xf9\xd1\x3c\xa0\xf5\x51\x7a\x2d\x8c\x9e\xe0\x22\x3b\x0f\x9f\x17\xf4\x35\xc1\x12\xea\x20\x9d\xb3\x73\xfc\xfa\xfd\xeb\x1f\xdb\xbf\xad\x53\xa6\xd1\x28\x0f\x3e\xed\x8a\x27\x0d\x18\xb5\x01\x8b\x3a\x65\x3f\x72\x63\x34\x3a\xf9\xf7\x57\x29\xfd\x9b\x14\x3f\x1b\x62\x45\x09\x4c\x78\x2a\x94\x01\x9b\x54\x02\x6b\x54\x36\x9b\x4b\x49\x75\xf3\x0d\x9d\x16\x5f\x48\x7e\xd7\x9a\x8a\x5f\xf9\xd6\x1c\x89\xfd\x2a\xdd\x05\xd5\xf4\xfa\xf8\xac\xc5\x78\xed\x9f\x34\x18\x03\xd1\x6b\x07\x85\x18\xb9\x9c\xe6\x5d\x1e\xac\xdb\x18\x31\xf7\x9b\x83\xd1\x5f\x49\x91\x40\x63\xf7\x04\x45\xdc\x58\x03\x86\x54\x6e\x3b\x53\x0c\x46\x08\x4f\x56\x15\xcc\x0f\x8c\x94\x16\x43\xa3\x69\xef\x00\xc3\xcc\x9e\x88\x20\x51\x45\x6e\x7b\xa2\x1f\x14\xd7\xf2\xd3\xfd\x70\x37\xae\xe9\x26\x0e\xba\xf9\xd5\x81\x61\x7c\x26\x25\x15\x11\x4d\xa8\x3c\x44\xfa\xc4\x57\xbd\xc2\x42\x59\xa9\xc5\x17\xe5\xdf\xa7\x00\x41\xd8\x92\xd8\xfe\x50\x8a\xa1\xf2\x57\x4c\xd0\xe0\x08\x62\xd0\x0e\x48\xaa\x94\xa6\xfc\x79\x93\x78\x16\x5e\x49\xd3\xce\x21\x40\xf0\x55\x82\x28\x93\x70\x46\xe5\xb6\x3f\x89\x13\xc0\x9a\x7f\x9a\x33\xc7\x9e\x91\xc0\xa1\x4a\x50\x24\x9e\x69\x02\xc4\x65\xc3\xde\x81\x97\x22\x50\x5e\x99\xae\x1e\x6f\x97\x9f\x7f\xcd\x09\x1c\xc5\xa2\x44\x88\x46\xd4\xe1\x8d\x89\x60\x82\xca\xed\xe1\xdc\x59\x90\xfc\x65\xcc\x95\x59\x19\x73\x73\xcc\x1d\xf5\xf3\x0a\x98\x9b\x8b\xbf\x11\x44\x89\xc6\xb0\x20\x29\x4c\xea\xa6\xb6\x33\xef\x08\xd1\x37\x0c\x27\x48\x11\x2c\x07\xe4\x9a\x1f\x2e\xa8\x42\xa3\x53\x3c\xb2\x86\xa7\xcc\x63\x39\x7b\x7d\x2a\xc0\xe3\x8a\xe5\x7f\xe7\xb9\x41\x5f\x9a\xd9\x64\xab\xc1\x24\xa2\x53\xce\x42\xa4\xa6\xcd\x77\x3c\x90\xe6\xc5\x0f\x20\x41\x0e\xed\x61\x4c\x36\x7a\xc7\x28\x02\x00\xa0\xd3\x06\x08\xc8\x32\x66\x05\x20\x7b\x86\xe6\x6f\x79\x8e\x9c\x8f\xe1\xcd\x1e\x22\x5d\xb7\xe5\xfc\xcc\x84\x1b\xa4\x84\x2d\xc9\x67\x2c\x78\x0b\xb4\x0d\x60\x59\xc7\xb3\xed\xf9\x3a\x78\xd6\x8d\x92\x15\x42\x8e\x2d\x21\xb7\x04\x6c\x70\x2d\x4a\xae\x90\x77\xb9\xcd\xe8\xd8\x5f\xb5\xeb\xf8\x83\x9f\x4e\x07\x48\x52\xd3\x93\xe2\x53\xcc\x25\xca\xd1\x82\x67\x7d\x22\x58\x46\xb8\x22\xb1\x0c\x6e\xab\x08\x2e\x3d\xe9\x1c\xa4\x41\x3a\x28\xbe\xa8\xe5\xbe\xfc\xdc\x98\x04\x56\x49\x93\xc1\xe3\x41\x64\xf1\x2a\x6d\x87\x77\x0a\x51\xdf\x45\x90\x60\xc1\x5d\x8c\x54\x46\x19\x02\x47\x2a\x42\x48\x8d\x58\x86\xbb\xe2\x93\x61\x31\xdc\xb0\x38\x2e\x25\x71\x49\xb8\x91\xc4\x8b\xc4\x2c\x0c\x62\x16\x06\x91\xd7\x93\xd2\xe4\xf5\x24\x0b\x45\xe2\xaf\xbb\x20\x06\xc6\x28\x25\x78\xa3\xca\xb0\xa0\x78\x7a\x2e\xe4\xc1\xd1\x5e\xd3\xe6\x68\x3e\xf9\x35\xcf\xb3\x21\x39\x79\xe6\xef\x4a\x04\xb2\x11\x65\xa1\x48\x15\x7a\x30\x76\x3e\xf8\x22\x84\x70\xbe\x4b\x59\xb5\xb9\xa7\xdb\xd3\x23\x75\xf3\xb4\x0a\x38\x07\x90\x76\x74\x17\x16\xf8\x89\x95\x4e\x11\x1d\x99\x54\x29\x9f\x2a\xa3\xce\xf6\x86\xe3\x2c\x26\x46\x52\xe4\x43\x70\x3b\x0d\x21\x2c\x42\xa9\x1d\x44\xda\x8c\x82\x4e\xb3\x34\x16\x5c\x6d\x01\x83\x0e\x40\x24\x2c\xc3\x35\x2c\xc3\x47\xcd\xfb\x3e\x4b\xb1\xcd\x8f\x33\x2c\xe3\x07\x40\xb1\xa6\x4b\x8c\xe2\xc9\xe1\xf3\xf2\xa9\xde\x52\xae\x86\x2e\xf4\xb2\x38\x22\xe6\x10\xe2\x4d\x02\xb7\x63\x51\x42\xce\x45\xc4\x55\x81\x17\xe0\xd4\x6d\xe6\xed\x9d\x34\x72\x4e\x14\xb9\x91\x6f\xc7\x54\xae\xb8\xd7\x08\xfe\xa8\xe0\x61\x00\x13\x35\x44\x65\x23\x98\xdc\xb4\xd7\x03\x82\x4b\x8b\xf0\x5a\xe5\xff\x1a\x51\x47\x83\xb1\x47\x71\x9b\xe0\x92\x0e\xe0\xc5\xd4\x11\x43\xbb\x1f\x9a\x56\xb2\x8d\x97\xf7\xc3\x1f\x00\xb9\x5f\x93\x7f\xde\xc6\x69\x84\x45\xa3\x73\xf6\x94\x4f\xf5\x3f\xbe\x7d\x3f\xae\x06\x2d\xa8\xdc\xe4\x53\x32\x5e\xc5\x92\x02\xb8\x3d\x95\x06\x2b\x53\x74\x7f\x98\x2a\x81\x0f\x1b\x49\x78\x81\x6d\x2d\xe2\x42\x35\xef\x3c\xfe\x32\xc3\x22\x73\xda\x55\x99\x47\xe0\x14\x16\x65\x04\x57\xc5\x92\x45\xb2\xe3\xde\x14\x0f\xa2\x32\x24\x0f\x99\xa2\x74\x33\x3a\x96\xe4\x24\x9f\xeb\xfa\xcb\xef\xdf\x3e\x37\xa6\x2f\x28\xb0\xb1\x7e\x39\x48\xe9\x97\xbb\x3f\xf8\xaa\xd8\xc1\xfe\xc9\x3f\x42\x9a\xfe\xf5\x73\x15\xe5\x9b\x62\xe2\x52\xcf\x8a\x89\x8d\xf5\x22\x2f\xd5\xfb\x3b\x4e\x54\x28\x07\x3e\xf2\xac\xc8\x57\xee\xd4\x23\xcd\x07\x9a\x00\x4c\x31\x6f\x4a\x81\xab\x19\x4e\x1e\xa7\x23\x27\xfa\x6e\x38\x09\x7a\xa7\x88\x69\x78\x88\x38\x23\x54\xeb\x15\x56\x77\xaa\x15\x66\xad\xf5\x9e\x6a\x34\x39\x3f\xf5\xc6\x5a\x53\x8b\xbf\x9c\x8f\x25\x03\x5d\x4e\x2c\x59\x73\x3a\x57\xe0\x7b\xc9\xec\xcd\x94\xd1\x1c\xb0\x68\xc7\x6c\xb9\xad\x89\x35\x05\x3d\xb3\x9f\xc3\x39\xd4\x9b\xea\xef\x71\x3c\xb4\xc6\x7f\xa5\x75\x41\x31\x78\xc7\x3d\xdd\x19\xbc\x33\xc5\x1d\xf3\xa0\xc3\xbf\x74\x67\x4c\xd3\xb6\xcf\xf0\xbf\x0b\x46\xe4\x26\x01\xeb\xf5\x2d\x1f\xab\xb9\x8a\xbc\x0a\x2d\x4e\xb1\xbb\xac\x47\x89\x53\xac\x20\x37\xe0\x75\xd3\xfc\x22\x2e\x92\x1c\x16\x60\x53\xd5\xb1\x6f\xca\x85\xac\x4f\xd4\x93\x9c\x44\x87\x4d\x09\x6a\x67\x54\x68\x6d\x57\xa8\xda\x5e\x16\xac\x95\x9d\x30\x89\xd6\x20\x31\x94\x0b\x5e\x32\x5e\x5c\xe1\x59\x71\x36\x03\xc8\x09\x63\xc5\x4a\xee\x0f\x97\x66\x7f\x10\x8f\x78\x15\x66\x8a\x44\x67\xad\x24\x17\x7a\x1c\x10\xe1\x45\x4a\x9d\xd8\xdb\xb9\xb0\xc6\x75\xa5\x94\xec\xed\x1b\xd2\x86\x09\x59\x49\xd3\x38\x08\x27\x88\x28\xce\x2c\x72\x0c\x1a\x07\xde\xc1\x21\x3d\x3e\x30\x17\x2d\xf2\xd9\x67\x2a\xe9\x08\x79\xce\x26\x0e\xb9\x1d\x0c\xa7\xd9\x33\xce\x72\x1c\x46\x96\xec\x57\x2b\x5b\x54\xc3\x71\x1c\xf4\x42\x4d\xd1\x1f\x31\x9d\x19\x4e\x09\x17\x65\x0e\xe6\x77\x7e\x3b\x2a\x3f\xa6\x25\xc5\x8b\x80\x78\xe7\xc1\xf9\x9a\x20\x26\xed\x66\x6c\xff\x67\x0a\x35\xe7\xee\xae\x58\xfe\x99\x50\x98\x26\xeb\xbc\xf5\xf6\xbd\x30\x65\xfc\x2d\x31\xfa\x65\x1b\xc5\x05\x78\x12\x38\xe5\x57\xd8\xb9\x86\xef\xe7\xcf\xde\x9a\x75\x4c\xf1\x8a\xb8\x00\xf8\x42\x30\xfc\xc8\x1a\x43\xe0\x34\x58\xdb\xec\x09\xdd\x76\x38\xa8\xfa\xd6\xbc\x3b\x73\x54\x17\x24\x8b\xc9\x3b\xe1\xa2\xf4\xeb\xfd\xee\x06\x36\x84\xcd\xef\xbf\xd7\x5f\x9e\xb6\xdf\xbf\x7c\xfd\xed\x38\x57\xd1\x48\x88\x8f\x77\xf1\xce\xca\xff\xb0\x38\xfc\x67\x9b\xab\xf1\x3a\x93\xc1\xa8\x2f\x4c\x77\xf1\x0e\x5d\x6e\xb0\xb8\x23\x6c\x5a\x7b\x87\x29\x37\x33\x3a\x3c\xb5\x4d\x8e\x35\x14\x9e\x89\x29\xee\xe2\x1d\xf9\xdc\x60\xc1\x5a\x49\x6e\xe5\xd6\x19\x95\x64\xaa\xf5\xe0\x08\x9a\xed\x44\xec\x61\x76\x0c\x52\xd7\xcd\x7c\x86\xb9\xe2\x84\x41\xe0\x04\x48\xf9\x3f\xd7\xb4\x84\x87\xff\xba\x8b\xf2\xcc\x75\xd6\x81\x63\xb8\x62\x12\x70\x4a\x4b\xc8\xe0\xcc\x2d\x8a\x12\xd8\xb4\x33\x7a\x3d\xf6\x81\x3e\x01\xdc\x76\x3d\xed\x61\x11\x19\xc4\xbe\x5d\x60\x21\xb2\xc9\x99\x5e\xa6\x00\xf7\x30\x17\x77\x98\x23\xc3\xd7\x1f\x20\x30\xa7\xd7\x38\x09\xb8\x46\x26\xd5\xb4\x74\xf8\xef\x70\xb1\x98\xd5\x6b\x9a\x02\xdc\x05\x7c\x60\xaa\x5e\x79\x33\xbe\xb0\x50\xd5\x5c\x8f\x6c\x97\xaa\x9c\xeb\x92\xf1\x52\x9d\x71\x5d\xb2\x5e\xa8\x2e\xae\x47\xe6\x93\x14\xc9\x9b\x93\xfd\xa5\x51\x84\x59\x8b\x71\x0d\x1b\xb8\x34\x8a\xf8\x3a\xba\x7b\x9a\xa8\xbb\xaf\xc3\x89\xa6\x5a\x9b\x6f\xc8\x0a\x96\x1a\xa0\xd7\x66\x06\x4b\x4d\xcf\x27\xd8\x41\x43\xf0\x97\x99\xc2\x8d\xed\xcc\xd7\x30\x84\xa5\x86\xe5\xb5\x59\xc2\x24\xb3\xf0\x2b\x30\x85\x0b\xe3\x08\x13\xed\x15\xb1\x44\xb7\xa7\x9d\xbd\x6f\x4e\x40\x14\xa1\xf2\xe0\x2a\x5b\xe2\xa2\xd3\x90\xf8\x43\x58\x08\xa6\xcc\x24\x4d\xb4\x12\xb4\x76\x27\x2b\x46\xa7\x83\xc5\xc9\x1f\xec\x4d\x27\x8d\x4d\x93\x0c\x93\xc3\x8f\x33\x71\x2e\xfe\xfa\xb9\x54\x6e\xdd\xd7\x7b\x65\x23\xe6\x7f\xfd\x84\x3a\xd5\x1d\x01\xb8\xab\x21\x73\xe9\x30\xd5\x5d\x0f\x9a\x73\x75\x3a\x0e\x9f\xbf\x0a\x36\x27\xb4\xa1\x51\xc5\x8e\x6b\x60\x73\x42\xf5\x19\x7d\xfd\x2a\xd8\x9c\xd0\x71\xce\x97\x1b\x99\xff\xf9\x13\xca\xcc\x52\x82\xba\xd2\x6e\x3c\x9b\xc4\x16\x5a\x8b\x17\x13\xdd\x42\xbb\xec\x72\x42\x99\x56\x2a\x62\x45\xd2\x99\x54\xe4\x61\x4d\x74\xbf\xd0\xe1\xa5\x8d\x7c\x39\x01\x5c\xe8\x70\xda\x8e\xed\x14\x16\x27\x77\xeb\x73\x86\xce\xb3\xfd\xfd\x18\x3b\xf5\x4b\xb3\xb8\xf5\x2e\xbd\xc8\x74\x7f\x05\x4b\x59\x60\x2d\xbf\x82\xa1\x2c\xb0\x82\x2f\xde\xd5\xa7\x14\xbf\x58\x95\x79\xbd\x58\xa0\x62\x5d\xd6\x75\xae\xbb\x0b\xb6\x8a\x6b\x18\xd7\xb9\xee\x2e\x18\x25\xae\x61\x5b\xe7\xba\x5b\xc3\xfa\xf0\x42\x17\x2f\x5b\x1e\x86\x45\x4a\xff\xf1\xa5\xfe\xeb\x97\xdf\xfe\x76\xd6\xe9\x12\x13\xc4\xa8\x4c\xe9\x01\x69\x23\xc5\x20\xa5\xc9\x9c\xc8\x2a\x07\x48\x95\x31\x25\x51\xe5\x4e\x3d\xd1\xbc\xfe\xf8\x40\x85\x32\x58\x62\xa8\x28\x96\x69\x6f\x4a\x9f\x9f\x07\xec\x1e\x66\xe6\x8c\xa4\x5c\x29\xef\x6c\x07\x77\xf2\x1f\x57\xba\xf8\x9c\x59\xe0\x28\xeb\x1b\x4f\x27\x74\xbe\x89\x97\x0f\xad\xda\xe3\x14\xf6\xe3\x57\xed\x71\x02\x0b\x8a\x17\xb3\xc8\xaf\x69\x43\x1d\x41\x75\xb5\x2e\x27\x70\xa2\x06\xac\xab\x75\x39\x81\x1b\x35\x70\x5d\x6b\x25\x2f\x30\xa4\x31\x5c\xd7\xea\x32\x4d\x87\xeb\x5a\x5d\x62\x31\x15\xb0\xb4\xd6\x52\xe2\x04\xc6\xd3\x40\x76\xbd\x3e\xa7\xf0\x1e\xbf\x72\x9f\x13\xb8\xcf\x0b\x55\x2b\xe6\xf7\x39\x81\xff\xbc\x50\xc6\x62\x7e\x9f\x13\x38\x50\x3b\xcf\xd5\xd0\x76\x8a\x30\x14\x56\xee\x73\x8a\x44\x64\x56\xc6\xa1\x09\x5c\xa8\xad\xee\xb0\x5a\x9f\x17\xd8\xd0\x09\x7f\x52\x2c\xc9\xdc\xc8\x9b\x94\x2e\x30\xa7\x35\x8f\xa4\x08\xa7\x9d\x49\x5d\x23\x16\x2d\x3c\x88\xba\x4a\x30\x5a\x78\xf2\x74\x95\x68\xb4\xf0\x94\xe9\x2a\xe1\x68\xe1\x89\xd2\x75\xe2\xd1\xc2\x33\xa4\xeb\x04\xa4\x85\x07\x46\x57\x89\x48\x0b\x0f\x87\xae\x13\x92\x16\x9e\x0c\x5d\x27\x26\x4d\x3a\xc4\x59\x59\x4e\xba\xc4\x17\x8a\xe9\xe0\x5d\xb1\xd7\x49\xec\x68\x91\xac\x74\xa9\xd7\x29\x0c\x69\x99\x14\x71\xa9\xd7\x29\x2c\x69\x99\x1c\x71\xa9\xd7\x29\x4c\x69\x99\x24\x71\xa9\xd7\x49\x96\xef\x45\xb2\xc4\xa5\x5e\x2f\x9e\x63\x77\xd6\xe1\x15\x2c\x20\x55\x04\xb2\x35\x49\x82\xb0\x73\xb6\x96\x09\xa6\x1a\x74\x60\xe2\x91\xdf\x3d\x69\xa9\x15\xb0\x60\xfe\x17\xad\xf1\x17\x42\xe7\xf0\x8e\x4c\xdb\xf6\xfe\xbb\x32\x6c\x0e\x7f\x0c\x63\xfd\xa4\xa9\x4c\xb5\xd8\xf7\x65\xd6\xc8\x4b\x6c\x8c\x48\xab\x83\x62\x5d\xa8\xe2\xe3\x03\x79\x45\xae\x24\x5b\x91\xc9\x45\xaf\xe4\x0f\x8c\xfd\x3f\xe4\x8e\x55\x58\x94\x14\xfb\xcf\xc5\xfe\x73\xb1\xa9\x94\x75\x75\x18\x11\x86\x49\x78\x9b\x2a\x53\xec\xfc\xde\xec\xdc\x19\x53\x63\x68\x4c\x8d\x89\x27\x18\x2a\x32\xbd\x72\x62\xb1\xf7\xbb\x77\x5d\x2e\x5b\x85\xae\x44\xec\x4d\x14\xb1\x37\x51\xfe\xa3\x7f\x27\x36\xc0\x71\x25\xba\xfe\x3b\xae\xff\x8e\xeb\xbf\xe3\xe4\x9d\xeb\x23\xa0\xe6\x03\x0a\x2d\x78\x7b\x94\x65\x04\xb5\x85\xe0\x6b\xd4\x08\xfe\x27\x02\xe6\xc2\x23\xed\x7e\xe8\x08\xe5\x74\x72\xb5\xe6\x5f\x45\x4b\x44\x0e\xec\x65\xba\xb1\xca\x9d\xa6\x94\x5b\xc4\x4d\xbd\x39\xe3\x5a\x98\x26\xf6\x83\x01\xac\x1e\xec\xd4\x44\xed\x54\xd8\xb0\x63\x20\xda\x0c\xb2\xbf\x31\x22\x84\x38\xd8\x11\x2e\x86\xff\xac\xb1\x3b\xac\x76\x54\xbb\xd6\x91\xd8\xe9\x8c\x62\x2f\x6d\xa1\x66\x4f\xbb\x38\xb0\xfc\x1c\xed\xa5\xd7\x45\x08\xfd\x40\x27\x6c\x13\x63\x90\x96\x9b\x8e\x26\xc6\x1c\x5d\x61\x28\x9a\x18\x64\x74\x85\x59\x68\x62\x40\xd1\x15\x46\xa0\x89\xc1\x43\xd7\x98\x7c\x26\x86\x0b\x5d\x63\xe0\x99\x18\x1b\x74\x85\x39\x67\x62\x1c\xd0\x35\xc6\x9b\xd3\xa6\x8c\x75\x6d\x35\xa7\x0d\x17\xab\x9a\x66\x4e\x5b\x29\xd6\x35\xc4\x9c\xb6\x49\xac\x6b\x76\x39\x6d\x81\x58\xf7\x48\xea\xb4\xbd\x61\xdd\x23\xa8\xd3\xd6\x85\x75\x8d\x45\xa7\x35\xf8\x75\x4d\x43\xa7\xd5\xf2\x75\x0d\x41\xa7\xf5\xe5\x75\xcd\x3e\xa7\x0f\x6c\xce\xbb\xd3\x7c\xfa\xd7\x7f\x3f\xeb\x49\x43\x46\x32\xc2\x1a\x28\x02\xd3\xf1\x1e\xc1\x95\x64\x20\x9a\x2d\x04\x07\xa1\x8d\x8c\x97\x04\xae\xc1\x55\x88\x60\xcc\x4e\xe3\x71\x50\xf6\x42\x39\xc3\x48\x61\x8d\x08\xe8\xb6\x10\xa1\x2d\xa6\x57\x48\xe9\x19\x53\xec\xb5\x03\xbb\x23\xa0\x53\x37\xab\x08\x62\x6e\x62\xb9\xa3\x55\x0f\x02\x24\xe5\x4b\xf2\x60\x5c\x65\x20\xf6\x5e\xe3\x97\x54\x51\xf9\x9d\x96\x42\x55\xb3\xef\x95\xc7\xbd\x79\x15\x01\xab\x04\xce\x95\xc3\x77\x24\x53\xa2\x2f\xfd\xde\x81\x9d\x7f\xab\xe2\x59\x8c\xba\x8a\xc0\xe2\xf0\x8e\xc0\xbb\xfd\x08\x1c\x79\x7c\xa6\xd8\x39\xb0\x4b\xee\x95\x27\xba\x33\x19\x94\x15\x39\x40\x77\x0e\xfe\xb2\x38\x8f\x0f\x94\xab\x14\x6e\x01\xa1\x2d\xbf\xcd\x3f\x19\x5e\xc3\x6b\x1a\x50\x96\xec\x70\x51\xa6\x25\xb9\x61\xfa\xaf\x2b\xfe\x79\x9d\xcc\x77\x10\x63\x49\xf2\x2a\x5b\x70\x61\x1a\x5a\x57\x1d\x29\xac\xeb\xd7\x35\x44\x78\x32\x82\x34\x2f\xe0\x77\x9b\x37\xa1\x9f\xf3\x41\x93\x06\x56\x70\xae\x84\x38\x2b\x60\x47\x9f\x6e\xd2\x51\xa4\x65\xc4\xf3\x41\x20\x83\x05\x5c\x72\xe8\xfe\x3a\x67\xee\xb3\x35\xcf\x19\x18\x2b\x99\x6e\xae\x45\xcf\x1d\x52\x97\x5d\xef\x03\x19\x6f\x8a\x8c\x4b\x83\x74\xe7\xf2\x57\x46\x1a\x66\xaf\xfb\x00\xfe\x32\x77\x9d\x58\x69\xe3\x1d\x5b\x22\xe7\x39\x64\x4c\x3d\x41\x99\x4b\x84\x6e\x1f\xc1\xf2\xcc\x91\x87\x8d\x6d\xea\x1f\xb2\x8a\x9c\x54\x49\x32\x25\x99\x66\x61\x24\xab\xf7\xf0\xdc\xad\x4d\xa7\x79\x4f\x08\xc4\x32\xd5\x07\x25\xde\x84\x12\xd7\x39\x23\x78\x6b\x94\x5f\xdd\xf8\xbe\x40\x4a\x1a\x24\xdd\x76\x1a\xa5\x52\x86\x81\xf8\x32\x0d\xe0\x0e\xc1\xd2\x66\xf4\x8d\x26\xbb\xd6\x07\xe2\xdf\x14\xf1\x17\x1c\x34\xac\x65\x81\x3f\x9d\x18\xfc\x43\x55\xfd\xd9\x30\xaf\xa7\xaa\x3a\x35\x95\x23\x2c\x73\x21\x18\x98\x5d\x1e\x3e\x3f\x7f\xfd\xe3\x9f\x63\xcb\xcb\xc8\x82\x7c\xa8\x53\x6f\x0f\x76\x9f\xeb\xb2\xbc\x8d\xad\xbb\xd7\x76\x71\xc1\xf2\x4a\x76\x9d\x2e\x2e\xe5\x22\x45\xa7\x28\x94\xb6\xc2\x50\x52\x45\x61\x7b\x38\xee\x22\x45\x25\x7a\xf0\xc8\x8b\xef\x64\xf1\x7d\x45\xa7\x02\x69\xe7\x1d\xb7\xf4\x28\x5e\x85\xd2\x6e\xfa\x3d\xa6\xbd\x2d\x6d\x95\x4a\x43\x7b\xbb\xa3\x2a\xf5\x4f\xdf\x48\x1d\xe5\x8e\x9c\x77\x0a\xd3\xef\x98\x42\x89\x69\x4f\xa5\xa1\xfe\x8c\x35\x31\x1c\xcc\x9c\x23\xb1\x0b\x86\xda\x05\x38\xb8\x82\xca\xb0\xde\x7a\x5e\x9f\x62\xde\x90\xc2\x50\x5d\x80\xf5\xcd\xd2\xc9\xb7\x99\x5f\x8f\x6b\x14\x46\x29\x15\xc3\xa0\xd8\xc7\x9d\xcd\xde\x32\x9b\x91\xb7\xcc\x21\x71\xec\x8d\x3c\xb3\x5b\xca\xee\x27\xe0\xed\x61\x87\x3d\x9f\xf2\xfb\xda\xd4\xf1\x56\x25\x96\xb9\x9c\x6f\x6d\x00\x27\x08\xf0\xba\x6c\xef\xef\x59\x92\x9e\xe7\xfb\x3d\x2d\x60\x7e\x11\x99\x5f\x15\xbd\xba\x64\xeb\x59\x9a\x3a\xf0\x26\x7c\xe5\xba\xbc\xf5\xcb\xb9\xca\x75\xa9\xe6\x19\xc9\x1a\x77\x9b\x91\x2a\xe3\xc0\x21\xf3\x14\xb2\xcc\x53\xd6\x4d\x2f\x3f\xa0\x5c\x32\x80\x66\x3b\x8a\x44\xd2\x52\x40\x6c\x16\x21\x2f\x0a\x81\x5d\xd3\x4a\x1a\xe6\x6a\x07\x56\xa1\xa9\xd2\x61\xa9\x35\x9d\x9e\xf2\xde\xbe\x80\x9f\x25\xa6\x8a\xd2\x99\x8d\xbf\x42\xf3\xf8\x80\xa4\xa8\x28\x63\x85\xb4\xb3\x8f\xcf\x51\x15\x25\xfa\xde\x1f\x64\xf3\x1f\xd7\x3b\xc1\x66\x44\x46\x07\x45\x10\xb3\x6e\xfe\x76\xfe\xb3\xcd\x67\x3e\xb0\x1a\x91\x54\xe4\x32\xc8\x8f\xe6\x31\x51\x53\x87\xf7\xd8\xb8\xe4\xdc\x3d\x15\xe0\xce\xc8\x58\x57\x80\x69\x04\xa0\x9b\x59\x5c\x20\xae\x56\x4a\x0d\x8e\xf7\x91\xa6\x8b\xe5\xde\x9a\x93\x4d\x2d\xb2\xc6\xcc\x37\xb6\x01\x8c\x51\xa1\x2d\x2a\x8a\xda\xaa\xa2\x5d\x74\xda\x21\x38\x64\xca\x8e\x4a\x9a\xe6\x38\x0a\x92\xd5\xee\xb6\x0b\x38\xc0\xf0\x1f\xd0\x8c\x30\xd0\x0a\xff\x65\xfb\x7d\xfb\x52\x4d\x31\xf2\xe0\x94\x85\x22\x7e\x22\x82\x10\xe4\x27\xd3\x8c\x03\xcb\xff\x04\x48\xa2\xcb\x6f\x31\x42\xc8\xe5\xd4\x3a\xcf\x4a\x05\x54\xf1\xfd\xa7\x42\x83\x77\x8a\xa0\x48\x1a\x21\x5a\xe5\xc0\xc9\x8f\x5f\x59\x4d\x01\x0a\xa2\xae\xf0\x87\x30\x02\xd9\xa7\x42\x81\xb3\x1a\x73\x2d\x71\x6b\xb5\x01\x49\x24\x6f\xf6\xf4\xc4\x1c\x5d\x83\x21\xe5\x20\x89\x89\x81\xff\x35\x10\x9c\x74\xf4\xc9\x58\x19\x97\x29\x58\x2a\x92\x91\x76\xc3\x5f\xc9\x47\xc0\x4a\x49\x38\xfb\xc2\xbc\xd0\xe5\x79\xc9\xbf\x02\xa0\x70\x0a\x40\xfa\x00\x20\x02\x47\x3c\x91\xa0\x0d\x44\xab\x03\x38\xf9\xf1\x2b\xc9\x84\xfa\xe0\xf9\xc4\xe8\x08\x56\x59\x5e\x0d\x42\x16\xc3\x03\x24\x45\x54\x51\xf1\xc9\x09\xd0\x12\x73\x37\x19\x69\x68\xfe\x9d\x55\x6b\xec\xe2\x21\x76\x54\x58\x40\x74\x4f\xda\x42\x32\xaa\xd0\x31\xd7\x2d\x88\x31\xff\xb2\x60\xe4\xc8\xcd\xf1\x32\x12\x38\x65\x98\x29\xf1\x55\xd5\xdd\xff\xc6\xbf\xa4\x22\xaf\x5c\xd3\xf2\x0e\x3a\x20\xf3\x89\xbc\x7c\x8e\x20\x48\x59\xbf\x64\x72\x6f\xaa\xed\xf6\xf1\x59\x1e\x08\xe0\xc3\x93\x96\x1b\xda\x80\x25\x45\x5a\xae\xd3\x06\x2d\xd8\xa4\x72\xdb\xf0\x77\xab\xa8\xd8\x33\x36\x6d\xd1\x33\x3b\xc9\x6d\xa6\x71\xab\xc0\x06\xe9\xcf\x37\x6d\x63\xa3\xca\x23\x74\x7e\x6f\x00\xe9\x64\x57\xdb\xa3\xae\xb4\xd5\xe0\xcc\xf2\xae\x28\x57\x58\x84\xe4\x34\x65\xc4\x32\xb1\xe9\x8c\xa1\xa6\x9b\x27\xad\xc9\xbf\xa8\x03\x1b\x23\x62\xe2\xa7\x9a\xab\xaa\xbb\xff\x2d\xc3\x13\xac\x54\xcc\xcd\x1f\x9a\x81\x09\x97\x6c\x21\x3f\x1b\x25\x5c\x6f\x4d\x20\x2b\xc0\x8e\xe0\x4e\x63\xcc\x07\x72\x0e\x91\xb3\x16\x04\xd8\x8e\xea\xd0\x68\x28\xa2\xa6\x5a\x8b\x15\xe2\x16\x6c\xc6\xee\xf4\xf9\x44\x49\xd7\x1a\x71\x88\x47\x21\x95\xe4\x83\x03\x6f\xb4\x91\x3a\x2a\xda\x28\x5e\x2a\xde\x28\x6b\x20\xa7\x8a\x9b\x99\x72\x44\xc0\x93\x10\x9d\xd2\xd0\x9e\x20\x2e\xdc\x4e\x25\x00\x72\xf5\x22\x81\x3f\x94\x69\xc3\xcd\x95\x5e\x7f\x3e\x8e\x78\x9d\x7b\xd9\x87\xac\xf0\x43\xb1\xe3\x19\xb2\xc2\xb5\xf6\x31\x42\xd5\x12\x89\x91\x8a\xee\x52\x12\x4a\xb8\x14\x46\x55\x68\x20\xcb\xad\x95\xdf\xc1\x6c\x83\xa8\xe6\xdc\x14\x8d\x57\xa6\x30\x34\xfc\xc4\x4a\xbb\x53\x0e\x30\xb1\x32\xe2\xc1\x4c\xd0\x49\x6e\x68\x68\x63\xc5\x75\xef\x16\x71\xdc\xbd\x76\x90\x8e\xd3\xe6\x34\x1f\x5d\xd7\x48\xb7\xa6\x6d\xca\xcd\xb4\x4d\x4d\xd3\x27\x6d\x7c\x72\x60\x80\xbc\x4a\x8c\xaa\x8a\xef\x07\xbf\xf7\x10\x6a\x28\x1c\x14\x7e\x45\x4d\x70\x51\x40\xb6\xe2\x31\xae\xc8\xa0\xef\x23\xff\x99\xcc\x5e\x7b\x08\x9f\x22\x53\x3d\xc3\x05\x81\x7b\x0a\x56\x35\x3d\xae\x11\x23\x7d\x2b\xae\x4c\x2c\x32\x6c\xd0\x80\x13\xd3\xaf\xeb\x57\x78\x8b\xcc\xe4\x42\x50\xb9\xcd\x1c\xd0\x6b\x31\xbe\x50\x60\xee\xe8\x94\x34\xad\x87\x00\x02\x86\x27\x0b\x84\xaa\x60\x06\xce\x7d\x91\xe1\xbe\x8c\x36\x40\xa6\x62\x20\x86\x4f\x64\x21\x2a\x22\x86\x5c\x20\xc5\xd2\x42\x54\x64\xce\x75\xc5\xa8\x30\xad\x2b\xc4\xb6\x2b\xc4\xa9\x9b\xcd\xb4\x85\xb9\x78\xb8\xfc\xae\x90\xea\x5a\xab\xe4\x85\xe2\x95\x49\x13\x84\x5b\x09\xf8\x3f\x2f\x16\xbe\x58\xb7\xf3\x26\xb1\xf4\x2f\xe8\x33\x36\xd6\x2c\xcc\x1e\x29\x34\xab\x94\xfe\xec\x29\x33\x14\xf7\x1e\x9c\x79\x99\xfb\x9f\x54\x5c\xae\xc9\x3f\xff\x7e\x94\x96\xe9\x49\xed\x27\xa7\x15\x78\x5f\x1c\xe7\x9a\x48\xff\x8f\x6d\xed\xd5\xb6\xb5\x45\xb9\x0a\x7e\x3f\xaa\x3f\x7b\x52\xa4\xbf\x28\xd1\xdb\xb8\x65\xf2\x96\x14\x24\xed\xb9\x90\x72\x0a\xcf\xb8\xcb\xae\x57\xab\xf5\xf7\x61\x3e\x09\x9b\x8e\xf2\x43\x50\x00\xe3\x14\x9a\xad\x55\xb6\x9d\x51\x50\xcc\x0d\xa6\x09\xad\x48\x60\xcc\xd1\x3c\xda\xee\x66\xce\x64\x9e\xe8\xdf\xd4\xef\x9f\x7d\xd8\xf4\xb2\xe4\x3f\x38\x6c\xfa\x1f\x9f\xbf\x7d\xfd\xc7\x1f\x4f\x9f\xff\xf5\xeb\xd7\xfa\xec\x69\x53\xdf\x7c\xc5\x1a\xd3\x16\x2d\x2b\xe5\x0d\x40\x89\xc4\xd5\x13\x03\xd8\x74\x1f\xc1\x28\x8a\x50\x84\x4d\xff\x19\x22\x28\x92\xb2\xe0\x49\xb2\xf7\x04\xbf\x41\xaf\xd0\x37\x3e\x98\xc6\x2a\x64\x9a\xcd\x57\x0a\xd1\x34\x0d\x2b\xd0\x28\x85\x8b\x0d\x6d\xd1\x40\x92\x54\xa5\xa9\x8d\x0d\x8a\x80\x5e\x74\xec\x7b\x8c\xac\x1b\x63\xe2\xa1\x25\x37\xe8\x56\x5e\xbe\x9d\x61\xf9\xad\x77\x9e\x79\xe6\xd1\xa9\xbb\x4f\x54\x74\xbc\x3a\xaa\xb7\x3a\xc2\xf8\x1e\x1f\xf2\xa2\xf5\x17\x39\x40\x72\x1a\x2f\x22\x02\xbf\x74\xc3\x45\x9d\x1d\x5b\x8c\x20\xaa\xbc\x3d\x1e\x8c\x82\xc0\xbb\xd1\x8b\x78\xed\x91\x45\xb1\x6d\xe0\xf1\x4a\xd3\xbc\xed\xa2\x04\x18\xf0\xce\xc0\x2b\x2b\x6d\x06\x68\x62\x86\xce\xcd\x66\xfc\x52\x37\x9c\x9b\xe2\xfd\x22\xf3\xe1\xaa\x29\x7d\x67\x1a\x27\xc4\xdd\xd1\x14\x90\x36\x7d\x2c\x34\x06\x92\xe3\xf9\x0b\x20\xd6\x70\x65\xc9\x1f\x0c\x03\xec\x0f\x8a\x12\xf8\x7b\x41\x02\x75\xec\x96\xb5\x40\xd3\x5f\x3c\x9b\x2b\x73\x2e\x35\xb3\xe3\xbd\x9a\x71\xca\xb5\x38\x55\x68\x16\x2b\x2d\x60\x54\xe3\x70\xdf\x04\x89\xb8\xb1\x83\xa1\x4e\x01\xc9\x0f\x95\x38\xe9\x8a\x15\xb9\x4e\x1b\x3f\xac\x49\x7f\xef\x43\xe6\x1c\x1e\xcf\xf8\x4f\x35\x51\x77\xb5\x85\xc2\xeb\xb0\x60\x61\x3e\xb2\xb8\x0d\x04\xa0\x5f\x77\x5f\x3e\xd7\x7f\xfd\xb4\xfb\xfc\xf4\x5f\xe7\xe5\x1f\x04\x12\x03\xf0\xd6\x1a\x08\x49\xe5\xb6\x91\xf6\xc1\x93\x26\x16\x33\xad\xfc\xd7\x5e\x2d\x22\x2b\x0f\x78\x2f\x61\x24\xae\xd6\xe0\x2c\x18\xb7\x1d\x3f\xa4\xf8\xa1\xcd\xd1\x67\x59\x87\x93\x1e\xef\x2d\x8b\xe3\x69\x1f\xc1\xb0\x8a\x84\x06\x4c\x36\x2c\xb0\xfe\x01\x96\x7f\x7a\x2f\x3f\x5d\x0d\xc6\x02\x4b\xac\x56\x03\xd2\x13\xc8\x76\x20\xf7\xb5\x83\xc2\x35\x3f\xe5\xd1\x8a\xbf\xf9\x28\x72\xb3\x83\x64\xf8\xc3\xa8\x51\xfe\xf2\xa8\x51\x76\x2d\x6b\x34\x69\x88\xa4\x91\xb4\x03\x6b\xf9\x5f\xb9\x5c\x25\x40\xbb\xb5\xac\xb4\xa9\xdc\xb6\xc7\x20\x18\x35\x31\xa4\x6c\x14\xfb\xae\xb4\xf9\x9e\xe3\x0f\x99\x33\x37\x94\xd9\x1c\x7f\xcd\xf0\x46\x79\x56\xe6\x99\x9d\xac\xac\x60\xf5\x11\x3d\xc4\xb0\x45\xd5\x32\x3e\x04\x8b\x8a\x9b\xda\x2b\x7f\x4f\x3e\xc3\x33\x84\x4d\xf7\x88\x22\xd1\xc3\x8c\xa9\x75\x62\xb5\x22\xc1\xd9\x8a\xa9\x73\x7d\x76\x7e\x52\xa4\x7a\xd6\x96\xd9\xa9\x17\x11\x45\x9c\x8a\xc9\x42\x12\xc0\xe5\xc0\x85\x2d\x72\x0f\xd0\x89\x50\x9a\xe4\x39\xe6\x27\xfc\x68\x30\x0a\xa9\xf7\x0c\xca\xf9\xd0\x0a\xc1\x56\x99\xd0\x3f\x68\xfc\xa7\xa5\xf1\x3c\x53\xbb\x07\xf7\x6a\x93\x7d\x42\x05\xde\x2a\x09\xfb\x14\x8f\x49\x11\xc9\x79\x7b\x16\x35\xd7\x6e\x2d\x02\x2a\x7b\x48\x69\x61\x20\x26\x4d\x80\xf1\x9d\xe2\x8c\xe4\x8c\xfd\x50\x98\x67\x79\x47\xe7\x1c\xa4\x7b\x02\xfb\x8a\x44\xe6\x99\x9f\xe6\x36\xdf\xb0\xc2\x6a\xc1\xd2\x13\x8b\x90\x22\x47\x26\xb1\xa4\xa4\x71\x16\x1f\x05\x64\x34\x42\x34\x8c\x98\x1e\x9b\x36\xa3\x9e\x05\x64\xfc\x34\xe6\xbd\xe2\x67\x1b\xbc\x32\x98\x50\x9b\x06\xf6\xa7\xd1\x78\x7f\xd2\xcd\xe8\x7a\x1d\xfd\x90\xeb\xfa\x7c\x3a\x12\x26\x44\xf5\x73\xb0\xde\x3f\x47\xee\x8f\xa5\x2c\x77\x3b\x32\xf7\xeb\x00\x14\x74\x02\xf3\xd3\x73\xb6\x1f\x2e\xa6\x25\x0b\xdf\xff\xdf\x87\xf4\xfd\xd3\x4a\xdf\x44\x10\x51\x61\xc1\x00\xc6\x98\xe7\x59\x6b\x0b\x11\xa5\x39\xa5\x75\xdf\xa3\x07\x97\x14\x86\xfc\x9c\xea\x3d\x97\x73\x7a\x74\xcf\x45\x81\xbf\xa9\xc7\x8f\x15\xcd\x63\x3a\x3f\x96\xe4\x8d\x50\x9f\xeb\x55\x9a\x0f\xf5\xfd\x22\xc6\x52\x16\x24\x11\x9c\x1b\x6a\xea\x9a\x14\xc9\xc8\x13\x2f\x97\x33\x2c\x71\x9a\x2d\x66\x8d\xa7\x3d\xc2\xd0\x94\x57\xa4\xa7\xe0\x17\xac\xe0\xfb\x66\x95\x9d\xd1\xed\x6b\x7d\xfd\x5e\xe7\x2f\xbb\xfa\xd4\x13\xd9\x43\x94\xee\xa9\x98\x6e\x80\xbf\x60\x07\xf8\xbf\x9e\x7f\xff\xfa\xc7\xf7\xf3\x91\x75\x51\xd9\x12\x2d\xc4\x70\x9f\x4f\xdb\x7d\x85\x6e\x47\xcc\x9f\x3d\xee\x02\x78\xac\x7c\x49\xb1\x32\x45\x19\x47\x91\x8b\x14\x47\x71\x8a\xbe\x1f\xf3\x18\x95\x7d\x7c\x60\x40\x50\x89\xc5\x5e\x83\x11\xbb\x47\x50\xbe\xc4\x73\x39\x1a\x66\x5b\xb9\x10\x92\xe5\x8d\x98\xe2\x69\x3a\x4a\x8a\xa8\xd6\x0e\x7c\x94\xe6\x34\x51\x3a\x20\x45\x58\x9a\xde\x27\x0a\x45\xa5\xb8\x26\xac\x15\xaf\xf6\x56\x03\x5d\x41\x89\xcd\x07\xe1\x93\xd6\x7f\xa9\x36\x3d\xc9\x12\x8f\x99\x90\x5b\x9c\xdc\xb1\xe0\xd6\x25\xc5\x3c\xc2\xdf\xc7\xe7\x42\xce\x23\x0f\x38\xb7\xf7\x25\xde\x2e\xe2\xe5\xcd\x85\xce\x79\x51\x31\x53\x0f\xc7\xdf\x0e\x6f\xaf\x0b\xfa\x68\xf3\x3e\x4c\x43\x5b\x03\xee\x48\x12\x6d\xbf\x70\xa3\xd8\x83\x11\x36\x97\x44\xc7\x99\x8d\x55\x93\x7e\xf8\x6a\xe4\x5e\x14\x52\xb0\xa6\x3d\xc0\xce\xb5\x07\x28\xc2\x11\xb6\xc4\x8a\x8e\x44\x99\x25\x0a\xf5\xf1\x76\x47\x28\xa8\x58\xb3\xac\xe2\xa4\xe9\xd0\x18\x07\xd2\x56\x87\xeb\x6a\x80\xeb\xa8\x7b\x0f\x31\x4e\x2b\x32\x65\xdc\x8f\xe3\xfc\x97\xec\x96\x3e\x9d\xdc\x2e\x17\x9c\xc2\xcf\x81\xe8\x7a\x05\xba\x2e\x1a\x2d\xdc\xbb\x59\x89\x5c\x39\x6c\x16\xf4\x3f\xce\x95\xaf\xc3\xb0\x6b\x5c\x3b\x3a\xdf\xcd\x97\xb9\xe5\x9b\x61\x54\xde\x52\x46\x25\xbe\x9c\xf2\xb3\xd1\xec\x5d\xfb\x95\x0c\x14\x8d\xff\xfd\x7f\x5e\x54\x34\xfc\x68\xc3\xb3\xac\xcf\xc5\x1d\x55\x7e\x94\x21\x88\x57\x2e\xdc\x5b\x59\xc1\x50\x99\x62\x0c\x6b\x3b\x84\x75\xe9\x0f\xdb\x21\x36\xc0\xa4\xbd\x2f\xd7\x52\x32\x28\x82\x11\xf3\x85\x71\x27\xc5\x1b\x53\x00\x7a\x96\x6f\xb0\x27\xfe\x08\xfa\xf3\x9d\x24\xa8\x27\x2a\xee\x69\x11\xca\x58\x75\x56\xc8\x98\xab\x66\xbc\xe1\x50\xaf\x57\x34\x86\xf8\xc1\xff\x1c\xc4\xfb\xdb\x62\xc4\x0a\xf1\xf6\x6f\xcd\xcd\x6f\x92\x61\xfd\x4d\xd1\xe9\x4a\xf9\x5f\x22\x96\x8d\xdd\x06\x70\x46\x49\xd3\xd8\x6b\x34\x42\x74\x7b\x03\x31\x1d\x67\xb4\x5d\x49\xb6\x1f\x73\xba\x0b\xa2\xfd\xad\x11\xfb\x87\x93\xfc\x31\x28\xa2\xfe\x1e\xad\x71\x17\x2f\x6e\x11\xfe\x65\xb8\x55\x64\x4a\x8c\x9b\xde\x57\xb9\x17\xc9\xa9\x85\x54\xfa\x66\x27\xee\x20\xba\x86\x9a\x91\x5e\x20\x1d\x6c\x48\x87\xfc\x9e\x76\x6e\x0a\xb5\xb8\x13\xd4\xb2\x40\x11\x78\xcd\x91\x5d\x1d\xbd\x79\x12\x19\x86\x41\x88\x97\xd5\x8b\xd7\xc7\x93\x0f\xc5\xe0\x6d\x31\xee\xaa\xe8\xbd\xd3\xf8\xc6\x1b\xc9\xa9\xe0\xae\x10\xdf\x0a\xc5\x7e\x1c\xa5\xe0\xdf\x7f\xaf\xbf\x6e\xff\xfa\xa9\xfe\xfa\x8f\x0b\xae\x88\x05\x18\x54\x68\x3a\x4f\x1e\x92\xd6\xd0\x16\x0b\xe0\x9d\x5c\xda\x06\x6d\x0a\xb0\x4e\x0e\x16\x0b\x49\x4e\x52\xb4\xa7\xe1\x85\x4e\xe0\x95\x07\xdc\x48\x88\xa7\x34\x19\xea\x08\xf9\x70\x48\x25\xf0\x94\x9b\xe6\x86\x1c\x69\x51\x94\xfa\xd0\xbe\x94\x3f\x37\xa1\xc9\xd6\xd2\xaa\x6d\x98\x0f\xf9\x6c\x9d\x33\x4d\x03\x19\x0d\xde\x6c\x25\x18\x25\x1e\x42\x59\xa2\x76\x60\x55\xe4\x81\xc6\x76\xb4\xc8\x0f\x38\x15\x55\xc8\x07\x59\x5d\xfe\x8f\x42\x41\xac\x35\x14\x11\x02\x81\x77\x60\x36\x5e\x75\x78\xe5\xc1\x44\x45\xbe\x24\x14\x6a\x30\x71\x1b\x55\x47\xd9\x90\x8c\x9e\x95\xcc\xfd\x25\xe7\x12\x89\x94\x8d\xae\xef\x01\x6c\x14\x15\x80\xb6\xd6\x8e\xff\x5f\xb9\xd1\xd9\x63\x63\xd4\x0d\x0a\x53\x25\x87\x82\x3d\x12\x25\x55\x54\x98\x6a\x02\x17\x14\x37\xfd\xcf\x1e\x3a\x5b\x4b\xdb\x79\x5f\xc3\xbf\x5e\x03\x32\x19\x51\x4d\xdc\x04\x08\xa8\xa4\x59\x84\x84\x11\x73\xd3\x60\x94\x02\x72\xe2\xa0\x19\x99\xa0\xb2\x69\xa4\xa1\x19\x03\x45\xd0\x8c\xa4\x37\x24\x27\x66\x9b\x5d\x2e\xf7\x6e\x8e\x37\x4c\x60\x0f\xa9\x89\xdd\x2c\x80\xf0\x22\x69\x6d\x7a\xa4\xd5\xbe\xf6\x71\x44\x34\x6f\x77\x7f\x6f\x54\x78\x65\x31\xca\x42\x82\x18\x0d\x58\xd6\x1d\x91\x75\x47\xec\x74\x47\xf0\x46\x03\x4a\x2e\xbb\x82\xc1\x0d\xe8\x32\x35\x2e\x62\xe6\x56\xd2\x33\xd9\x4b\x25\x0b\xae\xd3\x43\x57\xe3\x27\x21\xe5\xa6\x99\x14\xf8\x08\x96\xd4\x38\x4b\x94\xa4\x96\x4b\xb6\xf5\x89\x29\xda\x37\x98\xcb\x60\x94\x3c\x5a\xef\x87\xcb\xfc\x00\x8a\xf1\x30\x49\xf2\xd7\xff\xfe\xed\x0d\x24\x29\xef\x54\x6a\x65\x21\x79\x32\x26\x45\x71\x6b\x54\x8b\x22\x85\xa6\x77\x24\x32\x39\x28\x52\x7f\x70\x8a\x76\xcc\x19\x6f\x2d\x41\x79\x28\xfa\x61\x56\x10\x10\x28\xc9\xa1\x42\x84\x64\x2b\xf4\x87\x23\x05\x81\x98\x2a\x2a\xb9\x53\x6b\xe6\x6f\x7a\xc4\xe4\xd0\x28\x0a\x10\x62\xed\x94\x53\x4e\xbb\xe1\x97\x35\x42\x58\xcb\xa7\xeb\x9d\x0d\x7f\x85\x4a\x3a\x09\x62\x50\x16\x7c\xda\xae\x2e\x05\xad\x48\x0a\x9b\x31\x29\x1c\xc6\xfd\xa6\x62\xd1\x19\xf2\xf9\x90\x92\xd6\x92\x92\xde\x0f\xa5\x5d\x99\x53\xb5\x4f\x67\xaf\x22\x1d\xbc\x31\xf5\x5d\x29\x88\xdd\x48\xa8\x7c\x79\xbb\x6b\x65\x4c\xbf\x04\x13\xde\xa7\x24\xf4\xaf\xf5\x3f\xfe\xf6\xe5\xb7\xf3\xfe\xac\x49\xfc\xb2\x7d\x49\xa9\x8a\x10\xcd\xe8\xe4\x80\x70\xe3\x98\xb7\x38\xc0\x4e\xd4\xf4\xe2\x01\xcc\x34\xd4\xc9\x98\xca\x43\x34\xa5\xed\xbf\xac\xa4\xde\x8c\x85\x88\x1b\xc3\xcb\x67\xba\x35\x54\x51\x12\x1a\x27\x75\x58\x8a\x00\x44\x8a\xa8\x77\xc5\x29\x32\x25\xed\x87\x43\xca\x26\xc2\x30\x36\x11\xfa\x1d\x6e\x0f\xa3\x71\xda\x81\x93\x61\x4b\x46\xaa\xf6\x72\x3b\xd1\xc7\x67\x62\x85\x2a\x6c\x0e\x7d\x99\x42\x91\x2d\x29\xec\x83\xcc\xa2\x22\x57\xba\x97\x3f\x28\xce\xe6\xe8\x4a\x2b\x70\xdb\xa5\x2a\xf4\x70\x8b\x11\x95\xa8\xd7\x07\x7a\x16\x35\xad\x1a\xc3\x42\xf2\x64\x61\x86\xfd\x2e\x56\x18\x77\x74\x0a\x64\x46\x14\xc4\x01\xcc\x0c\x09\xd0\xe6\xf8\xdc\xbe\x70\x04\xd3\x22\xc2\x5e\x83\x2f\x29\x2c\x19\x8c\x7a\x87\x50\x05\xef\xef\x89\x51\xd4\x25\xee\x8e\x94\x34\x3f\x07\x32\x7f\xc4\xe2\xce\x3c\x5a\xe9\x98\x1d\x6f\x2f\xc7\x75\xc6\x48\x83\x73\x3f\x0b\xe2\x5b\x28\xc4\xed\xcb\x2a\x69\xf2\x0c\xc1\xe1\xcf\xc9\xd7\x7f\x9a\xe8\xde\x3f\xdf\x96\xbc\x8a\x03\xc1\x70\xf7\xba\x7c\xde\xfd\xe7\xd8\x0d\x3e\xc2\x83\x27\xef\x02\x3d\xcf\x53\xed\xc1\x3a\xcd\xf8\xf1\x67\x21\xb5\x1f\x29\x52\xf8\xff\xa8\xbf\xfe\xfe\xfb\x51\x4d\xf4\xc3\xda\x06\x30\x5e\xd9\xb2\x1f\x2c\x60\xd5\x09\x47\x83\xe1\x05\x4d\x55\x84\x10\xa5\xc0\xbb\x29\x4a\xc4\x8a\xa8\x24\xf7\xf8\xec\x54\xc1\x92\x30\xd1\xd8\xa3\x0a\x87\xab\xbd\x8f\xa5\xaf\xfc\xce\xee\xfd\x4b\x3e\x69\x48\x95\x14\xed\x77\x78\x2f\x11\xb6\xc7\x79\x0f\x2e\x0a\xf0\x77\x2f\x86\xbd\xef\x9a\x42\xf7\xeb\x0d\x1a\xc1\xc7\x5a\x83\x35\x1a\x4c\x33\xfe\xf3\x3e\x7a\xf3\x21\x7f\x39\xb4\x7d\xbc\x24\x3f\xcd\x36\xdf\xe4\x23\xba\x76\xb1\x76\x01\x8c\xdb\x1a\x70\x2c\x0c\xba\x4e\xca\x0b\xa1\xc1\xb5\x5d\x02\x4a\xad\x67\xf0\x82\xc5\x91\x58\x8f\x89\x6b\xf0\xa1\x75\x9c\x9c\xd5\xb5\x3c\xc9\x0b\xf0\x8b\x8a\x10\xdc\x06\x81\x87\x7e\x30\xd9\x81\x53\x54\xec\xd0\x8c\x6e\x90\x97\x20\xed\xc7\x07\xb2\x0a\x6d\x89\x07\xf4\x62\x25\x87\xf1\x82\xf6\xcc\x87\xba\x31\xa1\x92\x27\xd7\x48\x94\x7a\x48\xbf\xd1\x77\x01\xd3\xb9\x50\xd0\xb8\xc3\xb3\x43\x73\xe0\xec\xb1\x7e\x06\xc1\xeb\x78\x03\x26\x73\x0d\x8c\x7f\xc0\x3d\xf5\xee\x42\x04\xda\xa8\x4e\x85\xa4\x48\x3f\xb7\x4c\x3b\x0f\x2e\xf2\x4b\x41\x99\x6c\x35\x3e\xe5\x57\xba\x98\xed\xac\xbf\x2a\x3f\xb9\x30\x8c\x33\xd3\x9b\x7e\xfa\xfa\xfc\xfb\x3f\x4e\x55\x12\xfe\x5a\xff\xf3\x6f\x5f\x7f\xbb\xfb\xfd\xeb\x97\xdf\xbe\x7f\xfb\xcb\x2f\x09\xfc\x1d\x11\xc4\x78\xc7\xbf\xb0\xe0\x3f\x2d\xd8\xe6\x97\x83\x14\xef\xd2\x5d\xfe\xdf\xe1\x31\xf9\xb5\x8e\x75\xd2\xab\x50\x9a\xa2\x22\xb3\xa3\xca\x8f\x70\xa1\x50\xa6\x00\xa7\x5c\xe9\x8e\x6e\x58\xd6\xf3\x2a\x32\xb3\xa2\x9b\x2e\x66\x26\x50\xe4\xf6\x06\xec\x86\xc0\x4b\x8d\xab\x66\x00\xe0\x95\xc1\xd2\x48\x0c\xc5\xf0\x16\x81\x24\xe4\xae\x58\x9a\x34\xa4\x0c\xd8\x2d\x78\x68\x79\x22\xff\x2c\xa5\xe2\xce\xe0\xa2\xe6\x17\x3c\x38\xb3\x4b\x90\xdc\x16\xc1\x5b\x25\x4d\xa3\x72\xf0\x24\x77\x01\xd0\x9c\xba\xa5\xb1\x34\x73\xac\xc2\x17\xcb\x1b\xfd\xe0\xf3\xbd\x5e\x26\x49\x3c\x3b\x46\xe4\x8a\x71\x7d\x97\x98\x5e\x0d\xf7\x6f\xda\x41\x1c\xf8\x1d\x26\x70\x5e\xa5\x32\x56\xf2\xc6\xcd\x0e\xa7\x99\x1a\xa8\x80\x80\xad\x5c\xb7\x00\xf3\x17\x1f\x3d\xff\xf1\xf9\xe9\xfb\x5d\xb3\x43\xfd\xf3\x2f\xbf\x30\xa7\xfe\xe5\xee\xbf\xbf\xfc\xf5\xfb\xee\x2f\xbf\xd0\x2f\x77\xbb\xcf\x5f\xfe\xb6\xfb\xfe\x97\x5f\x02\xf8\xab\x4e\x8a\xdf\x33\x17\x9e\x32\x93\xf9\x75\x7d\x7e\x78\x52\xbb\x32\x06\xed\x4c\x89\x99\x22\x68\xbc\x88\xe0\x55\x10\x7d\x34\x6c\xc6\xaf\x9e\x2e\x28\xb3\xda\x21\xb5\x88\x8e\x79\x4b\x5a\x3b\xef\xe4\x94\xaa\x36\x24\x36\xa5\x8e\xd9\x94\x09\xbc\xb0\xa8\x92\x2c\x14\xf1\x38\x41\x47\x7e\xfc\x27\xaa\x49\x69\x20\xb2\xb4\xf7\xa4\xc1\x38\x48\x5a\xbc\x25\xc4\x6d\xc2\x23\xff\x28\xd1\x40\xb0\x4f\x5a\xcc\xbf\x1a\x81\x18\xf5\xe5\xae\x96\xbb\x7b\x84\xe0\x36\x22\xa1\x52\xab\x60\x34\xe4\x56\x30\xb9\xd9\xe3\x7b\x4e\x1c\x48\x5c\x45\x6b\x98\xac\x83\xc2\xa2\xa4\x54\x91\xdd\x99\x2a\x88\xab\x0a\xeb\xef\xd8\xcf\xc0\xc6\xf8\xdb\xe2\xfe\xe0\x96\xa4\xf8\x0a\x15\xd9\x72\x8d\x9a\x13\xef\x0f\x94\x0b\x05\xf5\x76\x6f\xa2\x74\xbc\x37\x99\xc3\xde\x14\x8f\xf6\xa6\x55\x62\xd1\x64\x45\x51\x1c\x94\x92\x38\xdc\x20\x50\x5a\xb8\x80\xd7\x56\xe1\x7b\xf3\x3d\x72\x7a\xf5\xbe\xa9\x66\x94\x77\x88\xa4\xd7\x44\xcf\x65\xfa\x37\xe0\xfd\x99\x4a\x68\x0b\xf1\xe6\x9a\x32\x6f\x6d\xe5\xe2\x6d\x60\xc4\x09\xed\xb1\x07\x6a\xa3\x80\x84\x53\xad\x57\x9e\x6d\x2d\x63\xc7\x5c\xcf\xf0\x2f\xdf\x7e\xaf\xb7\xe7\x4f\x10\x8c\x94\x19\x64\xc1\x69\x24\x70\x90\xb2\xe0\xf6\x84\x63\xdd\x13\x18\x4b\x76\x94\xc6\xd7\xad\x22\x07\xae\xb2\xc7\xda\xaa\xf4\xf0\xc8\xc0\x26\x57\xda\xca\x95\x57\x17\xac\x1a\x69\xeb\x01\xc2\x5d\x84\xe0\xef\x28\x02\x9a\xe6\x67\x82\x64\xef\x02\xa0\xbf\xf3\x80\x87\x1f\x64\xee\xf8\xf1\xe6\x1f\x7e\x74\x25\x67\x69\xaf\x0c\xb1\x2c\x42\x52\x4d\x56\x82\x0c\x0e\x49\x62\x9c\xd4\xad\xac\x64\x7c\x25\xf3\x49\x5b\x51\x02\xb7\xb1\xc0\x60\xa6\x03\x83\xc2\xc0\x9f\x41\x03\xd1\x6c\x87\x37\x21\x99\xfe\x47\x18\x6f\x9b\x8f\x8c\xba\x93\x4a\x96\x96\x3f\xc3\x20\x18\xe5\xdc\x21\x0f\x85\xdf\x42\x22\x48\xdd\x29\xb0\xc6\x7e\x0c\x8d\x9f\x57\x4f\xec\x92\x36\xfd\x67\x80\xc9\x0a\x71\x7d\xbd\x72\x82\x54\x35\x24\x42\x08\x31\xdc\x93\x59\x93\x34\x4f\x56\x9d\xbd\x5a\x49\x3f\x41\x8b\x3d\xe2\xba\xc3\xd4\x11\x67\x01\x9e\x2e\x51\xe4\x87\xcf\xf8\x2c\xf9\xe0\x4f\x41\x5c\xd7\xe9\xd8\x1e\x58\x11\x2c\x03\x84\x8a\x51\xb0\x24\x73\xec\x1f\x66\x0d\x0b\x4d\xa5\x87\x25\x3e\xd0\x73\x84\x8c\x8e\xb4\x59\x79\x1f\x9f\xf4\x28\x70\x4e\xd3\x8a\xb4\xde\x66\x25\x18\x74\xd2\x0e\xe5\x47\xf6\xf6\x5e\x4c\x05\xaf\x8a\xc0\x4b\xce\x11\x5f\x4f\x12\x93\x8c\xd6\xd1\x94\xae\x0a\xa5\x99\x9a\x37\x73\x25\xe9\xe7\xf5\x97\x61\x85\xba\x84\x87\x7a\xbf\x7b\x0f\x36\x03\x4e\x2c\xd2\xaf\xb1\x45\x7f\x24\x8e\xf9\x11\x71\xee\xaa\xea\xa4\x52\xe5\xd6\x9a\x7d\x04\x8b\x19\xd9\x9a\x4d\x83\x92\x92\xe6\xb0\x69\xd8\x1b\x6c\x1a\xfd\x1d\x52\xb5\x83\xf9\xe1\x93\xcd\xfc\xdb\xe7\x3f\x9e\xbf\xfc\xb6\xbd\x50\xd8\x9b\x94\x2b\x6d\x3f\xef\xae\x0a\x15\xa5\xf1\xe1\x3d\x8d\x0e\xef\x43\xef\x0d\xfe\xc4\xe3\x83\x55\x81\x65\xf9\x04\x54\x5a\xfe\x8b\x52\x85\x05\x44\x91\xef\xaf\xf5\x7f\x6b\x6d\x7e\x18\xc4\xe6\xc7\x62\x73\x63\xf1\xf3\x07\x8b\x1f\xcd\x51\x6a\x4f\xf8\xd8\x8d\x85\xfa\x3b\x74\xe0\xe3\x1d\x1a\x08\xe9\x0e\x23\xc4\xbb\x70\x47\x08\x09\xf9\x5f\x0b\x88\x77\xe8\xa1\x11\xf6\xf3\xaf\x00\x31\xdd\x05\x7e\xc3\xf2\xc3\xf2\xfe\x1c\xad\x72\xdd\x89\x4f\xd5\xd2\xa6\x80\x62\xfa\x7c\x2f\xc0\xeb\x3a\x2d\xec\x92\x57\xe4\x50\x9b\x4c\xa5\xcd\xa8\x87\x91\x59\xba\x94\xc2\x30\x87\x4c\x08\x6d\xf9\x5c\xb0\x1a\x3c\x3f\x3b\x3a\x68\x9d\x4f\x0c\x8b\x95\x4c\x33\x69\x7a\x6f\xb1\x8d\xad\xa6\xcc\xad\x8d\xd3\x53\x94\xa3\x37\xc7\xe8\x29\xca\xd3\x25\x7c\xee\xb4\xa7\x0e\x95\x79\xcb\x97\xd4\x9d\xa8\xa4\x69\xf6\x65\x51\xe3\x6c\x6f\xaf\x1c\x9c\x8e\x6a\x39\x58\x55\xa7\x8f\x5b\x17\xa0\xf9\xed\xf4\xab\x63\x60\x5c\xda\x2f\x57\xd2\xb0\x2e\xaf\xc0\x3a\xbb\xa2\x07\x61\x4c\x11\x2b\x34\x80\xa1\x46\x09\x40\x4e\x7b\x82\x22\xd6\xba\xf9\xab\x22\x84\x10\x6b\x0f\x0e\xb5\x79\x7c\x20\x03\x22\x9c\xd8\x12\x43\x45\x66\xe7\x41\x36\xd4\x04\x54\xb5\x5b\xec\x64\xd5\x6b\x1a\xd7\xbc\x5c\x67\x7c\x6d\x46\xf9\x80\x02\x95\x04\xd1\x9c\x06\x81\xce\xff\x0c\x41\xf6\xf8\xec\xc1\x2b\x07\x2e\xf4\xc0\xb2\x5c\xf5\x79\xd7\xfc\x76\x61\x3c\xcc\xcb\x81\x03\x63\x87\x7e\xed\x21\x44\x6d\xc1\xbc\x3e\x13\x19\x9c\x86\x75\x4e\xba\xb7\x46\x8d\x97\x35\x94\x6b\x58\xd1\x22\x9f\xdd\xbb\x0b\x9e\x9b\x7f\xfd\x7c\x56\x70\xe7\x5d\x09\x15\x12\xb8\x34\xc8\x21\x6a\x92\x06\xf2\xf7\x4e\x72\x4a\xf0\xf2\x0e\x12\x51\x23\x78\xc7\xa0\x34\xca\x82\x75\x83\x54\xa2\x28\x46\x41\x77\x1f\x05\xe5\x83\x1c\xb9\x1a\x49\x01\x63\x07\x19\x36\xba\x6e\xd7\x0b\x6a\x01\xc2\x3c\xd6\x9a\xd7\xd7\x68\x1e\xdb\xa6\x97\xfe\x8c\xc0\xf1\x30\x6a\x07\xe2\x03\xe5\x8d\xee\x7e\x0d\xb2\xa8\xf1\xc0\xdb\x09\xea\xde\x04\x5b\xd8\xf8\x79\x89\x16\x2f\x8c\x19\x59\x75\x66\xf6\x68\xb6\x90\x20\x75\x3d\x14\x09\xbc\xbf\x67\xa6\x2a\xa5\xcc\x29\xf5\x6e\x2b\xa9\xc9\x06\x45\xaa\x81\x48\x15\x83\x3b\x31\x68\xf0\xb1\x36\x52\x03\xd0\x40\xc4\x4d\xef\xee\xa1\xb3\x59\x87\x54\x97\x86\xff\x5e\x91\xe7\x0a\xa5\xa5\x9b\x5b\x04\xe7\x15\x22\x78\x52\x4b\x17\xe2\x9e\x65\x42\xa3\xd0\x82\xdd\x1a\x70\x49\x49\xd3\xda\x59\xd0\x6b\x82\x70\x6d\x62\xa2\xa9\x14\x41\xbc\x2e\x22\x01\x7a\x5b\x1b\x20\x29\x36\x8e\x6b\x53\xc0\x87\x9e\xf2\x23\x12\xcb\x42\x6d\xe8\x1d\x71\xde\xab\x95\xa5\xf7\xc5\x89\x7f\x14\x75\x67\x20\x67\x6c\x7e\xff\xbd\xfe\xf2\xb4\xfd\xfe\xe5\xeb\x51\x12\xa1\x56\x59\x77\xa2\xab\x87\x53\x5e\xe0\x33\xec\x6e\x97\x6c\x7b\x69\x95\x1e\x4e\x6d\xda\x9d\xc1\xc1\xac\xd2\xc5\xc5\x8d\xd5\x90\xb2\x23\xa9\xf8\x54\x2c\xd4\x58\x2a\xf6\x43\xc5\x51\xf4\x3d\x5f\x1a\xda\xdb\xd6\x9c\x6a\x8a\x0a\x31\x9b\x53\xcd\xb9\xb2\x76\x27\x71\xe1\x35\x46\xfb\x5c\x28\xcf\x03\xad\xfc\x09\x3f\xa7\x19\xba\xe9\x02\x6c\x3b\x7b\x70\xb7\x0a\xa6\x9d\xf9\xfa\x45\x53\xed\x0c\x2c\x3b\xf3\x79\x7b\x81\x56\xff\xb7\xed\xf7\xef\x9f\xff\x38\xef\xdb\xc6\xd2\x4f\x92\x13\x9e\x30\xd8\xac\x58\x9a\xa9\x09\x9c\xb2\x60\xac\xf6\x59\xa9\x73\x40\x92\x78\xae\xbf\xb1\x29\x84\x90\x34\xeb\xfd\xda\x30\x33\x0f\x50\x44\x25\xf9\xd5\x10\x8a\x79\x15\xa4\x2e\xc9\x0a\x92\x92\xc3\x96\x64\x2a\x03\x8e\x05\x01\x27\x15\x91\xbb\x4d\x1e\xc1\x32\xee\xa1\x3d\x75\x57\xb2\x2d\xb8\x58\xe5\x5a\x03\x7c\x3f\xf2\xfd\xd8\xde\x4f\xca\x41\x8c\x95\x21\x40\x3a\xba\x29\xaf\x28\x63\x4b\x19\xc3\xd1\x6d\x0a\x4a\xde\xab\xdc\xa9\x2f\x37\xe3\xce\xe1\xd2\x54\x22\x56\x7e\x67\x2b\xbb\x93\xb8\xed\xd5\x94\x8b\x37\x59\xc3\x15\x44\xef\x1f\x43\x02\x9c\x6f\x3d\x21\xd7\xc4\xf1\x8f\x56\x1c\x28\xd6\x08\xde\x6a\x92\x5c\xdf\xe0\x82\x92\xe6\xdd\xe0\xf0\x0a\x79\x49\x6f\x2c\xab\xe0\x5c\xd3\xec\x5b\x11\xc7\x95\x62\x2a\xa3\x10\xaf\xfe\x18\x87\xc4\xe8\xb6\x09\x60\x83\x0a\x6d\x96\x4f\x94\x64\x63\x79\x44\xef\x0f\xa5\x08\x62\x18\x17\x72\x6c\x26\xb7\xb2\x50\x7c\x00\x1e\x29\x5b\x11\x78\xda\x74\x71\x6e\x23\x58\x1c\x02\xe0\x0a\x0d\x2e\x82\x27\x81\xc2\x86\x85\x7c\x91\xf4\x7b\x20\x28\xc2\x9e\x62\x5f\xd1\x2a\x64\xda\xbe\x8f\x22\x1a\x92\xdd\x6b\x7e\x6c\xf4\x01\xf2\xc2\xfd\x25\x6b\x38\x39\xb0\x76\x8b\x40\xcc\x9c\x9a\xf7\x08\x90\x59\x53\x11\xee\x91\xc0\x0b\xdf\x70\xbe\xf6\x39\xbd\x5b\xd2\xfd\xc7\xa5\xee\x3d\x14\x51\x23\x50\x6d\x21\x1a\x15\xc1\x84\x7b\xf4\x90\x14\x46\x98\x5e\xe8\xfe\x5d\x73\xe4\x85\xe1\xec\x17\xb1\xa1\x9f\xca\x60\x70\xb6\x4b\x85\xe8\xab\xae\x26\x08\x5e\x59\x08\xe9\x00\xce\xda\x80\xf1\xca\x43\x30\x2b\x2d\x19\xab\x98\xe8\xce\x9d\x2f\x77\x99\x11\x88\x5e\x1f\x75\x4f\x32\xfe\x19\x3e\x55\x37\x34\x82\xcf\x66\xf8\x17\x6b\xdb\xbe\x0d\x70\x4f\xb1\xc0\xa6\x96\xed\xdb\x71\x86\x29\x6e\x49\xe7\xf5\x8a\x87\xaf\xff\xf1\xa5\x3e\x7f\xda\x40\x52\x3b\x0e\x7b\x8a\x5f\x3a\xa5\x2a\x92\xbb\x54\xd1\xdb\x49\x45\x6f\x54\xbe\x24\x57\x11\x7f\x8f\x35\x47\xb2\x95\x64\x6e\xde\xcf\x91\x9f\xa7\x78\x09\xdd\xc2\x96\x70\x0b\x80\x24\xc9\x80\x12\x2a\x8a\x3b\x7a\x7c\xd6\x51\xb3\x1e\x4d\xb3\x42\x50\xcf\xaf\xeb\xbf\x6d\xff\xa3\xfe\x7c\x54\x82\x78\x0c\xaa\x74\x03\xc3\x4e\xff\xec\x71\x9c\x96\x8a\x45\xe9\x97\xf2\xc3\xf4\xed\x12\xfc\x09\xc1\x95\x4a\x52\x7d\x97\xbe\xb2\x8f\x0f\x5e\x19\xaa\x28\x96\xa6\x98\x85\x3a\x17\x97\x75\xad\xb1\xca\xaa\x12\xaf\xaa\x29\x76\xc4\x63\x25\x96\xcb\x4c\x51\xd1\x69\x5f\xd7\x79\xab\xfa\xff\x7c\xfe\xfe\xdf\x5f\xff\xf8\xaf\xff\xb3\xfe\xfa\x1f\x17\x68\xd6\xb3\x68\x68\x68\xa7\x31\x0e\xbd\x3c\x77\xc3\xf2\xb4\x7a\x5e\x6c\xda\x25\xe1\x5c\xea\x93\xd0\x16\xad\x6a\xd3\x29\x6a\xf9\xfd\x54\xa8\xec\x32\x02\x31\x41\xc1\x32\xad\x31\x75\xa1\x8a\x5d\xb1\x69\x9f\x95\xf1\xe5\xf7\x65\xa9\xb7\x52\x00\xb0\x61\xaf\x11\xac\x55\x06\x6c\xe4\x0f\x19\xd3\x98\x70\x0b\x85\x1b\xd6\x07\x50\xe5\xb6\x61\xd2\x56\x45\x70\x66\x4b\xfc\x20\xe5\xa7\xb3\x8e\x80\x56\x83\xc7\x5a\x03\x39\x55\x3c\x69\x40\xd2\x60\x49\x4b\x16\xfc\x68\x35\x18\x62\x8e\x1b\xbe\x69\x79\x32\xa2\x06\x4c\x7c\x85\x36\x88\x92\xaf\x1e\x5b\xaf\x58\x6c\x86\x6a\x1f\x9f\xb5\x61\xb1\x3a\x6c\x30\x28\xec\xe4\x77\x27\x8f\x17\xdb\xcc\xb2\x3d\xb4\x87\x47\x06\x10\x55\x50\xb9\xf6\x41\x27\x3f\x69\xe2\xbd\xc9\x05\x89\x7b\xd5\x40\x1a\x82\x06\xab\x51\x8a\xc4\xa0\x57\xd8\xe5\xd7\x82\x64\x74\x2e\xba\x2e\x35\x7f\x64\x22\xf2\xff\x60\x03\x2b\x41\xe1\xf1\x59\x5b\x6d\xc0\x33\x9c\x88\x15\x1a\xb0\x06\x58\x47\x65\x69\xc5\x5a\x90\x20\x2b\x86\x09\x02\x43\x68\x38\x0c\x04\x94\x6f\x32\x50\x0d\xa9\xdc\xe6\xef\x3b\x9e\x87\x05\x92\x35\xe9\x96\x05\x0b\x96\xb3\x3c\x50\xe0\x25\x43\x07\x01\x37\x04\xc6\x2a\x69\x1a\xbe\x08\xa4\xc8\x40\xb0\xb5\x96\x44\x13\x02\x4b\xab\x72\x9b\x3f\xe3\x20\x0a\x90\xa8\x06\x14\xa0\x8f\xe1\x26\xa9\x93\xb5\x95\x88\x6b\x30\x98\x9b\x86\xfc\x80\x22\x78\x39\x47\x71\x6d\xdb\x0e\xd9\x38\xe5\xc0\xbb\x27\xb0\xbc\xac\x10\x0d\x38\xd9\x62\x1d\x04\xcf\xe3\x24\x45\x87\x19\x62\x62\x39\x97\xf2\x9a\x59\x95\xdb\xa2\xf1\x92\x20\xc5\x2b\x77\x34\xb7\x3c\x7f\xa2\xc7\xe7\xa0\xfc\xf6\x08\x49\xb4\xe3\x61\x23\x38\xac\x59\x5c\x81\xc2\x6f\x8f\xbe\x00\x4e\x16\x4e\x36\x76\x6b\x9a\x36\xdf\x0b\x5a\xbc\x97\x59\x87\xa5\xd6\x01\xba\x50\x46\xcb\xc9\x66\x90\x9a\x61\xd2\x36\x9c\x0a\x0c\xb1\x44\x21\x00\xd8\x0c\x56\x29\x53\x55\x7c\x7c\x16\xef\x89\x08\xe9\x88\x36\xc0\x18\x5e\xfd\x3c\x8a\xdc\x34\xbd\x81\x49\x3a\x80\x09\x7f\x87\x20\x00\x45\xb0\x51\xce\xba\x7a\x1d\xb0\xc0\x15\x81\x36\x3d\x54\x95\x33\x97\xc0\x40\xc5\x79\xb5\x79\x2e\x2b\x33\x57\x32\xb4\x15\x6c\x5c\x26\x9b\x1a\x1c\xd8\x9d\x26\xa1\x32\xa1\x3e\xe1\x48\xd8\x87\x8a\xe6\x85\xc8\x18\xd7\xa3\x60\xa7\xe5\x40\xea\x02\xf8\x63\x68\xda\x16\x41\x3c\x89\x5f\x7f\x49\x12\xb0\x86\xe2\x0b\x8f\x07\x8f\x78\x8d\x39\x78\xfc\x76\x3c\x65\x83\x62\x23\xc9\x6d\xab\xe4\x48\x1a\xa4\x1a\x62\x10\xfc\xde\x36\x66\x99\xd8\x9e\x93\x17\xda\x83\x49\xea\x78\xaa\x57\x72\xe1\xc8\xaa\x68\x6b\x96\x60\xb1\x3b\x6b\x79\x64\x94\xd9\xf4\x76\x1d\x65\x18\xe5\xd1\x4f\xd8\x77\xe4\x69\x64\x3a\x46\xff\xa9\xf9\xc1\x0c\xc9\x48\x94\x04\x3a\x49\xce\xd3\xae\xf9\xe3\xb3\x26\xd4\x09\xd0\x7c\x30\xd8\x0f\x06\x7b\xc4\x60\x6f\xe6\x11\xf2\xf6\x76\x9c\x79\x66\xe3\xc9\xb6\x9c\x15\x58\xfa\xb5\x4e\x10\x12\x18\x64\xc0\xb8\x6d\x60\x3e\x1a\x0e\x29\x76\x11\x1c\xa0\xab\xb5\xc8\x96\x82\x7d\x12\x3c\x95\x5a\xff\x6b\xe6\x60\x7e\x26\x7b\x1f\x72\x49\x45\x10\xa2\x76\x80\x51\x8d\x5d\x33\x11\x0c\x6a\x88\x8c\x89\x9d\x60\xa9\x09\xbc\xa4\x0e\xbf\x19\xaf\xef\xf7\x26\x62\xb4\x10\x43\x60\x9a\x09\x5d\x7d\x28\x0d\xce\x33\x70\xd2\xa6\x71\xb6\x92\xf6\x35\xa5\x6f\x71\x55\x55\xee\x44\x48\xb1\xd1\x34\x6f\x23\xd8\xf6\x15\x10\x0a\xe0\xa3\x66\xad\xbc\x63\xbc\x1f\x8c\xfe\x83\xd1\x4f\x66\xf4\xcb\x4e\x89\x56\x3d\x51\x3b\x1d\x21\x78\x1b\x1e\xbc\xe4\x48\x02\x2d\x04\x52\x09\x62\xd8\x0e\x99\x10\x6a\x29\x76\x27\x4c\xa8\xe3\x59\xbc\x1a\x89\x35\x6c\x32\x4f\x60\x2c\x90\x01\x9f\x64\x79\x15\x33\xb7\x21\xdd\x31\x3a\xbb\xa8\xe5\xd0\x6c\x80\xf6\x85\x20\x9d\xee\x2b\xe9\xcc\xa9\xda\x81\x4c\x8e\x06\x7f\x05\xd3\xc7\x03\x45\x90\x58\xf5\x22\x6d\xc7\xa8\xc9\x84\x6b\x88\xb9\xef\x08\x97\x25\x7b\x93\xa7\x23\xcc\x47\x1d\x72\x04\xec\x80\x56\x84\x90\x04\xd2\x89\xb9\x31\x8b\x03\x42\x71\x46\xe5\xb6\xf9\x22\x6b\x7e\x04\xb1\x16\x4b\xcb\x88\x9f\x33\x1f\x31\x41\xcb\x29\xe4\x88\xc8\x7b\xf4\x3f\x64\x0c\xcc\x8f\x22\x73\x46\xde\xa7\x84\xf1\xdb\xcc\xf8\xad\xb0\x79\xa7\x99\x97\x8c\x99\x0f\x2a\x16\x76\x08\x2c\x63\x4b\x9f\x5f\x89\xd9\x3c\xf2\x0e\xc7\x4c\x9b\xef\x84\x8e\x95\x69\xc7\x5a\x81\x7d\x2a\x34\x6b\x67\x9a\x15\x91\x82\xb1\x62\xa8\xb4\xa2\x6d\x8e\x8d\xa3\x6c\x11\xf1\x50\x5a\xd7\x02\x69\x03\x51\x8d\xb1\x0b\x41\x7a\x75\xed\xe6\x65\x9a\x39\xf8\x66\x87\x37\xdc\x0d\xaf\x28\x43\x55\x0b\x07\xf6\x76\xd0\x29\x0a\xd4\x62\x78\x02\xde\x3e\x01\x2d\x24\x71\xc1\x04\xc2\x6f\x40\x10\xc5\xbb\x92\x59\x6c\x2d\x54\xb1\x19\x43\xbd\xdd\x5d\xc7\x56\x2f\x71\x14\x45\x09\xd6\x78\x92\xf2\xc6\x3c\x06\xef\x18\x07\x79\x87\xeb\x8d\x80\x18\x4f\x0c\x44\xb7\x2b\xfe\xae\x21\x98\x26\x1b\x88\x8d\x5a\xb4\xfa\x81\xfa\x9f\x91\x40\xb1\xfa\xaf\xc6\x23\xc9\x3b\x1f\x26\x95\x0b\x9b\x34\x1b\x85\xa0\xfa\x91\x9a\xa6\x9b\xfc\x6d\xa7\xe3\xa9\xa7\xf9\x57\xad\xc6\xae\xae\x8e\x0f\x3a\x68\x83\x92\xc1\xde\x6f\xc7\x4a\xbb\x84\xe5\x31\xe2\x3b\x5a\x07\x6c\x25\xf3\x84\x0f\x6e\xf0\xc1\x0d\x2e\x70\x83\xbe\x5a\x81\xca\xf3\x72\xe1\xeb\x99\x45\xd6\x3c\x6a\xee\x4b\x0a\x94\x23\x39\xec\x76\x05\x89\x60\x64\x38\x6b\x30\xdf\xee\x98\x5a\xcf\xd6\x11\x6b\x0c\x5d\xdb\xb1\x09\xac\x60\x19\xda\x32\xa9\x9e\x13\x62\xae\xc8\xf9\xf9\xae\x0d\x01\x0b\xb3\x7e\xde\x94\xa3\x5f\x97\x78\xe4\x05\xfd\x5f\x8d\xab\x9c\x18\x61\x35\xc1\x1f\xa9\xf3\x52\xbc\x24\x2a\x51\xe7\x3f\x18\xff\x07\xe3\x7f\x15\xc6\xdf\x37\xbf\xa0\x8a\xe0\x1d\x7f\xf9\xb8\xda\xb8\x65\xb4\x71\x69\x05\xe3\xc8\xfa\x49\x69\x5f\x49\x27\xec\x29\x7f\x04\x1e\xb5\x1b\x87\x35\x6b\xca\xc1\x7d\x7e\x96\xa6\xf8\x23\xe5\xc6\x6d\x3c\x07\x7e\xfd\xfc\xfd\xfb\x97\xdf\xfe\xf6\xed\x7c\x1c\x41\xc1\x1b\x00\x05\xb0\x76\x3b\xb6\x9b\xb0\x04\x20\x15\xe3\x9e\xc0\x59\xc1\x74\x84\xc2\xeb\x8c\xb3\x2e\x69\x70\xb8\x67\x52\xde\x12\xaf\x9b\x34\x0d\x0e\xf2\x53\x2e\xb3\x32\xdb\xb4\x2d\x27\x8a\x94\x65\xe6\xa1\x1d\xcd\x66\x9b\x54\xad\x05\x3f\x77\xc5\x09\x06\x45\x10\xa3\x0e\x72\xd8\x18\xc4\xfa\x13\x0e\xa5\xf7\x9d\x96\x95\xa3\xc6\xe2\x69\xba\xc5\xa7\xd4\x12\x0e\x35\x6d\x8b\x58\x36\x88\x7d\x35\xd8\xdc\x34\x03\x27\x64\x1a\xaf\x21\x39\x0d\x09\x8f\x8e\xf5\x2d\x18\xe9\x4a\xc0\x14\x72\x93\x3f\xc8\x37\x10\x88\x79\x50\x11\x7a\x7c\x81\x98\xc5\x79\x19\x6d\x57\x88\x49\xdc\x68\x85\xdb\xcb\xf5\x9e\x25\x18\x9d\x32\x60\x6c\xcd\xfb\x47\xb1\x43\x51\x3a\x12\xcb\x28\x4d\x27\x49\x76\x1e\x7a\x12\x13\x65\x62\xc1\xc4\x0a\x37\xf1\xc2\x78\x8e\xac\x84\xcc\xda\x8a\xc4\x14\xbe\x19\x2f\x91\x29\x14\x7a\x5e\x38\x06\x58\xe8\x36\x2f\x1f\x01\x87\xe6\x0a\xcf\x92\x90\x41\x7e\x94\x01\x1c\x5a\xd6\x56\xe8\x6c\xaf\x1d\x2c\x92\xea\xa1\x93\x04\xf9\x07\xaf\xdc\xc8\xc1\x23\xe7\x28\xcb\x8e\x0b\xc2\x8b\x1c\xe6\x72\xff\x3c\x57\xe1\x8e\xd2\x66\xbc\x40\x02\xe3\xb2\x1d\x71\x80\x30\x4d\x6e\x33\x96\xd7\x0e\x46\x73\x26\x75\x02\x67\x4e\x79\x71\xe4\xa1\x3c\x3e\x24\xde\xde\x02\x18\xd1\xe6\x82\x20\x45\xe8\xb2\x82\xf2\x7a\xf0\x3b\xc7\x56\x5e\x61\x96\xc9\x7c\x2b\x14\xf0\xd0\x00\xdd\x06\x93\xec\xe9\xe9\x90\x64\xdc\x09\x03\x49\x03\x7b\x6f\xd7\xdf\x7a\x11\x35\x22\x10\xa6\x8d\x81\x68\x95\x34\x0d\xd7\x8e\x22\xa5\x32\x06\xc5\x90\x9b\x86\x0a\x9a\x37\x72\xf8\x56\x11\x19\x96\x72\x8c\x6c\x1b\x24\xa1\x20\xf3\x15\x76\xec\x73\xd3\x21\x2a\xdf\x3b\xe2\x86\x8b\xbd\xae\x2c\x60\x50\x64\x01\xed\x16\x33\x3f\xe9\x6c\x68\x10\x18\xff\x6b\x96\x55\xbc\x06\xeb\xff\x9e\x37\x54\x96\x7f\x24\xfd\xbb\xa9\x21\x48\x88\xb4\x39\x7e\x95\xe4\x14\xc5\xd6\xd2\x72\x43\x47\xcf\xc8\x1d\xa0\xfc\x08\x04\xdc\xca\x9c\xc3\x61\x8d\xc1\x07\x0d\x14\xef\x49\x6c\x8a\x01\x4f\x7c\xa1\x10\x69\xb0\xa4\xe3\xc1\xf3\x3d\x90\xc2\x9a\x7c\x59\xca\xd0\x1a\xde\x6f\x5a\x53\xb9\x66\xc2\xa2\x28\xbd\x93\x86\x70\x6a\x78\x4c\xd1\xf2\x80\xec\xcb\xc7\xfd\x67\xc1\xc1\xb8\x1a\x82\x48\xf0\x0c\x20\x9f\xe1\xc3\xc2\xc0\x3d\x8a\x74\x4d\x02\x1e\x93\x43\x75\x9b\x17\x23\x8a\x0b\xec\x1e\xc5\x7d\x69\xf8\x59\xa9\x82\x9b\x14\x85\x1a\xc1\x32\xd9\xfe\x1d\x98\xe6\xf2\x19\x81\xad\xb5\xd0\x08\xcb\xcc\xe3\xf7\x20\x5f\xaf\x19\x9e\xea\x14\xc8\x95\x40\x9a\xea\x2c\x03\x05\xfa\x3b\x18\xbe\x09\xde\x00\xf9\xba\x81\xd4\x11\x24\x64\xa4\x10\x77\x08\xe9\x68\xa8\x14\x94\x31\x60\xb0\x96\x98\x5d\xb0\xe1\x49\xf8\x75\x11\x44\xbc\x44\x0f\x9e\x81\x21\x43\x8a\xd9\xfd\xfb\x68\x40\x2c\xc2\xd5\x67\xb1\x44\x35\x98\xe4\x6a\xb1\x98\xf1\x73\x7f\x97\x43\x2a\x23\xf2\xaa\xaf\x11\x1c\xaf\xf1\x66\x04\x62\xd5\x20\xb6\x7f\x7c\xe6\xfd\x52\x6a\x19\x90\x12\x71\x84\x65\x59\xda\x38\x70\x4e\x49\xd3\x71\x5f\x0a\x10\x78\xbf\x23\x94\x00\x90\x36\x5a\xc5\xb3\x88\xcc\xbb\xa4\x66\xe4\x0f\x40\x5b\x97\x55\x8d\x10\x0f\xbb\x04\x81\xf5\x8c\x6c\x24\x72\x29\x2f\x5f\x49\x16\x0c\x23\xa0\x63\xe1\x9a\x77\x2f\x01\x09\xf7\x1c\xbd\x92\xa6\x68\x0f\xd4\xc8\x2a\x53\xd4\x5a\x96\x85\x29\x8a\xd1\x23\x4b\xb5\xac\x0a\xe6\xce\x81\x48\x83\x89\x5b\x27\x09\x57\xba\x92\x43\x22\xba\x23\x0f\x1b\x8d\x66\x49\x33\xf7\xe5\x62\x45\x16\x2c\x43\x36\x59\xf1\xbf\x16\x79\x19\xb7\x8e\xe5\x7a\x77\x10\xee\x9b\x0f\xd8\x3a\x7f\x3f\x49\x66\xab\x60\x24\x18\x3b\x5a\x91\xff\x20\xf1\x4c\x18\x2e\x5b\x07\x51\x0e\xba\x3a\x69\x3c\xf0\x08\x6a\xee\x17\x24\x5e\x9e\xbb\xc7\x1d\x02\x99\x3a\x87\xc8\x24\xb0\x0c\x9e\xad\xc4\xea\xbb\x83\x7c\x80\x8c\x1d\x36\xd6\x8c\x18\x42\x46\x51\x43\x72\x02\x6d\x27\x7e\x35\x21\xe4\x85\x38\x31\xe2\x20\x0b\x5d\xe7\x95\x94\x5d\x00\xdc\x1c\x8e\x78\x39\x8e\xd8\x2a\x96\x6a\x8d\x62\xcd\x89\xd9\x46\xc1\xbb\x45\xd1\x73\x65\x67\x44\xc7\x5a\x96\xc5\x6f\x19\x23\x4c\x68\x6f\x16\x0c\x0f\x7b\x6f\x0a\x10\x39\xe2\xe8\xbe\xb5\xfc\x0c\xf3\x14\x5e\xd8\x6d\x50\xa1\xe3\x36\xac\xcb\xc8\x19\x2d\x6f\x99\xa3\xd7\x8c\x67\x2a\xda\x1d\x5f\x77\x4c\xb8\xa2\xb3\xd2\xf0\x63\x16\x3c\xde\x93\x9c\x6d\xc4\xa3\x31\x88\x27\xbc\x24\xfb\x31\x78\x34\x01\xb0\xb6\x96\xf5\xa0\x4d\xf7\x45\x39\x45\x75\x8a\x4c\xcd\x44\xe4\xc7\x2f\x91\x07\xe3\xf6\xc3\xc1\xa9\x7c\xb5\x96\xe7\xfb\x5f\x4a\xbc\x2d\x1a\x86\x01\xaf\xdc\xe8\x9d\xa6\x7b\xd9\xc6\xc1\xba\xd1\x5d\x19\x79\x8d\xe2\xf9\x34\x5e\x18\x66\x25\x09\x5c\xa8\x33\x30\x86\x2f\x0a\x9c\x76\xc7\x57\xb5\xf0\x3d\x01\x78\x6f\x84\x82\xec\x4e\x3a\x4a\x0a\x8f\xc6\xa0\xf3\x20\x2c\x4b\x97\x47\x43\xcc\x08\x50\x0b\x15\xc5\xd8\x9b\xb7\x61\xba\x64\xa6\x4e\x7a\x0c\x40\x25\xdb\xa9\x71\x15\xd9\xcd\xe0\x7a\x8b\x8a\x8f\xcf\x3a\x42\x34\xac\x52\xd3\xc6\xb0\x2e\x6a\xb2\x42\x2a\xa2\x02\xab\xa3\x59\xc8\x38\xdc\x68\x3c\x61\x1b\x60\x4f\xaf\x3b\x7b\xc9\x24\x38\x45\x2d\x11\xcb\x03\x36\x6d\x7b\x2f\x26\x29\x8b\x66\x20\x1d\x5c\xf2\x59\x23\x61\x75\xc5\x89\xb8\x4d\x4d\xdb\x69\x82\x41\xec\x17\x6f\xae\x91\x78\xde\x22\x24\x5c\x85\xfb\x39\xc8\xd4\xe2\x38\x61\xa8\x96\xa9\xc5\xc0\x4a\x49\x14\xad\x24\x1e\xd4\x12\x9b\xda\xb3\xfe\xdb\xa9\x25\x4c\x25\x52\xa8\xa7\xd3\x2f\xc4\x73\xa5\x70\x3b\x41\x4d\xcc\x56\xc6\x74\x20\x12\x48\xac\xad\x9c\x57\x56\x46\xaa\x03\x83\xc0\xd4\xc8\x9a\x63\x7f\xe5\x92\xb8\x8e\xec\x58\x70\x1d\x29\x26\xd6\x2a\x91\x93\x46\x83\x42\xde\xd4\xac\xcf\x0e\x04\xce\xec\x78\xea\x9b\x23\xa7\x9e\x0f\x55\x65\xb2\xaa\x32\xed\x98\xfc\xa4\xf9\xe1\xbf\xbf\x7c\x7f\xda\x9d\x4f\x4a\x6c\x64\x51\x22\x6f\xb2\xa6\x60\x2a\x8c\x60\xfb\xb1\x36\x24\x67\x6d\xa1\x0c\x80\xa6\x77\xd9\x01\x91\x3c\x7a\x4f\x42\x30\x11\x6c\xec\x95\x58\x67\x09\xd2\xa5\x8a\xc2\x8b\x49\xea\x18\x59\xfb\x21\x1d\x87\xf1\xe4\x9a\x3e\xa1\xb4\xf9\xa1\xfb\x90\x2b\xf4\xc9\x80\xee\x0d\x65\x3c\x5f\x29\x90\x29\x00\x52\x8e\xcf\xa1\x2e\x3e\x07\x21\x1e\x22\x74\xce\x94\x0f\x99\x9d\x18\x85\x56\xec\xe8\x72\x1a\x63\x49\x9a\xba\x4e\x47\xa7\x32\x9b\x74\xc5\xe1\x08\x56\xeb\xc7\x5d\xea\x27\xac\xd7\x8f\xbf\xd0\x8f\x07\xca\x69\x45\x30\x1e\x22\xb5\x0c\xf8\x74\xe8\x09\xc1\x4e\xef\x2b\xdc\x00\xeb\x96\xfb\xd6\x5f\x8d\x87\xcb\x1d\x6c\xaf\xc6\xcc\xe5\x69\x14\xae\xc5\xd5\xa9\x45\x76\xd7\xc7\xde\x89\x45\x71\x6f\x84\xcf\x17\x7b\xf7\x53\x13\x86\x1f\xf6\x97\xc6\x95\xc3\x14\x10\x7d\xc7\xc1\xab\x63\x16\x2f\x27\xc1\x6d\xee\xdb\x37\xd8\x78\x16\x40\x23\xfc\x20\x47\xca\x53\xe6\x12\xe7\xe6\x17\x5f\xce\xc7\x96\x39\x94\xaf\xc0\xc5\x96\x79\x8f\xae\xc0\xc3\x96\xe5\xe7\xb8\x9e\x83\x4d\xa9\x48\x7c\x0b\xfe\x35\xa1\x44\xf1\xcd\xb8\xd7\xf9\xbe\xfd\xa4\x70\x85\x03\x4b\xa8\x25\xb1\xa2\x64\x64\x3c\x4a\xec\x4c\x0a\x8c\xb9\xc0\xce\x76\xe8\xc7\xce\xf3\x3a\xd7\xe3\x7a\x47\xac\xed\x3c\xa8\xc2\x6b\x79\x53\xc7\xd9\xa9\xe3\xdf\xb3\xee\x12\x45\x35\x74\xdc\x37\x55\x44\x3b\x84\xf8\xf8\xec\x54\xb1\xd3\x08\xf1\xe2\x85\x92\x89\x7c\x78\x21\x1c\x2e\x48\xf5\x9e\x04\xb6\x74\x15\xc6\xe9\xe5\xb5\x5e\xc8\x4f\x3f\x21\x39\xfd\xbd\x64\xa4\xbf\x31\x34\x87\x2f\x6a\x70\xe9\x8d\x21\xf9\x91\xe2\xfe\x14\xbe\xc8\x01\x25\x1a\x40\x77\x5c\x19\x5f\xc2\x85\xfe\x74\x58\xf2\x43\x65\xbb\xff\x1f\x5f\xff\xf1\xfd\xf3\x1f\x17\x12\x5b\x2a\xb4\x10\x43\xed\x00\x51\x3b\x39\x2a\x6e\x5d\x05\x35\x82\x15\xe3\x1e\xde\x63\x52\x88\x95\x91\xe3\xe0\x2e\x3b\x1c\xa9\xa2\x42\xbc\x47\x0b\x06\x55\x94\x03\xbe\xc1\xab\x8a\x5f\x5d\x2d\x07\x46\xcc\x34\x55\xf3\x20\x51\xf5\x46\x9a\x0d\xd1\x4d\x77\xf7\x18\x14\xb9\x7d\x00\xdf\xcf\x4d\xc7\x23\x25\x57\x13\xf8\xa4\x48\x4e\x9b\x07\x6f\xea\x99\x03\xbd\x1c\x4e\x1f\x85\x3a\x09\xe2\x30\xaf\xb5\x58\x63\x2d\xdd\x9b\x42\x32\x16\x49\x5d\x08\xeb\x47\x8e\x99\x3c\xee\x5a\xf3\x10\x15\x0d\xa7\xd0\xfb\x80\x55\x78\x2e\x54\x6a\xf6\x89\x98\x93\xc1\xa6\xdd\x08\x60\x85\xa6\x92\x6f\xd5\x3c\x14\xdd\x1b\x4a\xb3\xb6\x28\x0b\x7c\x4f\x0a\x23\x63\x8e\xe5\xf5\xc0\x41\x36\xee\xe6\x91\xb5\x72\xea\xbe\xd5\xf2\xaf\x90\xda\xe0\x8d\x40\xbc\x46\xc2\xfc\x7c\x58\x2e\xe2\x42\x04\x67\x6f\x8b\xbb\x2b\xe4\xca\xef\xb8\x99\xd8\x13\xa4\xa4\x00\xa0\x6e\xd2\xc9\x8d\x05\x1d\x2c\xd6\x64\x68\xcb\xed\x46\xef\x48\x7c\x98\x67\x89\x9a\x9c\xe9\xff\x8d\xf6\x98\xab\x63\xd8\xdf\x8e\xe9\x5c\x9b\x16\xf5\x2d\xf7\xa0\xab\xf3\x92\xbe\x19\xc3\x5c\x66\x37\x59\x55\x31\x76\xf3\x13\xf7\x2a\x04\x1f\xba\x48\x9e\x7c\x58\xab\xd0\x6f\xfa\x9e\xdd\xcd\x53\x8f\x0f\x68\x20\x7a\x95\x20\xd1\x16\x62\xdf\xd9\xc7\xa8\xa2\x26\x20\x5e\x73\x4c\x95\x83\x64\x86\x0f\x78\x55\xec\x3d\x60\xbc\x27\x1c\xbc\x8e\xed\xeb\xcc\x50\xc4\xf3\x24\x27\x77\xb0\x80\x96\x9b\x4d\xff\x2b\x5d\xe7\x92\x09\xc0\x10\x93\x57\xb0\xbd\x8e\x74\x1e\xc9\xbd\xb8\x0e\xf8\x50\x5b\xc0\xa4\x2d\x14\x69\xd4\x1d\x49\x77\x8c\xa5\xc4\x03\xb6\x3b\x0f\x14\xfa\x03\x96\x0c\x3f\x65\x04\xc4\xba\x79\xc6\x0d\x46\x72\xe8\xfd\xf1\x19\x11\xa2\x14\xdf\x08\x27\x46\x82\x7c\x85\x0c\x90\xa9\x28\xc1\x68\xac\x9e\x69\x9c\xef\xdd\xa3\x93\xec\x94\x7d\xb0\xe8\xa6\x24\x49\x06\x0b\x15\x80\x91\xe7\x63\xd5\x08\x2a\xac\x92\xe4\xca\x74\xf8\xf8\x6c\xc1\x07\x6d\xc0\xfb\xd1\x87\x28\x3b\x72\x11\x90\x64\xbc\x2c\x09\xc1\x0f\x56\x48\xca\x81\x08\x18\x04\x2a\xfc\x94\x1d\x03\x2d\x0f\xc6\x60\x06\xee\x4a\xd5\xee\xa2\xd4\x03\x32\x72\x58\xeb\x63\xf7\x75\xc1\x80\xa4\x46\x6b\x37\x7b\x2a\x08\xe2\x8a\x13\xb2\xbd\x62\x3b\xda\xc6\xb5\x91\xe4\x05\x17\xd0\x4e\xa6\xee\x04\xe7\x5e\x44\x6f\x0b\x36\xb1\xa0\xe0\x94\x34\x03\x8b\x48\x6d\x81\x48\x07\x30\xb8\xe9\x53\x9a\xb1\x79\xb6\x83\x30\x8a\x1e\x50\x1e\x9f\x35\x19\x70\xca\x83\x71\x1f\x68\xde\xa1\xf9\x87\xf5\x65\xaa\xf5\xc5\xe4\x8c\x26\x10\xfc\xb1\xf5\xc5\xe4\x00\x30\x3f\xe0\xfd\x09\x24\x35\x3b\x7e\xf0\xfa\xf7\x4e\x04\x6f\xce\xeb\x7f\x30\x4b\x56\xf5\x70\xde\x8a\x85\xca\x95\xe4\xaa\xb8\xa3\xaa\x97\x1a\x58\x93\xa6\x71\x36\x61\xb7\x67\xfa\xdd\xad\x96\x9b\xd5\x14\x0a\x8b\x12\xc3\x9e\x76\x71\xef\x77\x54\x21\xed\x8c\xa4\x5e\xa6\x0a\xc3\x68\x2c\x7d\x6b\x26\x29\xaa\x0c\x8e\x13\x1b\x8f\x53\xe0\x52\xdc\xc5\xa3\x5a\x9f\xc3\xb4\xb8\x58\x48\xd2\x5e\xac\x58\x9e\x2f\xf6\xa9\x44\x5f\x51\x51\xa2\xdd\xfb\xe1\xd7\x77\x76\x3f\xa7\xd4\xe1\xe5\xbc\x2c\x02\x71\x84\x18\x24\x1a\x7e\x26\x94\xaf\x77\x6a\x21\x07\x45\x3e\xa5\x44\x07\xb6\x77\x4e\x99\x7a\xc7\x85\x04\xfe\x86\xc5\x04\x73\xf1\x92\x9b\xae\xb4\x03\x7b\xfd\xda\xae\x61\x57\x09\x0a\x8b\x3d\xed\x10\x5c\x60\x09\x29\x08\x07\xed\x9b\x52\x3e\xac\x22\xb3\xad\x22\x42\x41\x4d\x6d\xe0\x71\xba\x35\x37\x9b\x71\xad\x50\xb5\x50\x8a\x05\xef\x8a\xdb\xa2\x34\x0b\x34\x47\xa2\x4c\x57\xa8\xf8\x7a\x5c\xbf\xb6\xee\x61\x50\x78\xe0\xe4\x4d\x41\x82\x41\x89\x66\x92\xa2\x14\xc2\xf3\x7f\xf0\x6a\x85\x77\xe3\x7a\x9c\x2e\x29\x24\xd6\xb1\x98\xbc\xdb\xa5\x01\xcf\x32\x4a\x49\xe1\xe5\x9d\x35\x82\xdd\xd9\x13\x85\x35\x17\x69\x96\xcd\xbe\x0a\x98\x86\x78\xb7\x47\xb0\x25\x15\x9b\xe1\x30\x79\x55\x14\x86\x7d\x5c\x0b\x75\x13\xf8\xa6\xf7\x41\x47\xba\x81\x47\x45\xc5\x0e\xc1\x8f\x51\xf3\x38\x87\xfd\x89\xdd\x7a\x8d\xb4\x68\x17\x17\x6b\x47\x10\xe8\xcc\xbe\x7c\x71\x8d\xae\xd6\xc1\x04\x62\x0a\x8b\x13\x4b\x26\x31\xb4\x27\x8c\xf0\xb7\x49\x72\xc3\x92\x3a\xb6\xd5\x6c\x1c\x6b\xf4\x5d\x34\xe0\xfb\x45\x95\x05\x29\x7f\xfe\xbc\xe9\x6d\x5e\xe2\x57\x04\x69\x33\xde\x58\xc9\xf0\xe4\xe7\x53\xc5\x12\x3d\x69\xbc\xb1\x9e\xd2\xdf\xdb\x8d\xe4\x87\x67\x72\x17\x77\xf5\x55\xca\xea\xcc\xdc\x21\xa7\x66\x10\x99\xac\x7b\xfe\xbf\x9b\xdf\x7f\x3f\xd2\x3f\xbf\xd6\xff\xfc\xdb\xd7\xdf\xee\x7e\xff\xfa\xe5\xb7\xef\xdf\xfe\xf2\x0b\xc5\x3b\xa2\x3b\x53\x34\x6d\xf7\x83\xe8\x8e\x6f\x15\x4d\x6b\xe8\xf0\x5f\x77\x51\xde\xbd\x52\x27\x1d\x0d\x07\x2d\x77\xee\x73\x43\x74\x17\x9b\xa6\xb8\xb3\xb9\x31\x74\x87\xbe\x69\x29\xde\xa1\x6d\x5a\x81\xed\x35\x5a\xe2\x68\x20\xf2\x51\x9f\x1b\xdf\xfd\x8e\xdc\xad\x34\xb6\xf9\xff\xf6\x6f\x7e\xfe\x4a\xff\x86\xf1\xca\x34\x73\x8e\x1d\x1c\x7c\x07\x9b\x6e\xda\x14\x0f\xe0\x30\xd4\x00\x69\x9d\xc8\x99\xc6\x83\x98\xff\x69\x34\x55\x7f\x50\x53\xcf\x28\xa9\x73\xa3\x66\x30\xad\xd3\xc7\xa5\x88\x99\x76\x1e\xe9\xca\x3e\x2e\x45\xca\xb4\xf3\xb8\xb6\x8f\x38\x05\x2f\x6e\x43\xb1\x57\x78\x8d\xdc\x9a\x86\xaf\x30\x7d\xdc\x8c\xaa\xaf\x8f\xf6\x59\x42\x5f\xd7\x47\xfa\x2c\xa1\x86\xeb\xa3\x7c\x96\xd0\xc7\x0a\xd1\x3d\x4d\xb5\xde\x83\xe3\x70\x52\xe6\x10\xcd\xcc\xa2\xbc\x01\xe7\xeb\x42\x03\x6b\xf0\xbb\x45\xf5\x90\x2f\x47\xd6\x8c\x69\x97\xc0\xba\x96\x0c\x32\x6f\x2f\x40\x30\xb0\xb9\xb3\x60\x00\x71\x92\xed\x31\x1e\x1b\x1e\xed\x61\x09\x8a\x45\x56\xc7\xf4\x83\x08\xf2\x93\x38\x5c\x31\x59\x9a\x7f\x2d\x7e\xbc\xd0\x38\x76\x7b\x6e\xbc\xd0\x5e\x75\x43\x5e\x7c\x5d\xd4\xd2\x32\x4e\x7c\x5d\xc4\xd2\x32\x3e\x7c\x5d\xb4\xd2\x32\x2e\x7c\x65\x94\x12\x91\xf2\x3b\x70\xe7\xaa\xb6\x16\x55\x5c\x64\x1f\xbe\x14\xf6\x33\x56\x63\x2b\xb4\x25\xc5\x3d\xed\xec\x3c\xad\x6f\x4e\x50\xd0\x94\x8a\xdf\x5b\x49\x62\x7a\xc8\x64\xaa\x73\x3a\xca\x58\x62\xda\xfb\x0b\xbb\xcf\xf9\xee\xd3\x6b\x99\x66\x99\x3d\xce\xd2\x3e\x3f\x7d\xfe\xe3\xfb\x97\xff\xfc\xf2\xb4\xfd\x7e\xbe\x2c\xa5\x21\xe5\xcb\x7e\xc1\x4c\x52\xb1\xa2\x38\xd2\xdc\x31\xd5\xe0\x82\x86\x00\xa9\x39\xae\xa6\x42\x4a\xeb\xc4\xd2\x56\xb1\x34\x54\x17\x2a\x82\xf3\xdb\xc8\x57\x63\x97\x1a\x57\x91\x42\x88\x58\xc5\xbe\x31\x93\xd4\x6a\x29\x19\x32\x2d\xf5\xe2\x0d\x43\x3f\xe8\x6f\x86\xd0\x7f\x29\x21\x43\xd3\x8b\x3f\xf4\x82\x0b\x7b\xb9\x94\x8d\xa1\xa9\xfd\x6a\x0e\xbd\x14\x0b\x7b\xb9\xe8\x10\x4f\x92\x39\x19\x03\x90\xd9\xfa\x5c\x82\xdb\xb4\x79\xac\x2c\x58\x85\x92\xdc\x2f\x49\x62\xe2\x00\x22\xab\xe5\xf4\x2a\x7c\xd7\x6f\x3d\x90\xd4\xc5\xe9\x7c\x96\xc4\x3e\x5a\x8b\x49\x8a\x1f\x80\xa4\xf9\x0d\xf9\x84\xe6\x4f\x9c\xea\x44\xe7\x52\xc3\x58\x80\x8f\x5b\xf1\xd0\xb5\x39\x4b\x30\xb6\x29\x8c\xf9\xef\x8d\x05\xe3\x94\x34\x0d\x2e\xc9\xd0\x29\x40\x9a\x13\x74\x71\x49\xf5\x5d\xb6\xb2\xd7\x9f\x42\x2f\x5b\xeb\x35\x0a\x97\xfd\xcc\xab\xbf\xc6\x81\x75\xa3\x8e\x1c\x97\x91\x8f\x92\xb2\x98\xca\xb0\x47\xf0\x25\x26\x28\x16\xe5\x00\x98\x76\x76\x2d\x12\x78\x93\x08\x81\xf6\x08\x78\x8e\xb1\xee\xf5\xa2\xd3\xfb\x8b\xfa\x62\x37\x0a\xab\x28\x56\xb1\x14\xed\xa8\xcd\xb4\x70\xc5\x4e\xb1\x64\xa0\x13\x55\xcc\x1f\x42\xbb\x09\xb3\x53\x26\x2c\xda\xdd\xae\x4d\x98\xb0\x94\x27\x5e\x97\x2d\x61\x29\x47\xbc\x32\x64\xe0\x27\xe7\x87\xcb\xd4\xa3\xbe\x6c\x28\xb2\xfa\xde\x80\xb1\x67\x39\x90\x3f\x3a\x2e\x6b\xdf\x5b\x30\xae\x4b\x2a\xd4\x11\x63\x22\x08\xf1\x28\xd5\x42\xd6\x69\x6e\xc1\xa7\x96\x29\x61\xab\xaa\x00\x61\xb6\x77\x46\x52\xa6\x28\xed\x21\x53\x9f\x26\x4d\x3d\x71\x1c\x95\x55\xbe\x1f\x42\xcd\xeb\x4a\x15\x46\x46\xd6\x08\xc6\xaa\xd8\xd5\xf4\xd3\x68\x18\xcc\x29\x57\xa8\x48\xd9\x9d\xf7\xf1\x81\xb7\x45\xd9\x14\xc9\x56\x28\xc5\xe2\x1d\xef\x90\xb1\x42\x5f\x4a\xf9\xc4\x50\x62\xa8\xc8\x94\xab\x45\x0e\x18\x45\x06\x5c\x62\x62\x0a\xca\xe7\xdc\x98\xe2\xdd\x5a\x40\x08\xca\x82\x4b\xeb\x52\xed\xc6\x33\x0c\xfc\xa1\xb8\x61\x6f\x10\x8f\xcf\xd2\xad\x55\x05\xd3\x6e\x10\x82\xed\xd1\xae\x3a\x4d\xbb\x06\xb0\x79\x7d\x05\xa7\x8e\x3f\x03\x48\xae\x2f\x13\x76\x10\xa9\x28\x01\x39\x46\x6e\xaf\x62\xcb\x89\x79\x68\xc1\x29\x73\x42\xa0\x5a\xa9\x7a\x52\x2e\xe5\x61\xc0\x97\xa1\x42\x2a\x45\xa0\x3c\xe5\x13\x99\xf3\x68\x20\x50\x5a\xa4\x98\x6f\x86\x44\x2b\x29\x5f\xbd\xbf\x9c\xbb\xa3\x1d\xd9\xe3\x43\xce\xfb\xce\x43\x24\x53\x62\x78\x7c\x46\x1d\x78\xbc\x4c\xcf\x1f\x2e\x26\x53\x5d\x4c\x7e\x4e\xa9\x62\x5d\x9f\x16\x29\xf6\xd2\x76\x4a\xe0\xd6\x41\x76\x89\x2f\x05\x13\x1a\xa9\xa4\x5f\x27\xea\xe0\x2c\x7a\x11\xc9\x9f\xbd\xb6\x99\x42\x69\x79\x69\x9d\x77\xe4\x81\xb2\xf9\xe3\x69\xf7\x65\x7f\xde\xfe\x47\x49\x19\x62\x50\x50\xe9\xaa\x61\x2a\x15\x45\x25\xa5\xb1\xeb\x0f\x5f\x5b\x2d\x37\x87\x55\x34\x88\x8c\x56\xb8\xf3\xa3\xc8\x5d\x74\x9b\xde\x03\xfc\xc2\x6a\xa1\x08\x8c\x2b\xa5\xaf\xd0\xee\xec\xd6\xa8\xce\x1e\xec\xa3\x46\x88\xe1\x9b\x24\x8e\x91\x64\xcc\xa6\x74\xe0\x36\x52\x98\x0c\xda\xd4\xbc\x36\x5b\xb5\xa9\x28\x71\x8e\x35\xf3\x72\x9a\xf9\x82\xbb\xa0\x92\x3c\x78\xff\xad\x50\xd2\xbf\x02\x34\x9b\x6e\x78\x8a\xbc\xe2\x01\xef\x99\x9b\xd7\x3a\xe7\xbf\xa9\x84\xa6\x86\xe3\x6b\xbe\xb5\x62\x1e\x0d\x4c\x80\xb1\xf6\x60\xa2\xf6\x60\xda\x65\x91\x9a\x26\x92\x22\xda\x62\xad\xad\x32\x90\x5c\x65\x7a\x11\xd6\xa4\x8a\x3d\x12\xd8\x5a\x5b\x2d\xe9\xbe\x4f\x04\x96\x5f\x69\xce\xeb\x6f\xb2\x2c\xc2\x17\xe0\x15\x46\x45\x52\x47\x24\x07\x6f\xdf\xa3\x57\x54\x4c\x43\xf1\xa2\xa4\xe2\xf1\x81\xa8\x8f\x9c\xa8\x51\x61\x89\x87\xd1\xcb\xd4\x76\x7e\x73\xf8\x5b\x5e\x58\xc7\x85\xf9\x0c\x1a\xf4\xb1\x54\x4a\x1d\x22\xdd\x13\x31\x16\xcf\xc2\x81\x45\x8e\xc3\x05\x90\xd4\x49\x77\xc3\x41\x68\x1e\xc4\x34\x52\xc1\x58\xe2\x54\xf8\x5c\x24\x93\xd7\xc5\xc5\x33\x23\xb4\x17\x78\xee\xbf\xff\xb6\xfd\xe0\xba\xe7\x7a\x77\x1d\xd7\x4d\xbc\xcb\x5e\xe4\xac\x0e\x42\xec\xf1\x3e\x79\x77\x75\x66\x8b\x7b\xda\x25\xe6\xa7\xd8\x47\xed\x10\x5f\x8d\xb5\x1a\x95\x72\xd1\x03\x56\x9c\xab\x41\xd1\x4d\x52\x45\xe5\xc0\xd7\x19\x97\x4f\x25\xa5\x90\x70\xda\x2c\xff\xb2\x14\x19\x79\xb7\xe8\x2d\x5d\xfe\xf6\x6a\xfc\x35\xaa\x01\x94\x08\x88\x34\x4e\xe7\xaa\x40\xd8\x5f\x4e\xfe\xda\xe3\xb3\x55\xe6\x4d\xd8\x2c\xca\xf2\x5f\x64\x57\xa7\x7d\x90\xe7\xaa\xe7\x07\x44\xf3\xab\x30\xea\xcb\xcc\xf1\xf5\xb1\x69\x01\x87\xfc\xf4\xf5\xb7\xdf\x3e\x3f\x7d\x3f\x7f\x2a\x6d\x25\xcb\x4c\x64\x7d\xd5\x03\x39\xe5\xdb\x12\x94\xac\x0d\x32\x34\xd1\x02\xba\xed\xe8\x9e\xf6\x40\x12\x1e\xb7\xa7\x92\x95\x04\xbe\x4f\x4a\x9a\xfc\xae\xfc\x74\x25\xd1\xc9\x3b\xda\x95\xc6\xb2\x7e\x00\x05\x4b\x0f\x4d\x1f\x52\x34\x4a\x9a\x8c\xa1\xac\x37\x69\xab\x46\x97\x55\xbe\xbc\x23\x48\x36\x0b\x0f\xac\xaf\x30\x9b\x33\xe3\x2f\x64\x4d\xcc\x6e\xc6\x97\xe5\xa5\xd5\xb8\x7c\xb8\x1a\x4a\xc7\x81\x6a\x4b\xc8\x4c\x16\x51\x61\x38\xb7\x8e\xa9\x22\x86\xd1\xd9\xf5\xa8\x26\x0f\xe3\x52\xa5\x8b\x7f\xf9\xf2\xed\xe9\x05\x9c\x43\xe2\xa5\xf0\x1b\x81\x8e\xef\x2a\x86\x28\xaf\x10\x4b\x02\x34\x7b\x2a\x45\x39\x37\xca\x1f\x4a\xc5\x34\xb0\xc4\x50\xf9\xc7\x07\x74\x80\x8a\xf5\x48\xfe\xd4\xd6\x02\x29\xfe\xdf\x04\xb4\xe1\xad\x6e\xb5\x94\x87\xc6\x48\x9e\x4b\x53\x9a\x02\xd0\x9e\x5c\x7d\xed\x4a\x4c\x7b\xc6\x8f\x51\x12\x27\xb7\xb7\x65\x3f\x5b\x95\xc6\x9c\x19\xa0\x27\x2b\xb8\x3d\xed\x2c\x24\x7b\x0a\x14\xa4\xdd\xce\x40\x90\x0a\x6b\x85\x44\x7a\x57\x54\x08\x4d\x4c\x26\x02\x23\x86\x91\x39\xdb\xfc\x65\x79\x83\x94\x2c\x5a\x7f\x49\xfb\x04\xe0\x20\x0a\x8b\x19\xcc\x04\x45\xa8\x96\x35\x5d\xc7\x64\x1d\xd2\xcc\xf5\x38\x07\xfa\x15\x56\xc7\x4f\xdd\x3d\x2f\xd1\xd3\xfd\x97\xdf\xfe\xeb\x3c\x25\x05\xf0\x8a\x2c\x18\xd6\x50\xc5\x9e\x04\xd6\x6e\xad\x6a\xcb\xcb\x3a\xf0\x24\x76\xad\x44\xb9\x69\x77\x7a\x07\xce\xd5\x16\x7c\xd2\x16\xbc\x3b\xbc\xa1\xba\x37\xa2\xcf\x4d\xd1\xa5\xac\x08\x83\x6c\xce\xc8\x04\x18\x6b\x04\x92\xf2\xd5\x71\xeb\x20\x26\xe5\xda\x22\x4c\x85\x6e\x32\xfc\x79\x52\x5e\xb5\xe6\xb2\x28\x95\x6f\xef\x23\xe4\x2a\x55\x69\xeb\x20\x71\x9f\xa9\x13\x89\x55\x04\x93\x0e\x6f\xa8\xfc\x46\x6d\xc0\x3b\x6d\xc0\xd3\x93\x16\x0c\xd6\x52\x69\x4b\xf3\xbe\xbe\x89\xaa\x33\xb0\x76\xe0\x58\xad\xba\xa8\x14\x3d\x0a\x10\x69\x3b\x9e\x45\xad\xdb\x4c\x44\xf4\x94\xa9\x2a\x57\xff\x92\x03\xb2\x5d\xb1\x3d\x0c\x8b\x80\x01\x54\xf3\x02\xe9\xe1\x02\xa9\x73\x0b\x24\xc5\x11\x6b\x5e\x9c\xa4\x86\x2b\xa4\x4f\xaf\x50\xae\x1c\x28\x67\x4a\xcd\x28\x41\xf6\x03\x56\xcc\x29\xa9\x53\x2b\xa4\xa4\x90\xd5\x70\x85\x5a\x78\x1f\x50\xc3\xf1\xa8\x5c\x3b\xb4\x3c\x7d\x33\x47\x45\xba\x84\xdc\xff\xfe\x5b\x7d\x09\xbd\x9d\x92\xb8\xd0\xa4\x3c\xeb\x99\x49\xa5\xf9\x98\x73\x4f\xc2\xe9\x42\xac\x23\x78\xa3\xb8\xb9\x37\xa8\x0c\xe6\x3d\xc4\x28\xf2\x10\xfc\x54\x92\xb9\x47\x29\xf5\x1e\x52\xed\xc0\x45\x5e\xa4\x39\xec\xf3\x32\xa6\x21\x38\x96\xfa\x88\xe6\xa0\x47\x60\xf4\x08\xfe\x5e\xa6\xa8\x08\x6b\xbe\xc4\xd7\xfd\x99\x85\x3b\x22\x46\xf9\x8a\x97\x82\xf1\xf7\x3c\xb5\xa8\x8e\x6d\x07\x0b\x57\xf7\x53\xfd\xf5\x1f\x7f\x6d\x2a\x5f\x9d\x17\x40\x25\x91\x39\xaf\x45\xdc\x6b\xdc\x60\x3e\x4f\xe8\x1d\x28\x48\xfd\x11\x45\x10\xcd\x4e\x4b\xbe\xc0\xf1\x13\x1a\x59\x7e\x4e\x46\x05\xb0\x21\x37\x2d\x4a\x20\x33\xe8\x92\x12\xa0\xd9\x0e\x2b\x7f\x32\xf6\xbb\xa8\x11\xc1\xd1\xe3\x83\x3c\xc1\x9c\x23\x94\x11\x2c\xc3\xce\xb2\x54\x6f\xdb\xd3\x34\x39\xde\x4b\x76\x87\xe0\x53\x2d\x75\x78\x63\xd8\x26\xa0\xa0\x52\x5b\x5b\x2e\xe7\x9a\x67\x7a\x32\x7b\x1e\xdb\xd3\xc1\x9c\x14\xa5\xca\x60\xa8\x75\xae\x45\x86\x0e\x92\xe5\x99\x8c\x49\x18\x2c\xcf\x21\xac\x26\x9e\x50\x62\x24\x35\x08\xbc\xc5\x46\x88\x6e\xcf\xec\x67\xa7\x69\x4f\x60\x4b\x0f\x45\xec\x1b\x23\x14\xed\xc8\x80\x1b\xda\x27\xd6\xc4\x84\x5f\x9f\xb6\xf5\x79\x43\x8d\x97\x32\xea\x08\x88\x65\x80\x68\xef\xa3\xc2\x02\xc8\x6e\x24\x5e\x5d\x9a\xd6\x34\xc1\x50\xb4\x3b\x28\xc2\x36\x30\x03\x93\xa6\x95\x74\x82\x14\xcf\x14\xcb\x14\xe6\xa6\x68\x82\x8e\x8b\x04\xde\x6e\x12\xaf\x46\xca\x4b\x22\x77\x1c\xa0\x57\xb4\xd3\x50\xa4\x4d\x02\xe2\xf5\xec\xb6\x71\xd1\xc2\x90\xe5\x19\x74\xb9\x69\x00\xc5\x8c\x1e\x13\x24\xa7\x22\xaf\x71\xcc\x0b\x2d\xfd\x48\xd1\x43\x64\x19\x8c\x45\xd2\xb6\x96\x9c\x86\x88\xc2\xfa\x59\x0a\x63\x62\xc3\x76\x63\x3d\x4c\x7b\x35\x7d\xa4\x00\x61\x52\x52\x09\xd6\xd1\x3d\x8b\x58\x7e\x3b\x06\x63\x00\x24\x16\x88\x5c\x0b\x48\xa6\x9c\x4e\x36\x74\x10\x14\x35\x85\xf8\x0a\xd7\xb4\xed\x66\x16\xa4\x6c\xfa\x00\x58\xcc\x4b\x98\x73\x26\x01\xe4\x76\x7c\x2f\x59\xe9\x6f\x0c\x48\xde\x40\xad\x12\xea\x6d\x9b\xdc\x07\xf3\x30\x01\x9f\xcd\x4d\x03\x5b\xbd\x5e\xe1\x6d\xa9\x5d\x4b\x16\x6c\xd8\x6b\xf0\xb4\x1d\xe1\x85\x46\x56\xc8\x35\x01\xb2\x96\x82\x5e\x79\x38\x64\xea\xb4\x60\xa3\x32\xb6\x34\xbc\xcc\x31\x2a\x69\x5a\x9e\x62\xbd\x4e\xe0\x8c\x64\xaa\x37\xa2\x16\xda\xb8\xed\x2f\x7a\x66\x27\x11\xf8\xa6\xef\x78\xc9\x4b\xcb\x43\x7c\x89\xb0\x77\x97\xff\x76\x7b\x14\x36\x13\xb2\xd5\x5a\xd8\x4c\xc7\x65\x30\x73\x99\x0d\x65\x0b\x76\x6c\xa5\x11\x19\xd8\x72\xdb\xde\x31\x5d\xff\xdb\x1f\xdb\xff\xfc\xcf\x2f\x4f\xe7\x4d\xb0\x1e\x9c\x55\x54\xb0\x10\x05\x31\x76\xd0\x12\xab\x36\x44\xf1\x7b\x0c\xae\x46\x90\xdc\x6a\x9b\xfe\x23\xcd\x09\x43\x00\xcf\xd2\x16\x31\x1d\x13\xdd\xcb\x45\xb2\x87\x8f\x65\xcb\x0a\x49\x69\x4f\x71\x2f\x0a\x5e\xd2\xc9\xb1\x7c\x3e\xfa\xde\x61\x2c\x2b\x72\x59\x0a\xd2\xdd\x70\x40\x2c\x01\x07\xbf\xd3\xe0\xe2\xe8\x06\xcb\xd2\x73\x8e\xb2\x5e\x42\x65\x16\x71\x0a\xa6\x3c\xbf\x85\x28\xb9\x79\x5b\xf8\x3a\xee\x38\xe1\x41\x4a\xe2\x3f\x64\x2c\xe3\x71\xae\x66\xec\x25\x49\xfa\x80\xc3\x95\xe6\xc5\xe1\x15\x12\xef\x56\x46\xce\x92\x02\x38\x73\x0a\x2e\xbc\x66\x2c\xb4\x4a\xe1\x57\x49\x35\x18\xfb\xf4\xd5\x7e\x87\xb1\x41\x5f\x70\x7d\x9b\xef\xae\x6f\xc1\xe5\xcd\xe5\x56\xcb\x78\xd1\xe0\x4b\x08\x49\x8e\x7d\xc2\xd1\x1a\x66\x1a\xc1\x53\xbd\x6f\x06\x8b\x7b\xf8\xc6\x8c\x51\x9d\x0a\x26\xef\x0b\x67\xc6\x4b\x56\x0b\xf7\x74\x60\x31\x5e\x74\x9d\xb4\x35\xbc\x0f\x48\x93\x37\x39\x56\x85\x58\x9e\x49\x65\xc8\xea\x86\x61\x01\xd4\x50\x27\x59\xa3\xd1\x0e\x6c\xdc\x8c\xee\x30\x2b\x8b\x0a\x59\xf6\x4a\x78\x2f\xa5\x7c\x91\xb6\x52\x43\x24\x1e\x84\xde\x08\x9e\x74\xdc\xb1\xd4\x12\x59\xc7\x8a\x87\x88\x26\xcf\x12\xa2\x01\x4a\x3b\x71\xd2\xc0\x42\xec\xb2\x45\x9b\x51\x46\xb6\x20\xee\x9f\x9c\x88\x90\x1b\x2c\x24\xff\xab\xb4\x19\x74\x41\xb2\x78\xba\xad\x8c\x24\x1c\x44\x4b\x91\x27\x59\x2a\xa3\x90\x9b\xf6\xf1\x22\xca\x9d\x92\xd5\x87\xb0\x71\x10\x78\x42\xe1\x10\x79\x23\x15\xbb\xed\x08\x44\xb9\x6c\xf8\x1c\xe5\x29\x5c\xb2\xb4\x7d\xfe\xbd\xfe\xfa\xcf\x93\x6c\x77\x06\x63\x6b\x4a\x0e\x91\x14\x5e\x19\xc9\x83\x11\x9c\xa9\x75\x64\x30\xa5\xa1\x11\xdb\x70\x73\x2f\xab\x68\x7d\x85\x06\xc6\x89\xd5\xfb\xd6\x6c\xfe\xfc\xe3\x2f\xa7\xb1\x6c\x06\x0f\xcc\x39\xd9\x98\x7f\x63\x01\xc1\xd4\x9a\x95\x59\x0c\x3d\x23\x0d\x38\x88\x61\x8f\xfd\x69\xc8\xa5\x5a\x9e\x74\x83\xa3\xb8\xa2\x4e\x7a\x74\x11\x98\xd4\xc2\x5e\xf7\x3f\xa0\xf3\xc5\x5a\xcb\xd3\xa1\x6f\xa3\x3f\x0c\xe5\xf1\x01\x79\x5f\x85\x22\xd6\x3a\x68\x5b\xb1\x26\x60\xeb\xa0\xec\xe3\x03\x92\x22\x16\x4c\xa3\x14\x32\x8e\x21\x57\x18\x66\x7d\x54\xf6\x73\x16\x11\x1f\x9f\xa3\xf2\x50\x24\x1d\x94\xad\x88\xe4\x55\x6d\x27\x01\xec\xbc\x91\xec\x3d\x2d\xeb\x79\xab\x57\x63\x0d\xb6\x3e\xc3\x71\x60\x6f\x2b\x78\x88\x3e\x2a\x77\x2f\x30\xac\x13\x20\xaf\x01\xf9\x6b\xfa\x34\xb9\x4f\x52\x14\x06\xfd\x65\x3c\xb9\xe7\x65\x34\x60\x3d\xe3\xc0\xbd\xd4\x45\xa7\x78\x4d\x77\xf6\x97\xf6\xa8\x48\x3e\x5b\x47\x70\xda\x42\xf4\x47\x48\x57\x71\x57\xa9\x41\x69\x37\xec\x72\x40\xf4\xe5\xe7\xfa\xcb\xff\x5c\x83\xe6\x65\x2f\x41\x23\xfb\x5d\x82\xce\xa7\xdb\x26\x8d\xe0\x79\xa4\x89\x99\x75\x30\xed\xdd\xc6\x00\xca\x1a\x45\x02\xc3\x78\x0c\x89\x36\x87\x57\xd5\xe1\x83\x6b\xd1\xba\x81\x9c\xd2\x80\xa5\x89\xe3\x21\xca\x09\x5a\xc1\xdb\xc1\xf1\x08\xd1\x40\xb0\x0a\x5d\x7f\x7c\xbd\xcf\x5d\x3b\xc0\x06\x8b\x30\x31\xc7\x37\x05\x90\x99\x06\xc3\xe2\x30\x42\x2a\x40\x5e\x2d\xd2\x60\x8c\x87\x2f\x5e\x3b\xc6\x16\xf5\x9a\x52\x5c\x90\xec\xc9\x31\xf2\xa6\xa8\x0d\xef\x9a\x63\x28\xe2\x3d\x26\x90\x54\xc8\x71\x03\x31\x75\xd5\xf5\x55\xef\x93\xd7\x0e\xd2\xfd\xd2\xd9\xbe\xbc\x62\xfd\x71\x2b\xe6\x3e\x69\x1a\x55\x50\x6a\xed\x3b\x23\xa9\x9f\x8d\x42\xb7\x23\x90\xa2\x1d\xd6\x30\x25\x85\xad\x03\x2f\x76\xb2\x96\x71\x38\x1d\x01\x6d\xc9\xab\xed\x6b\x8d\x8a\x76\x1e\x88\x36\xad\xe7\x67\x77\xb8\xdd\x75\x79\xed\x1c\x5a\x66\x4b\x2c\x88\xb1\xee\xc1\xf2\x8d\x33\xca\xb5\x91\xcf\x05\x33\x1b\xcf\x6a\x4c\x99\xc0\x20\x4f\xd1\x2a\x69\x5a\xb1\xc9\x49\x32\xaf\xa0\xc6\x83\xcc\x55\x48\x9c\xad\x2d\x90\x67\x1d\x7b\x58\x50\x23\x24\x0d\xe9\x5e\xfc\x5c\x0b\x88\x76\xe3\xf8\x1b\xae\xf5\x71\x96\xf3\x75\xa9\xf4\x36\x1e\x4e\x12\x71\x4b\xca\x77\xb0\x5a\x65\xad\xf2\x0d\x24\xad\x92\xa6\x33\x90\x29\xcf\x44\xee\xc0\x44\x25\x4d\x73\x43\x62\x53\x8c\xdd\x31\xf2\xd4\xa8\xc5\xc7\xda\x1a\x9e\x58\x54\xd2\xb4\x13\x23\x62\x8e\x2d\x98\x84\x8c\xdd\xbc\xf5\xb0\x50\x64\x59\x4e\xb4\x5d\x1c\x04\xa0\x83\xc0\x33\x77\x21\x37\xff\x3f\x7b\xef\xde\xdc\x4a\x72\xe4\x87\x7e\x15\x9a\x7f\x38\x56\x11\x55\xb9\x9d\x59\xef\x71\xe8\x0f\xe8\xc8\x6b\xec\xbd\xe0\x4a\xde\x91\xe0\x1b\xf4\xde\x70\xf4\x80\x9c\x01\x3d\x20\x79\x96\xe4\x81\x34\xda\xd8\xef\x7e\x23\x7f\xd5\x0d\x74\x37\x00\x9e\x03\xf2\xcc\x58\xd7\x96\x46\xa7\xd8\xa8\xae\xae\x67\x56\x56\x66\x56\x3e\xfa\xad\xe2\xc9\x3b\x78\x2f\x57\x4a\x50\x64\x74\x58\xa5\x42\x65\xe3\xa9\xd1\x89\xe1\x83\xb1\x0f\x96\xe3\x6b\x9c\xa4\xa2\xcc\x3b\x17\x8a\x4e\x17\x37\x40\xfe\xba\x5f\x5c\xaf\x47\xc5\x5c\x91\x51\x6c\xbd\x52\xcc\x7e\xa7\xed\x8e\x85\x85\x30\xa3\x49\x35\xe9\x36\x20\x5c\xa9\xb3\xdb\x28\xd1\x6c\x53\x1f\xab\x26\x3a\x2b\x8a\xba\x02\x39\x45\xa8\x10\xaa\xc4\x76\x40\xe5\x77\x9b\xd3\x2d\x12\x65\xe8\x4f\xb8\xdc\x0a\x84\x97\x95\x3a\xc7\x91\xa2\xbc\x8c\x18\xd1\x65\x96\x81\x20\x95\x62\x30\xac\x1b\x89\xd9\x14\x0a\x47\xaa\x55\xcc\xd9\x0b\x4d\x1b\xc2\x95\x05\xeb\x36\x13\x05\x0e\x9d\xde\xe1\x26\x93\xf9\x30\x76\x0d\x15\x0a\x71\xe1\x70\x08\x34\x94\xcb\xf8\x0b\x13\x8c\x7e\xa1\x20\x17\x00\x73\x6e\x07\x73\x87\x85\x14\x3e\x87\x27\x64\x71\x56\x3f\x83\x13\xfb\x4c\xa2\x80\xde\x09\xdf\xf7\x8b\xdd\x2f\x0f\x94\x0a\x12\xfc\xbf\x87\x34\x1b\x8f\x30\xe3\x6e\x88\x37\xba\xdb\x72\xde\xbf\x64\x28\xef\x43\x8b\x11\xf2\xd8\x3c\x9a\x19\x65\x5e\xa3\x55\xa6\xea\x4a\x0a\x6a\xf0\xf5\x9c\x4e\x83\x72\xdc\xdd\xc0\x04\x07\xb2\x72\xf2\xaa\x5b\xb3\x57\x8e\xf5\x7f\xd8\xb4\xcf\xaf\xc8\xc8\x41\x9a\x09\xf8\x12\xc1\x02\x65\xbf\xf4\x6b\x9e\xea\x92\xc9\x84\xd0\xe3\x25\x8a\x2e\x3c\x05\x28\x9c\xbb\x38\xf3\x24\xc5\x20\xe9\xa7\xdc\x09\x65\x05\xd8\x2e\xa9\xd9\x19\x78\xd7\xcf\x25\xb7\x9e\xc4\x1b\x24\xdd\x64\x2b\x56\x8a\x94\xaa\xd8\x3c\x07\xe3\xb8\x15\xe5\xfc\xa4\x5e\x56\xd4\x28\xbc\x3c\x57\xb8\x04\x10\xf6\x79\xba\x55\xa1\xfc\x27\x4a\xd6\xc9\xde\x2e\x82\xa4\x58\x21\x4e\x1b\x45\xe9\xde\x1b\xf6\x40\x6f\x0e\x98\xa5\xa1\x90\x16\x5c\x5d\x1b\xc5\xa5\x5f\x47\x78\xe1\xd4\xc3\xb5\xc2\x7f\x13\x66\x30\x5a\x90\xfe\x02\x96\x4d\xdf\xad\xaf\x76\xcd\xcf\xca\x6a\xea\x3e\xef\x66\xbf\x1c\x9f\xfd\x03\x81\xfa\x9c\xdd\x12\xc5\x75\x05\x32\x56\x80\x47\x26\x02\xd8\x38\x29\x1b\xa7\xeb\xe2\x8c\xdf\x5f\x22\x43\xc2\x28\x89\xb2\x2e\xd9\x10\xa3\x34\x55\x80\x87\x35\x1b\x7f\xb2\xef\xe6\xf5\x55\x37\x61\x65\x37\x61\x65\x21\x10\xbc\x8a\x9b\xeb\xec\xbc\xed\xb6\x7d\xac\xef\x7e\x73\x7f\xf7\x70\xf7\xfc\xf2\xd4\xbe\x3c\xbe\x12\xbe\xd2\xc3\x1a\x48\x19\xa0\x36\x52\x8a\x06\x49\xdd\x15\xfa\xa8\x90\x14\x66\xca\x44\x9b\xb8\x93\x24\x98\xc1\x57\xd7\xf7\x0d\x6e\x69\x74\xe2\xea\x3d\x55\x1f\x48\x63\xf7\x7b\x36\x7c\xd3\x54\x11\x2d\x2c\x6f\xce\x71\xa6\xff\xba\x4c\x3d\xe2\xc8\x62\x8a\x79\x56\x03\x44\xec\xc5\xd2\x1c\x28\xc3\xf4\x6f\x29\x1e\x67\x54\x65\xf6\x90\x76\x25\x58\xb9\x3b\xed\xd3\x06\x22\x82\xf1\xc6\x30\x7a\x00\x30\xe5\xb0\x21\x16\x4b\xcc\x2b\x8b\x8b\x27\xcb\xb6\xdb\x31\x51\x1f\x66\xda\x87\x64\x6a\xda\xc1\x97\x56\xa3\x74\xce\x10\x0d\x0b\xc5\xe5\xd8\xfd\xa7\xc2\x61\xa4\xaf\x26\x3b\x97\xca\xc6\x46\x92\xd2\x92\x4b\xd5\xe4\xac\x27\xd5\x1a\xa5\x59\xfa\x93\xbd\xb1\xc8\x3a\x65\xc3\x7d\xbe\x6c\x11\xb6\x54\x88\xaa\xb2\xb1\x62\x29\xf2\x44\x32\xde\xc0\xc7\x0c\x94\x92\x15\x19\xe7\x38\x23\x97\xf7\x48\x0d\x51\xc1\xa1\xa9\x8e\x90\x45\xa1\x25\x37\x30\xe5\x21\xef\x2d\x35\x88\x68\xa4\x98\x65\x72\xb9\x04\xbd\x65\x3d\x87\x78\xa3\x89\x95\xc9\xc7\x4e\x8f\x08\x3f\x17\x07\x29\xf7\xf8\x55\x00\x29\xaa\x64\x9d\xb4\xc9\xa4\x7d\x7d\x5e\x09\x30\xa6\x2c\x96\x5b\x2d\xe6\x76\x52\x3f\xaf\x7c\xd4\x82\x13\xc5\x62\x58\xe7\x79\x3f\x0c\x05\x06\xf2\x7e\x83\x9b\x2e\x99\x6c\x9d\xa6\xaa\xe3\xd7\x00\x71\x86\xe2\xa4\x2b\x12\xc9\x85\xad\x28\xd2\x1c\xb6\x67\x38\x1a\x89\x1b\xfd\x80\xf7\x3d\x34\x14\x4d\x55\xf0\xd6\xa6\x0a\x8f\xea\x32\xe8\x85\xdb\x70\xbd\xf3\xc4\x64\x0e\xa6\x5a\xc7\xd6\xa4\x0d\x53\x4e\x56\xa7\xb2\x29\x26\xf5\xb7\x64\x90\x34\x50\x48\x1b\x8a\x46\x26\x9f\x61\xae\xd6\xda\xc1\x21\x6c\xe1\x85\xf6\x7e\x83\xa9\xd7\xb7\x4a\x98\x82\x3a\xdd\x55\xe9\xb2\xd5\x4a\x59\x19\x95\x69\x5f\x75\xe5\x9a\xb4\x70\xe0\xad\xfc\x78\xec\xc8\xdc\xe0\xf4\xce\x79\x38\x7a\x80\x92\x2b\x9b\x0a\x69\xe3\x0a\x95\x22\x70\x61\x29\x4a\xdd\xcd\x46\xaf\x06\x40\x7a\x7d\x25\x5e\x4f\x22\xc9\xad\x23\xa7\x34\x3f\xcc\xa7\x18\xf7\x91\xce\x29\xdb\xe5\x66\xc3\x37\x38\xbc\xba\x4f\xde\x29\xd7\x1e\x98\x41\x29\x36\x4c\xd5\x12\x2a\x93\x83\x2d\xd4\xd4\xca\xff\x4d\x5a\xbd\x0a\x85\x8a\x13\xb3\x28\x05\x1a\x40\xc6\xf7\xd4\xad\xcb\x56\x28\x84\x0d\x05\x87\x99\x6d\x8a\xd5\xc1\x1e\xe0\xce\xca\x5f\x7a\x9d\xc8\x54\x5a\x90\x71\xb2\xbf\x1c\x55\xa2\x49\x97\x5b\x57\xb5\xd6\x60\x29\xe8\x66\x81\x02\xa1\xec\xef\x2b\x15\x3c\x44\x69\xde\xca\x9b\xf2\x4e\x6c\xdc\x58\x21\xa7\x58\x35\xce\x18\x04\x23\x0f\xc8\x46\x60\xcf\x26\x6d\x95\x60\x1c\xab\xe9\xcf\x31\xb8\xaf\x64\x32\x9c\xb4\x19\x1f\x2b\xca\xd2\x43\x50\x69\xdf\xe4\xc6\x18\x4b\x3a\x8c\x35\xc1\x03\x4d\xb2\x60\x81\x7a\x9c\x15\x27\xa8\xa0\x02\x36\x90\x48\x00\xce\x4a\xde\x20\x19\xe1\xac\x3d\xca\x1a\x7e\x0b\x94\x15\x80\xb2\xfc\xf4\x55\x8f\xb2\x8c\xb4\xb0\xe7\x8c\xfb\x1b\x09\xed\x0a\xd0\x20\x53\x66\x20\xae\x51\x87\x94\x23\x43\x7f\xc1\xd3\xf8\xd1\x36\xd6\xbe\x0e\x50\x57\x52\xa2\x32\xed\x29\xcb\x8a\xba\xb2\xab\xa8\x8b\x4f\xe2\xae\x83\xbd\x48\x2e\xf4\xc8\x4b\x29\xdb\xb4\x27\x6f\xc7\x28\x6c\x82\x53\xd0\x19\xf0\xa6\xd1\xb8\x29\x26\xaa\x03\xf9\x3c\x02\xab\xfd\x19\xe1\xb0\x38\xc0\x61\x63\xe4\xd6\xe1\xb0\x1e\x85\xc5\x6c\x62\x4f\x06\x1f\x43\x61\xe3\xfe\x28\xe2\xef\x50\x58\x98\x56\xdd\x44\x9d\xfa\x1d\x16\x9b\x62\x47\x0a\x49\x71\x59\xde\xe1\xb2\x42\x6e\x37\x45\x92\x7a\x5c\x96\x65\x46\x9e\x06\x86\xe6\x1d\xe8\x5e\xdf\x5b\x48\x5f\x3c\x25\x39\x89\xca\xfc\x51\x54\x96\x8c\x64\x3a\x61\xd2\xfc\x59\x85\xfb\xb1\xe4\xb3\x7d\xba\xf9\xed\xd3\x6b\xb6\x3e\xce\x9b\x3c\x71\xb9\xfe\x59\x4b\xd7\x69\x4c\xfb\xeb\x2b\x27\x7b\x67\x6b\xcb\xb3\xf0\xf0\x31\x74\x39\xc0\xc3\x91\x84\x2b\x1a\xe6\x86\x24\x00\x11\x33\x1e\xde\x43\x97\x0d\x1a\x50\xbe\xe7\x9d\x2d\x1c\xa3\xbf\x8e\x0e\x01\xf1\xd5\xde\xd0\xc0\x67\xce\xaa\xc1\x10\xde\xda\xc2\xeb\x76\x35\x0c\x01\x45\x56\x56\x6d\x28\x6a\xe4\x6a\xfd\x5d\x6c\x97\x99\x7d\x4d\x3a\xdc\x53\x98\x18\x61\xe5\x38\x12\xc7\x56\x60\xb6\xa0\x49\x77\xfc\x04\x28\x5d\x54\x40\x62\xf0\xbf\x10\xe6\xf8\x9a\x74\x85\x1a\xdd\xdd\x50\xc7\x49\x7a\x1e\x39\x0a\x0e\xa2\xcd\x7e\xfb\xef\xbb\xf6\xb5\xae\x6f\x19\x2a\x6c\x02\x11\x34\x44\x90\x69\xe7\x67\xcb\x26\x8a\x01\x89\x49\x14\xba\xa4\x67\xc7\x93\x95\x05\x14\x25\x38\x10\xf4\xdc\xbc\x29\x03\x34\x9d\xc0\x7c\x16\x04\x47\x8a\x71\x96\x74\x8c\x69\x3f\xd0\x41\xab\x6f\xbf\xe9\xbc\x38\x30\x6d\xc0\xbc\xe5\x41\x98\xbd\xc6\x52\xb6\x94\xe7\xe2\x29\x46\xed\x65\x34\x65\x67\xcb\x6f\x71\x5d\x94\xa1\x88\xe4\x62\x4d\x76\x04\x41\x56\x0e\xa2\x0a\xdc\x82\x6f\x95\xc9\x36\x69\xaf\xeb\x2c\x8a\xa5\x67\x93\xf9\x02\xe7\x9f\xe6\xd2\x8c\x82\x35\x56\xb4\x1d\xd7\x91\x06\x01\x0d\x1b\x33\xe8\xee\x19\x33\x70\xd4\x1d\xfa\x79\xde\x23\xa7\xd8\xec\xd0\x1d\xe4\x55\x0f\x7f\x1b\x1d\x3b\x79\x69\xc7\x70\xaa\x67\x74\xa6\xb0\x83\x65\x54\x63\xc6\x00\x8f\x8b\x56\xa5\x3a\xaa\x31\x13\x24\xba\xc3\x0d\xc3\x86\x0a\x5b\x04\xf2\x18\x6d\x31\xb6\xbb\xdf\x13\xe8\x67\xd3\x77\xeb\xfa\x2a\x20\x90\xf8\xac\x57\xf5\x08\x3b\x51\x70\x83\xf5\x0d\x66\xf8\xa6\x2a\xab\xe9\x07\xd7\xf7\xd0\x16\x6a\x62\x3b\xfd\xb2\xd7\x0c\x0a\xb3\xa3\x5f\x4a\xa6\x26\x5e\xdf\x73\x83\x60\xf4\xc9\xcd\x8a\x2e\x5e\xe9\x0d\x64\xa0\x5d\x50\x77\x82\x4e\x59\x20\xaf\xe4\xc0\x70\xc7\x28\x6d\xa2\x9b\x7f\xbc\x0f\x9a\x2a\xa6\x33\x42\x21\xad\x21\x38\x40\xe7\xcb\xbe\xf5\x6e\x9f\x24\x72\xee\xfa\x9e\xc5\x66\x4a\x6b\x1b\x29\x1c\x04\x92\x9c\xcb\x74\xfb\x36\x36\xe9\x91\x1e\xa9\x03\xdc\x1d\xf4\x36\x4a\x3a\x81\x74\xeb\xae\x0e\xda\x31\xf8\xb3\x11\x50\x19\x4e\x66\xe3\x0d\x83\xd3\x1a\x97\x14\x6b\xa1\x14\x0f\xa2\x77\x5e\xdf\x3b\x25\x19\x0a\x79\x77\xc6\x04\xbb\x86\xf2\x6e\x86\x1b\xcb\x89\xc2\x39\xeb\x53\x3f\xe7\xe6\x44\x88\x92\xf3\xe4\x55\x3b\xfa\xe1\xb7\x77\xcf\x3f\x3e\xbf\xa2\xad\x66\x02\x25\x3f\x63\xdc\x20\xee\x48\x69\x9d\x1e\x89\xc6\xcf\xdd\xd1\x97\xf8\x66\x29\x8d\x62\x8e\xe9\x4b\xdc\x45\x8a\xcc\xfd\x32\xce\xe5\xbd\x0e\x59\x07\xaa\x39\xa6\x1c\xed\x4a\xd6\x7e\xe6\x79\x3a\xf6\x32\xe2\x1b\x08\xaa\x0e\xfb\x09\xbe\x41\xe2\x3c\x2f\xb9\x99\xbb\x53\x01\x03\xdf\xa4\xa0\x16\x61\x80\xc6\xc7\xba\xc4\x70\x16\xa2\x9d\xca\xc7\x3a\x85\x8f\x8c\x6b\xe6\xa8\xe6\x70\x6e\x7d\x1d\xf0\x92\x8f\xae\x4b\xdf\x76\x4f\xd5\xb1\x2c\xd9\xcf\xdf\xa3\xfe\x78\x31\x75\x83\x50\x3c\xf4\xa3\x72\x2b\xba\xf3\xa5\x6e\x7f\x18\xd3\x52\xb2\x42\x51\x99\xde\xa8\xcc\xea\xee\x6a\x6a\xf0\x91\x6e\x0a\x47\x39\xe9\x9e\xf0\x50\x6c\xeb\xef\x12\x3a\xa3\x0d\xf8\xd7\x51\x4e\x6a\xaf\x65\x8e\xaf\x59\xe9\xa4\xaf\x66\x17\x5d\xab\x8c\xb0\x3d\xa0\xa2\x74\x7e\xe9\xf1\xb2\x9e\xf3\x70\x5b\xa3\x7c\x62\xe2\xa5\xc8\xda\x2b\x0a\xa4\x44\x7b\x9d\x26\xc4\x42\x8a\xe4\xb8\x8d\xe4\x94\xbb\x75\x3d\x77\x1b\xc9\x25\x1b\x28\x29\x07\x19\x72\x4d\x76\xdf\x64\xe2\xb4\x51\x66\x97\xc9\xa5\x99\x57\x9e\xd8\xf7\x8c\xf1\x6e\xa0\xf1\x3c\x1d\xbf\xcf\x79\xad\xd0\x99\x4f\x24\xa9\x85\x44\x37\xee\x44\x95\xb8\x3b\x54\x36\x06\x03\x2d\xae\x0d\xa6\x17\x66\xe8\xc2\x60\x12\x0a\xd7\xa4\x66\x43\x93\x43\x37\x3e\xc7\x9a\x0c\xc8\xbc\x54\x16\xec\x28\x3a\x23\xcd\x40\xe2\x07\x9d\xc6\x19\x34\xbe\x63\xaf\xfc\xb6\x03\x87\xf4\x15\xd5\xf6\x7e\x69\x1c\xf6\xc6\xf0\x81\xbf\x2c\xfe\x7a\x93\x33\x8e\x82\x8b\x2d\x21\x6d\x2d\xc0\x90\x3c\xf4\x67\x62\x36\x52\x95\xe3\x21\x63\x88\xfb\xd5\xec\xbe\xf8\x1a\x36\xe6\x7f\x1d\xb8\xb3\x8e\x89\x75\x7e\x95\xfb\x07\xcb\xcf\x3b\x8a\xce\xe1\xa6\x85\x95\xfb\x0f\xc6\xed\x1d\x5c\x0d\xbe\x82\x7f\x2c\x65\xa1\xda\x54\x6d\x01\x4a\xaf\xfb\x90\x6d\xd2\x4d\xa4\x94\x72\x4d\xba\x4d\xc4\x15\x05\x6e\x98\x52\x20\xd7\x06\xa5\x5f\xc2\x40\x18\xc4\xf5\xfe\x88\x73\x4d\x3a\xe8\x20\x81\x26\x1d\x3c\x74\xd5\x90\xfe\xfd\xe6\x86\x75\xe4\x5a\x88\x67\x4a\x8b\x18\x24\xc3\x6e\x4a\xa6\x9c\xea\x85\x66\x81\x17\x34\xe5\x2a\x5c\xd4\xdd\xe0\xfd\x5a\x71\xd5\x2c\x12\x17\x13\x7b\x15\xfd\x7e\xa5\x61\xf4\xed\xb5\x59\x3f\xc0\x6c\xac\x04\xb6\xad\x32\xbb\xd4\x66\xc5\x0e\x79\x28\xd6\xcc\xd1\x2a\x7d\xb9\x37\x11\x84\xd2\x29\xaf\x75\xca\x87\x1a\xcf\x9d\xa6\xc3\x97\xc2\xd2\x6b\x8e\x00\xfe\x69\x79\xf5\x8a\x97\x94\x64\x44\x8f\xc6\x83\xf8\xa1\x93\xa0\x77\x53\x7e\x43\xc2\x90\x23\xd1\x4a\xa0\x0a\xc9\x7e\x2e\x61\x9b\xe7\xef\x36\x6a\x99\xc4\x72\x88\xc7\xa2\xb9\x9c\x11\x93\xed\x35\xdf\xf3\xfb\x78\xd5\x71\x18\xac\x3a\xbd\xa9\xa1\x57\x37\x75\xa0\x6c\xf2\x1c\xda\xa0\xcb\xb8\xb6\xcc\x8b\x44\x49\x39\xea\xf1\xf5\xb1\xad\x2a\x21\x63\xbf\x39\xcd\x42\x4c\xe7\x76\x92\x99\x46\xce\x65\xaa\xbf\xd8\x49\x05\x5f\x8d\x46\x90\x82\xfb\x2b\xaf\x94\xce\xb4\x4f\xc3\x46\xa1\xc8\xb2\x70\x0d\x21\x64\x01\x4c\xad\x5d\x43\xd5\x81\x56\x3b\x29\x37\xb4\xa8\x26\x08\x6d\x87\xbf\xd9\x92\x94\x85\x22\xa9\x42\xcd\x7b\x1d\xab\xec\x00\xc9\x55\xf7\xc7\xf9\x9d\x90\xf4\x5a\x08\xb6\x32\x6d\xe2\xcd\x60\xf4\x9a\xf6\xf7\xb7\xdf\xfe\xf6\x9d\xa1\x26\x3e\x2f\x2c\x50\x96\x5a\x3a\x51\xe8\xdf\xe4\xa0\xff\x5b\xc9\x41\xa1\xc5\x17\x65\xc5\xe4\x44\x4f\x73\xa6\x52\xf5\xd9\x95\xc0\x65\x12\x79\xb6\x14\x1c\x4c\x70\x6c\x47\xfa\x34\x65\x60\x26\x2d\xba\x41\x99\x98\x37\x96\xb2\x12\x40\x4d\xdc\x91\xcc\x10\xa5\x8a\x52\xf5\x7e\x55\xcd\x97\xd9\x32\x52\xa1\x20\xcf\xd5\x33\x80\x50\xa3\x49\x4e\xb0\x8b\x5c\x55\x7d\x1f\x72\x96\xa9\x88\xa5\xe0\xeb\x03\x93\xf0\x81\x58\x40\x3b\x1f\xda\xa9\x77\x55\x01\x52\xdc\xe0\x52\x8a\x78\x06\x8d\x1b\xbf\xbf\xec\xab\xb4\x52\x2c\xda\x92\xd2\x38\x16\x83\x0b\xd6\x19\x21\x5f\xbe\x05\xd5\xc9\x55\x6e\xd7\xcd\xcd\x57\x93\xc2\x82\xb0\x91\x46\xb9\x8a\xaf\x31\x81\xdf\x72\x51\x2e\x89\x21\xbc\xe5\x0c\x2d\xf5\x78\xde\x04\x26\xa5\x56\x3e\x3b\x87\xad\xa7\x10\x0d\x92\x8a\xee\x1d\xb1\x60\xf5\x30\x89\x6e\x3a\x89\xcf\xac\xd4\x91\x18\x01\x11\xa5\xab\x7a\x12\xba\xbe\x85\x3d\x72\x9d\x14\x33\x98\xa0\xaf\x26\x30\x2e\x54\x0c\xe7\x95\xb2\xe1\x10\x52\x16\x81\x1a\xa9\xf5\x14\x3d\x9e\xd6\x56\xa8\x6c\x33\x09\x3c\x09\x7d\x10\xdc\x3d\x36\xd9\xe0\x4b\x69\x74\x22\xba\x4a\xae\xef\x6d\xd4\xe5\x8a\x6b\xa6\x10\x5b\x58\xbf\x4a\x55\xb8\xe0\xde\x18\xdf\xe1\x1a\xf5\x1c\xe1\xce\x2f\x23\xed\x0d\x24\x47\x85\xa9\xa7\x24\xa9\xb2\x93\xa4\x9e\x25\x46\x15\xb8\x73\xbf\x0f\xd4\xc4\xaa\xfd\xb8\xe7\x9e\x1d\x6e\xec\xc9\xf9\x8d\x52\xbd\x00\xf3\x7e\x13\x34\x3a\x8d\x30\x07\xe4\x55\xa5\x74\x43\xb0\xd5\x5d\x57\x80\xce\x80\xe2\xa0\x62\xa9\x60\x01\xc1\x11\x08\x20\xcf\x92\x57\xd4\x51\xac\xfe\x93\x9a\x78\xff\xac\xef\xf5\xa9\x18\x87\x3f\xed\x18\x07\x60\x07\x09\x0c\xf0\x75\xcf\xa1\xe1\x89\x8f\xe6\xa6\xc3\x2d\xe3\x11\x42\x19\x11\xe6\x88\xb0\xea\x8f\x89\x62\x07\xc8\x45\xab\x13\x38\x47\x11\x2d\xa2\xf8\xac\xba\x1b\xce\x09\x3b\xe0\x5b\x16\x12\x0f\x8e\x02\x06\x67\xa0\x91\x49\xe4\xfa\x3e\x51\x60\xd3\xfc\x2f\x9b\x28\x37\x9d\xa8\xc1\x46\x3f\x36\x51\x13\x54\x81\x6b\x94\x64\xd9\x7c\xc5\x99\x2a\xd0\xdb\x95\xee\xea\x24\xe5\x7e\xa6\x3c\x02\x87\x31\xc2\x99\x65\xec\xd6\x95\x54\x53\x3b\x5f\xaf\x2e\x12\xd7\x27\xdd\xd6\xdf\xee\x37\x72\x50\x94\x8e\xe7\xeb\x2b\xd7\x50\x2c\x46\xf2\x79\xc2\x67\x7c\xd2\x0b\xae\xcf\xfe\xf4\xed\x72\xeb\x09\x2e\x83\x8b\x08\x0e\x24\xe7\x23\xa0\x37\x38\x1c\xfa\xcd\xe6\xd3\xed\xcb\xe3\xe3\xcb\xfa\x35\x83\xee\x08\xc5\x1d\x49\x08\x2b\x8a\x18\x6f\x5c\x8c\x43\x1e\x9b\x42\x7e\x63\x83\x9e\x4e\x81\x52\x59\x08\x4c\xdf\xa2\x6c\x02\xc5\x6c\x03\xf4\x85\xcc\xde\x2b\x89\x50\xca\x08\x09\x01\x87\x78\xb3\xc9\x55\x93\xa9\x07\xc5\xc0\xb1\x8d\xe1\x64\xdc\x92\x03\xb9\xbc\xe0\x86\x9a\x60\x32\xc9\xd0\x30\x4f\xcf\x6e\x53\x60\x21\x14\x29\x29\x06\x37\x70\x57\x2e\xf1\x3c\x06\x44\x2c\x39\x5e\x70\x82\x11\x7a\x5e\x3a\xd7\x0a\x6e\x79\x7b\x25\x7e\x30\x29\xf0\x9f\x33\x40\xbb\x3a\x0d\x0a\x2a\x05\x87\x9d\x1f\x30\x45\x96\xe2\x26\xea\xc6\x8b\xe4\x86\x88\x7a\x30\x9b\xd7\x88\x22\xe1\xa8\x09\x10\xc3\x95\x4d\xe7\x4e\xcb\xbd\xe9\xd6\x60\x6c\x81\x0f\x77\x07\x41\xea\xc2\xe8\x2a\xb8\xaa\x5a\xca\x14\xb6\x96\x05\x1e\x64\x10\x72\x02\x7e\x8d\x8c\x83\x33\x21\xe0\xae\xaa\x31\x0e\x0d\x56\x91\x56\x60\x40\xdf\x5b\xaf\x54\xaa\x20\x44\x5d\xc0\x90\xe0\xd1\x70\x36\x2d\xc1\x91\x04\xae\xd5\xb1\x81\xa3\xf6\x20\xc0\x2e\xaa\xdd\x8b\xce\xaa\xc0\xbc\x6a\x71\x2f\x18\x02\x63\xce\x1b\x98\xdf\x72\x69\xc7\x22\x36\x28\xbe\x22\xc3\xd5\xa4\x9f\x63\x96\xaa\x8c\x18\x72\x4d\x76\xf9\xc1\x92\x2f\x9b\x40\x0c\x23\xe0\xb4\x74\x5a\x50\x47\xa2\x0d\xee\x2f\xe0\x29\x28\x5e\x72\xd5\x8b\x56\x4d\xba\x75\x2e\x01\x94\x4d\x75\x44\x13\xf6\x1e\x64\xb2\xb3\x94\xd2\x26\x50\x09\x36\x12\x87\x83\xb1\x0f\x66\x1e\x72\x34\x8f\x3b\x2d\xb7\x14\xd6\xef\xbc\x62\x42\x0f\xcb\x80\x2f\x47\x13\xc7\x37\xeb\xef\xbe\xff\xfe\xb4\x0e\x76\xbf\x35\x65\xb7\x35\xe1\x09\xa7\xdf\x99\x6e\xb7\x33\xdd\xab\x3b\x73\x0f\xe4\x47\xf7\xe4\x96\x99\xfc\x46\xcc\xd9\xac\xe2\x20\xde\x8c\x62\x35\x48\x11\x63\x95\xcd\x33\xdc\x55\x21\x58\xc3\x74\x07\xd7\xcd\x97\x5e\xdd\xb2\xf0\x87\x37\xc5\x28\xdd\xae\x75\x07\xbb\x76\xf0\xbb\xdb\xaf\x41\x89\xc7\xb0\xb3\xd7\x82\x21\x9a\x43\xa0\x0f\x38\x90\xea\x36\xeb\xd6\x32\xa3\xa8\x09\xe7\x49\x5c\x64\x3c\x7a\x2e\x4a\x2b\x07\xe8\x36\x3a\x4a\xfd\x66\xc4\x95\xf9\xe9\xdd\x38\x02\xc9\xba\x1b\x37\x36\x2a\x38\xea\xd0\x83\x7e\x17\x78\xbf\xa2\xc9\x56\x30\x1f\xc1\xa9\x65\xa8\xb2\xb9\xb8\xe5\x66\xd3\x3b\xda\x38\x1e\x97\xe0\x04\x54\x0e\xd7\xb0\xba\xed\x6a\xca\x6e\x09\x39\x21\xac\x1b\x9b\x4c\x50\x0c\xe1\x32\x1b\x6f\x69\x18\x6c\x48\x52\x72\xbb\xa2\x91\xb0\xbb\x2c\xab\x91\x12\xf8\xd8\xee\x1d\x63\x99\x6e\x04\xaf\x6c\xde\x50\x93\xdd\xe6\x95\x6e\xf3\x32\xac\xd4\x74\x96\x3d\x92\xbc\x80\x9b\xd8\xba\xc4\x4a\xff\x74\x7b\x56\x60\x85\x64\xce\xd2\x0b\x1d\xed\xd6\xdf\x3f\x3d\xae\x6e\x9f\x9f\x7f\xf7\xb0\xbc\x3a\x2d\xbb\x41\x2f\x24\x8e\x6c\xa0\x94\xcc\xb0\x0a\x0d\x4a\xad\x51\x4c\x2d\xc3\xee\x83\x07\xd6\x1f\x42\xbe\xda\x52\x54\xff\x34\x35\xed\x5e\x41\xe9\x31\xe1\xa6\x6d\x6f\xcd\x8d\x90\x0d\x43\x09\x62\x75\xb9\xa1\x87\x62\xc5\xa3\xb2\x8f\x33\x05\xdf\x35\xdc\xc0\x50\x5b\x74\x36\x6b\xda\x71\xb2\xb8\x38\x5a\x54\xc2\x2b\xf8\x91\x89\xa2\xce\x7d\xdc\xc0\x90\x10\x66\x86\xa0\x98\x62\x1c\x59\x91\xef\xc6\xfb\x1e\xbc\xe1\xc0\xd5\x36\x4a\xe0\x35\x95\x9b\xee\x47\xe5\x6b\xe7\x07\x82\x52\x16\x4b\x39\xcc\x18\x9e\x53\x6a\xda\xf1\xc5\x59\xe9\xb6\x40\x19\xae\xd0\x10\x6a\xcb\xa5\xe1\x0c\x41\xa9\x35\x95\xa1\x17\x80\xa4\x9b\x4f\x0f\x17\x68\x41\xc2\x2c\x99\x9c\xa3\x14\x47\xf3\x00\xa2\xd8\xe5\x0d\x10\x16\x25\x5d\xa4\xea\xe5\xbd\x9f\x05\xa0\xb9\x08\xb2\x7b\x57\xf7\x7e\x54\x6f\xc7\x29\x02\x46\x5d\x39\x59\xd7\xc2\xf5\x40\xb7\x68\x9e\x32\xac\xc2\x58\x4f\x5d\x24\x35\xbf\x54\xbd\x12\xb7\x01\xa4\x95\x91\x89\x7c\x2c\xb0\x8d\xd8\x58\xaf\xdc\x06\x53\x5a\x37\x0b\x18\x6c\x49\xd5\x02\x05\xa0\x8d\x1c\x2a\x28\xf5\x45\xec\x36\xd0\xd4\x1e\x0a\xab\x95\xad\xd8\x28\x92\x15\xf2\x0a\xcc\x80\xe5\xbd\x26\x9c\x1e\xfb\xb0\xee\x2a\xdc\xa5\xf5\x4d\xa0\xe8\x2c\x0d\x56\xd3\x92\x52\x30\xe7\x78\xd4\x70\x93\xf9\x11\xc3\xee\xc0\xd5\xe7\x36\x4f\xdc\xb6\x8f\x7e\x5b\x5e\xb2\x1f\xc0\x00\xea\xb8\xbe\xb7\x6c\xf2\x9c\xc3\x92\xc3\xc9\xe8\xc6\x27\x25\x81\x63\xcb\xaa\xe7\xe7\xbb\x1f\x1e\xfe\xf8\x7c\xfb\x8a\x59\x55\x36\x9c\xda\x61\xe0\x15\x86\x52\x90\x0f\x9a\x4c\x43\xb2\x34\x55\x4c\x74\xad\x9f\x79\x6a\x52\x1b\xf4\x4d\xe8\x3f\x54\xbc\xea\x95\x58\xf7\x61\x36\x7c\xd3\x19\x4d\xfa\xd3\x11\x38\xbf\x60\x6b\x46\x98\x08\x94\xa5\x04\x4a\xa9\x65\x78\x55\xab\x69\xd7\x80\x58\xa8\x55\x46\xee\xd2\x9a\x9d\xeb\x89\xe7\xdc\x86\xc9\x29\xd2\x08\x3c\xd3\x33\xc4\x99\x9a\xee\x87\x95\x71\x6f\x99\x74\x63\xed\x75\x12\x3c\x44\x12\x9e\xf2\xc8\x34\x8a\x29\x6e\x23\xf9\xa2\x4c\x06\x54\xb7\xfb\xe9\x89\xc6\xf9\xb9\x6e\xdc\x1a\xbc\xeb\x7c\xbf\x77\xa3\x7b\x6d\x0c\xd8\xe8\x03\x42\x4b\xe4\x00\x5d\x79\x23\x73\xd7\xb4\xd3\x96\x05\xf6\x0d\x4b\xc5\x7f\xb8\x23\x81\xe5\xff\x5b\x81\xd9\xc1\x06\x0e\xc2\xcb\xc9\x25\x0d\x5c\x93\x30\x7c\x7d\xc2\x09\x8f\x9e\x78\x61\x84\xc7\xf4\x18\x34\x63\x53\x32\x20\x52\x2f\x9b\xa8\x58\x31\x91\x2c\x5c\xd5\x68\x6b\x86\xe8\x7b\xdf\xe4\xb9\x30\x3f\xb2\x51\x49\x54\xca\x4e\x64\xef\x6a\xc4\x9e\x58\x65\xe0\xe7\x93\x20\x18\x09\x45\x25\x12\xe0\xfa\x6c\x77\x8a\x65\x85\x24\xd0\xb4\x0a\x5d\xca\x5f\x65\x6f\x93\xd2\x82\x1c\x7b\x17\x2d\x3c\x82\xad\x10\xcc\x14\x66\xc1\x6f\x8f\x22\x3b\xc0\xea\x8e\xc7\x66\x77\x35\xec\xd4\x3a\x53\x00\x11\xd7\x40\xb9\x64\x26\xd0\x87\x1b\x98\x06\x76\x3d\x3d\x87\xa4\x18\xa9\xc5\x26\x98\x2e\x8c\x9b\xb5\x02\x78\xf2\x0b\x18\x41\x1f\xf1\xf6\xf6\x9a\x2a\xc2\xd8\x74\x25\x1d\x83\x26\xf9\x3c\x34\xf9\x29\x34\x75\x44\xf5\x06\xf6\x0e\x80\x25\x77\x08\x4b\xfb\x06\xcf\xb9\xf0\x1e\xe3\xce\x97\xc7\xfb\x57\xb1\xa6\xa7\xa6\xf7\xa6\x0b\x23\x52\xe3\x67\x7b\x31\x5b\x5f\xe0\xfa\xbe\x01\xc5\xd2\x56\x3f\x81\x55\x4b\x08\x66\xe2\xdd\x99\x25\xb3\xe1\x9b\xde\xba\xbc\x21\x7f\x76\xf0\x90\x91\x07\xb2\x1a\x53\x25\x71\xeb\x8a\x1e\x80\x35\xad\xf3\xee\xf5\x60\xae\xfe\xc6\x85\x72\xec\xd2\xa6\x13\xd7\xf9\xac\xe7\xb1\xac\xaa\xb1\x93\x50\x14\xa0\xbb\xa2\x0c\x51\x3b\x75\x04\xe0\x28\xb3\x55\x14\x3f\x54\xe6\xa8\x8a\x09\x45\x28\xfb\x15\xe4\xf8\x5d\x22\xe0\xdd\x0b\x41\x0f\x36\x83\xfc\x0c\x55\xba\x01\xb9\xbe\x0b\x46\x0c\x71\xb2\xe4\x61\xdf\x92\x4a\x75\x2d\x82\xf0\x06\x5e\x7b\x8c\x68\x70\x92\xad\x32\x1e\xce\x66\x48\x87\x95\xda\x0e\x3b\x2b\x1d\x18\xc2\xc1\x1e\xb2\xb2\x37\xb2\x7f\xa3\x24\x10\x05\xbf\xb2\xe4\x12\x7c\x25\x26\x8f\x48\x18\xc4\xf0\x59\xa2\x87\x4a\x31\x35\xdd\x4f\x93\x9e\x1b\x61\x26\x10\x9e\xc8\xc0\xbf\x3c\x3b\x9d\x03\x4f\xb2\x42\xb7\xaa\xfc\x23\xc1\x7b\xb5\xf6\x2b\x51\x70\x1f\xa4\x5a\x3b\x81\xb5\x80\x47\xc8\x54\x85\x9e\x2c\x14\xca\xc1\x4c\x72\x65\xce\x62\xd2\x89\xa7\xc8\x14\x53\x9d\xb2\x8e\x0a\xcd\x32\x13\xb0\x8f\x35\xed\xce\x26\xa8\x07\xe1\xc6\xc6\x27\x68\x4d\xa3\x0b\x26\x19\x3d\xd8\xb4\x23\xad\xd2\x39\x20\x76\x76\xc7\x19\xe4\xb1\x01\xd4\x90\xf3\x5d\xda\xbf\x8b\xc1\xf6\x03\x1d\x0e\x17\x72\xd3\x3a\x15\xd3\x69\xd2\x1e\x78\xa7\x98\x83\x2b\x75\xec\xf7\xfe\x2d\x1d\x16\x78\x56\xa5\x31\x3b\xdb\x72\xd0\xfe\x4e\x5a\xaf\x18\xd1\xef\xd9\x28\x4a\xde\x52\x48\xab\x6a\x0c\x06\xec\x66\x3d\x15\xd7\xad\x75\x9a\x39\x18\xfa\x3b\xd9\x8b\xd8\x07\x70\x7e\x7d\xa5\xf3\x9a\xaa\x23\x9c\x15\x6e\x93\x38\x54\x6a\x44\x97\xd8\x2a\x6a\xb4\xd4\xe4\x67\x0b\x91\x35\x7c\x65\x28\x2a\x8d\x14\x7d\x2b\x55\x10\x2a\x03\xb3\x71\x4a\x6c\x75\x33\x18\xdf\x28\xf4\xd6\xb4\x1f\x56\x11\x88\xb8\x57\xe4\x9d\xfe\x3f\xa7\x0a\x9a\xae\x4a\x72\xff\x95\x0a\xf6\x04\x57\xc9\x58\x13\x56\x30\xcd\xab\x42\x79\x8e\xd5\xbf\xb6\x3e\x47\x6e\x9d\x37\x6e\xef\x2f\x3a\xe9\x11\xe2\xd3\x6c\x02\xbb\x38\x25\x14\x49\x96\x75\xb3\xb2\x94\x60\xa1\x68\x75\x04\x5e\x77\x91\x77\x10\x2c\xb4\x0e\x1e\x7f\x7a\xd7\x71\xd5\xbf\xaa\xed\x5c\xaf\xfa\x9a\xf4\x9b\xbc\x54\x94\x79\x74\xfb\x43\xb0\x6e\x8e\xa3\x0d\x8c\x7d\x05\xdb\x3c\xef\x2d\x04\xef\xbd\x82\xa9\x8b\xad\xd4\x5b\x89\x66\xef\xdd\x0e\x1a\x4a\x61\x45\xc1\xc3\x68\xb9\xbb\x03\x86\xf0\xbe\x86\x6c\x6b\x1d\x54\x3c\xdd\x4e\xd1\x93\x4d\xb0\x08\x2d\xe0\x22\xe5\xdc\xa5\xcd\x50\x81\xb4\xbe\x93\xd8\xa5\x3b\xb6\x12\xe2\x9e\x64\xdc\x3e\xe6\x87\x66\xcd\x5c\x03\xa8\x69\x06\xc1\x33\xf7\x80\x02\x3d\xad\x54\x60\xb6\x4b\x38\x97\x75\x63\xea\xb6\xef\x87\x60\x1d\xc1\x1b\x5f\xfd\xa8\xa6\xb5\x7e\x08\xec\x6a\x00\x90\x3e\xa7\x47\x9e\x87\xb3\x67\xf6\x48\xd7\xe1\x82\xb8\xa6\x7b\x80\xb2\xb8\x33\x91\xea\x62\x75\xe0\x63\xb5\x56\x47\x3e\x7f\x70\xd8\x93\xae\x98\x6a\x69\x90\xe1\x9d\x02\x7d\x7f\x07\x4f\xf7\xb7\x83\xe2\x6f\x07\xc5\xdf\x0e\x8a\xbf\x1d\x14\x7f\x3b\x28\xfe\x4f\x3c\x28\x5e\xe5\x81\x4f\xf0\xd4\x99\x9a\x04\x9e\xda\x91\xbb\xbc\x78\x79\x6a\x1f\x9e\xbf\x7f\x7c\xba\xff\xf5\x25\x1e\x37\xed\xcb\xed\xdf\x59\xc5\x35\x17\x8e\x98\x7f\x75\xf1\xf4\xf8\x82\xac\x42\x22\xbf\x7a\xab\xb4\xfb\x37\xed\xd3\x87\xc7\x9b\xd3\x4a\xc7\xc1\x0c\x6f\x6d\xbd\xc9\xca\x40\x8f\xdd\x8d\xe6\x41\x81\x60\xde\x21\x85\x2a\xa3\xb6\xb2\xc9\xcb\x11\x73\x3a\x6d\xab\x9c\xd5\xd6\xf4\x1a\xc7\x99\x34\x16\x27\xbe\xde\x98\x96\x7f\xbb\xcc\x87\xd3\x99\xad\xa5\xb3\x5a\xf3\x53\x71\xf2\x79\xad\x69\xf9\x73\x55\x77\x07\xad\x85\x33\x5b\x3b\x0f\x46\xe2\xa4\xb5\x72\x66\x6b\xe7\x41\x49\x9a\x4a\x57\x0e\x5a\x7b\x15\xfc\xdd\x79\x50\x92\x0f\xb6\xe3\x87\x9b\xdf\x6e\x6f\x5e\x13\x8d\xc8\x4c\x0f\xf8\xde\xbb\x16\x02\x7c\x9b\x3e\xa7\xa9\xc2\x11\xb9\xbe\xd7\x23\x7e\xc6\xd5\x49\x5b\xf5\xff\x20\x55\x6c\x62\xf6\x5e\x5d\xf2\x79\x11\x06\xa6\x72\x90\x1a\x5f\x23\xb7\x5e\x8f\x59\xbf\x17\x6f\x7b\x3d\xee\xf5\xf7\x6c\xf8\xa6\xa3\x52\xf0\x09\xbc\xff\x65\x48\x62\x94\x30\xc9\x88\x1b\xd3\xbb\x1b\x93\x06\x6a\x93\xd9\x0c\x5f\x74\xea\x90\xdd\x37\xef\xd8\xf4\xa8\x03\x2e\xc1\x39\x2f\x03\x65\xbf\x56\xfa\xfa\xe0\x92\x09\x77\x18\xd0\xd9\x4c\x61\xcd\x14\x67\xdc\xe0\xe8\x6c\xf6\xa2\xef\x7d\x55\xef\x90\x04\x37\xd4\x64\xc3\x79\x2e\x4a\x89\x6f\x9b\x63\xcd\x64\x92\xa0\x47\x4d\x74\x5b\x74\xa4\x6a\x5e\xc9\x3e\x32\x20\xce\x50\xc3\xf9\xdb\xbe\x36\xd3\x3f\xbc\x1d\x81\x28\xa8\xf0\xb2\x90\xaf\xf3\xd3\x42\x59\x27\xf7\x9e\x03\x1b\x9b\x29\x9a\x4c\x4e\x74\x6e\x76\xa6\x73\x6c\x52\xf5\x38\xf8\x66\x4c\xd2\x0d\x36\x60\xa4\xb9\x46\xdc\x8c\xfb\xab\x50\xd0\x45\x79\xdb\xac\x95\x6c\xdb\x36\xb3\x7d\xc3\xfd\x87\x6f\x47\x2b\x9c\x71\xff\x4d\x45\xda\xe1\xfe\xc2\xf3\x6c\xbc\xbf\xfa\x82\xd7\x57\x82\x78\x72\x9c\xd7\x9d\x0d\x77\x64\x53\x76\x4b\x67\x0b\x45\x53\x28\x00\xd4\x24\xae\x89\xd3\x4c\x0f\x78\x93\xf7\xaa\x49\x7d\x05\xd7\x57\x11\x46\x6a\x79\xae\xbb\x67\xab\x34\xf2\x8c\x41\x45\xf2\x80\x96\xc4\x2d\x8f\x70\x0f\x07\x8c\x2b\x41\xde\x07\xb4\xd3\x1a\x92\x76\xec\xde\x23\x12\xcc\x3c\x53\x88\xb5\xb2\x49\xdf\xb4\x2a\x5d\xbf\x65\xa1\x1c\xdb\x49\xaf\x6c\x22\x44\xcb\x89\x5a\x8f\x32\xa0\xf0\xc2\x91\x82\x41\xd2\xbb\x93\xe9\x7e\xcf\x86\x6f\x3a\xa7\x80\x70\xb4\x8a\x7e\x20\x5f\x87\xc0\x3a\x09\xae\xc1\x24\x1c\x76\xdd\x35\xf0\x75\x9b\xeb\x56\x73\x40\x00\x6e\x60\x63\x8a\x29\x77\x4c\xf1\xed\x2a\x38\x1f\x1e\x1f\x5e\xda\xbb\x87\x57\x2e\xeb\xe0\xb3\x67\xbe\x37\xae\x62\x3b\x56\xd6\x65\xe3\x4d\x1c\x6a\xf3\x42\xb3\x66\x29\xc3\x12\xa8\xe3\xfa\xca\x43\x0f\x78\xee\x64\xf9\x8e\xdb\x72\x70\x78\x03\x47\x1a\x5c\x1d\x69\x6c\x2d\x0f\x33\xab\x7a\xc6\x96\xdd\x6c\x90\x57\x3f\x7d\x07\x9a\xf4\x9d\xef\xe8\xb7\x35\xbf\xff\xfc\x1d\x37\xbe\xfc\xf6\xf6\xbb\x6f\xdf\x41\x3f\xa5\x77\x34\x9e\xce\x6d\x7c\x82\x04\xbf\x9a\x56\x79\x81\x69\xb3\x87\xdf\xf3\x54\x7a\x61\x01\x2e\xf5\x95\x93\x1f\xe6\x99\x5c\x0b\x2e\xf9\xc8\x2b\x44\xe1\xe0\x51\x1d\xa6\xd6\x71\x7d\x1f\x4d\x33\xad\x5c\x19\xf8\x69\x7b\xca\xa5\xd5\xba\x0f\xaa\xb1\x93\xe2\xa6\xd6\x70\x7d\x5f\x45\x1f\x3f\x5f\xed\x2c\x3f\x5b\xed\xef\x46\x52\xcb\xc7\xcd\xa7\xfb\xd3\x3c\x19\x28\x93\x90\xdb\x1a\xc0\xa4\xa6\xfd\x21\xd0\x09\x46\xd8\xd5\xa4\xeb\x17\x6c\x4c\x1c\x18\xee\xe2\xbb\xb4\x8e\x30\x41\x00\xf7\x1e\xcd\x01\xc9\xcb\x4c\x5c\x56\xe4\xbc\xad\x2e\x5e\x1d\x5b\x81\xf1\x6f\xfd\xfb\xac\x04\x4d\xaa\xd2\x45\x66\x23\x5b\x72\xab\x3a\xd9\xc5\x56\x97\xbb\xd4\x04\x8b\xf0\x6a\x78\x9c\x39\x88\x40\x6a\xda\xc3\xa7\x12\x23\x5b\xf8\xaa\x73\x81\xa2\x71\x7b\x7f\xd4\x19\x5a\x39\xab\xce\x5d\x72\xd6\x9d\x1a\x72\x8d\xd6\x06\xb7\x9d\xdb\x50\x95\x29\x1c\xfc\x75\xd7\x51\xb3\x02\x70\xce\x73\xd7\x68\xdf\x65\x05\xab\x99\x62\xf5\xa0\xb1\xde\xb2\xb3\xfe\xd9\xb2\x33\x10\x2b\x3a\xe3\x97\x92\x3f\x60\xda\xa2\x33\xa5\xb2\xff\xd5\xf5\xad\x71\xb2\x74\xcd\x87\x1a\x98\xb0\x50\x8c\xd5\xbc\x59\x72\x8d\xd7\x79\x7e\xdc\xde\xe1\x22\xeb\x96\xcc\xad\x63\x72\x06\x49\xb7\xc4\x86\x72\xd9\x5a\x26\xdf\x0a\x02\x2a\xd6\xb4\x8e\x2b\xda\xf3\xcc\x73\xa6\x04\x69\x0d\xf4\x9b\xc7\x06\xc5\x87\xe1\xec\x0f\xb0\x8f\x34\x63\xf4\x03\x22\x5f\x19\x8c\xa5\x34\x7a\x0e\x9e\xc5\x69\x1c\x72\xb3\x35\x6e\xd7\x4e\x71\xc4\xea\xe3\x36\x91\x2f\x43\x0f\x17\x90\xad\x21\x34\xcb\x6c\x90\xdb\x7d\xfd\x2e\xf6\x56\xe0\x3e\x73\xd2\xbe\x32\x82\x5d\x16\x0f\x5b\x0f\x32\x6a\xbe\xfb\xfa\x5d\x0c\xef\x67\x87\xcf\xa7\x87\x5f\xce\x1d\xfe\x94\x03\xfe\xe5\x40\xe2\xcb\xd4\x46\x7e\x16\x70\xf8\x42\x4d\x8e\x9f\x05\x14\xbe\x4c\xcf\xe3\x67\x01\x83\xd7\x14\x36\xc6\xdc\x60\x9c\x57\x34\xaf\xa8\x92\xab\x1e\xba\xcb\xd6\x59\x16\xeb\xbe\xf5\x55\x71\xd4\x23\x30\xc0\x12\x51\x55\x99\xe0\x90\xc6\x19\x01\x0b\xd0\x18\xb7\x84\x6e\x7b\x2b\xb8\x84\xa9\x69\xc5\x59\x19\xd2\xeb\x2e\xa6\x12\x89\x27\x9e\x49\x04\xed\x12\x07\x76\x03\xf0\xc5\x93\x15\x78\x06\x91\x77\x6b\x58\x6b\x9f\x66\x5a\x5f\x31\x35\xad\xaf\x10\x90\x50\x60\x82\x92\x02\xaa\x6d\x4a\xab\xd3\xd0\xcb\xf3\x21\x2f\x97\x75\x33\xdb\x57\x87\x81\x5e\x5f\x41\x89\x36\xf8\x65\xa1\xa6\xff\x72\xe6\x1a\x25\x18\x6a\xda\xf5\xa8\xea\xda\xc2\x75\xa6\x73\x5d\xda\xb3\x75\x46\xbf\xdd\x32\x05\x3d\xa3\x83\x33\x6e\x67\xc1\xc0\x96\xe1\x44\x54\x66\x0e\xea\xcf\x6e\xa7\x04\x8d\x3e\x6b\xc3\x5f\xb8\x4a\xe1\x80\x7e\xf8\x87\xbb\xcd\xed\xb7\xeb\xf6\xe9\x15\xe7\x9b\x8d\x29\x70\x9b\x2b\x0b\xf6\x7a\xde\x06\x5c\x6a\xed\x15\x93\x60\x6f\x16\xe6\x71\x90\xe7\x4d\x5a\x4a\x99\x6e\xf7\x66\xb2\xdd\x79\x18\x77\x5c\x9b\xa9\x06\x8a\xf3\xb8\x64\xb7\x86\x4b\xfd\x51\xf9\x79\x5c\xa6\x75\x24\x5f\x36\x52\xc3\xa9\x84\x61\x10\x2b\x3d\x9d\x3d\x9f\xe7\xde\xea\x00\x4d\x20\xb4\x88\x90\xcf\x53\x75\xbe\xce\xa9\x37\xac\x6c\x92\x40\xa2\xbe\x94\x66\x13\x28\x46\xfd\x11\x46\xb6\x08\xdc\x39\x6e\x95\x6a\x07\xc7\x52\x93\x6e\x07\xc2\xb2\xcd\xe7\x2d\x62\x78\x87\xce\xb7\x54\x9c\x56\x60\xeb\xcf\x12\x36\xf0\x3b\xd4\xe4\x1a\x03\x45\x8b\x6e\x71\xa1\xdb\x14\x23\xd5\x6f\x2d\x7c\xf9\x69\x29\xa1\x77\xd8\x28\xfc\x92\xcb\x7c\x15\xcd\x6e\x25\x93\x18\x3f\x8f\xd7\x98\x7c\x5f\x6d\xa6\x46\xa3\xab\x26\xd5\x5c\xc3\x4c\x6c\x1a\x4b\xce\xc2\xa3\x93\xce\x04\x5c\x1a\x36\x79\x32\x77\xd5\x55\x13\xe6\x4e\xa7\x17\x25\xb7\x56\x79\x9a\x83\x72\x30\x28\xf2\x51\x47\x9c\x82\x91\x66\x4b\x3e\x6d\x70\x6f\xd4\xaf\xc9\xce\x2c\xac\x1a\x06\xe2\xba\xf6\x8b\xb7\xdb\x21\xb9\xfe\x5f\x3f\x73\x73\x42\xd1\xf8\x89\x09\x05\x42\xf7\x2c\x59\xd6\x79\xe9\xaf\x61\xdf\xaf\x3b\x24\xae\xcf\x09\xe6\x3d\xd5\xaa\xaf\xde\xd2\xc7\xed\x80\x44\x96\xb9\x62\x63\x3f\xf7\xba\x46\x12\xd7\x7e\xab\x8b\xf3\x0e\x85\x06\xe3\x44\x57\x7a\xd2\x56\xe7\xaf\x5d\x5b\x12\x7f\x7d\x2f\xb6\xb6\x74\x96\x13\xbd\x43\xc1\xa8\x37\x5a\xdd\x36\xaf\xf3\x32\xc0\xb1\xd3\xa8\x49\xbc\xbf\x56\x38\xe7\x66\x2e\xe7\xce\x60\x77\xbe\x3d\x6e\x7e\xfa\xe1\xf1\xe1\xe2\xe3\xe3\xdd\xc3\xcb\xf3\xaf\x2f\xa5\xb9\xe0\xe6\x42\x9a\x8b\x7c\xc1\xb1\x26\x2c\x17\x9c\xfb\x14\xef\xb8\x39\x97\x90\xdc\x39\x35\x11\x78\x1c\xd1\x3f\x9d\xc7\x11\x79\xbb\x53\x93\x7d\xad\xbe\xd6\xea\xdf\xe9\x2a\x25\x9d\x9a\x92\x58\x67\x44\xa4\x26\xfe\x82\x7d\x4d\xf6\xb3\x84\x22\x53\x67\xf5\x9f\xbb\xf5\xd8\x8d\xe0\x60\x00\x83\x69\xf1\x5f\x5e\x69\x39\x3a\x00\x5d\xba\xb8\x5f\xc0\x2e\x45\xe7\x91\xe4\x8b\x58\x13\x69\x2e\x7c\x97\xc8\x6e\xb8\xcd\x6e\xd1\x35\x83\xa5\x4f\x51\x45\x4d\xbb\xda\xcf\x18\xbd\x42\xd0\x09\xe8\x8b\x68\xa0\xa6\xf9\x42\x7c\x9f\xc6\x0b\x89\x7d\x8a\x0e\x76\x69\x33\xe8\xe2\x10\x52\xfd\xa0\x8b\xe7\xf4\x8c\x8f\xcf\x61\xbe\x70\xa8\xae\x4b\x31\x0d\x5d\x8a\xb6\x6b\x2a\x98\xce\x9a\xba\x33\x76\x09\xcb\xf1\xf9\xc0\x3c\x77\x33\xd1\xf4\x29\x56\xab\x4b\xf3\xfe\xe7\xbe\x00\x96\xae\x7e\x28\xcd\xee\xe1\x8c\xde\xb8\x11\x70\xea\x40\x7e\xd2\xc5\x79\xe7\xa6\x65\x3f\xaa\x56\x64\x5a\x6d\x7c\x5b\xb5\xe1\xe8\xdc\xd5\x85\x92\xdc\xa7\x43\xf8\xc9\xfb\x85\xda\x2d\x9d\xc3\xc4\x39\xe9\xd3\x88\x9c\x9a\x9e\xb1\x05\x79\x8c\x9a\xa4\x9b\xbb\xa3\x08\xef\x1c\xb0\x3c\x8e\x9b\xf6\x63\xcb\x83\xb1\xc5\xc1\x9e\xf1\x3d\x68\xec\xf6\x43\x3e\xa3\xd5\xc3\xbb\xd9\x3f\x3e\x7f\xf7\x5a\x04\x25\x29\x9d\xb7\x2f\xa5\xad\x78\x1f\xf7\x18\x0a\x69\x94\x64\xcd\x6d\xe7\x73\x25\xef\xf4\xb6\x40\xa9\x28\x6d\xe4\x4c\xcf\x3c\x34\x36\x80\x72\xa5\x82\x7f\x1d\xcb\x5d\x05\x68\x59\xe6\x1c\x28\xa4\xb6\x37\x82\xdc\xa9\xdc\x19\xc4\x89\xb4\xce\x78\xca\x6e\x2d\xe4\xe2\xf5\x7d\x00\xd1\x3a\x63\x72\x11\xba\x41\x3d\xe1\x93\x4d\xa9\xfe\x22\x9c\xd4\xa4\xeb\x67\x51\x0e\x26\x93\x3f\xdb\x8e\x7d\x64\xdb\x02\x4f\x31\x2e\x6d\x6c\x54\x42\xcf\x21\x32\xde\x90\x67\xad\xb6\xbd\x94\x76\x56\x19\x2e\x52\xe4\x25\xa7\x79\xa4\x22\xad\x54\xa6\x71\xa7\x89\x54\x3b\x89\x40\x22\xbe\x4b\xaa\x35\x94\x3e\xc2\x61\x60\xf5\x87\x23\xfb\x10\x47\x4c\x1c\xc8\x6d\xa8\x38\x44\x05\x9f\xc1\xfa\xcd\x57\x36\x8b\x61\xc7\xca\xc1\x70\x59\x3b\x0a\x79\x03\x0d\x25\x98\xa1\x4c\xe6\xd4\xd4\x39\x5d\x6b\xb2\xd5\x35\x1c\x8a\x7f\x95\x45\xa1\x54\xd6\xbe\x72\xdf\xa3\x7c\x4b\xa9\x6c\xad\x27\x3f\x7a\xd1\xbb\x41\x17\x72\x7e\xec\x1d\x9d\xf2\x96\x89\x65\xce\x85\x72\x6e\xab\x5a\x60\x6f\x0c\xcc\xb6\x87\x9e\x05\x07\xdc\xf3\x96\x35\xcb\x16\x04\x2d\xc5\x42\x71\xd7\x2c\x66\x11\xbe\x3c\xf6\xd1\x78\x94\x73\xa5\x08\x1f\x0f\xbb\x52\x96\x78\x33\x58\x99\x71\x1d\xde\x52\x9c\x0d\x57\xc7\xec\x17\xf4\xfa\x4a\x1c\x02\xc3\x84\xb9\xc4\xad\xe8\x58\xf4\xf7\xf5\x7d\x20\x07\x39\x2e\x42\x98\x85\xb0\x81\x5d\xef\x7b\x6c\xb3\x3c\x2e\x3e\x2b\x10\x05\x0a\x70\x5f\xc9\xed\x08\x68\x98\x9a\xa4\x84\x74\x82\xcf\xcd\xb4\x81\x5b\x96\x40\xf1\x95\xcd\x57\x79\x11\x04\xb6\xf3\xbb\x3b\xe5\xea\x12\x24\x22\x33\xd7\xa4\xdf\x85\xd0\x74\x13\x72\xb9\x26\xfd\x3e\x64\x07\x8f\x4f\xca\x5d\x9d\xdc\x87\x8b\x02\x03\xdd\x34\xcf\x5a\x20\x1a\xb7\xd3\x8e\x30\x60\x5a\xd6\xca\xca\x28\xe4\x05\x85\x3c\x39\x05\x79\x42\xa1\x6c\xa9\xc0\x97\x2f\x02\x7f\xac\x15\xaa\xb6\xca\x70\x22\xf0\xe3\x6b\xc0\x12\xbb\x50\x9e\x00\x16\xc0\x2e\xa5\x31\xa8\x24\xd9\x47\x42\x3f\x0d\x2a\x41\x27\xb6\x9b\xff\x91\x2f\xe1\xb3\xa4\x77\x23\x34\xfa\xcf\xed\x4d\xfb\xea\x35\x2c\xe7\x15\xfc\xc4\xda\x08\x8b\x53\x0b\xad\x95\x95\x45\xfb\x96\xbd\x66\x5b\x64\x7f\x40\x4c\x55\xb8\x9b\x35\x9e\x70\xfb\xcd\xc6\x6f\x1d\xa5\x95\xb2\xf6\xa6\xa1\x60\x0b\x15\x13\xf0\x17\xea\x97\xf2\x1c\x28\x18\xb8\x8c\x62\x84\x1d\xf0\xff\xf2\xf0\x2f\x2f\xab\x40\xce\x36\x78\xe1\x75\xe1\xf1\x97\x1b\x72\x6b\x2b\x2b\xe8\xe4\x5a\x47\xc9\x64\x72\x36\x23\xe6\xa7\x7b\xd6\x07\xcd\xb4\x5d\xe6\x4a\x21\x46\xe0\xfe\x2b\x51\x36\xa9\xe6\x6e\x3d\xc1\x6b\x5a\x36\x0d\x79\xeb\x88\x8d\x20\x75\x54\xd0\x6e\x0d\x0f\xa7\xef\xbd\xfe\xf7\xec\x51\xd6\x5b\x0f\x31\x1b\x42\x5b\x59\xa7\x5f\x5a\x47\x79\x29\xc4\x1f\x38\x53\x34\x08\x9e\xe4\xf0\xc7\xc8\x87\x42\x02\x27\x0f\xf5\x2f\xe7\xe7\xa4\x75\xc6\xfa\xff\x67\x8e\xb6\xfe\xb6\x1c\xe7\x4e\xfe\x72\x71\x25\x8d\xe1\xdc\x35\xcf\xc4\xb6\xd1\xa3\xc6\x8a\x91\x67\x2b\xfa\xc3\x8a\x95\x67\xfc\xd5\xec\x6f\x05\xce\x41\x8a\xc1\x67\x7f\x79\xfb\xd1\x30\x5a\x58\xd9\x2d\xec\xb7\x35\xba\x94\xf1\xd5\x13\x58\x22\xe5\x91\x93\x65\x47\x50\x1d\x60\xcb\x07\x2b\x9a\xbb\x15\x75\xc3\x15\xcd\xfd\x8a\x3a\x1d\xda\x68\x4d\x5d\xb7\xa6\x4e\xd7\x54\x4e\xae\xe9\xb7\x0a\x47\x22\x1d\x40\xa1\x37\x75\x49\x65\xb0\xa4\x52\x97\x54\x88\x4d\x83\x2a\x14\xdd\xe9\x41\x54\x8c\xaf\x8b\xaa\xf3\x0a\x37\x07\xd0\xfe\xd5\x7d\xad\x6f\x4c\xf5\x88\xa4\xb3\x0d\x84\x60\xf5\x9d\x90\x62\xce\xb2\xb2\x0a\x1d\x8c\x7f\x55\xaf\x58\x5f\x08\x95\xa5\xe0\x95\x69\x6c\x53\x81\x5f\x5b\x5d\x59\x9c\x1e\x96\xa3\x49\x24\x16\xab\xdc\xb7\x6b\x32\x3a\x7a\x62\xf9\x57\x8d\xd9\xfd\xa7\xa0\xf0\xd6\x1d\xfc\x8f\x0f\x37\x9f\x56\xaf\xc5\x93\x44\x04\x57\x2c\x2b\xc3\xc3\x55\x50\xd4\x08\xb7\x08\xd6\xd9\xd8\xb2\xc0\xe6\x5c\xf6\x17\xa7\x50\xc6\x8e\x98\x91\xd0\x25\x1d\x42\x45\x99\xd9\xe1\x17\x52\xe3\x70\xeb\x98\x10\x9a\x99\x49\x9c\x89\xd6\x99\xf8\xfc\xae\xa6\xcc\xf1\x2f\x4c\xa4\xf4\xf9\xa6\x32\x2c\x0b\x86\x7a\xc3\xdc\x35\x55\xff\xf5\xc8\x13\xbe\xbe\xd2\x07\x45\x57\xd5\x47\x43\x80\x2b\x2a\x85\xc7\x60\xe0\x94\x58\x1c\xa5\xf9\xde\xa2\x13\x9e\x77\xe6\x8e\xa4\xac\x18\x0e\x06\xb3\x33\x8e\x9a\x68\x7d\x8d\x73\x2c\x1e\x4f\xad\xd7\xe3\xdf\xf7\x34\x00\x5c\x84\xc5\x4a\xe3\x79\x8a\x5d\xb2\x7b\x13\x2c\xe4\xd0\x5e\x91\xbe\xef\x31\x7f\x95\x82\x77\xa1\x3c\xbd\x43\x70\xe7\x5e\x3c\x5d\x4d\x4b\x8e\xb5\x81\x9a\x14\xbc\x73\x35\x6f\xf0\x75\xd2\x42\x8d\x4a\x1b\xc2\xdc\xf9\xe1\x58\x8c\xcc\x9d\x9e\x55\x18\xa8\xd5\xcd\x4d\x49\x77\x84\xd3\x84\x43\xb5\xe7\x50\xf2\x0c\x4f\xed\xe1\xf4\x21\xb8\xe5\xd1\xf9\xd6\x85\xfa\x20\x70\x13\x85\xf0\x7e\x46\x22\x04\x7f\x01\xca\xda\x7b\xb8\xbc\xee\xec\x4c\x8b\x6b\x61\xbb\x50\x2d\x18\xfa\x26\x40\x46\x03\x3b\x07\x04\xdc\xa8\x8a\x4c\xc6\x1b\x28\x44\x49\xc2\x59\xeb\xb3\x61\xeb\x67\x07\x9f\x9b\xbe\xe6\xeb\xfb\x3a\x65\x5f\xbf\x85\x3a\x90\xae\x11\xcb\x35\xa8\xef\xcf\x30\x10\x06\x5c\xfa\xf3\x2e\x95\x8f\x1c\xf9\xb7\xcf\x77\xcf\xaf\x22\x8c\x82\xd8\xc9\x91\x9c\x5f\x37\xb3\x3e\x2e\x5d\x0f\x61\x52\xfd\xc4\xc9\x42\x3c\x9c\xac\x39\x04\x32\x84\x87\xd0\x7a\xa9\x34\xa1\xfa\x6c\x17\xef\x92\x65\xdd\x1c\x7b\xa7\xe0\xca\xa0\xa8\x13\x77\xb5\xe9\x14\xee\x2a\x1b\x13\x55\x88\x51\xde\x2c\x22\x6c\x0f\x50\x18\x4e\x9a\xf4\x04\x3e\xb6\x45\x63\x42\xb8\xcd\xce\xd8\xba\xda\x72\xec\xf4\x18\x50\x49\x51\xe2\xee\x70\x94\x08\xc9\x9d\xf2\xa6\xba\xf5\x83\xa4\xba\xba\xf2\xd4\xc7\x23\x84\x2d\xfc\x96\x1f\x1b\x22\xc4\xe0\x18\xfe\xc9\xba\xe0\x80\xab\x9f\x5d\xe5\x32\x87\x25\xe1\xcb\x41\xc7\x78\x64\xd7\xc2\xd9\x43\x9d\xdf\xa3\x03\x1c\x2c\xe4\xbb\x20\xe6\x43\xfb\xb1\x5d\xdd\xbd\x1a\xb3\x38\x28\x73\xd2\xec\x75\xbf\x11\xdb\x7b\xa9\x0b\xb4\x73\xea\xc2\x50\xd0\x76\x0e\x91\x79\x77\x03\xe9\xbf\x7c\xcf\xe5\xd2\x5b\xdb\xee\xbf\x7c\x97\x72\x9e\xae\x6e\x99\xbb\x09\xe8\xe1\xc5\x78\xbd\xde\x21\x81\x77\xda\x84\xf0\xde\x55\xd0\x0e\xc2\xdd\x9b\xdb\x38\x74\x04\xf0\xed\xbf\x7e\xba\x7b\x55\xdd\x3d\x1d\x4e\x71\x19\xb4\xaf\x53\x3c\x5a\xda\xfc\x1e\xfb\x13\xce\x66\x08\xf1\xb5\xc1\x66\xdc\xdc\xd6\x8d\x9b\x3b\x0b\xce\x27\x4b\x99\xc0\x26\xc2\xdf\x10\x6c\x96\xd2\xc8\x1b\x11\x62\x43\x79\x59\x28\x19\x47\xa1\x98\xde\x99\x54\xe6\x49\xb1\xea\xcd\xdd\x6b\x99\xaa\x37\x5f\x49\xa3\x74\xe0\xd7\x61\xec\xb9\xfd\xb8\x2b\x77\x44\xe8\xf7\xac\x7d\xaa\x9e\x02\xc7\xde\xeb\x7b\x17\x0b\x7b\x46\xf0\x2c\x56\xdf\x4d\x95\xc7\x94\xe6\x89\x1b\x30\x9b\x2e\xb6\xbd\x14\x4c\x91\x12\xb3\xc5\xf9\xae\x27\xd2\x4e\x42\x05\xe6\x78\x50\x46\x0f\xff\x4d\x0d\x34\x4a\x7a\x9e\xb5\xca\x9e\xf7\x61\x6d\x04\x51\x32\xdf\xae\x78\xe4\x60\xb2\x20\x7e\x63\x6b\x0b\xfb\xee\xd9\xae\xe9\x61\xef\xec\xb8\x77\x28\xa2\x23\x58\xc4\x5d\x2d\x32\xee\xa0\x39\xbb\x83\x53\x55\x51\x3e\x01\x40\xcd\x08\x80\x5c\x53\x21\x68\x83\x22\x76\xb0\xa8\x63\x08\x92\x5c\x41\x08\xe5\x60\x82\xf8\x36\x10\x72\xcd\xcf\x0a\x43\xf1\x00\x8b\xcc\x1f\x9f\x5f\xfe\xcb\xd3\xe3\xa7\x8f\xa7\xe9\x0b\xa6\x46\xf7\xea\xda\xb2\x9f\xe1\x99\xf7\x81\x21\xa3\x71\x6e\xc9\x7a\xf0\x8f\xf3\xf5\xd1\x6a\xb2\x3e\xf2\x91\x20\x02\x32\xcb\xd2\xb9\xc3\x77\x5d\x6b\xd7\x57\x88\x27\xe2\xa0\x6a\x28\xcd\x92\xdd\x5c\x33\xce\x77\x13\xba\xbf\xee\x6b\xa8\xc9\xdd\x85\x19\x95\x7d\x0c\x8c\xfc\xf6\x48\x1b\x23\x07\xa4\xf0\xe3\x97\x79\x6d\x65\x59\xd6\x96\x65\x99\xd6\x3c\xc4\xf7\x6c\xce\xd1\x4a\xe8\xfc\xf3\x4f\x0d\x5e\xc4\x69\xfd\x61\x6d\x99\x97\x6e\xcd\xf2\xe6\xfa\xc7\x97\x2a\xec\xfa\xb9\xd1\x31\xe4\xa3\x37\x36\x74\xce\x7d\x58\xe7\x9b\xbf\x1f\xc0\x17\xf2\xca\x5d\x48\x4f\x05\x00\xbe\x58\x70\xf7\xf0\xa1\xa1\xc0\xce\x4b\xe2\x02\x53\x86\xa6\xe1\x10\xa2\xbf\x68\xa8\xf1\x5c\x62\x74\x29\x06\xc4\x0c\x8e\xa1\xe1\x1c\x2f\x1a\xe3\x9a\x8b\x45\x63\xca\xc5\x07\x65\xea\x7d\xe3\x82\x13\x9f\x2e\x1a\xf2\xb9\x3e\x9a\x44\x45\x2e\x50\x3f\x9e\x16\xb5\x51\x3c\x7f\xe0\x40\x31\x45\x1f\x53\xe8\x8a\xc5\x1a\xdd\x66\x57\x4f\xcd\x28\x17\x8b\xfa\xe0\x9a\x8b\x0f\x90\x19\xe6\xc6\xb9\x38\xec\x88\xd6\xe4\x63\x48\x92\x87\xdd\xde\x0d\xf0\xfa\xe2\xca\x03\xfa\x99\x4a\xbc\x58\xd4\x67\x87\x67\x96\xc3\x1f\xc3\x52\x78\xbe\xbe\xb8\x4a\x80\x09\x4f\x39\x5f\x2c\xea\x73\xa2\xc6\x5f\x2c\xca\xc1\xf3\xb0\x0c\x9e\xaf\x87\x00\xf6\x85\x0a\x7d\x80\x74\x44\x3e\xd1\xa3\xf4\x62\xc1\x79\xf2\x1c\x2f\x16\x71\xff\xc7\x5f\x20\xf6\xb4\xf1\x17\x1f\xb8\x50\x0c\x22\xd9\x27\xe3\x2f\x50\x85\x27\xef\x53\xe2\x20\xa1\xfe\x0e\x17\x8b\x41\xd5\x67\xf7\xce\x5d\xf6\xd2\x13\x1d\x61\x73\xb1\xe8\x7c\x64\xef\x9f\x2e\x16\xcc\xa3\x07\x7d\xe5\xea\xc3\x07\x71\x14\x5d\xed\x5f\x73\x51\x2b\x69\x06\x1d\xac\xb3\x7e\xb1\xd8\x55\x7f\x7d\x48\x8e\xbd\x3c\x3e\xb5\x3f\xdc\xce\x6e\xda\x8f\x2f\xaf\x98\xca\x20\x7a\xd3\x90\x30\x02\xa5\x94\xd7\x76\xc2\x0d\xad\xfd\x52\xca\x80\x5c\xea\xbe\x3b\x0b\xff\x4d\xbd\x24\x2b\x0a\x89\x46\xd2\xda\x4a\x58\x96\xb5\x84\x01\xd1\xe0\x8c\x5b\x8a\x9f\x0d\x32\xba\xc2\xd7\xf7\x56\x9c\x95\xb5\xb8\xa9\x87\xc0\x91\xd3\x2c\xab\x88\xef\x3c\xbb\x99\xae\x7b\xfb\x8b\x5d\x6a\xe2\xd7\xb9\xdb\x75\xa7\xeb\x1e\x28\x4b\xbc\xad\x6e\x7f\x30\xad\x5c\x5d\xf7\xca\xda\xe6\xa5\x34\xeb\xb4\x64\xbf\x96\x6d\x1a\xd2\xba\x5d\x89\xb3\xc8\x95\x09\x7c\xfd\xd3\xe3\xcd\xed\xeb\x07\xb5\x43\xb4\x59\xe5\x3b\xf2\xc6\x7a\xb8\x49\xa3\xec\x96\x8a\xdb\xcb\xd0\x95\x5b\x50\xea\x30\xe9\xb6\x88\xde\x14\xe2\x91\x91\x6e\xb3\x80\x37\x6b\x58\x49\x8e\x3f\xa2\x9c\xb6\x01\x37\xa5\xbe\xf3\x6b\xef\x46\x05\xf4\x7d\x24\x19\x39\x5c\x0d\x94\xe1\x63\x38\x80\x85\x1e\xb9\x9c\x6c\x36\x9e\x4a\xa8\xe2\xb8\xee\xbe\x28\xbb\xf1\xb7\xec\x87\x14\x92\x2f\x96\xd8\xa3\x36\x3b\xa9\x8d\x82\xa5\x1c\xa1\x06\x1b\xc6\xee\xd6\xfa\x09\xb9\xbe\x52\xa2\x03\xd7\x18\x2c\x1b\xd8\xd9\x0a\x1c\x76\x17\x1d\x8e\xaf\x2e\x86\x2d\xbc\x42\x08\x21\x60\x5c\x4c\xd7\x57\x0c\xc7\x80\xae\xa1\x18\x36\xfd\xcb\xe0\x97\xe2\x36\x9e\x62\xb6\xf0\xe4\xe1\xab\x87\x94\xb4\x94\xdc\x05\xe1\x44\xc8\x93\xea\x36\x94\x82\xd7\x79\x86\xa5\xc1\x12\x0f\xda\x76\xd4\x6a\xd2\x42\x0b\x9f\x27\x1b\x9a\x42\x1e\x82\xeb\x7a\x37\x41\x26\x5c\x68\x8c\x39\x82\xe1\xb2\x9f\xed\x25\x14\x65\x07\xd8\x06\xb3\x97\x36\x81\x84\xed\x88\x60\x21\x07\xbf\xba\xfb\xda\xc9\x65\xe4\xea\xf0\xa0\x83\x99\x01\x11\x83\xf6\x2b\x9c\x2c\xaa\xab\x38\x7d\x5b\xc2\xa0\x2b\x5d\x7f\xdf\x82\x25\xf6\x50\x6e\x24\x50\x13\xa6\x63\x4e\x14\xdc\x74\x4c\x71\x83\x11\xfb\x65\x86\xed\xe4\xee\x25\xee\x23\x58\x07\x1c\xec\x84\x42\xa3\xe4\x17\x45\xa1\x23\x53\x0a\x27\x06\xe7\x61\x55\xc9\x3a\x38\x3f\xa8\xb5\xeb\xd8\x59\x34\xde\x91\x3d\x7e\x3a\x70\x2f\xc3\x67\x33\x94\x25\xc4\x48\x21\x57\x74\xa9\x43\xde\x64\x0a\xb8\xa5\xc9\x50\x1c\x2f\x5b\x84\x4e\xbd\xaa\xc1\x0f\x9d\xa9\x9f\x89\xe1\x54\x33\x96\xd2\xe8\x28\x91\xcd\xc9\x78\x98\x8d\x9f\x27\x71\x3a\x70\xbf\x1f\x76\x3d\xab\x0a\xea\x9f\xe9\x1a\x97\xae\x6f\xf5\x43\x31\x75\xdf\xec\xfa\x86\x6c\x46\xec\x85\x73\x3b\x77\x08\x30\x35\x8e\xa5\x93\x8d\xed\x3a\xb3\x8c\x14\x79\x01\xb7\x4c\x89\x37\xa3\x9e\xdd\xdb\x48\xc1\xea\x59\x8b\xf7\x65\xa3\x3f\x1d\xa5\xb0\x4c\x94\x92\xe6\x01\x85\x28\x65\x78\x68\xab\x76\xd6\x4a\xb7\xf7\xb7\xcf\x1f\xdb\xd5\xab\x11\x0b\x3d\xf1\x88\xdb\xd4\x0e\xbb\x0d\xae\xc0\xe0\x50\x35\xca\xc6\xd6\x5f\x43\x44\xec\x52\xd5\x58\x19\xf2\x8d\xd8\xc8\x9b\x64\x3d\x35\x61\x99\xcf\x73\xc1\x7a\xb8\xdc\x45\xf1\x1e\x62\x07\x55\x45\x65\x59\x16\x72\x79\x81\xec\x48\x23\x11\x0b\xc2\x28\x2d\xc4\xd4\xc5\xd5\x59\xab\x0e\x32\x1d\xe5\xd8\x8e\x7b\xa8\x3d\x1f\x7a\x28\xe9\x1b\x79\xdf\xe2\x37\x06\x8a\xbc\xd3\xb0\x8e\x7e\xaa\x9b\x2d\xd3\xc8\x90\x23\x9d\x6f\xad\xe5\xfa\x3e\x99\x66\x1b\x10\x62\x59\xae\xef\x6d\x30\x69\x1d\xf0\x5b\xdf\xe8\x51\xa2\x3f\xaf\xef\x83\x4d\x73\x2e\x4b\x96\xf5\xbb\x71\xc1\x6b\xd2\x3d\x3d\x95\xa2\x62\x54\x4f\x0e\xc6\xa7\x11\xf0\x19\xc8\xf9\x0d\xe3\xc2\x49\x09\x3a\x72\xee\xfa\x0a\xd7\x39\x9c\x37\xa5\xba\xde\x2f\x56\xff\x2c\x59\x28\x8b\x7e\x82\x30\x5b\xb8\xb6\x3b\xcb\xd6\x8a\xa7\x3d\xfe\xfd\xe3\x69\x71\xa4\x54\x9d\xea\xa6\x8d\xa6\x73\x4a\x61\xa3\x8d\xcb\x61\x86\x89\x36\xce\x25\x0e\x33\x4c\x5c\x4a\x9c\xed\x33\x50\x0b\x74\xbf\x07\xa1\x83\xac\x37\x7e\x29\xc3\x58\x42\xd0\x7f\x1e\x65\x58\xaf\x4d\x0d\x3e\xb1\xef\x44\x78\x91\x42\x34\x1c\xe6\x1c\xc8\xfb\x19\x93\x77\x86\xfb\xdb\x3e\x58\xdc\x70\x24\xef\xb7\x19\x1e\x32\xa6\x6f\x03\x68\x03\x1d\x2c\x85\x78\xf0\x5a\xc0\xa1\x85\xb8\x44\x15\x87\xaf\xbb\xa6\xaf\x75\x4e\xc5\xcf\x19\xaa\x3c\x67\x69\x8c\x1f\xd9\x26\x42\xde\x70\x99\x73\xb3\x64\x99\x4b\xb3\x65\x52\x1a\xd6\x1e\x76\x5e\x1a\x34\xdf\xcc\xcb\xb1\xce\x81\x35\x3d\x35\xee\x52\x3d\xa9\xaf\xcf\x33\xb2\xdc\x03\xd9\x87\xc7\x87\x97\xa7\xc7\xcd\xe2\xd3\xc3\x04\xcc\xc6\x63\xa9\xd3\x57\x5a\x1c\x22\x48\xba\x9e\x53\x0a\x14\xca\x86\x95\xce\x61\xf2\xdc\x0a\xcc\x7c\x65\x6f\xec\x6b\xbd\xa5\xfc\x3e\xdc\xa8\x2c\x13\x05\x10\x59\x6e\x25\x88\xf7\xe0\xa1\x21\xe1\x0d\xd7\x3b\x57\xfc\x7d\x2e\xc4\xb6\x06\x21\xb0\xfa\x7b\x1b\x88\x79\x65\xa9\x20\x6a\x83\x12\xa7\xec\x6c\x35\x98\x71\x33\xe7\x11\xa3\xc1\xef\xbd\x2a\x67\x85\x2f\xdd\xf6\xb9\xf5\x0d\xe5\x68\x6a\xba\xc7\x56\xc4\x71\xd5\xa9\x4e\x15\xad\x6a\xd7\x54\xe1\xad\x23\x71\x6b\x59\xe6\x75\xf3\xdc\x1d\x19\x4d\x82\x15\xaf\x0b\x36\x53\xb6\x1e\x41\x0c\x3c\xfe\x7e\xeb\x6b\x78\x31\xc4\x34\x76\x5b\x65\xe3\x57\x8a\x42\x5d\x75\x07\xc8\xde\xc4\x7a\x9f\x9e\x64\x91\xa1\xf0\x95\x29\xe6\x0f\x95\xd4\xc0\x69\x00\xa7\xf9\xd9\x9b\x6e\x62\x70\x77\x1c\x28\xe6\x55\x22\x0e\xf5\x9e\x14\x61\x18\xbd\x87\xaf\x68\x6d\x9b\x7c\xa4\x5c\x3d\xf8\xd7\x8c\xee\xc5\xb7\xb8\x12\x46\x08\x83\x68\xf2\x07\xfc\x4a\xf0\xaf\x08\x77\xd7\xd5\xef\x4c\xad\xfd\x7d\x24\x66\xb5\xbb\x81\xc2\xa8\x47\x38\x1f\x5f\x6f\xf0\x17\x9a\x51\x8c\xf3\x6b\xe5\x0c\xa6\x46\x9b\x8e\x8a\x1b\xd9\x6d\xd6\x5a\x10\x1b\xba\x99\xeb\x82\xf9\x1a\xed\x44\x29\x8a\xa4\x7c\x96\xce\x97\x9f\xa3\xe0\xf6\x9c\x2e\xbb\xc3\x0d\x0c\xa5\x35\x19\xdc\x82\xe8\xf9\x3f\xf4\x8a\xd5\x15\x38\x4b\x44\x58\x45\x78\xbf\xc4\xe6\xb2\xf6\xbb\xf6\xe6\x87\xdb\x9b\xa3\x9b\xac\x7f\xf9\xd7\xbd\x50\xaf\x0d\x41\x4e\x0e\xe1\xbd\x0b\xf7\x5a\xab\xee\x74\xab\xd5\x0d\x82\xff\x99\x50\x0b\x3b\x12\x69\x13\x39\x31\x69\xa7\x24\x6d\xc5\x90\xe4\xad\x96\xfb\x20\x05\x0a\xb9\xb1\xf2\x00\xb5\x2f\xa6\xef\xd4\x1b\x46\xea\x4f\x8e\xf4\x0b\xf1\x71\xeb\x93\x92\x53\x35\xad\x63\x4d\xd4\x14\x4b\x41\x87\x80\x40\x29\x7d\xac\x18\x84\x6a\xa8\xba\x86\x89\x7c\x4d\xea\x8b\x40\x21\x93\x93\x0f\x15\x1d\x71\x53\xa3\xb7\x0f\x50\x56\x75\x4a\x9b\x8d\xaf\xb6\x93\x4e\xe7\x0d\x7f\x6a\xab\x8e\x38\x52\x83\x80\x8e\xba\x8f\x5a\x44\x5e\x49\xfb\xa0\x85\x24\xc5\xf6\x61\x0f\x19\xee\xf6\xb3\xad\xea\x4b\xf5\x6f\x20\x81\x96\xa7\xa1\xa2\xa9\xe2\xef\xaf\x81\xb1\xcf\x5f\x8e\x30\x5d\x8e\x81\xd3\x46\xd8\xb7\xd4\x20\xe4\x4f\xbf\xbe\x3c\x11\xee\xf7\xb5\xca\xe3\xe4\x25\x7e\xfc\x3c\xa8\x6a\xac\x83\xf9\x57\x85\x6b\xda\xcd\xed\xd3\xcb\x49\x7c\xd9\xbd\xfd\x19\xb0\xcd\x2b\xed\xca\xe9\x76\xbf\x70\x17\xae\x75\xbd\xba\x78\x60\x61\xe7\x18\xc6\x81\x1f\xcb\x6f\xd9\x56\xf0\xf4\x26\xe4\x02\x35\x41\x19\x65\x48\xff\x98\x6a\x14\x51\xdd\x49\xd1\x56\x9d\x39\x4e\x56\xc1\xc1\x43\x38\x2a\xfc\x4b\x6f\xa5\x57\x66\xd5\x9d\x9e\xd5\xaf\x82\xaa\x03\xf9\xb9\x6b\xce\x26\x3d\xdf\x32\x14\x7f\x7a\x28\x88\x22\xa3\x1d\xf6\xd5\xb2\xdc\x14\x2a\x08\xeb\x0c\x2f\xd2\x3b\x57\x0c\x02\x81\x96\x9b\x3b\x87\x30\xfd\x93\xd7\xfd\xc2\x2e\xa4\x54\xa7\xd3\xb8\x7b\x96\x0c\x4b\x86\x3d\xfb\xd4\x35\xf4\x96\x11\x84\xe9\x5b\xfc\x3a\x82\x7c\xde\xbc\xd1\x4e\x5e\x8e\x9e\xa0\x7d\x78\xee\x64\xc9\x7a\xca\x2a\x38\x43\x55\x1a\xaa\xda\xd5\xa7\xb9\xc2\xae\x23\x37\xf3\x70\x72\x5d\xd3\xdd\x32\x16\x30\x99\x89\x72\x9e\xf9\x06\x5a\x32\x4d\xbf\xeb\xaa\x1e\x66\x59\x81\x40\x77\xa4\xbb\x0b\x5a\xe7\x70\x23\xa1\xfb\x50\x56\x56\x6a\x14\x3d\x17\xd1\x1c\x8c\x30\x62\x6d\xcf\x47\x6d\x90\xc5\xf8\x9d\xbd\x3f\x1a\x74\xc4\xbc\x64\x6e\x8f\xb4\x86\xc5\xf3\xbb\xf6\xb2\xe2\xdf\xae\xc1\xbc\x4c\x94\x1d\x3c\x47\xb3\x62\x49\x49\xca\xa5\x20\xc6\x75\xc7\xa6\x70\xf8\x16\xe1\x90\x6a\x90\x5f\xa3\xc5\xe7\x5e\xb7\x6b\x82\xf6\x26\xeb\x54\x44\x4c\x84\x49\x14\x1d\x1c\x8d\x6f\x44\xf7\xa5\x33\x14\x0a\x45\x59\x73\x6a\xf7\x66\x64\xce\xba\x0e\x71\x0f\xf2\xba\xe9\xbe\xd6\x73\x45\x4f\xe9\xa5\x78\xf2\x87\x6e\xd7\x31\x7c\x4a\x1b\xcb\x24\x70\x70\xe0\x3f\x14\xdc\x2f\x20\x54\x60\x0d\xfa\x14\x15\x64\xbb\x6a\xae\xaf\x1c\x22\x09\x3a\x19\x4a\xb4\x0d\xeb\x31\x53\x64\x01\xaf\xd7\x9d\x1c\x37\xc0\x35\x9c\xab\x47\xc3\xeb\x17\xff\x27\xaf\x70\xbf\x36\xa4\x4e\xce\xe2\x21\xc4\x7e\x8e\x6a\xff\xe5\x21\x77\x6b\x41\x94\x2a\x84\xec\x9c\x96\xfb\x0a\xa1\xae\xc0\xa5\x41\xd9\xa9\x94\xda\x82\x73\xe9\x8d\x80\xac\x54\x61\x8a\x5d\x3a\x26\x27\x67\x13\x72\x12\xde\xb2\x3b\xbf\xe4\xaf\x50\x76\xec\xf5\x3c\x72\x94\xb4\x5f\xf5\x48\xe2\xf0\x37\x28\x7f\x0d\x02\x0f\x98\xae\x2f\xa6\x42\x3f\x53\xb1\xfb\x42\x0a\xf4\xbd\x5b\x6b\x7c\xd4\x8c\xf7\xd6\xa9\x83\xf4\x17\xd9\x5c\x5e\xcf\x50\x98\x7b\xc0\x62\xb3\x46\x30\x44\x4c\x82\x39\x8e\xe8\x49\x2c\x75\xb6\x42\xc9\xc1\xf6\x63\xce\xf9\x8d\x5b\xaa\xa3\x0d\xe1\xf0\x66\xe7\x8b\xb5\xde\xa5\x4a\xd9\xe0\xf0\x89\xaf\x53\x74\x7f\xdb\x42\x27\xb7\xd0\x49\x48\x7b\x85\xa6\xff\x2b\x20\xd9\x3e\xd7\x7b\x77\x9a\x5c\x9b\xc4\x84\xbf\xba\xbd\xb9\x6b\x3f\xac\xdb\x87\x1f\x0e\x74\x77\xa6\x3a\x34\xc6\x4f\x7c\xff\xc4\x71\x5c\x3c\x31\x32\xd7\xdd\xb3\x65\x0a\x69\xe2\xef\xdc\xc9\x9a\xe3\xf1\x17\x87\xfe\x82\xe2\xd8\x5d\x10\x5c\xd1\xb8\x66\x19\xe7\xae\x59\xbe\x4d\x13\x68\xe2\x5e\x80\x8f\x2b\xfa\x5d\x0e\x1d\x11\xf8\x57\x4b\xbe\x43\xdb\xe7\x35\x0f\x07\xef\x52\xf5\xf1\x5f\xa7\xe2\x43\x3d\x1f\x49\xb0\x5d\x69\xe6\xd2\x6c\x77\x76\xe8\xd5\x6f\x9c\x22\x2b\xdc\xc1\xad\x03\x45\x37\x7c\x07\x97\x6f\x67\xea\xfd\x8c\xc6\x93\x11\x23\x12\x61\x23\xf7\x2a\xab\xc4\x6f\x73\x55\x13\x4f\xd7\xee\xdf\x5f\x7b\x3a\x5d\x7b\x7e\x7f\xed\xf9\x64\xed\x83\xb5\x7e\x73\xed\xe5\x74\xed\xf1\xfd\xb5\x73\xb3\x27\x0f\xbe\x70\x13\xbe\x5f\x4c\xfe\x9e\x3d\x7c\x96\x30\xfb\x3d\x7b\xfa\x2c\xf9\xf5\x7b\xf6\xf8\x59\xe2\xe3\x77\x6f\xbe\xb3\xa4\xa3\xef\xde\x8c\x5f\x24\x2e\xfd\x6a\x9b\xf3\xb5\xd6\xd2\x67\x5b\x3b\x77\xb3\xbe\xd6\x5a\xfe\x7c\x6b\x67\x6e\xde\xd7\x5a\x2b\x27\x39\x5a\x69\x0c\x9f\x3a\x11\xe6\x12\x66\x89\x92\x32\x9d\xa9\x77\x56\x29\x8e\x62\xac\x27\xc9\x5b\xee\xc3\x9a\xd3\xac\x35\x98\xde\xb0\x56\x02\x61\x1e\x97\x51\xc9\xf1\xb0\x8c\x6d\x1f\x1f\x3f\xed\x6e\x12\xb2\x95\x5f\x88\x8c\xc1\x65\xd0\x6c\xda\x83\xae\xa7\x6f\x19\xfe\x01\xa2\xfb\x9a\xb7\x0b\x2c\xaf\x33\x77\xef\xc3\xde\x67\x49\xed\xdf\x87\xbf\xcf\x12\xd4\xbf\x0f\x83\x9f\x25\xbd\x7e\x1f\x0e\x3f\x4b\xba\xfc\x15\xb0\xf8\x17\xc9\x82\xbf\x22\x1e\x7f\xa5\xbd\xf8\x05\xed\x9d\x8d\xc9\x5f\x69\x2f\x7d\xbe\xbd\xf3\x71\xf9\x2b\xed\xe5\x2f\x68\xef\x6c\x6c\xfe\x4a\x7b\xe5\x15\x21\x4a\x55\xd2\xda\x21\x51\x65\x58\x37\x4c\xfc\x0b\x22\xcd\x40\x6f\xba\xa0\xd0\xb3\xe1\xaf\x98\x61\xff\xa2\x21\xf0\x97\x5e\xb2\xfc\x2f\xe5\xc5\xa1\x4e\x3d\x57\xd0\x5c\x4a\x9c\x73\xba\xbe\x6f\xac\xef\x7e\xcb\xf8\x37\xe7\xc9\x6f\x3f\xf9\xdd\xe8\xef\x2b\x11\x23\x7e\x2e\xcd\x52\x64\x2d\xf5\xb5\x34\x4b\xce\xfa\xa3\xba\x74\x1d\xbe\xf1\xdd\x9b\xc6\x46\x14\x6b\xd6\x07\x6c\xe6\xab\x77\x49\x47\x09\x87\x36\x91\x2f\x26\xed\x3d\x3e\x78\x84\xfc\xd4\x1e\xd7\x36\x94\x70\x99\x4d\x0a\x29\xc8\x04\xf3\xd7\x4c\x64\xfc\xb5\x2c\xd6\x3b\x6f\x50\xbe\x96\xfc\xfa\x33\x24\xce\xc7\x41\x9c\xba\x2a\x4e\xf4\x07\x02\x5d\xa7\xc8\x30\x50\xe0\x05\x8c\x6e\x7e\xb1\x7d\x08\xbc\xf8\xd7\xbd\x9c\x6f\x91\xda\xff\x15\xa0\xe6\x2f\x97\x04\x7f\x4e\x96\xfa\x87\xf6\xe3\xed\x6f\x9f\xee\xb6\x53\xf5\xf5\xe9\x45\xc5\x57\x8a\xd5\xe4\x11\x45\x67\xee\x64\x79\x56\xc8\x98\xc3\x1b\x75\x76\x88\xb1\xe8\xc8\x85\xd6\x53\x40\x8c\x64\xe9\x18\x3a\x4f\xc1\xe1\xf7\xac\x7f\xda\x69\x73\xef\xbf\xba\xbe\x6f\x14\x2d\xfa\x56\x20\x80\xd7\xa4\xf3\x66\x42\xc5\x59\xfd\x3d\x1b\xbe\xc1\x3b\x7c\x2d\x0d\xa5\xf7\xd9\x39\x28\x47\x29\xa7\xfb\x2e\xc7\xfb\x3e\xf8\xea\xb5\xbe\xcb\xf1\xbe\xd7\xaf\xcf\xed\xfb\xa1\xee\x6a\x34\xcc\x4b\x71\x14\xc2\x3c\x43\xfd\xbc\x90\xf3\xba\x31\x87\xe6\x20\x5a\xe8\xbd\xba\xab\xf0\xee\x91\x28\xa7\x76\x38\x11\xfd\x14\xd9\xa3\x53\xb4\xff\xe8\xfa\xbe\x5e\xda\xce\xaa\x3d\x5f\x0d\x1c\xc4\xbb\x35\xe4\x60\x86\x2f\xf0\x0a\x01\x9e\xeb\xc7\x5f\x53\xed\x15\x46\xd5\xbb\x81\x1c\xac\xf5\xf1\x81\xec\x3f\xc2\x40\x7c\x1d\xc8\x78\xa9\x2b\x38\x04\x73\xb0\xd2\x11\xfa\x99\x6f\x1c\xc8\x69\xe5\x57\x07\xe0\x13\xdd\xb9\x73\xbf\x84\x87\xd7\x94\xa7\x74\x84\xad\x74\xc4\xf9\xa8\x82\x85\x9c\x9f\xc1\xba\x25\xed\x5d\xb4\xf5\x6d\x7e\x55\x7d\xda\x03\x10\xd6\xa3\xb1\x85\x32\xe9\x4e\xa3\x14\x3a\xa3\xc1\xca\x97\x82\xf5\x59\x02\xcb\xaf\x29\x02\x09\x5f\xaa\x60\xf9\xd7\xb8\x9f\xde\xa6\x17\x99\x0c\x37\xd3\xc8\xc8\xfb\xd5\xe4\x4c\x21\xcd\x1c\x1c\x52\xee\x1c\x25\x17\xc3\xa7\x85\x77\x6f\xd3\x92\xc4\xb1\x6e\xaa\x46\xde\x7e\x4f\x34\x4a\x15\x30\x71\x78\xdb\x26\x08\xe4\xde\xa4\x45\xfa\x8a\xde\xa1\xe0\x8a\x5b\x6b\xc6\x8d\x7c\x30\x6e\xb7\xbd\xe0\x79\x95\x42\x80\x0e\x73\x4d\x2a\x44\x24\x62\xa6\x10\x75\x67\x70\x9a\x1e\x32\xb6\xba\x61\xf8\x9b\x4e\xe1\xeb\xec\xee\xd7\xa2\x98\x5c\xa3\xc4\x6e\x54\xd0\x3e\x23\xf8\xfe\x11\x9b\x31\xd1\x33\xa3\x0d\x26\x74\xe6\x9e\xc1\x86\x59\xfd\xd5\x54\xf5\x10\x14\x50\xa2\x39\x75\x9d\x82\xf7\x71\x23\x83\xb8\xaf\x5d\xfc\xe8\x2f\x65\x5e\x8f\x92\x3e\xa9\xbc\xd6\x8f\xbe\xc0\xeb\xfd\xa8\xa5\xbe\xb8\x1f\xee\x98\xbe\xcf\x2f\x30\x23\x6f\x51\xb8\xfb\x25\x66\xe8\x0c\x35\xac\xa9\xd0\x61\xd9\x03\x63\x7f\x6a\x8e\x45\x10\xce\xbe\x05\xea\xfb\xc3\x7f\x2c\xa9\x38\x71\xeb\xf0\xa5\xfa\x5e\x5f\x9b\x11\xf7\x5f\x78\xd2\xc2\x0b\x71\xde\x2f\x9f\x19\x2f\x5f\x7d\x0d\xfb\xe4\xe1\xe2\xd9\x11\x50\xf9\xea\x78\xf3\x2b\x32\xad\x9c\xe1\xea\x6c\xd8\xaf\x42\x82\x88\x54\x3b\x35\xb0\x84\x78\xd7\xbd\xba\x92\x40\x2b\x2b\xf1\x70\x4b\x74\x95\x20\xe4\xc2\x5b\x41\xef\x2d\xea\x4b\xc3\xc3\xb6\xd9\x81\x20\x8e\xfa\xe9\xa1\x66\xc8\x23\xa8\x18\x2f\x04\x6e\xdb\xde\x04\x8f\xc7\xce\xe1\x2f\xd7\x5f\xfa\x6b\x3c\xdc\x3e\xd7\x7b\xff\xc5\x12\x83\xd9\xc3\xdd\x7d\xfb\x72\xf7\x38\x35\xec\x1d\xf9\xbe\xa8\xde\xe0\x12\x7c\x2b\xc3\xeb\x4a\xd3\x29\xf0\x46\x6f\x79\xe6\xc9\x69\x6e\xaf\xd7\x5b\x3d\x3e\x4a\xa2\xa8\xc5\xe1\x6d\x6a\xa7\x33\xc8\x88\x9a\x08\x07\xbd\xdc\xa5\x1d\xed\x62\x85\x42\x34\x91\x10\x94\xb1\x1b\x7f\x17\xd9\x23\xba\x99\x12\x30\xc1\xd4\xb4\xdb\x54\xfb\x5e\xbd\x4f\xf2\x90\x11\x5c\x21\xe9\x1a\x25\xed\x4f\x1a\x86\xc2\x87\x27\x3d\x81\x25\x58\xae\x49\x4f\x6a\x49\xb2\x75\xe1\x3c\x08\x63\xa4\x1d\xcf\xe4\x74\x1f\xe6\x60\x8a\x96\x2f\xfd\x47\x8d\x01\x16\x00\x81\x5d\x6a\x44\xde\x38\x14\x64\x04\x12\x99\x75\x5e\x52\x7d\x35\x1c\xa9\xbe\x3a\x77\xfd\x7b\x9f\x94\x02\x86\x6e\x12\x49\xb8\x65\xe9\x3c\x78\x77\x54\xbf\x6e\x3c\xeb\x28\xc0\x89\x71\x0d\x81\x8c\xb4\x43\x00\xfb\x2f\xaf\xbb\x6a\xfc\x4c\xa7\xbf\x2e\xc2\x4e\xa1\x96\xc1\xa8\x7a\x62\x6e\x11\x21\xae\xa7\x7b\x94\xfe\x44\xc4\x03\x96\x2e\xed\x3e\x80\x33\xe8\xe6\x48\x55\x5d\x23\xca\xa5\xe4\x68\x38\xaf\xcf\xd1\xb8\xeb\x85\x1c\x13\x94\x43\x01\x98\x2c\xb5\xb1\x1a\x8f\x79\x9e\x00\x59\x52\x20\x8b\x00\xb2\x3d\xc3\xda\x7f\xf5\x66\x4a\x2d\xd5\x80\xcb\x14\x5c\x5b\xe0\xa1\x3f\xee\x97\xdc\xc3\x8d\xe8\xac\x86\x3a\xac\x69\x6d\x76\xff\xd1\xdb\x29\x33\xf8\xc2\x14\x2c\x27\x5c\x4a\x71\x2f\x69\x40\xb8\x67\xf6\x9d\xf7\xe8\xc1\xcb\x6e\xad\xf5\xb3\x73\xe8\xb0\x09\x3e\xf9\x70\xf7\xe1\x15\x57\x14\xf0\x0a\xc5\x85\x32\x68\x8d\x89\x69\x67\x0c\xb6\xb3\x28\xf7\x7d\xda\xa1\x8d\x54\x4d\xa2\x56\x88\x26\x5d\xf7\x27\x58\xd3\xb6\x50\x50\xf4\x1b\x76\x44\xb6\x25\x5f\x36\xb6\xc6\xd0\xc9\x3c\x43\x5c\x99\xb4\x77\xfa\x3e\xe8\xc0\x7b\xb1\x86\xeb\xd8\xe1\xce\x76\xd6\x17\x1d\x91\xd9\x5b\xa4\x0a\x89\x85\x36\x70\xaa\xb6\xf2\x6e\xef\xdb\x29\x78\xeb\x17\x9c\x14\x65\x94\xa1\x4a\x7a\x26\x56\x6e\x78\x3d\x72\x1a\xa6\x18\xa5\xf0\x82\x15\x74\xc2\xd0\xd9\x8c\x14\x4b\x69\xf2\x7d\x10\xe3\x37\x16\x51\x51\x5c\x18\x7a\xe9\xe2\x64\x64\xc3\xf8\x86\xb9\x85\x9b\xa5\xd2\xcf\x7d\x63\x85\x9a\x60\x02\x39\x04\xe3\xc8\x35\xe9\xb6\x62\x9d\x40\x89\x1b\x72\x4c\x2e\xb5\x49\xb7\x4b\xda\x07\x3a\x42\x7c\x52\x4f\x05\x43\x2c\x35\xe9\x7a\x2d\x11\x81\x8f\x36\x4c\x99\x0a\xb7\x99\x52\x34\x79\x6f\x95\x51\x9d\x89\x05\x9e\x4d\xdb\x1c\x4c\xee\x7b\x7d\x09\x40\x72\x56\x58\xcf\x09\x2e\x86\xf3\xac\xc0\xe1\xca\x3e\x5e\x4c\x05\x08\x21\x1f\xda\x52\x31\x73\x1f\x0e\xd7\x3a\xa3\xb0\xa4\x5f\x33\xe1\x6c\x18\x41\x52\xd1\x81\x74\x43\x9e\x9e\x0d\x08\x4c\x90\x64\x83\x23\x7e\xe7\xef\x0b\xbe\x05\x2d\xb1\xdb\x58\x1d\xab\xa7\x66\xe8\x60\x56\xa7\x37\x65\x2a\xbe\x8f\x71\xaf\x80\xae\x93\xb2\x26\xde\x78\x04\x60\xf5\x23\xbf\x6b\xc5\x32\x0d\x0d\x1a\xf6\xa3\x7d\x97\x44\xd8\x23\xec\x40\x43\xde\xaf\xa9\xc9\xda\x72\xb1\x7b\x58\x42\x54\x58\x4e\x56\x36\x96\xc9\x15\x62\x69\xa1\xad\x9f\xfa\xb3\x8c\xab\xfc\x89\x2b\xf1\x5f\xff\xf5\x60\x1f\x5d\xb7\xbd\xab\x67\x2c\xe9\x2d\x7e\x29\x81\x3c\x75\x2b\xab\xfb\xdb\x62\x7f\x5b\x08\x28\x5a\x20\xab\xb2\x33\x0c\xd7\x0d\x65\x74\x5e\xb5\x05\x37\xf4\x9e\x47\x45\x6c\xf5\x67\x3b\xf0\x24\xdc\x28\xdc\x6d\xb4\xfb\xd3\xd9\xae\x5e\x72\xcf\x16\x6a\x4f\x09\x87\xce\x75\x56\xb7\xe3\x24\x8d\x76\x9c\x33\xb2\x80\x8f\x52\x72\x8a\x1b\x92\xee\x90\x1d\x39\xce\xa2\x58\x00\x22\x4a\xfc\xeb\x10\x9d\x14\x2b\x0b\x51\x34\xec\xa3\x22\xb7\x62\xca\xce\x1a\xc3\xd6\x48\x62\x25\xcc\x0a\x25\xc4\x7a\xe9\xc6\x92\x14\xb6\x9d\x6c\x2c\xb0\xf9\xde\x71\x15\xba\x91\x8b\x66\xad\x71\x2a\x8f\x50\xca\x86\xbc\xd8\x91\x37\x78\x4c\x19\x82\x0c\xbc\xc7\x59\xe2\x2e\x9a\xb3\x9c\x3e\x06\x82\xf1\xf3\x44\xd9\xcd\xb8\xf6\x6f\x17\x59\x2e\x9a\x40\x85\x97\xae\xa1\xa6\x1c\xbc\x4c\xb0\xf8\x95\xb9\x54\x9f\x72\xc0\xbd\x9a\x74\xf0\x8f\xf8\xaa\x4d\x59\x96\xeb\x2b\x41\x30\x1e\x18\x05\x57\xad\x71\x7f\x7d\x95\xab\x02\xbf\xc8\x36\xae\xe3\x1b\x95\xf8\x07\x62\x38\x04\x45\xe7\x16\x74\xd2\x8e\x58\x3a\x16\xa3\x79\x6b\xc9\xfb\x2f\x88\xd2\xbc\x6e\x5a\xb8\x49\x44\xd2\x2d\xf8\xd7\x88\xd3\x3c\x3b\x88\xd3\x5c\xfb\xfe\x16\xcf\x6e\x53\xd7\x73\xba\xad\xe2\xa9\x95\xd4\x49\x46\x64\x81\xc9\x1b\x86\x7d\x29\x15\x7e\x75\x21\x39\x60\x21\xc5\x48\x3c\x16\x8b\x59\x8f\xac\xbc\xb5\xe4\x16\x4a\x7a\x27\x23\xba\xcf\xcf\x8d\xc4\x3c\x9c\x6d\x36\x60\x66\xc8\x67\x2c\xc4\xa8\x0a\x5b\x03\x71\x17\xf0\x7b\x4a\x0b\x53\x0c\xdb\xba\xaa\x5d\x98\xe6\xd9\x18\x0e\xb8\x9f\x64\xde\x34\x90\xb2\x8f\xfa\x8f\x97\xf1\xfa\x5e\x2c\xc7\x65\xa0\xec\x37\x9e\x44\xb9\xa6\x2f\x0f\x4e\xd6\xed\xb9\x3f\xdc\xae\xd6\x0f\x8f\x9b\xc7\x1f\x7e\xc2\xd6\x7b\xfe\xf5\xbf\x5d\x3e\x7d\xda\xdc\x3e\xd9\x8f\xb7\x0f\xab\xbb\xcd\xe5\x37\x83\x58\x26\x9a\xff\x7b\x64\x9b\xcb\x8f\xeb\xc7\x87\x5b\xbb\x6e\x1f\x6e\x9e\x6f\x5f\x86\xa5\x7e\xaf\x2f\xe6\x35\xdf\x5c\x3e\x3c\xda\x3f\xdd\x7d\x7f\x37\x2c\xf0\x4f\x8f\xff\xed\xee\xfb\x3b\x73\xf7\xf0\xfc\xd2\x6e\x36\xdf\x0c\x83\x2b\x21\xc7\x7c\x7a\x38\x7c\xf7\xc7\x3e\xcf\x6c\xda\x9f\x6e\x9f\x9e\x07\xaf\x16\xc8\x30\xdf\x6d\x1e\x57\x3f\x0e\xb2\x7f\xa3\xbf\xcd\x25\xb2\x9f\xed\x0f\x4f\x8f\x9f\x3e\x5e\x4e\x5f\x3f\xc3\x25\xab\xf9\xee\xd3\xc3\xcd\xe6\x76\xf8\x12\x19\x46\x7b\x3e\xc8\x45\xb7\x2f\x9f\xda\xd5\x8f\xf6\xf9\xf6\x69\x7b\xfb\x34\x9a\x9c\x76\xf5\xe3\xb7\xc8\x35\x97\xeb\xf6\xe9\xc6\xde\xdc\x3d\xff\x38\x2c\x30\x6f\x9f\x6e\x7e\x7b\xf7\xac\x5d\x6a\x57\x3f\x7e\xfa\x68\x9f\x6e\x9f\x5f\x1e\x9f\x6e\x47\x9d\xc2\x9b\x7f\xae\x2f\x4c\x2d\x77\xf0\xda\xdc\xdc\x6e\xef\x56\xb7\xc3\x29\xf8\x6d\xcd\x31\x3f\xde\xfe\xf4\xdd\x63\xfb\x74\x33\x78\xf5\x7f\x77\x59\xe6\xfe\xf1\xd3\xf3\x70\x8c\x57\xfa\xdb\xdc\xb4\xcf\xeb\xe9\x27\xbf\xed\xf3\xcc\xfa\xf1\xf9\xe5\x9b\xb1\xb7\x79\xf3\x5c\x3d\x25\x7f\x73\xe0\x3b\xd9\xac\x36\x9f\x9e\x5f\x6e\x9f\x06\x6f\x3e\xd4\x1c\xd3\x7e\xfc\xb8\xb9\x5b\x41\x46\x30\xec\xf6\x6c\x90\x6d\xbe\xfb\x74\xb7\xb9\xb9\x7b\xf8\x61\xb4\x0c\x35\xcb\xac\x3e\x7e\x1a\xd6\xfa\xfb\x3f\x9a\xfb\xdb\xfb\xc7\xa7\x9f\x86\xc3\x41\x86\xb9\xbc\x69\x5f\x5a\xdb\xf5\xe4\x72\x34\xa8\x97\xb6\xef\xce\xe5\xd3\xed\xf3\xe3\xa7\xa7\xd5\xad\xfd\xf8\xf8\x38\x06\xf1\xee\xc5\xef\x1f\x1f\x37\xe6\x79\x7d\x77\xbb\x19\x4e\xcc\xb7\xc8\x30\x97\xf5\x85\x5d\xad\x6f\x57\xa3\x25\xae\xef\x3f\x68\xf6\xae\xd0\x9f\x0f\x0b\xfc\x3f\xe6\xee\xfe\xe3\xe3\xd3\x70\x66\xff\x11\x19\xe6\xf6\xcf\x93\xfc\xff\x8c\x0c\x73\xf9\xe9\xe3\xe6\xb1\xbd\xb1\xab\xcd\xe3\xa7\x9b\x61\x85\x7f\x44\xfe\x07\xcd\x36\x97\x37\x8f\x7f\x7a\x38\x5e\xec\xb7\xdd\x9b\x5a\xf0\xe3\xe6\xd3\x0f\x77\x0f\xc3\x2d\x8b\x0c\xf3\xfd\xe6\xf1\xe3\xc7\xe1\x9c\xfe\x03\x32\xcc\xea\xf1\xfe\xe3\xa7\xc9\xc2\x76\x59\xe6\xe6\xee\xf9\xe3\xa6\x1d\x7e\xf4\xdb\x9a\x63\x5e\x6e\x9f\xee\xef\x1e\xda\xe1\x26\xfe\x43\x97\x65\x56\x8f\x37\xb7\xa3\xda\x6e\x6e\x87\x30\x72\x1c\x44\xcc\x77\xed\xcb\xcb\xed\x68\xd1\x7f\x53\x73\xcc\xfd\xe3\x77\x77\x9b\x31\x70\x6b\x86\x79\x69\xbf\xdb\xdc\x0e\xe7\xf3\x0f\xc8\x30\x97\x0f\xb7\x2f\x7f\x7a\x7c\xfa\xd1\xfe\xb0\x79\xfc\x6e\xb4\x03\xff\xa9\xbe\xf8\x2f\x9a\xbf\x2f\xf6\x7c\xfb\xf2\x72\xf7\xf0\xc3\xf3\x91\x92\xdf\x76\xaf\x06\x85\xff\x74\xf7\xb2\x5a\x1f\x2b\x8a\x17\xe6\xe9\x71\x32\x99\xff\x8c\x0c\xb3\xbd\x1f\xe4\x2d\xaf\xcc\xe5\xf6\xfe\x4f\xb6\xfd\x38\xc2\x5a\xcb\xab\xff\x36\xfb\xf8\xd1\xac\x6e\x9f\x5e\xee\xbe\xd7\x79\x19\x4d\xe3\x3e\xd7\xb4\x4f\xab\xf5\xdd\x76\xf8\x76\x56\x73\xcc\xa7\x87\xc3\x77\x7f\xec\xf3\xcc\xea\xf1\xe1\xe1\x76\xf5\x32\x5a\x1c\xe4\xe8\x4a\x1f\xbe\xfc\xed\x2e\xd3\x6c\xee\x1e\x86\xe8\x77\x71\xf7\xf0\xa3\xf9\xf4\x30\xc9\xfd\x23\x32\xcc\x25\x20\xd4\x76\x33\x76\x39\xc2\x18\x8f\x9f\x6e\xba\xf9\xea\x8b\x3d\xaf\xda\xcd\xed\x41\xa1\x6f\x35\xb7\x2f\xf2\xf2\xd4\x7e\xff\xfd\xdd\xea\xa0\xd0\x1f\x6a\xbe\xb9\x5c\x55\xef\x83\x76\xf3\xe9\xa1\x2b\xb4\xf7\x47\x68\x6e\x6e\x3f\x6e\x1e\x47\x30\x8c\x0c\xb3\xbe\xdd\xdc\xfd\x79\x88\xff\xf4\xb7\xf9\x7e\xd3\x3e\xff\x38\xda\x25\xed\xf3\x8f\xa6\xbd\xb9\xbf\x7b\xb8\x7b\x7e\x79\x6a\x5f\x1e\x87\x8b\x3b\x1b\xe6\xf7\x47\xc3\xd3\xdd\xf6\xf6\xe0\x6c\xd0\xcc\x61\x01\x9c\x20\xcf\x47\x8b\xe9\x39\xf2\x6c\x1e\xb6\xf7\xc3\x45\xfc\xa7\xe5\xd5\xad\x79\x7e\x1e\x21\xac\x6f\x7f\x6b\xbe\xdb\x7c\xba\x7d\x79\x7c\x7c\x59\x8f\x0e\xbf\x2e\x4f\xcf\xc7\xee\xd1\x3e\x7e\xff\xfd\xe5\xb1\x32\xbf\xfb\xfe\x7b\x73\xf9\xf1\xe9\x71\x75\xfb\xfc\x6c\x1f\x1f\xec\xf6\x7e\x74\xdc\xd7\x17\xbf\x7b\x50\x88\x6d\x9f\x9f\xef\x7e\x78\xb0\x9f\x9e\xc7\xb8\x77\x86\xec\x3f\x3e\xeb\x49\xf0\xf2\x38\x04\xf3\xd9\xcb\xe3\xbd\x1e\x88\x4f\x56\x51\xc2\xf8\x28\x7c\x02\x5a\xb8\x5c\xdd\xd8\x9b\xed\x08\x9b\x7d\xb8\xf9\xed\xf6\x46\x21\xf5\xa5\xbd\x7b\x98\xa0\xa5\x2e\xaf\x2e\x38\x1e\xed\xf6\x71\xf3\xe9\x7e\x0c\x3f\xfd\xbb\x25\x5e\x99\xcb\xef\xef\x36\xb7\xf6\x59\x39\x8e\x61\xb1\x1d\x1b\x62\x2e\xff\xf5\xb0\x83\xff\xb5\xf6\xef\xd3\xf3\x77\xdf\x8c\x02\x65\x9b\xa7\xf6\xa6\x1d\x6d\x6f\xfd\x6d\x56\x7d\x58\xaf\x6f\x8e\x84\xfa\x32\xcf\xff\xfa\xe9\x6e\xb4\x70\xfa\xdb\xdc\x75\xd1\x26\xbf\x39\x0c\x40\x69\x9e\xba\xc0\x72\xdf\x1c\xc6\x9a\x33\x97\x7a\x6e\x1f\x92\x3c\xbb\x60\x31\xe6\xb2\x3b\xc4\x6d\x5b\xe3\x1d\x5c\x1e\x9e\xe6\x5d\x24\x04\xa5\xe0\x6e\x6e\x0f\xeb\xda\xf9\xb3\x37\xfa\xfe\x79\xf2\xe6\xd9\x3c\xf4\x1e\x92\xbf\x39\xe2\x35\x19\xdf\x4c\x3e\x31\x1f\x1f\x87\x13\xf0\xfb\xc7\x1b\x73\x79\x7f\x7b\x73\xd7\xda\x55\xb5\xeb\xbe\xfc\xe6\xb8\xbd\xb7\xb9\x7c\x69\x3f\xde\x1e\xee\xa9\x9d\x1e\xa3\x69\xfb\xfb\x89\x6f\x8e\xdc\x59\x98\xcb\xd5\x9d\x5d\x8d\xe1\xeb\xee\xc3\xcd\x10\x26\xac\x1c\x85\x0a\xf9\x77\xf3\xbb\xef\xfe\xe7\xed\xea\x85\x6e\x6e\xbf\xbf\x7b\xd0\x9d\xf0\xf1\xf6\xe9\xe5\xa7\xbf\x3b\x24\xaa\xcd\x65\x47\x30\x9a\x3b\xba\xb9\x7d\x5e\x3d\xdd\x7d\x7c\x79\x54\x0c\xf4\xfd\xdd\x0f\x47\x8a\x93\xae\xdf\xaf\x7e\x75\x46\xf5\xab\xc7\xfb\xfb\xf6\xe1\xe6\x4b\xeb\xef\xcf\xe6\xb3\xda\xa8\x87\xac\x05\xe1\xff\xa5\x0d\xd5\x6f\xce\x6a\x66\x73\xb7\xba\x7d\x78\xfe\xe2\x16\x06\x47\xe1\x59\xcd\xec\x8f\xb3\xdb\x2f\x9d\xb6\xff\xbe\xe3\x66\xfe\xdf\xb3\x9a\x7a\xba\x5d\xdd\xde\x7d\xf9\xea\xff\xf7\x09\x6f\x75\x5e\x63\x37\xb7\x8a\x6b\xbf\xb8\xa9\x11\xaf\x77\x66\x4b\x0f\xed\x17\xc3\xb3\x1e\x9c\x67\x55\xfe\xfd\xe3\xe6\xe6\xf6\xa9\xc3\xc9\x5f\x3a\x98\x01\x1a\xd7\xa1\x5c\x7e\x7a\xa8\x2d\xdd\x5c\xfe\x87\x5f\xbf\xfc\xf4\xf1\xf6\xf1\xfb\x8b\x3f\xdd\x3d\xdc\x3c\xfe\xe9\x3f\xfe\xc7\xfa\x97\xd6\xed\xf3\xef\xfe\xf4\xb0\xeb\xc9\xe5\x87\x4d\xfb\x74\xf7\xf2\xd3\x3f\xae\x1e\x1f\x9e\x2f\x7f\xb5\x2b\x36\xcc\xa6\xf6\xe6\xe6\x48\xeb\xbf\xfa\x77\x73\x49\x7f\xff\xf1\xe9\x51\x47\xf8\xfc\xf7\x77\x5a\xf4\xef\x9f\x9f\x56\x7f\xff\x8c\xd7\x7f\xff\x72\xfb\xe7\x17\x7b\x7b\x73\xf7\x62\x9f\xbb\x3d\xf8\x7c\xf9\xcd\xf7\x9f\x1e\x56\x8a\x84\xfe\xee\xc5\xdc\x9a\xa7\x5f\xfd\xdb\xe5\xa7\xe7\xdb\x8b\xe7\x97\xa7\xbb\xd5\xcb\xe5\x7f\x3a\x31\x59\xe6\xf2\x7f\xfc\x8f\xdb\xe7\xab\xc7\x9b\x4f\x9b\xdb\x4b\xf3\x6f\xdb\x76\xf3\xe9\xf6\x9b\xff\xd0\xfc\x7b\x65\xe6\xff\xfc\xf2\x9f\x6f\xee\x5e\x3a\x56\x7e\x80\xd4\x3f\x7d\xbc\x7d\xaa\x33\x38\xca\xfd\xee\x30\xef\xe5\xe9\xee\xc7\xdb\x97\xf5\xd3\xe3\xa7\x1f\xd6\xbf\x1e\x1d\x3c\xb7\x0f\xc3\x82\xbf\xfb\xf4\x32\xc9\x99\xdf\xfd\xb0\xde\xdc\xfd\xb0\x7e\xb9\x7d\xfa\xf5\x90\xe8\xff\xf3\xcb\x87\xc7\xcd\xe3\x30\x6f\xd1\x3e\xfc\xf0\xa9\xfd\xe1\x76\x90\x35\xdb\xdc\xfd\xf0\xf0\x87\xc7\x8f\xd3\xac\xab\xbb\x9b\x9b\xcd\x41\xc1\xdf\x3c\xbe\xbc\x3c\xde\xff\x7a\x48\x58\xde\xdc\x3e\x6d\xee\x1e\x6e\x27\x2d\x4f\x3f\xfc\x67\xed\xdf\xe4\x05\x44\x01\xff\xf5\xd3\xe3\xcb\xf0\xe3\xdf\xb7\x77\x0f\x2f\xff\xfc\xb8\xd9\x8c\x06\xf3\x4f\x9f\xee\xbf\xbb\x7d\x5a\xdc\x3d\x1f\x54\xbc\xb8\xfd\x7e\x5a\xef\xff\xf5\xe9\xf9\xe5\xee\xfb\x9f\x26\xb9\xff\xf8\xd2\x6e\xee\x56\x47\xfb\x75\xac\xce\x69\xde\x87\xdb\x87\xf1\xfc\xfe\xc3\xe3\xc3\xcb\xb7\x77\x7f\x19\xf6\x1d\x1c\xe8\x77\x8f\x7f\x9e\xf4\xb3\x7e\x3a\x1d\xfc\xa7\xcd\xe6\xf6\x65\x52\xf2\x37\x8f\x9b\x9b\x5f\x6f\x1f\xef\x6e\x2e\x9a\xff\xb4\x6d\x9f\x2e\xee\x7e\xfd\xf4\x77\xc7\xa1\xfb\xd3\xcb\xdd\xe6\xf9\xef\x9f\xb7\x3f\xd8\x97\xf6\x07\xfb\xc3\xed\xc3\x2d\x08\x5d\x85\xee\x5f\xfd\xa7\x49\x85\x77\xa7\x64\xb9\xf0\x60\x04\xe7\xb1\x93\x30\xce\x8d\x11\x78\xb4\x76\x69\x6b\xa9\x89\x93\xb8\xcc\x0d\x24\xf8\xd6\x91\x04\xf8\xe7\xaa\x49\x2f\xe5\x67\x87\xe8\x05\x6b\x9b\x66\x35\xba\xef\x20\xb8\x6f\x63\x0a\x22\xce\xc4\x16\xc1\x9a\x91\xf4\x92\xc5\x84\x08\xce\x7e\x9d\xc8\xb9\x95\xaf\x7a\xcc\x09\x6e\xac\x29\xe7\xfa\x14\xc8\x21\x1e\x8c\xfb\x20\x91\x9c\x18\x2e\x90\xab\x7a\x4a\x0e\x37\x4f\x62\x06\x43\xba\xbe\xe2\xaa\xab\xc2\xe4\xd7\x9e\x82\x5f\x49\x75\x16\x1b\x28\x17\x53\x03\xfa\x92\x73\x5b\x6a\x22\xa2\xd2\x47\xc4\xbe\xc7\xbd\x57\x81\x2b\x31\x3c\xcd\x51\x09\xe2\xe0\xb8\x64\x44\x56\xd5\x4a\x1d\x33\xa0\x05\x10\x2c\x1f\x1f\xb9\x5a\x74\xc9\x70\x78\x14\x56\x52\xf5\xa7\x1c\x45\xf8\x44\xd3\xbf\xda\xe0\xd9\xc1\x42\x47\x12\xfa\x01\xd4\x4c\x56\x75\xa0\x5c\x15\x48\xb8\xaa\x57\x15\xe2\x04\x0d\xab\x73\x9c\x6e\x20\xc4\xdd\xd1\xea\x38\xbd\xa1\x3e\x39\x5d\x1f\xb4\x5a\xcf\xad\x6f\x1a\x36\x56\xc8\x8b\x29\xe3\xa0\x5a\x73\x6e\xb6\x08\xf8\xed\x65\x72\xcd\x26\xe6\x1c\xab\x8b\x69\x78\xce\x1a\x8f\x32\x0e\xaa\x1f\x86\xab\xb4\xe7\x45\xaa\x3a\x52\xb5\xf8\xaf\x51\xf5\x61\xb8\xca\x01\x06\x3a\x85\x0c\x5c\xa3\x50\x9a\xe7\x01\x31\xa2\x48\xf7\xed\xae\x75\x23\x24\x73\x14\x18\xbc\xe1\xee\xfa\xf9\xbc\xe0\x17\xe3\xf0\x8f\x08\x58\x13\x49\x8e\x55\xbb\xb6\xb8\x80\x18\xe5\x9b\xf3\x9a\x93\x69\x74\x55\xc5\x58\xd2\xcc\x03\xa5\x70\x6c\x8c\x6b\xf1\x74\xf0\xe2\xcc\x21\x4e\xc0\x13\x51\x03\x8d\xc4\x39\x42\x68\x1d\x1b\xcf\x1c\x45\xde\x39\xb1\x87\x71\x8e\x47\x67\xd1\xc9\x45\xaf\xc1\x26\x06\x00\xed\xde\x0c\x75\x7c\x08\xd0\x6e\x04\xd0\x6f\xaf\x7a\x1a\x8f\x1a\xa1\xd1\xb8\x59\x73\x1c\x57\xb9\xb6\x27\x75\xc9\xbf\x60\xa9\xf4\xd4\x30\x0e\x1b\x0f\x8a\xfa\xfb\x43\xad\xea\xae\x2d\x12\x6e\xc3\x10\x7a\x1c\x2a\xfa\x89\xb2\x9f\x8d\xd7\x4d\xa8\x98\x42\xce\x6f\xa0\x0b\x10\xc8\x2d\x50\x6b\x98\x8d\x81\x6a\xd7\xd4\xbb\x96\x78\x47\x81\x9c\x3c\xe0\xd9\x14\x6a\xb2\x36\xee\x0c\x13\x0f\x8c\x9a\x72\x34\x79\xee\x29\x1e\x03\x49\x2e\x73\xe6\xa5\xa4\xe9\x3c\xe8\xab\x64\x9a\x25\x37\xc4\x65\x1d\x29\x96\x19\xbc\x76\xf2\xee\xda\xd3\x74\x2d\xbe\x03\x6c\x1a\xa5\x41\x38\xcc\x85\xe9\xe8\xfe\xe7\x32\x97\xb0\x94\x88\x8d\x7a\xbc\x7b\x89\xc4\xad\x1d\xb4\x37\x0e\x36\x15\x9f\x67\x30\x38\x9d\xf2\x21\x29\x78\x7a\x53\x29\x8e\xe1\xb2\xe4\xb8\x8e\x93\xe8\x8f\x69\x7a\x4e\x95\xe5\x30\x5e\x20\x82\x8b\xcf\x79\x1c\x5b\x90\xb7\x13\xf5\x87\x75\xdc\xfa\x79\x78\xbd\xcc\x9c\xd3\xd6\x4f\x2d\x83\x9b\xb9\xe3\x49\x87\x64\xa4\x87\xa2\x3d\xbf\xbe\x62\x31\x0c\x1b\x1a\xbf\xed\xcc\x1e\xf2\x3c\x2e\xe5\x98\xd9\xc3\x59\xc4\xcb\x9e\xb6\x3e\x35\x75\x61\xe4\xe7\xd3\x1b\x59\xba\xe9\x20\x86\x07\x7a\x38\x2b\x76\xef\x01\x82\xd2\x65\xca\x5f\x3a\x2b\xf7\x96\x4d\x9e\x73\x73\xf6\x3c\x4c\x43\x1e\x7b\xc3\xe1\x00\x0e\xf2\x92\xe3\x5c\xdc\xa0\x55\x94\xbb\xbe\xb7\x02\x6a\x06\x56\x7e\xe7\xa2\xb6\xc3\xc9\xaf\xdc\xce\x2b\x80\x3b\x81\xbc\xd7\xa7\xdf\x9d\x17\x3b\x79\x32\xff\xde\xc8\x21\xd4\x4a\x5e\xea\xf9\x3c\x06\x02\xbe\xbe\x17\x7d\x17\xb7\x71\x7e\x5e\xc0\xa6\x31\x7e\x17\x93\x8e\x35\x18\xe7\x3c\x9c\x78\x2d\x36\x68\xf0\xfc\x13\x65\x34\xed\x1d\xd7\x79\x12\x43\x7b\xb8\x2d\x9d\x2b\x65\x7d\x14\xd9\xad\x85\xd8\x2d\xe0\xe7\x15\xd1\x18\xc2\x9c\x1b\x44\xae\x3b\x8a\xb5\x13\x1d\x23\x24\xf4\x4d\xa0\xc0\x9b\x08\xe6\x2c\x90\x8b\x6b\x98\x8c\xbe\x13\x3d\x1e\xee\xf0\x21\xe7\x7d\x6a\xc8\x11\x0a\x64\x4a\x11\xa4\x03\xfc\xae\x54\xcf\x3c\xbe\x93\xea\x3b\x24\x44\x52\x30\xec\x8f\xd7\x7b\xba\x1f\xef\xa0\x33\x95\xd4\x53\xe4\x12\x8f\x9f\xaf\x07\x74\xe6\x5b\xda\x9c\xb2\x41\x0d\x82\xb3\x06\xca\x4e\x9b\x3d\x45\xc1\xfb\xf7\x92\xb7\x87\x54\xc8\x58\x0a\x73\x12\xd0\x2b\xed\x1d\xe7\x71\x0b\x9a\x57\x7f\xbe\xb3\x2b\x53\x66\x22\x63\xca\x6b\xf5\x79\x42\x70\xe1\xe5\x3b\x90\xb6\x50\x34\x1c\x88\xa7\xd5\x32\x55\xd0\xaa\xad\x32\x4d\x09\xbd\xdd\x87\xef\xe0\x20\x8a\xce\x5c\xee\xdb\x28\xe3\x89\xfb\x3a\xcc\xc2\x40\xbc\x36\x5d\xc0\xc7\xcd\x4f\x3f\x3c\x3e\x5c\x7c\x7c\xbc\x7b\x78\x79\x56\xe6\xdd\xc7\x8b\x44\x9e\x2f\xf0\x04\xeb\xd4\x8b\x48\x31\x0c\x1f\x23\x35\xe1\x22\x50\xaa\x0f\x5e\x93\x44\x1c\x2f\x3c\x05\xb9\xc8\x17\xbb\x3a\xde\xbc\xd6\x81\x42\x32\xec\x29\x4b\x4b\x29\xf6\x7a\xc9\x6c\x28\x3b\x4a\x6e\xd5\x98\xea\x09\x9e\x29\x79\x5b\x55\xd4\x24\x6d\xac\x18\xa6\x90\xb6\x3c\x4f\x14\xd3\x92\x33\x89\xb2\xbb\xce\x6d\xd8\x52\x4a\x2b\x4d\x61\xc2\x63\x7b\x83\x9f\x6c\x75\xfb\x42\xe5\x2d\xf7\xa2\x2f\xb1\xac\xed\x09\x45\x57\x93\x1e\x74\x41\x08\x37\x79\x83\x0e\xb9\x59\xc5\x3a\x9a\xd4\xae\xed\xbb\xfc\x76\x30\x44\x0c\x43\xf1\x14\x95\xb2\x75\x3a\x1c\x27\x7b\xaa\x85\x24\xad\x1a\x1d\xae\xa5\x94\x6b\xb8\x25\xc1\x9f\x56\x28\xb2\x91\xde\x38\x06\x9d\x35\xbc\xa1\x58\x28\xe9\x00\x13\x62\xba\xf6\x1a\xfb\x4c\xce\x52\xf4\x2b\x0a\x1e\xba\xca\x42\x12\x35\x8d\xf1\xd9\x92\x53\x94\x66\xd9\x50\x94\xb9\xa7\x54\xb6\xbc\x46\x59\xf8\x68\x64\x6a\x12\x6c\x30\xf5\x6f\x74\x5a\x3c\x40\xac\x66\x28\xee\x2d\xbd\x10\x3d\x28\x5a\x04\x87\xa6\xa4\xc7\x10\x2c\x6e\xa4\x3a\x47\xef\x70\x15\x53\x71\x2b\x58\x8d\x35\x35\xb2\x4a\x95\x9e\x41\xb6\x18\x95\xe9\x72\xba\x28\xbd\xbe\xb7\xd9\x4f\xcc\x3b\x30\xe8\xdf\x04\x49\x9f\x17\x24\x0d\xa5\xf3\xaf\x91\x91\xcd\xd2\x4f\x22\xc3\x8e\x1d\x1d\xf9\x6d\x9c\xc6\x96\x2d\x43\x83\x6b\xad\xe2\xfa\x2a\x1a\x3f\x97\x72\x26\xd5\x37\x3d\xfe\x9d\x89\x73\x27\xdb\x48\x52\x16\x9c\x75\x8b\xc7\x61\x20\xef\x06\xbb\x7e\xa9\x34\x52\x5c\x3a\x37\xee\xd5\xfa\xc0\x1e\xb1\xcc\xa5\xd9\x5a\x4a\x6e\xe1\x1c\x39\xc3\xa3\xb8\xed\x49\x39\xbc\x51\x24\x75\x13\xaf\xaf\x44\x1f\xe6\x9c\x97\xc2\x87\xde\x8f\x3e\xbb\xf9\x7b\x6f\x7e\x9d\xdf\xc7\xbd\xdb\xc7\xb4\xf7\xe3\xc7\xcd\xe5\xc5\xd3\x9f\x7f\x7d\xc9\x97\x17\x4f\x3f\xe1\xcf\x97\xa9\xa2\x9e\x9a\x28\x8f\x89\x82\xe7\x08\x3f\xb2\x5b\xd1\xbc\x7e\xaa\xfc\x84\x29\xf5\x13\x1e\xaa\x9f\xaa\x2c\x3a\x55\x52\x0c\xfb\xe1\xd4\x78\xc3\xee\x70\xb2\xbe\xd4\x66\xea\x40\x2e\xbe\xbf\x4a\x3a\x05\x96\xcc\xb0\x48\x8b\x14\x42\x0b\xf3\x35\xdf\xdb\xf5\x00\x21\x32\x02\xb4\x22\xfe\x7c\x4d\x9b\xce\x24\xc2\x45\x0b\x1b\xcf\xfd\xa9\xae\x08\x4c\x4f\x81\x95\xf5\xc6\xd5\x7b\x89\x94\x4d\xa2\xd4\x3d\x21\x52\xfc\x2c\x54\x6d\xee\x66\x67\x1a\xd3\x20\xb2\x5a\x1e\x19\x62\x42\xa5\x3a\x6b\x73\x9e\xa4\x4b\xfa\x43\x3d\x93\x3f\xfb\xb2\x60\x68\xaf\xb5\x1b\xab\x14\xe3\x2b\x2a\x9d\x8c\x35\xd4\x64\x37\xd2\x30\x1a\x29\xd7\x8b\x9e\xf2\xd9\xa1\xb6\xd3\xa1\x3a\xe3\x29\xc2\xb8\x34\x19\xdf\x7b\xa4\x69\x0c\xa2\x16\xb6\xef\x1e\xe8\x09\xa9\xcc\xfe\x86\xf1\x24\x04\x78\x8a\xc1\xc8\x98\xd5\xaa\x6b\x80\x5f\xb0\x68\x8e\xca\x2b\xa5\x03\x81\xdd\xee\xd3\xb7\xaf\x48\xa4\xa2\x04\xe3\x94\x86\xcc\x30\x37\x46\xdb\xcd\x7c\x4a\xb7\xf6\xdf\xbc\x83\xeb\x85\xb1\x62\x78\x6d\xcc\xec\xe7\x0a\x07\xd3\x21\xf7\x1f\xbe\xfd\x48\x8d\x4a\xfe\x1c\xb0\x99\x1d\x2f\xb2\x3c\xcf\x86\x67\xba\xe6\xaf\xaf\xb4\x72\xb2\x26\x53\x56\x42\xc9\x2b\x1d\xb6\xb3\x97\xc3\xde\x5d\xdb\x2a\x8c\xf7\x0a\xef\x3e\xee\x5f\x89\xe1\x05\xc4\x99\x88\x17\xdd\x82\x02\xe1\xfd\xde\x21\x9d\xa7\x62\x46\x88\xcf\x70\x67\xbb\xb3\xbf\xca\x6c\xb2\x12\x94\x1b\xd1\x07\x05\x9c\x35\x33\x7e\x18\x44\x56\xec\x22\x97\xc8\x1e\x03\xb0\x54\x22\xb3\xc9\x35\x19\xd4\xd3\x65\xc2\x9a\x24\xfa\x7d\x37\x2c\x85\x74\x7d\x85\xb8\x97\xd2\x50\xe2\x8d\xc7\xad\x64\x43\x22\xba\xf9\xc0\x63\xbf\x87\x69\x16\x74\xd2\x53\xca\xb3\x48\x2e\x18\x24\xdd\x36\x4e\x5a\xbf\x23\x69\xb9\x46\xcc\x47\x5a\x7b\xe6\xf5\x30\x1d\x18\x72\x51\xc8\x10\x9a\x0f\x6c\xdf\x3c\x15\x9d\x2e\x71\x35\xe9\xb2\x5d\x81\xf5\x4b\x56\x6a\x3d\xf7\x06\x25\xf0\x82\x20\x96\x32\xaf\x04\x36\x53\xbe\x5a\xd9\x3b\x57\x9f\x1c\x15\xd9\x2a\x27\x1d\xb0\x4e\x61\xbf\x50\x9e\xbc\x58\x8a\xbc\xb2\x08\x4d\xd3\xd8\x58\xe9\xf3\xc8\xf5\x49\x49\xc5\x2d\x35\x01\x01\x6c\x8a\x52\x9f\x8a\xa9\x3c\x02\xc1\xd7\xa7\x36\xc2\x67\xc1\xae\x4a\x13\x88\x8b\x15\xf2\x79\xa9\xf4\x70\x3b\x81\x81\xe1\xd1\x47\x4d\x5c\x72\x99\x85\x1a\x5d\x39\x0d\xa8\xc6\x7e\x4e\xaf\xef\x6d\x0d\x52\x5a\x23\xe8\x08\xfc\x24\x24\xe3\x28\x17\x5b\x43\x07\xea\x13\xc3\x9e\x50\x47\x50\x2b\xad\x4f\x42\x39\xe2\x56\x7e\xd5\x20\x9c\x2a\x53\xb0\x98\x0f\xeb\x30\x11\x98\x87\x1d\x4e\x57\x06\xf4\x6c\xec\x31\xda\x68\x7b\x0d\x8f\x93\xbb\x0d\xd6\x5a\x9c\x56\xdd\x11\x90\xc9\xe7\xea\x9b\x08\x4f\x65\x99\x3b\x59\x3c\x1c\x22\xf4\xbe\x54\x84\x9c\x69\xb6\xdc\x50\x5e\xe9\xc2\x7a\xaf\x39\xd9\x44\x4a\x58\x23\x87\xa7\x67\x1b\x49\x74\xcc\x3e\xd5\xa7\x48\x39\x7c\xae\xbe\x0f\x05\x86\xa1\x01\xd7\x03\xae\xf6\xcd\xf4\x9d\x7c\x97\xc0\xd8\x35\x73\x30\xdf\xd8\xf4\x23\xe1\x0a\xcf\x1d\x10\xfb\xe8\x0d\xbe\x78\xff\xc9\xd6\x29\xdd\x9c\xa4\xb7\xbd\xf6\x6b\x44\xe5\x1b\x99\x8f\xe8\xb3\x77\xdd\xe4\xf1\xd8\x78\x59\xb9\xa2\xb1\x2f\xb6\xb0\x94\x3c\xe7\x78\x7d\x05\xbc\x39\xcf\xcb\x78\xe8\x54\xf7\x9c\x5b\x5a\xc3\x6e\xd2\x9e\x4c\xe5\xd2\x92\xe7\xae\xb9\x86\xcc\x27\xce\x45\x96\xec\xcf\x6a\xf2\x84\x78\xbc\xd3\x79\x7a\x65\xa2\x39\xe1\xc0\xe4\xcf\xf4\x6f\x1b\x95\x44\xfe\xdc\xac\x71\x3a\x58\xb5\xb8\x1c\xdf\x45\x18\x5e\xe7\x03\xba\x7a\xad\xdc\xd3\xe7\x0b\x4d\xd6\x5f\x57\xc7\x35\xdd\xea\xdc\xb3\xb7\x75\xe2\xe4\xac\x89\x3b\x71\xa9\xf3\x87\xc7\x8f\xaf\xcd\x9a\x9f\x0f\xb9\x67\x51\x3e\xe3\xab\x41\x67\x34\x9f\x9d\xb1\x3c\x8f\xd7\x57\x4a\xab\xc2\x78\x74\x7e\x9e\x33\x8e\x31\x51\xad\x44\xec\x67\x5b\x93\x06\x06\x82\x6e\x8d\x4b\xb3\x77\xde\xdb\xec\x54\xf6\x4e\x2b\x6e\x18\x37\x67\xbf\x0d\x6b\x59\x86\x35\xfb\x55\x03\x9b\x64\x36\x8d\xd2\x6f\x86\xb7\xcc\xab\xc6\x34\x14\x2d\x32\x6c\x77\x39\x98\xd6\x36\x90\x5b\x64\x3d\xce\xcb\x52\xc2\x3c\xac\x2c\xbe\xb4\xac\x05\x2d\xa0\xc8\xad\x9a\x9a\xa9\x19\xfa\xed\x9a\xdd\xd6\xca\x3c\xfc\xcb\xc3\xbf\xbc\xfc\xcb\x0b\x42\x2f\xc2\xdc\x9e\xc9\x59\x67\x5c\x6d\x8b\x21\x47\x73\x06\xff\xad\x79\x1b\x88\x37\x91\x9c\x0d\xc4\x73\x2e\x5b\x9b\xd6\xcc\x2b\x7c\x69\x9c\x45\x41\xeb\x96\xf1\x03\x4e\x75\x07\xbf\x30\xfa\x61\x63\xdc\x5f\xde\x41\x6b\x43\x17\xac\xac\x85\xfc\x46\xc7\xce\x14\xd7\x8e\x58\x9f\x95\x0c\xd0\xfc\x05\x33\x29\x57\x3a\x2f\x14\x16\xfd\x07\x7f\xb9\xb8\xe2\xa6\x13\x12\x6c\xf4\x1c\xe6\xb5\x95\xc5\x2e\xeb\x8c\x1e\x1d\x82\x0e\xa7\x55\x25\x83\x05\x8b\xe1\x8c\xb7\x3a\x0f\xde\x34\x18\x31\x1b\x6f\x78\x6b\x65\x55\x91\x08\x38\x35\x5d\x8a\x15\x93\xc0\xf5\x8e\xfe\x76\x48\x03\xc5\x65\x5e\xeb\xac\xad\xad\x6c\x65\x6d\xdd\x56\xd6\x81\x4a\xbf\x2c\x0d\x21\x32\xb4\x85\x1f\x5a\x44\x32\x74\x14\xb1\xbe\xb6\xa1\x60\xbb\x0a\x11\xf6\x4f\x30\x42\xe2\x15\xa0\x83\x1c\xfc\x42\x40\xe2\xa9\x83\xff\x20\x20\xde\x83\x12\x99\xd5\xc7\x69\x63\x58\x31\xd7\x19\x13\xd1\x31\x05\x13\x41\x32\x43\xbc\x10\x2e\x18\xea\x08\xf1\x82\xa5\xfb\xdb\xe5\xff\xcb\xcb\xdb\xa4\x18\x3a\xaf\x6e\x6d\x39\x6e\xc3\xda\xeb\xd4\xb0\x3b\x1f\x4c\xd7\x91\xd2\x29\x38\xad\x73\xfc\x01\xe2\x1f\xc0\xab\x00\x5a\xf5\x49\x81\xc7\x11\x3c\xbb\x97\x4d\x37\xd3\x51\xc1\x6b\x63\x3b\xb8\x9b\x47\x0a\x8b\xa2\x54\x9b\x07\x68\x6a\x25\x99\xca\x62\xf7\xd9\x5f\x2e\xae\x24\xeb\xfc\x87\x2d\x62\x50\x3a\xc0\x41\xc2\x96\x74\xba\x96\xfb\x9d\x27\xd8\xd4\x82\xed\x59\xac\x37\xac\xad\xb0\xc2\x0f\xba\xac\x8c\x4e\x43\xb0\x6c\x56\x60\xd3\xd5\x2f\xf8\xa7\x04\xa3\xc0\xe3\xa4\x23\x59\xd7\xa5\x77\x5a\x07\xfe\x71\xed\xa8\xd2\x34\x0a\xad\xb6\xe6\x29\x81\xaa\x20\x85\x78\xeb\xb5\x0b\x6b\xab\x30\xa8\x20\xa8\x10\xe8\xc8\x6d\xb4\x35\xad\xac\x6f\x33\x81\x2a\xd5\x0f\x03\xa5\x0f\xca\x3c\x2b\xf5\x5b\x14\xe3\x24\xc0\x52\x1d\xe8\x14\x94\xbe\x58\xe8\xb3\xd7\x70\x3e\x49\x99\xd6\xf8\xb4\x27\xf9\xc0\x39\xe7\x63\x2f\x94\x0b\xac\x2e\x22\xb8\x72\x81\x4e\x4b\xf4\x0c\xd0\x49\x2e\x70\x44\xfb\xfd\x1c\x5c\xa0\x36\x3a\xf0\x29\xd1\x73\x81\xec\xc0\x86\x81\xd5\x60\x65\x61\x7c\xd9\xbc\x8d\x07\x9c\x44\x10\xf1\xd4\xc4\x2a\x76\x0c\x7b\xb9\x63\xde\xcb\x1d\x73\x15\x3b\x4a\x15\x3b\x9e\x19\xd7\x70\xb4\x94\x43\x15\xf6\x93\x8b\x19\x28\x0b\xa2\x7a\xc6\x41\x2c\x4f\x65\x17\x48\xca\x22\x43\x6f\xa8\x90\x73\xc3\x97\x70\xb4\xb3\x67\xcf\xaa\x9b\x0e\x4a\xbc\x10\x67\x5c\x15\x5d\x85\x60\x42\xf5\x4d\xc6\xf0\xdf\x94\x83\x26\x71\xa1\x58\x08\x5c\x44\xda\xd3\x6d\x8a\x0a\x77\x9d\xb8\xbe\xb7\xc1\xc2\x27\x74\x30\x61\x21\xa5\xba\x3e\x6a\xb5\x5a\xd4\xbd\xa3\x6e\xe0\x14\xcf\xd5\xa4\xcf\x79\x9f\x0f\x0b\x6e\xba\xb8\xf9\x92\x07\x7d\x2b\x70\x1d\x91\x17\x11\x57\xc1\x9e\x52\x1a\x4d\x05\xbc\xac\x94\x8d\xe8\x53\x20\xef\x87\x21\x4e\x29\x3a\x4b\xce\x6d\xf0\x69\x24\xef\x87\x43\xc6\xd9\x18\x37\xf8\x48\xf1\x82\x4c\xee\x5f\xe0\x01\xac\xef\xcf\xf5\x55\x86\x6f\x76\x47\x59\xb4\xad\x02\xfe\xd6\x38\xf2\x8a\x43\xfd\xa2\x50\xf2\x7a\x9a\xb8\xf7\x79\x6e\xcf\xca\x1b\xbb\x66\x6d\xc3\x70\x8c\xd9\x43\x57\x6f\xe3\x74\x8c\x9e\xca\x78\x8c\x21\x58\xe2\xa8\x2f\xf5\x60\x97\x41\x44\x58\x53\xfd\xf8\x39\xc5\xcd\xc9\x48\xc1\x1d\xd3\xee\x65\xd7\xd6\xf5\x55\xe7\x98\x64\x9e\xc9\xa7\x05\xf0\x98\xf3\x1b\x84\x9f\x66\x3a\x87\xb1\x3c\x88\xbe\xe9\xfa\x8d\xe6\x78\xb7\xd1\x5c\xb3\xdf\x68\xee\x3c\x6f\x37\xa3\xad\xd5\xdb\x8b\xbc\xa2\x03\xda\x44\x53\xd6\x56\xe2\xce\x53\x10\xa8\x8f\xf5\x38\xc3\xbc\x09\x95\x4c\x9a\x61\xbf\xb6\x3c\x00\x4b\xb4\xc3\xe9\xcd\xed\x1c\xf1\x1c\x55\xdb\x29\x5f\xb7\x9d\x43\x67\x4b\xb5\x1d\xf9\xca\xe3\x39\xf4\x55\xd4\xb5\x33\x5c\x9f\xe6\xfd\xeb\x13\x0e\xda\x29\xb8\x42\x95\xe1\xd5\x98\x22\x57\x4b\x6e\xe1\xe1\xf1\x31\x6f\x3c\x49\xb0\x9e\x64\xbc\xab\x7c\x4d\x16\xc0\x84\x9c\x37\x38\xc5\x34\x19\x23\x69\x73\xa6\xbb\xc7\x38\x85\xe3\xce\x10\xea\x6f\x60\xfc\x37\x30\x7e\x05\x8c\xc3\x09\x30\x56\xe8\x5b\x54\xe7\x8c\x4a\x80\xe5\xaa\x95\x33\x1e\x72\x85\xe5\x31\x68\x37\xca\xfb\x05\xd0\x55\x08\x2b\x2e\x42\x32\x3c\x1b\xf6\xed\xbd\x07\xb6\xc7\xc6\x7f\x27\x41\x5c\x28\x23\xd2\x7c\x51\x8e\xaf\x99\x80\xb9\x6b\x86\x83\x79\x27\x98\x27\x68\xc0\x04\xca\xb1\x65\x51\x0e\x40\x06\xce\xe0\x94\x84\x0a\x32\x0b\x14\x8b\x41\xb2\x27\x02\x8a\xe1\xd0\xc2\x57\x1c\x92\xfa\x42\xaa\x2a\x0c\xf3\xcc\xd7\x9b\xce\xdd\xed\x2a\x2b\xc6\xa0\x1c\xb6\xe4\x4b\xcb\x0e\xf4\xaf\xdb\xeb\xda\xf8\x4a\xad\x79\x13\x89\x4b\x4d\x3a\x79\x11\x85\x82\x3b\xd6\x9d\x43\xe4\x40\xb9\xaa\x5d\x07\xca\x79\x89\x4a\x5b\xb8\xd2\x0a\x3b\x9b\x36\xe5\xa6\x92\xf5\x26\x10\xc7\x9a\x74\xad\x54\x97\x77\x03\xc7\xa7\xca\x69\xe1\x5e\x36\xa7\x9d\x6f\x2b\x0b\xf4\x46\x9c\x67\x94\x3d\xe5\x9e\xba\xdb\x4f\xd4\x3b\x5d\xbc\x1a\x69\xda\x50\x8d\x06\xca\xce\xad\x55\x80\x50\xbc\xde\xcd\xd6\x64\x47\xcb\x28\x53\x90\x21\xf7\x4f\x35\xe9\x25\xfe\xe0\x0f\xbc\xf2\x3d\x48\x76\x1f\xc0\x51\x97\x9b\x45\x62\x31\x71\xe0\x36\xb4\x40\xfb\xa6\x59\x4b\x9b\x28\x39\x83\xa4\x1b\x71\x52\x16\x51\x67\xde\xc4\xdd\xc4\xb3\xb2\x82\x5e\x69\xe6\xe4\x6b\xd2\x4f\x99\xd2\x5f\xb8\x40\x29\x35\xe9\xbf\xc8\x5a\xe3\x90\xce\xae\x9a\xee\x42\x4d\x58\x72\xd3\x8e\x27\x39\x47\xfd\x37\x97\xc3\x7c\x18\x0e\xbe\xc5\x9b\xec\x48\x95\x4e\x29\x64\x51\xc8\xd0\xad\xbb\xf3\x16\x0c\xfe\x89\x9a\x34\x9d\x37\xdb\xcf\x1b\x66\x5f\x6a\x52\xdf\xec\x26\x7a\xb4\x32\xb6\x5f\x99\x30\x83\xcf\xb7\xd0\x5f\xda\xc1\x3f\xab\x18\x91\x39\x17\x6a\xca\xd6\x13\xbb\xd9\x70\x88\x46\x1a\x23\x69\x4d\x32\x1a\xb8\xe9\x26\x64\x29\x9e\x02\x2b\xb7\xa2\x33\xbc\x73\x4b\x2c\xd5\x87\x67\xa8\x37\x57\x7e\xef\xf9\x33\x53\x52\xae\x3b\xc6\x9a\x74\xd7\x11\x75\x89\x66\xa1\xae\x53\xde\x5d\xd7\xc3\x86\x42\xfc\xd4\x98\x13\xa2\x38\x67\xce\xe2\x21\x8f\x38\x5b\xf4\x46\x64\x4b\x29\xb6\x8e\x9c\x72\x46\xbd\xb3\x69\xcb\x08\x84\xa4\xc0\xe2\x6b\x52\xb3\xa5\x2a\xa6\x19\xa7\xd4\xb6\xdb\x29\xa6\xe9\x4e\x88\x56\xc9\x73\x65\x9a\xa5\xe7\x9c\xd9\x52\xf1\x10\x71\xf5\xcc\x46\xd9\xb1\x7a\x96\x0a\x57\x23\x17\x6f\xf6\x77\xa7\x0e\xf7\x8a\xd9\x99\x3d\xa6\xa9\xdc\xbd\x52\xe1\xb3\x40\xac\x80\xca\x3d\x62\x29\x30\xf4\x4c\x24\xfb\x5d\x60\x18\x1c\x60\x48\xad\xd6\x6d\x90\x74\x13\xaf\xe7\x8c\x5f\x4a\x6c\x2b\xc0\xee\x17\x51\x81\x9a\xc3\x41\x76\x5d\xdb\x73\x8f\xbc\xf1\xd9\xb1\x33\x26\x7f\x45\xef\x21\x04\x25\xcd\x22\x65\x93\xab\x72\xb0\x42\x35\xef\x42\x05\xe1\x46\xb6\xac\x9b\x63\x6f\x14\xf1\x2d\x18\x9e\x77\x0b\x9b\x48\xd1\x48\x3e\x56\x8e\xbc\x3f\x51\x01\x53\x59\x74\x5e\xc0\xf3\xc6\x46\xca\xf6\x48\x27\x4c\x57\x72\xdd\xcc\xa6\x6f\xa2\x32\xce\xda\x7b\xef\x4d\x86\x3a\x7c\xa1\x4e\xaf\xe0\xa0\x86\xa3\xbd\x30\xdd\x00\xdf\xe7\x37\x12\xa2\x69\xc8\xcb\x7d\xd1\x39\x28\xb0\xf5\x1a\xb8\x46\xcc\x70\xc6\x3b\x73\xda\x4f\xd7\x1f\x72\x70\x8a\x28\xbe\x15\x85\x30\x19\x08\x91\x5c\xa8\x7a\xa6\x52\xb9\xea\xbe\xb8\x05\x1b\x0b\x43\xb2\xfe\xcc\x6d\xe0\xc8\xdc\x56\x36\xda\xc5\x9a\xf4\x2f\xb2\xa3\x60\xc6\xb8\x06\x94\x4c\x56\xfa\x45\x36\xa8\x4e\x11\x07\x2b\xc2\xdb\xf9\x38\x84\x5a\x93\x74\xfa\x39\xa3\xa3\x45\x8c\x62\x77\x65\xd7\x6b\xd2\xe7\xe2\x3c\xf7\x08\x5a\xb8\x77\xfc\xac\xf4\x14\xc6\xc4\x10\x13\x36\xb4\x77\xf3\x88\x3d\xea\xe3\xc6\xba\xfa\x98\x79\xee\x98\xc2\xd2\xb9\xb9\x1c\xf8\xc6\x3e\x47\x54\x34\x74\xa9\xf0\x0a\xc4\x7b\x57\x21\x3e\x95\xb7\x81\xbc\x02\xaa\xf7\x16\xf0\x16\xe1\xbe\xf5\x6d\x50\x5f\xfb\xf1\x45\x50\x0f\xb5\x88\x1d\xcc\x07\xae\x30\xef\x76\x30\xef\xf2\x2f\x0f\xf4\x50\xcb\xd5\xe9\x4c\x1b\x3d\x81\xac\x53\xc2\xaa\x28\xe0\x94\xbd\x62\x57\x85\xfd\x09\xd0\x34\xa6\xda\xc9\x67\xc8\x92\x53\x4d\x7a\xd8\x8f\x3d\xec\xc3\xcc\xde\xe5\xfe\x45\x09\xb6\xb2\x8f\x29\xd5\x64\x04\xff\x45\x41\xbf\x4b\x26\xf0\x9f\x5d\x4d\x76\xf0\x5f\xa6\xf0\xaf\x07\x0d\xcb\x31\xf8\x8f\x35\x99\xc0\x7f\xaa\xc9\x10\xfe\x0f\xe8\x57\xd7\x20\x4e\x40\xcb\xd5\x0e\x72\x67\x08\x39\xd8\x00\x0b\x09\x55\xee\xed\x78\x1d\x49\xf2\x96\x49\xb7\x80\xce\xeb\x5b\x76\xc1\xc4\xd3\xc8\xbf\x7d\xf7\x38\xf2\x94\xf8\x9b\xc7\xcd\x8d\xb9\xfc\x0e\x5e\x02\xec\xe6\xee\x79\xe4\x21\x74\xef\x3c\xc0\x5c\xae\x3a\xf3\xe0\x83\x42\x43\xbb\x61\x73\xf9\x00\xc3\x80\x83\x42\x7b\x7b\x01\x73\xf9\xfd\xe3\xc3\x8b\x7d\xbe\xfb\xcb\xd8\x85\x57\x67\x9a\x6a\xee\x60\xff\xf4\xcd\xd4\x20\xca\x5c\xfe\xcf\x6a\x2a\x64\x5f\x6e\xff\x3c\xaa\x7a\x60\x42\x64\x2e\x57\xb0\xb4\x3c\x28\xb3\x37\x67\x37\x97\xed\xe6\xee\x87\x07\xbb\xb9\xfd\xfe\xe5\xa0\xd8\xc8\x32\xa5\x2f\xf9\x74\xf7\xc3\xfa\x44\xd1\x9d\x06\xa1\xb9\xfc\xd8\xde\x3d\xbc\xd8\x27\x28\x3a\x8f\xbc\xae\xed\xf5\x9f\x3b\x17\xa7\xf6\x5f\x3f\x3d\xbe\xdc\x1e\x78\x38\x85\x2e\xaa\xd1\x66\xbe\x19\x5f\x58\x98\x4f\xbd\x3e\xcd\x37\x47\x74\x6c\xfa\x5e\xd6\x81\x1f\xf4\xb0\x0e\x7c\x38\xe8\xa3\xe3\x1d\x8d\xf5\xf8\x30\xfb\x22\xdf\x41\xb7\xe4\xa0\x4c\x55\x39\xe9\x0b\xdd\x43\x2f\xe2\xa0\x50\x55\x97\xe8\x0b\xbd\x3c\x7e\x3c\x28\xf1\x87\xc7\x8f\x66\xd3\x5d\x60\x7f\x73\x78\xa7\x6d\x2e\xe1\x9d\x67\xf5\xb8\x79\x1c\x8d\x75\x77\xb1\x63\xd6\xfb\x7b\x81\x6f\x8e\xde\x16\x98\x3b\x88\x85\xbe\x99\xca\x89\xcc\x63\x15\x7b\x7e\x73\x20\x08\x35\xcf\x43\x66\xfb\x9b\x13\x4c\xb8\x79\xee\xc9\xaa\x6f\x8e\x90\x5a\xe6\x79\x7f\x08\x7d\x73\xf4\x68\xfa\xf7\x9f\xdb\x0b\xd2\x10\x0d\x7c\xd6\x07\xd2\x53\xbb\xbd\xdd\xfc\xac\x0e\x90\xd0\xc2\x81\xfb\xa3\xdf\x3d\xcc\x1f\x37\x77\x37\xed\x4f\x43\xef\x40\x4f\xed\xdd\xd8\xb9\xcf\x3f\xdc\x3e\x3d\x0d\x4b\x7c\x68\x9f\xda\x6d\xfb\x30\xca\xb9\xff\x78\xfb\x34\xce\xfb\xcd\x63\x3b\x72\x9d\x73\xb7\xfa\x69\x35\x72\x58\x74\xd5\x7e\xbc\x6a\x9f\x7e\x1c\x35\xf5\xe1\xf1\xfe\xa3\x62\xdc\x51\xa9\x71\xd3\x43\xc7\x3f\x77\x4f\x1f\x37\xed\xd8\xb7\xd1\xd3\xa7\xd5\x8f\xe7\xb8\xe8\xd9\x3b\xd0\xb2\x2b\x78\xd0\x82\x8b\x1e\xf3\xf0\x5e\xcf\x3e\xb5\x23\xc7\xdc\xb4\x9f\xa1\x32\xd1\xeb\x5b\xc9\x5c\xe2\x81\x4d\xf2\xc8\x1a\xd9\xa4\xa5\x84\x89\xed\x6c\xb5\x11\x5f\x72\x21\x84\x66\xc1\xc5\xd1\x40\x42\xa1\x27\xf6\xaa\x32\x52\x95\x29\xc3\xb9\xb9\x64\xbf\xde\xdb\x86\xe8\xc9\x2a\x5b\x9e\x4b\xde\xca\xda\x6f\xc3\x5c\x59\xf4\xd6\x53\xd0\x63\xb6\xbf\x42\xb3\x19\xcc\xe1\x1c\x54\x9d\xbe\x34\xbd\xd6\x7a\x63\x3d\x42\x1a\x50\x8a\x33\xaf\x64\x84\xaf\xb4\x04\x57\x95\xed\x24\x50\x0f\x43\xec\xa3\x62\x7c\x1f\xd0\xac\x31\x19\x21\x0a\xe6\xce\x4d\xd5\xa6\xe2\x6c\xc7\x29\x22\xea\x99\x5c\x5f\x71\x83\x68\x18\xb9\x1d\x12\x2b\x55\xe8\xe6\x29\x05\x73\x90\x6d\x34\xfb\xfa\x1e\xf2\x45\xd3\x1c\x7c\x26\x14\x40\x79\xcc\xc6\x84\x3f\xcc\x7b\xbd\x33\x92\xaf\x3b\x2a\x6c\xff\xbf\x23\xeb\x7a\x5a\x1b\xe2\xab\xac\xa9\x28\x05\x35\x1b\x93\xfb\x30\x77\x94\x00\xdb\xa2\xf7\xac\x44\xae\x9a\xb6\xbb\x95\x60\x5d\x09\xff\xbf\x7e\xee\x45\xe7\x1e\xc1\x75\x93\x4e\xdd\x21\x9c\x5e\x4f\x59\x91\x1d\x7e\xf8\x1a\xdb\x30\x28\xb9\x9b\x89\x63\x0b\x1f\x56\x32\xf4\xb6\x85\xd0\x12\x90\x5b\xa7\xc9\xac\x3b\x8a\x81\x52\x59\x24\x38\xc0\xaa\x3e\xf1\x39\xc3\xc8\x20\x47\xc3\x03\x61\x43\x81\x08\xca\xf3\x46\xa9\xdb\xe2\x56\x14\xe1\x36\xcb\x40\xab\xa0\xa1\xe2\xac\xa7\x2c\x1b\x2a\xce\x94\xea\x04\x05\x42\x31\xb7\x97\x56\x40\x88\x0b\xbe\xd2\xd5\xa4\x27\xf3\x3d\xd5\xd0\x38\x35\xe9\xb7\x93\xb6\x25\xe4\x0a\x84\x86\x2d\x53\x80\xfd\x65\x2f\x2a\x81\x0d\x60\x76\x4a\x1e\x43\x65\xb9\xac\x1c\x85\x64\xc5\x44\x65\x02\x1c\xe5\xac\x1c\x46\xb4\x81\x24\xcc\x26\x33\x62\xf6\x93\x75\x7d\xaf\xa4\x36\xa5\xb0\xb2\x42\xd0\xe3\x10\xab\x1c\xb2\x67\x8b\x30\x2f\x41\x39\x17\xed\x0a\x89\x5b\x08\x64\x7c\x92\x48\xf2\x46\x79\x04\xe8\xff\xc0\xd8\x29\x18\x4e\xb0\xa8\x4c\x55\x57\xf8\x03\x23\xd8\x02\x02\x8a\x89\x23\x8e\x26\xd6\x58\x8f\x14\x64\x63\x3d\xc1\xed\x17\xc3\xe6\xa5\x06\x08\xb4\xec\xa8\xd1\xa5\x0b\x80\xb2\x9e\xcf\x56\xde\x2c\x6c\x42\x9d\x3b\x89\x2d\xf9\x01\x53\x4d\x2e\x28\x2c\x92\x87\x39\x61\xc7\x51\xe8\x2c\x60\x57\x7c\x11\x1a\x78\x5d\xff\xac\x8b\xd1\x2b\x14\xfc\xc6\xc1\xe6\x07\x56\x04\x96\x89\x0b\xc4\xde\x1c\x17\x10\x7b\x53\x53\x36\x3a\x53\x56\x47\x2a\x04\x2b\xcb\xa4\xaf\x32\xec\xd4\x05\xbd\xdf\x49\x2e\x74\x8e\x16\x11\xfa\x16\x0d\xc9\x41\xe8\xbb\xae\xc5\xaf\x80\xc6\x22\x5a\x86\x8d\x35\xc2\xaf\x71\xdc\x44\x72\x08\x91\x5c\x6c\x81\xb5\x69\x9c\x51\x90\x3d\x54\x15\x4c\xdd\x02\xfa\xe3\xdc\x50\xd0\xd7\xdc\x2f\x47\x63\x76\x15\xbe\xa7\x73\xdd\xc4\x3a\xc4\x0f\x8f\x70\x19\x07\x20\x08\xed\x58\x62\xa9\x9b\xb3\x49\x3a\x91\x10\xb7\x33\xf4\xc0\xbc\x02\x39\x1c\x5e\x4d\x26\x15\x5c\xaf\xc8\xc6\x57\xf6\x33\xb8\x96\xc2\x5e\x5e\x6e\x28\x38\x6a\xca\x0a\xc1\xeb\xf4\x1c\x8b\xd6\x61\x20\xc5\x46\x6a\xd2\xa6\xda\xa0\xc0\xd8\x77\xfc\x99\x72\xe9\x9b\x8a\xf6\x9a\x3c\x34\x96\xd6\x43\x39\x02\x3a\x15\x21\x2a\xf8\x4a\x59\x79\xdd\x4c\x0a\xf6\x59\xe0\xfd\x0f\x73\xc8\x36\x50\x2e\xb3\x2a\xc0\xdb\x57\xbd\x1f\xff\x01\x5e\x54\x2a\x6a\x82\x12\xa1\xe9\x70\x06\x4a\xfc\xf3\xaf\x2f\x39\x40\x25\x82\xd3\x5e\x25\x62\xaf\x11\x21\x07\x0b\xf8\xe6\x1d\x22\x20\x5b\x58\xcf\xaf\x99\x48\xd5\xc3\xdb\x1d\x89\x90\xba\xa4\x16\x8e\x06\xcb\x5e\xc0\x56\x2c\xe9\x2e\x8d\xf8\xd7\x9f\x7f\x59\xa7\xc3\xaf\x10\xcc\x04\x7b\xc9\x43\x38\x03\x3b\xed\xe1\xe1\xa6\xf8\x62\xab\x20\x3a\x36\x36\x5d\x4a\x33\xf7\x4b\xce\xc3\x43\xc7\xc2\x3d\x58\x72\x33\xc5\x59\x26\xf5\x9b\x0c\xf1\xd8\xc5\x91\xa4\xa5\xf8\xb5\x95\x83\x48\xe2\x50\xc1\x39\x08\xa7\x09\xc3\xd5\x83\x98\x5d\x83\xf1\x5f\x5f\x21\x9c\xdd\x3c\xea\x01\xd1\x58\xc2\xcd\x80\x45\xf4\xa7\x60\x79\x16\xeb\x8a\x87\x5d\x74\x54\x36\x79\xdd\x5c\xdf\x8b\x69\x96\x89\x42\x6e\x61\x69\x91\xf7\x22\xa8\x50\xcf\x10\x8e\x33\x2e\x86\x77\x31\x54\x1c\xf4\x6e\xaf\xaf\x24\x10\xb4\x86\x9c\x1e\xf0\x7a\x9a\x87\xd1\x39\xad\x78\xbf\xcf\xed\x0e\xe9\xae\xf8\xe1\xf6\x3d\x7f\xf5\xdd\x65\x2f\x2a\xe4\x64\xc4\x1f\x9f\xc2\x75\x20\x4c\x44\x93\x6b\xf4\x2c\x04\x6f\x0b\xb3\xfe\x2a\x80\x71\x6b\xe3\x95\x50\x39\x63\x1c\x7d\xe1\x2f\x1e\xc5\xeb\x58\x52\x22\x5c\x1c\x78\x92\xac\xf0\xeb\x70\x1f\xbd\x3b\xb6\x19\x11\xd3\x22\x95\x37\xc0\x70\xb1\xb0\xb1\xb1\xd5\xa8\xdf\xaf\x2d\xeb\x48\x8a\x91\x9d\x12\xa2\xc2\x72\xa4\x50\xb6\x99\xc2\xe1\xed\x06\xe5\x38\x57\x5c\xbd\xaa\xd7\x2e\x0d\xe2\xca\x29\x58\x95\x16\x07\x78\xe8\x25\x7c\x35\xbe\x96\x0d\x8a\x8e\x2c\x1b\x25\x13\x43\x34\x48\xfa\x8e\x39\x50\x17\x19\xda\xba\x1d\xca\x8c\x4a\xc7\xcc\xf6\xf4\x50\x47\x6b\x42\x3f\x6f\x1d\xc8\xe7\xc3\x76\x67\xd3\x76\xe1\x18\x44\x0f\x96\xf7\x35\xeb\x1a\x28\x0b\xc6\xb5\x50\xe4\x13\xb7\x3c\x4e\xb1\x40\x21\x07\x0f\x71\x65\xbf\xf9\xfa\xc5\xeb\x1c\x6f\xcd\xd1\x6d\x17\x08\x6a\x33\xc4\xd1\x2a\xd5\xd2\x4e\xf7\x9e\xa3\x9c\x6c\x58\x37\x20\x92\xeb\x19\xe4\xe2\x17\x82\xdf\xae\xfc\xf5\x15\xf6\xe5\x9c\xe3\x92\xd3\xda\x5d\xdf\xdb\x68\xc3\x32\x91\x4f\xba\x95\x23\x28\xac\xdd\x56\xc6\xf5\x77\x98\x71\x01\x50\x94\xfe\x8a\x8c\xe1\xaa\x4a\x77\x73\x84\x8a\xc7\x17\xf7\x63\x50\xfe\xe0\x04\x51\xae\xfc\x6b\x10\xd5\x4e\x21\x35\x12\x97\xb1\xf7\x86\x64\xe2\x42\xf4\x40\x35\x05\x76\xae\xba\xe8\x23\xa3\x1e\x5c\xf0\x2f\x84\xa2\x98\x4c\x63\xe3\x95\x42\xec\x96\xca\xa6\x8e\xcc\x4e\xc8\x29\x4f\xb9\x60\x87\x9b\xc1\xbc\x41\xec\x37\xc5\xff\x43\xff\x00\x3e\x42\x49\x78\x9f\xe1\x4c\xb3\x61\xdc\x9d\xcb\xeb\x7e\x04\xfa\x61\x80\x3f\x91\x48\x29\x6c\x6c\x75\x78\x4b\x71\x29\x89\x9a\xb8\x56\x9a\x6d\x2b\x9a\xed\x15\x6e\x59\x01\xae\xcf\x66\x4a\xb2\xf0\x30\x80\xe3\x65\xa1\x54\x36\x99\x9a\x6c\x1d\x39\xb7\xcc\x94\x79\xcd\x14\x97\x51\x49\xe5\x0c\xe3\x74\xb7\x15\xaa\x99\xcc\x0b\xa7\x73\x50\xd7\xe8\x08\xb6\x3a\xeb\x60\x17\x1c\xec\xa2\xb4\x48\x3d\xdb\x03\x14\x1f\xbb\xe3\x9d\x29\x0e\x54\x1e\x29\xf3\x57\x68\xd1\x4d\x5a\x54\x16\xe0\xe7\x6d\xd1\x57\xe2\x65\x3f\xc6\x9f\xbd\xc5\x30\x6d\x31\x11\xbb\x53\x2d\xa6\xf0\x75\x4e\x1d\xe7\xba\xd8\xa8\xc1\x48\x30\x85\x8a\x5f\xb2\x9f\x8b\x5b\x2a\x4f\x50\x16\x8c\xfb\xc8\xbc\x2c\x73\x96\x65\x80\xfb\x1d\x28\x5f\xf8\x99\x52\xb2\xc1\x0d\xb6\x53\x0a\xcb\xea\x99\x6a\xf4\x86\x92\x27\x5f\x16\x2c\xb0\xba\x97\xa5\xb8\xb5\x6c\xf5\x78\xde\x14\x78\x17\x58\x4a\x5e\xcb\xd6\x55\x58\x8e\xce\x0a\xa5\x49\x05\x2e\x59\x0a\xbc\x4c\x94\xe3\xb8\xd1\x7d\xd7\xab\xc9\x22\x6b\x1f\x39\xad\xe5\xfa\xbe\xb1\x11\x3f\x78\x2d\x4a\x9e\x40\x68\xe1\x96\x22\xfd\x3b\x1d\x5f\x5c\x1f\x4a\x02\x7a\xb9\xe2\xc9\xb0\x89\x8d\x1e\x4b\x1c\xc8\xf1\x1a\x2a\x65\x3e\x9a\xb2\xb2\x60\x82\x05\x71\x1b\xa1\x9c\x84\x83\xc3\x6f\x22\x30\x6c\x03\x8e\xad\xa9\xb1\xb5\x39\xb4\x14\xe3\x5e\x97\x83\xb2\xd7\xd2\xd7\xf7\x56\xe9\x4a\x07\x0b\xe0\x80\xa0\xbc\xe7\x28\xa2\xc1\x78\xe6\x18\x1f\xd4\x9b\xf5\xce\x38\x1a\x8e\xfd\x21\xe7\x11\x30\xb7\xcb\x01\xda\xcb\x46\xae\xef\xa1\x44\x54\x82\x22\xc5\xe0\xe6\x9c\xb6\x02\x77\x39\x7a\x2a\x74\xa8\xde\x53\xa3\x47\xc6\x5c\x51\xcc\x92\xd3\x5c\x7f\x8f\x0a\x70\x42\x19\xe0\xa0\xb5\x2c\x0f\xde\x3b\xa6\x12\x20\x98\xd1\x36\xb6\xb2\x3e\x68\x82\x4b\x2d\x74\xae\x71\xdf\x7b\x47\x7f\x85\xcb\x61\x2e\x18\x13\x4e\x6e\x67\xa9\x09\x96\x62\xc4\x5f\x7e\x56\x92\x21\xe1\x11\xe3\xbf\xbe\xea\x06\xbb\xaa\xfa\xf3\x5d\x41\x84\x2a\x0c\xcf\x55\x5b\x8d\x4d\x3f\x19\x73\x86\x33\x42\x49\xa4\xe0\xe2\x6a\x90\xd5\x88\xda\xb4\xcc\xb3\xc5\x07\x16\x1f\xd7\x05\x50\x50\xcd\x36\x28\x39\x0e\x2d\xb9\x5d\x4c\xdf\x58\xc0\xef\x07\x08\xce\xa0\xb0\x5f\xc3\x5a\x67\x59\x29\x51\x6b\xc9\xa7\xea\xed\x83\x2b\xc9\xe2\x37\x4a\x29\x24\x65\xf1\xdc\xba\x51\xce\x1b\x3c\xb5\x4b\xb3\x61\xbd\x46\x92\x1e\x48\x2e\x5d\x5f\xa1\x79\xc3\x05\x7b\x89\xbc\xc0\x0f\x97\xa3\x26\xd4\x1e\x1b\x7e\xd6\xd1\xa6\x3a\xda\x2f\x8e\x97\x78\x64\x8d\xa6\xa6\x64\x91\x52\xba\x50\x56\x2d\x5c\x88\x47\xea\xba\x9c\x7c\xc1\xda\xef\x8b\x41\x91\xb7\x5a\x1b\xed\xaf\x13\xbe\x02\x61\x02\x75\xd2\x24\x4a\x06\x3b\x13\xaa\xca\x1d\x43\x8d\xb1\xfb\x3d\x1b\xbe\xe9\x80\x4d\xbf\xb8\xbe\x6f\x4c\x21\x1f\x5b\xa7\xaf\x5c\xff\x25\x3c\x25\x38\xab\xc9\x6c\xf8\x06\xef\x14\x6a\x61\xf9\xfe\xd5\x58\xe6\xba\x39\x98\x12\xfc\x21\xa7\xb2\x17\xaf\x40\x4e\x03\x17\x6c\xbe\x0b\x64\xaa\xd4\x43\xc8\x55\x9c\x0f\x7d\x88\x8d\x12\xb7\x41\xda\xa2\x34\x94\xa9\x69\xff\x3d\x7b\x53\x3d\xa8\xe5\x42\x49\x81\xb0\x68\xb1\x2c\xa6\xa6\xfb\x62\x36\x6b\x35\x96\x82\x5b\x31\x15\xae\x51\xfb\xf5\x78\xb0\x70\x3a\x82\x27\xae\x6e\xbb\x0e\xba\x59\xf7\xad\x80\xa8\x12\xbf\x81\x57\xb3\x50\xad\x04\x95\xa0\x0a\x19\x4a\xa2\x3e\xd9\x40\xe2\x94\x75\xd2\x3d\x91\x2d\x57\x6f\xff\x81\x95\xbc\x12\xbc\xb4\x91\xf4\x88\xaa\x1e\xb7\x50\x41\xb2\x42\x51\x09\x30\xb1\xb1\x53\x97\xb7\xba\x69\xb8\x2d\x94\x74\xc7\xa5\x5e\x16\xcd\xd0\xb8\x6f\x3e\x48\x82\x23\x9d\x04\xf9\x22\x18\x66\x61\xf2\xa6\xef\xde\xb9\xab\x66\xed\x77\xed\xcd\x0f\xb7\x37\x47\x81\xaf\x7f\xf9\xff\x1f\x20\x7c\x6d\x38\x32\x1e\x8e\x14\x65\xeb\x94\x9c\x47\x3c\xf7\x62\x52\x7f\xe1\xc3\x56\x14\x77\x2a\x3e\x82\x10\xa2\x5e\x08\x50\xa8\x2e\x45\x10\xc4\xd7\x43\xd8\x9b\xac\x47\xb0\x71\x5d\xb0\x5f\x08\x2e\x66\xe8\x75\x19\x70\xa4\xa2\x70\x11\xa8\x29\xd3\x38\xfb\x86\x82\xd8\x0a\xd0\x90\x62\xa6\xf0\x57\xbc\xef\x3e\x08\x60\x9d\x1d\x1c\x27\xf5\x4b\x13\x92\x19\x2c\xd3\x09\x60\xe8\x63\x45\x9c\x09\x0e\x6e\xf2\x12\x3f\x2e\x11\x72\xc2\x35\x35\xe0\x44\x44\xb0\x89\xaf\x44\x01\xff\x6f\x80\x04\xef\x1b\xc3\x10\x2d\xc4\xea\x42\xb1\xee\x62\x7d\xb4\x9a\xcc\x86\x6f\xfa\x5d\x7c\xce\xaa\x9d\x3e\x5c\x75\x55\x38\x77\x61\x45\x84\xbc\xc7\xca\xe8\xac\x9d\xb5\x38\x93\x25\x1f\x2e\xd2\x49\xe4\x30\x4b\x4a\xb1\xa5\x81\x72\x17\xee\x2a\x99\x75\x22\x14\xc1\x85\x3e\x76\x34\xfc\x05\x39\x2d\x2a\x35\xe9\xb6\xa1\xd3\xad\x9e\xfd\xff\x99\x3b\xf1\x33\xf3\x3e\x40\xca\xe7\xae\xf1\x1b\x5a\x3b\x6b\xcf\x8f\x3d\x06\x76\xfa\x22\xa7\x38\xb6\x4c\x98\xac\x18\x66\xff\x1f\x77\xef\xa2\xdd\xb6\xad\x2c\x0c\xbf\x8a\xc5\x93\xaa\x44\x0d\xd1\x24\x75\xb3\xa8\x20\xda\x8e\x93\x36\x69\x93\xa6\xbb\x49\xdd\x93\x4a\x6a\xcb\x48\xb0\xcd\x96\xa6\x5c\x12\x76\xec\x4a\x3c\xcf\xfe\x2f\x0c\x2e\x04\x2f\x92\xed\xb4\xdd\x7b\xfd\xdf\xca\x8a\x45\x82\x03\x60\x30\x18\x0c\x06\x83\xc1\x00\x5c\x31\x07\xc6\x9e\x1e\xec\x08\xf6\xc3\x81\xd3\x1d\xe1\x81\x32\xe5\x01\x48\x67\xe0\x74\xf9\xa8\x29\x7f\xf0\xfa\x22\x07\xae\x96\xa4\xeb\xe0\x8b\x4b\xcf\x0b\xcb\x36\x45\xf9\x76\x04\x77\x4d\xf4\x8a\x4d\x2c\xd8\xad\x3c\xe4\xb9\x3e\x3d\x38\xe0\x50\xd5\x1c\x56\x70\xea\x88\x56\x00\xae\xf0\x5f\x36\xa1\x8b\xdd\x3a\x21\x86\x9f\x84\x3f\x64\x7b\x68\x03\xaa\x51\xed\x46\x10\xee\x75\xf0\xe2\xb0\x74\xfc\x97\xcf\xc8\xbd\x7e\xdc\xef\x78\x10\xde\xe1\xd0\x19\xbd\x1a\xc1\x21\x03\xdf\x19\x76\x5f\x3c\x28\xb8\x79\xb7\x14\x7d\xd3\xeb\x0a\xcb\x8a\xef\x0c\x0e\x0b\xcb\x8a\x67\x84\xe0\x74\x46\x0f\x08\x67\xdc\xab\x87\xae\xe6\xad\x31\xdb\x32\xea\xf1\x85\xde\x2b\x1f\x0e\x34\x78\x2e\x6f\xab\x6f\x9c\xf0\xea\x40\x20\x97\xe2\xac\x5a\xc7\x19\x75\xcf\xbb\x21\x84\x57\xd3\xc7\x87\x46\x3d\x67\x10\xf7\xcd\x20\xa5\x7c\x19\x08\xd1\x90\x8d\x23\x6c\xaa\xf6\x4f\x8f\x39\xeb\x75\x21\x40\x62\xc3\xb1\x7c\x7d\x3a\xda\x2b\xf5\x14\x47\xbe\x84\xaa\xd7\xf1\xce\xbb\x61\x39\xf6\x81\x87\x9d\x21\x58\x8e\x7c\xec\x97\x8e\xb6\x79\x4e\xcf\x33\xcf\xa7\xcb\xda\x1f\x1a\xd8\xd6\x8c\x2c\xc0\x75\xee\x11\xc4\x4d\xe9\x88\xd0\x28\x5d\x08\x79\x31\xea\xf4\x9c\x51\x0c\x9e\x05\x3d\x67\xf4\xe2\xde\xb1\x2a\x2a\xc3\x6d\xe8\x80\xcc\xe8\x89\x0a\x5c\xa7\x2b\x7f\x61\xe5\x1e\x77\x41\x27\xec\xaa\xf0\x2c\xa2\x7e\xf1\x7b\xc8\x7f\x8f\xfb\xe0\x1f\x01\xdb\x86\xce\x21\x16\x97\x9c\x2d\xe0\x66\x31\x38\x22\x60\x8c\xd6\x59\x32\x63\x8b\x2e\xa8\xf0\x10\xd9\x05\x43\x3c\x93\x17\x87\xc7\x43\x67\x28\xb6\xdd\x86\x0e\x9c\xcd\xe7\xf3\x9f\xc0\xe9\x21\xd1\x37\xca\xe3\xcf\x73\x46\xe7\x9d\x1e\xc4\x16\x82\x79\xc9\x01\x5d\xdf\xe9\x43\x4a\x1f\x62\x8f\x78\x32\x12\x4d\x1f\x2e\x3a\xf1\x9c\xd1\x3d\x6b\xab\x86\x40\x07\x89\xd1\x17\x3d\xd4\xc5\x32\x26\x51\x47\x84\x2c\xf1\x62\xdf\xe9\xe1\x81\x33\x58\x00\x1e\xaa\x66\x88\x40\x02\x0e\x2c\x0b\x48\x70\x3b\xe2\xb3\x27\x8a\x70\xbc\x05\xc4\x43\xe2\xc9\x87\xb2\x4b\x46\xbc\x4b\x78\x6f\xf7\xf8\x14\x0a\xb4\xec\x74\x01\xff\x41\xa7\x07\x5e\xe6\xfd\x4e\x17\x1f\x3a\xc3\x85\xe7\x0c\x70\x17\xe2\x9a\x08\x81\x77\xe8\x0c\x71\x77\xd1\x15\x21\x75\x78\x4a\x87\x7f\xe9\x76\x0e\x9d\xe1\x71\x17\x22\xa7\x70\xba\x77\x5d\xd9\x91\xaa\x39\xf7\xa4\x46\x55\x5a\xf4\x44\x30\xa2\xe1\xc2\x95\x71\x84\x3c\x40\xbf\x0f\xf1\x59\x5c\x67\x10\x43\xc4\x98\xa1\xd3\x3b\xf6\xbb\x70\xe2\x47\xf4\x34\x3e\xc4\x3e\x57\x66\x46\xe7\x9d\xae\x8e\xf5\x04\x04\x03\x72\x89\x6e\x83\xa8\x51\x70\x98\x83\xff\x05\x1a\xb8\x58\xff\x3b\xf7\x21\xcc\xcb\x10\xfb\xe7\x9d\x11\xaf\x48\x8e\xee\x63\xe1\xa4\x01\x84\x87\x18\x42\x2e\xf6\x3c\xec\xb9\x2f\x0e\xcd\x8a\x20\x86\x54\x26\xc3\x52\x61\xef\xdc\x77\x06\xb1\x3c\xf5\xc0\x4b\xea\xe3\xae\xa8\x0f\x22\xda\xc0\xae\x39\x16\xad\x3a\xc4\xae\x73\x18\xf3\x6e\xe8\x3a\xfe\xb9\xe7\xbe\xd2\x24\xb8\x27\x05\xfb\xf5\x80\xc1\xab\x90\x6d\xb7\xd6\x8e\x1c\x98\xdd\xbc\x63\x2e\x1b\xc1\xbe\x05\xbd\xd6\xc3\xbe\x70\xf6\xe0\x4b\x3a\xc1\x63\x70\x38\xd6\xe1\xfa\xa0\x87\xdd\x05\xc4\xce\x1a\x42\xe0\x26\x9e\xd8\x05\x4f\x1a\x6f\x21\x47\x34\xc4\x31\xe4\xe3\xa4\x03\xa1\xa3\x1d\x19\xcb\xe7\xd8\xe3\xad\xf1\x21\x34\x75\x0f\xfb\xb0\x23\xe5\x63\x7f\x94\x41\xa4\x1e\x0e\x2e\xc2\xe9\x1c\x8a\xe2\x21\x14\x8f\x94\x51\x3d\xfe\x9b\xc9\x62\x7b\x1d\x88\xd8\xea\xf8\xc7\x5d\x55\x9e\xcf\xe5\x05\x97\x1c\xfe\xe8\xda\x97\x91\x83\x04\x59\x3d\x1d\x84\xaa\x0b\xd1\xb1\xfc\x63\x88\xf2\x31\x72\x38\x87\x78\x3c\xd3\x90\xb7\x79\xa4\x83\x09\xf5\x61\x80\x83\x67\x84\x73\xb8\x10\x81\x27\x07\x22\xd4\xa8\x33\x10\x9a\x82\xe4\xc7\xbe\xe4\xc7\x43\x19\x06\xe8\x50\x56\xac\xc3\x12\x89\x92\x64\x39\xa3\xc6\x72\xfa\xe5\x72\xa0\xf5\xe5\xfc\x1e\x0c\x7e\x9e\x3a\x82\xf8\x59\xa2\x24\x0f\x43\x58\xd1\xeb\x8e\xaf\xe3\x24\x89\xe3\x23\x22\xa6\x19\x04\x52\x3a\x3c\xee\x82\x81\x05\xee\xe0\x02\x54\x44\x8b\x65\x9f\xff\x85\xa0\x63\xd8\x2f\x02\xa6\xc9\x51\xd5\xf1\x5e\x74\xfd\xb8\xd3\x85\xfb\xbe\xbc\x73\xd7\xf1\x17\xbc\x45\x70\xe1\x24\x70\xb9\x2f\x84\x96\xf4\xd1\xf1\x63\x31\x33\x40\x10\x27\x68\xbb\x88\xf1\xe4\x89\xa9\x49\xd1\xf2\xb8\xdb\x15\x11\xb9\xba\x3e\x9f\x04\x60\x4f\xd3\xc3\xbe\x7b\xde\xf1\xfb\xf5\x68\x57\x5d\x28\x4e\x91\x14\x88\x09\xa2\xc2\x73\xbc\x13\xff\x21\x41\xd6\x2a\x93\xc0\xa1\x23\x36\x8f\xfb\xd7\x9d\x21\xef\x09\x39\x81\x75\x25\xbd\x0f\xb9\x30\x3c\xf6\x64\x88\x2b\xec\xc1\xd6\x29\x2c\x80\xb0\xe7\xc6\x30\x62\xa4\x48\xef\x15\xe1\xe9\x8a\xa0\x55\xc7\x4a\x4d\x04\x01\x06\xe1\x7c\x79\x75\x82\x00\x2a\xd2\x96\xe7\x39\xb0\xe9\xea\x0d\x5f\xe8\x30\x5a\x3c\xed\xe1\xe1\xc9\xf4\xd8\x1f\x60\x8f\x73\x55\xaf\x08\x7c\x07\xd3\x84\xff\xca\x1b\x39\x70\x9c\x1c\x30\x86\xb6\x82\x22\xc3\x25\xa0\x90\x07\x70\x7f\x97\x33\xea\xf8\xd8\x3f\xf1\x46\xe7\x87\x4e\xf7\xd8\xef\x73\xcc\xfd\xbe\x33\x14\x4d\x81\xd2\x39\xf2\x43\x98\xb8\x65\x30\xb1\x78\x00\x34\x71\xfa\xe7\x9d\x81\xd3\x3b\x19\x38\x83\x07\xe0\x5f\xbd\x5a\xa0\x87\xbb\x02\x1f\x29\x71\x3c\x08\x44\x06\x9d\xb2\xe8\x48\x36\xd0\x3d\x24\x46\x96\x52\x45\xc4\x20\xef\x88\xa1\x29\xa7\xd7\x43\xb8\x36\x83\xcb\x32\x31\x4b\x88\xc0\x63\x30\x49\x0a\x91\x03\x22\x4e\x4c\x96\x22\xa6\x9c\x07\x95\x69\x91\xa8\x8b\x81\x02\x7c\x25\xa4\x8a\x82\xba\xb2\x20\x5f\xa1\xa8\x82\xd4\x75\xcb\x28\x1e\x02\x8a\x43\x81\x22\x08\xb1\x43\x59\xad\x2c\xbf\x2b\xcb\x07\x3f\xd5\x13\x90\x5d\x62\xa4\x0d\x3b\x42\x76\xc1\x24\xbf\xf0\xa4\x6c\x12\x41\xf5\x84\x10\xf5\x16\xe2\xe8\x9d\x94\xa4\x58\x08\x68\x7f\x21\xa6\x27\x21\x55\x20\x9c\x2e\x76\xa1\x4e\x31\x7c\xb8\xdc\x1a\x76\x0a\xb9\x55\x85\xf6\x40\x96\x8d\xb4\x2c\x14\xf5\x89\xae\x50\x91\x00\x7d\x51\x9f\x90\xdb\xbe\x70\x70\x1a\x62\x3e\xbe\x47\xb8\xcb\xa7\x83\x57\xd0\xa3\x9f\xa6\x78\x72\x14\xfc\x01\x0c\xff\x41\x7d\xf8\x9f\xf8\xa5\xf8\x8e\x8e\x30\x79\x78\xe7\x7e\xff\x95\x7f\xc8\x25\x64\xff\xfe\xf2\x4a\xce\xdc\x43\xd9\xdd\x7d\x15\xbc\x90\xcb\x2c\xde\xae\x11\xb8\xd9\xc0\xcd\x19\x42\x5e\x61\xdf\x7d\x31\xac\xc9\xaa\x57\x0a\x63\xfd\xf0\x89\xfa\x69\x8f\x0b\x8b\x43\x67\xc4\xc5\x82\x1e\x9d\xa0\xe3\xf9\x1d\x1f\x5a\xdd\x93\xca\xe0\xa1\x6c\xbd\x1f\xf7\x20\xb2\xe2\xa1\x24\xd6\x48\xc9\x48\xb8\x0b\x19\xf4\x5a\xad\x1e\x1d\x82\x7a\x04\x53\xe0\x09\xaf\xe5\x13\xd5\xda\x9e\xd3\x15\x48\x7a\xe0\x7d\x01\x01\x9d\x3d\x25\x42\x8c\x40\x7e\x5d\x11\xcb\x93\x0b\x91\x57\x3e\x44\x2e\x01\x24\x01\x09\xe8\x11\x18\xc0\xbe\x33\x04\x79\x03\x13\x3f\x4c\xa8\xb0\x5c\x50\x95\xf0\x1e\x7a\xa5\xdf\x1e\xa2\x7a\x56\x7c\x3b\xd5\x51\x9c\x6d\xda\xd3\xc8\xe9\x63\xbf\x77\x2c\x7e\x70\xe9\xe7\x78\xc8\x65\x60\x0f\x0f\xb8\x48\x1c\xf0\x9f\xa1\x58\x2f\xa8\x7f\xc7\x03\x3e\x11\xf7\x30\x87\xeb\x7a\x90\xab\xeb\x81\x96\xc0\xd7\x3b\x10\x4f\x11\x7e\xbb\x8e\x0c\x41\xfa\x16\xe6\x13\x5d\xc1\x9f\x7b\xa2\xfa\xd1\x31\x50\x61\x84\x85\xc3\x20\x86\x63\xdb\xfd\xb7\x90\x38\x10\xb0\x83\x4c\xc8\xbb\x21\x28\x37\x9e\xd3\x7f\xeb\x81\x94\x18\x89\xcf\x35\x0a\x3d\xc0\xba\xd2\x15\x8d\x95\xbf\xb8\xf2\xbb\x80\x68\x05\xae\x14\x54\x03\xa9\x1b\x94\xc8\x00\xd1\x29\x21\xd8\x1f\xee\x16\xff\x77\xd2\xc1\xef\x0b\x3a\xc8\x4a\xfe\xdc\x93\x68\x8c\x0a\xd1\xd9\x07\xe5\xd4\x83\xec\xfd\x4c\x3e\x63\xf5\x5e\xa5\x06\xb0\x8a\x3f\x92\x05\x3e\x84\x1c\xd5\x80\xce\xa0\xab\x78\x27\x5c\x3d\xe1\xcb\x35\x8e\x34\x5f\x1f\x1d\x77\x3d\x30\x4a\x72\x61\xe0\xf9\xf0\xd7\x75\xba\x27\x23\x58\x33\x49\x2d\xd4\x19\x61\xb8\x76\xa1\x8b\xfb\xe7\x9d\x43\xa7\x5f\xd0\x0e\x2e\x68\xea\xf4\xb8\xec\x7c\x51\xd7\x79\x04\x51\xae\xbd\xe1\xb9\x7f\xe2\x79\xf5\x28\xb6\x2e\x57\x16\x38\x23\xf8\xc7\xde\x00\x74\xde\x11\x5f\xa3\xf5\xf0\x50\x8c\x9f\xe1\xf9\xa1\xd3\x3f\xf6\xf9\x00\x1a\xf2\x75\x1b\x57\x41\xba\x2e\x1e\x39\xc3\x6b\xb1\xc2\x15\x54\xe3\x83\x0f\x0e\xbd\xf0\xdf\x17\x7e\xef\x7a\x74\x3e\x54\x3a\x5a\x2c\xd6\x9b\xdd\x13\xbf\x5f\x8d\xbf\x2b\x82\xb6\xfa\xd5\xd8\xa2\xd7\x7c\x36\x7d\x25\xc9\xc5\x3b\x90\xab\x76\xd7\x9d\xfe\xb9\xe7\xf4\x63\x3e\xff\xf6\x5f\xf8\x0f\xd1\x0c\x2a\x26\xac\x11\x98\xb0\x46\xda\x7c\x75\x68\x7a\x53\x3f\x54\xdd\xa8\x6c\xc1\xfb\x2e\xf6\xfd\x3d\xdf\x97\x7f\xbd\xee\x9e\xd7\x97\x7f\xfd\xc3\x3d\x6f\x28\xff\x7a\xfd\x3d\x08\x20\x5b\x8f\xee\x7a\x7f\x63\x13\x27\xca\xf9\xf0\xba\x33\x7c\x31\x38\xf1\xdd\x3f\xf7\x5e\x1f\x62\xaf\x7f\xde\xbd\xee\xbe\x38\x3c\xa9\x1b\x68\xee\x6f\x04\xda\x21\xa1\xde\x96\xc5\x91\x39\x50\x1b\x87\xa4\x80\xd0\x66\x07\xef\xd8\x83\x40\x92\x7d\x5c\x11\x56\x96\xe0\x94\x07\xcc\xec\xc6\x35\xea\x7c\x5c\xca\x6b\xd4\x87\xfc\x09\x4c\xeb\x0f\xf1\x6e\x28\xad\x77\xc5\x55\x30\x8d\x43\xd2\xe7\x43\xb2\x68\x34\x34\x88\x0f\xd0\xbf\x30\x3c\xaf\x3d\x15\x44\xf6\x3f\x39\x3c\x87\xe7\x9d\xee\xdf\x31\x42\x35\xb9\x1e\x34\xed\x6f\x1d\x87\x43\x67\xb4\x7d\x24\xee\x36\x09\x35\x8f\x42\x08\x86\x23\x7f\xab\x23\x11\x2c\x19\xf2\x77\xfb\x68\xdc\x65\x46\xd1\x0d\x11\x11\x2b\x0d\x4f\xc3\x81\xd9\x90\xe1\xfd\x8a\x6c\xb8\xab\x5e\x9e\xfe\xdd\xa6\x5e\x78\x30\x1f\x79\xc7\x9e\x07\xb7\x4d\x63\xbf\x8b\x61\x85\xd5\xcf\x7c\xb5\xe5\xc0\xff\x2f\x84\xa3\x71\x8f\xab\xa2\xf0\x97\xb3\xb7\x07\x26\x30\x6f\xc0\x73\xca\x72\xc4\x4a\x92\x13\x67\xa1\x56\x7a\xc0\x3b\x5e\x47\x7a\x2d\x0b\x5e\xc9\x64\x8a\xf2\x65\xce\xc4\x69\x33\xf0\x6d\xe6\xff\xdf\x8a\xc8\xc6\x87\xb2\xd8\xc3\x4f\xd7\x1e\xb8\xfc\xef\x71\xfe\xeb\x80\x6e\x24\x97\x6c\x9e\x0a\xcb\x2e\x0e\x11\xf9\xf0\x51\xac\x93\xd4\x8c\xde\xf1\xc1\x92\xd3\x7f\xd1\x3f\xe6\xcb\x97\x01\xf6\x85\xb5\x17\x8f\xae\xbd\x5e\x2d\xde\xb5\x5f\x8a\xe3\x5e\x8d\xfc\x3e\xaa\x8f\xc9\x43\x50\x3a\xc1\x60\x0f\x8b\x30\x5f\x86\x8c\xee\xc7\x7c\x59\x04\xb8\x82\xf2\xaa\xfe\x77\xe5\x6f\x1f\x8e\xa8\xf4\x4e\x3c\xff\xbc\x33\xbc\x3e\xe4\x15\x0f\xce\xbb\xd7\x9e\x2b\xa2\x96\x7b\x5d\x6d\x1e\x82\xfd\x67\x35\x06\xdf\x76\xbb\x42\x12\x03\x3d\x3e\x5d\xfb\xf0\x06\xd8\xf3\x5f\x0c\xaf\x07\xe7\xa3\x13\xcf\xe7\xbd\xdd\xc3\xde\xe0\xc5\xe8\xba\xe3\x9f\xf7\x4f\xbc\x87\xcf\xa7\x65\x46\xec\xba\x9c\x11\xb9\xec\xe1\x9d\xaf\x18\xb1\x23\x99\x90\xff\x66\xfc\x59\xb3\x26\xb0\x20\xb8\x11\xc2\x3d\x17\x50\xc2\xa7\xad\xed\xfe\xe3\x7c\xf2\xdf\xe7\x92\x87\xf1\xc8\x3d\x57\x8a\x7c\x9d\xf4\x62\xc8\xab\x1b\x9d\x78\xb5\x71\xbb\x4b\xa4\x97\x2f\xe3\x87\x20\x06\xdb\x2d\xca\x9c\x33\x0c\xeb\x49\x57\x1a\x6c\xbb\xca\xf4\xae\x35\x0a\x6d\x5a\xee\xe2\xb2\x15\x45\xda\x7e\x3d\x69\xfb\x95\x16\x9d\x6a\x81\x60\x4e\x37\x83\xc4\x9b\x45\xf9\xd8\x85\x93\xad\x7c\xad\x00\x8b\xc3\x3e\xac\xb4\x84\xd1\x50\x9a\x75\x0c\x4b\xb2\x77\x0c\xf4\x1d\x28\x4b\xf2\x10\xfb\xd8\x1f\x5e\xfb\x86\x0d\xb9\xdf\x11\xe6\x12\x58\x41\x4b\xe3\xe4\x40\x58\x52\xbb\xe2\xf6\xb2\x21\x86\xcd\xa7\xa1\xb6\x23\x54\x2d\xc9\xca\x02\x3c\xbc\xdb\x92\xdc\x5c\x86\x36\x6c\x3f\xdc\x96\xdc\x37\x6c\xd1\xca\x92\x2c\x6d\x38\xc2\x5c\x75\xdd\x91\x1b\x83\x43\x19\x33\x5e\xd8\x37\x21\x92\xbe\xb2\xc5\x72\x6a\x00\x49\xbb\x40\x93\x3e\x96\xbd\xfd\xe9\x73\x00\xec\x12\x75\x1d\x38\x12\xa8\xcd\xc7\x0f\x32\x1e\xf7\x0b\x33\x34\x74\xa9\x0f\x77\x3c\x48\xcb\xe5\x50\x5a\x2e\x0f\x3b\xde\x39\xd7\xd1\x44\x43\x5e\xf9\x30\xa7\x79\x2f\xbc\xba\x5d\xe6\xbc\xe3\x9f\x1c\x3a\xde\x8b\xc1\xf5\x40\x73\xb1\xd3\x13\x37\xea\x42\x2c\xc7\xc3\x6b\xb0\xb9\xb9\xd7\x3d\x71\x11\x00\x68\x89\xbc\x27\x60\xb3\xb1\xaf\xb6\xa0\x54\xc3\x84\xda\xee\x9e\xfb\xd7\x3d\xae\xb6\xbb\x7f\x4a\x4d\xf8\xf5\x00\x7b\xc3\x9a\x54\x19\x5d\x4b\x9b\x8d\x99\xd8\x17\x77\x79\xbc\xf0\x0e\xe1\xee\x8b\xc3\x58\x5e\x91\xf1\x62\xf0\xb0\xeb\x29\xaa\xba\x30\x6c\x97\x35\x0c\x88\x6e\x61\xb5\xac\x8d\x4e\x69\x0e\xec\xf4\xc4\x4d\x23\x1d\xc1\x7a\x1a\xb6\xb4\x49\x54\x4c\xb9\x72\x44\xcb\xf1\xec\xef\x18\xcf\xc7\x5d\xd8\x7b\x12\x8a\x6c\x69\x1c\x7a\xd2\x5c\xee\x03\x93\x77\x85\x74\x38\xe6\x4b\x17\x39\x02\xbb\x30\x02\xb1\x3f\xac\xec\xc2\xf4\x1b\x77\x61\xd4\x18\x1c\x3c\x74\x0c\x36\x8f\xe3\x62\x6a\xdf\x59\xd2\xa0\x54\x92\x34\x18\x63\x5f\xee\x01\x4a\x83\x31\xe7\x01\x6d\xca\x18\xc8\x7d\x31\x5f\xec\xe7\xc0\xb0\x05\x03\x08\xac\xac\xe0\x6a\x09\xde\x8b\x9f\x36\xb3\xc2\x31\xd3\x2e\xaf\xb1\xeb\x74\xcf\xfd\x81\xe3\x49\x7b\xe8\xfd\x86\xa0\x67\xec\xdf\xd4\x6c\xa1\x0b\xb9\xd7\xdc\x95\xfb\xce\x3d\xb5\x39\xa5\x2e\xd5\xe8\x39\x1e\x44\xda\xef\xc0\x05\x3d\xf5\xa5\x13\x8c\x44\x18\x87\xbe\x31\x0e\x45\x00\x06\xf8\xf5\x9d\xc3\x18\xe2\xd2\xc2\x7d\x1c\xee\x31\xa8\x1f\x62\x10\x7a\x6a\x10\x1e\xaa\x41\x08\xfb\x10\x5e\xef\xbc\xa7\x84\x77\x0c\x2b\x54\x5e\xf5\xf0\xc4\xeb\xfd\xb9\xf7\x1a\x00\x60\xa0\xf2\x9a\xbd\xfb\x2a\x2b\x0d\xb7\x75\xc8\xb8\x3f\x5b\xf5\x7a\x38\x54\xe8\x8b\x2d\x77\xb7\x03\x48\x3a\x03\xf8\xed\x3b\x87\x99\xef\x0c\xb0\x7c\x86\xf7\x3e\x4c\x86\x90\xc6\x61\xde\x7a\x62\x97\x48\xdc\x52\xc3\x7f\x79\xeb\xc0\x3d\xc9\x5f\x88\xe1\x24\x7c\x6e\xc1\xa7\x83\x2b\x68\xbe\x56\xec\x21\x05\xcb\xd4\xac\x27\x2e\x3a\xc1\x32\xed\x2d\x6c\xdd\xfb\xb2\x60\xfe\xfb\x60\xb1\xae\x57\x7e\xf2\x0e\xdf\x5e\x71\x99\xc6\x27\x99\x60\xea\xf6\xb5\xd1\x0b\xff\xda\xeb\x96\x15\x89\x63\x5f\xd8\x7e\xbb\xc2\xe6\x09\x92\x77\xc0\x15\x1d\xff\x05\x6c\xbb\x89\x8d\xd1\x43\xb9\x51\x07\xb7\x04\x9d\x78\xfd\x73\xdf\xbf\x1e\x42\x41\x9e\xdc\x28\x80\xaf\x9c\x22\x2f\x7c\xd0\xc4\xd4\xb6\x75\x49\x69\x11\x27\xe6\xbb\x00\x0c\x17\xae\x74\xba\xbc\x38\xef\xbc\xdf\xac\xb3\x8d\xb8\xca\x36\x12\x36\x2e\xaf\xfb\xa2\xc7\xb5\x71\xdf\x3f\xf1\x1e\xb2\x1b\x59\xbd\xbf\xfb\xbf\x41\x86\xbf\x83\x08\x9f\x24\xa3\xfe\xda\x68\x89\x81\x30\x20\x64\x61\x27\xbf\x69\xec\x70\xc5\x0f\x96\x17\xfe\xb9\x7f\x52\xb7\x3b\xde\x7b\xdc\x17\x31\xc0\xb6\x8e\xfc\x43\xb8\xc6\xd4\xe9\xf6\x16\x9d\x43\x70\x72\xed\x40\xc0\x15\xff\x90\xff\x7a\xbd\x6c\x08\x61\x67\x7a\x70\xf8\xaa\x77\xc4\x65\x96\x87\xc5\x5f\xe9\x51\x08\x03\x74\x30\x88\xfb\x4e\x1f\xee\x75\xf1\x2b\x47\x73\x3b\x70\xaf\x95\x3e\x5f\xeb\x0d\x3a\x4e\xbf\x77\xe2\xf7\xe1\x10\x6f\x17\xbc\x1b\xe1\x5f\xaf\x33\x72\xfc\xe1\x71\xb7\x27\x2e\xaf\x1c\xf8\xd2\xf5\x03\x8e\x81\x6b\x2c\x7f\x82\x2b\x9a\x60\x93\xa5\x7c\x3d\x76\xd7\x77\x86\xdd\xeb\x3e\xdc\x0a\xd2\xe3\xd5\xfa\xce\x70\x54\x3a\x55\xdc\xed\xc0\x09\x60\x7d\x88\x8c\xeb\x04\xc3\x81\x33\xf4\x17\x9d\xa1\x33\x84\x96\xf7\x3a\x7d\x9e\xd5\xeb\x75\x3c\x3f\x13\x44\xf0\x31\xbc\x61\x38\x54\xd9\x15\xa4\x00\x9f\x6e\xd8\xec\x2e\xfc\xf8\x34\x52\x7f\xf5\x8a\x03\x75\xcf\x4d\x17\x1e\xe0\x56\x19\x3e\x7d\x77\x9d\x5e\x2f\xec\x3a\x7e\x1f\xee\x82\x96\x8d\x82\x10\x3f\xce\x61\x2f\x06\xbc\x9d\x2e\x57\x5a\xfa\xa3\x4e\x37\x74\x0e\x3d\xe7\x50\x37\xbd\xef\x77\x1c\x6f\xf4\x82\x2f\x79\x07\xa1\x33\x3c\x2c\xa2\xa4\x38\x83\x91\xd3\x73\x86\x43\x1d\xee\x13\x4e\x7f\x8e\x62\x88\x3d\xe4\x3b\xbd\x1e\xa7\x91\xbc\x89\xb7\xeb\x89\x18\x42\x5e\x1f\x8e\xaa\x85\x9e\x33\x80\x4d\x94\x22\xec\x98\xef\x3b\xbd\x6e\x2c\xc2\x20\x38\x5e\x37\x74\x3c\xaf\x08\x7b\xeb\x62\xc7\x1d\x2e\xf8\xdf\x41\xc7\x71\x47\x70\x4e\xcf\x73\xdc\xc1\x0b\x3e\x0c\xfc\xb8\x23\x22\xf2\x74\xfa\x8e\x37\xc2\x7d\x38\xcc\xd8\x73\x06\xbd\x98\x77\x6b\xa7\x0f\x9b\x89\xfd\xde\xab\xa1\x23\x3c\x0e\x81\x47\xfb\x1e\xe6\x95\x1c\x3a\xaa\x35\x5e\xc7\xf1\x8f\xcc\xa6\x83\xf2\xeb\x75\x9d\x51\xec\xe3\x2e\x5c\x49\x23\xc2\x29\xf8\xe6\x4d\x51\xce\xa0\x7f\x3e\x70\xfa\xc3\x58\x5c\xfa\xda\x73\xbc\xc3\x52\x40\x58\x17\x2e\x32\xed\xc2\xad\x1a\xe0\x62\xce\xff\xb8\xfa\x58\x08\xdc\x67\xd7\xad\x44\x80\x75\xb1\x73\xc8\x39\x7f\x14\xf7\x1d\x0f\x4e\x04\x7a\xe7\x43\xc7\x1b\x54\x88\x06\xaa\x1c\x84\xca\x3e\xf2\x9c\x21\x6c\x33\xea\x28\x5c\x9a\x13\x7e\x82\x1d\x55\x08\x31\xd3\xf5\xce\x3d\x11\xda\xc9\xe5\x3d\x32\x1c\xbe\xf2\xc4\x75\xc0\x0f\x8d\xea\xcb\xb9\xae\x12\x2a\x9c\x8f\xaf\xfe\x7d\x84\x40\x58\x17\x02\x3d\x68\xed\xe0\x70\x97\x10\x30\xcf\xd4\x83\xd3\x4c\xff\x04\x2e\x78\x6a\x16\x02\x18\x98\xd4\x1f\x40\x44\x09\x70\x46\xe1\x3f\x70\xce\xf1\x90\xcb\x03\xce\x35\x7d\x2f\x34\xe2\x37\x71\x19\xe0\x78\x5d\x18\x0a\x10\x8f\x39\x74\xba\x3a\xd8\x03\x38\xc4\x3a\x5e\x97\x8f\x01\x6f\x14\x3a\x3d\x71\xc1\x84\xf8\x02\x87\x95\x0f\x63\x5f\x1c\x2f\xea\xfa\x2f\x86\x4e\x6f\x60\x16\x0d\x41\xea\x3b\x8e\xef\x0b\xef\xbe\xfe\x8b\x81\xe3\xf7\xcc\x13\xcf\x1e\xe6\x75\x79\x7c\x1d\xd4\x87\x05\xf0\x28\x84\xf1\xa8\xc2\xbc\x38\xdd\xae\xe3\xc1\xd9\x62\x4e\x09\xbe\xee\xe8\x3a\xfd\xfe\xb9\xef\x1c\x72\x5c\x8c\xe3\x10\x0e\xef\x76\xef\x95\x37\x72\x06\x9c\xcf\xe3\x81\x33\x18\xf1\x91\x11\x56\x83\xa6\x71\x1e\x77\x06\x5d\x40\x9a\xeb\xc1\xdd\x23\x67\xe4\x43\x64\x3d\xac\x6e\x16\xe0\x64\xba\xf7\x49\x4f\xc1\x12\x9f\xd7\xe2\x49\xae\x59\x7a\xb5\xf8\x3d\xa8\xc4\x3e\xc4\xa1\x8c\xbe\x16\xd4\x03\xb2\xe1\x45\x68\xc6\x0b\x3d\x0e\x53\x7c\x11\x5e\x06\xa5\xc3\x9c\x78\x21\xce\x6c\x07\xb5\x53\xdc\xd8\xba\x08\x2f\x3b\x17\x70\xd8\xd3\x0a\x1a\x4e\x80\xe2\x0f\xe2\xf0\x40\x50\x3b\x4e\x80\x3f\xac\x42\x16\x94\xdd\x0c\xf1\x42\x6d\x99\x07\x0d\xdb\xe8\x1c\xd5\xb0\xfa\x0d\x52\xf0\x29\x4d\xd3\xdb\xa0\x62\x62\xc2\x4c\xe8\xd1\x41\x4d\xb3\xc6\xd6\x2a\xe9\x9c\x8b\xb9\xd6\x44\x5b\x4f\xc0\x39\xde\x12\xd9\xb3\x44\x6e\x6c\x01\x09\x2d\x1c\x39\x45\xec\xca\x63\x08\x5d\x59\x81\x74\x54\x0f\x20\x74\xcf\x92\xc3\x2b\xb6\xba\x4f\xc1\x8b\x30\x45\xe8\x1f\x8e\xa0\x6a\xd4\xb7\x35\x7e\xea\x8e\x10\x9e\x7f\x7b\x08\xd5\x2a\x4d\x64\x90\xd1\xa6\x2f\x45\xd5\x68\x9d\x52\x76\x95\x26\x6b\x9a\x5c\x5d\xd0\x34\xfc\x10\xf3\xf2\xf0\xc7\x34\x62\xea\x59\xa0\x7c\xa5\xbf\x89\x4a\x59\x9e\xef\x6e\x74\x63\x00\xd2\xbf\xbd\xd1\x85\x42\xa8\x62\xaa\x96\xd2\xcc\x86\x5e\x87\xe9\x1e\x25\x96\x35\x16\x2d\xde\x63\x4e\x94\x2c\xe9\xcd\x9b\x53\xdb\xd2\x47\x8e\xd0\x93\x8e\xd7\x6e\xdb\x74\x9f\x58\x8b\x30\x11\xa9\x7b\x16\xc2\x25\xd8\x30\xa6\x29\xab\x03\x43\x72\x05\xd8\x10\x52\x26\xf8\x79\x98\x49\x29\x66\x21\x6c\xd3\xc9\xe7\x8f\xb3\xeb\xb3\xbd\x6b\x9a\x66\xd1\x2a\x21\x96\xe7\x14\x47\x41\x3e\xdf\xa7\xfb\x9f\x5b\x7b\xd7\x11\xfd\xf8\x74\x75\x43\x2c\x77\xcf\xdd\xeb\x0e\xf6\xba\x03\x6b\xef\x32\xa5\x19\x4d\xaf\xe9\x51\x76\x49\x17\xec\xfb\x90\x45\x2b\x62\xdd\xbc\x8e\x96\xef\x5f\x47\xcb\xbd\x0b\x4a\x99\x25\x0e\x49\xdd\x5c\xc4\x49\x46\xac\x73\xc6\x2e\x83\x83\x83\x8f\x1f\x3f\x3a\x1f\xbb\xce\x2a\x3d\x3b\xf0\x5d\xd7\xe5\x1d\x65\x09\x90\xe0\x26\x8e\x92\xdf\x9b\x00\xbd\xd1\x68\x74\x00\x5f\xad\xbd\xd3\xd5\xe2\x2a\xe3\xcc\x40\xac\xd3\x30\xce\xa8\xb5\x97\xae\xf8\x4b\x74\x71\x66\x3d\xf9\x3c\x68\x6a\xcb\xff\x6f\xb0\x47\xfb\x6c\xdf\x7a\xcc\x0b\x7d\x62\xe5\x79\x8e\x72\x3c\xea\x75\x87\x87\xbb\xd9\x36\x75\x96\x36\xc5\xeb\xdf\x0b\x28\x35\xaa\xf6\x96\x79\x8e\x74\x94\xdf\x41\x6f\x38\xf0\x45\xe4\x5e\xcf\x1d\x74\x47\x08\x87\x24\xb5\xbb\x83\xe1\x08\x8d\xf9\xe0\x61\x7b\x31\x99\x5a\x29\x3d\xb5\xe6\x90\x27\x1b\xab\x02\xf7\x56\xc5\x48\xdd\x63\xed\x36\x73\x52\x7a\x19\x87\x0b\x6a\x1f\xcc\xd2\x59\xb2\x99\xa5\x07\x67\xd8\x9a\x25\x16\xca\x63\xca\xf6\x16\x24\x23\xc0\x3e\x6b\x28\x36\xbd\x5a\xb0\x55\xca\x51\x47\x6b\x76\x1e\x65\xce\x2f\xcb\xe8\xf4\x94\xa6\x19\x61\x58\xbc\x27\x67\x3f\xad\x12\x4a\xa8\x78\x85\xac\xdf\x86\x17\x7c\xb0\x88\x94\x04\x5e\x16\xab\x25\xbd\x88\xd2\x74\x95\xca\x64\x2e\x8d\xbf\xe4\xf4\x24\x2d\x4f\xa4\xa8\x4e\x7d\xbb\x48\x57\x71\xfc\xdd\x2a\x8b\x38\xfa\xfa\xf3\xe2\x2a\xcd\x56\xe9\xd1\x82\x45\xd7\x11\xbb\x25\x09\xfd\xb8\x97\x38\xd7\x97\xb2\x5e\xe8\x9a\xe3\xf3\x30\x39\xa3\xd5\x4f\x19\x94\x57\x4d\x5d\xa6\xab\xcb\x6a\x1a\x48\x07\x8d\xf8\x32\x82\xbe\x5e\x6a\x0c\xa2\x0c\x10\x36\x52\x56\x89\xac\x92\x91\x27\xeb\x5c\xa5\xbd\x5b\x5d\x2d\xce\xe9\x92\xd8\x88\xa7\xe6\x19\x65\x7b\xab\x4b\xde\x96\x8c\xf7\x84\xa0\x9a\x4c\x20\x0c\xb7\x4c\xb2\xb6\xdb\xac\xdd\xb6\xcd\x14\x52\xa2\xba\x73\x1a\x25\x4b\x9b\x21\x67\x91\xd2\x90\x51\x1b\xa1\xfc\x8c\x77\xda\x6a\x49\x5f\x03\x75\xbf\x8a\x57\x1f\xc2\xb8\x60\x22\x91\xbb\xf8\xbe\xd9\xd8\xd5\x24\x92\xda\xfe\xb0\x37\x1c\x20\x84\xab\x9f\xf2\xe4\xec\xe8\x94\xd1\xf4\x24\xa2\x1f\x5f\x26\x11\xb3\xd1\x5a\xa0\x9b\xd2\xd3\xcd\xc6\xec\x7f\x27\xbd\x4a\xde\x5c\xb1\x2c\x5a\xd2\xa3\xe4\xec\x2a\x0e\x53\x1b\x9a\x2f\xba\xae\xa8\xab\xf2\x2e\xd0\x75\x4e\xd3\xd5\xc5\x3b\x7a\xc3\x8e\x52\x1a\xda\xaa\x02\x27\x09\x59\x74\x4d\x9f\xc7\xf4\x82\x26\x8a\xdb\x24\xdd\x24\xaa\x45\x41\xce\x2a\xb1\xad\x32\x8b\x58\x98\x91\x27\x55\x1c\x01\xab\x2a\x3f\x51\x9b\x21\xd4\x5c\xa4\x60\x1e\xcb\xe4\x24\xd1\xe5\x4b\xe7\x03\x74\xc5\x79\x94\x6d\xc9\xfa\x21\xbe\x4a\x2d\xac\xeb\x6b\x44\xc2\x60\xdb\xa5\xdd\xf2\xb6\x61\x01\x60\x0f\x2b\xcb\xdd\x56\xd6\x02\x20\x2c\x0c\x63\x7a\x27\x81\xf4\x90\x3d\xe1\xe3\x42\x95\xcc\xb3\x6d\x29\x9a\x8f\x29\x5d\xf0\x7a\x7b\xc9\x1c\xee\xcb\x28\xa6\x99\x28\x2c\xaf\x97\x96\x51\x06\x95\xda\xc5\xb8\x44\x39\xca\x93\xb3\x67\x2b\xb8\x23\xc2\x46\xeb\xe8\xd4\x2e\x0d\x1d\x24\x38\x5e\x4a\x43\x56\x1a\x37\x0e\xff\xb1\xcb\x1c\x34\x86\x91\xe6\x9c\xae\xd2\xe7\xe1\xe2\x5c\xb6\xee\x25\xa3\x17\xb6\x62\x9b\x8c\xb2\x37\x00\xfc\xf2\x54\x37\xde\xf9\x9d\xde\x62\xc6\x99\x27\xa5\x89\xc0\x91\x13\x43\x15\x73\xb4\x5c\xfe\xf5\x42\xbe\xa7\x17\xab\xeb\x4f\x2d\x86\x13\xe9\x4d\xf2\x8c\x66\x2c\x5d\xdd\xda\xa8\x3a\x00\xdb\xed\x2a\xa9\xd9\x4a\x8f\x3c\x94\xef\xe8\xf3\xb5\xa5\x3a\xc5\x6a\x11\x42\x9d\x55\x1a\x9d\x45\x89\x92\x56\x42\x74\x32\xe7\x4c\x75\x1c\x2a\x4b\x48\xb3\x23\x51\xde\xd4\x1a\x5e\x45\xab\x82\x9c\x94\x31\x65\xc6\x10\x39\x21\x43\x5e\xe2\x79\x25\x5c\xb5\x04\x56\x48\x14\x82\x9b\xd5\x66\x0b\x87\x5e\x44\xcc\x66\x28\x2f\x0d\x6e\x5d\x96\x48\x95\x40\xbc\x75\x62\x76\x7a\x99\x9c\xae\xb8\xf0\xad\x08\x91\x75\xc3\x4c\xa5\x2b\x28\x73\xfd\x5a\x8f\x04\x01\x30\x65\x98\xce\x51\xce\x95\x67\x2a\x59\x1f\x78\x3c\xb9\x8a\x63\x42\x98\xe2\x6e\xcd\xf5\x05\x4d\xe4\xa7\x3d\xae\xc3\x96\x3a\x43\x69\x06\xb4\x2a\x75\x8d\x5e\xe2\x05\x32\xde\x9f\xed\xf6\xca\xa6\xa8\x45\x08\x57\x17\x50\x74\x5a\x2a\x69\xd7\x04\x8d\xd6\xa5\x11\x57\xae\xc5\xa4\xd6\xf8\x3e\x83\xbc\x2e\x09\xa0\x84\x77\x2b\x9b\x39\x31\x3d\x65\x98\x39\x6c\x75\x89\x72\x1a\x67\x74\xef\x5e\x52\x23\xa5\x67\x51\xc6\x68\xfa\x46\x73\xa2\x66\x13\x35\x79\x1b\x30\x8a\x73\x6a\xbc\x44\x18\xe7\xda\x67\x52\x27\x78\xcb\xf8\xec\xab\x80\xb4\xa6\x20\x09\xd5\xc0\xde\x56\x4a\xc3\xe5\x9b\x24\xbe\xad\x28\x17\x28\xcf\xc7\x0b\x67\x76\xe5\xfa\xc3\xfe\x69\xb8\x68\x58\x5d\xed\x25\xf4\xa3\xcd\x36\x9b\x05\xb2\x13\xe7\x7d\x77\x60\x27\x4e\xf8\xef\x33\x84\xd5\xcb\xf7\xee\x07\x84\x72\xac\x0a\x59\x5c\x5c\x92\xc4\xf9\xdf\xcb\x0b\x7b\xcd\x57\xad\xc1\x02\x67\x34\xa6\x5c\x89\xcb\x82\xe9\xd4\x4a\xce\x6e\x3a\x86\x2e\x36\x9f\x63\xae\x5f\xff\xfb\x8a\xa6\xb7\x25\x45\x15\x78\xcf\xe3\xda\x48\xe2\x7c\x75\x6a\xc7\x78\x88\xb0\xdf\x66\x68\xcd\x75\x44\x36\x4e\x9c\xe8\xab\xd7\x36\x23\x89\x73\xfc\xfd\x0b\x1b\x21\xbe\x36\xe1\x73\x36\x61\xce\x69\x94\x66\x0c\xe5\x39\x8e\x92\xcb\x2b\x96\x05\x6b\xad\x12\x06\x96\x7e\xb4\x70\x02\x09\x09\x3c\x6b\x5d\x30\xb0\xf4\xa3\x85\x9b\xd9\x2d\xb0\x9a\xd3\x2d\x2c\x05\x7b\x60\xc9\x07\x2b\xc7\xab\x2b\x26\x71\x28\x0d\xc9\xa0\xa6\x29\x18\x02\x21\xb0\x8c\x17\x0b\x0b\xfe\x0b\xb4\x22\xc0\x47\x6c\x20\x66\xba\x1c\x9f\xd2\x90\x5d\xa5\x34\x0b\xa6\x89\xf3\xcb\xd3\xc4\x9e\xae\x2f\xd3\xd5\x75\xb4\xa4\x41\xe8\x7c\xfd\x03\xbe\xca\xe8\xf3\x9b\x28\x63\x51\x72\x16\xd8\x2e\x4e\x9c\xaf\x2e\x17\x08\xa6\xc1\x0c\xe1\x8b\xab\x98\x45\x7c\x29\x3a\x47\x73\xbc\xa4\x8b\x38\x0b\xba\xf8\x3a\x4c\xb3\x60\x88\x61\x44\x41\x7f\x71\x7a\x2c\x56\x17\x97\x31\x65\xd4\xc2\xd6\xea\xf4\xd4\xc2\x5d\x2c\xe9\x06\x5f\x85\x6e\x30\xc7\x42\xfb\xc7\x16\xef\x53\x46\x2f\x2e\xe3\x90\xd1\x4a\x97\x42\x7f\xda\x89\xf3\xee\xec\x27\xdb\x15\xf7\xdf\x84\x29\x0d\x2d\xec\x62\x8f\x33\xd4\x2f\x57\x3f\xd8\x3e\xb6\xf8\xc2\xc9\xe2\xef\x7f\xfc\x74\x64\x23\xe8\x77\xc8\xf6\x55\x4a\xed\x0a\x03\xed\x59\xb0\x8e\x96\xbd\x8a\x2d\xc8\x46\x7f\xff\xad\x0a\xd7\xe9\x9c\x0a\x09\xcc\xe1\xb5\x38\xe6\xc0\xff\x1e\x7c\x6d\xcb\xe6\x50\x58\x2b\x20\xdb\x68\x16\xa6\xc5\x42\x81\x73\x39\x4d\x16\xe1\x65\x76\x15\x87\xc0\x0a\x3e\x16\xca\xcc\x33\xca\x28\x34\x33\xe0\x0b\xfb\x85\xc3\xb9\xfd\xbb\x30\x0d\x2f\x28\xe3\x2b\x15\x4e\xf0\xa9\x18\x0d\x30\x76\x72\xac\x5e\xbe\x77\x3f\xe4\x73\x6c\xbb\x38\x72\xce\x12\x64\x4f\xa1\x93\x5e\xbe\x7c\x8a\x6c\x24\x52\x3f\x0e\x90\x6d\x2d\x69\x16\x9d\x25\x01\xcf\x63\x49\x5b\x13\x9a\xe3\x85\x73\x99\xae\xd8\x8a\xa7\x62\x93\xb1\x85\x29\x01\xfd\x1d\xa5\x26\x7f\x77\x81\xc6\xe8\xfa\x2b\xa5\xd6\x3f\x5f\x72\x6a\x73\x98\xcc\xc2\x53\x01\x35\xaf\x56\xae\x86\x25\xe6\x53\xda\xdf\xd2\x9c\x6d\x92\x60\x4b\xdb\xd2\x5f\x7e\x78\x78\xc7\x56\x04\xc5\xdf\x58\x74\x49\xcc\xfc\x8d\xe5\x2a\x49\xf5\x37\x16\x29\x14\xfb\x2d\x05\x46\xa3\x57\xc8\x16\xc2\x67\x9d\xb1\x90\x45\x0b\x61\x60\xdb\x52\x43\xe2\xbc\x7d\xfa\x47\xb5\x02\xc8\xad\xca\x5f\x90\x8c\x94\xea\xd8\xc1\x6b\x30\xa0\x31\x8c\x64\x60\x38\x34\xe6\x13\xd4\x92\x88\xd5\x27\x4c\x56\xd2\x9c\x91\x17\xb6\xbb\x86\xe9\x96\x96\xa6\x5b\xba\xd9\x30\x94\x63\x05\x79\xb1\x5a\x92\xc4\x59\x1d\x3d\x95\x73\x2a\xe3\x2b\x16\xf9\x2d\x4a\x7e\x23\x89\xb3\xf8\xfa\xad\xbd\xe6\xa9\x39\xb2\x51\x8e\xfb\x87\x9e\x37\xbc\x97\xe1\xe7\xeb\xab\x06\xcb\xcf\x55\x9a\xe3\xe3\xd7\x0d\x1f\x2e\x13\xd3\x26\x24\x0d\x41\x09\x49\xed\xee\x61\xff\xb0\x6b\xd8\x84\x70\xcc\x57\xf5\xfd\x91\x37\x44\x38\x23\xa9\x7d\x78\xe8\xba\xbe\xd2\x07\x57\xc4\x5a\xac\x12\x96\xae\xe2\xec\xb9\xb0\xc8\x2c\x88\x75\x6d\xe8\xfb\x6f\x6f\x93\x85\x85\x97\xc4\x52\x18\x58\xf8\x8a\x58\x2b\x60\x0d\x0b\x9f\x13\x2b\xbd\xf9\x48\x3f\x9c\x84\x71\xb4\x0c\x19\xcf\x7f\x49\xe4\x65\x7d\x16\x3e\x25\xd6\x87\xd5\x2a\xa6\x61\x62\xe1\x33\x62\xa9\x99\xa8\x73\x2d\xa0\xa3\x55\x22\xed\xd8\x16\xbe\x00\x3c\x96\x30\x68\xc3\xd8\x28\xee\x1a\xd0\x11\x6f\xc7\x12\xf8\x96\x58\x17\xab\x25\x8d\x5f\x26\x19\x0b\x93\x05\xb5\xf0\x07\x62\x5d\x86\x6c\x71\x6e\x8d\xa1\x83\xf7\x8e\x25\xf7\xed\x29\xac\x8f\x53\x1a\x82\xf1\x0a\xad\x4f\x57\xa9\x2d\x6c\xb8\xd3\x39\x4e\x09\x73\x2e\x78\x4e\xfb\xe0\xe7\x59\xf6\xc5\xcc\x9e\xcc\xb2\x2f\xec\xe9\xcf\x68\xfe\x05\xe2\xef\x88\xbf\x93\x27\xb6\xf3\x05\x3a\x40\x38\x22\xe9\xd4\x9f\x3b\xd9\x65\x1c\x31\xdb\xc2\x70\x7d\x96\x3b\x4e\x1e\x47\x4e\x4c\x93\x33\x76\x3e\x4e\xf6\xf7\x85\x81\x38\x24\xd1\x34\x99\xdf\x5d\xf4\x86\x10\xb2\x69\x11\xb2\x81\x9f\xcd\x13\xb2\x79\xb2\x79\x4c\x36\x8f\x37\xa2\xc6\x31\x97\x8f\x2d\x42\xc2\x89\x30\x65\x7d\xa9\xd8\x20\x9d\x7a\x73\x3e\x54\x80\x15\xac\xfd\xd0\x01\x0d\x0b\x05\xf6\x7d\x2b\x26\xb2\x49\x4d\xe5\x8a\x75\x06\x09\x27\x45\x05\x91\xa8\x20\xa8\x57\xc9\xb5\x6a\x48\x72\x09\x51\x74\xe0\x2a\x20\x59\x87\x8b\x05\xcd\x32\x55\x74\xb0\x0b\x7f\x4e\x56\xbe\xf6\xa7\xb9\xec\x37\x7a\x43\x17\x57\x5c\xad\xe6\xc3\x05\x47\x38\x11\xda\x66\x48\x92\x09\x75\x96\xb7\x49\x78\x11\x2d\x04\x3b\x04\xd4\x31\x38\xe7\xf9\x0d\x9f\x08\xb2\x68\x95\xe0\x98\xc3\x06\x91\x1a\xea\x69\xbb\x6d\xf1\x01\x97\x9c\x59\x44\x6d\xe2\x84\xed\xb6\x1d\x92\x63\xa7\xca\x25\x21\x42\xb8\x95\x6e\x36\xad\x70\xb3\xb1\xa3\x76\x3b\x72\x0c\x03\x68\x8b\x10\x21\x19\x27\xa1\xb3\x08\xe3\xd8\x8e\x70\x8a\x19\x8e\x51\x10\xda\xe2\x01\xa9\x56\x9c\x51\x76\xac\x70\xfb\x2e\x64\xe7\xb6\x54\x9a\x61\xfb\x40\xf1\x61\x4a\xbc\x71\xfa\x98\x29\x16\x4a\xf7\xf7\x11\xdd\x27\xea\xbd\xe3\x11\x92\x4e\xd8\x34\x9d\x3b\x2c\x8d\x2e\x6c\x14\xfc\xfa\x68\x6d\xbc\xe6\xce\xaf\xaa\x85\x06\xf1\x14\x11\xbe\x0b\xd3\x8c\x4a\x93\x2d\xaf\x38\xe5\x3c\x1f\x11\xbe\x70\x7a\x0b\xb4\xb0\x39\x0b\x1f\x3b\xf4\x86\xa5\xe1\x82\x1d\xa5\x67\x57\x17\x34\x61\x99\x1d\xc1\x6a\x30\x91\x48\x3c\x71\xa5\xb2\x4f\xa6\xf3\x71\x64\x18\x8d\xb3\x83\x33\xae\xe8\xe9\x14\xde\xc7\xdf\xd3\xb3\xe7\x37\x97\xf6\xc1\x7a\x93\x1f\x60\xeb\xcc\x42\x00\x21\xc6\x8c\xf9\x5d\x60\xbd\x75\x00\xb4\xdb\x07\x08\x29\x33\x88\x4d\xa5\x04\x4f\x09\x35\xaa\xb7\x37\x33\x24\x31\x90\x63\x72\xb3\xb1\x10\x50\x96\x03\x47\x7b\xab\xd3\xbd\x14\x31\xe7\xf2\x2a\x3b\xb7\x23\x30\x2e\xe9\x12\x19\x79\xb2\x4e\xf4\x9b\xcd\x59\x8c\x3c\xe1\x2b\x1d\x9b\x71\xfa\x00\x71\x91\x93\xb1\x30\x65\xd9\x8f\x11\x3b\xb7\xa3\x7d\xcb\xb1\x90\x1a\xde\x4c\xd5\xe8\x58\x40\x2a\x9f\x90\x50\x52\x6b\xb3\x51\x4f\x4f\x88\xdf\x6e\x53\x94\x0a\x04\xe8\x84\x2f\x09\x2e\x61\xf9\x03\x0b\xbf\x1a\x7b\x84\x08\x87\xb2\x0b\x5e\x26\x4b\x7a\x13\x74\x09\x49\x26\x6e\xe0\xf3\x1f\x2f\xf0\xf8\x4f\xc7\x0b\x92\x3c\x28\x4a\x0a\xa7\x9e\xe2\x85\x7b\x66\x46\x63\xbe\x62\x86\x76\xc4\x04\xb2\xcb\xa6\x4c\x2d\x31\x65\x32\x62\x16\x1f\x6a\x4e\xd4\xf5\x08\xf1\xff\x9d\x82\x89\xa7\xee\x1c\x87\x69\x1a\xde\x8a\x8a\x63\xd5\x7c\x6f\x12\xf3\xe2\x55\x87\x59\x73\xbe\x26\x41\x81\xdc\x50\xac\x61\xab\xd0\x05\x7c\x93\x7c\x2c\xe9\xc6\x57\x90\x39\xca\xb5\xa0\x49\x0b\x3e\xaf\x70\xad\x1e\x5e\x53\x8b\x13\xd8\x9a\xf3\x9e\xb1\x6c\x8b\x10\xc2\xa6\xae\x42\x7f\xb3\x51\xfd\x6b\x76\x6f\x31\xc1\x21\x35\x56\xf4\xd4\x30\xb3\x41\x7c\xee\x23\xce\x6e\x68\x9c\xb6\xdb\xe9\xd4\x9d\x8b\xbf\xc6\x6c\x60\xf2\x16\x95\xb8\xab\x9a\x34\x0d\x6c\xab\x34\x62\x2c\x04\xef\x48\x98\x31\x54\xc5\x46\xb9\xe4\x89\x85\xa6\xee\x7c\x2c\x0b\x4c\xef\x5b\x60\xbe\x5d\x2a\x1c\xaf\xe2\xab\x8b\x04\x6c\x4f\xa4\xe5\x09\x8e\xe6\x92\x01\x3a\x3f\xe2\x0f\x22\x6f\x4d\x5e\xb2\x89\xcd\x4a\x78\x15\xbc\xb3\xd7\x6e\xef\x95\x29\xb0\xd6\xa0\x7b\x9b\x4d\xf5\x5b\x54\x21\x8f\x82\x84\xb6\xf2\xbe\x46\x38\x2a\x65\x10\x33\x76\xc3\xa8\xa3\x92\xd9\xd4\x28\x2b\x58\x97\x16\x23\xc3\xe4\xf9\x88\xd0\x3b\x78\x9e\x4e\xe9\x9d\x3c\x1f\x55\x78\x3e\x2a\x78\x3e\xda\xce\xf3\x25\x9e\x46\x28\x48\x41\xf6\x36\x48\x6b\xac\x99\xbc\x34\xd9\xfd\x05\x79\x8e\x43\x12\x35\xca\xe9\x59\x3a\x81\xad\xbf\xcd\xf8\xe0\x0c\x61\xde\x05\x85\x84\x9d\x5a\x9f\xd9\x68\xb6\xce\xc9\x6c\x36\x99\x5d\x9d\x9e\x9e\x2e\x7f\xfd\xfc\x7f\x1e\x3f\xd9\xe0\x71\xb0\xdf\x99\xef\x73\xd9\xbb\xa7\x85\xef\xc1\x1e\x0c\x0e\xa9\x3a\x2b\x7a\x74\xdb\xed\x04\x00\x78\xb5\x9a\xac\xc2\xc8\x60\x76\x70\xe8\x9c\x46\x31\xa3\xa9\x9d\x92\x27\x69\x8b\xf0\x59\x2e\x77\x1e\xad\x69\xfe\x6b\xbb\x9d\x9a\x03\x55\x7c\xf9\xb5\x61\x72\x88\x08\xad\xf3\x47\xb4\x9d\x3f\x74\x3b\x65\x91\xbc\xa3\x4c\x4e\x49\x48\x74\x07\xa7\x44\xd3\xe8\x4e\x4e\x49\x2a\x9c\x92\x14\x9c\x92\xdc\x97\x53\x72\xce\x10\xb9\x50\xd9\x8f\xc8\x1a\x7c\x2c\xa2\x45\x60\xc9\x07\x0b\xa7\xf4\x8f\xab\x28\xa5\x4b\xae\xa0\x89\x27\x0b\x5f\x44\xc9\x2b\xa8\x29\xb0\xf4\xa3\x85\x2f\xc2\x1b\x9d\xaa\x1e\x01\x56\xdc\xa5\x0d\xb0\xdf\x4a\x05\xfe\x22\xbc\xd1\xa9\xea\xd1\xc2\x97\x21\x63\x34\x4d\x02\x4b\x3e\xf0\x94\x2c\xfb\xb8\x4a\x97\x3c\x49\x3c\x59\xc2\xab\x29\xa5\x81\x25\x1f\xa0\x8e\x67\x21\xa3\x50\x03\x7f\x80\xf2\x65\x8a\x78\xb0\x70\x18\x5f\x9e\x87\x81\x05\x3f\xf2\xed\x5b\xd5\x58\xf3\xcd\xc2\xf4\x22\x8c\xe2\xc0\x82\x1f\x0b\x9f\xd3\x1b\xb8\xa8\x39\xb0\xd4\x93\x85\xe3\xd5\x47\x9a\x1e\x87\x19\x0d\x2c\xfd\x68\xe1\xab\x34\x0e\xac\xab\x34\xb6\xf0\xd5\xe5\xa5\xfa\xae\x1f\x2d\x9c\xd0\x8c\x71\x3a\x8a\x5f\x0b\xf3\xbe\x3e\xe2\xbd\x17\x58\xfa\x51\xa4\x0a\x2d\x50\x24\xbf\x91\x0b\x22\xbe\x98\x0a\xa3\x24\x0b\x2c\xf5\x64\xe1\x54\x98\x12\x53\xb1\xba\x5f\x5c\x65\x6c\x75\x11\x58\xe2\xd7\xc2\xcb\xe8\x2c\x62\x81\x05\x3f\x16\x5e\xa4\x74\x19\xb1\xe3\x90\xd3\xb2\x78\xb6\x30\x8b\x2e\x68\x60\xf1\xbf\x16\xfe\x2d\x5b\x25\x81\xc5\xff\x5a\xf8\x0c\xf6\x7e\xd3\x77\xe7\x61\x12\x58\xc6\x4b\xe9\xcb\xf3\x3f\xae\xc2\xf8\xdd\xaa\x04\x20\xd3\x2c\x1c\xd3\x2c\x13\xd9\xd5\x53\x91\xa6\x33\x56\x12\x2c\xbc\x38\x5f\x45\x0b\xde\xb9\xf0\xcb\x5b\x71\x7a\x4a\x53\x9a\x40\x4b\xe4\xa3\x85\xe9\x35\x4d\x02\x8b\xff\xb5\xf0\x6a\xb9\x0c\xac\xd5\x72\x69\xe1\xd3\x90\xab\xd1\x81\x25\x7e\x79\x6d\xe1\xe5\x7b\x1a\xa6\xbc\x1a\xf1\xc4\x7b\x3e\x7e\x73\xca\xbb\x3c\x7e\x73\x6a\xe1\x55\x42\xf9\x1b\xfc\x58\x38\x91\xaf\x89\x7c\xbf\x08\x17\x9c\x83\x16\x16\x0e\xb3\x45\x14\x05\x16\xfc\x58\x78\x19\xb2\xf0\x87\x34\x0a\x2c\xf9\x60\xe1\xcb\x55\xca\xfb\x6b\x95\x32\x0b\xc7\x21\x7b\xb5\x4a\xce\x02\x4b\x3e\x58\x98\xde\x30\x9a\x64\x60\x57\xd6\x8f\x16\x3e\x8d\x62\xfa\x36\xfa\x93\x06\x96\x7a\xb2\x30\x4d\x96\x20\x8b\x02\x4b\x3d\x59\xb8\x90\x50\x81\x55\x3c\x73\x4e\x89\x2e\xa8\x1a\x45\xc6\x0b\x60\x10\xb1\xab\x25\x05\x14\xe0\x89\xf3\x6c\x72\xa6\x12\xd5\xa3\x18\x4b\xab\x4c\x8e\xa5\x15\xe7\xd2\xf4\x2a\xe6\x2c\x05\x9e\x4c\x1c\x2f\x81\x9d\x85\xa3\x8b\x90\xf3\x1a\xfc\x58\xf8\x2a\x89\xfe\xb8\xe2\xec\x0d\xbf\x9c\x72\xec\xf9\xc5\x25\xbb\xe5\xb4\x13\x4f\x16\x8e\x2e\x03\x2b\xba\x04\xbe\xe4\x8f\xf0\xc3\xb9\x27\x5a\x72\x7e\x89\x96\x40\x47\x0a\x44\xe4\xe3\x33\x59\x06\x56\x98\x2c\x2d\xcc\x7b\x90\xf7\x5e\xb2\x62\x50\x1c\x8c\xef\x77\xc0\xa6\xf2\x01\xc6\xb7\x4c\x11\x0f\x85\x9c\x7a\x97\x72\xbc\xcc\x37\x0e\x9d\xfd\xce\x41\xb3\xdf\x2d\x1c\x7d\xe0\x1c\xc9\xff\xf2\x71\xca\xeb\x7e\x93\xf0\x61\x2a\x9e\xac\x1c\xbf\x25\x30\xee\x68\xca\xdb\x70\xa2\x2c\x12\xdf\xe9\xa4\x5f\x88\x05\x32\xb7\x48\x79\x41\x94\x3e\x83\x3f\x12\xeb\x82\x66\x19\xd0\xe8\x35\x2c\x80\xeb\x6e\x2e\x72\x3f\x27\x92\x36\x86\x8c\xcf\xb4\x90\x22\x4d\x0f\x8b\x14\x7c\x11\x8e\x57\x57\x09\x23\x6e\x7e\x46\x99\xe9\x5b\x53\xca\xaa\x66\x36\xca\xd5\x42\x95\xca\x75\x52\xae\xec\xf0\x9c\xca\x90\xa1\x96\xbb\x62\x72\x4f\x88\x58\xfd\xa7\x13\x66\xae\x3f\x03\x86\x43\xd2\x5c\x01\x23\x4f\x98\x59\x41\x02\x9a\xa3\xc4\x89\xaf\x65\x65\xc6\x70\xb9\x54\x55\x1e\x0b\x31\x45\x53\x3b\x41\x08\x87\x79\xb8\x5c\x72\x92\x65\xd2\x1f\xd2\xd0\x34\xee\xd5\x26\x68\x12\x9f\x79\x53\x54\x5a\x85\x51\xfd\x4a\xf9\x6b\xe4\xa8\x29\x34\x53\x6d\x4d\x1d\xd9\x9f\x51\xa5\x3d\xe0\x34\x44\x68\xbb\xcd\x14\xc4\xed\xbb\xdb\x4b\xda\x22\xe4\xa4\x21\xed\x17\x40\x20\x99\xa8\x76\xf2\xc6\xe8\xb6\x4c\x93\x39\x8e\x50\x60\x05\x61\x1c\x07\x7c\x55\x40\xe5\x1e\x78\x15\x70\x2b\x32\xf7\xc2\x00\x47\x72\x53\x52\x4c\xe5\xe5\x7a\xea\x84\x67\x28\xaf\xd6\x0f\x36\x42\x65\x20\x90\x04\x94\x4b\x9b\x96\x07\xe4\x75\xe8\xcd\x22\xbe\x5a\x52\xa5\x66\x64\x60\x73\x11\x15\xb6\x08\xa9\x7f\x37\x9b\xc1\xb5\x22\xd8\x5f\xe1\xca\x36\x6e\x89\x1d\xbe\xd4\x29\xec\x72\x02\x11\xa3\xcf\xa2\x64\xaf\xe1\xbb\x64\x89\x88\xd9\xeb\x12\x83\xe6\xd8\xc5\xa2\x06\x4c\x71\x8b\x13\xa0\x9e\x79\x4a\xe7\x13\x81\x6e\xd0\xf8\x11\xb7\x3c\x34\x4e\x1d\x6a\x78\x2a\x84\xcb\xe5\x33\xba\x58\xa5\x85\x2d\x70\x7b\xbd\x32\x27\xb6\xe0\xc7\x42\x38\x55\xfb\xac\x9f\x54\x98\xcc\x8b\x2d\xb5\x59\x0b\x25\x52\xe1\x8f\x74\xcc\x85\xc7\xa7\xe1\x68\x14\x80\x2d\xf3\x0d\xca\x8f\xce\x92\x55\x4a\xdb\x6d\x3b\x92\x8f\x44\xa5\xf1\x25\x71\xb8\x5c\xbe\x0d\x93\x88\x45\x7f\x8a\x25\x41\xd9\x50\xa6\x2c\x0c\x35\xd9\x32\x06\xab\x97\x93\xa9\xac\xd9\x34\x9d\x73\xd1\x50\x4e\x21\xd3\x39\xc2\x95\x34\xa9\x40\xc3\x76\x6d\x24\xfd\x79\x83\x24\x47\xc0\xbf\xd5\x56\xd7\x2d\x77\x5b\x84\x59\x7c\x4f\x61\x16\xc2\xc8\x8e\x37\x1b\x3b\xde\x21\xc5\x42\x84\x70\xec\x24\xab\xe4\x44\xb3\x94\xc6\x2c\x9b\x26\xf3\x66\x63\x21\xb4\x38\xda\x62\x48\x34\x97\x68\x6a\xe9\xbc\x0d\xb6\xe5\x56\xd6\xb9\xa7\x76\xc7\x6b\x11\xc2\x9c\x92\xb5\x43\x0d\x66\xe6\x94\x17\x0b\x13\xbe\x12\xa9\xa4\xf1\x55\x10\xd3\xf2\x32\xef\xa4\x37\x1f\x3b\x3c\xa5\x54\x60\xfe\x2b\xd8\x05\xef\x06\x1b\xef\x26\x4e\x79\x0f\x75\x4a\x39\x67\x3c\x30\x07\xe7\x1c\x69\x49\x78\x60\xce\x71\xc7\x23\x5c\x34\x29\xb7\x67\x8a\xda\x6d\x69\x28\x48\xa5\x44\xbd\xab\x6b\x59\xba\x8a\x39\xe1\x04\x4f\x3f\x00\x9a\xac\xf3\xbb\x19\xc7\x80\x9f\x16\xb4\x2e\x56\x70\x63\x58\xc1\xcd\x49\xcb\xcd\x51\x0e\x72\x51\x8f\x02\x1c\x4a\x85\x22\x5c\x2e\x8f\x92\x64\xc5\xa0\x06\x7b\xdb\xa0\x58\xab\x49\x45\xac\x19\x29\x56\xef\xb0\xa4\x4c\x71\xa8\x8b\xe0\xb3\x8e\x31\x1a\x71\x94\x1d\x65\xb7\xc9\x22\x08\x71\x94\xe9\x7d\x14\x43\x75\x6a\x11\x12\x49\xec\x94\x6e\x24\x16\x2f\xe6\x88\x7d\xad\x66\x44\xf0\x9c\x2f\x99\xbf\xb1\x18\xff\x0c\x9b\xd3\x5e\x40\x31\x4d\x58\xc4\x6e\x83\x14\xd4\xee\xef\x4c\x6c\x93\x49\x02\xf2\x4e\xd9\xfd\x04\xe4\x77\xc2\x3b\x22\x85\xcf\x95\x24\x09\xb8\xa4\xa7\xe1\x55\x2c\xfc\x78\x00\xac\x94\x20\x81\xc4\x60\x91\x7b\x01\x49\xbb\x9d\x80\x97\x00\x58\xf2\xe9\x64\x5d\x3c\x07\xe6\x87\x5c\xad\xb2\x41\x74\x35\x4d\xc9\x72\x80\xae\x95\x00\x32\x1a\x5c\x74\x5f\x16\x4c\xe7\xb8\xd0\x14\xf8\xdb\x16\x06\x0a\xd6\x6a\xe2\x08\xd6\xcd\x12\x28\x58\xe7\x35\x17\x06\x9e\x54\x70\x5d\xb0\xce\x73\x0c\xd3\xd9\x5f\x2d\xc3\x98\x67\xfe\x5a\x51\x39\x2e\x26\x08\xfe\x3e\x6e\xd6\x7f\x85\xf9\x1b\x61\x9a\x9b\x6c\x05\xfc\x06\x06\x48\x21\x2d\x1e\xa0\x34\x8f\xa3\x92\x82\x27\x06\xca\xe9\xca\x8e\xb8\xbe\x91\xa2\xc0\x8e\x76\x4c\x11\x4c\x7a\x96\x35\x64\x46\x28\xaf\xa6\x16\x58\x0a\xe3\xa1\x9a\x57\xcd\x66\xa0\x71\x34\x51\x4a\x8a\x18\x68\xc5\xd8\xc1\x14\x05\xcc\x54\x27\x15\x31\xa2\x76\x9b\x3a\x72\x19\xf2\x2d\xbd\xb9\xca\x60\x9e\x37\x13\x48\xf9\x3b\xe0\x66\xc8\x8e\xc2\x75\xb0\x4c\xd5\x75\x69\x64\xbe\x15\xee\x55\xd4\x31\x25\x48\xce\x27\xaa\xf1\x03\xf4\x7a\x43\xb1\xdf\x6c\xec\x74\x27\x75\x51\xa1\x3e\x9b\x63\xa5\xe0\x02\x47\x08\x2b\xde\x7e\x79\x8e\xa9\x91\x07\xd5\x9e\x53\xd3\xfc\x7b\x47\xce\xb1\xc2\x4f\xec\x62\x17\x23\xd2\x4e\x71\x99\x12\x98\xa1\x3c\x3a\xb5\x1b\x70\x2a\x19\x5e\x0b\x5c\x9a\xec\xb1\xcd\x79\x2a\x35\x3d\x10\x29\xe5\x3d\x78\x5c\x34\x50\x35\x3e\xc5\x14\xfc\x66\x1b\x3e\x09\x9e\x28\x5a\x01\xce\x78\xe5\xc9\x82\x90\x23\x27\x4c\x96\x9b\x4d\xd3\x87\x55\xda\x9c\x9e\xac\xd8\x44\x1e\xab\xfa\x9d\xde\x1a\xf4\x2f\x34\xf7\x42\xf1\x49\xc9\x93\xb5\xde\xf9\xd7\x27\xe6\x1a\xb2\x4c\xd3\xb9\x1c\x35\x19\x65\xaf\x56\x67\xd1\x82\xb7\x44\x37\x8a\x2f\xc4\x70\x73\x36\xe7\x34\xa2\xf1\x12\x68\x55\xa1\x72\x8e\x82\x9d\x25\x56\x5b\x57\x54\xb0\xb5\x48\x20\x76\x73\x61\x62\xb5\xce\x60\xf1\x45\x8e\x1c\x69\xeb\xdc\x6c\xe0\xcd\x30\xb7\xd5\x53\xa4\x29\x4d\x7e\x50\x06\xb6\xca\x6b\x19\x48\x5b\xd6\xe4\xbb\x30\xa0\xc9\x17\x69\x74\x51\x6f\xc2\xe0\x22\xdf\x0a\x4b\x62\xbb\xcd\xc7\xaf\xca\xf0\x2c\x64\x46\x06\xfe\x86\xda\xed\x14\x15\x7d\x72\x5c\xf2\xc9\xb8\x02\xb1\x06\xbd\x12\x55\x19\xd0\xfc\x0c\xab\x57\x3e\xa8\x50\xd9\x2c\x3f\x31\xcd\xf3\x81\x65\x8d\x95\xf1\xfc\xb1\x3f\xb1\x99\x53\x77\x00\x89\x56\x70\xa4\x32\xdb\x6c\x76\x7e\x06\xdd\x6d\x17\x80\xd0\x63\xef\x80\x80\x15\x0f\xd7\x40\xef\x80\xd3\xea\x29\x10\xea\x0e\x58\xa9\xbc\x4a\x9e\x6c\x1a\xfb\x9c\x9a\xd3\x75\x79\x2f\xd4\x6b\xdc\x6d\x32\x76\x1d\xbc\x39\x4e\x29\xf0\xc2\x42\xaf\xf0\x83\x34\x9f\x23\x58\x15\x36\xd4\x01\x5d\x22\x4e\x39\xfc\x35\x32\xa7\xa5\x51\x9e\x6a\x25\xb8\xdd\x6e\xa5\xd5\xc5\xcc\x6e\x8a\x17\x79\xef\xec\x1c\x03\xf4\x7e\xbd\x64\x64\x28\xad\x26\xee\x9d\x49\xce\x55\x28\x30\x5b\x58\x6d\x60\x95\x9c\x6f\xf4\xd7\x1a\x29\x8d\x4f\xd0\x82\xd4\xa9\xf5\x1f\xa1\x78\x5b\x16\xcd\x46\x7c\xad\xbd\x88\x69\x98\x16\xab\x7a\xbd\x94\x7c\xd8\x34\x4e\xd5\x8c\x56\xc9\x57\x50\x6b\x5c\xf9\x22\xf7\xf0\x18\xf6\x50\x9e\x57\x15\x20\x6d\xf8\xbc\xc3\x8a\xa7\xcd\x4e\x79\x45\x4f\x12\x13\x97\x53\x5d\x3c\x10\x5a\x4b\xc2\xac\xb4\x0e\xe0\x10\xc6\x6b\x9e\xe3\x57\x64\x2d\xb6\x91\x0e\x7e\x9e\x86\x9d\x3f\x8f\x3a\x3f\xcd\xf7\x1f\x1d\x88\xcd\xa4\xe7\x37\x11\xcb\x82\x03\x95\x2e\x53\x7f\x8c\xd8\xf9\xdb\xcb\x70\x41\x8b\x2c\xb3\x0c\x32\x5d\x84\x8b\x97\xcb\xe0\xe0\x67\x7b\xea\x76\x46\x61\xe7\xf4\xa8\xf3\xe5\xdc\x78\x0c\xd0\xba\x9f\x6f\xf9\x86\x1e\x1d\xe0\x55\x12\xdf\x3e\x83\x0d\x9e\x83\x9f\xf9\x27\x28\x33\xca\x20\x49\xa1\xc2\x93\x0f\x8c\xcd\x2a\x40\x6e\x7e\x60\x6c\x4f\x1d\x4c\x05\xae\xd9\x25\x5d\x44\x61\x7c\x7c\x1e\xa6\xe1\x82\xd1\x34\x38\x98\xfe\xfa\x7f\xad\x7f\xfd\xcf\xa3\xcf\x7e\x6e\x7f\x61\xa3\x5f\x36\xfb\xb3\x0e\x99\x8c\x83\xcf\x2d\xec\x3c\x7e\x32\x5b\xcf\xf2\xd9\x74\x36\x9f\xcd\x66\x07\xf3\x83\xb3\x08\x87\xcb\x6b\xde\x93\xcb\xe7\xb0\x73\xa6\x5b\xea\x76\x46\x4e\xeb\x7f\x1e\x7d\xd6\xfe\xfc\x8b\xfd\x03\x32\xf9\xf9\x97\x5f\xd7\x9b\xfc\xff\x3a\xf3\xfd\x7f\x15\x00\x73\x7b\x12\x14\x6f\x9d\xf9\xda\xc5\x03\x2f\x37\xbe\xa3\x89\x3d\x09\x66\xce\x83\x72\xa0\x2f\x1e\x1d\xe0\x0f\x61\x16\x2d\x14\x46\xb6\x3d\xfd\xf9\xf1\x13\x1b\x09\xb4\x1d\x8c\x83\x59\xf6\x2f\x6b\xbe\x6f\xcf\x9c\xf2\x87\xb1\xfc\x80\xbe\x40\x1b\xdb\x72\xf6\x2d\x84\xfe\x65\xdb\xb3\x29\x10\x73\xed\xe1\x6e\x3e\x73\xee\x7e\x9e\xa3\x8d\x6d\xab\xfe\xee\x40\xf7\xcc\x1c\xb4\xaf\x98\x63\xed\xe3\x1c\x21\xc5\x39\x6a\x1b\x52\x74\x64\x95\xaf\xe4\xd7\x12\x23\x69\x30\xc9\x4b\x7a\x8f\xf2\xe0\xe7\xff\x99\x00\xd3\x70\x36\x59\x77\xf3\x8d\x7e\x1e\xe4\xe8\xd1\x41\x84\x85\x63\xe8\x8b\x7b\xc3\x9f\xc6\xab\x90\xb3\x18\xa7\x79\x67\x7f\xce\xfb\x42\x70\x1b\x52\xfd\xc2\xdf\xbe\x80\x97\x29\x7d\x3e\x9f\xce\xf6\x67\x9d\x32\xd8\xa3\x03\xbc\xa4\x8b\xe8\x22\x04\xce\x80\x42\xc4\xb7\x8d\xcc\xbd\xbf\x99\x4a\x0a\xc9\x3c\xa2\x45\xe1\xb3\x22\x97\xc4\x6a\x9f\xa3\x04\x9b\x46\x80\x91\x3d\x09\xba\x9e\x3d\x3b\xd8\x74\x36\x33\x07\xd9\x93\xc0\x9d\x4c\xbd\x6e\x7f\x78\x38\xdf\x78\x53\xd7\x9f\x23\x34\xf3\x36\x02\xce\x1f\x6d\xba\x2e\xaa\xc2\xe2\x6e\x67\x04\xb0\x1d\x7f\x8e\x66\x3e\x42\x02\xd8\x9b\x0e\x78\xfa\xd4\xef\x8c\xe6\xb3\x25\x9a\xcc\x96\x6b\x3f\x47\x8f\x36\x3f\x43\x41\xba\x10\x77\xe2\xcf\xba\x22\x47\x43\x26\x5e\xc5\xb4\x77\xc8\x53\x7a\x83\xc3\xf9\xd4\x85\x67\x8e\xde\x68\x3e\xf5\x07\x9c\x43\x44\xbe\x41\x19\xa2\x00\x70\x5d\x84\x90\xac\x96\x63\x0b\xb8\xce\x96\x1b\x7f\xea\x76\x0e\xe7\xa5\xc6\x14\x10\x50\xac\x6c\x11\x9a\xf5\x76\x36\xe8\x40\x6c\xfe\x82\x0c\xf2\xe6\x13\xa0\x3e\x94\xde\x9d\x23\xde\x7f\x7d\x10\x3a\x73\x09\x07\x1c\x48\xf9\x34\x92\xdd\x99\xa5\x9c\xfb\x2a\x85\x21\x78\xce\xd8\x65\x36\x09\x66\x07\xb3\x03\x7b\x12\x7c\xfc\xf8\x71\xe6\x6c\xec\x49\xeb\xe3\xc7\x8f\x1c\xe9\x96\xe0\x68\x84\x8c\x91\x6c\x0e\xf3\x2f\x8c\x74\x3e\x68\x67\x19\x0c\xa3\x0d\x94\xf3\xc0\x3c\x0f\xc7\x64\x57\x8d\xc6\x37\x4e\xd3\x78\xb5\x08\xe3\xf3\x55\xc6\x7e\xa8\x35\x5b\x7f\x9a\x05\x36\xf4\x96\x90\x18\x2e\xe6\x23\xcf\x53\x14\x5b\xf7\xf2\xcd\x60\xea\x76\x7a\xf2\xb5\x9b\x6f\x06\x7d\xe3\xdd\xe7\xef\x7d\xe8\x62\x41\xff\x41\xbf\xdf\x05\x82\xa3\x8d\x51\xc3\x3f\x55\x45\x73\x7b\xfe\xa1\xda\x38\x41\xa3\x84\xd1\x34\x4c\x68\x03\x41\xb7\xf4\xfb\xbe\x39\x1b\x70\x41\x0a\xbb\xf7\x07\x3f\x4f\x67\x37\xae\xdb\x99\xdd\x0c\x41\x94\xe8\x6d\xfc\x83\x9f\xf9\x53\x00\x02\x7b\xbe\x2f\x4a\xe5\xe5\xec\x3b\xf3\x7d\x7b\xac\xde\x60\x2a\xfb\x62\xdf\x59\xe7\x9b\xff\xfb\x75\xbe\x4f\xb6\xa4\x23\x2e\x0c\xc7\x1f\xc2\x8c\x0e\x7a\x68\x82\x6d\x09\xd6\x7a\xd4\xfe\x1c\xdb\xe8\x8b\xfd\x31\x99\x75\x9c\x5f\xfe\x2f\xf8\xd7\xec\x60\xf2\xd9\x2c\x9b\x7f\x31\x01\x41\x1b\x83\x98\x9d\xd9\x93\xe9\x3e\x97\x9f\x23\xd7\x9e\x39\xee\x3e\x9a\x70\x32\x1e\xce\x27\xb3\xa5\x3d\x73\x66\xcb\x7d\x34\x11\x2c\x96\x9c\x71\xe8\x4c\x42\x7b\x87\x1a\x9c\x0f\xfd\xe1\xbc\x00\xdf\xcc\x96\x6b\x0f\xfb\xb9\xce\x3e\x03\x89\x1c\x5d\x9e\xf4\x38\x2d\xe1\x6b\x37\x47\x33\xe7\x8e\x47\x91\x67\x00\x53\x29\xcc\xbf\x5c\x13\x99\x2d\xf9\x74\xd7\xcb\x03\xb4\x1e\xe6\xf5\xe4\x4d\x00\xd2\xa8\x0e\x3c\xc8\xa5\x54\xee\x43\x2f\x83\x00\xe9\xcd\x67\x4b\x2e\xde\x66\xcb\x0d\x70\xd2\x6c\xb9\x99\x2d\x11\xcc\x31\xf7\x82\x44\x9c\xad\xee\x8d\x41\x9f\x63\xf0\x8f\xa0\x60\x57\x6b\x43\x40\xff\xad\x98\xf4\x80\x16\xf5\x4c\x2e\xf6\xf2\xff\x1c\x82\xdd\xed\x08\x76\xb7\x22\xe8\xff\x07\x11\xdc\xd1\x97\xfe\x56\x04\xbb\xff\x41\x04\xfb\xdb\x11\xf4\xb6\x22\xd8\xfb\x0f\x22\x38\x50\x08\x06\x7c\x04\x37\x61\xd3\xff\x87\xb0\x69\xaa\xcd\xc3\x43\x8e\x0f\x42\xf6\x67\x86\xd6\xbb\xf6\x70\x0e\xf2\x69\x11\x2d\x53\x21\xa1\xba\x30\x2f\x6c\xa6\x9e\x2f\xd5\x0d\xa4\x3e\x83\x30\xf2\x84\x36\xc4\xe5\x9e\x27\x67\x0f\xa8\xdf\x80\x05\xf7\x23\xa5\x44\xfe\x34\x5f\x8f\xf2\x47\x07\xc2\x0d\xe9\xe0\xe7\xe9\x57\xdf\xbf\x7c\x16\xcc\xbf\xb0\xf5\x57\x3f\x47\xd3\x0e\x97\xcb\x45\x52\xbf\x9e\xe4\xb9\x0d\x69\x5c\x4a\x9e\xe5\xf8\x86\x08\x87\xc2\x0f\x94\x59\xf8\x27\x62\xf8\xeb\x3d\x27\xa6\xbf\xe0\x4b\x62\x7a\x07\xbe\x23\x56\x75\x15\x66\xe1\x37\xc4\x74\xb0\xfc\x9d\x18\x8e\x95\xf2\x3c\xd2\x77\xea\x3c\x52\x94\xc1\xb2\xaf\xb4\x66\x16\x7b\x80\xca\xd9\x9c\xea\xd3\x23\x72\xff\xae\x04\x4b\x1d\x46\x33\x11\xa3\x40\x01\x7d\xbb\x62\x4f\xe3\x30\xf9\x5d\xbb\x73\x2b\xd0\x89\xcb\x17\xfc\x9b\x8d\x2c\xbf\xdd\xb6\xac\x16\x21\xd2\x4f\x98\x21\x75\x9e\xa4\x11\x8a\x55\x90\xf8\x4e\xfa\x75\x9a\x0e\x41\x2d\x0f\x47\xc4\xe2\x70\x57\x99\x85\x13\x79\x2a\xc6\x39\xa3\xcc\x08\x85\x06\xbe\x27\x36\x2b\x0e\x65\x84\x7b\xab\xd3\xbd\x04\xad\xb3\x8f\x11\x6f\x6e\x88\xd6\x8b\x30\xa3\x7b\x37\x41\x4a\xbe\x73\x14\x79\x28\x7e\xe5\x14\xeb\x75\x84\x23\x72\x33\xfe\x90\xd2\xf0\xf7\x31\x07\x96\xce\x92\x32\x87\x20\x12\xcf\x61\x2e\xac\x79\x1e\x09\x67\xe4\xdc\xfb\x29\x48\x49\xc7\x6b\x11\xaa\x0d\x1d\x6c\xfa\xd3\x9c\x03\xff\x64\x82\x3d\xaf\x95\xad\x39\x82\xc3\x3e\x37\x61\x5f\xd6\x60\x35\xbf\x70\xd8\x97\x26\xec\xbb\x5a\x2b\xab\xdc\xc4\xb3\xbc\x33\xb3\xbc\x09\x52\xed\xe3\xfe\x84\xb0\x69\x38\xc7\x11\x79\x63\x42\xfc\x6e\x40\x3c\x56\x10\xbf\xe7\xd1\xa9\xdd\x4a\x11\xc0\xc9\xb3\x00\x6b\x89\x64\x90\xe2\xdf\xa9\xd8\x9b\x8d\xf2\xa2\xa3\x7f\xa2\xa9\x19\x1f\xca\x35\xb8\x60\xb1\xba\xb8\x08\xbf\xa7\x67\xf4\xc6\x36\x0f\x47\x2a\x1f\x72\x0b\x5b\x70\xd2\x27\x87\xb0\x51\xdf\xca\x13\x97\x82\xf5\x99\x62\xfd\x8c\x32\x9b\xa2\xb5\xb0\x9a\xfd\x96\xad\x12\x42\xcd\x83\x52\xca\x22\x95\x42\x18\x0a\x00\x40\x4d\x5e\xdd\x65\x3f\x32\x14\x9d\xda\x29\x49\x27\xe9\x94\xce\x03\x91\x0b\x7c\x87\xca\x0d\xdf\x4b\xf3\xbc\x88\xd6\xe6\x1d\x26\x64\x9d\x63\xe6\x88\x73\x8a\xe2\x19\x10\x82\xa7\xf0\x8a\xad\x94\x79\xed\xbb\xab\xec\x1c\x22\x3c\xe5\xc8\x46\x45\x18\xad\xef\x0b\x32\x59\x53\x61\x13\xdc\x93\x27\x9d\x2d\xa2\x8e\x87\x15\x67\x5a\xb5\x77\xbe\x38\x2f\xc6\x50\xae\x4b\x7a\x66\x6c\x35\xe7\xbc\xe5\xf5\xa0\x0f\x2d\xbb\x7e\x0e\x63\xb3\x51\x87\x2c\x4b\x69\x6a\xcf\xc5\x4c\x64\x7b\xca\x84\xb7\x3a\xdd\x03\x13\x7f\x6e\x33\x54\x78\x97\xa5\x7b\x51\xb2\xc7\x38\x1d\xad\xd3\x55\x7a\xf1\x55\xba\xba\xba\xb4\x5a\x24\xe5\x29\xe0\xec\xec\x44\x19\xfc\xda\x6c\x9a\xce\x11\x5a\x53\xe1\x1d\x54\x3e\x65\x05\xdf\xbe\xb7\x23\x34\xa1\xda\x51\xe8\x99\x1d\x21\x14\x14\xef\xca\x2b\x0e\x0a\x50\x47\x48\xf5\xf6\x10\x03\x97\x0d\xfe\xd7\xc0\x57\xf0\x17\x1c\x7f\x0b\x9e\x09\x04\x8a\xd3\x6e\xaa\x47\x0b\x6a\x7e\x29\xc4\x53\xa9\x69\xb4\xde\x10\x2a\x1a\x22\x6a\x84\x52\xc1\x67\xa5\xec\xb0\xc8\x61\x58\xb9\x2d\x32\xd2\xc8\x83\xd1\xe7\x65\x05\x5f\x42\x45\x98\x9a\x6d\x30\x50\xff\xad\x2c\x59\xc7\x85\xf3\x1f\xb4\x61\xdd\xd0\x1b\xd1\x1c\x21\x05\x26\xce\xa1\xf2\x34\xf3\x28\x6a\x4a\x7e\x03\xb8\x69\xc2\x2b\x86\x5f\x71\xbc\x61\x2f\x6d\x6a\x41\x04\x2d\x88\x1a\x3b\x20\x9a\xb7\x08\x2f\x22\x10\x25\x42\x71\x48\x38\x7a\x56\x46\x1a\x6f\xc2\x57\xcd\x22\x80\xad\xbe\xce\x56\x89\xad\x76\xcd\x9c\x8c\xb2\xd7\x62\x83\xdb\x16\xbb\xd1\x09\x0e\xf9\x60\x56\xdb\xde\x01\x9f\x94\xc6\xad\xb0\xdd\x4e\xdb\x6d\x9d\xfa\x0d\xbd\x6d\xb7\xed\x84\x98\x09\x22\x7b\x4c\xc2\xcd\xc6\xfe\xb6\xdd\xfe\x16\xc6\xb3\xfa\x35\xb6\x0e\x65\x75\xdb\xbf\x4c\x93\xcd\x86\xce\x27\xbb\x3f\x07\x96\x85\xc6\xc5\xf9\x24\x1d\xe5\xaa\x3a\xd4\xb8\xa8\xd3\x0e\x03\x3c\x41\x4f\xbe\x08\xc7\x24\x2e\xce\x9f\xac\xd7\x8f\xd6\x34\xcf\xf3\x5f\x31\x83\xb3\x1e\x46\x6b\xa5\x6b\x80\xb9\xf9\x5a\xfe\x56\x76\x38\xab\x15\xcb\xa0\xd8\x72\x96\x29\x9b\xa3\x5c\x90\x2c\x23\xc5\x69\x78\xd8\x05\x5b\x2b\xda\xc7\x38\xa5\xa7\x60\x53\xcf\x82\x28\x17\x38\x45\xd9\xd1\x72\xf9\xda\xec\x86\xcc\xe8\x04\x92\x20\x9c\x29\x91\xce\xbb\xce\x2e\xe9\x38\x86\xb0\x57\xea\x84\xee\x7d\xb9\x19\x51\x9c\x1f\x51\x38\xfd\xb5\xce\x64\x3b\x7a\x92\xf1\x6e\xcc\x8b\xc9\xa9\xc0\xe5\x5b\x98\x23\x78\xb1\xfc\xb7\xa9\x42\xe6\xc4\x61\x72\x76\x15\x9e\xd1\x16\x21\x12\x4c\xa5\xb4\xdb\xb6\xa8\x93\xb3\xa2\x9a\x57\x10\xde\x86\x07\xd9\x56\x8b\x8d\x70\x51\x4d\xb5\x12\x73\xe6\x2c\x31\x96\x9c\x4c\xea\x64\xfb\x10\x66\xf4\x58\xfa\x04\xd4\x92\x9c\x8c\x5e\x8a\xe8\xaa\x93\x1d\xdf\x02\xeb\xc0\xc2\xe9\x83\xcb\x5e\x86\x8c\x7e\xb9\x4a\x2f\x42\xd6\x50\x78\xf1\x31\xb0\x2e\x96\xb7\xd6\xb8\x5e\x3a\x58\x96\x92\x50\xec\x8a\x45\x7f\xc2\xc3\xce\x8f\x46\xa1\xbb\xe1\x74\xcb\x60\xff\xfe\x5e\x90\xbc\xfd\xf7\xaa\x59\xf9\x40\x5a\x5c\x35\x06\xad\xf8\xcb\xab\x38\x7e\x4f\xc3\xd4\x46\xe6\x71\xbd\x50\x6b\xe4\x1c\xe6\xf5\x2a\x61\xe7\x36\xda\xf7\xb8\x80\x30\x3f\x3c\x0b\x6f\x6d\x84\xc6\x52\x6b\x4e\x85\xd6\x6c\xdd\x5e\x2c\xad\x80\xd7\xe1\x2c\x56\xc9\x22\x64\x76\x82\x29\x0e\x31\xc5\x31\x2a\xe9\xcb\x17\xb7\x65\xb0\x58\x82\x25\x25\x30\x4e\xff\x12\x18\x94\x04\x60\x4a\xbc\x47\x86\x22\xa5\x79\xd3\xb2\xa4\x82\x24\x0e\xa8\xfd\x49\x8c\x93\x52\x72\x01\xf4\x74\x0f\x8e\xd4\x2c\xb3\xbd\xd0\x79\x43\xab\xf1\x44\x95\xdb\x61\x76\x75\x49\x53\x39\x3d\x48\x1f\x2d\x5e\x88\x90\x7d\x2a\xa2\x16\x24\xc9\x00\xc4\x89\x0c\x05\x19\x65\xaf\x57\xcb\xe8\x34\x32\xe2\x71\xfe\x72\xa1\x52\xd4\xc1\x8d\x45\xbc\x4a\xa8\xf2\x75\x14\xc1\x32\x8b\x7c\xd5\x30\x99\xc5\x97\x5c\x1c\xc3\xc3\x94\xac\x41\xfc\x51\xed\xf4\x14\xb4\xbc\xbc\x74\x3a\x22\x5d\xad\xd8\xb8\x8a\x37\x97\x16\xa5\x70\x15\xe0\x93\x53\x29\x6a\x52\xcd\x35\xad\x26\xc8\x79\x7d\x4e\x2a\xa5\x05\x35\x40\x79\xb2\xb6\x04\x85\x10\x06\xe2\xaa\x33\x85\x38\x9d\x2e\xe6\x5c\xa2\x57\x63\x7d\xa8\x38\x79\x10\x4e\x43\xbd\x2c\xce\xe9\xe2\x77\xc3\x9f\x00\xe5\xf2\xf3\xba\xf8\x2c\xc8\xb5\x90\x00\xaa\x90\x94\x26\x4c\xba\x93\x88\x97\xe9\x87\xb9\xcd\xb9\x29\xa3\x8c\x8f\x13\x19\xd9\x0e\x88\x04\x2b\xb2\x27\xc4\xe5\xcf\x67\x5c\x0d\x15\x81\xd3\x90\x0c\xed\x26\xa2\x94\x4c\x25\xdc\xdc\x31\xca\x28\x81\x0b\x05\xa7\x88\xf2\xe1\x8e\xe9\x63\xd1\xa7\x5c\xec\xc0\x84\xa6\x74\x24\xba\xbf\xcf\xb5\x43\x7d\x6a\xa2\x5c\x13\x9d\xa3\x6a\x82\x51\xa9\x8c\x1f\x5d\x29\x79\x4a\xe7\xf2\x04\xe9\x9e\x6a\x16\xa7\xb8\x8a\x7b\x51\x9c\x2c\x37\x53\xed\x7a\x21\x72\xf7\x5d\xf9\x3e\xe7\x7c\x01\x06\x31\x57\x2b\xa0\xa6\x22\xce\x40\x11\x37\x31\x46\xcc\x51\x19\x71\x95\x04\x52\xad\x65\x2a\x10\xe3\xd8\xec\xf6\x3c\x85\xb8\x93\x47\x4c\xf1\xbd\x8a\x43\xb9\x93\xf3\xc1\x8f\xae\x06\x6b\x1c\x64\x21\x6c\x1c\x3d\xde\xc2\xd8\x1d\x6f\x1c\xed\xef\xa3\xda\x38\x88\xe6\xa4\x9e\xb6\xef\xcd\x6b\xe3\xcc\xb9\x5c\x5d\xda\x66\x34\x40\xf3\x9b\xe1\xbc\x30\x16\x03\xc1\x6c\xe1\x5f\x1e\x0e\xb5\x94\x75\x46\xd9\xbb\xe8\x82\xae\xae\x98\xd0\x84\xa5\x79\xa5\x22\xc0\xd4\xa1\x91\x22\xc5\x09\xe3\x78\xf5\xf1\x75\x78\x03\x9e\x40\xf2\xbb\x5c\xfd\xef\x86\x9d\x28\xa7\x2d\x08\xe4\x93\xd9\x5f\x39\x52\xdd\xfe\xb3\x26\x37\xf1\xd4\x28\xb6\xf6\xb5\x5c\xec\x5c\x39\x2f\x81\xe7\xb1\x3a\xe6\x22\x5e\xa6\x7f\xce\xdb\xed\x25\x8d\x29\x93\x24\xd7\xc9\xb9\xa4\x49\x59\x2a\xac\x55\x2c\x49\x53\x60\x37\x8f\xcd\x56\x79\x30\x2a\x5c\x5b\xd5\xec\x7a\x05\xc4\x88\x3b\x66\x8f\x9b\x32\xe9\x28\xca\x46\xa5\xbf\xd5\xc6\x1c\x53\xb3\x84\x16\x34\x73\x15\x87\xb2\x5e\xe9\x98\xed\xef\xa3\x71\x5e\x9e\x51\x76\x8d\x4d\xb0\x56\x30\xb4\x65\x10\x52\x84\xf2\x9c\x37\xe2\x07\xb9\x6e\x12\x53\x91\xcd\xc8\x0f\x9b\x8d\xfd\x03\xd7\x1f\xd1\x94\x39\x22\xaa\xd9\xb5\x3c\x40\x4a\xbc\x39\xb1\xca\x49\x16\x66\x53\xe6\x7c\x4b\xcf\x42\x03\xcc\x9f\x13\xab\x9c\x24\xc0\x9e\xae\xd8\x39\xe9\xce\x89\xc5\x1f\x2c\xfc\x03\xc4\x92\x82\x79\x1c\x3f\xaa\xa2\xf1\x68\xb3\xb1\x1f\x29\x34\x4e\x7a\x50\xf5\x49\x4f\x94\x73\x32\x80\x2a\x4e\x06\xe2\xf5\x28\xb9\x7d\x93\x50\x28\x58\x3c\x5a\xf8\x91\x51\xf4\x1f\xd5\xa2\xff\xd8\x6c\xec\x3f\x54\xd1\xdf\xae\x12\x4a\x5c\x8e\xf0\x8a\x67\xe4\xe5\xbd\x49\xde\x5e\x7d\xb8\x88\x18\xd4\xa9\x5e\xd4\xa7\x67\x51\xca\x6e\xa1\x7a\xf9\xac\x3e\xa8\x48\x9d\x5d\xf8\x24\xdf\x4a\xb9\xde\xa4\x0a\xa6\x57\x64\xd7\x89\x15\x50\x89\x42\xdf\x84\x2c\x63\x22\xf3\x69\xd0\x81\x59\x71\x01\xfc\x87\x41\x8a\x1f\xab\xa4\xf8\x71\xb3\xb1\x7f\x54\xa4\x38\x96\x7c\xf8\x26\x89\x6f\xa1\xed\x66\x82\xa8\xf5\x4b\x65\xaf\x11\x40\x9c\x0c\xe5\xa4\x02\x0c\x94\x31\x01\xd6\x95\x60\x45\x92\x00\x53\xe5\x1f\x25\xcb\x4a\xc1\x3d\xa3\xf6\xda\x57\x91\xf9\x99\xb8\x1f\x03\xbc\xd5\x20\x0f\x27\x55\x35\x51\x32\x48\x1c\x03\x75\x8e\xe2\xd8\xc2\x3f\x16\xf4\x90\x9a\xe2\xfb\xb5\xb9\x4c\xe4\x2a\x83\x18\x60\x3a\x10\x6e\xe1\x69\x06\x5f\x27\x86\x72\x51\x82\x94\x69\x48\x8c\xe2\x60\x9d\xe7\xd5\x82\x5f\x9b\x1a\xd2\xa7\x97\x7f\x51\x2b\xa6\x5c\xd9\xf7\xab\x15\xd3\x34\xdb\x5a\x43\x1d\x50\x55\x10\xb0\x1a\xe6\xb2\x37\x3e\x05\xdd\x52\x69\xbc\x36\x59\xd6\xb7\xe1\x05\x2d\xc5\xa7\x02\x33\xac\xcc\x54\x36\x16\xca\xd4\x42\xcd\x30\x40\x0b\xf9\x99\xce\x09\x61\x68\x4d\x49\x3a\x2e\x59\x88\x68\xad\x35\x9a\x1b\x1b\xda\xd3\x6e\xb7\x74\xd9\xa6\x79\x85\x2f\x23\x36\x9b\xa6\x2f\x4f\x91\x26\x68\xad\xf8\x82\x08\xf2\x29\xd7\x96\xa9\x57\xab\x8f\xe2\xe0\x4f\x71\x3d\x82\xb1\x55\x22\x3e\x1f\x87\x19\xb5\xd5\xc6\x49\x39\xc8\x97\xe8\x0e\xe3\xb4\x74\x25\x12\x49\xaa\xa3\x7e\xa8\x83\x24\x54\x47\x26\xab\x19\x92\x22\x71\x16\x51\xcd\x43\x39\xc2\x91\xa6\x5e\xe9\x43\x63\x4f\xde\x0f\x8d\x76\x9b\x2a\x6a\x54\x4f\xb6\x94\x58\x8c\xa2\x4f\xc4\x53\xf2\xa3\x7a\xe0\x25\xdb\x53\x36\xd7\x01\x4e\x24\xee\x0d\xac\xda\xc0\xd4\xe4\xfe\x6c\x1d\x65\xd2\x19\xcf\x2c\xa8\x73\x19\xa6\x19\xfd\x32\x5e\x85\x7c\xa6\xde\xf7\x9e\x10\x8d\x40\xb2\x62\xd2\xcd\xde\x24\x9c\x8c\xb5\x3d\xb1\xac\x80\xe1\x48\xbe\x52\xfe\x5a\xf4\x5b\xdd\xdc\x17\x55\x93\x26\xfb\x69\x8b\xec\x47\x41\xda\x22\x51\x61\x19\x03\xf4\xca\xfe\xd9\x6a\xf3\x43\x9a\x57\x84\x75\x7f\x52\xb1\x84\x80\x62\x26\x1d\xee\xde\xde\x5e\x7c\x58\xc5\x93\xad\x5f\x02\x55\x88\xb3\x2c\x25\x5b\x8e\x25\x2d\x13\x85\x4b\xaa\x32\x2b\x50\xdd\xce\x1f\x2a\xca\x46\x40\xe5\x3e\x5d\xed\x43\xc4\x89\xe4\x58\x84\xa4\x62\x0f\x91\x90\x74\x22\x4a\x9e\x39\xbc\x6c\xb9\xa7\x3b\xc3\xc6\x0b\xd4\x69\xec\x60\xfd\x50\xd1\x59\xb6\x15\xda\x99\x97\xcb\x95\xef\xb8\xfc\x5e\x2f\x9d\x6b\x38\x5b\xcb\xdc\xec\x8b\x6d\x68\xa3\x58\x9d\x84\x6b\x49\x3c\xa1\x30\x86\xe8\xed\x31\x71\xb5\x11\x35\x46\xa0\x3c\x03\xc1\x9c\x4a\xf8\x4a\x54\x4b\xe1\x92\x92\x8e\x75\xf8\xaf\x08\x76\x82\x20\x51\xdd\x66\x15\x66\x59\x74\xc6\xd9\x64\x5d\xc9\x1a\x44\x39\xd2\x53\x8d\xde\xa2\xfc\x31\x62\xe7\xef\xb8\x8c\x2a\x76\xa9\xea\x91\xbc\x58\xa3\x50\x0b\xee\x27\xf3\xa2\xac\xd0\x7a\xff\xca\x3e\x98\x2e\xae\x2a\xfe\x2b\x7b\x1d\x1a\x12\x34\xee\xaa\x98\x78\xef\x18\xf8\x4c\xde\x1b\xd9\x26\x53\xc7\x71\xd8\x3c\x28\xd3\x71\x9d\x63\x10\x18\x32\xa0\xd2\xd7\x44\x78\xce\xce\xf6\x3b\xf3\xc9\x6c\x09\xbe\x3e\x2d\x70\xbe\x9c\x7d\x10\xce\xa6\x9d\x89\x72\xdf\x94\xfe\x9d\xc2\x73\xd3\x9e\x04\x33\x8f\xe7\xf4\xfc\xf9\x6c\xb9\x91\x1f\xbb\x53\xd7\x9b\x23\x34\xd9\xfc\x28\xfc\x6b\xc1\xe7\xa2\xaf\x73\x74\x26\x53\xaf\x33\x9c\xa3\xc9\x86\x97\x27\xf3\xb8\xca\x1b\x43\x14\xb5\xf6\xf3\x4d\x57\xe4\xee\xf3\xd4\xc1\xd4\xeb\x0c\xe6\x08\x90\x99\xbe\x9b\x65\x73\xed\xcf\xca\xeb\x92\xce\xa6\x5d\x28\xde\x0e\x26\x48\x66\x43\x93\x8d\xdf\x9b\x05\x13\xd7\x85\x7c\x33\x07\xcf\x67\xcb\x7d\x7b\xd2\x0a\x10\x9a\x08\xc7\x60\x5f\x82\x1a\xdf\xe5\xa7\xe9\x9f\x3f\xcd\x37\x8a\x2a\xa8\x56\x53\x30\x29\xd0\xe3\x39\xf8\xbf\x47\x07\x52\x85\xfb\xf7\x3a\xca\x9e\xc9\xa0\xf8\x4a\x00\xd7\x65\x65\x2b\xca\xbe\x0d\xbf\x55\x06\x88\x37\xa7\xf2\x02\x1b\xb1\xcb\xac\xee\xd9\x52\x92\x89\x99\x06\x4f\x4a\xac\x9f\x95\xef\xf2\xba\x97\xa3\x8e\x2d\x3a\x64\xa3\xbc\x6b\x3b\x36\x74\x02\x50\x53\x78\x9b\xa8\x2f\x8f\xac\x9a\x5d\x14\x4a\xdb\x06\xdf\x50\xb4\xaa\xd8\xcf\xd1\x44\x3d\x95\x8b\x05\x3b\x2a\x14\x7b\x6f\xbc\xb6\x15\x9b\xd7\x37\xdb\xc5\x3d\x06\x82\x46\xa6\xc9\x52\xd3\xee\xbf\x62\x41\x9f\x30\x23\xcf\x66\x73\xbf\xb2\x83\xbf\xb0\x95\xd0\x58\x5f\xf3\xc6\x42\x19\x14\xba\x07\x58\x4d\xf0\x68\xf9\x14\x32\x4e\x70\x38\x56\x66\x0a\xcd\xc6\xea\x5e\x0d\x36\x06\xa8\x18\x67\x1c\xe6\x6b\xe5\x8c\x83\x8c\x5e\x92\x39\x14\xe3\xc6\xff\xe0\x56\x4c\x46\xe8\x66\xf3\x8f\xee\xc6\xe0\x56\xda\x6e\xff\xb7\x76\x64\xe2\x7b\xee\xc8\x08\x32\xdc\x6f\x53\x06\x67\xa6\x20\x99\x42\x77\xcf\xb5\x96\x1c\x23\xe7\x22\xbc\xb4\x19\x79\xb2\xcf\xea\x1b\x28\xd3\x10\x27\x38\xba\x07\x34\x8c\xff\x69\x82\xc3\xad\xd0\x79\x95\x61\x22\x9c\x74\x3c\x1c\xa2\x3c\x2f\x79\x7d\x45\xa7\x36\xe5\x8a\xba\x4c\x44\x5a\xb9\xd6\x50\xa0\xd5\xd7\xa7\xf7\x22\x2b\x68\x86\x2f\xdf\xbe\x11\x42\xb7\xca\xb2\x2d\x57\x9e\x02\xb7\x0e\x76\x6c\xb9\xde\x93\x61\xdb\x6d\x5b\xef\x8e\x35\x7d\x57\x9b\xa0\x7f\x81\x8f\x1a\xeb\xda\x0d\x89\x70\x97\x10\xdd\x0d\x29\x32\xac\x82\xa4\xb8\x00\x2f\xc5\x56\xc7\x88\x7c\x29\x5e\x85\x45\x50\x48\x5b\x8a\x34\xe9\xf2\x52\x94\x03\x25\x23\x72\xb1\x10\x3c\x8d\xce\x78\x82\xd6\x51\x54\xa0\x17\x98\xe5\x8a\xb8\xf3\xf0\xda\x10\x92\x5a\x7f\xb1\x69\xc9\x73\x40\xcd\x93\xd8\x14\x66\xb8\xe5\x22\x84\xa9\xa8\x19\x4e\x1e\x2b\x91\x56\x32\xce\x37\x22\x26\xd6\xf7\xfa\xcc\xb3\xf2\xb5\x7a\xef\x54\x17\x93\xe6\xb9\x68\x34\x86\x68\xd8\x0a\xc5\xb4\x8c\x62\xd4\x80\x22\x32\xc2\xf6\x16\xde\x2e\xdf\x98\x77\xda\x54\x1c\x0f\x35\xd0\xff\x96\x3c\x1f\x79\x96\x26\x7a\x4d\x58\x53\x54\x53\x6b\xfa\xc8\xda\xa7\xfb\xd6\x7c\xdf\xd2\x31\xa8\x03\xa3\x6c\xc6\xe4\xce\xd3\x37\xe0\x0c\x25\xef\xf4\x74\xc0\xea\x61\x2c\xc0\x8c\x7d\xe1\xbf\x73\x11\x86\xb0\x85\x2d\x88\x0a\x56\x6f\x4f\x85\x2f\xc1\xb5\xce\xb1\x10\xc2\x5c\xaf\x2d\x56\xb6\x4a\x14\x94\xd6\xb5\xb9\xe9\x6d\x21\x2f\x7c\x62\x64\xcd\x75\xf7\xa0\xe1\x36\xa1\x1d\x24\x95\xab\x01\x96\xe3\xf8\x13\x72\xeb\xf8\xb1\x3f\xcf\xb2\x7d\x11\xa0\x9b\x17\x95\xfe\x95\xa2\x66\xd9\xfe\xa3\xa2\xa8\x0f\x71\xb8\xf8\x3d\x8e\x32\x16\xfc\x2f\x9c\x96\xbb\x7c\xb5\xfa\x58\xb9\xe1\x46\x96\xcd\xb9\x08\x42\x90\xd1\x89\x35\x73\x3b\x33\x36\xbb\x9e\x9d\xce\x6e\x5c\xda\x99\xdd\x78\xa7\xb3\x9b\xe1\xa9\x15\xc0\x07\xf5\x86\x72\xcc\x56\x4f\x85\x27\x5d\x73\x91\x1c\xdd\x09\x9d\x58\x9e\x25\x5c\x67\x2d\x96\x5e\x51\x78\x0e\x2c\x17\x98\xb8\xdd\x96\xb7\x82\xca\x17\xf8\xe5\x78\xb3\xd5\xb3\xd5\xd5\x87\x98\x36\x51\x01\x78\x92\x83\x40\x77\x06\x8c\x61\xb6\x7a\x99\xb0\xed\x38\xb4\xdb\x65\x9e\x98\x00\x33\xbc\x4c\x60\x4f\x6b\xb3\xf1\x5c\x04\x0e\x54\xbc\x48\xb1\xee\xda\xd1\x1c\xbd\xee\xe3\x58\x7e\x3c\x8f\x18\x05\xea\xee\xa8\xfb\xbe\x43\xf1\xd7\xe9\xcf\x8f\xd6\x34\x9f\xef\xff\x6a\x8e\x44\x4e\x89\xfa\xad\x44\x22\x12\x35\xcf\xfc\xef\xf1\x1d\x95\x09\x77\xa4\x62\xae\x9c\x30\x92\x16\xc2\x52\xb5\x9c\x66\x8b\xf0\xb2\x91\xda\xd0\x6a\x83\xbf\xda\x9c\xb9\xda\xe1\xc5\xe5\xd8\x0c\x80\x6c\x41\xea\x1f\x57\x2b\x56\x4a\xfe\x1c\x92\xff\xe7\xc6\x1f\x96\x92\x1f\x43\x72\x5c\x86\x7d\x02\x89\x67\xe5\xc4\xd9\x81\x2a\xe1\xcb\x72\xfa\x4c\xa6\xf7\x8f\x4b\xe9\xbf\x8a\xe4\xd1\x60\x2c\xa8\x77\x99\xd2\xd3\xe8\x66\x47\x7f\xfe\xca\x69\xfe\x68\xcd\xf2\x5f\x39\x78\x76\x75\x7a\x27\x38\xcb\x21\xda\x32\x80\xcb\xa0\x3e\xcd\x19\xa8\x23\x62\xd7\x42\x68\xe2\xc2\x29\x36\x65\xe6\xc4\xf3\xda\x11\x11\x31\x71\x44\xe8\x84\x3a\xbf\xfc\x02\x56\x80\x5f\x7e\x09\x20\x28\xd6\x74\x8e\x8a\x24\x2e\x73\xa3\xe2\x55\xf9\x82\xb5\xbc\xf1\x72\x05\x26\x14\x62\x7c\x2d\xdf\xc4\x20\xd6\xf5\x58\xdd\x45\x26\x6b\xdd\x02\x8e\xc6\x29\xf9\xd2\x7e\x66\xa7\x08\x3f\x03\x17\xbc\xc8\x2c\x38\xcf\x3f\x9e\x47\x31\x35\xa4\x68\x5a\x4c\x17\x51\xa9\x6d\xd2\x9a\x20\xef\x5d\x35\x0c\x1c\x68\xcc\xd2\xdb\x35\x73\xc2\xcb\xcb\xf8\x56\x84\x69\x59\xc0\xc6\x71\x84\xd6\x29\xf9\x9e\x9e\xc6\x90\x4f\xa1\x24\xee\x2d\xd4\xb5\x89\xc5\x73\xc2\xca\xde\x31\xc2\x8a\xa4\x2d\xf0\x54\xb8\xeb\xf2\x79\x77\x4a\xe7\x84\x4d\xe9\x3c\x97\x39\x43\xb6\xe5\x9e\xde\xa5\x0a\x43\x05\xd1\x5c\xa4\x1b\x8d\x08\xb9\x25\x5d\x6b\x40\x85\xd0\x5b\x0f\xf7\xdc\x0a\x58\x9d\xee\x99\x5e\x89\xf5\x6d\x81\x87\xee\x0b\xfc\x49\xd3\x95\x0a\x59\xfe\x5d\xba\x5a\xd0\x2c\x2b\x87\x3a\x1f\x6b\x75\x43\x06\xd3\xd2\x61\x6f\x64\x2d\x18\xd8\x1e\x62\xdf\xb9\xbf\xe2\x96\x57\xf2\x8d\xd4\xce\x2f\xca\x35\x0b\x4a\x63\x10\x76\x13\x82\x5a\xc1\x0d\x1d\x98\x22\x9c\x90\xa8\x62\x37\x4f\x0c\xf3\xbd\x20\xcb\xfb\x86\x1d\x1b\xb4\x15\x41\xca\x31\x8b\x0a\xcc\xdc\x5d\x98\xc5\xe6\xf5\x20\x21\x71\xc7\xe1\x63\x1d\x39\xdd\x1f\x87\xfb\xfb\x8a\xdd\x93\x69\x38\x1f\xc7\x84\x17\xdd\x18\xcb\x1c\xaa\xe3\xf5\x95\x76\x0d\xd4\x7e\x78\x13\x9a\x26\x1c\x8e\x71\xcb\xc5\x6c\x0b\xa6\x98\x92\x12\x34\xca\x0b\x4e\x6e\xea\x21\xe1\xe5\x45\x2c\x4b\x30\xf4\xf4\x76\xae\x23\xbf\x32\x78\x2d\x05\x99\xab\xb1\x28\x1a\x57\x6c\x1d\xc7\xe5\xe0\x64\xaa\x9e\x44\xc6\xe4\x91\xc8\x4c\x21\xbe\xee\x16\x58\x13\x27\x81\xca\x74\x8e\x43\xc2\xb6\x46\x01\xac\x8f\xa6\xc6\x30\x86\x2a\xe0\x6e\xbb\x1d\x96\x62\xd4\x27\x32\x80\xe6\xa2\xe0\xb7\x20\x9a\x00\x63\x88\x48\xf7\x01\xc5\x8d\xf1\xac\x82\x07\xa2\xd4\x1c\xe2\x92\xce\x71\x94\x71\x8e\x0d\x52\x88\x28\x9f\xe4\x0d\xbc\xbf\x36\xc7\x7a\x65\x11\x51\x11\x10\x0a\x4a\x78\x81\x9b\xdd\x53\x2d\x57\x8d\x4e\xca\x59\x35\x95\x8d\x35\x6e\xa8\x58\x9c\x47\xf1\x52\xe6\x50\x8c\x53\x60\x2e\x4d\x34\xaa\x97\xe0\x82\x8a\x0a\x0b\xc9\xd9\xa6\xc2\x45\x68\x9c\x18\xbc\xbe\x83\x61\x5a\x2e\x4e\x4b\x6c\x1e\x15\x6c\x9e\xdc\x27\x14\x30\x21\x27\x45\xfe\x04\xee\xbe\xd0\x43\x43\x04\x3f\xdc\x35\xea\xea\xc0\x12\xa7\x89\x22\x97\x48\x16\x41\x3e\xd5\xf3\x36\x84\xa5\x8b\xd2\x6e\x8a\x36\xd5\xf8\x49\xd5\x41\x48\x1a\xbd\x1f\xb2\x4a\xe8\x0e\x01\xbe\x55\xde\x46\x5b\xa4\xa9\xc9\x53\x77\xb4\x28\xc2\xc2\x4d\x0e\xae\xbf\x67\xc4\x62\xca\x8f\x23\x63\xc4\xba\x4a\xd4\xab\xb4\x50\xaf\x98\xe1\x8f\xfa\xed\xcb\x66\x7f\x54\x1c\xe2\x18\xc6\x83\x70\x4b\x15\x7b\x3a\x0d\x93\x67\x24\xd2\x3e\x84\x99\xf4\x05\xd2\x6e\xa9\x45\x70\x44\x12\xcb\x24\xf0\x90\x92\x1e\xde\x45\x4c\xf1\x5f\x64\xeb\x80\x1f\x8a\xd4\x94\x9e\xca\xa6\x2a\xf7\x8b\xd2\x37\x59\x4c\xe3\xb7\x63\x75\x0b\x65\xfd\x6b\x94\x7d\x17\x66\x99\x49\xbd\xc2\x69\x76\x09\x0e\x35\xea\xf5\x43\xb8\xf8\xfd\x79\xb2\x14\x0e\x65\x44\xdd\x6a\xbf\x04\xb7\x0e\x91\xa8\xe3\xf7\xd4\x1c\x0c\x89\x0e\x7e\xcd\x26\x5c\x17\x0f\x4c\x29\xa2\xee\xcc\xdd\xee\xbe\x2b\x0f\xa8\x91\x50\x82\xe8\x8d\xaf\x8c\xd0\x62\x03\x2d\x93\x5f\xc3\xec\x36\x59\x9c\x98\x20\x95\x94\x06\xea\x3f\x8d\x92\x65\x94\x9c\xbd\x65\x69\xc8\xe8\xd9\x2d\xf9\x16\x64\x88\x95\xd2\x10\xae\x70\xe6\x68\x3a\x3b\xe0\x95\x75\xc8\xe8\x64\xe9\x1b\x67\xa4\x18\x02\xc3\x92\xeb\x3a\xbe\x84\xd1\x51\x90\x54\x0e\x4d\x35\xd3\xf4\x00\x36\x82\x2d\x06\x04\xa9\x00\xa8\x55\x5b\xb9\x10\x34\xee\x78\x2d\xc2\xf4\x11\x47\xae\xc4\x68\x27\xb8\xa2\x83\x0c\x23\x83\x63\xe1\x6d\x96\x0a\xe1\x2d\x59\xbe\x4e\xd9\xa8\x4a\xc4\x82\xda\x2b\xb1\xb5\xe9\xe8\x27\x4f\x87\x98\x51\x1d\xb7\x7f\x6b\xb7\x5b\xdb\x58\x14\xe9\xf9\x1c\x1c\x3c\x5d\xe9\xac\x5b\x1e\x4f\xda\xb4\x57\x77\x58\xcc\xb4\x97\xc6\xf3\x32\xaa\x52\xc8\xb4\xea\x59\x1a\xcb\x7e\xe2\xde\x55\xa0\x64\x8b\xe2\x80\x88\x62\xfc\x57\x32\xc5\x46\xf7\x2c\xa2\x54\x7f\x8d\xcc\xff\x20\x95\x05\x8d\xa5\x0b\x44\x0d\x95\x7f\x82\xbc\xff\x1d\xa2\xe6\xcd\xa2\x6c\x2d\x97\x35\xe2\x6b\x11\xa2\xec\x3c\xca\x64\x3c\xf9\xcc\xc2\x6b\xb5\xe9\xcf\xc5\x73\xd0\x72\x31\x97\x1e\x95\x43\x04\xc5\x91\xa0\x7b\xa3\xaf\x45\x9b\x1a\xb0\xa2\x3e\x52\xfe\x08\x9f\x50\xa9\x49\x59\x8e\x33\x6a\xb8\xa1\xaa\x7c\x79\x8e\xf2\x8a\xd4\x55\x36\xe9\xf1\x96\xcd\x76\xb0\x7a\xf2\xe9\xa2\xe9\x42\x33\xa4\x2c\xce\xf7\x3b\x3c\x21\xae\x97\x97\x52\xd8\xae\xed\x58\xea\x6f\x6f\x57\x57\xe9\x42\x89\x97\x42\xbe\x03\xee\x47\x65\x59\x7e\xdf\x52\x2a\x53\x00\xca\x9b\x20\x8b\xb2\x26\x55\x32\x28\xe7\x81\x29\xff\x3f\xcf\xb3\x52\x4b\x34\x9d\x8d\x89\x89\x95\x84\x65\x01\xc9\xb3\x56\xdb\xa0\xf3\x57\xa7\x2e\xa3\x90\x7a\x9e\xbc\x90\xc3\x7a\x75\xaf\xd6\xd7\x5c\xbd\x8d\x92\x33\xa2\xb7\x74\x14\x75\xd4\x25\x01\x4b\x6d\xfa\x87\x8d\x21\x98\xea\x15\x97\x15\xca\xcb\xd4\x9c\x7e\xe7\x84\x35\x68\x3c\x15\x90\xb4\x36\x47\x60\x75\x79\xff\x87\x48\x6a\x0f\xb6\x91\xa0\x55\x13\x95\x28\x2f\xfb\x34\xd6\x2a\xda\xd3\x3e\x8c\xb9\x9a\x08\xae\xf7\xb4\xdd\x6e\x51\x19\x5e\x59\x7a\xe8\xcb\x31\x93\xae\x56\x0c\xfc\xf7\xcd\xb7\xf2\x19\x14\x83\x3c\x5e\x5e\x78\xec\x09\x7c\x6b\xfc\x54\xa5\x98\x1c\x7b\x57\x14\xe5\x46\x8b\xd6\x5b\xe5\xab\xbd\x55\xd1\x6a\x6e\xef\x36\x49\x8d\xcd\x61\x7e\x87\x60\x33\xe5\x84\x14\x08\x15\x62\xeb\x29\x41\xc5\x82\x7f\x5e\xba\xbe\xa2\xb8\x00\xb1\x30\xb2\x6e\x83\x2e\x05\x8f\xdc\xd6\x1c\x7d\x11\x7a\xb5\x41\xe3\xad\xe5\x82\x49\x31\xa3\xec\xa9\xa9\x78\xf2\xb1\x52\x32\x34\x95\x6e\x7e\xab\x2b\xaa\xca\x2e\x76\x17\xdd\x44\x24\xcd\x5a\x55\xe5\x40\xc7\x65\xf3\x87\x79\xd6\xa1\x5c\x27\x9b\xcb\x63\x12\xcd\x3a\xf3\x76\x24\x2e\xc2\xf4\xf7\xa3\x4c\x3a\x8a\x57\xc2\x79\xca\x55\x8b\x3c\xb1\x52\x85\xc4\x6a\x1e\x91\x60\x8a\xff\xaf\x92\xe3\x22\x4a\xbb\x18\x29\x46\xdf\x4c\x63\x86\x33\x36\x57\x15\xff\xa0\x96\x46\x95\xaa\xf5\x92\xa9\x54\xb9\x09\xad\xab\xd7\xa0\xf7\x44\x20\x63\x38\x2e\x10\x00\x6f\xfa\x4a\xe5\x62\x19\x52\xaa\x59\x81\x95\xd7\x29\xae\x46\xe2\x17\x29\xce\xee\x85\x81\x05\xc0\x96\xc6\xe1\xbb\x34\xca\x58\x94\x54\xa3\xa9\x5e\xca\xe4\x12\x22\x06\xac\xae\x5c\x01\xde\xb7\x7a\x05\x6f\x60\x40\x61\x71\x51\x45\x40\xa4\x36\x13\x42\x57\x2e\x80\xee\x5d\xb7\x00\xe7\x55\xdf\x01\xcb\xc7\x42\xe9\x6c\xb9\x1a\xd7\x45\x1e\xa5\xd8\x34\xc8\xc0\x1a\xec\x94\xcd\x37\x9b\xd6\x6e\x78\x38\x33\x64\x8e\x10\xb5\xda\xb2\x91\x52\x90\x6a\x53\x4a\x21\x67\x8e\xeb\x88\x35\x7d\x03\x13\x68\xd3\x6c\x04\x57\xcc\x9e\xa6\x34\xd3\x27\x1b\xcf\xf4\xb1\xf0\xaa\x74\x93\x16\x2d\x73\x26\x34\xa7\x38\x33\x32\xbb\x58\x7f\xdb\xc5\xd5\x41\xd8\x6a\x58\xd9\x5b\x77\x65\x17\x17\x19\x89\xbc\x95\x95\xff\xdd\x79\xcd\x9b\x85\x44\x11\x35\x03\x81\x75\xe7\x6c\x6c\x90\x5e\x9c\xe0\x14\xa7\x03\x73\x49\x2c\x3d\xff\x17\xe7\x29\x27\xac\x69\xd9\x5f\x59\x42\x6a\x6d\x41\x5b\x1f\xb6\x1f\x77\x2c\xa6\xe2\x9a\x82\x90\x1b\xcf\xeb\x9a\x5d\xc1\x50\x15\x1b\x56\xb1\xad\xa6\xef\xf2\xf4\x97\xd1\xdd\xd5\x93\xac\xb5\x93\xad\x25\x76\xc8\x77\x70\xb3\xda\xe3\x72\xb5\x83\x63\x6d\x71\x52\xb1\x37\x48\xff\xeb\x3f\xf4\x81\xa8\xa0\xe4\x14\xef\x64\x90\xc8\xe8\xd2\x74\x7d\xfe\x43\x1d\x61\x52\xc0\x52\xb2\x56\x40\xe4\x9c\xa2\x80\x94\xe4\x6f\x2a\x48\x9f\x90\x2a\x97\xb8\xd9\xdc\x23\x67\x19\xef\x52\xc6\xbb\x1a\x51\x39\x48\x55\xc1\x74\x77\x21\x32\x3c\x74\xc0\xc9\x5d\x04\x8d\x69\x62\x73\xa9\x50\x0b\xcb\xa5\x31\xe2\x1b\xc7\x6b\xe9\x2e\xb0\x5d\x19\xab\x83\x15\x5b\x7a\x20\xdd\x91\xb3\x3e\x46\x45\x5e\x9d\x2e\xfc\x18\x1b\x44\x94\xb2\xe4\x6b\x1b\x79\xba\xd5\x46\xae\x57\x9a\x75\xa9\x4c\xd2\x6d\xfb\x0e\x42\xc5\xdc\xb1\xd3\x50\x13\xff\xf7\x29\xab\x90\xd0\xe6\x02\xa3\x2a\xe6\xef\x87\x9f\x21\xf1\xee\x46\xb3\x61\x96\x78\x40\xd9\x1a\xed\x5d\xb8\x2a\x2a\x37\xa9\xbd\xa4\xe5\x4a\x43\x5a\x6d\xad\x56\xd8\x71\x0a\xab\x62\xf9\x2e\xc5\xda\x57\x46\x28\x9b\x8a\x48\xeb\x73\xb8\xf0\x42\x58\x2a\x8c\xa8\x43\xdb\xe6\x89\x62\x51\xf9\x8b\xe4\x6d\x75\x25\x13\xf8\x64\x84\x5c\xe0\xd7\x56\x83\x82\x85\x41\xe9\x6e\xca\xe9\x34\xee\xea\x9e\x47\x59\xd3\xdc\x59\xcb\xdc\xb4\xa1\xc0\xf3\xfe\xfa\x68\x6d\x66\x17\x3b\x9d\x5e\x79\x93\x42\xa2\xa5\xed\x16\xf9\x56\x25\x9c\x13\xf9\xd3\x35\x13\x29\x7d\x9a\xcc\x69\xeb\xba\x58\x2f\x0c\xf1\x62\x95\x56\x5e\x6d\x14\xe9\xb5\x7b\xe4\x0c\x11\x87\x2a\xef\xd3\xd5\xbc\xba\x6c\xaf\xd5\xab\x67\x38\xb3\x11\x66\x85\x98\xe9\x93\xce\x66\x3e\xa5\x90\xea\xe3\xe4\x0c\xcb\x9b\xb7\xa6\x46\xe6\x29\x9b\x4f\xd9\x5c\x87\x2d\xf8\x8b\x58\xc1\x05\x38\xc6\x49\xfe\x07\x37\x64\xdc\x40\x77\xc9\x07\xf5\x06\xe6\x28\x68\x48\x96\xfb\x17\xe5\xe9\x7f\x37\xd1\xf5\xb5\x65\xc5\x22\x71\x0b\x28\x52\x57\x89\xd7\x3a\xbf\xb4\x7c\x44\x63\x66\x9a\x9d\xcb\xb7\xeb\xdf\xbf\x85\xa4\x79\xbd\x9a\xa3\x6d\x24\x36\x36\x8b\x1a\x48\x22\x89\xab\xc3\xbf\xa8\xfe\x28\x6c\x99\x79\xe9\x4d\x59\x57\x2a\x61\x95\x54\xfe\x49\xe5\x5d\x9d\x0f\xac\xf5\xb0\x9e\xd3\xe8\x7c\xfa\x71\xae\x37\x9c\xc5\x6b\x5e\x9f\x42\x75\x06\x2e\x07\xd8\xbc\xec\xb9\xa2\x12\xa5\x22\x96\x3a\x62\x6b\x7c\xf2\xde\x31\xce\x73\x16\x93\x52\xc8\xce\x71\xd3\x1e\x25\xd8\x67\x82\x9a\xd3\x6c\x39\xa3\x34\x7a\xb4\xdb\xc6\x1a\x80\x10\x19\xf3\xa5\x6e\x3d\xd9\x32\xad\x62\xf0\x57\x93\x05\xd8\x28\x60\x0e\x4d\xe4\xa3\xa1\x50\x40\xb9\xa6\xa6\x1e\x54\x34\x06\x79\x95\x6e\x65\xe9\xc3\x87\x5b\xdd\x8c\x53\xba\xd8\x03\xce\x6c\xa9\xd3\x9c\xd3\xdb\x39\xa6\x82\x22\xdb\xcf\x52\xf3\x66\x63\x23\x87\xb2\xc0\x96\x0e\x6f\x55\xdc\x7f\x27\x2c\xb0\x2c\xe5\xd1\xb4\x00\x8f\xa6\x6b\x9a\xb2\x77\x2b\x4e\xde\x67\x21\x0b\xcb\x58\x9d\x8b\x88\x0d\x1c\xc4\x00\x90\x03\x51\xdd\x37\x88\xf2\x3a\x48\xe9\x9e\x65\xba\xd9\xf0\xf9\x4d\x7d\xc6\xa1\xe9\x80\x13\x0b\x8f\xab\x90\xc8\xfd\xf1\xe9\xa3\x75\x9c\xcf\x7f\x0d\x62\x5c\x0d\xc8\x17\xcf\xd1\x84\xff\xad\x9d\x93\x0d\xc9\xaf\x3c\xd3\x14\xfc\x20\x7f\xc5\x2a\xf4\x9e\xe9\x39\xd9\xdc\x10\x38\x43\x20\x0d\x4b\xc9\x2a\x31\x4e\xbe\xf2\xd5\x81\x06\xc8\x85\xbb\x23\x21\x84\x57\xbf\xd9\xf0\xbf\x95\xf3\x56\x9b\x4d\x43\xc0\xbf\x06\xd8\x2f\xa3\x98\x36\x26\xbe\x8a\x32\x89\x66\x13\x22\xd3\x78\x5e\x42\xb6\xd6\x94\x02\x40\xa9\x21\x49\xde\xd8\x22\xd9\x31\xd1\xa9\xdd\x10\xce\x12\x51\x27\xbc\xbc\xa4\xc9\xd2\x4e\x71\xab\xc5\x8c\x48\x3b\x7b\x0d\xe8\x56\xa3\x23\x9a\xa1\x11\x75\x41\xe0\xd0\x2e\x2f\x4b\x7e\x79\x11\x9e\x51\x19\x78\xc5\x83\x43\x03\x22\xc7\x24\x0d\x54\xd7\x27\xbc\x03\x99\x13\x31\x7a\x61\x27\x48\x22\xf0\x9d\x63\x86\xe1\x45\x70\xec\x42\xa1\xc9\x67\x32\xed\x47\xb8\x64\xea\x68\xa8\xf0\x64\x69\xb9\xc2\x79\x86\x37\x37\x22\x2d\x0f\xee\x05\xca\x28\x7b\x77\x7b\x49\x91\x8a\xf5\x65\x24\x89\x35\xe0\x8f\xa5\xe0\x10\x41\x44\x68\xf9\x64\xfc\xb7\xa5\x98\xb3\x3f\x6e\x8f\xec\xd0\x94\x75\xb3\xa9\x24\x2d\x3e\x96\x4b\xbb\xab\x88\x26\xf8\x22\xd6\x44\x1d\xfe\x0d\x2d\xc3\x57\xa3\x46\x04\x11\x69\xb5\x52\x75\xe6\xa0\xe3\xb5\x48\x39\x16\xa2\x58\xa6\x17\xf1\x7c\x51\x65\xd9\xc7\xa9\x9c\xb7\xa2\x76\x3b\x75\x3e\x46\x70\xee\x23\x32\xef\xc9\xe6\x69\xa5\xdb\x92\x0a\xc7\xbf\xa9\x3b\x27\xa5\x13\xf4\x53\x77\x2e\xaf\xcc\x8e\x74\xb0\xa0\x76\xdb\xd6\x9e\x0e\x46\x57\x6d\x36\xc6\x4b\x8b\x90\x7a\xbb\x10\x60\xd2\x72\x0d\xf7\x19\xcd\x27\x57\xac\x38\xff\xa3\xd6\x6f\x22\x3e\x2c\x2d\x4a\x6d\xb7\x4d\xde\x20\xc6\x17\x5e\x5d\xb9\x9b\x36\x9b\x86\xcf\x45\xaf\x4c\x2a\x2c\x65\x00\x73\x09\xce\x69\x54\x04\xe3\xbd\x93\x62\xfa\xa4\x93\x3e\xfc\x62\x38\x53\x6a\x27\x62\x19\x92\xc9\xc5\x1e\xaf\xe2\xb7\x55\x94\x00\x40\x8e\xc6\xa2\x53\x88\x11\x4b\x40\x52\x5a\x3e\x08\x1f\x46\x49\x7f\x52\x24\x22\x9c\x96\x79\x03\x69\xed\x69\xa2\x2f\x95\x4d\xd5\xe4\x72\x6e\xfa\x00\x2d\x3e\x6e\x8b\x49\xa7\xfd\x30\xf9\x34\x20\x3c\x81\xc4\x17\xa1\x20\x41\xf0\x8f\x66\x9f\xda\x6a\x1c\x3a\xb5\x17\xd0\xe4\xee\x62\x6c\x4f\xd5\xbc\x89\x54\xbe\xd2\xa2\xab\x02\x34\x0d\xa5\x76\x5d\xda\xa7\x0b\xa5\xc7\xec\xa9\x14\xc3\xa5\xd5\xdc\x42\xac\x03\xbf\x4b\xa3\x8b\x30\xbd\xfd\x86\xde\x36\xb8\x6f\x97\x2d\x05\x42\x54\x29\x85\x69\x8b\x5b\x5c\x94\x15\x25\xc2\x65\x63\xca\x6a\x56\x0a\x93\x32\x65\xda\x2b\x4e\x3f\x93\xed\x60\xd2\xcb\x44\x91\x52\x6d\xdb\x09\x54\xc4\xc0\xa8\x69\xd2\x9a\xf0\x05\x17\x14\xbd\x29\xdc\xa8\x95\x51\xd3\xa4\x41\x0d\x07\xac\x37\x1d\x74\x81\x6a\xf5\x65\x44\x86\x33\x44\xda\x39\x43\x4c\x2f\x87\xcd\xe0\x71\x25\xf4\x8b\xa9\x6b\x7b\x49\x5c\x38\x96\x6e\xc7\x35\xc0\xc6\x4c\xdc\x59\xa8\xf5\x94\x94\xb8\xe3\xf4\x71\x19\x53\x5e\xab\x9c\xf4\x52\xe5\x36\x9c\x98\x41\x3b\xd2\x2a\x56\x26\x19\x13\x64\xae\x3e\xf4\x52\x3a\x41\xb9\x4b\x60\x87\x4d\xfb\xdb\xa8\x25\xcf\x94\xce\x55\x90\x64\xbd\xdc\x33\x70\x29\x2c\x10\x25\x77\x81\x0b\xc3\x59\xe0\x9e\x21\x19\x43\x79\x28\x5c\xc5\xbb\x11\xca\xbf\xce\xc9\x6a\xb1\xbc\x94\x12\x45\x33\x46\x61\x16\xcc\x9a\x02\x16\x9a\x43\xf3\x3e\x0c\x55\xcb\x25\x6d\x01\xa2\x1a\x90\xaf\x2f\x8d\xf6\x6c\xb5\x25\x8b\xf8\x72\x0d\x49\x36\xca\x23\xb9\xe5\x63\x9c\x8b\x28\xec\x3f\x8a\x8b\xc5\x24\x68\xfa\x59\x96\xc7\x11\x9d\x8f\xef\x62\xb5\xc5\x47\x89\xfc\x2e\x5e\xbc\x9b\xf3\xeb\x6c\xaf\x1b\x70\x6f\x96\x57\xed\x4b\x6b\x11\x0d\xa7\x74\x6e\x44\x37\x84\x65\x9b\x2c\x5c\xf2\x1d\x79\xef\x98\x01\x5d\x2a\x52\x92\xce\xb1\x90\x63\xac\x1c\xb5\x9a\x95\x23\x52\xd6\xe9\xab\xeb\x5c\x32\x9b\xe2\x2a\x4a\x98\x69\xff\xba\xed\xd4\x9d\xd4\x1a\x52\xd4\x79\x05\xa5\xa2\x42\x79\xde\x42\x99\x5d\x65\x40\xb0\x49\xe0\x83\x89\xfc\x9d\xd2\xb9\x9c\xf5\x50\x50\x7c\x6d\xb7\xcb\xea\xaa\x86\x45\x5b\x4a\x37\x41\x6a\x08\x4a\x10\x84\x8a\x3d\x9b\x22\x1e\x65\x8d\x7a\xd5\x51\xa9\xc3\x53\x8a\x11\x0d\x8b\x48\xc3\xbf\x45\x9f\x7c\x11\xcc\x50\x2b\xae\xc6\x4a\x69\x99\x1b\xb9\xd4\x4a\xab\x51\x3c\xd3\xb9\x53\xab\x0c\x22\xb3\x6f\xe3\xcf\xb4\xda\x0b\xed\x76\x63\x60\x7c\x21\xa7\x5d\x3d\x3a\x93\x3a\xf7\xa6\x26\xf7\x4e\xd3\xf9\x34\x9a\xb7\xdb\x49\x23\x3e\x10\x64\x1d\xe1\x68\x9f\x78\x82\xb5\x8b\x5d\xb5\xe2\xda\xe4\x5a\xa3\x4a\xed\xd1\x26\x94\xb7\x57\x17\x7c\x7e\x2b\xdd\x35\x20\x39\xbf\x26\xe5\x34\x7e\xa5\x8b\x5e\xef\x22\xca\xe2\x63\xc9\x25\xc4\xc4\xab\x8a\x44\xcb\x43\xe3\x8a\x87\x45\x31\xcb\x40\x6c\x7e\xc2\xe4\x68\xbe\xbb\x2b\x54\xad\x6e\xe5\x3a\x82\xad\x54\xd7\x53\xe0\x5d\x68\x95\x26\x3f\x3b\x11\xeb\x0b\xc2\x20\x80\xff\x66\x63\xcb\x5b\x10\x10\x2e\xee\x37\x48\x10\xc2\x6c\x7f\x3f\xdf\x8a\xbb\xb2\xec\x36\xce\xe8\xfa\xf3\xb8\xc4\xf5\x30\x88\x22\x04\xd5\x45\x7c\xc4\x48\x03\xf5\xb8\xb8\x4a\x21\xca\x73\x84\x69\x5e\x0f\x5d\xba\xbe\x47\xe7\xb2\xa6\xce\x65\x55\x32\x57\x67\x86\x12\xc0\xd3\x9d\x5f\x9b\x26\x16\x56\x1e\xa6\xf2\x73\xd9\xc5\x6c\x5e\x5b\x97\xde\x01\xb4\x62\xca\xbd\xc0\x14\x30\x15\x5f\xaf\xcd\xa6\x55\x9f\x20\x76\xc0\xdb\x8d\xee\x6f\x73\x54\x17\x3d\x0f\xa4\x59\xc3\x1e\x4e\x59\x2e\xca\x8e\xa2\x0d\x21\x69\xc7\x85\xd9\x76\x1b\x49\xab\xf2\x41\x05\x33\xbd\x47\x39\x15\x5f\xef\x4a\xcb\xf1\xba\xe4\x81\x17\xb4\xdc\xdc\xf0\x9b\x78\xa6\xac\x93\xf7\x65\xbd\xff\x2a\xdf\x4d\x1e\x4a\xc2\x6a\x2b\x83\x6d\x10\xe0\x4b\xa2\x8d\xb0\xc6\x46\xd3\xff\x93\x64\x69\x68\x68\x9d\x32\xa6\xf3\x88\x08\xbe\xae\xf7\xe9\xab\x8a\xbe\xfe\x90\x67\x25\x30\xed\x33\xab\x93\x08\xc3\xf7\xa0\x28\x6d\x92\x71\x5b\x16\x5a\x69\x7d\xa1\x55\x1a\xa9\xa9\x39\x34\x0d\x3c\xf2\x86\xb1\x74\x0f\x15\xd0\x28\xa1\xae\x5a\xd5\x49\x56\x0f\x35\x5a\xd0\xee\x59\x7d\xbc\x36\x64\xaa\xd0\xda\x84\x06\x60\x55\xbf\xf2\x71\xad\x78\xc6\x96\xa7\x4c\x17\xe5\xcc\x30\xcc\x97\xa1\xab\x46\x07\xa7\xc1\x94\x7f\x5e\x78\xf3\xa0\xbc\xbe\x88\xa3\x68\x4d\x9d\x62\x71\x35\xa9\x2c\x28\xd9\x5c\x19\x7f\x02\x73\xcf\xcd\x04\xf8\xb4\x65\x5d\xbe\x65\xfd\xa6\xcd\x07\x0d\xaa\xed\xee\x09\xe1\x69\x53\x10\xea\xda\x18\x31\x22\x4c\xd7\x10\x97\x0b\x96\x87\x39\xc7\xae\xab\x3c\x55\x1d\xbd\x14\xc4\x7d\xa5\x44\xae\xe8\xe7\xdb\xdc\x63\x4b\x95\x55\x24\xc9\x5d\x75\xdb\x55\xd9\xc2\x57\x73\x0d\xb5\x34\xaf\x34\x1a\x20\x11\xc7\x73\xeb\x9a\xfe\xd3\xbb\xeb\x5c\x1a\xd8\xee\x61\x57\xd8\xb2\x68\xa8\xcc\xf6\x0d\xdf\xcd\xde\x6e\x14\x3d\x86\x1a\x30\x2e\xec\x56\xab\x53\xbb\x3e\x0c\xa6\x7c\x5d\x8b\xcc\xb1\x52\x38\xf5\x14\x60\x9b\x4d\x63\xd6\xaa\x79\x8b\x57\x0c\x0a\x2d\x2d\xdb\x86\x10\x1a\xeb\x63\x57\x26\x6c\xd5\x08\x54\x05\x30\x77\x99\x8d\xe4\x1d\x19\xa4\x85\xf6\x52\x5f\x1c\x25\x7d\x3f\xbe\xbf\x8a\xcd\x80\x6d\x2a\xc4\x15\xd5\x5b\x96\x12\x8e\x2e\x8b\xf0\x56\xe2\x48\xa8\x3c\x61\xda\x14\x50\x1a\xae\x67\x91\x71\x66\xdf\x3b\x66\x80\x49\x65\x89\x11\xc6\x15\xb9\x94\x86\x8d\xfb\xd0\x0c\x89\x00\x97\x3c\xd4\xc2\x10\xf3\x99\xd2\x0e\x75\xd1\x95\xeb\x38\xb0\xbc\xd6\x42\x28\x53\xc6\xd6\xb1\xa8\x3a\xc1\xb5\xb8\x09\xb8\x38\x55\x71\xba\x4a\xa5\x0a\xf2\x03\x64\xb7\x13\x73\xf1\x4a\x9b\xb7\x8f\x15\x45\x3c\xb5\xf2\x3b\x56\x5b\xcf\x76\x84\x29\xec\xcd\xa5\x3a\xcc\xe6\x16\xb4\xf4\xee\x9c\xde\x58\xd3\x97\xc7\xb5\x6c\x36\x4d\x4c\x9e\x97\x33\x50\xbb\x4d\xa7\xc9\x9c\x10\x92\xa2\x35\x87\x20\xd2\x6c\x2f\x63\x3f\xa8\x0a\x6b\x4d\x92\xc2\x7f\xa9\x9d\xee\x20\xf8\x98\x29\x7c\x2a\x1f\xcb\xeb\x55\xb8\xa4\xad\x02\x31\x4d\xe7\xb9\x3e\x23\x7c\xca\x88\xda\x8c\x2f\x68\x64\x15\xd1\x4c\xce\x98\x8e\x41\xa9\xfc\x3a\x52\xa2\x2f\xfa\x9a\x9e\x72\xfe\x2d\x47\x47\xb9\x64\x4e\x99\x4d\xd7\x5b\xce\xf2\xf3\xcc\xb8\x84\x59\x40\x73\xd4\x6e\xb7\xf4\xee\xfe\xb2\xb2\xd1\xaf\x92\x39\xa7\xa9\x4d\xff\x1c\x6a\x1d\x0b\xcb\xaf\x71\xdb\x04\x85\x6b\xd7\x68\x98\xaa\x84\x14\x61\x26\xf9\x0c\x7a\xf1\x28\x59\x82\x57\x5b\xc4\x6e\xed\x35\xbd\x88\xd8\xf3\x6b\x9a\x30\xb8\xd1\x23\xc7\x9e\xeb\x22\x6d\x1b\x88\xe4\x0e\x0e\x5f\x2e\x8b\x4e\x83\x48\x2d\x8a\xeb\x69\x8b\x24\x48\x6c\x9b\xec\x85\x4d\x27\xb8\x23\x84\x63\xa2\xe0\xc7\x94\x24\xea\xc6\xb1\x69\xd5\x61\x02\x9c\x10\x22\x34\x0f\x92\x7c\xcc\xaa\x6b\xd3\xca\x61\xd6\xe9\xdc\xd2\x11\xbb\xf4\xce\x12\x4f\xc4\x11\x09\x45\x94\x69\x3a\x75\xe7\x73\x19\xab\x4c\x5f\x06\x61\x96\x2a\x03\x5e\x03\x34\x9d\x7a\x02\x36\xb5\x23\x9c\x29\xaf\x18\x11\x07\xa1\xd8\xb7\xaa\x84\xef\x4e\x20\x52\xf2\xb8\x04\x51\xdd\xf5\x4f\x88\x4b\x08\x9d\x84\xa6\x44\x0f\x12\xa7\x14\x30\x5b\x9e\xb4\x24\xb1\x99\x3c\x4e\x38\x32\x09\x47\x26\xd7\xbb\x83\x5f\x39\xe2\x46\x35\x25\x1c\x2f\xb4\x70\xbc\x0c\xb3\xd2\x85\xb2\xad\x56\x8d\x15\x29\x6a\xb6\xfa\xa1\xdc\x28\x03\xd4\x1d\xc3\xfa\xb6\xb3\xb4\x86\x98\x83\xd2\xf8\xd8\x58\x4f\x20\x1f\x4c\x09\x09\xf5\xe9\x01\x79\xcd\x88\x75\x54\x5c\x42\x62\xe1\x5b\x46\xac\x2f\x23\x0a\x87\xfe\x21\xe1\x03\x23\xd6\xcb\x4b\xf5\x76\xcc\x88\x25\xa2\x45\xab\x94\x23\x46\x2c\x75\xb1\x9c\x4a\x7b\x0b\x69\x8c\xd1\x34\x51\x49\x27\x8c\x58\xdf\xf3\xc5\xab\x4a\xf8\x85\x91\xf5\xf4\x9a\xcd\x83\xa9\x75\xa1\x6d\x68\x99\x35\xc7\xd3\x5b\x48\xd4\xf1\xef\x78\xd2\x07\x48\xba\xa6\x29\xc8\x8b\x39\x9e\x1e\x89\x04\xed\x27\xca\xd3\x8e\x55\xda\x15\xe4\x79\x0b\xaf\xc5\x2c\xc5\xd3\x4e\x44\x7d\x51\x12\x5d\x5c\x5d\xa8\x6b\x39\xac\x8b\xf0\xc6\x78\x9f\x1b\xd1\x95\x5e\x30\x23\x0c\x46\xd5\x75\x86\x0f\x90\x89\x29\x8d\x64\xf0\x69\xea\x2c\x6f\x93\xf0\x22\x5a\x48\x11\x29\xd5\x8c\x5a\x87\x3e\xb3\x29\xc2\x2d\x57\x6d\xce\x6a\xc7\x0b\xed\x2a\x92\x4e\xb6\x79\x25\x91\x2d\xd3\x0d\x4e\xcb\x75\x93\x0a\x2e\xa5\x75\x1b\x2d\xaf\x7e\x6d\xab\xb1\x48\x4b\xb8\x09\x95\x8a\xe1\x69\x9b\x4d\xb1\x01\xcf\x35\xb2\x76\xdb\x4e\x61\x6d\x20\x9c\xdc\x70\x8a\x02\x7d\x59\x68\x73\x40\xab\x76\xfb\x17\xd8\xce\xaa\x58\x3c\x8b\x08\x06\xc2\x8a\x9c\xae\x3e\x42\xc4\x4e\xb1\x36\xfa\xf5\x3b\xb8\xdb\xf2\x9c\xee\xa9\x48\x20\x7c\x7d\xf8\xf9\xa3\x75\x9a\x7f\xbe\xf7\x31\x62\xe7\x7b\x8a\xe3\x01\xe8\xd1\x9a\xe6\x78\x6f\xc5\xce\x69\xfa\x31\xe2\x33\x35\xdb\xfb\xb8\x4a\x3e\xe7\x7f\xd3\xdf\x9d\x5f\x39\xa2\x2c\xb7\x79\xcf\xf1\xbf\x8c\x63\xbd\x56\x63\xe3\x23\x23\xeb\x65\x98\x44\xd9\x79\x70\xf0\xf3\xf4\xa8\xf3\xd3\xec\x66\x31\x98\xdd\x2c\x0f\x67\x37\x8b\xfe\x7c\xff\xd1\x01\x3e\x4d\x69\xb2\x30\xbe\xba\xb3\x9b\x85\x2f\xa0\x16\xc3\xd9\xcd\x62\x34\xbb\x59\x70\xe8\x70\x76\xb3\xf8\x30\xbb\x59\x9c\xce\x6e\x16\x74\x76\xb3\xec\xcd\xae\x5c\xaf\xef\xcf\x6e\x96\xa3\xd9\xcd\xf2\xc3\xec\x66\xb9\xe0\x29\xc3\x43\x28\xf5\x8c\xa6\x17\x61\x52\x94\xda\x9b\xdd\x2c\x07\x00\x73\xb3\x3c\x05\x88\xec\x52\xa3\x15\x76\xfe\x9c\xdd\x9c\x7a\xb3\x1b\xca\xff\x8f\x66\x37\x74\x39\xbb\x39\xed\xce\x6e\x4e\xc3\xd9\xcd\xe9\x82\x83\x47\x38\xbd\xca\xb2\x48\x14\x39\xbb\x72\x7b\x9e\xdb\xe1\x3f\xfe\x29\xff\xeb\x7a\x10\x5c\x1d\xbf\xde\xd5\xda\x59\xf6\xcf\xb4\x57\x96\xbb\xb3\xc5\x12\xe6\xfe\x6d\x16\x19\xee\x6a\xb5\x80\xca\xf1\xab\x52\xbb\xc5\x7d\xe5\x3b\x3a\x5a\x03\xfc\xdd\x7d\xad\x0b\xde\xd9\xdd\xe2\x3a\xf8\x07\xf5\xb8\xdb\x19\x6d\xed\xf4\x9b\xff\xc7\x1a\xdf\xd0\xf5\x3b\x9a\x5f\xc8\xf9\x9f\x58\xd5\x39\x51\x48\x7e\xed\x38\x73\xc1\x57\x06\x59\x66\x53\x9c\x80\xa4\x23\x55\xb9\xaf\xdd\xc6\x20\x1c\xa9\xbe\x58\x3c\x03\x97\x19\x48\xfb\xf1\x3c\x62\xf4\xed\x65\xb8\xa0\x13\xae\xfc\x10\x33\x58\xe3\xcf\xc5\x3d\xff\x7b\xff\x7a\xb4\xae\x95\x92\xcf\xf7\x1f\x41\x70\xb1\x80\x2b\x59\x9f\x96\x15\x61\x15\xce\x1d\xee\x78\xb7\x02\xa1\x8e\xa5\x4e\xbc\x5a\x84\x31\x9d\xa8\x87\xa0\x12\x79\x55\x7a\x74\x15\x67\x32\x5e\x01\xd8\x5d\xdf\xc5\x4d\xf2\x93\xfb\x00\x05\x96\x8a\x82\x3c\x8d\xc4\x6d\x1e\x7b\x1f\xd9\xe4\x23\x9b\x46\x73\x68\x2f\x56\xa9\xaf\xd9\xe4\xb5\x4c\xf5\xe6\xf3\x71\xd1\x18\x19\x8d\x53\xb4\x29\xf9\x87\xdb\x24\x2b\xbb\x57\xd3\x24\xac\xd1\xc2\xa4\xdd\x86\xf5\xdb\x2b\x36\x79\xc5\x97\x66\xa2\x85\x2a\xf5\x86\x4d\x6e\x64\xaa\x37\x9f\xe7\xb9\x1d\xe1\x14\x27\x08\xb7\x8c\xbb\xee\xa5\xed\x8e\x67\xa9\x71\x56\x3a\xf5\xe6\x41\x3a\x75\xe7\x08\x4d\xf4\xd9\x81\x08\x27\x78\x2a\xb3\xcd\x51\xa0\x75\x5a\xcd\xfe\xcf\x8d\x2b\x25\xf6\x28\x79\x22\x87\xc3\xf4\x95\x68\x04\x96\xbf\x3f\x46\xec\x1c\xaa\x99\xe3\x23\x91\x62\x94\xf1\x72\x77\x19\x92\x10\xb8\xfc\x5a\x2f\x51\x7e\x30\x0a\x7e\x57\x29\x58\xaa\x53\x52\x35\xbb\x65\xa8\x6c\x6c\x28\x3b\x84\x9b\x51\x94\x71\xa2\x0c\x97\x38\x24\xd1\x44\xae\xae\x8a\xae\x69\x95\x74\x68\x3e\xce\xcb\x29\x21\xda\x6c\x8a\x40\xcc\x84\x90\x64\xa2\x48\x19\x68\x5a\x1f\x39\x0b\x11\x13\x1a\xa7\x78\x9a\xe0\x70\x6e\x3a\xa2\xbe\xd9\xd5\x14\xf0\x90\x28\xe4\x4c\x8a\x0c\xd7\x13\xd5\x42\xb9\x8c\xcf\x26\xea\x21\x98\xca\xa7\xc2\x60\x9e\xea\x2b\xfa\x19\xe9\x78\x44\xb5\x59\x2f\xe5\x52\x84\x5b\xd2\x11\x43\x6c\x7a\xea\xa5\x8e\xd1\x84\x84\x85\x51\x92\xf1\x36\x28\x92\xa9\x7a\x1a\x96\x46\xba\x7d\xbf\xb3\x86\xfb\xd4\x8b\xcb\xdd\x39\x4e\x29\x89\x08\xe1\x7a\x96\x40\xa0\x1e\xf4\xf3\x3b\x66\x6c\x98\x1f\x01\x33\x84\x89\x54\x47\x83\xa9\xd7\x9f\xe3\x67\x51\x42\xd3\xec\x38\xbe\xfa\x10\x4c\xbd\x1e\xf6\x06\xd8\x1b\xf1\xd4\x6c\xb1\xba\xa6\x69\x30\x95\x09\x5f\x1f\x3f\xd5\xcf\xaf\x43\x9a\xb1\x74\x15\x4c\x3d\x1f\xeb\xa4\x8c\xd1\xf4\x38\x4c\x97\x1c\x6a\x8e\x4f\xa2\x2c\x0c\xa6\x5e\x57\x7e\x37\x43\xac\x16\x36\x89\x22\xd4\xaf\x93\x5d\x7d\xc8\xd4\x4d\xc1\xea\x2e\x4d\xac\x1e\x91\x9e\x38\xcc\x18\xb8\xa2\x51\x6e\xd5\x77\xcc\xf4\x15\xa3\xfb\xcd\x75\xa4\x38\xdd\xf7\x74\x08\x4d\x2e\xff\x85\x13\x84\x8b\x3d\xec\xe3\x2e\xee\xe1\x4e\x0f\x77\xba\xb8\xe3\xe3\x8e\x87\x5d\x71\xad\x7e\x4a\x8c\x6b\x3e\xd3\x27\xbc\xb6\x0e\xf1\x79\x1d\xd1\x74\x57\x2d\xf3\xb1\x74\xd0\xff\xcc\x73\xb5\xdf\x38\xf1\xdc\x4e\x82\x3d\x97\x90\x04\xee\x81\x77\x11\x4e\xf2\x52\x6e\x17\x17\xd5\x21\x44\x8a\x86\xc8\x78\x59\x14\x19\xa3\x3a\x2a\x88\xaa\x07\xe0\xc1\xcf\x76\xdf\xf5\x0e\x37\x7d\xd7\x77\x37\x7d\xb7\x7b\xb8\xe9\x0f\x3c\x7f\xd3\x3f\x1c\x75\x37\x83\xae\xdb\xdb\x0c\x86\xfd\xd1\x66\x30\x1c\x78\xfc\x8f\xcf\xff\x74\x37\xee\x80\x7f\xe8\x8e\x5c\x34\x5b\xee\x3f\x3a\x50\xe1\xe2\x27\x94\x58\xb2\xd7\xad\xe0\xe0\xe7\xfe\xd4\xeb\xf4\xe7\x95\xaf\x8a\x01\x38\x40\xaf\xf4\x8d\x33\x03\x4f\xed\x4e\x7b\xc3\x72\xae\x0a\x47\x72\x20\x7b\x12\xf8\x5e\xd7\xdb\x78\x87\xae\xbb\xe9\xf6\x51\x09\xfe\xeb\xe3\xa7\x50\x10\x5c\x63\xe3\x76\xfa\xf3\xcd\x74\x70\x38\x2f\xc3\x14\x0c\xcd\x41\x07\x1c\xd4\xf3\x36\x46\x41\x10\x1a\xc8\x52\x1c\x6e\x21\xac\x57\x56\x09\x79\xa2\x6d\x41\x89\x34\x17\x89\x60\xa6\x20\x54\x12\x25\x1c\x33\x92\x28\x6b\x6b\x52\x32\xb0\x2a\xfb\x6a\x74\x6a\x57\x16\xa8\x09\x8e\xab\xf6\x8b\xd0\x90\x49\x38\x21\x71\x21\x5e\xdb\xed\x6c\x6a\xbc\xce\x27\xd3\xf2\xfb\x3c\x88\x9d\x45\x4a\x97\x11\xe3\x04\x7f\x77\x7b\x49\x33\xbc\x52\xe7\x3d\x00\x61\x2e\x21\x12\x21\xb5\x7e\x67\x76\xa8\xae\x1e\xa5\xd3\x98\xaf\x2d\x23\x3b\x44\x84\xc4\xed\x76\x6a\x87\x08\xaf\x48\x8c\x0d\x11\xd6\x6a\x94\x61\xba\x36\x1c\xe3\x69\x88\x57\x3b\x25\xd7\xb7\x86\x02\x28\xa1\xbe\x67\xb6\x14\xcc\x2a\xb8\xa9\x86\xfe\xbe\x0e\x5d\x08\x6e\xa6\x26\x8e\xf2\x74\x9d\x96\x26\x64\xb6\x7b\x42\x7e\x56\x99\x28\x24\x7a\xaf\x9c\x55\x12\xdf\x3e\x8b\xce\x22\x86\x8f\x9c\x25\xff\x35\x32\x7d\xb9\x2d\xd3\x87\x30\x8b\x16\xcf\x2f\xc2\x28\xc6\x47\x0e\xe5\xbf\x46\xae\xdf\xb6\xe5\xe2\xa3\x7a\xc1\x5e\xd0\x9b\xe3\x55\xbc\x4a\xf1\x91\x73\x2e\x1f\x8d\xcc\x5f\xed\x9e\xd0\x6a\xb4\x49\x91\x76\x27\x6f\x15\x33\x53\xe9\xce\xab\x89\xd1\x87\xfa\x6e\x2d\x63\x22\x32\xe9\x55\x20\xf2\x67\xf5\x88\x87\x57\xbd\xb4\xfd\xb1\x15\xc0\xef\x13\x2b\x88\x08\x7b\x62\x1e\x7f\xb0\x1e\x13\xf5\x91\x88\xaf\x84\x36\x1c\x0f\x78\xaa\xeb\xa0\xbc\x85\xbc\xa7\xc7\x42\x87\x16\xa1\xd3\xeb\x43\x68\x87\x09\xb0\xe4\x12\x65\x5e\x23\x01\xc5\x72\xa6\x8e\xf4\x25\x17\x32\x4b\xbb\x0d\x69\x32\xf8\xba\x64\x2b\x8a\x6a\xbc\x9f\x72\xb5\x4b\x7d\x4f\xe6\x48\xdc\x9e\x13\x8a\xaa\x4a\x25\x42\x3d\x76\x4a\xc8\x91\x73\x11\x25\x70\x73\xde\x9f\xcc\x0e\x71\x82\xa9\xb3\x92\x17\x79\x6c\x36\x9c\x2a\x28\xf8\x93\xd9\x09\x0e\xcb\x1f\x1e\x13\x0b\xdd\x5d\x7f\x5e\x1b\x77\x9a\xa4\x3f\x54\xf8\xe7\x29\x90\x15\x1f\x39\x17\xe1\x0d\x47\xc7\x00\x7d\xb4\x53\x0d\x3c\xd6\x71\x4b\x5b\x26\xb7\x6d\x36\x8a\xc7\x84\x38\x79\xac\x34\xa8\x46\xcd\xed\x22\xbc\x79\x25\xa4\x4e\xa3\xde\x53\xe0\xf2\xc7\xa7\xe1\x62\xdc\x1a\x21\x4b\x47\x77\x22\x24\x8c\x92\x77\x21\xf4\xe3\x56\x3a\x8a\x6e\x35\xe8\xf8\xfe\xd3\x70\x57\x73\xb8\x3a\xf8\x23\x0d\xf3\xbb\xd1\x8f\x92\xfb\xd1\xf3\xeb\xbf\x8d\x9e\x77\x22\x74\x3f\x7a\xfe\x7b\x27\x42\x47\x22\xc0\x7e\xb1\x3b\x53\x1a\xe1\x91\x9e\x24\xf5\x24\xa0\xec\xe3\xe2\xf4\x8c\x5c\x26\xe2\x08\x41\x1c\x17\x71\xbe\x48\x3a\x18\x92\x54\x3d\xb5\xdb\xfa\x71\xca\xf4\x11\xe6\x49\x53\x62\x50\xdb\x15\xd0\x50\x05\x7c\x60\x59\x58\x57\xf3\x0d\xbd\x2d\x6a\xfa\x86\xde\x1a\x95\x7d\x43\x6f\x1b\xeb\x2b\xa7\xef\xa8\xf2\x1b\x7a\x5b\xca\x05\x15\x93\xb2\x09\x18\x26\xed\xa2\xa5\xc5\xf3\x37\xf4\x56\x2d\x1f\xbe\x12\x5b\xc7\x82\x72\x3a\xfa\xe6\x98\x15\xa4\x6a\xb8\xa0\x22\x9d\xa4\x81\x71\x31\x61\x8a\x26\xe9\x94\x63\x6b\x61\x9d\x6f\xb3\xb1\x8d\x32\x80\x9f\x78\x0d\x08\x9b\x48\x10\xcb\x2a\xbc\xd4\xf9\x58\x2a\x42\x26\xb4\x58\xf5\x62\x28\x83\xc3\x54\x69\x5c\x04\x46\x3b\x35\x8e\x6f\x76\xb2\xd8\xc9\x36\x9e\x57\x9c\xbe\xd9\xc0\xed\x2a\x7a\x6a\xd8\x32\x16\x4a\x5b\x1d\x8d\x50\x5c\x02\x95\x36\x40\x1a\x47\x4e\x1a\x26\x67\xb4\x3c\x6a\x4a\x45\xe3\x4a\x21\xa5\xd1\xf4\xbf\x7f\x93\x96\xf0\xc3\xe5\x65\x93\x96\x70\xa5\x92\xef\xd4\x12\x4a\x97\x23\x6e\x45\xa4\x32\x89\x0b\x7c\xca\xa6\x00\x45\x3c\x13\x8d\x94\xfe\x71\x15\xa5\x74\xc9\xb1\x68\xae\x9e\xee\xaa\x1e\xbf\x65\x75\x0b\x80\x5a\x29\x82\xf5\x2b\x35\x5c\x2e\x60\xf3\xbf\x41\xc9\x34\x40\x38\xff\xd5\x38\x34\x2a\xd1\x68\xbc\x9d\x3d\xd3\x7b\x91\xaa\xdc\x67\x8d\x08\x81\x85\xea\x2d\x5d\xac\x92\x65\x36\x79\xe5\xb0\xe8\x02\x6e\x4a\x95\x29\x81\x48\x29\x11\x92\x27\xdc\xd9\x95\x51\x05\xbf\xa6\x1b\x6d\x5e\x39\x57\x69\x2c\x97\xcc\x86\x8d\x05\x6c\x38\x57\x69\x5c\x58\xec\xcc\x83\xbf\x4d\x9f\xc4\x01\x60\x2f\x50\x45\x1a\x27\x67\x7d\x48\x04\x2b\xe3\xf9\x2a\x63\x3f\x94\xbf\x76\xe1\x2b\xdc\x94\x16\x26\x94\x7f\xcd\x8b\xd5\x45\x04\x4b\x88\x23\x5e\xa2\xf4\x2b\x28\x9a\x97\x7c\x0a\xf9\x4d\x5b\x83\x58\x5a\xb7\x3c\xb8\x1b\x45\x90\xe3\xeb\xb7\x6f\xbe\x75\x40\x02\x40\x34\x52\xd2\x6a\x71\x09\x5a\x3d\x15\x9f\x16\x97\xa7\xf0\xfc\xc5\x75\x01\x8d\x4c\xff\x5b\xb6\x4a\xb6\xf5\x95\x5c\x97\x52\xb2\x9e\x1e\x39\x67\x70\x6d\x4b\xfa\xee\x3c\x4c\xe6\xc1\x91\x13\xd3\x2c\xe3\xcf\x78\x5a\x3c\xf3\x74\x03\x0c\x97\x73\x49\xdf\x71\x33\xb3\x4c\x32\xcb\x30\xa0\xea\x79\x0d\x9b\x8e\xf2\x68\x52\x9e\x14\x11\xb1\xb5\x52\x8f\x8a\x75\xeb\xa4\x66\x52\xa4\x86\x49\x91\x29\xef\x24\x9c\x18\xf6\x44\x7d\x62\x44\xd2\x64\x42\x0b\x43\x63\xf3\x12\x41\xee\x1a\xcb\x83\x2d\xb2\x26\xd4\xb0\x77\x5a\xac\x6f\xde\x37\x5e\xb4\x5e\xf2\xaa\x52\x0f\x0a\xc7\x90\x84\x74\x9a\xce\x71\x2c\x6f\x72\x88\xda\xed\xa4\xe4\xaa\x51\xbe\x6b\x25\x33\x0e\x2c\x6a\xdb\x61\xc2\xd7\xde\x8d\x6e\x24\x0c\xe1\x85\x3c\x58\x9f\xc1\xd9\x8d\x05\x59\x51\x58\xe8\x66\x1d\x0f\xaf\x70\x88\x53\x1c\x23\x84\x17\x4d\x55\x66\xfb\x5e\x29\xc7\x3e\xcf\x91\xca\x1c\xb1\x71\x22\xa4\x6e\x4d\x33\x7c\x70\x6c\x70\x12\x2a\x7b\x74\x6f\x73\xc1\x41\x39\xc2\x25\x7f\x1d\x8a\x72\xec\xbb\x2e\xca\xed\x18\xe1\x96\x47\x08\x59\xec\x5c\xd8\x34\xcc\xed\xb2\x87\x60\x51\xc5\x0b\xe0\xe3\x0c\x27\x5c\x8c\xdf\xb9\x42\xda\xba\x40\xca\xa8\xe1\x58\xd0\xb8\x90\xac\xac\x2f\x29\xda\xba\x04\xde\x2b\x8d\x89\x20\x22\xe6\x2d\x76\x4a\x67\x30\x35\x04\xf3\x7a\xcd\xbd\x62\x8c\x35\xe7\x7c\xbc\x23\x67\x7d\x28\x6e\xa9\x9d\xdc\xa3\xfa\x9d\x25\x3c\x2e\x97\x50\xac\xe2\x0d\xe7\x8d\x82\xba\x2b\x5a\xbd\x77\x42\x70\x7e\xcb\xc3\x2b\x52\xba\x3c\x89\x77\xea\xaa\xdd\x5e\x55\x8e\x34\x31\x52\xa4\x4c\xa3\xf9\x38\xe3\x9d\xce\xb5\x45\xd9\xb5\x08\x67\xe0\x3d\xa6\x22\xb0\xab\xb8\x4d\xe1\xbc\xdd\x8e\x55\x88\x2c\x85\x5b\x56\x20\xb6\xa8\x88\x7f\x50\x43\xf8\x7a\xce\xa0\xa4\xc1\x25\xcb\x7b\x80\x4b\xb2\x19\xb9\xae\xb6\xe5\xaa\x50\xda\xc8\x72\x7e\x57\x16\x03\xf6\xf2\xd3\x95\x2d\xba\xc5\x6d\x09\x36\x53\xf5\xaa\x52\x5e\x9b\x6f\xa4\x4c\xdc\x20\x35\x57\x9d\xc5\x8a\xbe\x80\x55\x29\x02\x56\xaf\xf8\x2b\x76\x02\xa3\x98\xcd\x46\x84\xac\xd0\xb0\x1a\x3f\x25\x98\x8c\x6f\xa5\xc9\x71\x71\xbe\x8a\x16\x77\xab\x32\xa7\x3b\xd5\xc2\xdb\x06\xb5\x50\x4e\x5a\xec\xce\x1d\xaf\x88\x30\x75\x2c\x55\x4e\x3f\x2d\xb6\xd9\x30\xb5\x83\xa5\x66\xf4\xfa\x3a\x66\x19\x9d\x9e\x52\x88\xb5\x6a\xe8\xfc\xbb\x17\x34\x67\xd5\x66\xb0\x76\xdb\x6e\xd1\xe9\xf5\x7c\xb3\x81\x9f\xe9\x91\x93\x88\xdd\xbd\x39\x5c\xa2\x58\xbb\xbf\x5f\xb0\x92\x84\x41\xe3\x4f\xd3\x38\xdf\xab\x02\x0a\x1d\x4e\xed\xc0\xcb\x4b\x42\xb9\x52\xba\x58\xd0\x4b\x26\xfd\xab\xcd\x2e\x93\x79\xef\xec\xb3\x8b\x4f\xd0\xcf\x64\x81\x9f\xf9\x2d\xe2\x9a\x75\xd2\x6b\xba\x55\x87\xd2\x15\x5e\xdf\xa7\xc2\x66\xdb\x17\x54\x58\xbe\xb5\xd2\x50\xe5\xea\x6b\xbd\xd5\x72\x59\x42\xc7\xc0\xe2\x76\x37\x16\x4a\x97\xa2\xda\x5b\x35\xdd\xa5\x4b\x95\x99\xb5\xd0\xa5\x52\x73\x5f\xa1\x50\xac\x52\x67\x19\x5d\x47\x4b\x9a\x2c\x55\x73\xab\xca\x94\xa0\x73\xe3\x4a\xad\xdd\x4e\x9e\xb8\x68\xb3\xa9\x33\x8c\x61\x54\x47\x55\xef\xe2\xd2\x46\xa6\xb0\xf5\x7a\xe3\xe8\x31\x79\x1d\xb2\x73\xe7\x34\x5e\xad\x52\x1b\x1e\xb3\x3f\x52\xb8\xa3\xb8\xdd\xb6\xd9\x67\x51\x8b\xb8\x9b\x8d\x1d\x41\xcc\x2f\x3b\x25\x2d\x17\x61\x76\x10\xb5\x08\x89\xda\x6d\x76\x50\x4a\x6f\xa5\x08\x8d\xa3\x7d\xe2\xa1\x62\x2b\xd4\x4e\xb0\xde\x3a\x53\xe8\x37\xf7\xd4\x69\x08\xd7\xb6\x6d\xe9\xac\x0f\x9f\xb2\x86\x50\x35\x7e\xe6\xb9\x2e\x21\xae\x52\x5e\x3f\xeb\xc1\x6b\xa0\x5f\x09\x71\xcb\xa6\x7a\x1a\x5e\xbe\xa7\x61\x7a\x27\x23\x1f\xef\x94\x76\xd7\x25\x69\x67\xf8\xc6\x0a\xb9\x27\xba\xc0\xd8\x58\x66\xe2\x74\x98\xe1\x41\x2a\xdc\xe2\xb5\x79\xce\xc9\x56\x17\x14\x02\xe6\x10\xc2\x10\x32\x36\x8d\xa2\x06\xb1\x17\xc6\xf1\x9b\xd3\x32\x3d\xb7\x0b\xbc\xa3\x7f\xba\x25\xb2\xc0\xf7\xc5\x3e\x08\x5f\x39\xbf\x4b\xa3\x0b\x79\x93\x74\x44\xca\x47\xe2\xf5\xb0\x2e\x35\x9e\x91\x27\xcd\x45\xc0\xf9\x80\xa0\xe9\x9b\x2a\x08\x20\xc4\x99\x81\x6d\x24\x5b\x25\xf4\xfe\x24\x7b\x7b\x1f\x92\x35\x0c\xea\xff\x7f\xd2\xab\x89\x5c\xc9\x83\xe8\x75\x42\xb7\x6c\xce\x5d\x84\x8b\x97\x4b\xd8\x27\x31\x5d\x65\x7e\xd9\x06\x1e\x66\x8b\x28\xc2\x47\xe2\xd7\xc8\xf0\x62\x5b\x86\x65\xc8\xc2\x1f\x52\x9e\x45\x3e\x19\x99\x3e\x7e\xc2\x54\x74\x97\xd8\x95\xa9\x4f\xf8\x44\x25\x9f\x1f\x93\x41\xbf\xdf\xed\x37\x0a\xbe\xcb\x55\xca\xb6\x89\xbd\xd7\xbb\xd1\xdb\xe2\x64\xa3\x39\x40\x9c\x2c\xc0\x96\xdc\x1c\xd3\xa1\x40\x3d\x31\xb1\xc8\xdd\xb7\xa9\x3b\xc7\xaf\x9c\x38\x64\xa8\x9c\xec\x41\xf2\x2a\x39\x6b\xd8\x17\x3b\xe2\xf0\xaf\x56\xc9\xd9\x7d\x7b\xff\xd5\x27\xb5\xa4\xe5\xe1\x87\x3b\x0a\x55\xb7\x77\x84\x57\x87\x5d\x56\x74\x3b\xa9\xda\x95\x57\x0f\xa8\x45\xd2\x3b\xbd\x89\x68\xb2\xcc\xf8\x48\x79\xa8\x37\xd1\xcd\x3f\xdb\xfc\x44\x34\x5f\xae\x96\xb7\x10\xc0\xc5\xea\x0e\x58\x11\xc0\x46\x84\x2c\xa5\x62\x6f\xbc\xdd\x96\xb9\x22\x54\xde\xc3\x26\xaa\xb8\xa4\xf2\x61\xb3\x69\x95\x0b\x88\x5a\x24\xd1\x04\xcc\xb7\x10\x30\x63\x61\xca\x3e\x89\x84\x3f\x7d\xc2\x50\x6d\xd2\x13\x9b\x2c\x2f\x5e\x8b\x30\xc3\x95\xc9\x1f\xa7\x8f\x19\xf8\x30\xf1\x56\x7c\x96\x72\x05\x01\x2c\x88\xd5\xfb\x86\x77\x2b\x9f\x97\x69\x74\x41\x6b\x9b\x74\xa5\x01\xfe\x7c\x9b\xd0\x8a\x43\x58\x8a\x86\x2c\x62\x57\x4b\xd3\x9a\xfa\x72\x6b\x0e\x3e\x1a\x8f\xe0\xa7\x9a\xe7\xdd\x9d\xdc\xd7\xa8\x7c\xea\x1d\x3e\x1d\x72\x84\x95\xbd\xe0\x4a\x00\xe2\x9e\x6d\x9b\x22\xdc\x34\x86\xcc\x5d\xb4\xcd\xa6\xd8\xd3\x2b\xec\x48\x25\x00\xe1\x7a\xb8\xaa\xee\x83\xb0\x1d\xfc\xf1\xe6\xd3\x1a\xd9\xa8\x61\xab\x01\xd8\x68\x9a\xa4\x62\xc7\x54\x9a\x26\x69\xc5\x34\x29\xaf\x00\x96\x37\xcc\xb6\xdb\x72\x54\xc6\xda\x5f\x33\x6b\x36\x3a\x52\x84\x57\xe5\xc8\x5c\x70\x22\xca\x3c\x6e\x4c\x5b\x5c\xeb\xb6\x57\xe4\xbd\x1a\x89\xe6\x75\xcb\xd9\x5c\x4f\xdc\xc5\xf7\x58\xea\xc1\x26\x94\xb2\xe0\x34\xa5\x4e\x8f\x9c\xab\x24\xfa\x83\x13\x1b\x7f\x4a\xae\x09\x33\x8e\xcb\x19\x31\xfd\x8c\x3c\x2d\x52\x2a\x82\x2f\xe6\x14\xb6\xec\x8e\xd6\x34\xb5\x16\x4d\xdd\xf9\x66\x93\xa8\xf3\xc6\x06\x00\x0a\xc2\x86\x54\x95\x0d\xaf\x24\x97\x26\x66\x94\x1e\x75\xf2\x4e\xf0\xce\x6e\x83\x2c\x35\x43\x58\x12\xa2\xcc\x76\x80\xcf\xfd\x8d\xb5\xa9\x32\xd6\x22\x3b\xc1\xa1\xb0\x14\x2c\x38\x23\x44\xa7\x7c\xad\xbf\x54\xa7\x98\x0a\x13\x00\x98\x97\x6d\x23\xc2\xa4\xc4\x37\x6c\xb2\x72\xa7\x48\x18\xc9\xc5\xb8\xe8\x78\x2d\x12\xb6\xdb\xb6\x5c\x86\xd6\xc3\x0c\xb7\xf8\x7a\xae\xb0\xe6\x21\xcc\x1a\x51\x10\xee\x33\x4a\x6c\xe3\x18\x71\xf4\x53\x9c\xe1\x08\x33\x30\x74\xaf\xda\xed\x56\xdd\xe8\xac\xd8\xa4\x22\x0d\x77\x38\xe1\xfe\xcd\x9b\x9c\xb8\x55\x5e\xe9\x25\x2b\xf6\xfc\xe2\x92\xdd\x6e\xdf\xe7\xfc\xce\xb8\xd2\xc9\x50\x8e\xf0\x2b\x27\xba\x3c\xe9\x81\x58\xa1\xca\x86\x95\x96\xe3\x94\x96\xb5\x7b\x18\xc0\x84\x3d\x26\x7e\xbf\x8f\x5b\x14\x55\x66\x92\xc2\x7b\xcf\x6c\x72\xad\xc6\x81\xe9\xb9\xb7\x73\x01\xf2\xa1\xc9\xd6\x56\x84\x2a\x3f\x8e\x96\xe9\xa4\xa2\x28\x1e\x58\x28\xd0\xfd\x32\x56\x47\x2a\xe4\x49\x45\x42\x1e\x39\x27\xbd\x09\xa7\xc7\xd4\x9d\xa3\xa0\xfc\x61\x30\xf9\x56\x7d\x50\x10\x9b\x8d\x4a\x12\xac\x2c\xea\x6c\xb7\x23\x88\x5a\x6b\xea\xa2\x76\xad\x92\xaa\x16\xba\x88\x96\xe9\x49\xaf\x5e\x69\x33\xe0\x00\x05\xdb\x4a\x30\xb5\xf7\x72\x16\x84\x70\xe3\x9a\x30\xba\xbc\xaf\x8a\xfb\xec\x81\x3a\x9e\x20\x70\xa3\x4b\xc0\xb8\xe2\x74\x63\x47\x1c\xd1\xab\x2c\xba\x94\xb1\x07\x25\x47\x46\xaa\xeb\xac\x22\x62\xae\x3a\xd7\xbc\x38\x0f\xd3\xe3\xd5\x92\x1e\x31\xdb\x2d\x82\xe6\x3e\x21\xd6\x91\x55\xfe\xd6\x6e\xd3\xc7\xc4\xfa\xa9\x92\x3a\xa1\x9d\x1a\xe4\xbe\xe7\x06\x2c\x47\x38\x35\x1c\xbf\x45\x64\x6c\x5a\x38\x67\x27\xfb\xfb\xa2\x6d\x61\xe1\x35\x4d\xa7\xc9\x1c\x7b\x2e\x1a\x27\xd2\x80\x67\x87\x5f\x10\x1f\xe1\xf0\xc9\x88\x3f\x77\xc8\x08\xe1\x74\x9f\x84\x79\x4a\x6c\xcf\xed\xa4\x9f\x79\x2e\xfa\xcc\x73\x31\x23\x29\x21\x74\x5a\x94\x3e\xcf\xb7\xfa\xc8\x72\xea\xdc\xb7\xab\xbe\xfc\x4b\xeb\xaa\x72\x57\x89\x6e\x2c\x8f\xd4\xb3\x34\x5a\x8a\x55\x3a\x5a\x33\xe3\x9a\xe4\x83\x59\x76\x70\x86\x79\x6f\xe9\x94\x8e\x48\xc0\xd6\x57\xdf\xbf\x7c\x16\x58\x10\x33\x5c\x2b\xec\x7d\xb0\xc2\x15\x29\x7d\xe9\x36\x4f\x89\xe5\x7a\x7e\xb7\xd7\x1f\x0c\x0f\x47\x47\x4f\x8f\x9f\x3d\xff\xf2\xab\x17\x2f\xbf\xfe\xe6\xd5\xeb\x6f\xdf\x7c\xf7\xef\xef\xdf\xbe\xfb\xe1\xe4\xc7\xff\x7d\xff\x93\x65\xf4\x92\xa2\x21\x0e\xf5\xd8\xc3\xb1\x69\xfc\x4b\x0e\x7c\x84\x33\xe2\x8e\xb3\xc7\xe1\x38\xdb\xdf\x47\x31\xb1\xfd\x2f\xec\x78\xb3\x49\xd0\x67\x76\xb2\xef\xa1\xfd\xe2\xe0\x85\x60\xaf\x23\x66\x67\x08\xa1\xcf\x92\x71\x44\x3c\x42\x48\xbc\xd5\xb2\xc2\x09\x72\xdf\xce\xf9\x6d\x87\x3b\xc4\x76\x8f\xd5\xe6\xb9\x60\x87\xd7\xaa\x74\x41\xbd\x8f\x5b\xea\x64\xcb\xb6\x69\x31\x61\x48\x7b\xff\xb2\xec\x9f\xf8\x15\xfd\xe7\x3d\x79\xff\x34\xef\x1c\x9c\xe8\x09\x28\xe0\xb2\x5c\x87\xcb\xe5\x24\x82\x86\x7a\xa3\xa1\x8b\x5d\xec\x61\x3a\x75\xe7\x13\xfe\x27\x70\x31\x9d\x7a\x73\x38\xc7\x07\xcf\x3e\x7f\xf6\xe7\x81\x8b\xb8\x9a\xca\xd5\x14\x73\x13\xf7\xa9\xb9\x89\xab\x7b\x02\x3f\xc4\x59\x98\xf3\x48\xe3\x29\xea\xef\xea\xa4\xbf\xa7\xcb\x8d\x70\x39\xb9\x63\x93\x7b\xac\xe3\x8f\x7f\x82\x4f\xc4\x9f\xd4\x2e\xac\xf7\x6a\x99\x80\x43\x9e\xde\xec\x81\xcc\x09\x37\xf9\x8a\x6e\xf1\x40\xfe\x8a\x7e\x8a\x07\xf2\x6e\xff\xe3\xca\xb0\x79\x4a\x0b\xbf\xd9\x77\x40\xa4\xc2\xff\x78\x2b\x68\x78\x53\x01\xfd\xe3\x2f\x68\x60\xa6\xe3\x48\x83\x73\xd9\xbb\x54\x68\x82\xcd\x8a\xd7\x8f\xf7\xa9\xb8\xba\x27\x77\x11\x66\xbf\x6f\xdd\x90\x4b\xb1\x00\x40\x18\x76\xce\xa5\x4f\xcf\x7b\x4a\xd6\x47\xcf\x82\x83\x9f\xed\xa3\x67\x53\xb7\x33\x9a\xaf\xfd\x1c\xcd\x96\xeb\xc3\x7c\x7a\xd4\xf9\x09\x12\x3c\x3f\x7f\x74\x80\x8f\x9e\x03\xd0\x73\x13\xa8\x9b\xcf\x96\x6b\x6f\x00\x9f\x5f\xc1\xe7\x57\xdb\xca\x10\x40\xef\x00\xe8\x9d\x09\x24\xbf\xfc\x04\x5f\x7e\xd2\x5f\x74\xce\x1e\xaf\xc3\x77\x39\xd0\xd3\x23\x0e\xf4\xf4\xa8\x9e\xfd\x29\x20\xf7\xb4\x84\x9c\x40\xfb\xe9\x57\xf0\xe5\xab\x52\xc1\xb2\xd4\x41\x81\xdf\x21\xc0\xbe\x00\xd8\x17\x35\xd8\xa2\x19\x3d\x80\xfb\x1e\xe0\xbe\x37\x6b\xf3\xbb\xb9\x80\xf6\x0c\x68\x00\x7e\x0f\xc0\xef\x77\xb6\xec\x18\x6a\x3e\x7e\x61\x96\xd8\xaf\xf6\xc0\x31\x54\x7b\x5c\xaa\xd6\x03\xc4\x8f\xa1\x8e\xe3\xf7\x3b\x89\x7f\x0c\x24\x3e\xfe\xa9\x84\x35\xd4\xfe\x0c\xa8\xf7\xec\x79\xbd\xe0\x67\xdf\xc0\x97\x6f\x4a\x5f\x80\x06\xcf\xde\xc0\x97\x37\x4d\x74\x15\xa5\x3e\x87\x52\x9f\x3f\xaf\xf7\xd6\x73\xe8\x93\xe7\x5f\x95\x30\xe9\xc3\x97\xb7\xf0\xe5\x6d\x1d\xc7\x2f\x5f\xf2\x2f\x5f\xbe\xac\x63\xf2\x25\x60\xf2\xe5\x9b\x86\x2f\x40\xb0\x2f\xcb\x04\xfb\xff\xc8\x7b\x13\xee\xb6\x6d\xe5\x71\xf4\xab\x58\x3c\xbd\x3c\xc4\x15\x24\x4b\xce\xe2\x84\x32\xa2\x93\x66\x6f\x13\x27\x8d\x93\x74\x91\x75\xf3\xa3\x44\xc8\x42\x42\x93\x2a\x08\xd9\x4e\x2c\x7d\xf7\x77\x30\x58\x08\x90\x94\x93\xf6\xf6\xbd\xdf\xff\x7f\x5e\x4e\x2b\x13\xdb\x60\x1b\x0c\x06\x83\xc1\xcc\xc0\x19\x97\x21\xb4\x56\x66\x7d\xf6\xa3\xcc\xfa\xec\xc7\xb6\xee\x28\x60\xcf\xa0\x3b\xcf\x9e\x34\xe7\xf1\xa0\x5a\x05\xcf\xa0\x95\xcf\x5e\xdc\x80\x41\xd0\xcf\x67\xb0\x5a\x9e\xbd\x6c\xb6\xf9\x19\xb4\xf9\x99\xd7\xe6\xc3\xfa\x54\x3e\x83\x75\xf4\xec\x5d\x1b\x4e\x55\xcd\x82\x71\x7b\x0e\xf0\x9e\xfb\x63\x70\x08\x29\xef\x21\xe5\xbd\x37\xd6\xd0\x86\x17\xd0\xd5\x17\x2d\x5d\x75\xc6\xe3\x05\x74\xe1\x85\xdf\x85\xfb\x90\xf2\x0b\xa4\xfc\xd2\x3a\x96\xd0\xfd\x17\xd0\xa8\x17\x55\xa3\x06\x30\x0f\x03\x8b\x77\x2f\x00\x0f\x5e\xf8\x78\x00\x13\xf5\x02\xba\xfe\xe2\x5d\x0d\x38\xcc\xa4\x37\xb7\x90\xfb\x27\xc0\x8d\x9f\xda\xb1\x14\x72\xfc\xfc\xab\xcc\xf1\xf3\xaf\xbb\x67\x4c\xe7\x83\xd5\xf3\xf3\x1f\x3e\xf9\xab\xaa\xbb\x25\x33\xbd\x04\x2c\x7a\xf9\xa3\x9b\xa9\x31\x23\x2f\x1f\x41\xa6\x47\x37\xd4\x08\x03\xfc\x12\x70\xe9\xe5\x8b\x1b\x69\xc2\x4b\x18\x8e\x97\x2d\x14\xf5\x25\x4c\xef\xcb\xf7\x37\x37\xf8\x03\x64\xfa\x70\x03\xbe\x42\xbe\x57\xd0\xe6\x57\x8f\xbe\x63\x25\xbd\x82\xcd\xe4\xd5\xe3\x96\x75\x02\xdd\x7f\x05\xc8\xf5\xaa\x85\xd8\xbc\x02\x62\xf3\xea\xe7\x5d\x2d\x1e\x54\x75\x00\xfe\xbc\xaa\x13\x60\x99\x02\xe3\xf1\xaa\x8e\x1e\x30\xe1\xee\xe0\xa9\x0a\x61\x88\x5e\xbd\x6f\x45\xd4\xfb\x9a\x9e\x03\xd8\x63\x40\xf6\xe3\x97\xad\x39\xa1\x5b\xc7\x80\x69\xc7\x3e\x15\x82\x0d\xe0\x0d\x74\xeb\xcd\xcf\xbb\x56\x13\xcc\xd6\x1b\xa8\xe0\xcd\xcb\xe6\x62\x7c\x03\x4b\xe1\xcd\xc9\xae\xfd\x43\xd5\x01\xdd\x7e\xe3\xa1\x81\x4a\xf9\x05\xf6\xcc\x5f\x1e\xde\x80\x6d\x90\xef\x2d\xb4\xff\x6d\x73\xa5\xd4\x48\xcf\x5b\x68\xce\xdb\x93\xe6\xf4\x9d\x40\x4d\x27\xde\xee\x7c\x50\x1f\xf2\x13\x40\xa4\x93\x26\xf2\x2b\x42\xef\x0c\xf9\x09\xe0\xc9\xc9\x93\xe6\x56\x70\x02\x0b\xe3\xc4\xdf\x0a\x80\xae\x9c\xc0\x50\x9f\xfc\xdc\x52\xe6\x15\xa4\xbc\xfa\x3e\xb2\x71\x02\xcb\xe2\xe4\xc3\x8d\x7b\xf6\x3b\x98\xb2\x77\x2d\x04\xf0\xdd\x31\xa4\x1c\x37\x9b\xf1\x0e\x10\xf7\xdd\xdb\x5d\x6b\x1a\x08\xf3\x7b\x18\xc8\xf7\xde\x40\x3a\xac\x8a\xaa\xe3\x03\x64\xfa\xf0\xb0\x39\x0f\x1f\x60\x77\xfd\xf0\xec\x46\x7c\xfb\x0d\x46\xea\xb7\x9f\x1b\x74\xc3\x51\xac\xfe\xe9\x6f\xdc\x38\xf9\x07\x9b\x4a\x2e\x68\xcf\xfb\x93\xd3\xf2\xb4\x37\xed\xee\x9f\x31\x90\x03\x78\xb2\x04\xcc\x08\xb8\x7d\x2a\xb5\x5f\xa3\x83\x5a\xba\x35\xab\xb7\xc7\xf2\xbd\xdf\x69\x18\xfe\x4e\x27\x6c\xaa\x5e\x56\x83\xd5\x27\x7b\x9d\x36\x2f\xd6\xb9\xe0\x5f\x1e\x15\x69\xfd\xc2\x4b\x35\x89\x7a\x4d\xfa\x8f\x1e\xa0\xf6\x56\x99\x5a\xe5\x09\x3f\xa2\xba\x71\xb7\x51\x97\xda\x76\xde\x46\x8e\x40\x03\x10\x6b\xff\x0c\x2b\xb9\xbf\x2b\x3e\xea\xdd\xb9\x83\x94\x92\x43\xb4\x2f\x87\x1b\x1f\x6e\xf7\xcf\x64\xc9\x74\x3d\xa7\x46\x06\xad\xee\xcb\x22\xd1\xa5\xe8\x5f\xf7\x0f\x65\x6b\xbe\x71\xcb\xc6\x66\x49\xee\xdf\x25\x3a\x9d\x9f\x5a\xdd\xfd\x5f\x28\xb9\xf6\xcc\x98\xbc\x10\x58\x59\x6c\x79\x22\xb0\xb6\x73\x11\xbf\x13\x18\xde\x14\xc7\x4f\x05\x36\x4f\x84\xe3\x4f\x02\x5b\x2d\x89\xf8\x99\xc0\xfa\x3d\x67\xfc\x1e\x3e\x55\x7b\xe3\x3f\x05\xd6\xef\x13\xe3\x5f\xe1\x53\xc7\xff\x24\x81\x2b\x0b\x14\xf1\x6b\x81\xed\xfb\x9e\xf8\x37\x28\xad\x34\x2d\xe3\x1f\xa0\x88\x0e\xfc\x2e\xb0\x79\x7a\x15\xff\x22\x30\x3c\x57\x8a\x7f\x16\xd8\x9c\x9b\x62\x41\x71\xf5\x22\x3c\x7e\x23\x30\xbc\x9e\x8e\x1f\xcb\x72\x60\xa8\x2e\xa6\x14\xcb\x73\x71\xcc\x29\x5e\xf3\x2c\x66\x14\x7f\x2a\x8b\x3c\xce\x29\x76\xb5\xa6\xe7\x5e\xd0\xe8\x22\xa7\x14\x5b\xed\xe8\x65\xf5\x6d\x92\xd7\x14\x2b\x5d\xd0\x78\x45\xb1\x55\xad\x8c\x17\x14\x6b\x7d\xc3\xf8\x8c\x62\x7a\x41\xf3\xf8\x9c\xe2\x22\x4d\xe3\x0b\x8a\x95\x6e\x57\xfc\x45\x42\x53\xaa\x55\xf1\x8c\x62\x50\x50\x8a\x1f\x51\x0c\x6a\x24\xf1\x43\x8a\x95\x42\x49\x7c\x42\xf1\x79\x32\x8f\x3f\x50\x0c\x3a\x1e\xf1\x47\x8a\xb5\xe6\x46\xfc\x9c\xe2\x55\xc1\x45\x7c\x49\xb1\x56\x40\x88\x5f\x51\x0c\x5e\xb8\xc0\x34\xa6\x8b\xe9\xfa\x88\x28\xd7\xa5\x5e\xbb\xde\xd3\x99\xfa\xd9\xd1\x02\xd9\x79\x80\x64\xd8\xc9\x85\x30\x0f\xc3\xc6\xb9\x97\xdd\x7c\xa3\x48\x49\x67\xe0\xfb\x86\x54\xe2\x53\xee\x3a\x16\xd4\xf7\x85\xdc\xb8\x08\x04\x07\x56\xee\xc5\x42\x42\xb2\x49\x56\x89\x44\x47\xe6\x89\x83\x6d\x9b\x7b\xf7\x96\xd4\xaf\xf3\x85\x1f\x01\x1e\xb6\xd8\x22\xea\x94\xf0\x76\x91\x95\x4f\x94\x27\xc3\x27\x16\x98\x77\xf5\xcd\x16\x11\x28\x7f\x7f\x2b\x1f\x48\x02\xdb\xb4\x71\x6d\x23\x31\xc3\x93\x04\x7b\xad\x56\x2e\xdc\x70\x80\xda\xe4\x83\x78\xc1\x32\x7a\xc2\xbe\xd2\xff\x66\x92\x0d\x8c\x1b\xe7\xd8\x64\xfa\x5b\x53\x2c\x08\xeb\x9f\xb3\x5c\x96\x1f\xdb\xaf\x78\x80\xe5\xd8\xe0\xa4\x21\x38\xe7\xd6\xf8\x71\x94\x38\x53\x5e\xb2\xaf\x54\x16\x89\x92\x07\x44\x84\x61\x72\x24\xa1\x26\x57\xaa\x55\x1d\x8a\x00\x51\xd4\xe5\x53\x73\x88\x4d\xfb\xd5\x08\x0b\x6c\x8b\xb6\x0e\xab\x51\x69\x89\x5f\x52\x5c\x69\x67\xc4\x57\x14\x3b\xfa\x0b\xf1\x1f\xb0\xe0\x40\xb1\x20\x7e\x42\xb1\xd5\x32\x88\x5f\x50\xac\xaf\xea\xe3\x77\x14\xf3\x75\xe6\xce\x8f\x23\xdc\xe3\xfe\xf4\xf0\xb6\x1b\x79\x8e\xab\x07\xc7\x60\x1d\xd5\x57\xef\xe9\xcf\xd7\xa5\x28\xce\x65\x56\xad\x6e\xc0\x77\xa9\x1b\xb4\x28\x0a\x00\xfe\xfc\xb7\xb8\xf3\x4d\xbc\xf9\x6f\x70\xe6\x29\xcb\x68\x39\xae\x3e\x01\x6b\x60\xf2\x6c\x8a\xfe\x8c\x2d\xc1\x50\x32\x47\xe7\x0a\x9b\x4f\x06\x75\xc7\xab\x61\x68\x33\x10\x51\x05\x8e\x48\x8b\xc8\x54\xf5\x42\x62\x8e\x55\x90\x12\xb8\x1d\x71\xd4\x5d\x6e\xfc\x9a\x62\x76\x9e\x9c\x7d\xff\xd0\xb6\x8b\xee\x00\xc6\x8d\xc3\x0b\x39\x10\xe6\xe3\x9c\x5e\xee\xbd\xe1\xc5\x39\x2b\x81\x6b\x80\x0b\xf0\x36\xf5\x8e\x6f\x13\xe3\x4a\x19\x5a\xae\xcc\xa4\xa2\xc3\x49\xe5\xeb\x4e\x2f\xca\x04\xe1\x8c\xe4\x7d\xf1\x65\x45\xc7\xea\x8f\x77\x6d\x0a\x34\x94\x92\xcc\xb9\xd6\x0c\xa0\xc1\x01\x21\xd9\x64\x30\xb5\x57\xbe\x9a\x5a\xcb\x3e\x80\xb3\xd8\x11\xcc\xf7\xaf\x2c\x15\x4b\x52\x7d\x8e\xab\xcf\x78\x80\x21\xf0\x9c\xb2\xb3\xa5\xc6\x14\xf5\x3d\x76\xbe\xe3\x01\x2e\xfb\x45\x9e\x15\x49\x4a\x40\x57\x81\x92\xb2\x7f\x29\xcb\x3f\x70\xc0\x86\x61\xd9\x5f\x42\xfe\x07\x2e\x20\x19\x0d\x79\x35\x99\xa9\xe5\xd5\xb1\x2a\x2f\x16\x51\xbb\x41\x02\xe8\xad\x44\x1c\x0d\x0b\x9b\xe2\x53\x84\xb6\xd0\x38\x50\x16\x51\xad\x13\x51\x5b\x49\x9d\xb3\xe4\x73\xf2\xfe\xed\xcb\xfe\x1c\x98\x13\xf5\xfc\xfd\xfd\xdb\x97\x51\x8e\xb6\x74\xb3\xd9\x5d\xb4\x8e\xa2\xae\x5c\x19\x9b\xab\xfe\xf8\x33\xc5\x6c\x15\xbf\xa5\x18\x6e\x0c\xe3\xc7\x92\x09\x62\x69\xfc\x14\x98\x0c\x1a\x7f\xa2\x58\x0b\xcc\xe3\xf7\x92\x0f\x01\x81\x78\xfc\x03\xc5\xae\xd8\x3a\xfe\x53\x26\x95\x9f\xe3\x5f\x29\x96\xfc\x67\xfc\x13\x75\xce\x0d\x3f\xff\xad\xdb\xc5\x86\x4f\x5a\xad\x6b\x81\x70\xee\x69\xed\x83\x5e\x90\x24\x7f\x39\x69\xfa\x37\x76\x0b\x4e\xd8\x74\xfc\x8b\x3c\x20\x44\x28\xa2\x28\x56\x9f\xb5\x0c\x32\x05\xe7\x15\x01\xcd\xdb\x14\xc9\xf3\xef\xbe\xba\xfb\xed\xff\xb2\x9e\x77\xbe\xd1\xf5\xfa\x83\x84\xdd\x3d\x17\xfc\xff\xde\x9e\x77\xda\xba\x9e\x17\xe2\x1b\x7d\xd7\x27\x49\x4e\xae\x93\x3c\x8d\x7f\xa6\xb8\xe0\xf1\x6f\x92\x89\x17\xb1\xe0\x5b\xf5\xe4\x89\x13\xa5\x39\xa5\x2c\x8e\x57\xfe\x72\x21\xec\x39\xcc\x45\xd7\x5b\xb5\xde\x1d\x3f\x33\x99\xf1\xce\xaa\xeb\x7e\x65\x7c\x20\xcc\x39\x3d\xa7\xb9\x78\x24\x0f\x7a\xa4\x35\xb6\x3b\xc4\x9e\xef\x59\xf2\xd4\xec\x4e\xff\x13\xac\x4b\xba\xa7\x94\x56\x8d\xb5\xb6\xa8\x52\xaa\xb9\xfa\x95\xce\xc0\x91\xde\x0f\xd7\xad\x80\xb7\x11\xba\xde\xdb\xa2\xff\x41\x11\xc2\x42\x37\x19\xdc\xe0\x6b\x33\x1d\xde\x85\xaf\x76\x82\x0b\xe6\x1a\xc7\xb4\x9f\xac\x45\x61\xba\xa7\xed\xf6\x6b\x93\x65\xe6\x9e\x76\x1c\x71\xb0\x05\x62\xda\xe3\x1a\xd0\xe6\x31\x03\x3b\x68\xfd\x84\x9f\xad\x65\x7b\xca\xcd\x66\x32\x45\x38\xef\xab\x77\xef\x6f\x78\xb1\xf2\xa1\x87\xe1\xee\x34\x87\x65\xb8\x21\x93\xab\xef\x66\x54\x4e\x9a\x6e\x7b\xc1\x87\xb3\x3c\xa5\xc8\xd3\x85\xb1\x65\xad\x9e\x3c\x51\x1b\x56\x7e\xa3\x3f\x98\xf3\x86\x75\x4b\xcb\x27\x7e\x99\xe9\xa8\x11\x43\x98\x88\xa8\xf6\x34\x84\x45\xbd\xff\x4c\xbb\xa4\x29\xa9\xe7\x97\x83\xe1\x06\x1c\xb4\xdd\x22\x18\x3f\x9e\x7c\x69\x1f\xad\x1d\x49\xde\x60\xed\xca\xf3\x8f\x8f\xd5\xc7\xbf\x35\x56\x8e\x43\x5f\xe3\xb5\x9e\x17\x97\x2f\x04\x3d\x2f\xab\xe3\x65\x72\xe3\x90\x82\xdf\x83\x49\x3e\xdd\x31\xb0\x93\x7c\x8a\x13\xd4\x1c\x5e\xa5\x36\x98\xa0\xed\x56\xd9\x4c\xff\x06\x22\x4f\xa6\x68\xab\xb4\x24\xdb\x96\x0e\xd7\xeb\xc6\x64\xb5\xb2\xaf\x30\xf4\x87\xb5\x36\xea\xcc\x19\x56\xe5\x39\xfd\x03\xb8\x57\xf1\xa2\x3e\x6e\x36\x1d\xa1\x7b\x3f\xe6\x92\x25\x3e\xa3\x39\xe5\x6c\xfe\x44\x46\x31\x50\xb6\xaf\xc5\x18\x47\xd2\x7a\xc5\xc6\xa6\xb8\xd1\xe8\xe8\x30\xe5\x5b\x43\xc6\x19\x87\x55\x5a\xd3\xcd\x8f\xec\xcf\x93\x2c\x8b\x28\x42\xd8\x6f\x95\x7e\xd8\x7e\x12\xe7\xbe\x3b\xeb\x33\xe3\x4c\x4f\xd9\x74\x77\x1f\x92\x7f\x88\xd5\x5c\xb6\xe6\x4b\xc2\x30\xaa\x81\xf2\x46\x9b\x81\xbf\x16\x0f\xde\xc7\x58\x89\x1e\x5a\xe1\xb1\x45\x94\xd5\xfd\x96\x66\x08\x5d\x57\x75\x4c\x6a\x9e\xce\x32\x83\x6b\x6d\x95\x83\x79\x01\x5b\xd6\x41\x1d\xb9\x44\xb7\x70\x82\x99\x53\x33\x66\xfe\x49\x52\xed\xa9\xdb\x33\x2a\x1e\x5b\x7b\xc5\x6b\xab\x97\x62\x72\xc9\x59\x95\xe3\x5b\x9a\xd5\xed\x05\x2b\xf7\xe1\xad\xd1\x8e\x25\xe4\x35\x6d\x28\x93\xa2\xf1\xb7\x0b\xc5\xea\x95\xb6\xf0\x22\x95\xfa\xa1\x0b\x88\xc6\x7e\x8e\x6d\x99\xe4\x4c\xb0\xaf\xd4\xf3\x97\x83\x73\xa4\xdd\x89\xe8\x54\xf5\x02\xbf\x0a\x4d\xe8\xd4\xfa\x83\x4c\x94\xe6\xb8\x9f\xc8\x09\x15\x93\x44\xb5\x33\xe2\x38\xd1\x87\x2c\xbb\xac\xac\xa5\x0f\x06\x7e\xb6\xe4\x6f\x87\x10\xc0\xe0\x09\x9d\x12\x8e\xb0\xcd\x91\x43\x8e\xbc\xca\x91\xeb\x1c\x7c\x6b\x71\xc6\x9f\x0b\x83\x4f\xde\x74\x51\x4c\xe1\x41\xd6\x1b\x87\x84\x8c\xc5\xa4\x19\x39\x8d\x65\x2c\xb4\x1c\x1c\x0c\xf9\xd4\x08\x30\xc3\x3e\xdd\x50\xde\x84\x94\x0b\xd8\x09\x9f\x6e\xb7\x35\x1e\x43\xb9\xdf\x47\xd6\x09\x97\x51\x6d\x7e\x6d\x37\xc0\x92\x4c\xa6\x8d\xe4\x4a\xf3\xd9\xd0\x7c\xeb\x53\x7f\xb6\x66\x59\x6a\x5c\x88\xac\x39\x64\x7a\x74\x33\xe0\x85\xf1\x6f\x23\xa3\x5f\x8b\x25\xe5\x1f\xcc\x33\x0a\x0b\x76\xbe\xe6\xe6\xd5\xc1\xb7\xb2\xb2\xf2\x18\xfc\x97\x59\xcf\xff\xac\x84\x22\x8f\x92\x2c\xf3\x62\x55\xb6\x1f\x59\x9e\xb2\xfc\x8c\x74\x86\x72\xba\x9c\x3d\x4c\x24\x2c\xaf\x2d\x35\x55\xb0\x65\x2d\x6e\x4b\xba\x73\xfc\x29\xf2\xbc\xe3\x4c\xb8\xdc\x50\x2a\x9f\xa0\x72\x72\x10\x66\xbb\x15\xe4\xb7\xf4\x4a\xf0\x64\x2e\x2a\xbf\x1d\xe0\x36\x4e\x3d\xa7\x10\xc6\x09\x48\x35\x25\xc8\x77\xc9\x7f\x43\x06\xbe\x23\x83\x5c\x20\xb0\xbc\xda\x52\xb4\xf3\xdf\x16\x7f\x58\x7a\xbf\x79\xe4\x18\xaa\x7a\x54\x64\xeb\x73\xd9\xde\xbf\x08\x6a\xf4\xaa\x9f\xa4\xa9\x72\x89\xea\xa8\xd9\x7f\x1b\x0f\x31\xc5\x0c\x79\x16\x41\x92\x34\x7d\x58\x7e\xc9\x5d\x9b\x01\xde\xc6\xaa\x45\x15\xc8\x7b\x3b\x46\x51\x2e\x89\xba\x2c\x27\x59\x9c\x79\x93\xa3\x61\xd5\xa3\x80\x91\x4b\x62\x13\x55\x46\x7f\xec\x2a\x82\x99\x6c\x97\xab\x68\xe7\x50\x36\xb5\x49\x4c\x1c\x73\x3e\xed\x7d\x86\x55\xa4\x6d\xee\xec\x48\x35\xa4\xb8\x72\x2b\xb8\x7b\xe8\x6e\xac\xe4\xbf\x2a\x6e\x5a\x61\xe4\x4c\xb2\x57\xff\x75\x97\xbe\x2f\x97\x3b\x01\xd4\x8c\x7f\x93\xde\xfd\x6f\x8c\xc6\x3f\x04\x66\x47\x0f\xf5\x5b\x9f\x33\x01\xb6\xb9\x1d\x6f\x89\x2d\x94\xd8\xb2\xf3\x1a\x4d\xbe\x9f\x86\xdb\x92\xce\xd4\xde\x50\x11\x18\xbb\xbe\xa9\x21\xee\xa1\x40\x72\x14\xc7\xfa\x60\x20\x7b\x6a\xa6\xed\xfb\x5b\xa7\x47\xf8\x2f\x74\xe7\xc6\xfa\x77\x8c\x34\xad\x99\xa5\xe2\x14\xee\x00\x61\x87\x58\xa9\x93\x4c\x6f\x48\x48\xe6\x28\x8b\x37\xb2\xa0\xea\x95\x51\x4b\xe2\xd6\xb7\x94\x55\x4d\x6d\x86\xd0\xd6\xd0\xad\xd2\xda\xe1\xef\x94\x86\x76\x59\x4b\x5a\x9a\x82\x19\xe6\xdc\x9a\xc3\x3c\xa6\x57\x6b\x35\x2b\x74\xac\x85\x2f\x49\x59\xb2\xb3\x3c\xba\x76\x73\xc4\x7e\x81\x2d\xa6\x28\xbe\x31\x03\xc2\x65\x3f\xc9\xf3\x42\xd4\x0d\xed\x3d\xec\xc3\x95\x88\xee\xc2\x2f\x74\x52\xcf\x37\x05\x3f\x2c\x35\xfb\x50\x49\x9e\xc6\xfa\xb3\xe0\xe6\x2b\x2f\x84\x7d\xd1\xc6\xdb\xe0\x58\x28\x9a\xa1\xbc\xb9\x56\x54\x29\x13\x73\x8d\x38\xad\x4f\xbd\xe4\x29\xe1\x7b\x79\x92\xfa\x52\xff\xee\x02\x1e\x4a\x25\xce\xbe\x91\x6c\x5b\x1b\xd5\xe4\x3a\x1e\x22\x3a\x79\x38\xe1\xd3\x69\x18\x06\xea\x9e\x28\xe8\x10\x3e\x16\x76\x08\x20\x31\xd2\x7f\x11\x8a\x41\x51\x5b\xe5\x0c\x43\x5b\x56\xe7\x07\x26\x45\xf2\x47\x70\xfc\xfb\x62\x76\x2b\x70\x1a\x6a\x84\x7c\xf2\xc0\x5e\x3b\x24\xb6\x44\x4d\xf8\x74\xdc\x16\x19\xb3\xb1\x27\xa0\xd2\xe7\x4a\x59\x67\xb5\x40\x25\x0b\x6c\xe5\x61\x3e\x4f\xdd\x10\xac\x84\xa1\x65\x93\xc7\xf6\xcb\xab\xa1\x21\x5f\x70\x8a\x38\x9f\x76\xe5\x55\x60\x26\x03\x1f\x92\x75\xe6\x6c\x46\x87\x63\x95\x13\x6d\xe7\x4b\x3a\xff\x5c\xf5\xe0\xe1\x8e\xd9\x93\x3d\x11\x2d\xe2\x11\xd0\x1a\xa9\xf5\x6c\xb3\xa9\x47\x7d\xac\x68\x93\xeb\x62\x52\x9f\xc8\x81\x83\x50\xdf\x9b\x4d\x94\xdb\xe3\xec\x8e\x71\xa5\x98\xc9\x83\xb0\xe1\x44\xa8\xcd\xdf\xe4\x8d\x73\x50\x1d\x57\x17\xaf\xfa\x29\xec\x8e\xdd\xca\xf2\x9c\x09\xb0\xc4\x37\xe5\xdc\x39\x0c\x4a\x4a\x94\xa0\xc9\x00\x3c\x1f\xdf\x00\x03\xec\x00\xef\x4e\x26\xd7\xf0\x92\xf3\x86\xbd\x35\x99\x7e\x03\xc4\x24\x51\x8e\x7e\x6f\xdc\xa1\x93\xa9\xef\xbe\xf9\x1b\x79\x61\xa5\x4d\x18\xf4\x13\xd3\xa9\xba\xfe\x67\x75\x51\xcd\x38\xe8\x07\xb1\xf2\xd9\xb9\x45\xe0\xcf\xd2\x4e\xa5\xcf\xd8\x56\x72\x62\xe3\x4f\x92\x90\x14\x1e\xbb\x82\x18\x97\x08\x84\xbd\x04\xcf\x26\x5b\x2e\x20\xa7\xeb\xcd\x5c\x6f\xdc\x0d\x09\xaf\x86\x87\xe5\x06\x4d\xe1\x79\xb5\x0f\x08\x35\x21\x51\x84\x1b\xb5\x75\xf8\x98\xc1\x51\xf0\xc7\x96\xed\x9a\xd0\xb8\x0d\x2e\x9c\xc7\x77\x17\xe2\xf8\xaf\xf5\x60\x37\xa8\x1a\x20\xd9\xd3\xb1\x68\x19\xb2\x6a\x40\xd7\xee\x48\xbb\xc4\xe2\x9f\x6b\x93\x40\x28\x8e\xbe\xa3\x46\xf4\x8f\x56\x89\xd9\x76\xee\x9e\x59\x2a\xe7\x99\xf4\x72\xaf\x30\xde\x33\xae\xb7\xf2\xbf\x20\x00\xa9\x66\xa2\x4c\x98\x56\x56\xb7\x14\x45\x01\x97\xb6\xd7\x82\x9e\xaf\x62\x21\x59\x0a\x38\x1e\x07\x32\x1c\xd8\x5b\x71\x09\x34\xe9\xff\xb9\x46\x4a\xcc\xac\x9c\x66\x2a\x0b\x00\x5b\x05\xc0\x01\x0b\xd2\x8c\x7e\xfd\xda\x04\xc3\x52\xf8\x27\x25\x0d\xdf\x82\x85\x9d\x01\xb6\x91\x95\x17\x5f\x21\x09\xac\xf5\x3d\xfd\x8f\xd5\x57\x13\x73\x0c\xb4\xa7\x1f\xbf\xb0\x1a\xc0\x0a\x17\x9d\x47\x4b\x37\xc8\x4a\xfe\x3f\x1d\xb7\x6f\x54\x96\x6f\x93\xd5\x2a\xfb\xf2\x30\xcb\x64\xba\x4d\xb2\xaf\x21\xe5\x3e\xe4\xe6\x00\xf6\xb6\x4f\x95\x76\x96\x8e\xf0\xc3\x0e\x6b\xad\x9c\x6a\x79\x89\x96\x6b\x07\xab\x7b\x1e\x64\x8f\xba\x9b\x5b\x8c\xe5\x98\x82\x3e\x4f\x1c\x7d\x37\xcf\x67\xfd\xc8\x7f\x57\xe6\xca\xc1\xfc\x77\x65\xd7\x0c\x9c\xda\x2d\x1a\x52\x18\x59\xe4\x91\x64\x51\x3c\x39\x97\x92\xd5\xd2\xcd\xa6\x43\x9b\x82\x1b\x8f\x22\xb8\x82\x49\x39\x3e\xdf\x9f\xbb\x43\xc4\x16\x64\xbf\x66\xef\xaa\xa4\x6c\x2e\x55\x7d\x9c\x08\xba\xd9\xa8\x06\x11\xb1\xd9\x18\x7a\xd7\x21\xeb\xed\x0d\x2b\xac\xdd\xad\x3a\x08\xe2\x32\x22\x26\x39\xc8\x55\xb2\x16\x2b\xa4\xee\x41\xcb\xc8\x09\x6d\x1b\x33\xf0\xbe\xa7\xef\x61\x5d\xdd\x96\x6c\x32\x9c\xd6\x61\x8d\x65\x64\x7c\x40\x6c\xc6\xf1\x44\xc6\x4c\xe3\xc9\x14\x7b\xba\x36\xea\x91\xb1\xf5\x15\x56\x76\xbb\x48\x4c\xca\xa9\xc5\xa7\x48\x86\xa2\x5c\x9e\x3b\x28\xe9\x0c\xfe\x02\x66\xe5\x7f\x05\xb3\xf2\xbf\x86\x59\xb9\xc6\x2c\xd9\x38\x84\x46\x74\xb3\x79\xd5\x67\x39\xb3\xfc\xa4\x1e\xb2\x1c\x9f\x68\x51\xb9\xe1\x36\x38\x21\xeb\x31\x8f\x5d\x49\x74\xcc\xb7\xba\xe2\xf6\xb5\x9d\x03\x4b\xba\x35\x0e\xf9\x15\x36\x64\x16\x19\x32\x42\x9e\xbb\x81\x95\x1b\x58\x6c\x36\x59\x1d\xa1\xd0\xff\xdb\x4d\x1d\x99\xa6\x36\x51\x0c\xd5\x63\x93\xfe\x6b\x8a\xc0\xa7\x7f\x06\xc5\x34\x7a\xb5\x6f\x66\xa3\xea\x06\xb1\x52\x78\x00\x93\x11\xee\xe5\x3e\x47\x78\x47\x0f\x3f\xfa\x6a\x00\x80\x53\x6a\xe6\x7d\xe5\x42\x7b\x57\x75\xbd\x1d\x51\x3b\xd7\x09\xfa\xc6\xd6\xc6\x71\x52\xab\x80\xa1\xad\x9d\xb7\x6a\x52\xd6\x92\x4f\xac\x8d\xc2\xf1\x8b\xda\x4c\x15\x02\x19\xab\xcd\x8d\x01\x1b\x3b\xfe\xdd\x07\xd3\x38\x53\x2a\xbb\x8a\x81\x09\xc3\x3a\xe8\xf9\x65\x0d\xf4\x12\xb8\xd2\xd2\x65\x44\xca\x8a\xb3\x40\xf8\x3b\xca\xab\x19\xdb\x35\xce\x1f\xb0\x6e\xcc\x4e\x64\x70\xa6\x7d\xf7\x64\xb5\x00\x81\x26\xdf\x40\xc7\x73\x50\x1a\xfd\xd6\x4e\x2a\xeb\xfd\x07\x77\x6e\x49\x50\x15\xbe\xec\x40\x5b\xaa\x2b\x04\x5c\x72\x51\x35\xf1\xb0\x65\xe7\x68\xd6\xcb\x61\x1f\xe1\xad\x3a\xcb\xb8\xb6\x56\x63\x8e\x46\x8d\x4b\x5c\xd5\x66\xb5\x33\x81\x55\xfa\xbc\x0b\x8a\xe4\xdf\x60\xdb\x26\xf9\x14\xda\xd1\x6c\x4c\xa6\x69\x13\xf4\x52\xe6\xdb\xfe\x5d\xca\x34\x56\x18\x11\x77\xa2\xec\xbb\xf6\xa2\x1a\x88\xd6\x55\xd4\xc8\x23\x97\x4f\x23\x46\x57\xfc\x3d\xab\x52\x72\x54\x37\x22\xae\xa5\xa3\xde\x2c\xb5\x50\x52\x14\x2b\x40\x93\xc1\x74\xbb\x6d\x99\x9c\x9a\xe7\x66\x6d\x4a\xcc\x5e\x8c\x58\xcb\x27\xd7\x5b\xeb\x0c\xd1\x97\x6e\x3c\x2d\xb8\x69\x5d\xdb\x25\x14\x00\xc7\xc5\x8d\x85\x92\x59\x09\xf7\x6f\xfa\xa6\xe6\xf5\x4a\x16\x2c\xa1\xa4\x65\x9d\x6b\xfc\xa5\x23\x64\x81\x98\xc8\xcf\x00\xe2\x15\xd1\x67\xb9\x57\x26\x69\x94\x71\x33\x98\x32\x67\x79\xc1\xe9\xfb\x3c\xa5\x0b\x96\xd3\xd4\x94\xcd\x9a\x65\x5b\x32\x62\x8e\x3b\x03\x84\x70\xc7\xd5\xb3\x2b\x90\x55\xb9\xe7\xd6\x9e\x23\x3c\xac\x08\xc3\x5d\x9d\xdf\x9d\x32\xe1\x9e\xd7\x50\x5e\x79\x0d\x9d\x86\x61\x54\xf4\xcf\xb2\x62\x96\xc8\xf3\xe9\x5f\x2e\x8e\xf0\x75\x5b\x9f\xe2\x0c\xbb\xc3\x14\x27\xb8\x31\xc9\x71\xcb\xc4\xef\x64\x4b\xc3\x90\x4e\xfe\x4a\xfe\xe9\xf8\x2f\xe6\x8f\x4b\xec\xe2\x42\x9c\xe3\xf6\xa1\x88\x8b\xed\xb6\x1d\x23\x7d\xe7\x26\xd7\x5b\xc7\xec\xa5\xe2\x72\x41\x09\x3e\x77\x6c\x4b\x46\x14\x6d\x36\x3c\x0c\xbd\x38\x8e\x10\x92\x5b\x1e\xcb\xb5\x63\xd1\x84\xe4\xd5\xb3\x1a\x7c\x80\x26\xc3\xe9\xa8\x93\x6c\x36\x11\x9b\x24\x8a\xac\x39\x4e\x17\x2a\x54\x93\xcd\x01\x41\xb0\xbd\x4f\xf5\xae\x52\x41\x4f\xb3\x37\xec\x90\xdc\x1e\xa5\x2a\x3d\xff\xdc\x7d\xc7\x73\x40\xac\x29\x9e\xb1\xb9\x2b\x9d\x0c\xa7\x28\xb6\xc6\xb1\x0e\x40\xee\x27\x8b\xc0\x3b\xbb\x21\xc2\x26\x9f\x7e\x2b\xd3\x0f\x50\xa5\xf8\xcc\xc3\x70\x28\x41\x3a\x32\x44\x79\xba\x33\x2f\xf3\x64\x27\x83\x00\x55\xe8\xaf\x61\x05\x71\x49\xb3\x45\x1c\x20\xcc\xb6\x0b\xff\x48\x61\xfa\xe8\x93\x0b\xe3\x1c\x24\xa2\xa4\x26\x26\x72\xa9\x5f\x87\x44\xa0\xad\x2e\xf7\x73\x14\x86\x9d\xe6\x71\x1b\xee\x61\xda\x44\x35\x35\xad\x30\x3f\x0b\x10\x86\x88\x93\xdd\x52\x1b\xa4\x77\x8f\x16\x3d\x02\xbd\x3b\xe6\x37\xc8\x78\x41\x5f\x57\xed\x8c\xdf\x21\xca\xce\xd5\x50\xa8\x2d\xf7\x7a\x8b\x4b\x89\x9f\xf2\x90\x53\xc8\x8f\xfc\x26\x4d\x35\xe3\x63\x46\xb1\xb3\x3e\x41\xe5\xbb\x0e\xec\xd1\x1c\x1c\x61\xf3\x1d\x67\x76\x73\x71\xc8\x9b\x2b\x14\x2c\x47\xb6\xc4\xcb\xcc\x3e\x65\xf6\xc3\xf5\xca\x3b\xa4\x96\xde\x52\x79\x3b\xd5\x6e\x8f\xf7\xe1\x77\xa2\xba\xac\xff\xa4\xae\x7e\xe5\xa3\x83\xbd\x6b\x0f\x43\x58\x75\x64\x47\x2d\xb5\x56\x6e\x36\xdf\x93\xd9\x2e\x0d\xf9\xcf\xee\x46\xaa\xa1\x26\xa4\xf4\xf9\x6a\x38\xda\x10\x9f\xce\x91\xbd\x8a\x6c\x55\xfa\x63\x8b\x88\x9a\xae\x34\xf8\x91\xb6\x94\x42\xa0\xcc\x6a\xde\x29\x26\xb4\x45\x21\xce\xe4\x30\x0c\xf5\xb5\xa1\x7b\xa6\x11\x0f\xed\xb5\x60\xf3\x32\xd8\x90\x70\x73\x21\x1c\x86\xd4\x58\x68\x4a\x40\xcc\x5a\xfe\x6d\x40\x1d\x0f\x52\x18\x06\x7a\xc9\xcb\x53\x1e\xa1\xf5\xab\xd4\xc9\x60\x8a\xe7\xba\x93\xbe\x7e\x5c\x8e\x15\x44\xfc\x3d\x23\x50\x27\x24\xb5\x0b\xe0\x6d\x63\xd6\x46\x8a\xab\x93\x4d\xaa\x6e\x36\xe7\xc0\x0d\x9a\x91\xd7\xbe\x3d\x52\x72\x5d\x99\xc2\x8d\xcd\x65\xaa\xaf\xef\x92\xe0\xc2\x36\x26\xc7\x14\xe1\xc4\x51\xd3\x71\x8b\x35\xd5\x77\x9c\xa2\x68\x3b\x4a\x2d\xf5\x7a\xd8\xba\x93\x6a\x1c\xc7\x1c\xa7\xe0\xb4\xa7\x93\x1a\x8a\x2a\x89\x40\x15\xb0\xd7\xe4\x7d\xbe\xce\x5f\xe7\x08\x57\x08\xa5\x65\xdb\x73\x9c\xe2\xc9\xf4\xaf\x8e\x9b\x99\x93\xdc\xd5\x41\x34\xcd\x6f\xe8\xac\x6d\x6d\x9a\xa4\x87\x0d\xed\xd6\x79\x35\xf6\x92\x58\xce\x49\x67\x0e\x5a\x60\xce\x34\x8f\xfd\x60\x3c\xc7\x2a\x8f\xd2\x6a\x37\xea\x9f\x7e\x18\x74\xf1\x1f\xc1\xd1\x07\x96\xf3\x8e\x2b\x02\xa3\xbc\x8b\xaf\xb7\xca\xe1\xd7\xdc\x3d\x1a\xa8\x4c\xf2\x68\x3f\x6f\x9e\x9f\xe7\xb5\xf3\xb3\x3e\xa3\xd6\xd5\xf0\x6a\xc3\x31\xc0\xb9\x56\xc0\x6a\x57\x27\xb9\x49\x71\x71\x57\x31\x6f\x3d\x56\xaa\xfe\x6d\xba\x26\x37\x2a\xe7\xfc\x55\x05\x9e\x96\x96\xff\x05\x6d\xc9\xbf\x5d\xd7\x5f\xe8\xee\x4d\x27\x7c\xbb\xe0\xbf\x57\xa0\xf8\x6d\xa1\x81\x59\x03\x23\x9f\xab\xaa\x1f\x02\x39\x9e\xe3\xff\xf9\xe1\x5a\xe5\xde\xf6\xff\x07\x81\xcd\x46\x5f\x8b\x7c\xbc\x4b\xad\xdc\xbc\x28\xc9\x7c\xd5\xef\x8a\xb1\x4b\x36\x1b\x61\x6f\xc7\x6b\x17\xf9\x73\xcc\xcd\xe2\xed\x0c\x10\x9e\xcb\xc3\xe2\xf7\xa8\xca\xfe\x0d\x25\xd8\x6f\xac\x83\x21\x08\x18\xbe\x67\x5d\xc9\xd3\xa0\x4b\x8e\x1b\xfa\xec\x6b\x9f\x82\xac\xc3\x70\xdd\x22\x07\xef\x44\xeb\x86\xb4\xea\x3b\x97\x2c\xf0\x7b\xa9\x3c\x08\xa8\x79\x1d\xfc\x8d\xf9\x92\x7b\xa9\xfb\xe2\x19\x14\xe8\xd7\xe8\x7f\x85\x18\xc0\x8d\x92\x1c\x95\x17\x92\x0d\x22\x84\xfd\xff\x8c\x3a\xec\xec\xff\xff\x12\xb9\xc0\xe5\x0d\xa4\x82\x7a\xa4\xc2\x09\x4c\x7e\xb8\x66\xdb\xa9\xa4\x1e\xa9\x3e\x33\x7e\x3f\x1d\xa0\x3e\x1d\xa0\xb8\x44\x08\xb3\x6e\xf7\x9f\x27\x06\xb0\x64\x8a\xef\x66\x68\xae\xb7\x68\xe4\x73\x29\x3f\x46\x6b\x9c\xe2\x02\x14\x73\xe0\x21\x93\x72\x3b\xba\x60\x67\x08\x1f\x7b\x2f\xee\xde\xac\xcb\x65\x18\x46\x6b\x18\x0d\x52\xbd\xd1\xac\x8d\x0b\xf5\x24\x9d\xb2\xeb\x46\xea\x95\xf9\xaf\x55\x38\xbe\x66\xe5\xc3\x34\xa5\xa9\xa9\x21\xee\x0c\xb6\x08\x0f\xb6\x78\xad\xcf\xec\xc4\x7f\x01\x4f\xbb\xbc\x37\x74\x6d\xf2\x8e\xf2\x23\xc2\xe0\x55\x56\x05\x9b\xd3\xf3\xe2\x82\x3e\x14\x51\x2e\xe1\xbf\x85\x90\x5f\x83\x6e\xcf\x64\xba\x45\x7f\x81\x96\xee\x35\xe8\xdb\xb8\x1a\xc9\x75\xec\x0d\x1d\xc8\xbb\xaa\xa0\x66\x8c\xe0\xf8\xe5\x91\x5b\x35\x01\x93\xa9\x64\x12\x61\x02\x5a\x66\x01\x1e\xdd\x79\x2d\xb2\x77\x74\xff\xfc\x03\x0b\x63\x3f\xdf\xe5\xc6\x27\xd3\x06\xa7\x3d\x99\x62\xc3\x04\xc7\x4a\x8b\x7d\x87\xd8\x6f\x57\x8a\x96\xeb\x8d\xbf\x91\x6e\x94\xfa\x46\xf3\x6f\x61\x78\xa0\x0a\x04\x98\x63\x7b\xa4\x90\xa3\xbb\x74\xd5\x54\x3c\x2e\x3c\x93\x19\xed\xc3\x58\x56\x3e\xb9\x5a\x51\xce\xce\x69\x2e\x92\xac\xa1\x81\x54\xe1\x37\x49\xd5\xb0\x16\x17\x94\x73\xa6\xce\xf0\x4a\x40\x11\xa5\xf5\x2a\xe4\xaa\xef\xb4\x61\xd8\x0e\x71\x4e\xda\xe7\x74\xc1\x69\xb9\x7c\xcc\xca\x64\x96\xd1\x08\xe1\x74\xdb\x52\x91\x96\x2d\x79\xaf\x9f\x2b\x8d\x3e\x4e\x1e\x5c\x37\x9a\xa8\x48\x12\x52\xda\x5f\xbb\xa8\x84\xab\x11\xb1\x63\x42\x77\xa5\x4c\xc4\x14\xc4\x30\xf6\x6c\x74\x43\x46\xc7\x39\xe0\x98\xf6\x67\x49\x49\xdb\x1b\x04\x4f\xc0\xdc\x77\x8b\xaa\x12\xf9\xc7\x3d\x90\x39\x95\x7a\x49\x08\x43\xb0\xc2\xe4\x30\x8c\xfc\xe7\x77\xb5\x74\x34\xae\x45\xb8\x22\x27\xd7\x57\x8b\xd5\xe5\x8e\x9b\xb1\x75\x98\xba\x15\xb5\x15\xd4\xde\x94\x5a\x26\xdd\x9e\x5a\xac\xdf\xa8\x7a\xa2\xd3\xb2\xd6\xa4\x46\xf3\x10\xe6\x1e\x8a\xf9\x82\x4b\x8d\x62\x67\x54\xbc\xbe\xb4\x62\xe9\xc7\xb4\x9c\x73\xb6\x12\x05\x8f\xaa\xf4\x37\xbc\x10\x85\xf8\xb2\xa2\xa0\xfa\x22\x8f\xe7\x39\x11\x13\x3a\xc5\x89\x62\xcc\x74\x4e\x25\x26\xf2\x64\xd3\xd7\x67\x54\xc4\x11\x22\x0f\xd8\x98\x49\x48\x8a\xb3\x13\x28\xce\x71\x49\x45\x9c\x91\x07\xd7\x39\xc9\x70\xd2\x21\xb0\x2e\xc3\x10\x1e\x43\xe9\x5c\x38\x43\xb8\xc3\xfb\xf3\x65\x92\x9f\xc1\xc2\xaa\x14\xbe\x26\xea\x75\xa2\x13\xac\x1e\x51\x65\x48\x1e\x0a\xb2\xed\xb6\x52\xe2\x16\xfd\xd3\xf5\xe0\xe0\xf0\xce\x22\x99\x13\x6b\x8a\x85\xba\xda\x6a\x11\xdd\x6c\x04\xda\x62\x93\x73\xc5\x8b\x0b\xc2\xfa\xbf\x7f\x3d\x8c\xae\x45\xf1\x99\xe6\xb1\xd0\xa6\xba\xbe\xc4\x0e\x34\x49\xbe\xb7\x28\x42\x98\xd5\x5e\xf3\x7b\x6f\xeb\x40\x9d\x46\xdd\xd5\x2a\xd7\xa4\x6f\xd8\x8a\x12\xa1\x88\x0d\xf8\x94\xa7\x2f\x52\x42\xb1\x9b\xe5\x84\x6a\xeb\xd7\x24\xe8\x07\xb8\xba\x9b\x76\xe2\x71\x60\xf6\x8e\x13\xaa\x8f\xee\x56\x4b\xab\x01\x05\x5c\x5c\xa5\x17\x28\xa2\x38\xef\x5f\x3e\xe9\x6b\x27\xa9\xa8\x15\x74\x3d\x33\x50\x32\x9d\xb5\xa4\xe2\xe4\xcb\xf9\xac\xc8\x5e\xe8\x8b\x8d\x08\x6d\xb5\x18\x1d\xec\x3c\x58\x27\x63\x02\x35\x9a\x67\xde\x94\xb0\x3c\x35\x65\xb1\xb0\x9e\x41\x5a\x5a\x82\xb4\x2c\x3f\x30\x7a\x16\x8e\x7f\x57\xd5\x0a\xed\x04\xc0\x08\xf2\x5b\x3b\xbf\xab\x2c\x52\x66\xf2\xa9\xdf\x82\x7a\xe9\xca\x41\x84\xa3\xe4\x43\x27\xc3\xa9\xb2\xa0\xf3\x07\xe5\x45\x24\x83\x48\xd9\x8c\x17\x5b\xc1\x93\xbc\x94\xdc\xad\xae\xcc\xb1\x0a\xdf\x89\x9c\xe1\xb1\x16\x86\x84\x7b\xe8\x75\x50\xa4\x0f\x90\xe4\xf6\x14\x55\x3d\x3c\xee\xe7\x60\x76\x4a\x8f\x14\x74\xc4\x73\x9b\xd0\x3e\x04\x41\x3f\x90\xcc\xaa\x87\x72\x48\x8b\xd8\x45\x25\x01\x6e\x1d\x80\xca\x12\x53\x75\x43\x83\x39\x50\x78\x1d\xd1\x03\x3b\x3f\xe0\xd3\xd5\x8c\xd1\xd8\x7a\xb8\xe0\x93\xea\xee\x6e\x8a\x62\x10\xec\xbb\x3e\x4e\x5c\x13\x4d\xf0\x88\x36\x0c\xc5\x64\x68\x74\xed\x65\x84\xd1\x3e\xcf\x7b\x4e\x42\xe5\x44\x86\x0c\x46\xe2\x88\x8e\x44\xb7\x8b\x58\x97\x04\x83\x60\x5b\xdd\x4d\xb5\xa0\xeb\xb5\x19\x42\x72\x9d\xba\xe8\x10\xb7\x8f\x9c\x33\xce\x71\x0b\x8a\x6e\xb7\x2e\x3a\x5f\x1f\xf7\x3f\x95\x70\xa1\xa0\x3e\xec\x58\x9b\xc3\x8f\x5d\xee\xb5\x74\xc9\x91\x43\x44\x3b\x8a\xb7\x23\x30\xd9\x59\x06\x35\x17\x1f\xe9\x0c\xfe\x32\x41\x8c\x58\xff\xe5\xd3\x67\x51\xde\xff\xe9\x27\x84\xd5\x37\xeb\x97\xc5\x33\xf4\x5f\x90\xca\xfc\x26\x52\xa9\xe9\xa4\x26\xec\xba\xe1\xd5\x6b\x5e\x6d\xc4\x4a\x0b\x47\xa9\x00\x6b\x24\x46\x3f\xc0\x8a\x24\x9c\x5c\x03\xdc\x84\x57\x9d\xc6\xab\xb8\x6a\xdf\x34\x79\x22\x31\xb9\x98\x92\x6f\xe7\x6c\xa9\x80\x28\xd6\xf6\xbf\xd9\x7f\x52\xc6\x09\xeb\x67\xcf\x0e\xa2\x6b\xb9\xf1\xc6\x02\xb3\x7c\xb5\x16\x65\x7c\x2d\x4f\x17\x71\x20\x7f\x03\xbc\xf0\x1d\xa5\xc5\x41\x2d\x22\xd8\xda\x51\x4f\x76\x99\x9b\xc9\x79\xeb\x3b\xf0\x7e\xbf\x32\x7c\xa1\x71\xa9\x62\x2d\xc8\x64\xba\xbd\x70\x84\xf0\x76\x7d\x36\x0c\xd3\xd5\x0a\x2a\x4f\x4f\x5c\x71\x11\x4a\x1a\xa5\x4d\xc5\x1a\x19\xc9\x79\x52\x7e\x76\x6c\x44\xe8\x17\x27\x6e\xac\x01\x47\x23\x84\x30\x95\x58\xf0\xe4\x82\xe6\x02\x3c\xc5\x29\xad\x4e\x41\x82\xc0\x3e\x6f\x83\xdb\xce\x0c\x8c\xd4\xf4\x45\x72\x06\x8f\xe8\x94\x83\x91\x17\xc7\x6f\xde\xbf\xd3\x7e\x44\x04\xbd\x12\x09\xa7\x49\x10\x0b\x12\xc0\xe5\xe6\xac\xb8\x0a\x08\xf1\x8b\x7f\x59\xd1\xcd\x26\xe0\x49\xca\x8a\x1d\x69\x0b\x96\xd1\xb6\xa4\x71\x00\x6c\x0c\x0d\x62\x5d\xad\xeb\xcd\xe4\xe4\xc9\xcb\x27\x8f\xde\xe9\xaa\x21\xd7\x56\x01\x30\xfd\xaa\x1b\xa6\xbc\x19\xb1\xf4\x6c\x98\x6d\xcb\xc6\xf3\xca\xf6\xdc\x66\x03\xd7\xcb\xf9\x9d\xaf\xb0\x0f\x45\x1c\xb0\x6f\x2b\xb7\xe3\x6f\x22\xa0\x83\x63\x1e\xc2\x05\x5b\xbc\xa0\x89\x58\x73\x5a\xc6\x13\xd6\xff\xf3\xf5\xa7\xa9\xc1\xbe\x91\x42\xba\x8c\xd7\xd9\x22\xf3\xcc\x59\x2d\x5c\x59\x81\x61\x8b\xe4\x8c\x1b\x96\x88\xd3\x3c\xa5\x9c\x72\xe2\x68\x85\xeb\x4a\x09\xb3\xeb\x4f\x2e\xbc\x1c\x57\x03\xf7\x92\x95\x82\xe6\x94\x57\xd2\x97\x22\x4b\x81\x45\x24\x81\xe6\x9c\x64\xcf\x08\xcc\xbd\x8e\x28\xb3\x42\x3c\x5a\x26\x9c\x04\x1f\x75\x0c\xdc\x85\x64\x34\xe1\x8e\xb1\x80\x17\x39\xa0\x60\x15\x93\x0b\xca\xf3\x24\xd3\x74\xc7\xc6\xcb\x8d\x21\x42\x5b\xf5\xe7\xda\x77\xf9\x52\xeb\x87\x75\xb2\x13\x55\x43\xa1\xdd\xf7\xef\xc8\xaa\x7b\x40\x4b\x51\x75\x70\x95\x70\xc1\x92\xec\x4d\x51\x82\x04\xa0\x5a\x3b\xd6\x5e\x21\x6c\x41\x74\x57\xca\x82\xf1\x52\x1c\x17\xf9\x2b\xb9\xdc\x0a\x25\x76\x35\xfc\xe4\xa2\x24\xd7\xf7\xe3\x00\x8c\x42\x07\x38\x89\x83\xc9\xc3\xde\x1f\x49\xef\xeb\x34\xc0\xc1\xbf\x03\x1b\x84\x64\x4d\xaf\x93\x3c\xe5\x05\x4b\x1f\x2d\x79\x71\x0e\x5a\xce\x6a\xb7\xae\xea\xb6\x1e\xba\x2a\xd9\x2e\x19\x8c\x68\xa5\xff\x4c\x8d\x51\x1e\x0e\x07\x8e\x51\x30\x0e\x08\xe1\xe3\xc8\xf4\xa3\xd7\x6b\xef\x38\x45\xb1\x6d\xf6\x84\x4f\x75\x01\x18\x2c\x75\x56\xca\xe9\xe5\xde\x5b\x7a\xf6\xe4\x6a\x15\xb9\x19\x91\x72\x80\x42\xf4\x0a\xae\x8d\x87\x99\x9d\xfa\x30\x39\xc0\xad\x8e\x12\xa6\x47\x6d\x2d\xb3\x6c\x40\x52\x8a\xb7\xda\x6a\xde\x37\x20\xe9\xae\xb8\x8d\x5f\x67\x19\x52\x24\xc2\x9a\x46\x26\xce\x32\xa8\x62\xc7\x37\x54\xd6\xbb\xa9\x25\xbd\x56\x70\xba\x29\xed\x45\x8c\x48\x6a\xb1\xa0\xdc\xb3\x77\xf3\xcd\x29\xed\x10\x6e\x9f\x67\xcb\xd2\x8e\x4c\xd6\x4c\xa0\x11\x11\xbd\x91\x2c\xee\xb2\xc8\x52\xca\x23\x8a\x62\xae\x87\x41\xdf\x71\xfe\xa8\x2a\x77\x41\xf9\xe7\x87\x45\x31\x5f\x97\xef\xe8\x95\x46\x42\x67\x99\x55\x2b\x16\x76\x93\xd2\x1a\x42\x91\x7b\xc1\x87\x24\xd3\xeb\xd8\x24\x5e\xb7\xd0\x19\xa7\xd9\x86\x62\xf5\x33\x48\x74\x16\x35\x0e\xa0\x0d\x9a\xba\x14\xf9\x53\x19\x52\x94\x42\xc6\x20\xc3\xb8\xfd\x2d\xd0\xb3\x6c\xcd\x2d\xe4\x1f\xb3\x35\xff\xa7\x00\x7f\xa6\x5f\xd2\xe2\x32\xb7\xb0\x7f\xa6\x5f\x1e\x17\x97\xf9\x3f\x08\x1e\xf4\x90\x5c\xf8\x6f\x64\xc4\x3f\x55\x01\xfc\xb1\xd0\x5f\xc0\xb4\xff\x43\xa0\x57\x49\x29\xa8\x06\xbd\x4c\xf2\x34\xa3\x00\x5e\xd9\x2b\xf1\x2a\xd9\x56\x8c\xcb\x75\x1d\xfd\x34\xfe\x9b\x1d\xaa\xd3\xc0\x4f\x7b\x79\x62\xf0\xb1\x33\xb0\x2c\xfe\xa3\xe2\x7c\x95\x51\x41\x53\xa0\x0c\xd8\xa6\xd8\xfd\xae\x0e\xcc\x38\x51\x7c\x2e\x22\x67\x9d\x37\x36\x57\x7b\xf2\x6d\x6e\x5d\x67\x54\xbc\xcf\x25\x0d\xa7\xaa\x8a\x08\xa1\x86\x6d\xdf\x3a\x38\x2c\x90\xd5\x5d\xd6\x5b\xa8\xeb\xfb\x4a\x42\xc3\x02\x4f\xda\xf7\x3b\xd7\x13\xd6\x25\x67\xc2\x18\x81\xd2\x43\xa9\xb7\x4a\x5c\xf5\x34\x0c\x23\xfd\x38\xa4\xca\x60\x1e\x0f\x55\x31\xad\x3b\xae\x25\x17\xd5\xe2\xd7\x11\x4a\xfe\xf8\x94\x65\x19\x4d\x4f\x04\x4c\xe5\x76\x9e\x70\x2a\x9c\xa7\x87\x92\xa3\x19\x19\xe5\x7c\x05\xb6\x58\x2c\x4a\xe3\x2c\xd9\x0c\x01\x30\x3b\x84\xa4\xc5\x1c\x98\xec\x7e\x32\x17\xec\x82\x3e\x51\x3c\x23\x08\x0b\x02\x75\x4a\xad\xcc\xc3\x55\x26\x9c\x2b\xd0\xf2\x7c\x4b\x33\x0a\x1c\xde\x5b\x89\x72\xe3\x88\x11\x2f\x5d\x27\x9e\x88\x84\x0b\x9c\xb7\xa6\x3d\xc9\x53\x14\xdb\x96\xd8\xe8\x30\x6c\xc6\xe9\xfb\x0e\xa8\x2a\x0c\x23\x4e\x6e\xce\x02\x4f\x2e\x07\x3d\xde\x4f\xd7\xab\x8c\xcd\x61\xc4\xfa\xe7\xc5\x05\x85\xe6\x44\x92\xdf\xe5\xc9\x5c\x50\x1e\xe0\xde\x90\xde\x01\xab\x76\x5d\xde\x97\x2c\x99\x71\xc8\x8e\xaf\x67\xf4\x8c\xe5\x31\xc3\x34\x4f\xe3\x7c\x3b\x62\x44\xf6\xc3\x8c\x8e\x7d\xfa\x42\xc7\x34\x66\xf8\xc6\xa1\xb9\x29\x31\x92\x8c\x68\xec\xe4\x50\xbd\x90\x9b\x45\xd5\xd9\xdd\xc9\x11\x02\x05\xf7\x2c\x4b\x56\x25\x85\xc5\xc9\xa1\x9f\x4f\xf2\xd4\xeb\x65\x6e\x12\x9a\x03\xc0\x64\x92\x1a\xc5\x08\xa1\xed\xd6\x5d\xd8\x4a\x84\x08\x8f\xde\x76\xef\xc0\xd5\xd1\xab\x95\x7d\x19\xf1\x23\x52\xb9\x6e\xb7\x3c\xc5\x84\x4f\xbd\xdd\x77\xc2\xa7\x86\xff\xa9\x6d\xb8\xdc\x48\xac\x3a\xc3\xda\x43\x51\x87\x23\xa6\xba\x89\xee\x0a\xde\x65\xcf\x0a\x77\xc0\xa8\x83\x5b\x87\xf0\x0d\x6c\x19\x86\xdc\xf8\xd4\x14\x47\x7e\xb4\x56\x11\x16\xf1\x00\x6d\x4b\x4a\x3f\x1f\xd3\x2b\x78\x3e\x28\x47\x62\xd4\xed\xea\xec\x19\xcd\xcd\xb5\x8c\xea\xb2\x98\x8e\x2a\x85\x7d\x28\xf8\x86\xd3\x0b\x5b\xb0\xd7\x13\x0f\xc8\xe0\xc6\x22\x4b\xb6\x10\x2f\xbd\x55\xaf\xec\x8d\x8b\xa3\x01\x52\x50\x38\x11\x58\x2f\x45\xdb\x32\x8a\x46\xdc\x36\xa9\x75\x2a\xb4\x98\x90\x39\x0d\xf7\xd2\x95\x47\x13\x77\xba\xd8\x14\x21\x7d\x96\xae\xcd\xa2\x9f\x0b\xfb\xc1\xd6\x19\x66\xa8\xd1\x64\xa6\x59\x2c\x20\xba\x8a\xc1\xb2\xbc\x11\x50\x3e\xf0\x93\x7a\x9e\x5c\xb5\xf2\xc6\x58\x48\x4c\x86\xd1\x7a\x6b\xe5\x04\xea\xd4\x07\xd8\x2a\x69\x36\x6f\x6d\x8a\x40\x23\x5a\x0d\x15\x6d\x0c\x15\x55\x43\xd5\x1c\x61\x43\xe3\x74\x4f\xa9\xdf\x71\x3a\x25\x1c\xef\x1c\x5f\xe3\x31\x26\xb7\x43\xca\x49\xbe\xdd\xaa\x7d\xfd\xa1\x3a\xce\xc0\xf6\x1e\xe9\x07\xa4\xcd\xbd\xd5\x74\x47\x0d\x0e\xb2\x3b\x81\xda\x8c\xbd\x7d\xde\x6a\x9b\x37\xe3\x1e\x18\x61\xb3\xc2\xa5\xc6\xd6\x3f\xe2\x7d\xa0\x8a\x0f\x6a\x58\xaa\xa3\x7b\xc3\xe9\x08\x99\xef\x9e\x6c\xc3\x80\x10\xa2\x23\xc0\xfe\x86\x01\x70\xd4\x7e\xd0\x69\x81\x59\x41\xec\x76\x47\x4e\x17\x75\x24\x36\xd0\xe1\x46\xfd\xe6\x56\xef\x58\x95\x7f\xb5\xa2\x06\xfb\x83\xc6\x0d\x7a\xa4\x1f\xc8\x3a\x51\x83\x06\x9f\xb3\x93\x3e\xa1\xad\x62\xa3\x8d\x8d\x3d\x7b\x84\xb0\x47\xfc\x8a\x43\x70\x19\x04\x10\x4b\xda\x0b\x90\x16\xa6\x01\xd7\xb1\xa6\x43\xfc\xf3\x89\x11\xb9\xdb\xdd\x55\x6d\x37\x70\xfc\x88\x82\xe7\xef\x5e\xbd\x54\x27\x91\x00\x8d\x04\xbc\xbb\xd2\x29\x5a\x7e\x84\x3b\x03\xdc\x19\x7a\xd5\xa4\xac\x5c\x25\x62\xbe\x54\x19\x85\x71\x96\x5c\x6f\xc8\xa8\x31\x38\x95\x39\x43\xe7\x48\x08\x79\x7f\x65\x62\x29\x31\x66\x4c\xe3\x5d\x4c\x61\xa3\xa3\x84\x6e\xb7\xf6\xfc\x50\xa3\x08\x44\xf4\x2f\x97\x6c\xbe\xdc\x6c\xe0\xe6\xfb\x51\x91\xea\xe6\xa8\xa5\xd1\x6c\xab\xd2\xd8\xee\x74\xdc\x96\xd9\xc3\xaa\xe5\x35\x9d\x5d\x74\xe9\x1e\x99\xbb\x43\x34\xba\x47\x08\xc9\x37\x9b\xdb\x77\xe5\xdf\xb1\xb5\x48\xa6\xd6\x2e\xe6\x84\x6a\x9c\x63\x84\xf6\x69\x9e\x62\xd6\xe3\x04\x9c\x74\x73\x72\xfb\x6e\x47\x96\xb1\xe4\x07\x76\x10\x8e\xe2\x3a\x45\xe2\xbd\xa1\xa4\xaa\xba\x8a\x3a\x71\x8d\xad\x1a\x61\x46\x13\xae\xe9\x2b\xb7\xca\x85\x7a\x9f\xe1\x98\xf5\x86\xd5\x05\x9c\x9e\x1a\xa3\xc8\xdd\x19\xe2\x64\x07\xfe\xf5\x57\x1c\x4e\x35\x5a\xf5\x3b\x42\x28\x1e\xde\x52\x7d\x75\x8e\x89\x16\x55\xff\x02\x6c\x14\x1f\x1c\x12\xb8\xac\xd9\x29\xb2\xd2\xb8\xec\x6e\x16\x83\x1b\x19\x6b\x7f\xdd\xec\x6c\x4c\xb3\x53\xdb\xea\xc8\x68\x29\xb3\xc2\x29\xd0\x37\xac\x63\x15\xce\x7c\x1a\x2d\xfa\x73\xc1\xb3\x9f\xe9\x17\x99\x27\xc9\x84\xfe\x3a\xa7\x22\x81\xcf\xe4\xe8\xd6\xc1\x66\x13\x25\x61\x38\xbc\xd5\x21\x24\x09\xc3\x28\x93\xe8\xd0\xcb\x14\x7a\x28\xbf\xed\x8d\x69\xd4\xa9\x18\xf2\xfa\x13\xea\x25\xf5\x86\x08\x61\x83\x7b\x16\x37\x32\x43\xca\x11\x72\xe8\x65\xc4\xf5\x05\x62\x7f\xc1\x8b\xf3\x47\xda\x87\x98\x7d\x8d\x6d\xf6\x46\xe3\xf8\xcc\x34\x4b\xef\xc0\x14\x35\x37\xc3\x96\xdd\xbd\x65\x53\x75\xc6\x8b\x21\xac\xdb\x76\x44\x6e\xe0\x46\xab\xa7\x8f\x1e\x89\x46\xa8\x75\x06\x5b\xd1\xc0\xbe\x31\xc8\x77\x01\xdb\x85\x29\x39\xfe\xbb\x54\x41\x1e\xd4\xdd\x49\xac\x58\xbc\x91\xe6\xea\x46\xfc\x88\x86\x61\x8d\x8f\xab\xf1\xd3\x51\x1b\x2b\xd6\x64\xa7\xb7\xde\xb8\x37\xa4\x02\xad\x92\xac\xad\x5d\x3c\x75\xea\x59\xe7\x44\x12\xa2\x55\xea\x28\x19\xc8\x63\xd8\xb7\x19\x2a\xbb\x6b\x57\x08\xd2\xd6\x72\x8a\x46\xac\xdb\x3d\xca\x8d\x4c\x4f\x42\xe2\x24\x37\x4c\x7a\x45\xab\xea\xe8\xa8\xbb\xe8\xa2\x5f\x42\x68\xe5\x3f\x8b\x3d\xc8\x2d\xdf\xd3\x58\x4e\xb4\x3b\xb4\x02\x6c\x64\x7c\x69\x81\xfa\x5e\x0d\x28\x71\x9a\x82\xc2\x90\x75\xbb\xbb\xa5\xb1\x09\x71\xac\xde\x8c\x9b\x6b\x21\xee\x44\x49\x77\xd8\x5a\x1a\x55\x96\x54\x6b\x28\x96\x3c\x20\x3e\x52\x69\x6a\xdb\xc2\x43\x37\x66\xdb\x89\xf0\xde\xbf\x26\x5d\x2b\x0a\xb6\x77\x12\xd6\x46\xa7\x87\x20\xe6\xf4\xe6\x09\x45\x1b\x9c\xd1\x60\x27\x67\xe4\xb5\x12\xb5\x0a\xd8\xcd\x8e\x5f\xe3\x1b\xb7\x5a\x9e\x69\x31\x73\xe4\xb2\x4c\x03\x0c\xb3\xf9\x8e\x9d\xd3\x62\x6d\x24\x4f\x92\xa2\xe8\x98\x17\xe9\xb7\xa5\xb4\x66\x83\xae\xb1\x5d\x3e\x18\x52\xda\x80\xba\xf3\xac\xc0\xec\x94\xb8\x98\x25\xeb\x4f\x11\x25\xce\x6d\x85\x7d\x2c\x3a\x86\xc7\xa2\xf6\xec\xe9\xee\x6e\xe6\xe2\x41\x85\xe9\x6e\x0e\x10\x6d\xf1\x70\x20\xf7\x2d\x7b\x9c\x50\x53\xeb\x5e\x99\x28\xd0\xad\x87\x8f\xd8\x49\x72\xe4\x8d\x91\x00\xf3\xd3\x35\x62\xa8\x2c\x0a\xfa\x93\xcd\xc7\x1d\x1e\x77\xa8\xab\x79\xe2\x8e\x73\x4e\x82\x60\xe4\x17\xa9\xec\x05\xb6\xf2\x80\xec\x1b\x3c\x60\x2b\x4b\x99\x7f\x4b\x52\x49\x98\x15\x28\x54\xb8\xb5\x6d\xeb\xf7\x75\x7d\xd2\x9d\xe3\x99\x77\x06\xd9\x39\x3f\xdf\xe2\x3e\x5a\xb6\x9f\x2d\x1e\x80\xd6\x65\xad\xcb\x9a\x79\x6f\x5e\x82\x38\xab\xb5\xe5\x3a\xc4\xa3\x62\x23\x8f\x80\x86\x21\xef\xec\x20\xc5\xd6\x30\x27\x47\xd5\xb5\xb0\xdd\x2c\xfc\xae\x5d\x6f\x5b\x50\x51\x1b\x08\x81\x28\x67\x02\xc2\x30\x08\x9a\x72\xe8\x6d\x91\x3f\xa6\xa5\xe0\xc5\x17\xdb\x4d\xc8\x52\x93\x9d\x3b\x2a\x3a\x6a\x1e\xa0\xfb\xd0\xdb\x96\xec\x93\xc1\x34\x6a\x97\xc1\x3b\xef\xbb\x47\x2d\xe9\x64\x32\x35\xce\x76\x4a\x4e\xae\x57\x4a\x45\x20\x4e\xfa\x8f\x16\x78\x5d\xd2\x27\x57\xac\x14\x2c\x3f\x8b\xa3\x01\x66\xfd\x67\xab\x39\x02\xd4\x48\x39\xc2\xe7\xeb\x4c\xb0\xb8\x33\xd8\xe2\x82\x93\x49\x60\x3c\x58\x05\x38\x30\xde\xb0\x02\x1c\x80\x13\x54\xf3\x57\x3b\x47\x95\xc1\x72\xce\x58\x80\x03\xed\x79\x53\x7e\xb1\x33\x26\x02\x1c\x80\x87\x54\xf9\xf7\x82\xe6\x01\x0e\x8c\x9f\xd4\x00\x07\x9f\xca\x42\xc6\x18\x47\x81\xea\xf3\x65\x91\x9f\xc9\x2f\xed\xf9\x53\x7e\x1a\xe7\x81\xf0\xad\x2f\xfc\x03\x1c\x9c\x27\xb2\xe2\x22\x95\x0d\x5c\x15\x5c\xd6\xe5\xb8\x20\x0c\x70\x20\xd8\xb9\xcc\x67\x9d\xa8\xca\x6f\x2e\x9b\xa2\x5c\xd1\x05\x38\x00\x9f\x5e\x01\x0e\xce\x18\x4f\x83\x29\x9e\x73\x10\xa1\x42\x97\x94\x52\xf5\x2e\x0d\x91\xa4\xe5\xda\xbe\xe6\x2e\x40\xab\x3a\xbc\xa5\x0b\x23\x83\xb7\x77\xf6\xbe\x5a\xa3\x51\xe2\x30\x7c\xe7\x8e\x9b\x7a\x56\xea\xd1\x3e\x59\xcf\xca\x39\x67\x33\xcf\x58\x3f\xd0\x81\x86\x09\xff\x57\xb0\x02\x6d\x84\x6e\x12\xbc\x5b\x71\xe8\xbc\x5d\xdc\x8e\xd2\x88\x24\x99\x7b\x17\xae\xbd\x06\xd0\x2a\xb5\x44\xd9\xa8\x99\x12\x21\xd7\x7a\x5b\x4e\x5f\x68\x69\xf2\x6f\xf3\xb3\xd7\xf9\x8b\x9c\x09\x97\x22\xb8\x9a\xdd\xbf\x38\x86\xa4\x29\x79\x70\x0d\x5b\xd0\xe4\x7f\xf8\xd5\x0f\xd7\x74\xfb\x3f\x53\xf5\x10\xbb\xe0\x8e\xb1\x04\xb9\x28\xd5\x9e\x54\x65\x03\x26\xdf\xda\xf2\xa5\xd3\x1a\x14\x43\x80\xd5\xf3\x9d\xa8\x53\xa7\xc6\xca\x5c\x5b\x23\xba\xdd\xdd\xa0\xdb\x3f\x47\xff\xa9\xaa\x0d\x83\x75\x39\x2c\xdc\xa7\xeb\x50\xc8\xd1\x1e\x32\x24\x96\x5f\x69\x04\x34\x79\x6c\x04\x4c\x32\x3f\x4f\x8c\xbc\xbb\x4a\x80\x95\x56\xbe\xc8\x17\x85\xb9\x4c\x9a\xb1\x3c\xd5\xd8\xa2\xe7\x58\x89\x38\xd0\x76\x96\xad\xb9\xfe\xd6\xca\x97\xb5\x3e\x6a\x08\xee\xd6\x04\x8e\xf8\xca\x9d\x09\x7d\xdd\x0e\x04\x10\xf3\x75\x96\x75\x76\x29\x68\xb8\xd4\xb1\x86\xfd\xfd\xa6\x8a\x68\x2b\x0c\xbc\xb3\xf3\xf5\x94\x15\xe5\x25\x2b\xc5\x1f\x94\x17\x68\xa4\x2b\x6d\x8e\xe6\x58\xc4\xad\xcd\x71\xf4\x77\xed\xfa\x80\xad\xec\x75\xae\x87\x54\xee\xba\xad\xab\x4f\xa9\x3f\xb6\x8d\xbf\x5c\x3d\x8d\x89\x25\xbe\xe0\xa9\xf5\x62\x55\xaf\x5c\xef\x3a\xdb\x4e\xa5\x7b\xa3\xda\xb6\x23\x18\x13\x87\xf8\xbb\x6a\x30\x77\xf1\xca\x4b\x66\x5b\x07\x07\xf8\x1f\x45\x9b\x30\xfc\xdb\x38\x53\x4d\x92\xd3\x05\x73\x9f\xbb\x7b\xd6\xb6\x37\x5c\x6e\x53\xa5\xd4\x00\x85\x14\x23\xe5\x2c\x17\xbb\xfb\x5b\x35\x34\xaf\x79\x37\x0e\xac\x5f\x0e\xc3\xb6\xe2\x12\x3e\x97\x22\x38\x74\x14\xf9\xe6\xf3\xdb\x33\x55\xef\x40\x5a\x1c\xa4\xa0\xed\x0d\x58\x21\x47\xa3\x34\x1b\x8a\x46\x59\xb5\x30\x44\x75\xfc\x76\x26\x65\x72\x31\x6d\xce\xe8\xe4\x62\x3a\x99\x57\x47\xfc\x66\x4a\x9d\x76\xb5\xe4\xf0\x88\x58\xb4\x6b\xc7\x33\x6f\xc1\x76\x2e\xb0\x76\xe8\xe8\x86\x2d\x74\x50\x3d\x5a\x72\xb0\xbc\xe6\x0a\x76\x07\x6e\x1a\x72\x5b\x11\x55\x54\x8d\xa6\xdc\x7c\x2b\xc3\x87\xae\xb4\xfc\x9b\xa3\x09\x87\xab\xea\xd5\x94\xda\xc6\x3d\x54\x6b\xc9\x3f\xb2\xc7\x32\xcb\x51\xe4\xf4\x72\x2f\xe3\x35\x3c\xd4\x5a\x05\x2e\xc2\x36\x8e\x23\xb8\x7a\xa9\x60\x78\x88\xc1\x76\xdb\xb6\x98\xae\x7d\xcc\x2f\xa9\xa8\x5e\xbb\x78\x74\x05\x46\x2c\xc0\xea\x34\xf6\x8e\x9e\xaf\x32\xd7\x8e\x5c\x69\x2e\x1a\xd5\x6b\x66\x96\xef\x89\xc9\xc5\x14\x18\x63\x90\xb8\xc8\x89\xa4\xd3\x51\x4a\xe5\x31\x63\x4f\x4c\xce\xa6\xd8\x7e\x5f\x68\x0e\xa9\x62\x2d\x8c\xa3\x38\xd3\x4e\xb0\xd1\x50\xdd\x4f\x05\x41\x9b\x22\x28\x95\xa7\x06\x60\xf4\xe4\x1a\xd1\x0f\x2b\x23\xe5\xa2\xd9\x4d\x48\xd2\x34\x02\x5b\xa3\xdc\x8c\x88\x6f\x93\x4d\x6d\xac\x0d\xde\xa1\xb1\x94\x88\x70\xc9\xbe\x93\x30\xa2\xfd\xb6\xf6\x83\xa1\xde\xb6\x04\xcf\x0a\x52\xad\xcb\xce\x14\x20\xbd\x5d\xed\x42\x50\xec\xa7\x36\x89\x01\x96\xc3\x5e\x39\xf9\x6b\x9d\x43\x2c\x26\xe7\xd3\x96\xb7\xe6\xce\x3b\xe6\xc9\xb9\x33\x77\xe7\x53\x47\x07\xa8\x7e\xd1\xdd\x36\xb8\x8d\x37\xc5\x8e\x59\x98\x9d\x49\xce\xc3\x1b\xab\x08\xaf\x49\x51\x43\x63\xbe\xae\xd8\xad\xc1\x3a\x0f\xdf\x6a\xee\x60\xdc\x15\x37\xae\x11\x68\x78\xd7\xb5\xce\x32\x60\x7b\xab\x43\xa2\xcf\x42\x1b\x13\x0c\xff\x07\x9c\x1c\x71\xa3\x47\x2d\x3a\xe8\x7d\xe7\xbc\xfb\x77\x9e\x4f\xfc\x7e\xeb\x6e\xc4\xfa\x27\x3f\xfe\x89\xb0\x09\xfc\x52\x7e\xb2\x01\x8e\x6e\x54\xfa\x57\xda\x20\xf0\x2c\x77\x12\xc8\xb3\xe9\x19\xcc\x5f\x80\x83\x60\x8a\x21\xa6\xae\xf1\xdf\x9a\x02\xb1\x53\xab\xc1\x6d\xb9\xb1\x38\xb0\x9f\x01\xe6\x57\x70\xcc\x95\x71\xfa\xdc\xab\x3f\x8e\xab\xcc\xfe\x41\x98\x5f\xc1\x49\x18\x12\xd4\x91\x98\x5f\xcd\x8b\xf3\x55\xc2\xa9\x8c\xd3\x9f\x26\xb6\x28\x6d\x6c\x51\xea\x58\x30\x2c\x56\xaa\x68\xf5\x0d\xf1\x9c\xa6\x4c\x3c\x4a\x78\x0a\x29\x36\x24\xd3\xf4\x99\x5b\x26\xd8\xe3\x37\xbf\x4a\xd9\x02\x1c\xe5\x08\x88\x37\x01\x95\x72\xc6\x74\x2c\x1c\xd1\xf9\x15\x9c\xd1\x65\x8c\x3e\xac\xf3\x2b\xeb\xe6\x3f\xa8\xbe\x21\xfe\x82\xe6\x10\x07\xa7\x79\x7e\x05\x07\xe2\x92\x15\x2a\xd2\x04\x64\x8a\x7a\xef\x22\xa3\xd5\x17\xc4\xb1\x8c\x9e\xb0\xaf\xd0\x69\xf3\x2d\xe3\xcf\xe0\x26\x97\xbf\x5b\x26\xf9\x93\x3f\xd7\x49\xf6\xae\x90\x39\x9a\xb1\xb5\xbc\xb5\x4c\x32\xd5\x88\x17\x64\x52\x25\x6a\xe0\x57\x9f\x4a\xd5\x44\x25\x73\xe0\x57\x46\xe8\x20\xe3\x2a\x01\x04\x7c\xbf\x2c\xf2\x33\x1d\xad\x84\x11\xfc\xca\x48\x23\x20\xda\x4a\x26\xe4\x77\x59\x9a\x86\x98\x6f\x37\xde\xe9\x4c\x2d\x0a\x72\x19\xc1\x06\xa4\x57\x52\x0e\x19\xd0\x62\x0e\x95\x62\x65\x1e\xfc\xea\x3c\x01\xa4\x03\xd9\x87\xfc\x73\xf5\x38\x11\x54\xc5\xc0\xa7\x8e\x55\x22\x76\x1d\xaf\x02\x3a\x45\x49\x47\x74\x8a\x11\x95\xf0\xab\x73\x96\x5b\x48\xea\x53\xc7\x3a\x90\x4c\x40\xa7\x38\x90\x4c\x40\xa6\x14\x29\xa0\x28\xc8\x65\xf8\xd5\x2a\x29\xcb\xcb\x42\x61\xad\xf9\x86\xf8\x82\x03\x0a\x2a\xc1\x0d\xbf\x72\x24\x37\x10\xed\x0a\x72\xf8\x95\x11\x45\xc9\xa4\x4a\x2c\xc5\xaf\xb8\xe4\xcf\x21\x52\x5d\xf1\xf3\x2b\x70\x9f\x14\xa8\xbf\x32\x5c\x19\x74\x94\xb1\x55\x48\xa6\x09\x76\x0e\x79\x95\x9c\x88\x5f\x59\x41\x91\x8c\x74\xa4\x46\xfc\x6a\xcd\x61\x75\x80\xf4\x88\x5f\x29\xf1\x11\x44\x68\x41\x12\xbf\xb2\xfe\xe2\x83\xea\x1b\xd6\x2d\x78\x8d\x0f\xf4\x87\xc2\x5f\x96\x2a\xc4\x65\x66\xf5\x52\xbd\x74\x69\xed\xbd\xc8\xc7\x1f\xf3\x68\x52\x2a\xff\x87\xee\xdb\x11\xbc\xae\xbf\x17\x2b\x45\x22\xd8\x7c\x6f\x51\xf0\xb7\x45\x21\xac\xec\xe5\x1a\x88\xa3\x1c\x12\x81\xb5\x20\x10\xcc\x19\x6c\xff\x8b\x67\x58\xe7\x45\x4a\x58\xbf\x78\xf8\xa3\xa1\xc8\xdb\xea\x85\x0c\xcb\x3f\x11\xd6\x9f\xff\x74\x12\x5d\x3b\xd5\x71\x8e\x19\xc7\x79\xff\xa7\x9f\xa6\x98\x9d\xcb\x19\x97\xb4\x3b\xef\xd3\xaf\x38\xe9\xaf\xef\xe0\xa4\xff\xfe\xb7\x69\xf5\x30\xc6\x3a\xd7\x5e\xd6\x1c\xb9\x92\x07\x11\xa8\xfb\x5d\x6f\x51\xfd\xc5\xd9\xb8\xa6\x67\xcb\xb1\x40\x63\x51\xcf\xd5\x5f\xb1\x15\x8d\xa2\x01\x2e\xfb\xef\x51\xb4\x32\x72\x3b\x84\xe2\x68\x80\xb3\x7e\xb1\x40\xea\x1d\x41\x15\xb4\x79\x22\xc9\x3e\xd9\x96\xd9\x68\xd3\xb6\xca\xad\x90\x6f\xed\xec\xa6\xd0\xf5\x56\x72\xd9\x0c\xe1\xeb\xca\x21\xa4\xe5\x4e\x5c\xcb\x1d\x7b\x4a\x84\x95\xa3\x88\xbb\x3e\xe4\x17\xb6\x11\xca\x7f\x26\x68\x6b\x92\x07\x5a\xf5\x93\x75\xc8\xf3\x71\x24\xc2\x30\xea\xb0\xfa\x38\x6c\x36\xcd\xb8\x09\xd8\x44\x6c\x11\x6f\x31\x2c\x27\x01\xf3\x88\xc9\x71\x52\x16\x8d\xa3\x1c\x0f\x30\xc3\x14\x0b\x50\xa9\x51\x5e\x8e\x74\x63\xdb\x5f\xbe\x33\xac\xdf\xe7\x5d\xc3\x39\x20\x5e\x82\x93\x47\xdb\x97\xb3\xff\x33\xfa\x32\xf8\x27\xfa\x72\xee\x6a\x6c\xc2\x24\x3d\xec\x03\x93\x80\x9f\x08\x1f\x8d\x2e\xdc\x9c\x67\x6e\xce\xa5\x13\x70\x4b\x7c\x69\x85\x9d\xbd\x5e\xe0\x47\xd4\x87\x3d\x6b\x85\x2d\x73\x2e\x9d\x80\x5b\xe2\xd1\xae\x76\x6b\xe6\x06\xbf\xa8\x35\xff\xe1\xae\xe6\x9b\x02\xcb\x66\x9c\x5b\xfe\xa4\xa5\xc2\xf9\xb2\x60\x73\x8a\x57\xb5\xde\x7c\x68\xa9\x4a\x67\x5d\xba\x21\xb7\xcc\xc7\x36\xf0\x8a\xff\xc2\xef\x6a\x5d\x79\xde\x9a\x57\xb1\x5f\xf8\x75\x2d\xf3\x65\x5b\x63\x4c\xe6\xa5\x1f\x76\xcb\xbd\x6a\xab\xc4\x72\x72\xf8\x4d\xad\x9a\x97\x6d\xd5\x54\xd9\x97\xf5\x18\xb7\xec\x55\x4b\x55\x96\x07\xc4\x8b\xda\xe8\xfe\xd1\x9a\xfb\x8c\x09\xfc\xb8\xd6\xa6\x27\x2d\x39\x81\x67\xc4\x4f\x6b\x39\x5f\xb4\xe5\xbc\xa0\x39\x3e\xaf\x55\xfe\xae\x25\xa3\xe2\x18\xf1\x97\x5a\xd6\xd7\x2d\x23\xa2\xb3\x2e\xdd\x90\x5b\xe6\x73\x0b\xf8\x26\x63\x89\xd3\x5a\x55\x6f\x5a\xaa\x6a\x29\xb6\xdc\x95\xe2\xc2\x3a\xbe\xb9\x09\x78\x5e\xab\xfb\xed\xcd\x75\xb7\x54\xea\x96\x7e\xdc\x52\x9b\xe1\x84\xf1\xa7\xda\x2c\x3d\x6d\xc9\x2c\x59\x64\x9c\xd7\xda\xf4\xa9\x25\xa3\xe1\x84\xf1\xac\x96\xf9\x59\x6b\x66\x8f\xff\xc5\xeb\x5a\x99\xaf\x2d\x9d\xae\x97\x59\xb6\x46\xbb\x50\x7e\xbc\xa1\x66\xbc\xac\x55\xf9\xfe\x86\x2a\xeb\x75\xb9\xe5\x7e\x68\xab\xc4\x30\xe9\xf8\x59\x6d\x88\xff\x6c\xc9\x7d\x9e\xcc\xf1\x87\x5a\x6b\x7e\x6d\xcd\x07\x4c\x3d\x7e\x5f\x83\xf9\x7b\x4b\xcb\x4d\xde\xa5\x17\x74\x4b\xfd\xd4\x5e\x83\x62\xea\xf1\x0f\xb5\x3a\x7e\x69\xaf\x43\xe7\x5e\xd6\x22\xdc\x92\x3f\xb7\xd7\xa3\xd8\x79\xfc\x67\xad\x9e\xdf\xda\xeb\xd1\xb9\x97\xb5\x08\xb7\xa4\x60\x2d\xf5\xa8\xc3\x0b\xfe\xb5\x56\x0b\x65\x2d\xb5\xe8\xbc\x4b\x2f\xe8\x96\xe2\xed\x35\xe8\x31\xf8\xbd\x56\x07\x6b\xaf\xa3\x36\x62\x95\x52\x5d\x55\x32\x6f\xaf\x47\x8f\xc1\x4f\xb5\x7a\x92\xf6\x7a\x6a\x23\x66\x22\xdc\x92\x59\x4b\x3d\x79\x91\xd3\xd7\x0b\x7c\x52\x43\xc7\xb2\xa5\x12\x9d\x75\xe9\x86\xdc\x32\x45\x1b\x78\xcd\x0b\x9c\xd5\xe0\xcf\xdb\xe0\xfb\x7c\x43\xde\x64\x19\xd2\x96\x1a\x8a\x34\xc5\x17\x35\xe8\xeb\xb6\x7c\xd0\xf8\x87\xb5\x9c\xcb\x96\x76\x78\xdd\x6c\xf4\x72\xd5\x02\xdb\x1c\x6d\xf1\x2f\xb5\xb9\x5a\xb4\x80\xb7\x99\x97\x7e\xd8\x2d\x77\xd6\x5a\x89\x10\x94\xe7\x98\xd6\xba\x70\xde\x5a\x87\xca\xbb\xf4\x82\x1e\xf3\xd9\x52\x03\x1c\xa3\xf1\xcf\xb5\x3e\x7c\x69\x81\xaf\x72\x2e\x9d\x80\xc7\x7c\xb6\xc1\xd6\xe7\x76\x2c\x6a\xcd\x7f\xd4\x92\x59\x1e\xc9\x31\xaf\x65\x7c\xd8\xd2\x0e\xc8\xb8\xac\xbe\x3d\xfe\xb2\x05\xb0\x3d\xd6\xe3\xdf\x6a\xbd\xfc\xd0\x96\x9b\x67\x98\xd5\x5a\xf1\xb1\xa5\x15\x32\xdf\xd2\x7e\x7a\x8c\x65\x0b\x54\x10\x0c\xe2\x8f\x35\xb8\x97\x2d\x39\xb5\x38\x0f\x3f\xaf\xe5\x7d\xd5\x86\x1d\x05\x17\xf8\xb2\x96\xf1\x65\x4b\x46\x2d\xd7\xc2\xaf\x6a\x79\xaf\x5a\xf2\x5a\x89\x1e\x16\xe4\x81\x7a\x63\x5f\x71\x8d\x2d\x03\x51\xe5\x5f\xd6\x22\x3c\x2e\xb2\xa5\x26\x23\x0e\x6c\xa9\xe8\x45\x4b\x45\x36\xfb\xd2\x0f\x7b\x9c\x65\x5b\x87\xb4\x2c\x13\xbf\xac\xf3\x96\x6d\xbd\x31\x99\x97\x7e\xd8\xe3\x2f\x5b\x2a\xa9\xc4\x4c\x50\xfa\xaa\xce\x5b\xb6\x54\x55\x2b\xb2\xac\xc7\x7a\xfc\x64\xdb\xec\x57\x02\x33\xfc\x47\x9d\x9f\x6c\x47\x02\x90\x36\xe2\x27\xb5\xcc\x8f\xdb\x32\x1b\xd9\x24\x7e\x51\xcb\xfd\xb4\x25\xb7\x96\x66\xe3\x77\x75\x16\x72\xc7\xac\xb7\xcc\xf8\xb3\x1d\x33\xee\xce\xb6\xc7\x3c\xb6\x35\x03\x7c\x75\x63\x2b\xd4\xaa\x32\x54\xb6\x5c\x9f\xab\x47\xca\x23\xb6\x88\x6a\x02\x24\x90\x0b\x69\x27\x32\x82\xfc\x0e\x2a\x86\xf0\x56\x59\x89\x04\x94\x52\x23\x45\xf0\x08\x66\x05\x09\x63\xf3\xa1\xee\x86\x63\xe7\x56\x27\x6f\x31\xd6\xcc\x75\x03\x65\x6d\x60\x03\x28\x27\x54\xb9\x3e\xf5\xfd\xaa\xaf\x29\xc2\xb9\x7e\x78\x27\x73\x99\xf7\xce\xb9\x91\xe0\xd9\x27\xe0\x5b\x7f\xb8\x7f\x6c\x19\x43\x3d\x26\x4b\x37\xe4\x71\xc4\x6d\x34\x10\x64\x9c\xf8\x75\x6d\x36\x7f\x68\xc9\xca\xce\x93\xb3\xb6\xe9\xfc\xb3\xa5\x29\x2a\xef\xd2\x09\x78\xcc\x70\x2b\xa3\xa2\xc4\xaa\xf8\x73\xad\x29\xbf\xb7\x35\x65\x85\xdf\xd6\xb2\xfd\xd4\xd6\x8a\x95\x6d\xc2\xca\x63\x7e\xdb\x11\x8a\xad\xf0\xe3\x1a\xd4\x9f\x5b\x72\x9e\x71\x96\xe2\xa7\xb5\x8c\xbf\xb5\xd3\x77\x8a\x3f\xd5\x32\x8a\xbc\xd9\xce\xd4\xe1\x53\xd3\x1a\x93\x4a\xf3\x96\x2d\x26\x4f\xf1\xcf\x35\xb8\xbc\x25\x5f\xc1\xf1\x6f\xb5\x6c\x79\x4b\xb6\xbc\x10\x58\xf0\x1a\x17\xda\x92\xef\x9c\xe5\xef\xe4\x86\xfc\xbe\x06\x33\x6b\xe9\x92\xc9\xbb\xf4\x82\x1e\x0b\xda\x56\x43\x72\x05\xa5\x7e\xa8\xd5\x50\xb4\xd5\xa0\xf3\x2e\xbd\xa0\xc7\x84\xb6\xd4\x60\xf8\x94\x77\x7c\x4d\xf1\x9f\xb5\x6a\xd2\xd6\x26\x95\x9f\xf1\xaf\x75\x06\xb4\x25\x23\x9b\x25\x39\xfe\xa9\xce\x7f\xb6\x34\x1c\x32\x2e\xab\x6f\x84\xb6\x92\x6e\xac\xf2\x9a\xd4\xbf\x12\xe2\x83\x88\x8d\x9c\x73\x2c\x94\x5c\x8f\x7c\x51\x9f\x95\xe0\x8d\x3c\x92\x31\x4a\x4a\x46\x4e\xe0\x5b\xc9\xc2\xc8\x47\x15\x50\xf2\x2a\xf2\x1c\x42\x56\xa8\x44\x5e\xc9\xb0\x15\x1d\x91\x2b\x15\x3c\x63\x82\xfc\x21\x3f\x41\xf8\x43\x9e\xc0\xe7\x05\xcd\xc9\x0b\xf9\xa5\xa4\x30\xe4\x9d\xfc\x6e\x8a\x46\xc8\xe7\x5a\x3c\x39\x96\x11\x46\x46\x41\x1e\xcb\xd0\xa7\xb2\xc8\xc9\x53\x0e\x4a\x93\x4a\xca\x40\x3e\xa9\x90\x77\xf6\x27\xcf\xdc\x48\xf2\x23\x84\xcc\x51\x9c\xfc\xc0\x41\xdb\x65\x4e\xfe\x54\x1f\x70\x22\x26\xbf\xea\x80\x36\x12\xf4\x93\x0e\xaa\xcd\x93\xfc\x0c\x41\x75\x14\x24\x82\xa9\x80\xce\xca\x75\x50\x67\xcd\x65\x50\x9d\x82\x48\x06\xdf\x7a\xa8\x0b\x19\x28\xd2\x94\xa4\xf0\x01\x19\xd6\xf2\xd3\x70\xfa\x64\xa5\x42\xc0\x94\x93\x33\x19\x00\x1e\x9a\x5c\xc0\xa7\xc6\x40\x32\x93\x21\xc9\xd5\x92\x47\xf2\xcb\xf2\xae\xe4\x04\x82\x3c\x23\x1f\xe4\x07\xf0\x93\xe4\xb9\xfc\xd4\x0c\x23\xb9\x04\xf8\x05\x17\xe4\x95\xfc\xd2\x2c\x1f\x79\x29\x03\x96\x25\x23\x57\x32\x68\x38\x27\xf2\x04\x12\x35\x8b\x43\xde\xc9\x50\xc5\x7f\x90\xcf\x00\xb1\xe2\x32\xc8\xb1\x06\x0c\x8c\x01\x79\x0b\x21\xc3\x27\x90\xc7\x4c\x23\x58\x51\x52\xf2\xd4\x54\x43\x3e\x41\x34\x6c\x3b\xe4\x2b\xf4\x01\x36\x17\xf2\x5e\x7e\xc3\x26\x40\x7e\x50\x83\xaa\x48\x3d\xf9\x15\x12\x56\xe4\x77\x5d\x90\xad\xc8\x2f\x0c\xb0\x87\xa5\xe4\x67\xdd\x63\x4a\x7e\x83\x61\xc8\x53\x42\x73\x39\xe0\x9c\xf0\x5c\x41\x21\x79\xae\xa6\x4c\xae\x7c\x92\xe4\x6a\xaa\x21\x50\xe6\xce\x50\xcb\xc5\x4e\xe6\xb9\x56\x8e\x22\xa9\xfc\x92\x2b\x8f\xac\x73\xb3\x8e\xc0\xcd\x0e\xb9\xa8\xaf\x2b\x15\xfd\xd0\xae\x3c\x15\x9e\x55\x8b\x4d\x45\x7c\x70\x17\x99\x8a\xba\xf4\x57\x9a\x8a\x7c\xc9\xed\x08\xa9\x88\x1f\x4d\x27\x55\x50\xe4\xce\x24\xa9\xa8\xd7\xde\xa4\xaa\xb8\x3f\x98\x5d\x86\x3a\x13\x77\xa6\x5a\x45\xbd\x30\xd3\xa2\x82\xcf\x58\xeb\x6a\x55\x89\x6f\x6a\x4b\x56\xc5\xbe\xe5\x66\xda\x54\xf8\x4f\x35\x5b\x2a\xf0\x13\x6b\x2e\x57\x95\xf2\xd5\x5d\xb3\x2a\xea\xbd\xb3\x40\x55\xcc\xef\xde\x2a\x55\x71\xbf\x78\x4b\x55\xc5\xfd\xc6\xab\x39\x55\x31\x45\x5e\xad\x60\x15\x43\xbd\x65\xac\xe2\x98\xb7\x96\x55\x5c\xc2\x2a\x64\x51\x31\x59\x6e\x97\xb8\x8a\x28\x9d\x75\xae\x62\xe6\x76\x8d\xab\xf0\xd2\x5d\xe8\x2a\x6a\xe1\xac\x76\x15\x73\x6e\x97\xbc\x0a\x7f\xf1\x57\x9b\x1e\x74\xb3\xfc\x35\x8e\xe9\x45\xaf\x42\x1f\x99\x46\x51\x5d\x6b\xae\x6e\x4f\xb7\xf8\xe0\xf0\xf6\xe1\xdd\xd8\x65\x7b\x25\x76\xc0\xad\xab\x6b\x0f\x31\x58\x97\x74\xaf\x14\x9c\xcd\x45\x30\x52\x16\x22\xf3\xe4\x82\x9d\x25\xa2\xe0\xfd\x75\x49\xf9\xc3\x33\x9a\x0b\x4c\x9d\xd8\x55\x96\x88\x45\xc1\xcf\x31\x27\xfb\x67\x74\xfe\xb9\x38\xdd\x3f\x4d\xf7\x99\x36\xbf\x21\x79\xe1\xfd\x57\x27\x2f\x9e\xec\x9d\xa6\xfb\x36\x2e\x27\xfb\xef\x38\x4b\x69\x2e\x4e\xf7\xa3\x71\x3c\x39\xec\xdd\x9f\x6e\x4e\xd3\xeb\x03\xbc\x45\xa7\xfd\xfe\xbf\xf9\x45\x1c\x9d\xa6\x5d\xb4\xdf\xa7\x57\x74\x2e\x4b\x24\x64\xff\x49\x7a\x46\x4f\xf7\x6b\xf1\x19\x61\x9b\x4d\xbe\xd9\x24\xb8\x54\x96\xb1\xc7\xf6\xd5\x9a\xf9\x78\x55\xa4\x74\xb3\xb9\x1b\x77\xa3\x64\xb3\xc9\xd1\x64\x38\x45\xb8\x20\x9d\x24\x0c\xf7\x7f\xa5\xb3\x9f\x99\x38\xdd\xaf\x5a\x36\x27\x45\x18\xee\xff\x22\x64\x27\xba\xa7\xfd\xd3\xb4\x5b\xa5\xa5\xaa\x90\x7a\x72\xd6\x68\xc9\x9a\xa4\x61\xd8\x4d\x27\xc3\x29\x5e\x92\xfd\xd7\x2b\xca\x13\x17\xf0\x8a\xec\x3f\x5c\xad\x32\xba\xf7\xa8\x38\x5f\xad\x05\xe5\x3a\xa9\x1a\xc8\x0b\x9a\xa7\x05\x47\x78\x41\xf6\x5f\x25\xf3\xbd\xd7\x27\x7b\xbf\xed\x0d\x4f\xd3\xd3\xc7\xd1\xe4\x9e\x1a\x9f\xd3\x14\x9d\x3e\xae\x40\x9e\x91\xfd\x37\xcb\x24\x17\xc5\xf9\x4f\x27\x55\xec\x39\x59\x85\x61\xb4\xff\xaa\x98\xb1\x8c\x9e\xee\x9f\x5e\x56\x3d\xd8\x6c\xaa\xda\xe4\xe2\x28\xd6\xf3\xe5\x9b\x82\xe5\xa2\x7c\x70\x80\xf0\x05\xd9\xd7\x6f\xe7\x2a\x60\x5f\xc8\xf9\x66\x73\xb1\xd9\xec\x5f\xd2\xd9\xeb\x93\xcd\x8f\x59\x32\xff\xfc\x23\xe5\xfc\xcb\x06\x3a\xb8\xf7\x8a\xe5\xcc\x7c\x16\x33\xb6\x79\xf1\x44\xd5\xeb\xcc\xff\x4c\x82\x90\x3d\xd2\x50\x29\xc2\x8f\xc8\xfe\xe9\xec\x11\x7f\x7d\x72\x3a\xab\xaa\x7a\x48\xf6\x2f\x59\x6e\x0a\x52\x84\x4f\xc8\x32\x0c\xe5\x2a\x16\xf3\x65\xb4\xff\x81\x72\x49\xc8\x60\xd8\xff\x2d\x27\xe6\xdf\x68\x1f\x8d\x4e\xc2\x30\x3a\x21\x6a\xb5\x46\x27\x72\x6a\x11\x3e\x09\xc3\x93\x07\x64\x78\x27\x0c\xa3\x25\xe9\x0c\xe5\x5c\x0f\x94\xfd\xea\x0f\x64\x16\x86\xd1\x7c\xb3\x59\x86\xa1\x36\x79\x75\xb2\xd9\x9c\x1c\x0d\x0f\xfa\xc3\x21\x42\xf8\x23\xe1\x9b\x4d\x16\x86\xe5\x03\x72\xbf\x52\x38\x78\xee\xb0\x62\x8e\x35\xc4\x20\xfa\xcf\xe6\xf4\xb4\x44\x41\x57\x74\x83\x68\x1c\xff\x00\xa1\xd3\xd3\xf2\xdf\x01\xda\xca\xda\x2e\xf1\xab\x6a\x69\x81\xca\x82\x8c\xe5\x44\x6b\x8d\x82\xbe\x37\x23\xcf\x23\x8a\x14\x0e\x71\x38\x71\x32\x95\x2d\x27\xbc\x5f\x82\x5e\x1e\x53\x8f\x5a\xba\x6c\x32\x30\x06\x9d\xe1\x1d\xbe\x81\x61\x33\x0e\xb0\xce\x8a\xba\x51\x3e\x66\x93\xe1\xb4\x9b\xc7\x41\x80\xb6\xdb\xaa\x2f\x2f\x8d\x42\xad\x31\xe7\x3d\x5f\xb2\x2c\x3d\x2e\x52\x6a\xf5\x09\xe9\x83\xc1\xa8\xd7\xa3\xc8\xe8\xba\x3e\x92\x39\x22\xa1\x5e\xb0\x42\xc0\xb1\xee\x53\x89\x89\x3c\xa5\x0c\x59\x4d\x3f\x59\xad\x68\x9e\xaa\xe2\xd4\x95\x10\x55\x0e\x8a\x55\x4f\xeb\xa6\x3b\xac\x16\xb1\x71\x6c\x99\xbb\xbd\x45\x98\x41\x54\x29\xbe\x64\xb4\x3f\x2f\xd5\xfb\x57\x86\x70\xa0\x5e\x00\x3b\x76\xae\x50\xee\x35\xa2\x56\x8f\x2c\x27\x7b\x1e\x51\x54\x39\x0a\xa7\xc8\x8c\x4e\x42\x06\xa3\xe4\xc8\x58\x97\x19\x75\xbb\x49\x0d\x1c\x9d\x24\x53\x3b\x14\xb9\x23\xc7\xaa\xf7\xaf\xea\xb0\xcd\xdd\x2f\xa9\x78\x28\x04\x67\xb3\xb5\xa0\x51\xc0\x8b\x8c\xc2\x43\x35\x5a\xd2\x5c\xf9\x2c\x0c\x10\x76\x60\xbe\x50\xc3\xcb\x16\xd1\x2d\x42\x68\x3f\x2f\x52\xfa\xee\xcb\x8a\x82\xdd\x5f\x23\x61\x90\x7d\x41\x0e\x3f\x61\x6d\xa0\xd9\x98\x88\xa2\x51\x5a\x48\x28\xc3\x61\x0b\x98\x65\x51\x0a\xf5\x92\xd7\x58\xaf\x1a\x6c\x2f\x97\x2c\xa3\xf5\x4a\x1c\x61\x9a\x55\x9f\x1e\x09\xfe\xe5\x5a\x62\x94\xf7\x58\x78\x3b\x87\xd5\xcb\x11\x24\xcd\x8a\xf4\x8b\xb2\x2c\xb7\x05\xcb\x3a\xe0\x64\xa3\x5c\x26\x69\x71\xf9\xb6\x28\x84\x1f\xf2\x01\x8d\x90\x6c\xc3\xce\x54\x23\xc3\x71\x24\x77\x3b\x96\xdc\x08\x16\x9c\x7e\x65\xbf\xd9\x44\x4e\x52\x97\x44\x7c\x1c\xec\x05\x72\xd1\x74\xdd\x5e\x7e\x56\xb0\x0c\x66\x70\x6b\x06\x3f\xd8\x0b\xc0\x6c\xdb\x88\x1d\xd9\x77\xaa\xac\xdb\x45\x7c\xc2\xa6\x61\xd8\x79\x1e\x81\xd1\x29\x43\xd1\xe4\x30\x77\x49\xb0\x17\x74\x21\xba\x6a\xf4\x65\x7d\x09\x28\x23\x6c\x2e\xf1\xb8\x61\xbd\x68\xab\x6a\x1e\x6e\x3d\xc9\xd3\x88\x6d\x36\x02\x73\x84\x21\x42\x19\x51\x03\x3d\x97\x7c\x1b\xfb\x90\x8d\x7a\x8d\x85\x2b\xe7\xa9\x69\xb6\x0d\x66\x98\x81\x49\xb6\x77\x85\x1e\xf8\x77\x60\x45\xcc\xc3\x0d\x35\xe3\x79\xa5\x04\x65\x4d\xcc\xfb\x56\xdf\x58\xab\xd5\x37\x6e\x12\x9a\x56\xdf\x28\xc2\x4c\xb9\xc5\x7d\x43\x7c\x46\xc6\x98\x82\x73\x08\xdd\xb1\xab\x36\x0e\x26\x7d\xb2\xe4\x4b\xff\x92\xcb\x05\xcc\xfb\xc5\x65\x4e\xf9\x63\xdd\x5d\x47\x24\xea\x14\x92\x00\xac\x47\x48\x46\x2f\x1d\x59\x68\xf5\x64\x40\xb9\x2f\x59\x19\xaf\x1f\x8a\x10\x2b\xa7\x1c\xd6\x26\x38\x1e\xa2\xc6\xbb\x02\xa7\x69\xc9\x6a\x95\x7d\x51\xe6\x28\xa9\xab\xc7\xf5\xd4\xcc\x8d\xc1\x3a\xb6\xc7\xf2\x3d\x65\x8f\xfa\x7a\x8b\xb0\x40\xa2\xbf\x4c\x4a\xc7\x23\x09\x98\x70\x88\x3a\xe0\x91\x76\xb3\xe9\xd0\x66\xb2\xf2\x41\xcf\xa6\x44\xf8\xf8\x57\x09\x63\x5d\x53\xd3\x6a\x83\xa4\x61\xd8\x1b\x12\x12\x81\xef\x07\x9a\x70\xb9\x17\x4f\xfe\x73\x5a\x9e\xae\x07\x83\x64\x30\xdd\x57\x40\xad\x0f\x6a\x34\xaa\xe8\x27\xdb\x6c\x06\x38\x23\xf9\x66\x33\x18\x8d\xd4\x90\x95\xa4\x72\xa1\x10\x9c\x8a\x00\x27\x40\xe4\xcb\xa3\xc1\x66\x53\x3e\x20\xd4\xd0\xac\xac\x1b\xd1\x5e\x82\x46\x59\x97\x94\xbd\x04\x67\x5d\xc2\x7b\xd9\xbf\x38\x4e\x48\xd9\x1d\x6e\xb7\xe7\xe3\x76\x14\x30\xd6\x1b\xc9\x00\xfb\x46\x1b\x89\x31\x14\xa1\x5a\xb9\x8d\x25\xaf\x58\x83\xc1\xbf\xb8\xa8\xa4\xd0\x98\xa2\xeb\xed\x56\x31\x0f\xcf\x5c\x3e\x59\x3d\x1b\x48\x1d\xbb\xcf\x0b\xe7\x1b\x0e\xe7\x03\xd7\xd2\x29\x27\x8f\x8d\x19\x21\xfd\xf4\x1e\x52\x5d\x8c\xfd\x5a\x27\x32\x83\x11\xaf\x8c\x01\x77\xbb\x1c\xac\x90\x80\xcd\x41\x3b\x4c\x5c\xcf\x61\x6f\xb8\x7d\xe6\xa0\xa1\xad\xa4\x36\x48\x2c\x85\x81\x91\xcd\x3b\x22\x5d\xc9\xcb\xc8\xd3\xd0\x58\xf4\x17\x11\x8a\x1d\xab\x00\xc2\xb4\x5a\x67\xee\xd9\xbc\x68\x8b\xdd\x8a\x4a\x2a\x6a\x2c\x8e\x1e\x0b\x3a\x52\x7d\xb0\x05\xbb\x62\xa4\x5f\xbf\xb0\x74\xb3\xd1\x26\x61\xe0\x6a\x4e\x72\x64\x0d\x6b\x17\xcc\x58\xb8\x60\x9e\x8d\x0a\x77\x44\xed\x63\x24\x18\x6d\x8e\x14\x69\xf8\x91\x5c\x8b\x42\xd9\xfd\x89\x1b\xcb\x2d\x78\x54\xa4\xf4\x15\xe3\xbc\xe0\xfd\x37\x49\x59\x06\xdb\x2d\x7e\x4f\xae\xcb\x39\x2f\xb2\x2c\xee\x0c\xb7\xf8\x07\x72\x5d\x70\x76\xc6\xf2\x38\xf8\xf7\x79\xb1\x2e\x69\xb0\xc5\x7f\x56\x71\x5d\x49\x99\x02\x67\xd2\x7e\x6d\xac\x52\x32\xc0\x39\xb1\xf8\x9e\xd4\xf1\x9d\xa1\x91\x5c\x4e\x09\x18\x54\xa9\x16\x8d\xcc\x9b\x91\xa4\x07\xb6\x11\x93\xca\xa5\xfb\x66\x93\x77\x33\x67\x5d\xb0\xae\x32\x22\xc8\xf2\x28\xc3\xb4\x97\xc3\xea\xc9\xbb\xb2\x24\x66\x24\xe9\x0e\xb1\x0c\xf1\x5e\xfe\x2f\x8e\xdc\x62\x5b\xe0\x48\x7f\x27\x93\x20\x98\x56\xad\xff\xc9\x70\x83\xa3\xdf\x75\x7d\x47\x44\x8c\xd0\xef\xfa\x89\x74\xf4\x3b\xea\xca\x1d\xce\x10\x8a\xdf\x27\x62\xea\x08\xc3\x5d\x0a\x3b\x11\x95\xe3\x12\x47\x0a\x5e\x47\xe9\xc9\x54\xef\x96\xa2\xbe\x5b\x12\x1a\x49\xa2\xe4\xf0\x48\xdc\x11\x92\x47\xe8\xda\x91\x84\x0b\x67\x6b\xaf\xe9\x64\xaa\x4d\x6b\xcc\x89\x17\x8e\x04\x8a\xa3\xdf\x2a\xbc\x05\x53\x8a\x12\x33\x7f\x43\x98\x86\xe1\x53\xb8\xd7\xc1\x1c\xc6\x88\x0a\xb2\x3f\x91\xc4\x2d\x5d\x9c\xae\x07\x77\xee\x1d\xca\xdf\xfb\x83\x9e\xfc\xb3\xb8\x7d\xba\x1e\xdc\x1d\x40\xe0\xee\x62\x71\xba\xbe\x35\xb8\x2d\x03\xb7\x06\xf7\x21\x90\xa8\x00\xa4\xdc\x86\x6c\xb7\xd3\xd9\x9d\xd3\xf5\x6d\x0a\x81\xfb\x8b\xf9\xfc\x74\x9d\xcc\x21\x90\x1e\x26\x8b\xe9\x7e\x35\x17\x5c\x54\xe3\xb9\x7f\x7a\xe9\x9c\xd9\xc4\x83\xe0\xf4\xea\xde\x20\x80\xc7\xeb\xa2\x78\x6f\xe4\x7d\x11\xea\xd4\xdd\x1d\x6c\x36\x54\x98\x82\xae\x0a\x8a\xf0\xb8\x73\x3a\xee\x74\x22\xda\x2f\x8b\x35\x9f\x53\x07\x3d\x4f\x2f\x03\xf4\xa0\x37\x0c\x43\x68\x8b\x04\x66\x60\xc5\x10\xe3\xdc\x06\x08\xef\x1c\x01\x0f\xf3\x80\x3c\xd5\xf7\x1c\x78\x0c\x39\xa1\xd3\xba\x39\xd4\xce\x00\x06\x3b\xd1\x83\x7d\x4b\x8d\xe9\xad\xbb\x72\xcc\x6f\xdf\xbb\xd5\x83\x3f\xf7\x61\xe8\x87\x30\xf4\xb3\x14\x7e\x61\x4e\xe6\x43\xf8\x3d\x80\xdf\xdb\xf0\x7b\x07\x7e\xe5\x5c\xdd\x1d\xaa\xe9\x19\x26\xf2\xf7\xf6\x0c\x02\x77\xa8\xfc\x3d\x1c\xc8\xdf\xf4\x2e\x44\xa5\x73\xf8\xa5\x10\xa0\x30\xb1\x14\xca\xd3\x7b\xf0\x9b\xa8\x04\x59\xed\xe1\x50\x56\x78\x78\x0b\x00\x1f\xde\x96\x80\x0f\x13\x80\x72\x38\x93\x20\x0f\x29\xd4\x72\xb8\xb8\x75\xba\x1e\xdc\x1b\x42\xca\xbd\xe1\x7d\xf8\x85\x94\x7b\x07\x90\x72\x70\x47\x05\x0e\xe1\xf7\xbe\x0a\xc8\x0a\xee\xab\xee\xdf\x1f\xc8\x2e\xdd\xbf\x25\x5b\x76\xff\x36\xf4\xfb\xfe\xed\x7b\xf0\x0b\xb9\xee\xa8\xa8\x3b\xb2\xb3\xf7\xef\x42\xde\xbb\x12\xf0\xfd\x7b\xb2\x7d\xf7\x67\x50\x6e\x26\xbb\x7a\x7f\xae\xb2\xc2\xe8\xdc\x9f\x43\xe9\x54\x56\x7b\x9f\x42\x31\x2a\x8b\x25\x83\x21\xfc\xca\x98\x04\x2a\x4d\x6e\x43\xcc\x6d\x88\xb9\x7d\x08\xbf\xf7\xe0\x17\xba\x91\x40\x33\x92\x3b\x90\x09\x06\x33\x39\x54\xdf\xb2\x45\x09\xb4\x22\xb9\x07\x85\xa1\x2d\x89\x6a\x45\x02\xb3\x93\xc0\xec\x24\x73\x80\x07\x2d\x4a\xa0\x2d\x09\xb4\x65\x06\x6d\x99\x41\x2b\x66\xb7\x28\xfc\xca\xb9\x9e\xa9\x61\x98\xdd\xbe\x0d\xbf\xb2\xd8\xec\xce\x5d\xf8\x95\xe0\x66\x30\x0a\x33\x18\x85\x19\xd4\x3c\x83\xfe\xcf\xe6\x03\xf8\x85\xfc\xd0\xf1\xf9\x2d\x98\xe9\xf9\xed\x01\xfc\xde\x55\x81\x7b\xf0\x9b\xa8\x80\xcc\x3c\x87\xc1\x9d\x43\x15\x73\x00\x3e\x07\xe0\x73\xe8\xd0\x1c\xf0\x6f\x0e\x98\x37\x9f\x43\x9e\x39\xc4\x43\x45\xf3\x14\xca\xa6\x10\x0f\x7d\x9b\x43\xdf\x52\xe8\x4f\xaa\x7a\x92\x42\x4f\x52\xa8\x2c\x85\x3e\xa4\x50\x4d\x0a\xd5\xa4\xf3\x04\x7e\x65\x35\x69\x7a\x00\x05\x52\x28\x00\x50\x53\xa0\x49\xf4\xd6\x10\x7e\x6f\xf7\xe0\x8f\x2c\x41\x6f\x1f\x42\xe0\xb6\xac\x89\xce\x20\x7d\xa6\xd2\x67\xf7\xe1\x77\x06\xbf\xb2\xb1\x74\x7e\x0f\x12\xa0\xcd\x8b\xe1\x3d\xf8\x95\x99\x16\xb7\xee\xc0\xef\x21\xfc\x42\xcc\x21\xb4\x79\x71\x28\xc1\x2e\xee\x01\x92\x2e\xee\xdd\x86\xdf\xbb\xf0\x0b\x79\x15\x75\x5c\xdc\x57\x01\xc0\xeb\x05\x54\xb5\x90\x63\x34\x1c\x1c\xa4\x3d\xf9\xe7\xd6\x00\x7e\x0f\x54\xe0\x10\x7e\xef\xc3\x6f\x02\xbf\x29\xfc\x52\xf9\x7b\xe7\x1e\xfc\x42\xea\x1d\x0a\x05\xee\x42\x69\x68\xd0\x70\x70\x78\x5b\xfe\xca\x09\x1f\x0e\xee\xdd\x81\x5f\xa8\xe9\x1e\xc0\xb8\x2f\x7f\x6f\xdd\x59\x9c\xae\x87\x87\x43\xa8\xee\x70\x28\x0b\x1c\xaa\xba\x0f\x6f\x41\xe0\xce\x01\xfc\xde\x92\xbf\x87\xf0\x7d\x08\xdf\xb3\x43\xc8\x24\x09\xce\xf0\x10\x3a\x70\x38\xbf\x0f\x51\x29\xa4\xa7\x32\xe1\xde\x40\xae\x88\xe1\xbd\x01\x04\x12\xd9\xd0\xfb\x07\x72\x18\x86\xf7\x0f\x0e\xe0\xf7\x10\x7e\x65\x3f\xee\xdf\x82\x98\x5b\x00\xe4\xfe\xad\xd9\xe9\x7a\x98\x0c\x0f\xe1\x57\x26\x27\x12\xd9\x86\xc9\x1d\x39\x2b\xc3\x44\x52\xaa\x61\x02\x9d\x4d\x24\x62\x0c\x93\xbb\x77\x20\xe1\xee\x5c\xfe\x1e\xde\x82\xc0\xa1\x0a\xc8\x1e\xce\x80\x76\x0c\x67\x03\xd9\xb8\x19\x74\x6d\x76\xeb\x2e\x44\xc1\xb8\xc2\x9a\x1a\xce\xe4\x9a\x1e\xce\xee\x42\xab\x67\xd0\xd1\xd9\xbd\x01\xfc\x0e\xe5\x6f\x02\x23\x33\x4b\xee\xc0\xef\x3d\xf8\x95\x9d\x9a\x1f\xcc\x65\xc2\xfc\xd6\x2d\xf8\xbd\x0b\xbf\xb2\xed\xf3\x14\xaa\x9d\xa7\x07\xf0\x7b\x1b\x02\x74\x00\xbf\x07\x2a\x70\x0f\x7e\xe5\x00\xa5\x73\xc8\x9c\x52\x59\x3e\x5d\x00\x3a\xa4\x72\x97\x3c\x18\x0c\xe6\xf0\x9b\xca\x5f\x00\x79\x30\x58\x0c\x4e\xd7\x07\x73\xba\x90\x81\xf9\x62\x78\xba\x3e\x48\x29\xa4\xa4\x6a\xcb\x3d\x48\x60\x97\x3d\x80\xc0\xfd\xfb\xf0\x9b\x9c\xae\x93\xbb\x77\x65\x91\xe4\xae\x9c\xcc\xe4\xae\x1c\xa2\xe4\xee\x61\x2a\x7f\x25\xc4\xe4\xae\x04\x95\xdc\x93\xe4\x2e\xb9\x37\xb8\x0b\xbf\x33\xf9\x7b\x70\x07\x7e\x21\x46\x12\xcc\xe4\x1e\x54\x97\xdc\x83\x02\xf7\x0f\xe4\x60\x26\xf7\x25\xa1\x4e\xee\xc3\x3a\x4b\xee\xdf\x81\x14\x58\x10\xc9\x7d\x89\x86\xc9\xfd\xd9\x2d\xf8\x55\x99\xe5\xa2\x4b\x80\x20\x27\x09\x10\xfa\x24\x39\xa0\xf2\x57\x2e\xdd\x24\x91\x08\x91\x24\x72\xb9\x25\x89\x1c\xd3\x24\xb9\x7d\x0b\x7e\xa1\x80\xdc\x53\x92\x64\x76\x00\xc5\x66\xb7\xe1\xf7\x10\x7e\xef\xc1\x2f\x00\x92\x94\x28\x49\xe4\x4e\x98\xcc\xe8\x1d\xf8\xbd\x07\xbf\xe9\xe9\x3a\xd5\x1c\xc6\x42\x8e\xd7\x62\x36\xa4\xa7\xeb\x85\xe2\x40\x16\x74\x20\xa3\xe8\x81\x0a\xc8\x3e\x2f\x16\xf7\x29\xfc\x7a\xdc\x48\x26\xbc\xf3\xf3\x5c\x5b\xcf\x7c\x28\xa2\x01\x7a\x40\x0e\xef\xde\x0b\xc3\xc4\x72\x1a\xce\xdd\xbc\x70\xf9\xe1\x51\xc4\x8f\x06\x63\xfa\x60\x10\x57\x5e\x4d\x50\x18\x4a\xd8\xc6\xea\x20\x45\x68\x84\x68\x97\xf0\x96\xc3\x68\x21\x9a\xcc\x35\x7d\xc0\xc7\xbd\x61\x3c\x94\xfc\x35\x78\xc8\x22\xdc\xf0\xb8\xea\xc8\x91\x93\x88\x76\x39\xda\x3f\xc0\x09\x61\x47\x83\x31\xb0\xcb\x73\xca\xb2\x28\x47\x31\x04\x16\x59\x51\xf0\x48\x71\xce\x89\x73\x96\x12\x51\x82\xc6\x34\xe6\x23\xf8\xe0\x24\x89\x29\x49\xba\x9a\x73\x9e\x0b\xad\xac\x63\xaf\xfc\x85\x27\x3b\x19\xd9\x0c\xd6\x2f\xf3\x60\x94\xbb\xc7\xb7\xdc\x1e\x08\x26\x39\xb8\x90\x4f\xc0\x2e\xe9\x11\x0d\xc3\xa4\x2f\x8a\x07\xb6\x1d\xf9\x48\x86\xe1\xe0\xad\xf3\x74\x88\x8c\x09\xc3\x60\x46\x17\x05\xa7\xe0\xd8\x87\x91\x3c\x96\x75\x22\xac\xf2\xdc\x94\xbf\xe3\xe6\x37\xd2\x18\x65\x5d\x85\x8d\x59\x3c\x17\xd0\x45\xf7\xb4\x88\xae\x2b\x6e\xdb\x45\x84\x23\x72\x70\xfb\x70\x1c\xcc\xcc\x3f\x51\x8a\xcb\x72\xe6\xfd\x2b\xcb\x52\x5c\x1e\x1f\xff\xeb\x5f\xff\x3a\x86\x7f\xf8\x18\x1f\x0f\xed\x3f\x15\x77\xfc\x72\xe7\xbf\xef\x49\xd7\x15\xcd\x76\xfe\xc3\xb2\x7a\xa8\x5f\xc1\xfb\xd7\xbf\x86\x43\xf8\x1c\xbe\xbc\x09\xfc\x0d\xd5\xaa\xf4\xc0\x1a\xd7\x47\xf1\xf0\xf6\xc1\xed\x23\x22\xc2\x50\x1c\x91\xe1\x9d\x83\xdb\xe3\xe0\x6d\x10\x0f\xef\xdc\xba\x6b\x23\x0f\xef\xdd\x19\x07\x39\xfc\x3b\x3e\xe6\xff\xfa\x17\xc7\xfc\xf8\xf8\xbc\xfa\xc7\xff\xe2\xbf\xf3\xb6\x7f\xb9\xfd\xf7\xaf\x3c\x97\x99\xfe\x2a\xd4\xbf\xf5\xcf\x54\x7e\x6c\x7a\x72\x7e\x7e\xac\x3e\xaa\xa9\xae\x06\xab\x27\x87\x05\xc5\xc3\xc3\x43\x3b\x62\x07\x07\x07\x83\x71\xc0\x83\xf8\xde\xf0\xfe\x81\x89\xbc\x77\x30\xb8\x35\x0e\x2e\x83\xf8\xde\xc1\xe0\x36\x21\x62\x1c\xcc\x82\x38\x78\x19\xa8\x73\x99\x3a\x29\xec\x3c\x8a\x0d\x0e\x55\xe0\x5e\x32\x9f\xee\x63\x4e\xf6\x27\x12\x0f\xa7\xfb\x98\x91\xfd\xc9\xcb\xb7\x7c\xba\x8f\x73\xf9\x35\x1b\xe6\xd3\x7d\x9c\x90\xfd\x89\xfc\x70\x28\x9e\x67\xfe\x31\xa3\x17\x34\x33\x16\xda\x60\x7d\x69\x13\x53\xa2\x20\x7c\x5b\x17\xe7\x95\xb8\x50\xab\x7b\x4e\x82\x4c\xf0\x80\x90\x62\x1c\xbc\x0c\xe2\xe0\x6d\xa0\x2d\xca\x97\xf6\x3c\x6f\x32\x84\x61\x47\x1f\xaf\x4a\xc7\x59\x84\x21\x1f\xa9\x2d\x81\xd7\xf2\xd4\xbc\x24\x83\xd1\xf2\x28\x1d\x75\xbb\x4b\xb4\xd6\x36\x7a\xa2\xd2\xa5\xcb\x4b\x84\x2a\xd9\xdb\x8a\x0c\xf0\x82\xcc\x47\x2b\x28\xb2\x52\x8d\x3b\x23\xeb\xc9\x6a\x3a\x0a\xce\x03\x42\xce\xc6\xf2\x9b\x2c\xe2\x05\x39\xdb\x9a\x52\xe7\x64\x80\x2f\xc8\x7c\x74\x0e\xa5\xce\x55\xa9\x2f\x64\x3d\x39\x9f\x8e\x82\x61\x40\xc8\x97\x30\x0c\x64\xe3\x2f\xc6\x32\x8e\x04\x79\x10\xeb\xeb\xba\x2f\x28\x0c\xa3\x0b\xf2\x05\x43\xfa\x97\x30\x8c\x54\x8e\xb7\x81\x3c\x87\x6a\xf8\x33\x32\xc4\x8f\xc8\x7a\x32\x98\x8e\x66\x47\x69\x6f\x38\xea\x76\x67\xaa\x92\x87\x64\x3d\x99\x4d\x47\x41\x37\x20\xe4\x61\x18\x42\x65\x8f\xf4\xdf\xf5\x64\xd6\x1d\x4e\xc7\x32\x03\x09\x86\x41\x1c\x60\x95\xe9\x91\x49\x0a\xc3\x48\x15\xd8\x6c\x82\x5c\xfe\x45\x50\xfd\x6c\x4a\x1e\x21\xfc\x88\x3c\xb4\xf5\x9f\x90\xc1\xe8\x04\xfa\x76\xa2\xaa\xfd\x40\xd6\x93\x13\x20\xc6\x00\xf4\x03\x92\x41\x12\x1c\x07\xf6\x3a\x28\xf8\x17\xc4\x43\xee\x8f\xc6\x24\x87\x84\xf7\x91\x9c\x74\x87\xa3\x8f\x47\x69\x18\x42\x9e\xf5\xe4\xe3\x74\xd4\xed\x7e\xac\xe6\xe0\x39\x39\x09\xc3\xa0\x03\x69\x27\xbd\xe1\x74\xb3\x51\xb9\x87\x3a\xf7\x18\x3a\x73\x1c\xe0\x4b\x72\x32\xba\x3c\xfa\x38\xea\x76\x2f\xd1\x7a\x72\x39\x25\xcf\x47\x27\xe4\x63\x6f\xb8\xb5\x0d\x7f\x45\x06\xf8\x25\x99\x8f\x5e\x41\xe3\x5f\xa9\xe6\x5c\x91\xf5\xe4\xd5\x74\x14\xbc\x0c\x08\x79\xa9\xe1\x5e\x8d\x65\x1c\x91\xb8\xa7\x27\xe6\x4a\x0e\xc6\x4b\x72\x55\xcd\xc2\x1f\x64\x30\xfa\x03\x00\xfd\x01\xd6\x88\x55\xbe\xf5\xe4\x8f\x29\x52\x80\x9f\xb8\xfd\x7c\x42\xfe\xe8\x0e\x47\x4f\x64\xcb\x6d\xce\x27\x53\x34\xea\x76\x9f\x54\x5d\x7d\x41\xa0\x15\xd1\x1f\xe3\xf5\xe4\x8f\xde\x70\x1a\xcf\x11\x7e\x47\x5e\x10\x12\xa9\xf8\x27\x47\xe9\x58\x16\x8b\xe7\x08\x8d\x5f\x98\xa5\x11\xcf\xf1\x6b\xf2\xc7\xe8\xf5\xd1\x93\x51\xb7\xfb\x1a\xad\x27\xaf\xa7\xe4\xdd\xe8\x0f\xf2\xa4\x37\xb4\x8d\xfd\x8c\xdf\x48\xf4\x3f\x26\x83\xd1\xf1\x51\x0a\xe6\x93\x73\xd3\x8c\x63\xd3\xe0\xb7\xe4\x18\x9a\xd2\xed\x1e\xcb\x5c\x61\xe8\x66\x19\x75\xbb\xc7\x68\xf4\xa6\x72\x66\x97\x45\x03\xfc\x16\x1f\x23\xed\x7e\x41\x02\x78\x4c\x8e\xf1\x53\xf2\xc6\xac\xb8\x4f\x24\xe0\x22\x83\x55\x3c\x8c\x07\x3e\xe8\xe0\x65\xd0\x21\x12\xb0\x82\x6b\xda\xf9\x8c\x3c\x1e\x3d\x3b\x3a\x86\x06\x26\xa6\xf6\x67\xb2\x81\x8f\x8f\x9e\x85\x61\xf4\xc6\x58\x59\x79\x8a\x07\x58\xb5\x62\x88\x1f\xe3\x67\x08\xe1\xa7\x5d\xf2\x49\x09\x00\xbf\x92\x67\xba\xb2\x67\x12\x18\x30\x06\x16\xd2\xa8\xdb\x7d\x26\xfb\xd1\x80\x73\x80\xbf\x5a\x38\xf8\x31\x79\x06\xdd\x92\x20\x1e\x4b\x10\x3b\x2a\x96\xdd\xd7\x32\x51\x4b\x8f\xa2\x21\x21\x6f\xd4\x25\xf3\x05\xcd\xc2\x30\xfa\x4c\x4a\x73\xfb\xfe\x9f\xd3\xb2\xab\x44\xfd\x90\x03\x28\xe2\xe7\xea\x42\x1a\xbf\xe9\xaf\x73\xb0\x9c\x6e\x87\x78\x80\x9d\x74\x84\x10\x1e\x12\xf2\x4b\xf4\x06\xb5\x41\x3f\x2d\xbb\x3f\x28\xe8\x90\x43\x14\xbd\x1a\x70\x6f\xf2\xd2\x9e\x9b\x98\x82\x9d\x74\x3b\x61\x6f\xfa\x9c\x5e\x50\x5e\xd2\x08\xc5\x6f\xb6\x5b\xcf\x70\x80\xf0\xaf\x04\x0b\x9e\x52\xcb\x77\xaa\xcb\x0e\xae\x7c\x17\xa9\x24\x02\x92\x70\x41\xaf\x64\x29\x23\x1e\x5c\x09\x89\x8f\x0b\x5f\xec\xad\x7d\x56\x83\x11\xa8\x27\xae\xf1\x1c\xd4\x8c\x8a\x28\xe6\xb8\x33\xac\x6e\x9c\x45\x3f\x11\x22\xd1\xee\x26\x90\x17\x8a\x82\x22\x0f\xba\x12\xfc\xc8\xe2\x2a\x23\xa2\xff\x51\x8b\xc0\x4b\xb8\xbf\xb4\x21\x72\xbd\x45\x23\x36\xa1\x53\x12\xc9\xdf\xcd\x66\x25\x50\x7f\x5e\xe4\xf3\x44\x80\x8d\x80\x6a\x28\xce\x7c\x81\xa0\x03\x23\x0c\x9d\x80\x06\xe2\xbc\x29\x12\x5e\x77\x95\x82\x40\xbd\xc7\x2d\xb1\x2d\x9d\x4e\xa9\xdb\x69\x27\xf4\xcd\x4e\xe3\x9c\xb0\x30\x94\x3d\x54\xaa\xef\x9a\xaf\xfe\x1a\xe5\xb2\x4c\x02\x12\x4c\x18\x00\x92\x5b\xcd\x88\xc4\x0e\x84\x89\x03\x2b\xe1\x68\xeb\xdc\xb8\x5d\x78\xf8\x71\x56\x3d\x02\x30\x57\xbb\xa8\x3a\x87\x7c\xd7\xc5\xdf\x01\xc2\xea\x18\xc0\xdd\x63\x00\x9f\xe4\x53\xf7\xd6\x8f\xb9\x6f\xaa\x84\x6f\x41\xa2\xa9\xd2\x00\x97\x6d\xca\xc4\x06\xc5\xbe\x6f\x80\xb8\x7e\x3f\xa5\x6f\x2f\xdf\xa8\x5c\xda\x5a\x1b\xc2\xd0\x4f\x0e\xd2\xdd\x2f\x2b\xaa\x6c\x1f\x7c\x94\x47\x31\x19\x35\x2f\x52\x7a\x0e\x37\x24\x2f\xce\xf2\x82\x3b\xc7\xb1\x99\xeb\xca\x67\x07\xc2\xf4\xe7\x6b\x5e\x16\xfc\xe1\x5c\xb0\x0b\x26\xbe\x8c\x3c\x85\x0a\xb8\x86\x5f\xf3\xd7\xab\x5a\xae\xe7\x2e\x32\xdf\x94\x81\x4c\xa6\xe6\xb6\xdd\x51\xcb\x60\xa8\x37\x24\xe4\x6b\xc4\x31\x9d\xb0\x29\x92\xfb\x94\x32\xd9\x28\x43\xce\x7b\x32\x1f\xe5\xf5\xf4\x5a\xab\x5d\xce\x7b\x32\x65\xbf\xce\xbb\x4e\xab\x5d\x72\x2d\xd4\x4d\x14\x0c\xdd\x16\x7b\x59\x17\x8b\x5a\xde\x73\x37\xaf\xf3\x0a\xcd\xd6\xe2\x4e\xe1\xb8\xe9\xef\x21\x96\x0b\x4a\x36\x59\x99\xfd\xee\x0c\x9d\xb7\x69\x1a\x46\x29\x8a\xd5\x1b\x5e\xac\x92\x33\xd0\x1c\x19\x37\x62\x00\xca\x3c\xc9\xe7\x34\xfb\x71\x3d\x9b\x65\x54\x62\x42\xf5\x74\xcd\x3d\xe2\x69\xa3\x9b\x0d\xdc\x19\x37\xa3\xe2\x01\x21\x5e\xe3\x9c\xf7\x6d\x00\x12\xfa\x88\x3f\xf8\x22\x82\x4b\x5f\xb2\x20\x12\x7e\x46\xc5\x66\x23\xfa\x25\x37\x46\x1b\x9d\x17\x6d\x1e\xce\x81\x73\x12\x9f\x60\xcb\xf5\x30\x0c\x45\x7f\xb6\x16\xa2\xc8\xc7\x94\x0c\xe3\x03\x37\x78\x2b\xbe\x6d\x83\xb0\x74\x0e\x10\xc2\x33\xb0\xdc\xa7\xfc\x98\x84\xe1\x50\x41\xa1\xe4\x16\xc2\x14\x68\xfc\x4b\x81\xaf\x04\xfe\xc3\x3b\x0f\xb3\x45\x94\x85\x61\x79\x74\xbf\xe2\xd5\x95\x7a\xe4\x1f\x51\x90\xb2\x0b\x7b\x49\x16\xa4\x3c\x39\x3b\x4b\x66\x19\x0d\x58\xbe\x27\x36\x1b\x88\x78\xcc\x8b\x15\x84\xbd\x0d\x09\x0c\x7f\x18\xeb\xb8\x84\xbc\xb4\x5d\xfd\x23\x0a\xca\x55\x92\x07\x38\x00\xe1\xd8\x2c\x40\xa3\xab\x48\x60\x1b\x3d\xa1\x78\x97\x2e\x53\x70\x15\xa0\x29\x42\x78\x20\x27\xb1\x52\xd9\xd2\x8e\x15\x9f\x53\x76\xb6\x14\x92\x23\x14\x84\xea\xb8\x5f\x59\x2a\x96\x47\x64\x18\x86\xd4\xcb\xf5\xe0\x20\x0c\x3b\xaa\xd3\xf7\x90\xd2\x68\xe3\xe4\xa5\x18\x37\x1b\x17\x3b\x51\x57\xc9\x20\x00\x6b\x29\x38\xd0\x4a\x17\xf1\x1e\xcb\x33\x96\xd3\xde\x2c\x2b\xe6\x9f\x47\x7b\x97\xb2\xbe\x78\x6f\xb8\xba\x1a\xed\x9d\x27\xfc\x8c\xe5\x3d\x2e\xeb\x8b\xf7\x7a\xc3\xd5\x55\x75\xdb\xc8\x6b\x3a\x52\xf3\xf3\x9e\xf2\x3f\x1d\x04\x72\x33\xae\x54\xa3\xdc\x51\xec\x90\x2b\xeb\xfb\xf1\x4a\x8c\xd4\x70\xca\xb1\xdb\x39\x5e\x0f\xe5\x01\xf2\x80\x3e\x0c\xe4\x16\x4f\x2e\x23\x8a\x07\x78\x88\xfa\x67\x54\xfc\x58\xac\xf3\x94\xe5\x67\x8f\x32\x06\x16\xbb\xe7\x02\x1c\xbe\xc8\x2c\x43\x7c\xb0\x33\xcb\xc8\xd1\x81\xc3\x9d\xa8\xc3\x37\x1b\x49\xff\x17\x82\x10\xde\x87\x9e\x4a\x46\xe7\x4a\x10\xa6\x42\x3d\x1d\x7b\x74\x4b\x0d\xf2\x3b\x81\x5f\x0b\x72\xab\x43\x82\xd3\xfc\x34\x9f\x05\x5a\xd5\x68\xff\x34\xdf\xb7\x9e\x14\xdc\x6b\x7d\xc7\xfe\x1f\xd6\x37\xac\x95\x0b\xe1\x23\xc2\x46\x46\x6d\xc8\xbd\x89\xce\x03\xb9\xb7\x49\xc2\xa9\x1d\xc6\x78\x37\xd1\x09\x11\x7a\x97\xa4\x38\x38\x05\xcf\x91\xe6\x30\x9f\xf7\x86\x68\x9c\xf7\x86\x71\x8e\x70\x46\x12\x07\x24\x0f\x24\xc0\x0e\xc9\xc6\x91\xa6\xc0\x89\xdd\x7e\x33\x84\x30\xed\x92\xac\x3b\x44\xb1\x4d\x45\x98\x92\xbc\x3b\xb4\x12\x29\xbe\x8d\x5b\x9e\xe5\x09\xdb\x7f\x7e\x9a\x8f\x37\x72\x14\xb6\xf8\xb3\x20\x97\x2c\x4f\x8b\x4b\x39\x09\xd6\x3b\xe5\xb8\xae\xce\x51\x81\xf0\xb4\x43\x3a\xc4\x57\x0e\xa9\x74\x3d\xcc\xda\xde\xfa\x4d\xf1\x15\xdc\x3c\xe5\xa1\x5d\xce\x3c\x2b\xc5\x37\xdd\xbd\x4e\xd4\xa1\x72\x83\x55\xaa\x52\x46\xc7\x11\x75\x88\x44\x87\x41\x87\x50\xf3\xf2\xe6\x49\x9e\x2a\x9d\xdc\x28\x80\xd6\xbe\x2b\x9e\xe4\x69\x00\x3b\xcd\x1b\x41\x82\x22\x9f\x17\xab\x2f\x01\xcb\xa3\x77\x15\xf1\x41\x9b\x4d\xf4\x4e\xd4\x16\x8c\xce\x89\x03\xd5\x80\x51\x80\x70\x60\x7a\x55\x71\x14\xef\x44\x5f\x65\x44\xf8\x58\xcb\x30\xe1\x4c\x25\xc8\xf5\x16\x3f\x96\xbf\x15\xc1\x7a\xaa\xf7\x50\xcb\xe2\x98\xed\xf3\x00\xac\x90\xa6\x74\x45\xf3\x94\xe6\x73\x46\xcb\xef\xe5\x90\x10\x7e\x2b\x26\x62\x4a\x5c\x25\x24\xb3\xa0\x1b\xdc\x8f\x08\xc3\xc7\x8d\x2b\x66\x81\x90\x20\x8f\x25\x90\x8a\xbb\x0c\xc3\x66\x59\x6d\xd6\xbd\x05\x00\xa4\x20\x43\x7c\x25\x28\x88\x99\x8e\x76\xb1\x5f\x32\x35\xa6\x5b\x84\x23\x41\x84\x88\x28\x16\x08\x41\x11\x42\xe1\x8f\x3a\x59\xee\xe8\xc1\xfe\x7f\x26\xa7\x97\xa7\xbd\x69\xf7\x74\xdf\x7c\x74\xaf\xce\xb3\x1f\xec\x8d\xbf\xa1\x5f\x9f\x44\x14\x48\x3e\x91\xcd\x61\x13\xdf\xbf\x3a\xcf\x02\xe0\x47\xbf\x17\xea\xa7\xb2\xc8\xbf\x0d\x16\x6c\x1f\xda\xd3\x60\x03\xf4\x58\xf5\x56\x6c\x63\xb1\xd9\xa8\xef\x40\x62\x49\xe0\x30\x33\xcf\x34\x5e\x50\xf2\x09\x3c\x77\xaa\xbd\xe2\xad\x98\x50\x3d\x90\x6c\x11\x75\xac\xa0\x1e\x72\x07\x92\x96\xef\xaf\xb2\x84\xe5\x81\x2a\xc0\x08\xb7\x1c\xf7\xd7\xa6\x22\x81\x3b\x49\x39\xf9\x5a\xc1\xb6\xfa\x66\x7b\x2c\xdf\xcb\x51\x27\xaf\x17\x4d\xe4\xea\x60\xcd\x58\x38\x25\x04\x1f\x83\x6e\x32\x25\x6c\x92\x48\xde\x72\x92\x4c\x49\x2e\x3f\xc1\xc5\x92\x3b\xa5\x98\xf6\x97\x34\x5b\x51\xae\xf5\x65\x99\x13\x24\x6e\x1a\xc2\xb4\x7f\x5e\xa4\x60\x17\xac\xb4\xbc\x6f\x06\xca\x7b\x4e\x02\x9b\x64\x53\xe2\x44\x4c\xb2\xe9\xc8\x2a\xeb\x80\x30\xc0\x5f\x7a\x3f\xea\x21\x7e\x1a\x51\xdc\x1c\x1d\x81\xc6\x5f\xe5\x0a\x88\xe1\x57\x9e\x03\x9d\xd7\xbb\xc2\xea\x0e\x77\x06\xc4\xb9\xf0\xa0\xe0\x71\xb3\x2f\xd7\x3e\xf8\x37\x71\xf5\x85\x75\x54\x35\x99\xb2\x2d\x9e\x22\xa2\x99\x09\xc9\x66\x8f\xf2\x3d\x96\x97\x42\x32\x98\xc5\x62\x0f\x56\x3e\xec\x2a\xb9\x39\x74\x4d\x24\x4b\x02\x6a\x3e\xf9\xb6\xa9\xde\xf3\x83\xa8\xe9\x09\x81\xa7\xc6\x9c\xf2\x57\x45\xaa\xbd\x09\x57\xe1\x88\x22\xe0\xf1\xe5\xc8\x75\x08\xe8\x05\xf3\x7e\x29\x1b\x8b\x05\x51\xd1\x96\x83\xd8\x6c\xae\x65\x38\x16\x18\x32\xc4\xd4\xc1\xd9\x3f\x6b\x47\xad\x8e\x7e\x69\x03\xfd\x06\x7e\xd4\x86\x40\x3d\x08\x26\xe5\xd7\xe6\xb9\x1f\x4e\x5a\xab\x42\x9b\x5b\x2e\x8d\xf6\xa1\x0a\xc8\xb5\x64\xa4\xc8\x22\x99\xc1\x83\x3a\xba\xd9\xdc\xd3\xde\xb9\x92\x52\x3c\x2a\xb2\xf5\x79\xfe\xc6\x94\xaf\xa2\x14\xbb\xaf\x21\x49\xfe\xe9\xc4\x05\x2d\x23\x5e\xf3\x64\x9e\x51\xc2\x1d\x2c\xf9\xbd\x9a\xeb\x88\xf6\x0c\x07\x88\x8e\x06\x9b\x0d\x7d\x20\x77\x3d\xf6\x95\x22\xb1\xe4\xc5\x25\xbc\x64\x78\x22\xcf\x79\x51\xf0\x6e\x49\x39\xdd\x63\xe5\x5e\x5e\xec\x49\xc0\x7b\x41\x37\xa2\x5d\x53\xb8\x1b\x80\x7a\xcf\x92\xee\x59\x1e\x2a\xa8\x04\x5f\x9c\x88\x51\x87\x43\x7b\xca\x91\x73\x40\x1e\x8c\xe0\x68\x66\xdf\x32\xc0\x3b\x03\x4e\xf3\x09\x9b\xe2\x04\xbc\x8e\xad\xf3\xcf\x72\x3c\x94\xe3\x57\x7a\x94\xa0\x6b\x4e\x72\xed\xac\x8c\xf6\x48\x62\x11\x45\x01\x9f\x50\x47\xb1\xec\x27\xff\xf6\x4d\x72\x3d\x39\xa1\x90\xd1\xbe\x4d\xe8\x33\x41\x79\xa4\x22\xb1\x02\xd2\x1d\xe2\xfa\xb6\x2e\x59\x1d\x49\x8a\x46\xb9\x64\xcf\x64\x26\xd0\xcc\xab\x58\x17\xd9\x74\x24\x0f\xf2\x1a\xbe\x97\x4c\x55\x22\xb3\x1c\x4d\xb7\x9b\xfb\x66\xff\x7e\x69\xb4\xb4\xde\x40\xcc\xbd\x46\x69\x58\xaa\x55\xc8\x07\xf6\xb3\x27\xa1\xa0\x3d\xd1\x5f\x02\xab\x0e\x42\x0a\x67\xf0\xc5\x88\x8d\x18\x61\x9a\xd7\x40\x4c\x67\xeb\x12\x57\xa7\xce\x3f\x7c\x18\x1d\x6e\xe4\x1c\xaf\x46\xee\x43\x11\x95\x8c\x39\xf9\xaa\xc7\xb4\x04\x3b\x95\xf6\x61\xc0\x88\x8d\x28\x61\xd8\xa9\xd6\xbd\x0a\x65\x15\x02\xe4\xd3\x0e\xa1\x4a\x12\xd2\x25\x5e\xbc\x87\x14\x66\xf6\xbb\x54\xe1\xa1\xa3\xff\x47\x7d\x39\x1e\x24\x8f\x44\x9c\x16\xae\x16\x26\x28\x19\x1a\xe0\xae\xb4\xc0\x72\xc3\x75\x94\xac\xc6\x12\xb0\x51\x90\x7c\x34\x2f\x72\xc1\xf2\x35\xdd\x13\x80\x92\x98\x77\x7d\xd4\xad\x88\x99\x7a\x27\xd1\x11\x6a\x68\xaa\xf5\x91\x91\xc1\x28\x3b\xd2\xd1\x55\x33\xb2\x4a\x1d\x5a\x61\x77\x36\xf5\xea\x2f\xb5\x6d\x07\xda\x23\xa5\xad\xa4\x9b\x39\xcf\xfb\xa9\xaf\xd2\xf7\xc0\x0c\x44\x18\xd2\x23\xfd\xd9\x55\x0b\xde\x79\xeb\xef\x17\x52\x6a\xb2\x91\x6a\x82\x7a\x43\x55\xd9\x75\xb7\x04\xe0\xa5\x4d\xf4\x54\x0a\xa9\x23\x09\xb4\xde\x27\x95\xfc\x14\xec\x3c\x68\x6f\x20\xee\xc6\xc0\xa8\x65\x42\x24\xf5\xb1\x20\x46\x96\xa4\x19\x5a\x39\x5f\x9a\xfb\xb6\x52\xb0\xf9\xe7\x2f\x2e\xe2\xe6\xb4\x26\xbb\x84\xc3\xa5\xc2\x49\x49\xb7\xe7\xcb\x9e\x5c\x96\x8e\x49\x82\x7a\x01\x0d\x93\x50\xfd\x15\x86\x03\x42\x34\x58\xc7\x3a\x81\x6b\x79\x5e\xb6\x55\x51\x12\x59\x81\xab\xf1\xe0\x03\xd7\x50\x8e\x06\x63\xc9\x32\x55\xaa\x0c\xbb\x72\x89\xd8\x99\x9e\xb9\x9f\xab\x72\x17\xae\x26\x02\x5b\xd5\x5f\x8a\xfd\x19\xee\x0d\x3d\x6b\x04\xd4\x6e\x02\x6a\x54\x0c\x3e\x20\xb7\x33\x0a\xe4\xc0\xec\xef\x75\x80\x56\x1f\x03\x20\x3c\xe0\x63\x46\x23\x0e\xb6\xcd\x30\x47\x40\x9b\xcc\x89\x31\xde\xf1\xc6\xad\x26\xa9\x91\xc7\xe0\x07\x74\x5c\x0d\x24\x45\x31\x3f\x1a\x38\x11\x03\x14\x8b\x6d\x44\x55\x25\xaa\x5e\xbf\x26\xc7\x8e\x02\xdd\xa9\x59\x4c\x1b\x9a\xc5\x6a\x3c\xdc\x17\x0f\x7c\xfb\xab\x2b\xb4\xa3\x45\x46\x5a\x9e\x66\xe8\x8d\xfd\x01\x71\x36\x73\xf3\x7e\x00\x7b\x00\xca\x1b\x01\x68\xcf\x88\x76\x0f\xaf\x15\x5e\x51\xfa\x79\x57\x69\x5d\xa9\xb9\x48\xd7\x00\xd1\x66\xa3\x56\x5c\x0d\x52\x4e\xaf\xea\x32\x2b\x53\xe4\xa8\xd9\x07\xf4\xed\x8a\xba\x5d\x54\xab\x82\x26\xfe\x9b\x02\xc7\x75\xe0\x8e\xb6\xb6\x1f\x58\xc6\x94\x10\x11\x53\xa5\xd2\x4c\x4b\x31\x16\xe6\x91\x54\x0c\x4a\x41\xba\x71\xdd\xae\x81\x83\x69\xb3\x25\xbf\x4a\x9a\x4b\xda\x65\x21\xa6\x9c\xf6\x68\x90\xc0\x73\xc2\xea\xe1\xa2\x99\xdb\x16\xa8\x27\xab\x64\x4e\x3d\x55\x18\x0d\x54\x54\x40\xf7\x27\xd5\x03\x18\x7d\xbe\xba\x61\x08\xd0\x08\x55\x1d\x69\x34\xa1\x8e\x0f\xe5\x67\xb6\x82\x33\x7f\xe3\xbd\x89\xc3\x65\xde\x80\x8b\x50\xfc\x1b\x93\x64\xa4\x36\x9a\xdc\x9a\x79\xa2\x0f\x7a\x43\x54\xc7\x5e\x8a\x3b\x75\x44\x9b\x25\xf3\xcf\xef\x57\xfe\xe3\x12\x9d\xbd\x47\xea\xfd\x99\x03\x3b\xbb\x0b\xc3\x3d\x1e\xf8\xa8\xe2\xa1\x8d\xb3\x90\x3a\x43\xfc\xc9\x1d\x69\x5c\xe5\xf7\x78\xec\x16\xf6\xba\x1e\xa5\x6d\x28\xed\xe2\xc3\x01\x66\x23\x19\x0a\xf5\x22\x7f\x39\x8f\x5b\x9a\x64\x13\xbd\x66\xa1\x78\x50\x5f\x4f\x72\x22\xf4\x83\xcf\x96\x11\xf2\x21\x3b\xef\x8b\x34\xbc\x7f\xb4\x29\x70\x17\xdb\x76\xad\x69\x56\x6f\xc7\xae\x5e\xc3\xcc\xba\x28\xa5\x18\x62\x8b\x4e\xfa\x6a\x57\xd8\x25\xc7\xc2\x50\x3f\x4f\x7e\x30\x18\xcb\xae\xc4\x11\x0b\x43\x78\xad\x46\xcd\x64\x4b\x92\x43\xdc\x77\xce\x98\xa9\x73\x57\x4e\x5a\x24\x83\x7c\x5c\x7b\xfd\x10\x8b\x2d\xdc\x08\x7a\x8b\x51\x79\x06\xb6\xf0\xad\xbf\x3d\x84\x08\xc9\x2b\xb1\x48\x4b\x43\x6c\xce\xe6\x02\x98\xaf\x39\xd8\xbd\xb9\x99\x6c\x3b\x43\xe2\xe0\xa8\x1c\x9d\x1a\xb8\x25\x4b\xe9\x53\x25\xab\x4f\x78\xd9\xf6\xa2\xca\xce\x62\x97\x88\x91\x23\xda\x94\x3c\xe8\x82\xe5\x49\x96\x7d\xa9\x65\x94\x0b\xb1\x56\x4d\x56\x14\x9f\x1f\x2e\x69\x92\xee\xa2\x0e\xd5\xa9\xd2\x6e\xff\x61\xe8\x94\x8b\x44\xbd\xe5\xb3\xa4\xa4\xef\x8a\xcf\xd4\xc3\x5e\x87\x58\x36\x21\x8a\x30\x14\x55\xb1\x0a\x61\xd4\xf3\xad\x25\x6d\xeb\x3d\x9c\xde\x0d\x6f\x58\xf5\x82\x6e\xf1\x8a\x92\xe6\x2b\x59\xa7\x8c\xf1\xa9\x59\xcc\x6d\x71\xc9\x66\x72\xe3\xd1\xe6\xea\xa5\x85\x06\xaf\x15\x21\xda\xb6\xae\x74\xde\xf4\xd9\x48\x49\x23\x86\xce\x99\x7b\x41\xeb\xef\x73\x27\x42\xd5\x0e\xc2\x88\x67\x34\x97\xc7\x8b\xeb\xed\xe8\x03\x64\x54\x0a\x05\x60\x9d\x02\xd2\xbd\xe3\x9f\xcb\x23\xea\x73\x20\x08\x7e\x13\xcc\xdc\x23\x85\x11\x78\x38\xa8\xc2\xd0\x35\xf7\x1a\x3e\x32\xe7\x0b\xd5\x94\xe2\x82\xf2\x2c\xf9\x52\xca\xc3\x4e\x41\x86\x78\x4e\x06\x23\x0d\x86\x74\x06\xd8\x6d\x5b\xd9\xde\xae\x8a\xd7\x2a\x46\xf3\x23\x31\x32\x44\x20\x9f\x14\xd3\x11\x7b\x20\xc2\x30\x37\xba\x26\x05\x1e\x62\x81\xf3\x49\xd1\x1d\x4e\x31\x43\xb8\xe8\x92\x03\x3c\x27\x96\x7f\x15\x72\x5d\xc3\xdd\x30\x5b\x44\x65\xbf\x58\x25\x7f\xae\x29\xb2\xc5\x39\x2e\x7a\x1c\x0b\x1c\xe8\x46\xef\x05\x5d\x8a\x70\x41\x78\xf7\x40\x89\x78\x41\xb9\x98\x1f\x15\x23\xde\x25\x07\xe6\x1c\x9f\x4f\x78\x77\x38\x1d\xa9\x3f\x24\x4a\xc6\x49\xd7\xbc\xe5\x76\x01\x6d\xb7\x38\x41\xd8\x74\x3d\xc3\xbc\x31\xdd\xbc\x3e\xd7\xb8\x20\x83\x51\x71\x54\x1f\xca\xea\x34\x57\xa0\x32\x2a\x0c\xa5\xbb\x06\xc3\x04\x65\x9c\x63\x78\x58\x4e\xcb\x38\xe9\xcf\xce\xc0\xf1\xd6\x66\x93\xc0\x10\x43\x60\x9c\x28\x1f\x50\x8e\x75\x57\xf7\x4c\xd5\xa1\xca\xc2\x41\xb9\xd9\x98\xaf\xc9\x60\xda\x21\x35\xdc\x32\xb3\x70\x2e\xcb\xfe\x06\xbc\x13\x88\x42\x1c\xbe\xf9\x81\xe8\x17\x2b\x59\x01\x20\xfc\x73\x76\xb6\xcc\xe4\x41\xd3\xb8\x60\x7f\x2f\x22\x07\x1b\x99\x02\x8f\x70\x42\x34\x62\x33\x34\xca\x41\xe0\xa9\x46\x2c\x47\x98\xaa\xcf\x87\x0b\x41\x39\x61\xfd\x32\xb9\xa0\x51\x47\xc7\xcb\x76\x92\x44\x7f\xe0\xa4\xaf\xc7\x60\xac\xd3\x1e\xa9\x20\xb1\x09\xb1\x9f\x00\xf7\x08\x5e\x4e\x75\x98\xe4\x84\x10\xd5\xca\xa5\x69\xff\x53\x2e\x0f\xe7\x94\x03\x0f\x69\xda\x6f\x22\x89\x73\x78\xaa\xa7\xe1\x6e\x77\x07\x28\xab\x14\xb5\x67\xba\xe2\xa8\xbe\x50\x5f\x90\x03\x20\x70\x4e\xec\xe3\x72\x10\x72\x33\xa8\xc9\x91\x1d\xba\x07\xde\x15\x8d\x18\xee\x0c\x30\x35\xb7\x6c\xf5\xcd\xd6\x8a\x2f\x70\x8e\x13\x5d\x43\x46\x40\xe3\x5d\xb2\x1d\xb6\x27\x95\x34\x74\x3c\xa4\xb7\xe2\xe1\x60\x80\x70\x49\xe8\xa8\x7c\x90\x8d\x7a\xbd\x12\xf0\xa7\x3c\x22\x89\x7f\xec\xd3\x41\xa8\xbb\x20\xbf\x8b\x28\xc1\x65\x6f\x08\x26\x6f\x9c\x09\x95\xdd\x98\x87\x21\xdc\x5b\x96\xdd\x68\xee\x1e\xe0\x97\x74\x3c\xaf\xe8\x6f\x3c\x40\xb2\x0e\x77\x68\xed\xf9\xbe\x1c\x29\x2d\xd6\x4f\x51\xa1\x88\x8a\x22\xa4\x16\x11\x0d\x1b\x32\xd2\xe2\xa7\x7c\xb3\x61\x0f\x52\x04\x52\xe3\xb2\x37\xc4\x8c\xa4\x95\xa6\xfa\x56\x8f\x0f\xce\x48\xf2\x80\x19\x31\xc7\xef\x22\x62\x38\xe9\x0d\x91\xd3\x78\x5c\x92\x6c\xbc\xa2\xa0\x9f\x76\x92\x5c\xd0\x34\x62\x38\xc3\x09\x8a\xed\xf0\xff\x29\x22\x35\x47\x08\x27\x15\x6f\xa2\x44\x71\x09\xa6\x15\xcd\x93\x13\x2d\xa7\x9c\x6b\xa2\x68\x2e\x29\x4a\x2d\x65\xf4\xd6\x00\x21\xb4\x37\xdc\x6c\xd8\xbf\xee\x10\x32\x90\x5d\x21\x79\xff\x82\xd1\xcb\xa7\xbc\x38\x0f\x43\x76\xa4\x42\xef\x8a\x71\xa9\x56\x8b\x72\xff\x86\x4b\x38\xb2\xbd\x64\xb9\xdc\xc6\xc1\xa3\xa0\x6e\x9c\x45\x63\x55\x1b\xc2\x0e\x22\x5e\x34\xf6\x1b\x67\xf9\x26\xf0\xac\xf5\x57\xb8\x93\xaa\x0f\x36\xe6\x6a\x0f\x49\xb4\x94\x3a\x01\xf6\x1e\xb6\xbd\x20\x00\xe6\xe7\x0b\x8d\x72\x43\x1a\xd1\xa8\x93\xc8\x93\x71\x84\x46\x68\x26\xe3\x13\x9b\x82\x3d\x08\x8e\xf6\x52\x25\x78\x10\xfd\x59\x96\xe4\x9f\x65\xd7\xaa\x6b\x05\x1b\x15\xa9\x5b\x1e\x47\xaa\x6f\xe4\x06\x3f\xb8\x5a\x57\x80\xea\x0d\x38\xf5\xf8\xc8\x34\xcb\xa1\xa4\x33\x67\x8c\xfc\x17\x19\xc3\xc1\x28\xef\x76\xd1\x35\x83\xdb\x9f\xc1\x54\xd5\xc8\x91\xc2\x09\x7b\xfb\x2d\x80\x39\x81\x21\x03\x31\x0a\x9c\x15\xf5\xa9\xc0\x2c\xa7\x6d\x43\x90\x2e\x7b\xb2\x17\x74\xd5\xf5\x61\x37\xd8\x5b\x24\x2c\xa3\xe9\x9e\x28\xf6\x92\xf4\x42\xae\xa1\xbd\x52\x70\x9a\x9c\xf7\x03\xb4\x95\x27\xff\xef\xe7\xcc\xe4\x04\x9f\x51\x85\x2a\x96\x8d\xe9\x56\xdc\xb5\xd2\x7d\xa0\x61\x28\x1e\x34\x38\x1b\xc3\xd4\x7a\xdc\x8e\x40\x18\xd8\xa7\x9b\x79\x39\xd7\x6b\x65\xb5\x4d\x36\x64\xc4\xa3\x5a\x86\x49\x83\x63\x9a\xc2\xc3\xf2\x46\x74\x97\x1c\x8c\x9c\x5e\xde\x04\x41\xee\xed\x7a\x83\x55\xda\x6f\x92\x33\xd5\x9e\x7e\xa3\xfd\x68\x6f\xf3\x1f\x64\x76\xf9\xfe\xbf\xf7\x41\x49\xa4\x64\x5f\x69\xfc\xed\xa6\xf5\x24\xa3\xec\x8d\x84\x59\x95\x8d\x13\x38\x8c\x7a\xb7\xc9\x3c\x3e\x18\x58\x87\x88\x55\x64\xaf\x07\x60\x2d\x2d\x6a\x90\x7b\xb3\xd7\xd4\x48\xac\xa6\x55\x02\xfc\x3b\xa8\x65\x4d\xcd\xca\xe3\xd8\x41\x16\x4b\xd6\xbc\xac\x08\x73\x54\xeb\x8f\xa4\x39\x2d\x98\x05\x67\x1e\x31\x7e\xaf\x45\x15\x96\x88\x54\xfc\x33\x8a\xab\x6f\x4f\x70\xe1\x77\x1e\x9a\xbc\xa4\x11\x6d\x8e\x0c\x8a\xa9\xe2\xec\x1f\xd5\x39\xf5\x8a\x4f\xe7\x82\x08\xf7\x84\x44\xc1\x5e\xc7\xca\x1c\xda\xcd\x35\x9a\x39\x75\x19\x37\x96\xf0\x92\x9f\x2a\x7b\x42\x4e\x9b\xbd\x0b\xb1\x87\x75\x62\x89\x13\x9c\xe9\x9d\xb5\x24\x99\xea\x2f\x6c\x86\x19\x8e\x28\x49\x69\x94\x61\x8a\x90\xa6\xba\x73\xc5\x56\x99\x3b\x24\x84\x53\x43\x5e\x0b\xc3\xc6\xd7\x69\xec\x5c\xd1\x58\x06\xd7\x44\x93\x29\x1a\x45\x6c\xb3\x49\x41\x04\x07\x97\x45\x61\xd8\x49\x0d\x59\x4d\x75\xe7\x21\x19\xe7\x64\x46\xa3\x12\xa7\x78\x6e\x26\x9b\x85\x61\x52\xa9\x3e\x3f\xa2\x51\x8a\x73\x39\xd3\xba\xd9\x26\x1f\xaa\xf6\x31\xc9\x53\x56\x59\x4d\x06\x47\xeb\xd0\xa1\xd0\x70\x3f\x63\xec\x54\x70\x62\x0d\xad\x45\xe3\xf8\x3f\x9b\xd3\xb2\x8b\x40\xae\x1e\xcd\x92\xf9\xe7\x33\x5e\xac\xf3\xb4\x87\xc6\xd1\xe9\x49\x17\xed\x23\x7d\x9f\xaf\xae\x28\x84\x55\x16\x1a\x60\x6e\x0c\x90\x99\x28\x1d\xd1\xe5\xae\xf1\x32\x7d\xdb\x3f\x19\x4e\xc7\x81\xe6\x8c\x83\x38\xb0\x8c\x71\x30\xd2\xba\x7d\x13\x36\x1d\x83\xb9\x1a\x3e\x39\x98\xc6\x9e\xe9\x35\x68\x23\x18\x5f\x93\x69\x8e\xfd\xb5\xc0\x58\x5b\x9a\xb0\x29\xda\x6c\xe0\xaf\xb1\xb9\x74\x30\xb5\x3c\x85\x23\x9b\xff\x40\x2b\xa3\x37\x12\x3b\xcc\xcd\x0c\xef\x2f\xb2\x44\x08\x9a\x9f\xac\x92\xbc\xd4\x6d\x92\x0c\xaa\x3c\x54\x99\x69\x77\xb3\xa8\x8e\x15\xf2\x68\x85\xb5\x65\x98\xf5\x4d\xdb\x31\x43\x78\xe9\x80\x4a\xd2\x54\xee\x1f\xda\xa9\xef\x44\x96\x57\xca\x0d\x7a\x73\x3e\xa1\xd1\x17\x79\x36\xaa\x38\x74\x34\xea\xac\x0d\x2e\xc9\x29\x5d\x2b\x79\xe2\x0d\xdc\xfe\x38\x2a\x49\x67\x88\xb3\x30\xd4\x5c\x04\xc3\x50\x08\xa9\x3f\xc4\x08\xcf\x71\xa1\xf8\xee\xb8\x20\x27\x34\x9a\xc9\x6a\xd7\xa6\x62\xbc\x94\x55\xe3\xa5\x1a\xa7\x15\x59\xca\xa9\x95\x1b\xde\x68\x15\x86\x51\x41\x82\xf3\x5e\xd0\x8d\x8a\xf1\x4a\x1e\xbf\xba\x45\xbc\x42\x70\xd6\xeb\x94\x9b\x4d\xda\x21\x85\x7e\x1a\x3a\x3f\x5a\x2b\xec\x1f\xa1\x3c\x72\x8e\x86\x3a\x16\xcf\xbb\x77\xe8\x2d\x84\x53\x34\x4a\x49\xb1\xd5\xb1\x64\xad\x18\x0e\x03\x60\x55\x94\x1a\x7f\x17\x2e\x04\xb9\x9a\x54\xf9\x51\x1e\x2d\x70\x2a\x17\xf2\x42\xbd\xe3\xfc\x28\xa9\x1e\x7e\x2e\x7f\x2b\x22\x71\x49\x3d\x8a\x74\x9e\xf0\xcf\x94\xef\x7c\xfc\x55\x29\xa7\xd6\x17\xd3\x45\xbb\xd9\x1e\x73\x60\x98\x70\x50\x84\x61\xa6\x02\xcf\x3c\x8b\x85\xfa\xb2\x7e\xb5\x51\xb7\x98\xd2\xed\x32\x24\x26\x6c\x0a\xdb\x7d\xc4\x37\x9b\x88\x4b\x42\x83\xb4\xbc\xc0\xbf\xe7\xb0\x60\xaf\xdc\x4b\xa1\x85\x9c\x5b\x77\x13\xd7\x17\xca\x8a\xd8\xc9\x1e\x2b\x02\x08\x4c\xb6\x1f\xa5\x1a\x9f\x02\xc2\x63\x66\x8a\x88\xa2\x56\xc0\x44\xb8\xd9\x15\xd5\x08\xc3\x0e\x6b\xd4\x2d\x4f\xac\x50\xc7\x7c\x89\x13\x02\xc5\xe7\x4b\x9c\x11\x75\x2f\xa7\xd2\x00\x2a\xc2\x65\x63\x1b\x51\x0f\x70\xbd\x59\xb8\xf9\xf5\x2d\x28\x2e\xaa\x49\x18\x29\xc6\x49\xbd\x9b\x05\x7d\xd7\x3e\xcb\xe7\xd9\xba\x64\x17\xf4\x25\x5d\x88\xb1\x7e\xa5\x4b\x68\x6c\xde\xeb\x22\xe7\x9d\x2d\xdd\x6c\x82\x59\x51\x7c\x96\xc0\x82\x0e\xc9\x60\x4f\xda\x6c\xb8\x24\xdc\xaa\x82\x3e\xcb\x4b\xca\x85\x84\x05\x6a\x48\xf2\x7f\x67\xba\x24\x79\xb8\x94\x9b\x8e\x82\x88\x15\x95\x49\xfa\xa2\xd8\x6c\xdc\xb6\xbc\x95\x6b\x78\x0c\x0f\x85\xa1\x29\xf0\x60\x58\x89\x51\x65\xa0\x3a\xb8\xb2\x6d\xc4\x71\x8e\x33\x84\x8b\x7f\x76\xa0\xa2\xbf\xd4\xb4\xcd\xc6\x79\x96\x5c\x0d\x11\xd1\x43\xa4\xcf\x97\x6d\x83\x04\x6a\x59\xbb\x46\xc9\xb4\x41\x82\xf6\x5b\xb1\x6b\xb2\xcc\x18\xc9\x60\x8f\x3a\xe3\x5b\x0d\x5e\x8f\x7a\xc3\xc7\x60\x13\xc0\x73\x02\x26\x12\x1d\x39\x0a\x4e\xc9\x2f\x91\x8a\x31\x8a\xb8\xdd\x68\x3e\xce\xe3\x81\xb2\x61\x66\x07\x75\x4d\x06\xa3\xf5\x91\x23\x1f\x5a\xab\x41\x5d\x92\x72\xb2\x56\x8f\x56\xa0\x19\x4b\x39\x73\x9a\x8a\xbe\xa2\x51\x81\x97\x7a\x3c\xd0\x68\x35\x96\x67\x70\x99\x81\xa8\xbc\x2b\xdb\x64\xf9\xd5\x4d\x51\xac\x12\xb7\x92\xb6\x16\xb6\xea\x05\x19\x8c\x16\x47\x45\x55\xf5\xc2\xbc\xfd\x2c\x26\x8b\xa9\xc6\xf6\x33\x78\x1d\x1e\xc9\x3f\x5d\x92\x22\x3d\x28\x67\x30\x46\xe3\x57\x92\x09\x39\x33\x0d\xd9\x6c\x22\x15\x4f\x52\x2c\x5b\x54\x6e\x36\x51\xe9\xcc\xcc\x19\x42\xb1\xce\xd1\xdd\x9d\x65\xab\xb6\xcd\x3f\x68\x54\x22\x84\x8b\x30\x2c\x3a\xb0\x93\x16\x32\xaa\x40\x6a\xe3\x3c\x27\x93\x52\x69\x0a\xce\x55\x9b\x2f\xf0\x17\x7f\x02\x7a\x07\x32\xf9\x8b\x64\xb6\xab\xc1\x9e\x91\xc1\x68\xe6\x0e\xf6\x0c\xe9\xad\x7a\x32\x9b\xaa\x8e\x5e\x6c\x36\xd1\x45\x13\x9d\x20\x83\xea\xa7\x12\x4f\xc0\x96\x57\xc9\x59\x1f\x91\xc1\xe8\xd1\xd1\x97\x51\xb7\xfb\x08\x9d\xab\x92\x17\x68\xa4\xbf\x0a\x8b\x32\xe7\x8e\x65\x53\x5a\x53\xc8\x1e\x51\x77\x6d\x55\xb7\xe3\x13\x6a\xe6\x82\x6b\xca\xc3\xf5\x72\xe1\xd0\x64\x65\xc4\xcf\xac\x0e\x30\x8f\xf6\xeb\x92\xe6\x60\xfd\x3c\x0c\x85\x11\x94\xd2\x5e\x0f\x57\xfa\xd3\xa6\xa6\xb1\x50\x82\xc5\xea\x9d\x01\x75\x5f\x51\xd4\x28\x72\xc3\xe4\x1c\x75\xf7\x2e\x3a\xe1\x66\x8c\xf4\x1b\x2d\x75\x04\x45\x23\x0f\x10\xa9\x49\x32\x5f\x38\xbb\xcd\x77\xc3\x57\x0f\xdf\xda\xe1\xbb\x9a\x7b\xef\xa8\xa7\x1e\xee\x93\x80\xde\x30\x76\x9e\xb6\xbc\xde\x91\x55\xd1\x2c\x2f\xeb\xe7\x9a\x56\x91\xab\xb0\xa3\xb5\x4b\x2c\x92\xb1\x45\x34\xe8\x54\x96\x27\xf8\xc8\x88\x04\x17\x2c\x4f\x23\x25\x80\xd5\x9f\x89\xdc\xc0\x98\x26\xee\xf0\x07\x6d\x36\xd0\x83\xde\x3b\x90\x83\x18\x69\xc2\xb8\x27\x79\xf7\x88\xf5\x45\x81\x73\x49\x18\x36\x1b\x68\x7d\xef\x35\xd5\x4f\xb3\x58\xda\x13\x7d\x96\x3a\x1e\x83\xdc\x26\x63\x46\x9e\x53\x65\x2f\xd9\x9b\x5f\xe6\xd0\x7a\xa5\x35\x80\x95\x65\x5b\xe6\x5a\xb6\x8d\x72\xa5\x02\x6b\x51\x4e\x5b\xea\x4c\xc3\x50\xad\xa6\x88\x8e\x55\xf3\x63\x68\x9c\x26\xe0\x9f\x25\x67\x98\x1b\x62\x71\x34\x40\x4a\xff\xc7\x92\xb1\x26\x1f\x72\xec\xce\x08\x74\xa0\x33\x70\x9d\x12\x35\x93\x87\xae\x1b\xa2\xbf\xda\x63\xb9\xbb\xb1\x96\xdd\x8d\x4d\xf2\xe9\x28\x69\xe9\x6d\xe4\x6f\x31\xee\xa6\xef\x6e\x80\x7a\x9b\x73\x87\x21\xa9\x0f\x83\x8d\x68\x51\x79\x7d\x4a\x5d\x4b\x9b\xaa\x4d\x5a\x79\x13\x67\xd0\xad\xa4\xde\xad\xcc\x76\xab\x24\x83\x51\x79\x94\x55\xdd\x2a\x15\x88\x82\x64\x9a\x84\x16\x8d\x9e\x19\xfb\x04\x36\x05\xf0\x73\xa0\x8e\xb4\xd1\x5c\x21\x28\x57\xb8\x69\xf2\x00\x8a\xe6\x08\x4e\x31\xd1\x5c\x22\x26\x53\x58\x59\x65\x78\x4d\xb5\x25\x95\x4e\x94\x3e\x20\x83\x30\x5c\x1f\x91\xc1\x66\x93\x1e\xc1\xf7\x03\x02\x43\xa1\x42\x55\xa3\xfc\x65\x18\x86\x79\x6d\x0d\x9b\xda\x38\x7a\x40\x06\xb1\x13\x1a\xa0\xcd\x46\x55\xf3\x17\x81\x41\xef\x18\x3a\x32\xe0\x4c\x78\x60\x35\x4d\x3a\x03\xf7\x29\xe8\x27\x9f\x90\x8f\x28\x01\xbc\x1d\x21\x61\x56\x76\x6f\x28\x11\xd7\xd7\x38\x75\x14\xe2\x3d\x62\x62\x26\x96\x91\x4f\x34\x72\x56\x05\x21\x6c\x4c\xe3\xdf\x44\xe4\x3e\x01\xfd\xea\x90\xce\x07\x02\x94\x0f\x94\x80\xd8\xb7\x73\x23\xb1\xff\xf7\x4a\x58\xda\xf9\x11\xdc\x44\x39\x99\xd4\x1d\x19\x79\x4b\x23\x86\x46\x88\x11\x3d\xe3\xcd\x66\x43\xfd\x5d\xe7\x59\xe1\x8f\x5e\xe3\x9f\x83\xa0\xad\x86\x8b\xae\xb2\xa9\x26\x2a\x2d\x2f\x5d\xd9\x22\x8a\xe4\x39\x3f\x6f\xa1\x2b\x8e\xea\xa9\xa2\x8e\x76\x1e\xcc\x3d\x8a\x2a\x70\xc9\xd2\x33\x0a\x4f\xb5\x40\x4b\x8f\xe9\xed\x92\x35\xa6\x5f\x4e\x76\x18\xbe\x37\x77\x56\xce\xb4\x56\x9a\xf0\xee\xfd\x9a\xd6\x4a\xb3\x2c\x18\xab\xf6\xdb\x6a\xa0\xcc\x18\x41\x49\xa6\xc4\x40\xaf\x24\x91\x96\x5f\xde\x51\xc8\x14\x56\x87\x5d\xbe\x0b\x3b\xb9\x32\xed\xe3\xa9\xb5\xd9\x8e\xef\x20\xd4\x5e\x45\x2e\xd1\x96\xe3\x2b\xb7\x1a\x27\x79\x07\x0d\xef\xe4\x6d\xe3\x99\x7b\x3c\x87\xb9\x89\x01\xfa\x26\x7f\x0d\x73\x02\xb4\xaf\x75\xbc\x37\x9b\x1d\x1d\x45\x76\x26\x72\x67\x26\x2a\x85\xff\x3a\x9f\x84\x39\x89\x04\x51\x2e\xaf\x8c\xa6\xb1\x35\xab\xed\x6b\xce\x3a\x3a\xe5\x4a\x73\x96\x29\x8e\x9a\x10\x61\x74\x66\xbb\x56\x99\x77\x5b\x19\x23\xe6\x46\x4f\x39\x19\x25\x44\x52\x67\x54\xd7\x53\x56\xaa\xba\x49\x8b\xd2\xb0\x95\x09\x55\x89\x93\x0c\xaa\x2d\x09\xe1\x55\xb5\xa5\xa9\xb6\x69\xcc\x0a\x5c\x46\x5d\x2b\x63\x30\x46\x6d\xdb\x2c\xd6\x6a\xe6\x29\xe6\x5a\x1f\xdd\x9c\x39\x18\x11\x8a\xfa\xc8\x55\x7c\x6d\xcf\xca\x40\xbc\x01\x43\x19\xc9\xab\xe3\xb9\x52\x50\xd6\x27\xe9\x5e\xae\xce\xd1\x30\x08\x0a\xce\x5b\x07\x4e\xe2\xc3\xe1\x3d\xc2\x3c\x66\x3b\xb1\x27\x72\xde\x25\x11\x83\x8d\xaf\xa9\x94\xd9\x4b\x74\x25\xcd\x3d\xee\x57\x8f\xed\xd4\xb7\xa4\xd0\xc1\xb4\x98\x8f\x28\x88\x89\x59\x4e\x25\x19\xe3\x98\xeb\xbb\x4a\x6c\xe3\xb5\x77\xa5\x3f\xe5\xf9\x5f\x47\x39\xa9\x8f\x96\x49\x7e\x06\x4f\xda\x31\x57\xb7\x77\x75\xf9\x36\x27\x30\xe6\x23\xfe\xa0\x06\x12\xee\x98\xfd\x4a\x78\x05\x98\x08\xb4\x55\x4a\x47\xbf\xef\x90\x58\xcb\xde\x13\x01\x4e\x0f\x97\xac\xc4\x46\x8b\x4c\xcd\x29\xe1\x63\xa5\x6c\x84\x62\x57\x49\x04\xfc\x7b\x5d\x1b\x2d\x7a\x25\x1c\x04\xb6\x7c\xfb\xbb\x77\x0f\xc4\x72\x7a\x5c\xb4\xa8\x15\xfd\xa6\x64\xf4\x68\x8b\x1f\x8a\xe8\x77\x7d\x51\xf5\x0b\x25\xd7\x5b\xfc\x33\xf5\x1e\x0a\xfd\x56\xed\x1f\x1d\xb1\xd9\xec\xff\xe7\xb4\xfc\x77\xf3\x11\x98\x2b\xf5\xf1\x24\x8f\xe3\x9f\x69\xfc\x4b\xf5\x82\x66\x22\xa6\x9b\x4d\x24\xff\xc0\x53\x6f\x7d\xdb\x72\x7a\xd2\xdd\x3f\xc3\xc1\xfc\xbc\xf7\x43\x18\x78\x4e\xea\xb8\xbb\x75\x3c\x31\xcf\x82\xed\xe9\x0a\x17\xe3\x60\x95\xa4\x29\xcb\xcf\xcc\xa3\xdf\xfe\x70\x75\x15\xc4\xea\x96\x9f\x91\xeb\x15\xa7\xf1\x93\x28\x58\x71\x1a\xe0\x09\x9f\x62\xc7\x64\x73\x4f\x8e\x4e\x80\xf0\xbc\xc8\x05\xcd\x45\xcc\xf1\xbc\xc8\xe2\x01\x5e\x15\x65\x3c\xc0\xf3\xf3\x58\x60\xc1\x13\x96\xb1\xfc\x0c\x74\x38\xe3\xce\x10\xc3\xdb\x51\x08\x95\xb1\xe8\x9f\x51\xf1\x1a\x64\xa3\x51\x20\x61\xfd\xca\x93\xd5\x8a\xe5\x67\x01\xda\x4a\x74\xa4\x49\xb9\xe6\xd4\x7d\xe9\xa4\xf6\x34\x12\xd1\x3e\xa7\xa5\x18\xab\x3f\x1a\xf1\xe5\xa9\x1f\x6e\x12\xb5\xf6\x89\x4e\x9d\xe4\xbd\xe1\x34\xd6\x37\x06\x99\xb1\xa4\xc3\x40\xba\x3a\xc0\x4c\x8e\xb5\xba\x63\xe3\x1c\xbf\x00\xcd\x0b\x6d\x9a\x5e\x57\x2f\x89\x6d\x46\x96\x22\x4a\xb4\x8e\x50\xca\xb8\x7a\x5f\xaa\x24\x23\x15\x00\xc6\x9d\x10\xbc\xb0\x95\x9b\xe2\x8a\x4c\xa6\x38\xe1\x51\x82\x19\x38\x57\xc6\x09\xa6\x9d\x6a\xf9\x81\x47\x28\x9e\x27\xd9\x2b\x55\x5d\x1a\x86\xbf\x89\x28\x41\x48\x5d\xea\x7a\x8a\x18\x7e\x84\xd1\x61\x81\x46\xe8\x6f\xf2\x79\x47\x26\xcc\x2a\x95\x97\x20\x68\x00\xaf\x94\x60\x00\x9a\x0d\x35\xe1\xd9\x24\xec\x64\x53\x30\x11\x06\x7e\xe0\x3c\x59\xe9\x19\x51\x5c\xc1\x4a\x9d\xcf\x07\x58\x8e\xb6\x46\x15\xcf\x6d\xc7\x93\xb6\x51\x57\xd0\xf2\x71\x64\xf1\x00\xc6\x12\x00\xe2\x2a\x6e\x9e\xcc\x97\x60\x7e\x3f\x8e\xfc\x9c\xe5\x66\x53\x8b\x70\xe4\x0d\x00\x05\xe1\xa8\x06\xc7\x2f\xa3\xa2\x9c\x52\xd7\x5b\xc5\x4b\x14\x66\xf3\xa9\xba\x03\x1a\xa9\xb2\x33\xa3\x68\xff\x74\x36\x3f\xef\x89\x64\x66\x5d\xe9\x94\x95\x43\x0b\xb4\xd9\x94\xfd\x3f\xd7\x94\x7f\x51\x6f\xa4\x0b\x1e\x86\xb5\x88\x28\xe8\xab\xf2\x81\xc6\x2f\x53\x47\xe5\x71\x25\x50\x19\x7a\x97\x3c\x59\xf5\x96\xc9\xfc\xb3\x7d\x2d\xaa\x4c\xa6\x04\x9c\xe6\x29\xe5\x92\x78\x06\xd8\xde\x96\xb1\xfe\x8a\x53\xa4\xfe\x54\xc0\x1a\xf3\x5d\x4b\x6f\x4e\xb3\xfb\xfe\x89\xf2\x68\x87\x8d\x84\x83\x83\x00\xe8\x11\xcb\x2f\x92\x8c\xa5\xf3\x65\xc2\x2b\x4b\x02\xb4\x2f\x98\xc8\x28\x09\x4e\x4f\xd7\x41\xb7\x66\xcd\xb2\x6f\xcc\xc5\x47\xc3\xbb\xa0\xc2\xe4\xbd\xa1\x4e\x38\x4b\x7a\x59\x32\xa3\x59\x80\x35\x18\x84\xdd\x17\x35\xdc\xbb\x3c\x2a\x8c\xc8\x03\x0e\x5b\x38\x35\x8e\x42\x14\x05\x1a\xfb\x0a\x75\xa0\x01\xa1\x55\xb4\x86\x61\xd8\xd9\xdf\xdb\x6b\xd0\x69\xe1\x3c\xb4\xa3\x98\x91\x20\xc0\x35\x91\xad\x43\x83\xaa\x47\xfa\x68\x14\xec\x05\x60\x65\x1e\xdc\xe7\x54\xf6\xe4\x7b\xc3\xcd\xe6\xd6\x81\x79\xcf\xaf\x07\x21\xef\x0e\x61\xf2\x13\xa2\xec\x37\x20\xcc\xba\x24\xc1\x9c\x28\x20\x8e\x6c\x94\x62\xd1\xf7\x68\x2c\x8a\x29\x5e\x4b\x68\xe7\x5a\x2d\xad\x5c\xd1\x39\x4b\x32\x50\x64\xc5\x4b\xd2\x19\x8e\xe0\x62\x4a\x2b\xf7\xa3\xeb\x79\xdd\x7b\x89\x79\x48\xff\x94\x27\x67\xea\x49\xbc\x6b\xc5\x6e\x34\x42\xd7\x6b\xc0\xf7\x17\x79\x4a\xaf\xc8\x6a\xa4\xa4\x9c\xeb\xff\x87\xb5\x77\xef\x6e\xdb\xc6\xf6\x86\xbf\x8a\xa5\x35\x87\x8b\x28\x41\x57\x4a\x27\xeb\x7d\x1e\xd2\xb0\x56\x9a\x5e\x92\x99\x24\xbd\x24\xbd\x8d\x8e\x9e\x2e\x9a\x82\x2d\xb4\x34\xa8\x01\x29\x27\xae\xa9\xef\xfe\x2e\xec\x0d\x80\x00\x49\x39\x99\xb3\x4e\xff\x68\x2c\x10\xf7\xeb\xbe\xfe\x36\x86\x4c\xe2\x84\xde\xb0\xeb\xd5\x35\x6a\x19\xd3\x7d\x66\x85\x4b\xe9\x5e\xb7\x7b\x83\x33\x73\x3b\x6c\xd3\xa1\x3f\x6c\x8d\x9a\x72\x4f\xf7\xc9\x0d\x21\x79\x19\xdc\x14\x08\xf8\xd1\x03\x5e\xac\x6f\x37\x24\xbb\x25\x10\x59\x6e\x6f\xdd\xf4\xd0\xa6\x78\x5f\x37\xc9\x0d\xbd\xc5\xf0\x3b\x55\xc2\x6e\x4c\x1a\xbb\x01\xdd\xd7\xb5\xa1\x11\xf7\x09\xbb\x49\x10\x39\xe4\xce\xbd\x0d\x18\x19\x80\xb1\xeb\xf5\x62\x63\x31\xf7\x60\x46\x87\x0a\xc3\x2b\x76\x9f\x42\xfd\xff\x75\x9f\xc7\x77\x2c\xec\xac\xeb\xe5\x3f\xe2\x2b\x42\xe7\xee\x50\x93\x4f\x0a\x35\x74\x77\x12\x6c\xe3\xbf\xdb\xb9\x1b\xd5\x15\x38\xb6\x23\x22\x84\xee\x6d\xd7\xcd\xff\x5b\x9a\xbf\x57\xf1\xe9\x2e\xf5\x25\x56\xfa\xb4\xfe\x7d\xb1\x9d\x67\xf0\xc7\x93\xbf\x4f\x1c\xdb\x51\x97\x5d\x67\x60\x86\x6c\x67\x96\xfa\x12\xbe\x0b\x67\xca\xdb\x7d\xdf\x6b\x52\x65\x57\x57\x5b\x4d\x1a\xea\x72\x1f\xa9\xf5\x23\x4b\x7f\xb7\x21\xd9\x9d\xd7\x76\x7e\x62\x13\x2c\x29\xe4\x02\xe7\x99\x23\x4c\xd7\x99\x29\xe3\x74\xab\xa3\x23\xd0\x6f\xc7\x93\x7b\xab\x2f\x4c\x28\xf6\x0d\xa3\x9b\x2d\x6c\x63\x8c\x7b\xc2\xc9\xc1\x21\x65\xfa\xc4\x6f\xfd\x13\xef\x8e\xc9\x92\x50\xd5\x75\x18\x42\x6f\xd7\x75\x45\xd7\x99\xe7\xe6\x39\x53\xfa\xfe\xcd\x45\x14\xc5\xcf\x13\x26\x08\x95\xf8\x97\x44\xda\xf3\x59\x7f\x01\xaf\xcb\x0d\x7d\x6e\x02\xb9\xf4\x9a\x88\xb7\x67\x42\x9e\xd5\xa4\x1e\xba\xaa\xbf\x25\x00\xce\x70\x5f\xf1\xf9\x0c\x10\x12\xe1\xee\xc7\xbf\x9f\x85\x4b\xf4\x96\xd6\xeb\xb7\xbd\x36\xb3\x9d\x7c\xce\x9f\x91\xe3\xf4\x87\xd2\x37\x08\x13\x2a\x30\xae\xee\xad\xfc\xac\xd6\x9f\x02\x86\xa7\x64\x72\x25\x93\xf9\x59\x79\x9b\x5e\xd7\xaa\xe4\xe9\x15\x20\xc1\xcd\xb3\xf9\x30\xc5\x5d\x52\xa5\xe6\x2c\xeb\x86\x6e\x59\x99\x38\x49\x63\xde\x73\xb7\x07\xcb\xcc\x23\x84\x27\x77\xc4\xca\x2c\x8e\x0f\x8c\xaf\x77\x1b\xfd\x04\x5d\x96\x51\x74\x30\xda\xab\x92\xe4\xbb\x24\x21\xe6\xe2\xac\x2f\xd9\xb6\x87\x28\x0e\xfb\x9b\xb7\x68\x0f\x60\xac\x2f\x74\xee\xb4\x24\x90\x01\xed\x0b\x69\x0d\x12\x68\x80\x19\x63\x36\xa3\xcd\x56\x32\xfd\x97\x2f\xf6\x92\x6a\x68\x5a\x38\x13\x51\xe4\x0b\x0d\x72\x89\x02\xd7\xa9\x2d\x4a\x25\xa1\x3a\x3f\x9c\x48\x4b\x60\x09\xb9\x3f\xb4\xe7\x92\xf3\x6d\xf3\x1c\x17\xc9\xad\xaf\x7e\x99\xba\x0e\xc0\x67\xa6\xd6\xef\x44\x54\x38\xdc\x74\x9a\x60\x1b\x06\x51\x2b\x6f\x53\x14\x46\xcc\x35\x4b\xb8\x25\xb8\x65\x27\x7a\xd3\xf0\xf6\x27\xc9\xb7\xa2\x2d\xae\x2a\x10\x70\x4e\x77\x40\x92\xfe\x70\x0d\xdf\xbd\x00\x87\xab\x50\x43\xd3\x60\x5f\x32\x24\x0d\x47\x0f\xd2\x9c\x40\x3c\x0d\x0b\x44\x4b\xba\xa5\x07\xba\xa3\x7b\x66\x25\x0e\xf4\x9a\x2d\xe8\x0d\x5b\xd2\x5b\xfd\xde\xdf\xe1\x2b\x28\xae\xe3\x3b\xc6\xae\xc9\x43\xcd\x4a\xb6\x65\x8d\xfe\xb4\x73\x56\x26\xfa\x9f\x3b\xb6\xfc\xbc\x17\x25\xdc\x6b\x46\xe0\xca\x6e\x3e\xd4\x65\x79\x92\xf0\xe7\x16\x78\x55\xac\x9f\x6f\xe8\x5b\xf6\xcc\xea\x79\xf5\x73\xe4\xe9\x6b\xdf\x1a\x7d\xed\x33\x23\x2b\xba\x8e\xa2\xb7\xde\x7e\x20\xf7\xb8\x11\xde\xf6\xd0\x7e\xcf\xcc\x36\xbe\x76\x22\xa5\x67\x20\x52\xd2\xff\xbf\xbc\xee\xba\xb7\xbe\x60\xea\x19\xc8\xc3\xae\xbd\xfa\x89\x87\xe5\xf4\x0c\x04\x53\xcf\x40\x16\x75\x1d\x45\x77\x97\xcf\x8c\x42\x0f\xbe\xd0\x92\xcd\xe7\x84\xbe\x0d\xa8\xcb\x1a\x8d\x7d\xbc\x44\xc8\xd1\xa0\x06\x32\x6e\x56\x4d\x32\xcf\xd1\x2b\x00\x92\xf5\x57\x63\xad\x7d\x5f\x85\xe3\x8c\xb7\xb6\xae\x3e\x83\xce\xce\xe5\xd6\x65\xd6\xbd\xbf\x8b\xa2\xf8\xaa\xeb\xe2\x2b\x8f\x78\xef\x73\xd1\x67\x60\xb6\xf0\x16\x89\xc7\x28\x8a\xe3\x5d\xd7\xc5\x3b\xcd\x44\x10\x43\x97\xbe\xb5\x84\xe5\xdb\xf3\xc2\x6e\xe7\x5e\xc1\xf9\xb3\xbe\x48\x83\x2f\x5e\x0d\xeb\x9f\x37\xcc\xff\xb6\xfe\x79\x93\x07\x13\x1c\xcf\x0e\xa0\x9f\x38\x58\x4d\xe7\x5b\xa3\x9f\x38\xb0\x67\x88\x80\x7a\x86\x43\xbe\x34\x13\x8c\xf2\x55\x98\x62\x10\xfe\x69\xfa\xe5\xca\x75\xe6\x77\xb6\xc8\x7f\xbf\xb8\xb2\xfb\xe8\xf7\x84\x3d\x21\x57\xeb\xdf\x93\xe5\x06\xe7\xa1\xc4\x29\xbb\x5a\xff\xbe\x41\xb9\xf4\xa1\xeb\x0e\x6e\x69\x7b\x68\xdc\x45\xfe\xe2\xe2\xbe\xdf\x8d\x2f\x88\x54\x80\xbc\x75\xbf\x7e\x81\x05\x0f\xba\x8b\x46\x09\xb3\x20\xb0\xf1\xf5\xb6\xd0\xb9\xcc\xae\xd2\x97\xd7\x6a\x9f\x2c\x33\xfd\x07\x49\xaf\xe9\xc1\x57\xe6\xea\xef\xd0\x7f\xda\xe7\x36\xd7\x68\x7e\xb0\x9b\x2e\x3e\xb0\xd9\x92\x80\x0a\xfd\xfa\x92\xed\x0d\x91\x66\x7b\xf9\xbe\xb7\x29\xda\xd3\x3b\x62\x0e\xa1\x81\x45\x7e\xcd\xae\x93\x5b\xef\xc9\x9d\x19\x1d\xff\x2b\xf6\xfa\xf2\xfd\xea\xd6\xdd\xc9\xef\xd3\x6b\x92\xdd\xe6\xdc\x71\xea\x31\xa7\xaf\x68\xb5\xaa\x92\x3a\xab\xe9\x96\x5e\x27\xaf\x4c\x2d\x8c\xdd\xad\xca\x6c\x3e\xa7\x0d\xdd\xc1\xac\xbf\xbe\x64\xef\xc9\xc3\x2d\xb3\x95\xe9\xaa\xe8\x35\x7b\x6f\x30\x32\xae\xd9\x6b\xba\x65\xf3\xf9\xf1\xd6\xe1\x5c\x16\xb4\x60\x6a\x7d\x93\x24\x1b\x42\x2b\xf6\x2b\x8f\xf1\x07\xe5\x1e\x8d\x44\x0c\x55\x62\x47\xf9\x81\x2d\xf3\x0f\xbd\xdc\xfe\x83\x5e\xd1\xa0\xb7\x61\xe5\x1f\x36\x84\x42\xc5\x1f\x92\xe5\xa0\x62\xdf\x77\x5e\x85\x68\xda\x42\x3a\x57\x2c\xc5\x9b\x76\xda\x67\x97\x2a\x94\x50\x06\x7a\x96\x5e\x5f\x41\xc7\xb6\x4e\x9e\x82\x31\xb6\x62\xb8\x46\xfc\x65\xac\x89\x41\x66\xf3\x6b\x1b\xff\x10\xbb\x9f\x84\xa4\x2a\x59\x66\x4b\xcc\x2a\xeb\xad\xc9\x0a\x22\xbd\xde\x8e\x74\x27\xb6\x5b\x2e\xd9\x97\x43\x48\x80\x46\x4d\x78\x6a\x80\xc0\x85\xf1\xbc\xb8\x50\x79\xc1\xcc\xcb\x59\x81\xe1\x9f\x9e\x06\x30\x35\xfd\xcd\xf8\xd8\xd0\x02\xcc\xf6\x04\x2b\x92\x0a\x7a\x4a\x8d\x9b\x57\xe5\x79\x3b\x80\x2a\x4f\xf5\x50\x5c\xa5\x1a\xc6\x1e\x50\x1f\x03\x2a\x7d\xb0\x7d\xfb\x44\x14\xae\xbc\x56\x2b\xc1\x6a\x75\xbe\xe5\x55\x71\xcf\xb7\xcf\x8b\xaa\xba\x2a\xca\x3f\x9b\xac\xd4\x1f\x4a\x95\xc5\xfa\xff\x7a\xa8\x5e\x34\xb6\x83\xa2\x0b\xe2\x07\xfc\x9b\xc0\x31\x19\x8b\x32\xd5\xba\x0d\xf0\x4f\x25\x39\x92\x23\x45\xe1\xbb\xf2\x65\xee\x85\x9e\x15\xcf\xe7\x5f\x39\xd7\xc2\x52\xe5\x6e\x52\x4e\x1b\x5b\xb4\x6b\xbe\x89\xbd\xd5\xdb\xa9\x53\x4e\x01\x5c\xd3\xc6\xf2\xa6\x57\x33\x78\x4c\xb5\xfb\xb6\x96\x9b\x1c\x8c\x54\x35\x4f\xbc\xba\xc1\x35\xc8\xe6\x37\x87\xb6\xe5\x0a\xd2\xee\xfa\x06\x32\x43\xd6\xea\xe4\x5b\x9b\x15\x9f\x4d\xe4\xcb\xef\x95\x51\x54\x1d\x5d\x03\x2c\xb4\xda\xd8\xab\xc0\x76\x01\x36\xab\x21\x25\x80\xac\x81\x04\x03\x00\xe7\x49\x58\xe7\xfb\xba\x11\xba\x82\xec\x4c\xf1\xaa\x68\xc5\x1d\x07\x06\x0e\x64\xf6\x7d\x9c\x4e\x4d\xa6\x0d\x92\xac\x7c\xd7\x06\xfc\x95\x60\x0b\x8e\xf6\x4e\x14\x7f\x06\xf4\x91\xfd\x84\x10\x91\xae\x4f\x26\x30\xef\x5f\xc8\xb0\x3f\x21\xb6\x6c\x3f\xb2\x6b\x15\x9a\x5a\x9c\x92\x4d\xba\xd3\xad\x69\x50\xb8\x43\x0c\x06\xcf\x2a\x3e\x5d\x08\x8f\x71\x2f\xce\x55\xf6\x2f\xaa\xce\xaf\x0e\xa2\x6a\x49\x66\xa4\xd4\x9e\xe3\x5d\xd0\x21\xa3\x9d\xf3\x83\x34\x9b\x1e\xe7\xf8\xc9\x86\xce\x05\x45\x02\x2c\x83\x11\x76\xf1\xc7\xa7\x14\x72\x99\x4c\x36\x33\x16\xed\xe5\xa5\x33\xc6\x7b\xd1\xa9\x27\x0c\x9b\x99\x6e\xa1\x90\x3e\x76\x99\x98\x2b\x49\xbd\x0c\xcc\x2b\x49\xcd\xfe\x23\x99\x82\x0e\x87\x83\x63\xca\x9b\x07\x93\xf3\x21\x9e\x82\xf4\x70\x4d\xae\xdc\x5f\x60\xe1\x6b\x40\x46\x02\x81\x6f\x16\xa6\xd9\x38\xce\x4a\x53\x07\x03\x81\x7e\x6f\x5f\x3e\xd7\x73\xd2\xff\x24\x6a\xe5\xff\xf4\xbb\x9c\xc5\xc1\x97\x60\xbe\xfb\x90\xd5\x41\x65\x41\xd5\x68\xdc\xec\x28\x56\x47\xb8\xef\x55\x0c\x8b\xec\xe5\x14\xc6\x36\xf1\x4b\x08\xa5\x12\x07\xe7\x0d\x62\xd5\x7a\x61\xb1\x69\xfb\x28\xa3\x11\xf4\xe7\x78\x24\x68\x14\x60\x66\xea\xbd\x2a\xf6\x38\xbb\xd0\x09\x6f\xb4\xc3\x0c\x19\xee\x39\xbb\x21\xdc\x26\xf4\x25\xb6\x73\xb7\x17\xfb\xc4\xd8\xdf\x40\xde\xdf\xc1\x22\x86\xc2\xd7\x6c\x98\x4a\x74\xb2\xe7\x8a\xe6\xdd\xa8\x60\x58\x8c\x97\x61\xdf\xa5\x70\x39\xf0\xab\xee\x1a\xfe\x65\x7c\x3b\xed\xcf\x2f\xdd\xec\x3c\x5e\xc1\x97\xc1\xaa\x0e\xd3\x5c\xa5\xd0\x73\xfc\x8a\x7d\x37\x2c\xad\x5d\xe4\x51\xc1\x60\x6d\x7d\xbd\x13\xe6\x4c\xfb\xd5\x3b\x9b\x27\xe3\xfa\xe9\xbc\xe2\xd7\x6d\xa6\x27\xd3\xf3\x0f\x10\x1f\xf8\xf6\x5b\xc8\xb4\x12\xf8\xeb\xfb\xba\xc9\x52\x61\x4a\xbe\xab\xdb\xa2\x02\x04\x5e\x92\xcc\xf7\x1f\x1c\x3a\xee\x3c\x19\xe7\xd0\x19\xe6\x1f\xdf\x64\xe3\x49\x92\xe1\x1e\x1e\x67\xb1\x77\xd2\xd1\x3e\x79\xde\xd8\x5e\x03\x4d\xdd\xa0\x58\xc9\x0e\xab\x07\x8c\x6a\xba\xae\xb0\x24\x0f\xcc\x2c\x6d\x98\x5b\xdf\x8f\xcd\xa8\x09\xc7\x3c\xff\xdf\x98\x3a\x84\xc6\x6c\xa6\xe4\xf7\x48\xce\xcd\xe9\xbc\x55\x07\xfe\xd1\x19\x6c\x08\xad\xc2\x09\x6b\xbc\x3b\x7b\xb8\xea\x9a\xad\xf4\x23\x88\xcf\x27\xf7\x06\xa1\x93\x73\xa7\xd9\xb3\xa2\xeb\x66\xc5\x7a\xa8\xe6\x94\x98\x61\xbe\x81\xe8\xca\x5e\x19\xd6\x0c\x45\xac\x30\xc3\x8a\xf7\x33\xa7\xef\xa5\xe9\xfa\xce\xc6\x4b\xc0\xab\xd6\x9b\x7e\x3b\xb7\xaf\xf8\x75\x7b\xba\x4f\x83\x9d\xda\x4f\xa7\xe9\xe6\x4b\x29\xb9\xf2\xb6\x2c\xd1\x44\xaf\xa5\xb8\xac\x2f\xbd\x2d\x83\x0d\xbe\xdd\xf3\x32\x70\xa8\x37\xe6\x6a\x93\xf9\xd6\xf5\xc6\x7b\x9d\xb7\xac\x18\xca\x18\x4b\x12\x45\xc5\xba\xdc\xe4\xdb\x28\x9a\x9e\xaf\xf5\x76\x33\xb5\x21\x1f\x99\x8d\x72\x38\x6c\xfb\x15\x06\x6a\x3e\xcf\xc3\x88\x02\xf7\x8e\x5f\xe0\xe7\x45\x25\x6e\xa4\xde\x60\xb0\xa0\xee\x97\x79\x8a\x7a\x73\xaa\x17\xf1\x70\xde\x0d\xd9\x88\x66\xa5\x70\x2b\xf6\x6f\x0e\x2d\xac\x1a\x41\xe6\x92\x15\xa4\x60\x12\xbc\x17\xdf\x8a\xab\x4a\xc8\x1b\x6a\xa2\xc0\x48\x4f\x1c\x12\x45\x13\x77\xab\x24\xf9\x73\xdb\x59\xcf\x8d\x76\x24\x0f\xb4\x84\x50\xaf\x59\xd3\x34\x8c\xa1\x82\x24\x90\x32\xd2\xd3\x14\xf7\x64\x8a\x4b\xd5\xd7\x91\xaf\xfe\xf5\xa9\x16\xef\x0b\xb1\x64\x0b\xf5\x1e\x19\xfa\xdc\x52\xcd\x94\x0f\x68\x4a\xd7\x7b\xfd\x10\x3d\x53\xbd\xd7\x1e\x44\x9e\x58\xe8\x02\xc0\x00\x86\x08\x81\x81\x46\x1f\x10\xc3\x4c\x51\x50\xe5\x8b\x0d\x35\x71\x2b\xbc\xe8\x00\xca\x37\xdc\x84\x47\x0f\xd7\xa7\x17\xd8\x14\xfa\x22\x04\x6f\xf5\x05\x5c\x86\xe6\x7b\x5e\x5d\x8c\x01\x00\x6b\xd6\xac\xab\x0d\x2d\xdd\x55\xb9\xae\x61\x60\x63\xc3\x07\xb3\x0b\x92\xb8\xee\xd7\x72\x05\x1e\x56\xfd\xef\x6c\x3e\x27\x24\xaf\x4d\x84\xec\xd7\xf5\xa1\xc1\x30\x1c\x4d\xd7\x95\x63\x61\xa9\x80\x00\x0f\x29\xa0\xf9\x37\xfd\xed\xf8\x56\xc5\x35\x2d\x71\xbe\x1f\xbf\x29\x4b\x90\xb0\xd6\xe7\xc5\x55\x7d\xc7\x57\x45\x78\x69\x96\x54\x99\x03\xd2\x75\xe8\x43\x4f\xb2\x62\x20\xa0\xa7\x5b\xdd\xd6\x5c\xf1\xad\x2a\xde\xcf\x83\xf0\x08\x21\x65\xa1\x39\x88\x17\x6f\x21\x4c\x37\x79\x88\x55\x7f\x7c\xba\xce\xff\xe5\xc9\x06\x8c\x89\x8c\x64\xc2\x06\xfd\x87\x73\x9a\x5b\xf6\x04\x00\xd9\xfb\x67\x05\x0e\x2f\xc8\x81\xef\xb8\xfa\xd6\x74\x3b\x96\x29\x1b\xbf\x36\x16\xe6\xe2\xdc\x18\xb2\xbc\xc2\x9a\x4e\xbc\xd6\x36\x33\x5c\x1b\x4c\x42\xea\x31\x68\xa7\x87\xbc\xb0\x3c\xd3\xd3\xbe\x09\xc3\xcb\xb1\xb9\xe3\xe5\xa8\x37\x17\x60\x40\x80\x39\x11\x49\x1f\xfa\x32\xf1\x42\xda\xbb\xa9\x77\x7a\x54\x01\x68\xfe\xd0\x22\xcd\x01\x8b\x3a\xeb\xad\xba\x3c\x2f\x6f\x41\xd0\xc5\x7b\xb3\x35\xfd\xf3\x65\x2f\xa8\xbf\xaa\xb7\xf7\x86\xd9\x23\x96\x6b\x98\x60\x47\xf3\x79\x3e\x9c\x00\xcd\x18\x98\x58\x00\x78\xf9\xa6\xfa\x15\x0d\xaf\xfe\xc6\x8f\x57\x00\x77\xf1\x9c\xf8\x93\x61\xaa\x71\xf7\x73\x5f\xde\x6c\x80\xf3\x12\x50\xfa\x83\xf2\x1f\x62\x3e\xb4\x05\xa1\xee\x28\xb6\xe6\x28\x1a\x62\xdf\x73\xb4\x30\xb6\x5e\x86\xe1\xf5\xf8\x0f\x3f\x80\x82\x17\x61\x43\x0d\x21\x74\xde\x03\x4e\xb6\xd2\x33\x6f\x7a\x97\x2b\x67\xa2\x08\x82\x75\x70\x96\xeb\xba\x25\x63\x0a\x5a\x41\xdc\x69\x3c\xa4\x3a\xed\xe6\xf1\xe3\x4c\xf4\xa9\xeb\xab\x63\x06\xfc\x57\xb3\xd2\xba\x51\x7d\xf3\xab\x09\xcb\xcc\x17\xa1\xd0\x01\xd0\xa4\xf6\x45\x69\x07\xf6\xae\xde\x7b\x91\x3c\xc2\xbc\x50\x65\x30\x01\xe9\xb8\x82\xe1\xcc\xbc\xb6\xfb\xb0\x45\x03\x98\xed\xf7\x78\xa8\x5e\x78\x60\xd4\x41\x7a\x1f\xd2\xc1\x5f\x2f\x30\x17\x9b\x7f\x98\x8f\x6e\xcd\xb4\x12\x7f\x72\x13\xda\xc1\x05\x0c\x78\x5e\xdf\xee\x0f\x2d\x47\xf9\xfc\xea\x44\x7a\xcc\x35\xfb\x63\x5c\xce\x51\x92\x2f\xd8\x03\xec\xce\x7d\xa1\x1a\xfe\x52\xb6\xb1\xf2\xef\x00\x42\xd1\xa2\x6d\xfc\x15\x4d\x62\x8f\x36\xf4\xb9\x68\xde\x14\x6f\x62\x01\x57\x10\x89\x22\xf7\xdb\xc5\x86\x18\x8e\x99\x89\xc0\x0a\xe6\x95\x3f\xef\x4f\x17\x69\x7f\x49\x4b\x38\x5f\x5f\x16\x78\xd7\x79\xce\x9f\xe1\x4a\xd9\xec\x0d\x9c\x9b\xf0\x60\xa4\x50\xbb\x57\xe7\xd5\xa8\xb6\x7f\x7d\x52\x6d\x66\x0b\x4c\x54\x37\xdc\x03\x5f\xab\x20\xa8\x94\x11\xf4\x98\x0d\xf0\x70\x5b\xec\xb3\xd6\xb7\xac\xa2\x30\x39\x5e\x1a\xfc\x3e\xe6\x26\x22\x55\xd3\x92\x11\x0c\xf0\xf0\x91\x77\x59\xd7\x62\xf3\x58\x53\x80\x96\x35\xd9\x9c\xfe\x32\xb4\x13\x0c\xdb\x91\xd8\xce\xaf\xad\x6d\x4a\x6e\xc8\xa5\x7a\xa4\x29\x79\xb2\x29\xb9\xa1\x18\xc9\x35\x0b\xbd\x14\x5e\x7a\x8f\xa4\x59\x8e\x3f\x75\xd2\x77\x86\x72\x52\x41\x6c\xa9\x77\xca\x73\x2c\xf0\x08\xeb\x1e\xa7\x86\x5f\x84\xa9\xef\x6a\x32\x5a\x65\x9d\xbe\xde\x09\xa8\x6a\x93\xff\x07\x12\x3c\x7e\x69\x2c\xb6\xdf\xe8\x86\xcc\x9f\x89\x82\x5b\x69\xa5\x32\x03\x68\xda\x7b\x6e\x05\x22\x39\x00\xb6\xa2\x82\xc1\x18\x14\xc9\x85\x3e\x36\x40\x54\xac\x04\x50\xd0\x19\xc0\x0b\x1a\x41\x6a\x14\xc5\x20\xeb\x15\x54\xd1\x46\xc4\x2d\x88\x20\x31\xb0\x14\xe8\xf0\x7f\xda\x6f\x11\xf6\x8c\x50\xf4\x34\x9d\x12\x77\xe9\x26\xd9\x1f\x00\x37\x0f\x11\x55\x4e\xcb\x1b\x7d\x41\x3f\x22\xc6\xe0\xe0\x98\x72\x24\x08\x08\x1e\x19\xc8\x1d\x85\x87\x3a\x84\x6a\x07\xa0\x9a\x3f\xc4\x21\x1b\x65\xaa\xa7\xd2\x98\xd1\x1d\x51\x86\x67\x6a\xfc\x5a\xc5\x02\xdb\x32\xfb\x49\x17\xc9\x38\xd5\xab\x93\x09\xaa\x78\x89\x3e\x80\x54\xef\x33\xe9\x9d\x1a\x89\x7b\xca\xee\x27\x79\x8e\x7f\xd0\x5d\xd1\xe0\xb1\x6c\xb2\xd9\xd2\xdb\x62\x7f\x06\xe4\x2e\x37\xd9\xc1\xbd\x29\x5d\x1a\xb8\x1c\x40\x66\x8b\x05\x48\x8c\x7a\xc6\x00\xda\x19\x32\x66\x35\x59\x81\x44\x5d\x7f\x5b\xd7\x9b\x0c\x2c\x6b\xcb\x16\xe8\x18\xfd\x07\xe3\xb0\xc1\x50\x74\x75\x22\xbe\x8e\xa6\xa9\xfa\xee\x76\x5d\x3c\xe9\xe6\xcc\x42\x86\xdb\x9a\xfa\x62\xec\x38\xb8\x0f\x91\x98\x71\x67\x6d\x67\xeb\x13\xe0\xef\x62\x52\x81\x9a\x98\x31\xd9\x6b\x03\x06\xf9\xd9\x1a\x9d\xfa\xf5\xe4\x04\x85\x98\xf4\x00\xfb\x8c\x30\xce\x8b\xc7\xa4\x9f\x1b\x37\xa8\x26\x26\x34\x74\xea\x4a\x97\x79\x63\x75\x10\xe8\xd6\x45\x4b\xfd\x4f\xb2\xdc\xe4\xa0\x95\x2c\xae\x9a\xb8\x3e\xbf\xaa\xdb\xb6\xbe\x4d\x4b\xf3\x07\xb9\x7c\xe2\x20\x43\xdc\xd7\xa4\x3c\x6f\xeb\x3d\xf9\xfc\x49\xaa\xe0\x8f\xe3\xd1\xe4\x50\xb6\xb8\x4d\x07\xce\x47\xcf\x3f\xc5\xd5\x08\x67\x1a\xce\x4b\x3c\x04\x2d\xf3\x80\x55\xd8\x8f\x2a\xc6\x1b\x1a\x78\x87\x9a\x15\xa8\x42\x28\x99\xc1\x8b\x02\x56\x9d\xcb\x2d\x3d\xb0\xc2\xe9\xa8\xf5\xec\x7d\xc1\x58\xed\x88\x9c\xfe\xfa\x46\x8b\x99\xbf\x83\x35\x8c\x41\x8d\x80\xe8\xe1\x9e\x54\xd2\x5a\x3c\x16\x48\x50\x22\x44\x66\x49\x48\x4e\xd2\xb4\x44\x1f\xa8\xe0\xd3\xf6\xc2\xfc\xfc\x5a\x6e\x3f\xa9\xae\x2d\xa2\xf7\x6e\x73\x74\xb6\xb1\xb6\x57\x0b\xc6\xca\x28\xda\x32\xd6\x57\x97\xfa\xe5\x56\xb5\x4f\x15\x9e\xd8\xc9\xd9\x57\x2a\x7e\x0f\xcc\xd6\x96\x8c\x37\x84\x20\x04\x48\x84\xae\x93\x48\x1a\x74\x9d\x6e\xd5\x28\xa9\xb7\xac\xa4\x65\xca\x96\xf4\xc0\xe6\xf0\x75\x7e\x84\xbe\x2d\x97\x60\xf0\x39\xb2\x34\x9d\x19\x32\xa7\x29\x15\xe7\x12\x41\x73\x18\xc3\x5f\xe7\x55\x7d\x23\xca\xa2\xfa\xf5\xab\xef\x5f\x76\xdd\x38\xcd\xe5\xdb\xf2\x3b\x51\x72\xcc\x36\x1b\x80\x44\x21\x23\xf1\xc6\xb1\x10\x6f\xfc\xe8\x5b\xbd\x25\xe0\x07\x24\xc6\x4e\xce\x89\x09\xb0\xf5\x58\x0c\xae\xdc\xb5\xc0\xdc\x51\xc0\x08\x5b\xa9\x21\xaa\x2e\x97\x47\xcf\x86\xd6\x38\xcc\x4d\x0c\xf6\xf3\xd1\xb8\xa8\x18\x64\xfb\x6d\x94\x4d\xa7\xb8\x6b\x57\x93\x83\xc8\x4c\x7e\xa6\x0c\xfd\xc7\x71\xb5\x3e\x53\xb4\xad\xf7\x19\xd7\x67\xeb\x33\x41\xf1\xa8\x65\xdc\x9c\xb9\xcf\x84\x3e\x6e\x23\xd6\x43\xfa\x51\x69\xf7\x79\x79\xb9\x00\x23\x05\x61\xd7\x98\x80\x35\xd1\xd4\xc5\x16\x45\xf1\x9e\xd5\xa3\x5d\xe4\x02\x1c\x2e\x57\xfb\xb5\xa9\x84\x31\xb1\xda\xbb\x7b\x26\x5b\x6c\xb2\xfa\xd4\x54\x1f\x5d\xd8\xbb\x28\x9a\x01\x2a\xa0\xec\xba\x99\x84\x01\x83\x57\x19\xd2\xac\x16\x83\x65\xb8\xe9\x83\xae\xac\x17\x9b\x5c\xb2\xeb\x15\x4e\xda\x35\xd4\x61\xa6\x0c\x7f\x24\x95\xe8\xa7\x84\xc0\xec\x5d\xeb\xd9\xb3\x73\x77\x6d\xe6\xee\x98\xbd\x51\xce\xb1\xeb\x06\x1c\xd6\xf6\x29\xde\x58\x90\xfd\x96\x49\x7b\xb3\x79\xa9\x77\x2c\xbe\x49\x6e\xc9\xe7\x4f\x00\x55\x00\x5e\x99\xc1\x55\x4e\x11\x4a\xe0\xde\x4d\x4d\x14\xcd\xe2\xbb\x8b\xfb\xf5\xd5\x86\xe4\x57\x49\x82\xcf\xdd\x73\xc3\x04\xc4\x6e\x36\x0f\x2b\x33\x0f\x19\x4e\x0c\xb1\xcd\x7a\x23\x8c\x41\xa8\x68\x32\x43\x79\x3b\x77\x41\x66\x3d\xe6\xab\xd5\xfd\xfa\x2a\x5d\x6e\xb2\x85\x1d\xb8\xee\x81\xe3\x1e\x86\x93\x1f\x45\xf1\xf3\xf3\xab\xfa\xe6\xd0\x18\x6b\x50\x67\x0b\x2b\xe4\x4d\xc5\x9f\x43\x24\x4d\xbc\xc2\xbf\x47\x23\xfd\xae\x8b\x9f\x9f\xab\xb6\xde\xb3\x1b\xfa\xfc\x5c\x61\x23\xec\x96\xd0\xe7\x47\x77\xa7\x13\xac\x12\x1e\x66\xfb\x5a\xb3\x82\x10\x8a\x83\x2f\xfc\xb1\x15\xd8\x11\xe8\xbc\x5c\x15\x50\x35\x00\x6b\xb8\x95\x83\x54\xf3\x77\x61\x57\x11\x94\x0d\xdf\x2b\xfa\x46\x99\x19\x5d\x98\xfa\x16\x50\x93\x1b\xfd\xc2\x73\x6e\xfa\x71\xca\x00\xc3\x9a\x43\x02\xa6\x6d\xd9\xdb\x00\x94\x09\xfb\x42\x93\xe0\x35\x6b\xd7\x25\x58\xab\x5c\xc4\x8d\xfe\x7b\x43\x56\xb1\x64\x0b\x5a\xb0\x25\xad\x18\xae\x0c\xc9\xf8\x45\xbd\x2a\xd8\x32\x89\x25\xe3\x69\x43\xb2\xb8\xf4\xcc\xe6\xbf\xe8\x3a\x0e\x41\x92\x75\x55\x5f\x6c\xd0\xf5\x5b\xb2\xb8\x60\x75\xda\x90\x74\x49\xf9\x25\x84\x50\xae\xdc\x49\x45\xc3\x23\x20\x1d\x34\x7d\x00\x7d\x78\xb2\xa1\x0d\xd4\xa2\x18\x8b\x85\x87\x7a\xb2\xc2\x4e\x64\xb6\x30\xd4\xa4\x08\xb5\xbb\x46\x61\x88\x0a\x62\x1f\xc1\x76\x5d\xa6\x4f\x36\x4c\x57\x9a\x7e\xb1\xc1\xdf\xcb\x8d\x57\x61\x4e\x74\x8b\x4f\x92\xb8\x4c\xd9\x17\x64\xe3\x86\x09\xe6\x7d\x76\xe3\xaa\x28\x92\x0c\x06\x60\x10\x95\xfa\xe1\xda\x81\x42\x13\xc9\xdf\x37\x51\x34\xd3\x7f\x3c\x1d\xb7\x11\xc3\x34\xeb\xa1\xb9\xb1\x1b\x03\x25\x73\x47\xea\x77\x3d\x13\x14\x28\x80\x4c\x52\x2e\xb7\x59\x41\xed\xeb\x9f\x55\xb4\x7f\x34\xb3\x86\xda\xc7\x34\xab\x3d\x22\xf4\xab\x80\x17\x78\x83\x36\x8a\x66\x66\x38\x19\x32\x7b\xd6\xbe\x36\x56\x0c\xc0\x90\xc2\xd8\x8b\xc0\xff\xe5\x81\x05\x94\xf4\xbc\x23\x72\x89\xee\xe5\x0a\xf0\x6f\x86\x65\x65\x9a\x4e\x61\x1a\x7c\xd3\x0b\x31\xcc\x95\x02\x4c\xfc\xd0\x69\x88\xb6\x23\xe2\xd1\xa0\xa2\xa2\x69\xd2\xd0\x94\xc5\xe7\x26\x79\x92\x90\x11\x5f\xc8\x37\xec\xc1\x77\x5a\x57\xe8\x63\x78\x82\x53\xc1\xc6\x5e\x4d\xf3\x19\x64\x64\x48\xe3\x33\x7c\x7e\x2f\xbe\x51\xf1\x80\x1b\xe4\x7e\x98\xdd\x6f\xa1\x13\xd0\x15\x4f\x7a\x8c\xf2\x8c\xe7\x3b\x23\x4b\x60\xc3\x2f\xef\xf8\x07\x23\x30\x18\x7d\x72\x42\x90\x01\x82\xac\xff\xf8\x41\xe4\x60\xf7\x96\x0e\x1d\x44\xfd\x8e\x18\x0d\x15\xe2\xac\x87\xf6\x36\x7f\xf9\x62\x8d\x6d\x14\xdd\xad\xd2\x18\x65\x9a\xa7\x5e\x47\xa4\x39\x9c\xbc\x67\x24\x41\xc2\xd2\xc4\x93\xcd\x12\x92\xb9\x38\xba\x3f\xeb\x89\xdd\x17\x37\xfc\xd7\xef\x40\x34\x86\x83\x30\xb2\x54\x63\xed\xdc\x75\xb6\x0e\x94\xae\xe8\x3a\x3c\x47\xfd\xff\xbc\xc7\xfa\xa9\xfc\xd4\x0e\xbf\xab\xf7\x93\xfd\xfd\xed\xd3\xfb\x1b\xc8\x0b\x7f\xf2\xbc\xb7\xc0\xd5\xdb\x6a\x46\xa8\x42\xcb\xe8\xe1\x59\x0e\x82\x3c\xf3\xb5\xd8\xa0\xa6\x01\x05\xbd\x3f\x2b\xc4\xf8\x9b\x3a\x90\x7f\x1b\x2a\x69\x66\x8e\x81\xfb\x09\xb4\xff\xc0\xf1\x80\x8f\x93\x65\x92\x58\x71\x84\x5b\x45\x48\xae\x09\xa4\x1e\xda\x05\x25\x04\xf3\xaa\x2e\x8b\xca\x44\x2a\xac\xd8\xdf\x2c\x84\xad\x49\xd7\x24\x55\x95\xb0\x17\xde\xd9\x20\x59\x95\x0e\xa4\x2c\x38\x6f\x74\xae\x27\x51\x17\xe9\xba\x39\x52\xe5\xd0\xa2\x0b\x08\xe5\xef\x55\x94\x9d\x9e\x22\x84\xab\x84\x35\x30\x92\xd8\xab\x68\xb5\xc8\xbe\x54\xf1\x1b\x4d\x00\x1b\x44\x42\xd6\x20\x7d\x35\xc8\xf5\x97\xcb\x85\xd4\x73\xc2\x6a\x6a\x6e\xba\x84\xd5\x7d\xf8\x35\x98\xaa\xca\x9b\xaa\xca\x0f\xbf\xfb\x6f\x5f\x7a\x07\x82\x73\xd6\x23\xe3\x70\x83\x8c\x83\x24\x32\x02\x93\xd7\xe0\x9a\x65\x27\x41\x11\x91\x32\xdb\x13\x2a\x53\x66\xfb\xee\xac\x73\xdc\x14\xab\xae\x9b\xa9\xde\xd7\xcd\xc9\x1d\xc5\x5f\x5c\x9d\x9c\x22\x91\x30\x43\xac\xc8\x04\x5c\xd8\xf7\x47\x5c\xc2\xff\x64\x9e\x7d\x6a\x5f\xa4\x55\x4f\xab\xc9\xb4\x82\x2a\x3d\xa7\xf7\x60\xeb\x59\x49\x0f\xec\x21\x67\x04\x6a\x62\x1b\x11\xfa\x37\x94\x52\xbd\xc4\x7f\xf8\x79\xb9\xa3\x92\x04\x1a\xd8\xdf\x02\xff\x42\xf2\xd0\x5b\xd8\xc6\xbc\x87\xaa\x04\x29\x8d\xa4\x9c\x56\x2b\xf3\x04\x67\xf8\x3e\x7a\x18\xd7\xd5\x0a\x77\x01\x6b\x0c\xb1\x6a\xfe\x35\x9b\xc3\xf6\xa5\xd1\xcd\x0b\xbd\x37\x87\xdd\xa5\xe8\xac\xf1\x1d\x0a\xb1\x88\x89\x2f\xb0\x6b\x63\x31\xf2\x54\xa6\x35\x98\x4d\xd2\xd2\x85\xd8\x02\xdf\xa0\xcb\x10\x61\x60\x15\xd7\x61\x02\x2d\xd9\x1c\x05\x4c\x73\x92\xd5\x06\x34\x86\x2d\x74\x72\x71\xdd\x72\x35\x27\x74\xe6\xc0\x87\xab\xd8\xe6\x65\xac\x5c\xd5\xe9\x32\xab\xa9\x97\xe2\x85\xd9\xde\x0e\xf0\x76\xab\x58\xad\xda\x74\x99\xb5\x74\xc9\x98\x7e\x45\xcf\x2b\x7e\xc7\xab\x19\x33\x41\x1e\x0f\x6c\xdb\xc6\x40\x4f\x12\xba\x63\x65\x4b\xf7\x6c\x1b\xd7\xf4\x10\x56\x1f\x00\x2f\x6b\x72\x63\x7f\x5e\xb7\x3b\xae\x20\xef\xce\xe5\x9d\xb1\x92\x10\xea\xdd\x82\xff\x08\x88\x99\x45\x0e\xa0\xb3\x66\xa2\x87\x66\x22\xde\xfb\xa6\x58\xc0\x1d\x7d\x06\x60\xb2\xe6\x74\x8d\x57\x4a\x5f\x50\x82\x24\xc1\x7d\x14\xec\x62\xcb\xac\x22\x93\x2a\x1d\xa1\x9e\xd8\x58\x81\xde\x96\xfe\x41\x8d\xb1\x8a\xfa\xd8\x6d\x0e\x5c\xfe\xc3\x8f\xbc\x62\x92\x02\xf2\xed\x79\x7d\x68\x1b\xb1\xe5\x4c\x10\x5a\x78\xf1\x0b\x47\x8e\x32\xdb\xba\x04\xc9\x8a\x4a\x26\xef\x4a\x72\xb1\xb0\xeb\xfd\x83\x8a\x85\x0d\x5a\x86\x1a\xb9\x74\x49\xad\x0c\x52\xb2\x96\xc7\x82\x2a\x42\x0b\x66\x72\x25\xc2\x46\x32\x13\xd7\xb1\xbc\x2c\xc6\xf5\xb8\x1c\x14\xa1\xe4\x03\x5c\x0b\x6c\x62\x49\x97\x24\xe7\x17\x0b\x08\xfb\xbb\xf0\x43\x70\x40\x11\x49\x2c\x7e\x6e\xc3\x94\x88\x5b\x5a\xc1\x29\x54\xfa\x00\x7c\xc5\xe3\x8a\x36\xe7\xe5\x2e\x89\x1b\x98\x9b\xcb\x45\xd7\x35\x76\x62\x2e\x17\xab\x65\xb6\x20\x28\x84\xac\x43\xd4\xfc\x92\xd5\xc6\xf6\x1d\x3e\x97\x46\x23\x22\x6d\xae\x32\xb7\xcd\x33\xfc\xe6\x2b\xce\x7f\xf5\x15\xe7\xa9\x79\xee\x2c\x6c\x88\x3f\xbe\x82\xd5\x6d\x2f\x3a\xe5\xa1\x06\x41\x51\x9e\x2e\x89\xb9\xf0\x2f\x98\x38\x52\x49\x1d\x1a\xce\xc3\x15\xbf\x11\x32\x2b\x80\x94\x97\x1f\xa9\x06\x48\x8e\x4b\x71\xa4\x05\x95\x7e\x3f\x5b\x31\xd2\x5d\xa0\x79\xbf\x11\xfc\x13\xea\x46\x62\x5e\x73\x53\xa3\xd0\x5c\x11\x00\x41\xa0\xd4\xb2\x77\x0e\x1f\xd5\x38\x03\x82\x06\x87\xa0\x50\xb1\xa6\x3b\xa3\xdb\x11\x2b\xe4\xb8\xb3\xd6\xb0\xe1\x97\xbe\x3d\xb0\x12\xfe\x8e\x97\xa9\x79\xef\x71\xeb\x5b\xed\x4a\x85\x93\x4b\x1b\xb6\x80\xfb\x2e\xbc\xc8\x66\x0b\xba\xd5\x97\x23\x1f\x5d\x8e\x7a\x4d\x0d\x1c\xd7\x81\xc5\xd3\x07\x7e\x25\x45\x26\x04\x31\xbd\x28\xe8\x16\x7a\x92\x37\x2c\x2e\xd9\x72\xc6\x0e\x78\x63\x91\x15\xfa\xb8\x80\x07\x4c\xba\xa4\x35\x2b\x57\xfa\xcf\x0c\x93\xd3\x25\x5c\x67\x3b\xba\xa7\xd7\x48\x3d\xdf\xe0\x3f\xb7\xc3\x35\xc3\xbb\x08\x26\xb8\xf0\xac\x7b\x26\x9f\xfe\xd9\x8c\x0b\xe3\x86\x38\x5b\x02\xd0\x99\xce\x75\xc1\x24\x18\x69\xf3\xeb\xf6\x82\xe9\x2b\xe0\x9a\x71\x7a\xa3\x59\xd8\xd9\x82\x1c\xd1\x11\xf1\xce\x78\x83\xdf\x58\x27\x67\x91\xde\x60\x89\x1b\x13\x09\x5f\xd0\x2b\x76\xcf\x58\x99\xdf\xb2\xeb\x24\xbe\x5a\x2d\xb2\x25\xa1\x7b\x76\xb5\x32\xf7\x7f\x66\x6f\x55\xba\x63\xf7\x2b\x2c\x9c\x99\xc2\x28\x37\x03\x21\xd5\x2d\x63\x75\xd7\xdd\x32\xd6\x90\x28\xba\x4d\x12\xba\x67\x0b\xc6\x6e\x5d\x2d\xb7\x03\x04\xa6\x95\xad\x36\x33\x53\x70\x9b\xc6\x25\x9e\x4f\x3b\xf0\xea\x82\x49\xfd\xce\x0c\x3b\x62\x44\x42\xf0\x4c\x43\x84\xc4\x5b\xba\xb7\x1b\x94\x72\xfd\xfc\xee\xd8\x73\x7c\x60\xef\x98\xbc\x78\xae\xe7\x6a\x95\x2e\x33\x79\xc9\x9e\x9b\xba\x01\x86\xb0\xbf\x9c\x14\xbd\x65\x4d\x6b\xcc\xa2\xe8\x2d\xd5\x33\x40\xef\xa8\x48\xfd\xf8\x87\x42\x4c\x63\x56\xfb\xeb\xea\x40\xe1\x24\x6a\x0f\x96\x33\x56\xe3\xbe\x71\x4a\x1a\x11\xf7\x1d\x2f\x57\xb5\xde\x3a\x35\x62\xa3\x95\xfd\x9c\xb8\xb7\xd7\x8d\x4a\x5f\xea\xb4\xc2\x95\x5d\x50\xe9\xf9\x12\x63\x63\x60\x88\x79\xb9\xb0\x36\x7c\x7d\xc3\x74\xcb\xc2\x06\x61\xf7\xd6\xe0\xcb\x37\x9a\xda\xa0\xc1\x9c\x8b\x78\x6b\x5b\x8d\xa2\x2d\x1c\xe4\x0a\xe8\x03\xb9\x6e\xd2\x65\x8f\xec\x5d\x7b\xee\xac\x27\x66\xc9\xdc\x2c\x02\x51\x72\x9b\x73\xb8\xcf\x68\xc9\x00\x79\x3e\xff\xfc\xbf\x1b\x03\xc3\x10\xaa\x05\xca\x14\x50\x12\xca\x34\x75\xcf\xc0\x36\xf0\xbf\x44\x75\x85\x83\x8d\xda\x59\xfd\xcd\x9e\xc9\xf5\x0e\x91\x4d\xe3\x3d\xfa\xda\xb1\xb2\xeb\xf6\xe7\x6d\x7d\xc1\x6a\x27\x3c\xfd\x13\x09\xb0\xe5\x8c\xed\x71\xb6\x56\xce\xfd\xac\xa4\x7b\xf0\x71\x5b\x66\x2e\xac\x4d\x4d\xb1\x2a\x42\x8c\xf4\xed\x86\x5d\x5f\x14\xab\x22\xbd\x4e\x96\xfc\xff\x66\xd7\x69\x91\xc7\xb3\x6d\xd7\x1d\x2e\x6f\x00\x82\x8f\xed\xe9\x81\xdd\x90\xa3\x9d\xa6\x6d\xd7\xc5\x5b\x26\xd7\xfd\xea\x6d\x08\xdd\xa2\xeb\x66\x0d\x05\x1e\x70\x71\x68\x5b\x67\x7a\xba\x29\xf4\x29\xdb\x62\xdf\x8e\x3a\x33\xba\x2d\xbb\xac\x58\x5a\xe7\x2f\xc7\x99\x3d\x6f\x59\x31\x30\x3d\x1a\x8a\x00\x86\xa6\x1f\xfd\x97\x1e\x3a\xf7\x7b\x45\x1e\xbe\x07\x03\x63\x30\xfd\x18\x19\x18\x7b\xb6\x1f\x03\xc9\xc6\xdf\xff\x2f\x38\x07\x7d\xaf\x1e\x73\x36\x76\x1e\xf9\xa8\xaf\x18\x64\xfe\x57\x3c\xbf\x52\x73\x42\xf2\xff\xa4\x92\xa3\x6f\xb2\xf2\xbd\xb2\x71\x57\xbf\x0f\x4d\x66\x3e\x7f\xba\x70\xb7\xef\xe5\x17\x9e\x2d\x88\x27\x21\x51\x04\xa4\x38\x16\xba\x86\xaa\xae\xf3\x9c\x91\xab\xe9\xe9\x75\xb2\x97\xe1\xec\xba\x0f\xf9\x10\x57\xe5\x83\xfb\x6f\x4e\x68\x3f\xd7\xeb\x09\xe3\x44\x3b\xd5\xfe\x18\x15\x71\xcc\xdf\x29\x5d\x8f\x64\xd6\xec\xc5\x6a\x6e\x3e\x5f\xba\xf1\xcb\xcb\x27\xde\xf8\x7b\xd9\x91\x04\x4e\x64\xe9\xd9\x0a\x80\x8e\xdf\x8f\xfd\xe9\x81\x8d\x3d\x1c\xa9\xd0\xff\x93\xce\x2a\xbd\x31\x06\x2a\xaf\xf4\xa5\x5c\x78\xc9\x9e\x55\x6d\xc5\x16\x80\x13\x57\x04\xc6\xb4\x41\xd8\xe6\x29\xbb\xe4\xca\xb3\x4b\xce\xd5\xba\xd9\xb0\xc2\xac\xae\x6e\x2c\x29\xbc\x96\x13\x49\x05\x66\xf0\x8c\x6f\xac\xc8\xd4\x19\xbb\xd7\x02\x20\x4e\x06\xd6\x7c\x19\x9f\x32\x89\xa3\xbd\xb1\x72\xa6\xa8\x67\x9b\x9c\x09\xea\x9b\x40\x66\x7c\xca\x20\xce\x23\xcd\x6a\x11\xd8\xf7\x38\xbb\x9e\x47\xa5\x60\xed\xe3\x7c\x38\x64\xf2\x22\x1d\x8b\x5e\x14\x54\x04\x5a\x1f\x75\x4a\x71\x2f\x98\x8a\x22\x77\xfd\x3d\xa5\x8f\x9b\x31\x7d\x1e\x70\x4b\xe9\x17\x8e\xa6\x71\xcf\x23\x0a\x86\xbe\xb4\xbc\x97\xc3\x29\x3c\x5b\x18\x3a\x0f\x44\x52\x72\x64\xdd\x8b\x8e\x8a\x2e\xdd\xde\xf6\x55\x92\x10\x97\xd8\x47\xf3\xd6\xcc\x50\xc2\x26\x3e\xf4\x44\xd6\xaa\x48\x62\x18\x57\xc9\x45\x15\x4b\x9f\x30\xf9\x5c\x90\xae\x5b\x92\xcf\x78\x56\x24\x3e\x02\xf2\x56\x04\xc8\x7a\x75\x49\x15\x83\x29\xcd\xf9\x34\x16\x1e\x67\x60\xf1\xc0\x7b\x4b\xcf\x28\x32\xc1\xe4\x8f\x7e\x58\x65\x31\x11\x5a\xca\x8b\x6e\xa6\x7a\x03\x44\x30\x60\x1c\x1b\x21\xca\xba\x4d\x0d\x96\xc2\x7c\x0c\x36\x07\x8a\x1a\x26\x3f\x41\xe2\xd2\xaa\xfb\x07\xb0\x14\x81\xc4\x5f\x53\x23\xa4\xa8\x5c\xd2\x6f\x29\x48\xbe\x8e\x25\x04\x2d\x39\xf4\x61\x13\x0f\x55\x85\x1e\xb4\xb4\x64\xff\x44\x72\xae\x02\x9a\x5b\x44\x51\x69\x18\x31\xa0\x1b\x1c\xd7\x5c\x7a\xa8\x86\xc4\x39\x63\x97\x9a\xc1\x7e\xb8\xb3\x51\xcc\xa8\xc5\x54\x9f\x08\x62\x96\x3a\xbc\xf5\x52\x33\xc6\xa5\xc1\x09\xb5\x7b\x75\x81\x7f\x82\xa7\x4d\x1c\x17\xe9\x6b\x9f\x2b\x37\xd7\x5e\xb0\x5d\x49\xba\xed\x8d\x4d\x4b\xcf\x81\x55\x9c\xb6\xe0\x7a\x57\x77\x5d\xcc\x87\x12\xc7\x6f\x34\x85\xd0\xf3\xd0\x81\xc7\xac\x1a\xe4\xed\x01\x37\x03\x43\x39\x5d\xa9\x5a\x8b\x0d\x9c\x6f\xaf\x2e\xcf\x20\x71\xef\x6d\x1b\x13\xba\x05\x18\x66\xe4\x7c\x0c\xae\xa3\xc1\x5b\x45\xdd\x4a\xff\xc1\x84\xe2\x83\xca\x8d\x35\xd6\xc2\xf1\xf4\xfe\xe6\x13\x51\xa4\x5c\x1c\x35\x0f\xad\xf4\x00\xc6\x5c\xaf\x7c\x87\xa4\x89\x44\xa3\xb0\x1b\x7f\x60\xbc\x37\x0e\xd3\x75\x7b\xb8\x92\xdc\x46\x71\x7b\x57\x93\x17\x3c\x8a\xbe\xed\xe5\x34\x5e\x47\x6e\xf0\xdc\x59\x57\xc2\x0b\x2f\xf2\x1b\x94\xfa\xcb\x96\x52\x89\x20\x97\xfd\xc7\x15\x14\xcc\xe2\x3e\x25\x61\x82\xda\x7a\x13\x26\xfa\x4a\xf9\x45\x10\x4e\x4e\x79\xfd\x0a\x5b\x0f\x32\x5a\x51\xcd\xad\x00\xbe\x59\x25\x82\x2e\x49\x5e\xac\x4c\x8b\x26\xa7\x75\xee\x37\x81\x7b\x68\x5f\x9e\x15\xa8\x2d\x09\xfa\x94\x41\x83\x47\x37\x5c\xaf\x2b\xc6\x09\xec\x16\x37\x03\x07\xd9\x4c\x35\xdd\xda\x02\x3c\xac\xbc\xf6\xde\xd5\xac\xc2\xd6\xfc\x16\xcc\x5b\xeb\xd7\x48\xeb\xc1\x78\x9a\x28\xaa\x4f\x35\xd2\x98\x46\xce\xcb\x5a\x96\x45\x1b\x83\xfb\xbe\x71\xc0\xa2\xb5\x69\xcf\x7d\x0d\x0a\xd7\xa6\x28\x99\x1a\x3d\xb2\x35\x72\x6c\xed\xa8\xa9\x61\x75\x81\xe7\xff\xcd\xca\xfc\x9b\x30\x91\x71\x9b\x98\xe0\x56\x87\xbd\x38\xe9\xb9\xec\x1b\xe9\x5f\x0b\x87\xa2\x30\xb9\x43\x1d\xec\xbc\x25\x77\xe4\x63\xa6\x98\xfa\x35\x03\x33\x4c\xd9\x9b\x61\x9a\x3f\x13\x69\x7b\x25\x4e\xf4\x8a\xce\x62\x7e\x21\xdc\xde\xe8\x3a\x7e\xc9\x84\x5d\x79\x27\x14\x1c\x58\x87\x3a\x22\x14\x0d\xc1\xec\x0e\x29\xac\x9d\x66\xd7\xc5\xee\x6f\x88\x95\x95\x2e\x19\xfb\x2b\xae\xa8\x22\x51\x54\x19\x23\xb5\xc0\xa1\x0a\xe6\xff\x61\x7c\xc7\x8d\x2e\x43\xff\x8a\xa1\xe1\x47\xb6\xde\xd0\x29\x59\x23\xf3\x28\xca\xdb\xe1\x43\x48\x0b\x66\x86\x45\xab\x41\x63\xf0\x32\xbe\xe0\x5d\xa7\xd8\xa9\x8b\xcd\x90\x75\xb0\xa5\xb2\x82\xc2\x9c\x67\xaa\xb7\x1f\x6e\x26\xae\x6d\x13\x74\xb6\xc8\xeb\x24\x21\x4d\xc2\xaa\x75\x8d\x77\x30\x70\xd7\x33\x86\xef\x80\xd0\x6c\xb6\xb8\x8e\x0b\xc6\x7a\xd3\xc1\xe0\xba\x97\xac\x49\xaa\x75\x81\x65\x53\x4e\x8b\x24\xc1\xe3\x2b\x59\x93\x72\x00\x4b\x06\xd4\x60\x8c\xaa\xe4\xee\x38\x45\x66\x4c\xe5\xb6\xee\x58\x5c\x2c\x56\x8b\xcc\x6b\x22\x68\x43\x25\x4c\x7c\x56\xad\x8b\x14\xf2\x2d\xb3\x05\xc1\xe6\x68\x91\x30\x71\x3c\x31\x7a\xcf\x8d\xf8\x14\xfd\x8e\xef\x92\x62\x0b\x3a\x50\x08\x0a\xcb\x5b\x4b\x88\x12\x96\xcf\xa4\xc1\xec\x00\x13\x25\xd8\x6d\xfa\x19\x30\x7b\x8b\x44\x51\x92\xa8\x09\x84\xe2\xfb\xc1\x76\x32\x4e\x4e\xbb\xfa\x3d\xc2\x63\x02\x05\x35\xf8\xba\x57\x7c\x5f\x28\xde\x67\xf0\x4f\xec\x95\x79\xa1\xd1\x9a\x99\xd9\x87\x70\xb6\x20\xbd\xa9\x74\x5d\x5a\x8e\x44\xe8\x53\xdd\xd4\xaa\xf9\x38\x26\x22\xc8\xb5\x1b\xdb\xe6\x27\xe4\xaf\x3c\x3a\xfa\x6f\xe5\xa1\x69\xeb\x5b\x34\x05\xca\x2b\xd7\xa5\x30\x9e\x80\xd2\xf5\x9f\xab\x00\x07\xa3\x41\x1a\x80\x77\x5d\x33\x63\x98\x61\xaf\xc4\x2d\xb8\x29\x59\xf1\x92\x5f\xce\x46\x70\x89\x51\xb4\x13\x23\x72\xcb\x14\xad\x52\x9f\xb7\xb5\xf9\x7c\x31\x41\xb3\xf4\xe1\x0a\xf8\xed\xbe\xbd\x8f\x09\x46\x40\x30\xf4\x58\x15\xb7\xb4\x26\xf9\x36\x8a\x9e\xeb\x09\xdf\x52\x89\x0f\x46\x5c\x76\x9d\x67\x00\xb5\xab\xdf\xe3\x98\x7f\xd9\x71\x69\x16\x4c\xde\x10\x53\xaa\x3e\xdf\xf1\x42\x17\xcd\xcb\xae\x7b\x0b\x29\xb4\xe8\x05\x24\x1e\x7d\xf3\x5c\x84\x6a\x0b\xa3\x94\x1b\x22\x6f\xcc\x3e\xc1\xf6\x4a\xf3\xbc\x23\x61\x02\xd4\x83\xd0\x9b\x01\x67\x8d\xbb\x63\x8e\x5a\x02\x19\x3a\xae\x81\xc2\x16\x9c\xd6\xec\x87\xb6\xde\x33\x01\x12\xdb\x20\xd9\xb8\x2a\x79\xd4\xa8\xb0\xd6\x71\x90\x9b\x7c\xd6\x77\xbb\xf4\x3a\x8c\xb5\x20\xbc\xec\x75\xd1\x9a\xce\x38\x94\x59\x30\xcf\xfe\x05\xf9\x48\x0b\xcd\xe6\xa1\x16\xb8\x37\xe1\x97\xc9\xb9\x82\x50\xbe\x86\xf3\x47\xf5\x6c\x2e\x03\x47\xb9\xb8\xba\x5c\xac\xaa\xde\xf8\xc0\xb1\xff\x31\x41\x6f\xef\x23\x44\x52\x03\x8d\x5b\x1f\xb0\xef\x3f\x9a\x57\xdf\x19\xba\xe1\x65\x2d\xb7\x85\xba\xef\xa7\xbc\x31\xfd\x31\x5b\x93\xcd\xe7\xb4\x09\x97\x00\x1a\xf7\x16\xa2\x09\x16\x02\xbf\xba\xe5\x68\xc2\xe5\x38\xff\x3f\x4f\x3f\xb3\xfd\xef\x97\xc3\x95\x31\x63\xf4\xdc\x4e\x45\x80\x5f\xd8\x1a\x9b\xc7\xb6\xde\xeb\x1d\x0f\x1c\x38\x1f\xf0\xd8\x6f\xc5\x48\xd9\xe6\x93\x09\x75\x49\x8b\x4f\xba\x47\x02\x76\x05\x82\x66\x02\x2b\x56\xf7\x5b\x0a\xf5\x68\xb8\x3e\x14\x6c\xeb\x53\x93\xe4\x49\x3f\x48\x5a\x19\x49\x65\xc9\xe6\x55\xab\xe6\x9a\x78\x77\x5a\x91\x91\xb6\x56\xbf\xbc\xbd\xe2\x8d\x72\xe6\xf1\x50\xe0\x0a\xe2\xfd\x16\x84\x16\x93\x6b\x3f\x12\x0b\xe2\x0d\xca\xb7\x73\x1f\x26\xa7\xb8\x6a\xea\xea\xd0\xf2\xfc\xcc\x3a\x7e\xc3\x82\xe6\xff\x2d\xcf\x1e\xfb\xaf\xad\xf7\xe0\x66\x38\x70\x0b\xb7\x81\x25\x56\x75\xda\x66\x8a\x7c\x4a\x4d\xb8\x27\xa0\xb0\x48\x39\x19\x39\x6b\x1e\x62\x8f\x14\xd1\x3c\xf4\x41\x33\xaf\x52\x13\x23\x3b\x76\xf0\x05\x06\xfd\x34\xee\x63\x5f\xb5\xf6\x8b\x91\xba\x83\x6e\x12\xe7\xe6\x10\x38\x07\x5d\xc7\x21\xdb\xaf\xf7\xce\x01\xe7\x0f\x62\xc1\x9b\x15\x53\x8c\xc5\x46\x4e\xcf\x98\x20\x03\xb3\x45\x2b\xd2\xd8\x7b\x79\x56\x12\xc5\xeb\x99\x3c\xe7\x72\x9b\xc6\xbd\x74\xfd\x10\x48\xd7\xf1\xf3\x92\x90\xd5\x93\x6c\x49\x68\x41\xd6\xc5\xe6\x88\x06\xbe\xbb\x36\x3e\x50\xe9\x6b\xd0\x86\xb2\x1c\xdf\x55\x78\xe6\xe4\xc7\x02\xc6\x04\x3d\xa7\xde\x6b\x27\xd9\x6c\x69\x22\x6b\xb4\x7e\x34\x0d\x43\x9d\xb6\xeb\x62\x93\xc7\x15\x4a\xc2\x95\xa6\x43\xdb\xfa\x92\x83\xf9\xa7\xf9\xc5\x18\x30\x93\x22\x76\x07\xa0\x32\x01\x0a\x09\x75\x22\xfb\x0a\x43\xd6\xd0\x25\x12\x66\x77\xbc\x5a\xcd\x55\x5b\xcd\x33\xec\x4f\xa1\x1f\x82\xd9\x82\x1c\x65\xd7\x79\xfd\x24\xc7\xf8\x86\xaa\xae\x5b\x18\x76\x59\xac\x76\x99\xa0\xc1\x38\x25\x3d\x58\x54\x63\x7b\x8c\xe8\x1d\xdb\xc7\x2d\xbd\x1d\x5a\x91\xd2\x7b\xb6\x8f\x79\xba\xd4\x5f\x02\xb3\x10\x42\xaf\x98\xe3\xc7\x17\x8c\xb5\xf4\xb9\xf9\x2d\xa2\x88\x33\xb6\xa3\xcf\xd8\x82\xb1\x03\x7d\xcb\x66\x37\x5d\x77\x60\xec\xa6\xb7\x90\x14\xd7\xf1\x3d\x5c\x3f\x77\xa8\xf8\xfb\x02\xbb\xf3\x33\x8b\xcb\xd5\x55\xf6\x9c\x44\xd1\xb3\x55\x93\xc5\xb7\xab\xbb\xcc\x88\x37\xf2\x6d\xfc\x33\x85\xdc\x34\x8e\xcb\xd5\xf3\xec\x8a\x44\xd1\xdb\x55\xad\x33\xdd\x67\x77\xc4\x5a\x42\xeb\x4c\xc6\x91\xa5\xe7\xff\x7e\xa7\x2f\xe8\x7b\xfa\x3a\xbf\x5d\xc5\xbf\xb3\x32\x8a\xae\xb0\xfe\x3b\xbc\x85\x5e\xb0\x72\x55\x67\xd7\x60\xfe\xd2\x2b\x8e\xde\xb3\x72\xd5\x64\x7a\x4f\x4b\xea\xd4\x57\xaf\x75\xe9\xe7\xd8\xf0\xbd\x69\x32\xd3\x75\xae\x06\xc5\xb3\x86\xbe\x60\x33\xdb\x54\x9d\xdd\x99\x7b\xeb\x3d\x24\x42\x0d\x4d\x76\x8f\xed\xbf\x86\xe2\x7e\x3b\x59\x4d\xe8\x36\xfe\xdd\x8c\xf7\x45\xfa\x7b\x3f\x28\xf7\xd7\x05\x4c\x60\x14\x6d\xe3\xc6\xa5\xe1\x61\x83\x0f\xba\x82\xf7\xf8\x27\x7d\x9d\xea\xbf\xec\xac\x00\x5c\xc8\x33\x11\xdf\xd1\xc2\xc0\x38\x16\xec\x8e\xd0\x67\x22\xbe\x87\x14\x48\xb8\x27\x34\x9e\x55\x26\x5f\x65\xf2\x55\x2e\x5f\x85\xf9\x2a\x76\x4f\x8e\x84\x3e\xa0\x5d\x2e\x2a\xf3\x2b\x34\xca\xde\x99\x68\x9c\x31\xa1\x7b\xb0\xd8\x42\xf2\x6b\x67\x0c\x11\xf6\x28\x2f\x3b\x98\x04\xba\x3b\x2f\x77\x74\x0f\xf6\x28\x6e\xd5\xae\xf1\x86\xda\x19\x83\x94\x1b\xfc\x69\x4a\xd2\x5b\xf6\x07\x8f\xaf\x09\xd3\xff\xdc\x10\x7a\xc7\xc2\xba\x6e\x57\xd7\xfe\xa5\x96\x2c\x31\x3c\x04\xb8\x0e\xdd\xb3\x43\x8c\xd5\xd0\xdb\xd5\x02\x9d\xdc\xa0\x6d\x13\x4d\x16\xb0\x2b\x61\x63\xe2\x26\x7d\xb2\x8a\xb7\xb1\x5d\x41\x5c\x13\x04\x4b\x75\x8b\xa2\x17\x01\xe7\xda\xac\xa9\x9b\x6e\x92\x0d\x8b\x62\x8e\xb4\x4f\xb4\x39\x3f\x79\x69\x8f\x21\x95\x52\xf8\x3e\xf9\xc2\x99\x11\x23\x96\xfa\x75\x5d\x1e\x5c\xe8\x2e\x8f\x2d\xca\x21\x20\xe0\x4b\xd9\x72\x75\x57\x54\x31\x3f\xbf\xaa\x84\x84\x78\x6b\xc8\x64\xcc\x16\x39\x37\xb4\xdc\x57\xe2\xce\x10\x1e\x77\xa2\x11\x57\xa2\x12\x2d\x90\x32\x43\x9a\xef\x4b\x5d\xc3\x8f\x45\xcb\x2f\x17\x2b\x57\x1f\x6b\x78\xeb\x5a\xf1\x80\xfc\xda\xf3\x5d\xd1\x7c\xa3\x3b\x17\x93\xae\x7b\xad\xbb\x4d\x1f\x6d\x30\x56\x6c\xa6\xc8\x6a\x3e\xcf\xe6\x06\x8b\xe7\x78\xba\x07\x24\x3b\xf9\x09\xe9\x81\x47\x87\x66\xea\xf7\x4d\x4d\x7e\x37\x5c\x9e\xdf\xe9\x11\x5b\x77\x8d\x5f\xe8\x60\xee\xbb\xee\x3d\x38\x90\x7a\x1e\xf2\xa6\x36\xcc\x06\x78\x89\x42\xde\x7c\x59\x1d\x14\x40\x6d\xb0\xd9\xc2\x87\x48\x0c\x66\xed\x44\x11\xd0\x72\x9d\xac\x6e\x39\xec\x52\x14\xbd\xc6\x2e\xd1\xe5\xc2\x0f\x9d\xf7\xde\x90\x88\x8f\xb4\x33\x73\xdf\x54\x71\x73\x23\xe4\xcd\x3b\x0b\x26\x78\xba\x79\x42\xe7\xb2\x36\x64\xf1\xcc\x63\x2a\x15\x2f\xb6\xdf\xc9\xea\xde\x2b\xee\xe6\x2c\xc6\xb8\x10\xf0\x1b\x42\x42\x8c\xe6\x55\x4f\xd3\x77\xde\x22\x18\x8d\x54\x40\xac\x99\xac\x73\xa2\x39\x2b\x90\x7f\x45\x91\xa7\xf5\xe1\xd5\x37\xb5\x02\x4c\xe9\x0f\xed\x6b\x2e\x0f\x33\x23\x7d\x69\x78\x05\x7d\x0a\xd7\x57\xf1\x86\x6b\x7a\xb6\x8e\xa2\xe9\xe5\x19\x79\x3a\xfb\xe5\xc0\xd4\xe1\xc9\x82\x8c\x11\x51\x14\x2f\xb9\xb8\xe3\x5b\xb3\xb3\x08\xfd\x79\xb0\x5f\x5e\x7f\x6c\x59\x60\x33\x0e\x56\xd8\x4c\xe0\x55\x75\x50\xa7\xe6\x6f\x49\x5f\x7f\xea\xfc\x11\x1a\x5e\x18\x9e\x37\xbe\xb9\x38\x3e\xb2\x65\xfb\x85\xf5\xe6\x7f\x27\xae\x61\x7f\x1c\xe9\xf2\xe9\xc2\x1f\xf1\xab\x47\xd4\xb1\x68\xa1\xa8\x8f\xae\x03\x94\xb0\xb4\x3c\x32\xa7\xfc\xe3\xfa\x46\x78\x21\xa5\x57\xd5\x23\x19\x35\xa1\x67\x24\x69\x3c\x70\x65\xa8\xad\x04\xa9\x34\xde\x60\xeb\x7a\x03\xf1\x3a\x26\x95\x8f\x01\x88\x3b\x84\xa8\x35\xf2\x26\xd4\xb4\x27\xc6\x10\xcf\x70\x77\x06\x11\xd3\x5a\x7f\x94\x88\x12\xe2\x06\x9c\x04\x09\xc6\xb2\xe1\xc0\xf6\xa9\xa2\x8a\xed\x8f\xde\x1b\x6a\x32\x9e\x52\x92\x1d\x98\x75\x89\x4b\xd1\x51\x6e\xb6\x8d\xa2\x72\xe8\x6a\x0c\x81\x02\x46\xa9\x27\x27\x0d\x99\x72\xf4\xc8\x4b\x97\xc4\xd0\xe0\xc1\xf8\xd2\x03\xd8\x6c\xde\x5c\x9e\x2f\x16\x4f\xbb\xee\xe6\x22\xd5\x7f\x80\x82\xe5\x02\xcc\x3f\x53\x76\x43\xe8\x3f\x5b\xab\x09\x3b\x10\xfa\x41\x98\x1f\x84\x96\x03\x77\x97\x5b\xb6\xc8\x6f\x2f\xca\xc0\xdd\xe5\x36\x49\x08\x14\x01\xe4\x84\x5b\x84\x84\xde\x5d\x0e\x8c\xbe\xd1\x9e\x01\x63\x05\xb3\x5e\x85\x3a\x50\xfe\x92\xfc\xee\x72\xe4\x1d\xe2\x22\x81\x9d\xf8\xc2\xee\xe8\xe8\x8b\x99\x84\xf1\x07\xcf\xd5\xe4\x78\x3c\x3a\x9f\xd4\x02\xdc\xb1\x63\x6f\x47\x3b\xa7\x88\x84\xf9\x0f\xff\x87\xfe\xe1\x1f\x6a\x9b\xad\x37\xce\x40\xdb\xec\xc7\x12\x76\xba\x65\xbe\xa1\xc2\x80\xc5\x78\x7e\x98\x10\xc1\x41\x59\xb9\x83\x08\x76\x9d\xff\x4a\xfe\x6b\x20\x2e\x50\x18\xf9\x75\x06\xd1\x01\xf7\x2b\xef\x88\xa2\x84\x22\x6b\x27\xc6\x95\x9b\xb3\x7c\x5d\xd5\xb5\x8a\x45\x0a\x70\x32\x56\x9d\xe7\xd5\x68\x2c\xdf\xec\x1f\x99\x48\xda\x81\x51\x02\x76\x90\x16\xac\xd5\x5c\xab\x00\x81\xa6\xfe\x0b\xed\x27\x01\x11\x96\x4b\xb0\x7f\x71\xd2\x1f\xfc\xed\x05\xc3\xab\xfb\x44\x13\xba\x2e\x6f\x2e\x8a\x55\x5c\xb0\xc6\x56\xf7\x37\x1e\xff\xd6\xc6\x9c\x36\x84\x9c\xe8\x02\x21\x99\x63\xea\x6a\xca\xfd\x80\x9c\x97\xac\x02\x82\x3b\xa8\xa9\x26\x24\x3d\x51\x13\xad\x98\x0b\x1b\x8d\x26\x53\x05\x6d\xeb\xde\xa6\xab\xa2\x45\xb2\xf4\xd7\xe4\x6b\x31\x09\x94\x4b\x45\x68\x34\x91\x83\x20\xc8\x10\x47\x6d\xbd\xf7\x35\xa8\xe6\xdd\x74\xc6\x40\xa0\x46\x72\xeb\xb5\x1a\xa5\x64\x6a\x62\x59\x69\xc1\x00\xf4\x85\x56\xec\xe1\x98\xf3\xde\xbb\xb6\xad\xf7\x97\x05\xe2\xbc\xa1\x17\x29\x24\x25\x85\xf5\x0e\xc0\x17\x19\xf7\x5e\xf2\x1e\x50\xd1\x6a\x66\x33\x5f\x36\x29\x44\xa3\xc7\xde\x4b\x52\xf5\x0d\x62\x3d\x17\x62\xb5\x40\x07\xea\x5e\xc3\x69\xcb\x4a\xcb\xb1\x97\x3d\x4a\x3b\x47\x16\xb3\x5e\x35\xce\xcf\x9a\xa4\x05\xc9\xcb\x19\x93\x9a\xe3\xf1\xea\x2f\xf1\x62\xf3\x2f\x7c\x1f\x6f\x72\x91\xa9\x49\x13\x9b\xc3\xe3\x33\x0a\xae\x9c\xe3\xa4\xf1\x9c\xea\xd4\x74\x4b\x77\x0c\xa5\x65\xd3\x8d\xe9\x59\xc0\xdb\x18\x45\x7b\x97\x3b\x27\x60\x81\x29\x47\xf7\x0d\xfc\x96\xec\x00\x9c\x92\x5f\xb7\x17\xcb\xc5\xaa\xf2\x9a\x61\x0b\xe3\xa0\x7e\x71\x08\xd3\x83\x47\x17\xea\xd8\xa6\xf1\x7e\xb5\xc8\x96\x0b\x42\xac\x17\xfb\xe5\x2e\x39\xa4\x5f\x78\x93\x07\x45\xcd\xc7\xc4\x66\x4f\x77\x84\x7a\x9e\x74\x2f\xcd\xb6\xc5\x29\xe2\x51\x14\xff\x29\xd0\x1f\x70\xb0\xd9\x98\x11\x96\x4d\xed\x4b\x20\xe5\xdc\xae\x1c\xe5\x20\x89\x6f\xb0\xfd\x0e\x6e\x50\x68\xc5\x41\x96\xdd\xf0\x16\x05\xf0\x31\xc9\x87\xc5\xbf\xaf\x1b\x63\xb4\xc8\xf5\x09\xe4\x14\x3d\xde\x46\x9c\x07\x22\x8b\xbd\x86\x8f\xde\xb9\xfc\xce\xdd\x95\x46\xc1\xc9\x11\x50\x61\x06\x66\xe6\x38\xd8\x7e\xf0\xe3\x0d\xc1\xb8\xfd\xae\x46\xdf\xf5\xb4\xf8\x1e\x40\x7f\x06\xb6\x3e\xa3\x61\xe4\xe3\x16\x70\x78\xc0\x73\x7e\xaf\x3b\x8a\x1e\x27\x26\x1a\x82\xf9\xd1\xd6\x18\x4b\x53\x0f\xcc\xa7\xdd\xbe\x1f\x59\x00\xc1\x1d\x84\x4e\x23\xde\x41\x43\xf7\x6f\x34\x5e\x01\x17\x92\xc1\x21\xc4\x37\x22\x15\xc6\xcd\xc4\xed\x35\xb3\x73\xac\x9f\x19\xb1\x8e\x27\x5e\x06\xc3\x33\xdb\xb7\x81\x24\xe2\x48\x72\x98\x71\xe9\x4d\xa1\xfb\xf1\x2e\x70\x02\x78\x63\xb6\x9e\x7b\x84\x07\x1b\x29\xe5\xe4\xe2\x49\xd7\xc5\xaa\xeb\x0e\x52\x0f\x0c\x30\x1a\x8e\x84\xfe\x88\x03\x9f\x2d\x08\x55\x51\xa4\xbf\x11\x5a\xe9\x1c\x9a\xc9\xf2\x03\x94\xbb\xa5\xe7\x6c\x68\xe1\xa3\x87\x3f\x61\x96\x86\x7f\x38\x48\xb4\x47\xf1\xb2\xc0\xf3\xe1\x74\x25\xef\xea\x3d\x6c\x36\xe3\xcd\x10\x0c\x8d\xf1\x91\x4d\xdc\x55\xa1\x00\x10\xf7\xad\xcd\x03\x51\x12\x1e\xaf\x3c\xa0\x89\xc6\x39\x18\xf7\x67\xe3\x2b\x6f\xbb\x4c\xcf\xc7\xb8\x53\xae\x36\xc4\x1b\x7b\xdc\x8e\x4f\xcf\xc6\x2c\x56\x2b\x6e\x75\xeb\xde\xad\x3a\xb9\xc6\x70\xb3\xea\x45\x26\x5d\x27\x86\xb3\x84\x67\x8f\x5e\xcb\xd0\x3b\x79\xe2\x72\xfe\xc8\x44\xd8\x43\xfc\xf8\x84\xeb\x5c\x71\x30\x5f\xdf\x88\xe9\x90\xb8\xd3\x06\x9d\x81\x92\x63\xf8\x94\xfa\x04\xae\x21\x29\xfc\x8d\x94\xf1\x13\x1b\x4c\xf3\x3a\x2e\xcb\x24\xcd\xe5\xad\x4e\x36\x22\x5e\xb1\x67\xde\x0a\x8d\x1b\xc2\x2c\xba\x9d\x47\xec\x4d\xe9\x55\x81\xa6\xaa\xd3\x0f\xb0\xca\x16\x74\x5b\x97\xa6\xa3\x82\xfa\x67\x28\x13\x09\xa0\xca\x25\xbc\x47\x93\xa3\x21\xf4\x5d\xc6\x07\x58\x78\x81\x3d\xac\x42\x31\xe7\x1f\x62\x3a\xbe\x6f\x79\x6b\x90\xbb\x04\x06\x07\xb9\xe3\xaa\xed\xf1\x59\x27\x22\x2e\xdc\x0a\x99\x1a\xfd\xcf\x72\xff\x61\x4e\x42\xfb\xe8\x3b\xb7\x35\x10\xbe\x05\x02\x8c\xd4\x4a\xfc\xf5\x68\x9d\x56\x27\xb4\x5c\x2c\xfe\x2b\x3f\xd3\x2d\xb8\x94\x71\x13\x3b\xaf\x89\x5c\x9c\xb7\xc5\x15\x02\x89\xca\xfe\xcf\x74\x49\xdb\x58\x10\xda\xc6\x92\xd0\xeb\x36\x16\x74\x8e\x85\xe6\xd4\x63\xf8\x45\xb0\x13\xa2\x88\xc7\xc2\xa3\x02\xe7\x7a\x26\x04\xf8\x41\x1f\xa1\x12\x39\x59\x89\xf4\xd7\x59\xd7\x11\xdc\xdb\x73\x18\x7b\x2d\x5b\x53\x0d\x4e\xf9\x8e\x97\x7f\xf2\xed\xbf\xb8\xaa\xd1\xc8\x7b\xb6\xf4\xc2\x4a\xb8\x19\xb3\x58\xa7\x42\x5a\xb0\x00\xbb\x3e\xfd\x17\x2c\x3f\x5f\xfe\x1f\x3d\x4d\xc7\xfc\x0f\xe1\x45\x3f\x41\xeb\x3f\x36\xb6\x8e\x6d\xfd\xdd\x7d\xd9\x06\x48\xa1\x4b\xb0\x49\xf6\x37\xa0\xcb\x60\x34\xe5\x4b\x00\x88\x0b\x37\x5c\x6f\xde\x1b\x0f\x3b\xe9\x34\xca\x57\x55\x5d\xfe\x39\xa7\xc3\xef\x96\x94\x5e\x09\xd0\x04\x66\xf3\x85\x9f\xc7\x63\xe1\x4f\x29\xf8\xdb\xe1\x93\x13\xf4\x36\x6e\xcf\xfb\x3b\x20\x8d\xf9\x4a\x64\x0b\x62\xb4\xea\x24\xf3\x7b\xeb\xee\xfc\xc5\xa8\x8f\x9e\x56\xfc\xe3\x5d\x9b\x2f\xe6\x84\xf2\xd5\x78\x21\x27\x67\xc2\xcf\xa0\x4c\x48\xed\xe1\x4c\xf8\x79\x40\x1b\xdf\x9e\x9b\xfb\xc4\x00\xf9\xf6\x99\x46\x9d\x42\x03\x83\x89\xe9\xb2\xef\x91\xbf\xf8\x66\xb2\xec\x27\xd3\x48\x1a\xab\xa9\x59\x9b\x1c\xda\xa7\x74\x06\x26\x68\x36\x79\x12\x20\x9c\x9e\xb7\x7c\x60\xbc\xbc\x00\x45\x1d\xe4\xff\xcb\x66\x7c\x51\x94\x7f\xc6\x27\x8f\xd3\x82\xd0\x07\xe3\xf1\xab\x7b\xee\xe0\xa8\xf4\x8f\xe3\x91\x06\xa7\x24\x78\xbf\x82\xc3\xe2\x8f\xd2\x7b\x2a\xdb\xc1\x21\xed\x0b\xb7\xa6\x43\x5b\xd1\x14\x57\x15\x7f\xa1\xbf\x9b\x8e\x73\x40\x6c\x76\x5d\xfc\xb2\x50\x5e\x1d\xe3\x52\xe6\xde\x98\x93\x53\x9d\xd5\xfb\x74\xd4\xd7\x70\x1f\x7b\x3d\x1d\x6c\xf0\x41\x3f\x7f\xe6\xaa\xfd\x48\x37\x75\x05\xa3\x32\x78\x43\x8e\xfa\x18\xac\x91\x1f\xdc\x7d\xb4\x6b\x76\xd3\xd7\x1a\xee\x92\xab\x28\x9a\x5d\xaf\xe6\xcb\x27\x70\x14\xe0\x82\x1b\x9f\x06\x4f\x17\x32\xac\x65\x42\x4d\x32\x9e\x67\x80\xb3\xfc\x76\x34\x32\x4c\x1e\x8c\x6b\x3c\x37\xe3\x07\x75\x52\xfb\x04\xcb\x16\x2f\xf9\x17\xb4\xf7\x68\x8c\x7b\x97\x83\x53\xf2\xce\x18\xa7\x97\x31\xb5\x72\x86\x2b\x1c\x6d\x8f\xbe\x51\xf5\xed\xf7\xb5\x90\x6d\x6c\x60\xb1\xd2\x25\x8d\x01\x19\x2c\xb1\x60\x60\xe4\xf3\x27\x24\x3b\x5d\xce\x16\x4c\x0c\x88\xd7\xe7\x4f\xa8\x83\x11\x5b\x12\x32\x63\x9a\xb3\x3f\x39\x91\x59\x3f\x24\x01\xf1\xac\x82\x89\x02\xf1\xbb\xbf\xf0\x77\x10\xc6\xca\x5b\x3c\x4f\x5e\xd7\x06\xc0\xfc\x7d\x1e\x42\x27\xbe\xe8\x09\x21\x47\xa0\x56\xbe\x15\x7e\x0b\x1e\x68\xd6\x5f\x86\x27\xe2\x5d\x17\x73\x06\x24\x28\x19\x21\xb7\x5a\x98\xdf\x00\xeb\xd4\x91\x57\xf9\x97\x58\xc7\x00\xf1\xf6\xef\x06\x4d\x7a\x58\x49\xd7\x89\xd9\x64\x35\x32\x49\xc8\x64\x09\x7d\xcd\x4d\xc3\xda\x81\x36\x81\x42\xfb\xd8\x75\xfa\xe9\xdd\xf6\xa0\x72\x4e\x4a\xd2\x94\x4f\xba\x23\x81\x80\x08\x31\x68\xc0\x14\x40\xbd\x03\x90\x33\x8b\x95\x6b\x96\x59\xd4\x66\x7c\x76\x26\x0b\x7d\x89\xcf\x39\x96\x7a\x61\xc5\xb0\x96\xb9\x35\xe5\xf0\xe0\x7f\x53\xab\xd2\x15\xc7\x40\xb3\xa6\xb4\x2d\xa0\xf3\x9f\x35\x75\x25\xb6\x67\xad\x2a\x64\x83\xfb\x66\x4e\x85\x05\x83\xb3\x19\x57\xb1\x37\xb0\x6f\x04\x52\xf0\x93\x8f\xee\xa9\x7c\xbb\xb0\xab\x6e\x84\x93\x99\xdf\xfb\xb3\x61\x1e\xc5\x8f\x76\x60\xee\x4c\x11\xfd\xe5\xf7\x90\xe1\xdf\xf0\x0f\xed\xbb\xfa\xad\xad\xc5\xcf\xe5\x33\x0b\xb1\x95\x9f\x7d\x64\x9c\x13\x99\x4e\x0c\x72\x22\x27\x8e\x90\xfb\x41\x3f\xdc\x38\x1f\x6b\x7d\x7e\xfc\xf6\x31\x12\xd4\x2a\x1e\x1f\x2c\xda\x9d\x05\xc1\x3b\x1e\xe9\xb7\x9f\xf0\x2a\x93\x87\x53\xf9\x82\x07\x71\x94\x6d\x74\x25\xe1\x25\xf2\x93\x60\x0f\x48\xc8\x66\x7f\x08\x60\x45\xb2\x6f\x85\x77\x97\xfc\x6d\x60\x31\xdd\x9f\x9d\x09\x76\x19\x8e\x14\x34\x14\x9f\x60\x95\x8b\xed\xd6\xc4\x01\x99\x52\x66\x3e\x5a\x84\x4c\x57\x09\x0f\xd5\x4f\x62\xed\xd9\xe2\xda\x6f\x80\x71\xb5\x09\x80\x0f\x46\x6d\x0e\x22\x25\x4d\x35\x81\xcb\x0c\xfc\x0f\xa7\xf3\xdb\xfa\xd0\xf0\x6d\xfd\x5e\x06\x2c\xd0\x48\xa1\xfb\x1f\xe9\x9c\x8d\x2d\xc2\x91\x2e\x34\x83\xc4\xc7\x91\x3b\x7c\x2f\x3b\x1b\xb7\xe3\xd8\xb7\x0f\x2f\xaf\xcf\x67\xe9\x17\x13\x45\x35\x24\x33\x12\xb2\x23\x9d\x10\x81\x0c\xd6\x64\x4a\x41\xff\xf8\x9a\x00\x5f\xfd\x6f\xc1\x16\xfd\x8e\xf9\xc5\xec\x18\x90\x50\xb2\x87\xf2\x36\x43\x19\x84\x51\x9a\x65\xb3\x25\x42\x03\x1a\xde\xde\x17\x73\x50\x0f\xad\x5b\xe7\xc3\xb3\xf3\x52\xcf\x51\xb6\xa0\xed\xbd\x7e\x20\x74\x3a\x9a\xf9\x7f\x77\xf5\x47\x83\xf6\x40\x28\xbb\x7d\x56\xb6\xe2\x4e\xb4\xf7\x2f\x20\x18\x8a\x9a\xfc\xf6\xbc\xa8\x2a\xbe\xcd\x16\xd4\x99\xd6\x7b\xdd\xc2\xe6\x5e\xa3\x8e\x0f\xfa\xd9\xcb\x9e\x30\xbc\xb6\x13\x4f\x07\x3f\xbf\xaf\x4d\x5b\xb0\x8e\xba\xa0\xd8\x66\x49\xf2\x6f\x41\x6f\x0b\xf5\x27\x44\xe4\xc4\x0c\xde\x92\xb5\xe4\xa1\x56\xab\x5a\x9d\xd7\xfb\xc6\x06\x37\xcd\xda\xf3\xfa\xbd\x6c\xbe\x55\xf5\x61\xcf\x6a\xc5\x1e\xea\x7d\x93\xad\xdb\x0d\x1d\x05\xe9\x5c\x6f\x00\x4d\x16\xa6\xd8\x07\x8f\x1a\x8b\x8e\x73\x1e\x45\x53\x68\xe7\x5e\x53\xa0\x5f\x23\xad\xba\x7f\x98\x4d\x31\xca\xc3\xc6\x01\xbc\x6d\x5b\x23\x3e\xb3\xea\x5d\x34\x54\x92\x10\xbe\x56\x1b\x0c\x36\x3a\x8c\x72\x84\x50\x8d\x7a\xb0\x63\x8f\x0e\x48\x5f\x0b\xf4\x1f\x3a\x9f\x5e\x4c\x44\xac\x1c\x7e\xc5\xe5\xbc\x38\x55\xc8\xb6\x45\x4e\x65\x58\x4f\x57\x98\x24\xde\x28\xa8\x3c\x2f\x6f\xc9\xf1\xf8\x7e\x27\x2a\x1e\xf7\x03\x26\xc7\x58\x91\xe3\xb5\x90\x45\x55\xdd\x3f\x98\xf8\xad\x94\x83\x03\x53\xcc\x83\x95\x1e\x2a\x77\xbd\x69\x40\x9c\x47\x3d\x7e\xbe\x39\x2f\x6f\xcd\xa9\x01\x27\x9b\xd9\x74\x15\x90\x1b\x16\x61\x30\xf9\xff\x10\xb1\x9e\xff\xe1\xac\x07\x3e\x34\x3f\x08\x04\xd1\xcb\x87\xf1\x50\xbd\x20\x06\xff\xd4\x79\xe4\xc6\x8f\xf3\xba\xc8\x8b\x3e\x4f\x91\x24\xe4\x57\x9d\xa7\xd8\xf8\x00\x49\x8b\xbc\xea\xf3\x54\x7a\x58\x32\xe6\xeb\x6a\x43\x8e\x71\x1b\x38\x1d\xff\x23\xdc\xa5\xb7\x20\x0e\xb5\x96\x6e\x13\x9e\xcc\xbd\x19\xdc\x8c\x7b\x97\xd0\xf3\x4a\xec\xf7\xfa\xaa\xf5\xe4\x91\x9e\x30\x15\x43\x0a\x06\x22\x1a\x36\x9d\x33\x3d\x21\xd0\xe4\x53\x44\x9a\xa1\x1f\x50\x1e\x09\xc4\x03\x0f\x68\x40\xd4\xb0\x18\x22\x2e\x1d\xf6\x60\xaa\x04\x92\x7d\x40\x69\x62\x2f\xc3\xba\x87\xe3\x05\xa3\x03\x82\x72\xfd\xe0\xc2\x8a\xa2\x5f\x38\x26\xdf\x1e\x9a\xd6\x84\x3c\x68\x7d\x0f\xc2\xae\x6b\xfd\x78\x08\x56\x85\xe5\xf1\xc5\x3a\x87\x77\xab\xa1\xa9\x57\xff\xbb\x57\xb5\x5f\x28\xcf\x35\x30\xcc\x63\x34\xef\x97\x4c\x59\x77\xc1\xae\x53\x03\xcb\x09\xbd\x68\x93\x76\x37\x76\x4c\xcc\x1f\x45\x14\xe9\x37\xbe\x46\xdd\x82\x9f\x0c\xca\x1c\xaf\xfb\x14\x95\xff\x59\xd0\xa1\x23\x0d\x46\xed\x6d\xc4\x1f\xcc\x4b\x85\x4d\x6e\xbf\x32\x14\x5c\xd8\x46\x29\x63\xd8\xa4\x36\x9b\x57\xfe\x9f\x8f\x6d\xe4\x61\xb5\xc0\xd8\xc0\xf2\x5c\x15\xca\x22\xb4\x7e\x03\x49\xe3\xd9\x99\x4d\x4f\x0f\xac\x47\xb1\xfd\xe3\xd0\xe0\x56\x79\x57\xb3\x97\x4a\xbf\xfe\xb6\x82\xfe\x2f\xdf\x9e\x16\x8d\xb2\x93\x2f\x28\x9f\x30\xa7\x61\x83\x1a\x83\x0e\xfa\x82\xb2\x5e\x82\xa6\xa6\xcf\x8b\x1a\xb9\x80\x24\x83\xba\x93\x57\x2a\xe6\xc4\x0b\xd4\x64\xd9\x2a\xd8\xb5\xc5\x87\xb7\x93\xca\xea\x8f\xd7\x9b\x7e\xd0\xf5\xa2\x22\x2d\x9c\x75\xd8\x9c\x83\xa7\x1e\x95\x44\xc6\xad\x6f\xeb\xfc\xfa\x98\xfa\x14\x87\xbf\x5f\x07\x6b\x9e\xdb\x33\x14\x74\x08\x2e\x9f\x10\xaf\x72\x20\xaf\x1e\xce\x8c\x09\x47\x16\x4c\xc2\x05\x1f\xa8\xb2\xa2\xe8\x2b\x11\x73\x4f\xd7\xf6\x98\xba\x6a\x58\x1b\x31\x51\xf1\x4e\xd9\x32\x2d\x7b\x19\x01\xd0\x31\x9a\xf9\x82\x3f\x18\x7b\x17\xbf\xd1\xf3\x9b\x4f\xcc\x9a\x3e\xc9\x8f\x7b\x53\x8e\x8a\x50\x75\x6a\xa1\x7a\xb2\x70\xc6\xb8\x47\x17\x92\x28\xfa\x4b\xc0\xe9\xef\xb7\x66\x7f\xff\xf5\x27\x6c\x2f\x27\x32\x0d\x97\x3f\x8a\x7e\x86\x53\xc7\x87\x24\xbb\xad\x0f\xe8\xcd\xf1\xb8\xd0\x30\xb4\x3d\x47\x32\x14\xb4\xc6\xbf\x0b\xb8\x1b\xbc\xed\xd1\xca\xd3\x57\x02\x15\x38\xa8\x89\xab\x61\x8b\x1d\x37\x37\x8c\x35\x15\x38\x7f\xbf\xe3\xbc\x02\xa4\xec\x5f\x0d\x00\xc2\xe0\xb6\x0e\x93\x5e\x41\xf0\x88\xe0\xf2\x43\xbc\x36\xaf\x9e\xa0\xd6\xdf\x8c\xaf\xf7\xa8\xe6\x28\xfa\x11\xe7\xbb\xbf\x5a\xcd\x25\x6a\x62\xf2\xd1\x71\xcb\x66\x73\xfa\x49\x74\xb6\xa0\x08\xc7\x1c\x3c\x2a\xe3\x58\x15\xf7\x60\xfd\x8a\x99\xd0\x86\xe3\xa5\x6c\xeb\x9f\x05\x7f\x3f\x27\x27\x64\x38\x8f\x81\xcf\x50\x89\xc4\x58\xa1\x47\x6b\xf8\xbc\xfa\xbd\xe4\xca\xfa\xbb\x39\x2b\xa4\x44\xa0\x25\xd5\x4a\xb2\xd9\xc2\x19\x11\x61\xea\x65\x5c\x04\x50\xc8\x42\x4a\x6e\xe4\x39\x5d\x57\x0c\x91\x90\x43\xcb\x2f\x00\x8b\x9f\x2d\x1d\x26\x7c\x14\xcd\x6e\xac\xc3\x51\xef\xa8\x78\x78\xb2\x58\x5c\xcd\x47\x61\xdc\x9d\x7f\xda\x23\x6e\x64\xc6\x19\x0d\x47\x91\x2a\xcf\xad\x3d\x0d\x40\x40\x3f\xea\x8f\xe6\xf9\xa2\x85\x76\x5e\x46\xe7\xea\x49\xb1\x3e\x5a\x97\x75\xa7\xe3\xce\x49\xd2\xf3\x93\x73\x37\xfa\x13\x1a\x9a\x39\x11\x13\x9b\x2f\x9f\x42\xe8\xf5\x7d\x27\x2a\x42\xad\x55\x92\xdd\x1e\xb1\x1c\x82\x7d\x63\x31\x5f\x6e\x5a\x91\xe3\x80\x22\x0f\x0c\x5e\x72\xe7\x08\x05\x50\x24\xbe\x57\x6f\xf8\xf6\x72\x8b\x66\xd2\xc3\xc2\x5a\xb4\xdb\x95\xe0\xb1\x0d\x3f\x7a\x5e\xee\x92\xa5\xe7\x5c\xc4\x29\x07\x70\x5c\x2f\xcf\x44\x05\x3a\x47\xba\xcc\x00\x45\xd7\x79\x16\xf1\x21\x0d\xfe\x14\x88\x6f\xb3\x8f\x34\x83\x6a\x5c\x93\x09\xad\x19\x46\xfa\xe3\xab\xdf\x30\x64\x56\xd6\xd0\x12\x6d\x79\x24\x1b\x58\xf3\x18\x6c\x9d\x7a\xca\x9a\x07\x40\x76\x68\x7d\xc2\x9a\x67\x50\x72\x68\xcb\xd3\x58\x5b\x9e\xda\xb7\xe5\x01\x2b\xeb\xc0\x72\x05\xcc\xea\xc2\xa7\xad\xc7\x8e\x28\xfd\x6b\x28\x06\xe9\x85\x97\x64\x3c\xee\xa6\x2c\x7d\xb6\xe4\x72\x09\x7e\x4e\xb3\x85\x0b\xc6\x10\xbe\x9e\xf1\x57\x7e\x6d\xf8\x28\x9e\x36\x2a\x39\x04\xf5\xcd\x2a\xe2\x47\x39\x38\x93\x7a\x4b\x6d\x39\x80\x21\x0f\x49\x64\x32\xf5\xa1\xad\x07\x17\xa1\xb3\xc6\x72\xb6\x9b\xb7\xc5\xfd\x15\x7f\x01\x0a\x06\x13\x85\x9b\x16\x36\xf9\x27\xb9\xf3\x3f\xc0\x7c\x8d\x30\xaa\xbc\x68\xb3\x72\x5d\x6d\x60\xb7\x59\x56\xb3\xeb\xee\xda\x58\xa7\xd2\xf9\x4e\x6c\x39\x86\xcf\xee\xc3\x34\x23\x26\x40\xd1\x57\xd1\x90\x62\xdd\x84\x55\x44\xd1\x5d\x1b\xeb\x54\x3a\x3f\x48\x53\x89\x77\xc3\x7a\x86\xc6\x80\x2c\xe2\x5b\x77\x9e\x36\x30\x02\x33\x41\x27\xd0\x81\x26\x38\x9d\x1b\x24\x87\x39\xe5\xc1\xe7\xfe\xd5\xef\xdf\xeb\xf3\x6b\x21\x45\xb3\x8b\x7d\x68\xd8\xfe\x6d\xb1\x52\x12\x0b\x81\x19\x93\x1c\x24\x54\x80\x38\xd5\x27\x3a\x46\x1e\x64\x28\x9e\xe9\x9f\x92\x81\x23\xb6\x6f\x3b\x31\xae\x5c\x5f\x57\xd5\x7d\xdc\xd2\x42\xdd\xc0\xe3\xd0\x4c\xb5\x36\x91\x6b\xd8\xbc\x87\x69\x29\x3d\x70\xb6\x41\xeb\xa0\xfa\xf5\x3b\xd0\xda\xaa\x77\xa2\x19\xf6\x61\x27\x9a\xa0\x1b\x27\xf2\x06\x3d\xd1\x65\xfc\xce\x14\x27\x3a\x63\x08\x1e\x34\xa6\xc1\x38\x6b\x5d\xc7\x3f\xb9\x6f\xfc\x3f\xed\x18\x0f\x7a\x55\x49\xeb\x71\x03\x24\xa3\xb8\xd9\x55\xc0\xb7\xab\x5a\xb6\x82\xab\x51\x90\x43\xbd\x75\x90\xf6\x73\x79\x41\x99\xc7\xe9\x57\x71\x23\x69\xe0\xcd\xd3\xc8\x01\xf2\x1a\xc2\x5d\xf0\x71\x33\x63\xd0\x0b\x47\xba\x24\x9a\x7f\xfd\xaa\x68\x79\xd2\xbf\x2d\xef\x6b\xf5\xe7\x3b\x71\xcb\xa9\x60\xb7\x80\xad\x3d\xae\x51\xd3\x31\xeb\x8d\x85\x78\x13\x3e\xca\x18\x10\xff\x08\x3b\x83\xd2\x04\x3a\x6c\x3c\x79\xba\x58\x90\xfe\xcd\x2b\x10\x3d\x66\x12\x9e\xa3\x07\x8f\xaa\x20\x72\xdb\x7d\xc5\x1b\xda\xb0\xc2\xe7\x21\x2f\xfb\x9e\xdf\x16\x1f\x5e\xd8\xae\xa2\xf3\xc4\xea\xa7\x36\xe6\xe7\xb7\xf5\x96\x53\x81\x33\x4b\x50\x20\x5a\xb3\x6b\x0e\x88\x6c\x42\xd3\x81\x79\x83\xd7\x82\xce\xc0\x1a\x42\x6d\x5b\xac\x36\x7f\x18\x34\x6c\x93\x0e\x12\x66\xde\xd0\x2d\x33\x11\xaf\x79\x93\x6f\x57\xe1\x47\xb6\xcd\x4a\xc0\x1f\x0f\x12\x43\xe1\xe3\x81\xcd\xaa\xae\xb3\x50\x36\x33\x37\x44\x77\x2f\x96\x33\xb6\x8d\xa2\x78\x56\x76\xdd\x6c\xdb\x75\xa5\x8d\x5c\x3e\x63\x5b\xfb\xa7\x4e\x75\xa1\xca\x75\xba\x17\xb7\x7c\xc7\x16\xf9\xec\x10\x45\x3b\x17\xcc\x2f\x4f\x92\x1d\x39\xb0\x6a\xbd\xdb\xf4\xcd\xad\x77\x9b\xfc\x10\x45\x12\xa5\xbd\xc2\x38\xc7\x14\x38\x1d\xcf\xf4\x8b\xcf\xc4\x79\x53\xdc\xf1\x98\x50\x01\x30\x94\xe8\x75\x80\xe0\x3d\xc1\x62\x5c\xb0\xc7\x56\x23\x8a\xee\x60\xd2\x11\x50\x58\x8c\xda\xd0\x0d\xff\xd7\x53\xc6\x16\x2b\xdb\x1e\x2e\x96\xdf\xa8\xde\xe5\x6e\xd7\xba\x28\xa6\x78\xd2\xc2\x3d\xfc\x15\x07\x98\x88\xd9\x02\x34\x17\xa3\x3d\x6c\xda\xa3\xb8\x3d\x5c\xaa\x67\xfe\xeb\xa7\x53\x3b\x2d\xd2\xbd\x38\x70\x95\x7b\x57\x4d\x28\x4b\x95\xbe\x1c\x15\xe0\xb3\x24\xc0\x95\xea\xa1\xcf\xc9\x91\xa0\xe1\x5f\x2d\x47\x76\x0a\x03\x88\x8c\x1c\x95\xeb\x82\xbf\xdf\xd7\xaa\x65\xdc\x18\x39\x89\x46\x5c\x55\x9c\xfd\x4b\xd8\x98\x07\xe0\x99\x07\x66\x22\x5b\xd1\xd6\xea\x65\x83\xaf\x35\x9b\x89\xc1\x33\x88\x22\x11\xc8\x6a\x3e\x38\x4d\xf0\xa4\x0d\xa6\x9f\xd3\x6a\x9a\xa7\xac\x28\x21\x5f\x5d\x59\xd6\x11\xb3\x7e\xc0\xe8\x3b\xfa\x13\x30\x69\x4c\x59\x7b\x8e\xdb\x86\x35\xc2\x7d\xc4\x50\xd1\x6c\xbd\xf1\x14\x7c\xa5\x3c\xa5\x28\x77\xd7\x1d\x1f\x8c\xd6\xee\x06\x00\xe7\xa2\x88\xf1\x3d\xe3\xd8\xb4\xe6\x9b\xcd\xb4\x19\xe4\x63\xe5\x07\x9c\x75\xdf\xda\xfa\xc2\x09\x08\x1d\xb8\x9f\x9a\x02\xf7\x9b\x48\xf4\x64\x8b\x51\xa4\xce\x15\x97\x5b\xae\xf8\x56\x33\x04\xcc\x7c\x02\x98\x03\xc0\x99\xb2\x41\xaf\x97\xf9\x8d\xbe\xcb\xa3\x28\xbe\x31\x0e\xcc\xfd\xf4\xf4\xb1\xe3\xfd\x40\x01\xb4\xf0\xf7\xa9\x3f\xaa\xb4\x3f\x03\x76\xcf\xa0\xcf\x00\x15\x16\xfe\xb0\xea\xdd\x54\x24\xf5\xc7\x9d\x9c\x2a\xab\x69\x29\x3b\x55\x17\x45\x14\x15\xa9\xf7\xfb\x09\xba\xfa\x7b\x10\x2c\x08\x75\xa6\x3c\x08\x25\x6a\x67\xe5\xb2\xd2\xd3\x82\x7f\xa7\x15\x96\x0d\xfa\xe3\xa6\x8f\xd0\x17\x1c\x2a\x76\x38\x60\x85\xee\xba\xc3\x30\xac\x5c\xdc\x8f\x62\xc6\x7c\x99\x6f\x35\x73\x6b\xa0\x97\xa8\x2a\x1a\x00\x07\xea\xa5\x37\xc1\xae\xf7\xb3\xfc\x82\x11\x56\x79\x18\xa6\xff\x64\x50\x57\x7b\x40\x17\xcc\xc0\xcd\xb9\x6b\xdb\x43\xa4\xeb\x3a\x75\xc1\x7a\xb4\xba\x55\x8c\x7f\xb3\xc6\xc6\x9f\xa0\xfd\x47\xc6\x49\x16\xf7\x3f\x2f\xf9\x2a\xcc\xdc\x7f\x72\x48\x81\x98\x44\xb2\xfe\xd3\x05\x62\xe7\x41\x39\xe1\xe3\x08\x1a\xd0\x38\x12\xb6\x48\x6d\x47\x2f\xd4\x2a\x2c\xe5\x23\x15\xda\x4c\x54\x11\xdb\xd6\xbb\xfa\x52\x9d\x68\x69\x41\xa1\x2d\x45\xfa\xc6\xde\xd5\x4c\x1d\x89\x81\x40\xa5\xbe\x50\x80\xa1\xb7\x9a\x81\x7a\xf3\xf7\x8c\xe7\xdc\x08\xf1\xdc\x7b\x48\x23\xbf\x3c\xc8\x27\xcd\xf3\x0c\xa7\x0a\xce\x7c\x63\xe3\xa2\xf6\xa7\xff\xd4\x69\xfc\x9f\x9f\xf0\xfe\xfc\xa2\x03\xd7\x20\x0c\xa9\xef\xe6\x3f\xc2\x9f\xe5\x20\xba\x6c\x4d\xd8\x0d\xde\x75\xb3\x97\x83\x70\x68\x5f\x89\x3b\xbd\x5c\xc3\x82\x8a\x3d\x14\x65\x2b\xee\xf8\xd7\x55\x9b\x61\xac\xf1\x3e\x6c\xbc\x93\x64\xda\x5d\xfa\x63\xdc\x92\xe0\x83\x7e\x40\xcf\x0b\x59\xee\x6a\xf5\xa6\xde\xf2\x28\x42\x98\x45\xb9\x8d\xa2\xa9\x0e\xf8\x79\x51\x62\xd7\xff\x66\xfe\x47\x6a\xbf\x98\x55\x15\xc1\x4f\xaa\x50\x98\x69\x8a\xb9\xbf\x6d\xba\x2b\xe4\xfd\x22\x3d\x4a\x5e\xdc\x63\x14\x97\x97\x7f\x87\x6e\x58\x87\xeb\x81\x89\x8b\xac\x25\x9f\x13\xfa\x91\x23\x3b\x0a\x5d\x6a\xd6\x16\xa0\xed\xec\xd0\x35\xc5\xd9\x1b\xc9\xf6\xcf\x52\xd3\x87\xa9\xe0\x3e\x26\xb7\xed\x61\x0d\x68\x2d\x5e\xec\x38\x8c\xdb\xff\xcb\x8e\xf3\xea\x5d\xa1\x6e\x78\xcb\x18\x5f\xf1\xc9\x9e\x67\xbe\xbb\x6c\x20\x2a\xe2\x84\xf6\x91\x46\x4b\x73\xde\xe8\xd6\xbb\x5a\xe8\x81\x2d\xf2\xc3\x45\x69\xe9\x8e\x83\x95\xc7\xec\x58\xb9\x3e\x20\x18\xde\xce\xfa\x8a\x03\x86\x8a\x84\x0d\xb0\x1b\xba\xe9\x32\x56\x98\x18\xc7\xd5\x8c\xe1\xd7\x9c\x54\xac\x89\x2b\xbc\x71\xf7\x4c\x5a\x9f\x43\xfd\xa8\x5e\x68\x12\x75\xe7\x4d\x63\xbe\xf3\xa2\x9f\xff\x15\xbb\x5f\x74\x8e\xc6\x49\x73\x72\x99\x2e\x21\x48\xec\x6c\x49\x28\x84\x47\xdf\xd1\xad\xbe\x2e\xe8\x3e\x8a\xe2\x57\xb1\x5f\x19\xa1\xfe\xaf\x4f\xc2\xb8\x57\xbc\x0f\x65\x42\xb7\x70\x09\x55\x66\x1c\xfe\x7a\xf9\xde\xed\x57\x7d\x27\xf2\x22\x34\xbc\xb9\xa6\x15\x39\x6e\x13\xb6\x83\x87\x17\xa1\x29\x2b\x3b\x1f\x47\x7d\xcd\x8d\xef\x08\xf3\x82\x13\xfa\x91\xdd\x3a\xd7\x57\x61\x70\x2b\xe1\xdd\x42\x87\x37\x89\xde\x4f\xee\xd4\x07\x3f\x66\xec\x5d\xec\xfd\x0c\x85\xc9\xa8\x4f\xea\x3f\x5a\x64\x91\xd9\xe7\xff\x2f\x7e\xf9\xe6\xfb\x9f\xde\x75\xef\xbe\xfe\xf5\xdd\xb3\x1f\xbf\x7e\x46\xfe\xe6\xc0\xf4\xfa\xec\x7a\xc6\x00\x41\x0f\x5a\xf4\xee\x8c\x97\xfd\xdc\x5f\xd5\xdb\x7b\xda\x86\xb7\xc4\xf8\xb3\x3b\xf0\x84\xf4\x2c\xeb\x89\x4e\xa3\x62\xc2\x93\x6e\x87\xd7\x17\xe8\x2a\x70\xc5\x7f\xd4\xdb\x0a\x2e\xb4\x86\xb7\x5f\x83\x63\x92\x77\x21\xb5\xc1\x0d\xa4\x1f\x22\x1b\xe9\x33\xd6\xfb\x4e\x99\xe3\xf5\xac\xaa\xa0\x1e\x3d\x2f\xea\xbc\xd8\x6e\xb1\x56\xa1\x7f\xe1\xcd\x18\x7b\xfd\xb7\x63\xb1\x57\xd4\x31\xde\x12\xfa\x2a\x56\x3d\x10\x0c\xfe\x74\xaa\x1d\x48\xe9\x9d\x6a\x03\x55\xbd\x1a\x2a\xe0\x0c\x21\xbe\xa0\x0d\xee\x9a\x80\x74\x19\x52\x2e\x74\x40\xb8\x0c\xe8\x16\x74\x19\xfc\xfb\x62\x01\xd4\xd7\x18\x6c\x1a\x71\x22\x3d\xa0\xd9\xad\x21\xb7\x7b\x50\x6e\xee\xc8\x40\x2a\xd8\x6c\x91\xe7\x42\x9f\xd8\x07\x44\xc0\x3e\x29\x8b\x1e\xf2\x00\x33\x64\x02\x88\x00\xd5\xa3\xc7\xb8\xf4\xd7\xb1\xc5\x79\xf5\xc0\xab\x03\x97\x7f\x90\x6d\x3f\x04\xd2\xe0\xd3\x3e\x68\x29\xfa\x87\x9b\x48\xf2\x84\x7e\xa4\x4d\x3a\xe4\x0a\xc6\x12\x88\x21\x77\x30\x92\xa6\x60\x1c\x74\x00\xe3\xc0\x49\x34\x29\xaf\x9c\x17\xb0\x44\x63\xe7\x1c\x60\x5e\x29\x98\x41\x4b\x42\xf7\x12\xff\x35\x34\x0a\x9b\x2d\x8f\xfc\xbc\x11\x37\xb2\xa8\xe2\x96\xce\x71\xd1\xe6\xb4\x0d\xfc\x30\x6d\xaf\x7c\xdb\x65\xc5\xf5\x2a\xe1\x1d\x62\x2d\x1f\xc2\x3e\x9e\xca\x0d\x8c\x4a\xec\xb7\x6a\xd7\x1c\x95\x92\x73\x3a\x04\x2d\x86\xb7\x66\x34\x05\xf4\x74\x67\xa6\x10\x85\x4f\x75\x66\x3c\xb7\x1e\xf6\x60\xc0\x0f\x1a\xc3\x0b\x30\x05\x17\xd7\x31\x4c\xbc\x22\xe4\x01\x8d\xb4\xb7\xf8\xd3\xf8\xce\x8d\xe6\x5e\x98\xb9\x87\x53\xee\x84\xb4\x1e\xbc\xbd\x34\xc8\x4a\x23\xfb\x19\xf4\x25\x99\xf2\x91\x44\x45\xf9\x56\xbf\x24\xe6\xa1\x33\x6a\x5d\xbd\x80\x1e\x42\x7d\x2f\x12\x9c\xd6\xc2\xbb\xd3\xee\x9c\x0e\xad\x0a\xde\x16\x98\x30\xfe\x69\x51\x94\x7d\xaa\xc4\xe4\xf5\xe3\xe7\x9f\xb0\x58\x4f\x7a\x6b\x1f\x0f\x9c\x71\xca\xfa\x89\xda\xab\x02\x59\xf2\xa2\x12\x37\xf2\x17\x44\x02\xe9\xba\xa9\xa0\x26\x27\xac\xa7\xbd\x50\xda\x0c\xc2\x8d\xa4\x23\x9f\x4f\x63\x63\x11\xea\x43\x82\x88\x2a\xbe\x90\xa3\x60\xe8\xad\x45\x51\x0b\xa1\x7c\x1b\x30\x08\x22\x01\x41\x30\x0c\x7a\xce\x64\x97\xf4\xcd\xa3\x33\xdd\x4c\xfc\xf2\x9d\xbe\x0a\x42\xbd\x2f\x5f\x16\xe5\x9f\x37\xe0\x2b\x1b\x96\xe8\xd3\xc3\xb2\x96\x93\x85\xac\x30\x7d\xc5\x55\x85\xe8\xda\x4e\x0b\x82\xc8\x41\x8d\x0f\x1a\xd4\x00\x0e\xb7\x57\xd1\xf1\xd4\x18\xf8\x60\x07\x20\x6c\x6c\x22\xd1\x6c\xdc\x47\x35\xb7\x24\xc7\x6c\x92\x40\x0e\x39\x9e\x3e\xe2\x47\x40\x72\x85\xe2\xdf\x74\x49\x7c\x8f\x08\x30\xe9\x74\x02\x4f\x11\x44\x41\xb6\x56\x97\xc2\x45\x97\x9e\x42\x52\x75\x2e\xaa\x8a\x8c\xa3\xff\x48\xe8\xa7\x8f\xa7\x8b\x03\x4f\x79\x05\x81\xd0\x0b\x26\x7d\xcf\x37\x7f\xb3\x54\x4c\x06\xb6\x77\x85\x25\xe8\xb1\x93\xdf\xfa\x6b\x6e\x7c\xe5\xe6\xd4\x0d\xe0\xa5\x94\x56\x3c\xe6\x24\x21\x05\x0d\x8a\xfa\x95\x57\x24\x59\xf6\x85\xad\x58\x6d\x54\x57\x52\xd1\x70\x8a\xa6\x32\xad\xec\x7c\x66\xe9\x92\x9e\xec\x6c\xd8\x18\x1e\x8b\x9d\xf4\xf1\x74\x67\x36\xf6\xdb\xcc\x8b\xe1\x74\x3b\xa2\x0a\xd6\x1b\x4d\x0d\x2c\x29\xda\x67\xb6\xbe\x7d\xa6\x0d\x88\xbb\x96\x1b\x3d\x9d\x9a\x65\x15\xd7\xf1\xbc\x69\x95\x90\x37\xf3\x19\x6b\xef\xf7\xbc\xbe\x3e\x2b\x40\xe8\x63\xa4\xcf\xb4\x80\xc0\x43\x16\xac\xf9\xc4\x8a\x36\x73\xe0\x4a\x80\x57\x26\x65\x2d\x5b\x21\x0f\x5c\xd3\x23\x8b\xa3\x42\xb1\xf5\x83\xab\x23\x2b\x28\xd4\x9c\x55\x47\xc7\x43\xf2\x28\x9a\x89\x28\x1a\xe7\x3d\xd5\x9c\xa9\x02\x6c\xa3\x89\x1f\x64\xf8\x2e\xb8\x01\xcd\xb1\x02\x47\x20\x2f\xfc\x52\xfe\x0a\x0d\xea\xfa\xb5\x60\x41\xc0\x93\x41\x7c\x93\x24\x71\x18\x17\x6a\x2d\x36\xb0\x4b\x5d\x17\x61\x63\xe2\x54\x35\x6c\xfa\x48\x8c\xc0\x85\xb1\x2b\x67\xf3\x44\xdf\x2d\x55\x14\xc5\xf6\xe0\x97\x4d\xa3\xf9\x24\x56\x3d\x3a\xd1\xc0\x36\x78\x7d\x6f\x1c\x66\xb4\x81\xc4\x6e\x83\xcd\xd4\x75\x4b\xe3\x7d\x7a\x1c\xb2\xb5\xca\xc5\x35\x9c\x67\xc8\xe2\xc2\xa6\xf3\xde\xc3\x7b\x9c\xcf\x60\x27\xee\xe1\xa5\xbe\x0e\x33\x5e\x49\x13\x2a\xcf\x45\x7e\x6d\x77\xa2\x41\xf1\x38\xd8\x41\x31\x41\x8b\xa1\x6f\x04\x3b\x8d\xbf\x6c\x33\xa6\xd7\x90\x73\x4e\xc6\xa5\x3f\xcd\xdd\x81\x16\x81\xd7\xcd\xe9\x26\xcd\x55\xe4\xb5\x17\x7a\xeb\x7c\x62\x63\x86\x99\x64\x5f\x9f\x6a\xa7\xac\xb7\x98\xd3\xe7\x42\xd8\x84\x67\x7f\x6f\xd8\xa3\x78\x05\xe6\xc0\xf9\xd9\x5f\x29\x46\x47\x38\x5b\x42\x15\x8e\xaf\x39\x3d\x2c\x13\x39\x00\xb2\x9b\x8b\xfb\x74\x66\x93\xc1\x0d\xe4\xf5\x7f\x5a\x00\xac\x68\xdc\xd8\xd7\xae\xc9\xb0\xbe\xc1\xe0\xfd\x81\xf4\x33\xb8\x79\x64\x1a\xea\x43\xab\x73\x65\x67\x28\x51\x32\x02\x46\xaf\x59\xd7\x97\xf1\x23\xd4\xcc\x49\x5e\xa0\xd0\xb2\x07\x56\x28\x4f\xb7\x86\x6b\xa5\xa9\xc0\x3e\xbb\x29\x1f\x56\x0e\x79\xfa\xdc\x26\x08\x1d\xd8\x93\x05\x44\xe1\xe3\x6b\xdd\x83\x8c\x5b\x0b\xab\xa7\x0b\xcf\x1e\x6a\x09\x26\x4f\x6e\x73\x36\x1f\xdb\xcf\x8d\x5b\x1a\xef\xa6\x73\x67\x29\x1c\x13\x74\x7b\xd0\xd9\xbe\xa5\xcd\xc4\x01\xf5\x8e\xe5\xe8\x88\x58\x44\x89\x39\x9d\xa7\xb8\x5b\x0d\x03\x1c\x34\x19\x1e\xe9\xc1\xa1\xf3\x2a\x0f\x5a\x9f\x13\xba\x8d\xa2\xc3\x25\x5b\x2e\x9e\x82\x16\xd7\x6a\xbc\xcc\x35\x5a\x89\xfd\xf7\x85\x26\x01\x84\x6c\x78\x1b\x2f\xf6\x1f\x88\xdf\x81\x61\x47\x55\x21\x9b\x0a\x78\xb9\xb9\xac\xe7\xa4\x07\x94\x28\x06\x84\xd9\x5f\x0e\x22\xc3\x1f\xf5\xd8\xf1\x73\x41\xe8\xac\x8e\xa2\x99\x66\x94\xef\x09\xea\x99\x6d\x76\x40\x54\xd5\x04\x24\xf8\xda\x23\xa8\xaa\xf7\x6a\xac\xda\x10\xf6\xd7\xf6\x99\x64\xad\xf7\x43\x0f\xc6\x0b\xbf\x64\x64\xf8\x86\xb4\xa3\xc5\x98\xc9\x2b\x86\x9c\x5c\x9f\xd7\x86\xba\x29\x42\x59\x97\xd9\x27\x93\x51\x7e\x4c\x29\x1b\x0e\x47\x6f\xb0\x50\x18\x52\x0c\x84\x1f\x3a\xcb\x09\x21\x47\x31\x74\xb6\x28\x3c\xf7\xd7\xa2\x77\xa0\x5d\xf8\x0f\x40\xef\xd4\xb0\x34\xbb\xdb\xd1\x69\xc5\x04\xcd\x57\x84\x54\x9a\x69\xd7\xe7\x84\xb0\xa2\x61\x04\xc9\x62\x1c\x53\xd3\x26\x7d\x8f\xeb\xfd\xc2\x56\x66\xa1\x1f\xc3\x9f\x06\x23\x72\xd1\xa7\xf4\x66\xd3\x7a\x3f\xee\x38\xaf\xbe\xfa\x95\xd9\xbf\x7e\xb3\x7f\x19\x9b\xdb\x62\x64\x73\xab\x27\xc1\xe0\xa9\xe2\x25\x1a\x42\xdb\xba\xa1\x81\xf0\xee\x5d\x7d\x28\xdd\x0d\xe4\xd1\x3f\xec\x56\xc6\xd2\x11\x47\x32\x60\x21\xe8\x9d\x8c\x0b\x42\xc5\xb9\x90\xa2\x8d\x0b\x72\xac\xa5\xef\x33\x0a\x72\x08\x16\x1a\xe2\x3e\xc7\xf8\x80\x16\x07\x01\x74\xc5\x48\xc9\x79\x46\x38\x34\xa8\x07\x99\x7a\x36\xa1\x9e\x6f\xd9\x22\x6f\x2f\xfc\x9a\x0c\x15\xd6\x26\x09\xb9\xb3\x26\x3e\x30\x26\x2f\xd3\xba\xdd\x18\xe7\xf6\xe7\x92\x2d\xe8\x33\x69\x08\x3a\x17\xe2\x22\x20\x0b\x71\xb2\x79\xd5\x16\xbf\x02\x69\xd8\xff\xfe\xcd\x8f\xd6\x0f\x41\x79\xda\xf3\x2d\x6f\x0b\x51\x81\x90\xf5\x83\x68\x18\x6b\xcf\x5f\x7c\xf7\xe3\xcb\x7f\x7d\xf7\xe6\xdd\xb3\x57\xbf\x3f\xfb\xf5\xe5\x5b\x1b\xc2\x0e\xf2\x79\xf1\xeb\xa6\x8a\xfe\xfc\xf5\x8f\xef\x5e\x3e\x37\x05\x57\xca\x15\xcb\xc2\xa8\x77\x7d\x8f\x08\x7d\xf8\x90\x71\x7a\x1f\xc4\x41\xfa\xd9\x1b\x0e\x0c\xcd\x05\x6a\x3e\xff\xf0\x19\x7b\x26\x29\x3f\xbf\xc7\x7f\x3d\x70\x6b\xb3\x5a\xdb\x28\x5a\x2e\x9e\x30\x76\x70\xba\x35\x4f\x19\xb2\x53\xf5\xad\x31\xd5\x7e\x51\x94\x7f\xae\xa6\xc5\x20\xfb\x5a\xc8\x96\x23\x28\x71\x63\x75\x23\xe0\xbe\x6b\x5d\x57\x4f\x57\xe9\x8b\xa2\x86\xdf\xd8\x29\x70\xe1\x93\x05\x70\x1f\x7c\x4a\x27\xe7\x88\x82\x6d\x65\x4e\x6f\x65\x0c\x21\x76\xc4\xf9\x07\x50\x2b\xdd\xd3\x8a\x3d\x93\x39\x44\x62\x3a\xdf\xea\x89\x7f\x0d\xb2\xf4\x58\xda\xdf\xbf\x42\x08\x58\xf8\xf3\x37\x5a\xb1\xa5\x87\x5c\x69\xe4\x2c\x25\x6b\xdc\x35\x4f\xf7\xce\x84\xd4\xc0\xb1\x94\x81\xdd\x86\x09\xb2\x56\x06\x70\x42\xa5\x6f\xb1\xd1\x75\x45\x14\xed\x31\xae\x16\xe8\xac\x6a\xd2\x66\xf6\x94\x5c\x33\x7e\xde\x82\xb6\x8a\xde\x30\xb4\x07\xc8\xaf\x67\xac\xcc\xaf\xd9\xb5\xa7\x2b\x1a\x40\xe7\xde\xf8\xa8\xb9\xe2\x3a\xbe\x59\xdf\x6e\x40\x8d\xc0\xd8\x75\x30\xcd\x63\x9d\xd8\x75\x0e\x32\xd3\xb3\xf6\x88\x1d\x9f\xa9\x28\x9a\xed\xac\x18\xb8\xb2\x7a\x50\xdd\xe5\x28\x02\xdb\x5b\xcf\x11\xc7\x33\xb6\x4d\x8a\xcf\x2a\x42\xe8\x57\x27\x72\x60\xc0\x5b\xc8\x02\x11\x0c\x60\x0a\xa2\xe8\x6d\xab\x57\xeb\xae\x16\xdb\xb8\x09\x2e\x48\x34\xd8\xc2\x29\xb2\x5d\x31\x30\xbf\xc5\x67\x15\xbd\x1f\x19\x10\x3f\x67\xf7\x49\x33\x69\x49\x93\xdf\x5d\x2c\x56\xf7\xbe\xff\xd0\x7d\x72\x97\x3e\x5d\x90\xec\x39\x9b\x94\x6b\xd3\xe7\xc9\x5d\xf2\x74\x41\x68\x8f\x0f\x78\x6f\x2d\x9b\x9f\x1f\xc9\xf1\xb9\x04\x03\x8a\xc5\x6c\xb4\xa5\xe0\xd4\x05\x03\x59\x0d\xc6\x15\xc8\xcf\x9a\xe0\x15\xf0\x47\xd3\xb8\x17\x44\xba\xbf\x7f\x63\xc5\x09\x90\x6e\x67\x29\x1d\xb4\x65\x31\x46\x02\x13\xe6\x20\x07\xe5\x7e\xa3\xc1\xb7\xdf\xa8\xd2\x97\xa4\x6b\x3b\x8a\xf8\xe7\xee\x47\xd7\xb5\xfd\xa7\x5f\xa3\xa8\x75\x9f\x7e\xcd\xc3\xe1\x36\xe3\x77\x4e\xdf\x84\xcf\x24\x8b\x9f\xc9\xcf\x9e\xcb\x44\x91\xcf\xe3\xe7\x32\x59\x12\x9a\x24\xcf\x25\x39\x1e\xe9\x13\x7d\x98\xb3\xd8\xd5\x98\xf8\x53\x90\xb0\x82\x90\xe3\xb1\x5a\x3d\x93\x2c\x3d\x7f\xfa\x45\xa6\xf4\x5f\xcb\xa7\xd9\x16\x53\xfe\xbf\x6c\x8f\xd5\xa7\xcb\xcf\xbf\xc0\x83\xfc\x42\x0e\x5e\x35\x78\x5d\x30\x58\x19\x33\x66\x56\x2e\xa2\x19\xe3\xc7\xfc\x85\xff\x9e\xe9\x2f\x85\xba\x1f\xa3\x35\x9c\x79\xd5\xac\xc3\x4a\x36\x47\x1a\xd4\xc1\xff\x7d\x28\xaa\x66\x64\xa6\xc0\x80\x91\xb6\xa2\x3d\x00\x15\x6f\xfb\x4a\x66\x2c\xac\xb4\xeb\xda\x30\x32\x9b\xc9\x10\xa4\xf5\x72\xc2\x81\x83\xf1\x28\x27\x98\xc7\x59\x13\x2f\x6f\x24\x80\x20\xdd\xf6\xbf\x40\xbb\x52\x70\x67\x80\xe0\x2c\x13\x48\xd7\x61\x3a\x84\x50\x13\xf0\x4f\x6f\x99\x61\x25\x5a\x8b\xc1\x54\x6c\x39\xdf\x3f\xaf\xf7\xf7\xd3\x04\xc2\x7a\x43\x1f\xed\x6f\xbb\xe6\x1b\x50\x40\xbc\x97\x71\xc5\xe3\xb0\xdf\xb6\x5f\x74\xfc\x05\xfb\xe6\x28\x00\xfe\xfe\xec\x05\x98\x2d\x06\x13\x4c\x06\x5d\x6d\xea\x5b\xde\xee\x84\xbc\x79\x6b\x22\x46\x7d\x84\xa8\x09\xbb\xdb\x1a\x51\x77\xb0\x4b\x36\x36\x94\x5d\xbf\xe8\x6e\xc2\xc2\xc6\xcb\x5a\xb6\x85\x90\xcd\x60\xeb\x22\x7e\x4f\x4b\xbc\x08\xbe\x8b\x5c\x4d\xb5\xaf\xec\xf2\x8a\x60\x79\x15\xba\xd4\x03\xa0\xb6\x09\xf0\x42\x2e\xd9\x22\x8a\x24\x07\x73\xa3\xb6\x8e\x09\xb9\x60\x2e\xc4\xaf\x0d\x99\x98\x2e\x91\x08\x7b\x3f\x79\x98\x70\xe6\xed\x61\xd2\xb3\xad\xcf\x51\x1f\xff\x60\x68\x0f\xe2\xeb\x21\x9c\xb8\xa0\x79\x5d\xdc\x03\x5d\x4b\x25\xe3\xba\xa3\x7a\x09\x54\x1b\x87\xed\xb9\x35\x8c\x5b\x1b\xa0\xc6\x46\xaa\x21\x47\x42\x15\xfb\x0b\x11\xc2\x7b\x2f\x99\xe5\xd0\x53\xdd\xd8\x35\xf3\x75\xb1\xa1\x8d\xfe\x27\x5d\x6e\x68\xcd\x24\x07\x57\x97\x98\xd0\xca\x56\x68\x82\x0e\xcf\x2a\xbb\x6e\xab\xfa\x72\x91\xd5\x97\x6c\xe1\x82\x13\xea\x42\xa6\x1f\xae\x18\xdd\xb2\xc6\xab\x0c\xe6\x94\x1e\x58\xe3\x6a\xb1\x39\x19\xab\x60\xb6\xb2\xc6\x25\xe0\xf4\xe5\xc5\x85\xa6\x18\xd3\x54\x51\x7e\xde\xec\xc1\xba\x2b\x4d\x0b\xfa\x84\x9a\xdd\x7f\x58\x6d\xb3\x92\x1e\x56\x65\xb6\x25\x7d\xc0\x42\xb3\xb3\xf5\x54\x7b\xb1\x18\x86\x33\x07\x79\xd6\xa6\xa2\x96\xf2\xae\x6b\xc9\x86\xfa\x71\x44\x3e\xc8\x20\xfc\xbb\xe6\x41\x56\xc2\xce\x38\x30\x15\x49\xeb\x5b\x1f\xa7\x4b\xfa\x43\xdc\x06\xd1\xb3\x93\x78\xa9\xe9\x4f\x2f\xd3\xca\x14\x2f\x77\x99\xbe\xe0\xdb\xf3\xb6\xf6\xa0\xe7\x7b\xf7\x0c\xc9\x7b\xac\xe2\x3e\xd6\x74\x9b\xf7\x9f\xda\xda\xdf\xa2\x1f\x34\xc1\xe7\x1c\x55\xa1\x73\x81\xaf\x73\x1a\x3b\xec\xf7\xd4\x83\x86\x27\x29\x62\x36\x96\x0e\xa7\xb1\x35\xc1\x8d\x5c\xf6\x28\x8a\x45\xc2\xa0\xfe\xf3\x72\x07\x3e\x70\xe7\xe5\x8e\x50\xc1\x21\xb2\x9a\x07\xd2\x3e\x2d\xac\x47\x84\x8b\x71\x48\xcd\x00\xe8\xc2\x8b\x9c\x29\x36\xb9\x11\x94\x9b\xc5\xf9\x97\xe6\xe6\xcc\xbd\xcb\x09\x85\x9f\x70\xdd\x72\xd2\x47\x07\x7f\x6d\xdc\xd1\x15\x7a\xb6\xfa\x17\x5a\x0f\xc7\xed\x4e\xe0\x68\xac\xfa\x5f\xbd\xb8\xca\x46\x36\x80\x91\x96\xbb\x44\xe9\xb1\x66\xee\x4b\x62\x84\xcf\x29\x37\x06\xd9\x3a\xa7\x8f\xbf\x6d\x54\xb7\x9a\x8c\xba\xd5\x94\xe7\xb7\xad\xa7\x9b\xea\xd3\xbf\x83\x14\x42\xbf\x0b\xa5\xcc\xdf\x79\xc5\x47\xf1\xeb\x5b\xcf\x5c\xbd\x0f\x36\x83\xd6\xeb\xe8\xaf\x6a\x70\xd9\x0c\x3e\x01\xfa\x10\xc0\x97\x23\xf1\xda\x76\xc6\xe6\x27\xfc\x42\x82\x90\xc1\x0e\xfa\xd9\x05\x5e\xd1\x55\x7c\xcb\x65\x92\x50\x07\x01\x0f\x12\x73\x0f\xa9\x3b\x3c\x6b\x0b\x66\xc2\x68\x9d\x97\x3b\x30\x8c\x34\x5b\x28\x8a\xe6\x73\xc6\x7e\x88\x71\x9f\x92\x28\x8a\x67\x7a\x09\xf5\x13\x5f\xde\xf6\xb6\xf4\xbb\xba\x02\xa9\x0a\x02\x0f\xa0\x5d\x94\x0f\xd4\xed\xf9\x2d\xf6\xce\x41\xde\xc9\x55\x2b\xb5\x6e\x37\xa8\x4b\xe9\x1d\x76\x20\x74\xb6\x24\x0f\xf1\xd8\xfb\x11\xcf\x2b\xa0\x48\xff\x8f\x27\xdc\xf9\x01\x03\x88\x05\x7c\x86\xbf\xcc\xd7\xaf\x79\xdc\x12\xfa\x92\xf7\x66\x02\x92\x89\x15\xc4\x41\x5f\xe6\x52\x97\xdb\x19\x77\xb1\x7f\xb6\x60\xa4\x01\xd6\xab\x8a\x4a\x2a\x88\x51\xf2\x97\xce\x40\xc2\x9f\x8d\x6a\xe2\x08\x16\xac\xd5\x97\x3f\xc4\xf6\xf3\x4e\xd6\x6f\x3c\x2e\xf5\xe5\x8f\xf2\x90\x9e\x30\x50\x47\x64\xfc\x70\xcd\x20\x4c\x41\x5b\xd3\x92\xe1\x32\xd1\x2d\xfb\xad\x75\xd1\xc3\x09\x46\x60\x6c\x4d\x10\x71\x42\x77\xec\x87\xb8\x24\x74\xcf\x64\x5c\xf6\x31\x92\xe9\x35\x33\x57\x0f\x16\x43\x4d\xfd\xb5\x9e\x8a\xd6\xd8\xbb\xc5\x0b\x5a\x01\xa3\x64\x48\xb8\x1e\xe4\xcf\x55\x44\xd1\x22\x22\x75\x79\x9c\xbd\x8e\xd9\x70\x78\x9d\xdc\x30\xbf\xa2\x74\x49\xf2\x22\x3e\x50\x0c\xb2\x48\xf7\x84\x5e\xeb\x77\xd7\x54\x8d\xdd\xa1\xd7\x84\xde\x38\xc7\x0a\xd7\x23\xf3\xf1\xa6\x8f\xf2\xbe\x65\xec\xa0\xe9\x99\x25\x63\xae\x13\x45\xbc\xa5\xe8\xf6\xe2\x85\x5b\x2f\x77\x24\xd9\x25\x41\x32\x5e\x9a\x7b\x2f\x34\xdc\x2d\xab\xe2\x65\xd0\xd1\xdb\x60\x75\xa6\x2b\xd0\x4b\x45\x4f\x36\x5a\xae\x17\x7a\x45\x31\x40\x53\x30\x8e\x64\x49\x6f\xfb\x91\x7c\xd2\x08\x74\x65\xc9\x61\xdc\x07\x5b\x7f\x30\x89\xc9\x92\x5e\x9b\xc1\x7d\x4a\xef\xf4\x9a\xec\xa6\x2a\xdf\xe3\x79\xb8\x1b\x4d\xce\xf5\xe5\x72\xb4\x72\xba\x51\xbd\xbf\xc6\x63\xbd\x23\xc7\xc7\xce\xc9\x1b\xf7\x14\xcc\x7a\x8c\x82\x58\x50\x49\x3d\x87\xb0\x3f\xf9\x76\xe0\x49\x6a\x93\x7d\x87\x52\x13\x76\xc5\x7e\x5a\x57\x40\x5c\x36\xfa\x0e\x9d\x31\x69\x83\x43\x17\x9a\x55\x6c\x76\x85\xe2\xdb\x17\xa2\x69\x73\x15\x45\xb3\x5a\xd3\xb1\x98\x93\xd6\x84\xb6\xe6\x4f\x41\x6b\x02\xae\xd9\xad\x09\xa7\xec\x13\x25\x3f\xf6\x24\x02\x3f\x2f\x6f\x49\xbb\x53\xf5\x7b\x20\x67\xbe\x56\xaa\x56\xf1\xfc\xdd\x4e\x34\x67\xd6\x02\xf2\x4c\x34\x67\x45\xa5\x78\xb1\xbd\x3f\x13\xf2\xec\xd0\xf0\x73\xf4\x27\xaf\x4b\x06\x2e\xd9\xb7\xac\xa5\x5b\xd0\x77\xc2\xcb\x45\xbf\x32\x88\xf0\xf6\xf6\x75\xb1\x46\xc1\x55\xd5\xfc\x4d\xa7\xad\xef\xba\xee\x17\x1e\x96\x86\x17\x90\x7b\x0f\x1e\x1d\xbc\x14\xd0\xdc\x43\x0c\x01\x41\x2d\xb0\xbd\x6b\x66\xf5\x5d\xf6\x9a\x4c\x58\x85\xfb\x6a\x1a\x5d\xd0\x87\x95\xef\x11\x6f\xb7\xb5\xe4\x10\xe1\x5e\xff\x38\xc8\xd1\xcf\xaf\xf8\xbe\xdd\x01\x96\xa9\xfb\x95\x2d\x3f\x37\x00\xcf\x55\xd1\xb4\xaf\xeb\xed\x3b\x71\x6b\xbc\x37\x75\xc2\x5b\x5e\x41\x82\x97\xe7\xbb\x7d\xf0\xd9\x20\x54\x79\xdf\x95\xb8\x11\x32\xcc\x83\x49\x7d\xbe\x1b\x2e\xb9\x2a\x60\x8e\xe1\xf7\x6d\xf1\xe1\x5b\x2f\x69\xd5\x86\x29\x99\x67\x1e\xf1\x47\x60\x93\x86\x71\x3c\x2a\x1e\xdb\x10\x17\x6d\x9d\x01\xd9\x46\xf5\x21\xcb\xfe\xd1\x3a\x8a\x12\xa9\xc7\xa3\xbd\xf1\xff\x06\xe6\x6a\xd4\x8f\x18\xe4\xa8\xbf\x64\x49\xe8\x9b\xc0\xd5\xac\x7f\x59\x3f\x52\xee\x88\x41\x24\xfa\xee\x7e\xeb\x10\xbb\xf2\xd6\x5d\xb7\x3f\xc4\x2d\x31\xa4\x5f\x4e\xda\xf3\x7d\xbd\xf7\x1d\x96\xff\x1a\xa2\x12\xe8\xa7\x51\x34\x6d\xad\xee\x73\x69\x96\xd5\x54\xc5\x16\x70\x71\x14\xb4\xa2\x4d\xef\x59\x0a\x01\xba\xa4\x5d\x2c\x26\xba\x4e\xfa\x2b\xc3\xf8\x79\x0d\x7f\x81\xe9\xa8\xf9\x2b\x9e\x27\xf3\xfe\x8b\x0d\xcc\xbb\x20\x51\x24\xfd\x9d\x71\xd9\xa4\x40\x73\xae\x02\x7a\xc5\xf4\x0e\xe4\xb2\xe0\x03\x98\x3d\x5d\x2c\x48\xd7\xcd\x3f\x9b\xac\x93\x60\xec\xd2\x49\xf6\x8e\xaf\xe2\x6f\x51\x26\xa7\x9f\xd6\x1f\xec\x5f\x24\xc3\x3f\xdc\x14\xce\xdc\x27\x33\x91\x2b\x97\x10\x66\xd5\x37\xe8\x0c\x53\xd6\xc1\x87\xf4\xc9\xc6\x16\x35\x25\x71\x21\xfc\x46\x31\xf0\xdb\x31\x96\xd4\x9b\x4e\x42\x48\xc5\x7e\x88\x0b\x6b\x65\x4f\xe8\x82\x69\x1e\xd2\xdf\x67\x40\xf3\xf5\x69\x9a\x15\xd4\xcc\x5f\x5b\x23\x53\x91\xb9\xc2\xf8\xfa\x99\x4d\xed\x3d\x94\x35\xfb\x21\x96\xd8\x0d\xe0\x68\x63\x7d\x73\xce\x6a\xd3\x63\x12\x45\x3f\xe9\x59\x6a\x78\x45\x4d\x2e\x5a\xb0\x07\x53\x67\xb6\x36\xf5\x6d\x68\x7f\xd0\x32\xe9\x9d\xba\xa3\x29\x65\x54\x3a\x24\x97\xc1\x94\xc9\xfe\x7e\xc8\x89\xf9\x04\x2a\xaa\x98\x98\x82\xeb\x85\x9d\x3c\xbd\xb9\xfc\x0c\x47\xbf\x66\xa5\xf3\x7b\x87\x3d\x49\x64\x78\xb2\x69\xb0\xbb\x98\x0c\x2e\x9d\xa6\x9f\x75\xe9\x5d\x37\x82\x06\xdb\x59\x0e\x6e\x19\xbb\xdf\x68\x05\x28\x07\x2d\x9d\x9b\xed\xf9\x6c\xbb\xe5\x5b\xff\xe6\xfc\xf2\xf4\x41\xa3\x05\x13\x51\x24\x4c\x55\xb9\x62\x7e\x0f\x40\x86\x3d\x6c\x16\x6c\x78\xc2\xd1\x84\xc3\xb1\x45\x5c\xfe\xae\x3b\x81\x42\x02\x10\x21\xe6\xac\x98\xfb\x0a\x4e\x92\xec\x3a\x38\xa5\x12\x5c\xab\x7c\xc6\x92\x31\x11\x26\xe8\x1c\x23\x31\x56\x4c\x74\xbe\x89\x64\x04\x55\xd3\x57\x47\xea\x66\xc0\xef\xfa\x05\xfb\xe4\x43\x7f\x04\x8f\x33\xb7\x77\xf5\xa6\x5e\x99\x2d\x13\xec\xb1\x74\xb9\x61\x3c\xfb\x49\xc6\xdc\x6d\xe0\x70\xf1\xdd\x6d\x46\x87\x33\x5d\x50\x7f\x37\x28\x2a\xa2\x68\xb6\x9c\xe9\xa1\x81\xbe\xea\x47\xbe\xad\xa3\xe8\x5b\xcd\x31\xe3\x5d\xe9\xad\xf8\x4f\xc1\xe3\xf1\x03\x60\x3d\xf7\x93\x09\x71\xe5\x40\x62\x1b\xb7\xa4\xeb\xb8\xc5\xe2\xec\xcb\xff\x6d\xbc\x54\xeb\x79\xb3\x2f\x64\xf3\xfb\x3c\x69\xcf\xc5\x76\x03\xc1\xc5\x5b\x64\x64\x9d\xde\xa1\xb5\x0e\x9a\xc4\x8f\x15\x84\x36\x9b\x48\xe0\x6b\x1e\xc7\xed\x06\xcd\xac\x9f\xdf\x16\xea\x4f\xbe\x7d\xab\xeb\x8e\xa2\x38\x96\x5d\x17\x8f\x5b\x63\x0f\x47\x42\xd6\xc5\x86\x05\xf9\x09\x4d\x92\xc2\x47\x59\xfc\x77\x6f\x63\x1a\x78\xb7\x39\x51\xb1\x81\x90\xf4\x42\xa2\x2b\xd2\xae\xd5\x06\x6b\x55\xe7\xfc\xc3\xbe\x12\xa5\x68\xab\xfb\xe7\x7a\x8a\xf9\x76\x65\xe4\x91\x8e\xd8\x55\x84\x64\xe0\xf0\x8b\x73\x06\xd8\x93\xee\x4a\xb7\x8b\xbe\x42\xf3\xbe\xcc\xc3\xe6\xfe\x25\x58\x91\x29\x74\xd2\xe1\x98\x41\x2e\xad\x26\xc7\x21\x34\xb5\x63\x51\x2c\xfd\xc8\xf8\x49\x22\x89\xc0\xae\xfd\x5b\xc6\x6a\x2d\x37\x3d\xef\x27\x8e\x88\x9a\x23\xd8\x07\xee\x8c\xdb\xfb\x06\x20\x4a\xdd\x4c\x38\xb1\xe8\x00\x2d\x53\xf9\x4d\x18\x2b\x39\x85\xd6\x98\x62\x2d\x37\x46\x8f\x55\x79\x7a\x3e\x04\x57\xa9\x7c\x70\x95\x87\xde\xe4\xb8\x5a\x37\x1b\x5a\xb2\x45\x5e\xfa\xf8\x2b\xa5\xe6\xc0\x8a\x75\x69\x17\x84\xb1\xda\xfc\xe5\x4c\x33\xcf\xda\xbc\xc0\x11\xd6\x86\xe5\xa9\xc0\x14\x5a\x6e\x58\xe5\x39\xf6\xf5\xf8\xb0\x8e\x1b\x98\x98\xbd\x76\x62\x54\xad\x1d\x8e\x7d\x83\xcc\x84\xaa\xd5\xa4\x9c\x1f\x41\x53\x0b\x92\x15\xde\xab\x56\x31\xf7\xf0\xd1\x86\xad\x37\xb9\xb0\xe6\xa1\xe6\xe5\x6a\x8e\xbd\x00\x17\xed\xaf\xbd\x89\xaa\xad\xec\xb5\xc2\x78\xad\xf8\x3a\x23\xe7\x81\xd5\x00\x35\x58\xe2\x9b\xdb\xd6\x59\xa9\xb9\x78\x20\x04\x11\xb1\xe1\xa8\xef\x23\x07\x05\xa1\xb9\x83\x92\xc4\x5b\x76\x38\xbf\x2d\xda\x72\x17\x7f\xfe\xff\x70\xa3\xc5\xff\xbd\x4d\xc8\xdf\x3e\xd7\x64\xca\x5f\x31\xa7\x68\x46\x11\x6f\xd7\xcb\x0d\x31\x8e\x74\x3f\xc4\x0d\x59\x1f\x36\xe0\xe6\x47\xb7\xbc\xe2\x2d\x3f\xd3\x7f\x6b\x16\xc6\x6d\xab\x1e\xe4\xd4\xbb\x35\x34\x9f\xd5\xbf\x36\x28\xe1\x43\xd0\x5d\x33\xcd\x12\x03\x5d\x5e\x2c\xf2\x62\xa6\x7f\x28\xf8\xb1\xd2\x87\x9f\x72\xa6\x48\x86\xc9\x7a\xe5\x30\xe8\x23\x53\xc4\x97\x02\xbf\x07\x1f\xf3\x61\x92\xea\x3a\x1e\x30\x83\x3f\xb8\x3e\x51\x89\xc1\xfa\xe0\x5d\x89\x21\x6c\xe4\x2d\x86\x95\xbb\x0d\xe3\xfd\x76\x5d\x6b\xfc\xb3\x08\xa1\xaa\xd0\xac\x9a\x91\x28\xff\xc3\xd0\x22\x56\x67\x16\x13\xa8\x5a\x82\x70\x39\x90\x97\xfe\xf3\xd4\xae\xfb\x94\x56\x29\x02\x5f\x4d\x09\x56\x8b\x24\x21\x42\x5f\x84\xae\x2b\x46\xb2\x5a\x6c\x28\x88\xfb\xd1\x2e\x8f\xe4\xd0\x6f\x2b\x38\x15\x23\xc1\x69\x20\x3f\xff\x75\x82\x3e\xf0\x9a\x36\x57\x1f\xc9\xe5\x9a\x6f\x98\xa2\x41\xd5\x72\x5c\xb5\x3f\x0f\x6d\xd1\x57\x0d\xe5\x5e\xa1\xf0\x3e\xc8\xc4\x8b\xa1\x37\xad\x7d\x9b\xf5\xb3\x46\x25\xfb\x21\x16\x24\x97\x9a\xb0\xb0\x84\xac\x58\x0b\xff\x81\xa5\xc2\x56\x41\x32\x65\xff\xf4\xf0\x8c\x5c\x03\x2e\x1f\xfd\x12\x61\x3d\x34\x65\xd9\xbf\xf9\x18\x61\x50\x6c\xb3\x37\xc5\x9b\xa0\x06\x57\xee\x21\x7e\x8e\x51\xab\x41\x56\xf9\x36\xc4\x59\x9c\x13\x14\x70\x46\x91\xce\xa4\xa7\xe7\x54\x3e\x70\x8d\x3a\x01\xd0\xf1\x80\x83\xcc\xb8\x19\xad\xc1\xe8\xce\x02\x4c\x77\x4f\xc3\xbb\xde\x0c\x94\x65\x01\x42\x72\xa8\x1b\xb3\xba\xc5\x2d\x3c\x01\xfa\xe5\xb3\x3a\xc5\x3e\x05\x75\x89\x47\x8a\x34\x61\x06\x84\x03\xfe\xed\xb8\xca\xbb\x47\xe6\x80\x82\xf3\x13\x4e\xc3\xdd\xe3\xd3\x40\x71\x77\x12\x6a\xa9\xba\x19\xb3\x83\x5e\xb9\xbd\x6b\x67\x61\x40\xf9\xa5\x4b\x92\xf1\xa3\x5d\x75\x63\x1a\x03\x7d\xbd\x12\x45\xa3\xa9\x08\xcd\x95\xb8\x83\x8a\x5a\x85\xc1\xe9\xc5\xa1\x5e\x2c\x56\xe9\x32\x5b\x92\x5c\xea\x45\xae\x0a\x63\x0c\x0e\x08\x68\xf1\x4c\x75\x1d\x50\x5d\xd6\x4f\x08\x5c\x56\xf5\xd8\xc2\x88\xf1\xe5\xed\xf9\x0d\x6f\x51\x12\x12\xcf\x6d\xdc\xf8\x39\x89\xa2\x77\x23\xc0\x4c\x68\x87\x93\x07\xee\xa8\x30\xdd\x2d\x0c\xd8\xdf\xf0\x0a\xa4\xd3\xfd\x2d\x81\x7b\xd2\x83\xe9\x64\x4b\xea\x7d\x18\x42\x7d\xb2\xd9\x82\x5e\xe1\xb4\x13\x27\x4f\x0e\xf0\xbe\xe7\x21\xda\x53\x51\x68\xa2\xa9\x1f\xbb\xe1\xb6\x40\x3a\xb5\xf4\x33\x56\xde\x59\x76\xc4\x01\xb5\x40\xd9\xe3\x7b\xca\x6a\x21\xbd\x2b\xaa\x61\x7c\x48\xd0\x4f\xdc\x72\x80\x55\x15\x5c\x6d\x35\xab\xa1\x7f\x56\x55\xd4\x44\x91\xd5\xc9\x42\x7f\x68\x69\xf4\x8c\x8c\xd9\x3c\xab\x3a\x33\x65\x60\xe5\xa1\x04\xfc\xa5\xf3\xe7\x9a\xce\xac\x67\x2e\x33\xe0\x21\x61\x4e\x80\xb1\x44\x22\x74\x70\x01\xd2\x82\x10\x2a\xf5\xe5\x6b\x0e\x51\x4d\xcb\x5e\x49\x25\x57\xfd\x95\xc8\xbd\xeb\x30\xf3\xec\xd8\x9a\xc2\x7f\x8c\xf0\x1d\xfc\x0d\x45\x37\x20\x62\x47\xb2\xc3\xa7\x70\x43\x11\x65\xf0\x6d\x42\x4e\x19\x7c\x5f\x57\x7a\xde\x1a\x43\x3f\xd1\x92\xcd\x71\xab\xbc\xe2\xd7\xed\x5c\xc8\xb3\x7a\x35\xab\xcf\xfb\xa4\xac\x3e\x17\xb2\xac\x0e\x8d\xb8\xe3\x60\xba\xb3\xb5\x05\xc0\x2e\x78\x50\x02\xd2\xfc\x22\x3f\x5a\xcb\x30\x67\x22\x74\x0d\xde\xa2\x71\xb9\xc2\x3f\x2f\x80\xdb\x33\x7a\xe0\x0b\xfd\x37\x5c\x82\x36\x77\x5b\x77\x5d\xbc\x5d\xe9\x3f\x2e\x6d\xce\xb6\xbe\xc4\x7c\xa8\x35\x8d\xa2\xf8\xae\x8d\x6b\x7b\x99\x20\x66\xea\xd7\x12\xfc\xfe\x69\x3d\xa6\xdd\xb1\x58\x38\x9f\x0f\x69\x5a\xe5\x96\x94\x3c\x22\xb8\xa1\xa6\x7b\xeb\xf3\xa2\xad\x6f\x45\xe9\x79\x00\x39\x5a\xe5\xc0\xea\xf3\x6b\x21\xb7\xb1\xb8\x58\xac\x96\x59\xba\x24\x74\xe7\xd1\x64\x90\xbc\xcd\x4a\x3d\x9a\x03\x2b\xf5\x12\x1f\x68\x2a\xe8\x21\x8a\x0e\xa1\x0e\xb2\x00\xae\x80\x90\xf1\x27\x08\x5f\x2f\x79\x7c\xd0\x77\x59\x14\x41\x95\xbb\x8b\x45\xb6\xbb\x5c\x38\x9c\x8e\x06\x6b\x46\x3f\x95\x23\xc2\x25\x78\x1d\xc3\x2b\x0c\xf3\x42\x42\x99\xc1\x5e\xde\x63\x97\xf6\x54\xd0\xfd\x89\xee\xec\x57\x0d\x66\xc1\xba\x51\x9d\xe6\xfc\x9b\xfa\xed\x5b\x4f\x6c\x5f\xd1\x75\xcb\xdc\xef\xa1\xfe\x5e\x50\x49\xba\x6e\x26\xa3\xc8\x4b\x9a\x2d\x48\xd7\xb9\xdf\xe9\x44\x9e\xd4\x64\xd2\xc7\xa8\x90\xed\xd7\x5b\xd1\xea\xdb\x0c\xf5\xf2\xc0\x58\x06\x51\x6a\x4b\x9f\xb6\x30\x74\xbf\x26\x15\x41\x0b\x59\xee\x56\x38\xcc\x4b\x53\x76\x05\x0f\x9c\xc3\x23\x4d\x97\x04\x07\x9a\xa9\xcb\x85\xe6\xe7\xca\x1d\x63\xb1\xe8\x3a\xff\x3c\x92\x40\xbb\x8f\x89\x17\x21\x43\x9b\x2e\x7b\x8c\xd3\x64\x49\x17\xa6\x52\x7d\x43\x0c\xf0\x51\x7d\x72\x62\x5b\x18\xa5\xaf\x0f\x40\xd0\x8f\x13\xf1\xc8\x80\xa6\xd4\x69\x5e\x34\x76\xfa\x93\xef\xb6\x3c\xa0\x9b\x1e\xca\x42\x96\xbc\xc2\xc0\x1e\x18\xf8\xd9\xb1\x08\xdc\xb1\x08\x46\xd7\x67\x5e\x77\x27\x45\xc2\xb2\xd9\xd8\x0a\x4c\x9c\xdb\x6a\xd9\x6c\x71\x74\x24\x00\x42\xf4\x0c\x23\xfd\x00\x39\x4c\x0b\xf2\x80\x58\x41\xba\x75\x86\x94\x05\x01\xf4\xe8\x58\x9c\xb7\x35\xa6\x28\x7d\x9b\x62\x0a\xff\xd0\x32\x89\x46\x92\x67\x8b\x19\x8a\x98\xac\x4c\x8a\x15\xe4\x48\xa8\x4f\x70\x7c\x9c\xce\x18\x93\x17\x76\x08\xab\xf8\xf1\xa7\xf5\x09\x6a\x77\x49\x86\x2c\x96\x70\xf3\x27\xdc\xfc\x89\x60\xfe\x6c\x37\x7d\x17\xef\x9e\xda\xbc\xc6\x77\xd8\xb8\xbd\xda\x16\x1d\x8f\x6d\x1e\x8c\x5d\x41\x4c\x89\xdc\x94\x30\xea\xf8\xe6\xb0\xdf\x2b\xde\x34\xfa\x24\x58\x33\x3a\xb8\xae\x02\x22\xf4\x23\xb4\xa7\x23\x39\x41\x92\x61\xf6\x8c\x26\x6e\xec\xb6\xf9\x9d\xa3\x4d\xec\x34\x35\x6a\x7d\x2d\x8d\xac\xc7\xec\x68\xe5\x54\x74\x43\x64\xa2\xa9\xd7\xcb\xc6\x00\x99\x7c\xbd\x3c\x1c\x36\xff\xf5\xe2\x56\x06\x90\xab\x73\x4b\x4e\x45\x51\x3c\x13\x5d\x97\x2e\x19\xfb\x2b\x16\xf6\xae\xec\xba\x58\x33\x57\x84\x58\x59\xec\xf1\x48\x68\x2f\xc9\x08\x24\x27\x92\xad\xbd\x90\xe8\xea\xb8\x31\xf4\x8b\xe8\xfb\x53\x78\x8f\xae\x40\xa2\xa5\xc2\x6b\x76\x41\x28\xf2\xea\x72\x82\x57\x97\xeb\x1a\x45\x36\x9a\xf0\x04\x86\xbc\xb1\x16\x3e\x5d\x07\x49\xb0\x95\x00\x13\x57\xdf\xea\x0f\x88\xec\xb4\xae\xe9\x72\x43\x0f\xcc\xcf\x81\x1a\x9e\x1d\xeb\x2b\x6a\x6b\x92\xc7\x07\x5d\xd3\xac\x0a\x9f\xe9\x28\x9a\x1d\x48\x14\x6d\xa7\x05\x03\x58\xd7\x91\xd0\x78\x77\x39\x28\xfc\x23\xda\x20\xcc\x76\xc3\xd2\x0d\xec\x74\x14\x2a\x1c\x09\x95\xc6\x3a\xcb\x7a\x2f\xd0\x2d\xa1\x75\xc2\xac\x9a\x34\xfd\xe2\xe8\xa1\x03\x87\x4a\x28\x30\x2e\x23\xfd\xd4\xf7\x2c\x5b\x2e\x2f\xd9\x22\x4f\x53\x49\xf6\x7a\x3f\x9a\xc3\xb6\x96\x9b\xfe\xbc\xe9\x1f\xf6\xc8\xc9\xd5\x7a\x3e\xdf\x9c\xb8\xb9\x8e\xc6\x56\x60\x8f\x54\xb5\x77\x10\x4d\x8a\xde\x97\xcb\x19\x0b\x24\x65\x5d\x37\x9f\xdb\xa4\xf5\x62\xd3\x75\x8b\xd9\x50\xb5\x61\xb7\xa5\x31\x7d\xca\x9d\xba\x6a\x9a\x5d\x24\xf4\xd6\xbe\x47\x46\xbe\x66\x99\x92\xf5\x26\x1f\x68\xd9\x40\x37\xad\xa2\xc8\x6e\x64\xc7\xf0\xea\xfd\xfc\xbc\x88\x7b\xf1\x3c\xd7\x97\x17\x8a\x1a\x5d\x1e\xd7\x12\xd0\xe8\xb6\xb1\xa3\x3f\xf2\xeb\x11\x47\x5d\xde\x22\xdf\x32\x75\xb3\xa0\xe4\xaf\xeb\x54\x48\xd7\xf7\xbd\xa8\x90\x4a\xa7\x0d\x9b\x1f\xe4\xb6\x9e\x33\xc6\x57\x05\x30\xe7\x59\x61\x84\xcf\xb4\x0e\xbe\x61\x62\x86\x99\x8c\x9c\xaf\x27\xef\x63\xc9\x9a\x75\xb9\xa1\xb3\x58\xad\xa4\x13\x4a\xcf\x64\xc8\x0f\x65\x33\xfb\x8d\x90\xbc\x4c\x12\x44\xe3\x98\x31\x67\x0a\x0c\xbd\x2d\x7c\x65\x43\x31\xa1\x89\xcd\x73\xbc\x7f\x75\xa3\xa8\xf9\xb2\xaa\x34\x23\xa5\xb2\x3c\xad\x7e\x7d\x8c\x80\x4d\x92\xdc\xd1\x86\x3f\xc9\x58\xd2\x1a\x5e\xaf\x61\x0f\x83\xa2\x28\x29\xa2\x0f\x4e\x38\x9f\xcd\x96\x47\x92\x57\x4c\x1e\xcd\x51\xdf\xe4\x3f\xc9\xb8\xd2\x75\xd5\x03\x71\xe0\xd6\x57\x60\x15\xbe\x02\x0b\xdc\x25\x7b\xc5\x92\xaf\x65\xea\xba\x24\x29\x42\x35\x93\x87\xff\xfa\x3f\x78\x21\xa8\xe7\xd5\xd4\xdf\xff\x56\x90\x69\x2c\x6b\xdd\xbb\xcc\x35\x19\x3b\x83\xf7\x44\x00\xa7\x68\xa9\x40\xa7\xb3\xa5\x0f\xc7\x7c\xeb\x29\xfe\x84\x39\x12\x05\x53\xab\xaf\x31\x21\xfb\x21\x6e\x48\x7e\x8b\x95\x14\xf4\x17\x93\x8d\xce\x94\x65\xb3\x71\xd3\x86\x00\xf8\xc3\xc7\xf9\x83\x8c\x05\x39\x62\xe5\xd5\xd4\x79\xe3\xe4\x61\xc6\xed\x79\xab\x1e\x39\x6f\x82\xd0\xea\xc4\x79\xc3\x48\x81\xae\x8b\x47\x72\xa4\xfb\x7e\x76\xfa\xab\x6d\x8f\x57\xdb\x9e\x18\x04\xb0\x5d\xbc\x87\x9d\x7b\x6d\x27\xe8\xfa\xfc\xee\xe8\x43\x39\xdf\xf4\xd7\xd4\xc2\x86\xe4\x47\x12\x13\xed\xd4\x78\xc5\x8c\x00\xf2\x9f\x81\xcc\x6f\x4a\x6d\x6f\x38\x53\x20\x1b\x91\xb5\x35\xf6\xa2\x0e\xb4\xca\xda\x77\xb6\xc0\xed\xf6\x5f\xe1\x97\x66\xb6\x8e\x64\x2c\xd2\x43\x69\xc2\xc3\x5e\xd8\xb8\x40\x48\x8e\x9b\x7f\x53\xee\x47\x4d\x55\xcc\x17\x6e\x42\xe0\x0a\xeb\xee\x09\xc8\x04\xe8\xf0\x09\x26\xa2\xd7\xc2\xca\x27\x1d\x80\x9b\x37\x2f\xb7\x45\x20\x4e\xc6\xed\xf0\x08\x19\x75\x6b\xc9\x28\xcd\xe0\x9b\x60\x17\x01\xc9\x4e\x70\xa6\x43\xbb\xde\x53\xc6\xb3\xbd\x05\xda\x2c\xf6\xd2\x2f\x03\x72\xdc\xd8\xea\xf4\x21\xa2\x6c\x4b\x4e\xc1\x39\x68\xcb\xcd\x98\xd7\x52\x0e\xdd\x92\x84\x72\x63\xe6\x11\x30\x3c\xf0\x18\xf2\xbe\x93\x89\xa4\xce\x4c\x17\x1e\xc7\xb5\xb3\xb2\xdc\x8c\x9e\xc6\xa3\x51\x69\x78\x7d\xce\x5d\x4d\x97\x05\x08\x21\x1f\x06\x9c\x82\xe0\x71\x41\x81\x0b\x2a\x02\xfe\xc7\x36\xe7\x1e\xcd\x71\x73\x84\x5a\x68\xc1\x2d\x1b\x99\xa4\x50\xd5\x75\xb1\x7b\x4e\x71\x4f\xad\x4e\xc2\x29\xd6\x25\x08\xcb\xed\x2e\x2a\xac\xc9\x62\x85\x26\x8b\xe0\xf4\x5a\x1b\xe7\xd8\xfc\x94\xcd\x52\x5c\xb3\x5f\xdb\xf8\x0f\x80\x01\x15\xc6\xd9\x16\x91\x43\x81\x96\xad\x69\x75\x8a\x8c\x65\x4c\x5a\xaf\x57\x77\xaf\x31\x88\xec\x72\x84\xf2\xfa\x7c\x58\x0f\x86\x80\x6a\x00\xbd\xc9\x55\x1b\xb7\x84\x7e\x2f\x63\x01\xdb\xb1\xc4\x90\xbe\x27\x7b\xe9\xba\x53\x4c\x18\x77\xd3\x71\x70\xb8\x7f\xf3\xb8\x25\x39\xbf\x94\xa1\xab\x2e\xe8\xe5\xad\x2f\x6f\x4b\x07\x5f\x19\xef\x53\x3c\x51\xa1\x9e\x48\x7d\xe4\xd1\xcc\xd5\x67\x88\x4c\x88\x35\x8c\x04\x31\x0a\x5f\xd3\x4e\x61\x5b\x83\xba\x37\xc0\xb6\xe6\x84\xce\xe0\x2a\x1d\xe2\xd3\xf3\x74\xa9\x89\x60\xff\xd2\xc0\x1d\x2f\x18\x4f\x97\xb9\xb8\x54\xb9\x48\x53\x7b\x8e\x60\x3b\x0a\xe2\x19\xe9\x1a\x27\x44\xfd\xac\x9f\x09\xd9\xb4\x9a\xbf\xab\xaf\xcf\x76\x9c\x74\x9d\x48\xe4\x79\x55\xd7\x7f\x3e\xd3\x77\xda\x05\x27\xe4\x41\x31\x91\x2c\xcd\x93\x7e\x9c\xe8\x8e\xdf\xff\xd1\x47\x0a\xd1\x0d\xdd\xfe\xe9\xe1\xef\x0c\x74\xc3\xc0\x16\x1f\xf7\x54\x5a\x58\x1b\xfc\x1c\xad\x61\x57\x60\x1e\x97\x61\xf2\x8c\x61\xae\xae\x1b\x13\xa6\x7f\x1a\x57\x3d\xca\x09\x94\x31\xed\xf6\x7b\xb5\x24\xd9\xb5\x97\x6e\x70\xbf\x0d\x52\x2c\x3e\xfb\x36\x92\x04\xa1\x87\x20\x05\x03\x60\x1c\xba\x6e\x6b\x01\x3c\xf1\xf4\x17\xfa\xe0\x57\x81\x7c\xc0\x9c\xe3\xcc\x9d\xe8\xd1\x69\xcf\x0f\x51\x34\xb4\xc3\xdc\x01\xba\x81\xdb\x49\x7d\x10\x0b\x94\xea\x0c\x12\x3d\xae\x6d\x47\x8e\x9e\x2f\xec\xa4\x6f\xf8\x11\xaf\x79\xae\xc9\x06\x63\x19\xae\x79\x7b\x34\xf7\xfe\x09\x2e\x14\x23\x35\x8a\x22\x10\x55\x4d\x08\x54\x10\xb7\xb2\x97\x2e\x2d\xfd\x07\xe7\x6e\x2c\xdf\xca\x91\xbb\x54\x84\x4a\x0e\x1c\x27\xe8\x22\x15\x8b\x0b\xb6\x16\x54\x6d\xc8\x7a\xb1\xa1\x82\x15\xeb\xe5\x86\x50\x0b\x47\xc4\x2c\x1c\x11\x37\xee\xd5\x9a\x83\x82\x3e\x34\xb1\xbe\xf9\x76\x3d\xcf\xa3\xe0\xc6\x35\x13\x6f\x67\x58\xfa\x36\x0d\xf7\xbe\x94\xeb\x02\x3d\x14\x56\xc6\x0b\x84\x89\x8c\x9b\x24\x07\xac\x83\xda\x83\x1d\xf3\x0d\x4b\xaf\xa6\x24\xf7\x8f\x2a\xc0\x69\xc5\xd0\x5f\xcf\x69\xc1\x1f\x8a\xf3\xb2\xde\x0b\xbe\xed\xba\x38\xc6\x4c\xac\x70\x5a\x70\x4d\x54\xe3\x67\x7d\x5f\xe4\xc3\x00\x2b\xa1\x72\xa0\x49\x12\x72\x5f\xb8\xaa\xd7\xcd\xc6\xb9\x80\xa0\x34\x7f\xf0\x11\x1d\x42\xe0\x13\x42\xab\x86\x9a\xf3\x62\x40\x83\xf9\x5c\xb9\xfb\x66\xb8\x73\x75\x51\x7a\x2f\x2f\xfe\xcd\x84\xe5\xbd\x71\x56\x05\x2d\xad\x4b\x03\xa1\x9a\x0b\xc6\x0c\xf6\xfd\x15\x90\xa6\x3f\x3a\x0a\x81\x5f\x30\xf7\x9d\x3c\x54\x6c\xe6\xee\x9a\x0a\x95\x3a\x7b\xa3\x41\x00\x37\x50\xa9\xd7\xc6\xdb\x76\xcf\x8b\xc0\x0c\xc4\xb3\xb8\x14\xbd\xa7\x0e\x1d\x12\x13\xb1\x48\x95\xbe\x5d\xf4\xda\x22\x97\x85\xfb\x96\x42\x82\x61\xca\x30\xa9\x6f\xea\x59\x31\xb2\xeb\xd1\x4f\xab\x35\xbe\x42\xa0\x26\x6f\xff\xae\x8c\x7e\xa2\x34\x4c\x66\x26\xf5\x83\xca\x2d\x50\x80\x5c\x81\xb0\x33\x16\x71\x41\xa5\x53\x8c\x59\xaa\x0e\x82\xde\x15\x5e\xeb\x6f\x0b\x67\xc1\x0b\x60\x36\xce\x37\x15\x9c\xbe\x43\x1c\x2b\xce\x16\x27\x8d\x75\x4c\x7e\x88\x95\xc2\x13\xd6\xa2\xd2\x12\x14\x10\xc6\x3d\x0f\x51\x08\x3d\xd0\x81\xbe\xe5\x72\x27\xaa\xad\xe2\x92\xb5\xc3\xb6\x9c\x3f\xd3\x18\x3b\xab\x5d\x8b\x4d\xce\x13\x20\xf7\x0f\xf2\xcf\xb7\xe2\x2f\x7d\x9d\x28\x9d\x60\x1c\xaa\xa5\xdf\xab\x23\xb4\xd4\x88\xbf\xb8\x8d\xaa\x60\x71\x59\x47\x03\x3e\xbe\x0f\xb0\x25\xf4\x76\x1c\x8b\x60\x6b\xe3\xef\x69\x4e\x89\xf3\x41\x24\x47\x1a\x14\x6f\xeb\x89\xc2\xcd\x27\x16\x06\xd7\xbd\x53\x5e\xc0\x8e\x57\x40\x97\x5e\x9f\xb7\x30\xd8\x19\x86\x7f\x08\xbf\x97\xbb\x23\x7d\x5b\xf4\x8d\xb0\x07\x37\x7f\x13\x92\xe6\x7e\x67\x98\x25\x38\x9a\x57\x08\xe0\x50\xb2\x90\x06\xf1\x28\x07\x2a\x58\x9b\xf0\x5c\x5d\x08\xd8\x23\x76\xcd\x5c\x6d\x9a\x73\xf5\x56\x21\xed\x57\xed\x1f\x3c\x96\xa0\x24\x95\x74\x8e\xe6\x2d\x73\x72\xf4\xba\x61\x0e\x2e\xc6\x12\xb7\x20\xbf\x59\xe8\xb8\xa5\x9f\x2f\x17\xdd\xa8\x2f\x4b\x8e\x14\xfd\x16\xc6\x9d\xd7\x84\xae\xd7\x9f\xc4\x6e\x0b\x73\x28\xbc\xe6\xcd\xb5\xd1\x3a\x54\x7e\xee\xfe\x1a\x65\x6b\xc9\xc9\x28\xc8\x7a\x27\xf3\xb5\x08\x4e\xce\x91\x6a\xa2\xf3\xcd\xa8\x63\x7d\x15\x7a\x4e\x5b\x98\xd3\x96\xe8\xab\xd3\x6b\x72\xdd\x6e\x7a\x0f\xdf\xe3\x91\xfe\xfc\x9f\xad\x31\xe0\x5d\x3f\xb2\xb6\x2e\x53\xca\xf8\x94\x23\xb0\x3d\xc3\xfe\xcd\xe0\xbb\x02\xdb\xef\x6b\xb5\x01\x9c\x0c\xef\xd0\x82\x28\xfb\xc2\xbd\x75\x7d\x64\x21\x2a\x53\x88\x60\x21\xec\x55\x02\xb2\x0e\xaf\x8f\xc0\x10\xd1\x60\x1f\x55\xa9\x70\xe7\xdf\x80\xdb\x05\xdd\x33\xdb\x47\xa5\x29\x5d\x82\x20\xaf\x3f\xf7\x60\x4c\x1d\xf3\x94\x15\x16\xd2\xb7\x65\x0b\xb4\x67\xd3\x1b\xf4\x68\x43\x5d\xc1\x2c\xf0\x8b\x27\x4f\x47\x95\x5b\xb3\xef\xae\x9b\x85\x5f\xd6\x8b\x8d\x47\x11\xbf\x2d\xac\xa4\x1f\x2c\x45\x30\xa7\x85\xab\x6e\xcc\x80\xdc\xa5\x08\x4e\xb3\x6f\x8b\xb8\x21\x1b\x3a\xac\x34\xd8\x3d\x27\x8e\xc3\x84\x53\xfe\x78\xb1\x38\x09\xab\xe6\x9b\xbe\x47\xed\xa7\x9c\x1b\x3d\x29\x09\xe3\xce\x77\x2c\x38\x4b\xc3\x00\xec\xd3\x7d\x10\xc1\x35\xe1\xba\x62\x21\x12\x87\x1b\xc6\x40\x44\xca\x73\xaf\x6f\xd6\x92\x08\x41\x88\x1a\xb0\x7b\xf6\x2e\xaf\xcb\xa7\x8b\x7e\x3e\x2a\x16\x7e\xfc\xaf\x27\x4f\x93\x27\x4f\x69\xc3\xaa\xbc\xb9\x08\x3f\xe5\xd6\xad\xc8\x2c\x85\x0c\x4e\x79\x43\x9b\x84\x3d\x79\x4a\x48\x2e\xdd\x36\xac\xed\x26\x9c\xdc\x7d\x49\x22\xe8\xc2\x08\x1d\xbd\x05\x34\xd5\x32\x39\xb8\x6b\x2a\xb3\x25\x20\x00\xdf\xdb\xbd\xa8\xaa\x98\x18\x45\x79\x9b\xb2\xe2\x78\xa4\xfd\x97\x2c\x44\xe8\x98\x4d\xee\xd0\x0b\xb6\xb4\xea\x0e\x6c\x3a\xdf\xd6\x86\x91\xd5\x23\xd4\x4f\xf3\xa8\xcf\xed\xb0\x92\xf4\x29\x7d\x4a\x8c\x7a\x0c\x47\x61\x41\x94\x53\xe6\x82\x81\xd9\xf9\xb0\x38\xc4\xc6\x65\xfa\x2f\x57\xc6\xd5\x4a\x5b\x08\xec\x1b\x26\xba\xe3\x9a\x2c\xe9\x42\xdf\xf8\xce\x9c\x53\x8c\x7b\x4a\x72\x77\x9c\x5b\xda\x7a\x07\x48\x50\xbe\xa1\x2d\x13\x47\xee\xbe\x9b\x3f\x4c\x34\xfd\xd1\xd8\x2e\x97\x0b\xaf\x37\xc1\xbc\x7f\xfc\x92\xfe\xdf\xdb\xe2\x85\x35\xd8\xf1\xee\xc4\x22\xc5\xa8\x27\x12\x24\x14\x6f\xe2\x96\x56\x54\x91\x00\xd0\xc3\x5c\x63\xd5\xd4\x35\x56\x1c\x8f\x08\xaa\xf0\x7b\x31\xb2\x75\x03\xfb\x0a\x37\x8e\x33\x21\xcf\x14\x51\xe7\xbb\xa2\xf9\xee\xbd\xfc\x5e\xd5\x7b\xae\xda\xfb\x58\x10\x73\xed\xad\xc5\x06\x00\x4c\x49\x6e\x1c\xc0\x4a\x4b\x3c\x02\x06\x90\x8f\xc5\xf0\xc2\xe9\x3e\xfe\xc6\x63\x4e\x2e\x62\xe7\xca\x6c\x19\xd0\x20\xf4\x7b\x80\xb1\x43\xa2\xe8\x25\x06\x98\x39\xfe\x5e\xf8\x60\x15\x15\x2f\x94\x4f\x1b\xf5\xbb\x19\x2a\xd0\x6c\x69\xff\x70\x9f\xbf\x47\x60\x36\xaa\xfa\x34\x2a\x34\xe5\x8c\x1a\x5e\xf4\x1f\x16\x51\xc4\x87\xec\x18\xf7\xd9\x31\xae\x59\x2c\xa8\x01\xe2\xfd\xe3\xe6\x94\xf0\x96\xe4\xdc\x89\x0b\x62\x65\x9b\x33\x88\x42\xf8\xb0\xfd\xac\x4c\xf4\xc3\x7f\xb6\xb1\xa2\x41\x64\x71\x73\x4c\x0a\x82\x10\x7e\xc3\x60\x63\x2f\x90\xa1\x4e\x0b\x42\x41\xcc\x20\xe8\x1c\x1b\x98\x93\xa3\x35\x28\x03\x01\x16\x24\x1a\x5b\x1b\x00\x73\xd7\xf4\xb8\x20\x7a\xd7\x86\x93\x67\xa4\x4d\x93\xd3\x67\xe7\xcd\xdc\x60\x2a\x98\x53\xd1\xcf\x5f\x40\xd9\xbb\x90\x35\xd2\x8d\x33\xe5\xf9\x4c\x76\x5d\xfc\xa5\xa1\x76\xc1\xd9\x92\x74\xdd\x3f\xdb\x58\x50\xfb\x4a\x27\x12\xd4\x38\x5c\xc6\xca\x1f\xb1\x32\xfb\xc2\x8b\x98\xcf\x66\x0b\xfa\xa2\x88\x0d\x4b\xb5\x55\xb1\x0a\x06\x6d\xe1\xd7\x15\x6d\xe9\xaf\x6d\x0c\xea\x00\x72\xa4\xcf\xda\xf8\xf7\x02\x57\xe0\x7d\xc1\x16\xf4\xf5\xd0\xf9\xcb\x23\xf3\xac\xbf\x22\x90\x4c\x86\x4b\xf0\xb6\xb5\xd8\xb2\x24\x79\x5f\x78\xfb\xfa\x55\x20\x9d\x40\xdc\x0e\x61\xdc\x4e\xc9\x30\x3c\xa5\x97\x33\x16\xec\x1b\xdd\x43\x93\x95\x19\x88\xed\x82\xad\x83\x1a\x35\xcb\x5f\xac\x17\x1b\xda\x30\x61\x76\xd4\x9b\x7a\x6b\x59\xc3\xb3\x91\x9f\x20\xc6\x35\xec\x33\xb2\xe6\xbc\xac\x6a\xc9\x21\x50\x0a\xc8\x0c\x8d\x99\x3e\xb4\x62\x6c\x40\xa8\xb1\xfc\x80\x16\x87\x16\xf0\xed\xc8\x01\xb7\x26\x70\xe1\x1b\xe7\xdb\x7a\x73\x2e\x9a\xef\xf1\xf2\xc7\x5e\xe5\xe0\x9f\xa6\xb7\xa5\xbe\x9f\x3f\x14\x71\x41\x31\x72\x8a\x1d\x54\xfe\x29\x7a\x83\x57\xbd\xde\x40\x17\xb1\xe6\xe9\xef\xcf\x5e\x1b\xb9\x7c\x65\x0d\xd1\x0d\x5a\xca\x37\xb1\xa0\x05\x9d\x2d\x09\xad\x2e\x17\x5d\xb7\x60\xac\x32\xae\x39\x05\xde\x14\xbf\xec\xb8\xfc\x5a\xb3\x53\x0e\x5b\xcc\x88\x52\xf8\xbe\x2a\x4a\xbe\xfd\x45\x80\xb4\xb6\x70\x64\x0f\x88\x62\x0b\x7f\x36\xbf\x8e\xc1\x1b\x04\x80\x46\xfd\x62\x21\x92\xa9\x3d\x98\x7a\x87\x17\x72\x5b\xf1\xd7\xf5\xa1\xe1\x88\x1b\xd7\x75\x7e\x85\x63\x0c\x60\x71\x23\x6b\xc5\x53\x04\x21\xec\x51\x80\x85\x21\x71\x4c\xf4\xe0\xa0\x8e\xfe\x0b\x33\x2b\xec\x06\x00\x3b\xf2\x1b\xee\x6c\xa7\xd0\xe8\x0b\xbc\x8b\x50\xe0\x69\x99\x45\xc8\xa3\xfc\x3c\x63\x3f\xe7\x97\xd0\x8e\x90\x37\x67\xae\xfe\x33\x34\x06\x39\xdb\x17\xaa\x15\x45\x55\xdd\x9f\xd5\x77\x5c\x55\x28\x43\x3f\x2b\xe4\x19\xff\x20\x1a\x28\x82\xa8\xba\x2f\xf4\x11\x3e\x16\xe7\xc5\x76\xfb\xae\x7e\x81\x9a\xbc\x28\x02\x1d\xbe\x6f\x00\x62\x45\x6e\x73\x5d\xfd\x3b\xfe\xa1\x9d\x1f\x8d\x01\xec\x9b\xe2\x8d\x81\xc9\x03\x98\x04\xe8\x6f\x09\xaa\x2d\xcf\x1a\xa6\x9e\x30\x84\x11\xe4\xa1\x8c\x22\x6f\x6a\xa2\x68\x56\x9e\x08\x69\xf2\x07\x8f\x05\x61\xac\xec\xe3\x91\xa1\xd0\x3d\x8a\xe2\x06\x30\x56\x83\x6a\xea\x99\x33\x17\x84\x6b\x6d\x71\x2a\x1c\x95\x8a\x22\x13\xb9\xeb\x17\x5e\xfc\xf9\x96\xb7\x10\xf4\xc5\xb3\xae\x81\x67\xc3\xfb\x0d\xdb\xdd\xe4\xd5\x64\x96\x7e\x2b\x03\xc7\x2c\xbd\xbf\x9a\x81\x75\xcf\x2a\x34\xe8\x81\xc3\xce\x49\x16\xe6\x0a\xad\x7a\x06\x45\x0c\x2b\xbb\xe6\x1b\x92\x01\x2e\x97\x6e\xa8\xd8\x6e\x07\x0d\x11\xca\xad\x83\x56\xd1\xb6\x45\xb9\x03\x71\x6e\x4b\x8e\xb1\x40\xb4\x20\x1e\x17\xb4\x76\x76\x8d\x60\x3d\x6a\x42\xb1\x9a\x6d\xb7\x52\x36\xcd\x5a\x8c\x79\xd7\x01\x4d\x92\xfa\x38\x98\xea\x8f\x59\x3b\x71\xf2\xf0\x25\x37\xd0\xa1\xff\x6c\x63\x4e\x17\x04\xab\xd0\xc7\xff\x3b\x09\x56\xa9\x51\x74\xdd\xc6\xc5\x94\xb9\x2a\x1d\xf3\xc5\xa6\x68\x8c\xd5\x78\x06\x4f\xbf\xc3\x5b\x14\x87\x3e\x11\xee\xf5\xef\x93\x03\x7f\x69\x94\xc5\xe9\x0a\xcd\xd6\x8f\xc9\x60\x80\x71\x61\x9f\x18\x5a\x18\xdb\x57\xd8\x70\x25\x1c\x64\x7d\xb9\x97\xa7\xb4\x41\xc1\xb1\xdf\x8b\xb8\xa4\x83\x69\xea\x05\xa3\x1e\xfe\xbe\xbe\x8e\x9a\xb6\x50\xed\xdb\xf6\xbe\x82\x5f\x5c\x6e\xdd\xdf\x65\x03\xf7\x55\x61\x6f\x28\xf8\xd5\x8a\xb6\xea\xfd\x98\xb6\x66\x7d\xf3\xed\x85\x59\xd5\x7c\x8b\x3a\xe4\x92\x6e\x9d\x16\xc4\x0e\x26\x8a\x8a\x22\x2e\xf5\x8b\x0a\xcf\x77\x49\xe7\xb8\x83\xd0\x39\x96\x96\xb4\x70\x96\xdb\xc5\xf1\xf5\xa3\xb4\x9e\x03\x39\x1b\x5b\x18\x4f\xd3\x81\xf8\xda\xe8\xc9\x03\x35\x74\x14\x41\x38\x6c\xfa\x1c\x85\x36\x74\x0e\x2d\xcc\x49\x00\x4e\x07\x06\x66\xe0\xa5\xb9\x55\x41\x36\xaa\x50\xbb\xa8\xc0\xad\xbf\x27\xfc\xd1\xd1\xc7\x20\xe4\xa2\xbf\xd0\x50\x7c\x06\xc6\x6c\x86\xa8\xf7\x64\x37\x60\xd2\xf6\x9a\xc7\x95\x7f\xc8\x28\x52\x8b\xd0\x77\x5f\x44\xb0\x5d\x01\x11\xf8\x6b\x1b\x57\xc4\x4e\x72\xd6\x1a\xc3\xed\x19\x18\x6e\x83\x3d\x0f\x64\xb0\xd0\x38\x68\x76\xa6\x09\x04\x93\x4e\x68\xd0\x18\x7b\x35\x6c\xbd\xb1\x22\x65\x5b\x34\xec\x44\x14\xcd\x7c\xc2\x0e\x9c\x30\xe0\xe0\x55\xb4\xf0\x42\x2f\x11\x72\x34\x31\xcd\x86\xa5\xa7\x75\xaf\x83\x10\x28\x53\x13\xe8\x34\x09\x7f\x70\x5f\xfe\x55\x6f\x08\xdd\xb2\x7f\xf3\xb8\x24\xf9\xf6\xb2\x1d\xde\xdf\x4e\x21\x3b\xfa\xc2\x4a\x7a\x22\x37\xdb\x8e\xbf\xf4\x8a\x5a\x72\x74\x5c\xc3\xc4\xf8\xf6\x48\xa8\x83\x7a\x61\x34\x0a\x0b\x6a\x31\xda\xbe\xfa\x62\x41\x69\xad\x39\x32\xfd\x3e\x76\x8a\xb4\x78\x94\xc6\x66\x4b\xcd\x37\x14\xa8\x77\x28\x91\x8b\x40\xb6\x00\x8f\xd8\x88\x25\x00\xdb\x86\x28\xfa\xad\x0f\xca\x8b\xbc\xae\x69\xd0\xb2\xe1\xe6\xfe\x3b\xd2\xe0\x38\xea\x83\x31\xa0\xa2\x0d\xf4\x6f\x14\xcd\xaf\xea\xfa\x4f\xdd\xe8\xdc\x88\x9d\x75\x09\xdd\x67\xb6\xf4\xec\x51\x74\x07\x50\xd9\x35\xb1\xbe\x41\xc8\x07\xb3\xb8\xa0\xfe\x7a\xcd\x43\xd7\x01\x73\x40\x1c\xfb\x56\xd9\x3d\xae\x98\xe0\x31\x5f\x15\xd9\xaf\x6d\x5c\x58\x8c\x3c\x42\xd3\x25\x63\x2e\x10\xef\x99\xf2\x0b\xc2\x91\x11\xc3\x62\x6d\x4d\x68\x50\x46\x1c\x7b\x53\x6b\x5f\x5b\x38\x9c\xa1\x4f\xe2\xaf\xe0\x7e\x49\x97\x08\xdb\x81\x5f\x84\x7f\x6f\xe5\x10\x29\x54\x74\x1d\x97\xb1\xa0\x83\xaa\xa4\x25\x80\x0a\x50\xff\x58\x3d\x38\x7b\xa7\x34\x25\x0c\x93\x52\x45\x51\xfc\x8d\xd2\x97\x84\x38\xe5\x98\x24\x26\xd9\xac\xbe\xc0\xf0\xa1\xa1\xfa\xcc\x2b\x34\x05\x21\x7d\xd4\x36\x64\xe5\xac\x48\xd3\xfe\xce\xd5\x88\x39\xac\x35\x73\xa8\x48\xda\xe4\x35\xdc\x15\x92\x5a\x91\x59\x52\x03\x82\x90\x70\x3b\xd6\xf2\x73\x82\xb6\x60\xd8\x15\xcc\x6f\x4f\x73\x0c\x01\x4e\x67\xa3\x1d\xe5\x9f\xa1\x5b\x87\xda\xdd\x27\x99\x67\x21\x9e\x71\x14\xf4\x60\x70\xe9\xd7\xd0\x8b\xc6\x5a\x36\x4f\x7d\xc3\xed\x87\x11\xd5\xe0\xeb\x4f\x72\x17\x96\x3d\xf1\xc1\xd3\xb1\x43\x15\xbe\x7a\xc3\xfa\xfd\x87\xe3\xdd\xf2\x53\xe3\x1d\x6b\x46\xfe\xf2\xd2\x68\x4b\xe8\x92\xd0\xff\xf9\xa4\x4c\xcf\xc9\x64\xf2\x68\x54\xc0\x7c\xbf\x36\xcc\xf7\x87\x49\xbe\xfb\xd6\x14\xf5\x60\x51\x0b\x75\x3f\xd6\x30\x3c\xa6\x6f\xf4\xf8\xf1\x7f\x15\x01\x84\xa4\x3e\x60\xba\x73\x4d\x3c\x30\xdf\xc2\x90\x0e\xb5\x49\xf7\x8d\xc7\xa6\x0c\xf8\x9c\xb0\xd0\x07\x5f\x2c\x42\xd1\xba\x4f\x85\x1a\x12\x02\x51\x6d\xd7\xca\x8e\x4a\xcf\x2c\x98\x41\x06\x29\x53\x0d\x0a\xb7\x0b\xc8\xc8\xe5\xdf\xcc\xd8\x44\x20\x26\xf7\x6d\x2d\x37\xb9\x35\x63\x2e\xe0\x3d\x00\xda\xd2\xd3\x74\xd0\xbe\x9e\x40\x86\xa5\xd7\x6c\x30\xe3\x2a\x49\x08\x8f\x15\x39\x7e\xf8\x1f\x13\x64\x27\x5f\xba\x7c\x02\xd0\x76\x30\xbe\x24\x69\x89\x9f\xbe\x6e\x37\xf6\x55\xca\x07\x54\x99\xee\xfc\x87\x8f\x3c\x53\xbe\xc6\xcb\x2e\x02\x5c\xc3\xa8\x4e\x7c\xd6\xc6\x1f\xcc\x7e\x7d\x59\xb0\x05\x7d\x37\x94\x91\x3a\x41\x0f\xca\xd5\x7d\x33\xa7\x77\x45\x1f\xbe\x99\xbf\x3f\x7b\xe7\x0b\x72\x72\x1f\x8e\x7f\x41\xe8\xcf\x05\x42\x14\x40\xf7\xad\x7e\x67\x6d\x70\xe8\xe6\x18\x7c\x85\x6c\xc8\xc6\x06\xd3\xd7\x1b\xd7\x6a\x24\x9d\x60\x94\x79\x3f\x81\xff\x37\x94\x43\x40\x14\x40\x42\xc5\x0b\xe9\x61\x5c\x99\xe4\x10\x9b\x12\x44\x79\x23\x1b\x2c\x65\x44\x2f\x00\x3e\xba\x30\x92\xde\x86\x57\xec\x15\xc0\x18\x9a\x52\xc0\xce\x00\xbf\xfa\x8d\x8c\x0d\x47\xe7\x04\x66\x2f\x8b\xbe\x39\xf4\xc5\xb5\xa2\x35\x7d\x1f\xbd\xe5\x7b\x26\x8c\xa4\xcd\x61\x9f\x19\x7c\x32\xb9\x82\x3f\xb2\x79\xd5\xaa\xb9\xa5\x97\x5a\x2e\x21\xda\xc5\xc8\xb0\x07\x08\x23\x33\x27\xbd\x6d\x4f\x4b\xc0\xe8\x0f\x26\xda\xb3\xab\x2a\xd0\xbc\xa7\x3d\x22\x9a\x80\xfe\x8a\x23\xfa\x89\x1c\xf3\x77\xbe\xe6\xb4\x6d\x63\x5f\x93\x4a\x1f\xca\x5a\x36\xad\x3a\x94\x6d\xad\xb2\x77\x05\x28\x03\x46\xba\x00\xb5\xc2\xf1\xa3\x80\x3e\xed\x17\x91\xf2\xb4\xa5\x8a\x64\xfe\xe7\xfe\x63\xff\x67\xe2\x74\x6a\xb4\xd7\xbe\x9d\xd4\xb6\x5b\x33\x89\x40\xb9\xac\x12\x06\xfa\x65\xdf\x0a\x23\xd0\x94\x05\xdd\xa2\x8a\x58\xed\xef\x94\xe2\x37\xd0\xb9\x06\x05\xc9\x91\xde\xf0\xf6\xe7\xa2\x3a\x84\x5a\x47\xbc\x16\x7f\x30\xfc\xd5\x47\x06\x49\x1c\x22\x35\x63\xac\x5d\xf1\x8c\x9f\xff\x51\x0b\x19\xb7\x5d\xe7\xef\x94\x42\x15\x6d\xad\x62\x42\x8e\xb4\xb1\x6d\x16\x32\x1e\x37\x2b\xb8\x3f\xad\x8e\xbc\x1a\x36\x9b\x2e\xf3\x5d\xe1\xef\x0d\x6e\x8c\x6d\x15\x18\xdb\xea\x74\xf5\xff\x53\xf7\xf6\xdd\x6d\xdb\xca\xde\xe8\x57\xb1\xb8\x7a\x78\x88\x0a\x52\x28\xa7\x49\x5b\xd2\xb0\x96\x9b\x97\xb6\xbb\x4d\x93\x36\x69\xbb\x53\xc5\xbb\x97\x26\x21\x89\x0d\x45\x6a\x93\x90\x1d\xd7\xd2\x77\xbf\x0b\x33\x00\x08\x90\x94\x93\x7d\x9e\x73\xef\x5a\x4f\xfe\x88\x29\x10\x00\xf1\x3a\x18\xcc\xcb\x6f\x86\xec\x6d\xfb\x8b\xcc\xc8\xac\x74\xbb\x3c\xba\xdc\x15\x45\x34\x0a\x11\x95\x0d\xf7\xe1\xc6\xf7\x5f\xe6\x4a\x21\xb7\xa1\x21\x34\xac\x5d\x7d\x1c\x56\x1f\xa1\x4a\xb4\x08\x91\x89\xa3\x21\x98\x26\x35\xa4\x94\x83\xd3\x1e\x30\x94\xb2\x87\xf5\x5c\xff\xac\x49\xc4\x69\x8e\x33\x33\x54\x8d\x96\x49\xfd\x43\x75\x52\x97\x13\x84\xb6\x35\x3a\x73\x52\xcf\xf3\x28\xc7\x39\xf1\x3c\xf8\xed\x79\x51\x7d\x74\x76\x56\x1c\x46\x66\x60\x41\x40\x01\xf5\xfa\x3b\x10\x8f\xda\xe1\x46\x7c\x1f\x0d\xaa\x4c\x0d\x98\x25\xea\xf0\x3c\xdc\xb4\x57\x53\x5c\x3d\x5d\xa2\xfd\x38\x42\xa7\x44\x03\xc7\xeb\x3f\x45\x60\xe5\xc3\x4f\xfc\x96\x37\xbb\x04\x23\x06\x0c\x14\xe9\x59\x61\x21\xb1\x69\xbf\x4a\xe8\x5f\xa8\x27\x97\x63\xf1\xa4\xda\x95\xe2\x7e\x3b\x0b\x63\x01\x79\x2c\x1b\x64\x38\x50\xcd\x9a\xdc\x9b\xcd\x5e\xd0\x07\xaa\x58\x9b\xa1\x8e\xb7\xf3\x0c\xbd\x47\xf1\xd7\xb1\x49\x72\x50\x19\xdc\x38\x36\x62\xbf\xf7\xd6\x3c\xc9\x3c\xd8\xac\x08\x26\xee\xa1\x79\x91\x4a\xc2\x1f\x91\xc7\x4b\xc8\xb4\xdf\x7b\xa2\xc2\x07\xbd\xc5\x01\xa0\x3c\xd2\x28\xea\x72\xe0\x9a\xd6\xef\xb6\x39\x3a\x7a\xc6\xd3\xe2\x40\x7b\x60\x62\xf7\x15\x1a\x40\x1e\x03\x22\xa2\xc6\xc0\xa1\x22\xca\xaa\x21\x71\x37\x47\x7f\x0d\x00\x3a\x39\xe5\xfb\x7d\x48\x22\x81\xc2\x12\x49\x46\x09\xb5\x5d\x88\x3f\xa5\x6a\x7b\xdf\xed\xf7\x82\x60\x2d\x78\xd6\xdd\x5b\xd1\xcf\x65\xaf\x22\xee\xfb\x36\x55\x18\xa8\xa8\xe9\xd6\x44\xee\x7e\x50\xf5\xec\xac\x7a\x86\x4a\x7e\x73\xfb\xf1\xb2\x3f\x04\x9d\x99\x82\xed\xc1\xbb\xe3\xd2\x6b\x85\x71\xce\xb5\x3d\xc9\x8e\x61\x43\x95\x80\xb9\x53\x3a\xd8\x29\xd0\xf0\x45\xe9\xc2\xa7\x98\x44\xb9\x48\xf7\x7b\xfb\xbd\xe6\xca\xd0\x22\xd8\xb2\x36\x37\xf0\xf2\xce\x3e\x40\xb7\x9b\x96\x62\xbf\x28\x0d\x25\xcf\xd5\x50\x1f\x08\x4d\xb2\xfb\x67\xcc\xb2\x88\x1a\x82\xf3\xc9\x1d\x24\xf6\x63\xeb\xe3\x58\x2b\x72\x0b\x02\x1a\x66\xde\x0e\xa6\x3f\x6c\x13\xa4\x4f\x46\x6b\xba\x3a\xe1\x4a\x2d\xdc\x78\x7d\x5e\xd4\x92\xaf\x50\xf1\x07\xe0\x19\x82\x0d\xc4\x9c\x81\xa0\x1f\x15\x08\x25\x89\xca\xc3\x7f\x7a\xaa\xaf\xf8\x20\x0d\x70\x6e\x5a\x8b\xcb\xff\xcd\x36\x83\x8a\x10\x64\xa7\xac\xbc\xbf\x75\x84\x4a\x76\x8a\x95\x2d\x08\x83\x3e\xa9\x87\x86\xf8\x38\xbc\x59\x67\xea\xbb\x0b\x5a\x71\x6a\xdd\xaa\x1b\xf4\x5b\xd9\xef\xbd\x31\x84\x3f\xf5\x48\xff\xf3\x83\x5b\xaa\x8b\x75\xa5\x3e\xaf\xe4\xd3\xe5\x71\x8c\x98\xb2\xc5\x7a\x89\x01\xde\x4a\xe1\xdd\xea\x41\x14\x55\x84\x51\x26\x8e\xf0\x44\x8b\xe4\xd2\xb0\x45\xf5\xe1\xd0\x9a\x9f\x73\xdf\x87\x73\x01\xfc\xea\x3e\xd2\x5c\xf7\xde\x9e\xb0\x52\x05\xf7\xe6\x76\x70\x6f\x25\x76\xe2\x88\xae\xf2\x7d\xa9\x82\x63\x00\xe8\x01\x4d\x65\xc2\x87\x32\x68\x08\xfc\x06\x99\x1f\x88\xc8\x69\xc2\x52\xea\x25\x10\xa0\xdb\x63\xac\xd6\xde\xdf\x0e\xce\x4d\xa1\xfc\xc0\x33\x34\x78\xcf\x34\xed\x38\x0b\xe3\x7c\x51\x18\xf2\xb3\x9b\xa7\x51\x45\x77\xf3\x2a\x4a\x35\xe6\xb7\xf5\xb6\xa2\x15\xe9\x04\xcb\xe8\xa3\x7f\x1d\x02\x25\x98\xe5\x84\x56\xb6\x5b\x76\x75\xce\xc2\xb8\x9a\x4c\x88\x66\x55\xf3\x45\x75\x49\xe2\x66\xce\xd5\xef\x46\x5d\x27\x24\x7b\xf9\xc6\xb0\x97\x72\xfb\xef\xca\xac\x72\xd6\x04\xb9\x5b\xaa\x42\xe8\x18\x8c\xec\xe6\xf1\x4c\xf2\x9d\xa7\x6b\x1a\xa6\x6b\xdd\x2a\x01\x3e\x1b\x6b\xfd\x68\x01\xa8\x5e\x15\x68\xb8\x78\x06\xa7\x4d\x5e\xae\x5c\x6b\x5e\xeb\xde\x87\x8c\xe1\x40\x3e\xf7\xc0\xc7\xdc\x07\xaa\x6e\xa6\x5d\xb3\xd7\x56\xea\x60\xdf\x5f\x69\xd7\xe4\xdc\xd2\xdd\x01\x41\x51\x40\xbe\x79\x8b\x3e\x3b\x1e\xf3\xb8\xeb\xbb\xe1\xe8\xfc\x60\x5b\xeb\x34\x79\xf4\xb4\x25\x6b\xc5\x52\xdd\xc1\x24\x71\x9c\x86\xfa\x20\xf9\xb7\x56\x45\x18\x0d\xca\x8f\xe3\xa1\x6b\xb7\x9d\x86\x10\xd2\x72\x88\x6d\xb1\x94\x89\xe9\xa7\x4b\x1a\x45\x25\xdc\x51\x0e\x74\x93\xd4\xef\x9f\x14\x3c\x29\xed\xcf\x0e\x4a\x10\x30\x11\x24\xb4\x6d\x6a\x00\x95\x74\x53\x87\xf8\x50\xa3\xc3\xb0\xf1\x5e\x35\xb6\x77\x07\x03\x76\x28\xd9\xf2\x24\x77\x65\x10\x0e\xcc\x70\xde\x74\x3a\x23\x3a\xf6\xf3\xbd\x32\x8c\x19\xea\xdf\xe9\x31\x9e\x4d\x03\xb3\xa2\x26\x11\x3c\xeb\xdf\xba\xb3\xa0\xa0\x65\x95\xdb\x7d\xf7\xa5\xc6\x87\x05\x2e\xb4\x57\xb1\xcb\x8a\xdf\x37\xd5\x31\x47\xe8\xf5\xb7\x1a\xb9\xda\x30\x13\x06\xcd\x9e\x72\x0d\xc8\x0e\x99\xd4\x0a\xed\x65\x83\x96\x60\x54\x5f\x94\xe8\x0e\x1d\x27\x6a\x00\x2f\xcc\x25\x54\x7b\x09\xf7\x7c\x22\x73\x13\x24\xbd\x15\x1b\x77\x52\xd8\xdd\xa1\x85\x42\x45\x20\xc3\x51\xed\xfb\xa5\x50\x46\x86\x9d\xdc\x38\xdf\xa3\xf0\x20\xe9\x05\x6c\x13\x6c\xed\xb0\x0c\xa0\xdd\x29\x6e\x64\x17\x40\xb8\x75\x2a\xf6\xfd\x4e\xc2\x42\x5c\xfa\xfe\x45\x02\xc8\x39\xfd\xfe\xb5\xc8\x46\xbd\x52\x4a\x03\x2c\x82\xce\x2b\x02\xc6\x1e\xc7\x7b\x73\x20\x70\x71\xfc\xbe\x5c\x56\xfd\x35\x00\x51\xf5\x7b\x97\x0f\x25\x85\x6c\xaf\xc2\xe8\xd7\x46\x9d\x5b\x29\xb1\x01\x57\x4c\x30\x0a\x64\x7b\x03\xce\xe0\x22\xec\xe4\xd1\x44\x49\xb6\x26\xe2\x14\x0d\x98\x22\xa1\x8e\x78\xf4\x42\x74\xba\x11\x75\x26\x09\x72\x3e\x29\x92\xa6\x51\xd9\xe1\x99\x5e\xad\x74\x9a\x7a\xa2\x37\x75\xb2\xd5\x69\xe6\x99\x2a\xb3\x49\x99\x86\x4f\x87\x83\x64\xa9\x41\xef\x0a\x99\xff\x93\x25\xc9\x18\x9f\xeb\xe7\xc8\x03\xab\x87\xa1\x65\x8a\x1a\x74\xc8\x6c\x1a\xec\x45\xde\x55\x92\xbe\x5f\x69\xee\x80\xcf\x3d\xd5\x70\x2f\x1a\xa8\x5e\xbf\x31\x1d\xf1\xc0\x20\x69\x91\x5f\xc2\x34\x7d\x17\x80\x18\xa9\x11\x98\xd4\xc6\xcb\x93\x3f\xc7\xcc\x3b\xf1\xc6\xb5\x32\xd0\x05\xa3\xda\xd8\xb8\x71\xe0\x51\xba\xa9\xae\xf9\xff\x7d\x43\x40\x95\x8f\x96\x5c\xa7\x65\xdb\x67\xb3\x00\x6b\x02\xbd\x85\x65\x67\xcc\xba\x13\x70\xf2\x16\xe9\x1a\x06\x0d\xf1\x90\x93\xb6\xf0\xb5\x02\xf2\x85\xa8\xf5\xe3\x64\x11\x5e\x9a\xd0\x77\x50\x57\x8b\x0b\x88\x59\xc8\x38\x50\x4f\xbe\x5f\x8c\x98\xb6\xc4\x9e\x7b\x27\x5e\xe4\x79\x64\xac\x0b\x14\x64\xbf\x87\x3d\xe2\x8c\xbc\x5a\x79\x68\x60\x7a\xcf\xb8\x0f\x09\xe9\x24\x47\x20\xe9\xf5\x9f\x68\xba\x9b\x13\x40\x6f\x49\x37\x71\x1b\xda\xb4\x9c\x96\xd5\x77\x18\x7d\x16\x14\x34\xda\xd0\xc0\x0d\x24\x1d\x12\xaa\x5c\x04\xb5\xcd\x2f\xed\x2b\x9b\x8c\x7d\x33\xe8\xe6\xb4\xf1\xf1\xe2\x92\xb4\xc3\xad\xfd\x24\x2e\xc4\x5c\x47\x25\x22\x51\xad\xf5\x3f\xe6\xfa\xab\xef\x50\xb6\x7d\x72\x5b\x94\x10\x1a\xd2\x52\xfb\x57\x30\x4e\x13\x65\x06\x62\xc2\x01\xe5\x0c\x4d\xbc\x45\xab\xa8\x88\xc1\x1a\x4b\x7b\x00\x8c\x7f\xab\x83\x92\x10\x9a\x83\x5d\x77\x62\x14\xc0\x04\xc3\xf6\xf7\x94\xd1\xd6\x94\xc8\xaf\x65\x75\x90\xd8\x76\xbf\xca\x78\x28\xa1\x65\x5f\x42\xc3\xe7\x3c\x02\xdf\x48\x42\xcb\x83\x91\x9a\xe2\xd5\xb8\xdd\x55\x6a\x7a\x5d\x0f\x32\x6d\xf9\x40\xb5\x11\x62\x5f\xc6\x8f\xf3\xf8\xe3\x3d\xb2\x1c\x42\x6b\x0a\xf0\xa7\xb2\x3d\xfb\xbd\x57\xa3\xbf\x37\x1c\xb4\xdf\x28\x33\x89\x8e\xb4\x1d\xa7\xf3\xce\x36\x2f\x8d\xda\x20\xaf\x1c\x4c\xeb\xdf\xdc\x6e\xe5\x45\x1b\x67\x39\xe2\x84\xb6\x36\xa0\x88\x83\xde\xfe\xa6\xae\xed\x6b\x34\x9a\x51\x34\x39\xc6\x8c\xf8\x4c\x7b\x76\xaa\xf8\xb6\x97\x6c\x80\xe6\x74\xa7\x05\xb3\xba\x2d\x97\x79\x6b\xfd\x41\x0e\xd4\xa8\x5f\x2f\xc4\x00\x67\x03\xf7\x78\x7d\x56\x05\x76\x4d\x04\x8d\x19\x6c\x4b\x8f\xd8\x75\x4d\x70\x6f\xfb\x96\x5b\x85\xbc\xd9\xc7\x66\xc1\x23\xdc\x65\xa9\xb0\x2e\x21\x74\x9c\x19\xca\x12\xe0\x2d\x4b\xc0\xb6\x54\x6f\x14\x80\x7c\xa9\x0d\x1b\x51\x61\x2a\x33\x29\xbc\x73\xeb\xea\x6f\xfa\xd6\xf7\x86\xb2\xc7\xc4\x16\xd1\xc7\xf6\x35\x1c\x8d\xe5\x6c\x76\x14\xb8\x14\xa1\xc1\x09\xbb\xc6\x8d\xc6\x68\x2c\xe9\x0e\x4b\x41\x8e\xa0\xbb\x37\xfa\x6a\x8c\xc8\xee\xf1\x48\x19\xbb\x54\x60\xec\x52\x32\xa6\xbd\xd4\x65\xf7\xcf\x21\x19\x89\x20\x63\x95\x32\xa4\x81\xd0\x68\x08\x8a\xa0\xcb\xaa\x17\x2d\x4a\x26\x26\x21\x40\x28\x04\x95\xab\xf7\xfb\x3a\x30\x18\xf1\xc4\xf7\x95\x50\xab\xea\x8e\xab\xc9\x73\x18\x8f\xcb\x03\xa1\x39\x30\xd9\x17\x45\xd1\x19\x58\x7d\xf7\x59\x5c\xf6\x07\x6c\x88\x14\xfe\x27\xeb\x46\x59\xb0\x68\xe1\x90\x1c\x0c\x44\xac\x93\x29\xba\x79\x84\x8a\x03\xdd\x56\xcd\xf3\xba\xc2\xdb\x7a\x7f\x39\x3b\x1a\x26\xdb\x49\xc2\x12\x21\x19\x95\xfa\xd1\x4e\x18\xcb\xa7\xd2\xd6\x3a\x8d\x21\x0e\x40\x72\x6e\x02\x28\x48\x3e\x6f\x14\xc6\x62\xc2\x12\x3a\x1e\xd7\x87\x96\xe4\x80\xee\x8a\x13\x50\x19\x66\xfc\x83\x6c\x70\x57\x17\x80\xbb\xaf\xb3\xe1\xd2\x75\xac\xcd\xfa\x95\x8b\x20\x74\x04\xc0\xa9\xd6\x6d\x3c\xcc\x30\xb6\xcc\x23\x3f\xb5\x77\xb6\xee\x0f\x97\xb7\xdd\x1c\x3e\x76\x03\x76\x42\x77\xf8\x81\xa6\xd5\x76\xe8\x3e\xa4\x54\xeb\x9f\xaa\x57\xec\xaa\x9e\x7b\x05\x54\x27\x3a\x1a\x68\x2b\x00\xfe\xa0\xba\xfd\x4d\xb5\xa5\xdc\x56\xbd\x0b\x57\x15\x2f\x5f\xf2\xa2\x15\xb6\x71\x4b\x71\x0d\xfe\x3d\xce\x35\x50\x85\xc6\xea\xde\x0e\x21\x19\x6a\xd2\xf7\xc3\x40\x6b\xcf\x5a\x0b\x62\x18\x2b\x74\xc6\x78\x5a\xa5\xee\x21\x26\x2f\x5c\x70\xc5\xb2\xae\x92\x2a\x18\xc8\xa0\x3a\x34\xd6\x41\x14\xf5\x4e\x80\x8d\xad\x01\x33\xd0\x84\x4e\x67\x91\x24\x44\xfe\x7f\x86\x36\x0d\x02\xb0\x05\x5b\xbf\x3c\x6b\x8a\xc0\x1f\x13\x21\x68\xd4\xdd\xda\x9a\x0e\xfe\x49\xb3\x20\xac\x48\x6e\xe0\xe2\x62\x24\x18\x8e\xd0\xc3\xd8\x3d\xbd\x07\x44\x0c\xeb\x97\x65\x9a\x74\x97\x55\x69\x94\xd3\xb6\xc2\xc8\xae\x5d\x52\x21\x53\x06\xb2\xe2\xb6\x52\x3e\x2e\xd1\x28\x3c\x5a\xf2\x92\x1e\x55\xcf\x77\xf1\xdf\x15\xa3\xc4\xb5\x2f\x34\x1a\x1a\x23\x83\xa8\x0c\x93\x4a\x35\xde\x85\x93\xa6\x00\x1c\x4b\x0e\x5e\x35\x5a\xf0\x09\xde\x3c\x09\x2d\x68\xae\x15\x76\xed\x13\xb0\x1e\x24\xce\x8d\x5d\x0d\x0c\x42\x43\xa8\x41\x3c\xc8\x0f\x80\xa4\xf3\x07\x1e\xe9\x04\xc8\xf0\xae\x94\x63\xd0\x5d\x50\x92\x42\xd8\x16\x2f\x1f\x0a\x34\xb9\x40\x8b\x6e\x6b\xb8\xbb\x20\xa3\xed\x1b\xdb\xe1\xd8\x32\x5e\x7b\xcf\xb3\x05\xbf\x04\x5f\x2b\x66\xc1\x51\xc8\x02\x8a\x3f\xe5\x14\xc2\x0e\x9a\x86\x61\x63\xe9\xb3\x24\x30\x0d\x6f\xe1\x01\x8d\x60\x8b\xb9\x2b\x44\x9d\x10\x0b\x8c\xe5\x72\x2c\xcc\x5a\xad\xc1\xe6\xf2\x4c\xc5\x54\x13\x47\x6c\x5c\x1c\x49\x0f\x1b\x12\xff\xe0\xda\x77\x65\x3e\xbd\x8c\x1a\x18\x44\xfb\x96\xfe\xa8\xb7\xb3\x4b\xb8\xb5\x4c\x4f\x69\x6f\x5f\x54\xd9\x51\xb5\xb0\xdc\x61\x28\x2a\xcd\x72\x61\xab\x78\xdd\x6c\xe9\xe6\x40\x5b\x91\xfd\x51\x41\x99\xda\x9d\x73\x05\x9a\x13\xd8\x89\x24\x7a\x29\x8c\xe2\xdb\x9c\x06\xf7\x01\x49\xbc\xe6\xdb\xfd\xde\x7b\x57\x7a\xc0\x06\x3f\xd5\x9b\xbd\x2b\xc4\x01\xd3\x9f\x11\x43\x45\x3b\x58\x00\x11\x2a\x54\xf4\x79\x43\x21\x8c\x2d\xb4\x31\x1d\xd2\xae\x7a\xdd\x60\xbe\x86\x92\xb4\x61\x61\x0f\x96\x59\x86\x73\x22\x75\x9c\x2f\x31\x46\x23\x46\x52\x54\x62\x7a\x80\xde\x83\x2b\xa2\x6d\x2b\x34\xe5\xda\x46\xd3\x49\x95\x6d\x01\xd2\xf8\x32\x61\x61\x6b\xab\xf8\x3e\xe9\xc8\xaa\xf2\x65\xf0\x2a\x09\x38\xa1\xa3\x5b\x79\x5f\x12\xc4\xf7\x47\x7f\xd6\x01\x37\x80\x6b\x82\x90\xbb\xd7\x00\x63\x26\x37\xde\xcb\xa4\x8d\x53\xa5\x23\x51\xef\x72\x59\x10\xd6\x2c\x20\xb6\x25\x22\x79\x53\x27\x65\xb3\xe4\xf5\x74\x99\x17\x1c\xf9\x21\xdf\x1f\xf1\x69\xde\xfc\xa2\x1c\x5a\x02\x42\xb4\xe7\xa2\xb6\x0d\x55\x9e\x4a\xcf\xf3\x82\xcb\x5c\xbc\x76\x92\x06\xe0\x63\x69\xc2\x2e\xea\x3a\xb9\x0d\x4a\x42\x1b\x16\x52\x07\xf4\x64\x3c\x6e\x30\x70\x58\x19\xf0\xae\x19\xb3\x50\x6a\xa5\x5a\xb2\x23\x1c\x0c\x22\x6b\x82\x6e\x60\x0a\xf9\x0a\x9c\x81\x5b\xbd\x52\x22\x3b\x72\x64\x76\xd5\xe1\x74\x20\xa8\xc9\xc3\xb2\x7d\x3d\x9e\xb6\xd5\xd9\x26\x8d\xe0\xde\x21\x5e\x27\xea\xcb\x92\x61\xd7\xcf\x3f\x82\xfa\xd5\xb4\xc8\x3c\x43\x94\x72\x22\x67\x5f\xde\x0e\x53\xdb\x3e\xb0\x56\xd0\x83\xda\xad\x21\x29\x8a\xea\xe6\x69\x5d\x6d\xe5\xa0\xc9\x4b\x5b\xa3\xe1\x2e\xef\xcb\x43\x05\xd2\x6c\x52\x05\x56\xf4\x22\x3c\x56\xdb\x09\x89\xf3\x69\x55\xf2\xba\xae\xea\x21\x6c\x1a\xd9\x34\x99\xa1\xa8\x92\x01\x1b\xf4\x7c\x5a\xf3\x66\x57\x88\xf8\xc1\xe2\xdd\x87\x30\x9c\xbc\xfb\x10\x7e\xf5\xee\x43\xc8\x27\xef\x3e\xcc\x96\x97\x77\xa7\x87\x07\x4a\x58\x45\xf6\xfb\x20\x59\xd4\x97\x4c\x10\xaa\xea\xac\x79\x92\x5d\x34\xf2\x42\x2c\xb7\xc3\x81\x66\x2c\x8c\xb3\x16\xaa\x39\x1b\x8f\x49\x1a\xe4\x8b\xec\x92\x66\xaa\xf5\x30\x24\x88\x70\x9b\xd5\xc9\x6a\x95\x97\x2b\x59\x5c\x5e\xb7\x60\x6a\x6d\xd4\xbe\x9a\x9c\x4f\x66\xa4\xe5\xbd\x7a\xa5\xe4\xe2\x47\x50\x58\x2e\xde\xe4\x1b\x5e\xed\x44\xd0\xef\xbf\xd9\x32\x53\xd0\x95\x4e\x97\x55\xba\x6b\x64\xfb\x4f\x43\x12\x8b\xfa\x56\x85\x10\xe8\x6c\x90\x15\x17\x4f\x13\x91\x04\xde\x1b\x74\x5b\xca\x97\xc1\x4e\x41\xb2\xc5\x47\x3b\x31\x1a\x4a\x9e\x4a\xe6\x15\xe2\x07\xc8\x4b\x92\x6d\xd7\x12\x10\x40\x47\x33\x4b\xac\x06\xc8\xf5\xb5\xd9\x51\x5b\x16\xc6\xdb\xb3\x75\x7b\x4c\x6e\xc9\xb5\xce\xee\x79\x74\xbd\xd8\x1a\x5c\x2e\x78\x06\xad\xa4\x27\xbf\xed\x91\x98\xf7\xb4\xc6\xc1\xce\x68\x38\xa9\x5a\xee\x84\x1e\x1b\x9d\x43\x0a\x72\xb7\x25\xb9\x73\xa0\x50\x5f\x29\x5c\x7c\x5d\x48\x7e\x0c\xad\x66\x1c\x5f\x1a\xd8\x66\xdb\x24\xd5\xd8\x74\x4f\xd6\x79\x91\x05\x43\xc5\x08\x1d\x4a\x55\x81\xd3\xcd\x67\x7f\x4a\x14\xcb\xa1\x63\xeb\xca\xf9\x79\x56\x70\xf9\xd8\x7c\x73\xfb\x44\xfb\xb0\xd9\xa6\x01\x1f\xc9\x1a\x58\x6e\xba\x1e\xa1\x56\xbc\x7c\x3e\x60\x38\x00\x9a\xbe\xb6\x40\x0c\x91\x0f\x95\xdc\xec\x50\xb7\xb1\x0e\x17\xe1\xe5\xb4\xda\x6a\x1d\xd8\x80\x9a\x11\x99\x20\x73\xeb\xe4\xe3\x31\x11\x41\xbd\xe0\x97\x80\x0f\x2d\x73\xfc\x92\xb0\xd1\xac\x3d\x19\x9e\x26\x01\xb9\xfb\x25\xd9\xef\x83\xee\xd6\x8d\x97\x22\x40\x42\x4c\xbd\x9a\x4b\x9e\xdd\xd1\x4b\x18\x27\x9c\x40\xb0\xe1\x0d\xa2\xcc\xbf\x7f\x4a\x82\xe7\x09\x39\x40\xa0\x79\x79\x8a\x59\xd5\x5e\x15\xbb\x41\x65\xc7\x4f\x49\xf0\x22\x87\x03\x90\x50\xd9\x5e\x1b\xcb\xee\xb9\x7d\x94\xe9\xb9\x8d\xf9\x34\x4d\xd2\x35\xcf\x9e\xac\x93\xfa\xf7\x3c\x13\x72\x37\x60\x8a\xdc\x23\xdf\x29\x40\x30\x95\xf4\x2a\xc9\xb2\xbc\x5c\x7d\x87\xed\xd3\x77\xab\xab\xa4\x6e\x9e\x14\xf9\x76\xcb\xf1\xea\x04\xc1\x19\x00\x1f\xc3\xd8\x13\xfc\x95\xb0\xbb\x87\x91\xf7\x2a\xd9\x35\xdc\xa3\x5f\x45\xde\x37\x49\xfa\xbe\x91\x0b\xd1\xa3\x5f\x47\xde\x9b\xe4\xca\xa3\xb3\x87\x91\xa7\xbc\x3c\x67\x8f\x23\xef\xf5\x3a\x5f\x0a\x8f\xce\xbe\x8c\xbc\x27\xa2\x2e\x3c\x3a\xfb\x2a\xf2\x2e\x0a\x99\xf4\xb5\xa9\xe9\x34\x8c\xbc\x27\xc9\xb6\xf9\xb1\x4a\xdf\x7b\xf4\xf4\xcb\xc8\x7b\xd6\xa4\x1e\x7d\x78\x1a\x79\xaf\xb1\xf6\x87\xf0\xd9\x15\xff\x75\xeb\xd1\x87\x5f\xe0\xf3\xd3\xea\xa6\xf4\xe8\xc3\x47\xf2\x7b\x99\x47\x1f\x3e\x8e\xbc\xef\xaa\x8d\xcc\xfc\x65\xe4\x41\x94\x17\xfa\xf0\xab\xc8\x83\x22\x5f\x47\x1e\x86\x71\xa1\x5f\x84\x91\x87\x25\xbf\x90\xf5\xd4\x79\x29\x5e\xa7\xb5\xfc\xf9\x28\x52\x8e\xd7\x1e\xfd\xe2\x71\xe4\x3d\x45\x3c\x2c\xfa\xe8\xeb\xc8\x8b\x3d\xfa\x78\x16\x79\xcc\xa3\x5f\xcf\x22\xef\x45\x95\x79\xf4\xeb\x53\xfd\xf0\x50\x3d\xcc\xc2\xc7\x91\xf7\xb9\xfc\xfb\x25\x64\x9d\x85\x5f\x47\xde\xc4\xa3\xb3\x59\x18\x79\x53\xf9\x77\x16\x79\x0f\x3c\x3a\x93\x5f\x42\x51\x34\x76\x78\xf6\xe5\x43\xcc\xf8\xd5\x63\xf8\xd4\xec\x2b\x55\xc1\x57\x5f\x45\x1e\x95\x7f\x55\x45\x5f\xab\x8a\xbe\x56\x15\xc9\x36\xfc\x3f\x1e\x3d\x95\x43\xb9\xf0\xe8\xa9\x1c\xc7\x77\xef\xe4\xc3\x2c\xf2\x2e\xe5\xdf\xd3\xc8\xfb\x6f\xf9\xf7\x0b\xd5\xc6\xc7\x0f\x4f\xe5\xa8\xca\x31\x91\x8f\x0f\xf5\x58\xc8\x1f\x5f\xe8\x51\x93\x3f\x1e\x99\x01\x7b\xfc\xf0\xf4\xcb\xd3\x76\x38\xe4\xcf\x87\x7a\xa4\xe5\x0f\x3d\xfe\xf2\xf9\x71\x3b\x4b\xf2\xe7\x97\xf6\x44\x3d\x7e\xf8\x30\x3c\x35\x43\x7c\xa0\xdf\x4a\x0e\xed\xdb\xe4\x6c\x26\xff\x1f\x8f\xc9\x5f\xc9\xe2\xdb\x64\xfc\xc5\x57\x97\x0c\x9f\xbe\x7e\x7c\xc9\x5e\x83\xdd\x79\xf0\x6d\xd2\xfa\x66\xfc\x9d\xb0\xc7\x8f\xe2\xbf\x93\x33\xf6\x75\x18\xff\xad\x0a\xfe\x9d\xe8\xbc\x70\x95\x93\xbb\x40\x52\x93\xe0\x6f\xab\xe0\x37\x09\x9b\xc5\xdf\x24\x67\x6c\x76\x1a\x7f\xa3\xca\x7d\x93\x8c\x67\xb3\x19\x7c\xf1\x9b\x64\x0c\xfd\xbe\x64\xde\x73\x6f\xfc\x4d\x02\x5c\xde\xaf\x09\xbb\xb3\x5c\x5e\x3e\x73\xf6\x1e\x32\xe8\x0f\x26\xc1\x7c\xf4\x19\x79\x40\x62\xc1\xf8\xc2\x0a\x7b\xea\x3a\xe0\xc9\x3b\xa3\x63\x4d\x33\x99\x75\xed\x69\xe4\xc1\xf7\xe0\x5f\x41\xba\xc9\xf6\x1b\x2e\x92\xfd\x86\x7c\xf6\x20\x47\xee\xa0\x21\x44\x92\x01\xe3\x57\xfc\xe0\x5f\x49\x50\x08\x32\xb7\x33\xd4\x6e\x86\x20\xdd\xa7\xa2\x2e\xf6\xf2\xbc\xaf\xab\xc2\xa9\x2b\xd7\x59\x41\xaf\xf9\xe0\x5f\x4d\x20\x77\xa9\x5b\x5d\x0f\x94\xe0\xd7\xb2\xe6\x69\xb5\x2a\xf3\xbf\x79\x76\xb2\xa9\xb2\x7c\x99\xf3\xfa\xa4\x4c\x36\x3c\x3a\xf1\xc6\x0d\x89\x4b\x88\x8f\x62\x85\x47\x11\x4c\xee\xf4\x89\x37\x16\xa0\x81\x90\xbf\x25\x0d\xc0\x84\x44\x25\x6c\x32\xfc\x5d\xe2\x6f\xa0\x17\x98\x62\x45\x0f\xfd\xb7\x35\xf0\x72\x42\xf4\xc8\x9e\xe4\xe5\x89\x40\x90\x8c\x0e\x72\x4e\x6d\x54\x24\x42\x01\xb7\x3f\xf8\x57\x20\x1b\xbb\x5f\x26\x45\x21\x3b\xb7\x5b\xad\xf7\x41\xc6\xf7\x89\x20\x22\x49\xd7\xe4\x33\xc5\x89\xd5\xc4\x09\x82\xe4\x4d\xa7\x53\x8f\xb1\x9c\xdc\xa9\xf8\x8f\x50\x9f\x09\xa1\xd4\xb2\xe7\x3f\x04\xb5\x5a\x12\xde\x89\x47\xe8\x67\x09\x31\x76\x5f\x7d\x83\x2f\x0c\xf5\x42\x1b\x1d\x47\x29\x61\x46\x5f\x36\x99\xcd\x83\x46\x1b\xc8\x41\x55\x05\xcb\x49\x04\x69\x46\xe3\x36\x9e\x11\x27\x03\xb4\x92\x28\xb7\x3f\xbe\x68\xa0\xc7\x15\x9c\xe9\xd5\x88\x15\x43\x10\x13\x69\x55\x36\x79\x23\x78\x29\x4e\xae\x72\x30\xf1\x69\x4e\x96\x55\x0d\x73\x89\x0a\x52\x59\x0f\x2b\x0e\x56\xbf\x4d\x77\x53\x39\xf2\x9c\x88\x45\x7a\xc9\xf8\x22\x6d\x85\xc5\x56\xc4\xd7\x1e\xd6\x66\xc0\xd9\x0f\xf2\xd2\x45\xc0\x21\x67\xce\x95\x5f\x0e\xcd\x49\xc4\x17\x02\x95\x97\x33\xc6\x98\x56\x60\x7a\x65\x05\x66\xc4\x9e\x35\x0f\xed\xcb\xcd\xae\x10\xb9\xd7\xfa\x95\x4a\x9e\x21\x28\xb5\xc2\xd7\x43\x85\x4a\xe6\x21\x3b\x69\x4d\x3a\x0c\x8a\xb7\xa8\xae\xfe\xe2\xa9\x38\x81\x9b\xd4\xa5\x37\x62\x2f\xe1\xb7\x03\x26\xa9\x28\x0a\xb4\xd2\xad\x42\xb3\xcd\xd8\x47\xfb\x15\xa2\xaf\xeb\x61\xd2\xc1\xe1\xac\x0c\x03\x8b\xa1\x5f\xcb\x22\xb9\x34\x30\xee\x85\xfe\x58\x61\x73\x8a\x6f\xad\x1d\xd1\x77\xcf\x99\x8b\xe8\xaf\x64\x21\xa6\xef\xf9\xad\xa4\x83\x7a\x7a\xf0\x08\x66\x8c\xef\xf7\x70\x06\xe3\x13\x1e\xd1\xf8\x2c\x0f\x09\x66\x23\x87\xfe\xa3\x1b\x49\xa3\x95\xd6\x26\x85\xf8\x81\xdf\xfa\x3e\x54\x05\x9e\xd9\xce\x8e\x0f\x7e\x9b\xf3\xa9\x24\x64\x3f\xf0\xdb\x88\x4f\x25\x31\xfa\x81\xdf\x12\xdf\xc7\x56\x98\x02\x2d\x49\x80\x12\x2a\x5f\x64\xca\xca\x12\xb2\x59\x6d\x01\x4d\x32\x46\x35\xea\xd5\xf2\xa5\x6a\x08\xf6\xc4\x64\x1c\xa6\x25\x3f\xb7\xe1\x06\xd6\xbe\xff\xf0\x0b\xc6\xcc\x38\xa1\x7a\x26\xa9\x5d\x1d\x78\xcd\x86\xc6\x52\x5d\x80\x6b\x70\xae\x4f\x0a\xf1\x6d\x9d\x6c\xd7\xd0\x8c\xe0\x61\xb7\x4a\xf8\x0b\x92\x5b\xf9\x48\xe8\x3f\x92\xa0\xa6\x18\xb5\xc4\x34\xeb\x07\xcb\x9d\x72\x60\x42\x7f\x4d\x16\xe2\xd2\x0e\xa8\xfc\xcf\xa4\x87\x03\x6a\xee\x78\xc6\x50\xd7\x58\xc2\xd6\x8e\x0f\x63\xbb\x3c\x39\x06\x49\x8e\x5b\x71\x44\xc9\xe5\xb5\xbf\xae\x36\xf4\xe7\x20\x27\x53\x51\x91\x33\x16\xc6\x7a\xa9\xe6\x18\x41\x44\x09\x46\xd1\x3e\x95\x26\x3a\xd0\x0f\xb9\xc3\x47\xe5\x1c\xae\x41\x80\x73\x1d\x7e\xfe\xd0\x15\xf7\xb4\x6c\xbb\x65\x84\xc9\xcf\x25\x13\x3f\x99\xc8\xdb\x98\xd0\xb7\xb1\x7c\xc1\x55\x70\x1c\x78\x12\x15\xf5\xc6\x1a\xb1\x34\x7e\xa3\xe4\x45\x66\x70\x44\xe1\xae\x5a\x79\xc1\x46\x83\x1a\x3e\x96\xd7\x40\x63\x08\x75\x16\xee\xf7\xf9\xb9\xa3\x14\x41\x4c\x5f\x2b\xac\x2f\xef\x54\x86\x95\x4f\xd3\xb5\x55\x11\xde\x06\xf2\xf9\x40\xf0\xb3\x9c\xd6\x67\xe1\xdc\x4b\x96\x68\x17\x82\x68\x28\x76\x78\xfa\xba\xe8\xf8\x3b\x6a\x89\x1c\x63\x78\x6d\xb7\x45\x70\x25\x9b\x18\x8c\xa6\xb5\x08\x6a\xda\xc9\x82\x31\x14\xd5\x74\xd1\x86\x95\x67\xe1\xfc\x67\x08\xcf\xbc\x08\x2f\x69\x25\x7f\x33\x16\xcc\x18\x44\x91\xb9\xe6\x05\xe9\xb5\x0c\xe3\x2c\xc3\xcb\xf3\x70\xbf\x1f\x6e\x89\x46\x85\x78\x59\x63\x38\xdb\x8c\xbd\x97\x4f\x29\x2d\xe0\x8b\xb5\x1b\xf7\x21\x0a\xe5\x42\xda\xc6\x05\xab\xc4\x90\x2c\x49\x95\x15\x90\x8b\xb1\xec\x40\xfb\xcd\x44\x3b\x63\x88\xce\x34\x99\xd1\x82\x68\x5c\x19\x8f\xb1\xca\xf7\x83\x42\x4e\x4b\x4d\x0b\x70\xac\xc5\xb0\xd8\xd0\x12\x99\x5f\x85\x81\x8a\x2d\xb3\xe0\x9c\x07\x39\x2d\x68\x45\x0e\x87\x6e\x6a\xaf\xfd\x51\x08\x69\xfa\x7b\x91\x1a\x30\x72\xf8\x35\x99\x5e\x25\x4d\x9e\xb2\x3b\x30\x07\xf0\x56\x95\x64\x3c\x91\x87\xc6\x00\x91\x2a\x49\x71\xd2\xbf\x6e\x65\xc2\x8f\x79\x09\x0c\xb2\xe4\x8a\xf5\x6f\xe4\x90\x9f\x95\x99\x4e\x00\x8e\x5a\xf2\xd8\x3a\x01\xbc\xa5\x5e\x6f\x12\x79\x3b\x41\x16\x5b\xbe\xd1\xcc\xb6\xe6\xb2\x75\x1a\xd6\x87\x2c\x7b\xe4\x65\xbc\x90\xad\x80\xb8\x01\x1e\x35\x77\x36\xf3\xe2\x1b\xec\x18\x55\x04\xb3\xbd\xd4\xf5\x72\xbc\x49\xae\x64\xda\x32\xd9\x15\x02\x6e\x7b\xaa\x88\x7c\x8e\xbc\xbc\xcc\x78\x29\x2e\x76\xa2\x92\x7d\x11\xbc\x8e\xbc\x92\xdf\xc8\x4d\x70\x51\x66\xdf\xc3\x4b\x8f\x22\xff\x1f\x79\xa2\x5a\xad\x0a\xfe\xf2\x9a\xd7\x37\x75\x2e\x2f\x16\xcf\x9a\x34\xf2\x9a\xbc\x5c\x15\xad\x4c\xc5\x3b\xd0\x5f\x93\xe9\x36\x7d\x8a\x9f\x64\x77\x78\x5a\x5c\x78\x91\x8a\xcd\x79\x51\x14\x1e\xc5\xc4\xa7\xd8\x5c\x2e\xc0\xd0\x44\xa7\xfe\xe1\x45\xca\x56\x5a\x35\xd5\xa4\xa2\x41\x34\xe6\x7a\xdb\xf9\x0d\xb7\x1b\x39\x98\x4f\xab\x14\x46\x5e\xbf\x90\xf3\xa2\xd2\x61\x8a\x30\xf5\xd7\xad\x67\xcf\xac\x6a\x8f\x9c\x03\x77\x82\xf1\x05\x2c\x10\xf9\xe2\xdb\xba\xda\x6d\x71\xb9\xe0\x1b\x5c\x27\xe6\x95\x5a\x36\x70\xa4\x9a\x42\x66\x31\xa8\x17\x6d\x19\xb3\x6e\xb0\xb2\xce\x34\x42\x8d\x66\xa6\xb1\x85\x48\x3f\xdb\xd7\x6a\x85\xe0\xdb\xd7\x72\x90\x93\x6b\x93\xfb\xb9\x17\x79\xcb\xbc\xad\xff\x5b\xf5\xfb\x27\xfe\x41\xb8\xa3\xab\xdf\xbc\xaa\xf9\xb5\xfb\xe6\x39\x8c\x33\xc8\xcd\xdc\x17\xbf\xb4\x2f\xac\x29\x5d\x98\x45\xf5\x23\x6f\x1a\x9d\x7a\x69\x52\x5f\x58\x9d\xf9\x55\x4d\x74\xbb\x76\x9c\x0f\xfc\xaa\x66\xd8\x7e\x2d\x87\x6f\x20\xdd\xe2\xc3\x22\x0f\x36\x38\x2e\x43\xbe\x49\xd2\xe6\x56\xaf\xc1\xe7\x5e\x67\x77\xab\x51\xf7\x5c\x3a\x80\xa9\xaf\x06\xd6\xc7\x4f\x83\x8b\xe3\xa2\x37\xc9\xb8\xee\x86\x66\xf8\x37\xcf\xdd\xef\x76\x7f\xdb\x77\xd6\x8a\xf4\xba\xb4\x40\xad\xf6\xfe\x46\x87\xb1\xe9\xac\xa0\xdf\xab\x3a\x73\x17\xd0\x0f\x5e\xe4\xbd\xcf\x8b\xc2\xde\x70\x6f\xbc\xc8\x13\x75\x52\x36\xdb\xaa\xe1\xb2\x4a\x33\x6f\x2f\xbd\xc8\xab\xb6\xbc\x84\xdc\x30\xa2\x9b\xc4\xde\xd9\x9b\xac\xbf\xb1\x37\xd9\xc0\xbe\xde\x64\x03\xdb\x5a\x25\xea\x5d\xbc\xc9\x9c\x4d\xbd\xc9\x86\xf7\xf4\x26\xd3\x9b\xb7\x93\xda\xdf\xe8\xb2\x29\x7a\x4b\x9b\x54\x67\x6b\xda\xfb\xd9\xdd\x9a\xce\x76\x96\x35\x39\xdb\x59\xaf\x94\x4d\xd6\xd9\xcd\x36\x01\xf8\xf8\x76\x3e\x96\x4b\xcf\xb5\x7c\x7f\x7c\xcb\x6f\x32\x67\xc7\x6f\x32\x67\xc3\x6f\xb2\x23\xfb\xdd\x7a\xa1\xb6\x3b\xcc\x63\x21\x86\xf7\x7a\xff\x5d\x3b\xd1\xfd\xdd\xbe\xc9\x06\x36\xfb\x26\xeb\x2d\xcc\x3a\xd9\x6e\x79\xd6\x19\x4a\xbb\xab\x56\x0e\x7b\x16\xee\xa1\x19\xea\x6d\x97\x64\xd8\xe4\xbe\x7b\x36\xf4\x56\x87\x4d\x48\x16\x8a\x92\x50\x0f\xc9\x88\x77\x09\x3b\x40\x9d\xa5\xec\x6a\xee\x6c\x87\xc8\x3e\xf5\xd0\xd4\xa3\x60\x77\x66\x67\x44\x59\x42\x3b\x27\xe5\xa0\x42\xd9\x8d\xaf\x0b\xa2\x7a\x54\x00\x04\xda\x83\x98\x50\x27\x15\x1c\x8d\xc1\x35\x9e\xea\x7d\x3d\xe8\xd4\x9d\xd8\x6c\x3c\x57\xaa\x38\x08\xa0\x10\x18\x58\xb7\xb7\x42\xc7\xf1\x69\xa3\x27\x38\x0e\xfe\xed\x4d\xd2\xc4\x4e\x80\x0b\x9d\xc9\x7d\x66\xc3\xc5\xcc\x75\x9c\x2e\x0c\x64\xaf\x82\x82\xb5\x31\xdc\x66\x34\x24\x87\xe8\xfe\x4c\xa0\xf6\x57\x56\xf7\x56\xd4\x2f\x74\xb0\x43\x2f\xe9\xc3\x81\x1c\x68\x4b\x6e\x3e\xa9\xf7\x76\x8d\xb9\x0e\xa2\x19\xa0\x65\xa5\x8a\x60\x96\x71\x35\x18\x2a\x94\x99\x7a\x0b\xad\x36\xdf\xd4\x0b\xf8\xe3\x1f\x15\xbd\x8f\x8a\x81\x8f\xea\x34\x5d\x7f\x67\x9f\x7c\x52\xdf\xf4\xd5\x32\x05\x91\x6a\x55\x67\x8d\x1a\x50\xea\x65\xf9\xb5\x07\x1c\xfb\xf8\x51\x6c\xb7\x46\xde\x72\x65\x46\x49\xfc\x83\xbb\x42\x7e\x29\xa4\xa2\xda\x46\xf5\x41\x15\xc2\xe1\x3e\xda\x38\xe4\x9d\xff\xf7\x5a\x07\xfa\xf9\x5e\x9b\x5c\x75\xda\xd3\xfc\x7a\x5a\x2d\x97\x0d\x17\xa0\x3e\x19\xcf\xc2\x4e\x9b\xe3\x63\xeb\x26\x87\x1e\x80\x67\xd9\xe0\x1e\x94\x6f\x02\xf0\x20\x3d\x96\x43\xbe\x09\x54\x1d\x1f\xd9\xd0\x4e\x16\x5d\xeb\x47\xca\x38\x59\x64\x99\x96\x74\x0d\x17\xe8\x78\xa2\x0f\x05\xe6\xd6\xb5\xc8\x2b\xcb\xa7\xd7\x61\x83\x3f\xc9\x0a\x0c\x9b\xf3\x49\x75\x34\xdf\xdc\x06\x03\x3e\x76\x25\x5e\xc7\x5b\x1a\x73\xa0\x77\xda\xea\x60\xbc\xa9\xe4\x71\x76\x95\x27\x4d\x34\x3b\xb8\xdf\x84\xcb\xd4\xff\xc9\x87\x93\xf6\xc3\x9f\xf0\xcd\x4f\x1d\xa9\x23\x1f\x1b\xb2\x5c\x6f\x29\x2c\xa1\x39\x1b\xf4\xe0\x8e\x39\xfb\x05\x50\x3f\x88\x60\x08\xd2\x14\x00\x06\x9e\x6b\x12\x7d\x08\x2c\x91\x08\xc8\xb4\xd0\x61\x29\x27\x84\xd6\x45\x30\x0a\xc1\xde\x9c\xd3\xc9\x0c\xd1\xa5\x3f\x3e\xd8\x13\xab\xe7\x47\xb7\xf3\x47\xfb\x6e\xb6\x37\x1c\x4f\x1f\x25\x3f\x27\xff\xe7\xbb\xfc\x40\xff\x6d\xda\x7d\x8c\x46\xfe\xff\xd1\xec\x8f\x34\xeb\x7f\xbe\x76\x3f\xb5\x6d\xc3\x34\x73\x98\x26\x9e\xe4\xd3\x74\x7d\x26\x34\xd4\x4c\x90\xab\xb3\xbe\xe1\x49\x9d\xae\x83\x07\xef\x5e\x3f\x20\x73\x7b\xb7\x44\xb9\xdd\xa1\x5f\xb7\xc3\x3d\x91\xcb\xe9\xb7\x60\x32\x43\x0f\x14\xcf\xe4\x07\x41\xc7\x3d\x25\x9c\x02\x4a\x56\xf2\x91\x0f\x6c\x93\x95\x95\xff\x13\x3e\xd0\x16\xd0\x57\xbd\xe3\x05\xbe\x83\x4f\xc8\x23\xaa\x2d\x71\xcf\x9e\xc0\x22\x6e\x89\xaa\xd8\x6d\xca\x4f\xfa\x0a\xe4\xb4\x4b\x7d\xd2\x97\xac\x52\xf2\x96\xf7\x29\x5f\xba\xa9\xea\x0c\x4b\xb4\x97\x9b\x8f\x7c\x66\x25\x33\x5a\x65\x3e\xe5\x33\x56\x19\xd9\xb2\x4f\xf9\x8c\x6e\x99\x73\xa5\x1d\x2e\x83\x8c\x9e\x1e\xba\x8c\x6f\xab\xbc\x14\x56\x59\xb8\x1d\xdd\x5f\xd4\x9a\x28\xe7\x8e\xfc\xf1\x0f\x5a\xed\x94\xc5\x3e\xed\x5b\x56\x21\xeb\x0a\xf8\xf1\x8f\x99\x71\x74\x2e\x7e\x1f\xfd\x9c\x29\xd6\xca\xf6\x86\xcb\xe0\xfb\xf6\xbc\xf7\x1a\x90\x55\x9a\x92\x2f\x8e\xb6\xb2\x57\x32\xc9\xb2\xb6\x9c\xbc\x0a\x7e\xea\x17\x77\x57\xa2\x4e\x52\xf5\xd1\x86\xd7\xe2\x4d\x72\x75\x8c\x25\xea\xd8\x6e\x79\xef\xac\x62\xaf\xab\x65\xaf\x68\x17\x13\xa5\x67\x6b\x06\x04\x53\x5b\x1a\x8a\xe4\xea\x75\xfe\x37\x1f\x54\xbe\x28\x00\x49\x1d\xec\x3f\x20\xb4\x60\x7f\x05\x2d\xf5\xd4\x61\x56\x93\x69\xba\xa6\x39\x89\x95\xa7\xd4\x3f\x82\x7c\x52\xfc\x57\x4e\xc8\xa1\xdf\xfc\x26\xe0\x30\xb3\x5a\x2e\xdb\xf1\xaf\x1b\xc0\x63\x9a\x1f\x1b\xf7\x48\x9e\x20\x3c\x7d\x52\x6d\x36\x49\x99\x05\x9e\x19\x48\x39\x3c\xae\x5c\x67\x68\x68\x8f\x2b\x78\x06\x46\xec\x98\x51\x98\xbc\x4d\x2e\xf2\x4b\xf7\x42\x59\x6a\x84\xbd\x24\xa3\x49\xcb\xfa\x94\xd6\xbd\x12\x55\x1f\x10\xae\x47\x5e\x26\x13\x3b\xde\xbe\x12\xef\x97\x2a\x98\xe4\x34\x5d\x4f\x66\x84\xc0\xc3\x79\x48\x86\xde\x03\x96\xf4\xd4\x06\x88\x0b\x20\x9a\x66\x7d\x21\x02\x55\x7e\xec\x26\x9c\x42\x60\x71\xfb\x13\xa7\x84\x96\xd4\x1b\x9b\x71\xf3\x5a\x68\x78\xcc\x76\x8e\x4a\x3b\x2b\x68\x76\xd1\xed\xdb\x64\xa6\x7a\x57\x0c\x74\xe4\x9e\x36\x86\x64\x2c\x86\x8c\x72\xc7\x85\xce\x51\x58\x10\x46\xa6\xca\xc9\x8c\xda\xe9\x9d\xe6\x93\x43\xed\xa0\x26\x95\xb4\x84\x15\xe9\xa0\x4d\x05\x35\x80\x08\x77\x65\xff\xff\x0b\xeb\xc5\x32\x9e\xa9\xcf\x59\x18\xd7\x93\x09\xe9\xf4\x7f\xb0\xcf\x94\x2f\xea\x36\xc8\x2a\xc6\xcb\x94\x0c\x8f\xc6\xf7\x89\x87\xbe\x77\x2c\x9a\x20\xe2\x93\x28\xf2\x24\x77\x2c\x6f\xe1\x8e\xd4\xdc\x2b\x94\x07\xa3\x98\xa4\x5a\xee\xf9\xc9\xe4\xa8\xf4\xa8\x07\xe1\x02\x60\xdf\xb9\xba\x92\xe1\x4a\x3a\x99\xe4\xcd\xba\xb5\x5c\xc2\x4b\xd2\xf0\xc5\xe1\x2f\xfe\x09\xec\x7f\x4e\xe5\x62\x6b\x95\x96\x89\x53\xa1\xba\x83\x21\xe1\xca\xdb\xfa\x6b\x95\x54\xb2\xb5\x00\x1c\x9e\xbe\xae\x72\x54\x42\x04\x99\x12\xdd\xcb\xaf\x79\xe1\x86\x26\x4c\x3e\x04\x35\x10\x42\x94\x1c\xd9\x2c\x65\xdb\x66\x1e\xd4\xb6\x2f\x27\x33\xc1\x56\xb8\x64\x4c\x59\x82\x0f\xf3\x30\x4a\x68\x3d\x6d\x44\x9e\xbe\xbf\x35\xfe\xa5\x75\xdb\xa7\xa2\xb0\xb0\xd1\x86\x82\x19\x8f\x02\xce\xf2\x62\xc1\x1d\x58\x81\x8e\x85\x2f\x2f\x9b\x5d\xcd\x5f\x55\x45\x21\xe9\x6c\xac\xd1\x39\x4c\x68\xe7\x75\xbe\x14\xb4\x64\xb2\x64\x7d\x7b\x27\x1c\xdf\x00\x30\xf2\x45\x13\xe7\x66\xb7\xdd\xd6\xbc\x69\x9e\x65\xb9\x72\x4c\x77\x4d\x80\xa1\x1e\x36\x82\x70\xba\xf2\x82\x37\x62\xdf\x1c\x96\x79\x99\x14\xc5\xed\x5d\x37\x17\x00\x20\x0d\xd5\x3a\x33\xca\x4f\x30\x8d\x6d\x0a\xa0\x2e\xdf\xb6\xcb\xa6\x2a\xba\x36\x3c\xba\xa6\xf7\xfc\xf6\x35\xff\x37\xd8\x01\xc0\x70\xbd\x05\xc3\x9e\x01\xdb\x9b\x07\xef\xfe\x5b\x5b\x56\x71\x79\xec\xd8\xc5\xc1\x00\x35\x6a\x0a\x49\x3e\x82\x47\xa1\x4d\x08\x3a\x19\x59\x69\x8d\x8d\x55\x98\x76\x87\xbf\xe6\xb2\x2e\x82\xa8\x25\x81\xa0\xe5\xd8\x3b\xf1\xc6\xd8\x85\x36\x62\xa7\xea\x76\xda\x76\xaf\x5d\x05\x69\xaf\xcf\x5d\xaf\xe3\x4e\xf4\xb9\xb6\x55\x2f\x92\x6d\x33\x60\xdd\xfc\x7b\x12\x70\xda\xc9\xb6\xc8\x2f\x69\x4d\x55\x74\x39\x83\x0a\x72\x68\x5d\x67\x14\x27\xc1\x3f\x88\x3a\xf9\x81\xdf\x36\xbe\xaf\xaa\xe9\xbd\x81\x7a\xf6\xfb\xce\x6b\xfc\x0e\xbc\x3b\xa8\x58\xe1\xb1\x63\x39\x35\x38\xa6\x9c\x50\x33\x7b\x90\x01\x03\x1b\xbc\xe7\xb7\xdf\xa9\x54\xe5\xd5\x4f\x03\x3b\xdf\x7e\xdf\x56\x2a\x57\xf1\x6b\x11\xd4\x84\xfe\x86\x71\xff\x47\xa3\xb2\x1d\xdd\xcc\xa1\x1b\x3f\xcb\x36\x4b\x42\xa9\x66\x66\x04\xb4\xc7\x32\xe9\x19\xb9\xed\x9b\xc3\x82\x34\x86\x3d\x35\xe5\x43\xa8\x4b\x6a\x1f\x03\xd6\xd5\x7e\x0f\x45\xba\x39\x07\x37\xf8\xfc\xc1\xbf\x56\xd5\xe2\x62\xf2\xc7\xa5\x59\xb0\x11\x9f\x6e\x2a\xa0\x55\x4e\xdd\xe4\x40\xa2\xc1\x7a\xbb\xb9\x08\x6c\xac\x5d\xa1\x82\x3b\xeb\x51\x58\x17\x7d\x7f\xa4\x51\x20\xa6\x22\xa9\x57\x5c\x80\xb7\x27\x3c\x8d\x58\xd7\x81\x60\xc5\xc5\xf3\x9c\x17\x59\x40\x00\x7d\x42\x83\x38\xa4\xbb\x86\xbd\x09\x7e\x02\xf8\x05\xe5\xd1\x44\x08\xb9\x2b\x7c\xbf\x39\x9b\xcd\x7c\xff\xf4\x4b\xc7\x26\x29\x90\x1b\x45\xb6\x14\xf0\x73\x25\x19\x31\x84\x4a\xe5\x89\x79\x87\x88\xcc\x1e\x33\x96\xef\xf7\xc2\x4c\x8e\x0a\x40\x97\x15\xf0\xb5\x58\xb2\x59\xb2\x9f\xf3\x1c\x63\x0f\x8d\x4a\xdf\xff\xea\x2b\xc6\x72\xdf\x1f\xbd\x12\xbe\x1f\x5c\xcd\x85\x31\x07\x13\x96\x39\xd8\x80\x27\x85\x42\xe5\xa6\x5e\x2a\x0f\x67\x20\x7d\xa3\x2b\xdf\x97\x55\x7e\xf1\x18\xaa\x14\xee\x1a\x51\xb5\xf9\xbe\xf1\x4a\xb0\x98\xd8\xe1\xd4\x00\x2b\xa7\x33\xd5\xc6\x07\xef\xae\xac\xc0\x62\x69\x5d\x35\xcd\x3a\xc9\xeb\x77\x57\x7a\x2d\xf4\x04\x49\x26\xb4\x0f\x71\x7d\xda\x3a\xb6\xf9\x3a\x7f\x3b\xfb\xb5\xcc\x15\xc8\x0f\x9b\xe1\xde\xef\xd1\x8a\x0c\x87\x24\x78\x11\x70\x27\xce\x99\x69\x8e\x47\xe8\x46\x18\x37\x0d\xd8\x98\xbb\xad\x27\xf7\xa3\x93\xbc\xa9\x76\x0d\xaf\xae\x79\x2d\x5f\x91\xc3\xcb\x7b\xaa\x5b\x0e\x57\xb7\x3c\x5a\xdd\x41\x5e\x36\xda\x0d\xbd\x85\xa5\x2c\x57\x87\xb3\xbe\xd6\x2a\xba\x01\xe0\xc1\x9a\xb3\xea\xb6\x85\x0e\x36\x15\x2c\xff\x57\xf6\x42\xc7\x79\x6f\xbf\x57\xbb\x00\xbc\xea\xf5\xea\x30\x63\xbc\xdf\x5f\x41\x88\x2f\x65\x61\xd8\x8a\xc5\x54\x0f\x50\xfa\xa5\xac\xc8\x63\xb4\x14\xac\x19\xdb\x19\x5b\x4c\xb5\xa3\xd1\x3f\x0a\xfc\x04\xa1\xd9\x10\x91\xea\x66\x9d\xa7\x6b\xc9\x2c\xa8\xc7\xb3\x59\x48\xf6\xfb\x91\xda\x28\xfa\x50\x18\x32\x57\xd7\x56\x64\x75\x94\x93\xd8\x7b\x77\xe5\x81\x55\xeb\x31\x24\x1c\xa4\x85\xff\xed\x8d\xeb\xb1\xf7\xdf\xde\xc7\x49\xe1\x01\xfc\x15\x4b\x88\x49\xe7\x0e\x64\x55\xfe\xc0\x6f\x5f\x49\xc6\x40\x12\xec\x03\x3a\xca\xac\x0a\xba\x29\xe8\x75\xd1\x3b\xfe\x60\x6e\x45\xbe\xe1\x26\x92\x44\xd5\x68\x98\xf9\xab\x9d\x10\x55\xc9\x6a\x8b\xf5\xbc\xed\xcc\x2f\xb0\xf1\xda\x6f\x05\xe6\xda\x4c\x55\x3d\x4d\x52\x91\x5f\xf3\x37\xd5\x4e\x8e\x60\xad\x9a\x27\xb9\x96\xaa\x16\x0d\x24\x07\x92\xae\xe5\xcb\xa0\x1e\xe4\xb7\x24\x7f\x07\xab\xad\x25\x10\xf4\xcf\x3a\xa8\x2d\xf8\x6a\x39\x65\x41\x05\x11\xe0\xd0\xf1\x85\xd7\xe8\x50\x96\x5c\x15\x92\x14\xd2\x7b\xdd\xdd\x86\x0b\x85\xca\xbd\x07\x57\xc1\x85\x3d\xd3\xb9\x72\x14\x95\x8c\xda\x0b\xf0\xa9\x4b\x58\x3e\x1f\x12\xe7\x1b\x0f\x53\xcd\xd7\x6e\x0a\xdf\xdf\x14\xd3\xb4\xda\x6c\x93\x9a\x2b\x93\xd1\x79\xb0\x2a\xd8\x46\x2d\x3f\x4f\xd4\xf9\xb6\xe0\x1e\x89\x56\x85\xef\xaf\xfa\x79\x37\xc8\xd2\x5d\x17\x2a\x85\xae\x74\xc9\xac\xda\x5d\x41\x49\x59\x9f\x9b\xc7\xd4\x8e\x3a\x66\x0f\x03\xcd\x11\x6d\x9d\xe5\xc5\xbf\x04\x9c\x68\x57\x36\x3a\x03\x3e\x41\xbb\xe6\xa9\xa8\x37\xad\xdf\xe1\x40\xb2\x1c\x84\x60\x94\xef\xf7\x23\x77\x69\xa1\x01\x24\x72\xff\xde\x93\x22\x4f\xdf\x7b\x9a\x65\x51\xad\x95\x9b\x23\x61\xde\x53\xfc\x35\x4e\x22\x3d\x00\x40\xc3\x83\x84\x79\x6f\xf0\xf7\x38\x21\x14\xf6\xc7\x3f\x92\x20\x01\x43\x42\x3e\x47\xef\x96\xe8\x14\x9e\x5f\xe4\x59\x56\x70\x4f\x7b\xb9\x90\x71\x02\x50\x4b\x1f\x67\x12\xe0\x72\x84\x97\x00\x3a\xe2\xae\xa5\x70\xfe\x3f\x60\xeb\x73\x86\x21\x41\x5d\x06\xfe\x7e\x76\x3d\xc7\xcd\x5c\xd2\x9c\x26\x72\xa1\xf9\xbe\xec\x61\x39\x77\xd7\x15\xb2\xb0\xc5\xdc\x5a\xcf\x4f\x83\x3f\x73\xb9\x14\x43\x12\x89\x1e\xef\x20\x08\x72\x01\x25\xed\x47\x2b\x36\x20\x83\x5c\x20\x9a\x44\xe0\xa5\x55\xb9\xcc\x57\xbb\x1a\x41\x8b\x3c\xb9\xbe\xf3\x79\xae\x0a\x44\x77\x07\xd7\x34\xb6\x9c\xee\x4a\x88\xa7\x85\x0f\x2c\x78\x32\xaf\xad\x33\xbc\x36\xac\x41\xad\x8f\xc1\xb9\x27\xaf\x89\x09\xac\x38\xb3\xf4\x60\xee\x40\xde\x1a\xb5\x6b\x82\xcf\x51\x2c\x1a\x29\xb9\x3f\x35\xb0\x43\xa8\x0c\xd1\x61\x8e\xf1\x17\xc0\x12\x19\x90\x53\xeb\x85\xa4\x3f\xba\x45\x3a\x1c\x5b\x39\x4d\xb2\xec\x27\x7e\x03\x65\xf0\x91\x5d\xcd\xed\xd6\x6a\x46\xc6\x14\xd8\x54\xd7\xfc\x65\xf9\xb4\x4e\x56\x50\xa8\xfd\xc9\x46\x81\x2c\x8a\xdd\xb3\x4a\x22\x60\x16\xe2\x96\xa5\xad\x15\x77\xdc\xf2\xf2\x92\xd2\x3c\xad\xab\xad\xef\xff\x81\xc1\xf5\xdc\xd5\xd5\x0e\x4e\x0d\x22\xa2\xb4\x75\xf2\xe5\x84\x9c\x4f\x66\x32\x95\x07\xf0\x46\x61\xed\x96\x97\x44\x4b\x1f\x39\x39\x0b\xe5\x91\xf0\xe1\x17\x5e\x9c\x87\x04\xf3\x96\x88\x36\xcc\xc9\xb9\x79\x77\x16\x92\x81\xe5\xa5\x6f\x85\xfa\xe8\x4d\x24\x05\x4d\x59\x5d\x76\x34\xf5\x10\x25\x6f\x98\xe0\x12\x73\x37\xb2\xfd\x7a\x95\x0f\x22\xa6\xf3\x22\xb9\xcd\xcb\xd5\x37\xc5\xae\x06\x74\x2c\xd8\x51\xeb\xa4\x79\x8e\x34\x68\x7e\x34\x23\x1b\xcd\xa2\xef\xf0\x1a\xb2\x11\x41\x09\xe8\x87\x5b\x5e\x4f\xab\x9b\x92\xd7\x4f\x5d\x06\x47\x72\x3e\xe9\x27\xe4\x43\x35\x67\xa6\x72\xea\x2e\xa1\x67\x30\x8a\x6c\xe8\x6e\xe0\x65\x85\xd5\x27\xfb\xbd\xbc\x1e\x71\x42\x73\xb5\xa0\xf6\xfb\x9f\x4b\x2d\x2f\x41\xbe\x17\xfe\xcb\xf5\x7a\xa5\x95\xef\x8f\xb6\xfb\x7d\xe1\xfb\x5f\x33\xd6\xcc\x87\xcf\xa7\x23\x6d\x9e\x5e\x55\xd9\xad\xa2\xd5\x77\xdb\x1a\xa2\xdd\xa2\xef\x61\x04\x28\x6f\xe5\x80\xdb\x76\xd4\x49\x84\xb8\xd7\x8e\x7e\x39\x61\xc9\x7e\x0f\x02\x9a\xe4\xaa\x91\xd7\x90\x22\xe7\xa5\xf8\xe7\x44\xe8\x27\x32\xee\xbd\x7d\x6b\xde\xbe\x25\xe7\x6c\x16\x1e\xe8\x6e\xc0\x9d\x3e\x91\x87\x69\x7c\x7c\xb5\x84\x47\x56\x4b\x4a\x53\xf0\x04\x67\xa3\xdc\xda\x72\x92\x8d\xfd\xa4\x49\xff\x68\x3e\x33\xe9\xcb\xfb\x26\xbd\xf7\x52\x4d\xfa\x3d\xeb\x33\xbc\x9f\xdf\x18\x9a\x1f\xda\x19\x1a\x24\x0d\x03\x89\x01\x5c\xfd\x73\xca\x69\x42\x06\xa2\x9b\x14\xbe\x0f\x7b\x23\xee\x6f\x62\x58\x8e\x31\xac\x53\x1d\x04\x98\xa6\x2c\x01\x80\xa5\xcc\x90\x11\x88\x07\x6d\x28\xe4\x48\xaf\xd8\x79\x50\x61\x56\x1b\x6c\x80\x36\xac\x3a\x9f\xcc\xe6\xd9\xa2\xba\x8c\x94\xf4\x18\x3c\xf2\xa3\xa0\x51\xb9\x4d\x04\x0c\x5a\x59\x29\x08\xd9\x4d\xad\xd3\x80\xb1\x1c\x0e\x11\xd2\xee\xa0\xa0\x61\x76\x9d\x14\xe0\x39\x90\xf3\x05\x84\x8e\x8a\x4d\x66\x2d\xc0\xc3\x8e\x5d\xe1\xe5\x5d\xd5\x13\x37\xcc\xb4\xfd\x1f\x65\xd0\xd0\x9d\x96\x15\xef\x50\x50\x6c\xf6\x62\xb4\x3b\xe8\x8f\xce\x27\x33\xc6\x2a\xd9\x57\x8d\xb4\x43\xeb\x24\x48\x20\x4a\x00\xcd\x4c\x6c\xdf\xe6\x92\xd0\x8a\xd0\xbb\x46\x6d\xba\x99\x81\xc4\xf8\x1c\x16\x96\x77\x20\x24\xd2\x35\x9c\xcf\x7c\x1f\x02\x7d\x2b\xd5\x87\xef\xe3\x61\xa7\x7b\xec\x0c\xb2\xfd\x35\xed\x18\x58\x11\xfd\x61\x9d\x56\x8d\x67\x44\x1e\xf8\xf7\xb6\x40\xcf\x2d\x89\xfe\x59\x06\x09\xad\x68\x43\x3f\x23\x51\x50\xb1\x10\xfb\xa4\x90\xd4\x17\xcd\xa5\xac\xe9\xb3\x36\x3f\x2c\x8e\x35\xab\x5b\x76\x7f\xab\x38\xa7\x70\xc4\x4a\x1e\xac\x29\x07\xc4\x93\x35\xe3\x83\x33\x68\xc5\xff\x5f\x5c\x02\x00\x53\x57\x85\x96\xb1\xbf\x82\xb7\x22\x48\xb4\x2c\x19\xdd\x78\x40\x26\x5c\x10\xba\xd3\x6f\xb9\xfd\x96\xab\xb7\xdb\x36\xd2\x44\x06\xdb\xb3\x15\x2a\xc3\xef\x15\xb3\xa1\x38\x5b\x01\x32\xa1\x1b\x27\x46\x85\x31\x5b\xa2\x96\x50\xda\xce\x4f\xe2\xd5\x19\xdb\xc4\x2b\x2d\xf3\xbb\x66\xd0\xa8\x95\x6a\xcf\x2d\xfb\x3d\xb8\xa6\x5b\x5a\x90\x78\xcb\xd8\x72\x5e\x3a\x3a\x94\x9c\x07\x2b\x7a\x0b\x2a\x18\xf9\x97\x90\xe8\x5a\x2f\x87\x5b\xb9\xad\x8f\xe6\x95\x95\x2e\x69\x01\x08\x29\xa5\x09\x89\xec\x16\x50\xdb\xc1\x2c\x95\xb4\x13\x06\xc3\x5a\x31\x25\x2e\xd4\xce\xe2\xa0\x66\xd9\x1c\x80\x8e\xc1\xaf\xef\x4b\x51\xfd\x96\xf3\x9b\x80\xa3\xb3\x0d\x74\xfa\x8a\x3e\x61\x0d\xbd\xc0\xbd\xc5\xf5\xde\xa2\xaf\xd9\x13\xb5\x9b\xe2\x92\x07\x17\x7a\x67\xbd\x26\xe7\xe1\x3c\xb8\x62\x17\xb8\xc3\x5e\xb3\x8a\x07\x4f\x34\x4f\x72\x61\xe2\x86\x44\x90\x45\x97\x61\x8d\xcc\x04\xac\x09\x96\x53\x2c\xeb\x6f\xac\xdb\x2f\x12\xff\xb6\xa8\x2e\xd9\xd0\x3d\x4b\x47\xcc\x91\xac\x37\x7e\xbc\xec\x69\x2c\x24\x65\x0b\x99\x5c\xc1\x92\x52\x4a\xfe\x14\xd5\x06\x72\xe1\x2a\x05\x82\xd6\x60\xb5\xce\x58\xa5\x0b\xa1\xab\x5e\x15\x2c\xc3\xe5\x9b\xae\x5b\xed\x03\x6d\x58\xa2\x5c\xbe\xd1\x39\x69\xc4\x64\x06\xdf\x6f\xa6\xa2\xc2\x67\xb7\x16\x49\x7e\x8b\xb1\xca\xcc\x20\x03\x63\xc1\x6c\xd4\x3a\x48\x85\xd1\x4c\x37\x3b\xdd\xef\xd3\x56\xff\xd9\x56\x04\xe4\xda\x0e\x47\x4f\x2a\xa6\x52\x26\x2a\xe1\xf3\x00\xf0\x9f\x18\xeb\xe8\x6a\xe6\xb3\x68\x32\x23\xe7\x61\x4b\x44\x33\xec\x57\x8e\xda\x19\xdd\xaf\x1d\xcb\x26\xc5\x7e\x1f\xc8\xe4\x09\x74\xe3\x73\xcb\x8d\x6b\x3e\x99\xc9\x56\x56\x2c\x63\x2c\x9d\xcc\xf6\x7b\xf9\x77\xbe\x3b\x0b\xa3\xdd\x79\x78\x40\x5a\x92\x2c\xd2\x71\x50\xcd\xc1\x6b\xec\x92\x6e\x59\x85\x8e\x60\x6b\xd5\x4f\xba\x64\xdb\xf9\x1a\x9d\xc1\xd6\x53\x51\xd1\x15\xdb\xf6\x7d\xd8\xcc\x6d\x5d\x0e\xd3\xd2\x9e\xbf\xd5\x9c\xeb\xe3\x47\xa9\x52\xd5\x56\x5e\xd2\x15\xa1\x39\x9c\x98\x6d\x48\x98\x84\xbe\x26\xf4\xca\xd9\x41\xbf\xc9\x5d\xf2\x99\x42\x13\x59\xb2\x96\x6d\x58\x71\xf1\x4d\xb5\x03\x4f\xea\x27\xc0\xe7\xfc\xc2\x53\x11\x48\x2a\x63\x21\x51\x6d\x5a\x23\xac\xf1\x78\x45\x0b\xeb\x9c\x1a\xa2\x8f\xe8\x00\x6c\xc8\x69\x41\xd7\x04\x10\x73\xfb\x57\x37\xba\x0d\x14\x39\x6e\xd8\x1f\x79\x00\xf1\x37\x82\x02\x95\xcc\x10\x83\x63\xbf\xc7\x5f\x67\xb8\x86\x88\xef\x5b\x8c\x47\xdd\xd1\xc3\xae\xe0\x2e\x21\x1b\x7b\x20\x74\xf6\x28\xb4\xb6\x79\xc5\x0c\x47\x77\xb6\x9c\x8a\x6a\x3b\x9f\x9c\x86\x91\x49\x3b\x5f\x4e\xaf\x2a\x21\xaa\xcd\xfc\x34\x8c\x42\xc9\xc9\x7d\xf4\x33\x36\xab\x67\x30\x1f\xc7\xac\xa2\xf2\xfb\xb2\x01\xf2\xfb\xad\xc0\xf0\x5a\x0e\xa1\x18\x12\x2c\xc8\x3b\xc3\x8a\xcd\x1e\x84\x94\xa3\x12\x82\xf7\x18\xdc\x4f\xe6\xef\x6f\x3f\xf1\xc6\x70\x45\x68\xd2\x8b\xa3\xd0\xc6\x4c\x80\x55\x72\xdb\xb9\x0f\x09\x72\x17\x8e\xe4\x16\x43\x71\x59\xe3\xfb\x20\x19\x9a\x6f\x02\x41\xa2\x6b\x50\x19\xd3\x2b\x2c\x73\x4d\xe2\xe1\xae\x5e\x7d\x2a\xcf\x7a\xfb\x09\xdc\x2d\x76\xa4\x65\x16\x0f\x01\x57\xb2\x85\xe8\x46\xb6\x4c\x12\x1c\x3d\x45\xbe\x0f\xf2\xce\xe8\x94\xb1\x72\x1e\xe4\xbe\xff\xb3\x42\xff\x92\xf7\xd7\x8f\xc8\xce\xfa\xbc\x2c\x89\x1e\xa2\x22\xea\xcf\x79\x5f\x2a\xf9\xa4\x2a\xe5\xf9\xf9\x82\x97\x3b\xf9\xc5\xef\x72\xb9\x1e\x88\xed\x06\x7f\xe5\xa8\x6c\x15\xaf\x54\xdb\xb1\x41\x6f\xca\x80\x53\x24\xe8\x28\x25\xb0\xde\x63\xd4\x5a\x30\xbe\x02\x4e\x57\xe6\x01\x11\x42\xbf\x8e\xd6\x9f\x37\x44\x04\xd8\xd6\x9a\xbf\x35\xe4\xd7\x5a\x94\x1a\x8e\x9b\xb8\x53\x83\x72\x5f\xc6\x38\xf6\xba\x03\x4f\xba\xda\x46\x9a\x20\x62\x81\xa8\x76\xe9\x9a\x37\xa4\x64\xe6\x79\x11\x5e\xea\xfb\x15\x4d\x86\x92\xdf\xa2\x75\x89\xa8\x6f\xef\x4a\xb3\x4b\x31\xaf\xca\xa0\x70\xa7\x32\x3d\x27\xa3\xd9\x21\x5f\x06\xe5\x39\xb2\x3b\xcb\xa2\xaa\x6a\x4b\xc9\x8c\x68\xf3\xcd\x31\xca\x36\xad\x01\x4b\xdc\x82\x9b\x87\xb5\xa1\xae\x0c\x85\x75\xa1\x68\x58\x61\xd4\x26\x47\x2a\x43\xd8\xdd\x46\x11\x8f\xfd\x7e\xf4\x44\x80\x5c\x4c\xcf\xc3\x9f\x50\x71\x32\x01\x5a\xb6\x9d\x14\xd3\xeb\x9c\xdf\xbc\x04\x5b\xde\xb8\x13\xc6\xbe\xd3\xfe\xd7\x5b\x9e\x0e\x45\xb4\x2f\x4c\xff\xd2\x75\x5e\x64\x3f\x55\x19\x04\xb6\x97\x0d\x49\x7d\x3f\xbd\xbf\xd7\xe7\x06\x88\xe2\xe4\x1a\x1a\x4a\x05\x15\x7a\x59\x24\x36\xec\x96\xd5\x08\xc9\xd9\x1b\xad\x11\xe5\x84\x42\xa7\xac\xe5\x7c\x51\x38\xa1\x73\xd5\xe2\x30\xa8\xff\x79\xfa\x1e\x43\xf8\x98\x02\xaf\x55\x81\x3f\xad\x69\xa3\x9c\xec\xf7\x2e\xe3\xa3\xd5\xab\x30\xa6\xba\xba\x76\x73\x79\xc4\xf7\x3b\xdf\xb2\x5e\xd2\x91\x32\xfb\x46\xad\x0a\xe4\x4a\xf1\xfd\x06\x0a\xef\xf7\x7f\x82\x88\xed\x9e\xdd\xcb\xad\x36\xff\x56\xb8\x20\x67\x9a\x30\x99\x91\x61\xf7\xbc\xd3\xca\xc2\xe0\xc1\xbb\xe6\xf3\x74\x33\x69\x26\xef\x5e\x8f\x1f\xac\xa8\xe7\x91\xb1\x75\x79\x58\x73\x3b\x6b\xf0\xaf\xfd\xbb\x86\xbc\x6b\x3e\x97\x19\x4f\xa0\x94\x47\xe8\xb7\xb5\xa4\xb4\xd7\x85\x1d\x6a\x19\xc5\xe7\x3d\xf1\xa7\x8d\xab\x29\xf2\x0d\x1f\x7f\x11\x86\xe7\xc2\xf7\x91\x45\xe4\x46\x0d\x42\x40\x4d\x64\x69\x42\x0e\xb0\x15\xfe\x2c\xd8\x9d\x86\x13\xe9\xc3\x75\x5a\x9a\xb9\xe9\xf7\x65\x2e\xbc\xc3\x81\x7e\x57\xb0\xbb\x03\xbd\x29\x1c\xf8\xa1\x17\x36\xb1\x1b\xf1\x11\x1b\x05\xb5\xef\xd7\x23\xf6\x67\xd1\xa2\xdd\x38\x70\x6f\xcf\x55\xd1\x86\x96\x8c\xcf\x97\x22\xda\x88\xb8\xb4\xad\x48\x86\xe4\x18\x92\x99\x4b\x6a\x41\xe8\xf1\x9c\x1c\x01\xbe\xf2\x29\x3c\xdc\x97\x13\xb5\x86\xf9\x54\xfe\xbd\x2f\x5f\xc1\xc1\xf1\x30\x9f\xc2\xc3\xf1\x9c\xd5\x56\x66\x92\x7f\xed\x7d\xf3\xa3\x5a\x52\x7a\xfe\x21\x64\x81\x5c\x3a\x79\xb9\x9a\x07\x2f\x83\xde\x82\x72\xd4\xa1\x32\xcd\xb3\xb7\x6c\x93\xff\x2d\x59\x11\x71\x5b\x70\x79\x05\x44\x40\x35\xcf\xeb\xe6\xc0\x74\xc0\xd2\x8b\x82\x17\x9f\xf6\x91\xdf\x39\x30\x6b\x59\x6e\x70\x4e\x71\x1d\xde\x7f\x72\xfe\x0d\x76\x64\xa0\x63\x6a\x3b\xfd\xc1\x31\xa5\xb0\x54\xa7\x9d\x60\xd9\x1f\x0a\x27\x58\xb6\x2a\x86\xe1\x7a\xd4\x80\x31\xce\xf8\xfc\x79\xc0\x49\x74\x77\xa0\xcf\x83\xef\x0a\xc9\x91\x1a\xa3\x00\x3e\xbd\x4e\x8a\x1d\x8f\x7b\xca\x90\x7c\x6e\x10\xa8\x73\xca\x01\x09\x97\x2a\x4c\x39\xc7\x00\x0f\x60\x10\xb5\xd1\x57\x84\x19\x01\x5b\xda\x8e\x53\x0d\x3f\x14\x4c\x6c\x56\xa5\x2c\x57\x62\x29\x6c\x33\x52\x95\xd7\x72\x4a\x9a\x05\xb7\x7e\x5d\x2a\x74\xe2\x44\xc3\xd5\xc2\x14\x40\xa9\xab\x12\x18\x9a\x52\xf6\xd6\x01\x2e\x4a\x0c\x5d\x69\x27\x08\x75\x93\xbf\x15\xaa\x3a\xee\xac\xa1\x16\xfb\xf6\x08\x59\x1a\x33\xef\xa4\x3f\xd9\x9f\xe5\xaa\x36\x84\xfd\x96\x5c\x1c\xbb\x53\x06\x40\xd1\xe2\x92\xca\x4d\x51\x24\xb7\xf0\x2c\x7b\xff\x2d\x2f\xa3\x10\x52\xd1\xce\x6f\x34\xa3\x3d\x89\xa1\x4c\x04\x06\x8a\x67\x10\x61\xc2\x56\x11\xc9\x04\x40\x9e\xfc\xbe\x4c\xab\x8d\x24\x36\x93\x19\x4d\x77\xc2\xfe\xe9\x70\x91\xf0\x05\x4b\x8c\x2a\x7f\x9b\xc0\xe4\x70\x4d\xfa\x96\xa2\xe5\x0d\x1a\x75\x34\x5b\x9e\xe6\x49\x81\xe6\xbf\xc0\xde\x52\x3e\x4d\x76\xa2\x82\x16\xf9\xfe\xe8\xd6\xf7\x13\x97\xcb\xa3\xc6\x06\xe5\x23\xbc\xe1\x90\x1d\x17\x44\xca\x3a\x0d\x49\x2f\x8c\x8e\x8d\x7d\xb8\x14\x01\xb7\x68\x04\x30\xb4\x19\x38\xc4\x03\x07\x7d\x5b\x10\xe0\x80\xed\x3c\xd9\x55\x91\xe2\x69\xaa\x5a\x37\xef\x29\x2c\xe4\x56\xc2\xd3\xce\x98\x07\xe0\x55\x8d\x68\x5c\x5f\x75\x58\x23\x72\xb0\x7d\xfa\x02\x72\x30\x6f\x4d\x6a\x2c\x26\xb3\x26\xb1\x11\xf6\xe7\x46\x0e\xa1\x7c\xc8\x0e\x07\x4b\x4a\xdb\x72\x01\xaa\x15\xfb\x3d\xd4\x7a\xe8\x75\xc6\x3e\x8b\x87\x6c\x00\x5e\x6b\x63\x24\x2c\xd8\xb5\x9d\x38\x56\x41\x4d\xee\xda\xaf\x58\x92\x5c\x65\x8e\x21\xdb\x03\x42\x54\xa2\x40\xef\x6b\x9a\xb3\x3b\x5e\x66\x51\x68\xdb\x9d\x06\xb2\x16\x47\xab\x1f\xd4\x47\xf0\x32\x5b\x60\xa9\x36\x3b\xde\xa1\xe8\x8c\x3f\x24\x34\x90\x94\xc8\x7a\x47\xa6\xbc\xcc\x2c\x5c\x66\xcb\x38\x55\xc1\x99\xce\x10\x3d\x1f\xb8\x64\x57\x18\xa2\x14\xb6\xbc\x7d\xbf\x08\x2f\x5b\x87\xe4\x3a\xc9\xf2\x5d\xf3\xcf\x33\x36\x03\xfb\x24\xf8\xf5\xf6\x8c\xcd\xda\x4f\x54\x06\x44\x4a\x47\x8b\x29\xf8\x52\x18\x0b\xc3\x58\x8b\x9a\x64\xea\x44\xc0\x1f\x90\x37\x49\xde\x55\x00\x18\x8e\x5e\xf8\x9f\xd7\xe3\xfc\xf3\xfc\xfc\x8b\x30\x3c\x74\x26\x16\x5a\xa6\x0e\x65\x33\x4e\xa5\xb5\x34\x4b\xb9\xf8\x92\x00\xfe\xc0\x6a\x2c\x89\x1c\xee\x41\xc3\x08\x08\x4e\x63\xee\xe1\x9a\x45\x6f\x6d\x0e\xdc\x61\xbf\x83\xcf\x46\x05\x95\x77\x48\x20\x34\xdb\x9a\x5f\x47\xc5\x44\x1e\xf9\xd9\x19\x7b\x18\x86\xca\xd0\xeb\x00\x06\x00\x9d\x51\x06\x2b\x3e\xab\x3e\xe8\x7f\x9b\x4b\xde\x58\xb6\xc9\x8a\xff\x93\xba\xb9\x44\xb5\xed\x67\x7a\x0b\xb1\x7e\x87\x86\x06\xef\xb7\xd6\x0a\xea\xae\x34\xb7\x76\xe8\x0a\xc3\x08\x98\x43\xd5\x71\xf0\xd9\xb7\x96\xbf\x3e\xfd\xac\x4a\x62\x44\xef\x06\xac\x70\x5a\x13\xdf\x47\x14\xb0\x1c\x3a\x08\xd2\x79\xf8\x8a\xef\xeb\x71\x9d\x28\x6e\xea\xec\x61\x18\x2a\xdb\x06\x8c\x33\xd0\xba\xd6\x39\x1f\xd0\xae\x65\x71\xc2\x46\xf9\x54\x0e\xfa\x7e\x5f\x05\x39\xc5\x67\x32\x57\x97\xc9\x82\x16\x24\x52\x19\x7a\xb9\x54\x56\x87\xf0\x14\x24\x6a\x6f\xb2\xc5\xe0\x4d\xb6\xb0\x6f\xb2\xb4\x03\x1e\x90\x68\x62\x95\x20\xb1\xa2\x2d\x81\x07\x63\xcf\x43\x19\x1c\x1b\xd7\x54\xf2\x21\x85\x47\xcb\xde\x6b\x7c\xea\x4c\x61\x4b\x72\xe0\xd2\x85\xd8\xb5\xbe\x1f\xfc\x04\xd4\x77\x40\x52\x44\xe8\xd3\xc1\x57\x10\x1c\x64\x14\x12\x0a\x17\x34\xf3\x31\x41\x06\x1a\x0a\x87\xc6\xcd\x9a\xf3\x62\x90\x84\xfe\x59\x3a\x24\xb4\x2d\xf7\xf4\xe5\x0b\x30\x7f\x78\xdd\xed\xc9\xd1\xb2\x86\x37\x1c\xe8\xbc\xa1\x3f\x9a\xbf\x68\x03\xa2\x74\xd3\x20\x12\x4a\x78\x00\x84\x69\x9b\xd1\x97\x24\xd8\x71\xec\xe2\xe4\xce\x1c\x20\xdf\xc1\x01\x02\x0c\xc6\x70\x86\x60\x48\x5e\x6e\x1f\x7b\x7a\x53\x18\x8b\xca\xb4\xe6\x89\xe0\x5a\x9c\xf4\xbc\x4e\x56\xf2\x6f\x40\xe2\x27\xb9\xb6\x69\x18\x42\xa0\x86\xf8\x94\x03\xc0\xd4\x7f\x04\xe0\x59\xaa\xcc\x3f\x6d\x93\x45\x78\xdf\xd8\x4c\x96\x2c\xa6\x92\x1d\xee\xbd\x45\xc7\x46\xe7\x25\x74\x91\x1b\xfc\x9e\x55\x0a\x6b\x7a\x9a\x5f\x13\x42\x3f\x0c\x67\xce\xc9\x01\xef\xc1\x14\x06\x92\x1c\x68\xe3\x3a\xaf\x1f\x73\xd7\xce\x97\x41\xe1\xfb\xc1\x68\x48\x73\xbd\xdf\x1b\x1a\x3c\x79\x99\x9c\x81\x19\x19\x54\x6f\x3c\x85\x34\x1b\xd2\x67\x34\x80\xc4\x39\xb8\xea\x8d\x83\xab\x8e\xe0\x1e\x96\xef\x3f\x2c\x17\x3b\x3f\x5f\x2e\x11\x52\xa4\xba\xe1\x19\xf3\xd2\x6a\x7b\xfb\x02\xa8\xea\x40\xbd\x75\xb2\xfa\x7e\x93\xac\xb8\xef\x8f\xb6\x86\x27\xfa\x23\xf0\xf2\xcd\xca\xb3\xec\x16\xbc\x6d\xd5\xe4\xf2\x73\xd1\xc9\x32\xff\xc0\xb3\xf8\x04\x5c\x87\x4f\xc2\xf8\x44\x54\x5b\xf9\xd7\x23\x71\x3d\x6d\xea\x94\x79\xf2\x1b\x51\x2e\x2b\x7d\xb0\xca\x97\xf1\x55\xd2\xf0\xc7\x5f\xd0\x5f\xc2\xe2\xdb\x97\x4f\x8b\xf5\xc5\xcf\x17\xdf\x5c\xc8\x7f\x4f\xbe\x7b\xf4\xcd\xc5\xb3\x1f\x2e\x2e\x9e\x5d\xfc\x08\x09\x32\xfd\xd9\xc5\xc5\xc5\xf7\x4f\xde\x5c\x3c\xbb\x78\x79\xc3\x98\x47\x81\xb5\x98\xde\xc0\x9d\xac\x56\x71\xee\xd8\x8c\xf6\x65\x09\xf2\xff\x32\x43\xcc\xf4\x9a\xd0\x7a\xfa\xa7\x3c\x77\x6a\xe5\x18\x0e\x04\xe5\x9e\xde\x07\x35\x0d\x25\xe5\x04\xfb\x44\x0c\xeb\xf2\x53\x95\xb9\x48\xec\xb5\x5e\x28\x07\x2a\x6f\xaa\x11\x30\x97\xef\x13\x42\xe1\x72\x3b\xbc\xf5\x00\xfa\xfd\x80\xf2\x82\x94\xf5\xd9\x34\xc9\xe6\xa6\xc6\x42\x77\x60\xc9\x6d\x0b\x8d\xa7\xaa\x89\x0d\x66\xb7\x58\xe1\xb5\x62\x85\xf1\x05\xdc\x1b\xd4\x9b\x65\xfb\x06\xc8\xfa\xe0\x17\x6e\x72\xb7\xf2\x0e\x7c\x79\x9b\xf1\x85\xce\x78\x50\xf7\x9f\xa7\x49\x40\xe8\xef\xce\x6d\x68\x28\xfc\x20\xfd\x45\x85\x5d\xc9\x49\xf7\x5e\xa1\xc2\x19\x59\x36\x3f\x47\x98\x48\x2b\x8b\xef\x8f\x6a\xb5\xe3\xd4\x8d\xc9\xf7\x6f\x72\x39\x3b\x60\xe5\xf2\x42\xb7\xe7\xa6\x20\x37\x45\x17\x40\x38\x25\xbe\x7f\x53\x2c\xd2\x4b\x15\x59\x69\x91\x5e\xd2\x3f\x0b\x12\xaf\x4a\x73\x43\x5c\xe6\x65\xde\xac\xbf\x07\xbd\xbc\xfd\x0b\x33\x98\x2b\x27\x86\x6d\xf8\xa3\x68\x45\x90\x19\xf9\xa3\x58\x64\xea\xe6\x1a\xbf\xd5\xed\xa8\x64\x35\xee\xb5\xd3\x93\x17\xf4\x4d\xfe\x37\x2f\xf8\x2a\xbf\xca\x8b\x5c\xdc\x7a\x8c\xad\xb8\x78\x52\x6d\xb6\x3b\xc1\x33\xb8\x03\x2b\x9f\x51\x49\xbc\x40\xe1\xfc\x0b\x2f\x33\x5e\xe3\xbd\xd5\xbc\x52\xf2\x0c\xe7\x3d\xf3\xe4\x20\x7b\xe4\xf0\xa1\xd0\x50\x44\x0d\xfb\xae\xa0\x1f\x0a\x25\x19\x40\xaf\x8f\xba\x61\x37\x05\xac\xcc\x3f\x0a\xb6\xb8\x6c\xd9\xfb\x67\x7d\xe9\xb5\x32\x1d\x51\x61\x47\x81\xdd\x47\xcf\x52\xaa\x5c\x82\x31\x35\x81\xeb\xbe\xf2\xa2\x9b\x97\x6c\x83\x71\x2d\x71\xba\xa2\x9a\x79\x92\x87\xf1\x5a\x49\x72\xd7\x2c\xa0\x41\x0d\x3b\x04\x70\xff\x2b\x68\x50\xcf\x0e\xf4\xa7\x20\xb1\xba\x6b\x83\x8b\xb3\xef\x07\xf6\x4f\x14\xd7\xe0\x2e\xa3\x19\xc3\x82\x2a\x0a\xea\x83\x7f\xbd\x6b\x3e\x7f\x40\xe4\x4d\x40\xb2\x79\xfb\xfd\x83\x77\xaf\x95\xf5\x3f\xe6\x23\xca\x26\xd4\xea\x47\x90\x32\xa7\x2b\x41\x49\x55\x9d\xa8\x88\xd6\x96\x1d\x84\xea\x2a\x18\xfb\x66\xbf\x4f\xcf\x67\x8f\x42\xac\x6e\x94\xab\x5b\x43\xac\x7b\x7d\x40\x00\xcb\x14\x62\xa4\x7b\x65\x25\xbc\x18\x5f\x30\x56\xcf\x53\xc6\xcf\x13\x74\x18\x9d\x6b\xdb\x07\xed\x22\xaa\x07\x20\x0a\x23\x18\x73\xcc\x5f\x59\x82\x51\x6c\xe4\xaf\x65\x2e\xa2\xd6\x5f\x5a\x65\x9b\x0c\x67\xeb\x06\xfa\x94\xbd\x96\x95\xd6\x84\xa6\xcc\x0a\x5c\x9a\xe2\xa8\xee\x98\xe7\xd1\x35\x0b\x31\xc6\x9d\x5b\xe1\xef\xb9\x58\xbf\x49\xae\x1a\x2b\x04\x87\xa5\x77\x48\x1f\x14\x24\xde\xc6\x93\xc9\x96\xac\xc7\xac\xa0\xbb\x31\xf3\xde\x09\x70\x22\x5b\x9f\xa5\xbe\x1f\xec\xc6\xec\x1f\x41\x3a\x59\x13\x42\x77\x23\x96\x19\xf9\x7b\x12\x24\x74\x07\xba\x18\x49\x98\xe1\x6f\x3b\xec\xc6\xc7\x93\xf6\x96\x01\x1d\x85\x66\x93\x2e\x59\x18\x2f\xcf\x12\x0b\x3e\x57\x6f\xd7\xa5\x36\xea\x58\x31\xfb\xf5\x62\x09\xab\x64\xd5\x62\xa1\x30\xc6\x7d\x7f\xa5\xc1\xac\xce\x4c\x13\xa0\xf0\x86\xb9\xed\x8a\xc1\xd0\x66\xa9\x55\xcd\x1b\xba\x31\x41\xb5\x0e\x6a\x37\x42\x90\xea\x5c\x7c\x57\x55\xef\xd9\x80\xc7\xe7\x1f\x85\x8a\x9d\x45\xf0\xd0\xf8\xbe\xeb\x64\xf4\x06\x84\xa2\xdf\x17\xcc\x42\x0d\x7e\x59\xf4\x4d\xad\x71\xc3\xf6\x5d\x0b\x69\xbe\xdf\x07\xb9\x6d\xe8\x63\xdd\x17\x27\xa7\x61\x48\x1b\xa6\x02\x9d\x80\x0b\x98\xe6\x6e\x1c\x09\xd4\x79\x41\x2b\xf6\x12\x34\xb1\x29\xb6\x2f\x5f\x06\x8d\xef\xe7\xee\x28\x9f\xcf\x48\xbe\x0c\xbe\x2f\x7c\xff\xfb\x02\xb7\x0f\xa2\x9b\xbf\x2b\x3d\xc2\x18\xb2\x50\x9d\x22\xff\xa5\x73\xe2\x4f\xc6\x42\x72\x97\x02\x75\x72\xe8\xae\x9b\x0b\x83\xe6\x28\x3c\x62\x3b\xd4\x91\xca\xb6\xc8\x2e\x09\x51\xfb\xaf\x32\x35\x77\xbe\xec\xfb\xed\xc2\x86\xce\x42\x15\xaf\x78\x6d\x38\x2d\xd8\x22\x3f\x04\xd5\x00\x62\xd7\x42\x5c\x1e\x48\x7b\x38\xec\x98\xd6\xe6\xef\xe0\x14\xfc\x5e\x2e\x56\xba\xee\x7e\x72\x32\x8b\xd7\xe7\x2c\x8c\xd7\x93\x09\x4e\xdb\xd6\xe4\x58\xac\x2f\xe9\x92\x6d\xb5\xe9\xcc\x8a\x6d\xc1\x40\x26\xde\xb6\x46\x64\xa0\x26\x38\x0f\xe7\x4b\xb9\x08\x97\xca\xdc\x01\x0c\x34\x48\xa4\x67\xcd\x48\x1d\x7d\x7f\xd4\xcc\x57\x32\xe7\x0a\x73\x1a\x4b\x28\xb4\x69\xea\x03\xb9\xd1\xd5\x34\x5d\x8f\x7f\x0e\x2a\x1d\x97\x92\x90\xa8\x91\x33\x09\xb3\x89\xe1\x83\x1b\x3e\x3c\xb5\x95\xf5\xcb\xf7\x83\x25\x5b\x59\x6d\x34\x2a\xd5\x8d\x8a\x5c\xb5\xa4\xa2\x8a\x56\x18\xad\x2a\x9d\xa7\x8b\xf5\x7f\xa5\xea\x93\x97\x51\xa5\xcd\xda\xca\xfd\x3e\x68\xe6\x6a\x65\x9a\xfe\x59\x62\xd0\xf3\x62\x0e\xce\x5f\x91\xa1\x0d\x10\x97\x0a\x2f\xc2\x1b\x42\xd1\xe7\x11\x5e\xfd\xc2\x13\x70\x79\xdc\x90\x03\x0c\x8c\xef\xbf\x42\x0e\x8b\x82\x6b\x37\x1d\x98\xbc\xb3\x53\xb0\x4e\xee\xa5\xb3\x5d\x9b\x5d\xdc\xca\xe3\x5d\x72\x3c\x83\x9b\x86\x0d\x34\x9a\x4d\x2c\xe9\xd3\x7b\x57\xf4\x0f\x51\x0b\xaf\xaa\xa4\xce\x24\xf3\x0f\x90\xe3\x76\xc2\x50\xb4\x25\x4b\x07\xae\xac\x82\x15\xda\x60\x40\x68\x27\x62\x19\x04\x5e\x32\xa6\xe8\x79\x93\x5c\x15\xd8\x23\x8c\x5b\xdc\x72\x5b\xbc\x13\x73\x4c\x7d\xe1\x65\x01\xc1\xfd\x43\x7d\x3d\xc0\xd0\x48\x07\x88\xc7\x6f\x7a\xa4\x86\xf5\xce\x39\x35\x60\x3b\xd5\x79\x0a\xf2\x66\x7b\xd7\xc1\x09\x8c\xa8\x02\x64\x00\x00\x9d\xe6\xac\xee\xed\x9f\x5c\xee\x9f\x5c\xef\x9f\xd2\xe4\xd0\x61\xd3\x83\x52\x93\xee\xf3\x59\x18\xee\xf7\xb9\x64\xf0\x75\x96\xc9\xec\xd2\x26\xf4\xa5\x85\x80\xd5\x92\x51\x15\x28\x10\xe0\x20\x50\x48\x52\x30\x0c\xc2\x9e\xb8\x5d\x69\xcd\x1e\x31\x8c\x70\xe7\xb5\x1d\x54\x18\x6c\x01\x20\xbe\xec\xcb\x5e\x35\x1a\xc7\xa1\x01\x23\x7f\x72\x57\x30\xe0\xc7\xac\xc6\x69\x9e\xcb\x1c\x2d\x40\xd8\xda\x6a\xd4\x34\x76\x12\x90\xe5\xb1\x60\x28\xba\xf8\x8d\xda\x76\xd0\x8c\x18\xb8\xa0\xdc\xf3\x79\x12\x17\xda\x95\xd8\xf9\x92\xdc\x5a\x76\xf5\xb6\x69\xc7\x4f\xc5\x00\xee\x8a\x01\x0c\xe9\x82\xdd\x0f\xb8\x5d\x77\xb3\x68\xf8\x10\x6c\x5a\xc2\xee\x50\xa2\x15\xe5\x3c\x28\xe1\x46\xc7\x93\x0c\x7e\x20\x96\x64\x5c\x6b\xd8\x7a\xca\x75\x94\xca\x15\x17\x1a\x65\xc3\x15\x87\x69\x38\x81\x3b\x0c\xa4\x47\xf1\x8b\x51\x6d\xf5\xe7\x17\x8b\x57\x06\xe1\xda\x85\x10\x75\x7e\xb5\x13\x3c\x00\x2e\x3c\xad\xea\x9a\xa7\xc2\xa3\xf5\xdc\xf3\x22\xaf\x5a\x2e\x3d\x25\x85\xeb\x66\x4c\xb6\xb9\x48\x0a\x08\x48\x95\xdf\x93\xb7\xd9\xf2\xa2\x48\xd7\x1c\x8c\x06\x46\xb6\x7c\xfc\x69\x61\xe2\xd3\xfd\x11\x78\xb2\xc9\x49\xcd\x93\x23\x97\xf8\xe4\xaa\xa9\x8a\x9d\xe0\xf1\x09\x9a\x66\x44\x27\x93\x19\xdf\xc4\x27\x5b\x8c\x22\x05\x17\x7b\xb8\x75\x47\x27\xb3\xed\x87\xf8\x04\x6f\xde\xd1\x09\x64\xda\xe4\xe5\xc4\x49\xa8\x76\x42\x0e\x7f\x74\x52\x56\xe0\xaa\xc3\x8d\xc8\x67\x21\x2e\xd5\xb7\xe5\x51\xb4\x2c\xaa\x9b\xe8\x64\x9d\x67\x19\x2f\xe3\x93\xb6\x35\x35\x2f\x12\x91\x5f\x73\xf3\xcd\x87\xf6\x37\xc3\xed\x87\xb8\x85\x25\xab\xc0\x2f\x44\x5e\x7a\x50\x2a\xe0\xcd\xc2\x30\xdc\x7e\x80\x33\xc1\x19\x29\x50\xd7\x51\x35\x8c\x1b\xe5\xae\x25\xcb\x5d\x61\x04\x4b\x6f\xb6\xfd\x70\xd2\x54\x45\x9e\x9d\x5c\x15\x49\xfa\xde\x23\x54\xce\x26\xa1\x56\xa0\x8c\xe7\x03\x9c\x15\xa7\x05\xab\xf1\xaa\xd2\xc2\x63\x54\xac\xf4\x7d\x85\xaa\x2f\x2c\x03\xcb\x49\x1d\x59\x66\xd4\xa9\x01\xf1\x07\xab\xa4\x16\x9c\x0a\x42\xd1\xa0\x90\x40\x5d\x34\xb4\x9f\xea\x85\x08\xb8\x3c\x88\x03\x79\xd4\x87\xd1\x64\x26\xb7\x1d\xcb\x9b\x9f\x92\x9f\x82\x94\x0c\x85\x26\xb0\xb8\x77\x73\xc8\x37\xce\xc9\x0e\x15\xd6\x9f\x07\x50\x67\x7a\xce\x1e\x3d\x3a\xfd\xfa\xb1\xef\xa7\x67\x8f\x1e\x3f\x3c\x0d\x23\x99\x22\x1f\x20\xe5\xcb\x87\x5f\x3c\x24\xf3\xd3\x68\x46\x08\xa1\x93\xba\x85\xe1\x3f\xea\x36\xb4\x06\xc7\xcf\x41\x50\x10\x63\xb4\x8a\x87\x47\x4e\xe2\x1a\x22\xa7\x73\x27\x54\x03\x60\x83\xb8\x69\xc6\xc6\x96\x99\x50\x0b\x51\x0d\x30\x20\x21\x08\x88\xd2\xb5\xbc\x56\x99\x3c\x0a\xcb\x5f\x19\xf1\x66\xf2\xfe\xd6\xb1\xd4\x2d\x58\xb9\x48\x2e\xd1\x36\x6c\xc8\x32\xd6\xf7\x0b\x34\x4d\xfd\xaf\x53\x06\xdf\xc8\xcf\xc3\x79\x31\x15\xd5\xb9\xac\x28\xc2\x50\x18\x67\x60\x0a\xdb\xef\x94\xf2\xad\xe8\x44\xb6\xd4\x47\x33\xf8\x91\xda\xaa\xfc\x9c\xcf\xe5\x7c\x47\xa0\x76\xb3\x03\x62\xd6\x76\xd4\xd5\x41\x23\x88\x86\x35\xfb\xfd\x4b\xb4\x4c\xa3\x02\x8d\x4e\x1b\xf0\xbf\xb8\xbb\xe2\x92\x6d\x0a\x29\x2f\xb3\xc8\x19\x4b\x88\x39\x99\x06\x6d\xa4\x05\x3d\x2a\xf3\x2a\xa8\xe9\x64\x86\x23\x8b\x76\x73\x66\x41\xdb\x63\xb3\xdf\xcf\x18\x2b\x6c\x5c\x97\x1d\x6b\x53\x18\xcb\xcf\x42\xba\x66\xb2\xb2\x1d\x1a\x18\xb7\xe1\x7c\x00\x4f\x60\xbe\x3e\x63\x05\xc4\xbf\x5e\x9f\xb1\x6c\x2a\x1b\xb8\x3e\x57\xd1\x45\x7c\x7f\x7d\xce\xb2\x29\x34\xde\x31\x70\x68\x4d\x7a\xd7\x74\x37\x10\xb6\x01\xd9\x67\x67\x4d\xe6\x78\xd0\xc4\xe2\x5c\xce\xa0\x68\x43\x36\x89\x31\xe3\x26\x4e\xbc\xa4\x50\x05\xe3\xe7\x21\x5a\x5e\x27\xda\x22\xb9\x61\xc5\x3c\xc7\x86\x44\x55\x00\x1a\x32\xaa\xfa\x82\xf1\x50\xce\x58\xe3\xfb\xf2\x98\x17\x15\xb8\xaa\x14\x73\x4c\x8f\xaa\x40\xa6\x51\x00\x60\xc2\x0a\x54\x56\xa8\xc4\xf4\x2a\x65\x0d\x2d\xe6\x6e\xdf\xaa\x20\xa5\xb3\x36\x0a\x06\x89\xdc\xd7\x29\x75\xfa\x9b\x1e\xe4\x1d\x21\x48\xc6\x39\xcd\x69\x06\x4d\x5b\xea\xda\x97\x31\xde\x6e\xe5\xba\xc5\x31\xae\x02\x35\xae\xd0\x0d\xc7\x8f\x73\xb5\xdf\xe7\xe7\xa1\xef\xaf\x98\xbb\xed\xf6\xfb\x51\x20\xbf\x90\x03\xed\x69\x63\x59\xd1\x9c\xa6\xc1\x8a\x10\x45\x7f\x96\x07\xc9\x1a\x6f\x28\x86\x2a\x8f\x78\x11\xe0\x53\x6c\x14\xa9\x05\xf0\x80\x89\xed\x1c\xdc\x1a\xee\x83\x82\xaa\xd2\x68\x21\x41\x7d\x26\x74\xec\xfc\xfa\x9c\x09\x1d\x63\x1d\xc3\xd1\x83\xa3\xae\x1e\x14\x74\x09\xe1\x96\xf9\xfd\x5b\x65\x5e\x78\x08\x2c\x03\x46\xce\xea\x22\x28\xa9\x6e\xa2\x1a\x69\x1d\x0e\x8b\x15\xb1\x41\x90\xb1\xcc\x4d\xf3\xfd\xbe\x43\x9f\xd3\xa0\x95\xde\x6b\x70\x45\x4c\x1f\x85\xd6\x1b\x65\x8e\x2a\xcb\x23\xce\x9e\xcc\xd3\xde\x5e\xe1\x30\xdc\xb1\xf6\x1d\x5d\x4b\x56\x1f\xa2\xc5\xa7\x1b\x08\x4d\xcf\x8b\x2d\xaf\x03\x8e\xb0\x80\x08\xb6\x4f\xe8\x96\x8d\xc2\x58\x0e\x4e\x48\xf6\xfb\x34\x18\x6d\x49\xbc\x65\xa3\x19\x8e\xe2\xd2\x3e\x35\xd4\x89\x41\x30\x46\x34\x5d\xb1\x5c\x04\x4b\xba\x26\x73\xef\xc6\x8b\x76\xbe\x2f\x53\x19\x5b\xce\xbd\xd2\x8b\x46\xbb\xfd\xfe\xc1\xbb\x46\xc9\xc3\x96\x6a\x3e\xbd\x2d\xc8\x67\x76\xbe\x3f\xda\xfa\xfe\x68\xe5\xfb\xc1\x8a\x79\xb2\x15\x99\xef\x67\x23\xb6\x22\x77\xf5\x19\x10\x5e\x36\xa3\x69\x40\xcc\x14\xb4\x94\xd7\x44\x12\x97\x85\x33\xb6\x22\xb4\x96\x0b\x6c\x04\x2d\x27\xf8\x16\xef\x80\x15\xc6\xa2\x4a\x68\x61\x61\xc6\x9c\x24\x3c\x48\xe8\x46\x4e\xf7\x66\xba\xce\xc5\xeb\x3c\x43\x37\xc1\x4d\x7b\x36\xff\xd5\x17\x53\x82\x12\x56\x72\xb7\x8d\x52\xd2\x03\x11\x03\xdd\xab\x39\x61\x2b\xdb\x09\xa8\x6f\xfa\xd3\x6a\x27\xe9\x2f\x81\x20\xd3\xbc\x2c\x79\x8d\x09\xfb\xbd\x64\x0f\xa6\x5a\x4b\xa6\xe2\xa3\x3a\x65\x1c\xe9\x59\x35\x99\x3e\xfa\x3c\xc9\xdb\xcf\x10\xfa\x90\xc4\x25\x83\x63\x97\x2b\x9b\x58\x40\x28\xdf\x92\x71\xfd\x79\x0a\x0b\x52\x9b\x2a\xe7\xe0\xf4\x6b\xe7\x1c\x3f\xc4\xbc\x93\x87\x28\x68\x88\x83\x84\xfd\x20\x49\x7f\x43\x4b\x42\xa6\xd5\x4e\x34\x79\xc6\x63\xc4\x51\x38\x0b\xe7\xe5\x19\x0b\xa3\x52\x12\x56\x64\xa4\xc8\x5d\x62\x0d\xa5\x9a\xa1\x72\xcc\x1e\x7d\x5e\x6b\x17\xf4\x04\xe6\xe4\xdb\xc2\x91\x4c\xa9\x70\xdd\x1a\x17\xa2\x48\x1a\x71\x01\x6c\xf2\x4f\x55\x86\xe0\x0f\x56\x1a\xda\xee\xb6\xa9\x70\x8d\x74\x33\x42\x92\xca\x87\x68\x4f\x68\x67\x59\x14\xf2\x42\x8c\xe6\x49\xf8\xcd\x6a\x23\x59\x44\x99\x68\xb2\xad\xea\x24\xe5\xaf\x78\x9d\x57\x18\xcf\x54\xa6\xd5\x3c\xc9\x9e\xbe\x7c\xa1\xf4\x06\x68\x5c\xd2\xf2\x5c\x7f\x3b\xb7\xea\x37\x75\xcb\xb4\x01\x4f\x52\xef\xf7\xf5\x14\x39\x52\x62\xd1\x44\x65\xe6\x63\xc1\xdd\x6b\xcc\xb3\x67\x75\x20\xd9\x41\x9d\x90\x0c\x83\xa0\xd1\x82\x79\x72\x01\x7a\x71\x02\x97\xa8\x0c\xdd\xd9\xd2\x35\xf9\xaf\xd3\xb9\x57\xab\x80\x10\x90\x43\xfb\x77\xfc\x52\x07\xe5\x74\x93\x6c\xb5\xa3\x9b\xde\x0a\x8d\xd2\x61\x31\x55\x8c\x31\x39\x34\x45\x91\x6c\x1b\x3e\x6f\x80\xb4\x37\x68\x8e\x40\x9b\x76\x77\x7c\xe3\x1a\x1d\x23\x3c\xd0\x55\x92\xa1\xb3\x6d\x9b\xef\x57\x37\x0e\x16\x98\xa9\xb3\x3e\xce\x0d\x0a\xb5\x83\xbc\xff\xc6\xb6\xb3\xae\x0d\x86\x1a\x7c\x1f\x04\x16\xaf\xaa\x06\x71\xc2\x75\xb9\xeb\x9c\xdf\xbc\xa9\x00\xa8\x11\x08\x27\xce\x6e\xcd\x42\x24\xc8\x72\x69\xe7\x8c\xc7\x71\xce\x72\x4b\x15\xa7\xa4\xea\xfb\x7d\x3e\xd4\x3a\x7b\xe6\x40\xa8\xd8\x16\xf4\x7d\xfb\xd7\x50\x61\xdc\x09\xad\xcf\x62\x18\x97\x67\x6e\x73\x07\xa0\x3e\xdd\x0c\x8b\xf2\x12\x19\x83\x12\xbe\xa1\x85\xff\x27\x9f\x15\x72\xda\x21\x42\x81\x19\xf1\xcf\xba\x91\xc7\x90\x74\xc3\x31\x07\x9a\x46\x04\x92\x03\x6b\xe0\xfd\x7e\xf4\x7d\x90\x53\x6e\x0f\x6b\xce\x83\x7f\xca\x65\x89\xeb\x2f\xc4\x51\xc4\x69\x43\xa2\x31\x0a\x29\x67\xb9\x3b\x2f\x72\x7c\xe9\xc8\x96\x6b\xd4\xbc\x11\xf3\x9f\x03\x7c\x20\x91\x70\xc0\xc3\xcd\x67\x12\x42\x13\x9b\x23\x20\xb4\x44\xde\xa3\x60\x0f\x25\xb3\x20\xfb\xfb\xe6\x76\xcb\xe7\x5c\xd9\x12\x32\x0e\xc4\x69\x54\xf8\xfe\x4c\x66\x68\x5b\x61\xe4\xac\x50\xb0\xed\xae\xa9\x03\x36\x8a\xfd\x86\xa2\xa6\xa9\x80\x1c\x00\x6a\x65\x44\x91\x71\x63\x4d\xea\x88\xe5\x31\x69\x98\x9d\xa4\x82\x66\x8a\xe9\x86\x27\xcd\xae\xe6\x34\x65\x95\xdc\x5c\x4d\x4b\x18\x32\xc5\xae\x5b\xde\xaa\x93\x59\x5c\x9e\x05\xe9\x3c\x35\x41\xc2\x08\xcc\x79\x1b\x5a\xaf\x3c\x0b\xe7\x50\x51\x94\x2e\xca\x4b\x15\xfd\x55\xfb\xe4\xc5\xc5\x98\x3d\xd4\xc1\x5f\x93\x45\x31\x3e\x45\x5f\x40\x88\xc2\xd8\x30\xa6\xa6\x3c\x63\xff\x14\x81\xac\x08\xc7\x3c\xc2\x29\x58\x94\x97\x84\xee\xc0\x81\x70\x9c\xab\x79\x08\x20\x94\x5d\x33\x62\xc0\xf8\xc0\xcb\x71\x90\xcf\xc1\x89\x0e\x74\x22\x19\xdd\x69\x64\x9f\x1d\xcb\x82\x02\x98\x7f\x8c\xbb\xde\xce\xe4\x8e\x96\xad\x68\x7a\xcd\x9a\x69\xc9\x3f\x88\xd7\xf9\x95\xa4\xb7\x74\xcb\x8a\x79\x7f\x80\x27\x75\x14\xc6\xeb\x78\xcd\xd6\x76\x66\xd8\x83\xf2\x3b\x6b\xba\xb6\xa7\x29\xec\x2c\xcf\x1d\xb2\x58\xbb\x69\xba\x9e\x6c\xe5\x8a\x89\xb7\x63\xb6\x86\x65\x04\xee\x03\xa5\xb9\x8a\xb4\x8a\x9a\x06\x24\x96\x79\xb5\x6b\x74\xcb\x56\xac\x8e\x97\xf1\x92\x2d\xbb\x6f\x4c\x33\x96\x74\x69\x37\x43\x92\x94\x63\xed\x18\xaf\xa0\x1d\xab\x31\x5b\x0e\xb5\xe3\xf0\xad\xed\x30\x90\x97\xb9\x60\x03\xc6\xa9\x88\x73\x84\xba\x6c\x56\x4b\x76\xb2\x64\xf5\x34\xcb\xaf\x99\xe8\xe3\x81\x25\xae\xa0\x4b\x03\x5e\xc5\x3c\xe6\x8c\x77\x09\x1b\x6f\x43\xa0\x8e\x42\x04\x58\xb4\x81\xcb\x82\x79\x04\xbb\x7d\x7e\x93\x67\x2b\x2e\x2c\xf8\xb2\x16\xae\x4c\x91\x31\xe3\x01\xd4\x02\x60\x2a\xbb\x49\xd9\x20\xdf\x1f\xdd\xc2\x71\x45\x94\xf2\x65\x00\x45\x98\xbc\x29\x82\x3b\x2d\xdf\x8f\xe4\x21\xcb\x3f\x88\x28\x77\x8c\x4e\x1a\xb0\x0b\x03\x79\xbb\xa4\xa8\x02\x76\x6f\xfe\x31\xcc\xb7\x36\x3a\x71\xee\xde\x67\xf3\x86\x3f\xa9\xb6\xb7\x4f\x76\xda\xd6\x52\xd9\x71\xfe\x54\x04\x39\x89\xdd\xf6\x84\xd8\x1e\xbc\xa7\x0c\x35\x62\x30\x94\x7c\xde\x01\xb3\xe5\x3a\x9c\x66\x48\x7f\x95\xd7\xb4\x8f\xb4\xfc\x40\x0e\x20\xc3\x76\x24\xf0\xe0\xb3\xe9\x88\xe4\xc1\x1c\x13\x84\xf2\x5a\xb5\xd6\xd7\x8e\xc4\xfd\x8a\xba\x06\x3e\x05\xe8\x14\xee\x13\xf6\xcb\x1b\x95\x85\x7c\x35\x20\xef\x47\xec\x4f\xf6\xb4\x00\xe0\x85\xc6\xda\x27\x71\xfe\x31\xa3\xaa\x86\x0e\x65\x69\x6b\x20\xb4\x42\xe7\x81\xa1\xee\xa1\x14\xeb\x4d\x50\xba\x3e\x89\x24\x7e\x15\x54\xc7\x1c\x22\x86\x3e\x67\x9b\xde\x34\x84\xa6\xc6\x32\x31\x05\xd7\xc2\x7a\xda\xac\xab\x9b\x57\x08\x2e\xe1\x04\x42\x01\xbf\xd2\x12\x6c\x9b\x25\x97\x9e\xe5\x42\x81\x8c\xd0\x5f\xe4\x35\xb0\x5d\x7a\xad\x28\xd5\x4a\xb4\x84\xb6\xdd\x54\x23\xa1\x45\xdf\x4b\xad\xf4\x70\xd4\x81\x23\xb9\xcb\xc0\xa3\x2a\x07\xf0\xb3\xf7\x18\x0a\x79\xbf\x6f\xce\x58\xc7\x5c\x5e\x92\xf7\x41\x3b\x41\x54\x2f\x3d\xaf\xab\xcd\xd3\x97\x2f\x60\xa3\x9d\x6a\xf3\xd6\x92\x7a\x8a\x2b\x86\x76\x75\xac\x88\x05\xb9\xe3\x16\xd7\x7c\x07\x86\x58\x02\xac\x9e\x68\x56\x95\x72\x33\x1f\x86\xea\xc1\x0f\x1e\xad\x08\x31\x29\xef\xaf\x76\xb0\x7d\xae\xed\xad\x5b\x29\xe2\xde\x26\x22\x19\x31\x2b\x15\x52\x10\x3d\x32\xc9\xd4\x08\xbc\xae\xe4\xf0\x50\x27\x57\x55\xf2\xd6\xe6\xb7\x3c\x62\x54\x6d\xb9\x21\x80\x45\xd2\x93\xb6\x65\xcf\xca\x2c\x68\x4b\xa3\xbe\xd0\x35\x58\xb5\x7a\x3f\xd0\x1a\xab\xb7\xdb\x5b\xd8\xb0\xea\xe7\x0e\xb6\xef\x81\x3a\xe7\x49\x93\xd6\x9c\x97\xbf\xf0\x24\xe3\xf5\x8f\xc9\x15\x44\x21\x28\x57\xdc\x45\xdf\x11\x73\xe5\x8c\x72\xdd\xd5\x0e\xd4\x79\x32\x29\x64\x31\x8f\x4a\x46\x4d\xe7\xc2\x0d\x32\x9c\xb1\xdb\x82\x6d\xcd\xe5\x89\x63\xf6\x09\xeb\x88\x61\x04\xbb\x42\x7b\x25\x79\xa8\x8d\x5a\xf1\x90\x30\xee\xe8\xe6\xb3\xee\xae\x66\xda\x41\xe7\x9a\x8a\x6e\xaf\xd7\xd5\xcd\xc0\x07\xe1\x56\x32\x12\xfb\xfd\x48\x7d\x6f\x88\xd3\xde\xef\x83\x40\x7d\x7b\xbf\x97\xcc\x0f\xfa\xda\x0c\xee\x78\x6a\xde\xbd\xd8\x15\x22\xdf\x16\x36\x84\xbe\x20\xdd\xa1\xb0\x8f\xb1\x01\xa8\xa2\x6e\xa3\x86\xf1\x97\x5c\x03\xcc\x81\x8e\x77\x9b\xd9\x1f\x70\xbc\xce\x3a\xf5\x50\x75\x4b\x4e\x37\xe0\x55\xa0\x15\x5d\x2d\x82\x4e\xc9\x72\x6d\x11\x90\xb0\x1c\x2d\x02\x40\x97\xe8\xde\xad\x18\x73\x53\xe4\xd2\xdd\xef\x15\x36\x3d\xeb\xe6\xde\xef\xd1\x9a\xec\xac\x5f\x08\x60\xd8\x61\x95\x15\x05\xa8\xc8\x1a\x25\x03\x53\xa0\xf6\xbf\x82\x2c\x5b\x69\xcd\x24\x33\x63\x7e\xe0\xfd\x9e\xd0\x46\xe7\x59\x6a\x41\x80\x7e\x56\x39\xe0\x9e\x53\xec\xf7\x85\xbc\x9c\xee\xf7\xa3\x66\xbf\x6f\xf0\x11\xc1\x11\x2a\x2e\xb9\x5a\x02\x08\x97\x98\xd2\xa8\x94\x84\x10\x03\x5d\x60\x37\x9c\xa6\x6c\xb8\xab\xcf\x41\xbe\xfc\xb7\x6c\x8f\xac\xed\x4e\x32\xbd\x51\xb5\x08\x2f\xf5\x25\x41\xf2\xf5\x8b\xd3\x4b\x8a\xf7\xed\x28\x3c\xd0\x8c\x0d\x8e\xcd\x9b\x4a\xd5\x93\x60\xfb\x33\x2d\x06\xaf\x16\x95\x11\x92\x9a\x6a\xe9\x9a\xed\xe0\xee\x31\xc7\x3f\x0b\xfc\xd3\x66\x8c\x20\x21\xce\x18\x36\x69\xbd\x58\xb7\xef\x74\x63\xac\xc4\xd3\xcb\x89\xf5\xeb\xe1\xe5\x41\xf2\x26\xa3\x74\xbf\x1f\x65\x1d\xa6\xa0\x3f\x79\x20\x26\xa7\x4b\x79\xff\x93\x49\x4f\xaa\x5d\x09\x68\xac\x5a\x07\x0a\x21\x06\x00\xed\x70\xcb\x6e\x82\x14\x2e\x06\x34\x55\x12\x08\x9a\xb5\x0f\xf2\x05\x51\x8e\xe7\x2b\x72\x77\xd8\xfa\x7e\xa0\x42\xb7\xdb\xb6\x99\x73\xc9\xeb\x28\x61\x45\xb7\x3a\x42\xb7\xe6\x5d\x06\xb6\xe3\xbd\xf6\xca\xf5\x94\x65\xa8\x9d\xdd\x12\x42\xa2\x4f\xc8\x44\x97\xe8\xc0\x21\x79\xc2\x76\x65\xce\xad\x4c\x4b\x12\xd5\x9a\xa4\xc8\x33\xe3\xdb\x56\xa8\x14\x10\xa2\x85\x4a\x1b\xbe\xb9\xb2\xac\x7f\x02\x79\xd1\xea\x6c\xf4\x4e\xe1\xe1\x4d\x1e\x3b\x4e\x3a\x5d\x29\x16\xe9\xcb\xb5\x86\x79\x24\xd1\x93\x7d\x69\xec\x88\xaa\x54\xe7\x49\x40\x94\x14\x79\x90\x05\x36\x24\x3d\xdd\x28\x83\x95\x6e\x79\x36\x0a\x0f\x68\x46\x3b\x40\xd1\xfa\xc4\xd5\x39\xbe\x3e\x04\x5d\xca\x69\x6c\xef\xa9\x0e\x4c\xd5\x80\x11\x7e\x27\x9b\x69\x04\xe6\x34\x3f\xbb\x6d\xe8\x4d\xc8\x27\x91\xd4\x78\x50\x66\xe9\x50\xac\x61\x01\xa6\x43\xc7\xe8\x90\x3c\xd3\x26\x69\x43\xb2\x4d\x87\xce\x75\x07\x54\xb7\xf0\xfb\x52\x32\xa8\x55\xfd\x69\x9d\x91\xfb\xdc\xde\xb9\x7d\xbf\x37\x67\x1f\x4b\x26\x66\x53\x95\x17\x65\xca\x1b\x51\x81\xfb\x7f\x92\x97\xbc\xd6\xa7\xfb\xf7\xe6\x54\x07\xab\x76\xa7\x85\x78\xee\x5b\xad\xf2\xca\x0a\x67\xd1\x1b\xe9\x53\xca\xb0\xc7\xb5\x32\x2b\xf2\xfd\x20\xc0\x63\xbd\xd7\xc1\x80\xec\xf7\x47\xb9\x88\x91\xe1\x22\xec\xa3\xde\x0a\x72\x0a\x12\xe2\x0e\x0f\x13\x80\xe4\x8b\x9a\x2a\x0d\xae\xa1\xdb\x91\xab\x62\xe7\x8c\xae\xc9\x2f\x5f\xf4\xce\x6e\x6d\x9a\x7f\x8c\x33\xc8\xf2\xeb\xee\x54\xda\x38\xc6\xfd\x62\xa3\xb0\xb7\x8e\x53\x9e\x5f\xf3\xec\x79\x77\x80\xdb\x69\x57\x7c\x40\x7c\x6c\x24\x8f\x59\xc9\x1b\xdb\xaf\xaa\x28\x1c\xf6\xe4\x34\x24\x11\x2f\x0d\x83\x37\x74\xe9\xb8\x9f\x28\x38\x32\x7a\x08\xec\xd0\x5d\x02\x5b\x04\x10\xe3\xf5\x75\x52\x98\x0f\x9c\x08\xe4\xa5\x37\x5d\x83\xfd\x80\x77\x1b\x49\xb9\x53\x3d\x3f\x5a\x37\x78\x7a\x1d\xdb\x4e\x3d\xc6\xfa\xbe\xdd\x64\xc6\xab\xa5\x06\xa3\xae\x3e\xe3\x27\x80\x71\x77\xa9\x41\x2f\x13\x26\xcb\x6c\x86\x24\x8c\x06\x54\x20\x26\x43\xaf\x9a\xe7\x47\x09\x85\x33\x4a\x76\xb7\x8c\x6a\x75\x40\x05\xe2\xfb\xa3\xee\xa1\xa2\xb7\x55\xef\xc4\xf8\x24\x76\x54\x12\x9e\x6b\xdf\xd7\xb5\x58\xd4\xbb\x0f\xc6\xe2\xc2\xe6\x5b\x02\xb0\xbe\xe4\x2b\x5f\x06\x0f\x2c\x29\x17\xd6\x35\x51\x1c\xf7\x90\x88\xcb\x48\xc8\x8c\x94\x2b\xb0\x67\xcf\x88\xff\x74\x2b\x45\x9d\xaf\x56\xbc\x7e\x59\xfe\xc0\x6f\x9f\x56\x37\x65\x70\x27\x07\x35\x6a\x1d\x68\x14\x32\x7c\xf4\x15\x75\xe5\x27\x91\x06\x3a\xd5\x4b\x1f\x89\x05\x22\xc3\x43\x82\xa2\x36\x48\x92\x1d\x6d\x95\x22\x31\x03\x0c\x84\xf2\x1f\xfe\x38\xd7\x9c\x7f\x94\x6b\xae\x7d\x3f\x1f\xb0\xcd\x4c\x14\x68\xd3\x8f\x25\x40\xdc\xd1\x5f\x09\x0d\x6a\x64\xa7\x73\xf9\x07\x9d\xcb\x8e\x6e\x74\xb9\xb3\xba\x4c\x8e\x5c\x81\x4a\x5a\x6a\xaf\x3f\xb4\xe7\x18\x5c\x7c\x41\x9f\xe1\x71\xb3\x90\xa3\x7a\x3b\x1c\x22\xa5\xd6\x35\x97\x21\x79\xed\x69\x51\x4c\xf3\x81\x8b\x51\xc1\x12\x7d\x31\x6a\x58\x62\x2e\x46\x21\x63\x05\x00\xf0\x29\xc8\xb4\xdc\x0e\x78\x0b\xea\x06\xe3\x21\x3b\x99\xd1\xb7\x22\x80\xba\x69\x61\x42\x74\x69\x75\x03\x6d\x00\x73\xce\xe4\x68\xfa\xf6\xd2\xbe\x8f\x89\x67\xb9\x05\x2d\xe9\xfb\x41\x23\xbf\xd1\x58\x5e\xb8\xaa\xfa\xb3\xd2\xba\x9b\xe1\xfb\xf3\xb2\x55\x8e\x99\x93\xbd\x30\xd6\xa9\x6d\xf6\x90\xb1\x40\xb0\x75\x1e\xe4\xaa\x32\x42\xe6\x18\xdd\x09\x73\x41\xd8\x25\x50\x0f\xd5\xac\x4d\x01\x96\x3d\x72\xf2\x89\x5e\x3e\x21\x2f\x2e\x32\xa7\x23\xf8\xd7\x68\x85\x34\xc3\xaf\x36\xad\x06\x35\xd3\x4d\x33\x77\x96\x79\x50\xb1\xb6\x27\xe6\x3a\xf6\x34\xbf\x86\x91\x41\x11\x62\x14\x54\x56\x3b\xb2\xf1\x4c\xb5\x44\x15\x68\x53\xa1\x2d\x5d\x0d\x00\x1d\xd5\xed\x08\xb5\x56\xf7\x6a\x69\xb4\x0e\x00\xf7\x40\xd1\x7b\x60\xc7\x4b\x1b\x36\x1c\x5b\xac\x62\xb2\xe6\xd6\x70\x0f\x80\x75\x83\x64\xcc\x1a\x5a\xa9\x07\xb9\xec\x64\x36\xcb\x06\x33\x03\x49\x8e\xdc\x02\xf2\x8a\x3e\x66\x76\x48\x8c\x9d\x02\xa0\x98\xd9\x7a\xb3\xd6\x0a\x66\xe5\x08\x7d\xd2\xcd\x44\xf4\xcd\xba\x81\xfc\x64\xda\xd1\x3f\xa1\xeb\xa1\x72\x9b\xa4\x7e\x0f\x36\x18\xf9\x32\x58\x6b\xbf\x02\x74\x1b\x7f\x91\xd4\xef\x41\x1b\x9b\x2b\x9f\x1a\xb4\x8a\x1d\x70\x68\x38\x19\x70\x00\xe4\xd3\x3c\x63\x4c\x1c\x0e\xc1\x78\xdd\xc6\xe9\x82\xc8\x0b\xdb\x16\x22\x20\x61\x5b\xb9\xd8\x20\x2a\x71\x48\x88\xef\x67\xc1\x3f\xb4\x16\x1d\x37\x29\x95\x1b\x94\xa0\xcc\xb8\x21\x04\x44\xeb\xde\x32\x29\x1a\x80\x7d\xef\x76\x08\x49\x0f\x57\x62\x5c\x8f\xd8\x1a\x82\x25\x7b\xf0\xaf\x60\x5b\xf3\x7d\x96\x5f\xef\xb7\xfb\x22\xdf\x43\xa6\xfd\x55\x4d\x3e\x7b\x90\xeb\x03\x44\x8e\x35\x9c\x1f\x40\xac\x1f\xfc\xeb\xaa\x1e\x7a\x09\xb8\x4f\x7c\x40\x39\xa4\x3f\xb8\xf4\xfd\xd4\x8a\x1f\xb7\x62\x61\xbc\x3a\x1b\x50\x70\x02\x60\xec\x2e\xb0\xdf\x2c\x56\x97\x24\x56\x4d\xdd\x0e\x36\xcd\xf7\x83\x0a\x54\xf3\x4b\x20\x4b\x23\x85\xcd\x78\xe2\x28\x59\xe5\x58\x72\x4b\x57\xd7\xa2\x66\xed\x4e\xc3\xf0\x0a\x01\xb3\xec\xd4\x30\x4c\x42\x40\xc7\xf2\x08\x01\x5d\x5b\x2c\x17\x21\xe5\x23\x56\xc7\x44\x1e\xc6\xb6\x26\x10\x56\xbc\x31\x04\x09\x72\x5a\xd3\x94\x72\x5a\x11\x42\xd7\xec\x1f\x9a\xf2\x59\x0e\x59\x55\x4b\x31\x2b\x87\x14\x12\x12\xef\x2c\xec\xe3\xb5\x79\x8e\xe5\x91\xff\x73\xb0\x23\x8c\xfd\x1c\xac\x09\xd9\x4d\xb7\xd5\x36\x20\x74\xad\xfe\x56\x93\x89\xd1\x11\xed\x16\xe1\xe5\x88\xad\x17\xe1\x25\x6a\xb6\xe2\x1d\xfa\x30\x41\x76\xfd\xc4\xc7\xe3\x43\xeb\x76\x16\xd2\x25\x0b\xe9\x8a\xc9\xa2\x74\x03\x65\xe9\x75\x6b\xee\xb3\xd2\xc6\xa4\x1b\xe3\xaf\xb5\x3d\xbb\xf6\xfd\x95\x6d\x6c\xbb\x25\x8c\x6d\xdc\x84\x98\x8c\xc7\x5b\x33\xef\xb7\x4c\x76\x80\x5e\x41\x0f\xe8\x93\xb6\xfa\x5b\x4d\x00\xe5\x0e\xd7\xfd\x9f\x6f\xa3\x90\xd0\x2b\xfb\xd5\xda\x7e\x45\xe2\xe5\xd9\x13\xdf\xbf\xb5\xbf\x68\x2a\x5a\x4e\x66\x84\xb1\x2b\xfb\xdd\x95\xfd\x4e\x36\x6c\x19\x23\x49\xd9\x99\x1d\x68\x7d\xc2\xf7\x39\x53\x20\x7d\xa0\xc3\x8e\xb7\xbe\xbf\x3d\xc7\x23\xf1\x7f\xfa\xc9\xed\x64\x42\x97\xe3\x71\xbc\x5b\xec\x5a\x29\x15\xbb\x35\xee\x03\x6d\x55\xd6\x52\xfc\x17\xae\xd0\xf1\x03\xb9\x42\xa9\x9c\x1f\x98\x24\x55\x68\x4b\xba\x4b\x79\xfc\x19\xe4\x84\x4d\x7e\x81\x4e\x76\x5b\x42\x5f\x33\x58\x75\x66\x00\xe5\x0c\x98\xaf\x45\xad\xf1\x58\xbb\xf8\xf6\x7b\xf9\x99\xfd\xbe\xe4\xc1\x05\x7d\x4d\xe6\xc1\x75\xa2\x56\xec\x8e\x5e\xd0\xd7\x96\x1f\xe1\x28\x24\x11\x90\xd7\xee\x7d\xcd\x46\x5c\xe9\xdd\x23\x87\xf5\x0a\xdd\x0b\x5f\xc3\xc5\xff\xa8\xe4\x40\x1e\xbb\x9e\x0e\xdf\xb9\xdf\x7f\x2a\xe3\x35\x64\x58\xd5\x51\x3a\xd1\xce\x35\xf9\xa3\xd7\xec\x8e\x8a\xe4\x88\x28\xec\x9e\x2b\xcb\x50\x7b\x8f\x88\xc2\x40\x83\x3a\xc0\x3d\x52\x61\x73\xe1\x28\x2c\x71\x95\x46\x9a\x96\x8b\xce\x18\x1c\x44\x4f\xeb\x46\xbf\x0a\x7b\x9d\x74\xf2\x1c\xe9\xa2\xb9\x19\xdb\xde\x56\x5a\xdb\x61\x31\xd3\x01\x41\xe7\xaa\xe3\x97\xf2\x6d\x0e\x66\xb5\x43\xd7\x5d\xf1\x6b\xa9\x4f\x44\x57\x89\xd4\x53\x7b\xaa\x83\xb5\x53\x43\x1b\x1b\xca\x29\x1e\x32\x2b\x42\x96\x72\xce\xb7\xd7\xd7\x80\x5b\xd9\x70\x6f\xeb\xb6\x5f\x2f\x0b\x62\x9e\x8f\x87\xc7\x6a\x3f\x3b\x37\xf1\xba\xa2\x36\x91\xd0\xfe\x64\x68\xa1\xd3\xa0\x32\x4d\xaf\xd6\xee\x70\x60\x0b\x02\x47\x98\xd5\xad\xd8\x01\xb9\xb4\x67\x79\x68\x63\xbf\x52\x7b\xf3\x9e\x7c\x25\xe7\x59\xa3\x66\xdd\x70\x36\x4c\xc1\x49\xfd\xfb\x5e\x63\x4b\x39\xdc\xe8\x67\xe8\x79\x8e\x0c\xe6\x79\xd2\x08\x63\x00\x39\x60\x3b\xb9\x4e\x9a\x56\x6c\xa0\xf3\x0d\xed\x7b\xe8\x84\x00\xbf\xc5\xd9\x21\xfe\xf7\x7f\x6c\x06\xa3\x25\x04\xf8\x17\x70\x63\x10\xdb\xa2\x8d\x40\x01\xf8\x9a\xca\x1d\x29\xee\xc1\x79\xfd\x2f\x1a\xa4\xfc\x7f\x6f\x5f\x32\x3f\x6a\x47\x02\x23\xfa\x2b\x89\x82\xda\x9d\xb4\x52\x59\x4a\xf0\xae\xa1\x04\x7d\x15\x94\x84\x1c\x3a\xe6\x2b\x41\x3e\xe0\x24\x6a\xa1\xa1\x1d\x84\xd1\x48\xba\x38\x38\x72\x90\x35\x0a\x51\x9b\xc7\xb6\xd9\xd8\x20\x26\xb7\xed\x3a\x15\x6e\x3f\x78\xc7\x95\xe0\x85\xef\x37\xe7\xec\x6b\xe5\x10\x6a\xbb\x41\xbb\x09\x78\x73\xa7\x35\xac\x43\x4b\x37\x3e\x60\x1e\xd1\xb7\x8b\x30\x1d\x76\x7d\x65\x4d\x97\x69\x3d\x5d\x26\x8d\x78\x05\x55\x5b\x7a\x77\xd9\xd6\xc4\xd5\xc2\xe3\x4f\x61\x01\x39\x75\x5b\xa0\xac\x48\xff\xac\x35\xf4\x0e\xb4\x87\x2b\xc8\x86\x12\x84\x0c\x89\x48\xd7\x80\xc9\xa8\x2f\x5d\x1f\x6b\x20\x70\x0d\xb5\x11\x08\x29\x3b\x41\x7e\x73\x02\xb5\x04\xda\x35\x36\x4e\x5c\x93\x1e\x84\x6f\x6e\x7f\xd3\xce\xe7\x83\x44\x43\xa4\x89\xd6\x2a\x86\x7a\x28\xb5\xe9\x9a\x3a\x28\xb0\xe0\x2e\xa0\xe0\xfd\xe6\x22\xfa\xd8\x82\x9d\x84\x68\x48\x81\x27\x69\x33\x40\xf9\x58\x96\x1a\xd6\x0f\x5c\xee\x68\xe8\x04\x81\xf9\x2c\xbb\x10\xc4\x4d\x12\xe8\x26\x19\xe5\x53\x79\x11\xc5\xc8\x70\xd4\xf9\x84\xa8\x3c\x42\xef\x8c\x58\x2f\x72\x10\xa1\x74\x75\xde\x81\x0c\xda\xaa\xb8\x36\x25\xe4\xce\x69\x68\xa0\xd7\x20\xfd\xb4\x26\xc3\xc2\x95\xc7\xab\x43\xf7\x2c\x2a\xd6\xa7\xcd\x6a\x67\xa1\x61\x95\x43\xda\x98\xfd\xde\xda\x79\x9d\xda\xff\x13\x63\x10\x5d\xf5\x27\x58\x84\x98\xac\x1f\x31\x0b\xf9\xf7\x7f\x66\x16\xa2\x4f\x6e\x0b\x9a\x93\x2a\x9f\x6c\x9a\x83\xd1\x08\x71\x31\x41\xe4\xc7\x81\xf8\xfd\x9e\x8b\x35\xce\xb8\x76\x0c\x7c\x2b\x57\x68\xed\x4a\xee\x54\xc8\xf6\x2c\xbf\xf6\x08\x40\x9a\x7f\x2c\xee\x42\xa1\x1c\x86\xee\x05\x1d\x9f\x0a\xfe\xa6\xda\xb2\x21\x4f\x48\x3e\xe8\xeb\x31\x99\x85\xb4\x9c\x8a\x6a\x3b\x2e\xc0\xc5\x22\x01\xa7\x0c\x02\x01\xca\x01\x94\xed\x53\xaa\x02\xe4\x60\xac\xa9\xe0\x4b\x31\x2e\x10\x27\x32\x41\x10\x49\xd2\xc6\xf9\xeb\x2c\x88\x23\x76\x32\xf6\x79\x6b\x89\xdc\xe3\x0f\x28\xc1\x1d\xd2\xad\xf2\xe3\xda\x54\xaa\x04\xb6\x38\x34\x9a\xdd\x36\xf0\x73\x88\x22\x54\x6d\x75\x86\xb1\xb7\xfd\xa0\x38\x0e\x37\x0f\x60\x3e\x0a\x35\x2c\x90\xab\xbb\xa8\x3a\xf7\x1d\x75\xca\x2b\x1e\xb0\x65\xac\x5e\x71\x98\xb8\x2e\x97\xe9\xfb\x3a\xc6\xa6\xa3\x7d\xe8\xf2\x2a\x21\xe5\x83\xac\xc2\x5d\x8f\x6d\x8a\x2d\x01\x5b\x4f\x31\x6c\x76\x0d\x1e\xd2\x35\xe5\x5d\x4d\xd5\xab\xc0\xc9\x88\xc8\xb7\x70\x2a\x06\x7d\x46\x4b\xbb\xc7\x0a\xc9\x2b\xbb\x0d\x19\xfa\x9c\xe7\xdd\x5b\x1b\x50\x27\xd5\x50\x87\x4d\xeb\x0c\xf8\xc7\x74\x96\xfa\xab\xdd\x75\xf7\x11\xc5\xe5\xac\x93\xbf\xa7\x11\xce\x97\xc1\x27\x2a\x85\x47\xb7\x46\xf9\x6b\x86\x60\x50\x03\x6c\x86\x99\x40\xc0\x4d\xa7\x80\x0e\x30\x81\x36\x27\x6f\x04\xb9\xeb\x0e\xc4\xa0\xaa\xd7\x94\xd7\xfa\xde\xfe\x62\x1d\xe2\xe1\x8f\x6d\x8f\x23\x3b\x22\xec\xd5\x7b\x44\xcb\x8b\x6a\xb8\xa2\xba\x41\x8e\xa6\x3b\x27\xea\xc5\x91\xbb\x65\xf7\x06\xa0\x36\xcf\x7f\xac\x97\x05\x73\x12\x75\x52\x8a\x01\xf5\xac\xb0\x5b\xd8\x6d\xa3\x66\xc7\xfa\x6d\x1c\xcd\xb4\xe6\x9a\xbb\xf7\x94\xb0\xa3\xdd\x3d\x0d\x5b\x15\x71\x0d\x2a\x62\x6c\xcc\x7e\x2f\xe6\x01\xef\xde\x71\xb8\xd5\x1a\x12\x05\x03\xf5\x3d\x0e\xc1\xe9\xb3\x77\xbc\x1d\x1d\x49\xcb\xd2\xae\x76\x57\x9e\xbe\xd2\x98\x9d\x6b\xa8\xcf\x51\xda\x65\xf6\xe6\x7e\x3f\xea\xd0\x8f\xfd\xfe\xbd\x08\x6a\xc9\x69\xe6\x5a\x29\xeb\x18\x96\xba\xb7\xe6\x61\x40\x16\x99\x6e\x87\xcb\x77\x8d\x3e\x4a\x56\x2b\x20\xf7\x7c\x19\x94\x18\xf5\x7c\x98\x34\xb6\x01\x3d\x00\xb8\x12\xc9\x4e\x9f\xea\x00\xea\xd3\x95\xef\x3f\x58\xbc\xdb\x2d\xbf\x0c\xc3\x89\xfc\xb3\x5c\xea\xe8\xf9\xad\x57\x76\x37\xb2\x0b\x82\x7b\x13\x8a\x5f\x30\xe6\x8b\xb6\x31\x62\xc3\x8b\xe7\x95\x1d\x86\xc2\x78\x61\xdb\x02\x47\x74\x67\xfa\xea\x34\x7c\xc8\x58\x82\x43\x17\xe4\xcc\x43\xc9\xa0\x47\xe8\x57\x8f\x1f\x3f\x66\x2c\x71\x94\xbd\xfa\xe3\x7a\xf9\x3b\x31\xe1\x77\x65\x56\x79\xe4\x60\x05\x14\x31\x6e\x9a\x79\x19\xe4\x5a\x2c\x5c\x1a\xb1\x70\x75\x96\xfa\x7e\x6e\xb7\xa9\x22\xcc\x6d\x64\x05\xd2\xd7\xca\xa0\x4b\x77\x34\xb1\x00\x8f\x53\xea\x68\x7d\x84\xea\x8f\x4c\x2a\xda\x95\x54\xcd\xbd\xcf\xf1\x99\x7b\x11\xde\xa4\x4a\x23\xbf\xe4\x0f\xf7\xfb\xd2\x20\xc5\xc0\xbd\xf1\x7c\x32\x9b\xab\x29\x67\xc2\x39\xe9\x22\xfb\x67\x69\x7f\x02\xb1\x8b\x8e\x30\xc4\xbd\x37\x8c\x5b\xac\xbb\xf5\x12\x7d\x0c\xf9\xff\x84\x95\x57\xc0\x40\xee\xf6\xbc\x57\xb2\x6a\xd1\x00\xb5\x4a\x91\x44\xe8\x93\xd2\xa5\x11\xdd\x9d\x3f\x24\xdf\xb2\x2e\xb4\xc7\x0e\x5b\x5c\x3e\xed\x7d\xb3\x57\xeb\xa0\x60\xa8\x1f\x08\x1d\x0c\x78\x0d\xf8\x3d\x2d\xd5\xed\x1f\x04\x20\x7c\x80\x90\xc8\x2b\x76\x3f\xd5\x5c\x26\x77\x39\xc4\x3a\xa7\x29\xcb\x07\x90\x92\xc1\xf1\xd0\xf7\x47\x6b\x79\x19\x6a\x0f\x5f\x5b\x4e\xf1\xd2\x6e\xb8\xef\x4f\x66\x4c\xb6\x4e\x69\xd1\x0d\x08\x7c\x42\x7c\xbf\x86\xe0\x82\x09\x09\x6a\x6d\x47\x90\x10\xfa\x2b\x36\x24\xa3\x3b\xa6\x05\x08\x69\xd3\xc8\xf5\x41\x1d\x0c\x63\xe7\xcd\xd2\x7a\x83\xf6\x9e\xaf\xc0\xf2\xe3\xbe\x50\x41\x47\xea\x62\x16\x70\x8d\xa4\x84\x79\xea\xd1\xf2\x78\x96\x16\xdb\x46\xa3\xc9\x84\x36\x9c\x0c\xfc\x7a\x57\x9e\xc0\x3f\x00\xaf\xf5\xc6\x81\x89\x62\x3b\x81\xe8\x67\x93\x47\x44\xf2\xb6\x1a\xe5\xd6\xca\xf0\xcf\xc9\x12\xd9\x7a\x95\x43\x57\xf4\xf7\x04\x76\x69\x74\x32\x0b\xc3\x30\x3e\xb9\x4a\xd2\xf7\xab\x5a\x76\x13\x4a\x17\x73\xaf\x5e\x5d\x25\xc1\xe9\xa3\x47\xf4\xa4\xfd\x6f\x1a\x3e\x22\x5e\xe4\x89\x3a\x29\x1b\xb4\x8b\xf1\xc8\xd8\x33\x75\x3a\xb0\x3a\xf1\x09\xe2\xd6\x4c\x54\xa7\xc2\xb8\xfb\xbe\x8f\xb0\x53\x6d\x93\x34\x17\xb7\x91\xfc\x50\x7c\xb2\xcc\x0b\xc1\xeb\xe8\x24\x29\xb6\xeb\x24\x50\xef\xd8\x23\x12\x7b\xa0\xd2\xce\x58\xc7\x65\x47\x83\x87\xfe\x96\xf3\x1b\xb5\xdc\xde\x4a\x4a\xe6\x46\x82\xa8\x7c\xff\xe3\xe5\xde\x54\x20\xe7\xa5\x59\x5b\x5e\x53\xec\x7a\xe8\xb0\xda\xef\x83\x56\x70\x66\xd1\xb8\x13\x0f\x1d\x41\xba\x5b\x85\x5d\xd3\xbc\x7f\xba\xb4\x8b\xdc\x05\xca\xcf\xa7\x19\x17\x18\x2f\x03\x3f\x79\x21\xf7\xbe\xa1\x0e\x9b\x80\xd0\x3f\xc9\xdd\x77\x42\xcb\x30\x57\x36\x11\xd9\x88\xe0\x26\x2f\xb3\xea\xc6\x8a\xb2\xb6\x72\x1c\x9b\xae\xc1\x82\x36\x5e\x0e\x66\xc4\x0b\x82\x93\xfb\x91\x1d\xff\x65\xd3\xda\x76\x8d\xe4\x6e\xd3\x5b\xf8\x35\x44\xef\x51\x2c\xcc\xe0\x98\xd1\xc4\x9c\x91\xe3\x40\xcc\xd5\xf8\x45\x9e\x47\x62\x3d\x96\xf2\xfd\x2c\x4b\x5a\xa9\x64\x42\xed\xe1\x15\x80\x3b\xa5\xea\xa0\xdd\x8f\xb3\x99\x9d\xf4\xac\xcc\x4c\x2c\xca\xfb\xc7\xde\x09\xf2\x87\xde\x8e\x43\x33\xc8\xae\xd1\x36\xa9\xff\x06\x58\xc0\x61\xc2\xb0\xed\xd1\x81\x1d\x06\xff\xf8\x5a\x9e\xdf\xb8\xf6\xae\x92\xba\x01\xa9\xad\x26\x98\xc1\x10\x15\x65\xa9\xbe\x22\xf7\x06\x9d\xdc\xa1\x87\x02\xd4\x4b\x60\x7d\xa0\x99\x12\x0b\xed\xa0\xfa\xe8\x64\xd8\x1d\x86\x76\x1c\x30\xb0\x54\xa7\x72\x88\xf0\x6c\x8d\xe9\x79\xe8\xfb\x7a\x06\x98\xbd\xf6\xe7\x40\x99\x33\x49\x99\x49\x24\xc6\xe3\xb3\x59\x38\x1f\x5a\xc7\xb6\xca\x2c\xa1\x8f\xc2\x90\x44\xc1\x50\xbb\x54\x34\x72\x67\x2f\x92\x43\xfc\xf1\x2a\x4f\xc3\x10\x8c\xc4\xfe\xfd\xc9\xba\x18\x9b\x4d\xee\x0a\xcd\x34\xa7\x9b\xb1\xf6\x2a\xc9\xb4\xf6\xc3\x92\x69\x61\xf5\x6c\x34\x12\xdd\x1b\xd3\xb0\x2e\x8c\xdc\x75\xf2\x1d\x51\xc2\xcc\x06\x83\xd0\xb8\x30\xc9\xb1\x75\x57\x01\x1b\x22\x0a\xae\x9f\x1a\x5a\x79\x51\x5f\xb2\x9c\x82\x58\x5c\x3e\x26\x1d\x60\x2c\x72\x07\xb1\xbc\x7c\x5f\xff\x3e\x44\x25\x39\x08\x85\x05\xab\xe2\x24\xd5\x54\x40\x94\x30\xf6\x67\x41\xeb\xc0\x83\xcd\xe9\x51\xcf\x16\x9e\x5b\x60\x0e\x80\x74\x06\x26\x20\x80\xfc\x3f\x0a\x89\x2c\xb4\xa9\x32\xae\x9c\x56\xdd\x52\x68\xe0\x64\x47\x65\xa2\x6f\x4a\x08\x3d\xa5\x4a\xb6\xc0\xc0\x1e\x3d\xa5\x6f\x4a\x37\x5d\xe3\xfb\x42\xc8\x38\x99\x6c\xe1\x34\x7a\x3a\xab\x42\x70\xf6\xe8\x17\xce\x80\xbe\x2c\xdb\x58\x58\xdb\xdc\xfe\xa6\x63\x6f\x35\xd8\x6c\x10\x2b\x5a\xa6\x59\x8c\xb7\x30\x1e\x80\x18\x88\x6f\x41\xd0\x1a\xe3\x73\x2e\x78\x1d\x0c\x99\x9f\x96\x2c\x8c\xe3\x16\xfb\x00\x54\x31\x9a\xab\xe6\x14\xe1\xc9\x24\x57\x94\x28\x5b\x93\x92\x25\x63\xde\x62\x8f\x01\x50\x20\x98\x4d\x25\x84\x1c\xf2\xf1\xf8\xd0\xda\x01\xc9\x0b\x98\x81\xa3\x2c\xcf\x59\x18\x97\x93\x09\xb9\xd6\xc8\xa3\x9c\xd6\x8b\xf2\x92\xe6\x3c\x90\x7f\xd1\x21\x1d\x9e\xd2\xf5\xb8\x85\x33\x38\x1c\x70\x64\xad\x48\x4c\x1e\x95\x37\xb0\x30\x84\x1b\x58\x18\xce\x96\xf2\xff\x2f\x97\xf0\xe3\x6b\xf8\x91\x64\xef\x76\xe1\xe3\x59\x8a\xe4\x02\xfe\xe7\xf0\xff\x52\xfe\x7f\xfa\x15\xfc\xff\x35\xfc\x9f\xc1\xff\xf0\xf6\xf1\x63\xf8\xff\x4b\xf8\xff\xeb\x77\xbb\x25\x5f\x2e\xdf\xed\x96\xcb\xe5\xd7\x13\xf8\x93\x5e\x3e\x58\xd1\xee\x12\x36\xd1\x4a\xad\x06\x82\x8e\xe3\x17\xbe\x7a\xf6\x61\x1b\xc8\x1b\xe7\xae\x4e\xf9\x38\xe0\x78\x4d\xf4\xde\x09\x8f\xc0\x71\xb2\x97\x4f\xd4\x5b\x79\x84\xaa\x8d\x20\xe9\xcd\xb2\xe6\xcd\x1a\x74\x45\x6e\xb7\x5f\x15\x49\xca\xd7\x55\x91\xf1\xda\xa3\xbc\x1e\xb2\x4c\xb3\x8b\xeb\xd5\xe4\x20\x68\x7a\xed\xfa\xd5\xf1\xc4\x3c\x7a\x3b\xef\x99\x92\x45\x16\x48\xa2\x73\xfd\xa8\xab\x1b\xc0\x1c\x7b\x26\xef\x31\x76\x35\x27\x69\x52\x9e\x94\x95\x38\x09\x6e\xb9\x20\x27\x57\xfc\x24\x45\x82\x07\xf1\xc7\x4e\xea\x5d\x59\xe6\xe5\xea\x84\x83\x9d\xbe\xd7\x36\xcf\x01\x6d\x9c\x1d\xdb\xd4\x2b\x2e\x80\xd4\xab\xd8\x00\x96\x7f\x32\xe3\xa6\x2a\x07\x54\xf2\xd3\xeb\xb2\x8a\x75\x2b\xb3\x80\x27\xff\xc3\xfa\x4c\x49\xab\xca\x5a\x14\x2f\xaa\x6b\xfe\x5b\xde\xec\x92\xa2\xb8\xf5\xe8\xe8\x02\xd2\x6f\xd6\x55\x01\x90\xca\x18\x17\x00\xd5\x96\x2d\xf9\x58\xf3\x8d\x24\x78\x8a\xa6\xba\x4a\x43\x08\x2d\x49\x6f\x1d\x92\x85\xf1\xd6\x86\x4b\xd8\xe0\x2a\x3f\x24\x10\x2e\x98\xa9\xa5\xf7\x43\x12\xd4\x24\x2e\xe5\xa9\x9b\x71\x91\xa4\xeb\xf6\x09\xf4\x91\x34\x9f\x26\x02\xd3\xf5\x53\x20\x68\xb9\xdf\x2b\x4d\x11\xac\xb5\x0f\xa2\x4e\x7e\xe0\xb7\x0d\x52\x2d\x48\x4b\xab\x72\x99\xaf\x76\x35\x7f\x81\xe1\xd5\xcd\x0b\x1b\xae\x0f\xc6\xf7\xc7\x42\x77\x41\xc5\x29\xf5\xe8\xe2\xb2\x4f\xb0\xfb\xe6\xf5\x6c\x53\x82\x49\xb8\xad\xd8\xfe\x09\x50\xdc\x9b\xee\xe0\x40\x84\x8e\x6f\xa1\xa8\x1c\xe1\x8f\xd4\xde\xd8\x72\x4c\x3e\xaf\x6c\xc0\x2a\x10\xf0\x47\x5e\xe8\xd1\xa1\x5d\x97\xca\x1b\x07\x7e\xe7\x27\xfe\x41\xbc\xa9\x5e\x6b\x86\xab\xb3\x94\xba\x21\x0f\xf5\xb6\xd0\xd9\xd5\x1e\xf5\x4a\x40\x01\x75\x67\xff\x33\x80\x64\xfe\x5b\x01\x33\xbb\xd1\x23\xfb\xac\x9d\x82\x87\x6d\xa3\x08\xdd\x5f\xe4\x47\xbe\x14\x4e\x19\x99\xe0\x1e\x52\x6a\x8c\x07\x36\xc7\xd1\x69\x6a\x27\x49\x8d\x30\xe5\xfd\x29\x52\x76\xe8\x58\xbd\x47\x67\xf4\xb6\xec\x7f\xf6\x79\x55\x6f\x12\x9c\xc7\x21\x4a\x78\xb0\x0a\x35\xeb\xea\x06\xc5\x32\xbf\xaf\x79\xf9\x5a\x07\x04\x84\x76\xdf\xe6\x66\x7b\x1e\x97\x0b\x78\xf6\xe7\x2d\x93\x09\x93\x3e\x8c\x8a\x6e\x5e\x1b\x36\xb6\x79\x91\xdc\x82\x52\xc1\x70\x0c\x9a\x7f\x1b\x18\x44\x9b\xed\xe3\xbe\x1f\xbc\xe8\x4c\x34\x32\xa8\x28\xbb\xef\xa7\x77\xf8\x4e\x54\x7c\xe3\xca\x72\x95\xac\xc7\x18\x23\xa7\xb6\x63\xaa\xd9\x80\x33\xcf\x63\x8c\x71\x84\xc7\xd3\x1f\xb1\x85\xb4\x03\x3d\xe3\xfd\xf0\xb9\x8a\x05\x36\xab\x20\xab\x93\xd5\x53\x88\x7e\x3a\x0a\xe9\x0b\xa4\x18\x49\x51\x54\x37\x32\xf1\x79\x5e\x80\xd5\xaf\x43\x67\x60\xa8\xbe\x29\xf2\xf2\xfd\x2f\x00\xd9\xf0\xe8\x61\x68\xbd\xc0\x45\xfd\x22\xa9\x57\x79\xe9\x51\xfb\x0d\xaa\x39\x61\x99\x99\xb5\xd0\xe4\xe5\xaa\xe0\x4f\xac\xf7\xaf\x78\x2d\xe7\x17\x9a\xd3\xe6\xbb\xa9\xea\xf7\x92\xff\xf7\x20\x54\xa9\x4e\x79\xca\x8b\xe4\xb6\x4d\x5a\x16\x72\x9d\x96\xaf\xb7\x49\x09\x07\x30\x7d\x69\x56\x66\x92\x65\x2f\xaa\x8c\x3f\x29\x92\x06\xb7\x51\xfb\xca\xd6\x4e\xb4\x75\xed\xca\xac\x7a\xca\xb7\x62\xed\xc9\xdb\xc6\xb1\x23\x49\x6e\x5a\x1d\xa2\xdd\x94\x60\x1c\xe7\x46\xbd\x78\x86\xc6\x6a\xd8\xd2\xd3\x47\x58\xfd\x75\xce\x6f\xb6\x55\x2d\xf4\x38\xcd\xc2\x4f\x65\x33\x36\xc9\x87\xef\x74\x20\xcd\x1f\x81\x75\xf3\xe8\x8c\x7f\x61\x75\x68\x40\xfd\x3d\x40\x82\x8f\x2d\x0d\xad\x88\xd2\x8c\x91\x48\xae\x80\x4b\x1d\x5c\xbd\xed\x40\x38\x15\xb5\xc1\x85\xa6\x22\xb9\x92\x6c\xfa\x07\xc6\xf7\x7b\xcf\x3b\x98\x23\x5f\x05\x03\x32\xab\xca\xc0\xd6\x79\x14\xd0\x70\xef\x1b\xf1\x86\x8b\xa7\x3a\xbb\x7d\xfb\xd8\xae\xeb\xa4\x31\x6b\xf5\x10\x7c\x28\x86\xe3\x7b\xba\x57\x2b\xb0\x25\x58\x03\xe0\x65\xc3\xee\x0e\xb1\x68\x6f\x6c\xec\x2e\xad\xca\x46\xd4\xbb\x54\x54\x75\x24\x30\x3c\xaa\x1d\x67\xf9\x17\x0c\xb0\x63\x04\x51\xca\xe6\xcf\x1e\x0b\x13\x93\xbe\xe1\x02\xef\x3e\x91\xd5\xb5\x16\x81\x6d\xdd\x06\xcd\xa5\x25\xcb\x17\xe2\x32\x96\xff\x41\x30\x18\xbc\x57\x8d\x98\xd8\xef\x03\x48\xac\x29\xef\x86\x15\x12\x28\x39\x45\xcd\xd2\x42\x5c\xa2\xc5\x23\xad\x69\x89\x71\xea\xe4\x0f\x0f\x3f\x80\x24\x05\x55\xeb\xe0\xcb\x48\x57\x03\x6d\x73\x15\xb8\xaa\x69\x0b\x71\x09\xb9\x9f\x56\x69\x3f\xde\xb4\x72\x4f\xad\xd2\x03\x4d\xb2\xec\x07\x60\x8f\xa2\x0e\xb9\x5b\xeb\x78\xb5\x53\x15\xae\x76\xc1\xe7\x9e\xbc\xdb\x78\x91\xb7\x2b\xc1\xa6\xde\xbb\x0c\x7e\x48\x10\x35\x03\x0d\x49\x7a\x35\x39\x3e\x7d\xbd\x1a\x69\xcd\xc2\xb8\x3e\xe3\x6d\x58\xa4\x1a\xd0\xee\xe5\xcd\x58\x0e\xa1\x7c\x98\x96\xc9\x86\x33\x26\x5a\x45\x52\xb3\x05\x3d\x49\x4d\x67\xa8\x26\x48\xb2\xec\x25\x46\xd1\x8d\x4a\xcb\x87\xdd\xe2\xeb\xf8\x54\x54\xef\x79\x39\xe7\x91\x41\xe8\x0f\x9c\x69\x44\x6f\x0f\x15\xa7\xf1\xb5\x6c\x22\xe9\x31\xf6\xea\x1b\xcd\xc9\x26\xb9\x05\xb6\xfe\x8a\x83\x7c\x99\x2f\x77\xc5\xd4\x23\x71\xd0\xe5\x29\x75\xcf\x73\x16\x4a\x9e\x32\x90\x1f\x39\x6b\x1d\xc0\xea\x40\x2c\xf2\x4b\x72\xc6\xca\x98\xe4\xe3\x71\x2c\x74\xc7\x72\x1a\x42\xe4\xac\xc0\x1a\x30\x1d\x26\x98\xde\xc9\x05\x16\xe5\x10\x2b\x58\xb2\x10\x11\xa7\xd5\x36\xf9\xf7\x8e\x47\xb5\xef\xd7\x53\x7c\xa6\xdb\x3a\xaf\xea\x5c\xdc\x62\xa2\xfe\xb5\xdf\x87\x87\x61\xe2\xa5\x73\x1c\xec\x38\xc5\x53\x15\x8f\x78\x3c\x86\xdb\xb8\xdc\x3e\x92\x2a\xc0\x44\x0f\x0d\xf8\xb1\xc9\x36\x6d\x1f\x98\x6d\x3d\x41\x72\xa2\x75\x97\x60\x2a\x60\xfe\x7b\xd1\xa6\x85\xe4\xb4\xef\x5d\x10\x83\xcd\x07\xa3\x3b\xd3\x87\x03\xa1\x28\xab\x90\xa7\x97\xdb\x03\x9c\x38\xfd\xd9\x91\xfe\x2c\xf7\x7d\x1d\x03\xc9\x4e\x0b\x10\x8d\x52\x1e\xf5\xf6\x6a\xb2\x43\x53\xcc\x55\xf8\x83\x08\xa3\x37\x45\x7c\x0e\x51\x99\xac\xc8\x4b\x84\x72\xb5\x18\xb3\x2a\xa5\x92\x36\x3c\xc3\x00\xd4\x54\x09\x80\x74\x6b\x0d\x0f\xf5\x91\x41\x77\x23\x1e\xd0\x9a\x4d\x66\x2a\x60\x02\x1f\x88\x90\xc0\x55\xec\x8b\x52\x87\x8a\x21\x56\x30\x86\xf3\xda\xf7\x03\xdd\x1c\x3b\xa8\x03\x06\xd5\xac\xed\x20\x18\x34\x67\xee\xf7\xb7\x75\xbe\x81\x03\xc5\xf7\xdf\xa8\xa1\xb7\xe0\x60\x12\x56\x6a\x1f\xcc\x02\x02\xbe\x82\x33\xa6\x31\x9c\xaa\x69\xa2\x9c\x06\x6b\x0b\x81\x57\x7b\x40\xa3\xbb\xa4\xf6\xbc\x0c\x8a\x69\xba\x9e\x87\xd1\x8c\x90\x71\xeb\xdf\x57\xb1\x26\xae\xce\xea\x78\x3c\xae\x88\xee\x42\x45\x85\x86\x1c\x1b\x18\xaa\x38\x64\x2c\x01\x6f\x17\x6e\xc2\xfe\xa4\x66\xbb\xa6\x8b\xfc\x52\xb5\x78\x9a\xae\xcf\x43\xdf\xff\x67\xd9\xce\x5b\xae\xa3\x38\x25\x14\x32\xca\xfe\x10\xfa\x2b\x04\x74\x96\x54\xf8\x8d\xa4\x3f\x17\x22\x1a\x3c\x2b\x2f\xb8\x99\x70\xa4\xf0\xb2\x7f\x50\xa2\xb9\xbf\x40\xce\x21\x02\x01\x85\x18\xd9\xfa\x2b\x92\x0b\x74\xbe\x44\xee\x04\xcb\x9c\x35\x86\x06\xcd\xb4\x66\x2b\x55\xd1\x5b\x61\xbd\x56\x3e\xa2\x14\xe9\x56\xd0\x0a\xac\xc8\x83\x53\x08\xee\x86\x31\x70\xe5\x68\x11\xce\xea\xc5\xe9\x65\x6c\xb0\x58\xb5\xdc\xac\x60\xf9\xb8\x3c\x3f\x07\xe5\x7e\x50\xcc\xeb\xc5\xe9\xe7\xc5\x64\x76\x19\x85\xe4\x9c\x25\xa4\x64\x45\x6b\x7d\x1d\xc0\xcb\xf1\xec\xf2\x2c\x21\xe4\x0e\x2a\xfc\x1c\xc0\x30\x15\x2a\x34\x2b\xc6\xb3\x83\x02\xa8\xe3\xf3\x36\x12\x8a\xa7\xe8\xca\x89\x47\xa2\x89\xf1\x45\x6b\xce\xc2\x39\x8f\x42\xc6\x1a\xc5\x7e\x1b\x57\xa3\x66\x32\xc3\x51\xc2\x00\x2d\x4e\x08\xc6\x6b\x13\x3f\xdf\x48\x3f\x4d\x70\x66\x04\x75\x7e\x81\xce\x06\xe6\x39\xa8\x15\x14\x8b\x99\xdb\x40\x87\xae\x23\x50\x3e\xaa\xe1\x63\x88\xcf\x3d\x3c\x8d\xba\x02\xcc\xd3\xc0\xbb\x45\x78\x69\x95\xeb\xce\x3f\x52\xcb\x05\x46\xab\xa9\xbb\x8c\x45\xeb\xd2\xae\x03\xe7\xd7\x0b\x7e\xa9\xc3\xe2\xb7\xa1\x69\xd0\x0a\xb3\x47\x5c\x93\x05\xbf\x24\xe5\x42\xfe\xb9\x04\x1c\xdc\x5d\xb3\x0e\xd4\xef\x16\xb2\x1c\x72\xe9\x4d\xa6\x10\x4d\x17\xfc\xb2\x05\x35\x1d\x6b\x4c\x53\x2c\xba\x28\x2e\x2f\xe3\xc6\xd4\xd7\x10\x1d\x80\x06\x19\x39\xf4\x54\x2c\x17\xf6\xef\xcb\x79\xfb\x71\x3b\x99\x44\x32\x41\x92\x7f\xa7\x7d\x98\x42\xac\x9d\x1f\xc6\xd5\x59\x39\xfd\x73\x55\x54\x57\x89\x89\xb9\x58\xe9\x96\xa5\xcc\xbc\x5b\x54\x97\x71\x3a\xdd\xd6\x3c\x0b\x12\x98\x4f\x82\xfa\xee\xbf\x83\x9c\xa6\xd3\xeb\xa4\x20\xe6\x43\xf8\xd3\x32\xcb\x5c\x71\xe4\x14\x20\x98\xdc\xc0\x3c\xb5\xeb\x49\x2f\xa5\x8d\xda\x6d\x81\x60\x70\x5c\x29\x67\x96\xb9\xb2\xff\x1d\xd7\x80\x5a\x3f\x99\x45\x42\x52\x32\x13\x0a\xf1\x40\xf1\x56\xf6\x04\xe2\x45\xdf\xfb\x25\xd7\x5c\x56\x7f\xf7\x6d\xad\x28\xb8\xf9\x1e\xc4\xb9\xf1\xaa\xab\xbf\x38\xc4\xfe\xd3\xa7\xeb\xdc\x25\x13\x11\x34\x0d\x48\x5e\x54\x23\x89\x96\x77\x03\x8c\x4e\x7d\xa0\x68\xdf\x32\xd0\x26\xf5\xd9\xdf\xd5\x67\xdd\x4a\xdd\x2a\x4c\x08\xec\xe1\x2a\x7e\xa8\xcd\x88\xfd\xbb\x36\x44\xd2\x54\x40\x30\xa8\x3a\x04\x53\x27\x07\x2a\xe9\xd6\x85\xb2\xd1\x3d\xb2\xe3\x4c\x35\x77\xa2\xda\x46\x82\x82\xc6\x3e\x3c\x58\x75\xca\xba\xa8\xb0\x9b\x3c\x76\xee\x0a\xf2\x3e\xa8\x70\x15\x0e\x14\xad\x04\x2e\x90\x93\x18\x94\x29\x1a\x78\xe6\x5e\x10\x45\x61\x34\x0c\x7a\xf2\x54\xec\x02\x33\x97\xb0\x18\x62\x71\xe6\x66\x98\x8b\x4e\x89\x48\x9c\x27\xbe\x1f\x08\x96\xc8\x8f\x85\x92\x70\x3b\xf4\x5c\xed\xb8\x9c\x09\xbd\x20\x3e\x53\x83\x90\xe3\x30\x84\xfd\x61\xa0\xf5\x7e\x5f\xc2\x58\x8c\x83\x72\x6e\xbe\x87\xfd\x9d\x7c\xc6\x83\x9c\x44\xf2\xd0\x51\x02\xd5\x37\xfc\x43\x6f\xdc\xcd\xa0\x27\x79\x60\x8f\x60\x5b\x4a\xce\x3b\x98\x41\x0f\x14\x2a\x7a\x85\x56\x1c\x6c\x04\xe4\x5d\xbc\x9f\x1f\x63\xc3\xf5\x26\xea\x79\x5d\x6d\xa8\xa8\xfa\x2f\xde\x54\x07\xb8\x38\xfc\x0e\x10\xb9\xd1\x71\xcf\x7f\xbb\x24\x2d\x58\x20\xd8\xdb\xc1\x65\x4d\x88\x02\xde\x07\x8c\x00\x1d\x4d\x80\x2b\x69\xa9\x36\x37\x61\x9e\x36\x37\xf1\x28\xef\xd8\xe9\xa7\x9b\x49\xbe\x2a\xab\x9a\x4f\xc0\x69\xae\xf1\xa8\x27\xea\x1d\xf7\x06\xef\xaa\x8e\x22\x33\xe0\x84\x26\xb0\x5c\xdc\xc8\xc6\x9c\x60\x20\x25\x08\x67\x50\x30\xd8\x26\x6d\xe8\x89\xe4\xaa\xba\xe6\x2a\xf6\x44\xc9\x31\x8c\x85\x1b\xf4\x20\xf9\x10\x24\xc3\xc1\x0e\x3a\x0b\xc2\x09\x64\xa0\x5b\x62\x99\xb9\x2b\x66\x0e\xa1\x5a\xad\x74\x12\x3b\xcd\x10\x3a\x76\x01\x57\x36\x40\xf8\xb5\xf3\x0a\x90\xca\x44\xb5\x3d\x77\x5f\xcc\x55\x9f\x26\x6e\x72\x74\xa4\x9e\x33\x56\x81\xbb\xbc\x7e\x4d\x68\x63\x72\x40\x73\xce\x53\x40\xe0\x48\x27\x4e\x2a\x39\x70\xcb\xa4\xb7\x40\x5b\x77\xee\x88\xc1\xd5\x0f\x40\xdc\x67\x9e\x47\x0d\xf6\x7e\x39\x0f\x1a\x36\x30\x20\xee\x17\x68\xa7\x02\x70\xb4\x8a\x02\x04\xfc\x97\x95\x34\x2c\x8c\xbc\x4d\x9e\x65\x05\xc4\xd9\x84\x56\x0e\x8d\x73\xa7\xe1\x0f\x4e\x89\xdb\xd0\x06\x4d\xf0\x69\x6d\xc3\xee\xb4\xa7\xc8\x33\x15\xe5\x1d\x2d\x1b\x2c\x73\x07\xdf\x87\xc8\xfb\x4e\xc0\x7d\x37\xd3\x8f\x7c\x29\x7c\xff\xa9\x9d\x0b\x85\xe3\x8a\xda\x02\x81\x69\xa8\xa4\x36\x05\x85\x6e\x46\x9d\xc1\xa7\x2a\xc2\x45\xd1\x99\xb5\x03\x39\xd0\x2e\x32\x8f\xbc\x01\xad\x0b\xe2\xa4\x83\xfd\x1e\x5c\x8d\x3a\x2f\x7e\xdd\x46\xdb\xa2\x4d\x01\x9d\x8b\xae\xe4\xb6\x20\xd4\x32\xfe\x8c\x3a\x7e\x08\x79\x2f\x24\xb4\x68\x59\xac\x62\x21\x2e\x31\xdc\xb6\xf1\x8f\x6c\x9b\xfa\x4c\xa9\x18\xbb\x77\xb5\x57\xfa\x6e\x07\x3e\x57\x79\x99\xbd\xaa\x9a\xef\x7a\xe4\x47\x5f\xce\x66\x31\x87\xc8\x29\xa5\xbc\xc3\x71\x36\xe1\x2d\x93\x93\x74\x58\x7a\x05\x2e\xcf\x7d\x7f\x14\x24\xec\x79\xd1\xbe\x4b\x68\x09\x75\x12\x1d\xcf\x23\x1e\x8f\xdb\x78\x11\xc9\x81\xca\xfb\xfc\x77\xdd\x7b\xb0\xcd\x59\xa0\x25\x39\xff\x20\x78\x99\xb5\xde\x8c\xdf\xdc\xb6\x05\x72\x0b\x3d\xd7\x89\x21\xbb\xdf\xa3\x45\x0b\x16\xde\xef\x73\x7d\xcd\x9c\x3f\x2f\x94\xd5\x60\x8e\x5e\x3d\xd0\xf5\xd6\x22\xd1\x55\x0c\x92\x48\x9c\x85\x73\x0d\x67\x1a\x21\x98\xe9\x81\xfe\x5b\x8e\x62\xc6\x0b\x2e\xee\xef\x00\x46\xb7\xb5\x79\xa4\x01\x8b\xa8\x79\x7d\x0f\xae\xf7\x18\xbf\xe2\x91\xe8\x9f\x09\xce\xa0\xdd\x77\x9c\x2d\xd9\x23\xbb\x37\x36\x32\xee\x59\x38\xc7\x23\xaa\x94\xc7\x11\x66\x3a\x44\x98\xa4\x8b\x54\x51\x79\x38\x58\xeb\xe2\xb7\xe3\xeb\x82\x26\x2c\x3f\xbe\x36\x8a\xee\xda\xc0\x10\x93\x72\xe2\x1b\x4d\xe1\xf5\x29\x56\x28\x77\xaa\x36\xfa\x52\x32\x4f\x58\x05\xf4\x22\xc2\x3f\x2c\xa1\x41\xc1\xfe\x32\x77\xe8\x92\xd6\xed\x62\x72\x80\xe4\x4f\x0a\x5c\x4d\xbf\xdd\x37\x19\xda\x66\x1e\xe2\x4a\xb2\x85\xbc\x9f\x8c\x9c\x13\x0e\x16\x8e\xef\x8f\x72\xb5\x6a\xc0\x38\x6b\x78\xce\x50\x6a\x77\xdf\xca\x54\xb1\xa4\x88\x35\x11\x85\x5e\x46\x05\x42\x3f\xe1\x6d\xe5\x6d\x1d\xd4\xb4\xb0\x3d\xcc\x14\x1d\x2c\xa6\xab\x2a\x29\x9e\x40\x08\x27\x88\x24\x0e\x63\x62\xa7\x12\x5a\xaa\xcb\x0d\x3a\x6f\xa9\x70\x12\x7f\xc9\xf5\x80\xb7\x7a\xb5\x0e\x74\x70\x21\xee\xfb\x05\x63\xb9\xcb\xad\xfb\xfe\xf7\x79\x50\xd3\xdf\x65\x3b\x2a\xd5\x04\x38\xdd\x1a\x60\x6f\x69\x25\xd7\x7b\x6b\x76\xee\x5e\xc1\xf2\x81\x38\x98\xf2\x2a\x66\xa7\x2f\x8a\x4b\xab\xd1\xac\x5c\x14\x97\x6a\xb1\xfd\x5e\xd5\x59\x47\x64\x80\x02\xa5\x01\xb9\x00\x46\x19\x87\x88\xb3\x6b\x30\xab\x41\x69\x00\x37\x21\x37\x9d\x4b\x6d\x20\x9c\xc0\x54\xb1\x8e\x55\x36\x82\xf8\xb6\x79\xfa\xfe\xd6\xf7\xf3\x11\xe3\x6d\x08\xb1\x7a\x3e\x1e\xe7\xd1\x64\x52\x5b\xa4\x8e\xeb\x50\x55\xb5\xa4\x73\xb9\x08\x12\x5a\x92\xf9\x80\x24\x33\x17\x81\xa0\x25\x39\x44\x6d\x98\xaa\x64\x28\x63\xfb\x5a\x90\xc3\x80\x24\x7d\x64\x67\x90\x4b\x11\x32\xc6\x10\x95\xaa\x08\xda\xe6\x40\x80\x45\xa2\x1b\x6b\x89\xd8\x9c\x6c\x39\x01\xf3\xff\xfc\x60\x45\xa8\xbb\x29\x31\xce\x0d\x9a\xf8\x00\x42\x8e\xfa\x91\x13\x79\x8c\x54\xab\x55\x01\x52\x56\x08\xc8\xec\x34\x51\xf9\xe6\xf9\xbe\x60\x5d\x31\x2b\x64\x06\x38\xec\x81\x74\xb5\xcd\x3a\xa9\x64\xfe\xd2\xe1\xb4\x2d\x6f\x41\xdb\x3e\xdf\xe4\xf7\x48\xf4\xe2\x3f\x2c\x60\x69\x35\x74\xe2\x1b\xe8\x9f\x56\x6c\x0c\x35\x4b\xde\xae\x54\x60\xe1\xa3\xfa\x8b\x23\xaa\x2c\xc6\xde\x04\x3f\x29\x89\xe3\x81\xb6\x5e\x33\xfd\x7a\x46\x0a\x8e\xaf\xef\x85\x36\x32\xc7\x45\x9a\x20\x22\x04\x39\x50\xcd\xfe\xf4\xc9\xdb\xcb\xdc\x12\xe1\x81\xc4\x0f\xb5\xab\xdf\x97\xcb\x2a\x1a\xf6\x93\x75\x2d\x0d\x0c\xce\x2a\xb2\x4a\xc2\x62\xa2\x80\x6b\x12\x2d\xef\xa5\x6e\x9d\x26\x49\x39\xa5\xfe\x88\x14\x9d\x4c\x9c\xda\xaf\x12\xa5\xad\xa5\x68\x09\xae\x0b\x21\xbf\x78\xb4\x0c\xb2\x64\x36\xcf\x1f\xfd\xa1\xf2\x52\x8b\xe1\x8c\x3e\xd4\x5a\xa8\xae\x06\xe7\xfb\x52\x54\xf2\x9a\xd6\x1f\x22\x2d\x7d\x08\x04\xb3\x6f\x6b\x5d\xa1\x45\x7b\x18\xee\x8a\xe2\xa0\x64\x16\x28\x6c\x77\xa6\xaa\xaf\xc3\x26\x24\xea\x5f\xb2\xe7\xfa\x6b\x72\x83\xd1\x90\x98\x9a\x23\x0d\x25\x82\x81\x24\xdb\x56\x99\x1c\x04\x04\x0b\x00\x64\x22\x2a\x95\x51\xa6\x6d\xe0\x6b\x8c\xef\xf7\xa1\xf1\x93\x95\xef\x60\xfb\xce\xdd\x4e\xbf\x77\x42\x84\xeb\x29\x7c\x55\x35\x8c\x1f\x34\x27\x18\xbd\xd2\x8b\x07\x01\xcf\xe4\xe7\xcc\x67\xe4\x6a\x6a\xb8\x78\x9d\xff\xdd\x53\x55\x74\x0e\xd5\x3e\x15\xeb\x8f\xc6\x7e\xff\xe0\x5f\xef\xb2\xf1\x67\x8a\xb6\x29\x7c\x13\x41\xc8\x1c\xbd\x73\x23\x71\x88\x0d\x79\x71\x77\xb9\x6b\x52\x8d\x90\x10\xb2\x73\xfa\x26\xc0\xef\x2f\x80\x6b\x96\xe5\x01\xd7\x98\xd9\x43\x31\x4a\x7d\xff\x2f\xb5\xa0\x6c\x38\x90\xee\x8d\xbe\x65\xe5\xc0\x84\xb3\xa4\x03\xd7\x7b\xda\x61\xe5\xc5\x14\xa3\xe1\x34\xa4\x55\x97\x84\x31\x3f\x33\xe9\xfa\xd4\xe4\x18\x71\xdb\xa4\x2f\xf8\xe5\xb4\xac\xbe\xc3\x85\x46\xee\x96\xf2\x8c\x2e\xa9\x87\x6f\x4d\xec\xc2\xf1\xb8\xd4\xba\x33\x9c\x6a\x40\x63\x42\xeb\x35\x36\x0a\x5b\x0a\xa8\xcc\x04\x3c\xaa\xf5\x69\x06\x7d\x7b\x48\xa1\xab\x10\x7f\x28\x10\x1f\x91\xd4\xe2\x65\x3f\x77\x2b\x6f\xd3\x0a\x2e\xca\xcb\xec\xbe\x8c\x6f\x4d\x46\xd5\x1a\x67\x65\x0d\x12\xa9\x34\x49\xd7\x3c\x6b\xc5\x3c\xb1\xd6\xa6\xdd\xd3\xe7\x6f\x35\xc1\x30\xc4\xd1\x6c\x78\x8b\xb6\xb9\x69\x70\xb5\x5c\x97\xae\xec\x87\x6a\xd8\x9f\xfd\x5e\x23\xad\x06\x62\xd2\x15\x2b\x91\xf3\xe9\x23\x65\x3c\x3e\xb4\xb4\x88\xef\x67\xba\xcd\xc7\x67\xa3\xb9\x49\xb6\x4f\xab\xde\xb5\xcd\x55\xaf\xc5\x16\x0e\xb2\x05\x8e\xa3\x8c\x5e\xb5\x2d\x95\x1c\xac\x16\x37\xbe\xfb\x26\x20\xf4\x17\x33\xb9\xed\x50\x0d\x9c\x6b\xda\x12\xde\x8c\xa2\x33\x7c\x8e\xf5\x5a\x67\x2a\x70\xcd\xca\xa9\xc8\x14\xb7\xef\xa9\xfe\xa9\x83\x97\x13\xca\x0f\x84\xa2\x35\xc6\x00\xfb\xe7\x0c\xa6\xb2\xd9\x88\xdb\x18\x81\x2f\x41\x7e\x6c\x99\xcd\xbb\x97\x65\xbc\x1c\x73\x2a\xc8\x9c\x2f\xc4\x65\x24\x40\x86\xd7\x1a\x86\xfe\xa7\xc7\x3a\x14\xff\x1d\xa9\x8a\x0a\xa7\xf9\xb1\x2a\x14\x0d\x3a\xb4\x07\xf2\x27\x17\xd5\xc7\x32\x94\x45\xb3\xc5\x4f\x2c\xa9\xcc\xf8\x0e\x07\x0a\xba\x16\x30\x86\x5c\xe5\x8d\xe0\x35\xf2\xc4\xcc\x32\x51\x00\x49\xe3\x80\x22\x67\xbf\x0f\xea\x05\xbf\x64\x42\xfe\x77\xa7\xb4\x15\xd1\x42\x32\xec\x32\x7d\x91\x5f\xb2\xf2\x60\xd5\xfc\x2d\x64\x18\xac\x1f\xfd\x0f\xdc\x26\xc0\x9b\x04\xeb\x32\x7a\x12\xb8\xc2\xdc\x6d\x6b\x9e\x45\x25\xbd\x4e\x8a\x28\x39\x90\x03\xd8\xe6\x00\x31\xfe\xbd\x60\x9e\xa4\xb7\x27\x08\x25\x74\x82\x86\x00\x27\x69\xb5\xbd\x3d\x59\x71\x81\x70\xe3\x27\x96\x19\x8e\x87\xd8\xaa\x81\x77\xe2\xb5\x77\xd3\xb7\xc5\x49\x5e\x9e\xbc\x49\xda\x55\x43\xec\x1f\xdd\x91\x78\x5b\x10\xdf\xff\x3b\xf8\xbd\xa0\x6f\x0b\x02\xf7\xdd\x0f\x96\x9f\xc6\xe2\x6d\x71\x39\x70\xee\x9d\x0c\x4c\xd0\x34\xd9\x6e\x8b\x5b\x4b\x2a\x52\xaf\xc0\xfd\x4c\xb2\x2e\x81\xdd\x02\x59\x67\x8b\x57\x7a\x21\x82\x37\x09\xa1\x1f\x8a\x69\x6b\xd7\xdd\xb0\x3b\x6d\x0a\x1e\xfd\xbb\xa0\x1d\x43\xf1\xe8\xdb\xe2\x20\xf3\xa3\xc7\xc6\x8b\x2a\x73\x31\xd7\x46\xf8\x0a\x7c\x41\x40\x4f\x08\xa6\x05\x45\xe1\xe1\x91\xdb\x7d\xcb\x04\xa1\xcf\xed\xc6\xdb\x0d\xb7\x3e\xf3\xfd\x8b\x67\x9d\xa0\x39\x4f\xc5\x42\x5c\x32\xde\x69\x4b\x80\x1f\xeb\xe3\xc7\xdd\x81\x85\xcc\xa0\x51\xd1\xb4\x79\x9f\x6f\xdf\x54\x88\x39\x78\x38\x10\xf7\xb3\x01\xd8\xc5\x3f\xd8\x16\x49\x5e\x7a\x14\xab\xb7\xb2\x3c\x93\x77\xf3\xa6\x1f\xd3\xc7\x99\xc6\x4e\x43\x9f\x56\xe9\xb1\x62\xce\x4c\x99\x62\x92\x6d\x92\x44\xf5\xa2\xe6\x09\xeb\xf9\x85\x04\x9c\xf1\xf9\xf3\x80\x93\xe8\xee\x40\x8c\x2f\x34\xfc\xa5\x23\x3e\xd5\x66\x73\x20\x63\x56\x36\x70\xe0\x5c\xa6\x5f\xb0\x36\x9d\xc8\x02\xdb\xd6\xeb\x40\x96\x71\x7e\x06\xce\x6b\xe6\xbc\x25\x9a\x99\x9d\x1a\xb3\x3a\x13\x68\x36\x10\xdd\x00\x68\x56\x2e\x56\xc3\xd9\xa7\x79\x4d\x17\xf2\xb6\x35\xd1\x23\xbe\x5f\x33\xa6\x03\x0e\x4f\xaf\xaa\xec\xb6\x75\xa6\xcb\x01\xc5\x01\x3b\x0f\xf7\x73\xf4\x08\xc2\xc8\x6f\x25\xa2\xf2\x2c\xab\x5a\x72\xc2\x60\xe4\x2c\x9f\xa9\xd7\xec\xae\x36\xb9\xf0\x68\x0e\x1d\x2f\x78\x72\xcd\x5f\x43\xd2\x0b\x2e\xd6\x55\x76\x51\x54\xa5\x1d\x25\x54\x16\x8a\x4b\x96\x4c\xb1\x1c\x44\x86\x41\x19\x85\x4e\x72\x1c\xe0\x02\x50\x5b\x60\x7a\x69\x1e\xed\xd4\xe2\xa0\x00\x3c\x2a\x72\x77\x38\xf0\xe9\x32\x2f\xf3\x66\xfd\xbd\x03\x35\x57\x4b\x02\xda\x24\xd7\x9c\xe5\x14\x90\x80\xfa\x2b\xc1\xb6\x81\xae\xa7\xa2\x1a\xcc\x61\xa7\xe7\xcd\x4f\xc9\x4f\x34\x07\x7f\xf7\x16\x82\xde\x89\x32\x07\x9f\x72\x4f\x23\xb4\x39\x46\x7e\x57\x1d\x06\x80\xc4\xa7\x07\x76\xf3\x9f\x0d\xac\xef\x7b\xba\x7d\x16\x0b\x0f\x15\xa8\xf1\x01\x4f\x7d\xeb\x37\x2b\x89\xbc\x89\xf5\xda\x50\x56\x25\xf7\x94\x9c\xeb\x43\x11\xd8\x96\x0f\xad\x09\x58\xdb\x4d\x07\x2b\x8e\x53\xe1\x80\x7b\x1f\x5a\x71\xd6\x49\xe3\x9a\x93\x89\x69\xb5\x5c\xb2\x8d\xe4\x4a\xe4\xc6\x95\x7f\x6f\xd6\x9c\x17\x60\x57\xfb\x2a\xff\xc0\x8b\x86\xfd\x56\x52\x31\x7d\x5a\xa5\xec\x4d\x42\x85\x05\xbe\xcd\x5e\x0a\xc0\x16\xd8\x95\x42\xc9\xa7\xfe\xa2\x08\x43\xad\x7e\xfe\x4e\xc5\x34\x6f\x7e\x57\xb2\x24\x56\xcb\xec\xaf\x92\xa6\x61\xdf\xc8\x7a\xfe\x5f\xda\xde\x84\xbd\x6d\xdc\x5a\x18\xfe\x2b\x12\xef\x5c\x16\xa8\x60\x85\xa4\x76\xca\xb0\xae\xc7\x49\x66\x32\xcd\x32\x8d\x33\x69\xa7\x8a\xae\x4b\x53\x90\xc4\x86\x22\x55\x12\xb2\xe3\x31\xf9\xfe\xf6\xef\xc1\x01\xb8\x8a\x92\x9d\xbe\xef\x97\x3c\x8f\x45\x82\xd8\x97\x83\xb3\x1f\x6f\x1d\x38\x3e\xbd\x13\x89\xa2\x3a\xfa\xbb\xe8\xb6\x34\xb7\x79\x15\x2c\xe9\xb7\x20\xc7\x94\x6e\x1d\xd0\xdf\xf0\xe9\x6f\x9e\xa8\x21\x8c\xa9\x07\x79\xb7\x3b\xf1\x1c\x88\x67\x01\x78\x63\xfa\x51\x54\xb6\xf5\xb6\x00\x37\x63\xfa\x92\xc3\x75\x1b\x87\xfe\x9d\x84\xea\xff\x12\x09\x4a\xa9\x82\xfe\xc4\x55\xb9\x1c\x70\xc5\xf4\x0f\x91\x26\x79\x93\x90\xe7\x47\x39\xc2\xdd\x03\xa8\x0d\xd0\xdf\x00\x7b\xcb\x15\x0e\xe9\xbf\xc5\x7b\xae\x5f\x42\x7f\x90\xb9\x41\x2e\x11\x53\xcf\x27\x5c\x69\x4d\xd2\xdf\x1c\xf9\xfc\xde\xd9\x32\xfa\x57\x07\xe6\xe5\x5d\xb8\xf4\x56\x1e\x8b\xfe\xc2\x1e\xe8\xef\x22\xc9\x0f\xc3\xaf\xfb\x9d\x78\xfd\x9b\x78\x0d\xc2\x68\x0b\xc6\x37\x52\x43\x93\xfe\x5b\x24\x4a\xf2\xef\x9a\x47\xcc\xd9\xd2\xbf\x89\xf6\xae\x37\x4e\x24\xd1\xfc\x77\xe0\x17\x9c\x7e\x13\xf9\x4a\xef\xef\x1c\x35\xc3\x52\x70\x4a\x6f\xc4\x3b\xbb\xa9\x3a\xfa\xa4\xd7\x30\xf2\x9b\x98\x87\x3b\x71\x93\x3b\x6b\xa0\x44\xe8\xe7\x22\x99\xfe\xcc\x65\x20\x26\xd0\xf3\xa6\x1f\x08\xcf\x3d\x0b\xd0\x37\x62\xa2\xb7\xf2\xc3\xbb\x62\xa8\x31\xfd\x97\x23\x35\x85\xbf\xf9\xdd\x3b\x16\xc1\xed\xa0\x0d\xba\xc3\x41\xd7\x34\x34\xf2\xcd\x4f\x05\x8a\xd8\xef\x4d\xc6\xa3\x66\x51\x3c\x8d\xd0\x68\x60\xf5\x2d\x3c\x15\xcb\x02\xde\x8c\xa8\x97\x92\xc9\x64\x30\x18\x1e\x2d\x61\x1a\x3d\xab\x57\x2b\xd1\x9b\x58\x27\xda\x18\x8f\xfa\xe3\x5a\x81\xbe\xd9\x37\xc7\x47\x0b\xf4\xc7\xc3\x83\x02\xa3\x61\xff\x78\x9f\x46\x86\x39\x18\xd5\x4a\x98\x93\xc1\xa8\x77\xb4\xc4\x64\x38\x18\x98\xb5\x12\xa3\xfe\x68\x64\x1e\x94\x88\x50\x6f\xd2\xeb\x63\x12\x21\x6b\x68\xe2\x69\x3e\x0d\xbd\x41\xbf\x5f\xa9\xa0\x7b\x19\x45\xce\x03\x5c\xbd\x29\x19\xf7\x4d\xab\xa1\x2a\x6b\x3c\xb4\x9e\x51\x87\x17\xc3\x6f\x4a\x46\xa3\xde\xe8\x70\x62\x23\x64\x0e\xad\x41\x51\xcf\x64\x34\x31\xab\x83\x41\x1a\x54\xa0\x61\xb1\x89\x5c\x87\xa7\x64\x32\x1e\x37\xf6\x68\x32\x1e\x4d\xac\xe7\x55\xb5\x0a\xa3\x57\x8e\xbb\x49\xc9\x60\xdc\x1f\x4d\x1a\xea\x1a\x8d\x8c\xc1\xe4\x79\x75\x79\x81\xeb\xef\x97\x2c\x16\xfb\xd3\x32\x9a\x86\x68\x8d\x26\xcf\x1c\xa2\xd2\x7f\x4b\xc9\x60\xd4\x3b\xdc\x23\x11\x1a\x8f\x4d\xf3\x99\xdd\xda\x3a\xbb\x94\x8c\xcc\xc9\xe1\xde\x8c\x50\x7f\x68\x0d\x8c\xe7\x55\x13\xb1\xe5\xde\x65\x29\x19\x0f\x87\x93\xc3\x3d\x18\xa1\x91\x35\x99\x3c\xb3\x47\xa0\xac\x97\x92\xfe\x60\x32\xea\x37\x2d\x5f\x6f\xd8\x7b\x6e\x4d\x61\xc4\x53\x32\xec\x8d\x26\x4d\x9b\xdc\xb4\xc6\x03\xb1\xc9\x61\xb3\xe7\xf5\xf5\xfa\x86\xd9\xaf\x1f\xf6\xe1\xa4\x3f\x78\x76\x0d\xe3\xb1\x31\x18\xd4\x6a\xb0\xc6\x13\xeb\x70\x30\x59\x09\xab\xd7\xeb\x0d\xc1\xe8\x10\xc1\xf6\xc7\xc4\xa1\xf2\x58\xe4\x88\x6e\xa9\xba\x26\x23\x09\xb9\xe7\x73\x51\x23\xa5\xd4\x49\x12\x0f\x39\xa0\x4c\xcc\x28\x28\xb5\x42\x96\x59\x60\xb3\x34\x25\xfd\xf1\x60\x70\x1c\x1a\x95\xfa\xd3\xeb\x8d\x65\x7f\xa4\xdd\xee\x93\x1d\x6a\xea\xc1\x4c\x7c\xb1\x79\x77\xe5\x3b\x6b\x41\x12\xf7\x7a\xa3\xe7\x35\x0e\xa7\x4e\x34\x1e\xa1\xf1\xc0\x14\xa9\x7e\x7d\x5e\x48\xac\x3c\x34\x3f\x7b\xaa\xb2\x73\x58\x9e\x2c\x5f\x74\xd5\xcf\x27\xcb\xcf\x33\xcd\x02\xfb\x50\x01\x3d\x49\x44\x99\x58\x94\x89\xf3\x32\x71\x51\xc6\x81\x29\x1e\x0d\x26\x87\xd0\xa7\x61\x90\x00\x0d\xbe\x7f\xc5\x15\x08\x38\xb9\xe4\x2a\x8f\x5a\x73\xcb\x18\x8e\x0f\xcf\x41\xd3\xb4\x8f\xc4\xd3\xf7\x76\x68\xeb\xec\x4e\x76\x66\xeb\xec\x54\x47\x26\xc6\xa4\x7f\x08\x4c\x9b\x0e\x83\x39\x19\x7f\x7f\x47\x24\x28\x3a\xd9\x17\x99\x25\x3b\x0b\x13\xe3\xc4\xb5\x59\xea\x0e\xc0\xb6\xef\xef\x0f\xc0\xb3\x93\xdd\x81\x1c\x59\x6f\x0c\xd3\x78\x16\xa4\x00\xf8\xf8\x1f\xf4\x26\x8c\x4e\xc3\x09\x91\x21\xdb\x31\x83\xf1\xa0\xe9\x06\x1d\x0f\x07\xe6\xb0\x7e\xa9\x77\x25\x2b\xb0\xb1\xf9\x92\xfa\xa5\xa7\xbc\xe5\x42\xa2\xd8\x0c\x93\x61\x23\x0a\x32\xee\xf7\x05\x4a\xd4\xd8\x06\x09\x68\x73\x2b\x50\x34\x6b\x47\x32\x12\x0a\xb5\x1d\x69\x4a\x31\xad\x7f\xe8\xc6\x1b\x47\x79\xba\xde\x38\x5b\x08\xa4\x42\xfa\x13\xab\xd7\x34\xf0\xc1\xc0\xb0\x0e\x06\x5e\xc1\x66\x76\x4e\x14\xb3\x37\x01\x17\x50\x6e\xdc\x88\xc8\xf4\x0d\x73\x54\xba\x54\x87\xfd\xfe\xa4\x76\x59\x00\xac\x6b\xba\xf9\x46\xa3\x61\xff\xf4\xcd\x27\x61\x61\x05\xdb\x18\x9a\xc3\xc9\x51\x84\x8a\x44\xc8\x1c\x59\x16\x18\xdd\x0e\x86\x23\x6b\x0c\x29\xc3\xbe\x35\x84\x07\x73\x64\x89\xdf\xc9\x64\x20\xe0\x70\x84\xfa\xa6\x35\x80\x2c\x56\x6f\xdc\x83\x84\x7e\xaf\x07\x5f\x86\xfd\xd1\x08\xca\x8c\xc7\x96\x09\xf5\x0e\x07\xbd\x31\x7c\x32\xad\x51\x0f\x32\x4f\x46\x13\x71\x97\x44\x68\x30\x11\x18\x98\xc8\x63\x08\x5c\x1c\x10\x4d\x6b\x02\x9d\xe8\x59\x3d\x69\xd3\x39\x34\x2d\xd5\xc2\xb8\x3c\xe8\x86\x29\xbf\x7e\xd8\xde\x86\x7e\x4a\x06\x43\x6b\x7c\x38\x6d\x45\xce\x08\x8d\x7a\xe3\xd1\x00\xa7\x64\xd0\x37\x07\x87\x27\xbe\x9c\x73\x62\x8e\x0c\xb1\x11\x26\xc6\x68\x70\x78\xf3\x57\xea\x34\x06\xe3\x89\xc8\xd9\x1b\x5a\xa7\x5b\x9f\x58\xbd\xfe\x58\xe4\x1c\xf6\x1b\x76\x7c\x39\x67\x7f\x38\x36\x45\x3f\xc7\xe3\xb1\x79\x08\x28\xcb\x39\x87\x83\xf1\xd0\xc4\x29\x81\x91\x1d\xa7\x2e\x04\x41\x54\x27\x79\xc4\x08\x8f\x13\x0b\x82\x20\xaa\x13\x0b\x62\xa4\x47\x4b\x00\x41\x54\x6f\x43\x8c\xf8\x78\xaf\x04\x45\x54\x27\x7a\xc4\xc8\x8f\x97\x10\x24\x51\xad\x04\xcc\xc0\x71\xd2\x4d\x90\x44\x78\x2a\x4e\x6e\x7f\x28\x77\xf9\xa8\x07\x7b\x70\x3c\x32\x26\xf0\x60\x4d\x06\x03\xd8\xa7\x13\xc3\x32\x61\x33\x8a\x6b\x07\xb6\xf0\xa4\x37\x1a\xc1\x66\xec\x8f\x46\xfd\x1e\x26\xd5\x86\xcd\x26\xf2\x22\x6b\x78\x60\x59\xc6\x58\xdd\x62\xbd\x11\xdc\x62\x9f\x1e\x76\x0c\xec\x08\x8f\x40\x68\x6f\x85\xbc\x92\x72\x21\x9f\x4a\xf3\x43\x07\x89\xaf\x1d\xad\xe5\xc5\x60\x72\xe8\xe4\xac\x6d\x0d\xe0\x67\xcf\xb2\x8e\x8f\x3f\xef\x86\x04\x0c\xcf\xeb\xc5\xa1\x51\x80\xb8\x23\x9a\x7a\xa6\x5d\x39\xc1\x9f\x78\x2b\x66\xbc\xa5\x75\x54\x37\x9d\xb8\xe5\xb4\xf2\xdb\x08\xfa\x38\xb6\xcc\xc9\xb0\x6a\x8d\x74\xd8\x36\x78\xe7\x1d\xf6\x07\xc3\xe3\x93\x3a\x1a\x59\xe2\x02\xfe\xbe\xd1\x3c\x6b\x4e\x83\x96\x1a\x33\x74\xb7\x37\x3c\x3c\xc9\xda\x3e\x66\x2d\x81\x0a\xba\x5c\x2b\x80\xf7\x78\x68\x8c\x72\x32\x51\x21\xcc\x43\xcb\xc0\x48\x53\x69\x5a\x79\xbb\x06\xb3\xf9\x22\xcb\xdc\xc4\x66\xcf\x15\x48\x72\x06\x7f\xee\xd7\x73\x96\x27\xcd\xcd\x85\x8a\x3b\x24\xfa\x3a\x30\x27\xd6\x21\x28\x6b\xec\xec\x68\x38\x1a\x9b\x72\x4b\x5a\x83\xbe\x61\x4a\xc4\x7a\x64\x58\xc3\x91\x40\xac\xc5\x76\xef\x0f\x7b\x98\xc4\x70\x9a\x27\xe6\x18\x93\x50\x60\x3d\xa6\x29\xa0\xb6\x2b\x86\xdb\x13\x15\x2c\x01\x42\x8d\x06\x26\x26\xfb\x9c\xdc\x21\x9b\x9c\x76\x22\x3b\x89\x92\x9c\x44\x44\x1c\xc4\x31\x89\x68\xa8\x64\x9e\x2b\x5a\x1f\x32\x59\xd3\x55\xf3\xb0\xc9\x96\xca\x87\x36\xa5\xeb\xa9\xb8\xba\xd7\xd4\x43\x6b\xb2\xba\xb0\x4a\xd9\xad\x7c\x96\xe4\xe5\x71\x47\x1e\xc8\x2d\xb9\x82\x20\x4e\x9f\xe9\x06\x31\x4c\x6e\xa8\x01\x46\x54\x9f\xa5\xc8\x98\x52\xba\xd3\xf5\x18\x7d\xc6\x52\x3f\x80\xba\x22\xd3\x03\x8d\x66\x01\xbb\x07\xf1\x1e\xba\xc3\xf6\x0e\xdd\xe1\xe9\xdd\xc5\xcd\xf4\xa6\xd3\xc1\xd7\x74\x3b\x5b\x23\x36\xbf\x59\x90\x1b\x6c\xc3\xef\x12\x3d\x90\x1b\x72\x8d\x0b\x7b\xb8\x4b\x8a\xae\xe8\x1e\x31\xf2\x19\x63\x60\xa3\x56\xea\xb4\xe7\x8b\x69\x1b\xdd\xd2\x00\x5d\x92\x2b\x8c\x21\xe8\x50\x5e\xb7\x8f\xae\xc8\x9a\xcc\x6f\x95\xa4\xe2\x66\x01\x51\xa7\xb2\xd7\xbc\x29\xb5\x7d\xb2\x40\x5a\xf4\x86\x3c\x08\xc8\x30\x30\x1b\xee\x99\x1c\x96\x5a\xa3\xbe\xc2\x24\xcd\x49\xbe\x1b\xe4\x0a\xfb\x27\x05\x6a\x8c\x44\xc4\x57\x06\x5e\x24\x04\x75\x0e\xe2\x52\x07\x85\x62\x6b\x04\xc8\x27\xae\xf4\xf0\xaf\xeb\x51\x9b\x2a\x1b\xe8\xa9\x7b\xb1\x84\x58\x6e\x28\xa6\xe1\x7c\xd9\xe9\x2c\x70\x9b\xc6\x79\x78\xd6\xb4\x30\x1e\x14\x19\x97\x52\xff\x02\xf1\x24\x01\x47\x49\x21\xd6\xf5\x70\xbe\x5c\x50\x4a\xf3\xc8\x86\xe2\x5b\x92\xe4\x81\x5d\xb9\xae\x9f\x99\x69\x5a\xda\x73\x8f\x19\x0a\x64\xfb\x08\x2c\x62\x24\x31\x24\xde\x4c\x71\x72\xe0\xec\x1e\x07\x35\xa5\xc3\xd2\x1b\xf6\xfa\x72\x7a\x2c\x63\x32\xea\xc9\xc3\xa2\xce\x4d\x9c\x4f\x9a\x38\x2b\x96\x69\xf4\xc4\x64\x04\x68\xbe\x00\x59\xaa\x98\x92\xc3\xcd\x6f\x52\xca\x49\x44\x2d\xf1\x13\xd0\x9e\xf8\x59\xd2\xbe\xf8\xd9\xd3\xa1\xf8\xd9\xd0\x91\xf8\xd9\xd1\x01\x48\x7d\xf6\xd3\xfa\x1a\xac\xc8\x9a\x6c\xc9\x5d\x61\xf8\x0b\x9b\x9b\xfa\x68\x85\xc9\x25\x75\xd0\x15\xc4\x3e\x43\x6b\xb2\xc5\xe4\x33\x8d\xd1\x25\xec\x76\xf2\x33\xbd\x4b\x92\x90\xdc\x53\x36\xfb\x19\xad\xc8\x67\x6c\x47\x49\xb2\x81\xe7\x3c\x9a\xd9\xf4\xb3\xda\xdc\x62\x05\x76\x49\x72\x23\x56\xe0\x12\xeb\x3a\xba\xa5\xd7\xe8\x81\x5e\xc2\x6e\x27\x57\x98\x70\x0c\x96\xfa\xf8\x7e\x7e\xb3\xa0\xb7\xb9\x55\xc9\x2d\x8e\xef\x3d\xee\x6e\xc4\x78\x5d\x27\x66\xad\x9e\x9d\x87\xe1\x85\xf7\x81\x9d\x6d\x58\xf9\x3e\xcc\xde\x6f\xe4\xbb\x65\xbb\xe8\x9e\x3c\x64\x9e\x2f\xab\x95\xf5\xed\xdc\x2d\x35\xbc\x8f\xb2\xcc\x59\x28\xb7\xd9\x99\x69\x07\x49\xb2\x9c\x2d\xed\xfb\xea\x86\xc8\x20\xef\x12\x19\x98\x6c\x9d\x9d\xbd\x44\x26\x26\xca\xc9\xe9\x12\x59\x98\xc4\xe1\x96\xd9\x4b\xd4\xc3\x84\xdd\xb1\xe8\xc1\x5e\xa2\xbe\xd4\x8e\xb5\x97\x68\x20\x9f\x40\x06\x68\x2f\xd1\x30\x2b\xf9\x91\x89\x8b\xc3\x5e\xa2\x11\x5c\xc7\x83\x89\x79\x9c\x98\x1c\x0c\x46\x03\x75\xe8\x26\xe6\xb8\x6f\x64\x87\x4e\x20\x5b\xc4\xa7\x81\xf2\x6c\xc6\xe2\xca\xb5\xd1\x70\x18\x9d\x0b\x3a\x30\x93\xa4\xed\xd5\x75\x76\x18\x9d\x2f\xd4\x6e\x91\xbe\x31\x33\x49\x3c\x7d\x4c\xf1\xbc\x2c\x2a\x2f\xcc\xa6\xc2\xd0\x36\xd3\x94\x98\x6d\x4a\xd9\x9c\x2f\xd0\x8f\x61\xe8\x33\x27\x10\xf7\x5a\x98\x62\x60\xd8\x0c\xad\x43\x5c\xb1\xf1\x92\x91\x23\x3c\x4a\x04\x66\xce\xf8\xe6\x3c\xeb\x65\xbb\x1d\xe9\x7a\x65\x18\x51\xc9\xa2\x82\x25\xc9\xa1\x04\xcf\x4c\x89\x09\x81\x87\xc9\x78\x3c\x31\x8e\x23\x98\x80\xa1\x29\x1c\x4c\x9e\xd6\xda\x19\x96\x07\x37\x2e\xb0\x08\x12\x3e\x09\xf9\x42\xe2\xe2\x47\x2f\x8b\xa8\x2a\x00\x1e\x13\xf7\xa0\x83\x96\xe2\x0e\xf4\xc5\xcf\x8e\xf2\xd9\xe6\xcc\xb4\x0d\xb2\xa2\x5c\x6c\x47\x30\xfe\x0b\xcf\x2d\x9c\x99\x47\x7b\x2b\xb4\x13\xc7\x6a\x8f\x1f\x5d\xba\x9f\xef\x16\x64\xd7\xa1\xab\xcc\xda\x79\x85\xc4\x1b\xe1\xb3\xdd\xb9\x61\x6f\xce\xe9\x4e\x39\xa2\x88\x91\xf6\x11\x18\x17\xad\x70\xd5\x02\x1b\x8a\x96\x23\x2e\xda\xd6\xbd\xc7\x37\xad\x20\x6c\x79\x81\xc7\x3d\xc7\x6f\x49\x6f\x90\x2a\x80\x27\x9f\xed\x2e\xa8\x61\x6f\x2e\x76\x53\x51\x2d\x96\x0d\xeb\x3a\x12\x37\xba\x4b\x64\xeb\x64\x59\xe8\x3b\xb8\xd5\x53\x23\xad\x00\x10\x38\x66\x02\x25\xd0\x50\x80\x53\x31\xf9\xa7\xd8\x49\xea\x4e\x09\xf2\x59\x76\x0a\xac\x41\x31\xf1\x4a\xb6\xfe\x47\xf6\x4b\xd9\x83\x46\x48\xc1\x33\xa4\x2b\xee\x1b\x02\x57\x8d\x87\x24\xc0\x12\xb7\xc2\x2c\xb4\x23\x91\xba\xa7\x3e\x8a\xd1\xf2\xcc\x85\xb8\xc9\x1b\x6a\x4c\xdd\xf3\xe5\xd4\xed\x74\xc8\xa6\xd3\xc1\x0e\xda\x93\x0d\xe1\x73\x77\x71\x10\xf9\x91\x6e\xc8\x5e\xec\xf4\xd1\xa0\x81\x57\x5c\x70\x5f\xc4\x4d\x50\xa1\xb8\xe7\x2a\x24\xa5\xa0\xd6\xfa\xe3\xe1\x71\xda\x45\xcc\x96\x98\x0f\x18\xf2\xca\x0f\xc3\x88\xd4\xf5\x14\x94\x2a\x67\x86\x00\x89\x11\x47\x2f\xac\xbc\xab\xd1\xf9\x78\xe6\x43\x4e\x3b\x46\x9c\x38\x02\xb3\x25\x86\x18\x35\xc3\xea\x4d\x3e\x8b\xce\xf8\xb5\xba\xb3\x69\x04\xc3\xc6\xa2\x0d\x87\x9a\x53\xe7\x3c\x98\xca\x0c\x1e\x75\x48\x44\xf9\xdc\x59\x4c\x3d\x5d\x67\x88\xcf\xbd\x33\x73\x41\x22\x7c\x61\x4c\x31\x9f\x7b\x0b\xca\xe7\x67\x67\xde\x62\xea\xb5\x29\x75\x3a\x1d\x5d\x07\xff\x25\x34\xca\xa1\x2f\x4f\x49\x7d\x09\x89\x57\xf6\xaa\xc9\x8a\x96\x33\xa7\x02\xc4\xa7\x06\x98\xa7\xf8\xe7\x41\x92\xc4\xe7\x8e\x68\xcb\xef\xc4\x0b\xea\x9f\x07\xba\x1e\x9f\x3b\x33\x0f\xb1\xb9\xbf\x20\xd1\x3c\x5e\xe0\x73\x6a\xcc\xd8\xdc\xef\x74\x16\x76\x34\x8f\xc5\x8f\x7f\x1e\x54\x53\x72\xfe\x56\x79\x23\x3b\x29\xe9\x8f\x8d\x06\x3e\x7e\xbe\x42\x93\x51\x6f\xa0\x38\x7d\x12\xe7\x75\x0a\x9a\xc3\xcf\x41\x76\x09\x46\x93\xf8\x69\x4c\x77\x5a\xe0\xf6\xe2\x0e\x0d\x90\x62\xd7\x67\x70\x19\x02\xac\x67\xec\x64\x56\x52\x89\xc2\x49\xe2\x20\x86\x75\x5d\x6a\x8c\x50\xc4\xa8\x98\x04\x2c\x0b\x28\xdc\x96\xe4\x47\x80\xcd\x62\xc9\xb3\x33\x8d\xe3\xf7\x0f\x4c\xc0\x71\xe8\x5c\xd8\x26\x48\xaa\x09\xc9\x8a\x0d\x5b\x72\xea\x04\x79\x70\x1c\xd8\x0a\xca\x4d\x71\x26\x8d\xd1\x64\x7c\xac\x15\x12\x81\x32\x5a\xf4\x90\x5f\x65\x33\x86\x04\x3c\x9d\x1b\x62\x81\xcd\x05\xb6\x19\x8a\xb2\xa0\x2d\x3e\x7e\x14\xa5\x34\x00\x80\x1a\xf1\xc1\x91\xf0\xc0\x6a\xe0\xde\xe4\x9c\x0b\xb5\x48\x1e\x67\xd2\x53\x2c\x96\xe6\xd7\x99\x1e\x8a\x43\x0d\xe2\xd3\x47\x81\x87\x37\x98\x10\x0b\xec\xdb\x6e\xb7\x9d\x4e\x27\x4d\x89\x4c\x2b\xe7\x0a\x68\xdb\x48\xd3\xa9\x2f\x36\x7d\xb3\x06\x60\x4a\x0a\x99\x28\xf2\x0f\xbd\x84\x5a\x69\x36\xb4\x18\x3f\xa6\xc7\x16\x42\x50\x25\x4c\xd7\xdb\x41\x35\x74\x47\x54\x1d\xc8\x63\x3a\x75\x1a\x7b\x72\x72\x74\x11\x8c\x21\x4d\x09\x04\x8c\xcb\xa7\x39\x3b\xc1\x11\x70\xc4\xc7\xc6\x71\xd1\xb3\xc2\x87\x03\xea\xa1\xc7\xb4\xcb\x43\x49\x8c\x8b\xd3\xe2\x21\x4d\x53\xe0\xf0\x09\xf4\x05\xe8\x6f\x32\x26\x67\x80\x8a\xf7\x06\x3d\xeb\x84\x40\x60\x00\x54\x65\x50\xb0\x33\xe0\x2e\x11\x7d\xac\x9e\xcb\xac\x2b\x9f\x9c\x35\x9c\x4d\xc5\x2c\x0e\xa9\x76\x99\x91\x85\x1a\xa5\x0e\x3a\x5c\xb9\x9c\x6c\x4c\x11\xae\xc0\xf7\x99\x73\xa8\x12\x2b\x40\x5a\x39\x96\x39\x1c\x3f\x3e\xd3\x7e\x0b\x24\x63\x79\xa9\x29\xbb\x02\x91\xf8\x7e\xef\xfb\xda\x81\x0c\x09\x45\xb5\x05\x2f\x9d\x07\x3e\x67\x0b\xb5\x2c\x11\x7e\x4c\x53\xc4\x68\x2c\x26\xcb\xc7\x78\x16\xd9\xe1\x4c\x00\x05\x5b\xfb\x90\xb1\x68\x04\xd0\x46\x4c\x40\x05\x40\xf8\x1c\xdf\x67\x0c\xcf\x4a\x23\xb6\xbd\x34\x25\xa3\xc9\x70\x78\x1c\x51\xca\x26\x70\x2b\x5a\x3d\x8a\x7a\x4a\xf4\xf2\x45\xf7\x05\x6c\x41\xed\x45\xf7\x85\x26\xb0\x45\x86\x8b\xde\x96\x86\xc1\xc4\xce\x6c\x9b\xe4\x30\x5f\x20\x46\x95\x87\x8c\x12\x77\xae\x79\x8a\x91\x56\x47\x28\xab\x38\x6f\xae\xdc\xc6\x51\xb1\x87\xcb\xfa\xc8\x65\x14\x18\x50\x4a\xa5\xb1\xbc\x66\xfc\xd7\x2c\xd3\x87\x15\x02\x72\x1c\xb7\x29\x2d\x95\x4d\x71\x4a\xac\xf1\xa8\x37\x7e\x8a\x75\x55\x02\x9e\x8f\xd2\x87\x3e\x27\x70\xd6\x98\x38\x67\xc3\x81\x79\x82\xa7\xd5\x9f\x0c\xfb\x19\xdc\x1c\x1b\xa6\xc2\x94\x06\x66\x6f\x58\xe5\xed\x1f\x3a\x09\x57\xc0\xba\xbb\x82\x14\x07\x99\x10\xd2\xe8\x90\xd3\x5f\x6c\x2b\x1a\x11\x0e\x3c\xa3\x5e\x85\x65\xfa\xe4\x98\x58\xb0\xdf\xb2\x08\x34\x5b\xdb\xc8\xd4\x05\x1a\xa6\xdc\xd7\xaa\x34\x4b\xa4\xdd\x47\x4a\xfb\xb5\x8d\xfa\xe2\x5d\xce\x04\x4c\x01\x20\x7e\xcf\x64\xa9\x59\x93\xde\xe4\xe9\xf9\x68\x9a\x4e\x1f\x78\x11\x53\xd0\x2e\xe6\x33\x39\x31\x3e\x71\x10\xc4\x7a\xb2\xb9\xa0\x7e\x00\xba\x59\x93\x13\x3c\x66\x58\xad\x13\x97\x57\x50\xcc\xbc\xae\x07\xdd\x62\x6a\x66\x72\x86\x6d\x4f\xd5\x08\x53\xdd\xeb\x1b\x27\x14\x8b\x46\x86\x61\xc0\x58\xd5\x9e\xac\x0a\xa6\x8e\x5e\xd3\xe2\x94\x05\xc8\x23\x9c\xa8\xdd\xc6\x6a\xeb\x61\x94\xd6\xc2\x48\x4b\xe7\xd3\x93\xfa\xb2\xd9\x11\x15\x9b\x73\x64\x35\xc8\x9a\x9a\xf9\x87\xc0\xc7\x0e\x9e\xe0\xb9\x66\xd7\x97\x34\x96\x86\x6d\x97\xf9\xd1\x03\x76\x71\x10\xf2\x96\xfa\xb6\x53\x03\x6d\x69\x1d\xb1\x70\x1d\x4d\xd0\x35\xe2\x99\x83\x0a\x23\x9c\x8c\xff\x14\x2e\xa8\x21\x8e\xda\xcd\x73\x8b\x1e\x53\x62\x92\xc7\x8a\xdf\x8f\xa2\x50\x9a\xe2\xb9\xb9\x10\xc7\x7f\x30\xe9\x8f\xc6\x0d\x56\x11\x07\x2c\xf2\x4c\xe5\x56\xd7\x73\xe5\x5b\xc7\xf7\xcb\x74\x94\xe3\xfb\x36\x23\x6f\xae\x6f\x7e\xfe\xf4\xee\xed\xcb\x97\x97\x76\x81\xba\xe9\x7a\xce\xd0\x04\xf9\xf8\x70\x38\x3e\xc1\x04\xcf\x36\x4d\x8e\x9b\x3a\x14\x22\xd4\x43\xab\xc0\x45\x70\xe0\x36\x70\x94\xa4\x55\x69\xa6\x3e\x71\x25\xfb\xb3\x5a\x7e\xc4\xb1\xfd\x28\x0e\xaf\x69\x0e\x26\xfd\x86\x39\x78\x06\xef\x9d\x5f\x4c\x0c\x63\x64\x4e\x26\xd6\xa0\x3f\xea\x1b\x93\x89\xa9\xf6\x02\x43\xda\x3b\xe7\x9b\xb7\xdd\x6f\x5b\xe0\xbe\x16\x1c\xa2\x2f\xd9\xb7\x16\xfb\xe6\x32\xb6\x64\x4b\xad\xb0\x9b\x17\x5b\xa1\x6f\x5a\x83\x23\x10\xeb\xf1\xea\xfa\xfa\xe3\xde\x67\x6f\xbd\x98\xdb\x06\xb9\xba\xbe\x06\x0d\xfd\x97\xcc\xf5\x1d\x65\xfe\x04\xa9\xa0\xec\x9c\x65\xca\xc3\x08\xa9\x84\x97\x1f\xde\x55\xdf\x24\x26\x51\xbc\x83\x83\x2f\x78\x35\xc9\x4b\x87\x3b\x9f\x22\x27\x88\x57\x2c\x7a\xc3\xd9\x56\xe5\x7a\xed\xe5\x9d\x10\x4b\x7c\xe9\xfb\x57\xa1\x9f\xf9\xeb\x93\x69\x07\x09\xaf\xc3\x68\x9b\x99\x94\xc8\x14\x69\xc2\x5e\xa4\xbd\x63\x4b\xcf\x51\xd5\xbe\xf3\xb6\xe0\xe0\x17\x50\x4c\xdb\x20\xef\x9d\x2d\x5b\xbe\x0f\x97\xec\x9d\xb3\x13\xaf\xe1\x92\xa9\x2e\xfe\xea\x78\x62\x7c\xff\xde\xb3\x38\x1b\xd4\xaf\xfe\x7e\xed\x05\xf9\x43\x56\xc7\xf5\xe7\x9f\xa4\x63\x5a\x95\xed\xfa\xf3\x4f\xd2\x93\x74\xf1\xfe\xab\xc3\x37\xd7\x6c\x5d\x4a\x08\xbd\x80\x17\xaf\x95\xb9\xba\xfe\xfc\x93\x9c\x9b\x30\xca\x26\xe6\x1a\x3c\xfd\xff\xb8\x5f\xad\x8a\x5a\xc5\x12\x5d\x6f\x18\xcb\xaa\xf9\xc4\xbe\xf1\x4f\x91\xe3\x7e\xbd\xca\x17\x29\x4f\xca\xde\xc3\xbd\xab\x7a\x29\x20\xeb\xb0\x6f\x1e\x97\x5f\x8e\x87\xc6\xa0\x87\xbb\x80\xd0\xa0\x17\x2b\x2f\x62\xab\xf0\xdb\x97\x17\xe8\xcb\xb2\x83\x5f\x78\x15\xb0\xd1\xf6\x74\xbd\xe3\x89\xf3\x4e\x4e\xa2\xa1\xb2\xca\x52\xc9\x17\xef\xae\xdf\xbc\x4a\x3e\x45\xde\x92\x05\x5c\x59\x53\x7a\x58\xe0\x33\x27\x34\x43\x15\xda\x1a\xe4\x07\xb9\x54\xa1\xb6\x8b\x42\x97\xc5\x02\x49\xf5\x50\xd0\x55\x6f\x38\x25\xd0\xf4\x71\x80\xd0\x1b\x0e\x6a\x6a\x00\x81\x73\xe7\xad\x65\x9c\x0c\x01\xca\xa3\xcb\x35\x44\x8a\x02\xa7\xbe\x04\xd8\x8d\xc7\x3c\x55\x29\x99\x10\x80\x18\x3f\x1f\x35\x89\xa9\x93\xf5\x87\x84\xd4\xe9\xbe\x64\x41\x48\x5c\x1a\xeb\x7a\x9c\xe9\xe1\xc6\x49\x12\xea\x7a\x98\xbd\x92\x25\x75\x75\xdd\xed\xde\x8d\xa7\x4b\x70\x51\x81\x3c\xba\xcc\xac\x81\xba\x1a\x16\xf4\xde\x85\xa1\xeb\xde\xdc\x58\x9c\xf7\x67\xa6\xdd\x41\xe2\x11\x56\x02\x63\xd2\x0e\x74\xdd\xd7\x75\xd4\x46\x1e\xf5\xb3\x75\x7c\xb5\x5c\xb3\x6c\x11\x05\x7d\x2c\xf2\x5e\xd0\x51\x1f\x43\xbc\xbf\x3c\xdb\xd5\x26\x0a\xb7\xa5\x8c\xd0\xbc\xac\xb8\x24\xc2\x0d\xc4\xed\x3c\x38\xc5\x0f\xa8\xec\xa1\xcb\xdd\xce\x67\x7f\x63\xb7\x7f\xf1\xb8\xaa\xf9\x4b\xf7\xc5\xb1\x8d\x04\xaa\x19\xc7\x79\x63\x75\x1d\x86\x26\x51\xe0\x9c\x77\xb4\x1c\x41\xd5\x16\x00\x04\x27\xbd\xc9\x11\x20\x38\xd7\xca\x46\x57\x44\xab\x9a\x50\x69\x44\xf3\xe2\x12\xb6\xab\x11\x2d\xbb\x7b\xdf\xc4\xaf\x72\x0c\x46\x23\x1a\x0f\xdf\x86\xae\xe3\x33\xa5\x47\x42\x72\x9a\x4a\x23\x32\xc6\xcc\x87\x95\x26\xc6\x67\x0c\x1a\xb8\xdc\xcd\x58\x43\x71\x5d\x59\x83\x7e\x4f\x71\xbc\xfb\xbd\x81\x21\x37\x98\x22\xe9\x62\xf8\x3e\xb0\x06\xb8\xbb\x02\x51\xca\x68\xd2\x1f\x5b\x52\xec\x28\xe7\x0b\xe4\x8e\x4a\x2c\xb3\xcf\x11\x35\x90\x3b\x0a\x3c\xd1\xc2\x64\xd7\x40\xae\xe4\x29\x11\x58\xbb\x3d\xaa\xd8\x9c\x2d\x2f\x88\xb9\x13\xb8\xe0\xc5\x15\x3f\x2a\x19\x43\x5d\x06\xa9\x44\x0e\x86\x5d\x72\xda\xc0\xa5\xd8\xc1\xac\xa4\xa1\x08\x67\xa2\x8b\x6a\x32\xf1\x70\x5a\x4f\x21\x4e\x91\x86\xa4\xf5\x6b\xd9\xa2\xab\xb0\x2c\x2d\x3c\x5b\x97\x88\x12\xc2\xd2\xd3\xdc\x75\x12\x10\x25\x1d\x92\x12\x4f\x30\x5d\x8a\xd6\x8c\x93\x4b\xca\xbb\xd2\xce\x8f\x5c\x53\x19\xa0\x85\x7c\xce\xea\x26\x37\xf4\x72\xe6\xd9\xd7\x33\x6f\x7e\xb5\xb0\x91\xf8\x9b\x24\x8f\x29\x2e\xb5\xfc\x33\xbd\x9c\xb9\xb6\x0b\x5f\xf6\xc8\x25\x57\xe4\x31\xc5\xf3\xab\x05\xb9\xa7\x3f\x97\xf4\xcf\x56\x61\x84\x56\x02\x07\x67\x38\xa2\xed\x10\x5d\xce\x56\xf6\x55\x07\x5d\xcf\xb4\xae\x66\x6b\xff\xa5\xe1\xce\x4a\xda\xc3\xb8\x6c\x89\x75\xfd\x46\xd7\x37\xe8\x86\xac\x30\xd9\xd2\x9f\xe7\xab\x05\x89\x74\x1d\xdd\x41\xac\x9e\x80\x5f\x39\xbe\xff\x13\xe3\xd7\x8c\xcf\xd0\x2d\x8d\x21\x1f\xd6\x75\x25\x01\xb5\x6f\xe6\xab\x05\x26\x6b\x1a\xe9\xfa\xdd\xec\xce\x66\xa2\x38\x6a\x47\x49\xa2\xb0\xb2\x6d\xee\xaa\x77\x2d\xa0\xc0\x03\xe5\xdd\x5b\x2f\x58\xea\x7a\x34\x5b\xa2\x35\xf1\xb0\xcd\xc1\x3e\x54\x24\xec\xd0\x1a\xdb\x9f\x75\xdd\x47\x6b\x3c\x73\xc4\xcb\x9a\x20\x0e\x4a\x61\x49\xb2\xd6\xf5\xb5\x7a\xdc\xea\xfa\x16\x1e\xb1\xae\xef\xd1\x03\xd1\xc4\xb3\x8c\x69\xb0\x47\x3f\x93\x15\x79\xc0\xe4\xb3\xae\xa3\x0d\x72\x49\x40\xaf\xca\xa7\x18\xcb\x79\x0b\xc4\xbc\x91\x3d\x72\xe7\xc1\x42\xac\x95\x34\x0f\x75\x7c\x5d\xbf\xd7\xf5\xf6\xfd\x7c\xb5\x10\x35\xdf\xc3\x27\xc0\x84\x01\xd7\x7d\x92\x60\x2b\x93\xdf\xed\x36\xcf\x03\x1f\xe7\x74\x1c\xf0\x7d\x88\x38\x85\xc7\x79\x2d\x13\x43\x4a\x85\x5f\xab\x0c\xa5\xe5\x77\x68\x20\x8d\x10\xc1\x5b\xaf\x5b\x45\x6f\x0f\x10\xe2\x8f\x6c\x25\x10\x19\x5d\x57\x0f\xb2\x68\x92\x20\x6f\xe6\xc3\x22\x20\x07\x37\xf9\xfc\x53\x76\x8e\x4e\xf9\x48\xe0\x94\xc0\xc1\x3f\xc1\x7c\x04\x78\x12\x14\x42\x1f\xa7\x18\x8c\x20\x0b\x3d\x68\xf2\x69\xce\x27\xe2\x15\x96\x2a\xb7\x9d\x8c\xe5\xde\xc0\xee\x53\x5d\x65\x15\x43\xd2\x94\x40\xb3\xff\x29\xdd\x22\xed\xee\xcb\x29\x29\x96\xd3\x95\x3b\x10\xca\xd5\x7f\xda\x65\x8d\xe4\xba\xd5\xac\x56\x56\xc1\xc1\xb0\xec\xc6\x09\xc9\xc6\xf1\x75\xaf\xaf\xb4\x37\x0b\x64\x87\x82\xa6\x49\x51\x5b\x04\x05\x95\x49\x21\xd6\x64\xfc\x3c\x1e\x88\x02\xe5\x4e\xd3\x06\xf4\xa9\x97\x1b\x9c\xaf\x19\x2f\x8d\xf6\x25\x8b\xdd\xc8\xdb\xf1\x30\x22\xb1\xa0\x7f\x88\x16\x38\x5b\xa6\x61\x12\x0a\x14\x45\xcb\xbd\x46\x69\x94\xd6\xe7\x56\x64\x94\x98\x0c\x6a\x7b\x49\xe2\x09\x00\x90\x97\xef\x96\xe9\xea\xf2\xa2\x3d\xbe\xfa\xfb\x9b\xeb\x4f\xd7\x76\x4c\x7e\xfd\xf8\xe1\xd7\x57\x1f\xed\x90\x5c\x7d\x78\xff\xfa\xcd\x4f\xbf\x7d\xbc\xfc\xf1\xed\x2b\xdb\x05\x5d\xa6\xde\xe0\x38\x86\x5a\x42\x04\x0f\xc4\x4a\x75\x7d\xac\x6c\x2e\x44\xf7\xcb\xea\x4c\x10\x20\x26\x25\x50\xfe\x3f\x3e\xd2\x62\x79\xe5\xd4\xca\x75\x55\x87\x93\x38\x55\xf6\x93\xdf\xa4\xb0\xd4\xc0\x49\xcd\xec\x94\x6b\x87\x42\x20\xa9\x4f\x20\x44\x25\xa4\x58\xf2\x7c\x24\x66\xd0\xa8\x8c\xe2\x20\x8e\x67\x5c\x91\xd0\xc7\x2f\xc4\x3a\x7b\x57\xdd\xeb\xe7\xd6\xcc\x87\xd0\x0c\x38\x49\x7c\x14\x88\x07\x5b\xbc\x0a\x6c\x94\x2f\xe6\x6c\x91\x24\x01\xbc\x06\xf2\x55\x32\x72\xcc\xe3\x73\x0c\x0c\x6c\x65\x30\xd1\x1f\x8d\x32\x16\x75\x6f\x90\x61\x39\xe3\x7e\x6f\xd2\x97\x58\xce\xa1\x80\xe2\xf8\xca\xb7\x9d\xea\x6a\x93\x18\x27\x09\x08\x44\xfe\xe7\x7f\x8a\xf2\x49\xe2\xcf\xc5\xb6\x58\x80\x44\xdc\x68\x50\x58\x2d\x58\xe9\x85\x54\xb6\x80\x93\x4a\x74\xe3\xe7\x3c\x9e\xb8\xd0\xe5\x0a\x9f\xc1\xee\x91\xa2\x89\x86\x49\x8e\x11\xc7\xb6\x8c\x33\x8e\xa2\x7c\x1c\x0e\x92\xd1\x89\xb1\x52\xc6\x0b\x91\x5f\x51\xc6\x83\x81\x09\x74\x14\x44\x03\x62\x3a\x9f\x23\xe1\x97\x93\xfd\x44\x1f\xf9\x9c\xe5\xc2\x41\xd1\xa5\x99\xdc\x40\xb6\x87\x22\xd1\x18\x6c\xbe\x06\x4e\x47\xc3\x06\xe4\xba\xce\xbb\xef\x1c\xbe\xa1\x20\xd1\xd5\xf5\x8a\xac\x91\x1d\xea\x50\x4a\xc4\xeb\xd3\xc6\x8b\x75\xbd\x78\xc6\x49\xd2\x90\x57\x46\x81\xd5\x75\xf9\xdb\x9c\x27\x66\xfe\x4a\xd7\xc5\xdf\xe6\xef\xb2\x8d\xac\x2d\xdc\xa4\x47\x01\xf2\x2a\x84\x93\x24\x83\x0c\x48\x2b\x7d\xd1\x30\x12\xa4\xa7\x71\x8a\x39\x9f\x8b\x82\x4a\x1a\x16\x20\x15\xaa\x5e\x46\xe5\x65\x51\xf0\x5b\x66\x28\xf5\xaa\x72\x5e\xa5\x78\x08\xa4\x8e\xfd\xc1\x60\x72\x8c\xea\x79\x04\xdc\x68\x38\x39\x0e\x65\x1b\x68\xe3\x8c\x53\xa6\x91\xfc\x51\x71\x5b\x34\x9c\x92\x81\xd1\x9f\x9c\x50\x40\x2e\x2e\x2a\xa5\xca\xe3\x80\x65\xe5\x70\x6c\x55\xaf\x74\x5d\x6f\x07\xdf\xc3\x8e\x74\x90\x74\xf6\x47\x34\x47\x3b\xc5\x96\xec\x3a\x70\x97\x1b\x93\x93\x16\x2b\xf9\xa2\x94\x3a\x99\xcb\xcb\x94\x54\x2c\x56\xd2\x3a\x41\x90\x57\x74\x54\x0f\xbb\xdd\xf6\x91\xf6\x87\x06\x94\xc0\x01\xcd\x88\x0c\x9c\x36\x79\xd7\xcb\x2c\x11\x28\x68\x7a\x0a\x48\x40\x34\x0d\xdb\x3e\x38\xdb\xf3\x53\x62\x0d\x87\x93\x53\x36\x40\xc5\x10\x0a\x91\x9f\xd5\x1f\x0d\x15\x3e\x97\xdf\x65\xb9\xf8\x71\x1a\x20\xa7\xeb\x05\xf1\x8e\xb9\x5c\x32\x9c\x70\x92\xd4\x93\x1a\x19\x9f\x08\x1c\xb1\x96\x14\x05\xaa\x65\x52\x32\x31\x8d\x06\x9b\xc6\x9c\x61\x22\x01\xbc\x69\x1a\xa6\x84\x9c\xea\x0a\x0b\x0b\x06\xad\x5b\x90\xab\xcb\x02\xc7\xd9\x17\x43\xda\x48\x76\x83\x78\xdc\x81\x69\xcf\x60\x32\xc1\x64\x45\x95\x98\xaf\xe5\xf8\x11\x73\x96\x0f\x99\x82\x8f\xf7\x07\x5b\x6a\x64\x4d\xe3\x6e\x01\x9c\xbd\x15\xf2\x93\x64\xaf\xc2\x0f\x40\xef\xb6\x54\xbd\x26\x09\x52\x4f\x34\x60\xf7\xc8\x20\x71\xf7\x6f\xcc\xf9\xfa\xce\xd9\x61\x3c\xdd\x0a\x5c\x8a\xc2\x5f\xb2\x15\xe7\x92\xc2\x5f\xb2\xed\xc6\x90\x1e\x33\x5e\xf1\x2c\xa6\x18\xfc\x90\x49\xdc\x4e\x12\x88\xaf\xd1\x0a\x17\x94\xeb\xca\x71\x9d\x25\xa3\x5c\x56\x02\x65\x08\x4b\x49\xd0\x34\xff\xd0\x32\xe2\x58\x50\x9b\x69\x45\x27\xa6\x94\x45\xb6\x95\xa6\x79\xec\x90\x3b\xba\x41\x1a\x0c\x49\xc3\xd3\xdd\xfc\x6e\x41\xdb\x46\x53\x37\x97\x88\x93\xbb\x27\x3a\xe9\x8a\x3c\xa7\xba\x28\x2b\x99\xf1\xf9\xdd\xc2\x3e\xda\x49\x99\x29\x2d\xc9\xf4\x1f\x63\xc6\x6d\x8f\x88\xd3\x1c\x90\x8d\x13\xdb\x0e\x61\x01\xd0\xbd\x4d\xb8\x14\x9c\x13\xb0\x94\xf4\x10\x17\x14\x22\x78\x1d\xe2\x10\xd2\xef\x24\xee\x95\xdd\x6e\xa0\xcb\x1c\x2a\xc7\x41\xa0\x97\x86\xbb\xe2\x32\x68\x53\xca\xf3\x09\xd0\xde\x04\x6e\xb8\xdd\x39\xdc\xbb\xf5\x59\x2b\x62\x2e\xf3\xee\x58\x44\x5a\x5a\x87\x77\xb4\x56\xc4\xfe\xbd\xf7\xa2\x32\xf7\x3d\x02\x55\x01\x50\x07\x7f\x42\x7c\x2c\xd1\x77\x89\xe7\x80\x2a\x40\x49\x03\xe3\xc0\x6c\xf3\x34\xf3\x2b\x97\x86\x70\xb0\xcb\x82\xb2\x14\x34\x61\xfd\xb9\xb3\x10\x4f\xa0\x7f\x36\x19\xf5\x4e\x81\x6a\x01\xef\x4a\xed\x54\xec\xcc\xcb\x17\x4f\x0e\xb2\xa4\xd9\xb0\x44\xb1\x41\xcd\xc4\x3a\xa1\x5c\x08\x92\x21\xd0\x82\xa8\x09\x7a\xbc\x6e\x21\xe3\x69\x02\x8c\xab\x02\x99\xaf\x1a\x94\x06\x4d\x5e\x48\x9b\xb2\x8b\xb1\x9b\x66\x83\x71\xd9\xe9\x1b\x20\xc7\xa7\x73\x7c\x35\xce\x6e\x48\xa9\xbc\x2c\x40\xb2\x00\x56\x65\x02\x89\x2c\xe9\x7c\x41\xf6\x14\x74\x0f\x81\x90\xd7\x48\xc1\x6b\xd4\x04\xe8\x7a\xf1\xbf\x5f\xe2\x3f\xa3\x99\xed\xfa\x4e\x1c\xe7\xf3\x8a\xbf\xdc\xbe\x20\x3b\xea\xa1\x4d\x97\x7d\x63\xae\x80\x66\x6d\xf9\x88\x5c\x4c\xd6\xa7\x30\x5d\xa5\xe4\x92\x69\xe8\x21\x97\x2c\x09\x87\x38\x5f\x75\x86\x86\x99\xa6\x64\xfb\x44\x55\x8a\xb7\x27\xc0\xbc\xe4\xe7\x69\x97\xf1\x43\xe0\xe6\x34\x95\x0d\x69\x3f\xb1\x40\xee\xd6\x5a\x3a\xe4\x6d\xf8\x98\x77\xa0\xd4\xd3\x55\x92\xb4\xdb\x3b\xb4\x21\x21\x48\x30\x1b\xb8\x2f\xd3\x6d\x66\x64\x58\xba\x6f\xda\x7b\x81\xd3\xd7\x79\x00\xd9\x01\x5c\xa3\x35\x90\x68\x38\x49\xda\x6b\x24\xef\x03\xf9\x5c\xd6\x2d\xa2\x6d\x23\xc5\x49\xc2\x53\x3c\xdb\xda\xeb\x94\x00\xf7\xf4\x39\x6a\xc8\xf9\xf5\xfa\xe2\xbf\x92\x2f\xc5\xf9\xfc\xd2\x7d\x71\xa0\x42\x28\x51\xe8\x70\x2e\x20\x71\x8e\x45\x47\x94\x2e\x93\x24\x6a\x53\x57\x2a\xb7\xe1\x99\x87\x18\xb6\xdb\x6d\x86\x53\x12\x53\xbf\xf0\x3a\xd2\x74\xd0\x73\xe7\x93\x99\xdb\x6d\x41\x7a\x77\xc1\xe7\xf1\xdb\xf0\x9e\x45\x57\x4e\xcc\x04\x16\x1a\x52\xbf\xbb\x74\xb8\x43\x1f\x53\xe2\x52\xbf\xfb\xfe\xf2\xd3\x9b\xcf\xaf\xa8\xf6\x5e\x23\x4b\xea\x77\x7f\xfd\xf0\xf6\xf7\xd7\x6f\xde\xbe\xa5\xda\xaf\x5a\xe9\x24\xfa\x29\x01\xaa\xe0\x19\x9c\xb3\x8c\x26\x90\x3e\x06\x05\x29\x20\x6e\xee\xe7\x58\x77\x29\x38\x00\xcc\xb1\x0a\x1c\x08\x9e\x80\x03\x87\x91\x57\xa4\x73\x27\xca\xc5\x05\x80\x25\x4c\x70\x1a\x61\xc2\x13\x45\x25\x7c\xb0\xfa\x47\xc6\xdd\x36\x52\x32\x34\x7a\x27\x30\xc8\xdc\xce\x2a\x47\x1b\x9d\xef\xd3\x12\xaa\x29\x3d\xe6\xf0\x1c\x31\xd0\x2e\xc5\xb3\x76\x9b\xd9\x9a\x74\x29\xa0\x51\xd0\xec\x05\xfa\xab\x3f\x32\x4f\x98\x64\x00\xa4\xaa\xe3\x84\xd2\x20\xda\x57\x36\x8b\xfd\x42\xef\xab\xbc\x11\x9a\xe6\x3f\x06\xb3\xd1\x32\x58\x6d\xa0\xfc\x3c\xa4\x49\xf3\xd2\xe2\x46\x0c\x40\x29\xd3\x29\xeb\x6a\x92\x38\x53\x59\x30\x46\x0d\x8e\x34\x9a\xa8\x6f\x49\x72\x3b\x39\xc3\xe0\x29\xd5\x16\x12\x4f\x45\xb7\x00\x30\x42\xc4\x2c\x5f\x20\xd6\x44\x11\x6c\x1a\xc6\x92\x53\x24\xf5\x24\x29\xa5\x59\xf0\xc2\xa8\xb8\xc8\x05\xde\xec\x13\x8e\x0b\x77\x5a\x62\x2f\x10\x9f\x86\xe9\x91\xa2\xde\x0a\xc5\xea\xc5\x2f\x86\xef\x63\x12\xa5\x29\x31\xfb\x83\xc1\x21\x47\xa4\x51\x06\xd4\x1b\xf7\x7b\x16\xee\xbe\x51\x08\x41\xce\x10\x97\x28\x43\xcf\x1a\x59\x65\x2d\x1f\x89\x4f\x0f\x86\x63\x85\x4f\x2b\x9c\x22\x3c\xa6\x71\x79\x5c\x57\xc7\x95\x93\xb7\xa4\xac\xa3\xb5\xb2\xd6\xb5\xe9\xa1\x96\x18\x0d\x90\x47\xa4\xd6\xa4\x83\x3a\x6d\x57\xc6\xdc\xf3\x11\x27\x4b\xd2\x36\x81\xb7\x1f\xcf\x97\x0b\x1a\x82\x52\xcf\x68\x62\x34\x5c\xbe\x8d\x23\x07\x41\xd9\x81\xcd\x1d\x9c\x4e\x39\x4e\x60\x8c\xca\x71\xaa\x5d\x2d\xae\x62\x98\x5b\x49\x37\xf4\x4c\x30\xc6\x16\x74\xc3\xa0\x3f\xe9\x0f\x94\xd1\x9d\x9c\x9e\x4d\x41\x58\x00\xdd\x60\x4d\xcc\x81\xb8\x69\x73\x9c\x6c\x5d\xcc\xdf\x36\x5f\x08\x72\x27\x60\x26\xf0\x2d\xc9\x03\xf5\xbb\x65\xce\x25\xb9\xa5\xdb\x86\x85\xba\xa2\xdb\xee\x8f\xbf\xfd\xf4\xd3\xef\x37\xd7\x97\xaf\x2f\x3f\xbe\xb9\x79\xf3\xe9\xd5\xc7\xcb\x4f\x1f\x3e\x5e\x93\x4b\xba\xaa\xe0\x7a\xd7\x54\x4a\x0a\x63\x8d\x7c\xa6\x1a\x0b\x78\xe4\x89\xe7\x9b\xef\x5f\x3e\x9f\xac\xc8\x96\xfc\x8c\x1f\x43\x14\x11\x46\x94\x0f\xca\x7b\xf2\x8e\xbc\x25\xdf\x0e\x54\x4d\x28\xa5\x2b\x5d\xff\x90\x71\x99\x3e\x00\x3a\x7c\xa5\xeb\xbc\xe5\x05\xad\x37\x59\xf2\x9b\x39\x5f\x4c\xab\x26\x45\xda\x57\xf6\x10\xcb\xeb\xbe\x75\x2d\x7f\x3e\xdb\x47\x19\x9c\x01\xbb\x6f\x45\xb9\x47\xde\xf4\x19\xf9\x04\x60\xf8\x47\x75\x0b\x92\x57\xb4\x6d\x92\x37\x15\xb9\xde\x27\xfa\x66\x7e\xb9\x48\x92\x37\xf3\x32\x73\x6f\x91\x24\x2b\x5d\x7f\x33\x5f\x2d\xc8\x07\x2a\x86\xf3\x29\x49\xbe\xa1\x15\x26\x5f\x69\x8e\xaf\x32\x5d\x7f\xd3\x55\x13\x9d\x24\x9f\xc4\xc0\xbf\xea\x3a\xba\xa7\x2e\xfa\xaa\x6c\x69\x40\xbb\x11\xe3\x36\xa5\x75\x87\xad\xba\x7e\x0f\x46\x89\xba\x8e\xda\x8e\xae\xbb\xe8\x5e\xe4\xba\xd5\x75\xb4\x9c\x2d\xd1\x3d\xb9\xc5\x76\x8c\xee\xe7\x97\x0b\x9c\x24\x3b\x74\x4f\x2e\xc9\x0d\xc6\x64\x8f\xee\xc9\x3f\x48\xdb\x80\xa3\xe1\xe8\x3a\x5a\xcf\xff\xb1\xa0\xe2\xcb\x9d\xae\xaf\x28\xbd\xd6\xf5\x4f\xba\xfe\x09\xb8\xeb\x6d\x78\x85\xda\x1f\x66\x1b\xf4\x46\x31\xd7\xc9\x35\xb6\xd1\x2b\x01\x81\x3e\x34\x6c\x8d\x00\x7d\xca\x1c\xf2\x62\xb2\xc2\xde\x0a\xbd\xa3\x52\xdb\x2d\xb6\xbf\xa1\x6b\x4c\xc4\xa2\xd9\xdb\xd9\x07\xfb\x1b\x92\x0b\x88\x89\x9a\x02\xfb\x1b\xfa\x8c\x53\xf2\x33\x58\xdb\xbc\x15\xab\xff\x0e\xa3\xab\x24\x79\x95\x24\x6d\xf9\xfe\x06\x63\x5d\xdf\xa1\x37\xe4\x2d\x79\x37\x7f\x9b\x07\xb6\x43\x8f\x52\x50\x6a\x33\x02\xd3\x63\xb7\x0d\x22\xc5\x94\xb6\x28\x9e\x92\x77\xd9\x25\x80\xda\x4e\x92\xfc\x8c\xc5\xc2\x5c\x2e\xc4\xa4\xca\xea\x2e\xc9\x07\xf2\x28\x06\x67\xaf\x52\x4c\xd6\x73\xb6\xa0\x1f\xc8\x3b\x41\x3f\x89\x73\xf7\x0c\x88\x91\xb3\x13\x14\x86\x56\x03\x0b\x25\x76\x82\x82\x9a\xcb\x02\x42\xec\x0b\x00\xb0\x29\x00\xc0\xae\x00\x37\x2b\x41\x32\x97\x0e\xea\x9a\xb6\xcd\xe9\x7c\xd1\x15\xb3\xa7\xeb\x48\x13\xbb\x40\xf3\x02\xe4\x50\x95\x88\x30\x9e\xa1\x80\x2e\xd1\x12\x39\xc7\x36\x0f\xf2\x68\x80\xed\x35\xc4\x1c\x6b\x87\xc8\x03\x8e\xfa\x81\x3c\xeb\x31\x97\x6a\x7b\xf3\x95\x8a\x98\x23\xb5\x6d\x53\x3c\xf3\xe8\x63\x6a\xef\xa0\x2a\x17\x79\x18\x93\x18\x89\x5c\x20\x2c\xf5\xc8\xea\xd0\x4f\xa9\x84\x1b\x65\x96\xcd\xe3\x01\xc4\xb2\x3d\xd2\x0c\xaf\xec\xb5\x40\x8f\x04\x48\x3c\xc1\x54\x1c\xf6\x4e\x08\x1b\xfb\xe3\xf1\x70\xf2\x94\xfa\x06\xca\x4c\x6c\xa4\xa5\xd4\xc0\x6c\x40\x2e\xc0\x14\xc8\x65\x9e\x4f\xa2\x92\x59\x50\xa9\x62\x48\xe4\xd1\x3e\x70\xab\xf4\xaa\xec\x49\x27\xa3\x11\x90\x77\x61\xcc\x22\x9b\x61\xe4\x01\xdd\x3a\xec\x9f\xf0\x08\x00\x98\xdf\xd3\x6a\x9c\x85\xe9\x7c\xae\xbc\xf9\x69\xc3\x5a\x5b\x70\x4d\xd9\x5a\x86\x2c\x0e\xfe\xc4\x5b\x8e\xeb\xb2\x1d\x6f\x45\x6c\xbd\xf7\xc5\x90\xbe\xed\x22\x16\x83\x32\x50\x55\x7f\xaf\x37\xe8\x9d\xc0\xeb\x0a\x0d\x91\x12\xb5\xaa\x68\x58\x5f\x3a\x8a\xe8\x29\xbb\xf4\xf1\x64\x3c\x18\xe3\x2e\x8f\xbc\xad\x34\x4e\x1f\x9b\xe3\x01\x58\x85\xe5\x9e\x57\xc8\x32\xf7\x09\x42\xf6\x74\xa9\xeb\xcb\x6e\xb6\xe9\x81\x58\x9d\x77\xce\x16\x33\xe3\xdb\x0b\x8f\xec\xa8\x53\xa2\x4e\xc7\x6d\x4a\x5d\x14\x76\x34\x63\xac\xe1\x24\xb1\xac\xfc\xfd\x9b\x39\x04\xd1\x7d\x9d\xa9\xeb\x2a\x72\x0c\xed\x31\x4e\x2b\x1b\x62\xd6\x44\x39\xc5\x92\x06\xcd\xcd\xec\xc4\xa5\x76\x71\x71\x61\x24\x09\x12\x44\x63\x84\x67\xe6\xd0\x36\x0d\x8c\x53\xdb\x4d\x09\x1c\xf0\x63\x4c\xc7\x2a\x06\x69\x0d\x26\xa6\x32\x51\x02\x1d\x21\x39\x55\x8a\x89\x18\xc2\xb4\x0e\x27\x86\x84\x1b\x92\x57\x2d\xd9\x90\x92\xe1\xb8\xa7\x25\x51\x31\xd9\x50\x4d\x8a\x52\x35\xb2\xa3\x4b\xa4\xbd\x79\x75\xf3\xeb\xc7\x0f\x9f\x3e\x68\x62\x8a\x2a\x8c\x81\x75\x53\xb4\x81\x73\xad\xb3\xe9\x68\x17\xc0\x4d\x3a\x7f\xa1\x5e\xea\x34\x3a\xef\x42\x78\x0f\xb4\x46\x9a\x06\xee\x52\x5d\x3f\x14\x74\xde\x34\xf3\x51\x24\xfd\x90\xfe\x0d\xa4\x1f\x99\x5b\xa1\x6c\x37\x49\x25\x7e\x96\x92\xbb\x72\x77\x00\x2d\xa6\xe2\x9a\xbb\x74\xb9\x77\xc7\xfe\xae\x56\x46\xdb\xf0\xad\xbf\xf2\x40\x98\x94\xd3\xe3\xe9\x1d\xd5\xf6\xb9\xb1\x46\xbb\xae\xc2\x3b\xcb\x35\x78\x97\xe1\xd6\xf1\x02\x5d\xf7\x66\x5b\xe4\x55\xa4\xdd\x00\xd6\x08\xa3\x2e\xd2\xbc\x55\x04\xb2\xe2\x82\xb1\xd8\xe4\x79\x95\x84\xf5\xb0\x7c\xac\x1b\x47\xae\xf2\x64\x81\xb4\x7f\x39\x77\x8e\x9c\x78\x5b\xc3\x04\x71\x0a\x96\x0b\xbc\x98\x86\xac\x53\xb8\x1b\xee\x58\x00\x5e\x69\xf3\x59\xcc\x3b\xfc\x5a\x41\xe8\xca\xb4\x12\xde\x7d\x9d\x22\x6c\x8b\x31\xe4\x3e\xb8\x39\xcd\x83\xa2\xf2\xb3\xb3\x29\x56\x2a\xd9\x77\xf3\xfd\x62\xee\xcf\xf9\x22\x27\xf0\xef\x10\x4e\xa7\xf1\x7c\xb7\xa8\x32\x2d\xd4\x4d\x20\x35\x86\xeb\x62\x1c\xc9\x8e\x2c\xd1\xd4\x6d\x08\xfa\xb1\x9a\xef\x17\xd2\x8a\x33\x82\xa5\x5a\x11\x99\x22\x16\x34\x12\x2d\x70\x6c\x47\xf4\x0e\x55\x54\x30\x22\xdb\xe9\xae\xc4\x51\x01\x49\xf7\x49\xeb\xea\xb2\x29\xc5\x68\x32\x54\xd6\xd5\xca\x8a\xc0\x2f\xce\x4c\x5c\xb8\x3f\x00\xbe\xd7\xb8\x3f\xea\xe3\x29\xeb\xae\x28\xc8\x6d\x66\x4d\x22\x1a\x81\x57\x54\x07\x29\x0e\xf3\xb4\x64\x56\x49\x63\xb1\xaa\x01\x0d\xa5\x3f\x84\x2c\x48\x13\x59\x52\x43\x7a\x3f\x70\xc0\x20\x21\xa2\x01\xf8\x3f\x20\xde\x3c\x5a\x54\x95\x9c\x45\x47\x9f\x25\x7a\x32\xfa\x93\x81\x1a\x9c\x1c\x67\x6d\x70\xca\x86\xa2\x24\xbb\x25\x6e\xb3\xe0\x89\x2c\xe9\x53\x0a\x15\x7b\x81\xc4\x17\x2a\x82\x1b\xaa\x95\x95\x22\x04\x98\xd0\x32\x6b\x03\x4d\x4e\xe2\xcc\x39\x30\x56\xf1\x56\x00\xfc\x08\x93\xb3\xe4\xa3\x08\x93\x26\xd6\xa6\xae\x97\x80\x91\x54\x8d\x97\xd4\x84\xe6\x05\xad\x48\xd7\xc1\x78\x39\xd2\xf5\xb6\xd8\x2f\xd9\xe4\x2c\x61\x41\xa6\x9e\xae\x7b\xf3\xdd\x02\x8c\x52\xd9\x82\x46\xca\x4b\x46\x44\x1f\x2b\xd6\x11\x1b\xa8\x62\x16\xcd\x37\x0b\xdb\x9b\x6f\x16\xa4\x64\xdd\xb2\xcf\xbe\xed\xc5\xb7\xfd\xa2\x64\x47\x61\xa6\xb9\xd6\x9e\x9b\xf9\x12\xb3\xdd\x83\xe5\x6a\x1a\x68\x80\x4b\x4c\xc2\xbc\xb0\x04\x47\x1e\x7e\x04\xea\x7b\xcd\x38\x0c\x31\x49\xb4\x58\x3d\xe2\x4c\x3c\xae\x5d\xba\x2e\x8b\xe3\x30\x92\xf2\xf1\x78\xbf\x13\x67\xb0\xc4\xa5\xaf\x4c\x51\x65\xf4\xd2\x0a\x05\x14\x2b\x9f\xb3\xb3\x4a\x34\xaa\x35\x18\x0c\x14\xb7\x58\x91\xe5\xb5\x63\xa3\x36\x99\x5b\x08\xb4\x96\xc5\xde\xdc\x3f\xb5\xad\xd4\x4e\xd9\xdb\x07\x12\x1b\x2e\xcd\xdd\x98\x3c\x48\x4b\x5c\x61\x05\x83\xd3\xb8\xc2\x38\xce\x5b\x21\x98\xcf\x5c\xb7\xc0\x47\xed\x00\x39\xdd\x15\x04\x61\x22\x60\x7c\x22\xd0\x39\xab\x3f\x3c\x2e\x6c\x2c\x69\xe2\xa8\xe1\x49\x5e\xc4\xc0\x1c\xe3\xee\x4a\x69\x41\x4b\x66\xc4\x13\x92\xfa\x23\xda\x49\xe0\xb9\x78\x76\xfc\x13\x52\x72\x7e\x7b\xbe\x28\x90\x88\xee\xaa\x09\xaf\x8c\x75\x5d\x93\x17\x82\x92\x53\xcc\xca\x62\xa0\xb2\x55\x6d\x61\x6f\x57\x16\x75\x42\xa8\x03\x8e\x6d\x29\x61\x97\x0e\x84\x06\x27\x44\x3b\x43\xf0\x00\x2b\xe7\x06\x50\x0b\xe5\x46\x14\x69\x12\xba\x49\x4d\xe2\x4c\xcf\x0c\x16\xf5\xf8\x38\x9b\x84\x2e\x02\x53\x26\x01\xf0\xce\x46\x56\x6f\x5c\xdb\x0e\x47\xeb\x93\xf8\x5d\x9c\x12\x20\x7e\x8e\xab\x70\xcb\x8d\x59\xe3\x19\x96\x5c\x1e\x29\x1c\x08\x14\x5e\x46\x90\x37\xa4\x7e\x05\xeb\xc9\x00\x27\x59\x52\xb7\x51\x7e\x15\xcf\xdc\x9a\x31\x61\x03\xaa\xef\xa8\x80\xeb\xd2\x79\x01\xce\x6d\x24\xc3\x85\x32\xec\xad\x18\x2a\x96\x55\x54\x74\x9d\x95\x95\x95\xa3\x59\x54\xf4\xc2\xae\x7c\x72\x67\x4b\x19\xb4\x2a\x25\xc0\x15\xfd\x1e\x37\x06\x8f\x69\xb7\xa2\x21\x8e\x53\x02\x4b\xff\x1c\x11\x53\xae\xb2\x97\x9f\x1f\xe0\xc6\x0e\xcc\x91\x99\x7b\x2a\xae\x62\xa4\x5e\xee\x1e\xe7\x09\x55\x66\x4f\xfa\x89\x72\xa9\x01\x72\x28\xb8\x6e\x23\x01\xa3\x3d\xdc\x0e\x50\x4c\x22\x30\x74\xf2\xe0\x37\x44\x4b\x12\xc9\x1b\x79\x9a\x79\x19\xb8\x70\xa7\x18\xbe\x53\x36\x77\x3b\x9d\x05\xd6\x75\xf4\x7f\x7c\xc8\x98\x24\xb2\x40\x7e\x05\x2f\xc5\xbc\x09\x54\xe0\xf9\x87\xe1\x50\xad\x45\x90\xcd\xa7\xb7\x39\xc0\xd5\xda\x36\x3f\x60\x04\x44\xf4\x31\x6d\x54\xb7\x20\xde\x93\xf7\x75\x00\x58\x8c\x72\xa2\xf2\x68\xda\x56\x4a\x4c\x79\x32\x83\x59\x13\x83\x5b\xb1\xb2\x72\x77\x2c\x4c\xd7\x59\xc9\xac\x31\xb5\xa3\x94\x00\xe7\xf1\x39\x7b\xa1\x44\x95\x80\x63\xba\x86\x29\x8a\x2b\x67\x25\x49\x90\x76\x73\x03\x3b\xfa\xe6\x46\xf3\x82\xc7\x74\xd6\x80\x66\xb7\x4d\x71\x8d\xa7\xc0\xfd\x46\x9c\x7a\xe8\x89\x49\x40\x75\x46\x05\x29\x35\x82\x45\x17\x30\x46\x11\x99\x2f\xc4\x3d\x13\x95\x0f\x91\xf4\x42\x7e\x60\x15\x9f\xf7\x09\xdc\x59\x94\x8e\x27\x71\x90\x87\x09\x9b\x49\x5d\x7f\x3b\xea\xe6\xed\x50\x8f\x44\xa9\xc0\xbb\x33\x67\x6d\x64\x32\x1a\x36\x38\xa8\x6c\xe4\x1b\x97\x6c\xde\xa5\xac\xb6\xa2\x8b\x59\x32\xbb\x3f\xd4\x13\xd2\xe6\xf2\x92\x92\x1e\xf9\x36\x5e\x8c\x3b\xda\x42\x4b\x53\x32\x32\x87\x27\xfc\x37\x96\x84\x13\x65\x50\x99\x79\xbf\x78\xa6\x16\x20\x89\x21\xce\x7d\x6e\xee\x2e\x10\xb8\x00\x45\x10\xa3\x5b\x29\xea\xe8\x7a\xdb\x41\x02\xe6\x80\x0e\x60\x92\xc8\xcf\xca\xb8\xe4\xe0\x6b\x56\x55\xfb\xe9\xaa\x32\xa8\x1a\x2b\xbd\x42\x3f\x73\x4f\xe8\x86\xc1\x1d\x8b\xb8\x72\xf1\xd7\xe2\x61\x6b\x17\x79\x5b\x4f\xd0\x89\xb9\xab\x9c\x94\x80\x12\xea\x09\x9e\x50\x7f\x68\x34\x30\x85\x9a\x6d\x98\xe1\x14\x34\xcd\x54\xc6\x10\xcb\xa2\x90\x31\xaa\x95\xe4\x11\x1b\x27\x7e\x13\x2c\x3d\x97\xc5\xba\x8e\x58\x87\x6a\x4b\x4d\x50\x6f\x99\x2a\x1f\x24\xad\x21\x49\x46\x89\xbf\x72\x62\xa6\x92\x3d\x48\xde\xee\x7d\xee\xf9\x5e\x90\xa5\x6e\x21\x75\x19\xf2\x4b\x3f\x2b\x1f\x43\xd2\x3e\xf0\x5c\x08\x3c\x04\x69\xfb\x72\xda\x35\xe3\x59\xf3\x77\x9a\x0c\x66\x22\x63\xb4\x42\xd2\x83\x86\x09\xd8\x0d\xf7\x4f\xb9\x70\x2e\xf6\x52\xe9\x72\x28\x89\xea\x60\x2e\xc5\xb5\xfb\x4c\xaf\xe2\x19\x63\x00\x3c\x88\x4f\xeb\x5a\x22\x2c\x49\x34\xf8\x22\x30\xe0\x58\x29\xc8\xca\x04\x9c\x24\x62\x8b\x40\xfc\x31\x5b\x89\xbf\x52\x32\x1c\x4d\x4e\xc8\x19\x95\xda\xee\x7f\xc0\x21\x53\xdb\xcd\xf1\xfd\x8c\x51\x16\x06\x2d\xad\xc3\x2b\x64\x1e\x88\x6e\x9e\xe3\xec\x42\x12\xae\xdd\x95\xd4\xd1\x95\x52\x1e\xbf\x98\x52\xd0\x25\x16\x10\x45\xa2\xe3\x8d\x4e\x30\x4e\x8a\xc6\x04\xae\x9d\x09\xc8\xa2\x19\xb7\x4b\xe0\x72\x2a\xee\xc8\x10\x0e\xe7\x92\x84\xe4\xb1\x6e\x5e\x9e\x99\xf6\x63\xe2\xea\x7a\xdb\xd3\x75\x07\x2d\xcb\xb6\x62\x52\xe7\x1b\x90\xab\x53\x0e\x63\x46\x8a\xed\x67\xf6\x46\x12\xe0\x78\x19\x2f\xff\x09\xf7\x21\x73\xbe\x48\x12\x24\x7e\x72\xd9\x31\x68\xd2\x3d\x87\xc7\x08\x26\xf9\xa2\x31\xed\xe6\xc6\x0d\x23\x76\xf6\xaf\xf8\x26\x86\x98\x27\x37\x37\x1a\xf1\xa9\x37\x77\x16\x62\xe0\x0e\x79\xac\x30\xf5\x7c\xf0\x4e\xda\x10\x05\x22\x47\x36\x25\x9b\x3d\xc8\xd5\xfa\xa6\xe8\x29\x73\x13\x39\x0e\xf1\x53\xb8\xb4\x64\x33\x66\x3f\xa6\x38\xc5\x48\xcb\x2c\x2b\x35\x71\x53\xa9\xd8\x6c\x2a\xcd\xd6\x7a\x5d\x6b\xd8\x35\x35\xb2\x0d\x97\xcc\xf6\x66\xda\x6e\x1f\x31\xcd\xd6\x24\xb0\xd0\x88\x1b\xee\x1e\xa4\xbf\x2e\xed\xcb\x37\x67\xd2\xb2\x0c\xb3\x7f\x66\x19\x96\xd5\x7a\xc9\x02\x2f\x6e\xfd\xba\x8f\x37\x5f\x9d\x88\xdd\xb5\xd0\x1f\x7e\xe8\x45\xa1\xfb\xb5\x1b\xed\xb1\x46\x7c\xcf\x65\x41\xcc\x6c\x6d\xc3\xf9\x2e\xb6\x5f\xbc\x58\x7b\x7c\xb3\xbf\xed\xba\xe1\xf6\x45\x96\xf3\x85\x9a\xb8\x17\xb7\x7e\x78\xfb\xe2\x4e\x76\xe5\xc5\xdb\x37\x57\xaf\xde\x5f\xbf\xd2\x48\x0c\x8a\x93\xcf\xaa\x41\x4b\x05\xaa\x69\x0e\x06\xcf\xd2\x66\xea\xf5\x26\x39\xaa\x29\x99\xc2\xc0\xf9\x10\xc7\x19\x67\x1a\xad\x32\xe0\xb2\x44\x33\xd5\xeb\x55\xb8\x64\x97\xca\x79\x58\xee\xa1\xa6\xe6\x99\xf1\x40\xab\xae\x60\xb7\x2e\xc1\xbf\x9b\x0f\x61\x4b\x37\x14\x6e\xfd\x1d\xcd\x1c\x87\x65\x47\x7b\x73\x6e\x24\xc9\xe6\x82\xee\x66\x7c\xa6\x69\xea\xd2\xb7\x91\x47\x43\xb4\x27\x1b\x8c\xcf\x07\x03\x6b\x32\x4c\x12\xef\x62\x30\xec\x99\x93\x24\xd9\x74\x4c\x4a\xe9\x2e\x49\xd0\x52\xe6\xe9\x98\x22\xd7\xb0\x67\x19\x49\xb2\xbc\x18\x8c\x7a\xfd\xde\x8c\xcf\x62\x28\x6e\x7b\x36\x9f\xb9\xe0\xbe\x6c\xd3\xb1\xb0\xbd\x3c\x83\x8c\x1d\xe4\x9d\x41\xbd\xe7\xe7\xa6\x81\x3b\xc3\xc1\xa0\x37\xac\x7a\x6f\x73\x61\xe8\xf6\x12\xfc\xb7\xc9\xa9\x11\x2f\xd2\x81\xdb\x64\x7c\x32\x0e\x43\x81\xd5\xc9\x09\xae\x4d\xbb\xe2\xbd\xab\x69\x57\x0a\x3c\x62\xde\xb5\xb9\xd6\xf1\x05\xd2\x41\x5c\x05\xe0\x91\xf6\xbf\x5a\x27\xec\x84\x1d\xed\xcf\x9a\x98\x78\x95\x2a\x53\x7e\xd0\x30\xd9\x9f\x5e\x8b\xdc\xc6\x00\x54\x8c\x72\x70\x6a\xea\x5c\xd7\x51\x44\x63\x14\x11\x97\x00\x33\xd9\x2a\x25\x2d\x65\x52\x54\x9d\x11\x08\xb7\x64\xef\x91\x89\x09\x0b\x96\xf6\x1e\x59\x98\xf0\xc8\xdb\xda\x7b\xd4\x03\x37\x57\xe3\xc1\x09\xb5\x42\xe5\xab\x31\x68\xb4\xe4\x6a\x9f\xa2\x55\xeb\xd2\x03\x89\x08\xc8\x8f\xb9\x71\x57\x3b\xd7\x88\x4a\x92\x76\x26\x5e\xe0\xb8\x84\xa0\xca\x02\xe2\xb3\x7c\x52\xee\xeb\x3d\x5d\xf7\xce\xfb\x26\xf8\xac\x18\x4e\x4e\x45\x9e\x28\xee\x66\xa9\x50\x53\xa8\xf6\xc8\xab\x19\x44\x88\xa7\x70\x97\xa0\xd0\x89\x21\x0c\x62\x90\x97\xf0\xec\x88\x02\xfd\xa0\xd0\x39\x12\x53\x47\x5c\x49\xbf\x66\xf8\x96\x86\xa7\x4c\xd7\xdb\x6c\x1e\x2f\x20\x3c\x3a\x89\x49\x23\xb1\x14\x29\xe1\x2f\x79\x74\x22\x8f\x3f\xd8\x66\x2a\x25\x5b\x23\xe3\x38\xfc\x85\x85\xab\x20\xca\xba\xde\xce\x66\x69\x15\x46\xa5\xb7\xaf\xec\xe1\x75\x18\xa5\x04\xbc\x14\x1e\xb7\xea\x91\xd0\x26\xc8\xdd\x14\x12\x47\x3d\x7a\xc1\x13\x86\x26\x02\x2f\x28\xfc\xf6\x19\xb3\x00\x45\x1d\x46\x0c\x6c\x3b\x19\x2b\x1b\x48\xe5\xe3\xab\x24\x9d\x54\x16\x87\xef\x29\x71\x63\x76\x0d\x42\x9f\x4f\x98\xb4\x0f\x8e\x78\xd1\xc9\x70\xac\x5c\xa8\xd8\x62\x6d\x08\x6f\xad\x3c\xc0\x79\x48\xf6\x7a\x3c\x3e\xc1\x49\xab\x4d\xd8\x91\x59\x2a\xc4\xb8\x17\x62\x62\x20\x3a\xf6\x81\x9b\x10\xf0\xf1\x00\x8c\x9a\xe3\x47\x51\x42\xa5\xe0\x50\xdf\xab\x49\xb3\x0f\x65\x6e\x65\xcc\xe1\x29\x52\xb6\x74\x3a\x32\xe7\x2a\x11\x02\xbd\x34\xa5\x39\x2b\xcd\xbb\x40\x73\x56\xd0\x53\x65\xe4\x8b\xb8\x25\x86\xbb\x00\xea\xb5\x9d\x7f\xca\x5d\x4e\x00\x47\xde\xa9\xf8\x2a\x97\x14\x55\x48\x41\x0f\x09\xd8\x47\x21\x64\x2e\x3b\x8e\x41\x8c\x6a\x2a\x5a\xa8\x86\x89\xd8\x78\xa1\xe4\x7d\xb6\xc5\x3d\x25\x6a\x2c\x0c\xaf\x22\x45\x18\xb9\xdf\x43\x18\x55\x90\xed\xa2\x4d\x15\x56\x1c\x93\x18\xa9\x40\x1e\xc0\x0f\x3e\x6e\xe2\x37\xec\x2b\xe5\x3d\x39\x99\x27\x37\xa1\x27\x10\x78\x45\xf8\x55\xf4\xee\x66\xcc\x66\x1d\x4d\x03\x36\xca\x71\x7b\xbc\xc7\x74\xea\xcd\x8f\x60\xc4\x0b\xaa\xfd\xa1\x95\xe4\x58\x39\xb5\xfc\xc7\x42\x90\xab\x0a\xfc\x7a\x18\x02\xb6\xf5\x8e\xcb\x9a\x72\x8b\x3f\x59\xe2\x84\xf1\xe6\x75\xa6\x67\x48\x4b\xc4\x42\xbe\x4f\x72\x9f\x48\xd9\x5a\x38\x0a\xc2\xcb\x05\x10\x6b\xe2\xb4\x0e\xa7\x02\xc8\x98\x51\xaf\xd1\x37\xd1\xc9\x1e\x95\x3d\xb4\x21\x5e\xe2\xa5\x2b\xe6\x81\x92\x1f\x82\xdf\x1f\x81\x95\x3f\x8d\x1e\x18\x19\x54\x8c\x9c\x60\x19\x6e\x91\x34\xd0\x31\xbb\x25\xd3\x9c\x53\x27\x53\xcd\x0f\xd2\x3a\xa8\xec\x4c\x4f\xb3\x39\xee\x68\xf8\x46\xeb\xf8\xa8\xd3\x09\x3a\x0e\xe9\x0d\x65\xb8\x98\x26\xad\xc3\x93\x57\x40\xe5\x9e\x3c\x50\xfb\x54\x5f\x33\x15\x81\x94\x80\x48\xed\xf9\x16\x60\xd5\xc6\x9a\x8c\xbe\xfa\xd6\x31\xab\xaf\x8a\x3c\xbd\x2c\x85\x57\x7e\xbd\xfa\x56\x55\x00\x55\x75\x4d\x07\x26\x47\xcf\xd2\xaa\xc8\xf8\x39\x5e\x66\xf6\x53\xb1\xf7\x72\xb0\xae\xbf\x08\x1c\x38\xf5\x02\x5d\x54\xae\x6c\xd4\x51\x70\x30\x18\x8f\xf7\x4e\xf0\x45\x4b\xe6\xbb\x25\x72\x7f\x3c\x19\xe5\x0a\x1c\x8a\x92\x3d\x7d\xe8\x95\xd2\x46\x92\xa0\xec\x91\x0a\x0a\x2c\x80\xf0\xe1\x49\x02\x61\xc4\xb3\x99\x01\x59\xaa\xf2\x01\x2d\xda\x79\xc2\x36\x45\x4a\x9b\x52\x02\x6f\xcf\x99\x32\x45\x9c\x3a\xc5\x90\xfc\x82\x4e\x8d\xf3\x9d\x26\x81\xff\x44\x29\x6b\x06\x48\xbb\xff\x1a\x03\x82\x5b\xd7\x40\x59\x81\xf2\x49\x38\x5b\xda\xf0\x7a\xef\xf1\x4d\xb8\xe7\xd7\x60\xdf\x93\x24\xfe\x49\x0b\x60\x17\x86\xdf\x06\x43\xf6\x8c\x19\xa6\x36\xaf\x3b\xe7\x8b\xdc\x25\x99\xda\xc9\x5a\x87\x4f\x45\x3a\x8d\x25\x59\xce\xf1\x6c\x39\xe7\x0b\x3b\xd4\xf5\xfd\x6c\x8f\x18\xb6\x37\xe2\x2e\xcf\xc4\x91\x73\x2e\xcd\x86\xcd\xf1\x31\x07\x5b\xda\x17\xfe\x25\xf8\x72\xf7\x65\xf5\x25\x6a\x7d\xf9\xe6\x18\x5f\xf6\xe6\x70\x6c\x7c\xd9\x5b\x86\x21\xff\x9a\xf0\xd7\x82\xbf\x3d\xf8\xdb\x87\xbf\x03\xf8\x3b\x84\xbf\x23\xf8\x3b\x86\xbf\x13\xf8\xeb\x88\xbf\xd6\x4a\xfc\x1d\xac\xbe\xec\x7b\xaa\x36\x0b\xf2\x58\x93\x2f\xfb\x15\x5b\xad\x34\x71\x5f\x37\xc8\x2e\x9f\x52\xb6\x2d\x29\x12\x29\xb7\xbe\x7e\x71\xa5\xc7\x85\x0c\x28\xcc\xfd\x53\x83\xa3\x19\x73\x30\xe9\x1f\x04\xb8\x90\x4e\xfd\x41\xa7\x4e\x2a\xda\xec\x8a\x1b\x7f\x55\x90\x04\x6b\xba\x43\x9a\x17\x5f\x81\x7c\xec\x7a\x17\x31\x67\x29\xad\x98\xc9\x96\xae\x94\xbb\xf6\x06\x02\x60\x5e\x78\x2b\x9e\xaf\xc1\x63\x66\x16\xcd\x0f\xe1\xb9\xb1\x90\x3a\x72\x04\xcc\xdd\x64\xb2\x86\xc9\xc3\xc1\x2e\xf1\x2b\x26\x2f\x8a\x5d\x36\x5f\x2f\x0e\x79\x65\xa0\x7a\x2f\xf0\x8c\x74\x5a\x28\x3c\x2a\x55\xd2\x42\xed\x51\x61\xdd\x99\xfa\x63\x7b\x9b\x24\xed\xbb\x14\x18\x41\xae\xc3\x9b\x7d\xa2\x2a\xe5\xc5\x58\xb1\x36\x37\x74\x8f\x7c\x02\x2a\x88\x06\x48\x65\x18\x3d\x33\x89\x77\x60\x27\x3e\x65\xe7\xde\x94\xc9\x78\x03\x0f\xc8\xa1\x67\x26\xa0\x9c\xbe\x5d\xc4\xf2\x60\x0b\x19\x92\x23\xa0\x21\x72\x30\x71\xd1\xae\x13\x08\x64\xc7\x98\x46\xe7\xc1\x34\xea\x74\xc8\xae\xd3\xc1\x20\x18\x72\x74\x7d\x89\x36\x64\x47\x1c\x50\xaf\x00\xc5\x4e\x91\xdf\xc4\x04\xd2\x3b\x1d\xe2\xe4\xf7\xe8\x26\x73\xfe\xbd\x23\x9b\x54\x80\x54\x08\x0d\xfa\xdd\x9b\x6d\xdc\x1b\x0e\xf1\xa9\xd9\x54\xb3\x58\x04\x7f\x69\xd3\x20\x25\x79\x3c\x82\x00\x6c\x7a\x4f\x44\x31\x2a\x6f\x6c\x73\x62\xf5\x9a\x1a\x8b\xb9\xc3\x4b\x6d\xb5\x05\xd8\x1f\xf4\x30\x2a\x2f\x55\xc9\x35\x31\x00\x4f\xf2\x28\x9e\x65\xfb\x10\xc9\xf4\xbb\x87\x9e\x4b\xf9\x64\xa8\x0d\x29\x39\x97\x67\x0f\x58\x04\x96\x39\x79\xd6\xd4\x34\x38\xe5\x6d\x43\x56\x54\xaa\x1d\xc9\x3e\xe7\x71\x3d\x1a\xd1\xfc\xef\x8d\xa0\x83\x89\x8f\xb4\xac\x4a\x4d\x2c\xc4\xa8\xc1\x00\xfc\xa9\x79\x50\x0e\x68\x9c\x43\xc1\xa7\x9f\xc7\x04\x02\xd7\x24\xf3\x45\xf6\x45\x00\x9f\xb6\x80\xea\xe6\x8b\x18\xcd\xcd\x05\x31\xc9\x99\x81\xcf\x0d\xe2\x52\xe8\x11\x64\xd2\x9e\x33\x79\x61\x92\xb4\x5d\x98\x18\x19\xe1\xa4\x41\xfc\xfc\xac\xd9\xc8\x8e\x45\x38\x8b\xb3\x69\x64\x38\x49\x0c\x01\x2e\xb2\xd7\x54\x3a\xc5\x6d\x70\xe6\x92\xcd\xc7\xb1\x9d\x29\x3a\x28\x8d\x2f\xed\x0c\x28\x8b\xba\x4c\x6b\xfc\xcc\xe9\x2e\x45\xac\x91\xfb\x4a\x82\x77\x69\xdd\x20\xfd\x40\x1b\x19\x78\xcf\x79\xe7\xd2\x95\x98\x91\x45\x30\x02\x77\xbe\x4a\xfd\x51\xb2\x6b\xf7\x05\x52\xb7\x51\x2a\xf5\x25\x3d\xfd\x1d\xf5\xc1\x00\x7a\x45\xfd\x6e\x6e\x8d\x8b\x2a\x72\xeb\x10\xc9\x68\x06\xd9\x70\xab\xb4\xdd\x4e\x4e\xdd\x23\x88\xeb\x37\x44\x4d\x0d\xd0\xbc\xb0\x5c\xb6\x41\xbe\x7a\xc1\xd2\x06\x8c\xee\xe0\x72\x58\xe5\x62\xa2\xdc\x89\x57\x44\x79\x57\x94\x20\x5e\x16\x04\xb4\xd3\xc9\x98\x47\x2c\x49\xbc\x8b\xdc\xc5\xfe\x0c\x65\x85\x14\x73\x99\xb8\x0a\xc5\x26\x6d\x03\x63\xdb\x55\xcc\x76\x4a\xa3\x99\x67\x67\x46\x1b\xe2\x8d\xcd\xbd\x85\x3d\xf7\x88\xf8\x5d\x90\xb6\x89\x53\x92\x7d\x96\x4a\x9a\x6b\xea\x74\x73\x0f\xd3\xf0\x1c\x39\x0f\xd2\xcf\x47\xa6\x8c\x1f\xa0\xbc\x88\x78\xce\xec\x40\x30\x69\x2f\x75\x7d\x9f\xa9\x75\xc5\x5a\x9b\xd2\x35\x98\x09\x80\xa2\x4f\x8c\xd6\x99\x79\x80\xc2\xf4\xb2\x7c\xb9\x1b\xdb\x2d\x04\x0a\x83\x08\xc7\xdf\x7f\x4c\x65\xbc\xae\xad\xb3\x7b\xc6\xb1\x6a\x67\x17\x3e\xd2\xb6\xce\x4e\x80\x86\xc7\xad\xb3\xfb\x7f\x04\x75\x52\xd2\x6f\xd4\xaf\x78\xf2\xae\x19\x4f\x8c\x31\xee\xfa\x6c\xc5\xa5\xf5\x98\x04\x2d\x7e\x81\x87\x48\x5d\x96\xf1\xe8\x39\x90\xa3\xed\x20\x4d\xc6\x42\xd5\x14\x8a\xe9\x5f\x8c\x26\xba\xee\x9f\x8f\x7b\x29\x79\x94\x9f\x9e\x01\x4f\xa6\xf5\x89\x60\x84\x9d\x1a\x3b\x44\x83\xfe\xfe\xb1\x4b\x4c\xce\x29\x02\x34\xd4\x90\x3a\x15\x74\xa4\x8a\xd4\x29\xb0\x51\x43\xea\x14\xfe\x56\xc3\xea\x20\xfc\x87\xb2\x94\x00\x29\x01\x98\x49\xec\xcb\x21\x1f\xb6\x2a\x78\xc9\x5d\x11\xbc\xe4\x19\xf3\xbc\x4a\xc9\x23\x54\x68\x37\xaa\xb9\x90\x3d\xd9\x50\x37\x8f\x85\x16\xa2\x8d\x40\xf2\x62\xc4\xc9\x0a\x93\x5b\x1a\x97\x58\x3e\xb3\x95\xcd\xc8\x0a\xcb\xc3\xb6\xc1\xba\x8e\x90\x83\x22\xba\xa9\xc7\x94\x88\x28\xa5\x5b\x90\xae\x57\x63\x4a\xf8\xa0\x53\x94\xc5\x94\x88\x68\x34\x5f\xcb\x98\x12\x51\x1e\x53\x42\x15\x2d\xa2\xab\xe4\x1c\xa4\x1d\xda\x90\x07\x72\x2b\xb5\x6c\x40\xdf\xba\x1c\x83\x65\x6b\x47\x18\xdd\xa1\xdb\xb3\x07\x88\xbe\xb2\xa7\xc6\xf4\xe1\xfc\x76\xfa\xd0\xe9\x90\x7d\xa7\x83\x1f\x04\x7e\xb6\x11\xf8\x19\x8c\x77\xfe\x50\xa8\xbf\x7a\x19\x22\xb6\x27\x9e\x44\xc4\x7a\xc3\x06\x66\xd2\x93\x26\x76\x45\xa4\x2e\xe5\x19\xe8\x68\xa4\x2e\xf0\x7b\xad\x36\x88\x14\x69\x2c\x0b\xd4\x05\x2c\xec\xfa\xe3\x61\x16\xd6\x4e\x9e\x31\xd8\x20\xc3\xbe\xa9\xd0\x7e\xc9\x00\x5a\x17\x07\x0f\x0c\xec\xfa\x83\xfe\x40\xa0\xeb\xf3\x05\x79\xa0\x01\xba\x83\x70\xba\x62\x0d\xc5\xb3\x8c\x08\x76\x45\x97\x15\x32\x00\xb2\xa0\xec\x78\x60\x72\xd9\xf8\x5d\xac\x98\xf8\x7a\x0d\x7b\x33\x8c\x04\x1d\xf0\x99\xb6\x2b\x59\xbd\x15\x5a\x67\x4b\xb5\x3e\x1f\xc9\xe8\x76\x68\xa7\xeb\xbb\x8b\x9e\x34\x10\x5d\xe5\x21\xd7\xc4\xb7\x6d\x96\x79\x7b\x3e\x34\x7a\x53\xa5\x6d\x23\x71\x79\xaa\x69\xb0\xca\x9c\x0e\x07\x53\x7e\x3e\x1a\x4e\x79\xa7\x93\x7b\xca\xcc\xb8\x4c\x80\x4c\x5e\x29\x11\x9b\xb8\xd4\xb2\x30\x5d\xc3\xa1\xb4\xa4\x1b\x4e\xe4\xef\xc8\x50\xbf\x96\x1d\xd1\x9e\x8c\x74\xa4\xa2\x7f\x8d\xd5\x17\xd3\x8e\x68\x5f\x7d\x51\x2c\x4d\x3b\xa2\x56\x2a\xf7\x9a\x31\xf5\xce\xfb\xa3\xa9\xd7\xe9\xe0\x3b\x25\x0a\xfd\x6a\xb3\x8e\x47\xee\xec\x28\x95\xa1\x8e\xd4\x4c\x35\x8a\x5a\x59\xf7\xee\x8c\x77\xef\x52\x4c\x64\x55\x77\x19\xe4\x12\x15\x32\x7a\x37\xf7\x16\xdd\xaf\x4a\x76\x88\x0c\x4c\x82\xec\x39\xd3\xe3\x3e\x33\xb1\xd4\x41\x41\x41\x87\xb2\x5c\xf3\xf6\xe5\x4f\x3f\xbe\x7a\xfd\xf3\xe5\xd5\x9b\x5f\xfe\x22\xae\xb2\x20\x4d\x9f\x03\x77\xaf\x92\xa4\x7d\x99\x24\xed\xeb\x24\x69\x7f\x16\xa0\x21\x8c\x6a\x44\x55\xc9\x03\x06\xe8\x0e\x4a\xb8\xeb\x4b\x10\x21\xd6\xee\x33\xae\x73\x66\xf9\xec\x41\x50\xf7\x0f\xc0\x2f\x99\xde\xe5\xc1\x7e\xe6\x0b\xb2\x04\x6d\xe4\x69\x31\x93\x4b\x18\xb7\x07\x5e\x3a\x75\xfd\x16\x05\x70\xd7\xcb\x1c\x7b\x14\x34\x09\x65\xaa\x92\xd1\x7a\xe3\xd1\xec\xcc\x2c\x79\x34\x9f\x65\x2f\xa0\xf9\xdf\xe1\x50\x48\xa0\x92\x2e\x62\xf8\xc2\x45\x11\x9e\x99\xf6\x99\x09\xca\xa8\x02\xe0\xc4\x28\xc8\x56\x26\x9a\x62\x88\x1d\x11\xcc\xbd\x4e\x47\xaa\xfc\x41\x87\x71\x88\x18\x11\xbd\xce\x05\x14\xf2\x2a\x19\x18\x27\xa2\x1c\x96\x80\x43\x21\xed\x92\x7e\x68\xfd\x82\xdd\x1f\x17\xb0\x23\x2c\xa0\x80\x5b\x5c\x39\xcb\x82\x8b\xb6\x2f\xae\x9c\x4d\x21\x1a\xa8\x5c\x1e\x39\x77\x68\x4d\x03\xa4\xfd\x72\xfd\xe1\xbd\x96\xb1\xb3\xbd\xd5\x03\xdc\x21\x31\x7a\xd1\x7d\xa1\x4c\x8f\xee\x68\x5c\x96\x5b\x3f\x14\xaf\x99\xdc\xfa\x56\x26\xe5\x22\xd6\x2b\x1a\x57\x18\xac\xe4\x92\xbe\x98\x7f\xd9\xbf\x1c\x1b\xc6\xd9\x97\xfd\xcb\xd7\xaf\x5f\x2f\x5e\xac\xc9\x35\x7d\xf1\xbf\xa5\xd4\x1f\x5f\xbf\x5e\xfc\xf0\x82\x7c\x56\xa9\x57\x45\xde\x1f\x5e\x90\x1b\xda\x5e\x25\x49\x78\xc8\x9e\x28\x09\xfb\x0a\x0f\x94\x73\x01\x8c\x16\x5a\x9b\xae\x91\x74\xa2\xa7\x3d\xa6\xf0\xf6\xe8\xd8\x3c\x2d\xbd\xe7\x02\x4c\x01\xb9\x7e\xa6\xe1\x21\x95\xf7\x27\xed\xcb\x97\xfd\x72\x65\x0c\xc5\xcf\xb8\xd7\xd7\xfe\x24\x10\x42\xa4\xa9\x44\x99\x86\x93\x44\xe6\x63\xce\xb2\x94\x41\xbc\x89\x8a\xef\x1b\x45\x70\xbb\xc2\x9d\xaf\xd8\x5a\xe0\x86\x0e\xed\xc1\x3d\x4e\xb1\x35\xb1\xae\xb7\x37\x25\xa1\x8b\x2b\xdd\xe7\xb0\x26\x47\x42\x9e\x8c\xbc\xe4\x23\x8f\xe4\xe4\x10\x26\xed\x0d\x2a\xd4\xcf\x59\x8a\x21\x86\x11\x65\xc4\x41\x6b\x22\x2d\x5b\x70\x4a\xde\x35\x1a\xf5\x7b\xf4\x0e\x45\x84\x9d\x81\xc0\x09\x1e\x3b\x66\xbe\xbb\xb7\xe8\x1a\x82\xb2\xb7\xb7\xe8\x33\x09\x70\x92\x88\x5f\x95\x70\x4d\x3c\x3c\x13\x13\xa2\x75\xae\xd0\x03\xe2\xc4\xc0\xc4\x1c\x62\x9b\xa7\xd3\xb5\xae\x97\xc0\x8f\xdc\x7b\x19\x6b\x40\x32\x75\x7a\x19\x10\xba\x49\x92\x9f\x05\xec\xc9\x36\xe6\x91\x43\x54\x99\xc7\x80\x3a\xe8\x66\x76\x6f\xab\xb1\x79\x79\x77\x7f\x2e\xb8\x93\x39\x6b\x3d\x98\x09\xc0\x72\x49\xde\x61\x3b\x80\xb3\x0a\xc1\xbd\x9f\x60\xbf\x4e\x33\xe3\x76\xe4\x75\x45\xf7\x89\x1a\x04\xc4\x65\x1f\x9a\xe5\x60\xb7\xf8\x51\x9a\x56\x36\xc6\x4a\xaf\xd1\xa2\x4a\xae\x91\xcf\x45\xbc\x71\xb6\x02\xc3\x97\xa4\x5f\x4a\x1e\xa5\x25\x93\x9d\x59\xd6\x02\x83\xbd\xdf\x3f\x15\x34\xa7\x00\x2d\x8a\x7e\x74\xca\xac\x6e\xef\x78\xdb\x6a\xfe\x1b\x65\x02\x6d\x4a\x1d\xd5\xb9\x20\x25\x8f\xd5\x8f\x36\x78\x7f\xeb\x8d\x46\xc3\x13\x0c\xef\x12\x73\x46\x42\xa1\x1a\x4f\x06\xf4\xec\xcb\x4c\xd0\x67\x74\xb5\x1d\x24\x49\x85\x45\xe3\x77\x57\xc8\x94\xec\x98\x46\x65\x87\x06\x9a\xc1\xef\xae\x72\xc8\x3d\x63\x08\x5c\x66\xd8\xf3\x05\x6c\x0c\x88\x41\x5f\x5d\x58\x08\xb5\xff\x9c\x51\xf6\x06\x3d\x39\x06\xa9\xf9\x54\xea\x75\x66\x11\x2a\xb9\x6d\xd9\x9b\x64\x77\x41\x58\xf9\x6a\x8b\x10\x98\xbf\x9a\x34\x69\x9c\xea\xef\x40\x43\xc1\x16\xb7\xa6\xa5\x94\x63\x9c\x92\x37\x31\x1c\x8e\x95\xf0\x40\xcb\x59\x43\xe5\x25\xc9\x74\xea\x0e\x68\x8a\xb0\xca\xb7\x3a\xc5\x17\x6b\xb7\xff\x8f\x8b\xc0\xfe\x54\xa0\x0f\x98\xc4\x08\x24\xcd\xdf\x45\xaf\xf6\x26\x0d\x62\x96\x66\xf5\x57\x73\x30\x18\x61\x75\xa1\xc9\x03\x22\x07\xec\x14\x4c\x1a\xbf\xe0\xcb\xc4\x05\x5f\x26\xa4\x6a\xb8\x25\x16\x8c\x4b\x1d\x60\xc1\x2c\xa9\x53\x62\xc1\x84\x78\xea\x2b\x11\x15\xc9\xa7\xa8\x3c\x70\xb7\xcc\x78\x09\x89\x84\x4d\x76\x50\x62\xbc\x34\x71\x5c\x08\xa3\x4b\x45\x86\x45\x94\x75\x65\x29\x12\x50\x26\x97\x26\xa7\x73\x2f\xf2\xe8\x85\xb3\xb8\xc4\x54\xb1\x41\x39\x3d\x22\x01\x26\xaa\x44\xa7\x88\xb5\x28\xc8\xb9\xb6\x89\x25\xd7\x6b\xd8\x64\xb6\x22\x10\x92\xde\xa8\x8f\x91\xe6\xc4\x0f\x81\x9b\xcf\x01\x9c\x90\x26\x5d\xad\xa7\x76\x62\xc9\x9b\xae\x42\x75\xfc\x62\x7f\xc6\x05\x13\x2c\x2c\x80\x98\x5b\x00\x8e\x3a\x45\x24\x05\x61\x9b\x42\x95\x77\x57\x68\xfc\xaf\x0a\x4a\x7b\x5d\x18\x87\x6d\x8b\xb5\xbf\x2b\x0c\xc9\x1e\x0a\xff\x05\xb7\xb9\xfd\x25\xb9\xca\x8d\xae\xc8\x25\xd4\xd0\x1f\x4e\x04\xb9\x93\x43\xac\xcf\x79\x88\x00\x72\x53\xd8\x75\xfe\x5c\x18\x40\xdf\x17\x66\x6b\xef\x0a\x67\x08\x6f\x0b\x71\xde\xb7\xc2\xe2\xe7\x1f\x85\x3d\xca\xab\x42\xb2\xf7\xa6\xe0\x0c\x7c\x2a\x44\x98\x1f\x68\xb6\x30\xe4\x2b\x9c\xe9\xc9\xc4\xc2\xe4\xd7\xc2\x0d\xcb\xfb\x62\x5f\x7f\x3c\x8c\x0a\xff\x92\x7e\x43\xda\xc6\x5b\x2e\x59\xa0\x61\xf2\x3a\x13\xd4\x69\xe4\x5f\x15\xcb\xeb\x9f\xe8\x7b\xd8\xe7\x7f\xd0\xf7\xa5\x7d\xfe\x1a\x93\x1f\x95\xf4\x78\xfe\xaf\x05\xf9\x8d\x06\x99\x64\xf1\x07\xfa\x9b\xae\xff\x26\x12\xff\x4d\x83\xc2\x11\x24\xf9\x1b\x0d\xba\x7f\x55\x36\x4b\xbf\xd3\xcf\xdd\x15\xf9\x85\xde\x74\x57\xe4\xaf\xf4\xb2\xbb\x22\x7f\xa1\xf7\xdd\x15\xf9\x3b\xf5\x8b\x08\xd5\x9c\xd3\xb7\x48\xc9\xc5\xc1\x8d\x06\xbc\x87\xbb\xb3\x22\x29\x82\x24\x29\xdc\xf4\x38\x6d\xff\x2d\x49\xda\x7f\x9b\xff\x6b\xa1\x7e\xba\x2b\x4f\x19\x36\x93\x80\xd3\x50\x90\xf8\x87\x62\xf0\x51\x9b\x3e\xa0\x5f\xd0\x63\x7a\xca\xc7\xe9\x2f\xf2\xd4\x42\x0e\xc9\xff\x1b\x81\xd3\xd3\x14\x83\xeb\xd3\x03\xbb\x52\xb9\xe7\x7f\x47\x3f\x2a\x03\x50\x65\xc6\xfc\xe3\x9c\x2d\xc8\x2f\x2a\x13\xf1\x74\x9d\xb7\x29\xfd\x51\xd7\x7f\x11\x19\x89\x87\x53\xfb\x17\xe2\xf0\x66\x17\xc1\x7c\xce\x17\xf4\x01\xfd\x90\xa3\x36\x3f\xa1\x48\x81\x91\xd7\x84\x3b\x6b\x9b\x93\xa5\x32\x34\xf1\xc2\x00\x94\xa0\xc3\x24\x41\x51\xb7\x94\x4a\x19\x26\x51\x4a\x7c\x7e\x80\xf7\x71\x0a\x1d\xf1\x39\x62\xaa\x77\xbb\x8c\xbc\xf3\xe8\x1a\xe5\x84\x65\x6b\x87\x22\x4c\xf6\x88\x73\x81\xeb\xa1\xa8\x1c\x68\x0c\xed\x11\x27\x2f\xb1\xae\xf3\xf9\xcb\xc5\xdc\x93\x16\xaf\xf0\x44\x21\x4a\x2f\x7d\x10\x3d\x2e\x99\xb5\xde\x21\x03\xb8\xb8\x18\xdb\xaa\x6c\x92\x88\xd9\x79\x49\xee\x90\x49\x1e\x53\x8c\x49\x5e\x81\xa0\x7d\x39\xe2\xc4\x83\xa0\x69\xbf\xa8\xa7\x94\xc4\xf5\xe9\xca\xfb\x1d\xd1\x15\x62\x02\xc5\xbe\x45\x51\x6e\x1f\xb8\xe7\xa8\x64\x5b\xf5\x11\x79\xa4\xac\xcd\x89\xda\xa1\x40\x28\x42\x4e\x22\x02\xb1\x0b\x7d\x2e\x27\x08\x0c\x36\x31\xe1\x29\x09\x79\x83\x8e\xc0\x5a\x1a\x8f\x3b\xe8\x2f\x12\x05\xcf\xa7\xab\x8d\x54\x04\xff\x1f\x75\x1d\x26\x8d\x09\x4c\x79\x0f\x93\x0c\xdc\xad\x36\x8a\x92\xa4\xbd\x47\xaa\x98\x7c\x96\xf2\x0d\x95\x08\x13\xba\xf1\x62\x31\x11\x4c\x10\x35\x62\xd4\x6e\xf3\x26\x59\xc1\x35\x22\xd7\xcb\x5b\xa1\x48\xec\xae\xac\x4a\x0f\xaa\x64\xe2\x41\x66\x0f\xe8\xef\x60\x1c\x94\x5f\x1e\xaa\x8b\x82\x9e\x68\xa3\x3d\x8a\xa0\xe9\x48\x2e\x00\x04\xab\x29\x2d\xb6\x5c\x90\x34\x25\xcb\xa6\xf9\xf8\x2b\x5a\x29\x02\xba\x10\x23\x7f\x44\xac\x72\x11\xca\x5e\x71\x39\x1f\xff\x80\x87\xbf\x83\xc1\x4c\x0a\x7b\x74\xdf\x54\x2f\xec\x52\x12\xd1\xbf\x22\x36\x13\xe7\x14\x1a\xf1\x2a\x8d\x44\x95\x46\xf2\x36\x50\x9b\x89\xe1\xff\x48\x38\x86\x86\x3c\x02\x07\x4a\x34\xe6\xa5\x53\x37\x49\xd0\x6f\xb4\xca\xb1\xda\xa0\x1f\xa4\xb2\xa7\x52\x8d\xfa\x77\x46\x71\x66\xfe\xc0\x9d\x56\x39\xb6\x8d\xdc\x73\xfc\x80\x05\x5d\x8a\xa1\x56\xa0\x30\xc6\x62\xb6\x45\xe5\xd7\xcc\x1a\x8b\x30\xfa\x4a\xee\xa5\x8a\xce\x43\xbe\x87\x40\x4d\x53\x8c\x88\x94\x76\x87\x7c\x9c\xbf\x5c\xc0\xee\x42\xc5\x66\x81\x63\x27\x4e\x0d\x6c\x2e\x38\x54\x82\xe4\xcd\xe5\x69\xba\xee\x71\x5d\x0f\x38\x40\x9f\x03\x63\x8a\x98\x71\x3b\x4a\x31\x71\x38\x70\x6e\x52\xf2\x0e\xfd\x40\x01\xb0\x97\x2c\x2a\x0e\x41\xe5\x1f\x12\x4f\xe9\x72\x67\x9d\x62\xf2\x0e\xfd\x46\xb4\x8a\x5a\x89\xd6\xc4\xc4\x71\x38\x7a\x25\xd9\x74\x82\x6e\xee\xae\x68\xc8\xc9\x4d\x77\x45\x7d\x4e\x7e\xee\xae\x68\xcc\xc9\xe7\xee\x8a\xba\x9c\x5c\x75\x57\xe2\xbe\xa0\x4b\x4e\xae\xbb\x2b\xba\xe7\xe4\x53\xb3\x45\xb2\xc3\xd1\x1b\x55\x23\x09\x75\x1d\xfd\x82\x7e\x20\x5a\x09\x14\x6a\x87\x03\x6e\x06\xfd\xd9\x78\x4a\x65\xd3\x14\x93\x38\x49\xde\xa1\x1f\x8f\x05\x2c\x0a\x39\x79\xdc\x07\xb1\xb3\x92\x91\x0e\xc5\x2e\x2d\x13\x02\xa5\x8d\x23\xa3\x22\x3a\xbb\x32\x06\xed\x2a\x4a\xcb\x4d\xc9\xa3\xdc\x73\xf6\x6f\x29\x26\x1f\xd1\x2d\x8a\x38\xae\xcc\xdf\x07\xe9\x25\xba\xc0\xcb\x5f\x1f\xd0\x48\xa2\x96\x7d\xcc\xe4\xec\x97\x07\xe8\x81\x7b\x4e\x22\xbe\x79\xdb\x9d\xcf\xea\xdf\xcc\xb4\x52\xf3\x51\x22\x2c\xeb\x6e\x58\x90\xab\x8d\xbc\xce\x12\x1b\xee\x01\x71\x6c\xc7\x1c\x3d\x28\x7f\xea\xa4\x46\x50\xfa\x9c\x1c\xb8\xb9\x88\x39\x39\x66\x57\x69\xbb\xfc\x99\x5d\x3d\x20\x0c\xc1\x02\xdc\x5e\x8a\xf2\x5f\x11\x26\xbf\xa2\xdf\xc8\x6b\x4c\xfe\x31\x7f\xb9\x80\xc9\x31\xcd\xb2\xb7\x1b\x41\x7b\x99\x56\xef\x54\x98\xe7\x26\xc6\x5e\x49\x55\xab\xe4\x33\x48\x21\x7f\xc0\xd9\x1b\x8e\x0c\xf0\x59\x10\x67\x36\x8a\x67\x3c\x54\x78\xce\x59\xc4\xd6\x5e\xcc\xa3\x07\x50\xe0\x8a\x33\x8c\x08\x32\xc8\xac\x45\x86\x0a\x7d\xa6\xb0\xb9\xfa\x14\x84\x52\xc3\xa3\x89\x12\x56\xc6\xe0\x0e\x72\x4b\xae\x0b\xdc\x39\xcb\x8c\xc1\xcb\x4c\xb7\x02\x23\x70\x65\x04\xd7\xe5\x3c\x5a\x50\x46\x22\x29\x27\x99\x34\x59\x24\x15\x74\x04\x58\x14\x4a\xdb\x01\x0d\x74\x5a\xad\x06\x2a\xa2\xc8\xde\xa4\xbe\x94\x12\xab\x37\x3e\x5c\x88\x52\xa1\x12\x99\x32\x18\x8e\xac\xa6\x06\x80\x7c\xc1\x24\x42\xb0\xaa\xe2\xc1\x1a\x0d\x7b\x96\x78\x00\x06\xae\x78\x00\xbe\x06\x28\x60\x0c\x1b\x9c\xa5\x35\xc9\x03\x0b\x65\xc3\x92\x86\x76\x11\xc2\xe2\xd8\xc2\xff\xdf\xaf\xab\xb4\x1f\xb0\x0f\x75\xf5\x1a\x14\x7c\xab\xc1\x2d\x9c\x56\x9c\xf9\x13\x05\x09\x9e\x4b\x4a\xcc\x47\xd0\xc5\xc3\x29\x19\xf6\x47\xa3\x53\xd4\x21\x78\x60\xbd\xf4\x7d\x58\xd2\x7e\xaf\x41\x52\x56\xcb\x2b\x32\x8e\xc7\x56\x43\xd8\xdb\x22\xa3\xe2\x2e\x8b\xac\xc3\x41\xaf\xc1\x52\xb8\xc8\x1a\x33\x27\x92\x95\x9a\xd6\xa8\x41\x49\xba\x94\x33\x93\x9b\x42\x4c\xbc\x06\xaf\x99\xe5\xac\xbe\x27\x43\x30\x4c\x9a\x94\xb0\x0a\x0d\x7d\x20\xc4\x82\x9c\x10\x9b\x7a\x35\x3d\x7b\x12\x20\x31\x06\xc3\x3a\x11\x3d\xb6\xf0\x25\xab\xea\x73\x72\x6a\x6e\x1a\xd4\x23\x89\x3b\xa8\xe4\x06\x96\xe4\x4f\x29\xb1\x86\xd6\xe4\x50\xf6\x50\x0c\x69\x1f\xc4\x6e\xb8\x13\xc7\x08\x66\x60\x30\xe8\x37\x28\x79\xd5\x88\xfe\x97\x5e\xbc\x0b\x63\x58\x86\xc1\xa8\xc1\x6b\x5a\x91\x7d\x59\xe4\x1c\x8f\x8c\xc9\xa9\xac\xb0\x09\x18\x9c\x50\x6b\x32\x68\xd0\xf3\x2a\x65\x65\xdc\x59\x3a\xdc\xf9\x0b\x7b\x10\xd9\x47\xe6\xa4\x41\x3f\xe7\x30\x3b\xac\xb0\x61\x35\xd8\x9e\x14\x79\xc3\xdb\x98\x45\x77\x19\x54\x99\xf4\x46\xa3\x43\x66\x70\x91\x7b\xe7\x88\x7b\x34\x78\x97\xed\xdf\xfe\x68\xd4\x10\xb8\xec\x60\xff\xaa\x63\xd1\xeb\x19\x8d\x5b\xd8\xb4\xc6\x03\x5c\xa8\x14\x09\x80\x78\xc0\x2a\x51\xba\xfd\x7e\x61\x76\x5b\x71\x43\x7b\xcc\xd6\x36\xf3\x05\xe5\x4a\x07\x15\xca\xb2\x36\x98\xbb\x8b\x4c\x0b\xb8\xb0\xaf\xdd\x0b\x14\x73\x8f\xdb\x54\x50\xcb\x3e\xda\x93\x90\xb8\x98\xc4\x73\x77\x41\x63\xa9\x4d\x93\xa6\x64\x34\x38\xb9\x85\xfb\xa3\x51\x35\x44\x78\x4a\x4c\xa3\x67\x1d\xbf\x33\xc7\x7d\xd3\xaa\x15\x18\x4f\x26\x0d\x6a\x34\x85\x3a\xfd\xf8\xb0\xc4\xa8\x7f\xc2\x5d\x4c\x6f\x34\x31\xf1\x34\x42\x30\xfd\x65\x0f\x8d\x5e\x4a\xfa\xe3\x13\xdc\xf4\xde\x70\xd2\x1f\x1c\x2b\x39\x34\x07\xa7\x82\x85\x8c\x27\x56\xbf\x3e\x11\xd6\xb8\x01\x82\xe6\xcb\x3e\x1e\x0c\xc6\xb5\x12\x03\xcb\x68\xb0\x68\xcf\xfa\x33\x3d\xb0\xfb\x38\x66\xda\x0e\x33\x2a\x76\x4c\x2d\xe2\x01\x09\xe9\x63\x25\x8e\x70\xbb\x14\xb0\xb7\x7d\x24\x86\x55\xc9\xf2\x5d\x32\x93\x0a\x37\x78\x94\xc6\x82\x84\x8e\x81\xea\x62\xe2\x35\xcb\x93\x24\x01\x0a\x09\x18\x9b\xcc\x7c\x9b\xa5\x29\x19\xf7\x86\x27\x82\x42\xf5\x7a\xa3\x83\xd9\x18\x8f\x8c\x13\x66\x16\xa3\xc1\xe4\x60\x5b\x98\xd6\x89\xf8\x58\x96\x01\x90\xb5\x3a\xe1\xc6\xf8\x84\x1d\xfc\xc4\x98\xf4\x27\xb5\x12\x23\xc3\x3c\x61\x26\xdc\x9f\x18\xa3\xde\x41\xaf\x86\x27\x82\x04\xf7\x0d\xd3\xa8\x6f\x9c\x49\xcf\x30\x4e\x98\xe5\x0d\xc6\x83\xfa\xc8\x2d\x73\x72\x4a\x4a\x34\x19\x1e\x9c\x52\x6b\xdc\x3b\x71\x86\xfa\x13\xab\x57\x6f\x63\x32\x1c\x34\xc4\xcf\x2f\xf8\xed\xc3\xc9\xe8\xd8\xd9\x19\x57\xcd\xe2\x6b\x3c\x63\x20\x90\x5a\x8c\x6a\x73\xe7\x6c\x75\x79\xf6\xfa\xcb\x97\xa5\xbd\xd0\x48\x44\x39\xbd\x00\xcb\x4e\x25\x54\xf8\x31\xdc\x07\x4b\x27\xf2\x58\x3c\xfb\x27\x9a\xd9\x68\x76\x4e\xbf\x7c\x89\x93\xff\xc5\x68\x46\x7f\x78\x64\x29\x4e\x44\x12\x3c\xa1\x19\x7c\xfa\x01\xe3\x7f\xda\x9a\x46\x3c\xaa\xa1\x99\x6d\x0d\xe6\xc6\xd9\x60\x91\x58\x73\xe3\xac\xbf\xf8\xf2\x65\x99\x98\x5f\xbe\x2c\xc5\xef\xdc\x3c\x9b\x40\xc2\x97\x2f\x4b\x8c\x66\xf6\x97\x2f\xdd\xe7\xe7\xc7\x8f\xbd\x54\x23\x41\xb9\xfb\x8b\x47\x93\xf4\x53\x8d\x38\xf4\x9f\x5f\x02\x51\x9f\xf8\xf3\xc3\x63\x90\xda\xf8\x71\x94\xaa\xe7\xc4\xc6\x49\xeb\x19\xff\x5e\xbc\x68\x99\xb6\x65\xf7\xec\xbe\x3d\xb0\x87\xf6\xc8\xb6\x5b\xb5\x84\x71\xb9\xfe\xa1\xac\xdf\x4b\x93\xe7\xb5\x52\xab\xde\x16\x69\x95\x84\x71\x43\x42\xe5\xdd\xec\x5a\xdd\x5e\xb7\x5f\xee\xc4\x40\x74\x42\xf6\x42\x3e\x04\x29\x7e\x34\x89\x75\xac\x3b\x95\x4e\xd8\x32\xad\x94\x30\xaa\x75\x02\x5e\xab\x19\x1a\x3a\xd1\x4f\x61\x97\x64\xcd\x1b\xc4\x4c\x0f\xbb\xd4\x93\x5d\x2a\x75\xc0\xce\x3a\x95\x27\x0c\x6b\x1d\x90\xcd\xd7\x32\x34\x74\xa0\x57\xef\x80\xd5\xd0\x81\x7e\xad\x03\x76\x31\x2b\x2a\x61\x50\xeb\x40\xd6\x7c\x2d\x43\x43\x07\xac\x7a\x07\x7a\x0d\x1d\x18\x54\x3a\x60\x97\x97\x05\x12\xfa\xb5\x0e\x14\xcd\xd7\x32\x34\x74\xc0\xac\x77\xa0\xdf\xd0\x81\x61\xa9\x03\x76\x75\x5f\x98\x76\x79\x9b\xcb\x84\xf1\xd1\x0c\xe5\x0e\xd8\xb5\x86\x07\x0d\x0d\x8f\x44\xc3\xb8\xbe\x11\xed\xea\xd9\x6a\x35\x25\x54\xfa\xd0\x2a\x1d\x01\x01\x3d\xfe\x7b\x6e\x9c\x4d\x9c\xb3\x3f\x2e\xcf\xfe\x21\x00\x41\x8a\x67\x27\x0f\x60\xc3\x59\xf8\x6f\xc6\x37\x46\x39\xed\xbf\xcd\x2f\xc1\x3f\xf3\xf8\x24\x2f\xbe\xc4\x7f\xfe\xf2\xe2\xcb\x8b\xee\x9f\x7f\x78\xb1\xde\x12\x4d\xc3\xa5\x4f\xc1\x8b\x35\xa4\xf0\xc8\x93\x76\x90\x01\xbb\x6f\x29\x5f\x07\x02\x6c\xfe\xaf\x98\x86\x1f\x04\xac\x14\x8f\x4e\xfa\x03\xfe\x27\x58\x05\x94\x72\xc9\x2c\xff\x14\x78\x66\x2d\xd9\x81\x64\x37\x87\xcc\xec\x9b\xe3\xf2\x99\x6f\xd7\xda\xf8\xe1\x31\x42\x1c\xa7\x50\x8d\x7c\x84\xf6\xf2\x64\x27\x4f\xfe\x27\xd1\x04\xda\xea\x76\xef\xfa\xb5\x4a\xe3\x4a\xa5\x87\x35\xca\x92\xc4\xed\xde\x0d\x6b\x25\xc3\xe6\x92\x4e\xad\x64\x71\x43\xb9\x29\xe9\x4f\xcc\xde\x13\x8e\x95\xe4\x35\x05\x38\x2c\xc4\x4b\x0b\x44\xb3\x1e\x7a\x84\x46\x81\xf3\x27\x6d\x16\x39\x9e\x06\x6a\x38\x5e\xf7\xae\xdf\x94\x81\x04\xaa\xd7\x5e\xf7\x6e\x78\x2c\x83\xf4\xb1\x22\x72\x05\x10\x95\x4b\xd4\xc5\xf1\xac\x6f\x0f\x33\xfe\x71\x25\x8e\xbc\x39\xea\xd5\x4c\x46\xf1\xe3\x81\x2a\x55\x61\x22\x45\x62\x12\x4e\xc3\x06\x66\xea\x1c\x71\xdd\x1a\x0c\xce\xcf\xad\x3e\xbe\xb8\xb8\xb0\xfa\x24\x4b\x30\x87\x22\xc1\x1c\x12\x34\x1c\x58\x63\x43\xe7\xe2\x75\x4c\xac\xc1\x40\xe7\x8b\xee\xbf\x42\x2f\x80\xa0\xfa\x29\x69\xc0\x1e\xb3\x66\x95\x11\xd6\x7c\x41\x3c\x1a\x50\x63\x1a\x9c\xd3\x9e\xae\x83\x1a\x54\xae\x0c\x49\x3b\x9d\x40\x3a\x36\xba\x30\xa4\xf9\x72\x57\x13\x19\xe6\xc6\x22\x73\x73\xc4\xee\x5b\xca\x72\xf9\x4d\x70\xe7\xf8\xde\xb2\xf5\xe6\x57\x0d\x4f\x39\xe5\xdd\x78\x7f\x2b\x59\x2a\xc8\xc4\xa9\x43\x91\xc0\x87\x39\x44\xfa\x27\xd5\xcf\x3e\xc4\xe2\x67\x52\x8f\xd3\xc1\xa9\xb7\x42\xe5\x7e\x3c\xd1\x54\xa6\x83\x5a\x8d\xd2\x6e\xda\xde\x0a\xb1\xb9\xb1\xb8\xe8\x5b\x93\xfe\x64\x38\xb2\x26\x83\x27\x2a\xca\xdd\x30\x1a\x8b\x8b\x8b\x0b\x23\x0b\xe1\x9e\xd5\x63\x0d\x06\x49\xc2\xe6\xe6\xe2\xc2\x1c\x8e\x46\x23\xcb\x7c\x5e\x7d\x50\x58\xac\x21\x94\xc5\x45\xcd\xbd\x86\x9a\xd5\x93\xb5\xb8\x18\x0e\x06\xbd\xff\xa4\x01\xb1\x39\xa0\x86\x52\x4b\xfd\x93\x2d\xa9\xa7\x1e\x3c\xfd\xdf\xb4\x78\x7e\x3e\x86\x7a\x64\xcb\x99\xce\xee\xc9\x0a\xd3\x94\x04\x14\x79\x8d\xee\x20\x4a\x3a\x8f\x10\x56\x12\x69\x86\x26\xad\xc9\x35\x47\x53\xee\xa1\x2e\xb5\xba\xd0\x26\xb3\x3f\x8c\x05\x0d\x0d\x7b\x3c\xa4\x06\x61\xd4\x34\x48\x44\xb5\x89\x46\x62\x2a\x8e\x6b\xa6\xe0\xa2\xeb\x9a\xa1\x51\xb1\xa5\xe3\x85\xae\x23\xed\x9b\x7a\xe9\x98\x8b\x24\xd1\xfe\x5e\xbc\xcd\x50\xdc\xa1\x96\xa8\x68\x88\x6d\xcd\xd0\xce\x55\xba\xae\xcb\xdf\x73\x51\xb9\xae\xa3\xb8\xd3\x21\x8c\x8e\x45\x63\x23\x0d\x03\x8f\x71\x1a\x9f\xe7\x47\x4a\x9e\x22\x55\x5c\x16\x5e\x9c\xd3\x08\x87\x34\xfc\x33\xeb\x20\x0f\x89\x04\x7c\x16\xc8\x39\x84\xf8\x86\xde\x0a\x99\xc3\x36\xa5\x0c\x4b\x65\x68\x51\x81\x53\xab\x40\x5b\x69\x59\x15\xa6\xd1\xc9\x6a\xf1\xab\xb5\xb4\xc5\x7c\xd5\xca\xbd\xd6\xb0\xaa\xf6\xb0\xb8\x03\xc5\x53\x71\x1c\xc3\x93\xa7\x88\x87\x61\xcb\x77\xa2\x35\x13\xa7\xb1\xd3\x11\x05\x62\x4a\xa9\x7b\x98\x93\x6d\x77\xfc\xa1\x15\xba\x9c\xf1\x7c\x37\xcd\x43\x12\x2f\x52\xc2\xcb\x82\xc0\xec\xb1\xc5\xab\x86\x11\x41\xd9\x9f\x60\x11\xf0\xfc\xb0\xa1\x77\x5e\x1c\x7b\xc1\xba\xf5\xcf\x80\xf1\x3f\xb5\x76\x4e\xe4\x6c\x19\x67\x91\xe4\xb3\xb2\x24\x41\x81\x80\x40\x3b\xdf\xe3\x48\x7b\xa1\x11\x0b\x13\x4e\x03\x01\x99\x18\x0d\x24\x34\x02\xbd\xcf\x9e\x85\xc9\x81\x22\x23\xb8\xb4\x51\xba\x59\x00\x67\x2f\xce\x4c\xe9\x4a\x81\x6f\xbc\xb8\xbb\x75\xe2\xaf\x6f\xc3\x60\x0d\x4a\xd6\xca\x4a\xc9\xc1\x8f\x47\xcf\x81\xc8\x6f\xb7\xb4\x0e\x93\x6a\xeb\x11\xf5\x68\xcf\x9a\x7a\x17\xd4\x98\x46\xf4\xec\xcc\xc3\x9e\xb4\xfb\x2a\x2a\xa6\xb4\x58\x8d\xf3\xf3\x9e\x75\x16\x89\x85\x92\x02\xcb\xee\xad\xc7\x45\x46\x1a\x49\xdd\x79\x15\x24\x53\x2c\x3f\x93\xe0\x9d\x1d\x3f\xe3\xb2\x2b\xb0\x48\x02\x86\x97\xab\xcb\xf4\xe5\x10\x23\xa6\x81\x49\xb5\x43\x06\x29\xe7\xbd\x30\x94\x38\xb4\xc8\x50\xeb\x6f\x25\xb7\xe8\x7a\x9a\xcf\x5e\xc0\x38\x94\x00\x8d\x40\xbd\x52\x8b\xdc\x8e\x4f\x4f\x68\xc0\x78\xcb\x59\x2e\x23\x16\xc7\x36\xf8\xdb\x4b\x61\xf3\x97\x1b\x3d\x17\x2b\x7b\x7a\x1e\x5a\xab\x30\x6a\x79\xbb\xbe\x5c\x1a\x39\x19\xb1\xf7\x87\x8a\xd3\xb1\x0b\xef\x91\x45\x6a\x43\x51\xd3\x72\xeb\xc4\x8c\x86\xa8\x3c\x9c\xd2\x84\x65\x5f\xf2\x51\xc9\x4f\x9b\x30\xe6\xea\xf3\xff\x69\xfa\xbe\xf2\xa2\x98\xd3\xda\x18\x8c\x59\xb5\x99\x8e\x89\xed\xbc\x0b\xb2\x9c\xef\xc4\x3c\x6b\xb2\x5c\xb0\x52\x2c\x1f\xdc\x99\x65\x1f\xf9\x60\x66\x83\x8b\x42\x67\xe9\x3a\xcf\xe8\x4b\xb9\x6c\x16\x9a\xfd\x30\xd6\x16\xc4\x35\x70\xbc\xa0\x84\xa9\xb0\x22\x28\xdb\xe1\xc9\x43\xa5\xa3\xf7\x42\xc3\x17\x46\x92\xf4\xc5\xa6\xce\x0e\x73\x57\xc3\x19\x22\x00\xfa\xd9\x10\xeb\x08\x7c\xb5\x55\xbc\x23\x73\x39\x01\x59\xe3\x88\xc1\x94\x29\x9d\x8f\x4a\x72\x36\xde\x24\x61\x30\x99\xd8\x46\xe2\x60\x37\x6c\x4d\x4a\x2b\x13\xd0\xb4\x79\x49\x79\xe4\x01\xfb\xc6\x1b\x46\xad\xc2\x0e\x4a\xcf\x3a\x26\x26\x72\x04\xc7\x26\xf7\xcf\xac\xb4\xb7\x70\xb5\x01\xc5\x01\x6c\xbc\x1f\x3d\x65\xfe\x21\x6d\x7b\xe5\xf6\x92\xa6\x17\xf9\xb6\xc1\x84\x81\x09\x06\x8d\xa6\x58\x74\xc0\xc3\xc4\x83\xb8\xb8\x9d\x0e\xf1\x3a\x9d\x6a\x5b\x19\xf3\xfb\x48\x5c\x2f\x98\xde\x8e\xf6\x42\xeb\x94\xb7\x4d\x4a\x78\x8a\x40\x39\x72\x67\xf9\x00\x32\x09\xeb\x8a\x07\xcb\xdb\xd1\x90\xb0\xee\x7b\x26\x0f\x05\x4f\xb1\x0a\x13\x24\xfd\x80\x0d\xfa\xd6\x13\xf6\x60\x51\x77\x89\x18\x79\xdc\x37\xa8\x16\x6c\x53\xf2\x97\x86\xe4\xbb\x34\x2d\x31\x76\xc7\x83\xb1\x92\x2b\x9a\xc6\xb0\x37\xc1\x8a\xe8\x70\xe8\x5c\x53\xbb\x83\x45\xda\x62\x9a\x5f\x54\x7e\x6e\x1a\x20\xdd\xd0\x05\xdd\x4f\xeb\x7f\x20\x83\x40\x20\x6f\xd2\x17\x74\xc4\xcd\xfe\x37\x24\xd6\xb3\xfb\xef\x7f\x5c\x22\xe9\x9c\x0e\x3f\xca\x6a\x39\x0d\xba\xe1\xb7\x7b\x24\x08\x96\xbf\x0e\x7f\x41\x5a\xb0\xbe\xf2\x9d\x38\xd6\x08\xef\xf2\x0d\xdb\xb2\x8e\x76\x06\xbf\x9a\x28\xff\x6d\x37\x94\x15\x6d\xbc\x7f\x21\xed\xcb\xde\xea\x59\x4e\x0b\xb2\x7a\xdc\x67\x82\xe6\x4c\xd3\xbc\x63\xd2\x23\xd3\x63\xd6\xab\x87\xe0\x9b\x34\x68\x82\xde\x10\x51\x7a\x64\x8e\xa1\xda\x1f\xff\xfa\x15\x61\x5c\x94\x0c\x9f\x51\xb2\xdf\x58\xd2\x7d\xba\xe4\xc8\x6c\x2c\xb9\x7c\xb2\xa4\xd1\x73\x1b\x4b\xee\x9f\x2c\x69\xf6\x26\x8d\x25\x37\xc7\x96\x2e\xde\x39\x81\x46\x46\xa2\xcc\xef\xef\x5d\x64\x92\x98\x58\xc4\x20\x5a\xb0\x3e\x2b\xf6\x00\x19\x67\xdf\x2d\x12\x9e\xfc\xde\x23\xee\xc9\xef\x7d\xb2\x3c\xf9\x7d\x40\xf6\x47\xbf\x9f\xd8\x52\xdd\x1f\xbc\xed\xce\xf7\x5c\x8f\x17\x9b\xeb\x1a\x68\x26\xd8\x32\x0f\x3b\x56\xd9\x53\x95\x1c\x57\x4e\xcc\x34\xa2\xbd\xfa\xf8\x51\x7b\x32\xd3\xf5\x6f\x57\x57\xaf\xae\xaf\x9f\xce\xf8\xf6\xc3\x4f\x4f\x67\xfa\xdb\xe5\xc7\xf7\x4f\xe7\x7a\xf3\xfe\xf5\x07\xb1\xdb\xe5\x90\x77\x0d\x74\xc4\xa3\x13\x78\x5b\x87\xb3\xa5\xcd\xd3\xb4\x38\xae\xab\xd3\x6b\x3e\x28\xd6\x7c\x43\x86\x64\x98\xa5\x0f\xb3\x1d\x65\x1d\x9b\x74\x56\x4c\x37\x89\x4a\xa7\xfa\xa7\x88\x21\x6d\x1b\xaf\xcf\x3c\xce\xb6\x2d\x8d\xc0\xb3\xd6\x91\x0b\x50\x0d\x70\x2b\x0e\x30\xa9\xc3\x81\xa0\xfb\xf9\x2f\xff\x46\x23\xb2\x23\x51\x37\x1b\x12\x6e\x9a\x9f\x37\x2b\x8d\x44\x5d\x4f\xf4\xa7\xf2\xf9\x32\x7e\x85\xb4\xd6\x5c\x82\x89\x2d\x8b\xb9\xb3\xdd\x11\x6d\x61\x03\xe0\xd8\xb2\x38\x76\xd6\x8c\x68\xad\x62\x36\xd7\x94\xd3\x0b\x65\x95\xe2\xc4\xb1\xb7\x0e\xd0\x63\x4a\xb8\x52\x7e\x95\x1d\x9f\xc9\x1f\x1b\xd6\x94\xe4\xf5\xda\xa5\x36\x66\xa5\x67\x1b\x42\x0f\xbe\x74\x38\x93\x31\x7d\x5d\xc7\x67\xca\xb1\x14\x4e\xf1\xd4\x67\xbc\xb5\xa5\x08\x61\x7a\xf1\x08\xe1\xa3\x5b\xfc\xb1\xa4\xb3\x95\xe9\xe4\x75\xff\x08\x03\x46\xb9\xc2\x9b\xbc\x98\x87\xd1\x03\x9d\x2f\xe4\x3b\x40\x49\xaa\x2d\x9d\xe8\xab\x26\x53\x60\x2a\x20\x5c\x11\x5c\xed\xfb\x98\x87\x5b\x98\x54\xaa\xf9\x61\xe5\x24\x41\x86\x6c\x72\x69\xdb\x48\x83\xf5\x87\xe0\x6a\xe3\x04\x6b\x16\x4b\x27\x48\xaa\xb5\x0c\xbf\xcd\x1a\xcf\x3f\x74\xdd\x7d\x14\xb1\x80\x7f\x76\xfc\x3d\xeb\x6e\x9d\x1d\x5a\x43\xec\x25\x3f\x5c\x5f\xf3\x88\x39\x5b\x5d\x2f\xbd\x54\x72\x2b\xd4\x43\x8c\xad\x1b\xed\x03\x35\x0b\x4a\x20\xb3\x46\xc7\x8a\x29\xcc\x34\x6b\x1f\x58\x28\x0c\x93\x98\xf1\x4f\xde\x96\x85\x7b\x0e\x15\x49\x74\xc1\x8d\x42\xdf\xff\x14\xfe\x18\x72\x1e\x6e\x11\x98\x1e\x04\xeb\xcb\x15\x67\xd1\x67\x8f\xdd\xbf\x09\x3c\x8e\xd4\x0c\xd7\xb3\xa6\xf5\x84\xc7\x32\x9e\xc4\xa2\xae\x74\x18\xf6\xca\x67\x10\x78\x2a\xcb\xbd\xa3\xcf\xc8\xf6\x33\xf3\xd6\x1b\x9e\x16\xb8\xe1\x97\xbd\x61\x8d\x06\x2b\xc7\x6d\x44\x8e\xd8\xbd\xa0\xdf\x38\x46\x41\xf7\xf7\xde\x10\x05\xdd\x8f\xc6\x2d\x06\xc4\x47\x96\x73\xb7\x3b\x1a\x74\xff\xbe\xdb\x22\xb5\x51\x49\xcc\x7c\x26\xf6\x4f\x6c\xcf\xe7\xb0\xe4\xdb\x30\xf0\x20\x9a\xe6\x82\xdc\x79\xec\xfe\xaf\x7b\x16\x3d\xd8\x07\x26\x7e\x00\x18\x82\xee\x4f\x2b\xe4\x08\x78\x00\xa7\x5c\xec\x50\x01\x46\xbd\x9f\xde\x21\x01\x60\xaf\x3e\xfe\x8c\x40\xa1\x98\x15\x83\xa4\x5c\x61\x53\x69\x4a\xbc\x60\xb7\xe7\xb1\xfd\xa8\x96\xc7\xd6\xd4\x83\xd8\x6b\x6c\xcb\x6c\x4d\x5e\xea\x04\xf6\xa8\xad\xc1\x8f\x46\x4a\x7b\xd4\xd6\x4a\x2f\x1a\xc9\x81\x99\x96\x3d\x89\x53\xc7\x7d\x51\x93\xf8\xd1\x48\xbe\x4b\x6c\x2d\x7f\xd4\x52\xb2\x62\x0e\xdf\x47\x2c\xb6\xe7\x41\xf7\xd3\xa7\x97\x0b\xb2\x64\xae\x1f\xdb\x7d\x72\xe7\x44\xb1\xdd\x93\xaa\x91\x30\x41\xae\x6c\x49\xd6\x77\x76\xeb\x44\x1a\xe9\x91\x02\x0e\xf5\x89\x84\x31\x0b\x32\x37\x49\x09\x15\x2a\x67\x5a\x90\x32\x92\x44\x34\x91\xd0\x23\x79\xcd\xd5\xba\x5e\x87\x91\xa6\x7e\x3f\x64\xd5\x36\xb7\x2d\x6b\xa9\xbf\x65\x57\x59\xa9\x63\xe5\xf4\x05\x99\xf7\x49\xf5\xda\x58\x2c\x08\x67\xdb\x9d\x7f\xa8\x31\x99\xdd\x05\x02\xf2\x1b\xc4\x27\x16\xb1\x14\x02\x07\xa8\x84\xb8\x22\x4c\x95\x60\x12\xab\xb8\xd7\x57\xa4\x47\x26\xd9\x1d\xd1\xab\x5e\x0d\x50\x61\x09\x36\x33\x89\xa5\x35\x81\x6e\x35\x2d\xec\x08\xca\x67\x95\xb2\xca\xd9\x22\x2c\x3b\xf8\xe2\x04\x2c\xbd\x88\x41\xb8\xbb\xd8\x9e\x7b\xdd\x0f\x03\xe2\x75\xb7\x5f\x89\xd7\x8d\xd7\xc4\xeb\x7e\x7c\x4d\xbc\x6e\x30\x59\x10\x08\x47\x17\xdb\xf3\x3f\x15\x3b\x76\x7e\x13\xac\x55\x78\xb9\xb3\xff\xbe\xfa\xf0\xee\xd7\xff\x5e\x3c\xee\xc2\xd8\x03\x8b\x86\x88\xf9\x70\x68\xa7\xf7\xde\x92\x6f\x6c\xd3\x30\xfe\x7b\xba\x81\x23\x2b\x9f\x77\xce\x72\x29\x35\x27\x77\xf6\x60\xf7\x2d\x7f\xbf\x05\x48\x01\x49\xe1\x1d\x8b\x56\x7e\x78\x7f\xf6\x60\x3b\x7b\x1e\x4e\x57\x61\xc0\xcf\x56\xce\xd6\xf3\x1f\x6c\xed\xed\xde\xf5\x96\x4e\xeb\x2a\x0c\xe2\x50\x6c\xe0\x77\x61\xe0\xb8\x21\xd9\x86\x41\x18\xef\x1c\x97\x91\xd8\x09\xe2\xb3\x98\x45\xde\x2a\xcd\x81\x73\x53\x8f\xcf\xee\xd9\xed\x57\x8f\x9f\xc9\x3c\xa2\xeb\xd6\xd0\xd8\xc6\xad\x95\xb3\x64\x5e\x30\x6d\x4e\x4e\xff\x27\x2b\xf6\x95\x3d\x40\xe8\xbe\xec\x0b\x38\xc3\x7a\x0c\x77\x8e\xeb\xf1\x07\xdb\x98\xf2\xc8\x09\xe2\x55\x18\x6d\x6d\x78\x12\xbb\xe7\x77\x74\x66\x1a\xbb\x6f\x38\xe5\x61\x9e\xd1\x6c\xce\x68\xe0\x34\xfd\x9f\xff\xff\x9b\xe8\xe6\x27\xa7\x71\x4d\xe5\xd2\xc0\x9a\xc0\x1a\xdc\xcb\x75\x1c\x1a\x46\xda\x15\x37\xa6\xdc\x70\xa7\x2b\xb9\x0d\xa3\x25\x8b\xb2\xe5\x35\x77\xdf\x5a\x71\xe8\x7b\xcb\xd6\x7f\xf5\x5c\xf1\x7f\x7a\xeb\xb8\x5f\xd7\x51\xb8\x0f\x96\xf6\x7f\x99\x2b\xf1\x3f\xed\xfa\xa2\x99\xff\xab\xca\x9d\xb1\xe3\x3a\xcb\x4a\xe5\xcb\xdb\xe5\x8a\x19\x69\x37\x43\xaa\x9a\xea\x53\x51\x17\xed\x5b\x3f\x74\xbf\x4e\xb7\x4e\xb4\xf6\x82\x33\x9f\xad\xb8\x3d\xcc\xe6\x40\x10\xd1\x76\x77\x3c\x60\x5b\x59\x95\xef\xc5\xbc\xa9\x2a\x59\xd8\x36\xca\x9b\xbf\x32\xb2\xa6\x42\x6e\xe8\x87\x91\xfd\x5f\x96\x29\xfe\x57\x7a\xcf\xdc\x95\xb1\x32\x9f\xaa\xa0\xd5\x6a\xc9\xf1\x05\xab\xf0\x54\xfd\x93\xb1\x71\x3b\x79\x6e\x65\x2c\x6a\x9c\x7b\x55\x97\x6b\xf4\x26\xd6\xed\x73\xeb\x8a\xf7\x10\x8c\xee\x54\xdf\x46\x0e\x1b\x1a\xcf\xad\xef\xde\x89\x82\x13\x95\xad\x7a\x13\xd7\xb4\xca\x9b\xf5\x44\x66\x39\xc5\x95\x59\x97\x0b\xf1\x44\xf9\x67\x4e\x7a\xaf\x3f\x19\x2f\x6f\x9f\x59\xd7\xe9\x39\x67\xa3\xbe\xdb\x73\x9f\x59\xd5\x33\xa6\x9c\xb9\xee\xe8\xb9\xa3\x7c\x6a\xc6\x4d\xb7\x6f\xac\xd2\x3f\x2d\x88\x0b\x88\xf0\x4b\xc6\x19\xdc\x98\xb6\x01\x96\x59\x18\x61\x72\x57\xc3\xd9\xbf\x17\x95\x2b\x90\xb7\x6d\xb8\x14\x34\xd3\xe5\x8f\x19\xf2\x06\x71\x9d\xe5\x37\x2f\xf8\x17\x0d\xba\xee\x2f\xd7\xe8\xd1\xdb\x82\xb0\xd5\x9e\xcf\xbd\x2e\xfb\x63\xb1\xc8\x7a\x02\x3a\xb8\x0d\x6a\xcd\x4d\x9c\xa1\xbf\x37\xb0\x80\x9c\x32\x0b\x68\x34\x19\x65\x5a\xc1\xa3\xd1\x64\x64\xe2\xa9\x1c\x9f\xd3\x62\xdf\x38\x0b\x96\x71\xcb\xeb\x7e\xfb\x6b\x9d\x40\x89\xf7\x3b\x16\x21\xc5\x93\xbb\x01\xa3\x45\xca\xd3\x35\xe3\xd2\x83\x73\x8d\x2b\xb6\x66\x12\x8b\x47\x38\xbd\x89\xf7\xb7\xb1\x1b\x79\xb7\x0c\xe5\xe4\x24\xa3\x50\x5d\xb7\xf2\x2d\x97\x53\xea\x7a\x9b\xc9\xa8\xae\x4b\x41\x56\x04\xec\x9b\xb4\x39\x52\xcd\x62\xc2\xd2\xa2\xfe\xc7\x4c\x8a\xb0\x71\x62\xe0\x76\x2b\xee\xb7\x22\x9a\xa2\xf0\x3e\x90\xc1\x6d\xb2\x7c\xb2\xe2\x12\x8f\x3c\xe8\xbe\x9f\x96\xfb\x2e\x5b\x49\x65\xb3\x6a\xe0\x07\x9d\xa0\x1c\x62\xbf\x0c\x47\x83\x06\x8f\xc1\x4d\xcb\xf2\xd0\xb0\x2c\x6e\x65\x59\x46\xbd\x49\x66\x59\x3f\x31\xc7\x2a\x3e\x65\x7f\xd8\x9f\x28\xc7\x67\xe6\x10\x1c\xf0\x42\xb0\xf4\x7e\x7f\x3c\x92\x45\x21\x3c\xb4\xd5\x9f\xf4\x25\x99\xe9\x3e\x83\xcc\xbc\xf1\xe2\x6b\xd7\xf1\x9d\x08\xdc\xb0\x66\x34\x5f\xb1\x16\x62\x6c\xbe\xb7\xe2\x62\x4b\xcb\xf5\x92\x81\x6c\x73\x9f\xf9\x51\x57\x86\x3e\x01\x2a\x88\x44\xdd\x70\x27\x4d\x23\xc0\x5e\xa3\xb4\xa4\x72\x36\xa0\x8a\xc7\x2c\x8f\xed\xa7\xb2\x58\x3d\x56\x4f\x16\xa9\x47\xfc\x2d\x73\xb4\xbd\xee\xdb\xc2\x57\xbc\xf8\x38\x0f\xba\xb7\x8b\x3c\x09\xde\x50\xee\xe8\x97\x27\x09\x4b\x92\x68\x26\xfa\xeb\x75\xdf\xaa\xaa\xed\xec\xd5\xe9\xba\x38\x55\x89\xa2\xb2\xb8\xeb\x2c\x97\xc8\x9f\xf9\x92\x0b\x1b\xcb\xed\x2d\x47\xa7\x44\x0e\xf2\x25\x49\xc2\xee\x5d\x77\x1f\xb3\x97\x6c\x17\x31\x57\xe0\x6a\xd7\x0f\x81\xbb\x89\xc2\x20\xdc\xcb\x8d\xf7\xb3\x13\x2c\x7d\x2f\x58\xeb\x7a\x3b\xee\xc6\x0f\x81\x0b\xa9\x9f\xc4\x3e\x03\x7b\xd6\xda\x2c\xa3\x58\x35\x70\xc3\xa3\x87\xeb\x52\x2a\x26\xdf\xd1\x54\x53\x4b\xba\x8e\x9a\x92\xc5\x6a\xd7\xd3\x83\x4c\x58\x54\xfa\x00\x07\x2b\x5b\xea\x38\xad\x76\xaf\xea\x5b\xbd\x3e\x24\x5e\x0a\x3f\xfd\x1d\x83\x40\xbc\xde\x2d\x19\x85\xb9\xda\x25\xca\xaa\xb6\x6a\xe0\x32\x89\x4f\xb3\x0d\x26\xcf\xb5\xcd\xc8\x92\xc5\xdc\x0b\x24\x4a\x1c\x11\x2f\xbe\xe6\xe1\x6e\xc7\x96\x76\x90\x52\xae\xa4\xa4\x41\xe1\x44\x98\xd3\x48\xd7\xa3\xda\x86\x9b\x45\x32\xc4\x64\xe6\x45\x2c\x45\x1c\xcf\x78\x97\x81\x34\x8d\x61\xdb\x95\x48\x7d\x57\xdc\x31\x10\x31\x42\x49\x24\xaa\x61\x8f\xc4\x35\x40\x97\x88\x61\x8c\xc0\x31\x14\xbd\x00\x3a\xdb\x9b\x7a\x92\x7d\x50\xcc\x1b\xa3\x17\x52\xce\x5a\x48\x56\x03\xfc\x18\x81\xb7\x28\x5d\xf7\xba\xfb\xa0\xc8\x2b\xc8\x6f\x08\xae\xd1\x08\x5a\x1f\x55\x50\x22\x26\x4f\x59\x09\xa6\xb2\x6e\x65\x9d\xe6\x7e\xf7\xed\xa2\x0a\xb5\xd3\x9d\xb7\x63\xa8\xdb\xed\x16\xca\x0a\xe0\x70\x2b\x73\x01\x21\xf2\x34\xf9\x85\xac\x64\x8a\xbb\x0f\xb6\x59\x29\x35\x37\x16\x76\xc3\x2d\xc9\xbb\xd2\xef\x22\x82\x49\xa3\x17\x4c\xd9\xee\x89\xb9\x56\xe2\x10\x1e\xfe\x1a\x85\x5b\x2f\x66\x65\x27\x94\xec\x1e\x71\xba\x44\x5c\xcc\xaa\x2c\x09\xb3\x1a\x4d\x6b\x73\xca\xe9\x45\x44\x39\xe1\xaa\x66\xe0\x16\xa1\x08\x98\x43\xc5\x3d\x2e\xed\x0b\x29\xa3\x17\x99\x3c\x4d\x5e\xb8\xd3\x32\xe3\x5e\xc2\xa4\x24\x41\x9c\x8a\x4d\xad\xfa\x94\x24\xea\x01\x93\x76\x83\xa0\x3e\x08\x5b\xea\x7b\xcb\xdb\xee\xfc\xd6\x4a\x20\x6a\x5a\x35\x12\xb6\x80\xed\xcf\xba\x3c\xdc\xa7\xee\x74\x79\x03\x48\x73\xa1\x7e\xbf\x5f\x12\xeb\x64\xe7\xa2\x6d\x90\xec\x46\x4b\x89\xdc\xc8\x2a\xb6\xdb\x73\xcf\x69\x76\xb1\x4e\x91\x41\x82\xee\x1f\x58\xec\x22\xe2\x86\xdb\x9d\xcf\xb8\xb8\x88\x53\x88\x2c\xda\x10\x90\xb5\x69\x44\x4d\xa6\xb1\x77\x47\xb0\x94\xde\xb0\x9f\x99\x3e\x9a\x43\xd3\xb0\xb2\xc1\x49\xc5\x43\x79\xd3\x65\xa8\x8b\xd3\xbd\x7b\x4c\x51\x35\x2d\xe8\x86\xd5\x7b\x50\x1c\x52\x89\xcf\xc8\xf8\xc9\x92\x33\xb8\x61\xcb\xbd\xcf\xa2\x8c\x01\x7b\x1f\x46\x5f\x29\x4b\xb3\x74\x91\x95\x1a\x85\xa3\xbd\x0b\x63\x26\x31\x83\x72\x06\x6c\xcb\xbb\x74\xc9\x7c\xe7\x81\x2a\x49\x75\xcc\xc5\x16\xe3\xb5\x66\xba\x2b\x7f\x1f\x6f\x94\x13\x16\xb9\xdd\xd9\x37\xe6\xee\x39\xab\x3a\xf4\xbb\x30\x92\xa4\x84\xb7\xa8\x46\xcb\x59\xd5\x2d\x52\x4e\x4a\x23\xf6\xef\x3d\x8b\xf9\x25\xf8\x57\x59\xca\x85\x28\xf5\x5e\x05\xab\x17\x90\x4f\xd4\xaf\xdc\x64\x46\x8a\x55\x0b\xbd\xcf\xc7\xd7\x54\x15\xb6\x79\xb9\xff\xd9\xba\x81\xb3\xa5\x41\xcf\x54\xd6\x88\x0a\xa3\x71\xc5\xa6\x9c\x98\x13\xe5\x7c\xd2\x1a\x80\x83\x20\x70\x48\x6c\x58\xc6\x20\x43\x3f\x37\xf5\x35\x02\x3f\x12\xa2\x3f\x5f\xbd\x60\x99\xcd\x9f\x44\xbe\xd4\xcc\xc2\x36\xa6\x11\xc9\xf0\x3f\x79\x4d\x68\xef\x41\xbb\x29\x95\x76\x58\x00\x3b\x94\x2a\x5d\x5e\x9b\xd4\xa5\xd3\xde\x6b\x76\x0e\x09\xc4\xe1\xa8\x62\x9b\x12\xd9\x04\x4d\x33\xed\x55\x29\x27\xb4\x0a\xba\xa0\xf2\x14\xe5\x3d\x51\x79\xaf\x4a\x79\xb3\xe3\x21\xb2\x17\x47\x25\x4d\x97\x61\x36\xc2\xa7\xbb\xa6\xeb\x27\x3b\x24\x40\xfb\xa9\x4e\x88\x45\x16\x4d\x3a\xae\xcb\x76\x3c\xb7\xf8\xc9\x2b\x6f\x8a\x4f\x0f\xb3\x20\x11\x96\x62\x16\xe5\x3e\xcb\x7b\x9e\xf2\xf0\x43\x6e\xe9\x86\x9e\x1e\x08\x32\xc8\xb2\x1b\xae\xf0\x89\xb1\x20\x83\xec\xbb\x37\xf8\xc4\x68\x90\x41\xdc\xae\x2b\x28\xa2\x03\x80\xbb\x0f\xd8\xb7\x1d\x73\x39\x5b\xb6\x82\x90\x7b\x2b\xcf\x05\x14\xa0\x25\xfa\x92\x87\xf9\x11\x67\xd1\x73\x5b\x12\xec\xbf\x57\xf0\xb0\x1e\x3c\x80\x03\xf6\xb8\x41\xda\x7b\x8d\x70\x6c\x6f\xba\xfb\x40\x5a\x8f\x2f\x61\x83\xbd\x2f\xd5\x5e\xad\xf0\x55\x06\x56\x8b\xbb\x4a\x54\xf3\x4a\x23\x99\x3a\x6d\xad\x07\x57\x05\xf4\xcc\x7d\xf5\x67\xdb\xa4\xd2\x4c\xda\x9c\x4e\x55\x0b\x57\x1a\x26\xa7\xba\x49\x8b\x01\x29\x5f\x57\xea\xd0\xed\x72\x20\x19\x76\xdf\x1e\x1e\x40\x01\x32\x14\xa0\x3c\x00\x93\xea\x0c\x4a\x50\x17\x65\xe3\x5a\x7a\xf1\x2e\x0b\xc7\x2e\x11\x92\xf2\x62\xd4\xb1\x33\x81\x91\xb1\x7c\x8b\x45\xaa\x8d\x2a\xb6\x93\xb5\xf8\x4e\x8a\xf2\x72\x2a\xa6\x54\x11\x20\xf1\x35\xf0\x9a\x83\xe5\x5d\x37\xeb\x53\xa9\xc3\xa0\x7c\xb2\x42\x9c\xd4\xab\xc2\x18\xa7\x37\xd9\x45\x59\xa9\x32\x6b\x7f\xd3\xad\xec\x1e\x9c\xde\xe4\xb7\xe9\xc9\xfc\xd9\xe6\x68\x1c\xe4\x4d\xe9\x1e\x3d\x59\x4b\xb1\x63\x1a\xeb\x49\xe5\xb2\xae\x0e\xef\x3b\xa9\x65\x53\xde\x13\x87\x83\xa7\x2c\x4d\xa5\xdf\xf3\x8c\x35\x00\xae\xad\x46\xe3\xf1\x60\x9c\xed\x98\xbb\x13\x5c\x02\xfa\x1e\xc2\x65\x75\x7f\xfd\x70\xfd\xe6\xd3\x9b\xcf\xaf\x6e\xde\xbc\x7f\xfd\xe6\xfd\x9b\x4f\xbf\x13\x76\xfc\x53\x54\xe3\x2d\x14\x3b\x4c\x01\xf6\x1b\x76\x07\xfe\xd7\x33\x49\xe8\x8d\x17\xac\xbc\xc0\xe3\xec\x93\xb7\x65\x7f\xf3\x82\x65\x78\x0f\x84\x2c\x7c\xbb\xdd\xaf\x56\x2c\xba\xf6\xfe\x60\x94\x9f\x9b\x33\xd3\x56\xa3\xbc\xb9\x87\x8c\xa2\x08\x65\xf0\x81\x11\x46\xe9\xd1\x6e\xcd\xd0\xf1\xb6\x94\xc4\x15\xd4\x9c\xf2\xa7\x37\x07\x19\xb1\xdd\x90\xad\xf8\x9c\x36\x97\x2a\x33\x49\xca\xc3\x9f\x2a\x35\x72\x81\x24\x67\x5a\xbe\xf5\x21\x03\x92\xbf\x11\x94\x3b\x26\x65\xb6\x05\x4e\xab\x4d\x17\x9c\x00\x59\xb7\xac\x59\x1c\x89\x07\x35\xec\x35\xe3\xef\xc3\x7b\xb1\x24\xd9\x3e\xbb\xe1\x91\xb7\xfd\x11\x9a\xfa\xb4\x61\xc1\x4f\x8c\xbf\x82\xb2\x07\x4d\x35\xf3\x7b\x8e\xcd\x26\x89\x68\x46\x19\xcb\xbe\xd8\x4f\xb5\x96\x11\x4f\xd9\x36\x11\x28\x62\xa6\x85\x2c\x08\x01\xe7\x38\xa7\x67\xdd\x7d\x9f\x7f\xcc\xe9\x42\x85\x5e\x65\xec\xa3\x99\x43\xe3\xee\x7d\xf7\xd5\xbb\x5f\x3f\xfd\xae\xb0\x39\x05\x9f\xa2\x38\x5f\x01\x07\x00\xea\xb6\xfb\xb7\x2c\xac\xbc\xf4\xbe\x25\xe1\x10\x7c\xdb\x21\xf0\x8c\x44\x18\x44\x74\x11\xfd\xf2\xa9\x31\xf5\xcf\x03\x5d\x6f\x73\xd5\xb3\xa9\xdf\xe9\x60\x85\x71\x44\x73\x3f\x8b\xe3\xf2\xfc\x02\xd9\x2d\x5a\xa6\xc6\xf3\x71\x54\xf0\x93\x12\x23\x4c\x6d\xcb\x7c\xfc\x55\xd4\x84\x38\x69\xbe\xf8\xea\x4e\xaa\x41\xd6\x24\xf1\x71\x37\x10\xdf\xd3\xe3\xab\x94\xab\x8d\xd4\xb6\x53\xb6\x11\x8a\x3d\x4b\x22\x5a\x3f\xa0\xd9\x12\xab\x1d\x41\x02\xea\x55\x16\x58\x05\xda\x99\x3a\x30\x39\x88\x9f\x79\x73\x67\x01\xca\x18\xe7\x11\x9e\x62\x27\x8f\x14\xd1\x0a\x2e\x98\xae\x23\x27\xf7\x61\x8f\x1c\x12\x9c\x31\x8c\x89\x73\x61\x08\xba\x3a\xde\xf9\x9e\xcb\x90\x41\x1c\x4c\xbc\x0c\x78\x3e\x1c\x01\x9e\xa2\x81\x1a\x1a\x2a\x48\x1e\x20\x54\x9e\x45\xf3\xfc\xde\x44\xc6\xb9\x29\xf9\xf6\xd7\x86\xf4\x65\x99\x18\x02\x36\x63\xc6\xb2\xed\xe5\xf1\x1a\x25\xaa\xed\x17\xd0\x3a\xce\xa1\x35\x20\xe0\x92\x8f\xa8\x00\xb7\x5b\xa2\x87\xde\x36\x73\x77\xb3\x4b\xbe\x7c\x25\xf0\x34\x15\x93\xbe\xac\xf2\x15\x4b\x97\x40\x75\xba\x6a\xc0\x3c\x3f\x3a\x39\xf4\x96\x3b\x39\x07\xd8\xf9\x36\xcc\x53\xb2\x0d\x9c\x27\x94\xf6\x2e\x05\xae\xcc\x3c\x04\x96\x5f\x19\xcb\x52\x41\x05\x24\xdb\xb2\x04\x76\xc4\x37\xe5\xda\x0a\x32\xe4\xfc\x90\x82\x67\xc9\x49\xc1\xeb\x3d\x0a\x39\x7c\x09\x39\xda\xd5\x3e\xe7\xbc\xcd\x6c\x94\x19\xdb\x05\xbc\x6a\x2a\x7f\x98\x1e\x65\x32\x14\x33\x92\xbe\x13\xc4\x6c\x4a\xbb\xa4\x68\x1a\x74\x3a\xd8\x9b\x07\x8b\x1c\x78\xa6\x65\xca\xfc\x78\x57\x6a\x13\x65\x1c\x4e\x14\x3f\x98\x5e\x63\xfa\xff\xaa\xb3\x59\x1f\xa7\x35\xe8\xa8\x82\x1b\x18\x69\x09\x99\x79\x7a\x18\x27\xbb\xc8\x55\x17\x59\xe1\x5f\x34\xa2\xfc\xa0\x8b\xd2\xa5\x3a\x03\x6f\xef\xd1\xdc\x5b\x94\x00\xda\xd1\x4e\x56\x10\xa7\xc7\x83\xae\x54\x77\xab\x51\xdf\xce\xb0\x11\x0f\x58\xa3\x27\x47\x9b\x71\x54\xa5\xe4\xa3\x56\xb4\x76\x6d\x3e\xa7\xa2\x2a\xb8\x47\x47\xe1\x3d\x71\xb2\xfb\xac\x0e\xfa\x45\xa1\x32\xe8\x2f\xf2\x1d\xbb\xf8\x44\x17\xe2\xd2\xb5\x97\x3a\x71\x85\x08\xcc\x55\x34\x81\xdf\xfe\x90\x77\xb5\x22\x30\xe0\x87\x0c\x38\xc5\xc9\x53\xc7\x95\xe4\x6c\x38\x09\x6e\xf6\x39\xb8\x59\x1e\x63\xe4\x34\x41\xae\x32\x33\x9f\x16\x87\x5c\xee\xb1\x32\x1d\x92\x31\x4b\x01\x81\x92\x8c\x00\x96\x1f\xc9\xfc\x44\x3e\x51\x2e\x63\x0b\xd4\x69\x93\xac\x7c\xf9\x54\x1c\x56\xa5\x36\xfa\x94\x97\xaf\xe3\x86\xda\x4a\x4c\x84\xef\xe0\xfe\xce\x4a\x33\x51\x61\x03\xdb\xf9\x9a\xc3\x55\x36\x7e\xd2\xfb\xae\xba\xca\xfe\xd6\x70\x63\x05\x15\xf6\x1d\xdc\x4d\x6a\xfd\x82\xd2\x75\x71\xff\xc4\x0a\xc6\x7b\xd0\xcc\xcc\x57\x2f\xeb\x6c\x4e\x70\xe6\x17\x48\xed\x04\xd7\x8e\x8c\xec\xd4\xb4\x7a\x8a\xa7\x15\xb4\x44\x35\x05\xc0\x25\xdf\xea\x39\x82\x98\x75\x04\x3c\xc0\xb7\xb3\x18\xd1\x0a\x7e\x24\x09\xaf\x60\x90\xb5\x56\x33\xa9\x59\x61\xd3\x51\x1b\x0c\x9e\x9e\x99\x92\x01\xc7\x32\x24\x24\x22\x26\x88\x14\xe1\x82\x7f\xd6\x22\xbc\x7d\x4a\xa4\x38\x9c\x98\x86\xe2\xa1\x2a\x39\x62\x0d\x6d\x50\x82\xc6\xb8\xe0\x20\x87\x25\x0e\x72\x0d\x6d\x70\x0e\xd7\xae\xc4\xc0\xaa\x2e\x62\x55\x70\x03\x53\x58\xfd\x90\x89\x79\xcc\xa6\xf4\x4c\x5a\x75\x88\x21\xd4\xdd\x61\x2a\xa3\x58\xc3\x3e\x38\xfd\x41\xd7\x2d\x87\x5f\x01\xb3\xd9\x76\x03\xef\xa0\xc8\x98\x7a\x2b\xa4\xc9\x30\xc9\x25\x56\x18\x7e\xac\x48\x23\x5d\x45\x18\x36\x74\xb8\x2e\xc4\x12\x89\x8d\x50\x29\x67\x57\xe0\x0c\xd0\x36\x0d\xdf\x38\x2c\x2b\xc0\xe3\x32\x87\xbd\xaa\xd7\x85\x3d\xea\x7f\x56\x91\x64\xe6\xa5\x73\xbf\x82\x54\x89\x6f\x55\x5e\x55\x45\x9c\xdb\xf2\xa8\x42\xbb\xa4\x28\x35\x0f\x70\xd4\xbc\x90\x5e\x5a\x61\xa9\xd4\x69\xaf\x9b\x03\x58\x5b\xcf\x86\x8e\xdc\xcf\x39\xef\xa5\x02\x5e\x9f\x5d\xba\x28\x83\x9b\xf0\x01\x79\xa8\x1b\xcb\xcb\x5b\xbc\x52\xa6\xce\x38\x2a\x83\xed\x9c\x38\xae\x8e\xb0\xe9\x9e\x78\x16\x7b\xa8\xf9\x4a\x68\x2c\x5a\x7a\xbd\x0c\x96\x1f\x99\xfb\xe0\x16\x57\xf5\xe3\xcd\xce\x89\x58\xc0\x3f\x44\xbf\xc2\x6f\x8e\x71\x55\x35\x22\x6a\x99\x4a\x07\xba\xd2\xd8\x33\x31\xfc\x83\xea\x24\xac\xcf\xe8\xaf\x65\x0e\x71\xdc\x43\x78\x43\x9c\xba\x2a\x8a\xac\xec\xba\xb8\x27\x38\x50\x89\x3e\x89\xe5\x40\x90\x41\xbc\xee\x16\x23\x86\x67\x3e\x65\xb6\x20\x08\x7d\x2a\xaf\x77\xc0\x7c\x61\xde\x89\x43\x59\x3e\x91\x84\xb5\xa9\x00\x0b\xba\x8e\xe2\x2c\xa4\xb5\x3a\x03\x0c\x93\xac\xbe\xca\xd8\x33\x03\x3b\x71\xb2\x2b\x1f\xba\xb7\x5e\xb0\x04\xa1\x7e\x25\x99\xd6\x27\x4f\xe6\x93\x40\x01\xe7\xbb\x33\xe0\xec\x1b\xa7\x4a\x2b\x01\x76\x17\xf5\xcb\x1b\x3f\x67\x91\x65\x5d\xa7\x4e\x99\x96\x69\x1f\x50\xfa\x79\x3d\xb5\xf5\x2f\xa6\x2f\xc7\x1d\xe2\xe7\xcb\xef\xd9\x71\x75\x07\x81\xe7\x7e\x88\xae\x19\x97\xec\x4f\x56\x1a\x0a\xb8\xf4\x3a\xdc\x44\x76\xb9\xe0\x6f\xe2\x0b\xaa\x94\xa9\xd2\x48\x47\x28\xb2\xa3\xc3\x02\xdf\xb5\x4f\x8f\xc9\x8e\x52\x1a\x77\xef\x72\x64\x40\x4e\x37\x8e\x8e\x8c\x15\x9d\x1c\xac\xdc\x61\x8d\x27\x3b\xbb\x00\x1a\x86\x7b\xaa\x94\x64\x14\x79\x2b\xd4\xd4\x1b\x1c\xcd\xca\xe9\xf2\x0a\xe6\xa4\x9e\x35\xa0\x10\xc9\xc1\x20\xa1\x94\xe5\x36\xb4\x93\x5b\xd8\x37\x1c\xf5\xa8\x2c\x0e\x56\x55\xa4\x69\x8d\xf4\x7b\xf6\xea\x64\x50\x27\x9f\xef\xac\x9e\x82\x94\xcf\xcd\x3d\xf2\x6f\x85\xe5\x64\x7e\x56\xf0\xf7\x6c\xdb\xa6\x0b\xfb\xc8\x52\x16\x72\xe2\xa7\x97\xaf\x39\x27\x98\xab\xb7\x1a\x00\x74\x5a\x5d\x7b\x60\x37\x45\x0f\x8f\xbc\x61\x74\x24\xd7\x0e\x89\xf0\x91\x65\x79\xf6\xf0\xd5\xf2\x45\xf9\xf2\x45\x45\x57\xca\xc3\x56\x8a\x59\xed\xef\xad\xb8\x24\x99\xbb\x75\x96\x2d\x31\x18\x0d\x4f\xc5\xc8\x9a\xd6\x4d\xa0\x20\x72\x64\x5e\x8e\x82\x3c\xbb\xc5\x19\x3a\x50\x15\xf2\x48\xa3\x4a\x11\xec\xf8\x6c\xc0\x1e\x86\x68\x4b\x99\x26\x50\xe5\xa6\xac\xdf\x8f\x0d\x5b\xb5\x0a\xa3\x8b\x1b\xf1\xf0\x42\x92\xdf\xea\xcb\x9e\x12\x40\xc4\x9f\x85\xe9\xdf\x37\x60\xfa\x71\x19\xd3\x1f\x4c\x46\x93\x2c\x68\xb0\x39\x18\x28\x6d\x09\x89\xff\xe7\xda\x12\x92\x83\x57\x76\x41\x91\x57\x06\xf3\x54\xb2\x44\x56\xa6\xd7\x52\xf8\x44\xf9\xec\x9f\x3f\x3c\x66\x0c\x98\xb4\x05\x90\x29\x6e\x85\x2e\xd8\x6b\x2d\x5b\xcb\x3d\xc4\xb2\xc9\xc7\x27\x23\x46\x7c\x09\x44\x99\xad\xb3\xcb\xd4\x74\xfe\xf9\xc3\x23\xeb\x98\x29\x6e\x89\xf4\xcc\xac\x1a\xe1\xf4\x9f\x58\x79\xf6\xf9\x12\xb4\x5a\x1a\x4e\xc1\x9f\x1e\xb4\x1f\x38\x5b\x46\xb5\xdf\x2a\xf5\x42\x4f\xb5\x92\xfc\x3f\x47\x1f\x0e\x6d\xf0\x6b\x97\xb7\x1c\x64\x11\x26\xb4\xc2\x63\x88\x1b\x55\x25\x6b\xb8\xcc\x09\x44\xe8\xa6\xdc\xc9\xec\x43\xae\x5b\x29\x2a\xfd\xad\x74\xfd\xe7\x18\x68\x05\x27\xa8\x23\xa1\xd2\x2a\xab\x99\xb0\xf5\x59\x03\xf2\xc6\x48\xbd\x25\x3b\x22\xe5\x36\xec\x90\x54\x3b\x6a\x2f\x6b\x90\xb7\xc6\xf1\xfa\xce\x11\x57\x7c\x11\xc4\x98\x75\x23\xb6\x0d\xef\x98\x8a\xe7\x98\xdd\x5a\x4a\xfd\xa4\x90\x8d\x28\xfe\x5d\xc6\xe5\xef\x74\x3c\x08\x8e\x58\x2d\xed\xad\xc4\xd1\x75\x04\xee\x15\x62\xfc\x18\xe5\x93\x5b\x9e\xc3\x4c\xbc\x2d\x00\x4d\x58\x36\xad\x97\xd0\x65\x8f\x1f\x39\xdd\x97\x3b\xe9\xcf\x5c\xb4\x57\x3b\x09\xdb\xf3\xfd\x02\xfc\xc2\x00\x92\xf7\x15\xa3\x25\x96\xab\x00\x41\xfd\x23\xba\xcc\x7a\x08\xf2\x87\x4e\x87\x9d\x47\xd3\x42\x47\x76\x39\x67\x0b\xd5\xcb\xa0\xfb\x17\x01\x51\x21\xd8\x73\x8d\x4c\x50\x3d\xd9\x88\x9e\xf0\x24\x99\x2f\xc8\xa6\xda\x1f\x4e\x79\x16\x5e\xc4\x45\x9b\xac\x6b\xd8\xe6\x92\x0b\xb7\x11\xb0\x03\x54\x65\x4b\x5c\x41\x71\xf9\x02\x55\x99\x75\x97\x4b\x76\x35\xce\x61\x29\x30\x79\x32\x9f\x52\x05\x71\x0b\xea\x15\xb9\x06\x88\x2d\x39\xe6\x31\xe2\x4a\xf1\x42\x91\xc3\xe0\x67\x89\x52\xd8\x29\x49\xc2\x72\xc2\xa8\x28\x99\xfb\xac\x61\x15\xb4\x38\x63\x40\x35\x6f\xe2\x6a\x66\x84\x09\x93\xa1\x5c\x6b\xbb\xa8\x64\x84\x3c\x55\x1d\x24\xac\xbe\xfd\xe6\x7c\x91\x56\x83\xaa\x36\x68\x88\x44\xcc\x0d\xd7\x81\xf7\x07\x5b\xb6\x38\x73\xa2\x65\x78\x1f\xb4\xb4\x0e\xef\x68\x2d\x67\xb9\x14\x89\x61\xeb\xba\x54\x6b\x57\xc3\x69\xe3\x39\x8b\x52\x19\x68\x31\x53\x9c\xc2\xac\x81\xa8\x01\xce\xa0\xda\xf1\x51\x75\x44\xe2\x46\x8d\xd4\x7c\x16\x73\xd4\x50\xc9\x5c\x22\xf8\x8b\xdc\xd9\x8d\x64\x1b\x55\xd8\x4a\x45\x58\xc6\x69\xa4\x18\xb5\x72\xc7\x2b\x42\xbd\xe1\xb0\x4e\x2b\x1e\x39\xa8\x37\x6b\x3a\xd0\x73\xb6\xb0\xbd\xdc\xf0\x96\xa5\xd9\x61\xac\x0b\x75\xab\x35\x8b\x9d\x52\x1c\x89\x12\x03\xec\x38\xcb\x0b\xd4\xd8\xa7\x65\x27\x0b\x47\x95\x44\xf3\x93\xc1\xaa\x67\x46\x91\x71\xb1\xcd\x30\x99\x2f\x70\xaa\xf6\x3b\x45\x48\x3a\x18\x8c\x71\x09\xb0\x85\x38\x25\xc0\xee\x7a\xd6\xdd\x7b\x77\x8c\xd5\x29\x01\x57\xdb\x54\xf7\x6b\x40\x1f\x95\xc2\x67\xe6\x3c\x2f\x66\xbc\xf5\x2c\x04\x26\xe3\xf8\x57\xf9\xe7\xd2\x6c\xa1\xa2\x6a\xac\xbd\x7c\xf5\xeb\xc7\x57\x57\x97\x9f\x5e\xbd\x6c\xb7\x3e\x7e\xfb\xe5\xba\x75\xef\xc4\x2d\xd1\x0e\x0f\x45\x53\xad\x65\xde\x56\x2b\x2e\x1a\x93\x37\x76\x6b\xa3\x9a\x6b\xdd\xb2\x8d\x73\xe7\x85\x51\xeb\xf6\xa1\xe5\x86\x4b\xd6\x72\xf8\xff\xc7\xde\xbb\xb7\xb7\x6d\x6b\xf9\xc2\x5f\xc5\xd6\xf4\xd1\x21\x6b\xda\x21\xa9\xbb\x1c\x46\x93\x26\xbd\xed\x34\x6d\xde\xba\xcd\x9c\x6e\x49\xf5\x06\x09\x50\x62\x23\x93\xde\x14\x95\xc4\xb5\xf4\xdd\xdf\x07\xbf\x05\x92\x20\x45\xc9\x4e\xa7\x7b\xe6\x9c\x33\xfd\xc3\xb0\x48\xe2\x8e\x85\x75\xc7\xc2\xf8\x64\x16\xb7\xce\xb2\x8b\x75\xc6\x82\x77\x8a\x59\x8d\xda\xed\xbc\xf5\x55\xb2\x30\x5a\xb2\xc1\xf1\xc9\x17\x2c\x78\x27\x9b\x63\x27\x3e\xae\x00\x51\x95\xe7\x75\x5e\x9c\xfc\xb4\x64\xf1\xbb\x93\xbb\x64\x73\x71\xf2\xb4\xd3\x32\x2f\x23\x2f\xdb\x59\x8b\x47\xcf\x45\x31\xc9\x91\xe4\x91\x86\xbd\x4e\xf7\x71\xd6\xd5\x6f\x7f\x69\x58\xa8\xd5\xce\x7a\xb9\x6e\x64\x9e\xac\xb0\xc9\x05\x35\x39\x70\x22\x43\x19\x60\x11\x3e\x7f\xd0\xed\x76\x73\xae\x61\xa5\x69\xb6\x0f\x18\x55\x15\x2f\x45\x3b\xdb\xcb\x6a\x4a\x22\x7a\x4d\x8e\x39\x77\xdf\x37\x6b\x89\x2a\x79\xbe\xfc\x14\x35\x51\xa5\xe4\x8b\xa3\x7a\x22\xa5\x7c\x59\x57\x06\x54\xe9\xd6\x61\xad\x56\xb5\x67\x87\x55\x5b\xbb\x7a\x47\x8e\x29\xb3\x76\x7b\x01\x5b\x10\xeb\xab\x46\x41\x2a\xca\xd9\xf8\xe2\x6e\x92\xe9\x6e\xf5\x90\x6f\xd9\xc5\x5a\x0a\xa7\xf0\xd3\xb7\x7a\x6e\xb7\xfb\x40\x14\xce\x23\x3e\xd7\xeb\x9d\xf5\xfd\x83\x50\x53\x3a\x2e\x6b\x50\xa3\x29\xdd\x7b\x4e\xc7\x1e\x14\x6c\xa7\x66\x95\x6f\x70\x3c\xa8\x6a\xd5\x95\x0d\xad\x62\x28\xf9\x8a\x05\x08\xd5\x90\x2b\x1b\x52\x11\xbe\x48\x36\x71\x96\xc7\x2e\xbb\x8e\xd6\xf9\x7c\x7b\x52\xc8\xa9\x18\x8d\x6a\x47\xb6\xae\xa8\x4a\xc3\xac\x1e\x15\xd0\xbf\xd4\x1c\x3b\x54\x27\xf2\xf8\x89\xa7\x59\xc5\x30\x62\xea\x67\x8b\xc8\xaa\xb3\xdf\xf3\xc2\x93\x2d\xcf\x24\x09\x57\x4c\x8d\x81\x01\xf6\x0a\x49\x2b\xa6\x13\x7a\x97\xe5\x59\x1f\xa3\x61\x8c\xd6\x7e\x09\xe0\x53\x76\xf1\x41\xd3\xbd\xef\x5b\xc3\x4a\x3f\x82\xca\x5c\x58\x85\x52\xae\x38\x93\x66\xec\xd7\x0f\xae\xd8\x2b\x2d\xa8\x52\xb8\xc8\x97\xa2\xf4\xa4\xb1\xad\xd5\xc5\x47\xd3\xc8\xcf\x37\x28\x12\x9d\x78\x7a\x50\x8c\xcc\x5b\x6b\x37\x28\xa8\x60\x2f\xc5\xe9\x29\x75\x5d\x20\xcc\xcf\x56\xb1\xd8\xf9\x6b\xdb\xfa\x90\x46\x99\xba\x80\x6a\x67\xe5\x33\xaa\x97\xaa\xe5\x28\xc7\x70\x24\x53\x29\x3e\xa8\x3c\x99\x76\xe8\x67\x67\x69\xd3\xaf\x65\x28\x5f\x56\x6b\x2b\xe7\xb6\xcc\x5c\xbe\xdb\x59\xaa\x47\xe5\x47\xf5\x62\x67\xd5\x47\x2b\x99\x03\x7a\xb3\xdb\x69\x92\x5c\xa0\xa1\xb0\x5f\xf6\x54\xc8\x75\x5f\x17\x55\x3b\x2c\x15\xa2\x8e\x79\xaf\x6b\xca\x15\x32\xdd\x17\xe8\x6c\x0f\xdf\x6a\x95\x55\x81\xb2\x41\xdc\x2b\xeb\xd3\x6d\xba\x0d\x3a\x88\x7c\x07\x68\x95\x5f\x12\xb7\xb0\x37\x00\xb9\x76\x45\xb0\xfb\xac\xb2\x67\xb2\x2a\x6a\x28\xb7\xa4\xd2\x4e\xec\x41\x33\x8c\xda\x75\x9d\xc5\xce\x1a\xd9\x83\x86\x8b\x78\x9a\x10\x28\xfb\xad\x01\x55\xde\x56\xb4\x16\xdd\x61\x5f\xdd\x32\xa1\x14\x18\xac\x20\xbb\x7b\x04\x96\xd5\xe8\x11\xac\x01\x91\x15\x1f\xa2\x4b\xa2\x46\x97\x0a\x3f\xae\xc7\x50\xa6\x26\x2a\xa6\x93\xa6\x3a\xf2\x66\x4d\xde\xd3\x07\x38\x00\xe5\x4a\xb2\xc9\x44\x7e\xae\x4d\x7b\xf3\xad\x64\x97\x73\xb5\x3e\x78\x67\xcf\x7e\x98\x65\xa8\x56\x68\x65\xf5\x0a\xb5\xea\xce\xce\xd4\x69\x93\x47\x30\x19\x96\xa6\x0b\xfa\x43\x9c\xc6\xc1\xf2\xbb\xe2\xe8\x2a\xb8\x29\x9c\x11\x21\x6a\x79\x59\x0d\x99\x46\x6b\x9c\x4b\xa5\xf2\xc9\x24\x46\x20\xae\x8b\x92\x15\x2b\xed\xc5\xdd\xa4\x82\xda\x95\xa2\x7b\x2d\xb9\x00\x23\x36\xd1\xfc\x06\x77\x2b\xf5\x01\x6b\xd8\x32\x4b\xef\x5e\x8b\xa4\x75\xab\x4e\xc2\x41\x9e\xb6\xd2\xcb\x02\x85\x47\x52\xb6\xcf\xa6\xb9\x3e\xec\xdc\xc1\x6d\x96\xa9\x97\x5d\xdc\x26\xb7\x92\x9a\x35\x9d\xa8\xd0\xb3\x23\x00\x62\x91\x5b\x3f\x2c\xd7\x6e\x43\x77\xf0\x4e\xd6\x6f\xa3\xda\x8c\x82\x52\x5b\x38\x1a\x11\x9b\x72\x0a\xcc\x0b\x78\xb9\x91\x07\xbb\x30\xcd\x66\x9f\x6f\xb5\x2e\xa9\x58\x6f\x56\xd9\x95\x8a\x14\xe4\x65\x3b\x52\x89\xe8\x27\x8c\x6a\x24\x70\x91\x7b\xc5\x57\x8b\x9a\x05\xd4\x2f\x0a\xa8\x5f\x3d\x84\x5c\x6b\xad\x2b\x40\x67\x08\xe6\x92\x33\x28\xc0\xe5\xa5\x7f\x60\x79\x7b\x92\x7c\x57\x03\x7d\xca\x9b\xeb\x41\xf6\x0a\xe4\x6e\x4a\x15\xf0\xac\xe0\x50\x2d\xb3\xe6\x53\x26\xd1\x29\xbc\x3b\xcc\x23\x9b\x9e\x8c\x21\xfa\x00\xd4\x70\xb2\xe4\x47\xb1\xbe\x4d\x62\xee\x89\xc2\x21\x2d\xf5\xec\xcb\xf4\xa9\xb8\x4c\xcf\xce\xa8\x4e\xc9\x76\xe4\x16\xf7\x69\x3a\xcf\x0f\x84\x60\x5a\xf7\x71\x4f\x11\x72\x93\x5a\x3a\xf7\x1c\xf3\xb8\x2f\x50\x1d\x31\x96\x66\x7a\x6d\xde\xac\xd8\xab\x76\x78\x12\x4d\xd3\xb9\xe7\x79\xcb\xc9\xf9\x79\xf5\xcb\xb8\xf6\x68\x5f\x46\x74\x1f\x9f\x9c\xa6\x38\xe7\x80\xaa\xcb\xab\x94\x08\x59\x7a\xf7\x63\xe5\xbd\x11\x99\x7b\xee\x19\x84\xa2\xa3\xdc\x91\xcf\x84\x2f\x71\xbd\x5c\xbe\xf9\xc8\x6a\xe0\x35\x34\x79\xc1\x6e\x6f\x57\x77\xb9\x47\x44\x69\x1b\xd1\x4f\xf4\x1c\xc0\xf9\xa9\xb9\x3b\x48\x37\xa4\x9c\x30\xb4\x07\x8f\x93\x13\x7e\x7f\xe8\x6c\xa6\x3a\xf0\x06\x81\xa0\xe3\x0e\x5d\x0d\xc5\xb1\xca\x69\x5b\xec\xfd\xbf\x99\x86\x63\x92\xfe\x31\x09\x4d\xfa\x0e\xc1\x65\xe4\x3c\xd2\x2d\xe8\xcb\x46\x85\x85\xf5\xe0\x19\x52\x85\x7f\x73\x6d\x86\x72\xe1\x33\x32\xd2\xba\x14\x8e\x12\x7a\xef\x35\x11\x62\xd2\x70\x30\x38\xaf\x42\xc8\x2a\x8a\x03\x39\x92\xd7\x15\x7a\x8d\xe6\xce\xc8\xcc\x71\xbc\xdb\x59\x9d\xde\xe0\x91\x0e\x68\x2f\x1f\x12\xc3\x34\x97\x69\x8d\xb7\x18\x0e\x6d\x5b\x5d\x9d\xa9\xec\x24\x6b\x2f\x35\x46\xdd\xae\xad\x2f\x4b\xa2\x96\x25\x0a\x0d\x1d\x3b\x6b\x8a\xaf\xa9\x5d\x6a\x7a\xdf\x49\xa2\x52\x5c\x6e\x68\x08\x4b\xb2\x4f\xb9\xba\x7a\x25\x89\x85\x30\xdb\x6d\x65\x8a\x58\x88\xec\x4d\xce\xdc\xff\x20\xd1\xb7\xe7\xe5\x56\x8a\xd2\x30\x51\xe0\x2c\xf5\xe5\x9d\xb8\x5b\xeb\x37\x64\x1a\x64\x57\xc9\xbc\x67\x62\x9a\xcd\x71\x29\x2d\x9c\x97\x1e\xa0\x3b\x5a\xff\x89\xf8\x68\x15\x7a\x47\xc8\x10\x1d\xe1\xce\x68\x5c\x17\x38\x24\x0e\xb1\xfa\x67\x13\x5d\x50\x30\x5a\x84\x60\x08\x0c\x95\x75\x2f\x6e\x6a\x0d\x2c\xd2\x42\xe6\x89\xf6\x50\x71\x64\xea\x7b\x38\xd5\xf1\xb0\x0e\xa0\xb8\x7d\xcc\x88\xcc\xfc\x60\x80\xb5\x52\x87\x03\xe4\x73\xe2\xd9\x97\xc9\xd3\xe8\x32\x39\x3b\xcb\x87\x1e\x78\x86\x6d\xad\x2f\x5e\xca\x91\x25\x73\x2a\xc6\xbd\x53\xe7\x32\x05\x86\x0e\x34\x5a\x78\x2f\xb1\xc1\x38\xf3\x9e\xdd\xf3\xed\xd6\x80\xe2\x70\x75\x76\x66\x5a\xf1\x34\x99\x7b\x99\x3a\x43\x2d\xbf\xa7\xa5\xeb\x4e\xde\xcb\x31\xe4\x39\x76\x76\x66\x19\x4c\x0e\x66\xbb\x3d\x85\x30\x0c\x65\x6b\xbb\xad\x0e\xcb\x88\x89\xd0\xd5\x9b\x88\x10\x60\x64\x53\x31\xf7\x62\x49\x22\x32\xd3\xba\xdf\x99\xe3\xd8\xb4\xf4\xe1\x9b\xbb\x1d\xfe\x24\x2b\x2e\xc1\xf6\x0f\xef\x96\xcd\x81\xdd\xa2\x38\xb2\x9a\xd2\x42\x0b\x3e\x32\xea\xda\xc3\x81\x3a\x60\x60\x77\x06\x03\xe2\xde\xba\x5d\x7b\xe0\xd2\x09\xdf\xfe\xa8\x3b\x1c\x69\xdb\x69\x53\xe5\x37\x26\x7b\x11\x09\xc9\x1e\x44\x1b\xae\xe9\xc6\x84\xe6\x43\xaa\x88\x60\x20\x51\x47\x0e\x2a\xd5\x7a\x8f\x00\x9b\xd2\x06\x94\x5e\x6b\x72\xed\x45\x15\x43\xdd\xe7\x60\x96\xa9\x48\x09\x97\x94\x2d\xae\x83\x08\x94\xb7\x4d\x35\x14\x47\xa2\x4c\x53\x3f\x71\xdf\x9c\xb5\xf0\x63\xab\x9e\xa9\x3f\x90\xbb\x82\x3c\x25\x3c\x98\xa6\x15\xed\x28\xb2\x49\x8e\x79\x82\x8b\xcc\xfc\x57\x4d\x0e\x82\x37\xc7\x72\xf7\x37\xf7\xf0\xbe\x18\xbb\xf5\x98\x11\x20\xcc\xe5\xa1\xba\x2a\x73\x63\x36\x0c\x94\x93\xf3\x89\x59\x10\xd1\xf5\x45\x6a\x16\x19\x3e\x01\x9e\x92\x8b\xe5\xdf\x01\x50\xdb\xed\x5e\x84\xf6\xac\x79\x1e\xc9\xc8\xb6\x1f\x6f\x3f\xa3\x9b\xbb\x4f\x02\x16\xc7\x49\x76\xe2\x0b\x98\x5a\xca\xf0\x0f\xc7\x26\x1e\x67\x2e\xaa\xd3\x8f\x39\x8d\x1b\xbb\x1d\x5f\x50\xce\x76\x3b\xff\x65\xe0\x06\xef\xc6\x65\x91\xd0\x8c\x51\x1a\x0d\x39\x34\x14\x11\x85\x46\xba\x6f\x6f\x3e\xc9\x2c\xe2\xc5\x8a\xa0\x40\xb4\xca\xe6\x65\xe6\xa5\xc4\x63\x5a\xc2\x4b\x2f\x78\x12\x8b\x3d\x6f\x0e\x85\xc7\x69\x2d\x23\x73\x27\x26\x3a\x10\x8c\x8d\x12\x62\x48\x3b\x97\xf7\x8a\xc0\x43\x5f\x76\xed\xe8\x77\x79\xfd\x70\x6e\x53\xce\xda\xed\x7c\xc5\xb6\x5b\xfd\x46\xe2\xca\xad\xac\x2a\x6e\x42\x35\xea\xcb\xdd\x24\x1b\xe7\xeb\x02\xfa\x07\xb5\x31\x78\x2f\x29\x25\x3e\x0a\xd1\xc6\x8d\x36\x88\x03\x6c\x49\xcf\x76\x94\xa3\x06\xa1\xd4\xbd\xa0\xeb\x05\xc6\x04\xb9\x55\x40\x5d\xed\xe3\xdb\xbc\x8f\xe0\x32\x1f\xd5\xc7\x24\x7c\xa8\x93\xba\x5e\x06\x02\xf2\x81\x4e\x6a\x02\xb2\x57\xe1\x34\x6a\xc2\xb2\x30\x27\x86\x62\x39\x2c\x7d\x28\x90\xca\x63\x88\xb5\x72\x08\x08\x07\xf1\xa8\x21\x5c\x3f\x74\xfc\xa0\xae\x4b\x68\x46\x7b\x62\x92\x4a\x56\xb4\x80\x35\x66\xd9\xd6\xbd\xa2\xeb\x56\xe9\xac\x3f\x4e\x77\xe6\x58\xc8\x9c\xa5\xb7\xb1\xc6\x04\x37\x95\x10\x3b\xf3\xbe\xcc\x2e\x41\xa8\x63\x3f\xce\xdc\xd8\x14\xc1\xbf\x32\x34\x58\xc4\xaa\x43\x2b\x32\xea\x61\x76\xf4\xc8\x5d\x0c\x98\xd8\x13\xa4\x39\x28\xfd\xb5\xd3\x8b\x80\x6d\x16\xcb\xcc\x2b\x0e\x3f\xb2\x46\x2d\xc2\xfa\x13\xf4\x07\xab\x5c\x7f\x90\x17\x52\x7a\x56\x34\x54\x6a\x11\x74\xcb\xd9\xcb\xf5\x61\xe5\x59\x81\x10\x6a\x4a\x04\xd5\xf1\xf4\xb8\x37\xa8\x8a\x0c\x94\xde\xdd\xab\x63\xa6\xeb\x42\xb8\xac\x74\xab\x0c\x5b\xa5\xa3\x2b\x15\x6b\x45\x45\x7d\xda\xed\xa9\x70\x75\x7f\xea\x9a\xdc\xf4\xed\x2f\xca\x6b\xa5\x90\xfe\xe3\x32\x26\x0f\xf6\x45\x98\x99\x46\x6a\xc5\xe6\x25\x3b\x85\x48\x5d\x64\x64\x4a\xd1\xda\xed\x37\x5c\x33\xdd\x04\x32\xfe\x43\x20\xe3\x8c\x06\x83\xce\xa1\xdd\x80\xce\xfc\xbe\xc0\x8e\x84\x3d\xde\xea\x38\xfd\xce\xe3\xf6\x61\x53\xcb\xab\x03\x26\x54\x8a\xe2\x53\xcc\x41\x2c\x3e\x18\x79\x3c\x9f\x8b\xf7\xa6\x11\x5f\x24\x75\x04\xe8\xb1\xa2\xd2\x54\xf2\x01\x85\xda\x8b\xae\x7e\xc8\x15\x5f\x7b\xc0\x93\xeb\x6e\x37\x38\x67\xbe\x17\x79\xc7\x13\x0f\x03\x71\x52\x84\x86\xa0\x4a\x6a\x55\x94\x60\x9c\x1c\x36\x00\x37\x41\x71\xde\xa7\x7a\x85\xb9\xc6\x97\x0b\x3f\xd9\xc4\x81\xe0\xba\x1b\x8a\xe6\x73\xb5\x62\xeb\xac\x7e\xa6\xa6\x08\x7c\x73\xea\xd4\xd4\x65\xc1\x4a\xb0\xf4\xa5\xaa\x32\x57\x43\x97\x55\x64\xf5\xf2\x4a\x23\x57\x98\xc8\x9a\x7b\x53\xed\x79\x89\x3d\x83\xfd\x19\x33\x1b\x8f\x2e\xa8\x4a\xa1\xad\xda\x3f\xb7\xa7\xab\xb5\x6a\x79\xb5\x33\x5e\x0d\x03\xcb\xc7\x91\xbb\x6e\x16\x03\xad\xba\x6c\x3e\x30\x85\xfb\xfd\x29\xce\xe6\xd6\x5a\xad\x6a\x16\x1b\xe7\xea\xb2\xe4\x4a\x72\x8d\x99\xf2\xa1\xa9\xfb\x83\x3e\xb4\xfc\xba\x39\x3c\xa0\x98\xfd\xb5\xc9\x91\x28\xa3\xf1\x26\xf5\xa6\x8d\xcb\x1f\x3c\xbf\x47\x46\x18\x1d\x65\x50\x3f\x8a\x1d\x23\xe9\x61\xb1\x23\x19\x1d\xc1\x39\x42\x42\x94\x57\x96\x82\xbc\x4f\x20\x23\x7a\xc1\x66\xf2\xb1\xb7\xef\xf6\xcf\xb3\x6b\x6d\x8b\xfc\x58\xca\x97\x37\xb7\xd9\x9d\x77\x5a\x37\xaf\x14\x1f\x8e\x80\xc2\x1e\x50\xab\x42\x0d\x4a\xda\x32\x9e\x54\x65\x20\x47\xc1\x7e\xb7\xb3\x86\x83\xde\x23\x7d\x83\x3f\xfe\x81\xa5\xd4\xe6\xbd\x8a\x59\x59\x05\xb3\xb2\x03\x98\x55\x76\x95\xa5\x05\x02\x79\x27\xee\x4a\x15\xff\x27\xac\xac\xaa\x66\xaf\x92\x47\xae\xf2\x3e\x76\xd5\x3b\x52\x46\x05\x7b\x25\xb0\x98\x0d\xb2\x93\xc8\xb7\x65\x3e\x20\x41\xc7\xc8\x58\x5a\x0d\xc2\x96\x79\x9e\x27\x4a\x30\x29\x95\xd2\x84\x68\xb4\x66\x11\xd2\x08\x8e\x7f\x5e\x3a\x49\x11\x34\x6b\x4f\x12\x3a\xa0\x90\x8e\xe0\x6b\x78\x92\x7a\xa7\xce\xa5\x16\xd3\xf6\x95\xb8\x33\xcb\xa6\x54\xef\xca\x53\x5a\x9e\x02\xae\x77\xe2\xae\x3c\x1d\xf0\x98\xb6\xca\xe3\x08\xf9\x14\xd9\x97\x69\xee\x50\xf1\x4e\xdc\x79\xfb\x67\x17\x0b\x7d\x86\x04\xd0\x6e\xaf\xfb\x48\x26\x61\xf9\x9f\x03\xd0\xa2\x70\xa9\xd7\x6f\x00\xd8\x07\x20\xf6\x36\x15\x3c\x0a\xb4\x38\x7c\x32\x79\x9e\x2e\x3e\x09\x5e\x8b\x4a\x2a\x55\xfc\x61\x68\x2d\xfb\x54\xad\x30\x07\xdd\x80\x6c\xf5\x4d\x70\xa7\x8c\x21\x45\x0d\xda\x89\x0a\x55\x89\x95\x69\x95\x9c\x9d\x7d\xb2\x6d\xa4\xe9\xec\x79\x41\x08\x77\x56\x7f\x38\x7a\xa4\x17\x40\x13\x7a\x62\x07\x58\x44\x75\x68\xbc\xd1\xc0\x50\xa5\x37\x2b\x8d\xde\xac\x9a\x3d\xf7\xd9\x6a\xe5\xb3\xe0\xdd\x63\x68\xcd\xba\x94\x06\xa8\x90\x79\xc0\x1f\xee\x01\x3a\x03\x36\x1f\x11\xa5\x3f\xc0\x30\x8b\x80\x98\x76\xf7\x71\x13\xf5\xe6\xa1\xd3\xdc\x4e\xa7\xeb\xd8\xea\x34\xb7\xdc\x7c\x2a\x22\x66\xcf\xed\x0d\x48\x47\x0b\xf2\x4f\x3a\xda\x6e\xb7\x2f\x33\x24\x65\xac\xe8\xba\x2e\x3e\x17\x0f\xeb\x27\xaa\x9f\x79\x6e\x61\x16\xf0\x9e\x05\xa4\xee\xcf\x26\x10\xd4\x97\x45\x20\xdb\x4c\xfe\xb7\x02\xd3\x1c\x27\x17\x77\x24\xd3\xff\xd3\x34\x1c\xd3\x4a\x27\x30\x7a\x70\x53\x39\xdf\xad\x2f\x7e\x32\xa1\x7b\x22\xb1\xe8\x15\x74\x15\xb0\xc2\x3c\x6a\x52\x7e\xfe\xf3\x70\x47\xc5\x40\xd2\x78\xc5\x6a\xa9\x4d\x6a\xe5\xb3\x92\x6b\x8f\x58\x51\xd5\xc5\xc9\xf3\x54\x9c\xdc\x25\x9b\x93\x55\x92\xbc\x8b\xe2\x05\xee\xd3\xfc\xc7\x0d\xbb\xfd\x29\x31\xcc\x7f\x4c\x5a\x9a\x70\xfd\xe9\x58\x2a\xd1\x63\x1f\xfc\x31\x1c\x85\x2a\xfe\x2c\x0c\x45\xfd\x11\x15\x84\x54\x43\x56\x74\x86\xfb\x28\x96\x4a\xe8\x14\xce\x9f\x8d\xa3\x8e\xd9\x6f\x61\x69\x7d\x14\x88\xfd\xed\x21\x04\x45\xd2\x73\x1e\x5b\xb7\xb2\x97\xd8\x91\x98\x77\x7b\xf2\x75\x7c\x71\x07\x4b\x9d\x85\x0a\x1f\x67\x5b\x5e\x3c\x24\x60\x2b\x83\x66\x5c\x58\x31\xc9\xcc\x59\xd3\x11\xad\x54\x38\xc7\x87\xfa\xda\xc4\x23\x4d\x98\xf7\x8c\x11\x1a\x58\x19\x46\x6a\x31\xd3\x7b\x06\x6c\xf0\xd2\x34\x32\x3c\x97\x36\xc1\xe8\xe2\x67\x44\x65\x8e\x10\xcf\x39\xb5\x32\x8b\x59\x91\x69\x9a\x56\x6a\x9a\x63\xa3\x15\xa3\xf9\x2a\xff\x95\x7a\xc2\xb4\xaa\xc8\x1d\x8e\x3e\xe6\x61\xf9\xfe\xc8\x30\x9a\xb6\x51\x90\xc4\xea\x62\xb1\x4f\x92\xfc\x2b\x3b\xa9\xac\xa3\x49\xf4\x67\x8d\x1a\xac\x23\xdd\x7c\x60\x9b\x15\xfd\x2d\x99\xd8\xdc\x3b\xa4\x3c\x8b\x46\x21\xd4\x0a\xbf\x99\xaa\x53\x4d\xb3\xe7\x18\xe5\x79\x5a\x6b\xa5\xf4\xdb\x50\x8e\xde\x63\xad\xfe\xd2\xa5\xa6\xfc\xae\xb6\x78\x4e\x41\xca\x06\xcf\xce\x1a\xf6\xbd\xd1\x78\xb8\xf3\xd8\xd6\x8e\xd4\xd6\xa6\xee\x2a\x87\xb5\x8b\xeb\x28\x8e\x45\x7a\x85\x03\xb6\xbb\xf2\xa1\x16\xec\x8b\x15\x9a\xb7\x3c\xb0\x9c\x56\xbf\xb2\xf2\x8a\x5c\x0b\x15\x79\xa0\x5c\x61\x96\x9b\x8b\x4e\x71\x3d\x2d\xe5\x8a\x1a\xc4\xbc\xea\x42\xd8\xf0\x86\xd1\xba\xda\x6e\x17\x2f\xd4\xec\xe5\xf6\xf4\x23\xd2\x5e\x93\x7b\xdc\x27\xf9\xdd\xbf\x38\xe0\xeb\x44\x5d\xb8\xd4\xfa\x77\x7e\x5e\xde\x10\xaf\x6e\x4a\x56\x00\x92\x87\x8d\x34\xc7\x7b\x43\xda\x1b\xf8\x71\x4f\xa4\xdd\xce\x82\x83\xfb\xbf\x4a\x76\xdd\xa7\xed\xfa\x69\xa1\x9a\x42\xe2\xa8\x46\x42\x77\x9c\xd5\x99\xc4\x5c\xd2\x2a\xbe\x16\x42\x5d\x5a\xfa\xd0\x9e\x9d\x5d\xea\x76\xbb\x15\xa0\xdc\x8a\x3d\x1d\x9d\x44\x5a\x5c\x94\x22\x94\x48\x74\xa1\x39\xda\xa6\x17\x85\xaf\xbb\x69\xc5\x7f\x48\xb7\x51\xf3\x5f\x6e\x3a\xc3\xac\x0f\x45\x3b\x68\x5f\x9e\x0e\x94\x9b\xd1\xd0\x6b\x2b\xb4\x4e\x97\x7b\x6d\xd4\x5d\x8c\xf3\x09\xc1\xc1\xaf\xa7\x9e\xfd\x88\x3a\xa5\x74\xab\x79\x23\x8b\x73\xc7\x12\xcf\x9c\x47\x14\xac\x0c\x27\x0f\x20\xbc\x8c\xd6\x56\x54\x77\x76\x6e\x28\x6e\x45\xed\xb6\x71\x9a\x6e\xb7\x11\x4e\xec\x35\x5c\xab\xb0\xb3\x3a\xa3\x41\xff\x71\x5e\x5f\x3f\x3c\xc4\x35\xc0\x81\x2c\xe7\x1a\x86\xfd\x51\x83\xd7\x57\xe9\x4d\xd4\x68\x3a\x8b\xeb\xa6\xb3\x14\x84\x37\x82\xb9\x1b\x57\x40\xc0\x2a\x55\xbe\xc2\x01\x97\x6e\xc7\x79\xe4\xa5\x02\x4d\x87\xca\xff\x28\x6f\x71\x94\x81\x80\x8a\xe9\x3f\xc7\x40\x98\xca\x00\xa7\xf3\x08\x87\x18\x84\x3a\x17\xf0\xe9\x34\xff\xb1\x34\xfe\x01\x42\xbe\x47\x84\xff\x8b\xe8\xe6\xc3\x94\x52\x35\x4d\x1f\x4a\x6d\xf5\xbe\xcb\xff\x65\xc5\x8a\x58\xd2\xd6\x68\x9f\xb6\x92\x3f\x41\x1e\xc3\x7b\xaf\x72\x9d\xd4\x1e\xcc\x44\xe7\x43\xa3\xd2\x02\xb1\x97\xa3\xc1\xb7\xf7\x7e\x2f\x53\x81\xe5\xd4\x81\x24\xe5\xc9\xd0\x6e\xef\x1d\xb8\x78\x28\x62\x52\xa1\xdf\xdd\x1b\x8e\xba\xf8\xbf\xf9\x44\xdb\xa1\xec\xb5\x88\x48\x0d\x1d\x7a\x2c\xe9\x97\x62\x84\x94\xfc\x1f\xb5\xd3\xff\xf9\x09\x66\xba\x81\x63\x0f\x69\xa3\xd3\x9d\x0d\x95\x8d\xae\x6b\x63\xc0\x28\x90\x67\x42\x60\x1a\xe6\xf8\xb1\x9b\x33\xd7\x6d\x66\x49\xc6\x56\x85\xa8\x2b\x1f\x9e\xda\x95\x5b\xb9\xfe\xe3\x13\x36\x2e\xca\x3f\xd2\x2a\x57\xdf\xb5\xd4\x11\x71\x40\xe9\x56\xd9\x32\xc8\x6a\xa5\xde\xd9\x59\x99\xf9\x32\x7d\xea\x15\x8a\xe4\x86\xa5\xb2\x52\xcf\x6b\xce\x70\x14\x0c\x95\x96\xb5\x3f\x78\xa4\x18\xfb\xe3\x7f\xc6\x6f\xe0\x53\x8d\x39\x14\x47\x5e\xa4\xfb\x7c\x93\x42\x15\x2b\x04\x0b\x2d\x0d\xdd\x95\x52\x56\x61\x22\x4f\xcd\xd2\x23\xaa\xdd\x3e\x4d\x2f\xd6\x42\xc4\x30\x90\x4c\x8c\x54\x59\xcd\x2d\x7d\xd1\xa5\x1c\x99\x3e\xc6\x85\x60\xdf\x7d\x40\x55\xec\x9d\x3a\xfa\x1e\x2b\x1c\x1c\x8a\xcf\x76\x69\x9c\xa8\x6c\xc9\x17\xd5\x9b\x6e\x46\x9d\xce\x23\x6d\x6d\x8f\x34\x92\x57\x99\x5c\x9c\x50\xd1\x62\xb8\xd4\x45\xf9\x7d\x36\xb8\xa4\x11\x51\xcd\x52\x6e\x69\x16\x95\x46\x4f\x0b\x5a\x1d\xf1\x31\xfb\x21\xfd\x41\xc5\xc1\xcc\x37\x26\x85\x19\x13\xd5\x39\xf1\xd2\x4f\xd8\x9a\xd5\x7a\xb5\x5a\xab\x75\x3e\xda\xa4\x6e\x45\xf5\xb5\xbd\xce\xd8\xed\xf7\x08\xc2\x53\x3e\xab\x70\xd1\xe5\x8b\xe2\x2c\xde\x5e\xa6\x74\xbb\x6d\xca\x17\xc9\xd7\x79\xc0\x11\xb0\x61\x4b\x3d\xe0\x4f\x96\xc7\x94\x2e\x9b\x17\xe6\x58\xe8\x87\x43\x91\x4f\xd4\x33\x61\x42\x2a\x4d\x52\x37\x94\xbb\x50\x73\x67\x4a\x7f\xf9\xed\x36\xd6\x03\x0d\xa6\x77\xf7\x95\xfa\x9b\x62\x2b\x1d\x72\x6f\x39\xc0\x46\x88\x43\x9a\xb5\xea\xc9\x74\xbd\xe5\x5a\xf8\xa0\x3f\xb5\xe9\xe6\xd3\x96\x7a\xeb\x2f\x8e\xc4\x03\x53\xcd\x67\x8f\x6a\x3e\x2b\xaf\x11\x3c\x2e\xe1\x42\xbd\xfe\xa8\xcd\xff\xd3\x83\xda\xc5\x52\xab\x5f\xc7\x03\xcc\xc8\xbc\xe4\x0f\x1b\x40\x30\xa4\xfc\x74\xf8\xa7\x18\x41\xf4\x82\x4d\x86\x90\xbd\xf0\xf1\xfb\x24\xb5\xd2\xb6\x78\xc8\x4d\x65\xcf\x01\xe5\x21\x93\xbb\x66\x1e\x25\x6b\xfa\xc3\xab\x76\xb9\xaf\x97\xd6\x3b\x69\x68\x80\x22\xbc\xec\x10\x14\x42\xb7\xac\x1d\x13\xa9\x79\x14\xbe\x82\xdb\x96\x3d\x7c\x1c\x57\x96\x3e\xee\x40\xce\x21\xcb\xd8\x23\xdc\xb8\x63\xe5\x4d\xcc\x3c\xfb\xa0\x3b\xb7\xd6\x07\x76\xaa\x5d\xdb\x57\x38\xe4\x4e\xd9\xd9\xd9\x1c\x67\x10\x94\x0a\x23\xda\xbf\x6e\x47\xb2\x2b\x63\xdd\x9f\x37\x77\xd8\xdd\x59\x70\xfb\x7a\x9c\x5f\xea\x83\x96\xc2\x4f\x8f\x29\x7d\xe8\xfa\xb6\x4c\x8b\x37\x5a\xde\x7b\x1b\xff\xe1\x6b\xe2\x94\xfc\x27\x62\x1e\xc5\x0b\x09\xe1\xf5\x76\x9b\xe3\x1f\x65\x85\x57\x92\xba\x24\xae\x26\x1c\xf2\xbd\xdb\x4e\xf4\xc8\x3d\xa7\x5e\x11\x03\x2b\xe2\xf9\xf1\x38\xb8\x23\xe6\x97\xb5\x45\xa4\x26\xa8\xf5\xae\xd8\x65\xda\x25\x75\x79\x05\x51\x1e\x93\xb7\x76\xed\x5b\x94\x67\xcb\x67\xe2\xa1\x2b\xe6\xd6\x22\xfb\x36\xce\x44\xfa\x9e\xad\x0c\x75\x59\x9c\x8a\x71\xaa\x4e\x15\xa7\x12\xd9\x56\x7a\x5b\x54\x51\x86\x08\xab\x5c\x49\x47\x57\xd4\x9d\x3a\xb9\x86\x52\x0d\xa8\x0c\x7f\x04\x07\xad\xa2\x55\x51\xbb\x51\xaf\x79\x09\x34\xaf\x7d\xca\x1d\xc5\x8b\x13\x76\x12\xb0\x38\x10\xab\x95\xe0\x27\x8c\xf4\x19\x4a\x15\x56\x2e\x71\x75\xa9\x2a\xd7\xef\x5d\x46\xa1\x91\xe6\x0d\xa4\x97\x7b\x3d\x6e\xb7\xd5\x89\x17\x9a\xd2\x07\x16\xb1\x0a\x00\xc5\x3a\x40\x25\x26\x29\xb2\x3e\x46\x78\x90\x58\x88\x4a\x54\x90\x48\x09\xa1\xe5\xcd\xac\xb1\x79\x1f\x49\x10\x48\xbd\xd3\xd3\xb8\xdd\x8e\xb7\xdb\x72\x06\x62\x73\x17\x85\x46\x54\x41\xa7\xb5\xa8\x9f\x47\x23\x14\x48\xe8\xa8\xdf\xce\x23\x19\x1b\x9a\xc2\xb5\x15\xd5\x23\x57\x5d\x96\x5b\x48\x8b\x11\x8e\xad\x50\x3e\x97\x53\x5e\xdf\x82\xc8\x83\xa8\x52\x38\x54\xa5\xa2\x4a\x45\x96\x63\x5a\x6a\x82\x1f\x98\x5a\x61\xa9\xa3\x6a\xa6\xbe\x25\x10\x5c\x43\x0a\xd8\x7d\xe7\x91\x66\xea\x07\x62\x44\x1d\xbe\x92\x19\xd7\xdf\x5c\xc4\xc9\x07\x45\x0a\xaf\xf2\xb1\x3d\x27\xc5\xa5\xda\x9d\x71\xf2\xc1\x4b\x6b\x38\x45\x93\x01\x70\x77\x69\x43\xf1\xfc\x60\x6c\x89\xa7\x71\x71\x6c\x19\x29\x51\xd6\x2b\xfb\xf6\x92\x65\x82\xee\xf4\xa9\xc4\x44\xd4\x70\xec\x9e\x0d\x2e\xa2\x5e\xe7\xf8\x11\x26\x7e\x39\x7f\x62\xc1\x32\xd1\x6e\x97\xbf\x4f\x09\xf6\x27\xe5\x1b\x6a\x69\x5c\xde\x61\xa6\xe0\xa3\x6e\xcb\xaa\x2f\x38\xcf\x95\x2e\x87\x27\xe2\xb1\x3d\xd0\x6b\xb0\x52\x73\xbc\x7f\x95\xa7\xc4\x4f\xea\x8a\xcb\x5c\xcf\xa4\xba\x59\x44\x48\xce\x11\x0a\x75\xb7\x72\x60\xb1\xb8\xac\xeb\x52\xbb\x9b\x36\x1f\x96\x7d\xc9\x13\x8a\x00\x97\x95\x17\x79\x12\xd8\x5b\x19\xc1\xa0\x69\x52\x70\xf7\x0f\xcb\x48\x76\xc7\x2b\xee\xf5\x32\x6b\xad\xca\x49\x4a\xf3\xbb\x90\xcb\x6c\x97\x66\xcd\xbf\xf4\x52\x85\x7b\x85\x6b\x39\x8e\xed\x3d\xce\x77\xeb\xef\x0d\x90\x1d\x49\xc8\xce\xf9\x8c\x06\x8d\xef\xd5\xdd\x8d\x9f\xac\xda\x6d\xfa\x7f\x11\x65\x14\xbb\x66\x52\x7b\x1e\xb7\xfe\xfd\xdf\xf3\xdf\x2d\xb9\xdb\x7a\xbd\xc7\x1d\x91\x68\xba\xf7\xe0\x13\xfb\x54\x9e\x06\xda\x6e\x5b\xff\xfe\xef\xda\xe1\xa0\x9d\x85\x4b\x11\xfe\xb0\x64\xff\xb8\x8e\xa8\xb9\x30\x5a\xe9\xc7\x32\x50\x6c\xcb\x94\x53\xa2\xbf\xb9\x6e\x9d\xe1\xea\xaa\x94\xc5\x3c\xb9\x31\xcc\x9d\x35\x70\xec\x3f\x7e\x43\x47\xa5\x6f\x7b\xd1\x60\x1f\x19\x0c\xb6\xf4\x8d\x49\x36\xd9\x49\x12\x9e\xa4\x2c\x5e\x88\x4a\xc4\xd6\xe7\x2a\xc7\x0f\x9b\xec\x87\xf0\x47\xf9\x59\x8b\xda\xfa\x47\xe3\xb4\xee\x2c\x88\x4a\x7f\xf8\x10\xcd\x9f\x33\xf8\x38\x39\x11\x2b\x01\x87\xa9\x93\x48\x72\x39\xff\xdc\x88\x38\xa8\x0e\x1f\xae\xc0\x7f\xca\x88\x71\xad\xd7\xa3\x46\xdc\x14\x96\xec\xcf\x19\x31\x85\x00\x3d\xd1\xb0\x09\xaf\x8c\x96\x46\xa2\x85\x9c\xe5\x7f\xca\xd0\x71\x09\xc9\xf1\xa1\x17\x83\x89\xa0\xef\x13\xb8\xe1\x30\xd9\x64\x34\x54\x15\x9e\x7c\x67\xd9\xe6\xee\x48\xa8\x06\x39\x49\x68\xed\x21\xa9\xad\xda\x5a\x3e\xae\xbc\xea\xbb\xc3\x55\x8f\x06\xa3\xc7\xdd\x89\xfd\xee\xa1\x35\xc4\x69\xf7\x8b\x68\x8d\xff\xb8\x8f\xfc\x59\xd6\x6e\xef\xb9\xd5\x14\xf1\x0a\x76\x16\x8e\x62\xff\xe1\x30\x16\x95\xc6\x1f\x68\x4c\x3f\x9c\x5a\x7a\xd7\xc9\x1e\x38\x0f\x1d\xea\x6b\x9a\xd9\xa6\x03\xba\xf9\x5c\xdf\x1c\x9c\x6b\xc4\x74\xf8\x03\xcb\x58\x1e\xd3\xd8\xbf\x00\x66\xf7\x00\x4e\xd9\x59\x38\xfa\xfe\xe9\xad\x9e\x9e\x66\xcd\x93\x56\x2a\x66\x0e\xdc\xce\x9c\x2d\x45\xbc\x3b\x72\x91\x7a\x0e\xd3\xc3\xfe\x27\xed\xa0\xe3\xc7\xa3\x0b\xee\xe8\xe1\x09\x41\x08\x81\x47\x41\x5d\x53\x6c\xce\xca\xcd\x87\xea\x90\x6c\x79\xb1\x3d\x4c\x53\x2a\xee\x40\x2d\x30\x01\xc5\x1d\x80\xd3\xab\x8a\x46\x10\x14\x71\x3e\x14\x18\x73\x0f\xe7\xcc\x43\xe3\x58\x4c\x81\xfc\x24\x79\xe6\x3d\x13\x85\x46\x25\xd5\x02\x01\x34\x7a\x92\xa6\xe5\xb2\x35\xfb\x94\xbe\x49\x93\xf7\x11\x17\xfc\x44\x61\x54\x9e\x08\x72\x2e\x0d\x92\x34\x15\x41\xb6\xba\x3b\x89\x6e\x6e\x89\xb8\x9c\xec\xf1\x29\xba\x5f\xa9\x1e\xe1\x72\x67\x4a\x2e\x93\x4e\xc2\xaf\xeb\x27\xe1\x23\x3a\x1f\xac\x3e\x27\x95\x88\x00\x6a\x78\x86\x76\x96\xbf\x0c\xec\x6c\x14\xf7\x9f\x59\x95\x50\x2d\x38\xa7\xaf\x9d\x83\xa5\xb2\x90\xc3\xe2\x8b\xdf\x4d\x4b\x98\x79\x7b\x87\x26\x98\x5d\x2c\xff\x7e\x78\x86\x19\x1d\x4e\xa7\xf8\xda\x97\x79\x04\x74\x88\xb2\x9e\x52\x48\xed\xdb\xc4\x45\x61\xff\xb6\x04\x22\x63\xe3\x04\xba\x79\xaf\xf7\xbc\xbc\xe2\x29\x1f\x99\xba\x3c\xd5\x2a\x22\x8a\x52\x8e\x83\xe8\x27\x2d\x0e\xda\x8b\xf2\x4c\x7e\xf9\x32\xd5\x4f\xdf\x0b\x5a\x95\xc2\x78\xf8\x8f\x5f\x92\xcd\xc9\x6d\xbe\xfe\x9f\xdd\x23\x3c\xc3\x2b\x99\x67\xd2\x62\xf1\x49\x14\xbf\x67\xab\x28\x07\x8c\xd6\xf8\x1f\xff\xeb\xb3\xfb\x6c\xf7\xbf\xfe\xb1\x3b\xf9\xb0\x14\xa9\x38\x61\x72\xdb\x08\x76\x83\x68\xbf\xf9\x2d\xe7\x17\x27\xb2\xd2\x80\xc5\x79\xc5\x27\x2c\x3e\x29\x2f\xe3\xb3\x4e\x54\x34\x62\x8b\x82\xa4\x58\x27\x49\x7a\x92\xc7\x25\xb8\xf8\xc7\x65\x13\x88\xaa\xd0\x47\x72\xcb\x3d\x6a\xf7\xbe\x7d\x04\xcd\x90\xeb\xab\x45\xc5\xb2\xb4\x50\x2f\xe9\xd3\xa8\xdd\x2e\x22\xba\x22\x56\x56\xbe\x38\xd3\x74\x6e\x5e\x8a\x8a\xd6\xdd\xea\xf6\xba\x0f\x31\x43\x85\xe6\xb4\x3f\x70\xba\xe6\x65\x6a\x8c\x3a\x6e\xb7\x67\x1a\xc2\x6a\x5d\x5f\x8b\xf5\xeb\x44\xe2\xaf\x96\xa5\xe2\x47\x9e\xda\x72\xa9\xf2\x73\x59\x4a\xb8\x44\x1d\xb1\x17\x19\xa9\xd1\xe9\x4a\x2c\x23\x31\x0e\x9e\x7a\x3d\xb7\x6b\x4a\xa4\x83\xa7\xc1\xa8\x6b\x9b\x12\xef\xd0\xb7\x6e\xc7\x31\x65\x8f\xf3\xca\x74\xef\x34\x59\xa3\xf0\x5a\x1f\x53\xb1\x10\x1f\x6f\x5b\x56\xea\x3d\x31\x66\x86\x69\x4c\x4e\x67\x13\x73\x3b\x9b\x19\x53\xe7\x7c\x34\x9f\xf1\xcf\xe5\xc3\x74\xb6\x9e\x5d\xcd\xb7\xb3\xa9\x31\x19\x4f\x7f\x9d\xcd\x66\xf3\x79\xf1\xd6\xfc\x7c\x36\x7f\xb2\xc0\x14\x6e\x62\x59\xf9\xf4\xc9\xcc\xb8\xbf\x37\xa6\xb3\x0f\x9f\xcd\xcf\xcc\xdd\x6e\x66\x6e\xf5\xc7\x27\x56\x3a\xb7\x5a\x8b\x96\x25\x01\xf1\x37\xd5\xa3\x71\x4b\x8a\x5b\x95\x68\x47\x45\x1f\x9f\xfc\x6a\x4c\xc6\x33\x63\x36\x19\xcf\x4c\xf3\xf3\xd9\xaf\x4f\x64\x5f\x67\x9f\xe9\x2f\x3f\x7b\x52\xde\xa1\x9a\x89\xb5\x44\x11\x12\xf8\xf7\x7e\x5e\xa4\xe2\x76\xc5\x02\x61\x3c\xc9\x7b\xff\x64\x61\xb5\x5a\xa6\x39\x29\x3f\x09\xf9\xa2\x78\x4a\xe5\xd3\x38\xd3\xcf\x39\xc2\xd8\xa7\x16\x64\xd2\xfa\xd8\x1a\xb7\x5a\xe5\x95\x92\xd1\xfa\x47\xb1\xf8\xf2\xe3\xad\x91\x9a\x93\x74\x2a\xe6\xed\xb6\x4c\x2f\x02\x76\x9b\x6d\x52\xf1\x3d\xbb\x11\xeb\x49\x3a\xce\x8c\x54\x85\x7a\xb5\x62\x53\x3e\x59\xb1\x76\x7a\x9f\x6b\x86\xa9\x4a\x04\x41\xaa\x7a\x22\xc6\xd9\x85\x58\x07\xec\x16\xa8\xb6\x28\xb6\xa9\x19\x61\xb3\x69\x6b\xbd\xf1\x6f\x59\x96\x89\x34\x6e\xe5\x31\xca\x53\x73\xee\x09\x4b\x1b\xd0\xb2\x5e\xec\xcc\x10\x4f\xd3\xc2\xf7\x6b\xd2\xba\xbf\x6f\xa8\x46\x58\xad\xdd\x4e\xca\x86\x2d\x73\x97\x5d\x64\x6c\x51\x02\x57\xf3\x49\x07\xb9\xdd\xb0\x13\xac\xd8\x62\x7b\x07\x3c\xac\x44\x8b\x9c\xc4\x9e\x39\x13\x76\xee\x8c\x6d\x49\x2b\x9d\xcb\xe0\x29\xbb\x0c\xce\xce\xcc\x64\x1a\x9c\x3b\xf3\xb2\xe8\x34\x98\x63\x5f\xdc\x52\xf8\x24\x05\xe4\xa6\x01\x07\xda\x55\xf9\x9c\x98\x24\x47\x24\x16\x37\xd5\xcf\xc8\xda\x58\xf7\x3b\xd3\x0a\x6b\x59\x63\x2f\xbd\x48\xd9\x07\x95\x2b\xb6\x96\xf9\x2d\x20\x25\xa1\xcb\x2e\xfc\x4d\xb4\xe2\x46\x68\xdd\x92\x6f\x9b\x7a\x51\x8e\x7f\x65\xad\x2d\x4e\x10\xb2\x21\x07\xa3\xa2\x7e\xee\xf1\xed\x56\x82\x17\xea\xe7\x56\xeb\x63\xcb\xb4\x96\xde\x93\x5f\x25\x24\xe7\x5b\x64\x66\x3e\x81\x06\xc6\x58\x99\x97\xcb\x76\xdb\xe0\xf0\x23\x5c\x45\xb7\x2f\x37\xb7\x2b\x9c\xac\x5a\x1b\xfc\x6c\x39\x75\xe6\xa6\xa9\x26\xe0\x7e\x77\x99\xcf\x6f\x08\x09\xd0\x8c\x42\x03\xa6\xa8\x1f\x3e\xc4\x6f\xd2\xe4\x56\xa4\xd9\x9d\x11\x9a\xd4\xab\x85\x17\x18\xeb\x69\x38\xb7\x36\xe6\xe5\xed\x34\x9c\x7b\xf7\x6a\x75\xc7\x89\xb1\x50\x70\x69\x5a\x52\x90\x5a\x8f\x17\x75\xe8\xdd\x6e\xa7\x73\x8a\x94\x79\x63\xbd\xf7\x02\x63\x65\x6d\x4c\xeb\xce\xb3\x2d\xdf\xb3\xad\x17\xde\xd4\x9e\x5b\xcf\xbd\xf7\x4d\xa5\xac\x2b\xef\x7d\x1e\xe0\x38\xdf\x5e\x91\x55\x41\x9d\x91\xc5\xac\x15\x75\x72\x6d\x25\x56\x60\x71\x4f\x6c\xb7\x91\x24\xdd\xf9\x8c\xc2\x49\xf4\xb6\x3e\x34\x6e\x6a\xec\xcd\x8f\x22\x14\xa9\x14\x80\x15\x8f\xf3\x73\xcc\x45\x18\xc5\x82\x4b\xa2\x84\xfc\x27\x05\x1c\x67\x12\x41\x4e\x8c\xb5\xf7\x7c\xea\xcf\xad\x17\xd3\xb3\x33\x7f\xee\x9d\x9d\xdd\x59\x89\xd7\x32\x26\x4f\x8b\x7c\xeb\xed\x96\x5b\xad\x67\x2d\xd3\x1c\xe3\xcb\xb8\x65\xdd\x78\x77\x98\xfe\xa5\x77\x3b\xe5\xf3\x0b\x35\x87\x1a\xe6\xa8\x53\x05\xba\x85\x40\xae\x0c\x95\xc0\x0c\x4f\xef\xce\x6f\xe6\x96\x6c\x31\xbf\x74\xa1\xda\x2e\x1a\xdd\x15\x57\x36\xe4\x0a\x3d\xad\x82\xc0\x3b\x4b\xcf\x9d\xf9\xa4\x35\x9b\xbd\x2b\x0b\xea\x19\xe6\xa8\x64\xdc\x9a\xcd\x8a\xcf\x67\xe9\xd9\x4d\x09\xd3\x3b\x53\xf7\xf0\x2c\xc0\x75\xe3\xb5\x8a\x02\x49\xbe\x77\x36\xd6\xd2\x6a\x99\x2d\x68\xe5\x99\x1a\x4e\x7d\xf2\x1e\x33\x94\x55\x3e\x94\xe7\x72\x04\xab\xfd\x11\x3c\x6f\xec\xf8\x8b\xe9\xd9\x6a\xde\xd0\xf3\x93\xcc\xb8\xb2\x38\x6d\x48\xf1\xf1\x36\x49\xb3\xb5\x57\x50\x3e\xd0\xe9\x07\x54\x54\x7f\x2e\x99\xee\xf6\x7b\xbd\x61\x49\xa6\x15\xd1\x5e\xe9\x44\xfb\x00\x61\x2e\x10\xb3\x28\x5d\x4b\x68\x88\xf7\x72\x39\xc7\x99\x45\x3d\x10\xd6\x3a\x63\x69\x36\x4e\x2d\x11\xf3\x71\xb4\xdb\x65\x17\x37\x92\x07\xfd\x51\x04\x9b\x74\x1d\xbd\x17\x65\xad\xa9\x15\x59\xd8\x4f\xe6\x7d\xe0\x05\xdb\xed\xfd\x0e\x3d\xe5\x96\x5c\xcb\x5b\x2b\xb4\x16\x75\x94\xe9\x25\x1a\x9e\x4a\x24\xb9\x36\xad\x9b\x83\x78\xb5\x75\xd7\x32\xad\xf7\x5e\x52\x92\xd7\x3b\xa2\xab\xd6\x9d\x17\x28\x52\xf5\x62\xc9\x52\xcb\xf7\x02\xe2\x70\x81\x14\x24\xba\x90\xd8\xc2\xb6\xae\x3c\xdb\x7a\xeb\xd9\xd6\xb5\x67\xcb\xfd\x1d\x79\x99\x11\x59\xef\x25\x23\x23\xc1\xe6\xbd\x69\xdd\xd1\xee\xff\xc6\xfa\x20\xbf\xdf\xe5\xe7\x05\x9c\xfd\x28\x57\x2f\x28\xb8\x95\x5c\xd9\x9b\x24\x15\x27\xd9\x92\xc5\x27\x49\x2c\x4e\xa8\x1b\x27\xc1\x92\xa5\x2c\xc8\x44\xda\x32\x2f\xef\xbc\x82\x90\xde\x49\x62\x40\xc8\x03\xe4\xbb\x8a\xb7\xbf\xa9\xe1\xf1\x0f\x84\x02\x72\x98\xbc\xb3\x5a\xd3\xd9\xec\x6a\x36\x5b\xcf\xb7\xc6\x64\x6c\x4c\x4e\x5b\xf9\x6e\xf9\x60\x15\x6c\x51\x64\xad\xe7\x56\xab\x91\xef\xc9\x99\x81\x96\x39\xfd\xb5\x28\xfa\x8d\x75\x67\xb5\xe6\xe6\x99\x79\xd6\x32\x2d\x6d\x6e\xa7\xbf\x46\x37\x9b\xf9\x99\xe2\x5c\x76\xb9\x54\x22\xe7\xa5\xdd\x36\xde\x9e\x79\x06\x69\xf0\x25\x06\xb2\xde\x5a\xad\x75\x16\x05\xef\xee\x5a\xe6\x76\x3b\x6d\xb5\xe6\xe6\xd4\x9e\xe7\xaa\x18\x6b\xe9\x15\x59\x23\xeb\xad\x69\xdd\x96\xcf\x6b\xf9\xbc\x6c\xb7\x6f\xdb\x6d\x63\x49\x06\xb2\xa7\xde\x2d\xfd\x98\xdc\xc2\x1c\x35\x5e\x92\x0b\xbc\xb5\xdc\x6e\x6f\xcd\xb7\x9e\x71\xe5\x19\xf8\x49\xb9\xcc\x33\x7a\x2a\x1b\x2c\x6e\x9e\x39\x7d\x4e\x82\x8d\x5c\xcc\x9b\x76\xfb\xf4\x79\xbb\x7d\xf5\xec\xba\x7c\xb7\x34\x9f\x23\xbc\xe1\x95\xb5\xf1\xde\x9a\xd6\xd9\xd9\xf3\xe2\xd6\xbf\xd3\xdb\xed\xf6\xf4\xf9\xfe\xba\xff\x1c\xfb\x6c\x25\xf9\x24\x7e\xc2\xc5\x2a\xba\x89\x32\x91\x9e\x84\xc9\x26\xe6\x20\x88\x14\x39\x0d\x42\xe0\xe9\xf9\xf9\xf3\x76\xdb\xf0\x27\x86\x3f\xb5\xe7\xed\x36\x7f\x76\xdd\x6e\xbf\x50\x77\xca\xe0\x9d\x55\x45\x83\xa9\x5a\x90\xd4\xba\xb6\xb8\x89\xc4\xb4\xfc\xa9\x33\xaf\x14\x73\x0e\x17\xe3\x92\x46\xca\x44\x16\x73\xab\xc5\xdc\xc3\xc5\x36\xd6\x95\x89\x44\x16\xeb\x54\x8b\x75\x0e\x17\xbb\x92\x2b\x27\x13\xd3\x1c\xab\x12\xc7\x5a\x30\xad\x6b\xef\xad\x75\xba\xc8\xad\x3b\x57\x9e\xe7\xbd\x6d\xb7\xcf\xce\xde\xe6\x7a\xd2\x45\xbb\x7d\x7a\xd3\x6e\xfb\xed\x36\x4d\x58\xce\x1c\x7e\xc2\xbc\xc9\x59\xcb\x8b\x99\xa6\xf5\xe2\x10\x9a\xee\xb8\x3d\xf7\x01\x95\xe7\x9f\x2c\x4e\x39\xfd\x61\xbf\xc0\xd3\xbd\xe1\xc0\x71\x0a\x3c\xdd\xef\xf7\xdd\x41\x21\x4e\xf5\x3a\xb6\x3b\x32\x4d\x2b\xa1\x72\xb6\x3d\x90\x39\x83\x0a\xb6\xe7\x15\xa1\x6c\x53\xc1\xfd\x4b\x3c\x0d\xbb\x23\xdb\xd1\xe3\xd5\xde\x92\x8d\x5c\xdd\xda\x24\xb6\x5b\xf1\xac\x50\x95\xaa\x98\xdc\xea\xa9\x60\xf1\x48\x62\x2d\xf9\x65\x61\x16\x61\x9d\x11\x10\x59\x0a\xaa\x85\x6b\xcd\xee\x98\xf8\x77\xbf\x83\xa9\xf7\x9a\x8b\x80\x8e\xab\x2c\xc5\x47\x2b\x94\x3f\x6e\x19\xef\x96\x9d\x5c\xd4\x6e\x3f\xca\x31\xd1\xf9\xc9\x75\x8e\x88\x2e\xb2\xe4\xbb\xe4\x83\x48\x5f\xb0\xb5\x94\x8c\x8b\xa2\x37\xba\x20\x37\x9b\x4d\x3f\x6e\xe6\xc6\xc5\x59\xce\xe2\x66\x66\x79\x1d\x7c\x6a\x08\xc9\xd3\x8e\xb3\x0b\x89\xa3\x5f\x24\x5c\x3c\xcf\x0c\x49\xfa\x3d\x0f\xb1\x6d\x27\x52\x22\xd8\xe1\xb2\x8c\x9f\x92\x77\x22\x96\x42\x9c\x31\xbd\x7d\x33\x37\x8d\xc9\xf8\xde\x98\xfd\x3a\x31\x8d\xe9\xaf\xbb\xf9\xe7\xe6\x6e\x6b\x4c\x9f\x9f\xff\x9d\x9d\xff\x3e\x37\xcd\x27\x96\x46\x07\x63\x8b\x51\x6f\x56\x5e\xeb\x8d\xac\x38\x9d\x3a\xf3\xed\xf6\xf4\x34\x95\x1b\x71\xed\x21\x72\x63\x01\xc0\x4c\x01\x30\xb3\x5a\xcf\x25\x0e\xf6\x16\x46\x3a\xed\xce\xb7\xdb\x74\xda\x99\xcb\xb5\x17\xd3\x04\x21\x77\xcb\xba\xa4\xbc\xe7\xce\x35\xf4\x74\x75\x17\x67\xec\x63\x1e\x82\x51\xe9\x54\x78\xb2\xf1\x57\xe2\x24\x16\x0b\x38\x72\x9d\xb4\xce\xd2\xa9\x3d\x27\xec\x24\xea\xbc\x6d\x62\x1e\xaa\xee\xe7\xf8\x5d\x9c\x7c\x88\x4f\x7e\x8e\x23\xdc\x98\x94\xc9\x69\xd1\x2b\x0b\x2e\xa2\xf8\xbd\x48\xd7\xe2\x87\x90\x86\x7d\x2b\xdf\xca\x71\xe8\x5f\xac\x07\xda\xac\xf1\xd3\x88\xfa\x5e\xcc\xd1\xad\xc6\x23\xb6\xaa\x1d\xb9\x89\xd6\xeb\x28\x5e\x9c\x70\x96\x31\xd5\x2b\xab\x75\x72\xfe\xec\xa4\x20\x71\xb7\x96\xde\x0f\xf3\x92\x66\xd4\x5a\x79\xa7\x2b\xc9\x5e\x9e\x06\x17\xfe\xcd\x6d\xbb\x7d\xba\x3e\x34\x03\xcf\xd7\x59\xca\x56\x27\x37\xb2\xd1\x54\xfc\x73\x13\xa5\x82\xe3\xec\xfb\xc1\x29\xa1\x7b\xce\x5a\xf0\x25\x90\x8b\x16\x3f\xa6\xea\x42\x2b\xba\xde\xdc\x4a\x9c\x55\xad\x7e\x7d\xf2\x21\xca\x96\x51\x5c\xf2\x16\x27\xa8\x5e\xac\x4b\xb1\x51\x43\x69\x29\x2d\x45\xe4\xa5\x93\x16\x3b\x6d\x8d\x5b\xcc\x2b\x14\x08\x62\x9a\xcd\xa7\xd1\x7c\xbb\x35\xd4\x2f\xaf\xa1\x20\x24\x68\xf9\xdd\x5a\x79\xa5\xee\x81\xa9\xb9\x62\x17\xd1\xfa\x8b\x9b\xdb\xef\xd8\x3a\x43\x70\xdf\xea\x72\x45\x5e\x6b\x5a\xac\x17\x8a\x58\xad\x79\xab\x94\x8b\xd9\x05\xc3\xb8\x27\xad\x6d\x4b\x0a\xf7\x66\xf1\x46\x56\x76\xe6\xe5\x4f\xf2\xbd\xd6\x8e\x6a\x5c\xe6\xa8\xb6\x17\x6b\xe0\x51\xab\xdb\x6a\x4d\x8b\x86\x63\x4b\xeb\x8b\x95\x4e\x5a\x8a\x8d\xca\x8b\xae\xac\x96\xdc\xe5\xd3\xd9\x86\x0f\x6d\xfb\x7c\xb6\xe1\x7e\x18\xce\xe5\x63\x40\x8f\x61\x18\xce\xb7\xd3\x99\xfc\x1d\xca\xdf\xa6\x29\xe5\x06\x9d\x49\x5b\x91\xd4\x42\xc7\xb8\x77\x46\x62\xad\x72\xc7\x5a\x0d\x18\x26\xab\x89\xae\xb4\x28\x56\x25\x9d\x4f\x5b\xfe\x69\x8b\x16\x26\x7f\xa8\xa8\x3c\x08\x31\xb7\x5a\x56\xec\x9d\x3b\xa5\x34\xb5\x2c\xa7\x22\x53\x63\x95\x44\xed\x89\x31\x9b\x7d\xbc\xb8\xd8\xce\x66\x9b\x8b\x0b\xfc\x9f\x28\x6d\x9a\x31\x19\x9f\x1f\xfc\x68\x4e\x34\x6c\x56\xe0\xd5\x1b\x23\x93\x88\xf3\x52\x3c\x8b\xcf\x9c\x76\xdb\x48\xcf\xbc\xd6\x6c\xb6\x29\x46\x1e\x1a\x91\x11\x9f\x39\xa6\x69\x5a\x32\x8b\xab\xb2\x9c\xd7\xf3\x88\x73\x07\xa7\xda\xac\x18\x55\xba\xf3\xed\x16\x15\xef\x4c\x2b\x7e\xda\xef\xf5\x3a\xbd\xe3\x95\x53\xa6\xae\x56\xfd\x57\x5f\x7d\xf5\x15\x16\x74\x87\x69\x93\x4b\x8c\xb9\x37\xc7\xd8\xd9\xe3\x12\x36\x8c\xd5\xa4\x35\xfd\xb5\x35\x96\x30\x71\x16\x14\xb0\xb0\xb3\xee\xd7\x41\x72\x2b\xc6\x2d\xb6\x5a\xb5\xac\x04\xe7\x96\xd8\xea\xab\x15\x5b\xac\xc7\xad\xe7\x2d\x6b\x25\x18\x97\xa2\x05\x64\xc4\x9d\x49\x77\x29\xa9\xdd\xf9\x92\x65\xcc\xd3\x97\x93\x76\x0f\xd7\xf7\x54\xbe\x72\x12\x35\x10\x73\xe0\x79\x5e\xa1\x4c\xda\x6e\x89\x2c\x57\x05\x9f\x8c\x6e\xfb\xa8\x8a\x04\x99\xb9\xdd\x1a\xe9\xa1\xaa\xe9\x88\xd1\xe1\x00\xbe\x92\x0b\xc8\x6f\x09\x25\xe4\x00\x6d\x7c\xc9\x4a\xed\xc5\x63\x2f\x2e\xab\x55\x40\x65\x16\xcc\xd6\xd0\x3a\x77\xc8\x1e\xf4\x43\x6e\x36\xf4\xa2\x76\x1b\x77\x16\xe5\xde\x52\xed\xb6\x14\xb2\xf4\x37\xd0\x15\x98\x56\xeb\x35\xbb\x6d\x51\x74\xf0\xd6\x95\xa0\xb2\xa5\xe9\x26\xd1\xc7\x8b\x26\x72\xaf\x8a\xb5\x2a\x04\x65\xed\xcf\xd1\xf6\x5b\x33\xce\x8c\xc9\x78\xb8\x75\xfa\xdb\x8e\x2b\xa1\xfa\xc5\x8a\xdd\xdc\x0a\x6e\x4e\xc0\xb4\x7c\xf6\x84\x54\xb2\x91\xd9\x30\x05\x3b\x04\xd0\xde\x6e\x45\xbb\x7d\xd4\x94\x4c\xd7\xad\x7a\x69\x3e\x67\xb6\xbe\xb6\xe6\xfd\x2e\xbf\xa8\x6a\x3d\xe6\x56\x53\x10\xdc\xe8\x59\xe9\x5a\x7c\xcf\x93\x18\xec\xe2\x58\xfd\x72\x94\x9c\x9d\x4d\xa3\xb3\xb3\xf9\x6e\x67\x89\xb1\xbe\xf5\x0a\x4b\x7e\x38\xe6\xbb\xc6\xe8\xbf\x05\xb5\x67\x59\x26\x6e\x6e\x71\x1d\x22\xb9\x16\x89\x93\x38\x89\xcf\xa3\x3c\x1e\x73\xae\xe1\xbd\x98\xc5\xdf\xc6\x27\x49\xca\x45\x2a\xf3\xfa\xe2\x24\xcf\x62\xa1\x00\x93\x13\xa7\xec\x31\xeb\x93\x9b\xcd\x3a\x3b\x59\xb2\xf7\xe2\x84\x9d\x4c\x6b\x5e\x4c\x73\xc3\x3c\xb9\x11\xd9\x32\xe1\x17\x2d\x75\xaf\x8c\xb5\xf4\x4e\x6d\x2b\x44\x58\xf9\x7c\x56\xf4\x19\xf1\xaa\xbc\x7b\x66\xee\xaa\x53\x26\x2b\x29\xcd\x5d\x39\xd1\x91\x02\xa4\x9c\x2e\x2b\xab\xcf\x4f\x28\x9b\xdb\x78\x98\x20\xad\x9a\x2c\xbd\xbb\x3f\x5d\xe6\xbe\xa6\x8d\x96\xaa\x30\x8a\xd9\x6a\x75\x87\xb8\xeb\x8a\x38\x6f\x76\xbb\xdd\xce\x48\xe9\x06\x5d\xc9\x06\xf3\x8b\xb5\x61\x5e\x9e\x1a\x91\xc7\x2f\x62\xc3\x34\xd1\x89\xcb\x5c\xe9\x1a\x91\x92\x01\xec\xd4\x86\x00\xbb\x41\x5e\xd4\x19\x04\xc5\x3b\xac\x4f\x64\x66\x25\x26\x1a\x9b\x92\x37\xd9\x6e\x37\x12\x27\xc9\x7f\x8a\xfe\x3d\x54\xe3\x92\x49\x8e\x41\x63\x09\x14\x17\xa4\xfa\x73\x29\xa6\x0b\x43\xfd\x9e\x7b\x1b\x6b\x73\xc1\x56\x11\x5b\x4b\x8e\x1f\x1f\xf0\x24\xbf\x98\xbb\xf2\x6e\x5e\x7e\x21\x8c\x65\x39\x41\xfc\x22\x34\x24\x43\x1c\xb0\x60\x29\xc8\x9b\xd9\x68\x29\x35\xe4\x5a\xe2\xce\xec\xe2\x7a\x21\x32\xd5\xaf\x9c\xb7\xdb\x13\x03\x52\x6f\xa1\xf3\xe1\xd3\x74\x7e\x48\x3a\x1b\x3a\x9d\xff\x5a\x63\x57\x77\xd8\x1b\x1d\x36\x61\x21\x5c\x40\x0d\xdf\x1f\x55\x03\xd3\xfa\x7c\xc1\xd6\x82\x76\x8f\x2f\x4e\x56\x09\xe3\x82\x9f\xf8\x22\x4c\x52\x51\xb0\x75\x5f\xac\x92\xe0\x9d\xe4\xde\xea\xd5\x1b\xe5\x16\x39\x24\xc1\x0e\x86\x0f\x39\xb7\xfc\xb9\x73\xd4\x73\x46\xae\xfb\xdf\x30\x47\x2f\x58\x26\x16\x49\x1a\x89\x3f\x36\x4f\x83\xfe\x68\xf0\x5f\x3a\x4f\xce\xc8\xe9\xf7\xff\x1b\xe6\x49\xed\x3b\x9a\x27\x62\xd8\x8a\xc9\xb9\x54\x2e\xb9\xa4\xd9\x6d\x3d\x5f\xaf\xa3\x45\x2c\x78\xcb\x2a\x10\xcf\xb8\xf5\x22\x6e\xe2\x6b\x0c\x71\x68\x62\x5d\x67\xe8\xfe\x97\xaa\xba\x07\xce\x60\x38\xfa\x6f\x98\xd8\x2b\x9c\x63\xff\x83\xd0\xd7\xeb\x3f\x74\x50\xf6\x4f\xd6\x33\x0d\x86\xc3\x5e\xa1\x67\x82\xd7\x40\xa1\x67\xea\xf6\xba\xc3\xd2\x6a\xef\xf6\xa0\x74\x22\x35\x13\x30\x6e\xa1\x66\x02\x6e\x29\xd4\x4c\xd8\x41\x85\x9a\x09\xcb\x6e\x9a\x97\x55\xae\xb4\x9c\x08\xab\x66\xe9\xac\x7c\x58\x1f\xfa\x90\x1c\xfa\x10\x1c\xfa\xc0\x0f\x7d\xd8\x34\x7e\x28\xa7\xac\x78\x79\x18\xaf\x3e\xe0\x00\xf2\x7f\xa2\x66\x30\xd7\xfe\xa9\x25\x73\x86\x3d\xa7\x58\x32\xd0\x36\xa5\x17\x1c\xb9\xdd\x9e\x84\x8f\x5b\x5d\x4b\x68\x85\x15\x7d\xe2\x82\x16\xba\xef\x8c\x5c\xd3\xb4\x6e\x2a\x9a\xc7\xf7\xaa\xcf\xa3\x81\x7c\xba\x23\x8c\xe7\x0c\x9d\x91\xae\x6b\xf4\xff\xcf\x11\x78\x5e\x18\x99\xb5\xc9\xed\xb2\x9a\xcc\x73\xf3\x3f\x4a\xe6\xa9\xce\xc2\x1f\x17\x7b\x82\x03\x62\x4f\xf0\xaf\x14\x7b\x82\xff\x0b\xc4\x1e\x6e\x6d\xa4\x1c\xb2\xfc\x93\xc5\x9e\xcd\x41\xb1\x07\x52\x16\x6f\x16\x7b\x36\x8f\x15\x7b\x96\x8a\x40\xf2\x9d\x7e\xb2\xf7\xc5\xbf\xda\x52\x20\x4b\x3c\xd7\x5c\xc2\xae\xbc\x7b\x12\x76\x24\x54\xc0\x95\xe0\x96\x05\x51\xbc\x18\x9f\x3a\x3b\xeb\xad\x77\x2f\x3e\x8a\x60\x4c\xf6\x52\x6d\x8f\xca\xb7\x96\x84\xf3\xfd\x4f\xf2\xad\x05\x23\xf5\x58\xed\xe3\xf2\x1b\x5e\x5b\xca\xb4\xb0\xff\x59\x7d\xb0\xd6\xb7\xab\x28\xdb\xff\x8c\xd7\x3b\xeb\xda\xbb\xdf\x59\xdf\xc8\xe4\x83\x4c\x5e\x7b\xd3\xb9\xf5\x9d\xd7\x52\xcb\xdb\xb2\x3e\x7a\xf7\xea\xf7\xf8\xc9\x6c\x66\x4c\xc6\xb6\x31\x19\x4f\xed\xf3\xce\x7c\x6a\x9f\x0f\xe6\xf7\xb6\xe5\xee\xb6\xd3\xee\xf9\x80\x9e\x27\xe6\x64\x9b\xbb\xc1\x6d\x3f\x4e\x67\xfc\xf9\xf9\x57\xec\x3c\x9c\xdf\xbb\xbb\xed\x06\xea\xc8\xe2\x4d\x77\xb7\xbd\x2f\x1f\xcf\x76\xe6\x36\xc8\x4d\x10\x5b\xa5\xbc\xdb\xc2\xc9\x67\x32\x9e\x8e\xbd\xd3\xf9\xf6\xe9\xd4\x3b\x9d\x9b\xdb\xe9\xe4\xf3\xb3\xf9\x6c\xb2\xbd\x9f\xf1\x33\x63\x32\xb6\x66\xfc\x73\x73\xb2\x9b\x4d\x26\xaa\xd4\x13\x0b\xca\x49\xd5\xdd\x23\x5d\xfd\x13\xfa\xa7\x5a\xdc\x59\x7f\x57\xfe\x75\xa5\xd7\xde\xf6\x69\xfe\xf3\xd9\xd6\x98\xf1\x19\xcf\xfb\x67\x9a\x4f\x16\xd6\x97\x5e\x41\x49\xde\x62\xfd\x09\x2d\x3f\x31\xcc\xc9\xe4\x89\xd5\x6a\x99\x53\x67\x6e\x7d\xab\x32\x9d\x82\xba\xdc\x95\x7b\xee\xc9\xc7\x27\xa6\xf5\x93\x77\xbf\x2b\xd0\x7b\x49\xb1\x7e\x28\xb5\x9c\xa7\x36\xa4\x7f\xcd\x46\xdf\x6a\x59\x99\x69\xb5\xee\x60\x20\x6a\xb7\x5b\x17\x17\xf2\x57\xeb\x82\xb5\x0a\x13\x95\x9e\x9b\xb5\xac\xd6\xe2\xae\x65\x5a\xad\x8b\x16\x6d\x98\x53\x47\x0b\xef\x8a\x18\x00\xb9\x10\x8c\xbd\xf0\xce\xfb\xc1\x68\x6d\x5a\xa6\xf5\x46\xfe\x90\x25\xbf\xf7\xee\x17\xe3\x53\xdb\x8a\x64\x72\x23\x93\xcd\xf8\x9d\x75\x37\x7e\xa3\x5d\xd1\xfb\xa3\xa1\xdd\x02\x8d\x80\x29\xa0\x87\xd3\xe7\x73\xef\x5e\x77\x89\x1a\x8b\x9d\x15\x17\xa7\x5a\x55\xfc\xb9\x6b\x80\xf4\xf5\xb5\xa9\xfd\xf6\x5e\x69\x57\xaf\xc3\x82\x9e\x6f\xef\xd5\x49\x14\x9f\x68\x5f\xcd\x6c\xba\x9a\xeb\xd9\xa7\xab\x62\x7b\xcb\x0e\xe4\x97\xf5\xa7\x16\x9e\xc2\x15\x5b\xac\x25\x99\x34\x6c\xeb\xbd\x66\xf5\xf2\x22\xda\x4f\x46\xab\xd0\xcf\xb3\xd2\x11\x4e\xf7\x1d\x7c\xa9\xd9\x05\xdf\xe6\x93\x9e\x6b\xb9\x9f\x18\x85\x4a\xdb\xa3\x5f\x9f\xcf\x1c\x93\xac\x85\x65\x15\x5f\xd5\x18\x87\xd3\x57\xa5\x0f\x65\x66\x36\x3b\xad\xcb\x9f\x6a\x59\x0b\xcf\xe3\x56\x4e\x0d\xe5\xd0\xb6\xdb\xfb\x9d\x15\x57\xe4\x10\xd5\xcb\x6f\x27\x55\xe0\xcb\xcc\x71\x05\x64\x67\x4f\x8c\xa9\xdc\x14\x9f\x9b\x9f\x3d\x89\xac\x7d\x0c\x56\x67\x40\xa6\x0e\x2e\x67\xb3\x98\xd7\x6a\xc1\x1c\x63\xad\xe9\x04\x70\x42\x41\x09\x15\x7a\x17\x12\x5f\xdf\xef\x4c\x75\xd7\xc6\xd7\x64\x2a\x81\x5b\x8d\x50\xef\x7e\x51\xef\x24\x9c\xad\xda\x6d\x23\xf6\x6a\x33\x1a\x5b\x3a\x34\x4f\x75\xc3\xc6\xfc\x4c\x82\xb5\xac\x0d\x26\x1b\xf8\x82\xcb\x36\x58\xd1\x06\xe3\xfc\x17\xf5\x42\x36\xc0\xd0\xc0\x4b\x23\x3e\x63\xc8\x1f\xad\x71\x42\x3d\x66\xab\x1f\xe2\xd5\xdd\x76\x6b\x14\x7b\x35\x52\x40\xd3\x6e\x1b\xeb\xe2\x21\x3f\xca\x5c\x9d\xcb\x48\xee\xaa\xc4\x63\x93\x97\x46\xfd\xc3\x19\x43\xe0\xed\xca\x3b\xd3\xb4\x7e\xd4\x37\xa8\x50\x95\x6f\xb7\x59\xe9\x1c\x6b\xed\xaf\xe1\xa9\x71\x4a\x6b\x8c\x7f\x15\x37\x43\x5c\xda\x3a\xa9\xb3\x91\x51\x35\x4f\xce\x33\xda\xe6\x18\x2b\xb5\xb6\x92\xbd\x19\xd0\x00\xf4\x37\x43\xbf\x0b\x77\xa1\x81\x8e\xe5\xf4\xb5\x7c\x5f\x57\xfd\x68\x5b\x06\xd0\xd2\x45\x14\xdf\x6e\xb2\x69\x46\x2e\x31\xe7\xce\x7c\xbb\x6d\x99\x0d\x5f\xce\xb2\xd2\x4d\x46\xe6\xd9\x1e\x2c\xdd\xf4\xa5\x56\x5a\xbd\x7d\xea\x14\x3f\xf5\x0c\xcf\xf2\xd2\xea\x79\xbb\x7d\x0b\xca\xac\x76\x00\x7c\x51\x41\xa3\x9e\x58\x79\xc6\xf5\xc6\x5f\x67\xa9\x91\xf7\xa3\x63\x75\x24\x9f\x5a\x17\xc6\x0a\x44\x50\xd6\x66\xd8\x56\xd8\xe4\x10\xd2\xfa\xd8\x32\x27\xe4\xd8\xbd\xde\xfe\xdb\xf4\xd7\x7f\x9b\xc5\xf3\xcf\x41\x20\xff\x6d\xfa\xab\x39\xff\x7c\x66\x9a\x9f\x4b\x02\x26\xa9\x63\x8d\x36\x9a\x4f\xc6\x85\x47\xf8\x23\x32\x5b\x55\x68\xd0\x8c\x70\xb8\xe2\x97\x06\x68\x35\x4c\x93\x95\x9a\x93\x56\x0b\x36\x44\xb3\x55\x2e\xf3\xef\x47\xc0\xc1\x36\x0b\x04\x61\x54\x60\xe3\x8b\x4a\x64\x94\x9f\x72\xec\x21\xa9\xd5\x54\x1d\xbc\xd1\x3d\xab\xe7\x3a\x82\xfc\x19\xda\x74\x1c\xa5\x56\x3d\x7b\xda\xbd\x34\x33\xaf\x65\x6b\x4e\xac\xa5\x3f\x64\x51\xee\x33\xdd\xcd\x23\xff\x2e\x3b\xd2\xba\x52\xce\x50\x13\xb9\x3c\xb7\xe5\x08\x5e\xa9\xb9\x79\x65\x65\xd6\x93\xe9\xaf\xb3\xb5\x35\x3f\xab\xda\x1b\xc5\x34\x9b\x7b\x24\x38\x57\x9c\xe2\xff\x99\x6b\x7a\x9e\xfc\x0a\x36\x21\x97\x74\xb2\x06\x35\xf9\x57\x2b\xb6\x28\x34\x3b\xec\x64\x1d\xc5\x8b\x95\xe6\x96\x77\x42\x5c\x89\x7d\x3e\xba\xfe\xac\x65\x5e\x7e\xaf\x5a\x2c\x9a\xfa\x0f\x9d\xbc\xe6\x84\x90\x59\x2b\x6b\xed\xbd\x2e\x9d\xc9\x71\x9d\x79\x40\x28\x78\x7d\x7e\x7e\x69\x42\xa1\x6f\xac\xbc\xd7\xd3\xf5\xdc\xbc\xc8\xad\x86\xed\xf6\xaa\xf8\x7d\xea\x79\xc9\x76\xbb\xba\x80\xbd\x91\xa2\x37\xc0\xe8\x78\xea\x79\xea\xa5\xfc\x2a\x69\x66\xbb\x7d\x5a\x85\x6b\xa1\x26\x4e\x58\x94\xc1\x94\x88\x90\x79\xaf\x94\x8f\x8b\xb5\xba\x00\x4b\x6d\xa5\xa5\x33\x9e\x69\xde\x07\xde\x3d\x98\xde\xef\xd0\xe9\x31\xd3\x40\x2f\xd9\x64\xb7\x9b\x6c\xbc\xba\x58\xb2\x98\xaf\x44\x5a\x18\xc9\xad\xc8\x12\xa6\xe4\x92\x59\xba\x16\x63\x59\x2f\x7e\xed\x2e\xf5\x73\x42\x27\x41\x39\x5d\xbf\xc8\x95\xb9\x52\x46\x0b\x4f\x5b\xb2\xbf\xd1\x07\x8d\xad\xd7\xbf\xfe\x7f\x6a\x41\x49\xd6\x38\x70\x1f\x81\x72\xb5\x0c\x92\xf8\xbd\x48\x33\x9c\x57\x3c\x49\xd2\x93\x42\xa0\x95\xd2\x9c\x3a\x3d\xd4\x04\xa0\xaf\x8a\x08\x28\x55\x92\x7f\x5f\x68\x26\x4e\xe9\xf6\xfb\xc3\x4d\xaf\x37\xb7\xb7\xab\xbb\x13\x30\x32\x27\x1f\x96\x22\x3e\x09\x92\xdb\x3b\x0a\x96\x42\x15\x96\x2d\x7f\x25\x85\x3b\xc9\x65\x95\xcc\x6a\x26\x37\xb8\xda\xaf\x99\x69\x89\xf2\x8b\xd0\xbe\x08\xd3\x7a\x05\xf2\xb0\xce\xd8\x6a\x25\xb8\xd1\xa2\xd9\x94\x4c\xe4\x41\x40\x68\x3d\x27\x1e\xf3\xcc\x83\xeb\xd0\x87\x69\x36\xdf\x6e\x0d\xf9\xcf\xbb\xdf\x99\xd6\xa9\xfc\x35\x15\xf3\x12\x84\x53\x2b\xf2\xee\x97\x6c\x2d\x69\x14\x7f\x41\xf4\x4a\xca\x5d\x15\x96\x71\x3a\x97\x6c\xcd\x77\x39\xb7\x61\x5b\xeb\x9a\xfe\x25\x0a\x8d\x97\x86\x30\x6b\x13\xd7\xec\x83\x94\x9f\x26\x38\x01\x70\x62\x12\x35\x2c\x64\x9a\x97\x59\x9d\x03\xc9\xac\xbd\x93\x0a\x56\xd5\x3f\x25\x0a\x8d\x0a\x31\x99\x2e\xee\xe6\x4f\xac\xf4\xa0\x07\x93\xe6\xad\x8b\xf6\x17\x12\x80\xee\x24\x5b\x0b\xbf\x9b\x9b\x84\x23\x38\x63\xd5\x5f\xbf\x88\x3d\xf6\xd2\x10\x67\xa9\xe4\x79\xd4\xd9\x4c\x39\x87\xbe\x14\x72\x73\x33\x61\xa4\xcc\x84\x92\x07\xa8\x9b\x09\xe3\xfc\x7a\x58\x70\x9d\xdf\x4f\xe3\x83\x5e\x5b\xb9\x9b\x55\xd3\x3c\xc5\x66\x61\xa0\x5b\x99\xf7\xd1\x85\x30\x56\x9a\x28\x0f\x03\x9d\xd2\x3b\xe4\x67\x2c\x32\x0b\xe0\x3a\x16\x3b\xba\xf1\xd5\x4a\xbc\x75\x7e\x78\xc0\x0a\x6a\x2c\xd5\xda\xbc\x5c\x3d\x4d\x72\xf7\x59\xf3\x9e\x27\xf7\x46\xea\xfd\x87\x91\x58\x81\xb5\xb2\x62\x2b\x32\x4d\x52\x22\x00\x0d\x80\xfd\xaa\xd2\xbb\xd2\x49\xdb\xb6\x56\xe6\x59\x7a\x41\xa8\xe5\xec\x50\xae\xd5\x59\x7a\xa1\x61\x25\xd3\x54\xd1\x3e\x52\xad\x19\x15\x4a\x88\x9d\x79\x79\x75\xd6\x4a\xfe\xd6\xca\x6d\xb7\x0e\x79\xec\x42\x09\x93\x63\xc2\xc4\xfa\x38\x8d\xe7\xd6\xaa\x44\x83\x16\x4e\xc8\x68\x4e\x32\xdc\x72\xcc\xa9\x3d\xbf\x64\x67\xde\x46\xd6\xba\xc9\x51\x62\x6b\x2a\xf9\x9e\x4d\xbb\x1d\x7b\x9e\xf7\xdd\x24\xf6\x94\xd7\xce\xb8\x35\x57\x1f\x34\x37\x1e\x70\xb7\xdf\x99\xbb\x9d\xda\x66\xe5\x09\x97\x1a\x44\x33\xeb\x89\x76\x8e\x0c\xae\x8c\xa0\xf7\xa6\x5a\xa4\x5a\xf6\x40\xd2\xc5\x45\x74\xb3\xb9\xcb\xdd\x1e\xf3\xfd\xb9\x1e\x47\x17\xb5\xdd\x3b\xa9\xf2\x9d\x63\x8a\xe0\x43\x07\x76\x54\xbf\x72\x50\xae\xf0\xc1\xb7\x05\x34\x54\x61\xe1\xd6\x34\xad\xdb\xbc\xca\xb5\x85\xd0\xda\x9a\xac\xe7\xc9\x91\x98\x4f\xac\x57\x17\xef\x45\xba\x8e\x92\xd8\x6b\x75\x2f\xba\x17\x4e\xcb\x7a\x55\x3f\x3e\xe4\xbd\x94\xef\xd0\xdd\x2c\x7a\x2f\x24\x45\xf6\x7e\x90\xaf\xb8\x08\xbc\xdf\xf0\x4d\x7c\xf4\x7e\x97\x3f\x6e\x19\xef\x7a\x3f\x5b\xaf\x0a\xaf\x4b\xaf\xce\xf5\x29\xd5\x2d\x42\x56\x4a\x09\xa7\xe2\xa3\x03\x48\x51\x44\xf3\x9f\xea\x97\x59\x9c\x9f\xb3\x98\xe7\x1b\x91\xf7\x96\xc4\xcd\xdc\x05\x4d\x8a\x30\xc5\x0e\x66\x6a\x07\xc7\x1e\xd3\x77\xf0\x3f\x8d\x58\x1d\x95\x2d\x37\x1f\xab\x6e\x3e\x86\xcd\xb7\x7b\xad\x2c\x6c\xd8\xbc\x63\x29\x6d\xde\x4b\xe1\x48\xca\xee\x52\x26\x1a\xbf\xb1\xaa\x9c\x3f\xd9\x05\x14\xdd\x1d\x0b\x8b\xdc\x8f\xd2\x9c\x03\xf8\x0e\x80\x31\xa6\x91\x14\x84\xb8\xd8\x1a\xa5\x3f\x52\x5a\x30\x16\x3b\x49\x3f\x0e\xda\xe8\x0d\xf5\xad\x86\xc8\x15\x60\x7c\x43\x74\xe3\x9b\x9c\x6e\x7c\x43\x70\xa3\x5e\x49\xc8\x7e\xa5\x58\x59\x93\x2a\xaf\xc8\xbc\x65\x43\x20\x76\x1f\xbc\xfb\xdd\xf8\x1b\xef\x7e\xb7\xb3\x5e\xa9\x73\x0f\x4d\x22\x72\x0d\xe6\x25\x2b\x60\x3d\x99\x9e\xcf\xa6\xb3\xf9\xfd\xce\x30\x3f\x3f\x9b\x5c\x58\xb3\xd9\xaf\x9f\x6d\xff\x6d\xb6\xc6\xf9\xc9\xd9\xec\xb3\xb6\x1c\x0a\xed\xf2\x1a\x80\x68\x8b\x2d\xe5\xe3\x85\x14\x90\x4f\x9d\x4b\x23\xf6\xde\xb4\xdb\xa7\xa7\x46\xb4\xdd\x8a\x0b\x42\x07\xed\xf6\x29\xc2\x66\x99\xe6\x84\x04\xe1\x71\x04\xa9\xf3\xd4\x96\x98\xa0\xf5\x15\x7b\x27\x7e\x91\xc2\xec\xf4\xf9\xdc\x13\x4a\xca\x07\xde\x4f\xf0\x38\x5d\x91\x7b\x1e\x7e\x79\x5f\x19\xa2\xb6\xd2\xb1\x45\x52\xe5\x78\x3d\x29\xfd\xce\x44\x71\xf4\x62\x6b\x98\x2d\x73\xac\x42\x62\x2b\x91\x7c\x8c\x28\x69\x51\x13\x88\x14\x64\x28\xc1\xe5\x9d\xdf\x22\xac\x3a\x36\x81\x6d\x31\xef\x5a\xd3\x29\x24\x56\x66\x5a\xeb\x76\x9b\xb5\xdb\x2d\xb9\x10\x8c\x22\xe7\x83\x45\xa4\xf3\x13\xe2\x62\xb1\x4a\x7c\xb8\x58\x0a\xad\x36\x36\xd1\xea\x1e\xdb\xa6\xc5\xe4\x1c\x87\x49\xfa\x25\x0b\x96\x7b\xfb\x50\x3b\x60\xe9\xc9\x2e\x9c\x3b\x97\x51\xc9\x82\x4a\x59\xfa\xd2\x4c\x8d\xc8\x3a\x3b\x63\xc0\x1d\x56\xec\x45\x4a\xea\x31\xa2\x92\xf7\xdc\x6e\x1d\x2c\x25\xf5\x28\xfa\xbd\x11\x44\xf4\x6d\xb4\x43\xf6\x88\xb8\xa3\x4a\xe6\xcc\x93\x32\x88\x75\x7a\x55\x78\x90\x66\xc5\xaf\x5f\x8c\x53\x1b\x9f\x34\x06\x54\x7e\xaf\x3c\xfe\x4d\x66\xda\x55\xb9\xaf\x86\xee\x9c\x9e\x5e\x4d\xb3\x39\xe5\x23\x1c\xda\x90\xa9\x10\xb4\x28\x07\x88\x46\x21\x88\xc9\xb2\xa0\x5e\x07\xb0\x5b\xb9\x40\xad\x24\x16\x52\x24\x48\xb7\x5b\x48\x07\x9e\xe7\xa5\x56\xec\x19\xd1\xa4\xb5\x80\xc3\xec\x99\x91\x83\xf3\x44\x42\x70\xab\x65\x6e\xb7\xad\x38\xf9\xfa\x97\xd6\xe5\x3e\xe0\x32\x02\xdc\xb8\x00\xdc\xb8\x02\xb8\xa7\x91\x02\xc4\xaf\xc7\x68\x17\x8d\x35\xc1\xa2\xb5\xf2\xde\xd2\x00\xb4\x3d\xcb\x4a\x4e\xa9\x19\xbe\x8a\x3a\xdb\xed\xd5\x64\xa5\x60\x61\x55\x82\x82\x04\xb9\x68\xb2\xda\x6e\xa7\xf3\xf1\xaa\xdd\x96\x5f\x8a\x89\x7a\xb1\x64\x51\xdc\x8c\xb3\xb4\x70\x3e\xda\x51\x69\x31\x8d\xe6\x24\x06\x4d\xe4\xcf\xb1\x42\xc8\xf2\xf7\xce\x62\xde\x74\x5e\x8b\xe9\x2e\x85\x8f\x0b\x9f\x05\xef\x52\x11\x16\xa7\xd5\xbf\xa0\x67\xf2\x18\x90\xe2\x45\x29\x6b\x2c\xd2\x64\x73\x3b\xd6\x18\xb3\xa2\xb0\x95\x7a\xd1\xfa\x7b\xf6\xbd\xf6\x0a\x64\xa9\xdd\xae\xb1\xf5\x1a\xec\xb5\x48\x0c\x39\x2d\xcb\x48\x9e\x34\xbb\x40\x2b\xeb\x23\xce\xf1\xa2\x3c\xe0\x78\x9a\xd5\xbd\xea\xcb\x0e\x1c\xab\x20\xb7\x63\x1f\xef\xdf\x24\xef\xcc\xb4\xa8\x75\x3e\xce\xb4\x87\x4b\x46\x94\x2f\xc2\x49\x3e\xea\x95\x7a\x95\x4d\xed\x39\xd9\xc7\xd6\x56\xe2\xf9\xba\x63\x5d\xa2\xe8\xed\xda\x4b\xf6\x38\xe6\xc0\x5b\x2b\x8e\xf9\x90\xde\x20\xb0\x62\x25\xea\xae\x0a\xb6\x98\x9b\xf7\xc9\x85\x30\x78\x49\x99\x13\x8d\x2d\x3e\xc1\xf5\x46\xc5\x69\xf3\x76\x9b\xe5\x96\xc9\xcc\x60\x56\x74\xe6\x98\x63\xb6\x33\xa6\xd9\xdc\x22\x4c\xa0\x48\xd3\x21\x22\xe3\x69\xa2\xa4\x30\x2d\xd6\xb0\x73\xa3\x72\xe7\x46\xd6\xca\x33\xd8\xc3\x3b\xd7\x5a\x7b\xe2\x32\x9e\x18\x95\x0d\x2c\x5f\x1e\xa3\x3a\xa7\x6c\x6f\xf3\x36\x13\x12\x73\xcc\x40\xe6\x34\x16\x30\x27\xcf\x46\x21\x82\x92\x7a\xd7\x54\xe4\xee\xba\x81\x44\xaf\xad\x54\x8f\x5b\x7f\x60\xcf\xdb\xa6\x95\x68\xf3\xb8\x47\x49\x94\x26\xfe\x8f\x09\x52\x99\x57\x54\x6c\x64\x56\x3c\xb5\xe7\x56\x3c\x75\x64\xe2\xce\x0b\x78\x60\x24\x26\xb1\x66\x31\xe9\x24\x93\xbd\x03\x3f\xb8\x87\x8b\x55\x8e\x6b\x9d\x5d\xc4\xd0\x11\x17\xd1\x7a\x05\xc1\xb3\x01\x32\x72\x2a\xa1\x11\x43\xf9\x5e\x96\xd8\xc4\x47\x08\xd7\x01\xba\xe5\xc8\x2f\x0f\x90\x2d\x27\xaf\x3d\x39\xc0\x30\xe3\x0c\x47\xc9\x34\x6b\x47\x42\xb7\xdb\x56\x92\x42\xba\x2f\x31\xe2\x5a\x2f\xcb\xbc\x78\xba\x3a\x8f\x70\xf0\x88\x44\xfe\xb3\xb3\x95\xc5\x9a\x8e\x5c\xb3\xe6\xd3\xe3\xb5\x83\xe0\x91\xa6\x9d\x91\x78\x0b\x4a\x42\x18\x8c\xe5\x16\x38\x2d\xcc\xca\x8d\x9a\x98\xd7\x9b\x75\x56\x06\x7b\x39\x89\x93\x58\xdc\xdc\x66\x77\x27\xca\x6a\x1f\x9e\xe4\x3c\xa8\x44\xd7\x37\x22\x5d\x08\x65\xa9\x49\xac\xe0\x3f\x19\x72\x84\x7b\xd3\xb9\xb5\xf1\x7c\x23\x2b\x01\x75\xa3\x00\x35\xf1\x36\x7b\x80\xba\xf4\x12\x05\xa8\x1a\x96\x58\x9a\x13\x23\xf2\x56\x56\xec\x2d\xa7\xcf\xe7\xed\xf6\xb2\x6e\x53\x40\xe8\x02\x4e\x88\xb3\xc6\x1a\xbf\x32\x96\xb9\x41\x24\x67\x23\x03\x6b\x2d\x77\xb4\xca\x5f\xec\xe3\x65\xa9\x26\xb8\x35\xef\x37\x17\xc2\xb8\x2d\xe1\x7f\xa3\xc3\xff\x2b\x83\x2b\x53\x5b\xac\xb0\x06\x83\x1a\x7a\x2b\x39\x5f\x73\x67\x5d\xd7\x99\xec\x9c\x38\x22\xfa\x5d\xb1\xd1\xad\x34\x37\xc5\xb2\xdb\xdb\xd5\x1d\x05\x5d\x2d\x42\x67\x28\x09\x1e\x24\xee\x4b\xed\x40\xa7\x03\x5b\x60\xb3\xc6\xbe\x65\x16\xa0\xeb\x7d\x45\xf5\xdd\xe7\x08\xee\xd4\x6e\xc2\x6c\x97\xb5\xe9\xaa\xea\x1c\x22\xaf\xd0\xbc\x15\xa7\x8f\x54\x24\x5e\xd3\x8a\x2d\xcd\x79\x22\xe7\x6c\xb3\xfd\xb0\x21\xc2\x73\x2e\xc5\xd3\xec\xdc\xbd\x3c\x3b\x13\x66\xa1\xbe\x33\xc4\x53\x7b\xbb\xad\xe7\x7e\xea\x89\x09\x65\x19\x97\x41\x44\xc4\x5c\x72\xe2\xa9\x14\xa5\xf2\xd3\x07\x66\x7e\xcf\xc5\xa5\xd2\x4d\x1e\xa2\xc1\xb2\xa0\xa2\xc2\xf5\x63\x4f\xe0\xeb\x99\x97\x7f\xa6\xf8\x85\x00\x30\xf5\xa3\x6a\x93\x2a\x2c\xba\x9e\x73\xb9\x2a\xa2\xaf\x5c\x9e\x9d\xe5\xd1\x30\xbc\xa6\x62\xd3\xd5\xb9\x33\xbf\x5c\x4b\x49\x62\xba\x9e\x7b\xe9\x74\x35\x57\x77\x15\xe4\xb8\xff\x34\x2d\xd9\x39\x15\xb5\xba\x00\x91\x67\x6a\xb6\xf3\x70\xc4\x9a\x18\xa3\x96\xa1\x72\xf1\x00\x55\x99\x5f\xc6\x5d\x66\x16\xa6\x95\x4a\xb0\xac\x21\xdf\x12\xed\xea\xb2\x90\x8a\xfd\x2b\xf3\xd7\xf9\xed\x03\x9a\xe0\x4c\x35\x9c\x83\x79\xce\xe7\x36\x83\x75\x71\x46\x55\xa3\x78\x96\xd8\xa9\x8b\xc5\x75\x12\x5b\xda\x4c\x2a\xfd\xb3\xfe\x3f\x8a\x37\x89\x2e\x36\x31\x1b\x05\x81\x04\x06\xaf\xf4\xb7\x38\x89\x37\x81\xb9\x9f\xfc\xcd\xf6\x96\x1a\x27\x6e\x8b\xee\x99\xe3\xec\x8c\x4e\x8d\x7d\x61\x08\xab\xf5\x55\x1e\xe1\xcb\x9c\xd4\x36\x4f\xbe\x59\x28\x18\xe6\x23\xb7\x47\xaa\xf9\xfe\xe0\xee\x1b\xfb\x32\x7e\x9a\x5d\xc6\x67\x67\x66\x2a\x65\x8d\x72\x1b\xc4\x20\x27\x51\xee\xb1\x70\x94\xf3\x34\x58\x23\xb4\xab\x6b\x39\x99\x69\x8e\x0d\x09\x76\x68\x5b\x75\x1b\xc7\x2f\xe5\x7e\xc0\x31\xcc\x12\xda\xed\xcb\xd5\xd3\x48\x87\xf6\x68\xba\x9a\x03\x9e\xe5\x0f\x80\xf4\x99\x33\x2f\x00\x51\xa8\x65\xcf\xa5\x74\x73\x67\xd6\x55\x74\xca\x62\xb1\x8c\xd6\xb8\x4b\x72\xfc\xaf\x9f\xb7\x66\xb5\x49\x69\x3c\xf8\xbb\x94\xc4\x0a\x52\xce\x48\x18\xb7\x28\x74\x0a\xfc\x02\xe2\xfc\x48\xf2\x19\x74\xd1\xab\xa7\x5e\x11\x7e\xa9\x53\x04\x6c\x07\x9f\xd9\x6a\x21\x6a\xde\xca\x8b\x26\x55\x57\xdb\xa8\x40\xa1\xc2\x1c\x9f\x3b\x66\xe5\xd6\xaa\x8a\x32\xfb\x21\x11\xaa\x51\xd5\x4e\xcb\x20\xdb\x97\x0c\x42\xeb\x33\x90\xa5\x9c\x99\xf8\x0c\x9d\x6a\xb5\xf1\x72\xbb\xb5\x3d\xef\x8c\x95\xdd\xb6\x29\x48\xd3\xda\x4a\x90\xeb\x1f\x7a\xd1\x2a\x41\x58\x7b\xe9\xb4\x8c\x3b\x35\x57\x23\x5a\x5b\xb6\xa5\xbd\x77\xe9\x14\x6f\xeb\x7f\x1d\xae\x27\x69\xac\x27\xa9\xd6\x72\xa6\x21\x46\xd4\xc8\xbc\x33\x66\x9d\x92\xa0\xc8\x08\xf5\xb0\x67\xda\x3a\xfc\xb9\xd3\xc9\x68\x32\x1f\x30\xd1\xa8\xc3\xcb\x5a\x0d\xbb\x1d\xf9\x6e\xe8\x08\x2e\xc7\x90\x13\x7b\x9c\x9a\x56\x2c\x11\xd7\x3e\xff\x4c\xb4\xbe\x8a\x5e\x0b\xc0\x25\x7e\xba\x19\xa3\xe6\xe2\x40\x65\x1f\xc5\x92\xf3\x62\x3a\x1e\x03\xbf\x5a\x18\x66\x0c\xcd\x90\x76\xee\x8c\x85\xf9\xec\xd9\x33\xdb\x3a\x24\x35\x46\xfa\xbe\x94\xec\x77\x83\xcf\x02\x3c\x62\x8a\x60\x16\x37\x4d\x90\xbf\xca\xad\xf8\xa6\x59\xde\x28\xeb\x48\xee\x9c\xbc\x21\xa2\x82\x0e\x52\xc8\xda\xd2\xab\x47\x56\xab\x86\x1f\x1f\xf4\x17\x20\xef\xef\xbc\x6f\x46\xea\x69\xdd\x33\xcd\x9d\xfc\xe8\x79\x51\x71\x53\xc9\xa9\x6e\x07\xcb\x2c\x48\x93\xa9\xd9\x6e\xab\x41\xb4\x5a\xe6\xf8\xa1\xf1\xd0\x38\x4a\x75\xa0\x15\xe7\xa3\x12\x35\x1f\x97\xb8\x38\x46\x6d\x4b\x04\x10\xef\x34\x85\x3d\x85\x49\x78\xfe\xc5\x8b\x2f\xcf\x7f\xfc\xe9\xe7\xb7\xff\xfb\x97\xbf\x33\xb1\x38\xbf\x49\x6e\xff\x79\xf7\xfb\x7c\x1b\x18\x93\xd3\x22\x56\xc2\x76\x23\x9f\x8e\x39\x0d\x7e\xac\x66\x70\x77\x66\xd5\x04\x48\x70\xd6\xfa\x82\x62\x36\x38\xf3\x76\x5b\x78\x9e\xf7\x5d\xe1\xe6\x26\xd1\xc1\x03\x40\xaf\xe2\xf4\x94\x50\x2f\x49\x46\xfd\x20\x70\xfd\xd8\x6f\x75\xb8\x9b\x7b\x43\xeb\xb6\xb9\x7b\xb2\x17\x8a\x8b\x54\x2c\xbf\xa9\x83\xd3\x92\xf2\x3d\x73\x1c\xa7\xeb\x38\xce\x43\x66\xd3\xfc\xf4\x09\x92\xdb\x24\x8a\xb3\x7a\x57\x51\xdd\x53\x0f\x07\xa6\x4b\x81\xab\x3c\x31\xfd\xb3\xf1\x3b\xbc\x9f\x64\xbe\x77\x47\x18\xee\x4d\xcb\x7c\xcc\xbc\x69\x26\xd4\x86\xbe\x31\x3f\x79\x2f\x4e\xe4\x94\x7c\xf5\xd5\x57\x5f\xed\x10\xa9\x20\xd9\x64\x64\xc5\xdc\xec\x1d\xb0\x3e\x3a\xaf\x53\xc4\xd8\x98\xcd\x9f\x34\x38\x65\x9d\xc8\x99\x9c\xb4\xa6\xb3\xd9\x7a\x36\xbb\x9a\xb7\x64\x05\xfe\x6c\xf6\x45\x6b\x67\xdd\x97\x95\x4e\xf7\xea\xd4\x9c\x78\x9e\x58\x5f\xeb\x79\x8d\xbd\xbc\xeb\xb3\xed\xbf\x4d\x7f\x9d\xc5\xf3\xcf\x67\xf1\x04\xb9\x61\x8b\x69\x7d\xdc\xcb\x79\xf1\xc4\xda\x73\x7b\x2f\xfb\xb6\xcb\x0b\xae\xf5\x01\x5f\xec\xc3\xd1\xbb\xd2\xeb\xb5\xe1\xdc\xbd\x25\xd1\x22\x11\x0c\x80\x51\x8d\x24\x2b\x89\xac\xc1\xf5\x4c\x58\xc8\x7f\xe6\x8c\xcf\x32\xa8\x47\xbc\x06\x8c\x07\xab\x74\xb4\xdd\x46\xcf\xf6\xaa\xd9\x97\xc7\xff\x28\x49\x22\x78\x2d\x88\x68\xe5\xc0\xb9\xae\x24\x88\xca\x93\x16\x71\xe9\x7d\x56\x58\x0c\xd4\x24\x28\x9f\xb4\x78\xae\x39\x4e\x99\x95\xf5\x6f\xda\xac\xc6\x8c\x9f\x35\x21\x91\x53\x03\xa8\xa3\xdd\x7e\xf2\x2b\xf4\x02\xb9\x4b\x91\x9c\xba\x76\x1b\x33\xf7\x74\x7f\x8a\x4b\x87\xf8\x96\xdd\x3a\x25\x24\xf4\x08\xe7\x83\x24\xc8\xd8\x2a\x47\x3d\x49\x7a\xe2\xff\xb1\x39\xc4\x46\xfd\x94\x2d\x65\xcc\x26\x6f\x26\x47\xa1\x8c\xe0\xa0\x84\xb2\x47\x0c\x26\x8a\x33\xb1\x10\xe9\x09\x5b\x9f\xa8\xa9\xc1\xb1\xe6\x26\x3c\x75\xfa\x80\x78\xdb\xa2\xe9\xcc\xd1\xf9\x76\xdb\x2a\xdc\x92\xf3\x77\x8f\xe9\x51\x2a\x70\xd1\x22\x3f\xf9\x90\xa4\xfc\x31\xfd\xaa\xb9\xd5\x3c\xb4\x95\x1e\xd1\x85\xb5\x6c\x09\xcd\x85\x49\x7a\x72\xb3\x59\x65\xd1\xed\x4a\xd0\x6a\xae\x0f\x2e\xe7\x1e\x78\x29\xfd\xb9\x33\x37\x8b\x0b\xe4\x74\x9b\xbf\x77\x6a\x5b\x12\x73\x1d\x47\x64\x06\xa9\xbc\xf6\xc9\x52\xb1\x13\x9b\x29\x82\x14\x0b\x11\xd3\x64\x6c\x1c\xe8\x19\x49\x62\x2d\x03\xfb\xae\x16\x2d\x23\xd6\x61\x11\x9d\x2a\x4f\xbf\xbd\x3a\x10\x35\x71\xd8\x1b\x39\xd5\xf3\x3f\x45\xb6\xa9\x3a\xb4\xfa\x6d\xfc\x9c\xaf\xd8\x4d\xcb\x52\x67\x45\x5a\xb3\x0d\x1f\x76\xd8\x74\xb6\xe1\x9c\x62\xb3\xf0\x5e\x08\xa4\x5b\xe4\x17\x0b\xc1\xe2\xeb\xef\x71\xbe\x69\x5d\x2d\x68\xdb\x7a\xc1\x4e\xad\xe0\x32\xa9\xb5\x63\xf7\x64\xf6\x50\xc5\x80\xa9\x67\x5f\x05\x4b\x71\x13\x05\x6c\x75\x4d\x07\x85\x6a\x6d\x75\xb8\x5e\x78\x50\x2f\x7c\xbb\x64\xbe\xc8\xa2\xe0\xfa\x8d\x04\xdf\x38\x43\xa8\xa6\xeb\xaf\x92\xf4\x66\xdd\xb2\x10\xbd\x64\xb6\x09\x7d\x94\x0e\xfd\x6e\x58\x29\x1c\xb3\x2c\x59\x45\x2c\xbe\xfe\x26\x12\x69\xb2\x58\xdd\xdd\x2e\x6b\x8d\x3b\x8e\x16\xbd\x46\xd4\x1b\x8f\x83\x48\xc4\xd9\xf5\xd7\xa9\x10\xef\xae\x5f\x6f\xd6\x18\xc4\xf7\x09\xf5\xa1\x36\x8a\xae\xac\x48\xa8\x8a\xba\xc7\x2a\x3a\x36\xe3\x5d\x9a\xf1\x61\x73\xf9\xc6\xf9\x53\x25\x47\x54\x32\xa8\x95\x4c\x99\x1f\x05\xc5\x44\xd9\x7d\x74\xd0\xee\x87\xe1\x7e\xae\xeb\x2f\x71\xa3\x93\xe0\xd7\xcf\xcb\x02\x43\x86\x02\xc3\xc6\x02\xaf\x59\xb6\x14\x37\x2c\xc3\xbc\x68\x4b\xd5\xbc\xce\xbe\x3e\x43\x61\x53\x3f\x1b\xd6\x58\xeb\x4b\xe8\xf7\xb0\xca\xbc\xb1\x2f\x0d\x45\xbf\x28\x8b\x8a\x01\x8a\x8a\xc6\xa2\x57\x9b\x5b\x15\x5b\xbf\x1c\xf7\x00\x6d\xd9\x83\x41\xad\xc0\x8d\x88\x23\x16\x97\xf9\x7a\x1d\xe4\xeb\x0d\x6b\xf9\xd2\xe4\x43\x09\x9f\xae\x83\xd5\x71\x9d\x5a\xf3\xef\xc5\x3a\x63\x35\x40\xb2\xdd\x23\x7b\xe9\x0b\xb6\x8a\x62\xb1\x16\x45\xcd\x0e\x41\xbe\xe3\x57\xfb\xf9\x05\xbb\xd9\xdc\x14\x99\x58\x1f\x8b\xc8\x6a\xab\x8e\x4c\x95\xc1\x57\x76\x06\xd3\x77\xc6\x5e\x3f\xd6\x51\x70\xfd\x1d\xcb\xa2\x62\x2a\xec\xf3\xd9\xc7\x7a\x27\xd6\x6b\x76\xfd\x96\x2d\x9b\x2a\x16\xbc\x11\x0e\xbe\x60\x19\x7b\xa7\x8d\x2e\xa0\xd1\xd5\x3a\x2e\xe2\x05\x5b\x45\xe5\x22\x8c\x86\x58\x84\x51\x2d\xdb\x92\x45\xef\xd6\x9b\x77\x51\x6d\x82\x07\xda\xc0\x82\x7e\xad\xfd\x55\x12\xbc\xbb\xfe\x52\x5d\xe3\x53\x2e\x60\x0f\x2d\xb8\xbd\x51\xb5\x85\xe4\x36\xb9\x49\xc2\xa4\xc8\xd7\x71\x50\x6d\xc7\x71\x1b\xf3\x15\x3b\x4c\x2b\xc0\xa8\x80\x5f\x2b\xf0\xf1\xfa\x65\xca\x3e\x48\x06\xa0\xec\x83\x4d\x7d\xa8\xcd\x72\xca\x96\x37\xf5\x21\x76\xf5\x21\xd6\xb0\xda\x17\x29\x8b\x56\x2b\x71\xfd\x26\xf7\x4a\x2a\x1a\xa0\x98\x5e\x6e\x6d\xaf\x7f\xb1\x59\xd4\x60\x8e\x11\xcc\x31\xa7\x96\x6f\x19\x95\x03\x73\x06\x40\x65\xce\xa0\x57\xcd\x74\xf7\x3b\x8b\xb3\x28\x16\x05\x3a\x6d\xc6\x15\x95\x01\xd4\x60\xe4\xc5\xdf\x5e\x5d\xbf\x48\x6e\x6e\x59\x16\xf9\xd1\x2a\xca\xee\xca\xd9\xec\xd0\xf4\x77\xaa\x23\xd8\x2b\x50\x27\x1f\xa2\x43\xd8\xa1\xfb\x40\xb1\x6f\xb9\x48\x16\x29\x03\x15\xc9\xcb\x8e\x88\xf4\xb0\x87\x9a\x2c\xcb\x1e\xdc\x72\x03\xa1\x6f\x39\x67\x7f\xd4\x3f\x32\x2e\xe7\x6c\xdd\x84\xb1\x5c\x41\x20\x2a\xf6\x3b\x72\x95\xa5\xc9\x3b\xb1\xd6\x80\x2e\x20\xa0\x13\xfb\x59\x69\x35\xae\x9f\xc7\xfc\xfa\x8d\x64\x38\x36\x8a\xd6\xe5\x45\x6d\x9a\x61\xbb\xb3\x57\xf4\xe7\x38\x0a\x23\xc1\x9b\x26\xa9\x4b\x58\x7f\x14\xee\xf7\x6d\xbf\x14\x6d\x92\xb5\x44\xe3\x25\xee\xef\x74\x51\x43\x97\xfb\x9f\x56\xc3\x17\xe5\x0c\x23\x6a\x1d\xd1\xd7\x61\x7f\xb8\x17\xb5\x0e\xaf\x47\xfa\x02\xf0\xfd\x05\x38\xda\xd6\x8b\xea\x6a\x52\x65\x61\x25\x30\x9e\x7c\xcd\xa8\x07\x41\x73\x0f\xb8\xfe\xb6\xf3\x89\x3d\x78\x59\xeb\x01\x71\x56\xdd\x5a\x13\x3a\x94\x05\x0d\x50\x76\xb4\x89\x2f\x6b\x4d\x50\x65\x6e\x7d\x90\x21\x06\x39\x70\x1b\x07\x39\xe8\xe8\xd3\xcc\x3e\xb1\x07\x5f\xd5\x36\x0d\x2a\x13\x7e\xad\x07\x83\x2e\xf5\x60\xd4\xdc\x03\x9d\xb8\x85\xa2\xd6\x03\x96\x46\x7b\x54\x19\x4c\x96\x60\xcd\x90\xc1\x36\x01\x5b\x4b\x3e\xf3\xf9\xca\x67\xf1\x7e\x61\x30\x99\xbc\x43\x1c\x5a\x8d\xe2\xbc\x58\xb2\x77\x37\xac\x09\x7f\xe7\xec\x77\x77\xaf\x80\x46\xda\x09\x17\x33\x56\x45\xb3\x2f\x96\x42\x6e\x79\x0d\x67\x77\xd0\x75\xa7\x8e\x19\x55\xbe\x26\x84\xc2\x7c\xf0\x4c\xcc\xf7\xeb\x45\xd6\xeb\x03\x58\x5b\xe8\x1c\x5e\x7d\x9c\xc9\x8d\x1f\xc5\x51\xbc\xb8\x7e\x19\xb1\x20\x8d\x88\x69\x7c\xcd\xd2\x77\x25\x9e\xb0\x09\x7f\xdb\x9d\x7e\xf8\xc8\xa2\xfb\x14\xd5\x61\x3e\x51\xa7\xf0\xd1\x75\x7c\x95\xa4\xe5\x80\x72\x74\x6a\x83\x41\x71\xed\xc7\x57\xd3\x30\x87\x0e\x27\x06\x86\x1f\xaa\xe5\x1b\xb6\x0a\x6b\x93\x10\x0a\x97\xa8\x91\x5b\x2f\x73\x93\xc4\xd7\xdf\xc6\x3c\x0a\x94\x08\x51\x23\x63\x6c\x08\x08\x63\xc3\x1a\x6e\x4e\xe2\x2c\x4d\x56\xd7\x6f\xa2\x00\x2e\xeb\xe5\x10\x09\xa7\xba\xdd\x7a\xfe\xdb\x4c\x13\x19\xdc\x80\xe8\x4a\x50\x1f\x82\xcc\x75\xfd\xe5\x2d\x0b\xb2\x63\x12\x8d\x10\x8d\x7c\xde\x8b\x64\x23\xd9\x80\xc5\xf5\x8f\x09\x97\xc5\x45\xca\x9a\x79\x80\xb0\xdf\x28\x17\xbe\xd8\xc4\x22\x0a\x93\xb4\x2e\x88\x0e\x6b\xbb\xbd\xb1\x4c\xde\xdf\x7d\x2a\x57\xa9\x6b\x74\x84\x89\x7a\xb1\x49\x53\x11\x07\x77\x0d\x70\xc3\x08\x6e\x82\xea\x74\xdd\xdd\xa6\x51\x22\x25\xb8\xd5\x8a\xf9\x2c\xbd\x6b\x62\xfa\xf3\xb6\xea\x68\xff\x2e\x8d\x56\x2b\x5d\x8a\xa3\x85\xb3\xbb\xb5\x25\x51\xf9\x9a\xe4\x38\x97\x63\x1d\xdc\x3a\x20\xee\x15\xf9\x42\x93\x1a\xba\x24\x35\x8c\x1e\x28\xf2\xa2\x04\x77\x82\x15\x27\x18\x36\x17\x69\x12\xb4\x88\xab\xb5\x7b\x55\x68\x7f\x29\xd6\x22\x15\x59\x13\x1e\xcd\x67\xa9\x86\x16\x5f\x8a\xf7\x2c\x66\x0b\x96\xea\x72\x01\xd5\x3d\x1a\x84\xcd\x39\xf7\xb1\x07\x1b\x0a\xda\x43\xd5\x79\x7a\x19\xc5\x0b\x9f\xe9\x02\xc1\x80\xf6\xce\xa0\x8a\x1c\x5f\x4a\x72\x55\xeb\x74\xff\x58\xa7\x93\x9b\x28\x4e\xae\x7f\x8a\x56\xa2\x0e\xfd\x01\x8a\x11\xcd\x08\x46\xb5\x62\x9b\xdb\x55\x72\x57\x27\x33\x6e\xa8\xb7\x54\x2b\xf2\x25\x4b\x57\x77\xd7\x2f\xef\x62\xb6\x96\xfb\xf6\xd0\xfe\x21\x98\x1f\x36\x12\x9e\x2f\x17\x77\xb7\xd9\x51\x6d\x8a\x1d\x34\x11\x5b\x5b\xe7\x69\x02\xb7\x56\xe9\xca\x67\xeb\x03\x04\x53\xd1\xbf\x7a\x89\x9b\x24\x8b\x82\x24\x6e\x54\x23\x1d\x50\xc0\x7c\x19\xd3\x45\x62\xa4\xa4\x88\x25\xbe\xa9\x81\xe3\xfe\xdc\xe7\xcd\x87\x8f\xa8\x4a\x47\xaa\x7d\x42\xaa\x55\x00\x2a\x4a\x49\xf6\xe6\x3b\x21\x25\x2f\x42\x3f\xaf\x93\x38\xd3\x38\xe5\x8e\x4b\xfc\xb5\x7b\xa0\x78\xc1\x11\x3d\xd8\xfd\x03\x8a\x96\x2f\xb3\x65\x94\xdc\x6a\xc8\xc4\xa1\x16\x9d\x4e\x75\x93\xe4\xf9\xf6\xb7\x88\xcb\x89\x20\x70\x7e\xbc\x80\x86\x7d\x18\x69\x29\x98\xef\x36\x17\x69\xa2\x9c\x1d\x42\x25\x9d\x2a\xf6\xf9\x5a\xc4\x92\x54\x34\xca\x26\x2e\xc9\x26\xae\xdd\xaf\x15\x49\x6e\x44\x86\xf5\x5e\xb2\x5b\x9d\xfe\xf5\x08\x55\xf7\xc2\xa3\xf9\xb5\x19\x68\x50\x5b\x0e\x1b\x49\xcd\xd7\x22\x49\x17\xba\x9e\xc8\x21\xb2\xe0\xd8\x7b\x6d\x21\x5f\x03\x1b\x13\x8c\x08\x95\xfa\xcd\x05\x9a\x24\x40\x82\x58\x97\x57\x67\xf9\xeb\x15\x5b\x24\xab\xa8\x4a\xd3\x29\x67\xd0\x3b\x90\xf3\x30\x6c\x0d\x8f\xec\xe5\xaf\x93\x6c\x29\x5b\xd9\xe7\x02\x42\xc2\x63\x61\x6d\x5b\x7e\x9d\xb2\x38\x5b\x36\x32\xbf\x07\xf4\xc1\xa4\x41\x95\x1b\xa7\xc6\xa6\xd8\x9d\x01\xb1\x8e\xb5\x09\x46\xfe\xfd\xd9\xa5\xea\x9d\x9a\x40\xfa\xf5\xe6\x37\x96\xb2\x4c\xa3\x20\x8c\x34\x4b\xac\x9e\x2f\xfe\x8d\xad\xd8\xf5\xd7\x49\xcc\x1b\xb5\x4b\x9c\xb8\x16\x5e\x93\x6d\xbe\xde\xa4\x37\x9b\x77\x4b\xbd\x7e\xa2\x50\xac\xba\xf9\x24\x57\xf8\x21\xe2\xd9\x12\x23\xfd\x6a\xb3\x5a\xd1\x53\x4d\x6d\x41\x83\x08\x43\x51\x2b\x1c\x2f\x36\xab\x9a\xf6\xe1\x6f\xec\x46\xd7\x52\x75\x48\xfe\x1f\x36\x15\xac\x64\x75\x48\xa1\xe5\xd4\x34\x97\x5a\xd6\xc6\xfd\x3e\xc2\xf8\xd9\xa8\x3e\xac\x86\x52\x25\xc3\xc1\x07\x24\xc4\x0d\x1a\xdb\x22\xce\x69\xa5\xed\x5f\xa6\xc0\x70\xc0\xea\xf9\xa3\x30\xba\xfe\x31\x59\x46\xf1\xe2\xae\x0e\x5c\x9d\x23\x86\x8d\x6f\x58\xbc\x89\x13\x6d\xf0\x03\x97\x74\x58\x9d\x5a\x03\x59\xda\xac\xb5\x0d\x44\xa3\xc2\xea\x1b\xe1\xa7\xe2\x83\xc6\xf2\x8c\x88\xe5\xa9\x8d\x33\x5a\x2c\xaf\xdf\xa4\xd1\x7b\x96\x89\xeb\x9f\xd7\x52\x26\x4b\xd3\x64\xc1\x32\x6d\xc8\xdc\x27\x7c\xe3\x37\x14\x6d\xca\x9e\x47\xe9\xaf\xad\x43\x94\xb2\x05\x8b\x99\xa6\xd5\xe9\x92\x56\xa7\x8a\x6c\xbf\x7d\xf3\xbc\x94\xbb\x35\x29\xcd\x25\xdd\xb8\x5b\x9d\x77\x9d\x34\xbd\x14\x6b\x84\x05\x85\x5a\x24\x8f\x29\xa1\x61\xde\x30\x04\xfe\xa9\x6d\xbf\x0a\x71\x3b\xa4\x88\xaa\xa8\x92\x61\x52\x08\x45\x23\x0e\xfe\xf6\xe6\x56\xa4\x11\x5b\x5d\x3f\x4f\xd9\x0d\xdb\xc3\x4b\xb4\x60\xa4\x1b\x09\x6a\xa6\x31\x12\xb2\xae\xa2\x3b\xf6\xcf\x66\xd9\x86\x6c\x19\xc1\x80\x4a\xfb\xf5\xd2\xc5\xe0\x25\xa5\x62\xcb\x15\x7b\x5f\xc7\x12\xee\x11\xd9\xa6\x5e\x3e\xcd\x96\xfb\x2a\x05\x57\x57\xed\xd4\xba\xff\x37\xf6\x9e\x55\x34\xb6\x8c\x14\xe4\x6c\x54\x25\xd9\xaf\x58\x94\x2d\x9b\x55\xc7\x04\x66\x41\xcd\x9a\xf4\x8a\xc5\xac\xb2\xdf\x2b\xec\x67\x70\x84\x69\x43\xc9\x43\x44\xc5\x0d\x8e\x68\x7b\x5f\xb1\xd8\xdf\x68\x0a\x48\x32\xa5\x74\x9c\x51\x6d\x28\xf1\xe2\x63\x54\x28\x48\x35\x48\x23\x4a\x17\xd6\x47\x1e\xc7\x8c\x97\x1b\xc0\xa6\x01\xdb\x35\x21\xf7\x15\xcb\xd8\xbb\xea\x46\x21\x75\xbd\xdd\x9c\xef\xfa\xcd\x32\x89\x61\x01\x6b\xd8\x36\x1d\x27\xa4\x9e\xd7\xcb\xde\xb1\xe5\xf5\x77\x91\xb6\x58\xc4\x2c\x8d\xaa\x64\xfc\xd5\x92\xa5\xc9\x7a\xb9\xbf\x60\xae\xce\xed\xd5\x20\xe1\xd5\xf2\x46\xa4\x1a\x3e\x23\x9e\xaa\x86\x60\x91\x69\x4f\x90\x75\x46\xd8\x56\xce\xa8\x9e\x39\xf9\x6d\xcf\xa2\x72\xcc\xf6\xf9\x6a\xb9\xe1\xec\x03\xdb\xa3\x93\x5d\x4d\x6d\x57\x67\x52\xbf\x63\x25\x12\xb6\x49\xaf\x6d\xd7\xf4\xda\xb0\x3d\x5d\x3b\x0d\x7c\xd0\x47\x99\xff\x63\x53\xee\x26\xfb\x26\xd1\x37\xdb\x19\x1c\xcd\xcf\x79\x44\xdb\xb1\x9c\x1e\x1a\xae\xd3\xd8\xad\x06\xe2\x66\x3b\x34\x0c\xb7\x7b\x2c\xff\x0b\x8d\x45\x23\x39\x22\x38\xda\xb1\x97\x25\xd4\x10\xad\x62\x83\xa3\xfd\xf9\x52\x63\xc9\x49\x59\xe4\x57\x99\xe5\xef\xc4\x6d\xb0\x64\x1a\x17\x4a\xa3\x0c\x6a\xbd\x86\x00\xb3\x8a\xde\x89\x7d\xfd\x07\x4d\xa8\xeb\xd4\x4a\x44\x37\xfe\x46\x83\x2d\xaa\x76\x54\xcf\x14\x0b\x96\xd6\xf1\x0a\x09\x83\xa2\x99\x1f\x54\x45\xbe\xc8\x05\xa3\x9b\x46\x25\x54\x8e\xce\xea\x60\x96\x17\x3e\xa4\x95\xb1\x8f\x68\x80\xbe\x8b\xd6\xe5\x80\x58\x17\xda\x42\x56\x93\xfa\xbe\x4b\x3e\x34\x92\xe5\x52\x42\xae\xe4\xbe\x0b\x0e\xe9\x9d\xa9\xff\xa2\x26\xd3\x7f\x77\xc7\x0f\x10\x06\xee\x36\x32\x38\xaf\xd9\x92\xfd\xc6\xe2\xc6\xad\xc8\x7b\x54\x64\xb0\x57\xe4\xb7\x24\x5e\x1c\x51\x51\x34\xcb\x02\xaf\xd9\x3b\xb6\x66\x69\x13\x73\x7c\x40\x25\xf8\x9a\xad\xd8\x1d\x5b\x69\xca\x6d\x9b\x88\x89\xcd\xab\x7b\xe0\x35\x8b\x39\xd3\x59\x7f\xb2\xea\xd8\xc3\x5e\x3d\x5b\x14\x2c\x99\x68\x9e\x21\x11\x1c\xe8\x44\x1a\x2c\x45\xbd\xc4\xe0\x08\xb5\x7f\x2d\x87\xc9\x6e\x8e\xc8\x02\xcd\xee\x37\xfb\xbe\x13\x85\x5a\xa2\x51\xb7\xde\x3b\xa2\xd9\xac\xd4\xf5\xc3\x2d\x85\xe1\xd5\xf6\x24\x89\xf8\x6e\x4d\xa9\xf0\x9a\xdd\x91\xff\xcf\x41\xe5\xeb\xa1\x95\x12\x5c\x84\x2c\xe2\x69\xd4\xc8\x8f\x89\x6e\x23\xb4\xbe\x16\x22\x13\xd1\xf5\x6b\x76\x27\xde\x69\x68\x28\x20\x34\x54\xeb\x9a\x96\xb7\x89\x96\x32\x46\x6a\x3a\x56\x2f\x16\x73\x71\xfd\x2a\x7a\xc7\xde\x6d\xa2\x26\x57\xa8\x1c\x58\x79\xbd\x6b\x69\x12\x91\x5a\x0c\x77\xb6\x36\x6e\x29\xd6\xa8\x0e\x2a\x8a\x1e\x56\x8a\x51\x71\xa5\x53\xab\x4f\x4a\x24\x49\x5d\x03\x4f\xab\x16\x7a\x2f\xfb\x3a\x10\xab\x15\x8b\x45\xb2\x59\x57\xdd\x6f\x0a\x86\x59\xd3\x51\x06\xa4\xa3\xac\xca\x87\x8f\xa8\xa3\x24\x5b\x2e\x71\x8e\x6e\x8d\x0b\xa8\xd6\xb1\x47\x03\xc8\xcb\xc8\xed\x3f\xa2\x10\x18\xfc\xba\xbb\x0c\xa9\x8b\xdc\x3a\x50\x1c\x2c\xff\x26\x0a\xb2\xc2\xe6\xbc\x8f\xa2\xc2\x9a\x42\xb2\xa3\x2b\x24\xf7\x16\xb4\xd2\xca\x4f\x22\x58\xc6\x72\x6e\xca\xce\x91\x8d\xca\xad\x29\x1a\x5e\x27\x7b\xbb\xbf\x77\x84\x31\x7b\xad\x42\x6a\x5d\xff\x94\xc4\x22\x57\x08\x6a\xc4\x9c\x58\xc0\x81\x53\x6b\x23\x5e\xc0\x9f\xad\x24\xa4\x24\xe0\x39\x43\xd6\x9c\xf1\x20\xcb\xad\x3a\x47\x02\x48\xdd\xef\xed\x75\x5a\x87\x49\xa6\xef\xeb\x9a\x61\xef\xf5\x66\x95\x1d\xa0\x29\x39\xdd\x62\xf5\x12\x0f\xba\x7e\x1c\x50\xbe\xbe\xbe\x63\xf1\x0d\xd3\x38\x5a\x52\xf9\x39\x35\xc1\x55\x65\x6b\x54\x4d\x30\x52\x4d\xd4\x34\x2e\x7b\x25\x34\x3b\x08\x31\xc2\xac\xb6\x05\xbe\x7f\xa5\xf1\xa8\xb4\xd3\xec\x1a\xf3\xf5\x3d\xf3\x59\x76\x88\x00\xe5\x3c\x49\x6d\x6e\xbe\x17\x1f\xae\x7f\x62\xd1\xf5\x77\x1b\xcd\x78\x4b\x9b\xd0\xa9\x89\x6f\xdf\x8b\x0f\x75\xed\x46\xef\x08\xc3\xd2\x68\x33\x74\x9d\x1e\xb1\x6b\x55\x55\xd0\xf7\x9b\xf5\x72\xd3\x28\xde\x0d\x1a\x29\xc2\x0f\x0b\xdd\x28\xed\xf4\xa9\xbf\x35\xcb\xd1\x0f\xab\xeb\x17\xcb\xe8\x5d\xa4\x71\x97\x3d\xe2\x2e\x07\xb5\x7c\xfc\xfa\x9b\x4d\xbc\x68\x32\xc3\x77\x8e\xb0\x73\xb2\xdc\xb7\x19\x5b\x1d\x50\x41\x2a\x24\xe0\xee\x17\xfa\x3e\x49\xb3\xe5\x35\x9c\x01\x0f\x30\x0b\xcd\xfc\x97\x2c\xfb\x46\xa4\x37\x07\x1a\xec\x35\x72\xac\xaa\xd0\xfa\x00\xab\x17\x12\x99\x09\xf9\x7e\xa9\xab\x64\xd1\xc0\xef\x75\x1e\x18\xdc\x55\xb2\x79\x60\x70\xcd\x48\x40\x96\xfd\x69\x93\xbe\xdb\x1b\x5c\xe7\x88\x3d\xeb\x87\x5b\x22\x24\x85\xce\xe7\xfa\x47\x11\x24\x8b\x38\xaa\x2a\xea\xbb\x5d\xb2\x91\x54\x19\xb6\x1f\xd2\xe8\x4e\x13\xc9\x89\x08\xd8\x35\xdd\xd5\x0f\xa9\xfc\x15\x67\x6c\x75\x5d\x1a\xe5\x1a\xec\x40\xbd\xe6\x41\xad\xd9\xa2\x4e\xdd\xc9\xa8\xe8\x37\x83\xd4\xfa\x86\xc5\x7b\x3a\x44\xe7\xc8\xfe\x7d\xc3\x96\xec\xc3\xf2\xfa\x9b\x9b\x24\x5e\x34\x21\xd1\x7c\xa5\x86\xf5\x62\xab\x9b\xbb\x54\xc4\x8d\xac\x07\x89\x82\x7b\x1b\xfa\x0d\xdb\x5c\xbf\x88\xe2\xeb\x6f\xd8\xa6\xc9\xe4\x78\x80\xc3\x7d\xb3\x64\x8b\xf5\xf5\x1b\xa6\x99\x3c\xc9\xce\x3b\xac\x4e\xf4\x9b\x25\x8b\xd6\x59\xb2\xbe\x7e\x19\xad\x1b\xe1\x9b\xf3\x46\x14\xfd\x66\x99\x88\x38\x6a\x90\x64\x5c\x1d\xaf\x3b\x7b\x85\x0e\xea\x4d\x1c\x2a\xe3\xf0\x7a\xff\xf6\x8a\x34\x7b\x60\x10\x2e\xaa\x39\x8e\xbd\x59\xb1\xbb\x28\x5e\x5c\xbf\x60\x29\x6f\x16\x6b\x58\x23\x40\xe8\xfa\xd9\xe7\xa9\x28\x67\x51\x10\x25\x0a\x6b\x86\xe3\x37\x6b\xb6\x92\xdb\xe0\x98\x16\x50\x99\x90\x6a\x80\xf4\xa3\xf8\x8d\x69\xde\x9f\x6c\x44\xf2\xfa\xa8\xba\x67\x7e\xdc\xdc\x44\x39\x0b\x7f\xc0\x3d\xbc\x73\x64\x93\xff\xb8\x89\x75\x53\x20\xf9\x09\x3b\x35\xbe\xed\x8a\xdd\xb0\x34\xca\x74\xaf\x67\x62\x3b\xec\x9a\xa7\xc9\x15\xdb\xa4\x6c\xbd\xcc\x52\x1d\xb8\x48\xf3\x38\xac\x92\xae\x2b\x89\x1f\x78\xb3\xd7\x93\x62\x94\x6b\x08\xf0\x6a\xc9\xde\x1f\x70\xac\x22\x2a\xb2\xb7\x3d\xae\x96\x12\xad\xb3\x98\x83\xe4\xb1\xec\x5a\x39\xc2\xac\x1b\xad\xe6\xac\x71\x37\x5f\x45\x9c\x2f\xeb\xa7\x2a\x88\xca\xe6\xfd\x0c\xeb\x25\xe2\x25\x5b\x69\x68\x8c\xf2\xd9\x35\xc7\x0b\x95\xed\xfa\x79\x1a\x2c\x59\xe1\xd0\x53\x5f\x3a\x9a\x10\xd1\xdc\xd0\x0d\x5b\xad\x30\xb4\xeb\xb7\xa0\x94\x99\xee\x42\x44\x9e\xf2\xa2\xaa\xdc\x39\x46\x40\x94\x81\xae\xc6\xdb\x5d\x25\x29\xbb\xbe\x4a\x6e\x6e\x45\x1d\x9b\x29\x3d\x31\x6f\xdc\x25\x57\xc9\x5d\x72\xe3\x27\x8d\x58\xa9\xd7\xc8\x12\x5e\xd1\x69\xa7\xeb\x82\x2f\xae\xb3\xc4\xb6\xeb\x93\xfe\xac\x36\x8f\xb7\x22\x88\x74\x85\x6f\x48\xa6\x85\xb0\xa6\x5b\xb9\xda\xc4\x9c\xd5\x3c\xe7\x09\x31\xd4\xdc\xdb\x8a\x8c\x8d\xc8\x24\x20\x77\xae\x20\xa8\x95\xb9\x15\x29\xe9\xec\x49\x1e\xb9\xda\xf8\xea\x51\x33\x4e\x83\x73\x72\x6b\x9c\x6a\xd9\x08\x0c\x15\x52\x0c\xaa\x48\x70\x64\x27\x19\xd4\x07\xb3\x5f\x48\x17\xd9\x48\x40\xa9\x19\xdf\x9a\x0a\xbd\x68\xf2\xdf\x3b\xa0\x87\xaf\x94\x7f\x48\xe1\x40\x66\x4d\x97\x1d\xe9\x77\xa3\x05\x9f\xa4\x25\x57\x1c\xe9\xfa\xe3\xe4\x3e\x71\x44\x88\xd0\xaa\x4b\xef\xae\xeb\x18\x5d\x57\x3f\x4e\x35\x8b\x9b\xbf\x77\xd1\xf5\x27\xd4\x59\x73\x43\x26\xa5\x47\xd3\xe5\xd9\xd5\x3a\xb3\x2c\x89\xaf\xaf\xa2\x45\xfc\x1f\x69\x94\x45\xf5\x2d\xd8\xe9\x1f\x71\xa3\xbd\xba\x5b\x25\x59\x74\xfd\x3d\x5b\x68\x0e\x51\x8c\xf0\x36\x1b\x56\x4d\x0b\x57\x77\x69\xc4\x34\x7d\x1a\x49\x9f\xf6\xa0\xdb\x90\xab\xd1\x87\x6b\xd8\x27\x72\x50\x45\x37\x3f\xb1\x05\x5b\x25\x0b\xcd\xfc\x40\x84\xbc\x26\xd5\xfe\xc4\x16\x3e\x8b\x3f\x68\x4a\xe7\x41\x9f\xf2\x0d\xea\xf9\xaa\xab\xec\x77\x8f\xe9\x67\x21\x44\xe9\x32\x14\xc9\x1a\xa3\x7a\xa5\xd1\xf5\x4f\x15\xd9\x85\x91\xcd\x97\xb1\xbd\x7c\x6f\x23\xa1\x79\xc7\x92\x67\x00\x63\x7c\x2f\xdf\xff\xde\xb0\xf8\xfa\x6f\x12\x9b\x1d\x11\x70\x73\x3e\xb0\x57\xef\xf5\xbb\xb4\x59\x8f\xa0\x44\x90\xa0\x9e\xff\x26\x5a\x69\x3c\x33\x11\x9b\x9a\xe2\xe4\x27\x16\x2f\x36\x59\xcd\x13\xde\x09\xe0\x20\xed\x3a\xc7\x40\x90\x4a\xc2\x97\x20\x89\xe9\x44\x4c\x85\x76\xea\x6e\x8b\x75\x46\xf3\x27\xb1\xda\x2c\x36\x9a\x89\x8d\xa0\xaa\x26\xec\xfd\xb4\x64\xba\x81\xcd\x26\x13\x95\x5d\xf3\xab\xfb\x69\xc9\x34\xa7\x09\xc2\x12\x76\x0d\x4b\xfc\x14\xf9\xa2\xc2\xa4\xd0\x14\xdb\x35\x4a\xf0\x53\x14\x46\x31\x5b\x2c\x35\xb7\x19\xd0\x3e\x97\xd7\xab\x4b\x97\x9b\xac\x59\xc0\x1e\x36\x6a\x11\x7f\x4a\x59\xbc\xbe\x4d\xd2\x8c\x1c\xbb\xd8\xed\xb1\xf3\x8e\xf9\x7a\xd6\x26\xed\x67\x29\xf5\x66\x07\x04\xca\x61\xa3\x4e\x30\x77\x96\x7f\xc1\x62\xc6\xe1\x84\xee\x27\x69\xb4\x88\x62\x96\x3b\x4d\xe8\xfe\x69\x0e\xf9\x8e\x3a\xfd\xea\x68\x1f\x55\x49\x83\x1f\xcd\x90\x9c\xad\x6b\x5c\xef\x5b\x6d\xb5\x18\x39\x78\xb2\x7e\xa7\x96\x25\x8d\xe8\xac\xde\x95\x58\x89\xa0\x42\x3e\x42\x5a\xe0\x50\xd8\x0f\x15\x39\xa4\xdf\x52\xa8\x21\x27\x00\x35\x07\xff\xb7\x82\x1f\x10\x35\x88\x9f\x71\x6a\x66\xe0\xb7\x22\x25\x4a\x57\x3f\x36\xe4\x50\x37\xab\xf8\xec\x3f\x58\xca\xa4\x64\x11\x65\xf5\x8d\xdc\x3f\x22\x58\xfc\xd2\x60\xbc\x66\x5d\xd8\xba\x59\xb7\xca\x6e\xfc\x12\x35\x39\xc3\x90\xfc\xc1\xba\xc3\x5a\xde\xdf\xe0\x66\x2e\x3e\xb2\x45\xca\x6e\xf6\x54\xb5\x5d\x72\x50\xef\xd6\xd8\xd3\xbf\xb3\x98\xf9\xec\x77\x96\x5e\x5f\xfd\x73\xc3\xd2\xba\x54\xda\x3f\x62\xef\x2d\x8e\xe8\x37\x8a\x21\x0a\xea\xfd\x50\x02\xb2\x5f\x55\xcb\x52\xb5\xa5\xb9\xa4\xaa\x74\xdf\x96\x16\x95\xbd\x82\x5c\xf7\x95\xed\xa8\xb7\xae\xdb\xa4\xfb\x75\x75\xf5\x05\x1f\xe6\x6f\x83\xda\x09\x8d\x6d\xe9\xec\x56\x1e\xc3\xa8\x0a\xd5\xdb\xd2\x11\x44\x3b\xa9\xb1\xd5\x0e\x42\x0c\xca\xa6\x81\x72\x69\xf0\xc3\x61\xa7\xf1\x4c\xca\x50\x3f\xf3\x46\x9e\x72\xf3\x9d\x85\x7b\xa5\x1f\x38\xfb\x2d\xd9\xb8\x55\xc4\xd6\xe3\xd6\x0f\xd9\x52\xa4\x2d\x2b\x5a\x7f\x71\x73\xfb\x1d\x5b\x67\xe3\x53\x5b\xad\xb4\x7d\x3e\xfb\xe8\x84\xb3\x8f\x83\xf0\x7c\xf6\x71\x14\xce\x3e\x32\x0e\xa7\xb9\x21\xd2\x91\x4c\x09\xf3\x76\x86\x1d\xa4\x3e\x52\x64\x62\x2e\x1d\x74\x95\x69\x6f\x80\x74\x88\x33\xaf\x3e\xd2\x80\x5c\x9a\x64\x1a\x0c\xe1\xd8\x14\x84\x32\x15\x3e\x1e\x84\x80\xaf\x53\x0f\xe7\x8e\xed\x9e\x4c\x9d\x00\xa9\xac\xbc\xcf\x39\x38\x0e\x81\x34\x04\xdb\xe1\x23\x0d\x40\x06\x5c\x45\x0d\xa0\x5d\xc5\x87\x50\x7e\x18\xba\x02\x69\x48\x52\x28\xac\x7f\x78\xdf\xe3\x64\x09\x04\x3b\x82\x0e\x0c\x47\x78\xf0\x65\xcb\x43\xea\xe0\x90\xcb\x11\x0d\x85\x8b\xb3\xa3\x5d\xa4\x1c\xa9\xac\x75\x34\x72\x90\xe2\x2b\x93\x53\x33\xf2\xf1\xc6\xef\xc0\x9b\x1c\x35\x8d\x7c\x86\x54\x76\x69\x14\xe0\x4d\xd0\x47\x8a\x02\x01\xbe\x06\x21\x0a\x70\x7c\xe0\x43\x7a\x40\x09\x8e\x86\x04\x9a\x16\x3d\x3a\xbb\x4a\xee\x80\x48\xbb\x48\xd1\x7d\x86\xa9\x61\x8e\x83\x54\xf6\x89\xb9\xb2\x09\xd6\xc1\x9b\x0e\xb2\x76\x06\x48\x19\x52\x1f\xa9\x1c\x0f\xeb\xa2\xc7\xac\xdb\x47\x8a\x62\x5d\x64\xea\x0a\x7c\xe8\xa1\xb9\x9e\x4b\x0f\x43\xa4\x28\xd8\x43\xcf\x59\xbf\x07\xe7\xc4\xc1\x39\xb9\x42\x22\x45\x83\x98\x28\x86\x29\x62\x98\x22\x86\x29\x62\x3e\xbe\x62\x6e\x18\xe6\x86\x61\x56\x18\xe6\x83\x05\x28\x05\xe8\x60\xdc\x41\xa5\x1c\x0f\x98\x08\x86\x89\x60\x21\xf5\x26\x1c\x92\x0e\x10\x69\x17\x29\x47\x2a\xeb\xf0\x31\x1d\x3e\xa6\xc3\xc7\x74\xf8\x98\x0e\x1f\xd3\xe1\x63\x22\x7c\x4c\x84\xdf\xed\x21\xed\x23\x45\x4e\xcc\x80\x4f\x33\xe0\xf7\x50\xa0\x37\xa4\x07\x94\xe8\xa1\x85\x3e\x3e\x60\x02\xfc\x01\x7d\x1e\xa2\x09\x4c\x80\x3f\xf4\xe9\x15\xfa\x04\x80\xf1\x47\x7d\xbc\x1a\xa1\xe3\x23\x54\x35\xc2\x67\x3a\x42\xef\x63\x1b\xf9\xac\x47\x0f\x03\xa4\x54\x0b\xf6\xa2\xef\x33\x3c\xf8\x78\x08\xb0\x72\x3e\x20\xcb\x07\x4c\xf9\x98\x3d\x1f\xb3\xe7\xd3\xec\xf9\x80\x2c\x9f\x20\xcb\xc7\xf4\xf9\xa1\xaf\x38\x40\xb0\x5c\xb2\xae\x00\x93\x15\x60\x9a\x82\x0e\x1a\x09\x3a\x72\xb3\x04\x98\x9b\x00\xb3\x12\xd0\x7c\x04\x98\x8f\x00\xbb\x3c\xe8\xf9\xf4\x0a\x55\x61\x3e\x02\xcc\x07\x59\xc2\xed\x60\xd0\x87\xe7\x14\xda\xc0\x14\x04\x00\x85\x00\x40\x10\x00\x08\x02\x00\x41\x80\x61\x04\x18\x46\x10\x50\x43\x1c\x99\xf8\x80\x1e\x50\x07\x60\x21\x00\x2c\x04\x18\x4c\x10\xda\x48\x3b\xca\x37\x0b\x2e\x01\x32\x2b\xc7\x90\x38\xfa\xcf\xd1\x7f\x72\x5f\xb0\x79\x4f\x62\x2f\x8e\xce\x72\x74\x96\x03\x6c\x39\x56\x8d\x8f\xd0\x1c\x1f\xa1\x84\xef\x22\x0d\x90\x0a\xa4\x68\x21\xa0\x4c\xe8\x2d\x0f\x7c\x7a\xc0\x77\x8e\x0a\xb9\x9c\x1c\xd2\xca\xd8\x1c\xfd\xe4\xe8\x27\x0f\xd1\x29\xc2\x74\x02\x90\x2b\x3a\x28\x2e\x3a\xb2\xb8\xe8\x05\xe7\xe4\xcf\x84\xb4\x83\xb4\x87\x54\x4e\x92\x60\x5d\xa4\x72\x52\x05\xfa\x03\x32\x69\x0b\x4c\x9e\x08\x06\x48\xf1\x1e\x30\x20\x38\x43\x8a\xb2\xd4\x1b\x81\x29\x0a\xbb\x12\x02\xc3\x3e\x07\xf7\x3b\x90\xad\x85\x00\xca\x10\xa0\x15\x06\x48\xb9\xaf\x98\xe3\xd9\xc6\xb1\xe5\x26\x75\x6c\x20\x47\xc7\x0e\x02\xa4\x02\xa9\xfc\xec\xca\x19\x76\xdc\xae\x40\x8a\x37\x12\x40\x1c\xb7\x87\xf7\x3d\xbc\xef\xe1\xfd\x10\x6f\x86\x78\x33\xc4\x1b\x89\x17\x1c\xd7\xef\x23\x45\x29\x1f\xef\x03\xbc\x47\xc3\x6e\x80\xf7\x72\x5e\x9d\x8e\x5c\x59\xa7\xe3\xf4\x91\xe2\x8d\xdc\x95\x4e\x47\xa2\x77\xa7\x33\xe0\xea\xac\x02\x8e\x06\x30\x75\x42\x00\x07\x1b\x51\x22\x44\x89\x50\xd0\x51\x47\xd8\xa0\xb8\x32\x45\x41\xb1\x39\x52\xfa\x4d\x48\xa3\x1c\xc2\x68\x4f\xc9\xa4\x70\xf4\x1d\x28\x7f\x5f\x9c\x5c\xef\xaa\x03\xec\x10\x49\x91\x79\xe0\x20\xed\x2a\xf1\x54\xa6\x12\x93\x3b\x03\x8e\xdf\x02\x1d\x1a\x08\x3c\x84\x4c\xf9\xda\xc1\x4c\x2b\x90\xe2\xb7\x83\x0f\x43\xb4\x38\x1c\xa0\x47\x43\xd4\x35\x04\x3a\x70\x86\x0c\x0f\x61\x5f\x71\xd6\x52\x6a\x45\xe6\x91\x1b\x40\x84\x75\xf1\xd0\xa1\x07\xf4\x75\xd4\x75\xc8\x9f\xaa\x23\xd3\xbe\x40\x8a\x0f\x83\x9e\x92\x7a\x65\xca\xa8\x08\xea\x1f\x05\xe8\xc6\x08\x2b\x3c\x02\x34\x38\x23\xb9\x0f\x1d\x26\xc9\xb3\xc3\x1c\xfc\xc6\xe8\xd9\x00\xbf\x07\xb2\x5e\x36\x44\x39\x86\xd5\x65\xb4\x04\x0c\xb3\xcb\x98\x20\xc1\x59\xa6\x81\xa3\x0e\x61\xce\x36\x8e\xdf\x45\xbb\x3e\x40\xc7\xa7\x25\xf4\xd1\x23\x3f\xec\x52\x7c\x07\xb9\xc4\x41\x07\xf0\x17\x48\xec\xed\x04\x5d\x46\x8e\x67\x01\xce\x93\x8d\xd4\xb1\x32\x9c\x88\x40\x66\x1f\x1f\x08\x64\x03\x0c\x22\x00\xea\x73\x80\x27\x1c\x1e\xca\x5a\x42\xc0\x51\x08\x38\x0a\x1d\x81\x54\x7e\x0d\xbb\x78\xdf\xc5\x7b\xc0\x75\x88\xce\x85\x92\x06\x3a\x61\x0f\x65\x01\x71\x21\xa0\x3b\x1c\x50\x8a\x3c\x92\xfe\x3b\x61\x80\x54\x62\x31\x27\xe4\xf4\x1b\xf9\x25\x2a\x70\x42\x89\x0a\x9c\x30\xec\xd1\x19\x03\x9c\x4d\xf1\xa1\xfe\xb3\xf1\xe0\x32\x3c\x48\x26\xc6\xb5\xc9\xd1\xcf\xee\xe3\xcb\xc0\x45\xda\x91\xe9\x10\x6f\x00\xc0\xae\x3d\xc2\x03\x79\x74\x60\x5b\xba\x76\xe8\xa8\x13\xaa\x30\xe0\x06\xca\x8e\x3b\xdb\xb8\x5d\x77\xa0\x0e\x76\xc2\xd8\xe6\x2b\x63\xdb\x6c\xe3\xfa\x83\x2e\xd2\x9e\x4c\x47\xfd\xd9\xc6\x0d\x24\x34\xb9\x40\xf2\x6e\x80\xe5\x70\x03\x49\x7b\x5d\xee\xf6\x91\x0e\xe9\x4c\x49\x80\x54\xd0\xf9\x12\x99\xf6\xe9\x43\x1f\xaf\x06\x0e\x89\xd0\x78\x00\x96\x75\x39\x7a\xcc\x25\xa1\x73\x39\xc3\x6f\x1f\xbf\x7d\xfc\x0e\xf0\x1b\x03\x01\x46\x75\xb9\xdc\x43\xae\xe8\x75\x94\x06\x50\xa6\x23\x86\x88\x06\x5d\x15\xd8\x00\x8e\xbc\x7d\xf8\xf3\x0a\x3c\x84\x81\x72\x23\x27\x1f\x76\xb8\xb0\x0f\x90\x0e\xb5\x60\x1c\x92\x7d\xe8\x38\x92\x7f\xed\x60\x7e\x3a\x8e\xe8\xaa\xf8\x07\xb3\x4d\xc7\x95\x10\x31\x0a\x43\xae\x22\x14\x40\x88\xe2\x4a\x96\x82\xf4\x35\x50\x42\x98\x94\x62\xb1\x05\xa5\x30\x8b\x78\x2a\x43\x15\x56\x65\xb6\x61\x83\xc0\x46\xea\x20\xf5\xc9\x17\xb3\x0b\x65\x1b\x57\x3a\x37\x9c\xcd\x65\xea\x88\x2e\x2c\x6e\x43\x65\x78\x93\x69\xd0\xc7\x83\xc4\xce\x6c\xc8\x99\xb2\x9a\xc0\xe4\xd3\x25\xcb\x8f\xc0\x91\x0a\xae\x4e\x56\xc8\x34\xc0\x2b\xca\x8c\xcd\xcb\xc0\x47\x32\x06\x44\xc6\x18\x9a\x61\x12\xc0\x19\xeb\xe2\xb7\x04\x6d\xc6\x24\x4a\x65\x0c\x3c\x06\x63\x1c\xaf\x42\x94\x00\xc3\xc5\x7c\x7b\x80\x74\x88\x54\x96\xf3\x1d\xbc\x77\x28\x93\x83\x57\xee\x80\x8e\x74\xc1\x8b\x34\x50\xce\xa4\x32\x95\x1c\x3f\xf3\x05\x7e\x03\x0b\x32\xb0\x23\x7c\xc0\xba\xea\xbc\x86\x4c\x31\xad\x7c\x20\x39\x43\x3e\xc0\x42\x86\x40\x76\x21\x93\x20\x15\xb2\x3e\x7e\x63\x6c\x21\xf0\x48\xe8\xdb\x03\x44\x79\x92\x6c\x5f\xe8\x3b\x43\x7a\x08\x64\x2a\x19\xe0\xd0\x97\x4c\x6f\xe8\x77\x90\xb7\x8b\x4c\x92\x43\x08\xfd\xc0\x45\x56\xc9\xf5\x87\x14\x62\x29\x84\x38\x17\x72\x29\xb6\x84\x5c\x32\x2f\x21\x07\x2e\x09\xb9\xc0\x07\x49\x42\x42\x8e\x66\x05\x10\xb6\x14\xf3\x61\x59\xe9\xc0\xb0\x32\x40\x1a\x28\x2b\x0b\x22\x0c\xf5\x10\x60\x88\x9f\xd3\xc9\x1c\x99\xfa\x21\x1e\x24\x4c\x84\x61\x30\x44\x3a\x92\x29\xc7\x67\x8e\xf7\x1c\xef\x39\xbd\xa7\xd2\x72\xd9\xc3\x50\x0c\xe8\x70\x0f\x99\x33\x7c\xa4\x42\x99\x36\x1a\xfd\x54\x03\xf8\x61\x0e\x20\x04\xfb\x48\x05\x6c\xf4\x94\x86\x30\x95\x09\xa5\x2b\x85\x0a\xc2\x57\x9a\x08\x88\xb0\x1d\x88\xb0\x76\x1f\x82\x70\x97\xdc\x47\xfb\x24\x24\xc3\x71\x8d\x2b\xff\x35\x88\xe5\xce\x39\x05\x9b\x82\x70\x2e\x94\x69\x11\x2e\x12\x5c\x79\x4a\x20\x4e\x02\xb2\x09\x8e\x07\x2c\x31\xc7\x2e\xe6\xa1\xdb\x25\x7f\x85\x00\xb2\xae\xaf\x44\x5e\xb8\x4b\xf8\xca\x6b\x02\xaa\x2e\xd9\xf5\x30\xa0\xcc\x12\x63\x70\xda\xff\x9a\xec\x4f\x26\x40\x64\x0c\xd0\x6a\xc0\x98\x32\xe5\x41\x47\xd7\x25\x55\x1d\x66\x85\xba\xa0\x06\x0c\xc4\xc6\x81\xcc\x38\xef\xd3\x80\x25\xe4\xe5\x3e\x2e\x9c\x7a\x8a\x9d\xc4\xc3\x0e\x1e\x7a\x7d\xa5\xb4\x85\xad\x6c\x58\xed\x89\x52\x86\xf6\x91\xa2\x3d\x7b\x84\x55\xc0\x9b\xce\xe8\x5c\x5b\x18\x5e\x2e\x4f\xaf\x4f\x5d\xa7\x4e\xf7\x35\x67\x04\x4e\xab\xd4\x41\xda\xa7\xae\x33\x58\xcf\x03\x32\xa2\xa3\xb7\xc0\x28\x9c\xa3\xb2\x3c\x7e\x18\x66\x8f\xfb\x34\x42\x49\x2f\x39\x97\x20\xc7\xb9\x04\x39\x2e\x24\x42\xe4\x02\xbb\x89\x0b\xdb\x47\xb4\x19\xbc\x72\x86\x08\xf6\xd4\x47\x3a\x40\x8a\xe5\x00\x03\xcb\x45\x77\xa4\x34\x3e\x30\xe4\x8d\x94\x63\x9b\x16\x18\x03\x7a\x1d\x21\xa8\x62\xc1\xb0\xde\x03\x6d\xd9\x3b\x34\x7f\x9d\x21\x4d\x26\x52\xac\xea\xa0\x43\xab\x8e\x87\x91\x4b\x7a\x4e\xe4\x22\x80\x0a\xd9\xb0\x49\xf1\x43\xca\x1c\xea\x96\x02\x6a\x08\xe9\x3c\xf0\xd5\xdc\xd1\xac\x8d\xf6\x16\x9c\x66\x4d\xf5\x9e\x40\x97\xa1\xbf\x4c\x90\x35\x05\xc3\x71\x75\x90\x1d\x2a\x17\x1b\xf4\x9a\x29\x9b\x3d\x00\x33\x50\x2e\x3b\xe8\xdb\xa0\xda\x45\xd2\xea\x74\x69\xdf\xf5\x1c\xcd\x91\x78\x80\xe5\xf7\x01\x0a\xc0\x50\x1c\x7c\x0c\x0f\x04\x8d\x47\xd0\x10\x98\x06\xb3\x9d\x1e\x16\x79\x58\x2a\xa4\x38\x84\xf3\x7c\xc5\x05\x16\x19\x12\x88\x82\x5f\x21\x91\x25\x17\x9d\x50\xdb\xa3\x43\xac\xac\x64\xd5\xb9\x18\x62\xb8\x23\x1a\x34\x3b\x2f\xc7\x2e\x68\xe1\x05\xed\x5d\xa6\x4d\x04\xa0\x27\x94\xdc\x33\x0f\x6d\x6c\x50\xc9\xb3\xf3\x10\x2d\x85\x52\xcc\xe4\x61\x07\x6f\x3a\xc8\x29\xf9\x39\x1e\x4a\x4c\xcc\xc1\x77\xf1\xb0\x8b\x3c\x5d\x7a\x2f\xca\xbd\xdf\x73\xce\x35\xc0\xa0\xf9\xee\x01\x45\xf4\x51\x53\x1f\x75\xf4\xb9\x32\x55\x03\x62\x7a\xd5\xe9\x26\x05\x3d\x0a\x05\x7d\x57\x83\x0b\x60\xf7\x7c\x86\x39\xd3\xb7\x09\xb0\x9c\xe4\x4d\x38\xe7\x42\x9b\xba\x6e\x4f\x07\x77\x1d\x60\xa8\x0b\x6a\x3a\xfd\x91\x06\xfb\x81\x3e\x53\x8e\x8f\x34\x20\x54\xa7\x81\x4f\xb7\x49\xf3\x19\x74\x08\x3d\x8d\x2a\xa0\x8b\x6d\x0d\x74\xc2\x25\x3d\xe6\xdc\x06\x0a\xc0\xae\xe5\xd8\xb5\xdc\x19\x94\xc8\xba\x33\x22\xe8\x06\x80\x0c\x34\x38\xa1\xfe\xe7\xf8\x1b\x35\x31\xe4\xe5\xf8\xcd\xf1\x5b\xe8\x90\x43\x60\xa6\x86\xcf\x3a\xda\x20\x21\x46\x69\xdd\x57\x11\xd5\x08\xdb\x01\xf3\x75\x09\x5d\x11\xd1\xa1\xd9\x0a\xb0\x60\x81\xa4\xb8\x1c\xea\x02\x1e\xa0\x1b\x81\x3f\xd0\xc9\xd0\xa0\x1c\x23\xa1\xde\x7c\x48\xbe\x86\xe5\x86\xfb\x03\x23\x7d\x71\x1f\x93\xd0\x1f\x69\x74\xcb\x45\x3a\xd2\x47\xcf\x74\xb2\x34\xd2\x76\xb2\x4f\x00\x48\xea\xe9\x90\xd0\x50\x28\xd4\x28\xa1\x0d\x0e\x47\xac\x3a\x76\x8a\x98\x40\x63\x23\x60\x24\x80\xe3\xdd\x6e\x55\xfb\x8b\x31\x0d\xb1\x6e\x43\x1b\x60\x36\x94\x4c\x15\x1f\x3a\x2e\x3d\x8c\xa0\x89\xa6\xb8\x45\x2e\xb2\xb9\x1c\xa9\x80\x4e\x99\x94\xc7\x9d\x0e\xd2\x01\x52\x94\x00\x65\x1a\x12\xd9\x1c\x0e\x50\x02\x1d\x18\x0e\xd1\x1b\xb0\x43\xdc\x87\x80\xd8\x64\x71\xd6\x35\xe8\x6e\x58\x79\x4b\xc1\x31\x45\xb7\x8a\xd1\x94\x33\x30\xd1\x33\xd1\x09\xb5\x5d\x41\xf3\x2a\x45\xe5\x5c\xf9\x0d\x55\x05\x17\x42\x68\xb8\xa4\xaf\xed\x10\x82\x93\x7c\xfb\x03\x21\xf4\x81\x46\x06\xb4\xfb\x07\xd8\x3b\xa3\x6a\x6f\xc9\x45\xbe\x0c\x4d\x08\x0c\xe6\xeb\xb5\x2a\x86\x02\xa8\x65\x48\x35\x01\xd1\x95\xde\x95\x32\x25\x68\x87\x28\x51\xae\x76\x6e\x11\xc0\xd8\xc3\xb0\x4a\xe3\x95\xf5\x80\xf7\x75\x88\xad\x6e\x06\x65\x4a\x70\x42\x1d\x44\x89\xb7\xea\x77\x90\x12\xf0\xf6\x35\xa6\xa8\x2c\x4c\xce\x48\x7d\x5f\xdb\x30\x03\xae\x61\xb1\x21\x91\x86\x21\x6d\x25\x86\xd4\x2f\xad\x4a\xa5\x8b\x3b\x91\x9d\x50\xef\x28\x38\x43\xee\x62\xbb\x13\xbd\xe5\x03\xec\x33\xa2\x37\xf9\xae\xef\xeb\x9b\xa3\xab\xcd\x6a\x6f\xa0\x31\x3f\x83\xea\xa8\xd5\xf1\x94\x5e\x0f\x3d\xe2\xd4\x23\xa4\xb4\xd1\xc1\xc3\xb0\x2e\xd2\x41\xb9\xf5\x19\x72\xfa\x18\x87\x0f\x9c\x1d\x74\x4b\x2e\x94\x70\x1c\xd8\x5a\xee\x80\xf2\x39\xbc\xc4\x6e\x1d\xda\x65\x3d\x1d\xd3\x61\xdf\x83\xc8\x42\x8f\xc6\x05\x1a\x0b\x03\x40\x51\xc0\x55\x5f\xc9\x7c\x35\x24\x7e\x74\x44\x54\xdf\x9e\x55\x83\x88\xcd\xb4\x60\x07\xe8\x30\xb6\x67\xe0\xa0\xab\xae\x8b\x14\x83\x75\x75\x26\xda\xe5\x3a\x8b\x21\xb4\x6e\x12\x92\xea\xa2\xff\x3d\x9d\x59\xca\x49\xab\x68\x30\x56\xa9\x43\x2b\x01\x1a\x0a\xfa\xc4\xc8\x6a\xcd\x75\x83\x06\x3c\x88\x26\xfa\xb5\x8a\xfc\x8a\xa7\x04\x56\xc6\x27\x5c\x6f\xdb\xd4\x57\x0d\x04\x88\x3d\x74\x31\x25\x6e\x07\x69\x0f\x29\xa6\xd4\x25\x1e\x11\xef\x3b\xf4\x1b\x53\x48\xd4\x4b\x74\x31\xfb\x5d\x22\x17\x20\xf7\xa2\x8b\x5c\x20\xf7\xa2\x1b\x90\x13\x18\x52\xd4\x01\x98\x11\xa0\xf9\xa2\x37\x24\x52\x8b\x94\x72\x02\x73\xf4\x91\x1f\xfb\x47\x80\x09\x10\x40\xf4\xa2\x0f\xde\x75\x80\xf7\x03\x94\x1d\x70\x8d\xcf\x41\x3d\x23\xea\x17\xad\x30\x40\x50\x71\x7a\x7e\xa0\x73\x38\xd5\xed\xaf\x9c\x40\x89\x68\x43\x45\xc2\x83\x51\x57\x23\xcf\x24\x5d\xf8\x98\xc9\x00\x29\x18\xec\xea\x8e\x63\x34\xab\x02\x3d\x26\x01\x4b\xd8\xa1\x36\x59\x84\xbb\xaa\x6c\xb5\xab\xf3\x19\x39\xae\xd4\x0f\xae\x08\x3e\xd4\xb6\xa8\xe0\xfa\x28\xb8\xb6\x5f\x29\x04\x9e\x92\xa4\xf8\x48\x47\x7c\x55\xac\x93\xfb\x7d\xd1\x60\xd1\xc1\x80\x48\x6c\x2e\x35\x12\x0f\xda\x23\x14\x34\xd4\x50\x10\xb8\xe5\x7c\x32\x5c\x6d\xe8\x03\x6c\xc5\x80\xd6\xb0\xab\x0f\x89\x16\x94\xf8\x6e\x62\xb0\xc0\xf5\x0b\xa2\x60\x05\x8b\x8a\x87\x21\xf1\x1e\x23\x8d\x2f\x25\x6e\x21\xe7\xb6\x3a\x1a\x91\xe1\xba\xa4\x31\xea\x60\xcb\xfb\x3a\x86\xaf\x52\x6e\x8a\xcf\x28\x88\xe3\x13\xd5\x00\x8c\x61\x87\x48\x43\xa7\x1a\x33\x11\x02\x57\xe0\x54\xc2\x18\x0a\xe6\xaa\xde\xe9\xa1\x05\x43\xe1\x54\x1a\xa3\xd0\x9e\xc2\x11\x95\xb7\x64\xf2\xcd\xc9\x95\x7a\x5b\x73\x6b\xa2\xe9\x0c\x1b\xdc\x73\x5e\x04\x85\xdd\x57\xb9\xb6\xb6\x9a\x8d\xbd\x5a\x91\xb0\x28\x42\x4e\xb1\xc5\xa1\x69\x98\xa0\xf2\xe8\xd0\xba\x95\x56\xd9\x67\xc3\xdc\x60\x4a\xba\xec\xc7\xe8\x33\xbb\x48\xfb\x85\x72\x33\xc4\xd2\x84\x21\x38\xae\x30\x0c\xfd\x46\x8f\x52\x25\x0f\xf1\x46\xd3\xfe\xb0\x42\x26\x73\x9f\xdd\x8e\x4e\xf3\x4a\xd2\x56\x9d\x4d\xd0\x21\xb7\xc1\x55\xec\x45\x5c\xcc\xc9\xcf\x31\x5b\xaf\xa3\x45\xac\x79\xb8\xfc\x97\x9b\xc8\x7b\xb0\xe1\x90\x71\x5c\x99\xc5\xff\xab\x0c\xe2\x7f\x99\xc2\xff\x32\x85\xff\x65\x0a\xff\xcb\x14\xfe\x97\x29\xfc\x2f\x53\xf8\xbf\xd0\x14\xfe\x97\x11\xfc\x7f\xac\x11\x5c\xa2\xa1\xbf\x6c\xdc\x7f\xd9\xb8\xff\xe7\xda\xb8\xf9\xe0\xff\x05\x1b\x37\x52\xf1\xaf\x31\x74\x0f\xff\x32\x74\xff\x65\xe8\xfe\xcb\xd0\x5d\x9d\xf2\xff\x07\x0c\xdd\xb9\x89\x9b\xd4\xfc\xf4\x0a\x7d\xff\xcb\xdc\x3d\xfb\xcb\xdc\xfd\x97\xb9\xfb\x2f\x73\xf7\x9f\x6f\xee\x1e\x3c\x60\xee\x2e\xe9\xd5\x5f\x46\xef\xff\x1b\x8d\xde\xdd\x4a\x45\x0f\x19\xbd\xff\xb2\x73\xff\x65\xe7\xfe\xcb\xce\x5d\x9d\xb0\xbf\xec\xdc\x1a\xe5\xfe\xcb\xce\xfd\xdf\x62\xe7\x46\x4a\x93\xea\xd0\xd4\x37\x9b\xbe\xc1\x58\xf8\x98\x91\xdc\x91\x2d\x24\x7c\x52\xb5\x8b\x27\x85\x41\x57\x0b\xc4\xd2\x18\xa9\xab\x39\xd2\x8b\xd0\x43\xb4\x88\x3d\x0e\x62\xbf\x17\xc5\x57\xae\x77\x63\x5d\x74\xa3\x88\x01\xbd\x77\x33\x43\x25\x38\xc5\x77\x45\x01\x8a\x7e\xa4\x72\x3f\x3f\xff\x3b\x3b\xff\x7d\xf6\x91\xb1\xd9\x47\xbf\x37\xfb\xe8\xb3\xd9\x47\xd9\xbb\x8f\xbc\x3f\xfb\x28\xf7\xc8\xc7\xb0\x3f\xfb\x08\xa2\x6d\xc3\x96\x60\xbb\xd0\xb3\xd9\x2e\xc7\x03\x19\x44\x5c\x18\x93\x5c\x11\x20\x15\xda\x8d\x29\x83\x2e\xd2\x3e\xd2\x01\x52\x46\x1f\xe8\x88\x78\x08\x33\x37\x3e\x63\x4f\xd8\x1d\x89\x70\xec\x0e\xac\xda\x9d\x21\x6c\x58\x1d\x49\xff\xec\x0e\xd8\x66\xbb\x13\xf6\x90\xc2\x78\xd4\x85\xa9\xb0\x0b\x85\xb9\xdd\x83\x7d\xba\xd7\x81\xc9\xae\x27\x71\xa1\xdd\xeb\x8d\x64\x4a\x11\x64\x7a\x43\x58\xcd\x39\x3d\x48\xb9\xda\xee\x41\x2f\x64\xf7\x42\x77\xb6\xb1\xfb\x2e\x39\x28\xc0\x6e\xd9\x97\x5b\xcc\xee\xf7\x61\x2f\x87\x72\xd6\xee\xf3\x0e\x52\xf8\x2f\x08\x4a\xfb\x48\x91\x55\x20\x2b\xf6\x87\xdd\x87\xd9\x1c\x7a\x4d\x7b\x20\x39\x53\x7b\xe0\x90\x6d\xdd\xa5\x53\xe8\xb0\x19\x0d\x58\x0f\xe6\x76\x07\x41\x3e\x51\x70\x80\x6e\x41\xef\x69\x0f\x30\xd2\x41\xc8\xb4\x98\x68\x0e\xec\xea\x0e\x5e\xb9\x5d\xa4\x43\x3d\x48\xf5\x50\x0f\x98\xc3\xb4\x2b\xb6\x61\x2b\x1c\xfa\x58\xba\x21\x6c\x5c\x23\xbb\x0b\x43\x79\x07\x86\x74\xd8\xb1\x47\xb0\x53\x8f\xc8\x4a\x3b\xea\xc3\x18\x4f\x63\x1f\xc1\x98\x36\x02\x1b\x6c\x8f\xb0\x38\x23\x89\x57\xec\x11\x1c\x0f\x46\x23\x32\xd9\x4b\x86\xc4\x1e\x41\x26\xb0\x47\x3e\xbe\xc0\xfa\x37\xa2\x86\x47\x3e\x59\xf9\xd1\x16\x4c\x6c\x23\x8e\xaa\x60\x97\x1c\x71\x32\xe3\x0b\xb4\x0b\x53\xdf\x28\xa4\xdf\x01\x0c\xf4\x3d\xb2\xd3\xc3\xc4\x0d\x9f\x11\x86\xa9\x65\x0e\x59\xdf\x31\x13\x0c\xde\x22\x36\x83\xb7\x04\xeb\xc0\x70\x2e\xc9\xac\xcd\x3a\xb0\x7a\x77\x60\x26\xef\x20\x2b\x46\xce\xa0\x81\xb1\x19\x1c\x1a\x18\x6c\xd2\x6c\x40\xa6\xf1\x01\x99\xe0\xa9\x59\x98\x5f\xd9\x90\xec\xf5\xb0\xc2\x32\x1a\x34\xc3\xa0\x19\x0d\x9a\x61\xd0\x0c\x83\x66\x3e\xda\xf5\xa9\xbc\x4f\xd6\x7b\xd4\xc2\x91\x49\x50\x8a\xaa\x42\x58\x9e\x69\x84\xbe\x64\xd6\x6c\xa8\x8d\x6d\xa8\x8d\x6d\x9f\x46\xe8\x63\x84\x3e\x8d\xd0\xc7\x08\x7d\x8c\xd0\xc7\x08\xfd\x0e\x15\xef\x90\x9d\x1e\xe6\x6d\x8c\xca\xef\xd1\x6f\xf4\xdd\xc7\xb2\xfa\x03\xb2\xb1\xa3\x1c\x8d\xd0\xc7\xc6\xf3\x69\xcb\xf9\x58\x56\x1f\x3a\x24\xdb\x1f\xc1\xe2\x0d\x6b\xae\x3f\x42\xae\x11\xea\x1d\xc1\x52\x0e\x8f\x0f\x9f\xa1\x2a\xd8\x56\x7d\x46\x86\x72\x86\xac\x8c\x2a\xc4\xf8\x7d\x8c\x3c\xa0\x71\x42\xd5\x6a\x07\x36\xd9\xa9\x31\xd0\x80\x76\x49\x80\x81\x06\xae\xb2\xa1\x93\x41\x1d\xa6\x6b\x02\xcd\xa0\x07\x9b\x77\x1f\x45\x30\x9e\x00\xf0\x19\xd0\x48\x02\xc0\x67\x40\x23\x81\x90\x6c\x07\x34\x12\x70\xcc\x36\xe9\x36\xed\x00\xeb\x43\x2c\x9c\x1d\xf8\x64\x52\x27\x03\xb9\x80\x69\x1c\x05\xb1\x3e\x41\x48\x29\x2c\xd9\xb4\x6f\xc0\x52\xdb\x9c\x7a\xcf\xd1\x7b\x4e\xbd\x07\x6b\x6d\x73\x74\x98\x77\x61\xd0\xee\x51\x11\xe0\x24\x4e\xeb\xc0\xd1\x6f\x4e\xd8\x10\xda\x13\x9b\x53\xf7\xf9\x08\xd9\x46\xf4\x05\xd8\x81\x93\x4b\x0c\x94\x90\x36\x47\x27\x29\xb6\x8a\xcd\xe1\xf7\x21\x6c\x87\xec\xdf\x64\x0c\x77\x91\xc2\xf0\x4d\x88\x01\x3c\xa4\x2d\x80\x2d\xc5\x10\x9f\x61\xa8\x17\xc3\x3e\x99\xca\x61\xe2\x1e\x92\xdd\x1c\x2b\x29\x80\x9b\x04\x03\x9a\x15\x80\x6a\x01\xa8\x16\x98\x35\x81\x3e\x50\xc0\x12\x5b\x04\xa8\x8b\x7a\xc2\xa9\x12\xf8\x18\x40\x81\x6f\x93\x86\xc6\x86\x2d\xd0\x0e\xc1\xa7\xd9\x61\x5f\xce\x1e\x49\x92\x76\x38\x0c\xb4\x68\xcb\x2e\x93\x29\x8c\xae\x36\x85\xd5\xb2\x25\x77\xeb\xd8\x60\xa0\x1c\x5b\x02\xb3\x63\xcb\xd9\x73\x60\xf2\x73\xec\x3e\xac\xea\x7d\x81\xcf\x92\x2f\x77\x6c\x32\xca\xda\x43\xe4\x82\x99\x3c\xbf\x23\x0d\x56\x45\x1b\x96\x70\x3b\x40\x55\x14\x96\xc7\x86\x39\xd3\x86\xf8\xe8\xb8\x92\xdb\x76\x5c\xb2\x90\xba\x52\xe0\x70\xe8\x5e\x22\xc7\xed\xc1\x92\x0e\x2b\xa6\x4b\x3d\x72\xd1\x23\x97\xe2\x8a\xb9\x43\x7c\x21\x13\xae\x3b\xc4\x17\xba\x6c\xcd\x95\x93\xe8\xb8\x60\xf0\x1c\x17\x26\x4e\x17\xba\x65\xc7\xf5\x61\xc7\x0f\xf0\x3d\xa0\xef\xe8\xa6\x4b\xc6\x57\x97\xa3\x4d\x70\xac\x4e\x47\x82\x9a\xd3\x01\xa8\x39\x1d\x49\x0f\x9c\x8e\x43\x5f\x60\x54\xcd\xaf\xb6\x83\x25\xb7\xb8\x98\x17\xd9\x42\xca\x16\x72\x44\x6a\x82\xf9\xb8\x2f\xd7\xc1\xe9\xe3\x4a\x65\xa7\x0f\xeb\x6b\x7f\x48\x5f\xe4\x46\x2f\x82\x76\x0a\x3c\x84\xf4\x25\x1c\x6a\xf1\xd6\xe4\x36\x70\x06\xd8\x06\xce\x00\x4e\x05\xc5\xc5\x56\x8e\x7e\x53\xbb\xa3\xc5\x5e\x43\xa3\x03\x5a\xb0\x01\x16\x2c\xbf\x3c\x46\x02\x97\x33\x80\x87\xc2\x00\xd6\xde\x21\x55\x36\x94\x82\x89\x43\x41\x6e\x9c\xa1\x84\x5d\x67\x08\xf6\xd6\x19\x32\x7c\x91\xb8\xa6\x0c\x18\xd5\xd3\xae\x01\x81\x51\x3a\x0f\xd0\x06\xf7\x82\xd1\x80\x1e\x24\x7e\x2f\xc2\x5f\x33\x5f\xa6\x54\x01\x9c\xcb\xca\x9b\xe8\xfb\x5a\xe4\xb6\x5e\x17\x16\x78\xd9\x41\x42\xd7\x0e\x90\xaf\xe3\x77\xe9\xa1\xeb\x23\xfa\x63\x07\x0f\x52\x5c\x72\x7c\x18\xed\x7d\x18\xed\xc9\xf7\xc8\x81\x0b\x51\x71\xfd\x89\x94\x0e\x9d\x00\x2c\x81\x03\x59\xc1\x21\x59\xc1\x09\xe0\x14\x50\x5c\x7b\x3a\xd4\x2f\xee\x83\x05\xdf\xa7\x32\x70\xf4\x20\x4d\xb7\x13\x08\x58\xed\x85\x20\x43\x3d\xaa\xc6\x74\x04\x70\xdc\x80\xe9\xa3\x08\x7a\x8b\x82\xea\xae\x99\x10\xa0\x14\x12\x28\x85\x70\x4d\x08\x69\xcc\x50\x37\x3b\x61\x97\xbe\x60\x33\x50\xf8\x69\x07\x66\x07\x27\x84\x7b\x4a\x08\xf7\x91\xb0\x47\x9f\x01\x4f\x21\xfa\x4f\x91\xc5\x9c\xd0\x87\x21\x1f\x8c\x80\x13\xc2\xb7\x20\x04\xdc\x87\x04\xf1\x61\x80\xef\x01\x7d\x87\x6f\x4c\x48\x3b\x33\x94\x7c\x97\x43\x26\x2b\x27\xe4\x68\x86\xae\x0f\x0a\x05\x39\x04\x50\x05\x21\x2a\x20\xa7\x8e\x50\xb2\x0c\xae\x2d\xa9\x9c\x6b\x0f\xc8\x0d\x80\x2c\xff\x92\x72\xb9\x8e\xed\x22\x1d\x20\x85\x7f\xa9\xe3\x74\x90\xf6\x90\x8e\xe8\x15\x97\xa9\xe4\xb3\x5c\x07\xc6\x7c\x47\x12\x26\xd7\x21\x8f\x54\xc7\xa5\xcf\x21\x1e\x24\x95\x72\x9d\x0e\x39\x11\xc0\x6f\xc0\x01\x48\xb8\x4e\x17\x5f\x24\x21\x70\x9d\x21\x1a\x91\xf0\x5b\x5c\x93\x08\x97\x00\x72\x42\x75\x83\x9e\xd0\x6e\xe7\x11\xc8\x06\xe3\x81\x1b\x08\x7c\x91\x14\xc8\xc5\xb2\x96\x17\x32\xf6\x90\xc2\x03\x00\x3d\xca\x43\xce\xf5\xf1\x0a\x27\xff\xf3\x5b\x35\xe1\xb0\x40\x71\xaf\x5c\xce\xe8\x81\xbc\x10\x18\x1c\x0f\x7c\xfa\xe2\xe3\x8b\x4f\x5f\x7c\x7c\x21\xbf\x09\x50\x1b\x97\x0c\xbd\x2e\x9c\xb5\x5c\x8a\xd4\xec\x72\x8e\x2f\x9c\xbe\x48\x02\xea\x0a\x17\x5e\x05\x76\x0f\x69\x1f\x17\xfb\x3b\x74\xbf\x3f\x5e\x75\x7c\xa4\x01\x5c\x0f\xe8\xc3\x08\xb9\x60\xac\xea\xc0\x61\xa3\x63\x33\xfa\x22\xe1\xb6\x43\xd8\xb9\x03\x87\x8d\x8e\x83\xed\xd7\x71\xd0\x8a\x43\x35\x3b\x12\xd5\x77\x1c\xba\x47\xcb\xf1\xc3\xca\xc5\x58\x95\x8b\xfe\x67\x9b\x2e\x01\xfe\x08\xa0\x52\x46\x38\x0b\xf4\x0b\x77\xb8\x16\x62\x4e\x22\x3a\xd6\x77\xe8\xc1\x21\x5f\x06\x86\xd4\xd7\xee\x33\x96\x62\x03\xeb\x0f\x42\xba\xdc\x58\x96\x27\x14\xca\x20\x31\xb0\x01\x39\x00\xc0\x0d\x8a\x0d\x5c\x17\x0f\x72\x67\xb3\xc1\x90\x5c\x1e\x7c\xf2\x85\xa0\x2f\x01\x83\x17\x44\x0f\xbe\x0c\xb6\x83\xb4\x43\x0f\x3d\xa4\x03\x7a\x60\x48\x03\x72\x93\x70\xf5\xb0\xdb\x1d\x84\x49\x46\x6d\x43\x1f\x0f\x21\x3d\x84\x03\xa4\x3e\x52\xb8\x4c\x84\xf0\x85\xb0\xc9\x17\x42\x42\x55\x11\x16\x5a\x72\x0f\xe5\xb5\x8b\x01\xee\x7c\x23\x97\x0a\xc9\x12\x30\x78\x38\x15\x37\x19\x48\xa8\x65\x23\xd1\xa7\x07\x7c\x21\x1f\x86\x11\x1a\xc8\xef\x94\x97\x3b\x89\x31\xea\x26\xeb\xba\x48\xbb\xf4\xe0\xeb\x37\x29\xf4\x91\xc2\xc3\x62\x20\xf0\x8a\xc1\x0f\x43\xf2\x45\x8c\x49\x32\xca\x98\x8f\x4c\xb0\x1d\x31\xb0\xd8\x8c\xc1\x99\x84\x05\xa8\x17\xae\x57\x8c\xc1\xbd\x23\xbf\xdb\x45\x90\xcf\x86\x4b\x17\xbd\x74\xe1\xa7\xe1\x90\x03\x47\x1f\xe9\x88\x1e\xe0\x89\xe1\xd0\x17\x07\x5f\xe8\x2a\x2c\xdf\xa5\x87\x21\x3d\x08\xed\xd2\x2b\x78\x88\xf8\x3d\xe5\xd0\x31\xd2\x2e\xbb\x17\xae\x7e\xb1\x64\x47\xbb\x95\x12\x7a\x49\xf2\x7a\xe1\xf0\xbc\x0e\x89\x7c\x85\x4c\x52\xac\x90\x0d\xe8\x01\xfe\x0d\x14\xbb\x3e\x44\x47\x43\x12\x0d\x42\xdf\x81\xff\x86\x03\xff\x0d\x68\xca\x43\x48\x0b\x21\x49\x0b\xa1\xdf\x41\xe6\x0e\xb9\x7c\x74\xc8\xe5\x43\xc0\xc1\xc3\x46\xea\x20\xed\x20\xed\x22\xed\x23\xab\x8f\x0f\x1c\x8d\x80\xa5\x0d\x49\xf3\x1a\xc2\x24\x14\x72\xf0\xd5\x21\x9c\x91\x42\xd2\xa6\x84\x1c\xfd\x27\x73\x45\x28\x24\x91\x0d\xc5\x00\xb5\x09\xb9\xd5\xc2\xd0\x75\xe0\x8c\x21\xd9\xe4\x30\xec\xd2\x43\x0f\x0f\x50\xd5\x85\xa0\x0b\x21\xd1\x85\x10\x0e\x0b\x61\x08\xf1\x38\x0c\x03\xf8\x74\x70\xfa\xc2\xf1\x85\x1c\x5c\x42\xde\x18\xd6\x32\xd7\xd6\x42\x0b\x1e\xd8\xa4\xf8\x87\x0a\x36\x20\x4b\x34\x7c\xe1\x38\xfc\x74\x0b\x87\x02\x72\x22\x80\x9a\x39\x0f\xff\x0d\x85\x70\xa1\x3a\x82\xe6\x33\xbf\xb6\x21\x98\x95\x96\x7b\xa8\x2f\x73\x05\xb4\x43\x06\x6f\xb2\xb0\x76\xf1\xa5\x4b\x0a\x52\xb2\xd9\xe6\x57\x38\xc0\x10\x9b\x87\xdf\xe4\x9a\x4d\x25\x20\xf5\x1b\x19\x4c\x82\xaa\xab\x86\x1a\x17\x59\x09\x72\x4f\x07\x18\x08\x48\xb1\x19\x84\xa4\xf7\x27\x4f\x06\x32\x54\xe4\x11\x08\xa1\xe9\x55\x9d\xec\xf4\x35\x1b\x6a\x8f\x6c\xc2\xf4\xd0\x1f\x54\x3d\x32\xd4\x44\x42\x8d\x0e\xeb\x69\x60\x93\x46\x13\x86\x74\x65\xab\x84\x2e\x3b\x9f\x4d\x9a\x47\x32\x67\xe4\xb7\x0c\xf4\xb5\x79\x24\x77\x93\xfc\x5a\x53\x98\x03\x42\x58\x37\xc2\x9e\xd6\x77\x32\x5a\xe4\x77\x8e\x91\x35\x92\x1e\xc8\xcc\x0c\x8d\x1a\x27\x55\x26\xd4\x7d\x14\x39\x93\x0b\x07\xe3\x74\x48\x3d\x0a\xbb\xae\x70\x94\x89\x8d\xb4\xdf\x94\x0d\x06\xb1\xea\x6a\xaa\x38\x8c\x70\x95\x11\x01\x95\x11\x5d\x6d\x69\x3b\xbd\x43\xb3\x36\x70\xf5\xd5\x74\x2a\x1e\x16\xf9\xb5\x16\x43\x6d\x0e\x7c\x97\x94\xdf\xe5\x1c\x14\x6b\xd6\xd1\xfa\x05\xf3\x32\xc4\x30\x2e\x7c\x47\x07\x32\x32\x88\xc3\x42\x93\xdf\x83\x8c\xfe\x28\x33\x0c\x4c\x41\xc5\x25\xa6\xfd\x8a\x3b\x05\x29\xd3\xd5\xca\x0d\xe9\x41\xf9\xfb\x50\x7f\x04\x19\xc9\xc9\xd6\x86\x5d\xc3\xbb\x5d\x32\x15\xcd\xb4\x4b\xdd\xd0\xeb\x01\x79\x39\x51\x5e\x8c\x8a\x07\xca\xbf\x09\x45\x38\xec\x4d\x3c\x28\x61\x4f\xc0\xd5\x41\x38\xa4\x7e\x86\x95\x36\x1f\xee\x10\x86\x89\xe1\x90\x0c\x10\xf4\x8a\x93\x2e\x9b\x96\x09\x0f\xe4\xed\x23\x60\x05\xcb\x2f\x7b\xe4\x64\x02\x22\xcd\x33\xac\x5e\xa1\x4d\xfe\x03\xd8\x80\xd4\x58\x08\xf3\x4b\xe8\x92\x2e\xbb\x83\x2f\x1d\x2c\x1c\x2c\x32\x85\xe2\x9a\xdc\x2f\x38\x6d\x56\xa4\xca\x5d\xc2\xa9\x78\x48\xa8\x75\x85\x87\x46\x40\x56\xb4\x00\x86\x9a\xa0\x47\x5b\xa0\xef\xcc\xf4\x3b\x3d\x0a\x13\x5d\x6e\x94\x1a\x68\x40\x0d\x63\x00\xf1\x51\x9c\x73\x5f\x9b\x2e\x97\xec\x1c\x5d\x1d\x2c\xc8\x06\x33\xd4\x01\x82\x55\xfc\x20\xf2\x0b\xf4\xb4\x73\xbc\xb9\x47\x14\xd9\x53\x95\x95\x70\x44\x56\x42\xda\x71\x1d\xcd\x58\x88\xcf\x4e\xc5\xe9\x87\xcc\x66\xce\xac\x0c\xa1\x0a\x0b\xa1\xf2\x05\x50\x3e\x52\x02\xdf\x45\xa7\xdc\x96\xb6\x72\x82\x72\x4b\x73\x97\x32\x61\x91\x1d\x87\x9c\x68\x68\x69\xf3\x48\xa8\xc3\xaa\x57\x84\xc2\x41\x3a\xf6\x71\xc9\x2f\x0f\x7a\xfe\x81\x5b\x5a\x55\xf2\x6d\xa4\xc6\x37\xd4\x46\xe9\x13\x2a\x41\x37\xbb\xfd\xd2\xd2\x87\x83\x0c\x1c\x7c\x33\xe7\x7d\x94\x20\x03\x3c\x47\xd7\x38\x5c\xa9\x8a\x6b\xeb\x5c\xda\x65\xba\x43\x43\xae\xaa\x1f\x8d\x2a\x0e\x0d\x6a\x65\xbb\x9d\xdc\x7b\x21\x98\x69\x31\xb2\xe1\xb7\x00\x63\x28\x31\x6d\x7c\x88\xa6\x87\xd4\xf4\xb0\x8f\xcc\x10\xd0\xf9\x10\x5b\x6d\x48\x36\xa9\x21\xac\x43\x0f\xc4\x7d\xb5\x79\x05\x0a\x84\xee\x86\x90\x9b\xfb\xbb\x7d\xdd\x0d\xa1\x70\x02\x20\x7b\x23\x3d\x90\x01\x91\xb0\x82\x10\x7c\xa6\x5f\x0a\xa4\x61\xc2\x2e\x76\x4f\x5f\xf7\x42\x23\x5b\x7b\x38\xac\x38\x1a\xe4\xd5\x92\x55\x2d\x0f\x4a\xcb\xca\x7d\x36\xa2\x2a\x46\x64\x68\xb3\xc9\x16\x84\xb4\xa3\x3b\x13\x14\xa3\x1d\x34\xc4\xdf\x0d\xb8\x4e\x45\xec\xa1\xee\x4c\x90\x87\xe8\x25\xdf\x3f\x85\xc7\x7a\x40\x5a\xb9\x0f\x23\x80\x20\xbf\x90\xca\xaf\x38\x13\xa8\xfa\xfb\x6c\xa6\xb9\xa1\x05\xda\x16\x07\xe2\x22\x51\x9d\x07\x39\x30\x54\x2e\x59\xc4\xf9\x1f\x1e\x90\x27\x64\x00\xaa\x53\xf5\xbe\x04\x59\x60\x40\x0f\xe4\xcd\x48\xf6\xbb\x80\x05\x64\x31\x24\xe2\x01\x73\x3a\x3c\x13\x49\x17\xc0\x03\xf0\x0c\x41\xa0\xcc\xd2\x34\x03\x64\xd7\x57\xbe\x4e\x64\x5c\x57\xce\x4e\x7d\x7a\x20\xe7\x00\xa1\x51\xd8\x8e\xda\x23\xba\x3b\xa4\x42\xfd\x7d\xcd\x14\x8f\xd5\xe2\xca\xda\x8a\xde\x0a\x46\x76\x55\x98\x73\x05\xb9\xe5\xe1\x04\x0d\x27\xcd\x20\x17\xc4\x3d\x29\x37\x0d\xf4\x23\x74\x94\x43\x23\xb9\xb8\x29\x07\x16\xa1\xf1\x48\xb0\x77\x86\x2a\xe4\x31\x66\x37\x1c\x2a\xdf\x41\x3c\x10\xe6\x09\x03\x77\xa6\x39\xba\xfa\x4d\x81\x96\xe1\x2b\x5b\x78\x43\xc1\xcc\x8f\x96\x72\x8c\x23\xfc\x8a\xd7\x80\x5a\x2d\xe5\x50\x91\xef\x63\xa4\xbe\xee\x15\x90\xe3\x68\x9b\xf0\x9d\xe2\x39\x80\xb0\x5d\x50\x39\x6c\x70\xe1\x92\x53\x00\xf8\x0a\x77\xa4\xa3\x43\xb2\xee\x2a\x6f\x51\x20\x42\x38\x69\x89\x2e\x3e\x83\xde\x0a\xb0\x8d\xa2\x4b\xef\xc9\x48\xad\xcc\xdd\x68\x02\xf0\x2b\x00\x58\x02\xfe\xa0\xa2\x87\x02\x3d\x14\x00\x07\x9b\x9b\x8f\x91\x1f\x6e\x41\x02\xde\x80\xa2\x4f\x66\x5f\x80\x34\x79\x65\x73\x01\x64\x23\x08\xd9\xe4\xe6\x65\xea\x33\xb1\x4c\xf0\xbc\x2c\x28\x36\x79\x40\x12\x8a\x87\x03\x8d\x20\xf7\x66\xa8\x93\x25\x70\x68\x7c\x0c\xa3\x6c\xbe\xaf\x1b\x91\x73\xc4\xc3\x79\x83\x13\x47\x5f\xc7\x63\x0a\x50\x6a\x8e\x7f\xfd\xca\x05\x23\x70\x72\x51\x47\x72\x4b\x03\xb2\x8e\x1f\x04\xbc\x6a\xea\xee\x2a\x03\x7d\xdd\x43\x61\xeb\x96\xe7\xbc\xa0\xc3\x1b\x83\x6a\x33\xcd\x3e\xfb\x5d\x19\x36\xfb\x05\x5b\x0b\x7e\xdd\x68\x74\xf5\x7b\x87\x8d\xad\xff\x3f\x7b\xef\xc3\x1e\xb7\x71\xad\x79\x7e\x15\x5e\xed\xee\x44\xda\x11\xe5\x3a\x85\x02\x0a\x70\xae\x32\xab\xc8\x8c\xad\x89\x2d\x69\x24\xc5\x99\x24\xcc\x70\x0a\x40\x81\xec\xa8\xd9\xcd\xed\x6e\xda\x52\x1c\xed\x67\xdf\xa7\x7f\x07\xe8\x2e\x34\x9b\x14\x25\xcb\xf7\x3a\xf7\xda\xcf\x63\x3c\x6a\xf6\x01\x1a\xa8\x7f\x38\x75\xce\x7b\xde\x57\xa8\xeb\x13\xf0\x15\x86\x50\x86\x11\x46\xb6\xb1\x55\xc6\x91\x64\x81\x0d\x5d\x9a\x6d\xcd\xae\x64\x5b\xeb\x7f\xc3\x6c\x6b\x92\x67\xbd\x75\xbc\xbd\xd5\x0f\x37\x47\xab\x6f\x19\x03\x1d\xe2\x9a\x6b\x6f\x47\x5a\x30\x5f\xd2\xae\xdb\x41\x5a\xad\x02\x6b\x09\x6a\xff\x07\x8e\x78\xfe\x14\x81\x4d\xf7\x13\x85\x37\x7d\xcd\x31\xfe\x88\x58\xe7\x36\xec\xc6\x07\x55\x4d\x29\xd6\xcb\xcf\x26\xb8\x46\x45\x8d\x27\x8b\x1d\x7c\xe9\x93\x48\x5b\x19\xd7\x47\x55\x41\xd8\x1f\x76\xe3\x58\x70\x0c\x57\x02\x3c\x1a\xa0\xaa\x8b\x32\x09\xf0\xd4\xdd\x8d\xf1\x99\x6b\x22\x1f\x7b\x75\xc7\x36\x1a\x88\xd7\x6f\xf0\x47\x9b\xcb\xfd\xfb\xc9\xd1\x5e\x60\xe3\xfe\xef\xf7\xc5\x7e\x71\x53\xfe\x5d\xdd\x94\x30\x12\x7b\xc8\xd2\x97\xc9\x74\x8b\xdd\x99\x7f\x1f\x17\x4d\x58\xc6\xf1\x0b\x65\xf3\x36\x69\xbb\xe4\x25\xf2\x06\xfc\x89\x18\xe1\x98\x71\xcc\x39\x7a\x8e\x15\xc7\x9a\x63\xcb\x11\x7b\x6a\xbe\x59\x35\x0c\xab\x86\x11\xc1\x5e\xb0\x17\xec\x61\x90\x10\xc1\xde\x62\x6f\xb1\xb7\xd8\x5b\xec\x29\x84\x17\x8b\xbd\xc5\x9e\x57\x86\xc0\x20\x20\xa4\xa7\x05\x50\x86\x40\xab\x20\x80\x32\x84\xe4\xb9\x50\x37\x2f\x94\x73\xcb\x7a\x6f\x67\x64\xed\x08\x19\x59\x77\xae\x11\xb2\xd9\x42\xf9\x35\xcb\x8f\x11\x58\x2c\xc4\xf1\x2b\x8e\x5f\xc9\xf9\x15\xca\xd4\x25\xe7\x57\x28\xb6\x17\x10\x41\x02\x03\x81\x80\x8b\x10\xea\xee\x85\x74\xbc\x14\xd8\x53\xd0\x2e\x05\xf6\x05\xf6\x05\xf6\x05\xf6\x60\x82\x04\x00\x85\xf0\xc2\x15\x8f\x3d\x2f\x5c\xf1\xdc\xbf\xe7\xfe\x59\xdb\x8c\x80\x4d\x60\x6d\x34\x42\x21\xba\x80\x44\x12\xde\xba\x02\xb0\x44\xa0\x78\x10\x80\x16\x02\xc0\xde\x08\xd4\x06\x02\xc6\x42\x78\x27\x0b\x99\x79\x21\x33\x2f\x20\x19\x04\x88\x85\x04\x2c\x61\x37\x10\x52\xf5\x02\xdc\x47\x6a\xda\x09\x64\xc3\xe0\x4e\xb4\xa9\x3b\xc1\xd7\xd4\xdf\x4b\xc3\xbd\x80\xc9\x11\x40\x1a\x02\x6b\x87\x40\x1f\x20\xf0\x1f\x48\xcb\x4f\x52\x0e\x2f\xe0\x76\x04\xdc\x8e\x90\xeb\x17\x80\x12\x12\xb9\x45\xd0\x51\x12\x69\x90\xc8\xf5\x23\xb7\x18\xb1\x07\x29\x25\x00\x7c\xa4\xc3\x1e\x2f\x43\x00\xc1\x08\xbc\x23\xd2\x61\xc9\x00\xb6\x0c\x60\xcb\x00\xb6\x0c\x60\xcb\x00\xb6\x0c\x60\xcb\x00\xb6\x0c\x60\xcb\x00\xb6\x0c\x60\xcb\x00\xb6\x0c\x60\xcb\x00\xb6\x0c\x60\xcb\x00\xb6\x0c\x60\x2a\x57\x8d\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\xb0\x65\x00\xdb\x0c\x07\xc9\x82\x4e\xb1\x8c\x57\x0b\x35\x8a\x65\xbc\x5a\xc6\xab\x05\xf3\x40\x5d\xbf\xb1\x8c\x51\xc0\x04\xc6\xba\xee\x5a\x4f\x4e\x12\x47\xee\xaa\x0b\x07\x9a\x25\xa3\xcc\xdc\x64\x74\x57\x46\x77\x65\xc0\xf1\xb2\x96\x4b\x65\x50\x27\x64\x2d\xb4\x32\x10\x17\x64\xf4\x54\x46\x4f\x65\xf4\x54\x46\x4f\x65\xf4\x54\x46\x4f\x65\xf4\x54\x46\x4f\x65\xf4\x54\xa6\xf0\xb8\x8c\x4e\x1a\x5c\x41\x18\x6b\xe8\xa4\x0c\x5c\x96\xe3\xad\x68\x28\x8f\x36\x8e\x69\xe4\x98\x46\x8e\x69\xe4\x98\x46\x8e\x69\xe4\x98\x46\x8e\x69\xe4\x98\x46\x8e\xc7\x75\x3c\xae\x63\x1a\x39\x1e\xda\x41\x89\xe3\x3c\xf6\x3c\xb9\xc3\x79\x1d\x5c\x50\xfe\xce\xcc\xa1\xc6\xd8\x38\x10\x59\x8e\xf6\x74\xcc\x22\x57\x71\x1d\x40\x4b\x8e\xa9\xe4\x60\x09\x71\xc0\x95\x1c\x13\xca\x31\xa1\x1c\x13\xca\xc1\x14\xe2\x60\xd6\x70\x4c\x28\xc7\x84\x72\x74\x8b\x03\x86\xe3\xc0\xbe\x38\x88\x69\x5c\x8d\x3d\x93\xcb\x81\xcb\x71\x60\x62\x1c\x73\xcb\xad\xd7\x78\xe3\x00\xc6\x38\xe6\x99\x6b\x4a\x8e\x81\x23\x0d\x47\xf7\x51\x16\x6d\x1c\xdd\xe7\x40\x18\x3a\x10\x86\x8e\x3e\x74\xf4\xa1\xa3\x0f\x1d\x7d\xe8\xe8\x43\x47\x1f\x3a\xfa\xd0\xd1\x87\x8e\x3e\x74\xf4\xa1\xa3\x0f\x1d\x7d\xe8\x98\x6d\x0e\x00\x93\xa3\x23\x1d\x1d\xe9\x3a\xec\x99\x73\x8e\xee\x24\xdd\x69\x1c\x73\x2e\x67\xce\xe5\xcc\xb9\x9c\x39\x97\x33\xe7\x72\xe6\x5c\xce\x9c\xcb\x99\x73\x39\x73\x2e\x67\xce\xe5\xcc\xb9\x9c\x39\x97\x33\xe7\x72\xe6\x5c\xce\x9c\xcb\x99\x73\x39\x73\x2e\x67\xce\xe5\xcc\xb9\x9c\x39\x97\x33\xe7\x72\xe6\x5c\xce\x9c\xcb\x99\x73\xfd\x3e\x63\xb4\xb5\xb8\x7e\x07\x71\xed\xa6\xe1\xd6\x5b\x03\xe1\x98\x71\xcc\x39\x7a\x8e\x15\xc7\x9a\x63\xcb\x11\xf0\x04\x88\x17\x52\x0d\x12\xd9\x4f\x90\x69\x90\x28\xd8\x0b\xf6\x6c\x2d\x88\x06\x08\xd1\x00\xa1\x20\x40\x28\x08\x10\xa2\x01\x12\x2d\xf6\xdc\x5d\xb4\xd8\xc3\x41\x11\x01\xd1\x80\xe5\x12\xd2\x16\x42\x8c\x40\x88\x11\x08\x31\x02\x89\x19\xf6\x20\xa6\xa8\x1c\x90\x08\x4b\x45\x64\x17\x43\xec\x40\x88\x1d\x08\xb1\x03\x89\x6c\x68\x08\x1d\x08\xa1\x03\xa1\x88\x40\x28\x22\x10\x42\x07\x42\xe8\x40\x08\x1d\x08\xa1\x03\x21\x74\x20\x84\x0e\x84\x22\x02\xa1\x88\x40\xa8\xe4\x96\x58\x60\x5f\x60\x0f\xc8\x06\x74\xba\x44\x98\x3c\x28\x2e\x10\x0a\xbc\x85\x48\x82\x44\x8f\xbd\xc7\x9e\x4d\x13\xc1\x40\x01\xa2\x26\x90\xb6\x08\xa4\x2d\x42\x85\xa5\x10\x5f\x10\x08\x5c\x84\x54\x80\x00\x6b\x97\x58\x61\x5f\x61\xcf\x3a\x2a\x44\x90\x85\xda\x69\x61\x8f\x2f\x84\x20\x04\xc7\x4f\x28\x66\x11\xe2\x10\x12\xc1\xfc\xc4\x80\x3d\xf8\x1c\x72\x2b\x02\xc4\x4d\x22\x10\xad\x08\x97\x4a\xac\xb1\x87\x17\x03\xe8\x9b\x44\xc5\xce\xc0\xae\x12\x1b\xec\xd9\xe9\x92\x34\x92\x08\x80\x28\x36\xd8\xb3\xeb\x05\x5e\x2f\xb1\xc5\x9e\xed\x5d\x84\xd3\x22\x82\x75\x8a\x2d\xf6\xec\xf4\x08\x80\x08\x00\x3a\x89\x11\xfb\x88\x3d\xa0\xa1\x18\xb1\x8f\xd8\x47\xec\x23\xf6\x90\xa1\x44\x58\x31\x22\xb0\x9f\xc8\x36\x3a\xc2\xd4\x12\x3b\xec\x21\x01\xa1\xc2\x5e\x62\xa7\x1b\x56\xa3\xc4\x1d\xe9\x86\xb8\xdf\x03\x33\x2e\x35\xa7\x24\x5d\xa6\x3c\x1e\xe9\xee\x78\xb4\x21\x56\x60\x57\xc7\x58\x50\x07\x78\x67\x2f\x4c\x2f\x6a\xd9\x99\x74\x15\x1f\x74\xb7\xdf\xd1\x21\x9a\xae\xda\x6e\x99\x39\xfa\x6b\x77\xcc\x1c\xfd\x9e\x0d\x33\x47\x9f\xee\x97\xfd\x9e\xfd\x32\xc7\x7e\x8b\xcc\x91\xcd\x2b\x6c\x73\xfd\x6e\x19\x86\x8e\x9d\xad\x2f\x47\x76\xc6\xe4\xc6\x77\x76\xbe\xee\xea\x36\x57\x38\xe6\x1c\x61\x0a\x59\xef\x15\x2d\x71\x63\xdb\x14\x0d\xbb\x5f\x6c\x60\x2b\x69\x60\x16\x69\xc8\x94\x0f\x9b\xe3\x92\xaf\xd9\x55\x37\x25\x17\x5a\xb7\xa3\x6d\xd6\xb3\xc1\x36\xa5\xda\xb4\x1c\xa1\x1f\xa9\xb0\xaf\xb0\xaf\xb0\xaf\xb0\xaf\xb0\xaf\xb0\xaf\xb0\x87\x5b\x84\xc2\x32\x4b\x61\x99\x65\x17\x67\x29\x2c\xb3\xf0\x4b\xd9\x26\x60\x1f\xb0\x87\x7f\xa4\xa9\xb1\xaf\xb1\xaf\xb1\x87\x91\x84\x1d\x9e\x65\x87\x67\x81\xd0\x5a\xe2\x31\xb6\x69\xb0\x6f\xb0\x6f\xb0\x87\xb5\x04\x86\x2a\xdb\x34\xd8\x37\xd8\xc3\x63\xd2\xb4\xd8\xb7\xd8\xb7\xd8\xc3\x6c\xd2\xb4\xd8\xb7\xd8\xb7\xd8\xc3\x75\x02\x38\xd7\x36\x31\x4b\x22\x08\x4d\x12\x40\x78\x4f\xe8\x40\x38\x66\x1c\x73\x8e\x9e\x63\xc5\x51\x51\x3d\x6a\x09\xda\x27\xc7\x3e\xc7\x3e\xc7\x3e\xc7\x3e\xc7\x1e\x46\x90\x22\xc7\x3e\xc7\xbe\xc0\xbe\xc0\xbe\xc0\xbe\xc0\x1e\x48\x48\x51\xd4\x49\xdc\x02\xcb\x12\xcb\x12\x4b\x02\x15\x45\x89\x65\x89\x65\xa9\x96\x5c\xb9\xc2\xbe\xc2\xbe\xc2\xbe\xc2\xbe\xaa\x92\xf0\x47\xc6\x91\x18\x06\x44\x23\x7e\xfd\x8a\x09\xde\xea\xb7\x2d\x47\x60\x4a\x00\x35\x83\xcf\x38\x21\xe3\x84\x8c\x13\x32\x4e\xc8\x38\x21\xe3\x04\xe8\x50\x3c\x0d\xe7\x69\x38\x4f\xc3\x79\x1a\xce\xd3\x70\x10\x0a\x06\x4f\xc3\x79\x1a\x0e\xec\x67\xf0\x34\x9c\xa7\xe1\x3c\x0d\xe7\x69\x38\x4f\xc3\x79\x1a\x0e\x0e\xa8\xe0\x69\x38\x4f\xc3\x79\x1a\xce\xd3\x70\x9e\x86\xf3\x34\x1c\x3c\x51\x3b\xc1\x1d\x0f\x8c\x0a\xa8\x90\x07\xa4\x04\x73\x54\xf0\xb4\xae\xa7\x75\x3d\xad\x3b\x84\x81\x9a\x24\x0a\x84\x0d\x69\xa7\xe0\x69\x52\x4f\x93\x7a\x9a\xd4\x6b\x93\x02\xe7\xf2\x15\x17\x0d\x9c\x10\xb8\x68\xc0\x3e\x60\x1f\xb0\x07\xa2\xe4\x01\x27\xf9\x9a\xbf\xd7\xfc\xbd\xe6\x3a\x20\x94\x86\x88\x13\x57\x68\xca\x24\xec\xf4\x29\x03\x4e\x37\xc7\x98\x6c\x5a\x9f\xb6\x3f\xac\xb4\x3f\x92\xd4\xec\x8d\x24\x15\x7b\x23\x49\xd2\xa3\x44\x88\xf8\x0c\x0c\x0e\x69\x58\xa9\x50\xfc\x81\xe6\x6e\xb5\xf6\xb6\x2e\x6e\x13\x38\x1a\x28\x1e\x34\xc8\x63\xb2\x34\x3c\xe4\xb7\x11\x9f\x96\x02\xc7\xb6\xd4\x28\x92\x96\xad\xd7\x7d\xaa\x9a\x73\xa2\x56\xaf\x19\x4d\xcb\x68\x2c\x48\xb3\x2f\x7a\x87\x7d\xa1\x5d\x0f\x44\xd0\xf8\xd1\xbe\x90\x11\x29\xca\xbd\x21\x23\x25\x2f\xd8\x17\x32\x52\xf0\xc8\xbe\x90\x11\x59\xec\xfd\x21\xa3\x6a\x4f\xe0\x48\xef\x7b\x27\x70\x74\xbe\x09\x1c\xed\x68\xdf\x5f\x95\xbe\xff\xa0\xda\x2e\x2d\xea\x0a\x9b\x0a\xab\x82\x3d\x6f\x5a\x14\xb5\xa7\x84\xe9\x4a\xd5\x52\xc5\xe6\xaf\xaf\x4d\x50\x6a\xbc\xae\xd9\xe0\xbf\x4b\x9c\x58\x85\x5a\x37\xbe\xdc\x02\xa2\x5b\x25\x69\x6b\x0b\xa0\xcc\x00\xc3\xdb\xaa\xde\x00\x9a\xaf\x47\xfd\x92\xa4\xb5\x5c\xa4\xc7\xc5\x8e\x20\xaa\x7b\xc0\xa9\xeb\x19\x9f\x99\x2a\xa6\xd8\xd3\xf5\x7a\x61\xd6\x9e\x52\x70\x4a\x5f\xa5\x30\xd1\x1e\x1f\xea\x75\x81\x6e\x36\xf0\xcf\x31\xe2\xd3\x9b\x2d\xe0\xb3\xd3\x63\x95\x20\x28\x15\xec\x68\xb6\x68\xc5\xf5\x2b\x6c\xc0\x27\xf6\x88\xc2\xbc\x1b\x70\x85\x1d\xa4\x83\x1d\xfc\x3e\x5d\x57\xed\xf0\x19\x69\x3a\x7f\x9b\x9a\x4f\xa7\xea\xfb\x13\xec\x7d\xd6\x74\x93\x28\x1d\xc6\x9a\xa6\x3e\x93\x21\x36\x1f\xeb\xc3\xee\x8c\x2f\xad\x2b\xd4\xd0\x13\x71\x1d\xad\x18\x91\x46\x03\x1f\xee\x56\x05\x79\x84\x55\x0a\x27\x1f\x50\x9d\xf7\xa9\x2b\xf2\xc6\xf5\x77\x3f\x61\xb5\x9d\xfd\xa5\xda\xee\x97\x6a\xbb\x5f\xaa\xed\xfe\xc9\xab\xed\xf2\x9f\xbe\xda\xee\xe7\x5a\x67\xa7\x9c\x91\xff\x61\x2a\xe8\x7e\xde\x75\x72\x69\x85\x9c\x83\x3f\x9f\x1a\x8a\x9f\x59\xb9\xdc\xbf\x41\xa1\x9c\xff\xb0\x0a\x38\x2b\x99\x82\x17\xb2\xf2\x4a\xc1\xd4\xbf\x43\xa9\xd4\xa6\x3c\x6a\x4f\x2d\xd4\x9e\x22\xa8\x9f\xac\xfa\xc9\xac\x37\x2d\xc1\xb0\x69\xd9\x2d\x85\xf2\x69\x29\x54\x7d\x63\x29\x94\xd6\x40\x8d\xca\x9e\x88\x5b\x78\x2e\xe2\x21\xcc\xfc\x39\x97\x33\x8d\x0b\x99\xfc\xa7\x29\x64\x22\x54\x11\x34\x54\xf1\x89\xaa\x9a\x38\x36\x7b\x8a\x9a\x3e\x49\x35\x53\x63\x3e\x65\xcd\xd2\x3f\x47\x65\x52\x5f\x7f\x04\x1f\x6d\xe7\x35\x76\xb2\xde\xc5\x75\x1a\xac\xfe\xa5\x32\xe9\x16\x95\x49\xfd\x7d\x61\xff\x4b\xfd\xd1\xcf\xb5\xfe\xe8\x97\x2a\xa3\x5f\xaa\x8c\x7e\xa2\x2a\xa3\x5f\x0a\x8b\x8e\x7f\x29\x2c\x3a\xfe\x34\x85\x45\xef\xaf\x25\xda\x2d\x1f\xfa\xe7\xad\x0f\xda\x53\xa7\x72\xab\xd2\x94\x5f\xea\x50\x8e\x7f\xa9\x43\xb9\xae\x0e\x65\xb5\x09\xcf\xbf\x9a\xac\xa6\xf1\x2a\x74\x98\x68\x3c\xf0\x4b\x00\x6a\xd2\x28\xfc\xd2\x02\xda\xd0\x02\x08\x02\x21\x5d\xa5\x1f\xc0\xd5\x74\x41\x3f\x84\x6e\x5b\xda\xa0\x05\x0c\x5d\x93\xfc\xf8\xe5\x56\xfc\xee\xe2\x62\x1f\x6e\xf9\xd1\xe1\x9f\x77\x2b\x60\x88\x06\x0a\x01\x2d\x8a\x19\x0c\xea\x23\x46\x0c\x10\x54\xc3\x3d\x12\x94\x16\x42\x82\x60\x37\x8c\x10\x11\x14\x74\xca\x44\xb0\x17\xec\x05\x7b\x32\x4f\x82\xe4\xa0\x08\xf6\x16\x7b\x8b\x3d\x19\x29\xca\x20\x0c\x65\x10\x46\x2c\xf6\x16\x7b\xa4\xef\xd0\x3e\x31\x42\xa8\x0f\x54\x88\x11\x42\xdb\x60\x43\x8c\xa0\x80\x06\x36\xc4\x50\x1b\x61\xc4\x01\x86\x75\x80\x5b\x89\x06\x0a\x51\x39\x21\x7b\x21\xa8\xed\x01\x1c\x31\x42\x12\x40\x72\xae\x8c\x28\x98\x10\xb7\x14\x92\x0b\x42\xe8\x55\x88\x2b\x0b\xd1\x72\x21\x0c\x2b\x05\xf6\xc8\x6f\x49\x81\x7d\x81\x3d\x59\x08\x21\xe8\x27\xe4\x48\x04\x5d\x2a\xf1\xd8\x13\x62\x17\xca\x83\x04\xe5\x41\x01\x66\x29\xc0\x2c\x05\x98\xa5\x10\xb5\x14\xa2\x96\x80\x5a\x8c\x50\x2f\x24\x25\xf7\x5f\x2a\x34\x19\xfc\xa5\x68\xc8\x57\x08\xcf\x0b\xd0\x4b\x21\xa3\x23\xaa\xd0\x26\x88\x61\x09\xc1\x6b\xa9\x14\xe5\x4c\xe3\x04\x6e\x09\x99\x36\x21\x84\x2d\x88\x71\x09\x08\x4c\x01\x81\x29\x81\xb3\x82\x82\x9f\x39\x0b\x3e\x71\x23\x04\x44\x05\x08\xa6\x00\xc1\x94\x9a\x9f\xa9\x15\xc0\xcc\xe5\xc8\xb8\x08\x50\x4b\x41\x85\x4b\x00\x59\x0a\x69\x4d\x21\x51\x24\x24\x8a\x04\x90\xa5\x00\xb2\x14\x40\x96\xa2\xe3\x8f\x68\xb4\x44\x6e\x91\xfc\xa7\x90\xd5\x94\xc8\x6f\x91\x12\x12\x32\xa2\x42\xaa\x49\x88\x58\x0b\x39\x4f\xe9\xf4\xe9\x01\xca\x0a\xa9\x4f\x21\xa5\x22\x5d\x04\xa3\x0c\x3c\x98\xa1\x6d\x19\xda\x96\xa1\x6d\x19\xda\x96\xa1\x6d\x19\xda\x96\xa1\x6d\x19\xda\x96\xa1\x6d\x19\xda\x96\xa1\x6d\x19\xda\x96\xa1\x6d\x19\xda\x96\xa1\x6d\x19\xda\x96\xa1\x6d\x19\xda\x96\xa1\x6d\x19\xda\x96\xa1\x6d\x19\xda\x96\xa1\x6d\x19\xda\x96\xa1\x6d\x89\xa5\x5b\x86\xb3\x65\x38\x5b\x20\xf8\x96\xe1\x6c\x55\xe5\xd0\x92\xaf\x25\xbe\x6b\x2c\xe3\xd9\x32\x9e\xd1\x2d\x33\x19\xe3\x2d\x63\xbc\x0d\x85\x68\xef\xab\x3a\xe3\x88\x51\x25\x57\x2b\xd0\xc0\xe2\x66\x74\x60\xc6\xf6\xda\x64\x80\xd2\x33\xe0\xe8\x19\x70\xf4\x8c\xc4\x56\x46\xdf\x65\xf4\x5d\x46\xdf\x65\xf4\x5d\x46\xdf\x65\xf4\x5d\x46\xdf\x65\xf4\x5d\xa6\xd9\x6c\x7a\x0d\x45\x33\x93\x91\x19\xca\xe8\xb4\x0c\x60\xa9\x71\x56\x71\xcd\x86\x23\xa8\x5e\xa6\x9d\x63\xda\x39\xa6\x9d\x63\xda\x39\xa6\x9d\x63\xda\x39\x9a\xc1\xd1\x0c\x8e\x69\xe7\x68\x0c\xc7\xb4\x73\xa4\xce\x1d\x45\x02\xce\x63\x4f\x46\xc5\xd1\x2e\x04\xde\x8c\xa3\x5d\x1c\xf9\x14\x47\x75\x80\x63\x72\x39\xf2\x15\x8e\xb9\xe5\x48\x0f\x39\x66\x98\x23\x3d\xe4\x98\x5b\x8e\xb9\xe5\x98\x5b\x8e\xb9\xe5\x48\xc5\x38\x72\x44\x8e\xb9\xe5\x98\x5b\x8e\x5c\x83\x23\xd7\xe0\xc8\x5a\x3a\x8a\x06\x1c\x93\xca\x91\xb9\x75\x4c\x2d\x57\x2b\x5a\x19\x7b\xc0\x02\x8e\x24\xae\xe3\xe5\xe1\x98\x72\x8e\x5a\x02\xc7\x2b\xc4\x35\x8a\x56\xc6\x9e\x5a\x02\x47\xb7\x39\x6a\x09\x1c\x9d\xe7\xe8\x3c\x47\xe7\x39\x3a\xcf\xd1\x79\x8e\xce\x73\x74\x9e\xa3\xf3\x1c\x9d\xe7\xe8\x3c\x47\xe7\x39\x3a\xcf\x91\xb8\x74\xa4\x8a\x1c\x1d\xe9\x3a\xec\x99\x7d\x8e\x8e\x74\x0a\x53\x67\xf6\xe5\xcc\xbe\x9c\xd9\x97\x33\xfb\x72\x66\x5f\xce\xec\xcb\x99\x7d\x39\xb3\x2f\x67\xf6\xe5\xcc\xbe\x9c\xd9\x97\x33\xfb\x72\x66\x5f\xce\xec\xcb\x99\x7d\x39\xb3\x2f\x67\xf6\xe5\xcc\xbe\x9c\xd9\x97\x33\xfb\x72\x66\x5f\xce\xec\xcb\x99\x7d\x39\xb3\x2f\x67\xf6\xa5\xf5\x93\xd7\x97\x4c\x8e\x0a\x23\xaf\x2f\x7f\x64\x3b\x24\x71\xfd\x70\x02\xff\xb8\xc4\xf5\xc3\x49\x5c\x3f\x9c\x44\xa3\x00\xe7\x86\x63\x04\x92\x8c\xbd\x60\x2f\xd8\x13\xbc\x47\xc0\x46\xa2\x60\x8f\x54\x5d\x24\x2b\x00\x9b\xb9\xe0\x42\x0a\x2e\xa4\xc0\x66\x2e\xb0\x99\x4b\x24\xa1\x14\x2d\xf6\x16\xfb\x0c\xfb\x0c\xfb\x0c\xfb\x0c\xfb\x0c\x7b\x54\xe8\x62\x86\x7d\x86\xbd\xc3\x9e\x44\x06\x3b\x50\x01\x1b\x22\x70\x9f\x0b\xdc\xe7\x02\xf7\xb9\x44\x14\xe5\xd8\xe5\x09\xfe\xa6\xe0\x6f\x0a\x0c\xe8\x02\x03\xba\xc0\x80\x2e\x30\xa0\x0b\xfb\x0c\x81\x01\x5d\xf0\x37\x05\x7f\x53\x60\x40\x97\x58\x60\x0f\x9e\x24\x92\x73\x81\x60\x5b\x22\x29\x17\xfc\x4f\x21\x5a\x28\xd1\x63\x4f\x76\x25\x7a\xec\x3d\xf6\xa8\xd7\xa1\x38\x29\x64\xfc\x84\x8c\x9f\x10\x62\x10\x42\x0c\x42\xda\x4f\x22\x39\x38\xa4\x62\x24\x56\xd8\x57\xd8\x57\xd8\x57\xfc\x9d\x74\x48\x0c\xfc\x3d\xf0\xf7\xc0\x75\xc8\xdd\xb0\x1d\x97\x18\xb8\x0e\x29\x13\x22\x36\x42\xc2\x50\x22\x08\xda\x08\x82\x96\x2d\xbb\x44\x06\x4a\xc4\x49\x43\xef\x52\xa8\x7a\x93\xd8\x60\x0f\xa4\x56\xd1\x37\xb1\xc1\xbe\xc1\x1e\x77\x0e\x1d\x4c\x21\x78\x28\xb1\xc5\x1e\x3d\xbe\x48\x3e\x2d\xb6\xd8\xb7\xd8\x93\x8b\x22\x30\x22\x31\x62\x8f\xa0\x33\x71\x2b\x89\x11\xfb\x88\x3d\x39\xb2\x48\x96\x06\x19\x0b\x89\x28\xfa\xb1\xf1\x95\x08\x46\x37\x92\xaa\x89\x24\xd0\xa8\xc4\x13\x02\xb4\x02\xc3\xbf\x74\x46\xbd\x4f\x10\xf8\x3b\xf5\xbb\xfa\x01\xec\x7c\xa7\x6a\x87\x88\x4e\xed\x16\xf3\xee\xa9\xdf\x05\xbf\xac\x46\x85\xba\xb5\xfa\x01\xd0\xb7\xc6\x3a\xa5\x03\xd1\xdd\x69\x1e\x71\x28\xcc\x2d\xd3\xc2\x5c\xfd\xd0\xd5\x57\x6a\x71\xa9\x6c\xa5\xce\xce\x0a\x01\x42\x8b\xbb\xfa\x31\x85\xb9\x9a\xae\xa2\x82\xce\x52\x23\xb7\xad\xc8\xdd\x14\xe1\x8e\xcb\x6f\xd7\x03\xdf\xaa\x86\x8f\x45\x61\xd6\x82\xba\xb3\x4d\x01\xb0\xb6\x00\x58\x8b\xb4\x8c\x45\xd8\xc0\x36\xc8\x28\x36\xc8\x1c\x0e\x25\xba\x25\x5f\x94\x7c\xa1\x70\xe7\x12\x54\x73\x09\xaa\xb9\x04\xd5\x5c\x82\xb0\x2a\xf9\xd1\x0a\xfb\x0a\xfb\x0a\x7b\xd5\x4b\xac\xb0\x47\x99\xb0\x51\x5c\x56\x85\x7d\xc0\x3e\x60\x1f\xb0\x27\xed\x06\x8a\xc0\x36\x01\xfb\x80\x3d\x19\x38\x74\x03\x2c\x05\xaf\x16\x29\x5c\xdb\x90\x8c\x6b\x6a\xec\x6b\xec\x6b\xec\xc9\xcb\xa1\x30\x60\x9b\x06\xfb\x06\x7b\x52\x74\x4d\x83\x7d\x83\x7d\x83\x3d\xd9\x3a\xb4\x08\x6c\xd3\x62\xdf\x62\x4f\xe2\xae\x69\xb1\x6f\xb1\x6f\xb1\x87\xee\x10\x04\x83\x6d\x22\xf6\x91\x16\x8d\x40\x95\xc9\xc7\x80\x90\x0b\x85\xd3\x7f\x3b\x8e\x05\xc7\x92\x23\xe9\x33\x07\x6c\x0c\xb5\xc1\x22\xc7\x3e\xc7\x3e\xc7\x3e\xc7\x3e\xc7\x1e\x44\x68\x91\x63\x8f\xac\x61\x51\x60\x5f\x60\x5f\x60\x5f\x60\x0f\x5c\xb4\x28\xb0\x2f\x1a\xad\x92\xe6\x88\x65\x89\x65\x89\x25\xa8\xb4\xa2\xc4\xb2\x54\x4b\xae\x5c\x61\x5f\x61\x5f\x61\x5f\x61\x5f\x61\x5f\x05\x2d\xb6\xe6\xe8\x38\x02\x60\x25\x2d\xe6\xad\x7e\x0b\xd2\x96\xb4\x92\xcf\xb0\xcc\xb0\xcc\xb0\xcc\xb0\xcc\xb0\xcc\xb0\xcc\xb0\xa4\xc5\x3c\x2d\xe6\x69\x31\x4f\x8b\x79\x5a\xcc\xd3\x62\xe8\x96\x07\x4f\x8b\x79\x5a\xcc\xd3\x62\x9e\x16\xf3\xb4\x98\xa7\xc5\x3c\x2d\xe6\x69\x31\x4f\x8b\x79\x5a\xcc\xd3\x62\x9e\x16\xf3\xb4\x98\xa7\xc5\x3c\x2d\x46\x06\x3e\x78\x12\x9a\xde\x03\xe1\xf5\x40\x78\x3d\xd0\x3e\xcf\xdf\x4b\xc5\xf4\x71\x1d\xda\xd3\xd3\x9e\x1e\xdc\xb6\x2f\x15\x34\x8c\x0d\x6d\xe8\x69\x3d\x4f\xeb\x79\x6d\x3d\xe0\x82\xbe\xe2\x6a\x01\xcb\x80\x65\xe0\x6a\x01\xfb\x80\x3d\x91\xd0\xe0\x03\xa6\x84\x0c\x82\xaf\xb1\x22\x5b\xe8\x6b\xac\x6a\xae\x5a\x73\xd5\x1a\x53\x52\x86\x1e\xfc\x68\xf0\x0d\x69\xd8\x86\xc7\x59\xbb\x14\x49\x5d\xfa\x4d\xa5\xe8\xaa\x89\xb8\x29\x45\xdf\x5f\x7d\xbe\xaf\xe0\xbc\xde\x5b\x70\x9e\xef\x2d\x38\x57\x85\x18\x0d\x43\xf5\x89\xae\xa2\xd7\xca\x20\xbc\xfd\xd1\x35\xe8\x79\x9a\x71\xd0\x70\xad\xfb\xe0\xe2\x73\x62\x97\x1f\x53\x7b\xae\xa1\xac\xb6\xcc\x93\xd8\x76\xad\x92\x61\x1a\x4f\x24\xf6\x19\x8d\x56\xa5\x6b\xa8\xae\x97\x37\x51\x69\x17\x9f\x86\xb7\x46\xc5\xeb\xb1\x97\xd7\x0b\x9a\xa8\x49\x02\x53\xbd\xce\xa2\x56\xa5\xf7\x8a\x4f\x5a\x88\xde\x84\x7d\x45\xe7\x56\x92\xc8\xd1\x37\x5b\xe8\x70\x58\xbc\xde\x06\x8b\x32\x45\x42\x66\x5a\xbe\x49\x26\xc6\xb8\x92\xaa\x3d\xdd\xbd\xe5\x80\x95\x72\xca\x20\x73\x36\x0a\x39\xc5\x90\x39\x7b\xf3\x9c\xed\x42\xce\x76\x41\x11\x04\xa6\xc0\x8b\x2e\x10\xf0\x30\xd4\x4e\x98\x82\xed\x53\x01\x01\x86\x29\xd8\x1f\x14\x8a\x57\x2c\xd8\x14\x14\x14\x3b\x16\x6c\x0a\x8a\xa8\x00\x4f\xaa\x1d\x41\xd6\x18\xaf\x25\xa9\xac\x11\xc6\x07\xae\xe2\xd9\xe9\x78\x18\x26\x8c\xa7\x10\xd2\x53\xf0\x58\x8a\xc2\x34\xa9\x54\x2c\x85\xef\x4b\x0a\x13\x4b\x9b\xeb\x07\xcf\xb1\xd2\x0f\x9c\xa3\x30\xc6\x92\x32\xf2\x92\x1c\xb4\x29\xc1\xae\x95\x51\xb1\x99\x54\x4e\x56\xaa\x02\x5f\x51\x1d\x5c\x21\x0f\x64\x2a\xca\xd3\xab\x5c\x65\x15\xa8\x49\xaf\xd8\x56\x56\x14\xcd\x56\x65\xaf\xb7\xc0\x07\x76\x5e\x55\xad\x27\xd2\x7e\x95\xa2\x49\x89\xd5\x55\x2a\x9a\x5e\x35\x8a\xe7\xe4\x0b\x76\x4e\x15\x75\xa1\xc0\x14\x4c\x50\xb0\x5a\x30\x0a\xcb\x04\x77\xa9\x77\x02\x58\xc1\x04\x02\x53\x81\xed\x7c\xd0\x3e\x08\xd4\x28\x07\x2a\xe8\x41\x23\x9b\xe0\xf5\xdf\x80\x3a\xf5\x0e\x43\xa9\x78\x4b\x2e\xa8\x77\x18\xe8\xdb\xa0\xba\xee\x81\xbd\x60\xd0\x5b\x0c\xdc\x62\xe0\xe6\x02\x37\x17\x14\x96\x8b\x2e\xad\x51\xb0\x82\xa9\x8d\x02\x2b\x41\x3b\xea\x3d\x92\xf2\x37\x35\xf7\x58\x73\x8f\xb5\xde\x63\xed\x14\x65\xa9\x60\x4a\x9a\xb1\xa6\x19\xeb\x42\x51\x96\xfc\x5b\xef\xab\x66\xfc\xd5\x8a\x6d\xaf\x69\xba\x5a\xc1\xbd\x35\xf7\x55\xd3\x74\xba\x02\x99\x86\x5d\x61\xa3\x3f\xdf\xf0\xf3\xaa\xc0\x67\x48\x9c\x1a\x95\xcd\x36\xac\x4d\x86\xe4\xb2\x41\x7c\xd4\x34\xfc\x7c\xc3\xcf\x37\xda\x46\x54\x6e\x19\x9c\x10\xd3\xe8\xbd\xe0\x79\x98\x46\xef\x05\xd7\xc3\x34\x7a\x2f\x14\x42\x19\xb2\x12\x06\x4f\xc3\xe0\x4b\x18\xca\x9b\x8c\xce\x51\x43\x95\x83\x41\xc0\xcf\xb4\x34\x94\xaa\x4e\x19\x96\x1e\xd3\xea\x9d\xb6\xdc\xa9\xae\x40\x06\xbd\x2c\xd3\xd2\x44\x2d\xf7\x48\x06\xde\xb4\x7a\x8f\x2d\xf7\xd8\x12\x2c\x6b\x1b\x05\x4b\xb2\x51\x07\xa6\x64\x34\x47\x68\xd0\x96\x36\xad\x42\x32\x99\x3c\x54\xa6\x1a\x4d\x18\x18\xf6\x72\x46\x75\xed\x0c\x9b\x33\x43\x02\xd9\xc4\x5a\xbf\xa7\x09\x22\x4e\xb4\x89\x2a\x8c\xcf\x0e\xba\x63\xd6\x91\xcf\x36\x14\x19\x1a\xf2\xa1\xa6\x23\xee\x84\xeb\x6e\x14\x88\x61\x3a\xa2\x91\x1d\x71\x24\xca\x09\x4d\x57\xaa\xf4\x3e\x95\xde\x9d\xb2\x26\x10\x8c\x36\x5a\x22\x68\x90\x15\x13\xc3\xe6\xd2\xb0\x1a\x8a\xc1\xf5\x37\xb9\x82\x18\xd9\x10\x1a\xfc\x62\x31\xec\x08\x0d\x19\x08\x31\x20\xdf\x0c\xbf\x2c\x86\xbd\x9f\x29\xd5\x0c\x44\x22\xd2\xe2\x62\x54\x9c\x9d\x32\x01\xc9\x72\xd5\xcc\x57\x1d\x7b\x45\x17\x7a\x76\xd5\x3e\xd3\x0f\x6c\x81\x71\x50\x84\x6a\x28\xf1\x6c\x2d\x3d\xd5\xb1\xbe\x56\xb5\xfb\x56\x91\x7d\x2d\x6a\xf6\xaa\x56\x4f\xbd\x71\x49\x35\x6c\xc9\x86\xb2\xa4\x7c\xb5\x52\x8c\x5d\x45\xd1\xb0\x62\x9b\xa4\xa2\x22\x38\x50\x73\x20\x81\xf2\xe3\xc0\x1c\x11\xc0\xd6\xa2\x68\x24\x09\xec\x5a\x03\x38\xc6\xa0\x20\x3e\xb0\x45\xa2\xa5\x44\x52\x13\x3d\xa8\x33\xd5\x8e\x67\x2b\x5e\x6b\xcd\x74\xcd\xcd\xaa\x9a\x91\x30\xcb\xa4\x26\xc1\x22\x35\x75\xb4\x35\xc4\xcf\x52\x2b\xee\x0e\x05\x46\x21\xf7\x2f\xfa\xf2\x15\x1c\x6a\x51\x45\x61\x21\xf7\x2f\xf8\xc9\x02\xf6\x42\x1a\xa8\xa6\x04\xb1\x59\x51\x28\x9d\xb4\xfa\x41\xc5\xe7\x5b\x15\x7b\x57\x28\x9d\xe9\xd4\xe7\xee\x54\x75\x5d\x90\x50\x87\xf0\x9c\x64\xaa\x6d\x55\xd8\x9c\xdd\x53\x66\xb4\xd8\xa3\xaa\x38\xaa\x43\xac\x3c\xdd\x1e\xdf\x96\x0c\x53\x28\x70\xed\x8a\x4a\x5d\x5f\x55\x29\xc7\x01\xee\x14\xaf\x06\x1c\x0d\x54\x15\xfa\x93\xa1\xb4\x8a\x60\xa3\xc6\xae\xc4\xd3\x2d\xf1\x08\x4b\xea\xce\x4a\xba\x35\x94\x0d\x00\x37\xc5\x69\x95\x7a\x29\x84\xc6\x2b\xab\x44\xd9\x14\xe4\x55\x4e\xc1\x66\x94\xca\x29\xd2\x32\xf0\x26\x08\x15\x90\xe4\x50\x01\x00\xab\xc0\xd4\x05\xab\xc8\x30\x9c\xe8\x40\x35\x5e\xc0\x1d\x66\xf9\x0e\xc1\x2b\xeb\x35\x8f\x03\x50\x3e\x84\x5a\xe9\xae\x71\x18\x03\x75\x69\x01\x87\x31\xe0\x24\x06\x2a\xd2\x02\x02\xec\x21\xea\xd9\xc0\xde\x02\x4c\x48\x81\xc2\xb4\x9a\xf7\x5b\xa8\x81\x9a\xd5\xeb\x4d\x6f\xa8\xa3\x62\xbb\xe2\xf1\x65\xa7\xf9\xc7\x8e\xe2\xf8\x2e\x5a\xfd\x60\xf7\x2a\x6d\xb7\x5d\xab\x59\x6f\x52\xbb\xea\xaa\xf8\x90\x62\x7e\x14\x67\xbd\x4d\x66\x72\x04\xb3\xa1\x78\x82\x41\x06\x4e\xbd\xa1\x5e\x40\x4f\xf5\xdc\xb0\x8d\x45\xea\xa3\xb6\x2a\x07\xaa\x58\x24\x4a\xbf\x5b\x82\x28\x1b\xc9\xcc\x21\x77\x6c\xdc\x08\x13\x60\x15\x57\xa4\x0e\x29\xfe\xa5\x57\xbc\x45\x69\x13\x7f\xb8\x0e\x69\x32\xd9\xea\x0f\xa9\x83\xa8\x3e\x61\xbe\xf5\x0c\x91\xda\x1b\x90\x18\x5c\x45\x11\xe7\x6d\x8b\x47\xd7\x2a\xe2\x47\x75\xdf\x40\x8e\xf6\x1a\xe1\xd1\x36\x69\x76\x56\x53\xe7\x8a\x4e\x41\x25\x7a\x48\x56\x1a\x85\x97\x68\xcd\x19\x4f\xa8\xca\x84\x9d\xd3\x7c\x25\xc9\x74\x50\x40\x1b\x5d\x4f\x45\x9f\xf0\x85\xaa\x85\x16\x4a\xe5\xd9\x7b\x90\x4d\x52\xa4\xe6\xdd\x08\x96\xa2\x28\x96\xbe\x65\x48\xe7\x0f\x4d\x02\x48\xac\x0d\x8a\x06\xc1\xff\x1e\xb4\xb4\xf5\x31\x41\xe9\xb4\xa4\x59\x63\xd6\x23\x06\x4c\x9a\x96\xe5\x76\x44\x93\xfe\xb6\x1e\xed\x2c\x7a\x4d\xc1\x5e\xc4\xb2\xc7\x66\xe5\xc7\x9b\xca\xbf\xde\x51\x1f\xbb\xe8\x1c\xed\xf1\x86\xc2\x51\x85\xd5\xdb\x56\xd5\x8a\xd5\x5d\x57\xd5\xe7\xe8\xd2\xe1\xa7\x03\x4b\x01\x44\x43\x4e\xfc\x70\xdb\x05\x9a\x14\x57\xbd\xe5\x3e\xc9\xdd\xa3\x89\x36\x70\x0d\xdf\x4b\xc2\xea\x4d\x17\xc9\x88\xca\x54\x15\x51\xf1\x25\xbd\xaa\xa7\x6e\x5f\x54\x4a\x39\xd3\x7b\xec\x05\x89\xf5\x71\x75\x2b\xa2\x2a\x9e\xbd\x28\x6a\xbe\xc5\x4b\x95\x3d\xb2\x84\x87\x46\x21\x18\x79\xfe\xb6\xd5\x9a\xaf\xb6\xe2\x76\x55\x12\x39\x76\x23\x88\x46\xec\x7a\x3c\x83\x4b\x80\x5e\x59\x31\x82\x5b\x8c\xd4\xa5\x51\xbf\xee\x14\x2e\xd5\xa1\x0e\xdc\x29\x4e\xad\x63\x56\x77\x32\xc2\x45\x28\x59\x79\x15\x53\x41\xd5\xb6\x50\x0e\x30\x95\x19\x56\x75\xe3\x01\xeb\x55\x27\x13\x44\x05\x78\xdb\xb2\x4e\xf0\x40\x08\x9f\x46\x45\x2e\x46\xe7\x46\xc2\xa4\x03\xd8\xa4\x48\xba\xab\x50\xb8\x00\x6b\x43\xe9\x8e\xb7\x1a\xb7\xaa\xb3\x3f\xe0\x04\x76\x84\x4b\xfb\x65\x40\x05\xe9\xb5\xd3\x10\x78\x6f\x44\x45\x4b\xd9\xac\x81\x4d\x6f\x1b\x70\x15\x8d\xd5\xea\x55\x3b\x1a\x9c\xdc\x48\x1c\xd4\x32\x47\x48\x8e\x7e\x57\xda\xf6\xd0\x37\xed\xd1\x90\xea\x18\x0e\x0b\x4b\x4c\xa5\x08\xbf\x69\xb6\x1a\x80\x17\xa1\x99\xcc\x4e\x4f\xc6\x5b\xb5\x61\x13\x52\xa7\xbb\x0f\x0a\xbd\xb4\x38\xa4\x22\x6f\x57\xe1\xae\xf5\xdb\x12\xdc\xe6\x61\xf3\xd1\x6f\x3b\xcc\xd5\x6d\x07\xc7\x66\xb3\xeb\x18\x36\x17\xfd\xb6\xc2\x24\xdb\x83\x7e\x63\x60\xd2\x1d\x01\x47\xad\xba\xb2\x89\xdb\x4f\x79\x13\x27\xef\xf8\xfb\x1c\x9b\xad\x9f\x4f\x26\x8a\xd2\x67\x53\xb3\xc1\xbc\xc9\xc1\x6f\x12\x07\x5f\x9d\x72\x7e\xae\xd1\x72\xc2\xde\xc1\xe7\xb1\x07\x6f\x9d\x72\x24\xad\xb5\x19\xbc\x75\x9f\x3a\xeb\x1c\xeb\x1d\x5f\x9d\x35\x7f\xe3\x9e\xf7\x2e\xb9\xb9\xd6\x25\x6f\xb6\x2e\x39\xbf\x3d\x78\xe1\xbd\xff\x2d\x37\x79\xde\x63\xdf\xb8\x53\x47\x97\x23\xe5\x3d\x94\x93\x18\x52\x2c\x54\xb1\x0a\x65\x05\x6b\xff\x97\xa3\xbf\xd9\xe3\x85\x79\xc5\x94\xea\xf0\xea\x17\x5a\x35\x34\x76\x78\x29\x4c\x21\xc9\xe0\x6b\x2d\x4f\x21\x69\x45\x68\x49\x28\x67\x97\x0a\xc7\x48\x2a\x52\x44\x15\xce\xca\xd6\x57\xe5\x28\x1c\xd5\x8a\xfb\x0d\xb0\xe6\x04\x12\x4f\x81\x62\xa4\xc0\xfd\x06\xaa\x90\x02\xac\x33\x81\x9b\x0e\xac\x14\x12\x70\xa0\x07\x6f\x35\xe7\x48\x5d\x49\xd6\xaa\xe7\x2a\x1c\xb3\xad\x17\x3b\x78\xac\x1c\x0b\x8e\x68\x39\x91\x54\xa9\x61\x0b\xa9\x63\x5f\x7b\xd2\x70\xa4\x28\x85\xdc\xc4\xd8\xa9\xe5\x51\x80\x63\x0a\x10\x64\xa1\x78\x6d\xed\xc0\xe2\x6b\xc6\xc1\xe3\x0c\x04\x13\x02\x85\xcf\x83\x9b\xb8\xcf\x41\xc4\xcd\x23\x7a\x39\xf8\x7f\xea\xf8\x51\x85\x40\x45\x40\x45\x5c\xaf\x82\x44\x40\x67\x67\xef\x10\x06\x7e\x87\x2a\xcc\x40\xfd\x65\x08\x04\x58\x37\x9e\xe0\xd6\x11\x8c\xfc\x3b\xc6\x1d\xe7\xae\x5e\x6f\x32\x43\x4d\xc9\x43\x1d\xd5\xd1\xf3\x1c\xab\xd4\xdb\xdb\xf1\xe3\xdc\x48\x63\xf5\xaa\x4f\xa4\x1f\x34\x6c\x58\x26\xa8\xb6\xc4\x17\x1a\xb9\x3f\xbd\x93\xd0\x25\xae\x50\x4c\xfc\x1e\x10\x99\x03\x50\x4d\xa5\x93\xd5\xcf\xeb\xf1\x71\xbc\x7f\x8c\x4d\x5c\x20\x22\x5f\x99\x52\x94\xcb\x87\xbb\x40\xfb\x1c\x9d\x5e\x93\x9f\x67\x06\xaa\xda\xf0\x38\x3b\xcf\xdc\x13\x17\xe8\x9f\x70\x8a\x1a\x49\xbd\x21\x49\xbc\x21\xf8\x0d\x14\x46\x3e\xf8\x41\xfd\x33\xd6\x1a\x06\xdc\xba\x1a\x41\x21\xfd\xfa\x6f\x55\xf2\x05\x3f\x0f\xd6\xb3\xe3\x4d\xd4\xd9\x62\x9f\xa7\xa4\x68\xd6\xde\x2d\xba\xd6\x5f\x6a\x77\x1d\xa5\xc1\x45\x52\x7f\x49\x83\x98\xc8\x07\xf4\x2e\x92\xba\x43\x3d\xca\x0f\x60\x67\xe5\x77\x7c\x1e\x7e\x57\x15\x8e\xb5\x55\x68\xb4\xda\x5d\xf5\x55\xf8\x91\x8a\x2f\x2a\x5e\x97\xe0\xf0\xb7\x3e\x8a\x3a\x20\x23\xd7\x63\xec\x67\x6c\x5c\x0a\x8e\xc5\xc8\xa3\x48\x5f\x9c\x71\xf3\xe2\x3c\x9a\x35\xd3\xf9\xf2\xea\xab\xd3\xc1\xd0\x48\x5c\x53\xd8\x1d\x59\xd3\x92\x1e\x33\x64\x79\x0c\x41\x57\x6b\x98\x2f\x85\x72\x71\x14\xde\x26\x3f\x31\xdb\xfc\xc4\xd3\xf9\x6c\xb9\xf7\xf5\xbc\x3f\x92\xea\x7f\x89\xa4\xee\x44\x52\xad\x46\x52\xb7\x81\x54\x7d\x75\x57\xbc\x51\x2b\xd7\xbe\x27\x9c\xba\x8d\xa3\x36\x92\xc6\x51\xdb\xeb\xc2\xa5\x1c\xed\x36\x5a\x0a\xf8\xe9\xe3\x83\xa5\x1c\xed\x36\x56\xaa\x77\xb1\x89\x95\x72\x2c\x6f\x15\x23\x4d\x82\xa3\xfc\x45\xdb\x61\x08\x91\xf6\xf1\x50\x8e\xc5\xfe\x70\x28\x6e\x98\xc6\x3c\x59\xb5\x77\x83\x9d\xe6\x63\x83\x9d\x49\x94\xb3\xd3\xf0\x26\xc7\x66\x1b\xd6\x1c\x87\x32\x39\xca\x6e\x24\x53\x9f\x67\x88\x64\xb6\x57\xe3\x95\xdb\x40\xa5\x02\xc1\xd2\x40\xe5\x4f\x1c\x8f\xec\x63\x90\x80\xb5\xb4\xbc\xe6\xa3\x02\x92\xca\x55\x88\xff\x63\x34\x2a\x68\x08\x8e\x19\xf8\xfc\x4c\xa6\x35\xd9\x6d\x12\xb5\x2c\xaf\x09\x5a\xee\x84\x26\x39\x82\x1b\x22\x42\xd8\x47\x29\x3f\x51\x60\x92\x23\xfe\x1d\xc2\xf1\x02\x83\x91\x50\x00\x28\x9e\x68\xc5\x47\xc5\x2d\x2d\x47\xcf\x11\x8f\x11\xa4\x50\x95\x55\xa3\x48\x26\xc7\x32\x09\x67\x52\x5f\x0c\x35\xc1\x36\xa8\xc9\xd1\x72\xd4\x68\x67\xa1\x01\xce\xec\xba\x68\x27\x4f\x40\xc4\x6b\x37\xf2\x99\x69\xe4\x93\xa3\xc6\x32\xe9\x15\x66\x9e\xd4\x80\x93\x76\x63\xa1\x1c\xd5\xa5\xb4\x1a\x0a\xc5\x15\x05\xae\x53\xf3\xcc\x75\xa8\x47\x31\x52\x8e\x7c\x0d\x93\x1f\x21\x34\xa9\x89\x63\x4a\x0d\x89\x9f\xbe\xb8\x05\xde\x24\x21\x66\x70\x63\x1c\xd5\x70\xb4\xd7\x05\x55\xcb\x0f\x88\xa9\x82\x69\x30\x50\xab\x99\x98\x7f\x44\x98\xb5\xbd\x1a\x66\xfd\x31\xf1\x55\x22\xa7\x80\x0a\xfa\xf0\x6a\xe3\x3e\x3c\xa2\x2a\x69\x44\xd5\x6a\x44\x95\xa3\x1a\x43\xcf\xc5\x6b\x22\x40\x98\xb2\x13\x63\x05\xba\x10\xe0\x49\x83\xe5\x24\xc0\x6f\xb2\x2f\xf6\x4a\x39\xf1\x47\x84\x5b\xb5\x8c\xb7\x4d\xe2\xac\xea\x96\x97\xff\x81\x03\xac\x72\x6d\x64\x55\x5d\xc4\x6c\x1b\x07\x1b\x3c\xea\x6b\xa3\xac\x94\x9e\xb5\x5a\xd2\xda\x87\x5c\x87\x30\x2b\x47\x75\xb8\x35\x97\xaf\x15\x9b\xe3\x28\xab\xc6\x57\x35\x98\x9a\x69\xfa\xdd\x25\x01\xa4\x51\xc4\x95\x47\xcf\x46\x71\x57\x8e\xb2\x1b\x76\xd5\xd2\xda\xdb\x04\x51\xd3\x60\xa0\x06\xb4\x88\x4c\xec\xc4\x55\xfb\x06\x29\x37\x4d\xc1\xeb\xb6\x05\xd9\xd4\x82\x6c\x1a\xa2\xae\xb5\x4d\x37\x54\x3c\x62\xdd\xee\x6e\xae\x46\x01\xd8\x2c\xed\xe3\x76\xdb\xd3\x43\x48\x96\x63\xbb\xad\x54\x81\x1e\x75\x27\x48\xdb\xd7\x15\x6b\x29\xb1\xcd\xb5\x66\x74\x6f\xf8\xb6\x4b\xf6\x52\x59\x95\x84\x72\xeb\x24\xc2\x19\x93\x50\xad\x1b\x85\x6a\x8f\x87\xaa\x45\x8d\xd7\xee\x8f\xd4\x96\xef\x89\xd4\xd2\xb3\x79\xb5\x27\x6c\xcb\x37\x5a\x94\xb7\x13\xc2\xd5\xad\xd3\x4e\x08\xb7\xbd\x2e\x90\xab\x85\x84\xd4\xd3\x0e\x1b\xc3\x6c\x0b\x46\xf9\xd8\x00\xef\x28\xa6\x9b\xa7\x21\x5d\x8d\xdd\x7e\x5c\x44\x77\x27\x88\x7b\x8b\xc0\xad\x4f\x02\xb7\xbf\xc4\x6a\x6f\x8e\xd5\x3e\xdd\x6e\x07\x2f\xcf\xeb\x4d\xfd\x93\x39\xac\x8e\xdf\xd4\xf6\xf8\x4d\x9d\x1d\xbf\xa9\xd7\xff\x6e\x0e\x8f\xdf\xd4\x4a\x6e\xa6\x5b\x3a\x88\xd3\x8b\x4e\x3f\x50\x9e\xe0\x35\x36\x09\x80\xcb\x54\x85\x72\x7d\xb1\x89\x54\xd5\x5d\x03\x59\x85\xa9\x3a\x65\x1c\xe3\x9c\xa0\x66\xb0\x50\x98\xa0\x66\xc4\x7f\x4c\xad\xdf\xd4\x7c\x53\x2b\x17\x57\x0d\x07\xbb\xa6\x72\x0d\xb1\x2f\xd3\xa8\x59\x83\x99\xd2\xf1\x99\xc6\x2b\x73\x93\x7e\xc3\xd5\x5a\xa5\x8c\x6a\xa9\x55\x6a\xf5\x1c\x28\xfa\x4c\xab\x66\x2d\x66\x91\x92\x4a\x43\x61\xa0\xd1\xf2\x4f\x03\x07\xb2\x51\xf6\x61\x43\x89\xb4\x18\x25\xc5\x31\x90\x57\x2b\x95\x9f\xe0\x58\x48\x56\xe0\x24\x66\x78\x76\x85\x72\xbd\xe0\x47\x88\x57\xe2\x5f\x8f\x5f\xe5\x3b\xfd\x80\xb3\x53\x2a\xcb\x31\xdb\x53\xa9\x78\x27\x09\x61\x6f\xa9\xd4\xa5\xaa\x40\x32\x07\xcd\x6d\x07\xdd\xfb\xeb\x8f\x06\x7e\xb4\x56\x56\x9c\x1a\x6f\xbc\x56\x47\x12\xa6\x2d\x69\xf4\x46\x1b\x6e\x54\x19\x10\xa4\x59\x9b\x59\x78\x92\xac\xc1\xf7\xb1\xc6\xf3\x27\x65\x98\x31\x90\xf8\x4a\xae\x60\x5e\x60\xb5\x52\x2a\x2b\x0d\xdf\x38\x95\xc9\x81\xbb\xde\x3a\xb6\xe6\x16\x72\x76\xeb\x95\x23\xd8\x2b\xcf\x6f\x87\xbb\x65\x34\xea\xa8\x3c\x31\x16\xdf\x8b\xe5\x29\x63\x4f\x91\x09\x0b\x53\x86\xc0\x44\x66\x69\xe3\x0c\x7d\x83\xcc\x02\x8c\xce\xec\xba\x21\x32\xcb\xda\x98\xd9\x9c\x0f\xa5\x9a\x95\x98\xd5\xfa\x4d\xad\x6c\x2f\x1a\xf1\x80\x51\xb6\x50\xa9\x67\xd8\xf6\x42\xa9\x14\x2b\x25\xee\x51\xa9\xdc\x31\x65\x8b\x73\xa5\x74\x29\x95\xe1\x83\x7e\x53\xe9\x37\x9d\x7e\x80\x09\x31\xd0\x1e\x21\xc0\x0d\x5b\xeb\x37\x75\x07\xd9\x21\xdd\xd7\x75\x52\xed\x75\x76\x7a\x04\x5f\xa6\xe2\x6c\x3a\x05\x7d\xa9\x41\xa6\xcd\x6a\x14\xa3\xae\x1b\x88\xe3\x76\x7d\x55\x26\xcb\x41\x47\x2c\xaf\xaf\x22\xd6\xa8\x57\xd7\xe6\x23\x62\x8b\x1e\xcd\x18\xaa\x11\x2f\x45\xae\xcb\x0c\x05\xad\x8d\xd6\xa5\x36\x5e\x81\x89\x5a\xa3\xaf\x95\xf8\x9d\x2e\x40\x1d\xaf\xdf\x01\x53\x58\xef\xbe\x9d\xb5\xd2\x57\xbd\x11\xdd\xe3\xb6\xf8\xd6\x1b\xd0\x24\x21\x4b\x08\xd3\x87\xba\xd7\xaa\x4d\x96\xc5\x58\xf7\x6b\x16\xee\x96\xd2\x73\x70\x67\x9d\xd7\x0f\xaa\xb8\xa8\x19\xc6\x6e\x58\x3d\x7b\x0c\x67\x17\x92\x5b\x1c\x96\x42\xe2\x7b\x03\x53\x45\x4c\x13\xb2\x45\x12\x8c\xa3\xd8\xb7\x53\x56\xd6\x0d\x31\x69\xef\xe6\x29\x09\x2b\x0b\x47\xdb\xe8\xeb\x88\x9d\xc8\x7a\x9d\xd5\xdf\xd0\xa7\xd5\x1f\x6c\xf9\x46\xbb\xa9\xe5\xad\xb5\x79\x85\x55\x23\x97\x69\xa0\x3f\xa9\xd2\x55\x59\xa3\x91\x3d\xbe\x94\x0f\x03\x95\x46\x95\xbe\xff\xc6\xce\x48\x4a\x00\xb2\xa9\xf5\x1e\xbf\xf6\xfb\x1f\xe3\xa5\xb4\x35\x39\x4e\x78\x0a\x94\x92\x55\xaf\xdf\xba\x51\x95\xfe\x50\x0e\x1e\x47\x2f\xe6\xbe\x4d\x8b\x94\x70\x25\xd7\x0f\x1a\x90\x1e\xe8\x1f\x7a\xd4\xec\x40\x10\x52\xa4\x2f\xe1\x0d\x67\x80\x66\xeb\x7b\xdf\xb2\x4c\x81\xb5\x5d\xa3\xb9\xff\x6e\xf4\xaa\xdc\x00\x56\xab\x3d\x2d\xdc\xbf\xea\x1a\x1d\xbf\x3a\x18\x77\xda\x45\xab\xcd\x1b\x82\x10\x2d\x44\xe1\x6d\x13\xda\x64\xbc\xd7\xfa\x8d\x86\x79\xd5\x3d\x83\x76\xbb\x6d\xd5\xf7\xdb\x52\x8a\x36\xe9\x4b\xd3\x34\xfd\x5f\x29\x74\xee\xf4\xc6\xba\xae\x4a\x5f\xa5\xed\xe6\x5d\xfa\x45\x6c\x26\xe7\x61\x7a\x72\xe5\x9d\xfa\x09\x5e\x9f\xb7\x7d\x63\xf6\x2f\x49\xbe\x19\xbf\x24\x47\xef\xc5\xfe\x55\xc8\x37\x1f\xf8\x2a\x44\x1a\xe2\xfa\x57\xe1\xe8\x85\x77\x8b\x77\x5c\xf5\xa9\xdf\x71\xe3\xd7\xc1\xbf\xd1\xa2\xbf\x7f\x49\xd6\x7d\xe8\x66\xed\x1a\xad\x43\x45\xf1\xc1\xeb\xd0\x4f\xb0\xf4\x54\xfb\x96\x1e\xc5\xa3\xdf\xb8\xf4\xe4\xd5\xf5\x4b\xcf\x2d\xd6\x95\x4f\xb2\x22\x5c\x59\x04\x6e\x98\xa4\x89\x64\x19\x05\xff\xe3\x39\xba\xe3\xb4\x59\x29\xf6\x79\x41\xe5\xfb\x1d\x9b\xc4\xfb\xd8\xeb\x15\x0c\x8e\x80\x7b\xdf\x2b\x7e\x77\xa9\x4e\x1e\x65\x97\xe1\x78\xfc\x24\xd7\xb8\xef\x23\xef\x7b\xec\x56\xeb\x62\xd4\xbb\xd5\xa9\x27\x3d\x76\x9e\x55\xd2\x53\x9d\x67\x25\x11\xea\xbd\xe2\x91\xef\x3b\xf2\x70\x71\x60\x6f\xed\x72\xe6\xdd\xc7\xf9\x9a\x9f\xd6\x97\xdc\x7a\x8c\xef\x77\xeb\x7c\xfe\x41\x6e\xdd\x7f\x02\x3f\xed\xd3\xb8\x66\xf9\xc8\xe7\x4a\xd7\x3a\xa4\x2a\xaf\x7a\x4c\xfd\x1d\xd8\xf1\x4a\x15\xb6\x4e\xd2\xae\x2b\xd4\x93\x91\x7f\x32\xd7\x66\xc7\x43\xf9\xc9\x9d\x92\xed\x72\xf0\x7c\xb3\x1a\x3c\xbf\x9c\x35\xab\xcb\xb0\x9a\xcc\x67\xfd\x62\xf0\x2f\x87\xff\xc7\xff\x75\x78\x7c\xfc\x7f\xdf\x3f\x3c\x3e\xfe\xec\xf3\x5f\x1f\x1f\xff\xb7\xff\xe7\xf8\xf8\x2f\x87\xc7\xc7\x7f\x3d\x39\x3e\xfe\xe1\xf8\xf8\xdd\xf1\x9b\x20\xc7\x6f\x82\x3f\x7e\x13\xea\xe3\x37\x75\x71\xfc\xa6\xf6\xc7\x6f\xea\xf5\xbf\x55\xfc\x4d\xb9\x10\xc8\x01\xe7\x2a\xb3\x4b\x16\x37\xd7\x02\x1b\xe8\x01\x72\xd6\x97\x9c\x5c\x5e\x4e\x09\x7e\x4e\xba\x2d\x27\x13\x9b\x53\x04\x5f\x20\xd3\x55\x50\xce\x0e\x31\xbd\x29\x10\xeb\x2a\x10\xe2\x2a\x28\x55\x87\xb8\xd3\x14\x85\xe6\x7c\xd1\x64\x2b\xc8\xa7\x29\x63\xad\xf1\x9c\xe1\x55\xfa\x97\xf5\xc5\xe8\x5c\x35\x25\x00\xa4\x92\x65\xaa\x82\x0c\xa1\x42\xea\xad\xf2\xca\x22\x4e\x1e\x13\xba\x83\x40\x79\x3e\xf4\xac\x86\x9a\x51\x83\x4f\x6f\xe0\x0b\x32\x54\x68\x1b\x62\x6f\xa6\x53\x9e\xe7\x8e\x4a\x7b\xc4\x13\x4c\x97\xf5\x8b\x1e\xe9\x39\x84\x13\x55\xee\xc7\x74\xdc\x67\xa7\x5e\x12\x9b\x76\xa3\x44\xc3\x06\x57\xc7\xa0\x73\x94\x29\xd4\x3d\xa3\xb8\xdb\x51\x1a\x0f\x33\xa9\x20\x90\x22\x70\xf4\x4b\xc1\x4c\x14\x52\xde\x82\xf8\x89\x50\x95\x28\xbe\xed\xe1\xf8\xfa\xa1\xd4\x0f\xb0\xe6\x6a\xa2\x08\x96\x52\xa9\x40\x15\x55\x28\x22\x05\x8a\xe4\x03\x3a\x5f\x41\x2b\xf6\x03\x10\xa3\xa0\x6c\x39\x41\x93\x3f\x4a\x59\x5b\x93\xb3\xaa\x11\x15\x90\x1a\xf1\xb2\x86\xd0\x97\x10\x49\x14\xde\x08\xc2\x0a\x25\x0a\x46\x13\x60\x68\xa2\xea\x38\x46\x4b\x88\x0d\x7a\x36\x46\x0b\x82\x8d\xe3\x1b\x95\xe5\x35\x39\xf9\x9b\x3c\xd3\x0f\x20\x18\x10\x3e\x30\x9e\x7f\xa3\x1a\x04\x63\xb3\xcd\x88\x94\xd9\xcc\xac\x17\xff\x6c\xbd\x90\xdb\xcc\xae\x5f\x24\x9e\xca\x3b\xeb\xa9\x02\x06\xe0\x65\xc9\xf9\x59\x1f\xf5\xa5\xb0\x5e\xbf\x6c\x05\x72\xc1\x56\x94\xf5\x56\xca\x6a\x5b\x21\xd5\x03\x93\xbc\x65\x3c\xd8\xa6\xab\x34\x79\x44\xc1\x6c\xa7\xfa\x3c\xa4\x90\x78\x5b\x69\x0c\xd0\x02\xf1\xb1\x8a\x82\xb1\x0c\x12\x4b\x79\x7f\x66\x8c\x3a\x00\x26\xe3\xa8\x0e\x80\x08\x47\xa7\x1f\x48\x41\x65\x86\x23\x21\x91\xc0\xbf\xa1\x84\x85\xfc\x21\xf0\x46\x0b\x05\xe5\x7d\xa1\x30\x9a\x94\x42\x44\x87\x42\xce\x42\xa9\x64\x0b\xa5\x92\xd5\x6c\x55\xe9\xf9\xd0\x44\x8e\xbc\xaf\x54\xf4\xa1\x44\xa0\xa5\x84\x3d\xb7\x22\x3d\x54\x01\xc2\xaa\x90\x67\x50\xa8\x41\x00\x64\x10\xaa\x96\xaf\x5b\xd2\x3d\x2a\xe2\x10\xb0\x0a\x7c\x11\xf4\x0b\x92\x60\x81\x3c\x56\x1d\x6b\x38\x4d\x23\x47\x12\x3d\xea\x06\xa3\x2a\xd7\x69\xf3\x74\x34\x4c\x17\x21\x3b\xef\xa0\xd2\xea\xd0\x65\xeb\xa0\x33\xe8\xa0\x33\xe8\x50\x64\xeb\x3a\xa3\xf5\x9d\xeb\xd6\xeb\x94\xb6\xb0\xeb\x0c\x22\xc4\x24\x7a\x3a\x4a\xe9\xbb\x4e\xf8\x93\x70\x8a\xf0\x17\x8b\xc0\x04\x03\xb3\x63\x22\x76\xc0\xa9\x3a\x6a\xe7\x3b\x6a\xe7\x3b\xd5\xbe\xee\xba\xe2\x9a\x37\x78\xbf\x88\x12\x58\x56\xc1\x89\x76\x48\x04\x11\xc3\x2e\xba\xd1\x7b\x9a\x18\xb7\x6c\x09\x01\x37\x4e\xb5\xbe\x52\xbb\xd4\x3d\x2d\xd4\xa7\x3e\xdc\xc2\xbc\x2a\xfd\x50\x35\xe9\x2b\x53\x13\x17\x5d\x9e\x8f\xbc\xe1\xfe\x25\x38\x50\x29\x12\xe3\xee\xb5\x66\xa8\x1c\xad\xb5\x72\x54\x81\x5b\x83\x77\x9c\x6d\xdc\xc9\x96\xe0\x74\xdb\x6b\x18\x37\xf8\x24\x4d\xbb\xcd\x4c\xb4\x9a\x8b\x6a\x47\x29\x34\x1c\x82\x30\xde\x4e\x28\x00\xad\x57\xe1\xc9\x95\xd1\x91\xdb\x50\x6a\x57\x68\x76\x07\x96\xcb\x56\x09\xd8\xd4\xdd\xe1\x66\x36\x0e\xbf\x02\xfd\xfb\xfa\xcf\x38\x7a\x5f\x6b\x56\x65\x88\x56\x73\xbd\xa8\x08\x33\x4d\x78\x39\x4d\x78\xf4\xd9\x0f\x22\xef\x95\x6a\xe2\x84\xf1\x2b\x5e\x7f\xb8\x47\xbc\x79\xa5\x46\x54\xd1\x1b\xcd\x40\x94\xe9\xbe\xa2\xf7\xa9\x07\x02\xbc\x71\x5e\x82\xa2\xd4\x5e\x58\x07\x98\x57\xa7\x52\x23\x7d\xfe\x6c\xc8\x10\xf4\x1e\x42\xa5\xb4\x70\x15\xce\x48\xb4\x43\x72\x82\xac\x44\x97\xa6\x12\x4a\x35\x2c\xc7\xda\x38\xb9\xd2\xf8\xa5\x01\xf9\xe7\x5b\xf0\xf4\xe3\xf9\x6c\x16\x9b\xd5\x7c\x71\x72\xf5\x8d\x7e\xc2\xf2\x4a\x76\xdc\xe1\x55\xe7\x90\x06\x67\xcc\xb3\x8c\x7f\xc3\x80\xd7\xb1\x58\xad\x27\x47\xf2\x13\x49\xa0\x22\x2c\xcf\xf6\x5c\xfd\xf8\xf8\x70\xfc\x5a\xef\xdf\x53\xe4\xbf\x37\x6b\x3c\x04\x11\x10\xc8\x5a\x38\x59\x2c\x59\x3a\x0b\x3c\xd0\x92\x9f\xcb\x8c\x34\xdb\xd5\x6f\xbd\xee\x75\x24\x31\x3b\x80\x84\x1d\x53\xa7\x5f\x1c\x3a\xd3\xee\xcc\x52\xa5\xc5\x6b\x93\xfb\xde\xc2\xe3\x1e\x4f\xe7\xcb\xb8\xf7\xc6\xef\x1d\x1f\xff\x75\xed\xd0\xac\xdf\xcf\xf5\xf0\x96\xd6\x97\xaa\x35\xae\x48\x5e\x34\xfa\x8a\xa9\x92\x37\x8c\xbe\x5b\x2a\x8e\x35\xc7\x96\xa3\xee\x37\x84\x63\x96\xbc\x78\xf4\x95\xe3\x39\x72\x16\xec\x0a\x1e\x76\x85\xe1\x1d\xe4\x38\x16\x1c\x79\x11\xc1\x47\x81\x76\x8a\xad\xb8\x07\xb4\x53\x6c\x05\x1f\x45\x05\x1f\x45\x05\x1f\xc5\xf0\xe2\xaa\x92\xf7\x56\xcb\xbb\x28\xe3\x48\xeb\xf3\x9e\x8d\xba\xfd\x34\x7a\x44\x20\xc8\x68\xf0\xbd\x4b\x5e\x47\xc8\x07\x09\xbb\x56\xc1\x52\xb0\x94\x38\xbc\xa5\xfa\x95\x1d\x96\x9d\x8e\xac\x57\x47\xb2\xb2\xa3\x5f\x3b\x00\x9f\x5d\x54\x1b\x38\xb0\x61\xc4\xe9\x60\xc4\xe9\xd8\x59\x74\x78\x4e\x1d\xdc\x36\x1d\xdc\x36\x5d\x67\xaa\xed\x12\xad\xcb\x72\xc1\xda\x5d\x64\x49\xcf\x76\x9b\x9e\xfd\xdd\x64\x16\xa6\xfb\x7a\xf6\x0d\x2a\x7e\xdc\xba\x35\xd0\x91\x18\x1d\x6e\x86\xe6\x30\x34\x87\xd1\xbf\xd0\x4c\xa2\x8d\x25\xc9\xcf\x4c\x36\x3f\xf3\x64\x36\x59\x4d\xae\xf9\xa1\xa0\x3f\x54\x72\xd4\x7f\x33\x7a\x84\xe9\x86\xea\x22\x5c\x46\x16\x2e\x23\x8b\x04\xab\x85\xbf\xc8\xc2\x4a\x64\xa3\x35\xc9\x8f\xee\x6e\xd3\xaf\x71\xcf\x7f\xb5\xf6\xcf\x8f\x8f\x1f\x24\x1e\xfa\xd6\x2b\xdf\x78\xe4\xb7\xf1\xc6\xff\x13\x78\xe0\x3f\xce\xe9\xee\xdd\xed\x1f\xe1\x62\x03\x1d\x33\xfe\xe7\xe0\x6f\xeb\x8a\x8c\xbb\x6d\xf7\xf8\xde\x08\x49\x18\xae\x68\x81\xee\x59\xd5\x71\xd8\x78\xe5\x7e\xe4\x95\x73\xcc\xb7\xbe\xf9\xfb\xdd\x63\x8e\xc2\x11\xe7\x1b\x52\x2f\x8b\x22\xb1\x8d\xc8\x8a\x58\xd8\xbb\x2c\xeb\x8a\xc5\x55\xb4\x08\x10\x5b\xd8\xbb\x2c\x34\xb0\x36\x2a\x93\xd0\xd8\xd1\xd6\xb9\x86\xef\x60\x81\x7d\x58\x74\x84\x6d\x84\xf1\xef\x06\x47\x5c\x1d\xed\x7f\x5a\x17\x7b\xe3\x56\x17\xa9\x73\xcd\x2a\x9b\x73\xe4\xef\x14\x4b\x75\x10\x8f\x75\xea\x8c\xee\xf8\xde\x6b\x97\xb5\x8b\xea\x05\x0f\x8e\xf8\xed\x5c\x70\x9f\x3a\xe2\x1c\xe3\x2d\xbc\x71\x95\x2a\x10\x8e\xee\xe7\xed\x79\xff\xe2\x73\xff\xe2\x73\x6f\x5f\xd1\xcb\xed\x2b\xfa\x22\xce\xf6\xfa\x95\x77\x8f\x8f\xff\x72\x7c\xfc\x83\x86\x7f\x38\x36\x43\xc8\xc6\x1a\xbc\x5f\x3c\x29\x6b\xe0\x3a\xeb\x43\x1a\x04\x33\x32\x16\xc4\x0c\xd7\x44\xa3\x18\x30\x39\x59\x98\x9c\x2c\x4c\x4e\x16\x26\x27\x8b\x94\x92\x05\xe3\x6c\x3d\xaa\xcb\x7d\x70\x23\xaa\xa7\xc9\x59\x91\xb3\x90\x13\xf6\xc8\x09\x53\x8f\x65\x2b\x64\x98\x2b\x64\x98\x2b\x62\xe7\x15\x32\xcc\x15\xf7\x80\x4a\x9f\xad\x90\x61\xae\x08\x99\x57\xc8\x30\x57\xc8\x30\x57\xad\x7a\x9a\x61\x13\x1b\x81\x4b\xd1\xc2\xa5\x68\xe1\x52\xb4\x70\x29\x5a\x3c\xbe\xcc\x18\xcd\x80\xa0\xfa\x63\xf0\xf0\x8d\x7a\x91\xea\xf3\x3b\x8e\xc8\x04\x09\x96\x82\x25\x52\x2b\x43\xdc\x80\xa5\x29\x63\x35\xcb\xf4\xdf\xba\xca\xb1\xfc\xe1\x2d\x46\xb5\x44\x67\x85\xe1\xdd\x81\x93\xeb\xc8\x62\x75\xf8\x06\x5d\x54\x8f\x72\x7d\x3f\x1d\xa3\x65\x13\x00\x60\x5d\x2a\x92\xca\x97\x97\xdb\xa2\xd4\xb7\xe7\xf5\x7c\xba\xe9\xd9\xff\xf3\xf8\xf8\xbf\xfe\xeb\xe1\x6f\x8e\x8f\xff\xd7\xff\x3e\x3e\xfe\xc7\xff\x77\xfc\x26\xd8\xc3\xe3\x37\xa1\x38\x7e\x13\xca\xe3\x37\xa1\x3a\x7e\x13\x9a\xe3\x37\x21\x1e\x1e\xbf\xa9\xe5\xf8\x4d\xed\x8e\xdf\xd4\xe5\xf1\x9b\xd6\x1f\xbf\x81\x9b\x55\x75\xbd\x0c\xba\x5e\xc6\x6a\x01\x80\xa5\x38\xd2\x82\x52\x36\x36\xc2\x5b\x4b\xf5\x8a\x55\x1d\x49\xdb\xa9\x23\x97\xe3\xc8\xc1\xf3\x8a\x4b\x93\x29\x49\x28\x55\x11\xb9\x82\xf6\x73\x18\x68\x0b\xa3\x85\x32\xd0\x81\xa2\x73\x64\x0a\x88\x40\x79\x97\x99\xa2\x55\x61\x49\x4d\x2a\xe3\xb0\x51\x35\x82\x68\xaf\xf1\xfd\xbf\x15\x7d\x45\x65\x49\xa7\x95\x25\x14\xaf\x74\x14\xbe\x76\x2a\x08\x48\x25\x46\xa7\x42\x83\x7c\xdd\xa8\x28\x1d\x6e\x59\x0b\x2d\x73\xd4\x0a\x4f\xad\x5a\xe5\xc5\x61\x3a\xd1\x63\xae\x9e\x1a\x65\x06\xa2\x51\x52\x7c\x49\x88\x9f\x0c\xa2\x2a\xa6\x43\x76\xb1\xd3\x0a\xdc\x8e\x56\xeb\x94\x9a\x07\xaa\x6e\xd3\x21\x09\x89\x6e\x8d\xe9\x5a\xbd\x22\x84\x8e\xe8\x9d\x0a\xca\x53\x92\x69\x6e\x38\x23\x37\x8c\x8b\x2a\x1e\xda\x43\x0a\x89\xa5\x6a\x49\xe2\x55\xf8\x53\x75\xa1\x3c\x20\xf0\x68\xd6\x5e\xb9\x43\x48\x52\x75\xa0\xed\xbb\x5a\x25\xe7\xd1\xcc\xef\x9a\x56\x3f\x40\xb5\xd8\xea\x07\x34\xef\xbb\xa8\x1f\x10\xb4\xef\x10\xab\xef\x3a\x9d\xf2\x0e\x7f\xc9\x32\xf1\x83\x66\xb7\xd8\x31\x94\xfa\x81\xcd\x9e\x92\xa8\x5a\x83\x14\x2c\x3c\xe2\x56\xf0\x9b\x04\x85\x11\x0b\x91\xb8\x85\x48\xdc\x0a\x5b\x0a\x08\xc3\xad\x88\x8a\xba\xe3\x3d\x09\x32\xc2\x56\xac\x8a\xc1\x43\xab\x88\xbb\x27\x2c\x2c\x90\x82\x5b\xc9\x54\x49\x0c\xae\x47\xa7\x39\x35\x6e\x51\x9c\xb2\x35\x3a\x15\x8b\xd7\x34\x1b\xb6\x2c\x15\xa2\x9a\xb4\x19\xc4\x90\x19\x01\x38\x9b\x31\xed\x33\x08\x6b\xac\x63\x25\x70\x7a\x49\xe7\x02\x99\x39\xcc\x1c\xfb\x5f\x95\xe1\xb2\xa8\x62\x5b\x5f\x91\xe7\xf3\x8d\xae\x63\x5e\x03\xb3\x2c\x67\xbc\xab\x2d\x70\x77\x5b\xf1\x7a\xb6\xd4\x6b\xdb\x8a\x4a\x3e\xcb\x88\xb4\x55\xc7\xb3\x52\xcc\x60\x6b\x4d\xf7\xa1\x41\x69\x6b\x5e\x01\x16\x6f\xd9\x36\x5a\x0a\xd0\xb0\x2e\xc2\xbc\x6a\xe1\xfb\xb7\x9a\xbe\xb1\x11\x8d\x79\x45\x69\x5a\xb2\x36\x56\xf9\x28\x6c\x87\x92\xbb\xa6\x89\x2d\xd4\x98\x99\x31\xba\x76\xb1\xca\x09\xae\xa4\xd5\xc8\xad\xea\xa0\xb1\x7b\xce\x58\xeb\x32\x25\x6d\x51\x39\xde\x86\xbc\xa3\xe1\x28\x1c\x0b\x4d\x45\xa2\x75\x86\xdb\x9e\x49\x5c\x5f\xcf\x1a\x4d\x38\xb2\xed\xb6\x5a\x99\x60\xd7\xeb\x5a\x66\xd7\xf7\x9e\xa9\xd8\x60\x66\xbd\x66\x27\xf5\xfb\x9a\x6f\xf4\x32\xd9\xfa\xa9\x9d\x66\xfa\x1c\xc9\xbd\xe0\xe8\xb8\xe0\x1a\xa8\xf6\x14\xda\xe0\x45\xd9\x0e\x61\xed\xb3\xaa\x34\x0e\xb1\x1e\x3c\x8a\xa5\x2a\x6a\x95\xe8\xa2\x95\xe0\x0c\x42\x89\xac\x7a\xf0\x5e\xe9\x59\x80\x3c\xa0\x81\xce\xc4\x09\x35\xee\x62\x6d\x51\xcd\x02\xc6\xdd\x51\xe4\xde\xb5\x48\x54\x01\xea\xef\xe0\xb0\xed\x62\xd1\xc7\x7e\x71\x53\x55\x11\xd8\xe0\x10\x1a\x75\x1a\x35\xb6\x4b\xdd\x00\xb5\xb0\x1d\x88\xf4\xae\x23\x6e\xd0\x69\xdc\x20\x2a\xc0\x62\xfd\xea\xeb\x94\xcb\xb4\xeb\x22\xdf\xa8\x24\x56\xb7\x1b\x2f\x52\xdf\x72\x10\x06\xc6\x5b\xd4\x74\x6a\x2f\x66\x52\xf6\x54\x77\x3d\xff\x04\x1f\xf0\x6f\xda\x60\x12\x80\x45\xd7\x8c\xd2\xb3\xe8\x3a\x34\x64\x76\x63\x33\x88\xb3\xa8\x8f\xd2\x25\xde\x90\x2e\x54\xdb\x8a\xcf\x3e\xaf\x38\xb8\x60\x5a\xe9\x9b\x8f\x7c\x95\x26\x49\x2a\x0e\x09\xfe\x91\xc0\x93\x4a\x0e\xa9\x0c\x46\x8b\x0c\xc5\xa0\xce\xa2\x78\xaf\x52\xeb\x08\x5c\xf2\x70\x41\x01\x18\xaa\x35\x8e\x7e\xd1\x00\x62\x06\x63\x10\x55\x1c\xa9\xa7\x63\xc9\x8b\x14\x7d\x11\xf1\x6d\xa3\x6a\xee\x68\xc2\x5a\xf4\x39\xf3\x2d\x18\xbb\x50\x48\x76\xa5\x49\x60\xf2\xa9\x59\x0a\x99\x1e\xf4\x49\x34\x07\xac\x7d\xd1\x63\xf7\xb5\xe0\x15\xba\xe2\x56\xc5\xcd\xda\x58\xaa\xc8\x93\x82\xa9\x8b\x31\xea\x43\xbd\xc1\x71\x06\x55\x99\x13\xc1\xad\xb7\x5a\x74\x4d\x9d\x6d\xdc\xd4\xd9\x36\x23\x5e\x48\x1c\xe7\x1e\x19\x4f\x11\xef\x06\x97\x13\xd3\xac\xab\x96\x2a\xc8\xe1\x06\x54\xd6\x28\x08\x63\xe8\x0d\xf5\xdd\x09\xd5\x2b\x42\xaa\x25\xfc\xb3\xd1\xd3\xea\x85\x48\xd2\x04\x7b\x2f\xf3\x23\xa9\x4f\x9e\x36\xfd\xe6\xb9\xda\x91\xb2\x87\x4f\xf2\xcb\xb1\x49\xb7\x35\x4d\x72\x32\xf5\x23\x83\x94\x56\x8b\x9b\xdd\x2b\x5c\x6d\x94\x58\x46\x52\x1f\xaa\xe4\xa6\x37\xdb\x00\xd5\x1f\x23\x85\x7a\x09\x32\x0a\x97\x07\xf1\x97\xd0\x1e\x6f\x2b\x04\x24\x19\x94\x8a\x71\xf0\x3a\x0e\x9b\x5a\x37\x3a\xba\x1b\x1b\xed\x40\x14\x61\x60\xd2\x3e\xd7\x6d\x8f\x4f\xa5\xe0\x54\xe9\x4a\x7f\x73\xac\x64\x45\x11\xc2\x06\xaa\x44\x73\xf7\x6a\x3c\x40\xdc\x87\xb6\xd0\xb2\x80\xaa\xd7\x9f\x4f\x15\x46\x5e\x26\x81\xf4\xcb\xc5\x22\xce\x9a\xb7\x27\x57\x3c\xbf\xde\xd7\xcb\x13\x3f\xab\xbe\xd1\x61\x4a\x5c\xa5\x6e\xe3\x0b\xa9\xeb\x31\x7a\xc3\x87\x92\xc8\xa9\xae\x8d\xa3\x25\x30\xb2\xd2\x45\x76\xc9\x31\xd7\x25\x6e\x67\x25\xeb\x57\x14\x05\x4d\x0c\x12\x2b\x5a\x36\xd2\xf5\x3b\x1c\xdd\x9a\x26\x61\xc6\x97\xaf\xaf\x4a\xea\xef\x3c\xee\xff\xfa\xdf\xbd\x4b\xdb\x6d\xbc\xd8\x4f\xea\xbd\x7e\x1a\x77\x2a\x7d\xa7\xde\xee\x65\xb6\xe7\x2d\x95\xbe\x9f\x46\x6f\x98\x98\x8d\xdb\x5a\x57\x8c\x4e\xd1\x35\xeb\x69\x99\xb4\xe8\x79\xc2\x34\xba\x3a\xdb\x6d\x4d\xdd\x33\xb0\x5f\x68\x74\x67\xb0\xd9\x11\xa8\x17\x9f\xba\xec\xb7\xf4\x11\x7b\x27\x6f\xec\xb3\x25\xae\x19\x32\x26\x56\xa0\xa8\x16\xb6\x9e\x68\x96\x58\x09\xf8\x83\xd0\x52\xa3\x4d\x62\xa5\xd1\x23\x3e\x1e\x54\xd1\x02\x55\xb4\x00\xff\xb2\xf4\xa0\xcd\xd6\x0d\x6a\xb3\x75\x83\x5a\x50\x5b\x36\x53\x37\x29\xab\xd7\xd7\xcb\xd4\x1b\xcb\xa8\xb8\xcc\xeb\xb5\x83\x46\xb5\xbf\xcd\x89\x83\xd9\x9c\x8b\x14\x9a\x1e\x51\x71\xd9\xeb\xbd\x3d\x26\x93\x55\xdc\xe5\x6d\x5d\x3f\x0a\xcc\x6d\xad\xc1\x40\xca\xc9\x6d\xad\xf1\x4a\x68\x77\x7a\x67\x64\x8f\xcf\xb1\xcf\xcf\x18\xf9\x16\x96\x63\xa5\x4e\xc5\x0e\x7b\xc8\xa7\x79\x1d\xd6\x7f\x19\xbd\x9e\x92\x61\xb5\x9b\x0f\x18\x8f\x2b\xdd\x78\xae\x37\x9d\xf1\xf8\x8d\x8a\x60\x0c\xbb\x41\x8e\xf1\x83\x76\x7e\xba\xc3\xdb\xd9\xd5\x95\x37\xec\xed\x7e\x76\xbb\xba\x0f\xd9\xcf\x7d\xe0\xb6\x8a\xa3\xff\xb8\x5d\x15\xff\x76\xcd\x8d\xbb\x29\x45\x8b\xb2\xfd\x10\xdd\x26\xb1\x1f\xb0\x12\xb8\x3f\x08\xe5\xd1\x19\xb2\x12\xf8\x4d\x00\x7f\x56\x02\x17\x84\x91\xc5\x22\x13\x64\x05\xca\x77\x64\x82\x2c\x32\x41\x56\x5a\xbd\x3a\xfb\x19\x25\xec\xd8\xd9\xb8\x89\xce\x70\x7b\x65\x17\x97\x79\xb2\x9d\x88\xd6\xd9\x8c\xb5\x24\x83\x7d\xc0\x66\xbc\xc6\x32\xe5\x10\xb9\xe5\x66\x2f\x87\xdb\x3e\x57\xa1\x69\x52\x4f\x36\xe7\x95\x62\xf3\xf5\x5a\x68\x0b\x35\x23\xe5\x62\x95\x91\x64\x67\x83\xc8\x86\x58\x33\x2b\xb6\xd4\x19\xaf\x1f\x6a\xcb\x07\x02\x6a\x35\xa9\xdb\x9a\x9c\xf6\xcf\x7b\x4b\xf8\x33\xd9\x06\xee\xee\xf0\x38\xfa\xbd\xdb\xbc\x7e\xef\x06\x43\xde\x7a\xab\xc5\xb1\xfd\xe7\xd8\x6f\x51\x2a\xdc\x29\x44\xf4\x9f\x73\xf3\xf5\xe9\xf6\x4d\xba\x6d\xba\xb2\x5f\x6a\x07\x11\xcc\x7f\x9e\xdd\x51\xf8\x65\x77\xf4\x13\xef\x8e\xfe\xbc\x8d\x86\xc7\x8b\xb0\x08\xab\xf9\x50\x38\x70\x70\xfc\x06\x99\x1f\xe4\x38\xac\x0a\xf0\x5b\x62\xfd\xd6\xf0\x1a\xa1\xd8\xc1\x42\x21\x67\x0d\x20\x7a\x63\x92\x8d\xc8\x9f\x93\x0a\x8b\xc9\x2c\x9e\xec\x5e\x5f\xaf\x93\xd8\x5f\x6c\x81\xcb\x61\x11\x4e\x17\xe1\xe2\x6c\xff\x49\x55\x72\xd2\x72\x44\x31\x79\xf5\x57\x6e\x7c\x8a\x9d\x3b\xff\xeb\xbb\xfb\x52\x49\x51\x7c\xde\x5d\xce\x9a\xd5\x64\x3e\xbb\xbb\xba\xf7\xc3\xea\x41\x7c\x73\x31\x5f\xac\x96\x0f\xff\xd2\xff\xe6\xa3\x97\x8f\x9f\x3c\x19\xee\xc7\x1c\x1e\xbf\xf1\x09\xa6\xea\xd1\xf4\xe2\x2c\xd4\x71\x35\x69\xb6\x0a\x92\xe1\xf0\xef\xc7\x6f\x42\x38\x7e\x53\xe7\xc7\x6f\xea\xb0\x2b\x28\xd9\x15\xc7\x6f\x70\xa4\x8d\x85\x43\xcb\x2a\x4d\xa4\x85\x64\xd1\x32\x66\x8d\x85\x0b\xcb\x22\x2c\x66\x55\x15\x0e\xd5\xc6\x4c\x8b\x30\x32\x14\xdc\x06\x39\x3b\xb6\x1e\x8c\x3d\x93\xa1\x99\xf8\x7e\x85\xbb\xc3\x2b\xaa\x76\x9d\xa6\x21\xf0\xdc\x1c\xcc\x46\xae\x54\x88\x09\x7a\x73\xa9\x2e\x98\xc9\xa9\x0d\xcb\xb5\xa2\x2d\x87\x99\x2c\xaf\xf5\xc3\xad\x19\xc2\x72\x05\x71\xe4\x28\xa8\xe5\xba\xbf\xcc\xd9\x72\x8f\xb9\xc3\xb4\xe6\xac\x80\x48\xab\x50\x6e\xae\x9e\x48\xac\xe0\x29\x0a\xd4\x13\x0b\xf5\x2c\x7b\x3e\x31\x5e\x0b\x1b\x0e\xb1\x56\x3f\x70\x8e\x12\x58\x15\x08\xb0\x15\xec\x66\xbd\xfe\x9a\x27\xb7\xe1\xf1\x33\x8c\x87\x9a\xc9\x2b\x63\x27\x89\x37\xe3\x01\xa9\xa0\x4e\x62\x3c\x3e\xb4\x7a\x2e\xa6\xc4\x3d\x2e\xd5\x3d\x86\x0f\xc6\xa8\xba\xb1\x29\x51\xcc\x2c\xb5\x95\x4a\x14\xf9\xca\xa0\x1f\x10\xb6\x2b\x6b\x65\x27\xa3\x39\x4a\xb0\x27\xa6\x64\x07\xde\x33\x8d\x95\x38\xf7\xa5\x96\xe7\x0c\xac\xa9\xdc\xe0\x86\x28\x95\x0f\x28\x76\x56\xaa\x3c\xd0\xb3\x8c\xf9\x54\xb4\xa1\xd4\x6f\xe8\x7b\x12\x82\x06\xe8\x99\xa9\x2a\x25\x34\x43\x8a\xaf\x0a\x2a\x0d\xc1\xd6\xa3\x42\x7f\x4f\xb9\x68\x0c\x5c\x34\xa6\xaa\xf5\x97\xf7\x89\x3e\x6c\xd9\x57\x71\xf6\x7b\xe5\x87\x56\xf9\x58\x55\x0b\xa2\x3b\x4c\x78\xcd\x14\x13\x04\x11\x1a\x3d\x31\x96\x84\x00\x8b\x60\x02\x48\xa5\xc0\x5e\x27\x20\x7a\x17\x50\x31\x37\x01\xe5\xba\xa0\x05\x48\x50\x4c\x1a\x28\x70\x0c\x44\x93\x06\x22\x1c\x03\x11\x8e\x09\xec\x4d\x02\x84\x59\x37\x69\x4c\x70\x6c\xb6\xac\x69\x3a\xcc\x42\xae\x7f\x8a\x4a\xa4\x76\x78\x8d\xe0\x84\xb6\x6e\x60\x9b\x16\x20\xad\x30\x01\x05\xd2\xa0\xcd\x1b\x68\xde\xa0\xcd\x0b\x11\x8f\x09\xb5\xd2\xaf\x29\x23\xad\x9e\x4f\x23\x07\x6d\xe4\xfd\xba\x15\x1b\x96\xda\x80\x86\x61\xd0\x95\x62\x60\x66\xd3\x5b\xee\x9a\x2b\xea\x15\xda\x9c\xb5\xd1\x6f\x28\x11\xa5\x39\x6b\x6d\xce\x9a\xe6\xac\xb5\x39\x6b\x9a\xb3\xa6\x39\xeb\x4c\x59\x70\xf5\x74\xda\x50\x59\x4c\xf7\x6b\x60\x24\x9c\xb8\xc5\x96\x19\x37\xd7\xbf\x28\x15\x5c\x77\xb8\xe5\x7f\x83\x92\xae\x67\x81\x2b\x95\x11\x4e\x7f\x88\x75\xaa\xd6\x15\xaa\x66\x98\xd6\x95\x16\xab\x55\x50\xc9\x55\xdc\x08\x3a\x93\x35\x3a\x93\x35\x3a\x93\x35\x4a\xae\x75\xe0\x52\xe8\x4c\xd6\x80\xae\x0c\x44\xaa\xa6\x0e\x7a\x41\x5a\xf9\x16\x2a\x1c\x4a\xd2\x6b\xae\x6a\x71\xc0\x2f\xa7\x4d\xda\xd0\xa4\x8d\x51\xae\x3a\xda\xb4\x81\xcc\xcc\x34\xb4\x69\xa3\x6d\x0a\x9d\x8c\x69\xb4\xe9\x6e\xd2\xef\x68\x76\x29\xed\xb4\xfa\x0e\x34\x88\x51\x77\x64\x43\x70\xa7\x1f\x94\x1f\x58\x1b\x0e\xa5\x33\xd3\x68\xc3\x21\x75\x66\x94\xfc\xc5\xa0\x57\x66\x94\xfc\xc5\x40\xf8\x62\x1a\x1d\x74\x90\x18\x19\x95\x6c\xbc\x51\x08\xa4\xd9\x15\x02\x69\x95\x68\x43\x6f\x83\x11\x08\x0b\x97\x69\x94\x16\x78\xd0\x06\x81\x45\x4f\x1b\xa8\xa5\x81\x5a\x6d\x20\x78\x65\x4c\xab\x6d\x72\x93\x52\x88\xd2\xf0\x69\x2d\x22\x0b\x64\xcf\x51\xac\x63\xa9\xe7\xe1\xd3\x57\x5f\xab\x31\x8d\x91\x88\x88\x36\x0d\xe4\x9d\xa6\xad\xd4\x8c\xb5\x5d\x09\x5e\x0d\x54\xa7\x86\x1a\x3a\xa3\x5b\x2a\xd3\x82\x9c\xfc\x20\xe1\x11\x9d\x6e\x03\xc5\x1f\x57\x01\x4d\x63\x22\x9c\x81\x91\xb7\x29\x2a\x8c\x06\xea\x18\x13\x4b\x9e\x15\x01\x46\x13\xd9\x45\x18\xe4\xc0\x4d\x24\x24\x1d\x83\xf2\x04\xd2\x3d\x11\xd6\x56\x13\xb9\x49\x75\xfd\x0c\x22\x89\x06\x91\xc4\x9e\x2d\x30\xb6\x7a\x95\x56\x53\xf4\xeb\xb6\x56\x1d\x70\x03\xb7\xac\xe9\x94\x61\x1b\xd2\xa7\xad\x80\x89\x70\xe4\xb9\xae\x72\x04\x8a\x7a\x4f\xc2\x86\x77\x4b\xe0\xac\x7f\x02\x61\xa9\x35\xd7\x7b\xa4\x47\xae\x15\x0e\x55\x4a\x37\x31\x48\x28\x1a\x05\x3f\xa2\xdc\x2b\x56\xb1\x9b\x16\x3d\x44\xab\x57\xb6\x50\xeb\x59\x28\x07\xad\xc2\x26\x2d\xea\x88\xba\x4b\x16\x8b\x8e\xa5\xee\x92\xc5\xc2\x30\x68\x35\x92\xc4\x96\x59\x2c\xe1\x60\xb1\x50\x05\x5a\x95\x4f\xb4\xc0\xda\x2d\x14\x7b\x1a\x03\x17\x62\xe0\x62\x55\x51\xd1\x82\xfe\xb4\x8a\xfe\xcc\x10\x24\xcd\x94\xa2\x30\x93\x9c\xa3\x7e\x83\x98\x67\xa6\x65\xeb\x88\x05\x8f\x45\x51\x33\x15\x5e\xcc\x88\x6f\x3b\x46\x88\x20\x77\x27\xaa\xf1\x21\x05\xc8\xce\xa2\xd4\x6f\xd6\xeb\x99\x14\x7a\x81\x02\x3d\xca\x4d\x39\xf2\xfa\x11\x35\x1c\x2e\x1e\xad\x54\x6f\x94\xe0\x5a\x20\x38\x54\xee\x42\x4f\x21\xae\xd7\x8a\xf8\x9e\x32\x51\xdb\x08\x9c\x91\xf8\x42\xcf\x41\x40\x74\x44\xa6\xa8\x4f\xe0\x6b\x65\x56\xa4\x3e\x5f\xe9\xb2\x7d\x0b\x75\x36\x32\x9a\xa5\xfe\x4a\x89\xce\x68\xa9\xa7\x94\x30\x54\x97\x5a\x91\x5f\xf2\xd0\x1a\xe5\x95\x0a\x1c\xec\x7e\x35\x18\x68\x15\xb5\x77\x2b\x8d\xf3\x79\xfd\x00\x6f\xa4\x12\xe2\x49\x15\x38\x47\x2f\x5d\x35\x70\x02\xe8\xa5\x7b\xca\x45\xbd\xf4\x40\xb6\x48\x13\x06\x2e\x10\x20\xcf\xde\x47\xa3\x98\x29\x8d\x22\x64\x8c\x03\x01\x77\xff\xa1\x4e\x04\x64\x7a\x72\x44\x45\xe5\xa2\x26\x5f\xd7\x3d\xfb\x76\xae\x84\xdc\x87\x5b\x46\x44\xbd\x74\xcf\x85\xe8\x54\xf8\x16\xec\xb1\x96\x9e\x4a\xe3\xa1\x3c\xd4\x4b\x23\x4b\x79\x83\x58\x6e\x43\x58\x5a\x1a\x58\xbe\x1b\xed\xfd\x46\x09\xbe\x55\x66\x17\x09\xd2\x86\x99\xa3\x0b\xac\x40\x9e\x26\xad\xde\x53\xab\x42\xa5\xfa\x0d\x31\xeb\x5d\x29\x52\xfd\x06\xa8\xf2\x8e\xfa\xa8\x7e\x03\xb5\xf9\x5e\x29\x52\xbe\xe6\x61\x74\x83\x2d\x1d\x1c\x9c\x9d\x8e\x97\x5e\x6f\x9f\x89\xd5\xe9\x94\xea\x50\x71\xed\x1a\xfd\x5e\x95\xf8\x75\xea\x77\xf0\x72\x76\xad\x7e\xd3\x2b\x96\xea\x37\xbd\x62\xa9\x5e\x80\xa7\xe9\x3a\x35\x03\x9b\x66\xa8\xc4\x30\xf0\x3c\x2a\xe1\x84\x25\x59\xb4\xa3\x6b\xaa\x50\x17\xc9\x3e\x4e\xca\xd4\x6a\xf4\x15\x00\xb2\x28\x00\x79\xa3\x65\xaa\xc9\x19\xbe\x71\x31\x25\x09\x58\x5f\xc6\xd1\x16\x7d\x8c\x74\x2c\x76\xaa\x79\x8c\x26\xef\x95\x4f\x35\x44\xe9\x54\x95\x53\x3f\xc4\x41\x96\xd3\xd2\xe3\x56\xfb\xd7\xb6\x84\xa4\xe1\x2f\xb4\xd4\x05\x5b\xa5\x92\xb0\x2d\x81\x54\xc8\x3b\xac\xea\xb6\x58\x5e\x72\x56\x39\x18\x6c\x1b\xf4\x43\xa9\x1f\xd6\x97\x6f\x6b\xfd\x86\xb0\xad\x32\x7d\x5b\x88\x07\xad\xbe\xf8\x2c\x2f\x3e\xdb\x36\xfa\x0d\x69\x24\x0d\xd5\x59\xde\x7f\x56\xdf\x7f\xb6\x45\x5b\x34\xe5\xd9\xb4\x51\x75\x8c\xf0\x8a\xf6\xf3\x23\xe8\x87\x2c\x4f\xc9\x12\x80\x0f\x3a\xfd\xa6\x22\xa4\x4a\x45\x7a\x46\x46\x20\x33\x41\xbf\xe9\x40\x10\xf2\xa2\xc8\x0c\xac\x9e\xa2\xbf\x23\xfc\xa8\xe8\xa5\xa5\x8c\xeb\x63\xd0\x40\x6b\xcd\x37\x9d\x7e\xe0\x1c\x67\x34\x5c\xba\xfe\xc6\xe9\x14\xa9\x18\x54\x41\xdf\x71\x01\x89\xf3\xe0\x94\x10\xc4\xad\x17\xed\xa0\x71\xee\x40\xad\x44\xd0\x3d\x69\xa0\x40\x22\x14\x88\x88\x16\x44\x58\x0b\xa7\x5f\xa0\xc8\xb9\x61\x14\xe5\x1b\xdf\x6d\x69\xa8\x3c\x02\x58\xc1\x73\xbe\x27\x38\x1f\x3c\xfa\xa6\xbe\xac\x55\x34\xb3\x53\x59\x4c\x15\xc4\x0c\x2a\x85\x49\x24\xd7\x40\x5d\x45\xd1\xc1\x40\xd7\xaf\x3f\x5a\x02\x64\xd7\xe5\xb8\xe7\xeb\xef\x49\x48\x15\xd5\x5e\x2a\xaa\x1d\x34\x7c\x89\x78\xfc\xc0\x48\xca\x24\x09\x15\xcf\xa1\x4b\xf3\xc0\xf4\x5f\xe8\x07\x58\x43\x07\x7a\xd2\x5a\xe9\x49\x9d\x7e\x50\xac\x3b\x47\xe5\x3a\x85\x9e\x26\x54\x9d\x5e\x13\xd4\xbd\xae\xd6\x1b\x3a\x52\xfd\xa0\xdc\xff\xfa\x03\xd4\x82\x84\x80\xe7\x36\xd0\x8f\xaa\x72\x00\xc2\xa0\xa1\x55\xb5\xa7\x56\x25\x02\x4c\x2a\xfd\xa4\x1c\xa6\x2a\x12\xc0\x7b\x35\xd4\xb0\xb3\xd6\xa6\xd2\x0f\xeb\x8b\xd5\xa2\xdf\x90\x3f\xae\x95\x0e\xa6\xb6\xfa\xa1\xd4\x0f\x98\xe9\xb3\xd7\xb9\xa6\x93\xc1\xe9\xd7\x05\x08\x28\xe5\x50\x57\xa1\x81\x3e\x64\xe8\xd7\x2e\x5a\xab\x2a\xa7\x2d\x55\x60\xad\x47\x4e\xb0\xf5\xeb\x36\xee\xf4\xf5\xd7\x85\xf5\x7b\xad\xd3\x1d\x63\x17\x5a\x70\x53\xfa\x0d\x37\xda\xe9\xc6\xab\xab\x81\xc2\xd6\x50\x24\x74\xec\xc2\x3a\xdd\x85\x75\x35\x25\x58\x35\x13\xa5\x83\xe6\xb7\x43\x8c\xa4\x43\x8c\xa4\x43\x44\xa2\xe3\x1d\xd6\xb1\x15\xeb\x6a\x7c\xe7\xae\xae\xf9\x02\xce\xf2\x0e\xba\xc6\x4e\x19\x52\xba\xb6\xa4\xcc\x8b\xfd\x40\xd7\xae\xfd\xb1\xae\xed\xf4\x1b\xee\x5c\x43\x92\x1d\x21\xc9\x4e\x83\xcd\x5d\xd4\xf0\xff\x46\x89\x95\x5c\xba\x7e\xa0\xd8\x4b\x69\x44\x3b\x96\xfd\x4e\x97\xfd\xae\xe3\xd2\x1d\xdb\x86\x8e\x9c\x5f\xd7\xb5\xfa\x4d\xcb\x37\xad\x7e\xd3\xee\x0a\x37\x98\xab\x91\x59\x0d\x30\x37\xc4\xe3\x1b\xdb\x33\x5b\x02\x8c\x87\x8e\x72\xc3\x72\x79\xb8\x05\xee\x0f\xf1\x5b\x3e\xf4\x0a\xb0\xc8\x90\x8e\x68\x57\x36\xf4\x0e\xaa\x5d\xd0\x87\x4f\x4d\x12\x3e\xed\x69\x43\x15\x87\xa1\xf4\x2c\x3d\x71\x0d\x61\xda\x21\xc8\x0c\x0b\x65\xa7\x17\xe8\xa0\x39\x55\x55\xee\x96\x27\xbf\x8e\xb5\xad\x7f\xc8\xaa\x0f\x25\xf3\x01\x39\x83\xa6\xd5\x87\x24\xe9\xbc\x49\x47\xa8\x1a\x82\x7e\x28\xb2\x6d\x6e\x81\xec\x6b\xab\x3e\x7e\xdb\xa1\xc9\x3a\x90\x52\x14\x7e\x94\x59\x19\x5a\x15\xbc\xbe\x81\x7d\xd2\x28\x33\x06\x29\xed\x81\xf4\xb4\x4c\x9a\x56\x1b\x95\x8b\x0e\x71\x70\x5f\x24\x8d\xaa\x72\xb7\x29\x4f\x19\xbc\xce\x3b\xa9\x14\xf2\xe6\xad\xb2\x9f\xf4\x1a\xb5\xbd\xc6\x18\x24\xad\x3d\xed\x2d\x89\x86\x21\x61\x72\x2d\xf1\xaf\xf0\x05\x19\xe9\x16\x10\x79\x1b\x45\x99\x52\x55\x72\x63\xa0\x1d\x69\xae\x74\xf0\x10\x2c\xe7\x1c\xe5\xd8\x8d\xaa\x09\x35\x34\x64\x7e\x5d\x43\x22\xfb\xb4\xe9\x6d\x19\x91\x9e\xf4\xad\x4a\x62\x63\xab\x36\x4c\xb2\x24\x69\x96\x51\x37\x0e\xf7\x15\x54\x33\x77\xcb\x47\x8c\x5e\x7e\x0b\x21\xfc\x76\x0c\x92\xdb\xe0\xbc\x81\xab\x49\xf3\x48\x75\x3f\xde\x5c\x92\xe1\x18\x14\x29\xc6\x4a\x71\x5a\xa1\x51\x2a\xa7\x8a\x92\xf4\x0e\x7a\xc3\x65\x72\x6f\x99\x4d\x0b\x43\xe8\x99\x9e\x57\xa9\x97\xbd\x2a\xd2\x9e\xeb\x92\x42\x14\xee\x21\x15\x84\x1b\x98\x70\x9b\xa4\x4b\x45\xb4\xff\xb4\xb3\x94\xc3\x38\x61\x2f\x1e\xa5\x3c\x4a\x72\x1d\x3d\xeb\x6d\x49\xb2\x44\x69\x60\x23\xd3\x25\x56\xdd\xd5\x94\x08\xcf\x32\x56\x9a\x33\x9a\x23\x34\x9a\x1e\x62\x2e\x0a\xf3\x5b\xef\xa2\xb3\x9c\xc2\x62\xbb\x6e\x5c\x8e\x74\x75\xa6\x2a\x2d\x7a\x7a\xa6\x3c\x59\xfd\x2a\xb0\x47\xa6\x85\x63\xa3\xab\xc3\xf1\x46\xab\x25\xd7\x13\x76\xc4\x5a\x86\x2e\x51\x81\x96\x2c\xe9\x9f\xa1\xf4\x48\x6b\x7e\x74\xe6\x15\x92\x8c\x2a\x00\x29\x44\x67\xda\xa6\xe1\x94\xc6\xa7\x3d\x92\x0a\xd9\xe9\x94\xd2\x85\xa4\x27\x52\x1e\xc8\x6c\x95\x70\x98\x81\xe6\xd2\x65\xb0\xa7\x4d\x4e\x5b\x51\x54\xba\xb9\x27\xef\x09\xa3\x32\xa2\xfe\x41\x74\xb9\xe8\x13\x87\xad\x32\x15\x29\x65\x0d\xd3\xb6\x35\xaa\x68\xad\x09\x52\x26\x6f\xbf\x1c\x08\x5f\x8b\xde\xe1\x3e\x85\xbc\xe3\x2d\xe1\x70\x4f\x35\x6c\x8f\x13\x72\x31\x6c\x7b\x0e\xdf\x91\x50\x5e\xaf\x02\x43\x56\x2e\xf2\x83\xbd\x68\x5e\xff\xfc\x5a\xeb\x94\x27\x8d\xd1\x57\x93\x29\x59\xb1\x0e\xb0\x7e\xb1\xe8\xca\x51\xc5\xd3\xb0\x82\x8e\xd6\xce\x11\xe3\x32\xeb\xa1\x6a\xf0\x78\x9d\x6f\xe5\x7b\x74\xf4\x86\x5a\x38\xfd\x50\x26\x6d\xd6\x6b\x04\xbe\x87\x7f\x59\x0b\xd2\x94\x5c\xb4\xd8\xce\xdc\xa2\x7f\x53\xa8\xe2\x8c\xfe\xa9\x4c\x92\xd8\xd7\xab\xf0\x71\x11\xe5\x98\x1e\x98\x8e\x0a\x5d\x6f\xfa\xb6\x48\x29\x8d\xbb\x0d\x0d\xf5\x0e\x4f\xd9\x76\xdc\xb6\x2e\xfb\xeb\x3f\xfe\x82\x4d\x43\x72\x9e\xb1\x50\xa2\x0c\x54\xda\x75\x6f\xa8\x1b\xdb\x96\xdc\x60\xa9\x37\x58\x92\x65\x2f\x89\x91\xb4\x25\x0b\x90\x96\x65\xb6\xa5\x5f\x37\x8f\x7a\xbb\x6d\x59\x66\x7f\x4d\x6f\x67\x53\x6e\xd6\x8e\x52\xdd\x03\xc3\x65\xfa\xe6\x8d\x6e\x24\x31\x38\xfc\x55\x61\x96\x83\x14\x7c\x4c\x32\xab\x28\xa1\x0f\x53\xc3\x76\xc9\xcb\xc2\x29\x15\x94\x2e\x2a\x00\x18\x3a\xaf\x93\xa6\xdc\xab\x30\xaf\x24\x5a\xfd\x95\xd4\xaf\x70\xca\x72\x3d\xd6\x2d\xec\x74\x69\x57\x84\x03\x47\x7e\x68\x47\xc3\x50\x46\x0d\xd0\xbf\xf3\xed\xe8\xed\xd4\xa6\xaf\x63\xd3\x0f\x6a\x9b\xc2\x01\x5a\x89\xc9\x82\x9f\x5b\x45\x3d\x1c\x6e\x47\x4f\x9f\xac\xee\xea\x11\x01\xf7\xd0\xdf\x2c\x5a\x43\x71\x5f\x93\x2c\x5a\xac\xe4\x43\xda\xbc\xaa\x8e\x53\xba\xee\xd1\x8a\x08\x1d\x58\xa3\xca\xf0\x1f\x2f\xa6\xdf\xcb\x5b\x71\x54\xbf\x11\x7f\xac\xe9\x0b\x33\x3f\x48\x53\x5f\x62\xe2\xb0\x7c\x90\xa8\xbe\xd2\x97\x11\xc3\xdd\xd1\xc4\x6f\xf4\x1b\x5e\x8f\x1a\xaa\xed\x05\xf2\x63\xa7\x60\x15\xee\xa3\xd3\xfb\xe8\xd5\xf2\x95\x05\xb2\x73\x31\xf1\x3f\x55\x3a\xbf\xe7\xec\xa7\x8d\x3b\x7d\x5b\xf6\x3a\xfa\xba\x30\x76\x20\x03\xba\xa6\xcf\xff\xd7\x9f\x94\x93\x7c\xf0\x68\x74\x4d\xea\x51\x40\xaa\xd3\x15\x93\x25\x34\x8e\xaa\x2f\x87\x5f\x55\x8f\xc1\x0c\x0b\xc4\x76\xdd\x72\xf5\x08\x3f\xb9\xe3\x0e\xaa\x23\xa1\x92\x08\xb8\x13\xac\x1f\x94\x29\xb6\x51\x7d\x2b\x5b\xa5\xcb\xbc\x3b\x4c\xfc\x8c\x2a\x81\xa3\xf0\xb5\xd2\xee\x2b\xb1\xa4\xd3\xbf\x2b\x58\x43\x8b\x0f\x14\xa0\xc2\x5c\x88\x0c\xcf\x41\x4f\x4c\x29\x35\x39\x81\x3d\x46\xcc\x95\xf2\x4e\x01\x2d\xd8\x83\x18\x8a\x4a\x45\x4f\xb9\x75\x1b\x0b\xed\x6e\xd6\xb2\xa8\x6b\x59\x64\xb1\x88\x0a\x9b\xea\x9d\x56\x3f\x72\x87\xf8\xa9\xb2\x67\x98\x57\x4f\xb1\x67\x98\x57\x7a\x14\x6d\x92\xc1\x93\xd4\x17\x79\x3d\xe2\x8a\xeb\xf7\x0c\x2e\xe5\xe9\xec\xb9\xf1\xf5\x43\xd9\x2f\xe1\x45\x35\x42\xdb\xa4\xab\xdd\xb0\xac\x16\xe9\xb2\xda\x0f\x4f\xb7\x63\x32\x02\xd7\x08\xbb\x1b\x3b\x36\xf1\xe9\xda\x14\x83\x6c\x9d\xb8\xad\x49\x3a\x5a\x36\x10\x78\x9f\x5e\x3b\x4a\xcf\x89\x57\xa6\xce\x6e\xe7\x52\x94\xcb\xa3\xd9\xdb\x3b\xf7\x27\xcb\xdf\x9e\x5f\x7c\x1d\x96\xab\xcf\xff\xc5\x6c\xd1\x1b\x97\x5d\xd7\x25\xd4\x9c\xfa\x82\xe2\x12\x75\xd7\xed\xbe\x53\xb6\x57\xfc\x22\x76\xe1\x72\xba\x3a\x79\x72\x3a\x9b\x2f\x42\x3d\x8d\x27\x8f\xe7\x6d\x3c\x79\x3e\x9f\xcc\x56\x5b\x08\x2f\xe0\x0b\x50\xb5\xc5\x7a\x2d\x11\x28\x2d\x45\xa0\x7a\x48\x65\x8b\x36\x82\x44\x94\x11\x1a\x25\x69\x30\x04\x36\x35\x1a\x89\x5c\xa3\x35\x1a\x2c\x34\x05\x01\x2d\x4a\xeb\xc7\x72\x2b\x1d\x3b\x6c\xf8\x75\x14\xbb\xd8\x75\x5d\x39\xde\x5a\xf7\x0b\xf6\x00\xf1\xca\x46\x92\x09\x5e\xdf\xfd\x3e\xe8\x9b\xba\xd6\x3e\xad\xdd\x95\x97\xeb\xb6\x21\xbe\x9e\x7f\x1f\x17\x4d\x58\xc6\xfe\xa9\xaf\x80\x5d\xda\x2e\xc1\xb8\xbc\x01\x63\x01\x30\xd7\x08\xc9\x53\x59\xaf\xc5\x86\x60\xad\x01\x97\x6b\x84\xd2\x0b\x81\x5b\x44\x48\x50\x0b\x52\x6f\xc4\x70\x0d\x31\x5c\x03\x5e\xd7\x08\x62\x58\x02\x63\x09\xe1\x5c\x23\xe0\x91\xc5\x62\x8f\xb2\x1b\x30\x5e\x03\x8c\xd7\x00\xe3\x35\x62\xb1\x47\xdd\x8d\xa8\xa1\x11\xa4\xb9\x84\x04\xb7\x80\x17\x10\xa4\xb5\x04\xbc\x00\x80\x5f\x23\x48\x80\x09\xbc\x26\x82\x10\x99\x00\x1d\x00\x9d\x6f\x84\xfc\x9e\x90\xac\x24\x24\x6c\xc0\xeb\x1b\x40\xc1\x06\x50\xb0\x11\xc0\x04\x92\xf3\x2b\xe4\x75\x85\xe4\xa5\x80\x9e\x11\x38\x4e\x84\xd4\x38\xc3\xc4\x48\x81\x3d\x39\x4d\x81\x3d\x45\x0a\xec\xa1\x8c\x96\x02\x7b\x48\x59\x04\xd6\x66\x21\x87\x2e\x1e\x7b\x80\x09\x02\x14\x48\x3c\xf7\xef\xb9\x7f\x4f\xf2\x55\x4a\x1e\x80\xa4\xa8\x50\x70\x4c\xd0\xda\x08\x49\x63\x01\xbb\x20\x15\x8f\x47\x96\x5d\x34\x0d\x48\xa9\x81\x11\x12\xec\x80\x97\x0d\x05\x07\x06\xd8\xb2\x11\xf2\xca\x42\x7e\x5d\x02\x96\x4c\x00\x01\xe3\x20\x60\x5c\xa4\xa6\x9d\x48\x64\x4a\x8d\xa5\x66\x9b\x09\xd2\x1a\x21\x83\x29\x20\x1c\x84\x2c\x33\xf5\x0b\x06\xdc\xb3\xa1\x7e\xc1\x50\xbf\x60\x84\x1c\xac\xb4\xfc\x64\xcb\x85\xc0\x97\x08\xf8\x12\x21\xed\x29\xc8\xf4\x81\xb3\x35\x12\xb9\x45\xc4\x04\x05\x1c\x8d\x50\xcf\x22\xd4\xb3\x08\x68\x20\x01\x88\x02\x94\xda\x08\xc8\x1e\xa1\xb6\x47\xa8\xf6\x11\x40\xf5\xc4\x8f\x8d\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\xb0\x65\x00\x5b\x06\x30\x2c\xb6\xc6\x32\x80\x2d\x03\xd8\x32\x80\x2d\x03\xd8\x22\x2c\x63\x2c\x00\x03\xcb\x78\xb5\xc0\x98\x2c\xe3\xd5\x32\x5e\x01\x17\x1b\xcb\x18\xb5\x8c\x51\x52\xac\xc6\x3a\x2d\xe9\xa9\xf8\xcd\x4a\x4b\x7e\xfa\xca\x20\xb3\xc5\xa6\xa5\x70\xb4\x01\x82\x06\x6c\x8c\x61\xb7\x0f\x7b\x06\xf4\x20\x23\x83\x66\x32\x7a\x33\xa3\x37\x33\xf0\x6d\x99\x02\xb5\x32\x50\x15\x19\xdc\x3d\xa0\xcf\x4d\x46\x47\x66\x74\x24\x95\x27\x26\xa3\x23\x33\x3a\x32\xa3\x23\x33\x3a\x32\xa3\x23\x33\x3a\x32\x53\xe0\x58\x46\x1f\x0e\x18\xb6\x92\x23\x46\xe0\x61\x9c\x72\x14\x39\x66\x99\x63\x96\x39\x66\x99\x63\x96\x39\x66\x99\x63\x96\x39\x66\x99\x63\x96\x39\xd5\xc1\xe4\x71\x1d\x8f\xeb\x98\x65\x8e\x87\x76\x94\x4d\x38\x8f\x3d\x4f\xee\x7c\x97\x60\xe7\xf8\x3b\x13\xcb\x01\xb9\x72\x60\x82\x1c\xcd\xed\x98\x64\x8e\x8c\xbb\x03\xd0\x02\xd1\xb1\x71\x15\xf6\x40\x59\x1c\xf3\xcd\x31\xdf\x1c\xf3\xcd\x05\xec\x03\xf6\xcc\x37\xc7\x7c\x73\x01\x7b\x70\x0d\x0e\x78\x87\xab\xb1\xaf\xb1\x67\xee\x39\x80\x0e\x0e\x0c\x81\x63\xea\x39\xd0\x2f\x0e\x20\x01\xc8\x71\xe3\xc0\x7c\x38\xf4\x0c\x1d\x93\xd1\xd1\x7d\x8e\xda\x0d\x47\xf7\x39\xd0\x76\x0e\x28\x88\xa3\x0f\x1d\x7d\xe8\xe8\x43\x47\x1f\x3a\xfa\xd0\xd1\x87\x8e\x3e\x74\xf4\xa1\xa3\x0f\x49\x90\x19\x47\x1f\x3a\xfa\xd0\x31\x19\x1d\xf8\x11\x47\x47\x3a\x3a\xd2\x51\x53\xe5\x98\x92\x8e\xee\x24\x31\x63\xa0\xf4\x31\x39\x53\x32\x67\x4a\xe6\x4c\xc9\x9c\x29\x99\x33\x25\x73\xa6\x64\xce\x94\xcc\x99\x92\x39\x53\x32\x67\x4a\xe6\x4c\xc9\x9c\x29\x99\x33\x25\x73\xa6\x64\xce\x94\xcc\x99\x92\x39\x53\x32\x67\x4a\xe6\x4c\xc9\x9c\x29\x99\x33\x25\x73\xa6\x64\xce\x94\xec\x01\x92\x09\x1a\x72\x17\xe6\xa0\x22\x8b\xd4\xb0\x8c\x70\x01\xa3\xcc\xf0\x28\xa7\x0b\xb3\x92\xe0\xff\x0a\xe1\x50\x89\xeb\xa7\x13\x38\xc7\x04\x92\x25\x81\xee\x4c\xf0\x04\x84\x28\x9b\x10\x25\x95\x48\xee\x97\x20\xa9\xc0\x21\x24\xb0\x2e\x09\xc4\x68\x82\x1b\x2d\xb8\xd1\x02\xa3\x9c\xc0\x28\x27\xb8\xd1\x02\xa3\x9c\x44\x72\xf6\xd1\x62\x6f\xb1\x47\x1b\x1b\x9a\x41\x21\xe2\x2a\x38\xd7\x82\x73\x2d\x38\xd7\x02\x7b\x87\x68\x61\x24\xc8\x77\x81\xbd\x43\xc0\xbf\x0b\x4e\xb7\xe0\x74\x0b\x4e\xb7\x80\x8e\x11\x7c\x6e\xc1\xe7\x16\xc0\xd2\x12\x11\xda\xc6\xe7\x16\x7c\x6e\xc1\xe7\x16\x7c\x6e\xc1\xe7\x16\x7c\x6e\x81\x41\x50\xc0\x90\x4b\x2c\xb0\x2f\xb0\x2f\xb0\x07\x5f\x00\xbd\x8c\x44\x8f\x3d\x90\x07\x44\x9c\x04\x17\x5c\xa2\xc7\xde\x63\x4f\x82\x9b\x4d\xba\x80\xd9\x11\xf0\xf6\x02\xde\x5e\x62\x89\x3d\x02\x05\xb1\xc4\x1e\xc0\x49\x04\xfb\x11\x2b\xec\x2b\xec\x59\x4c\x85\x88\x92\xc0\xaf\x2d\x38\xbb\x82\xef\x2e\x6c\x0f\x25\x02\x54\xc0\x81\x17\x42\xc1\x02\x27\xa8\xa0\xa2\x2c\x84\x82\x25\x02\xca\x20\x40\x27\xe8\x9a\x09\x88\x20\x89\x35\xf6\x14\x5d\x46\x1d\x2e\xd4\x5c\xc6\x06\x7b\xd0\x2c\xc4\xbb\x05\xae\x7f\x89\x0d\xf6\x00\x70\x22\x05\x99\xb1\xc5\x9e\x54\x7c\x6c\xb1\x07\xed\x81\xce\x83\x50\xfc\x26\xec\x04\x04\x40\x91\x44\x94\xc4\x63\xc4\x1e\x20\x44\x44\x99\x3c\xa2\xf1\x10\x23\xf6\xf0\xa9\x41\x21\x2e\x11\x7c\x04\x15\x36\x02\xb3\x8f\x40\x0e\x24\x11\x56\x78\xca\xea\x24\x32\x05\x62\xa7\xe0\x02\x46\xb7\x8a\x2b\x0c\xe0\x85\x1e\xaf\xc0\xb8\xd4\x10\xb8\xa0\x80\x2a\xba\xf5\x18\x90\x0c\x23\xf0\x82\x62\x5e\x3a\xc6\x82\x6e\x93\x77\x70\x0b\xf4\x62\xa7\x20\x0c\x20\x4f\xa2\x09\x1c\xe9\xe8\x10\x8d\xae\x6f\xe1\x0d\x1c\xfd\xb5\xe8\x06\x8e\x7e\x0f\xb8\x81\xa3\x4f\xb1\x0d\x7e\x0f\xb6\x81\xa3\xbf\x19\xda\x40\x61\x19\xfb\x04\x7c\xe3\x01\xd9\x00\x96\x5d\x32\x97\x82\x15\x38\x6a\x51\x5a\x71\x05\xab\xa0\x15\x58\xe2\xb5\x5c\x6d\x7d\x9e\x66\xbb\x07\xc4\xc2\x18\xa4\x20\x1c\x73\x8e\x05\xc7\x92\x63\xe0\x08\x27\x1c\xb7\xdc\x50\x91\xd5\xc0\x59\xd4\x68\x5d\x16\xa0\x17\x8b\x64\xa2\x05\xa1\x68\x1b\x28\x8a\xa8\xa4\xb0\x0d\x14\x45\x0d\x95\x72\x4d\xa9\x96\x94\x6e\x41\x51\xd4\x28\xab\x3f\x95\x5d\x0d\x14\x45\xc4\x8e\x6c\x43\xcd\x2b\x39\x33\x4b\x60\xc8\x36\xd4\xd2\x35\xd4\xbf\x12\x1e\xb2\x04\x59\x2d\x9a\xde\x16\xae\x75\x4b\xb9\x86\x85\x6a\xdd\x52\xae\x61\x41\x3f\x5a\xe4\xee\x2c\x3a\xf0\x96\xd0\x91\x25\x74\x64\x9b\x1a\x7b\xea\xd2\x88\xba\x5b\xa2\x48\x96\xa8\xbb\x25\xea\x6e\x9b\x06\xfb\x06\x7b\x6a\xf4\x28\x8e\xb1\x0d\x35\x7a\xca\xcd\x47\xd8\xcd\x36\x94\xb7\xa2\xc3\x61\x1b\x0a\xec\x9a\x16\xfb\x56\x4b\xd5\xb0\x8f\x59\x02\x06\x69\x12\x2c\xc8\x4d\x28\x90\x50\xac\x57\xd7\x50\x20\xf3\x59\xac\x67\x41\x28\xd6\xab\x6b\x28\x1c\xea\x27\x4e\x81\x09\x6a\x09\x60\x01\xb5\xd1\x02\x15\xff\x22\xc7\x3e\xc7\x5e\xd5\x52\x28\xa3\x2e\x72\xec\x21\xa9\x2b\x0a\xec\x0b\xec\x0b\xec\x0b\xec\x49\x8d\x17\x05\xf6\x05\xf6\x25\x96\x25\x96\x25\x96\x25\x96\x94\x69\x17\x25\x96\xa5\x5a\x72\xe5\x0a\xfb\x0a\xfb\x0a\xfb\x0a\xfb\x0a\x7b\x2a\xf3\x42\xb1\xee\xe7\xe0\xd7\x2f\xa7\xe0\x51\x5b\xf5\xc0\x1e\x3c\x7a\x2e\x1e\xdc\x85\xb7\x6a\x03\xc6\xc2\x23\x84\x0a\x06\x2e\x40\xe8\x18\x3c\x25\x6f\x9e\x92\x37\x9f\x71\x42\xc6\x09\x19\x30\x0b\xda\xcf\xd3\x7e\x9e\xf6\xf3\xb4\x9f\xa7\xfd\x3c\xed\xe7\x69\x3f\x4f\xfb\x79\xda\x0f\x58\x5d\xf0\xb4\x9f\xa7\xfd\x3c\xed\xe7\x69\x3f\x4f\xfb\x79\xda\xcf\xd3\x7e\x9e\xf6\xf3\xb4\x1f\x95\x8f\x01\x8e\xd9\x00\xc7\x6c\x80\x63\x36\xf8\x42\x1f\xc0\x03\x05\xf1\xc0\x3e\xc0\x5e\x78\xcf\x85\x4a\xad\x79\xe7\x42\x34\xaf\xa7\x79\x3d\x70\x15\x5f\xc6\xf5\x91\x26\xf5\x84\xf1\x83\xa7\x4d\x3d\x6d\xea\x69\x53\x5f\xf1\x6b\xda\xa4\xc8\xdb\xfa\xc0\x09\x81\x8b\x06\xec\x03\xf6\x01\xfb\x80\x4d\xcd\xdf\xd1\x88\xf5\x68\xd1\xfa\x9a\xeb\xa0\x45\x3b\x80\x55\xb8\x42\x53\x26\x88\x15\xca\xf5\x95\x2d\x91\x2a\x89\x6b\x10\x16\x65\x82\xb0\x58\x5f\xeb\x06\x80\xc4\x16\x73\xb0\x57\x70\xa7\x07\x06\x28\x6f\xde\x26\x81\x3e\xca\xd4\x6e\xf2\xb1\xa3\x3c\x56\x33\xa4\xae\x46\x81\xfa\x21\x8d\xdc\x8d\x42\xd5\xd2\xa7\x7c\x08\x89\xba\x78\x35\x6e\x4d\xa8\x7c\xc8\xb4\x56\x1a\x86\x2e\x6e\x13\x99\xee\x2b\xeb\x54\xbf\xa2\x35\x59\x1a\x7f\xf6\xdb\x90\x72\x5b\x90\x16\x2b\x35\x4c\x4d\x64\xbc\xad\xfb\xb4\x97\xa6\xba\x94\xa9\xcf\x68\x28\x54\x83\xcd\x1a\xf1\xd4\x3b\xec\x49\xf6\xfa\xcc\xaa\x06\xa8\xf7\xc5\xa4\xa3\x5c\x17\x93\x96\xfa\xba\x98\xb4\xa6\xcc\xf7\xc5\xa4\xcb\xee\xda\x98\x74\x35\x8a\x4c\x2b\x43\x9f\xde\x77\xeb\xb2\x91\xd8\xcd\xac\x39\x0b\x8b\xd0\xac\xe2\x62\x4f\xc8\xed\xb2\x53\x8c\x5a\x87\x76\x55\x07\x91\xc4\x9e\x00\x1f\xa5\xa0\x25\xe9\x97\x92\x0c\x36\x38\xa8\xb6\xe2\xef\x15\x7f\x07\xd8\xd4\x52\x68\xde\x06\xfe\x8e\x3e\x77\x0b\x96\xb4\x85\x91\xa0\x45\xe6\xbe\xad\xf9\x3b\xe3\x76\x13\x33\xe4\x87\x77\x22\x65\x7f\xb8\xb8\x18\x45\xca\x1e\x1d\xfe\x79\xb7\x14\x0c\x18\x3d\xc5\xeb\x06\x10\xa3\x11\xf4\xef\xa9\x5d\x37\xd4\xae\x1b\x3c\x00\x23\x40\xe9\xf1\x03\x8c\x80\xa4\x17\x68\x71\xa9\x69\x37\xd4\xb4\x1b\x48\x24\x8c\x50\x36\x25\x82\x3d\xac\xbe\x62\xb1\xb7\xd8\x5b\xec\x2d\xf6\x54\x29\x88\xc5\x9e\xc2\x25\x0a\xde\x8d\x50\x04\x22\x14\x81\xe0\x61\x18\xa1\x9a\x06\x3f\xc3\x50\x08\x6f\xf0\x33\x0c\xc8\x48\x23\x8e\xb0\x8b\x23\x8c\x42\x88\x40\x88\x39\x50\x2c\x6f\x28\x96\x37\x38\x21\x46\xa8\x54\x92\x9c\x2b\xe7\x5c\x99\x4a\x07\xa1\x52\x4a\x28\x74\x10\x4a\x46\x84\xaa\x1b\x02\xa7\x46\xd0\xdc\x27\xfc\x69\xa4\xc0\xbe\xc0\x9e\x92\x2a\x01\xd1\x2e\x05\xf6\xf0\x1d\x88\xc7\x9e\x12\x39\xa1\x44\x4e\xd0\x2c\x12\x76\xec\xc2\x8e\x5d\xd8\xb1\x0b\x7b\x75\x44\x9e\x0c\x3e\x91\x11\x6a\xe6\x04\x8a\x65\x29\x35\x08\xc6\x56\x5e\xb4\xb0\x82\xf2\x6e\x23\xec\xe2\x21\xe5\x30\x5a\xea\x6d\xa4\xe2\x27\xa8\x48\x91\x4a\xe3\x69\x34\x4e\xe0\x96\x02\x3f\x41\x5d\x0a\x6c\x1d\x46\xd8\xcc\x0b\x9b\x79\x09\x9c\x15\x34\xcc\xc6\x59\x14\xe1\x1a\x61\x37\x2f\xec\xe6\x85\xdd\xbc\x10\xa1\x91\x5a\x43\x65\x5c\x8e\x52\x2c\x61\xd7\x0e\x69\x80\x81\xfc\xc3\x40\x1a\x60\x20\x0d\x30\xc2\x7e\x5d\xd8\xaf\x0b\xfb\x75\x61\xbf\x2e\x3a\xfe\x22\xb7\x18\xb9\x45\x02\x3d\x12\xb9\x45\xea\xe7\x84\xf2\x37\xa1\x12\x51\xa8\x44\x14\x76\xea\x42\x41\x9c\x74\xfa\xf4\xc4\x5c\x84\xba\x38\x21\xe6\x22\x90\x51\x58\x86\xb6\x65\x68\x5b\x86\xb6\x65\x68\x5b\x86\xb6\x65\x68\x5b\x86\xb6\x65\x68\x5b\x86\xb6\x65\x68\x5b\x86\xb6\x65\x68\x5b\x86\xb6\x65\x68\x5b\x86\x36\x05\xf4\xc6\x32\xb4\x2d\x43\xdb\x32\xb4\x2d\x43\xdb\x32\xb4\x2d\x43\xdb\x32\xb4\x2d\x43\xdb\x32\xb4\x2d\x43\xdb\x12\xe6\xb5\x0c\x67\xcb\x70\xb6\x04\x7b\x2d\xc3\xd9\x3a\x8d\xad\x11\xe7\xa5\x42\xc1\x58\xc6\xb3\x65\x3c\x5b\xc6\x73\xc6\x78\xcb\x18\x6f\x43\x31\xe6\xfb\x2a\x2f\x39\x62\x54\xd1\xc7\xe3\x2a\x4c\xc2\x3a\x19\x1d\x98\x29\x27\x4f\x46\xf8\x33\x23\xf0\x99\x11\xf8\xcc\x08\x7c\x66\xf4\x5d\x46\xdf\x65\xf4\x5d\xa6\x41\x3a\xfa\x2e\xa3\xef\x32\xfa\x2e\xa3\xef\x32\xad\x22\xa5\xd7\xb2\x9e\xad\x86\x68\x1a\x9d\x96\x11\xa3\x30\xce\x6a\x88\x0c\xfa\x11\xa6\x9d\x63\xda\x39\xa6\x9d\x63\xda\x39\xa6\x9d\x63\xda\x39\xa6\x9d\xa3\x19\x1c\xcd\xe0\x98\x76\x8e\xc6\x70\x4c\x3b\x47\x38\xda\x11\x8e\x76\x30\x98\xbb\x52\xe9\x4d\xf8\x3b\xed\xe2\x68\x17\x47\xe8\xd0\x11\x87\x76\x4c\x2e\x47\xe5\x8e\x63\x6e\x39\x6a\xbe\x1c\x33\xcc\x11\x92\x76\xcc\x2d\xc7\xdc\x72\xcc\x2d\xc7\xdc\x72\x04\xa6\x1d\x81\x69\xc7\xdc\x72\xcc\x2d\xa7\xb4\x2a\x14\xdf\x39\xc2\xd3\x8e\xf0\xb4\x63\x52\x39\xc2\xd3\x8e\xa9\xe5\x6a\x0d\x7c\x61\x4f\x20\xd4\x41\xab\xee\x28\xcc\x73\x4c\x39\x47\xd4\xda\x51\x97\xe7\x1a\x0d\x7c\x61\x4f\xd4\xda\xd1\x6d\x8e\xa8\xb5\xa3\xf3\x1c\x9d\xe7\xe8\x3c\x47\xe7\x39\x3a\xcf\xd1\x79\x8e\xce\x73\x74\x9e\xa3\xf3\x1c\x9d\xe7\xe8\x3c\x47\xe7\x39\xe2\xd5\x8e\xd2\x23\x47\x47\x3a\xa5\x0d\x65\xf6\x39\x3a\xd2\x69\xc4\x93\xd9\x97\x33\xfb\x72\x66\x5f\xce\xec\xcb\x99\x7d\x39\xb3\x2f\x67\xf6\xe5\xcc\xbe\x9c\xd9\x97\x33\xfb\x72\x66\x5f\xce\xec\xcb\x99\x7d\x39\xb3\x2f\x67\xf6\xe5\xcc\xbe\x9c\xd9\x97\x33\xfb\x72\x66\x5f\xce\xec\xcb\x99\x7d\x39\xb3\x2f\x67\xf6\xe5\xcc\xbe\x9c\xd9\x97\xd6\x10\x5f\x5f\x22\x34\x2a\xa3\xb9\xbe\x5c\x02\x06\x72\x81\x72\x40\xe0\xe3\x17\x00\x83\x02\x0d\xb9\x20\x08\x20\x70\xf3\x4b\x5c\x3f\x9c\x44\x4a\x79\xa2\x60\x2f\xd8\x0b\xf6\x82\xbd\x60\x4f\xd2\x0e\x76\x72\x89\x16\x7b\x8b\xbd\xc5\xde\x62\x6f\xb1\xb7\xd8\x5b\xec\x2d\xf6\x19\xf6\x19\xf6\x19\xf6\xd4\x85\x00\x2c\x11\x8a\xc3\x04\x25\x05\x01\x7d\x24\x40\xb1\x84\x84\xb4\x00\xc8\x12\x6a\xc6\x04\xaa\x04\x89\x0e\x7b\x87\xbd\xc3\x3e\xc7\x3e\xc7\x3e\xc7\x9e\x76\x84\x0c\x5b\xe0\xcd\x17\xf4\x17\x04\xf4\x8a\x44\x92\x8e\x64\xa5\x85\xac\xb4\x40\x91\x24\x30\x81\x0b\xa9\x69\x81\x2f\x5a\xa0\x61\x96\x48\x69\x10\x59\x6a\x01\x07\x2c\xd1\x63\x4f\xcd\x0f\xfc\x04\x42\xa6\x5a\xc8\x54\x4b\x2c\xb1\x2f\xb1\x2f\xb1\x2f\xb1\x27\x98\x49\x69\x9b\xc4\x12\xfb\x12\xfb\x0a\xfb\x0a\xfb\x0a\x7b\x08\x80\x22\xe5\xfa\x31\xf0\xf7\xc0\xdf\xe1\xcc\x07\xe4\x27\x91\x22\x23\x50\x92\x12\x03\xf6\x54\x76\xc5\x1a\x7b\xc2\x34\x90\x22\x08\x08\x36\x89\x0c\x94\x48\x41\x4a\x24\x64\x03\x00\x43\xe0\x4a\x10\xca\xe6\x84\xb2\x39\x89\x14\x39\xc5\x06\x7b\x0a\x54\x62\x83\x7d\x8b\x7d\x8b\x7d\x8b\x3d\xe1\x9c\x08\x69\x11\xde\xb2\x44\x8a\xa2\x62\x8b\x7d\xc4\x3e\x62\x1f\xb1\x8f\xd8\x47\xec\xa9\xe5\x82\xb5\x42\x62\xc4\x1e\x51\xf0\xd8\x61\xaf\x25\x3b\x04\x82\xe0\xcd\x16\x40\x21\x02\xf4\x5a\x62\x47\xc8\xc9\x68\xa5\x0e\x61\xde\x9d\x82\x1e\xfd\x40\x80\xb6\xcb\xf4\x03\xd1\xd7\x9d\xea\x9e\x3d\x05\x3d\x04\xc9\xd4\x88\xf8\x68\xa7\xc5\x71\x1d\x91\x45\x45\x31\x4b\x47\xd8\xb0\xd3\x4a\xb8\xa1\x52\xa7\x4c\x2b\x75\xf4\x03\xcc\x5d\xe3\x1a\x9c\x5a\x19\x98\x88\x45\xa9\x68\x0c\xee\xea\xc7\x14\xe4\x68\x5c\x8a\x5c\xad\x25\x1b\xbb\xad\xc7\x49\x4a\x70\x0a\x0d\x6b\x65\x49\x21\x8e\x86\x65\x46\x85\x38\xeb\x29\x61\x9b\x02\x96\xa2\xa6\x20\xe8\x42\x21\x4d\x83\xf6\x4b\x83\xf6\x4b\x03\xef\x8a\x85\xd8\xdc\x36\x50\x72\x37\xc8\xbe\x34\xa4\x52\x6d\x03\xb1\x44\x03\x91\x19\xfa\x15\xb6\x41\xe5\x85\x20\xbe\x6d\x20\x82\xa2\x16\xd7\x36\xa8\xbc\x50\x8a\x6b\x1b\x54\x5e\x1a\x68\xdc\x1a\x2a\x75\x1a\x54\x5e\x1a\x68\x98\xc0\x3d\x59\x70\x4f\xb6\x81\xd8\x0d\xdc\x93\x6d\x20\x89\x02\xf7\x64\xa9\xe2\xb5\x4d\xc0\x3e\x60\x4f\x5d\x0f\x6c\x24\x16\xe8\xb1\x45\x48\xd0\x02\x30\xb4\x00\x7e\x2d\x0b\xa7\x85\xcb\xde\x36\x54\xfb\x34\x50\x35\x35\x0d\xf6\xb0\xb6\x41\x2e\x6f\xa9\xf8\xb5\x4d\x83\x7d\x83\x3d\x35\x40\x0d\x14\x54\x0d\x54\x72\x0d\x54\x72\x94\x00\xdb\x06\xee\xf0\x06\xee\xf0\xa6\xc5\x9e\xca\xa0\x26\x62\x1f\xb1\x47\x17\xa7\x89\xaa\xb7\x66\xb5\x5c\x86\xa3\xfe\xdb\x71\x2c\x38\x96\x1c\x29\xac\x71\x54\xdc\x38\x2a\x6a\x72\xec\xa9\x4d\x29\x72\xec\x73\xec\x73\xec\x89\x2a\x14\x39\xf6\x39\xf6\x05\xf6\x05\xf6\x05\xf6\x05\xf6\x84\x1c\x0a\xa8\x02\x29\xc3\x0c\x10\x84\x84\xa2\xc4\xb2\xc4\xb2\xc4\x92\xaa\x9c\x02\x82\xc1\xa2\x54\x4b\xae\x5c\x61\x5f\x61\x5f\x61\x5f\x61\x5f\x61\x5f\x05\x2d\xec\xe1\xe8\x38\x2a\x75\x21\xd1\x11\xab\xdf\x12\xb4\xa1\xf0\xc4\x67\x58\x66\x58\x52\x25\xe3\x33\x2c\xd1\x90\xf5\x19\x96\x19\x96\xb4\x98\xa7\xc5\x3c\x2d\xe6\x69\x31\x4f\x8b\x79\x5a\xcc\xd3\x62\x9e\x16\xf3\xb4\x98\xa7\xc5\x3c\x2d\xe6\x69\x31\x4f\x8b\x79\x5a\xcc\xd3\x62\x9e\x16\xf3\xb4\x98\xa7\xc5\x3c\x2d\xe6\x69\x31\xb8\xea\x03\x5c\xf5\x81\x1a\xd2\x00\x57\x7d\xf0\x10\x04\x7b\x4a\x9c\xbc\x27\x1a\x84\x92\x86\xa7\x3d\x3d\xed\xe9\x69\x4f\x4f\x7b\x7a\x62\x80\xbe\xd4\xf8\x13\x36\xb4\xa1\xa7\xf5\x3c\xad\xe7\xb5\xf5\x94\xf9\xb1\xe2\x6a\x01\xcb\x80\x65\xe0\x6a\x01\xfb\x80\x3d\x21\x85\xe0\x03\xa6\x84\xec\x03\xf0\x9a\xe0\x6b\xac\x6a\xac\x6a\xae\x5a\x73\x55\x4a\x8c\x3c\xc5\x45\x9e\x18\x44\xf0\x0d\xc1\xad\x86\xc7\xe9\xf2\x51\xad\xcb\xde\x50\xd3\x00\x2a\x25\xd6\xb3\x29\xdc\x18\x85\x9a\x36\x75\x00\xa3\x50\x53\x8f\xbd\xa9\xf7\x62\x42\xf3\x6e\x1f\x2a\x52\x08\x1b\x29\x8c\xad\x2f\x6e\x29\x34\xb8\x55\xca\x8f\x02\x4a\xf2\xfd\x50\x05\xa0\x78\x63\xf7\xc1\x08\xc9\x1e\xaa\xfd\xe1\x00\xc9\xa2\xa7\x06\xcb\x13\x44\x37\x11\xb2\xb6\x55\xcc\x69\x54\xc8\xba\x42\x27\x15\xea\xa7\x6c\x5e\x24\x05\x37\xd4\x49\x0a\x8f\x1b\x21\x2c\xa3\xdd\x82\x2a\x95\x00\x72\x00\xaa\x69\x04\xac\x87\x4e\x2a\x22\xb5\x47\x4b\x36\x61\x14\x7f\x1a\x90\x8d\xf2\xc1\x38\xba\x6d\xd0\xe7\x8f\x67\x93\x55\x3c\x81\x9b\x68\x88\x51\xad\x0e\x8f\x17\x07\xc7\x6f\xca\xfc\x23\x09\x96\xfe\xfa\xee\xbe\x17\x5f\x56\xef\xa3\x29\x6a\xa7\xe1\x7c\x87\xd1\x72\xf4\x5c\x20\x1d\xc7\x8a\xdd\x7b\x34\x31\x1e\x9d\xcd\x77\xae\xd2\x0b\xef\xee\xad\x0d\xa8\x93\xf2\x94\x6c\x74\x99\x59\x58\xcd\xa7\x93\x30\x3b\xf9\x6a\x12\x17\xf3\xd3\xe9\xdb\x8b\xb3\xe5\xf8\xba\x57\x50\xd9\xc9\xd9\x8b\x50\x6f\x18\x95\xa0\xbc\x24\xb9\x5e\x18\x97\xf2\xab\xaa\x18\x82\xd2\xfb\x28\x59\x10\x9b\x93\x5e\xcb\xaa\x27\x0e\x22\x44\x55\x38\x65\x04\x62\x07\x5f\xe4\x7a\x3e\xf0\x8e\x42\xa9\x10\x7a\xe2\xa0\x56\x29\x85\x94\x18\x48\x75\xf0\x09\xc4\xdf\x48\xdc\xd3\x73\xf5\x48\x42\xdc\x03\x2e\x4f\x95\xeb\x7b\x32\xda\x0f\xad\xca\x6b\xaf\xaf\xca\xdb\x95\xcb\x1b\x05\xae\xe3\x2f\x30\xda\x1f\x0d\xa3\x3d\xde\x4f\xe0\xfa\x68\x71\x1e\x67\x93\x30\xdb\x0e\xcb\x5d\x52\xac\xc3\xad\x78\x62\xa2\xe1\x91\xe4\x33\x92\x8b\x7d\x17\x97\xab\xf5\xb5\x46\x7d\x69\xff\x72\xa5\x2e\x6d\x23\x69\x94\xdc\xc9\x6f\xc3\x74\x32\x8b\x9b\xc0\x72\xc2\x72\xa0\x5c\x06\x9a\x12\xaf\x7d\x93\x9e\x72\x7e\x79\xbe\xb1\x0f\x4a\x35\x11\x8a\xce\xef\xcc\xc9\x9d\x9a\x88\xd1\x8f\x2e\x97\xe1\xe4\xdb\x70\xb6\xef\x8c\x51\xad\xc4\x86\x9e\x2f\x1f\x9d\xbe\x0a\xaf\x93\x1b\x56\x49\xb3\x1a\x88\xc0\x56\x05\x2d\xb1\x8f\xb3\xd3\x30\x9d\x6c\x1b\x5b\xab\x91\x3f\x31\xa7\x15\x28\xb5\xbd\x9c\x56\x87\xb7\xa6\xb3\x8a\x7a\xc5\x2e\x26\x37\x7f\x16\x26\xaf\x97\x97\xaf\x27\xfb\x08\xbe\xdf\x5f\x4e\xa4\x85\x61\x7d\x35\x6b\x91\x8a\x7d\xff\x76\x7e\x31\x3f\x9f\x77\xf3\x6d\xb3\x58\xc2\x44\x90\x75\xef\x94\xc6\x6f\xaa\xe1\x93\xd3\x17\xe1\xec\x7c\xf7\xa6\xc6\x35\x83\x5a\x48\xdb\xeb\xb0\xab\x36\xfd\x68\xe8\x2d\xc2\x64\x3a\xdd\x8e\xbc\x84\xc0\x35\x31\xba\x3c\xdd\x19\x9f\x63\xfa\x8e\x41\x27\x2f\x3d\xe3\x6c\xd2\x6e\xcd\xb7\x44\x26\x5b\x93\xc7\x61\x16\xda\xf5\x0b\xe5\x51\x3d\x5f\x4c\x4e\x27\xb3\x30\xdd\x9e\xa0\x05\xfe\x3d\xa9\xca\x96\x93\x24\x3d\x7b\x31\xb9\x32\xdd\x8c\x6a\xf1\xf6\xc0\x77\xf3\xd7\xd4\xfc\xb2\x09\x4b\x7e\x6d\x5a\x87\xd9\xd5\x53\x25\xf5\x0d\xa8\xcb\x6d\x8b\xb4\x9d\x1e\x9f\x85\xd7\xe7\xbb\x7e\xa4\x4b\x5f\xc7\x38\x27\xad\x26\xd4\x5a\xe7\xc7\xe7\x26\x53\xf5\x86\x5a\xfa\x5c\x3f\x90\x85\xde\xaa\xcc\xa5\x17\x8a\x8b\xf9\xeb\x98\xf4\xc3\xb5\x1c\x35\x49\x3a\x36\x3d\x7f\xbe\x08\xcb\xf3\xab\x4f\xaf\x52\x6a\x43\x25\x6a\x9d\xde\xfb\xfc\xfc\x7c\xab\x9e\x65\x0e\xd1\x9b\xff\xdf\xc7\xc7\x3f\x1c\xf6\xec\xd6\xf5\xe1\xf1\x9b\xba\x3a\x7e\x53\xf3\x8f\x2e\xd5\x53\xaa\x59\x40\x77\x48\xe8\x2b\xe5\x41\x3c\x4c\xe8\xe7\x5d\xa2\x85\x99\x6f\x14\x31\x0b\x40\x80\xbd\xb4\x65\x2f\x6a\xa9\xef\x7e\xc3\xab\xbd\xe5\xfd\x6c\x77\x04\x2a\x7b\x4d\xa3\x11\x31\x35\xf0\xa4\x6b\x55\x22\x4b\x42\x8e\xc8\xd4\xf6\x82\x90\xa0\x3e\x04\x44\xc7\xcd\x2c\x2e\xfa\xc1\x0f\x34\x2e\x5b\x1f\x10\x15\x01\xd5\x4c\x34\xc4\x25\x0c\xc5\xf5\xd6\x10\x85\x30\xbc\xed\x36\xfa\xb5\x7a\x0e\xc1\x85\x5d\x6d\xa1\xc3\x94\xc7\xfa\x30\x21\xb2\xee\x89\x4c\x44\x43\x29\x87\x29\x7d\x35\x1f\x72\x8d\x9f\x68\x5c\x26\x15\x05\xda\xc7\x06\xad\x31\x97\x11\xb1\xfb\xfb\x98\x99\x07\x39\x75\x78\xf0\x77\x68\x96\xcd\xe1\x96\x6d\xd9\x14\x89\x9c\x7a\x4f\xb7\xac\xdf\xf7\x7c\xcb\x4a\x04\x72\x45\x83\x27\xd1\x56\xcf\x4c\xd7\xab\xf2\x5c\x47\xc1\x8c\x67\x98\x59\x3c\x6c\x0b\x4b\x47\x66\x1b\x3e\x40\x16\x92\xc1\xbb\xb6\x8f\x68\x79\x50\x25\xe8\x95\x08\x14\xe6\xa0\xba\x3a\x0a\x73\x50\x8e\xe5\x5e\x1b\x12\x8e\x8c\xab\x1a\x05\x1f\x28\xa3\xae\x52\x3a\xe5\xe1\x46\xb8\xb1\x2f\xfa\xe8\xe5\x1b\x47\x7a\xe8\xbd\x98\x4e\xdd\xab\x9f\xaf\x8f\x9e\x3f\x55\xa4\xc5\xab\xee\x3d\xfa\x3a\xca\x8b\x7f\x0d\xe1\xf3\x50\x45\x68\x93\x8d\x22\x88\x88\x31\x15\xf4\x88\xf0\x79\x43\xf5\xac\xd8\x02\xf5\x0a\xea\x74\x1b\x0c\x25\x7f\xdb\xc5\x6c\x54\x5e\xb8\xb7\x5a\xe5\x16\x74\xcd\x45\x52\xe9\x0a\x55\xc3\x2d\xe9\x9a\x87\x82\xd7\xec\x38\x25\x6a\x3e\x4e\x98\x00\xca\xff\x84\xb5\x8b\x04\x80\xdb\xae\xe1\x9a\xdd\x8e\x24\x8f\xef\x69\xa2\x35\x7a\xa0\x7c\x00\x59\xfb\x53\x12\x4e\xeb\x03\xa4\x84\xd3\x3d\x6d\x36\xda\xa1\xbf\x48\xf3\xfc\x4c\xc9\xa7\xb5\x72\x59\x9b\x58\x2b\x0e\x6b\xd7\xd3\xbd\xc8\xb6\x48\x70\xec\x65\x3e\x9e\x5f\xac\xd2\xfd\xbf\x4a\x13\x98\x0c\x6d\x75\x8d\xb2\xf5\x18\xc9\x8d\x4e\x71\xea\xb6\x5c\xce\xe2\xa4\x9b\x2f\x76\xe3\x18\xb7\x2e\x60\xdf\xa8\x95\x1e\x8f\xaa\xd9\x93\x5f\x78\x7b\xb1\x98\xcc\x57\xfb\x76\x6f\x1f\x45\xb7\x32\xba\xf4\x62\x32\x9d\xa6\x0f\xaf\xbe\xad\x71\x00\x54\x1c\xe2\xa6\x5a\x73\xb0\x53\x3f\x00\x68\x9f\xc1\x30\xa2\xe7\xda\x50\x54\xb1\xfc\x93\xac\xec\xa2\xed\xd2\xd2\xc6\x65\x5c\xc4\xdd\x87\x19\xc5\x3c\xdd\xb8\x14\xf2\xbb\x30\x0b\xa7\x61\x91\x6e\xce\xf4\x1e\xf7\x51\x11\x17\xba\x3d\x02\xcf\x58\x2a\x95\xd3\x68\xb3\xf0\xc5\xe4\xbb\xb8\x3c\x79\xf4\xfa\x72\x71\xb9\x73\x0b\xc5\xe8\xbd\xf3\x23\x69\x25\x0e\xb7\xeb\xde\x26\x04\x96\x3e\xd4\xfc\x74\xb1\xeb\xae\x8f\x09\x2f\x52\x2f\xf7\x8b\xcb\x8b\xe9\xfc\xed\xae\x5b\xfc\x63\x6a\xe3\x1b\xfd\x90\xb6\xf3\xd1\xe9\xdb\x8b\xd5\x8d\x11\x34\xd3\xdc\x86\x03\x21\x59\x7d\x47\x1b\xfa\xa3\x69\x1d\x96\xd7\x6c\x6c\x36\xb4\x35\x23\xfb\xb7\xe7\x61\xb2\x37\xfc\x94\xf0\xd0\x24\xf6\xab\xb3\xc9\xfc\x22\x19\xc9\xa2\xe2\x17\xff\xd4\x84\x9f\xb0\xbb\x08\xa2\x49\x1b\xf6\x4f\x20\xea\xff\x1e\x34\x7c\x3f\x92\x00\x6d\xdb\x55\x5f\xc6\xf9\xe2\x34\x0d\x6d\x7d\x18\x83\xab\x96\x36\x5d\x8b\xd5\xb8\x06\xc8\x9e\xfc\xfc\x34\x9c\xce\xa7\x93\x74\xc9\xbf\x8e\x42\x71\x27\xc0\xfd\xe3\x29\x0d\x92\x01\xfb\xe5\x7c\x75\x76\x65\x7c\x9b\xbf\x24\x21\xee\x51\x91\xf9\x97\x8b\x30\x5b\x9d\xed\xdd\xe3\xff\x84\x74\x44\x9a\xd9\xd8\x47\x47\xa4\x5f\xb4\xc7\xd7\xf1\x11\x71\xec\x73\x21\x4d\x02\xd9\xf5\x6e\xf4\x50\x31\xbe\x4e\x5e\xbc\x83\xde\x80\x56\x7b\x6a\xed\xe6\xf5\x82\x03\xee\x83\x65\x07\xb4\xd2\x53\x29\xee\xd9\x71\x49\x4b\xd7\x48\x0b\xc2\xa6\xd5\xf9\xd6\x52\xee\xd5\x16\xfa\x0d\xd8\x15\xad\x93\xeb\xfe\x3d\xe8\x4e\x47\xdc\xa6\x7b\xe8\x4c\xdb\x91\xc0\xdd\x3e\x3a\xd3\x38\x40\x1e\x42\x7d\x8d\x54\x7e\xef\xae\x2b\x5d\x4f\x30\xe9\x3e\x68\x23\x2e\x93\x86\x57\xbf\xbc\xfc\x5b\x58\x84\x55\xf2\x4a\xfe\x29\x59\xea\x09\xc7\xec\x67\xa9\xd7\x0f\xed\x35\x34\xf5\x1a\x2b\x55\x21\xc5\x0d\x67\x7d\x97\x3e\xc6\xec\x6f\x61\x1a\x4e\xbe\x9c\xcf\xda\xbd\xc1\xd3\x1f\x41\x70\x54\x26\x49\xc7\x50\x8d\xda\x6e\x71\x7e\xf9\xfa\x2c\x6d\xbb\x7f\x13\x41\x82\xe6\x3d\xb2\x04\xfa\x45\x7b\xa3\x2e\x81\x7a\x57\xc1\x17\xdb\xc7\xf9\x2a\x59\xc7\x6f\xa9\x7c\x95\x19\x93\x5f\xc7\xdd\xda\xd3\xb5\xd6\x37\xd1\xa8\x5e\x47\x7d\xb9\x93\x2a\xd0\x1d\xff\x96\xc6\xe8\x2f\x3f\x0d\x09\xd4\x7f\x40\x42\x93\xaf\xc2\xec\xf4\x32\x89\x77\x6b\xac\x4f\x94\xdd\x16\xb2\x90\xcc\x5c\x25\xc4\x1d\x8b\x8d\x0d\xca\x62\x71\x97\xe7\xf5\x96\xf4\xa6\x5a\x28\xf9\xd1\x84\x9f\xe9\xb3\x4c\xba\xc9\xc9\x8b\xf9\xd9\x64\x76\xfa\x76\xf7\xfd\x99\x8d\xfd\xcf\x24\xca\x9e\x55\xe3\x06\xb9\x9c\xcd\xe7\x49\xca\x60\x20\x42\x77\xa9\xd1\x6a\xb1\x3f\xc7\x76\x2d\x77\x65\xa3\x8a\xa0\xcd\xa8\x92\xe3\xab\x58\x2f\xe2\xf7\x49\xde\x4f\xa1\xdb\x37\x09\xd9\xb8\x84\xdb\xf5\x63\xe9\x5c\x5d\xb2\x30\x7e\x35\x59\x84\xd3\x30\x0b\x9b\x9b\xb8\x8e\x3b\x79\x67\x4b\xd2\xef\x10\x34\x3e\xb3\xc3\xf5\x35\x04\x6b\xf4\x9d\xb2\xfd\xad\x27\xe7\x17\x71\x31\x09\xd3\x93\x47\x8b\xb0\xc7\xe3\xd7\x06\x74\x7d\xb8\x42\x53\x55\xca\x61\x38\x02\x12\x3c\x99\x9d\xc5\xc5\x64\x15\xdb\xc4\x9b\xd0\x5d\x62\xa6\xc4\x0a\xc4\xee\x1d\xde\x42\xa1\x8b\x1d\xb5\x89\xa6\xf0\xba\x89\x54\x09\x1b\xa0\xae\x41\x33\x3a\xca\xe8\xae\xf0\x15\x01\x92\x26\x0d\xc0\x11\x01\x75\x26\x0d\x61\x02\x81\xde\x52\x80\x9d\x09\x7d\x2b\x0d\xe0\xca\x86\xea\x63\xf5\xb3\xa5\xd5\x0f\x74\xb7\x28\x8f\xb5\x31\xd0\x8c\x03\x5b\x54\x37\xd7\x9a\x8e\xb8\xb2\xea\xf4\x19\xdb\xd2\xc6\xac\x8b\x55\xb8\xc2\xc6\x63\xf5\x83\xdd\x1f\x3f\xed\x5a\x8d\x24\x0d\x4c\x9d\x2c\x3c\x75\xca\xc6\xa3\xe9\xee\x01\x5c\xa2\x3b\xd6\xd2\x2a\x60\x46\x3f\x10\xdb\xe9\xc9\x0f\x43\x9b\x06\x53\x86\x19\x13\xc7\x5d\xb0\x6c\x16\x93\x8b\xd5\x64\x3e\x0b\xd3\x93\xe7\xe1\x6c\x1a\xbe\xdb\x7d\xab\x6a\xca\x79\x44\x78\xaa\x51\xa1\xce\xdf\x74\xa9\xc5\xea\xec\x6a\x5a\x48\xaf\x35\x62\x52\xcd\xf5\x5a\xa3\x91\xf1\xdf\xc3\x77\x61\x94\x1e\xdc\x30\x4d\xaf\xfd\x86\x50\x29\x0b\x77\xd5\x12\x4b\x67\x9f\x53\xb5\xc9\x54\xf8\x7d\x98\xac\xce\xf6\x27\x31\xc7\x8c\x99\xed\x5f\xd3\x93\x66\xb3\xd0\x6e\xa7\xcf\x56\x43\xe5\xe3\x65\x53\xf0\x82\x6e\x92\x4d\x69\x6f\x21\x9b\xa2\x1e\x51\x03\x07\xc6\x46\x43\x25\xbd\xef\x55\x78\x3d\x9e\xf7\x63\x66\xf4\x36\x61\x46\x4f\x29\xcf\x6d\xab\xcb\x3d\xd2\xca\x3a\xf1\xb2\x2c\xf7\x09\x71\x73\xc1\x6a\xed\x35\x8f\x50\xb5\xfb\x17\x0e\x85\x6d\x0d\x84\x80\xa3\x06\x7d\x1b\xce\x4e\xbe\x9e\x24\x9d\xa8\xd9\x91\x8a\xca\xdc\x2a\x8d\x30\xfd\xfe\x2c\x2c\xe6\xcb\xb3\xab\xbd\x66\xf7\xa1\x54\x8e\x3f\x94\xfb\x57\xb3\xe6\xbd\x6c\xa2\xf2\x63\x6e\x62\xbe\x1a\x06\x4d\xc3\x1e\xbf\x3f\x9b\xac\xc2\xec\xe4\xe5\x79\x98\x4e\x4f\x5e\x32\xa8\x77\xdd\x14\x5e\xd5\x4e\x13\x12\x23\x48\xc6\xf0\x56\xdf\x65\x59\x1c\x5d\xfe\x3c\x2e\x92\xd7\x52\xaf\xaf\x01\x99\x82\x57\x32\x00\x0f\x6b\x82\xea\x23\x8b\x67\x1d\x52\x2a\x75\xa9\xba\x51\xab\xcd\xff\x76\x05\x41\x30\xda\x01\x8c\xa9\x75\xe3\xe8\x2e\x2e\xdb\xf0\x7d\xb8\xe2\x43\xeb\xe9\x03\x73\x6e\x48\xc3\xd9\xe9\xdb\xf5\xeb\x90\x20\x0c\x7e\x84\x7e\xcd\xb5\x92\x35\xe5\x61\xa2\x5c\xa3\xdf\x53\x97\xb6\x95\xb1\x49\x6f\x66\x35\x99\xed\x53\xd7\xbb\x49\x59\x4f\x99\x8c\x12\xf6\xa2\x0d\xbf\x0a\x6c\x27\x2d\x19\x51\x69\x29\x98\x68\x41\x84\x0b\x7b\x0a\x69\x0b\x7d\x23\x40\x0f\xa2\xc2\xa6\xd2\x6a\x25\x81\x5e\x20\xea\xbb\xe2\x5a\xc6\x06\x0b\x63\x83\x25\x87\x9a\xd9\xfd\x62\x11\x83\x0a\x84\x1f\xc9\x01\x68\x65\xf7\x7b\xe4\x00\x48\xbb\x5e\x53\x56\xed\x38\x16\x1b\x16\xfb\x71\x59\xf5\x35\x54\xee\x49\x43\xc7\x8b\xe6\x6c\xbb\xd2\x6c\xf5\x4d\xc8\x58\xab\xf2\x4f\x03\x81\xcb\x56\xec\x24\x39\x7b\x72\x5e\x5f\x6e\x4f\xbe\x85\x16\x4c\xbd\x95\x79\x86\x7d\x5a\xaa\xf1\xf5\x66\x31\x2c\x4e\x1e\xed\x8b\x4f\xde\x8a\x03\xfd\xca\xa5\x7e\xfb\x6f\x48\x3a\x3f\xfa\xf5\xe5\xb6\x5d\xb6\x1a\x13\xdd\xee\xf6\x56\x21\x15\xc9\x79\x6f\x9b\xeb\x20\x2b\x1b\x82\xf3\xf4\x67\xde\xb6\xd7\xbc\x91\xc7\x14\xec\xa3\x6c\xc3\x37\xe1\x2c\xfc\x2d\xcc\xf6\x2e\x13\x1b\x16\xf0\x62\x74\xc2\xeb\xb0\x0c\x8b\x7d\x5b\xf3\x4d\x16\xb5\x1c\xd9\x4f\xc3\xdb\x30\x4d\x00\x2d\xb7\x50\x07\xbb\x41\x10\xac\x4b\xa4\xc0\x54\xfd\x4b\x77\xc0\x6d\x2a\xca\xf9\x4d\x98\xb5\x21\x4d\xa1\x6c\x14\x19\x6b\x8e\x71\x64\x3a\x69\xce\x42\xdc\xdf\x72\x1b\x32\x53\x5e\x47\x51\x01\x82\xdd\xb8\x3d\x16\xcd\x59\xdc\x3d\x59\x71\x5e\x7d\xec\xff\x26\x26\xe8\xd1\x95\x96\x61\x11\xce\x6f\x08\x7d\xfc\x58\xca\x68\x7f\x5d\xf2\xe3\x9b\xd8\xc6\x2e\x4c\xda\xc5\x64\xb6\x6f\xc7\x3e\xe4\x51\xab\x30\x3a\x27\xae\xe2\xe4\xe4\x9b\xf0\x36\x89\x17\x6e\xb4\x3a\x20\x82\x50\x8c\x5f\xa8\x23\xf8\xa2\x4e\x3f\x74\x55\x7a\x8d\x59\x1b\x4f\x7e\x3f\x79\x1d\x5e\x5f\x4e\xf6\x41\x97\x47\xb4\xb1\x4d\xa3\xbb\x8c\x76\xd4\x6a\x71\x31\x9f\xac\x26\xcd\xc9\xe3\xcb\xc5\x72\xf2\x5d\xdc\x3b\xfe\x07\xa4\xb9\xaa\x0e\x68\xf2\xa8\xe7\xab\x57\xca\x81\xd1\x6e\x6f\x73\xc9\xeb\xf3\x2e\x7a\xd9\x3e\x33\x38\x4a\xda\x7c\x33\x59\xbf\x3a\xf7\x44\x3d\x6e\xc1\xfa\x9c\x5e\x66\x7e\x65\x0c\xe4\xa3\xd8\x9f\x4b\xdd\x9b\x51\x5f\xce\x67\xa7\x00\xaf\xb7\x4b\x71\x49\xa9\x64\x09\xa5\x18\x1b\x0f\x29\x81\x50\x2b\xff\xa8\x94\xca\xba\x54\x42\x15\x76\x8d\xd2\xd7\xde\x7b\x19\xf2\xca\xe9\x2a\xf4\xcd\x62\xf7\xf1\xc3\xa8\xda\x21\xa6\x27\x02\xbb\x2d\xf4\x4f\xa3\xa7\xbf\x9c\xae\xae\x59\x94\x3e\x4e\x2f\x60\xd4\x40\x6f\xc3\xec\x3c\x24\x2e\xda\x20\x73\x57\xa5\x9a\x36\x2a\x63\x33\x88\xd5\x24\x6b\xcb\xd3\x50\x87\xd5\x75\xeb\xc5\x58\x1f\x23\xe8\x78\x0d\xe9\xa3\x3d\x0d\xb3\x76\x32\x64\x4f\xf7\x64\x3b\xdf\x4b\x73\x1f\xd3\x68\xfd\xd3\xf8\xfd\xc9\xab\x30\x39\xf9\xfa\x32\xc1\xf8\x5d\x2f\xa2\xa6\x3b\x2b\xa9\x28\x62\x64\x67\x25\xa3\x9d\xd5\xd3\xf8\xfd\xde\x9e\xde\xe0\x5d\x6a\x7d\xd3\xf1\xa1\x48\xb1\xd1\x4f\x5f\x27\x0e\xa3\x57\x8f\x4f\x65\x72\xbd\x56\x96\xfb\xd4\xb3\x7d\x7a\xb9\x3c\xbb\xdc\xeb\x74\x4b\xc2\x50\x9e\x50\x8f\x27\xa7\xbe\x9d\x84\xd7\x71\x76\x7a\xf2\xfc\x32\x34\x67\x97\xf1\xe4\xab\xf3\xf9\xec\x74\x5f\x56\x68\x87\xa8\xba\x7f\x05\xb6\x29\x16\x86\xc5\xd3\x29\x3c\x26\xed\xa4\x67\xa7\x29\x02\x53\x0a\x6d\xd0\xa2\x4a\x82\x58\xcf\xa6\x27\x8f\xcf\x26\xaf\x27\x89\xb7\xa4\x69\x85\x26\x1d\x2c\xcf\xa6\xed\xc9\x57\x97\xb3\xd3\x7d\xe0\xd3\x9d\x8a\xa1\xe3\x1d\xe5\x90\xa6\x0b\x57\x03\x51\xeb\xeb\x3d\x59\x85\xe9\x35\x59\xaa\x81\xa3\x9e\x54\x4f\x2f\x5f\x63\x77\xcf\x7f\x3a\x5f\xac\xce\x4e\xa8\xb0\xb8\xe6\xa5\x37\x78\x17\xbb\x67\x3e\x8f\x8b\xf3\x6b\x7e\x79\x23\x8f\x73\xf5\x94\xe5\x35\x4e\xcc\x5e\xe1\x9c\xd1\x56\x6a\x7d\x81\x97\xf3\xd3\x3d\x6e\x4d\x36\x7a\x5c\x7f\xe5\x9c\xcb\xf7\x3c\xe1\x96\xe6\x67\x7c\xe6\xab\xcb\xc5\xeb\xfd\x19\xee\xad\xde\x4b\x7a\xca\x62\xf2\x36\x09\x29\xfc\x84\xba\xbb\xec\x8a\xf6\xea\xee\xea\x17\x2a\xb0\xab\xa7\xbc\x47\x79\x57\xfd\xa5\xda\x27\xc5\x08\xcf\x96\xe1\x74\xf7\xcd\xa9\xf8\x8f\xfd\xfa\x44\x69\x13\x2c\xcf\xc3\xec\x4a\x10\x57\x46\x8b\x21\x9e\xf1\x00\xf9\x4a\x97\xe2\xe7\xe1\x2c\x7c\x7f\xb6\x6f\x0a\xeb\x5b\x63\xf3\xd2\xcc\x93\x31\x06\x40\x4a\x41\x8e\x6d\x47\xcd\xc8\x75\x0a\x0c\xe9\x0f\x4d\xcf\xdf\x2e\xe2\x6c\xaf\x7b\xb0\x51\x38\x1a\x9f\x71\x79\xf2\x78\x32\x3b\xf9\x2a\xec\x45\xa5\x24\x42\x21\xc9\x39\x67\xe1\x74\x79\xf2\x7c\x3b\x22\xb6\x42\x6d\x3e\xb5\x9a\xc7\xd9\x64\x8f\x6b\x6f\xd3\x55\x8b\xf5\xb0\x95\xd1\x2d\x2d\xc3\x74\x15\x17\x37\xc6\xf1\x36\x5a\x45\x0a\x71\xd2\x0f\x24\x7b\xd5\xe5\xec\x46\x2f\xa3\x17\xf1\x6f\x61\xdd\xf2\x9b\x08\xce\x20\x05\x97\x71\x4c\x16\xb2\x17\x97\xb3\x14\xc8\x71\x8d\x52\xe9\xd6\xfe\x65\x38\x0f\x8b\xc9\x2a\x2d\x96\x19\xf4\xd2\xe1\x4c\x55\xbc\xac\x29\xb3\x98\x9e\x73\xb9\x08\xcb\xb3\xd5\x22\x6d\xc0\x41\xdc\x0e\x59\x3b\x90\x88\xa1\x6c\x13\x17\xf2\xe5\x59\x58\x10\xd7\xdb\xb3\x7f\xe9\xfd\xb3\x36\x7d\xe4\x97\x67\xe1\xbb\x6b\xd0\xfc\xc3\x4e\x6e\x34\x0e\x5e\x4e\xda\xf6\x6c\xb7\xae\x4e\xdf\x8a\x7b\x05\x78\xda\x76\x74\xf2\xe9\xec\x8f\x8b\xc9\x6a\x72\xe5\x0d\x95\x42\x8b\x60\x13\x6d\x35\x37\xd7\xc2\x17\xba\xad\x52\x1a\xdf\xca\xec\x2c\x4c\x93\xf5\xe6\x93\x69\x1d\x87\xdb\x28\x1e\x6b\xa0\x12\x9e\x2d\xd3\x76\xba\x51\xeb\xdc\xde\x86\x57\xa4\x6f\xdb\xa5\xae\xca\x4d\x0b\x79\x36\xcc\xec\x91\xfd\x22\x9c\xbc\x9c\x9f\x5f\xc4\xdd\xc6\xeb\x63\xbd\xa9\x94\x55\xd3\xf5\x6f\xce\xf1\x15\xde\xce\xcf\xeb\xf9\xde\xe9\xdb\x7b\xce\xc1\xa6\xf6\x97\xb3\x36\xec\x94\x55\xf5\xaa\xb0\x2a\xd0\xaa\x89\x83\xa6\x49\x26\xf3\xcb\xb7\xd3\xf9\x6a\x72\xf2\x34\x9c\x26\x68\xb8\xa0\x43\x3d\x94\xb6\x49\x2d\x17\x93\x90\x6c\x49\x15\x4b\x6e\x3c\x14\xc5\xde\xd0\xf8\x54\x73\x1b\xef\xd4\x63\x62\xaf\x5b\x2a\xad\x70\x59\x24\x71\x9a\x57\xe1\x34\x4c\xe7\xa7\x49\x90\x51\x3d\xd8\x1d\x79\x60\x37\x3a\xa3\x0e\xb3\xef\x93\xd8\xce\x2d\xd4\x81\xd3\xd3\x27\x27\x5f\xa7\x1e\xe6\x7e\x01\xdf\xf1\x09\xaf\x46\x3e\xd4\x8e\x64\xaf\x7e\x00\x45\x15\x40\xe0\x4b\x80\x59\x37\x28\x86\x28\x54\x7c\xd0\x55\x26\x84\x76\x7c\xe5\x6f\x27\x71\x95\x6c\x39\x75\x89\xd8\x11\x8e\xec\xd2\x53\x5e\x5f\x71\xb6\xf3\xd4\xd1\x41\xfb\x6a\x83\x6b\x4d\x87\xd0\xab\x70\x3e\x99\x26\x2f\xf8\x9f\xad\x5e\x7d\xbb\xa3\x57\x5f\xeb\x6c\xad\xbb\xdd\x95\x91\x48\x42\xd7\xf4\xe1\x6c\x39\xde\x25\xad\x7b\x15\x66\xa7\x97\xfb\x03\xe2\x46\xf3\xf5\x1b\x1d\xa7\xbd\xb9\xf7\x6b\x54\x89\x52\x68\x6c\x1c\x47\xd1\x13\x79\xa2\xe4\x36\xe2\xf4\xf2\xf4\x32\xc9\xd6\xe8\x6c\xf9\xd4\x92\xfb\xed\xed\x25\xf7\xd5\x6d\xa2\x24\xce\x34\x9e\xf8\xf6\xc8\xd5\x7f\x75\x16\xd2\x34\x8d\xd1\xc0\xbf\xf1\xb5\x8c\x6c\x12\x90\xc9\x5e\xdd\xf8\xbc\x4e\xcc\x27\x75\x1c\xbd\x42\xd5\x1f\xba\x49\xd1\xfd\x8a\x88\xbb\xe9\x74\xf0\xa0\xc1\x6c\x14\xcb\x6f\x3a\x16\xf9\x8e\x88\x7b\xd7\xa6\x2b\xcb\xa4\x5b\x6f\x4e\xcf\xb6\xf8\x91\x7d\x82\xc3\x14\x25\x8d\x02\x6e\xaf\x26\x8b\xb3\xcb\xd5\xfe\xbd\xe3\x90\x93\xf3\xc9\xa2\xdd\xa6\x93\xec\x0f\xeb\xed\xd1\xea\x9a\x8d\xc5\x48\x6a\x73\xb4\x23\xf9\x36\x69\xcb\x8d\x58\xaf\x4d\x9a\xef\x8f\x61\xd6\x9c\xcd\xf7\x6d\x0d\x37\xde\x5b\xd5\x0f\xc7\xf4\xa4\x45\x98\x9d\x9e\x3c\x9e\xac\xf6\xee\xcf\x07\x37\xb6\xdf\xa2\xa5\x67\xfe\x29\xfe\x7d\x72\x25\x68\x93\xa5\xeb\xcc\xa8\xcc\x18\x34\xff\x46\xf8\x31\xbd\x4e\xf2\x58\x63\x75\xe2\x4a\x3f\x34\x09\xd6\xe7\xcf\x61\x16\xea\xf0\xf7\xb0\x38\x79\xf9\xff\x5e\x86\xc5\xae\x7f\x5b\x8c\x62\x46\xeb\x7d\xd2\x5f\xdf\xdd\xf7\x4e\x0a\x9f\x90\x09\xdc\x8f\xf7\x17\xf7\x7e\xb8\x73\xb9\x8c\x07\xcb\xd5\x62\xd2\xac\xee\xfc\x7a\xf1\xa0\xbd\x1b\xef\xff\xb0\xda\x5a\xdd\xfb\x61\x11\x57\x97\x8b\xd9\x41\x78\xf7\xee\xde\xaf\xbf\x0b\x8b\x83\xc9\xc3\xc5\x5d\x5f\xf9\x22\xbf\x77\x7f\xf6\x70\x71\x57\x4c\x91\x55\xf7\x7e\x3d\x8d\xab\x83\xf0\xf0\xee\xdd\x7b\x0f\x7f\xf3\x43\x33\x0d\xcb\xe5\xc1\xea\x87\x66\x3e\x5b\xae\x16\x97\xcd\x6a\xbe\xb8\x7b\xef\x87\xd5\xd9\x64\xf9\x60\xb2\x7c\x34\x9d\x7c\x17\x1f\xfe\x8b\xb9\xcf\xe7\xcb\xd9\xf2\xb2\x5e\x36\x8b\x49\x1d\x1f\xce\xe2\xf7\x07\x93\x07\x6f\xfe\xc7\xbb\xd9\xe9\xb3\xd9\x17\x71\xb9\x5a\xcc\xdf\x5e\x39\x4f\xae\x9c\xf7\x60\x16\xdf\xac\xee\xde\xbb\xfa\xf7\x66\x7e\x7e\x31\x8d\xab\x78\xf7\xde\xbb\x77\xfd\x43\xac\x1e\x1c\x5f\x1a\xeb\xf3\x2e\x34\x0f\x37\x8f\x18\x37\xcf\x38\x8b\xdf\xdf\x8d\xff\xf8\xc7\xea\xde\xbb\xfb\x83\xe5\xc5\x62\xfe\xdd\xc3\xd9\x83\x3f\xfd\xdd\xdf\xfd\x61\x35\x7f\x1d\x67\x9f\xaf\xee\x77\x61\xfd\x48\x6f\x3f\x4f\xae\xf6\xee\xde\xfd\xd5\xbb\x7b\x77\xef\xbd\xbb\xef\xcd\x6d\x5b\xf9\xf9\xe9\x9e\x66\x9e\xbc\xbb\xff\xe6\xbf\xef\xf9\xfb\xec\xdd\xfd\x3f\x2e\xf7\x76\xcb\xfd\x95\xec\xf9\xfb\x74\xdb\x5d\xda\x29\xfa\xf7\xbb\xab\x87\x93\x7f\xfc\xe3\xee\xe4\xe1\x0f\xef\xee\xdd\x7b\xf0\xea\xf7\x5f\x3e\xbc\xb3\x7a\x7d\x7a\xe7\xfe\xea\xc1\xab\xc7\x47\x0f\xef\xac\x9a\x78\xe7\xfe\x84\xf3\x78\x9c\x5f\xd3\x85\x07\xb3\x87\x3f\xc4\x76\xb2\xfe\x81\xcf\x27\xeb\x93\xee\x37\xd3\xcb\xe5\x2a\x2e\x5e\xbd\xbd\x88\x5f\x44\x05\x08\xcc\x17\x9f\xdf\x39\x0f\xb3\x70\x1a\xcf\x23\x3c\xad\x0b\x22\x5e\xa7\x9f\xff\xb0\x9a\xac\xa6\xfa\x86\xf9\xfb\xe5\xc1\xef\x2f\xeb\xb8\x98\xc5\x55\x5c\x1e\x7c\xb9\x98\xb4\x77\xee\x4f\xd5\xec\x79\x38\x8d\x9f\xff\x30\x9d\x9f\xce\x1f\xaf\x47\xcf\xe7\x77\x56\x6b\xf3\xc3\xf5\x1f\xee\xdc\xef\xaf\xf0\xc7\x38\x6d\xe6\xe7\xf1\x60\x35\x3f\x58\x9d\xc5\x83\x6f\xbf\xf9\x3e\x2c\xe2\xc1\xde\xeb\x1e\x3c\x99\x2d\x57\x61\x3a\x8d\x8b\x3b\xf7\x27\xb3\xd5\x62\xfe\xf9\x9d\x1b\xcd\xdb\xb8\x1e\x5e\x8b\x25\x17\x5e\xc6\xc5\x77\x93\x26\xae\x3f\x84\xd5\xc1\x93\x57\x07\xab\x18\xce\x97\x07\xb3\x18\xdb\xf5\x6f\xc7\xae\x8b\xcd\x6a\xf2\x5d\x9c\xbe\x3d\x58\x5e\x5e\x5c\xcc\x17\xab\x83\x36\x7e\x17\xa7\xf3\x8b\xf5\xa3\xf7\xd6\x9c\xdb\xff\xf9\x20\xcc\xda\x83\x66\x3e\xeb\x26\xa7\x97\x8b\x98\xfc\xf8\x61\x1d\x96\xb1\x3d\x08\x17\x17\xd3\x49\x13\xd6\x0d\xbc\x3c\x98\xcc\x0e\xc2\x81\x8e\xdd\x37\x07\xdf\xcf\x17\xd3\xf6\xc1\xc1\x93\xd5\x41\x1d\xa6\x61\xa6\x37\x15\xb9\x95\xe5\xc1\xbc\xdb\xf7\xbb\xf3\x83\xd0\x34\x71\xb9\x3c\x58\xc4\xe5\xfc\x72\xb1\x3e\x65\xfd\xf3\xc3\x43\xdd\x3f\xf8\x7e\xb2\x3a\x1b\x5f\xa5\x89\xb3\xf5\xe2\x31\xf9\x7b\x6c\xd7\x8f\x3b\x5f\x9c\x86\xd9\xe4\xef\xfd\xfd\xac\xe6\x07\xe7\x61\x32\x5b\x85\xf5\x8d\xe9\x73\xac\x16\xf3\x29\x57\x48\x7f\x3e\xce\xbe\x9b\x2c\xe6\xb3\xf5\xbf\x97\x0f\xfe\xb5\x5e\xfc\x66\xfd\xff\xab\xf9\x41\x1d\x4f\x27\xb3\x83\xcb\xe5\x64\x76\xba\xbf\xf1\xef\x1f\xbc\x9d\x5f\x1e\x74\x93\xc5\x72\xdd\x60\x17\xd3\xf9\xdb\x83\x70\xb0\x1d\x4a\x07\xfd\x60\x5b\xdf\xc8\xdb\xf9\xe5\xe2\xa0\x39\x9b\x2f\xe3\xec\x60\x32\xeb\x16\x41\xd7\x97\xcb\x45\x7c\x70\xf0\xea\x2c\xee\x3b\x6b\x3d\x81\x27\x6d\xdf\x6e\xeb\xe7\x7c\x7b\x70\x31\x9f\xcc\x56\x07\xdd\x7c\x71\xcd\x60\x98\xcc\x56\xf1\x74\xc1\xe3\x6b\x63\xf1\xb3\x17\xd3\xb0\xea\xe6\x8b\xf3\xfb\xb4\x42\x98\x4e\xe7\xdf\x2f\xb9\xf3\xd5\x7c\xb8\xed\xf3\xcb\xe9\x6a\x72\x31\x8d\xeb\x6e\x7b\x3d\x9d\x87\x76\xb8\x8b\x6d\x83\x3c\x5f\xcc\xdb\xcb\x66\x75\xd0\xce\x9b\xcb\xf5\x7d\xea\xaf\x34\x61\x76\x50\xc7\x83\x6e\x7e\x39\x6b\x0f\xfe\x35\x1c\x9c\x2d\x62\xf7\xf0\x57\x67\xab\xd5\xc5\xf2\xf3\xcf\x3e\x6b\xe7\xcd\xf2\xc1\x77\xe7\xeb\xe1\xbb\x5e\xd4\x3e\x8b\xb3\xcf\x74\x30\x1f\x72\xff\x87\xc9\x78\x5a\xdf\xff\x67\x93\x59\x1b\xdf\x3c\x38\x5b\x9d\x4f\x7f\x75\xb0\x0a\x8b\xd3\xb8\x7a\xf8\xab\x93\x7a\x1a\x66\xaf\x7f\xf5\x9b\xb3\xb8\x88\xff\xfa\x59\xf8\xcd\x83\x3b\xef\xde\xbd\xbb\x1f\x46\x13\xfb\xf1\xd1\x8f\x98\xd8\x8f\xe7\xe7\xe7\x97\xb3\xc9\xea\xed\xc1\x91\x5e\xf1\x86\xa9\xdd\xc4\x1b\x27\xf6\x35\x17\xdc\x33\xa7\xaf\xb3\xbc\xfb\xea\xf1\xd1\xbd\x83\xc9\xb2\x5f\x23\x7e\xb5\x3c\x78\x76\x11\x67\x07\x2f\x99\x0f\x69\x7f\xb7\x93\xf5\xa2\x5c\x5f\xae\xcf\xd2\x21\x34\x19\x7e\xe4\xe0\xfb\xc9\x74\xba\x1d\x90\xab\x78\x7e\x31\x5f\x84\xc5\xdb\xcd\xc8\x9a\xcf\x74\x60\x4c\xe7\x4d\x98\x1e\x9c\x87\xe6\x6c\x32\xe3\x19\xea\xf9\x7c\xb5\x7e\x1b\x5f\xec\x1f\xc7\xc3\x79\x6d\x5c\x4e\x16\xeb\x25\x85\x2e\x5a\xff\xfa\x64\xb9\xcf\x7e\x3d\x38\x56\x67\x91\x11\x72\xb9\xd4\x35\x68\xb8\xad\x59\xdb\x9f\xb1\x7f\xc8\x7d\xf6\x1b\x0e\xbf\x9b\x2f\x0e\xce\xe7\x8b\xf5\x7c\x5d\x85\xc9\x74\x79\xb0\x8c\x91\x96\x1e\x0d\xb5\xcf\x3f\xfb\x8c\x45\xb7\x19\x9a\xb3\x1f\x1a\x0f\x26\x73\x86\xe0\xd5\xc1\x74\x1a\x57\xab\xf5\xb4\x5e\xae\xc2\x62\x15\xdb\x83\xd3\xcb\x49\x9b\x8c\xae\xe9\xc3\x1f\xae\x19\x4f\xcb\x55\x98\xb5\x61\x3a\x9f\xc5\x74\x3c\x8d\xc6\xcb\x3f\x4d\x0f\x6f\x9f\xe5\xbd\x3d\xfc\xef\xdd\x23\xef\xee\x17\xde\x64\xe6\x56\xde\xc9\xff\xd8\xeb\x9c\xbc\x1b\x5c\x82\xc9\xc3\x1f\xbe\x7e\xf4\xf4\x8b\x27\x4f\xbf\xfc\xfc\xce\x67\x97\x93\x3b\xf7\xbf\x7d\xf9\xfc\xab\xa3\x17\x47\x27\x7f\x7c\xf2\xea\xab\x93\xdf\xff\xe1\xb7\x47\x2f\x9e\x1e\xbd\x3a\x7a\xc9\xb7\x9f\x7d\xb7\xbc\x58\x2f\x3c\x87\xeb\xd5\xf4\xf0\xf5\xa6\x73\xee\xdc\x7f\xf2\xf4\xf1\xb3\x6f\x9e\x3f\x7a\xf5\xe4\xb7\x5f\x1f\xa9\xe9\x64\xb6\x7e\xf7\x85\xd5\xa4\x9e\xc6\x3b\xf7\xff\xf8\xe4\xcf\x8f\x5e\x7c\x71\xf2\xcd\x97\xdf\xbc\x3a\x79\xfc\xf5\x1f\x5e\xbe\x3a\x7a\xa1\x66\xdf\x4f\xfe\x1e\x16\xed\x9d\xfb\x8f\xfe\xf8\xf2\x44\x8d\xf4\xef\xe1\xfb\xe5\xf6\xbb\x3f\xff\x81\x1b\x4a\xbe\xfd\xfb\xe5\x22\x6e\xbe\xff\xe2\xd9\xe3\xdf\x1f\xbd\x18\x19\xb4\xf3\xe6\x75\x5c\x6c\x2c\xfa\x9f\x7f\xfe\xe2\xd9\x97\x2f\x8e\x5e\xf6\x0f\xa3\x03\xe6\xf0\x62\x31\x3f\x5d\xc4\xe5\xf2\xce\xbb\x77\xf7\xcb\xb2\xb2\xb7\x6b\xd6\xaf\xf7\xfa\x6a\xf7\x9f\xef\xf9\xf3\x32\xf5\xb8\x6d\x99\x15\xea\x70\xbb\xc2\x97\xf6\xde\xfd\xb0\xf1\xbd\xef\x4f\x77\x5d\xbc\xe9\x3f\xfe\x71\x77\x8a\x8b\xf7\x97\xd5\x83\xa1\x63\x1e\x3f\x7b\xfa\xea\xc5\xb3\xaf\x4f\x9e\x7f\xfd\xe8\xe9\xd1\xc9\xd1\xd3\x2f\x9e\x3f\x7b\xf2\xf4\xd5\xfa\xd9\xbe\x7d\xf2\xc5\xd1\x8b\x93\xc7\x5f\x3d\x7a\xfa\xe5\xd1\x17\x0f\xcd\x5f\x1f\xde\xf9\xc0\x73\xee\xdc\x5f\x25\x3f\xf4\xc5\xa3\x57\x8f\x1e\x1f\x3d\x7d\x95\x5c\x53\x92\x6b\x5e\xfd\x5a\x4f\x4f\xfe\xfe\xe2\xe8\xe5\xd1\xab\x87\xf6\xaf\x0f\xef\xec\xfe\x71\xfc\x4b\x8f\x9f\x3d\xfd\xdd\x93\x2f\x4f\x7e\xf7\xe4\xeb\xa3\x93\x27\xdf\x3c\x7f\xf6\xe2\xd5\xd1\x17\x0f\xb3\xf1\xfd\x5f\x31\x78\xdf\x25\x4e\x8e\x5e\xbc\x78\xf6\xe2\xa1\xbb\xf1\x32\x6a\x34\xbe\xd4\x97\x47\xaf\x4e\xd6\xa3\xf9\x0f\xaf\x8e\xd6\x37\xfb\xec\x0f\x2f\x1e\x1f\x3d\xcc\x93\xcb\xec\x33\xb8\x7a\x89\xf5\x23\x9f\xbc\x7c\xf5\xec\xc5\xd1\xcb\x87\xc5\xce\xd9\xc9\x77\x57\x4f\x7c\xf6\xf2\xe4\xc9\x37\x8f\xbe\x3c\x7a\xf9\xd0\xef\x9c\xb6\xf9\xe6\xea\x49\xc3\x7d\x9c\x3c\x7f\xf6\xec\xeb\x97\x0f\xcb\x9d\x33\xc7\x5f\x5f\x3d\xfd\xdb\x6f\x4e\x9e\x1e\xbd\xfa\xe3\xb3\x17\xbf\x7f\xf9\xb0\xda\x39\x37\xf9\x6e\xef\x89\xbf\x7b\xf6\xf5\x17\x47\x2f\x5e\x3e\x14\x73\xf5\xc4\xfe\xbb\xf1\x79\x4f\x9e\x9f\xfc\xee\xd1\x37\x4f\xbe\xfe\x53\x3f\x70\x1e\x4a\x3a\xae\x76\xbf\x1d\x9f\xfb\xed\xe3\x93\x47\x7f\x78\xf5\xd5\xd1\xd3\x57\x4f\x1e\x3f\x5a\x0f\x13\xb1\xc9\xb9\xbb\xdf\xea\xb9\xeb\xb5\xe5\xd1\x93\x17\x5f\x3e\x7a\xfe\xfc\xe8\x8b\x93\x6f\x9f\x3f\xde\xfc\xee\x7a\x8c\x5d\xf7\xed\xf6\xdc\xbd\xc3\x53\x5c\x7f\xee\xf5\x63\x73\xff\xb7\xfd\xb8\x94\xfc\xda\xf3\xd3\x41\xb9\xb6\x58\xb7\xe5\xd1\xff\x7c\xf2\xf2\xd5\x93\xa7\x5f\xae\x6f\xf0\xe5\x43\x29\xfa\x93\xaf\x7c\x35\x3e\xeb\xd1\xb7\x8f\x9e\x7c\xfd\xe8\xb7\x4f\xbe\x7e\xf2\xea\x4f\x27\x7f\x7e\xf6\xf4\xe8\xe5\x43\xf1\xc9\xa9\x57\xbf\x1f\x9f\xff\xf2\x0f\xbf\x7d\x7a\xf4\xea\xe5\x43\x29\x93\x93\xfa\x3f\x8e\x2d\x9f\x3e\xfb\xe2\xe8\xe4\xd5\x9f\x9e\xaf\x7f\xa1\x4a\x8c\xb7\x7f\x1f\xdb\x6f\x07\xb9\x35\x89\xf9\xce\x08\x5f\xff\xf9\xc5\xd1\x97\x4f\x9e\x3d\xdd\x2c\x41\x56\x7a\xf3\xf1\xdf\xb7\xf6\xeb\x1e\x5c\xff\xe0\xf6\x0c\xdb\x9f\xb1\xfb\xcd\xf8\x9c\x8d\x79\x96\x98\x8f\x2d\x79\x0f\xed\x1d\x0d\x96\xd1\x70\xed\xf7\x37\x9f\xdf\x8f\x08\x9b\xdf\x70\x8d\xd1\x98\xc0\x66\x34\xad\xbf\x7c\xf1\xec\x0f\xcf\x5f\x3e\xb4\xc5\xe6\x12\x7b\xbe\xde\x3d\xfb\x5b\xfa\xd6\xfa\xd1\x39\xdf\x26\x7d\xbb\xf9\xe3\x93\xa7\x2f\x5f\x3d\x7a\xfa\x78\xe8\x61\x5b\x8e\x4e\x19\x7f\xbb\x7b\x6e\xd2\xd3\xd5\xe8\xb4\xdd\xbe\xe6\x8b\x9d\xde\xce\xcc\xe6\x94\xbd\xfd\xdd\x7f\xa3\x8f\xc9\x53\x6e\x4f\x95\xe4\xd4\x3d\x06\xfd\xdb\x4a\x7d\x87\xfd\x6f\x20\xde\x5c\xd7\x1b\xbc\xe7\x0a\x7d\xb7\x66\xd9\x4d\x57\x49\xfb\xb5\x5f\x65\x4f\x5e\xbe\x3a\x7a\xde\x4f\x9e\xf5\x2b\xfa\x7f\xfe\xe9\xe4\xc9\xd3\xdf\x3d\x7b\x98\xad\xc7\xd8\xcd\x36\x7a\x9d\xc7\x5f\x3f\xd9\xb6\xc2\x7a\x50\x25\x7f\x50\x8b\xdf\xbe\x50\x9f\x6f\x6b\xb6\x1e\x38\xbb\x7f\x55\x5b\x7e\x69\xfd\xba\xfb\xfa\x88\x46\x59\x0f\x97\xf1\xdf\x12\xbb\x97\xaf\x1e\x69\xd3\x95\x83\x55\xff\x97\xc4\xe6\x8b\xa3\x97\x8f\x5f\x3c\x79\xfe\x6a\xdb\x9b\x0f\xb3\x6a\x30\xbf\xfa\xe5\x9d\xfb\xd3\x24\x90\x35\x8d\xab\x83\xe5\xfb\xe3\x93\xcb\xcb\xfa\x6f\xb1\x59\x2d\x09\x46\x7e\x13\x2e\xde\x6d\xc2\x89\x83\x53\xb7\xf8\x6f\x18\x9e\xc6\xd5\x4b\xb5\xbd\xbb\xba\xf7\xe0\x62\x72\x11\xef\xde\x35\xf7\x67\x0f\x5e\xdc\xbb\xbb\xb8\x77\xef\xc1\xf6\xb4\x78\xef\xf3\x3d\x27\xa4\xdf\xbf\xbb\xb8\xac\xa7\x93\xe5\x19\xf4\xae\xbb\xa6\x0f\x56\x6f\x2f\xe2\x3d\x8d\x71\xae\xee\xbd\x6b\xa6\x31\x2c\x8e\xbe\x8b\xb3\xd5\xc6\x7a\xb8\xe5\x07\x6d\x24\xda\xb9\xba\xf7\x6e\x11\x97\x71\x75\xed\x23\x8d\xee\xe4\x87\x75\xc3\xc4\x87\xe3\x2b\x9d\xc6\xf5\x57\xbf\xee\xfd\xd0\xf8\x8f\x7f\xdc\x1d\xa2\xb3\xab\xbb\xd2\x47\x5a\x37\xc6\xeb\x9f\x5a\xdd\x8f\xf7\xee\xdd\x8f\x3f\x36\xce\x1a\xde\x1b\x67\xbd\xdf\x87\x73\xda\x27\xb3\xcf\xef\x2c\xe6\xf3\xd5\x9d\x6d\xe4\xd5\x66\x79\x7e\x2b\x1f\xfc\xcf\x7b\x9c\xed\xef\x52\x67\x1b\x77\x5e\xbd\x6d\x5b\x58\xc9\xd5\xdb\xf6\xae\x32\x6e\xed\x6d\x8f\x82\xde\xb7\x18\x54\xfd\x3d\xb3\x0b\xa6\x1d\x67\x0f\xfe\xe7\xdd\xd9\xe5\x74\xda\x37\xe5\x59\x58\x3e\x0f\xcd\xa4\x9b\x34\x8f\x75\x03\xb9\x31\xfa\x97\xa1\xb5\x57\xaf\x17\xdf\xc6\xc5\x72\x32\x9f\xed\xbb\x40\x17\xc3\xea\x72\x11\x7f\x37\x0d\xa7\xcb\x7d\xdf\xf7\xdb\xaf\x1b\xae\x90\xde\xe2\x83\xb0\x7c\x56\x2f\xe3\xe2\xbb\x50\x4f\xe3\xdd\x74\xac\xae\x1e\xfe\xe6\x87\xd5\x7f\xf9\x2f\xeb\x47\x9c\x4f\xe3\x83\xe9\xfc\xf4\xee\x9d\x57\xbf\xff\xf2\xe0\xf7\x93\xe6\x35\x3b\xce\x83\x3f\x3c\x39\x98\x86\xcb\x59\x73\x16\x5b\x0d\x9d\x0d\x17\x3e\x58\x8f\xe3\x83\xdf\xac\xff\x3b\xb8\xf3\x5f\x57\xf7\xde\xdd\x7b\xb7\x8c\xab\xe7\xc9\xcf\x6e\x06\xf4\xe8\x5e\x86\x81\x7f\xba\x63\xbc\xe9\xb8\x2b\xa7\xac\xaf\xfb\x64\xf9\x7c\x31\xff\x5b\xdf\xa8\x9b\x0b\x5f\x69\xe7\xf4\xea\xe3\x53\xc6\x97\xbf\x72\xe2\xfa\x37\x5e\x6d\xba\x64\xf3\x03\xdb\x5e\x4a\xaf\x9c\x18\x8e\x2f\xbb\x35\x5f\x5f\xef\x77\x49\x27\x6e\xae\x98\xf6\xec\xe6\x9a\xcb\xb8\xfa\x76\xd4\xa3\x1b\xf3\x71\x47\xa7\x37\xb1\x73\xc2\xf8\x46\xc6\xa7\xbd\x9b\x2c\x9f\x4f\x2f\x4f\x27\xb3\xfe\x8e\x1e\x35\xab\xc9\x77\x61\x15\x5b\xa6\xf9\xe8\xc4\xc9\xf2\xdb\x30\xbd\xfc\xff\xc9\x7b\x17\xee\xb6\x6d\x64\x71\xfc\xab\x48\xfc\xe5\x68\x89\x18\xa1\xa5\xbc\xda\x4a\x61\x74\x1d\xc7\x69\xbd\x4d\x6c\xaf\xed\xb4\xb7\x55\xb4\x0e\x2c\xc2\x36\x36\x14\xa9\x82\x90\x1d\x47\xe2\x77\xff\x1f\x3c\x09\x92\xa0\x24\xa7\x69\xd2\xbd\xff\x3d\x7b\x1a\x8b\x18\x00\x83\xc1\x60\x30\x2f\x00\xf8\x94\xce\xb1\xaf\x45\x57\xa9\xae\x94\x0c\xb9\xf3\xb3\x91\x06\xf3\x38\x0e\xc3\xda\x70\x97\xcb\x86\x82\xe0\x9a\xf7\xb9\xa6\x78\xc4\xc6\xeb\x21\x46\x78\x3c\xe4\x30\xfd\x95\x20\x79\x69\x94\x25\xb4\xdb\x61\xc8\x3a\x9d\x7f\x9e\x1c\x1e\x04\x33\x44\x33\x21\x7c\x49\xf6\x26\x8d\xb0\x62\x94\x13\xe3\x1c\xf2\xab\x94\x6b\xa0\x31\x0a\xde\xec\x41\x14\x9c\x1e\x05\x5c\x39\x7a\xb9\xf3\xfa\xf0\x60\x4f\xbb\x3e\x40\x1e\xe1\x49\x1a\xe1\x17\x28\xc3\x4f\x1f\x5b\xd2\x5b\x39\x65\x68\xe8\x3d\xc3\x09\x87\x88\xfa\x9e\x11\xdf\x81\x58\x9a\xd9\xaf\x84\x5d\xf9\x14\x74\x3a\x38\xc0\x49\x24\x7f\x7a\xcf\x3d\xd0\xe9\xf8\x38\xc4\x62\x95\x33\x4a\x92\x4b\x9f\x06\x31\x4e\x2e\xd9\x15\xc4\xea\x8f\x07\xde\x73\x4f\xfd\x09\x00\x44\x2c\x3d\xe7\xbb\x16\xc9\xd4\x18\x0f\xd0\x14\x1f\xe3\x3f\xe6\x84\xe2\xe8\xee\xa3\x54\x43\x3b\x3b\xd8\x79\xc3\x15\xae\x7f\xbd\xdd\x3f\xde\x7b\xf9\xa7\x23\x76\xf1\x9f\xd8\x49\xc4\x36\x90\x16\x9e\x96\x89\x76\xbf\x28\x2a\x47\x21\x17\x7a\x67\x3f\xef\xef\xfe\x2c\x94\x94\xb3\x9d\xd7\xaf\xcf\x7e\xde\xfb\xed\xc4\x1b\xc8\x4d\x60\xbe\xc8\x18\x62\x64\xd2\xe2\x92\x88\xe1\xa9\xe4\x76\x3d\x45\x73\xbe\x48\xc4\xe7\x08\x2c\x97\x8b\x7c\x40\x47\x6c\x1c\x32\x28\x9c\x8c\x27\x2c\xa5\xe8\x12\x07\xba\x66\x04\x05\x73\xc9\x99\x21\x17\xb7\x5c\xb9\x70\x43\xb2\x2a\x24\x5f\x77\x0a\x0f\xdd\x61\xc1\xbc\x16\xcb\x96\x5a\x2b\x20\x4d\x65\x8a\xa7\xe9\x35\xd6\xf5\xe5\x28\x70\x7d\x14\x52\xfb\x68\xf1\x35\x03\xe7\x16\xfe\xb8\x82\x6f\xa9\x39\xdd\x87\x50\x6b\x7c\xdd\x3a\x2b\xb5\x3e\xb8\x48\xa9\xaf\xba\x6d\x91\xa4\xc5\x00\xe3\x02\xf9\xf0\x26\x39\xa2\xe9\x0c\x53\xc6\x87\xda\xe9\x34\x75\x82\xc1\xa0\xa9\x28\x02\x79\xce\x17\xd0\x55\x65\x0b\xcf\x58\xaa\x45\x94\x9e\x34\xc1\xcd\x38\xc9\xe6\x14\xbf\xcd\x30\x7d\x89\x18\xda\x8f\x70\xc2\xc8\x05\xc1\x94\xeb\x4a\x52\x27\xc2\x4c\x97\xee\x25\x8c\xde\xfa\x14\xf2\x56\x94\xc2\xc4\x5b\xfd\x55\x38\x16\x55\x21\x1f\x7e\x4a\xf1\x0b\x34\xf9\x40\x92\xcb\x43\xa5\x92\x49\xbd\x85\xe3\x45\x42\xcf\x83\x49\xe8\x15\x4b\xb9\xd3\xf1\x49\x88\x47\x34\x88\x48\x36\x8b\xd1\xed\x2b\x82\xe3\x68\x0c\x13\xf1\x4d\x88\x2c\xf9\xc5\xee\xd2\x67\x70\xa1\xc0\xfb\x04\x0a\xa0\x7e\x92\x03\xd8\xee\xaa\xee\xd3\x34\xc6\x28\xa9\x0b\xf7\x5a\x6d\x3c\xf4\x6e\x71\xe6\xf5\xbd\x24\xf5\x54\x43\xd8\x6a\xe8\x0d\x9a\x39\x88\x36\x45\xb3\xd3\xf4\xa5\x6c\xe1\x44\x0a\x18\xac\xc9\x55\xed\x80\xaa\x56\x69\xae\x48\x73\xc2\xf0\x4c\xd5\x3d\xa4\x11\xa7\xb4\xa4\x8e\xf6\x41\x5b\xd3\x62\x53\x56\xcf\x87\x2c\xe1\x8d\xc8\xef\x84\x4f\x06\x09\x32\x86\x67\xd9\x08\x8f\x35\x15\x45\xd3\x21\x6d\x98\x26\x62\xe1\xf2\x1a\x9d\xe3\x38\xfb\xc2\x58\xc4\xa2\xd1\xb5\xfd\xcb\x6f\x3a\x8a\x42\xd2\x24\x6b\x64\xd1\x0a\x16\x34\x88\xac\x5a\x21\x5e\xc3\x8f\xaa\xa3\x0a\xd9\x37\xec\xc8\xa6\xe8\x66\x1d\x9d\x12\x16\xe3\x3b\x8c\x45\xc4\x0c\x57\x8e\x82\x62\x46\x09\xbe\xc6\xb6\xbc\xd2\xda\x49\xa9\xb9\x40\xfa\xf9\x81\xb5\xbe\xb0\x9c\x17\xf3\xc7\x88\x89\x7f\xc7\xb5\x0f\xc1\x05\x5f\x69\xd9\xd0\xfd\x79\xc4\xe4\x1f\xe3\x3e\x57\x13\x0c\x46\x62\x89\x54\x90\xb2\xb0\x2d\xe1\x21\x96\xc2\x50\x0d\x92\xaf\x9b\xd3\x94\x57\x57\x05\xa0\xaf\xcd\x39\x5d\x9f\x0b\x38\x1c\x09\x4d\x45\x33\x28\xb9\xf0\xdb\x14\xa8\x46\xb5\xd6\x8e\x29\x4d\xa9\xef\x31\x7a\x4b\x92\xcb\x16\x4b\x5b\x8e\x06\x44\x70\xdc\xdb\x62\x5b\x5e\xe0\x6d\xe1\x2d\xaf\x75\x3e\x67\x2d\x31\xa0\x37\x68\x36\xe3\xf5\xe6\x49\x84\x2f\x48\x82\x23\x0f\x40\x3e\xc4\x22\x2c\x24\x69\xda\x67\x90\xd3\xa3\x8f\xa1\xa8\xd6\xa7\x41\x82\xa6\x38\x1f\x90\x0b\x9f\x06\x24\x7b\x83\x66\xc0\x96\x35\x36\x81\x48\x91\x76\x52\x26\x10\x31\x04\x4a\x86\x34\x38\xb7\xc5\xe6\x90\x1a\x30\x6a\xff\xed\x27\x9a\x5c\xd7\x29\x89\xaa\x34\x38\xb5\x68\x20\x18\x49\x8e\xb1\xe5\x6d\x49\x74\xd5\xc0\x93\xb4\x95\x8a\x5e\x0c\xa9\x4c\x5a\x41\xe4\x81\xbe\xea\x42\xf6\xd0\x35\xf3\x51\x66\xdc\x92\x64\x75\x71\x76\x6e\xcc\xf7\x0d\x79\x16\x6f\xcc\xa3\x9d\x8e\xaf\x77\xe7\xd5\xcc\xda\xb0\xa4\xb8\x26\x21\x1b\x50\xa2\x01\x31\xc4\xf1\x9c\x97\x36\x73\x5e\xf5\x03\xbe\x95\x20\x42\x81\x90\xbb\xfa\x5f\x33\x20\xf7\x7e\x8b\x21\x83\x96\x55\xeb\x1c\x89\x6c\x82\xab\xbf\x92\xe1\xe5\x68\x94\x73\x47\x4e\x12\x0d\x2e\x48\xcc\x30\xf5\x69\xf8\x5c\x1b\x80\x16\x70\x13\x8b\xe7\x00\xe4\x65\xc8\xcd\xd6\xba\xb4\x24\xd4\xc2\xee\x74\x3c\xaf\x1d\xea\x5f\x45\x7b\x62\x2b\x54\xa8\x56\x04\xa5\x9b\xe3\x54\x07\xed\x36\xd5\x3d\x50\xb3\xe7\xe4\xf3\x59\x84\x98\x11\xc0\x53\x9c\x31\x34\xad\x8b\x26\xa7\x04\xc6\x41\x8c\x32\xf6\x56\x34\x10\xbe\x44\x0c\x07\x49\x7a\xe3\x37\x53\x3c\x27\x59\xc1\x36\x87\x71\xd4\x48\x94\x4a\x3f\x5c\x78\x61\x25\x24\xda\x3d\xf9\xd3\xea\x5a\x97\x74\x8d\xed\xc3\x05\x22\xc7\xc7\x2f\x81\x29\x32\xf8\x05\xa6\x0f\x28\xe7\x41\x3e\x6a\x1f\x80\xed\xa7\xf8\xf1\xf3\x47\xdd\xbc\xc6\x4a\x8a\x23\x98\xa6\x59\x79\xc5\x60\xb5\x62\x42\x9a\x3b\x14\x1c\x63\x98\x15\xaa\x1b\x0b\x2e\x52\xba\x87\x26\x57\xbe\xcf\x20\x05\xe1\x73\xbc\x15\xd2\x2d\xaf\x2f\x84\x2c\x6c\x79\x00\xe2\x20\x8b\xc9\x04\xfb\x5d\xf8\xe0\x21\xdf\x20\x0b\x91\x6f\x11\x4c\x09\x7d\xd3\x6a\xa7\xc3\x82\x6c\x16\x13\xe6\x8b\x46\xb8\xb6\x25\xbc\x34\x86\x3f\x74\x69\xdf\xe3\x33\x97\x61\xe6\xd3\x51\x77\x0c\xe9\xa8\x37\x06\x39\x80\x38\xaf\x2e\x47\xb3\x08\x0a\x1d\xdc\xb1\xb4\x5d\x9c\x61\xbb\x12\x6b\xad\x96\x9d\x89\x02\x66\x42\x31\x62\x46\x9d\x2e\x1a\x87\x38\xaf\xaa\x4c\x25\xdd\xd4\x70\xf1\x72\x59\x69\xa7\x5c\x01\xb2\x7c\x85\xc6\xbe\x96\xd3\xab\xca\x81\x53\x97\xc3\x50\xa2\xc3\x91\x6e\x18\x8f\xc2\xbb\x2c\x34\x32\xb3\x7d\xe7\x4d\xe8\x9b\x39\x5c\x48\x9e\x33\x35\x06\x05\x05\x42\x9a\xdb\xf3\x62\x48\xb4\xe5\x29\x73\xc7\xcb\x6b\x2b\x52\x08\xee\xac\x61\x6a\xf5\xa0\x21\xb3\x4d\xf0\x37\x3b\x27\x3f\x87\xde\x7d\xf5\x3f\xcf\x32\x93\x67\x21\xf5\x1f\x3d\xfd\xee\x07\x00\x2f\x42\xea\x3f\x79\xd2\xfd\xe1\x91\x74\x8b\x5e\xae\x70\x8b\x1a\x6f\x15\x8a\x49\x24\x12\xe0\x4e\x64\x72\x62\xc8\xf2\x49\x9c\x26\x82\xbe\x4a\xd1\xb0\x46\x25\x9a\xd2\xa6\x75\x84\xf1\x6c\x37\x9d\xd9\x0c\xbb\x43\x29\xba\x0d\x48\x26\xfe\xf5\x19\x18\x32\xbd\x1c\x44\x6f\x56\x0d\xd0\x67\x32\x0b\x28\x99\xe0\xf4\x42\x08\x8d\xa1\x91\x1e\xcc\x92\x0e\x7d\xd6\xe9\x78\x72\xef\xf7\xc2\x90\xdd\xce\x38\x38\x1b\x4a\x9d\x83\xc3\x59\x56\xe8\x01\x9a\x72\x35\x16\x04\x14\x47\xf3\x09\xf6\x7d\x2c\xd6\xb9\xaf\x80\xa5\xba\x54\x98\xac\x90\x42\x67\x33\x45\x9a\x94\x10\x14\x00\xe2\x11\x1d\x87\x95\x11\x8c\xe8\x18\x70\x0e\x57\x2d\x48\x16\xf2\x8b\xf6\x8e\x68\xca\x52\x8e\xee\xe1\x05\x1f\x2e\xe8\xb3\x3c\xb7\x09\x90\x93\x24\xc3\x94\xbd\xb2\x34\xba\x6c\xe7\x82\x15\x06\x96\x34\x3f\x1f\x08\xb1\x2b\xf6\x65\xe9\xfe\x11\xf6\xa7\xd2\x16\x74\xbd\xe0\x82\x24\xd1\x7e\x12\xe1\x8f\x82\xd4\x42\x71\x0a\xc3\x90\xdb\x38\xcf\xba\xa0\x41\xfb\x6c\xec\x5f\xe4\x74\xcd\x13\x74\x1e\x8b\x44\x2b\xde\xb6\x51\xca\xb8\x3e\x46\x12\xa3\x7a\xb5\xb2\x82\x4d\x94\x82\xe6\x01\xd8\xee\x0d\xa8\x91\xb5\x98\x23\x54\xc6\x96\xcb\xc3\x09\xf6\xb7\xb6\x08\xec\x6a\xdf\xa4\xf0\x4b\xe1\x12\x36\xf6\x6a\xaa\x8d\x57\xe8\x06\x2c\x7c\xde\xe6\xd3\x8a\xb4\x53\x4b\x34\x25\x2c\x44\x1c\xbd\x5a\xaf\x64\x68\x39\xe9\xea\x9c\x02\xab\x17\x26\x2d\x44\x60\x29\x25\xd7\xc1\x5c\x89\x19\xb5\x72\x36\xd4\x50\xa4\x12\x0e\x0a\x1e\xe5\x82\x26\x7c\xee\xb3\x60\x36\xcf\xae\x7c\x2c\xca\xf9\xe2\x87\xa3\xb1\x18\x8e\x40\x4b\x8c\x49\x6d\x44\x1b\x20\xcf\x9c\xc8\x57\x7b\x1c\xc9\xce\xc6\x21\x96\x10\xbc\x53\x25\xe1\x8a\x9e\x8d\x10\xb0\xe4\x3f\x2e\x4f\xc7\x10\x3b\xd8\x91\x4f\x3c\xd6\x9c\xc8\x40\xdf\x6f\x34\x7e\x2a\x3d\x09\xc3\x47\xf3\x9b\xd8\x99\xb9\x01\x60\x33\xda\x15\xca\xb8\x41\x50\xea\x53\xd9\x40\x35\xbc\xb3\xd3\xf4\x18\x2b\x2f\xc7\x67\x90\x4e\x28\x54\x57\xe9\x3c\x8e\x54\x2b\x05\x3f\x29\x33\x4f\xb9\xd6\x29\x99\x22\x7a\x7b\x4a\xc9\xe5\x25\xa6\x5f\xa6\xef\x60\x56\x6a\x54\x86\x48\x12\xc2\x08\x8a\x4b\x26\xa6\x36\xfb\xda\xdc\xaa\x53\xae\x24\xae\xc2\x72\xc1\x61\x0d\x40\x55\x25\x9f\x6a\x63\xa0\xa0\x68\xa4\xce\xd6\xcd\xc6\x2d\xef\x40\xaa\xb5\x04\x98\xf4\x44\xa3\xbf\x47\xf8\x02\xcd\x63\x26\x2a\x0c\xcb\x3f\xfb\x24\x97\x38\xed\xcc\x59\x7a\x82\xae\x2d\xfa\x94\xd7\x73\xa7\xc3\x7f\xa7\x07\x29\xd3\x90\xf2\x8b\x72\x71\x24\xf1\xad\xf8\x9d\x70\x7b\x50\xe0\xd7\xe9\xf8\x6d\x66\x87\x11\x94\x82\x42\x32\xe5\xff\xde\x13\x72\x8d\x6f\xb3\x16\x10\x00\xf9\x3a\x1a\x15\x08\xfa\x25\x0c\x97\xcb\xea\x3c\xf1\x2f\x06\x65\x35\xff\xfc\x1b\x95\xfe\xf9\xec\x05\x9a\x7c\xc0\x89\x10\x12\xfc\x73\x81\xbb\x46\xa2\x91\xd3\x36\x20\x91\xaa\x5b\xa3\x4a\xbb\x8a\x65\x9d\x8e\x32\x8a\x87\xb2\x0c\x67\x56\x1c\xec\x95\xe2\x47\x90\x37\x17\x15\x78\xdd\x99\xf0\x22\x2e\x26\x75\x90\x94\x6a\xad\xa1\xd0\x0b\x35\xd1\xa2\xe1\x68\x16\x7c\xd8\x37\x3f\xc7\xfd\xd1\xb8\x50\xeb\xaf\x75\x03\x19\xd7\xc5\x8b\x5f\x6a\xc7\x7c\xde\xad\x7c\x36\x66\x00\x85\x04\x18\x4d\x5d\xb9\x3a\x6a\x1a\x91\xc8\x05\x20\xd3\x59\x8c\x0d\xa2\x3e\x05\x83\x64\x88\xa5\xc4\x4e\x40\x5f\x8b\xb6\x1b\x44\x13\xdf\x13\x02\xae\x75\x3e\x27\x71\x24\xc4\x99\x16\x65\xca\x9f\xd1\xaf\xee\xad\x06\xb3\x96\xb7\x45\xb7\xbc\x96\xff\xff\xbc\x2d\xb2\xe5\x01\xbe\xd1\x96\x1c\x3e\xde\x56\x25\xbe\xc0\x85\x0f\x57\x7b\x55\x0b\xb8\x49\x60\xb7\xdb\xb8\xcc\xb3\x3e\xb6\x45\x05\x2e\xc8\x2c\xb5\x79\x39\x9c\xfd\x44\xb4\x5b\x6d\x54\x0c\x03\x7a\x72\x58\x13\x94\x24\x29\x6b\x9d\xe3\x96\x6e\xa2\xb5\x73\xf0\xb2\x75\x2e\x9b\xf6\x40\x1f\x97\x9d\x44\x9d\x4e\x1b\x5b\x6e\xa2\xcd\xbb\x2b\xb5\xa2\x3b\xcb\x0a\x6f\x90\xe8\xea\x0a\x65\x07\xe9\xcb\x74\xba\x2b\xcf\xc7\x7c\x76\x67\x95\x76\xdc\xdd\xb5\xfd\xa6\x0e\xc5\x12\xa4\x40\xdb\x46\x7f\xb2\x47\xd9\x9a\x07\x40\xbe\xba\x25\x4b\xaf\xa9\x69\x7a\xa2\x82\xe2\xc4\xa9\xb5\xcd\x5a\xfe\xc5\x3e\xe7\x3e\xae\xbb\xe5\xf5\x25\x5b\xa4\x68\x04\x68\x36\xb3\x37\x87\xd5\xd1\x45\x76\xf7\x20\xa2\x1f\x07\xaf\x5f\xfd\xe8\x5f\x04\xc7\xe0\xee\x01\xc5\x52\xf8\x70\xca\xad\xa1\xde\x77\xdf\x77\x81\x8a\x09\x5e\x2f\xf2\x2a\xfe\xc2\x98\xcf\xe0\x75\x10\x15\xdf\x8e\xf1\x25\xc9\x18\x45\xd2\x9b\x21\x2d\x1e\x47\x46\x09\x4e\x38\x2b\x14\x29\x3d\x4c\xca\x55\xb9\xec\x0a\x57\x03\x0b\x9f\x2f\xae\x83\x29\xce\x32\x9c\x5c\x62\x1a\xe8\x44\xa3\x05\x37\x0d\xfa\x0c\xce\xd0\x6d\x9c\xa2\xa8\x8f\x73\x90\xaf\x70\xd7\x15\xae\x1f\xbe\x5c\x05\xb6\x8c\x62\x34\x95\xf9\x05\x5c\x53\xa4\x02\xed\xc2\x7c\xb0\x91\x1c\xb1\xf1\xb0\x2c\xa3\xd4\x51\xb4\xd6\x39\x4d\x3f\x60\xda\x22\x97\x49\xca\xb9\x2d\x9a\xcb\x53\x70\x7c\x39\x4b\x2a\x88\x93\x1e\xe9\x45\x0b\x5f\xe3\x84\xb5\xbc\x2d\x12\xbc\x1e\xb1\x31\xe8\xfb\x95\xf6\xc3\xc5\x05\x66\x93\x2b\x4c\xfb\x18\x4a\xfb\x70\x8f\x33\x5f\x9f\x42\xc1\x84\x12\x5b\x61\x3f\x4f\x02\x06\x8b\x01\xe8\x4f\x39\xb4\xa9\x54\x4a\xf9\x52\x6a\x98\x68\x5f\x2b\xf1\x81\xa2\xdb\xd0\xfc\xd5\x5f\xe4\x80\xef\xe3\xd5\x64\xb1\x52\x84\xc8\xa6\xa4\xd6\x58\x86\x3e\xb1\x09\x6a\xa7\x85\x41\x12\x58\xd8\x5b\x45\x7c\xa1\x74\x2d\x9d\x56\x12\xf5\xa5\x83\x89\x14\x69\xa3\x16\x62\x0c\x4f\x67\x8c\x4b\x7d\xd3\x0e\xff\x31\x4f\xf4\xcc\xe1\x48\x52\xb9\x2f\xb2\x73\x60\xbb\x07\x72\xa5\x34\x09\xaf\x04\x47\xe4\x27\x94\x44\xb1\xbd\xe7\xb6\x70\xf8\x7c\xc1\x24\x96\x07\x29\x23\x17\xea\x0c\x63\x88\x97\x4b\xcf\xcb\x73\x34\x9b\x61\x71\xa2\x67\x4d\x13\x78\xe8\x68\xa4\x48\x52\xc0\x60\xb9\xf4\x1d\x10\x9d\x8e\xeb\x6b\xe8\xf8\xb6\xe5\xb5\x3c\x00\x37\x05\xc6\xa0\xef\x02\xe5\x23\xe2\x86\xc0\x49\x79\x92\x61\xa2\xa7\x19\x55\xa6\xd9\xf8\x1e\x5b\x68\xe8\x27\xcb\xa5\x9f\x68\x33\xbe\x89\xae\x00\x22\x9b\x1b\x74\x56\x61\x1a\x1c\x03\x9f\xd9\x67\x9b\xcd\xf9\xe8\x52\xaa\x21\xe5\xf5\xdd\x3c\x93\x54\x78\x46\x09\xe7\x3d\x6b\x61\xe1\xf1\x96\xd7\xba\x11\xd6\x0d\x6b\x59\x6c\x61\x8e\x8b\x56\x96\xed\x39\xbe\x48\x29\x16\xba\xc5\x45\x4a\xa7\x07\x32\x5e\xc2\x97\x64\x54\xe3\x33\xc2\x02\x4f\x32\x95\xb5\x08\x2a\x21\x11\xbd\x98\x97\xcb\x2a\x96\x4e\xd6\x36\x1d\x5d\x62\xa6\xce\x75\xf2\x4d\xa5\x2c\x2a\x8a\x00\x4e\x36\x9f\x5c\xa9\x42\x6e\xc1\x9d\x63\x9c\x58\x83\x34\x06\x5c\x69\x9d\x57\xdc\xec\xa5\xf5\x1b\x28\x89\xe3\xe3\x6a\x82\x1c\xad\x49\x48\x06\x20\x2d\xcd\x8b\xf8\xea\x79\x7c\x8f\x31\x1a\x20\x0e\x35\x37\x73\x85\x51\xfc\x21\x64\x12\xba\x34\xcb\x43\xff\x16\x31\x45\xbe\xc3\xeb\x0f\xcb\x65\x4d\x37\x1b\x48\x0f\x8e\x4f\x03\x4b\x20\x0e\x4b\xbf\xf8\xaa\xe8\x7b\x1e\xd8\xf2\xc5\x7a\x05\x03\x79\x32\xdc\x53\xa4\x6e\x49\x55\x12\x27\x93\x74\x9e\x68\x2a\x39\xc6\x41\xf8\x57\xd7\xa6\x00\x72\x2e\x57\xb5\x12\xf9\x96\x91\x98\x30\xbd\x69\x5d\xfa\xfc\xbf\x7c\xa3\xb5\x45\xaf\x4a\x32\x3d\x82\x35\x43\x50\x94\x5c\x59\xdf\x5f\xa5\x74\x6a\x97\x69\xe7\x60\x4a\xf1\x2b\x9a\x4e\x4b\xaa\x09\x24\x60\xe1\x40\x64\x95\xf3\x45\x6d\xa0\x54\x6c\xa0\xf5\x9a\x15\x03\x92\x02\x65\xc1\x98\xfe\xeb\xfa\x11\x24\x5c\x5d\xae\x5b\xb8\x4d\x91\x98\x7c\x75\x5b\xc6\x6e\x58\x13\x6f\xa5\x55\x35\x71\x68\x21\xca\x21\xb9\x88\xb5\xcb\xd5\xd6\xd5\xb7\xec\x79\xab\x8a\xfa\x22\x6a\xfa\x09\x24\x1c\x6e\x8a\xb2\x0f\x16\xc8\x1b\x94\x7d\x28\x95\x8b\x68\x6f\x09\x60\x56\x2a\x2f\x07\x72\xad\xbe\xec\xef\xa6\x06\xac\x54\x50\xe9\xd5\xa2\xc6\x7e\x32\x9b\x97\x20\x75\x9a\x8c\xd2\xf9\x34\x51\x57\x8c\x5b\xc6\xcc\x0b\xc5\x5d\xfb\x16\x5c\xe1\xe3\x5a\xb0\x58\xf9\x86\x5e\x1e\xbe\xd1\xa7\xe4\xa1\x96\x3f\xae\xc8\xb1\x89\x99\x97\x02\xd6\x22\x7c\xb9\xc1\xbc\x16\xd3\x53\x67\xaa\x52\x62\x4f\x69\x1a\x1a\x60\xdf\xa0\x99\x84\x6b\x28\xf7\x93\x7a\x12\x11\xd1\x59\x3a\x16\xd9\x1b\xf4\x1e\xbe\x5a\x2d\x3a\xcb\xe0\x1e\x29\x82\x7b\x9a\x99\xe9\x90\xfa\x44\x47\xec\xd5\x1f\x03\xa3\xfe\xbb\x31\xb3\xf2\x87\x12\x8d\x99\x0a\x9e\xd6\x92\x9c\x0c\x92\x75\xd1\x5e\x43\xd1\x0a\x9f\xfa\x6b\x28\xcc\xa0\xca\xbe\x12\xbb\x6c\x2e\xac\x6f\xde\xde\x67\x89\x1f\x52\x88\x1f\x12\x3e\x5f\x94\xfd\x68\x2f\x44\xd3\x62\x14\x04\x00\x51\x60\x7a\xb3\x66\x00\x12\x30\xc0\x71\x86\x5b\xe4\xc2\x27\x55\x09\x00\xc4\x47\x63\x29\x9a\xa4\xbb\xcd\xbc\x6f\xaa\xf5\xa2\x01\x2e\xab\x44\x5f\xa5\xb4\x70\xbd\x36\xc8\x46\x6b\x43\xb6\x24\xb4\x8f\x62\x79\xe4\xe2\x20\x83\x58\xb0\x9b\xd0\xb2\xc1\xf1\x5a\x21\xe7\x1a\xb1\x49\xd4\xf2\x52\x81\xe9\x42\x5c\x48\x81\xc2\x95\x72\x2e\xee\x6c\x71\x6f\xcb\x3b\x2a\x65\xbc\x13\xbf\x75\x5e\xda\x0a\xa2\x75\x0c\x56\xa3\x2c\xd0\xcb\x2d\xe6\x2b\xb3\x83\x93\x6a\x4e\xd7\x8d\x98\x5e\x4d\xa6\x86\xb1\x94\x3c\xc1\x8a\x23\xa6\xc1\x55\x80\xa2\xe8\xe5\x6d\x82\xa6\x64\x52\x2c\x25\x2e\x56\xf2\x1a\xf7\x96\x1c\x8a\x15\x8f\x6a\xcd\xb1\xe1\xc2\x62\x85\xb3\xb0\x44\x35\x45\x00\xae\xa6\x8b\x3b\x8a\xb8\xe8\x21\x9d\x4e\x2f\x0c\x43\xa2\x93\x9a\x51\x48\x46\xdd\xb1\x58\x31\x46\x2e\x6c\xe8\x8b\x56\x01\x53\x15\x06\xe6\x72\x43\xe5\x5a\x74\x3a\x3e\x0a\x29\xc8\x95\x9b\x3a\x0c\x91\x12\x77\x22\xa4\x56\x2c\x3f\x7b\x7f\x29\x3e\xfb\x48\xcf\x41\x1c\x52\x79\x1e\x47\xd2\x00\x0c\xe2\x61\x26\xe3\x93\xe9\x9c\xc9\x18\x6b\x1c\x64\x58\xfa\xb6\x7d\x04\x13\x90\x17\x3e\x41\xb9\x51\xfd\xa3\x44\x10\xd0\xaf\xac\xc3\x7e\xcb\xfb\xc7\x96\x1e\x88\xf0\xc8\xc8\xc1\xa8\x3f\x45\xb7\x5b\xff\xf0\xfe\xe1\x4a\x57\x5d\x2b\xf5\x8b\xac\x56\xb0\x46\x90\x57\xd3\x60\x05\x3f\x57\x56\xd8\x17\x93\xdc\xa5\xac\x53\x95\x6a\x77\x25\xe2\xdc\x7d\x4f\xe7\xb6\x7a\x5e\x2e\xe5\x79\x59\x6b\xf9\x62\x38\xc8\x7c\xd9\xd2\xce\x51\x27\x5a\x11\xf5\x52\x27\x12\x54\xe2\x49\xee\xe8\xd4\x60\x85\x03\x35\xb5\x45\x6a\x97\x26\x3e\x5d\x2e\x2b\x5a\xcc\xdb\x2a\x6e\xe8\x1a\x4b\x97\xb3\x91\x22\x52\x30\xf3\x05\x17\xb5\x10\x37\xb3\xa6\xad\x4b\x9a\xce\x67\xea\x92\x23\x12\x09\x9b\xf1\x0a\x5d\x63\xcb\xe1\x2c\xf9\xc6\x0b\x5a\xc4\xa4\x5d\x84\x2e\x27\x32\xa4\x79\x9e\xc3\xc7\x4f\x1f\x3e\x7a\xba\xd1\xe9\x2d\xb2\xfa\xb6\x2b\xea\x3f\xfd\xee\xc9\x77\x8f\xe5\xe9\x2d\x75\x4f\x19\x2a\x1f\xd9\x8a\x57\x1e\xd9\xca\x27\x69\x92\x70\xf2\x57\xb2\xa1\xe5\x79\xb7\xe5\xd2\xb7\x7f\xda\x99\x2c\x3e\x28\x1f\x8d\xab\x9c\xa3\xca\x35\x94\x50\x31\x6f\x48\x12\xa5\x37\x80\x5d\xd1\xf4\xa6\xc5\x0d\x98\x3d\x95\x92\x68\x19\xda\x52\x68\xb6\xd2\x24\xbe\x35\x77\xbf\xa0\xd6\x0d\x3e\xb7\x2f\x8c\x0a\xb4\x1e\xb9\x98\xd1\x94\xa5\x93\x34\xee\x33\x78\x95\x66\xac\x8f\xf3\x50\xf6\x12\xc4\xa9\x84\x95\xdb\xda\x8d\x34\xc1\x7e\xc5\xe7\x27\xe9\xe4\x03\x66\xbe\xef\x89\x9b\x86\xbc\x30\x0c\xd9\xd0\xbb\xc9\x32\xaf\xef\xdd\x64\x1e\xd8\x7a\xdf\xdf\xde\xbe\xb7\xc0\xf9\xf6\x4d\xf6\x1e\x98\x3c\x2b\x12\xdc\xea\x11\xb3\xf0\xb9\xaf\xda\x0c\xd2\x44\x59\xa3\x21\x13\x36\x60\x70\x4e\x12\x2e\xe7\x61\x01\x20\x38\x4e\xfb\x5c\x1c\xe5\x93\x38\xcd\x78\x75\x7d\x73\x5b\x0d\x44\x00\xa8\xaf\xf2\x13\x00\x45\x52\x68\xf0\xf1\x5f\x1a\xb1\x05\xc7\xa0\xcf\xf4\x3e\x7a\xc3\xb7\x52\x14\xdd\x9e\x30\xc4\x70\x18\x86\x66\xec\xc1\xe1\xd1\xde\x81\xda\xcd\x6f\xb2\x20\xc3\x49\xe4\x3b\xe2\x1c\xb9\x90\x45\x38\x89\xde\xc8\x21\x9a\x14\x96\xd5\x0d\x0f\x57\xb5\xbb\x48\x67\x58\xba\x38\xfb\x2c\x07\x85\xcc\x16\xea\xd3\x4d\xd6\x52\x6c\x48\xd2\x44\xac\xae\x5b\xcc\x5a\xe9\x0c\x27\x9e\x38\xff\x75\x98\xec\x72\x52\x54\x0f\x81\x86\x7c\xab\xa9\x13\xf4\xdb\x9e\xcb\x7c\xfc\xf8\xf1\xd3\xcd\x96\xf6\xd4\xb1\xb4\x27\xf6\xd2\x7e\xf4\xfd\x93\xef\x1f\xc9\xa5\x2d\xb3\x8e\xf8\xca\xfe\xa1\xf7\xfd\xe3\x9e\x3c\x97\xf9\xa8\xfb\xfd\xa3\x87\x00\x66\xc5\x7a\x97\x4c\x9b\x86\x23\x12\xe0\x4f\x30\x0e\x7e\x7e\xba\x03\x93\x60\xfe\x04\x26\xc1\xdb\xff\x85\x28\xf8\xe7\xab\xb1\x90\x09\x93\x8a\x4c\xf8\x7c\x8a\x4d\xd3\x28\xcc\x82\x74\xe7\x85\x76\xb3\x73\x4a\xa8\x32\x92\xfc\x27\xcc\x82\xc9\x3f\x4f\xfc\x85\x3e\xb2\x98\xf5\x47\x63\x48\xa6\xb3\x94\xb2\xac\x3f\x1a\x05\x41\x90\x8e\x61\x33\xb2\x16\x59\x9f\x3c\xec\x3e\xda\x88\xac\x91\x5b\x64\xc2\xd9\x89\xf3\xd6\x19\x18\xbb\x6e\xa3\x49\xed\x79\x50\x24\x2f\xee\x7f\x14\x13\xf1\xb8\xfb\xb0\xfb\xa4\xd0\x5b\xe4\x31\xd3\xc3\xf8\xc8\xf7\x76\x8e\xf6\x77\x63\x82\x13\x76\xf6\xf6\x64\xef\xec\xe5\xe1\x9b\x9d\xfd\x03\x8f\xcf\x53\x23\xcc\x4f\xa7\xa7\x47\x67\x87\xe2\x3c\xf7\x89\x27\xc5\x76\xba\x2a\xa5\xcc\x8a\x3b\x70\x61\x16\x32\xb9\x0a\xa2\x74\x8a\x48\x12\xbe\xe7\x72\xac\x22\x0c\x03\x2e\x24\x85\xea\x5c\x2f\xe2\xb3\x31\xf4\xfa\xde\x96\xab\x80\x2b\x06\xef\xa1\x4a\xda\xd5\xa9\xc8\xaa\x23\x7d\xd8\x27\x55\x67\x2d\x0e\xf5\x4e\x90\x91\xcb\xc4\x2f\xff\x5a\x5c\x61\x24\x18\x40\x7a\xbd\x7e\x7d\xe3\xd3\x4e\x87\x06\xea\xeb\xd0\xfc\xd5\x5f\xe4\x00\xce\x10\x45\x53\x0d\xfa\x7a\x4f\x82\xca\x8f\x43\xfd\x07\x07\xcc\xa1\x28\xa1\x98\x63\x7a\xa4\xae\x28\x1a\x2e\xca\xbf\xfb\x55\x80\x5c\xf4\x21\x6a\xde\x10\x76\xb5\x4b\xb1\xd8\xb3\x51\x9c\x0d\x17\x95\x0f\xfd\x1a\x88\xa8\xcc\xf5\x91\xb7\xfb\x76\xf4\x68\xd5\xd0\x2b\x84\xc8\x4b\x44\x13\xf9\x47\x0b\x8a\xb3\x59\x9a\x64\xf8\x94\xaf\x21\xef\x3c\x4e\xcf\xbd\xbc\x9c\x8b\xc9\x85\xea\x31\xfe\x63\x8e\x33\xe6\x7b\x3f\xee\x9d\x7a\xd0\xdb\xf6\x20\x56\xa8\xbc\x22\x71\xe5\x0c\xd7\xfb\xed\x7b\x0b\xae\x96\xc4\x58\xcc\xfa\x7b\x48\xfe\x0c\x8e\xf8\x33\x71\x14\x8e\xc0\xcb\xfa\x71\xdf\x4d\xc8\xe6\x20\xd4\x5a\x8a\xa0\x19\xd9\x56\x49\x0f\x99\xa6\x8e\xb8\x54\x4d\xdd\xa4\xf6\x57\xf7\x8d\xf5\x6d\x80\x18\xe4\xd7\x98\x92\x8b\xdb\x9d\x89\xf0\x28\x97\x27\xe7\x8e\xb4\x6f\xee\xfa\xe8\xf0\xc4\xf4\x2d\x5e\x4b\xa0\xd5\x83\x91\x22\x5f\x52\x33\x2f\xd0\x58\xbd\x8e\xd0\x6c\x57\x69\x7e\x7f\x3d\x66\x71\x84\x66\xdb\x6a\x87\xbf\x13\x8a\x2f\xa4\x46\xf4\xe5\xa7\xac\x86\x1d\xd7\xb2\xac\x59\xe3\x9d\x8b\x24\x65\x8c\xe8\xe4\xea\xeb\xa0\xc0\xcd\xa6\x6c\x3b\x13\x3d\x56\x50\xf9\x91\xdb\x1f\x5f\x13\x17\x61\xf0\x34\x20\x23\x74\xb1\x5d\xa3\xaf\x7d\x1d\x84\x22\x92\x19\x06\x92\xcb\x7a\xe7\x9a\xec\xc6\xe9\x3c\xfa\xcb\xe5\x09\xba\x26\xdb\x13\xd1\x93\xd5\xb5\xb2\x1f\xf7\x92\x4b\x92\x60\x31\x3d\x5f\x05\x0f\x65\x2c\x61\xd1\xad\x9c\x24\x0b\xa9\x5f\xc8\xec\x00\xb3\x9b\x94\x7e\xf8\x2a\xc8\x5c\x93\x59\xa2\xba\xd3\x48\xe8\x5b\x2b\xfe\xea\xee\x8d\x3e\xa9\x3b\x56\x37\x3e\x9c\x5e\xcd\xa7\xe7\x33\x4a\xbe\x8c\xc0\xf5\xb8\xd2\xe4\x11\x71\xf2\xc4\xd7\x7a\x47\xa8\xff\x10\xe7\x4b\x24\x08\xd4\x47\x61\x84\x9a\x05\x8c\x69\xbc\x0e\x7b\x7d\x55\xe4\x36\x33\x78\x7b\xd2\xf8\x62\xbf\x9c\x88\x92\xbd\x24\x12\x17\xf8\x7e\x05\x29\x5d\xc3\x6a\x03\x51\x7d\x69\x10\x7d\x89\x18\x9a\xe0\x84\x61\xfa\x97\xf3\x5e\x9d\x7c\x51\xd1\xb9\x61\x88\x02\x2d\xe1\x7f\xca\xbe\x08\x43\x44\x93\x35\xec\x10\x4d\x2c\x66\x88\x26\x9f\xc1\x0a\x91\xc1\x58\xb0\x42\x31\x94\x57\x69\x1c\x09\xea\xfe\x77\x8c\xe3\x42\xa2\x5b\x19\xc4\x6e\x3a\x9d\xcd\x19\x3e\xd6\xb7\x75\xff\xb7\x8c\x66\x22\xf1\xae\x8c\x46\x0f\xe3\x28\x4d\xe3\xff\x9a\xa1\xe8\x9b\xd2\x67\x1c\xe9\xca\x80\x8a\xed\xe3\xbf\x63\x2c\xc5\xfe\x53\x1e\x46\x1a\x09\x33\xe5\x1b\x88\xa2\x24\x8d\x30\xe3\x5d\x57\x04\xd1\xe1\xc9\xfe\x14\x5d\xfe\xf7\x30\x7c\x9a\x11\x81\xaf\xa0\x2c\xfe\xc8\xed\xe7\xd3\x9f\x7f\xdc\x15\xd7\xfa\xbf\x4a\xa9\xda\x6f\xbf\xc5\xb6\xb4\x2d\xdf\x16\xd8\x96\x48\x39\x37\x29\x49\x0a\x00\x72\x34\x9b\xc5\xb7\x7f\x17\xbc\xd9\x87\x4b\x89\xfa\x6a\x9c\xa5\x7b\xec\xef\x82\xb4\x22\xb6\x44\x6a\x35\xe2\xd2\x1b\x6d\x44\xe3\x25\x49\x13\x14\xab\x6b\x93\xbe\x0d\xee\x02\xa1\xd5\x48\x67\x98\xed\xfc\x7a\xf2\x4d\xd4\x2c\x74\x93\x39\x71\x43\xd2\x65\x70\xa4\x51\xe4\x42\xe4\x68\xf7\x2b\xca\x32\x74\x93\x6d\x5f\xcf\x26\xc6\xb2\xf8\xf5\xc4\x12\xa8\x5f\x40\x7c\xa1\x4f\x6b\xc4\x17\xfa\x64\x89\x2f\xf4\xe9\x0e\xe2\x8b\xa3\x6e\x89\x60\xaa\x07\x20\xd9\xf1\x2b\xd3\x90\xca\x4e\x2d\x3a\x7e\xd1\x5d\x40\x36\xbf\x86\x94\x0a\xa8\x20\xa7\xfc\x70\x47\x92\x96\x76\x03\x39\x94\xc2\x27\x7a\x44\xd3\x0b\x12\x7f\xcd\xcd\x96\xa3\x34\x53\xbd\x5a\xd4\xdd\xb9\x46\x24\x46\xe7\x24\x26\xec\xf6\xf7\x34\xf9\xda\x18\xd5\xba\xb7\x50\x3b\x99\x9f\x27\x98\x7d\x99\x79\xbf\x9e\x4d\xf6\xa3\x35\xd3\x2e\x61\x8a\x59\x17\xbf\xef\x38\xe9\x99\xc4\xb9\x41\x03\xd8\xf9\xf5\xe4\x6b\x4b\xcb\x3f\xb5\xf3\x7f\x0b\x7c\x37\xdc\xf1\xe5\x3e\x65\xa4\xd4\xb7\xd9\x34\x05\x7d\x37\xd8\x30\xeb\xea\xc9\x37\xe4\x84\x4d\xd4\x12\xbe\x00\x3f\xcd\x6d\x57\xca\x57\x13\x0a\xbc\x5b\x21\x04\xb2\x1a\x0e\x5f\x93\x5e\x12\x8d\xcd\x34\x0d\x81\xa6\xb6\x6b\xb5\x63\xf3\x0b\x08\x2d\x1d\x54\x5c\x23\xb7\x0c\x58\x21\xba\xf4\xa7\xbb\x48\x2f\xf1\xf2\x89\x36\x74\xb5\x9f\x94\x9a\x95\x56\x1b\xe3\xd7\x9f\x8f\x3a\x76\x1b\xb0\xf0\x2f\xf5\x3d\xe4\xfd\x06\x8d\x8b\x50\x20\xb5\xc7\x7b\x80\xa6\x38\xdf\xbe\xe6\xcd\xad\x8b\x0c\xde\x61\x4e\x89\x9e\x53\xf2\x05\xe6\x54\x84\x0e\xad\xf9\xfa\x85\x50\x36\x47\xb1\xf2\x50\xfc\x6d\x88\xd0\x38\xeb\x14\x92\x0d\x66\xb4\x50\x08\xbf\xaa\x50\xb2\x14\x3a\x6c\x2f\xfb\xaf\xad\x24\xab\x79\x2a\xab\xc9\xfc\xe3\xbe\xba\xb0\xc6\x61\x74\x34\x4d\xb6\x68\x44\xcc\xb2\xe6\xae\x7c\x9b\xd8\xcd\x7c\xd1\x49\x2e\x78\xd4\xa1\x1a\x7d\x9a\x7f\x65\x6b\x5d\xd2\xe0\x4f\xa9\x47\xdf\x08\xe7\xbb\xa9\x48\x05\x97\x7e\x23\x25\x49\xd2\xf9\xf3\xd4\xa4\x6f\xcb\x15\x1b\x79\x70\xae\xf0\xe4\xc3\xfe\xc5\x4b\xf1\x2e\xd8\x4b\x84\xa7\x69\xa2\x8c\x9a\x18\x7f\x3d\xa9\xa0\x9e\x25\x8b\x44\xff\x42\x2a\xd4\x97\x98\x44\xf1\xab\x52\x53\xa1\xf5\x67\x16\xd9\xb7\xc3\xfa\x4e\xcb\x4c\xa2\xf9\x2d\xd7\x99\xa6\xf5\x67\x2d\xb4\x6f\xce\x1b\x9b\x2c\x35\xbb\x51\x73\x6c\x25\xbb\x21\x4c\xa5\x78\xa0\x0c\x7b\x2f\xf7\x5e\xef\x9d\xee\x79\x7d\x1b\x99\x2b\xc6\x66\xfa\xf1\x93\xf7\xf7\x16\x56\x3a\x5e\x7e\x6f\x81\xf3\xf7\x90\x82\x81\xa8\xcc\x97\x56\xbd\xe6\x25\x66\xab\xab\xfd\xb4\xb7\xf3\xd2\x51\xef\x0a\xa3\x68\x75\x45\x9d\xbe\x58\xaf\xab\xe8\xba\xba\xfa\xd1\xce\xe9\xee\x4f\x8e\xca\x33\xc4\x29\xe2\xac\x4a\x8a\xca\x7c\x52\x1c\x75\xd3\xac\x61\xb4\x56\xd5\xb7\xce\x9a\xf3\x55\x15\xd5\x99\xf6\xbe\xf3\x0e\x90\xf7\x6f\x13\xf5\x4e\x32\x8e\xc4\xe5\x22\x38\x63\xfd\xd6\xbd\x05\xcb\xdf\x03\xe8\x77\x21\x0a\xce\xc0\x4a\xa0\xfc\xee\x37\x79\x24\xe2\x26\x0f\x12\xe0\x03\x00\xe5\xdf\x31\xfc\x5e\xff\x99\xc1\xef\x6b\x17\x7c\xdc\xe5\x8d\xef\xc7\x0f\x1f\xf6\x36\x4b\xbd\x75\xa6\xd2\x92\x20\x3e\xca\xe1\xae\x2b\x2b\xf7\xdc\xce\xb2\x15\x19\xbe\x32\xcb\xf6\x87\x47\x8f\x1e\x3f\x04\x03\x5d\xa1\x85\x6a\x0f\x51\xb0\x4e\xc7\x4b\xe6\xd3\x73\x4c\xad\x9b\x0a\xc5\x45\xa8\x6f\xd2\x88\x5c\x10\x1c\x75\x3a\x9e\x5c\x77\x36\x40\x82\xa6\xb8\xd3\x29\x86\xb2\x51\xab\x19\xf9\x84\x9d\xad\xf1\x3f\x3a\x1d\x4f\x37\x57\xaa\x13\x93\x09\xce\x7d\x06\x72\x33\x88\xd8\xbe\xd8\x4a\xbd\xd5\xb1\x5c\xea\xfb\x16\xdb\xa6\xee\x72\x29\xaf\x56\x6e\x87\x21\x0b\x26\x24\xa2\x45\xdf\x05\x90\x28\x28\x41\xca\xa1\x39\x20\xc5\x25\x77\x05\x1a\x99\x73\xd4\xb5\x5b\x1f\x3b\x1d\x5f\x36\x1e\xea\xc6\x97\xcb\x06\x82\x82\x32\x6c\x9a\xed\x27\x17\xe9\x72\x39\xf3\xf5\xdf\x00\x74\x3a\xed\x6e\x81\x42\xfa\x39\x94\x10\xba\x8c\x48\xf8\x72\x8e\xb2\x28\x2e\xd3\x4f\xe4\x58\xef\xbb\xeb\xe8\x42\x47\x8d\x13\x3c\xa1\x98\xad\xa8\x25\x01\x4a\x35\xd5\xc5\x08\x42\xd8\x35\xf4\x58\x06\x29\xd5\x66\x38\x41\x8d\x98\xea\x42\x6b\x1e\x27\xdf\x7e\x1e\xa3\xcf\x41\x61\x86\xd8\x95\x13\x05\x5e\x50\xe9\x60\xbe\x69\x07\x23\x2f\x25\xd1\xc4\x83\x5e\x1c\xa1\x99\x07\xbd\x24\x4d\xb0\x37\x0e\x48\x32\x89\xe7\x11\xb7\x1f\x03\x12\x4d\xcf\xc4\xe3\x62\x65\x6c\x38\xfc\xd9\x39\x49\xa2\xb3\x28\x71\x62\x65\x03\x34\xd6\x9d\xa1\x2c\xbb\x49\x69\xb4\xa6\x05\x0d\xe6\x6a\x47\xf8\x28\xce\x64\xbe\xe5\xd9\x39\xca\xf0\x4a\x84\x5c\xd0\x6b\x5b\x95\xf7\x1d\x6e\xd8\xa8\x04\x5e\xdb\xa6\xfc\x81\x18\xdb\xb4\xdd\xa2\xc2\xda\xb6\x39\x4f\xde\xa5\x69\x03\xbf\xb6\xe5\x79\x86\xe9\x5d\x5a\x36\xf0\xae\x96\x69\x9a\xb2\xb3\x09\x6a\x6e\x4a\x01\xb8\xea\xce\x69\xdc\x5c\x6f\x4e\x63\x67\x1d\x8e\xcc\xa6\x8c\xe2\x00\x5e\xd7\x26\x9e\x22\x12\xaf\xa1\x8e\x1b\x7e\x5d\xcb\xeb\x18\xb0\x0e\xbb\xae\x45\x12\xdd\x01\x51\x05\xbc\xae\xcd\x0d\xd8\xce\x09\xbe\xae\x5d\xfe\x77\xa3\xfc\x6d\x84\xae\x0a\x65\x12\x4d\xce\x26\x31\x22\xd3\x33\x75\xb9\x5c\xe6\x6c\xcf\x01\xe7\x6e\x49\x1c\x41\x22\x6e\xc9\x55\x06\x59\x51\x3f\x53\x9b\xe1\x9a\x36\x24\x98\xab\x1d\x6d\x48\x9d\x35\x12\xa8\x0e\xb6\xb2\x9d\xa6\x85\x55\x83\x72\xb5\x92\x4d\xd2\xd9\x0a\x2c\x44\xb1\xb3\xde\x07\x32\x3b\x93\x79\xf2\x67\x13\x4c\x39\x41\xf4\xed\x8c\xb5\x36\x2a\xa0\x95\x8d\xef\xea\xb3\x74\xc5\x34\xc2\x85\x02\x6b\x6b\x2c\x69\x84\x4b\x90\x11\xce\x26\x4e\x3d\x83\x17\x58\x3a\xc6\xec\xb3\x14\x35\x3a\xb9\x72\xab\x68\x74\x72\xb5\xb9\xca\x5a\x82\xbc\x96\x6f\xf5\x39\x81\x55\x99\x85\xf6\xc5\xe7\xe8\x25\x13\xe9\xe5\x78\x79\x70\x72\xd0\xc4\x83\x65\x10\xe0\xac\x7f\x90\x46\x78\x77\xff\xe5\xf1\xaa\x06\x34\x8c\xbb\x85\xa3\x34\x5a\xd7\x80\x02\x71\xd7\x57\x27\x13\xd6\xb5\x61\x81\x55\xdb\x49\xc8\xe9\x6d\xc3\x02\x50\x65\x95\x1a\xdc\x64\x3e\xa2\xe9\xc7\x5b\xe9\x82\x99\xcb\x83\xbe\xcb\x65\xdd\xd0\xda\x9c\x8d\xb0\xbc\x11\xb3\xd3\x31\x6b\xc8\x9a\x73\x55\x58\xaa\xf0\xd3\xe9\xe9\x91\x40\xe2\x48\xa9\x59\x4e\x6e\xa9\x41\xb9\xdb\x78\x7b\xfc\x7a\x75\xf5\xb7\xc7\xaf\x1b\x6a\x2a\xc1\xbd\xa6\xba\xd9\x0c\x2a\x6d\x9c\x6c\x36\x84\x93\xd5\x63\x38\x59\x3b\x88\x93\xc6\x51\x9c\x6c\x36\x8c\x93\xe6\x71\x24\xa9\x28\x73\x2f\x6d\x59\x06\x72\xbf\x89\x6d\x40\x85\xb9\x54\x8a\x6f\xe3\xaa\xb4\xca\x2b\x52\xf4\x72\x53\x39\xe0\x12\xd3\x24\x3b\xc5\xd3\x59\x8c\x18\x2e\xa3\xf3\xe1\xfb\x4c\xbd\x1c\xea\xc4\xa6\x28\xae\x0c\x63\x9a\x36\xec\xb2\xbc\xa0\x3a\xe4\x2f\x61\xa6\xe9\x8b\x59\xd5\x91\xe5\x6b\x73\x90\x59\x1c\x2f\xbe\x2d\x1f\x2f\x6e\xe1\x8f\x0c\x27\x51\x26\xbc\x35\xae\xb3\xc6\xd9\x7c\x66\x2e\x3c\x85\xc6\x4f\x26\x8f\x30\x87\xac\x38\x0f\xab\xcf\x55\x73\xf0\x40\x7f\xb5\x5e\x8c\x3e\x07\x3e\x0b\x9f\x23\x9f\x81\xda\xd5\x1c\x5c\xb0\xfc\x38\x47\x34\x12\x57\x1b\xea\xd3\xa6\xad\x7f\xbc\x22\x31\xfe\x47\x6b\x82\xe6\x97\x57\xac\x45\x12\x5e\x8b\x64\x0c\x27\x93\xdb\xc0\x83\x0c\x80\xda\x11\xd8\x3a\x0e\xa6\xec\x2b\x60\x52\x3d\xea\x5a\xc5\xa6\x52\x5e\xc3\x68\xa5\x77\xca\xc1\xbc\xca\x97\x2d\x2e\x4c\x11\x0d\xe2\x6b\x4c\x6f\xbf\x6c\x4b\x75\x56\x94\x3c\xe6\x33\x60\xfe\xd8\x9c\x8a\xea\x7c\xee\x5a\x4a\x56\x0f\xee\x56\x29\x59\x29\xaf\x51\xb2\x8e\xf5\xc6\x38\xca\x9a\xab\x31\x6c\x38\x49\x5b\xc2\xd2\x0d\x53\xc3\xf4\xea\x2e\xf4\xe3\xad\x9d\xe2\x8c\x1d\xe3\x6c\x1e\xb3\x4d\x71\xd4\x47\x69\x1b\xd0\x53\xc5\xdf\x02\xb3\xf2\x39\xdb\x06\xfc\x4a\x40\xdf\x02\xcb\xca\x11\xdc\x06\x34\xcb\x50\x5f\x0f\xcf\xea\x79\xd8\xea\x52\xb1\x0b\x37\x90\x38\x9b\xab\x69\x3a\xd5\xc2\xb9\xd9\xeb\xc2\xcf\xd4\xfa\xe7\x73\xe2\xd6\x80\x78\x01\xb8\x93\xcc\xd1\xe3\xdf\x84\x8a\x0d\x47\x7b\x1d\x24\x75\x43\xfe\xff\x94\xbe\x75\x62\x6c\x42\xec\xca\x91\x65\x07\x91\xcb\x10\x7f\x7a\xbb\x2c\x5b\x4c\x22\x5e\xe0\x34\x92\xd2\x79\x55\x2b\x93\xc1\x5d\x1c\xa9\x54\xee\xe5\xb2\xf2\x04\x57\x15\x00\x74\x3a\xb5\x6f\xab\x36\xe7\xcd\x99\xe2\x02\x4d\x49\xec\xd6\xaf\x65\x51\x35\x2e\x91\x34\xc4\x32\x64\x91\x98\xea\x9a\xda\x7d\x07\x1d\x94\xf3\x8b\x13\x56\x30\xd2\x9d\x15\x84\xd2\xa4\xaf\x65\x22\xfb\xc8\x79\x95\x7d\xac\xb2\x2f\xba\x2a\xb5\x07\xc9\x49\x54\x5d\x58\x0e\xef\x7c\xa0\xbf\xac\x70\x62\x14\xc5\x77\x5b\x77\x7a\x80\x5c\xef\x5f\x4b\xa9\x86\x33\xf2\x55\xa2\xb9\xc1\xbe\x28\xfd\x48\x92\xe1\xc9\x9c\x62\xb7\x75\xaf\x4b\xcb\x04\x34\xe8\xb8\x09\x68\x8a\xef\x46\x40\x75\x5a\xad\x18\xec\x6a\x2a\x36\x1d\xcc\x2f\xd1\xb0\x01\xe8\x8b\x52\xf0\x0a\x65\x47\x68\x42\x2e\x88\xdb\x91\x57\x14\xdf\xdd\x8f\x76\x27\xf2\x49\x5e\xd9\x8c\xfd\x9c\x17\x05\xd4\xb8\xcf\x05\xf5\x45\x49\xc7\x0d\x6e\x27\x05\xa4\x89\xbe\x79\x4c\xfd\x33\xf8\xac\x18\xd6\x5d\xc8\x65\x5f\x60\xb0\x82\x5e\x16\xd8\xff\x29\x82\x89\x71\x6d\x4a\xaf\xd2\x2d\x09\x0d\xc4\xb2\x61\xfe\xcf\x50\x4a\x0e\x6a\x53\x32\xb9\xef\x61\x68\xa0\x97\x13\xf8\x8b\x6a\x62\x7f\x95\x77\x6c\x86\x28\x4e\xd8\x9b\xa6\xd6\x8b\xe2\x5a\xbd\xd5\x59\x0a\x36\xac\x3e\x53\x20\x9d\xe6\x23\xaf\xb8\x8c\xc4\x83\x9e\xf2\xb6\x7b\x50\x5c\x14\x23\xa2\xca\x1e\xf4\xe4\xdd\x18\x1e\xf4\xc4\x2c\xa6\xb1\x07\xbd\xeb\xa9\x07\x3d\x73\xf7\x87\x82\xf7\xa0\xa7\xdc\x9b\xe5\x6c\x06\xbb\xcb\xcf\xf0\xc0\xa8\x69\x7d\x83\x12\x74\x89\xa7\x38\x61\xd2\xf3\xb3\x29\xef\x38\x6e\xbd\x68\x60\x9c\x3a\xe4\xff\x99\xe5\x66\x0f\x6d\x53\xc2\x95\x6f\xd7\x68\xa0\x59\x09\xe8\x8b\x92\x4b\x5d\x01\x7d\xd0\x44\x0b\xab\xfc\x6f\x43\xe6\x4d\xad\x00\xd7\xc5\x1f\x4d\x04\xb6\x60\xbe\x28\x7d\x27\xb3\xb9\x3b\xfe\x3a\x9b\x57\xe7\xe1\x83\x13\x90\x17\x7c\xa6\x2d\x4f\xd1\xd4\xd9\x24\x45\xd3\xbb\xd1\x5d\x53\x67\x53\x8a\x97\x4f\xb4\x37\x90\xbc\x04\x54\xa3\xf9\xe5\x67\xf0\x85\x3a\x0d\xf6\x06\x4d\xae\x48\xb2\x06\xd9\x35\xb7\x97\x94\x70\x5e\x0d\xfb\xb5\x5d\xcc\xab\xaf\x2f\x29\x21\xbe\x12\xb4\x86\x77\x74\x17\x92\xab\x26\x49\xbc\x81\x9e\xbf\xe6\xf2\x92\x12\xca\xab\x61\xbf\xa8\x7e\x21\xde\xce\x14\xbe\x32\x77\xbe\x8c\x55\x5e\xd9\xdd\xd1\x35\x91\xe8\xb9\xc2\xd9\x77\x70\x35\x21\x9d\x12\xe2\x70\x36\x21\x9d\x03\xf2\xa7\x9c\x53\x8c\xa6\x71\xdc\x90\x5f\x55\x14\xbb\xeb\x1d\xc5\x28\xc1\x3f\xa1\x23\xe3\xba\x70\x85\x44\xdd\xb0\x2b\x1a\x54\xc2\x7b\xb9\x8c\x7d\x67\x41\xd5\xe7\x24\x9e\xc6\x76\x4f\x90\x2c\xaa\xc6\x54\x8d\x02\x73\xa6\xf4\xac\x33\x75\x41\xe2\x99\xbc\x21\xd1\xad\x52\xae\xab\xd5\xd8\x8b\x3a\x09\xb3\x6b\x8d\xa4\x70\x54\xed\x8a\x8c\xec\x95\xfd\xad\xad\xff\x79\x3d\x37\x86\xc6\xef\x50\x7f\x5d\xcf\x9f\x33\xce\xbb\x8d\xed\x73\xc6\xb3\x72\x0c\x89\xcd\x7d\x89\x9b\xe3\x56\x66\xee\x36\xe4\xeb\x6e\xc0\x62\x2b\xf9\x69\x65\x22\xa0\x95\xf7\x27\x94\xfa\x42\xfe\x54\x51\x9f\x60\x32\x3b\x9c\xb1\xfd\xa4\x61\xb1\xea\xe2\x86\x3c\xa5\x35\x49\x4e\xae\x0c\x27\x8b\x79\xb4\x63\x6b\x95\xb0\x29\x01\xae\x68\xeb\x55\x8c\xae\xd3\x95\x62\xcb\x02\x5b\x25\x6d\x94\xe6\xb2\xb6\x25\x0d\x58\x69\xab\xb0\xdb\x9c\x2d\x14\xc5\x8e\x7a\xea\xe9\xf1\x86\x6a\xa2\xb4\x52\x4b\xa6\x30\xed\xcc\x23\xc2\x5e\xa7\x97\x97\x24\xb9\x74\xcf\x63\x1d\xae\xd2\x90\xb4\x25\x9d\x7d\xcb\xa2\x0a\xbc\x7c\xa0\x84\xdd\x16\xd6\xdf\x72\x39\xf7\x5d\xdf\xab\x1c\x47\x66\xaf\x54\x74\xc1\xd1\x97\x2e\xac\xd4\xf9\x30\x3f\xc7\x34\xc1\x0c\xaf\xce\x9a\xa9\x42\xfd\xe9\x8d\x41\xa8\x85\x3f\x61\x14\xb3\xab\xdd\x2b\x3c\xf9\xb0\xa7\x33\xc6\x5c\x34\x6e\x04\x77\x4b\x14\x31\x57\x17\xbe\xfd\xbb\x16\x3d\x99\x4f\x0f\x2f\x7e\x4d\xe9\x07\x99\xed\xb7\x5c\x3a\xce\x15\x55\x60\x6a\x79\x3d\xcb\xe5\xa5\xc8\xe9\xa9\xb6\x4d\x2d\xcb\xd3\x49\x12\x1b\xa0\x2a\xbb\xb2\xab\xb3\x0f\xd8\x3d\x83\xaa\xac\x52\x43\xdd\xa5\x66\xdd\x80\xff\xe7\xf2\xfa\xae\xd2\xcc\xed\xc1\xe7\x05\x7f\x36\x48\x30\x5b\x95\x37\x37\x73\x65\xcb\x6d\x1c\x56\x28\x47\x4e\x57\x65\xc7\x19\x11\xce\xc5\x77\x9d\x7c\xd5\xe9\xbc\x31\x1c\xd0\x28\xbc\xca\x20\x9f\xe1\xef\xc9\x5c\x57\xf2\xc9\x5b\x5f\x56\xab\xf3\xeb\xaf\xf4\x2b\x69\xf4\x6b\xc1\xbf\xb6\x01\x65\x5d\x9d\x57\x33\x4d\xe5\xf7\x2f\xeb\x01\xd8\xf8\xb8\x5e\x83\x47\xe5\xae\x71\xf7\x5f\x66\x93\xf5\x51\xf6\xda\xf5\x7d\xb5\x28\x7b\x15\xe2\x1b\x4c\x53\xf9\x8e\x3e\x07\x86\x45\xe9\xb7\xc1\x6e\xb5\xa3\xa3\x0a\x50\xc3\x31\xbb\x53\x04\xfc\xd7\x93\xbb\x38\x38\x56\x5d\xc8\xe7\x40\xd4\x09\xf8\x6d\x88\xea\xbc\xb1\xcf\x81\xb2\x0b\xee\xcb\x46\xa4\x9b\xd6\xe3\x5f\xe5\xdf\x74\x0c\x6a\x13\x82\x95\xee\x11\x74\x10\xca\x2e\xff\xa2\x04\x42\x15\x64\x1b\x4e\xaa\xd6\xc1\x56\xb6\xd2\xe8\x8b\x76\x01\x7e\x69\x51\x6b\x29\x83\xf6\xf7\xec\x68\x7e\x1e\x57\x02\xe7\x19\x13\x89\xe0\xae\x14\x1a\x5e\x52\x0e\xb2\xcf\x26\x0d\xc4\x91\x97\x30\xde\x95\x4d\xe4\x94\xde\xd5\xc5\x69\x2e\xe5\x5b\xe3\xde\xd4\x70\xdf\xdc\xb5\xe9\x46\xb8\x11\xec\xeb\xb9\x34\x57\xdf\xce\xe8\xd0\x7f\x1a\x40\xbf\x36\x85\x57\x5c\xd4\xb8\xc6\x0d\xdb\x48\xe3\x6f\xe4\x82\xbd\xc9\x76\xec\x8b\x0a\xff\x9c\x01\x82\x26\x13\x9c\x65\x3f\xe3\xdb\xfd\x97\x6e\xc9\x53\x94\x57\x73\xbe\xf8\x5e\xd9\x28\xb1\xac\xf2\x72\x64\x46\xb0\x82\xb3\x8a\x2c\x2a\x0b\x1a\x71\x46\x72\x47\xe3\xe0\x16\x39\x65\x98\x4a\xfd\x8c\xdb\xcf\xa7\xe9\x07\xec\xee\xd3\x06\x10\x16\x4a\x95\xba\x55\xfb\xe4\x1c\x65\x9c\xd4\x3f\xa5\x19\x5b\x69\x44\xd7\xe1\xfe\x4e\x0e\xab\xbf\x8b\x93\x49\x4a\x08\x91\x8b\xfc\x2a\xa5\x53\xc1\xef\x27\x0c\x4d\x3e\x34\x10\xa5\x09\xfc\xaf\xf2\x26\x7d\xbe\x77\xe8\xdb\x78\x7a\xe2\x14\x45\xe7\x28\x46\xc9\x04\xd3\x93\xc9\x15\x9e\xe2\xfd\x84\x71\xfb\x3b\x76\x13\xa0\x19\xfe\xff\xa6\x0b\x29\x73\xba\x90\xb2\xec\xea\x67\x7c\xdb\xb8\xa4\x8a\xe2\xaa\x33\x68\x36\xf9\x73\x61\x30\xf4\xc9\x91\x37\x8d\x3e\xc9\x5c\x69\xf4\xe9\x0b\xe5\x47\x6f\x1e\x36\x9f\x51\x72\x8d\x18\x96\x2a\x56\xc3\x86\x50\x81\x29\xd7\x17\xaa\xe2\xea\xea\x25\x90\x52\xed\xb2\x5f\xc7\x59\xbb\xe2\xfa\x71\x65\x6a\x4f\x9a\x02\x32\x93\x7a\xd4\x85\x6b\xa0\x2f\x9d\xc0\xa2\xc4\x44\x1d\xae\x67\x93\x6f\xe0\xa7\xaa\x2b\x4e\x9b\xf8\xa8\x5c\xf7\x3b\xd7\x2c\xa3\x0a\x40\x4d\xb3\x49\xef\x84\x27\x6f\xad\xb4\x69\x6e\x86\xa1\xeb\x5a\x65\x27\xa6\x0e\xc0\x2f\xaa\x8b\x35\xa4\xc3\x89\x34\x38\x97\xe4\xad\x1d\x42\xa9\xdd\xa9\x75\xd7\x99\xae\x8d\x72\x23\x1d\xbc\xe1\xde\x66\x97\x0e\xee\x06\xfd\x16\x5e\x8e\xca\xc5\xcd\xce\x09\xff\xe5\x2e\x46\xfb\x9a\xc3\xcc\x6e\x41\xf0\x22\x4e\x27\x1f\xfe\x6a\x2e\x28\xed\x31\x4d\xc7\x64\x32\xeb\x78\x4c\xf6\x25\x8f\xc5\x7c\xb1\xcb\xd2\x94\x90\xfd\x1c\x9e\x2e\xdf\x52\xbd\x31\x53\xbb\x2e\xb7\x6e\xe2\x6a\x07\xec\xb7\x62\x6b\xfb\xf6\x6a\x27\x5f\x5b\x00\x35\x1c\x27\x9f\x4b\xdc\x8d\x7d\xa2\x95\x3b\xad\x1b\x44\x6d\xa3\x5b\xf9\x5b\xe4\x5a\x7e\x49\x0f\x23\x1f\xde\x6b\xb5\x68\x37\x23\x96\xe3\xd6\x6d\x27\xd1\xea\x70\x5f\x74\x7b\xba\x68\x0e\x33\x5f\xb8\x82\xcc\x77\xc9\x08\xcf\xc8\xa7\x06\xa5\x97\x7c\xaa\xc2\x32\xd2\x10\x58\xe7\x05\x15\xd8\x4f\x69\x82\x1d\xc2\x4e\x7c\x16\xa2\x4e\xfc\xb5\xf2\x48\xfd\x67\x8a\x1c\x7b\x32\xee\xec\x25\x2c\xee\xa4\x5e\xe7\x27\x34\x90\xdf\xde\x53\xd8\x80\xf4\x0a\xc0\xaf\xee\x2d\x6c\xbc\xa8\xbc\x59\x57\xf9\x5b\x7a\x0c\x1b\x48\xbd\x0a\xf2\xef\xe2\x35\xac\x29\xe9\xcb\x65\xea\xbb\xbe\xff\xad\x32\xab\xbe\x94\xa3\x4a\x6d\x92\x1b\xf9\xaa\x2c\xd8\x15\x2d\x4a\x13\x76\x6d\x63\x12\x6c\x6d\x3b\x8d\x69\x84\x6e\xd0\xbf\x2c\x7b\x8a\xa6\x09\xc3\x49\x74\x24\x8d\xfc\xfd\x99\x7b\xd7\xa9\x42\x7d\xb9\x9c\xaa\x4c\xb5\xa9\xd6\xbd\x7b\x18\x55\xa8\xbf\x89\xeb\x4d\xdf\x3e\xb0\xc2\x58\xf8\x9b\x7b\xd5\xdc\xc3\xad\x02\x39\xfc\x6a\x93\x95\xa9\x59\xc2\xe0\x5c\x99\x9b\x25\x20\xea\x5e\x39\x19\x7a\xfc\xb9\x39\x43\xcb\x00\x54\x1d\x3b\xab\x96\xd4\xb5\x7b\x11\xf1\xcf\x8d\xd2\x4a\x17\x3a\xea\x1c\xaf\x1d\x65\x0d\xca\xe9\x4b\x5a\x27\xa2\x6a\x50\x8d\x1e\xa9\x15\xa2\xa9\x0a\xb4\xa6\x8d\x46\x1a\xba\x00\x3f\x53\x61\xfb\x9c\x3c\xac\x35\x0f\x73\x94\xb5\x8a\xd5\xc0\x5f\x74\x7f\xce\x18\x62\xf3\xcc\xbd\x7a\x65\xd9\xdd\x89\x64\x23\x7e\x22\xda\xb8\xab\x5a\x6b\xbf\x00\xb1\x46\xaf\xb5\x40\xbf\xb9\x62\xdb\x88\xf6\x2a\xc8\xaf\xad\xda\xae\x78\x1c\xc4\xa1\xdb\x36\x43\x7f\x7b\xe5\xb6\x91\xdc\x2b\x41\xff\x26\xea\xed\x7f\xad\x92\xfa\xdf\x16\x61\xfc\xaf\x55\x59\x3e\x4b\xea\x7e\xc6\xde\x74\xe7\xd7\x4a\xa6\xe2\x59\x92\x6b\xf1\x5a\xc9\x54\xbd\x5c\x12\x11\xf8\x7d\xf1\x6b\x76\xe2\x78\xb3\x64\xba\xf1\x9b\x25\xf0\xbc\x7c\xbb\xe5\x82\xef\x44\x64\xc2\x07\x7c\x9c\xa6\xcc\xc7\xe1\x22\xd7\x78\x2d\x92\xcb\x37\x69\x34\x8f\x71\x9f\x41\xf3\x9e\x4f\x7f\x14\x04\x81\x5c\xc4\x58\xbd\xff\x32\x1c\x2d\x54\x71\x5f\x60\x3b\xcf\xf0\x2f\x28\x9e\xe3\xbe\x06\xc8\xc7\xfd\xd1\x18\x06\x41\x80\xc5\xd5\x98\x87\xf2\xd1\x9b\x52\xb5\xd9\x89\x5d\xcd\x82\xb2\xea\x5e\xf2\xa9\x39\x56\xb3\x52\xae\x1e\x1f\xf1\xea\xbb\x7c\x4c\xfd\x5b\x5e\x85\x7f\x1a\x8f\xef\xfe\x5e\x4c\x41\xd8\x69\x1a\x85\xd3\x20\xdd\x79\xe1\x2f\x38\x2b\xf5\x19\x27\xa1\x2a\x23\xc9\x7f\xc2\x69\x30\xf9\xe7\x89\xbf\x28\x1e\x83\xf9\xfe\xbb\x1f\x1e\x3d\xd9\xe8\x31\x98\xeb\xdf\x5d\x8f\xc1\xe4\x10\x7d\x70\x7c\x4f\x8a\x97\x60\xe4\xcc\xc9\xef\x3e\x0b\xc9\x72\xe9\x13\x3e\x5f\x20\x38\xde\xfb\xd7\xdb\xfd\xe3\xbd\x97\xa1\x47\xf1\x1f\x73\x42\x71\xe4\x41\x16\xfc\xfa\xd3\xfe\xe9\xde\xc9\xd1\xce\xee\x5e\xe8\xdd\x5c\x11\x86\xb3\x19\x9a\x60\x5e\xb2\xf7\x66\x67\xff\x75\xe8\x89\x0b\xea\xf9\xef\x5f\x76\x5e\xef\xbf\x3c\xdb\x3f\x0a\xbd\x6b\x14\x93\xa8\xb5\x7f\xd4\x42\x51\x44\x71\x96\x15\xa5\x3f\x1d\x9e\x9c\x5a\x20\x57\x69\xc6\x2a\x70\xbb\x87\x6f\xde\xec\x9c\x9d\xec\x1d\xed\x1c\xef\x9c\xee\xf1\xf6\x4e\x42\x6f\x92\x4e\xa7\xa8\x95\xe1\x19\xa2\x88\xe1\xa8\x45\x66\x4d\xb0\x67\x87\xc7\x67\xbb\xfb\x2f\x8f\xdd\x95\x5a\x29\x6d\x4d\x48\x44\x65\xed\xfd\x97\xc7\x67\x87\xbf\xec\x1d\xbf\xde\x39\x12\x75\x42\x8f\x97\xb5\xd2\x6b\x4c\x63\x34\x13\x80\x06\xee\xd7\xfd\xd3\x9f\xf6\x0f\x6c\xb0\x1b\xc2\xae\x48\x62\xa0\xe4\xf8\x5e\xfd\xeb\xe5\x81\x1e\x1c\xff\xdb\xa6\x0b\x47\xcd\x2e\xdf\x3f\xe2\xe8\x68\xa8\xd3\xe3\x9d\xfd\xd7\xfb\x07\x3f\x9e\x9d\xbc\xde\x39\xf9\x29\xf4\x92\xb4\xc5\x28\x22\x31\x49\x2e\x5b\x59\x8c\xb2\x2b\x0e\x74\xf2\xf6\xc5\xc1\xde\xe9\xd9\xfe\xc1\xd9\xf1\xce\xc1\x8f\x7b\xa1\x27\x03\x3c\x1a\x17\x8a\x92\x4b\x31\x35\xfb\x47\x1c\x46\x41\x2b\xd0\xfd\xa3\x16\xe1\x3b\xb0\xa8\x60\x43\x1e\x1c\x9e\x3a\xa1\x93\x94\xb9\x6a\xc8\xe1\x1c\x1d\x1e\x9f\xea\x81\xc8\xd7\xb8\x44\x5b\xaa\x36\x99\x49\xf8\xd6\x05\x4d\xa7\xad\x6c\x8a\xe2\xb8\xc5\xd2\x56\x8c\xa8\xe9\x55\x40\x6a\xf2\x5b\x35\x14\xf5\xe5\xf4\x1e\xbc\xda\x3f\x7e\x73\x76\xb4\x73\x72\xf2\xeb\xe1\xf1\x4b\x3e\xa5\xc9\x05\xa1\xd3\x96\x3e\x6b\xc2\xa1\x0e\xde\xbe\xd9\x3b\xde\xdf\x3d\x3b\x3c\x78\xfd\x5b\xe8\x25\xf3\x29\xa6\x64\xd2\x4a\x93\xf8\x96\x97\x1e\xed\x9c\x9e\xee\x1d\x1f\x84\xde\x0c\x31\x86\x69\xc2\xbf\xfd\x78\xbc\xb7\x73\xba\x77\x7c\x76\xfa\xd3\xce\xc1\xd9\xef\x7b\xc7\x87\xa1\xca\xfd\x68\x5d\x0a\xa5\x8a\xb6\xd8\x15\x4a\x5a\x9f\x30\x4d\x39\xf8\x9b\xfd\x83\xd0\x9b\x12\x51\xf5\xcd\xce\xff\x86\xde\x14\x7d\x54\xdf\xcf\x5e\xef\xc9\xb2\x18\x27\x97\xec\x4a\x41\xa8\xaf\xe8\x63\xf1\xf5\xe0\xd0\x70\x9a\x60\xe8\x24\x35\x6c\xd6\xc0\xcb\x7c\xc0\x0e\x26\xe6\xa3\x16\xf0\xfb\x07\xbb\xaf\xdf\xbe\xdc\x3b\x39\x7b\x7b\xfc\xfa\xec\xd5\xf1\xce\x8f\x6f\xf6\x0e\x4e\x45\xc3\x73\x1a\xb7\x2e\x28\xba\xe4\x7b\x7c\x09\xf2\x5f\x6f\xf7\x8e\x7f\x3b\xe3\x1d\xbc\x91\x28\xfc\x31\xc7\xf4\xb6\x25\xdf\x4c\x93\x58\x0a\x4e\x78\xb9\x73\xba\xf3\x7a\xff\x44\xb4\x26\x58\x20\x42\x0c\xc5\x24\x63\x92\x4f\xdf\xee\x85\x1e\xa3\x73\x31\x91\x07\x7b\xa7\xbf\x1e\x1e\xff\xcc\xf9\x76\xff\xe8\xec\xed\xc1\xfe\xbf\x78\x69\xb1\xd9\xb6\x32\x86\xf9\x10\x5b\xf3\x84\xfc\x51\xab\x72\x70\xf8\x72\x4f\xd7\xab\xd7\x4a\xd2\x08\xaf\xad\x7a\xb2\x7b\x78\xb4\x77\xb6\x7f\x70\xba\x77\x7c\xb2\xb7\x7b\xba\x7f\x78\x50\x6a\x68\xff\x48\xb1\x15\x11\x77\x5d\x61\xf9\x92\xd4\xaa\xa6\x6a\xb8\x20\x8a\x51\x8b\xab\x5d\x88\x24\x59\x4b\x15\xb4\xf6\x8f\x78\x2b\xaf\x5e\x1f\xee\x9c\xaa\xc1\xeb\xf9\x95\xeb\x28\xf4\x2e\xe2\x14\x31\xde\x00\x99\x99\xb9\x96\x6b\x49\xac\xa2\xd7\x3b\x07\x67\x87\x6f\x4f\xcf\x0e\x5f\xe9\x45\x73\x1d\xa3\xa4\x95\xce\x59\x2b\xbd\x28\xad\x4f\xb9\x52\x34\x17\xf2\xe6\x84\x73\xb5\x25\xff\x36\x90\x3b\xbf\xec\xec\xbf\xde\x79\xb1\xff\x7a\xff\xf4\xb7\xb3\xdf\x0f\x0f\xf6\xcc\x74\xd8\xc9\xde\xad\x4f\x69\x82\x2d\x92\xca\xd5\x7c\xbc\x77\x72\xf8\xf6\x78\x77\xef\xec\xc7\xe3\xc3\xb7\x47\x67\x07\x3b\x6f\xf6\xf4\xe2\xd6\x1e\x95\x96\xb8\x5c\xa7\x95\xa0\xa9\xa8\x27\xdb\x76\x57\x94\xad\x37\xd5\xfc\xe9\xf4\x54\x88\x42\x71\xcb\x79\xe8\xf1\x6d\x9a\xcb\x41\xfe\xaf\xb5\x51\xec\xbe\x7e\x7b\xc2\xd7\xa8\x6c\x51\xa9\xcd\xa2\x8d\x96\xc0\x8b\x43\xbe\xde\x79\xb1\xf7\xda\x8c\x52\x68\x97\xd6\xc8\xf4\x77\xfd\x85\x88\x0d\x50\x2a\x30\x49\x75\x1b\x4c\x96\x4b\x3f\x11\xdb\xe0\x88\x05\xfb\x27\x67\xd5\xd5\x28\x96\x43\x77\x1c\x7a\x0d\x65\x1e\x64\xb2\x62\x79\x74\x3d\x59\xa3\xf4\xd1\x80\x1e\xbc\x7d\xf3\x62\xef\xf8\xec\xe8\xf0\x64\xff\x74\xff\x97\xbd\xf0\xa1\x04\xae\x7c\xb6\xc1\x0b\x39\xf7\xc8\xc0\x9a\x6f\x06\xf0\xe4\xf4\x98\xb3\x24\xdf\xb1\x38\x83\x95\x56\xfd\x63\x59\x6f\x05\x48\x53\x33\x25\x31\xf3\xc4\xd9\x8c\x0d\x62\x9a\x11\xf2\xe2\xa9\x84\xe7\x7f\x9b\x02\xc7\x3c\x7f\x27\xc1\xea\x25\x95\x4a\x62\x17\xfd\xde\x06\x56\xbb\x68\x15\x88\x13\x7d\xff\x28\xfc\xa1\x0a\x2a\xbf\x37\x56\xd0\xb3\xd7\x75\xd7\xab\xcc\x63\xad\x58\x30\x4b\xaf\xd7\x50\xb9\xc4\x2e\xd5\xd2\x5f\x9e\x86\xbd\x87\xee\x8a\xbf\x3c\x5d\x51\x4b\x63\xfc\xa8\xa9\xae\x13\xe7\xfd\xa3\xb0\xf7\xd8\xae\x51\xa3\x89\x19\xcd\x93\x32\x98\x6b\x14\x5c\x95\x90\x52\xf5\xec\x64\x4f\xf2\x49\xef\x69\xa5\x5a\x05\xa0\xd6\xc2\x2f\x4f\xeb\x6d\x7c\x57\x6e\xa3\x0e\x52\x69\x45\x8a\x85\xc3\xe3\xb3\x9d\x83\x83\xc3\xd3\x1d\xb1\x27\xf4\x4a\xdc\xe2\x80\xa8\xb4\x21\xd4\x9b\x5e\x89\x6f\xf8\xa7\x0a\x94\x4b\xfa\x3d\x2c\x31\x8d\x03\x42\xb6\x71\x70\x78\x26\x34\xeb\x33\xa9\x5a\x3f\xe4\xdc\x52\xfe\x66\xe0\x2a\x9a\xe1\xc3\x87\x12\xb4\xfc\x59\x42\x1f\xff\xaf\x16\x87\x0f\x39\x27\x98\x9f\xa6\x54\xeb\xf8\x67\xfb\xaf\x38\x86\x1c\xf0\xb1\x04\xac\x95\x38\xeb\xfc\xbc\xf7\x5b\xf8\xf0\x49\xbd\xc6\xcf\x7b\xbf\x79\x30\x29\x24\x6c\x0e\xbf\x7b\xfc\x43\xf7\xf1\x46\x96\xcc\x9b\x3d\xb7\x25\x73\xea\x7a\xee\x32\xc9\xe1\xef\x9f\x1c\xdf\x51\x0e\x7f\x9d\x3a\xbe\xc7\x39\xfc\xd7\x89\xe3\x7b\x96\xc3\xa3\x6b\xc7\xf7\x94\x5b\x4a\xf2\x55\x5b\xc2\x75\x38\xed\x2c\x79\xa0\x6f\x9a\x13\x63\x5c\xb1\x7f\x04\x27\xa7\x3b\x07\x2f\x77\x5e\xf3\x0d\x58\x89\xb0\xd0\xcb\x18\x4a\x22\x14\xa7\x09\xd6\xed\x3c\x98\xa6\x91\xd8\xa6\x6c\x31\x77\x56\x98\x60\x1a\x8c\xef\x78\x0f\x0a\x7b\xcc\x22\x31\x44\x55\x24\xd0\x72\xe9\x23\x89\xc4\xcb\xbd\x5f\x42\x2f\xc2\xd7\x42\x05\x3e\x3e\x7c\x19\x7a\x33\x9a\x46\x1e\x44\x56\xfd\xb8\x5a\x3f\x5e\x2e\xfd\x58\xd6\x2f\xbc\x44\x36\x11\x84\x09\x62\x86\x62\x0f\xcb\x83\xb1\xd5\x72\x56\x6d\x39\x5b\x2e\xfd\x4c\xb6\xfc\xfa\x25\x57\xf7\xe5\x43\x82\x9c\xbd\x0f\xb8\xbe\x28\x5a\x60\xc1\xe1\xfe\xcb\xdd\x50\xbd\x35\x98\x59\xed\xa5\xd5\xf6\xd2\xe5\xd2\x4f\x65\x7b\xbb\x7b\xdc\x9c\x34\xfe\xb8\x57\x29\x9d\x0a\xbd\xe9\xe5\xde\xc1\xe9\xfe\xe9\x6f\xa1\xa7\x1d\x5f\xba\xe4\xf5\xe1\xce\xcb\x17\x3b\xaf\x77\x0e\x76\xf9\xcc\xc4\x29\x8a\x5e\xa8\x84\x75\x0d\xf1\x66\xef\x74\x87\xeb\xc0\xa1\x37\xc5\x0c\x71\xe5\x57\x97\x28\xc1\x63\xf4\x43\xfd\xfd\xf0\x64\xff\xcd\x0e\xd7\xe1\xd2\x4c\x24\x64\xc9\xef\xa9\xbd\x1e\x9e\xf4\xbe\xfb\xbe\xbb\xd1\x7a\xb8\x72\xb2\xb7\xf5\x94\xeb\xa3\xa7\xdf\xfd\x20\x5f\x72\x7d\xf8\xe8\xc9\x13\x30\x90\x6e\x18\xa4\xdd\x30\x28\x8a\xd4\x45\x34\xba\x17\x16\x58\xdf\x30\xa4\x70\x81\xa7\x84\xed\x5d\xe3\x84\xf5\xdb\xbd\x1c\xe4\x45\xcd\x97\xb7\x09\x9a\x92\x49\xa5\x01\x9f\xff\x11\x76\x41\xf8\x9c\x86\xcf\x7d\x36\xa2\xe3\xe5\x92\x8d\xf0\x18\xf8\x00\xf8\x8b\x5e\x5f\xcc\x0e\x47\x0f\xc1\x58\xad\x9e\x2c\xf4\xa5\x87\x27\xf4\xe3\x50\xff\x85\x42\xdc\xe9\x78\x5e\x3b\x0c\xf1\x10\xf7\xf9\x57\xd0\xe9\x98\xf4\x2c\x34\x44\x7d\x1a\xa8\xd7\x7f\x85\x1b\xc7\x2e\x8d\x87\x71\x7f\x44\x83\xc9\x15\x89\x23\x8a\x93\x80\xe2\x68\x3e\xc1\x02\x33\x20\x90\xc2\x22\x1f\x69\x1c\xe2\x52\x13\x90\x01\xb8\xc8\xc1\x18\x04\x53\x34\xf3\x59\xf8\xdc\xbc\xb2\xbe\xc8\x07\x17\x29\xf5\xc5\xcf\x11\x82\xf1\x38\xbd\x68\xa9\x37\x3a\x70\xc2\x28\x11\x69\x75\xfa\x89\x6b\x16\x5a\x5d\x5f\x88\xd7\x1c\xc2\xe7\x32\x03\x2a\x0c\x43\xc4\x79\x3e\x09\x7e\x0f\x2e\x08\x8e\xa3\x37\x68\xf6\x96\x71\x6d\x9b\xe0\x4c\x1c\x85\xe7\x0a\x2b\x62\x29\x55\x59\x4b\x60\x80\x47\x68\x1c\x26\xf8\xa6\x45\x82\x83\x7d\x3f\x86\x19\xc8\x0b\x27\x52\x8b\x04\x93\x1b\x1f\x83\x1c\x0c\x4a\x13\x47\x45\x6f\x50\x42\x1c\x62\x3f\x03\xb5\x79\x84\x5d\x39\x15\x12\x67\xb4\x31\x4a\x74\x55\x57\x07\xfb\x3e\x86\xa8\xd6\x19\xcc\x30\x3b\x25\x53\x9c\xce\x99\x5c\x9d\xc6\x39\x9d\x8d\x64\xfd\xb1\xb8\xaa\x99\x4f\x82\x18\x4d\x0e\x1f\x4a\xec\xf2\x1c\xf8\x54\x03\xcb\xbc\xfb\x3c\x87\x4f\x9e\x74\x7f\xd8\xec\x1d\xe4\x63\xc7\x02\xb9\xb5\x17\xc8\x77\x4f\x9e\x3e\x7e\x28\x56\x48\x90\xf8\x84\x4b\x4a\xea\xf7\xbe\x7b\xf4\xb4\xcb\x85\x1e\xf5\x1f\xff\xd0\x7b\xd4\xe3\x33\xc6\x8b\x63\x2d\xee\xd3\xd0\x66\x0e\x16\x64\xb3\x98\x30\xdf\x0b\x3c\xf9\xa2\x0f\x0d\xbb\x82\x5d\xf8\xdf\x24\xec\x0e\xc8\x33\x1c\x48\xfb\x7e\x40\xb6\xb6\x00\x7d\xf6\x2c\xfc\x1e\xd2\xad\x70\x86\x68\x86\xf7\x13\xe6\xe3\x11\x19\xc3\x5e\xd7\xbc\x75\x4e\x9f\x3f\x7f\xde\xcd\xe1\x84\x77\xb3\xfd\x6f\xff\xe1\x93\x51\xf7\xc1\x93\xf1\xf2\xe1\xa8\xfb\xe0\xf1\x78\xd4\x7d\xf0\xc3\x78\x39\xea\xf6\xc6\x43\xf1\xa7\xf8\xcf\x10\xbc\x0b\xbe\x0d\xdc\xbd\xed\x80\x89\x97\xd3\x03\x46\xc9\xd4\x07\x00\x46\x6e\xea\x6c\x7b\x7a\x7c\x6d\xff\x21\x5f\xd6\x8a\x26\xcb\x65\x7b\xe2\xe3\x51\x77\x0c\x40\xa7\x83\x47\xbd\x71\xa7\xb3\xc5\xff\x79\x1e\x76\xd5\x5f\xcf\x1e\x3d\xcc\xe1\x5c\x12\x63\x84\x1e\x7c\xe2\x1d\x6f\xf9\xa3\x07\xc1\xd8\xfc\x02\xf7\xdf\x05\xfc\xc7\x78\xf1\x10\xe6\xf7\xb6\x49\x15\xa7\x2b\x51\xdb\xf7\x85\xe9\x08\xfa\xef\xb6\xc1\xbb\x6d\x7f\x93\xb6\x80\xef\xbf\xdb\x7e\x77\xb3\x05\xee\xfb\xa3\x77\xdb\xe3\xe0\x3e\x18\x82\x2d\x47\x07\xb3\xc6\x41\x43\x1a\xa6\x72\x7c\x90\xd8\x53\xde\x13\x53\xce\x39\xaf\xf3\xa0\xf7\xec\xd9\xa3\x87\x0f\x88\xa2\xcf\x28\x81\xc9\xd6\x1b\xc4\xae\x82\x59\x7a\xe3\x3f\x84\xbc\x08\x3c\xe8\x8d\x73\x78\xa1\x88\x20\xf0\xb4\x28\x9f\x9e\x88\x30\x84\x0f\x34\x3e\x82\xbf\x2f\x43\xea\x0b\x2f\x31\x80\xd3\x90\xfa\x4f\xbe\xef\xf5\xbe\x93\xcf\x4f\xc9\x97\xa8\x5c\xcf\x4f\x95\x5e\x9c\x02\xf2\xd9\xf5\x8c\x4c\x67\x31\x36\x72\xe0\x0d\x9a\x09\x81\xf4\x06\xcd\xfc\xd1\xe8\x32\x40\x1f\x9a\xcc\x60\xf9\x3c\x15\xc9\x76\xd3\xe9\x14\x9d\xe0\x19\x16\x8e\xa9\xd7\x24\x63\x3e\x18\x43\x53\xb5\x64\xf3\xea\x3a\x3f\x31\x36\x3b\xa4\xfc\xbf\x59\x09\xb8\x62\xf3\x6a\xf0\x03\xe1\x95\xfb\x51\x3a\xe5\x4e\xaf\x50\xf2\x3b\xa6\x69\xb5\xa2\x31\x80\xad\x5a\x98\x92\xc9\x61\x12\xdf\x96\x60\x57\x18\xbd\xba\xaa\xa4\xf8\xaf\x84\x5d\xa5\x73\xf6\xaf\x39\xa6\xb7\x32\x42\xb3\xaa\x1d\xdb\xea\x75\xb6\xf3\x96\xc6\xaf\x94\x3b\xae\xd4\x0e\xb7\x86\x75\x85\x53\x3a\xc7\xa5\xc2\xba\x0d\xac\x41\xc5\x94\xed\x16\x71\x44\x47\x35\x6e\xf8\x95\xc0\x5f\xfd\x11\x25\x0d\x70\xd2\x40\x2c\x41\xef\xcf\x0e\xe9\xda\x1a\xe5\x89\x2d\xd5\xe3\xe3\x16\x73\x7c\x44\x53\x96\x4e\xd2\x78\x75\x43\x2e\xa6\x92\xde\xce\xfd\x59\xb6\x01\x26\xbf\x3c\xad\x60\x71\xfd\x74\xa3\x5a\xce\x11\xe8\xba\x9b\x8c\xa1\x46\x36\x27\x4c\x69\x7c\x0a\x30\x73\x43\x56\xec\xda\x4a\x25\x75\x22\xe1\x04\xd7\x59\xa9\xd9\x36\xae\x0d\x6f\x6d\x2b\x0e\xe3\xb8\xd4\xc8\x6b\x74\x8e\xe3\x43\xba\x63\x42\xe7\x8e\x36\xb8\xad\x5c\xaa\x74\x94\x52\x57\x5f\x0e\xf3\xb8\x54\xad\x94\xe4\x54\x66\xf6\xb2\xb1\x2c\x6b\x25\xe9\xaf\x26\x42\x75\x98\xec\x25\x51\x56\x82\x2f\x5b\xcc\xba\xca\xa9\x8a\xb2\x9c\xc4\x28\xbb\x2a\xe0\x8d\xed\x0c\xa7\xc1\xee\x9b\x40\x7a\x11\x4b\xc5\x35\x8b\x59\x42\x6a\x63\xcd\xe7\x52\x57\xbe\x9e\x86\xe2\xbd\x8f\x33\x2a\x4f\x86\xf7\x95\xc2\xda\x6e\xab\xa7\xe0\xf2\xa6\x36\x7f\xde\xfb\xed\xce\x2d\x7e\xc0\xb7\x39\x18\x8f\xc5\x91\x83\x93\xb2\x84\xb7\xf2\x27\x1a\x36\x00\xae\x18\xfa\x0c\xe4\x16\x3f\x9b\x1a\xa5\x7d\x50\xe0\xad\xf5\x1a\x3c\x9c\xf8\x18\x0c\xb9\x32\xdf\x5f\x8c\x2e\x83\xeb\xdf\x4d\xc4\x6b\xdc\x6f\x77\x73\xa1\xe6\xe7\xb9\x6b\x6e\x36\x69\xbd\xd3\xd1\x3a\x85\x50\x2f\x6a\xbb\xa2\x2a\x1c\xaa\xae\x8b\x70\x65\xb9\xf3\xca\x2c\x6f\xd6\xb3\xb7\xed\x85\xbc\xd3\x6c\x7e\x9e\x31\xea\x6b\x44\x1e\xf4\x80\xee\xae\xcc\x52\x76\x97\xf6\x5a\xdf\x88\x8a\x58\xab\x17\xd0\x33\xb6\xca\x84\x5b\x20\x15\x4b\x87\x75\x3a\x18\xb6\xbb\xeb\x29\x5e\x92\xfd\x1b\xa1\x30\x77\x4f\x24\x17\x9a\xce\xa1\x69\x31\xbb\xaa\x71\x72\xe1\x63\xa0\xca\x39\xa3\x2c\x97\x0d\xbd\x14\x01\x52\xd1\x97\xd5\x4d\x21\xcf\x37\xed\x28\xf3\x41\x70\xfd\xf4\xf3\x7a\x6b\x94\xff\x1b\x76\xce\xe7\x6d\x5b\xa8\xa4\xc3\xfe\xbb\xed\x77\xdb\xff\x65\x9a\x3e\x10\x54\xbb\xfa\xdc\x39\xfa\x73\x74\xb3\xca\x25\x3a\x90\xca\x08\x51\x7f\xbb\xbc\x14\xbb\xf0\x3b\xae\x79\x8b\xb2\xac\x5e\xf8\xbd\x54\x83\x13\x6e\xa7\x5d\xf8\x14\x24\xe1\x77\x03\x1c\x67\x78\x41\x2e\xfc\x36\x51\x1d\xb6\x7b\x83\x24\xfc\x3e\xd7\xb6\xb2\xae\xce\x85\x4b\x02\xf5\x5a\x37\xe6\x9b\x62\x29\x04\xf2\xbb\x52\xa8\x59\x19\xbc\x0b\x47\xf9\xff\x6f\xf4\xee\xe6\xdd\x83\xf1\x16\xa8\x1b\x2a\x1c\x23\x2d\x91\x9c\x71\xe1\xf2\xea\x6d\xd6\x72\xef\x84\xd0\xbb\xe1\xf2\x5d\x07\xf8\xa3\x7f\x87\xe3\x2d\xf0\x2e\xf4\x47\xff\xee\x8c\xb7\xc0\xf6\xe5\x26\xc8\xd9\xca\xb7\x43\xb4\x48\x75\x61\x23\x99\x75\xe1\x9e\x07\xae\x81\x38\x1a\x96\xc9\xc5\xd6\x56\x88\x4d\xdb\x34\xc4\xc5\x48\x29\xe0\xac\x32\xf1\xa9\x71\x00\xe1\x30\xf5\x29\xe7\xb9\x0a\x06\x13\x9f\x80\x61\xe1\x85\xe2\x46\x7e\x07\xf3\xff\x02\xfe\x9f\x30\x14\x5f\x80\x8f\x61\xea\x13\x50\xc6\xb4\x92\xcd\x61\xa1\xab\x72\xa7\x1c\xb2\x3d\xb7\x52\x20\xcd\xa8\x4a\xd6\xc0\x86\x9b\xcd\x9f\xd8\x53\xfd\x92\xd1\xae\xfe\x7d\x10\x8c\x17\x5d\xf8\xb8\x9b\xeb\xef\x4e\xc9\xe2\x98\x29\xdb\xc6\x71\xcc\x98\x43\xdd\xfc\xeb\x47\xa8\x2b\x3f\x7f\xfa\x48\x83\xa8\xbc\x0e\x07\x05\x76\x1e\xfc\x3e\xf6\x8b\xbf\xdf\x3d\x78\x77\xf6\x2e\x18\xdf\xb7\x4a\xc1\xf0\xcf\x13\x63\x7f\xb6\x9f\x68\xee\xb5\x32\x6a\xa9\xa1\x01\x09\x69\xc1\xbf\x44\xf1\x2f\x31\xfc\x4b\x43\xce\x80\x30\xd1\x5c\x0e\x51\x9d\x93\x11\xe8\x74\x26\x7e\xa2\xf8\x19\x52\x10\x3e\xe7\xcd\x28\xae\xa6\x16\x57\x4b\x0e\x37\x3d\xb3\x7f\x63\xe3\x06\xea\x86\xa1\xc8\x2a\xf3\xc9\x92\x0a\x68\x50\x90\xff\x21\x08\x48\x12\xe1\x8f\x87\x17\xbe\xd7\xf5\xc0\xb3\xae\xf6\x7b\xb6\x7b\x39\xf0\x29\x4c\x7d\x04\x60\xea\x27\x95\x85\x52\x4f\x67\xfa\xac\xb5\x52\x90\xf0\xe1\xdd\x24\x00\xdf\x4b\xb0\x70\x62\x0f\x18\xbd\x5d\x60\xe1\x29\x41\xc1\x01\x66\x53\x94\x7d\xe0\x2a\xf3\x04\xb1\xc9\x15\xa7\xba\xdd\xa5\xee\x20\xd0\xd9\x23\x3e\xdd\x68\x5c\x9b\x0f\x69\x76\x28\x13\x4b\xbe\x16\x63\x74\x3a\x05\x67\x34\x72\x45\x79\x1e\x8b\xa1\x3a\xf2\xcc\x3e\x63\x1a\x27\x24\xa2\x6a\xd4\xbb\x24\xa2\xab\x27\xb2\x2e\xae\x69\xa7\x13\xf9\x14\xf0\xff\x12\x3d\x1c\x60\x55\x9c\xf9\x4c\xb8\xf4\x7c\x5c\x38\x36\xe9\xa8\x3b\x7e\x4e\x46\xbd\xf1\x72\x49\x47\xbd\xf1\x33\x32\xea\x8e\x81\xe0\x57\x62\xc6\x57\x4b\x26\xb4\x57\x2f\xc7\xf9\x57\x91\xa2\xf7\xa7\x51\x1e\x6e\x80\x71\x4b\x20\x1c\x72\x34\x3b\x1d\x81\x71\xc8\xb1\xd7\x18\xdb\x1c\x58\xcd\x6d\x74\xaa\xf9\x55\x97\xc1\x5a\x2d\xc1\xc4\x4c\x70\xdd\x4f\xdc\x7a\x28\xd3\xc4\xa5\xfc\x9d\xf8\x8c\x13\x73\xc8\xa4\x8b\x98\x19\x17\x31\x93\x2e\xe2\x15\x46\xce\xc6\x1f\x9d\x5b\xa6\xcb\x15\xf2\x05\xc7\xa5\xb4\xc5\x55\x83\xeb\x3d\xfc\xfe\xaf\x18\xdd\xfe\xec\xad\x74\x55\x94\xb9\x8c\xe3\x2f\x87\x02\x6a\xd2\xce\x44\xc1\x5a\xb8\x25\x4e\xca\x73\xf1\x27\x14\x6a\x59\xa1\xb4\x34\x5d\x19\x7f\x4a\xd5\xcd\x55\x7a\xe6\x91\xca\xce\x5c\x23\x64\x35\xb5\x87\x74\x48\xe5\xcd\x9e\xfc\xb3\x59\x50\x95\xe4\xcf\x82\x33\x35\x19\xb4\xaf\xa4\xcc\xb3\x25\xef\xef\xe7\x69\x90\xb6\x53\xb9\xb4\x8c\x2b\xce\x49\x65\x95\x5a\x7e\x95\x06\x13\x5e\x9c\xc0\x68\x34\xe4\xf3\x15\x6e\xcf\xcd\xfc\x14\x6d\xe1\xd0\x69\x40\xaf\xd0\xbe\x9d\x16\x8a\x4d\x38\x97\xb3\x7d\x03\x0c\xe4\xa5\x1d\x21\x96\x44\xac\xbd\x92\x85\x97\x4b\xfc\xac\xa7\x91\xa8\x25\xdf\x96\xb1\x90\xcc\xbb\xf3\xe9\xaf\x62\xdf\xa6\x2c\x49\xcd\xc2\xcd\x8e\xc7\x0d\xa7\x22\xf1\x81\xef\xfd\x7b\xf4\xee\xdd\xec\xf5\x83\xb3\xc0\x07\xef\xde\xdd\x8c\xb7\xee\x79\x40\xea\x7f\xd5\xc9\x70\x38\x40\x5d\xf4\xa8\xa3\xb3\xd1\xd2\xa2\x9d\x8e\x3a\x2a\x55\x0f\x59\x53\x83\x49\x73\x2a\x67\x19\x15\x57\xc0\x67\x9d\xc8\x34\x04\xf1\x7d\xff\xdd\xbb\x9b\x2d\xe0\x43\xf1\xcf\x16\x58\xca\xdf\xc0\x22\x4d\x79\xa6\x9c\x09\xd1\xc6\xa8\x2e\x45\x92\xee\x34\x35\xca\x35\xb3\xbd\x5d\x9f\x93\x52\xcc\xca\x65\x8b\x44\x7c\x4d\x3b\x29\x5f\xdd\xb3\x87\x5c\x73\xe4\xeb\x9e\x82\xa1\x9a\x95\x61\xc1\xc3\x2b\x0d\x56\xa7\x78\x5b\xb9\x84\x5d\x35\x4a\x3b\xdd\x5d\x10\x57\x5b\xd7\xdf\x04\x7b\xce\xec\xfb\x89\x60\xb6\x12\xfe\x0f\x7a\xf2\xb4\x9b\xb2\x26\x0c\x6a\x5a\x84\x97\x33\xd9\xad\xb9\xd4\xb1\x36\x8b\x67\xda\xea\xec\xb5\xbd\xfd\x9c\x1e\xbf\xdd\x2b\xd5\x92\x0b\x51\x58\xa3\x3a\x37\x41\xa7\xaa\x19\x6a\x26\x21\xa9\xc9\x24\xc4\x65\x12\xe6\x32\x49\xe4\xbd\x24\x9d\x4e\x52\xf4\x36\x42\xe3\x4e\x07\xb5\xf9\x6a\x2c\xf1\xbe\x9d\xd9\x2c\xb0\x18\x94\x76\xf9\xcf\x3f\x90\x24\x4e\x7a\x5d\x6f\x7c\xd2\x2b\x87\xbd\xef\x1f\x3d\xfa\x6e\x75\x56\x86\x49\x4b\xfa\xa1\xfb\xdd\x13\x99\x97\x24\x43\xd1\x2a\xef\xe2\xe1\xa3\xef\xc1\x40\xb7\xd0\x2a\x1c\x82\xde\x3c\x89\xf0\x05\x49\x70\x54\xec\x15\x37\x24\x89\xd2\x1b\x2b\xeb\x47\x7e\x08\xa2\x74\x32\xe7\x4a\x5a\x6e\xda\xc9\x56\xb6\x33\xa3\xe9\x04\x67\x59\xa7\xe3\x8d\xe4\x11\x51\xfd\x65\xec\x85\x61\xb8\xc8\x8d\x49\x1a\x4c\x50\x1c\xfb\xaa\x10\x14\xcd\xa7\x9c\xdd\xb2\x1b\xc2\xcd\x3a\xad\xd5\x81\xc5\x04\x65\xb8\xd5\xed\x5b\xb9\x3a\x28\xf8\xfd\x60\x20\x3e\xf7\xf4\x67\xae\xf4\x0d\x54\x0a\x52\x05\x74\x8f\xdb\x8a\x45\x27\x13\x49\x4f\x48\x60\x12\x2e\x72\x28\x72\xef\x16\x3a\x7d\x6a\x34\x86\x69\x38\x1a\x0b\x47\xe6\x24\x7c\xd0\x83\x91\xb4\x40\xb9\x11\x17\x5c\xa4\x74\x0f\x71\xd4\x4a\x2b\x39\xbd\xb8\xc8\x30\x83\x24\xa4\x61\x38\x81\xf3\x90\x74\x3a\xd1\x72\xb9\xc8\x07\x2a\xad\xe9\x03\xbe\x15\x37\x71\xe9\xda\xdc\x46\x94\xf9\x2c\x14\xa6\x21\x1b\xd1\x31\x6f\xdd\x93\xcd\x78\x82\x2d\x15\x09\x48\x88\x83\x24\xa5\x53\x14\x93\x4f\xf8\x88\xa6\x33\x4c\x99\xb8\x5d\xcb\x27\x30\x03\x30\x55\xa4\x41\xc1\x87\x5e\x3f\x0d\x13\xde\xd2\x39\xc5\xe8\xc3\x40\x7d\x8e\x1f\xf5\xd3\x30\x2e\x3e\x6b\xf2\xa4\x76\xbb\x27\xec\x36\x96\xc7\xf7\xb8\xa1\x02\x53\x98\x81\x7c\x3e\x22\xe3\x30\xcd\x01\x24\xcb\x65\x1a\xcc\xe6\xd9\x95\x3f\x07\x30\x0a\xe7\x70\x12\xd2\x1c\xc0\xac\x98\x1b\xa5\x9b\x7b\xef\x92\xd6\x83\x96\x37\x60\x57\x34\xbd\x11\x84\xdf\x13\x27\x33\xdf\xbf\x15\x07\x45\x5b\x2c\x6d\xa1\x84\x4c\x11\xc3\xad\x68\x2e\x7e\xb2\x2b\xdc\xba\x48\xe3\x38\xbd\x21\xc9\x65\x4b\x9c\xe3\xcc\xfa\xf7\x16\x2c\xbf\xb7\xc8\x82\xff\xa4\x84\xab\x78\xf9\x7b\x93\xa2\x95\x16\x13\x18\xe9\x09\x34\xbc\x82\x25\x25\xbc\x8c\x21\xca\xbc\x3e\x0b\xc4\x19\x7b\x2a\x53\xa4\x88\x4f\x3b\x9d\xb9\x4f\xa1\x2a\x16\x07\x3c\x2d\x42\x79\x51\x9a\x60\x59\xe9\x65\x9a\xe0\x4a\x9d\x48\x66\x49\x56\xab\xe0\x8c\xd1\xf4\x56\xd5\x92\x3f\xaa\x15\x15\x88\x3a\x4f\x6a\xb0\x9f\xeb\xe5\x5c\xf8\x09\x58\xca\x50\x7c\x4a\xa6\x18\x26\x21\x67\x7c\x1c\x8b\xc4\x4f\x28\xfc\x56\x97\x97\xd2\xc7\x08\xc5\x8d\x2d\xd3\x13\x86\x18\xff\x9b\x2f\x25\xfe\x17\x17\x35\xc1\xec\x0a\x65\xe2\x92\x6e\x28\xb5\x42\x32\x64\x45\xa3\x7d\x02\xdb\x6d\x1a\x44\x24\x93\x47\x76\x85\xab\xe1\x2c\x42\x0c\x0d\x4a\x27\xbb\x51\xa7\xe3\x27\xb2\x20\x44\x00\x26\x05\xca\x57\xd6\x8a\xf1\x3c\x88\xc2\x2e\x8c\xcd\x51\x53\x85\x6c\x9f\x41\x0b\xd9\x3e\x86\x06\xd9\x3e\x85\x0a\xd9\x3e\x81\x06\xd3\x7e\x02\x0b\x0c\x11\xd4\xd8\xf5\xdb\xed\xd8\x22\xd6\x4c\x13\x4b\x2c\x18\x63\xbc\xb4\x88\xba\x1e\x2c\xbd\x68\xbd\x41\xb3\xa1\xcf\xcd\xf7\x4b\xcc\xb5\x0a\xce\xb2\x2c\xc8\xf8\xdf\x7c\x49\x02\xd0\xe7\x85\x23\x3c\x86\xf2\xd0\x25\xff\x93\x7f\x86\xa4\xe8\xe5\x82\x8b\x9d\x42\x85\x31\xce\xb2\xbe\xb1\x33\x47\xcc\x8a\x53\xf4\x20\x06\x90\x99\xf8\xe4\x56\x0f\x8c\x73\x8e\xdf\x65\xa8\x63\xc2\x3d\x38\xb5\xfe\xbe\x0e\x8d\xfb\x66\x34\x56\x79\x6f\xb7\x61\xe6\x83\x81\x7f\xbb\x5c\xba\x04\xe9\x9e\xa4\x29\xe8\x74\xfc\xcb\x30\xf6\xc1\x50\xbb\x1f\xf8\x0e\x37\xc0\x9d\x0e\x6e\x87\xa1\x96\xce\x46\x4c\xab\x5a\x03\xe1\x6c\xe2\xda\x26\xd3\x31\x97\xee\x00\x87\x58\x3d\x0c\x2e\xef\x5d\xc6\xe2\x69\xaa\xc2\x0f\xa8\xc3\xd9\xac\x70\x9b\x61\xc0\x47\xe1\x2b\x77\xe4\xed\x72\xa9\xda\x0f\x66\x34\x65\x29\xc7\x34\x98\x22\x36\xb9\xc2\x99\x09\x50\xa8\x26\xd4\x67\x1f\x83\x81\x11\x10\xb5\xca\x10\x87\x06\xf2\x04\xc7\x98\x6f\x87\x7c\xea\xa6\xe9\xa7\x37\x8e\xaf\x99\xe3\x63\xea\xf8\x76\x83\xcf\x3f\x10\x56\x29\x28\xcc\x4e\x9f\x89\x79\xc0\xf2\xf6\x09\x9f\xc1\x11\x1d\x83\xfe\x34\x17\x19\xcf\xd6\x44\x29\x09\x3d\x1a\x2b\xaf\x64\x21\xee\xc5\xf1\x3d\xdd\xf0\x4e\x1c\xf3\x51\xea\x14\x45\x16\x76\x07\xec\x19\xd5\x29\x8a\x6c\x6b\x0b\x10\x29\x3e\xe9\x88\x8d\x41\x2e\xa2\x61\x0d\x4d\x09\x4f\x52\xa7\xa3\xe1\x8d\xe0\x23\xb9\x0c\xab\x9d\x8b\x8d\x08\xee\x86\xed\x5e\xb1\xaf\xef\x70\xce\x3d\x5f\x2e\xfd\xf3\xd0\x77\x31\x92\x66\x8d\xa1\x61\x96\xf3\x34\xba\x95\x39\xc0\x7c\x8f\xe2\xcd\xb5\xcf\x83\x8c\xef\x01\x9d\x8e\xf7\xab\x20\xde\xce\x6c\x86\x11\xe5\xcb\xcb\x23\x49\x4b\x95\x4a\x24\x70\xd8\xee\x6a\x62\x9a\x6a\xed\xfa\x65\x11\x9e\x68\xc8\x53\x57\xa6\x9a\x75\xf3\x54\x5c\xf6\xd8\xe9\xf8\x38\x14\x27\xe9\x54\x13\xb0\x8d\x3b\x9d\x5d\xf1\x59\xa1\xe0\x6d\xb1\x60\x72\x85\xe8\x0e\xf3\x85\x27\xfb\xed\x6c\x86\xe9\x2e\xca\xb0\x0f\xb6\xcc\xca\xeb\x01\x0b\x3d\x00\xb1\x0a\x2a\x9e\x84\x53\xf8\x4b\x78\x09\xcf\xc2\xeb\x82\x50\x3f\xd9\x4b\x7c\x61\x34\xbb\x15\x5b\x74\x21\x9e\x29\x9e\xc5\x68\x82\x7d\x99\xe6\x38\x06\xfe\x48\x84\x17\xb6\x2f\xa1\x77\xaf\xf7\xe0\xde\x43\x0f\x0c\x30\xdf\x30\xf9\x56\x9e\x73\x3c\x38\xa5\x6e\x2a\xc9\x80\xd7\x32\xe5\x43\x6e\xb7\x7a\x2f\xb7\xb4\x6b\x3e\x93\xb9\x5a\x0e\x6a\xad\x94\x3c\xcb\xf2\xf1\x8a\x5c\xaf\x4e\x17\xc8\x2f\x12\x44\x70\x55\x45\x5b\x3e\x53\xbf\xf3\x49\x3a\x9d\xcd\x15\x16\x15\x18\xba\x5c\x7a\x5e\xae\x76\xe9\x42\xe2\xc3\x98\x2b\x45\x99\xad\xdf\x0a\xfd\x4b\xb8\x35\xff\xac\x52\x9c\x6c\x7e\xfd\xc1\x9b\x0a\x41\x8b\x9e\x0f\x0e\x0f\x8f\x44\x70\xe0\x46\x82\x2a\x11\xfb\x3a\xf4\x92\xcb\x07\xe2\x71\x4b\x0f\x7e\x14\x3f\x62\x8c\xae\xb1\x07\x7f\x17\x3f\xd4\x76\xe5\xc1\xbd\xd0\x0b\xec\xdf\xfb\xa2\x58\x12\x82\x24\x97\x1e\x3c\x95\x00\xc5\x97\x82\xaf\x0e\xf9\x14\x72\xf5\xad\x76\x8f\xbd\xce\x8a\x60\x83\x62\x67\x11\xf3\xeb\x6f\xff\xdb\x7f\x30\x1c\xbd\x0b\xde\x45\xe3\x2d\xe0\x4f\x87\x19\xd8\x36\x6e\x6f\x21\x9a\xa5\xf8\x78\xf6\x70\xd8\xed\x7f\xf0\x45\x9e\xeb\xab\x38\x45\x32\xd3\x15\x40\x3c\x7a\x38\xb6\x74\xe6\xd2\xc5\xba\x5e\x26\x62\xf2\xc3\x1e\x7e\x74\x9f\xf5\x2d\xc5\xfd\xa8\x32\xd9\x2c\xb8\x42\xd9\xe1\x4d\x62\x38\xd1\x8b\xe6\x54\x44\xfa\x3c\x30\x64\x35\xd3\x43\x48\x43\x98\x84\x5d\x88\x42\xcf\x13\xfa\x6a\xfd\xaa\x4f\x4b\xb2\x35\x0d\xd4\x1f\xf6\xdf\x65\x5b\xd5\xaf\x60\xa8\xbe\x8f\x1e\xf0\x05\xb6\xc5\x7f\xf9\xc1\xd6\xf0\x1d\x00\x43\x00\x86\xf7\xb6\x09\xe0\x5d\x2a\x8f\x97\xb6\xda\x5a\x58\x8a\xca\xf7\xa7\x57\xb8\xa5\x2e\x94\x88\x5a\x8c\x4c\xb9\x3e\x29\x0c\xbd\x96\xc7\xf5\x49\xaf\x45\xb2\x16\x49\xc4\x02\x0c\xde\x03\xb8\xd0\x23\xed\x77\x61\x84\x63\x74\xdb\xef\x42\x8c\x32\x92\x5c\xf6\x3d\x2f\x1f\x90\xb0\x44\x73\x2a\x68\x4e\x39\xcd\xd5\x44\xc6\x21\x1d\x3d\x1a\x0f\xa4\xd2\x14\x73\xa5\xa9\x5c\x23\xe6\xe0\x8f\xc7\x00\x98\x33\x19\x74\xf4\x64\x3c\xc8\x3a\x1d\x1f\x85\x99\xdc\x04\x5a\x24\x64\x7c\x48\x6d\x45\x5b\x1a\xb6\x7b\x10\x85\x45\x72\xfb\xb3\x2e\x17\x87\x72\x80\xde\x4b\x85\xb0\x1c\x55\xd6\x3a\xc7\x71\x7a\xd3\xea\xb6\x10\xc5\xe2\xbe\x00\xc4\xb5\x68\x2c\xef\x3e\x61\x57\x24\x53\xaa\xb6\x30\xd8\x18\x9e\x05\x22\x73\xba\xdd\x05\x30\x29\x37\xcb\x07\xff\xa7\xdb\xa4\x9d\x8e\x74\xcc\x4f\xb0\x8f\x60\x17\xde\x71\x3a\x74\x08\xca\x4c\x0a\x51\x93\x92\xe8\x49\x41\x79\xae\xa5\x97\x61\xe7\x03\x71\x34\xa6\xb8\xf0\x64\x95\x20\xc7\x23\x6a\xc9\x66\xd3\xc4\xb1\x6c\x54\x34\x22\xe2\x0c\xe6\x9c\x01\xdf\x99\x18\xa0\x52\xa4\x93\xb1\xc8\x61\x11\x3d\xd2\x22\xd6\x53\xb4\xf3\xb2\x2a\x46\x87\x78\xcb\xeb\x7b\x5b\x74\xcb\x1b\x78\x9c\xa3\x0c\xe4\x2b\x2e\x2b\xe4\x2e\xea\x79\x46\x67\xa0\x61\x77\x40\x9f\x31\xb9\x8d\xe9\xf9\xa7\x5b\x5b\x56\x9c\x57\x95\x11\x86\xa7\x3e\x05\x03\xbc\x15\xbe\xf4\xbb\x90\x40\x5d\x70\x89\x99\x5e\xc7\xd2\x90\x23\x00\xe4\x85\x33\x84\x8a\x01\xa9\x7d\x52\xd7\xa9\x2c\x7f\x71\xed\x1b\x0d\x84\x85\x94\xfd\x4a\xd8\x95\xef\x9d\x79\x62\xa7\x96\x9d\xfd\xd3\xa7\x40\xf7\xc7\x55\x26\x30\x10\x4a\xf6\x0e\x63\x94\x9c\xcf\x19\xe6\xf2\xe0\x36\xc6\x1e\xdf\x80\xcc\x80\xff\x53\x1c\x85\x52\xaa\x82\x6f\xcf\x13\x2e\xe6\xc9\xf6\xe6\xfc\xe6\x13\xa1\x09\xb5\x69\x15\x49\x11\x3b\x94\xf3\xa2\x30\x49\xc6\x05\x56\xc9\x38\xe4\xdb\x30\x37\x4f\x7d\xd0\xe9\x70\x6a\x5b\xb8\xfc\x28\xc5\xe4\x5a\x4c\x6c\x2f\xdd\x6f\x5c\x27\x2b\x06\x1d\x7a\x5e\x43\xe3\xb6\xe3\xbc\x72\x59\x32\x18\xf6\xac\x08\x15\x1b\x75\xc7\x7d\xbf\x0b\x51\x70\x7d\x04\x7c\x06\xfa\x4c\x29\x2d\x2f\xc4\x06\x76\x8c\x2f\xf7\x3e\xce\x7c\x6f\xb1\x78\xf7\x2e\xbb\xcf\x45\x20\xe0\x7f\xe4\xb9\x07\xbd\x4b\xcf\xf2\xe7\xbc\x2d\x58\x49\xaa\xa8\x2e\x71\x2c\xb8\x4b\xf0\xd9\x80\x86\x2f\x02\xfc\x11\x4f\x7c\x06\x06\x00\x6b\x95\xb4\x37\x06\x83\x17\x41\x8c\x32\xb6\xcf\x4d\x9e\xb0\x6b\x82\xe7\xc5\xd0\xee\x55\xcd\x55\xfb\x8c\x04\x4c\x42\x62\xd4\xa3\x17\xd0\x67\x90\x68\xdd\x39\x11\x93\x61\x14\xef\xfa\x54\x2e\x97\x3e\x55\x02\xfc\x28\xc6\x28\x33\x42\xa3\x85\x94\xb8\x90\xa2\x07\x5b\x92\x47\x5c\x9a\xd1\xba\xb7\x20\xf9\x7b\x20\x6c\x51\x00\x13\x0b\x9d\xdc\xac\xcf\x44\xd8\xc0\x7d\xcb\x86\xfd\xc3\x56\x00\x95\x83\x87\x8a\x2b\xab\x3e\x32\x5f\x6a\xf0\x03\x6e\x25\xa7\x09\x2e\x28\xa4\xfc\x9b\xd0\x02\x34\x14\x92\x6d\xfd\x1a\x6e\x3f\xd8\x32\xc7\x5f\xc0\xf6\x65\x31\x47\xbf\x95\x62\x54\x9a\x4a\xbf\x42\x3f\x08\x02\xc6\xed\xa4\x51\x6f\x5c\x56\x6d\x2d\x8e\xfa\xa7\xb3\x72\xb3\x06\x1a\xb0\xf4\x75\x7a\xa3\x1b\x2a\xda\xf9\x57\x49\x43\x14\x2e\xd7\xe5\x92\xff\x63\x4d\xf1\xcf\xd5\x29\xb6\x97\x06\x05\xd2\xf7\x25\x19\xb8\xc8\x0b\x96\xec\x85\x42\x3c\xea\x8e\x85\x8a\x58\x77\x91\xa1\xea\xa4\x33\xb0\x5c\xc6\x92\xb4\x0c\x40\x34\x62\xe3\x90\xdb\x45\x39\x80\xb1\x6e\x95\xcf\x83\x3c\xeb\xdb\x1b\x24\xc5\x61\xaf\x84\xcb\x43\x39\x65\x7c\xa1\x0f\x62\xd3\x51\x49\xd9\xe4\xb6\x3d\x93\x4a\x71\x5e\xe8\xa6\xd6\x50\xff\x57\x0f\x55\x3b\x8e\x02\xbe\x5c\x94\x1f\xed\x3b\xe3\x4b\x0c\xae\x49\x46\xd8\xa9\x54\x08\x7d\x5e\x61\x50\x76\x42\x2a\x08\xe1\xd5\xb0\xca\x7b\xb5\x16\x50\x92\x11\x89\x9e\x01\x7a\x58\x6d\x04\xff\x31\xc7\xc9\xc4\x6e\xe7\x51\x05\x44\xbe\xf5\x51\x94\x3f\xae\x94\xef\x28\xa5\xbd\x80\x78\x52\x81\xf8\x19\xdf\x5e\x50\x34\xe5\x46\xb9\x81\x79\x5a\x1b\x0d\x37\x0a\x8a\xf2\xef\x2b\xe5\xc7\xf8\x02\xd3\x0a\xa6\x3f\xb8\x31\xd9\xbd\x22\x71\x64\x13\xa6\x4a\x39\x05\x77\x8c\x2f\x6c\xa8\x2a\xfd\x44\x9a\xa4\x0d\x50\xa3\x1d\x43\xc5\x14\x69\xf7\xe6\x0a\x1f\x24\xc5\x59\x1a\x5f\xdb\x22\x45\x1f\x36\x96\x17\xdf\xfc\xbf\x7b\x0b\xc9\x12\xf9\x7b\xdb\x67\xc7\xca\x86\x96\x72\x8f\x5f\x62\xb6\x2b\xcd\xa9\x48\xd9\x53\x60\x84\xc7\x45\x2d\x9d\x1b\xa4\xb7\x93\x91\x16\x87\x75\x61\x3d\xd4\x41\xec\xed\x77\xd9\x7d\xf8\x2e\xbb\xbf\x0d\xec\xa5\x54\x55\xc7\x89\x70\x4e\x85\xa1\xc8\x74\x30\xcb\xd6\x86\x2a\xdc\xe8\xca\x35\xda\x97\x86\x90\xa2\x9f\x27\x5c\xfd\xe1\xf3\xd6\x7d\x4f\x3a\x34\xfb\xd2\x34\xd2\xc5\xf7\x79\x19\x87\xd1\xc5\x24\x99\x50\x79\x1a\xbd\x5f\x72\xf6\xd8\xd6\x09\xb0\x7f\x31\xa0\x6a\x46\x78\x83\x9a\xcf\xca\x35\x2b\x7e\x7c\x5b\xd1\x67\x66\x49\xb5\x50\x4c\x50\x56\x53\x2d\xb9\xf2\x9a\xcd\x67\xb3\x94\x32\x1c\xbd\x07\x50\x8e\xe5\xbe\x27\xb4\x48\x29\xcd\x3c\x4d\xa9\x62\x06\x74\x7a\xb2\x18\xb4\xee\x90\x80\x01\x0b\x49\x5e\xec\x7c\xc6\xac\x79\x77\x7f\x39\x7a\xf0\xee\x66\xbc\x05\xf8\x3e\xfd\x6c\x38\x0a\x1f\x8c\x9f\x8b\xbf\x8b\x92\x7b\xdb\x96\xd5\x42\x96\x4b\x2d\x43\x9f\x3d\xd6\x7d\x51\xa7\x01\x53\x0c\x10\x9b\xd3\x26\x2b\xc6\x87\x07\x26\x0c\x36\xea\x8d\x21\x0a\xc9\xe8\x21\x97\xc8\x84\x1b\x29\x6a\x20\x09\xf3\x13\x18\x03\x30\xf0\x9e\x79\x61\x88\x44\x8a\x52\xdb\xf7\xee\x7b\x22\x34\x26\xfe\x8d\x01\x97\xed\x1a\x3a\x86\x09\x00\x82\x60\x10\x03\xd0\xa7\x46\x68\x53\x45\x0d\xca\x84\xc2\x72\x82\x99\x3f\x52\xf7\x52\x79\x3d\x6f\x0c\x20\xb1\x0b\x2e\x50\x9c\xf1\x92\xae\x37\xb6\x94\x97\xa4\xb2\x2e\xa8\x30\x46\xc5\xee\x40\xf4\x9f\x90\xe8\xcf\xb8\xf8\x6c\x72\xad\xfc\x04\x22\xad\x68\xc4\xa1\xc0\x9f\x2d\x97\x2c\x0c\x13\x98\xc9\x9f\xdc\x8e\x0e\x43\xed\xe1\x6e\xc7\x9d\x0e\xb5\x9e\xdc\x37\xd3\x9e\x74\x3a\x7e\x1c\x26\x43\x83\x42\xdf\x60\x00\x60\x3b\xeb\x74\x88\xab\x16\xea\x74\xfc\x2c\x44\x43\x83\x61\xdf\x20\x08\x60\xdc\xe9\x64\xb9\xce\x6f\x67\x25\xb5\x2e\xbb\xdf\xcf\x70\x7c\x91\xdd\x87\xc3\xaa\x42\x17\xb3\x8a\x19\xc1\xeb\x89\xf0\x6b\x70\x3e\xd7\xb2\x34\x97\xbe\x8f\xac\x7c\xb4\x94\xa9\xb3\xa5\x67\x11\x25\xd7\x98\x86\x2c\x97\x35\x4a\x34\xe6\xcd\xa5\xcc\xca\x56\x93\x55\x28\xce\xb8\x10\x4b\x18\xfe\x28\xc5\xff\xa9\xb0\xd7\xe4\xbe\x46\x01\xfc\x5f\x9f\xc3\xc1\x4f\x62\xea\x41\xbe\x1a\x9e\x23\x12\x4c\xe6\x94\xe2\x44\x4a\x6e\xed\xda\x0c\x3d\x0f\xb2\x60\x92\xc6\xfc\xa7\x12\x96\x59\xb8\xc8\xeb\x1f\x47\x9e\x37\x56\x05\xb2\x9d\x53\x32\xc5\x61\x37\x2f\xed\xc7\x62\x60\x4a\x19\x90\x3e\xd4\xdd\x74\x9e\xb0\xb0\x0b\x89\xb8\x86\x60\xa6\x7e\x9a\x85\x31\xe2\xcb\xa2\x90\xbe\xff\xe3\xe9\xf7\x55\x0a\x1f\x23\x67\x7e\x19\x83\x52\xc6\x71\xb1\x43\x28\xbf\x50\xd6\x9a\x88\x8b\x6b\x5b\xe7\x7c\xb1\xe2\x0b\xf2\x11\x47\xe2\x0a\xc0\x16\x4a\x5a\xef\xff\xe7\x7d\x2b\x23\x97\x49\xcb\xc7\xc1\x65\xa0\xab\xf8\xff\xf8\x9f\x8b\x34\xfd\x07\x6c\x8d\x82\x20\x18\x03\xe0\x71\x63\x45\xf8\x68\xc5\xfa\xce\x4a\xda\x12\xb9\xf0\x37\x98\x13\x0c\x60\x57\xbc\xe2\x22\xd5\x16\xed\x70\xe1\xcb\x45\x8c\x68\x40\xec\xb4\xeb\x55\x7b\xca\x42\x56\x08\x19\x4c\xd4\xea\xe6\xbd\x5b\x6a\x8d\x58\xfa\x39\x80\x0a\x8e\x28\xc7\xc5\x85\xdf\xab\x22\x90\x84\x45\x5d\x4b\xe5\xe1\xf3\x34\xa0\x5b\x61\x62\x4d\x12\x24\xfc\xb7\x9e\x23\x88\x94\xc4\x51\x5e\x91\xca\x1c\xa4\x49\x7c\xdb\x12\x6f\x51\xfb\xa0\x85\x12\x5b\x36\xfa\xa0\x65\x11\x92\x4f\x4d\x2b\x23\x22\x2e\xc4\x2d\x08\xbe\x46\xcd\x24\x00\x8f\x8f\x42\x5e\x05\xfa\x1d\xe4\x63\xe9\xcb\xd9\x87\xa2\xe9\xac\x9f\xc0\xa2\xdd\xac\x8f\x60\x81\x6d\x9f\x42\x8d\x6a\x9f\xc0\x54\xde\x6b\xaa\xb2\x53\x2c\x4a\x95\x56\x9a\x4d\x46\xa1\x14\x48\xfb\x31\x83\x58\x9e\x63\x50\xad\x74\x3a\xe6\xcf\x60\xa6\x5e\xf2\xd0\x91\x66\x6a\x82\x30\xea\x62\x10\xb9\x38\x0a\x72\x2b\x09\xcb\x85\xbd\x88\x34\x8b\x3a\xb2\x9b\x2a\x4f\x4d\x98\x75\x9f\x06\x0e\xd9\xa0\xc1\xee\xe5\xe0\x6f\x7d\x3c\x62\x63\xb0\x5e\x89\x4f\x02\x14\x45\x3e\xe3\x4a\x36\xc8\x73\x6e\x84\x89\x87\x86\x0c\x0d\xfe\xf0\x13\x69\x3a\x65\x3e\x00\x83\xf2\xac\xbe\x97\x13\xca\x37\x34\x31\x0b\xb9\x07\x5b\x41\x10\x80\xd6\x74\x9e\x31\x39\xa9\xb8\xa5\x14\x00\xed\x9c\xe2\x96\xa0\xb8\xcd\xb2\x14\x33\x16\x03\x6e\x89\x60\x00\x61\x73\x39\x37\xad\x7b\x0b\x2a\xa3\xc7\x1e\x6c\x79\x22\x80\xac\x3d\x4c\x82\x01\xba\x15\x06\xb8\x8d\x71\x9f\x9a\x99\x25\xc3\x85\x9c\x8b\x3e\xc9\xed\x69\xae\x30\xf5\xa2\x22\x76\x1c\x42\x87\x86\x85\xe8\x0c\x8c\x2c\x01\xd0\x08\x60\x89\x4e\x0f\x4a\x97\x3f\xcd\xfa\x5c\x5b\x0c\xf8\x8e\x0f\x35\xbd\x00\x34\x15\xfb\xd4\xe6\x4a\xbb\xfb\x82\x41\x0b\x2c\xcc\x78\x22\xde\xa6\xfa\x01\x34\xcb\x6a\x73\xc3\xd2\x68\x25\x32\x0f\x61\xc6\xf0\x2c\xeb\x73\x8e\xc5\xb3\x4c\xe7\x52\xaa\x81\x70\x70\xb0\xb2\x65\xeb\xf1\xc2\x22\x35\xce\x92\xe3\x03\x7d\x8b\x87\x91\x1a\xe5\x8e\x16\x25\xe8\x90\x1a\x38\x0b\x83\x81\x49\xff\x11\xb7\x3a\x4c\xd1\x47\x9f\xc0\x52\x3d\x00\x93\xc2\x0f\x50\x6e\x91\x28\x29\xf0\x48\x0d\x34\x59\x39\x9c\x9d\x22\x12\x52\x0c\xa8\xac\x63\xcb\x4d\x48\x2f\xdb\x55\x3e\x75\x40\x43\x36\xd0\x02\xb4\x39\x58\x30\x67\xfe\x91\xbc\x90\x5d\x57\x85\x5d\xe8\x79\xc5\xe5\x58\x4c\x9a\xd9\x46\xb0\x6f\x6d\x83\x20\x4b\xa7\x58\xdc\x35\xbf\x10\x1b\x9b\xb5\xa7\x95\xbf\xf4\x80\x75\xb1\xce\x9c\xf9\x5d\xd5\xb6\x31\xa9\x22\x29\x6d\xc2\x76\x57\x38\xd5\xa8\x70\x26\x86\x04\xea\x38\x31\xd7\xd5\x96\xcb\x23\x4e\x71\x00\xe7\xcc\xa7\x05\x96\x34\x10\x5e\x5b\x48\x03\xe9\xb5\x15\xaf\x70\x4b\xe7\x6f\x56\x30\xf4\xc0\xcc\x87\x22\xae\xdc\xda\xb2\x90\x0e\x74\x84\x41\x8b\xcb\xa1\xfe\x43\xba\xcb\xd2\x17\xc0\x5f\xe4\x42\xa1\x7e\x12\x86\x89\xdc\x7e\x88\x25\x6c\x0b\x03\x37\xe1\x6c\x22\x22\xad\xd2\x0f\x65\x04\x70\x1c\xb6\x7b\xc2\xe9\x9e\x80\x45\x1c\xb6\x35\x1f\x32\x11\x0f\x54\x78\x77\x3a\x7c\x15\x8a\x3f\x43\x33\x16\x98\x84\x06\x09\x06\xf2\x12\x53\x6d\x85\x05\x15\xb6\x14\x15\x8c\xe3\xbf\xba\x17\x08\xd4\xb2\x80\x64\x7b\xd3\x19\xbb\x3d\x61\x78\x16\xc6\x90\x84\x59\x5e\x65\xd7\x0a\x79\x44\xe4\x57\xf2\xee\x63\xa8\xa8\xda\xa7\x4a\x7c\x35\x6c\x4c\x2a\xc0\x57\xd9\x98\xce\xa6\xe8\x83\x8c\xfe\xed\x64\xcc\xb7\x57\x94\x2c\x2e\x85\x29\x39\x08\xd7\x02\x20\xcd\xeb\xf5\x6c\xb3\xb6\xf6\x1a\xa6\xdc\xaf\xcc\x1c\x96\x76\x14\x97\xf5\x1b\x86\x28\x88\x1f\x0d\x8d\x9d\xd1\xaf\xec\x19\x25\x0b\x49\xc9\x7d\xd1\x8a\x32\xff\xb8\x75\xa4\x8d\x23\x15\xb9\x08\xde\x5b\x76\x4b\x5e\xfc\xad\x91\x53\xd2\xa8\xdd\x83\x89\x5c\xc1\xc6\x28\x5b\xb3\x83\x42\x2e\xd6\x24\x67\x88\x8d\x57\x44\x80\xb8\xa2\x10\x63\x26\x54\x18\xc5\x34\x6d\x62\x42\x0a\x22\xd8\x2d\xd2\x11\xf9\x06\x6b\x6b\x68\x26\xd7\x64\xb1\xf0\xc0\xf3\xb0\x0b\x16\x84\x73\xa6\x48\x35\xca\x73\xa3\xb7\x3c\x85\x6a\x31\x50\x1d\x15\x49\xa0\x4c\x18\xeb\x9b\x04\x34\xa7\xce\x50\xe3\x8e\xfa\x0c\xbb\x05\x76\x99\x03\x15\xb1\x4a\x9c\x2f\x0e\x2f\xd9\xe2\x9d\x76\x3a\xc9\xf3\x2e\x27\xc7\x03\xc7\xa2\x30\x8e\x7a\x37\x37\xb4\xad\xc7\x24\x56\x04\x73\xf8\xf2\xb5\xad\x9d\xc0\x1d\x57\xa7\xa0\x62\xcf\x37\x73\x93\xe5\x5d\x56\xb5\xb9\xb1\x4d\x0b\x63\x1b\x15\xe6\x76\x6b\xf7\xe4\xa4\x00\x13\x5a\x89\xae\x9d\xbd\xd7\x42\x1a\x71\xb2\x54\xcc\x1a\xec\xb4\x8b\xb8\x99\x8e\x46\x54\x3a\xa3\x33\x3e\xef\x22\x9c\xd8\x0e\x09\xa7\x64\x18\xcb\x70\x0c\xa7\x6d\xa7\x43\x9e\x85\x71\x80\x93\x48\xfe\xf2\x1d\x23\x2a\xe1\xa6\x86\xc0\xae\x10\x6b\xe1\x8f\x24\x63\x59\xeb\x1c\xb3\x1b\x8c\x13\xa1\x44\x31\x32\xc5\x19\x57\x93\xbd\x7b\x0b\xab\x9b\x7c\x9a\x79\x42\xd1\x16\x9f\x55\x6f\xe2\x23\xc9\x5a\x28\xce\xd2\xd6\x39\x16\xb7\x33\x4b\xe6\x88\x38\x5b\x23\xe1\x95\x8f\x63\x1c\x5b\xa4\x6c\xea\x2b\xb1\x7b\x20\xfc\xc7\x7b\x00\xb3\xb0\xdd\xe3\x32\xd6\x42\x04\x40\x11\x2e\x1d\xd1\x71\xb8\x30\x1f\xfb\x09\x54\x28\xf5\x49\x0e\x20\x2e\x54\xe9\xaa\x7f\x4c\xef\x96\xd8\xa8\xd6\x8b\x1c\x26\xe1\x5b\x9f\x81\x41\x62\x5c\xd9\x49\x79\xa5\xbb\x14\x5d\xed\xa1\xa9\x7b\x10\xf9\xc8\xe2\x74\x82\x62\x47\x78\x82\xcb\x22\x39\xf6\x4b\x72\x8d\x93\x56\x4c\x32\x71\xbf\xb4\xd4\x66\xdf\x73\xa5\x59\x5c\xe7\x57\x0c\xa1\xd8\x22\x85\x4a\x5d\xd9\xd1\x4a\x2b\x54\x0a\x84\x27\x5a\x20\x8c\xc6\xe5\x05\x2e\x36\xb8\x86\x55\x5c\x04\xce\x4b\x66\xd6\x07\xd3\x91\x52\xc2\xb9\x85\x1b\xa3\x89\x98\xdf\xc2\x9e\x9a\xa8\xfb\xe4\x75\x86\x08\x37\x67\x69\x4d\xa7\x53\xa1\x15\xc4\x05\x2b\xdf\x70\x61\x66\x0a\xd3\x9a\xc2\xb7\x6e\x6b\xe2\x2d\xa5\xea\x1e\x43\xaa\xe4\xdc\x50\xff\xd1\xb7\xd3\x8e\xdc\x21\x30\x2b\xbf\x71\x60\x1d\x27\x25\x17\x7e\x35\x4a\x07\x98\x53\xec\x73\x2b\xad\xaa\xd4\xa9\x44\x5d\xeb\x28\x27\x1b\xe0\xd0\x4e\x19\x50\x08\x02\xbd\x27\xe8\x0f\x79\x0e\x8c\x0e\xf8\x57\x34\x6f\xe2\x1d\xc6\x1a\x04\x70\x12\x76\xcb\x69\x9e\x69\xa7\xe3\x93\xad\x2d\x38\x31\x14\x0d\x53\x00\xe3\x30\x5e\x2e\x27\xcf\xba\xcb\xe5\xe4\x79\x0f\xa2\x10\xf1\x5f\x19\xcc\xc2\x89\x76\x0f\x4c\xb8\x1a\x00\xb8\x84\xaa\xb0\x8f\x8a\xde\xe1\x24\x9b\x53\x2c\x25\x0e\xe7\x14\xcd\x55\x2d\xd9\x49\x26\x32\x0b\xb4\x5c\xe8\x0a\x19\xd0\xf3\x00\x44\x7f\xaa\x3d\x92\xb4\x52\x1a\x61\x6a\x34\xe4\x89\xe1\x31\x15\x39\xe2\xd3\x1e\x85\xdd\x01\xe1\x3b\x13\x79\x36\x19\x56\x7a\x3b\x90\x1a\x83\x54\x2a\x7c\x20\x92\x1b\x32\xfd\xb4\x03\x5f\xc2\x11\x9e\xc4\x88\xe2\xa8\x65\x2f\x13\xb5\xd7\x6a\x5c\x3c\xd0\xef\x86\x5c\x6a\xfb\x51\xd8\xdb\xf6\x27\x0f\x7a\x26\xfb\x63\x1e\x4e\x1e\xf4\xe0\x55\x65\xeb\x9c\x35\x6d\xb4\xf0\x22\x9c\x99\xad\x53\x4f\x5c\x6a\x78\x53\x47\x58\xf5\x4e\x13\x3d\xef\x0e\x49\x18\xce\x87\xbd\x7e\x74\x9f\xf4\x93\x11\x11\x7b\xca\xfd\x8b\x41\xd9\xf2\xb9\xda\x9a\xc9\x5d\x78\x2b\x86\x45\xfb\x61\x0c\x1b\xb4\x3e\x26\x53\x5c\x15\x7f\x20\x68\xbc\x0b\x46\x9f\x82\x34\xaf\x04\x85\x6a\xf6\xe4\xf7\x96\xfd\xda\x64\x0d\x6f\x62\x81\xc9\x60\x92\x1d\x80\x29\x4c\xdd\xad\x2d\xa5\x21\xfd\xb0\x49\x4b\xc7\xf8\xa2\x8e\x66\xaf\x6b\xe1\x59\x68\xec\xd6\xc0\x0a\x94\xd7\x61\xfc\x2f\x9d\x7b\xe7\xd0\xa8\x4a\x5b\xbf\xed\x0a\x12\x2e\x1c\xdb\xa6\xdf\xda\x82\xe5\x5a\xa1\x4a\x22\x1b\x25\x10\x8d\x43\x5b\xee\x69\xad\xb4\xdd\x76\x45\x90\xd4\xf1\x33\x4f\xb8\x9d\xb9\x60\x04\xd6\xc9\x2c\x9f\x85\x45\x64\x19\x31\x6e\x0a\x02\x68\x7f\xdb\xfe\x9f\x77\xf7\xb7\x2f\xe1\x1e\xb0\xbf\xdc\x6c\x6d\x5f\x42\x16\x3e\xdf\xdb\xf2\x1e\x78\x76\x2e\xa6\x05\xd5\x37\x99\x72\xdb\x97\xf0\x14\xc0\x11\x83\x78\xcc\x0d\xc2\x4c\x8d\xde\x32\x04\xcb\x8e\x62\x9d\x3a\x3b\xa4\x5b\x5e\xcb\xdb\x4a\xfa\x09\x9c\xf9\x35\x75\x0a\x36\xd0\x74\x91\x17\x39\x5a\x6b\xdc\x2f\xad\x0a\x81\x85\x85\xd5\x84\x94\x62\xb1\x5e\x0f\xea\x01\xf4\x13\x18\x93\x29\x61\x7d\x12\x88\x7f\x97\xcb\xae\xe2\x0b\x14\xf7\xdb\x6d\x12\xe8\x1f\x90\x24\x93\x78\x1e\xe1\x13\x1c\x5f\xf4\x91\xc5\x68\x31\x4c\x29\xb9\x24\x09\x8a\x75\x3f\xfd\x82\x3e\xab\x1d\x38\x2a\xe6\xa9\x3c\x51\x36\xca\xcb\x65\x45\xba\x65\x0a\x16\x08\x0f\xa9\xf0\xa7\x9e\xe3\xd6\x3c\x2b\x6d\xed\x32\x61\x14\x18\x19\x4a\x43\xef\x62\x1e\xc7\x9e\x7a\x2e\x5c\xc8\xa5\xe1\xaa\xac\x39\x01\x9d\xf7\x8f\x1c\x26\x3f\x6c\x77\x2b\x1e\xaf\x87\x9b\x48\x85\xc2\xc6\x2d\x5b\x2f\x2a\x02\x92\xba\x23\x20\xb2\xcb\x90\x49\xa9\x56\x72\xd1\x89\x2f\x85\x97\x4e\xfe\xd6\x12\xd2\x78\xf7\x24\x1b\xd8\x65\x16\x77\xd4\x3e\x1b\x06\xa9\x15\xbb\xcc\xf7\x52\x8f\x22\xaa\xa1\x3e\x39\xc2\x22\xfc\xbb\x1a\x78\x28\x07\x5e\x9c\x5e\xb2\x8e\xe4\xb5\xab\x5a\x8c\xeb\x6d\x3e\xeb\xdc\x8c\x7d\x9a\x8f\x0d\x7d\x16\x1e\x88\x03\xd2\x52\x47\x16\x9e\x0f\xf9\x67\xe8\x78\xfd\x8f\x0d\x39\xb0\x9c\x06\x03\x08\x40\x9f\x09\x84\xad\xe3\x2d\x95\x40\x56\xc1\x37\x4c\xf1\x0d\xd6\x7c\x43\xad\x61\x5d\x31\x2b\xe3\x18\x41\x79\x79\xb5\xb4\x0c\xca\xc2\x1a\x16\xe7\x4d\xcc\x86\xdc\xc7\x70\x46\x0b\x0b\x90\xb3\xcd\x2c\xcd\x98\xf5\x81\x40\x83\x46\xa2\xd0\x40\xd6\xf9\x93\x64\x0b\x69\xa4\x62\x98\xcd\xcf\xf9\xc7\x98\x24\xb8\x9f\x69\x8e\x9b\x39\xaf\x73\x3d\x9b\x16\x17\xb8\x8a\x90\xdf\x5c\x1e\x12\x96\xba\xa6\x01\x51\x57\xfc\x15\xa7\x10\x8a\x12\xa9\xc2\x09\x8f\x47\x38\x1a\x43\x9c\xa3\xd9\x0c\x27\x91\xed\x5e\xac\x37\xb3\x5c\x16\xdf\x32\x91\x65\x40\xc3\xd1\x18\x40\x65\xad\x04\x41\x80\x41\x2e\xa3\x98\xa5\xcb\x07\x45\x05\xf9\x3d\x9f\xc4\x18\x95\xc6\x11\xa8\x2f\x3a\x76\x79\x51\x8e\x5d\xaa\xfc\x01\x11\xb6\x84\x97\x95\x32\x95\x57\x5d\x0e\x69\x4e\x4b\x53\xaa\x8f\xda\xc1\x0c\xa6\x70\xc2\xd1\xd5\x17\xcb\xf3\x96\xae\x75\x9c\xb3\x64\xf4\x14\xec\x20\x6b\xe9\x00\xe8\x35\x5b\xac\x07\x16\x5d\xa4\x61\xba\x5c\xf2\x0e\x66\x3a\x0d\x3b\x12\x98\x9f\x4b\xdc\x52\x51\x65\x02\x47\x63\x30\x88\xcc\x8a\xcb\x60\x64\x2f\x54\xce\x08\x9c\xcc\x72\x7d\xfa\x23\x34\x16\xa7\xac\x60\xa4\x45\x5c\x66\xe2\xa4\x14\x46\x85\xde\x17\x71\x61\x28\x6a\x67\xc1\x05\x89\xc5\x13\xa1\xf6\x01\x9b\x1d\x2d\xf1\x7c\x20\xfc\x9a\x73\x63\x98\xda\xfe\x8f\x18\xd4\xce\xda\xcd\x47\x73\x73\x27\xe2\x78\xc0\x02\xe1\xf0\x3a\x4c\xe2\x5b\x8d\xad\xc2\x14\xa8\x93\x50\x1a\xf1\xb8\x8e\xb8\x36\x19\x74\x83\xc3\xb9\xb6\xcd\x58\x75\x3e\x00\xe8\x8f\xae\x98\x8f\xe1\x68\xac\xfe\x2f\xfd\xc7\xb0\xdd\x03\x63\x47\x80\xb6\x16\x20\x73\x87\x52\x9a\x34\xbd\x42\x7d\xca\xe6\xe7\xfb\x6a\xe5\x89\x68\x99\x5e\x67\x58\x9f\x93\x03\xa5\x33\x3a\xc2\x4b\x25\xee\x53\x38\x99\x9f\xab\x30\xaa\xb5\x89\x56\xbd\x56\x62\x76\x6d\xd5\x1c\xa9\x05\x27\xd1\x2f\xf7\x2d\x4e\x48\x12\xd3\xd6\x20\x11\xa7\xe6\x70\x20\xe2\x87\x17\x29\x9d\xee\x27\x2c\x3d\xc0\x37\xba\x61\x1f\x81\x1c\x07\x33\x8a\xaf\x49\x3a\xcf\x0e\xd2\x08\x87\xcc\xad\x90\x5a\xda\x62\x33\xee\x03\xda\xdc\x13\x80\xeb\x54\x57\x0a\xe0\x0a\x4c\xe9\x2a\xa2\xf0\x9a\x95\x51\xb8\xe9\x63\x1f\x17\x58\x4d\x67\xe3\x30\xd0\xd6\xbd\x16\xd0\xc3\x43\x2b\xae\x20\x37\x1c\x88\x0a\x28\x2e\xbb\x25\x88\x70\x2a\xf6\x6d\xd7\x6d\x57\x1e\xf5\x66\xce\x83\xba\xe2\xc8\x17\x4e\x22\x0b\xdf\xd3\xd4\x0c\x9f\x71\xd1\x01\x06\xa5\xb0\x92\xc3\x87\x99\x03\x48\x9c\x76\x0f\x0e\xe6\x33\x6e\x41\xa9\xb7\x2f\x8b\x49\xe3\x0a\x90\x16\x0f\x15\x43\xc2\xcd\x19\xe5\xf8\x5c\x69\x19\x28\x8e\x10\x3a\x8c\xf6\xc8\x5a\xc1\x34\xd5\xa3\x48\x3a\x12\x67\x39\x4d\x5c\x59\x61\xcf\x2d\x7f\x17\x87\x25\x00\x92\x55\x9c\x25\x89\xaf\x5b\x01\x8b\xa7\x61\x48\x4a\xb8\x8b\x70\x0c\x6f\xbd\x2e\x37\x13\x34\xcb\xae\x52\xb6\x2b\xbf\x6b\xc9\x04\xcb\xf5\xc3\x5b\x06\x4c\x34\xe6\xd0\xd7\x3d\x0d\x88\xfc\xe3\x40\x64\x42\xe0\x19\xdf\xb7\xca\xe6\xbd\x50\x5a\xe4\x07\x6b\xce\x4d\xbc\x90\x00\xde\x53\x15\x27\x71\xf4\x4f\x62\x72\x9a\x6a\x01\x27\x70\xaa\xd0\xf8\xb9\x38\x8f\xd7\x4c\x98\xa6\x29\x74\x04\x42\x95\x5b\x6c\xd3\x45\xe1\x4c\x13\xd0\xbc\x5f\xf9\x02\xfa\xdd\x41\x95\x08\xc8\x30\x7e\xbc\x46\xa4\x24\x9d\x4e\x5c\xa1\x72\x62\x18\x16\xc1\x18\xc0\xd2\x9a\x88\x57\x8b\x09\xa5\x81\xd4\xa0\x64\x1e\x89\x35\x45\x75\x32\x4c\x31\xbd\xc4\xfa\xd7\x6e\x59\x29\x16\xe9\x58\x2b\x84\x17\x69\x14\x50\x52\x05\x97\x73\x21\x42\xb4\x2a\xc6\x69\x1f\x56\xd2\x91\x4e\x2d\x46\x8e\x7c\xed\x37\x1e\xde\xf3\x29\xd4\x3f\x0a\x1f\x6d\xdf\x8a\xd1\xd7\xce\xaf\xb0\x22\x28\x2a\x15\x4d\xa6\x42\xa3\x4a\xc1\xd4\xe1\xc5\x55\x51\xe6\xa6\x38\xa0\xb5\x33\xe9\x81\x15\x16\x17\x80\x0e\xee\x1a\x28\xc9\x25\x42\x06\x26\x89\x93\x97\x1a\x11\xca\xf9\xde\xbd\x4a\x41\x29\x52\x7f\x1b\xe3\x81\x89\xbd\x0e\x9b\x22\xaf\x7d\x57\x3f\x5a\x9a\x43\x57\x40\x14\x92\xa6\x15\x09\xe0\xca\x80\x68\x83\xfc\xac\x47\x3e\x6b\x54\xb1\x29\x55\x09\x74\xb5\x49\xa7\x43\x45\x6a\xaf\x45\x0b\xe5\x9d\x25\x9c\x28\x46\xf2\x08\x7e\xbe\x41\x34\x7a\x25\xb1\x2d\xf2\x30\xb9\xd4\x90\x93\xcc\x35\x30\x15\x2a\x64\x76\xd8\x77\xa8\x9e\xbf\x37\x1f\xfc\x04\xf4\xa9\xa5\xac\x99\xa0\x75\x52\x98\xd2\xb8\x50\x62\xdc\x43\x6f\x88\x18\x34\xb9\x1a\x5d\xc2\xc8\xf0\x6e\x62\x6d\xc9\xe2\x64\x5a\x4d\x88\x80\x1a\xaf\xa1\x6a\xe4\xdc\x1d\xf2\x43\x9a\x70\x82\x3d\x7c\xed\x66\x5c\x2e\xbb\xe0\x7e\x02\x20\x72\x91\x41\x93\xd1\x49\x0d\xd4\xc4\x40\x39\x80\x77\x14\x34\x68\xb5\x9c\xd9\x4a\x9a\x68\xbf\xca\xf3\xe7\xd4\x33\x2b\x0e\x40\x71\x94\x46\x4b\x78\x52\x48\x76\xbe\x93\x3f\x15\xf7\x6a\xd5\x36\x5c\x71\x90\x43\x1c\xbf\xab\xf6\xb3\x9e\x7d\xc5\xd1\xae\x8d\x77\x6b\x5c\xdf\xad\x65\x90\x87\x0e\x8a\x5d\x86\x24\xd7\xe9\x07\xac\xe8\x50\xb8\xb2\x58\x50\x75\x74\x41\x26\x9d\x66\x90\x05\x96\x77\x0c\x96\xdc\x66\x8e\x94\x11\xd1\xf2\x29\xb7\xd9\xc3\xd8\xf6\xee\x4b\x69\x60\x1d\x09\x11\x27\x93\xed\x74\x22\x51\x53\x1e\x71\x22\x83\x4d\xb6\x45\x48\x9b\x36\x46\x79\xc5\x99\x32\x3c\x44\x1a\x70\x7d\xaf\x73\xa9\x7b\x31\x70\x6c\x9d\x4d\x8a\x08\x2a\x76\x5c\xb4\x66\xc7\xb5\x39\xdc\x1a\x66\x17\xba\xc8\xd6\x5d\xc5\xdb\x48\xc6\x5c\xef\xb8\x5e\x32\xd7\x0a\x6b\xda\x4e\x1a\x25\xb6\xe5\xd0\x2c\x16\x8f\xbc\xae\x42\xcd\x8d\x4b\x58\x89\x6c\x21\xbd\xfd\x29\x9a\xa1\xf3\x8c\xab\x8f\x66\xc3\x89\x43\x74\xdf\x77\xd0\xe2\x41\x0f\x28\xe6\x41\xf7\x1d\x04\x1c\xa8\xd3\x13\x45\x53\xcf\xba\x43\x8f\xe2\x6b\x4c\x33\xec\xf5\x13\x9d\xe4\x21\xcf\x56\x98\xef\x59\x18\x3f\xc8\xec\x7b\x62\x84\x67\xb4\x9f\x85\xc6\xba\x52\x63\x15\x71\x75\x1d\x15\xad\x6f\xda\x59\xa7\x93\x56\x78\x2f\x2b\x22\x5c\x69\x49\x65\xdc\xcc\xb6\x80\x2e\x0c\xc2\x92\x6e\xfc\x60\xb2\xe5\x93\x22\x04\xff\xa0\x6e\x11\x16\xe1\x79\xed\x24\xba\x15\xc9\x53\xd2\x2b\x73\x5e\x71\xca\x96\x5d\x32\xd5\x24\x75\xa9\x0a\xa8\x85\x14\x62\xf9\xb3\x62\xea\x87\x54\xc5\xa7\x84\xef\x69\x97\xf7\x72\x20\x52\x91\xd5\x67\xe1\x76\x2a\x3e\x27\xd0\xf6\x02\x23\xf9\xcb\xf8\x60\x74\xb0\xab\xc4\x56\x77\x70\xdd\x56\x24\xa0\x41\xd8\x36\x18\xb4\x4f\x57\x7b\x92\xb4\x2f\xd7\xb5\x40\x6b\x05\x7a\x8d\xda\x05\xf6\x64\x75\x6b\x2e\x64\x3e\xae\x30\x93\x0e\xae\x5d\xe6\xdb\x04\x86\x18\x76\xb9\xc8\x29\x32\xbb\x6b\x1a\xf9\x25\x66\xea\x15\x72\xbf\xec\x26\x2c\xa7\x25\xe7\x15\xc3\x56\x69\xd2\x6d\x1d\x5d\x1f\x14\x61\x6a\x69\xe1\xd8\x6d\x0c\xaa\xd6\xbd\x30\x12\x4d\xfc\xb1\x64\xea\x6b\x3b\xb3\xd0\x58\xd5\x36\x18\x16\xe6\x7e\xa1\x64\x51\x85\x9e\xb0\x76\xa5\xc7\x81\x71\xab\x54\x7e\x64\xcb\xa5\xcf\x42\xc7\x68\xc2\x45\x0e\xa0\xed\x5f\x4b\xca\xf9\x45\x7e\x1b\x2f\x97\xed\x5a\x54\x9e\x02\xbe\x61\xb2\x11\x1d\x87\xf7\xfc\x64\x44\xc7\x90\xd9\xcc\x06\x44\x1e\xf4\xd9\x24\x9d\xdd\x6a\x3a\x15\xee\x3a\x99\x9f\x6d\xe3\x62\x25\x93\xd5\x31\x2c\x5d\x7a\xcb\xcd\x13\x83\xf8\xaa\xd4\x6d\x3a\x62\xe3\x10\x8b\xc3\x94\xc5\x9d\x1c\x79\x7d\x87\x53\x9a\x73\x29\x49\x46\xb9\x93\xf5\xad\x53\x89\xf1\x90\xda\xfc\x44\x9c\x2b\xd4\xb9\x3e\x9d\xab\xd3\x26\x57\x65\x65\x3a\xf9\x9a\x8f\xee\x83\x4f\x20\xe5\x6a\x61\x71\xae\xb7\x22\xd6\xaa\x0b\x13\x26\xab\x2c\x27\xb7\x1a\x9c\x98\xe5\x2a\xf1\x2e\xcd\x22\x4c\xaa\x8e\x1d\x50\xf4\x61\xad\x67\xf7\x32\xaf\x80\xca\x15\xee\x5e\xf8\x30\xa9\x48\x26\x29\xd5\x1d\x42\x66\x6b\x0b\x26\x79\xe3\x36\x5e\x71\xf9\x3b\xa5\x56\x55\x84\x34\xd3\xbf\xc4\x18\x0c\x54\x26\x6e\x85\x74\x71\x76\x94\xaf\xf6\xc0\x95\xb8\xb2\x30\xa8\xa5\x54\xc0\x43\xec\x30\xad\x5d\x88\xdb\xc9\xb9\xea\x35\x54\x3a\xa4\xfd\x2e\xd8\xaa\x58\xe2\x9e\x97\x2b\x66\xdf\xa9\x30\xbb\x7d\x05\x9b\x89\x32\x41\x16\x94\xa2\x4c\xfc\x77\x29\xca\xa4\x6e\x64\xa0\x98\x4d\xae\xc4\xf5\x73\x24\xb9\xd4\x5a\x5d\x39\xcd\xb6\x42\xc1\x04\x40\x92\x97\x8d\x66\x1d\xd2\x74\xcc\x8a\xb1\x9c\x9c\x00\xc6\x65\xc9\x40\x5e\x75\x9e\x2d\xd8\xf3\x6e\xa7\xe3\xae\x56\xf5\xb3\x95\xb4\xf9\x62\x2b\x07\xea\xcc\x9d\x3a\xef\xcd\x75\xe4\x82\x09\xb4\x3f\x1e\xea\xfb\x0e\x9e\x77\xc1\x82\x85\xa5\x44\x83\x0b\x06\xbd\xc0\xdb\x72\xc9\x0d\x2b\x85\xe0\xd2\x86\x2a\x0b\x12\x7d\x11\x55\x29\x0b\x54\xdd\x79\x54\xe2\x56\xd8\x6b\x87\x14\x0c\xba\x6d\x61\x24\xf9\x38\xa4\xcf\xba\x43\x1c\x64\xe2\xa6\x12\x7d\xb2\x7c\x8b\x16\x8f\xce\xf4\x75\x61\x17\x52\x60\x36\x4f\x19\x4d\x53\x01\xd7\xa4\xd3\xe9\x86\xc6\xfc\xe8\x74\xd4\xf9\xa5\xf7\xef\xde\x4b\x0c\xbc\x7b\x0b\x9c\x7b\xe0\xdd\xfb\x96\xac\x80\xa3\xd6\x27\x4c\xd3\x96\x42\x2a\x0b\x5a\xfe\xdb\x0c\xb7\xca\xe0\xb0\xb5\x68\x99\xe4\x81\x16\xa3\x73\xdc\xca\x79\x13\xe4\xa2\x75\x9b\xce\x5b\x37\x24\xbb\x12\x79\x77\x71\x9c\xde\x48\xfe\x01\xef\x01\x8c\x75\x68\x72\xd7\xa9\x77\x6d\xa6\x6f\x69\x85\xae\xd0\xb4\x62\xc3\x83\x45\x24\xe9\x75\x9a\x7e\x98\xcf\xb4\xda\x65\x76\x6f\xa5\x90\x9c\x69\x19\xa3\x79\xdd\xa8\x3d\x67\x8a\xcb\xea\x05\x66\x51\xe9\xe8\xa9\xfa\x2e\xac\xfd\x93\xf9\x74\x8a\xe8\x6d\x01\xcd\x85\x86\x38\x01\x57\x0a\x90\x9f\x9d\xa3\xc9\x87\x57\x24\x8e\x6b\xfd\x19\xaf\x8a\xe9\xb8\x50\xe3\x56\x8d\x90\x2b\x0d\x6b\xa9\xa0\x10\x06\x7a\x97\x4b\x27\x32\x88\x5c\x00\xea\xfb\x13\xe4\xee\xeb\x97\x91\x85\x5c\x01\x91\x9f\x2e\xe3\xf4\xbc\x56\x77\x2d\x02\xfa\x9e\xc3\xe6\x36\xcc\x30\x56\x74\xe0\x40\x7b\x3d\x7d\xd4\xb5\x8a\x8d\x2d\x80\x82\x28\x28\xb2\xbc\x30\x8e\x88\xa7\x39\x9e\x5e\x66\x07\x7d\x8e\xcc\xbe\x6c\xa1\xdd\xab\x5e\xae\xc0\xeb\xac\x77\x71\x3c\xef\x56\xce\x91\xb7\xbb\x79\xbe\xa2\x9a\xf3\x2a\x21\x17\x1b\x4b\xd5\xd9\x92\xa0\x15\xfd\xd9\xac\xaa\xad\xd2\x7a\xa9\x8b\x63\xad\x05\xf6\xc2\xd0\x45\x87\x4a\x22\x7c\x7d\x29\x00\x73\xd1\xa0\xdd\xcf\x72\x89\x87\x12\x7a\xd5\x66\xb1\xc5\x00\xc4\x6a\x33\x68\xb2\xd7\xfb\x95\xe1\x84\x2c\x97\x5a\x81\x95\x8a\x27\x40\x9a\x1c\x19\x2e\xc3\x84\x41\xad\x70\xda\xde\xb0\xb5\xbc\x07\xf2\x0a\x57\x2d\x9c\x73\xc3\xb5\x74\xb7\x50\x72\x4f\x65\x83\xa0\xaa\x4e\x87\xc8\xbc\xb0\x89\xdc\x50\xd1\x2c\xbd\x6a\x83\x1b\x8a\x04\x8b\x01\xaa\x3d\xba\x3b\x94\x17\x3d\x59\x5e\xe8\x45\xa9\xd2\x56\xd8\x73\x2f\xc9\x12\x6b\xa8\x4a\x4d\xb3\x58\x96\xfa\xcc\xdd\xe0\x99\x54\x93\x2d\xef\x7b\xa3\x98\x10\xa6\xca\x0a\xf9\x65\x97\xdb\x1b\x02\xff\xbe\xe0\xaa\x53\x4d\xef\x83\x22\xb3\xbe\x8f\xf3\xbc\x31\x17\xa2\x9c\x08\xd3\xb4\x51\xb4\x43\x37\x9f\xe4\x15\x6f\x3d\x27\x59\x23\xab\x69\x2f\x38\x2b\x5b\x9a\xcd\x03\x2e\x9b\x72\x65\xe6\xe0\x83\x5e\x49\xaa\xe5\x12\x05\xf1\x23\x37\x77\xf0\xca\xbc\x34\x07\xeb\x36\x48\xf7\xa8\x2d\x47\xbc\xd6\x2a\x9a\x57\x98\x1e\x36\xae\x44\x42\xac\x23\x18\x71\xe5\xfc\xa4\x39\xd3\x90\x0f\xca\x17\xfc\x96\x8f\x08\xdd\x17\xa9\x88\x43\x9f\x84\x64\xb9\x2c\x1b\xc1\x90\xd4\xcd\x60\x39\x62\xd0\x3f\xf6\x19\x6c\xf7\x20\x95\xd9\xca\x3e\x5b\xc1\x72\x60\x50\xc9\xb9\xa9\x67\x10\xe0\xf0\x9e\xcf\x67\x03\x26\x90\x82\x81\x43\x1a\xdb\x6c\xeb\xe0\x7a\xd7\xf1\x12\xff\x2e\x73\x5d\x6f\x60\xb8\x92\x31\xfa\x9c\x0e\x7a\xe2\xab\xab\x33\x07\x79\xc3\x72\x37\x7e\x0b\xc7\x10\x21\x0e\xcb\x67\xb3\xb8\x76\x8d\xad\x58\xbc\x5b\x5d\xc3\xa5\xdb\xd5\xdc\x9c\x8a\xc7\xe2\x6a\xe6\xdc\xb5\x66\x5c\xaa\x86\x63\xc9\x54\x9a\x5c\x41\x70\xc7\x32\x59\x25\xad\x40\x0e\x40\xde\xb0\x49\x2e\x3e\x03\xdd\x92\xf7\xa7\xa1\xcf\x75\x1c\xe6\x98\xd0\x4b\xcc\x5e\x91\x04\xc5\xd6\x5c\x96\x84\xde\xaa\xed\x4c\x7a\x03\x6d\x6d\x48\xb3\xc1\x68\x6c\xae\x2a\xc4\xf2\x58\x93\x6b\x1b\x62\xd2\x10\xb2\xec\xdc\x7c\x4d\x40\xbf\x4c\xb8\xb2\xa4\x77\x5f\xc7\xe7\xd8\x11\xf0\x58\xc4\xd1\xaa\x1f\x07\x7e\x9b\x2e\x97\x44\xd8\xd9\xcf\xa9\xf8\x07\x28\x5d\xa7\x44\x38\x0c\xd5\xd3\x11\x9c\x7c\xd5\x7c\xb7\x95\x9b\xa2\xc9\x56\xd1\x57\x31\x60\xf3\x17\x0d\xc5\x2b\x19\x4e\x85\xae\xab\x4b\xcc\x11\x0f\x73\xcf\x74\xb5\x82\x89\x66\x25\x30\x2e\x8e\x7c\x64\xe1\xb1\x9f\x88\xa4\x6a\x9b\x7c\x99\xfb\xea\xe2\x4c\xbc\x2d\x10\x86\x28\xf8\xd0\x1b\x32\x71\x67\x03\x05\x7d\x22\x0f\xdb\x76\x3a\x58\x7d\xe1\xe2\x71\xb9\xf4\x33\x7d\xdc\x23\xde\xae\xa8\x3a\xea\x4e\xea\x0c\xe4\xa5\x8c\x00\xf2\x09\x0f\xff\xf0\x59\x71\xd3\x43\x7f\x34\x86\x71\x88\x75\x09\x2e\x95\x94\x92\xf4\x98\x78\x27\x0d\x62\x91\x81\x3c\x30\x07\x4d\xba\x10\xeb\x3f\x7b\x90\x84\xf2\xdc\x80\x62\xa8\x2b\x56\xb6\xef\xc5\xd5\xc4\xd0\xa1\x22\x19\x7d\x55\x99\xbc\x32\x6e\xdc\xee\x01\x6d\x30\xef\xb0\x16\xfe\xc8\x70\x12\x35\xd9\xce\x2a\x05\xb9\xdd\x03\x8b\x6c\x3e\x93\x91\x29\x88\xcc\x31\x56\xde\x6a\x61\xc0\x52\x13\x1e\x28\x3c\x41\xda\x54\x2e\xfb\x87\x74\x80\xe2\xac\xc1\x47\xa4\x23\x14\x2a\xa4\x65\xb9\xc0\x50\xd5\xf1\x85\xca\x9e\x2c\x64\x72\x4a\x5c\xa6\x96\x2d\x04\x0a\xfe\x52\x46\x52\xaf\xce\xf7\xd2\x97\x5e\x06\x87\x0b\x9d\xbc\x6d\x90\x32\x47\x91\x49\x1e\xda\x78\x1b\x6f\x77\xd3\x38\x3b\x1d\xeb\xe6\x18\x71\x37\x0f\xdd\xc2\x9c\x71\xb6\x11\xe4\xfc\xcd\x38\x6b\xb4\x7b\x60\x90\x15\x7c\x91\x68\x16\x34\x67\x09\x2d\xb8\x54\xc3\x9d\x88\xdb\x77\x15\x6c\x6a\x9f\x09\xd3\xf9\xb2\x46\x96\x91\xb0\x37\x20\xcf\xc2\xc9\x80\xe8\xab\x05\x63\xd1\x24\x91\x4d\xc6\x56\x93\x3e\xde\xd2\x3f\xef\x53\xb0\x8d\x4c\x0f\x31\xc8\x69\x88\x20\x16\x37\x0f\x79\x1e\x64\x61\xd2\xc4\xad\xcc\xc1\x25\x2e\x1e\x81\x14\x62\x48\xc4\x03\x65\x45\x72\xfc\x89\xc8\x56\x0e\x1f\x15\x0a\x93\x88\x75\xce\xd2\x1b\xbf\xd7\x85\xf8\x41\xcf\x48\x5d\xf1\x9d\xa6\xf3\x24\xf2\x05\xae\x54\xb1\xfc\x2f\x6c\xa1\xfe\x3a\x2b\x98\xff\x17\xb6\x70\xbf\x2e\x62\xdb\x77\xbf\xf9\x0c\xe4\xae\xc7\x42\x8c\x46\x28\x6f\x59\xf0\x3c\x73\xfc\x99\xd6\x5f\x7e\xe5\x3c\xf1\x13\xdf\xdf\x3b\x1d\xe5\x8f\xf3\xba\xf2\xa9\x13\xd7\x75\x18\x14\x24\xa1\x37\xfb\xe8\x0d\xac\xfb\xf2\x71\x48\xcd\xf5\x6b\xa3\xad\x07\xe3\xe1\xe8\x5d\xf4\x2e\x18\xcb\xbb\x37\xc7\xf7\xc5\x6d\x6b\x52\xc0\xe2\x51\x6f\x6c\x54\x12\xd2\x74\xc5\xe8\xee\xc9\x49\x6b\x9e\x10\x66\xdd\x35\x7a\x6f\xc1\xf2\xfe\xbd\x05\xb5\x5e\x1d\x41\x5b\x89\x0e\x75\xfe\xc4\xe4\x05\xe4\xae\xd3\x57\xc5\x85\xf2\x25\xcd\x55\x28\x16\xed\x2e\x80\x38\xf7\xbd\x1b\x12\xb1\x2b\x78\x85\xc9\xe5\x15\x83\x53\x92\xfc\x2a\x7e\x4f\x49\xf2\x93\xfa\x84\x3e\xaa\x4f\xe8\xa3\xfa\x14\xe3\x0b\x06\x59\x3a\x83\xe7\x29\x63\xe9\x14\x52\xf1\xf5\x22\x4d\xd8\x09\xf9\x84\x61\x3a\x67\x7c\x6b\x95\xb5\xd4\x8f\x43\x79\x17\xc0\x0c\x45\x5c\x6d\x38\x4d\x67\xfa\xcf\xd7\xbc\x2d\xf5\xf7\x0b\xd9\x9c\xfa\x75\xac\xba\xa7\x97\x24\xe1\x15\xe4\x5f\x02\x5e\xfe\xa9\xc0\xe5\x0f\x09\x7d\x2e\x4e\x5d\x1e\xa3\x88\xcc\x33\xf5\x43\xa2\x21\xff\x3e\x4d\x67\xf6\x4f\xde\x96\xfd\x5b\xb4\x61\x7f\x90\x3d\xc8\x2f\x0c\x7f\x14\xd7\xd1\x26\x0c\xce\x30\xcd\x66\x78\xc2\xc8\x35\xf6\xac\x47\xfe\x00\xf0\xad\x63\x06\x37\xcc\x95\xfd\x0f\x23\x38\x87\x57\xe5\xb3\x23\x5d\xd8\xf4\x56\x09\xc9\x8e\xf1\x34\xbd\x46\x71\x91\x9d\xde\x4f\x4a\x2f\x98\xc8\xbf\xc5\x89\x6b\x64\x3d\x67\xc2\xff\x12\x1f\x63\x68\x7c\xfa\xfd\x4c\xdc\xd5\x43\x70\xa4\x2e\xe9\xcf\xfa\x69\xe5\x7c\xca\xa4\x7a\x3e\x25\xb2\x0e\xa3\xcc\xa1\x7a\x0c\xe7\x4a\xb3\xde\x1b\x2b\xca\xfe\xda\xb1\x63\x69\x5b\xdb\x1a\x94\x36\xd3\x51\xc6\x2c\x5b\x5a\x2b\x3e\x59\x48\xe5\x5b\x03\xc5\x2a\x56\xfc\x5b\x3e\x49\xcf\x69\x6a\xbf\xb3\xa8\x2e\x9a\x61\xbe\x2e\x03\xb9\xaf\xbb\x09\xf4\x4d\x46\x50\xb7\x29\x77\x16\xdb\x80\xb4\x6e\x11\xae\x62\x34\xf2\xee\x7b\x63\x98\x38\x0a\x98\xb8\xd4\x70\x48\x02\xbb\x39\xde\x58\xbf\x58\x76\xc9\x30\xa9\x17\xa3\xe2\x22\xbc\xda\x49\x92\x85\x3e\x0d\x32\x1a\xc3\x79\x68\xc6\x50\x64\xdd\x56\xbe\x18\x2b\xf6\x0d\x83\x57\x12\xde\xee\x8f\xc2\x58\x84\x42\x0a\xa0\x08\xc0\x8b\x30\xeb\x74\x4a\x35\x2f\xeb\x35\x09\xbc\xe0\xb0\x53\xa3\x3e\x5e\x1b\x97\xf8\xad\xf9\xeb\x3c\x14\x17\x76\x72\x33\x98\xc0\xdd\x50\x5f\x52\xa5\x54\x40\x94\x65\xe4\x32\xf1\xcb\xbf\x16\x39\x9c\x03\x78\x01\x72\xb8\x13\x4e\x86\xa3\x71\x5f\x1d\xc7\x31\x03\x2b\xd2\x45\x38\x5d\xae\xe0\x25\xdc\x85\x29\x8c\x64\x78\xe5\x44\xbe\xe1\xbf\x53\x32\x5b\x4e\x8a\xb4\x24\x66\xc5\x99\x94\x2a\x72\xc2\xf5\xc8\x48\xc7\x52\xf4\x4d\xa9\x85\xbf\xd8\x7e\xca\x88\xcf\xc6\xb9\xe8\x53\x9e\x24\xb9\x86\xb7\xf0\x84\xf7\xbd\xd3\xf0\xc6\x96\x51\xfa\xc2\x99\x7f\x0d\xe5\x49\xcf\x4a\x38\xce\xae\x49\x94\xe0\x35\xda\xea\xcc\xbf\x2d\x6a\x95\x96\x9e\x5d\x2d\xd1\xf2\x9a\xb6\xc3\x10\x77\x3a\x53\xa3\x20\xab\x86\x7e\x09\xff\xf0\xa7\xd6\xcd\x66\x9b\x8e\x72\x07\xfe\x22\xc7\x68\x74\xd0\x8f\xcd\xcb\x38\x53\x7e\x7a\x7d\x66\x51\xb8\xb0\x8f\x64\x12\x80\xea\xc6\xec\xc7\x34\xa4\xd5\x55\x66\x7b\x55\x20\xe1\x0a\x76\xad\x19\xb0\xe6\xf9\x93\x92\xd1\xc5\xcd\x29\x15\x45\xed\x74\x7c\x22\x9f\x4f\xd2\x0e\x25\x95\xdd\xe9\xbe\x7a\xae\x7e\xb5\x8b\x75\x61\xe0\xa0\x21\x09\x83\xa9\x6b\x3d\x51\xc8\x67\x63\x80\x8c\x9e\x2a\x9e\x4f\xb8\xe7\x23\x48\x20\x06\xc5\x39\xdf\x0a\x3d\x1a\xde\x4b\x13\xb7\x49\xa0\x66\xe0\x92\x5e\x13\x43\x24\x2e\x3d\x1a\xc5\xe3\x10\xc9\x0b\xee\xa8\x9e\xb7\xdf\x9b\xe7\x2d\x69\x10\xbb\xf6\x64\x29\x05\xdf\xec\x32\xaf\xc4\x83\x27\x04\x8b\x87\xe7\xb4\xf5\xc2\xb4\xd7\x44\xfe\x5d\xf7\x74\xc8\xef\x23\x79\x89\xdd\x58\x48\x09\x91\xbd\x28\x1f\xd3\x59\x79\xc5\xe0\x22\x97\xfe\xb0\x3d\xa5\x9f\xca\xa6\x60\x71\x85\x6b\xbd\xa8\xb8\xc4\xd5\xe4\xc6\x56\xae\xaf\x34\x5e\x1d\xc7\xc0\x54\x84\x1b\xdf\xb4\x5e\x5b\x02\x48\xb6\x0d\x0c\x1f\x5d\xa0\x38\x3e\x47\x93\x0f\xd6\x51\xdc\xea\x9d\x2e\xd6\xbd\xa8\xa2\x25\x7d\x1e\xb4\x38\x4d\x5c\xbe\xc5\xae\x7a\x31\x4a\x71\xd3\xde\x48\x3f\xcd\xd5\x2d\x83\xd8\x57\xec\x75\x8b\x7b\xf5\xba\x39\xc4\xc0\xb8\x0f\x15\xe6\x32\x04\xa4\x8c\xad\x7f\x89\xed\xbe\xea\x64\xe6\x42\xb6\x68\xf1\x79\x57\xee\xb8\xe5\xf3\x6f\xa5\xbd\xb7\x91\x84\xe2\x1c\x7f\x12\x3e\x4f\x82\xf2\xa6\x0d\xe4\x95\x91\xb2\xe1\xf2\x3e\x6b\x37\x59\x27\x6e\x50\xdf\x99\x2d\x73\x63\x8f\x15\xef\x36\x54\x7c\x68\x18\x0c\x1d\xb9\x51\xcb\xa5\x4c\x8d\xe2\xb2\x02\xf4\x1d\x00\x22\x77\x0a\xcb\x57\x38\x80\x52\x6a\xf6\xa5\xef\x64\xc6\x94\x62\x73\xda\xbc\xb2\xce\xd3\xe8\x56\xa5\x31\xda\xa1\xa4\x15\x2b\xec\xac\xb8\x97\xc9\x0a\x23\xc7\xe8\x16\xd3\xec\xc5\xed\x7e\x64\x3e\xaa\x6f\xe1\x68\x9c\x53\x7c\x49\x32\x56\xcd\x43\x1d\x8d\x21\x09\xe3\x5a\x72\x9d\xbc\x48\x5a\x5f\x57\x00\x56\x5c\x39\x2e\x48\x5d\x79\xc7\x60\xd5\x13\x88\xd6\x0d\x96\xef\x12\x71\x83\xe5\xa0\x3a\x24\xbe\x4d\x91\xfc\x4c\xb4\x7c\x24\x06\x50\x7f\xa4\xa1\xc8\xe6\x9a\xf8\xdd\x1a\x9d\x60\xb7\x94\xd9\x82\xad\xa7\x4d\xec\x81\x06\xfa\xae\x1f\xae\x3c\x59\xd9\x37\x7a\xcf\x37\x59\xf9\xa3\xb1\x30\x59\x75\x78\xcb\x3c\xac\xa2\xf1\x19\x15\xaa\x5d\x69\x18\x42\xd9\x88\xcd\x7d\x79\x4a\xdf\x11\x39\x7d\x43\x3f\x0e\xa7\x35\xba\x27\xf0\x35\xfc\x08\x17\x39\xff\x3f\x85\xfb\x0c\x12\x00\x63\xa7\x73\x75\xe6\x67\x56\x1e\xcf\xba\xad\x5f\x98\x6a\xe2\x59\xb4\x5c\x3c\x19\xa8\xee\x4f\x38\xbd\xc2\x2d\x8a\xff\x98\xe3\x8c\x95\xae\x0a\x8b\x52\x9c\x25\xff\x50\x57\x6b\xb5\x52\xda\xba\x42\x59\x0b\xc5\x14\xa3\xe8\xb6\x75\x8e\x71\xd2\x52\xcf\x3f\xe2\xc8\x03\xe2\x79\x04\x00\xc9\x06\xcc\x22\x09\x78\x37\x6e\x21\x15\x6e\xc9\xec\xdb\x62\xc4\xab\x81\x2b\xee\x53\x93\xeb\xd6\x9e\xf2\xd2\x0b\x61\x5c\xce\x88\x30\x42\x5e\x28\x41\x93\x30\xf5\xe3\xca\x15\x4e\x38\x54\x4e\xe5\xe2\x4c\x6e\x89\x9d\xca\xac\xba\x10\x12\x15\x54\x60\xac\xe5\xc9\x27\x63\x02\x27\x95\xb7\x35\x95\x22\x23\x3f\x30\x9d\x6c\xa0\xaa\x99\x4b\x8a\x26\x79\x01\x52\xf1\xb4\x5f\x62\xa6\x71\x00\x03\x6c\x9a\x32\x17\x29\xb9\xf0\x18\x94\xbc\xcf\xba\x33\xf3\x02\x32\x18\xd0\xe7\xa1\x4e\xaa\xd2\xa5\xea\x35\x24\x0a\x7b\x20\x2f\x75\x5a\xc1\xa7\xd2\x93\xb8\xb9\x6b\x15\x77\xf0\x7d\xc0\x5c\xa9\xc6\x6d\xcd\x96\x6c\xa1\x45\xf5\x61\xd4\xa8\x75\x7e\x2b\xfc\x18\xef\xad\x97\x4a\x62\x2e\xd6\xac\xed\x46\xeb\x60\x57\x3e\x86\x9e\x27\xff\x6f\xc0\x23\xbf\x4e\x2b\x48\x61\xc2\x17\x9a\x78\x7f\x4d\xbd\xc8\x9f\x58\xaf\xb0\x72\x5d\x4f\x4b\x4f\xcf\x7a\xa0\x4b\xdc\xbd\x27\x9a\xb3\x64\x2b\x19\x75\xc7\xf2\x16\x7e\xc9\xec\xee\x0a\x96\x24\xe1\x15\xb8\xe2\x62\xf9\x9e\xeb\xb3\xa9\xd2\x49\xa8\xca\xc8\xe7\x74\xf1\xfa\x89\x98\x11\xbf\xf4\x72\xeb\x0c\xcd\x65\x06\xbf\xf8\xa3\x5c\x26\x6e\xde\xe6\x65\xe2\x8f\x5a\x99\x7c\x5c\x56\x94\x8a\xc7\x65\x4b\xe5\x17\x24\x21\xd9\x15\x2f\x96\x7f\x95\x4b\x49\x42\x44\x55\xfe\x6f\xb9\x24\xc3\xec\x28\x95\xbb\x32\x07\xb0\x7e\xda\x6f\x8a\x09\xa2\x35\xbc\x40\x5b\x5e\x15\xb9\x76\x1a\x1c\x32\xeb\x19\x3b\xfc\xe0\x8f\x39\x9e\xe3\xc8\x83\x1f\xca\x9f\xf5\xbb\xab\x1e\x3c\x62\xf6\x2b\x77\x76\xc9\x01\xe3\xf2\xfb\x98\x85\x0b\xae\x6f\x66\x33\x34\xc1\xfb\x51\xdf\xf3\x60\x86\xd9\xab\x94\x2a\xd7\x49\xbf\xdd\x53\x1f\xde\xa4\xd7\x98\xff\xba\x42\x85\x1b\x9a\xff\xa6\x1c\x10\x47\x2f\xf0\x45\x4a\xb1\xd4\x99\xa2\x7e\xbb\x97\xc3\x97\x4d\x4d\xeb\x96\x6a\x1d\x6d\xd6\x74\x37\x87\xaf\x58\xe8\x9d\x9d\x25\x97\x67\x0a\xc2\x53\xda\xc6\x7f\x6a\xda\x46\xe8\x79\x96\x22\xaf\x50\x31\xe7\xab\x69\xc8\x5c\x97\xb5\x09\x53\xd0\x03\xc6\xe5\x2d\x7e\xab\xc3\xea\x3e\x09\xe9\x50\x45\x47\xfa\x0c\x0c\x89\x54\x32\x69\x21\x05\x0e\xe4\x5b\x17\xea\xde\x50\x01\x58\x3e\x3f\x80\xe5\xb5\xe8\xa5\x6f\x8b\x5c\xbe\xfd\x3d\xb0\xbf\x1a\xfd\xde\x77\x7c\xe5\x3b\xf1\xc6\xd9\xfe\xe8\x3c\x4b\xe9\x79\x91\xed\x6c\xbd\x8b\xeb\xc8\x4f\x77\xe6\xd8\x37\xe5\xa9\xf3\xfd\x46\xbe\x86\xc1\x77\x1d\x9d\x4f\x2f\x9e\x13\xcb\x0b\xbe\xfd\x91\x29\x67\x07\xfc\x24\x35\xc4\xff\x30\xff\x47\x06\xd4\xbc\xbd\x68\xd6\x12\x49\xa4\xf5\xc3\xab\x34\xd3\x8f\xe1\x1a\x1d\x11\x27\x97\x24\x31\x79\x8e\x85\xda\x57\xb6\xdb\x2d\x6d\x51\x2c\x98\x02\x40\xed\x6b\xaf\x85\x2c\xe5\x80\xe5\xc4\x45\xde\x65\x71\x12\x45\x3c\x2f\x99\x64\x0f\xbc\x2d\x06\x7f\x2e\x9c\x03\x25\x20\x50\x93\xcb\xc5\xdd\xa6\x1a\x9b\xba\xfa\xbd\x6a\x7b\x90\xed\xb5\xd2\xa4\xa2\x3f\xa8\xd6\x5a\xf8\x1a\x27\x4c\xdf\x0c\x7a\x8e\x27\x5c\x00\x36\x80\xca\xc4\xd4\xb2\x9a\xd3\x7e\x6f\xbd\x67\x42\xe5\xe1\xc3\x0d\x54\x9a\x75\x58\xa9\xae\x6c\x7c\xcc\xdd\xac\x12\x63\x92\xb5\xcc\xd3\xb6\x0a\x09\xf5\x94\x77\x3b\xf4\x93\x90\x9b\x17\xf2\x99\xee\x76\x98\xd4\x31\x69\xb8\xec\xd5\x49\x94\xfa\x8b\x63\x15\x2c\xab\xef\xaf\x70\x74\xc4\x73\x55\x26\xf8\x31\xf3\xdd\xfc\x02\x19\xe4\x4a\x60\x2c\x25\x5d\x1f\xcb\x97\xb0\xfb\x14\x4e\x94\x75\xd6\x27\xf9\x00\xe9\xb8\x92\xd1\x88\x4d\x73\x82\x7d\x95\xf5\xf9\xe2\x76\xcf\x84\x95\x16\xc5\x65\xe7\x0e\x76\x59\x2e\xfd\x9f\xb9\x35\xf7\x3b\x80\xf2\x5f\x71\x6b\x1b\x06\x30\xe3\xe6\xd8\x27\xa6\xf6\xf4\x52\x1f\xe8\x82\x61\xfa\x2a\xe6\x88\xf8\x45\xe0\x99\x85\xc8\x68\x3d\x31\x18\x30\xa1\xf5\x20\xad\xea\x30\xd8\x03\x95\x95\x34\xc2\xe3\xe5\x52\x09\xb7\x4c\x64\x76\xe4\x15\x13\x4b\x65\x65\x56\xaa\xb1\xb1\x49\x24\xb1\xbe\x85\x58\x18\x18\x7c\xd3\x37\xb7\xcc\x54\xd5\x29\x0b\xbc\x49\x97\x5a\xc3\x0c\xea\x95\x1d\xae\xcc\xcb\x97\x3e\x70\xd2\xd2\x38\xcb\xc9\x36\x4a\x15\x2b\xee\xba\xe1\xab\x37\x6c\x77\x2b\xaf\x61\xd8\xa8\x62\x00\x91\x10\x18\xf7\x94\x41\x43\x22\x88\xa1\x3a\x45\x1b\x87\xab\xa6\x58\x5f\xfa\x14\x37\x4e\xe5\xca\xda\xf2\x7a\xa8\x98\x6f\x01\xfa\xc0\x63\x3c\xc2\x63\x13\x45\x55\x02\x56\x89\x45\x12\x89\xd5\xd5\xf6\x69\xa7\x53\x7b\x7d\x51\x6f\x76\xa0\xd3\x11\xe7\x13\xcb\x3b\x45\x71\xb8\x09\xf2\x0e\xc2\x14\xf2\xdd\x28\x13\x3c\x96\xca\xbd\xad\x1d\x86\x3f\xb2\x4e\x47\xef\x92\x61\xa8\xbe\x4b\xc9\xe7\xce\x0c\x2b\x9b\x2e\xb0\xfc\x36\x1d\x2e\x19\xe1\xed\x90\x94\xbd\xcf\xed\x22\xda\x9b\x84\xdd\x41\x52\x3c\xcc\x9d\xd8\xcf\x6b\xd2\x51\xa2\xf8\xc5\xf5\x48\x21\xfb\xff\xa8\xfb\x12\xe6\xb6\x6d\x35\xc0\xbf\x22\x73\xf3\x34\xc4\x33\xc4\xea\xf0\x49\x95\x71\x53\xe7\x68\xda\x5c\x4d\xd2\xbe\x36\x8a\xd6\xa1\x45\xc8\x46\x4d\x91\x2a\x08\x39\x71\x25\xfe\xf7\x1d\xdc\x00\x0f\xc9\xcd\x3b\x66\x76\x3a\xd3\xc8\x24\x88\xe3\x03\xf0\xdd\xc7\x04\x4f\xf7\x22\x5e\xcc\x50\x77\x5b\x6a\x7f\x62\x5f\xd1\x3c\x98\xeb\x94\x68\x56\x95\x41\x48\x22\xa9\xb3\x51\xe1\xb2\x92\xca\xeb\xcf\x78\xd6\x06\xb7\x8d\x84\x8a\xee\x91\xa7\xb3\xd7\x05\x24\xed\xcd\x26\x88\x61\x21\x71\xb4\x91\xf4\xd6\x6d\xbb\xc5\xcf\x78\xf5\x2b\xf8\x07\xcf\x20\x5a\x2a\x03\x67\xa9\x44\xba\x0a\x9e\xd1\x92\x89\x41\x34\x93\x29\x18\xcf\x5c\x5d\xa4\xc3\x29\x45\xf2\x04\x31\x36\xc9\x36\x44\x45\x88\x3d\x11\xec\x27\xfb\xa5\xa5\x2e\x59\xd7\x3c\x51\xcb\xb7\x34\x63\x85\x06\x81\x64\x8a\x0c\x78\xe1\x4a\x65\xf1\x4f\xc4\xb9\x51\x95\xbb\xc6\xac\xa3\xba\xaa\x8b\xb5\xd7\x75\x2d\x9d\x35\x72\x8b\xdb\xcf\x7c\x5e\x42\x8e\x28\xf6\xf7\x6d\xda\x2f\x70\xf1\xba\xcd\x66\x68\x14\x75\x61\x62\x99\x0a\x0b\x6d\x1d\xcc\xa1\x80\x62\x18\x43\x5c\x3c\xad\x4d\x2c\x5c\x95\x00\xae\xd4\xad\x7e\x4d\x01\x8c\x83\x3c\xe3\xbe\x12\x62\xc7\x7e\x93\xcf\x4b\x20\x5e\x3d\xce\x33\x24\xde\x58\x01\x30\x55\x81\x34\x06\x63\xd4\x2a\x90\x22\x38\x00\xae\x3c\xdb\xb6\xdf\x0a\xeb\x08\x9f\x1d\xe1\x10\x42\xec\x41\x04\xfe\x27\x36\xfe\x2f\xcb\x26\x89\x3c\x06\x70\xa6\x7f\xc5\x65\x82\x0c\x0d\x00\x6b\x47\xee\xb6\xd0\xf7\x76\x9c\xa6\xd5\x1b\xb2\x54\xbf\xe2\xa0\x45\x29\xc9\x66\xf2\x5b\xfb\xa8\xa5\x19\xc3\x97\x04\x22\x95\xb0\x0d\x45\x0f\x11\x3f\xe5\x7b\x11\xe5\x41\x9e\x3c\x49\x9e\x9c\xc8\x79\x3c\xbb\x36\xde\xd3\x6d\xb3\xd5\x19\xfe\xda\x66\xa6\x1b\x8c\x5d\x72\xb6\x63\x6b\x44\x16\x78\xeb\x3e\x5a\x57\xab\x42\x14\x6a\x5d\xe8\x21\x41\x79\x51\xe0\xab\x2c\x4e\xa5\x6c\xf5\x34\x27\xcf\xb3\x0c\x11\x49\xb8\x8a\xa6\x0a\x12\xb2\x53\x37\xf2\x0a\x3e\x11\x99\x3e\x6b\x25\xad\x26\x4f\xe9\xb4\x16\x29\x6c\xf7\x33\x47\x74\x76\xfd\x4a\x21\x12\x33\x49\x9e\xe9\x50\xb8\x92\x11\x5b\x84\x20\x0a\xbb\xbc\x40\xf1\x2d\x32\x7e\x4e\x8c\x10\xef\x0d\xd8\x2c\x24\x26\x6c\xda\xaa\xb2\x02\x19\x83\x25\x75\x47\x85\xbe\x67\xce\x62\x5a\xbb\x04\xa0\x6c\x9f\x90\xa3\x6f\xb9\x0f\x99\x17\xd1\xcc\x8a\x99\x14\x5e\x73\x2d\x96\x32\x64\x17\x0d\xb3\xb8\xae\xca\x7e\xd9\x8c\xca\x33\x86\xfc\xc7\x44\xc7\xad\x11\x7e\x69\xe3\x8a\xd1\xd6\x99\xe7\x22\x26\x37\x72\x8e\x8f\x84\x97\x04\x4a\x34\x0f\x43\xe1\x5e\x9f\x9b\xca\xba\xdd\xdc\x8f\x81\x8d\xa4\xdc\x03\x48\xf2\x19\x2a\x0a\x0e\xa0\x57\x79\x82\x44\x79\x3d\x85\x96\xf7\x06\xe5\x92\xa0\x65\x4c\x90\x0b\x41\x7d\x45\xea\xac\x5e\xed\x12\x09\xf0\x41\x72\x5f\x20\xa3\x6e\xd7\x52\x97\x4b\xdb\xfb\x18\x35\x98\x40\xb3\x08\xc9\xca\x6a\x73\x9f\xd7\x08\xf0\x33\x55\x5c\x62\x8c\xb9\x81\x38\x33\x95\x1f\x2a\x9b\x91\x4d\x9b\x28\x52\xca\x59\x8e\xcd\xe6\x2f\x0a\x0b\x4b\xc2\x85\x79\x95\x45\xcc\x18\x8b\xf8\x9f\xa3\x59\x76\x9d\xb3\x30\xb6\x68\x56\xaa\x69\x56\xa1\x68\x56\xde\x4c\xb3\xf6\xfa\xa5\xac\xac\xcb\x0e\x82\xd8\xca\x36\x0c\x21\x4a\x22\xcd\xae\x71\xaa\x1c\x61\xb8\x21\x4c\xf9\xe1\xee\xc6\x3b\xd0\x3e\xbf\x4d\xb7\xbd\xaf\x37\x42\xd5\x72\x11\xfc\x20\x87\x92\xb9\xd0\xc0\x72\x21\x53\xb4\x49\xa5\x99\x36\xb8\xf1\x67\xc7\x67\x47\x1e\x15\xe9\xb7\x8a\xac\xba\xc7\xbc\x3e\x8b\x2e\x2f\x84\x22\x2a\x6a\x47\x23\x9d\xb1\x84\x41\x65\x0c\x64\x49\xb6\xfa\xf9\x43\xa0\x52\xe3\x45\xdd\xe1\x9d\x77\x00\x62\x40\x76\xde\xc7\x81\xae\x7e\xa4\x6d\x41\x0c\x05\x8f\xfd\x3d\xbc\xd9\xe0\x28\x8a\xde\x52\x5e\x45\xbd\xca\x20\xb6\xe3\x37\x5e\xdb\x89\x13\x16\xbe\x45\x06\xae\xfc\xc2\x05\x17\x79\x26\x37\xf1\x3c\x5f\x2c\x05\x5d\xe1\x95\x03\x4b\x9c\x15\x88\x50\x73\x48\x38\xa3\xd3\xa8\x09\x49\x48\x8c\x33\x71\xac\xcd\x61\x2b\x2a\x15\xbb\x1d\xec\x24\x4e\x7b\x93\xd3\xb3\xda\x52\x71\x5f\xb5\x19\xc6\xa5\x41\x59\x44\xb4\x69\x28\xde\x86\x53\x32\x30\x8e\x19\xba\xac\x20\x5d\x81\x12\xa2\x88\xd8\xac\xae\xc1\x27\xd7\x7e\x06\x9d\x57\x90\x04\xfa\xba\x49\x9e\x56\x78\x49\xea\xbf\xc1\x18\x07\x17\x49\x4c\xe3\x88\xc2\xc4\x57\x8b\x80\x28\xe0\x7a\x02\xc8\x8b\x9c\xc9\xfb\xc8\x91\x36\xe6\x27\x01\x25\x4f\x73\x22\x6d\x24\x67\x5b\xf9\x7f\x6c\x33\xde\x21\xd2\xf8\x1f\x54\xd5\x5d\x28\x28\x72\xc6\x82\x4a\xdb\x91\xf1\xc1\x31\xc8\x83\x9b\xb6\x75\xb1\x39\x1c\xa1\xb6\x77\x63\x53\x77\x5c\x28\x8c\xf0\x19\xe9\xe1\xb0\x89\x8f\x50\xb6\x74\x4d\xfd\xf5\xfe\x98\x3c\xaf\x67\x83\xb0\x37\x28\x81\x6d\xe0\x71\x18\xce\xed\xcc\xd0\x0e\x84\x53\x51\x1c\x42\x0a\x4a\xa4\xd0\x96\x2c\xac\x14\xd3\xd8\x64\x77\xde\x1b\xb8\x27\xb2\x76\x7c\x44\xa2\x65\x1e\x79\xce\x7d\x40\xa3\xbd\x3d\xe7\xec\xe2\x2c\x11\xfc\xa5\x0a\xca\x8e\x22\x0a\x36\x1b\x04\x91\x72\x36\xf9\xe5\xfe\x26\xf1\x9d\x16\xf1\xaa\xc6\x33\x43\x9f\x7f\x30\xab\xad\xa8\x33\xab\x0c\x63\xcb\x5b\x17\x65\xba\x8d\x2a\xa8\xcf\x7d\xa9\x6c\x0b\x6c\x05\x85\xf6\x7c\x13\xe8\xde\xc5\xdd\x2a\xc8\xbc\x4e\xf8\x74\xf8\xb9\x16\x42\x65\x80\xb6\xd6\xe0\x9a\x17\xb8\xa0\x46\x93\x3b\x67\x97\xe2\x69\x66\x29\x7f\x3f\x5f\xa3\xec\xe7\x15\x46\xd4\x7e\x9a\x59\x2c\xa9\x05\x29\x77\x21\x3a\x79\xfb\x93\x8c\x22\xa2\x81\xa9\xfa\xd0\xaf\x39\x52\xaf\xbd\xae\x61\xce\x48\xdd\xba\xb2\x6c\x41\xab\xeb\xe6\x0f\x45\x08\xd0\x15\xa2\x9d\x3f\x6d\x18\xb9\x61\x3c\xce\x71\x75\x80\xe3\xa0\x37\x54\xbb\x4f\xe2\xa9\x11\xe1\x65\xa8\x4f\xc9\xb1\x87\x34\xfa\x6b\x0e\xbe\x5e\x77\xf8\x7b\xe3\xf8\xe3\x9a\x7c\xd5\x21\x96\x2c\x41\x1b\x26\xb0\x9b\x42\xa4\xa2\xde\x2e\xe3\x34\xce\x66\x66\x5c\xb6\x0e\x5e\xad\x2e\xf4\x9b\x0e\xb8\x8c\x5d\x27\xc0\xd9\x19\x7b\xdb\x78\xf5\xe6\xc6\x23\x35\xa1\xd3\x88\x94\xcd\x23\x36\xb0\x3f\x2e\x68\x75\xe4\x01\xe3\x08\x78\x85\x37\xcd\xac\x18\xed\x14\x19\x67\x0f\xa3\xfe\x38\xeb\xf5\x80\x62\x07\xb6\x41\xc3\x1d\x82\xb1\x99\x36\xe6\x62\x1c\x46\xd3\x4c\xa4\xac\x9e\xed\x0f\x60\x1f\x72\x65\x9a\xe6\x42\xb0\x4a\x29\xdf\xf8\x45\x9f\xb7\xb7\x6c\x51\x95\x66\xb2\x28\x8c\xb3\xb7\x2d\xd7\x47\xa5\x10\x00\xbc\xa8\xa4\xad\x0d\xb6\x93\xdd\xd7\xe1\xaf\xab\xf3\x6d\x36\xbe\x6c\xd5\x74\xee\x00\x24\xba\xdb\xf7\xb6\x86\x56\x41\xbd\xb5\x7f\x1e\xaa\xaa\x67\xc4\xbe\x90\xa7\xb2\x82\x90\xf6\xf7\x0d\xf9\x69\x4f\x85\x25\x10\x8d\x23\xd9\xfa\x8a\x97\xaf\x52\xe6\xad\xe0\x92\x92\x3a\xb1\x37\xb8\xe2\xaf\xd0\xb0\x18\x57\x58\x72\x37\x4b\x29\x71\x88\xa3\x29\x6a\xde\x78\x04\x07\x9a\x43\xd8\x21\x2a\x2b\xa0\x30\xce\xaf\xbe\xf2\x75\x0b\xee\x51\x33\x2e\xb7\x68\x01\x34\x0f\x68\x02\xec\x9a\x28\x8c\xab\xb2\xd2\xc9\xa4\x2d\xd9\x99\x00\x2b\xfa\xa7\x3f\xc6\xdf\xaa\xcb\x29\x62\x80\x34\x67\x38\xa1\x13\x3c\x9d\xda\xca\x4d\x47\x2c\xa7\xcd\xdb\x9b\x81\x31\x55\x31\x75\xdc\x0c\xdf\x66\x2a\xe0\x67\xe6\x4f\x21\x08\xb8\xaa\x81\xfa\x81\xe1\xe3\xea\xdc\x57\xaa\x23\xd1\x8d\x23\x40\xbb\xbc\xb6\xb1\x27\x8a\x71\x2a\xbc\x2f\xe2\x12\x81\x48\x13\xce\x5d\x0e\x8c\x71\x1d\xac\x2b\x0f\x78\x81\xcc\xc0\x98\xe3\xed\xba\xa9\x5b\x68\x9c\xed\x21\x43\xcd\x31\x6b\x69\x6c\x6b\x11\x19\xfe\xab\xc6\x09\x34\x00\x86\x5d\x57\x6b\xd1\xdc\x85\x11\xbb\xa3\x54\x90\x7b\xd9\xf4\x58\xe7\x59\x6a\x24\xe4\xba\xdc\x95\x23\x75\x3d\x96\xdc\x8b\xcc\xfc\x7e\x56\x67\x69\x24\xef\xa7\xcc\xf1\xee\x3b\x71\x40\x84\x11\xe7\x86\x2a\x6d\x55\xd3\xf7\xca\x10\xe6\xbe\x33\x0a\xc5\xdf\x54\x17\x15\x79\xbc\xf5\x94\x9d\xb5\x80\x33\x54\x65\xf1\xb2\xb3\x2c\xb0\xfa\x42\x10\xcb\xe9\x35\x8b\x9d\x42\xe5\x86\x81\x71\x6a\x90\x77\xb3\x0d\x9d\x09\x01\x78\xcc\xcd\x4b\x38\xd9\x8b\x22\xca\x7e\x55\x46\x2c\x6d\x4a\x53\x67\x75\x78\x93\xd6\xf9\x98\xd4\x47\x2d\x67\x4d\x32\x2f\x90\x5f\x02\xd7\xef\x84\x56\x1c\x4d\xb0\xeb\x67\x42\x5a\x3d\x58\x2a\xa6\x7c\x2b\x68\x86\xef\x40\x1b\xd8\x03\xf9\x99\xfa\x28\x94\x0e\x56\xc2\x5d\xce\x4a\x93\xd6\x18\x8d\x43\x2b\xee\xbc\x36\xdb\xe0\x64\x30\xab\x4a\x9e\xd4\x95\x3c\x79\xc7\x76\x2b\x95\x04\xd7\xb4\xd3\x55\x2a\x61\xa6\xa5\xaf\xba\x32\xc0\xb6\x4b\x34\x6a\x87\x51\x4d\xa1\x2a\xfb\x7a\xc4\x63\xbc\x4c\x67\x4f\x73\xeb\x82\x02\xd8\xdf\x8b\xb6\x09\x1e\x32\xb6\xda\x6f\x1e\xfa\x3d\xaf\xc0\x50\x1f\x5a\xb8\x69\x89\x91\x65\x7f\x7a\x02\xaf\x33\x6b\x78\xbd\xe2\xad\xb3\x74\x15\x94\x5b\x94\xf6\xa8\x62\x43\x13\x6c\xf5\x19\xad\xc9\xf3\xd1\x5e\x3f\x74\xcc\x65\xe5\x7d\xa7\xdc\x32\x97\x46\x0d\x57\x6d\x4a\x54\x3b\xb0\x81\x92\x09\x46\x6f\x51\x96\x20\x82\xb3\x2b\x4e\xec\x1d\x3f\xfc\x37\x24\x5f\xe0\x02\x69\x5d\xbf\x2d\x8b\xbb\x2a\xe5\xdc\x79\xe9\x2a\x8a\x7d\x00\xc6\x94\xaf\xaf\x41\x4d\x6c\x96\xa2\x68\x16\x9f\x6f\x85\x66\x29\x43\x43\xf4\x96\x42\x64\x13\x6e\x95\x0e\xa7\xed\xc8\x6e\xe7\xd8\xdc\xae\x04\xd6\x6a\xb4\x2a\xb4\xa1\x2a\x36\x1b\x77\xaa\xa5\x7d\x44\x45\x44\x82\x61\xed\xe1\x1b\xaa\xb8\xce\x36\x82\xb3\xa7\xfc\x2c\x2a\xa7\xfc\x0d\x65\xc7\xbc\x1e\x2a\xb2\xa5\x1f\x76\xa0\x38\x17\x4a\xa3\xde\x40\x5d\x5e\xa1\xef\x6c\x16\xa0\xc4\x2d\x6b\x7c\x57\xf1\x38\xde\x22\xa1\x09\x2e\xbd\xb1\x13\x59\x80\x0a\x34\x2a\x02\xaa\x0c\x84\x4b\xa7\xe5\x69\x53\xec\x1d\x89\xfa\x63\xf2\xed\xee\x0f\xc6\x64\x7f\x1f\xfc\x24\x85\xaa\xe6\x96\x13\x32\x85\x5e\x76\xd5\x2b\x68\x4c\x7a\x82\xe1\x40\x89\xe5\xf1\xd7\x28\xed\x29\x30\xd5\xb5\x16\x2a\xf5\x55\x33\x6d\x92\xcb\x70\xca\x86\x50\x72\xb7\x56\x9c\xfc\xdc\x65\xbf\x7d\xc2\xc4\xb2\x39\xce\xe2\x34\xbd\x5b\xeb\x62\xe3\x51\x7f\x4c\x8d\xaf\x03\xdd\xdf\x07\x64\x42\xa7\xbe\xa2\xab\xdb\x80\xd4\x34\x1d\x0e\x24\xa9\xa1\xae\xde\xcf\xf6\x8f\x27\x64\x6a\x80\xd4\xae\xbd\xd9\xba\x3d\xb5\x46\x4d\xd3\xd3\x7a\x20\xa5\xd7\x71\x90\x99\x51\xff\x6d\x57\xfb\xd4\x8a\x6c\xd5\x9b\x8c\x9b\x95\x45\xda\x35\x23\xf7\x91\x83\xd8\xd6\xb4\x3a\x93\x12\x84\xf5\x67\xa5\xed\xc5\xc1\xd9\xd1\x56\x57\x3a\x09\x7f\xab\xe8\x78\x73\x6c\xc0\x3c\xc6\x29\x4a\xb4\x57\x93\x15\xb2\xf5\x31\xeb\x3c\x58\x53\x37\x60\xa0\xac\x1d\xab\x9a\x06\x67\x49\xa1\x8c\xe1\x50\xda\xaf\x94\xfd\x69\xb4\x86\x33\xfd\x2b\xd1\xbf\x56\xda\xac\xd6\xc0\xc4\xda\x88\x6a\x25\x59\x62\x57\x6c\xad\x20\x38\xc7\x37\x59\x39\x33\x33\xa6\xc2\x3d\xce\xc8\x3e\xb4\xa2\x63\xe9\x60\x2a\x7b\x57\xc1\xbb\x4a\x9f\x34\x8f\x44\x11\x45\xc6\xfe\xf8\x8d\x72\x25\x97\x1d\x01\x80\x57\xd1\x8f\xd4\x9f\x6f\x3b\xb6\x2a\x8c\xf7\x65\xbc\xe4\x16\xa9\xdb\xa8\x3f\xbe\xaa\x45\x63\x28\xc0\xbe\xd8\xbf\xdd\xdf\x1f\x2f\x2c\xc5\x94\x0d\x15\x2e\x1e\x10\x60\x26\x7e\xc7\x20\x7e\xa9\x85\xe0\x73\x0d\x5d\x05\x80\x38\xea\x8f\xe3\xfb\xdc\xe7\xd8\x48\xbb\x5b\x65\xb8\x49\x3c\x85\x8a\xf0\xd6\xa9\x6e\xb7\xeb\xdf\x29\xf9\x08\x5e\x2a\xa9\x86\xfb\x50\xe9\xa3\x74\xd6\xba\x93\x2e\x3a\xad\xd2\x2e\xd5\x1d\x08\xcf\xd5\x2f\xe9\xa9\xf4\x48\x1f\xaf\x77\x62\x3b\xac\xdd\xbb\x04\x60\xfc\xae\x15\xdc\x5f\x38\xb8\x1f\xed\x04\x37\x94\xfa\x2c\x7e\x85\xdb\x77\x6f\xa1\x64\x19\xa7\x9b\xdf\x4c\x37\xed\x33\x79\xb4\xeb\xd3\xbb\x3a\x1d\x6f\x60\x8d\x4a\x3b\x2e\x79\x32\x85\x17\x76\xaa\xa6\x78\xbb\x2e\x32\x7e\xc8\x0e\x4b\xaf\x07\x9a\xd4\x89\xf1\x34\x68\x31\xc8\xa1\x96\x3c\x56\xca\x5a\x95\x99\xc0\x33\x86\xfb\x7f\xd5\xc2\xd6\x3d\x68\xb7\x3e\x91\x99\xe2\xf4\xb8\xc7\xbd\xd1\x3c\x38\x41\x22\x56\xf4\x4e\xa9\x8c\xef\x7b\xd7\x9b\xcd\xde\x36\xdd\xe9\x35\xcc\x00\xcc\x25\xfc\x33\x00\x57\x72\x17\x33\x00\xe7\x12\x5e\x0d\x92\x17\x81\x2b\x98\xf3\xe2\x70\x73\x7f\x2e\x33\x98\x77\xbb\xea\x97\x9a\xfe\x85\x58\xeb\x5c\x1a\x5f\xf1\xdc\x8f\x4d\xb9\x7d\xdb\xaf\xeb\x99\x9f\xc1\x79\x60\xf2\x49\xf0\xb2\x18\x6e\xa0\xd3\x1f\xbc\x89\xca\x2d\x01\x00\xe4\x4b\xc6\x3a\xc5\x16\x37\xac\x37\xd9\xe7\xff\x6b\x23\xce\xed\x5a\x96\xb6\xac\xd0\x96\xca\x88\x47\xd1\xcb\x8a\x7b\xa2\x6f\xf5\xbd\x4e\xac\xbc\xc6\x06\xcc\xe1\x5c\x39\x1e\x20\x9d\xa4\x23\x2b\x01\x9c\x07\x95\x54\x1a\xf6\xe8\x3c\xc2\x0f\x4e\xa6\x40\x4d\x93\xb5\x6f\xce\x09\x50\xbd\x82\x95\x2c\x76\x76\x28\xa7\xf4\x76\x9b\xe9\x4b\xba\xd9\xcc\x94\xd6\x5a\xe1\x5c\xbb\x98\x19\x62\x60\xe0\x74\x06\x70\xc3\xec\xbc\x2d\xca\x70\xc7\x1c\x84\x5a\x32\x51\xc3\xe2\xcd\x26\x91\xc3\xe2\xa6\x61\x69\xf4\x10\x6b\xdc\xc8\x06\x66\x8b\xb8\xa8\x5d\xa6\xc9\x74\x7c\xe1\xc6\x69\xcb\x84\x38\xdf\x3d\x58\x23\xdb\x42\x5d\x72\xaf\x67\xc9\x39\x08\xae\x22\xfc\x98\x7d\x02\xba\x12\x8f\xbb\x60\xd1\x49\xaf\xf3\x60\x8d\x4a\xd6\x8c\xa1\xad\x5f\xb7\x1b\x60\x5d\x3e\x47\x65\xd5\xd1\xf8\xfc\xb3\x21\x9d\x2d\x48\x46\x61\x16\xee\x99\xec\x23\xd0\xed\xfa\x9f\x25\x88\xb4\x1b\xf4\x25\x57\xcd\x68\x02\xf4\xbd\x50\x8c\x48\xfc\x64\x8b\x73\xbc\xf8\x90\x3e\x7f\xf0\x07\xbe\x02\xbc\x63\x64\x31\xc6\x15\xa2\x6f\x64\xee\x4b\x65\x67\xe3\x7a\x30\x5a\xe9\xdf\xb6\xff\xf3\xd0\x52\xa7\xf7\xa5\xff\x03\x44\xe6\xf4\xf2\xac\xe9\xb6\xb0\xaf\x70\xfb\xcb\xe8\xce\x2a\x1f\x4b\x98\x50\x39\x83\x09\x00\xf0\x83\x06\xd8\xef\xd4\xff\x60\x4b\x85\xf0\x1c\x26\x22\x6c\xd3\x4d\x8e\xa9\xbe\xed\x76\x5f\x9a\x42\xfe\x72\x98\x27\xba\xb7\x3a\xcd\xfb\x9d\xfa\x4f\x9c\xfe\xe5\x79\x64\x93\x9e\xc1\x38\xb8\xe1\x56\x82\x97\x8d\xc0\xfb\x60\x5c\xb3\x9e\x28\x95\xc3\x07\xe9\x96\xbe\x23\x7f\x09\x02\x0e\x03\xf4\x9c\x11\xb9\xd7\xec\x7f\x37\x3c\x61\x68\x7d\x38\xed\xf7\x84\x2c\xd7\x5b\x0b\xc9\xa4\x65\x44\xc5\x5d\x17\x07\x88\x2b\x0e\x56\xea\x0f\x95\xf2\xa9\x86\x1a\x11\x4c\x6d\xd4\x18\x6b\x56\x36\xda\xeb\xc3\x38\xc8\x6f\x11\x21\x38\x41\xef\x55\x06\x1f\x3f\x0d\x74\x36\x1f\x17\x93\xc6\xe2\x9a\xd3\xe8\x86\x4d\xe3\x33\x17\xa9\x1f\x0e\x94\xed\x4b\xc5\x9a\x61\x45\xc8\xc7\x44\x94\x39\xd1\x4e\x45\x1a\xaa\x9f\x39\x28\x45\x10\x3a\x02\x6b\x1a\x21\x65\xc8\xd3\x8e\x1d\xd8\xbe\xb0\x9f\xb5\xdd\x4d\x5d\x3c\x62\x13\x3c\xe3\x57\x15\x3b\x67\x38\x85\x3f\xc0\x0c\x3e\x81\x1f\xf8\x40\xbc\x30\xdb\x5b\x14\xa7\x32\xec\x92\xf1\x50\x51\x14\xdd\x80\xe7\x7a\x75\x4e\xc2\xae\xdd\x9a\x30\x2d\x2d\xc7\x72\x99\xa2\xe7\x28\xe7\xc8\x5c\x03\x4d\x0a\xae\xcf\xf8\x4e\x58\x74\x0c\xee\xdc\xab\xd7\xda\xf5\x78\xa5\x91\x86\xe9\x96\xbd\x6f\x3a\xb3\x59\x35\x96\xb9\xe2\x02\xa6\x51\x78\x2e\xb8\xb8\x2a\x58\xca\x1a\x2a\xa1\xce\xfa\xce\x68\x50\xdc\x65\x33\xf1\xc7\x93\x5b\x46\xd7\x7c\xb7\x05\x70\x35\x7f\x15\x1e\xff\xae\x91\x93\xbf\xb3\xf9\x75\x3c\xf7\x39\x43\xf9\x85\x67\xf9\x76\xb9\x72\xc0\xf8\x22\x9c\xad\xd0\x58\x9c\x3b\xa1\xf3\x51\xb9\xd7\x85\x1e\xa8\x68\xdc\x27\xbb\xc0\xb8\x5d\xed\xa7\x49\xe5\x3a\x76\xf5\x11\xd8\xd6\x47\x38\x83\xe0\x09\x9d\x6e\x19\x47\xc5\x05\xe2\x88\x58\x78\x70\x8f\x5a\xae\x5d\x63\xac\xc3\x23\x90\x29\xfd\x1a\xb6\x32\xce\xf2\xa6\xdf\x19\x0d\xc2\xf3\x06\x8e\xdb\xf6\x62\xe7\xd8\xd9\x95\xed\xf5\xf6\x8c\x9b\xce\xbb\xb6\x7f\x29\xab\x6f\x83\x2b\xbe\x90\x35\x78\x84\x72\x09\xe0\xf3\x66\x77\x23\x63\x1a\xdf\x1b\x68\xfc\x20\x0c\x78\x72\x19\xdc\x14\x56\x15\xcd\x08\xe7\xc0\x9a\x6f\xa0\xa6\x9e\x4d\x8d\x2a\x4a\xe2\xa6\xb6\x55\x01\xb9\xa9\x4d\x83\xb1\xa3\x69\x79\x08\x6c\x36\xa4\xb4\x2c\xe2\xda\x9b\x5e\x6b\x73\x14\xa1\x6a\xb5\x3f\xeb\x4f\x1c\x7d\x8e\xfa\xac\x89\x5a\x5b\xd6\x14\x71\xa9\xa4\x97\xe7\xdf\x56\x9c\xfb\x71\x84\x84\x5f\xc4\xfd\x90\x9e\x1b\x3a\xbb\x97\x6d\x36\x59\x14\x3d\xab\xfa\x1d\x2b\x57\x1b\x26\xcd\x88\xea\xe2\x9a\x8f\xd8\x8b\xf0\x66\x13\x5b\x0e\x38\xf2\x2c\xfb\x64\xb3\xc1\x80\x4f\x28\xb6\x6f\x09\x0f\xe4\xda\x8b\x1c\xce\x64\xb3\x61\x27\x66\x2f\x72\x18\x14\xc0\x08\x5b\xd9\xc2\x3e\x55\xea\x45\x59\xb9\x45\x50\xd0\x90\x3a\xef\x8c\x93\xbc\x7e\x48\x79\xdd\xd0\x2d\x0d\x9c\xa5\x71\x7c\x21\xb3\x3a\x75\xf2\x79\x07\x59\x22\x83\x06\x59\xaa\xc7\x2e\x22\xba\x17\x45\x18\xe6\xd1\xd2\x27\x32\x3c\xa9\x95\x3d\xa3\xb0\xe0\x59\xce\x90\xb2\x68\xb5\xc9\xb1\x57\x0e\x26\x07\x63\x14\x08\x88\x48\x22\xc3\x76\xc3\x79\xe0\x3b\x5c\x1b\xcc\x0d\x5b\x55\x3e\xf3\x31\x44\x36\xb5\x2a\xab\xb4\xd6\xe4\xa5\x4b\x81\x4e\xef\xeb\xc0\x04\x26\x16\xb4\x57\x8c\xf5\xb9\xd6\x0a\xa0\xb9\xfe\x75\x15\x59\xb0\xe2\x89\x39\x8c\xf7\x7a\x6e\x3a\x18\x5f\x73\x79\x41\xa7\x45\x5d\x46\xb9\x22\x15\xcb\x6e\x77\x19\x34\x19\x37\x81\x65\xed\x89\x83\x0f\xaf\x7c\xab\x42\x2c\x52\x55\xba\x45\x77\x57\x51\xbe\x17\x45\x09\x5c\x44\x4d\x19\x32\x8d\xfb\x19\x12\x9e\x3a\x10\x95\xbe\xcf\x0b\xed\xfa\x39\xd8\x6c\x5e\x51\xa0\x52\x8a\xd4\x76\x01\x00\xfb\x48\xef\x51\x53\x7e\x93\x5a\xbe\x93\x39\x80\xb7\x92\x72\xe7\x00\xde\x45\xa9\xfa\x79\xd9\x96\x01\x07\x59\x19\x70\x6e\xe1\x1d\x80\xe7\x36\x4f\x24\x47\x47\xf0\x12\x2e\xc4\xcd\x0d\x8a\xd5\xa5\xca\x67\xdd\xed\xe2\x6e\x77\x2e\x01\x0a\xaf\x5c\x27\x95\x07\x94\x9f\xb8\x9c\x9d\x1f\x97\x37\x38\x67\x8c\x88\xba\xbd\x12\x20\xe7\x25\x18\xaf\x2a\xa2\xc1\x36\xfc\x63\xd9\x76\x5d\xe9\xc1\xa2\x4f\xd5\xe4\x59\x22\xbb\x3e\x9e\xfb\xb4\xc3\x18\xe2\x38\x9b\xa1\x7c\xce\xcb\xd8\x30\x16\x18\x47\xca\x32\x2f\xfd\x06\x70\x4d\x8e\xc4\xb6\xdf\x10\x76\x1c\x36\xfa\x91\x0e\xbc\x14\xf1\x7d\xc2\x4a\xaf\xb8\x36\xd1\x3f\xcf\xd4\xfd\x6f\xf6\xad\xbc\x9e\x26\x26\x29\x34\x2e\xef\x0b\x2a\x2e\x26\xc3\xeb\x9a\xce\xef\xb9\xce\x25\xb7\x88\x72\xff\x4a\x3b\xb1\x2d\x2a\xac\xe5\xfa\xba\xa6\xac\x7b\x0e\x00\xfc\xc3\x4f\x24\x56\x11\x77\x9c\xc9\xff\xee\x56\x62\x5b\x47\xb1\x60\x2d\x16\x8d\xa9\x9b\xb4\xea\x46\x55\xaf\x71\x94\xa7\x2a\x11\x93\xe5\x16\xbd\x35\x21\x13\x01\xa1\xbe\xb3\xf5\x76\x3a\x0d\xe1\x83\xed\xe9\xec\x54\x6c\x27\x75\x42\x31\x78\x58\xa7\xca\xae\x2d\xef\x1f\x71\x72\x6c\x45\x6a\x6c\x55\x76\x42\xd2\x7c\x73\x13\xa2\xbd\x81\xed\x78\x9e\x9c\x4b\x5d\x96\x49\xc0\xa0\xd9\x3b\xdd\xb4\x6e\x20\x1f\xb8\xee\xc4\xfa\x81\xe8\x93\x89\x67\xc6\xfc\x24\x6a\x68\x96\xee\x7d\xd4\xbc\x43\x7d\x86\xba\x58\x80\x5c\x12\x6d\x28\x4c\x50\x99\x3b\x68\xa8\x73\x50\x69\x32\x41\x53\x3b\x6a\x41\x10\x57\x41\x0e\x95\xfa\x79\x2b\x54\x1a\x41\xa9\xaa\x8e\xd6\x04\x51\x6a\x0b\xa2\x0e\x64\x06\xdc\x5b\xd8\xc6\xb2\xeb\x86\x64\x4c\x65\x43\x97\x12\x62\x06\xa6\xb4\xac\x0b\x33\xcd\x99\x8e\xc6\x9a\xb8\xa9\x85\xf1\x14\x85\x96\xaa\xb2\xd6\x40\x65\x7a\x00\x15\x04\x67\xb9\x70\xf8\xea\x5d\x5b\xaa\x28\x00\x4a\x01\x4f\x3e\x3b\xc1\x52\x2f\x9b\x77\xd0\xd5\x27\x96\x72\x40\xb5\x66\xed\x01\x6d\x3e\x15\x5d\x8a\xf4\x13\xba\x40\xa2\x5c\x6e\xa0\x3f\x2f\xd5\x1a\x77\xf7\x24\x96\xdb\xd0\x95\xea\xa0\x34\x2b\xbd\xc7\xbc\x64\x96\xa0\xa6\xa9\x99\x94\x41\x22\x2b\xd1\xda\x69\x20\x9e\x95\xd7\x71\xc1\x07\x46\x89\xef\x26\x6c\x70\xc7\x94\x1f\xd9\xad\x4b\x21\xd9\xac\xb7\x34\x97\xb2\x8f\xcc\xc4\xb4\xb5\xa5\x68\x52\xea\xd4\x4b\xdb\x1a\xeb\x46\xa5\x3a\x20\xee\xd2\xd4\x53\xed\xc8\xeb\x7a\x89\x58\x88\x43\x7d\x61\x44\x71\x99\x19\x6a\xc7\xf0\xac\x49\x69\xa7\x72\x72\x77\x4a\x39\x5b\xcb\x0f\xdc\x86\xec\x5e\xea\x3f\xdd\x5b\x29\x5d\x85\xfa\xa1\xf3\xb9\xd3\xbe\xac\xde\x9f\xbf\x71\x15\xeb\x97\x8f\xda\x69\x21\xff\xa4\xb6\x23\x6f\xb7\xcb\xab\x5c\x04\x59\x9e\xa0\xf7\x77\x4b\x64\xda\xfd\xab\xea\x14\x2f\xf2\x92\x32\x2c\xcd\xc6\x36\x99\xd2\x9d\xc7\x91\x29\xf3\xe9\x65\xfc\x36\x11\xd3\xe5\xef\xd4\x96\xd9\xac\xe8\x58\x47\x1f\x2e\xe5\xa2\x7f\x09\xaf\x2d\x9d\x21\x96\x09\x77\xb5\xda\xf0\xaa\x8f\x75\x59\x89\x59\x56\xb3\x8e\x79\xd2\x11\x37\x1b\x1e\x23\xe5\x19\x10\xc5\x45\xec\xec\x37\x3c\x2f\xee\x53\x3a\x8d\x1e\x53\x65\xdc\xc0\xd2\x94\xc8\x8e\x02\x86\xb1\x4a\x76\x50\x44\x7d\xed\xc9\x6e\x0f\xcb\x61\x16\x4f\x8a\xfd\xfd\x29\x00\x30\x35\x2b\xff\x91\xd6\xad\xf1\x32\x43\xa2\x63\x3d\x24\x52\xa5\x3a\x61\xdf\xf7\x23\x5d\x94\x47\x31\xf0\x64\x5c\x89\x75\x65\xcc\x9e\x36\xe7\x9b\x6c\xea\x3c\xc0\xc9\xf6\x69\xef\x0c\x64\xbd\xcd\xcc\x11\x62\x15\xb7\x62\xf2\xf0\xda\x8a\x4a\xf5\x36\x12\x9a\xd6\x14\x9c\xa5\x21\x56\x3f\x07\x61\x2c\xaa\x34\x88\x19\x73\x51\x40\x33\x3f\x4d\x62\x19\x9b\xd3\x78\x20\x52\x32\x13\xc9\xa8\x1a\x41\x0b\x12\xa9\x20\xfa\x99\x46\xde\x83\x07\x9c\xaf\x41\x85\x67\x96\xf4\x13\xd5\x9e\xfa\x34\xe0\xaf\x5f\xe0\x82\x02\xeb\xb7\x34\xdf\x98\xa8\x4e\x12\xd1\xc9\xcf\x74\x3a\x96\xd1\x06\xec\x37\x2f\x1c\x4d\x26\x68\x1a\xed\xf5\xad\x4b\xf1\xdb\xee\xce\x85\x5c\xd5\xdc\xbf\x66\x6a\x59\xcf\x56\xb7\x54\xd7\xc3\xcd\x7d\xe2\xba\xcb\xd5\x35\x5a\xbc\x08\x9c\xfa\x52\x8a\x57\xeb\x8a\x97\x8f\xed\x16\x61\x45\x86\x92\xe9\x18\xdb\x12\x41\x1c\x7c\x78\x72\x86\x90\x8f\x15\x47\x0d\x91\x0e\x16\xc4\x36\x32\x20\xb5\x82\xbd\xc4\x3a\x1f\x3a\x29\xc7\x9e\x38\x3d\x59\x84\xd4\x5b\x9d\xb0\xdd\x51\x90\x66\xda\xe0\x8f\xe4\xb1\xc0\x22\xee\x54\xb9\x3a\xef\xf5\x25\xc7\x8a\xd1\x7f\x32\x4d\xac\x46\x78\xb3\x6b\x53\x9d\x74\x4b\x58\x96\xfe\x4c\xa9\x32\x9e\x88\xb4\x62\xec\x1e\xfd\xa2\xd2\xe6\xaa\x46\x52\x54\xb4\x9a\xbc\xaf\x36\xa9\xf4\xd3\x3e\x74\xf3\xc4\x44\xd8\x57\x63\xc0\x8b\x8b\x2a\x29\x4f\x16\x84\x9d\x7c\x43\xf6\xda\x27\xb1\x48\x81\x93\xda\x96\x43\x88\x6a\x89\x6f\x79\x44\x3a\x3f\xeb\x6d\x89\xbf\xde\xb7\xa5\xcf\xc2\x32\xb1\x92\x72\x4e\x52\x99\x71\xb7\x65\x37\xfd\x98\x75\x7a\x8e\xc3\x52\xa7\xd7\x11\x49\x4e\xd3\x6d\xf9\xa1\x3f\x28\x30\x97\x3e\x86\xf5\xdd\x07\x0d\x9b\x3f\x89\xa7\x51\x5a\xb6\xec\x4a\x15\xc0\x08\x62\x98\x82\x4a\xfc\xd2\x8e\x6f\xc5\x56\x39\xa1\x43\x2d\x5f\xd8\x6d\xca\x3c\x7b\xce\x9d\x64\xaa\x65\x7d\x6b\x5f\x35\x04\x80\x94\xf2\xbc\xa0\x9d\x1f\x57\xc2\x07\xf0\x66\x23\xea\xe6\x49\xc1\xaa\xea\x1a\xd6\xd2\x4b\x7b\x90\x84\xf2\xec\x75\x53\x86\x7e\xe7\x31\x1a\x3a\xbb\x8e\xc9\x23\xea\xf7\x95\xd7\xe3\x84\xc2\x6c\x1a\x71\x5d\x40\xd3\x3d\x0a\xec\xec\xa3\x19\x5b\xa5\x15\x2c\x50\x9b\x52\x35\xf4\xa6\xc1\x51\x7f\xeb\x4c\xb0\x9c\x89\x23\x1b\x55\x26\x64\x75\xc9\x3a\x74\x73\x0d\xd5\x66\x54\x9b\x80\xe3\x84\xdb\xf2\x91\x6c\x22\xb3\x38\xea\xd8\xce\xed\x23\x29\x8b\xc3\x2c\xcf\x66\xb1\xba\xc7\x95\xb9\x2b\x87\xec\x6d\x9e\xde\x2d\xdd\x37\x7c\x61\xd1\x87\x0c\xd9\xa6\x0b\x9e\xf8\x12\xf3\x7f\x14\x28\x85\xdf\x16\x2e\xf8\xbf\xdc\x7c\xa0\x1d\x29\x7d\x12\xa5\xc8\x47\x93\xfe\x14\x68\xef\x4a\x9e\xff\x1f\x8b\xe7\x48\xfb\x31\x4d\x01\xa3\x18\xdc\xf2\x90\x72\x3a\x08\xc9\x66\x83\xcf\xb8\xf6\x01\x71\xd7\x1d\x2c\x62\x5b\x4a\xae\xe7\x47\x91\xcc\x68\xc7\x29\x89\xab\xfa\x70\x2e\x48\xa5\x4c\xf6\x05\x97\x27\x54\xe5\x14\x9d\x41\x46\x26\x50\x57\xc5\xbe\x44\xd1\x92\xa8\x2f\x29\x1e\xe5\x22\x14\x8e\x53\xd1\xaa\x9a\x04\x62\x9c\x6d\x36\xad\x4d\x84\xb1\x36\x8b\x4c\x61\x58\xa7\x61\x94\x95\x4a\x0c\xb2\x46\xfe\x76\xa0\x13\xe7\x59\xf3\xed\x76\xff\x70\x33\x12\xd6\x97\xd4\x34\x04\x70\xd6\x34\xa8\x8a\x52\x72\x78\xbb\xd1\xb7\xc3\x6e\xd7\x6f\x1e\xab\xb1\x67\x0d\xbf\xd6\xcf\x74\x8b\xda\x27\x22\x53\x77\x75\x8a\x15\x71\x4e\xcd\xd8\x99\xe4\x88\xc1\xa8\x0d\xec\x8a\xdd\xb0\xe7\x02\xea\xf0\xea\x76\xfd\x67\xbb\x60\xba\x7d\xca\xf6\xda\x9b\xbb\xda\xb9\xf6\xbf\x01\x69\x01\xa0\x91\x36\x16\x75\xda\x00\xc0\x79\x94\x7f\xa1\xf8\x86\xc7\xb7\x97\x4e\x99\xa5\x14\x99\x08\x1f\x7e\x8f\x5b\xdc\x98\xdc\x08\x4b\xd2\x12\x61\x89\xa7\xe3\x02\xf9\x99\xc8\x8e\x80\x78\x59\x0a\x34\xc9\xa6\x11\x9d\x64\x53\x60\x22\x27\xf5\xe8\x85\x15\x44\xea\x49\x89\x91\x17\x85\xdd\x6c\xbc\xa5\x4a\x9f\xcc\xfe\x96\xb2\x40\x8e\x22\x4f\x73\x21\x1e\x9c\xd9\x7f\xa2\x4c\x67\x01\x4e\x1a\x98\x49\x55\x28\xa8\x8a\x0b\xa8\x15\x1b\xae\x11\x83\xae\x8a\xac\xb0\x02\x57\xaf\x6a\x8c\x20\x2b\xe2\xaa\xba\x7f\x73\x9c\xa6\x2f\x19\x83\x1a\xcb\x07\x82\xaf\x7f\x9a\xa9\xca\x7f\x17\xe2\xcc\x5a\x9a\xcc\x8b\xba\x1a\xf4\xc2\x54\xed\xd7\x6a\x0a\x09\x02\xfd\x80\x67\x35\x7d\x9a\x45\x2a\xd8\xe9\xe2\x3a\xce\x92\x14\xd9\x82\x3d\x2f\x6c\xe9\x83\xb5\xdf\x9c\x78\x91\x17\x4d\xf1\x3c\x5d\xc0\x4d\xed\x29\x31\x4e\x1b\xee\x87\x4a\xd8\xd8\x12\x62\xeb\x41\xbe\x47\x8a\xd0\x62\xd0\xed\x92\xfd\x7d\x2d\x10\x97\x3e\x01\xfb\x03\x88\xa2\x4f\x0f\xd6\xa4\x84\xdc\xb7\xec\x13\x80\x57\x62\x26\x3c\x65\x7c\xe5\xd0\x7f\x7a\xb0\x76\xf7\xa1\x5c\x14\x1d\xf5\x4c\x96\x44\xd4\x7f\xf3\xad\x61\x0d\x06\x1d\xc1\x0b\xea\x37\x6a\x5f\x4c\x5b\xb6\xc9\x6c\xec\x39\x6a\xbe\x9d\x02\xbc\x26\x1a\xc7\xda\x93\xc7\x31\x45\x41\x96\x7f\xb6\x14\x5b\xab\xe6\x5e\xd8\x20\x50\x24\x24\x4f\x3c\xae\x5a\x5a\x2d\x76\x36\x27\xab\x2c\xc3\xd9\x95\x57\xd3\x2f\x29\x69\xf9\xba\xfd\x6b\x5d\xb6\x58\x1d\x17\xfa\x4f\x17\x7c\x1c\xd6\xce\xc7\xde\x63\x06\x35\x0f\x7e\xea\x29\xd0\xa8\x8f\xcb\x45\xf1\x49\x26\x9d\x68\x51\x57\x99\xa6\xf5\xe3\x67\xd9\x5c\x2f\xb2\xab\xf7\xa8\xa0\x2f\xe3\x6c\x25\x34\xca\x05\x8d\x17\xcb\xcd\xc6\x00\x12\x92\x68\x80\x46\xff\xb4\xf2\xa1\xd3\x00\xa5\xf1\xb2\x40\xbc\x80\x79\x40\xf3\xa7\xf8\x0b\x4a\xfc\x11\x00\x63\xab\xb0\x95\x48\x3f\x69\x96\xdf\xed\xea\xfa\x55\xa8\x57\xd9\x36\xd8\x07\x0f\x23\xeb\x9c\x74\xbb\x44\xff\x2d\x81\x23\xd5\x7c\x5a\x7b\x58\x51\x2e\xaa\xab\xab\xed\x06\xe6\x2e\xf7\x2b\xd7\xdd\xdf\x7d\xb0\xfa\xa0\x46\xcf\x0c\x2a\xd0\x43\xd4\x35\x96\x9a\xe8\xed\xb8\xd5\xa6\x9a\x1e\xc4\xd1\x12\xf1\xc4\x19\x63\xcc\x03\xb5\x7d\x9d\xd5\x11\xc3\x81\xb9\x7e\xaa\x28\x09\x2f\xc0\x57\xb6\x9f\x31\x9b\x0b\x5c\x69\x2d\x81\xe8\xe5\x4d\x1a\xdf\x71\xfb\xbb\x07\x09\xbc\x56\x89\xa2\x74\xf3\x6b\xd4\x3c\x5b\xa3\x32\x53\x86\x42\x36\x8b\x87\xfd\x33\x36\x71\x7b\x29\x08\x84\x4b\xe4\x4f\xc8\x94\x1d\x4c\xdd\xed\x72\xb7\x4a\x84\x07\x10\x92\xa9\x15\xb5\xfe\x30\xea\x1b\xdd\x99\xf8\xd1\x1b\x98\x3e\xe7\x7a\x65\xe4\x4c\xa9\x78\xb8\xce\x5d\xe5\xff\xf1\x67\x88\x4d\x87\xeb\x96\x1a\x5e\x98\x9e\xae\x50\x3d\x53\x60\x8e\xf6\x91\xca\xb5\xbd\x17\x61\xfb\xb6\x70\xa5\xa9\xcc\x58\x5b\x75\x48\xa3\x11\xb2\xa0\x31\xa6\x13\x3c\x8d\x08\x24\x11\x35\x5b\x57\x96\xa6\x8b\xc8\xd2\xb0\x56\xaa\x7e\xaa\x46\x6c\x22\xd3\xcd\xc6\xf3\xa4\xf6\xe5\x76\x0b\xc1\x84\x85\x3c\xa8\x15\x8a\x69\x4a\xe5\xaa\xea\x73\xce\x05\x25\x55\x52\x8a\x1d\x52\x6a\x68\x67\xa6\xd9\x5f\x45\x2d\x8b\x25\x9a\x19\xa6\xb8\xa8\xdc\x32\x2b\xd2\x4b\x5a\x4f\x2a\xcf\xa4\x05\xc4\x7e\x2a\xcb\x5a\xbf\x93\xb5\xbe\x8d\xd9\x4d\xf2\xf6\xd2\xe8\x29\xc8\x7a\xbc\xd9\x78\x4c\x96\x8a\x89\x57\xb5\x33\xe2\x7d\x35\x6f\x53\x69\x89\xf8\x75\x3b\x90\x35\x33\xad\xd1\xac\x18\x9d\xcc\x7a\xec\x16\x15\x0b\x90\xb3\x1a\xdd\xae\x82\x40\x84\x49\x07\xee\xf9\xd6\x92\x1e\x46\x07\xc0\x16\x1b\x28\x8a\x0e\xf4\x92\xd9\xa4\x2d\xef\x16\xb9\x11\x4c\x16\x55\x93\x76\x9f\xca\x79\x1a\x96\xdb\xde\x1f\x9d\xf7\xcf\x7e\x58\xeb\xdd\x59\x47\x73\x20\x5f\x65\xe3\x54\xfc\x9a\x1e\xbc\x06\xb6\xd6\x6e\xf4\x31\x29\xab\xab\xaa\xef\x4e\x5b\x27\xd6\xc1\xaa\x50\x84\x66\x70\x8f\xaa\xe0\x1e\xb9\xe0\xae\x48\x2d\xcd\xd0\xbe\x07\x60\x9b\xfa\xd1\x20\x6a\x36\x4e\xa9\x29\xdc\xdb\x1e\xa5\x3e\x70\x2d\x50\x0d\x26\xc3\x8e\x03\x82\xa1\x6b\x70\x94\x4f\x07\x9a\xaa\x49\x81\xce\x85\x8b\x64\x57\xa1\x43\xa3\x9d\x16\x92\xdb\xd2\x86\x47\x7b\x13\xf8\x6f\x7b\x62\x86\x4a\x37\x03\x98\x4f\x61\x78\x7f\x70\x4b\x81\x18\xb8\x93\x56\x2c\x9d\xe6\x04\x6b\x73\xaa\x4c\xde\x32\x70\xf2\xd7\xd2\x96\x68\x7c\x34\x2d\x13\x64\x03\x62\x6a\xbb\xb3\x0e\x12\x6a\x84\x6b\xe9\xb6\x71\x0e\x04\x17\x0b\x55\xb4\xaf\x43\xf1\x1d\x4c\x5e\xc1\xe3\xf6\x4e\xd9\x68\x13\x7a\xf3\x9c\x7c\x8e\x49\x52\x78\xb0\x6e\xc9\xdf\x66\xbf\x94\xb6\xf1\x48\xe7\x31\x31\xb7\x2f\xac\xdc\xe9\x4a\xaa\x09\x1f\x18\x4d\x52\xd4\x2f\x2b\x2e\x7c\xf6\xae\xe8\xdc\x36\xeb\x52\x47\x2f\xdb\xe7\xa6\x6a\x4d\x55\xb7\x7a\x5c\x77\x0e\xb1\x28\x96\x5b\x03\xc5\x13\xb5\xc4\x3d\x51\x51\x53\x14\x41\x39\xab\x7d\x33\x21\xd3\x90\x56\xaa\x88\x73\x0f\x91\xb2\x91\x52\x51\xe5\xd2\x73\x87\x74\x81\xef\x38\xf8\xf0\xaa\x4a\xaf\x55\x49\x7b\x00\x9b\x68\xb5\x60\x88\x71\x76\x25\x69\xaa\xa6\x7f\x4a\xb3\x80\xff\x72\x25\x51\xde\xea\x07\x1f\x55\x9c\x08\xec\xe6\x2a\x28\xaf\xd2\xb7\xbe\x81\x6e\xd7\xfd\x06\x37\x9b\xa2\x02\x44\xed\xa3\x5d\xe9\x72\x42\x65\x2d\x33\xa4\xf4\x68\x9c\x89\xe1\x69\xc1\xf9\xaa\xe5\x26\x57\x7c\x13\x5a\x26\x26\xaf\xe9\xbd\xa6\x53\x1f\x95\x63\x51\x55\x48\x80\x3a\xf0\x9a\xd0\x29\x50\x13\x12\x13\xb1\x49\x75\xdb\x9c\x9a\xe6\x61\x37\x69\x71\x69\x6d\x06\xd3\x58\x1e\xb8\x6d\x53\x56\x15\x05\xdc\x36\x82\xd5\x35\xcd\x8c\xcb\x52\xe5\xe8\x70\x9d\xaf\x58\xa4\xe5\x88\x23\x0f\xe9\xa5\xcb\x47\x1a\x2f\xac\x55\x46\xa3\x7e\x79\x1b\xa7\x38\x51\x15\xa0\xad\xb1\x14\x39\x79\x24\x72\x32\x55\xb2\x67\x18\xf6\xf5\x9d\xb0\x3a\xd4\x72\xe7\x59\x4d\x7e\x15\x4d\x54\xc8\x82\x6d\x42\xba\x50\xd6\x23\xc7\xf8\xef\xb6\xf9\x8c\xb3\x24\xe7\x51\x38\xe7\xa2\x51\x22\x5b\x81\x09\x9a\x8a\x92\xbc\x2a\x16\xd2\x1a\x9d\x77\xc0\x0b\xd9\x73\x4f\xd7\x1f\x7c\x0a\x94\x66\xe5\xd3\x77\x9a\x4f\xe6\x8a\x8f\xce\xfa\x63\xf6\x09\xf2\xba\xfa\xae\x83\x42\x16\x79\x1d\x4f\xc7\x1c\x38\x32\xb1\xc0\x2b\x60\x8c\xf7\xa3\x4f\x0f\xd6\x59\xf9\x60\x3d\xe8\xf7\xff\x89\xca\x7f\xc8\xce\xf6\xd9\xa7\xf0\xbe\x45\x7f\x65\x49\x35\x24\x4b\xaa\x49\xa4\x15\xaa\x5c\x62\xec\x99\xc0\xe8\xea\x19\x8f\xcc\xf5\x79\x95\x60\x39\x01\x4d\x1f\x7a\x14\x2f\x70\x76\xd5\x53\xf2\x06\xaf\x72\x59\x8e\x79\xe4\xe0\x58\xd6\x26\x76\x7a\x31\x4b\x40\xa5\xd5\x98\x47\xd6\xc8\x57\xe5\xc7\xec\x93\xf8\xd3\x2b\x3f\x66\x9e\xce\xc1\x9d\xe4\xb3\x15\x3f\xb0\x22\x41\xa0\x02\xbf\xc7\xcf\xaf\x11\x26\xe3\x80\xa2\x2f\x3c\x1a\x81\xe1\x3f\x0c\xe3\x52\xfb\x58\x1a\xa9\x86\x09\x06\x96\x73\xb6\xed\x5b\xef\x78\xd2\xde\x22\x00\x73\x46\x33\x7e\xe6\x0e\x26\xdd\x6e\x51\x2b\x68\xcc\x84\xb7\x0a\xd2\x6e\x2b\x94\x45\xa3\x87\x39\x77\x3f\x61\x98\xc2\xaa\xbb\x68\x3b\x56\x8b\x2e\x4d\x05\x74\xda\xed\xfa\xae\x4d\x85\x82\x33\x1a\xb2\x1e\x9c\xa9\x6c\xa9\x05\xa9\xb6\x98\x27\xeb\x55\x7b\xcb\xff\xe0\x39\x14\x64\xf5\x56\x76\xe1\x51\xe9\xa3\xe8\x27\x0e\xa8\x1c\x70\x83\x70\xdf\xaa\xe2\xc7\xd8\x85\x3b\x1e\x6b\xa8\xa6\x9e\x44\xde\x15\xca\x2e\x66\x45\x71\x71\x33\xbf\xf0\xf6\xad\xdb\xbe\xbf\xaf\xea\xaf\xb7\x5c\x9a\x04\x22\x30\xf6\xed\xa5\xdf\xc6\xa4\x63\xea\xb2\x89\x7a\x54\x91\xaf\xdc\xf7\xf3\x9c\x5b\x41\xc1\x66\x23\xdc\x2a\xa3\x28\x42\x26\xe0\x60\x16\xa7\xa9\x71\x43\xf0\x74\x5d\x29\x53\xa4\xfa\xdd\x75\x9c\xe4\x9f\x59\x37\xdd\x2e\xb1\xf7\xd8\xbc\x38\x23\xa1\x3e\x64\xd7\x28\x4e\x4a\xc0\x40\x29\x82\x9d\xcf\xaf\x71\x9a\xf8\x2b\x93\x6e\x42\x5a\xc2\xe0\x92\xb3\x51\xd2\x18\x9b\xc8\x03\x36\x83\xd7\xfa\x40\x2e\xab\x1e\xc7\x6c\x9d\x74\xec\xd3\x68\x05\x2c\xe7\x1a\x89\x81\xc5\x38\x1c\xfd\x2e\x15\x56\x3d\x6f\x94\xce\xef\x29\x95\xab\xfa\x72\xa4\x51\xb8\xc6\xff\x01\xe1\xba\x99\x87\xa8\xab\xbc\x0b\xc1\x6c\x6d\xd3\x81\x53\x4b\xfb\xed\x44\x0e\x72\xaa\xb3\x5d\x94\x37\x3a\xfb\xa0\x89\x57\x8d\x88\xf0\x91\xde\x6c\xfa\xd6\x58\xee\xa7\xfb\x56\xfb\xf2\x22\xcf\x9e\x7e\xb5\x2a\xf0\x3e\xd2\x69\x85\xb7\xb2\x7d\xc7\xb5\x57\xa7\xc8\x1d\x2f\x9e\x8a\x08\x8e\x77\xd2\x07\xd2\x6d\x6f\x2a\x46\x58\x9b\xa1\xf2\x43\x36\xec\x52\x25\xd9\xa3\x3e\x35\x32\xa7\x4b\xbe\x90\x70\x17\x9f\x4a\xe6\xfd\x5f\xe8\xd2\x8a\x72\x71\xa4\x06\xe7\xac\x01\x5b\xb7\xa3\x53\x07\x50\x1d\xcc\x37\x31\x19\x2b\xa6\xa1\xf6\x0b\x57\x63\xd6\x35\x6b\xaa\x08\xa7\x91\x2b\xac\xbd\x01\xe5\x16\x28\xd9\x26\x02\xc9\x8a\x73\x31\xeb\xb1\x1a\x8c\x6b\x2d\x7d\x95\xab\x51\x4f\x41\x89\x6d\xcd\x2b\x77\x4b\x71\x6b\x1f\x7e\xce\x5b\xfc\x6f\x35\x41\xb6\x48\xdc\x74\x80\x1a\x45\xe3\xbf\xa7\xfd\xa8\x5e\xde\xfe\xd7\x0a\xcf\x16\x74\x5d\xff\xe0\x9a\xf0\x5c\xdf\x87\x46\x0d\xcc\xd7\xea\x4c\xcc\xd9\xa9\x0e\xa7\x6d\x00\xae\x2c\xde\x78\x64\xda\xed\x78\xdb\x30\x5f\xd9\xdc\xd9\xda\x9d\x88\x4a\x9c\xad\x27\x36\x63\xb4\x2a\xbd\x9f\x1e\x61\xab\x9e\x86\x3d\xfe\x2a\x03\xc4\x56\x20\x54\x21\xfa\xbf\xd2\x10\x56\xb4\x5d\x9a\x31\x68\x84\x66\xf3\x09\x93\xe4\x44\x44\x3c\xfc\x53\x13\x86\x2d\xda\xb1\xc6\x6f\xbf\x71\xbe\xec\x68\x8d\x71\x75\x0b\x38\x26\xda\x77\xa9\x4e\x4d\x6f\x61\xe9\x2a\x6a\xb7\xb8\xdb\x6d\xd1\x48\x28\x3c\xeb\x72\xfe\x46\x27\x81\x74\xb1\x7e\xe7\x90\x9e\x35\x74\x31\x41\x75\x15\x05\x32\x41\x2c\x75\x15\xc5\xff\x42\xb9\x23\x79\xa1\x47\xcd\x12\x26\x2e\x5e\xc5\x14\xdf\xa2\xe7\x8b\x65\x1a\x7d\xf3\x71\xfd\xb1\xf8\xe7\xc7\x49\xc6\x1f\x7d\x2c\xf6\x67\x79\x82\x3e\x4e\xd9\xb3\xf2\x9b\x80\xa2\x82\xfa\xef\x90\x0f\x78\x78\x17\xc1\xd9\x95\x39\x61\xb3\xa2\x50\x40\x28\x1e\x0b\x2f\x53\xc6\xdd\x5d\xa2\xff\xef\x45\x57\x15\xf1\x63\x53\xb2\xe2\x9d\xa8\x77\x6a\x88\x8c\x03\x46\xba\x45\x72\xe2\x4e\xa5\xdd\xee\x5e\xfd\x33\xb7\xda\x54\x1d\xa0\x41\x43\xa7\xa6\x2e\xea\x5a\x5d\x8a\x90\x40\x7e\x57\x42\x0c\xe7\x38\x4d\x43\x5e\x64\xc4\xbb\xcc\xe9\xb5\x17\x1a\x4d\x63\x39\xce\xba\x5d\x5f\x5b\x6e\x74\xc5\x26\x26\xb3\xc1\x59\xbb\x5c\x77\x8e\x80\x16\xe9\x66\xff\x79\x91\x2e\x91\xd2\x81\x90\xa5\x22\xa4\x14\x03\x6f\x45\x86\x4e\xc0\xa5\x2b\x4b\xaa\x3a\x17\xd0\x28\x60\x62\x5b\x59\xdf\x59\xd8\x23\x65\x37\x5f\xf9\x33\x2d\x49\x4e\x73\x26\xd6\x28\x58\x6e\x36\xeb\xb2\x64\x62\xc5\xaf\x28\x22\xfe\xe8\xe4\xf0\x64\x24\xf4\x0f\x17\x15\xd7\x38\x4b\x85\x78\xf1\xc7\x0e\x15\xe2\x45\x86\xbe\x50\x7d\x56\x9e\x27\x91\xa1\x04\x59\x82\x08\x63\x0e\xa5\x28\xfe\x56\x3e\xf0\x11\xf7\xd5\x86\x6b\x9c\x84\x5e\xdf\x83\x28\x9b\xc5\xcb\x62\x95\x8a\x0d\xcd\x02\x3c\x9f\x05\xaf\xf2\x0c\x41\xa1\x2f\x0b\x27\x53\x98\xc4\x34\x0e\xd7\x5a\x9f\x10\x4e\xa6\x65\x09\x4a\x99\xf7\xb8\xaa\x94\xad\x4c\xc8\xba\xbf\xe3\xc6\x06\xfb\xfb\x5a\x9a\xac\x89\xd0\x7e\x1f\xc6\xc1\xed\x1b\x26\xe1\x85\xba\x9e\xcd\x4b\x65\xbd\x57\x4b\xe4\xf9\x7d\x20\x82\xa6\x0c\x3e\x64\xc2\x32\x4f\x94\xf3\x03\xd2\x05\xa0\x55\x73\xdb\x15\xeb\xe3\xaa\x3f\x3c\x3e\x9c\xc7\x96\x78\x8f\x6c\x6f\x66\x1f\x6d\x36\x14\xf8\x59\xf0\xe2\xe9\x33\x3f\x0b\x9e\xfe\x9e\x03\x28\xfe\xf8\x15\x05\x3f\xf5\x01\x28\xa1\xea\x64\x49\xf2\xdb\x28\x0b\x7e\xff\xeb\xd8\x5f\xd3\xfc\x06\x65\x21\x85\xf3\x98\x6d\xdb\x5d\x68\x0d\xc4\xab\x76\x00\x5f\x95\xd4\xfe\xc1\x56\x18\xbf\x38\xdf\xb5\xdb\xa6\xcc\xb6\xd9\x60\x54\x9a\x7a\xfd\x8e\x27\xf6\x67\x05\x28\x5e\x9c\x4a\x38\x7a\xd5\x40\x21\xa6\xf1\x79\x9b\xf0\x6a\x06\xad\xba\x66\xea\x39\xe0\xad\xd2\x60\x4d\xa8\xb4\x62\x42\x15\x4e\x97\x8e\xc5\x9e\x58\x8b\xc7\xd0\xe8\x85\x71\xd7\xad\x10\x68\x35\xae\x76\xe8\xb5\x89\xe0\xa7\xef\xbe\x7b\xa0\x26\x5e\x86\x0f\xd6\xb4\xe4\xae\x32\x17\xc6\x77\x99\xa7\x36\x59\xb7\x1e\x27\x57\x68\xba\x56\xd5\xbd\xea\x21\x89\x6a\x82\x3a\x02\xb1\x2e\x58\xa8\x16\x3a\xb2\xb0\x49\x6a\xd0\xdd\x98\x80\x41\x57\xea\xd4\xd0\x61\x4f\xbd\xfb\x70\x8f\x8e\xcc\xa1\x3f\xe7\x9e\x7b\xa0\x26\x2c\xb8\x4c\xbe\xd5\x9c\x3d\xf6\x6a\xfc\xac\x69\x20\x5f\x78\x35\x7f\x1c\xdd\x42\x0a\x85\x75\x7f\x1a\xdd\x42\x2d\xba\xca\xcf\xdb\x83\x20\x5a\x9f\xf5\xa0\xd9\x8c\xaa\x3f\xb3\xde\x72\x80\xba\xbc\x22\x57\xef\x40\x1d\x2c\x25\x7c\x3d\x22\x1f\x69\x8d\x96\x4a\x42\xab\x8f\x9a\x5b\xce\x73\xb2\x2f\x0f\xc6\xd4\xd6\x75\x51\x9d\x7d\xc3\x35\xcb\x82\x6e\x57\xbc\xd8\x8b\x78\x90\x9d\x1d\xc4\xf4\x12\x35\x26\x98\xb7\xcd\x01\x48\x9c\x69\xc2\x4e\x33\x2e\x3f\xc1\x4c\xe5\x91\x7a\x81\x22\xef\x3b\x1d\x81\xed\x71\x6a\xf2\x65\x9b\xa3\xb5\x1d\xb1\x93\xa0\x14\x5d\xc5\x54\x47\xec\xc8\x22\xfd\xea\x6e\xff\x95\x9b\x8a\xfd\x17\x92\xd0\x5a\xf4\x65\x81\x67\x24\xa7\x71\x71\xf3\x3c\xd1\xd6\x62\x4d\x21\x74\x48\xef\xf7\xab\xf9\x1c\x11\x23\xa0\x2a\x68\x8a\x98\x1f\xb7\x8a\xff\x2c\x79\x8b\x66\x2b\xf2\x18\x2d\x4d\x5e\xe1\xa5\x48\x72\x1e\xc9\x64\xe7\x4c\x94\xca\xd3\x5b\xe4\xf7\x45\x16\xc5\xb6\x50\x21\x9e\xcf\xc8\x68\xed\x78\x35\x87\x8a\xee\xce\x7a\xcd\x4e\x47\x59\x21\x92\xf5\xca\x42\x0a\x5c\x55\x72\x4a\x21\x92\x75\xbb\x69\xb7\xcb\x07\x66\xe4\x52\xfd\x6b\xac\xb4\x40\x25\x37\x6c\x80\x84\x4a\x28\xa6\x76\x9f\x89\x78\x1c\x3a\x1f\x90\xef\x79\x90\xd8\x1b\x04\x9a\x40\x29\x4b\xe7\x52\xc0\x6b\x42\xe9\x5c\x31\x38\x11\x69\x62\x12\x1e\x81\x54\xd9\xca\x71\xe5\x6f\x55\xcc\x12\x55\x62\x67\x78\xd8\x91\xd2\xef\x33\x71\xa5\x1a\x3d\x70\x66\x44\x82\x58\x99\xad\x9a\x63\x77\x18\x1f\xa9\x92\xc4\x33\x7c\xaa\x63\x15\x2b\xb0\xb2\xfa\xe3\x54\xfc\x89\xcc\x2c\x95\x55\x40\x51\x5e\xa2\x2b\x9c\x19\x94\x61\x9d\x20\xb5\x1a\xbd\x6d\xbc\xa9\x92\xd9\x9d\x87\x3e\x28\x2f\x8a\xd9\x35\x4a\x56\x29\xe2\x95\xf3\xde\xc7\xc5\x8d\xea\x54\x9e\xc0\x80\x5e\xa3\xcc\x2a\x19\x64\x9f\xff\xfd\xfd\x12\x94\xaa\x03\xa5\x0f\x33\x62\x96\xbc\x72\xa2\x0e\xcb\xb7\xb5\xaf\xcf\xcc\x75\x0b\xc8\x4a\x8c\x81\x7c\x02\x40\xe8\xf7\x95\x03\x65\xdb\xc5\xd2\xee\xc0\xd5\xfb\x21\x32\x1e\x56\xe7\xec\x8c\xb1\xde\xd1\x75\xcd\xa0\x39\x41\x90\x4c\x23\x3a\x46\x76\xe5\xc2\x2d\x57\xbe\xdc\xdd\x4a\xa8\xc8\x78\xc7\x00\x94\x28\x4b\x1a\xb7\xb2\xd7\x83\x1a\x12\xf6\x73\xa5\xb2\x50\xcb\x7a\xbd\xa2\x05\x4e\xd0\xa3\xec\x6a\x95\xc6\xc4\x5e\x64\xc3\xee\x3a\x67\x5d\x86\xf8\x54\xb7\x46\x2f\x40\x9f\x17\x94\x25\xd5\x23\xc4\x67\xbd\x33\x84\x07\x6d\x89\xdb\xf9\x0f\x70\xa3\x18\xa9\x5f\x59\xf0\xb6\x7f\xf9\xef\xf3\xa5\x1f\xda\x23\x3d\x1b\x72\x93\x68\x52\x82\x1c\x52\x42\xd4\x5b\x4e\xe1\x45\x74\xa8\x03\x3b\xeb\xcd\x19\x8d\x1e\x3a\x0f\x54\x65\x1c\xae\xaa\x61\xe8\xa1\xaa\xe1\xd1\x9d\xc4\x34\xae\xb2\x17\xa8\x12\xcd\x57\x99\xb7\x3b\xeb\xea\x26\x5b\xc9\x8d\x1d\x23\x66\x8d\x0f\xad\x90\x04\xbb\x9d\xfc\xf4\x3c\x5f\xa8\xb2\x20\x5b\x3e\x34\xad\xe4\x67\xef\xd1\x97\x5d\xdf\xc8\x26\xa5\x6d\xf8\x32\xf1\x81\xba\x71\xf5\xb5\x73\xec\x4d\x7c\x63\x15\x3e\x08\x8a\x2a\x15\x22\xb0\x51\x68\xeb\x15\x9b\x12\xed\xf5\xab\xa3\xd4\x9b\xfd\x9d\x81\xb0\x2a\xa1\xa4\xa7\xa9\xcf\x1a\x72\x22\x73\x51\xe3\xf7\xf6\x4c\x98\xd8\x50\xa0\x14\xcd\xb8\x29\x72\xf7\xc6\x35\xb7\x2d\x1d\xd6\xa1\xf9\x4b\xa7\x49\xc9\x64\xda\x77\xf8\x32\x65\x72\x6e\xdb\x17\x6e\x1b\xc6\xbd\x3e\xa2\x94\xe0\xcb\x15\xad\xc6\x88\x5a\xd3\x6b\x68\x23\x81\x55\x79\x51\xfd\xb4\xb9\x51\x19\x27\x09\x2f\xfd\xdb\x78\x56\xec\x77\x6a\x4b\xda\x1a\x57\x5f\xb3\xf5\x58\x0a\xaf\xc6\xb5\xb8\xef\xe5\x08\x8e\x96\xac\x69\x0c\xbb\x41\x59\xf1\x92\x61\xdf\xf0\x00\x52\x64\x02\x48\xbb\x5d\x14\x45\x2f\xdc\xca\x60\x4e\x10\xed\xde\x1e\x51\xb6\x24\x6b\x72\x95\x6e\xd9\x48\xbf\xc6\xe9\x0a\x35\x2d\xde\x79\xe7\x84\xb5\xb6\xec\xbd\xd3\x64\x6b\x64\xaf\xc2\x5c\x8d\x4d\x94\xb8\xfe\xc4\x68\x0d\x9a\x10\x35\x03\xbe\xd0\x1b\xc8\x62\x75\xbc\x67\x89\xf4\x15\xce\xb6\xd1\x38\xba\x0f\x5c\xcf\xbc\xc0\x7e\x30\xd8\x0d\x68\x12\x69\xc9\x88\x6c\x36\x06\xec\x6e\x61\xfa\x06\xec\x0c\x79\xba\xb7\x82\x12\x7f\x00\xe0\x7d\x36\xcb\xdd\x02\x15\x55\x8c\x6a\x51\xc5\x1d\xec\xf8\x71\x48\x2f\x1b\x2a\xbd\x6c\x2e\xf3\xe4\x4e\xfb\xd3\x68\x27\x03\xf6\x54\x78\xdc\xa8\x47\xb5\x36\xe2\xb5\xd0\xed\xea\x97\xe2\xcf\xaa\x83\x0d\x2d\x4b\x95\x70\x9c\xb1\xe6\x66\x99\x31\xf7\x36\x12\x9e\x11\xdf\x79\x7b\x51\x66\x9f\x68\x7f\x92\xc1\x78\xda\x98\xdc\xcf\x14\x95\xf4\x02\xed\x60\x33\xa1\xb2\x67\x86\x6c\xfa\x1c\xef\xab\xa1\xd0\xfe\x00\x4c\x4b\x3f\x03\x2e\x8a\xb6\x35\x29\xf6\x5e\x88\xf8\x02\xed\xf4\x27\x0f\x51\xd0\xce\xee\x8a\x42\xda\x9b\x4d\x6f\x00\x79\x85\x1c\x37\x26\xbb\xe5\x46\xf0\x10\xe1\xe7\x6d\x7a\xd0\xe6\xb4\x13\xe2\x84\x8b\xfd\x11\xbd\x64\x57\xaf\xb3\x8a\x63\xa9\xe0\xec\xbe\x9a\xc9\x12\x5a\x3e\xc9\x5a\xbd\xd4\xba\x3f\xfa\x6f\x31\x58\x7c\xe3\xde\x0b\xf1\x37\x0b\x5e\xa7\x6f\x7c\x4f\x5f\x9b\x97\x39\x83\xea\xfb\xbb\x25\xf2\x00\x7c\x8d\xa2\xc9\x9a\x75\x8f\x13\x14\xc6\xc1\xc5\x1f\x70\x55\x08\x94\x1b\x5e\xa0\x12\xea\x57\xbf\x52\xf6\xe2\xa9\x1c\x53\x2f\xcb\x51\x06\x5e\xd0\xd2\xfa\x02\x23\xd3\xd5\x73\xbb\x2b\xce\x55\x36\xf6\x56\xcf\xf4\xf0\x45\x63\x65\x98\xa0\x65\x11\x4e\x70\x50\x20\x88\x11\xe4\x3c\xe8\xb4\x9c\xc2\x1b\x7b\x01\x2f\xb7\x4e\xd2\x53\x4f\xbc\x48\x3b\x03\x21\x1f\xf0\x70\xf2\x47\x28\x94\x06\x1e\x6b\xa6\xef\xf9\x12\x38\x1a\x0e\xbd\xef\x49\xfe\xb9\xb0\xcb\x8b\x79\x25\x0c\x82\xe0\x35\x9a\xc2\x37\xb5\x39\x88\x65\x7f\x6e\xeb\xeb\x55\x9e\x2f\x1b\x3a\xe2\x57\xf6\x55\x55\xb9\x52\xd0\x98\xe2\x59\xe7\x33\xa6\xd7\xe7\x79\x36\xc7\x57\xe6\x30\xad\xb3\x2b\xb1\x9b\x21\x85\x72\x20\x52\x84\x0d\xa8\xfd\xec\x0d\x0a\x6f\x50\xf9\xb7\xcf\xa8\x39\x82\x8b\x3c\x89\xb2\x20\x7f\xf4\xbd\xbf\x66\xb0\x0b\x29\x4f\x7f\x24\xde\xe1\xec\x0f\x86\x4b\x7e\x7c\xe7\xaf\xcd\x2c\x6e\x10\xc4\x8b\x65\x4e\x28\xdf\xb5\xcb\xe1\x54\x9f\xce\xdb\x98\x74\xde\xa2\x88\xf8\x87\x07\xc3\x53\x00\x1f\xb3\x9f\xa7\x07\xa3\xe3\x13\x00\x9f\xf2\xc7\x27\x83\xc1\x31\x80\x7f\xb0\xdf\x07\xc3\xe1\x60\x04\xe0\x33\xf6\x7b\x78\x7a\x32\x3a\x51\x87\xfb\x2f\x0e\xf3\x98\x5e\x87\x9e\x07\x09\x4a\x30\x41\x33\xfa\x3e\x0f\xbd\x15\xf6\x20\x7b\xfe\x32\xa6\xb3\xeb\xd0\x9b\xaf\xd2\xd4\x63\xfb\xc0\x9b\xb2\x97\x69\x1e\x0b\x6e\x95\xa0\x2c\x14\xc5\x6d\x91\x7f\x78\x32\x94\xc2\x2c\x09\x2e\x71\x96\xf8\x04\x0e\x4e\xd9\x43\xf9\x94\xe7\x2d\x7d\x11\x67\x09\x56\x20\x07\xa5\xd8\xaf\xef\xab\xfb\xf5\x5f\x87\xb1\x06\xeb\xe4\x19\x0a\xbe\xff\x8b\x89\xd1\x8c\xbd\xf4\xff\x42\x70\xbd\x2a\xd0\x0f\x71\x71\x1d\xee\xf5\x4b\x30\x85\xfc\xbd\x0b\xf8\x5f\x38\x54\x0f\x0e\x8e\x8e\x00\x7c\xc0\x7f\x1f\x1d\x9f\x0c\x01\xfc\x13\x45\x3e\xf1\x07\x27\xc3\xd3\x53\x00\x89\x3f\x3a\x38\x3d\x38\x64\x3f\x8e\x0f\x06\x47\xc7\x00\xc0\x7f\xf1\x1d\x18\x1d\x1e\x02\xf8\x3b\xff\xec\x70\xd8\x1f\x01\xf8\x23\xfb\x7d\x74\x72\x3a\x3a\x05\xf0\x67\xf6\xfb\xe4\xe4\x74\xd8\x07\xf0\x27\xf6\xfb\xb8\xcf\xbe\xe5\x50\xfa\x6d\xab\xca\x50\x62\xd2\x78\x89\xcf\x53\xcc\x9d\xd8\xb8\x72\xfa\x7b\x22\x00\xee\x4b\xbd\xd6\xd8\x6d\x15\x5c\x21\xfa\x3e\xce\xfe\x5a\x3d\x49\xa4\x12\x34\x58\xe2\x25\xf2\xfd\x3e\xfc\x11\x05\x5f\x80\xc9\x14\x58\x20\xdd\xd7\xf7\x77\xaa\x35\x05\x00\x70\x8a\x35\x23\xf8\x12\x89\x94\x8e\x11\x2a\xa1\xd2\x46\xe4\x29\x0a\xd2\xfc\xca\xf7\x4c\x81\x2e\x82\x28\xc1\xe8\x16\x75\x90\xe8\x23\xf0\x18\xf1\x69\xe9\x5d\x9a\x10\x7f\x42\xc1\x97\x1f\xc7\xb4\xdb\xa5\x51\xc4\xfe\x78\x73\x15\xbc\x3f\x7f\xd2\xed\xfa\xce\x18\xef\x10\xa5\x38\xbb\xea\x5c\xca\x8e\x3a\x97\x71\x81\x92\x4e\x9e\xa9\xa1\xc2\x8e\xb7\xaf\xbf\x06\x90\xf7\xfb\xaf\x82\xed\x4b\xf0\x81\x89\x60\x8f\x63\x1a\xbf\x43\xe4\x16\xcf\x50\x80\x8b\x97\x79\x82\xce\xd3\x55\x41\xb9\x87\x46\x96\xc4\x29\x57\x04\x54\x47\x7d\x2c\x72\xf3\x14\xba\x49\x67\x26\x3e\xea\x2c\xf2\x04\xc1\x4e\x51\x9d\x15\xcd\xb7\xcf\x07\xa2\x40\xf6\xc0\xe8\xcb\x63\xc4\x60\xbb\xa4\x39\x61\x6f\xe9\xa0\xf9\x1d\x44\x81\xea\x3f\x48\xc5\xbf\x6f\xe2\x2b\x26\xf1\x51\x92\xcb\x0f\xdb\x1b\x48\x08\x2c\x50\x51\xa0\xec\x8a\xeb\x7b\x2e\x53\x5c\x5c\xcb\x2b\xf4\x33\x0a\x5e\x04\xdf\xbf\x7d\xf4\xea\xf1\xf3\x57\xcf\x2e\xce\x7f\x78\xf4\xea\xd9\x93\xc7\x70\x19\xdf\x31\x2c\x10\xa2\xf2\xab\xc9\xf6\x1f\x28\x48\xdf\x7c\x05\x8d\x56\x78\x3a\x79\x9e\x85\x1e\xc9\x73\xea\x39\xd7\x93\x92\x88\xf8\xa3\xfe\xc9\x68\x08\x20\x62\xbf\x8f\x8e\xfb\xa3\xbe\xb8\x43\x84\xb4\x30\x2f\x7f\xa2\xa0\x76\xa1\x1c\xa3\x1e\xc9\x57\x94\xa7\x38\x15\xec\x98\xd8\xc1\xc8\xf3\x94\x13\xcc\xac\xf8\x85\xa4\x91\xe7\x71\xf6\xe6\xb9\x30\x0b\x55\xc0\x6a\x2e\x4a\x33\x48\x35\xfb\xa6\x7a\xa7\x81\x84\xb2\x7a\xe2\x0e\xe6\xb4\xd5\x17\xe3\xa7\x67\x67\xde\x35\xa5\xcb\x22\xfc\xe6\x1b\xd6\x32\xb8\x5d\x7c\x8e\x09\x4f\x0a\xf4\x0d\xca\xbe\xf9\xf5\x25\xfb\xab\xc7\x2f\x7d\xef\xa7\xd5\x25\x22\x19\xa2\xa8\xe8\x3d\x23\x38\xf9\x86\xf3\xa8\xc1\x35\x5d\xa4\x5e\xc8\x3b\x09\xbf\xf9\x86\xb2\x96\xb3\x7c\xb1\x58\x65\x98\xde\xa9\x5b\x8b\x73\xde\xb9\x27\x6d\x95\xab\x4c\x2f\x0e\x94\x59\x7c\x8b\x19\xf7\xf8\x43\xbe\xd0\xe6\x2a\x01\xbe\x40\xbd\xf2\x27\x88\x04\x3f\x07\x2f\x04\x04\xa6\xe6\x9b\xf7\xf9\xe3\x7c\x56\xf8\x60\x2d\x5d\x30\xf2\xa5\x62\x77\xe5\xaa\xa1\x77\x71\x99\xc6\xd9\x8d\xf7\x55\xc7\xee\xf7\xd1\x91\xff\x0c\x05\x4f\x1d\x9b\xf0\x6c\xb1\x8c\xb2\xe0\xb7\xe5\x42\xd1\x0c\x28\x14\x0e\x39\x61\x04\xc2\xa3\x37\x57\xbd\x1b\x3c\xbb\xe1\x36\xad\xde\x0a\xf7\xae\x51\x9c\x20\xd2\xbb\x8c\x89\x37\x9d\xc2\x39\x8a\xe9\x8a\xa0\x22\x9c\x64\xc1\x9f\xaf\xff\x98\xc2\x04\xcd\xd2\x22\x1c\xf4\xe1\x6d\x4c\x8a\xb0\x0f\xf9\xa9\xe2\x3d\x99\x0f\x7b\xfc\xd8\x42\xcf\x9b\xc2\xc9\x00\xca\x17\x9e\xfa\xd1\x3b\x92\xcf\xd5\x9d\xf5\xe0\x08\x7a\xb3\x14\xcf\x6e\xe4\x8b\x34\xbf\xca\x7b\xc3\x03\xf9\x17\xc5\x34\x45\x4e\x57\xbd\x78\x26\xf8\xa2\x29\x9c\x78\x24\x4f\x91\x07\xbd\x14\x67\x37\x1e\xf4\x62\x82\xe3\x5e\x1a\x5f\xa2\xd4\x83\x5a\x56\x92\x49\x40\xd8\x90\x34\xf3\xf8\xff\x7b\xc5\x42\xfe\x70\xba\xb4\xa7\x32\x85\x14\x2d\x96\x69\x4c\x51\xe8\xc6\xd2\x0f\xba\xb4\xdb\xf5\xb3\xe0\xfd\xd5\x07\xbf\x0f\xbd\x04\xdf\x7a\x90\x33\xe8\xec\x81\xb5\xde\x81\x7a\x36\x94\x8d\x86\xec\xc1\xab\xe4\x47\x5f\x0e\x01\xeb\x6c\x32\x0a\xdc\xf3\x55\xaa\x3e\x46\xd0\x8b\x3d\xf6\xc7\xc5\x2f\x1f\xfc\x03\xe8\x15\xcb\x98\xcd\x56\xbd\x3e\x64\xaf\xe1\x01\x6f\xb0\xfa\xc5\x3f\x82\x5e\x87\x5f\x82\x0e\xff\xe6\xcf\x0f\x8f\xfc\xa6\x7f\xd9\x97\xc7\x72\x72\x87\xea\xc1\x09\xf4\x2e\x57\x94\x32\x60\x1c\xfd\x9d\x09\xab\xc3\x5d\xaa\x49\x9c\x42\xaf\xf3\xd8\xde\x82\xed\x93\xe1\xff\x82\x52\xfb\x7c\x78\x93\xca\x89\x9a\x4e\x2e\xb2\xab\x99\x88\xd7\xe8\xfd\xe3\xfc\xf5\xcb\x37\xff\x98\x76\x3a\x1d\x8d\xfb\x1b\x5e\xaf\x67\x2b\x52\xe4\x24\x5c\xe6\x38\xa3\x88\x94\xf7\xed\x92\x9f\xb9\xa6\xfe\xe6\x79\x46\x7b\x05\xfe\x0b\x85\x83\x93\xe5\x97\x31\xff\x73\x1e\x2f\x70\x7a\x17\xbe\x44\x94\xe4\xcb\x3c\xc5\x05\x7c\x74\x8b\x32\x4c\x3a\xaf\xd0\x17\x0a\x7f\x40\xe9\x2d\xa2\x78\x16\x77\x5e\xa1\x15\x82\x8f\x08\x8e\x53\x58\xc4\x59\xd1\x2b\x10\xc1\xf3\xfb\x4f\x89\xc4\x09\x5a\xc4\xe4\xa6\x69\x5a\xcb\x38\x61\x10\xe8\xa5\x68\x4e\xc3\xd1\xff\x76\x62\x0b\x72\xd0\x34\xa5\x45\x4c\xae\x70\xd6\x23\xf8\xea\x9a\x86\x07\xcb\x2f\xf7\xed\x6f\x96\x92\x1e\x9e\xe5\x59\x53\x9f\xd7\x88\xf7\x36\x3c\x58\x7e\x19\x7f\xc6\x09\xbd\xe6\x3f\xef\x3d\x53\x89\x57\x76\xce\x76\xd0\xff\x7b\xd3\x4d\x48\xbe\x4c\xf2\xcf\x59\x6f\x81\xb2\x55\x53\xef\x7f\xf5\x38\xed\x09\x07\xfd\xc3\xfe\xbd\x67\x2b\x9a\x35\xee\xb6\x34\xea\x87\x04\xa5\xdc\x9d\x6e\xac\x06\x18\xf6\xfb\xff\x81\x01\xcc\x4b\x85\x69\xdb\x6e\x1e\x6d\xdc\xa6\x38\xc5\x57\x59\xaf\x40\xe9\x3c\x9c\x21\x76\xef\xc6\x0e\x78\x87\x68\x31\xbe\x8c\x67\x37\x57\x24\x5f\x65\x49\x6f\x96\xa7\x39\x09\xff\xcf\x69\x7f\x76\x9a\xcc\xc7\xf2\xaf\x7e\x7f\x74\x74\x90\x94\x41\xb1\xc4\x59\x86\x48\x2f\xbf\x45\x24\x8d\xef\xb6\x1c\x8a\x41\xbf\xff\x0f\x79\x28\xf8\x4f\x1b\xe6\x63\x0d\xb1\xf8\xb2\xc8\xd3\x15\x45\x63\x9a\x2f\xc3\xfe\x98\xdf\x97\x7e\xc3\x6c\xe6\x31\xfb\x6f\x9c\x2f\xe3\x19\xa6\x77\x61\x70\x38\xa6\xe8\x0b\xed\xf1\x95\xc9\x45\xdd\x67\x72\x0c\x48\xb2\xd5\xfd\x36\x92\x4d\xeb\xb0\xff\x8f\x31\xcf\xb6\x37\xcf\xc9\x22\xe4\xbf\x18\x15\xfa\xdd\xef\x1d\xf6\xff\x01\x4a\xcf\xc8\x6b\xda\x81\x03\x13\x97\x34\xdd\x65\x5f\xfc\xbe\xa2\x16\x03\x46\xd2\xc4\xa5\x92\x34\x88\x61\xe7\x21\xc3\xce\x31\xb9\x11\x48\xf9\xfb\x9f\x6f\x7c\x3b\x13\x4b\x76\xef\x0e\x47\x76\x87\x2f\xd8\x56\x38\x3d\xf2\xbc\x7b\x64\xbb\x3b\x88\x09\x4a\x51\x14\x5b\x71\xa2\x8c\xfc\x32\x28\x3c\x4f\x94\x59\x8f\x5e\xa3\x05\x2a\xa2\xc9\x3a\x8b\x17\x28\xf4\x52\x36\xa0\x07\xaf\x09\x9a\x87\x7c\x52\x2b\x1c\x2c\x70\x16\xcc\x0a\xc6\xbd\xc9\x46\x49\x4c\x6e\xdc\x36\x3d\xf6\xc8\x34\x94\xae\x21\xec\xe1\xf7\x79\x72\xc7\x95\x33\x91\xfc\xcc\x8c\x1a\x59\x13\x98\xf4\xa7\xd0\xef\xc3\x5f\x51\xf0\xea\x29\xf0\x2b\x73\x05\x60\x4d\xc9\x9d\xa9\x59\x93\xcf\xe2\xf4\x1d\xcd\x09\x93\x49\xae\x10\x7d\x4e\xd1\xc2\xe7\x13\xe1\x7d\x79\x60\x2c\x5d\x9e\xc5\x28\x3f\xbe\x7b\xfd\x2a\xe0\x61\x9d\x3e\x05\xa1\x97\xe5\xb4\x13\xa7\xa9\xb7\x17\x45\x92\x6b\xe4\xce\xc3\x2f\x51\x82\x63\xdf\xf3\x97\x04\xcd\x11\x29\xc4\xb9\xed\x15\x33\xd6\x05\xf0\x40\xb0\x60\xef\x75\x19\x72\xde\xf1\x7d\x3f\x0f\x3b\x1c\xaa\xbc\x17\xe1\xa7\x7c\xe6\xae\x3c\xb4\xff\x1c\x4c\x41\x39\x63\xcd\x7c\x99\x0b\x58\x09\x8f\x9f\x78\x42\x58\x25\x12\x33\xe1\x50\x2f\xb9\x33\x27\xf9\xa2\xc3\xe1\xd2\x29\x04\x60\x44\x8c\xe7\x27\x19\xdc\xce\xb8\xb9\xb7\x68\x1e\x39\x87\xa2\x1a\xcf\xc9\x59\x3e\x29\xc0\xc8\x0f\x02\x82\xd2\x48\x04\x7a\x16\xd7\x08\x51\xcf\x7d\xcb\x8e\x80\xb5\x8b\xfc\x6f\xe8\x8e\xc1\x9d\xaa\xdf\x49\x0e\xd9\xe7\xbc\x9c\xe7\x86\xf6\xd9\x3d\x02\xeb\x78\x04\x22\xc5\x94\x7b\x90\xb9\x66\x58\xe4\x82\xe6\xc9\x6e\x2a\xcd\x41\x59\x0a\xfd\xff\x7b\xf6\xc8\x07\x6b\x79\xa0\x55\x68\x82\x69\x79\xe6\xb7\x1c\xc4\xc1\x14\xee\x1e\xd1\x39\xd9\x20\x6c\xeb\xab\xbf\xa3\x2f\xcf\x03\xd0\x39\xcd\x45\xfd\x34\x43\x7e\x7e\x85\xda\x1f\xcf\xef\xac\xa1\x00\xd8\xbd\x1b\x5f\x2b\xf6\x68\x25\x39\xfb\x23\x0b\x5e\x5c\xe2\x7f\x47\x06\xe2\xf3\xe9\xd1\xfc\xea\x8a\x49\x1e\x4a\xe8\x19\x09\x99\xe7\xd0\xc8\x3c\x4c\x3a\xe1\x4d\x45\x77\x5c\x7a\xc8\xae\xde\xf1\x1d\xf5\xd8\x4f\x0e\x6f\xcf\x92\x6e\x0e\x4c\x83\xf3\xb8\xe0\x62\x8d\x57\x5c\xc7\x4b\x26\xc2\x2c\xf2\x3c\x73\x1e\x14\xab\xec\x6b\xc4\x90\x5d\x0c\xbb\x73\xe2\x38\xb7\xfe\xfb\xab\x99\x3f\x80\x98\xc0\x11\xec\xb3\x09\xf6\x64\xf4\x81\x96\x62\x58\x83\x21\xcc\xda\x1b\x08\xe6\x1d\x0e\xe5\x9c\x7e\x3e\xfa\xd1\xb7\x20\x81\xec\x23\xef\x1b\xb8\x38\xcf\x61\x16\xac\x9e\xdf\xf8\xae\x08\x27\xe6\xda\xe1\xe8\xa9\x23\xd1\x25\xcc\x82\x2f\xcb\x23\x9f\x8f\xeb\x0c\xc4\x21\x0a\xe5\x15\xda\xd9\x8c\xa3\x77\x76\x4a\x84\x6a\x18\xdf\x32\xa1\xe3\x57\x14\xbc\x7d\xca\xd0\xfa\xe2\x86\xfd\x3f\x3b\x85\x94\x04\x7f\xde\xbe\x98\x1a\xb1\x24\xb0\xb7\xbc\x89\xaa\xcb\xf4\x94\xe1\x65\x9a\xcf\x6e\xc6\x46\x62\x08\x8e\x08\x5a\x88\xbf\x3f\x0b\x9e\xe5\xb0\xcf\x93\xc5\x52\x44\x7a\x05\xe3\x34\xb2\xab\x30\xe8\x1f\x8f\xd0\x42\x70\x1b\x09\x9a\xe5\x32\xc8\x21\xcb\x33\x64\x78\xa3\xe3\x61\x3c\x12\x4d\x0c\x9f\xb0\x5a\x2e\x11\x99\xc5\x05\x1a\x7f\xbe\xc6\x14\xf1\x0e\x51\x98\xe5\x9f\x49\xbc\x1c\xbb\x62\x90\x61\x87\xe6\xf8\x0b\x4a\xc6\x97\x39\xa5\xf9\x82\xb3\xbd\x82\x23\xe2\x5c\xf5\xae\x75\x86\xd7\x8c\xef\x59\xeb\x49\x1d\x1e\x1d\xc7\x3b\x3f\xda\xc1\xe0\xeb\x89\xad\xb2\x02\x51\x8b\x0b\xe2\xeb\x97\x5c\xa4\x9c\xee\xb0\x3a\x47\x8e\xe5\x1a\x85\x40\x31\xc5\x83\x38\x46\xc9\xe9\xfd\xbe\x71\x17\x77\x78\x3c\x3b\x41\xb1\xc5\x79\xc1\xf4\xfe\xaa\xb6\x9a\x07\xbd\xa5\xc5\x76\xf4\x6d\x52\x3b\xab\x38\x1d\x65\x29\x79\x7f\xb7\x14\x2e\xc1\x8d\xaa\x5c\x61\x88\xd6\x0d\x7d\x2b\xcb\xac\xa3\x07\x57\x8d\x2c\x1d\xf8\x03\x14\xbc\x95\xbc\x8b\xad\xe1\xb2\x75\xde\x76\xf9\x79\x33\x19\xaa\xff\xbc\xd7\x94\x4c\xf3\x66\x6d\x74\x81\xe8\xfb\x1b\xf2\x2b\x22\x05\xc7\x6d\x01\xd5\x7f\x80\x06\x65\xfb\x53\x9d\x3e\x5e\x2b\xdb\x55\xf7\x1d\x86\xdc\x3b\x71\x96\x74\x8c\xea\xaf\x73\x2b\xba\xe2\x9a\xf8\x06\xb8\x3c\x15\x0a\xae\xa7\x69\x7c\x55\xfc\x7d\xd8\xb4\x2c\xc7\xe9\x54\x65\x10\x76\x77\x39\x70\xed\x17\xf7\x5b\xa8\xd4\xc6\x75\xe6\xac\x63\x61\x5b\xf8\x4a\x7a\xf9\x3b\xd7\x4e\x4b\x7a\xf9\x1b\xfa\x77\x88\x65\xbc\x5c\x6e\xd1\x14\x1e\xd5\x14\x85\x4c\x7a\x90\x97\xcd\x50\x11\xa1\xde\x53\xcf\x63\x82\xe2\xfb\x53\x3e\x86\x50\x16\x31\xce\xac\xee\x2c\x49\x65\x9b\x82\xb3\xaa\xa0\xeb\x5b\xda\x36\xd6\xa3\x24\x6e\x52\xe5\x26\xb4\xbc\xbd\x7c\x45\x53\x44\x1b\x55\x59\xac\xe1\x61\xc3\x90\x0e\x3f\x61\xeb\xba\x6c\xd2\x43\x49\xf0\x73\xfe\x9c\xd1\x9b\xbf\x56\x8f\x21\x21\xf0\x19\x0a\xd2\x73\x18\x93\xbf\x43\x7b\x9a\x31\xfb\x91\x42\xec\x5c\xb3\x61\x09\x90\x32\x9a\x8e\x44\x8c\xf0\xa1\xbf\xd8\xe0\x3f\x1d\x3d\x12\x76\xcb\xbc\x2a\xb5\xfd\x0f\x6d\xc3\x93\xa9\xb1\x0d\x4f\x82\x20\x28\xc8\xd4\xb5\x52\xce\x08\xb7\x4c\x0e\x47\x47\xc2\xf4\x91\xfc\x17\x27\x0b\x2f\xf3\x9c\x16\x94\xc4\xcb\x70\x92\x92\xe9\xce\xb9\xff\x86\xe0\x8c\x04\xd8\x5e\x02\x0e\x2e\x87\xf0\x7b\x04\xdf\xa2\xe0\x27\xf8\x0a\xc1\x9c\xc0\x3f\x50\x70\x8e\xb5\x69\x76\x9d\xe4\xec\xc0\x85\x9e\x07\xaf\x29\x5d\xbe\x16\xf9\x11\xc2\xb5\x38\xac\x45\xb8\xf6\x64\xa2\x9a\x1e\xf7\xcb\x08\xbd\x78\xb9\x4c\xf1\x8c\x33\x07\xdf\xfc\x51\xe4\x99\x57\x96\x25\x80\xbf\xa0\x60\x01\x1f\xa3\xe0\x06\x3e\x45\xc1\x8f\x2b\x0b\x68\x7e\x1f\x66\xc1\xb3\x83\x13\x46\xbc\x70\xf0\xe7\x91\x0f\x02\xbd\x2c\x61\xaf\xf6\x13\x02\x02\x21\xc9\xd1\xe8\xa1\x42\x45\x48\x96\xeb\x07\x25\x3c\x3a\x38\x3e\x1a\xd6\x9c\x31\xbc\x55\x81\x3a\x8c\xdd\x9f\x51\xab\xe6\x0e\x36\x5e\x60\x6c\xbb\x32\x18\x47\x31\xb9\xe2\x42\x45\x21\x3d\xc6\x61\x1a\xc5\xdf\x8e\xce\x50\x28\xc3\x5d\xf0\x19\x56\xb9\xc4\xaf\x10\x7d\xfd\x39\x53\x0e\x56\xc6\x12\xc8\x33\x27\x84\xbc\x8e\xa5\x97\xf3\xa6\xc6\x53\xe3\x2d\x9a\xb3\x4b\xd1\xed\x36\x78\x71\xc8\x77\x81\x64\xa8\x10\x48\xa3\xea\x23\x3d\x5f\x5e\xa4\xa7\x33\xcf\x89\xcf\x26\x5e\x44\x26\x05\xc5\xb8\x78\x18\xf5\xc7\x45\xaf\x07\xfc\x2c\xa2\x93\x62\x0a\xba\x5d\x3f\x8d\x7c\xb6\x8a\xcc\x4f\x41\x18\x3f\x64\x3f\x58\x37\x29\x08\xf9\x0f\x00\x36\x9b\xd4\x64\x1c\x7a\x38\xea\x76\x53\x1d\x98\x2d\x32\xcf\x58\x11\x36\xec\x3b\xbb\xf6\x53\xa6\x95\x23\x5f\xb5\xda\x05\xa2\x71\x12\xd3\x58\x05\xda\x56\x9f\x0b\x77\x3e\xbb\xf2\x93\xda\x32\xeb\x72\x88\x0a\x48\xd2\xb7\x1f\x00\x93\x87\x27\x83\x31\x58\x9b\xec\xf0\xdc\x46\x4f\xee\xd6\xb9\x8f\xb9\x97\x29\x3f\x32\xe2\x34\x21\xb0\x8e\x79\x39\x50\x93\xcd\xdd\x6e\xcd\x2b\xc8\x6c\x6d\x9e\xf3\xe6\x41\x92\x67\xe8\x8c\x31\x08\xb7\x71\xba\x42\x20\xb4\x3d\xd1\xd4\x6d\xb7\x63\x77\xc9\x19\xe5\x3e\x3b\xc4\xb7\x2f\x3e\x12\xd5\x79\x75\x37\xc2\x7d\x23\x85\x05\x28\x73\xdf\xc7\x11\x96\x19\x11\x79\xb4\xe2\x64\x0a\x80\x58\x0e\x4f\xbc\x47\x82\xc4\x47\x70\x7d\x95\x35\x38\x38\xe1\x12\x7e\x3e\x6a\x72\x7c\x2a\xe1\xe2\x59\xc3\xf3\xb8\x2c\x41\x09\x47\xfd\xfe\xf1\xa0\x76\xa7\x68\x80\xbe\x70\xd4\x11\x11\xff\xf8\x70\x78\x30\x04\x25\x3c\x3c\x39\x1e\x6c\x6f\x39\xe8\x8f\x86\x23\xd6\xe7\xc1\xe8\xf8\x78\x6b\xcb\xa3\xc1\xe1\xe9\x29\x28\xe1\x60\x70\x32\x38\xdd\xde\xe7\xf0\xe4\xf8\x08\x94\xf0\xe4\xe0\xb4\xbf\x7d\xf4\xc3\x61\xff\x80\xf5\x39\x3a\x3c\x1c\x1e\x6c\x6d\x79\x32\x3a\x3a\x3c\x04\x25\x3c\x1e\x9c\x1c\x6e\xef\xf3\xe4\xb8\x7f\x78\xc0\xfa\x3c\x3e\x3d\xe8\x6f\x6f\x39\x18\x0e\x78\xcb\xc3\x83\xd1\x8e\x79\xf6\x4f\x4e\x06\xa0\x84\x07\x47\x87\x87\x27\xdb\x21\xdf\x1f\x1c\x1e\xb3\x3e\x07\xa7\xc7\xdb\x5b\x9e\x0c\x8e\x06\x7d\xb6\x47\xa7\xdb\xc7\x3e\x1d\xf5\xfb\x0c\x9a\xa7\xa3\xe1\xc1\xe1\xd6\x96\xc3\xc1\xe9\xd1\x09\x28\xe1\xf0\x68\x70\x5a\xc7\xb9\x4e\xcb\x93\xd1\x01\x6b\x79\x38\xea\x0f\xb7\xef\xe5\xe9\xd1\xe1\x21\x5b\xf9\xc9\x70\xb8\x7d\xf0\xc3\xa3\xe1\xc9\x11\x47\xf8\xa7\xc7\x3b\x5a\x1e\x0c\x0e\xd9\x91\x3b\x3a\x3a\x1a\x6e\x3f\x72\xa7\xfd\x63\xbe\xe9\xa3\xc1\xd1\xc9\xd1\x0e\x20\x1d\x0d\xd9\xe8\x83\xd3\xa3\xe1\x0e\x70\x1e\x1d\x1c\xb3\x05\x1d\x8d\x46\x27\x3b\x8e\xc7\xc9\xc9\x80\x1f\xce\xfe\x70\xd0\x77\x10\x87\x69\xe5\xf2\x98\xbe\xa0\x4a\x68\xb3\x41\x0f\xa9\x55\xe7\xcf\xa4\x27\x12\xa5\x2e\x18\x91\x20\x51\x1f\x8a\xba\x7a\x2a\x1c\x6d\x4c\xbe\x45\x22\xaf\xb8\xca\x9b\x36\x36\x68\x42\x0f\x19\x5c\x5c\xa0\x42\x10\x5f\x9e\x3e\x45\x3f\x97\xfe\xba\x91\x7e\x52\xc2\xd1\xb0\xdf\xaf\xef\x05\x1b\x1d\xb3\x0b\xcd\x76\x0a\x8c\x9b\x16\x23\x6a\x2e\x33\xfc\xaa\xbd\x7f\xbf\x6e\x06\x47\x47\xc7\x83\x83\x9d\xb0\xb3\x0b\x44\x52\xab\xfb\x33\x1a\xae\x95\x1b\x32\x2d\xbf\x16\x08\x07\x27\xdb\x80\xc0\x8e\x01\x80\x19\xfb\xc9\xce\x63\x33\x3c\xd8\xe6\x8a\x4d\x13\x3b\x4c\xcf\xd8\xbf\xa1\x8e\x8d\xc5\xdd\x2e\x5b\xc6\x66\x43\x27\xde\x77\xdf\x61\x8a\x48\x4c\x73\xe2\x4d\x4d\x3a\x76\x39\x24\xcf\x78\x0e\x73\x38\x8b\x26\x53\xc8\xf3\xdf\xac\xa2\xbd\xc1\x98\x91\x35\x3c\xf7\x8b\xc8\x27\x11\x51\xe9\xe6\x04\x11\x81\x3c\x17\x1d\xdf\x10\xc1\x02\xf8\x04\xec\x99\xbc\x79\x63\x1e\x51\xac\xd9\x8f\xf1\x9e\x9f\x44\x7e\x1c\x15\xa2\x13\x02\x00\xa7\x80\xdc\x47\x4b\x04\xad\xc5\x92\x84\xc1\x99\x3c\x92\x7b\xac\x7b\xd6\x4d\x1f\x8c\x25\x35\xbd\x06\xeb\x15\x9b\x5b\x1a\x5d\x97\x3c\x77\x4b\x7a\xb7\x96\x53\xdc\x4b\xba\x5d\xb9\xa2\x40\xcc\xa0\xdb\xf5\x73\xfd\x87\x4e\x7d\xea\xe7\x6c\x96\xb9\x3a\x40\xba\x1b\x3c\xf7\x57\xb2\xfe\x5b\xaa\xe5\xd0\xd9\xd7\xee\xed\xc9\xe0\xd4\x41\x4b\x8d\xc7\x0b\xac\x4d\xbd\x39\xc6\x08\x8b\x9a\x73\xde\xf3\x8c\x67\x5d\xe9\xc4\x94\x49\x8c\x94\xc9\xcc\x3c\x80\x6a\x35\xe3\xe2\x72\x96\x67\x3d\xbe\x91\x97\x29\xd2\x0c\x42\xf0\x31\x7b\x9e\x75\x72\xc2\xf5\x06\x79\xe7\x12\x75\x54\x13\xc8\x3f\x88\xd9\x55\xee\x08\xbe\xab\xe8\x2c\x56\x05\xed\x5c\xc7\xb7\xa8\x13\x77\x26\xef\xee\x16\x97\x79\x1a\xa8\xb3\x31\xf5\x41\x67\x81\xe8\x75\x9e\x30\x91\xfc\xeb\x56\x7f\x3a\x3c\x38\x6c\x3f\xd9\xfc\xf2\x8b\x93\xcd\xaf\x00\x80\x31\x43\x6a\xc3\xd1\xf1\x08\xc0\x94\x13\xa0\xd3\x61\xcb\xfd\xb7\xe2\x8e\x30\x3f\xd7\xe2\xd9\x66\x13\xcb\x7f\x53\xff\x6b\x27\xcd\x27\xd0\x3a\x69\x8e\xbf\xc5\xa4\x19\xc5\x11\x73\xe6\x08\x78\xc7\xc5\xe4\x79\x97\x05\xdb\x2b\xcc\x08\x86\xb5\xd5\x45\x49\xc5\xe4\xb9\x28\x98\x46\xd8\xd7\x55\x88\x4c\xc6\x13\x95\xf3\xc3\x5c\x41\x71\x8d\xe0\x09\xec\x0d\x78\xb4\xb4\xf7\x5a\x31\xd5\x51\xca\x90\x95\xa5\xb5\xe3\x8c\xbd\xf3\x44\xea\xa8\xbd\x97\xf1\x92\x7f\xb0\xd9\x78\xef\x90\xf8\x56\xa7\xbd\x94\xc5\x2f\xbd\x47\x4a\xd2\x91\x2d\xbf\xf9\xbf\xfe\x59\xf8\x0b\xde\x3c\x07\x19\xf5\xcf\xc2\x93\xcd\xe0\x68\x33\x1a\x02\xff\x2c\x3c\x4f\xe3\xc5\x12\x25\xe0\x8c\x13\x8e\x07\x32\xe7\x50\x0a\xdc\x65\x7e\xe5\x95\x2a\xa1\x73\x9b\x7c\x1a\x14\xd1\xe0\x64\x34\x3a\x06\xe5\x14\x8c\xff\x5f\x00\x00\x00\xff\xff\x2c\x37\xd2\x65\x9f\x87\x1d\x00") - -func bindataTkgWebDistTkgkickstartuiMaines2015341f46d0b99a14967f1eJsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiMaines2015341f46d0b99a14967f1eJs, - "tkg/web/dist/tkg-kickstart-ui/main-es2015.341f46d0b99a14967f1e.js", - ) -} - -func bindataTkgWebDistTkgkickstartuiMaines2015341f46d0b99a14967f1eJs() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiMaines2015341f46d0b99a14967f1eJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/main-es2015.341f46d0b99a14967f1e.js", - size: 1935263, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiMaines5341f46d0b99a14967f1eJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x0b\x73\xdb\x36\x97\x30\xfc\x57\x64\x6e\x5f\x95\x58\xc3\x8c\xe4\x24\x6d\x4a\x15\xd5\x3a\xbe\x24\x6e\x1c\xdb\xb5\x9d\xa4\xa9\xaa\xf5\xd0\x22\x24\x31\xa6\x40\x05\x84\xec\x38\x16\xff\xfb\x37\xb8\x11\x20\x09\xf9\x92\x74\x9f\x7d\xbe\x77\xde\xc9\x4c\x2c\xe2\x7a\x70\x70\x70\x6e\x00\x0e\xd6\xc6\x0b\x32\x62\x49\x46\x7c\x70\x7b\x15\xd1\x16\x86\x0c\x12\x48\x61\x02\x23\x98\xc2\xac\xa7\xb3\x5b\xb9\x8f\x21\x03\xb7\x14\xb3\x05\x25\x2d\xb6\x5c\xfa\x0c\xe1\x20\x4f\x93\x11\xf6\x3b\x00\xc0\xa3\x8b\x4f\x78\xc4\x82\x31\xc5\xf8\x2b\xf6\xd5\x57\x8c\xc7\x09\xc1\xc7\x34\x9b\x63\xca\x12\xcc\xdb\xb8\xa5\xd1\x75\x78\x7b\x15\xa5\x0b\x1c\x56\xeb\x30\x50\x14\x00\x14\x65\x8f\x23\x1f\xdc\x7a\x8b\x1c\xb7\x72\x46\x93\x11\xf3\x7a\x4f\xfe\x73\xad\x45\xf1\x04\x13\x4c\x23\x96\xd1\x0d\xba\x20\x2c\x99\xe1\xd6\xc6\x46\x6b\x3b\x9b\xdf\xd0\x64\x32\x65\x2d\x7f\x04\x5a\x9b\x9d\xee\xb3\x8d\x39\xc5\x39\x26\x0c\xb6\xf6\xa2\x11\xbe\xc8\xb2\x4b\xd8\xda\x27\xa3\x80\x97\xe6\x40\x93\x1c\xb7\xfc\xb7\xfb\x67\x20\x6c\x4d\x19\x9b\xe7\xe1\x93\x27\x93\x84\x4d\x17\x17\xc1\x28\x9b\x3d\x19\xab\x3a\x4f\xac\xfe\x9e\x5c\xa4\xd9\xc5\x93\x59\x94\x90\x27\x07\xfb\xdb\xbb\x87\xa7\xbb\xad\xff\x7c\x32\x42\x16\x02\x15\x72\x70\xd1\x13\xa8\x44\xb7\x05\x64\x48\x0d\x72\x4e\x33\x96\xb1\x9b\x39\x86\x04\xb1\x60\x1a\xe5\x47\xd7\x44\x21\xe6\x06\x52\xe4\x42\xd8\xcd\x72\x59\x36\x2e\xe6\x05\xdc\xe2\x01\x1b\x22\x12\x08\xf4\x15\x30\x41\x9e\x2e\xe0\x21\xc4\x1b\xcf\xc6\xad\xd3\x9b\xd9\x45\x96\xf6\xe5\x9f\xf0\xb6\x80\x11\x4a\x82\x84\xc9\x31\x2c\x97\xde\x7f\xfd\x97\xfe\xf0\x60\x8a\x92\x20\xca\x6f\xc8\x68\xdf\xce\xaf\xa4\x78\x30\x43\x49\xc0\xb2\x53\x46\x13\x32\x39\x8b\x26\xa2\x88\xf5\xed\xd5\x68\x84\x83\xa9\x10\xe1\x1c\x94\x28\xa3\x08\x80\x40\x4c\x16\x33\x4c\xa3\x8b\x14\x87\x6b\x1d\x38\xca\xc8\x38\x99\x2c\xca\xef\x6b\x9a\x30\xf5\xbb\x00\x90\x0f\xbe\x60\xf4\xe6\x36\xf7\x6f\x0b\xe8\x79\xa0\x18\x45\x6c\x34\xf5\x0f\xc0\x6d\x8e\xea\x98\xd2\x73\x21\x10\x56\x18\xaa\x5a\xc8\x02\x30\x91\xf4\x1e\x21\xd6\x6e\x5b\xb3\xd3\x4a\x48\xce\x22\x32\xe2\x98\x9c\xf7\x59\x38\x87\xa9\x9e\x9b\x11\xc5\x11\xc3\x7e\x64\x0a\x03\x98\x21\x82\xaf\x5b\xd7\x7e\xb2\x5c\x0e\x86\xa0\xa7\x3a\xa5\x7e\x0a\xbd\xf3\x84\x5c\x65\x97\xd8\xd3\x63\x3d\xf5\x31\x24\x30\x03\x05\x80\xa9\x01\x27\xd6\xf0\xf2\x71\xc9\xea\xb7\xbc\xe9\xd0\x23\x19\x9d\x45\xa9\x07\x23\x3a\x09\x71\x30\x8a\xd2\xd4\xe7\x05\x0b\x33\xe8\x4a\x71\x36\xa5\xd9\xb5\x2c\x7d\x50\x14\x05\x0e\xae\x69\x34\x47\x0b\x41\x89\x53\x74\x5b\x98\x59\x9a\xfb\xe0\xd6\x00\x30\xae\x7c\x5d\xf1\x2f\x5e\x65\xc2\xab\xe4\xfe\x04\x46\xb0\x49\xe0\x6c\x9a\xe4\x05\x10\x4d\xdf\x68\xec\x4c\x30\x3b\xd6\x78\x39\x1a\xc3\x19\xba\x69\xb7\x6f\xfc\x1b\xff\xb5\x3f\x18\x02\x00\x7a\xb3\x76\x7b\xb6\x86\x38\xb6\x89\x1c\xcc\x0c\x46\xa0\xdd\xf6\x27\x68\x26\x5b\xba\x40\x57\x06\xb3\x68\x6e\xfd\xae\xe2\x7f\x02\xcc\x50\xb6\x7d\x0c\x6e\x07\x1e\xc1\x5f\x98\x07\x35\x0a\x3c\x09\xa5\x37\x0c\xc6\x19\xdd\x8d\x46\x53\xbf\x1c\x01\x03\xb7\x92\x46\x0d\xb5\x54\x06\x15\xa8\x49\xf3\x19\xc4\xa0\xe0\xff\xca\xae\xb6\x24\xff\x2b\xbf\x13\x9f\x4a\x16\x29\xe9\x28\x47\xb1\x8f\x07\x74\x08\x31\x8c\x40\x2f\x19\xfb\x0a\x9a\x35\x84\xf2\x40\xd0\x8a\x28\x36\x42\x79\x10\xd1\x09\x5c\xa0\x91\x5c\xc4\x9a\x64\x16\xed\xb6\x97\x89\x71\x9a\x95\xbc\x28\x71\xb5\x80\xde\xf9\x79\x74\x1d\x25\xcc\x03\x7d\x16\x50\x9c\x67\xe9\x15\xf6\x17\x81\x4a\x05\x01\x9b\x62\xe2\xdb\xa3\x4a\x7c\x85\x16\x2c\x80\x2c\x60\x2d\x53\x21\x4b\xe5\x82\xd0\x6a\xd5\xd1\x9a\x82\x16\x61\x98\xfa\xa3\x5a\x63\x6a\x04\xcd\x36\x8b\xcc\x17\xa3\x05\x82\xa2\xa2\x1e\xf5\x39\x8e\x9b\x2b\xc3\x5a\xba\xc4\xc2\x30\x35\x04\xc7\x17\x19\xb3\xa6\x11\x52\x3e\x06\xbe\x9e\xf8\xcf\x02\x14\xaa\x5c\x84\xa2\x7e\x24\xa1\xa7\x90\x82\x90\xfa\x5c\xa6\x98\x49\x3c\xd5\xab\x8d\x03\x44\x91\x97\x2f\xf2\x39\x26\x31\x8e\x4f\x59\x44\x99\xa7\x27\xa3\xec\x28\x81\x11\xb8\xe5\x93\x89\xbf\xe0\xd1\x82\x25\x64\xe2\x21\x84\x28\x10\x03\x15\x50\xed\x52\x9a\x51\xdf\x7b\xa5\x85\x44\x2b\xc9\x5b\x51\x4a\x71\x14\xdf\xb4\xe8\x82\x10\x5e\x45\xd2\xc3\x28\x9b\xcd\x53\xcc\x70\x2c\x9b\xb8\x35\x34\x82\x10\x4a\x54\x93\x91\x06\xe1\xad\x0f\x8a\x71\x46\x7d\x12\xcc\x30\x9b\x66\x31\x4a\x20\xe1\xb8\x44\x51\xaf\x27\xc1\x4f\x11\x09\x62\x9c\xe2\x49\xc4\x30\xef\x20\x95\xc9\x19\x7a\xef\xa7\x90\x88\x3e\x33\xd1\x4b\x86\x10\x9a\x82\x51\x46\x58\x42\x0c\xc1\x65\x45\xc1\x21\x10\x34\x82\x10\xd2\xfd\x00\x12\x70\xa9\x89\x48\x70\xae\xfe\x46\x74\xd2\xc3\x69\x8e\x5b\x15\x80\xcb\xf2\x62\x1c\x35\x3c\x5a\x38\xa2\xc8\x1a\xb8\x1c\x42\x8f\x04\x71\x92\xcf\x39\x17\xdb\xfd\x32\xc2\x73\x81\x69\x22\x09\x85\x77\xa4\xd7\xaf\xd5\x0b\x5f\x08\xd1\x05\x5d\xcc\x99\xaf\x73\x65\x5b\xa0\x47\x91\x35\x39\xbd\x72\x29\x8a\x69\x16\x78\x57\x7c\x14\x99\x85\x98\x8c\x7d\xca\x91\x97\x11\xdc\xb7\xa0\x0b\xcd\x30\x3e\x26\x38\x8d\x3d\x28\xa8\xd7\x85\x3d\x45\xb8\x72\x2d\xf3\x76\x42\xd9\x5c\x51\x18\x0c\xc9\xde\xda\x6d\xbf\x8e\x02\x35\xa1\x7a\xb5\xc8\x69\x55\x0b\xc5\x12\x54\xef\x25\xc3\xe1\x23\xe2\x1a\x83\xac\x05\x29\xc2\xa5\x30\x1f\x90\x21\x1f\xe1\x55\x96\xc4\xad\x8e\xc0\xb9\x66\x65\x25\x61\x20\xb2\x48\x53\x68\x4d\x5b\xbb\x6d\xea\x07\xb2\x78\xbb\xed\xb3\x12\x28\x8d\x5d\x26\xa0\x92\x4d\x43\x09\x8a\xd5\x8c\x2e\x0f\x96\x4b\x5d\x63\x4d\x34\x6e\xb5\xa4\x86\x27\x1b\xe2\x4b\xe5\xec\x66\x8e\xd5\x72\x39\x9b\xe2\x96\x86\xa2\x15\x67\x38\x6f\x91\x8c\xb5\xe6\x34\xbb\x4a\x62\xdc\x8a\x5a\x3f\x7a\xeb\x64\xdd\xfb\xb1\x25\xdb\xf2\x00\x80\x53\x31\xb5\x09\x8a\x7d\x0a\xcd\x08\x64\xeb\x36\xbf\xe5\x6b\x49\x4e\x73\x89\x0b\x27\x40\x89\x98\xba\x3a\xa2\x64\x2f\x91\xcc\xd5\x2b\x85\xb3\x14\x41\x2b\x3e\x1b\x60\xce\x25\x17\x29\x3b\x8c\x66\x78\x88\x22\xc9\x15\x21\x0b\xf8\x32\x42\x58\xfc\x39\xc8\x46\xd0\x42\x0a\x2b\x49\xd8\xc2\x8d\xe4\xcc\x36\x8e\x41\x13\x16\x10\x46\xe1\x03\xf1\x59\xe2\x52\x42\xc7\x99\x10\x47\x68\x44\x5a\x4a\xa6\xb8\x9a\x37\xa4\x76\xe9\x2b\xf1\xc4\x10\xd7\x43\x0e\xb2\x51\x88\x07\x9d\x61\xd1\xeb\xb6\x12\xd2\xc2\x02\x74\xa1\x75\x1c\x64\x23\x84\x07\xdd\x21\x80\x9b\x26\x67\x9c\x90\x28\x4d\x6f\x64\xde\xe6\x90\x43\x38\x66\x98\xca\xef\xa7\x43\x00\x85\x64\x65\xf4\x66\x97\x30\x9a\xe0\x3c\x98\x2f\xf2\x29\xd7\xf6\xcb\xfe\xcf\x4d\xff\x38\x50\x6b\x25\xc9\xc8\x72\x79\x5b\xf4\x98\x98\x4d\x54\xaa\x43\x7c\x14\x0c\xb7\x04\x1a\xa0\x5d\x1a\x31\xd3\xe0\x35\x6f\xb0\xd6\x2d\x1a\xe8\xb1\x79\x34\xcb\x98\x57\x0c\x21\x2e\x35\x84\x4b\x01\xa4\x02\x95\x1b\x0e\xcc\x5f\xeb\x58\x10\xbe\xf6\x25\xdf\x30\x70\x0e\x22\xb1\xf8\x98\xa1\x33\x21\xa9\xb1\x24\xc6\xa6\x5a\x2e\x89\x43\x97\x16\x1c\x7b\x2d\xc9\x0f\xa3\x43\x1f\x07\x29\x26\x13\x36\x05\x5a\x2c\x6d\x74\x61\x52\xea\xb3\x2d\xe6\x83\x5b\x2e\x09\x7a\xeb\xeb\xf4\x57\x5d\xb6\x07\x92\xb1\xaf\x94\x03\x0c\x29\x30\x50\x28\x39\xcd\x55\x11\x26\xc8\x16\xad\x75\x21\xeb\xd5\xf2\xd5\xc2\xd6\x25\x3a\x90\x15\xba\x48\x22\x89\x39\x29\x94\x50\xbd\xe5\x9f\xe1\x5b\x8b\x33\xbd\x2d\x05\xb3\xe2\x83\xaa\x35\xc1\x08\xd7\x3a\xba\x62\x6b\x6c\xe9\x70\x57\x90\xfa\x17\xd0\x1b\x65\x24\x67\x74\x31\x12\x86\x85\xae\x5d\x57\xfb\x0b\x00\xa9\x7f\xe5\x2e\x3c\x76\x14\x1e\x0b\x79\x92\x46\x37\x7c\x55\xa2\xdc\xbf\x82\x19\x34\x12\x79\x4f\x4f\x05\xe0\x8c\x23\x6f\xa4\x23\x5b\x97\x91\x93\xeb\x9a\x3e\xce\x38\x2d\x80\x14\xb6\xd6\xd6\x18\x5f\x03\x08\xa1\xf1\x72\xe9\xe8\x13\x21\xe4\x33\x1b\xbc\xe5\x92\x05\x24\x9a\x61\x00\x0a\x88\x83\x59\x44\x2f\x91\x43\x97\x52\x1a\x6f\x5e\xd1\xa9\xfb\xce\x54\x1f\xc3\x2b\x10\xfa\x38\x38\x3f\x17\xd8\x3e\x3f\x47\x57\x90\x2b\xb9\x6e\x1c\x70\x24\xac\xd2\xac\x2f\x00\xc4\x1c\xaa\x48\x98\x0e\x4d\xb0\x6e\x95\xb6\x19\xe2\xa2\x80\xdb\xfe\x96\x6d\x08\xe5\xf6\x27\x4c\x57\x1a\x0d\x10\x07\x5b\xb6\x79\x89\xb6\x78\x87\x3c\x05\x59\xea\x9d\xf2\x40\x80\xdb\x52\xb6\x45\xed\xb6\x1f\xa1\x63\x9a\xcd\x92\x1c\x4b\x83\x21\x15\x5c\x70\xcb\x5f\xe8\x0a\x80\xab\xde\x7a\x81\xb9\xa6\xda\x27\xa0\x9f\x86\xa9\x20\x70\xdf\xa1\xe5\x96\x75\x05\xbb\xc7\x72\xad\x94\xe5\x0b\xc0\x47\x7d\xc1\xc7\x7a\x51\xc1\xae\x27\x93\x56\x5b\x4a\x22\xdb\xd3\x36\xb3\xd7\x2c\xe7\x0d\x24\x9f\x6e\x95\x6d\x0e\x3d\x81\xab\x4b\x7c\x93\x3b\x08\x54\xce\x9b\x8f\x01\x24\x68\x30\xec\x71\xf6\x20\x58\x07\x67\xca\x0c\x10\xc9\x61\x69\x89\x0c\x12\x50\x7c\x85\x69\x8e\x7d\x50\xf6\xdd\xc2\x9a\xaf\x90\x92\xa7\x28\xfe\x43\x82\x79\x36\xf7\x05\x23\x53\x2d\x96\x88\x91\xdc\x83\x8b\x60\xcd\x5a\x70\x51\xc1\x1a\xe7\x25\x9c\x3c\x54\xd1\x1c\xbd\x86\xd7\x16\xc1\xdd\x5a\x4b\x28\xbc\x86\x82\xd3\x86\x15\xcb\x64\x2c\x8c\x84\x60\x4e\xf1\x15\xea\x48\x7e\x2c\xf8\x91\xfa\x2d\x94\x52\x69\xaa\x89\x9f\x9a\x91\xf1\x94\x92\xdb\x89\x8f\x8a\xb4\x13\x49\x35\xe9\xcb\x93\x2c\x25\xa7\x2e\xa5\xb4\x68\x38\x07\x70\x0d\x03\x8d\x62\x26\x10\xc2\x65\x85\xc7\xa4\x26\x34\x9a\x46\x74\x8b\xf9\x1d\x50\x5a\x6b\xc2\xca\x61\xa0\xdd\x56\x0c\x7e\x9d\x29\x3f\x59\x17\x70\x8b\x97\x67\x0f\xd8\x50\x0b\xfe\x02\xe6\x2c\x9b\x87\x16\x4d\x58\x83\xe9\x28\x4f\x52\x0d\xb8\x41\x67\x68\x49\xbe\xaa\xfa\x83\xa5\xfa\x23\xd5\x6f\x6c\x2b\x32\x52\xb8\x5d\x45\x69\x01\x1b\x0a\xb8\x73\x12\x38\x0c\xba\xa1\x9e\xa4\x3c\x9e\xde\xb3\x4c\x34\xc2\x4d\x31\xd5\x7e\xaa\x44\xb5\xd2\x54\x52\x81\xdd\x52\x3b\x22\x90\xde\xab\x03\xad\xad\xd1\x42\x63\x3a\xa9\x0f\x5a\x91\xe9\x46\xb7\x97\xfc\x86\x3a\xbd\x8d\x0d\xe3\xc2\xa9\x61\x27\x19\xc2\x14\x45\x75\x0c\x09\xa9\xcf\x59\x49\x20\xf5\x00\x50\x7a\x6b\x3c\x4c\x62\x69\xa5\xe9\xbc\x5f\x51\x49\x85\xda\xac\x52\x93\x1b\x41\x4f\xab\x42\x7c\xdd\x5b\xc9\x46\x0f\x92\x6d\x65\xed\x76\x5e\x25\xe8\x5f\xa3\x52\x8d\x32\x9d\x9b\x34\xb8\xd6\x11\x15\xed\xf2\xa6\x51\xbb\x86\x95\x5a\x68\xdb\x2c\x7b\x74\x5f\xa2\x2a\xaf\xb4\x96\x37\x2d\x5a\x46\x6f\x5a\x39\x8b\x18\x9e\x61\xc2\x5a\xd7\x09\x9b\x66\x0b\xd6\x12\xd5\x5b\x19\x6d\x29\x08\xbc\x6f\x00\xb8\x28\x0a\x28\x8d\x39\xdb\xf2\x67\x92\x1b\x49\x0e\xb4\x72\xe6\xa9\x9c\x79\x2a\x27\xa5\x41\x22\x03\x2a\x94\xb2\xa4\x39\x8b\xe5\xe2\x4c\xaa\x13\xd5\x6e\x1b\xe0\x13\x1b\x4c\x45\x5a\x49\xef\x82\xe2\xe8\xb2\x28\xb8\x00\xf2\xc4\x6f\xb1\xc8\x96\x4b\x4f\xdb\x84\xe2\x1b\xb4\xdb\x16\xed\xb4\xdb\xec\x57\x64\x8f\x5a\x48\x2f\xce\x89\xb4\xe8\xe2\x46\x85\xa1\xcf\xf0\xb6\x54\xbf\xd4\x22\xc2\x6a\xf9\x30\x18\xf5\xfd\x55\xdc\x4b\xac\x2b\xbb\x1b\x6e\x34\x88\x1c\x6d\x70\xfa\x29\x28\xa0\xfe\xa8\xa1\xfb\x61\x5c\xc3\x1a\xb3\x28\x52\x1f\xb8\x48\xec\x1b\x70\x44\xdd\xd0\xb2\xe1\x55\x09\xbf\xe4\x3e\xa8\xe4\xbc\x58\x1a\x61\xf6\xe8\x4a\xfb\xb3\x6c\x50\x2e\xce\xd0\xb2\xe3\xb1\xb2\xac\x99\x62\xa6\xb2\x1c\x03\x70\x5a\xc0\x71\x42\x92\x7c\x5a\xe1\x66\x25\xeb\x5e\x4d\x56\x4c\x92\x95\x31\xb7\x6b\x64\xc5\x04\x59\x11\xdb\xd4\xe1\x73\x6e\xf3\xd5\x12\xe3\xc4\x9a\x57\x6e\xdc\x2b\x5b\x08\xc0\x73\x9f\x70\x10\x0b\x28\x16\xd1\xff\x14\x88\x92\x06\x05\x78\xa5\x38\x5f\x25\x2a\xa8\xe5\x99\x4c\x10\x15\xb3\xce\xa1\xd4\x22\x3d\x29\x8a\x06\x5f\x48\x52\x2e\x57\x53\xc5\x09\x22\xc6\xf0\x6c\xce\x3c\x50\x40\x2d\x70\x85\xef\x24\x5c\xe1\x8e\xaf\x8a\xe6\x5b\x6d\xb7\x86\xdc\xbe\x82\xc6\xb4\x0e\x19\x54\xa6\x74\x48\x0a\x58\x3a\xa9\x2c\x4a\xd1\x53\x6f\x4b\x0f\x8e\x5b\xdc\xf0\xf4\xeb\xbe\x7d\x86\xae\x7d\x06\x00\xb7\x5b\xfb\xff\xec\xce\x44\x28\x77\x19\xec\xce\x63\xa3\x03\xc6\xc8\x5b\x10\xd9\x53\xec\xad\x69\x83\xe2\x04\x8f\x53\x3c\x62\xed\xb6\xfa\x11\x4c\x30\xeb\x5b\xbf\x83\x8b\x84\xc4\x3e\x68\x20\x52\xce\xe9\x54\x2c\x61\xa1\xa1\xe9\xe9\x33\x7e\x78\x6b\x67\x69\x07\xe7\x23\x9a\xcc\x59\x46\x7d\xca\x2b\x94\x36\x1e\xef\x4d\xfc\xaf\xc4\x17\x9d\x2c\x38\xa3\xd7\x04\xf7\xeb\xd3\x3e\x0e\x09\x08\x13\xb5\xd5\x54\xc0\x38\x88\xe6\xf3\xf4\x46\x2a\x37\x65\x71\xcb\x44\x9e\x1a\x26\xde\x5b\xab\x6f\x7a\xd5\x36\xbc\xb4\xe1\xca\x95\x24\xce\x15\xd7\x10\xf2\x31\x7a\xef\x63\x00\x7a\x46\x85\x2f\xac\x2d\x8b\xbb\x6c\xb3\xb7\xd1\xbc\xcf\x29\xf4\x6d\x34\x57\xa6\xa8\x6e\xa2\x6a\xc5\xf0\xf5\xb1\x48\x53\xc9\xbe\x7d\x82\x30\xdc\xe8\x22\x84\xb4\x75\x50\x6e\x72\x49\xe8\x08\x08\x12\x12\xe3\x2f\x47\x63\xdf\x1b\x90\x88\x25\x57\xb8\x35\xca\x62\x3c\xf4\x00\x30\x66\xbc\x58\x8c\x55\x93\xbf\x9c\x62\x6c\x49\x55\xcb\x59\x73\xba\x98\x63\xda\xc2\x5f\xe6\x14\xe7\x39\x1f\xdd\x6c\x91\xb3\x16\x4e\xd8\x14\xd3\xd6\x05\x6e\x71\x18\xb9\x88\x8d\x4a\x3f\xb4\x94\xb2\x72\x68\x6b\x08\x49\xde\x2d\x36\x11\x39\xc6\x4a\xd3\x7e\x82\xb9\x49\xd0\x13\x16\xa2\xf0\x0a\x14\x2e\x5f\x3a\xb7\x18\xcb\xf9\x83\xef\xc5\x84\x02\xdb\xb4\x2d\x97\x3f\x5d\x69\x29\x5a\x36\x24\xac\xa8\xf4\x6a\xf5\xd0\xca\xea\xe9\xda\xab\xa5\x61\xbf\x17\x00\xce\x7c\x0a\x31\x28\x20\x9f\x66\x7b\x67\xaa\xca\x3b\xc6\xe8\xd4\x07\xe5\x12\x29\x7b\xbd\x7b\xa1\x0c\x38\x36\x87\x3d\x2a\x4c\x22\x45\xc2\x62\x25\xc8\x45\x43\xf0\xb5\x5f\xce\x3f\x6f\x48\x15\x11\x3e\x95\xd2\x7c\x6a\xb7\x67\x7e\x02\x89\x6d\xef\x26\x05\x1c\xab\xb2\xc2\xc0\x70\xad\x88\x2b\xcb\xa6\xac\xd1\xe1\x16\xa5\xd1\x4d\x90\xe4\xe2\xaf\x35\x89\x5f\x38\x06\x7c\x0c\xec\x9d\x5f\x29\xa9\x1d\x2c\x44\x6e\xf1\xea\x15\x84\x07\xf2\xbb\x74\x8e\x0e\x97\x4b\x9d\x63\x6f\xfa\x0e\x75\x5f\x12\x86\x31\xcd\x66\x65\xa7\x07\xd5\xae\xb9\x29\xe2\x20\xe0\x7d\x72\x15\xa5\x49\xac\x99\x7f\x8b\x65\xad\x7c\x4e\x71\x14\xb7\x48\x46\x36\x44\x47\x17\xa9\xd9\x49\x0d\xfe\x26\xfb\xa4\x95\xd1\x18\x53\x5e\xf4\x42\xb9\x7e\x2f\x52\x0c\x45\x85\x88\xc3\xa1\x1c\x95\xb9\x5c\x0c\xd3\xe8\x0a\xb7\xa2\x56\x63\x44\x3e\x50\x2e\xe1\xc0\x03\x85\x6f\xa1\x7a\x52\x39\x9d\xf0\x40\x64\xe3\x3a\xa6\x8d\xbf\x5d\xf2\x09\xdc\xe7\x7f\xc3\xbb\x70\xef\xc2\x7a\x0d\xdf\x3d\xc5\x77\xd6\x90\xa6\x4a\x7d\xba\x02\x0d\x86\x30\xe7\x16\xf3\x08\xad\x75\x7b\x8c\xde\x70\x68\x23\xe4\x13\x6d\x55\x60\x00\x84\x72\x03\x3b\x48\x2f\x7b\x65\xfa\x13\xb0\x86\x10\x51\x23\xe9\xe5\x68\xad\x2b\x0d\x01\xc9\x7e\xfd\x1c\xf9\x94\x5b\x40\x92\x91\x01\x69\xc9\xb5\xdb\x7e\xa6\x5c\x03\x92\xad\x03\x98\x29\x7e\x2f\xb8\x0a\x6f\xa6\x03\x7a\x6a\x83\x79\x01\x6e\x47\x1c\xb6\x04\x2d\x0a\xa5\xf7\xdc\x2a\x10\xd7\x72\x4d\x74\xc4\xec\x21\xa4\xe5\x87\xaf\x4f\x83\xf8\x29\x87\x32\xd5\x08\x2f\x9b\x49\xc6\xfe\x48\xf1\xc6\xd2\xcd\xd8\xca\x8a\x42\xcc\x80\xa0\x42\xf1\xf7\x1b\xe8\x30\xc6\x92\x29\x2c\x28\xfe\xdf\x23\xc6\x1b\xa3\x5f\x37\x85\x02\x2b\x25\x1e\xfb\x07\xc5\xc3\x6a\xa7\x5e\xf5\x78\x83\x93\x5b\xe3\xfb\xf8\xf3\x2a\x6d\xc9\x2b\xdb\xf5\xe0\xad\x69\xa3\x5b\x00\xc8\x38\xcf\xe4\x68\x30\x68\x99\x55\xd6\xe8\x0c\x3d\xc2\xc9\xe9\xe2\xf1\x96\xbb\xce\xb8\x3e\x19\xc4\x05\xac\x77\x7c\x61\xb4\x87\x53\x1f\x34\x36\x79\xd5\x9a\x87\x54\x28\x20\xd2\xa9\xaf\x74\x2a\x87\x74\xec\x11\xd4\x10\x41\x3e\xb5\x24\x6a\xa2\x4c\x72\xc2\x15\x6a\x97\xca\xa4\x01\xd8\x96\x19\x04\x58\xae\xf5\xed\x92\x74\xb8\x71\xd3\x38\x11\xc0\x96\x4b\x87\xfe\xc3\x8c\x0e\x50\xd3\x13\x9c\x04\xb6\x83\x69\x72\x85\xe3\x96\x35\xa8\xbc\x35\xe3\x54\x4f\xd2\x9b\x96\x5e\x8d\xd2\x1f\x99\xd1\x96\x61\x7e\x25\xe4\x5b\x15\x39\xbd\xa5\xd8\x6c\xe9\xab\xb5\xf5\x9e\x13\x3c\xc6\x14\x93\x91\xee\x9c\x0f\xb9\x35\x8d\x72\xf2\x23\x6b\x5d\x60\x4c\x5a\x09\x49\x58\x12\xa5\x49\x8e\xe3\xd6\x46\x2b\xe7\xc4\xef\x83\x4a\x09\xce\xc4\xec\xde\xb1\xbd\x9f\x5f\x17\x8e\xa8\xa6\x5f\x2f\x97\x6b\x8d\xe9\x52\xd8\x5a\xeb\x72\x6c\x35\xf5\x89\x7c\x1a\xcd\x2a\x45\x1c\x28\x3f\xa6\xd9\x97\x1b\x5d\xa8\xd3\x33\x87\x77\x5a\x2f\xb3\x2c\xc5\x91\xa5\x2b\x48\x56\x7b\x34\x96\xcc\xb8\x49\x3b\xaa\x02\x1c\x0c\x6d\xbf\x70\x01\x00\x5c\xeb\x28\x56\x5c\xaa\x11\x6b\xdd\xea\x06\x71\xb9\x06\xde\xdf\xbd\x9a\x26\xf7\xac\x26\xd7\x5a\x5a\x2e\x9d\x95\xf9\xd4\xc3\xf7\x15\x02\xb8\xac\xba\x6f\x08\xea\xf4\xc8\xaf\x4c\x7b\x95\xc9\xfa\xba\x56\xc6\xd8\x80\x70\x55\xcc\xe8\x86\xc8\xfe\x58\x2e\xd7\xba\x90\x06\x36\xff\xe1\xf2\xc7\x13\xf8\xf3\x12\xd2\xa2\xed\xb6\x4f\x03\xcd\x67\xb8\xac\x5a\xc9\x99\xae\x7d\x1a\x5c\xe2\x1b\xc0\x95\xe0\xca\x3e\x63\xd5\x1a\x6d\xb7\x2f\x2b\xba\x2c\x03\x90\x88\x34\x48\xbe\x89\xeb\xe1\xda\x16\xa4\x64\x3a\x4d\xb7\x8b\x5a\xd7\xc6\x52\x90\xaa\x9a\xed\x54\x50\xa6\x85\x51\xeb\x58\x76\x4c\x93\x59\xc2\xed\x90\x61\x65\x99\x13\xcb\xd0\x57\x66\xd5\x72\xe9\xc5\x78\x1c\x2d\x52\xa6\x0e\x9f\xd4\x3b\x2c\x8f\x0a\xd0\x9e\x93\x47\xfc\xd7\x7f\x59\xdd\x49\x09\xa4\x77\xc3\x5b\xf3\x32\x5d\xcc\x0c\x97\x7e\x4a\xee\x7b\xb9\xdc\xe0\xe0\xca\x4a\x5f\xda\x52\xe1\xe1\x62\x76\x81\x29\x90\x2a\x26\xd4\x25\xf4\x62\xf6\x72\x31\x38\x8b\x97\xf5\x59\x28\x6b\x56\x76\x88\x5f\x97\xb8\x5b\xf3\x2b\x67\xf4\x18\x70\x33\xb9\xed\x88\x90\x8c\x09\xde\xd1\x8a\x5a\xa3\x34\xca\xf3\x56\x94\x57\x84\xa6\xbd\xa1\x69\xa9\x7e\xff\x80\xb6\xb7\x46\x9c\x7a\xa7\x30\x3a\xb9\x8a\x0d\x96\x4b\xd6\x6e\xe3\x76\xdb\x23\x02\x3b\xf6\x2e\xb1\xda\x0b\xbe\xe5\x2a\x15\x46\x44\x1a\x2a\x14\x75\xac\x2d\x61\xce\x1e\xf4\x41\x94\x3c\x4c\x20\x09\x9b\x1b\x4f\xf4\x37\xa4\xdb\xea\xdf\xea\x8d\xd9\x50\xfd\xea\x42\x25\xf8\x07\x74\x7d\x7d\x58\x14\x10\x57\x78\x81\x72\x02\x16\x70\x1c\x56\x3c\x40\x77\xab\x5e\x12\x05\xff\x62\xb5\x4b\x38\x69\x61\xca\xf9\x44\xc6\x75\xe8\x12\x2b\x16\x46\x2c\x6d\xba\xa8\xe2\x4a\xee\xad\x10\xb5\xbf\x57\x7a\x60\x91\xdc\xca\x12\x9b\xa1\x15\xc4\x64\xbc\x9f\x08\x09\xcc\xd8\xca\x29\xbd\xb9\x4d\xf5\x0a\xd6\x4a\xf0\x72\x69\xd4\x61\x5b\xf1\xcd\xf4\x49\xaf\xc2\x3e\xec\x73\x50\xd2\xb7\x32\xf7\xca\x95\x54\xfa\x12\x8c\x85\xa8\xcd\x57\xd2\x38\x5b\x5c\x73\x61\x60\xa0\x36\x9e\x5e\xc0\x8d\x6e\xb9\xe4\x8e\xb4\x52\x21\x4f\x03\x59\x6a\x40\xbb\xed\x13\x54\x49\x91\x7b\xd5\xd0\x7b\x1b\xcd\x45\x85\xe5\xd2\x3b\xc5\xb2\x6e\xbf\x62\x3f\x86\xde\x96\x56\x70\x54\xc1\x27\xff\xed\xf7\xc3\x77\xc9\x72\x1f\x10\xe6\xf7\xc3\x17\xcb\xee\x4f\xcb\xa7\x9b\xc0\xef\x87\xdb\x69\x34\x9b\xe3\x18\xc8\x16\x7e\x78\x12\x30\x9c\x73\x8b\xa6\x2f\xc7\xa6\x7c\x38\x16\x76\x64\xfa\xad\xf2\xde\xb0\xe5\x92\xfd\x56\x2e\x14\xb1\xfd\x5e\x7e\xf5\x2c\x21\x04\xa9\xdc\x20\x16\xab\x8f\x01\x2e\x93\x84\x30\xa2\x03\x32\x44\x58\x88\x22\xb5\x56\x04\x19\xfd\xe5\x3e\x83\x0d\x77\x9d\xe9\x09\xce\xe1\xfe\x7d\x3e\xb7\x1c\x9e\xb9\x8b\x48\x9a\xce\xe1\x51\x73\x06\x6b\x27\xc3\x8f\x9b\x25\xe6\x2a\x6f\x3f\xdf\x2d\x65\x27\x3c\x5c\x75\x00\x5a\x6c\x58\xe2\xfe\x5f\xd2\xb9\xf9\x60\xa7\xa6\xe2\x10\xa4\x74\x6e\x16\xf0\x04\xb9\xb7\x6b\x88\xd8\x12\x15\x17\x02\xb8\xda\x72\x64\xce\x2a\xb7\xdb\x87\xf2\x90\xe6\x80\x0c\x85\x1c\x3a\x2b\x0d\x60\xf4\xd6\x3f\xf3\x19\x00\x42\x75\xe2\x2d\x25\x41\xee\x83\xde\x9a\x4f\x51\x12\x10\x5f\x99\xac\x3d\xbe\x7a\x95\xb1\xda\x3b\x5e\xd1\xb0\x3e\x11\x1d\x81\xdb\x24\xc0\x7e\x64\x2d\xb7\x60\xec\x83\xd2\xc0\xc4\x05\xdc\x43\x4e\x0b\x62\xd7\xc7\x70\x9f\x43\x53\xf4\xfc\x1c\xa7\xe3\xe0\x1a\x5f\xcc\xa3\xd1\xe5\xf6\x74\x41\x2e\xd9\xe5\xe4\xfc\x32\x19\x5d\xe6\x2c\xa2\xec\x7c\x91\xa0\x7b\x4b\x88\xb3\xe0\xd2\xd0\x1e\x0c\xba\x3f\xff\x32\x84\xb7\xbf\xbc\xd8\x7c\xfe\xbc\xea\xf2\x37\xe7\x7b\x8c\xfa\xa5\xce\x37\x94\x47\x71\xeb\x67\x14\xb4\x46\x61\xf9\xe3\x95\xa0\x1b\x27\x24\x6e\xcd\xb2\x78\x91\xe2\xd6\x8f\xde\x3a\x5e\xf7\x7e\xf4\x80\x92\xed\x5c\xdb\x8c\x31\xf2\xde\x1e\xed\xbc\x3b\xd8\x3d\x3f\x3c\x3a\x3b\xdf\x3b\x7a\x77\xb8\xe3\x41\x56\x80\x82\xd5\x0e\x19\x68\x60\x06\xc3\x02\x96\x87\x82\x11\x83\x2c\x48\x62\x24\xc6\x01\x71\x80\xbf\xcc\x33\xca\x72\xc4\x0a\xd8\xfd\x79\xf3\xe9\x8b\x86\xf7\xad\x72\x71\x83\x04\xb1\xcf\xe0\x6d\xfa\xd4\x21\xa8\xa2\x02\x9e\x7f\x72\x09\xb0\x02\x1e\x6c\x3b\xd2\x93\x02\xfe\x75\xe8\x48\x1f\x17\xf0\x13\x73\xa4\x67\x05\xdc\x7b\xe6\x48\x8f\x0b\x78\x75\xec\x48\xcf\x0b\x78\xfa\xd2\x91\xbe\x28\x60\xe6\x4a\x1f\x15\x10\x9f\x38\xd2\xa7\x05\xfc\xf3\x07\x47\x7a\x5a\xc0\xbf\x76\x1d\xe9\x57\x05\xbc\xec\x3a\xd2\x27\x45\xa1\x75\x80\x73\xbf\x72\x78\xe3\xb5\xb4\x1f\x31\x28\x00\x4c\xee\xca\x8c\x90\xf7\x9f\xd6\x2d\x8d\xd4\xa6\x7d\x79\x7b\xe0\x67\xc8\xf9\x7c\x88\xa1\xe0\x71\x09\x2f\x96\x87\x0c\x66\x73\xf9\xeb\xd6\x16\x55\x99\x51\x6c\xeb\xbb\x06\xbf\x75\xdb\xed\x52\x2d\x2d\x33\x07\xdd\x61\xdf\xfe\x08\x39\x1b\xef\xd9\xdd\x3f\x83\x39\xbb\x49\x31\xef\x92\x25\xb3\x84\x4c\xf2\x10\x5b\x3d\xe6\xff\x7c\x8f\x9b\x30\x67\x78\x9e\x87\xb8\x1c\x23\x2b\xec\x9b\x47\xb8\x8a\x9f\x9f\x34\x80\x18\x66\xe3\x71\x8e\x99\x68\xb1\x79\xab\xa4\x5a\xab\xa3\xb1\x5a\x8e\x4e\x77\x66\x5f\x48\x89\xeb\x9d\x3d\xd7\xb0\x15\x8d\xcd\x15\x29\xd9\x1a\x48\xd8\x74\x22\x61\xd3\x46\xc2\xa6\x03\x09\x5d\x88\xbf\xcc\x69\x88\x61\x44\x92\x59\x24\xf6\xa1\xdd\x20\x8a\xed\x97\x3a\x6f\x12\xbb\xd9\x92\x3f\x61\xa9\x88\x8d\x6d\x26\x52\xa1\xc6\x15\x93\xd7\x71\xc2\xdd\xb1\xe1\xee\x0c\x39\x1a\xbf\x75\xde\x3b\xbd\x72\x1d\xc8\x1d\xe5\xf3\x8c\xec\x64\x04\xef\x91\x1c\x0d\x86\x65\x92\x38\xb5\x5e\x4b\xdb\xc1\x39\xa3\xd9\x4d\x25\x55\x30\x78\x1c\x97\x67\x8c\xce\x63\x59\xc8\x4e\x92\x1b\xd0\x76\xca\x3c\xcb\xc5\x8a\xd2\x47\x98\xe6\x11\xc5\x84\x1d\xa7\xd1\x0d\xa6\xd6\xe9\x24\x96\xb1\x28\x3d\x4b\x66\x18\xb1\x75\xa2\x65\x16\xb7\x58\x07\xb7\x97\xf8\x26\xf4\xce\x33\xb2\x27\xda\xf6\x60\xed\xda\x84\x3a\x31\x54\x76\xcd\x45\x71\x0d\x96\x4e\x7d\xf8\xcd\xbb\x31\x96\x13\xc0\xe7\x5c\xa3\x89\x2f\x50\x14\x50\xc2\xa2\x50\xd6\x80\x44\x9f\xba\xb5\x70\x2a\xe5\x20\xb6\xeb\xf2\x16\xef\xaa\xaa\x41\x74\xd4\x94\xf8\xbe\xb3\x72\x39\x6f\x8d\xfa\xd3\x28\x3f\x95\x33\xe8\x40\xa1\xbd\x41\xad\x27\xba\xac\xc9\x79\xa2\xa3\x4e\x99\x3f\x4f\xa3\x26\x50\x0a\x26\xd3\xab\x0f\xca\x99\x51\xf8\xf1\xcb\xc3\xd1\xc9\x64\x82\xe9\xdb\x64\x44\x33\x16\xe5\x97\x3e\x00\x75\x92\xeb\x94\x9d\xd5\x0b\x3b\x3a\x36\x87\xc6\x7a\x73\xbf\x39\x48\x1c\x94\xc4\x24\x8e\x35\xea\x96\xcf\x57\xcd\xab\x63\x5a\x1f\x4c\x3f\xd6\xe2\x32\xf8\x8a\x16\x79\x93\x04\x2c\x84\x52\x9c\xaf\x00\xa4\x2c\x32\xbe\x7b\x31\x58\x03\xd4\x35\xe2\x15\xd4\xa3\xab\x94\xab\xb9\x9c\x26\x6b\x7d\xab\x15\x54\x9d\x4d\xe7\x64\x8e\x55\xbf\x0e\x56\xf2\x88\x55\x67\xb3\x1f\x60\xe3\x05\xaf\x9e\x1e\xc3\x9f\xca\x0a\x39\x66\xc7\x8a\xff\xac\x5e\x35\x25\x87\xaa\x32\xa2\x3e\xfe\xcf\x6a\x42\x68\xda\x9d\xdc\xd1\x6e\x75\x31\x99\xe6\xaa\x9d\x3d\x59\xd9\xb6\x22\xf0\xed\x28\x4d\x2f\xa2\x51\x93\xbe\xcd\x59\x80\x5c\x5d\x37\xd2\x6d\x1b\x6a\x0b\x6b\xcc\xa4\xc7\x1e\x80\x7b\x25\x5c\x50\xa7\x28\x86\x00\xe2\xc2\x07\xf0\x6a\x85\x4c\xab\x9c\xc3\xf9\x56\x29\xd3\x94\x15\x0f\x91\x30\x4e\xd9\x74\xaf\x50\xd1\xc2\x47\x94\xc8\x11\xb3\xfc\x4a\x1d\x18\xa1\x0e\x54\xe7\xb2\x54\x01\xed\xbd\xed\x20\x94\xf6\x5d\x3c\x84\x54\x79\x48\x58\xa9\xec\x42\x35\x0e\x24\x56\xec\xb6\xd6\xd7\x29\x42\x69\xbb\x5d\x6b\x0c\x8a\xb2\x72\x90\xd5\xe2\x89\x29\xae\xf3\x75\x79\xb9\x06\x2b\xa5\x23\x53\x5a\xad\xd0\xa2\x5c\x63\x96\xb8\xb5\x21\xa7\x38\x5e\x8c\x2c\x18\x6d\x33\xf1\x6d\xc4\xa6\xc1\x2c\x12\xde\x08\x53\x1f\x14\xb0\x03\xfe\xcd\xe5\xf5\x0a\xf9\x75\xef\x9c\x99\xc3\xf4\x24\x61\x15\x51\xf1\x3d\x1a\xc0\x7d\x62\xc6\x29\x31\x8d\x20\x6c\x2c\xa8\x6f\x92\x45\xff\xff\x56\x48\xee\x52\x38\x6c\x56\xa0\x44\x94\x9c\x3e\xe8\x14\x57\x0f\x9a\x7f\x5e\xa8\x32\xff\xab\x24\xf8\x23\x9a\xe4\x2d\x54\xda\x5c\x2d\xf4\x1f\xde\xaa\x6a\xa3\xd2\xee\x83\x35\x85\x47\x20\x64\xdc\xd4\x9e\xee\x53\x2f\x6c\x96\x65\x2d\x85\x55\x24\xf4\x18\xad\xe4\xdb\xc6\x10\x5b\x1c\xf4\x5f\xad\xab\x3c\x74\x32\x31\xb3\xba\x7a\x90\xb9\xf5\x78\x25\x48\xdd\xe8\xab\x29\x3b\xbd\x7b\xe1\x54\x1b\x74\x96\x86\x23\x25\x44\x42\xfc\x2e\x64\x4f\xac\x0c\x10\x76\x7b\x38\xb0\xc0\xf0\x89\x4d\x39\x77\x2b\x53\xd6\x0d\x90\x87\x48\x29\x73\xc4\xd1\x12\x52\xbf\xd9\x50\xb2\x10\x17\x50\x1e\x46\xb7\xea\xac\x21\xdc\xc7\x81\x05\x8a\x0f\x42\x63\x74\x5c\xe0\x71\x46\xf1\x3d\xb4\x7a\xb7\xf8\xaf\x34\xd1\x6e\xd7\x12\x2a\x4b\xe9\xdf\x49\x03\x9c\x20\x6f\xcd\x2b\xe0\xd3\x17\xcf\x5f\x3c\x7d\x90\x9b\x73\x46\x1d\x6c\xfc\xba\x80\x47\x57\x2e\xb7\x25\x2e\x20\xfe\xea\xf2\xfb\xe1\x02\xbe\xe9\xb8\x1d\x8e\xbf\xff\xee\x72\x20\xe2\x02\x7e\x71\xa4\x1f\x17\x90\xbd\x75\xa4\x9f\x14\x70\x27\x73\xa4\x7f\x29\xe0\xfb\x73\xb7\x43\xf3\xa3\x4b\x40\xfd\x55\xc0\x53\x97\xa3\xf3\x7d\x01\x67\x97\x8e\xf4\x37\x05\xcc\x27\x8e\x74\x8c\x0b\x78\xf4\xdc\x91\x41\x70\x01\x8f\x5d\xae\xe0\x1c\x17\xf0\x64\xcf\xe5\x63\xe5\xf4\xfd\x8b\xcb\x19\x8c\x0b\xc8\x5c\x5e\xdf\x11\x2e\xe0\xb5\xcb\x2d\xbb\x57\xc0\x0b\xd7\x2c\x1c\x14\x30\xbd\x76\xbb\x89\xcf\x5c\xfb\xb1\x87\x05\xdc\x75\xcd\xc2\x05\x2e\xe0\xef\xae\x31\x9c\x72\x88\x4e\x1d\x19\x5f\x0b\xf8\xd6\xd5\xc3\x4e\x01\xc7\x17\x8e\xf4\x57\x05\x7c\x77\xe6\x48\xff\x54\xc0\xd8\x45\x91\x2f\x0b\x78\xe8\x02\x68\xc6\x01\x72\x11\x46\x5e\xc0\x8b\x1d\x47\xfa\x0d\x2e\xe0\x67\xb7\xc7\xff\xad\x8b\x50\xff\x28\xe0\x6b\x17\xa0\xa9\xf1\x80\x13\xbf\xdb\xf9\xe9\xe9\x2f\x00\x26\xc2\xc6\x31\x3e\xed\xc8\xde\x20\xb0\x3d\xdd\xe0\x36\x59\x2e\xfd\x04\x29\x17\x65\x06\xf3\xbb\x3c\xe5\x23\xb1\xb3\x42\x83\xa3\xf4\xd8\xf7\x76\xb2\x91\xf0\x24\x9e\x65\x97\x98\x78\x00\x2e\x90\xef\x67\x2b\x5d\x9c\xa6\x99\xa6\x29\x30\x4d\x72\x96\xd1\x9b\x57\x99\x5b\x4f\xac\xdd\xb0\x38\xcc\x58\x2b\x99\xcd\x53\x71\xf3\x0a\xc7\x1e\x28\x79\x11\x08\xfe\x5e\x74\x36\x7f\x7e\x3e\x8e\x46\xae\x5b\xc3\x04\x5f\xfb\x78\xb9\xcc\x40\x01\x33\x55\x72\x4e\xb3\x2b\xe4\x77\x20\x0d\x3e\x7e\xfd\x19\xf8\xb7\xe3\x68\xc4\x21\x09\x63\xc8\xf8\xa8\xc2\x0c\xaa\xa0\x0b\xf1\x3e\x11\x5a\x25\x1b\x67\x74\xe6\x15\x00\x66\x56\x98\x1d\x73\x99\x41\x34\x75\xb0\xf7\x0a\xf8\x73\x89\xd0\xa9\x8d\xb1\x83\x6c\x24\xdc\xc8\xad\x7d\x75\xa8\xeb\x2b\x07\x1f\xce\x51\x43\x9a\xd9\xd0\xdf\xf8\x04\xaa\x2b\xbd\x0c\x5d\xf8\xc4\xea\xb8\xe4\xf4\xfa\xbe\x75\xeb\xb5\x3e\x34\x07\x7d\x8a\x98\xb9\x6f\x09\x40\x70\x1e\x67\x23\x84\x21\x0d\xce\x95\xba\x4b\xcd\x54\x90\xd2\x2a\xbb\xcb\x14\x4a\x15\xfc\xe8\x3a\x21\x71\x76\x5d\x7e\x2b\xcd\x42\x4d\xa3\xce\x55\x9f\xb6\x14\x7f\x19\xe5\xf8\x35\xc5\xe3\x3d\x9a\xcd\x76\x8e\xde\xae\xd6\xea\x23\x1f\x04\x56\x79\xad\xd8\x89\xeb\x71\xa5\x71\x71\x9c\xcd\x4f\x59\xc4\x9c\xa6\x89\xf2\xa8\xcb\x66\x5e\xa5\xd9\x45\x94\xee\x5e\x71\x62\x8d\xe8\x04\x33\xd3\x1e\xf4\x24\xb4\xe6\xf8\x1c\x0b\xa2\x38\x16\x65\x0f\x92\x9c\x61\x82\xa9\xef\xcd\xb3\x79\x2e\x7b\xc2\x70\xad\x0b\x5c\x17\x99\x03\x8a\x67\xd9\x15\x5e\x5d\x11\x14\x16\xe8\xaf\xa3\x7c\xba\x3d\x8d\xc8\xe4\x5f\x00\xfc\x34\xca\xa7\x23\xd5\xd7\x23\xc1\xaf\x54\xb5\x06\x30\xa5\x78\xec\xc1\x09\x76\x6d\x28\x56\x28\x25\xe0\x25\x8d\x51\x44\x33\x96\x8d\xb2\xf4\x61\x55\x75\x69\xd3\x6b\x96\x33\x12\xcd\xf0\x03\x7b\x56\xa5\x4d\xef\x19\xb7\x9d\x1e\xd4\x73\x46\x99\x65\xc9\xb1\xe9\xc3\x7b\xd5\xa5\x0b\x58\xbf\xb9\xed\x2e\x87\xb0\xa5\x85\x47\x74\x34\x7d\x58\x37\xb2\xac\x6d\x28\x3f\xb0\x22\x2f\x69\x86\xb6\xc8\xa7\x2b\x56\x90\x54\xdf\xc6\x3e\xe8\x57\xd6\x76\x50\x56\x51\x45\xc2\x66\xf3\x88\x58\x26\xce\x3c\x8d\x46\xf8\x91\x7d\xd8\xb5\x1e\xd4\xcd\x38\xa3\xd7\x11\x75\x39\x09\xaa\x0d\xab\x72\x96\x7d\xe9\xd4\x9e\xeb\xd5\x78\x21\xab\xce\x6a\x69\xa5\xb9\xf7\xb7\x6e\xe4\xf5\xaa\xfd\x4e\x32\xdb\x19\x32\xc1\xcc\x8d\xc7\x9a\x2b\x44\xd7\x16\x7c\x47\x88\x46\x52\xf8\x0b\x2b\xf0\x83\x43\x46\xb2\x8a\x8c\x64\xcb\x25\x06\xbe\x90\x63\xfe\x48\x06\xe2\xb8\x5b\x5a\x5e\x29\x69\x89\x57\x4a\x4b\x2e\x9d\x8d\xd8\x1a\x97\x30\xaf\xad\x55\x85\x85\xa1\xaf\x6a\xcc\x3d\x03\x5d\x6b\xee\x1b\x21\x3b\x02\xcd\xf3\xf3\xc9\xd8\xef\x20\x73\xe2\x49\xe3\xa6\x27\xd3\x59\x2d\x5d\x1f\x23\xed\x18\xfc\x60\x12\xe7\x1f\x12\x36\xf5\xbd\x27\x1e\x68\xb7\xc9\xfa\x3a\x64\x81\xb0\xa3\xea\xc9\x9b\x08\x91\x3e\x5e\x67\x41\xbe\xb8\x90\x07\xd2\xfc\x2e\x08\xbb\x2a\x35\xc4\xeb\xde\x13\x6f\x9d\xd5\x4e\x82\xeb\x38\x3e\x33\x71\x28\xe7\xc9\x7f\x2c\xff\xee\x2f\x7f\x78\x02\x20\x91\x91\x16\xc5\x9d\xba\xe5\xb2\x0c\x64\x53\x82\xa5\x42\x89\x42\xb2\xc1\x21\xe0\x16\xec\x80\x6c\x74\x87\xfd\x6e\xd8\x01\x60\x5d\xe7\x93\x6a\x34\x37\x63\x3d\xb4\xdb\x5e\xdf\x5b\xe3\xb5\x3a\xc3\xbe\xd7\xf7\xd6\x71\x88\x85\x86\xf2\xfe\x0e\xed\xe3\x7f\x41\x87\x7b\x2c\x9d\xde\x4f\x9d\x97\x4e\xea\x94\x31\x8e\xea\x94\x69\x45\x7a\xb2\xa9\xac\xe4\x3c\x3d\x8b\x10\x0f\x2c\x42\x5c\x88\x1b\x1d\x2c\xc8\x68\x32\x49\xc8\x72\xe9\xa9\xb3\x97\xd7\xb6\xfa\x17\xcd\xe7\x5a\xa1\xf1\x00\x3c\xf8\x1e\xad\x0f\xea\x6b\xad\x9c\xac\x2d\x9d\x2f\xa9\xeb\x7c\x7a\x11\x6a\xd5\x13\x61\x98\x04\xe7\x52\xd8\x6b\x39\xaf\xf6\x49\xa4\x63\x44\x1c\x22\x47\x49\xb3\x66\xd0\xd4\xdf\x7c\x00\x74\xad\x66\x80\x84\xc3\xac\x75\x11\xe5\xb8\xc5\x35\x80\x56\x8e\x59\xd0\x3a\x4e\x31\x4f\x30\x61\xcc\x04\xa1\xb4\xc6\x19\x6d\xb1\x29\x6e\x6d\x1d\x1f\x9f\xbf\xdc\x3a\xdd\x3d\x7f\x7d\xb2\xbb\xd7\x12\x73\x26\xee\xf1\xc4\x71\x2b\x92\x4d\x61\x49\x2f\x2d\x96\x89\x0a\xb1\x32\x40\x02\xcf\xba\xb8\x7b\x7e\xa1\x60\x44\x14\x6e\xfb\x09\x70\xe8\xb8\x64\x72\x74\x87\x57\x51\xdc\x10\x93\xac\xb4\x81\xa6\x32\x12\xcc\xaa\x7c\x11\x18\xc6\x7f\xa8\x92\xba\xb2\x15\x11\x00\x4c\xee\x06\xd6\x67\xc1\xb4\xe8\x97\xdb\x69\x8e\x42\x46\xc1\xf4\x31\x00\x2e\x1d\xfc\x3e\x39\xa2\xf1\x68\x69\x6f\x78\x1e\x51\xbc\xfb\x85\x61\x4a\xa2\xf4\x1d\x4d\x5d\x63\xd2\xd6\xb0\x5f\x6d\x05\x62\x50\xd1\xa8\xbe\x5f\x76\xb6\xdb\xf6\x17\xd4\x51\x6f\x1a\xb8\xd0\x9a\xd6\xfa\xe9\x2a\x94\x4a\x65\x4a\x70\x60\x77\x01\xae\x6e\x58\x97\x5d\x71\xdf\xf3\x82\x51\x46\x46\x11\xf3\x19\xd0\xbf\xb8\x92\xf2\x50\xcd\x0a\x56\x03\x74\x34\x31\xeb\x93\xf5\x53\x9f\x02\xd0\x5b\x35\xa8\x8a\x1a\x96\x80\x47\x68\x5c\xdf\xdd\x77\x43\x3d\xb3\xba\xbf\x4f\x13\x6b\x34\xf6\x48\x95\xac\x51\xff\xb1\xba\x19\xc7\xc0\xb7\xeb\x67\xca\x77\xec\x33\xe4\xe3\x15\xc4\x02\x82\x12\x06\xb0\x5c\x96\x77\xbe\xd8\x72\xa9\x23\xe0\x89\x1b\x6d\x52\x2d\x7b\xff\xad\x6a\xd9\x02\x48\xc9\xe3\x5f\xc3\x17\x0d\x0d\x4d\x08\x40\xff\x56\x4b\x3d\x2d\x07\xad\x2e\x94\xdc\x83\x5f\xfe\x19\x19\xd4\xf4\x3d\x3c\x50\x0e\x95\xbc\xda\xf3\xee\x14\x4b\x6b\x42\x2c\x55\x98\x3b\x80\xc9\xff\x63\xed\xff\x18\x6b\xbf\x8b\x23\x3f\x84\x29\xca\xeb\xe0\xe2\x4a\x8e\xf7\x1f\x22\x92\xa0\x5e\x59\x7d\x5c\xd5\x8e\xf1\x23\xe5\x89\x24\x3e\x87\x38\x31\x2e\x8f\xb2\x2b\xef\x3f\xbc\x75\xf6\x3f\xc1\x85\x3b\x08\x25\xaa\x1b\x4e\x87\xf7\x89\x9a\x95\x93\xf7\x2f\x61\xdb\xff\x14\xb0\xff\x8f\xcf\xff\x5f\xc3\xe7\xff\x7a\xa8\x8d\x57\x46\x06\x49\xdc\x07\xb7\xf2\x85\xb8\x6d\xa3\xac\x9a\xab\x39\x56\xe9\x0b\x9a\x4a\x96\xa4\x79\x9d\x75\x8a\x4b\x63\xee\x94\xd1\x88\xe1\xc9\x8d\x3a\x5b\x15\x21\x77\x76\xc5\xef\xbb\x4a\x09\x41\xda\xe7\x5c\x0a\x84\x2d\x7f\xdf\x8f\x40\x9d\x98\xcb\x46\x2d\xde\x6a\x73\x97\xa4\x1c\x52\x80\x67\x09\xf3\x6f\x17\x34\x0d\x13\xb1\x36\xfc\xb5\x0e\x80\xf3\x6c\x1e\xae\x75\xa0\xf0\xa5\x84\x58\xfa\x54\xa0\x38\x1c\x2e\x83\x6c\x15\x56\x70\x75\xcb\x18\xfe\x9f\xd0\x70\x2b\x51\x0a\x65\xb0\xaf\xe4\x2b\xf6\x57\x8c\x57\x8c\xa0\x26\x1e\x1e\xe4\x3e\x72\x99\x7d\x12\x6f\xd6\x71\xa9\x7c\x7b\x41\xc5\x21\x9a\x88\x4d\x77\x3f\x2f\xa2\xf4\xcc\x69\xf6\x7f\xd7\x9d\x04\xcf\xab\x8c\x58\x0c\x08\xa8\x18\x57\x66\xf8\x42\xad\xb7\x86\x59\xe6\x34\xe0\xb1\x03\x22\x70\x71\x34\x3f\xa3\x51\x92\x26\x64\x72\x9a\x46\xf9\xd4\x7d\x56\x00\x73\x9b\xde\x72\xfd\x60\xd0\xb7\x9d\x3d\xa5\x93\x29\x64\x45\x5d\x40\x89\xfb\x52\xe0\xdb\x8c\x27\xdc\x6e\x7b\x4f\xb4\xb3\x46\x0a\xd5\x27\xde\x7a\x83\x53\x9b\xc9\x6e\x0a\x03\xdb\x71\xf8\x3f\x31\x37\x2e\xee\xfa\x88\x6b\x16\xab\x06\x52\xca\x47\x02\x3d\x0f\x8a\x0b\xe7\xb2\x28\xc9\x58\x32\xbe\x79\xd7\x60\x33\xfe\x2a\x69\xa8\x08\x43\x30\xe1\x07\x09\xd9\x7f\x53\x94\x54\xa4\xf0\xff\x04\x56\x1e\x2a\xca\x4b\x88\xbe\x51\x94\x97\xf5\xff\x6d\x44\xb9\x86\xe8\x81\xa2\xbc\xd4\xfb\x4b\x7c\xaf\x26\x22\x21\x3c\x57\x89\x46\x7d\xce\xb1\x2e\x3b\x4f\x17\x17\xf2\x66\xac\x88\xed\xee\xdf\x91\x2b\x07\x92\xcb\x94\x8b\xaa\x48\x63\x77\x90\x05\x0e\x16\x34\x85\x4a\x8e\x81\xc2\xe2\x4f\x2b\xeb\xfc\xd3\x9b\x1c\x9e\x07\x5d\x6b\xac\xba\x98\x54\x94\xba\x95\x08\x6c\x1c\x54\x32\xf7\x79\x25\x03\xb7\xce\x4a\x95\x58\x5a\xb5\x01\x55\x3d\x48\xaa\xb4\x01\x83\x5b\x19\xdf\x1d\x43\x4c\x69\x46\x43\x66\xa2\x85\x92\xe2\xdb\xbd\xd6\x4a\xbd\x7b\xaf\xd5\xbb\x85\x54\xee\x4a\xe9\xf5\xc7\x02\xd3\x9b\xe3\x88\x46\xb3\x1c\x9d\x42\x1c\x7c\xca\x12\xc2\x25\x90\x90\x55\x68\x06\x5d\x22\x4c\x84\x0a\xbf\xdb\x15\xbe\xfb\x08\x57\xf8\x6e\x75\xdb\xe5\x2f\xcb\xdb\xfd\x1e\x40\xdb\xf5\x6d\x6d\x39\xec\xd7\xce\x27\x0a\xde\xe5\x3f\xf9\xfb\x89\xd8\xd6\x08\xa6\x6c\x96\xfe\xf0\x04\x6a\xef\xf8\x19\xf2\xfd\x33\x74\xb6\x5c\xde\x16\x60\x70\x16\xec\xe0\x51\x32\x8b\x52\xd4\x19\x22\x4f\xfd\xf6\xe0\xd9\xe0\x2c\x38\xc6\x74\x84\x09\x43\xdd\x21\xf2\xd4\x6f\x99\x21\xd5\x90\xd1\x0d\xda\x1c\x22\x4f\x7f\xc8\xac\xd3\x51\x82\x09\x4b\xc6\xc9\x08\x3d\x1d\x22\xcf\x7c\x7a\xf0\x0c\xc0\x23\xe4\xfb\x47\xe8\x48\xf6\x7c\x14\xfc\x85\x69\x26\xba\xe5\x3f\x3c\x78\x34\x38\x0a\x8e\x08\x16\xfd\x1d\x11\x2c\x13\xce\xae\x33\xd1\xcd\xd9\xb5\x2a\xb1\x87\xaf\x45\xd3\x7b\xf8\x5a\x26\xbc\x8d\xc8\x0d\x7a\x36\x44\x1e\xff\xa1\x5a\x61\x53\x4c\xd1\x73\xde\x0e\xff\xe5\xc1\x23\x00\x8f\x91\xef\x1f\xa3\x63\xd9\xf7\x71\xb0\xc7\xe7\x9c\x89\xde\xe5\x4f\x0f\x1e\x0f\x8e\x83\x53\x16\x91\x38\x4a\x33\x05\x86\xf9\xf4\xe0\x31\x80\x87\xc8\xf7\x0f\xd1\xa1\x6c\xe3\x30\x38\x8c\x28\xcd\xae\x45\x1b\xf2\xa7\x07\x0f\x07\x87\xc1\xd6\xc5\x05\xc5\x57\x49\xc4\x70\x2c\x1a\xb1\xbe\x65\x81\x0f\x49\x8c\xc5\xa0\xf8\x0f\x99\x74\x3a\xcd\x28\x93\x28\x9b\x8a\x0d\xf3\x43\x00\x4f\x90\xef\x9f\xa0\x13\xd9\xdb\x89\x2a\xd2\x31\x45\x4e\x06\x27\xc1\x5b\x1c\x27\x8b\x99\xe8\x46\xfe\x94\xc9\x07\x19\x99\x88\x1e\xf8\x0f\x99\xb4\xc7\x39\xb2\x40\xdc\x22\x4d\x3d\x78\x02\xe0\x1e\xf2\xfd\x3d\xb4\x27\xdb\xdf\x73\xd3\xc1\xde\x60\x2f\x78\x45\xb3\xc5\x5c\x74\x21\x7e\xc9\x44\xce\x15\x64\x0f\x49\xce\x64\x92\xa2\x91\xd3\x64\x42\x44\x47\xd6\xb7\x2a\x90\x2e\x72\x91\xcb\x67\x4b\x7f\xc8\xac\xb7\x09\x51\x79\x7c\xd6\xca\x2f\x99\xb9\xfb\x65\x9e\x11\x4e\x47\x51\x8a\x7e\x1a\x22\xcf\xfa\x96\x05\x44\x70\x32\xc5\xa6\xc9\x44\x67\xa3\x9f\x39\xae\x9c\x59\x25\xc0\x6f\x93\x34\xc5\xe8\x85\x84\x56\x7c\xc8\xac\x7d\x22\x6e\x1c\xdf\xa0\x5f\x86\xc8\xd3\x1f\x32\xeb\x30\x3a\x44\x5d\x39\xe7\x87\x32\xe5\x2c\x99\xe1\x53\x2e\xf4\xc5\xd3\x01\x5d\x8e\xa9\x4a\x92\x2c\xa5\x17\x8a\xc6\x73\xd7\x5e\x3d\x15\x84\xeb\x44\x85\xf8\xa7\x56\x39\x3d\x03\x16\xc7\xd8\xb1\x43\x4b\x26\x92\xff\x8c\x26\x5d\xc0\x45\x5d\x84\x3e\xfb\x83\x64\x40\x83\xeb\xad\x79\xb0\x13\xdd\xe4\x92\xd6\x87\xd0\x4e\x33\x44\x3e\x1c\x5a\xd1\x58\x3f\xfb\x11\xb4\xf7\x35\x3f\x3d\xb4\x9f\xb7\x19\x61\xd3\x46\x4f\x32\xf5\x81\x7d\xbd\x32\x0c\xcd\xee\x47\x35\xb5\x97\xd0\x9c\xed\x44\x37\x47\xe3\x0f\x18\x5f\x0e\x4d\xb5\xaf\x15\x33\xe2\xb3\xef\xa8\xbb\x13\x31\xac\x41\xb3\x43\xf9\xbc\xb4\xaf\x32\x57\xc6\x96\x20\xa2\xea\xca\xa0\x41\x2a\x4a\xc6\x50\xc5\x36\x2e\x15\x97\x44\x06\x48\x43\x08\x35\xe6\x5a\x6f\x7b\xaf\x68\xa8\x5c\x7b\xf2\xed\x96\x4a\x0b\x62\xc2\xef\xad\x2f\x4a\x0d\x4d\x80\x64\x3e\x8c\x77\x88\x06\x97\x07\x2f\x0c\xa1\x7c\xae\x07\xc4\x62\x3d\xf2\xdb\x46\xb7\x47\x36\x36\x80\x1d\xb9\x09\x0f\x48\x19\x8d\x53\x04\x24\x69\x6c\x32\x72\x2b\x35\xc5\xad\x38\x62\x51\x6b\xeb\x78\x3f\x6c\xa5\x56\x82\x15\x99\x4d\xc0\xf1\x01\x3d\xf9\x6f\xff\xef\x78\x1d\xf4\xff\x0e\x7c\xf1\xc3\xdf\x10\x7f\x40\x1f\xf4\x7f\x78\x62\xe0\xfb\x68\x14\xb9\x79\x44\x73\xbc\x4f\x98\x8a\x7c\x27\x1f\x2c\xa8\x04\x55\xaa\x45\xfc\x49\x08\xc3\x13\x4c\x5b\xa9\x08\xc8\x93\xb6\xae\xa7\x98\xb4\x78\x2b\x09\x99\xb4\xb8\x11\x57\x5a\xb5\x02\xa6\x1f\xee\x3a\x6e\xf9\xfb\xbf\xe6\x60\xa0\xc4\x19\xc2\xce\x03\x81\x13\xcc\x8e\xd3\x05\x8d\xd2\x6d\xae\x2b\x67\xd4\x71\x97\x87\xcf\x65\x7e\x9d\xb0\xd1\xd4\x7f\xc7\xd5\x9b\xf2\xac\x4e\x8a\x39\xdd\x82\xdb\x51\x94\xe3\x96\x94\xb2\xa1\xec\xc1\xfb\xca\x05\x6d\x4f\x65\x1c\x11\xac\xd3\xb9\x80\xd3\xc9\x67\xd7\x65\x71\x76\x6d\x4a\xef\xe1\x6b\x9d\x3c\xc6\xd7\x65\x32\x17\xba\x3a\x7d\xc6\x05\x70\x4f\x85\xf8\x2a\x9b\x16\x12\xb8\xd0\x3e\xb9\x1f\xbe\x55\x69\xa3\x41\x9e\xbd\xfa\x76\x67\x9c\x99\xa4\x3f\x24\xea\x18\xc2\x64\x94\xc5\xf8\xdd\xc9\xfe\x76\x36\x93\x62\xc1\xd7\x21\x8c\x20\x45\x6f\x7d\x1c\xe4\xf3\x34\x61\xbe\xd7\xf3\xac\x88\x30\x54\x45\x84\x21\x88\x56\x22\xc2\xa8\xc8\xbd\xea\xed\x2d\xf1\xba\xa9\x8e\xd3\x8c\x3c\x00\x53\x34\xf1\x37\xba\x08\x45\xfd\x41\x02\x3d\x6f\x18\x0e\x92\xf2\x6c\x49\x04\xa0\xfe\x88\xd6\xbb\x60\x08\x37\x01\xcc\x50\x3a\xe8\x0c\x61\x8e\xd2\x41\x57\xb0\x85\x2c\x60\x34\x99\xf9\x40\x84\x5c\x55\x38\x8a\x71\x63\x04\x79\x19\x78\x66\x04\x6e\x69\x80\xfd\x91\x09\x3c\x43\x45\xe0\x19\x6b\xf3\x40\xac\x85\x37\x8f\xf0\x52\x8a\xf7\x6c\x6e\xeb\xee\x49\x1d\x34\x6b\x27\x19\x8f\xc5\x2d\x4e\x95\x7e\x89\x6f\xde\x73\x6c\xe8\x74\xed\x3d\x24\x93\xdd\x14\x51\xa8\x37\x6b\x48\x8c\x29\xa6\x28\x71\xb6\x66\xdd\x1a\xad\xb5\x67\xe7\xa8\x70\x8d\xdb\x69\x94\xe7\xd8\x72\x82\xd2\xe8\x5a\xa4\x89\xb2\x0e\x8f\xe1\x25\xcf\xf4\xdc\x87\x06\xd5\x36\x92\x6a\xd3\x77\x75\x04\xdc\xdd\x37\xc3\x64\xf5\x35\x2d\x3d\xf9\x3b\x5f\x7f\x02\xc2\x12\x40\x11\x8a\xf3\x21\x5d\x38\x0a\xea\xc1\x59\x6e\xb8\xc9\xf6\x63\x07\x54\x36\xf2\x58\x80\xbe\x65\x9a\xca\xe9\xb8\x1f\x43\xb8\x56\xa5\xdd\x96\xd2\x3c\xdf\x4f\x40\x1d\xf4\xbe\x13\x22\x27\x6d\x06\xe3\x84\xc4\xf5\xfa\x3a\x28\xad\x3a\xef\x58\x1f\x80\x93\x98\xef\x6e\xc8\x9e\x92\x9d\x6c\x7b\x8a\x9d\x9e\x1a\xfd\x46\x49\x0d\xc8\xea\x0e\x60\x35\x2f\x88\x93\xf1\xb8\xde\x6d\x0f\xab\xf7\x42\xe4\xec\xed\xab\x1a\xd2\x7c\xcf\x7d\x6c\x5e\x63\x71\x0d\xc5\x76\x9e\xd4\xf3\xdc\xdd\xb1\x4a\x77\x6f\x54\x0d\xdd\x1d\xb3\x4e\x2c\x3b\x4b\xdc\xe3\xbf\x29\x9f\xbf\xdb\x8a\xb9\xa5\xcc\xf0\xcc\x75\x33\x8a\x05\xe7\x2c\x9b\x4c\x52\x49\xce\xbe\x78\x93\x0a\xe2\x60\x24\x3d\xe4\xa2\x3b\x79\x05\x5b\x35\x26\xfb\xfe\xc7\x9a\x3b\x11\x4b\xa9\xd9\x1c\x16\x6f\xb6\x24\xd9\x22\x17\x75\xda\x6d\x67\xc3\x6b\xdd\x4a\x7c\x0b\xd7\xac\x7d\x1f\x92\xac\x58\x7d\x26\x9a\x67\x90\x30\x3c\x73\x9c\x18\x93\x4c\xa3\x35\x8a\x88\x8c\xb5\x2b\xe1\x6d\x6d\x9f\x9e\xca\x08\x95\x38\xd7\x71\x9f\x71\xdc\x8a\xf2\x96\x6c\x38\x87\xad\x49\xc6\x5a\xe5\x91\x1c\xb1\x3a\xb7\xa2\x37\xc0\x57\x1d\x71\x99\x59\x1f\x3c\xcf\x10\x6f\xfc\x3c\x00\x95\xab\x66\x46\xb6\xe1\xc0\xa0\x62\x50\xf7\x61\xae\xdd\x76\x84\xc0\xac\x44\xef\x3c\xc5\xac\x8f\xef\xba\x96\x57\x87\x49\x0e\x49\x3f\x1c\x7f\x89\x6f\xf8\xa2\xbb\xcb\x5d\x56\x6b\x80\xc0\xb5\x35\xa1\x75\x57\x7c\x83\x15\x76\xfd\xbf\x32\xaa\xee\x43\x46\x75\x5f\x03\xd6\x88\xac\x5c\xb7\x3e\x6b\x05\xaf\xf0\x31\xc2\x4a\xe5\x01\xed\x76\x45\x3a\x4c\xdc\x50\xb0\x3e\x31\xea\x44\x10\xc5\xb1\x42\xae\x54\x38\x02\xf9\x58\xc6\xae\x3c\xcc\x08\x31\x08\xed\xd2\x16\xae\x57\x56\xf8\x3e\xc7\xe3\xc7\xa7\x3f\xf9\x34\xf8\xeb\xaf\x67\x00\xea\x8f\xe8\x8f\x89\xf9\x38\x7d\xf9\xd9\x7c\xfc\x91\x7f\xb2\x55\xdd\x38\xa1\x88\x06\xe9\xab\x4d\x5f\x86\xc8\xc2\x30\xc7\x29\x16\x21\xb2\xc3\xc1\xc0\xf3\xa0\x91\xfc\x9e\x37\x1c\xc2\x84\xcc\x17\x2c\x0f\x6f\x85\x7a\x13\x0e\xbc\x91\xca\x93\xea\xce\x10\xaa\xd2\x46\x61\x28\xf4\x96\xf5\x9f\x8f\xd4\xfd\x7e\x48\x66\xf3\x34\x19\x25\x4c\x2b\x7d\x64\xb2\x97\xd1\xa3\xb1\xd6\xf5\x84\x0e\xac\x75\xbd\x51\xb6\x20\x0c\x25\x0e\x3d\x6c\xcc\x2d\xfa\x55\x57\x29\x3a\xfa\x8d\x1d\xd1\x58\x49\x4d\x69\xb4\xba\x8a\xd5\xb7\xaa\x2b\xfa\xde\x30\x97\xaf\xf1\x15\x26\xf7\xd7\xfe\x3f\x9b\x08\x99\xdb\xc6\x59\x1c\xaf\xa8\xb2\x26\xaa\xf0\x36\xcd\x0d\x5d\x8c\x1f\xa5\x58\x37\xd5\xea\xab\x04\x5f\x6f\x67\x84\x45\x09\xe1\x5a\x88\x4a\x65\x78\x36\x4f\xc5\x0b\x82\xfa\xfa\xb9\xd2\xae\x69\xa9\x5d\xab\x19\x30\x7a\x97\x4a\xda\x49\x28\xbb\x31\xb7\xf3\x63\xa3\x9f\x39\xa6\x44\xd5\x59\xa5\x4b\xea\x5e\xb0\xbb\x0b\x4b\xff\xd9\xcb\xe8\x19\x8d\x46\x97\x2f\x6f\xee\xc4\xf7\x39\x93\x85\xf6\xc8\x8a\x4b\x3c\xa6\x80\x75\x7b\x47\x36\xaf\x50\xd2\x84\x15\xeb\x07\x99\x0c\xda\xf0\x23\x75\x33\x7b\x60\xb5\xc1\xab\xc1\x76\xed\xd7\x10\x75\x9e\x08\xb8\x6c\xe3\xb9\xdd\xc6\x80\xdb\x90\x15\xdc\x57\x66\x50\xaa\x94\xb8\xd4\x22\xcd\x7a\x52\xf8\x03\xca\xb2\x23\x8e\xa3\xfd\x76\xc0\xcd\xa8\x25\x5b\x6c\xe5\x8b\xf9\x3c\xa3\x2c\x21\x13\x1d\x39\xff\xc7\x52\x5e\x63\xe8\xfd\xd8\xca\xc6\x2d\xce\x50\x5a\x3f\x7a\xe5\x81\x5a\xd7\xc6\xb8\x88\xb7\xbb\x5c\x6a\x45\xa2\xf0\x31\x80\xde\x8f\x41\xeb\x90\x03\x27\x95\x06\xd5\x55\xde\xba\x48\x48\xcc\x3b\x64\x59\x4b\xab\x34\x79\x2b\x5f\x8c\xa6\x5c\x75\x10\xa2\x29\x0f\x3c\x2e\x14\x4a\x0c\xc7\x0e\x35\x34\x6e\xa8\x9f\x0a\xaf\x75\xed\x73\xb5\xd6\xf9\x20\x45\x4a\xbe\x54\x5a\x8a\xc5\xa3\x39\xa6\xe2\xfc\x85\x7d\x30\x41\xf0\xbd\xf2\x95\x26\xa3\xe1\xed\x73\x0e\x51\x3e\xf6\x58\x5b\xaf\x6a\x12\x77\x67\x17\x98\x6b\x68\xef\x13\x2e\x0a\x0c\x19\x42\x3e\x75\x7f\xca\x47\x7a\x58\x39\x38\xb8\xd1\x85\x1b\x5d\x7d\xba\x1f\x25\x7d\xe9\x93\x0b\x13\x00\xe5\xb3\xb2\xe2\x48\x58\x04\x7a\xea\x2d\xd5\xd4\x68\xf6\xb2\x4a\x02\x1a\x70\x48\xc9\xa6\x9f\x98\xa2\xba\x49\x0a\x7a\x76\xd5\x35\xf1\xf8\xbf\x7c\x52\xb2\xd1\xc4\x04\x33\x9f\x0a\x6d\xae\x9a\x2e\x1a\xce\x60\x02\xd4\x03\xf7\x25\x84\x59\x09\x21\x37\x4e\x4d\xf8\x63\x8a\x3a\x3d\xfa\x6b\xf9\xb2\x2b\x5d\x5f\x57\xe7\x3e\xe7\x98\x72\x0c\xa9\xf3\x95\x64\x40\x87\x01\xef\x0a\x8a\x5f\x14\x8f\x32\x1a\x9b\x56\x64\x68\x28\x07\x8f\xd4\xed\x26\xbf\x46\xbd\x44\xc7\xf7\x4f\x9d\x25\xf9\x90\x12\xd0\x4b\x39\xd5\x33\xfc\x45\x5d\x00\x42\x09\x34\x29\x52\x5a\x45\x56\x8a\xe6\x79\x15\x82\x2c\x4a\xe2\xd9\x8f\x31\x61\x09\x53\x84\x57\xdf\x1d\x6e\xf6\x5f\x9a\x17\x92\x90\xca\x6e\x8c\x4c\x95\xca\xae\xad\xe8\x56\x10\xe5\xd6\xa1\xb0\xa3\x21\x26\x1b\x2a\x86\x86\xbb\x6b\xa6\xb9\x2d\x0b\xbf\x5a\xb8\x4e\x23\x58\xee\xf4\xb5\xce\xf7\x6b\x3f\xf9\xf9\x85\xd1\x71\x4e\x26\x23\xf3\xc1\xf5\xa2\x47\x2a\x3c\x7b\x19\xe5\xea\x0e\x34\x92\xaa\xa2\xfb\xa8\x54\x4b\x90\xd9\xac\xb4\x2e\x98\x2a\x72\xa4\x2e\x56\x4a\xed\x88\xe1\xaa\xdf\x58\x6c\x87\xd4\xc4\xb6\xa4\x56\x2d\xae\xf9\xac\x23\x52\x00\x48\x1e\xa3\x0d\x3c\x54\x17\x50\x13\x2d\xcf\x05\x6a\x49\xcc\xa6\x98\x68\xd0\x4f\x70\x45\x0f\xe0\x2b\x7e\x45\x16\xaf\xc5\x29\xcb\x51\xc3\x91\xdc\xe8\xc3\xa9\x40\xec\xaf\xd4\x1e\x1c\x14\x5a\x49\xe7\x75\x4b\xd5\x62\x31\x8f\x23\x26\xa0\xf0\x6d\xd9\xbd\x3f\x3e\x9b\x72\x1d\xae\xf1\x56\x33\xf6\xad\xdc\x12\x83\x75\x90\xf1\xdd\x03\x5f\xd9\xe9\x6e\x9a\x3b\x14\x0d\xdd\xa9\xcc\x2d\x3b\xad\x23\x1c\xdf\x8d\x56\x67\xa7\x56\xea\xca\xd3\x3e\x0d\x7c\xf6\x1b\x83\x2b\x8f\xb6\xd4\xc4\x54\x8a\x23\xea\x83\x47\x4d\xb7\x51\xaa\x2c\xdc\x39\x1b\x77\xc8\x40\x57\x83\x55\x72\x06\x40\x3b\xe2\x2c\x70\x1e\x04\xfe\x1d\x44\xec\x02\xdf\x1e\xed\xa3\xc0\xaf\x35\xd8\x00\xff\xdf\x8f\xd1\x3e\x92\xb7\xee\x37\xb9\xe9\xfe\x58\x2f\x69\xbd\xb8\xec\x45\xa8\x69\xdf\x5a\x23\x25\xd7\xa4\x78\xe5\x6e\x5b\xdd\x88\x34\x93\x26\x38\x80\x30\x4d\xac\xad\x9b\x04\xdb\x0f\x51\xad\x31\xc7\x0c\x35\xfd\x5b\xb6\xc6\x2b\xdf\xf0\xb8\xc0\xad\xa8\x65\xcf\x5f\xeb\x62\xc1\x5a\x14\x8f\xb0\x78\x81\xca\x52\x86\x8d\x53\x8b\x09\x8d\x97\x2b\xae\x42\xdf\xfb\x76\xe6\x2d\x88\xad\x66\xcb\x09\x7a\xd5\x54\x24\x86\x24\x02\x85\x35\x79\xaa\xcc\x5c\xcd\x06\x74\xdd\xce\x8a\x9e\xef\x58\x91\x06\x94\x87\xc7\x8e\x33\xb0\xae\xec\x4f\xae\x4f\x63\x76\x93\x71\x46\xef\x38\x0c\x8a\xf9\xb4\xda\x6d\x4b\x46\x56\x3a\xe8\xd7\x4a\x57\xb7\xca\x57\x9f\x26\x68\x5c\x69\x7f\xa7\x0f\x96\xb8\xcd\x19\x53\x7b\x98\xef\x72\x7b\x70\xa3\x28\xc7\xdb\x42\x29\xd4\xe8\x4d\xa3\x9c\x6d\xf3\x54\x6e\x44\x0a\x2d\xae\x91\x95\xbf\xe5\x26\xdb\xaa\xf9\x24\x93\x53\xb1\x83\xbb\xda\xca\x96\xf9\x08\xc3\xd2\x0b\x62\xe0\xd0\xa8\x90\x02\x62\x47\xc2\x2c\x3a\xf5\xd7\x3a\xb6\x77\x34\x8e\x79\xea\x7d\x67\xd0\xcb\x76\xd7\xd7\x2b\x75\x55\xc3\xab\xef\x5b\x29\x6c\x71\x6a\xca\xad\x70\x80\x26\x11\x0d\x86\x35\xcc\x8a\xe4\x66\x08\x4e\x71\x3b\xdf\x09\xab\xb9\xc2\x8f\x50\x15\x37\x95\xf3\xea\x4d\xbc\xbb\x93\x97\x4b\xb6\x72\x0e\xd7\xd7\x57\x4f\xaf\x63\x0e\xfc\xd5\x93\xe0\xee\x1b\x7c\x13\xf5\x00\xc8\xea\x2a\x81\xdd\x99\x0b\x61\xc6\xc2\xb6\x90\xde\x6e\xe3\x35\x3d\x0a\x8b\xcc\x6b\x73\x29\x28\x1f\xf7\xcc\x0b\xe0\x9d\x1e\xfb\xd5\x31\x83\xca\xe2\x62\xa5\x25\x67\xe7\x0e\xd8\x30\xb0\x17\xbc\x98\xea\xef\x8f\x38\xf0\x10\x01\xa6\x97\x55\x4d\x88\xc9\x64\x6b\xdd\x95\x42\x2a\xfb\x4e\x6f\x5d\xb9\x52\x29\xa4\x81\x5e\x71\xbe\x2d\x01\x84\x96\x1e\x49\x11\xe1\x64\x05\xab\x9d\x51\xa6\x91\x2a\x3e\x2b\x3d\x07\x66\xf5\x54\x33\x78\x0a\xf8\x07\x7c\xd7\xab\xac\xb7\x14\xc3\x5f\x1e\xab\x60\x18\xc8\x56\xcc\x11\xcf\x0a\xab\x05\xcb\xb9\xca\xbf\xd7\xb3\x2a\x0e\x20\xb0\x9a\xff\x94\xd4\x0f\x24\x18\x87\xea\x29\xbb\x49\xb1\xad\x51\xde\xe7\x3a\x15\x15\xee\x60\xea\xa2\x3d\x0c\xeb\x0e\xc2\x92\x99\x3c\xc4\x3d\xf8\xd8\x4d\xe6\xd8\xb1\xb9\xec\x72\xb3\x09\xe0\xea\x7b\xca\xd6\x5e\xb2\xe1\x42\x39\x66\x6a\xa0\xab\xf7\x72\x26\xe6\x18\x4d\xe0\x01\xb8\x09\x20\x45\x64\xd0\x19\x8a\x63\x75\xdd\x61\x4f\x3a\x9f\x7c\xa9\xfa\xad\x21\xd6\x6e\x27\xce\x7b\xfe\x09\x08\x99\xde\xe8\x2f\x77\x6d\x34\x00\xbe\x99\xd6\xda\xae\x0d\x85\x4c\x1b\x13\xb5\xbd\x9e\xfb\x2a\x36\x76\x17\x1f\xb7\x2f\x7b\xff\xae\x66\x09\xbc\xdc\x13\x16\x91\x4f\xed\x7d\xd1\xfb\xb6\xbf\x6b\xf5\xbf\x6b\xef\xfb\xbe\xb6\xbe\x9f\x79\x54\xb6\xb7\x2a\x1b\x5f\xdf\xb0\xd7\xa5\xa8\xae\xce\x38\x78\xaa\x59\x7d\x25\xbb\x18\x3d\x9c\x5d\x3c\x42\x77\xbf\x6a\xd8\x99\xc6\xd4\x3b\x5a\xb0\x14\xb3\x6d\xed\x9d\x59\x59\x62\x35\x03\x39\x22\x77\xd0\x5b\x32\xf6\x71\xa3\xad\xaa\xff\xbc\x0e\x76\xaf\x02\x74\xbb\xad\x23\xcf\xf9\xac\x3c\xa6\x56\x29\x01\x40\x6d\x98\x4e\xf8\xfb\x2e\x0b\xcc\x77\x16\xbd\x13\x45\x40\x3e\x5c\x24\x1c\xd2\x35\x40\x9b\x03\x55\x75\x14\x7b\x5a\x99\x5b\x1d\x8f\xf6\x89\xba\xc7\xa1\xc1\xf8\x67\x64\xe4\x23\x89\xb9\x0a\x4a\x83\xaa\x9d\x90\x86\x8d\x7a\x2a\x83\x5b\xe2\xd5\x8c\x66\x51\xaf\x80\x63\x1c\xb1\x05\xc5\x79\x38\xa0\xc1\xd9\xd9\xce\xb0\x71\x48\x72\x81\xab\x4f\xd1\x55\x4e\xdb\x1e\x27\x73\xac\xdf\x55\x0c\xad\x2d\x25\x06\xbd\x1f\x45\x5c\xa1\x79\x52\xdd\x53\xb2\xce\x86\x70\x33\x5a\x5b\xd1\xf1\xb7\xc5\xbc\x92\x24\x67\x5f\xcc\xba\xcb\x9d\xd2\xc2\x8d\x5b\x45\x4c\xdd\x2a\xaa\x8a\x66\xf9\xba\xa8\x1d\x39\x3d\xc9\xe7\x99\xdb\x14\xc1\xc1\x82\x98\x56\x1f\x18\x7a\xbf\x51\x49\x5b\xaa\x53\xcc\x75\x43\xff\x5f\x82\x0b\xf1\x32\x16\x83\xae\xa1\x3f\x68\xe4\x0f\x1b\xaa\x89\x0d\x0b\xe7\x62\x70\xad\x18\xc3\xf1\xf7\xf0\x61\x6a\xb1\x5e\x4e\xca\xb9\x94\x4d\xb6\x52\x96\xdb\x57\xf5\xac\xf4\xec\xe2\x53\xa5\x98\xbe\x10\x7f\x07\xf3\xbd\x2f\xfa\xbd\xdd\x95\xd6\x93\x14\xd2\x7c\x3b\x5e\x78\x44\x72\x11\x8b\x6f\xf5\xa5\xe3\x12\xc4\xbe\x31\xcb\xf8\x97\x5f\x6b\x54\xbf\xc8\xa4\x5a\xf4\x71\xe9\x24\xb5\xb0\x11\xfa\xa5\xd6\x66\x08\x0d\x83\x26\xda\x2c\xe5\xe6\x8e\x8b\x7a\x8e\x6b\x95\x1c\x97\xb8\x8e\x48\xf5\x29\x38\x9b\xbe\xdd\xe9\xdb\xc1\x0b\x6a\x37\x28\xcb\x9a\x41\x93\x7c\x7d\x0c\xdd\xe7\xa5\xa4\xc9\x7b\x60\xc6\x20\xef\x87\xda\x23\xa9\x00\xe0\xba\x89\x9e\x8c\x25\x2b\xfa\xe3\xd5\x47\xe0\x9b\xf7\xe9\xa7\xb8\xa7\x73\xf6\x9e\x5d\xda\x39\x73\xac\x2e\x3f\x28\x7e\x68\x3a\x5b\xb5\x44\xcc\xa3\x47\x6a\x88\x7a\x06\x9b\xc8\x70\xcc\xcb\x63\xc8\xb9\xee\x0d\xb0\x50\xb3\x62\x63\x10\x59\x04\x56\x0a\x48\xbb\x77\x66\x16\x5b\x30\x8b\xe8\xe5\x5e\x46\x85\x59\xe1\xff\x23\xe6\xe3\xcb\x23\xd8\xfd\xa9\x72\x82\x3f\x99\x63\x44\x83\x8f\x9f\x52\xff\x56\xbc\x49\xe8\x45\xf9\x0d\x19\x79\x2a\xd4\x03\x9c\x2f\x68\xf9\x82\xb9\x0f\xe0\xd5\xf7\xf0\x0f\x75\xdb\x82\x39\x16\xfc\xea\x65\xca\xcd\x47\xb9\xf7\xbf\xd6\x5c\xba\x6b\xfa\x40\xc0\x72\xe9\x79\xf2\x69\x03\xbc\x86\x30\x28\x2c\xfa\x11\x57\xcc\x13\x94\xe8\x37\xb9\x24\x14\xf6\xc3\xfc\xf6\x14\x59\xd7\x62\xab\xc9\x90\xc2\x04\x46\x7a\x3f\xbb\x71\x8d\xf7\x27\xe7\x15\xe0\x9f\x2a\x91\x2c\x7e\x1a\xc2\x0c\x79\x1e\xcc\xd1\x5a\x57\x5e\xa9\xd9\x4b\x48\x22\x7c\x32\xb2\xdd\x6a\xec\x6e\xb1\xf0\x75\xc7\x30\x45\xe2\x09\x89\xe8\x82\x1b\x80\xeb\x9e\x07\x33\xd4\x11\xbe\x21\x9f\xa0\xd4\xdc\x73\x08\x3c\x00\x7e\xdb\xe8\xb6\xdb\x7e\x8a\xd2\xf2\x1a\xaa\x17\x70\x9d\x06\x88\x1b\x30\xa9\x8a\xfa\xe6\x3f\xc1\x4f\x12\x00\x7e\xeb\xf4\x7d\xf2\x6b\x47\x3c\xf0\x4c\x01\x24\xeb\x68\x3d\x55\x17\x21\xe8\x7a\x17\x40\xde\x8c\x89\xfb\xd0\x81\x14\x80\x50\x97\x4f\x75\x14\x08\x48\x51\xa7\xe7\x75\xf8\x14\xa4\xc1\x68\x1a\xd1\x2d\x71\x5a\x81\xae\xaf\x8b\xbb\x43\x14\x21\xe4\x47\xa6\x38\x60\x88\x9b\x9f\x04\x75\xc5\x01\x08\x71\xa7\x23\xda\xd8\xa8\xb7\x10\x81\x1e\xe0\xc9\x3c\x9b\x6c\x20\x0a\x19\x1a\x70\xa3\xb5\xd3\xa3\xbf\xa2\x88\xb7\x0e\x93\xf5\x75\xc0\x06\xc9\x10\xc9\xeb\x58\xbe\xd5\xbb\xb9\x65\xf1\xdb\xe6\xa6\x78\x0b\x9a\x09\x2b\x58\x5c\xf7\xd8\xec\x02\x98\x21\xb2\xd1\xe5\x40\x00\x78\x1b\x27\x93\x84\xe5\x5c\x2b\x51\xb7\x13\xc3\x0c\xaa\xfb\x4c\x07\x98\x84\xa4\x28\x7c\x0c\x7a\x69\xbb\xed\x57\xe7\x48\x86\x56\x45\x38\x90\x0d\x0c\x3a\xc3\x6a\x78\x55\x56\x66\xa9\xb1\x6f\xe0\xc0\xb4\x6b\x45\x5e\x55\xdd\xf6\xcd\xcf\x75\xb4\x19\x8a\xc6\x79\xa2\x6a\x43\x38\x6b\x3b\xb0\x23\x42\xad\x72\x43\xbd\x96\xc3\x0d\x4e\xd3\xfc\x3a\xda\x14\xcb\x76\x04\xe4\xe9\x90\x05\x62\xc1\x2c\x21\xfb\x84\xc1\x58\xfe\xdc\xa3\xd1\x08\x4e\xf9\xef\xe8\x0b\xff\xcd\x27\x4b\xd1\xf8\x1c\x45\x2a\x50\xeb\x07\x31\x87\xea\xf0\xca\xfc\x8e\xcd\x9d\x08\x7a\xad\x24\x6f\x91\x8c\xc9\x08\x97\x49\xdc\x12\xd0\xb5\x12\x32\xce\x3c\x05\xc4\x18\xcd\x07\xdd\x21\xbc\x42\xf3\xc1\xd3\x21\x9c\xa0\xf9\xe0\xb9\xf6\x40\x8c\xdb\x6d\x7f\x81\x3e\xfa\x63\x15\x5c\x73\x0d\x5d\xb5\xdb\x7e\x8c\x3e\xfa\x57\x65\xca\xa4\x3f\x45\x1f\xfd\x89\xb4\x56\x44\x81\xf8\xb7\x69\xbb\xed\x4f\x51\x0c\x8a\xb5\xfa\x4a\x4e\xc6\x3e\xfb\x8d\x34\x41\x3e\x9b\xe2\xd6\x2c\x21\xc9\x6c\x31\x6b\xc9\x87\xf6\x5b\xd9\x58\x02\x9b\xb7\xa2\x31\xc3\xb4\x35\xa6\x91\x64\x65\xbe\xad\x5b\x03\x3e\xc0\x69\x32\x99\x62\xda\x62\xd3\x88\x88\x68\x9c\xb3\xe8\x8b\x68\xc9\x37\xda\x36\x81\x1e\x08\xf4\x90\x69\x49\x04\x30\x41\xd4\x45\x08\x30\x42\xe5\x03\x31\xe5\x5b\x62\x0c\x26\x00\x12\xbe\x02\xa3\xf5\x4a\xe1\x0c\xd1\x81\xbc\xa7\x98\xfe\xd6\x01\xb7\x54\x93\xb5\x79\x85\xcc\x2e\x9d\x02\x73\x6c\x27\x47\x69\x2f\xff\xb5\x3c\xa4\x93\x8b\x37\xcf\xf3\x21\xea\x08\xbb\xef\x36\x41\x65\x13\x1d\xde\xb9\xdd\x0e\xea\x42\x5d\xcf\x94\xea\x0a\xe0\xba\x00\xd2\x41\x67\xa8\xf8\x91\x64\x64\xdd\xde\xe8\xd7\xb4\x37\x12\x1d\x8c\x78\x07\xc9\xd8\xcf\x7e\x43\xcf\x01\x87\x7a\xa3\xfb\x6b\xc7\x5c\x82\x5c\xa0\x4e\x6f\xf1\x5b\xda\x5b\x6c\x6c\x00\xca\xf5\xf3\x69\x32\x66\x0d\x5a\x5e\xef\x99\xbc\x6e\x3d\x4f\x9a\xad\x74\x90\x6e\x74\x87\xeb\xeb\x02\x8c\x5e\xf2\xab\x35\x98\x08\x88\xd3\x48\x54\xaf\x13\x31\x2f\x31\x12\xdc\x9a\x2f\x80\x2a\x82\xe7\x88\xaa\x87\x74\x4e\x92\xc9\x94\xf9\x75\x49\x50\x8a\x08\xf1\x60\xbc\xcf\xd6\x11\x06\xbf\x76\x3b\x7d\x16\xb2\x8d\x6e\x07\xc6\xed\xb6\x58\xb8\x3c\xb7\xdd\x26\xbf\xa1\x69\x9f\xca\x20\x7a\xa1\xda\x45\xf8\x0d\x75\x3b\xfd\x6e\xd8\x29\x60\x07\xf4\xe6\xed\xb6\x6f\xc6\x36\xaf\x8f\x0d\x14\xfe\x08\xc6\x70\x2a\x61\xbe\x41\x23\x4d\x4b\x33\x34\xb2\x81\xbe\x40\xa3\x92\x77\xc0\x6d\x34\x18\x0a\x34\xe4\xe8\x26\xc0\x57\x98\xde\x38\xbc\x4e\x6b\xb8\x00\xbd\xd9\xaf\x8b\xde\x6c\x7d\x1d\xdc\x58\x98\x97\x08\x9c\xfd\xda\x69\xe6\xcc\x7e\xeb\xf4\xb7\xd1\x8d\x26\xb9\x19\xbc\x29\x23\x01\xf9\xdb\xe8\x06\xde\x70\xce\x2e\x41\xdd\xd2\x30\xe8\x22\xbf\x21\x16\xa4\x93\xd3\xe4\x2b\x6e\xb7\xb7\xca\x46\xcb\xb6\x36\x74\xae\x69\x53\x44\x7f\xf0\xb9\xe4\xea\x95\x8d\xb0\x40\x14\xea\x01\x77\x13\xf7\xb7\x50\xed\xbc\xcc\x87\x19\xda\x92\x5f\x2f\x7d\x3e\xc7\x00\x6e\x9b\x58\x72\xd9\x3a\xe2\xa9\x09\x58\xdf\xb6\x6a\x5c\x98\x9c\xca\x0d\x79\xb0\xee\xad\x7b\xeb\x17\xea\x64\x60\xa6\x0a\xe8\x2b\xec\xa5\xfa\x96\x21\xcc\x05\xe9\x5a\xde\x67\x01\xc1\x93\x63\x8a\xd7\xb3\x75\xf1\xf3\x74\x31\x0e\x59\x30\xcf\x72\x9d\x36\xcf\xf2\xd3\xc5\xb8\xb0\x35\xf3\xef\x0e\xdb\xb3\xe1\x41\x82\x6e\xa5\x40\x08\xbb\x50\x89\x83\xb0\x03\x95\x30\x08\x3b\x50\x42\x10\x7a\x1e\x94\x00\x88\x58\x3f\x02\x52\xf5\x4b\xa5\x09\xa4\x87\x1d\x98\xaa\x1f\x05\xe4\x3c\xcf\x5c\xdd\xe4\x7c\x8f\x4b\xfc\x08\x51\xce\xfc\x53\xb4\xd1\x5d\x43\xf6\xf5\xcc\xc0\x03\xfd\xc4\x72\x52\x8b\xab\x99\x96\xd6\x91\x04\x69\x94\xcb\x43\x7a\xbc\x78\xc7\x03\x9c\xeb\xd8\x65\x9c\x25\x86\xd5\x3b\x9c\x5c\x4b\xec\x11\x85\x57\x94\xa9\xda\x7e\x07\x66\x06\x92\xff\xf0\x2c\x7e\x39\x42\x9d\xde\xe8\xd7\x72\x8b\x6d\xa4\x0f\x34\x2e\x50\xae\x15\x8d\x11\x50\x6a\xcb\xa2\x4f\xb4\x48\x45\x44\x0b\x54\x34\x5a\xef\x86\xde\x7f\x94\xf9\x56\x2a\x51\x93\xba\x8e\x16\xd2\x13\xc3\x01\x92\x08\x80\x9e\x14\xb9\x92\x98\x51\xcc\xe7\x8e\xff\xa7\xe0\x08\x3b\x90\xa8\xa5\x82\xe2\xc1\xe6\x70\xb9\x14\x25\x7c\xf3\x1b\x98\x92\x4a\x9c\x4f\xcb\xc8\x88\x1b\x1a\x01\x95\xef\xd3\xc5\x58\x7d\x43\x2e\xf9\x6d\x74\xf4\x88\xa2\x4e\x14\x19\x8c\xcd\x81\x89\x71\xf2\xe3\x93\x09\xd7\x2e\x21\x51\xa4\x6b\xca\xcd\xd7\xa7\xcd\x72\x72\x55\x94\x8d\xb2\x75\x0d\x90\x69\x40\x83\x54\x46\xd9\x2c\x9c\x51\xca\x1c\xb1\x05\xa4\x1e\x28\xa3\x0b\x88\xf8\x00\x85\xcf\x60\x19\x60\x05\xc0\x97\x3e\x83\x56\xa8\x0b\x00\x20\xff\x16\x77\xf7\x61\x19\x03\x80\x1b\xb5\xab\xee\x72\x99\xeb\x92\xed\xf6\x9a\xbc\x14\xaf\x74\x4f\x0c\x36\xc4\x9d\xf9\xbd\x34\x8b\x18\xd7\xe9\xb5\x2a\x58\xe6\xf3\x49\xf5\xa4\xbe\x61\xdd\x09\xbb\xe7\xb8\x4c\xa9\x51\xa9\x8a\xc0\x98\x7f\xdc\xcc\x81\x09\x87\x56\x1e\x4a\x8f\xb4\x23\x49\x98\xca\x51\x30\xc3\x79\x1e\x4d\xbe\x67\xc7\xd7\x58\x8e\xd9\xab\x7b\x2d\x47\x05\x60\xd5\x74\xec\x68\xd3\x71\xe2\x30\x1d\x57\x47\x00\xf8\xf6\xad\xe9\x59\x16\x23\x1a\x64\x5b\x2f\xb5\xbf\x57\x6c\xc3\xc8\xbc\x84\x7c\x42\x34\x18\xfd\x7e\xea\xdf\xaa\x30\x40\x34\x0f\x07\xfa\x77\xf8\x03\x5c\xe4\xf2\x02\x52\xf8\x7b\xa1\x1d\xb2\xf0\x06\x23\xef\x82\x66\xd7\x39\xa6\x9e\xf1\xce\xce\xb0\x7d\x3a\x1f\x21\x74\x23\x1f\x15\xb8\xf8\xae\x61\xd6\xc3\x17\xad\x0c\x5a\x54\x5e\xb3\x6f\x9e\x24\xe1\x84\xb4\x8d\x2b\x6f\x45\x40\xf9\xd6\x04\x28\xf7\x63\xb6\x1f\x73\x78\x4a\x47\x9b\xd7\xbe\x09\xd9\x98\xde\xac\xcd\xc6\xe3\x1c\x33\xd4\x80\x63\xd0\x81\x9d\x61\xe1\xb0\xf5\x73\xcc\x8e\x44\x9d\x95\xa7\x59\x54\x93\xf5\xcb\x74\xfd\xe6\x58\x71\x61\x85\xd5\x9d\x60\x76\x3a\xa2\x59\x9a\x3e\xf0\xfd\x69\x7d\x5f\x42\x56\xe2\x42\x04\xf4\x07\xd6\x08\x83\x79\x34\xc1\x7f\x4a\x58\x61\x3d\xfd\xa3\x4c\x1f\x86\x6a\x9c\x3a\xe6\x96\x68\xeb\x2c\xbb\xf7\x69\x6d\x47\xe7\xca\x6f\xa8\x3a\xd1\x2d\xf9\x98\x0b\x30\xcc\xb9\x7a\xa3\x97\x2d\x32\x9a\x66\xf4\xae\x73\x27\x8e\x6e\xb4\xde\xe0\xda\x2a\x16\xcf\x3c\xaa\xfd\xd7\x97\x37\xfb\xb1\xcf\xc0\x72\x69\x27\xe6\x2f\x6f\x0e\xa3\x19\xf6\x19\x18\x74\x84\x09\x42\x4a\x3f\x8b\xe0\x6e\xba\x51\x8b\x4f\x2a\x0f\xe3\x19\xc5\xf8\x43\x94\x5e\x8a\x5d\xf6\xe0\x22\x8b\x6f\xda\x6d\x5f\xfe\xd0\x3e\xc8\x69\x14\x67\xd7\x27\x59\xc6\x57\xb4\xcc\x88\x18\x8b\x46\x53\x99\x01\x80\xb9\xc3\xd0\x6c\x54\x35\x05\x0f\xb3\x18\xef\x25\x29\xc3\x34\x38\x7d\x7d\xf4\xe1\x7c\xf7\x60\xf7\xed\xee\xe1\x99\x50\x41\xf4\x96\x2a\x2f\xd3\x4b\x7a\xfa\xde\x48\x12\xe4\x65\xcf\x96\x05\x9c\xa2\xc8\x85\x8d\x28\xf8\xbc\xc0\xf4\xe6\x54\x6d\x22\xf9\x3f\x0e\xc4\x6b\x46\xde\x8f\xc6\x4c\xfc\xd1\x1b\xfe\x08\x04\xb7\x2f\xc3\xce\xa4\x05\xef\x9f\xe0\x2f\xa2\xf3\x5a\x08\x08\xbf\xb2\xcc\x20\x16\x17\x6c\xd4\xfc\xa9\x99\x56\x50\xf8\x3a\x00\x62\xc4\x18\x9e\xcd\xd9\x5e\x36\x5a\xe4\x32\x0c\xa8\xf5\xa4\xe9\x6b\x19\xd4\x4f\xce\xf9\x09\xe6\x1f\xd1\x2a\x62\xac\x11\x4a\xa3\x8e\xa1\x17\x9b\x38\x55\xd8\x40\x71\x11\x48\xc1\x68\xd5\xe1\xc0\x37\x53\x91\x7d\x70\xa1\x36\xae\x3b\xce\x9a\x89\xa8\xb8\xd9\x42\xdc\x68\xda\x4e\x13\x4c\xd8\x09\x1e\x31\x5f\x3c\x5a\x10\xa4\x78\xcc\xd6\x57\x2d\x59\x8a\x58\xc0\xb2\x79\x23\x5f\x2d\x5d\xa8\x02\x44\x4b\x6e\xa3\x03\xee\xd6\x57\x1f\xd9\x48\xf8\xfa\xa3\x1b\x49\x65\x05\xda\xf8\xbf\x2b\x9e\x69\x30\x16\x33\x54\xe3\xa4\x41\x34\xb2\x0e\x3a\x20\x64\xbf\x85\xb5\x62\x1e\x5c\x5e\x6e\x7a\x73\x5b\x5e\x71\x73\x2d\x74\x65\xe6\xe9\xcb\x71\x5b\xca\x03\x5e\x9d\x43\xb0\x5c\x6e\x61\x5f\xdd\x30\x9e\x60\x76\x4c\x33\x96\xf1\xb5\xab\xf7\xa3\x6b\xc5\xb5\xcc\x5a\xf3\xd7\xf0\x72\xb9\x86\x83\x6b\x9a\xb0\xe8\x22\xe5\xfa\x90\x78\xc9\x56\x6b\x23\xc6\xce\xec\x16\xf5\xe1\x19\x30\x57\x8c\x4b\xd5\x5c\xb3\x20\x68\xb7\x2b\x9f\xe5\x14\xb5\xdb\x9e\x35\xeb\x5e\xa2\xb8\xbb\x2c\xe5\x84\x65\x58\xdf\x6a\xdd\xb2\x85\xb9\x41\xc5\xd1\x35\x39\xa6\xd9\x1c\x53\x76\xb3\x83\xe5\x46\x40\x46\xb9\x52\xd6\xa0\x6d\x15\x67\xe9\xf4\x2e\x59\x5f\xc0\x5f\xba\x2f\x9e\x75\x1b\x51\x18\x5d\x2f\xc5\xe2\x43\x87\xd0\x3a\x5c\xf1\x20\xe8\xef\x05\xfc\xe0\x7a\x41\x74\x5a\xc0\x03\xd7\xcb\xa5\xa7\xf6\xb3\x99\xe2\xf5\x5a\x11\x61\x4b\xbf\xa0\x19\x21\xe2\x6f\x3e\xff\xa5\xfb\xb3\xb8\xf1\xe6\xff\xf4\xf3\xf3\x9f\x9f\x09\x6f\xa9\xff\xcb\xb3\x9f\xba\x9b\x00\xe6\x88\xf8\xcf\x9e\x3f\x7b\xfa\x5c\x3c\x8b\xe9\xbf\x78\xd1\xe9\x6c\x02\xb8\xb8\x2b\x9e\x53\x7c\x57\xe6\x74\xf5\x16\x82\x75\x19\xbd\x7e\xd8\x4f\x07\x8c\x8c\xb9\x3c\x92\x17\xdf\xde\x46\x73\x99\x99\x46\x5f\x6f\xde\x89\x1d\x19\xb5\x6b\xd3\x2f\x93\xf7\x49\xc2\x9a\xb1\x4f\x98\xad\x5b\x90\x60\x8a\xa3\x58\x9c\x47\xd3\x8d\x6a\xcb\xec\x6f\xe2\xb9\x2f\xbe\x6b\x66\x55\x1a\x4e\xa1\xb4\xe1\xd8\x6f\x1d\x15\x8e\x0a\x99\x87\xac\x98\x94\x46\x2c\x3b\xc8\xae\x31\x55\xa7\x14\xa3\xb2\x00\x5b\xef\x02\x75\xed\xbe\xc7\x6d\xc6\x9b\x0b\x7c\x8a\xd9\x61\x65\xc0\x3e\x15\xde\x41\x0d\x69\x30\x8d\x72\x3f\x01\x7d\x93\x20\x6f\xd7\x49\x7f\x57\x04\x42\x93\xc1\x79\x5d\x02\x07\x11\x67\x66\xa0\x08\xef\x1c\xb7\x1d\x77\x80\xad\x1e\x38\x45\x6c\x80\x87\x30\x11\x2f\x5e\x5b\x63\xea\x35\xf0\x2c\xdf\x58\x1a\xd0\x21\x28\xbd\x89\xbf\x89\xbd\x84\x1a\x78\x94\x8f\x6d\xc5\xc8\x31\x4c\x00\x5f\x4e\x72\xef\xb5\x06\xb2\xeb\x7d\xae\xe8\x2e\x0e\x2d\x1a\xb1\x5f\xc1\xb7\x31\x5a\x1b\x4f\x25\xa6\xf8\x4a\xcd\x4e\x36\xd6\xb3\x84\xa6\x3d\x27\xf5\x26\xcb\xa3\xd3\x5c\x92\x96\xef\x39\xb0\x41\x47\x06\x47\x2e\x7b\xe4\x73\x70\x8f\x3e\xab\x46\x21\xd5\xe6\x31\xcd\xd4\xd3\x11\xb5\x95\x22\xa3\x63\xe5\xb5\xd1\x6c\xa5\x77\x85\xe5\x5e\x89\x24\xd7\x88\x96\xcb\x0a\xe0\xd1\x7c\x8e\xc9\x9d\xb7\x6d\x64\xf3\xa3\x34\x23\x58\x99\x92\x58\x95\x66\x30\x9b\x87\x5e\xe4\xd9\x41\x6d\x5d\x98\x7f\x78\x5b\xb9\x57\x79\x97\x3f\xc5\xee\x57\x27\x1e\xda\x5c\x6c\x37\xe7\xa6\x57\x77\xf3\xce\x99\xe1\x24\xc7\x55\x4c\x67\x26\x5f\x18\xcc\x7e\x4c\x6a\xc5\x7b\xb5\xf5\xf3\x02\x9a\xe9\x69\x8d\x52\x7f\xdb\x71\x49\xd4\x1b\xe9\xa3\x6c\x7e\xb3\x57\xd2\x8d\x2e\xa8\x9f\xa0\x54\x9f\x9a\x04\x4a\x66\x6a\xf6\xc5\x0d\xdb\xb5\x3b\x93\x29\x77\x07\x2d\x11\xc7\x3b\x65\x41\x1f\x97\xcf\xfa\xd7\xd8\xb8\x45\xb1\x1a\xd2\x7b\x8f\x82\x36\xd7\x04\x2e\x89\x57\xb0\x35\xe0\x0e\x12\xc3\x2a\x0c\x89\x40\x5c\x21\x79\xe1\x37\x72\xce\x10\xb1\x63\x19\xab\x74\x55\xc3\xa2\x94\x91\x0c\x67\xdb\x3c\x1d\x21\xe5\x1d\xe7\x65\xb8\xf4\x7d\x19\x4c\xd7\xe6\xf3\xbe\xe9\xd4\x59\x62\xfe\x20\xb1\xd1\x59\x9f\x9d\xe5\x72\x30\x2c\x37\xaf\x06\x4c\xc4\x09\xb4\x16\xb0\x9e\x9b\xbb\xd4\x74\xbe\x3a\x6a\xec\x5f\x85\x46\xc4\x41\x36\x97\xa1\x10\xbd\xc8\x0b\xc5\xdf\xdc\x0b\xb5\xc1\x29\x5a\xec\xb9\x3c\x6c\x44\x6c\x32\x0f\xc8\x10\x88\x9b\x37\xa4\xfa\x80\xa5\xa4\xee\x55\x32\x42\x80\x03\x99\xd6\x73\x7c\x2f\x12\xe7\x03\x82\x6c\xde\x6f\x30\x30\x06\x54\xd8\x6d\xc0\xd1\xd0\x93\x9b\x44\x92\x24\x7d\x0a\xaf\xe4\x6c\xdb\x95\xe4\x52\xa4\xa0\x77\x41\x71\x74\x29\xc2\x30\x7a\xb1\x1c\x51\x62\x8f\x28\x29\x23\x13\x34\xbb\x14\xc1\x29\x22\x3d\x96\x8e\xdc\x21\x8f\x82\xb1\x30\x5d\x1d\x8b\x64\xa3\x8b\x6c\x8f\xb9\x88\x61\xae\x10\xa2\x0e\x2a\xe9\xf6\x25\x57\x2b\x2d\xc5\x3a\x35\x96\xd9\x20\x74\x0c\x2a\x02\xd6\x11\xd0\xc7\xb6\x58\xd8\xa1\xf5\xf9\x92\x7a\xc8\x79\xa6\x07\x4a\xad\xbb\x16\xab\x36\xb6\xfc\xe6\x9a\x94\x6b\x0f\xb2\xfa\xf2\xb5\xce\x53\x57\x5f\x21\x7f\xf0\xb1\x3f\x19\xba\xf2\x0d\x76\x1e\xbe\x53\xc5\xb7\xed\x9b\x55\xb2\xc2\x8a\xc3\x41\xee\x2a\x32\xb8\xe4\xdd\x7d\x38\x02\x50\x36\x5a\xb8\xaf\xd3\x15\x6d\x68\x04\x8d\xd1\x93\xff\xe3\xff\x1d\x0f\xa2\x8d\x71\x67\xe3\x97\x21\x78\x32\x49\xe0\x0c\xdd\x3e\xeb\x84\xde\x7f\x79\xd0\x7b\xba\xe5\x85\x5e\xe8\xc1\xcd\x67\xa1\xf7\x83\x07\xbd\xcd\x6d\xfe\xc5\x33\x5e\x7a\xa1\xd7\xe3\x29\xfc\xc7\x3a\x4f\xd9\xf1\x42\x0f\xf1\x1f\x7b\x5e\xe8\xf5\x79\x16\xff\xf1\xc4\x2b\x8c\x31\xb6\x6d\xdb\xcf\xcd\xf8\xa0\xd8\xec\x28\x8c\xa1\xc3\x87\x65\xbf\xcc\xb5\x86\x90\x4f\xd0\x8c\x33\x34\x6b\x4f\x8c\xf4\x49\x88\x0b\x50\x7b\x9d\x56\xc5\x4a\x35\xbe\x77\x65\xd2\xad\x24\x8e\x4a\x04\x93\x6f\x7c\x13\xe0\xb6\xb0\x9e\x31\xd5\xa6\x8d\x3c\x4b\x96\x5b\x82\x55\xc8\x0b\x2e\xef\xac\x34\x89\x1a\x8a\x88\xfe\xb5\x5c\x8a\x47\x82\x21\x11\xab\xe8\x54\x30\x53\x19\x34\x45\x24\x48\x5d\xbe\xb9\xd9\xa0\xa2\xd6\xe4\x73\x3c\x4a\xc6\x37\xad\x8b\x8c\x4d\x5b\xa6\x81\x56\x44\xe2\x96\xa9\x1e\x78\x40\xf3\xdd\xb9\xd3\x81\xa8\xd4\x70\xe3\xd7\x36\xe8\xb0\xa2\xe2\xff\xf7\xdf\x7d\x11\x0b\x5f\x9b\x55\xed\x3b\xac\x2a\x6a\x5b\x55\x48\xec\x25\xca\x30\xae\xb4\x3f\x60\x41\xb9\x42\xc4\xb1\x66\x6f\x18\x56\xd3\x4a\x93\x8b\x0a\x89\x6d\xad\x86\x32\x8f\xae\x77\x81\x8c\xf7\x1a\x21\xe1\xea\x49\x51\x32\xe8\x0e\xb9\xc1\x2b\x98\x45\x24\xa5\x42\xa6\xc3\xbd\x40\x22\x58\x65\x04\x33\xae\xa7\x90\xc2\xb7\xf1\x5d\x99\x9a\x72\xa7\xcb\xe0\x4f\xb1\x6a\x8e\x3d\x97\x8d\x55\x99\xa9\x3b\x30\x62\x97\x1b\xe0\x61\x8f\xf1\x16\x05\x58\x18\x56\xbd\xe6\x14\xf4\x69\xc8\xed\xad\x42\xf3\x7b\xd1\xb7\xfb\xd8\xed\x23\x2d\x25\xde\xa7\xb0\x92\xbe\xd5\x2e\xe2\x0d\x08\x0b\xc2\x58\x41\x0e\xcb\xe7\xf1\xd6\x89\x69\xb7\x66\x8b\x7c\xbb\x11\xc5\x9b\x54\x22\xe8\x5b\x2d\x9b\x79\x44\xa3\xd9\x5d\xa6\x8d\x6c\x6f\xc5\x58\x25\xda\x06\xe5\x63\x58\x0f\x08\x74\xa8\x56\xcf\x80\x0c\x7b\x4d\xa2\x70\x87\xef\x93\x44\xae\x40\x25\x0a\x0c\x6c\x40\x05\xa1\xbb\x08\xb5\x8a\x58\x2c\xcb\x67\xdf\x66\xb8\xb9\x50\xf5\x3d\x96\x9b\xab\xbd\x8a\xe9\xc6\x32\xb9\x7e\xef\x7c\x0a\xb2\xb7\x8a\xde\x24\x61\x70\x1a\xf1\x9b\xca\x3c\xd6\xec\x20\x28\x35\x06\x9f\x59\x1b\x7f\x9a\x58\x59\xb3\x01\x2d\xc9\xd6\x3d\xe4\xad\xd7\xdb\x91\x5c\x8c\x81\x42\x9f\x71\x69\x7b\xfc\xf7\x4a\x05\xd2\x13\xcf\x6a\x55\x4a\x3f\xc6\x1c\xf1\x6f\x55\xf7\xa1\xcd\xe2\xcc\x0e\x26\xb1\x84\x54\x55\x66\x49\x7b\x16\x92\x52\xae\xf9\xb6\x94\xab\x58\x1e\xcc\xb6\x3b\xee\xb0\x6f\xd5\x7c\xa8\x33\x89\x7a\x81\x6a\xa3\xd3\xe2\xae\xfa\xd8\x60\x0d\x24\x5d\xb2\x4c\xa8\x4c\xa7\x49\x55\x13\xdb\x58\x2a\xf6\x6d\x0e\xcd\x79\x19\xc4\x56\x4d\x33\xab\xe5\x8a\x50\x03\x76\xb6\xa6\x2c\x25\x76\x87\xa5\xa4\x4c\x18\x5e\xa4\x6f\x51\x4d\x20\x68\xbb\x6a\xc1\xa8\xc0\x5f\x5b\x3e\x93\xb6\x08\x00\xd0\x82\x53\xd6\x80\xa4\x6e\xbe\xd8\x0f\x29\xe8\x8a\xb7\xb2\x9e\xd6\xf0\x55\x67\xb2\x62\xa1\xa5\x73\x1d\x16\x0e\x83\x70\x70\x6a\xb1\x6d\x01\xd2\x93\x27\x7f\xda\xed\xf2\xd4\x62\x02\xbb\xb6\x33\xb0\xdf\x84\x94\x82\xd0\x09\x46\x51\xd4\x27\x0c\x35\xf4\x27\x4b\x8b\x7d\xff\xd0\xd0\x13\x16\xfd\xb8\xb7\xaf\xef\xe7\x3b\x46\x1c\x2b\xa3\xe9\x3e\x09\x59\xaf\x2c\xe5\xaa\x72\x05\x99\xd6\x70\xa0\x2f\xf7\x8b\xd5\x0f\x1a\x02\xef\x5e\x0e\xd9\xec\x4a\x61\x15\xd7\x00\x7d\x80\xac\x34\x42\xd1\xb1\xa7\x72\x69\xb1\x1e\xf3\x1e\x45\x79\xec\x45\x48\xa2\x97\x0b\x75\xeb\xda\xf6\x5e\x58\x39\x46\x45\xbf\xbe\xbb\xb5\x97\x69\x76\x51\x6b\x86\x27\x99\xfa\x6f\xef\xae\xbf\x97\xd1\xd9\x4e\xc4\xa2\x5a\x1b\x3a\x59\x90\xfa\xc1\x7d\x71\x59\x85\xad\xef\xd2\xe7\x69\xaa\x0f\x4b\x5c\x64\xf1\x8d\xa5\xc3\x53\x3c\xcf\x28\x3b\xa6\xd9\x84\xe2\x3c\x2f\xc3\x9c\x5c\x27\x6c\xba\x4d\x71\x2c\x4f\x13\x9a\x74\x8a\xf3\x79\x46\x72\x7c\x76\x33\xc7\xc8\xfb\x94\x67\xc4\x53\xf3\x8f\xd9\x34\x8b\xc5\x76\xe7\xbb\xf9\xbc\xdc\x52\xb0\x67\x5d\xfb\x62\x14\x7b\xd9\xd9\x3d\xd8\x3d\xdb\x55\x3c\xe6\xd5\xee\x99\xfa\xf5\x7a\x77\x6b\x47\xfd\x3c\x3a\x3e\xdb\x3f\x3a\x3c\x55\x5f\xbf\x9f\x1e\x1d\x1e\x7b\x61\xb9\xa3\x58\x7d\x61\x62\xad\x53\xa8\x4d\x6c\x09\x09\x58\x2e\x13\xa5\xea\x8a\x11\x97\x96\x10\xed\x53\xa1\xdc\x71\x5d\x1b\x84\x11\xa2\x30\xd2\xbc\xb8\x8e\x8b\xb5\xa8\x96\xb4\x02\x37\x6b\x51\x3d\x0d\x46\x15\x4c\x99\x0e\x2c\xec\x55\x8b\x00\x18\x69\x07\x81\x2e\xad\xf7\x15\xca\x0c\x5e\x66\x54\xbd\xd9\xaa\x2f\xb4\x96\x19\xbc\x8c\xe0\x4d\x65\x33\xf2\x0b\xe9\xe4\x9a\x27\x49\x47\x6a\xb1\x37\x31\xa6\x9a\xa9\xc9\x26\x75\x11\x3b\xce\xdc\x7b\x55\x44\xb5\x69\xc7\x58\x94\x49\x81\xd6\x67\x7c\xe1\x67\xea\x88\x5b\x15\xca\x7b\xa6\x49\xf2\x43\xc2\xa6\xea\x9d\x35\x22\xaf\x61\xc8\xd0\x93\xc4\x58\x5b\x7d\x6d\xed\xd5\x8a\xaf\x0b\xfb\x0b\x65\x7d\xaf\xef\x85\x59\x19\x4c\x72\xa3\xdb\xf7\xda\x5e\xe8\x79\x60\x3d\x2d\x2c\x37\x92\xc2\x01\x87\xfc\x14\xba\xda\x73\x72\x59\x9a\x08\x3f\xce\xcb\x2c\x76\xdd\x01\xb4\x8c\x7c\xad\x01\x70\x4a\xeb\xf3\x84\xf0\xd2\x90\x1e\x58\x2e\xaf\x2b\x5f\x6f\x2b\x5f\x2e\x5e\xf0\xee\xe4\xe0\x54\xdc\x90\x39\x56\x33\x59\x56\xb0\x59\x43\xad\xd4\x72\xd9\xdc\x53\x2c\x81\x2a\x7f\x85\xce\xa6\x4e\x4d\x01\x6b\xe2\x42\x4f\xc6\x8b\x75\x34\xb8\x5c\x7a\x17\x59\x96\xe2\x88\x38\x33\xab\xca\xbe\x19\x6e\x9f\x2f\xe2\x40\x82\x99\x8c\xed\x9c\xd0\x05\x80\x25\x4a\x18\x1e\xc9\xdb\xcd\x84\xf1\xe5\xf2\x5a\x90\xeb\xc3\x67\xa5\x8a\x75\x39\x47\xf6\xac\xd8\xe3\xbf\x99\x63\x69\xb4\x55\x66\x51\xd6\xb9\x03\xc5\x1e\x5f\x1c\x4f\xe6\x69\x94\x10\x6f\x15\x96\x85\x27\x3b\x91\x8f\xfb\x3e\xf9\xb2\x71\x7d\x7d\xbd\x31\xce\xe8\x6c\x63\x41\x53\xa9\xce\xc6\xbd\xd1\x34\xa2\x39\x66\xe8\xdd\xd9\xde\xc6\x0b\xef\xee\x29\x50\xc7\x1d\x1f\x39\x3d\x55\x28\x04\x0f\xaf\x9a\xbb\x6e\x65\xbc\xbc\x0e\xf6\xed\x9e\x26\x48\x11\x51\xfc\x59\xeb\x15\xe2\x03\x26\x88\xf0\x15\xa9\x12\x17\x94\x73\x67\x52\xe1\x8f\x2a\xcb\x4e\x82\xa9\xe1\xea\x44\xad\xbd\x1a\x8d\xc3\xcc\x2e\x52\x63\xd2\xfd\x46\x4a\xe8\xe2\xef\x30\xb7\xdb\xa8\x0a\x84\x7e\x3d\x21\x74\x08\x12\x38\x42\xc4\xb0\x5b\x9b\xdb\xc2\x05\x22\x8a\x37\xa9\x0c\xf9\x01\x63\xa4\x7d\x87\x0c\x91\x92\xb5\x5b\x58\x66\x7d\xb9\xa7\xa2\xf3\xb4\x0d\x64\x41\x9a\x63\xf6\xba\x14\x28\x23\x54\x75\xf2\x98\x4c\xa0\xee\x99\xac\x78\x84\x59\x19\x16\x76\x8d\x01\x1b\x82\x02\x8e\x80\xf2\x43\x69\x1e\xe5\x2f\x9a\x7d\xc8\xbc\x47\x74\x21\x2b\xc8\x1e\x16\xbc\x07\x61\xf8\x51\x98\xc0\x14\x4a\x1b\x3a\x0f\x17\x50\xa1\x2f\x1c\x41\x35\xfc\x30\x86\xb5\x79\xc8\xa1\x4d\x2a\x61\x04\xeb\x53\x9d\xd9\xfe\xf7\x2f\xc8\xf7\xbf\xa0\x2f\xf2\x11\xc4\x2f\xc1\x29\x26\xea\x8d\x45\x71\x30\xec\xcb\xe0\x4b\xf0\x6e\x9e\x66\x51\x5c\xea\x06\xdd\x21\xf2\xaa\x49\xb2\xd8\x89\xea\x54\xa2\x4a\x3c\x8d\x58\x4d\x92\xc5\x76\xb2\x6b\x52\x69\xef\xe9\x10\x79\xf5\xc4\x6a\x8b\xe2\xb9\x44\xfd\xa1\x60\xca\xd5\xfb\x96\xfc\x87\x07\xbf\x00\xf8\x57\x2d\x32\xad\xb6\x9f\xbf\xf1\x82\xc6\x66\xa7\x03\xe9\xb7\x3e\xac\xec\x1d\xbd\xf1\xea\x47\x66\xb4\x96\xc1\xcc\x7a\x10\x0a\x87\xcc\xcd\x59\xc4\x16\xd6\x6a\x63\x2a\xa5\xaf\x7f\x84\xc4\x2e\x78\x26\x22\x79\x58\x1f\xcb\x25\x35\xea\x2e\x93\x0c\xc5\x68\xba\xd9\x25\xb2\x2a\xff\x86\x36\x3b\x1d\x25\x58\x65\xca\xaf\x4f\x3b\x9d\x02\xc0\xdd\x87\x3f\xf3\xa6\xdf\x48\x76\xa0\xe8\xc1\xbe\x77\xb5\x08\xac\x17\xe2\xb0\xfd\x42\x1c\xa4\x00\x08\x89\x84\xea\xb4\x05\xb1\xe3\xc1\xb8\xbb\x38\xf7\x37\xbf\x1a\x6c\xa0\xe4\x73\x45\xfc\x5b\xbd\xfc\xf0\x0a\xae\xa6\x26\xcb\x3c\x25\xa8\xe7\x51\xff\x08\x2d\xb4\x43\x33\x7f\x21\xae\x4c\x66\x6d\xaa\xe1\x82\xa6\x21\xae\x8a\x09\xfd\x62\xb4\x5a\xcb\xa4\xf0\xff\x02\x70\xff\xdf\x7e\x06\x21\xae\x1b\x25\x52\x7c\xc9\x3f\xd2\x3c\xf9\xdf\x9b\x5e\x01\x83\x35\x79\x02\x34\x5c\x97\xac\xff\xe6\x44\x70\xf6\xcf\xbf\xd6\x08\x31\xec\x40\xef\x1d\xb9\x24\xd9\xb5\x0a\x86\xe3\x01\x10\xc8\xb3\xd7\xaf\x19\x9b\x8b\x24\xc3\xa2\x29\x67\x39\x6b\x5d\x48\xf5\x2d\x18\x44\xab\xcc\x87\x5a\x9c\xa7\x2f\x5a\x68\x8d\xa3\x24\x5d\x50\xdc\x8a\x17\x62\xeb\x4b\xbf\x5d\x39\xce\xa8\x79\x63\x49\x0d\xdf\xf3\x17\x0a\x94\x05\x4d\x81\x07\xc2\x6a\x0b\x5a\xfc\x3d\xa4\x2e\xf4\xc2\x96\xb9\x39\xac\x27\x00\x7a\x8e\xc4\x33\x61\x63\xd2\x40\xc4\xce\x41\x58\xfe\x55\x6c\xd6\x7e\xc2\x12\xf0\x59\x30\x58\x3e\xb2\x45\xbe\xa4\x30\xd6\x24\xa1\x52\x9c\x97\xd1\xeb\x61\x76\x91\x63\x7a\x85\x43\x1c\xa8\x5f\x50\x69\x01\x58\xeb\x4a\x35\xc1\x8f\xeb\xda\x57\x45\x0f\xc0\x55\x0d\xb2\xae\x14\xe0\xba\xf2\x57\x08\xbf\xcb\x31\x3c\x44\xfe\xf1\x83\xc3\x4c\x4c\x23\x12\xa7\x98\x3a\xc3\x4c\x50\xfc\x79\x81\xf3\x15\xfe\x3b\xf5\xea\x24\xd7\x76\xe4\xae\xee\xe2\x5b\x85\xef\x6d\xd1\xab\xb8\x91\x0e\xfa\x04\xe1\xd0\xa7\x68\xa1\x71\x6d\xe7\x4e\xfb\x65\x72\x28\xe4\xb1\xbf\x30\x3e\x87\x85\xf1\x27\x24\x48\x7f\x54\xcd\x1a\x9d\x2a\x2a\x9f\xfa\xb7\x66\x6b\x30\xd4\x59\x05\x57\xe6\x84\x01\x7e\x20\x4e\x1d\x97\x63\x58\x48\xfe\xb2\xb0\x58\x5f\x29\x60\x68\x49\x10\x8b\x92\x20\x54\x4f\x49\x7d\xde\x17\x77\xce\xfb\xa2\x66\x4c\x28\xd7\x55\x7d\xfe\x17\x8d\xf9\x07\xfa\xa2\xb6\xdf\x81\x51\x90\x8d\x81\x4f\x40\x30\x4f\xe6\xe2\x76\x53\x16\x5c\x00\xd7\x69\xb2\x54\x93\x80\xfa\x2b\xcf\xca\xf4\x92\xb1\x5f\x9d\x94\xe5\x52\xbc\x40\xc4\x72\x71\x3b\x53\x53\x78\xf9\xae\x67\x4f\x46\x41\x88\xcb\xfe\xf2\x60\xea\xec\xaf\xd2\xea\x3e\xef\x4a\xf9\xda\xca\x36\x85\x41\x18\xdf\x78\xca\xf7\x26\x7e\x87\xaa\x50\xd5\xd0\xd2\xce\x7f\x6e\xb9\x5f\x08\x17\xa8\xf6\xb9\xb5\xe6\x25\x20\xa3\xe0\x1d\xa8\x5f\x4f\x54\x16\x8b\xbe\x58\xb3\xa6\xae\xc3\xac\xf0\xab\x3a\x5e\xf1\xd5\x9c\xb3\xbc\x6f\x48\xec\x0a\x81\x67\xed\x58\xf1\x86\xf9\x30\xe5\x60\xd2\xec\xe2\x9f\x83\xf1\x65\x9a\x5d\x3c\x04\x38\x51\x70\x35\x50\x22\x0c\xdb\x37\x01\xe5\x78\xb2\x4f\x38\x20\x1e\x00\x92\xac\xe9\x04\xaa\xea\x2d\xbd\x0b\xa2\x7a\xd5\x42\x8c\x47\x93\x88\x19\x53\xd9\x64\x03\xb0\x77\x84\xe2\x68\x34\x8d\x2e\x52\x1c\xb6\x16\x44\xae\x81\xb8\xa5\x48\x51\xbe\x35\x54\x4a\xa4\x92\x44\xa1\x57\x78\xf6\x2d\xa2\xd5\xdb\x07\xdf\x75\xe9\xdc\xa8\x3b\xca\x54\x17\xfc\xd8\xd7\xee\x68\x58\x09\xf0\xb4\x62\xab\xe4\x7f\x04\x80\x57\xbb\x67\xb5\xde\x39\x1b\xfc\x97\x75\x2f\xfc\xee\xd5\xfe\x39\x8f\x9c\xdf\xbf\xd3\x54\x36\x21\x3d\xf4\x10\x97\x96\xba\x2f\xe4\x01\x08\xe4\xb1\x02\x9f\x41\x59\xe4\x7c\x7b\xeb\xe0\xe0\xe5\xd6\xf6\x1b\x0f\x94\xf2\x5d\xb2\xa4\x2a\xd3\x96\x4c\xda\xda\x23\xcf\x44\x18\xac\x3b\xa2\xaf\xfe\xc3\x38\xd1\x1b\x10\x55\xb4\xcc\x23\xe6\x3a\x57\x08\x57\x5b\xdb\x0f\x96\xd9\x4e\x28\x8e\xb7\xce\xb6\x5f\x73\x18\x8e\x7c\x02\x99\x75\xfa\x63\x9e\xdd\xa9\x48\xfc\xe3\x70\x1c\x9d\x9e\x39\xc1\x58\xfc\x4b\xa1\x78\x57\x05\x42\xbb\x70\x8e\x5d\xd7\xb4\x71\xe5\x9a\x36\x5e\x2e\x8f\x81\x9f\x88\x87\xc4\x17\x00\x14\x65\x1d\x71\xe7\x39\xb1\x1f\x11\x3f\x2e\x6f\x37\x1f\x57\x1e\x11\x3f\x06\xf0\xe4\x11\xf7\x96\x89\x70\x51\xe8\x47\x10\x19\xa6\x23\x3c\x67\x19\x75\xee\x37\x48\x36\x79\xff\x21\xa3\xb2\x15\xf3\xdb\xc7\xa6\x3b\x0b\x25\x7b\x42\xdf\x4a\x82\xa3\xf4\xd8\xf7\x5e\x9f\x9d\x1d\x9f\xef\x1f\x9e\xed\x9e\x6c\xef\x1e\x9f\x1d\x9d\x9c\x7a\x00\xee\x7c\xc3\xdb\x08\x0e\xc8\x4b\x38\xee\xe6\x15\x96\x32\xf4\xfd\xe1\xdf\x9b\x53\x76\xd7\xbb\xef\xf0\x13\x7a\xf2\xdf\x7f\x83\xbf\x87\x7f\x17\x3f\xc2\xfe\xdf\xe4\x09\x7c\xf5\xed\x51\xe4\xbe\x4c\xe9\x9e\xec\xc9\xa9\xe1\xaf\x9e\x47\xeb\xdc\x71\x32\xd6\xec\x52\x9c\x09\x57\x7b\x96\x0d\x49\xba\x25\xef\x78\xe2\xb8\xc5\xb2\xd6\x28\x23\x39\xa3\x8b\x11\x6b\xfd\xce\x19\x73\x4b\x2d\x89\x16\x57\x59\xb3\x05\x6b\x71\xf3\x4f\x5e\x4f\x15\xf9\x6f\xb3\x78\x91\x2a\xcd\x30\x4d\x71\x6c\xa9\x05\xbc\x87\x34\xb8\x71\x1c\xd5\x62\xd6\xe8\x82\x8b\x45\x92\xc6\x72\xff\x8e\x06\xd9\x1c\x13\x5f\x43\x0a\x71\x75\x03\x0d\xc0\x86\xe5\x24\x42\x0a\x35\xb6\x4a\x45\x4c\x25\x7d\x10\xba\x79\xfe\xcb\x22\x17\x11\xd7\xfb\x44\x0e\x51\x7a\xbc\x78\xb6\x3a\x3a\x04\x3d\x20\x63\x5b\xdb\x57\xa5\xbc\xad\x91\x20\x42\xb0\x5c\x3a\x2a\xeb\x5c\xd8\xd8\xfd\x80\x2d\xb3\x73\x03\x5b\xff\xf9\xe4\x3f\x3d\x00\xd7\x6a\x4d\xab\xad\xa7\x0d\x2e\x97\x3c\xa0\xdf\xf9\xc7\xc1\x8a\x8d\x29\x1f\xa8\x80\x62\xea\x9c\x49\x03\x98\x4a\x7b\x30\x01\x85\x88\xe6\x5c\xd5\xc3\xe5\xc1\xfd\x6a\x6a\xed\x7a\x03\x75\x6d\xc8\x73\xb6\xda\x8f\x42\xa9\x82\x16\x72\x67\x16\x07\x95\xed\x4c\x5f\xdc\xa6\xe4\xb6\x56\x6e\x93\xbd\x51\x46\x33\x6d\x84\x64\xca\x69\xd2\xdd\xdc\x7c\x8a\x50\xe9\xc1\xe8\x6f\x76\x9e\x85\xfa\x03\x92\x32\x5d\x3a\x6d\xbc\xa3\x37\x1e\x4c\xe4\x5e\xb2\x2f\x9e\xb9\xdb\x12\x77\x55\x2d\xf7\x65\xee\x03\x00\x23\x07\xa7\x2e\x35\xcd\x77\x27\x07\x5e\x42\x5a\x58\x1e\xdb\x2d\xd3\xfa\x95\xaf\xf0\xc9\x7f\xff\xb9\xa1\x70\xbb\x21\xbe\x67\x01\xe3\x72\x02\xaf\xec\xb5\x2f\xb2\xaa\xe9\xbe\x57\x69\xc5\x53\xa1\xa8\x7d\x2a\x62\x0f\x2c\x68\x6a\x02\x26\x89\xd5\x69\x7c\xa0\x89\x76\x74\x31\xdb\x87\x45\x84\x9f\x2a\x2a\x40\x01\x47\x75\x46\xc3\x50\xee\x03\x98\x18\x1f\x38\x8c\x4a\x2f\x36\xb7\xfb\x6d\x6f\x57\x26\xdd\xd8\x70\x24\x26\xab\xb7\xd9\x79\xc6\x27\x57\xec\xe7\x94\x07\xa5\x0c\x0d\xf4\x2d\x72\xe0\x50\x98\x4f\x79\x7d\x85\x57\x8c\xd0\xa8\xbf\xd9\xe9\x84\x1d\x1d\x90\x2f\x52\xce\xa8\xe8\xd7\xa7\x9d\x8e\xe0\x4b\x82\x88\x04\x5b\xaa\x9e\x61\x68\xec\x7d\x8e\xe4\x80\x62\x34\xea\x8d\xd0\xa8\x3c\x5b\xfd\x09\x7a\x1e\x10\xd1\x2d\x47\x48\x1c\xf9\x1b\xc9\x6d\x5f\x11\x9a\xc6\x1f\x29\xdc\xca\x5b\xd1\x53\x70\x3b\x42\x31\x5c\x88\xed\xa3\xb5\x2e\x1c\xa1\x5b\x19\x95\x79\x0a\x85\xdd\x3f\xe2\xda\xdf\xa2\xef\x13\x21\xdb\x84\x3e\xb9\xaf\x3c\x94\x23\xd8\x98\x83\xc8\x9e\x83\x54\xcc\x41\x66\xbc\x83\x00\x92\x60\x94\xcd\xe6\xe2\xac\x11\x00\x21\x91\xce\x2b\xd1\xe8\x99\xaf\xfa\x7d\x7c\xab\x05\x5c\x34\x83\x66\xf2\x39\x16\x33\x27\x57\x41\xd9\x3c\xd6\x8d\xea\x05\xb3\x5c\x76\xec\xe6\x6b\xeb\xa8\xea\x6c\x14\x5d\x33\xd3\x75\x4f\x8f\x20\x01\x05\x14\x4f\x14\xcd\x2b\xd2\x33\x5e\x2e\x35\xe2\xc4\x72\x8b\x39\xff\xed\x49\xd6\x25\x23\xd3\x34\x77\xa2\x20\xff\xc0\x71\xc8\x02\xf9\xa3\xe8\xe9\x3b\xa1\xdb\xd9\x6c\xbe\x50\xd7\xec\xfd\x24\x60\x19\x8b\x52\x71\xde\x87\x45\x29\x80\x92\xdb\x38\xa8\x66\x6d\xad\x4a\x95\xa2\xf2\x3c\xa2\x5c\x20\x88\x1d\x9c\x6a\xb6\x8c\xe1\xf4\x85\x89\x31\x8d\x1d\x88\xd5\x80\x57\x77\xdf\x34\xd8\xb8\x04\x1b\xbb\xc0\x56\xe0\x8a\x5b\xc2\x02\x6c\xd5\x19\x03\xa5\xb6\x29\xde\x0c\xdf\xbd\xc2\x84\x1d\x24\x39\xc3\x84\x33\x07\xde\xa6\x07\xc5\x53\x27\xcd\x4c\xac\xe6\xc6\x9d\xcb\x92\x19\xce\xb8\x82\xbc\x22\x3f\xba\xc8\xa8\xcc\xad\x3b\x2e\x85\x00\x6d\x56\x98\x97\xbb\x83\xe6\x68\x69\xca\x85\xcc\x42\x20\xc4\xfc\xba\xb3\xee\x18\x70\x70\x72\x6e\x95\x19\x2c\x68\xd4\x9e\x62\xc2\x0a\xeb\xec\x16\xb8\xd5\xcf\x65\xdc\x31\x74\x67\x01\x33\xba\x15\x05\x2c\xcc\x3a\xf3\x6d\xf4\x39\x11\xe4\xac\xf5\x70\x1c\xdd\x53\x5d\xa2\x89\xe2\x28\xbe\x11\x6f\xed\x88\xad\x9a\x9d\xa3\xc3\x5d\xde\x84\x18\x9c\x2f\xee\xb0\x7f\x73\x70\x2b\x69\x8c\xd0\xe0\xf7\x3d\xf0\xed\xca\xed\x57\x5b\xcf\xff\xf3\xf4\x64\xef\x7c\xfb\xe8\xe8\xcd\xfe\xee\xf9\xe1\xd6\xdb\x5d\x0f\xc0\x97\x8d\x7c\x6e\xec\xef\x9e\xe8\xfc\x77\x77\x85\x46\xf8\xfc\x7d\xaf\xec\xc4\xd9\x48\x1b\x40\xf3\x34\x62\xe3\x8c\xce\xf4\x49\xc4\x51\x96\x5d\x26\xf8\x30\x9a\x61\xfd\xc8\x8e\x78\xf0\x4a\xa4\xca\x13\x40\xc8\xf3\x4c\xc6\x19\x47\x84\x75\x72\x51\x88\x13\xf5\x12\x9b\x43\x0d\x9f\x60\x59\xc3\xfd\x18\x8e\x27\xbc\x0e\xd4\xd3\x67\x84\x34\x6c\x95\x90\xcd\xd6\x1b\x39\x71\x36\x52\xf0\x8a\x08\x7e\x7a\x9a\xf5\xb1\xee\x3a\xe0\xd6\xd9\xbb\xf2\x35\xb5\xfa\x48\x44\x74\xac\xb7\x5f\x80\x36\xde\x0c\x3a\xc0\x0a\x6c\xd8\x19\xa2\x8d\xef\xa7\xbb\x37\x1d\x00\xe5\xef\x24\x38\xb8\x48\xf4\xc7\xd7\xef\xa0\xc6\x0f\xdf\xf3\xc4\xad\x68\xff\x14\xd3\xab\x64\x54\x06\x22\x97\x02\x59\xd0\x89\xcb\x6e\xbe\xc7\xfa\xd4\x57\x20\x16\x34\xad\x29\xcf\x9c\x0c\x5e\xed\x9e\xd9\x16\xd8\x72\x29\xfd\x60\x95\x24\xc2\x65\x32\x65\x39\x37\x77\x7c\x6f\xca\xd8\x3c\x7c\xf2\x84\x5b\x19\xcd\x8c\x5c\xe4\x80\xa6\xc5\xab\x2e\x01\x37\xc6\x18\x68\x32\x35\x73\xa8\x1f\xe2\x16\xc1\x6c\x6c\x23\xa4\x86\x0c\xd0\x6e\xfb\x18\x61\x7d\xc1\xa4\xb1\x99\x26\x8f\xd5\x54\xeb\x40\x0a\x0a\x71\x0d\xed\xfb\x4d\x71\x45\x42\xef\x34\xc9\xbc\xfc\x0e\x92\xf9\xf8\x3d\x24\x73\x11\x8d\x2e\x31\x89\x8d\x9b\xe5\x93\x88\x8a\x55\x72\x99\x69\x94\x90\xd5\xd7\xcd\x56\xd9\xea\x26\xde\xb4\x69\xa5\x12\x86\x4a\xf7\x23\x4e\xbd\xef\xc1\xc1\x50\x1d\x54\x95\xfd\xb1\x95\xd1\x7b\x2b\x41\xf2\x4e\xe4\x7b\x02\x95\x81\x94\x1e\x16\xd3\xdc\x3f\x37\x5d\xb1\x59\xee\x5f\xf3\xa7\xdf\x31\x65\x3f\x7c\xa7\xeb\x48\xf0\xf1\x41\xf9\xd0\x08\xd7\xcf\x56\x9e\xe6\xbc\x25\x13\xe9\xcc\x30\x61\x08\x2b\x41\x13\x3f\x98\xa0\x89\x3b\xc5\xd0\xec\x20\x5c\x27\x6c\x7a\xb4\xc2\x65\xbc\xd2\x63\xfc\xc8\x43\x13\x2b\x60\x63\x16\x3b\xef\x97\x80\x7e\xe5\x80\xca\x37\x3a\xec\x02\x45\x38\x18\x96\xf7\xc3\xab\x35\x5e\xda\x35\x4c\x01\x5e\x63\xf8\x4f\xbc\xa2\x38\xcb\x62\x94\xdc\x11\xaa\x32\x69\x84\xaa\xfc\x00\x4b\xe0\xf6\x38\x70\xbb\x5f\x92\x9c\x25\x64\x12\x7e\x80\xb3\x45\xca\x92\x70\xad\x53\x98\x22\xef\xcc\xd4\x7c\xb6\x92\x2d\x44\x08\x85\x64\xe3\xec\xe8\xcd\xee\xa1\x67\x95\x78\x69\x97\xd8\xb0\xcb\x94\x51\x31\x7f\xff\xd7\x45\xf3\x7c\x1c\x8a\x0e\xcd\x30\x16\x66\xfc\x1f\x0b\xf8\xca\x64\xc4\x15\xdc\xbd\x2a\x86\x30\x99\x89\xb0\x64\xe1\x60\xf0\x43\x60\x51\xae\x7f\x6b\x08\xa5\x82\x2c\x68\xc8\xa1\x8e\x22\x30\xd4\x48\x2a\xa0\x08\xa9\xf5\xa0\x88\x5f\x31\x7e\xe5\x38\x49\x7d\x4d\x0a\xc8\x2e\x1c\x19\x2f\x17\x05\xdc\xda\x9b\x3b\x72\xf6\x16\x05\x4c\xe6\x5d\x57\xfc\xb0\x45\x01\xb7\xff\x7a\xed\xc8\x39\x59\x14\x70\xfa\xca\x05\xc0\x51\x5c\xc0\xaf\x9b\xae\xa8\x63\xe7\x71\x01\xf3\x97\x47\x8e\x9c\xb3\x51\x01\x4f\x93\xd4\x75\x6b\x28\x2e\xe0\xf9\xfb\xd8\x91\x93\x8c\x0a\xb8\xfb\xfb\xc8\x91\xf3\x61\x51\xc0\xd3\x97\x9f\x1d\x39\xf9\xa8\x80\x9f\x0f\x88\x23\xe7\x38\x29\xe0\xd5\xdc\x75\x34\xfd\x6a\x51\xc0\xc9\x97\x2f\x2e\xd8\xd2\x02\xb2\x97\xd4\x91\xf3\x86\x14\xf0\xcf\xbd\xdc\x05\x5b\x01\x8f\xd2\x63\x17\x72\x48\x01\xbf\xe6\x4f\x1d\x39\x93\xb4\x80\xfb\xfb\x2f\x5d\xa8\x5e\x14\xf0\xaf\xbf\x9e\x39\x72\x5e\x8f\x0a\x18\xfd\x31\x71\xe4\x1c\x8c\x0a\x98\x67\xae\x89\xfb\xbc\x28\xe0\xc7\x37\x2e\xd8\xbe\x8e\x0a\x78\xf5\xd4\x35\x9c\xd7\x71\x01\xa7\x9d\xc4\x91\xf3\x6a\x54\xc0\xe3\x3f\xff\x72\xe4\x6c\xc7\x05\x3c\xe9\xb8\x48\x34\x89\x0b\xb8\x97\x7c\x74\xe4\xfc\x49\x0a\x48\xcf\xdf\xb9\x26\x6e\x51\xc0\x83\x0b\x17\x04\x5f\xf9\xc4\xfd\xb2\xe5\x82\x6d\x51\xc0\x3f\xf2\x4f\x8e\x9c\x78\x54\xc0\xbd\x8f\x99\x23\x67\x31\x2a\xe0\xef\x47\x33\x17\x19\xd0\x02\x9e\x25\xae\xb8\xba\x73\x4e\x6e\x4f\x5d\xb8\xfe\x92\x14\x90\xcd\x3b\x8e\x1c\x4c\x0b\xb8\xbb\xf5\xde\x55\x87\xe3\x6d\xe2\x22\xf8\xbd\x51\x01\xe3\x1d\xd7\x6c\xc7\x71\x01\x77\x6e\x5c\x10\xbc\x25\x05\x7c\x35\x76\xf5\x33\x1e\x15\x30\xf9\xe5\xc0\x35\xdb\xa4\x80\xf9\xb9\x6b\xe6\xde\xf1\x3a\x63\x17\x6c\x6f\x0a\x88\xf7\x5c\x93\xb0\x15\x17\xf0\xd5\xb3\x17\x8e\x9c\x19\xcf\x99\xbb\x1a\x3b\x28\xe0\xf9\xe8\xb9\x23\x63\x3f\x2e\xe0\xfb\x03\x17\x15\xcc\xe3\x02\x8e\x36\x5d\x0b\xfb\xdd\xa2\x80\x5f\x4f\xa7\x8e\x1c\x9a\x16\xf0\x7a\xcb\xc5\x2a\x3f\x65\x05\xbc\x7a\xed\x62\x88\xbb\x05\xdc\x4d\x76\x5c\x88\x4e\x0a\x38\xdb\xfe\xe0\x9a\x9c\xa4\x80\x9f\xbf\xba\xb8\xd1\x9f\xb4\x80\xbf\xbf\x77\x2d\x04\x96\x14\x70\xfe\xd2\x45\x38\x51\x52\x40\xfc\xd2\x35\x39\x34\x29\xe0\xc1\x4f\x97\xae\x6b\x37\x3c\x67\xeb\x4f\xd7\x52\x4c\x0a\x38\x9a\xb8\x64\xc2\x49\x56\xc0\xb3\x4f\xae\x25\xb2\x1b\x17\xf0\xf2\xc0\x35\xa3\x7b\x59\x01\x6f\xa6\x2e\xfe\x8e\x93\x02\xc6\x9f\x9d\xb0\xe1\x02\xe6\xfb\xae\x29\xbd\x4e\x0b\xb8\xfd\xd9\x25\x47\x3e\xa6\x05\xfc\xe3\x95\x0b\x6f\x9f\xd3\x02\xee\x3d\x73\xf5\xf3\x21\x2d\xe0\xc9\x8e\xab\x9f\x4f\xb8\x80\x5b\xd1\x1b\x47\xce\x69\x01\xbf\x3e\x75\x05\xdc\x7c\x43\x0b\xf8\xf9\xc8\xc5\x59\x66\x69\x01\xcf\xce\x5c\x04\x72\x86\x0b\x78\xfe\xd2\x45\x06\x6c\x54\xc0\x2f\xf3\x9f\x5c\x39\x51\x01\x17\xfb\xae\xe1\xec\xf2\x7e\x32\x17\xaa\xaf\xb2\x02\xbe\xa2\xae\x95\xb0\x9b\x15\x10\x5f\xba\xa0\x1e\x67\x05\x3c\x5d\xb8\x26\xfb\x60\x51\xc0\x3f\xe7\x2e\x7e\x38\xc7\x05\x4c\x5f\x6d\xba\x96\x3c\x2e\xe0\xc7\xaf\x3f\xbb\x14\x8d\x02\x8e\x7e\x3f\x75\x51\x5b\x01\xb3\x2d\x97\xec\x9b\xf1\xb6\x3e\xb9\xc6\x79\xca\x73\x9e\xba\xb0\x76\x9c\x16\xf0\xfc\x9d\x4b\x26\x7d\x4a\x0b\xf8\xea\xd2\xa5\xb4\xbc\x4c\x0b\xf8\xf2\x0f\x17\xa6\xbf\xa6\x05\xbc\x21\x2e\xc5\xe0\x55\x5a\xc0\xcf\x7f\xb9\x98\xde\x0e\x9f\x9d\x89\x0b\x82\xbd\xb4\x80\xbb\x73\x17\x04\xef\xd2\x02\x92\xe7\x5f\x1d\x39\x37\xa4\x80\xfb\x97\x2e\x08\xf6\xf9\xbc\xed\x5c\xb9\xc6\x93\x17\xf0\x0f\x76\xe6\x5a\x22\x79\x01\x0f\xcf\x5d\x5c\xef\x6b\x5e\xc0\xf9\x1f\x2e\x59\xf1\x2e\x2f\xe0\x5f\x5f\x5c\x1a\xc8\x87\xbc\x80\xec\xb5\x8b\xed\xbd\xca\x0b\x78\xb0\xe7\xd4\x40\x48\x01\x7f\x78\xe1\x0a\x4c\x7b\x41\x0a\x78\x18\xff\xee\xc8\xf9\x81\x33\x83\x13\x17\x47\xfe\xb2\x28\x60\xf6\xe5\xda\xc5\x74\xb2\x02\x6e\x1d\xb8\xa8\x7a\xba\x28\x60\x3a\x72\xcd\xcf\x7c\x51\xc0\xd7\xb9\x6b\x95\xd2\xac\x80\x7b\x3f\x30\x17\x0b\xcb\x0a\xf8\xc7\x4f\x2e\xa8\x0f\xd3\x02\xe6\xbf\x6c\xbb\x18\x6f\x56\xc0\xb7\xaf\x5c\x74\x1d\x65\x05\xdc\x89\x5d\xd8\x89\x16\x05\x7c\xff\xc6\xa5\xf0\xa6\x8b\x02\x7e\x38\x70\xad\x9f\x6c\x51\xc0\xcb\x5d\xd7\x48\x73\x8e\x83\xe7\xae\x3a\x23\x6e\x28\xbc\x72\x41\xf0\x7a\x51\xc0\xb7\x5b\x2e\x0d\xf1\x28\x2d\xe0\xfc\xa3\x6b\x69\xef\x70\x81\x75\xe5\xa2\xc4\xbd\xa4\x80\xbf\x8f\x5d\x7c\xe2\x24\x29\xe0\xf6\x6b\x17\x04\x29\x2b\x60\xf6\xbb\x8b\xbf\xfe\xc5\x85\xdc\xa9\x53\x66\x27\x05\x7c\xf9\xd3\x89\x8b\xef\xe1\x02\x5e\x7e\x74\xc1\x76\x81\x0b\xf8\x2e\x76\xad\x92\x79\x56\xc0\x0f\x4e\x55\xe7\xf7\xb4\x80\xf1\x0b\x57\x60\xe5\xb3\xac\x80\x1f\x0f\x5d\xaa\xce\x59\x5a\xc0\x0f\x5d\xa7\xb1\xb4\x28\xe0\xf9\xc2\xa5\x0b\xbf\xce\x0a\x78\xf4\x79\xe1\x52\x42\xb2\x02\x4e\x13\x17\x87\x3f\xe0\x6b\x21\x77\xc1\xf6\x25\x2b\x60\x4a\x5c\x54\xf5\x17\x97\x24\x63\x57\x37\x0b\x3b\x50\xb4\x8a\x03\x9d\x20\xe2\x3f\x7f\xf6\xe2\x27\x15\x28\xfa\xa7\xa7\x9b\x2f\x36\x65\xa0\xe8\xe7\x3f\xfd\xf4\xcb\x53\x19\x28\xfa\xe7\x5f\x7e\xfe\xe9\xb9\x0c\x14\xfd\xf3\xf3\xa7\xdd\x5f\x64\xa0\xe8\xe7\x9b\xcf\x9e\x75\x01\x5c\xf0\x9f\xdd\xa7\x9d\x9f\xad\x1b\x0a\x53\x5b\x53\xb8\x6e\x65\xc1\x97\x3f\x4c\xec\x86\x99\x8f\xcd\x6b\x61\xac\x95\x90\x16\x06\xc9\xd8\xc7\x03\x36\x44\x08\x95\xbb\x06\x4c\xbd\x13\xaa\xe3\x9a\x65\x8b\x34\x16\x47\x73\xc7\x09\x89\x5b\x14\x93\x68\x86\xe3\xd6\x5c\x05\xf4\x6e\x65\x5c\xee\xd2\x09\x66\xad\x4c\x87\x36\x33\x5d\x6e\x4b\x67\xa1\xee\x94\xf0\x4e\x19\x60\xc1\x34\xca\xad\xa0\xe0\x3e\x01\xd2\x4f\xdc\x4c\xf5\xf1\x80\x0c\x11\x1b\x90\xa1\xd5\xea\xe9\xca\xb7\x64\xcc\xab\x81\xc9\xd8\xaf\xbf\x7b\xa1\x32\xbd\x81\xb7\x2e\xe2\xa0\xf8\xa7\x3a\x88\x0f\x6c\x79\x60\xdd\x1b\x7a\xe6\x81\x3e\xdd\x92\xe7\xad\x8b\xb6\x70\x90\x5d\x61\x4a\x93\x38\xc6\x44\xf8\xad\x75\xb6\xb9\x5a\x52\x2b\x20\x6b\x11\x77\x59\x91\x5c\xbe\x6c\x58\x8d\x32\x20\x01\x60\x06\x00\xd6\x53\xe1\xbb\x4d\x44\x81\xbf\x49\x79\x0e\x4a\x84\x10\x20\x7d\x16\xb2\xca\x4b\x4f\xc4\xc2\xd7\x65\xd5\x65\x5b\x7d\xea\xb3\xaf\x3d\xc4\x7d\xcf\x0b\x59\xa8\x7a\x57\xb9\xac\x8f\x43\xbc\xee\xb5\xbc\x75\x26\xce\xe0\x5c\xa3\x99\x7f\x7b\x7e\x3e\xce\xe8\x75\x44\xe3\x73\x8a\xc7\xe7\xe7\xe1\xac\xb0\x28\xf0\xa0\x72\xfa\xba\x56\x14\x1d\x40\x33\xda\xe6\x53\x27\xad\x53\xe1\xea\xf2\x85\x47\xd7\x80\xff\xc5\x6a\xf2\x2f\x1f\x83\x3e\xf6\x41\x68\xe5\xff\x65\x9d\xbb\xd1\x89\x95\xf7\x85\x1a\x94\x75\x0d\x78\x62\x1d\x38\x84\x0e\xc4\x20\x1f\x71\x79\x12\x43\xaa\x8e\x51\x35\xef\x5d\x25\x95\x6b\x57\xa6\x49\x33\x15\x16\x45\xf4\xbd\xc3\x57\x1d\xfb\xbd\xa2\xb0\xe5\x81\xd0\xf3\xac\x90\x4e\x85\xe8\x0d\xc0\x24\x18\x65\x31\x46\x18\x26\xd5\x9b\x4a\x73\x5f\xac\x58\x60\x01\xb8\x6f\x61\xa6\xb1\x56\xfa\x58\x4d\x36\xe6\x33\xaf\x28\x10\x5b\x64\x73\x76\x37\x5e\xfb\x92\x8c\x97\x4b\x7c\x67\xb4\x05\xdc\x6e\xcb\xcd\x20\xdc\x6e\x3b\x9f\x35\xe1\x3f\xfa\xf2\x8f\x69\x50\x9e\x12\x2b\x5b\xdd\xaf\x00\x76\x64\x6f\x8a\xb1\xbe\xc7\xb9\x8a\x79\x5d\x92\xa3\xad\x67\x1d\x42\xf4\xbd\xcd\x4e\xd7\x83\xde\x61\xd6\xd2\xee\xcd\xea\x75\xb2\x33\x11\xf3\xb0\x35\xce\x16\x24\xb6\x9e\x9e\x04\x56\x8f\xc7\xe6\xc9\xc2\xe6\xf1\xc6\xd3\xd3\xdd\x93\xb3\xfd\xa3\xc3\xd6\xee\xc9\xc9\xd1\x49\x68\xdd\x53\x03\xeb\x6a\x35\x53\x8e\x62\xaf\x35\xd8\xfd\x32\xc7\x23\x86\x63\xf4\x9b\x29\x45\x2a\x57\xd4\x68\xe5\x8b\x41\xaf\xf5\x2b\xda\x1a\xb1\x45\x94\x0e\x3d\x60\x83\x74\x68\x66\x47\x6f\x75\xc8\x4d\x39\xfb\x91\x23\x1c\x98\x0f\x75\xbf\xcd\x6c\x87\xa8\x5f\x6a\x53\x41\x9d\xc7\x31\x1d\x9c\x58\x1d\x18\xbf\x70\xd9\x22\xcd\x65\x7c\x2a\xe5\xf0\xc5\x81\xfa\xc5\x53\xad\x56\xf6\xac\xc5\xbb\xe3\x63\xf8\x15\x2c\x97\xfc\xef\x3b\x6b\x28\x3b\xb5\xab\xf4\xb5\xd5\xca\x40\x9f\xcb\x28\x79\xe2\xaa\xac\xf4\xc9\x66\x34\xe2\x09\x9c\x5a\xb5\x97\xe2\xd8\x5b\x2d\xf1\x33\xe0\x8d\xbd\x54\x8d\x71\x0a\x7a\x05\xbf\x72\xa6\xe6\x99\x0d\x24\x8f\x73\x34\xf8\xd2\x4a\x4d\xc8\x27\x99\xf8\x8e\x27\x92\xc9\xbe\xd8\x36\x8b\x2e\x52\xbc\x83\xc7\x22\xe3\xb3\x9d\x91\x51\x9d\xfc\x01\xf9\xfe\x07\xf4\x41\x5e\xc9\xff\x10\xec\xc8\xcb\x26\xe2\x56\xbe\xfa\xed\xc1\x0f\x83\x0f\xc1\xeb\x2c\x67\xe2\x3a\xfe\x6b\x71\x1a\x9e\x27\x9d\xe2\x74\x2c\xae\xde\xf3\x1f\x2a\xe9\x32\x99\x8b\xe4\x67\x3c\x59\x7d\xc8\x2c\xe9\x67\x8f\x52\xf4\x62\x88\x3c\xfd\xe1\xc1\x0f\x16\x33\xf8\x68\x8e\x1f\xbd\xd2\xdc\xea\x15\xc2\x90\x19\x9c\xfe\xa0\x3d\xeb\x52\x59\xd9\xb3\x22\x4a\xd2\x76\x5b\xbe\x98\x85\x10\xb5\x88\xaa\x6f\x9d\xe0\x13\x74\xd4\x57\x7f\x11\xd5\xf4\xe5\x83\x50\xa5\x85\xa4\x6d\x20\x95\xa1\x48\x2a\xb1\x20\xc4\xc7\x91\x7f\x2a\xd6\xa3\x46\xa5\xad\x4e\xfc\x5e\xa1\x79\xc9\x1d\x42\x5c\xd8\xc1\x56\x38\xe4\x7f\x20\xdf\xff\x03\xfd\x21\xb1\xfe\x47\x70\x44\x8e\x17\xf9\x54\x20\x5d\xfe\xf4\xe0\x1f\x83\x3f\xca\xc9\xe8\xda\x93\xf1\x07\x80\x6f\x90\xef\xbf\x41\x6f\x64\xed\x37\xc1\xee\x6c\x91\x46\x7c\xc9\xf2\xfa\xfa\xc3\x83\x6f\x06\x6f\x82\xc3\x8c\x60\x31\x45\x87\xe2\x46\x33\x4f\x92\x4f\x2c\xed\x64\x33\x11\x0c\xa1\xfc\xf2\xe0\x1b\x00\xff\x44\xae\x30\x39\x93\x34\xbb\x88\xd2\xb3\x69\x92\xb7\xdb\xe6\x37\xc4\xd8\x59\x5a\x3f\xe1\x22\xff\x42\xe6\x2e\x95\xe3\x74\xdc\x6e\xbb\x72\x3e\x64\xf4\x12\xd3\x57\xa2\x9f\xd3\x51\x36\xc7\xed\x36\x2f\x6c\xdf\x1d\x5b\x51\x04\x12\x8c\xfe\x74\x47\xfa\x91\x60\x6b\xf0\x97\x4b\x8c\x97\x4b\x86\x21\xc5\xe8\xb6\x80\x09\x46\x83\x21\x8c\xb0\xb5\x9c\x46\xb3\xb9\x5c\x4e\xa9\x9d\x1a\x27\x54\xa6\x66\x76\xea\x3c\x99\x63\x99\x9c\xdb\xc9\xb3\x2c\x96\xa9\x23\x3b\x35\xcd\x46\x32\x75\x61\xa7\x8e\x23\x95\x1a\x63\xa9\xbe\x1c\xbe\xd2\xcf\x59\x9d\xef\xef\x48\x05\x06\x4e\x31\xea\x98\xb5\x32\xb7\x1f\xb2\xf9\xdd\xb7\x34\x15\x75\x7e\xaf\x80\x44\x1d\xe2\x93\xc2\xca\x6c\x9b\x9e\xe0\x3c\x4b\xaf\xb0\x8a\xcf\x15\xe3\x91\xb8\x91\x2b\xfe\xc2\xab\x48\x70\x50\xfe\xa7\xe4\xc3\xf2\x2c\x10\x9e\xcd\x39\x61\xf1\xd6\xd4\x4f\xc5\xae\xc5\x79\xf9\x5c\xde\x25\xce\x39\x77\x15\xa9\x64\xa2\xce\x5e\xeb\xe7\xb3\x78\x89\x66\x22\x9c\x66\x39\x7b\x99\x88\x37\x9f\xc4\xa1\x0a\xeb\x53\xb5\xc4\x93\xde\x4b\xb0\xf4\xcf\xe5\xb2\x23\x92\xb7\x18\x2b\xd3\xc5\x6f\x03\x12\xef\xe5\x8f\x05\xa6\x09\xce\xf5\x35\xe7\x32\x41\x95\xe2\x23\x8e\x28\xe7\x11\xf3\x85\x78\x12\x3c\x91\x3f\x44\x66\xb6\x60\xe6\x03\x7f\xe1\x82\x63\x8b\xb7\xa4\x7f\xaa\x36\x32\xb1\x5c\x79\x0f\xd3\x88\x4c\xf0\x8e\x38\xa7\x9e\x64\x04\x21\xa4\x97\x35\x8c\x13\x8a\xc5\x2b\x50\x3b\x78\xac\x1a\xe4\x34\x63\xbe\x72\x0b\x45\xe5\xef\xe5\x32\xc1\xf0\x2a\xc1\xd7\x1c\x68\x2e\x0c\xcb\xdf\x5a\x4c\xe2\x88\x2d\xa8\x18\x9e\xfe\xa9\x07\x16\xb1\x88\xcf\x68\xc4\x22\xce\x23\x20\x26\xa3\x68\x9e\x73\xbe\x90\x64\x5c\xe2\x56\xbe\x97\x4b\xc3\x41\x60\x12\x87\xde\xc8\x83\x39\xbb\x49\x45\xc3\xf2\x87\x00\xe5\x5c\xc3\xca\x04\xbe\xd4\xd7\x68\x8a\x67\x91\x28\x29\x7f\xe9\x48\x20\xef\x13\x7c\x2d\x25\x18\x94\x8f\x62\x2b\x14\xe4\xe2\xed\x18\x0d\xaf\x78\x0a\x87\xe3\x22\x37\xc1\x45\x93\x78\x1d\x4d\xf1\xfa\x3a\x24\x81\x9c\x0f\xb4\x8d\xc5\x3b\xd7\xfc\x37\x14\x07\x57\xd5\xdc\xc8\x0c\xf5\x01\x60\xd2\x6e\x27\x77\xbd\x3d\x81\xb9\x0e\xca\xab\x57\xe6\x03\xd1\xe6\x63\x83\xae\xc7\xed\x68\x9f\x72\x31\x21\x43\xb7\x5e\x61\x50\x48\x04\x90\x40\x4f\x25\x8a\x1e\xd6\x50\xd4\x8f\x7c\x10\x46\xb2\xa1\x89\x69\xc8\x0e\x53\x3e\xc6\x55\x31\xa7\xf7\xc1\x47\xb3\x79\x8f\xd6\xe0\x77\x38\x99\x4b\x18\x21\x35\xe0\x39\xdc\x5c\x25\x08\xa6\xe7\x2b\x9b\xad\xbc\xc7\x22\x32\xa5\x0b\x97\x83\x14\x0f\x55\xc8\xe5\x8a\xe2\x3b\xb1\xeb\x3b\x2b\x66\x95\x8a\xe2\xa5\x6b\xce\x85\x57\xbc\xb7\xe9\xe2\x6c\x36\x53\xbb\xc8\x32\x96\x33\x1a\xcd\x43\x1c\x94\xbf\x05\xbd\xca\xd5\x2d\x48\x5c\xb3\x37\xfd\x29\xf2\x1d\x6a\x61\x82\xd5\x4a\x37\x0b\x5d\xa6\x32\x1a\x91\x3c\xe1\x28\xdf\xce\x66\xf3\x24\xc5\x42\xea\xe4\x77\xaf\x81\x24\xe6\x6d\xc7\x6a\xb0\xd5\x63\x67\x3c\xa3\xdd\xf6\x6f\xf0\x80\xff\x1a\x22\x39\x1a\x00\x99\x4d\x05\x17\xb8\xa2\x75\x36\x50\x41\xd0\x25\x2f\xb1\xd6\x01\x3d\x52\x19\x1f\x62\xcd\xe1\x12\x3d\x4c\x6e\xa4\x5b\x03\x26\x7a\xa0\x88\xd9\x43\xb6\xe1\xd8\x56\x70\x34\x5c\x0f\x2d\x8a\x95\xe1\xcf\xe7\x4f\x3f\xd9\x68\xdc\x36\x75\xd5\x96\x9a\x1b\x3d\x03\x3a\x84\x11\x4a\x6a\xe1\xaa\x13\x20\xae\x4e\x88\xa8\xec\x89\x88\xd1\x0e\x20\x19\x24\x43\x44\xa1\x08\xc5\xc8\x7f\x46\xe6\x45\x45\x41\x3d\x5b\x18\xcd\xb1\xa1\x9e\x53\x6c\x6b\x60\x16\xa5\xc8\x37\x7d\xe4\x6b\x21\x15\xc9\x26\x5f\xaf\xed\x8a\xab\xe1\xfc\x37\xcc\xc8\x0e\xce\x19\xcd\x6e\x54\x55\xae\x4c\xca\x87\xf2\x02\x32\x39\xd2\x99\x3a\xe0\x78\xd9\xf3\xfb\xca\x3b\xb1\x83\xa8\xa4\x73\xe3\xe5\xc0\x95\xb3\x92\x83\x5c\x17\x11\x4f\x84\x90\x76\x7b\x4d\x44\xe4\x6d\xde\x4f\x3b\xab\x5c\xe5\x96\xda\x67\x2b\xce\xb0\xbc\x90\x3e\x8d\xae\x70\xeb\xc7\x52\xeb\xf8\xb1\xf4\x7c\x05\xd6\x13\xc2\xc4\x80\x71\x6e\x03\x5a\x77\x41\xb5\xdb\x4d\xfb\x78\xd0\x1d\x5a\xf1\x59\xef\xae\x2d\x86\x50\xad\xf1\xda\xae\xd1\x59\x43\xfe\x8b\x36\x0e\xc6\x69\x34\xc9\x2d\x22\x7b\x6b\x17\xda\x44\xc8\xdf\x74\x14\x3a\xb0\x0b\x75\x11\xf2\xbb\x8e\x42\x5f\xec\x42\xe5\xa5\x7f\xad\xb4\x58\x4e\x99\x3a\x58\xcf\xbb\x9b\x6d\x3c\xd8\xb4\xfd\x78\xbb\xf8\x6e\xc3\x6f\x81\xb9\xb1\xb6\xc0\x96\xb5\xb6\xff\xb8\x83\xdb\x73\x8a\xaf\x92\x6c\x91\x8b\x33\x58\xfa\x70\xa5\x7a\xbd\x54\xa6\xa9\x03\x96\xe3\x84\xe6\x6c\x5b\x68\x19\x88\xba\xce\xe7\xe6\x7b\xa6\xc4\x3d\xe1\x7c\xad\xb6\x1c\xf1\x7c\xcf\xb0\xb5\x0d\x60\x21\xec\xa8\x42\xe0\xae\xa5\x21\x9b\xcc\x85\xad\xab\x15\x05\x74\x88\x01\x3c\xb6\x9a\x39\xc6\xe5\x39\xb2\x1d\xf9\x4e\x25\x80\xf2\x6d\x29\x84\xb0\xb2\xd6\xb8\x42\x25\x71\x20\x9e\xd6\x33\xc7\x8b\x35\xba\x84\x1b\x92\xdb\x74\x18\x98\x44\xc4\x44\x78\xd3\x56\x85\x15\x31\x40\x06\x74\x88\xd8\x80\x0e\x7b\x65\xab\xd6\xf9\x76\x0b\x6e\x11\xc4\xde\xb8\x2f\xb0\x71\xa9\x48\xae\xb5\x53\x97\x87\x36\x69\x0c\xf6\xf0\x10\xb1\xc2\xc7\xf0\x56\xc3\x13\x52\x0c\x55\x87\x92\x3e\xc4\xcb\x13\x1a\x86\xe5\xd2\x2f\x7f\xa3\x5b\x6e\x6b\xa0\xa4\x1c\x0a\xcc\xd4\x81\xf8\x8a\x8e\x3a\x20\xf2\x81\xfb\x6c\xd8\x8b\x06\xd9\x50\xdc\x37\xd8\xc7\x7e\xde\x6e\x57\x69\x06\x32\x98\x4a\xe4\x40\x2c\x06\x5f\x9c\xf1\x09\xda\x27\x53\x4c\x13\x86\xd6\x3a\x82\x6d\x9f\x60\xb8\x87\x91\x77\x7e\x4e\x26\xa7\xc9\x6c\x9e\x62\x85\x86\xf3\x73\xeb\xf5\xeb\x9d\x2a\x57\xdb\x6b\x72\xb5\x4f\xa2\xc4\x09\x46\xd6\x1c\xbf\xc2\xf6\xfe\xb5\x32\xa0\x4f\x70\xff\x04\x87\x2e\xf3\x4c\xbf\x96\xda\xd7\x3f\xb4\xaf\xa7\x6c\xf0\xab\x05\xc6\xda\x1a\x0e\x52\x71\x8b\x44\x2c\xb8\x97\x18\xdd\xca\x37\x82\x4f\x30\x89\x31\xc5\xd6\xc9\x2e\x7b\x86\x38\x4c\x85\xa5\x67\xbc\xc3\x7a\xb7\xa1\x57\x67\x63\x3d\x80\x11\x1e\x74\x86\xe6\xfd\xf5\xb2\xd6\xe7\x2a\x47\x78\x87\x7d\x36\xc0\x36\xcb\xf8\xe0\x2a\x20\xfd\xe2\x76\xb1\x8f\x75\xce\xc2\xb5\xf5\x01\xb3\xd8\xe6\x0f\xb5\x12\x95\xcc\xdf\x2b\xa2\x44\x3c\x0d\xa2\x59\x02\xd7\x73\xfb\x24\x24\x83\x8e\x55\xfe\x0f\x7b\x1a\x9f\x21\xe4\x3f\xab\xb3\xba\x37\x15\xde\xba\xf9\x82\x73\xd7\xcd\x17\xf5\x52\x7f\x62\x87\xa7\x9e\x49\x4f\x49\x15\x42\x11\xa4\xfc\x16\x0f\xba\x2f\x86\xc8\x9a\x48\x26\x43\xa5\xdf\xe2\xc1\xf3\xe1\x3a\x62\xa5\xda\x40\x10\xe6\x96\xc2\xe0\xe9\xb0\x67\x4e\xe6\xfb\x5d\x2e\x0f\xdb\x6d\xb1\x81\x30\x78\x3e\x5c\x2e\x37\x54\x4a\x47\xa5\x80\x1e\xa0\xb2\x25\x48\x10\x85\x14\xd1\xc1\xd3\xa1\x20\x0b\xbe\xa8\xd2\x3d\xca\xa5\xfe\x01\x13\x8a\x0b\x80\x17\xca\xb2\xdc\x25\xd1\x45\x8a\xe3\x70\xad\x03\x93\x7c\x9f\x6c\x4f\xf1\xe8\xf2\x30\x53\xe4\xff\x36\x8b\xb9\x3e\x60\x51\x0a\x65\x96\xd2\xcc\x82\x5a\x2b\x66\x6c\x49\xb5\x9c\xec\x3d\x48\xb9\x2d\x64\x0a\x45\xce\x42\xac\x5a\x28\x65\xb6\x0c\x2b\x4b\xa9\xe0\x4c\x07\xbc\x30\xc2\x10\x0f\x5e\x58\x08\xcf\x78\xc3\x1a\x9d\x18\xe5\xcc\xdc\x8e\xc6\xed\xf6\x4f\xcf\xc4\x65\x0b\xbe\xe0\x04\x75\x07\xf3\x48\xb0\xd7\x26\x85\xe7\x4e\x00\x15\x7b\x39\x3b\xcc\x62\xab\xec\x88\x95\xbc\xbc\x2c\x0a\x19\xaa\x16\x37\x67\x82\x93\xfc\x58\xf4\x2a\xf6\x82\x24\x00\xa6\xad\x05\xab\x3c\x2f\xa4\x9b\xeb\x91\x4a\x63\x48\xa8\xb2\xaa\x1d\x64\x55\x8f\x9d\x60\xeb\x92\xa6\xdc\x94\x97\x6b\x16\x40\x6b\x5d\x53\x66\x5e\x6d\xcb\x4d\x23\x96\xb9\x26\x66\x6b\x65\x41\x9b\x31\x5e\xad\x42\x98\x22\xaa\x93\x2c\x63\xfb\x9c\x57\xd8\x7b\x67\x42\xf7\x75\x94\x41\x8a\x6e\x74\xc6\x29\x8b\xa8\xcc\x01\xb6\xcf\x74\xe2\xc4\x8c\xaa\x23\x8a\x9b\xb2\x37\xf7\x96\x5d\x5f\xb7\xf6\x6b\x99\xf1\xd8\x9a\xe1\x10\xc4\x2a\x35\xca\x00\x23\xff\x1f\x73\xff\xc3\xdd\xb6\x8d\xfc\x8b\xc3\x6f\x45\xe2\xf6\xb2\xc0\x0a\x76\x24\x3b\x49\x53\xd1\xb0\x9e\xd4\x76\x5a\xb7\x89\x93\xc6\x49\xd3\x56\xe5\xfa\xc0\x12\x6c\xa1\xa1\x01\x05\x84\x92\x38\x91\xbe\xaf\xfd\x39\x18\x00\x24\x48\xd1\x69\x77\xf7\xde\xf3\xfb\x9e\x9e\xc6\x14\x08\xe2\x3f\x06\x33\x83\x99\xcf\x34\x52\x5b\x99\x06\x9c\x44\x2c\xea\x65\x18\xd1\x30\x4b\xf2\x74\xf4\x48\xc6\x03\x79\x74\xe7\x6a\x69\x54\x22\x3b\x06\x8d\x3c\x86\xcb\xaa\xaa\xa8\xc7\xad\xca\xfc\x72\x3b\x0e\x62\xb6\xff\x2c\xba\xdd\xed\xea\x76\xf7\x67\x8d\x69\xec\x22\x93\xbf\x7c\x69\xb7\x81\xba\xa7\x35\x43\x6f\xbb\x5b\x5b\x67\x8d\x5b\x7a\x11\xb5\xd4\x32\xe5\x59\xcd\x60\x53\xe3\xee\xb5\x9c\xac\x08\x7b\x6b\x3c\xaa\x93\xf9\xf4\x61\xfb\x3e\xe3\x83\x09\x5a\x09\xcb\x7c\xa5\xb5\xb6\xbf\x26\x3b\x9a\x1a\x22\x28\xcf\xfa\x01\xe0\x00\x69\xaa\xfd\x4e\xc7\xeb\xb5\xfd\xe8\x07\x55\x5a\xd6\x47\xd3\x0b\x83\x84\x73\x1b\xb5\xac\x8a\xe5\x86\xac\xe0\xf7\x20\x27\xa3\x61\xaa\x9d\x3c\x8c\x71\x16\x5d\x38\x53\x5d\xc7\x39\x37\x54\x13\x4e\xc5\xc6\x81\x37\x54\xa3\x41\x9f\x99\xda\x4d\x83\x35\x09\x87\x21\xcc\xd1\x62\x6a\x65\xe6\x48\x3c\x89\xc6\xe8\x99\x0b\x37\x0f\x43\x55\x17\x6a\x88\x69\x16\x25\x03\x07\x2d\x8a\x39\x31\x55\xa9\xc6\x6d\x47\xcb\xb1\xb7\x49\xb5\xb9\x63\x59\xd6\x5b\x96\x98\xb0\xca\x63\x4a\xf4\xac\x9b\x5e\xf8\x01\xe1\x7e\x45\xed\xce\x6c\x4b\xb2\xc6\xa1\x4c\xcd\xe4\xa9\xed\xd9\x38\xa2\x04\x4f\xa3\xae\x7e\x8e\x7b\xe4\x24\xe1\x40\x0b\xed\xb9\x58\x54\x1a\xbc\x48\x99\xe7\x35\x95\x96\x1d\x9d\xf3\x8f\xe3\x9d\x11\x89\xbb\xe9\x75\xa5\x2e\xd4\xfd\x31\x5f\x9a\x05\xb8\x64\x8e\x87\x81\x09\x86\x40\x8d\x4b\x36\xf3\xd5\x75\x6e\x18\x5b\x68\x7b\xcb\x46\x69\x75\xc5\xed\x65\x3f\x1e\x12\xb7\xce\xc6\x9c\xc0\x70\xf8\x3e\xc1\x98\xc2\x79\xde\x12\x09\x41\x4a\x81\x9c\xd4\x34\xe8\xe5\xc7\x8e\x31\xcf\xda\x5b\xb4\x3a\x41\x09\x6f\xad\x0d\x18\x04\xbf\x26\x3c\xc4\xac\x2d\xec\x77\x43\x3f\x9a\x9a\xa7\x38\xa9\x2b\xb1\xf5\x65\xf1\x49\x34\x24\x3c\xac\x24\x57\x58\x63\xd8\xe9\xce\x88\xb4\x58\x01\x9f\x6d\x6b\xe8\xe9\x90\xdc\x45\xce\x5c\x21\xad\x79\x09\x05\x6d\xd1\x4c\xc8\xdd\x58\xc1\xf1\xf7\x11\xed\x89\xf6\xd5\x69\x27\x65\x6b\x74\x25\xba\xc9\x6f\x51\xb5\x66\x8f\x63\x21\xf4\x0b\x93\x63\x79\x6a\x37\x70\xed\x31\x8b\x2f\xca\x4d\xcb\xe2\x87\x9a\x5a\xa3\x0a\xdb\x91\xe8\x38\xe9\x44\xce\x33\x79\xa0\x33\x39\x18\x44\x78\x34\x96\x59\x97\x79\x4b\x06\x06\xe9\x4e\x5e\x3f\xbe\x32\x5c\xfb\x8b\x8e\x53\x29\x0c\x08\x76\xcd\x64\x60\x12\xf8\x9c\xa8\xfa\x8d\x6d\x36\xe4\x2e\x9b\x69\x21\xeb\x0c\x92\x2b\xf5\x53\xc6\xdc\xfa\x75\xe5\xfd\xa0\xd4\xdb\x72\xbd\x6e\x25\xd0\x69\x8e\x7d\x60\xf8\x1d\x49\x18\x26\x45\x9a\xa2\x7f\xe3\x23\x49\x0a\x4c\xea\xd7\xd0\x92\xad\x8f\xea\xd4\xd6\x97\x98\x28\x68\xe2\x7b\xc1\x3f\xd4\x5f\x55\xbf\x9a\x8d\x53\x98\x94\xae\x71\x7f\x9d\x5d\x92\x12\x9a\xf5\x3e\x8c\x4e\x33\xfb\x1d\x0d\x2a\x71\xc0\x28\x98\x41\xb3\xe6\x6e\x1c\xeb\x6f\xe3\x84\xc6\x97\xb3\x86\x56\xa0\x3a\x04\x8f\xdd\xd3\x7e\xc3\x90\xe9\xa5\xa9\x95\x06\x68\xdf\x49\x4f\x56\x54\x49\xd3\xe3\xfa\x4d\x64\x7b\x60\x9a\x1a\xc1\xbd\x3c\x43\xfb\xa9\xc4\x9e\xe9\x93\x29\xdd\x1b\xde\xff\x86\xc8\x01\x1d\x11\xfb\x96\xc6\x75\x45\x25\x56\xab\x59\xf8\x88\x06\x7a\xa2\x2d\x95\x64\xd4\x54\x21\x5b\x48\x41\x87\x71\xa0\x06\x3d\x79\xf8\xe0\xc1\xfe\x83\x14\x44\xb4\xf1\x30\x53\x07\x2c\x53\x83\x01\x16\x57\x68\x3b\xe2\xc5\x54\x0d\x46\x39\x1c\xfc\x05\x35\x53\x95\xfb\xa1\xd4\x69\x5a\x1c\x52\x8d\x5d\x98\x30\x17\x08\x66\xaa\xf2\x83\x21\xd8\xc5\x8d\x1e\xe5\x03\x6a\x2b\x79\x88\x09\x2a\x0e\x84\x13\xdf\x40\xc9\xfb\xa7\x6d\xbb\x24\xc6\x4e\xbc\x93\x11\xd1\xfd\xbd\x6f\xef\x7f\x3b\x1c\x7d\xf3\x70\xe8\x9a\x84\x07\x6a\xb0\x87\x89\x8a\x19\xce\x3f\x4d\x5b\x27\x23\xa7\x3a\x3f\x18\x12\x66\x1f\x06\xa3\x9c\x14\x94\x4f\xc5\x64\xc7\x26\x8f\xed\x3f\xb9\x0f\xcf\x0c\x66\x84\x7b\xf9\xe1\xe1\x68\x74\x00\xc5\x1f\x1e\x8e\x1e\xa6\x69\x34\x47\x20\x94\xee\xe5\x03\x3b\xe4\x8f\x00\x57\x87\x39\xeb\xa8\x02\x6f\xae\x84\x64\x45\x71\xfb\x79\x13\xa2\xdd\xdc\xf1\x16\xcc\x35\x4c\x2b\x3a\x40\xa7\xde\xef\x2a\x40\x9b\x55\x01\x9f\x54\xf1\x5e\xc8\xeb\x2a\x04\xd4\x8c\xc9\x73\xce\x2d\x05\x78\x11\x2e\x6e\x83\x2a\xd0\xf9\x44\x9f\xde\x2c\x0b\xaa\x63\xcb\xb6\x4f\xd5\xda\xac\xf9\x31\x50\x9c\x10\x41\x87\x99\xa8\xc2\xf7\x64\x01\xf4\x4a\x4e\x05\x8c\xcf\xd6\x7c\x33\x18\x30\xf0\xcd\x75\x73\x9b\x89\xc1\x20\x73\x18\x57\x72\x2a\x06\x03\x88\x9a\xea\x1e\x4a\xff\x90\xe9\x09\x68\xfd\x1e\x1b\xa3\xc5\xe5\xca\xd8\x9e\x2b\x52\x92\x02\x8f\x4d\x23\xfd\xec\x1c\x15\xf6\x8d\x8b\x9a\x0a\x4d\x99\x51\x46\x56\x54\x4e\x07\x03\x91\x67\xaf\x0d\x9a\xe1\x89\x4e\x53\x28\xae\x36\xb2\x21\x33\xb2\xc2\xe3\x8e\x5a\x20\xbd\x59\x07\xb2\x69\x44\x0c\x06\x9b\xa0\x2a\x15\xf5\x2a\xfa\x2e\x96\xae\xf7\x29\x98\x1a\xde\x77\x7f\x1e\xda\x3f\x75\xce\xd7\x71\x4e\x2f\x42\xcf\x16\x4c\x1f\xa9\x39\x7f\x6c\xd0\x30\xda\x8d\xef\x4c\xe3\x96\xa4\xef\xd4\x14\x10\x5e\xc1\xc7\x63\xaa\x19\x59\xbe\x5e\x83\x9a\x3c\xbc\xe1\xd4\xf8\x18\xb5\xb8\xa9\xc1\x94\xf6\x9c\xd5\x74\x98\xe9\x83\x50\x4c\xa6\xeb\x83\x08\x94\x9a\x5b\x93\x27\x26\x92\x8a\x31\x68\x48\xd6\xeb\x37\x6e\xa3\x09\xe7\x09\xee\x4c\x31\xd7\xeb\x3d\x67\x91\x39\x1d\x0c\xb4\xe3\xf2\xab\x4b\x95\xa8\xf3\x6f\xaa\xcd\x56\xc5\x3c\xa3\x43\xbb\xc1\x42\x4b\xc4\x95\x0b\x0f\x65\x70\x41\x77\x46\x75\xcb\x33\x76\xc0\x9b\x4b\x4d\x51\x3e\x65\x76\x8d\x74\x2d\x36\x05\x83\xa6\xdc\x16\x84\x92\x1c\x39\xb1\x89\x87\x90\xc4\xaa\xb4\xcd\xa6\xbb\x82\xd2\x56\xd0\x5d\x7c\x19\x56\xf0\x15\x2a\x6d\xb7\x63\xd0\x81\x20\x51\x80\x92\x12\xd5\x58\x72\xc8\x36\x77\x94\x53\xe1\xe0\xa4\x35\xdc\x69\xd8\x94\x46\x7e\x9b\xb4\x67\x33\x6d\xd8\x60\x40\x6a\xb5\x55\xf4\x4b\xc0\xaf\x0d\xc4\x42\x2c\x9c\x5e\xdc\x05\x43\x2c\xc8\x90\x18\x4c\x18\x2d\x06\x23\x4c\xaa\x64\xfb\xe9\x90\x48\x1c\x95\xd6\x7a\xa7\x71\x54\x76\xeb\x9d\x88\x15\x8c\x26\x0e\x29\xdf\x6f\x2c\xeb\xaf\x1a\x1b\x60\xef\x9b\x87\xdf\xa4\xd1\xdb\x1f\xb7\x38\xa4\xae\x8b\x5c\x4b\x3f\x37\x96\xb6\x68\x6a\x32\x79\x38\xcc\xb0\xa6\x1a\xe4\x37\xb9\xb3\x53\xd9\x64\x39\x6b\x27\x50\x39\xd7\x9a\xc6\x48\x0a\xf9\xb9\xd2\x40\xfd\x6c\xc0\xd2\xcb\x26\xff\x6a\x62\x4b\x17\xde\x0c\x3b\xed\x7e\xb9\xb5\xd7\xb7\xd3\x19\x58\xcc\x80\xfd\x01\x62\xae\x17\xd0\x40\x2d\xfc\x82\x95\xee\x4a\x22\x60\x49\x04\xfd\x83\x5b\x41\xc4\x48\xa4\x81\xa3\x03\xe2\x2c\x2d\xc1\x06\x6d\x21\xa4\x5f\x16\x2b\xbe\xd4\x42\xfa\xc4\x80\xeb\xa5\x5d\x33\xc0\x80\xa1\x51\xac\x6d\xd8\x6f\x56\xb2\xc5\x61\xf8\x0a\xfa\x15\x48\xba\x8a\xfe\x68\x90\xb0\x1f\x95\x54\x4d\x47\xb9\xab\x72\x46\x87\xd9\xec\xe0\x51\x36\x1b\x0c\xb0\x99\xb2\xc1\x2c\xa7\x6a\x5a\x0c\x66\xf9\xba\x84\x3f\x95\xf2\x64\xca\x06\x8f\x72\x2a\x08\x8b\x74\xa9\x7e\x64\xb8\xe3\x54\x86\xa4\xf9\x5f\xac\xe3\x90\x0d\x5d\x38\xec\xda\x56\xc3\xd7\xeb\x20\xd1\xd8\x65\xe5\x9e\x5a\x23\xd6\xf1\x4d\x90\x35\xa7\xad\x37\x83\x47\xf9\x64\x67\x34\x6e\xa5\xd6\xed\xf1\xe3\x07\xc7\x72\x55\xed\x8e\xbf\x84\xed\xa8\xbb\x32\x9b\xef\x7c\x1b\x69\x91\x87\x44\x3b\x29\x46\xd8\x65\xe9\x37\x4a\x75\xe0\xc1\xcd\x72\x41\x99\xd3\x83\xd6\x74\x00\x69\x6a\x49\x62\x31\x61\x2d\x6d\x48\x31\x11\x41\x11\x12\xac\xf3\x77\x46\xf0\xe1\x60\x40\x82\xc2\x02\xda\xad\xbb\x1b\xdc\x4a\x5e\xcb\x83\x83\xd1\xc3\x4d\x28\x29\x52\x0b\x57\x98\x01\xfd\xf8\xf6\xa2\xb2\x01\xc9\xb6\xcc\xa3\xe5\x44\x53\xd9\x3c\x8d\xd6\xeb\xe1\x58\xb6\xef\x28\xe7\x00\x61\xa3\xa9\x9c\xce\x79\x1e\x14\x2e\xba\x4e\xa2\xbf\x9a\xc1\x20\xac\xeb\xbd\x07\x0f\x52\x9d\x19\x27\xe0\xf0\x01\x12\x87\x87\x0f\x70\xbe\xa6\xa3\x83\x03\xb1\xf1\x0d\x8a\xd4\xd4\xb2\xa5\x11\x0a\xa6\x93\xb5\x97\xc3\x73\x64\x48\x62\x87\xb3\xcb\x5a\x32\xf4\xd1\xf2\x47\xad\x12\x02\x3c\x08\xad\xda\x0a\x7b\x72\x48\x29\x92\x29\x72\xc6\xa7\x6b\xa7\x4d\xc2\x91\x59\xc1\xb7\x39\x61\xf4\x37\x1f\xde\xd6\xa1\x23\x86\xf3\x7f\x22\x5c\xec\x5a\xa2\x49\xa3\xa9\xe3\xaf\xb6\xd3\x2a\x96\xee\x37\xc4\x70\xc5\x42\x14\x12\xe9\xd6\x08\x94\xcd\x59\xda\xc6\x39\xd9\xef\xc4\x39\xd9\x8f\x71\x4e\xf6\xf3\x71\x65\x78\x4b\xc4\x76\x11\xf7\xa3\xbc\xf7\x73\x7f\x35\x96\x45\x88\xf6\x61\x75\xc7\x64\xfa\xcb\xce\x27\x5b\xcb\xa6\xf2\xf4\xd8\x5e\x3c\x13\x6e\x57\x49\xa8\xd6\x5b\xdb\x6f\x09\x08\x13\x73\x48\x87\x13\xbb\x7c\xcc\x78\x25\xc7\x66\x83\xa4\x83\x7e\xea\xb0\x80\x82\xd6\xf5\x3f\x40\x24\x65\xa2\x2b\x1c\x27\xed\xb5\x83\x93\x42\x22\x01\x8b\x62\xac\x64\x15\x74\x15\xe6\xd2\xd1\x53\x86\x34\xae\xfb\x5f\xac\xd7\xba\x63\xe9\x15\xd9\x73\x24\xeb\x89\xfc\x1d\x20\xe4\x80\x45\xb9\x83\xe1\x75\x7c\x8a\x47\x6b\xf5\xf4\x92\xcc\x2c\x03\xb6\xa2\x55\xd3\xcc\x74\xf4\x30\x0f\x14\x01\xc8\x8e\x63\x81\x4a\xd7\x88\x4a\x23\x9a\xa6\xee\x78\x42\xb6\x00\xfb\x7e\xe2\x29\xde\xd8\x4c\xcb\xc1\xa3\x1c\xa7\xe9\x7b\xbb\x9a\xfa\x23\x3c\x41\x0a\x0e\x2d\x52\xda\x83\x62\x86\x89\xb1\x07\xc5\x8c\x18\x8c\xc7\x25\xdd\x19\xf9\x48\xca\x65\x16\x60\x40\xe1\x84\x13\x57\xe8\x4a\x22\x46\x4a\x32\x87\xcd\xea\xf7\xc0\x82\xce\x25\x2a\x61\x4f\x29\xa2\xc9\x0a\xc6\x69\xd1\xa7\x74\x56\x1d\x94\x8b\x4d\x68\x59\xb3\x29\x26\x9c\x49\x90\x4a\x29\x5d\xe1\x34\xf5\x75\x18\x68\xe5\xfc\xae\x26\x6e\xaa\x2d\x12\x4d\x18\x1c\xe5\x33\xd9\xb0\xed\x5a\xc9\xa6\xfb\xd7\xb5\x44\xca\x20\x4c\x84\x41\xb1\xe7\xc0\x5c\xd6\x9c\x27\x61\x55\xd8\x53\x3b\x48\x8a\x16\x81\x38\x3d\xb2\x43\xb6\x90\x48\x91\x82\xc8\x40\xd7\x26\xcf\x38\x52\x38\x4d\x7f\x36\x63\xdd\xb7\x2c\xd7\xb0\x4f\xd1\x7e\xaa\xbc\x81\x95\xf0\x13\x99\xa6\x8c\x52\xaa\xda\x68\x60\xe5\x64\x69\x3b\x50\x90\x92\x28\x3c\x9e\x45\x37\x12\x0b\x19\x33\xc3\xe1\xbc\x01\xfb\x45\x2f\x9e\x01\x7d\xe7\x0e\x5b\x16\x8e\x76\x45\x47\xc3\xfb\x8f\x1e\x7c\xf3\x20\x65\xa4\x8c\x8d\x20\x9d\x96\x69\x46\xd9\xe1\xe1\xde\x90\xac\xa8\x98\xa8\xc1\x6c\xcc\x1b\x3a\x27\x32\xa7\x7a\xa2\xc6\x6a\x30\xcb\xe6\x07\xab\x6c\x1e\x98\xfe\x05\x2d\xa6\x73\x98\xfe\xf9\x41\x99\xa6\x92\x52\xba\x58\xaf\xe7\x87\xb4\x4c\xd3\x85\x0b\x80\x15\x31\x45\xf3\x8d\x93\x7e\x5d\x84\x93\x62\x5a\xc2\x97\xcb\x34\xfd\xc8\xd1\x12\xa7\xe9\x72\xeb\x8b\x72\x13\x8d\x48\x74\x23\x26\xdb\x82\x37\x9f\xca\x1c\xf4\x0b\xb6\xaf\xb0\x1c\x3b\x98\xc4\xd8\x6a\xfb\x7b\xb3\xb1\x6c\x91\x9f\x4c\x91\x15\xb5\xd0\x9b\xa6\xcd\x1b\xfb\x96\x6f\xcc\x30\x21\xc9\x91\xd0\xb3\x55\x61\xd7\x3f\x5f\x72\x39\xe7\x72\x76\xdb\x13\xb2\x77\x7c\xda\x73\xd8\xd0\x7c\xde\x8a\xc0\x84\xf1\x06\xbd\x42\x6c\x2a\x73\xcf\xb4\x29\xfa\x93\x41\x45\x97\x5c\x8d\xe3\xb6\x04\xeb\x88\x92\x16\x91\xa0\x3d\xf9\x0d\xc5\x3f\x1d\xb8\x6e\x06\x37\x22\x9a\x54\xd4\xdb\x11\x29\x37\x36\xb4\xa8\xdc\x0b\x1c\xe9\x24\x0c\xa8\x1d\x31\xdb\xbc\xa9\x3c\xa4\xba\xb5\x3c\x9a\x43\x42\x22\xe4\xf0\x96\xce\x51\x50\x1d\xdb\xb0\x10\xe6\x7f\x7b\xcd\xa3\xfd\x71\xac\x40\x27\x96\xd5\x6b\x41\xd1\xe7\x1c\x19\x9c\x21\xb9\xbb\xd4\xfc\xb9\x9e\x73\x1d\x14\x61\xad\x94\x48\x13\xc6\x89\xc2\x24\x7a\xdf\xd0\xbd\x75\x25\xb7\xbe\xdd\xb0\x34\xfd\xb7\x2a\x1c\xee\xf0\x4a\x6b\xf9\xef\x35\xb4\xf8\x2f\x1a\x5a\xd8\x95\x23\x89\x5d\x39\xc0\x42\xfb\x03\x24\x50\x88\x34\xfd\x0d\x95\x98\xfc\x64\x90\xc2\xa4\x68\x2a\x6e\xdc\x21\xb3\xad\x70\xb8\xaa\x26\x31\x58\xb0\x20\x39\x35\x03\xc4\x81\xbb\x4a\x47\x07\x07\xb1\x0d\xed\xfb\x06\xaf\xde\x47\x3c\xf5\xec\xce\x9a\x57\xd4\xcb\x38\xf2\x7a\x2d\xff\x0d\x04\xbf\x0b\xe3\xef\xc1\xdc\x2f\x7f\x43\xd1\x8d\xe9\xd9\x05\xf2\x58\xb7\xdf\xb2\x3d\x51\x91\x71\x81\x04\xd4\x7a\x5d\x61\xe2\x6f\xe5\x5d\x76\xbd\x95\xc7\x2f\x8d\x0d\xca\x2a\x1c\x7e\xa5\x89\xa4\x66\xba\xe2\xf9\x7a\x7d\x23\x91\xb1\x22\xa7\x0f\x81\x1a\x6f\x03\x9f\x74\x0d\x2a\x23\x97\xfa\x1c\xa4\x8b\xf0\x0b\xc7\x45\x66\x22\x4d\x85\x65\xdb\x23\xd9\x20\xd4\x20\xe0\xd4\x64\x69\xca\x62\x01\x93\x65\x77\xd5\x21\x2a\xed\x49\x07\x0d\x84\xd0\xaa\x9b\xd8\x9e\xf6\x46\xb6\xdd\x45\xb7\x6c\x9c\x6f\x24\xfa\x68\x49\x58\x25\xfd\xa5\xa9\x5d\x5a\xe3\x13\xde\xb0\xb6\xbe\x94\x9d\xd6\xd6\x5e\xb0\x4a\x66\x05\x2b\x21\xe6\x95\x89\x18\x3f\x9b\xc6\x5d\x64\x04\xb0\xee\x6f\xbd\x77\x16\xff\x59\xb0\xb7\x63\xc6\x68\x67\x6c\x87\x6b\x9d\x62\xd0\x23\x7a\xb5\xa2\xde\xd2\x27\x7e\x67\x10\xc3\xb5\xda\x05\x40\xd1\xb1\x18\xd0\xbd\xec\x0b\x0c\x98\x2d\x5f\x0c\x06\xb6\xc0\x0e\x10\x74\x28\x1a\xdb\xf7\xa0\x34\xb4\xf3\x13\x37\x5c\x4e\xc5\xc0\x72\x45\x03\xba\xb7\x69\x9c\x60\x8e\xbf\xf0\x96\xe6\x47\x92\x26\x17\x17\x10\x35\x87\x1b\xae\xcb\x8b\x8b\x84\x3c\x76\x69\x5a\x2d\x2f\x2e\x6e\xb8\x61\xf6\x38\x6b\x58\xc0\x9d\x77\x0e\xb2\x13\x5d\xab\xbb\xf5\x5d\xb6\x5c\x16\x35\xa5\x0f\xfc\x3a\xce\xda\x8e\xe5\x0b\x51\x06\x7f\xf1\x4d\x6c\x3c\xdc\xde\x61\x5b\xd6\xde\x9a\x9e\xdb\xb5\x5f\xb7\x4b\x34\xcc\x7d\xda\x52\x03\x71\x01\xe4\x83\x45\x1b\x91\x74\x98\xc9\x03\x0e\xd7\x58\xb6\xf2\x48\x18\x91\x30\x67\xb6\x65\xf1\x71\x2d\x6a\x09\xd6\xf5\x0d\x68\x89\x71\xb4\x24\xf3\x02\x07\xe8\x33\xc2\x22\x2d\x76\x99\x94\xca\x80\xd1\x39\x65\xa4\xa8\x9b\x5a\x6c\xeb\xa5\xb7\x24\x8d\x23\x69\x25\x8d\x23\x99\x8f\xfd\x26\x73\x56\x82\xd5\x7b\x4e\x8e\x24\xf9\xec\xa8\xd2\x34\xdf\x60\x9b\x35\xd3\xbe\xb7\x07\x54\x66\x58\xfb\x0b\x1b\x2b\x28\xfa\x36\x21\x6d\xbb\x6a\xff\x59\xaf\xa7\xb9\x27\xf1\xcc\x52\xa6\x6a\x91\x38\xa0\xf4\xb0\x9b\xc3\x0e\x77\x06\x85\x70\x58\x04\xea\x81\x89\x68\x98\xbb\x3e\xf3\x8b\x05\x10\x73\x39\x11\x51\xef\x8f\x8a\x92\x0a\x22\xe2\x4d\xff\x36\x62\xa0\xee\x9a\x62\xd1\x9e\x62\xf6\xff\x76\x8a\x59\x98\x62\x71\xd7\x14\x17\xf4\x0a\xb1\x68\x8a\x23\x1a\x23\xeb\xdb\xd0\x98\x52\x33\x2a\xda\x33\xfb\x58\xe2\x89\x98\x3e\xbe\x73\x66\x05\x79\x5c\xcd\xec\xe7\xcd\x06\xdb\xac\x19\x83\x0e\x74\x01\x2e\x30\x3f\x9b\x70\x42\xef\xae\x64\xb9\x10\x57\x06\x15\x98\x68\x40\x0b\x8f\xf7\xe1\x94\x13\x99\xd7\x6e\xd7\xb8\x31\xeb\xec\x6f\xce\x3a\xfb\xd2\xac\xb3\xd6\xac\x33\xc2\x36\x8e\xd6\x5c\xfc\x5b\x47\xf3\x9c\x97\x15\x80\x77\xab\x12\xef\x67\x2a\x94\xf4\x40\xdb\x90\x29\x42\x93\xf5\x9d\xdd\x22\xa9\xd2\x45\xdb\xdf\xf2\x26\xa4\xb2\x76\x6a\x95\x01\x42\x3b\x2a\xef\x2c\x20\xd3\x42\x13\x23\x5f\x6d\xd9\xf0\xd5\x76\xce\xb6\xb5\x2f\x45\x60\x77\x37\xb8\x2b\x78\x51\x70\x80\xbd\xd3\x32\xbd\xd5\xcd\xc8\x5d\xbe\x1a\xa0\x28\xe6\xd2\x07\x17\xe4\xf2\x42\xa2\xe4\xb1\x64\xc5\xed\x27\xfe\x44\xe9\x13\x69\xf4\xed\x91\xba\x59\x2a\x09\xd1\x1e\x31\xf9\x41\xd2\xb7\x12\x25\xee\x1e\x5d\x14\xf3\xa4\x13\xe5\xa0\xe7\xa7\x9f\x95\xa5\xb8\x96\xe8\x73\xf0\xc1\x1b\x73\x02\xac\xba\xb3\x13\xfd\xa5\xf2\xc5\xeb\x0f\x89\x6d\x0e\x97\x73\x26\x4d\x09\x48\xac\x06\x6f\xc8\xdd\xa8\xa8\x98\x3c\x93\xf4\x89\x7f\x19\x21\x51\x04\xcd\x76\xd0\x74\x79\x43\x3f\x1c\xeb\x33\xed\x96\x0e\x77\x1d\x95\x0d\x82\x06\x11\xa3\x65\xb7\xac\xf1\x04\x19\xea\x2c\x5b\xec\x91\xe4\x6e\x94\x86\x44\x62\x4c\x9e\x82\x84\x8f\xf1\xd8\x38\xd3\x17\xe3\x48\xa1\xae\x51\x90\x23\xfb\x97\x4a\xad\xfc\x05\x6f\xba\xb6\xc9\xf4\xe4\x63\xd0\x6f\x40\x14\xce\xc8\xcd\xa2\x3a\xd9\xcc\x61\x75\x75\x34\xf1\x2a\x6b\x89\xc7\xd5\x15\x86\x21\x4d\x4c\x90\x93\x56\x5c\xab\xfa\xeb\x9d\x91\xfd\x5e\x2d\x51\xe3\xeb\x11\x6e\x58\x3c\x9f\xca\xf6\x2d\xc6\x34\xf7\x57\x69\x1c\xee\xd0\xa4\x6b\x82\xe9\x72\x91\x79\xd5\x92\xba\x5e\xf8\x5b\x87\x70\x24\x1e\xd2\xe1\x84\x4f\x47\x6b\x9d\x53\xd9\xe2\x91\x23\x09\x39\xba\x27\x13\x96\x57\x09\x9d\x26\x1a\x57\x8c\xd0\x88\x52\x2a\xc2\x1b\x4d\x38\xf8\x3c\xd9\x7f\xa9\x74\x9c\x0e\xb0\x45\x3b\x3b\xc4\x67\xe1\x53\xb1\x33\xca\x09\x9f\x8a\x1c\x67\xe2\xd0\x64\xd8\x3e\x52\x9b\xbc\x97\x13\xb1\xb3\x93\x01\x5a\x8e\x24\x7c\x6a\x06\xa3\x9c\xea\x0d\xa0\x72\xd0\xff\x71\x9a\x4b\xa2\x23\x53\x9a\xc6\xc5\xca\x8b\xfa\x62\x45\x1e\xd2\x61\xc5\x11\x4e\x47\x6b\x19\x0d\xeb\x8b\xe6\xac\xb4\xe5\x83\xfa\x80\x1f\x92\x7a\x04\x0e\x0f\x47\x59\x93\xd9\xd6\x03\x24\x76\xf4\xe1\xe1\x08\xc3\x8d\x3d\x3b\x38\x70\x3a\x2d\xbb\x7e\x2b\x15\x9e\x4d\xcd\x8a\x43\x33\x11\x94\x8d\x35\x65\x83\x91\x5f\xad\xff\x83\xc4\xc1\xc1\x08\xf0\x46\xbc\x20\x74\x26\xc9\x4b\x49\x3f\x6f\xc8\x13\x60\xe7\xce\xbe\xbf\x38\x3e\xbd\x78\xf2\xf4\xf1\xf7\x96\xc5\x3b\x96\x34\x91\xd7\xaf\xf8\xcd\x12\x48\xcb\x0b\x66\x16\x09\xf9\x53\xd2\x7b\x7f\xc8\x7b\xd7\x37\xe4\x7b\xf8\xa4\x54\x2b\x3d\xe3\x09\xf9\x24\xe9\x4d\x05\x33\xec\x41\x47\x6a\x90\xe4\x06\x92\xcc\x77\x51\xbc\x94\x33\x19\x16\xc7\x99\x6c\x42\x16\xbc\xfe\xef\x03\x27\x56\x0a\x06\x3b\x44\x15\xb5\x38\x93\xdb\x9e\x62\x4e\x45\x81\x70\xef\x66\x55\x9a\xde\x25\xef\xcd\x20\x28\x59\xef\x4a\xab\x9b\x1e\xb3\x4c\xa8\x27\xb2\x3d\x6f\x40\x96\xe0\x96\xd9\xe0\x99\x9c\x7c\x85\xb8\x0f\x1c\x6c\x37\xf4\x99\x04\xbd\x39\x27\xe6\x0e\x6c\x84\xc6\x45\xd3\xbb\xff\x9b\xbd\xf5\x4c\xdc\xf7\xeb\xf5\x6b\x89\x41\x22\x6a\xd4\xf5\x46\x36\xf0\xa2\xec\x06\xbf\x9b\x60\x7e\x04\xa0\x26\xbc\x0d\xbb\xa4\xb1\x33\x76\x00\x84\x08\x7f\x21\xbf\x0d\xa1\x12\x1a\xd8\x83\x88\xbd\x6e\x78\xc1\xf1\xae\xee\x64\x52\xd3\x6d\x11\x0e\x65\x46\x6b\xd5\x7e\x41\x87\x59\x71\x10\xea\xc8\x8a\xd0\x36\x45\xf5\xb4\x00\xf5\xaf\x44\x0a\x6f\xdf\xe7\x97\x13\xaf\x42\x16\x54\x39\x00\x95\x31\x5b\xd3\x72\x2c\xa8\xda\x78\x3a\xfe\x4e\x22\x41\x18\xc6\xde\x3a\xa5\x4a\xd4\xb8\x8b\xc0\xff\xb6\xe5\xba\x64\x25\x12\x12\x89\xca\x21\x25\xba\x32\x6e\x7a\xf1\x3e\x89\x69\xc2\x8f\x1d\xca\xc1\x63\x99\x7b\x88\x1b\x33\xfd\x5e\xe6\x69\x2a\x2a\x56\x0d\x12\x30\xe1\x55\xbc\xf6\x6e\x4d\xd7\x7f\x78\x95\x02\x8a\x39\x0e\x58\x3e\x7f\xf8\xf8\x5a\xb3\x05\xd3\x70\xd1\x61\xd3\x80\xcf\x49\xa2\xe4\x11\x9e\x70\x0f\x4c\x85\xf6\xf0\x98\xfb\x9b\xb0\x73\x64\x3a\x16\x8b\xc1\x58\x50\xd3\xc4\xe6\xea\xed\x1c\xf6\x92\x9a\xa2\x6f\xf9\x4f\x9a\x40\xf4\xa6\x79\xb5\x40\x0a\x27\x0e\x5a\x8a\xd7\xe6\x71\x0b\x1c\x96\x85\x99\x16\x79\xc6\xdc\x64\x16\x83\x64\x9c\x0c\xb6\xef\x74\x94\x0b\xfa\xe5\x92\xc5\xd5\x2d\x52\x78\x7c\x8e\x14\xc6\x78\x23\x68\xf2\xb9\xe2\xa2\x58\x04\x24\x06\x21\x80\xfd\xba\xa8\x11\x9e\x64\x8d\xf0\x33\x49\x50\x32\xd0\x83\x04\x27\xe3\x24\x21\xc9\xb4\x86\xfb\x11\x24\xc9\x9b\x41\xec\xab\x70\x64\x92\x24\x7f\xc8\x5e\x2f\xc1\x78\x03\xf0\x5f\x83\x6a\x82\x89\xbb\xcd\x21\x96\x7f\xae\x28\x30\x15\x04\x56\x49\x6c\x23\xfb\xb3\x24\x3f\x49\xfa\x9b\x44\xbf\x48\xe4\xf9\xc1\x98\x63\x6b\xa3\x09\x6d\x36\x98\xec\x8c\x30\xf9\xb5\xfa\xa6\xc2\x95\xc1\xe4\x11\x26\x5c\x87\xf4\x0a\x8a\x06\x93\xfb\x98\x18\x4d\x11\x32\x9a\x1a\xed\x20\x54\x8c\xde\x3d\x05\x97\x68\x26\x1d\xd8\x4a\xf5\x2b\x21\x46\xdb\xd7\xc7\xac\x5c\x1c\xb1\xd2\x61\xa9\x84\x1f\xf6\x25\x26\x52\xd3\x7b\xff\x3a\x5c\xff\x6b\xe7\x70\x7d\xd0\xdf\xd9\x59\xef\xec\x1c\xae\x77\x76\xfa\xf0\xeb\xab\x7b\xd7\x44\x6b\x7a\x0f\x1d\xac\x0f\xf1\x3d\x22\xb4\xf3\xb6\x3b\x72\xa4\xb7\xa1\x65\x60\x3a\xf8\x45\x09\x70\xd8\xab\x65\x67\x5d\x13\xd4\x2e\x15\xbb\xcd\x5f\x3b\xd4\x57\x0a\xa3\x49\x7b\xdd\x82\xcf\x4d\x6d\xd5\x1d\x5d\xc2\xea\x06\x35\xf8\xd9\x11\x87\xe8\x8a\x53\xc7\x3e\x04\xfb\x95\x45\xc2\x07\x0e\xa5\xda\x3d\x17\x35\x77\xa6\xa3\xc6\xcd\x35\xe2\xd3\xd1\x7e\xec\x40\xb6\xda\x7a\x7f\x3f\x7e\x3d\xd7\x95\x53\x5e\x6d\xa7\xdd\x07\x9f\x63\xe7\x94\x77\xbf\xcb\x29\x6f\xa1\xe3\xcb\x99\xea\x66\xd0\x93\x23\x46\x0a\xda\x1f\x65\x1f\xb8\xe5\x90\x19\xd5\xe3\x0b\xfb\x94\xa6\xa8\xa0\xfd\x21\xb8\x8c\x0d\xf3\x70\x45\xf0\xda\xbe\xca\x86\x8e\x8b\xf6\x2d\x90\x1e\x80\x4e\x4c\xde\x6a\xb8\xdd\x52\x78\xfc\x8b\x7f\x22\xc2\x7b\xfb\xf7\x87\x18\x0c\x06\xe2\xcf\x3a\x33\xed\x81\xdd\xfe\x4b\x0d\xd6\x71\x05\x1e\xef\x53\xcf\x90\x7b\xfb\xd3\x33\x35\xe7\x48\x05\x23\x1f\xd6\xbe\x07\x88\x8d\xb1\xe4\xf4\x9b\x3c\x63\x7d\x6a\x5b\x6d\x25\xe3\x85\x76\x37\xaa\x84\x11\x51\x9f\x45\x05\x1d\xd9\x73\x47\x76\x9c\x3b\xd2\x12\x98\x63\x8d\x14\xdc\xac\x11\x5b\x81\x26\x0c\x6f\x36\x50\x0e\x23\x92\x88\xd8\xf6\x75\xd9\x5c\x29\x60\x5a\x38\xe1\x5e\x6a\x7e\xe5\x02\xbc\x8d\xe3\xdf\xd0\x97\x78\x2d\x5d\xe9\x40\xe3\xc3\xc7\x25\x77\x2e\xab\x20\x16\x8f\xcd\xae\xdd\x18\xde\x48\x9a\x46\x0c\xf9\x7b\xdd\x72\x97\x74\x95\x1c\xa9\x1b\x4b\xf8\xbb\x03\xab\x07\xca\x24\x75\x07\x0d\x89\xde\x6b\x4d\x92\x3f\x56\x7b\xc3\xe1\xe5\x57\x23\xf7\x37\xb1\x12\x0c\x28\x0c\x6a\x27\x2a\xdd\x52\xd0\x35\x7b\x7f\xe2\x4c\xef\x5d\x2f\x3c\x27\x25\xb7\xdf\xd6\xc3\xe3\x93\xce\xce\x21\xc0\x72\xe4\x80\xa5\x9b\x16\xc1\xdf\x5a\xa1\x45\x56\xb8\x8a\x06\x50\xfb\xec\x2e\x1c\x0d\xf7\xee\xa7\x66\xba\x97\x03\x30\xc2\x5e\x9e\xd2\x9d\xd1\x70\xef\x01\x31\x96\x48\xef\x8c\x20\x0c\xa3\x97\x8d\x34\x19\xc5\xea\x67\x5d\x69\x88\xfb\x88\x57\x0a\xb4\xd1\x10\x87\x5a\x47\xc3\x81\x21\x5e\xc4\x14\x57\xa8\x3a\xd5\xf5\x74\xf4\x4d\x1e\x45\x5c\x15\x6e\x7b\xde\x6a\x24\xe0\x62\xeb\xd0\x99\xfd\xca\x9d\x51\x3e\xbd\x9f\x53\x6d\xb7\xb6\xd7\x14\x82\x30\x67\xcb\xc5\x59\xbf\x29\x82\x1f\xbb\x81\x35\xd3\xd1\x28\x27\x7b\xce\x4c\xd1\xdb\x5f\x81\x14\x04\x1e\x28\xd3\x87\xee\x69\x83\xb4\x5d\xaa\x1a\x7b\xed\x14\x9b\x8e\xbe\xad\x5a\x54\xa4\x69\xb1\x3b\xe7\x86\xcd\x16\x96\xcc\x21\x36\x1d\xe5\x98\xe8\xe9\xbe\x2f\xc5\xb6\x27\x3c\xb9\xf1\xda\xfb\x76\x53\x19\xaa\x45\x5a\xf5\x78\x80\xf6\x1e\x3c\x84\x51\xc6\xb5\xaf\xed\x68\x94\x67\x9f\xdc\x8e\x93\xf1\xae\x4d\xd3\xe3\x40\x87\xf6\xe3\x7e\xc4\x8b\xaf\x72\xc5\xda\x87\xa1\xed\x57\x0a\xec\x23\x20\x95\x39\xf1\xc2\x7f\x66\xb2\xca\xe2\xcd\x03\x44\x5c\xd8\xad\x84\xa1\x01\xfb\x79\x56\x99\xce\x82\xc5\xdb\x30\xcf\x74\x9a\x22\x49\x35\x84\xb8\xed\x7b\x49\x2c\x33\x69\xda\x37\xd3\xfb\x79\x9a\x82\xdc\x9f\x61\x28\x24\x4d\x8f\x34\x82\xdb\x74\x83\x89\x71\xcb\x29\x18\x72\x79\x0d\x04\xd9\xce\x28\xed\x4b\x5b\xd8\xc6\xee\xcc\x4d\xd3\x59\xfe\xe8\x8e\x31\x33\xd5\x48\x13\xfb\xb8\xa6\x7b\x0f\x1e\xb6\x74\x30\xd0\xcb\xda\x9c\xa3\x22\xa0\x48\xd2\xa6\x51\x3e\x8e\xae\x20\xac\x18\x2f\x6b\x8b\x58\xba\x57\x9b\xc4\x56\x56\xdf\x7d\x24\x9a\xf7\xcf\xb8\x26\x9c\x7a\xe0\xe4\xcd\xe6\x29\xc9\x62\xab\x3d\x4b\x34\x59\x4d\x34\x43\x15\x8a\x8a\x29\x9b\x16\xb9\x65\xd8\xd9\xb4\xb0\xe5\x18\x7d\xfb\xb9\x74\xd6\xe0\x2a\xb6\x06\x6f\x9b\x8a\x8b\x86\x21\xb9\x93\x5e\xbb\x06\x03\xa2\x8d\x71\x26\x57\x4b\x62\x67\xf7\x9b\x9c\x08\xea\xad\xce\xfc\xd1\x82\x6b\x03\x84\x61\xc6\xaa\x91\xd8\x19\x65\xcc\x36\xb4\xcb\xf8\x47\x4e\x59\x1e\x2e\xdf\x25\xd8\xb2\x12\x45\x3b\xac\x73\x8a\x49\x61\xe9\x14\xf8\xad\x17\x39\x26\x25\xd5\x53\x01\x5f\xec\xe5\x39\x99\xc1\xd3\x7e\x9e\x25\x97\x4a\xd9\x36\x46\x61\x6a\x27\xaa\x33\xce\xa3\xad\x98\x94\x64\x86\xc7\xb3\x43\x3a\x9c\xd8\xd2\x66\x39\xc2\x63\xfb\xb0\x33\x03\x0d\xee\xea\xb2\x9c\x69\x71\xc9\x11\x26\xb6\xfd\xb5\x5d\xf8\xaa\xaa\x7c\x94\xe7\x99\x2d\xc9\x8d\xe4\x0a\x96\x79\xb0\x91\xad\x65\xc0\x39\x15\x83\x51\x36\xaf\x85\xac\xf9\x60\x80\xf5\x74\x9e\x23\x9c\xd9\x81\x74\x44\xc4\x8f\x3c\x98\x2e\x4f\x47\xce\x8b\x27\x4d\x3f\xd9\x1e\x8f\x46\x39\xb6\xab\x7c\x34\xca\xc3\xda\x43\x38\xab\x76\xfe\x37\x79\x3c\x0b\x69\x6a\x79\xa0\xe9\xbe\x5d\xe8\xb2\x4f\x61\x23\x01\x39\xb4\x24\xbd\x36\x47\xfd\x36\x76\x69\xd7\x31\x85\xe2\x38\xbe\x03\x7a\xdc\x3e\x62\xce\x5d\x2c\x6e\xef\x67\x16\xeb\xc6\xce\xf5\xb6\xc2\xc5\x44\xb5\xdc\x0f\x2e\x94\x19\xd6\x14\x19\xaa\x71\xf0\xf7\xee\xb0\x7d\x96\xd3\x21\x74\x6b\x2f\xd5\x1e\x4c\xa5\xe9\xe7\xd4\x36\x4d\xc8\x9b\x00\x62\x5e\xbd\x45\x1d\xda\xe0\x7a\xed\x9e\x03\xa4\x58\x1c\xe9\x31\x10\xdb\x37\xf6\x48\x8a\xbb\xf3\x4b\x83\x7f\x0b\x27\xab\x90\x25\xd7\xe6\x3b\x7e\xa5\x34\xaf\xac\x8a\xc6\xa6\x99\xee\x6d\x8d\xea\x7b\x96\x2d\x0e\x83\x2d\x97\x5c\xce\x41\xfd\x1b\x98\x8c\x38\x29\x6e\xc7\x45\xa3\x1d\x61\x38\x27\x8d\xe6\x8d\xab\x1a\x22\xcf\xd8\x6e\xc6\xc8\x0d\xb9\x67\x82\x2a\x8f\xf7\xa6\x07\xfd\x0f\xed\x49\x3f\xd9\x2e\xfe\x59\x3b\xcf\xfd\x61\xea\x51\x69\x01\x6d\xc2\xb3\x1c\x20\x42\x3d\xd5\xe4\xa3\x26\xbf\x6b\x72\xa2\xe9\x33\x1d\x01\xed\xfa\x26\x9e\x68\xca\xc9\x53\x1d\x4b\x18\xaf\x74\x5b\x7c\x87\x95\xa8\x9d\x7d\xb3\x3b\x98\x0b\xfa\x83\x46\xc1\x93\x77\xbd\xb6\x07\x32\x64\xa8\xb7\x83\xc0\x5b\xe4\x54\xd6\xe4\x54\xd1\x61\xa6\x6a\x8a\xad\x06\x03\x7c\xa1\x11\xb3\x92\xe1\x54\xe5\xa4\x20\xfd\x91\x97\xa0\x43\xb2\x4f\xab\x24\xfe\xa7\x3a\x4d\x9f\xda\x77\xa0\xc8\x6c\xcc\xf9\x73\xbd\xe5\x7a\x51\x9d\xd6\x95\xa5\xef\x7e\x5a\xdd\xe4\xbf\xb1\xcb\xc9\xe1\x5f\xdf\xaf\x53\xcf\x34\xda\x19\x11\x3e\x35\x01\xac\xc3\xbe\x7f\x94\x46\x96\x37\xce\xcb\x36\x26\x3c\xe1\xfe\x00\xc6\x2b\xd8\xd0\xd6\x45\x44\xa2\x92\xc0\x13\x57\x81\x00\xda\xea\x42\xd1\xef\xef\xd5\xd5\x2b\x60\xde\x31\xc2\xeb\xf5\x6b\x8e\xe2\x66\x38\x3a\xff\x42\x37\x54\xd0\xbe\x09\x6c\xd2\x3e\xc1\x26\x6c\x3a\xcc\xc7\xcf\x35\x2a\x81\xa3\x78\x98\x63\xc2\xf0\xd8\x0d\x11\xc4\x1f\xc6\xdd\x16\x5e\x2f\xf4\x16\xb2\x07\x80\x9e\x72\x6f\xf1\xb8\xbb\xd4\xca\xeb\x0e\xa7\x26\xfa\xd1\xf6\x12\x3f\x6b\x30\xb0\xa3\xe1\x80\x0f\xdc\xd1\x55\x79\xb0\x54\x03\x3a\x95\xf6\x64\xb3\x1c\x5d\xe4\x4f\x1d\x8d\xaf\x88\xc6\x17\x76\x79\x65\x0b\xff\x4d\xa4\x7d\x7a\xa9\x9b\x7a\xa3\x0f\x61\xa0\xb6\x45\xa7\x9a\x28\xb8\x83\xaa\x22\x0a\x44\xdb\xfd\x19\x27\x4a\x87\x66\xdd\xda\x89\x4f\x74\x6c\x98\x48\x8a\x86\xa8\x2a\xb3\x5a\x9f\xe7\x39\x76\xf0\x8e\xaa\x96\x60\xe1\x70\x4b\x2c\x8f\xa5\xd2\x94\x69\xf4\x1a\x24\x3d\x6d\x59\x75\x20\xbc\x6b\x7a\x1f\x93\x87\xf7\xfb\x14\x3d\xbc\x9f\xfa\x34\x8c\x61\x19\x96\x38\xd4\xed\x96\xa1\x6f\x41\x7f\x84\x89\x17\xfb\x04\x51\x84\xd5\x6a\xa8\xfd\xbd\xb4\xac\x8f\x87\x19\x55\x1a\x2e\x1e\xc8\xca\xab\x26\xb3\x15\x9d\x21\x9c\xe1\xea\xeb\x95\xfd\xba\x51\x96\x63\x60\x46\x0f\xd3\x72\xf2\xa7\xab\x5c\x83\x2b\x11\xc3\xe3\x66\x9d\x92\x16\x13\x19\xad\x89\x33\x08\xce\x0f\xab\x2d\x3a\xdf\x8e\x75\xd3\xaa\xf3\x09\xb4\x88\xf0\x86\x33\x7d\xe8\x55\xe4\xf3\xa7\xbb\x8c\x41\xa5\x5d\x96\x44\xd1\xa2\xb5\x34\x75\xbc\x34\xb7\x39\x3c\x55\x93\xa4\x92\x0e\xb3\xf2\x40\x05\x92\x54\x0e\x06\xf5\x58\xa8\x69\x99\x57\x83\xe9\x07\x5e\x91\x62\xba\x9f\xbb\xf6\xc5\x8e\x5f\xdf\x77\xc9\xb4\xb1\x7b\x9a\xb7\xb3\x71\x47\x0f\x3c\xef\xce\x4a\x08\x3d\x1f\x4b\xb8\x9f\x5a\xc5\x00\xba\xbd\xac\x96\x6a\xa3\x40\x67\xd8\x03\xb7\x5f\xad\xaa\xdc\x1b\x57\x15\x3c\xfb\x78\xbe\xf5\x9d\x45\xad\xcd\x09\xea\xf5\xe0\x03\x61\x68\xd3\xba\xa5\xba\x68\xf8\x68\x65\x8b\x8f\xde\xaf\x42\xf2\x5d\xa3\x57\xa5\xe1\xf3\x57\xb7\x4b\x5e\x62\x6c\x19\x5c\xfb\xb2\x99\xee\xc5\xdc\x17\xaa\x10\xb3\x5b\x94\x30\x79\xbd\x2a\x98\x4e\x88\x87\x6a\xfa\xe1\xd5\xb3\x28\x52\x59\x24\x95\x6f\x88\xcb\x70\x3e\xd3\x62\x69\xfe\x46\x96\xd7\x2f\xef\x28\x68\x83\x37\x33\x66\x66\x0b\x9b\x18\x28\xc7\x47\xbd\x41\x18\x87\xd0\xfe\x00\x92\xe0\x01\xc7\xc2\xe5\xbf\x6d\x18\xe2\x36\x4f\xec\x06\xf8\x1f\x0c\xda\xef\x76\xd0\x7e\xff\xd2\xa0\xfd\xfe\x37\x07\xed\x1f\x2b\x59\xb2\x2b\xbe\x73\x79\xbb\x84\xc9\xfd\xff\x76\x08\x7f\xff\xb7\x86\xd0\x8e\xd9\x3b\x7d\x97\x25\xc4\x96\x1d\x04\xa0\xe8\x0a\x79\xfd\x6a\x21\xca\xef\x34\x67\x6f\xcb\xc7\xcb\x65\x21\x66\xc0\x68\x9e\xf3\xd9\x4a\x0b\x73\x4b\xcd\x7f\x64\x5f\x70\xce\xae\xdc\x25\x9e\xbb\xbc\x59\x95\xbc\x37\x0d\x48\x89\x39\xf5\xe0\x06\xe3\x96\xdd\xc1\xdf\x6a\x10\x49\x7a\xa8\xe4\xbc\x17\x42\x53\x5f\xef\xce\xd4\x3d\x79\x7d\xaf\xf4\xef\xff\xf1\xb1\x2c\x71\x12\x59\x2f\xbc\xd1\x7f\x3f\x80\x43\x1d\x25\xa6\x8a\xdb\x60\x62\x73\x9d\xda\xd6\x2c\x0a\xb6\x10\x47\x67\xbf\x5d\x42\x50\xd3\xbb\x07\xc6\xce\x57\x02\x8d\x93\x1b\xf4\x4e\x63\xf2\xdb\xff\xaa\xe6\x9d\x03\xf5\x8c\xdb\xf7\xd5\xff\xae\xf6\xc1\x1e\x6a\x34\xf0\xc7\xff\x55\x0d\x7c\xfd\xb2\x39\xbd\x3f\xff\xaf\x6a\xdd\x4b\xee\x6e\xde\x5b\xad\x8c\xdc\x45\xf5\x5d\x1e\x05\xef\xf4\x84\xff\xbd\x1d\x1a\x07\x63\xf9\xb5\xa9\x61\x15\x88\x47\x52\x8c\x4c\x53\xe9\xe4\x07\x71\x85\x1a\x6d\x73\x28\x0e\x89\x7f\x0c\x7a\xbb\xfe\x30\xdb\xba\x2b\x7e\xc9\xdf\xad\x84\xe6\xf3\x1e\xeb\x59\xba\x1d\x51\x14\x92\x90\xde\xb5\x32\x3d\x16\xdd\xa0\xc9\xbf\x49\x3d\x6a\xb6\xdd\x56\x1f\xe1\xec\x89\xbb\x87\x27\x4d\x5d\xe4\x7b\x3f\x09\x56\xb6\x68\x32\xeb\x46\xb4\x2c\x95\xdf\xe8\x86\x81\xb1\x6c\xbf\xff\xad\xf9\x5e\xb7\xdf\x7f\xd5\x7c\x2f\xda\xef\x7f\x6c\xbe\x67\xed\xf7\x3f\x37\xdf\x17\x22\x42\xda\xe2\x1f\x7a\xa5\x88\xee\xb8\xa2\xb5\x54\xfb\xf9\xf5\xfb\xc8\x66\x74\xd1\x07\x76\x8f\x9f\x3f\x7b\xc1\x74\xc9\x9d\xfe\xa3\xe4\x4f\xb4\xba\xf1\x81\x18\xbe\xd3\x28\x49\x30\x49\x0c\xff\x68\xee\x2d\xcc\x4d\x91\x44\x87\x9d\x2f\x6b\xb4\xd9\x20\x3c\x81\x38\x55\x02\x44\x78\x38\xcf\x94\xf8\xdb\xe7\x99\x90\x5c\x9b\x63\x0f\x6a\xf9\x03\x2f\x96\x5c\x77\x9e\x5e\xd7\xdc\x9c\xda\xac\xdf\xa9\xf9\xad\xbf\x19\xe8\x8a\x96\xcf\x69\x72\x70\xa9\xe6\xb7\x87\x07\x8e\x29\x3c\x3c\xb8\xe7\x1f\x92\x01\xaf\x1c\xe4\x0c\xfd\xfb\x43\xc0\x9b\x23\xb0\x6b\x4b\xdf\xc2\x91\xba\xab\x2b\xbb\x1d\xcd\x46\x1c\x8f\x51\x53\x94\x32\x11\x83\x0f\x06\x1c\x6e\x98\x9b\xb2\x66\x1d\x65\x9d\x94\x5f\x18\x5f\x71\x85\x5a\x43\x3c\x77\xd6\x15\xc7\xaa\xb2\x9f\x6c\xb4\x94\xb6\x32\xed\x02\xd2\xa9\x7d\x03\x04\x22\x62\x59\xc2\x17\x28\x29\x99\x14\x46\x7c\x82\x0c\x3b\x50\x5a\x12\xfc\x66\xb7\x2b\x80\x21\xab\xd4\x0d\xdb\xaf\x9b\x37\x40\x89\x1b\xe7\xac\x23\x63\x53\x29\x15\xd4\x87\x7f\x59\xa0\xad\x3e\xc1\x99\x6c\x7c\xaf\x6b\x53\xd7\x7f\x7f\x95\xb9\x35\xf4\xd7\x35\x07\x48\xe5\xc4\x39\x7a\x7a\x3c\xa0\x04\x0c\x1b\x82\xa4\xbe\x2b\xa4\xe4\xda\x0e\x2f\x75\xab\xad\x0a\x15\xf6\x77\x3b\x16\xd6\xc8\x76\x49\xad\x89\x0d\xd8\xb1\xcf\xe0\x2a\x06\xde\x96\x46\x8b\xe5\xd1\xaa\x34\xea\xe6\xac\x84\x00\x11\x48\xda\x03\x66\x43\xdc\x80\x6c\xbf\xef\x1a\x8f\xd8\x3d\x85\x05\x61\xab\x04\x98\xc3\x4a\xed\x3e\x3c\x90\x99\xdc\xd9\xa9\x75\x45\xc2\xf0\x1b\x24\x31\xe0\x8d\x67\x28\xf9\x78\x53\xc8\x72\x2c\xcb\x51\xe2\xc0\xee\x9c\xb5\x51\x15\x2d\x4d\x96\xa3\x71\x82\x21\xe6\x57\x5b\xdc\xd3\x78\x53\x5b\x15\xf1\x86\xa2\x24\xc3\x62\x57\xaa\x39\x7f\xe5\x7c\xf8\xce\xd4\x9c\xef\x06\x43\xdf\xb3\xe7\xc7\x27\x77\x8f\x82\xc0\x44\x50\x01\x02\xfa\xb9\xb8\x2c\x84\xbc\xae\xb7\xdf\x4c\xd0\x7b\xff\x42\x93\x31\x9a\x8c\xe1\x48\x9a\xac\x6f\x98\x28\x8c\x5a\x5f\x99\xe5\xda\xf0\x62\x7d\x25\x0a\xbe\x2e\x6f\x4a\x3c\x5e\x4f\xff\x95\x8e\xef\x4d\xfe\x91\xff\x13\x4d\xc6\x53\xfb\xb0\xfe\x0a\xe3\x7b\xd7\x82\xac\x6c\x21\x10\x87\x02\x4d\xc6\xe2\x86\x5d\xf3\x3f\xee\xa1\xc9\xf8\xf2\x66\xb9\xbe\x16\x57\xeb\x3f\x97\xfc\x7a\xfd\xe7\xf2\x7a\xbd\x94\xd7\x6b\x23\xae\xae\xd6\x1f\xf8\xe5\x12\xaf\xdf\x8b\x39\x57\x90\xf3\xc6\xe6\xb8\x59\xde\x5f\xab\xeb\x6b\xfb\xf2\x06\xaf\xd9\x6a\x2e\xc2\xcb\xfd\xb5\xba\x66\xf0\x4e\x2d\x57\x25\xc6\xd9\x25\x2b\xf9\xc3\xfb\x64\xca\x76\x3e\x0d\x77\xbe\x1d\xfc\x71\x2f\x1f\xd0\x7f\x7e\x75\x4f\xd4\x7c\xc4\x3c\x3a\x6b\x10\xa7\x55\x38\x31\xbc\x7b\x03\xf4\x68\x26\x20\x1c\x93\xfb\xb1\x12\x78\x02\x58\xc5\xf6\x04\x1f\x27\x83\xd8\xd8\xe0\xce\x72\xca\x65\x21\x0c\x4a\x48\xe2\x82\x3b\x74\x88\x54\xb6\x0d\xbb\x46\x8b\x1b\x84\xf1\x26\x8e\xed\x17\x5d\xb2\xd7\x47\x1e\x01\x8b\x46\x4d\x9f\x79\xd8\x10\x57\xb6\x73\x32\xb4\x6b\x42\xef\x96\x08\x67\x7d\x64\xa8\xde\x95\x08\xe3\xdd\xb9\x92\x3c\xc3\x9f\xe5\xd4\xb8\x70\x46\x39\xed\x0f\x37\x9e\xdc\x0a\xfc\x59\xef\xf2\xf8\x0e\x4a\xef\x5e\xa1\x08\x4c\xbf\xbe\xa4\x6f\x7a\x96\x7c\xde\x90\x6d\x53\x3e\x22\x23\xdf\x03\xf0\xc8\x02\x8c\x1a\x67\x58\x3b\xd5\xb1\xef\x81\xce\x23\xb3\x38\x40\x6a\xca\x44\x7d\xb1\x26\x82\x35\x42\x41\xd9\x54\xd4\x59\x55\x4f\xc8\x5e\x81\x8b\xb6\x75\x94\x72\x21\x17\x95\xed\x5a\x04\x5a\x63\x3f\x79\x2f\xc8\xb5\xa0\x4b\x81\x12\xa6\x39\x23\x97\x9a\xcc\x54\x41\x16\x9a\x88\x9b\x6b\xf2\xe1\x52\x27\x98\xdc\xba\xf7\x33\x55\x5c\x6b\xb5\x5a\x92\xf9\x9c\xcc\x0d\x29\x04\x59\x12\x63\xe9\x0d\x31\x73\x62\xae\x94\xb2\x27\x09\x31\x0b\xce\xe6\xc4\xd8\xef\x6e\xdc\x77\x7a\x49\xe0\x2c\xb8\x14\xf4\x4a\xa0\x6b\x41\xae\x04\xba\x15\x04\xaa\x9c\xcf\x35\x2f\x2d\x43\x6c\xc4\xac\xe0\x84\x95\x62\xce\xc9\x65\xa1\x66\x6f\xdf\xad\x94\xe1\x64\xc6\xc0\x36\x89\xcc\xb8\x34\x5c\x93\x39\x2f\xc8\x9c\x1b\x26\x8a\x92\xcc\x05\x2b\xd4\x35\x99\x0b\x4d\xe6\xe2\x3d\x99\x17\xe4\x4a\x5c\xaf\x34\xb7\x7f\xc2\x67\xb6\x51\x5c\x93\xc5\x88\x2c\xf6\xc8\x62\x9f\x2c\xee\x93\xc5\x03\xb2\x78\x48\x6c\x23\xed\x0b\xd7\x21\xdb\x5b\x59\x92\x1b\x26\x24\xb9\x61\x4b\x72\xc3\xe5\x8a\x48\xf6\x9e\xa8\x82\x2c\x35\x27\xa5\xd3\x8c\x91\x72\x75\x73\xc3\xf4\x2d\x81\x10\x61\x64\x55\x24\x18\xdb\xce\xdc\xf8\xce\x10\x76\x79\xa9\x09\x9b\x69\x25\x6f\x6f\x08\x6c\x3c\x72\x49\x2e\xe7\x82\x5c\xce\x15\xb9\x14\xd7\x30\xba\xc2\x76\x4b\xcd\xb9\xeb\xcc\x95\x24\xfc\x86\x5c\x29\x69\x88\x80\x21\xb7\x0d\x79\x7b\x39\x27\x05\xbb\xe4\x85\x6b\x0d\xd3\x6f\xc9\x52\xcc\x8c\xed\xdc\x3b\xa2\x57\x97\xb7\x04\xc6\x94\x94\xa4\x64\x37\x4b\x52\xde\xb0\xa2\x20\x8e\xe9\x26\xe5\x92\x49\x62\x89\xd7\x5b\x6e\xff\x28\x79\x4d\xca\xd5\x25\x29\x57\x4b\x62\xc4\x0d\x44\xe5\x98\xbd\x25\xc6\x90\x15\x79\xcf\x34\x01\xda\x51\xf7\xe3\x56\x60\x4c\x8e\xdc\xbc\x5d\xb2\xd9\x5b\x3b\x3e\x72\xee\x1a\xbd\xd0\xfc\x8a\x58\x0a\x0d\xae\x83\x85\x92\xd7\x73\x5e\xce\xc8\x52\x95\x76\x8c\x4b\x3d\x23\x1f\x0b\x21\xdf\x8e\x6d\xbe\x04\x93\xc7\xae\x94\x52\xcf\x4a\x6e\xa7\xff\x1c\xa6\xff\x48\x90\xc7\x7e\xb8\xdc\x60\xcd\x78\x59\xbe\xe5\xb7\x84\x15\xe2\x5a\x12\x56\x18\xc2\x56\x46\x2d\x0b\x76\x4b\xd8\x47\x51\x92\xcb\xeb\x99\x2a\x94\x26\x97\x4a\xdb\x19\x9b\xf1\xa2\x58\xb2\xf9\x5c\xc8\x6b\x78\x2e\x97\x6c\x06\xcf\x05\x2b\x4b\x32\x2b\x38\x83\x05\xac\xe0\xdf\x12\xfe\xb1\x03\x32\x53\x37\x4b\x36\x33\x80\xbc\xa9\xdd\x0b\xa5\xe7\x25\x99\x33\xc3\x61\x58\xfc\x91\xe8\x96\x93\xfa\x20\x0b\xc5\xe6\xe4\x8a\xcd\xb8\x5f\x2a\x25\x59\x70\x71\xbd\x30\x64\x01\xa1\x40\x61\x30\x0a\x26\xaf\xc9\x02\x30\x20\x89\x28\xed\x54\xd9\xd1\x29\x67\x6a\xc9\xe1\x69\xa9\xd5\x92\xbc\x15\x32\x4c\x26\xe4\xb7\xff\xac\xd8\xb5\x1d\x40\x65\x57\xda\x5c\x30\x72\xb3\x32\x7c\x4e\xa4\x82\x11\x96\xea\x83\x66\x4b\xa2\x96\x10\xf2\x8f\x43\x43\x34\x2f\x88\xe6\xef\x89\x56\x05\x27\x5a\x7d\x28\xe1\x1f\xdb\x31\xbd\x2a\x78\x49\x5c\x9d\xe5\x4c\xab\xc2\x1e\x4b\xa4\x5c\x30\xfb\x5b\x7c\x72\xff\x94\x7e\x55\xe8\x19\x34\xa1\x04\x4f\xfa\x68\x31\x0b\x07\xa5\x0a\xe1\x5e\x89\x11\xa6\xf0\xc1\x5b\x2c\x9f\x42\x60\xb6\x57\x25\xb7\xfd\x7b\xef\x66\x09\xc8\x24\x79\xef\x7a\xfe\x41\xcc\xcd\x22\xc1\x6e\x4e\xb5\x60\x3b\x0c\x2e\x3d\x6b\x5f\x0f\xe2\x52\x8d\xba\x11\x33\xff\xbc\x32\xca\xce\x48\xc1\x0d\x77\x29\x97\xab\xf2\xd6\x3d\xcd\x3c\x72\xa3\xfb\xa1\x8a\x99\x5a\x85\x22\x66\xaa\x70\x2d\x0d\xbf\xa0\x57\xfe\x87\x9f\x57\xf7\xcb\x21\x6c\xba\x1f\xb6\x21\x5a\x5c\xf2\xf9\xe5\x6d\x48\x70\x04\xc4\xfd\x10\x25\xe0\x91\xfb\x5f\x96\x60\x5e\x5d\xf1\x99\xff\x96\x5b\xd9\x34\xd8\x63\xba\x94\x8f\x4b\x26\xe7\x21\xff\x55\xa1\x3e\x18\xe5\x9e\xaf\x35\xbb\xbc\x0c\x2f\x16\xac\x5c\xaa\xe5\x6a\xe9\x7f\xb9\x35\x03\xcf\x42\xda\x41\xf4\xd9\xde\xf2\xdb\x72\xa1\xb4\x99\xad\x8c\x6f\x8f\x5b\x29\xf5\x63\x51\xb7\xbb\xe0\xef\xab\x57\xe2\xbd\x6f\xcf\x8d\x9a\x33\x9f\x78\xb3\x2a\x8c\x28\x84\xe4\xd1\x4f\xe7\x94\x03\xe4\x0a\x12\x95\x16\x81\x89\xf7\x09\x1f\xa4\xaf\x19\xcc\xba\x16\xaa\xb0\xbb\xcc\x25\xa8\x52\xc8\x92\xfb\xa1\x58\x5a\x42\x1d\xba\xa7\x39\x9b\x2b\x59\xdc\x86\x5f\x05\x7f\x5f\x4d\xb4\xf6\x82\xbc\xff\xa5\x0a\xee\x66\x60\x59\x57\xaa\xd5\x87\x68\x5a\xb5\xfa\x10\x4d\x6b\x58\xd8\xf0\x23\xc0\x91\x86\x5f\x06\x96\xb4\xfb\xa1\xb4\xff\x1e\x56\xe3\x0d\xfb\x18\xff\x12\x32\xfa\x25\xd5\x87\xe8\x97\xb3\xdf\xc7\xe4\x17\x4f\x9f\xa0\x69\x2e\x78\x17\xa9\x99\x73\xf2\xf6\x2e\x79\x6a\x4b\x5c\xf5\x82\x0f\x9f\x9f\xab\x1b\x6e\x16\x31\x1c\xe1\xe5\xea\x8a\x4e\xf3\x0e\xa1\x22\x7c\x03\x3c\xa9\xe6\xf2\xaf\x38\xe8\xe8\xb2\x47\xd2\xfe\x30\x33\x99\xb3\x82\xfe\x12\x23\x3b\xf1\xf2\x02\x6c\xf7\xc8\x98\x6e\xfb\xab\x57\x27\xbf\xfa\x4f\x82\xfa\x56\x97\xbe\x70\xd0\xfd\xe2\xf1\x9d\x1d\x1d\x12\x99\xa6\x0d\x59\xd5\xd0\xf8\x67\x84\x6f\x67\x32\xfc\xf9\xcb\x2d\xf6\xac\x37\x97\xf3\xba\xb9\xb1\x48\x07\xb4\xe1\xa8\x50\x97\x97\x5c\xf3\x3a\x8f\xbf\xa2\xf5\x3c\x39\xf6\xd6\x77\x86\x6a\x0f\x7f\x67\xfe\xea\xeb\xda\xc4\xa0\xbe\x2d\xf5\xd3\xe7\xb9\xcd\x04\x47\xe2\x4f\x3d\x9c\x77\x0b\x82\x1c\x3a\x7a\x06\x51\x0a\xd4\x53\xf5\x81\xeb\x23\x56\x72\x17\x09\xba\x7f\xb9\xe5\xed\x69\x2a\x3c\x9f\x2f\x8c\x74\xff\x97\x8e\xef\xb2\xaa\xa5\x60\xf1\x9e\x1c\x24\x98\x34\x93\x4c\xec\x19\xd7\x10\xc6\xb6\x2c\xc2\x2a\x8c\x44\xe9\x44\x31\xed\x62\xaf\x40\xf8\x27\x00\x00\x6b\x77\xe5\x7c\xab\x45\xb5\x21\xbe\x70\xec\x74\x76\x24\xa6\x45\x9e\xa6\x48\xd1\xb9\x40\x0a\x5b\xce\x20\x24\x2c\x5c\x42\xab\x0b\xbd\x84\x30\xf2\x35\x4d\xbe\x26\x3f\xd8\xf7\xe4\xeb\xe4\xeb\xe0\xa3\x71\xe7\xe0\x6c\xcd\x9b\x2b\xea\x30\xc1\xc4\x72\xf3\x7e\xee\xea\x95\xf5\x1f\xcc\x5c\xd7\xac\xa5\x69\xff\xba\x33\x19\xb5\xa7\xe5\x5e\xc7\xbc\xb4\x3b\x7e\x98\xe0\x7a\x9d\xc1\x2e\xec\x6a\x66\xf3\xa3\x1f\x04\xa0\xb6\xd4\x5f\x75\x2c\xf2\x2e\x5c\x0a\xd0\x0a\x19\x0f\x87\x7c\x63\x77\x40\x50\x29\xbc\x50\xa5\x80\x5c\x06\xa7\xb0\x45\x8f\x9f\x1f\xbd\x86\x3d\xfa\xe2\xf9\xf9\xe9\xab\xd3\xe7\x67\x17\x47\xcf\xcf\x5e\x3d\x3e\x3d\x3b\x39\xbe\xf8\xee\x37\x1c\x76\xf2\x5f\x64\xdb\xd2\xf8\x3e\x61\xa2\xe0\xf3\x9e\x51\xbd\x30\xa3\xbd\x85\xb9\x29\x7a\x97\x7c\xc6\x56\x30\xd9\xbc\xe7\xc1\xb9\x7b\xa2\xec\xcd\x42\xa7\xe2\x48\xcc\xbb\x6a\x65\x9c\x7e\x23\x82\x7d\xa8\xa5\xf2\x0b\x41\xef\x4d\xff\x58\x1d\x3f\x1a\x0e\x77\xfe\x58\x1d\x7f\xf7\xe4\x49\x6e\x7f\x1e\xb9\x9f\x4f\x9e\x3c\xc9\xef\x5d\x93\x0f\x82\xde\x43\xd3\x7f\xfd\xf1\x8f\x9d\xff\xe9\xad\xfb\x39\xbe\x77\x5d\x8b\xbf\x3f\x88\x4e\xe3\xe7\x7b\xe9\xbd\x6b\x92\xa4\xec\x66\x99\x25\xb8\x4a\xbd\x10\x1d\x26\xd3\x49\xfa\x8f\x64\x80\x46\xc3\xbd\xfb\xff\x44\x2d\x04\xb1\x9d\x07\x0f\xf6\xbe\x7d\x88\x07\xcd\xf4\x11\xde\x79\xf0\x70\x7f\x6f\x88\x07\x0e\x04\x78\x90\x64\xc9\xa6\xae\xe4\xc3\x9d\x95\xb4\x4a\x6f\x7d\x77\xef\x00\x9a\x5c\x98\xb8\xc5\xf7\x0e\x21\xf1\xda\x26\x46\x96\x53\xa2\x81\x1d\xb9\x2a\x0a\xa7\x25\x15\xf4\xbd\x58\xaf\x41\xbb\x1c\xa8\xf2\xc4\x0b\xf2\x2e\x3a\xb7\xa4\xef\x45\xa7\x7a\xb3\xb2\xf2\x79\x40\x18\xd5\xd9\x5c\x05\xdf\x31\xf1\x9f\x2d\x0b\x88\x6b\x69\x17\xc5\x4a\x96\xc0\xdd\x24\x38\x13\x3b\x3b\x44\x53\x66\x45\xe5\x5a\xeb\x45\xbe\xd0\xa4\xcd\x87\x85\x28\x38\xd2\x80\xd7\x1b\x16\xcf\x77\x1a\x81\x1e\xf8\xad\xc0\xbb\xed\x43\x1a\x3d\x15\x48\xe2\xf5\x1a\x42\x88\x7b\x75\x40\x03\xe4\xa3\xa0\x21\x47\x56\xc4\x67\x20\x2e\x1a\xaa\xdd\xf8\x5d\x6c\x0e\xfc\x34\x5a\x6c\xb1\x62\x90\xc7\x36\x39\xd1\x6a\xfc\xf2\x51\x9a\xbc\x3a\x79\xf6\xe2\xe9\xe3\x57\x27\xce\x9d\x2b\x10\xb5\x8d\x37\xc0\x77\xc5\xd7\x26\x70\x1f\x05\x45\xe8\xa3\xa0\x1f\x85\x73\xef\xf9\x28\x76\xcf\x9e\x9f\x9d\x40\x78\x64\xfb\x90\x90\x8f\xc2\x26\x82\x2e\x11\x42\x5a\xbf\x7a\xf6\x34\x24\x9e\xbf\xfa\xed\xe9\x89\x8b\x6a\x6d\x9f\xaa\xe4\xa3\x97\xa7\x2f\x5e\xb9\x90\xc9\xf0\x18\x5e\xbc\x7e\xf9\x14\x82\x5d\xbf\x7e\x59\x15\xf1\xf2\xe4\xfc\xf9\xeb\x97\x47\x27\x17\xf6\xdd\x83\x9c\x26\x71\x82\xcd\x14\x5d\x6e\xfd\x1e\x5d\x70\x9c\x0a\x14\xf9\xef\xbc\xd6\xc8\x54\xf3\x86\x7c\x73\x09\xc7\xeb\x75\x92\xe0\x31\x5c\x62\xb9\x86\x63\x9b\x15\x2e\xc9\xf0\xf8\x99\x40\xdf\x73\x84\xc9\x29\x50\xd2\xda\x95\xfa\xce\x5a\x9a\x55\xbc\x7e\x19\x6a\xf0\x15\xd8\x06\xe3\x09\x14\x3e\x9e\x0b\xd4\x2a\xd6\x16\xe5\xb1\xf8\x45\x14\x77\x83\xa7\x29\x9f\x8e\xf6\x22\x13\xad\x57\x4d\xda\x23\xaf\x9f\x6b\x71\x6d\x97\x1d\x6c\x94\xc8\x90\x4f\x34\xb9\xc5\x2f\x6b\x9d\x0e\x47\x13\xb3\x33\x1a\x0f\x31\xd1\x74\x14\x6b\x9f\x76\x46\x2d\xfd\x13\xdf\x05\xf1\xc7\x5f\x5c\x72\x22\x9d\xd3\xf0\x8b\xbf\xcd\x18\x5f\xcc\x94\x2c\x55\xc1\xa9\xff\xdb\xc1\x07\x2f\x98\x9c\x17\x1c\x3a\x74\xe7\x89\x4c\x3c\x1f\x7b\x71\x25\xe4\xbc\x31\x06\x1e\x48\xb7\x7a\xe9\x5d\xc4\x1c\x76\x37\x58\xe4\x5b\xde\x54\x5e\x43\xe6\xa7\xea\xfa\x9a\xeb\xf5\xfa\xb9\xc8\x04\x6a\xb4\x8f\x24\x10\xe1\x3f\xb1\x0d\x97\x69\xba\xf5\xf6\xf9\xcb\xd3\xef\x4f\xcf\x1e\x3f\xed\xf9\x6c\x12\x50\x33\xba\x0b\xe9\xd9\x33\xef\xe4\xd7\x57\x09\xd1\xf5\xa1\x1c\x37\xae\xab\x9b\x61\x8e\x27\x76\x96\x8f\xf9\xe5\x2a\x38\xbb\xad\xd7\xdb\x9d\x83\x65\xe1\x6d\x57\x1b\x15\x34\x86\xe6\x2f\x04\x8a\x34\x85\x62\x32\x03\x0f\x06\x67\xd8\x50\xf7\x10\x16\x79\x88\xd4\x19\x8e\xd2\x33\x41\x51\x57\x14\x3a\x2b\xee\xf1\xd2\x3c\x96\xe2\x06\xc4\x4a\x88\x2d\x91\xa6\x9d\xc9\xeb\x75\xc9\xcd\x2b\x71\xc3\xd5\xca\x60\x88\x8c\x81\x24\x8f\xf6\xf5\xcb\xe6\x8a\x57\x1f\x24\xd7\xd5\x45\x87\xd7\xd0\x34\x43\x7e\x3d\xf9\xc2\x17\x91\x0d\xdd\x97\xca\xbd\x54\xf3\xdb\xc8\x6e\xee\xce\x8b\xe1\x80\x44\x31\xe1\x08\xc7\x37\xe3\xdf\x8b\x2e\x9c\x1e\xcf\x52\x67\xb5\x55\x78\xe5\x8c\x44\x24\xae\x40\xc0\x2b\x63\x4d\x11\x20\x9f\xc4\x7a\xdd\x38\xc8\xc5\xce\x08\x1f\xd0\xfd\xbd\xe0\x85\x61\x62\x7c\x84\x01\x73\x17\x23\xcd\x2f\x06\xcc\x7d\x11\x8a\xde\x48\x2a\x06\x23\x87\xb3\xff\x49\xd0\x44\x5e\xef\x54\x82\x6e\xe4\x97\xdf\xd1\x0f\xc0\x7d\x68\x62\x86\x43\x18\x5a\x0f\x4a\x2e\xd3\xb4\x86\xcb\x72\x3e\x84\x80\x92\xf9\xbd\x40\xc8\x85\xab\xc5\x4d\x1e\x9a\x18\x32\xc4\x95\x11\xc0\xa6\x09\xe7\xe0\xac\x42\xeb\x0a\xb7\xf1\xac\x50\xa8\x1c\x83\xf8\x2b\x9a\x85\x37\x0d\x0c\xea\xcb\xe8\xea\xa9\xb6\x4c\x13\xcd\xb8\x7e\x3e\xc4\x5b\x9a\x72\x27\xb2\xf4\x29\xfd\x14\x01\xd1\xbd\x13\x2d\x4b\x72\x43\x29\x45\xf7\xfb\xe1\xbb\xf5\x5a\x4e\xfc\x97\xe3\x4f\xb1\x89\xf5\x9b\x8e\x21\xbd\x0f\x08\x0f\xcc\xc5\x5d\x9f\xe6\xa4\x09\x40\x5b\x6f\xd1\x61\x66\xea\xa1\x37\x2e\xc2\xc4\x77\x06\xf1\xa9\xc9\x6b\x59\xb1\x0e\x12\xe7\x32\x6e\x90\xc0\xe0\xb7\x49\x9c\xe9\xb8\x89\x4d\xc7\x3d\xe4\xbb\x99\xaa\x06\xe4\x7b\xbf\x86\x7c\x07\x47\xa4\x02\x83\x85\xb7\x03\x17\xd6\x74\x6f\x3d\x4a\x35\x49\x12\x87\xe2\xd7\x87\xb1\x28\x89\x84\xf3\x8e\x42\x9a\x8b\x7f\x15\xac\x94\xc5\x15\xfa\x4d\xa0\x0a\x9f\xb6\x3f\xca\x0a\xb8\x4f\x89\xa2\x16\x3c\x4a\xf5\xa4\x1c\x9b\xe9\x60\xe0\x5a\xf2\x28\xd5\x95\xff\xa7\x1f\x1a\xd7\x14\xbb\x24\xdd\x6f\x32\x23\x12\xdf\x59\xb8\x65\x66\x84\x5c\xb9\x0b\x8d\x15\xfd\x4a\xd8\x22\x27\x7e\x69\x8e\x4b\x22\x08\xcc\x78\xbc\xf1\x56\x77\x15\x96\x55\x85\xd9\x31\xb2\xdd\x9e\x79\x08\xd9\x6c\x4e\x57\x87\x6c\x92\x24\x63\x31\x5d\x0d\x46\x79\x4b\x3c\x7c\x0f\x38\xa3\xb6\x62\x17\x44\x09\x30\x64\x3d\x3c\xf7\xf7\x02\x2d\xc8\x8c\x0c\xf1\x7a\xbd\x67\x3b\x3b\xeb\x53\x3a\xbf\x7b\xac\xfc\x68\xc1\x6c\xa4\x69\x1f\xf2\xb8\xbf\x65\x94\xd7\xd9\x46\xbb\xc4\xd0\xe8\x0c\x26\x5f\xd3\xd2\xce\x5a\x75\x9b\x0d\x05\xac\xd7\x91\x09\xcb\x6f\xf1\x0e\x18\xba\x98\xc0\xd1\xc2\xfd\x4a\x34\x21\xa6\xbd\x4d\x43\x8d\xe5\xed\xef\xa5\x40\xd5\xb2\x5e\xf7\x65\x0c\xee\x6a\x9b\x56\xaf\xbc\x1a\x87\xd6\xa1\xdc\x41\x24\x87\x06\xd5\xdb\xa7\x94\x16\x2e\x88\x44\x81\x99\x9d\x82\xd0\xfb\x91\x7b\x03\x20\xe3\x75\x0d\x8a\x1a\x17\xf2\x62\xdb\xad\x3f\xc3\xd5\xcb\x78\x1a\xef\x43\x01\x0d\x64\xbd\x02\x7f\x16\x03\x7a\xbf\xce\xb6\x11\x03\xca\x26\xa3\xf1\x5e\x0d\x33\xde\xb6\x98\x69\xf8\x9a\x05\x72\x7e\xdf\x83\xbf\xec\x8c\x40\x0c\x90\x83\x41\x0c\xa5\xd1\x00\x1e\xea\x42\xf0\xd3\x0d\x7c\x74\xdd\x40\xe7\xcb\xe4\x60\x50\xb7\x06\x1c\x1d\x22\xf8\x08\xd1\x46\xea\xd9\x82\x7e\xd8\xeb\x84\x7e\xd8\xcb\xd3\x34\xfe\xd5\x15\x29\x43\x5c\x21\x47\xbb\xa6\x3a\xb7\x1b\x6f\x9b\xaa\x56\xed\xf8\xd9\xb7\x83\x8f\x9b\xf0\x4b\xa6\x03\x4d\xc4\xf8\x51\x08\xc3\x13\x83\x87\x44\xc1\x78\x86\x99\xa8\x47\x50\xb8\xe6\xf0\xa9\xc8\xfb\x94\xea\xa9\xc8\xab\xc5\xde\x0b\x31\xac\xec\x9e\xd9\x6e\xd9\x4f\xa2\xe9\xfd\x3c\x49\xc6\x52\x19\x94\x0c\x8c\xbf\x4c\x06\xa8\x86\x88\x4d\xf8\xb5\xc5\x48\xf3\xe9\x30\x27\x92\xda\xfd\xb4\x47\x04\x4d\x12\x02\x8b\x7b\x6b\x7a\x8b\x7a\x7a\xdb\x2b\x12\x88\xe9\x5e\xaa\xeb\x80\x1e\x83\x81\x04\xc4\xc5\x64\x9a\x0c\x8a\x01\x0a\x96\xf4\x87\xc3\xc9\xd7\x34\xf9\x7a\xa0\x06\x5f\x27\x5f\x8f\x93\x04\x0f\x92\x3c\x71\x07\xa4\x25\x29\xf6\x83\xdd\x64\x50\x8c\xef\x5b\xf2\x81\xec\xcf\x5e\x32\x28\x9c\xad\x3d\x50\x29\xe1\x08\x44\x01\xba\xa7\x01\xfd\x49\x20\x46\xc0\x60\x21\x49\x2c\x93\x5c\x10\x46\xd9\x7a\xed\x68\x49\xb4\xb0\xc2\xb7\xd1\x37\xd8\x07\x94\xe0\xac\x81\x42\x6d\x18\x04\x1b\x63\x88\x05\xec\x69\x72\x6a\x10\x1e\x70\xb2\x6c\xe2\x50\x4b\xd6\x20\x1e\x7d\x8d\xdd\x26\x47\xfb\xb1\x4f\xb0\x70\x71\xa9\x5b\x98\xb2\x91\x9f\xf4\x99\x41\x86\x08\x2b\x75\x54\x47\x07\x8b\xbe\x69\x64\x67\x69\xfa\xd2\x66\x67\x0e\x0d\xeb\x95\x69\x38\xa8\x69\xd6\x5c\x08\x07\x07\xa3\x6f\xd6\xe6\xe0\x60\x2f\x32\xb9\x63\xad\x28\x1d\xdf\xa4\x10\xe1\x23\x32\xba\x8b\x73\xec\xc5\x76\xee\x45\xf4\x06\x8d\xf6\x47\xc3\x87\x8f\x52\x8e\x0f\x0f\xa3\xe2\x15\x6b\x06\x92\xb0\x99\xbe\x4d\x79\xab\x11\x65\x5c\xc5\x28\xae\x62\xc6\x5a\x8e\xae\x4e\x7a\xff\x79\xc5\xb5\x70\xb0\xa4\x5b\x3e\xae\x5f\xf0\xf6\x95\x76\x57\xc7\xfe\xbc\x70\x46\x55\x4e\x22\xde\x81\x91\xe5\xd9\x5b\x08\xc1\x51\xb4\xaa\x43\x7b\xc4\x4c\x59\x0e\x90\x07\x11\x44\x05\x6b\x3a\xf9\x40\x14\x23\x7f\x74\xae\xa8\xa9\x43\x82\x54\x31\x7b\x7c\x47\x57\xd3\x61\x4e\x05\x59\x4d\xf7\x72\x3a\xba\x3f\x5c\x6b\xc2\x0d\x5a\x61\xb2\x9a\xee\xe7\x74\x35\x1d\x3d\xc8\x29\x27\xab\xe9\xa3\x9c\x4a\xb2\x9a\x8e\x86\xb9\x3d\x12\x9c\xb4\x3c\xcc\x6d\xca\x28\xa7\x2a\xa4\x8c\x20\x65\x2f\xa7\x65\x48\xd9\xf3\x38\x1f\x64\x35\xfd\x36\xa7\x33\x9f\xfc\x6d\x9d\xfa\x30\xa7\xcc\x7e\xf4\x30\xa7\x7b\x51\x20\xcf\xd1\xc3\x7c\xbc\x22\xab\x08\x64\x83\x6d\x63\x49\x54\x01\xa8\x23\x0f\x51\x86\x19\x5d\xc4\x79\x49\x3b\x22\x2b\xc0\x28\x7a\xd7\xa5\x87\xf7\x6b\xe7\xa3\x87\xf7\x53\x17\x63\x03\x7f\x76\x7f\xa9\x24\xcc\xf1\x95\x54\x13\xe6\x38\x21\x2a\xbc\x17\xff\xcc\x20\x9c\xb1\x56\xb0\x11\xdf\x86\x62\xb2\x33\x1a\x17\xad\x30\x22\x61\xbc\x0d\x02\x5f\x9c\x38\x26\xca\xa2\xa3\x6f\xa5\xdd\xe1\x05\x9d\xdb\x3f\xaa\xee\x29\x6d\xbb\x87\x39\xff\x22\x57\xf8\x67\xdb\xea\xb1\x24\x70\x38\x8e\xc1\xaa\xa2\x72\x3a\x75\xf1\x26\x7d\x78\xc9\xa8\x5d\x63\x33\x69\x05\x26\x19\xef\x8c\x48\xd3\x79\xb6\x91\x72\x22\xe7\xad\x1c\xb7\x85\x90\xd7\x4f\x59\x09\xf9\x82\x77\xc2\x77\x3e\xe0\xb4\xab\x12\x86\x7b\x3c\x24\x2d\xdc\xf9\xf1\xd0\xcb\xc9\x82\xc0\xe8\x8e\x19\xb9\xe1\xfa\x9a\xcf\xc1\xe2\xcb\x7d\x5a\xa8\x19\x2b\x20\xda\x63\x68\xbd\x30\x82\x15\x2e\xb8\x7c\x40\xf3\x12\xee\x17\x64\x50\x2b\x53\xff\x00\x81\xd5\x3f\x4b\xf0\xf0\xb2\x4f\x6d\xaf\x2f\x88\xec\x59\xc7\xdf\xf4\x31\x39\x4d\x94\xcf\x87\x12\x05\xa0\xe1\xf8\xf9\x8d\x30\x0b\xb5\x32\x3f\xa8\xd2\x17\xa3\x79\x29\xe6\x2b\x56\x9c\xbb\xac\xbe\x7d\x1e\xc1\xd8\xd7\xe4\x7e\xdc\xf9\xe9\x91\xcf\x1c\x7f\x5b\x0d\xe7\xd0\x55\x5c\xff\xde\x6c\xd0\x90\x14\x13\x36\x66\x69\xca\x2a\xbf\x6b\xf0\x7b\x13\x6d\x9c\xb4\xf8\x26\x13\xee\x1e\xea\x9f\xb4\x82\x6f\xb1\xe4\x1c\x15\x1e\x3f\x86\x39\xcf\xbd\x4a\x40\x50\x55\xe0\x1b\xe4\x5f\x51\x55\x81\x87\x30\xb8\x08\x84\x57\xf6\x81\x2a\x8c\x89\x8a\xac\xc4\x9a\x27\xd3\x30\x82\xf0\xdf\x19\x45\xf6\x56\x55\x90\x23\x0f\x14\x90\xb1\xc1\x00\x57\xe0\x8f\x84\x47\xc4\xac\x4e\xb3\xfb\x63\x1b\x4b\xb7\x01\x68\xce\x82\x38\xf8\x03\xdc\x6c\x06\xd3\x63\x4d\x5d\x0c\x46\xc0\xc9\x8c\xfc\xd1\x5f\x33\x34\x22\x9a\xc8\xca\x45\x76\x37\x88\xed\xd1\x31\x79\xeb\x0a\x15\x64\x44\x24\xae\xdc\x02\x9b\x21\x9c\x5a\x69\xb4\xef\x82\x67\x19\x66\xc4\xec\xa8\x41\xdb\xd3\xd4\x1f\x35\xd5\xfb\x00\xe0\x09\x2f\x5f\x33\xb4\x47\xa2\xc6\x86\xb6\x31\xea\x6e\x91\x1c\x84\x68\x74\x2a\x37\x79\xe7\x2f\x70\x88\xc7\x50\xed\x54\xe6\xd8\x32\xba\x2c\x98\x3b\xeb\x10\xd6\xa0\xbb\x63\x42\x06\x33\x92\x27\xf6\xad\xeb\xdc\x70\x7b\x14\xa0\xc7\xba\x52\xda\x7b\x7c\x8d\x07\xe4\x04\xa0\xe7\xab\x09\x7a\xcf\xda\x3e\xdd\x36\x27\x78\xf9\x3f\x78\xd8\xa7\x00\xd1\x21\x70\x98\x3e\xd7\x71\xcb\xfc\xc0\x4c\x72\x9b\xd8\xb8\x9b\xe9\x0e\x05\x4e\xf9\x06\xf1\xae\xe0\xe3\x35\x40\xc2\x6d\x68\xc7\x5e\x0d\xda\xe2\x18\x28\x07\xb2\xde\x67\x96\xa5\x2a\x2a\xa6\xf2\x0b\x8c\x94\xf2\x8c\x94\x72\xb0\x2a\x35\x2f\x55\xde\xc5\x4b\x95\x9e\x97\x2a\x2d\x2f\x05\x50\x2c\x4f\xec\xcf\x21\xf8\x5e\x77\xeb\x2a\x00\xbe\x2a\x7c\x6f\x32\x43\x57\x1a\x30\xdf\xae\x00\x63\x07\x47\x41\x63\x1d\x32\xcf\x9d\xb7\xce\x8e\x31\x11\xd3\xfd\x3c\x03\xa1\x74\xb8\x77\x3f\x15\xb6\x88\x34\x35\xf6\xd8\x1a\x61\x22\x00\x10\xc5\xbe\x01\x34\x15\xf2\x6f\xb5\xa8\x6e\xc9\xe8\x4b\x32\x8a\xf7\xaf\xce\x7e\x72\x90\x57\xef\x19\x12\x96\x98\x55\xdb\x8f\xe8\xe9\xa3\x1c\xbb\xfa\x2b\xbd\xc5\xec\x8e\x8d\xd4\x98\xac\x19\xed\x08\x01\x1b\xda\x39\xf3\x73\x35\xc3\x31\x96\x47\x33\xd0\x6c\xc8\xbb\xf2\xb3\xb4\xb2\x63\x02\x13\x34\xc2\x9b\x7e\xb7\xa8\xba\x50\xa5\xf1\xe4\xfa\xf9\xf2\x48\xcd\x5b\x1c\x63\x30\x8c\xed\xe4\x1a\x1b\x73\x03\x3a\xc7\x83\x21\x7e\x65\xd0\xff\x08\x9c\x45\x7c\xb9\x20\x05\x04\xa2\xd4\x2e\xc4\xa5\x7d\xc8\x8e\x0c\x2a\x08\xc3\x44\x79\x86\x11\xd8\x45\xbf\x03\x5f\x19\xb4\x33\xc2\x1e\x53\x24\x73\x20\x24\x5d\x24\x64\xfe\x6f\x90\x90\x97\x0d\x12\x32\x0f\x1a\x99\x98\xb6\xd6\xdd\x5e\x78\x62\xb6\x20\xba\x35\x45\x4b\xda\x8e\x88\x1b\x1a\xb3\xf4\xf3\xb3\x8c\xe6\xe7\x8a\x46\xe1\x76\x43\xc6\x2b\x3f\x39\x57\x64\xcf\x4f\xce\x1e\xde\xf4\x87\xf5\xf9\xf7\x7a\x39\xdf\xa2\xcf\x75\x1a\x50\x2b\xb6\x5e\x07\x84\xaa\x6f\xf6\x31\xf9\x02\x70\x95\x99\xee\xe7\x80\x5d\x55\x8d\xae\x23\x6b\x11\x0c\x57\x07\x5d\xb3\xcc\x33\xa3\xfd\xa5\xe3\xf2\x7e\xe6\xe1\x40\x62\x69\xda\x2f\xd2\x54\xec\x5e\xf2\x6b\x21\xab\x07\x04\x11\x45\xfc\x09\xa6\x31\x89\x48\x65\x55\x6d\xf5\x29\x97\x73\xff\xa7\x41\x5e\x6f\x3b\xb8\xcc\x53\x57\xff\x5e\xaa\xa1\x76\xb7\x2e\x6c\x55\xa6\xd2\x62\x0c\xd3\xd4\x8b\x94\x7b\x43\x27\x6b\x12\xe9\x90\x0d\xa2\xd5\xc4\xe2\x8a\x6e\x58\x14\x61\xed\x07\x1e\xef\xfc\x76\x94\x6a\x22\xb6\x22\x59\x43\x70\x86\xca\xc2\xba\x62\xf2\x45\x9e\xb1\xad\x4d\xde\x4e\x41\x23\x22\xa7\x22\x6f\x22\xc0\x5d\x56\xcd\xe9\x6b\x83\xf0\x7a\x8d\xb6\x21\x16\x82\xd9\x4d\x2b\xdc\x11\x8b\x93\x4e\xe4\x3c\xdb\x3a\xda\xd6\x6b\x2e\x01\x3a\x87\x30\x0d\x68\xd5\x11\x84\x9d\xdc\x6d\xf0\xaa\x44\x51\x51\x05\x2c\xae\x0e\x01\xe8\x9c\xca\xc9\x8c\x7e\xe4\xa8\xc4\xd9\x2c\x4d\x4f\x19\xc0\x3b\x94\x6e\x0b\xad\x28\x84\x77\xe2\xf6\x0c\xc1\x19\xd3\x68\x45\x6a\xba\x57\xa4\xe9\x73\x86\x86\x44\xed\x08\xb2\x82\x33\xa3\xc0\x64\x96\xa6\xe8\x47\x8e\x3c\x9c\x03\x31\xd8\x4a\x6f\x2b\xbf\xdd\x89\x24\x6f\x38\xb4\x18\x93\xd1\xde\x23\x4b\xe6\xf7\x1e\x55\xb8\x0d\x77\x45\xf0\xd9\x1a\x19\xd1\x1a\x19\x7f\xef\x6f\xeb\x2b\xea\x20\xe7\xdd\x71\xdc\xc3\x52\x63\xf5\x60\x29\xaa\x33\x75\x20\xee\x1a\x1a\x50\x9a\x3f\x86\xe8\x35\x81\x82\x94\x31\x5d\x2d\xd7\xeb\x61\x95\xf6\x0b\xd3\xa5\x13\x2f\xab\x24\x10\x27\x70\x9a\x3e\x63\xa8\x74\xa1\xb1\x1b\x84\x90\x3c\x36\xa8\xa8\xc6\x27\x56\xa6\x1c\x35\x24\xff\xbf\xad\xe2\x9b\xc4\x3f\xc6\x6f\x38\x44\x67\xaf\x05\x99\x06\x1c\x4b\xcc\xf7\xc2\x00\x0e\x46\x9e\xf1\xad\x00\xa1\x58\xa5\x3d\x28\xa8\x0e\x30\x58\x3b\x2e\xd4\x23\xac\x0d\x3c\xe6\xd3\x22\xcf\x38\xc4\x34\xa6\x2a\xc6\x67\x62\xb1\x69\x15\x48\x43\x6d\x57\xb9\xf5\xda\x74\x71\x72\x93\x10\xcf\xff\xdc\xf2\xc1\x0e\xf0\xb4\x3e\x82\x39\xc4\x9c\x2c\x2d\x37\xca\xb4\xfd\x53\x2d\x86\x63\x7e\x65\x7f\x2f\xc5\x32\x3c\xd6\xfc\x2a\xdf\x2d\x67\x0b\x7e\xc3\x6c\x2a\x04\x60\x28\x71\xac\x01\x3c\xff\xa2\x12\x63\x6f\x38\xd0\x64\x4e\x57\x03\x41\x16\xf4\xae\x63\xa9\xc2\x4b\x37\x31\x5e\xba\x3e\xe0\x0e\xfc\x99\xb3\x08\x39\x1d\xad\xc8\x1c\x93\x65\x17\xa0\xd8\x6c\x32\x43\x78\x3c\x0b\x79\x17\xd3\x51\x4e\x9d\x74\xcd\x49\x25\x7d\x8c\x17\x95\xc5\xea\x58\x92\x77\x8e\x04\x39\x51\xae\xea\xf2\x58\x91\x3a\x38\xa7\x21\xe0\x5d\xb4\x08\x3a\x98\xdd\x2b\x51\x14\xc8\x29\x42\x30\xd9\xe2\x49\xc7\x2b\xe2\xec\x9d\x55\x94\x36\x27\xdb\xfc\x84\x97\xb1\x9b\x94\x69\xdc\x1f\x92\xd6\xc9\x66\x93\xb6\xc4\x8a\x71\x7f\x44\xba\x64\x11\x9b\xde\xe0\x50\x83\xe8\xdc\xe6\x75\xbd\x50\x1b\x71\x49\x8d\x94\x76\xc6\xea\xb8\xae\x7f\xb6\xb3\xc4\x00\x7a\x41\x64\x06\x68\xb9\x46\xc1\x3f\xc7\x03\x5e\xf3\x2e\xbe\x88\xb0\x1c\x5f\xf2\x6b\x51\x1a\x7d\x3b\xee\x0a\xea\x38\x61\x08\x8f\x19\xb1\x6b\xf5\x4b\xf9\x8a\x49\x81\xf0\x38\x8c\x70\xad\x27\xf0\x8b\x79\x5c\x12\xb7\x98\xc7\x4b\xd2\xb1\x91\xc6\xfd\x51\x1c\x34\x67\x8b\x19\x78\xc3\xec\xe1\x5f\xe1\x6f\x8a\x20\xd4\x8e\x91\x08\x01\x07\xba\x04\xcb\xdf\xec\xce\x0e\x10\xfc\xa2\xf2\xea\x8b\xa9\xd7\x5b\xb6\x75\x01\xda\x13\xb2\xc7\x41\xa3\xdf\x36\x9b\xd4\x51\x44\x52\x9d\x67\x48\xd2\xaa\x49\x9f\x37\x63\x89\xb7\xf3\x4f\x2c\x53\xea\x8d\x29\x89\xc0\x10\xba\x9e\x4e\x0d\x11\x79\x87\x83\xd6\xc5\xd6\xde\xf6\x84\x9e\xcc\xe8\x1b\x87\xa4\x4a\x56\x40\x02\xed\x59\x99\xf5\x55\x50\x39\xac\xd2\x14\x95\x74\x35\xd5\x39\x9e\xa0\x9f\x19\x44\x06\x2f\x9d\x66\xef\x99\xc3\x7b\xec\x62\xbb\x7f\xf4\x70\x59\xa3\x87\xa9\xb4\x22\xcb\x1a\xc1\x1f\xfa\xf0\x3e\x04\x4a\xf3\xa4\x16\xe3\xf1\x7e\x6a\xfc\xed\x33\xd2\x1d\x58\xc5\xf5\x05\x3b\xf7\x37\x9a\x80\x0c\x30\x4e\xae\x94\xf6\xa9\x0b\x73\x53\x3c\x51\xda\xa5\xdd\xb0\xb0\x76\xec\x2b\x9b\xf0\xd8\x25\x8c\x13\x67\x15\x67\x6e\x0a\xff\xb2\xb2\x92\x4b\xc6\x49\xb0\xe8\xf7\xaf\xec\xcf\xe7\xf6\xe7\x38\x09\xfe\x21\xfe\x8d\x61\x97\x40\x07\x92\x31\xdf\x20\x8d\xed\x39\xec\x02\x8a\x4e\x0a\x24\x88\x77\xa1\x5b\xaf\x93\x84\x68\x3c\x16\xe4\x13\x07\x74\xad\x46\x4c\xfa\x99\x83\x84\x7b\x6d\xe0\x56\x12\xcd\xe2\x97\x93\xc6\x2f\x60\xf3\xc6\x33\x3b\xad\x22\x5e\x57\x1f\xb6\xd6\xb0\xbb\x0f\xb5\xec\xd5\x76\x5c\xd7\x98\x8f\x88\xce\x89\xb0\xe1\x7c\x17\x9c\xd9\x78\x13\x22\x32\x3a\x00\x07\xd1\xf9\x97\x67\x3f\x0a\x24\x49\xb1\x1b\x62\x9e\x94\xa4\x3f\xc2\x69\x8a\xc4\x7a\x8d\x04\x9d\xe6\x98\x30\x89\x02\x5f\xc6\x49\xe1\xe3\x68\x7e\xe4\xa8\xc0\x13\xf4\x14\xd6\x10\x26\x22\x8a\xc3\x83\xc7\x7e\xaf\x15\x35\x66\x41\x15\x3b\xd8\x72\x34\x1e\x7e\xd0\x9d\x22\x9f\x93\x64\xbc\x33\xda\x44\xc7\x38\xc3\x9f\x05\xed\x0f\xc9\xef\x0c\xc9\xa0\x8c\x0a\x4a\xac\x70\xc5\x96\x35\x71\xe5\x58\x87\x71\x80\x65\x77\xb2\xb2\x8a\xce\x59\xbe\x84\x40\x7d\x5c\xa7\x69\x47\x22\x2a\x6b\x2f\xdb\x19\xed\x8f\xc8\xca\xfe\x33\xa7\x5e\xcd\x56\x35\xc0\x69\x11\x16\x74\x98\x2d\xea\x4a\x17\xa1\xd2\x25\x65\xd3\x45\x9e\xc9\xdd\x48\xf1\x4a\xdf\x19\xd4\x48\x20\xcb\x88\x8d\x22\x27\x6e\x13\x1a\x32\x27\x4b\x4c\x3e\x32\x34\x27\x4b\xcb\x77\x06\x39\x6d\x8b\x4d\x47\x15\x54\xd8\xa3\x9a\x81\x5b\xb6\x18\xb8\x46\xf2\x63\x67\xa0\x31\xac\x12\x2c\x53\x87\xe3\x92\x46\x7b\x8f\x1c\x7f\x7c\x45\x97\xad\xf0\x92\x59\xdf\x72\xc0\x57\x71\x84\xc9\xf5\xfa\xaa\x0a\x30\xe9\x9e\x7d\x7c\x49\x5b\x26\xe2\x5b\x71\x1a\xf9\x9d\x71\x1a\x3d\x97\x8b\xc9\x8c\xf6\x87\x98\xf4\x57\xdd\x55\x75\x17\xdf\x08\xea\xd8\x95\xdc\x55\xd1\x0a\x2a\x9a\x0f\x06\x6d\x05\x43\xa4\xd8\x69\xf2\xe2\xda\x33\xcf\x20\x5d\x39\x03\x0e\x66\x39\x23\xb7\x8e\x49\x15\x30\x78\x4b\xf4\x2a\x0f\x24\x60\x8a\x79\x65\x89\x9e\x96\x39\x59\xd1\x99\x27\xca\x64\x1e\xf6\x81\x58\xaf\x5f\x0b\x64\xb0\xdb\x0e\x2f\x18\x5a\x11\x81\x03\xea\xff\xdc\x6e\x98\xb7\x36\xad\xb4\xab\x42\xd9\xe7\xd9\xae\xd7\xca\x43\x90\xda\x4d\x2d\xbd\xa0\x2d\x67\xd9\x00\x14\x66\x25\xed\x6a\xb2\x1f\x62\xb2\x9d\xd1\x41\x94\x35\x32\xee\xef\x61\x0c\xc4\x3d\x92\xbb\x28\x23\xe1\x58\xa1\x05\x31\xa1\x25\x54\x6d\x9c\x55\x65\xb1\x2d\xf4\x88\x2b\x64\x70\xc3\x9e\xac\xe2\xdd\xed\x38\xba\x3b\xf2\xda\x14\xac\x62\xcf\x19\x95\x53\x03\x51\xfd\xa2\x2b\x29\x86\x1b\xa1\x61\xf7\x87\xa3\x84\x24\x27\x1f\x97\x4a\x9b\x9e\xba\xea\x49\x76\xc3\x7b\x5f\xd7\x78\x2b\xf0\x39\x49\xbe\xee\x49\x65\x7a\x57\x6a\x25\xe7\xfd\x04\xe3\xcc\x07\x8a\x33\x56\xbc\x05\xb4\x73\x7b\x92\x16\xb5\x2b\xf4\x97\xf7\xaf\xf4\x76\x3d\x24\xd2\x87\xff\xc0\xba\x30\xea\x58\x63\x5b\x66\x4d\x45\x67\x87\x2a\xcb\xaf\x08\x05\x0e\x25\x5d\x39\xec\x92\xf6\xc1\x69\xff\xc7\x1f\xbb\xd9\x1d\x8a\xcc\xda\xe0\xea\x70\x98\xd5\x70\xe2\x3b\x3b\xa6\xdb\x7a\x43\xa6\xa9\x3c\xa8\xa2\xfe\x54\x51\x41\x87\x1b\x8c\x14\xee\xd3\x32\x4d\x95\x1b\xb5\x12\x13\x55\xb1\x4a\x76\xd4\x22\x6b\x7b\x2f\xe1\x55\x8a\xc4\xb8\xfb\x69\xda\xfc\x8d\x46\x0d\xdc\xf3\xa7\xfe\xdb\x6a\xf9\xed\x11\x14\xab\xd1\x60\x93\xd7\x3f\xa3\xcd\x1d\xf8\x8f\x28\x80\x55\xac\x34\xf1\x4b\x70\x97\xc3\x2a\x79\x5c\xb6\xae\x95\xeb\x17\xb1\xa6\x50\x4e\xeb\xf4\xa9\xce\x73\xca\xb3\x8f\x8e\x41\x42\x72\x9a\x24\x39\xe5\x71\xbf\x7f\xaf\xea\xe3\xd5\x2e\x23\xed\x78\xcf\x10\x60\x25\x26\x2d\xd4\x0c\x24\xd9\x0a\x1f\x1d\x43\xfb\x9c\x34\xb4\x4c\x01\x8d\x37\xf7\xf7\xa6\x8c\x8a\x10\x72\xcd\x9e\xd5\xe1\x99\x9e\x70\x24\x76\x7d\xec\xba\x02\xec\xa5\xbf\x37\x88\xd9\x13\x5b\xb8\x73\x05\x67\xd1\xb5\x8f\x2d\xaf\x20\xd2\xfd\xf1\xcb\x78\x48\x34\x59\xba\x83\x49\x54\x27\x06\xe1\x0c\x37\x50\x57\x4f\x59\x93\x1f\xf1\xa8\xaa\x44\xd0\xc7\xcc\xf2\xd9\x8c\xba\x7b\xed\x82\xfe\x69\x73\xc2\xad\xba\xf0\xb8\xe8\xbb\x4a\xbe\x58\x95\x8b\xc9\xc3\xfb\xe3\xd1\x43\x40\xd9\x64\x84\x79\x00\x90\x97\x5c\xce\xb9\xe6\x1a\x30\x82\x23\x1c\x75\x9c\xd5\xa0\xa8\x34\x32\x00\x7b\xc5\xda\x98\x9c\x11\xb9\x68\xe2\x7d\xc6\x50\x89\xc2\x81\x24\xb6\x5f\xc4\xca\x60\xe5\x69\x74\x31\x39\x45\x0c\x8f\x0b\xc4\x88\x06\x7e\x50\xe0\xec\x0e\xac\x47\x01\xaa\xa5\xb1\x9c\x98\xc6\x1b\x80\xf9\x17\x44\x01\x02\x64\xfc\x85\x4d\x8b\x56\xd2\xf3\x6e\x3a\x12\x5d\xcb\x5b\x52\x1f\xa1\xea\x6a\x5b\x1c\xd0\x66\xe2\xf0\x2c\x8b\xa6\x41\xcf\x8c\x16\xd3\x72\x30\xb0\x47\x8f\x7f\x98\xfb\x87\xea\x5a\x65\x52\x97\x81\x24\x99\x93\x19\x59\x59\xf9\x63\x95\xd3\x79\xd4\xb2\x17\xac\x7d\x50\xba\x7b\xd6\xa6\xc5\x55\xad\x94\x75\x2a\xf6\x21\xa0\xb8\x8a\x2b\xf4\xa0\x1f\xcc\x6a\xb7\x28\x8f\xf0\xe6\x6c\x5b\x52\x94\x80\xed\xe6\x05\x27\x40\xb7\xb7\xec\xa8\x57\x43\x08\x08\x81\x46\x0c\x58\x7e\x60\x4c\x74\xc0\x0d\xef\xe9\x2a\xce\xac\x1e\xd0\xfb\x1d\xe2\xd3\x59\xc4\x72\x47\xd0\x53\x3e\x92\x1d\xe9\x0f\x49\x7f\x64\xdf\xdb\xfe\x0d\x01\xf2\xb4\x5e\x84\x11\xec\x2c\xeb\x92\x91\xc4\x15\xfa\x89\x23\x89\x2b\x65\xdf\x74\x94\x67\x8f\x86\x20\x38\x4d\xde\x33\xbb\xa6\x89\xae\x55\x3f\x72\xfa\x28\xb7\x83\xfd\x20\x3f\x1c\xa6\xe9\x13\xbb\x6f\xa2\x31\x7f\xc2\xfe\x6f\x5e\x05\xd9\xb6\x81\xee\x5d\x4f\xf7\xf2\x28\xa4\x43\x9e\xdd\x75\x2b\xe4\x06\xb1\x6e\x9c\x76\x6e\x13\xb0\xb1\xf3\xf8\x8a\x23\x66\xde\xef\x04\xd0\xaf\xa2\x8e\xfc\xc8\x11\x9b\x16\x10\xea\xe0\x27\x17\xac\x5f\xd5\x75\x34\xb6\xc3\x71\xd7\x18\x13\x3f\xaa\xe8\x6e\x0e\x2e\x0c\xc0\x41\x7c\xbf\x1d\x8d\x8a\xbf\xec\x8e\xc9\xa0\xcc\xf1\x06\x3b\x92\x73\xe5\xa6\x09\xe6\x26\x32\xa7\x6f\x99\x5e\x4d\x47\xfb\xf9\x84\x4f\x47\xf7\x21\xd6\x85\x19\x43\x82\x25\xf2\x36\x89\x9a\x38\x02\xdc\xf7\xd5\x3c\x66\x3c\xc3\x9f\xb9\x97\x9e\x3d\xe4\x1e\xc4\xd7\xb1\x43\xf8\xbb\x25\x29\x69\x5a\xc7\x84\xe0\x19\xaf\xd1\xc2\x9a\xc0\x6d\x9f\x5a\xc4\xd7\xc7\x80\x08\x57\x1d\x3a\x5c\x75\xf8\x9b\x79\xc8\x1c\xa9\x1c\x25\xae\x51\x61\x1c\x47\xf5\x23\x03\xc5\x83\x65\x6a\x2a\x78\x18\xb8\xfc\xd0\x5b\x97\x1f\xdf\x41\x77\xfa\x5f\x32\xf6\xae\xd7\x46\x6c\xf7\x1d\x19\x7d\x85\xd7\x53\x93\x13\x4d\x0b\x6d\x0f\x0c\xbf\x1a\xaf\xb7\x56\xa3\x04\x7d\x72\x73\x3a\x5e\x57\x03\xf0\xd6\xa0\x21\x26\xa6\x76\xeb\x79\xc7\xe8\x0b\xad\x6e\x44\xc9\x7d\x74\x76\xee\xed\x18\x6a\x6b\xf6\x86\x8d\xdc\xf4\x9b\xdc\x72\x17\xd3\x6f\x72\x4b\x60\x22\xcb\xe2\x46\xae\x10\x92\xc1\x31\x22\xee\xb9\x99\xff\x2b\xd6\x34\xae\x0f\xb4\x8b\xaf\xd7\x1f\xed\xd4\x02\x39\xdb\xb2\x91\xcf\xda\x91\x34\x33\x47\x26\xdb\x51\xc4\xec\x9e\x8b\x17\x06\x9f\x0e\xf3\x66\xa4\x6b\x59\x63\x86\x63\x22\xa7\xa3\x51\x1c\xa2\x8d\x75\x85\x95\x99\xb8\xd0\x7e\x2f\xdc\xb1\xec\x6c\x4f\x32\x08\x52\x10\x79\x33\x35\x02\xf8\xfc\xdc\x60\x49\xba\xa3\x50\x64\x71\x98\x89\x81\xbb\x46\x85\x87\x12\x22\x9a\x91\x59\xb8\x8f\x28\xaa\x43\x68\x56\x1d\x41\x93\xfa\x11\x95\xc4\x2e\x04\x85\xc7\xe5\x54\xe5\x54\x44\x4b\xf0\xa7\xd6\xf2\x7f\xe7\xc9\xef\x15\x60\x9e\x8f\x72\xd2\x8c\x2f\xf0\x6b\x2b\xbb\x9c\x84\x40\xe7\xde\x0e\xca\xc5\xea\x89\x0d\x8b\x98\x33\x09\x0f\xc4\xb6\x45\xd6\x4c\x07\x59\x83\x68\x6d\x5b\xa7\x9b\x9a\x30\xaa\xc6\x23\x4a\xd9\x44\xd0\xb7\x70\xde\x8f\xf7\x9c\x5d\x90\xa6\x6f\x91\x26\x6a\x90\x8c\x7b\xc9\xc0\x4c\x07\x83\x22\x1f\x24\x59\x82\xf1\xa6\x6e\x1f\xd5\xe3\xf0\x18\xd9\x38\x51\x4d\xa2\x06\x53\x31\xae\x9e\xe3\x4c\xc2\xd9\xbe\x16\xc4\x14\x55\xb0\xdc\xd3\xb3\x1f\x4f\x8e\x5e\x3d\x7f\x99\x40\xe0\x34\x59\xfc\xb5\x03\x5c\x37\x8e\xdc\xdd\x4e\xe7\xff\x61\xd0\xc7\x97\x32\x84\xff\x7c\x29\x2b\x7f\xdd\xda\x95\xf6\x6c\x55\x14\xa7\xde\xb2\x0e\x92\xc6\xbd\x33\xd5\x0b\xbc\x73\xef\x4a\xe9\xda\x95\xfa\x1c\x50\x0d\x41\xd2\xf3\xd2\x22\xb8\xfd\xd3\xed\x42\x12\x22\x37\xdb\xae\xd6\xba\x1e\xae\x73\x6e\x7a\xe1\x8b\x1e\x40\xd3\xec\x26\x98\x88\x82\x7e\xde\x10\x56\x34\x8c\x8a\x8b\xa2\x06\x4b\xad\xb0\x91\xb9\x15\xcb\xb9\x2b\x4f\x16\x98\xf0\x38\xee\x5a\xf1\x5f\x0f\x9a\xe3\x4b\xfe\xd3\xbb\x34\xcf\xc0\x6d\xc7\x59\x6c\x06\x54\xf4\x70\xf1\x11\xa7\x54\x16\x4e\x69\xb5\x5e\xdb\x4e\x13\xcf\x16\x94\x77\x2d\xa6\xe6\x75\x3d\xa0\xc6\xfe\x57\xc1\x1d\x5b\xbe\x99\xce\x88\x8e\x6a\xf7\x4b\xf3\x99\xd2\xf3\x12\x46\xfc\x19\x5b\x06\x44\x48\x37\x85\xc7\xfc\x0a\x70\xb6\xe1\xed\x39\xf7\x78\x91\x4a\x1e\xbb\x4b\x92\x66\xf2\x85\xbf\x3a\xe1\x73\xda\x1f\x79\xd3\xa5\x69\x9e\xc9\x34\xfd\x28\x91\xec\x0a\x29\x06\xf1\xe1\x67\xbc\x2c\x5f\xf8\x75\x19\x22\x79\x60\xf2\x51\x22\x7b\xd4\x7d\xe9\xa3\xb0\xce\x6c\x0b\xed\x5e\xcb\xad\x70\x8d\x1b\xbd\xb2\xa4\x11\x99\x82\xcc\x8b\x10\xe1\xdc\xbe\xc5\x21\x78\x5d\x23\xab\x25\xec\xba\xf0\xa0\x1a\xb0\x74\xbd\x7a\x5b\x4d\x94\xf7\xf0\x72\x56\x9d\xf0\x1e\x10\xb7\x28\x5b\xaf\x3b\xc2\x57\x3a\xcd\xd4\x39\xc4\x43\xdb\x26\x06\xd5\x28\x25\xe4\x9a\x9b\x6d\x80\xdf\x5e\x6b\x30\x2b\x4f\x4f\x9f\xd2\x81\x0c\x0c\x5f\x58\x72\xa6\xcd\x99\x32\xc7\xe1\x4b\x84\xb7\x27\x66\x08\x0c\x4e\x73\x1a\xbf\x14\xb6\x1a\x9c\x8f\x43\x46\x04\x81\xaa\x83\x25\x5d\x3c\x78\x80\xbe\x15\xea\xab\x0b\x6e\x24\xb7\x17\x55\x78\xbb\xa9\x7a\xf8\xff\x86\x4e\xfe\xe7\x1b\xbe\x0e\xac\x7b\xe7\x08\x3b\x34\x04\x22\xe8\x77\x12\x76\x99\x15\xe3\x7f\xf3\x8b\xcd\x31\x93\x10\x58\x4b\xa6\x6f\x76\x43\x4c\x4d\x5c\xf9\x45\xb5\x97\x9f\x63\x6b\x2b\x62\x58\x29\xbf\xd0\xf6\xbd\x20\xd2\x14\x1c\xcf\xdb\x8b\xcf\x32\x23\xb1\xeb\xea\x85\xc4\x69\xfa\xc4\x96\x5c\x50\xe5\x41\x76\xdc\x44\xb0\xcb\x82\x1f\xf3\xab\x53\x79\x6e\xd7\x3a\x52\x78\x32\x2f\xd0\xac\x00\x0f\x6a\xcf\xda\x6c\xef\x25\x6e\xf7\x58\x75\xcc\x17\x0d\xe4\x9a\xc5\xed\x5c\x33\xc3\x5d\x9e\xc0\xd1\xd9\x7e\xf3\xe2\x6a\x62\x09\xdf\x38\x22\x3f\x38\xc4\x48\xa6\x32\x8a\x92\x9c\xa6\xee\x40\x73\x3b\xa8\x42\xbe\x75\x3e\x81\x1d\xc7\x11\xa5\xb4\x84\xb3\x0a\x32\xa0\x12\xe2\xa3\xc2\xbf\xeb\xf5\x34\xc7\xd5\x25\x8b\x3d\xe1\x30\x09\x88\x13\x65\xa0\xcd\x3f\x4a\x54\x12\x4e\x92\x97\xfb\xad\x53\x2e\xda\xe3\x78\xe3\x3f\xaa\x16\xfe\x6f\x88\x61\xf2\x9d\x44\x22\x5a\xb9\x17\x9e\x71\x3e\x6d\xad\xf1\x8e\xcd\x0a\x3c\x06\xcc\x7d\xd6\xbd\x2d\xb6\x76\x63\x1c\xc6\xf1\x1a\x6c\x4d\x37\xb5\x83\xf9\x17\x70\xfc\x5d\x4d\xd3\x2a\xaa\x4e\x63\x36\xb7\x6b\x89\xbc\x5c\x7d\xec\xf4\x73\x2b\x98\x6f\x70\x3c\x40\xd3\x08\x80\x25\x0e\x90\x9b\x47\x30\x49\xdb\xfb\xa4\xa3\x71\x96\x79\x69\x12\xa7\x6d\x3c\x90\x8a\x93\x58\xb0\xb2\xc7\x0a\xcd\xd9\xfc\xb6\x77\xc9\xb9\xec\x55\x1f\xed\x46\xf5\x76\x9c\x0b\x5d\xf0\x37\x91\x10\x68\x27\xc1\x85\x75\xa4\x1f\xed\x12\xa9\x3d\x2c\xdd\xe1\xfb\xa7\xdd\x0d\xcc\x6b\xb5\x44\x9a\x5a\x6a\xf8\x4c\xcd\x57\x05\x0f\xf1\x1c\x48\x41\xab\xfd\xca\x26\x7c\xcc\xc0\x3a\xa6\x4f\xa3\x10\x94\x45\xb4\xab\xbd\x85\xbb\x2d\x99\xe1\x80\x91\x2c\x1a\x8e\x9d\x6e\x6b\x89\x5d\x01\x31\x75\xcb\x34\xed\x87\xdb\xea\x4c\x86\x7b\x42\x20\x2c\x1f\x25\xaa\x72\x35\x0f\xca\x3b\x4e\x48\xdb\xf3\x34\xad\xe9\x4b\x09\xb7\xdb\xd3\x1c\x93\xd2\xcb\xf7\x38\x26\xf0\x9b\xb8\xd5\xb5\x1a\x78\x46\xb7\x69\x73\x39\xe5\x39\xe0\xfb\x86\xe1\x81\xdb\x9f\xea\xd6\x30\xb3\x4d\xed\x3a\xcb\x75\x07\x03\x20\x89\x58\xaf\x05\xb7\x2d\x21\x2b\x3a\xcc\x56\x07\x95\x4c\xbc\x1a\x0c\xf0\x0c\xad\xec\x96\xec\xda\x38\x6c\x3e\xb7\x63\xe3\x4c\x4a\x4f\x38\x2a\xf0\x7a\xbd\x7d\xbc\xda\xf5\x55\x6c\xb2\x2d\xd2\x06\x5c\xc2\xdc\xd2\xbe\x60\x3e\x2a\xa2\x1e\x54\x13\xb3\xa8\x27\x64\x49\xb9\xed\xd9\xe2\xef\xf6\x6c\x49\x16\xb6\x57\x0d\x9e\xd7\x2d\x88\xea\xb9\x56\x6f\x97\xed\x65\x1d\x0a\xfa\xe2\x92\x26\x82\x2e\x8b\xb0\x9a\x27\x7c\xfc\x11\x81\x6b\xbb\x2f\xd4\xae\xe5\x45\x01\x47\xc7\xa4\x66\x89\xf4\x6e\x88\xd6\x8f\xc7\xf3\x02\xad\x0a\xb8\xdb\x77\xab\xd6\x16\x86\xd7\xeb\xbe\x6b\x1b\xe0\x0a\xe2\xad\x63\x2b\x56\x01\x77\x9c\x6a\x02\x67\xc5\x7a\x8d\x50\x41\xeb\x3a\x05\xc4\xf6\xc5\x95\x0e\x7e\x7b\x9a\xde\x48\x54\xf8\x0a\x37\xdb\xe7\x90\x20\x85\x25\xe8\x94\x13\x9f\x29\x2c\xe0\x4d\x47\x56\x56\x93\x08\x7f\x46\x75\xa3\x62\x55\x18\xdc\xce\xef\x8a\x52\x51\xc0\xfd\x9e\xfb\xc9\x8a\x60\xe2\x40\x4d\x68\x37\xc2\x98\x6c\xf3\x7f\x2e\x57\x9a\x56\x0f\x5e\x28\x46\x76\x87\x40\x12\x4e\xd3\xad\xcf\x64\x9a\x76\x98\xff\xc8\x98\xff\xf2\xe7\x77\xcd\x5f\xd9\x15\x1f\x8a\x0c\xad\x73\x78\xe1\x55\x8f\xbb\x0e\xfb\x2e\x26\xcb\x92\xc1\x6a\xa1\xcc\x4f\x65\x93\x14\x1a\xbb\xa2\xe2\xb7\xfe\x4c\xd9\xf2\x7a\x35\x93\x84\x49\x30\x25\x31\xeb\xb5\x3d\xcc\x6b\x76\x7a\xdc\xbd\x6b\x17\xac\x84\xd0\xa8\x5e\x9a\xac\x05\xc4\x59\x24\xef\x3d\x01\x1f\x7e\x1a\xb4\x0b\x93\x6a\x06\xc6\x27\xbc\x11\x8f\xa2\xf2\xea\x71\x21\x52\x79\x8b\x17\xda\x3a\x62\x20\xbc\x7a\x5b\x14\xee\x89\xb2\x77\x23\xca\x52\xc8\xeb\x1e\xeb\xb9\x08\xf8\xb6\xef\x3d\x80\x40\x01\x84\xb4\x5d\x2b\x2d\xb7\x2b\x08\x38\x21\x78\xcb\x7d\xbc\x36\x83\xac\x21\x3c\xcc\xe1\x30\x08\xee\xa7\xf6\xf8\x4d\x26\x09\xde\x0e\x8e\x71\xc4\xe4\xd7\xa6\xe7\xd9\x8b\x1e\x2b\x8a\xde\x92\x69\x76\xc3\x0d\xd7\x65\x97\x18\x3f\xee\xa1\x28\x56\x46\xe3\x8c\xc6\xb6\xd1\x1b\x77\xf4\x75\x34\x0d\x70\xa2\x3f\xe5\xeb\x35\x9f\xbe\x76\xc1\xfc\x2a\xfd\x57\x6b\xa1\x6c\xdd\x3c\x24\x96\x07\x4b\x2a\x70\x0a\xee\x50\xdc\x5d\xb9\x28\x49\x06\x3c\x60\x86\xdf\xfb\x57\x28\xea\x8f\xf2\x9f\x68\xfa\xaf\x3f\x4a\x94\x0f\xf0\xbd\xb6\xaf\x98\x99\x24\xc9\xd8\x4c\x47\x79\x1c\xa2\xdd\xa3\xed\xec\x7e\x60\x5a\xa2\xaf\x8f\x4f\x5e\xbc\x3c\x39\x7a\xfc\xea\xe4\x78\xdc\x3b\x3e\xb5\x33\xe6\x26\xc2\x08\x66\xdc\xbc\x19\x37\xb5\x5f\xd7\x81\x43\xbe\x4e\x7a\x66\xc1\x4c\x4f\xc8\x05\xd7\xc2\x94\x3d\xfb\xff\xff\xef\xb4\xda\x21\xbd\xb9\xa5\x1b\xcc\x72\x1c\x97\x2b\xd3\x9b\x2b\x5e\xc2\x4d\xb8\x5f\xf7\x3d\x25\xb9\xfd\x84\x17\x57\xbb\x7f\xc8\x57\x0b\x51\xf6\x3e\x88\x02\xe0\xc9\xd4\x0d\xef\x31\xd9\x03\xd4\xa4\x9e\x90\x3d\xd6\xbb\x5a\x99\x95\xe6\xbd\xf7\x5c\x97\xa0\xbc\xb8\xea\x3d\x76\xd1\xa9\x76\x7b\x2f\x0a\xce\x4a\xde\x63\xf3\x79\x5c\x39\xc2\x3d\xa3\x00\xe2\x2c\xf9\x1a\x37\xda\x0c\xaa\xaa\xdd\xaf\xc1\x3b\xbb\xa1\xc0\xe4\xed\xe8\x86\x7a\xb2\x4d\x48\x75\x45\xac\x38\xde\x74\x88\x9b\x76\xad\xf1\x0d\x14\xb6\xb5\xf8\x56\x52\x73\x36\x5b\x38\x98\xb5\xc8\xe1\xb7\x68\x1c\x3a\xd5\x41\x11\x74\x16\x1f\xa3\x96\x9d\x70\x24\xf0\x7a\x3d\x2b\x7c\x08\xc7\x05\x64\xd4\x1d\x14\xdf\x52\x98\xea\x24\xda\x54\xae\xb1\xdb\x87\x6b\x1f\xf5\xf9\x7a\xdd\x87\xdc\x4f\x5c\xdf\xf0\xe6\xae\x52\xe3\x5c\x15\x9e\xd5\x7b\xf4\x46\x22\xbe\x3b\xe7\x4b\x40\x62\xc1\xf8\x6f\xd7\x77\xf2\x51\x94\x76\x7d\xdd\x5d\xe1\x3b\x89\x7c\x4f\xaa\xbc\xbe\x74\x6f\xa6\x01\x67\xb2\xcb\x01\xde\x96\xeb\x75\x7d\x40\x3b\x1f\xaf\x8e\x26\xf4\x5d\x6b\x5d\xad\xd5\xc8\x32\x37\xb2\x0c\x67\x5d\x2d\xb9\x42\x2c\xee\xa9\xed\x65\x1d\xbe\xbb\x76\x6e\x2e\xfe\x23\x33\xf3\x26\x92\x84\x9f\xed\xcf\x81\x2a\x73\x7f\xc2\x18\x02\xa7\xf3\x58\x4e\xa6\x41\x31\x16\x69\xa5\x61\x2d\xb4\x02\x68\xf2\x8e\xa3\x91\xa7\xe9\x27\x09\xd6\xa3\x91\x43\x67\xf4\x6d\xc7\xb9\xe9\x00\x61\xae\x0a\xf2\xbe\xd8\x32\x07\xbc\x93\x3a\xff\xef\xd7\x2a\x12\x41\x55\x51\xdd\xc6\x56\x8e\xa6\xbb\x77\xc9\x9f\x08\x13\xb1\x41\x9f\x2d\x39\x1e\xcb\x0d\x31\x04\x2e\x7d\xc8\x75\x41\x11\xba\xfa\x37\x95\xd9\xd0\x50\xaf\xc4\x72\x96\x07\x5f\x64\xa3\xda\xd7\x34\x93\xf7\xae\xe1\x49\x82\xc7\xf6\xb1\xe6\x74\x49\x88\xfc\x4b\xdc\xc1\x01\x88\x7d\x15\x43\x80\x77\x5f\xfd\xf0\xf2\xf9\x9b\x8b\xd3\x27\x17\x67\xcf\x5f\x5d\x3c\x79\xfe\xfa\xec\x98\xbe\x94\xe4\xaa\xd8\x3d\x7b\xfd\xf4\xa9\x57\x15\xdb\x9f\xf5\x41\x4d\xcf\xd0\x67\x20\xff\xe3\xab\x82\xd4\x5c\xcb\x18\x78\x13\x12\x16\x69\xe7\xde\x35\x05\xde\x6c\xb0\x2d\xee\xe2\xe2\xec\xfb\x8b\x00\xac\x78\x7a\x7c\x71\x41\x77\x46\xe4\x2a\xbe\x16\xbb\xf5\x5b\xe7\x85\x41\x85\x46\x1c\x4f\x47\x39\x51\x4d\x44\x8c\x9b\xa2\x79\xdd\xd7\x21\x2a\x3c\x87\xd5\x6e\x59\xe5\x17\xc1\x8a\xf0\xf9\x15\x8a\x6c\x0a\xb1\xf3\x57\xd0\x2b\xdb\xec\x0d\xe2\xde\xa4\x54\xd2\xfe\x90\x68\x3a\xe5\x79\x15\xfc\x5e\x84\x58\xa5\xe2\x0a\xb9\x2b\x34\x2b\x87\xb9\x71\x99\xdd\x2c\xd7\xeb\xf0\x63\x2e\x74\x05\xb5\x13\x65\xd8\xe6\x8f\x2a\xef\x99\xb2\x37\x63\xd2\x1e\x86\xfe\xf0\xec\x1d\x55\x77\x92\x09\xce\xea\x6a\xe6\x42\x5b\x32\x2f\x82\x2d\x91\xb7\x1d\x13\x95\xb7\x30\x00\x17\x80\x11\xdc\x65\x01\x7e\xbc\xf6\x19\x13\x06\x4e\x1d\x4c\xdb\x79\xaa\xdf\x36\xd3\x6c\xae\x60\x41\x07\xaf\xfd\x8f\xe0\x28\x2b\x9a\xf6\x63\x45\x9a\x9e\x17\xa0\x8e\xf2\xfa\x5e\x11\xb9\x83\x94\x54\x74\x60\x69\xa8\x34\x3d\xb2\x9f\x28\x4c\xca\x34\x7d\x6c\x1f\x4b\x4c\x8e\xaa\x76\x12\x51\x35\xf8\x68\xab\x79\x44\x6c\xb5\xf7\xa8\x6e\x24\x11\x55\x73\x9d\x6d\x51\x9a\x0a\x67\xac\xcb\x02\x52\x5e\xed\x28\x6a\xd3\xb3\x59\xfd\x86\xa2\xe8\x87\xd3\x6d\x79\x0e\x61\xab\x8c\x8d\x87\xc2\x12\xbb\x57\x9c\x59\x1e\x04\x3a\xb6\xc2\x75\xc8\xf7\x61\x36\x3f\x58\xc5\x01\xdf\x3f\x3b\x79\x77\x35\x9d\xe7\xd9\x22\x4d\x17\xbb\xf2\xfa\xd4\xcd\x72\x9a\x5a\xa1\x8a\x2c\x28\xa5\x37\x05\x5c\xc7\xf6\x47\x78\xb3\x31\xb4\x7b\xd1\x9a\x86\x23\x6a\xe3\x9a\x9b\x54\x06\x30\xbc\x8e\x02\xa4\x0f\xe9\x30\xd3\x21\x0c\x90\xb7\xfe\xaf\x4d\xa8\xa8\x19\xd0\xc8\xa0\x4a\xd4\xe6\xb9\xf4\x9d\xed\x79\xf5\x93\x48\x30\x3b\x8c\x73\xd8\xc3\x0e\x62\x01\x55\xae\x78\xf1\x61\x63\xa5\x3b\xcd\x27\x9f\x37\x63\x90\xf3\xb8\x3d\x9e\xa2\xc3\xe5\xa8\x68\xba\xd1\xd6\x6e\xa4\xd1\x33\x95\x93\x88\xf0\x69\xfc\xd9\xc0\x1f\xe2\x7e\x6d\x62\xe7\xa2\xc7\xc5\x17\x41\x5c\xda\x09\xad\x92\x89\xf0\x65\x03\xa2\x88\x7f\x68\x94\x7f\x5e\xdc\xe9\xf6\x6b\x4b\x8f\x7f\xfe\x75\xab\x6d\x21\xbf\x38\x73\xdd\x9a\xd4\xbd\x2d\x9c\xce\xae\xff\x4b\x11\x14\x8b\x92\xef\x9e\xdf\xde\x5c\x2a\x30\x9f\x07\x35\x83\x30\x1c\xb8\x67\xfc\x4b\x41\xeb\x5f\x35\x0e\xbc\x5b\x0a\xf5\xd2\x89\x44\x08\xb0\x6f\x45\xcf\xd8\x32\x22\x7b\xa4\xe5\xe9\x3b\x18\xc8\x86\x7d\x4e\xc2\xa5\xb1\xc3\x95\x38\xcc\x84\xa4\x14\x9f\xb8\x7f\x6e\x14\x34\xd5\x39\xa5\xb4\x91\xb4\xeb\x3f\x4d\x53\xf4\x4b\x41\xa3\xe8\x5f\xbf\x38\x48\xdc\x8b\x3b\xef\xe6\xb6\xa0\x4e\x3f\x68\xb6\x5c\xf2\x79\x33\x4c\x5d\x7c\x56\xda\x0c\x5b\x27\xa5\x69\xf2\xdf\x20\x01\x7b\x89\x7d\x25\xff\xe2\x0b\xbe\x2b\xca\x37\xae\x56\x64\xf0\xc4\x84\x26\x8c\x4d\x2d\xf5\x87\x0c\x5f\x28\xc6\xc4\xa2\x2b\xef\x10\xc0\x3f\x14\x31\x03\xfa\x43\x01\xd6\x36\xa8\x7d\xae\xaf\xd7\xfd\xa6\x14\xfc\x8c\x2d\x71\x9a\xda\x05\x03\xfe\x3e\x91\xd1\x6f\x37\xbb\xd7\x71\xbb\xd1\xe3\x1d\x57\x1b\x71\x51\xcf\x8a\x16\x33\xc7\xa7\x26\x8f\xc3\x36\x3f\x6d\x65\xe8\xfb\x55\x27\x4a\xc0\x51\x74\x9a\x50\xf7\x51\x33\x3a\xf5\xc7\xa2\xed\x5f\x52\x15\x15\xd8\x2d\x97\x30\x18\x11\x8d\xd7\xeb\xc8\xa8\xf9\xf7\x62\xdb\xc9\xf9\xe3\x36\xb7\xe6\x3f\xdf\x23\x56\x2e\x8a\x90\x78\x4e\xb6\x6a\x8e\x41\x82\x9f\x16\x48\x90\x5b\x83\x30\x01\xab\x5a\x40\xe2\x6a\xfb\x12\xc7\x36\x90\x6f\xb8\x73\xb0\x7f\xc5\x90\x01\x0b\x8f\x82\x30\xe2\xa1\x2a\x7d\x13\x37\xe8\x39\xe0\x79\x91\x50\x2d\x26\x27\xd1\x7d\xfb\x69\xb1\x65\xf6\x07\x4d\x87\x46\x48\x3c\x31\x83\x53\x24\xf1\x40\x8f\x79\xd4\x89\x57\xc5\x1d\xae\x56\xd0\x19\x32\xa3\xd0\xf0\x15\xe5\x83\xbd\x21\x99\xd3\x59\xdb\xb7\x6c\xd2\xd5\x27\xe7\x8d\x19\x4e\x47\xe3\xdd\x37\xc9\x8a\xce\x19\x78\x27\xdf\x27\x85\xc7\x74\xfa\x95\xa3\x19\x51\x18\x67\x1f\x9c\x1f\xf3\xca\xa5\x94\x18\x93\x17\x80\x99\x10\xd4\xc3\x2b\xe7\x60\x5a\xd2\x73\x86\xf6\xc8\xca\xd7\x63\x3a\x5c\x84\xcc\x6e\xec\xa2\xe7\x76\xb6\xa9\x7c\x49\x67\x6d\x11\xdc\xec\xbe\xab\x5c\x4f\xaa\xe7\xca\x34\x0b\x9a\x40\xe6\x21\xbd\xce\xbd\xcb\x6f\x2e\xf9\x7c\xce\xe7\xaf\x6c\xb3\xd0\x0a\x63\xb2\xda\xa0\x15\x99\x91\xb2\x61\xab\x3b\x9e\x39\x53\xa0\x55\x9e\xad\x0c\x9a\x93\xfe\x28\x68\xab\x4b\x3b\xcb\xde\x24\xf8\x48\xdd\xb8\x98\x80\x09\xce\x5e\x69\x3b\x00\x64\x41\xe6\xe0\x27\xbe\xb0\x0c\xcd\x9f\x0c\x95\xa4\x9c\xae\x72\x7a\xc6\x6c\x0a\xbc\xc5\xe4\x29\x47\x73\x9c\xa6\x97\x0c\xbe\x98\x07\xaf\x9a\x22\x4d\x8f\xec\x07\x73\xa2\xa2\x8d\xf2\x3c\xde\xcd\x5f\x71\x14\x39\x5e\x3b\xb8\xe2\xa7\xb6\x27\x64\x6f\x38\x88\x37\xee\x8b\xff\xde\x88\xa3\xba\x95\x25\xb2\xb1\x43\x2a\x97\xc1\x77\x4e\x10\x19\x97\x12\x29\x58\xab\xe4\x23\xc4\x3f\x8c\x9a\x71\xd6\xd4\x60\xb4\x77\x9a\xae\x77\xda\x85\x47\xbd\x83\xad\xa2\x61\xab\x68\xd8\x4f\xd2\x8e\x3d\x39\x8b\x36\xcc\xcb\x8e\xfd\x2f\x2a\x2c\x52\xef\x32\x92\x79\x37\xc2\xe0\x16\x02\x70\x6a\x24\x66\x54\x9e\x74\xd2\x01\xc2\xdc\xd6\x29\xa8\x1d\x51\xa2\xa8\x80\x56\x94\x54\x4c\x8b\x9c\x5e\x6b\xa4\xec\x37\x6d\xe7\x77\x38\x56\x97\x6c\xc6\x61\xeb\xfd\xcd\xcd\x56\x19\x68\x85\x8d\x56\x86\x8d\xb6\x47\x84\xdd\x50\x8a\xb0\x3a\xe6\x82\xdf\x69\xa5\x7b\x51\xe0\xca\x17\xab\x74\x7e\x1f\x69\xfa\x2b\xac\x36\xef\x0c\x64\x07\xad\xca\x10\xb9\x89\x54\xd9\x62\xd7\x91\xfe\xb0\xca\x1c\xed\xab\x68\xd3\x38\x44\x7f\xf0\x17\x40\xc6\xae\xec\x72\x83\x2c\xa1\x13\x64\xe8\x87\x70\xcc\x2a\xdb\xb9\x95\x41\x33\x5b\xa4\x87\x36\x98\xc5\x55\x45\xe0\x2a\x9f\x0c\x52\xa4\xac\x49\xc5\x2c\xd8\x8a\x45\xc8\x24\x9f\x34\xe4\xa9\x90\x46\x66\xde\xe6\x2c\xab\x31\x46\xbe\x77\x59\x16\x98\x3c\xbc\xdf\xa7\xe8\xe1\xfd\x74\x56\x01\x1d\xbc\xd2\xc8\xb6\xd1\x92\x0f\x02\x50\x54\xd5\xbc\xf9\x1e\x1d\xf3\xa5\x59\x1c\xa9\x95\x34\x69\xca\x34\x2a\x9b\x58\x72\x5b\x99\x06\x03\xbb\x77\x67\xf6\x60\xb8\x64\x50\xf4\x0c\x93\x1b\xfb\x34\x03\x54\xc7\x1a\x58\xea\x88\x21\xfb\x32\x32\x19\x2e\xaa\x9b\x62\xbb\x59\xb2\xb9\x41\x78\xb2\x30\x08\x8f\x57\x06\x71\x5a\x89\xe6\x81\xd0\x18\xca\xb3\x2f\xb4\x64\x67\xc7\xc7\x2b\xb5\x8b\x35\x93\x1d\xd0\x4d\x2f\x0c\xc4\xcf\x26\x3f\x38\xeb\x5d\xd9\x9e\xcc\x13\x39\x87\xdb\x7a\xd7\x66\xd3\x61\xa8\xd7\x19\x13\x61\xd8\xa7\x68\xf4\x30\xf5\x0e\x25\x78\x03\xce\x27\x2f\x0b\x24\x89\x71\x88\x95\x5d\x25\x45\x0b\xcc\x6c\x5b\x0d\xde\x59\xcf\xfe\xde\x17\xeb\xd9\x2a\xc8\x0e\x5e\x64\x18\x1d\xed\xef\x68\xaf\x13\x3b\x13\x91\x0d\x74\x07\x85\x22\xc2\xd1\x00\xe6\x8e\x4f\x2b\xf0\xfe\xf5\x8e\xae\xd1\xc3\xfd\x6e\x2e\xe8\xaf\x1c\x59\x92\x43\x54\xd8\xd7\x8f\x48\x22\xaf\x21\x92\x1a\x13\x92\xeb\x84\x14\xed\x63\xad\x80\xfd\xa9\x08\xdc\xdb\x11\xbf\xe7\x15\x81\x92\xa2\x15\xf6\x77\x76\xa9\xc2\x44\x6d\x60\x91\x6a\xe8\xe0\x58\x54\xa8\x93\x2b\x83\x8a\x6a\x87\x2a\xf0\xb7\xa5\xfa\xee\x73\x0d\xac\x5d\x49\x01\xe7\x9a\xb2\x1d\x7a\xca\x1d\x0a\xea\xa5\x33\x89\x2e\x60\x13\x08\x52\x00\x6f\x23\x43\xc0\xf2\x23\x86\xc0\x7d\xad\x36\x0e\x6f\xee\x01\x62\xdc\xea\xfd\xc2\x56\x20\xa6\x7b\x65\x9b\x68\x65\x6f\x0d\x80\x5f\xd9\x91\x61\x78\x35\xc7\xd5\x6c\x93\x4f\x8d\x55\xf0\x3a\x32\x92\xb4\x2b\x20\x42\x26\x6f\x30\xe7\xbc\xf3\xf2\x90\xef\x9a\x05\x8f\x98\xe2\x37\x7f\xeb\x9b\x72\x75\xe9\xc2\xe6\x81\x24\xf4\x5b\x41\xdf\x44\x72\xe0\x57\x7f\x71\x38\xa9\xe8\x20\xfd\xb9\x80\x59\x16\x9e\xfd\xb4\xdf\xf5\xfb\xb0\xd4\xbf\x8a\x4e\xcd\x1f\x1b\xb2\x2b\x8c\x7f\x63\xb5\x47\xa5\xd9\x39\xfd\x8a\xa1\xf3\xa0\xf5\xc0\x6e\xe3\x48\x57\xf4\x08\x93\x1f\xa3\x72\x7f\xbe\x93\x13\x7d\xca\x91\xc6\x60\x55\xdd\x0d\x6c\x40\x56\xd4\x4c\x1f\xe5\x64\xee\xe0\x11\xc8\x82\xf6\x41\xa3\xb6\x9f\x6a\x0f\xfa\x5e\x19\x00\xbc\xe1\x00\xbc\x43\xae\xa8\x9a\x28\xb4\xc4\xe3\x25\x79\x4f\xe7\xc1\xfb\xf9\x9a\xaa\x49\x07\x09\x51\xe8\x35\x47\x7c\xaa\x2b\xe3\xf3\xcd\xd8\x3f\xdb\x5a\x3e\xd5\xee\x30\xb7\x95\x77\x7a\x5f\xa5\xa9\x5d\x62\xb7\x5b\x18\x9c\x35\xa4\xae\xb7\xb1\x8f\x6c\x48\x5a\x2e\xed\x35\x50\x43\x03\xd5\x45\xd8\x9d\xe7\xe1\xb9\x65\x9a\x0a\x00\x79\xa1\x94\xea\xda\x50\xfb\x1b\xc7\x68\xb0\x41\xa5\xe9\xef\x55\xe8\xc5\xe5\x44\x4d\x4b\xa7\xc6\xde\x6c\x83\x20\x5b\x51\xc5\xd6\xd5\xba\xb8\x02\xd8\x42\x1d\x80\x10\x02\xf5\xb8\xc5\xe8\x76\xf7\xe2\xc2\x01\x7a\x3e\x15\xa5\xe1\x92\xeb\x27\xf2\xe2\x62\xbd\xbe\xc5\xf0\xe2\xcc\xf2\x95\xd1\x0b\xca\x48\xf7\x17\x94\xd9\x69\x1b\x39\x25\x27\xa3\xbf\x5a\x9e\xce\x90\x15\x61\xd5\x41\x76\x43\xe5\x6e\x01\x5f\xa0\x2b\x10\x9c\xb2\xb9\x53\x55\x32\x72\x03\x38\x46\xb3\xe0\x38\x75\x4d\xde\x93\xf7\x83\x11\x76\xd8\xec\xbd\x66\x69\x43\x4c\xae\x76\xd9\x7c\x7e\xf2\x9e\xcb\xaa\x05\xc8\xf1\x51\x24\x94\xb8\x5d\x9e\xc7\xe3\xeb\x75\x36\xed\x92\x1c\x51\x1d\xb4\x85\x1e\x4c\xde\x0f\xd1\x91\xa5\x6e\xf4\x68\x2a\x02\x98\xf2\x63\x7a\x19\xdd\x29\x3f\xae\xa6\xfc\x9c\x0e\xb3\xf3\x83\xc7\xd9\x79\x35\xd3\xbf\x50\x33\xbd\x9c\x9e\xe7\xb9\xfd\x77\x30\xca\xf3\x7a\xa7\xdb\x16\xbe\xad\xd6\x6d\x3d\x10\xbf\x34\x1b\xee\x27\x8c\xbc\x25\x3b\xe8\xed\x60\x84\x1b\x48\x63\x3f\x45\x94\xc1\xe8\xdb\x40\x66\xc0\x16\x0a\xe9\xc8\x7f\x26\x18\xdf\x81\x7f\x23\x26\x0d\x84\x92\x5f\x1b\x2c\x74\xeb\xa2\xa6\x27\x11\x03\x25\x14\xa3\x94\xb6\xef\xda\xb5\xd7\x01\x57\x47\xf3\xe4\x47\x8e\x78\x05\x43\x35\x36\x00\x2b\xb8\xbf\xe7\x80\xa8\xd3\xf4\x7b\x86\x8a\x18\x16\xe1\xa7\x02\x39\x47\x4e\x86\x49\x49\x65\xe7\x6a\xcb\xca\x0c\x57\x39\x4b\xc2\x70\x9a\x2a\x52\xd2\xb2\x3b\x73\x20\xdb\x69\xda\x1f\x79\x2f\x65\xb6\xbb\xd4\xfc\x3d\x30\x4c\x20\xc1\x58\xca\xb9\xeb\xf2\xc1\xb5\x27\xc0\xbf\xc5\x10\x4a\x5c\x55\x27\xd3\x96\xb4\x34\xec\x94\x96\x86\xb1\xb4\x34\xcc\xc7\xa3\xac\xe3\xba\x2b\x58\x67\x76\x8a\x6c\x1d\xf8\x46\x19\x3f\x1c\x66\xd8\x50\x33\x1d\x3d\xc8\x09\xdf\xd9\xa9\x03\xae\x59\x61\xa6\xb3\x18\x8c\xa7\x8f\xe0\xfe\xbe\xee\x8d\x51\x77\xf8\x44\x76\x19\x4a\x80\xb8\x50\x13\xb3\xea\x84\x30\x95\x61\xdd\x03\xec\x21\xfd\xd1\x28\x95\x75\x64\x8c\xa9\x1c\x8c\xf2\xf6\x45\xf9\xb6\xdf\x7c\x05\xf2\x16\xc2\x13\x24\xff\x4c\x3c\x9a\x46\x05\xe8\xac\x27\x80\xb5\x0f\xdb\x7c\xfc\xb3\x40\x76\x75\xd4\xb1\x55\x60\x03\x4b\x2a\x3a\x5c\x26\xa5\xaa\xbb\x62\xcf\xb2\xe9\xe8\x61\x3e\x7d\x08\xd5\xf4\xc1\x30\xce\x43\xfb\xc6\x00\x99\x51\x32\x3d\x95\x88\x4f\x82\xa2\x7c\x3c\xf2\x38\x1a\x9a\xca\x00\xdf\x04\x06\x76\x80\x81\x5b\x01\xc2\x66\x15\x6a\xdd\xc4\x28\x24\x08\xc7\xe3\x61\x84\xc7\x8a\x2c\x37\x35\xb1\xff\xec\x36\x21\x88\xa9\x18\x4b\xcb\x68\x09\x02\xfc\x56\x14\xea\x3e\x5a\x88\x5a\xfd\xd7\x72\xfb\xb0\xf3\x8e\xb4\x79\x19\x1a\x4c\xd2\x5a\xec\xee\xdc\x72\x71\x20\xf7\x8e\x1e\x7a\xe7\x52\xa7\xf0\xa9\xb0\x8b\x58\xd4\x29\xbf\xd1\xaa\xc1\xb4\x47\xb8\x2d\x27\xc8\x61\xec\x4e\xc0\xb9\x3f\xb5\x57\x96\x39\xe9\xf1\xb1\xb3\x47\x34\x98\xfc\xa0\x91\xf4\xec\xdf\x7a\x6d\xa6\x0f\x73\x48\xc6\x1b\x60\x49\x58\xb4\xc4\x85\x6a\x29\x26\x99\x4d\x48\x12\xb8\xf8\x04\xe4\x97\x08\x94\x98\xa9\x0e\x85\x81\xe3\xa3\x4e\x2d\xef\xd4\xd4\x1b\x82\xba\x94\xb5\x34\x12\x8c\x70\x52\x10\x06\x8d\x16\xc0\x03\xb1\xa8\x82\x42\x75\x7b\x9f\x71\xd8\x23\x35\xb6\x8c\x21\x8a\xea\x89\x60\xe0\xb5\x6d\xff\x25\xa5\x3d\x3c\x87\x0e\x45\x16\x01\xfd\x2a\xd7\xeb\x02\x57\x5e\xd2\x7c\xaa\x06\xa3\x3c\x53\x0a\x62\xcb\x3b\x9d\xa4\x03\xe0\x85\x17\x54\x4f\x4a\x86\x66\x78\xcc\xec\xbf\x38\x14\x3f\x83\xe2\x67\x78\x03\xe0\x97\xd0\x08\xaa\x27\x0c\xea\x2d\xed\xbf\xd1\x48\x2a\xd5\xb8\x4e\xae\x7d\x03\xdd\x93\x59\xaf\xb7\x54\xd1\x13\x6e\xd7\x19\xc7\xce\xfa\xac\x8f\xfa\xdb\xba\xea\xc0\xa1\x54\xa1\x6f\x6c\xcb\x5f\x38\x52\x77\x48\x87\xce\x31\x47\xd1\xcf\x96\x8c\x9d\xc8\xf9\x78\x48\xde\xf2\x5b\xf7\xaf\xfb\xe9\xd4\xe9\xfe\x2f\x24\x45\x3e\x4d\x33\xd5\x70\x9d\xb0\xe7\xab\x0b\x92\x58\xaa\xdd\xb7\xfc\x96\xb8\x3f\x27\x72\x1e\x1b\xd3\xa8\x98\xff\x2d\xd5\xae\xaf\xba\x12\xc0\xc0\x1e\x6a\x67\x34\x46\x86\x56\xdf\x6f\xd9\x34\xb8\x30\xbb\x07\x32\x4d\x1b\x01\xa1\x0c\x3e\xdc\xdf\xcb\xb0\x19\x0c\x1a\x14\xdb\x95\x43\x41\xe0\x58\xa8\x6d\xe8\xc1\x2a\xed\xee\x72\x0f\xe8\x56\xc1\xb5\x6d\x46\x7b\x13\xdc\x86\x75\x68\x17\xe8\x32\x5a\xa0\x57\xcd\x49\x0e\xf9\xec\x0e\x07\xce\x2a\xca\xfa\x1e\xc6\xf6\x46\xa1\x57\x92\x5c\x2b\xc2\x9b\x6a\xfb\xeb\xad\xa3\xa5\x83\xf1\x8e\x93\xfc\x10\x0c\xeb\x39\x71\xcf\xce\xc2\xb3\x7e\xac\x5e\xf8\x69\xa1\x75\xc0\x25\x2b\x29\xd8\x6a\x61\xb4\xe2\x3c\x18\xd4\x02\x99\x3c\xa4\xc3\x4c\xd2\x95\x02\xdb\x7a\xfc\xca\x4e\xd6\x4c\x59\x89\xa2\xd1\xf4\x6a\x70\xee\x10\xa9\x6e\x0c\xda\xc3\x19\xdb\x86\x8f\x3d\x52\xc8\x6d\x7f\x8d\x89\xf1\xc4\x01\xae\x09\x0a\xd8\x8f\xbf\xd8\xd7\x5e\xfb\x75\x6a\x10\xce\x2b\x59\x8c\x13\x31\x2d\xec\xde\xeb\x34\xdc\x70\xfb\x8b\xaf\xd7\xdb\x31\x4d\xcc\x84\x0f\xa8\x19\x77\x19\xe8\x20\x4e\xcf\x7d\x54\x45\x0c\x17\x49\xb0\xb8\x9a\x72\xf6\xcd\x56\x4f\x3d\x7d\x77\x5d\x14\x9d\x5d\xf4\x10\x18\xac\xc6\xc3\x06\x65\xad\x3d\xa4\xeb\x3e\xdb\xf7\x32\x0a\x3f\x5c\x77\xda\x66\xfc\xa0\x40\x3d\x90\xa6\xfd\x4b\x05\xf6\xc0\x41\x12\xd4\x13\xd5\xa1\x15\x1a\xab\x6d\x15\x4e\x04\x91\x8d\x24\x7d\x8b\x4a\x7b\x02\x25\x09\xc6\xe4\xa5\x1d\x71\x45\x0a\x07\x88\x6b\x79\x82\xfe\x5d\x77\x18\xf8\xb3\xa0\xae\xc9\x48\x50\xc1\x6b\xf6\xb3\xa4\x43\x32\xa3\x43\xb2\xa2\xc3\x4a\x4a\x9b\x08\xcb\xbe\x39\x40\x41\x3a\xac\x80\x01\x26\x2c\x24\x57\x2a\xcb\x0a\xbf\x6a\x9e\x85\xab\xfc\x32\x2e\xa6\x1c\x8c\xaa\x93\x75\x49\x67\x71\x51\xb3\xe8\xd5\x95\x37\x1e\x21\xef\x9d\xd8\xb9\xa2\x94\xce\x27\xa8\x1c\xd0\x3d\x32\xb3\xff\x2c\x1c\x10\x32\x7a\x4f\xe7\xe4\x8a\x2e\x71\x85\xbd\x3f\xaf\x5a\xb0\x4a\xd3\xd5\x41\xf8\xe8\x3d\x5d\xe1\x31\x9a\xb9\x47\xf7\x49\x90\xf4\xde\xc3\xf2\x0c\xc3\xf3\x9e\x5c\xc1\xf0\x90\x55\xab\xe1\x55\xff\x9b\x8d\xf6\xd2\xe6\xc6\x0f\x7c\xe1\x14\x0c\x0e\x9c\xd4\xfd\xd9\xa2\x8f\x15\x4f\x27\x7d\xf4\xb2\x4a\x70\x10\xdc\x47\xb4\x05\x70\xa5\x9f\x34\x72\xa1\xc2\x9a\x47\x87\xc0\x77\xc8\xd2\x00\x0f\xc7\x91\x26\x56\x8a\x06\xd5\x55\xb0\x23\xdc\xda\x24\xb5\x38\x5e\xf4\x84\xec\x09\xdc\x11\x40\x3b\x4d\x6d\x59\x85\xdd\x9f\xb9\x8f\xf0\xd3\xde\x83\x22\x4d\x0d\x8a\xe3\x2b\xe8\x0a\x2b\x0e\x58\x91\xc8\xe2\xa1\x49\x5c\xcd\x21\xe5\xbb\x5b\xa0\x9e\x91\xd1\xc3\xd6\xee\xf4\x76\x28\x35\x3f\x2c\xe0\xc8\xae\x58\x15\x4f\x56\x0a\x0a\x35\x49\x9c\x7d\x50\xa0\x58\x74\xd2\xaa\x3d\xb7\x1c\x2c\x34\x32\x20\xd8\x98\x3b\x95\x17\xe7\xc6\x39\xda\xe8\x89\xd9\x6d\x47\xa2\xa8\x53\x5c\x58\x8b\xb8\x39\x78\x48\x29\x45\xf6\xab\x66\xa0\x0a\xaf\x83\x0d\xbf\x1d\x90\xc0\xb9\x42\x92\x3e\x56\x0e\xf3\xb4\xd2\xba\x06\x90\x32\x1d\x1c\x7d\x9a\xce\x0c\xbb\x5d\xb1\x46\xaa\x50\x72\xc5\x7a\xcd\xa7\x45\x1e\x40\x5b\xa0\xf8\xfa\x3a\x95\x04\xde\x34\xd0\xa5\x6e\x2f\x24\xf9\x57\xcd\x0f\xc0\x30\x05\xab\x03\xc6\xf5\xf8\x54\xd8\x9f\xf9\xc6\xc3\x72\x67\x15\x07\xae\xd2\xb4\xb9\x78\xd5\x16\xa7\x6b\x47\x1e\x0a\xf8\xcb\xba\x71\x4e\xfd\xfa\xd2\x44\xd9\x21\x54\x8d\x21\x54\xd3\x51\xde\x1c\xc5\x4a\xaf\xd1\xc5\xa1\x04\x1f\x15\xd3\xc6\x6f\x1e\x0d\xee\x18\x69\x76\x20\x60\x8b\x69\x5b\xb7\x26\xdc\x8a\x2f\x91\xd9\x4f\xb5\x09\xe0\x6d\x68\x85\xc4\x61\x54\xba\x9c\x6d\x50\xc7\x2a\xa3\x6c\x6b\x9d\x51\x86\x89\xdc\x80\x26\x07\x60\xcf\xbf\x74\xd9\xce\xfe\x6a\x18\x89\xa2\x82\xa1\xc2\xf2\xd5\x05\x28\x1e\xc0\x28\x45\x02\xe5\x99\x01\x78\xe2\x36\xcd\x09\xe7\xd9\x9c\xca\x2c\xac\x78\x34\xa3\xf3\xe9\x28\xc7\xeb\xf5\x0b\x89\xe6\x64\x86\x0f\x87\x76\x71\x03\x4c\x9f\x1b\xf8\x19\x05\xc7\x07\x58\x8f\xce\x71\xcb\x1f\x09\x82\x21\xc7\x9b\x43\xe5\xc0\x79\x33\xb4\xb0\x54\x77\xe8\x2e\xac\x10\x9f\x2e\x6c\xb2\x62\xfe\x09\xb4\xe6\x9e\x9f\xef\xe4\x14\x46\xfb\xa3\xe1\x37\x23\x17\xcc\x6a\xf4\xcd\xc6\x97\x1f\x8e\xc1\x5e\x5d\x8d\x22\x43\x57\x8d\x82\x6a\x54\x55\x8d\x0a\xd5\x28\xea\xed\x84\xea\x8f\x4a\xf8\x88\x52\xaa\x26\x8a\xea\x31\x87\x73\xcc\x7d\x56\xba\xcf\x48\x49\x75\xb6\x82\x22\xe1\x23\xc6\xfc\x13\xc6\x04\x44\x9f\x19\xd1\xc0\x47\xd6\x3f\x46\x5d\x13\x59\x5f\xd6\xf2\x2d\xf2\xc3\xdb\xe4\xc7\x9d\x60\x6c\x3b\x44\x69\xcf\x80\x24\xc1\x9c\x24\x01\xc8\x67\xd0\xaa\x92\xf9\x27\x60\x0b\xc9\x8c\x70\xa7\x65\x2a\xdc\xc8\x94\x98\x6c\x2d\x1f\x5a\xb4\x17\x10\x2d\xc2\x52\x94\xc0\xf0\xc5\x30\xdb\x1d\x52\x24\x6c\xd0\xa2\x8d\x93\xae\x9a\x58\xea\xf5\x2e\xb3\x7b\x13\x08\x9a\x1d\xea\x36\xde\xfa\x58\x0d\x06\x99\x3a\x28\x00\x81\x03\xf6\x19\x62\x80\x8a\x8e\xa3\x9d\x28\x30\x61\x96\x1d\xc3\x19\x56\xb5\x4c\x10\x19\xf9\x74\xd7\x4c\x15\x04\x67\xa9\xec\xd8\x54\x9b\x34\x8e\xc6\x7b\x44\xd0\x9d\x51\x27\xb6\x88\x3b\x8a\x4d\x07\x52\xab\x99\xb2\x0e\x6c\x91\x62\x22\x68\x31\xb6\x3c\x98\xee\x34\x64\x42\xbc\x76\xe6\x04\x93\xc0\x69\x92\x10\x9e\x63\x02\xac\x7b\x41\xfa\x7d\x69\xa5\xff\xc1\x80\xe5\xb8\x45\x5a\xe0\x0b\xf0\x5a\x8e\xcc\x08\x23\x16\xa7\xe6\x00\xaf\x50\x80\xfd\x6d\xa2\xcd\x93\x19\x2d\x9d\x50\x7d\xa1\xba\x3c\xf1\x47\x21\x54\x27\x9a\xe1\xc9\x5b\x85\x9c\x5d\x88\x20\x20\x50\x93\x02\x7b\x36\xce\x76\xe3\x42\x81\x67\x40\x47\x21\x7b\x94\xa2\x3d\x5f\x48\x9a\x22\x46\xa1\x20\xa7\x51\x01\x2c\xb6\x02\x7f\x69\x83\x7c\x0a\xce\x56\x06\x8b\x09\x9b\xf0\x5d\x36\x9f\xc3\x46\x41\x70\xd5\x2e\xdd\x2a\x7e\x2a\x4a\x03\xae\x69\x1a\x8f\x59\x85\x25\x77\x47\x3e\xf7\x12\xe9\xc6\xb1\x0b\x6b\x51\x57\x8a\xbe\x64\x27\xc1\x13\xd7\xbd\xb1\xd1\xbb\xc7\xac\x5c\x1c\xb1\x92\xd7\x9c\x80\xc0\x75\x3d\xb0\x4d\x3d\x42\xe5\x58\xba\x5d\xe4\x5f\x45\xf8\xd1\x31\x68\x5d\x17\x8b\x05\x21\x2c\x40\x00\x40\x49\xdf\x39\xd9\x32\x69\x12\x9c\x29\xc7\xbc\x7b\x3d\xdc\x90\xec\x8c\x2c\x7d\x59\x53\xa3\x77\x4f\x43\x36\xbb\xa3\x01\xe9\xae\x6e\x8b\x88\x5b\xd3\x82\x39\x26\x6a\x92\xd4\x55\x8c\xc1\xf8\x7d\x03\x6c\xe0\x3b\x8e\x4e\x9d\xb5\x15\x9c\x36\xf1\xae\x7f\xab\x9a\x07\x51\xc5\x5b\x12\x55\x69\x75\x32\x51\x61\x59\x96\x14\xe0\xdf\x66\xb4\xb9\xea\x4b\xcb\x73\xcf\x26\xa0\x9f\x8b\x30\x56\x57\x64\x41\x25\x80\x81\x66\x8b\x20\xb1\x2c\xe8\x7c\x22\x78\x58\x65\x99\xbb\xff\x9a\x4f\x9e\x4b\xb4\xb0\x73\xba\x02\x75\xe9\x62\x5c\x1b\xa0\xcf\xd2\xb4\x7f\xa1\xd0\xd2\x2e\xb4\x25\x7d\x2e\x11\xb0\x07\x24\x24\x15\x74\x49\x54\xc5\xce\x14\x1e\x4f\x97\xbb\x5a\x05\x55\x13\xc1\xd0\x15\xe8\x8b\xae\x22\xc8\x81\xa0\x07\x7e\x0f\x67\xee\x5f\xf2\x8a\xee\xa3\xf7\x50\xdd\x73\x89\xde\x03\x83\x12\xaa\x8c\x00\xc2\x63\xbd\x4d\xed\x8c\x1b\xa1\x4e\x37\x59\xe9\x61\x9f\x22\x7f\xcd\x90\x22\x33\x19\x3d\x1c\xef\xef\xc5\xfa\x93\x1f\xfe\x7b\x6d\x69\x92\x78\xf3\x26\xa2\x9d\x94\x2c\xdc\xa5\x3f\xa3\x7a\xeb\xd2\x7f\xce\x60\x19\x05\x10\x3e\x3c\xd6\x21\x6e\x09\xc4\xe6\x11\x39\x5d\x6a\x04\x00\x57\x60\x11\x08\x48\x91\x04\x02\xf4\xb8\x88\x80\xb1\x75\xc2\xb3\x78\x28\x9e\x2a\x64\x29\x20\x49\x12\x4c\x9e\x45\xba\x98\xa7\xaa\xd3\x38\xe1\xb4\x40\xce\x42\xaa\xe6\xcb\x84\x97\xd1\x7f\xb2\x4d\x84\xb5\x2c\x30\x79\x1a\x15\xf5\xf1\x6e\x1d\xe8\x97\x38\x2e\xb0\xab\xbc\x76\xd6\x5d\xb5\x28\x04\x7a\x04\x52\x54\xa6\x89\x83\x53\x24\xf0\x80\x8d\x39\xdb\x80\xaa\x24\xd4\xd3\x56\xa9\xfe\xc4\x10\x73\xad\x2b\x30\xf9\x18\xb5\xee\x77\xd5\x6d\x1a\x05\x2d\x2c\x3b\x5b\x18\xdf\x34\xff\x1e\xb7\x32\x32\xaa\xb8\x31\x68\x1f\x93\xb2\xdd\xce\xc1\x29\x2a\xf0\x40\x41\x73\x15\x69\x56\x1c\x3e\x2d\xeb\x26\x2b\xd7\xe4\x12\x93\xdf\xa3\x26\x9f\x54\x73\x53\xe9\xca\x4e\x0b\x04\x0d\xf6\x62\x62\x43\xfb\x74\xda\x31\x95\xff\xbe\x25\xdc\x10\x93\xd3\xa8\x0d\xaf\xba\x0a\x15\x57\x28\x2e\xb0\xa5\x02\xb2\xa5\x66\x17\x0c\x98\x1c\x57\x78\xf3\xa6\x9f\xb9\x9b\x7e\xdb\x76\xdf\xba\x57\x0a\xb4\xb5\xcf\x55\xd0\x5b\xbc\x50\x74\x9a\x70\x99\x90\xe9\x34\x61\x09\x49\x96\x49\x4e\xa6\xc9\xe3\x67\x09\x49\x5e\x3c\x4b\x72\xf2\x5c\xe5\xf6\x55\x9c\x10\xd2\xce\x13\x92\xd8\xe4\x57\x09\x49\xde\xf8\xbf\x4f\x12\x92\x9c\x43\x11\xe7\x2b\x69\xdf\x2b\xfb\xef\xab\x15\xb7\x79\xf8\xdc\x3e\x2f\x56\x36\x9f\x16\x36\x27\x33\x21\xef\x9c\xdd\xba\xec\xee\xe1\xd5\x8a\x97\xee\xe9\x0d\x9f\xcb\xf0\xfc\x6a\xb1\xd2\xfe\xf1\x89\x16\xee\xe1\x9c\x99\x95\xb6\x8f\xae\x20\x28\x04\x0a\x80\x6f\xe1\x23\xc8\x0e\x59\x93\x1c\x3a\x30\x9d\x26\x3f\xfa\xc6\xda\x0e\x3c\xf6\x7f\x7f\xf4\xff\x3f\x86\x4e\x90\xe4\x79\x42\x92\xb3\x84\x24\xc7\x50\xf6\x8f\xcc\x76\xe5\x09\xbf\xb4\xb9\x99\x2d\xef\xf1\x52\xc3\xb3\x6d\xc6\x8f\xd0\xdd\x1f\x57\x85\x4d\x5f\x5d\xdb\x12\xf8\xd2\x96\x31\x33\xb6\x14\xf5\xde\x96\xc3\x67\xa1\xa4\x15\xd3\xb7\xae\x34\xed\x1f\x9f\x31\x3d\x5b\xb8\x42\x45\x11\x17\xcb\x5d\xb9\xb7\xae\xe0\x55\x69\x5c\xd9\x86\x03\x9f\x06\x35\x28\xf7\x74\xa6\xde\x87\xc4\x63\x3e\x73\x8f\x55\x87\xbf\x83\x8e\xd9\xea\xbf\x3b\xb2\x8f\xae\x53\x2e\xd6\x68\xef\x68\xa1\x05\x14\xfc\x58\x4a\xd5\x3b\x56\x37\x42\x0a\xfb\xe9\x90\x4c\x1f\x92\xa1\xcd\xf8\xec\xde\xfc\xde\x2d\xb4\xf3\xd9\xb3\xde\x9c\xf4\xfc\x63\xf5\x7c\x72\x72\x72\x42\x7a\x75\x8a\xfd\x66\x31\xbe\xb9\xe9\xd9\x45\x65\x1f\xc6\x65\xd9\x7c\xee\x7d\x6a\xfe\xfa\xf4\xe9\x13\x7c\xf5\x79\xb4\x21\xbd\xcf\xc3\x4d\x62\x1b\x6e\x7f\xf5\xbe\x66\xe6\xeb\x90\x62\x73\xec\x26\x04\xfe\xcb\x12\x92\xfc\x9f\x84\x24\x83\x84\x24\x3b\xb6\x0d\x09\x49\xfe\xf8\x38\xff\xc6\xfe\x59\xed\x0d\xf7\x87\xee\x61\x6f\x64\x87\xf0\x8c\xd9\xa9\x1c\x43\x15\xff\x20\xff\xf8\xc7\x70\xf7\x1f\xff\xf8\x47\x42\xdc\xf3\xff\x81\x2f\xd9\x7d\xf7\x62\x68\x3f\xfc\xc7\xc9\x30\xc9\x49\xf2\xfa\xfc\x38\x21\xc9\x57\x89\x7d\xea\x1d\xab\xa2\xb0\x33\xff\x79\x43\x92\xc2\xe8\x84\x6c\xdf\xc1\x3e\x63\x66\xb1\x7b\x55\x28\xa5\x11\x3c\xb2\xcb\xd2\x59\xe6\x51\xbe\x1b\x60\x67\x10\xde\xd5\x7c\x59\xb0\x19\x47\xf7\xfe\x35\xfd\xd7\x6e\xfe\xcf\x3f\x76\x27\xf7\xec\x81\x51\xc1\x43\x57\xec\x2b\x35\x69\x0a\xd6\x8e\x93\xd1\xf8\xc1\x26\x27\x67\xaa\x01\x08\xf7\x32\x3a\x34\x3b\x58\x57\xde\x0c\xba\x5f\x57\x7b\x71\xef\xda\x8e\x19\x78\xe4\x12\x49\x8f\x15\x32\x4e\x3d\x5c\x23\x01\x78\xa7\x91\xdd\x72\x59\x08\x03\xec\xe4\x74\xe8\x10\x82\x6d\xf6\x5a\xa9\x02\xa2\xb3\x25\x21\x60\xfe\xe2\x13\x5f\xa8\x2d\xc7\xe8\xaf\x9f\x79\x74\x00\xc0\x66\xe7\x3d\x4b\xa2\xc0\x19\xdf\x2c\x78\x48\xab\x1d\xcf\x39\xf9\x3a\xd9\xfd\x3a\xe6\x0f\x9e\xc4\x87\x2c\xf4\x7b\xfa\xa7\xda\x7d\x51\xac\x34\x2b\x6c\xf7\x22\x20\xca\xe3\xc6\x95\x52\x4f\xc8\xde\x99\x5a\xaf\xd1\x99\x9a\xf2\x9c\x4a\xbe\x2b\xaf\xd3\x14\xfe\xec\xce\xd4\xcd\x8d\x92\xcd\x5f\x0e\x3c\x9e\x97\xdd\xa9\x53\x2b\xdb\x40\x49\x40\x49\xff\x54\x14\xa1\x3f\x15\xfd\x53\xad\xd7\x9f\x37\xd0\xa4\xa7\x90\xf1\x74\x4e\x87\x39\x4d\xc2\x8f\x84\xfc\xa9\xec\xcb\x63\x76\xfb\x82\x6b\xa1\xe6\xe5\x13\xa5\x6f\x98\xa1\xa3\x9c\x26\xed\xc4\xed\xcc\xe7\x86\xc9\x39\x2b\x94\xe4\x74\xaf\xf1\x41\xfd\x22\xfa\x28\x94\xbd\xef\xb2\x6e\x97\x1a\x97\x77\xdf\x67\xda\x2e\xe9\x99\x92\x66\x11\xca\x7a\x90\xd3\x24\x4e\x68\x66\x8a\xca\x7b\x58\x65\xdc\x2e\xf1\x44\xb3\x92\x7e\x93\xd3\xc4\x3e\x84\x44\x08\xbc\x73\xcc\x6e\x9f\x5f\xbd\xe1\xfc\x2d\x7d\x94\xd3\xa4\x99\x14\x32\xda\x67\x2e\xe7\x2f\x99\xbc\xe6\xf4\xdb\x9c\x26\x71\x42\xdd\x3b\xc3\xc3\xd0\x0e\xa1\x6b\xe1\x77\xc8\xf1\x4a\xdc\x54\x39\xec\xe8\xd7\xbf\xe3\x32\xe2\x5c\x7b\xbe\x9c\xed\x9c\x67\x20\x2d\x3b\x97\xae\x92\x8e\xec\x80\x37\x92\x9a\xf9\xdc\xb7\x25\x1d\xdd\xaf\xf2\xf9\xa4\x90\xef\x08\x4c\xd0\x67\xb7\x47\x6a\xce\xe9\xc8\x8e\x79\x9c\xd2\xce\xe5\x2a\xa1\xa3\x87\x51\x3e\x97\xd6\xce\x79\xc6\x6e\x38\x1d\x7d\x13\xe5\x83\xb0\x38\xcd\x5c\x82\x97\x74\xf4\xa8\xce\x23\x78\xd5\x2e\xef\xd2\xaa\x24\x2b\x84\xb9\xa5\x23\x3b\xfa\xcd\xb4\x90\xb3\xde\x90\x74\xcf\x8e\x7f\xfd\xbb\x5a\x04\x1f\x8d\x66\xc7\xcc\x30\xba\x67\x87\xbf\xfa\x69\xdf\x63\xf2\xbd\x65\x48\x3e\x71\x6d\x0f\x71\x58\x39\x89\xf9\x60\x9f\xaf\xf8\x87\x84\x24\x37\x4c\xda\xb3\xe5\x93\xa2\x09\x97\x3b\xaf\xcf\x13\xf2\x9d\xa2\x9f\x6f\x98\x7e\xcb\xf5\x38\xf1\x36\xa3\xc9\x86\xbc\x8e\x52\x4f\x8f\x5e\x27\x1b\xf2\xce\x6e\xd4\x77\x8a\xbe\xf3\x1b\xf5\x9d\xda\x3d\xff\xe1\xf4\xc9\x2b\xd8\x4f\xf0\x94\x90\x77\xca\x26\x3f\x7e\xf1\xe2\xe4\xec\xf8\xe2\xe4\xf1\xf7\x27\x2f\x9f\xfe\x06\x1b\xb4\x99\x14\x32\x1e\x3d\x7f\xf6\xec\xe4\xcc\x95\xe0\x9f\xed\x2b\x4c\xde\x28\xfa\x49\xd5\x44\xfa\x37\x20\x47\x2d\x28\x69\x7f\x63\x98\xa6\x2f\x50\x72\xf2\x71\xc9\x67\x86\xcf\x3d\x19\x3c\x9d\xf7\x8c\xea\x5d\x72\x07\x9d\x62\xb9\x26\xef\x1c\x97\xf4\x69\x82\x37\x18\x30\x4b\xda\xf2\x37\x4f\x53\xf4\x46\xd1\xbf\xa4\xf8\x31\x96\x70\x8b\xe3\x34\xbb\x5b\x01\xc8\x89\x68\x09\xbf\x1a\x4f\xf4\x74\x98\x8f\x75\xcb\x83\x44\x4c\x9e\x69\xb8\xd1\x95\x78\xfc\x9a\x23\x2b\x40\x45\x35\xfd\xd8\x21\xb0\x74\xd4\xb6\xad\xcf\x65\x15\xf0\x9f\xf6\x32\x7a\xf6\xff\x27\xef\x4f\xb8\xdb\xb6\xb5\x45\x71\xfc\xab\xc8\xba\xfd\xab\x40\x0d\x2b\x52\xd2\xf6\xb4\x52\x50\x5d\xd7\x49\xda\xb4\x99\x9a\xa9\x83\xaa\xeb\x47\x93\x90\xc5\x86\x06\x55\x12\xb4\xe3\x58\x3c\x9f\xfd\xbf\xb0\x31\x10\x20\x21\xd9\x4e\xdb\xf3\xee\x5b\xbf\xb5\xce\x69\x2c\x62\x06\x36\x36\xf6\xbc\x1d\x61\xd0\x66\x83\x72\x9a\x91\x8c\xa6\x6e\x82\xc5\x11\xc8\x6b\x74\x8e\x87\x46\x07\x55\xd2\xf1\xb4\x6c\x62\x85\x97\xfb\xfb\xf8\x6d\x01\x22\x2a\x3e\x8f\xe6\xe5\x62\x41\x72\xe0\xea\x1c\x6b\x58\xcd\xc0\x42\xf4\x16\x95\x06\x02\x13\x66\x59\x52\xc7\x0e\xc9\xba\xe7\xde\xd5\x0a\x6c\xe3\x9e\x5b\x50\x36\xe7\x8b\xe9\x8f\x39\xe4\x6e\xfa\x05\x04\xee\x8d\xaa\x87\x95\x90\x30\x57\x94\x20\x87\xd7\x19\x26\x1c\xeb\xc0\xdc\x8d\xa7\xf1\xe5\xe7\x03\xed\xc5\xee\x98\xfe\xf9\x2c\xf6\x8f\xf2\x19\xdf\x6c\xb4\x05\xdf\x37\xba\x4b\xc7\x32\xae\x74\x8d\xc5\xba\xdb\x1f\x8c\x42\x20\xf0\x4c\xc8\x13\x77\x6c\x15\x44\xe9\xbb\xce\x76\x7b\x6a\x4b\xe5\x67\x7c\x3e\x5a\x50\x31\x41\x8f\x0b\xf4\x49\x4e\x7e\xc8\xe5\x46\x76\x9a\x51\xd7\xdd\x88\xb7\x06\xd1\x09\xf5\xdb\x9e\x4b\x8d\x79\x4a\x13\xff\x49\x09\x15\x79\x37\x53\x8d\x72\xf0\x91\x57\x03\xcc\xed\x54\x66\x2e\x3c\xe3\x13\xae\x0c\x17\x1c\xdb\xad\xd2\xbf\x1b\x2b\xe5\x81\xf4\xe5\xe7\x4e\x9c\x7e\x6b\x65\x9d\x23\xd0\x76\x38\x42\xd9\xd4\x9b\xbc\x98\x5b\xe7\x22\x7f\xec\xce\x6a\xe4\x54\xee\x8f\x66\xff\xe6\x13\xc7\x30\x2e\x2a\x5d\x72\xe6\x9b\x6f\xbe\x19\xff\xcb\x31\x57\x72\x0a\x11\x28\x17\x46\x03\x86\x65\x25\xa0\x4f\xf2\x92\x8e\x48\x59\xd2\x91\x63\x70\x53\x36\x0a\x2d\x9b\xcc\x92\x44\x54\x09\x3b\x6c\xce\xa1\xd1\x34\x6f\xc4\xc4\x4e\xce\x2b\xc8\xed\x29\x49\xbe\xf6\xb6\x37\xce\x86\xf3\xfd\xfd\x7c\x61\x33\xe4\xcd\xe3\x05\x08\xf6\x63\x10\xa9\x44\xa4\x34\xfa\xae\x50\xa2\x86\x12\x97\x17\xa9\x88\x57\x68\x3c\x28\xf1\x55\x1c\x95\xac\x37\x9a\x28\xdf\xa3\xa8\x44\x25\x26\x89\xe1\x5c\x57\x4e\xdc\x06\x3d\x14\xe4\x27\xa2\x15\x49\xe9\x45\x01\x4a\x55\x4c\x2a\x48\xba\x89\x12\x5a\x90\x15\x4d\xf1\x04\x29\x79\x1d\x59\x51\xc0\x52\xd5\xa2\xb1\xa4\x5e\x19\x03\xf5\x4c\x0e\x34\x7d\x2b\xbb\x58\x11\x3e\x5f\x2f\x48\xe3\x33\xb8\xa4\x00\x97\x6b\x37\x7c\xd6\x32\x10\x7e\x65\x69\x44\x6e\x69\x89\x96\x84\xdb\x8c\x0a\xe7\x83\x01\xec\xff\x52\x7b\x67\xcc\xcf\x17\x90\x06\x60\x39\x8c\x78\xbc\xca\x8b\xc7\xc9\xfb\x05\xae\x6b\x95\xad\x02\x96\x3f\x86\xe5\x9f\xea\x5d\x25\x97\x66\x7b\x5f\x47\x28\x22\x7f\x32\x54\xca\xb3\xf6\xb2\x98\x90\x53\x72\xa9\x21\x54\xf5\x93\x28\xcb\xd9\x49\x87\x24\x7f\xc3\x21\x84\x93\xc8\x7b\x09\x13\xac\x38\x4b\x39\x03\x72\x5c\x2e\xa2\x97\x2f\x7b\x67\x95\x88\x04\xeb\xc9\xfb\x13\x69\xdb\xa3\xc2\x21\xd2\x4b\xf2\x69\xff\x53\x73\x9a\xfa\xdc\xcc\xa9\xbd\xc9\x27\xca\x62\x5c\xcf\xfb\xa4\x03\x16\x27\x10\x0f\x07\xc9\x3f\xe8\x79\xa1\x4c\xc8\xb9\x99\x32\xf4\xf1\xad\xea\xe3\xc8\xf4\x71\xd8\xe9\xe3\xd0\xf4\x71\x08\xfe\x7c\x11\x39\xd2\x66\x9f\xdc\xb3\xb3\xae\xca\x1b\x44\x94\x77\x54\x21\x7c\x1e\x99\xcc\xdc\xda\xce\x7f\x90\x3a\x0f\x49\xbf\x4f\x62\x1a\xed\x8f\xa7\xf1\x7d\x1a\xed\xe7\xd3\xd8\xb4\xac\x00\xda\x83\xb7\xa3\xc2\xe5\x3e\xad\xa6\x5b\x01\xbf\xc2\xe9\x12\x55\xf7\x47\xb2\xda\x63\x24\xe6\xc5\x41\xb5\x70\x24\xee\x09\xad\xbe\xf9\xe6\x9b\xbb\x53\xbd\xcb\xf7\x06\x95\xde\x67\x05\x1e\x2b\x98\x6b\xbc\x20\x6b\xf3\xc7\xd2\xa0\xcc\x64\x31\xed\x4c\x66\x39\xb3\x2e\xce\x62\x9e\x2c\x14\xd4\x2c\xc9\x8a\x94\x64\x8d\x27\x90\xfa\x71\x49\x04\xfc\x56\xb5\xd6\x70\x01\x9c\xa3\x51\x97\xf2\x9c\xca\xe6\x0e\x6c\x2f\x8d\x31\xe8\x39\x29\xbd\xfa\x77\x27\x2b\x79\x06\x70\x79\x12\x4c\x44\xab\xf8\xde\x24\x71\x8b\xe5\x2b\x59\xd7\x4d\xda\xf0\x53\x88\xee\x3f\x86\x9d\x3d\xfd\x66\x34\x18\xa8\xf4\xfe\xa7\x8d\xcf\x87\x6c\x78\x2a\x77\x08\x4f\xc5\xfc\x72\x0b\xb6\xbd\x3f\x1a\x0c\x60\x9c\x4b\x3d\x42\xb4\xef\x25\xdf\x4d\xca\xb6\x91\x45\x31\x17\xdb\x30\x77\x73\xff\x2d\x49\x93\x97\xd3\x54\x8e\x81\x76\x35\xa4\xff\x96\xc8\xf6\x60\x8c\x09\x40\xa5\x7c\xf9\x2b\xb0\xde\x9a\xa7\x12\x15\x78\xd6\x28\xab\xce\x84\x7c\x22\xd2\xbc\x8d\x72\x0f\x4b\xab\xfa\x51\xac\x3c\xe8\x83\xb8\x41\xa7\x9a\x74\x70\x61\xa6\x08\x76\xf6\x48\xd2\x10\x68\x1d\x15\x25\x7b\xcc\x25\x1f\x3e\x1e\x61\x4c\x0a\xfa\x5d\x2e\x09\x99\xb6\xb8\xbf\x98\x15\x93\x7e\x2e\x56\xac\xe8\xd7\x48\x90\x9f\x73\x3c\x85\x71\x51\x77\x56\x05\x86\x08\x8e\x50\x57\xf9\x55\x06\x2a\xe9\x72\xdc\x82\xb5\xed\x15\xb5\x60\x53\x2d\x56\xbf\xfb\x35\x3c\xc7\xa0\xd1\x2f\xc1\xa4\x6e\x0f\x02\xd1\xa2\xb5\x79\xd3\x09\xdf\x7e\x3a\x96\x9e\x85\xbe\xfe\x9d\x12\x7b\xc8\x56\x4f\x3c\x17\x0e\xb2\x9e\x46\x1a\xa3\x0b\x83\xd1\xbb\xc7\xb8\x6e\x11\x13\x7a\x5a\x5b\xd3\x4a\x2b\xcd\xdb\xbc\x58\x90\x80\xe1\x54\xdb\x03\xc9\x44\x44\xcc\xe9\x9f\x0c\x65\xce\x53\x93\x0f\x06\x2f\x8d\x0a\x23\xd7\x48\x7a\x6d\x6f\xd9\xbf\x35\x92\x6c\xcc\x4a\x4b\xe3\x36\x21\xa7\xaa\x12\x33\x1f\x8c\x1b\xb2\x21\x05\x73\xa5\xab\x82\x8e\x74\xa0\x5f\xa0\x71\x38\x9e\x0a\x13\x62\x32\xb5\xfa\xc4\x79\xba\x98\xa4\x0e\x35\x15\xa9\x40\x28\x4d\x12\xa7\x46\xe7\x5c\xec\xef\x5b\xb0\xca\xbe\x19\xcd\xd8\x3c\x5b\x4c\x90\xc9\x03\x4d\x04\x26\x29\x82\x54\x40\x80\xcc\xfe\x0d\x29\x7d\x48\x84\x1a\x95\x14\x48\xc7\x8c\xa1\x1b\x1c\x1a\x12\x94\x0f\xd7\xf9\x1a\x29\xeb\x7f\xf5\x97\xdb\xa4\x09\xec\x61\x68\x20\x46\x8b\x69\x93\x5a\x44\xb7\xb1\xfa\x18\x13\x2f\x14\x0c\x9e\x54\xac\xa0\xf3\x92\xde\xf9\xbd\x5a\x2e\x97\x09\xfa\x3d\xd9\xc7\x93\xd9\xef\xc9\x67\xea\xf7\x9d\xd3\x94\x9c\xfa\xa5\xba\x80\x5c\x96\xf4\xce\xff\xfc\x5e\x7e\x86\xd4\x87\xdf\x93\x7d\xa7\x1d\xfe\xbd\xfc\x8c\xc8\x42\x95\x25\x75\xb3\x06\xc6\x19\xbe\xde\x21\x67\xb6\xc3\xdf\xef\xcc\x7e\xff\x4c\xf6\x3a\x71\x7a\x3e\x4d\xc9\x89\x33\xe4\x9d\xd9\xfc\xbf\x3e\x5b\x04\xe6\x75\x04\x95\x1e\x7e\x31\x1a\xdd\x39\x6d\x4e\xf6\xb0\x0c\x2b\x6c\x20\x3d\x5b\x41\x8c\x27\x45\x49\xf3\xfb\xf7\x0d\xdb\x4c\x62\x1a\x0b\x24\x0f\x9f\xd2\x78\x30\x40\x31\xd5\xef\xae\xba\x3e\xf2\x53\xb9\xa1\x1d\x6e\x1a\x93\xcc\x96\x68\x96\xd9\x17\xa2\x1a\xc3\x80\x9f\xf8\x60\x80\x7e\xe2\x94\xc9\x63\x43\xcb\x12\x63\xa2\xe3\xd5\x96\xd6\x44\x6c\xd6\xef\x4f\x22\xe3\x99\x0e\x04\x7a\x4e\xb2\xd9\xbd\xbb\xda\xf7\xc3\x56\xd1\xb4\xd0\x4f\x39\xe2\x6e\x30\x8b\xd4\xe5\x79\x2a\x81\x2a\xd7\xcf\x3e\x1e\x0c\x84\xfa\x27\x8c\x71\xbb\x2c\x8f\x25\xe1\x1d\x1e\x27\x58\x93\xce\x55\x3c\x8c\x05\x9e\xa0\xb6\xc1\x97\x28\x2a\xb6\xe7\x49\x05\x20\x2e\xa7\xe4\xa2\x7a\x2b\x56\xb0\x3e\x61\x44\xd6\x21\x7d\x4a\xfb\xb8\xee\x5a\x3f\x99\xd4\x65\xe0\x68\x11\xcb\xb7\xb4\x72\x4c\x45\xb6\x1c\x74\xa6\x23\x8d\x9e\x97\xf2\x94\x2d\x38\x44\xa4\x20\xb9\xba\x52\x19\xbc\xff\xf9\x60\xf0\xb6\x04\x5b\x69\x8d\x88\x4d\xfe\x32\xee\xa7\x2d\x7b\x5b\x86\xd4\x8f\x86\x49\x26\x39\xcd\xf6\xc7\x53\xcd\x52\x3b\xec\x54\x43\x60\x65\xfb\x77\x49\x6c\x65\xcf\xe7\xa0\x71\x1f\x11\x15\x85\x2b\x0e\x44\xe1\x8a\x25\x15\x92\x2e\xd1\x78\x90\x18\x22\x3e\xdd\xb7\x6f\xd8\x4a\xbe\x61\x66\xbc\x83\xf1\xc1\x1a\x93\x6a\x43\xdf\x95\x68\xad\xb0\x62\xbf\xaf\x8c\xb9\x74\x8d\x95\xc5\x13\x66\x8a\xf7\xef\xdf\xdd\xa0\x62\x36\x9e\xc0\x53\x68\x2b\x82\x45\x92\xc4\x57\xb4\x22\x6c\x9e\x2f\x1a\x31\x40\xe9\xee\xfa\x3b\x97\x7d\x1b\xdf\xbf\x0f\x7a\x81\xb3\x54\x9e\xf9\x3d\x57\x8b\x7c\x5c\x7a\xe1\xbf\xe4\xf6\x49\x4a\x33\xa5\x23\x12\xd1\xbd\xb1\x41\xeb\x48\xd0\xb3\x72\xc8\xde\xb3\x18\x31\x8c\xa7\x38\x02\xf6\x9c\x52\xda\xd7\xf7\xfc\xb3\x7e\x13\x09\x55\x7f\x83\xa4\xab\xa9\x71\x03\x83\xee\xf0\x04\x15\xfb\xd4\xf5\xb7\x48\x8d\x0c\x62\x5f\x76\x68\x10\x35\x91\xec\xeb\x58\xbe\x44\x7b\xa3\xc6\x7c\xb6\x69\x89\xdc\x74\x8d\x17\xc1\x83\x1f\x91\x5c\x27\xe3\x57\x39\x23\x49\xf0\xe9\x9d\xe8\x3c\xc8\x06\xdd\xd8\x27\x76\x12\x11\x78\xfb\x27\xf3\x05\x51\x4f\xac\xfc\x4b\x3d\x34\xf2\x2f\x45\x3d\x4d\xe6\x8b\x7a\xda\xb9\x4f\xfa\xa4\xde\x95\x48\x0c\xcf\xa2\x94\x6b\xd3\x30\x4c\xee\x92\x83\xf1\x81\xf7\x8d\xc0\x31\xdf\xc5\x35\x86\x34\x8a\x51\xdb\xa6\xc7\x0a\x74\xac\x24\xc2\x3a\xbc\xd9\x4f\x94\x4f\x0a\xed\x0d\xc1\x6b\x70\x82\xcb\x5d\xb0\x4e\x55\x59\x49\x62\x3a\x9a\xc6\x4d\x8c\x76\xe0\x1f\x4c\xb5\x8a\x96\xf3\x78\x41\x12\xf9\x02\xab\x24\xd0\x55\x20\x09\x74\x35\x5f\x79\x7c\x86\xf5\xcd\x59\xab\x1a\x4b\xaa\x1d\x52\xd7\xf8\x60\x3c\x95\xb5\x69\xff\xf7\xf7\xf7\xe2\xbd\x83\x03\x0d\x12\x06\x48\x96\x06\x48\x0e\x0e\x7e\x7f\x7f\x8f\xf5\x71\x5d\x67\xf4\x49\x09\xd8\x54\x1f\xa5\xa2\xbd\xe4\xac\x2a\x1d\x1c\xb9\x8f\x49\x82\x37\x59\x28\x17\xaf\x11\x95\xc9\x83\x94\x3b\x7a\x0f\x12\xb8\x67\x9e\xc7\xd7\xf7\x3e\xa8\xcb\xa5\x6a\x8a\x63\xac\xe1\xfd\x69\x09\xd1\x03\x8c\xf8\xf2\xb2\xec\x9c\x86\x01\x45\xda\x57\x0f\x26\x18\xa8\xcf\x46\x13\xd9\x83\xbd\xfa\xc2\x40\xe9\x18\x4b\x24\x40\xfa\xfd\x1a\x32\x96\x7a\x69\x03\x0d\x1a\x8c\xe6\xd9\xfe\xfe\x62\x28\x8a\xf4\x0c\xe1\xe9\x58\x9b\xbc\xe5\x34\x6f\xa4\xa8\xf2\x7d\x9e\x4d\x28\x9e\xa1\xdf\x2f\xf6\xe5\xdb\x7c\x87\xf4\x3f\x19\xf7\x31\x26\xc6\xb7\x7b\x30\xd0\x89\xff\x72\x93\x45\xf7\x69\x89\x54\xcf\x78\x6a\xc8\x9f\x6f\xb8\xad\xcd\x4d\xc6\x5b\x8d\x74\xd4\x45\x29\x88\x03\x99\x93\x54\x5f\x00\xa1\x3c\xa8\xca\x09\x77\x13\xe2\x96\x36\x14\xb9\xd6\xbe\xcd\x17\x53\x8d\x41\x28\x04\xbb\x5c\x90\x54\xfe\x27\xa2\x77\xe6\x57\xf5\x42\xbe\xfc\x79\x81\xa2\x61\x16\x95\xca\x9c\x9d\x8e\xa6\x82\x46\x06\xa5\xd8\xcc\x6a\xa2\xf1\xaf\xef\xd7\x92\x77\x9c\x8f\x16\x8a\x8c\xd3\x24\xd5\x88\xd2\xc2\xa3\xe7\x72\x0f\x9f\x70\x92\xe1\xe9\x65\x39\x14\xac\x14\x28\xc7\x33\xfd\x7e\x7f\x5f\xa2\xbc\xc9\xdf\x0e\x8f\x64\xb6\x3f\xd6\xcc\x9e\xf2\x4d\xf5\x7b\x2d\xbb\xbd\xa6\x36\x4d\xb0\x6a\xac\x03\x66\xf6\xaf\xfa\x3a\x94\x63\xec\xb7\x71\xa2\xbe\x42\xc5\xd8\x4b\xac\xfc\xa4\xdc\x66\x8b\x22\x31\x8e\xfc\x4f\x45\xe7\x8b\xa9\xd0\x2c\x88\x71\x4f\x37\x04\xbf\x9d\x8b\x21\xdc\xed\x18\x86\xb3\x53\x1f\x2c\xe9\x91\xa5\xe8\x3b\x49\xd7\x0c\x4f\x99\x78\xcc\x25\x71\x90\x27\x97\x0f\x95\xee\x02\x41\xea\xf7\x27\x29\x4a\xf0\x66\x63\xfd\xd9\x56\xb3\xf7\xcd\x1c\x4b\x12\x93\x8a\xac\xc0\xf4\x70\x84\x27\x23\xc7\x2e\xa8\xb3\x10\x55\xb9\xb9\x6a\x09\x1d\x91\x15\xcd\xb5\x35\x14\xb8\xc2\x1a\xf8\x5f\x53\x9d\x8e\x57\x23\x60\x23\x6a\x58\x0d\x79\x9e\xb0\xd7\x0d\xf7\xf8\x2c\x4f\xd8\xd0\xc4\x78\x7d\xf6\xfc\xc1\xc3\x89\x42\x38\x2b\x72\x4e\x97\x43\x11\x9d\x3e\x8b\xce\x5a\x6a\x08\x09\x43\x27\x1d\xd7\x8d\x73\x8c\xaf\x1e\x4b\x7a\xe2\xdb\x9c\x9c\x83\xe8\x41\xa7\xe2\x9f\xaf\x17\xf4\xdc\xe2\xcd\x53\xba\x04\x1b\x75\x48\x66\x5b\x92\x4b\x3a\x9a\x5e\xde\x3f\x35\x97\xf7\xd2\xe0\xc4\x33\x7a\x3a\x4c\x05\x3b\x43\x97\x98\x9c\xd0\x33\x88\x8a\xdb\x9a\xc5\x99\xc2\xbf\x0d\xb5\x33\x7b\xd5\x99\xd4\x09\x06\x22\x27\x23\xba\x32\x59\x13\xd5\x17\x19\x91\xa3\x74\x7e\xb2\x98\x25\xe9\xe4\x10\xfe\x58\xa5\x13\x65\x3a\xf6\x5a\x2e\x62\x4d\xce\x70\x9d\xd0\xce\x19\xac\xc8\x5a\x9e\xc1\xfe\x18\x6f\x12\xf2\x5b\x89\x22\xb2\x26\x15\x76\x25\x7c\xb0\xa1\xaf\x1f\xfe\xe2\xec\xe6\x11\x5d\x81\x63\xdc\x91\x8a\x71\x09\x09\x81\x0f\xe9\x51\x33\xf3\x29\x6c\x1c\x10\x4f\x87\x92\xc8\x3d\x52\xfb\x67\xfb\x27\x87\x83\x01\x4a\x28\xac\xe4\x88\xac\x3d\x42\x6d\x93\x78\xec\x35\x0c\xaf\x89\xf1\x66\x06\xaf\xe8\xa9\xa6\x32\x3a\x33\x81\xe3\x7c\x65\x02\x24\xc4\x73\x8b\x6d\x5f\x49\x42\x61\x3c\xc2\x0b\x35\xbb\x37\x39\xe9\xf7\xd5\xbc\x80\x30\x50\xc0\xfb\x56\xfe\x7e\x68\xf7\xa1\x5e\xd1\x15\x38\x4e\xbf\x4a\x4f\xb2\x94\x9f\x1a\xda\x2b\x71\x0c\xca\x2c\xfb\x3c\x52\xe1\x36\xac\x36\xc6\xb1\xe0\x6a\xd7\x31\x2a\x9b\x7f\x83\xce\xc6\xd2\xc4\x8d\x0d\x97\x27\x12\x34\x86\x92\x4e\xdf\xa6\x95\x24\x06\xb6\xbc\x3d\x23\x65\xc4\xbf\xe1\xf7\xef\x8f\x6b\x34\x82\xae\x9c\x21\x5e\x97\xed\x37\xf1\xfe\xfd\xf1\x66\x4c\x54\xaa\x40\xa2\x75\x0e\x2a\xbb\xc0\x73\xc9\x99\xcd\x35\x63\x38\xdc\x9f\xa9\x3f\x66\xf8\xf7\xc5\x1d\xf2\x62\x6b\xd9\x06\x39\x4c\xa1\xe6\x09\x35\x37\x79\xe7\x94\x3c\x2b\xe9\x1d\x74\xf5\x7b\xf9\x19\x46\x6f\x0f\x5f\x1e\xa3\x17\x4f\xde\xbc\x3c\x7c\xb2\x79\xf5\xf0\xc9\xc3\xa3\xd7\x18\x1d\x4b\x06\x71\x86\x91\xe4\x30\x65\xf5\x97\x25\xbd\x73\x85\xe6\x87\x07\xbf\x8d\x0e\xbe\x3e\x5e\xec\xe3\xfa\xce\x29\x79\x64\xd9\xca\xc7\xe3\xaf\x9e\x1d\x3f\xfc\xe5\xc5\x31\x7a\x7c\xf4\xc6\x34\x36\xac\x25\x79\x20\xeb\xdd\xf9\xfd\xb3\x3b\xe4\x0f\xf9\x57\xb2\xff\xfb\x04\x58\xdf\x3b\x0d\x9b\xf9\x9d\xa7\x13\xf9\xc8\xc8\xdf\x07\xe3\xc6\xb6\x53\xbb\x7c\x82\x8f\x3b\x04\x68\x2a\x4c\xb8\x26\x81\x49\xae\xf8\xd3\x8e\xe1\x67\xd7\xad\xc7\x25\x55\x65\x1b\x92\x4b\x94\x6f\x90\xff\x7c\xb1\x98\xb6\xc5\x6e\xc1\x88\xf7\x20\x82\x62\xb5\x84\x32\x13\xd4\x54\xbe\xcc\xd3\x86\x63\xd4\x92\xab\x89\x25\xbd\x44\x43\x9f\xe3\xfd\xbb\xfb\xc2\xb5\x10\xd2\xbc\x92\xa4\x37\x4b\x16\x15\xf1\x0a\x71\x76\xd1\x7b\xc9\x4e\x1f\xbe\x5f\x23\xdd\xec\xf7\xdf\xef\xfc\xfe\xfb\x67\xbf\xcb\x83\x0f\xf6\x69\x9f\x3d\x39\x13\xef\x0d\x2d\x94\x1f\x7e\xd4\x50\xa7\x55\xd8\x7e\xc8\x50\x3e\x47\x25\xe9\xf7\x24\xc7\x99\x62\xcd\x95\x9d\x80\x32\x66\x67\x5c\x64\x1b\x69\x22\x69\xd4\xb0\x6b\x49\x0f\xad\x30\x59\xd2\xd1\x74\x79\x7f\x6d\x9a\x2e\x4d\xd3\x73\xba\x9e\x2f\x9d\xa6\x26\xf5\xdb\x29\x3d\x9f\x02\xa3\x76\x3a\x18\x00\x1f\x9b\x91\x78\x3e\x5a\xc0\x13\xc7\xc9\x29\x6e\x84\xc5\x97\xf4\x7c\xea\xf8\x12\x5a\xca\xf8\xb2\x13\xa9\xdb\xd1\x7f\x00\x0e\xeb\x3d\x3e\x7a\xd3\x63\xef\xd7\x05\x2b\x21\x01\x45\xea\xa6\xc2\x48\xc9\xa7\xfd\xde\x19\x2b\xcb\xe8\x94\x0d\x3f\xc5\x78\xaa\x71\x5a\x49\x04\xb9\x24\x87\xce\x94\x38\x01\xc4\xb7\x37\xc2\x56\xa7\x6b\x27\x77\x46\x3f\xff\x17\xa5\x74\xe5\x3a\x86\x8f\xe4\x83\x85\xbc\x4f\x67\xc0\x6c\x92\xbb\xa3\x7d\x65\x26\x32\x6c\x98\x59\xe7\x1c\xcf\x66\x77\x27\x63\xac\x12\x20\x9c\xe1\x78\xa8\x12\xb7\x81\x85\x32\x00\xb2\xe4\xd9\xed\xc8\x47\x14\x74\x9a\x30\xc3\x13\x3c\x8d\x6d\xa2\xb7\xf9\x02\x5a\x1c\x81\x9d\x68\x5d\xeb\x27\xb8\x58\xd0\x2b\xcd\x6d\xe5\x86\xc5\x2a\xc1\xc4\x5e\xb3\x3d\xf9\x6c\x34\xc9\x35\x43\xa9\x5e\x3a\x6e\x28\xde\xc2\x04\x27\x23\x31\x7d\x55\xa0\x82\xe4\xe0\x07\xf9\xe5\x42\x09\x13\x72\x92\xe2\x36\xab\xe6\x29\x23\xa9\xca\xaf\xbb\xd3\x55\x45\x25\xfd\x15\x72\x90\x92\xa2\x6c\xd0\x08\x94\x30\xa5\xae\x78\x29\xd6\xa5\x2d\x41\x94\xaa\xe4\x7f\x24\x15\xcd\xbe\xf9\xe6\x1b\x2b\xe3\x4a\x28\x9b\x57\x96\xcf\x4b\xe0\x45\x95\x5f\x68\x39\x4b\x5b\xd1\xd5\x72\x3c\x59\x17\x90\x79\x17\xc2\xff\xe8\xf7\x84\x0f\x06\x6f\xe5\x57\x4e\x12\xe5\x48\x55\xd7\x18\xa5\xa4\xd4\x8d\x49\x4c\xf2\xc1\xe0\xab\x41\x0e\x6c\xf1\x2c\x9d\xeb\xfd\x54\xbe\xba\x98\x9c\x08\xe4\xd9\x1d\x7f\x28\x11\xbe\x92\x1f\x5d\xb1\xc1\xb7\xf6\x95\xf9\xce\xca\xb7\x65\x45\x27\x20\x5a\xb9\xc5\x9f\x9f\x49\xf6\xa6\xdc\x50\x57\x28\x51\x96\xe4\xde\x18\x63\x52\x96\xfb\xfb\x35\x7a\xa2\xad\xa0\xc1\xfe\x98\x61\x4c\xde\x94\x4e\x38\xb5\xb2\x95\xa3\xdb\xba\x0d\x97\xa5\x91\x4a\x5b\x7e\x99\x2f\xa6\x5a\x0b\xd7\x35\x28\x99\x14\x9a\x50\x06\xbb\xef\x83\xb2\x3c\x18\x93\xbc\xc4\xb5\x55\x5e\xd7\xca\x8a\x5a\x19\x64\xef\xdf\x75\xf7\xe4\xe7\xf2\x2f\xbb\x0d\x5c\xd5\xa1\x78\x3f\x7f\xb1\x4b\xc2\x29\x38\xdb\x3c\xd7\x0c\x10\xb3\xe9\xfa\xaf\x6a\xc9\x8f\x8d\x16\x53\x4e\xb9\xc5\xaf\x2f\xba\x0c\xae\x36\x93\xd9\x6c\x38\xc9\x20\xac\xdf\x66\x33\x57\x22\x7f\x3d\x97\xcd\x06\x45\xc6\x3c\x73\xd3\xc7\xc1\x94\xa4\xc6\xd8\x43\x11\x8e\x7f\x00\xc7\x24\x66\x0d\x7f\xac\x29\xb6\x89\x64\x14\x1f\xd8\xa9\x4e\x33\x45\xb0\xcc\xe5\xf3\xc8\x16\xb8\xc6\x2a\xce\x4d\x86\xc9\x9e\x19\xbd\x9b\xf7\x20\x1d\x7f\xc5\x7b\xeb\xbc\x14\x3a\xfb\xda\xa4\x57\x71\x18\x97\x25\x3d\x58\xe5\x2a\xcf\x12\x56\xf4\x0e\x9a\xfc\x4b\x11\x76\xe3\x49\xa5\xf3\x26\xdc\x9a\xbc\xd6\x23\x2d\x28\xc9\x5c\x41\x89\xdc\x80\x79\xbc\x50\x32\xaf\x1c\x5f\x95\x34\x56\xd4\xac\x8e\xe1\x7f\x8a\xb2\x79\xb9\x20\xf7\xe4\xeb\x54\x49\x64\x27\x1f\xa3\xf1\x82\xac\x69\xd5\x24\x5d\xe9\xad\x24\x3b\x2a\xb9\xd8\x49\xae\xa2\x93\x6a\xce\x30\xc1\x24\x83\x3d\x8d\x19\x2a\xc9\x18\x93\x75\x93\x7d\x4e\x87\xc3\x7e\xc7\x2e\x4b\x24\xb0\xe5\xe0\x91\x7b\x8e\xcf\xbc\x73\x74\x24\xad\xc6\xa1\xbc\xcd\x6f\x14\x78\xd6\x6f\x04\x76\x36\x45\x81\x98\x17\x4d\xbe\x82\x0c\x4f\x58\x0d\xb9\xbc\xec\x38\x2f\xfd\x71\xb6\xf7\xcf\xf1\x4c\xcc\xf9\xa2\xd3\xc1\xa3\x76\x07\x90\xd5\xa2\xd3\xd8\x0b\x1e\x9f\x2e\xd1\x5e\xf1\x51\xc7\x2f\x1f\x56\xe7\xd8\x19\xe9\xf7\x2e\x52\xb1\xea\xbd\x63\x97\x93\x9e\x93\x7b\xab\x21\x59\x0a\xf3\x9a\x59\x61\x6c\x8d\xc1\xb9\x98\x79\x41\x89\x7f\xf5\xc8\xf8\x74\xa9\xf3\xf8\x91\xb6\xa3\x62\xcb\xff\x91\xb9\x8f\x8a\xec\x43\xbe\x23\xd6\xd3\xc5\xf1\xaa\x8b\x14\x41\xa8\x7d\x57\x20\x81\x8e\x4a\x11\xd8\xe4\x07\x8c\x69\x95\xa9\x08\x88\x10\x88\x31\xa1\xe3\xd1\xe7\x5f\x7d\xf1\xaf\x2f\x06\x95\x4d\xd7\x02\x62\x16\x56\x4a\x50\x6c\x39\x8a\x4a\xb0\x6c\x57\xfb\xe6\x9b\xbb\x23\x37\x91\xa0\x49\x22\xa8\x05\x7b\x72\xcb\xbf\x13\x28\x26\x29\x79\x91\x61\x72\x4e\x7f\x2a\xc1\xb1\x31\x9d\x25\x93\x64\x7f\x4d\x56\x5a\x07\x7b\x3e\x43\x11\x47\x8c\xa3\x8a\xe4\x98\x64\xa4\xc4\xe4\x13\xc9\x0e\x32\x62\xb5\x70\x44\x58\xe1\x45\x7b\x62\xfb\xfb\xee\xa7\x87\x3c\xd9\xdf\x27\xe9\x60\x80\x3a\xb3\xdd\xd7\xeb\xfd\xd2\xea\x1e\x96\x98\xe4\xe6\x2f\x3c\x41\x7c\x7e\xbe\xa0\x4b\x92\xc3\x3f\xd8\x55\xea\xeb\x89\xab\x49\x93\x4b\xfb\x5b\x7e\xc1\xe4\x8c\x9e\x82\x4f\x30\x9f\x9f\x2e\xc8\x09\xbd\xd4\x3f\x2e\x01\x0e\xd3\xc1\x60\xef\x64\xb3\xd9\x93\xff\x9e\xe1\xab\xd6\x42\xa7\x8a\xe0\xd9\xee\x94\xa9\xf7\x50\xde\xd0\x17\x8d\x21\x57\xa4\x36\x1a\x84\x65\xea\x25\xa6\x82\x44\xc3\xd8\x64\x6d\x31\xe9\x24\x25\x66\xfa\xa1\x54\xe1\x58\x07\x83\x3d\x8e\x49\x54\xa3\x74\xf6\x4b\x39\xf9\xb1\x24\x46\xb4\x07\xb1\x5a\x63\x3c\x95\x53\x3c\x01\x03\xa8\xcb\x85\xdd\x3b\x9d\x5c\x8b\x1e\x75\xce\x84\x8c\xfe\xa1\x53\x39\xb2\xa7\x72\xa4\x95\xc1\x7a\xe4\xd3\x6f\x0e\xc6\xb3\xd3\xc9\xa5\x5c\x12\x9f\xa7\xb3\xcb\xc9\xe9\x82\xc4\x44\xce\xbb\xc0\x6a\xfe\x05\x2c\x01\x56\xd0\xdd\x8c\xfd\x7d\xd7\xd4\xe6\x93\x8e\xc9\xc2\x3a\xd3\x16\x09\x69\xc8\xbd\x76\x6f\xaf\xc9\xea\x05\xcc\x93\x3e\x21\x24\x9c\x64\x5f\x02\x3b\x69\x28\x9c\xe4\x8e\xb2\x57\x47\xbf\xa4\x33\xdc\x7e\x9f\xe7\xef\xca\xcd\x06\xf9\x1f\xe8\x5c\x25\xe8\x93\xeb\x11\xee\x8d\xca\x69\x66\x99\x33\xae\xef\x4e\x3e\xcb\x0c\xf7\x3f\x2f\x48\xb4\xc0\x93\x0c\xfc\x8c\x1b\xc5\x8f\xda\x42\x5b\x2b\xf2\xec\x8d\x7e\x28\x5b\x92\x02\x15\x0b\x2a\xb0\x75\x84\xb9\xb9\x38\x05\x3e\x18\x3b\xf6\xa7\x21\x43\x3d\xca\xa7\xe9\xfd\x02\x62\xf1\x49\x8c\x3d\x4f\xe5\x33\xc8\x6c\x60\x96\xa9\x61\x46\x1d\x33\xd2\xb2\x93\x93\x80\xc5\x2a\x91\x30\x0c\x4d\xe6\xae\xa9\xee\x2f\xed\xf3\x23\x11\x6d\xea\x4e\x4d\x0a\xe2\x16\x20\x5b\xc2\x3c\x50\x16\x58\x37\xc9\xe9\x9a\x23\x4e\xb8\x7c\x98\x83\x6d\x14\x5f\x51\xe0\x29\x8b\xe5\x3d\xa3\xb9\x75\x1e\xce\xb0\xa7\x29\x9c\x96\xf7\x73\xd7\xa6\xd7\xc8\x95\xe7\xe5\xc2\x84\x54\x50\x3d\xc8\xe3\xb7\x61\x08\x1b\x93\xd8\xb8\x1d\x03\x6b\x34\xe5\xcd\xf3\xc0\xf7\xf7\xb1\xbe\x8d\x68\x44\xd8\x9c\x2f\x30\x6a\xde\x28\xd7\x24\x36\xfe\xcb\x34\x63\x93\x74\xda\xde\x12\x8e\xaf\x78\x93\xf3\xeb\xa5\xca\x57\xe6\xd8\xed\xb8\x67\x1a\xd6\x56\x45\xda\x8b\xb0\x23\x07\x31\xb7\x13\x52\x5e\x4d\x7f\x05\x2f\x73\xe5\x53\x5f\x0c\x4f\xb2\x8a\xad\x8b\x94\x0b\x92\x82\x9b\xe2\xaf\x25\x12\x5b\x4a\x25\x4b\x23\x9b\xce\x0a\xc4\xf0\x84\x29\xbb\x2d\xd8\xc8\x98\x1e\xa3\x66\x9b\xbd\x04\x69\x98\x14\xf1\xed\xf2\xa8\xe9\xb4\x30\x3a\x63\x9b\x4d\xa3\xa5\xa1\x25\x94\x9b\x55\x91\x27\x5d\x52\x58\x13\x2b\xcf\xf2\x9e\x05\xcb\x9e\x4e\x6e\xd6\x5b\xe6\x15\x4f\x42\x09\x42\x87\xbd\x07\x69\xd2\xbb\xcc\x2b\x48\x40\x99\x8a\x9e\xc8\x7b\xff\xfd\x4c\xe7\x6d\x86\xbc\x38\x97\x4d\x6a\xaf\x59\xdf\x81\x90\x21\x3f\xb5\x25\x94\x11\x01\xc1\x3d\x4d\xda\x18\x92\x7a\xdb\x00\xc6\x37\x3b\x76\x6d\x6a\xa5\x32\x36\x89\x5b\x11\xb7\xf2\xcf\x44\x31\xc2\x57\x8e\x75\x70\xec\x87\x29\x63\x17\xbd\x32\x46\x3a\xcf\x89\x92\x3c\xe6\x71\x20\x0d\x62\x16\xab\x34\x10\x29\x64\x66\x23\xe5\x75\xf3\xec\xa6\xf8\xe1\x11\xbc\x50\x4a\xab\x41\x85\x3b\xfb\x6e\x92\xb8\xbc\xbd\x8c\x38\x6e\x79\x70\xd9\x4c\x39\x65\x3c\x63\x7e\xe7\x13\x15\x74\xbb\xda\x09\x70\xc9\x47\xee\x74\x77\xae\xdd\xcd\x5a\xc5\x08\xd7\xea\x40\x57\x81\x61\x54\x84\x7b\xfa\x03\x83\x2d\xd5\x98\xad\x49\xf6\x19\x12\xbb\xcd\xc7\xe3\x45\x8d\x8e\x19\x18\xdf\x4f\x18\xae\xc9\xfa\x23\xe7\x1f\xca\xef\xc7\xbc\xf4\x7e\x45\x9e\x8b\x5d\xf9\xfd\x54\xd8\x30\x0d\xb0\xcb\xf8\xba\x73\x5f\x56\x59\x46\x85\xfa\xfb\x2c\xfa\x23\x77\x5c\x08\x87\xe0\x42\xa8\x8b\x52\xde\x2e\xb2\x4f\x81\xe4\x19\xbc\x22\x8d\xfb\xef\x62\xad\x7d\x1e\xf6\xe5\x91\x9e\xc7\x70\x05\x96\x31\xea\x8f\xef\x0e\xef\x0e\xc7\xff\xea\x63\x72\xfa\x71\x88\xa5\xac\xd6\x90\x13\x3e\x84\x49\x4c\xce\x8e\x0c\xae\x2e\xd9\x9d\xcc\xd1\xbb\x6a\x67\xb1\x77\xdb\x2f\xe3\x70\x48\x20\x51\x93\xb3\x6d\xd3\xee\x6e\xb0\x7a\x53\xe8\x48\xfd\x3a\xce\x52\xfe\x8e\x25\x2f\x55\xf2\x6e\x65\xdb\xae\x0a\x2a\xbe\xb5\x68\x5d\xb0\xf3\x34\xaf\xca\xc7\xe2\x7b\x16\x25\x6e\x49\x1a\xf8\xf2\x3a\x4a\x33\xf7\x4b\x94\x24\x90\xce\xb9\x6c\x57\xb5\x05\xed\x16\x67\xf9\x39\xeb\xd4\x86\x8f\xed\x9a\xa0\x40\x8d\xb2\x4e\x65\xf3\xbd\x5d\x3f\x4d\x18\x17\xa9\xb8\x3c\x5a\x45\xfc\xb4\x3b\x46\xab\xb8\xdd\x5a\x14\x51\xfc\xee\xdb\xcb\x47\x9c\x8a\xcd\xe6\x32\x0e\xc0\x85\x16\xa9\x3c\x16\xec\x2c\x74\xd6\xf0\xa4\x00\x35\x22\xa8\xbb\x81\xc6\x56\x47\x4c\x05\x15\xc3\x63\xce\xde\x0b\xec\xe5\x2b\xd3\xfd\x3e\x37\x86\xf5\xa1\xce\x1b\xf3\x08\xb7\x6b\xc2\x69\x77\xab\x48\x41\x47\x24\x55\xfe\x51\x62\xb3\xe1\x36\xac\x31\x04\xdf\x91\xf4\xae\x36\xb9\x01\xee\xe0\xfe\xab\x58\xc5\x57\x91\xc8\x85\x93\x8c\xbe\x92\x14\x12\x64\xca\xcb\x69\xe4\x55\x9d\xea\xc8\xe1\x1c\x17\x07\x07\x20\x3f\x80\xc5\xbc\x04\x3d\x77\x62\xad\xd9\xed\x2a\xb5\x70\x58\xc5\xec\x06\x10\x03\x01\x78\xb1\xbf\xaf\x53\x67\x6e\x36\x48\x91\x62\x9a\x7c\x3b\x28\x48\x4c\xf3\x03\xc8\x87\x5c\xee\xd1\xd8\xb5\x83\x19\x4d\xab\xfb\xe5\xb4\x32\x62\xdf\x84\x56\x6e\xa0\xc3\x6a\x31\x91\xff\x01\x85\x76\xb2\x5f\x4d\xe3\xfb\x74\x35\x18\xac\xee\x97\x83\x01\x82\x82\x64\x7f\x8c\xeb\x74\xde\x9a\xcb\x82\xc6\x07\x65\x5d\x6b\x03\x59\x86\x94\xbe\xbf\x6e\x9f\xcc\x0b\x7b\x45\x6e\x7a\xf2\xfe\xa5\x0a\x40\x80\xe9\x32\x08\x09\x87\x89\x44\xc7\x37\x1e\xcc\xbb\x83\x81\xb1\xa0\xbb\xe0\x40\x4f\xe5\xc1\xdd\x7c\x20\x7b\x75\x03\x83\x40\x57\xc1\x41\x34\x7c\xdc\x7c\x18\x17\x98\x03\x23\xe9\xfe\x82\x63\x3d\xf6\xee\xf8\x0d\x6f\x69\x17\x6d\x04\x46\xf5\x7b\xf6\x07\x4f\xd2\xe5\x32\x34\x96\x75\x46\x52\xe1\x5d\xe7\x0b\x4c\xf6\xe0\xe5\xe8\xca\xcb\xe0\x9f\x9e\x28\x2e\x53\x7e\x0a\x2e\x38\xe9\x72\xd9\xfb\xb4\x45\x79\x7e\x3a\xec\x3d\xe7\xd9\xa5\x32\x01\x2d\x7b\x11\x97\xe4\x27\x2b\xa2\x93\x8c\x95\xbd\xa8\x80\xec\xf6\xf9\x05\x4b\x5c\x9a\x53\x2e\x31\x5e\xb1\xf8\x1d\x62\x78\x26\x7f\xe9\xd0\x9f\x7a\xea\xb9\xe1\x9e\x3b\xf3\xc7\x57\xcd\xfb\x26\xdb\x6f\xdd\x4c\xd8\xc6\xa9\x39\xba\x92\x49\x26\x03\x88\x7e\x25\xef\xf4\x11\x56\x16\x8c\xd4\xc7\xb0\xa4\xd1\x9b\xf7\xcc\xb2\x5c\x8d\x38\x18\x3c\xd0\x9a\x2a\xe0\x84\x56\x50\x88\x9d\x9d\xd2\x16\x06\x57\xb9\x6c\xb8\x8d\xdc\xde\xa4\x2e\x8c\x86\xba\xd2\xe3\x44\x62\x3c\x04\xe9\x35\x74\xf3\x73\x56\xa4\xcb\xcb\x97\x4c\xd9\xe8\xca\x15\x02\x1e\x04\x2d\x8e\xdb\x43\x2a\xd8\x19\x64\x2e\xb4\xb7\xcf\x87\x0d\xe5\x6c\x36\xb1\xfd\x9e\xa5\xa5\x12\xb8\x9b\xee\xe4\x26\x8c\x20\x3e\xb1\x02\x2d\x13\x07\x7f\x44\x3a\x9a\xe5\xad\x92\xcb\x10\x6b\x8a\x80\x25\xf5\xb3\x85\x16\x24\xa5\x6c\xfe\x2e\x43\x78\x81\xf0\x74\x0f\x15\x3a\x32\x3d\xc2\x78\x98\xe4\x9c\x4d\xb1\x40\x85\xb1\x3d\x40\xcc\xb3\xbf\x4e\x25\xec\x37\x9b\x0a\x49\xa7\x6e\xb1\xa9\xe1\x1d\x65\x24\x25\x3c\xb4\xa3\x4c\xee\x68\x78\x3b\x99\xde\x4e\x6f\x2f\x55\x47\xed\xbd\x24\x7c\x7f\xbf\xf6\x89\x23\xee\xdd\x85\x63\x51\x54\xf2\x4a\x41\xca\x0e\x75\x3b\xf2\x2c\xd3\x81\xee\x99\xfa\x92\x96\x0f\xd2\x42\x5c\x3a\xc9\x40\xe1\x77\x9f\x9c\x32\xb1\x85\x28\x96\xc8\xa2\x8b\x8c\x6d\x58\xdf\x16\xfe\x6c\x7d\x77\x11\x5e\xab\x28\x80\x9c\xec\xb4\xd4\x6d\x0b\x5c\x5c\x23\x97\xd1\xf3\xd6\x2c\xc2\x54\xf9\x36\x04\xa9\xbe\x10\xbd\xc2\xa6\x8c\x32\x43\xaf\xf8\xaf\x96\xf9\xee\x75\x19\x7c\x86\x9c\x4e\xf4\x33\xe4\xbf\xc0\x94\xf9\x24\x06\x20\xe6\x00\x65\xb9\x95\xa8\x64\xdb\xde\x26\x67\x64\xfd\x36\xed\x1e\xb9\x4d\x9d\xde\x94\x30\xbd\x3d\x4d\xba\x9b\x1c\x6d\xa8\x0f\x0b\xed\xa1\x34\xf1\x8e\x50\xae\xe5\x37\xcc\x66\x29\x75\xc9\xf5\x09\x4a\xe5\x46\xc8\xc5\xbb\xf3\x67\x4e\x92\x38\x8a\x98\x8d\x79\x17\xe2\x17\x94\xaa\x3e\x58\x34\x3c\x65\x02\x71\x65\x4b\x86\x67\xc8\xc9\x12\xab\xae\xb5\xd8\x81\x28\x25\x96\xb3\x53\x52\x48\xe2\x70\x29\x58\x81\xe4\xdd\x2e\x74\x78\xec\xc0\xec\xb6\xce\x2d\x34\xb3\xe2\xaf\x4c\x4b\xee\x93\x3f\x25\x07\xda\x55\x81\x7c\xc4\x4f\x62\x15\xad\x5d\x56\x21\xac\x39\xc0\x0e\x02\xbc\xe6\x24\xff\x8e\x43\x68\x85\x0e\x4d\x67\x8c\x86\xb6\x38\x25\x06\x26\x0a\x3c\xf1\xaf\xc2\x1e\x98\x3a\xfb\xdf\x68\xd1\xf0\x75\xaf\x73\x79\xa1\xc0\x5f\x11\x7b\xcb\x35\xa8\x75\x1b\x03\xd3\x5c\xcd\x46\x17\xad\xf0\x88\xd3\xf7\x4b\x7d\x93\x90\xbb\x52\x80\x55\x46\x45\xed\x21\xc7\xd6\x2e\x0c\x06\xe1\xcd\x89\x33\x16\x15\xa8\x49\xb1\xd7\x45\x25\x83\x41\x1b\xe9\xc8\xaf\x0e\xda\x72\x1c\x9a\x7c\x6c\xee\xb5\xb6\x5f\x1c\xb4\x13\x6a\xa9\xee\xa5\x6d\xa6\x7e\xaa\x36\xa1\xea\x2e\x6e\xb1\x8d\xdc\x8f\x1e\x5d\x1c\x1c\xb0\x8b\x6b\x9a\xd1\xbb\x65\x21\x8a\x57\x75\xeb\xbe\x3d\x0e\x34\x85\xc1\xba\xb1\xa4\xbc\xcd\x69\x59\xe4\x34\x35\x26\x23\x00\xa6\x7a\x75\x24\x35\x30\x63\xd8\x4e\x1f\xf9\x15\xb3\x00\x8a\x4e\x27\x85\xbf\x45\x29\xb1\x9e\x9d\x01\xf4\x5d\x4c\x52\x6f\x4c\x0b\xfb\x3e\x8a\x82\x1b\x1f\xb8\x14\xdc\xbb\x13\x16\x83\x6c\xdb\x23\x8f\x38\xb1\xd0\xfe\x17\x46\x34\x98\xe9\x46\x03\xee\x1a\xa0\xf5\xd4\xd2\xe0\xd5\x99\x85\x5e\x6b\x36\xb9\xe6\x3a\x31\x77\xc2\x37\x00\x24\x05\x0a\x66\x16\x33\x97\x5c\x99\x68\x06\xcd\x11\xd3\xc2\x45\x2a\x0c\x82\xa3\x46\x10\x61\x81\x43\x8b\xb1\x98\x04\x0b\xa8\xc1\x48\xb0\x6b\xb9\x0e\xdd\x5b\x53\xa3\xfb\xd0\xd8\xab\xd4\x92\xb1\xb1\x8b\xde\x61\x8c\x43\xa2\xb9\xe1\xba\x82\x80\xfd\x2d\x1c\xcb\xdd\x5d\x51\xf7\x60\x87\x50\xf1\x26\x38\xb3\xe9\x4e\x7d\x0b\x75\xe7\x5d\xd2\xe0\x15\xdd\x75\x41\x85\xa5\x2d\xb8\xc5\xe6\xfe\x95\x6c\xed\x29\xb7\x7b\xca\x89\x75\x93\xf4\xce\x45\x4c\xb8\x3d\x39\x1f\xae\x35\xc8\x87\xa0\xc4\x31\x53\xf5\xc9\x3c\x95\xe9\x28\x44\xcd\xd1\x0e\x26\x9f\xb5\x89\x40\x03\xc8\x41\xcc\xce\xda\xd7\xae\x39\x88\x5d\xb2\xe0\x1d\x4f\xbc\x85\xa4\x8e\xbc\xd6\x83\xa5\x36\xca\xdc\x02\x4d\x40\x1e\x77\xdf\x06\x1f\x92\x5d\xcc\x37\x0b\xbc\x2d\x01\x16\x45\xde\x5e\x1f\x41\x2a\xcf\x07\xd4\xfa\xda\xed\x2c\x24\xc0\xbd\xee\x39\xeb\xec\xf2\x75\x32\x1e\x0f\x16\x24\xb1\x67\x34\x10\x5b\x49\x6e\xba\xe3\x9d\x9c\x6d\xa7\xe3\x0d\x70\xdc\xf4\x05\x05\xa4\x67\xe4\xff\x27\x6d\xe5\x89\x44\x73\x2d\xe9\xbe\x3b\x79\xcb\x62\x53\xae\xd9\xd6\xce\x59\xc3\x67\x1f\xf8\x1d\x4e\xc4\xe3\xdf\x5a\xf2\xff\x76\xbd\x76\xf9\x83\x6a\xdd\xae\xd2\xfa\xd4\x86\x06\xa7\xe6\x96\xcf\x0d\x5d\xe5\x7c\x7c\x1a\xaa\x19\x20\x44\x6a\x4c\x8e\x6e\xa0\xdc\xd1\x9d\xac\x5a\x9a\x00\x61\x79\xad\xae\x90\x3f\x4a\x92\x6d\x48\xd2\x82\x89\xec\xcf\xdc\x95\x55\xc3\xd1\x41\xb7\xcc\x5c\x39\xbb\x41\xcc\xdf\x43\x3c\x41\x4d\xf5\xa6\x2a\x73\xeb\x35\x15\x3a\xbd\xb9\x43\x35\xe8\xfd\x34\x20\x07\x68\xfc\x2b\x80\xab\xe6\xce\xe4\x0d\x21\xce\xa7\x56\x8a\xff\xa0\x5a\xe3\x74\x89\x4c\xf4\x24\xb1\xd9\x88\xfb\x94\x7b\x50\x86\x5d\xa1\x0f\x77\x84\x3e\xcc\x89\xff\xe9\x29\x0a\x89\xd1\xd4\x6f\x7b\xca\xbc\x17\xe4\x41\xb5\x6e\x1e\x91\x07\xd5\x7a\xcb\x3b\xb2\xf2\x5e\x11\xd8\x98\xf6\x43\x22\xbc\x67\x04\x76\x94\x74\x4e\xb0\xb9\x8b\x87\x37\x06\xa5\xb3\x68\x0d\xb8\xf8\x69\xb4\x0e\xc0\xce\xba\x0a\x9c\x42\xb3\xc8\x66\xc3\xf4\x59\x9c\x45\x6b\xe0\xdc\x04\x9e\xf2\xcd\x06\x71\xe8\xfa\x28\xb6\x43\x0d\x4b\x59\x48\x94\x27\x7f\x94\x24\xe8\xc6\x27\xee\xf7\xdf\xe8\x97\xf9\x8c\xab\x2f\x44\xe0\xc9\x2d\xcf\xc8\x4e\xdf\x93\xa7\x35\x6b\x68\x08\x03\x4d\x37\xc8\xa2\x84\x65\x4c\x30\xf0\xa0\x72\xc4\x69\x0f\xcf\xd6\xdb\xc5\x69\x23\x73\x4a\xb0\x03\xe9\x87\xa6\x21\x30\x72\x01\x79\x97\xad\xad\x39\x3d\x7b\xb2\x8d\x0d\xc1\xab\xb8\xed\xb8\xed\x21\x4a\x27\x6e\x58\xe1\x27\xc4\x4d\xe9\x68\xda\xd8\x6d\x15\xf7\x1b\x67\x5d\x94\x52\x3e\x2f\x16\x98\x14\xfb\x62\x3f\x05\xb3\x83\xb7\xff\x98\xc2\xd9\x33\x7b\x78\x1a\xad\x37\x9b\xef\x6f\xa2\x82\xf6\x34\xd0\xef\xe2\x06\xe4\xdf\xdd\x1c\x7b\x16\x0e\x0d\xf2\x34\x5a\x1b\xc9\x48\xb4\xee\xa8\x7c\xd7\x6b\xc6\x15\xef\x11\x52\x30\x3f\xed\xb6\x88\xc3\x9a\xda\x38\xac\xa1\xbd\xbd\xae\xf9\xc6\x1a\xe4\xc0\xa1\xfc\x5d\x42\x5f\x67\x8d\x3b\xc4\xbe\x1d\x45\xd6\xcd\x95\x72\x6a\x5b\x6f\xaa\x65\xfe\x78\x5d\xe6\xd3\xad\x03\xed\x54\x66\xaa\x57\xfb\x16\xea\xbf\x78\xa7\x1e\x4e\x77\xf7\x7f\x57\x6f\xfa\x1f\x51\x69\xee\xd0\x2a\x6a\x1f\x7f\xb4\x05\x2b\xfc\x55\xfd\xe2\x59\xb4\x56\xda\x45\xe5\x35\xd7\xd6\x2d\x6a\x4b\x4a\x83\x10\xfe\x37\xa8\x1a\x5b\x77\xc1\x28\x40\xb6\xa1\x24\xe3\x1c\xe3\xea\xbb\x48\xa1\x14\xb6\x83\x01\x87\xc4\xa6\xf2\x25\x10\xb2\xcb\xcb\x13\x76\x28\x79\x3b\x4d\xde\x2b\x3d\x98\x68\xf5\xdd\x98\x43\x34\x0e\x03\xa0\x3f\x3b\x65\xe2\x79\xa1\x2c\x2d\x15\xbb\xf6\x28\x2f\x7e\x64\x97\xa8\x20\x0c\x4f\xb9\xac\xe1\xc6\x04\x7a\x5e\x1c\x42\xaf\x88\x93\x14\xd7\x35\x06\x21\x9a\xba\x82\x90\x02\x0a\xfe\xf2\x24\x85\x21\x44\x67\xd5\xa6\x85\xa4\xf0\x74\x50\xb1\x69\x41\x7d\x29\x18\x2e\x1a\x06\x58\xed\x5b\x23\xc8\x74\x50\x75\xeb\x19\x30\x2f\x7a\x21\x37\x09\x93\x96\x60\x4d\xff\x24\x85\x7d\x5e\x55\x5a\xf6\xc2\x10\x92\x6f\x55\xe8\x2c\xef\xa7\x4e\x62\xee\xb2\x22\x85\xb3\xc6\xda\x93\x77\xc4\x01\x11\x66\xdc\x66\xbc\x34\x92\xf0\xe6\xff\x51\x02\x5f\xc5\x86\xb5\xd4\x81\xc1\x13\x0b\x13\x63\xea\xae\x1a\xaf\x5f\x58\x60\x63\x0d\x6a\x24\x4b\xc2\xac\xdc\x95\x58\xa9\xe3\x86\x1a\x92\x78\xba\xf6\xa8\xac\xca\xc2\x05\x4b\xc9\x71\xfa\xd2\xa2\xa6\x70\xd6\xbd\x22\x66\x3c\x3b\xa3\x4e\x0d\x3c\x69\x8d\x1a\x18\x54\x91\xda\xcd\x6e\x6d\xb9\x01\x5b\x37\xcc\x07\xb7\x15\x04\xbc\xf5\xc8\x5a\x5b\xa6\x69\x5b\x33\xa5\xee\x45\x15\x46\x88\xac\x6f\x0e\x49\xed\x2d\x35\x44\xde\x60\x80\xcc\xba\x53\x0c\xee\x13\x5a\xf8\x4b\x0b\x49\x75\x3b\xec\x30\x77\x01\x94\xd7\x8d\xef\xc8\x71\xec\x50\xd8\xfe\x0c\x4b\xa0\xb5\x23\x4c\x22\x1f\xe2\x85\x2b\xc6\x3d\x34\x30\x88\x22\x08\x29\xf7\x17\xd4\xbb\x61\x8a\xcb\x3b\x33\xd2\x56\x01\xb7\xde\xf5\xdb\xaa\x7d\x03\xcf\xb5\xd3\x85\x7d\xae\x5b\x08\x81\x79\xfb\x71\xad\x1e\x79\x87\x1a\x39\xd8\x5f\x97\xbc\xbc\x05\x65\x79\x5b\xa2\xd2\xd5\xd8\xb6\x81\x30\x0c\xe5\x0d\x1b\x2d\x88\x3f\x73\x48\xa2\xb7\x73\x6d\xad\x06\x3e\x28\x19\xd0\xf7\x44\xbf\x3e\x90\x5d\x2b\xdd\xf0\x36\x23\x28\xde\x0f\x6d\x10\x9b\x5c\x87\x51\x59\x90\x5a\x67\xed\x89\x6e\xdd\xb8\xd6\x34\x9d\xc3\x9d\xdd\xe4\xb8\xed\x04\xb7\xbe\x16\x2c\xc0\x7e\xb8\xd3\xd3\x54\x43\xf8\x48\xdb\xa4\xd8\x8c\x59\x17\x5c\x81\x27\xae\xb7\x28\x0b\x38\xe7\x3a\x6a\x19\xb0\xe2\x21\x1c\xd7\x8e\xb1\xf0\xf1\xb5\x96\xd6\x2a\x1b\xbd\x27\x01\x74\xde\x56\x57\x60\xd8\xfe\xbc\x55\x30\x18\x12\x04\xde\x48\x88\xb7\x45\xe0\xe7\x3e\xca\xb5\xc3\x9a\x5f\xc4\x3e\x9b\xfa\x7d\x8c\xe6\xf2\xdf\xd3\x78\xa1\x9c\x12\xbe\x0f\x98\xbb\xdf\xd4\x40\x5a\x99\xb2\xa7\xac\xa4\x22\x64\xd1\x9b\x86\x1e\x6e\x97\xd8\x6c\x3a\x18\xca\xca\xcd\x89\x39\x16\xdb\x43\xc3\xbf\x23\x30\xb7\xb7\x81\x5c\x85\x91\x24\x88\x4e\xfe\x9b\xfe\x51\xc4\x79\x2e\x7a\xb2\xcf\x5e\x04\xd4\x38\x2b\x7a\xba\x1f\x49\xa2\x2b\xca\xdb\xa1\xd0\x19\xe9\x7f\xda\xcb\x97\x2a\x1a\xf7\xa7\x8d\x97\x6c\x48\x56\x00\x21\x65\x36\x1b\x93\x0c\xa2\x56\xc4\xbd\xa4\xdc\xeb\x85\x59\xfa\x16\x81\x81\x9b\xeb\x7b\x8f\x36\x9a\x37\x67\x1f\x94\xfd\x3d\x06\xee\x45\x4f\xa2\xc9\x13\x2c\x97\xe8\x71\x31\xec\xbd\x08\x51\x47\x76\xfb\xae\xb4\xfb\xc1\x84\x91\xaa\x64\x8f\xda\x9e\x07\xdc\x59\x95\x9a\xb2\x9c\xe2\x66\x23\x81\x06\xd7\x24\x61\xeb\x72\x32\x9f\x33\x02\xe3\x16\xf0\xcf\x2f\x7c\xb1\xa8\x1b\x11\xd0\x47\x7b\x3f\x5c\xc4\x75\x5b\x8a\xf4\xb4\x05\xaa\x4f\x34\xa8\xbe\x35\xa0\xfa\xe4\xff\x39\x50\xfd\xdb\x81\xf4\x76\x60\xf6\xbf\x16\xc0\x9e\xfe\xf3\x00\xf6\xb4\x0b\x60\xef\xe3\x90\x97\x67\xc7\x87\xf0\xf3\xa0\x0f\xe1\xe7\x10\xff\xbe\xf9\xd5\x48\xf9\x6d\xfc\x88\x39\xd7\x41\x45\x9c\x70\xd3\xd1\x60\xa0\x43\xe6\xbd\x61\x28\xc2\x98\x5c\xc0\x3f\x36\x1f\x2a\x1d\x7b\x01\x12\x33\x63\x82\x0f\x31\x12\x17\xa4\xa4\xf9\x7c\xbc\x70\x83\xc8\xe9\x7e\xcb\xc1\xe0\x7d\x8c\x20\xc1\x79\x4e\x4a\x52\x60\x1d\x8c\x8f\x43\x80\x13\x39\x81\xaf\x06\x31\x36\x2b\x1e\xc6\xb2\x2d\x29\x9a\xfc\xff\xf7\xee\x0e\x62\xdc\x38\x00\xe4\x05\x10\xf4\x36\xe7\xc3\x34\xa1\x15\xc2\x53\x5c\x98\x58\x0d\xb6\xe1\xf8\xcb\x41\x6c\x42\x0f\xbd\x28\x6c\x74\x6d\xdf\x96\x76\x85\x75\xcb\x61\xb4\x5e\x67\x92\x1f\x3f\x97\xdf\x1a\xee\x7d\x4d\x4b\x88\x5f\xff\xe5\x02\x4f\xdf\xc7\x68\x0d\x61\x23\xc8\x4a\x25\xc4\xae\x6b\x4e\xd3\x19\xb8\x63\xfe\xa1\x6c\x47\x9f\xb1\xf7\x62\xc2\xc1\xb6\xd6\x80\x6a\x01\x0b\xfe\x6d\xab\x37\x4f\x40\xe3\x77\x9c\xbd\x4d\xd9\x85\xa5\xe9\xe2\xe4\x25\x5b\x3e\xe6\x7f\xa8\xd0\xbf\x50\xc4\x1b\x8e\xeb\x25\x5b\x7a\x44\xac\x10\x51\xbc\x62\xc9\xeb\x5c\x56\x3c\xca\xb9\x88\x52\xce\x0a\xba\x37\x0e\x39\x4f\xe6\xb9\x78\x96\x27\x92\xce\x6a\xc9\x37\x15\xd2\x72\x66\x43\x04\x65\xf3\xb1\xf5\x47\x7d\x1f\x4b\xa2\x95\x08\xe7\xc4\xc1\x69\xd8\x4a\x70\x72\x2e\xd8\x7b\xb1\x4d\x6e\xea\x74\x3c\xff\x6a\x51\x93\xd2\xad\xc5\xb4\x2c\xdf\x96\xd3\x46\xf8\xaf\xdd\xb7\x59\xb2\xad\xe7\xbb\x5f\x7c\x49\x29\xba\xfb\xc5\x97\x03\xb7\x8f\xbb\xce\xd4\x92\xad\xf2\x27\x57\x60\xf4\x92\x2d\xb1\xfb\x63\x98\x30\xb9\xb1\xb2\x37\xa8\xd4\x00\xda\xce\x7d\x0f\xec\xe4\xfc\x1e\xdc\xbb\x0b\x66\x39\x5a\xb9\xb5\x5f\x2d\x20\x0c\x8b\x68\x42\xf6\xcb\x41\x26\x07\xe3\x29\xff\xe6\x60\x3c\x18\xa0\xb3\x42\xd9\xf8\x3c\x54\x78\x13\xd7\xd7\x9e\xf7\x89\xe1\x04\xd5\xb0\xc6\x99\x4e\xfd\xc4\x37\x90\xc8\x31\x7c\xf5\x36\xda\xd1\x87\x0a\x21\xe8\x10\xc7\x67\x51\xf1\xee\x51\x5e\x1c\x05\xc5\x77\xf8\xea\x3b\xd3\x59\x17\xa2\x8d\x1d\x66\x6b\x6e\x6a\xd3\xb7\x29\x7b\xec\xe1\x0e\xe8\xc1\xf8\xee\xd7\x8e\x16\x4b\xed\xca\xb5\xed\x36\x74\x7c\xf7\x2b\x77\x30\x16\x8b\x6d\x9c\x07\xbe\xfa\xb0\x73\x2f\x14\x75\xad\xc0\x1e\xfb\x92\xcc\x67\x5b\xd9\x99\x40\xac\xa4\x25\x44\x78\x9a\x8a\xe2\x52\x0e\xa8\x3e\xd6\xcb\x94\x47\x59\x76\x09\x85\xe0\x5f\x7d\xeb\x89\xa8\x1d\x69\x41\xc9\x4b\xd6\x95\x2d\x87\xae\x41\x8b\x22\x78\xbd\x4a\xcb\xde\x79\xca\x2e\x7a\x69\xd9\x8b\xb2\x82\x45\xc9\x65\xcf\x00\x62\x4f\xc5\xa2\xc8\x2e\x7b\x22\x87\xcc\x31\x87\xeb\x75\x96\xc6\xe0\xd3\xf6\x92\x2d\xf7\xfa\x46\x54\xb3\x15\x72\x47\xad\xe3\x7f\x54\xe4\x67\x87\x30\x95\xc0\x64\x95\xd4\xa3\x8b\x0d\x1f\x74\x80\xdf\x47\x67\x2a\x9e\xd8\x5d\x27\x77\x53\x67\xab\xb6\x8c\xc9\xdc\x1d\xda\x72\xeb\x6f\xb9\x65\x22\xef\x45\x3d\xaf\x07\x67\x9b\xd4\xa2\x1c\xa3\x91\x87\xb1\x17\x98\xef\x12\x64\xd1\xda\x0c\xeb\x04\x71\x87\x90\xb0\xb4\xa1\xcd\xcd\xa6\x5f\x1a\x8e\x09\x2a\x24\x61\x15\x65\x99\x79\x7b\xf0\xf0\x58\x4e\x90\x32\x52\x34\x4f\x05\x37\x4f\xc5\x75\x97\xe3\x5b\x73\x39\xce\xbd\x0b\x7c\x1b\xf8\xf7\x60\xff\xdb\x48\x12\xa7\x5b\xe0\xbe\x35\xc6\xee\xb7\x46\x09\x67\x16\x10\x29\xe8\xb7\x18\x93\xc7\x71\x28\xae\x61\xfb\x1a\xa6\x4b\xf4\x54\x69\xb1\xf7\x2c\x79\xfa\x03\x43\x3a\x68\x23\x11\x8d\x32\x9d\x5d\xf4\x7e\x8b\x51\x41\x1a\xea\xf4\xf3\x7f\xe9\xbc\x6c\x33\x5d\x08\x04\x84\x55\xb6\x37\x7e\xf4\x64\x2c\x1f\xab\xf1\x97\x03\x26\xa9\xcc\xd7\x7f\x9b\x43\xfa\x63\xe5\x3c\x4f\x9e\xc7\xd4\x70\x26\xe4\x85\xf2\x8d\x76\xf9\x6a\xf2\x4c\x7d\x7b\x12\xa3\xe7\x31\x26\x2f\x43\x6e\xff\x7f\xf8\x6e\xff\x8f\xfe\xb6\x39\xbe\xd4\x73\x7c\x70\x1b\x68\x76\x02\xf6\x04\x20\x3a\x72\x21\x5a\xc2\x73\xc2\xe2\x2c\x52\xee\xb4\x10\x55\x9e\x32\x12\x79\x5f\x5f\x37\x68\xa7\x20\xd1\x50\x67\x8b\x94\xf7\x2d\x25\x51\xe0\x16\x28\xde\xe0\xe1\xd9\x09\x4b\x12\x96\xc8\x2e\xaf\xe1\xc6\xc2\x83\x0d\x85\x6c\x5a\x12\x4e\x2b\x73\x6d\xda\x53\x25\x92\xbc\x1a\x7f\xa9\xf0\x93\x18\xca\xe2\xd7\x92\x54\x73\x72\x7a\x35\xa8\x6b\xca\xe7\xe3\x7f\x2d\xba\x23\x42\x4f\xf3\x5d\x13\xd1\x7c\x80\x8e\xe8\x15\x6e\x3f\xfe\x7a\xd1\x72\x27\x80\x4c\x3d\xf2\x3b\x2d\x86\xdd\x2d\x41\x02\x63\xb2\x8c\x24\x99\x02\xce\x62\xea\x0e\x70\x6c\x2e\xe1\xa3\xd8\x39\xd4\x3f\xfc\x70\x14\x9f\xbb\x37\xe7\x81\x22\x32\x75\xc4\x0a\x7d\x7b\xe4\x54\xbf\xdb\x19\xd8\xe1\xc3\xce\xd2\x6f\x43\x50\xfe\x89\x0f\xe5\x6f\xfe\x36\x28\xff\x56\x43\xf9\x9f\xff\x20\x94\x67\x0d\x10\x03\x7c\xaf\xf2\x52\x00\xac\x00\x4c\xc3\x4f\x05\xfd\x61\x98\x36\x29\x52\xb7\xa0\xcf\x2c\x36\x36\x6e\xa6\x5b\xd2\xfc\x7e\xe2\x93\x6b\x29\x90\x74\x79\xb1\x15\x15\x4b\xc4\xc3\x6f\xde\xdf\x3a\x52\x66\x67\x5b\x7a\x55\x07\x53\x5c\xdf\xa1\xa4\xb7\x7f\x15\x0e\xbd\xfd\x03\x18\x3f\xb5\x6a\x11\x4e\x3f\xf1\xcc\xa4\xf4\x6c\x6d\xaa\x21\xbe\xff\x95\xc4\xe2\xb5\x5f\xee\x30\x5f\x81\x25\x6c\xb3\x56\x02\x4f\x18\x68\xa5\xb9\xf9\xd1\x54\xf1\x1b\xda\x7e\xca\x29\x3a\x18\x5f\x63\xf0\x65\x56\xf5\xb3\x39\xaa\x06\x22\xda\x8e\x40\x62\x30\x10\x73\xb6\x50\x36\x28\xb6\x57\x35\xce\x35\xcc\x5a\x83\x34\xcc\xb4\x46\x2d\xc3\xa3\xdd\x78\xd1\x37\xbc\x0a\xa1\x0d\x48\xc3\xeb\xa9\xd0\x94\x8e\x15\x15\x12\xf0\x8b\xd6\x68\x36\x88\xce\x36\x77\x2a\x27\xb6\x9b\x66\x2f\x7c\x78\x32\xa1\xbf\x94\x42\x81\x0d\xb9\x8e\xde\x33\x18\xd8\x00\x62\x11\x68\x17\xbf\x8b\x35\x9a\xcd\xc0\xde\x2b\xd3\x51\x72\xec\x2a\xc0\xa7\x57\xe7\xa0\x4c\x83\x0b\xc8\x87\x12\x34\x14\x5e\xc7\x24\x77\x2e\x8c\x2c\xde\x6e\xc2\x07\x8e\x2f\x8a\x60\x4d\x69\x31\x1f\x1b\xce\xb1\x98\xdf\x5b\xd8\xb8\x68\x7a\x20\xc5\x36\x32\x9d\xe9\x6d\x8f\xd2\x48\x01\x94\x22\xa2\x51\xe4\x05\x31\x94\x1d\x90\x1c\x5e\x7f\x8e\x32\x92\xcd\xbf\x5c\x90\x4c\x76\x3a\xcd\x4d\x83\xdc\xe9\x53\xe7\x50\x28\xad\xd2\xe7\x8f\x4a\x67\x8a\x40\x02\x93\x98\xb6\x41\x64\xba\xb7\xcd\xb7\x6d\x3c\xda\x2f\x48\x64\xd3\x73\x4d\x8b\x6f\x46\xf0\x98\xa4\x07\xe3\xc5\xfc\xf3\x05\x15\x98\x14\xf7\xa3\x83\xf1\x68\x86\x84\xfc\xcd\xe7\xe9\x82\xfc\xc6\x11\x27\xd0\x52\x40\xf8\x40\x1b\x90\x5d\x55\x51\x4a\xfa\xf9\xbd\x05\x55\x39\xea\x33\x2a\xe4\x7b\x68\x44\x50\xd9\x60\xc0\xd5\x3f\x21\x1b\x49\x36\xff\x7a\x31\x05\x02\x4d\x5e\x8f\xf9\xbd\x85\xfc\xdf\xf8\xcb\xc5\x60\x80\xd8\xfc\xee\x02\x1c\x8b\xad\x61\xa9\xac\x4c\xe7\x62\x31\xb1\x53\xa8\x51\x66\x14\xcc\xb9\x1c\xf6\xeb\x85\x93\x6c\x2d\xd7\xe7\x0f\xe0\xcd\xe4\x1c\x0d\xcf\x89\x20\x14\xa0\x89\x4b\x58\xd1\x67\x05\x2a\x49\x8c\x49\x22\x4f\x79\xbc\x20\x2b\x7a\x51\xa0\x84\xc4\xf3\x7f\x2d\xda\x57\x78\xb5\x2d\x5e\x79\x31\x1f\x2d\x68\x4a\x8a\xf9\x97\x0b\x2a\x24\x03\x24\x1f\x12\x4e\xc6\x50\x2a\x47\x8c\xe5\x29\x27\xa4\x20\x2b\x52\x61\xc2\x86\xdb\x78\x42\x84\xe5\x8e\xff\x1a\xa3\x18\x13\x90\x4a\x35\xf2\x97\xb0\x79\xa8\x1b\xb9\xc6\x81\x7a\x15\xfb\xcb\x82\x3a\x00\xd3\x5f\xc3\x5e\x8e\x7c\x84\xe1\xc9\xc1\xf8\xc6\x86\xab\x5d\xb8\x65\xe4\x60\x2c\x51\xfe\x59\xd1\x19\x56\x1e\x28\x1f\x0c\xd0\x43\xd8\x84\xce\xa4\xe4\x15\x3e\x81\x34\x7a\x0b\x10\xc4\x5c\x23\xac\xf8\xf8\x39\x34\x16\xa7\x6a\xfd\xdb\xe7\x33\xb3\x44\x96\x6f\x6d\xe5\x8e\xb6\x7d\x62\x1f\x19\x9d\x6e\xe4\x9b\x66\xb3\x99\xf3\x66\xed\x8b\x09\x33\xf4\xde\x1b\x97\xde\xfb\xd9\x0b\xe3\x35\xff\x6a\xe1\x04\x6e\x6d\x17\x6d\x36\x48\xfe\x43\xbd\x68\x84\x9f\xc4\xce\xed\x25\x05\x64\x52\x6e\xa4\xd9\x12\x37\x62\xcc\x69\xe1\x18\x60\x29\x21\xb3\x4e\x77\x99\xd2\x37\xb2\x4a\x53\x1c\x51\x48\x4f\x3a\x4d\x69\xd4\x0a\xe0\xdd\xef\x63\x8d\x4e\x74\x74\x34\x95\x00\x18\x12\x09\x67\xb8\x95\x03\xc2\x4e\xfc\x03\x83\x80\xb0\x6e\x02\x0b\x24\xf0\x44\x78\x19\x2d\x54\x0f\x92\xa5\x6d\xa6\x4f\x39\x7d\x16\xa1\x82\x08\x92\xca\x3b\xf7\x07\x10\xd0\x1e\xb1\xf1\x67\x2c\xc9\x46\x79\xa9\xe4\xb4\x7e\x88\xe9\x55\x4d\x7e\xfa\x07\x84\x01\x18\xdb\xb7\x70\x8b\x34\xe0\x16\x51\xf7\xd4\x54\xde\xb2\x16\x61\xc5\x2a\xa4\xe5\xdb\x66\x28\xcb\x1f\xa4\x2e\xbc\xfc\xe8\x44\x51\x9c\x2f\xac\x4d\x1b\x44\xe2\x67\x98\x75\xc3\x13\xdb\x6c\x4b\x57\xeb\x22\x5f\x3f\x8b\xce\xd8\x04\x74\xe9\x82\x9d\xad\xb3\x48\x30\xf8\xc2\x1d\x3a\x03\x36\xf3\x17\xc5\x09\x1f\x73\xd4\x7f\x75\xf4\xfd\xc3\x07\x6f\x9e\x3c\x7c\x79\xfc\xfa\xf9\x8f\x0f\x9f\xf5\xc9\xd5\x6d\x62\xa3\x3d\x4b\x21\x32\x5a\x75\x2b\x72\xbf\xe5\xc2\xef\x9c\x4b\xda\x3a\x17\x1b\xa1\xf0\x01\x5b\x52\x46\xd2\xe6\xa0\x20\x29\x97\x29\x7d\x7d\xb9\x66\x54\x41\x3c\x49\x87\x2a\x1b\x56\xae\x12\x47\xa8\x3f\xc1\x52\x1e\xfd\x92\x9a\xf8\x69\xa4\x8f\xa1\x33\x9d\xd3\xe5\x95\xa9\x06\x64\x51\xfb\xe3\x2c\xf4\x71\x32\x5f\x90\x74\x98\x96\xdf\xe6\x15\x07\x17\x3d\x98\xd5\xde\x5e\x41\xd2\x00\x00\xa5\x7c\x5d\x89\xae\xda\x41\x57\xfc\x51\x63\x39\x77\xb5\x43\xd5\xc4\x91\x5b\x57\xe2\xd6\x7d\xe8\x36\xd7\x07\x6d\x6b\xc5\x3b\x25\x19\x45\x05\x2d\x34\x19\x69\x21\x76\x16\xc2\x00\x57\xde\x7c\x3c\x3a\x94\x69\x17\xfd\x1f\x62\x87\x4e\x8c\xf6\x28\xfd\x21\xde\x6c\x0a\x2a\xff\x9d\x45\x13\x61\x62\x16\x80\xf5\x67\x2d\x01\x64\x68\x38\x2b\x3c\x61\x24\xa7\x19\xd4\xa8\x62\xf2\x2d\xc3\xa4\xd4\x3f\xd7\x9a\x4a\x25\x31\xcd\x35\x26\x7b\xc9\x78\xc2\x0a\x56\x38\x3c\x8a\xbb\x1d\x98\x54\xb4\xbb\x47\x16\x44\xe6\xa3\xc5\x7c\xb4\xd8\x6c\xfa\x49\x7a\xde\x27\x09\xe5\xb3\x80\x90\x0c\xd0\x1d\xb6\x1c\xb0\x6a\xfc\x32\xcf\x85\xc9\x5e\x25\x08\xa7\x94\xfe\x38\x7c\xb5\x8a\x92\xfc\xe2\x41\x7e\x66\xac\xf1\x3a\x29\xa8\xc5\x8c\x0d\xff\xac\x58\x71\x69\x60\x0a\xf0\x66\x13\xfd\xdb\xc9\x39\x44\xfb\x7d\x52\xd4\x28\x26\xbc\xbb\xaa\x21\xe3\x71\xb4\x2e\xab\x0c\x44\x18\x78\x72\x5a\xa0\x9b\xef\x07\x09\xfa\xbc\x78\x29\xa3\xd4\x7c\xfa\xe5\xb9\x9c\x3a\x15\xb3\xfe\x4a\x88\xf5\xe4\xce\x9d\x8b\x8b\x8b\xe1\xc5\xbd\x61\x5e\x9c\xde\xb9\x3b\x1a\x8d\xee\xc8\x0a\x93\xfe\x59\x24\x56\x5b\xeb\x8d\xbf\xfe\xfa\xab\x3b\x4f\x23\xb1\x7a\xfa\xe4\x4e\x5f\x0b\x07\x2b\x8c\xc9\x2a\x70\x2c\x39\x7f\x51\x95\xab\xd9\x17\xff\xfa\x72\xf2\xc5\xdd\xaf\xc8\x9a\x5e\xd9\x62\xb8\x7b\x65\xbc\x62\x12\x28\x8b\xc9\xb3\x94\x48\xae\x93\x4f\xfe\x8c\xc8\x3a\x8b\x2e\x59\xf1\x7d\xc4\x13\x59\x02\xcb\x5e\x66\xd1\x69\x39\x19\xd5\x64\x49\x5f\x45\x68\xe4\xc8\x92\xc6\x64\x14\x12\x2f\x69\xb0\x3a\xa7\x55\xa4\x36\x6e\x09\x2a\xd0\xa6\x3c\x97\x94\x2c\xc9\xf0\xf4\x7b\x81\xce\x95\xf8\xf6\x5c\x65\xe9\x0a\xd2\xa9\xe7\x3a\xa1\xfa\x78\x31\xe5\xf3\xbb\xa3\x05\x65\x9a\x7c\x4e\x22\x94\x91\xbb\x23\x72\x97\xf4\xff\x4b\xf2\x4b\xfd\x26\xcd\xec\xf0\x8c\x15\xa7\x2c\x39\x14\xa2\x28\xa9\x00\x6e\x0a\xfe\x76\xd4\xcc\xe8\x97\x08\xe5\xa4\x24\x86\x60\xdf\x53\x11\xb7\x3e\x08\x94\x12\x46\x4a\xfb\x31\x1f\xc6\x59\x54\x96\xac\x1c\x0c\x3e\x40\x04\x0c\x62\xbf\x38\x75\x4a\x71\x99\xc9\x2a\xdf\x99\x2a\xea\x03\xc6\x0a\x7c\x63\x2b\xf9\xb2\x30\x05\x01\x43\x2a\xd8\x24\x72\x18\x49\xee\x44\xcb\xee\xf4\xc9\x7d\xf9\xf9\x64\xfc\x25\x81\x15\x93\x1c\xa8\x7f\x47\x80\x67\x84\x2d\xdd\xdc\x44\x3a\x62\x7b\x0e\x61\x8e\x88\x50\x54\x0c\x79\x22\xb7\x2a\xc7\xe4\x37\xb9\x66\x1b\x5f\x7c\x8c\x81\x6e\xe0\x92\xbc\x57\x5b\x5b\xd5\x28\xe9\x02\x3a\x39\x97\x67\x06\x9c\x62\x82\xc1\x00\xe3\x83\x40\x31\x49\xc8\xbc\xcf\x4f\x0f\xce\x59\x51\xaa\x28\x25\x31\xc4\xee\x74\x93\xce\x5f\x7a\xef\xda\xb6\x74\x8d\x77\xa7\x45\x13\x95\xca\x22\xbf\x79\x11\xce\x83\x1f\xe1\xbb\x10\x84\x01\x72\xf9\x44\xf6\xfd\x8e\x08\x9b\xef\xef\x17\x0b\x3c\xf9\x8a\x42\xb6\x6e\x6e\xf2\xec\x4d\x4d\x62\xc0\xbd\x5f\x53\x94\x62\xac\x32\x97\xa5\x34\xaa\x8b\xfd\x7d\x93\x34\x31\x92\xe0\x31\x11\x44\x1f\xed\x84\x1b\xed\xc1\x56\x64\x87\xc9\x19\xbd\x84\xbc\x72\x25\x39\xa1\x97\x06\x28\xa6\x67\x83\x81\xde\x9e\x33\x4c\x4e\x06\x83\x13\x2b\xb2\x01\x08\x92\x05\x27\xfa\x19\xed\xf5\x31\xae\x21\x40\xe2\xaf\x0c\x2d\xc9\xdd\x11\x26\x96\x90\x16\xd6\x8c\xe1\x08\xa2\x21\x1a\x9b\x01\xb9\x6d\x87\x74\x34\x3d\xbc\xaf\x1f\x97\xf6\xcb\x6a\x36\xf2\xd0\xd8\x5c\xbc\xa2\x62\x7e\xb8\x98\x1e\x35\xe9\x72\xf7\xe8\xab\x99\xb2\x6c\x58\x16\xf9\x19\x7a\xa5\xd8\x00\x5c\xa7\xbb\x02\xde\x4b\xfe\x25\xa3\x61\x01\x4d\x2e\x10\x9e\xb2\x00\x34\x06\x82\x4f\xc3\xc9\xb4\x3f\x22\x8e\xc9\x43\x95\x2d\x5a\x90\x56\x1e\x57\xae\x2f\x51\x4a\xd7\x1c\x24\xbc\x45\x3b\x05\x42\x81\xa7\x91\xbc\x78\x9a\xb3\x8e\x24\x05\xee\xb2\x44\xd1\x60\x10\x49\x32\x5c\x60\x92\x4a\x62\x1a\x8c\xbc\x21\xa6\x75\x83\x14\xd5\xee\x64\x98\x00\x0f\x91\x91\x74\x30\x48\x83\x09\x51\xcc\xe3\x05\x9c\x7c\x0d\x59\x1c\xd5\x09\xfc\x54\xb1\x22\x65\xa5\x31\x74\x81\x3d\x69\x17\xa2\x31\xc9\x48\xde\x9a\x3f\xd6\xd2\x12\x68\xa1\xba\xdf\x8b\xda\x9b\xa9\x64\x70\xf2\x69\x00\x74\xa6\x33\x7b\x96\x46\x1e\xe5\x62\xb9\xcd\x06\xbd\x16\x48\x0b\x79\x30\xf9\x3e\x52\xcc\x67\x49\x46\xa4\x6c\x6f\x5d\xe9\x25\x03\x90\x3b\xf4\x54\x72\x12\x19\xc6\x24\xab\xd1\x69\x10\x19\xac\xc9\xfc\x32\x5b\x80\xd0\x5e\xfe\x54\xb0\x63\x74\x6f\x0f\x9d\x8c\x1b\x92\x46\x16\x55\xeb\x1e\xbd\x06\x2a\x93\x64\x31\x8a\xc8\x39\x26\xe7\x10\xf9\x5e\x91\xf2\x3c\xc6\x44\xdc\x8e\x16\xf6\xf2\x50\x07\x28\xe2\xbc\x45\x11\x67\xb9\xd2\x2d\xd3\x94\xe4\xc3\x63\x49\x9e\x2b\x61\x77\x24\x7f\x82\x75\x0b\x95\x07\x64\xec\x72\x69\x41\x1a\x61\x9c\x7c\x0b\x40\x33\xf9\x00\xb4\x9b\x79\x01\xea\x63\x76\xd1\x7b\x18\xa3\x08\xcb\x77\xc1\x27\xa8\x49\x1e\x24\x65\x6f\x21\xf4\x16\x8e\x7c\xda\xce\xf5\x26\xb6\x29\xd0\xc4\xcc\xdb\x64\x31\x40\x37\xb4\xe2\xf0\x1b\xdb\xaa\xa8\xe1\xb9\xba\xd3\xde\xae\xef\xa8\x11\x84\x0c\xb3\xae\xa0\xc5\xc7\x31\x3b\x3b\xb8\x9c\x63\x25\xa8\x05\x9e\xe6\xf8\x24\xcf\x45\x29\x8a\x68\xdd\xc4\x53\xa7\x8a\xd7\xd0\x1b\x4f\x0f\x51\x2a\xb9\x17\xbd\x29\x47\x27\xba\x3c\x6e\x71\xa7\x36\x58\xbe\x9c\xf8\x4f\x31\x92\xcd\x0c\x7e\x79\x27\xc9\x58\x92\x51\x36\x8f\x8d\x74\xdc\xbe\xc9\x83\xc1\xaf\xb9\xc4\x23\x5b\xe6\xf2\x47\x8a\xa2\xa1\x2d\x80\x6a\xc5\x3d\x23\x63\xa6\x79\x06\x40\x3d\xb7\x06\x88\xdf\xc5\xa4\x2a\x19\xd8\x5f\x4f\xe4\x0c\x6a\xcb\x5f\x4e\x52\xa7\x68\xfb\xf4\xeb\x05\x79\x05\x91\xb0\xbc\x81\xc0\x15\x4e\x96\x9b\x0f\x0f\xd8\x52\x02\x6d\x89\x30\x6c\x95\x86\xfe\x54\xbb\xcb\x04\x99\xb2\x9d\xca\x85\x8f\x14\x12\x9d\x66\xc3\xd7\xdf\xbf\x7c\xfe\xf3\xf1\xe3\x47\xc7\xcf\x9e\xbf\x3e\x7e\xf4\xfc\xcd\xb3\x07\xe4\xa3\x93\x3d\xfe\x3c\x7c\xc0\x96\x51\x95\x35\x81\x7e\x28\xa5\xa7\xd9\x66\x23\xff\xfd\x2e\x56\xff\x0a\x15\xaf\x43\x7b\x29\x39\x7b\xa4\x9d\xde\x09\xbf\xc9\x8d\x73\x0d\xb7\x9a\x3e\xa6\x7b\x36\x87\x08\x4b\x06\x03\xd6\x5c\x45\xa2\xa5\xed\x06\x08\x77\xbf\x35\xb8\xee\x34\xa0\x37\x74\x94\x34\x17\xda\x19\x0a\x9e\xba\xe6\x36\x7f\x17\x63\x92\xde\xe6\x56\xde\x5c\x30\x74\x06\x9c\xaf\x46\x87\x9a\x5a\x7e\xa7\x0c\x25\xba\x30\x23\x2f\xda\x2b\x26\x1a\x6d\x40\x8f\x35\xc6\xbe\xef\x18\xe2\x40\xac\xa7\xb4\x18\xa6\xd6\x60\x34\x1d\x0c\x3a\x39\xdb\xd3\x25\x12\x83\x81\xd8\xa3\x94\x77\x4d\x6b\x1e\x54\xca\xbe\x88\xf5\xd4\xdc\x7a\x05\x3b\x4d\x4b\xc1\x0a\xd6\x4a\xdc\xc0\x48\xbf\x77\xe0\xa4\x96\x7a\x25\x69\xf4\x7e\xef\xbc\xf4\xbf\x81\xdd\x3c\x56\xd9\x30\x79\x05\x30\x93\x4a\x9a\x45\xfe\x28\xe5\x0f\x4b\xbf\x44\x24\xa3\x4f\xd1\x1f\x29\x2a\x86\xe9\x19\x18\x54\x63\xc5\xfd\x48\x42\x2f\x1b\x96\x10\x6b\x35\xa2\xd9\x90\x37\x81\x56\x8d\xd1\xac\x8a\xb6\x3a\x85\xfc\x5a\x28\xc7\x9b\x0d\x12\x10\xdc\x21\xc7\x84\xa1\x1c\xe3\xba\x8e\x21\xc4\x69\x89\xaf\xb2\x21\x43\x65\xf3\x1e\x67\xc3\xa5\xc4\xfb\x08\x42\xb5\xe2\xa0\x78\xee\x46\xa1\xe8\x0b\xfd\x8e\x37\x27\x4a\x1a\x08\xfa\xe0\xca\xe0\xa2\xca\x27\x0e\xcf\x05\xc2\xfb\x4c\xa7\x5b\xb5\x19\x54\xe6\x05\xe4\x9d\x89\x66\x4f\x33\xd0\x6e\xf0\x99\x86\x1c\x8e\x27\x02\x61\xbc\x25\x38\xcf\x5c\x2c\x40\x1b\xe2\x88\x78\xb3\xaa\x93\x9e\x26\xa9\x54\xd6\xc1\x73\xc8\xf7\xa7\x0b\x9b\x16\x79\xe5\xd2\xb7\x41\x93\x9e\x16\x65\x41\xc5\xbe\x0d\x53\xf2\x3e\x83\xd4\xf6\x92\x39\x95\x93\x67\x24\xdf\xbf\x4b\xb2\x59\xa1\xa6\x9f\x41\xc1\xa4\x80\xe4\xa8\x78\x52\x55\xaa\x82\x84\x8f\xf6\x8c\x48\xea\xcc\xa9\xac\x5a\xea\x99\x5d\xb3\x6a\x12\x8c\x3b\xf3\xfa\x4d\xce\xa5\xd4\xd3\x56\x33\x2b\xf7\xef\x91\xdc\xcc\x2c\xd7\x45\x6a\x6e\x92\xc4\x53\xb3\x2b\xf7\xef\x85\x67\xe7\x65\xdc\x8f\xab\xf6\xc6\x5c\x33\x43\xa2\x29\xe1\xd8\x9d\xe3\x2e\x16\x1f\xf6\x55\x1d\x95\xb7\xd5\x62\xff\x2e\x54\xdb\x6c\xb2\x1a\x31\x12\xdb\x2d\x50\x6b\x8c\xf7\x3f\x27\xa5\x59\x63\x69\x0b\xcd\x2a\x49\x6e\xd6\x19\xef\x7f\xbe\x6d\x9d\x24\x73\x56\x0a\x95\x1d\x85\x9f\x68\xec\x59\x14\xc4\xaa\x87\x67\xc2\x9b\x26\x49\x15\x5a\x90\xb3\xee\x27\x19\x64\x77\x4d\xf5\x9c\xb3\xfd\x31\x89\xcc\x9c\x23\x92\xc2\x6c\xcd\x3c\xb3\x7d\x37\x3b\xe7\xaa\xf2\x15\x18\x3a\x75\x31\xdb\xbf\x3b\xea\xe6\x26\x9e\x21\xde\xcd\x34\x2c\x9c\x00\xd0\xc2\x6a\xe3\xa7\xfc\x1b\x3a\x9a\xf2\x83\x83\x76\x82\x3e\xf9\x24\x16\x0a\xab\x59\x9b\x74\x07\x8b\xa2\xfe\xbd\xd1\xdd\x3e\xe9\xbf\x5e\xb1\xde\x3a\x05\xbf\x22\xcf\xdd\x28\xce\xab\x2c\xe9\xf1\x5c\xf4\x4e\x98\xca\x87\xb3\x27\xb9\x5c\xc8\xff\x23\xeb\xbf\x04\x74\x5b\x80\x1b\x38\x98\x49\xa4\x0b\xca\x09\x6f\xc8\x4c\x70\xae\x6d\x25\xe2\x2a\x3a\x89\xb8\xb0\x7a\xc4\x52\xb7\x25\xc6\x13\x4e\x6d\xaf\x9a\x54\x33\x4e\x22\x97\x9b\x0d\xb2\x7f\xd3\x87\x0c\x29\x97\x02\xc9\xe7\xd0\x5f\xd1\x8b\xac\x11\x44\xe5\xf4\x47\xb0\x1f\x24\x25\x8d\x1a\x84\xf5\xa3\x90\xc8\xb6\x2b\xf2\xe5\xdf\xe8\x04\xa5\x4d\x8c\x17\x9b\xb0\xd4\xc4\x72\xb2\x09\x8f\xcc\x37\x4c\xe0\xcf\xa2\x46\x85\xb2\xec\x4b\x49\x89\x49\x69\x91\xf6\xaf\x28\xc3\x4e\x36\xb0\x75\x0b\xa3\xca\xc3\x6f\xd2\x57\x7f\xc2\x00\x21\x86\xae\x58\x43\x9e\x67\xc3\xb4\xfc\xb9\x88\xd6\x6b\x96\x20\x81\x07\x03\x24\xe8\x71\x36\xac\xf8\x45\x11\xad\x21\xd2\xce\xfc\x54\x20\xbc\xa0\x2c\xc2\x44\x48\x0c\xbb\x05\xfd\x1a\xe3\x16\xb1\x18\xae\xab\x82\x29\x5c\x3c\x93\xf8\x56\x5d\x2a\x41\x20\xb2\x37\x2f\x97\x79\x71\x46\xb8\x44\x85\xce\x07\xc4\xdd\xf4\xe6\xcb\x2a\x64\x51\x29\xf0\x55\xc9\xc4\xeb\xf4\x8c\xe5\x95\x84\x29\x6d\x29\x21\xb4\x51\xc1\xf9\x2d\x08\x15\x4d\x95\xc9\x5b\xd3\xa6\x1f\x47\x41\xfa\x71\xe4\x79\xc3\x8c\x16\x01\x0a\x87\xb5\x99\x8f\xe3\xb4\x3c\x2c\x2f\x79\x4c\x8b\xc6\x71\xde\xb5\x97\x3a\x4b\x83\x64\x72\x82\xde\x2a\xe9\x88\x4a\x4a\x87\x49\x9f\x83\x55\x2a\x74\xeb\x59\xda\x5a\x1a\xaf\xac\x4e\xca\xb8\x48\x4f\xc2\x0a\x08\x57\xfd\x40\x72\xca\x48\x4c\x85\x93\x2f\xcf\x37\x70\x25\x15\x05\x83\x16\x36\x18\x98\x34\xd7\x56\xc0\xc6\x8c\x1f\x0c\x9b\xe6\x26\xd4\x1d\x4a\x75\x92\x7d\xbc\xd9\xa8\x7d\x03\x19\x9c\xc6\x84\xe9\xf0\x24\xe5\x09\x5a\x61\x12\xdb\x06\x11\x5d\x0d\x99\x24\xb9\xdc\x16\x16\x77\x46\xb6\x45\x65\x5b\x64\x74\x05\x5c\x4c\xc6\x04\x73\x1b\x65\xa6\x51\x66\x1a\x69\x67\x06\xb3\xf3\x83\x01\x8a\xe9\xb2\x42\x31\x26\xf9\x60\x80\x72\xf9\x77\x8e\x31\xa9\x06\x03\x24\xa1\x05\x55\x46\x0e\xbb\xa6\xdd\x6d\x77\x76\xb5\xbd\xf7\x57\x72\xc5\x93\x9c\xc0\x3a\x26\x31\x31\xb3\x9b\x54\x8e\x19\x9f\x97\x5b\x6a\x78\x21\x89\x7c\x49\x99\xad\x31\x59\x1b\xf2\x28\x1f\xbe\xff\xc9\x01\xcc\xd3\xaa\x6d\x2d\x55\xb0\xb2\xca\x44\x69\x62\xee\x03\xa0\x5f\x56\x5b\xa3\x2d\x6d\x61\xb1\x6e\x08\xd3\x6d\xf7\x21\x09\xa1\x0f\xd2\x52\xa4\xdc\x5a\x6c\x3f\xe7\x99\x75\x0d\x4e\xd2\x42\x5c\xd2\xbd\x11\xf1\xa6\x2a\x79\x66\xe1\x7a\x3e\x2b\x99\x08\x4b\xe8\xde\xd8\x2f\x70\xdc\x8d\xfc\xcc\x43\xf0\x76\x51\x73\xbd\xa1\x3c\xb2\x1f\x74\x88\x16\xb9\x21\x44\x45\xde\xd2\x27\x36\x2d\xe6\x7c\x21\x9f\x04\x89\x40\x4f\xab\x50\x68\xac\xd8\x98\x8f\xef\x32\x50\xd3\x95\x6c\x98\x4f\x3b\x5b\x76\xd1\x3b\xaf\xae\x35\xa1\x0b\x1e\x1f\x5b\x38\xbe\x2d\xeb\x9b\x36\x03\xdd\xaa\x73\xcd\x97\x69\x16\x8c\x6a\xbb\xa5\xb5\xaa\xee\x77\x10\x76\xfb\xdc\xd2\x9c\x7b\x31\xe2\x0a\x96\x54\xf1\x0d\x8c\x76\x6c\x07\xaa\x81\x6f\xbd\xb3\xd5\xeb\xdd\xb8\xd4\xd8\xd1\x4d\x50\x1d\x07\xcb\xe5\x67\xd7\x47\xb0\x35\xed\x65\x65\xb7\xb1\xc8\x41\xae\xbd\x3d\xa6\x59\xab\xb9\xf2\x1a\x75\x9a\xbf\x52\xda\x86\x1b\xb6\x37\xf5\x91\xbb\x7f\xa1\x00\x1c\xad\x28\x7b\x53\x6e\xae\xd5\x58\xab\x37\x9f\xc8\x35\x4e\xd1\x96\x2b\x15\xe0\x70\x8d\xc2\x64\x8f\x5a\xa2\x4e\xd3\x6b\x7b\x63\x27\x96\xcf\xc8\xd5\xad\x14\x46\x25\x90\x82\x7a\x85\x44\x54\x68\x2d\x0b\x57\xa1\xe9\x24\xeb\x1a\x51\x0e\x1e\x9d\x91\xe4\xae\x6d\x97\xfa\x9a\xed\x8d\x6a\xc4\xed\xfa\x09\x58\xd8\xa9\xa8\x33\x06\x2f\x14\x56\xbf\x44\x8d\xe9\xa7\xfc\x22\x6f\x76\x31\xf7\xcc\x54\x17\x84\x6b\x1c\x50\xcc\x47\x8e\xc7\x1d\xcf\x45\xba\xbc\x7c\xce\xb7\x7b\x81\x78\xbb\xd4\x8e\xe8\x63\x76\x6d\xb3\xd9\xdb\x89\xdf\x4c\xc4\x41\xd3\x6e\x28\xeb\xa9\x57\xbd\x81\x45\x26\x74\x40\xb7\xf0\x1c\x0c\x6e\xbc\xa9\x44\xd6\x0c\x65\x1e\x12\x23\x06\x32\xdf\x2b\x6e\x5f\x23\x37\x22\xe1\xab\xcb\xb3\x93\x3c\x03\x48\x39\xdb\xf6\x2a\x74\x7d\xc3\x41\x39\xfe\x24\x2d\x45\x93\x4d\x4f\xc4\x2b\x8d\x90\x43\x68\x33\xcb\xf9\x35\xd1\x00\xb5\xa1\xb1\xed\xf9\xe6\x3b\x65\x9b\x0c\x4d\x4d\x67\x81\xe4\xe4\x6f\x7b\xeb\x66\xee\x8f\xc9\xbc\xf3\xda\xfd\xa9\xf4\x30\x41\x77\xf9\x1b\x98\x25\x37\xb7\xd8\xf4\xe4\x38\x45\xf3\x46\xc5\xa9\x22\x87\xc1\xdd\xf4\x15\x40\xb3\xf6\x07\x39\xcd\x26\xe3\x33\x64\x8e\x86\x04\xe3\x05\x64\x16\x37\xda\xef\xe1\x29\x13\xdf\x5e\x2a\x33\xc0\x08\x4f\x4d\xb6\x5f\x67\x45\x73\x9d\x83\xf8\x31\x7f\xd0\x78\x64\xc8\x35\x2c\x86\x70\xb0\x08\xb7\xdc\xe1\xd3\xe6\xb7\x2b\x48\x6c\x4c\x50\xb7\x4b\x12\xe5\xf1\xe9\xe9\xff\x9c\x8a\xd5\x53\x05\x57\x2e\x1e\x6e\xdc\x5f\xff\x52\x2f\xe1\x2a\xbb\x73\xdd\x8d\xa6\xe2\xbe\xbb\x31\x06\xf9\x89\xfd\x7d\xac\x0f\xe5\xb1\xe2\xa9\xcd\x85\xd0\x88\xc0\x6c\xa4\x58\x04\x61\xf4\xa8\x0a\x04\x5f\x56\x67\xfd\x91\xd2\x69\x50\x1b\xb4\xe0\x73\x5d\xb0\x04\xc4\x93\xe6\xd2\x82\xfd\x85\xf1\xe0\x2e\x58\x94\xd0\xa2\xc6\xe4\xf0\x7f\xc5\x85\xd1\xbe\x20\xa0\x49\x0c\x3f\x79\x7e\xea\xa9\xd0\xb1\x40\x16\x2a\x77\xfb\xf9\x62\xe8\xf6\xeb\x13\x16\xba\xe4\x61\x98\xc0\xb9\x19\x10\xb4\x0f\xbb\xe9\xd3\x85\x3d\xa6\xd1\xc0\xeb\x6d\x78\xa0\x59\x9a\x8a\x3e\x07\x4f\xad\xf3\xc0\xb9\xaf\xad\x41\x10\x33\x73\xd3\x27\x23\x93\xe4\xcc\xb9\xd8\x05\x1e\x7a\xa3\x22\x41\x52\x3c\x8d\x06\x03\x14\x6d\xb9\xdb\xf2\xb5\x6d\xba\xd6\xf6\x0e\x13\x4e\xe7\xd1\xc2\xbb\xdd\xaa\x02\x5c\xfb\xb6\xcd\xaf\x31\x74\xfc\x3b\xcf\xcf\xf4\xe9\x9f\x5d\xb3\xd2\xeb\xc8\x3b\xd3\x95\x43\x4f\xdf\xc0\xe7\xc4\x9f\x58\xb3\xc0\x22\x0a\x47\x87\xf4\x1a\xb9\x2a\x11\xb8\xee\xaf\x76\x3c\xb4\x6a\x47\x3e\x52\xc5\x75\x30\x6e\x5f\xb1\x33\x26\xa2\x24\x12\x51\xe8\x9d\x26\x8d\xbb\x46\xf7\xf4\x0f\x34\xab\x15\x17\x79\x59\xb2\xf2\xd9\xe9\x6b\xbd\xf1\x0d\x13\x16\xad\xd7\x59\xca\xca\xd7\xf9\x33\xf6\x5e\xa9\xb7\x2d\x27\xe7\x78\xee\xc9\x02\x1d\xfc\xfd\xa3\xae\xb9\x9a\x64\x79\xb8\x5e\x67\x97\x29\x3f\x7d\x9d\xcb\x0e\x41\xce\xd4\x2c\x08\x7c\xad\x6e\x73\x9b\x77\xcc\x92\x52\x6d\x06\xdd\xc4\x64\xec\xae\xd3\xf1\x83\xda\x0d\xe4\xd0\xc3\x0e\x9c\xb3\x1b\x13\xb4\xd3\xa3\x04\xb6\x41\x87\x4d\x0c\x1c\x93\x3e\x8b\x28\x49\xe0\x6d\x43\x07\xda\x63\x01\x14\x48\x0d\xc1\x65\x20\x04\xb7\x2e\x6f\x7b\xac\xdd\xde\xe7\xed\x2d\x1a\x0c\xc6\x7b\x14\x8d\x07\xde\x10\xea\xc1\xc1\xdd\xec\xb1\xa1\x83\x80\xd0\xeb\x4a\xfb\x6e\x03\xc7\x0c\x06\x5f\x0d\x94\x6c\x75\x30\xd0\x91\x63\x20\x70\x2d\xe6\x94\x9b\xba\x66\xbf\x28\xa5\xc8\x41\x60\x50\x79\x72\x30\xc6\x9d\x00\x94\xfe\xc4\x1d\x2e\xdb\x00\xd6\xf5\x71\xcd\xcd\xfa\xec\x0b\xdb\x8d\xef\xc2\x9b\x08\x36\x0a\x9d\xf3\x10\x2e\x97\x2c\x53\x0b\xac\x25\x71\xf2\x92\x45\xc9\xf3\xb5\xe5\xd2\xde\x56\x80\xbe\x31\xb9\xbe\xea\x4a\x99\x35\xa5\x64\x6f\x4c\xf6\xc6\x26\x56\x2e\xa7\x94\x3e\x8a\x67\x9f\x0f\x84\xde\xcc\xeb\x3b\x3a\x18\xeb\x58\x9b\x37\x19\x8e\xdb\xe1\xba\xbb\xe9\xb7\xda\xe6\x9c\xe7\x51\xbe\x8e\x4f\xb0\xdd\xea\x42\xc7\xd5\x35\x7e\xc0\x38\x5d\xa2\x82\x52\x5a\x6a\xfb\xe5\x37\xfa\xdf\x47\xf1\x60\x60\xd6\x89\xfd\x0b\x61\xee\xc3\xc1\x5d\xec\x06\xc9\xd5\x6b\x28\xf4\x1a\x1c\x6d\x70\xb8\x79\xaa\x37\x35\x5c\xca\x9d\xf4\xbd\xa6\x30\x0c\x50\x6e\x34\x41\x8d\xa6\x67\x1e\xce\x9e\x33\x22\x16\x13\xf7\x93\x7e\x5a\x00\xa3\x74\x42\xcc\xbf\xf5\x75\x4d\x60\x9e\x94\x3d\x8b\xce\x5a\x7c\xc5\x56\xa8\xa4\x77\xc1\x20\x53\x29\x53\x6d\x58\x2e\x3e\x2f\xf6\xc7\x9e\x17\x76\x23\x74\x7f\xd7\xd1\x96\x1e\x8c\xc1\x59\x2d\x28\xea\x19\x8f\x8d\x87\xb5\x76\xab\x9e\x58\x97\x6b\xed\x8a\xad\xed\x90\x05\x61\x78\x72\x70\xb7\xd3\x93\x83\x1d\x39\x9c\xbc\xec\x08\x2a\x6b\xf8\xfe\xc3\xf9\xf9\x26\x9e\x7d\xa2\x7f\xaa\x87\xb4\xd6\x92\xed\xc9\x5a\x76\xc6\xc0\x85\x4a\x6e\xa4\x5d\xcd\x71\xd5\xf6\x18\x04\xa7\x3a\x4b\x41\x14\x0b\x27\x4a\x7f\x6a\x8e\xa4\x41\x6e\x91\x56\xde\x10\xc9\x63\xe9\x52\x92\x4b\x2e\xac\xa4\xa3\x69\x79\x3f\x33\x5b\x5d\xca\xad\xd6\xfa\xcc\x6c\x5e\x2e\xa6\xb9\x3a\xd7\xf8\xfe\x48\xe5\xd8\x7b\x27\xef\x7b\x34\x8f\x17\x24\x9b\x97\xfb\x20\xdc\xf0\xee\x01\xc6\xb5\x1d\x9f\x5a\xc3\x30\xfb\xa9\x59\xd2\x45\x67\x49\xcc\x52\x29\x0e\xb1\xc8\x31\x89\x9a\x15\xb9\xa1\xb9\x9c\x28\x5c\x7a\x7b\x20\xe9\xa9\x4a\x87\x1b\x35\xb9\x70\xcd\x82\x4a\x1a\xcd\x73\xd8\xa7\xf2\x9b\x91\x09\x8d\x95\xcd\xf3\x3b\x77\x8d\x29\xaf\xe9\x30\x96\x35\xe5\xda\x2a\x2a\xe6\x07\xe5\x82\x24\x74\x3c\x9a\x26\xf7\x2b\xd3\x69\x62\xd0\xe4\x8a\x56\xf3\x64\x31\x5d\x41\xa0\x01\x4a\x57\xf3\x7b\x8b\xc1\xe0\xa2\x42\x2b\x79\x84\x2b\x12\x93\x02\x0c\x5f\xf5\x94\xab\xf9\xd7\x0b\x3b\xeb\x35\xfc\x24\x4b\x3a\x9a\x2e\xef\xaf\x6d\x52\x5f\xd3\xf3\x39\x5d\xcf\x97\x8b\xe9\x45\x85\xce\x65\x5f\xe7\xaa\xaf\xba\x89\x9f\x65\x37\xf2\xfb\xaa\x31\x2d\x01\x55\x19\x57\xca\xd3\x82\xbe\x15\x08\x4f\xdf\x09\x54\xec\x8f\x8d\x69\xe9\xe3\x0a\xd2\x3e\x82\x4e\x44\xb1\xa6\x83\xc1\x4f\xf2\xed\x96\x4f\xd4\x5d\xf9\xff\x41\xda\x79\x23\x9d\x6c\xcd\x0e\x70\xb1\xa1\x0a\x33\x3e\x5f\x78\x7e\x63\x69\xf7\xfd\x9f\x5d\xc8\x51\x05\x29\xc8\x7c\x81\x27\xc7\xea\x07\xe8\xf2\x4c\x1f\x11\x89\x63\x4c\xd8\xb0\x25\x13\xb3\x26\x96\x7b\xa3\xda\x4a\xe8\xec\xc2\x9f\xb6\xd4\x85\x11\xd8\x5d\x04\xac\x73\x1f\x56\x48\x45\xa7\x3b\x32\x2d\xc0\xc3\x50\x2d\x17\xb4\x84\xc5\xb0\x14\x91\x48\x63\x49\xfa\x68\x46\x9c\xee\x8d\x30\x26\xbf\x55\x46\x75\xe9\x5e\xc7\x27\x1d\xd8\x85\xb1\xd3\x25\x4a\xdb\xc3\x1b\xbb\x62\x30\x7a\x7d\x58\xa1\xd4\x4c\x44\x35\x27\x91\x31\x5f\x0d\xbd\xe8\xac\x25\x44\x81\x00\xb8\xfe\x27\xc8\x11\x2f\xf6\x24\x81\x61\x52\xbe\xf3\x39\x6f\x84\x8f\x92\xcc\xb0\x46\xe2\xac\xc5\x3c\x48\xc2\x1a\x2c\x7a\x98\xd9\x0d\x8e\x21\xca\xb3\xda\x8d\x23\x7f\xa4\xbd\x11\xae\x7f\x93\x2b\x50\x50\xe6\xec\xc7\x7b\x47\xd3\xc3\x14\x10\x0a\x80\x3e\x89\xcb\x1c\x34\x25\x16\x8d\x80\x6c\xaa\x74\x96\xa2\xe9\xe5\xb7\xd6\x79\xca\x8d\xba\xac\xd0\xe7\x94\xa2\xcf\x07\x1c\xe3\xe9\x5b\x65\x30\x5d\x10\xab\x27\xb7\x4e\xc8\x80\x0e\x25\x95\x0c\xf1\x37\x20\xef\x68\x85\x89\x87\x24\xb5\x5d\x38\xbb\xe8\x9d\x55\xa8\x70\x15\xb4\x0f\x2b\x37\x29\x23\x50\xdd\xba\x0d\x68\xb9\x8d\x68\x00\x12\x8d\x81\x8b\xb0\xe9\x11\x78\x2e\xe8\xf2\x55\xa5\xe3\x8f\xd9\x4e\xb5\xf0\xa5\x89\xa0\x18\x40\x6e\x2e\x4c\xbd\xf6\xeb\xeb\x67\x07\x54\x64\xcf\x2b\xfa\x8e\xa3\xfe\x63\x0e\x49\x74\xba\xdc\xe4\xd5\x89\xb2\x92\x36\xfe\x7e\xca\xbd\xaf\xae\x31\x79\xa1\x5a\x3e\x07\x07\xaf\xdb\x35\x7d\x56\x59\xdf\x3f\x27\x56\x55\xef\x31\x4f\x45\x1a\x65\xe9\x07\x56\xf4\x31\x79\x59\xdd\x22\xa6\xa7\xa3\x17\x68\x71\x86\xd1\x7a\x2d\xfb\x2d\x0d\x67\xa8\x8d\x36\x69\x14\x9b\xdf\x7f\xb0\x58\xd8\x9f\xa9\x9d\x43\xa3\x86\x4b\x72\xce\xbc\x1f\x2f\x8a\xfc\x2c\x2d\x55\x26\x06\xfd\x37\x6a\x11\x39\x76\x1c\x46\xb8\x19\x43\xd4\x21\x55\x5b\x51\x71\x67\xe1\x21\x59\x7d\x63\x17\x09\x01\x14\xda\xf3\x6c\x9c\x35\x09\x77\x77\x88\xe9\x89\x8f\x08\x33\xb3\x41\xb8\xb6\x49\x1a\xcc\xc6\x38\x94\x51\xe3\x43\xd7\x04\x43\x30\xd5\xe6\x7c\xa1\xd0\xd0\x9f\x99\x84\x70\xed\x32\xe2\xc4\x8d\xfc\x15\xbe\x1b\x0a\x7f\xeb\xce\x14\xc3\x46\x3e\x7f\x65\xb5\xc1\x4c\x2b\x88\xe5\x16\xe1\xa9\xee\x3c\x95\x74\x75\x4a\x47\xd3\xf4\xbe\x37\x63\xf3\xa0\xa5\xfb\xfb\xb8\x40\x29\x9e\xea\x91\x86\xa0\x75\xc6\x43\xb1\x62\xdc\xb5\xaf\xe6\x08\xd7\x78\xa8\xac\xfb\x5c\xf1\x13\xd3\x07\x83\xc0\x09\x01\xf2\x1f\x59\x0b\x14\x6e\xf4\x0a\x1e\x40\x8c\xb6\xc7\x1f\x5d\x46\x8e\x5f\xb0\x70\x45\xfe\x48\x6c\x36\x0c\xa3\x3f\x39\x7a\x56\x91\xaf\x30\xae\xc9\xb6\x98\xa5\xc6\xc9\xd5\xe9\x53\x87\x2a\x25\x8f\xbc\x2b\xf3\x38\xe9\x63\xf2\xa0\xa2\xd6\x90\xf9\x51\x15\x8c\xb2\x6a\xa6\xd1\xb7\x06\x46\x7f\x54\x08\xe3\xed\x3f\x4c\xe4\xd5\x45\xed\x04\x0c\x72\x30\xb0\xd2\xd5\x81\xcf\xcb\xd1\x2a\x2a\x8e\x24\x73\xfe\xf5\xbf\xf6\x9f\x46\x62\x35\x5c\x66\x79\x5e\xa0\xbb\x5f\x7c\x06\xbf\x8a\x88\x27\xf9\x19\xc2\x58\xe1\x99\xef\x9a\xf9\xbf\xc8\x22\xb1\xcc\x8b\xb3\xd6\x7d\xff\x10\xaa\xf1\xa0\x8f\xc9\xb7\x4d\x41\xb4\x5e\x7f\x6b\xec\xbe\x25\xa2\x67\x1c\x9a\xbe\xb9\x31\xaa\xd8\x9d\x10\x2a\xcb\xbb\x6a\x4b\x86\xaf\xe2\x9c\x97\x79\x26\x39\x8b\x53\x57\xbc\x79\x11\x15\x01\xbe\xae\xa9\x2e\xcb\x5d\x79\xd8\x6d\x21\xe6\xa3\xe0\xe4\xcf\x66\xb3\x9e\x48\x46\x88\x01\xa8\xfc\xdc\x7c\xd5\xd6\xdc\x47\x10\x95\x3c\xbe\x94\x27\xd8\xc7\xe4\xd7\x90\x64\xbe\x85\x49\x8d\x13\xae\x86\x32\x83\x50\x5b\x56\xf3\xf0\x9a\xd5\x98\x7c\x52\x85\x82\xbe\xc9\x59\xa4\x92\xa8\xac\xc9\x0f\x15\xfd\xa4\x22\x3f\x05\xab\x99\x0b\x6d\xd0\xd6\x27\x15\x84\x44\x21\x3f\xfa\xb5\x15\xde\x83\x42\xc2\xe9\x1f\x29\x02\xbb\xe8\xa1\x23\x66\x29\xb1\x51\xae\x87\x68\xa0\xb7\xf2\xed\x70\x82\x3e\xb0\xe6\x1d\x67\x15\xe2\x90\x65\x5b\xd2\x95\xae\x1b\xfd\xaf\xea\x35\xae\xc9\x2f\x15\xfd\xb1\x22\x2c\xb9\xc9\xfc\x7f\xd4\xf3\x17\xc9\x47\x00\x6a\xb3\xcd\x69\xc6\xd4\x11\xbc\xba\xe4\x31\xfd\xa1\x0a\x94\x28\x3b\xaa\x9f\x82\x45\x3c\x39\xcc\xb2\xc6\x8f\x02\x3a\xf9\xe5\x26\x35\x55\xa7\x2c\x09\x6a\x3c\x59\x54\x1c\x45\xf1\x2a\xa4\xf6\xf4\x63\x32\x41\xad\x47\x79\xd0\x2c\xc3\x95\x70\xab\x39\x3c\x0e\x0a\x34\xff\xb3\x97\x89\x27\xb4\x7d\x92\x23\x47\xf2\x50\x24\x72\x4a\xfd\x8a\x27\x6c\x99\x72\x96\x34\xf6\x5f\xbf\xe5\x9c\xcd\x78\xd2\x79\x89\x18\x98\x36\x41\xe0\x63\x27\x0c\x26\x9e\xc8\xfa\x26\x51\xc0\xd0\xf8\x15\x3f\x4d\xe3\x22\x7f\x1d\x95\xef\x50\xdf\xfb\x24\xa2\xf2\x5d\x5f\x22\x30\x78\x6a\x93\x6b\x89\xa2\x21\xe3\xd1\x49\xc6\x9e\xe4\xfc\xf4\x95\x88\xe2\x77\xaf\x8b\x28\x66\xa4\xa0\x56\xd0\xce\x07\x03\x4e\x52\x2a\x86\xe5\x2a\xaf\xb2\xe4\x28\x8f\x32\x56\xc6\xec\xe1\x39\xe3\x5a\xdb\xaf\x0c\x02\xd2\x9c\x93\xa8\x69\x96\x0e\x06\x29\xc9\x3a\xcd\x5e\x56\xbc\xdd\x28\x6f\x1a\x65\x83\x41\x26\xa9\x88\x16\x74\xaf\xa2\xf2\x05\x03\x6a\xf1\x69\xa4\x97\x58\x5a\x92\xcb\x29\x4c\x3b\x85\x69\xf9\x4a\xc8\xe5\x59\x41\x70\xce\xdf\xf0\x52\x7d\x52\x86\x48\x60\x88\xaa\x8b\x6c\x07\x90\x0a\x31\x50\xe1\xd5\xb6\x96\xe0\xfb\xe0\x7e\xdf\x76\xee\x5d\x7f\x89\xc7\x4a\x0a\xdb\x8b\x73\xbe\x4c\x4f\x2b\x85\x99\x7a\x87\xfc\xb4\xca\x24\x91\xc5\xfe\xac\xd2\x82\x95\xd0\x78\xf8\x47\xd9\xc7\x53\xf8\x2b\x2a\x4b\x56\x08\xf9\xe7\x0b\xe0\x8a\x13\x9d\x74\x4b\x85\x84\x9a\x42\x76\x87\x52\xa4\xfc\x94\x8e\x48\x39\x3c\xce\x2b\xc1\x0a\x0a\xa9\xc5\x39\x2b\xa8\x0b\x51\x04\x7e\x48\x48\x92\x47\xff\x2e\xe5\xa7\xf2\xc3\xab\x35\x8b\x07\x03\x64\x5b\x98\x3f\x86\xcb\xbc\x50\x8c\xc7\xd6\x66\x18\x93\x62\x30\x80\xe2\xcc\x83\xaa\xeb\xfb\xdd\xd1\x08\x63\x52\xde\x00\x04\xe9\x5e\x3e\x18\x44\x9d\xaa\x5d\xb0\xa3\x39\x51\xf6\x70\x2f\xd9\x9f\x15\x2b\xc5\x21\x4f\xcf\x60\xeb\x1f\x15\xd1\x19\x7b\x9c\xd0\x83\x31\x29\x87\x3c\x12\xe9\x39\x0b\x56\xe9\xe2\x6a\x2e\x11\x41\xa0\x26\x11\xb2\x28\x8e\x78\xcc\x32\xbf\x04\xfc\xaf\x1b\x48\xd9\x73\x21\x65\x30\x60\x83\x81\x63\x25\x0f\x7b\x73\x7c\x5c\x82\xa9\xca\xf1\x31\xea\x3f\x2f\xd2\xd3\x94\x47\xd9\x03\x96\xb1\xd3\x48\xb0\x3e\x5e\x40\x98\x24\x46\xb9\x89\xe9\x20\x6e\xd6\xaa\x00\x73\x65\x1b\x30\xf5\x6a\xc7\xaa\x27\x8c\xa8\xd2\xa3\xc0\x72\x26\xa2\xae\x11\xde\xb5\x69\x81\x78\x0e\xce\x36\x7a\xc1\x67\xd9\x30\x2d\x21\x72\xb5\xba\x74\x2f\x2b\xce\x53\x7e\xba\xd9\x40\x2c\x35\xb6\xeb\xe8\x40\x58\xb1\xeb\x68\xd9\xae\x29\x6a\x27\x19\x67\xaa\x72\x2e\xcb\xe8\x1d\x7b\x9d\xaf\x01\xe4\x24\xd0\xc3\x18\xed\x8f\xea\x5e\x15\x79\xde\xa0\x69\x5b\x86\xfa\xed\xda\x7d\x7f\x84\x6b\x60\x31\x4f\x54\x36\xf1\xd0\xa6\x48\xec\x96\xed\x2c\x1f\xd7\xc6\xcc\xdb\x7d\x80\xbd\x1f\x92\x9e\xe9\xac\x68\x98\xf2\xf3\xfc\x9d\x72\x8f\x83\x19\x80\x93\x53\x3d\x65\xe6\xfe\x32\xef\xfe\x5e\x71\x09\x05\xfd\x48\x21\xaf\x3e\x59\x2b\xe6\x3e\x65\xe5\xe4\x2a\x2d\x35\x4e\x93\x9b\x34\xd9\x1b\xd5\x24\xe7\x8f\xa1\x77\x39\x50\x2b\x42\x8b\xf1\xc1\x11\xc5\xa5\x79\xac\x4b\x58\x20\xd7\x33\x82\x2d\x35\xd5\xac\x59\x3f\x62\x37\x40\x11\x83\x41\x9f\xd9\x33\xa0\x94\x46\x20\x6e\xdf\x6c\xda\x6d\xbb\x38\x03\x0f\x06\x02\x61\x12\x6b\x3b\x06\x33\xff\xe0\xdc\x49\xb9\x63\xf6\xa8\xa9\x64\xe7\x7e\xfd\xf0\xed\xd1\xbf\x8f\x4a\x7f\xeb\xac\xc7\x15\xb8\xb1\xc1\x16\xc9\x9f\x10\xf1\x45\xde\xf1\xfe\x99\x21\x1a\xfa\x94\xa6\xda\x28\x6e\x86\xd8\xf0\x38\xf8\x88\xa6\x43\x5b\x5f\x83\x1f\x00\x19\x9e\xf4\xcf\xa2\x6e\x3f\x20\xb1\x0a\xbe\xd4\xe9\xd0\xd6\x97\x64\xae\x9c\x38\x4f\x32\x06\xef\x5f\x60\xf2\x46\x35\x39\x5c\x35\xd5\xd4\x3a\xd8\xb0\xa8\xf8\xf3\x4a\x94\x69\xc2\x34\x30\x05\x3c\xa5\x99\x79\x8f\x95\xc1\x61\x2a\x61\x77\x6f\x5c\xd7\xb8\x46\xe5\x16\x11\xcb\x36\x05\x9c\xa7\x25\x55\x70\x5e\x54\xbc\xed\xb3\x5a\x54\x5c\xdd\xe7\x9d\x51\x8b\xa8\xd3\x0b\x68\x16\x02\x28\xe2\x19\x3c\xa2\xf0\x61\xd2\xeb\xef\x17\x84\x91\x28\x21\x51\x4c\xa2\x58\xb9\xcf\x58\xad\x86\x1e\x13\x45\x7e\x40\xfa\x54\x3f\x33\xaa\xcc\xd1\xba\x15\x15\xff\xae\x8a\x8a\x84\x05\x73\x22\x6e\x5f\xab\x6e\x14\x58\xb2\x7f\x0e\xd7\x1a\x14\x03\x05\xa2\x76\xcf\x4d\x45\x93\x96\x8f\xb9\x83\x17\xb6\x5a\x47\xee\x8d\x28\xf5\xc8\x16\x70\x04\xed\x7b\x48\xa5\xef\xc4\x8c\x07\xf2\xe8\xba\xae\xd3\x25\xda\x93\x18\xd3\xab\x87\x42\x89\x5a\xdf\xaf\xc1\xe4\xb5\x27\xf2\xde\x09\xeb\xa5\x0d\x7d\x26\x5b\x90\xde\x49\x25\x7a\xa9\xe8\xa5\x65\x8f\xe7\x62\xaf\x33\x8f\x67\xf9\x4d\xa6\x72\xeb\x99\x68\x1f\xb0\xed\xb3\x81\x99\x18\x7b\x9b\x28\xa1\x57\x8e\xdc\x06\xae\xb2\x1c\x76\x44\x55\x12\x3f\xa0\x16\x07\x83\x3d\x16\xa4\xa8\xa1\xc0\x50\xd3\x58\x82\x62\xd3\x68\x7f\x9f\xb0\x0e\xf5\xac\x2e\x9f\x1f\xba\x02\x16\x69\x5a\x1d\x1c\x90\x2d\x63\xe9\xee\x6f\x7a\xd7\xd5\x9c\xdc\xf1\x5c\xa4\xea\x70\x00\xb5\xe3\xf1\x05\xf8\xec\x2a\x3c\x3e\xdd\xdb\xdb\x86\x13\xe1\xd9\xbf\xfe\x89\xb9\xe1\x63\x72\x3d\x29\xe3\xfa\xaf\xea\x19\x7b\xbb\x6e\x56\x07\xc8\xb7\x59\xea\x18\x0e\xc4\x70\x3a\xce\xd6\xb8\xfe\xa6\xad\xfe\x0e\x0e\x14\x7a\x07\xc6\xb1\xda\xc6\x38\x76\x24\x0f\x3b\xd9\xaf\x9d\x8c\xdb\xf5\xbc\xd9\x4e\xbe\x2c\xc8\x93\x85\xf8\xb1\x8f\x42\xf9\x86\x11\x6f\x63\xbd\x9b\x21\xd1\x6d\xad\x6f\x8c\x33\x5d\x9f\x89\x6b\x9f\x97\xe0\xa0\xe6\xda\x27\x37\x16\x2a\xed\x54\x94\x1c\x2b\xfe\xce\x26\x41\x5a\xab\x63\x3d\xca\x2b\x2e\x8c\xbf\xd1\x71\x5a\x02\xb7\xe6\x9f\xea\x71\x92\x26\x3f\xe7\xc5\x3b\xc7\x6f\x29\xca\xb2\x93\x28\x7e\xd7\xf8\x38\x89\x16\x1b\xe9\x66\x50\xba\x90\xfc\xad\xde\x31\xb8\x6b\x25\xc2\x44\xc0\x4b\xe2\x4a\xf1\xbb\x7d\x6c\x17\xbd\x54\x59\x36\xe9\xbe\x25\x6d\x5e\xb6\x8f\x83\x1a\x99\xc0\x84\x76\x6b\x65\xdc\xfd\x73\x6f\xa5\xa3\xe9\x00\x37\x38\x8f\x1b\x68\x76\x6d\x44\x58\x7b\x67\x25\x31\xe3\x1d\xcb\x6e\x5c\xc9\x9c\xd1\x5f\x5d\x3b\x76\x9a\x0c\xc3\xaf\x16\xc2\xa4\x48\x5a\xfd\xb6\x4f\x9c\x0d\x8f\x8b\x8a\x1f\x99\x03\x7e\xbc\x7c\xc9\xa2\xe4\x12\x41\xde\x4c\xf8\x8f\x35\x82\x8f\x0b\x16\x95\x4c\x63\x07\x8d\xfd\x00\x9a\xae\x73\x0d\x72\x21\x6f\x9f\x8e\xdb\x40\x36\x0a\x00\xa8\x63\x35\x7f\x9b\x61\xad\x61\x9f\xdb\xd7\x81\x1d\xd2\xfd\x7a\x7f\xd4\x7d\xaa\x75\x79\x2f\x2a\x2f\x79\xdc\xd3\x92\x81\xb2\x77\xc2\xb2\xfc\xa2\xf7\x81\x15\x79\xbf\x9d\x9f\x38\xb4\x73\xbb\x96\x63\x30\xe8\x75\x5b\xe6\x9e\xd2\x60\x30\xb2\xd9\x5a\xdd\x4e\x07\x83\x3d\x0f\xa2\x42\xa8\xdb\xc9\x82\xdc\x9d\xea\xb5\xaa\x49\x0f\xe9\x23\x8c\x7d\x60\x82\x00\xfc\x23\x78\x0f\x1b\x04\xe1\xc7\xac\x13\x7e\xd9\x3a\x5f\x23\x3c\x05\xe1\xb1\x71\x66\x16\x43\xa1\xfe\x7a\x9c\x48\x1c\x91\xe4\x9c\x1d\x9d\xa0\xe6\x36\xe1\xda\xbd\x59\xe3\xda\xb1\x1f\x11\xd6\x5a\x5c\x2f\x5b\xa2\x83\x12\x99\xb4\x3f\x0d\xce\x6a\xfd\x36\xee\x81\x5d\x24\xbe\xc7\x86\xd5\x3a\x89\x04\x3b\x3a\xd9\x6c\x9c\x1f\x48\xe0\xcd\x06\x79\xf3\x66\xee\xbc\xf7\xc6\x36\x18\x8d\x03\xd6\xb5\x2b\x04\x77\xa7\x78\xcd\xe1\xb7\xd1\xe2\x2c\xf8\xb5\xe1\xd0\x94\xb7\x64\x40\x5f\x5f\xe6\x55\x11\xb3\x09\x1b\xaa\x3f\x08\x38\xf3\xa4\x39\x7f\xa2\x03\x7e\x4d\x74\xf8\x7d\xe7\x13\x49\x22\x11\x4d\x94\x01\x58\x5d\xe3\xc9\x7c\xe1\x5a\x01\x1a\x00\xda\x9d\x9a\x00\x5e\xa1\x94\x1e\x8c\xa7\x62\x30\x10\x10\x9d\x3e\xa5\x8e\xff\xba\xbb\x6c\xf7\x98\x8a\x1b\x9d\x51\xcf\xd9\xf9\x3d\x4a\xd3\x1a\x13\x86\x0a\xbb\xef\xa4\xe8\x02\x04\xae\x89\x30\x56\xa7\x2e\x34\x42\x8c\x63\x05\x71\x13\x46\x6c\xaf\x93\x94\x98\x83\x9f\x70\x07\x03\x5e\xac\x18\xdf\x72\x7b\x1d\xeb\x4f\x73\x2b\xdb\xe7\xd5\xc1\x36\x9f\xca\xd9\xf5\x84\xae\xd2\xfb\x90\x73\x26\xd9\x11\x2d\x3e\x4e\x7a\x72\xb8\xde\x3a\x2a\x4b\xc0\x48\xbc\xa7\xe6\xd4\x33\xf3\x97\xec\x44\x33\x23\x84\x87\xbd\xc7\x65\xaf\xff\x41\xc9\x9c\xef\xac\xb3\xea\x34\xe5\xe5\x1d\x39\x8b\x03\x33\x46\xbf\x97\xe5\x51\xc2\x92\xd9\xa7\xfa\x8e\x38\x47\x6a\x8c\x9d\x76\xe0\xb5\x00\x38\x7f\xec\x2b\xe0\xf9\xe5\xbe\x30\x91\x0f\x77\x93\x68\x12\x14\xff\x82\xae\x3e\x4d\x3e\x52\x53\xbf\xfa\x78\x1d\x9f\x32\xd3\x56\x37\xab\xb4\xd1\xde\xce\x93\x21\x64\xe8\xfe\x39\xe5\x49\xae\x73\x21\x86\x28\x5e\x1d\x84\xc9\xb1\xa8\xd9\x61\xab\xef\x0d\xa5\xf3\xe5\x3b\x06\xfb\x15\xbf\x51\x77\xc1\xce\x12\x06\x7e\x99\x2c\xd8\x5b\x96\x39\x1d\x6e\x77\x4c\xf5\x3a\x04\x44\xea\xc3\xd3\x6b\x26\x49\xac\x34\x4b\x03\xee\x92\x6d\xb9\x84\xd7\x97\x0a\xc6\xd6\xca\xc6\x72\xca\xc4\x61\x96\x35\x7d\xa6\x41\x97\x59\xdd\xa9\x13\xf5\x33\xd0\x3f\xb4\x02\x1c\xe2\x77\xee\x04\x68\xfe\xe8\xbe\x21\x8d\x39\xf6\x9d\xd4\x9d\x8d\x78\xcc\x5f\x17\x6c\x47\x46\x86\x3d\x74\x63\x77\x1b\xbc\xd9\xb8\x3f\xcd\xfd\x39\x4f\x86\xc1\x31\x35\x14\x7b\xf6\xd9\xff\x01\xfd\x6c\x23\xea\x58\x03\xa7\x7b\x9e\x50\x06\xbc\xed\x32\x21\xe7\x89\xbc\x3f\xe8\x63\xac\x40\x9c\xcb\xb6\x53\x55\x7d\xc3\xed\xf7\x0d\xb8\x4d\x6a\x3c\x06\x31\x1d\x4f\x13\x49\xce\x5e\x26\x74\x6f\xdc\x2c\xe6\x2c\x51\x94\xe9\x65\xd2\xa5\x38\x75\x6a\x68\xa5\xd1\xed\xad\x8b\x3c\xe9\x9d\xe5\x09\xeb\x45\x4b\xc1\x8a\xde\xda\xd8\xcd\x94\x4c\x54\xeb\x61\x1f\x4f\xe5\x00\x63\xd8\x93\x93\xa4\x31\x20\xca\xb2\xfc\xe2\x69\x95\x89\x74\x9d\xb1\xd7\x72\x9b\xfb\x98\x1c\x25\x37\xb0\x00\x89\xce\x2c\x7f\x08\xc7\x43\xb9\x9b\x51\xfe\x30\x71\x8d\x2b\x3e\xd2\xa3\x13\x42\x1a\x5b\x0b\xa0\x49\x13\x4c\x4e\x60\x92\x9a\x25\x04\x42\xf5\xfc\x65\xaf\x4d\x12\xd1\x57\x89\x32\x71\xdb\x8b\x36\x9b\xc8\x46\xbb\x04\x9c\x71\x92\x80\xa3\x47\xba\x44\x0c\x33\xc4\x9b\x49\x99\xbf\x9a\x98\x92\x4d\x48\xc9\xbd\x51\x8d\xbd\x24\x40\x37\x6f\xd7\xc4\xa8\x2c\xb2\xa6\xa0\x6f\x4e\xb8\x5f\xe3\xa9\xa7\x4b\x4b\x97\x68\x99\x0c\x06\x7b\xcb\xc4\x0d\x96\x28\x7f\x86\x96\x11\xc8\x96\xc9\x0a\x49\x2b\xf0\xde\x09\xeb\xe5\x3c\xbb\xec\x49\xf2\xc2\x8c\x36\xec\xe9\xf0\x50\x90\x5e\x74\x5d\xb0\xf3\x34\xaf\x4a\xa8\x22\xf2\x9e\xf2\xf9\xee\x45\xd0\x9f\xa4\x27\xfa\x78\xba\x4c\x74\xe8\xfd\xb7\x89\x89\x2c\xa4\x7e\x7f\x57\xe9\xf8\xdb\x92\xd6\xbb\x36\x60\x63\x8d\x4e\x33\x93\xf2\xe9\xca\x46\x3c\x9e\x64\x04\xb4\x50\x45\xdd\x38\x64\x77\xd1\x9d\x3d\x4c\xd1\x5d\xee\xb3\xbc\xb9\x2b\xec\x7d\x5a\x8a\x72\xaf\xaf\x2b\xfb\xfb\xa5\x22\x2e\x06\x36\xec\xb0\xe9\xe0\x22\x15\x2b\x9b\xa7\x9d\x71\xd1\xd2\xf3\xaf\x22\xc9\x11\x32\xae\xf7\x29\x19\xf6\x5e\x64\x92\x43\xed\xe9\x73\xea\xa5\xa2\x07\x86\xdd\x43\x87\x5b\xac\xc1\xf8\xd1\xde\x2c\xb9\x16\x1b\xe5\xa9\x7d\xcc\xb3\x65\xd2\x24\xea\x7b\x7b\x1b\x61\x50\x9b\xfc\xb0\xf1\x5d\x8d\x0c\x48\x45\x2a\x74\x22\xd5\xe8\x41\x8d\xed\x5d\xb7\x04\xcc\x66\x03\x48\xd5\x86\x6b\xf5\x6c\xc8\xae\x73\x39\x23\x45\x2b\x16\x9b\x36\x67\xe4\x79\xbe\xee\x53\x4a\x55\xd6\xc2\x2a\x99\x20\x43\xc9\xaa\xaf\x3a\xda\x11\x3c\xf4\xec\xa2\x97\x26\xe8\x2a\x64\x04\x33\x41\x97\x80\x80\x4f\x13\x4c\xae\x17\xf9\x4e\xf6\xf6\xb4\xa7\x82\x30\x03\x88\x21\x6f\xf4\x39\xba\x6d\xca\x4f\xdb\xbd\x75\x45\xc3\x3b\xfa\x92\x95\x9b\x9e\xe4\x1d\x10\x33\x53\xa6\x7d\x7a\xc8\x55\x70\xd8\x09\xdc\xa9\x60\xd1\x66\xb3\x37\x26\x81\xfe\xdd\x26\x5e\x81\x6c\x50\x4b\x8c\xdb\xc4\xd1\x4d\x93\x06\x11\x15\xf5\xa2\x49\x13\xd1\x12\xd4\x29\xa7\x84\xe0\xc5\x4d\x89\xf2\x5e\x9c\x70\x7b\xcd\xd4\x55\x66\x4e\x50\x4c\x78\x66\x6a\x88\x0d\x6c\xd3\xbd\x61\xc8\xc1\xe1\x5d\xcd\x17\xa9\xc6\x24\xf2\xda\xe6\xc1\x3b\x0e\x7f\xe9\x54\x0c\xc0\xef\xd8\x3b\xab\x03\x97\xa2\x6f\x8b\xfc\xa2\x64\x85\xce\x2e\xd2\x4b\x79\x9c\x55\x92\xe3\x69\xae\x62\xb1\x5b\xf2\xa6\x6e\x58\x61\x15\x92\x5b\xc5\x6e\x0c\x5f\xe5\x9e\xbe\x53\xd2\xc7\x78\x9a\x39\xc1\xa1\x9d\x6e\x2f\x12\xc4\xed\xf5\x23\x19\x26\xac\x15\xd8\x04\xd7\x9e\x5b\x87\xd2\x09\xeb\xe8\x7b\x11\x45\xa8\xb3\x5d\x2f\x2b\x8c\x87\x2d\x5b\x73\x84\x49\xee\x1a\xb4\x77\xec\xd5\xf4\x1e\xfc\x9a\xa3\x56\x6f\x7f\x56\xe4\x43\x8e\x37\x9b\x0f\x39\x26\x76\xa2\x0f\x72\x6b\x9c\x8b\x32\x4c\x32\xf9\xf8\xe9\x1e\xfe\xcc\x50\x84\x67\x51\xc0\x08\x5b\x9d\xdb\x35\xbb\x6c\x89\x49\x77\x03\x55\xe8\xf8\x1a\x4f\x22\x1d\xb9\xf5\xef\xe8\x0d\xa2\x17\xd6\x28\x27\x85\x2b\xcc\x6c\x61\xaf\xdd\x19\xc7\x42\xb1\x96\x6f\xe6\xd7\x0e\xb4\xcf\xbb\x04\x5d\xd5\x84\x07\x83\x11\xfa\x0e\x2c\x69\x85\x9a\x6a\x6d\x43\xc5\x02\xd7\x68\x44\x46\x84\xb5\xed\xe1\x1d\xf6\x68\x18\xc6\xca\x10\x33\xdc\x59\x7d\xf7\x78\xb7\x6f\x00\xf3\xe1\xe4\x38\xd1\xfe\x60\xa1\x40\xde\x96\x42\xc3\x5b\xca\x77\x90\x07\xce\xdc\x11\xa4\x84\xb5\x19\x2a\x98\x8d\xbd\x3d\xe4\xa7\xce\x9c\x83\x44\x8f\x41\x04\xfd\x26\x1c\xb1\xd3\x3e\xce\x79\x29\x8a\x0a\xd2\x00\x91\x4f\x7b\x17\xf2\x25\x37\xdd\xad\x59\x62\xf5\xb0\x49\xce\x40\x2f\xdc\x53\x96\xc7\xac\xd7\xff\xef\x67\xda\x58\xba\x99\x66\xbf\xd7\x64\x4a\xe8\xf1\xbc\xe8\x45\xbd\xbe\x37\xc1\x7e\xef\x8c\x89\x55\xee\x12\x08\xcb\x94\x33\x20\xb3\xf2\xa5\x24\xbd\x4a\x36\xfc\x54\x12\x94\x5b\x56\x28\x61\xd8\x7b\xb7\x9b\x90\x0c\x37\x0e\x71\xdd\x79\xe1\x3b\x7d\x5c\x17\x7d\xdf\x27\x25\x6e\x10\xd6\xc9\x0a\xe1\x2d\x09\x11\x3e\x2a\x8b\xbc\x25\x45\x65\x32\xba\x03\x65\x65\x1b\x36\x49\xdc\xcd\x0e\xe8\xf0\x64\x3b\x29\x4d\x27\xb8\x3f\xde\x42\xe7\xdc\x30\xb4\xb8\x4b\x05\x75\x22\x5a\xb1\x64\xf7\x96\xd9\x6a\x7f\x49\x6e\x75\x9a\x7d\x9c\xdc\xaa\x61\xe3\xde\x25\x9e\xb7\x98\xef\xdf\x2f\xf0\x4c\x18\x93\xfa\x77\x09\x61\x78\xf2\x1c\x62\x5f\x0e\xa3\xb2\x4c\x4f\x39\xf2\x7f\x5d\xd5\x40\x5c\x2a\x8d\xf3\xf1\xcd\x49\x53\xc2\x49\x4e\x4a\xa2\x5d\x9b\xd6\x61\x7d\xe5\x07\x57\x5b\x69\x49\x57\x6e\x42\x32\xbe\x8f\x19\xb8\xde\xeb\xf7\x9f\xe6\x46\xa0\xbb\x2d\x49\x41\x69\xbb\x4a\xc5\x2b\x11\x89\xaa\xa4\x3a\x93\x4f\x83\x9c\x02\x84\xef\x79\xca\x2e\x9c\x9f\x85\x32\xc8\x7b\x9d\xc6\x8e\x3e\xb4\xf4\x15\xa6\x5e\x92\x8b\xa6\x6d\xec\xa5\x5b\xd0\x46\x35\x2d\xd5\xf8\x2b\x45\x03\xc0\xca\x68\xb3\x0f\x5d\xe3\x8c\x1d\xfa\xbf\xb5\x6e\xd3\xa2\xdb\xd6\x43\x91\xc6\xef\xb4\x26\x0f\x98\x36\x95\x9a\xa3\x18\x5e\x7a\x60\xbf\xb6\xeb\x31\x1d\x35\x36\x0a\x7b\xe6\x53\x48\xb9\x14\x2e\xb6\x36\x05\xc4\x99\xd7\x2e\x55\xa7\x5c\x0e\xb2\x93\x90\xa4\x51\x13\x0b\x0e\xe8\xa2\xf3\xe0\xb4\xe1\x7d\x9a\xde\x68\x0c\x61\x57\x16\x50\xa7\x7e\x94\x22\x75\xcf\xce\xf7\xaf\xed\xd1\x60\xd0\xac\x5c\x69\x63\x61\x37\xf6\x46\x18\x96\xae\xcf\x8d\x3b\xf3\x0f\x28\xa3\x43\x2b\x68\x4f\xdf\x99\xaf\x3b\xe2\xf8\x56\x87\x04\x7a\x2e\x27\x5f\xbb\xbb\xc5\x3e\x3d\x4b\x78\x3b\x70\x9f\x46\xe4\xd6\x84\xa4\xa5\x48\x54\xe8\xa3\x4d\x67\x11\x95\x01\x41\xa1\x2a\x70\x0a\x1a\x4d\xf9\x7d\xa6\x22\x2c\xcd\xf9\xc2\xa1\xbd\xf8\x42\xe7\x40\x7b\x56\x9d\x9d\xb0\x62\xf8\xe2\xf9\xab\xc7\xaf\x1f\xbf\x7d\x78\xfc\xf8\xd9\xa3\xc7\xcf\x1e\xbf\xfe\x95\xe8\xe8\x41\x31\x15\xf3\x26\xe6\xb7\x61\x7b\xd0\x88\xa4\xc3\x1f\x31\x8a\xf1\x0c\x95\x54\x28\x55\x25\x11\x0e\xbd\xd7\xe7\xd0\xb1\x93\x6d\xcf\xed\x06\x82\xec\xea\x66\x18\x4f\x3a\x95\x63\xaf\x82\x71\x45\x2e\x07\x83\xb1\xe7\xa6\x28\xe6\xa3\x85\x13\x3c\xb7\x18\x5e\xce\xe4\xa7\x09\x1a\x91\x68\xf8\x03\x46\x39\x46\x68\x44\xb2\x21\xc7\x48\x90\x12\xe3\x1a\x2d\xc9\x39\x04\x11\x0f\xbc\x64\x68\x44\xaa\xe1\x7b\x8c\x70\xdb\x65\xb3\x1b\x5e\x1a\xa0\x6c\xca\x69\xdf\x7c\x74\x62\x1f\xcf\x42\x92\x6d\x56\x6b\x83\x75\xfd\x40\x68\xc6\x4e\x90\x78\xf8\xcc\xe1\xb5\x94\xe6\x91\x0a\x02\x9c\x94\xac\x69\xbc\xcd\x38\x29\xea\x1a\xad\x30\x58\x28\xe3\x90\xdc\xf6\x64\x3b\x75\xea\xa5\xaf\xf5\xfc\x68\x1d\x6c\x0f\x9c\xd0\x56\x91\xab\xed\xbd\x17\x95\x92\x16\x2b\x58\x4f\x52\x7a\xa5\x48\xb3\x4c\x19\x00\xac\x8a\x9c\xe7\x55\xd9\x4b\x1d\x0e\xab\xa7\x9f\x83\x61\xcf\x52\x69\x2e\x19\x98\x72\x90\xa8\xfd\x1f\x8f\x8c\xfb\x3f\x9a\x0e\xd4\x44\x5f\xaf\xc8\x73\xa1\xe9\xd4\x61\x1f\x4f\x39\xf5\xe2\x25\xf3\x78\xc6\x26\xbb\x5f\xb6\xe1\x96\xe4\xb1\xc8\xf5\x2d\x6b\xde\x23\xed\x04\xe7\x7f\x35\x41\x1e\x82\xf4\x53\x2b\x07\x69\x8d\x38\xb6\x52\x0d\xef\x75\xd6\xc9\xdd\x21\x42\xaa\x01\x81\xd3\x6c\xf8\xec\xcd\x93\x27\x44\x3e\x79\x9b\x0d\xb7\x09\xe2\x48\x8a\x49\x46\x23\x9b\x6e\x4a\x5b\xf4\x6b\x25\x0a\xc9\x69\x4b\x42\x9b\x24\x4d\xf2\xc2\xc1\xa0\x55\xb8\x4a\x2c\x90\xe5\x83\x41\x39\x18\x94\xc3\x80\x82\x4b\x65\xf8\x8b\xc2\x2c\x79\x31\x6c\x22\x32\xa2\xc8\x26\x77\xc2\xe4\x22\xf1\xb2\xa0\x91\x08\x13\x18\x20\xa8\x43\x43\x59\x43\x2c\x66\x79\x94\xd8\x33\x41\x11\x26\x51\x13\x6d\x2b\x0d\x68\xcd\x83\xe6\x16\x2e\xc1\x11\x10\x53\x36\x23\xbf\x64\x4b\x78\xe0\x7b\x69\x09\x4a\x61\x96\xf4\x0a\x16\x57\x45\x99\x9e\xb3\xec\xb2\xaf\xac\x8f\x03\x34\x8c\x8a\x23\x2d\x08\xa7\x4f\x91\x43\xf1\x34\x79\x57\xb8\xce\xbb\x22\x28\xef\xe4\x5d\x29\xa6\x42\xa9\xc4\xe4\xe6\x31\x1b\x3c\x16\xd9\x6c\x2b\x29\xbe\xe2\x43\x88\xa4\x69\x0c\x3a\xb9\xca\xb6\xa2\x8a\x0b\xc3\x96\x5c\xff\xe6\x58\x68\xec\x90\x7e\xbe\x99\xb9\x6b\x3c\x1a\x22\xd9\x9c\x38\x46\x62\x57\x04\x4e\xcd\xef\x4e\x9d\x3d\x69\xb2\xe4\xdb\x4c\xef\x87\xeb\xf5\x4b\xb6\x6c\xc5\xc4\xdd\x1d\xda\xd3\x74\x7c\x91\xb8\xfb\x4d\xa0\x5b\xd5\xf2\x51\x91\x9f\xe9\x8e\x1d\x2e\xdd\x03\xa7\xad\x0c\x5e\xb3\x28\xc4\x1c\x20\x56\x3a\x1d\xa0\xff\xda\xc4\xa8\xe1\x00\x49\xe0\x2e\x7f\x5b\x91\xf9\xc2\xea\x32\xb6\x11\xcb\x01\xf6\xcb\x09\x85\x0d\xfc\x7b\x13\xba\xf8\xf4\xf9\x56\x26\xd5\x00\x83\xda\xec\x8f\x64\xed\x76\x51\xd4\x6d\x22\x44\xcf\xe9\x1c\xd2\xf5\x83\xcd\xc2\x2e\x06\x4e\x4d\xcb\xc4\x4e\xfc\x6b\xb6\x07\x44\xb1\x72\xf2\x9f\x17\x29\xfc\x93\xc6\xf0\xcf\xcb\xea\xaf\xf2\x77\x17\x89\x1f\x07\xc6\xe4\xf7\x17\x78\xca\xbf\x39\x18\x0f\x06\x6c\x58\xae\x61\x6f\x39\x19\x2b\xd6\xed\xfb\x96\x72\xd0\xcb\x4e\x47\x9e\xee\x2c\x7d\x92\xd0\x2b\x3d\xad\x17\x91\x58\xbd\x28\xd8\x32\x7d\x3f\xe9\xdb\x94\xde\xf2\xe3\xab\x6a\x09\x1f\x87\xfc\x54\x7f\xed\xd7\xe4\xfd\x6d\xf8\xc5\xae\x32\x43\x7b\x34\x37\xca\x0c\xa5\x96\xa1\x7c\xb3\x79\x12\xf2\x64\x96\xd7\xe7\x3a\x5b\x02\x59\xe7\x90\xc3\x2d\x4b\x33\xcf\xc4\xc1\x2f\xb9\x46\x40\x58\xd0\x53\xa4\x36\x59\xa0\xfe\x7f\xf5\x31\xb9\x0b\x39\xb9\xe6\xa3\x05\x89\x68\xe1\x2a\xdc\x6d\xd6\x87\xc1\x00\x45\xb4\x9f\x28\xe7\xfd\x3e\x26\x1c\x7d\xfd\xd5\xdd\x2f\xbe\xc0\x28\xdd\x2e\xdf\x63\xf3\x68\x51\x6f\x2f\xfe\x4d\xc2\x01\x64\x28\xda\x25\x22\xb4\xfb\x18\xf0\x33\xf7\x6f\xae\xdc\x82\x6b\xd3\xd2\x77\x17\x5e\x50\x49\xb1\x12\x08\x3b\x26\xd7\xdf\x7f\x76\x6a\x7a\xe9\x6c\x43\x0a\xb6\x61\x76\x1b\x64\x6d\x77\x2f\xdc\x73\x1e\x76\x60\x6e\xbf\xd8\xdf\x56\x41\xc1\xdf\xae\x9d\x4c\xf7\xaf\xdf\x4b\xc8\x46\xf5\xf1\x26\x10\xf2\xe6\x0b\x75\xf3\x9f\x26\x1f\x1b\x28\xa4\xb9\xe6\xbf\x25\x8e\x99\xd9\xde\x76\xc2\x76\x99\xf2\xc4\xc9\x40\xc4\x49\xff\x53\x49\x97\x7e\xda\xa4\x68\x13\xa4\xff\x69\xbf\x91\xe5\x2b\x1b\x8b\x87\xc1\xc0\x07\x2a\x33\xca\xe3\x84\x1e\x26\xca\xc3\xbd\x1f\xe7\x05\xeb\x3b\xd9\x18\x3f\x54\x8e\x3a\xbb\xe2\xef\x78\x7e\xc1\xfb\x8e\xba\xfb\x6d\xa2\x43\x90\x9c\x66\x0b\xe7\xf3\x2a\xb1\x91\x49\x9a\x8f\x6f\x2a\xfb\x71\x81\xc9\xeb\xc4\x51\x56\x1d\x83\xb2\xea\x28\x8b\xca\x52\xfe\xad\xaa\xa5\x09\x39\xcd\xc8\x8b\x94\xa4\x31\x79\x59\xb9\x3d\xfd\x12\xdb\x2a\x8b\x60\x24\x15\xd6\x44\xd9\x99\x76\x3d\x53\x82\xbc\x35\xd8\xbb\x0a\x6b\xe0\xaa\x79\x39\xe4\x6b\x6e\x24\x27\x6c\x25\xac\xce\x84\x5e\x56\xcd\xfc\x5f\x9a\x65\xce\xe5\xe9\xfd\xc2\xc9\xb3\x6a\xe1\x4e\x5e\x38\x6b\x15\xce\x3e\x3d\xa8\x9a\x3a\xdf\xc7\x3b\x03\xc4\xf4\x5e\xc4\x75\x60\x83\x9f\x5c\xd3\xea\x59\xb0\xd5\x9f\xe1\x60\x34\xcc\xd5\x27\x31\xca\x36\x9b\x90\x63\xf4\x27\x10\xbf\x31\xfd\xc0\x06\x03\xfb\xa7\x8a\xe9\xc8\x94\xba\x89\xd5\xee\x6e\xfc\xc8\xd1\x9f\x95\x0a\xf4\xfa\x0b\x57\xf1\x5e\x0b\x6f\x73\x7e\x76\xe1\xed\xcd\xab\x07\xfd\x7a\x41\x9e\x07\x5e\x16\xdf\xf8\xc5\x7b\xc2\x3e\xe6\x22\x1f\x7b\xe6\x83\x67\x79\x42\xcf\x18\xba\x92\x6b\x9c\x30\x79\x55\x75\x41\xca\xff\xa0\x2f\x5d\x0d\xe9\xeb\x44\x5f\xe4\x9a\xdc\xfb\xf2\x5f\x5f\x77\xec\x88\xfa\x55\x29\x99\xce\x22\x8d\x45\x7f\xca\x87\x09\x12\xe4\xea\xe7\x2c\x70\x34\xeb\x9a\x3c\xfa\x23\xf0\xfd\xac\x26\xcf\x43\x0c\xfa\x3b\x56\x93\xa3\x87\x81\x82\x9f\x59\x4d\xfe\xac\x02\x05\x2b\x51\x93\x67\x8f\x03\x05\xaf\x58\x4d\x42\x0d\x7e\x60\x35\x89\x2f\x02\x05\x6f\x59\x4d\xca\xd3\x40\xc1\x07\x56\x93\xf7\xa3\x40\xc1\x1b\x39\xc4\x17\x81\x82\x4a\xd4\x84\x3f\x08\x14\x94\xa2\x26\xaf\x42\x05\x6f\x6b\x72\xb4\x0c\xad\xa2\x26\x3f\xbc\x09\x7c\x4f\x6a\x12\x85\x46\xfe\xa1\x26\x3f\xfc\x10\xf8\xfe\x63\x4d\x7e\x78\x12\xf8\xfe\x4b\x4d\x1e\x05\x3e\x7f\xcf\x6a\xf2\x9c\x07\x0a\x1e\xb3\x9a\x3c\xfd\x33\x50\xf0\x9e\xd5\xe4\xd7\x67\x21\x99\x8b\xa8\xc9\xc5\xdb\xd0\x65\x67\x35\x39\x0e\x7c\x7f\xc0\x6a\xf2\xe6\x97\xd0\x9a\x45\x4d\x7e\xfa\x57\xa0\x20\x13\x35\x79\x18\x5a\xf5\x2f\xac\x26\x3f\x86\x5a\x14\xa2\x26\xef\x42\x50\x73\x51\x93\xe3\x5f\x03\xdf\x5f\xcb\x9e\x8a\x40\x41\x2a\x8c\x9c\xba\x20\x29\xe5\x68\x3c\xfa\xf2\xde\xd7\x2a\xf9\xca\xbd\xaf\xbe\xf8\xea\x1e\x26\x19\xe5\xe8\xeb\xcf\x3f\x1f\xdd\xc5\x24\x97\x5f\xbf\xf8\xd7\x17\x5f\x61\x52\x52\x8e\xbe\xfa\x6a\x24\xbf\xc6\x14\xa1\xe2\x36\x44\x65\xc1\x78\xc2\x0a\x87\xa8\xd4\x31\xaf\x21\x8d\xb5\x71\x4d\x53\x4c\xae\xf7\x3c\xd6\xa6\xec\x75\x5e\xc5\x2b\xe6\xe1\x9f\x3a\x40\x8c\x96\x4c\x98\xb0\x79\xbb\x8c\x78\xcd\x74\x86\x4e\x7d\xd4\x9e\x58\x4b\x70\xe2\xd9\xf9\x1a\x09\xc5\x73\x33\xb1\xad\x7c\x63\x33\x75\x16\x68\xad\x96\xbc\xa3\xb1\xde\x13\xe6\x67\x3b\x29\xe5\xeb\x99\xbc\x12\x5b\x72\xa7\x42\x5b\x77\x69\xfd\x44\x37\xe9\x13\x27\xb0\x16\x0e\xe1\x65\x2f\xe6\x14\x62\x9b\x4d\x81\x51\x3a\xfc\xf5\xde\x97\x28\x1d\xfe\x54\xfe\x81\x89\xf9\xf1\xea\xdb\x3f\x25\xaa\x2e\x74\x27\x49\x5a\xd0\x74\x98\x7d\x77\x57\x63\xeb\xa2\xc6\xa4\xc0\xa4\x1b\x61\x8c\x88\xdb\x64\xd1\x33\xb7\xdb\x66\xc1\x13\xc6\x97\x4f\xfe\xb6\x62\x69\x47\xae\xc9\x71\x8d\xe2\xc6\x22\x2c\xb4\x46\x6b\x57\x2a\xd7\x87\x18\x4d\x87\xfc\x8b\x0f\x48\x60\x8c\x11\xdf\x6c\x04\xae\x89\xd8\xb2\x2a\x41\x96\x2c\x12\x55\xc1\x24\xc9\x33\xfc\xf3\xf9\x1f\x0b\xb0\x7e\x40\x98\x28\x33\xd1\x74\xf8\x3c\x7b\x81\xfa\xcf\x4e\xe1\xe1\x3c\x8c\x63\x56\x96\x79\xd1\xc7\x64\xd5\xc4\x9c\x03\xaa\xe3\xe1\x7b\x48\x0b\x74\x3a\x01\x81\xf8\x77\xeb\x18\x07\x64\x32\xeb\x1a\x93\xb3\x2a\x13\x29\x58\x36\xae\xff\xf3\x5b\x69\xae\xd5\x45\x91\x0a\x45\x0b\xdc\x0c\xdc\xe2\x15\x8b\xdf\x39\xd0\xc6\x6b\x54\xfd\x73\x47\x62\x24\x9f\x92\xb6\xe9\xa7\x2a\x22\x67\x5f\x96\xf5\x89\x9a\xc9\x49\xfe\xbe\x4f\xfa\xcb\xbc\x38\x3b\xca\xb9\x28\x72\x08\x73\xdd\x27\xfd\xfe\x82\xdc\xb0\xc1\xf5\x95\x21\xca\x1b\x53\x15\x17\x64\x95\x97\xe2\x5b\x15\xc6\xb3\x6c\x61\xa0\xf1\x80\x0d\x06\xe9\xf0\x59\xf2\x03\xd2\xe9\xe2\x42\x41\x40\x7b\xc2\x5e\x7e\xc4\x86\x22\x2a\x4e\x99\x18\xea\x6d\xc5\x35\x46\xfd\x93\xac\x2a\xbc\x38\x29\x4e\x3b\x8d\x71\x40\xad\xe7\x01\xec\xf1\xb7\x1c\xcd\x57\x0b\x79\x89\x5d\xd8\x5d\x7e\x0c\x70\x9e\x79\xc0\x79\xea\x82\x3f\x48\xd3\xca\x54\xd6\x07\x7b\xba\xa7\x2a\x58\xde\xd9\x0e\xb9\xc4\x0d\xd2\xf1\x93\x54\xe7\x24\x0a\xa4\xc6\xcc\xdc\xd4\x98\x84\x91\x02\x63\x2d\xd7\x57\xd3\x90\x33\xa0\x29\xc9\xec\x47\x08\xfd\xa2\xd5\x43\x59\xa7\xea\x60\x80\xba\x1f\x9d\x5c\x68\x66\xfa\xa0\x2e\xfa\x13\x23\x3c\xb3\x7f\x0d\x4f\x99\x78\x53\xb2\xe2\xf0\x94\x71\x81\xf0\xa4\x6f\xb8\xf1\x3b\x11\x4f\x0a\xc9\x90\xa3\xdf\x93\x7d\x7c\x67\x28\x58\x09\xee\x6d\xf9\x93\xfc\x82\x15\x47\x51\x09\x79\x92\x10\xc6\x24\xfb\x1b\x6e\xe0\xb9\xaa\xaa\x16\xc8\x66\xfd\xfe\xc4\x11\xba\x1c\x2b\xc1\xae\x0e\x5e\xdb\xed\xce\xe8\x78\x5a\x1b\xb0\xd9\x04\x3f\x5b\xff\x48\xbb\xb5\x26\xf9\x46\x03\xc1\xce\xd8\x4e\xeb\x70\x5a\x0f\x9b\x64\xad\x39\xa9\x51\xb0\xf9\xce\xe4\x1d\xde\x39\x6f\x99\x77\x77\x92\x0a\x57\xc5\xb7\x67\x5d\xb6\x3e\x91\xfa\xc7\xa9\x2f\x98\x68\x23\x31\x16\x46\x62\x01\x94\x45\xee\x75\xb1\x8f\xc4\x4c\x82\xbd\x17\x51\xc1\xa2\xeb\x11\x5d\x0b\xad\xdd\xae\xc3\x76\x67\x0e\xda\xbb\x41\x47\x2e\x92\x24\xf3\x3e\x7c\x31\x81\x35\x9d\xfe\x6f\x8c\x3f\xd3\x6d\xe1\x97\x7b\x62\xe8\x02\x79\x83\x42\x01\x5c\x6e\x83\x40\x51\xdf\x01\x9b\x52\x01\x6c\xa8\x51\x07\xae\x3b\x8d\x99\x04\xd7\xed\xb2\xc2\x06\xa8\xbb\xb3\x0d\x60\xf1\xa5\x8b\xc5\x7d\x09\xd6\x51\x4b\xb0\x44\x29\xdb\x6c\x46\x10\x43\x5b\x0b\xd9\x6d\xd5\xc3\x56\xd5\x3d\xca\x02\x1a\x78\xdb\x4e\x62\xbd\x57\x1d\x42\x27\x4d\x22\x09\xb8\x7d\x4c\xde\xfa\x65\x20\xec\xf4\x2a\xbc\xa3\x77\xfe\x07\xcd\xe8\xf0\x6a\x4c\xee\x7e\xf1\x79\xfd\x09\xd6\x3f\xbe\xfc\xbc\xfe\x6f\x3c\x8f\x0e\x3e\x1c\x1e\xfc\x36\x3a\xf8\x7a\xef\xbf\x3e\xf9\xff\x0d\x3e\xfd\x6c\xff\x0e\x9d\xfd\xcf\xf1\xff\xb9\xda\xd4\xff\x3e\x58\xec\xa3\xd9\xe4\xf7\xe1\x35\x75\xf0\x67\xff\xdd\xd4\x58\xa0\xd9\xa4\xf9\x75\xb0\xb8\x1a\x91\x2f\xc7\xb5\x53\x8e\x67\xad\x3e\x6f\xd0\x02\x7f\xf6\xc9\x1d\x72\x71\xbb\x30\xb9\x20\xd1\xd3\x88\xfc\x2c\x0d\xfa\x03\x1a\x58\xa0\x7e\x20\xb8\x74\x89\x8e\x10\xd3\x70\xb0\xd9\x1c\x49\x8a\xc8\x39\x2e\x63\xb5\x12\x15\x25\x7b\x94\xe5\x91\xb0\x75\x35\x02\xdb\x4b\xcb\x67\xd1\x33\xc4\xf1\x60\xc0\xef\x8b\xd9\xd5\x59\xca\x27\xf0\x1f\x41\xa2\x58\x54\x51\x36\xd1\x0d\xea\x5a\xf9\x42\xa8\xe7\xd7\xc9\xcb\xb2\x33\x63\xd6\x3f\x38\xdb\x6f\xe4\x6c\xa3\xf7\x13\xf8\xcf\x0d\x67\x6b\x7c\x7a\x77\x4c\xf9\x89\x9f\x70\x56\xd5\x7f\x5d\x84\x9f\x55\x3d\x2b\x75\x75\xa0\x58\x45\xc8\xb8\x32\x0d\x27\xae\xf7\x39\x3b\x8b\xd2\x6c\xc7\xd0\x47\x08\x09\xca\xb0\xdd\x9e\x77\x8a\x04\x30\xb7\x5c\x77\x0d\xbd\xc8\x7e\xdb\x27\x91\xf2\x27\x3a\x11\xd9\x8d\xcf\xc3\x0e\xdc\x9c\xc9\xde\xa1\xfd\xa1\x06\xd4\xbf\xf4\x0d\xd7\x30\xa2\x33\xc5\xd9\x75\xaa\x91\xed\x31\xe8\x9f\x7e\xd3\xed\x10\x74\xed\xbc\xdf\xbb\x87\xb2\x8e\x84\x60\xe1\x08\xd1\x01\x9f\x25\xf3\x4e\xcf\x50\xbf\x54\xf9\x73\x1d\x83\x1a\xc4\xa9\x7c\x63\xfe\xa7\x0f\xc1\x13\xe2\x55\x54\x1c\x0a\x34\x82\xac\xb1\xfb\xb4\xff\x3f\x7d\x4c\xf8\x3e\x65\xa4\xff\x89\x57\x81\x59\x6b\x23\x53\xf3\x93\x3e\xd6\x16\x52\x2f\xd9\xe9\xc3\xf7\x6b\xc4\x31\x9e\x20\x4e\x99\x93\x85\x97\xc8\xb3\xdd\x7e\x1b\x3a\xf7\xa0\x30\x20\xd5\xb0\x45\x00\x0e\x85\x01\x04\xbd\x0f\xcd\x21\xbc\xd0\x1f\xb8\x3e\x05\xe3\x51\x52\xd7\x78\xf2\x9b\x31\x36\xa8\xdd\xad\x94\x1d\x59\xf4\xbb\x63\x43\x3d\xa7\x5e\xf5\x16\xed\xca\x83\xfc\xcc\x1d\x43\x57\x07\x54\xbf\xa3\xcd\x23\x2f\xa2\xb7\x45\x99\x4f\x82\x60\x3a\xf3\x2e\xd8\xc4\xcf\x22\xf4\x7e\x4b\xe6\x7e\x63\x76\x6b\x2f\xd4\x60\x20\x3c\x00\xfd\x86\x01\x46\xd9\x02\xdb\xcc\x87\x6d\x11\x84\x6d\x27\x31\x46\x7b\xfb\x6c\xc9\xc3\xee\x93\xea\x64\xa0\x68\x14\x22\xc0\x5b\xfd\xf4\xdd\xaf\x18\x31\x60\x1f\xb2\xe1\x03\xf9\xe7\x84\xb9\x96\x72\x47\x7f\x3e\xc7\x60\x18\xe1\x24\xa5\x68\xba\xb8\xaa\x1b\x3a\x35\xa4\xcd\x17\x3a\xfb\x23\x9b\x5d\x63\x6c\x2c\x30\x61\x78\x22\x74\x34\x7f\x5d\x0c\x6e\xd3\x02\xdb\x14\x26\x12\x2a\x9d\x79\x3c\xf7\x13\x73\xfb\xc1\x31\x3a\x66\x0a\xb6\xd9\x0b\xcf\xcc\x20\x1c\x51\x23\x70\xc3\xf7\x00\x36\x24\x24\x33\x09\xe2\x33\x3f\x21\xa6\xed\xcf\xd4\x41\x02\xc2\xea\xd8\x51\x9f\xe9\x0b\xb9\xc7\x3a\x17\x51\x50\x66\xa2\x60\x3c\xb4\x74\xff\xa8\x31\x16\x54\x0b\x0f\x4c\xf2\x35\x52\x5b\xe0\x3a\x1c\xbe\xec\x1e\xfe\xec\x19\x7a\x01\xb1\x21\x7d\x30\x79\xf4\x77\xce\x48\x3d\xac\xcf\x4d\x6a\xd9\x35\x7a\x8c\x1b\x28\xca\x25\x60\x71\xac\xac\x17\xd1\x88\x94\xc3\x37\x18\xbd\xf6\xa6\xfd\x20\x30\xed\x47\xc1\x69\xff\xe1\x9d\xba\xc9\xcd\x32\x9b\x8b\xc5\xc4\x37\x78\x67\x78\x36\x5f\x18\x4d\xe8\x39\x62\x98\xcc\xc5\x02\x4f\x20\x49\x59\xd3\xdd\x77\x1e\x34\x1c\x17\xd1\x45\x43\x2e\x36\xb5\x3e\x74\x6a\xb5\x28\xcb\xa6\xea\xb7\xde\xa3\xd0\x99\x12\x9b\xcc\xd9\x62\x32\x77\x66\xf0\x66\x87\xd1\xbe\x6c\x30\xd4\xbe\x6d\xf2\x2a\x4c\x18\xa5\xd4\xb9\x02\x7f\xba\x06\x21\xdf\x3a\x31\xf1\xe5\x2c\x82\x37\xf2\x0d\xc8\x38\x36\x1b\x6e\x95\x97\x92\xe1\xb4\x1d\xfe\xec\x4d\x46\xf6\xd8\x09\xd0\x62\x8b\xf7\xd4\xcc\x6b\x65\x69\xf2\xeb\xc7\x07\xcf\xf0\x36\xdd\x31\xc8\xef\xec\xb2\x6b\x5d\xaf\x4d\x8d\x8e\x9c\x80\x65\x01\x71\xbc\x96\x42\xec\x30\xfe\x89\x15\xdb\x37\x73\x7f\x28\xd4\xeb\xa7\x9b\x84\x8b\xfd\x51\x3d\xa5\x49\x2b\x71\x25\xff\xc8\xbe\x74\x43\xbf\x37\x1d\x6d\xe5\xf6\xbd\xe9\x86\x7e\x6f\x8d\x98\xfe\xb6\xdd\x99\x96\x7e\x7f\xca\x79\xf7\x23\xba\xd3\x0d\x5b\xbd\x15\x85\xe4\xe2\x6e\xdf\x19\xb4\x6b\xed\x5b\x01\x22\xc6\x8f\x00\x0e\xd3\xb2\xbd\x73\xa0\xf2\xb9\xfd\xb6\x15\xe2\xb2\x95\x95\xd8\x28\x74\x6e\xdb\x97\x6e\xe8\xf7\x56\x82\x89\xf4\xed\x3b\x53\xed\xfc\xbe\x2a\xfe\xd1\x73\xb3\x4d\x43\xb3\xd3\xc6\xa5\x1f\x3b\x49\xdd\xbc\x73\x5f\x2b\xf6\xd1\x1d\xbb\xad\x5b\x70\x13\x6d\x4f\xc5\xec\x55\x3c\x2e\x99\x70\x44\x0f\x5b\xe5\x84\x3e\xf6\x63\x9b\x8d\x45\x72\x9a\xb2\x4d\x6c\xf1\x23\x4e\x5f\xa2\x40\x2b\xec\x0d\xda\x16\x7a\xec\x1a\xb9\x8d\x60\x43\xc3\xfb\x75\x1e\x71\xfa\x00\x6d\x6b\x8f\x7d\x74\x19\x5d\xeb\x6d\x18\x58\x62\x2b\xc4\x4f\xe4\x8d\x70\xb3\xde\xda\x33\x6e\x75\x79\xdc\xa8\x3f\xaf\xf5\xaa\xec\x3e\x34\x1d\xbf\xca\x63\x15\x38\xfc\x79\xa7\xe6\x56\xc1\x72\xa0\xd3\x1b\xba\x29\x86\xdf\xbd\x46\x9c\x50\xb2\xed\x06\xc4\x1a\xb6\xb5\xd4\xd9\x40\xba\xca\xb5\xe8\x2c\x67\x15\x95\x60\x67\x16\x56\x5f\xeb\xa7\x7f\x6f\x47\x8f\xa6\x83\x4e\x06\xf4\x6b\xbb\xdd\x71\x21\x4d\x73\x27\xef\xea\x5f\x8f\x58\xd4\x11\x82\x9b\x50\x60\x9f\xfc\xdf\xd3\x74\x2e\xf3\xe2\xec\x41\x5a\xb0\x58\xa4\xe7\x5b\x1f\xa7\x5b\x62\x24\xa5\x54\xf8\xf5\x3f\xaf\x93\xfe\xe1\x36\x9b\x06\xfb\x1c\x50\xad\x31\xba\x65\xf7\xf0\xf0\x58\x45\xa5\x50\xfe\x5e\x2a\xfe\x84\xf9\xfb\xdc\xd5\x7f\xeb\x8f\xbe\x8e\xfe\x57\x4c\x7e\xba\x79\x88\x95\x38\xa1\x22\x40\x60\xa6\x41\xfc\xaa\x65\x21\xa4\xd0\xcb\xe9\x97\xd5\xc9\x59\x2a\x04\xc4\xbb\xa5\x6c\x66\x83\x88\x50\x64\x52\x8c\xc7\x09\xde\x6c\xac\xbd\xac\x13\x5c\xc4\x36\xc5\x13\xa7\x99\x5a\x12\xe4\x10\x0f\x76\xc0\x4d\x07\xdc\x5c\x21\xb7\xb4\x30\xa5\xc5\x9c\x2d\x9c\x88\xc4\x3f\xfe\x15\x05\x69\x10\xec\x1d\x9d\x68\xcb\x44\xe2\xa7\x8f\xd5\x71\xfd\x40\xee\xde\x42\x93\xb5\x5d\x1d\x15\x54\x07\xb5\x35\x4d\x4a\x13\xf4\x36\x2a\xca\xc9\xf8\xf3\x5d\x5a\xa1\xbb\x4a\x2b\xc4\xde\xfd\x81\xfa\xfc\xf4\xc0\x21\x95\xc4\x30\x2d\x91\x43\x3b\x61\x0c\x35\x5a\xe5\xad\xd2\x86\x3c\x55\xc5\xf6\xb7\x2e\xd7\xe4\xa6\x2a\x54\x3f\x74\x89\x66\x2e\x54\x89\xfa\xa1\x4b\x2c\xe3\xa1\xca\xcc\x4f\x33\xa2\x61\x24\xf4\x80\xfa\x27\x6e\xe9\x7e\x1c\x85\x0f\xf9\xe5\xff\x05\x70\xf9\x84\x8c\x47\xb7\x87\x97\xef\x8a\xbc\x5a\xb7\xa0\x45\x7e\x07\xbe\x3c\x0c\x45\xd0\xa4\x55\xdd\xfb\x06\xf1\xbf\xc8\x3d\xd9\xe0\x59\xfe\x08\x7e\x38\x7d\xd8\x0f\x2e\xc8\x7d\xf9\xff\x4d\x90\x83\xd2\x06\x67\xea\xf2\xe6\xc3\x0e\xa0\x6c\x60\x8c\x31\x97\xb6\x70\x65\x41\x62\x28\xdf\x4c\x4c\x00\xf9\xd9\xfa\x42\xd7\x4f\xd5\xbf\x44\xf8\x6f\xc8\xb0\xb1\x80\xb0\x72\xe2\x56\x82\xe6\x76\x8b\xb6\x99\x1d\x72\x1f\x5b\x66\x23\xa5\x42\x9f\x94\x93\xe6\x8b\x36\xba\x53\x51\xbb\xf5\xb7\x07\x72\xc7\xe5\x27\x63\xb4\x03\x4a\x21\x15\x2c\xf6\x39\x1f\x0c\x32\x66\xc4\x31\x6a\xfa\xfe\xd4\x94\x88\xc8\xf9\xc6\xbb\xd3\x75\x17\x88\x09\x07\xf1\x75\xca\x2e\xc0\x3b\x94\x65\x6f\x60\x24\x9d\x62\xa8\xb3\x32\xb8\xbd\x5d\xc2\xba\x15\x93\xbc\xf1\xac\x74\x1a\x6e\x99\xf1\xf6\xcd\x34\xca\x71\xbf\x6f\xbd\x4d\xc6\xd8\x51\x6e\x14\x68\xd8\x5b\xdb\xd4\xde\x64\xbb\x71\x44\xc3\x97\x52\xc5\xb8\x0d\xce\xa2\xe2\xdd\x61\xe9\xda\x34\x85\xe6\x9b\x2e\x51\x7b\xca\x6d\x53\xc9\xee\x31\x74\x97\xd9\x6e\xd3\xd9\x70\x53\xfa\xd1\x1b\xdf\xe9\xa0\xc6\xb5\x5a\x51\x73\x17\x38\x0b\x82\x0d\xbe\xaa\xa7\xad\x09\x0f\x06\x9d\x65\x87\x81\xe3\xba\xd3\xe4\x18\x93\x48\x1f\x05\x83\x5e\xb7\x32\x56\x08\x43\x34\xfb\x66\x98\x3c\xcb\x54\x78\xb6\xf6\x3d\x83\xe4\x59\xcd\xb2\x0a\xbd\xac\xb0\xb6\xc2\xdd\x65\xcb\x3d\x1a\x28\xd9\x51\x08\x21\xa8\x9a\x41\x52\x6f\xef\xbe\x43\x0c\x4f\x75\xae\x7f\x31\xb4\x6c\xf1\x8c\x0d\x3d\xf9\x00\xfa\x03\x71\xe2\x94\x63\x3c\x09\xb8\xe8\x03\x38\xfa\xed\xe6\x7c\x61\x52\xca\x7d\xf0\x86\xf2\x19\x67\x35\x5e\x8b\x5d\x47\x7f\xa0\x82\xb4\x6b\x86\x47\x2e\xf4\xc8\xed\x1e\xe6\xc5\xa2\xe3\x61\xee\x88\xca\xd5\x35\x52\xb6\xa8\x5c\x71\xf9\xa9\xb8\x44\xb8\x9e\x16\x4c\x9e\xb0\x27\xc6\x20\x29\x26\xf6\x73\x6b\x20\x92\x3a\x3b\x1c\x79\x3b\xbc\x37\x9e\xa6\x4b\xa4\xd7\xad\x74\x1a\xdd\xfd\x36\xe1\xb7\xe0\x38\xd2\x25\xf2\xe5\xec\x05\x1e\x0c\x8a\x26\xaa\x95\xce\x0a\x55\xec\x0a\x4e\xee\x77\x5f\xe3\x69\xaa\xdb\xef\x51\x5a\xd8\x30\x0f\x88\x2b\x24\xee\x9f\x59\x8a\x71\x5d\xbb\xd3\x6c\x9d\x80\x0e\x06\xf7\x21\x38\xd7\x08\x0f\x06\x51\x6b\xae\x19\x8d\xae\x9d\xab\x3f\x06\x44\xb0\xb3\x13\x8e\x42\x13\x6e\x1f\x75\x26\x67\xad\xe2\xac\xf9\x18\xc1\x38\x08\x04\x4e\x34\xdf\x71\xa2\xb9\xa7\x79\xc8\xec\xd5\xf4\x1e\xbc\x06\xff\xc2\x4f\xb8\xf9\x6a\x33\xe1\x19\xf6\x9e\x50\x72\xc5\xce\x52\xb0\xf5\xcc\x5e\xe7\x6f\x53\x76\xa1\xae\xe7\x04\x02\x22\x06\xdf\x32\xbf\x3d\x0e\xbc\xc0\x63\x27\x2f\x91\x4f\x1f\x38\xe9\x7f\x98\x7d\x01\x54\xda\xa4\xe7\x17\xbc\x31\x84\x3c\x03\x0e\xc3\xe8\xdf\xf7\xc6\x53\xe3\xbe\x0b\x05\xc6\xf0\x64\x8f\x0f\xd3\xf2\x51\x5a\x94\xda\xd3\x1e\xe1\xcd\x66\x4f\xeb\x41\xd3\x12\x09\xc2\x4d\x46\x14\x35\x55\x27\x59\x50\xb3\x71\x72\x83\x5f\x98\xe8\xeb\xc0\xc3\xa8\x84\x2c\x21\x64\x67\xf4\x7c\x9a\x3b\x9c\x9a\xd7\x0f\xa2\x94\x34\xaf\x9f\xe8\x3c\x97\x92\xf8\xe9\xec\xa4\x68\xef\x64\xbb\x1d\x85\x90\x32\xcd\xac\x2b\xe6\x0b\x7e\x66\xa8\x1d\xae\x6a\xcb\xbc\xbd\xe0\x6e\x94\xd2\xb3\x19\xa7\x41\x85\xbf\xde\xbc\x53\x30\x4a\x15\xb9\xc4\x63\xcf\x97\xc8\x8f\x0d\x47\x29\xad\x40\x9b\x5b\x50\x36\x49\x29\xab\x31\x49\x37\x9b\x62\xb3\xd1\x22\x43\x25\x69\x9a\xea\x08\x24\x24\x6d\xe6\x9f\xb0\x5b\xfb\x62\xaf\x18\xed\xbf\x3d\x7c\xf2\xf8\x41\x9f\xac\x19\xed\x3f\x7e\xa6\x7f\x2c\x19\xed\xbf\x78\xf8\xec\xc1\xe3\x67\xdf\xf5\xc9\x39\xa3\xfd\x07\x8f\x5f\x1d\x7e\xfb\xe4\xe1\x83\x7e\x43\xcb\x82\x75\xa8\x91\xcf\x1c\x31\xa5\x18\xb4\xd8\xa7\x9c\xd8\xc8\xe8\xb6\xc5\xa5\xd3\xa2\xab\x55\x7c\x09\x8a\xfe\x76\x9b\x33\xef\x50\xe4\x38\x10\x35\xcc\xc7\x1c\xa1\xc1\x4e\x76\x0e\xf6\x20\x38\xd8\x11\x0b\x99\xfe\xed\xb5\x5b\x0f\x06\xfd\x1c\x4e\xd2\xb1\xab\x81\xed\x3c\xbc\x95\x53\xb9\xbe\x95\x0a\x24\x7d\x4c\xd4\xd8\xe7\xe6\x1d\x4a\xc2\x43\x74\x26\xdf\x8b\x23\x73\x82\x2f\x86\x51\xb2\x61\xc2\x84\xa1\x41\x9b\x8e\x7d\xa2\xcb\x53\x72\x3a\xe2\x77\xb1\x5d\xf5\xc9\x77\x28\x05\x2e\x59\x50\x2b\x70\x9d\x1c\xff\x84\xed\x10\xe4\x07\x75\xa9\x1f\x29\xd2\xaf\x49\xc9\xc4\xb5\xaa\x8f\xed\xeb\x63\x7f\xab\x36\x60\xc7\x6c\xda\x9b\x7e\xcd\x06\x32\x47\x06\x5b\xb0\xeb\xa2\x4c\xa8\x3a\xb7\x50\x28\x2b\xed\x16\xa5\x74\xc5\x6e\xa5\x3c\xb6\xed\xd6\xec\x56\x6a\x62\xd3\x6e\xc9\x6e\xa7\x0f\xb6\xe3\x9d\xb3\x5b\x29\x7e\x55\xbb\x3d\xaf\xdd\x2e\x35\xea\x9e\x77\xdb\x6e\xac\x95\xdc\x73\xef\x64\xd3\x4a\x3f\x71\xbb\xcf\xcc\xd4\x9a\xf9\x3f\x55\x74\x24\x75\xa0\x33\xe7\x6f\xfb\x70\x4e\x0c\x93\xee\xba\xcd\x7d\x84\x36\x70\xf7\xa5\x77\xb4\x36\x7f\x55\xef\x77\x03\x5c\xe1\x8c\x16\x25\xc9\x0d\x06\xf2\x89\x5e\xb0\x55\x09\x60\x29\xaf\xd7\x9b\xae\x21\x40\x9e\x7a\xfd\xb7\xd1\x99\x6b\x72\x7b\x96\x9f\xb3\x5b\xcf\xfe\xe7\x6b\x67\xaf\x3a\xfe\x0b\x0b\xf8\xf9\x66\x0b\x58\x45\xe5\x4d\x4c\x2a\xdf\x84\x9e\x04\xe2\xeb\xf9\x0e\x5b\xd8\xf4\x26\x9d\xb5\xa9\x78\xd7\x12\x33\x63\x51\xb1\x63\xed\x7a\xe9\xf6\x1d\xa1\xbe\xd9\xa7\x6c\x7d\xdd\xf6\x99\x58\x48\xfe\x03\xee\xf5\xe3\x49\x6b\xb6\x86\xe2\xfa\xc8\x6c\x13\x57\xf5\xd4\x7f\xe1\x47\x1e\x51\x00\xa9\x58\x73\x9e\x5d\xbe\x62\xd9\x52\xab\x45\x75\x51\x4b\x8a\xe4\x6c\x1b\x14\x64\xd9\xae\x39\x43\x47\x7e\x07\x57\x66\x18\x48\x56\xa1\x67\xa1\x09\xe6\xa3\x55\x9a\x25\xe1\xb0\x4a\xed\xc1\x90\x1b\x08\x46\x8d\xf0\xa6\xc1\xa7\xff\xf0\xe6\xb5\xd2\xf5\xbd\x6e\x7f\xdf\xba\x1c\xc3\x13\xda\xa9\xb6\xb6\xc3\x6e\xc8\xf5\xc7\xa2\x71\xfa\xb6\x73\x51\x6c\xe7\x3f\xb5\x13\x0d\xe5\x38\xbe\x25\x1c\x29\x6e\xb8\x33\xdb\x17\x56\x86\xff\x4f\x4f\xb8\x95\xcc\x51\x4b\xa7\x6f\x7c\x72\x66\xa2\x7f\xf9\xe0\x6c\x47\xdd\xbd\x30\x24\xcf\x3f\xb3\x15\x9a\xea\x59\x32\xb2\xa7\x72\x05\xb3\xb3\x54\x80\xb7\xa9\x9e\xa8\x67\x9c\xa4\x12\xfd\x3a\xdf\x6f\xbe\x50\x6f\x35\xee\x32\x35\x71\xf6\xf7\x2f\x90\x18\xa5\xb4\x9a\xc1\xd3\xa8\x78\xc7\x12\x0d\x71\x76\x96\xd8\xdb\x86\x73\xfd\x76\x29\x53\x3b\x37\x49\x6c\x18\x14\x40\xc0\xaf\x17\x80\xae\x8f\x44\xed\x43\x49\x03\x26\x8e\x7c\x11\xe1\xc0\x41\x20\xf3\xe2\x58\x6b\x2e\xe7\x20\xb4\x0e\xe7\x26\x87\xe5\x8f\x77\xc8\x63\x56\xc2\x9b\x7d\x83\x99\x97\xef\xd2\xb5\x01\xd2\xa3\x15\x8b\xdf\x4d\x44\x8d\xf1\x16\xc6\x70\xb7\x1d\xd0\xde\xc8\xc5\xd6\x8a\xc4\xfe\x5f\x71\xfa\x2b\x76\xfd\x61\xab\xe9\x7e\xfc\x59\x6f\x11\x25\xbb\xb5\x89\x3d\xf9\x89\x03\x05\xf5\xff\x92\xc3\x1b\x7b\xa9\x19\x5a\x93\xd9\x4e\xad\x07\x11\x04\xf2\x30\xc4\x96\xad\x01\x81\x66\x67\x05\xc6\x89\x7a\x0b\x1a\xf5\xf1\x52\xfb\x79\xc4\x1e\xc7\xf1\x42\x73\xbd\xbb\xa7\xee\xb0\xc9\xe1\x89\xfe\x53\x18\xfa\xb8\x64\x42\x67\x4d\x51\x81\x82\x51\x18\x6d\x28\xc4\xa5\x18\x56\xbb\xb5\x71\xc4\x63\x96\x99\x40\x04\x6e\xac\x49\xdb\x42\xa1\x3a\x4d\x19\x57\x8d\x56\x08\x79\x38\xa5\xc9\x4a\x1b\x57\x59\x24\x98\x9d\x0a\x6a\x33\xf9\xfa\x64\xec\x97\x25\x33\x7e\xec\xb2\x7b\x9f\x34\x46\x0e\x80\xe3\xff\x04\xe6\xbb\xfe\x9d\xda\x0a\x85\x6d\xa0\x7f\x5d\x30\xf6\x8f\x9d\x7d\x83\x02\xf6\x46\x06\x0e\xb6\x62\xa5\xc6\x01\xba\x3b\x33\xe5\x1b\xf1\x57\x51\x8f\x67\x99\xeb\x01\xe3\x36\x32\xdf\x83\x9a\x28\xcb\x8c\x24\xdf\xe0\x1a\x84\x67\xe7\x6c\xe2\x88\x84\x3c\xd8\xbb\x26\x39\x6b\xa3\x7f\xf4\x7f\xaa\x38\xb7\x93\x96\x99\x6c\x1b\xe8\x76\x47\xc7\xb4\x91\x8d\xdb\xda\xac\x16\xb9\x74\x03\x81\xec\x48\x2b\x49\x1e\x87\x3a\x54\x73\x35\xf9\x42\xdc\xb2\x34\xe7\x5e\x9a\x05\x1e\x8a\xef\x07\x86\x0f\xd7\xca\x83\x25\x83\x0e\x06\xa7\x25\xe2\xc4\x01\x2a\xa6\x72\xa5\x37\xd1\x20\xb6\xa2\x89\xed\x29\x52\xb7\xcf\xd8\x62\x9f\x1d\x75\x5a\xf1\xf7\x6f\x22\xde\xf6\x90\xf6\x43\xed\x44\xb1\xed\x28\x3f\x32\x05\x92\x41\xba\x1a\x2b\x32\x0f\xd3\x1a\x18\xd6\x3b\x0a\xd8\x4a\x38\x08\xcc\xb5\x12\xbe\x91\xdf\x6d\x93\x86\x59\xe5\x62\xdb\x6c\x3a\xfa\xa3\xcd\x06\x09\x2a\x4c\xcc\xd2\x61\x1f\x63\xd2\xae\xa2\x13\xae\xeb\x85\x06\x5d\x64\x1b\x93\xd9\xe0\xe3\x4e\x0b\x37\xa4\xfb\x5b\x36\x2b\x8c\x42\xad\x6c\x2b\x02\x19\x76\x0a\xe7\x6c\x01\x97\x6d\xe2\xb5\x7f\xc7\x06\x83\x62\x18\x39\x89\x6e\x31\x29\x6a\x6b\x0f\x77\x33\x53\x6a\x9d\x84\x4f\x5d\xf0\x53\x26\x90\xc0\x20\xae\x34\x2b\xe1\x83\x01\xd7\xa7\x34\x33\x7f\x98\xe9\x7c\x8c\x11\xb8\x67\x99\xdd\x48\xc3\xf2\xbc\x2b\x0e\x6f\xf2\x3f\xc0\x84\x98\x79\x3a\xa6\x98\xd1\xe6\x87\xa1\x98\xda\xcf\x86\x0f\x44\xdb\x25\x6b\xbb\x5f\x5d\xf6\x51\xdc\x59\x88\x26\x6a\x01\xb5\xef\x11\x90\x8a\xe7\x27\x25\x2b\xce\x25\xca\xde\x25\x09\xb3\xaf\xb3\x0e\x5c\x71\xbe\x66\x81\x67\xb9\x29\x74\x31\x8f\xb7\xb4\xeb\xb2\x72\x6f\x7d\x49\x9c\x5b\x3b\x5b\x9b\x8c\x04\x3b\xf0\x89\xa1\x1f\x23\x7e\x69\x3a\xfc\x3e\x3a\x37\x1b\xbc\x64\x78\xb6\x34\xbd\x84\xab\xac\x19\x96\x03\xb9\x2f\x58\xb0\xe2\xf5\xf9\xa1\x9b\x56\xe1\x57\xdd\x52\x52\xcc\x7d\x88\x9d\x66\xdb\x84\x3b\xd7\x0f\xf3\xff\x67\xef\x5d\xb8\xdb\xb6\x95\x7f\xd1\xaf\x22\xf1\x74\xab\xc4\x09\xc2\xc8\x49\xbb\xdb\x52\x65\x75\x9d\x57\x9b\x36\xaf\xc6\x49\x5f\xda\x3a\xb9\xb4\x04\xdb\x6c\x68\x50\x05\x21\x3b\x8e\xa5\xef\x7e\x17\x06\x6f\x12\x94\x64\xe7\xd1\xee\x7b\xfe\x7b\xed\xd5\x58\x24\x88\xe7\x60\x30\x98\xf9\xcd\x8c\x17\xaa\x5c\xd4\xd2\xd1\x42\xb7\x4e\xef\x6a\x6d\x68\xf3\x45\x4b\x98\xfa\x74\x1a\x9f\x56\x4f\x35\x22\xe3\x03\x68\x6c\xfc\x6b\xc6\xc7\x56\x3c\xb6\x46\x62\xae\x37\x1f\x40\x6d\xf8\xba\xa8\xef\x56\x6f\xc1\x56\xb3\x29\xa8\x47\xdb\xaa\x3d\x18\x68\x0c\xd3\x60\x70\xbb\xe1\x05\x4f\x90\x41\xe8\x28\x9f\xd6\x82\x8a\x2f\xac\x81\xae\xf0\x38\x66\x37\x36\x6e\x93\xab\x53\xcb\xfa\x4d\x3c\xf1\x55\x62\x3d\x0e\x38\xcb\x39\x39\x0e\xfa\x4c\x81\x4d\x5f\x8f\xc3\x05\x51\xc6\xdc\xb3\x9f\x39\xef\x9c\x89\x6b\xe9\x1b\x36\x84\x44\x21\x83\x41\x5f\x47\x09\x93\xdf\xad\x56\xde\x4f\xb9\x2b\x91\x89\x0d\xa6\xd7\xad\x4d\xbf\xd6\xfd\xe1\xe0\x0a\xf8\x75\xed\x17\xc4\xae\x4b\x94\xa0\x22\x2b\x02\xe2\x96\x2f\x57\xa9\xc4\xb1\x79\x20\x2d\xb7\x9f\x7f\x5b\x16\xec\xf0\x9f\xb1\xb8\xfa\x63\x12\x17\x08\x9f\x92\x38\xc7\x05\x42\x08\x96\xdd\x60\x12\x88\x4c\x5c\x7f\xf1\xb0\x62\xa7\x12\x7d\xca\x00\x14\xd5\x5a\x7c\x51\x07\x49\x9a\xe7\x1c\xa0\xb3\xae\x76\x59\xea\xf7\x49\x0b\x99\xe6\x39\xea\x38\x81\x55\x3b\x77\xd4\x87\x48\xe1\xa9\x79\x04\xd4\x9e\x79\xba\x6d\x89\xcf\x26\x16\x24\x22\xb5\x3d\x7a\x43\x82\x34\x4b\x93\x20\xf6\x4c\x73\x0d\xf3\xd1\x46\x15\x91\x02\xc9\x62\xa7\xc6\x5f\x2c\xd4\x4a\xd6\xb0\xed\x52\x4a\xbd\x40\x36\xb3\x93\x2d\x93\xf6\x9e\xb3\x65\xa1\x78\x7e\x70\xda\x90\x1f\xe2\x7b\x32\x71\xa9\x52\x7e\xdf\x0e\x37\xe9\x5b\x6b\x41\x1a\x56\x09\xee\x3d\xb6\x66\x26\xfd\xdc\x8c\xdb\xd2\x0c\xe6\xc8\x37\x89\x58\x08\x61\xe3\x94\x0b\x2f\x09\xba\x0c\x0a\x10\x1b\x78\xa0\x53\x71\x40\xba\xdb\x22\x72\xe8\x83\xe3\xea\x31\x81\x2d\x31\xb7\x3c\x61\xdb\xf8\xfe\x50\x2d\x73\x8d\x3b\xd2\x15\x61\x12\x0a\x6c\xec\x2b\x57\x37\xba\xe8\xfa\x6a\xd8\x8d\xdd\xda\x5e\xab\xd3\x3d\xbf\xb0\xdb\x4d\x4f\xa7\x14\xaa\xc5\x39\x39\xdb\xa8\xcc\xce\xb5\xe9\xc7\x8e\x17\x82\xb3\xcd\x9f\x51\x71\x9d\x6d\x19\xdc\x14\x7b\xf1\x01\xb2\x3c\x60\x53\xf5\x0a\x5a\x69\xa7\x1f\x20\x58\xa4\x5b\xf2\x69\xbc\x81\xb4\x6d\x72\xf3\x0e\xd4\xed\x10\xb9\x62\xb1\xb7\xf5\xba\x17\xd4\x15\xa0\x20\x36\xd1\x16\xc6\xac\xf6\x1f\x31\x34\x3d\x76\x29\xbc\xf3\xe4\xd9\x5b\xa3\xd4\x51\xfd\x6e\x2a\xa7\x0a\x76\x77\x41\xfb\xd8\xee\x13\x84\x7f\xb9\x5e\x54\xd9\x3c\x70\x74\xe7\xcd\xa3\x9b\xc1\xd1\x5d\x60\x26\x8e\x6e\xad\x4c\xc8\x08\xce\x43\x67\x71\x1e\x3a\xb8\x99\x7d\xee\x60\x84\xf3\x2b\x1f\xdb\x79\xfb\xd8\xce\x03\xc7\xb6\xde\x78\xc6\xa7\x72\x47\xef\xef\x7a\x42\xa6\xe3\xe6\x83\x34\x6e\x3e\xc9\xb8\x54\xd5\x49\x4b\x84\xd4\x0c\xfa\xfe\x30\x2d\xdf\x90\x2e\x61\x17\xb9\x27\x58\x3e\x9f\x6f\xec\xb1\x54\xb2\xb4\x45\xb2\xe0\x59\x74\x7b\xea\x4b\x6a\xfa\x2c\x6a\xcc\x4d\x6c\x8f\x90\xae\xc5\xb0\x0b\x40\x03\xf6\xad\xf6\x98\xe2\x26\x3c\xa9\x73\x50\x1f\x48\x1e\x70\x96\xc6\x8f\x0a\x20\x9e\xec\xee\xb2\x83\xe7\xa4\x24\x9c\xb4\x28\x62\xd7\xd9\xe1\x57\x9d\x9d\x9a\xf0\x8f\xbf\xde\x1f\x7d\x72\x54\xad\x9f\x94\xae\x44\x07\xf2\x82\x6e\xd5\xd6\x74\xab\x45\x03\x73\xa1\x8c\x71\x0d\xf0\xe4\xc7\x17\xfe\x5f\x43\xdc\xe0\xfd\x52\x86\x36\xac\x9f\x0b\x41\x96\x72\x21\x24\x36\x2e\xe3\x2d\x31\x9e\x81\x55\x01\x52\x35\x3d\x3a\x52\x13\xff\xa4\xa8\xeb\x82\x1e\x0b\x96\xcb\xed\xf0\xd8\xd4\x91\x9a\x27\x6c\xda\x3e\x4b\x03\x2b\xf1\x61\x85\xfe\xf7\x9e\x2c\x03\xd7\x8f\x77\x9a\x17\x67\xec\x83\x81\x3f\x15\xb6\xbb\x1f\x70\x32\x3e\xf2\x4d\x04\x20\x12\xef\x4b\x69\x61\x9b\x24\xc5\x0c\x5d\x52\x1d\x94\x65\xc3\x84\xf0\xd0\x84\x34\x15\x6c\xdc\x7f\xfe\xb2\x71\x89\xe9\x98\x3f\xdf\x1c\xf3\x02\xf0\xa3\xc1\xfb\x8a\xa7\xc1\x94\xa9\xe5\x61\x38\x8c\x00\x7e\xa2\x69\xad\xd1\xd7\xdc\x09\x9d\x66\xdc\x35\x7b\x1c\x90\xb1\xba\xf9\xa6\xe0\xaf\xa3\x9b\x8c\x11\xf6\x14\xb7\xbb\x09\xd2\xd6\xc0\xd0\xea\x54\x7f\x0f\x77\x18\x32\x3a\x7c\xa7\x56\x2b\xe2\x64\x91\x52\x8c\x6a\x07\x49\x09\x74\x18\xa6\xdf\x41\xae\x10\xda\x9d\xc5\x51\xdc\xf7\x62\x5f\xba\x7c\x51\x6b\x00\xdb\xf9\xe0\xfe\x43\x7b\xea\x7f\x2f\x4d\x7a\x63\x5a\xf5\x8e\x2a\x76\xda\xd3\x5f\xf7\xf4\xa1\x40\xe6\xbd\xf3\x82\x9f\xc0\xaa\xf5\x8e\x59\xb5\x5c\xf4\x2e\x08\x4f\x7a\x8f\x8e\x7a\x17\xd5\xf2\x73\x46\x7a\x4b\xd1\xbd\x9e\x0a\x6a\x80\x6d\xe5\x17\xd5\xb2\x77\x9a\x5f\xf4\xce\x73\xca\x7b\xbc\xea\x01\xaf\xec\x51\xf2\x96\xf7\x20\x3d\x6d\x4c\x92\xe3\xa4\x07\x69\xae\x08\x7f\x59\x9c\x92\x6a\xc9\x51\xa2\xbf\x8f\x90\xcd\xdd\xec\xb0\xfa\xcd\xd9\xed\xdc\x21\xc8\x6e\xd3\xfc\x94\xa4\x3d\x93\xf4\x8e\x60\xb0\xec\xed\x7e\x2d\x73\xcc\xd5\x1b\x66\xba\xc5\xc6\xa8\xf6\x1f\x75\xb8\x17\x9d\x8e\xd8\x60\x40\x62\x86\x29\x6a\x18\xfa\xad\x6c\xbd\x39\x17\xf0\x26\x56\x00\xa0\x29\x2b\xda\x92\x6d\x72\x2d\x09\x0a\xb5\x6d\x83\x41\xd7\x6e\x6e\xdd\x70\xe4\xe6\x51\x3b\x71\x67\xdd\x84\xb6\xf1\xf1\x6c\x88\x69\xd6\x3d\xc7\x23\xfe\x2d\xd5\x29\xf6\xf8\x8d\x1b\x7a\x7e\xe9\x84\x43\x4a\x49\x8f\x4c\xd8\xd4\x60\x0b\xb4\xb8\x01\x2e\xbb\x24\x2e\x8c\x5f\xe5\x70\xdd\xd6\x8a\x38\x23\xd8\xbc\x0e\xbb\x72\x32\x88\xe9\x63\xfc\xe3\xa8\x96\x53\x56\x2b\x7b\xf7\x44\x83\x41\xcc\x27\x6c\x9a\x51\x83\xb2\x71\xd7\xc0\xaf\x7c\x93\xb0\x49\xfc\x5e\x75\x20\x6a\xe1\xbc\xc8\xb8\xb8\x63\x62\x26\x83\x79\x5e\x51\x29\x64\x8d\xb2\x43\xcc\x37\x2d\x18\xf9\xd6\xe4\x44\x24\x7a\xc1\x68\xc6\x27\xc4\x5f\x1d\xb5\x37\xf4\xdc\x18\xbf\xd7\xb5\xef\x97\xd9\xcd\xe0\xbe\x1b\x2a\x13\x63\x4b\x45\x15\x16\xcf\xba\x15\x09\x1d\x1b\x4b\x41\x07\x4c\x34\x24\x71\x22\xb5\xf9\xd0\x93\x65\xcd\x7b\xf5\x72\xb1\x28\x2f\x7a\x79\x0f\x9a\x10\xfc\xa8\x93\x27\xf9\x99\x38\x81\x2b\x21\x57\x2d\xf0\xe6\x7f\xd4\x02\x56\x2d\x90\x6f\x82\x79\x34\xcf\x08\x2b\xdb\x2e\xeb\x60\x14\xf7\x0f\x7a\x75\x6d\x64\xcd\x6e\x5d\xa6\x76\xbe\x4a\x5d\xf9\x12\x5a\xd0\x9a\x04\xd2\xd1\x7c\xf8\x0b\xa8\x76\x4d\x26\x78\x68\xb5\xd6\xcd\x81\x5e\xf3\xce\xd8\xf4\x87\x0a\x2e\xf4\x3f\x4a\xd7\xd0\x31\x35\x7b\xd7\x5b\xe8\xff\x4e\x95\xc2\x86\x39\xd0\xc6\xdb\x2b\x12\xcf\xc7\xd3\x38\x94\x2a\x9b\xc3\xf6\x98\xae\x36\xa7\xfb\x3f\x46\x8f\x10\xb2\x00\xe2\xad\xca\x83\x9c\xc7\x0c\xb9\xc6\xb6\xff\x6a\x9d\x41\xf7\x1c\xc0\x38\x07\x03\x3d\x60\x57\x39\xf0\x5f\xa1\x19\x98\x4c\xff\x47\x33\xd0\xb9\x17\x3b\x52\x2d\x90\x86\x2a\x40\x99\x73\x52\xe2\xab\x02\xd6\x0d\x3f\xd3\x8f\x85\x11\x6a\xb0\x8e\x6f\xf7\x8c\xe1\x6d\xbb\x73\xe5\xce\xfc\xb6\x8b\xe3\x0e\x77\xe6\x9a\x1e\xc8\xfc\x7d\x74\x24\xa6\x0b\xf2\x66\x12\x5f\x5d\x41\x82\xfb\x7b\x9f\x58\x47\x12\x5a\xa8\x0f\xa9\x16\xc9\x19\xcb\x2f\x3e\xbd\x5a\x04\x80\xbf\x57\x50\x88\xe4\xbc\x07\x61\x67\x1c\x75\xc8\x55\x54\x21\xfe\x2c\xb6\x58\x32\x5c\x93\x64\x34\x95\xdd\x95\x08\x4d\xdd\x86\xa3\x4f\xb0\x2d\x75\x25\x94\xe8\xf1\xd0\x85\x7a\x8d\x3a\x39\x87\xca\xc5\xb5\xbb\x72\x22\xc8\x97\xea\xea\x94\x6c\xec\xcd\x60\xa0\x42\xbc\x7d\x04\x15\x4f\x9b\x77\x58\x11\xca\x6d\xf1\x1f\x77\xf3\xd5\xc4\xe7\x28\xe3\xa8\x52\xc6\xa1\xab\xaa\x20\x74\x84\xed\x27\x2d\x1d\x11\xbb\x00\xfd\x04\x4f\xea\x18\x8d\xfa\x00\x65\xa3\x31\x42\xc9\xbc\xa2\x64\x04\x63\xd1\x39\xc0\x5a\xea\x86\xf5\x4c\x48\x0f\xd2\xdd\x03\xa2\x1c\x1e\x15\x34\x2f\xcb\x8b\x4b\x9e\x1c\xc5\x26\xbe\x4d\x88\x95\x6c\x50\x40\x6c\x35\x67\xa3\x4b\xd2\xb2\x47\x6f\x3e\x18\x3a\xed\xd1\xae\xf2\xe0\x35\xb1\x19\x72\x3f\xdb\x39\x43\xee\x0f\x62\x6f\xe0\x73\x92\x3d\x67\xd5\x69\x51\x13\x21\x3d\x54\xe5\x19\x01\xaf\x09\x84\x7f\x20\xef\x97\x0f\x77\x47\x05\x05\x42\x36\x86\x75\xd6\xdf\xc3\x79\xf2\x7a\xae\x03\x9c\x43\x4a\x97\x3c\x01\xcf\x99\xd3\x82\x3b\x20\xf8\x5c\x70\xa4\x53\x78\xf0\x0b\x89\x2f\xd7\xf8\x85\x10\x9f\xef\xc7\x0c\x85\x35\x0a\xf4\x78\xff\x88\x13\xf6\x4b\x41\xce\x1f\xd1\xa2\x3b\xa9\x6b\x5b\xf5\x61\xc9\x75\xa7\xd8\xeb\xa2\x1a\xcf\xfa\x09\x74\xb0\xe1\x32\x22\x6a\xdd\x25\x58\xbb\x13\xc8\x7f\x66\x58\xcb\x96\x7a\x0d\xe9\xee\x84\x5c\xf0\xd4\xdf\xe7\x24\xe1\x27\x84\xc6\x0d\x12\xa0\x19\x4f\x5e\x8b\xb3\xe6\x9e\xd4\xb4\x12\x16\x13\x19\x2e\x77\x64\x82\xc5\x65\xb4\x6d\x63\x86\xe0\xeb\xd8\x14\x41\x18\xe2\xeb\xa9\x5f\x18\x6e\x3e\x26\x17\xc8\x56\xe9\x46\x45\xec\x73\xe8\xc4\xa6\x2b\x72\x45\xd0\x0d\x23\x6d\xcd\xd4\xb1\x90\x9b\xe5\x48\xae\x0a\x8a\xb8\xe6\x7c\x81\xa7\x8d\xd7\x84\x9a\x26\x84\xe7\x10\x32\xcf\x0e\x0f\x7b\x23\xcb\xe7\xf3\x87\x36\x78\xf4\x87\xed\x15\x66\x76\x4f\xa1\x51\x45\x62\x26\x16\xa7\x73\x41\x19\xc2\x6c\xc7\x05\x6b\xe9\x7e\x3e\xda\x18\x36\xcc\xac\x4f\x1f\x1b\x7b\xb0\x13\x85\xc8\xa1\xab\x28\xf1\x1b\xdc\xad\x3a\xc6\x41\x5b\x35\x3b\xb0\x3a\xe4\x6b\x8b\x36\x27\xd7\x36\x29\x6f\x8c\x12\xc0\x7e\x0c\x0e\x82\xa7\x01\xa6\xd7\x18\xa5\xc3\x86\x87\x78\xa6\x8e\x1e\xd1\x41\x75\x19\xb4\xf4\xa8\xee\x21\x9a\x2f\x4b\xff\x28\x82\xb0\x63\x5d\xa9\xe8\x8b\x8e\x2b\xb4\x02\xa1\xd4\x72\xfe\xe3\xc6\x9d\x5b\xc6\x39\xef\x18\x25\xcc\x96\x4e\x49\x82\x9b\x9d\xde\xbb\x8a\x3b\x82\xaa\xb1\x02\xa7\xc9\x5a\x3b\x25\xb8\xcf\x5a\xfe\x09\xd0\xba\x75\x52\x08\x96\x75\x05\x6c\x97\x36\x37\xcc\x3d\x49\x16\xd5\x02\xb0\xf1\x2a\x7d\x5e\x83\xe4\x14\xba\x50\x9e\x13\xf2\xcc\xff\xec\xba\xd1\xee\x0f\xf0\xde\x50\xa7\xfc\xfe\xe5\x6a\x91\xef\x83\xe1\xe9\xc5\xef\x56\x20\x7b\x7a\x7c\x13\x0a\x77\xc5\xae\xdf\x21\x71\xb6\x42\xb9\x86\xd3\x51\x6b\x7a\x8e\x65\xa2\x6c\xa5\xaa\x09\x1c\x83\x89\x22\x42\x50\x0f\x60\x48\xc6\x5d\xa7\x97\x6a\xc9\xd2\x89\xea\xd9\x33\xf9\x3b\xc2\x91\x7a\x13\x4d\xd7\xb8\x5a\x72\x59\x5a\xd3\xb8\x10\x21\xd4\x36\x5a\x63\xf2\x76\x51\x31\xbe\x6f\xeb\x88\xa6\xed\x0c\xd8\xaf\x49\x33\x05\x36\x7e\xd2\x16\xa9\x3e\x59\xe6\x18\x7a\xfc\x8c\x6e\x14\x7d\xe0\x0e\x21\x25\xd3\x97\x17\x0b\xe3\x3c\xec\x49\x3d\x89\x7b\xf6\x48\xf1\xcd\x10\xbc\x68\xa0\x2b\x61\x92\xb3\x7f\x4d\x5d\x4a\x17\xe0\xd7\xdf\x38\x1a\x1a\x4d\xec\x2a\x4f\xd9\xfa\x5c\x2e\xdf\xa8\x6c\x53\x62\x1c\x42\xb4\xeb\x30\xf0\xb9\xfc\x94\x8c\xcd\x5f\xa9\xf9\xcb\x4b\xaf\x7b\x62\xdd\x88\xae\x21\x32\xea\x4f\xc7\xee\x0f\x7f\x2c\x0d\xf7\xfb\xc6\x72\x05\x1d\x06\x9a\xdc\xe2\x93\x65\xf6\x79\x7c\xad\x0b\xc9\x5b\xb8\x90\xbc\x7d\xcf\x7b\xc7\xce\xa6\x51\x27\x43\x10\x51\xe6\x4d\x27\xde\x9e\x31\x79\x36\x03\xf1\x15\xe1\x1b\xc6\x15\x16\xe4\x09\xb9\x7e\xb6\x92\x2f\x35\xfb\x7e\x0f\x56\x1e\x4a\x4a\x32\x35\xfc\x11\x68\x7c\xd2\x2c\x21\x9e\x0a\xc6\xe8\xb1\x3e\xa7\x44\x80\x01\x3e\x6e\x33\xc0\x3f\x1c\xba\xf8\x71\x67\xba\x78\x04\x74\xf1\xa0\xeb\xa2\xfa\xe8\x7d\x09\x26\xc7\xa5\xfc\xae\x0a\x90\x4c\xd5\x20\x19\x73\xc9\x21\xe7\xbd\x03\x82\x2b\x7b\x7b\x97\xf7\xd7\x4a\xc9\x02\xce\x65\xb5\x72\xe8\xac\x0a\xd0\x59\x15\xa4\xb3\x5c\xbc\x00\x1a\x32\x79\xaa\x96\x24\x1e\xe2\x12\xe1\xaa\x83\xbf\x9b\x84\x86\x5d\x8a\x1f\xa0\xd1\x87\x15\x53\x4e\xe9\x4d\xfb\x1c\x99\x6b\xf7\x6d\x57\x85\x15\x23\x1c\x15\x56\x41\x53\x58\x3d\xae\x12\x86\x8c\xc7\x38\x41\x58\x46\x3b\x07\xe5\x5e\x41\xce\x81\x40\x50\xc3\xc1\xd3\x71\x1b\x81\x20\xe7\xa8\x51\x3e\x73\x5e\x7d\x8c\xd3\xc5\xa8\xd0\x76\x3e\x0e\x3c\x0e\x4d\x54\xdf\xe1\x02\xe4\xb1\xfd\x74\x62\x5e\x4c\x3f\xc1\x11\xd0\x8a\xb3\xde\xb9\xee\x76\x6a\x89\x6b\x41\xd0\x72\x7b\x58\x73\x79\x15\x1d\x89\x9a\x87\xa2\x3e\xe0\x39\x9d\xe7\x65\x45\x49\x8c\xc6\x4e\x71\xf7\x79\x1a\x96\x2b\xbc\x65\x69\x11\x66\xd6\x1f\x7e\x64\xf1\x5e\x5f\xa1\x76\x97\xf0\xdd\xe1\x76\xfb\x6c\xb9\xcb\xb9\x5a\x69\xb7\x64\x55\xad\x76\x4b\xd6\xad\xd4\xa6\xc2\xe6\xaa\x6c\x6c\x8a\x13\x6f\x0c\xd8\x99\xc3\xab\xa9\x55\x1a\xf2\x85\x61\x15\x9d\xc4\xe0\x2f\xb9\x66\x1f\x1d\xb2\xa4\x7c\xfe\x34\x3f\xf5\x20\x83\xbb\x1c\x9c\x5e\x59\x99\x60\x6b\xcb\x8a\x7b\xd3\x2a\xb6\xa4\x5e\x67\x48\x03\xd8\x7a\x1b\x26\xe1\xdd\x0c\x1b\xbe\xbe\xe2\x41\xfb\x9e\xcf\x03\xf7\x73\x19\x36\xa8\xe5\xc0\xdb\xd4\x95\x34\x58\xec\x56\x0b\x3c\x49\x2c\xab\xf6\x72\x42\x60\x96\x45\x51\x96\x65\x74\xb5\xa2\x83\x41\x74\x94\x97\x35\x89\xfa\x59\x46\x43\x1d\x66\x83\x41\x9f\xb7\x92\x37\x8f\x5b\x8f\x62\x94\xf6\x99\x03\xda\x37\x45\xdd\x67\xca\x81\xce\x01\xbc\xfd\x78\x7d\xf9\xe7\x9b\x4e\xf9\x47\xfd\x3d\xbf\xae\x2c\xe4\xde\x67\x1b\xf9\x00\x1b\x8f\x43\x02\x93\x14\x90\xb0\x9d\xfc\x74\xe2\x84\x47\x77\xcf\xcf\x29\x86\xa3\xcd\x0a\x50\x11\x56\x59\x40\xa6\xd8\xbd\x9b\xc2\xbb\xcd\x97\x53\x49\x1b\xa9\x2e\xac\x9c\x56\x43\x42\x5a\x48\x3e\xfb\xc3\xc8\x67\xb8\x48\x5e\xbe\xbc\x6f\xa4\xb4\x97\x01\x81\xea\xb5\x21\x0f\x3f\x49\xfb\xfa\x43\x26\x58\xdd\x51\xe3\x40\x8f\x9f\xe6\xe2\xd4\x50\xc2\x12\x71\x74\x0b\xfb\x9c\x33\x18\x76\x75\xe6\xbe\xd4\x23\x7b\xe6\xc8\x9f\xf3\x9d\xe5\xcf\xe7\x64\x8d\xf0\xe9\xb2\xe4\x45\xda\x1f\xae\xf1\xf3\xbf\xf1\x16\x6f\x93\xb0\x6d\x8a\x1d\x6e\xd3\xcb\xc8\x68\x20\x58\x5e\x66\xc9\x38\x8a\xd2\xa0\x33\xf5\x16\x27\xea\x76\xbe\x0b\x8e\x2e\x49\x2c\xf8\x09\x1f\x43\xa0\xaa\x45\xce\x6a\xf2\xb0\xac\x72\x2e\x6e\x8e\x6b\xbd\xd1\x97\x1f\xef\xea\xe9\x91\x0a\x6c\xc5\x08\x47\x1c\xce\x8f\x88\x2e\x4f\x0f\x09\xeb\xce\xed\xb9\x43\xf1\x6d\x45\xdd\xdc\xa0\x3b\xab\xb5\x54\x65\x1d\x5a\x2d\x83\xd4\xe7\x39\x3b\x26\xca\xe7\x05\x54\x5c\x90\xa9\xae\x43\xc3\xe5\x46\xea\x6e\xef\xf1\x67\xde\x1d\x0c\xee\xe6\x4f\xaf\xb5\x07\xee\xfb\x7b\xe0\xc5\x27\x62\x11\xa7\xd5\x3c\x2b\x92\x6a\xff\xae\x9b\x83\x59\xbd\x2b\xe8\x9f\x59\x91\xcc\x7e\x3c\x88\x2f\xf5\xfe\x7e\xb8\xe9\x2a\xe8\xa5\x81\x69\xe7\x80\xc9\xd5\x2d\x0b\x72\x66\xb7\xf3\x9b\xe4\xf3\xc0\xe1\x0b\x99\x08\xfd\xaf\xa5\x29\x6a\x42\x30\x9f\x36\x2d\x1e\x9b\x1d\x22\x9a\xf5\x48\x6d\xf0\xcd\xbd\x11\xff\x2e\x1b\x8e\x6e\xde\xe4\x48\xe3\xe8\x6d\xa1\x09\x9f\x4e\xf6\xa6\x59\x96\x11\x1d\x9d\x0e\x8c\xf7\xcd\xaa\x14\x7e\x88\x63\x2f\xd6\x9f\xd8\x3f\x5b\x64\x99\x66\x45\x21\xcf\x17\x0e\x42\x53\x7e\x4a\xa4\x92\x4d\x70\xbe\xc1\x80\x4e\xf6\xa6\x32\x56\x91\xf8\x2b\x39\x2a\x18\x79\x45\x41\x78\x33\xd9\x31\xd7\xbe\x24\xad\x2b\xd8\x1c\x53\x8e\x4c\x86\x53\x9b\x58\x1c\x7e\xe9\xbb\x75\x96\xf1\xe4\xb5\x11\xe2\x75\x8c\x26\x22\x9a\x07\x91\x4f\xbc\x17\x7f\x7c\x80\xcc\xe0\x62\xfb\x64\xb0\x5b\x7e\x7f\xf7\x15\x8a\x2f\x8f\x72\xc1\x89\x2e\x02\x17\x3b\x4a\xce\x7b\x64\x8d\x79\xf5\x86\xd0\x94\x60\xb5\xef\xe6\x8f\x68\xfa\xc2\xa4\x13\xbf\xff\xde\x0a\x2f\x9c\xab\x44\x6f\x01\xfd\x45\xe9\x79\x03\x10\xcc\x10\xd2\xf7\x2a\x76\x91\x15\xb8\x4c\x5e\x17\xf4\x4f\x60\xa5\x59\x8e\xcb\x00\xaf\x47\x97\x6b\x5c\x5e\x4b\xa3\xac\x54\x25\x4a\xb2\x56\xad\x80\x55\xe3\xc7\xc0\x8d\xc0\xbb\xf3\xb1\x0b\x71\x27\x8c\xbd\x8a\xf0\x95\x15\xce\xb6\x32\xb9\x03\x1b\x77\xfe\x1d\x4e\xd3\xd7\x35\xcf\x39\xc9\x80\x7c\x4e\x6c\x30\x97\xd6\x41\x0b\xe3\x80\x64\xb4\xf6\xab\xab\x9d\xb4\xad\x6d\x77\x44\xf5\x75\x3d\xb4\x26\x26\x1e\x90\xe3\xf9\xc5\x2e\x12\xb9\xad\x01\x8b\x69\x34\x10\x76\xf3\x75\x0e\xd3\x4b\xee\xba\xdb\x75\xab\x6f\x6e\x53\x8e\xae\xc5\x39\x6c\xdb\xf7\xad\x46\x01\xd4\x96\x12\xae\x78\x1d\x28\x92\x9f\xeb\x3f\xb5\xe0\x5f\x24\x07\x77\xff\xd2\x3f\x1e\x12\xfb\xf8\x5d\x7d\xe7\x0a\x17\x82\xc6\x81\xcf\xf2\x79\x51\xed\x2c\x49\x04\x4a\x6f\x29\x79\x2d\x39\x42\x65\x0f\xea\x90\x08\x0c\x24\xfe\x2a\x92\x43\xe8\x32\xd3\x18\x73\xda\x9e\x04\x49\x14\x4a\xca\x0c\x88\x1f\x4f\xdb\x2a\xe0\x3f\xb5\x66\xf4\x59\xf9\x3c\x8e\x9e\xca\xe1\xff\x5a\xf0\x93\x87\xb6\xf2\x5f\x73\x46\x21\xd5\x33\xfe\xfe\x5a\x86\x84\x77\xa0\x30\x7e\xf7\xc9\x00\x4c\x67\x6e\xaa\xa4\xa6\x8f\x53\x9d\x31\x9c\xb7\x30\x4e\x9b\x93\xc9\xa9\x26\x73\xa3\x61\xad\x4e\x35\xd0\x19\xe7\x49\x13\x1f\x25\xa1\x50\xcb\xb2\xec\xc2\x4a\x35\x54\xce\xa4\xcb\xb4\xc1\xba\xc0\x53\x57\x50\x2d\x9f\x6a\x77\x06\x21\xa8\x35\xb3\x5d\xc2\x95\x2e\xa0\x0f\xd6\x1d\xf0\x71\xe7\x76\xd4\xde\xe3\x17\x92\xd7\x41\xe8\x63\xfb\x49\x55\x82\x65\xd2\x72\x9a\x2b\xeb\x8e\x07\x83\x38\x6f\xa2\x1e\x1c\x23\x68\x70\xcd\xd4\xa9\x10\x78\xe5\x30\xc5\xab\x24\x23\xfe\xc7\x81\xcd\x76\x45\x8c\xb5\xa0\x2c\xe6\xe6\x27\x04\x4f\x38\xa5\x76\x45\x76\x49\x70\x65\x13\xdb\x85\xf9\x27\xc5\x76\x51\x07\xa0\x26\xc3\x2d\x63\x82\xfb\x7b\x12\x9c\xe5\xf7\x10\x93\xdd\xc1\x59\x8e\x4e\x5c\x33\x3c\x05\x5e\xba\x12\x3e\x4a\xed\xb9\x92\xe4\x74\x43\x45\x1f\x04\xe3\xa4\x46\x04\x51\xb1\xdf\x7f\x44\x5b\xaa\xd9\x71\x44\x9d\xb5\x7c\x18\xd4\x56\xf0\x73\x0f\x9a\xf5\x81\xb1\x55\xff\x45\xd0\x2a\x9f\x35\xef\x80\x6e\x77\x76\x72\xdb\x8b\xc0\x62\xf9\xb4\x8c\xcf\x32\x62\xa7\x9e\x6b\x44\x5f\x3f\xcb\xd8\x60\x10\x53\x12\xab\xdc\xbb\x98\x23\xcc\x7c\xdf\x20\x71\xac\x90\x98\x81\xdb\xa1\x31\xd3\x32\x9b\x22\xc6\xc5\x6f\x79\xa9\x1c\x3a\x6d\x20\x6d\xa2\xbe\x2a\x0f\xac\xae\xc8\xfc\x1c\xd1\x3b\xb0\x13\x3a\x3c\x5e\xec\x91\xb7\xb1\x2f\x7c\x30\x08\x5d\xaa\x75\xbe\xf4\x35\xf4\x74\x30\xd8\xbd\xab\x0d\x9a\xf0\xce\xe5\x4d\x07\xed\x75\x03\xb0\xb9\xe7\xbc\x09\x9d\x2a\x7f\x5e\xc1\xb9\xaa\x6d\xd2\xe9\x4e\x27\x58\x74\xc8\x03\xb6\x17\xb9\xe9\xb1\x7c\xd2\xb8\xa3\xb6\xc4\xa2\x9d\x70\x3a\x9f\x0e\xd5\x17\x35\xf1\x7b\xff\x08\x88\x9e\xe8\x52\x3a\xf1\x7a\x26\x11\x85\x1f\x04\x98\xf7\x7d\x97\xdd\xe3\xee\xb5\x2e\x1b\xaf\xe0\xb2\xf1\xea\xff\xb7\xa8\xa5\xdf\x89\x97\x4e\x0a\x7d\x08\x14\xd3\xde\x9d\x0f\x03\x63\x32\x14\x62\xee\xe4\x2d\x1c\x53\xb3\x88\x06\x32\xb5\xc8\xe2\x6e\xfb\xae\xfa\xd7\xb5\x08\xe2\x57\x20\x88\x5f\xff\x3b\x09\xe2\x83\xc2\x44\x55\x26\x95\x8f\x09\x13\x0d\x35\x71\x6d\x98\x68\xa8\xb2\x8f\x87\xdf\xf9\x14\x00\xd4\xf7\xd8\xdf\xd7\x3e\x8e\x3e\xec\xf6\x86\x35\xd9\xbc\xbd\xdd\x22\x9d\xdb\xfb\xaf\xd6\xf6\xb6\x1b\xee\x77\xe2\xc4\xcd\x8e\x3d\x97\xf3\x57\x64\xb5\xf2\x1e\xbc\x6b\x3e\xf8\x95\xa0\xb5\xd8\xa8\x9f\x5d\x0b\xdb\xf8\x23\x30\x8b\x1f\x3f\x00\x84\x11\x57\xf2\xcb\x3a\xc0\x30\xea\x26\xc3\x50\x6a\x47\xa5\x68\xbb\x57\xd1\xa3\xe2\x38\xab\x70\x9d\xbc\xce\xe7\x73\xa9\xa4\xaa\xdb\x40\xc6\xba\xf9\xe1\x81\xe0\x3a\x50\xd6\xb2\xa0\x3a\xc0\x82\xea\x2e\x84\x63\xdd\x81\x70\xac\x03\xac\xc9\xc1\x50\xb4\x72\xf4\x7b\xec\x65\xab\xae\x0a\xc6\xd8\x01\x75\xdc\x04\x60\x0c\x41\x14\x43\xec\xcf\xb9\x60\xca\x35\xb0\xc5\xd1\x27\x84\x34\x7e\x78\x80\xe0\xff\x05\x98\xf9\x2b\x41\x21\x3b\x0e\x43\xcf\xf0\xb5\x0b\xd0\x31\x00\x9f\x32\xc6\x26\xbd\x37\x92\x9a\x70\xbd\x01\x20\x44\xfa\x4e\x85\xe2\xfe\xd0\x18\xb8\xe5\xce\x1e\x7e\x00\x14\xd6\x06\x06\xef\xc2\xb0\xd4\xdf\x7f\x12\xfc\xf5\xd5\x19\x7f\xd3\xda\x62\x59\xff\x4e\x20\x2b\xe7\x7c\xf0\x6b\x92\x27\x44\x37\x08\x6b\x07\x7c\x55\xeb\x70\xf9\x2c\x74\xa5\x08\x31\xcb\x67\x74\x06\xe9\xbc\x41\xbc\xfc\xf9\x5a\x48\x8c\xdf\x3c\x24\x86\x3d\x08\x7e\x22\xde\xad\xde\x42\x7e\xb4\x03\x3e\x47\x69\xcc\x07\x83\x56\x6a\x21\x88\xe1\x94\x45\x32\xf2\x5e\x84\x70\xe4\xc6\xcf\x4c\x7b\x11\xb2\x15\x24\xb5\x0c\x44\x82\xbf\x14\x27\xb9\x38\x6d\x7e\x7b\x5f\x30\x14\x7c\xd2\x91\x97\x26\x88\x8a\x42\xc9\x6b\x89\x85\x7b\x92\x2f\xe0\x6c\x7a\x92\x2f\x20\xdb\xcc\xfc\x5e\xb5\xa4\x9c\xb0\x6c\x28\x7e\xce\xaa\x53\xc1\x11\x7e\x2d\xf8\x89\x0e\x5b\x58\xd4\xc1\xdc\x31\x4e\xc9\xf6\xc1\xa2\x0d\xd0\xb6\x32\x72\x15\xf3\xb1\x8c\x70\x41\x46\x2e\xc4\xe3\x98\x70\x09\xeb\x7b\x34\x8f\x09\x1a\x29\xa6\xa9\x13\xcf\xb9\x46\x65\xb9\x2d\xc8\xfc\x11\x9d\x93\xb7\x11\xbe\xb9\x87\x54\xe6\xcb\x9f\xa4\x5a\x69\xd4\xfe\x44\x03\xbe\xde\xcf\xf6\xdc\xb6\x49\x01\xd0\x43\xc5\xeb\x70\x86\x20\x15\xa2\x14\x61\x6b\x8e\x5e\xb7\xe3\x21\x3c\xeb\x4a\x79\xa9\xd0\x5f\x0a\x20\xa0\x17\xf0\xc6\x0d\xe4\x1c\x13\xb6\x3a\x67\xe2\xb6\xc7\x16\x95\xd9\x1c\x8f\x58\x75\xaa\x15\x34\x9a\x68\x64\x70\x49\xb4\x29\xc6\xa8\x09\x59\xe9\xae\x7c\xab\x9e\x63\xc2\x21\x03\x92\x49\x0d\xc9\xd6\xce\xe6\x0b\xf4\x7b\x0b\x7c\x38\xa0\x4a\x21\x3a\x43\x65\x1a\xa1\xc9\x70\xba\x8e\xed\xa5\xbb\xd9\x9b\x93\xbc\x8e\xb9\x06\xdd\xfb\x9d\xe4\x28\x25\x9f\x1a\x92\xa7\xf1\x45\x5d\x78\x5a\xe0\x60\x8b\xd2\x58\xd2\x43\xe5\xb7\x96\x6d\x40\x77\xbd\x72\xd7\xb7\xa6\x7f\x70\x58\x9e\x3e\xb8\x1c\x62\xf2\xd9\x4e\xe0\x48\xf9\xb9\x8d\xdc\x23\x7c\x57\x74\x9b\x8a\x44\xdb\x84\xb8\x91\x92\x08\x1e\x9a\x71\x03\xb5\xa1\x73\xc2\x08\xcb\xa8\x86\xad\xc0\xc4\x66\xcc\xfb\xa9\xa5\xdf\x42\xa7\xc6\x93\x8f\x93\xc6\xf6\x8e\x11\x0a\xc0\xe6\x54\x0e\x94\x36\x63\x75\x3c\x32\x1a\xed\x98\xfa\x2d\x11\xd7\x84\xeb\x3e\xd8\xd1\xd4\x84\x3f\x90\x03\x92\x5c\xe8\x27\xe2\x94\x41\xde\x10\x5c\x7c\x8b\xf7\x5c\x2e\xa6\x23\x32\x87\x3b\x1b\x6e\x90\xa0\xc6\x3c\x5d\xa1\x49\x4f\xd0\x74\x6b\xed\xbe\xb5\xe8\xd5\xf2\x18\xbe\xb7\xb0\x09\x05\x5c\xb4\xaa\x0e\xeb\xd1\x90\xab\x61\xa6\xb6\xae\x86\xcc\x30\xa1\x27\xfb\xaa\x33\x7d\x4d\xf4\x5d\x1c\x40\xf9\x78\xf8\x9f\xdf\x08\xfe\xe6\x0a\x52\xa6\x1c\x8e\xa7\x51\x90\xa4\xea\xd0\xac\x0f\x6f\xd1\x5a\x41\xce\xaf\x23\xb6\x31\x1e\x16\xdb\x28\xdf\x41\x6c\x8b\x6a\x38\x0c\x5b\x32\x9b\x8d\x2a\xcc\x71\xf4\x79\x84\x20\x20\xe7\x87\x15\xf0\x58\x9b\xe9\xfc\x8f\x80\x67\x0f\x6d\x4c\xfd\xec\xe6\x4a\xe0\x6b\x24\x93\x26\x48\x4b\x17\xa4\x2b\x5c\x19\x6d\x0a\x86\x6b\x34\x72\xe7\x59\xd0\x88\xcc\xb5\x78\xa0\xa4\xc2\x98\x25\x10\x63\xeb\xd9\x51\xcc\x1d\x79\x09\x7d\x77\x73\x0f\xad\xd7\xa4\xac\x49\x6f\x4b\x05\xfd\x3d\xa4\xc3\x4a\xda\xdd\xad\x8d\xb4\xfc\x23\x88\x90\x72\x0e\x26\x20\x5f\x99\xa8\x8b\x34\xd1\x72\xae\xf2\x76\x41\x5a\x92\x2b\xda\xef\x70\x9e\x0d\x47\xf9\xb7\x85\x16\xdc\x72\x2d\xb8\x95\x59\x91\x14\x9c\x9c\x82\xdf\x6c\x40\x46\x2d\x15\x07\x1a\x31\x09\x28\xa9\x90\x9c\x22\xdd\x56\x9d\x51\xed\x10\x86\x67\xd9\x70\x34\xfb\x56\x43\xb0\x47\x33\xdd\xc6\x32\xab\x65\x1b\x33\x88\xcb\xb7\x34\x9d\x93\xaf\xe7\x81\x66\x97\x8d\x66\xe7\x68\xbd\xd6\x82\x34\xc3\x24\x66\x57\x90\x97\xcd\x2c\x6f\x16\x98\xbb\x04\x44\x38\x44\xb1\x07\xa4\xf9\x87\x8a\xd4\xc9\x6b\x09\xb3\xfd\x6f\x90\xac\x55\x5f\xff\x46\x01\xdb\x95\x7a\x3b\x81\xaa\xdb\x4b\x6f\x29\xf9\x61\x80\xaa\x1b\x45\xeb\x8f\x2f\x54\x73\xde\x12\xaa\x8b\x7f\xb6\x50\x2d\x15\xf6\x1f\x48\xb0\xd6\x87\x53\x58\x9c\xa5\xfc\xa3\xcb\xcf\xe2\x9b\xf1\xc7\xee\x4c\xda\x25\xad\xff\x4d\x32\xb7\x7b\xe4\x7e\xc8\x96\x6a\x53\xe7\xff\x1d\x02\x3e\xe3\x9f\x48\xc0\xcf\x1d\x01\xff\x60\x67\x01\xbf\xf4\x04\x7c\x5c\xee\xcc\x57\xda\x2c\x85\x91\xbf\x96\x85\x8c\x27\x12\xd8\xf9\xfa\xed\x66\xdb\x88\x2e\xb5\xee\xd8\x8c\xa6\x0d\x13\x79\x1d\xf2\x4a\x13\xc7\x37\xdc\xb9\x27\xa0\x46\x7a\xeb\x66\xe6\xea\xd8\x63\x01\x45\x97\xb1\xc9\xed\xa1\xee\xc0\xf8\x71\x4c\x90\x6f\xa8\xb1\xf2\xa6\xb1\x16\xee\x9a\x75\x38\xfb\x10\xfe\x5d\xdb\x0d\x14\x76\x0d\x3a\xce\x5c\x7c\xc7\xb8\x7a\x80\x91\xe8\xb0\x7a\xab\x03\xa2\x75\x7e\x7b\xa5\xef\x1a\xaa\xaf\xd6\x37\xf2\x8c\xfe\x25\x67\x75\xba\xb7\xe9\xb8\xbe\x2d\x8f\xeb\xe5\xa3\x37\xb1\xd3\x02\xb7\xcb\x13\x45\xb0\x38\xce\x89\xab\x5f\x39\xa4\x18\x38\x6b\x73\x3e\x45\x06\x49\x53\x5d\x6b\x4b\xd5\xfe\x96\xaa\xdf\x63\x4b\x19\x17\x8d\xec\x8f\xe0\x61\xba\xd1\x6a\x1c\x9d\xe6\x6f\x55\x5e\x09\x19\xfd\x46\x4b\xb2\x8c\xb8\x08\xc2\x78\xfb\x2e\xb9\xfa\x36\x51\x91\x8b\x4d\x38\x15\x33\x90\x0f\xbd\x6b\x8c\x91\xd4\x1f\x54\xe7\x29\x62\x67\xb4\xd1\xcf\xb7\x81\xeb\xad\x76\x9c\x36\x3a\x09\x32\x26\xd2\x69\xfc\x11\x28\x40\xf6\x86\x68\xad\x42\x02\xe9\xa9\x46\x28\xfd\xc3\xf4\x4a\xd5\xde\x9d\x4c\xc0\x91\x7a\x4c\x0d\x9f\x84\x13\x58\xd2\xd8\x24\x7e\x6f\x2c\xd8\x5d\xa8\x2d\x74\x5f\x6d\x43\x3b\xd5\x71\x97\x92\xec\x1c\x35\xf7\xb6\x7d\xe1\x7c\x1c\xd8\xdd\x95\x94\xa4\x5d\xf8\xe4\x2c\xb0\x3d\xff\x46\x9f\xf0\xe2\x74\x51\x31\x2e\x96\xe9\x05\x99\x9a\x4e\x2e\xff\xa1\x9d\x9c\x71\xd3\xc5\xf9\x75\xd8\x9c\xcb\xd4\x00\x1f\xaf\x03\x46\x14\xfc\x44\xc2\x7b\x5a\x7b\xc7\xf4\xff\x12\xc8\x6c\x59\x12\xeb\xa1\x2c\xc8\xdb\x30\xec\x3f\x89\xe0\xd8\x52\x76\xe2\xc9\x79\xce\xe8\x33\x1a\x76\xdc\x5b\x4f\xd7\x1f\x60\xd3\xbd\xc7\xdc\x9d\xbc\xef\xdc\xa9\x69\x3b\xde\x18\x98\xf8\xfa\x99\x6e\x60\x69\x98\x9f\x7f\x54\xa7\xcb\x20\x08\x17\xca\x8d\x0f\xfe\x19\x79\xac\x8d\x0e\x06\x21\xb5\xa1\x69\x93\x34\xdd\x0e\x57\x2b\xe7\xdd\x59\xf8\xb1\x0e\x6a\xb5\x8e\x29\x1a\xc7\x85\x92\x05\xa9\x53\x7c\xec\xfe\x48\x9d\xde\x89\x62\x8d\x16\xc7\xad\x27\xf2\x03\x6e\x3e\xd0\xed\x8d\xed\x9f\xa9\xec\x0e\x4a\x43\xcd\xbb\xad\x6f\x6e\xbc\xd5\xb6\x64\x6c\x08\xab\x70\xd6\x0c\x5f\x36\xfb\x96\x63\xd3\x07\x8e\x9d\x41\x16\xeb\x00\x94\xb4\xed\x26\xe4\x24\xad\x95\xb1\x00\xd5\x43\xeb\x38\x15\x76\x52\x92\x5f\xaa\x7c\xa1\x82\x00\x8b\x6e\xa5\x30\xd3\x32\x86\xcd\x2f\x67\x99\x92\x68\xf5\x0d\x89\x0b\xbf\xd5\x06\x55\x6d\x0d\x18\x75\xb9\xd6\xf5\xed\x90\xac\x99\x4e\xd8\x14\xc2\x2c\xf8\x9d\x9a\xb0\x69\x23\xb9\xa4\x57\x60\x53\xf0\x63\xdf\x85\xa7\x01\xad\xfc\xa5\xf9\xe0\x8d\x10\x1b\x9a\xaa\xf5\xb1\x0b\xa1\x8a\xc9\x64\x38\x35\xb1\x94\xbf\xdb\x1b\x13\xb3\xed\xcc\xc3\xdb\x63\x32\xb9\x2d\x1f\x2a\x65\xc1\xcc\x4e\xef\x3f\x23\x3a\xc4\x9c\x2b\x8e\xb6\xc6\x77\xbe\x19\x7e\xf5\x65\x8b\x7e\x22\x48\x19\xc3\x59\x31\xe3\xd1\x88\x26\xf3\x98\xe3\xcb\xc3\xdb\x81\x36\xbe\x5f\xe3\xfb\x6f\x03\xcf\xef\xae\xf1\x5f\xff\x0e\x3c\xbf\x2f\x2e\x8c\x81\xe7\x6f\xd7\x6b\x69\xe3\x81\x78\x13\x19\x8d\xef\x7c\xfd\xe5\xd7\x77\x10\x2e\x33\x1a\xef\x0d\xff\x7d\xe7\x1b\x84\xab\x8f\x6c\x16\xaa\x97\x0b\xe0\xf8\xf7\x9f\x3d\x01\x37\xa4\x3a\xeb\x0f\x3d\x83\x0f\x5a\xc7\x79\x72\xfe\x1a\xe1\xfa\x13\x85\x63\xaa\xe8\x3e\x9d\xdf\x13\xc4\xb9\x8d\x45\x00\xf2\x0f\x7a\xfd\x58\x08\xe9\x94\x30\xd0\x27\xf6\xf7\x90\xab\xeb\xd4\x78\xce\x60\x41\x6b\x28\x98\x17\x35\x24\x3f\x83\x62\x61\x17\x46\xc8\x90\x63\x0b\xf9\xd6\x9c\xae\x60\x34\x24\x91\x20\xca\xa7\xd5\x9c\x0c\x06\xee\x2f\x8d\x33\x85\x8c\x31\x8e\xba\x49\xee\x73\xa5\x92\xda\x14\xba\x25\xe6\x19\x57\x88\xdb\x63\xc2\xef\x93\xa3\x7c\x59\xf2\xfb\xd5\x0c\xe6\x36\x46\x28\xf1\x6a\x6a\x37\xf1\x03\x3f\x2d\x75\xf1\xee\x5b\xc0\x5c\x95\x48\x8a\xd3\x85\xac\x09\xbc\xd1\x54\xe5\x3f\xbc\x7c\xf2\xd8\x34\x19\x1d\xe5\x6f\xc8\xcb\x82\x97\x24\xf2\xdc\x4b\x1b\x5d\xdb\xde\x96\xf9\xb8\xa8\x55\xef\xc5\x84\x6d\x0c\xf8\x4e\xab\x39\x79\x79\xb1\x20\x59\x96\xc1\xe4\x3e\x78\xfc\xe0\xc9\x83\xa7\x2f\x5f\x3f\x7d\x76\xff\x81\x53\xdd\xc1\x49\x3e\xaf\xce\x5f\x54\xd5\x26\xf7\x52\x8f\x3f\xea\x5e\x3f\x64\xf9\xb1\xd7\xb7\x63\xc2\xbf\x2f\xab\xc3\xbc\x04\x6a\x78\x09\xea\xf6\x4d\xcb\x15\x9d\x17\x74\x5e\x9d\x47\x59\x96\xf1\xb1\xfc\x3b\x8d\xf4\x88\xe5\x53\x92\x46\x87\xd5\xfc\x42\xfd\x48\xc4\xdf\xfe\x7d\xf4\x98\xf0\xbb\x79\x4d\x7e\x60\xe4\x68\x83\x29\x6b\x96\xcd\x56\x2b\xb3\x6e\x7f\x2d\x09\xbb\x38\x50\x57\xac\x38\x3a\xcc\x6b\x12\x21\x34\x9e\x09\xa2\xd9\xe7\x9c\x15\x87\x4b\x4e\xe2\xe8\x44\xd4\x29\xaf\xbf\x23\xcf\x70\xae\xc2\x91\xb9\xed\xc4\x2c\x63\x4e\x0b\x3e\x9d\x45\x79\x84\xc0\xb3\xb7\x59\xb9\x65\x18\x0c\xdc\x27\x69\x7e\xaa\xb9\x55\x74\x0b\xc6\x9c\xcc\x4e\x72\xb6\xcf\xe3\x21\x1a\xf3\x34\xba\xe5\xd8\xeb\xd7\xfe\x6e\xab\xe5\x3c\x74\x6d\x12\x74\x39\xcb\x9a\xf3\xf6\xaa\x26\x6c\xff\x78\x23\xf9\xc9\x45\x49\x68\x7e\x56\x1c\x0b\xb9\x25\x59\xea\x6f\x7c\x37\xf9\xea\x4d\xb1\x81\x18\xe3\x21\xce\x93\x27\x6f\x51\x6c\xe7\x07\xbe\x00\x95\xf2\x54\xb3\xb9\xd3\xfc\x0d\xb9\x27\x63\x49\x06\x3a\x04\x75\xfc\xf0\x12\xc5\xe2\x38\xa3\xc6\x7f\xa4\x42\x58\x0e\x0c\x2f\xc1\x8a\x5f\xca\x88\x1f\x2f\x5f\xec\x3f\x3d\x78\xf4\xf2\xd1\xb3\xa7\xaf\x1f\xdd\x8f\x10\x3e\xc9\xec\x45\xa3\x4c\x8a\xc5\x9e\xb8\x6b\x3c\x6c\x1e\x99\x3e\x33\x75\x1a\xa7\x60\x86\x2b\x93\x7b\x7f\xfc\x20\xf3\x3e\xe9\x18\xd1\xcd\x90\x96\xda\x94\x49\x33\xe8\xef\x5f\x28\x46\x42\x10\xf7\x29\x6e\xbf\x2c\xe3\xcf\x6b\x7e\x51\x92\x09\x3d\xbe\xc9\x59\x4e\xeb\x42\x7c\x9f\x45\x9f\x5b\xc8\xc4\xe7\xd1\xf4\x73\x24\x64\xf5\xe1\xa8\xf8\x96\x69\x73\x67\x71\xe3\x06\xd2\x59\x47\x62\x36\x29\xa6\x32\xc0\xd5\x9c\x2c\xea\x74\xb2\xc4\x79\xf2\xd3\x10\x97\xc9\xbb\xfa\xce\xd4\x6a\xb4\xa6\x78\x71\xad\xdb\x49\x3e\x9f\xbf\xac\x7e\x95\x3b\x34\xb0\xb4\x65\x32\xff\xeb\x0d\xec\x18\x7a\xbc\x2c\x73\xf6\x92\xd4\x3c\x3f\x2c\xca\x82\x5f\x78\x22\x8c\x9c\x8e\x7e\xbc\xf3\x5d\x06\xad\x56\xee\x4f\xe9\xab\x5d\xd0\xb9\xd3\xc0\x23\xfa\x92\x11\x99\x17\x6e\x54\x1c\x29\x8f\x00\x16\x48\x5b\x57\x2d\xcb\x79\xcf\x64\xae\xe3\xb6\x06\x48\x26\xa6\x4d\x1e\x91\x91\xc3\xd8\x1a\xdb\x71\x95\x65\x6b\x68\x05\xa9\x03\x11\x54\x88\x2a\xee\x95\x13\x52\x55\xa0\x2e\xc1\x68\xd5\x26\xdd\x54\x95\x5b\xcc\xd6\x74\xc4\xf2\x53\x72\x5e\xb1\x37\x07\xb2\x9d\x77\x44\x5c\xb5\xe2\xee\x97\xd9\x64\x8a\x36\x7c\x2b\xd1\x02\x6d\x7e\xb9\x6d\x0e\x62\x84\x69\xa6\x33\xb1\x63\x96\xf5\xf7\x70\xe1\xcb\xad\x82\x1b\x72\x3c\xcc\xb2\x9b\x37\xe9\x60\x00\x08\x84\x11\x0f\xe4\x5c\x15\xe2\xc0\xf9\x09\xa1\xa2\x53\x25\x89\x0b\xe4\xc5\xa5\x0d\x2e\x7b\x97\x0c\x64\x08\x81\x23\x87\x5b\x8f\x34\x22\xe6\x98\x70\xa7\xaa\x98\x23\xff\xe6\xcb\xc6\x2c\xa5\x63\xb3\x6b\x13\xf7\x60\x34\x76\xf9\x30\x19\x12\xcc\x93\x93\xaa\xe6\xb8\x3f\xd4\x61\xa7\x3b\xcb\x49\x61\x47\x5b\xd7\xc4\x07\x92\x2b\x1b\x2e\x58\x84\xdd\x22\x63\xb1\xaf\x7f\x79\x5c\x48\xfe\xe7\xdc\x20\xf0\x51\x16\xc7\xc5\xb5\x36\xf8\xe1\x32\x94\x95\xd1\xbb\x37\xfc\xf6\xe4\xf1\x0f\x9c\x2f\x5e\x90\xbf\x96\xa4\xe6\xa6\x51\x14\xba\xae\x10\xef\xba\x42\x56\xab\x02\xad\x71\xe1\x5e\x57\x4a\x71\x57\x89\x2f\xe5\x4d\xa4\xc0\xfa\xca\x52\xd8\xda\xd6\x08\x17\x08\x9f\xb9\xac\x1c\x64\x89\x27\x39\xcd\x8f\x09\x7b\x5e\x2e\x8f\x0b\x5a\x47\x08\x1f\x5f\xc1\x9e\xee\xde\x83\x47\x4d\x95\xfd\xbb\x8a\x12\x63\x44\x27\xa2\xad\xa7\xf9\x29\x79\x59\xc9\xa6\x0c\x32\x2c\x4c\xbb\x66\xd3\x9e\xca\xfe\x65\xcc\x24\xbb\x5d\xc8\xae\x66\x5c\x81\xdd\x50\xc2\xc8\x19\x61\x35\x89\x3b\x78\xad\x27\x8d\x6f\x91\xf3\x65\x13\x82\xca\x64\x37\x1f\x56\x2c\xe6\xa8\x2d\xfc\x37\x75\x05\xf3\xb9\x23\x9f\xbd\x77\x5b\x81\xba\x9a\x2d\x1e\x13\xfe\xc7\xa6\xb8\xe5\x3d\xbb\x08\x7e\x4e\x23\xd3\xd6\x96\x58\x18\xed\x25\x53\xf9\x8c\x00\x09\xa4\x19\x01\x1f\xd9\x83\xd9\x5b\x1e\xcc\xb2\xe1\x88\x59\x38\x11\xd3\x70\xa2\x22\xa3\x13\x06\x70\xa2\xc2\xdc\x08\x63\x8b\x14\xea\x6a\x1b\x22\x9b\x08\x12\x2e\xd6\xad\xc3\xe8\x69\xd5\x83\x0f\x7a\x8a\x58\x7a\xb2\x0f\xbd\xa3\x6a\x29\xb3\xaa\xaa\xd7\x7e\x26\xd5\xeb\xda\xb9\xcb\xe4\xf1\xc3\xef\xe3\x33\xc1\xfd\xc5\x1f\x65\xf2\x62\x78\x88\x9a\xfa\x03\x6f\x43\x12\xb3\x21\x89\xb7\x21\x81\xcb\x9c\x76\x6d\xaf\xb6\x11\x6c\x5e\xcd\x32\x1e\xa6\xf1\x2b\x50\x9f\xdc\xb2\x96\x1f\x87\xee\x16\xb1\x69\x10\xcb\x05\xef\x07\x64\x80\x57\x54\xad\x1f\x99\xab\x09\x96\x38\x20\x3b\xcf\x0c\x47\xee\xf4\x3b\x40\x55\x1f\xac\xd5\xda\x5e\x4c\x11\xbb\x66\xc5\xf7\xae\x6f\x39\x04\x71\xb0\x3e\x20\x5c\xa5\xfc\xe8\x98\xc0\x03\x28\xb6\x55\xdd\xa6\xea\x18\x85\xb2\x9c\x43\x2c\x55\xd3\x1c\xc0\xce\x08\x5a\xad\x62\xef\x69\x3e\x87\x3c\x1b\x54\xfd\x61\xa2\xdb\x54\x54\xf6\x60\x7f\x3e\x27\x73\x37\x7d\xbb\xf7\x22\xd4\x3f\x97\x25\xec\x97\x65\xc7\x40\x0c\x21\xb7\x50\x80\xa6\x6f\x1f\x4c\x79\xb6\x3b\xf1\xef\xbf\x8f\xdf\xb4\x22\xe5\x80\x12\x8a\x35\xfd\xa5\xc5\xce\x21\x98\x25\xaf\x85\x34\x21\xee\xec\xb5\x39\x7f\xdc\x87\x92\xcb\x24\x27\x24\x9f\x63\x21\xdf\xb1\x50\xc8\x0d\x43\x2c\x2f\xab\x1f\xaa\x3a\x78\x0d\x6f\x9c\x8c\x61\x62\x91\xcc\x90\x41\xe7\x9a\xd7\x5a\x58\x93\x08\x8d\x8a\x84\x93\xb7\x10\x2c\x4d\x3a\x67\x53\x29\x57\x82\x86\x8b\xd0\xb9\xd4\xe7\x14\xa8\x91\x5e\x32\xdc\x2d\x4d\xc9\x93\xa9\x8e\x0b\xec\x0f\xa4\x49\x0e\x98\x60\x93\x48\xbe\x31\x43\xb8\xa5\x8e\xda\xdc\x64\xb3\x12\x75\x90\xf0\xc1\xc0\x9e\xfe\x07\xed\xb6\x14\x8e\x89\x5c\x61\x33\xb4\xa2\xb0\xda\xda\xda\xc1\x8f\x31\x83\x2d\xdb\x9c\x07\x82\x99\x9f\x16\x7b\x17\x50\xd6\x86\x76\x5c\x71\xc6\x8e\xd6\xa6\x53\xb8\x77\xdd\x33\x48\x5c\x4a\xaf\x7f\xf2\xd8\xbd\x74\x00\x7a\x16\x73\x20\xa8\x4b\xb0\x8a\x8b\xf0\x26\xbb\xac\xcf\x8e\xd3\xe8\x84\xf3\x45\x7a\xeb\xd6\xf9\xf9\x79\x72\x7e\x27\xa9\xd8\xf1\xad\xdb\xc3\xe1\xf0\x56\x7d\x76\x1c\xe1\xb7\x27\xfc\xb4\x0c\x15\xd9\xfb\xe6\x9b\x6f\x6e\xc1\xdb\x08\xbf\x2d\x0b\xfa\xa6\xbb\x90\x78\x1b\xe1\xb7\xe1\x7a\x7e\x7b\xf2\x58\x14\xfb\xfa\x16\xcd\x4f\x49\xbd\xc8\x67\x04\x8a\xd2\xba\xb3\x5f\xf0\xf6\x56\xb4\xc6\xe7\xd9\xad\x7f\xdd\x7b\xf6\xe4\xf9\xbf\x6e\x1d\xdb\x11\x3f\xd1\xbb\x54\x4b\x2f\x52\x5a\xe1\x01\x69\x85\x0b\x69\xc5\xb7\x59\x14\x68\x2c\x2a\x28\x30\x05\xb3\x57\x91\x30\xb2\x28\xf3\x19\x89\xcf\x65\xb6\x55\xd8\xa3\x85\x85\x7d\xd2\xb5\x69\xf8\xb1\x43\x0d\xee\x0a\x17\x47\x71\xf4\xfa\x35\x3d\x7e\x45\xcf\x59\xbe\x78\xfd\x1a\x54\x54\x5a\x26\x22\xa3\xfe\x5e\x96\x65\x42\x26\x18\x0c\x62\x9e\x2c\x18\x1c\xa8\x4a\xd5\x19\x23\x80\xfb\x88\x92\x60\xe3\xcd\x40\xd7\x2c\x3a\xff\xf6\xfd\xa0\xb1\xc4\xb9\x1f\x68\x78\x6c\x7d\x92\x33\xa2\xb6\x8b\xd8\x2c\x5a\xc0\xcf\x17\x8b\x47\x73\x8d\x91\xd5\x58\xc8\xbb\x17\xf7\xaa\x53\xf1\xdc\xc8\xfa\xe2\xed\x5c\x76\xfb\x85\xc1\xd9\x92\xf3\xde\x1f\x31\x0f\x09\xef\x92\x2b\xea\x92\x61\x85\xa7\x10\x4e\xc8\x6a\xd5\xe7\x9e\x04\xd9\x68\x64\x54\x9f\x17\x7c\x26\x18\x27\xa1\xb3\x7c\x51\x2f\x4b\x50\x2c\xa3\xcb\x59\x5e\x93\x5e\x99\x14\x47\xb3\xe4\xc1\xa9\x78\x4a\xe6\xa9\x23\xcd\x36\x47\xa2\xa2\xda\x15\x73\x7b\xc7\x5d\xad\x62\x29\x16\x3c\x88\x5b\xb3\x16\x9e\x33\xcc\x9d\x39\x43\xe1\x29\x93\x68\xff\xa4\x98\x63\x8a\x40\x5a\x58\x2c\xca\x0b\xcd\x9f\x10\xa6\x23\xe8\xf8\x5e\xea\xf4\x5f\xde\xaa\xef\x57\xa7\xa9\x73\xcd\x7c\xb4\x73\xa7\xc4\x64\x8e\xd4\xb4\xa5\x62\x52\xc3\xfd\x02\x30\xbd\x98\x00\x7d\xc2\x3d\x91\xdd\xe4\x89\x3c\x38\xc4\xb9\x39\x0a\xb6\x90\x18\x3e\x1b\xb3\xad\xa3\x0e\x2d\xa2\x9f\xd6\xbd\xf1\xd2\x5a\x57\x0e\xc9\x71\x11\x72\x56\x76\xc0\x48\xa1\xbb\xf9\xfb\x5e\x08\x8e\xf5\x85\x60\xdf\xde\x0c\xf6\x1f\x2e\xde\xe3\x66\xf0\xc7\xce\x37\x83\xd0\x4e\x9d\xe7\x3c\xd7\x8e\x55\x72\x1f\xc9\x7c\x7b\x81\x6d\x36\xef\x3c\xdb\xae\x6e\x28\xea\xf1\x71\x58\x57\xff\xf4\x20\x7e\x33\xe1\xd3\xd5\x8a\x63\x82\xd2\x0e\x7d\x7e\xcb\x6e\x74\xaf\x3a\x0d\xb7\xd8\xb6\x19\x79\x1f\xb4\x6b\x7a\x49\xde\x5e\xa1\x1a\x51\x5a\x1c\xe7\x6e\x3d\x8e\xcc\xd5\x65\xb4\x73\xc5\x32\x47\x46\x2a\x68\x4d\x18\xbf\x4b\x8e\x2a\xd6\xa9\x64\x03\x8b\x9d\x5b\x30\xe6\x7e\x18\x00\x63\xc0\xeb\x68\x5c\x7c\xef\x9a\xf9\x78\x33\x59\x84\xa3\xf9\x0c\x57\x21\x19\x5f\xcb\x59\x91\x8c\x3b\xec\x3b\x04\xa5\x04\x2e\x87\xb4\x75\x39\xfc\xfc\xe5\x09\xe9\x69\xac\x5d\xcf\x57\xbf\xf7\xe6\x85\x54\x1d\x9f\xe6\x7c\x76\xd2\xcb\xe9\x85\xd6\x17\xd7\x9f\x3b\x17\x43\xc1\x58\x3d\xf1\x37\x8a\x5c\x8c\x82\x35\x6e\x6e\xb4\xd5\xd9\x62\x56\x9c\x23\x6f\xf9\x41\x71\x58\x8a\x41\x6e\x34\xf3\xd9\x72\x6e\x26\x6f\x63\x6a\x0a\xaf\xa4\x38\x48\x8b\xa3\x58\x88\x96\x19\xbb\x11\xa5\xd1\x0d\x3e\x92\x92\xc4\x1b\xd0\x7b\x8c\x89\x67\xaf\x7a\x7a\xa0\x10\x20\xa9\xff\x5c\xae\x3e\xb8\xb8\x85\x5e\xf8\x64\xb1\xa5\x4b\x52\x83\xab\x19\xf6\x9b\x09\x9d\x8e\xd8\x58\x13\x8b\xdb\x13\x86\xb9\xe8\x47\xe3\x45\x6c\x81\xe4\x14\x47\xa9\x77\x8d\xd7\x3d\x6c\x7e\xc2\xbd\x0b\xc9\xbd\x32\xaf\x03\x77\x6b\xb9\x67\x66\xe2\xa5\xb8\xf9\xcb\x8c\x11\x2d\x92\xdf\xed\x5b\x9d\x20\xc2\x4b\xba\x0e\xc7\x4d\xf7\x32\xb1\x41\x5c\x26\x3f\x3e\x3b\x4d\xee\xe7\xf5\xc9\xbd\xbc\x26\x2b\xf9\xf3\x11\x20\xd3\x72\xca\x91\x58\x2c\x51\x87\xef\xd5\x21\xbe\x1e\x34\x8a\x8e\xa3\x42\xff\x19\xa5\x51\x04\xcb\x09\x86\x28\x3e\xcd\x68\x63\x48\x1b\xba\x85\x2e\xe9\xc0\xef\x93\xe9\x82\xfc\xd6\xf6\xc2\x6b\x22\x8a\xdc\x71\xeb\x42\x9d\xbc\xc6\xef\x55\x77\x7a\x7a\x39\xcb\xb4\x9a\x4b\xf8\x60\x66\x8d\x93\x25\xa8\x6a\x36\x6b\x38\x03\x9c\xa4\x75\x5c\x6d\x52\x77\x3e\x8e\xa9\x76\x07\x6a\x7e\xd2\x51\xd8\x6a\x8c\x1e\x5c\x3b\x07\x4b\x77\xf2\x15\x48\x1f\x7b\xba\xa8\xa8\xe0\x46\x05\xd4\x56\x65\x4f\xe2\xfc\x46\x74\x33\xba\x51\x08\xb1\xa5\x70\xa5\x20\x03\x02\xb3\x82\x4f\x25\x64\x83\x99\xe4\x67\x62\xb3\x64\xd1\x6b\x7a\xac\x7e\xdf\x94\xd7\x94\xc8\xb9\x4d\xd8\x9a\xc5\x77\x3a\x41\x1a\x7c\x24\x7e\x6c\xfb\x22\xa0\xbd\x70\xe4\xc8\x10\xef\x9b\xc7\xbf\xc4\x34\x59\xb0\x8a\x57\x62\xc9\x10\x6e\x30\x3c\xd0\xa7\x78\xf9\x68\x60\x75\x74\xcf\x70\x14\x5d\x09\x5b\x22\x19\x52\xbb\xd1\xc6\xa7\x81\x56\xcd\xec\x5e\xb5\xc7\xcc\x46\xec\x52\x6b\x20\x3a\x8d\x99\xbe\x8c\xff\x81\xf0\xa3\x8f\x43\x3a\xad\xab\x13\x53\x6b\xfa\xa0\x84\x3c\x3e\xb5\xb1\x8a\x65\x45\x92\x73\x9e\xcf\x4e\xa4\x48\x1f\x5f\x9e\x56\x73\x92\x46\xd5\x82\xd0\x68\x8d\x64\xd1\x96\x68\x0d\x57\x03\xb7\x16\x64\x54\xf3\x40\xa4\x82\x3c\x73\x87\x3c\x71\x9d\x0d\x47\xf5\xb7\x95\xbe\xf2\xd6\xfa\xca\x3b\xcb\xba\xc0\x16\x5a\x2b\x35\xf3\x8e\xe5\x6a\x52\x4f\xbd\xee\x7b\x52\xd0\xcc\x08\x9c\xc1\x1c\x44\xd5\x9c\x3c\x63\xbb\x01\x65\x74\xb2\x06\x39\x65\x63\x7d\xc7\x50\x5f\xa6\xf6\x7c\xef\x16\x67\xc3\xf7\x12\xab\xc1\x8a\x1b\x95\x5e\x41\xf6\xeb\x24\x47\xef\xcb\x26\x35\x42\x7b\xcd\x49\x00\x77\xad\x2b\x08\x8f\x6c\x43\xeb\xfe\xc7\xbb\x37\x8f\xd9\x15\x44\xcf\xce\xd6\xbd\x2f\xaf\x33\xf6\x9d\x84\xbc\x70\x45\xed\xde\xb8\x95\xed\xda\x19\x84\x1c\xc6\xf0\xf2\xfd\xb4\xd5\x01\xa0\xa2\xcb\x21\x02\xdb\x43\xdb\xc7\xba\x07\xef\xa4\x55\xde\xd5\xd2\xe9\x28\xa6\xaf\x04\x6e\x34\xc7\x59\x08\xe3\xa8\xad\x93\x3e\xcd\x5c\xc5\x1a\xda\x89\x9d\x34\x2b\x70\xfa\xf7\xe8\x49\xf1\xb3\x6c\x12\xe5\x25\x8f\xb0\x85\x93\x47\xa7\x84\xe7\x11\x8e\xea\x93\xe2\x88\x47\x53\xfc\x3c\xbb\x8c\xfe\x73\x18\xa5\xd1\xdd\x7c\xf6\x46\xe9\x27\xa3\xff\x08\x49\xf0\x65\x7e\x28\xfe\x7c\xfb\xd5\x51\x94\x46\xf7\x41\xa1\x0d\xbf\xf7\x44\xe9\x07\xf5\x2c\x5f\x90\x08\xdf\x27\xa5\x7d\xf9\xa0\x9e\xd9\x37\x8f\xc9\x11\x4f\xa3\x7d\xc6\xaa\x73\xf1\x67\x84\x5f\x14\xc7\x27\xfa\x09\xfc\x1d\xe1\x57\x0b\xf5\xfb\xd5\x22\xc2\xf7\xab\x73\xaa\x7e\x8a\x3f\x23\xfc\x84\xd0\x65\x1a\x01\xb3\x7e\xcb\xc5\x8f\x08\x1f\xcc\x58\x55\x96\x69\x24\xff\x7d\x5c\xcd\xde\x44\xf8\xd7\x82\xa6\xd1\xb3\x83\x68\x8d\x9f\x66\x97\xfb\x69\xb4\x17\xe1\xbb\x69\x74\x3b\xc2\xf7\xd2\xe8\x4e\x84\xef\xa7\xd1\x17\x11\x7e\x90\x46\x5f\x46\xf8\x61\x1a\xfd\x3b\xc2\xdf\xa7\xd1\x57\x11\xfe\x21\x8d\xbe\x8e\xf0\xa3\x34\xfa\x26\xc2\x3f\xa6\xd1\xff\x8e\xf0\x4f\x69\x74\x23\xc2\x4f\xd2\xe8\x66\x84\x9f\xa6\x51\x12\xe1\x67\x69\x74\x2b\xc2\xd1\xff\x1b\xa5\xd1\x10\xc6\xfe\xcd\x30\x4a\xa3\xa7\xcb\x53\x68\x79\x8d\x5f\x64\x97\x79\xc9\xc3\x77\xb0\xbc\xe4\x3f\x91\x8b\x35\x56\x33\x1f\x2e\x34\xe3\xac\x84\x52\x62\x55\xc2\x45\xc4\x1b\x28\x02\x2b\x16\x2e\x03\xaf\x44\xa1\x35\x7e\xf8\xcf\xdb\xe9\xda\x8f\x24\x01\xb7\xbb\x07\xda\x40\x1e\xfb\xc9\x6b\xb6\xef\x38\x66\xcc\xf0\xcd\x9a\x38\xa0\xc1\xa5\xa8\x7d\x2f\x2f\xcb\xc3\x7c\xf6\x26\x2e\x92\xa3\x65\x29\x66\x57\x4b\x4e\xca\xc6\x9e\x28\x00\x42\xdc\x30\xe5\xb6\x5e\x27\x6c\x49\x9f\x2d\x79\x5d\xcc\x89\x02\x3c\xb5\x3d\x45\xad\xed\xc1\x41\x64\xc7\x04\x17\xc9\xbc\x3a\x35\x1d\xc4\xa5\x34\x9a\xe8\x39\xf3\xbb\xdf\x6d\x0d\x22\x09\xaf\x1e\x57\xe7\x84\x89\xeb\x54\x8c\x74\xe0\x90\x24\x92\x08\x42\x58\xf6\x18\xac\xdc\x43\x00\x86\x4a\x81\x68\xb5\x8a\xde\x90\x8b\xb9\xd8\x43\x32\x7b\x89\xf8\xb9\x5c\xc0\x8f\x16\x0c\x4a\xcc\xe6\x6b\x5a\xb1\xd3\xbc\x2c\xde\x91\x9f\xc8\x45\xcc\x93\x45\xb5\x88\x11\xc2\x79\x16\x45\xa2\xee\x67\x9d\x46\x40\x9a\x71\x13\x09\x88\xa0\x11\xfd\xee\xe6\x1e\xa8\xf9\x55\xda\x4f\x8a\xf7\x10\xce\x6f\x64\xe4\x86\xe8\xf2\x1a\xfe\x2e\xf0\xb0\xef\xf4\x54\xf4\x5b\x87\xd4\x69\xf5\xad\x74\x7c\x44\x4a\x6f\x42\x41\x02\x55\xcb\x9b\xe5\xd8\x83\xb0\x42\xa1\x87\xf2\x5d\xf7\xd4\x46\x11\xa6\x59\x68\xc6\xdf\x90\x8b\x91\x03\x1b\xb3\x10\xb2\x58\xbd\x7d\x34\x27\x94\x17\x47\x05\x61\x1a\xfa\x11\xbd\xa2\x85\x7e\x38\x8f\x46\x3c\xa9\x79\xce\x78\x0d\x71\x66\xa2\x57\x37\x64\xde\xb1\x4c\x46\xc9\x01\xfb\xf5\xbd\x93\x9c\xdd\xab\xe6\x24\x36\x8e\xa8\x3c\xa9\x97\x87\xf2\xd2\x19\xdf\x46\x78\xef\xdf\x08\xe1\x3b\x59\x96\x91\xa4\xac\x66\xa0\xf1\x1f\x0c\x9e\x36\xb3\x9a\x49\xa3\x4a\xf6\x74\xc2\xa7\xd6\x64\xf3\x5c\xaa\x2a\x9d\xb0\x32\x51\x2f\xca\xb2\x2c\xa6\x19\xf5\xc9\x09\x8d\x69\x16\x49\x96\x2f\xb8\x5d\x96\x81\xab\x17\xcd\xa2\x79\xc5\x23\x84\x03\xcb\x2e\xe4\x35\x70\x08\x7b\x31\x61\xd3\x98\x40\xf3\x37\x32\xa6\x97\x97\xdf\x70\xae\xe6\xde\x66\xdc\x22\xfd\x99\xc7\x85\xc2\xd5\xba\x6b\x18\x17\x28\x83\xf0\x00\x4c\x6c\xc8\xef\x97\x39\x9b\x93\x79\xc0\x67\x9b\x4b\xa4\xa0\xc5\x0c\xb9\x54\xdd\xcd\x9d\x22\x52\xcf\xc4\xd8\xc9\x58\xfc\x25\x8e\x2e\x1b\x51\xe7\xef\x3a\xb7\xef\x67\x80\xed\x23\x0f\xf7\x45\x85\xaf\x67\x5f\xe2\xe8\x90\x55\xe7\xb5\x60\x8c\x2e\x68\xf9\xf1\x61\x61\x1d\x24\xf3\xe4\xf0\xfe\x1a\x3b\x6f\x8f\xbf\xd9\xb7\x6f\x9d\xf9\x12\xac\xce\xc0\xaa\x63\x84\x17\x49\x41\x0b\x1e\xa3\xb5\xe3\xf1\x6e\xaa\x01\xf8\x70\x08\x18\xed\x70\xc0\x32\x79\x71\xbf\xb0\x48\x6e\x84\x8d\x87\x82\x42\x21\x4f\xc5\x7c\xfe\x99\x4d\x26\x53\xb7\x7f\xef\x0e\x4e\x6c\xff\x22\x26\x2e\x51\x5e\xff\xff\x7a\x4c\x37\xb6\xdc\x93\x88\xc0\xbf\x1e\x53\xdb\x8e\xfd\xfe\x4c\x7c\x0b\x2a\xb8\xf4\xa5\x19\x98\x2a\xa7\x30\xd1\x2f\x86\x87\x18\x26\xb1\xe3\xbb\x87\xa1\xef\xa6\x6b\xec\x0e\xe3\xad\x2d\xfe\x56\x95\x3a\xc6\xfb\x18\x2c\x28\x53\x6f\x38\x0f\x7f\xaf\xbc\xf8\x03\x6f\x9d\xb7\xf7\xbc\x37\xfb\xce\x9b\x7d\x5b\xff\xbe\xdf\x0b\xa7\xea\xf9\xfd\x63\x5b\x4c\xfe\x94\x45\x61\x8c\x6e\x59\xa7\x9c\x2e\x73\x86\x5b\xa5\xf2\xe4\xc7\x87\xb6\xe0\x91\x9d\xdd\xc9\x74\x8a\xbf\xdf\xd9\x36\x0b\xcc\xd3\x31\xf8\xb4\x81\x58\x77\x25\x55\x4b\x27\xe0\xde\x49\x5e\xf7\xf2\x92\x91\x7c\x7e\xd1\x3b\x24\x84\xf6\xca\x2a\x9f\x93\x79\xd2\x7b\x74\xd4\xbb\xa8\x96\x3d\x4a\xc8\xbc\x27\x73\x42\xf7\x78\xd5\x9b\x55\xa7\xa7\x15\xed\xd9\x34\x5f\xbd\x7a\x39\x3b\xe9\xe5\x75\xef\xe9\xf1\xa3\xa3\x5e\x4e\xe7\xbd\xa7\xc7\x0f\x2b\xd6\x13\x2c\xb7\x97\xf7\xca\xfc\xdd\x85\xaa\xb2\x77\x0a\x2d\xe2\x9e\x54\x7d\xf6\xee\x41\x55\xaa\x1b\x05\xad\x39\xc9\xe7\x82\xa7\x6d\xf0\x6d\x3e\x20\xec\x8c\xb0\x97\x06\xa9\x7f\x7d\x2f\x67\xa0\x15\xd7\xd1\x19\xcc\xab\xce\x72\x2c\x3d\xea\x80\xe2\x6b\x7c\xf2\x1e\x1e\xcf\x8a\x4b\x11\xbc\x77\x1b\x35\xdc\x9f\xcb\x0d\xee\xcf\xa5\x74\x7f\xb6\x63\xf8\x13\x1b\x57\xe8\x3c\x21\xef\x70\x99\x9c\x7c\xff\x7d\x3b\xcb\xc5\x3b\x7f\xcb\xde\x8d\x81\x67\x3c\x7e\xf8\x3d\xd2\x8c\x52\x90\xd1\xdd\x2b\xd0\xd5\xae\xf8\xc2\x63\xc2\xa5\xa7\xd5\x16\xb0\xe9\xbc\x9a\x25\x5c\x14\x74\x35\xcb\xe1\x2f\x4d\x08\x0b\xf3\x4d\x46\x56\xab\x28\x7a\xdf\xc5\x08\x1e\x19\x30\x51\xbe\x33\xe7\xbb\x90\xd7\xa6\xe2\x9e\xaa\x03\xd1\x92\xce\xc9\x51\x41\xc9\x3c\xea\x6b\x05\xb6\xf4\xda\x19\x0c\xe4\xbf\x6b\x7c\xfb\x9b\xaf\xef\x7c\xbd\x93\x73\xe7\xc3\x61\x60\xda\x5e\xd3\x35\xbe\xfb\x2e\xf0\xe2\x29\x5d\xe3\xf2\x5e\xe0\xc5\x0f\xd4\xf8\x71\x5a\x1f\xce\xc2\xfa\x70\xe6\x19\x8d\xff\xfd\xd5\x97\x5f\x7d\x21\x3d\x3b\xbf\xf9\xe2\x8b\xe1\x6d\x84\xab\x8c\xc6\x5f\x7e\xb3\xf7\xcd\x1d\x87\x9c\x6a\x1f\x56\xde\xcb\x93\x8b\x76\x62\xbf\x11\x67\x17\x97\x34\x23\x31\x5a\xcf\x72\x3e\x3b\x89\x99\xef\xb9\xce\x13\x02\x2c\xc8\xd8\xe6\x63\x40\xfa\x97\xc9\x7d\x14\x53\x94\xc6\x43\x5c\x25\x33\x14\x83\xf3\xe7\x61\x3d\x63\xc5\x21\x98\x68\x24\xa9\xce\x32\x1a\xdf\xfe\xf2\x9b\xbd\xaf\x10\x9e\x8b\x3f\xff\x7d\x7b\xef\x4b\x84\x4f\x44\xb7\x87\x5f\x89\xc1\x2c\xc4\xb8\xee\x7c\xb1\x37\x44\xf8\x48\x8c\xe0\xeb\xe1\x57\x7b\x08\x1f\x8b\x3f\x6f\x7f\xf1\xc5\x1e\xc2\xa7\x19\x8d\xbf\xfa\xe6\xab\x7f\x7f\x89\xf0\x3d\xf1\xe7\x57\x77\xbc\x21\x1e\xb8\x66\xcd\xfe\x9e\x26\xa9\x96\xbf\x4c\x76\x1b\x24\xb6\xfe\xd0\xd1\x77\x30\x47\xe1\x51\x8a\x0b\x02\x38\xa2\xab\x15\x56\xf8\x9a\x5f\xb6\x23\xe3\x5b\x6d\xdd\x0e\xfa\xe6\xdc\x9e\x0e\x06\xee\xaf\x26\x98\x3e\x9f\xcd\x96\x00\x4f\xa9\x2c\x12\x87\x90\xb9\x46\xdf\x9c\xe4\xf5\x81\xf8\xc9\x42\x18\x9a\xbc\xec\x48\x93\xa9\xf7\xae\xb3\x36\xe0\x93\xae\x13\xa8\x38\x8d\xda\x26\xbd\x06\x5d\x83\xcb\x9b\x8f\x97\xf4\x1e\x21\x6f\x02\xc4\xad\xe5\x35\x0c\xbf\x10\xbc\x52\x8d\x3d\xc7\xa5\xbc\x45\x65\xc3\xa0\xe5\x43\x7c\xb0\x39\xe4\x96\x28\xd1\x11\x6e\x4b\x37\xd2\x1f\x62\x5b\xd6\x8d\xba\x43\x3b\xd0\x05\x3a\x6a\xa6\x9e\x30\xaf\x41\xce\x2e\x9e\x92\xb7\x12\x0a\x69\x96\x94\x68\xec\x8b\x38\xa7\xa4\xfb\x2b\x95\x85\x6c\x6b\xea\xc3\x6d\x51\x6d\xe5\x7c\xdc\xb8\x01\xbb\x58\xa1\x30\x9d\x89\x8c\xed\xa2\x12\x4c\x9d\x1d\xde\xea\x80\xd9\xe4\xb6\x9b\xbc\xa3\x9b\x36\x01\xd5\xbd\xe4\x31\xc2\xe7\x19\x8d\xbf\xf8\xf2\x8b\x3b\x5f\x22\xfc\x58\xec\xd0\xbd\xe1\xd7\x0e\x29\xbc\xed\x40\xc3\xa9\x47\x43\xb8\x50\x18\x26\x92\x72\xbb\x13\xff\x90\x18\x7e\x31\xda\x0d\x30\x19\x5f\x70\x12\xfd\xe5\x15\xcf\x4b\xdd\x79\xf8\xf1\xed\xd0\x11\xa8\x1e\x27\xbf\x7e\x88\x2d\xf4\x40\x6f\x21\x68\xe1\xfa\x66\x49\xa5\xaa\x09\xec\x90\xa2\xb5\x43\xe4\xc8\x18\x2e\x12\x71\xfd\x05\x44\x1a\xa0\x15\x71\x91\xcc\xaa\x25\xe5\xd9\x10\x17\x21\x38\x73\x17\xe5\x3a\xc8\x5d\x51\xa1\x26\x29\x68\x46\x87\x40\x81\x8a\x05\x7d\x29\xee\xf6\x2d\x1d\x73\x9d\xef\x39\xe5\x13\xf6\x2f\x3a\xf5\x42\x53\x55\xa7\x0b\xa9\xe3\x6c\xc9\x11\x36\xeb\xac\x4b\x52\x98\x3b\xed\x80\xdf\xc9\x77\x43\xd4\x70\x38\x81\x77\xdf\x39\x9d\x1b\xdb\x3f\x53\x5b\x42\x77\x19\xc6\x22\x7d\x3f\x29\x38\x7d\xca\x2c\x7d\x19\xbf\x71\xe3\x5f\x74\x24\x41\x1f\x31\x9b\xe4\x53\xb4\x26\x89\xee\x70\xec\x13\xf5\x23\x41\xd4\x5f\xfc\x5b\x10\xf5\x4b\x71\x5a\x7d\x79\xfb\x8b\xdb\x08\x3f\x13\xe7\xd2\x17\x5f\x7c\xfd\x15\xc2\xcf\x33\x1a\x7f\xfd\xf5\x50\x1c\xbd\x4f\x45\xd9\x3b\x7b\xdf\x0c\x11\x7e\x21\x8e\xb3\x2f\x6f\x7f\xf9\x15\xc2\x0f\xc5\xe1\xfd\xcd\x57\xff\xde\x13\xb7\x54\x1a\x7f\x79\x67\xf8\x85\xb8\xda\x89\x03\xfb\xdf\x7b\xb7\x11\xfe\x5e\x9c\x87\x5f\x0f\xbf\xf8\x06\xe1\x77\xe2\xab\x6f\xbe\xfa\xea\x0e\xc2\x77\x45\x81\x3b\x77\x44\x63\xaf\xc4\x57\x7b\x77\x86\x5f\x21\xfc\x97\x38\xf2\xbf\xfe\x46\x1c\x98\xbf\x8a\x3f\xef\xdc\xfe\xfa\x36\xc2\xbf\xfb\x61\x91\xe0\x48\x6a\xec\x85\xc2\xec\xe2\x25\x2b\x33\xba\x46\xf8\xb3\xeb\x50\x27\xce\x77\x3f\xe5\xc6\xee\x8f\x34\x2a\x4e\x17\x84\xe5\x32\x51\x54\xd9\xae\xe5\x4e\xb0\x96\x3b\x6e\x2d\x77\xa6\x9e\x17\x79\xf7\x0e\xc1\x0c\x21\xed\x6d\x5d\x54\xf4\x25\x2b\x8e\x8f\x09\xcb\x72\xb1\x5f\x48\xcd\x2b\xa6\x12\x2e\x65\x65\x70\x9b\xe8\xf0\xcc\x9d\x22\x70\xf4\xd4\xd4\x7d\xc0\x73\xc6\xe3\x62\x9e\x5a\x47\x18\x35\xdf\x38\xc2\xbd\x25\x2b\xd3\xde\xe7\x0e\x88\x46\x2d\x00\x8e\x3e\x47\x91\xa1\xb3\xdf\x11\xfe\xf1\xe3\xe4\x9b\x54\x53\xb1\x64\xe5\xfe\x11\x27\xec\x05\x91\x37\xbf\x3a\x2b\x82\x09\x25\xaf\x32\xf0\x07\x74\x7e\x9d\x61\xc3\x4b\xbf\x33\xc1\xa2\x7e\x91\xd6\x7c\xfd\xfc\x51\xe7\x8b\x91\xbc\xae\xe8\x07\x98\x24\xa5\xdc\x7e\x6f\xf2\xf8\xe9\xa3\x0e\x17\x4e\xfc\x0f\x41\x12\x20\x39\x5c\x8b\x28\xa0\x0b\x5e\x7a\x03\x00\x02\x89\xa7\x38\xf2\xe7\xe2\xb7\x8f\x27\x7b\x76\x6e\x96\x32\xa9\x81\x5f\xe4\x41\x69\x73\xfb\x1c\xbd\xa8\x96\x9c\xd4\x2f\xc8\xac\x3a\xa6\xc5\x3b\xf2\x69\x77\x0e\xee\x41\xe7\x5b\xb3\x0b\x4f\x9b\xb3\x4b\xae\x9a\xf9\xf6\x9f\x30\xbd\xa0\xe1\xae\xef\x9d\x90\xd9\x9b\x6b\xf3\xe3\x4f\x33\xbd\xfc\xea\xd3\x8b\x4b\x39\xc1\x55\x60\x82\xab\x1d\x27\xb8\x32\x13\x5c\x25\xf5\x49\xb5\x2c\xe7\xfb\x33\x5e\x9c\xc9\x23\xb0\x7a\xdf\x39\xff\xd4\x47\xc1\x96\x19\xc7\x3d\x7f\x88\xed\x72\xde\xeb\xe6\x12\xd1\xff\xc6\x1d\xf0\x82\xd4\x55\x79\x46\xfe\xe1\xd4\xcf\xfe\x8b\xa7\xf6\x1f\x46\xe4\xfe\xc4\x16\xbb\x2b\x7e\x99\x38\x8a\x82\x9a\xdf\x1d\x8f\x31\x19\xa1\xf4\x71\x95\xcf\x25\xb5\x2d\x72\x7e\xd2\x9c\x16\x68\x04\x62\x31\xd9\x9e\xca\x70\xed\x7f\x4b\x47\xc5\xda\x5d\xa9\x9b\xe5\xee\xdd\xac\x69\xbe\xa8\x4f\x2a\x7e\xcd\x9e\x02\x5e\x4e\xb1\x22\x73\x9d\x90\x7d\xfd\xdc\xef\xac\x6e\x48\xf6\x5a\x0e\x4e\x27\xa2\x0c\xbc\x82\x61\xad\x56\x51\xe4\x08\x93\x32\xbc\xf7\xdf\x35\x36\xbb\x0a\x1f\x69\x64\xf5\x27\x1b\xd9\x27\x5d\xb0\xd9\xdf\x30\xac\x8f\xbe\x56\xcb\xab\xb9\xa7\x42\x95\x0c\x30\x0e\x5a\x8f\xb1\xa8\x54\xbc\x2f\xed\x95\x4a\x67\x27\x15\x0b\xaa\xc5\xb7\x8f\x5c\xa2\xe3\x62\x59\x47\x6b\xd0\xf2\x31\x30\x65\xdd\x6a\x9b\x89\xeb\x37\x6e\x3a\x38\xf7\xf9\x64\x38\x15\x67\x45\xc7\x57\x93\xbd\xa9\x0c\x62\xd4\x9c\xa8\x39\xc9\xa2\x05\x2b\x4e\x73\x76\x11\xe1\x93\xdd\x49\x61\x91\xb3\xfc\xb4\xce\xf8\x6a\x75\xb9\x0e\x4c\xc9\x49\xbe\x09\x7e\xa6\x5c\x09\x0d\xa0\xb6\x01\xa3\xb1\xe7\xae\x6a\xc6\xcd\x6a\x12\x8c\x56\xe8\x29\xc7\x4d\x8a\x35\xa5\xf1\x93\x75\x4c\xc8\x54\x9f\xf2\xbe\x07\x36\x47\x63\x3e\x19\x4e\x53\x1e\xcc\x2b\x25\x03\x61\x7c\xf8\x16\xd3\x09\x9f\xaa\x06\x27\x53\xd3\xda\x1b\x72\x51\x77\x19\x16\xdc\x98\xbc\x4e\x2b\x4e\xa4\x0d\xb3\x60\x0b\xd2\x30\xc8\x9d\x18\x17\xfc\x23\x92\x45\xf4\xb8\xa9\x42\x28\xe8\x31\xdc\xae\x23\x5b\x07\x78\xed\xab\x41\xe9\xd8\x38\x1d\x5f\xa5\xbd\xe8\x86\x93\x32\x6b\x72\x44\xa6\x60\xdd\xb0\xae\xea\xc7\xc4\x47\x0c\x53\xd8\xb8\x1a\x3d\x77\x2b\x02\xc4\x9c\x8e\x9f\xf7\x1d\xb1\xb0\xb9\xa3\x65\x59\x02\x0e\x0a\x3e\x78\x92\xf3\xd9\x09\xe0\xd9\x4e\xf2\x1a\xd8\x3f\x23\x34\x46\xab\x95\xfe\xf4\x5b\xfd\x29\xf2\xa0\x6b\x36\x89\xdc\xe5\x5a\x65\x8d\x63\x81\xac\x71\x6c\x92\x4f\x71\x95\x91\x49\x0e\x31\x85\x4a\x0f\x35\x96\x46\x08\x15\x93\xd2\x41\x85\xed\xa1\x69\x56\x8d\xc0\x69\x4d\x94\xee\x67\x59\x05\xbd\x74\x9b\x56\x4b\x7c\x39\xab\x68\xbd\x3c\x25\xf3\x94\x98\xb4\x8a\xba\x07\x08\x2f\xaa\xfa\x39\xac\x65\x5a\xac\xed\x9c\x5d\x10\xc7\xe4\x88\x59\x46\xc6\x7e\x54\x66\x15\x2d\x1b\x17\x19\xf7\xde\x70\xfd\x46\xc6\xda\x59\xad\xfa\x85\x9d\xa0\x7e\x13\xdb\xd7\xdf\x33\xb3\x13\x98\x18\x51\xc3\x29\x89\xc9\x84\xc2\xe4\x4c\x31\x9f\xd0\x29\xb2\x9f\x1a\xe0\xb8\xe9\xf5\x29\x31\xae\xf4\xcd\xe0\xcc\x83\x41\x73\x1b\x40\x31\x62\xba\x66\x50\x88\xb6\x01\xa9\x9c\x3f\x8b\x09\x4a\xea\x8a\x71\x08\xd4\x78\x06\xc9\x29\xe1\x97\xf1\x9c\x4f\xc8\x19\x61\x8e\xd1\xd9\xb5\xa8\xb0\x09\x9f\x66\x59\x46\xd6\x06\x3d\x02\xfe\x1f\xb6\xcf\x87\xee\x76\x91\x7d\xb4\xac\x49\x72\x53\x15\x06\x78\x32\x15\xac\xc8\x7c\x78\x8f\x78\xa0\x5f\x45\xbe\xc3\x31\x99\xe8\x1f\x37\x55\xc4\x69\xfb\xcd\xbe\x9a\x20\x63\x7a\xe8\x15\xb4\x47\x50\x93\x07\xc6\x14\x0d\x06\x5c\xcc\xfc\x14\x53\xa7\xc9\x03\xe2\x45\xec\x2c\x92\x7b\x7f\x3d\x43\x31\x41\x63\x22\xd3\xa7\xfc\xfc\xfd\xef\xf0\x53\x5b\xce\x75\x0c\x4c\x26\xaf\x19\x82\x53\x89\x82\xb3\xa4\x3a\x42\x9a\x27\xfc\x42\xb2\x4b\xf2\x36\x9f\x59\xae\x63\x0f\x4a\x41\x01\x0f\x48\xcc\x93\x9a\x40\x18\xd9\x1a\x53\xf3\x27\x5a\xad\xfa\x4f\x3a\xde\x61\x86\x56\x2b\x9e\xc8\x5c\x1f\xcf\x8e\xf4\x66\x85\x1c\x8f\xcd\x87\x6d\x52\x2c\xc4\xa4\xd0\x64\xa6\x0b\x40\x0c\x01\xf3\x73\x52\x4c\x57\xab\xbe\x68\xd8\x79\x82\xa9\xf7\x8b\x85\xa8\x14\x8b\xcd\x4b\x78\x7a\x4e\xd6\xf8\x4d\x6b\xd0\x1e\xd1\xa8\xdd\x67\x3e\x09\x16\xf2\xb7\x9d\xe6\x41\x59\x23\x7a\xba\x7c\x3c\x18\x34\x4a\x37\x28\xd6\x7a\x2f\xc8\x0d\xa7\xf6\x1a\xa4\xb7\x3b\xa6\x15\x23\xf3\xf6\x99\xd0\x1f\xae\x9d\xf4\xb1\xaf\x49\xc3\x0d\xe2\x17\x32\x91\x7c\xb3\x9e\xc6\x24\x61\x55\xc5\x31\x97\xff\xd0\xe4\x34\xe7\xac\x78\x2b\xd9\x0e\x1a\x0c\xde\x88\xa2\xe0\x91\x2d\x1f\x89\x0f\x9c\x9f\x98\xbb\xbf\xd0\x60\xd0\x8f\x23\x98\x3c\xc9\x9b\x8f\x54\x8c\xe1\xc1\x80\x98\xbf\x61\x3b\xeb\x1f\x0e\x01\x9f\x37\x7b\xf9\x83\x7c\xe0\x52\x91\x53\x5c\xbd\xd5\xb4\x48\x4c\x29\xbd\xdb\x74\x54\x38\x0d\x45\x77\x4a\x68\x4e\x6b\x8a\x68\x4a\x00\x92\x2e\x30\x05\x12\x6d\x1c\x25\x82\xa2\x0b\x68\x0f\xad\x43\x0d\xc2\x80\x75\x93\x6a\x77\x10\xb7\xef\xb2\x0a\xf7\x91\x47\x8c\x86\xdb\x0a\x12\xe7\x3e\x89\x13\x4b\xc2\xb9\x20\x71\x31\x57\xee\x23\xcc\xbd\x5f\x41\x1a\x97\x47\x19\x35\x83\x6f\x0d\x00\x20\x3c\xea\x75\xfb\xa5\xae\xa8\x1f\xfb\xe3\x2a\xd1\x60\xe0\x0f\xab\xc4\x0c\x89\x05\x37\x3d\x9a\x93\x29\x1a\x0c\x7e\xf0\xfa\x3c\x27\x53\xcc\x71\x85\x99\xb3\xa4\x4f\x9a\x14\xc0\x9b\x7b\xc1\x45\x22\x0b\xca\x9c\x42\x5e\x01\x29\xf0\x10\x4e\x58\x2d\x63\x74\xaa\x1f\x1a\x03\xf4\xf8\xaa\x32\x7f\x65\x84\x7d\x87\xb8\xb5\xbc\xaf\x49\x37\x28\xf1\xdb\xf2\x4f\xf2\xc5\x66\x24\x88\x57\x74\xb5\x8a\x03\x4f\xb3\x85\xca\x9f\xe7\xee\x31\x0d\xa4\xf3\x4a\x1a\x41\x71\xeb\x95\xa3\xf7\x4c\x2c\x15\x2b\x00\x6e\x2d\x63\x97\x59\xa1\xff\xed\x35\xe3\x70\xea\xb5\xd7\xd3\xa6\x97\x59\xcf\x99\xf4\x8a\x93\x91\x9e\xf7\x49\x4c\x71\x90\x6b\xea\x40\x0a\x19\x5b\x87\x22\x88\x38\xfb\x71\x0b\x48\xb0\x79\x8e\x7c\x67\x1d\xd8\x9a\xaf\x76\x16\xaa\xcd\x7e\x4c\x74\xe2\xa8\x9d\x67\xfc\x79\x6b\x9e\xff\xd8\x38\xcf\xad\x1b\x15\x3f\x31\x97\x4f\x43\xdc\x19\x0d\x4c\x91\x79\xbd\x95\xfa\xdc\x92\x86\xf8\xdc\x87\x86\xf6\x9c\xfd\x64\xa2\xa3\x3a\xe5\xae\x30\x0f\x2d\x7a\xb3\x47\xd4\x03\xd2\xa0\x04\xc3\x53\xb9\x39\x26\x49\x5b\x96\xa3\x1e\xed\xc8\xf2\x13\x3a\x85\xbf\xd5\xe6\x7f\xb4\x29\x77\x13\x7e\x79\xbd\xd4\x3f\xe0\x0c\xd2\x0d\x68\x11\x37\xab\xdf\x89\x93\x2d\x18\x60\x3f\x42\x2e\x81\x0f\x5f\x54\x15\x3f\x90\x3b\x06\xe2\x6a\xc1\xc3\x9f\xed\x16\xb7\x0f\x75\x8c\x7e\x37\x29\x9c\xd9\xbc\x9b\x90\x59\x4e\xac\xf9\xa7\x44\x9f\xf1\xfd\x21\x12\x62\x72\xbb\xbf\x0d\xb9\xc4\x4b\x34\x63\xb0\x8d\x64\xc2\x3b\xae\xad\x14\x8d\x69\x47\x76\x1a\xab\x93\x78\x08\xbe\x5f\x51\x66\xf5\x10\x0f\x89\x8c\x4d\x99\xfc\x59\x15\x34\x8e\x06\x11\x4a\xb7\x14\xa7\x50\xfc\xa8\x28\x39\x61\x81\xc6\xfa\x7d\xb2\x76\x12\x2b\x4b\xba\x19\x47\x63\xab\x17\xb1\x4d\x89\xb6\xd6\xbe\x2c\x63\x9c\x70\x6c\x24\x12\xd3\x38\x33\x7f\xb5\xe3\x4d\x98\x13\x61\x1c\xfd\x2f\xf3\x29\xb8\x20\xe9\x17\x98\xd0\x59\x35\x27\xaf\x5e\x3c\x82\x24\xce\x69\xe4\x2a\x5a\x9e\x11\xa0\x97\x97\xc4\xee\x86\xe7\xfe\xf5\xc1\x1c\xc5\x1d\x19\x80\xde\xc1\x25\x5e\xcf\xe3\xad\xc8\x39\x52\x9f\x12\x27\x80\x99\x2f\xd1\x20\xcb\x9d\x74\xbc\x5d\xbd\xd2\xde\x31\x3d\x7e\xda\x3a\xb8\xfb\x7b\x62\x0c\x18\xb2\xb4\x6b\x8a\x70\x0b\x35\xd8\xbb\x10\xf9\xe6\xe0\x15\x04\xb0\x2d\x47\x4f\xe5\x45\x7a\x81\xbe\xf6\xf7\x10\xc4\x2b\x65\xf6\xd2\xe4\x45\x86\x89\x6d\x79\xa6\x07\x7c\x2b\x42\xa0\x47\x4f\xe9\x5a\x8a\x7a\x7e\xf3\x72\x50\x3b\x74\x55\xc8\x16\x99\xec\x2a\xb8\x60\xe9\x5e\xc2\x2b\xe8\xd5\xc6\x4f\xfb\x1b\x3f\xa5\xeb\x98\x60\x47\x90\x71\x32\x43\x41\x9b\xe3\x49\x70\x9e\xa7\xe9\xa4\x2b\x32\xce\x53\x71\x5c\x88\xf9\x9a\x5a\xaa\xdf\xcb\x32\x7f\x37\xb7\xce\xad\xc1\x40\x25\x73\xf5\x17\xd9\x36\x02\xf4\x80\x05\x19\xe9\x27\xc5\x64\x38\x75\xf7\xa6\x2e\xe1\xac\x45\xd1\x5c\x0b\x4b\x82\x2f\x3c\x62\xd6\x1b\xe1\x9e\x8e\x71\x22\x18\x8e\x0e\x2d\x72\xeb\x5f\x5f\x0c\x6f\x1d\xe3\xe8\xff\x89\xdc\x67\x77\xf6\x6f\x1d\x17\x72\xe4\xf6\xe1\xed\x2f\x44\xc1\xcf\xfc\x67\xf7\xa0\x20\x76\x5b\x7f\xe8\xb6\x0e\x5d\x71\x6b\xbe\x0b\x1f\x8c\xdc\x0f\xee\x6f\xf8\xe0\x3f\xb1\x68\xf4\x5f\xb7\xbf\x76\x9b\xfd\x0f\x92\x0f\xbf\xf1\xfb\xf2\x6f\xa8\x7a\xe0\x56\xfd\xa7\x5b\xf5\x9c\x04\x66\xc2\x96\xfd\xde\x2d\xfb\x27\xb0\x70\xd3\xe0\x0d\xd9\xe0\x30\x42\xce\x07\xef\x48\x88\xeb\x8a\xd1\x48\xdd\x93\x59\xaa\x6e\xb5\x6b\x17\xff\x57\x95\x8e\xdc\x5a\x1b\xcc\x59\xb4\x23\x7d\x1b\x35\x1b\x8a\xd0\x1a\x9a\xb6\xc2\x83\x74\x1d\x21\xd9\xad\xff\x33\xf9\x3f\xff\xb9\x15\xa3\xf1\x28\xfb\x5f\xd3\x1b\xb7\x2c\xdb\x7b\x45\x5c\xef\x4e\x08\xdc\x15\xdf\x75\xf4\x87\x52\x1d\x1b\x45\x50\xd1\x5f\xb2\xa2\x6c\x3c\x10\x95\xe0\x5f\xe5\x4f\xf5\xeb\xf7\xdd\xf5\xd5\x4b\x66\xa0\xba\x8c\x9c\xe6\x05\x2d\xe8\x71\xd0\x8c\xd1\x3c\xba\xb7\xc8\xa0\x4a\xb1\x27\x53\xb4\xe7\x25\xf0\x65\x1c\x45\x3a\xc0\x88\x69\x4b\x25\x3c\x5a\x10\x22\x31\x24\x4a\xab\x38\x8e\x50\xc7\x9b\xff\x15\xa1\xb1\x38\x30\xde\x92\x78\x32\xc5\x97\x6b\x94\xda\x5f\x5a\x60\xab\x89\xc3\xe7\xdd\x40\x17\x9e\x9c\xd1\x09\x91\xbd\x5c\x8f\xb4\x12\xbb\x35\x8c\x71\x84\xd0\xbc\xba\xb4\x2d\xd9\x0a\x05\x01\x9f\x9f\x14\x25\xe9\xf8\x54\x1c\xbb\xc6\xe5\xc6\xef\x95\x16\x74\xae\x3a\xa9\x62\x32\x02\x3b\xc9\x9f\xe2\x46\x0e\x5c\x6f\x7e\x02\x0d\x16\x47\x71\x60\x9d\xd4\x71\x79\xb9\x1e\x75\x2e\xef\x48\xce\xde\x64\x0a\x77\xf9\xe0\xe2\xc5\x62\x59\x89\x0a\xb0\x6c\xa6\xd0\x08\x83\x0a\xa3\xdf\xfc\xea\x56\x84\x06\x83\x7e\xf8\xd5\xa6\x77\x71\x84\x46\x48\x76\x37\x5f\xf0\x25\x23\x92\x0a\x37\xb5\x2f\x77\x9f\x1e\x65\xa8\x46\x9d\xd9\xd8\xab\xd2\xda\x37\x6a\xf2\x5c\x5c\xe2\xea\x58\x48\x9b\x4a\x4d\x6b\x7d\xc3\xbb\x26\x05\x8e\xcd\x76\x15\x7b\x08\xe1\xd8\xea\x4f\x57\xab\xa0\x62\xed\xbb\x21\x7c\x2f\xce\xb1\x4c\xed\x05\x71\xf0\x37\x02\xf9\x99\x61\x76\x92\xfd\x2b\xd2\x24\x9c\x91\xa6\x05\x9d\xa6\xb9\xd9\xf5\x51\x84\xda\xae\x92\x0f\x4e\x17\xfc\xa2\x27\xb8\x6e\x6f\xc9\xca\x9e\x12\xdf\x7a\xb3\x9c\xd2\x8a\xf7\x4e\xf2\x33\xd2\xb3\x7c\xb1\x65\xf4\x33\xad\xe3\xe8\xf3\x24\x6a\x44\x3e\xd0\x93\x4e\x64\xd2\xca\x3f\x48\x0c\x87\x8a\xb3\xf1\x9f\x38\xfa\xbb\xd6\xe6\x77\x5f\x06\xa6\x41\xab\xa0\x48\xd6\x49\xe6\x23\x43\x52\x7a\xa1\x60\xdf\x77\x6c\x6b\x78\xdd\x7d\x4f\x0a\x4f\x38\x57\xce\x21\x7a\xac\x5c\x93\x91\x8c\x71\x10\xee\x57\x16\x99\x60\xb1\x81\x5a\x19\xd0\x97\x0e\xcb\xa5\xea\x15\xb7\x09\x32\xf9\x53\x34\x30\xcd\xfe\x24\xb1\x1b\x5a\xa6\xc1\xd9\xba\x87\xd0\x7e\xa2\x4f\xae\xbf\x42\x27\xd7\xc7\x18\x6f\x77\x17\x7e\xdd\xa9\x0b\x9d\x93\x23\x85\xe9\xef\xe1\xb0\xcf\xc5\xbf\x32\x5f\x53\xcb\x22\x51\x20\x6d\x28\x23\x93\xa2\x19\xc7\xba\x44\xab\x55\x5c\x66\x93\x72\x8a\xc5\xdb\xac\x44\xb8\x94\xfc\x27\xd7\x81\x1d\xc5\xe3\x7c\xdd\xa2\x1c\x42\x37\xa4\x4a\xb8\x5c\x5b\x26\x6b\x38\x91\xe0\x77\xfd\xf0\x7c\x21\xc1\x63\xfc\x91\x1b\xee\x31\xd2\x77\x84\x36\xe5\x18\x8f\x0e\xfd\x64\xa2\x75\xbc\x60\x09\x8c\x6e\xe9\xb8\x1d\x48\xff\x31\x92\xc1\x3b\xda\xc9\xac\xe4\xee\x87\xc1\x01\x5b\x68\x6c\x7b\x09\xdb\x8a\x14\xcf\x2c\x32\x65\xaa\xa3\x26\x6a\x87\x10\x80\xbf\xbb\xb9\x07\x29\x78\x95\xb1\x11\x54\xd8\xee\x7b\xe4\x2f\x62\xd1\xf8\x0d\x45\x52\x71\x47\x29\xb2\xb9\x42\xc0\xe5\x59\x48\x68\x18\x71\xb1\x28\xcd\xdb\x44\xae\x39\xee\x38\x17\xcc\xd6\x11\x3c\x72\x84\x3b\x8e\xc5\x5b\xd6\x37\xdb\x06\x76\xf4\xd9\xe8\xb6\xb0\x5b\x76\xc5\x1c\xbb\x2b\xf1\x12\xf0\xba\x8d\x6e\x08\x64\x15\x3c\x27\x89\x39\xd2\x1c\x01\xb0\xd1\xae\xb1\xed\x1a\x3b\x32\xee\x0f\x9d\x1e\xc8\x09\xee\x40\x03\x84\x49\x92\xb4\x4f\x8e\xcf\x1f\xbc\x5d\x90\x19\x27\xf3\x46\x30\xdb\xe4\x73\xd7\xbd\xeb\xb3\x2b\x78\x5b\x4b\x5d\x76\x40\x9a\x05\x2f\xe4\x8d\x1a\x42\x51\x22\x81\xf1\x34\x22\xa5\x6d\x71\xe4\x12\xe7\xde\x43\x56\x9d\xaa\xe0\x66\x4d\x7d\xcc\x77\x7b\x63\x3e\xd1\x3f\x6e\xaa\x14\xbb\x76\x22\xbb\xc4\x32\xd3\xc6\x8f\x44\xfb\xbd\x41\x0f\x5d\x06\x67\x6e\xb4\x5d\x8a\x12\xa2\xc6\x83\x52\x07\x5a\x71\x54\xb0\x9a\x77\x04\x9e\xdb\xda\xe8\x60\xe0\xb4\x6a\x34\x16\x8e\x35\x66\x38\x95\x6d\xfa\xc3\xac\x65\xc4\xdf\x0d\xfc\xed\xe7\xae\x16\xb5\x31\xf1\xf6\x78\x32\x4d\xbd\x99\xdc\x7d\xf8\x2d\x15\x9a\xe3\x65\xd8\x97\x06\x71\xbb\xe4\x76\x35\x37\xec\xd3\x66\x77\xb7\x76\x21\xa0\x03\xfe\xd1\xea\xaa\xc0\x0e\x2f\x8b\xda\x24\x50\x1a\xef\xf0\xc4\xb1\xef\x22\x70\x3b\x15\x27\x01\x4b\xea\x18\x8d\xfa\xe2\x24\x4b\xc4\xad\x07\x12\x3d\x8e\xb4\xf1\x0f\xea\xa6\xaa\x46\xc8\x0b\xa5\xeb\x2d\xd6\xca\x27\x35\x47\x97\x2c\x21\xe2\x54\x3a\x2a\x68\x5e\x96\x17\x97\x2c\x39\xb2\xe9\xbe\x7c\x63\xfd\xcf\x9b\xfa\x3a\xe1\xd3\xf7\xea\xec\xcf\xad\xce\x36\xc2\x2e\x15\xc9\x92\xca\x88\x52\x1c\xe1\x1d\x07\x30\x99\xc2\x79\xfe\xd3\x55\x2c\x0f\x67\x32\x1e\x6f\xd3\xa6\x73\x2d\xa4\xdb\x4b\x46\x08\x04\x3b\xf7\x8f\x3d\x28\xee\xa3\x60\x2d\x45\xfc\x46\xbc\x03\x5f\xd3\x90\x6b\x5c\xdc\x94\x09\x85\x4f\x14\xb9\x25\xd5\x92\x97\x84\x4f\x05\x65\x63\x0e\xf3\x40\xf8\x47\x73\x92\x35\x60\x48\x86\x4b\x1e\xef\x8b\x53\x98\xa0\xeb\x39\xfc\xf5\x7c\x80\xa3\x2e\x6f\x5d\x45\x3f\x23\x4e\x4f\x39\x77\x15\x9e\x21\x25\xa8\x38\x6a\x0a\x2e\xf5\x06\xe2\xff\x51\x24\xfe\x3b\x07\xab\xab\x4c\x7f\x0e\x86\x82\x9b\x7b\xf8\xd2\xcf\x21\x9f\xf3\x38\x8a\xe0\xca\xf1\x13\x11\xfd\x9f\x22\xb4\x86\x8a\xb1\xcc\xad\x31\x4f\x7e\x8b\x27\xea\x46\x02\x95\xa2\x29\x84\x8c\x50\xaf\x2e\xd7\x10\x35\xc2\xf9\x55\x7a\xbf\x2a\xf3\x2b\x8a\x10\x96\x79\x93\x28\x8f\x19\x2e\x70\x89\x2b\x9c\xab\x2e\x26\x1e\x2b\x74\x60\xa7\x54\xa1\x17\xc8\x79\x8f\x48\xdf\xed\x9f\x48\x2c\x23\xd0\x52\x29\xc7\x52\xbe\xc9\x06\x2c\xfd\x5d\x70\x85\xeb\x4d\xfa\xa1\x85\x67\x07\x76\x4d\xc3\xac\x61\x1a\x2e\x9c\xf4\x08\xb9\xca\xbd\x05\x24\x98\x95\x5a\x4e\xd2\x21\x9e\x2b\xc5\x36\x8f\x96\x42\x82\x38\xd0\x23\xaa\x83\x67\xb6\xc1\xb7\x6e\x3e\xba\xfd\xba\x5c\x5c\xac\x8d\x9d\xb9\xc3\xf9\xbf\xe4\x84\x81\xbf\x2a\xcc\x6e\x4b\x0a\xd8\xf5\x63\x59\x5e\x9b\xfe\x02\xa7\xee\xae\x15\xd9\x6f\x1a\x95\xcd\xb6\x18\x73\xdb\x55\xe9\x2f\x1a\x15\xf9\xa7\xdd\xee\x03\x74\x24\x9e\x66\x85\xbb\x40\x01\x16\x4d\x14\x80\x7e\xe0\xa2\x46\x93\x45\xb1\x20\x71\x3c\xc4\xcf\x93\x57\x28\xc4\xee\x16\xd2\x0c\xe4\x5b\x69\x5d\x0b\xed\x07\x06\x27\x34\x77\xc1\x95\x3b\x78\x5d\x04\x83\xc7\x14\xc7\x5d\x2c\x32\x8d\x1e\x2e\xe5\xad\xc7\x3b\x70\x1a\x9b\xa3\xeb\xe8\x61\xdc\x1e\x3d\x3b\xe7\x3e\x1e\xbb\x3f\xd2\x88\x9c\x2e\xf8\xc5\x33\x5a\x5e\x44\x98\x66\x3e\x99\x40\xe6\x4a\x71\x81\xcc\xcb\xf3\xfc\xa2\x16\x77\x46\x0e\x41\x07\x98\x01\x11\xdd\xdc\x1b\xb1\xef\xb2\xbd\x91\x9b\xd1\x52\x30\xd1\x09\xbb\xb9\xa7\x52\x5b\x7a\x58\x78\xd0\x53\x15\x2d\x10\x3c\x62\x37\x6f\x02\x16\x55\xc8\x2a\xb9\x65\x3c\xe8\x90\x91\xfc\xcd\x88\xdd\xbc\x69\x60\xda\x41\x79\x8d\x91\xf9\x72\x46\x82\x00\xca\x4b\x49\x98\xa9\xba\x22\xe6\x75\x5d\x1c\xd3\xd8\xff\x75\xb9\xc6\x44\x03\x92\x35\x38\xa7\x46\x58\x70\xc6\xed\xdf\x89\x52\xe2\x2b\xf9\xaf\x42\x2a\x6e\xff\x4c\x15\x14\x5f\xbe\x56\x7f\xcf\xef\x8b\x2a\x04\x8d\xa9\x3e\x8b\x63\x4f\xf4\xe1\x72\x6d\xea\xbd\x5c\xaf\xd1\x3a\xd6\x08\x28\xa6\x15\x20\x3b\x1e\x1c\x78\x86\x97\x78\xfe\x77\x1d\x1f\xce\xaa\x67\x2a\xd0\xf4\xeb\x25\x2b\x95\xc6\x33\x9b\xa9\x47\x65\x5e\xf3\xe7\x39\x3f\x79\x04\x31\x6c\x96\x5a\x62\x97\x13\x90\xcd\xaf\x79\x4f\xfc\x9f\x73\xe2\x6f\x3f\x27\x3c\xb0\x4e\xfd\xc9\x8e\x80\x8f\x80\x4f\x93\x3e\x74\xf1\x92\x95\x69\x5b\x43\xd6\x7d\xad\x74\x44\x63\x07\x08\x21\x5d\x67\x72\x7e\x92\x36\xbd\x66\x9c\x0d\x33\x6e\x3e\x80\x85\x4a\xdb\xbe\x43\xf9\xc7\xb9\x33\x28\x07\xd2\x8c\x98\xeb\x02\xbb\xee\x75\xa1\xd2\x87\x1c\x93\x89\x05\x02\x97\x84\x52\x5d\x12\xd4\x95\xd5\xa3\xd0\x8c\x38\x40\xd2\xf6\xcd\xca\x6a\x09\x54\x25\x6b\xc7\xfe\x5c\x71\x57\xff\xdc\xd6\x89\x44\xbd\x4b\x27\x37\xb2\xaf\xab\xa8\xb8\x5e\x33\xdc\x13\x8b\xd6\x5b\xf7\x00\x0c\xd4\x02\xe4\xa8\xfb\x9c\x93\x1c\xc8\x76\x00\x92\xd6\x29\x28\xb0\x3a\xdc\x6d\x7f\xf4\x13\x38\x88\x1b\x22\xc0\x88\x38\x17\x09\x7c\x41\x62\x0f\xd3\x8c\x3d\xf8\x33\x58\xef\x5c\x99\x07\x42\xf9\xf8\x45\x30\x77\xb1\xce\x61\x10\xb4\xfe\xce\xe0\xa0\x65\xbb\x0b\xdd\xe4\xc2\xb6\xb6\xf0\x1a\xd2\x07\xa8\x7f\x1e\x6f\xf3\x96\xb0\xe1\x8c\x86\x23\x6a\x7c\x61\x46\x37\x6e\x48\x78\xf1\x85\x0b\x2c\x0f\x40\x87\x63\x0e\xea\x69\x2a\xfe\x0b\x7d\x12\x5b\x51\x75\x48\x3c\x92\x9d\x17\xc7\x15\xa6\xf2\xb0\x16\x85\xc4\x1f\xba\x14\x3c\x34\x99\xa6\xf4\x6c\xb7\x96\x02\xbb\x5f\xb5\xde\xaa\x5a\xcc\x8a\xcf\xbc\xfb\xee\x05\xd1\x78\x83\xda\x0a\x1a\x83\x41\x10\x69\xaa\xe0\x86\x5b\x30\x85\xb6\x46\x85\x2d\x96\xd0\x42\x17\x5e\x1c\xc3\x5c\x60\x98\x1f\x7b\x61\x1e\x0c\xfa\x71\x5f\x1f\x68\xfd\xac\xcf\xd5\x9f\x68\x30\xb0\xcf\x57\x2b\xd1\x7f\xf5\x03\x9b\x22\xce\xf8\x96\xdc\x4d\xad\x25\x3a\x2b\x23\x08\xbc\x20\xcb\x9a\x48\x36\xa9\x76\xb1\xd6\x16\x59\xca\xb7\x0e\x55\xf0\x62\xc4\x5a\x37\x4c\xf5\xe9\xa8\x0d\x99\xf2\x10\xd8\x61\xa5\xa2\xce\xab\x83\x8b\xec\x49\x4c\x03\x1a\xae\x42\x69\xb8\x58\x56\xb4\x34\x5c\x79\xc6\x54\xdb\x72\xb7\x76\x0d\x2a\x6f\x0d\x4a\xf5\x4a\x4d\x8c\x10\xe8\xa4\xea\xab\x44\x97\x45\x42\xe2\xd2\xaa\xbe\x0a\x57\x77\xb7\x34\xec\x4a\x0d\xcf\x55\x6d\xfc\x44\x62\x86\x0b\x8d\xe9\x97\x21\x1a\x20\x31\x8e\xee\x07\xd2\xbd\x16\x92\x25\x67\x05\x39\x33\x5d\x44\x3a\xfe\xb8\xb8\x08\x68\x23\x58\x2e\xcf\x12\x93\x3c\x88\xc7\x1c\x97\x08\x97\x32\x92\x5c\x95\x05\xce\x2f\xa5\xef\xd0\x4a\x10\x22\x77\x95\xfd\xa9\x77\xbd\x7d\xe2\x31\x1c\xfb\xd8\xf2\x13\xfb\x4c\x4a\xcf\x5a\x09\x86\x89\x95\x1e\x31\x41\x6b\x33\x14\x5c\x67\x1b\x56\xbb\x39\x93\x8d\x19\xac\x70\xed\x10\xee\x9c\x3b\x6c\x49\xae\xa1\x73\xbc\xf6\x8d\xbe\xd4\x7d\xda\x69\x31\x63\x44\xe6\x29\xea\xe9\xc0\x19\x73\xa0\x12\x4d\xc7\x3d\x99\x3f\x68\xae\x43\x07\xcf\x8b\xa3\x23\x22\x76\x52\x0f\x2a\x8f\x94\xc9\xb2\x71\x20\x41\x1f\x1a\xcf\xae\xdd\x83\xf3\x82\x9f\x78\x2d\x4b\x90\x79\xaf\x3a\xea\x19\x89\x13\x8d\xcc\x81\xdb\xd8\x87\x6a\x86\x5a\x3c\xba\xd1\x3b\x60\xd6\x73\xf7\xe8\x04\x8e\xed\xfe\x72\x56\xe0\x84\x3b\x68\xb0\x0a\xae\x48\x0e\x62\xd5\x60\x00\x07\x83\xbe\xa6\x8b\x1a\xfe\x56\x58\x05\x71\x47\xb0\x95\x2d\x76\xad\xcc\xd4\x65\xbf\x3d\xe2\xda\x4d\xc7\x44\x87\x72\x54\xb9\x6c\x30\xd8\x17\xdb\xcf\x67\xd2\xf9\x84\x4f\xb3\xa6\x93\xe0\x98\x6c\x85\x18\x13\xb4\x76\x61\x8a\x00\xf0\x56\xc8\x6b\xa9\x20\x84\x50\x8f\x3c\x3d\xe3\xea\xb7\xcc\x3e\x9e\x8b\xdd\x6f\x3a\x7c\xc6\x7d\x8f\x54\xdb\xd9\x4e\xf0\x67\x81\x2e\xd9\xa4\x98\x66\x60\x09\x18\xd3\xd4\x54\xa1\xda\x7f\xeb\xb9\xc7\x30\x79\xaf\x3c\xde\x78\xaf\x0c\x85\x95\x2c\xea\xfd\xc3\xba\x2a\x21\x3a\x85\xca\x25\xa4\x9c\x19\xee\x57\xcb\xc3\x92\xdc\xaf\xb8\xb9\x5d\xce\xaa\xd3\xd3\x9c\xce\xe1\x6a\x39\x18\x58\x30\xed\x60\x70\xc2\x63\x36\x19\x4e\x03\xb0\x15\x71\x2d\x09\x82\x55\xa4\x4b\x98\x83\x59\x89\xb4\x91\x9a\x25\x47\x05\x9d\xc7\x0b\x2e\xcd\x14\x83\x41\xd1\xcf\xb2\x7b\x70\x79\x6e\x55\x7f\xa9\x68\x43\xdc\xb3\x21\x7e\x38\xaf\x7a\x87\xa4\xc7\x4f\x48\x4f\x5c\x4b\x7b\xaa\xcb\x51\x08\x6f\xcf\xab\xa0\xfd\xc9\xbf\xb1\xd8\xf9\x19\x0c\xf6\x34\x7e\x4b\x4f\x84\x41\xbf\x46\xb7\xa2\xc6\xab\xc9\x70\x6a\x65\xfc\x0b\xde\x8a\x69\x18\x70\x11\x52\xb3\xf4\x3d\xab\x96\x0b\x73\xbd\x67\xd5\x8c\xd4\x06\x60\xad\x57\x42\x86\x8b\x65\x6b\x47\x04\x3f\x75\xcf\x75\xb2\x5a\xc5\x24\xf3\x00\x7d\x08\x43\x50\xd2\xa6\x0b\x96\xd8\x5f\x41\x04\xf7\xa1\xae\x6f\xd4\x04\x84\xb4\xf2\x8f\xe3\x22\xe3\x38\xcf\x2e\x01\x1f\x92\xf6\xf7\xf0\x42\x6b\x03\xd2\x21\x56\x13\xa2\x7e\xae\x47\xc5\xb7\xad\x3e\x8c\x64\xde\xd1\xef\xac\xab\x9b\xea\x43\xae\xd2\x80\xd8\x2f\x26\xc5\x14\x57\xa0\xb5\x12\xb4\xb1\xe0\x71\x85\x94\xce\x49\x94\xac\x33\xbb\x51\x2b\x84\x67\x19\xfb\xd6\x2a\xbe\xc6\x74\xc2\x6e\x28\x07\x59\x20\x2c\x41\xb8\x52\xe3\x96\x65\x59\xad\xaa\x29\x8e\xe2\x7a\x30\x98\x0d\x06\x2d\x9e\x34\x73\x4a\xcf\x34\x4f\x92\xa6\xf8\x5f\x78\x5c\xe3\x19\x2e\x91\xed\x38\xbb\x91\xdd\x5e\x6b\x0d\x99\x2c\x70\xb9\x6e\x94\xb8\xb1\x2e\x6e\xdc\xd0\x3e\xdb\x6a\xf2\x86\xce\xe4\x15\xfe\xe4\xb1\xb5\x96\x34\x70\x61\x7c\xea\x58\xe2\x96\x51\x9e\xed\xa7\xd2\x73\x9d\x25\xa6\xae\xf6\xa4\x6b\xbe\xd9\xe2\x25\x8e\xcb\xb8\xf9\x1c\xb9\xa6\x9b\xdc\x03\x79\x77\x56\xe0\x7d\xee\x40\xc6\xf1\x21\x8f\x73\x3c\x14\xfc\x51\x33\x6c\xdd\x61\x37\x1b\xcc\xb8\xcd\xe4\x2e\xd7\x28\x35\x65\x9b\x9e\x07\xe3\x7b\x9a\x60\x75\x99\x31\x90\xb0\x68\x28\x35\xef\x1c\x37\x6c\x77\xbf\x0c\x5d\x3f\x4b\x47\x08\x69\xb5\xdf\xda\x0c\x56\x0f\xcd\x63\x22\x58\xe0\x58\xfc\x57\x93\x47\xba\x8c\xa5\x29\x4c\xc8\x44\xb0\x6e\x1e\xe7\x77\xce\x28\x60\x08\x2d\x37\x10\x99\x90\x45\x9c\xc2\x58\x09\x84\xe2\x49\x31\x61\xd3\xec\xd4\x3b\xb5\xd9\x54\x85\xf7\xde\xe0\x4e\x20\xc4\x6b\x4d\xc0\x6c\xc2\xa7\x50\x13\x9f\x66\x24\x7c\xa4\xb8\xe7\x97\x99\x3f\x67\xdb\x07\x28\x86\x23\x1d\xa0\xd6\xee\x6c\x45\x65\x93\x42\xef\xd8\xdc\x00\xbb\xf6\x79\x9c\x9b\x8d\x34\xf2\xa7\x9d\xe1\x12\xa4\x67\x20\x09\x38\x60\x28\x1c\x30\xca\xdd\x43\x59\x05\x1d\xc6\xc0\xa5\x83\x16\x3e\xd0\x25\x11\x2e\x6e\xdc\x90\x4a\x6a\x29\x22\x43\xdb\x63\xd3\x22\x80\x8d\x2c\xbf\xc8\x85\xac\x5a\xf8\xfc\xa2\x30\xfc\xa2\x1a\x0c\x6a\xe8\x45\x8d\xc6\xb1\xdf\x87\x4a\x34\x59\xcb\xf6\xb2\xdb\x28\x6d\xbd\x06\xe6\x5b\xdc\xb8\x81\x8c\x4e\xdc\x8c\xf1\xd2\x55\x76\xec\xf3\x90\x61\x1a\x3c\xf8\xfd\x9b\x64\xdb\x5b\x68\x30\x88\x49\x36\x21\x96\x4c\xc4\x13\x71\xb3\xcc\xee\xc9\x0b\x80\x39\x06\xf0\x10\x83\x7f\x94\x1b\x2f\xe3\x60\xd7\x86\x8d\x09\x9c\x4e\xb3\x86\x48\xe4\x54\xf7\x0b\x6f\x26\xc8\xd3\x11\x35\x06\x83\x0b\x38\xfc\xbc\xfb\xae\x68\xf7\xcd\x16\x7d\x78\x38\x84\x0e\xdc\xee\x0e\x38\xcb\x39\x39\xbe\xd0\x27\xa6\x12\x84\x41\xf3\xa4\xe5\x96\x25\x53\xaa\x28\xad\x13\xaf\xd8\x79\xce\x64\xca\xb1\xac\x08\x88\x06\xb9\x92\xc9\xb7\xa0\x92\x9c\xb6\xa4\x76\x4c\xc7\x9a\x36\x2d\x8e\xfd\x9f\xb2\x94\x24\x29\xa9\x8d\x27\xba\x29\xe0\x64\x32\xb4\x26\x8c\x5a\xdc\x9d\x94\xe2\xcd\x6d\x06\x74\x70\x3a\xca\x7d\xd7\x97\x4e\x42\xd1\x40\xa1\xed\xe9\x15\x71\x91\xfd\x06\x90\xd1\x2d\x90\x08\xad\x08\x73\xf1\x10\x23\xe6\x0c\x4a\xf5\x8a\x60\xc1\x68\xc4\xc1\x35\x87\x54\x81\x3d\xf1\x53\xb2\xaa\xa2\xe9\xb5\xdb\xfc\x7a\x9f\xce\x1f\x71\xcb\xe7\x21\xde\x7b\x68\x80\xbb\x8c\x4d\xf5\x14\x82\x98\x70\x07\x42\x05\xa7\xa6\x60\x34\x08\x8e\x4f\x6b\xce\xd2\xdc\x2b\x39\x26\x5c\x25\x22\x8c\x99\x1a\x28\x1a\xe5\x0a\xfc\x19\x5e\x44\x50\x26\xd8\x63\x4f\xea\xa9\xb6\x94\xa7\x48\x45\x78\x69\xd5\x1c\x9a\x0b\x2f\x9f\xfa\xc6\xa2\xe1\x18\xf0\x1d\x3b\x49\xe9\x2b\xee\x13\xd0\x57\x90\xa6\xbe\x64\xac\x7a\x26\xde\xee\xd3\xf9\x01\xaf\x98\x6c\xf2\x60\x79\xc8\x19\x91\x4a\xb0\xb4\xa3\xfb\xcf\x60\xea\xe4\x75\xdf\xf6\xbc\xab\xaa\x4d\xc9\xfe\xb9\xbb\x26\x3e\x09\x4a\x05\xca\x60\x40\xf5\x6f\xa3\xb6\x92\xbf\x55\xe7\x63\x29\x47\x19\x0a\xaf\xa8\xec\xdd\x7d\xd3\xeb\x79\xac\x7c\x27\x42\x93\x24\x3a\xdb\x9a\x1d\x7c\x69\x88\xe7\x05\x39\x4a\x19\x86\x2f\x53\x02\x69\x20\xc9\x5b\x5e\xa7\x85\x9b\xa3\xac\x6b\x82\xc2\x03\x77\xe2\xc7\x6f\x18\x3c\x66\x19\xa8\xf5\xe4\x43\xd3\x9d\xb1\x1d\x69\xca\xe5\x06\x27\x08\xe7\xd9\x10\x97\x1e\x1c\xb7\x40\xa3\xfc\xdb\xb2\x15\xaf\xa8\xca\xca\x49\x3e\x6d\x32\xad\x10\x55\x16\x93\x6a\x2a\xee\xa3\xce\x02\x08\x29\xc6\xce\xbd\xfe\x38\x46\x78\xdb\xec\x63\xaa\xf2\x49\xbf\x20\x47\xd2\xd1\x9f\x6a\x43\x2c\x33\xbf\x21\xb4\xa2\xf8\xe1\xe4\x93\xfc\x98\x5c\x8f\x25\x01\xf6\xd6\x00\x85\x09\x5e\xc7\xbc\x73\x06\x8e\xe1\x59\x9b\x62\xe0\x30\x6e\x29\x66\xd4\xfe\x6f\x55\x50\x05\x2b\x68\x0e\xfb\x7d\x79\x61\xcd\x63\x26\xe8\x68\x0b\x47\x7c\xc6\xee\x81\x9a\xac\xcd\x19\x3b\xcf\xa7\x6e\xa6\xb8\x95\x25\x06\xfa\x51\x6e\xeb\x87\xf6\x74\xe8\x64\x72\x4a\x29\xcb\x9a\x3a\xee\x2a\xeb\xfa\xce\x68\x6b\x9d\x6f\xb6\x30\x09\xe6\x58\x8a\x04\x99\xe2\xb2\x4d\xf6\x2f\x88\xec\x0a\x99\xc7\x55\xa2\x99\x85\x28\x69\xe9\xbf\x4a\x5c\xde\x82\x4b\x45\xf9\x95\x8a\xfc\x29\x97\xb3\x34\x5b\x4e\xff\xa5\x6a\x88\x1b\x9f\x7b\x9f\x21\xfc\x9a\xc7\xea\x89\x5c\x94\x4b\x79\x9f\x76\xe9\x5e\xb3\x1f\x9e\x69\x03\xc3\x88\x8f\x78\x66\x8c\x0c\x86\x31\x3b\x0a\x58\xc3\x89\x5f\xcb\xc4\x6b\x4a\x2d\xab\xe5\x60\xff\xb1\x29\x6c\x97\xd9\xc5\xc9\xba\x7f\xbb\xb3\x8f\x67\x59\x3d\xae\x13\x99\xd2\xcd\x7e\xab\xf2\x06\xaa\x88\xb7\x4c\x12\x77\xd9\xe4\x27\x7a\x16\x99\xf8\x4b\x73\x96\x59\x70\x1a\x15\x81\x02\xbc\x9f\xe1\xd9\x06\x29\x4c\x65\x8b\x2b\x1d\x42\xdf\x4a\xe9\x92\x9b\x85\x50\x43\xaf\x41\x3c\xaf\xad\xa1\x12\x07\x18\xd4\x6b\x2e\x25\xe9\xf3\xb6\xaa\x29\x2c\x3c\x9b\xb0\x2a\x72\xde\x32\xea\x2a\x93\x7e\x70\x95\xb3\xfa\xa9\x73\xdf\x70\xc2\xeb\x70\xd7\x62\x0e\xb9\xf3\x72\x3a\x13\x85\x1e\x13\x19\x27\x87\x67\x07\x17\xa7\x87\x55\x19\x47\x8f\x9e\x3e\x7a\xf9\x68\xff\xf1\xeb\x5f\xf6\x1f\xbf\x7a\x10\xb9\xd9\x74\xb8\x9b\x4e\xf2\x69\x72\x1e\x42\x7a\xc5\x43\x7c\x92\xe4\x7f\xa2\xb8\x4b\x67\xdb\x23\x06\x2c\xf6\x22\xf9\x0b\xc5\x7b\x08\xc7\x43\xfc\x30\x79\x86\xe2\xc7\xc0\x66\x91\x7c\x7f\x10\x87\xe4\x09\x9b\x65\x8b\x07\xe0\x49\x70\x07\xd1\xcd\xf4\xb3\xec\x31\x1f\x93\x14\x64\xc6\xc7\xdc\xa4\xe0\xa2\xab\x55\x7f\x4f\x7a\xec\x14\x8e\xc5\xf4\xe6\xde\x60\xd0\x7f\x22\x58\xea\x98\xa4\x0c\xad\x85\x80\x8e\x1f\x73\xe8\xdd\x79\x72\x12\x44\xb5\xc9\x36\xd6\x50\xa6\x0b\xf9\x06\x53\x3f\x26\x69\x7f\x28\xe3\xcd\x61\x3b\x70\x1d\xa4\xe8\x0f\x8e\x1f\xf0\x2c\x8e\xff\xe0\x1b\xe2\x95\xa0\x50\xa2\x3a\xcf\x8c\x14\x93\xd5\xea\x0f\x8e\xd6\xf8\x0f\xae\xca\xce\x4e\x17\x59\x91\xfc\xb6\x38\x55\xa9\x02\xff\xe0\xb8\x26\x25\x11\x3b\xae\x4e\x27\x93\x88\x1e\xdf\x34\x1b\x31\x9a\x4e\xf1\x9c\xcc\xca\x3a\xdd\xc3\x67\x39\xab\xd3\x21\xe6\xe4\x74\x51\xe6\xbc\x29\xe0\xec\x0d\xc8\x60\x50\x24\xaf\x5f\xfd\x11\x0f\xb1\x44\xa6\xb2\x9b\x72\xfb\x45\x68\x8d\x6d\xa6\xc7\xb6\xb6\x76\xf2\x03\x9d\xae\x31\xa1\xb3\x7c\x51\x2f\x4b\x08\x1b\x99\xde\x5e\x23\xfc\x07\x77\xe8\xec\x11\xf7\xf9\xd8\x75\x31\x78\x11\x6e\xd8\xbc\xa9\x16\x93\x58\x46\x26\x74\x3a\x7a\xc9\x63\x86\x9f\x71\x08\x2d\x85\x9c\x28\x8b\x2f\x95\x0d\xcb\x6e\xe0\xc1\xe0\x91\xab\xc8\xc1\x2e\xf8\xe0\x19\xf7\x73\x35\x8d\xc9\x6a\xc5\xe1\x22\x3d\x26\x83\x41\x5f\xfd\xe9\x5c\xc4\x21\xc0\x42\xda\x27\x83\x81\x7a\xc7\x35\xea\xc4\x2f\x62\x43\x97\x00\x98\x2f\x8d\xa2\xd4\xd9\xd2\xcf\x83\xa0\x0b\x0f\x1f\x2f\x36\xe0\x73\x8e\xc4\x75\x77\xbc\x0d\x39\x87\xf0\xa5\x15\x3c\xd7\x28\x0d\x94\xd0\xa0\x00\x87\xf3\x0f\x06\x31\x5f\xad\x68\x22\xce\x07\x13\xb9\xcf\x95\x28\xf5\x5f\x26\x40\x86\x83\x5f\x7b\x20\xba\xe6\xc4\x2b\xf1\x78\x94\xfa\x6e\xb5\x9a\x3b\x63\x7e\xe1\x59\xfd\x49\x77\x38\x18\x59\x19\x44\x74\x74\xe2\x41\x2e\x96\xf5\x89\x0a\xda\x48\xf1\x59\xbc\xf5\xfb\x3e\x7c\x0f\xce\xc4\xa2\xc5\x87\x5c\x29\xcf\xc9\x3c\xed\xef\x61\x1d\xbe\x53\x01\xed\xea\x74\x32\xc5\x65\xae\xd0\x67\xe9\x10\x3b\x7e\xbe\x97\x6b\xac\x83\xee\xe6\x25\x58\x6e\xcd\x47\x97\x6e\xb4\xbe\xfb\xbe\x01\xca\xb8\x20\x73\x37\x86\xa8\x89\x7f\xca\xbd\xf8\xa7\xa4\x19\xb4\xce\x02\x70\xd0\xb8\xb5\x9a\x0f\x39\x4a\xed\x60\x86\x1f\x70\x30\xd2\x3a\x14\x73\xa9\xdd\x25\x6c\xb5\x3a\x26\x28\xa6\x60\x6f\x83\xe8\xa3\xc6\xfd\x26\xd4\xa9\x91\x31\x13\xee\x93\xb8\x48\x4c\x14\xd4\x90\x99\x90\xa8\x58\x4f\xca\xfc\x50\x68\x37\xbb\xb9\x45\x1e\x6d\xa1\xfa\x1c\x61\xfb\xd5\xa4\x55\xc1\xcd\x3d\x0f\xf3\x91\xea\xe4\x36\x1b\x27\xce\xd6\xe2\x4c\x60\xab\x6a\x77\x42\xcb\xce\xf9\x54\x6a\x42\x40\x52\x98\xa9\x40\x0e\xf7\x63\x63\x26\x26\xdd\x89\x33\xc2\x6d\x68\x44\xb9\x12\x2d\xee\xf9\x45\x90\x7b\x7e\xe1\x72\xcf\x2f\xa6\x69\x34\xab\x18\x03\x87\x44\xf0\x44\xa6\x8e\x19\xb1\x03\x2f\x42\x93\xba\x3a\x25\xa1\xe0\x95\xdf\x6b\xb2\x1e\x0c\x9e\xf2\x98\x22\x60\x06\x12\x91\x01\x71\x10\x7d\x1b\x07\xc7\x7e\x03\x76\x28\x97\xeb\x51\x01\xc6\x0c\x86\x59\xf2\xba\xae\x96\x6c\xa6\x1d\xfb\x33\x02\x8f\xe4\x0f\xb0\x66\x1c\x9c\x14\x47\xdc\x9c\xee\x92\xae\x70\x99\x3d\x89\x1d\xa4\x4a\xa9\x90\x2a\x79\x56\xb6\x90\x2a\x55\x96\x5b\xa4\x0a\xec\xc2\x4a\x69\x47\x9f\xf2\xb8\x92\x63\x40\x4a\xfe\xf6\x74\xb7\xa3\xba\xdd\xb7\x7a\x53\xdf\x70\x31\x81\x2a\xa7\x59\xbd\xd6\xa8\x96\x19\xba\x2c\x13\x12\xcf\x2c\xaa\xa5\x74\x51\x2d\x85\xb4\x31\x31\x6d\x10\xa0\xae\xe9\x06\x39\x36\xa0\x56\x4f\xf2\x8d\x3d\xb9\x74\xad\x9b\x69\x8e\xc1\x64\xe0\x32\x85\xf5\xba\x61\x87\x79\x1f\x72\x68\x92\x40\xd9\xb6\x52\xb5\x68\xc1\x49\xd0\x81\xab\xec\x72\x8d\xeb\xec\x49\xcc\xec\x92\xd6\x6a\x49\xcb\xac\x6e\x2d\xe9\x2c\x2b\xed\x92\x42\x2f\x28\x9e\xa1\xc1\xa0\x0f\x0b\x30\x43\x53\x59\x6c\xd9\x58\xcf\x65\x7b\x16\x97\xa1\x59\x8c\x4a\x72\x9c\xcf\x2e\x04\xa9\xe4\xe3\x96\x25\x2f\x35\x93\x5c\xa9\xd6\xb2\xa5\x59\xee\x39\xba\xac\x13\x12\xcf\xed\x72\xd7\xee\x72\x6f\x61\x63\x05\xc2\x95\xc6\x37\x61\xe6\x90\x02\x2e\x2c\x2d\x94\xed\x51\x94\x57\xa0\x85\xb2\x49\x0b\x54\x63\x9a\xda\x6b\xe6\xd0\xa2\x6e\xbd\x6a\xb7\x5e\x5d\xa1\xf5\x2a\xd0\xba\xe1\x79\xdf\x37\x2c\x19\x71\xbf\x7d\x18\x72\x7b\x18\xea\x08\xe2\x7d\x2f\x82\x38\x52\x5e\x14\xf2\x91\x13\x5b\xc9\x61\xa8\xda\x93\x3c\xd6\xd2\x05\x5b\xad\x74\xe8\xaf\xef\xb9\xd2\xea\xa3\xc1\x20\x8e\xfe\xf7\xff\x86\xc8\x21\x2a\x15\xc1\x7d\xf1\x8e\x60\x8a\xd4\x99\x38\x77\xa4\xc7\xbb\x4d\x33\xcc\xd0\x0b\x7c\xd8\xf7\x30\x3f\x30\xe3\xaf\x9a\x77\xc7\x2d\x10\x85\xd5\x0a\xee\xe2\x08\xff\xb5\xf5\xc3\x25\x2b\x5f\x32\x42\x40\x6a\x32\x05\x7f\xe5\x5b\x32\x39\x9b\x0b\x99\x4c\xe3\x2a\x8a\xbc\xe2\x32\xbe\x9f\x1d\xe7\xef\xd7\xa8\xe5\xaf\x56\x2d\x9f\x5d\xa3\x16\x85\x41\x79\x46\xcb\x8b\x5e\xae\x50\x22\x3d\xa6\xd3\xde\xf4\x66\x39\x95\x50\x17\x9a\x9f\x92\x79\x4f\x99\x1d\x13\x53\xe2\x65\xe5\x86\x69\x21\x32\x50\x83\xbe\xb9\xfd\xb8\xd9\x22\x06\x89\xb4\x1a\x73\x3c\x33\x29\x62\x08\xd3\xa6\x2f\x70\xd7\x50\xa1\x1d\x99\x36\x7f\xe9\xc5\xc8\xdd\xef\xb4\x17\x48\x5e\x96\xd5\xb9\x4d\x39\xa4\xf3\x06\xeb\x1c\xf6\x52\xf5\x1c\x17\xc9\xc9\xb0\x08\x81\x6a\x40\x08\xde\x98\x26\x15\xf3\xec\x4f\x0b\xbe\x17\x1d\x91\xb0\xa9\xc9\x14\xeb\x60\x53\xb2\x47\xc8\x23\x37\x4c\xcd\x31\x6e\xf9\x01\x6f\xf3\x03\xa8\x80\xbc\x5d\xe4\x54\xef\x69\xf8\x3c\xf6\x46\xe1\x36\x83\x29\x9e\x13\xd4\xe1\x67\xe6\x46\x0f\x95\x98\xc0\x57\xb2\xcf\xf1\xcf\xe0\x27\x4d\xcc\x18\x5c\x74\xb7\x7d\x6a\x43\x52\x23\xdb\xc4\xfd\xe4\x27\xbf\x89\xe2\x28\xe6\xae\xea\xe4\x2f\xa3\xf8\x22\xad\xf5\xd8\xc3\x3a\x10\x0b\xd7\xad\xa0\x91\xc4\x45\x79\x75\xbc\xe2\x63\x92\xd0\x0a\x58\x90\x24\x54\x8e\xc4\xfd\xcb\x6a\x8b\xa1\x96\xcd\x16\xce\xeb\x4f\xaa\x5a\xd4\xee\x99\xf5\xe0\xc0\xcd\x99\xa5\x62\x66\xfd\x19\xdd\x61\x26\x21\xe7\xb5\x98\x08\xd2\x98\x08\xee\x4f\x04\x41\x29\x71\x27\xc2\x7d\xb9\x21\x1c\x41\x1b\xc3\x09\x33\xd8\xcb\xe9\x85\x84\x85\xd6\x49\xef\xd5\x8b\xc7\x3d\x35\x43\xde\xe6\xf6\x49\x19\x76\xba\x75\x20\x72\x47\xbf\x4d\x69\xdf\x0c\x48\x3e\x74\xc2\xb6\x59\xb0\x09\x4a\x49\x23\x4a\x2c\xc3\x9e\xb5\xb0\xbd\x96\xe1\x86\x9d\xd0\xd8\x52\x36\x6b\xc1\xc7\x68\x03\x86\xe3\x90\x8a\x63\xb4\x15\x8d\x6f\x75\xe5\xb4\x23\x01\xb5\x54\xda\xa6\x3a\x10\xac\xb8\x17\xf8\xdf\x0b\x99\xe2\xb7\xdb\x35\x97\x16\xc3\xa2\xcc\x3e\x93\x29\x18\xc2\x2a\xcf\x10\xe6\x02\xd0\xf3\x6f\xab\x96\x45\xac\xce\xaa\x49\x3e\x1d\x99\x7c\x36\x59\x96\xd5\x63\x1b\x44\xa1\x46\x69\x21\x81\x20\xb5\xe6\x93\x3a\x4b\x42\x61\xa7\xe2\xcf\xe4\xd0\x99\x8a\xc2\x9a\x57\xdc\xec\x02\x65\xf6\x42\x9c\xf3\x85\xe1\x71\x2c\xb4\x17\x09\x2e\x01\x75\xba\x6d\x9a\xb5\xfc\x93\x12\x2c\x8f\xa4\xb4\x58\xaf\xc1\x0a\xd5\x54\x8c\x6a\x1e\x34\xe1\x26\xd6\x81\xe1\xbd\x98\xac\x01\x4e\x12\x52\xa5\xb6\x2e\x86\xd9\xed\x51\xd3\x1b\xd4\xd2\x15\x93\x1d\x86\x74\xe9\xbe\x3a\xd4\xc3\x90\x28\xd0\xe4\x1a\xa5\xcf\x92\x0b\xfc\x36\xde\x43\x98\x8a\x4f\x5e\x26\x73\x24\x58\x5b\x3c\xc4\x8f\x92\x97\xce\xd7\x1e\x59\x2d\x92\x9f\x60\xc7\xbb\xc1\xcb\xbc\x39\xec\x22\x7f\x7b\x2b\xa8\x5c\x8e\xa8\x97\x92\x76\x2d\x65\x69\xdd\xa7\xfc\xc5\xda\x3f\xce\x05\x73\x92\x4e\x09\xb2\x91\x52\x35\xd3\xcd\xd6\x8a\xa3\xb8\xc1\xd3\x90\xe9\x87\x4c\xae\x01\x86\x25\x75\x0e\x10\xb9\x9c\xf1\x10\x7f\x9f\x3c\x0f\x91\x00\xc4\x34\xc6\xed\x86\x34\x7a\xd4\x6d\x6a\x91\xfc\xb4\x5a\xc9\xe8\x73\x92\x41\x82\xf8\x29\x44\x1a\x28\x7b\x17\x94\x9c\xe2\x3a\xd0\xec\x90\x07\x3e\x1d\x59\xe4\xee\x2b\xf0\xb0\x72\x7a\x1a\x5c\x0f\x77\x9a\x36\xad\x0d\xb6\x13\xfd\x8e\x03\x97\x13\x33\x39\xb6\x40\xb7\xc4\x8a\x5b\x92\x37\x01\xd3\xee\x5a\x0c\xb9\x10\x69\xa9\xec\xaf\xfe\xe1\x3b\x6e\x33\x24\xb7\x82\x57\x75\x41\x8f\x75\x61\x8f\x7e\xd2\x5f\xc5\x98\xe5\x7f\xb7\x0f\xd7\xab\x67\x33\x5d\x2a\xbd\x9d\xbc\x14\x30\xa5\xf3\xb5\x9d\xfc\xb5\x28\xe7\xf7\x72\x36\xff\xb5\xe0\x27\xf2\x20\xdd\xd4\x5f\x90\x2b\x3d\xae\xfb\x82\x1c\x2f\xcb\x9c\x5d\x69\xac\x8d\xf1\x5d\xa1\x0b\xdd\x27\x90\x54\xd2\x00\xb3\x56\x91\xc5\x40\xcc\xd4\x1f\xde\x53\x98\x6b\x41\x6c\xd4\x59\x6f\x2f\xde\x88\xf3\xdc\xcb\xb4\x74\x2b\x42\xe3\xdf\x79\xac\x07\x5e\x16\x94\x30\x10\x97\xf5\x8d\x30\xa6\xee\xd6\x7c\x97\xbc\x3b\xf6\xa5\x18\x4f\xc5\x44\xdd\x36\x8b\xd6\xe1\x95\xab\x89\xea\xef\xa1\x36\xe5\xef\x38\xdb\xdb\x39\x55\x29\xa7\xaa\xca\xee\xeb\xcd\x89\xeb\xac\xd2\x57\x44\x3c\x03\x4b\xb2\xaf\x5c\xc4\xcb\xac\x4a\x8c\x56\x11\xcf\xb3\x2a\xe9\x50\x1d\x82\xa6\xb5\xd6\xf2\x29\x90\x34\xa8\xc0\x4e\x36\x2d\xcc\x0c\xbb\xfb\x10\xcf\x9d\x93\x6c\xf3\xb2\x9c\x74\x2f\x0b\xc3\x27\x9d\xcb\x62\x4f\x97\xb2\xb5\x06\x30\x59\x36\xc4\xb4\xc4\xae\x2e\x11\xc2\x79\x73\x59\xba\x38\x45\xf7\x0a\x68\x6a\x80\x93\xa2\x38\xd2\xd7\x75\xea\x67\xea\xf2\x8c\x1a\xe3\xb8\x61\x05\x1f\x5b\x16\xda\xb0\x9a\xa7\xad\x6b\x1e\xd4\x14\x93\xa4\xa0\x7f\x82\xed\x0d\x53\xb4\x83\x98\xe5\x57\x9b\x11\xec\xe1\x51\xdd\x94\x4d\xee\x0b\xad\x0d\xbf\xcf\xd5\x51\x8c\xab\xac\x34\x44\x55\x67\x65\x88\xa8\x4a\x4b\x54\x40\x38\x55\x9b\x70\xe6\x19\x33\x8b\xe0\xdd\x37\x8e\x89\xfc\x50\x76\x53\xe9\xf3\xba\x56\x9c\x58\x11\x59\x1a\xb4\x71\x99\x29\x57\x30\xb1\x13\xc4\x8d\x13\xd7\x78\x8e\x4b\x04\xa4\xee\x89\xe3\x27\xe2\x81\xa7\x05\xc2\x0b\xbd\xa1\x97\x56\xd4\x5c\x3a\x02\xa1\xd2\x55\x9e\x18\x31\x78\x11\xf6\xa2\xc8\x9b\xa2\x30\xc3\x25\x5e\xec\x2c\x0a\x2b\x03\xad\x6e\xae\x34\xcd\xb9\x8d\x77\x9c\xbc\xb5\x5d\xb4\xa3\x0c\xb4\xe3\x59\x96\x15\xa3\x46\xc7\xf4\xbe\x60\x78\x81\x4b\x7c\x82\x8f\xc6\x73\x92\x16\x42\xa8\xde\xb9\x8f\xad\x4b\x4e\xed\xe1\xfd\x41\x18\xf1\x32\x2a\x3a\xab\xba\x1d\x95\x35\x6a\x39\x8d\x8e\xbd\x91\x9e\x73\x27\x18\x1a\x5c\x7d\xb8\xbf\xbf\x8c\x49\x82\x77\xed\x33\x1e\xdc\x67\x6c\x49\xef\xe5\x54\xec\x33\x99\x1d\xdc\xdd\x66\xde\x75\xa6\x7d\x24\xe8\x09\x1a\xb3\xcd\xbb\x95\x6f\x9f\x64\xde\xda\xac\x04\x76\x68\x91\xc9\xc8\x54\x9e\x9a\xca\xb5\x72\x4a\x35\xd5\x19\x31\x97\x55\x51\x8d\x71\x1d\xec\x1d\x92\x59\xbe\xac\xa5\xa7\xd4\xb1\x18\x5f\xaf\x3a\x82\x1f\xb0\x65\x7a\xff\x89\x9a\x09\x53\x0b\x95\x5a\xf8\xf3\xff\x44\x3d\xd9\x08\x99\xf7\x8e\xf2\xb2\x26\x52\x6b\xa5\xbc\xb7\x5a\xec\xe3\x9c\xcb\x0b\x9d\xa5\x80\xe6\xc4\xee\x84\xcc\xe3\xc9\x4c\x7e\x23\x2d\x7d\xab\x95\xeb\x2b\xd2\xdc\x01\xfd\xa1\x36\xf7\x15\x3e\x56\x44\xcb\x12\x42\x6e\xcc\x08\x68\xb2\x18\xec\xae\x38\xcf\x4a\x34\x18\xfc\xc0\xe3\x5c\x37\x84\x50\x21\x78\x9a\xfc\x11\x1b\x20\x1a\xf8\xf3\xfc\xc0\xe3\x32\xe0\x8d\xf6\x88\x9e\xe5\x65\x31\xef\xa9\xe1\xc9\x89\x8d\xd0\xa8\xc8\x4a\x09\xd6\x55\xab\x73\x40\xe2\xc2\xba\xbb\x9a\x6e\x6b\x31\xe3\x2d\x8f\x41\x3a\xbf\xeb\xdd\x28\xa4\xbc\x0d\xa0\x0f\xad\xa2\x39\x23\xf1\xe7\xfa\xac\x2d\xe8\x71\x8f\x57\x4e\x8c\x4f\xe6\x2b\xff\x9c\xfc\x4c\x04\xe1\xcf\xa3\xcf\x8d\x50\xce\x55\xa0\x08\xbe\xde\x88\x37\xd1\x30\x13\xbb\x90\xed\x43\x79\x1b\x6e\x75\x32\xc5\x2c\x93\x59\xe1\x46\xd2\xeb\xcb\xc9\x6b\xc1\x1c\xfe\x21\x45\xf7\x8e\xd4\x7d\x96\xbe\x94\xbf\x53\x2b\x35\xd3\xde\x6a\xd5\x67\x7e\xae\x30\x35\xf5\x9f\x71\xc8\x7a\xa0\x65\x0e\x34\x62\x99\x5f\xd0\x82\x73\x83\xa2\x4c\x17\xb1\xba\x07\x97\xff\x21\x23\x39\x67\x46\xb9\xc5\x03\x7a\x59\x19\x27\x17\xd4\x89\xae\x8e\x66\x43\x35\xbb\x88\xca\x4a\xab\xd6\xd0\x11\xe8\x94\x7c\x98\x35\xf3\x08\xa9\xf8\x40\xf2\x2b\x37\x71\x90\x1f\xb9\xc2\x53\xdc\x76\x44\xa8\x68\xea\xb6\x36\xa5\x07\x70\xf4\x06\xdd\xbe\x27\xd2\x75\x35\xe4\xf7\x42\x5a\x69\x53\x6d\x66\x3e\x27\x77\xea\x88\x4e\xd8\x34\xe3\x93\x62\x2a\x81\x78\xf0\x93\xac\xdd\x68\xee\xed\xe9\xba\xca\x85\xc4\xfb\x1a\x90\xab\x7e\x4a\x3e\x5c\xfa\xc3\xe3\x01\x17\x2d\x2e\x04\xf8\x72\x92\x4f\xb3\xa2\x63\xf1\x94\x0a\x44\x0b\x6c\xe2\xf6\x1b\xee\x7f\x07\x9d\xfa\x7d\xb7\x47\x6b\x87\x63\x3e\x57\x89\x73\xfd\x19\x1e\x17\xe0\xa0\xfb\x5c\xc1\x06\xe4\xbd\x19\xa5\xf2\xe9\x33\xf6\x42\xee\x51\xee\x3b\x6a\xb8\x5f\x6c\x66\xf8\x74\xa2\x9b\x75\x73\xdf\xca\xf4\xb2\x1b\xbc\xe9\xe5\x36\x11\x2c\xd0\xb7\xa9\x24\x3d\x55\x44\xf4\xc0\xcb\x73\xad\x0f\x34\x37\x1e\x3e\xf3\x3a\xac\x07\xb3\x81\x68\xb1\xf4\x7f\x7d\x22\xa4\xd9\x66\x98\x0a\x1a\x0c\x53\x41\xad\xa5\x38\xd7\xf9\xc5\x88\x77\x41\xe0\x90\xaa\x18\xc2\x85\x61\xe9\x27\xba\x5b\x44\x0a\x12\x00\x8f\xfe\xdc\x80\xbc\x5d\xae\x31\xcd\x86\x98\x75\x25\xf4\x19\x51\x9b\x93\xd7\xa0\xda\x8a\x8c\x4d\xe8\x14\xe7\xd9\xcf\x9e\xd3\x61\x31\x45\xa3\x38\x6f\xab\xa4\x57\xab\xbc\x21\x0d\x83\x37\x5a\x31\xcd\x72\x14\x0a\x0b\x57\x1c\xc5\x7b\x52\xab\xd4\xe0\xe3\xad\x84\x8f\x2d\x54\x9a\x78\x3a\xea\x72\xd8\xb4\x2b\x6d\x0f\x16\xc7\x62\x64\xa7\x2d\x6e\x5b\x9a\xb9\x8a\xd4\xf6\xd3\x56\xd3\xa6\x9b\x49\x4f\x62\x89\xcd\xe3\x89\xf9\xcb\xe2\x7e\xd6\x08\xff\xb6\x03\x46\xd7\x82\xd9\xbc\xaa\x3d\x94\x2e\x69\x59\x07\xc0\xbd\xcc\xcc\x87\xb8\x6d\xf0\x31\x77\x9c\xce\x30\xc5\x13\x15\x26\xc5\x0d\xec\xc0\x1b\x15\x35\x16\xa7\x4f\x82\xf9\xad\x3f\x1a\x0e\xdc\x47\x7a\x9b\xd8\xac\x31\x1b\x33\x8d\xf2\xd6\x22\x74\x4a\x11\x48\x71\x6e\x96\x23\xda\x62\x76\xd7\x44\x2a\x5d\xce\x72\x7a\xdf\xf1\xd5\x22\xb3\x37\x00\x5f\x9b\xe5\x74\xbf\xf9\x70\x8d\x73\xe5\x3d\x62\xed\x85\x9b\x9c\x48\xe2\x2e\xc6\xfc\x89\xfa\x6a\xfc\x05\x1a\xee\x1f\xb8\xca\xe8\x98\x6e\x70\x2f\x32\x4e\x22\xe5\x60\x90\x7b\x21\x02\xc5\xfd\xd4\x8d\xbd\xd2\x72\x21\x30\xee\xd6\x01\x48\x39\x35\xb4\x00\xcc\x75\x54\x9f\x17\x82\xe3\x51\x74\x39\xcb\x6b\x02\xb7\x11\x29\x40\xdc\x3b\xc9\xe9\x31\x89\x52\x25\x94\x42\xde\x58\x27\x5a\x52\xa3\xf4\x33\xe6\xc8\x1e\x9b\x3f\x5d\xad\x20\x64\xd5\x86\x44\xc4\xb2\x72\x15\x5c\x53\xd7\x32\xd4\x4d\x6e\x6b\x4e\x05\x96\xda\xa1\x99\x39\x39\xca\x97\x25\x6f\x7c\xb8\x5e\xc7\x25\xce\xb1\x37\xe7\xe2\x92\x2a\x2f\x51\xfb\x74\xae\x3d\x1d\x6a\x34\xaa\xc7\x45\xd2\x5a\x79\xeb\x96\xfc\x93\xb8\xf6\xa0\x34\xce\x65\x34\xc8\x52\x46\xd9\xca\xfd\xc0\x96\x59\xd9\x08\x74\x89\xd5\xc6\x72\xe2\x7d\x8e\xab\x71\x65\xdd\xca\x04\x65\xa4\x54\x29\x1c\x07\x83\x6a\x30\xa8\x0c\x5c\x57\xff\x95\x14\xb5\x09\x78\x33\x18\x40\x2f\x9b\x64\x6b\xfb\xf9\x1b\x8f\xcd\x77\x36\xbe\x50\x89\x94\xdf\x50\x39\x18\x80\xa0\x51\x89\x06\x77\x18\xb0\x1c\x00\x50\xf9\x2e\x63\x58\xa3\x98\xe0\xbc\xed\xd9\x65\xb5\x87\xfa\xdd\x14\x89\x1e\x28\xdf\xd6\xd6\x17\xd2\xd1\x35\x0f\xa7\xa7\x65\xd0\x25\x77\xbf\x71\x04\x6d\xe3\xc2\x72\x34\xd6\xe0\xcf\xd2\x77\xaf\x30\x51\x7e\x9a\xe1\x6e\x18\xba\x84\x4f\x0a\x67\x94\x5e\x2a\x03\xd7\x9d\x55\xee\xe8\x54\x87\x96\xd9\xba\x22\x85\x0b\xd2\x86\x5c\x05\x7a\x8d\x79\x60\x8d\xc7\xbc\xb5\x80\x92\xcf\x14\xea\x80\xcd\xe9\x06\xd7\x04\x27\xc2\x60\x53\xf3\xb4\x05\x9f\x43\x34\x90\xa6\xa2\xdb\x43\xad\x06\xb3\x35\x9b\xc4\x5f\x2f\x2f\x16\x36\x5e\xbd\x64\x75\xd4\x07\xd2\x58\x5c\x8d\x8e\xb2\x2a\xd9\xc1\x23\x7a\x42\x58\x01\x96\x34\xe3\xa6\x9e\xeb\xb4\x70\x65\xce\x8b\x33\xf2\xb8\xa0\x6f\x60\xe3\x2e\x45\xb7\xb2\x32\x14\x2d\x95\xcc\xaa\x63\x1a\xca\xcd\xaa\x61\x35\xbb\xe1\x69\x36\x80\xd2\x8d\xb9\xcc\xbd\x1b\xaf\xd1\xa6\xae\x36\xd0\x39\x3a\x4f\x87\x8c\x57\xd3\x06\x89\x68\x58\x08\x9e\xdb\xf8\x66\x59\x96\x79\x1e\x5e\xa3\x66\x3c\x79\x25\xa3\x1e\x31\x42\xde\x11\x88\xe9\xee\x3f\x69\xe1\x15\x3b\x2f\xa7\x3e\x0c\xcd\xe6\x50\x55\x81\xea\x83\x6b\x2e\x39\x45\x7b\x62\x65\x20\x7b\x15\xa3\x1e\x22\xd7\x73\x1d\x96\xde\xcd\xbb\xc3\x7c\x6d\x76\x21\x69\x41\xd9\xc0\x28\xb0\xd4\xb8\x50\x41\x35\x71\x61\xee\x1d\xa1\x72\x9b\x41\x3a\x10\x7e\x52\x9e\xe6\x2c\x63\x3c\xa6\x5b\x48\x10\x8d\x74\xc4\xc7\xcc\x9f\x4e\x66\x43\xc2\xc9\x83\xa1\xf9\x5a\x07\x7d\xdb\x29\x4f\x42\x78\xc4\xc4\xbd\x14\x06\xa8\x65\x8b\x7e\x45\x62\x18\x5b\x20\x14\x1e\x02\xa1\x34\x62\x27\x39\x7e\xe9\x7e\xbb\xd0\x84\x7b\x5d\x6f\x75\x70\xb3\x1b\x7d\x43\xbd\x25\xae\x83\x5e\x46\x39\x17\xa3\xf6\xad\x56\x59\x8a\x6b\x9d\xbe\x11\x16\x13\x36\x15\x82\x98\x97\x6e\xbf\xca\xc0\x27\x05\xc2\x92\x74\x6e\xad\x0a\x97\x38\x77\xf7\x53\xed\xed\xa7\x96\x63\x8a\x4e\x98\x39\xcb\x6a\x1a\x5b\xcc\xdc\x2c\xa9\x2b\xc6\x3b\xd0\x1f\xde\x61\x26\xb3\xca\xde\xdc\x4b\x79\xe0\xf1\x5e\xea\x17\x4e\xca\x6a\x96\x97\x44\x6c\xaa\x9c\x99\xf0\x86\x5a\x90\x5c\x23\x3c\xeb\xa0\x84\x2d\xca\x0b\x9c\x67\x4f\x62\x62\xef\xdb\xb9\xba\x6f\x17\x59\xde\xba\x6f\x97\x59\xa1\xf6\x46\x15\x9a\x46\x0f\x00\x50\xaa\x56\x9c\xf8\x8b\xc6\x5e\x55\xe9\x3b\x78\x8d\x2e\xf3\x84\xc4\xb5\xbd\x83\xe7\xee\x1d\xfc\xae\xb6\x8e\x8d\x27\x8d\x2c\x44\xdd\x0d\x77\x0f\x17\xa2\x0c\x5a\x8e\xbc\x5a\xf5\x1d\xd4\x70\x8b\x75\x8a\x89\x99\x08\x4a\x9a\x4c\x1d\xe3\xa3\xd2\x2d\x28\x0c\x8b\x13\x3c\xf7\x1e\x01\xf8\x8a\xeb\x7f\x33\x2a\x34\xf7\xa5\xb8\xfa\xe0\xcc\x76\x2e\xf8\x03\x06\x88\xb3\x1f\x30\x12\xcf\xc4\x11\x8e\x97\xe2\xbf\x37\x74\x0f\xf1\x09\x05\x90\xae\xe3\x8d\x6c\xe0\xce\xd2\x08\x6d\x40\xcf\xee\x44\xe4\x59\xdd\x36\x44\x96\x26\x5e\x56\x6d\x0d\x92\x9a\x69\x17\x3c\xce\xb1\x9b\x92\xfe\x6f\x1a\x78\xde\x18\x38\x6c\x54\xbc\xcc\xe2\x59\x46\x90\xb5\x7e\xcd\xac\xb0\x3a\xf3\x2d\x5d\x33\xff\x1a\xad\xac\x9f\xe2\x16\x38\x97\x06\xd0\x1c\x97\x78\xf9\x81\xc5\x00\x7c\x92\xcd\x7d\x51\x60\x21\x1e\x78\xe6\x54\x6d\xbf\x5c\x18\x86\x7d\x12\x36\x97\x2a\x2e\x16\xfb\x7b\xd5\x94\x5b\xe2\x13\x84\xc6\x20\xae\x4e\xd4\xe1\x5b\xe0\x4a\x2a\x07\x45\xfd\x4b\xcf\x3e\xba\xf0\xad\x43\xf6\x8b\xc9\x14\x4d\xad\x5d\x54\xe2\xed\xf1\x59\x88\x3d\x88\x16\xf1\x42\x1a\x45\x1d\x85\xb9\xec\xe5\x59\xb3\x27\x67\x68\x1a\xd0\xc0\xd5\x5e\x0e\x7d\x38\x22\xc4\x17\x07\x84\x83\xde\x50\xf1\x31\x79\x12\x34\x25\x3b\x30\x7c\x19\x75\x61\xbf\x7d\xfe\x07\x22\xa1\x3a\x69\xc4\x1c\x17\x3f\x27\x78\x1d\x77\x17\x37\x2e\xec\xe4\x4b\x31\xbf\x40\x38\x9a\x55\x94\x17\x74\x49\xa2\x91\xd6\x59\x42\x48\xc6\x00\xc9\x14\xed\x0e\x00\xfd\xb4\x9e\xae\xd1\xc8\xaa\x31\xc6\x71\x4c\x32\x27\x0e\x84\x7b\x4e\x11\x7c\x26\xee\x18\xc6\xe7\x08\xb3\x24\x9f\xcf\xe3\x1c\xa1\xd4\xf4\x50\xe6\x69\xd4\x7a\x56\xee\xeb\x59\xf3\x18\x29\x5e\xbd\x94\xfa\xd2\x65\x53\x5f\xaa\x9d\x7c\x3c\xff\x9e\xca\xf8\xf7\x54\xad\x53\xa4\xd6\xfe\x3d\x18\x4e\xce\xda\xd5\x97\x3a\xb7\x4c\xc1\x5e\x54\x31\x64\xc2\x08\x2f\xd1\x65\xe5\x77\xa2\xf2\x52\x80\x75\xef\xc7\x3e\x13\xbb\x44\x8a\x4c\x86\x9c\x66\xcd\x58\x0c\x23\xde\xf0\x80\x19\x21\x9e\xb5\x9e\x69\xa2\x70\x02\x41\x37\x2b\xc2\x14\x3e\x6b\x7a\xce\x8c\x43\x0f\xd3\x61\xa0\x59\x7a\x23\x8b\xdb\x4d\xa3\x2b\xd4\xa9\xe7\xe4\xe6\x9e\x13\xf7\xd7\xb7\x6b\x0b\x19\x74\xb5\xba\x74\xbc\x74\x4e\x9a\xb9\x45\x40\x67\xe1\x97\x59\xf8\x81\x04\xfc\x10\x03\xd6\xef\xd7\xd1\xdf\x01\xcc\xa0\x89\xf1\xf4\x4d\xa3\x56\xd6\xf5\xac\xde\x5c\x5f\x3d\x8f\xe8\xee\xa1\xfd\x4d\x5d\x36\xa2\x3f\x57\x1b\x42\x9a\x99\xb4\xb2\xcf\x71\xba\xa0\x68\x1d\x87\xef\xb6\xee\x25\xba\x7d\xa1\x74\xe3\x3b\x6d\xc8\x6b\xb9\x67\x33\x0b\xf2\x2a\x94\x87\x52\x48\x89\xb6\x8c\x13\x4f\x65\xa7\x4a\x75\x20\x95\x4d\x88\x7b\x2f\xbd\x61\x23\xa2\x77\xb8\x3f\x96\x0c\x3c\x86\xd4\xc8\x57\xa5\x98\x34\xc2\x67\xea\xba\x99\x3c\x2b\x9f\xc7\xd1\x8b\x67\xaf\x5e\x3e\x38\x88\x10\x3e\xde\xa2\x34\x68\x29\x0c\x4a\xe9\x75\xc3\xad\xf2\xbe\x28\xad\x17\x4e\x05\x70\x00\xc8\x0e\xfa\xb8\xa8\x39\xa1\xd6\x17\x47\xbe\x7a\x40\xe7\xe6\x45\x28\x1e\x9d\xa8\x7e\x63\x30\x2c\x85\x37\xd3\x68\x11\xf6\x19\x6a\xe0\x47\xd8\x67\xa3\xae\xae\x28\xac\x6b\xe0\x8d\x86\x68\xa9\x7c\xb5\xa2\x22\xe9\xea\xa1\x62\xab\xc4\x3e\xd4\xa6\x6b\x9f\x30\x74\x49\xdb\x03\x05\x17\xfe\xe6\xc3\xd8\x38\x6a\x33\x65\x02\x75\xb2\x7d\x2a\x38\xc9\x21\x89\x73\x63\x00\x00\xed\xff\x19\xc5\xf2\x6c\xc1\x45\xf2\xdb\xc3\x3a\x39\x20\xe5\xd1\x4a\xfe\xa9\x33\xa3\x22\x64\x82\x16\xe4\x28\x08\x7e\xd6\xce\x23\x76\xc6\x54\xba\x5c\x40\xdc\x8c\x5a\xf3\x09\x84\x73\x9c\xcc\x5c\xd5\x9b\xa7\xa1\x3a\x4d\xde\xfe\xbc\xb6\x73\xf2\x2a\x79\x8b\x04\xc9\xd9\x1a\x2c\x90\xa2\x39\xb1\x3b\x79\xe5\xb4\xcd\xe1\x86\x65\x39\x34\xa9\x40\x47\x08\xa5\x07\x24\x26\x31\xda\x84\xa0\xd3\x9b\xc7\xc5\x7f\x17\xc9\xef\x3f\x3d\xb7\x58\x29\x02\x8c\x4e\x36\x62\xe8\x5c\xff\x21\xc7\xb0\x5f\x5f\xd0\x99\xf4\xaf\x73\xf2\x9c\x5c\x74\xeb\xf9\xbc\x64\x44\x56\xe9\x62\x03\x7b\x69\x01\xd4\x0d\xfc\x25\x37\x9a\x89\x8b\x2c\xe6\x5b\xed\x36\x3f\xc2\xcf\x1a\xe1\xd3\xae\xdd\x1c\x72\xa1\x83\xc0\x4b\x50\xdf\x93\x7c\x11\xd8\x8a\x15\x05\x72\x97\x51\x9b\x64\xdc\xa9\xad\x5b\x33\x14\xa4\x8a\x08\xd1\x41\x8d\x99\xfb\xad\x27\x35\x84\xc8\x73\xf4\x10\x5e\xa3\xf7\x49\xcd\x59\x75\x11\x6a\xd6\x8b\x4e\xe9\xda\x70\xd0\x08\x22\x6a\xf8\x93\xdc\x98\x29\xb7\xb9\x56\x2c\xb6\x8d\x2e\x7d\xa6\xe7\x7e\x5a\xf9\xc6\x64\x62\xd2\x6a\xc0\x46\xbd\x0a\x8d\xc5\xaf\x85\xb8\x10\xc2\xc6\x6c\x5e\x69\x26\x74\x1f\x57\xab\x98\x43\xdf\x2e\x68\x70\xfe\xb9\xd8\xac\x1e\x6e\xb1\xbb\xb1\xd0\xb8\x95\x61\x52\x79\xc9\x9a\x8d\x70\xb8\x03\x35\x76\x1e\xda\xcf\xe5\xf5\xe4\x15\xdb\x94\x90\x7a\xe8\x00\xcb\x39\xcb\x43\x90\x71\xbb\xd7\x2d\xda\x99\xb0\xe3\x2d\x87\x6a\xe0\x76\x73\xcf\x75\xbb\x73\x62\xd9\xb6\x73\x7e\x48\x90\x53\x74\x2b\x72\x84\xd9\x03\xaf\x01\xdf\x99\x05\x44\xa8\x5f\x68\x76\x29\xae\x2f\xb5\x18\x0b\x8c\x44\x5f\xaa\xd3\xa8\x38\xa6\x15\x13\x94\x23\x43\xc9\xcb\x3b\xb8\xf3\xd8\xb9\x99\xeb\xaf\xd7\xf8\x8d\xad\xb0\x5e\x1e\xd6\xe4\xfa\x35\xaa\xcf\xd7\xf8\x35\x6d\xdd\xdb\xb6\xf9\xee\xca\xdc\x6e\x3a\x28\x00\xf0\xf4\x5d\x2d\x10\xbe\x47\x2f\x75\x4b\xab\x8d\xc2\xb4\x48\x32\x83\x30\x48\x0d\x37\x5f\x95\xb5\xad\xcc\x6b\x7e\xb0\x9c\x09\x62\x3a\x5a\x96\x4f\xf3\xb3\xe2\x58\x96\x76\x98\xeb\x92\x31\x42\x79\xf0\xdd\xbc\xa8\x17\x55\x4d\xe6\x59\x7f\xcf\xd6\xf7\x58\xb5\x28\x0d\x9f\x8f\xe8\x51\xe5\x7c\x41\x4d\x35\x8f\xe6\xd9\xd0\x6b\xe1\x79\x7e\x4c\xec\xc3\xa2\x7e\x7a\xfc\x47\x45\xc9\x03\x9a\x1f\x96\x4e\x0b\xe4\x4c\x88\xbf\x99\x3e\x59\xd5\x43\xc6\x2a\xf6\x43\x4e\xe7\x42\xda\xba\xa7\x66\xe3\x34\x2f\x8f\x2a\x76\x4a\xe6\xaf\x58\xf1\xc0\x2d\xb0\x4f\xbd\xbe\x34\xba\x6f\xa7\xe3\xd1\x3c\xbb\xa9\x5e\x9c\x54\xd5\x9b\x3a\xbb\x3c\x24\x47\x15\x23\xcf\x99\x66\x88\x45\x45\xd3\x03\x8a\xf3\x23\x4e\x58\xf3\xa9\x55\x10\x41\xbb\x05\x3d\x36\xc6\x1f\xd1\xf9\x43\xda\x19\xc2\x58\xbc\x3e\x32\x32\xe3\x41\x7e\x4a\x5e\x31\x77\x6d\x14\x25\x46\xdb\x6c\x4c\x6e\x92\x48\xdd\x97\x57\x8b\x79\xce\x9d\x22\x73\x72\x44\x18\x50\xf5\x26\x7b\x94\x13\xac\x45\x67\xfd\xa7\x33\x52\x92\xb9\xed\x95\x5b\x9a\x91\x45\x99\xcf\x74\x07\x8d\xcf\x78\xe9\xf8\x8c\xdb\x94\xfe\x95\xf3\x66\x76\x9b\x68\x37\x12\xfd\xe8\xc5\xf0\x50\x05\x56\x6c\x52\xc4\x89\x2f\x9f\xbc\x18\x1e\x0e\x06\xf0\x4f\x52\xd4\x8f\xe8\x3e\x05\x37\x1a\xf1\x41\x6c\x54\x57\x35\x70\xef\xa3\xe2\x38\xd6\x71\xfb\x14\xed\x29\x40\x65\xa6\x53\x7a\x78\xb1\xb2\x2f\xd7\x2a\x60\xa3\xac\x25\x3f\xd7\xa5\x03\x35\xc8\x32\x87\xac\x3a\xaf\x09\xdb\x5a\xce\xf7\xd5\x17\x82\x24\x8d\x05\x4f\x08\x70\xe8\x65\xc2\x59\x71\x7c\x4c\x98\x8d\x02\x5a\x10\x10\xaf\x76\x2c\x9d\xcb\xd2\x6e\xf0\x3f\x15\x0e\x9b\x2b\x73\x55\xa8\x87\x2d\x06\xa4\xbe\xe7\x2c\xa7\xd2\x31\xa8\xb6\xd9\x96\x8b\x79\x3a\xc4\x3c\x67\xc7\x44\x6d\xe6\x74\x88\xfd\x4a\xd3\x50\x43\xea\xe7\x0b\x98\xd8\x60\x09\x75\x80\x89\xad\xac\x0a\x04\xb6\x55\xa2\x4a\x85\x06\x83\xf0\x92\x95\xfb\x62\x9b\x1a\x37\xbe\x6b\xd6\xc3\xb6\xf4\xb2\x76\xd3\x7e\x02\xdf\x63\x44\xdc\x51\xe4\xdf\x0b\x56\x9d\x16\x35\x49\x9f\xcb\x7f\xb5\x30\x1b\xf7\x87\x08\x4b\x75\x49\x1a\x15\xa7\x0b\xc2\x60\x17\x46\xa2\x22\x71\xe9\x9e\xc3\x42\xc9\x2a\x54\xa3\x3a\xc7\x4f\xda\x5c\x4e\x1b\x65\x54\xae\x84\x29\xe8\x7e\xfd\xc2\x96\x6f\x55\xa0\xbe\x73\x8b\xc0\xa7\x00\x63\xaf\x01\x62\xd4\xc2\x12\xe1\x30\xee\x68\xad\x3e\x7a\x41\xea\x65\x29\x7b\xa0\x09\xd0\x1e\x04\xca\xb0\x55\x13\xbe\x5c\x58\x7e\x52\xc7\x4d\x3a\x43\x5e\x2e\x14\xb7\x64\x48\x50\x52\x5b\x50\xd2\x61\x2b\x1b\x25\x1c\xcf\x0d\x45\x6e\x4c\x32\xef\xc4\x14\x0c\x08\x86\x1f\x23\xb4\x5a\x59\xa5\xb8\x72\x25\x49\x89\x0a\x82\x28\xa7\x4e\x36\x64\xd5\x14\x8d\xd1\x6c\xb5\xdd\x3a\x87\x9b\xc5\x8e\xe9\x3b\x5a\x57\x7c\xc8\x61\x3f\xcb\x48\x52\xcc\x37\x47\x88\xdc\x21\x34\x9f\xbf\xc1\x36\xee\x0a\xa2\x38\x20\x5a\xab\x0b\x74\x2b\x50\xa7\xd4\x15\xf4\xf7\x70\x61\xc3\x69\x3a\x37\x47\x33\xaa\x96\x63\x03\x0f\x08\x1b\x82\xa9\x88\x21\xe2\x82\x16\xbc\xc8\x4b\xd1\x41\x92\x78\x2c\xc3\x67\x0f\x24\x71\x7f\x62\xc5\x07\x53\x92\xc8\xfd\xa5\x77\xa9\x2a\x56\xe3\x05\x23\x67\x45\xb5\x74\x08\x2a\xe5\x9d\x72\xd1\xb6\x80\x6f\xdd\x5f\x22\x7c\x19\x68\x49\xee\x08\x65\x21\xdc\x34\x9b\xbc\x71\xa6\x38\x49\x49\x71\x9e\xf5\xb9\x15\x66\x56\x2b\x7f\x06\x9c\x92\x7d\x13\x51\x88\x37\x78\x97\x53\x08\xfc\x60\x22\x46\x40\xd9\x04\x3a\xb3\x80\x0c\xb2\x5a\xe5\x68\x30\x08\x13\x4a\xf3\x8a\x62\x29\x46\x6b\xa3\xce\x69\xac\x97\x03\x30\xc1\xcd\xf3\xd2\x1f\x00\x4c\x4b\x8b\x78\x3a\xe7\xc9\xe1\x18\x62\x07\xff\x22\xb6\x5d\xec\x38\x00\xcb\xac\x91\xe4\xbc\xf7\x59\x0c\x74\xc5\xad\x4b\x8c\xec\xac\xdf\xb6\xa5\x9b\xc4\x63\xc6\x08\x61\x39\x91\xe1\xf6\xc6\x55\xf2\xa0\xc5\xe5\x21\x45\x46\xdb\xbc\xdb\xa1\x8f\xb6\xa1\x66\x43\x1e\xa6\x8e\x86\xe9\x47\x37\x0f\x9a\xd2\x16\x9b\x70\x5d\x85\xbf\x1d\xd8\x76\x5f\xb3\xed\xc1\xc0\x2e\xdb\x87\x29\x59\x4b\x0f\xbf\x75\xcc\x8d\xc0\xe7\x78\xb8\x79\x92\x8e\x44\x5a\xda\xeb\x8b\x79\x1d\x76\x77\x0a\x71\x85\xad\xdb\xb0\xf5\x09\xc2\x97\x60\x78\x91\x2c\xa2\x35\x80\x75\x63\x69\x4c\x74\x25\xb3\x38\x9d\xbe\xc5\x61\x78\x42\x7e\xed\xc0\x88\x8e\xd4\x5e\xb6\x2b\xf9\x32\x58\xc9\x97\x6e\x25\x5f\x4e\x53\x1d\x2a\xce\x18\x15\x65\x18\x35\x87\x84\xc4\xe0\x12\x83\x29\x8b\x9b\x56\xcd\x6a\x5c\x52\x29\x36\x52\xc7\xa6\x51\x69\x93\x9a\x25\xc0\x52\x10\xea\x5a\xc5\xd9\x6b\xcf\x2b\x8e\xab\x2c\xf4\xb8\xb1\xeb\x2a\x70\xbc\x2e\xdf\x9b\x38\x19\xc2\x97\x0d\xb1\x47\x52\x26\xdc\x2a\x2a\x49\x9f\x6d\x88\x97\x26\x40\x3c\x34\xe9\x5d\x03\x17\x2a\xcc\x3b\xad\xdf\x21\xba\x8d\x48\x7e\x4c\x98\x64\xa1\xad\x9b\x17\x04\x54\x95\x27\x50\x52\xbf\x29\x16\xfe\xa5\x79\xb5\x12\xf3\xc3\xef\x1a\xb6\x18\x07\x48\x16\x94\x04\x6d\xd6\xd9\x2a\xa7\x95\xf7\x00\xdc\xdc\x89\xe7\xb5\x5e\xb7\xeb\xc4\x24\xf1\xe7\x19\x8d\x14\x6b\x65\xda\x55\x39\x17\x07\x84\xbd\x2d\xed\x7c\x5c\xb8\x1f\x99\xc0\x8d\xd0\xed\xba\x71\x32\xe0\x65\x66\xd8\xf3\x3c\x6b\x30\x68\x7c\x92\xd9\x33\x3e\x93\x0c\xbf\x6c\x0e\xad\x46\x90\x59\x5f\xf7\x7d\xa1\x1d\xa5\x39\x8f\x6b\x1c\xa0\x14\x64\xa4\xeb\xa6\x5c\xb3\x83\x90\xd5\x20\xcc\xa3\xc0\x9d\xa4\xd6\xe2\xc9\x96\xea\x4e\x10\xbe\x6c\x93\x4d\xda\xdf\xc3\xea\xee\x2d\xd8\x5c\x7f\x4f\x32\x65\xa3\x7b\x73\xae\xae\xfa\x4c\xde\x89\x82\xb0\x3d\xc2\xe4\x45\xb8\x4a\x1e\xac\x11\x5e\xd0\xd6\x01\x4c\xb3\x26\x5d\x60\x26\xd7\xae\x68\xae\x5d\x6e\xfb\x50\xda\x95\xaa\xb2\x32\xb0\x1f\x20\xae\x80\x1d\x99\xb5\xc2\x80\x5e\x26\x09\xa8\x65\x62\x8a\x2f\x5d\x5d\x53\xca\xb0\x38\x18\x0b\x68\x1b\x6e\xa2\x05\xb6\xd3\x91\xe6\x38\x34\x9b\xfd\xca\x9b\xce\x7e\xad\x45\xde\xd6\x5e\xb7\x90\x55\x42\x3e\xe2\x16\xe3\x8d\x6b\x3d\x7a\x6f\xc1\x5f\x5d\xea\x88\x90\xc8\x1a\x0b\x67\xa4\x6c\xf3\x84\x7b\x1a\x46\xd4\x3c\x33\x79\xf7\x69\x69\xdd\xfa\x9a\xad\x40\xee\x9d\x46\x3b\x90\x58\x04\x3a\x86\xab\x2c\x6f\x23\xfa\xf1\x52\x3e\x6d\xde\x38\x47\x0e\x3c\xd4\x07\x01\xe9\xb8\x5d\xe3\x5d\xf7\x2b\x35\x73\xa3\xee\xae\xfd\xe1\x1a\xa1\xce\xb0\x68\xda\x18\x46\x76\xb0\xab\x85\xa4\x39\x15\x2f\x04\x38\xa6\xb5\x50\x8f\xbd\x5f\xfe\x88\x8d\x03\x4e\x3f\x97\x5e\xf0\xf9\x16\x2f\xf8\x32\xcb\x7d\x07\x4f\x27\xcc\x2d\xa7\x71\x8e\x21\xb4\x58\x71\x14\x34\x05\x82\x4f\x3c\xf1\x7b\x80\xd6\xe2\xd8\x2e\xb3\x03\x12\x57\xfe\x1b\x8b\x4d\xf4\x7c\xe5\xab\xcd\xbe\xf2\xf6\x7b\xe3\x31\x2f\x2b\xb7\xd5\x69\x56\x56\x9a\x59\x86\xd0\x56\x28\xe0\x45\x5f\x3a\x5e\xf4\x90\x4b\xdd\xc1\xdb\xc9\x59\x85\x18\x72\x6c\x4b\x88\x2c\xb8\x61\xaf\x71\x7f\x28\x2a\x59\x82\xa7\x40\xf7\x1a\x3b\x31\x1f\xdc\xb0\xc5\x26\x40\xd3\x61\x55\x95\x24\xf7\x32\x68\xc4\x14\x8d\xb7\x11\x15\xef\x8a\x2e\xe6\x6e\xb8\xa3\xe4\x1d\x0a\x43\x77\x6d\x2e\x40\x41\x5f\x20\xd4\x95\xa0\x0b\xc4\x2e\x8d\x48\xc1\x68\xc9\x4d\xd6\x78\x16\xde\xdb\xa1\xea\xea\x0d\xd5\x35\xeb\x71\x42\x3a\x4c\x6c\x6a\x8c\x29\x40\xdc\x4c\x02\x49\xf3\x5c\x88\xa8\x67\x84\xd5\x24\x46\x5d\xe9\x3e\x42\x68\x38\x77\x0f\x91\xe6\x1e\xda\x77\x13\xaf\xc8\x6d\x64\xb1\x72\x43\x27\x63\xc7\xf8\x92\x56\x73\x92\x12\xad\xf9\xe2\x6b\x79\x51\x87\x7b\xdc\x06\xfc\xa4\x9e\xa1\x35\xea\xf2\xa8\xae\xe3\x86\x2e\x4a\x8c\x5e\xb6\xe2\x7f\xa2\x59\x03\x2e\xc5\x1e\x2d\x30\x4f\x44\x97\x14\xf4\x75\xf3\x46\xf5\x86\x89\xd6\x71\x89\x50\x2e\xb6\x53\xd9\x7a\x19\x33\x4c\xd0\x95\xc2\x5a\x78\x9f\x9b\xdd\x2a\xab\x97\xb5\xe9\x9d\x9a\x6f\xdf\xa9\x85\xb7\x53\xb7\x16\x00\xa7\x7a\xf0\xd9\xa6\x9d\x94\xb5\x99\x89\xee\xb7\x58\x28\x93\x2c\x94\x6d\x61\xa1\x45\xc6\x5a\x81\x44\x3a\x57\x14\xe7\x62\xc9\x64\x90\x98\xdd\x57\x0b\xad\xe3\x1c\xa1\x42\xcc\xa4\x77\xf0\xc5\xbc\xb5\x46\xf9\x6e\x6b\xe4\x84\x1f\x11\x95\xca\x8a\x4c\x9c\xf7\xf6\xf2\xec\x34\xff\x8a\x81\x6e\x0b\x30\xe8\x71\x4f\x86\x2b\x48\xd2\xe0\x04\x86\x79\x3f\xf9\xa5\x75\x46\x6f\x56\x42\x04\xbd\x53\x3c\x79\x8a\x74\x89\x77\x2a\xe2\x4a\xe2\xb6\x86\xb4\xd4\xb7\x31\xfc\x4a\x4b\xce\xf3\xaa\xf0\x02\xb0\x50\x19\x80\xc5\x2b\xa1\x32\x83\xc8\xcb\x1b\xff\x78\xa2\x25\xee\xf7\x1b\x5d\x6b\xca\x9a\xfa\xa0\xec\x50\x45\x37\xbf\x5f\xad\xc4\x01\x20\xef\x63\x3f\x14\x35\xc0\xc4\xe0\xbe\x2a\x2d\x87\x56\x2f\xf3\xd2\xa8\xcf\x62\x82\xa3\x08\xc9\xe8\x6b\xcd\xbb\x05\x78\x40\x28\x06\xd9\x76\xf0\x0c\xef\xda\x4d\x9a\x66\x2b\xaf\xd3\xbf\x41\x5e\x0f\xea\x2e\xe9\x06\x65\xf9\x87\x10\xb2\xbb\x66\x4f\x46\x52\xea\x0a\x22\xa6\x71\x78\xc3\x46\xc4\xd3\xce\xe0\xb5\x74\x83\x5e\x6c\xa3\xc2\xcc\x77\x97\x22\x26\xda\x59\x57\xd7\x74\x1a\xee\xdc\x46\x54\x09\x74\xae\x31\x45\xdd\x3a\x55\x73\x0e\x53\x15\xc9\x44\x0b\x05\x07\x24\x2e\xf4\xf5\x77\x6c\xfe\x82\x68\x0d\x69\x11\xcb\x74\xdb\x31\x99\x14\x53\x55\x4f\x37\xd1\xe5\x93\x62\x9a\xa9\xa8\xac\x6f\x55\x5e\xb2\x46\xff\x9a\xac\x0f\xe6\x22\x47\x6a\x0a\xdc\xbc\xe8\x4e\xb8\xa8\x14\xae\xe3\x20\xe4\x6a\x57\x6d\x2c\xc7\xb0\x43\x38\x73\xdf\xd9\x5b\x08\xc7\xae\xcf\x5f\xe7\xd5\x51\x39\x01\x32\x89\x50\xd3\xb3\x22\x13\x4f\x43\x5f\xa8\x16\xff\x80\xe7\x87\xf8\xaa\xe9\x44\x7e\xe3\x46\xf7\x8c\x58\x66\x9d\x07\x87\x4f\xcd\xf0\x81\xed\x6f\x52\xde\xb5\x8e\x04\xdb\xa9\x4b\x4a\xde\xf2\x76\x3a\x31\xb1\x29\x87\x6b\x2c\xae\x0e\x25\xe1\x1e\xec\x8d\x5e\x93\xc3\xed\xf3\x5e\x49\xf2\x9a\xf7\x2a\xaa\xa3\xac\x69\x44\x63\x6f\x5e\xcc\xe9\xe7\xbc\x47\x4e\x0b\x0e\xe1\xc4\xa5\xf7\x04\x04\x09\x47\xdb\x35\x0f\xec\x13\x73\xb2\x00\x9b\xfe\xfb\x54\x40\x6d\x08\xce\xc7\xd5\x00\xb5\x44\x16\x39\xf4\xb0\x3c\xba\x04\x03\x8d\xce\x0d\x3e\xa6\x2a\x14\x8b\xd4\xe3\x7b\xb8\x66\x02\xc1\x8b\xed\xed\xc9\x03\x06\xb5\x4f\x6d\x6b\x08\xb5\xc6\x7a\x53\xdf\xce\x1a\x49\xcf\xd2\xdf\xa9\xe2\x6a\x9a\x0c\x83\x8a\x42\x4f\xc7\x18\xd6\xf7\x02\xc0\x30\xac\xcf\xd6\x76\x42\x2d\x60\x2a\x7c\x8a\x1e\xb6\xd3\x4f\x6c\x81\x4b\x1f\x46\xbf\xee\x76\x7c\x67\xc5\x7a\xcb\x9a\xe7\x9c\xcd\x2d\xec\xbb\xb3\xca\x6f\x20\x20\x6f\x60\x54\x2c\xb0\x9e\x82\xbd\x5a\xc5\x0a\xc2\xcc\x35\x62\x48\x4d\x1c\x0e\x52\xcb\x15\xe5\xdd\x36\x0b\xec\xe4\x7d\xf0\x46\x7e\xfa\x57\xf2\x16\x35\xaf\x3e\x54\xde\xa9\x06\x83\xbe\xd1\x6c\x45\x96\x1d\xf6\x1e\xdd\xef\x39\x19\x11\x8a\x39\x8e\x7a\x45\xdd\xa3\x15\xef\x91\xbf\x96\x79\x29\xe4\x67\x7e\x42\x7a\x6a\x26\x7a\x76\x0f\xf7\x8a\x79\xcf\x0d\xdc\xe5\xee\x6e\x34\x32\xa8\x33\x20\x88\x4d\x00\xb5\xf1\x75\x18\x77\x0e\x21\x45\xb7\x14\x59\x6b\x07\xec\x98\x66\x21\x1b\xa4\x03\x23\xd1\x11\x49\x53\x9a\x14\x73\x94\x49\x1c\x07\x18\xc3\xc3\x80\xcb\xa0\xb7\x82\xf4\x0d\x2e\xb2\xfe\x30\xb4\xda\x64\x30\x20\x93\x23\x32\x5d\xc7\x36\x07\xda\x13\x15\x11\x12\x8d\x72\x38\xc0\x1c\x0c\xe4\x10\xb7\xa7\x05\xae\x6e\x4a\x7d\x28\x28\xf7\xe7\x9d\x8e\x18\x96\x9c\x92\xba\xce\x8f\x89\x31\xac\x94\x08\xe7\xe3\x9a\xf0\x97\xc5\x29\xa9\x96\xbc\x45\x31\x1b\x79\x05\x53\xe1\x79\x1c\xb3\x10\x2e\xb2\x90\xfd\x63\xc3\x96\x77\xf9\xf8\x46\xcb\xdc\x6a\xe5\xc2\x13\xd6\x23\x9e\xd4\xb3\x13\x22\xe4\x06\xbb\x22\x31\xc5\x1e\x4c\x4b\x86\x32\xc1\x97\x1a\xf7\x65\xec\x25\x1a\xfc\x25\x1e\x88\x3f\x0c\x00\x8c\x24\xea\xaf\x35\x5a\xe3\x21\x4a\x1d\x28\xd8\x9e\x72\x76\x0e\xaf\xc6\xe8\xcc\x64\x84\xfb\x69\xb7\xc5\x30\x8b\x50\x4b\x2f\x47\xdb\x14\xf7\x80\xb3\x82\x4a\x6c\x84\x39\xdd\xe3\xb8\x44\x6b\xad\x2d\xd0\x82\x96\x13\xc4\x95\xd4\x82\x83\x35\xac\x64\x9d\x28\xfe\x36\x9c\x99\xb4\xe0\x88\x50\xc8\x0d\x7c\x16\xfc\xd0\x05\xe4\xdb\x4d\xb8\xd9\x3d\xc1\x45\x6a\x48\x6f\x5a\x23\x05\xb7\x78\x7b\x16\xc0\x71\x3a\x9e\x0b\xf5\xc6\x56\xf5\x70\xdd\x06\x61\x05\xb6\xc1\x16\x94\x97\x82\xc3\x55\x10\xf2\x82\xe6\x2a\x10\x94\xa5\xc4\xc0\x88\x35\x9a\xee\x55\x63\x07\x18\xe7\x2a\x19\x57\xb5\x05\xc7\x56\x0e\x60\x9a\x23\xdc\xbd\x80\x73\xd1\x43\xc4\x2d\x72\x7e\x02\x58\xc5\x4b\x57\x2a\x1a\x3a\xb1\x3c\x36\xb4\xbb\x71\x71\x46\x5e\x43\x07\xcb\xc3\x7a\xc6\x8a\x85\x84\x1a\xc5\x9d\xef\x1a\x80\xbd\x5a\xbe\x3a\x24\x21\xa7\x4e\xbd\x2d\xda\xf0\xf4\x87\xac\x3a\x95\x07\x22\x64\xfd\x97\x06\xe9\x83\xf6\xa6\x27\x1d\xf0\x76\x48\x3c\xd9\xcd\xdc\x78\x46\xb5\x91\x5a\x5c\xcd\x6b\x38\xd4\xc5\x8d\x5c\x05\x08\xc0\x79\xd6\x98\x4e\x08\x67\xab\x2d\xdf\x01\x8c\xc3\x48\xc5\x98\x2a\xbd\xf5\xc3\xe6\x69\x1b\x97\x88\x87\xfd\xcc\xbb\x5f\x97\xc8\xd8\xc7\xe2\x5c\xf6\x29\x2b\xd1\x9a\x84\x98\x5d\x01\x19\x31\x72\x60\x54\xb8\x6b\x12\x32\xea\xa7\x32\xd8\x36\xd7\x9d\x80\x48\x9d\x03\x55\xc3\x61\x17\xd5\x02\xba\x27\x83\x58\xf0\x8b\x05\x19\xdb\x67\x69\x74\x92\xd7\x27\x33\x19\x62\x0d\x2f\x5d\x90\x31\x38\x9a\x98\x1b\x0e\xc2\xf0\x41\x6a\x0e\x68\x9e\x11\x39\x6c\xf7\x50\xe6\xfa\x50\x6e\x08\x17\x63\x55\x56\x02\x61\xed\xb6\x7e\x34\x4f\x43\x7b\x36\x29\xe6\xeb\x86\xc3\x6a\x9b\x9c\xc2\x3e\x36\x6e\x9c\xc5\xfe\x70\xe4\x1c\x8e\x0d\x98\x1e\xcc\x46\xfb\xf1\xc8\x91\xf4\x6c\x2f\x01\x26\xea\x3e\x58\xad\xfa\x74\xb5\xea\xc7\xee\xf4\xc9\x98\x3a\x30\xeb\x83\x41\x63\xda\xe5\xe3\xd5\xca\x7b\xec\x94\xf6\xab\xb1\xa7\xa7\x9e\x84\x25\x2b\x5b\x18\x5c\xd7\x59\xca\x3b\xc1\x42\xb8\x6b\xcf\x01\xab\x29\x20\x05\x38\x8b\xe7\x89\xd5\x2c\x6f\x2a\x73\xa5\xe1\x4e\x2e\x2e\x41\xb9\x92\x81\x93\xc6\xd1\xd7\x15\xbe\x1e\x5d\x42\x92\x71\xcf\xe5\x86\x18\xd7\xd3\xdd\xbd\x4f\x6c\x72\xb2\xe3\x67\x54\x79\xfc\x75\xb1\x7c\xe5\x8c\x13\xdb\x2e\xaa\x27\x5d\x1f\xb8\xc7\x93\x16\xf3\x63\x84\x3b\xb9\xad\x90\x4e\xbb\xde\x25\x4b\x6a\xb9\xef\x86\x3a\x94\x33\x2d\x6a\xfa\x0f\x0d\x77\xcd\x83\xa6\x79\xea\x35\x93\xb6\x43\xe0\x5b\x8b\xe3\x7a\x59\x41\x24\x72\x37\x0a\x63\x91\xd9\x08\xd6\x38\xf7\x5f\x6a\x01\x15\xc2\x34\x2d\x04\x05\xb0\x33\xf2\x50\x17\xae\x32\xba\x5a\x05\xc5\x19\x5c\x67\xe5\x38\x40\xd6\xa6\xa1\xb4\xc0\x33\x10\xf3\x75\xc4\xcb\x5c\x45\xbc\x94\xee\x78\xe9\x6c\x2b\xe2\x31\x50\xb9\x17\x96\x9b\xa1\xd1\x21\x23\xf9\x1b\x15\xa7\x52\xf5\x5d\xd4\xbc\xe5\x53\xf5\x99\x8e\x46\x39\xcb\x98\x72\x65\xf4\xad\x9d\xb3\xc1\x20\x56\x75\x31\x72\x5a\x9d\x11\xc8\x15\xf5\x9c\x55\x8b\x3a\x9e\xa1\x36\xec\x15\x17\xc0\xec\xdc\x54\xbf\x1a\x1e\x7c\xc4\xd5\xfd\x56\x87\x29\x97\xd9\x6b\x46\x8d\xe0\x28\xa4\x23\x1a\xf8\x64\x38\x1d\x0c\x64\x24\x61\x7d\xc4\x45\xb7\x80\x2d\x4d\x86\x26\x00\x3c\x38\xdb\xf0\xb8\x3f\xc4\x43\x1b\x8d\x61\x88\xa9\xd8\x8c\x4c\x06\xbe\x59\xce\x3c\xc5\xbb\xee\x71\x54\xc1\xdc\xdb\x06\xd9\x60\x20\xe7\x40\xde\xc6\x98\xf2\xae\xad\xf5\x95\xcb\x0b\xf8\x6d\xde\x86\x12\x8e\x07\x5c\xb9\x09\x04\x81\xe6\xe0\x30\x99\x92\x35\xc2\x93\xa9\xbe\x00\x9f\x09\x06\x33\xb9\x54\xf5\xa5\xf9\x7a\x8a\xd6\xd0\xbe\x0a\xa9\xf1\xdc\xc6\x92\x6e\x7e\xe4\x95\x99\x6a\x6b\xa0\x6e\xbe\x6f\x46\x36\x6e\x7d\x38\x45\x29\x28\xe5\xc7\xa2\x1d\xd3\xb3\x76\x04\x38\x98\xad\x61\x96\x15\x83\xff\x8f\xbd\x77\xe1\x6e\xdb\x56\x12\xc7\xbf\x8a\xcc\xcd\x5f\x25\x6a\x88\x21\xa9\xa7\xa9\x30\xba\xae\x93\x36\x69\x9d\xc7\x4d\xd2\xb4\x8d\xaa\xeb\xa5\x25\xd8\x62\x43\x81\x2a\x09\xf9\x11\x4b\xfb\xd9\xff\x07\x2f\x12\x24\x41\x59\x4e\x9c\xde\xfe\x76\xef\xc9\x89\x4c\x12\xc0\x60\x00\x0c\x06\x83\xc1\x60\xa6\x69\x58\x06\x0f\x65\x6b\x8a\x77\xf6\x3a\xc2\xfe\x9e\xed\x19\x16\x4f\x1c\x91\xfd\x7d\xcf\x30\xf6\xfc\xa4\xd9\x44\xdc\x95\x4a\xc2\x14\x8c\x08\x78\x1a\x1c\x36\x70\x3c\x29\xe8\xcd\xce\x99\xbf\x3b\x98\xd0\x1d\x38\x37\x3e\xb4\x48\x4c\xf7\x25\xb9\x53\xa1\x9c\xaa\x8a\xb7\xbb\x14\xe2\x8a\x74\x5e\x6a\x91\x15\xa6\x87\x22\xac\xab\x4a\x3d\xd7\x19\x3c\x4a\x44\xac\xd2\x96\xc3\x83\x23\x0a\xf5\x9c\x75\x42\x39\x3a\xed\x62\xe6\xdd\x24\x3f\x9d\xc9\x33\x30\x3b\xe8\x82\x6b\x16\x01\x3a\x81\x89\xf0\x57\x11\x13\x68\xf3\x5b\xb0\xa1\x3f\x27\xdc\x90\x85\xc5\x20\xa0\xd4\x3c\xb2\x3d\xa7\x12\x54\xaf\x12\xdf\x90\x39\x10\x82\x81\x8f\x87\xc1\xe3\x90\x07\x5c\x08\x5a\x7e\x08\xf7\xcc\x84\x85\x0b\x63\xfe\x9a\xeb\x0f\x93\xb9\x3f\xee\x46\x7c\xd6\xf8\xc6\xb2\x1e\x7e\xc3\x8e\x92\x93\xb2\xf7\xbd\x4d\x19\xff\x3d\x07\x86\x2d\xa6\x12\xd1\xb6\x17\xd6\xf6\xd3\x7e\x08\x73\x1f\xe0\x4f\xe2\xd5\x69\x84\x9e\xc4\x24\x05\x1b\x66\xa3\x84\x78\xc0\xa1\x92\x4f\xa8\xd1\x29\x31\xa3\xa2\xff\xa9\xc8\x0a\x29\x34\xee\xe3\x95\x75\x18\xf0\x16\xbb\xe4\x1a\xe6\x04\x53\xca\x1c\x0b\x62\xd9\x98\xb1\x8e\xe1\x42\x04\xa7\x90\xb3\x82\x74\xc4\x83\xeb\x2b\xd1\x45\xd5\x6d\xd5\xfd\x2f\x6b\x5a\x63\x50\xba\xd6\xb1\x48\x21\xa3\x8a\x4c\x0c\xa0\xf0\xe6\x51\xaf\x76\xc1\xe5\xfb\x8e\x45\x4f\x96\x9a\x8d\x42\xa2\xd1\x8a\x90\x6a\x17\xfc\x55\xad\xaf\x4e\x0c\xd5\xd1\x91\x3d\x24\x8f\xe4\x0a\x31\x24\xd2\x0d\x23\xf6\xd1\x98\x4c\x72\x57\x8a\xb8\x3a\x2d\xde\xcd\x51\x23\x41\x7f\xae\x50\x4a\xd0\xac\x41\xb7\xc4\x8d\x69\x8c\x49\x10\xe2\x34\x57\x6c\x62\x68\x34\x04\xed\x34\x02\xd2\x60\x44\xa6\x2a\x2f\x59\x14\x4a\x54\x12\x05\x95\x2d\x77\x31\x16\x2e\x5d\x22\xd4\x9e\x54\xc5\xe5\xdb\xfc\x10\xd4\x87\x7f\xc9\x7d\x12\x0a\xb2\xa8\xdf\x93\x91\xe4\xfa\x86\xf8\x1a\x78\xfc\x3a\x3f\x92\x8a\x23\x0c\x64\xb6\xba\xdb\xd7\xa6\x2e\x24\xb5\xe2\xeb\x20\x77\xb5\x20\xdc\x07\xd7\x38\x23\xc8\x14\xcd\x74\x1d\x61\x5b\xb7\x8a\x4c\xf4\x1e\x03\x6f\xcf\xd1\xa7\x7d\xc4\xc0\x23\x90\x87\xd1\x91\x97\x07\x91\xf6\x1a\x2c\xb3\xb6\x52\xdc\xdf\x28\x73\x68\xb8\xbd\x64\xa2\xfa\xee\x28\x0b\x45\x5b\x86\xad\x78\x0e\x5e\x11\x45\x54\x57\xff\x63\x3c\x19\x16\xe4\xb0\x84\xc5\x58\xc0\x13\x3f\x01\x90\xb0\xd8\xac\x65\xcf\x93\xdb\x2e\x25\x56\x35\x32\xca\x35\xcd\x1a\xf5\x0a\x2a\xea\x90\x51\x75\x1b\x43\xac\x70\x96\x1f\x55\x89\x6b\xfe\xc4\x52\x2f\x0a\x43\x54\xd8\x66\xb1\x5b\x4d\xa6\x28\x57\xdc\x1b\x56\xaf\x67\x15\x95\x9f\xa5\x7d\x23\x00\x15\x8c\x14\xc5\x3a\xaa\xee\x0d\xb9\x12\x5c\x5e\xca\x55\x2e\x57\xb3\xa6\x8a\x0b\xeb\xd6\x65\x90\x60\xd3\xf8\x19\xcf\x19\x51\xcf\x1a\xca\xf1\x06\x23\x76\x2f\xe7\x04\x04\xa8\xbe\x6e\xab\x5c\xf3\xd6\x30\x82\x90\xd9\xa8\x15\xf6\x4b\x92\x64\x2b\xd7\x88\x1d\x71\xd1\x05\xa6\x70\x0a\x57\xbe\x4e\x39\x01\x67\xfe\x25\x6d\x4d\xb3\xb9\x6a\x36\xf7\x2e\xb1\xb9\x92\xbb\x75\x38\xf7\x4d\xfd\x46\xd4\xf7\x57\x56\x38\x13\x9b\x9b\x4a\x97\x8d\x56\x62\x91\xf0\x56\x9a\x43\xb2\xb2\xce\xa2\x78\xd3\x70\xd6\x6c\xce\x6b\x5b\x43\xa5\xaa\x91\x19\xfb\x99\xd5\x05\x4c\xd9\x33\xd3\xa4\x4f\xfd\x50\xea\xd0\x81\x37\x65\x0a\x71\x01\xa0\x64\x2e\x13\xfb\xb4\x1c\x11\xe6\x22\x4b\x78\xe6\xef\xef\x57\x94\x9f\xd2\x99\x12\xdd\x07\xaf\x88\x38\x56\xbc\xcd\xd3\xc1\xc8\xcc\x14\xa9\x05\xe2\x6e\x36\xcd\xb2\x6a\x52\xb9\x4b\x0c\x97\x3e\x8b\x81\x51\xd5\xd2\x8d\x74\x1f\xbd\x44\x39\xf6\x5e\xaf\x13\xcd\xd9\xc6\x48\xec\xc1\xcc\xa0\xa0\xb6\xe6\xe5\x81\xba\x84\x8e\x02\xcf\xf6\xa4\x57\x5b\x33\xba\x25\x7b\x34\x8a\x3c\x1b\xec\x3b\xc0\x5b\x4a\xb7\x1c\x05\xc5\x37\xbb\xf1\x7f\x56\xbc\xf1\xbf\x94\xf7\xd8\x49\xf9\xf2\xfa\x67\xba\x02\x50\xce\x65\x05\x95\x65\x77\x78\x93\xec\xa2\x7d\x2c\x0f\x5a\xd2\xec\x84\x65\x7a\x87\x9b\xf2\x3b\xdc\x8a\xdf\x00\x38\xb5\xf8\x22\xa7\x61\xd9\x39\xe9\xb2\x33\x93\x82\x7b\xeb\xc2\x41\xf3\xad\x3e\xa2\xb6\x44\x6b\x4b\x6e\xbf\xf6\x28\x8f\xbf\x98\x62\x53\x9e\x27\x60\x2a\x91\xa1\x97\xe7\x4a\xf3\x38\x6f\x2d\xf2\x60\x00\x8a\x4a\x78\x2b\x4c\x8f\x24\x55\x93\xf9\xd3\x3f\x57\x41\xf4\x2e\x36\x31\x58\xaf\xb3\x7a\x72\xc2\x1c\x15\x8b\x8a\x04\x5e\x17\x86\x86\x01\x13\x19\xc2\x35\x9b\x11\xb1\x4c\x50\x55\x6a\xca\x79\x57\xad\x34\x42\xb9\xe3\xee\xa2\x62\xb3\xa9\xbe\x31\x8f\xc8\x77\x9a\xe4\xc5\x60\x6a\xea\x34\x6f\xa1\x42\xff\x0d\x73\xe5\xe8\x5e\xae\x03\x6d\x36\xc5\x69\xe3\x9e\xef\xeb\x9d\xb0\x88\x73\x97\xe2\x4c\xa0\xd3\x33\x57\x55\xeb\xf9\x6e\x8d\xe6\x5a\x5e\x73\x05\x22\x3a\xa2\x4e\xf1\xe4\x2b\xe0\xf1\x0e\xe0\x95\xd3\xea\x0c\x3c\xbf\x59\x13\x4a\xad\x20\xd3\x87\xf2\x01\x97\xa4\x57\x31\xa1\xd0\x7a\x18\xa1\xe5\xe8\x97\xf8\xa8\x90\x6a\x82\x32\xc5\xcc\x39\x5d\xfc\x10\x9b\x21\x3f\x22\x2d\x1c\xf9\xdf\x36\x8e\xcd\xa6\x29\x7d\x1c\x6a\x50\xdd\x82\x45\x51\xe3\xcb\x8a\x6d\x39\xe0\x54\xcd\x56\x34\xc6\x1c\xba\xb1\xa8\xe9\x97\x92\x9f\x99\xfa\x8d\x9a\x56\x6a\xcd\xbc\x34\x14\xb0\xd7\xb4\xb0\x4e\x3b\xac\x9f\xcb\x5b\x79\x54\x79\xbf\x48\xa7\xf7\x36\x1e\xa4\x93\x35\x34\x2e\xa1\x94\x21\xa8\xb7\xbf\xd8\xc6\x58\x55\xcb\x85\xca\x69\x43\xc5\x3e\x4e\xb0\xc1\x92\xbd\x1b\x2c\x9e\xd0\xe7\xc7\x11\x9a\x96\x6d\x73\x9f\x76\x47\x09\xa3\x68\xc2\x86\xa0\x51\x15\x10\x0c\x8f\x6c\xbc\x52\xbe\x4d\xee\xa3\x2d\x3b\xe3\xe6\x25\xcf\x82\xa9\xaf\x31\x04\xc5\xe8\xd2\x24\xeb\x35\x02\x66\x68\x1d\x7f\xff\x83\x19\x5a\x4f\xae\x7f\x00\x90\xbf\x3c\x47\xf2\x69\x81\xe5\x53\x62\xfd\x96\x7d\x0d\xad\x4f\x69\x3b\x7f\xb9\x68\xa7\xf9\xcb\xdb\x30\x92\x2f\x42\xf5\x0f\x36\x50\x22\xb3\x4c\xe2\x0b\x3f\xb4\x7e\xfb\xd4\x37\x6f\x48\xfc\x11\x61\x0f\xc1\x33\xee\xfb\xd2\x53\x10\xde\x94\xdd\xcd\x5d\xaa\xb7\xaa\x14\x95\x03\xbb\x6e\x40\xc7\xfc\xd9\xdd\x9d\xb1\x69\x22\xba\x51\x12\xcc\xfc\xa9\x91\x92\x3f\x35\x5c\x72\x47\x99\x48\x5f\x94\x54\x22\x7b\x82\x08\xb3\x30\xf5\x85\xdb\xb3\xcc\x81\xa2\xe2\x0a\xed\x24\xfb\xf8\xa6\xe4\xe2\x52\x26\x3c\xcd\x7d\x9d\x85\xd6\xc5\x52\x30\x86\x19\xda\x9e\x8e\x83\x05\xf2\x83\xf5\x7a\x86\x20\xb1\x74\x7e\x2a\xcd\x2c\x1b\x2b\xa0\xf3\x9e\xb3\xc3\x71\x53\xb1\x7b\x2c\xbd\x6f\xca\xbc\x2a\x50\x38\xca\x7a\x8e\xc3\xea\x81\x1b\x3f\xfd\x2c\xf6\x57\xc1\x80\xa3\x54\xa5\x1a\x2d\x29\xab\x66\xc8\xa2\x81\xb2\xf9\xc1\x6c\x00\x33\xe7\x96\x7c\x19\xe4\xaf\xea\x77\x79\x1d\x50\xac\x36\xb2\x66\x16\xe7\x52\xde\x14\xcc\xe6\xbe\x38\xfb\xa0\x1c\xa9\xa4\xa6\xe0\xde\x31\xb5\x47\x9c\x7b\xa5\x36\xe5\xdc\x4c\x5a\xb4\x54\x0a\x6a\x3a\xa2\xa2\x87\xe2\x5d\x2d\x6d\xe7\x72\x17\x9d\x45\x35\x5d\xf6\xdd\x92\xde\xd2\xf2\xc8\xb2\x05\xfa\xfb\x8a\x38\x94\x28\xbd\x06\x01\x1e\xe2\x66\xcb\x21\x71\x09\xcc\x48\xf7\x31\x57\x2a\xcf\x02\x12\x78\x37\xf9\x38\xcd\xf4\x8e\xae\xbf\xb4\x9d\xc5\xb5\x92\x57\x62\xf2\xad\xa6\xa0\xda\x2c\xb7\x7e\x5c\x6e\xe3\x08\x4a\x77\xd5\x78\xd5\xa6\x8b\x4b\x09\x26\xd2\x03\x2c\xf1\x30\x4a\x12\x28\x21\x26\xb2\xe6\x71\x4a\xde\x87\xe8\x52\x39\x3b\xce\xb8\x8c\xbe\xcb\xb6\x4c\xd3\x8c\xac\x87\x25\x0a\x9c\x71\xb6\x20\xcf\x87\xef\xc6\x14\xcb\x6c\xcf\x42\x8b\x90\x1f\xc8\x97\xc9\x89\x4e\xdd\x5a\xeb\x0a\x06\x4b\x99\xb3\xb5\xb1\x64\xb3\xcb\xc8\x01\x6e\x04\x51\x82\x82\xd9\x75\x3e\xf0\x0d\x7e\xea\x26\xc7\xbf\x8c\x35\x12\x86\x1b\x54\x74\x97\x47\xc2\x82\x81\x64\x77\x25\x32\x73\x36\xe9\x45\x1b\x59\x27\x67\x2b\xb2\x4a\x90\xdc\xb0\x16\xef\x2d\xca\xec\x99\xe6\xbe\xca\x0d\xcb\xce\x85\x73\xae\x98\x87\x19\xe6\xc1\x4e\x5e\xf0\x13\xcd\x32\x35\x88\x6b\x11\xa5\x71\x2b\xa9\x32\xa6\xa2\x0e\x81\x8f\x54\xe8\x66\xe9\x22\x7c\x49\xe6\xe3\xb1\xb0\x20\x5a\x8b\x20\xf9\xf8\x7d\x9c\xb0\xbb\x47\x65\x42\x50\x07\xb6\x86\x79\x81\x2f\x11\x6c\x7e\x6b\xf7\x84\x04\x43\x9f\x42\x2b\x3d\x39\xcd\x5f\x4e\xde\xcf\xe8\xcb\x83\xc1\x0b\xd3\xa0\x7d\x66\x28\xf9\xbe\x7b\xa5\x4a\x2d\xb3\x30\xf1\x43\x2b\xfa\xc1\x35\x6f\xc8\xf5\x12\x79\x08\xa6\x28\x62\xad\x4b\xbd\xf1\xd8\xe0\xb2\x59\x4b\x50\xc8\x64\x02\xe3\x15\x59\xae\x48\xea\xdd\x14\xdb\x99\x13\xac\x01\xcb\xc4\x5d\x98\x7f\x1b\x88\xae\x96\x71\x42\x0e\x53\x6f\x6c\x48\xb0\x42\x26\x82\x2f\xb6\xfa\xa8\xd7\x84\xb4\x53\xf8\x00\x23\x8a\x4c\xc0\xc1\xaa\xd8\xe3\x27\x1a\xa9\xe0\x1c\x69\x63\x32\xe5\x06\xc7\x74\xa7\x48\x46\x79\x45\x1e\xfd\xb2\xc0\xa3\x6a\x6d\x9e\x52\x17\xf7\x90\xcc\xce\x37\xa4\x77\xe4\xe3\x6d\xe1\x00\xe1\xd5\xe7\xf9\x4e\x5e\x0a\xa7\x66\x5b\x9a\x50\xf2\x3d\x9c\xe1\xf3\xe1\x8e\xf2\x64\x08\x03\x7d\xd7\x67\xc1\x01\xe4\x64\xcb\x42\x05\x72\xe4\x54\x37\xb1\x41\x21\xa8\x80\x70\x0f\x4a\xa1\xdf\x6e\xd9\x7f\x8b\x7b\x50\x4d\x6e\xe9\x1e\x54\xe7\x73\x1a\x91\x9f\x97\xaf\x33\xfc\x76\x38\x35\x48\x2b\x36\x9a\xbc\xf1\x52\xc9\x7f\x9b\x5f\xc3\x82\xeb\xf9\x1f\xb9\xe5\xfb\x1f\xfa\xcb\x63\x48\xf6\x9c\x09\x36\x00\xe8\xce\x28\x40\xf1\x10\x44\x4f\x03\x85\x05\xac\x10\x55\x80\xfb\xab\x2d\xac\xdd\xe2\x24\x85\xf1\x7a\x16\xe4\x5d\x69\xa1\xf0\x64\x76\x17\xc3\xad\xb4\x60\x63\x55\xf9\x54\x34\xad\x2a\x1f\xe7\x70\x24\xb6\x87\x26\x1f\x4f\xbe\x20\x36\xb9\x1a\xda\xa1\xd9\xdc\x63\xb7\xd2\x8f\xe3\x60\xd6\x6c\x06\xa5\x30\xce\xc2\xd1\x58\xe9\xf3\x30\xe1\xf6\x1c\x9a\x9e\x8b\x45\x1c\x67\x18\x8b\x20\x55\x32\xa4\x6b\x7d\xad\xa3\x22\x34\x36\x98\xc2\xa5\x2f\xbf\xa3\x91\x87\x13\x6a\x36\xeb\x6b\x46\x50\x09\x3b\x04\x94\xa0\x6e\x61\x31\xa8\x9b\x1a\x58\x5d\xde\x2e\x55\xae\x55\xfe\x62\xfd\x08\x4c\xfd\x7d\x30\xd5\x1a\xb6\x80\xe7\xad\x01\x3c\x8a\x94\x56\xe6\x0a\x19\xb9\x93\x6a\xbc\x89\x2c\xf0\x87\xa8\x2a\xbf\x25\x59\x4a\x00\x1e\x2e\xc6\x85\x50\x5c\xf5\xed\x12\x1a\xa2\x04\xce\x47\x10\x97\x3b\x58\x0e\x2d\x92\x43\xcb\xaf\x68\x7e\xa1\x5a\xe2\x04\xdf\xae\x66\x28\x68\x23\x8e\xf1\xe7\xeb\x1b\xe0\xd3\xbb\x70\x7d\x79\x26\x5b\x51\x4c\xbb\x5a\xc5\xb4\xab\xda\x30\xb8\x13\xef\x66\x53\xf5\xfd\xae\xae\x17\x17\x21\xba\xa4\x42\xc0\xdb\x69\x12\x47\x6a\x50\x19\xc6\x23\x72\x77\xef\x41\x4a\x72\x27\xea\x4c\xb9\xc6\xd4\xd0\x7e\xc1\x32\x43\x4a\xa4\xec\x78\x26\xcf\xce\xde\xfd\x9b\x0d\x4c\xac\x94\x55\xf3\x3a\xe6\xca\xb5\x37\x2c\x2b\xd7\x7b\x6c\x49\x5b\xaf\x8d\x59\x98\x32\xef\xdc\x06\x4c\xac\x00\x4f\xe7\x71\xc2\x11\x0e\xf1\xb9\x5f\xf9\xa2\xe6\xd7\xac\x3b\xa1\x5e\x49\x90\x97\x91\x2a\x75\xd1\x07\xf5\x88\x09\xae\x5a\xee\x43\x2b\x45\x44\x1c\x36\xf0\x4f\x4a\x11\xd3\x58\x04\x78\x15\x44\x46\x61\x34\xb8\x74\x56\xbd\x82\xc0\x65\x62\x0e\x84\xe7\x91\xb2\x6d\xaa\x7c\xd3\x94\xe3\x21\x0a\x8b\x05\x4b\xa6\xb0\x6a\xe2\xf6\xb5\x57\xe5\x1c\xc5\x05\x57\x7f\x74\x4f\xd4\x65\xf6\xc1\xc8\x44\x9c\x02\xc6\x48\x90\xd1\xc4\x47\xd5\x3e\x3b\x47\xe2\x59\xf6\xb3\x99\x1d\xb1\x73\x4a\x53\x6d\xe7\xdf\x71\x31\x43\x71\x9e\xca\x8e\xfe\x0b\x27\x83\xa3\xd2\x7b\xe1\x5c\xd6\xb3\x81\x57\x40\xf3\x47\xa6\xd5\x11\x64\x2e\x2d\x04\xc4\xa1\xba\xd2\x53\x66\xe6\xe6\x29\xc9\x2d\x36\x88\xee\x78\x5a\x9a\xe0\x16\x8e\xe9\x35\xe3\xf2\x15\xbb\x7e\x85\xd8\xc5\xbf\xa5\xe8\xd0\x91\x41\xe2\x25\xb7\xa3\xbf\x95\xb2\x47\x9a\x11\xe2\x99\xdf\xc5\xd9\x00\x8d\x6d\x68\x4f\x80\x67\x20\xee\x39\x7f\x47\xd0\xcd\xe6\x2e\xb0\x73\xb4\x81\x47\xc4\x04\x6f\x36\xf5\x55\x95\xa6\xff\x36\xdc\x0f\x59\x56\x53\x42\x04\x5e\x61\xd6\xdf\x1b\xf6\xbc\x67\x74\x06\x1a\xca\xd0\x6f\xd1\xb8\x88\xa1\xae\x48\xd3\x2b\x64\x22\x58\xbc\x2c\x51\xe4\xc7\xa3\x9c\xe1\x8e\x4b\xdc\x78\x22\x6e\x99\x80\x3b\x09\x91\x75\xfc\x49\x1e\x79\xd5\x24\xeb\xec\xf6\xeb\x58\x96\x94\x4d\x6b\x92\xcb\x72\xea\x7d\xad\xf4\x89\xf5\xf4\xc5\x7d\x1d\x21\xc0\xe7\xd5\x48\x6f\x6f\x4e\x8e\x5e\xbd\xfc\xfe\xf9\x0f\x3f\xbf\x39\x7c\xf7\xfc\xd5\x4b\x03\xc0\x77\xba\x4c\xdf\xbf\x7a\xf3\xe6\xd5\xab\x77\x27\x3f\xfc\x7c\xf8\xe6\x89\x01\xe0\x2b\xec\x8f\x13\xeb\x37\x04\x6f\x28\x0a\xe1\x0c\x79\xcf\x11\x5c\xa5\xe8\x28\x0a\xd2\xd4\x7b\x87\x36\x79\xc2\x09\xa6\x09\x42\xcf\xa3\x31\xf4\xe1\xc7\x0f\x42\x7a\x2e\x8b\x0f\x7d\xad\xf8\xd0\x57\xc5\x87\x3e\xbb\xd7\x90\x56\xcb\x0e\x94\x4c\x83\x89\x70\x38\x00\xa7\xd5\x8c\x07\x4a\xc6\x83\x2c\xe3\x8a\x75\xc3\x09\x36\xb9\x22\x52\x41\xf7\x14\x99\x51\x1e\x0d\x2d\x6d\x36\xcd\x95\x36\xd2\x49\x0a\xe0\x94\x25\x6a\xc2\x9c\x4c\xcb\x0e\xe6\x50\xe1\x3a\x2a\x63\x89\x85\xc0\x2e\xc5\x74\xba\xea\xd4\x19\x19\xb2\xb2\xb5\xf1\x5f\xea\xcb\x51\x98\x1a\x6f\xe7\x3c\x66\x96\x26\x12\x8b\x36\x37\x05\x52\xeb\x86\x84\x33\xfa\xda\x90\x2d\x5b\x4a\xf2\x13\x48\x9d\xfb\x61\x06\xb3\x26\x72\x4b\x5d\x19\x0a\x4d\xe7\x34\x41\x73\x21\xda\xd7\xe4\x64\x26\xd0\x2b\x00\x63\x8b\x33\xfa\x77\x49\x30\x0d\xf1\x79\xb3\xb9\xda\xb2\xec\xe5\xf6\x1b\xc3\xdc\xb4\x41\x5a\xd4\x9d\x27\xf1\x6a\x59\xb0\x68\x58\xaf\x89\x35\x0d\xa2\xc8\x14\x59\xa0\xc1\x8f\x58\x1b\x8c\xf5\x78\xaa\x13\x01\x9a\x83\x24\x2b\xb6\x67\x67\xfa\x4e\x00\x25\xdc\x28\x3e\x37\x55\xa3\xb3\x52\x0a\xf7\x58\xc3\xcd\x20\x0a\xa8\x3c\xc5\xb3\x82\x01\xc4\x7a\x8d\x0b\xd8\x80\x0d\x80\xab\x0d\x9c\xa1\x65\xea\x8d\x9f\x23\xb8\xc0\x90\x71\x03\xb6\xfb\x80\x6c\x77\x02\xd9\xb6\x04\x5e\x60\xf8\x1c\xc3\x71\x55\x75\x51\xaf\xe1\xa2\x9c\x8a\x73\xa0\xef\xc3\xdf\x26\x5f\x52\x76\xb2\xa1\x98\x65\x9c\x08\x13\x3d\x27\x2a\x47\xcc\x54\xee\x2e\xc9\x36\x9e\xe0\x89\xc2\xd2\x78\x03\x33\x76\x17\x5a\x4f\x0f\xdf\x6f\xe0\x07\x0c\xaf\x30\xfc\x4a\xba\xb9\x06\x31\xf3\xad\x69\xd1\x0f\x42\x8d\xfa\x4e\x0d\x3c\x98\x73\x69\xc6\x8c\x99\x9b\x7e\xef\xa6\x40\xbd\xde\x9e\xb3\xd9\x4c\xf2\x53\xe6\xd7\xa5\x48\x8e\xa1\xf5\xfa\xd7\x0f\xa6\xa0\x42\x03\x9e\x60\x7e\x2d\xe3\xe5\xdd\x76\x89\xda\x5e\x60\x0c\x56\x74\xc5\x59\x9c\xbc\x89\xe3\xaa\xd4\xa1\xf8\x17\xb9\x91\xae\x8c\x3c\x04\x45\xbb\x92\xd4\x1b\xbf\xc2\xf0\x0f\x16\x49\x3c\x6b\xec\xbb\xc2\xca\xf3\x04\x8b\xb1\x1c\x9f\xe0\x9c\x46\xc4\x13\x59\xda\x13\x75\x84\xd5\x7e\xc2\x2c\x8c\x6e\x9e\x96\x58\x6f\x1f\xa8\x80\xbf\x97\x80\x13\x2b\xba\x84\x63\x01\xf0\xbb\xc4\x4c\xac\x45\x52\x20\xe5\xe7\x05\x2a\x7a\x5a\x40\xef\x0d\xce\x48\x0d\xd2\x45\xbf\x94\xf9\x98\x65\x7e\x7a\x15\xa6\x84\x0e\x16\xb3\xa1\xac\xea\x47\x46\xba\x8f\xde\x15\x2e\xd0\xee\xeb\x5f\x3f\xc0\xc5\x2a\x22\xa1\xb7\x67\xab\x18\xbc\xc6\x1b\x38\xfe\x01\xab\x59\xc3\xa5\xa3\xcd\xfa\x49\x22\xfb\x43\x01\xc9\x9f\x0b\x2d\xfa\x4e\x9f\x29\xb4\xc8\x69\x01\x68\xd6\xa8\x9f\xf1\x66\x32\xc9\x4f\xb4\xce\xe2\x84\x29\xc1\xaa\xb4\x70\x0b\x25\x30\x32\x98\x7c\xb1\x15\xc8\x3b\x0c\x07\x52\xf4\x3a\xa1\xcf\x8a\xe0\xb5\x88\x67\x7e\x68\xc5\x87\xdf\xc9\x53\x10\x2a\x62\x89\xb4\x10\xff\xe1\x87\xd6\xf4\xc7\xb7\xe6\x4d\xc5\x76\xe3\x4d\x39\x26\x20\x16\x12\xe5\xab\xb3\xb3\x14\x31\x17\xc8\x29\x22\xfc\xc5\x2c\xa6\x71\x4a\x7a\x2a\x01\xe4\x01\x04\xbf\x2f\x68\xd1\x3e\x5f\x03\x93\x61\xb4\x4a\xd1\xb3\x20\x9d\x8f\x98\x5f\x2d\xeb\x09\x73\x41\x0c\x3c\xfe\x76\x6a\xf3\xc3\x8a\xac\xf6\x27\xaa\x35\x0a\x73\xb3\x87\x66\x46\x9e\xfc\x87\x92\x3c\x56\x68\x60\x86\x7e\x28\x10\x01\x9f\x6a\xaa\xdc\x78\x81\xb5\x19\x26\x8c\xed\xfc\xb0\x3b\xdb\xa9\x1c\x45\x64\x87\x0f\xd9\x61\x44\xa8\xfa\x9b\x91\x17\x92\x67\xd2\x8c\x23\xfb\x92\x30\xe7\x8e\xaf\xce\x0a\x9e\xb6\x9e\xc4\x18\x65\x01\xf9\x34\xbc\x3d\x58\x2e\x9f\x73\xbf\x15\xe1\xa7\xdb\xdc\x40\xa8\xfb\xe8\x82\x1a\x3e\xb1\xde\x9f\xc0\xb2\x85\x38\xb7\xc5\xb0\xc8\x1c\x61\xb3\x78\x3c\x8d\x72\xe4\xb7\x99\x97\x0b\xff\x0c\x94\xfb\xe2\x1a\x13\xf2\x7c\xf9\xf1\x29\x89\x33\x5f\x66\x2a\x62\x6c\xa3\x52\xfe\xf8\x1c\xcb\x29\x97\xef\x5b\x99\xfb\xba\x8a\x03\x0f\x76\x91\x72\xab\xb3\x0e\x42\x31\x2d\xee\xde\x35\x70\xd6\x6b\x99\xe1\xbb\x28\x9e\x7e\xe4\xd7\x48\xeb\x2a\xac\xf3\x99\xe6\xeb\xce\x57\x8a\xc4\x31\x2a\xae\xb1\x9e\x59\xce\xc0\x1c\x09\x31\x27\x21\xa8\x9e\x5c\xc0\x06\x26\x55\xd4\x98\xc9\x27\x2b\x8a\x95\x1d\xf9\x69\x1c\x93\x94\x24\xc1\xb2\xd6\x91\x48\x31\xcc\x6b\x79\x20\x64\x70\xad\xc2\xf7\x0f\x38\x3b\x47\x2f\x7c\x7f\x8a\x01\x0c\x34\xdf\xe9\x28\x47\xda\xd3\xa1\x4f\xee\xf7\x60\x88\x7c\xdf\x8f\xf2\x33\xfa\x94\xdd\x41\x36\x4d\x39\x24\x2f\x63\xac\x8e\x0a\xd1\x0d\x5f\x2e\xf8\x56\x53\x41\xb3\x19\xe8\xba\x0b\x62\xab\x74\x38\x67\x02\xd1\xb1\x26\x80\x81\xa5\x77\xcf\x63\x2a\x98\xd2\x77\x76\x93\xf4\x96\xf9\x2d\xee\xe5\x28\x61\x10\x6b\x73\xe6\xae\x04\xee\xa4\xc0\x50\x98\x8d\xfd\xe5\xd6\x8b\x9f\xd2\xf6\x7d\x18\x1a\x7e\x2a\xca\xc6\x45\x4e\x66\x9d\x86\x78\x66\x22\x65\x25\xf8\xae\x98\xbd\x42\xb9\x59\x09\x4a\xae\x3f\x17\xb5\x0c\x7c\x6f\xa3\x32\x4a\xb0\x81\x6d\x7b\xd0\x76\xf3\xae\x9a\xc3\x33\xb8\x00\x37\xc6\x2a\x45\x8d\x94\x24\xe1\x94\x18\xc3\x85\x35\x33\xcf\xe0\xcd\x4f\xbd\x43\x8d\xdd\xd4\xf5\x74\x03\x93\xde\xb5\x26\xe5\x38\xd8\xc0\x97\xd1\x4f\x9a\x94\x45\xb0\x81\x3f\xff\xd8\xd5\xa4\x5c\x05\x1b\xf8\xee\xf9\x42\x93\x72\x9e\x6e\xe0\xd1\xf5\x2f\x3a\x0c\xd2\x0d\x7c\x7e\xf0\x49\x57\x4f\xba\x81\x3f\xfd\x74\xa4\x49\xf9\x10\x6d\xe0\x6f\x27\x1d\x4d\xca\xd3\x68\x03\x5f\x3f\x9d\xeb\x70\x8b\x36\xf0\xfd\x9f\xba\x3e\x98\x45\x1b\x78\xf4\xa2\xa7\x49\x99\x47\x1b\x78\x9d\xc6\x9a\x94\x55\xbc\x81\x27\x9d\x17\x9a\x94\x65\xbc\x81\xbf\x74\x1d\x4d\xca\x59\xbc\x81\x7f\x5e\x1c\x6b\x52\xa2\x60\x03\x49\xa0\xeb\xb7\x3f\xa2\x0d\xfc\xf3\xe3\x81\x26\xe5\x32\xda\xc0\x27\xa7\xef\x35\x29\x3f\x44\x1b\x88\xff\xfc\x4d\x93\xf2\x29\xda\xc0\xab\x37\xaf\x75\x18\xc4\x1b\xf8\x43\x57\x37\xa6\x41\xbc\x81\x2f\xce\xb5\x74\x10\x6d\xe0\xf4\x48\x87\xc1\x2c\xd8\xc0\x17\xaf\x4f\x75\x76\x7a\x14\x83\xa5\xae\x9e\x55\xb0\x81\xff\x8c\x9f\x6b\x52\x3e\xa6\x1b\xf8\xe7\xe1\x4b\x4d\xca\x6f\xe9\x06\xbe\x3f\x0e\x35\x29\x0f\x28\xed\xfc\xf9\x4a\x93\xf2\x3e\xde\xc0\xf3\xc5\xaf\x9a\x94\xb7\xf1\x06\x06\xa9\xae\x9e\xcb\x78\x03\x9f\x1c\xfe\xa9\x49\x79\x16\x6f\xe0\x53\xf4\x4f\x4d\xca\x49\xbc\x81\x31\xd1\x51\xfc\x87\x78\x03\x67\xef\x2e\x74\x34\x1a\x6f\xe0\x2b\xe7\x07\x4d\x0a\x4a\x37\xf0\xc7\xeb\x99\xae\x47\xd3\x0d\x7c\x4d\x9e\x6a\x52\x7e\xa2\x94\xd8\xd6\x95\xf9\x35\xde\xc0\xd3\x13\xdd\xac\xff\x3e\xd8\xc0\xd7\x4b\xdd\xc8\x3d\xa1\x73\x3b\xd4\xcd\xac\x97\xc1\x06\xbe\xed\xe8\xa0\xfd\x91\x6e\xe0\xcf\x1f\x75\x73\xee\x15\x9d\xf5\x7f\x3e\xd0\xd5\x93\x6e\xe0\xf9\x4f\x3a\x3a\xf8\x94\x6e\xe0\xaf\x4f\x75\xb4\xf3\x2e\xde\xc0\xe3\x43\x1d\x5d\x3f\xa7\xa3\x1d\x2c\x75\xf4\x36\xdd\xc0\xc3\x48\x57\x66\x3e\xdd\xc0\x5f\x5d\xdd\x3c\x5d\x4e\x37\xf0\xf5\x2b\x1d\xd6\x67\xd3\x0d\x44\x03\x57\x37\x17\xa6\x1b\xf8\xe3\xe2\x0f\xdd\x28\xa4\x1b\xf8\xe9\xc9\xf7\x3a\xaf\xc2\xd3\x0d\x3c\x7d\xa1\xa3\x90\x64\xba\x81\x9f\x56\x4f\x74\x34\x9a\x6e\xe0\x3f\xd3\xbe\x8e\xde\xd2\x0d\x7c\xf9\x49\x87\xf5\x8f\xf1\x06\x7e\xe8\x46\x3a\x1e\x12\x6c\xe0\x74\xaa\x6b\xcf\x1f\xc1\x06\xce\x74\x45\xae\xd2\x8d\xb8\x42\xf9\xd6\x5f\x98\x8e\xdd\x6b\x1f\x00\xf8\xd1\x5f\x98\xed\x41\x77\xd0\x06\xf0\x72\x27\xa5\x07\x17\x1e\xce\xb0\xdc\x79\xa8\x86\x2e\xa9\x8f\x35\xbb\x07\xe5\x54\x61\xbb\xd5\x4e\x01\x14\x77\xeb\xf0\x8a\xdb\x7b\x82\x61\xcb\x11\x21\x4b\xaa\x19\xd3\x25\x8b\x3a\x82\xa0\x03\x34\x81\xed\x8f\x2b\x71\x3d\x50\xb3\x59\x71\x01\x83\x9a\x4d\x76\x09\x1d\x8d\x8d\x7f\xfc\x43\x96\x0d\xa2\x87\xec\xe2\xcc\x3c\x8e\x66\x28\x31\x26\xb9\x98\x70\xa5\x09\x5f\xd2\x20\x8a\xeb\x74\x16\xcf\xa7\xb4\x8b\x5d\xaf\x8f\x4d\x0c\x46\xc4\x43\x22\xc4\x23\xeb\xd1\x2c\x17\xd8\x30\xa1\xe2\x03\x7c\x0a\x9f\xc3\x77\xf0\x95\x7f\x55\x17\x9a\x84\x45\x26\x51\xb4\x5c\x59\x2f\x56\xf6\xcd\xb6\x76\xdf\x6c\xab\xfb\x66\x7b\xe2\x5d\x86\x78\x16\x5f\x0a\x49\x6d\xef\x55\x41\x20\x7a\x99\x01\xdf\x33\x77\x06\x0f\xd6\x6b\xf5\x95\x79\x93\x45\xeb\xf5\xde\x07\x29\xe6\xcf\xe2\x29\x4b\x6d\x36\xe5\x13\x77\x58\xf4\x56\x98\x61\x9a\xc6\x18\x9f\xb7\x2e\x50\x92\x86\x31\x9e\x18\x60\xf8\xc1\x27\x23\xc3\xd8\x67\x96\x86\x87\x84\x24\xe1\xe9\x8a\x20\xd3\xc8\x33\x19\x40\x9c\x79\x48\x02\xfc\xa0\x6c\xef\x65\x1b\xf8\xf9\xc7\x97\xb4\x44\xce\xf2\x66\xf3\xc3\x7a\x6d\x3e\xf5\x73\xdd\x73\xae\x10\xcf\xa3\x11\xf3\x8e\xad\x89\x3d\x1c\xf0\xf8\xe6\x35\x77\x00\x45\xb3\xea\xae\xf0\x31\x31\xfe\xa9\xa2\xa2\xf8\x1a\x4d\x7c\xbe\x5e\x9b\xcf\xd5\x6b\x86\x77\x6e\xe3\xd1\x93\xb7\x35\xed\x3b\x61\xbb\x8e\x9a\xe6\xc9\xc6\x8f\x38\x70\x0a\x46\x14\x90\x49\x5e\x2d\xdd\xcc\x02\x12\xb4\x58\xde\x24\x8e\xc9\x04\x36\x94\x2f\xe1\x6c\x62\x80\x91\xb1\xc2\x1f\x71\x7c\x89\x1b\x92\x74\xa4\x1f\x6f\xf8\x3c\xef\xd0\x1f\xee\x93\xee\xdf\x29\x6e\x4b\x20\xf6\xf5\xb8\x1f\x46\x91\x69\x7c\x6b\xd0\x5d\xad\x3d\x4c\x1e\x49\x33\xec\x61\xb2\xbf\x0f\xc2\x33\x13\x8f\x93\x89\x75\x72\x72\xb1\x42\x27\x27\xe0\x86\xf8\xf4\x9d\x7b\xf6\xda\xbc\xa3\x93\xa3\xa6\x51\x72\x3a\xbc\xcb\x9b\xf6\xa9\x78\x5a\xc0\x2f\x07\x9a\x0f\xc7\x87\xad\x0f\x93\x87\xe7\x1a\x6b\x53\xa3\x65\xec\x23\x8b\xc4\xc7\xf1\x25\x4a\x8e\x02\xe6\xa1\x4e\xdd\x33\x15\xe0\x4d\xe7\x41\x72\x48\x4c\x1b\x58\x24\xfe\x79\xb9\x94\x05\xf6\x91\x08\x0e\xe5\x88\xbd\x13\xdd\x3a\x69\xac\x41\x4b\xc7\x22\xb9\x56\x80\x76\x66\x69\x11\x4a\x57\xcb\x65\x9c\x90\xd4\xbf\xf9\x23\xf5\xf6\x6c\x78\x16\xa1\xab\x1f\x82\xa5\xf7\xa7\x09\x36\x70\x2f\xeb\xe5\xd3\x78\x76\x6d\xcd\x83\x54\xe1\x1b\xd3\x59\xda\x92\xa5\x0d\xb0\x5e\x1b\x38\x6e\xfd\x91\xd2\x9d\x7d\xb1\x54\x91\xdb\x14\x4b\x49\x65\xe5\x27\x53\x75\xf7\x51\x40\xac\xea\xfa\x03\xe5\x6a\x53\x23\x3f\xfe\x82\x46\xc1\x2d\xb6\x2c\x3e\xc6\x93\x11\xf6\x28\x6e\xc6\x3e\x06\x1b\x68\x18\x00\x58\x24\x09\x17\x26\x18\x16\xf1\x4c\xeb\xf1\x64\x2e\x4c\xc0\xc6\x04\xca\x8a\xf1\x67\x46\xdc\x19\x18\x6e\xa9\xf4\x34\x42\xf4\xcd\x34\x66\xe1\x85\xc1\x5c\xa9\x92\xeb\x08\x31\xaf\x15\x51\x70\xed\x1b\xb4\x87\x0d\x28\x3f\xd3\xb7\x27\x3c\x6a\x4e\x8c\x7d\x63\x1a\x47\xab\x05\xce\x93\x93\xf8\xf2\x87\x60\xe9\x1b\xce\x92\x95\x09\x96\x4b\x84\xb9\x49\xa8\xb9\xb5\x5a\x70\xb7\xcc\xc5\x9e\x50\x0b\x66\x6e\xe1\xb8\x2f\x39\xae\x88\x7e\x86\xc2\xf3\x39\x51\x22\xb4\x33\x0b\xf6\x97\xf1\x0c\x09\xb7\x77\xb2\x2c\x24\x39\x89\xff\xc2\xb5\xd3\xc2\xb5\x1f\xe2\xae\xfd\x1a\xb6\x57\x12\x01\x14\xa1\xbf\x66\x89\x67\xce\xfb\x1a\x4e\xa5\x20\xda\xb1\xa4\x5b\x2d\xa9\x28\xe2\xb7\x97\x6d\xeb\xca\x2a\x51\x5d\xb6\x97\xee\xe8\x4b\x2b\x91\xac\xb7\x97\xef\xd6\x95\x87\xc1\x8e\x10\x7a\xf5\x10\xf2\x38\xcf\xb7\xc0\xe8\x6f\x83\x01\xe3\x1d\xa1\x0c\xb6\x43\x81\xe9\x8e\x70\x0e\x6e\x83\x03\xa7\xbb\x52\x54\x95\x16\x2b\xa0\xe0\xea\x76\x60\xd2\x49\x64\xe5\x4e\xd5\xf7\x61\x92\x92\x86\xcc\xda\x20\x71\xe3\x24\x48\x42\x72\xdd\x58\xac\x52\xd2\x38\x45\x8d\xa0\x81\x63\xdc\xc2\xe8\x9c\xd9\x2a\x34\x42\x4c\xd0\x39\x4a\x1a\x38\x6e\x9c\xb3\x69\x9b\x34\xc8\x3c\xc0\x0d\x82\xb0\x01\x36\xf9\xcc\xfa\xad\x46\x92\xa6\x74\x29\x3d\x69\x96\x96\xdf\xf2\xec\x23\xa5\x49\x25\xa4\xec\x2b\x6d\xb8\x1c\x13\xb3\x60\x36\x59\x43\x95\x32\xcd\xe6\xb1\x99\xd0\x92\x0c\x40\x4d\x71\x1e\x70\xd2\x63\x39\xb7\xd6\xe0\x21\xd6\x88\x8d\xd2\xd6\x07\xa5\x73\x33\x75\xbb\x95\xb9\xfa\x63\xa6\xfe\x36\x0c\x7c\x04\x23\xdf\x1e\x46\x8f\x48\xb6\x7d\x08\x1f\x95\xbb\x42\x18\xfc\xc7\x4a\xb6\x66\xd3\xdc\x3b\x36\xc9\x38\xa2\xd2\x48\xf8\xb8\xb2\x27\x00\xa3\xd8\xa7\xa9\x9e\xa9\x98\x2a\x8d\xc3\x09\x0c\xf7\x7d\x07\xc0\x64\x1c\x4d\xfc\x18\x1e\x9b\x31\x58\xaf\xcd\xa0\x45\xbf\x45\xfb\xbe\x93\x85\x03\x7c\xe4\xdb\x23\xac\x92\x4f\x02\xbc\x5f\xcc\x00\x3e\x30\xb9\xbf\x2c\xb1\x8d\xf9\xd1\xff\x4d\x1f\xcc\x92\xf1\xe2\xd1\x95\x49\x68\x31\xc4\x8a\x8d\x27\xcc\x56\x0e\xc0\x7f\xfa\x2f\x99\xd7\x40\x2b\x4c\x9f\x73\xfa\x59\xaf\x35\x2c\x12\x3d\x7a\xc4\xe4\xcc\x4d\xbe\xa2\xfd\xa4\x48\x2b\x63\xbe\xb9\x6b\x70\x83\x91\x09\x5d\xd5\xc5\x0a\xbd\x4c\x62\x12\xd3\x1d\x5f\x66\x4e\xc2\x2d\x42\x84\x3e\xf7\xd7\x0a\xce\xc2\xa1\xdc\x23\x7b\x24\xbb\x77\x1f\x79\x99\xd7\xf9\x9f\x4c\x02\x46\x44\x4a\x3c\x18\x78\x64\x8c\xd9\xb5\x2e\x54\xd7\x78\x54\x89\x81\x29\x07\x9e\x0a\xed\x84\x8e\xfc\x30\xcc\x9d\xda\xb1\x83\x30\x2e\x6a\x27\xe2\x10\x6c\x98\xf8\xff\x34\xb1\x8f\xc6\xe1\x04\x8c\x7e\x65\x24\xe6\x25\x63\xcc\x87\x4f\x0e\x52\xc2\x62\xc0\x90\x7a\x34\x90\x39\x46\xb4\xd3\xc7\x36\xc5\x17\x23\xff\x47\xd3\xd5\x07\x0b\xcd\xe4\x5c\x1e\x14\x96\xc2\x4d\x90\x8f\x91\x79\x53\xbf\x51\xf6\xf6\xec\x0d\x14\xfb\x02\x18\xd6\x1d\x6a\xee\x60\x48\x11\xc5\xb5\x77\x95\x86\x11\x32\x41\xb3\x19\xb0\x5f\x13\x49\xd3\x1f\x60\x45\xf1\xb9\xa0\x4e\x54\xd8\x5b\x8b\x73\x8c\xcb\x20\xa9\x0d\x32\x50\x0b\x93\x16\xda\x06\x94\x59\xb5\xdd\x19\x2a\x2b\xa5\x05\x5b\x51\x62\xd0\xc2\xf2\x2e\x7a\x82\xcc\xb1\xf1\x47\x90\x2e\x42\x8c\x8c\x89\x22\x87\x47\x4a\x26\x65\xe3\x84\xf0\x45\x98\xc4\x98\x89\x48\xcb\x24\x9e\xad\x58\xee\xbc\x58\x4c\x8b\xbd\x66\xc8\xe5\xa5\xfc\xfc\x71\xbd\xbe\x39\x91\xbb\xae\xf1\x04\xf2\x7d\x98\x77\x23\x3f\x89\x6d\x06\x3c\x91\x12\xa7\xf7\x73\x26\xc0\xc2\x93\x30\x65\x76\x48\xaf\x93\xf8\x2a\x44\x33\x6f\xcf\x81\x27\xdc\x0f\xfb\xcd\x59\x3c\x5d\xa5\xef\x92\x60\xf9\x9c\xa0\x45\x4a\x21\x87\xce\x00\xbf\x41\xe7\x61\x4a\x92\x6b\xef\x66\x03\x11\x17\xf4\xd4\x4f\xe1\x34\x2e\x64\x59\xc4\x24\x2c\x7c\xd9\x40\xa5\xb9\xde\x4d\xde\x5e\xe6\x4c\xf3\x1c\x91\x27\x88\x04\x61\x94\x7a\x29\x82\x51\x7c\x2e\xdf\xa6\x68\x03\xcb\xe3\x06\x89\x6f\x74\xad\x81\xd5\x31\x86\xea\x36\x54\xb4\x3b\x57\x4f\x81\x47\x76\xa1\xeb\xf2\x2c\xfc\xee\x52\x6e\xa0\x86\x6a\x76\x7e\xa6\x41\x45\x57\x03\x14\x36\xd1\xeb\x35\xd2\x88\xf5\x72\x77\x07\x75\xf5\xfd\x11\x87\xd8\xa4\x5b\x09\x00\xb4\xe9\xb9\x9f\xa5\x50\x3a\xc0\x7b\xb3\xc2\x38\xc4\xe7\x8d\x45\x9c\x20\xbe\x40\xc7\x18\xc9\x3d\x64\x23\x3e\x6b\x1c\x45\x7c\x99\x9f\x06\xb8\x31\x0d\x56\x29\x6a\xac\x30\xba\x5a\xa2\x29\x41\xb3\x46\x98\xa6\x2b\x94\x5a\x8d\xd7\x11\xa2\x2b\x30\xc2\xe9\x2a\x41\x8d\x18\x47\xd7\x05\x30\x61\xda\xe0\x97\x8d\x2c\x83\x19\xb7\xa9\xb8\x15\x09\x64\xbd\x36\xeb\x13\xfd\x3d\xbb\x50\x94\xc7\x3c\x10\x67\xfe\x57\xd7\x66\x25\x0d\xde\xa4\xaa\x2f\x82\x42\x44\x2f\x36\x71\x09\x5c\x26\xe8\xc2\xab\x14\x1c\x93\x89\xf4\x28\xe6\xe1\xcc\xa8\x84\x7e\xf6\x71\xbe\xdf\xa0\xbb\xa2\x80\x4c\xe7\xb9\xd1\xf8\xd1\x2a\x25\x32\x12\x85\x71\xf4\xe4\xed\xc9\xdb\x77\x87\xef\x9e\x9e\xfc\xfc\xfa\xc9\xe1\xbb\xa7\x06\xbc\x99\x31\x72\xf3\x92\x0d\x00\x90\x05\x60\x02\xca\xf4\x4d\xf3\xe9\x2b\x27\x57\xea\x69\x86\xb1\x40\xe1\xfa\x79\x0e\x57\x29\x4a\x0e\xcf\x19\xfa\xfc\xb0\x39\x4e\xac\xec\x1b\xcc\x66\x6a\xa1\xe1\x72\xce\x0a\xbd\xd4\x7b\x31\xbf\x5f\x9a\x7b\x0e\x90\x1f\x7f\x7c\x2b\x3f\x3f\x61\x9f\x19\x2f\x90\x9f\xfe\x60\x9f\x2e\x56\x48\x7e\xf8\x81\x7d\xe0\xf3\xfd\x7b\xf3\x8d\x79\xb3\xa9\x8e\x1f\x80\x37\x85\x49\xad\xee\xa5\x2b\x99\x2d\x35\x2b\x28\xcf\xfe\xed\x45\x8b\x99\x01\xcc\xf8\xcf\x8e\xe5\x8b\xfc\xaa\x2e\x96\xb5\x9a\x6f\x26\x2e\xcc\x65\x23\x3c\xa5\x23\x1c\x72\xbb\xd5\x1f\xdf\xbe\x7a\x69\x71\x77\xdd\xe1\xd9\xb5\x49\x07\x9f\x2f\x7d\x2e\xe0\xc2\xc8\x0a\x95\x35\x24\xfa\xb5\x53\xa7\x85\x1f\x4f\x74\x97\x80\x6b\x95\xf0\x99\xf5\x05\xa5\xe1\x4b\x79\x1d\xb6\x00\xb2\xe4\x39\xb8\xa0\x7f\x97\x6c\x2e\x77\xfc\x8a\x16\x9a\x7b\x5f\x48\x73\x59\x36\xad\xfa\x1d\x57\xac\x45\xad\x33\x5c\x74\xc4\x47\x62\x36\xb7\x5e\x9d\xa6\x28\xb9\x08\x4e\x23\xdd\x79\x82\x82\x67\xb6\x90\x82\xe1\x0a\x59\x91\x38\xc2\xcf\x99\x70\x30\x9b\x31\x78\x99\xa9\x8e\x66\xce\x6a\xc6\x78\x85\x84\xe7\x0a\x8b\xcf\x67\x20\x4e\x55\x66\x5f\x20\xe9\xf0\x5b\x26\x35\xbe\x53\xe8\x0a\x5d\x9d\x39\x6a\x40\x0d\x66\x58\x56\x6f\x63\xd8\x10\xd1\x4f\xc6\x64\xa2\x3a\x35\xac\x29\x45\x99\x64\x5e\xc0\xcf\x83\x6d\xe8\xc5\x31\x3d\x41\x0b\x00\x39\x4d\x67\x42\xcd\x4c\x24\x71\x7b\xf4\xd4\x5f\x51\x69\xbc\x34\xae\xc2\xff\xca\x1c\xf9\x63\xa9\xd8\x34\x20\x73\x94\x1f\x62\xe4\x7d\xf3\x68\x1a\x26\xd3\x08\x35\xa6\x51\x90\xa6\x3e\x5b\x18\xe9\x7e\x33\xc1\x41\xd4\x9a\xc5\xa4\xd5\x36\x1a\xd3\x2b\xdf\x68\x3b\x96\x63\x34\xa6\xd7\xbe\xe1\x0c\x8c\x46\xe2\x1b\xae\x75\x60\x3c\x7c\x7c\x5b\x69\x97\x97\xa6\x65\xee\x5c\xd6\xe1\x65\x3b\xd6\x81\xa6\xf0\x37\x9b\x09\x5c\x7e\x01\x91\x24\x82\x53\xd5\xd1\xc9\x1b\xf3\x46\x74\x96\x37\x47\x63\x67\xb2\x81\xb2\xaf\x8b\x8c\x33\xf7\xb7\x32\x9b\x3d\x9f\xea\xdd\x08\xe7\x6e\xb6\xcb\x1b\x48\x61\x67\x77\x98\x24\xc1\xb5\x49\xa4\xba\x9a\x30\x3d\x35\x1e\x27\x13\x65\x57\x99\x4c\x86\x5a\x0c\xfc\x37\x7c\x35\xd0\xa3\x07\x05\x23\x3e\x4b\xe2\xc5\x53\x4c\x92\x10\xa5\x26\xae\x44\xeb\xcf\x76\x67\xe7\x26\x81\x0e\xc8\x4f\x2e\xf6\x90\x25\x3b\x8a\x6d\xc7\x40\xa1\xbd\x87\x51\x18\xa4\x9a\xeb\xf6\xf7\xd7\x62\xee\x6c\xf2\x0e\x08\x37\x4a\x08\x5b\x67\x51\x40\x5e\xa8\xeb\x4b\xa1\xa8\x4b\x11\xc0\x4a\x71\x3c\x76\x26\xc5\xf5\x28\x9b\xf8\x63\x76\x89\x52\x02\x4f\x26\x93\x0d\xd7\x7d\xdc\xcb\x98\x84\xa0\x10\xd4\x87\x52\xd2\xcb\x60\x81\xbe\x4f\xe2\xc5\xdb\x79\xa0\x0f\x22\x97\x89\x52\xf6\x24\xb7\xec\x3f\xa3\xd3\x3c\xc0\xe7\x94\x9f\x2b\x93\x9c\x39\x66\x9f\xf9\xc6\x0b\xf7\xc0\xea\xba\xd0\x75\xe9\xaf\x33\x80\x8e\x6d\xf5\x60\xcf\xea\x0c\xf8\xa7\xc0\xb1\xfa\x90\xfe\xb7\xd9\x3f\xd7\xea\x74\xa1\x6b\xb5\x7b\xc7\x34\x6b\xd7\xea\x1c\x44\x07\x96\x3d\x80\x07\x56\xfb\x40\x93\xb5\x45\xb3\x7e\x10\x93\xf3\x82\x22\x82\xae\xa6\x51\xb0\x60\xd6\x70\x2d\x3e\xdb\xf5\x58\x39\x03\xd8\x3b\x74\x5c\xe8\xb8\xd0\x86\x0e\xb4\x61\xdb\x66\xd8\x89\x2f\xf4\x1f\xcd\xf2\x61\x61\x43\xd7\x3d\x74\x6c\xe8\xb0\x4f\xd0\x81\xee\x80\x37\x83\x7f\x61\xdf\x06\xd0\x1d\x50\x2c\x0a\xe0\x5d\xdb\xb2\xfb\x81\x63\xb5\x21\xfd\xcf\x72\xb6\x1c\xab\x4d\xff\x5f\xb4\x7a\x4a\x02\x03\x6a\xf5\xa0\x7d\xd1\x3b\x2c\x64\x87\x12\xca\x07\x95\x77\x51\xe6\xd6\xb7\x0e\xba\x9c\x45\xb9\x6d\xcb\x76\x19\x97\x72\xac\x2e\xed\x08\x98\xc6\x51\x38\xfb\xac\xa6\xb6\x1c\xab\x73\x00\x29\x6a\x9d\x03\xc8\x7e\x38\x1a\x6d\x8a\x9a\x35\x38\x28\x24\x38\xd0\x69\xb5\xa1\xfd\x81\x35\xb5\x6b\x75\xe9\xe8\xb8\x90\xfd\xf0\x26\xd1\xc7\x16\xfd\x39\x54\x53\x64\xb3\xba\x56\x57\x8e\xdb\x39\x1d\xb7\xe9\x1c\x4d\x3f\xfe\x5b\x47\xac\x67\xb5\x3b\xd0\x6d\x5b\xfd\x4e\xd4\xea\xb6\xba\x81\xc3\x2a\x61\xb9\xad\x0e\x1d\xba\x8e\x13\xb5\xad\xee\x01\x64\x3f\x3d\xab\x3f\x68\xd1\x9f\x52\x3e\xf6\xf3\x41\x3f\x10\x0c\x61\xa5\x09\x0c\x8f\x9e\xd2\x02\x87\xb7\xe9\xc3\xa2\xd5\xb1\xfa\xfd\x96\x6b\x39\x6c\x30\x28\x4c\xde\xc2\x96\xdb\x72\x23\x5a\x6d\x9f\x22\xd0\x3f\x76\xda\xd0\xe9\x6b\x72\x41\x37\xea\xd2\x99\x44\x7f\x64\x37\x5f\xb3\xe9\x11\x45\xe1\x32\x0d\xd3\xd6\x3c\x4e\xc2\x4f\x31\x26\x41\xa4\x5d\x9a\x77\x58\x7f\x6f\x5d\x64\xeb\x57\x52\x28\x2a\xfc\x2e\x98\x9d\xa3\xd9\x5f\x56\xed\x66\x02\x17\xb4\x13\xb8\x30\xd6\x9a\x46\x2c\x38\x97\x96\xd6\x0e\xd8\x50\x0e\xa2\xbe\xe5\x1e\xb4\xe8\x4f\x36\xcc\x76\x2b\x23\x07\xc6\xa3\x7a\x94\x1a\x1c\xdb\xea\x3b\xf0\xa0\x9a\x0f\xf2\x7c\x3c\xd3\x80\xe5\xa0\xb4\x9f\xe5\x63\xff\xf3\x7c\x03\xc8\x6a\x66\xd5\xc2\x62\xb5\x39\x15\xca\x01\x3d\x65\x03\xca\x6f\x48\x6b\x1b\xd1\xb3\x9c\x3e\xad\x6d\xd0\xa3\x08\x0e\x1c\xca\x4c\xb4\x74\x7d\x2c\xb2\xb6\xa3\x81\xd5\xeb\xb4\xe8\x4f\x1d\x59\x2b\xd4\xec\x5a\x6e\x17\xf6\x9e\xb9\x07\xef\x07\xf3\xf6\xfb\xb6\xfd\xac\xf3\x7e\xf0\xac\xff\xbe\xf7\xac\x6d\xf5\xbb\x74\xd2\x0f\x20\xfb\x11\xec\x1a\xf6\xad\x81\xf3\xbe\x6d\x5b\xce\x41\x25\x91\x96\x80\x6d\x77\xee\x0e\xac\x6a\xc9\x76\x07\xb2\x52\xef\x29\x80\x6a\x2a\x47\xa3\x34\x99\xe9\x5c\x57\xfb\xae\xe5\xbc\x6f\x1f\xe6\xef\x07\xb0\xfd\xfe\x40\x79\x67\xf9\x8b\x20\xdc\x9e\x06\x84\x32\xba\x2e\xb4\x0b\x20\x58\x7e\x06\x22\x41\x53\xd2\xa0\x64\xda\x36\x1a\xd7\xbe\xd1\x33\x1a\x97\xe1\x8c\xcc\x7d\xc3\xb1\x8d\xc6\x9c\x1d\x60\xfa\x86\xab\xce\x83\xc3\x08\x25\x04\x15\x99\xf6\x97\xb7\x20\x1f\xf3\xa8\x6b\xb5\x7b\x90\xfe\x1c\xbb\x3d\xcb\x75\xe9\xca\x3a\x70\x14\xe8\x96\xdb\x6e\x59\x1d\xe7\x99\xdb\xb6\x06\x39\x31\xb4\xda\xd6\x41\x87\xfd\xe8\xa8\x9a\x57\x16\x47\xd7\xe7\x31\x6e\x2c\xe3\x10\x93\xd4\x37\x5c\xc7\x72\x0f\x1a\xbd\x86\xd3\xe6\x3f\x83\x86\x6b\x5b\x4e\x87\xfe\xe5\x29\x45\x12\x6a\x5b\x3d\xbe\xcc\x3f\x6b\xbb\x7f\x05\x05\x39\x5d\xab\x3d\xf8\xa0\x65\x41\x9f\xd1\x6d\x2d\xcd\x04\xda\xa5\xcf\xee\x71\x8c\xdb\x2e\x74\xda\x96\xfb\xd7\x74\x9e\x6b\xb5\x3b\x87\x7d\xba\xae\xb0\x1f\xb1\x62\x09\x0c\x4a\xb3\xc7\xb5\x28\x6f\x70\xda\xef\x07\xf3\x03\xab\x3f\xa0\xc5\x28\x47\xcb\x64\x0a\x9e\xa1\x66\xa1\xfc\xb7\x4e\xdf\x32\x83\x9b\xb7\x3a\xef\x0f\x02\xd7\x72\x21\xfd\xcf\x61\x75\xe8\x52\xfb\xbe\xf7\xcc\x71\x2d\xf7\xfd\xc1\x61\x21\x91\x76\x34\x3c\x78\x4f\xcb\xfd\xe5\x4c\xf0\x85\xdb\xb5\x0e\x3a\x6c\x51\x1a\x44\xad\x03\xab\xd7\x87\xf4\xe7\xd8\x61\x04\x7d\x40\x11\x6a\xf7\x20\xfb\x11\xbc\xdd\xb5\x0e\xa0\x73\x10\xb5\xad\xf6\x00\xd2\x9f\x63\xb7\x03\x9d\x8e\xd5\x63\x02\x6a\x96\x95\xcb\x73\x07\x6d\xf6\xa3\x0c\xda\xd7\x61\x5c\x0a\x5b\x70\x7b\x56\x9b\x62\x42\xa5\x9b\x76\x47\x00\xe4\x88\x39\x9f\xd9\x42\xd8\x6f\xf5\xe7\x2d\xe7\x90\x55\xc2\x7e\x44\xc6\x03\x78\x60\x0d\x0e\x8e\x19\xa3\x82\xff\x96\xb1\x55\xd8\x13\xeb\x5e\x1d\x73\xfa\xf2\xde\xb5\xe9\x84\xed\x1e\xf6\x2d\x3a\x8f\xbb\x85\xf9\xf8\x6f\x69\xb4\x9e\xad\x70\x2c\x99\x28\x6c\xf7\x60\xdb\xb2\x07\x5f\x95\x9e\x37\x13\x78\xc4\xf6\x21\x41\x84\xf0\x2c\x48\xf4\x22\xd5\xdf\x50\xe6\x91\xd2\xc6\x80\x09\x1b\x4e\x27\x93\x36\xdc\xa2\xb0\x91\x8b\x25\x9d\x5d\x73\xba\xf6\xce\x39\x7b\xbb\xe6\x14\x68\x1e\xec\x8c\xe6\xed\x39\x25\x9a\x3b\xe4\xec\xed\x9a\x93\xa3\xe9\x6e\x6f\x8f\xa1\xe0\x79\x4b\x56\x05\xcf\x5d\x72\xf6\x6e\xcb\xf9\xf7\x58\x2a\xef\x45\xd2\xfd\xf7\x09\x81\x5f\x73\xee\xfc\x6f\xa2\xf3\xff\xb7\xc9\xfc\x33\x76\x28\x5b\x76\x07\x7f\x33\x81\xfb\x3f\xdc\xff\x3f\xb3\xe2\xcb\x98\xff\x17\x6d\xd4\x6a\xb6\x48\xce\xdf\x79\x8b\xe4\xd0\x15\xec\xd9\xe0\xbd\xdb\x99\xbb\x1f\x16\x76\xab\xfb\x6c\xf0\xde\x39\x50\x9e\xd9\x77\xba\xc6\x3d\x73\x3a\x4a\x2e\xa7\xa3\x64\xa3\x2f\x79\x3e\xd7\x56\xf2\xb9\xb6\x92\x8f\xbe\x28\xf9\x7a\x6a\xbe\x9e\x9a\xaf\xc7\xf3\xfd\x6d\xd6\xf6\xfa\x0d\x9e\xba\x3b\x73\x2d\xb7\xfd\xf7\xdd\x48\xfd\x75\x43\xdd\x83\x5d\xfd\xe0\xde\xcf\x78\xfe\x67\x3b\x28\xb7\x83\x7f\xfb\xd9\x4b\x37\x92\x87\x4c\x31\x7f\x8d\x5a\xf3\x70\x56\x77\x28\xda\xb5\x9c\x03\xba\x87\xed\x1c\xf6\x68\x27\xf4\x94\x3e\xec\x5a\x3d\x17\x3a\x83\xa0\x67\x0d\x7a\x90\xfd\xf0\xb9\x4a\x1f\x5b\xe2\x63\xff\x80\xff\x88\x59\x6c\xb5\xfb\x56\xa7\xcd\xce\x0f\xda\x96\xdb\x0e\x3a\x14\x5c\x47\xc2\x74\xa0\xd5\xef\xb4\x2c\xbb\x77\xd8\xb1\x06\x7d\xc8\x7e\xc4\x30\xb7\x45\x5d\x1d\x0a\xac\x23\x21\x3a\x34\xb3\xd5\xef\x94\x28\xa5\x43\xe7\xb3\xd3\xb7\xba\xed\x69\xab\x6d\xb5\xfb\xad\x9e\xe5\xb6\x5b\x07\x96\x3b\x68\x39\x76\xcb\xe9\x5a\x03\xb7\x45\xc9\xb1\x67\x0d\x5c\xc8\x7f\x39\x7e\x5d\xcb\xed\x58\x83\xee\xb1\xd3\xb1\x06\x1d\x46\xb1\x0c\x37\x47\xc1\xb0\x6d\xf5\xda\x2d\xab\xd3\x9f\x76\xad\x1e\x3b\x14\xb5\x19\xb5\x58\x4e\x87\x36\x69\x00\x07\x56\xa7\x1d\x38\x7d\xfa\x91\xff\xda\x42\x11\xd7\xee\xc3\xae\xe5\x44\x8e\xd5\x71\x21\xfd\x09\x9c\x03\xb6\xb1\x67\xbf\xbc\x47\xbb\xad\x5e\x64\xb9\xbd\x96\xd5\x29\x9d\xf9\xb1\x9e\xe8\x5a\xfd\x41\xd4\xb1\x3a\x3d\x48\x7f\x68\xf1\xae\x0b\xf9\xaf\xec\xf7\x1e\x3f\x8c\x39\x76\xad\xf6\x00\x3a\x03\x0a\xcc\xea\x0c\xa6\xb4\x0f\x20\xed\x03\x48\xfb\x80\x4d\xae\x2e\x6b\x3a\xeb\x03\x8a\x44\x2f\x47\xa2\x4f\x3b\xcc\xb1\x7a\x07\x51\x17\x76\x29\xe5\x77\x5b\x8e\xd5\x6d\xb9\xbd\x96\xdb\xfb\xb0\x38\xa0\x4d\x62\x3f\x3d\xab\xc7\x7f\x82\x8e\x35\x70\x20\xfb\xe1\x6d\x75\xad\xae\xd5\x77\x2b\x63\xe8\xb4\x2d\x76\xb6\x54\xca\xce\xb4\x1e\x4c\x65\xdd\x6d\xf3\xa3\xdd\x2e\xfb\xa1\x64\x45\x2b\x18\x74\x25\x8f\xb0\xba\x5d\xf6\x13\x39\x56\x0f\x3a\x56\x8f\x8e\xce\x01\x2b\x7f\x20\xab\xe6\x67\x48\x96\x3b\x6d\xf1\xe1\x69\xb1\xe1\x69\xd1\xe1\x69\xd1\xe1\x69\xc9\xe1\xe1\x04\xe2\x4a\xe1\xa1\x67\x39\x6e\xab\x67\xb5\xeb\xf4\xbc\x03\xda\x83\x8e\x63\x39\xfd\xc3\x12\x4d\x43\xa7\x47\x13\x7a\xd1\x80\x0d\xfe\x40\x37\x4d\xdc\x36\x3b\x40\x2d\x4e\x13\xa8\x00\xfd\x0f\xfd\xfe\x55\xf4\x3b\xb0\xda\x70\x60\xb5\xff\x7d\xc4\xb5\x99\xc0\xb7\x82\xed\xd6\xa8\xee\x38\xab\xbb\x6d\xf4\xdf\x76\x99\xb2\xd9\xb1\xda\x50\xe4\x3e\xe6\xe6\x0b\x3b\xf4\x5a\xea\xb8\x56\xa7\xd7\x6a\xb3\xfc\x02\x5e\x36\x70\x2f\x1c\xba\x6e\x52\x10\xed\x23\xc7\x65\xa7\x45\xf4\x19\xf6\x29\x13\x76\x0f\x60\x07\x3a\x83\x69\x9b\x92\xda\x01\x1c\x58\x4e\x9f\xb5\x1a\x66\xed\x7f\x4b\x57\xcd\x0e\x74\x5c\x0a\xbc\xed\xf0\xf3\xe4\x23\xfe\x91\x03\x70\xdb\x94\x84\x38\xd0\xbc\xae\xb2\x59\x8a\x65\x1f\x64\x13\x2e\x9f\x37\x0e\x9b\x50\x35\xb3\x49\x96\xf8\xb0\xb0\xe9\x03\x67\x41\x94\xda\x06\x52\x95\xca\x27\x62\x85\x31\xb1\xa2\xae\x6b\x0d\x0e\xea\xb6\x0f\xff\x87\xc7\xa4\x60\xcf\x60\xd9\x99\xc1\x82\x65\xb7\x99\xcd\x02\x1d\x03\x41\xd8\xef\x0b\x96\x1b\x17\x28\x21\xe1\xb4\xde\x6e\x43\x5a\x47\x30\x23\x88\xcf\xb3\x9f\x90\x19\xb8\x2d\xc6\x6e\x76\x1b\x5f\xb1\xda\xcd\x04\x7e\xa4\x5d\x70\x11\xa2\xcb\x16\xbf\xa7\x9c\xd6\x4c\x72\x07\x76\x9f\x75\x0f\x5d\x28\x2d\x82\xda\xb0\xff\xde\x3d\x08\xf2\x0f\x2e\x74\x9f\xb5\x1d\xf5\x43\xcb\x7d\xdf\x57\x4b\x38\x90\x8a\x99\x6d\xe8\x1e\x3c\xeb\xbe\xef\xcf\x07\x1f\x16\x8e\x0d\xed\x67\x0e\x7f\x11\xf8\x9c\x30\xa3\xb7\x24\x89\x2f\x6b\xe4\xbb\xbe\xd5\xeb\x51\x82\xeb\x09\x23\x9f\x01\x23\x61\xfa\x7e\x98\x5b\x7e\x1c\xf0\xe5\xe0\xd8\xe9\xd3\x1d\x93\xf3\xde\x1d\xe4\xe7\xc6\x6c\x4a\xd2\xdd\x99\x35\x70\xd8\xf1\x33\xcd\xa9\x31\x07\xc9\xa4\xce\x4b\x8a\x12\x09\x17\xa8\xa6\x6f\x32\x9b\x96\x81\xe5\x1e\xb4\x06\xb7\xda\xb4\x1c\x58\x7d\x07\xd2\x6c\xca\xfe\x81\xbe\xb2\x84\xdc\xa4\x85\x7d\xa2\xf8\xdd\x62\xd2\x32\xe0\x93\x68\xbb\x49\xcb\x33\xda\x86\x94\xa0\x65\xeb\x2c\x4e\x2e\x83\x64\xd6\x72\xf5\x8d\xe9\x5b\x36\xe5\x55\xcc\x7e\x90\xee\x46\xe5\xee\xd3\xe6\x86\x81\x0c\x3d\xd6\xf3\x7d\xcb\x71\xa1\x4b\xb3\x57\xcc\x07\xdb\x3d\x9a\xb5\x33\xb7\xe9\x4e\xb5\xc3\xcd\x73\x3a\x14\x6a\xa7\x7f\x48\x17\x3a\xc8\x7e\xe4\xea\x27\xea\x2b\x6f\xaf\xad\xce\x01\xec\x16\x41\xb7\xc4\xdb\x7b\xf7\x80\x1d\x5e\xaa\xb5\xb6\xb9\x56\xc4\xa2\x35\x14\xb0\xe1\x80\x64\x3f\xbc\xc8\x6c\x2a\x5b\xb3\x78\x75\x5a\x6f\x5a\xc9\x3b\x37\x37\xd6\x69\x59\x7d\xa7\x45\x97\x7a\x36\x32\x83\x36\xec\xd3\x51\x74\x0e\x2c\xc7\x55\x32\x15\x46\xbb\x07\x5d\x36\xd4\x54\x2c\x71\x0e\x73\xb3\x1f\x09\xbc\xd4\xe2\x03\xba\x4f\xab\xab\xd2\x39\xc8\xea\xa4\xbb\xb9\xda\x3a\x29\xa7\x65\x95\xba\x83\x4a\xa5\x0c\xbc\xec\x88\x63\xda\x11\xdc\x16\xb7\x75\x9e\x84\xb3\xed\x16\x82\x5d\x6e\xed\x14\xb9\xd0\x79\xef\xda\x96\xab\xcc\x17\x8a\x61\xcb\xea\x1f\x3b\x36\x13\x1b\xdb\xcf\xdc\xae\xd5\x3f\x88\x5a\x74\xb4\xe9\xc0\x96\xb2\xd2\x9c\x07\xd0\x1d\x48\x50\xbd\xc1\xb1\xdb\xb7\xba\x54\xe6\x3b\x74\xa8\xac\xc5\x7e\xc4\xd8\xd1\x5d\xd7\x7b\xa5\xb1\x76\xcb\x69\x39\xcf\x0a\xd3\x0b\x3a\x17\x4e\x50\x2e\xc8\x44\xbe\x63\x8a\x35\xad\xa0\x6a\x40\x7a\x48\x65\x60\xb9\x3c\xb7\x19\x85\xca\x2f\x7c\x69\x86\x74\xff\x09\xdb\xf6\x21\x95\x32\x3b\x62\x31\x6e\x73\x33\x5b\xf1\x45\x58\x3b\xb6\xdd\x5a\x11\xfc\x2b\xd4\x93\x83\x1f\x40\xc7\xb9\x70\x28\x25\x58\x5d\x4b\x0a\x85\x96\xd3\xb5\xda\xdd\xa8\x4f\x97\xea\xbe\xd5\xee\xe5\x69\x8e\x48\xe3\xe6\xa6\x6a\x11\x77\x60\x75\xba\x51\xdb\x3a\xe8\x32\xae\x51\x48\xeb\xbb\x2d\x9a\x68\xb7\x06\x56\x9b\x96\xea\xd0\x05\x58\x82\x1b\xb4\x78\x5d\x8e\xdb\xea\x5b\x6e\xb7\x84\x07\x4d\x7c\xef\x64\xe4\x76\x55\x22\xb7\xff\xad\x74\xa6\x21\x84\xff\xc7\x46\xea\x03\x1d\xa9\x10\x9f\xc5\x3a\x8e\x50\x32\x95\x6e\x0b\xb9\xc3\x11\xa2\x89\x63\x75\x8a\x3c\x8d\x4a\xb0\xcf\x98\xda\xf0\x99\xd3\x53\xd6\x27\x1b\xba\x73\xe7\xa2\xf7\xcc\xe9\x2a\x6b\x1b\xfd\x58\xc8\xd4\x2a\xab\xf9\xbe\x86\xa1\xf2\x17\xd9\x75\xbb\x74\x8b\xd9\x15\x42\x0f\xab\x08\xba\x99\xc8\xe3\x50\xb1\x84\x8b\xf8\xdd\x0f\x2f\xdc\x36\x74\x3b\x2a\xdb\x86\x8e\xda\x7c\x87\x36\x77\xee\xbe\x77\xfa\x6a\x4f\xf1\xaf\x9d\x8b\xc1\xdc\x55\x79\x39\x05\x25\xc7\xeb\x69\xd9\x38\x9f\x24\xe1\x96\x4b\x03\xb4\xdd\x8e\xd5\x76\x0b\xf6\xf3\x54\x60\x60\xf6\xf3\xef\x9d\x4e\xc1\x7e\xde\x6e\xe9\xec\xe7\x39\xe7\xa2\x50\xb6\xd9\xcf\x77\x2c\xb7\xaf\xd8\xcf\xab\x8a\x51\xab\xdd\x66\x86\xea\x1d\x66\x0d\x48\xf7\xd0\xbd\xa0\x0d\xdb\xb9\x52\xa0\x0f\xed\xe3\xae\xd5\xed\xf3\x5c\x87\x59\x1a\x95\x73\xe8\x0a\xf8\x8c\x8a\x81\x07\x79\x19\xe8\x5a\xbd\x4e\xab\x43\xb7\x00\x8b\x96\xd0\x80\x1e\xa8\xbd\x6d\x0d\xa8\x1c\xf0\x8c\x16\x2f\x7c\x1d\xd0\x95\x73\x70\xec\xf4\x2d\xbb\x0f\x07\x56\xb7\x68\xc5\xdb\xef\x41\x3b\x3a\xb0\xfa\x1d\xba\x86\x1f\x74\xd4\x21\xa0\x79\xa9\xf8\xd3\xa9\x23\xa2\xaf\xdb\xca\x17\x4e\x8f\xf1\x22\xd7\xea\x77\x3e\xe3\x5a\x01\x95\x7a\xef\x78\xaf\x80\x16\x91\x34\xf7\x9c\x19\xf4\x6c\xbf\x52\xd0\xee\x28\xab\x9f\x53\x59\xfd\xf8\xa2\xd6\x61\xe8\x74\x94\xe5\xcf\xae\x2c\x7f\x8c\xda\x3a\xf5\x53\x75\xc7\x8a\x04\xea\xef\x28\xea\xb3\x98\xdc\x76\x23\xc2\x71\x82\x3e\xec\x8b\x7e\xa3\x4f\xfc\x8d\xa9\xe9\x5b\xfd\x32\x5b\xfa\x1a\x8d\xdd\x4c\xe0\x2b\x36\xb7\x93\x24\x4e\x5a\x29\x09\xf0\x2c\x48\x66\xb7\x6d\x4e\xdd\x9e\x65\xf7\xc4\xb4\x6b\xb7\x2b\x92\x8f\x6b\xf5\xd4\x09\xe0\xb4\x9c\x8b\x56\xb6\xf0\x71\x06\x66\x5f\x38\x2a\xb3\x91\xa5\x2a\xac\xf8\x2f\x1b\x60\xd7\x72\x02\x55\x90\x62\xcf\x87\x65\x41\xca\x72\xd8\xa4\xa0\x1b\xc2\x41\xe1\xd6\x86\x03\x5d\x6b\xc0\x5a\x55\xfc\xdc\x62\x9f\xf9\x7c\x18\x58\xbd\xc0\xb1\x28\xd7\x18\x64\x93\x81\xb2\x86\xc1\x61\xfe\x35\x5b\x35\xac\xec\x62\xd4\x6b\xb6\xab\x5a\x4d\xa7\x28\x4d\xf5\x23\xf4\x57\x89\x83\x74\x81\x63\xfd\x54\x34\x8d\xb6\x8f\xd9\x55\x2f\xe8\xb6\x2d\xa7\x1b\xb5\x7a\xad\x9e\xba\xe7\x84\xce\x80\xa9\x7c\x78\x96\x1e\x97\x83\xac\xae\xab\x1e\x5b\x72\xb8\x5f\x28\xe3\xbe\x60\xa2\x0b\x85\xd4\x6b\xd3\x45\xb1\xed\x50\x96\xd7\xef\xc1\x3e\xe5\xa2\x4e\x65\xbc\x5a\x6e\xd4\xa5\x4c\x9c\xfe\xd0\x2d\x7a\xa7\xcf\x6e\xb7\x75\x95\x7c\x62\xb1\x95\x23\xf1\x12\xf9\x0b\xb3\xdf\x6f\x1f\xb4\x01\x7c\x73\xc7\xbb\xa4\xe2\x1a\xe9\x34\x88\xa2\xed\x61\x7a\x94\xd8\x4f\x18\x5d\x36\xbe\xe7\x91\xa5\xb3\xfb\x7a\xdf\x2b\xf5\x22\x70\x73\x6d\x62\x98\xb9\x5a\x3b\x35\xb1\xe2\xb7\x24\xbb\x5b\x9e\xc8\xcb\x8a\x02\x31\x0c\xa0\x99\xf8\x22\x3c\x94\x40\x15\x58\xf3\x20\x7d\x9d\xa0\x0b\x7f\xcf\x81\x4a\xf4\x72\x2c\x11\x3f\xc1\xe8\x4a\x7b\xaf\x9c\x55\xcd\x03\x57\x0b\x10\x23\xe2\x8f\x65\xfc\xdd\x0b\x88\x26\x9e\x9a\xc8\x02\x1c\xc8\x44\x1f\x41\x22\xdc\xca\xce\x50\x4a\x42\xcc\x63\xe0\x33\x6f\xf9\x22\xa0\x39\xde\x98\x2f\x91\x75\x0c\xe0\x13\xda\xf9\x83\x81\x6d\xbb\x00\xfe\x41\x9f\x0f\xda\xed\x8e\x0b\xe0\x0f\xf4\xb9\x7d\xd0\xef\x39\x00\x7e\x62\x79\xfa\x5d\xe7\x00\xc0\xef\xe8\x73\xa7\xdb\x69\x77\x01\xfc\x19\xf9\xe6\xc2\x6c\x3b\x3d\xfa\xb2\x30\x9d\xae\xdb\xed\x03\x00\xff\x64\x9f\xdd\x81\xdd\x39\xa0\x9f\x3b\x6d\xe7\xc0\x66\x0f\xbd\xfe\xc0\xa5\x0f\xbd\x7e\xb7\xdf\x01\x60\xb8\x30\xbb\x07\xfd\x83\x1e\xfb\x74\xe0\xd8\x5d\xde\xe1\xbf\x30\x72\x38\xe8\xf7\xba\x00\xfe\x46\x9f\xdd\x9e\xeb\x74\x01\x7c\xc0\x9e\xbb\x07\x4e\x1f\xc0\x1f\xd9\xf3\xa0\xdd\x03\xf0\x9f\xac\xb6\x03\xbb\xdf\x66\xb5\x39\x7d\xb7\x3d\x00\x00\xfe\xc4\xf0\xef\xf5\x0f\x00\xfc\xb5\xd6\x69\x50\x21\xe0\x25\x5a\xaf\xb9\x33\x5d\xc2\x42\x8e\x29\xe1\xbb\xb8\xef\x12\xe3\x95\x74\xb0\xeb\x23\x16\xd0\x4b\xe3\x73\x97\xf9\xe1\xca\xa9\x96\x14\x6a\xab\x78\x6c\x9a\x07\xe9\xab\x4b\xfc\x3a\x89\x97\x28\x21\xd7\x82\x70\xa0\xf0\xdc\x44\x48\xbd\x8b\x27\x88\x49\x35\x2a\x46\xe6\x24\xea\x50\x5e\xdd\x65\x7e\xa2\x88\xa0\xc8\xdc\x19\xcf\x48\xe3\x0e\x73\x7b\x59\x04\x36\xda\x2b\xaf\xc4\x64\x33\x0f\x21\x83\x62\x4d\xe7\x51\x42\x7c\x4c\x60\x48\x7c\x76\xb3\xd8\x0a\x53\xf6\x57\xeb\xf2\x2a\xf3\x5c\x2c\x7d\x43\x3d\xf6\xed\x66\x53\xc1\x24\x09\xae\x77\xf4\x74\x05\x03\x52\xef\x5a\x98\x7b\x47\x96\x89\x8a\x7f\xe4\xb1\x71\x16\x60\x12\xa4\xd7\xad\x28\xc0\xb3\x87\x68\xb1\x24\xd7\xc6\x64\x54\xf3\xdd\x04\x5e\x06\x4d\x3c\xa8\x34\xa2\xaf\x42\xcd\x51\x57\xdd\xed\x79\xd4\xaa\xb5\xb5\xb0\x7c\x23\xf1\xf7\x8b\x11\xcd\xc0\x55\xbe\x99\xc0\x0b\x89\x89\xc0\x68\x3c\xf1\x7e\xa2\x7f\x0d\x43\x43\x17\xd9\x10\xf2\x81\xdb\x71\x0c\x29\xb8\x9b\x8d\x97\x30\xf8\x55\x47\x00\x19\xf9\x6e\x4c\xa0\x71\xf3\x71\x2b\xfc\x61\x09\xb7\x9f\x43\x4c\x06\x47\x51\xb0\x58\xa2\x59\x4e\x6a\x64\xbd\xce\x72\x3c\xc7\x64\xa0\x4f\x61\x65\x6b\x0b\x39\xbd\xfa\x52\x75\x69\xcf\x31\x69\xbb\xf5\xc5\xea\xd2\xbe\x8f\xe2\x60\x7b\x62\xaf\xa3\x4f\xfc\x2e\x3c\x7f\x8e\xb7\xa5\xd2\x6a\x0b\xc9\x6c\x80\x8a\x34\x71\x96\xc4\x0b\xd3\xc8\xdd\x54\x03\x18\x11\x3f\x20\x39\x03\x8c\x89\xea\x0f\x8e\x40\xec\x8f\x27\xc3\x3d\x93\xf8\x22\x74\x4b\x16\xe3\x5f\x3a\x96\xe2\x31\xfe\x33\xcf\x2c\x8a\x4b\xaf\x94\x48\x67\x47\xb9\x5f\x41\x1b\x86\x7e\xee\x53\xf8\x51\xc8\x9d\xcb\x31\xef\xee\xe3\x64\x02\x84\x7b\xb9\x3d\x7b\x98\xe4\x8e\xe4\xf6\x1c\xc6\x5d\xa7\xc4\xd7\x4c\x03\x41\x45\x61\x3a\xca\x9e\xf4\xe2\x04\x62\x9e\x9f\xed\x3d\xb6\x30\x38\x0f\x91\xef\x3b\x0f\x89\x87\xd8\x9c\x23\x7b\x3e\xd9\xc0\x15\xf1\xf7\x6e\x24\x11\xb2\x09\xb9\xa1\xd4\xc9\x38\xfd\xf3\xf4\x29\x5e\x2d\x50\xc2\xdc\x82\x18\x32\x93\x01\xe0\x8c\xd0\xbd\x59\xde\xc3\x06\x34\x58\x87\xbc\x3a\x33\xa0\x11\xa6\xaf\x25\x75\xb3\xf7\xac\x1c\x34\x74\x80\x0d\x68\x14\xd7\x17\x56\xe4\x38\x9e\x06\x11\x12\x05\x27\x70\xae\x59\x47\xf2\xa9\x56\x83\x30\xef\x70\xee\xf7\x6a\xa9\x00\x60\x1d\x94\x39\xff\xf3\xed\x21\x2e\xb9\xfd\x43\x63\x3c\xa1\x1d\x97\x0f\x0c\x2e\x0c\x0c\x3c\xa3\x6c\x3c\x1f\x97\xbd\xd2\xb8\x7c\x44\xd7\xe9\x7a\x3d\x27\x85\x05\x2c\x3c\x13\xce\x8a\x4d\x04\xe8\x78\x08\xe0\x63\xee\xb5\x82\xbb\x0e\x67\x0e\x28\xe7\xa4\xd9\x64\xdc\x65\x48\x71\xa4\x4b\x7f\x03\x01\xc4\x82\x72\x83\x66\xd3\xdc\x0b\xd7\x6b\xd9\xb4\x3d\x8a\x64\xb3\x69\x26\xe3\x44\x34\x60\xe2\x13\x30\x0c\xcf\xcc\x15\x01\xb4\x34\xf6\x67\xd2\x7b\x62\xcb\x19\xe2\xc7\xbe\x3d\x64\xa0\xfc\x19\x19\xe3\x09\x03\xb8\xb7\x24\x66\x02\x35\x60\x20\x6e\xf9\x4e\xe6\x92\x5c\xbb\xb0\x16\x1a\x44\x99\xad\xea\xc7\x89\x45\xf9\xbc\xd8\xb2\xe0\x31\x6f\x94\xc6\xcb\x55\x14\x49\x8f\xd9\xfc\xcb\xcf\x78\x86\xce\x42\x8c\x66\x86\x77\x2b\xbb\x14\x9e\xad\x07\xb0\xe5\x14\x44\x9a\x73\x22\x23\x04\x73\xce\x1b\xfa\x31\xef\xd2\xcc\xad\x5f\x61\x9e\x5c\x8b\xec\x02\x1c\x80\x89\x7c\x92\x52\xfc\x5e\x4a\xb4\xb2\x19\xfd\x1e\x40\x26\x0d\xc1\x98\x8a\xad\x30\x54\x1c\x8b\x5d\x2b\x68\x84\x67\xe6\x94\x0b\x5a\x39\x5d\x71\xd4\x2e\x18\x6a\xe1\x99\x19\xee\xf9\xf4\x25\xcf\xe1\xd0\xaf\xbb\xc8\x04\x7f\xae\x82\x28\x35\x26\xeb\xb5\x26\x33\xa9\xc9\x2c\x2a\xb9\x03\xf8\x66\xb3\x2e\xc5\xa4\x04\x74\x87\xba\x9b\xcd\xba\x14\xd1\x15\x7a\xf9\x81\xe5\xd1\x37\x52\x24\x6e\x69\x94\xc8\x41\x05\x39\xfe\x54\x8b\x74\x96\x53\x3e\x51\xa4\x84\x4b\xdc\x90\xfb\xc0\x35\x32\x09\xd4\xf0\xc4\x7b\x12\x5c\x8b\x67\x21\x81\x7b\x75\xed\x28\x8a\x39\x22\x6c\x1e\x5d\xbd\xaa\x02\x83\x08\xbd\x8b\x80\xb5\x08\x68\xf5\x0f\xff\x95\x11\x97\xf9\xfb\xe5\xb7\xe0\x61\xbe\x08\xb1\x29\x45\xa8\xac\x43\xc6\xce\x64\x53\x0c\xed\x2b\x49\x8a\x2f\x09\xdc\x7b\x3d\x73\xde\x6b\x7c\x17\xc7\x11\x0a\xb0\x40\x9d\x7b\x81\x15\x2f\x82\xff\xd2\x76\x48\xdc\x33\x5e\x47\xd6\xeb\x3d\x4a\xcf\x96\xe0\xfc\x26\x80\x24\x7f\x56\x28\x58\xa9\xea\x49\x40\x10\x83\x76\xe7\x92\xcc\x15\xb2\xe1\x65\x5e\x7b\xe8\xbe\x86\x85\x7b\xe3\x1b\x1c\x64\x2d\x50\x9a\x06\xe7\xfc\x9b\x78\xe6\x25\xdf\xa0\xf3\xa7\x57\x4b\x56\x2b\xb2\x52\x16\x3f\x9e\xb2\x4d\xf1\xb8\x5e\x23\xeb\x3c\x8a\x4f\x83\x88\x7d\xe4\x8f\xf4\x63\x78\x8e\xe3\x04\x1d\x05\x29\xcf\x9d\xbf\xd2\x44\x16\x58\x32\x0a\x31\x4f\xcb\xde\x98\xdf\x48\x12\x4e\x3f\x5e\xf3\x1a\xd8\x23\xfd\xb8\xc2\xe1\x34\x9e\xf1\xdc\xe2\x39\x6b\xe5\x46\xae\x44\x41\x26\x23\xb4\x9c\x61\xc0\x58\x35\xf3\x41\x3b\x0e\xe8\x62\x24\x0b\x34\x12\xfe\x4e\x86\x41\xcb\x77\x36\x25\xa2\x7c\x11\x2c\x95\x4e\x4a\xc3\x4f\xbc\x43\xe8\x43\xb3\x49\x79\xa2\x85\x84\x07\x21\xda\xe7\xf9\x33\x96\x1e\xf0\xc7\x68\x42\x99\x9f\x7c\x23\x13\x00\x78\x37\xbe\x45\xe4\x16\xc8\x6c\x04\xd3\x7c\x30\x77\x83\xbb\xcb\x34\xda\x95\x4c\x15\x1a\x53\x89\xa6\x40\x06\xec\x25\x13\x99\xc5\x7b\x2e\x28\xab\x1f\x54\xa9\x3b\x2f\x28\x44\x63\x25\x63\xf1\x4b\x2e\x22\x2b\x59\x8a\x5f\x54\x71\x58\xfd\x24\xe4\x58\xb5\x27\xbe\x5b\x9d\x9d\xd1\x76\xf2\xa9\x50\xf4\x9c\x2d\x44\xc4\xc8\x3f\x93\xeb\x47\x24\x08\x68\xcf\xa7\xdf\x08\x90\x7e\xa7\xb3\x19\xc5\xc3\xe4\x17\x47\x25\xf5\x0b\xe3\xc2\xa4\x8e\xc0\x8f\x2a\xb4\xc8\xc4\x51\x3f\x1a\x07\x22\xb8\x06\x31\xa7\x90\x80\xf5\x7a\xef\x9a\x98\x64\x3c\x9d\x40\x44\x7f\x62\x98\x2a\x33\x98\xd1\xa8\x5c\xed\x18\xb6\x0b\x52\xa7\xe4\x10\x6b\xe5\x78\x02\xc7\x13\x2a\x3a\x9c\xde\xb6\x57\x5e\xd0\x02\x11\x61\x0a\x32\x65\x65\x3f\x22\xaa\x84\x62\x22\xb0\x5e\x9f\x92\x42\x60\x9d\x43\x35\xc7\xaf\xc8\x7c\x11\x2c\xa1\x9a\xfe\xb6\xa8\x0f\x61\xf3\x36\x4f\x7d\x4f\x94\x60\xec\xcc\x3b\x19\x2d\x9f\xf8\x2f\xe8\x20\x90\xe4\x9a\x89\x96\x89\x95\x9a\x80\x6d\x21\x12\x0b\xe7\xfb\x07\x21\x8b\x9c\xcb\x1d\x04\x74\x01\x0c\xfc\x70\x6c\x4f\x60\xe4\x87\x63\x67\x32\x3c\x24\x66\x04\x46\x2c\x34\xa5\x19\xc0\xf7\xf4\x0d\x78\xf2\x35\x02\x9b\xcd\x94\x2d\x03\x31\xb8\x49\x2c\x64\xc6\x60\x73\x16\xe2\x20\x8a\xae\x6f\x12\xeb\xcc\xcc\x54\x8e\xca\x86\xe4\xa3\xda\x58\xd6\xf2\x11\x6b\x81\xc7\xbc\x06\x2e\x83\x24\x45\x15\x07\x82\x00\x6c\x8c\x55\x26\x85\x65\x2c\xff\xed\xf5\xe2\x34\x8e\x9a\x4d\xfe\x97\x11\xd3\x09\xf1\x7f\x34\xdb\xb0\xec\xe8\x75\x4f\xaf\xc6\x5a\xaf\x4d\x22\xdc\x1b\x37\x9b\xc2\xab\xe2\x94\x3b\x6e\xe5\x0e\x87\x53\x00\xf7\xe8\xc2\xb2\xc7\xa2\x0d\x89\xed\xb6\xa2\x95\xc9\xfc\x03\x17\x17\xbd\x62\x58\x1c\xfe\xc4\xc1\xcb\xc0\x36\xa2\xb2\x48\xc4\x89\xad\x89\x99\x33\x4f\xd0\x59\x4d\xd0\x9c\x10\x4f\xa3\xd5\x0c\xa5\xa6\x41\x61\x44\xf3\x38\x25\x5e\xcf\xb6\x7b\x6c\x7b\x31\x32\xb1\xc5\x7b\xcb\x44\x3a\xb7\x95\xb9\x5b\x66\x4b\x04\x4a\x19\x15\xb5\xa8\x5b\xf5\xb8\x79\x40\xbd\x4c\x81\x5b\x17\x44\xa0\xaa\xb8\x9d\xc6\x18\x33\x8f\xc1\x47\x41\x14\x9d\x06\xd3\x8f\x1a\xf7\x7b\x33\xf3\xbd\x89\x73\x21\x1b\x40\x5d\x29\x16\x0b\x2c\x57\x1a\x4b\xe7\xa7\x05\x37\xc9\x27\xf8\x8c\x6e\xf3\x8c\x4c\x77\x4b\x07\x90\x00\x00\x15\x37\x9a\xcd\xe6\xde\x76\x6f\xaf\x25\xdf\xd3\xc0\x4a\xe3\x05\xd2\x3a\x29\x65\x8e\xe8\x41\xc9\x03\xb4\x16\x88\x5f\xe7\x03\xb7\x52\x1b\x5c\xd1\x7c\x08\xde\x6c\x00\x00\xc0\x93\xde\x9a\xd1\xbe\xd1\x98\x07\x69\x23\x88\x12\x14\xcc\xae\x1b\xa7\x08\xe1\x06\xf7\xee\x87\x12\x34\x33\x0a\x1c\xe8\x52\xf0\x0f\xe6\xd9\x9b\xf9\x0c\x2f\x12\xb9\x31\x01\xcd\xe6\x09\x67\x77\xfa\x59\x90\x4f\xdf\x67\xe5\x8d\x0c\x0c\xaa\x4e\x12\x23\x3f\x78\xd4\x1e\x11\x4f\xcc\x81\x64\x94\x48\x45\xd3\x39\x22\xca\xd6\xfa\x09\xe2\xee\x5f\xe9\xbe\x12\x62\xe0\x25\x4c\xd2\x2e\x2b\x87\xdf\xa0\xb3\x08\x4d\x89\x56\x34\x16\x69\xd6\x0c\x4d\xe3\x24\x20\x08\x44\x7e\xf9\x53\x86\xef\x10\x45\x29\x6a\x48\xf1\x26\xf6\x51\xbe\xa4\xc4\x74\x49\x89\x5b\x2d\x60\x86\x3e\x1a\xc7\xb4\x3f\xcc\xc8\x37\x69\x2b\x42\x33\x02\x5e\xf0\x98\x3e\x50\x30\x11\xf0\xd8\x03\x00\xeb\x75\x94\xc9\xba\xc1\xe3\x76\xb3\x19\x35\x9b\xa2\x95\x7c\xee\xc9\x56\x8a\x72\x30\x62\x0b\xce\x0b\xe2\xef\x39\xf0\x98\xfe\xe6\x23\x74\x95\x69\x69\xf4\x10\x10\xc4\xf0\x66\x1a\xe3\xb3\xf0\x7c\xc5\xb4\x09\xde\x9e\x0d\x51\xa6\x5b\xa0\x6f\x7a\x3f\xa0\xf2\xac\x23\x9f\x14\x04\x8c\xd8\xc7\x42\x3c\x23\xc2\x75\x9f\x1b\x58\xf4\x92\x0d\x6e\xf8\xe2\xe6\xa3\x51\x75\x76\xd1\x3d\xa6\x27\xc2\x07\x2f\xe2\x0b\xa4\x42\xdb\xa8\x41\xa1\x3e\x64\x24\x23\xe3\xb3\xd0\x55\x49\x8c\xc1\x38\x98\x98\x11\x5d\xf4\x63\xbe\x02\x89\xf5\x64\x5a\x8c\x3a\x80\xcd\x29\xd8\xc4\x6c\xd1\x1a\x11\x33\x05\x5e\x39\xfe\x77\x2a\x02\x87\x27\x74\xbb\xfb\x82\xac\xd7\x82\x74\x6b\x4f\x0d\x4c\x23\x89\x23\x64\x80\xf5\xda\xbc\x22\x66\x25\x37\xe4\xc9\xe2\x0f\x80\x74\xd4\x6c\x00\x8f\x77\x82\x1c\x24\x61\x70\x1c\x9c\xa2\x88\x81\xa7\x43\x6d\xc3\xb1\x71\x38\x25\xe1\x05\xa2\x24\x8f\xf0\x2c\xc0\xc4\x80\xc6\x21\x89\x17\xe1\x94\x3e\xac\x48\x7c\x24\x42\x2d\x1b\xd0\xf8\x6e\x95\x5e\x1b\xd0\x38\x9a\xa3\xe9\x47\x34\xa3\x4f\x71\x74\x14\xaf\x58\x99\xa3\x38\x7a\x8e\x67\xe8\x8a\x3f\xbe\x5d\x06\x98\x3d\x61\x92\xc4\x51\x4a\x1f\xb9\xb3\x72\x03\x1a\x7c\x76\x9d\xa2\xd9\x77\xd7\xec\x8d\xf9\xb7\xa7\x4f\x32\x88\x39\xe4\x12\xe9\x0b\xbe\x3d\xa1\xaf\x57\xcb\x00\xcf\x58\xca\xf7\x51\x7c\xf9\x2e\x36\xa0\xf1\x2c\x48\x5f\xc7\xcb\xd5\x92\x3e\x86\xb3\x19\xa2\xd5\x3d\xc7\x17\x41\x14\xd2\x6c\x3f\xa1\xeb\xb7\xf3\x38\x21\xd3\x15\xa1\xa0\x79\xab\xc5\xdf\x48\xd4\x7c\x8c\x2e\xf8\xc7\xf0\x82\x56\xf2\x22\x9e\x05\xf4\xf5\x05\xdd\xa6\x1c\x87\x18\xc9\x67\xee\x03\x5f\xe8\xe0\x5e\x25\x21\xc2\x84\x2d\x8e\xf4\xed\x12\x53\xf0\xaf\x95\xc8\x12\xd0\x78\x1d\xa7\xcf\x31\xdd\x07\x40\xe3\x75\x82\xd2\x94\xe1\xfd\x06\x05\xb3\x57\x38\xba\x66\x8f\x11\xba\xe0\x1d\xfd\x06\xfd\xb9\x0a\x13\x9e\x21\x8e\x90\xe4\x3b\x1c\xf8\x9b\xf8\x52\x76\xee\x9b\xf8\x52\x76\xee\x9b\xf8\x52\x74\x2e\xc7\x8b\x15\x7e\x8b\xc8\xdb\xf0\x13\xc5\xef\x6d\x9c\xd0\x02\xcc\x6f\xf2\x8b\xe0\x2a\x7b\x0c\xb1\x7c\x7c\x19\x5f\xca\xc7\x77\xe8\x8a\x18\x93\xaa\x83\xeb\x7c\x45\xd6\xd3\x20\x25\xa4\x6a\xc0\x35\xfe\xdd\xd8\x47\x60\x03\xf8\x1a\xfd\x94\xc0\xe7\x04\xbe\x93\xb2\x0c\x7c\x45\xfc\x77\xc4\x7a\x3b\x0f\x66\xf1\xe5\x9b\x38\x26\xcd\xa6\x99\xc9\x10\x22\xe1\xfa\xe8\xed\xdb\xf5\x5a\x79\xb1\x30\x8b\xd6\xc3\x0b\x81\x66\xd3\x08\x66\xf1\x92\xa0\xd9\x5b\x72\x1d\xa1\xb7\x73\x84\x48\x6a\x84\xb8\xf1\x44\x7a\xcc\xce\xd0\x6c\x36\x0d\x11\x38\x8e\xa6\x1f\xbd\x7d\x9b\x97\x50\xda\xf2\x9a\xf8\x5c\x4c\x33\x01\x7c\xc9\xdd\x8b\xff\x82\x82\x8f\x54\x54\x7d\x43\xea\xa3\x8d\x0a\x45\x55\xc9\xc5\xf9\xc9\x83\x69\x9a\xbe\x61\x41\xcb\x1f\xd0\xc9\x95\xec\xf9\xfe\x6b\x02\x78\xa4\x22\x11\xa5\xe8\xe8\xed\x5b\x9e\xa3\x11\xa6\x0d\x1c\x93\x46\xa6\x7c\xa0\x14\x66\x35\x7e\x4e\x51\xe3\xbf\x57\x38\x0d\xce\xd0\xd1\xdb\xb7\xff\xdd\x88\x93\xc6\x7f\x4f\xd3\xf4\xbf\xd9\xd1\x26\x0a\x66\x96\x01\xf8\x31\xf2\x34\x4d\xe9\xf8\xc9\x20\xa7\x44\x1b\xd8\x34\xcd\xda\x5c\xf1\xc8\xac\x44\x35\x8d\xa1\x08\x6b\x4f\xe8\x42\xf7\x8a\xc8\xd8\x81\x6c\x3f\x2d\xfc\xfa\xe6\x51\x56\x9a\x4d\x87\xed\x69\x85\x2a\x18\xb3\x90\x21\x2f\xb9\x24\x4a\x85\x98\xbc\x6c\xb3\x69\xf2\x68\x73\xb1\xcf\xa3\x20\x14\x46\x01\xc8\xc0\x7e\x6f\xaf\xf1\xd4\x54\xdb\x04\x20\x6e\x36\x5f\x12\x26\xcd\x53\x76\x9e\x09\x6c\x48\xf1\xb3\x2e\xb5\xe5\xdb\xdc\xab\x4b\x80\x8a\x61\x00\xf1\x75\xb1\x6d\x6e\xf3\xa8\xfc\xd8\x19\x91\x96\xe3\xd9\x00\x26\xbe\xa3\x7a\x56\x6e\x39\x5a\xdf\xca\x3c\x9c\x1b\x87\x34\x42\x63\x7b\xe2\xe1\x4a\xa0\x3d\x52\x0c\x6d\xb6\x5f\xd2\x82\xf3\x60\xaf\x05\x9a\xca\x74\x53\xb2\x5d\x4c\x2e\xc1\x7c\x8f\x9f\xeb\xcd\xb2\x6c\xc3\x02\xe5\xb1\x29\xdf\x58\x06\x94\x23\x35\x48\xdc\xf8\x66\x9a\xa6\xdf\xe4\x11\xad\xf2\x28\x59\xa5\x04\x1e\x85\xdf\x6b\x18\xfb\x68\xdf\xe0\x04\xfa\x4d\x46\xa0\xdf\x50\x48\x14\x26\x8b\xad\x15\x85\x04\x25\x41\xd4\xe0\x8a\x0d\xd8\x38\x5d\x91\x06\x09\x3e\xa2\xc6\x34\x48\x10\xcd\x29\xe2\x6f\x2c\x83\x73\xd4\x48\xd1\x74\x95\x84\xe4\x9a\x85\xdc\xc0\x60\x1f\x8d\x93\x7d\x67\xb2\x81\xb4\xbb\x72\x6d\x1d\xba\x6c\xbc\x21\x66\x08\xe9\x54\x05\x1b\xf8\x84\xf8\xaf\x88\xe6\xc4\xbb\x81\xf4\x47\xda\xaa\x45\x40\x81\xfa\x46\x15\x1d\x22\xc4\xbe\x61\xf0\x0d\x2a\xed\xdf\x37\xab\x08\xa5\xb7\xef\x54\xf1\xbe\x2f\x36\xa9\x39\xb1\x71\x59\x21\xe4\x7b\xcf\xb0\x66\xef\xa9\xdb\xb2\xf3\xc6\x1a\x7c\x8b\xa9\x8c\xe8\x08\x79\x68\xdf\x30\xc4\xd4\x62\x3d\x61\x62\xb6\xe9\xf3\xd0\x06\xfe\x91\x31\xd8\x1f\x88\xff\x07\xb1\x48\xb2\x4a\x09\x9a\xbd\xbb\x5e\xa2\x14\x7e\x22\xfe\x0f\x64\xf4\x03\xe1\x27\xbe\x6f\xd9\xfa\xe2\x19\x06\xfc\x8e\x65\xe5\x31\x47\x2f\x64\xc4\xc2\xd7\x71\x74\x7d\x16\x46\xd1\x5b\xbe\x0d\x83\x3f\x13\xff\x86\xc4\x99\x04\x55\x3a\x3c\x13\x4a\x35\x22\xa2\x9d\x09\xcd\x93\x87\x7c\x34\xfa\xc4\x85\x6c\x45\x35\x29\x0e\x41\x98\xce\x86\xcf\x2a\x4f\x6e\x41\x69\xf3\x2a\x5b\xeb\x7c\xca\xc3\xb3\x24\x5e\xd4\xe1\x20\xc2\x5f\x0d\x6b\x70\xe1\x01\x61\xa9\xa4\xa8\xa2\xc2\xb5\x62\x5e\x16\x2d\x16\x8d\xe8\x83\xc7\x3f\x9b\x08\x6c\x47\x9b\x52\x04\xf6\x15\xb5\x00\x02\x62\xc4\x13\x70\xc3\x61\x6e\x72\x05\xc3\x06\xfe\x59\x3e\x53\x93\x33\x9e\x87\x8b\x36\x09\x3b\xac\x45\x94\xd7\x6e\xe0\x2f\xc4\xbf\x09\xb2\xb6\xee\xd9\x90\x92\x80\x27\xcc\x44\xa6\x31\xbe\x40\x09\x41\x89\xf7\x33\x81\x09\xdf\x4f\x78\x7b\x0e\x9c\x07\xe9\xd1\x3c\xc0\xe7\x68\xe6\xfd\x49\x36\xf0\x37\xb2\xbb\xf1\x93\x8c\x00\x55\xb5\x7d\x42\xaa\xed\x13\x00\xd6\xc9\x83\xa7\x61\xa6\xc6\x41\x56\x98\xf2\xe8\x08\xaf\x11\x9e\x85\xf8\x9c\x6e\x1e\x98\xc4\xc9\xbf\xce\xf8\xfb\xc9\x83\xa7\x11\xeb\x10\x88\xac\x95\x49\x59\x70\x75\xe7\xbd\xaa\x8b\x4a\x25\x16\xa5\xa1\x58\x5a\x9f\x9e\xc8\x40\x3a\x54\xc2\xd6\x09\x2b\xc4\x42\x98\x2e\xa2\x0c\x05\x8a\x13\xda\x64\x0b\xf3\xe1\x71\x86\xbb\x84\x77\x6e\x8a\xd4\x04\xfd\xb9\x42\x29\xe1\x98\x9b\x6a\x30\x24\xbe\x86\x28\x47\xe4\xf3\x4a\x00\xa4\x2d\xc2\x13\xdb\x71\x14\x5c\xfb\x0b\x79\x38\x42\xd5\x50\x5c\x39\x17\x1a\x9a\x82\x66\x4d\xb1\x2a\x9f\x3c\x78\xfa\x16\x28\xf1\x7c\xc9\x88\x78\x59\x82\x3f\x9e\x00\x7e\xda\x8e\xe4\xd2\x4b\xb3\xf0\x76\xe1\x19\x4a\xb8\xa0\xc5\x3e\x84\xe9\x91\x54\x58\x34\x9b\x4a\xd0\x64\x64\xcd\xe3\x94\x64\x69\x85\x90\xc7\xeb\x35\x96\x87\x88\x79\x53\x44\x18\xd2\xdb\x5b\x33\xcc\x15\x4f\x79\x53\x54\xcd\xd1\x7a\x4d\x64\x74\xf4\x2c\x43\x16\xb8\x0a\x81\xc7\x8f\x1f\xdb\x2c\x68\xba\xa8\x98\x0e\xdb\xd6\x08\xed\xc3\xca\x90\x09\xcd\x85\xd8\x06\x85\x48\x17\xd0\x85\xc7\x13\x29\xed\x97\x30\x0b\x86\xc6\xe8\x9e\x49\x22\x18\xa2\x31\x9e\x00\x38\x43\x74\x3b\xd4\x60\x2f\xca\xf0\xf2\xd0\xaf\x6f\xb2\x3e\xdf\x42\xd6\x72\x7c\x65\x50\xf9\x4c\x20\x56\x47\x99\x72\x45\x96\x1c\x10\x12\x4c\xe7\x5c\x00\x36\x2b\xcd\xcb\x0b\xbf\x2a\xc5\xc1\x29\x32\x9d\x57\x64\x84\xac\xaa\xec\xec\x93\xda\x38\x41\xf5\x4b\x27\xf2\x44\x00\x5d\xf6\xba\x01\x1e\xd1\x06\xc9\xe1\xbc\xb9\x2e\x36\x2e\x03\xc0\x62\x49\xbf\x23\x56\x14\x92\x97\x31\x9e\xa2\x61\xd6\xfc\xa4\xd9\xc4\x25\xb5\x19\xa6\x39\x0c\x98\x00\x88\x2d\x82\xae\x28\xc1\x12\x84\x09\xe5\x53\x7c\xe5\x2d\x45\xe5\xc5\x74\x78\x4c\x21\x1f\x6b\x48\x82\xb5\x28\x55\xa3\x02\xed\xa2\x05\xe4\xfc\x32\xa7\xe0\xf2\x4c\x33\x4b\x5f\x04\x13\x29\x51\x87\x09\x04\xf3\x29\xb2\x2c\x93\xee\xe6\x4b\xfc\xa7\x3c\x67\x6a\xd9\x0e\x9f\x71\x15\x8d\xef\x96\xd9\xad\x28\x6e\xa5\xdd\x96\x12\x32\xb0\x80\x99\x6e\x8a\x67\x59\x67\x61\xba\x7b\xd7\x7d\x95\xe6\x3d\x51\x30\xd8\xb9\x85\xd9\x42\x2b\x56\xcf\x5a\xd4\x85\x12\x4c\xae\x25\x3f\xb1\x90\xc6\x2a\x53\x7a\xa5\xb7\x56\x96\x61\x33\x2b\xe1\xd9\x5d\x6d\x78\x76\x77\x32\x52\x5f\xbc\x5f\x08\x0c\xab\x6b\xd0\xc9\x83\xa7\x4b\x13\xc1\x84\x1d\x65\x65\x50\xc2\x66\x93\xed\x18\x12\x4b\x08\x06\xbc\xf6\xc0\xcf\xb3\x28\x1c\x9f\x1d\x65\x71\x59\xa2\x26\xc0\xbd\x22\xf6\x81\x91\x92\xdd\xfb\x99\x00\x35\xd1\x24\x30\xb1\x98\x3a\x3c\x5b\xa8\x23\x1f\x09\x1a\x0e\x46\x5a\x45\x5c\x28\x14\x74\x85\xe9\x1d\xc2\x20\x5b\xad\x85\xd4\xb0\x51\xba\xf8\xf0\xa7\xed\x5d\x5c\xee\x26\x18\xfa\xac\xab\x2e\xc4\x09\x49\xb9\xb3\xb2\x9a\xe8\xab\xec\xab\x84\x66\x96\x0b\x80\xe0\xa7\x66\x08\x60\xa4\xb3\x2e\x0b\xf2\x4e\x19\xdd\x14\x65\x54\x25\x69\xe3\xe9\xfa\x3f\xb8\xb5\xff\x0b\x00\xc1\x28\x28\x8c\x80\xd2\xd5\x21\xeb\xb3\x71\x38\xf1\xa3\x62\x19\x93\xc0\x80\x0f\x4c\x6d\xaf\x16\x04\x9f\x3a\xa2\xe7\xb6\x79\x7b\x76\xce\x9a\xd9\xbe\xde\xc4\x54\x36\xa8\x10\xa7\xa6\xff\x84\xd9\xbc\x98\x63\xeb\xf5\x9f\x04\x30\x1e\xc9\xe3\xbb\x8e\xcc\x4c\x42\xa3\xb9\xd8\x39\x56\xfe\x25\x15\x36\xd7\x90\xd1\x36\x96\xb4\x5d\x1c\x3e\xa4\xea\x91\x64\xc2\x91\xe4\xc4\xf4\x59\xca\x7e\x79\x57\x1c\x09\xd0\x18\x00\xe0\x25\xfe\x9e\x03\xe0\x9e\x90\x91\x0a\x72\x6d\xb3\x99\x28\x80\x4e\x32\xf0\x7f\x98\xa0\xc0\x00\xfe\xb8\x4d\x8a\xe5\x7c\xcb\x44\xfe\xd4\x04\xd6\x22\x48\x3e\x9a\x85\xdb\x10\x8c\x8c\x25\x73\xa3\x59\x2e\x13\x4d\x18\xde\xe1\x10\xc8\x00\xef\xe2\x66\x00\x33\xbc\xac\x84\x9b\xae\x4a\xe7\x36\x14\x25\xa8\x58\x4e\xcb\xf8\x1d\x48\x58\x93\x64\xec\x74\xf1\xf9\x40\xdd\xfc\xf4\x3c\x51\xaa\x07\x91\x45\x6c\x1f\x59\x7c\xa3\xe3\x00\x98\x6b\xba\xb9\x6d\x9b\x45\x6c\x20\x43\x86\x87\x67\x26\xf6\x89\x95\x4e\xe7\x68\xb6\x12\x4b\x08\x15\xac\x91\x45\x1c\x21\xfc\x60\xb8\x47\xdf\xa8\xd8\xc5\xaa\x75\x3a\xbc\xde\x4d\x6e\xba\xc2\x3f\x43\x2c\x62\x67\x77\x72\xb3\x8a\xe0\x34\x59\x2d\x89\x69\x08\x1b\x26\xb8\x57\x69\xb0\x40\xc5\xe9\x72\x1b\x01\x84\x67\xaa\x55\x06\x89\x97\x26\x1d\x3d\x19\xbb\x6c\xec\xc0\xde\x84\x1d\xa6\x97\x46\x8f\x8f\x1d\xc4\x39\x8f\x56\xf5\x12\x95\xad\x08\x0b\x35\xcf\x39\x09\x92\x27\x8f\x50\xdd\x6f\xd1\xf5\xe7\xe6\x03\x31\x03\x76\xe6\x10\xc1\x18\x1a\xfc\xc2\x88\x7a\xac\x1e\x57\x33\x31\x3d\x0e\xcb\x15\x09\x4a\xa7\xcb\x18\x30\x73\x12\x2c\xf6\xf5\x2d\x5a\xb1\x25\x4a\xce\xe2\x64\x21\xc7\x25\x03\x52\xf8\x7e\x1b\x41\x87\x67\xa6\x6e\xc2\x64\xab\xe4\xd3\x50\x99\x38\xa1\x66\x45\x57\xc2\x8c\x93\x31\x9e\xa8\xbb\xb5\xa7\xa1\xd0\x37\xf2\x6d\x2b\x66\xd7\x6d\xfc\x8c\x2d\x30\xa5\x0c\x25\x31\x2e\x3d\xc7\xab\x68\x26\xda\x92\x00\xc9\x50\x2e\xc3\x28\xca\x3e\x7e\x1d\x91\x8a\x83\xbf\x4d\xda\xe0\x6d\x5a\x65\xf8\x65\x5b\xb7\x8f\x26\xc8\x35\x45\x22\x9a\x3d\x6d\xa8\x92\x0e\xc3\x0d\xce\x78\xdd\xe1\x53\x93\x05\x6b\x97\x61\xa2\xb3\x06\x6e\x15\xcd\x68\xb9\x2f\xdb\x9e\x7d\x66\xbf\xdc\x2a\x86\x41\x79\x08\x28\xf2\xaf\xd7\x66\xe9\x4b\x76\x0b\xea\x2c\x4c\x32\xb0\x74\x3d\x51\xfb\x94\x7e\x50\x39\xb1\x4e\xf0\xac\x51\x02\x54\x75\x18\x19\x20\x0e\x3b\x3f\xfb\xda\x72\x8c\x79\x8e\x04\x6a\x32\xb7\x59\x08\x3a\xf7\x73\x09\xd2\xd6\x99\x49\x19\x72\x3e\xa7\x15\xca\xae\x8f\x54\xb7\x67\x97\x90\xae\x0f\x9e\xca\xe6\x6d\x51\x47\x50\x5e\x29\x6f\x99\xa7\x34\xcf\x2b\x13\x43\x61\x16\xad\xcc\xd8\x23\x39\x63\x55\xfa\x2d\x61\x36\xdb\x4a\xa9\xea\x20\xeb\x33\x4e\xa4\xce\x28\x98\xcd\x9e\xe3\x90\x84\x41\x14\x7e\xda\xa6\x7d\x10\xc4\x83\x59\x3e\x13\xc0\xb2\x66\x65\xae\x55\xab\xcc\x55\x9d\x4a\x86\x5e\xcc\x42\x7f\xa2\x59\x26\x60\xa5\x5b\x8e\x54\xca\x35\x0b\xed\xdb\x78\x52\x08\x52\xbb\x83\x6a\x42\xb1\xcc\x46\x5c\xf2\x4f\xe8\x8a\xa2\x4a\xb2\x5c\x47\x71\xc1\x04\x9a\x90\xee\x8e\x09\xc7\x3d\x04\x6c\x7c\x4a\x0a\x8a\xfc\xfa\x40\x1d\x95\x54\x36\x2b\x8e\x76\xb3\xe2\xa8\x9b\x15\x87\x6e\x56\xd8\x92\xc0\x43\x33\xb2\x2b\x77\xd9\xf6\x8a\x89\x57\xe5\xb1\xa8\xe9\x81\x5c\xe2\x23\x16\x8e\x0f\xd9\x7d\xde\x38\x69\x36\xf7\xc4\x75\xc8\x9a\xc3\x6d\x04\xa4\xbe\xc1\x48\xd9\x79\x9e\xaa\x3d\x97\x27\x7c\x9e\x71\x72\x62\xec\x23\xb9\x94\x28\xb2\xaa\x62\xf1\x81\x20\x86\x04\x14\x14\x11\x35\xe6\x13\x05\x84\x20\xdd\x91\x6d\xd4\x89\x5f\x85\x5d\x27\x62\x8b\x90\xda\xf5\x3c\x66\x4c\x26\x25\x1b\x88\x8c\x2a\x84\x24\x3d\x14\xd9\xfc\x44\xa7\xd3\x44\x30\xa4\x1b\x56\xb8\xd5\x54\x43\x8b\xbc\x10\xe2\xb7\x04\xca\xac\x19\x47\xbe\xeb\x5a\xaf\x7f\x21\xca\x04\xe7\x83\xaf\x8b\xd0\x7b\x96\xf1\xfe\x82\xc9\x82\x2c\x32\x33\x14\x6b\xc9\x02\x25\xcd\x7c\x71\x3f\x00\x29\xb6\x3c\xca\xcd\x1a\xae\xbe\x1e\x32\xb3\x66\x85\xfa\xf2\xcd\x8c\x35\x97\xfc\x6f\xee\x5f\x98\xc8\x9a\x83\x3a\xda\x94\x8b\x87\x89\xaa\x69\x39\xdb\xbb\x28\xae\x31\xe5\x16\x2d\xb3\x22\x06\xc8\x0f\x9e\x24\x2d\x89\x24\x76\x0a\x35\x9e\x48\x7b\xd3\x0b\x53\x6b\xa6\xf4\x32\x58\xa0\xd4\xc4\x00\xc0\x9a\x0c\x9c\xee\x59\x16\xb0\xab\xcd\xa5\x38\xcc\x1a\x2a\x5a\xab\x0c\xf9\x10\xe2\x71\x38\xc9\x8c\x2b\x03\x7e\xc0\x15\x94\x0f\xb8\x36\x1a\xca\xe0\xba\x36\xbf\x30\x74\xfc\x1b\xef\xfb\x54\xe8\xe2\x94\xd5\xac\x98\xad\x9e\x5f\x8d\x99\xa1\x6d\xe1\x82\x6a\xce\x0e\x58\x4f\xd2\x01\x79\x4b\xe9\x91\xc5\xad\x35\x9d\x87\x36\xb0\x12\x74\x81\x92\x14\x99\xba\x9e\xc1\xda\x9e\xc1\xb2\x67\xac\x15\x4e\xe7\xe1\x19\x31\x9f\x10\x1e\x61\xf6\x96\xee\x60\xf6\x5d\xea\xee\x59\x30\xe8\x27\xcc\x26\x37\x5b\x11\x54\x21\x66\xb9\x45\xd9\xe1\x2b\x9c\x55\x06\x14\x76\x54\xe5\x41\xe5\xfc\x10\x8f\x70\xf5\x23\x1a\x95\xec\x37\xe4\xb5\x3f\x61\x93\xb8\x34\x9f\xbd\x7b\x71\x2c\xd4\xb5\x00\x0c\x7f\x23\x85\x39\x07\x7f\x23\xf5\x33\x44\x49\x14\x03\x3f\x9e\xd0\x6f\x15\x65\xb5\x7f\xb3\x88\x67\xc8\x33\xe2\x25\xc2\xc6\x46\x88\xe9\xdf\x91\xf5\xfa\x3b\x62\xde\xbc\x29\x1e\x4e\x7a\xbf\x91\x8d\xb2\x84\x3f\xd5\x1d\x60\x8a\xb8\xfe\xa9\xba\xae\x3f\x25\xa3\xa7\xc4\xab\xcf\x9b\xaf\xf6\x86\x63\x75\x2d\xdb\xe0\xab\xf5\x83\xec\x54\xf5\x47\xe2\x3f\x28\x9d\xaa\xfe\x93\xf8\x3f\x92\xd1\x8f\x52\xa9\xfd\x3a\x8e\xc2\xe9\xb5\x69\x44\x21\x69\xcd\xc9\x22\x32\xe0\x0d\x4f\xa0\x5d\xa8\x3d\x97\xde\x6c\x64\x7f\xc3\x9f\x88\x4f\x0b\x3e\x30\xe4\x74\x37\x5f\x04\x64\x6e\x25\x01\x9e\xc5\x0b\x13\xec\x1b\x86\xbc\xbe\x75\x00\xa0\xf1\xc0\x00\xf0\x57\xe2\x1b\x23\x63\xff\x27\x02\x11\xf6\x8d\x47\x59\xc1\x5f\x09\x34\x1e\x1b\x00\x92\x5c\xeb\x0e\x31\xf6\x2b\x12\x4a\x65\x85\xb7\xb5\x2b\xbc\xad\xae\xf0\xf6\xc4\x33\x8c\x8c\x56\xb1\x68\xf8\x51\xbc\x60\xda\x7c\x04\x36\x30\xc1\xfe\x96\x1b\x6c\xeb\xb5\x34\xa0\xcc\xec\xa4\x0b\xd7\x9f\xf3\xaf\x1b\x18\xe0\xe2\x7d\x73\x18\x61\xff\xe1\x23\x73\xe4\x99\x7b\xad\xd6\xfa\xf7\x87\xe3\x7f\x05\xad\x4f\x87\xad\x0f\x13\xb0\x36\x7f\x7f\x38\x1a\x8b\xb7\xf1\xbf\x1e\xff\x9e\x4e\xbe\xe5\x1f\x1f\x00\xf0\xf0\x1c\xc6\xd8\x7f\xd8\x6a\x3d\x7e\x78\x0e\x53\xec\x3f\xa4\x7f\xa7\xd8\xe7\x77\x1c\x4c\xe3\xf1\x7a\xdc\xf8\x9d\xfc\x8e\x7f\x3f\xfb\x3d\x99\x50\xe8\xe3\x7f\xfd\xfe\x7b\xfa\xbb\xf1\xcd\x63\xff\xe1\x64\x1f\x98\x4a\xea\xb7\xbe\xfa\x62\x8e\xbc\xf1\xbf\xb2\xf7\xdf\x8d\x6f\xfe\xfb\xd1\x63\x7f\xb2\x36\x7f\x37\xd6\xdf\x80\x35\x00\xeb\x07\xc0\x80\xc6\xb9\x01\xe0\x0a\xfb\x0f\xbf\x79\x78\x0e\x67\xd8\x7f\x68\x3c\x3c\x87\x73\xec\x3f\xfc\x97\x39\xf2\xb8\x44\xb0\x66\x5c\x6f\x4d\xd0\x15\x09\x12\x14\xac\x49\x48\x22\x04\x1e\x3c\x0c\xe1\x52\xdb\x97\xea\xe1\x4a\x7e\x31\xb3\x62\xb9\x92\x28\x96\x2b\xf8\xb1\x33\xc2\xdc\x72\x25\xf4\x9d\x61\xf8\x08\x0f\xc3\xfd\x7d\x90\x8c\xc3\xa2\xe5\x4a\x28\x25\xd3\x9b\x93\x07\x51\x48\x28\x95\x3f\xf0\x10\xe4\x4c\x23\xf5\x08\x67\x47\xa9\x97\x50\x29\xe1\x0c\xfb\x4b\x6c\x3a\x00\x5e\xb0\x07\x17\xc0\x73\x2c\xcc\xa8\xa8\x04\xcb\xe7\x01\x8e\xb9\xc6\xcf\x00\xf0\x5a\x97\x4a\xe6\xfc\x92\xec\x02\x17\xac\xae\x4e\xb1\x9f\x51\xd7\xbb\x04\xa1\x5f\x82\xe8\x23\x4a\x4c\x82\xa1\xe3\x1e\x70\x7d\x0d\x95\x26\x8f\x70\xbd\x71\x96\xd0\x59\xc2\x90\x5d\x2e\x62\x0d\x80\x81\x4f\xf7\x2e\xb2\x65\xc3\x92\xe1\xd6\x32\x48\x08\xe5\x03\x43\x7e\x51\xc4\x86\xb1\x6f\xc3\xd4\x0f\x33\x4b\x5c\x38\xf5\xf3\x8c\x70\x55\x77\x49\x16\x26\x8a\xf5\x2e\x0c\x29\xd7\x0b\x7c\x97\xed\x7f\x8d\x47\xe9\xc5\xf9\x63\xc3\x33\x0c\x18\xf9\x11\xa6\x35\x0c\xe3\x47\xc9\x30\xde\xdf\xcf\x01\xa4\xcc\xca\x17\x4e\xc5\x5e\x0a\xae\xe4\xc3\xcc\x6f\x39\x70\xee\xdb\xc3\xf9\x23\x39\xcc\xcd\xa6\x19\x59\x51\x90\x12\x66\x19\xe8\xcf\xa1\x64\x8c\x2b\x3f\xb2\xd0\x15\x9a\x9a\x29\x5d\xdb\xc0\xdc\x57\xb2\x41\x3a\x17\x23\x3c\x32\xf6\x5a\x2d\xc3\xf7\xfd\x15\x15\xe3\x23\x3f\xc6\xb9\x96\x5a\x7c\x4a\x0b\x9f\xdc\xc9\xc8\x9c\x63\x8b\xa0\x94\x98\xf4\x0d\x34\x9b\x66\x3e\x91\x1e\x3d\x34\xf6\xe9\x57\x46\xf3\x00\x46\xfe\x14\x03\xb5\x74\x7b\xc2\xec\x96\xe9\x57\x5a\xff\x14\x8f\x8c\xc7\xbc\x76\x7b\x32\x32\x23\xa9\x12\x1c\x61\x2f\xc2\xac\xa9\x20\xbf\xe8\xca\xd0\x99\xf9\x2d\xd7\x33\x67\x6a\x4b\x5a\xb4\x42\x49\xf1\x53\x96\x0d\x46\xbe\x52\xac\x3d\x19\x4d\xb1\xf7\x8d\xf1\x8d\x7c\x9b\x61\x6f\x25\x30\x98\xe1\xf5\x9a\xfe\x5d\xe1\x11\x45\x8b\x7d\x8b\xc5\xb7\x94\x7e\x8b\xb0\xc7\x10\x86\xb8\xa0\x88\x5a\xfa\x1c\xff\x66\x13\x8d\xe3\x7d\x67\x42\x37\x3b\x09\x49\x7f\x09\xc9\xdc\x34\x1e\x3e\x36\xc0\xc8\x68\xd0\x21\x1e\x06\xfb\xbe\xe8\xe9\x74\x1f\x61\x6f\xf6\xd8\xb7\x47\x66\xc8\x57\x99\x29\x80\xa9\x60\xe8\x36\x9c\x81\x7d\xe3\x01\xe3\xfe\xfb\xf2\xe3\x0c\xec\xff\x44\xf6\x97\xc0\x4b\xe9\x5f\xb3\x45\xe9\x67\x96\x95\x96\xbb\xec\x18\x78\x4b\xee\x59\xe4\xcc\x0f\xf6\x4d\x34\x4e\x26\xeb\xb5\xf1\x68\xf4\xd8\x00\xfb\xa6\x24\xb9\x87\x92\xe6\x98\x00\xbc\x57\x96\x91\xd6\xeb\x3d\x8d\xfd\x71\x70\x69\x80\xa2\xcd\x62\xc8\xed\x6a\x1b\x04\x2d\x96\x51\x40\x50\x43\xcc\xaa\x46\xc0\xee\x61\x49\x11\x66\x9c\x0d\xf9\x3f\xc9\xe8\x9f\x72\x6d\xa4\x4b\xa0\x79\x06\xbc\x33\x18\x4e\x36\xfc\x94\x67\xe6\x9f\x9b\x2b\xe8\x02\x38\xf7\x67\x63\x7b\x02\x97\xfe\x6c\xec\x4c\x32\x8d\x22\x8a\x7c\x54\x3a\x2d\x9e\x43\x0c\xe0\x29\xb6\xa6\xdc\x8a\xf8\x65\x3c\x13\x9a\x3c\x14\xd1\xc5\x8f\xd0\x95\x8e\x36\x3a\xe0\x73\xff\xac\x92\x78\xed\x9f\x71\x2d\x12\x3b\x1a\x1e\x5e\x8b\x33\x29\x13\xc0\x33\x71\x66\x2c\x14\xb6\x67\xf0\xc2\xbc\xb6\xa6\x34\x17\xad\x25\x05\x80\xdd\x3c\x1c\xca\xd9\x95\xf8\xa7\xdc\xf5\x0e\x4d\x35\x01\x68\x36\xa7\x82\x0a\x1f\xa5\xfc\x26\xa2\xc3\x4e\xe1\x70\x3c\x43\x94\xd7\xb0\x4f\x49\xc1\xd6\x3d\x35\x85\x74\xba\x80\xa7\x94\x45\x1c\xf9\x2f\xcc\xa4\x60\xf8\xce\x25\x7b\x45\x32\x3d\x12\x92\xe9\xc2\x3f\xaa\x48\xa6\x87\xfe\x42\x48\xa6\x54\x0c\xb6\x10\x9e\x09\x82\xe4\x74\x05\xd6\xeb\x43\x95\x4e\x7f\x22\xa2\xf6\xb7\xfe\x72\x1c\xef\xef\xb3\x7e\x3f\xe5\xc4\x75\xa8\x6c\x8c\xde\xf2\x5c\xef\xfd\x22\x6a\xe6\xdb\xa2\xd4\x28\xc9\x17\x30\x33\x0e\x42\xc1\xc3\x8f\xfe\x43\x73\x6c\x8d\xfe\x31\x01\x23\xd3\xfa\x16\x3c\xe4\xec\xe8\x2d\x18\x4e\x79\x35\x37\xcc\xa8\xc9\x81\xcc\xce\xc3\x8b\x20\x0e\x16\xc8\xfb\x48\x19\x88\x5c\x6f\xde\xc3\x29\x89\x13\xcf\xb0\x28\x9b\xf8\x48\x59\xc0\x09\xf6\x8c\x51\xf6\xf6\x0c\x7b\xc6\x3f\xb2\xb7\x17\xd8\xfb\x88\x37\x80\x0b\xda\x85\x3a\x7a\xb2\x8e\x0d\xdd\x9b\x73\x39\xfd\x1d\xb8\x39\xb2\x90\xf9\x2e\x97\xd3\x8f\x98\x9c\x2e\x99\xf0\x89\x6f\xc3\x4b\xff\x74\x78\xf2\xe8\x52\xda\xb8\x9e\x50\x26\x4d\xd3\x8e\xfd\xcb\xf1\xc9\x64\x98\x54\x8e\x34\x8f\xc1\x66\x13\x9e\x65\x3c\x32\xb1\x48\x70\x4e\x47\x51\xf4\xf5\x95\x9f\xa8\x26\x0b\x4a\x5f\x7d\xf0\xaf\xf2\xfb\x1e\xe1\x99\xf9\xe1\xb1\x4d\xf7\x11\xaa\x7d\x03\x97\x34\x8b\xf6\x7b\x43\x89\xed\x53\xdf\x1e\x3e\x7d\xf4\x61\xf8\x94\xae\xea\x82\x94\xcd\xab\xf1\xd3\x09\xc4\x94\x50\x60\x81\x5a\x61\xa1\x73\x5c\xd1\x39\xfb\xfb\xd1\x06\x0c\x95\xc2\x1f\x44\xe1\x8d\xd8\xbb\x84\x67\xe6\xa0\x48\xd4\x8c\xa6\x67\x01\x09\x7c\xdf\xff\x95\x00\x2d\x58\x0a\xb4\x70\xb5\xe5\xb9\xdf\x72\x86\x2d\x87\xce\xa2\xe7\x3e\x2f\x9e\x99\xfa\xfc\x44\xe0\xf3\x7d\x87\xae\x57\x05\x58\xfd\x1c\x16\x7c\xbe\xef\xff\xa4\x78\x69\x88\xf6\xf7\x37\xaa\xc5\x33\x3f\xca\x51\x55\x5d\x82\x79\x6c\xdd\x4a\xe1\xb2\x59\x8a\xe4\x71\x46\x6e\x82\x6a\x85\x18\xa3\x84\xf2\x31\x1f\x41\x9c\xd9\x12\xe7\xc7\x3a\x87\xc5\xb3\x68\x7e\x9d\xe4\x73\x0f\xfd\x11\x8c\xab\x45\xdb\x4a\x9e\xf6\x44\xac\x8e\x8c\x61\xfa\xbe\x7f\x8e\xa5\xc5\x2f\x19\x72\x29\x22\xab\x26\x1e\xe5\x67\xce\x91\x75\xf2\xe0\x28\xd6\x1f\x37\x8f\xe3\x89\xc7\xd2\x23\x38\xf5\x13\x2a\x60\xe6\x0a\x7b\x26\x36\x3d\x09\x13\xc4\x36\x4f\x0f\xe4\x49\x26\x07\x9c\xca\x7c\x85\x63\x60\xb0\xe7\xfb\x53\xc5\xc4\x2c\xf1\x2b\xb9\x4f\x1e\x1c\xbe\x52\x71\x49\xd6\xeb\x84\x9f\x0d\xa4\x4c\xc0\xcb\x12\xa6\x23\xd9\x1e\xcf\xe4\x1b\xcc\x29\x3b\x52\x3e\x79\x70\xf8\xce\x44\x30\x82\xb1\xc2\xb4\xe2\x51\xb6\x3f\x0c\x7d\x33\xf0\x23\xc0\x1b\xad\xf4\x7c\x38\x0a\xbd\x80\x7d\xa5\x1b\xbf\x71\x3c\xf1\x53\xd1\x74\x3f\x55\x20\xa5\xcc\x32\x93\x8d\x2c\x43\xf6\x2d\x1d\x62\x71\x63\x1b\xc0\x14\xc6\x00\x40\xc2\xd6\xdf\xb7\x5b\x45\xd1\x92\xa4\xb9\xa2\x0c\x5f\x1e\x47\xbc\x94\xe2\x9d\xfc\xf0\x44\x5a\xf3\x9f\x3c\x38\x7c\xa1\x35\xe8\x5f\x06\x72\xfd\xdb\x7a\x26\x41\xcb\x5b\x79\x5e\xf5\x34\xe8\xe7\xdb\x0b\xd2\x5c\x59\x91\x8b\x2d\xa6\x8a\xd9\x91\xdc\x13\xba\xe9\x50\xd7\xdb\xd0\xc7\x42\x58\x0e\x7c\x45\xeb\x2e\x0d\x7e\xb3\xab\xa4\x6c\xf6\x85\x31\x7e\x3b\x8d\x97\xa8\xa2\x8d\xc7\xc0\x0a\x17\xcb\x38\xe1\xec\x2b\x81\x7b\x36\x18\x96\xa4\x80\x20\xe3\x84\x51\x71\x65\x16\x32\xbc\x0d\xa7\xec\xe2\x70\xae\xd0\x9d\xf2\x65\x3a\xa6\xb4\xc5\xf9\x0f\x6f\x8f\x14\xb6\x87\x2e\x4b\xa1\xfc\x67\xb4\x62\x04\xf7\x1e\x9b\x11\x8c\x18\xec\xb7\xe1\x69\x14\xe2\x73\x28\x06\xd5\x73\xca\x79\xa7\x16\x9d\x00\x66\x04\xa7\xcc\xe7\x02\x9c\x66\x5b\x10\x59\xa4\x97\x15\x69\x36\x4d\x5e\xe8\x98\x56\x20\xd2\x25\xa1\x70\x36\xb8\x02\x0c\xff\xfd\xfd\x74\xb2\x89\x73\x1b\x92\xa9\xec\x41\xd9\x02\x26\x60\x97\xda\xbf\xbf\x9f\x59\x51\x07\xf9\x19\xef\xb6\xe1\xb4\x99\xba\x8c\xd7\x7f\x57\x85\x61\xe1\x48\x22\x7f\x91\xcd\xa7\x02\xec\xc9\x83\xc3\xe7\x42\x17\x0d\xf1\x7e\x9e\x26\x99\xba\x0b\x3c\x99\x69\x8c\x27\x80\x66\xda\xbf\x55\xbb\x96\x5d\xed\x78\xbf\x65\x1e\xc2\xfc\x68\xbe\xbc\xf7\xa3\x03\xe1\xbb\xd9\xb4\x7b\xe6\x5f\xe3\xfa\x09\x7a\xa8\x4c\xd0\xef\x7c\xac\x4c\x56\xa1\x77\x8f\x85\x5e\x2b\x94\x49\x47\x8b\xec\xca\x75\x20\x9e\x42\x39\x78\xa1\x6a\x91\xab\x32\xc3\x60\xbd\x0e\x34\x93\x5f\x3b\x7b\x35\x37\xbd\xf7\x4a\x37\xbd\x33\x2c\x6b\xee\x73\x53\xb8\x35\x06\xc6\x47\x8b\x9c\x72\xea\x59\x8f\x72\x97\x88\x76\x92\xc2\x79\x20\xc9\x6b\x1f\xaa\x57\x27\xe5\x55\x22\x7e\x53\x46\x0a\x16\xec\x2e\x11\x51\xca\xd3\xb1\xcd\xce\x43\xa9\x10\xbb\x0b\xeb\x3b\x54\x6c\x18\x67\xbb\x14\xf8\x4e\x65\x90\xcf\xef\xfd\x68\x8c\x9d\x08\x22\xba\x98\x70\xca\x83\x04\xc0\x04\x33\x07\x6c\xbe\xef\x5f\x63\xee\xa9\x92\x2b\xc9\x98\x3f\xca\xdc\x28\xea\xd9\x1e\xcd\x90\xdb\x00\xbc\x31\x41\x81\x54\x81\x87\xf2\xa3\xdc\xc3\x67\xcd\x26\x7d\x3d\x97\x05\xce\x4d\xa4\x6c\xc4\x91\xa2\x01\xe1\x86\x79\x0f\x4a\xe9\x72\x18\x78\xea\x3b\x9a\xaa\x51\x43\x05\x98\xed\x1d\xab\x26\x71\x66\x99\xbd\x8f\x85\xda\x87\x5d\x0b\x22\x71\x32\xe1\x7e\x01\x19\xf4\x8f\xa6\xbc\xa7\x7b\xae\x1e\xb3\x6a\x2c\x29\xef\xa1\xf7\xd9\x20\x0f\xcb\x64\xa2\xd0\x99\x15\xe2\x14\x25\xe4\x3b\x74\x16\x27\xec\x6a\x76\x8e\xd1\x3b\x1d\x46\xea\xf8\xa0\xfc\x00\xbd\x34\x3e\xec\xe9\x55\xc1\x74\x5e\x6b\x48\x5b\x1e\xed\x04\xe7\x04\x20\xba\x8b\xe1\xab\xac\x40\x5c\xfa\x16\x26\xe2\xef\xcc\x5c\x67\x26\x17\x80\x6c\x25\x61\x98\xe4\xb3\xe8\xc1\xb6\x05\x40\xba\xa7\x61\x8a\xac\x9c\x5a\x60\xe8\x57\xae\x99\x25\x19\x5e\x47\x74\x24\x73\x0b\xbc\xc4\x42\x51\xb3\x69\xd2\x3f\xfe\x51\x59\xbe\x4e\xac\x79\x81\x51\x02\x20\x0c\x59\xcd\x8a\x29\xca\xe1\xb3\x1a\x0b\x12\x2a\x6f\x00\xdf\xf7\x43\x90\xe5\xb4\x96\x26\xe6\xbb\x0d\x61\x7f\xc5\x8e\x7c\xb0\xc9\xd9\x30\xa0\xd2\xb8\x75\x61\x16\x2a\x1e\x06\xac\x10\x14\x1d\x18\xa9\xbd\x15\x14\x2c\x4f\x8f\xea\x49\x72\x81\xf9\x41\xa7\x5c\xc9\x40\x91\xc7\xf9\x8c\xc7\x2d\xb8\x5f\x12\x94\x4b\x02\xfc\x32\x24\xe6\x63\x94\x55\x55\xb5\x5c\x21\xe0\x26\x50\x49\x41\x9a\xc8\x30\x24\x15\x41\xf2\x8d\x29\x6e\xdc\xb2\x85\x2e\xef\x40\x18\xf8\x36\x8c\xe8\x92\x9e\xaf\xe6\x91\x58\xcd\x13\x3f\xaa\xac\xe6\xb1\x9f\x88\xd5\x9c\x6e\xec\xa4\xfa\x73\x24\x54\x4f\x5c\x51\x2b\x2e\x6a\xbc\x32\xf9\xfe\xb2\xf2\x52\x1a\x5e\x0f\xfb\xe1\x38\x98\x40\xcc\x17\xf6\x18\xc0\x20\x5f\xd4\x53\x70\x13\x59\xc8\x4c\xf3\x45\x3d\x62\x8b\x7a\xf0\x28\xcc\xb5\x9c\x79\x23\x71\xb3\xc9\xc0\x7c\x57\x10\xc5\x02\x00\x65\x6e\x3f\x50\x4d\x81\x0e\xdf\x6c\xb1\x61\xfb\xcc\x33\x10\xed\x5c\x84\x55\x25\xfc\x63\xa7\xc8\x84\x84\x68\xc9\x9c\x0d\x56\xd6\xe5\xd7\x15\x5b\xb4\xdc\xe9\xf4\x9e\x03\xf7\x6c\x88\xc1\x90\x30\x57\x94\x7e\xce\xcd\xa4\x69\x2e\x51\x51\x19\x92\x5c\xb3\x45\xfc\x24\xa7\xe3\x14\xe5\x57\x00\xea\x0d\x66\xca\x66\xb4\x87\x2f\xf2\x01\x38\x5a\x64\x76\xdd\xea\x2c\x7d\x5d\x31\x18\x2b\x78\xcc\xce\xe5\xb3\x8f\xb7\xc8\x67\x30\xa8\xec\x96\x98\x6c\xe6\xec\x22\x9b\x89\xd3\x46\x29\x9e\x31\xbf\x67\xaa\x78\x16\x16\xc5\xb3\x00\x26\xd9\xae\x9c\x2e\xba\x7b\xbe\x9f\x8c\xed\x49\xf6\xe8\x4c\x94\x25\x98\x1f\x46\x99\x49\xa6\x7b\x00\xd6\x59\x18\x45\xfc\x58\x99\x4d\x69\xe9\xe5\x85\xcf\x6f\x3f\xc9\x8c\xfc\x18\xca\x1a\x49\x4e\x68\x87\xb6\xca\x25\xa2\x49\x52\x93\xf4\x25\x7b\xb8\xaf\x26\xd5\xe8\x28\xdf\x2d\xea\x33\xc4\x28\x69\x2e\x41\x68\x95\x1a\x92\x7d\xe5\x07\x37\xdc\xbb\x63\x46\x62\x21\x28\x48\x52\xd0\x06\xd0\x0c\xfc\xbd\x84\x0b\x25\x5a\x69\x08\x28\x5c\xe4\x99\x8f\x94\x85\x22\x82\x31\x4c\x7d\xc4\xe6\x25\x92\x0e\xa6\xec\x61\xf4\x28\x2c\x28\x9a\x80\x19\x67\x75\xa6\x63\xbc\x1f\x4d\x20\x81\x11\x00\x3e\x97\xb5\xcc\x38\xaf\x73\x1c\x4d\x00\x0c\xd6\x6b\x81\x53\x0c\xd6\xeb\x58\xc5\x89\xa5\xc7\x4c\xec\x1b\x21\xff\x1a\x33\xf9\xed\x9a\x5d\xa2\xdf\x97\x3b\xe5\x78\x14\x7b\x86\x01\xf6\xc3\x71\xb4\xef\x4c\x94\x85\x69\x1c\x4d\xfc\x78\x13\x34\x9b\x7b\x89\x90\xf0\xfe\x50\x65\xa7\xaa\x11\x3a\x02\x37\x5c\xc4\x1c\x15\x48\xaa\xe2\x19\x45\xce\x19\x41\xb8\x32\x5f\xd1\xb1\x8a\xcc\x24\x4e\x9a\xd0\x08\x79\xd2\x87\x11\x9b\xe0\x27\xf8\xbe\xee\x9d\x6a\xbd\x36\x01\xce\x0e\xda\xda\x5b\xa4\xda\xa6\xab\x6d\x19\x67\xe8\x4f\x7c\xd1\x25\x52\x4a\x95\x16\x0f\x1f\x31\x80\x97\x58\xab\x6e\x85\xcf\xfe\x92\xb6\x75\x76\x6f\x1b\xe2\xc4\x5d\x1e\xd9\x9a\x11\xbb\xc4\xa5\x91\xad\xa7\x00\xb5\x37\x5e\xdc\xa1\xd5\x28\xf7\xa3\xc3\x44\x09\x4d\xf3\xe3\x62\x38\x85\xac\x80\x68\x7d\x17\xc6\xba\x90\x0a\xdb\x78\x97\x76\xe5\xdd\x7d\x4f\x46\xe5\x4e\xe4\xe7\x5b\xe6\x9c\xaf\x60\x68\x83\xf2\x96\xf8\x1a\x03\xce\x4e\xe4\xc2\x9b\x89\x59\xa1\x20\xa9\x66\x33\xd9\xe3\x1b\x3a\xba\x84\x2f\xc9\x2a\xa1\x63\x94\xc8\x67\xfa\x39\xc6\x53\xfe\x8d\x3e\xd0\x0f\xcb\x20\x4d\xc3\x0b\xfe\x4d\x3c\xc3\xc0\xcf\xb8\x42\x22\x76\x88\x21\x18\xca\x5b\x4b\xc5\x31\x7c\x7a\x81\x30\x39\x0e\x53\x82\x30\x4a\x94\x21\x67\x0d\x49\x00\x0c\x4a\xa5\x82\xd9\x6c\x6b\x11\x54\xda\x36\x48\xe6\x32\x0f\xf0\x2c\xe2\xb5\x6d\xbb\xbc\xac\xf3\x13\x2b\xc1\x8d\x72\x79\x9d\x91\x81\xec\xf8\xec\x22\xbe\x14\x2b\xa4\xf4\xa8\x97\xff\xe7\x71\x5a\xb8\x29\x8b\x47\xb8\x40\xdc\x99\x03\x28\x56\x93\x82\xb7\x59\xa4\xee\xe3\xad\x02\x49\x45\x18\x29\x89\x18\x8c\x64\x7b\xf5\xaa\xa2\x17\x52\xfe\x90\x32\x47\xb2\xab\x46\xe7\xf3\xd6\xf2\x8c\x76\x15\x8e\x7c\x85\xfd\x07\xec\x72\xed\x33\xb2\x88\x4a\xce\x1d\x84\xed\xff\x15\x5e\xaf\xaf\xb0\x79\x84\xe1\x7b\xac\x58\x57\x3d\x27\x4a\x49\x9d\x55\xd5\x73\x32\x7a\x4e\xbc\x6a\x1e\xc5\x9a\xca\x55\xac\xa9\x3e\x60\xf8\x14\xc3\xe7\xd8\xd7\x5e\x2f\xa3\x7c\xc0\xcf\x4f\x58\x39\x66\xca\x65\x38\x7e\x9b\x96\x6f\xce\x55\x24\x92\x51\xe2\x11\xb6\xb9\x63\x7b\xd5\xd7\x41\x42\x1e\x14\x84\x05\xc9\x8c\xfc\xfc\x54\x60\x67\xe0\xe1\x28\xe4\x4e\x2c\x54\xe8\x7e\x24\x35\xc2\xa4\xa8\x32\xa0\x1b\x20\x18\x03\x18\x4b\x27\x1d\xb9\x51\xc3\xcd\x26\xd3\xc3\x46\x42\xbd\x09\x60\xb4\x81\xef\xbe\xf6\x9a\xc2\x5b\x96\x99\xda\x31\x67\x8c\x87\xcc\x56\x8b\x6e\xee\x9f\xc4\x92\x64\x75\x8b\xce\xee\xd7\xd9\x61\xe2\x6b\x3c\x23\x56\x8a\x93\x92\x63\xc4\xb2\xc2\x12\x65\xb3\xbf\x80\x36\xa8\x1d\x1f\x44\x77\xc3\x85\x54\x3f\x51\xce\xf8\x01\x4c\xee\x74\x31\x42\x40\x32\x41\x16\xa5\xa7\x74\x2f\xa5\x80\x96\xaa\xb9\xe5\xc5\x55\x55\x2e\xac\x76\x88\x44\xa1\xd4\x0d\x0a\xbb\x7d\x12\xfb\xcf\xb1\xbc\xae\x9e\xdf\x1f\x87\x9a\x3e\xf9\x8c\x0b\xeb\x9f\xe7\xbc\xb2\xb2\x57\x7d\x12\x57\xf6\xaa\xea\xce\xd2\xdc\xb3\xc1\xe7\xdd\x0a\xaf\xe2\xa7\x2f\x7e\x0f\x28\x3a\xaa\x23\x0b\x3c\xd3\x5c\x20\xc9\x78\xf0\x39\x96\x0b\xc6\x6f\x04\x0c\xdf\xe1\xa2\x09\xec\x3b\xcc\x39\x83\x50\x6e\x31\x9f\x5f\x12\x9d\x0f\xd8\xe7\x5e\xb2\xdf\x51\xac\xf2\x4c\xcf\xae\x67\x49\x40\x90\x60\xc2\x2a\xa6\x1f\xf0\x7a\xfd\x41\x38\xdb\xc8\x8b\xc2\x9b\xe3\xac\xac\xf7\x0e\x6f\x38\x83\x78\x55\x03\x5d\xcf\xe3\x5f\xe1\xf5\xfa\x15\x36\xcb\x90\x14\x5b\xda\x1a\x70\x5a\x73\x5a\x3c\x7a\x8a\xbd\xad\xd9\x95\x35\xa0\x6d\xb9\x96\x2b\xd6\x80\xd7\xd8\xff\x9e\x98\x74\xda\x22\x3f\x35\xc7\xdf\xfc\x63\x3a\x0f\x92\x14\x91\x86\xf1\xf3\xbb\xef\x5b\x03\x63\xe8\x51\x0e\x05\xbd\x24\x8e\xc9\x4d\xab\xf5\xfb\xca\x6e\x9f\x76\x5c\xef\x22\x48\xcc\x56\x6b\x3a\x4b\x5b\xbc\xd2\x56\x14\x5c\xc7\x2b\xd2\x4a\x97\xc1\x14\xb5\xae\x52\xd8\x98\x06\xd1\xd4\xec\x34\x1e\x36\x2a\x59\x4f\x83\x14\xc1\x86\x6b\x83\xc6\xb7\x0d\x27\x41\x0b\x00\x86\x12\x70\xfb\x16\xc0\xe9\x42\x00\xee\xdd\x11\x70\xe7\x16\xc0\x8b\x99\x00\xec\xb8\x77\x84\xdc\xbd\x05\x72\x74\x2e\x20\xbb\x77\xed\x8c\xde\x6d\xbd\x1c\xc9\x5e\x1e\xec\x06\x79\x33\xa6\xc9\x1c\xc6\xff\xf8\xc6\x65\x12\x2c\x3d\x1c\x63\x64\x4c\x6e\xce\x22\x74\xd5\x12\x1f\xe8\x9f\x3d\x7e\xc4\x1b\x60\xa2\x16\xfa\xd6\x37\x82\x28\x3c\xc7\x5e\x4a\x12\x44\xa6\x73\x59\xf0\x3c\x89\x2f\x3d\xe7\xb6\x32\xf3\x24\xc4\x1f\x65\x11\xfe\xa6\x16\x1a\xe6\xa0\x6c\x3d\xa8\xff\xf1\xe7\x71\x12\x7e\x8a\x31\x09\xa2\xc9\xcd\x2c\x4c\x97\x51\x70\xed\xd1\x62\xbc\xec\x8c\xdb\x43\xc4\xd8\x4b\xe2\xcb\x61\xde\x24\xfa\x33\xfc\x63\x95\x92\xf0\xec\xba\x15\x12\xb4\x48\x3d\x8e\x03\x09\x12\x32\x64\xd8\x55\x3f\x5f\x86\x33\x32\xf7\x1c\xdb\xfe\xff\x86\x8b\x20\x39\x0f\xb1\x67\x0f\x17\x21\x6e\xcd\x51\x78\x3e\x27\x9e\x5d\x8b\xd8\xe3\xba\x04\xb8\x5b\x89\x0b\x94\x90\x70\x7a\x7b\x7e\x82\xae\xc8\xe4\x86\xa3\x19\xf2\x8b\x77\x3b\x74\x9b\x6e\x64\x48\xbc\x34\x26\x37\xfa\x7e\xb8\x13\xa0\x08\x9d\x11\x63\x72\x23\xbb\x5a\xd8\x1d\x7c\x2e\xb4\x84\x76\x74\x1d\x38\x84\x67\x77\x02\x26\x7b\xb5\x35\x45\x98\xa0\xa4\xd4\x5e\xfe\x51\x90\x82\xac\x87\x7f\xbc\x53\x2d\x79\x72\x5e\x4f\x19\xfd\xcf\x00\x7b\x57\x9c\x87\x5f\x54\x67\x9c\xcc\x50\xe2\x89\xbb\x38\x72\xbe\x16\xe6\x56\x4b\x24\x7e\x6e\xdf\xe4\xec\xa3\x8c\xa8\x48\x51\x78\x81\xf3\xc5\x95\x3c\xfe\xf6\xe6\x73\xc1\xe5\x88\xaa\x3d\x2f\x91\x2c\x76\xfd\x97\xa2\x7e\x57\x7c\x1f\x6f\xa3\x94\x9d\x78\xcd\xad\x93\x23\x45\xd1\xd9\x6d\xb4\x73\x8f\x68\xe8\x66\x0f\xe7\xbd\x2d\xca\x59\xbc\x60\x45\x62\x65\xbd\x10\x49\x8c\x4d\x94\xd2\xee\x86\xad\xca\xff\x58\x93\x77\x60\x58\x5a\x40\x92\x63\xd5\x23\x7d\x37\x78\x82\x9f\xee\xdc\xd0\x6c\xe9\xb8\x51\x56\xaf\x6d\xeb\xe4\x34\x8e\x56\x0b\x5c\xb3\x04\xd6\xc0\x86\xfa\xcf\xf5\x1d\xbb\xeb\x72\xb0\x15\x94\xe8\x8a\x3b\x61\xba\x6d\x88\x2a\x80\x2a\x0b\xca\x56\x30\xd5\x19\xb3\x0b\xcb\xdd\x0a\x52\x47\xfd\x55\x7e\x7f\x07\x80\xdb\x56\x8d\x2f\xc0\xf6\x96\xe5\x81\x93\x94\x7e\x85\xd8\xb5\xfd\x5b\xd9\xee\x1d\x40\x6e\x67\xdf\x35\x6b\xcf\xe7\xc0\xdf\xc6\xb2\x33\x08\x77\xe0\x94\xdb\xcb\x54\x89\x4f\x70\x08\x12\x2f\x19\x7f\x90\xac\xf1\x34\x26\x24\x5e\xb0\x4f\x5f\x1b\xa7\x7a\xea\xad\x5d\x44\xb6\x03\xe4\xbc\xa3\xda\x90\x5b\x79\xdf\x9d\x38\xf3\x5d\x60\xd4\x71\xe3\x22\x8c\xf3\x24\x9c\xe5\x9b\x13\xfa\x36\x2c\x12\x5f\xbe\xe7\xc8\x09\x8f\x7e\xa3\x59\x5b\xd2\xd2\xbd\xc5\xa7\x51\xea\x25\x68\x89\x02\x62\xd6\xed\x04\x59\xa1\x69\x1c\xa5\xd0\x71\x01\x74\xce\x12\xa0\x6c\x5c\x34\x88\x15\xda\x95\xc4\x97\xe9\xe4\xa6\x58\x2f\xfd\x26\x2b\x75\x5c\x48\xdb\x07\x34\x70\x1e\x97\x01\x15\x46\x5b\x3b\x93\xaa\xf5\x6b\x96\xdf\x42\x97\xec\x58\xbe\x6e\x9f\x50\xe1\xe8\xb5\x10\x6a\xf6\x2d\x77\x41\x62\xab\x74\xfb\x19\x7c\xa7\xb6\xa2\xcf\x11\x49\xbf\x06\x1e\xf7\xb4\xa1\xda\xa5\x43\x2b\x6b\xec\x9d\x97\xb2\xda\x5a\x3e\x7b\x67\x75\x67\x14\x0c\xc9\x12\xd2\x69\x82\x10\x5d\x20\x83\x19\x4a\x5a\x31\x8e\xae\x8d\xc9\xcd\x32\x4e\x43\xb6\x7c\x06\xa7\x69\x1c\xad\x08\x52\xe4\xdc\x69\x14\x2e\x3d\xba\xbc\x9a\xce\xf2\x0a\x2a\xff\x01\x4b\x6a\x2d\x03\xa6\x01\x48\x11\x31\xbb\xf6\xff\x07\x86\xcb\x60\x36\x0b\xf1\xb9\x67\x0f\x4f\xf9\x5a\x6d\x0f\x85\xd2\xc2\x59\x5e\x49\xf6\xb0\xbc\x1a\xc6\x17\x28\x39\x8b\xe2\x4b\x6f\xce\x62\x75\x0c\x2f\xe7\x21\x41\x5c\xb7\x24\xb4\x40\x43\xba\xa0\xd8\x43\xc6\x2d\xed\x4c\x90\x3c\x8d\xe2\xe9\xc7\x5a\x65\xcf\x79\xae\x54\xa2\x8f\xb6\x26\xf9\x2a\x15\x89\x9c\xab\x09\x9d\x22\xd0\xe4\x4c\x17\x9a\x9c\x6d\x5d\xce\xc5\x4c\x93\xb3\xa3\xcb\x19\x9d\x6b\x72\x76\xcb\xca\xb1\xac\x11\x59\x6f\xd6\x2d\x3c\x86\x68\x90\xcc\x58\x6c\xd4\x96\x52\xac\x71\xba\x52\xed\x6d\xa5\x58\x43\x75\xa5\x3a\xf5\xa5\x16\xbc\x94\xd0\x63\xed\x58\x48\xf4\x94\xae\xaa\xee\x96\x52\xad\xeb\x42\x77\x30\x99\xa4\xae\x4b\x24\xa9\xca\xf5\x7d\xd7\xae\x6b\x5d\x15\x3a\x8f\x2f\xe7\x75\x3d\x98\x55\xc2\x57\xec\x5d\x3b\xba\x75\x5d\xac\xa3\xdc\x0e\x6d\x15\x9a\x76\x6c\xad\xe3\xaa\x30\x9c\xd5\x76\x74\x76\x6b\xc7\xb6\x51\x6c\x5d\x17\xeb\x28\xb7\x43\x5b\x85\xa6\x1d\x5b\xeb\xb8\x2a\xd0\x4a\xb5\x1d\xdd\xdd\xda\xb1\x95\xae\xa2\x3b\xf4\x55\xa5\x30\x29\x22\x58\xee\x84\xad\x15\x9f\x16\xcb\x6a\xfa\xa6\x50\xfc\x1f\x0b\x34\x0b\x83\x86\xb9\x08\x71\x8b\x33\xdb\x83\x03\x77\x79\x05\x6e\x2a\xac\xe8\x1f\x8b\xd9\xae\xdc\x28\xcb\x7a\xc7\xe9\xb8\xa0\x05\xaf\x22\xfd\xe4\xef\xa9\xe5\x8a\x05\xcf\xc2\xa8\xa0\x45\x50\x32\x7e\x0b\xbd\xe0\x8c\xa0\x04\x7a\xa7\xec\x80\xf7\xe6\x34\xbe\x6a\xa5\xe1\x27\x8a\x15\x5f\x70\x5a\xa7\xf1\xd5\x97\x6b\xed\x3c\x2f\x8d\x62\x42\xd0\xcc\xfc\x16\xd4\xea\x91\xb6\xef\xca\xea\x41\xec\xb8\xad\x53\x01\xec\xb0\xc3\x6b\xe4\xf9\xb7\x09\x1b\x75\xb8\xdc\x52\xbc\x22\x71\x81\xcf\xdf\xf7\x7d\x5d\x4c\x35\xb2\x1b\xd8\x79\x37\x78\x0b\x6c\xb6\x5b\x00\x9f\xb3\x31\xbc\x05\x30\x07\xa5\xe9\xd5\x2f\x05\x2c\xf6\x27\x60\xd7\xcd\xe7\x2d\xe0\xf8\x66\xa5\x6e\x64\xee\xb6\x73\xad\xf2\xaa\x6e\xbf\x57\xe2\x55\x3b\x63\xf6\x8f\xab\xf4\x0b\x09\x87\x42\xf8\xeb\xa8\xfc\x7e\xf0\xfd\x8a\xb4\x4e\xc1\x7f\x2d\x72\xa7\xb0\xbf\x16\xc5\x53\xd8\xf7\x4b\xf4\x14\xa2\xa0\x7b\x0d\x15\x6b\xc8\xb8\xdf\x1b\x7c\x36\x19\xa7\x8b\x2f\x25\x8b\x74\xf1\x57\x92\xf1\xbd\xe0\xfb\x35\xc9\x38\x5d\x7c\x3d\x32\x4e\x17\x5f\x8f\x8c\xd3\xc5\x7d\x93\x71\xba\xb8\x1b\x19\x57\x25\xc7\xdd\xeb\x5a\xcc\xbe\x94\x2c\x16\xb3\xbf\x92\x8c\xef\x05\xdf\xaf\x49\xc6\x8b\xd9\xd7\x23\xe3\xc5\xec\xeb\x91\xf1\x62\x76\xdf\x64\x4c\x37\x23\x77\x21\x63\xc7\xb5\xed\xcf\xa6\xe3\xe8\xfc\x4b\xe9\x22\x3a\xff\x2b\xe9\xf8\x5e\xf0\xfd\x9a\x74\x1c\x9d\x7f\x3d\x3a\x8e\xce\xbf\x1e\x1d\x47\xe7\xf7\x4d\xc7\xd1\xf9\x1d\xe9\xb8\xd3\xf9\x7c\x3a\xbe\x8a\xbe\x58\xda\x8c\xfe\x52\xe9\xf8\x3e\xf0\xfd\xaa\xd2\x71\xf4\x15\xa5\xe3\xe8\x2b\x4a\xc7\xd1\xbd\x4b\xc7\xd1\x36\x3a\xae\xd3\x9d\x7c\x9e\x0e\x60\x77\x00\x1a\x5a\xdd\xdd\xac\xe8\x6b\x23\xa7\x25\xcc\x7b\x36\x36\xda\x4d\x93\x71\x37\xbb\xa3\x9d\x95\x18\x65\xb0\xdb\x0c\x26\x3f\x57\x81\xf1\xe5\x7d\x50\x4b\xb6\x5b\x15\xaa\x3a\x25\xc5\xce\x75\x6e\xd9\xf6\xdf\x09\xc6\x57\x24\xef\xfb\x42\xf1\xdf\x4f\xe4\x8a\x0a\xe3\x3e\xe9\xbc\xa8\xbd\xb8\x3f\x52\xdf\xaa\xb9\xb8\x97\xce\xd8\x85\xe0\x77\xd4\x67\xec\x5e\x6f\xbd\x86\xe0\x4e\x30\xbe\x26\xc5\xdf\x13\x8a\x7f\x03\x8a\xcf\xb5\x1d\xf7\x4a\xf1\x05\x45\xc7\x3d\x52\xfc\x36\x25\xc7\xbd\x74\xc6\x67\x52\xbc\x4e\xf5\xb1\x7b\xbd\xf5\xca\x84\x3b\xc1\xf8\x9a\x14\x7f\x4f\x28\xfe\x0d\x28\x3e\x57\x8c\xdc\x2b\xc5\x17\x74\x22\xf7\x48\xf1\xdb\xf4\x21\xf7\xd2\x19\x9f\x49\xf1\x5a\x2d\xc9\xee\x15\xd7\xeb\x1d\xee\x04\xe3\x6b\x92\xfc\x3d\xa1\xf8\x37\x20\xf9\x5c\x87\x72\xaf\x24\x5f\x50\x9f\xdc\x23\xc9\x6f\x53\x9d\xdc\x4b\x67\x7c\x2e\xc9\xeb\x14\x2a\x77\x90\xa7\x6a\x55\x14\x77\x82\xf1\x55\x25\xf9\xfb\x41\xf1\x6f\x40\xf2\xb9\xba\xe5\x7e\x25\xf9\xe8\x2b\x49\xf2\x5b\xb4\x2c\xf7\xd2\x19\x3b\x91\x3c\x2b\xcb\x6f\x6a\x9e\xc5\x98\xb4\xce\x82\x45\x18\x5d\x57\x2f\xf6\x92\xeb\x65\x7c\x9e\x04\xcb\xf9\x75\x4b\xc9\x07\x1b\xc6\x51\x14\x24\x21\xb9\x6e\x1c\x85\xe4\xda\x80\x0d\xe3\xf0\x02\xe1\x30\x69\xbc\x64\x11\x6a\x1b\x69\x80\xd3\x56\x8a\x92\xf0\x0c\x0c\x15\x2d\x95\x5d\x52\x02\xda\x0a\x1e\x85\x06\x33\xbb\x58\x4f\xd8\xf3\x6c\xcf\xc3\x8d\x7d\xea\x32\x29\x3d\x77\x0b\xb8\x42\xce\xed\x40\x33\xf5\xd7\x2d\x20\x95\x7c\xc2\x24\x49\x9a\xaa\xe2\x18\xa3\xbc\xed\xdf\xfa\xe2\xfb\x04\x2a\xdf\x52\x7e\x71\xa5\xf0\x8d\x05\xfd\xd9\x7d\xc8\xe6\xdc\x96\xf7\x73\x47\x6e\x1a\x47\x71\xb2\xb5\x02\x96\xa3\xd5\xb1\x6d\x58\xc9\xc5\x93\x32\x3f\xef\x61\x8c\x5b\x07\xb6\x0d\xff\xcb\x75\xda\xed\xf6\xa9\xbc\xf4\xcd\x9b\x75\x1a\xcf\x8a\x6d\x5f\xa0\x34\x0d\xce\x51\xb9\x3f\x62\x3c\x0b\x92\xeb\xc9\xcd\xae\x88\x75\xeb\x11\x3b\x8d\x82\xe9\x47\xf8\x5f\xb6\x6d\x17\x51\x09\x71\x14\x62\x24\x4d\xcc\x4a\xdc\x4b\x0e\x1f\xcf\xd4\xd2\x1a\x1c\x17\x07\x94\x0f\x55\x1a\x7e\x42\x5b\xd1\x15\xd9\x5b\x59\x6e\xc8\x2f\xd0\xdb\xb5\x17\xe8\x0b\x37\xf3\x59\xb1\x4b\xa4\xd8\x2d\xee\x50\x0d\xcf\x0f\x3b\xb6\x0d\x86\xac\x39\xf3\xdd\x01\x28\xf9\xa1\x63\x39\x68\x01\x86\x11\x22\x04\x25\xcc\x4c\x3b\xb7\x03\xbc\x05\x4a\xa1\x08\x6c\x59\xb6\xe3\x76\xd1\x02\xe8\x3a\x32\x9b\x42\xd2\x96\xdd\x30\x8a\x86\xdf\xd2\x96\xdc\x16\x96\xe4\x65\x5e\xc3\x3a\xd4\xac\x5e\x58\x51\xf0\x22\xf1\xb2\x75\x1e\x2c\x65\xc3\x2c\xa7\xd3\xa7\xe8\x34\xf6\xb9\x3b\x83\xad\x65\xeb\x7b\xa6\xd1\x6a\xd0\x3f\x0f\x1b\x2e\x00\xdf\xb6\x1c\x0a\xce\xb2\xdb\xfd\xda\x76\x32\x96\x72\xf7\x66\x52\xfe\x2a\xda\x68\x3a\x68\xd1\x68\x55\x09\x67\x87\xa6\x6e\x2f\x15\xa4\x53\xe6\x03\x25\x2f\xd6\xb7\xdb\xb7\x17\xbb\xca\xf2\x77\x1d\xda\xee\x7b\xef\xd1\x56\xc3\xb2\x3b\x9d\x52\x8f\xaa\xbc\xf2\xd6\x09\xc8\x32\x97\xa7\xdf\x16\xcf\x18\x9f\x35\xfd\x94\x4a\x3e\x67\xf2\xf1\xe2\xa5\xee\xe8\xf5\x7a\xfd\x3b\x4e\x3f\x01\xa7\x32\xf9\xec\x41\xbb\xdd\xd6\x76\xe2\xdf\x7d\xf2\x6d\xeb\x99\xdd\xa6\x9f\x6c\xe7\x7f\x26\xdf\x67\xf4\xa8\x76\xfa\x49\xf1\x65\xc7\x09\x28\xb2\x57\xa6\xe0\x3d\xaf\x80\x85\x6a\x3e\x67\x12\x4a\x00\xc5\xae\x71\xef\x38\x05\x33\x28\xd5\x15\xb0\xa6\x1b\xff\xee\x53\xb0\xbe\x5f\x76\x9b\x80\x79\x3b\xff\x33\x05\xef\xdc\xa3\xda\x09\xc8\x84\xea\x9b\x5d\x27\x06\xcd\x5d\x9d\x15\xbb\xcd\xdd\xbc\x6c\x3e\x71\x9d\x1d\xd7\xce\x3b\x4c\x1a\x56\x8d\x66\xc6\x74\xdc\x41\x8f\xcd\xbf\x1d\xa7\x30\x87\x53\xe8\xd5\x8e\x3b\xe8\x96\x29\x92\xf5\xdf\xdf\x7d\xda\x6d\x69\x8b\x6e\xde\x95\xb9\x8b\x68\xe3\x7f\xa6\xdc\xdd\x7b\x53\x3b\xe7\xe4\xbe\x75\xc7\x45\x4f\x64\xaf\xcc\x9d\x7a\x2f\x72\x9f\xb5\xe8\x15\xaa\x11\xd3\x5b\xec\x2f\x77\x5c\x5e\x77\x9d\x5a\xb2\xa6\x12\xcf\xea\xde\x71\x79\xcc\xc0\xec\xb0\x41\x94\x5d\xfe\x77\x9f\xa9\x5b\xba\x66\xb7\x15\x32\x6f\xe8\x7f\xa6\xeb\xdd\xbb\xb4\x4e\x46\x95\x2a\xa5\x9d\xa5\x54\x5e\xa0\x32\x65\xdb\xf7\x2e\xa7\xaa\x15\x7d\xa6\xa4\x2a\x40\x94\xfa\xa7\x6d\xf7\xef\xba\x65\x54\x60\x55\xb7\x8d\xfd\xde\x81\x5b\xdb\xb1\x7f\xf7\x69\x79\x5b\x2f\xed\x2c\xbd\x66\xed\xfd\xcf\xec\xfc\xcc\x9e\xd5\x4c\xd1\xff\xf1\xa3\x10\x7f\xdc\x45\xe1\x4b\xf3\x71\xd5\x6e\xbd\xc6\x77\x85\x5a\x03\xdb\x86\xff\x65\xdb\x3d\x7b\x10\x00\xf5\xee\x37\xad\xac\x35\x43\xd3\x38\x61\x11\x26\xbd\x15\xed\x26\x8a\xb7\x92\x47\x9d\x78\x21\x9e\xa3\x24\x24\xaa\x97\xd0\x8c\x81\x54\xd2\x2a\xed\xf1\xe6\xf1\x05\xa3\x91\xdd\x5b\xd5\x62\x45\xb6\xb6\xed\x80\xb7\xad\x73\xda\x3b\x05\x95\x9b\xd7\x6a\xed\x17\x61\x1a\x12\x34\xf3\x70\x4c\x4c\x25\x31\x25\x01\x09\xa7\x13\x70\x37\xbc\x04\xb0\x3a\xcc\xa2\xe0\x82\x93\x5c\x8f\x62\xd7\x3e\xed\xd8\x53\xf4\x45\xd8\x7d\x4e\xdf\x09\x90\xdb\xfb\x30\xc3\xb4\xcf\x8e\x29\x3a\xee\xc1\xd4\xad\x62\x3a\x0b\x2f\xc2\x19\x4a\x72\x4f\x4a\x85\x59\x9d\x83\x0e\xa2\x30\x48\x5b\xf1\xe9\x1f\x68\x4a\x5a\xe2\xfa\x39\x9b\xf1\x2d\xc7\xb6\xc5\x9a\xb1\xdb\x92\x51\x76\x87\xc2\xae\xb5\xcf\x83\x59\x7c\x79\x4b\x75\x5b\x67\x43\xe1\x60\xc6\xa5\x2d\x9e\x9e\xce\x3a\xb3\x01\x00\x0d\x9b\xfd\xfb\x0a\x4d\x69\x30\x67\x30\xc5\x11\x3f\x9f\x93\xdd\x37\xa9\x4a\xbe\x16\x2b\x0a\xdb\xb6\x5d\x47\x4c\xe8\x8c\x4c\x6e\xd8\xbc\xce\x4d\x7a\xf5\x59\x13\x8e\x85\x92\x97\x7d\xd1\x67\xe6\xc7\xdc\x85\xdc\xfc\x53\x0d\x1a\x73\x94\x3b\x47\xb0\xec\xee\xf2\xaa\x61\x97\xd3\x75\x6b\xa4\xb2\x2a\xb4\x2c\xc7\xed\xa0\x45\xcd\x3a\x52\x05\x56\x59\x80\x8a\x0b\x6a\xcb\x72\x5d\x67\x07\x70\xdf\xfa\x73\xb7\x70\x00\x37\x6f\xff\x65\x27\x8f\x39\x33\x75\xac\x4e\x82\x16\x05\xb9\xc9\xb5\x6d\x71\x34\xf9\x5f\xed\x76\xbb\xc0\x96\x1d\xab\xef\x74\xda\x68\x51\x96\x6d\xe8\xce\xa1\xcf\x36\x72\xa5\xf6\xfd\x1d\xc4\x13\x89\xf4\x6e\xa2\x06\x43\xfa\xff\x92\x8c\x51\xdb\x3d\x5a\x91\x3e\x23\x52\x41\x3d\x94\xf3\x94\x48\xc4\x3e\xb0\x0f\xf4\x24\xd2\xee\xb5\x7b\x25\x12\x69\xff\x4d\x48\x84\x23\xbd\x23\x89\xb4\xff\xcf\x91\x48\x4d\xf7\xe4\x24\xc2\xc2\x05\xdc\x04\x51\x24\x7d\x92\x97\xfa\x83\x8a\x08\xa7\x61\x14\x92\x6b\x29\xbf\x0d\xbf\xb6\x61\x0c\x1d\x9b\x20\xc4\x1e\x37\x17\x19\x6a\xdd\xd5\x28\x02\x66\xeb\x12\x9d\x7e\x0c\x49\x2b\x58\x2e\x51\x90\x04\x98\x79\x43\x53\x05\xd4\xad\x1e\x70\xaa\x42\x69\x1a\xc5\xe4\xab\x1b\xff\xc8\x4e\x16\x74\x98\x2a\xf5\x17\x7d\xd8\x28\x78\xc8\xfe\xaf\x62\x5f\x28\xe3\x79\xcb\x28\x98\xa2\x79\x1c\xcd\x76\x92\x07\xb9\xdc\xe3\xee\x68\xab\xc2\xc4\xd5\xce\x59\xcf\xe9\x1d\x00\x41\x3d\xe6\xf8\x24\x4c\x5b\x01\x9e\xce\xe3\x64\x02\xa0\xf8\x96\xc4\x11\xf2\x4f\x57\x84\xc4\x98\x8a\xce\xab\x24\x8d\x13\x6f\x19\x87\x25\x91\x40\x03\xa1\x51\x70\x03\xa4\x03\x57\xc8\x71\x2b\x6c\xb5\xe8\x78\x16\xa6\xc1\x69\x84\x66\x39\x4e\x38\xa6\xf2\x4a\x14\x5f\xa2\xd9\xce\x65\xb5\x08\x68\x01\x0d\x05\x5a\x2d\x74\x41\xc7\x99\x5b\x38\x09\xe0\x5c\x70\x9d\x00\x28\x9f\x0a\x76\x50\x55\x64\x78\xae\x6f\xfd\xb3\x20\x4a\xd1\x04\xdc\xd4\x39\xf8\x93\x7d\x7a\x16\x4f\x57\x29\x43\xd7\x0a\xf1\x72\x45\x60\x35\x61\xcc\x1e\x69\xab\x26\x32\x95\x04\xa7\x2c\x1c\xbe\x6f\xd8\xc6\xc4\x63\xe9\x60\x5b\x5a\x01\x46\x31\x87\x92\xc2\x33\xdf\xc4\x2b\x42\x17\x9d\x3a\x09\x9d\x75\x55\xc0\x29\x4d\x64\x85\xcf\xc2\xf3\x39\x13\x6a\x1b\x69\x1c\x85\xb3\x86\xbb\xbc\x02\x43\x91\xd8\x8a\xcf\xce\x52\x54\xbb\xbf\xd0\x80\x13\x25\x98\x3b\xc6\xcc\xc0\x55\xb2\x90\x45\x88\x5b\x33\x74\x11\x4e\x51\x6b\x19\x5e\xa1\xa8\xc5\x76\xbd\x9e\x0d\x6e\xfe\x57\x75\xa9\x68\x2e\xa4\x42\x77\xb0\x22\x71\x43\xb6\x9f\x01\x6c\x25\x21\x3e\xe7\x53\x1f\x6c\x36\xdf\x4c\x00\x50\x82\x68\xbd\x64\x01\x9f\xce\xe2\xc4\xd4\x87\x3d\x85\x3c\xbe\x31\x0f\xf6\x4a\x1e\x3b\x23\xd2\x72\x3c\x1b\xc0\xc4\x77\x86\xc9\x23\x32\x4c\xf6\xf7\x01\x1e\x27\x2d\x67\xa2\x84\x15\x4c\x26\x59\x1c\x2b\xeb\x2c\x4e\x9e\x06\xd3\xb9\xa9\x86\x6f\x66\x41\x99\xfd\x73\x93\x40\x97\x42\xc2\x63\x7b\x02\x43\x1f\x8f\x9d\xc9\x10\x59\x29\xb9\x8e\xd0\x38\x99\xf8\xe1\x06\x40\xb4\xc9\x30\x7d\xa3\x44\x5b\x37\xf8\x72\x68\x58\xd3\x18\x4f\x03\x62\x22\x68\xd4\x6d\xcc\x40\xb6\x2d\x33\x40\x0e\xec\x7b\x35\x74\x7b\x8e\x1a\xc4\xd9\x47\x25\x90\x1e\x7b\x24\x56\xc6\x36\xe3\x44\xc4\xef\x7e\x9d\xc4\x4b\x94\x10\x1e\xa3\xcc\x53\x83\xb8\x65\x88\x2e\x10\x99\xc7\x33\xc3\xf7\x7d\x62\x7d\x0c\xf1\xac\xd9\x24\xd6\x0c\xa5\x2c\x84\x66\x9c\x34\x9b\x7b\xa6\xc1\xc2\x2c\x19\x21\x6e\xa8\x29\x60\xf4\xbd\xf9\xc6\xbc\xd9\x40\x02\xe0\xcd\x59\x88\xc3\x74\x8e\x92\xbc\x0a\x0c\x6e\x70\x19\x09\x62\x7d\x44\xd7\x2c\xd2\x1d\xf0\x6e\x68\x5d\x9e\x71\x16\xa2\x68\x66\xc0\x8f\xe8\xda\xe3\x41\xe7\x4d\x00\xd9\x62\xc2\xc2\x1d\x19\xf1\x25\x36\x60\x5e\xa7\x77\xb3\x81\x71\x12\x9e\x87\x38\x88\x7e\x42\xd7\x1e\x07\x28\xc4\x88\xf0\x93\x5a\x3f\xb8\xd1\x85\x34\xb4\x94\xbc\x22\xba\xec\x98\x01\x99\xf8\x85\x34\x25\x52\x15\xd8\xc0\xbb\xb6\x6e\x23\x22\xd1\x67\x83\xf9\x44\x74\x79\x7a\x19\x92\xe9\xdc\x24\xb4\x8f\x59\xb8\xac\x9b\x69\x90\x22\x4e\xbb\x1e\x7b\x7c\xc5\xa6\x90\x27\x86\xf8\x8d\x79\x93\xa0\xb3\x88\x7e\xd9\x73\x68\x4f\x0f\x59\x26\x1e\xbd\x58\x97\xc9\x86\x81\x8c\x0d\xea\x7d\x32\x11\x80\xd3\x18\x5f\xa0\x84\xa0\xc4\xbb\x21\x71\x16\x37\xb4\x10\x4b\x4d\x80\x41\xeb\x35\x5e\x45\xd1\x66\x93\xd7\xf3\x92\xc5\x8e\xdf\xa5\x9e\xbc\xcc\x77\x71\x1c\xa1\x00\xdf\x37\x72\x23\xc3\x60\x51\xfd\x36\xf0\x2c\x89\x17\x5b\xf3\x6a\x3e\x89\xc8\xb7\xcd\xa6\x61\xec\xa3\x3d\xdf\x60\xcb\x99\xb1\x61\x81\x25\x73\xd4\x9f\x04\x04\x69\x7b\x5e\x45\xf4\xd6\xea\x29\x33\xa2\x90\x72\xe0\x33\x74\x16\xac\x22\x75\x50\x37\x45\xf2\xf8\xe3\xd6\xb9\xae\x0d\xbf\xe8\x23\x1e\x37\x4f\x04\xbc\x1b\x16\x5f\x0b\x41\x0a\xc3\x33\x1e\x85\x3d\x41\x7f\xae\xc2\x04\xcd\x9a\xcd\x23\x22\xa8\x7f\x02\x38\xb8\xd0\xcf\x93\x5f\xf0\xe3\x9c\xf5\xfa\xfe\x22\xb0\x1b\x97\x41\x82\x43\x7c\x6e\xec\x1c\x75\x5d\x17\x7b\x5a\x1f\xa4\x3a\xf4\x13\x8b\xc4\xc7\xf1\x34\x88\xd0\x71\x7c\x89\x92\xa3\x20\x45\xa6\x0c\x55\x68\x64\x4c\xf8\x3b\x93\x00\x68\x78\x0d\x03\xc8\x2f\x18\x1a\x8d\x30\xfd\xff\xd9\x7b\x13\xee\xb6\x6d\x65\x71\xfc\xab\x48\xf8\xf5\xa9\xe4\x0d\xcc\x4a\xce\x5a\xb9\x8c\x9f\x63\x3b\x8d\x9b\xc4\x4e\x6d\x27\x5d\xfc\xf4\xcf\x81\x44\x48\x66\x4d\x91\x0a\x09\x79\x89\xad\xef\xfe\x3f\x58\x09\x90\x20\x45\xd9\x6e\x9a\xf6\xf6\x9e\xdb\x58\xc4\x8e\xc1\x60\x30\x98\x19\xcc\xb4\xe4\xbc\x5b\x24\x69\xcd\x33\xac\x15\x08\x21\x68\x8d\x92\xe9\x2c\x89\x71\x4c\xbc\xd6\x11\x26\x2d\x72\x8a\x5b\x3f\x1d\xb5\xe4\xbe\x6f\x25\x69\xeb\xd5\xf1\xdb\x37\x2d\x85\x15\xde\xff\xc5\xff\x17\x03\xf7\x81\xb3\xef\xb8\x9b\x60\x2b\x9e\xcc\x23\x94\xf6\x5b\x3f\x00\xbd\xd1\x13\x7d\x10\xdf\x0e\x7c\xe0\x79\x1e\x78\xfe\xc3\x77\xdf\xea\x5d\x3f\xa7\xed\xb0\x98\xd2\xce\x8f\xb4\xad\x0f\x73\x5c\x6c\xa7\x6f\xb4\xb3\xb4\x99\x3f\x68\x33\x87\x18\x8d\x88\xde\x90\x05\x8d\x5f\xd8\x12\xb1\x97\xcd\xa2\x90\x38\x60\x0d\xb8\xde\x14\xcd\x1c\xdb\x89\xd2\x22\x9b\xd8\x1b\x9d\xa2\x74\x8b\x38\x5d\xd7\x23\xc9\xfb\xd9\x4c\x2e\xc9\x03\xec\x65\x51\x38\xc2\x4e\xcf\x65\x2b\xa6\xd6\xaa\x8f\x17\xae\xf7\x47\x12\xc6\x0e\x00\x2e\xdd\x98\xee\xc2\x09\x5d\x08\xb4\xa5\x70\xb0\x1f\xbb\x1e\x7b\x49\x92\xfd\x12\x92\x53\x07\xa0\x34\x44\xc0\xdd\xa4\xb4\xa4\x8f\x21\xf0\xaf\x3d\xcf\x5b\xb4\xbe\xcb\xa7\x0b\xe8\xc2\x14\x21\x96\xb7\xf8\xd9\x89\xdd\x1a\x98\xfd\x84\xce\x91\x08\x25\xdd\x0a\x92\x11\x43\x3b\xef\xd3\x1c\xa7\x57\x47\x98\x52\x86\x24\x75\xbe\x35\x30\xe5\x5b\xd7\x33\x51\xcb\x6f\x7d\xeb\x79\xde\xb7\x1b\x1c\x21\x16\x4e\xbe\xc3\xa0\x0c\x47\xcb\xa3\xc4\xbb\x1b\xe1\xd8\x01\x38\x4d\x93\x94\x9e\xc4\x79\x39\x97\x9c\xa6\xc9\x45\x6b\x97\xe6\x38\xa1\xbb\x11\x62\x8f\x6e\x24\x87\x07\xc6\x77\x17\x69\xa7\x93\x1a\x61\x29\x17\x0b\x16\x07\x17\xbb\xf0\x65\xec\xec\xc4\xec\xe0\x77\x19\x2d\xd1\x08\xce\x8f\xd5\x04\x87\x53\x16\x51\x51\x32\x49\xf4\xac\x4c\x3d\x41\x10\xfd\x76\xdb\xe1\x01\x0a\xb1\x8a\xc5\x2d\xf3\xdc\x4e\x47\xfd\x86\xaa\x06\x65\x22\x4a\x35\xd4\x59\xe0\xb2\xc6\xd5\xa7\x0f\x3e\x82\x07\x74\x65\x5c\x36\x85\x54\x0e\x9e\x0e\xec\x73\x0c\x5f\xc4\xf0\x3d\x0b\x48\x48\x6e\x6e\x1c\xe2\x67\xce\x09\xf8\xdf\x33\x7c\x35\x4e\xd1\x14\x67\xad\x31\x0a\xf0\x5e\xbc\x15\x07\x07\x73\x72\xdd\xfd\x1f\x48\x92\xeb\x64\x86\x46\x21\xb9\xea\x77\x17\x4f\x1f\xff\x8f\xfa\xea\x2d\x84\x1c\x62\x8d\xf3\x9d\xfd\xd1\x3c\x4d\x71\x4c\xb6\xe9\x87\xf5\x75\x41\x59\xb1\x20\x78\x38\x1e\x6a\xef\xe9\x6a\x06\x23\x5c\xd6\x73\x3f\x6d\x69\x31\xe7\xee\xaf\xc1\x7b\x1d\xa0\x8c\x8e\xa7\x9e\xd1\x71\x69\xfd\x34\x0c\x82\x08\x6f\x8c\xc3\x28\x92\x3d\xb1\x3b\x80\xf9\xdc\x45\x26\x71\x11\x4d\x46\xd2\x70\x44\x36\xc4\x05\x58\x4a\x23\xb2\xf3\x89\x79\x37\x95\x37\xd2\x2c\xfc\x8c\xff\xe3\x5f\x66\x03\xf7\xba\x1e\x44\x8f\xf9\x94\xaa\xe3\x24\x36\x5f\xbe\xd5\x9a\x5a\xbe\x7a\xab\xb7\x77\x7f\xc3\x33\xe1\x98\x4d\x97\xc2\xf1\xdf\x7d\xd0\x10\x96\xd3\x60\x29\x2c\xbf\x5f\xed\xf1\x43\xed\x50\x57\x6c\x6b\x39\x2c\x6f\xd1\xe0\x3d\x0e\xd0\x84\x65\x34\x59\x0a\xcb\x5e\x8f\xb7\xff\xf0\x3e\x10\x73\xd5\xc6\x96\x43\xf3\x36\x2d\xde\xe7\x10\x0b\xf4\x32\x5a\x0e\xcf\x75\xb8\x2c\xb2\xec\x0a\xf0\x5c\xb1\xb1\x06\xf0\xbc\x45\x8b\xf7\x39\xc4\x02\x3c\x75\x80\xb2\x66\xaa\x7a\x79\xc8\x7b\x79\x5a\x1d\x63\xd8\x50\xe3\x5b\xd4\x34\xb7\x20\xf2\x72\x75\xbe\xc6\x91\x69\x4b\xfd\xb5\x0e\xef\xab\x05\x9e\x89\x84\xe3\x90\xe4\x48\xc8\xfc\x40\xe6\x2f\x6b\x0b\x1a\x30\x55\x91\x20\x32\xcf\xfc\x6c\x3e\x1a\xe1\x8c\xf2\x50\x92\x5b\x2e\x4a\x7e\x79\xc1\x35\x51\x10\x96\x07\xc7\xf5\x3a\x13\x16\xd7\xe8\x69\xb7\x0b\x5b\xff\xef\xd1\xfa\xb3\x5e\x17\x6b\x83\xe4\x7d\x05\x28\x9e\xe0\x74\x79\x57\xbc\x5c\x65\x4f\x29\x0e\x44\x3f\xb8\xbb\xbe\xce\x9e\x16\x9b\xfd\x08\x71\xc4\xf2\x8e\x44\x41\x66\xe8\x83\x2b\xfb\x4b\x46\xa7\x29\x66\xaa\xaa\xd6\xff\x1b\x8f\xd1\x13\x4b\x8f\x61\x3c\x4e\x96\x77\x47\x4b\x2d\xe9\x4b\x99\xcf\xb5\x94\xfd\x9c\xec\x2a\x8c\x59\x4c\x45\x6b\x37\xf5\x46\x47\x2d\x69\x75\x24\x9b\x52\xf1\x1a\xfd\xf9\x6c\xe0\x5e\x93\x14\xc5\xd9\x38\x49\xa7\xfd\x34\x21\x88\x60\xa7\x6b\x29\x19\x24\x17\xb1\xad\x6c\xef\x59\x37\xc0\x13\x4b\x05\x6e\xef\x63\xa9\xf1\x7d\x45\x05\x66\x4b\x64\x29\xbf\xfe\xd4\xa8\x30\x8e\xc2\x99\xee\x47\x40\xaf\x91\x8d\x50\x84\x9d\xb5\x9e\xdb\xe2\x75\x7f\x2d\x0e\x8f\x55\x56\x1e\x03\xea\xaa\xfe\xa6\xaa\x7a\x28\xc2\x29\x81\xde\x10\x05\x13\x7c\xad\xdd\x68\x58\x42\xc9\x00\xcc\x86\xca\x4b\x30\x59\x21\xb2\x1a\x27\x6b\xda\xd8\x9c\x5a\x67\x7f\xc6\x16\xe5\x1d\x6a\x3b\xb4\x41\x7f\xb7\xde\xa7\xac\xed\xff\x18\xfb\xb4\x41\x77\x77\xdf\xad\x7c\x92\xe2\x62\x59\xea\x56\x17\x13\x14\x6b\x88\xed\xdd\x60\x94\xb4\x6c\xfd\xf6\x7e\x2a\xb6\xf7\xd3\xef\x51\x50\x31\xb6\x35\x92\x86\x28\x9e\x44\xb8\xf9\x20\x07\x06\x81\xf8\xd3\x57\x4f\xe1\xe6\xaa\xdd\xde\x19\x49\x73\xbc\x59\xb5\xeb\x7b\x42\xa0\xff\x28\x0c\xaa\x1c\xc0\x12\x54\x5a\x75\xe0\x2b\xe3\x94\x47\x4b\x31\x5d\x6d\x8c\xa2\xb5\x20\x21\x6b\xbd\x6b\x14\x87\x53\x6e\x76\xad\x4b\xd2\x5a\x3d\xef\x59\xd6\xc2\x28\xc3\x6b\x61\xdc\xea\x66\xad\x30\x1e\x87\x71\x48\xb0\xa5\x8d\xf5\xe5\x6d\x24\x73\xd2\xf2\x1e\xad\xaf\xd7\xb6\xf3\xb0\x61\x3b\x4f\x9e\x3e\xd6\xda\x91\xea\xf5\x59\x8a\xc7\x38\xcd\x28\x82\xce\x47\x38\x58\x9b\x26\xb4\x21\xf7\xda\x32\x67\x68\x99\x83\x25\x4d\x1f\x0f\xb3\xa8\x58\x00\x53\x4f\xfd\xc9\x14\x94\xb3\x15\xeb\x74\x1c\x50\xdc\xad\xc0\xf7\x7d\x91\x7d\x73\x23\xb5\x22\xb6\x5c\x77\xe1\xbc\x88\xfd\xcf\xf1\xcd\x8d\xf3\x39\xf6\xaf\x17\xae\xeb\xbd\x40\xc1\x51\xf8\x19\x7f\x40\xd1\x1c\xfb\x60\x88\x82\x35\xae\x9a\x85\x2f\x62\xef\x03\x8a\x42\x96\xcb\xb5\x83\x3e\xd7\xda\xae\x85\x14\x41\x52\xa6\x78\x91\x85\xf6\xe7\x53\x9c\x86\xa3\x52\xb9\x98\xa7\xb3\x82\xfb\x61\xa4\xf5\x94\x17\x09\x23\xb0\x71\x8e\xd2\xd6\x2f\xb1\xa1\x5f\xba\x72\x42\x88\xdd\x0d\xae\xa1\x1f\x3a\xa1\x06\x97\x50\xea\x8e\xa4\x30\xf9\x15\x17\x55\x87\x2e\x74\xb0\x4f\x3c\x34\x9b\x45\x57\x3c\x49\xe9\x76\x5c\xd7\xfb\x98\x9d\xa2\x19\xf6\xc1\x3c\x3e\x8b\x99\x16\x18\x7b\xcc\x18\xc3\x6f\xf7\x20\xf6\xc4\xde\x60\x1f\x0b\xd1\xee\x47\x27\x84\x27\xd7\x67\xf8\xaa\x0f\x58\x5d\x00\x27\x98\xe8\x0a\x61\xa9\x9e\x38\x0d\x33\xd1\xfc\x02\x66\x7a\x11\xae\x28\xb3\xe9\x34\xda\xdb\xc4\xc1\x6e\xa7\x73\x44\xb8\x6a\x97\xfe\x9b\x37\x23\x34\x68\xc4\xd7\xd2\x36\xb4\xdf\xbe\x28\x9d\xe2\x4f\x73\x2c\x15\x74\x8e\x1c\x25\x61\x7a\x42\x31\xf0\xf0\xf3\xb2\x71\x87\x9f\x9b\x0f\xdb\xa6\x0b\xfd\x15\x3b\x7c\xe5\x21\x76\x6f\x6e\x0e\x1c\xcc\xd4\x2d\xb6\xa9\x85\x9f\x4b\x33\x0b\x3f\xab\x89\x85\x9f\xe9\xbc\xcc\x5e\xb9\xd9\x84\xa5\x53\xda\xcd\xcd\x0d\x60\xd8\xbd\xf9\xd9\x44\x2f\x8b\x12\xf5\x04\x5c\x5e\x66\x00\x02\xf6\x4f\x36\x05\x10\x4c\x03\x00\x41\x34\xa1\x69\x11\xfd\xe7\x32\x02\x03\x8f\xd9\xa8\x1c\x8c\x1d\xec\x3e\x5f\xeb\xd1\x59\xd0\xa6\x0b\xfb\xa0\xdf\x0e\xb3\x7d\xb4\xef\xcc\x50\x9a\xe1\xbd\x98\x4e\xb2\xd7\x75\x99\x9e\x62\x8a\xc8\xe8\xd4\xf9\xee\xff\x3b\xe9\xae\x7d\xdf\x1a\x3c\xf8\xe6\xbb\xbc\xbe\xb1\x45\xfa\x9f\x63\x63\xe7\x2d\x6c\xaa\x31\x63\x86\x00\xf4\x6d\x80\x29\xab\x33\xad\xaa\xd3\xf5\x81\xa9\xe5\x04\x00\xa6\xbe\x52\xbd\xb5\x80\x0b\x43\x9f\x75\x14\x6f\xa6\xde\x38\x8c\x08\x4e\xad\xca\xba\xb6\xef\x93\x85\xdb\x4f\x0b\x9a\xba\xbc\x80\xef\xfb\x64\x33\xee\xe3\x85\x52\xf4\x84\x4a\xa9\xbb\x19\x0a\x75\x5c\x8b\xe9\xd2\x28\x5a\x80\x71\x48\x80\xbb\x70\x88\xeb\xc2\xd4\x6f\x1f\x38\xc4\xed\x74\x88\x5a\x05\x9e\xfd\x7c\xad\xc7\x86\xb7\x21\x6c\x1d\x62\x61\xe3\x60\x87\xac\xec\xd6\x3f\x8c\xf3\x15\xa2\xed\x53\xb0\x38\xe9\xe6\x3e\x85\xdf\x09\x60\x17\x55\x00\x01\xbd\xaa\x82\x01\x3c\x01\xfc\x16\xab\xa7\xa8\x8b\x38\x80\xa1\xfc\x96\xa5\xc2\x81\xdb\x37\x5b\x0a\xf5\x46\xc2\x06\xf5\x85\x89\x80\x05\xbf\x64\xba\x81\xd2\x6d\x1d\xdc\xf9\xf8\xd5\xb0\xb5\xde\xf4\x9e\x06\x56\x63\x24\x69\x71\x44\x06\x3e\x00\x0b\x97\x9b\x2d\x48\x7d\x9f\x9d\xb2\x30\x32\xa2\x13\x96\x39\x37\x0a\x00\xf0\xbc\xb4\xe5\xc2\xb1\x83\xbd\x53\x94\xd1\xa3\x2a\xc6\xe9\x01\xb3\x56\x03\x74\x69\x69\xcb\x5a\xda\xf3\xae\xa4\x06\x87\xb1\xb3\xd6\xfb\x4f\x31\xdf\x85\xb1\xcf\xed\x9e\x7a\xdd\xee\xff\xb4\x1e\xb4\x94\xda\xf5\x30\x76\xd6\x2d\xc5\x81\x0b\x5c\x4e\x4e\xb2\xf3\x09\x9f\xa4\xc7\xa0\xe2\xc7\xb0\x90\xcc\x01\x54\x4e\xe7\xaa\x25\x3f\xd7\xf1\x13\x08\xd8\xa3\x99\x5c\x11\xab\x83\x41\x37\x90\xb0\xc1\x22\x27\x76\x1b\xe1\xd8\x09\x9c\x0f\x4e\xe8\xcd\xd2\x84\x24\xcc\x5a\x07\x16\xea\x33\x15\xac\xa1\x7d\xe5\xc3\x0b\xb3\xed\x24\x8e\xf1\x88\xe0\x40\x6e\x7d\x75\x8e\x89\xf9\xce\x87\xdc\xa6\x89\xdd\x9a\xe9\x02\x23\x82\x79\xbb\x2a\x73\x88\x8d\x4d\x0b\xc2\x51\x12\x1f\xe2\x49\x98\x91\xf4\x8a\xb3\x09\x67\xf8\xaa\xd3\x99\x61\x2f\x15\xa9\x27\xc4\x63\x67\xca\xa0\xd3\x89\xe9\xe6\xe7\x5f\x9d\x8e\x13\xcb\xdf\x90\xd8\x0f\x21\xd7\x5d\x68\x50\x0a\xc2\x6c\x24\x27\xb0\x8d\xa2\x68\x88\x46\x67\x25\x68\xc9\x53\xbd\x0c\x24\x7b\xf5\x02\xb0\x5c\xc8\x35\xc2\x3e\x65\x02\x8a\x20\x71\x6f\x6e\x38\x5d\xa4\xd3\xbc\xb9\xc1\xde\x3c\xce\x81\xe2\xaa\x71\xa6\xcc\x76\xdd\x32\xb2\x66\xa7\xdf\xc2\x31\x60\xc7\x06\xc1\xc0\xe7\x6e\x8e\x63\x87\xf2\x5d\xb1\x9f\x39\x27\xdf\xfe\x90\xcd\x50\xdc\xe2\xa8\xfb\xea\xf8\xed\x1b\x1f\x7c\x0b\xbf\x05\xcf\x7f\xf8\x8e\xa6\x3f\xff\x76\xe0\xba\xb0\xaa\xa1\xfe\x79\xec\xa4\x37\x37\x4e\x2a\x1a\x3a\x9f\x94\xda\x69\x9d\x87\xf8\xe2\x45\x72\xe9\x03\x8a\xb6\x0f\x9f\xb4\x1e\x3e\x01\xad\xcb\x69\x14\x67\x3e\x38\x25\x64\xd6\xff\xee\xbb\x8b\x8b\x0b\xef\xe2\xa1\x97\xa4\x93\xef\xd6\xbb\xdd\xee\x77\xd9\xf9\x04\xb4\x50\x1a\xa2\x35\x6e\x9f\xeb\x03\x92\xce\x31\x1b\xd1\xf9\x84\x0f\xa8\x84\xd4\x30\x86\x29\x0c\x21\x82\x91\xcf\xad\xa1\x7c\x87\xf8\xfa\xb0\xb1\x1c\xb3\x76\x26\x91\x4d\xd2\xd7\xca\x78\x02\x89\x61\xe2\x0b\x6e\xac\xd3\x89\xf8\x8f\x4d\xf1\xb7\x1f\x79\xc2\xe4\x73\xa3\xc8\x0a\xb7\x19\x87\xdc\xe9\x38\xaa\xf6\xa6\x1c\x49\xec\x8b\xea\x2f\x68\xd1\x40\x1f\x42\xbc\x19\xf7\x93\xbe\x2c\x98\xfa\xaa\xfd\x72\xd1\x74\x33\xed\x27\x2e\xac\xee\x26\x94\xdd\x6c\x45\x38\x25\x66\xe5\x70\x33\xd4\xfa\x41\x79\x3f\x96\xb2\x68\x13\xd1\x8e\x12\x4e\x84\xdd\x07\x65\x0a\x02\x40\x69\xfa\x6c\x58\x9b\xc4\xff\xf6\x87\x19\x22\xa7\xad\xc0\x07\x6f\xd7\x9f\x78\xcf\x1e\xb7\x7a\x5e\xef\xd1\x9b\xf5\x9e\xd7\x7b\xd8\xea\xf5\x50\xcf\x5b\x7f\xd6\x62\xff\x74\x5b\xdd\x6e\xcf\xeb\xb5\xd6\x4f\x7b\x3d\xef\xd1\xe3\x72\xce\xda\x7a\xb4\xf6\xd8\x7b\xba\xbe\xf6\xbd\xf7\xec\x49\x21\x7b\x6d\xdd\x5b\xef\xb5\xba\x9f\x41\x6b\x14\xa1\x2c\xf3\x01\x93\x4f\x81\xd6\x77\xcf\xbf\xed\xe7\x97\x13\x3a\x9a\x51\x98\x8e\x22\xdc\x1a\x5d\xfa\xe0\x61\x17\xb4\x46\x57\x3e\x78\x02\x5a\xa9\x0f\x1e\xab\xba\xac\x38\xab\xeb\x42\xb2\x90\x66\x91\x8b\x81\x62\xb7\x29\x29\xce\x2a\xf8\xd6\x93\x77\x31\x7c\x1f\x0f\x16\x8b\x81\x0b\xc3\x85\x73\x1c\xbb\x1b\xaf\x88\x73\xf2\x47\xec\x5c\x53\x7a\xd1\xe7\xdb\x71\xe1\x0e\xe0\x2f\x71\x4e\x46\xa0\xe4\x8e\xe9\x8a\xb8\xb0\x59\x0d\x76\xea\xad\x50\x41\x89\x15\x01\xe4\x6b\xdb\xb0\xde\x38\x0a\x67\x15\x55\x84\xf9\xa3\x65\x70\x14\xef\x56\xec\x87\xdf\xec\x57\xed\x49\xdc\x8d\x56\xec\x8b\xaf\xb1\x51\xe7\x47\x59\x87\xdb\x81\xda\x7a\xca\xf9\x05\xa3\x66\x79\x43\x60\x4f\x1a\xd1\xc2\xd8\xc7\x9a\x19\xf1\x46\xd9\xc2\x31\x15\x06\x89\xf4\x08\x56\xc7\x80\x48\x44\x7e\xbe\x99\xb1\xa7\xd9\x02\x17\xf7\x32\x3b\x1d\x15\xb1\x8b\x37\x85\xbd\xb1\xb0\x76\xd6\x6d\x8c\xd5\x84\xb8\x19\x32\xd2\xed\x8d\x63\x87\xb5\xe3\x2e\xfa\xc2\xd8\x19\xbb\xfc\xec\x41\x39\xcf\xcc\x7b\x20\x9d\x8e\x13\xa9\x49\x1a\x77\x20\x7a\xe7\x40\xee\xc2\x85\x11\x33\x62\xa2\x74\x49\xb3\xd4\xde\xc8\x49\x5d\xa7\xc3\xcd\x7f\xbd\x00\x8f\xc3\x38\xb7\x2c\xc6\x30\x85\xb1\x93\xba\xf2\xcc\x24\x37\x37\xc4\x49\x60\x4a\xd9\xc0\x6b\x6d\xb4\xe5\xf3\xee\xba\xb0\x25\x85\x11\xa7\x39\x74\x7a\x12\x14\x0e\x63\x7e\xb2\x1e\x26\x09\x31\x8e\xe2\xdc\x7a\xcb\x34\x83\x03\xf4\x44\x72\x8b\x27\x07\xb7\xd7\xc5\x4c\xac\x80\x86\x11\xee\xb7\xbb\x70\x94\xc4\xe3\x70\x32\x97\xdf\x8b\x85\x05\xeb\xcf\x27\x39\x36\x5d\x10\x07\x30\x59\xcc\x88\xee\xd2\x5f\x62\x2e\x63\xf8\xcd\x7a\xc9\x14\x56\xbe\x9b\xb8\x7f\x15\x2f\x72\x01\xc4\x37\x15\x57\xe2\x58\x21\x9a\x1f\x9b\x86\xb4\x71\x85\x21\xad\x64\xe6\x18\x88\x4c\x08\x60\x7a\x25\x12\x46\x6e\x44\x82\x89\x78\xf8\x12\x4f\x67\xe4\x20\xa6\xe7\x51\x65\xa6\x20\xa8\x14\xdd\xdb\x71\xa7\x13\x61\xc7\x5a\x5c\x99\x04\x76\x3a\x6d\xb5\x1b\x48\xd9\x66\x17\x1c\x9f\x62\xcd\xe4\x11\x43\xf0\xbc\x85\x23\x86\xec\x36\x5b\xd7\x1f\x34\x4e\x59\xb3\x48\xb4\x19\xd4\x42\xf0\x1c\x14\x2c\x15\x89\xdd\x52\x11\xe5\x96\x8a\x48\x58\x2a\x96\x27\x84\xb2\x2c\x9c\x50\xd0\xb4\x7b\x14\xf5\x78\x7e\x2c\xf3\x63\x7a\x27\x51\x36\xb5\x0e\xc8\xa2\x84\x30\x1c\x8b\xbd\x0c\x93\x62\x06\x54\xcd\xc1\xb0\xd3\x09\x35\xa9\x92\xbb\xd8\xe0\xa0\x2a\xee\x05\x5d\xac\x52\x5c\xcc\x65\x68\xbb\x51\x7c\x83\x91\x6e\x16\x4d\xb4\xed\x5b\x99\xdb\x66\x2e\x1c\x44\xf9\x31\xfb\x8b\x8c\xc6\x94\x8a\x3f\x38\xd0\xf6\x3f\x5e\xb0\x86\x85\xb1\xe4\x4f\xfc\x61\xcc\x5b\x34\x73\x4e\x4e\x00\x4a\xd3\xe4\x82\xf9\x37\x07\x10\x6c\xd1\x8f\x37\xcc\x3b\x39\x94\x59\xa9\xb8\x9a\xb2\xbc\x43\x7e\x1d\x55\x99\xf3\x99\xcc\x79\x3f\xd3\x92\x03\x26\x99\xe3\x19\x3b\xf4\x37\xcd\x22\x68\x08\x20\x38\x46\x43\xf6\xc5\x5d\xd1\x43\xb0\xcb\x5d\xd2\xd3\x94\x6c\xc4\x4e\x76\xb0\xcb\x7f\xd0\x34\xa6\xdd\x06\x10\xb4\xf8\xed\x3e\x99\xd2\x8f\x57\xf4\x0f\x6f\x23\x60\x2d\x04\x60\x30\xd0\x24\x8b\x3f\xb3\xcd\x8f\xbd\x59\xca\x5e\xba\xed\x70\x33\x7b\xc7\x85\xf4\x3e\x95\xcc\x28\xcc\xd1\x04\xf1\xd5\x66\x10\x79\x5d\x14\x5a\xc6\xba\xd0\x32\xd6\x9a\x8e\x2b\x84\x96\x71\xbd\xd0\x32\xc5\x28\x48\xe2\xe8\x8a\x0b\x29\xe5\xe3\x3d\xfe\x25\x9e\x6b\xf1\x0f\x34\x22\xe1\x39\x16\xb2\xcc\x6c\x8b\x3d\x43\xe4\x5f\xf8\x72\x16\x85\xa3\x90\x6c\x47\xe1\xe8\x8c\x27\x4d\x51\x7a\x86\xd3\xa3\x70\x12\x87\xe3\x70\x84\x62\x22\xb0\x29\xc4\x99\x7f\x02\x38\x3e\x80\x18\x31\x98\x09\x79\x30\x90\x7d\x83\x81\x2e\x20\x8d\x25\xc7\xb6\xf4\xe6\x14\x3b\xe1\xcd\x8d\x13\x32\xfb\xda\x1f\xe8\x0e\xa3\x97\x0b\xfa\x87\x49\xbd\xd5\x0d\xac\xc9\x35\x91\x5e\x10\x63\xe3\x82\xd8\xe4\x76\x28\x68\xd1\x70\x8f\xbd\x43\xeb\x0a\x31\x47\x12\x61\x1f\xf0\xc7\x91\xa0\x89\x6c\x83\xd5\x3a\x45\xd9\xdb\x0a\x10\x5e\xf1\xab\x02\x2b\xc6\xc1\xbc\x45\x08\x1a\x9d\xe2\x40\x88\x3f\x78\xa2\x97\xe2\x69\x72\x4e\x29\x20\x4b\xe4\x0f\x7f\x78\x9b\x8e\xeb\xc2\xf2\x0c\xe7\xcb\x44\x04\xbc\xc0\x0b\x36\x13\x45\xcb\x32\xd9\x01\x0a\x02\x81\xcd\x47\xf3\xe1\x34\x24\x2f\xf0\x29\x3a\x0f\x93\x94\xe1\x36\x13\xd5\x48\x4c\x53\x72\x9a\x0c\x93\xf9\x6c\x1f\x51\xb4\xe2\xad\xe6\x75\x14\xa0\xf0\x74\x1e\x21\x82\xb7\x18\xf2\xbd\x4d\xe6\x19\x66\x9b\xb6\xbc\x64\xac\x45\x89\x42\x37\x37\x82\x25\xe0\x3d\xde\xdc\x70\x70\x49\x14\xee\xd6\xb5\xff\x7e\x56\xd5\x7a\xbe\x03\xd8\x67\x01\xed\xbb\xb9\x44\xbc\x6a\x5e\x55\x0d\xcb\x71\x6e\x3a\xe2\x93\xae\xdc\x2e\x25\x10\x6f\xc2\x8c\xe0\x18\xa7\x0e\x38\xc3\x57\x94\xa2\xf1\x9e\x2d\x83\x56\x52\x35\x7b\x5d\x4e\xf6\x2a\x6a\x53\x90\xd6\xd5\x9f\xd2\x42\xb7\xee\x9d\xd5\xbe\x53\xff\x23\x0a\x61\x51\x9b\xa4\xe1\x64\x82\x53\x1b\x78\x97\x80\xa0\x38\x81\xd7\xf8\xea\x45\x82\xd2\x80\x95\x54\x6d\xb8\x7d\x47\xe2\xf3\xed\x56\xc0\x5a\xb1\xe9\xf4\xcb\x95\x1b\xc3\xbe\xa2\xea\xed\x7b\x5e\x0d\xea\x8d\xe0\x55\x01\x72\xb5\x73\x6a\xba\xa9\x14\x7d\x6e\x58\xb7\xba\xa4\x04\x9b\xec\xc4\xed\xb7\xe9\xfd\x8d\x51\xa7\x77\xfc\xe4\x2d\x50\x4b\xf1\x61\x6c\x69\x3b\x91\x15\xa4\x05\xcd\x66\x38\x0e\xb6\x4f\xc3\x28\xd0\x4b\xe5\x22\x42\x62\x63\xb9\xc5\x39\x70\xa2\x09\xc2\x06\xc0\xd5\xef\x2b\xf4\x9e\x44\x07\x3f\x43\x64\x74\xca\xc0\xe4\x30\x8e\x88\xae\x16\xff\x94\xeb\x72\x9d\x62\x0a\xd2\xe0\x18\xa5\x94\x4b\x64\xa4\x9a\x3d\xfb\xca\x70\x40\xf9\x3d\xd7\x85\x20\x63\xa4\x18\xd0\xcb\x0d\x5b\xc5\xab\x19\xb6\x1f\x12\xae\x6b\xa5\x69\xbd\xfc\xd4\xd4\xce\x8f\x2a\xb9\xaa\x3f\x8e\x1d\x74\x73\xe3\x20\x2e\x39\xe4\x73\xb5\x08\xfd\x5a\xfc\x4c\x9c\xa5\x38\xc3\x31\x61\xdc\x0e\x68\x6d\x2a\xd6\x83\x8b\x18\xf3\xf7\xdc\x6b\x3d\xd0\x62\xe2\x1a\x1f\xd8\x5f\xfe\x83\xd6\x39\xd7\xf9\xb2\x8a\x94\xab\x90\x6d\x5c\xcd\xb0\x92\x7c\xf2\xe1\x70\x51\xa3\x81\x22\xf0\x37\x7e\x9d\xf1\x58\x2b\xae\xfa\xa4\x0d\xe5\x5f\xec\x94\x74\x21\xf1\xd5\xb3\x2a\x0e\x92\x5d\x7e\x4d\x71\x40\x10\x9e\x03\x77\x83\x08\x21\xbf\x18\xa9\x0f\xe8\x50\x01\xdc\xe3\xec\x32\xd4\x60\xef\x13\x05\x5c\x13\xc3\x2a\x84\x52\x6d\xa7\xad\xd5\xbe\xb9\xd1\xbf\xbc\x19\x4a\x71\x4c\xc4\x58\xf2\xfd\x54\xc7\x46\x54\x6e\x28\x18\xfb\x6f\x75\x9c\xb6\x72\x71\xee\x06\x49\xaf\xd8\x13\xf7\xd8\xcb\x1c\x77\xa3\x4d\x2f\xe4\x5e\xec\xb8\xae\x17\x24\x31\xde\x90\xaf\xb2\x08\x87\xea\x86\xd2\xd8\xa4\xae\x2b\xe6\xd3\x5d\x2c\x46\x4c\x9d\x19\xba\xd7\xb1\x87\x9d\xd0\x5d\x8c\xc3\x18\x45\xd1\xd5\x75\xec\x8d\x1d\x57\xf0\x80\x1a\x12\xd6\x51\x91\x25\xaa\x91\x76\xf1\xae\x93\xb3\xf9\x9c\x91\x1f\xd4\xa8\x25\xeb\xf5\xd4\xee\xb5\xe2\xc1\xb1\xe3\x5e\xbf\x52\xcf\xda\x14\x0f\x8b\x19\x55\x90\x8c\xec\x19\xbe\x1a\x25\x41\xa5\xf0\xb1\x75\x46\x9c\x9f\xe2\x7c\x0d\x51\x60\x61\x13\xe9\x38\x7e\x62\xb7\x4a\xf1\x6e\x3b\x5f\x70\x1b\x20\x44\xcb\x3f\xb1\x0b\x2a\xd3\xc5\x89\xf2\x13\x4c\xb6\x93\x00\x57\x03\xaf\xfc\xee\xd5\xaa\xff\xed\x0d\xcc\xe7\xb0\x0c\x7d\xe4\x44\x2d\xf2\x32\xed\xe5\xa5\x37\xa1\x93\x60\x8a\x68\xf9\x08\x7d\xe0\x42\xbc\x70\x5c\x4f\x8c\xce\x21\xae\xd4\x1d\x2d\x1c\x42\x21\xeb\x6a\x0f\x79\xe9\x4d\xc9\xe9\x42\x4d\xaf\xef\x5e\x13\xe3\x3c\xf0\x18\xc5\x74\x5c\xc8\xce\x02\xa6\x36\x32\xd8\xf0\x22\x4b\x5b\xa9\x37\x12\x9a\x32\x71\xf7\x01\x5b\x20\x97\x01\x28\x31\x94\xb9\x13\xed\x92\x28\xf9\x82\x12\x1a\x0d\x0a\xca\x6c\x34\x20\xcf\x20\x23\x51\x90\x98\x28\x8c\xf1\x2b\xae\x63\x04\x5d\x71\xce\xda\xca\x11\x7c\x49\x76\x94\x73\x4a\x41\x91\x14\xaf\x24\x6e\x7f\x85\x43\xd4\x18\x18\xb4\x32\xa9\x94\x86\x33\xb4\x36\xae\x3d\x14\x8a\x5a\x32\x25\xfe\x3b\x92\xb0\x33\x31\x77\xdf\x29\x5f\x8b\x2c\x4d\x98\x87\xf8\x5a\xaf\xdf\xb5\x34\x68\x16\xe2\x87\x4b\x5f\xbc\x94\x37\x36\x90\xf5\x66\x62\x59\xe6\x76\xf1\x98\x1c\x45\x49\x86\x33\xe2\x80\x71\x92\x4e\x81\xba\x77\xf1\x83\x45\x9c\xae\xf6\x73\x56\xc0\x70\x25\xe6\x81\x61\x7e\x6c\x51\x38\x68\x82\xf3\xd7\x86\xe0\x51\xdd\xa9\x96\x49\xce\xcd\x6a\xfc\x02\xbe\x52\x15\x7e\x59\x5f\xa9\x8a\xb8\xd8\x2f\x53\x05\xbc\x2e\x28\x38\x84\x14\xa0\x4e\xae\xaf\x79\x65\x00\x92\x51\x00\x30\xf7\xda\x60\x99\xb1\x86\x5c\x15\x4d\x8b\x21\xd5\x36\x23\x24\x22\x77\x68\x81\x5f\x22\xef\xd0\x80\xdc\x95\x66\x13\xdf\xc4\x9a\xd0\xb9\x5c\x67\x54\x54\x18\xc9\xf2\x5c\x87\x52\xaa\x60\xaa\x56\x98\xbc\xe9\x57\xf6\x84\x39\xba\xb9\x71\x22\x26\x62\x91\x6f\x91\x87\x68\x74\x36\x49\x93\x79\x1c\x54\x39\xd7\x11\x0f\x98\xd7\xba\xb0\x95\x4e\x86\xc8\xe9\xc2\x96\xf8\xbf\xeb\x6e\x54\xbd\x2d\xb0\x38\xe6\xe1\x16\xe9\x55\xf6\xa2\xc6\xf3\x00\x6e\x37\xfa\x10\x3d\x0a\x1e\x3f\x66\x9d\x48\x27\x9a\x15\x8f\x54\xd6\x21\x77\x06\x57\xfd\xd8\xa5\x65\xbc\xbd\xb2\xbd\xb6\x5e\x78\xb3\x34\x3c\x47\x04\xaf\x09\xc8\x50\xa8\xaf\x59\xde\x05\x9b\x63\x11\x5f\xee\x86\x7c\xe7\xcd\x93\xc5\x97\xbb\x51\x82\x6f\x9e\xe0\x6e\x98\x5e\xbd\x84\x49\x2e\x77\x72\x5b\xfd\x6c\xa3\x0a\xb4\xc2\xc3\x6d\x23\x00\xf7\xba\x0c\xc2\xbd\xe1\xfa\xf0\xe1\xba\xab\xbd\x7a\x50\x8e\xc3\x56\xee\x5d\xf1\xe3\x8d\x06\xf0\x90\xf5\x8f\xf0\xf0\xd9\x70\xa4\xfa\xef\xf3\xdd\xe5\xb6\xe4\x56\xd0\x1e\x42\xb0\x5f\x11\x7b\x01\x51\xf5\xe4\x69\x15\x77\xb4\xee\x42\xf5\x61\xce\x34\x5f\xf5\xd2\xf2\x30\x41\x24\x2c\xa8\xda\xee\x20\xd2\xd5\x3c\xfe\x78\xb4\xdb\xa3\xf0\x33\xf6\x41\xef\x19\x80\x98\x7f\x73\x7b\x54\x12\x4e\x29\x53\x33\xc3\xf4\x92\xbe\x47\xa1\xe8\x5c\x60\xf7\xb6\x42\xd6\xe4\xe6\xc6\x49\xf8\x0d\x2f\x08\xcf\xa5\xbe\x5d\x47\x7d\xf0\xfc\x07\x09\x9b\x96\x30\x89\x65\xd7\x31\x66\x7f\x29\xaf\x63\xb2\xc4\xf3\x1f\xbe\x0b\xc2\x73\xed\x5a\xa6\x06\xae\x7d\x86\x9f\xf1\x4a\xca\xfb\x5f\x85\xf2\x3e\x5e\x38\xaf\xab\x95\xf7\xf4\xde\x64\xd2\xc8\x23\xa6\x8e\x5f\x72\xc8\x59\xaa\x71\xbd\x7f\x49\x01\x28\x8d\xb1\x19\x17\xb1\x26\x99\x1d\x9c\x8a\xd5\x4e\xfd\x13\xf0\x1f\x30\xd0\xd6\x3b\xe5\xac\x71\x38\x76\x7a\x1d\xdc\xe9\x38\x47\xde\x55\x7c\xe9\x74\x5d\x78\xe4\x7d\x9c\xbf\x77\x7a\xf4\xc7\x8b\x9f\xcf\x1c\xd7\x85\xeb\x1d\x2c\x75\x7b\x47\x5e\x72\x79\xe1\x3c\x74\x37\x8e\xbc\xcb\xd9\x13\x5e\xea\xe0\xd3\xdc\x89\xbd\x51\x32\x9d\x26\x31\x1f\x3a\xe3\xc7\x33\x8f\x3f\x8f\xd0\x3d\x6b\xa4\xe5\x5e\x8f\x27\xbf\x3b\x5d\xc8\xae\xb4\xb0\xf7\x88\xb6\xf7\xdb\xfe\xc8\xe9\xc1\x38\x85\xeb\xb0\x07\x01\x73\x7d\xc6\x5e\xdf\x51\x64\x61\xe3\xfb\xf4\xfb\x96\x75\x58\xae\xf7\x4d\x38\xe5\x42\x05\x98\xca\x34\x7d\xa4\x3f\x3f\xf9\xc9\x01\xf1\x64\x6f\x0c\x60\xec\x89\x77\x67\xbe\x9f\x7a\x5b\xa3\x51\x92\x06\x21\x1d\x3e\x4d\xf3\x98\x96\x4e\x1f\x77\x78\x17\x68\xad\xdf\x16\x5a\xe8\x0b\xf4\x2a\xde\x92\xe8\xdd\x46\x46\xb7\x79\xab\xbb\xb3\x97\x0c\x9c\xc6\x8a\x3d\xa6\xad\xef\x07\x3f\x39\xe0\x7f\x49\x32\x99\x44\x98\xdd\xc9\x81\x7e\x43\x3a\xf2\xb6\x5f\xbd\x75\x84\x6e\x1a\x97\xd7\x4a\x52\x1c\x99\x31\x4a\xa2\x08\xcd\x32\xfc\x0e\xc5\x38\x3a\x88\xb7\xe4\xc3\x82\x9d\x24\x66\x6e\xa3\x68\x8f\x74\x0c\x3d\x39\x86\x27\x34\xe5\x55\x16\x3b\xeb\x70\x5d\xe1\x87\xfc\xbb\x58\xa7\xa0\x13\x6b\x2f\xc6\xa8\xf6\x4f\x3e\xe9\x64\xc9\xa4\x15\xe0\x39\x76\xa6\x02\x3b\xf9\x00\xe4\x88\xd6\x45\xc2\xba\x4c\x78\x28\x12\x1e\xca\x84\x47\x50\x5d\x44\x1e\xc1\x1c\x76\x42\xce\x56\x26\x82\x12\x76\x50\x02\x87\x4f\x80\x81\xc6\xe1\xa0\xd8\x7a\x93\x38\x4f\x20\x40\xd9\x55\x3c\x02\xb2\x9f\xa7\x4c\xd6\x10\x03\xf8\x44\x8e\xf9\x19\x0c\xab\x77\x14\x2d\xf0\x3d\x44\x4b\xb6\x9c\x84\x7b\x57\x36\xfe\x94\x61\xe2\xfb\xdf\x9d\x5e\x0f\x6a\x76\x08\xcf\x54\xf2\xba\x2c\xf9\xbd\x4a\x7a\xa8\x97\xec\x75\x55\xfa\x23\x23\xbd\xa7\x77\x4a\x97\x96\x23\x1a\xfb\xf5\x04\xf6\x4a\xab\x2c\x87\xf6\x54\x2e\xc9\xba\x5a\xab\x67\x30\x4a\xe1\xc3\x7c\xb1\x1e\xda\x2a\xb3\x5d\xb4\x08\xc7\x8e\xda\x47\x29\x0c\x7d\xa2\x11\x14\xb4\x84\xa0\x84\x82\xa0\xb4\x7d\x1f\x95\x08\xca\x5e\x2c\xb8\x05\x58\xae\xbc\x4d\x4f\x35\x00\x91\x37\xc1\x84\xad\x2b\xad\x83\x59\x2a\xce\x9c\xd0\x95\x75\xd8\x8c\xf0\xd9\x1f\x14\x5b\xd2\x35\x24\x7b\x90\x1e\xcc\x4f\x51\xb6\x26\x95\xdd\xcc\x66\x4b\x48\x0b\x1c\x4a\x09\xa3\xd1\xef\xce\x13\xd8\x7b\x02\x91\xa7\x2a\xee\xe4\x85\xbd\xd1\x29\x25\x3e\x99\xeb\x32\x63\xc0\x7e\x2a\x64\x1e\xee\xcd\x4d\x45\x05\x91\x2f\x67\x11\x06\x62\x02\x6a\xe2\xaf\xd8\xa8\xf6\x02\x27\xf4\x08\x9e\xce\x28\x33\xb4\x17\xb8\xae\xa3\x5d\xba\x10\xbd\xf5\xcb\xf2\x9d\x4e\xa8\xae\xd7\xb4\xd9\xf9\xde\x19\xf7\x60\xb5\x96\x57\x68\x57\xd7\x10\x65\x29\xda\xa6\x49\x94\x15\x47\xb3\xcd\xbd\xfa\x5a\x86\xc3\xaa\xe1\xcb\x19\x8a\x03\xda\x45\xe8\x25\x33\x1c\x4b\x90\x3f\xaa\x58\x63\xdf\xb6\xc6\xfc\xd0\xb0\x2c\xf0\xd2\x9a\xdb\xc9\x74\x16\x61\xa2\xb0\xe3\x99\xaa\xfc\xbf\xd9\x59\x38\xdb\xe3\x8e\x17\x0f\x25\xbf\xc4\x49\x97\x0d\xe8\x55\xd3\x34\xe0\xc9\xe5\xe3\x00\xb6\xc5\x5c\x45\x72\x84\x86\x38\x8a\x70\x30\xbc\x6a\xb8\x94\x95\x33\x65\xad\x72\x23\x8b\x2c\xf5\x4f\x4e\x4e\x0a\x08\xcb\x42\x76\x32\xcb\x05\x9a\x9e\x11\x3c\x93\x49\x03\x58\x2a\xac\xa3\xb4\x51\xc5\xc8\x18\x40\xca\xdd\xc0\x11\x65\x73\x2c\x9d\xc1\x56\xa1\x27\x58\xdd\x8b\x56\xd6\xd8\x4e\xac\x83\x39\xed\x80\x6f\x38\x2e\xc9\xd3\x59\xaa\xe0\x2f\x61\xa9\x4e\x9b\xb3\x54\xc1\xd7\xc4\x52\xcd\xfe\x12\x96\x6a\xfc\xd7\xb0\x54\xe7\xff\x8d\x2c\xd5\x64\x35\x96\xea\xf4\x6f\xc8\x52\xcd\x96\xb1\x54\xe3\x7f\x28\x4b\x75\xfe\x2f\x4b\xf5\x2f\x4b\xf5\x2f\x4b\xf5\x17\xb0\x54\x57\x82\xc7\x39\x22\x78\x36\x63\x4a\x65\x30\x80\x53\x91\xf8\x26\x41\x01\x7b\xcc\x0e\x74\xc6\x64\x28\x08\x71\x81\x3f\x60\x64\x44\x11\x0b\x49\x56\xd6\x4d\x76\x80\x55\x30\x07\xf5\xbf\xd9\x8c\x3d\x6d\x50\x70\xd3\x68\xfe\x76\xb3\x83\x4e\x75\x2d\x0e\x1d\xde\xf5\xc3\xfc\xe0\x3b\x47\x51\xc8\x6c\x04\x9b\x9e\x7d\xf9\x83\xa2\x88\xc3\x80\x6f\x79\xb6\x09\x1d\xec\xf1\x13\x82\xa5\x79\x3b\xbb\x2f\xb7\xde\xbf\x39\xe6\xa4\xde\x72\xb0\x95\x27\xac\x46\x63\x9b\xf2\xd6\x12\xe8\x32\x02\x5b\x04\xaa\x6c\x59\x58\x0a\x09\x66\xb2\x7c\x86\x1e\xe9\x8d\xf3\x95\xea\x42\xc0\x10\x0b\x70\xab\xdd\x0f\x9c\xc5\xe6\x2c\xed\xf6\x29\x1e\x9d\x0d\x93\x4b\x8e\x15\x32\xf5\x58\x9c\xd0\x40\x70\xd8\xbc\xfa\x60\x30\x80\x67\x14\x6f\x4e\xb4\x8a\x03\x78\xa2\x2a\x0c\x80\xec\x49\xc3\xa5\x8f\xb5\x03\x52\xc5\x2e\xcc\x62\x14\x06\x5d\xb8\x0e\x4f\xc0\x7f\x38\x4a\x83\xec\x34\xb9\x78\x85\x23\x8a\xc1\x03\xad\xde\x2b\x6b\xf3\xf9\x29\xf6\x58\x2b\xfb\x76\x49\xd9\x27\x5a\xd9\x37\xb6\xf1\x3c\x2c\x8c\x67\x2f\x66\x0b\x6d\x0c\xe8\xd2\x56\xf1\x51\xa1\xe2\x07\x59\x8d\x2e\xc8\xef\x7c\x41\x24\x90\xe5\x95\x66\x24\x20\xbc\x76\x91\x22\xb6\x71\xe5\x6d\x86\xb3\x1f\x79\x72\x5e\x83\x53\xde\xb5\x53\x01\xa6\x52\x06\x7f\x66\x50\x4e\x17\x0c\x28\x5b\xe1\x5d\xba\xc2\x7c\x2c\xd0\x3a\x0e\x68\x19\x03\xb4\xf5\x0f\x2d\x7d\x43\x7b\xbf\x70\x4f\xd0\xa3\xd7\xf8\xea\x65\x32\x9a\x67\x05\x82\x74\xdc\x0c\x89\x0e\x56\x40\x86\x77\x2b\x20\xc3\xfe\x2d\x91\xf3\xf0\xb6\x48\xf4\x72\x65\x24\xda\x29\x23\x11\x07\xf6\x5e\x3c\x9b\x93\x7c\x2b\xdf\x1b\x9e\xfc\xa1\xe3\xc9\x89\xec\x68\x70\x67\x54\xc8\x17\xfd\xc7\x66\x8b\xfe\x79\x85\x85\x7c\xb1\xa4\xec\x53\xad\xec\xfb\x26\x8b\x67\x59\xf4\x4f\x4d\xd6\xce\xb6\xe8\xbf\xd8\x2a\x3e\xae\x5b\xf4\xdf\xaa\x16\x7d\x07\x11\x14\x85\x19\x29\x2c\x7e\x20\x92\xef\x1b\x17\xbe\x29\xe2\x82\xd1\x3f\xc5\x09\xd5\xf3\xfd\xa1\xc7\x4f\xcd\xd0\xe3\xe7\x66\x0c\x86\xbc\x11\x3e\xbd\xf5\x7d\x50\x5c\x05\x05\x6f\x54\xb8\x89\x89\x9b\xa9\x7e\x11\x9b\xbf\x77\xca\xd7\x20\xf3\xfa\xa3\x5d\x77\xd8\xe9\x9f\xb3\xe1\xfc\x5e\x91\x7a\x02\x3e\xf2\xca\x20\x3e\x0d\x2e\x5e\xb1\x26\x8c\xfd\x14\xcf\x80\x53\x8f\x22\xd3\x26\xc0\x57\x98\x32\xa3\x18\xf4\xe9\x4f\x60\xdc\x73\x4e\xc3\x3f\x1c\xd0\x52\x65\x53\x9b\xe8\x62\x86\xb2\xec\x22\x49\x83\x57\x61\x80\xfb\xb5\x25\x8e\x4e\x93\x0b\x16\x2d\x40\x93\x72\xbc\x5e\xb2\x1d\x7b\x3a\x67\xf3\xeb\xb2\xc2\x3d\xad\x30\x0e\x6f\x47\xb1\x89\xad\x5e\x13\x8a\x1d\xdb\x2a\xd6\x52\xec\x34\xac\xd8\xbc\xef\x04\xc4\xfe\x04\xa2\x1d\x86\x85\x8d\x2a\xfb\xba\x4f\xba\x8d\xc2\x65\x2c\x68\x14\x6a\x2c\xe8\x21\x0a\xc2\xc4\xc6\x6b\x26\xa1\xe0\x35\x59\x09\x2b\x73\x99\xd5\x76\xa5\x8a\x8d\x6e\x89\x0d\x73\x6b\xf3\x76\x7e\x22\x58\x52\x56\x3f\x86\x4e\x6f\x8b\x65\xb3\x95\xb1\x6c\x5c\xc6\x32\xba\x7c\x29\x05\xe9\x9f\xc5\x42\x9e\x87\x05\x16\xd2\xec\xed\xfe\x30\x6d\xd2\x6c\xf9\xaf\x56\x58\xc6\xe9\x0a\xcb\x38\xbc\x25\x5a\x6d\xdf\x76\xf9\xb7\x56\x5e\xfe\xa3\x2a\x22\xc3\x9f\x7d\xfc\x09\x24\xe6\x43\x91\xc4\xf0\x9e\xee\x93\xc0\x9c\x35\x5b\xf6\x8f\x2b\x2c\xfb\xc5\x0a\xcb\xfe\xea\x96\xcb\xfe\xf6\xb6\xcb\xfe\x66\xe5\x65\xbf\xac\x5a\xf6\x63\x7c\x49\x50\x8a\xd1\x9f\xb0\xf0\xbf\x17\x17\x5e\xf6\x75\x9f\x4b\xbf\x1b\x9a\xea\x18\x2b\x0f\x6f\xd1\x4a\x6d\x08\xf6\x47\x73\x51\x12\x7b\x23\x94\x62\xb2\x23\x53\x74\xc6\x64\x2f\xac\xd2\x91\x71\x0e\xee\x99\xa1\xfe\xa9\xd4\x85\x35\xd3\xfe\x10\x34\x3a\xfb\x10\xe2\x0b\x2e\x7b\x0a\xf4\x71\x1c\x57\x8e\x83\xc9\xd1\xbf\x57\xe2\xa2\xa2\x14\xae\x3c\x90\xf7\xc1\xcc\x51\x0e\xd3\x62\x4f\x8a\x5b\x37\xb9\xcb\xb7\x7e\x57\x71\x88\x21\x65\x2f\xbd\x09\x26\x47\x74\x60\xcc\x10\x3c\xc5\xf1\x5e\xe0\xb8\x36\x31\x65\xec\xc9\xaf\x17\x57\x7b\x81\x10\x39\x1e\x84\x4a\x8b\xcb\x66\xb7\xa6\x10\x11\xfc\x07\x40\x23\x87\x59\xa7\x32\xfc\x79\x17\xfa\xe5\x2a\xac\x42\xb9\x38\xdc\x0f\x7d\x70\xf2\x31\x9e\x9c\x26\x19\x59\xfb\x9f\xed\x83\xb7\xef\xfe\x67\xd0\xba\xfe\xbf\xb8\x25\xfe\x27\x6d\x60\x5b\x3c\xd6\x90\xcc\x58\x00\x78\x58\x1c\x1b\x97\xdd\x2b\x95\xf0\x4b\x73\x18\x22\x17\x9a\xc6\x70\x3b\xe1\x4a\x97\x8a\x47\x2b\x5f\x2a\xd6\x5d\x6e\xde\x5f\x75\xa9\x78\x5c\x7f\x63\x58\x57\x08\x9f\x2f\x18\x65\xe4\x47\x51\xba\x4d\x9b\x15\xaf\x4a\xd2\x10\xbd\xa1\x59\x46\xf0\xbc\x7a\x94\xeb\x15\x35\x7f\xeb\x4a\xf1\xa7\x5f\x66\x7e\xdb\x1f\x39\x0f\xe1\x4e\xc8\x95\x59\x12\x0e\x0f\x97\x21\x29\x53\xad\x30\xd7\x4a\x4a\x44\x1e\x7b\xfc\x97\x2b\x33\xb2\x29\x4d\x0c\xb3\xa3\x29\x8a\x22\x95\x8a\x66\xb3\xb5\x08\x9f\xd3\x69\xd2\xcc\xad\xd9\xec\x0d\xfd\x2a\xeb\x78\x62\xee\x5a\x9c\x7d\xc9\xeb\xce\xc3\x92\x62\x9a\x02\x9f\xde\xa0\x8c\x28\x5f\x16\x32\xcc\xc9\xed\x67\x8a\x33\x04\x0d\x85\xec\xff\x5d\x9a\xfc\xc1\xde\xe3\x1f\xe2\xb1\x8e\x35\x2f\xaa\xa9\x8a\x24\x4a\xbd\x0a\x01\x70\x15\xa8\x84\xc1\x7e\xec\xe5\xba\x2d\xa5\x0c\x8a\xbd\x7c\x48\x7b\x81\xeb\x00\xa5\x75\xd0\x8b\x17\xb0\x44\x6d\x6b\x24\x91\x83\x6d\x6d\xb7\xa8\xb8\x50\x4d\xf0\x1d\xff\xde\x84\x00\x23\x67\x4a\x7d\xa9\x81\xe0\x53\x19\x04\x4a\xab\x2b\xb0\x2a\x0a\xc5\x86\xf9\xf1\xec\xa5\xb3\xae\x61\x7a\x8d\xa2\x5d\xd7\x64\x6b\x37\x58\xb1\xa4\xc7\x42\x63\x72\x30\x27\x11\x66\xd4\x4f\xea\x50\x0e\xf1\x58\x0d\x53\x25\xea\x6b\xfe\x4b\xcd\x78\xb9\x16\xfa\x53\xc8\x15\x9b\xa6\xc2\x76\xdd\x3e\x5a\xb2\x92\x75\x04\x41\xc3\x6c\x2f\x60\xd6\x11\xfc\x67\xa7\xd3\x8e\xbd\x30\x3e\x38\xc7\xe9\x38\x4a\x2e\xf4\x81\xfe\x56\x3a\x18\x29\xf8\xba\x14\x7c\x4b\xa0\x75\x77\x20\x7d\xb3\x14\x48\xbf\x85\xb0\x57\x06\x12\x57\x03\x37\x83\xd2\xc3\x95\xc0\x54\x05\xa5\x9f\x9a\xd1\x6d\x26\xe1\x46\xc3\xb5\x44\x34\xb1\x26\x82\xbc\x4b\x9d\x36\x23\xe5\xe2\xe5\xbc\x87\xb3\xd1\x0a\x04\xfd\x20\xe6\x6e\x5a\x5e\xe3\x2b\xc7\x5d\xc0\x76\x0f\x1e\x79\xf8\xfc\xd8\x2d\x1f\x0d\x38\xd7\x5c\x49\x49\x93\x30\xc4\x3f\xf2\xde\x6e\x65\xce\x23\xb7\x64\xb4\xc1\x3b\x38\x98\x93\x2c\x0c\x30\x7b\x26\xcd\x1f\x2d\xea\xdd\xb0\x57\x42\xc9\x9c\x98\x3d\x2d\x1b\x34\x13\xca\x1f\xcc\x89\xb4\xfd\xe0\xcb\xfa\x4d\x68\x33\x56\xe8\x35\x38\x9b\x8a\x2b\xf9\x32\x49\x0f\xc6\xf4\x84\x22\x68\xf8\x26\x8c\xcf\x04\x57\x76\x8e\x0d\xab\x98\x9f\x97\x2c\x5f\x91\x94\xb0\x03\xea\x89\x26\x7f\xa3\xb4\xe5\xa9\x66\x18\x22\x0f\xa6\x67\x9c\x95\x62\xeb\xaa\x79\x26\x68\x20\xfb\xfb\xa8\x8a\xfb\xed\xee\x42\xc2\xb7\x51\xd5\x64\x86\x15\x92\x0a\x08\xd3\xe3\x7e\x75\xc9\x63\xde\x08\x5f\xf3\x9c\x67\x78\x5c\x36\xf4\x28\x5a\x5d\xd0\x95\x7c\x02\x7f\x12\x2b\x59\x83\xf9\xbd\x25\xb6\x1a\x36\x72\xc6\x0e\x29\x3a\x4f\xb6\xb4\x6c\xb0\x47\x38\x3d\x0f\x47\xd8\xd0\xf1\xe7\x66\x15\xf2\x40\x4b\xc5\xf1\x72\x8c\x86\x7b\xf9\x4e\x5e\xd6\x16\x3b\xcb\xb4\x37\x77\xb6\x46\x3a\x9d\xb6\xad\xfa\x66\xb7\xbf\xd6\x73\x1d\x20\xcc\xfd\xac\xa2\xcc\x69\x92\x62\x63\xc8\xbc\xbf\x86\x35\x8a\x84\xcb\x3a\x09\x5d\x38\xba\x1a\x8f\xc9\xd7\xe7\x5e\x99\xcc\xde\xfa\x2d\xb9\xcc\x32\x20\x58\x3f\xfa\xec\x7e\x6d\x36\xbb\x1a\x9e\x93\xeb\xfd\xc7\x28\x60\x9e\x42\x8a\x6a\xff\x4a\x9a\xe6\x7a\xbc\x8a\x69\xc7\xb6\xae\x1b\x89\x95\x44\xf3\xc2\x6a\x8c\x95\x78\x24\x39\xb4\xc7\x32\xe7\x89\xc8\x51\x09\x4f\x8b\x94\xe7\x99\x48\x78\x2a\xeb\x7e\x6f\x9a\x4f\x31\x6a\xda\x85\xaf\x0b\xec\xf2\xb3\x92\x69\x55\xaf\x74\xf1\x2b\x98\xdb\xb1\xb4\x87\xd0\x6a\x5f\xc5\x5a\x78\x54\x9c\x68\xef\x71\x65\x59\x39\x31\x4e\x38\x2a\x50\x6b\x99\x75\x45\x46\x10\x09\x47\x2f\xd0\xe8\x2c\x48\x93\xd9\xcd\x0d\x36\x70\xae\x99\xf2\xc3\xa4\x27\xd3\x24\x40\x11\xbb\x06\x80\x6c\x0a\xe8\xb1\xcf\x5c\xeb\xcb\x0c\xe6\xd5\x3e\x9a\x94\x33\xb8\xa7\xfb\x28\xcf\x50\xe6\x1a\x12\x89\x98\xae\xe3\x2c\x9c\x29\x73\xc7\x0a\xab\x9d\xd4\xfb\x58\x65\xb6\x93\x7a\xac\xb3\xbd\xc0\x20\x14\xf4\xf2\x5f\x41\x20\x02\x14\x09\xa6\xf9\x88\xa0\x94\xc8\x6a\x6c\x55\xb2\xef\xb7\x39\x2b\x6f\x6f\xd5\x20\x26\xea\xc6\xa2\x37\xd0\xa8\xdf\xdd\x38\x28\xd3\x28\x06\x93\xdc\xbe\x84\x31\xf9\x18\x09\xb1\xfd\x33\x28\x40\x1a\xa3\x73\x25\x5e\x52\x89\xba\x6d\xb6\x96\x3c\x4c\x82\xab\x72\xea\x38\x49\x98\x23\xbb\xc1\x00\x12\xe4\x9f\x00\x2f\x6f\x18\xca\x0f\x69\x82\xed\x69\x0d\xa9\x2f\xd9\x80\xf6\x52\x0d\xd5\x98\xec\x16\x69\xdc\xa3\xda\x6b\xc5\x46\x49\x7d\x26\x5c\xc8\xc6\xfc\xed\x1f\xfb\x72\x95\x56\x2d\xce\x1f\x08\xba\x26\x51\xe4\x39\xd6\x0b\x77\x8a\xaa\x44\x5a\x51\xba\xa6\x2c\xa7\xac\x7c\xbc\x8d\xfc\x96\x7b\x62\x3e\x39\x91\x92\x7a\x90\x70\x8a\xd9\xc3\x60\x66\xb2\x9e\x4b\x3f\xac\xd9\x45\x3b\x7b\x33\xd7\x34\xa9\x1f\x40\x84\xfc\x9a\x3e\x60\x65\xfb\xb6\x1c\xd3\x8e\x3f\x42\x45\xb7\xa1\xd8\xff\xe8\x54\xf8\x36\xd1\xa8\xcf\xff\xcd\xbb\xeb\x4f\x1f\x8f\xd1\x28\xaf\x9e\xbb\xf7\x88\xf1\x85\x43\x6e\x6e\x98\x7b\x4a\x51\x32\x08\x99\xa9\xe6\x8f\xeb\xe2\x65\x25\x86\x99\xf0\x8f\x94\xf5\x05\x08\x18\xde\x0c\x06\x0b\xee\x07\x04\x26\x5f\xc9\xc8\x24\x46\xe7\x23\xcb\xbe\xd0\xc8\xa6\x49\x40\x11\x72\xeb\x85\x1c\x19\x1d\x80\xc8\x0b\xe3\x3f\xfc\x23\x6f\xf4\xd3\x91\x73\xcd\x5d\x22\xd1\xc1\x9e\x79\xf8\x73\x3e\xcc\x11\xaa\x19\x15\x9c\x23\xdf\xf0\x7a\x83\x4f\x94\x3d\x9e\xdf\x1d\xf8\x40\xfc\x06\x90\x66\xbc\x39\xd8\xda\xd9\xdb\xff\xd1\xef\x0d\x7c\x20\x7e\xf3\x8c\xa3\xf7\xdb\xdb\xbb\x47\x47\xfe\xfa\xc0\x07\xe2\x37\xcf\xd8\x3d\x3c\x3c\x38\xf4\x1f\x0e\x7c\xc0\x7e\x81\x85\x33\x47\x37\x37\xce\x1c\xb1\x00\x41\x70\x8e\x5c\x18\x58\xc0\x68\xf7\xaf\x43\xb4\xa1\xf3\x07\xc2\x91\x70\x38\xe6\x8b\xf0\xf4\x1f\x75\x5b\x43\x7f\x8e\xe4\x54\x74\x77\x3c\xe2\x1d\xb1\x5e\xb2\x3e\x84\x8d\x5e\xb2\x1c\xca\xa6\xcd\xfd\xbb\xb0\xde\x04\x4c\xfa\xf8\xe6\xc6\xd1\xbb\x77\x21\x96\xee\x41\x8c\xd6\xa4\x4b\x11\x73\xd8\xd8\x9c\x9b\xf0\x46\x22\x3f\xad\xe6\x94\x9a\x1b\xb5\x78\x72\x10\xef\xe0\x8c\xa4\x49\xd9\xcb\x93\x70\x39\x58\x05\x24\xe9\x7b\x67\x55\x54\x75\x8e\xbc\xdf\x1e\x3e\x71\x46\x08\x3e\x73\x9b\xef\x28\x4e\x95\x74\x03\xd9\x01\x0c\xe3\xd9\x9c\x64\xfd\x6b\x7d\x84\xfd\x82\x21\xad\xb1\x70\x83\x85\x44\xf3\xd3\xc6\x68\x54\xc2\x22\x2e\xab\xa7\x87\xbb\x74\xdc\x29\x17\x44\xf9\x7b\xfc\x28\xe5\xf9\xc5\x14\xbe\x02\xcc\x73\xed\x2f\xd8\xbb\xfc\xb9\x1a\xd3\x1a\x21\x59\x19\xbf\x1c\xec\xb7\xdb\xd8\x2d\xe2\x4f\x11\x75\x7c\xcd\xb1\x53\x6e\xea\x5d\xd7\xa3\x2c\xb5\xbc\x4b\x59\x52\xf5\xa9\x80\x81\x2d\xb0\xf0\x62\x7c\x49\x0c\x94\x54\x0f\x52\xac\xd8\x98\x43\xb6\x30\x2e\x73\x3a\xbc\xf1\x26\x53\x12\xc3\x40\xd9\xc1\x30\xc3\xe9\x39\x5d\x57\xcd\xa9\x68\x79\xfb\x54\x3a\x62\x55\xa0\xf5\x7d\x6d\x77\xdf\x7a\x9b\xe4\x3b\x63\x96\x26\xe7\xfe\x91\xf7\xdb\xe7\xa7\xce\x35\x49\xce\x70\xdc\xc7\x70\x8c\xe8\xce\xb8\xea\x6b\xad\x49\xd4\x9e\x21\xff\x9a\xf2\xc3\x7d\x70\xc0\xae\xe7\x8c\xc1\xef\x03\xa6\x69\x00\x30\x3b\x4d\x2e\xfa\xe0\xe8\x34\xb9\x00\xf0\x34\x0c\x70\x1f\xbc\x0a\x29\x6b\xc9\x81\xd1\x07\xbb\xec\x2f\x80\xf2\xc9\x51\x1f\x6c\x8b\x5f\x00\xd2\xfb\x73\x1f\xbc\x4d\x52\xda\x0e\xdb\x9c\x7d\x20\x35\xd7\xfc\x7b\x2b\x8a\x64\x52\x6b\x2b\x8a\x00\x9c\xa5\xf8\x3c\x4c\xe6\x59\x1f\xbc\x13\xbf\x00\xa4\x2b\xde\x07\xfb\xf8\x92\x00\x28\xc2\x04\xf6\xc1\x4f\xf3\xe9\xac\x45\x92\x96\x48\x00\x30\x8c\xc7\x49\x1f\xec\xc5\xe3\x04\x40\xa1\x7a\xec\x83\x23\xa1\x83\x84\x22\xb2\x5c\x1f\xfc\xc2\x7f\x00\xc8\x1f\x8b\xf5\xc1\x2e\x57\x5d\xa6\xc9\xc5\x16\x83\x6d\xd6\x07\x5b\xe7\x28\x8c\xe8\xc2\xb6\xb8\x17\x91\x0c\xc0\x59\x38\x3a\xdb\x4e\xa2\xf9\x94\xe6\x53\x68\xb4\x92\xb4\x45\xe1\xd1\x1a\xf1\x54\x0e\x29\xb3\xc8\xb6\xca\x4a\x52\xc2\x3f\xfa\xe0\x28\x49\x89\xc8\x01\x90\x79\x56\x7f\x87\x26\xb8\x0f\x5e\xd2\x9f\x2d\xfa\x1b\xc0\x08\xc9\xd4\x37\x48\x25\x52\x30\xf0\x44\x0a\x0a\x91\x28\xe1\xc5\x33\x24\xcc\x44\xa6\x80\x0d\xcf\xdb\xe6\x1f\x22\x8b\x24\x04\x45\xf4\x67\xd6\x07\xc7\xf4\x37\x4b\xcf\xe8\x88\x22\x82\xd3\x3d\x82\xa7\x19\x1d\x13\xfd\x68\x85\xf4\x0b\xc0\x69\x18\xf3\x78\x4e\xe0\x6d\x18\xb7\x84\x0b\xa6\x29\xba\x94\x89\xe8\x52\x25\x16\xef\x45\x7d\xf0\x02\x4f\xc2\x98\x42\xbe\x95\x8c\x5b\x6f\x69\x7e\x6b\x5b\x0a\xa7\x0a\xd7\x99\x3e\xd8\x8d\x03\x4b\x31\x0d\xc0\x6f\x71\x3c\xd7\x1e\xd3\xd8\x97\xa4\x35\xc5\xf1\x1c\x40\x14\x45\xa2\x16\x47\x34\x1c\xf4\xc1\x56\x14\xa9\x52\x99\x48\x05\x30\x0b\x27\xf1\x2c\xc9\x08\xb7\x87\xef\x83\x23\xf1\xdd\x92\x16\xf5\xb2\xc0\x36\xdf\x22\x2a\x5f\xec\x15\xb1\xa3\xfb\x40\x1d\x27\x01\x26\x28\x8c\xde\xa1\x18\x0b\x30\xb0\x3f\x74\x6e\x69\x72\xd1\xe2\xb9\x99\x5e\x4c\x9f\xbe\x51\x24\x0b\x63\x26\x6d\x8a\xb8\xae\x49\xdd\x10\xe8\x28\x68\x8e\x98\x06\xb3\x4f\x12\x0c\x3b\xaf\xc2\xb1\x9a\x62\x73\xb9\x0e\x52\x79\xaa\x12\xef\x70\x57\x9d\x59\x5a\x25\x0e\x85\x16\xdd\xd5\x6c\x6c\x4a\xb8\x18\x20\x82\x26\x69\x18\x70\x74\xd1\x6a\x08\xfc\x09\x42\x14\x25\x93\x62\xb9\x1d\x96\x5a\x6e\x9f\xaf\x4b\x8b\x23\x22\x23\x2c\xf3\x69\x7c\x84\x67\x28\x45\x24\xd1\x5b\xe7\xab\xda\x4a\x71\x16\x7e\xc6\xad\x53\x14\x07\x74\x8d\x0a\xe5\x0d\x2c\xd9\x4f\x48\x2b\xc6\x94\x22\xa0\xf4\x4a\xba\xfc\xa7\xc4\xb8\x25\x85\x36\x42\xbb\x58\x56\xb2\x0a\x82\xd8\xe2\x91\x63\xe8\x54\x30\xa5\x09\x72\x1a\xb2\xcc\x69\x42\x0b\x05\x8c\xeb\xcb\xcb\x48\x84\x12\x33\xcc\x33\xca\x85\x78\x0b\x3b\x88\xe0\x26\x4d\xf2\x23\xc6\x28\x4d\x13\x58\x69\xd8\xba\x3e\xda\x7d\xb3\xbb\x7d\xbc\xbb\xf3\x71\x67\xeb\x78\x77\xa1\x57\x97\x94\xe2\x6d\x12\x93\x53\x8d\x70\x4c\xe9\xb7\x5e\x50\x90\x0d\x51\x4e\x12\x91\x52\x31\x4a\x92\x44\x19\x46\x9d\x4a\x05\x64\x0f\x3b\x78\x84\x02\x9d\x54\x05\x2c\xa1\xd8\x96\x2c\xc6\x1a\x2b\x17\x11\xe3\x90\xa5\xe4\xb0\xca\x05\xf9\x86\x61\x23\x3b\x66\xc7\x88\x38\x6c\xd8\xf8\x60\x8b\x9c\x62\x79\x82\xf0\xa4\x56\x98\xb5\xae\xb7\xb7\xde\xec\xee\xef\x6c\x1d\x7e\x7c\x7b\xb0\x7f\xfc\x6a\x51\x6e\xef\x37\x8c\x52\xa3\xb9\x2b\x8c\x52\xb3\x35\x9a\x62\x36\xf6\xdb\xee\xd6\xe1\x02\xc0\xa2\xc1\x48\x1f\x30\xfa\xd9\xe2\x0f\x08\x03\x0f\x40\x19\x6c\x7b\x1f\x9d\xff\x98\x26\xf3\x59\x01\x7b\x64\x76\x2b\x46\xe7\x21\xf7\xe8\xdf\x9a\xd0\x72\x46\xcd\xe5\x95\x00\x94\x57\xf6\x23\x82\x67\xfb\x09\xa7\xd4\x74\x40\x74\x9b\x64\xfc\xc3\x2c\xb4\x2d\x4f\xdf\x6d\x79\xea\xea\xb9\x47\xf2\xd4\x95\xaf\xf1\x0a\xb5\xd9\x49\xab\x0e\x5c\x3d\xe7\x5d\x9a\xd0\x9a\x8c\x76\xee\xc5\xad\x59\x9a\x4c\x52\x76\x6c\x8f\x92\xe9\x30\x19\x26\x97\x3b\x98\xb6\xd7\x07\xfc\xaf\x22\xd9\xad\x44\xbc\xd4\x94\xe5\x8e\x30\x4a\x47\xa7\xb4\x9d\x6f\xd5\xcf\xd6\x38\x49\x5b\x2c\xba\x25\xce\xd8\x6f\x70\xbd\xb7\xff\xee\xfd\xf1\x02\x7c\xab\xd5\x13\xc4\x53\xae\x68\xa1\x55\x79\x6e\x1c\xa9\xb3\x42\xe6\xed\x27\x87\x38\x9b\x47\x24\xa3\x60\xa3\xb4\x88\xfe\xce\xb3\x0f\x18\x63\xc5\x4f\xa7\x99\xe0\x25\x24\x19\xcc\x89\xac\x3a\x1c\x0f\xc6\xe6\x49\x69\x2b\xbc\x1b\x07\xb4\x18\x3f\x24\x6c\x05\x0e\x93\x0b\x71\x66\x4a\xf6\x8c\x51\x78\x2b\xc9\x36\x6a\x65\xdc\xec\x4d\x60\xf6\x28\xc5\x98\x52\x57\x7a\x2e\xb4\x08\x6b\x62\x94\x4c\xa7\x28\x0e\xb2\xd6\x14\x5d\xb5\xe2\x84\xb4\x2e\x92\xf4\x8c\xc1\xf4\x3c\xc4\x17\x74\xc8\x92\xbd\x96\x3d\xc1\xd6\x2c\xc2\x28\xc3\x8c\xd2\x5e\x25\xf3\xb4\x95\xe9\xed\x7e\x9b\xb5\x86\x69\x72\x91\xd1\x53\x25\xc0\x94\x22\xd3\x74\xbe\x91\x78\x03\xb4\xc5\x24\xc3\x41\x6b\x78\x65\x52\xea\x14\x67\xb3\x24\xce\xc2\x73\xac\xb0\x9d\x03\x7b\x3f\xdf\x16\x9c\x01\xb0\x94\x14\x07\x78\x7d\x51\xa5\x98\x2b\x36\x2b\xd5\x6b\x75\x95\xca\x3d\x14\x6a\x5d\x84\x9f\x51\x1a\x54\xed\x9b\x3c\xd7\xdc\x35\x86\xc5\x3e\x63\xc5\x5b\x33\x65\x70\xae\x1b\xeb\x0b\xa4\x53\x99\x0b\x38\xbe\xfd\x15\xf6\x23\x0f\x9a\x9c\xf9\x33\x64\xbd\x81\x8e\x50\xc4\xdd\x9b\xd9\x6f\x3a\xaa\xba\x88\x02\xc3\x63\xd3\x38\xe6\xd7\xf5\xc2\xec\xcb\x85\xda\x9d\xf3\x0c\x5f\x55\x3a\x35\x36\x6a\xa9\x1a\x2c\x7e\xea\xbd\x3b\x1f\xbe\x5e\xc0\x58\xce\x82\x8e\xc9\x21\x2e\x4c\x7d\xe5\x44\x4f\xbe\xea\xee\x74\xe2\x72\xec\x52\xec\x5e\xa7\x7e\xea\xa5\x98\xc5\xb0\x71\xc0\xb5\x1e\x94\x68\x01\x5c\x48\x4e\xf0\xc0\x5d\xb8\x30\xbd\xe7\x3b\xa0\xbc\xfb\x95\x41\x17\xe3\x8b\x16\x5e\x40\x79\x49\xa4\x95\xc2\x00\x07\x7b\x71\x1f\xa4\x49\x42\x80\xbc\x22\x9e\x23\xbf\x0b\x27\x88\xc9\x21\x8e\xbc\x83\xe8\x9d\x03\xde\xef\xef\xfd\xfc\x7e\xf7\xe3\xde\x0e\x70\xe1\x15\xf2\xaf\x45\xdd\xfe\x04\xc1\x79\x86\x5f\x56\x75\xc9\x65\xb0\xc1\x1a\x78\x70\x8e\x1e\x3c\x58\x2c\xe0\xf4\x0b\x89\x39\x47\xd3\x99\x7f\xe4\xfd\x3a\x9b\x56\x8b\x86\x57\xf7\x42\x73\x9a\x64\xe4\x03\x4a\xb3\xfe\x3a\xfb\xf9\x22\x8c\x29\xdb\x9f\x15\xbc\x69\x8b\x17\xc0\x16\xc7\x03\x86\xb7\x81\x76\xd7\x5d\xc0\x78\x22\xaf\x4d\x6a\x74\x24\x85\x01\x1e\x45\x59\xbf\x07\xcf\x69\x5f\x5d\x28\xad\x78\x0a\xfd\x48\x75\xc9\xcb\x6f\x88\xd2\x26\x76\x99\xc8\x2c\x1e\xa1\x59\x36\x8f\x78\xbc\xf6\x75\xc8\x59\x8d\x1d\x4c\xc4\x99\xd7\x95\xeb\x3c\x2c\x8a\x6b\x95\xdb\x05\x1f\x84\xb1\xd4\xee\x63\xfe\x50\xdf\x17\x71\xaf\x20\x56\xcf\xef\x7d\x30\x12\xbf\xc0\xc2\x19\xa2\x9b\x1b\x67\x28\x44\xb1\x43\xe4\xc2\xed\x52\xeb\xc2\x79\xb2\x0f\xc4\xbb\x68\xda\xd6\xdb\x79\x44\x42\x1f\x4c\xe9\x1f\xb0\x70\xb6\x69\x2b\xdb\xa2\x95\x6d\xe4\xc2\x2d\x8a\x8b\x47\x05\xa9\x33\xf3\xbb\x5e\x20\x5a\x61\x20\xe5\xb6\x0a\xe0\x7b\x81\x8a\x99\xcb\x7d\x09\x0c\x91\x9a\xa1\xa8\xc4\x02\x03\xe4\x5e\xa6\xf5\xa8\x45\x2c\x21\x99\xe1\x58\x7d\xe4\x8f\xf9\xf5\x98\xbb\xbc\x73\x08\xd6\x0a\xb1\xc4\xb4\x61\xd0\x6d\xfe\x01\x35\x25\xbf\x19\x49\x11\xc1\x93\x2b\x7f\x1b\x49\x90\x15\x26\xb6\x9d\xcc\x63\xe2\x6f\xa1\x07\x0f\x04\x11\x9d\xa1\x18\x47\x99\x7f\xbd\xb0\xd0\x6b\x9e\x57\x22\xa7\x7c\xef\x31\x97\xf6\x32\x8a\xb7\x4e\xe8\xb4\x66\x5d\x33\x86\x36\xd1\x02\xfd\x8b\x12\x27\x64\xa0\xf9\x42\xcf\x30\x39\x12\x53\xa8\x3c\x23\xd4\x1c\x71\xc1\x85\x3a\xf7\x61\x93\xda\x7c\x87\x9a\x7e\xf8\xb1\x85\xe4\x52\xb4\x50\xde\xe0\xe5\xd8\xf0\x40\x2e\xf3\xc2\x88\xeb\x72\x10\x05\xac\x33\xc3\x8d\x3d\x0a\x78\xe2\x3d\x1c\x25\x9d\x8e\xfe\xb5\xa1\x43\xf4\x04\x0f\x38\x71\x45\x32\xe0\xbc\xb9\xb4\x2e\x2c\x94\xe6\x78\x48\x0a\x42\xd0\x8a\x91\xe6\x31\xd7\x8d\x88\x84\x6d\x5b\x9b\x1b\xb1\x0c\xa1\x24\x17\xc4\xd7\xd0\x4e\xf7\x5d\xbe\x15\x45\x02\x5c\x15\xa3\x8b\xf5\x10\xca\x74\x17\xd5\x0c\xaf\xd8\x80\xda\x77\xf9\x14\xcd\x4e\x2b\x23\x85\x30\x5c\x10\x1e\xeb\x69\x41\x6b\x10\xf1\x32\xbe\x7a\x61\x30\x90\x9b\x7b\xa1\x07\x55\x36\x30\x63\x09\x0a\x1a\xdd\x16\x62\x3e\xe4\xbd\xe6\x7e\xfb\xbd\x71\x18\x07\x95\xc1\xe8\xbd\x30\x58\xb8\x0b\xd7\xce\x49\xf0\x72\x01\xbf\x0f\x69\xb8\x4d\xe7\xb1\xc8\x03\x1d\xc0\xb3\xdb\x73\x7d\x0a\x05\x19\x6a\x7e\x40\xc6\x2a\xf3\xdb\x6b\xc6\xb2\x7e\xc3\xde\xaf\x05\x12\x27\xa0\xe0\x5a\xc8\x8f\x74\xd2\x23\x5a\xa8\x09\x2a\x61\xe9\xcf\x9b\x85\x33\xec\x38\x5d\xb8\x83\xbd\xf7\xae\x0d\xba\xa4\x00\x54\x3d\x27\x0c\x28\xd4\x29\x50\x57\x23\x4e\xf9\xb4\xb4\xd2\x5f\x90\x4a\xe4\xfd\xcb\x8e\xb4\x98\x2f\x78\x1a\xca\xe0\x9c\x72\x3f\x36\x27\x0b\x85\xe6\x75\xdf\x58\xcd\x7a\x68\xb8\xb5\xf3\x2e\xf4\x0a\x0d\xfb\x68\x72\x10\x14\x7a\x29\x56\x71\x70\x83\x7e\x4a\x79\x55\x4a\xa5\x02\x4e\x32\x95\x54\x05\xfe\x7f\x71\x75\xce\x47\xe4\x83\xae\xb7\x9e\xb5\xe8\xb5\x7b\x2d\x8c\xd7\x98\xb5\xf0\x05\xf2\x4f\x9c\x2e\xfc\x19\x7b\xbf\x7e\xe3\x3a\xc0\xe2\x14\x49\x64\xe3\x43\xd7\x01\x7d\x11\xc0\xe6\x64\xe0\x0e\x5c\xa8\xd5\x93\xba\x36\xbd\x30\xc3\x62\xff\x79\xeb\x3f\x2a\x39\x79\xe1\x3a\xd7\xf2\x0d\x0f\xe0\x8f\x7e\x20\x7f\xbc\xc4\x78\x4d\x5e\xea\x0f\xe2\x3a\x1f\x11\xd4\xaa\x88\x22\xe0\x3f\x60\xe1\xba\xb4\xeb\x01\x7c\xf5\x37\x1c\x37\xd4\x3a\xf9\x0f\xed\x81\xf6\x54\xdb\xc9\xf2\xb6\xbb\x50\x55\x61\x41\x56\x14\x80\xde\x36\xb7\x6f\xe0\x41\xef\x4b\x64\xde\xb0\x2f\x2b\xb1\xcc\xc2\xbe\x55\xf2\xcd\xe1\x98\x4b\x8c\x64\xb2\x88\xe0\xf2\x31\x0c\xfc\xb0\x82\x63\x66\x3b\xe1\x40\x67\x9b\x55\x8a\xa6\xde\x3e\xf2\xce\xa5\x5f\xf6\x82\x73\x2f\x7f\x88\x54\x34\x1b\x75\x22\xb5\xbb\x96\x93\x25\x5c\xa2\x93\x0e\x2d\xda\x68\x35\x7c\x6c\xd8\x38\x50\x24\x6b\xca\x62\xf8\x56\x88\x79\x85\x73\x4e\xde\x0b\x5c\x75\x84\xfd\x81\xbd\xa1\xf5\x08\xc3\x8c\x4a\x69\x95\x1d\x42\x8f\x2c\xfb\xca\xe4\x47\x82\xbc\x78\x98\x30\xae\xaa\xa6\x93\xfa\xd5\x6a\x1a\x14\xdc\xa8\xaa\x1c\x57\x18\xb0\xac\x39\xe8\xf3\x0e\x3b\x1d\x9c\xf7\x6c\x7c\x78\x42\xa4\xce\xc4\xe4\x6d\xca\x35\xe5\x59\x52\xfd\xc9\xf2\x04\x73\xda\x68\xa6\x55\xed\xbb\xd0\x1c\x92\x9c\x91\xfe\xbb\x3c\x20\x95\xd3\x68\x3c\x56\xf8\x55\x34\xdf\xec\x28\x2f\x1e\x7f\x35\x33\xd7\xa3\xd5\x56\x3b\x09\xb5\xad\x15\xb7\x71\x97\x51\x10\x0b\x84\x40\xb3\xb3\xe8\x19\x31\xc0\x4a\xfe\x18\xab\xf9\xbd\x82\x70\x84\xad\xc1\x5a\x2e\x24\x13\x77\x76\xe6\x85\x24\x4f\x64\xd6\xff\xd6\x9a\xec\xb1\x41\x1f\x00\x63\x38\x65\x47\x7f\x8d\xc7\x23\x04\xd2\x6b\xba\xd8\xee\xdb\x8a\xd6\xa5\xc3\xbf\xc6\x8d\x0b\x17\x94\x79\xdb\x26\x57\xa2\xd1\x82\xea\xa5\x91\x16\x35\xda\x36\x72\x6c\xf4\x96\x51\x17\x47\xbe\xbb\x28\xd0\x68\x99\xcc\xff\xca\x16\xaa\x57\xbb\x7b\x7b\x16\x47\x18\x76\x8d\x11\x33\xa2\x7f\xf8\xc4\x39\x53\xbf\x4e\xd5\xaf\x09\x72\x6f\x2b\xc5\x63\x93\x02\x83\x01\x14\x2b\xf7\xf3\x1c\xa7\x21\x36\xa5\x73\x30\x16\xf6\xea\x1b\xd2\x7c\xf7\x68\x9e\x38\x31\x9c\x22\xf8\x88\xdb\xec\x32\x91\x5a\xf8\xe3\x5b\xe6\x05\x74\xfb\xf0\x95\xe3\xb2\x58\x5d\x56\xa7\x9e\x7e\x4a\x07\x7b\x57\xa9\x20\x1f\x37\x97\x07\x4a\x93\x35\x49\x1c\xb8\xb9\x9a\xc2\x33\x86\x17\x3b\xca\xaf\x90\x1e\xe8\x5a\x2d\xa9\xad\x0a\xb7\xf4\x01\xaa\x0c\x18\x2c\x60\x32\x27\xbc\xaf\x02\xba\xf4\xed\xd5\x05\x36\x2e\xe0\x18\x23\x32\x4f\x71\xd6\x3f\x39\xf2\x3e\xbe\x88\x9d\x93\x53\x04\xaf\xd0\x80\xbd\x43\x38\xde\x19\xd8\x44\x9a\x23\x29\xd2\x5c\xe7\x22\xcd\x87\x90\x05\xe0\xa1\x6b\xf8\x08\x72\x9b\x78\x1e\x56\x3d\x44\x6b\x11\x93\x39\x02\x4a\x3b\x52\x2e\x7f\x04\x23\xfe\x16\x98\x8b\x65\xd3\x35\x1e\xa5\x4c\xab\xf8\x10\xaa\x07\xc3\x03\x78\xd2\x2b\x7a\xff\x96\x46\xd3\x50\x85\x0b\x57\xaf\x70\xec\x45\x55\x7c\x95\x87\x90\xf1\x18\x9a\x27\x27\xf1\xa4\x82\xc5\x69\xd7\xfd\x84\x73\x87\x8c\x3d\x73\x8c\xb6\xc1\x08\x93\x74\x16\xf6\x9d\x9b\xa1\x03\x14\x73\xf7\x8d\x9a\xb7\x03\x20\xe2\xd1\x97\xaa\xf3\xb2\xb6\x86\x63\x16\xce\x8c\x37\x2c\xcc\xde\x01\xb7\x79\x62\x2e\x27\x78\x57\xf8\x72\x14\x21\x4e\xf6\xd7\x46\x61\x3a\xa2\xfd\x96\x5a\x62\x62\x5e\x61\x9e\xac\xb7\x26\x1d\x3c\xe4\xcd\x31\x67\x83\xd5\x0d\x49\xe1\x70\xde\x56\x9a\xb0\x99\xa6\x78\x12\xe6\xf0\xe5\x12\xf7\x7c\x89\x4b\x24\xd8\x58\xec\x2a\x2c\x69\x00\x7b\xd9\x9c\x2d\x8f\x19\xee\xe7\x25\x06\x4d\x84\xee\x59\x2a\x9f\x03\x75\x61\x92\xc2\xde\xf7\xb0\xf7\xcc\xea\x0b\x7a\xeb\x4d\xe2\xf4\x94\xc3\x69\xd3\x47\x28\x7f\x11\xc2\x1d\x0e\xf7\x60\x0f\x12\x4e\x9c\x29\x61\x09\xd4\xb3\xca\xfe\xc9\x99\x77\xf0\x18\x9e\x79\xd3\x33\x98\xa0\x01\xa4\x2c\x25\x4f\x3c\x1f\x94\xc4\xfd\x01\x22\xa8\x7f\x8d\xe4\xf9\xde\xbf\x40\x8b\x6a\x15\xc0\x9b\xaf\x51\x1f\xa3\x2d\x54\xae\x8b\xd1\xd6\xe6\xaf\xd5\x9a\x5c\x7e\x8d\x20\xab\x8b\xba\x70\xd7\x03\x4a\x3c\xfb\xf8\x0a\x14\x56\xbf\xdf\x41\xa7\x3d\x3a\x4d\x46\x09\x1d\x55\x6e\x5e\x6d\xdc\x62\xb6\x65\x3e\x73\x96\xeb\xb7\x7b\x96\x1b\xa7\x6a\xa3\xfe\xe2\xa9\x8a\x55\x99\x0d\xc7\x93\xad\x31\xc1\x29\x37\x0b\xc2\xa3\x33\x5c\xe6\x1c\x05\x8f\x6f\x1d\x9c\x08\xfe\xa9\xf5\xc3\x44\x52\xf7\x21\x7d\x2a\x99\xd9\x4b\xd0\xef\xae\x22\x78\x50\x31\x9b\xe9\xcd\xb9\xa8\xdd\x9a\x0f\x73\x06\x2a\xf6\xf2\x39\x88\x8c\x21\x76\x74\xb8\x7a\x34\x2f\x23\x2f\x23\x74\x9e\xa4\x6d\xdf\x4f\xbd\x31\xfb\xd9\xe9\x38\x71\xd5\xd2\x75\x21\xf1\x02\x86\x3d\xf2\x32\xee\xc2\xca\xc2\x3d\x77\x61\x13\x5b\x8b\x25\x12\xd8\xbe\x64\x95\xf4\x31\x72\xa6\x9c\x0f\x72\x95\x77\x14\x3a\x5c\xbc\x79\x9c\x43\xe3\xce\x1c\xf7\x91\x97\xbd\x38\x90\x0c\xf6\xef\xa8\xf6\x55\x85\x5c\xee\xbd\x15\x88\x9c\x11\x0f\x70\x8c\xe1\x39\x86\x93\xbf\xe0\x91\x12\xcc\x50\xfe\x4e\xe9\x18\xdd\x57\x68\x44\x34\x9b\x45\x57\x3c\x49\x49\xea\x5d\xd7\xcb\xb8\x83\xf6\xb7\x49\x80\x23\x21\xa2\x0c\x3f\x63\xbf\xdd\xb3\x46\x43\x44\x52\x8f\xa5\xd9\xfc\xd4\x50\x10\xa1\x53\x92\xd6\x25\x2c\x9c\x3f\x4d\x9f\x60\xc2\xc3\xd6\x1e\x8c\xf7\x62\xc9\x5e\x49\xb9\xb6\xbd\x1c\xe5\xdd\x4b\x92\xef\x3f\x4f\x7f\x11\x38\x1f\x1c\x2d\xfe\xab\x0b\xb5\xbe\xe8\xd0\xdc\x3c\xd4\x24\xcc\xb5\x01\x36\x4d\x60\xbb\xbb\x92\x42\xa0\xdc\x71\xb9\x56\x69\x00\x2e\x6c\xf7\x24\xcc\xec\x0b\x2a\x84\x3a\xf4\x72\xfc\x92\x1b\xef\xf3\x38\x22\x8d\x34\x2e\x65\x3d\xa7\x8a\x69\x30\x44\xca\x8a\x42\x3d\x84\x29\xe8\x53\xad\xfa\x5a\xed\x0c\xe1\xa6\x66\xf8\x38\xd9\x67\x2f\x05\x6a\x97\xb3\xed\x34\x5e\x50\xf7\xe6\xc6\xd4\x48\x89\x30\xdd\x06\xba\x29\xfd\x0a\x1d\x93\xea\xbf\x34\x8f\x30\x70\x5d\x1e\xc1\x3d\x13\xa2\x21\x66\x4a\xa2\x8b\x3b\x92\x73\x9c\xa6\x61\x80\x05\xc8\x97\xcc\x63\xa9\xda\xb5\xa0\x75\x6d\xfb\xbe\x6e\x08\x60\xd3\xae\xc6\xee\x75\xcc\x0d\x04\x7e\x28\xdb\x0c\x6c\x92\xc2\xbc\x63\x3a\xa7\x7e\x5e\x30\xce\x15\xc9\x71\xae\x6f\xd4\x94\x8d\x7c\xef\xfd\x12\x92\x53\x36\xf5\x65\x2a\x65\x9b\x55\x83\xa6\xd1\x2c\x81\x51\x57\x5d\xab\xde\x1a\x48\xb2\xab\xc9\x57\x63\x5d\x7a\xde\xa1\x43\x98\xa4\x51\x43\x09\xeb\x5e\xa1\x54\x69\x39\xaa\xea\x16\x29\xe6\x4a\xeb\x6a\xde\xdc\xd0\x43\x2c\x9e\x6f\xae\x34\x4f\x7c\xd0\x2b\x02\x68\x2b\x8a\x5e\xce\xc9\x3c\xc5\x77\x56\xf0\x97\x46\xf0\xdc\x32\x80\x7a\x75\x3e\xd1\x61\x88\x39\x0c\x2d\xeb\xb9\x02\x61\x29\x19\x38\x95\x88\x4a\xaf\x11\xc5\x35\xd7\xb0\x16\x9f\xe8\x61\xa3\x2f\xf7\x46\x1b\x4b\xa1\xb1\x61\xa5\x20\xfa\xef\x42\x4b\x96\x36\x04\x58\x8b\x9e\x5d\x5d\x9e\xad\xed\xcb\xd5\x40\x24\x29\x6f\x0d\x28\xca\x60\x92\xc6\x22\x3a\x88\x1a\xa2\xb3\xa7\x63\xbe\x83\xdd\x0d\x22\x69\xbe\x0d\x27\xf9\x6e\x32\xfb\x27\xd5\x10\x24\x45\x08\x96\xc9\x8f\x30\x26\xae\x00\x91\x75\x0c\xb8\xc2\xc8\xa7\xb4\x7e\x3a\x5c\x59\x3f\xfa\x76\xaf\x45\xa1\xa5\x7b\x3c\xdf\x28\xdc\x7a\x46\xec\x28\x83\x9e\x54\x70\x43\xcd\xba\x4b\x71\x30\x1f\x61\xc7\xbc\xa5\xe6\xb4\x56\x46\xa7\xd2\x30\x66\x13\x3f\xe8\xf5\xf1\x02\x76\xad\xa3\xc8\x79\xad\x3b\xf7\xdf\xee\xb1\xa3\x8b\xa9\x3b\xb4\x3e\x79\x24\xea\x0f\xc8\x85\x07\x65\x06\x1d\x92\x3f\x99\xe7\x9d\x99\x2c\xac\xcf\x94\x9e\x5b\x51\xa4\x52\x0c\x05\x28\x65\xd9\x4d\x9b\xa2\x63\x04\xb1\xf7\x91\x93\x27\xf6\xbe\x44\x33\x2a\xe2\x17\x72\xec\xe5\xb9\xbe\xad\x6c\xe1\x46\x5d\x11\x7a\xbc\xee\x24\x2c\x18\x6e\x68\x85\x9d\x06\x36\x23\x0d\x4f\xf4\xb2\x19\x51\xb1\x56\x23\x0b\x95\x2f\xc6\xe3\x99\xc3\xb5\x74\xab\x99\xee\x70\xbe\x9a\xe6\xd0\x75\x69\x68\xd3\xd3\x94\xcd\x2b\x8c\xc4\x56\xad\x11\xe4\xcc\x41\xd6\xd9\x48\x16\x7a\xb4\x90\xea\x78\x93\x93\xbc\x32\x32\x32\xb1\x8b\x60\x09\xc5\x4d\xa1\xaa\x14\x36\x35\x87\x15\x9b\xa6\x9e\x73\x5b\xdd\x4e\x4e\x63\xd7\x34\xa3\xb2\xd2\x65\x94\x1b\xa4\x7c\xc6\xde\xa5\xeb\xb8\x8a\xcc\x9c\x21\x75\x85\x27\xb6\x2b\xbc\xe2\x80\x1c\xee\xa2\xe2\xc8\x8b\x1f\x7f\x76\x88\xeb\xba\x4e\x7c\x73\x43\xdc\x05\x24\x95\x36\x4d\x44\xd9\x34\x11\xc3\xa6\x89\x2c\x1c\x8d\x4e\xbd\x43\x14\x27\x74\xbb\x64\x2c\xa3\x66\x64\x16\xce\x4a\xad\x29\x23\x4c\x0e\x71\x37\xe2\x56\x18\x67\x04\xc5\x23\x9c\x8c\x5b\xaf\xb1\xb7\xbf\xb7\xe9\xc4\xde\x14\xa5\x67\x5b\xd9\x71\x32\x1f\x9d\xe2\x80\xc9\x86\x78\xca\x4e\x98\x92\x2b\xf6\xcd\xd1\x87\xa9\xe4\xb7\xe2\x80\x79\xeb\x0e\x69\x96\xdb\x2f\xb6\x38\xba\xe8\x74\xde\x21\x27\xa6\xac\x1b\xed\x7c\xbf\x4e\x4e\xb6\x8c\x2a\x63\x98\xc2\x10\x22\x18\xc1\x04\x66\xbc\xf6\xc8\x42\xa2\x47\x3e\xd1\x6e\xb1\xa9\x28\xee\x7a\xb3\x08\x91\x71\x92\x4e\xf7\x02\x1f\xc3\x51\xc1\xd2\x27\x85\x23\x0a\xb1\x29\x7b\x63\xb8\x8f\xa6\xd8\x0f\xe1\xc8\x8b\x27\x8c\xc7\x62\x89\x3e\x82\x23\xc9\x79\x49\x83\x9f\x08\x8e\x4c\x43\x9c\x1e\x2d\xa3\x89\xaa\x32\xff\x64\x00\x47\x16\x2a\xac\xfa\xaa\x95\x74\x18\x23\xda\x2c\x27\xc9\xe5\xe6\xb7\x48\x7d\xb4\x32\x47\x6d\xab\x25\xe6\x40\x4b\x7b\x8a\xe9\x3f\x24\xe1\xf0\x72\x5c\x4b\x8f\xb4\x44\xd9\xa4\x68\x45\x43\xa2\xb2\xa0\x22\xaf\x57\x10\x50\xe8\xda\x7a\x4d\xd7\xdf\xc4\xa2\x88\xa4\xe1\x64\x82\x53\xca\xd6\x25\xe9\x74\x9b\x83\xea\x03\x0f\x74\x17\x26\xf1\xde\x98\xdf\x20\x35\x43\x23\x73\xe1\xed\x56\x2b\xed\xae\xe1\x2a\xe7\x38\x61\x7e\x30\xf3\x03\xdf\x84\xaa\xb4\x2c\xd7\xb1\xc5\x9b\xcd\xb3\x53\xc7\x2c\x27\x38\x2d\x83\x94\xd9\x8c\xa4\xbd\x28\x1c\x13\x87\x32\x0b\x87\xf4\xe6\x6b\x13\x18\x2b\x0a\x30\x71\x08\x5c\x77\x61\xea\xc7\x27\xdd\x01\x0c\xfd\x98\x1e\x73\xe0\xc3\xd6\x9b\xbd\x1d\xe0\xfb\x7e\xda\xe9\x80\xbd\x7d\xf5\x19\x76\x3a\xb8\x08\x00\xeb\x21\xc8\x4d\x77\xf2\x91\x33\xf7\xff\x86\x7d\xf1\x8a\x92\x5e\xcb\x1d\x5b\x9f\xb1\x29\x07\xd6\xfc\x8e\x58\xe0\xdf\xe4\xd6\x5f\xb1\x14\x85\xa9\xe7\x47\x98\x42\xb5\x17\xd8\x3b\xb5\xa1\x9a\xd3\x85\x67\xde\xfe\x4b\xd7\xc1\x1a\xf5\x71\x3b\x1d\xc2\x39\xf6\x60\xe1\x5a\xd7\x49\x9b\xa2\xae\x47\xf7\x62\x44\x7b\xde\x8d\x30\x65\x4d\xbc\xb1\xf4\xb2\xaa\xc9\xdb\x1a\xe1\xb5\xdd\x68\x46\x17\xbe\xb1\x62\x8c\x72\x9b\xb8\xa8\x0e\xbf\xb7\xe8\xf6\xe2\xf6\x37\xc3\x50\x8a\xdb\x73\x6b\x97\xd7\xd8\xbb\xec\x72\x2f\x91\xe2\xf3\xed\xa7\xfc\xf3\xe0\x3e\x6c\x61\xc4\x32\xe6\x96\x30\xe7\x21\xbe\xf8\x79\x8e\xf5\x97\x79\x39\xe7\xa3\x4c\x60\x7e\x1c\x3b\xf3\x54\xfa\xac\x53\xf6\x2f\xb1\x69\xff\xa2\x2f\x93\x1f\x7b\xcc\x93\xc9\x7d\x5b\xbf\xd4\x98\x96\x7c\x3a\xf8\xe3\x5f\xd3\x92\x7f\x4d\x4b\xfe\x1b\x4d\x4b\x26\x5f\xaf\x69\xc9\xab\x3a\xd3\x92\xc3\xd2\xfb\x4f\x7a\x90\xfa\x20\x66\x9e\x9d\xb0\x77\x34\x1f\x4e\x43\xe2\x83\x8c\xfd\x05\x0b\xe7\x10\xdd\xdc\x38\x87\xe2\xed\xe7\x21\x72\xe1\xcb\xd5\x74\xce\x45\x43\x77\x1e\x45\x59\x9a\xb8\x17\x18\x5b\x61\xe0\x4e\xb7\xad\x7f\x88\xd8\xd0\x94\x7e\x7a\x1a\x8a\x90\xbd\x76\x2b\x80\x1a\x3e\xaf\xdc\x42\xde\x8b\x4f\xfb\xe1\x93\x5e\xe9\x82\xaf\x5e\x4c\x2e\x65\x4f\xf4\x69\x2b\x23\x6d\xf9\x5d\x62\x5a\xee\xa8\x55\xde\x47\xda\xd9\xb5\xaa\xa3\x3e\x3a\x22\x8d\xbe\x69\x36\x2a\x4f\xeb\x8e\x11\x71\x60\xd5\xfb\xcd\x26\x56\xd8\xb8\x8b\x3c\xe0\xf5\xde\xd9\xa5\x53\x20\xd8\xae\x1e\x2a\x9e\x99\xcf\x48\x4a\xdd\xee\xba\x0e\x18\x12\xed\xd7\xda\x2c\x0d\xa7\x28\xbd\x02\x90\x18\x6b\xed\x6a\x06\x9c\x6c\xea\x27\xa5\xa9\xb2\x4e\x73\x37\x83\x3b\xab\xbd\xe6\x28\xa1\xb8\x5a\x53\x89\xe4\xcc\x37\xff\x34\x7f\xf5\x6c\xa0\x7c\x5a\x36\xc0\xa0\xb7\xb7\xd5\x30\x3c\x1c\x3b\xed\x22\x9b\xdf\xd6\xfa\x76\xc9\x69\x9a\x5c\x30\x57\x03\xfc\x8a\x01\x8e\xb9\xdf\x25\x31\x98\x16\x6a\x1d\x62\xce\x60\xb6\x92\xb4\x25\x03\x59\xb4\x68\xdd\x56\x98\xb5\x52\xfc\x69\x1e\xa6\x38\xf0\x80\xbb\xa1\xfa\xf1\xcd\x1e\x0b\xb7\xb7\xbe\xd6\xbd\x65\x8a\x1a\x9f\xcb\xd9\xe6\x97\x49\x5a\x90\x7f\x38\xae\xc5\x38\xc5\x5a\x91\xf6\x71\x88\x33\x9c\x5b\x96\x34\x7e\xfc\x80\xbd\x50\x93\x62\x95\x5f\x15\x18\xb9\xb6\x97\x05\x05\x0a\x60\x95\x8d\xf1\x9b\x9a\x96\x62\x35\x3a\x5a\x42\xbd\xea\x41\xb0\x73\xf0\xb6\x62\xf2\x5f\xea\xde\x63\x59\x87\x46\x82\x33\x4b\x57\x14\x4f\x3f\x61\xef\xca\x2a\x44\x62\xb2\xe1\x0d\x53\xe1\xa9\xef\x4f\x22\xec\xae\x60\x2c\x24\xe6\x98\x32\xb1\x79\xbe\xac\x12\x2f\x16\xee\x22\xbf\x68\xb0\x7f\x96\x5d\x8b\x0a\x8b\x6d\x88\xa9\x6d\x00\x29\x99\x97\x34\x15\x24\x16\x3a\x2a\xc8\xf8\x2b\x2e\xd9\x84\x5e\x98\xd9\x5c\xd8\x61\xb2\x29\x3e\xe2\x09\x3f\xdf\xf8\x93\x03\xb7\xdf\xd6\x0b\xa9\x2a\x84\x0b\xde\xd8\x9d\x5b\x17\x8c\xd3\x35\x15\xc2\x71\xb7\x4a\x89\x9e\x97\xa9\x57\x4a\x36\xd2\xf0\xe4\x47\x62\xc8\x03\xf9\x6d\x9e\x0c\xe4\x8b\x8c\x73\x07\xbb\x90\x2b\xd7\xdc\x3e\x5e\xc0\x93\x81\xbb\x61\x83\x97\x5d\xb4\x5f\x5e\x9f\x7c\xd7\x34\x5f\x1a\x31\x89\x51\x41\xc6\xfb\x23\xf6\x0e\x5c\xed\xa9\x47\x66\xbf\x63\x13\x7e\xe7\x35\x46\x5b\x7a\x27\x4b\x3c\x92\x6c\xa5\x29\xba\x72\x0a\x5e\x1e\xf4\xdd\xc8\xae\xf1\xd0\xa4\x50\x16\x89\x89\x5d\x58\x5f\xa0\x46\x77\xe6\x3b\x5e\x63\x2f\x9b\x18\xf7\xe8\x97\xc6\x35\xba\xf9\x95\x99\x2e\x7f\xce\x8e\xf0\x28\x87\xb7\x7c\x3f\xb2\x8f\x4a\xf7\xe7\xc2\xfb\x11\xe1\xa1\xc3\x7c\x31\xf2\xe8\x56\x77\x66\xc1\x89\xe8\x37\x7e\x3a\x95\xac\xf0\x86\x44\x87\x3b\x67\x45\xc4\xc2\x70\x8d\x08\xd0\xf3\xc1\xc0\x72\xfb\x3e\x40\x50\xf9\xf9\x39\x63\x7e\x7e\x76\x2f\xc3\x8c\x84\xf1\xa4\x7f\x80\x16\xf9\x8b\x0f\x44\x48\x9a\xf5\xaf\xd2\xbf\xd8\x38\xf8\x8f\xbb\x6a\x44\x4b\x82\xf6\x0a\x45\xa8\x26\xec\x76\x17\xce\xef\xf7\xa6\x25\x29\x72\xce\xa4\x19\xba\xea\xeb\xf6\xe9\xe0\x8f\x81\xd0\xa2\xc0\x1f\xef\xac\x89\xe0\xb5\xd0\x46\x38\x76\x72\xa0\xb4\xd3\x32\x8b\x57\x12\x3e\xb5\xb2\xd3\x64\x1e\x05\x2d\x7a\x61\x6e\x0d\x99\x3b\xb8\xa0\x15\xc6\x59\x18\xe0\x56\x32\x6e\x69\x73\x90\xc0\x73\x90\xa1\xd4\xc0\x30\x75\x5d\xf1\xee\xcc\x0f\x21\xb2\x29\x18\x98\x89\x6d\xad\xcc\x9f\xd7\xf7\x72\x27\xd0\x5c\xb6\xb7\x7b\x07\xd9\x9e\x66\x4a\xfb\x07\xca\x09\xcf\xe9\x2a\x77\x20\x8b\xac\x0e\x56\xde\x8c\x2c\xcb\xcb\xd0\xfd\xf3\xd7\x1c\x30\x00\x66\x08\xee\xa1\x01\xfd\x4f\x8e\xf7\x45\x49\x1c\xb0\x95\xa6\xc9\xc5\x1b\x3c\x26\x3e\x50\x3f\x01\x14\xe9\xef\x67\x22\xf5\xfd\x4c\xa5\x1d\x86\x93\x53\x59\xf8\x90\x8b\xb1\x44\xce\x4e\x72\x11\x8b\x0c\x1e\x1a\x06\x7b\x2f\xd0\xe8\x2c\x9b\xa1\x11\xf6\x81\xfa\x49\xd3\x8f\xd1\xd0\x07\xc7\x68\xc8\x1c\x5b\xc5\x04\xa7\x3e\xd8\xe5\x6e\x04\xb0\xc7\xa3\xbd\xf9\x80\xff\x65\x42\x0a\xde\xc2\x91\xac\xfd\x2a\x99\x62\x1f\xd0\x7f\x79\xfd\x80\xd6\x0e\xc0\xc2\x79\x81\x6e\x6e\x9c\x17\x42\x78\xf1\x02\xb9\xf0\xbd\x7d\xbe\x74\x5e\xda\x94\xf8\xc0\xe5\x98\xf5\x59\x9a\x13\xe4\x60\x92\x10\xd2\x47\x35\x44\xc5\xa1\xd7\x8c\xd3\x32\x67\x05\x8f\x85\xf3\x9e\xce\xe1\xbd\x98\xc3\x7b\xa4\x11\x84\x4f\xa8\xe0\xad\xe6\x05\x92\xd3\xb9\xb9\xa1\xdf\xef\xd5\xf7\x66\x9e\xd5\xd7\x4b\xd2\x39\x9a\x65\x69\xca\xa6\x9e\x6d\x94\x67\xf3\x37\x2b\xb0\xa4\x4d\xa3\x80\x51\x85\x82\xc7\xac\x41\x53\x36\xf5\x6c\x59\x9e\x81\x4e\x95\x65\x5f\x9b\x32\x59\x96\xe1\x20\x55\x85\xf8\xe7\xa6\xca\xe8\x63\x2d\xf2\x24\xca\xed\x30\x28\xac\xbc\x33\x7c\xe5\x6e\x38\xa4\x00\x29\x52\x82\x07\x29\x0d\x9f\x14\x61\xe0\xb2\xe7\xf1\x29\x3e\x67\x1e\x70\x99\x5f\x26\x87\xeb\x9a\x7f\xbb\xc3\x73\x18\xd3\x1a\x30\x31\xbd\x33\x68\xaf\x63\x58\xd6\xee\x39\x7b\x03\x61\xcd\x9f\x25\x33\xca\xf8\x6d\x45\xe1\x24\xc6\x41\x6d\xec\x82\xbc\x97\xfa\xf7\x33\x79\xb9\xaa\x07\x34\x6a\x50\xcb\x1b\x62\xc5\xaa\x1c\x41\xa8\x02\x2a\xf8\x40\x61\xba\x36\xe3\x0d\x2d\x7b\x89\x9d\x57\xa9\xb5\x9a\xe9\x2c\x9f\x49\xdd\x24\xda\xbe\x2f\x02\x2d\x28\x73\x72\xb6\xc2\xb8\xb4\xc0\xe5\x88\x0a\x49\x1a\x4e\xc2\x18\x45\x2b\x01\xd4\x34\x80\x67\x97\x1f\x5e\xbd\x2c\xf8\x60\x9b\x23\xb7\x0d\x36\xe0\xad\x59\xba\xb3\x29\x2a\x7f\x9e\x06\x56\xd5\x0f\xca\x2c\x5b\x05\x63\xb3\xd4\xee\xd4\x22\x01\xc9\x8d\x46\xcd\x16\x15\x0e\x7c\x69\xe7\x3e\xdf\x58\xe2\xe9\x7c\xd8\x3d\x3c\xde\xdb\xde\x7a\xc3\x02\xea\xc8\x0f\x1e\x1f\xe7\xd5\xc1\xe1\xde\xef\x07\xfb\xc7\x5b\x6f\x58\x50\x9d\xfc\x13\x2c\x9c\x6f\x28\x6d\xff\x46\xd0\xf6\x6f\x90\x0b\x7f\xb2\xb4\x7d\x74\xbc\x75\xc8\x23\xf5\xb0\x5f\xbc\xd5\xed\xdd\xfd\xe3\xdd\x43\xdf\x7b\x3c\xf0\x01\xff\x2d\xa2\xf1\xec\xef\xb0\x6e\x76\xf7\x77\xc0\xc2\xf9\x89\xb6\xff\x93\x68\xff\x27\xe4\xc2\x9f\xbf\x56\xfe\x24\x7f\x24\xf4\xda\x02\x82\x17\xbb\x2f\x0f\x0e\x77\xfd\x35\x3a\x33\xfe\x9b\xcf\x76\xeb\x25\x05\x02\x4d\x65\xbf\xc0\xc2\x79\x4d\x67\xfc\x5a\xcc\xf8\x35\x72\xe1\xaf\x75\xb1\x91\x36\x7e\x45\x27\x80\x24\xb3\x35\xae\x7f\x1b\xf8\xd7\xe8\x32\xcc\xfa\xdf\x20\xb5\xa0\x90\x72\xc7\xfd\xd7\x48\x0c\x01\xa2\x78\x74\x9a\xa4\xfd\x9f\x10\x85\xb4\xbc\x94\x8a\xcf\x05\x94\xcd\x45\x94\x25\x58\xa9\x35\xb6\xb4\x7a\x7b\x2c\x81\xb7\x38\x4c\x08\x49\xa6\x0d\xc6\xc8\x80\xd0\x60\x88\xa2\xc1\xa5\xa3\x2c\xb6\x57\x37\x48\x36\xba\x35\x92\xcc\xf4\x16\x73\x64\xaf\x6c\x93\x23\xaf\x75\x98\xbc\x49\x3e\xd8\x15\x5b\xad\x1b\x29\x9d\x76\x83\x81\x96\x96\xa8\x66\xa4\xac\xc9\x46\x03\x6d\xba\xf0\x3c\x16\x64\xf4\x95\xee\x56\x79\x9b\xf8\x59\x7b\xdc\x47\x2c\x83\x6d\xae\x17\xc4\x91\xd4\x96\xa4\xcc\xa7\x18\x4e\xa5\xbe\x84\xab\x7c\x64\x24\xab\xdc\x73\xac\x1e\xd7\x4a\x29\xd5\x44\xd0\x8f\xa2\x4f\x2b\xa7\xdd\xb3\x3d\x27\x6d\x16\x28\x28\x1c\x3b\x2a\xb6\x17\xeb\xd8\xbd\xce\x2e\x42\x32\x52\x66\x3a\x3c\xa2\x17\x76\xaf\x47\xcc\xc9\xba\x1a\x55\xdf\x98\x8f\x70\x70\x7a\x44\xae\x22\xec\x88\x39\x9b\xa6\x35\x10\x5c\x84\x01\x39\x05\x2e\x5c\xb9\x22\x49\x51\x9c\x31\x59\x84\x6b\x7a\x81\x12\xaf\x92\x0b\x6d\x6d\x11\x92\x86\xc3\x39\xa9\x6c\x4f\x59\x40\xb8\x1b\xc3\x14\xa3\xb3\x0d\x39\x35\x19\xff\x8c\x88\xf7\x63\xbb\x97\x3c\xca\x38\xbf\x1d\xff\x42\xc7\xef\x14\xc7\xcf\xfc\x35\x36\x1a\xbc\xf8\x1d\x21\x82\x3f\x3b\x5d\xb7\x04\x89\x0c\x93\xe6\x43\x87\xa0\x34\x7a\x11\xb8\xae\x7e\xf4\x85\x3a\x2c\xaa\x1d\xaf\x61\x89\xcb\xa6\x45\x80\x5b\x58\x91\x50\x38\xfa\x71\x17\xba\xe8\xdc\xd2\xaf\x5d\xab\x67\x9d\xa3\xd0\x3c\x15\x93\xbd\x09\x26\x2f\x92\x39\x13\x5b\x6e\x47\x21\x8e\xc9\x21\x1e\x11\x43\x00\xdf\xac\x8a\x23\x84\xea\x8d\x17\x90\xa3\x2d\x04\x9a\x9f\x28\x96\x04\xc1\xec\x12\x50\x9e\xf6\xce\x6f\xa5\x8f\x5e\x7c\x92\x42\x9d\x23\xef\xe7\xec\x8f\x15\x04\xca\x52\x65\x5c\x0e\x45\xa7\x24\xbe\xbd\x06\x12\x5f\x16\x25\x34\xc7\x2d\xa2\x76\xd8\x26\x00\xfd\x78\x1e\x45\x36\x47\x41\x79\x05\xcd\xb5\x4f\x11\x43\xfa\xa0\x98\x62\x73\xe8\xa3\x84\xbe\x23\x53\xe8\x8b\x17\x03\x57\x4a\x7b\xa7\xf5\xd2\xde\x47\x5c\xda\xfb\x28\xb7\xc6\x62\x96\x54\x47\x8c\x98\x81\x01\xe4\xc6\x59\xfc\x73\x1b\x65\xd2\xee\x48\x05\x50\x95\xbf\xd6\xc2\x38\x0a\xe3\xa5\xd9\x79\x02\xb3\x1b\x6a\x68\x64\x43\x97\x99\xc5\x9a\xe5\xa6\x34\x3c\x4a\xfe\x30\xe5\x61\x9d\xb3\x19\x8a\x45\x30\x6b\x9a\xb1\x0e\xb7\xed\x19\x0f\xe1\x56\x39\x23\x0f\x51\xcb\x3a\x13\xd6\x38\x62\xf6\x90\x08\xda\x6e\x09\x35\xae\x41\x04\x12\xfd\x3c\x92\xd4\x70\xb5\x4a\x82\x08\xad\x56\x49\x12\x99\x92\x99\xd0\xe1\x4b\x78\xe6\xc5\xdf\x2f\x37\x0b\xd2\x5d\x78\x0a\x57\xef\x52\xa4\x69\x75\xdf\xa9\xf9\xbf\x4c\x66\x68\x14\x92\xab\x82\xff\x4d\xb0\xde\xed\x4e\xb3\x56\x8f\xfd\x2b\x1c\x9d\x02\x68\xa9\xd6\x2b\x79\xe4\xec\x47\x18\x9d\xe3\xca\x4e\x8a\x9e\x43\x15\x8a\x7d\x55\x03\xed\x99\x9d\x68\xcd\x33\x6f\xaf\xf6\x61\x95\xe6\x76\xce\xcd\x64\x71\x50\x3b\x3b\xd6\xc3\x13\xda\x83\x6c\xf8\xe5\x23\xd7\xd1\x47\xa5\x0e\xd1\x3e\xc8\x46\x28\xc2\x6c\x03\x01\x98\x8c\xc7\x19\xd6\x3d\xa7\x9a\x53\x90\xf9\xde\xba\x59\xa0\xd4\x5a\xcf\x5b\x87\x3d\x6f\x3d\x6f\xd1\x7b\xb4\xa4\x86\xf7\x3d\xf4\xbe\xd7\xca\x3f\x59\xd6\x03\xec\xe5\xa5\x7b\x14\x09\xbe\xc8\x5a\xe4\x76\x3f\xf1\xd7\xcc\x6d\xe7\x7c\x76\xba\xc2\x30\x0d\x27\x20\x57\x5f\x76\xd8\x71\x04\x71\xa4\x46\x1d\x7e\x21\xe0\x2e\x61\x06\x98\xb1\xe6\x74\x96\xc4\xc2\xea\x93\x1f\x8c\xdd\x25\x6a\xd0\x92\xbe\x53\xce\x0a\x7d\x5d\x28\x23\x87\x15\x45\x7e\x17\x26\x8d\xef\x63\x65\x39\x74\x18\xf8\x4c\x1f\x46\xf7\x67\x6e\xdd\xba\x06\x1e\xb4\x1e\x3c\x90\x51\x39\x3e\x86\x7a\x64\xdc\xdc\xfd\xfc\xc7\x30\xb0\xdd\xb5\xee\xe6\x17\xb8\xd0\x65\x49\x00\x1c\x36\x0a\x1e\x1b\x56\x05\x8e\xfd\xd2\x22\xc4\x8c\x2e\xd0\xe8\x3e\x17\x28\x4d\x22\xbe\x3c\xd9\xbf\xcb\x73\xe7\xe5\x99\xdf\x49\x94\x21\x96\x63\x4f\xf9\xe7\x26\x79\x3a\xdb\x47\x79\x4e\x5c\xac\x31\x1f\x8f\xc3\x4b\x1f\xa0\x61\x46\x52\x34\x22\x60\xf5\x95\x2a\xf7\xb2\x59\x08\x8b\x53\x2e\x61\x8d\x94\x53\x18\x94\x78\x7a\x57\x9c\x9c\xad\x71\x3d\xbf\x59\xd3\xf4\xfe\x74\xe7\xd8\xe4\x51\xae\xf8\x4f\xa2\x25\x71\xca\xe5\x4a\x07\x75\x2b\xdd\xc0\x1c\x83\xd7\x09\x2d\xcf\x41\x43\x8b\xe5\x44\x09\x33\x30\x0c\x6d\x68\x91\x8a\x64\x03\x27\x44\xa0\xa7\xd0\x34\x74\x99\x47\x7f\x06\xbc\x1a\x3c\x6b\x92\x44\x87\x0f\x4b\xbf\x4d\x3f\x5c\x7a\x9b\x76\xc4\x75\x3a\x64\x17\xe9\x30\x30\xed\xbc\xe7\x43\xc2\x1e\x23\xb4\x99\xa5\x51\xd1\xd2\xe2\x8b\xd8\x33\xa9\x88\xf3\x7f\x1f\xf4\x38\x65\x61\x23\xbf\x3e\xfc\x10\xe3\xfa\x87\x22\xc8\xec\x0e\x67\xb8\x80\x50\xd9\xdf\x06\xcf\xe6\x80\xcb\x6a\x75\xf7\x66\x13\x4b\xfc\x5f\x1a\x65\xab\x14\xb2\x19\x26\xe2\xfd\x66\xb5\x22\xb6\xd0\x52\xf1\xb0\x17\x03\x6f\x72\xe2\x8b\xa2\x35\x83\xe1\xd1\x50\xab\xdd\x79\xa8\x26\xfe\x32\x75\xf0\x38\x2a\xbd\xa8\x3a\xd8\xdf\xf5\x01\xfd\x17\x40\xec\xb1\xf7\xcc\xbe\x78\xe5\x0c\xb1\x27\x5e\x38\xfb\xea\xa9\xf3\xc2\x19\x47\x37\x37\xce\x38\xe2\x4a\xcb\x71\xe4\xc2\xf3\xe6\x0c\x88\xee\x31\xa3\xe8\xd5\x93\xef\x84\x34\x89\x0a\x9c\x48\xc9\x55\x00\x07\xa5\xf1\xe2\x3b\x67\x1b\xc7\x11\x9b\xd1\x92\xc7\x18\xc5\xbe\xbc\x02\x96\x58\x6c\xa1\x29\xb0\x98\xc7\x50\x51\xd4\xc7\x30\xb6\xb5\xaf\x0a\x14\xde\xa4\x5b\x6d\xf5\x63\xf9\xca\xfe\x48\x2b\xcb\x9e\x2b\xb3\x27\xcb\xe5\x3d\x64\xb4\xb9\x2c\xbe\xa9\xde\x7d\x05\xd2\x5a\xba\xaf\x91\xed\x8b\x99\xa9\x45\x8e\x4e\xf4\x64\x31\x61\x19\xa7\xce\xec\x3f\x8f\x78\x24\x4b\x2b\x1b\xfe\x13\x89\x6e\x0a\xc9\x06\x5e\x18\x8f\xa2\x79\x80\x33\x07\xbb\x9b\xb8\x2f\x17\x75\xf1\xa5\xde\x8a\xdc\x9e\xb9\x7b\xf3\xf2\x47\x67\x16\xb9\xb7\xdf\xa1\x93\xd2\x0e\x55\xe6\x1a\x40\xc6\xe4\x66\xe6\x79\xb9\xa5\x06\x38\x4d\xd2\xf0\x33\x3d\x7a\x59\xce\xf6\xc1\xdb\x77\x5b\xdb\xc7\x3c\xb4\x26\xe3\xcb\x9d\x09\xdd\xb3\x13\xb1\x67\x27\x91\x0b\xaf\x6e\x7f\x14\x4c\xc3\x98\x85\x8e\x3f\x0a\x3f\x63\x5f\x58\x7f\x4d\xd1\xa5\x96\xb6\x2e\x3c\x3c\xa0\xab\x64\x4e\xfc\x49\xa4\xab\x96\xb5\x1c\xf6\x30\x29\x33\x82\xe3\x4e\xa2\xca\x37\x04\x93\x88\x79\x5f\x14\xbb\x3f\x52\xbd\xad\xdb\x54\xa5\x32\xb7\x7e\x87\xa8\x62\x15\xb7\x45\x95\xbf\x97\x31\xff\x00\x8e\x66\x1a\x95\x0f\x40\xbf\x39\x66\x1f\xd4\x0a\xd5\x5a\x75\x09\xd0\xf8\x14\x38\x72\x79\xb5\x56\x5e\x69\xeb\xd9\xb8\x9d\x1c\xc8\x5a\x4b\xdb\x02\x05\x9a\x37\x23\xb0\x27\x7f\x7e\xc2\xf2\xf8\x03\x76\x3b\x34\xf3\xbb\xbd\x79\xbb\xe2\x35\x0d\xe8\x50\x28\x2e\x0b\xdf\xa7\x23\x07\x77\xd8\x76\x30\x76\xb0\xfb\x7c\xad\xa7\x8d\xc9\x5c\x98\x9a\x26\xb9\x63\x35\x2f\xcc\xf6\x62\x82\x27\x2c\xac\x5b\xa7\x83\x9f\xfb\x25\x54\xee\x74\xf0\x0f\x7e\x09\x99\xbf\xfc\x09\x3d\x5d\xe5\x3a\xcf\x9d\xfd\x34\xbe\xd4\x73\xd0\x16\xee\xf3\xa5\x73\x37\x2d\x98\x36\x84\xca\xe8\x01\xd5\x9d\xc8\x38\xa6\x67\xcb\x8f\x69\x18\xd8\x63\x6d\xb1\x45\x3b\x66\xbc\x70\x9d\xbd\x7d\x43\xf5\x31\x65\xaa\x05\xe7\xbc\xa2\xf7\x1c\xfb\xd5\x5f\x98\x1e\x14\x81\xe1\x8a\xfe\x95\x76\x19\x05\x01\xdb\x0b\x55\xda\x65\xfd\x36\xc1\x66\x2c\xcd\x02\x72\xf0\x88\x26\x8d\xc5\x90\x2f\x60\x8d\x44\x2f\xa7\x27\x8e\x5b\x01\x88\x2a\xf8\x30\x9f\x05\xcc\x29\x91\xdc\x42\x62\x68\x11\x70\x7f\xe8\xe6\xce\x23\x57\x9a\x56\xb4\xd6\x5b\x2f\x99\x39\x34\xad\x3a\x0d\xac\xf4\x41\xce\x55\xed\x69\xd7\xad\xc0\x62\x09\xa3\x71\x92\x6e\x11\x92\x2e\xf1\x0d\x64\x91\xed\x08\x81\x9d\xfd\xa1\x9b\xda\xdf\xa2\x79\x9f\xe8\x4e\x63\x84\x6a\x9c\x2e\x5f\x15\xbf\xa1\xe3\x7f\xef\xeb\x67\x54\x8a\xb7\xe6\x2b\xed\xf7\x4c\xfb\xcd\x2d\x18\xa0\x6e\xdb\xd0\xfc\x99\x0a\xdf\x01\xb7\xb2\x5e\x18\x27\x29\xbd\x4e\x8b\xd5\xd0\xec\x15\x44\x4a\xff\x84\x17\x01\xe2\x5b\x7b\x13\x3f\x5c\xe5\x42\x52\x20\x9d\x26\x89\x94\xc2\x50\xb9\x99\x7c\x60\x13\x72\xca\xcb\x03\x3f\x23\x2b\x68\x4f\xc9\xb3\x62\xd7\xea\x59\xb1\x3b\xd8\xd4\x3f\x24\xeb\x0b\x6f\xed\x4f\x1d\xc6\xe5\x9a\xeb\xd6\x9a\xeb\x7a\xd7\xeb\x83\x3e\x00\x30\xf5\x4f\x4c\x00\xc0\x78\xb0\x21\xec\xc9\xa4\x09\xd9\x38\xe2\xb7\xc6\x7e\xca\x77\x9f\x10\x7b\x70\x77\x2c\x86\x7d\xd2\x38\x92\xf7\x49\xa3\x2c\x17\xca\xa9\xdb\x0e\xb1\xd3\xc7\x35\xe5\x66\xbd\x8e\xb4\x75\x3a\x7a\xcb\x0d\xc8\x8e\x7e\xd8\xaf\xd5\x91\x25\x08\x5a\x3a\x11\x74\x61\xea\xfd\x91\x84\xb1\xc3\x82\xcb\x91\x34\x9c\x6a\xb7\xaa\x30\x0e\xa5\x60\xc2\x8e\x14\x3c\xcc\x6d\xa7\xa3\xd1\x69\x49\x92\x73\x5c\xd3\x32\xa1\x4e\xd0\xb3\x59\x14\x12\xde\xaf\xdd\x15\x79\x46\x50\x4a\xd8\x6b\x62\x03\x32\x58\xd8\xd3\x09\x6a\x0d\x63\xee\x16\xeb\x6e\x77\x9d\xab\x82\xb0\x6d\x45\x6e\x67\xfb\xef\x23\xb3\x54\x1e\x86\xbe\x36\xa1\xa5\x1c\xd8\x3f\x54\x6a\xb9\xb5\x2a\x43\x2c\xde\x9c\x5a\x85\x4c\xe1\x58\xf2\x77\x04\x11\xdc\x84\x3d\xd6\x89\x7b\x81\x43\x2e\x71\xce\x61\xad\xc4\x2a\xb8\x8a\xd1\x34\x1c\xa9\x27\x53\x55\x9c\x8b\x75\x8c\xcb\xa5\x49\xd8\xbd\x46\xca\xbe\x17\x89\x77\xfa\x42\x22\xe9\x68\x4e\x1a\xef\x55\x24\x86\x72\x71\x58\x85\xc0\xea\x34\xb9\x78\x25\xa4\xfd\x56\xb6\xbf\xdd\xd6\xc1\xcc\x8b\x6e\x4b\xab\x87\x4e\xc7\x59\x92\x4f\x72\xab\x66\xdf\x17\x87\xe5\xcd\x8d\x51\xe7\x88\xef\x8f\x9a\x4a\xec\x4c\x2a\xd4\x62\xef\x92\x6b\xea\x88\x93\x4c\x93\xff\x9e\x26\x17\xe2\x36\x5a\x73\xbf\x29\xf6\xda\xe9\xb4\x6b\x07\x6b\x34\xbf\xc7\x7d\x4c\x34\xed\x40\x0c\xb1\xd8\x85\x39\xb3\xa2\x73\x17\x19\xe6\xb4\xc6\xbf\x4b\x11\xb5\xbe\xac\x03\x97\x25\xdc\x56\x51\xbd\x5c\xd8\xbb\x46\x9a\x53\x07\x79\x71\x23\x64\xf0\x6c\xe7\x0b\xb6\x99\xa7\xe6\xcc\x19\x4d\x42\x41\x40\x99\x7f\xdd\xa3\x8d\x48\x6a\x24\x7d\x69\x7c\x11\x2c\x38\xa8\xae\xd2\x39\x08\x80\x17\xb7\xb5\x40\xe4\xd2\x6e\xcf\xb5\x17\xce\x35\x45\x35\x61\x75\x9e\x23\x9d\x04\x87\xda\xcf\x5a\x02\x43\x7b\xa8\x15\x2e\xd5\x86\x79\xbd\x7e\xa1\x1d\xa8\x5a\xe8\x9b\x0d\xde\xfd\x7e\x73\x1e\xd9\x6e\x37\xc3\x28\xbf\xe7\xd4\xdf\x65\x56\x70\xe3\xe1\xa8\x38\xb0\x11\x7c\x4c\xdb\xe7\x5f\xdb\xc6\x57\x60\x7c\x9d\xd2\xaf\x7a\x97\x1f\x8c\xfb\xf4\x53\xe1\x2b\x13\x5a\xcb\x54\xa0\x6f\xb3\x5a\x26\x2d\x68\x56\xa7\x40\x83\x55\x25\x57\x5d\xc0\x8e\xa2\xe5\x81\xdd\x6e\x79\x29\xe9\x6a\xae\x24\xd4\xa1\x1e\xff\xc1\x98\x10\x3f\x56\x3f\x61\xdb\xc8\xe1\xce\xbc\x21\xb3\x7c\x17\x2c\xa3\x5f\x2e\x70\xe4\x7d\xfc\x10\xb8\x10\x59\xb3\xe8\xc5\x77\x23\xf6\x46\x29\x46\x04\xab\xc9\x3b\xa1\x97\xe2\x2c\x89\xce\xf3\xa4\x97\x9c\xdb\x75\xc2\xc8\xe5\x8c\x6b\xe4\x57\x17\x22\x2e\x4c\xfc\x93\xc1\x46\x72\x92\x0e\xfc\x13\x64\xca\x4e\x06\xac\x7a\xe6\x97\x7b\x8d\x20\x07\x95\xfc\x93\xd0\xa1\x71\xee\xde\xe9\xba\x90\x0e\x9e\x7b\x18\xd7\xb8\x8e\x6e\x01\x58\xf9\xcf\x85\xe5\xdc\x9e\x60\xcb\xe3\x56\xdd\xf5\x51\x09\x44\x34\x57\x6d\x58\xf8\xe1\x0e\xba\x66\xa1\x19\xaa\x55\x26\x8b\x32\x4d\xf4\xb6\xa2\x68\x95\x0a\xcc\x70\xe5\x5e\x45\x46\x55\x23\xf7\x16\x26\x71\xc5\x8b\xd2\xd9\xea\x62\x61\x28\x14\x75\x89\x95\x13\x3e\x1f\xa5\x92\xef\xbd\x48\xd1\x6c\x86\xd3\xe3\xab\x59\x59\x28\x5c\xcf\xd3\xf2\xb8\x49\xdd\x82\xc0\x18\x29\x81\x71\xb4\x41\xd2\x2b\xfb\x41\xe4\x73\xac\x99\x45\xb5\x9c\x39\x2f\x74\x1e\xb9\x35\xcc\x38\x2b\x32\x94\x45\xe8\x72\x5a\x7b\xfa\x10\xb9\x8b\x11\x22\xa3\x53\x27\x73\xaf\x17\x55\xcd\x89\xf3\xd1\xc6\x39\x14\x6f\xf5\x0e\x82\x05\x61\x67\xe5\x10\x96\xc8\x2a\xcb\x15\x3c\x03\xbf\xed\xca\xe3\xa4\x18\x85\x40\xf1\xf8\x15\x87\x7e\x63\xd6\xdf\x30\x8a\xa8\xe0\xfc\x13\xf6\xbe\x2d\x0d\x11\x8f\x66\x3e\xc4\xc1\x0b\xe6\xbd\xce\x7a\x0b\xb8\x0f\x83\xcd\xb2\x38\xb8\x52\xd0\xab\xeb\xe4\x84\x86\x3b\x77\xf0\x5d\xb5\xc5\xad\x08\x28\x3b\x51\x20\xca\x5d\x55\x6e\x17\xf5\xd8\x6a\x29\xf5\xc0\x10\x35\x37\x3a\xab\xea\x7f\x45\xba\x94\x0f\x43\xaa\xd5\xad\x03\x28\x17\xab\x0a\x4f\xa1\x7b\xa9\x78\xc7\x1f\x71\xa5\x2f\xd3\x84\xf9\x49\x17\x5e\x83\xad\xb2\xac\xf4\xaa\x6c\xc0\xc3\xa5\x2a\xa5\x33\x82\x6f\xc2\x3c\xf8\x19\x59\x34\xd1\xe0\x54\x34\xcb\x9f\xcd\x0a\xaf\x95\x1a\x21\x53\x44\x4e\x23\x54\x95\xda\xb1\x9a\x11\x8f\x22\x37\xa7\x61\x16\x51\x51\x5d\xdd\x44\x51\x1c\x2c\x29\xce\xc7\x30\xd8\xac\xc4\x5a\x59\xa2\xaf\x50\xbf\xaa\x68\xed\x36\xb7\xf1\xf6\x22\xa5\x80\xcc\x5f\xfa\xea\x56\xa6\x18\x55\x4f\x98\xd9\x2d\xa0\x18\x00\xad\x50\x77\x2f\x70\xb0\x4b\xd9\x41\xca\xd6\xb5\x7d\x9f\xb8\x62\x00\x8c\x29\x32\x95\x54\x4d\xde\xe2\x32\xdf\xdd\x81\x6c\x7f\x78\x05\x28\xb2\x9a\xcd\x34\x7c\x90\x5c\x6a\xc9\x8c\xdc\x53\x9c\x46\x75\x40\x26\x69\x28\x99\xb3\x19\xda\x9d\x6a\x93\x48\x3b\xdb\x3e\xce\x6f\x4d\x94\x62\xe5\xc2\x4a\xb7\xca\x9a\x7b\xb3\x22\xdd\x0b\x03\x29\x2d\x07\x6b\x14\x02\x15\x96\xd4\x55\x98\x59\xa8\x7c\x1f\xb6\xd2\x47\x5e\xf6\x71\x98\x6b\xa0\x76\xae\x7e\xcc\x3f\x3e\x67\x0f\x35\x37\x8e\xe8\xf1\x6d\xb5\x56\xcd\xf4\x53\xba\xf3\xe8\x61\x34\x4f\xed\xbe\xa3\x4b\x27\x4e\xee\x39\x5a\x38\x8e\x56\x32\x57\xcd\xd5\x62\xc0\x4e\x49\x75\x85\xfa\xb8\x9a\x55\x7f\x75\xb0\xec\x5a\x89\x67\x89\x29\x8b\xeb\xb8\xbd\x20\xcc\x66\x11\xba\xc2\x81\x90\x11\xf9\xed\x1e\x8c\x57\xe5\x2d\x1a\x89\x15\x53\x43\xac\x08\xc9\x92\x4e\x6e\x2f\x31\x4d\xbd\x53\x14\x07\x11\x66\x15\x2b\xd9\x97\x2f\x43\x1d\xb5\x91\xd8\x28\xc2\xdd\x85\x21\x05\x05\x6f\x93\x27\x07\x17\x77\xd4\xcf\x70\xf3\x14\x76\x0b\x36\x7d\x40\x3a\x91\x45\x3f\x23\x35\x06\x7e\x08\xa3\x9c\x36\xf9\x08\xb6\x23\xfb\x1a\x5b\xfd\x48\x8a\x08\x2e\xad\x11\x8a\x4d\xef\x91\x17\x21\x39\x0d\xe3\x16\x6a\x8d\x93\x74\xda\x12\x18\xd6\x52\xfd\xb4\x30\xa7\xdf\xad\x28\x3c\xc3\x4c\xd9\xc7\x36\xa7\x16\x30\x41\x81\x7e\xdb\x89\x5c\x8b\x3f\xc9\x25\x2b\xa8\x6f\x22\x11\x3c\x89\x9d\x1f\x3c\x90\x8c\x4e\x51\x0d\xf2\xea\x9d\xa2\xac\x58\xdc\xed\xe7\xf2\x5d\xdf\xd7\xf9\x5d\xbd\x7d\xdb\x20\xda\x26\xe1\xbf\xb9\x71\xf0\x66\x1e\xc2\xba\xb8\xc5\x45\xe4\x66\x3c\x1d\xe2\x20\xc0\xc1\x87\x10\x5f\x1c\xe2\xb1\x6f\xb6\x21\xc4\x13\xbb\x5a\x21\x5e\x4d\xae\x27\xbc\x66\x83\x36\x8e\x12\x7a\xa0\x97\x66\xb5\x70\xab\x28\x4d\x57\x1c\x44\x85\x91\x48\xf3\x17\x33\x95\xf5\x81\x2f\x55\x8c\xd4\x8a\x6c\xde\xa9\xbf\x74\x54\x6e\xdf\x29\x4e\x38\xc2\x28\x75\x2a\x07\xdb\xcb\x23\xe0\x7d\xbc\xb5\x76\xb0\xb4\x5f\xd5\x69\x76\x38\x19\xe5\x1f\xf4\x6c\x5c\x35\x76\x82\x8a\x71\xc4\x3c\x4b\xc8\x23\x88\xaf\xd1\x89\x59\x40\xbc\x98\x29\xeb\x00\x25\x85\x78\x75\xdb\x17\xbe\x5f\x43\x8c\xff\xb7\x91\x70\xbb\x73\x10\xbd\x73\xc0\xde\xd1\xc7\xe3\x83\x1f\x7f\x7c\xb3\x0b\x5c\xf8\x26\xf2\x95\x13\x8b\xb7\x11\x9c\x67\x58\x88\xec\x2c\x77\x58\x65\x7c\xde\xee\xd1\x7d\x78\x79\x3f\xf6\xf0\x25\x7d\x21\xf7\x93\x67\x57\x1f\xaa\x33\xda\x76\x44\x56\x9c\x7d\xb1\x6c\xb1\x42\x75\xb7\xec\x32\xc6\x84\xd3\xca\x58\x63\x88\x23\x4f\xb3\x92\xfa\x72\x6a\xa1\xbb\x9d\x8a\x6f\xa3\x55\xb5\xee\xa7\x78\x74\x36\x4c\x2e\xd7\xc4\x65\x53\x44\x08\x4a\xd7\x38\x30\xf3\xe4\x5b\x79\x01\x9f\x46\xf0\xe9\x2a\x2a\x81\x5b\xbb\x02\x2f\x4d\x03\xb6\x89\xc0\x07\xe1\x18\xbc\x30\x1f\xa8\xb2\x2d\xfe\x5e\x46\x11\x7c\x13\x0d\x5c\xab\x61\xc0\x99\x34\x0c\x78\xc8\x0d\x03\x7a\x96\xf8\x5a\x8d\x9c\xad\x7c\x48\x73\x73\x01\xf1\xa3\xa7\xbb\x57\x39\x4a\x61\x0f\x76\xa1\x30\x3a\x83\x5d\xcd\x7d\xca\xe5\xec\x89\xb3\xae\xb9\x2e\xd9\x1b\xb3\xf9\xb2\x92\xd6\x60\x46\xd3\xa8\xe4\xa3\x44\xd2\x8c\xdf\xef\x81\x25\x82\x11\x4c\x78\xdd\xcc\x62\xba\x92\x15\x58\xa3\xcb\x48\x09\x74\x5d\xb9\x67\x13\x98\x59\x18\x90\x9a\x2d\xbb\x4a\xd0\xc8\x0d\x33\x36\xbb\x55\x0e\xe4\xbc\x8d\xb8\x3e\x65\x03\x77\x3a\xf2\x06\x9e\x93\xa9\x4e\x47\x3c\xac\x6e\xe7\x41\xa7\xcf\x6e\x7d\x16\x16\xae\x80\xc5\x5b\x1f\xec\x75\x6b\x2e\x7e\xf0\xc8\xfb\xe6\xd9\x5b\x86\xd4\xc7\x6c\x6c\x60\xe5\x03\x73\x5b\xec\x16\x11\x4a\x4d\xa4\x8a\xd6\xea\x9d\x6c\xef\xde\x23\x07\x5d\x46\x15\x93\x8b\x46\x90\x3b\x5d\x77\x0b\xa6\x2c\x18\x46\x15\x76\x2c\x91\xcd\x88\xa5\x82\xd9\xf6\x11\xcd\x61\xee\x92\xe8\x21\x14\x59\xf0\x8f\x45\x08\xe0\xfe\x94\x6a\xc4\xbd\xbc\x8d\x0a\x89\xaf\xe8\x00\x64\x2c\x88\x2a\xf0\x7d\xba\x2a\xc9\xb8\x85\x37\xc1\x18\x45\x19\x06\x6d\xdf\xc7\xfd\x76\x1b\xdf\xc2\x70\x41\xc8\x9f\x0e\x93\x08\x17\x22\x72\xab\xe4\xaa\xaa\x69\x12\x89\x0d\x21\x29\x27\x96\x9a\xcb\x4d\x30\x61\x41\x6a\x73\x61\x47\xbc\x70\xb6\x6e\x8d\xeb\x95\xaa\x6a\xa8\x94\xda\xb7\x3c\xb1\xf2\x8b\x4c\xe1\xcc\xd2\x32\x6e\x75\x6a\xfd\x1e\x2d\x8b\x5d\x91\x03\xad\x10\xbf\xa2\x36\x58\x97\x61\xa8\xc6\xc3\xf3\x11\xb6\x12\x86\xb1\x9a\xee\x56\x42\x0b\x6c\x61\x78\x9b\xc8\x7d\xa1\xd1\x45\xf2\x7d\xa5\xcc\xde\xa4\xdf\x7d\xf5\xa9\x1c\xa5\x89\x46\xd2\xe4\x82\xf6\x99\xdb\x76\x68\x22\x1b\x85\xec\x3a\xde\x5b\x0e\xc7\xf3\x08\xce\x22\x38\x8c\x60\x12\xd5\x06\xa2\xdc\x55\x16\x74\xc2\xc5\xcb\xf7\xd6\x48\x94\x3d\xf3\x91\x81\x16\xce\xcf\x1a\x6a\x52\x98\xf2\x15\xd8\x95\x3c\xa0\xa1\x74\xe9\xc4\xe3\x20\xd6\x47\x63\xb4\x04\x6f\x64\xa2\xce\xd3\x30\x08\x30\x0b\x4e\x96\xce\xb1\x19\x10\xb1\x49\x57\x66\xa4\x46\x5b\x4c\xc7\x65\xbd\xdc\xc3\xa0\x7b\xb6\x31\xea\x6d\xdf\x6e\x94\xf6\x66\x1b\xf1\x3b\xbf\x9b\xfc\x0e\x77\x2e\xf7\xb1\xc8\xe4\xc0\x23\xef\x78\xf2\xbb\xb3\x0e\x41\x10\x9e\x0b\xe7\x71\xb4\xce\x43\xfe\x93\xe6\x3d\x12\x79\xeb\xb2\x99\xc7\xf0\x42\x34\x23\xe2\x41\x32\xb7\xdb\xaa\x97\x27\xf0\x95\xc8\x1e\x05\x99\x58\xac\x87\x32\xf3\x29\x7c\x5b\xca\x7c\x24\x33\x9f\xc1\x37\x75\x0d\x7f\x0f\x2f\xab\xb2\x3f\xfd\xbe\xe5\xa8\xbf\x26\xe3\xd6\xab\x60\xdc\x3a\x1d\x7d\x63\xea\x0e\xea\x72\x2e\x57\x6c\x12\xe9\xe4\x8f\x78\x6a\xa7\x6a\x8d\x0a\x53\x32\x62\xda\x86\xa9\x26\x1f\x16\xfa\x27\x9a\xf1\x92\xcd\x2f\x5e\x5e\x46\x08\xea\xeb\x0b\x7d\x58\x5e\x64\x85\x76\x2a\x23\x73\x4e\x23\x16\x9c\xb3\x82\xa9\xdd\xfb\xfb\xdd\xe2\xe1\xab\x08\xa2\x68\x00\x5f\x29\xbf\x5d\x39\xe7\x74\x1c\xe9\x01\xda\x38\x73\x4a\x11\xca\xc2\x55\x60\x69\x7f\xe4\x77\xfb\x60\x98\x24\x11\x46\xb1\x96\xdf\xe9\x60\x1e\x29\xe1\xe0\x36\x06\x2d\x36\x83\x58\xee\x1e\xb0\xee\x41\x65\xbb\xab\xbd\x24\xa0\xb8\x5a\x57\x58\x6a\xd0\x39\x4f\xa5\x8c\x24\x73\x46\xac\x42\xaf\xce\xd9\x2c\x06\x28\xad\xb7\x73\x9c\x66\xcd\xba\x63\x25\xcd\xfe\x58\x52\x75\x87\x2c\xbb\xd0\x63\x36\x45\x51\xd4\xa0\x3f\x56\x4e\xef\xed\x88\x26\x54\xf5\xc5\x4a\x17\x7a\x9a\xe2\x20\x9c\x4f\x6b\xc1\xae\x55\x16\x62\x8d\x8f\xbc\x96\xde\xf1\x5b\x96\x52\xd5\x33\x2f\x2f\xbb\xbe\xb3\x91\x50\x93\x88\xdd\xc2\xdd\xa4\xf1\xc8\x6a\xf9\x2b\x2b\xc9\x55\xb1\x33\x6b\x38\xcf\xae\x18\xe7\x24\x69\xa7\xf2\x61\x49\x3c\x1d\x5f\x73\xef\x96\x1a\x45\xd5\x50\xd4\xc8\x17\xd8\x40\x0b\xe4\x58\xa5\x95\xc8\xa6\xac\x79\x85\x00\x5a\xd6\x94\xe9\xc7\xb4\x15\x5b\xca\x76\xc1\x1c\x01\x4d\x64\x94\xa8\xa2\x23\x8d\x5a\x45\x7d\x41\x17\x5f\xf4\x51\xc3\xbb\xaf\xcb\x17\x5f\x95\xfb\xc6\xfd\xc8\xef\xc2\x43\x53\x48\xfa\xf2\xe3\xd6\xf6\xf1\xde\x87\xdd\x8f\x7b\x3b\xc0\x85\x2f\x35\x39\xe9\x61\xbd\x9c\xf4\xc1\x83\x7d\xba\x85\x77\xee\xe2\x85\x86\x47\x3c\x2d\xc6\x91\xb1\xbd\xc9\xd3\x4b\x2e\xf1\x35\xa3\x17\xad\xb2\x12\x14\x85\x1a\xb5\x54\x65\xcb\x24\xb2\xc5\x59\x64\xa4\x29\xaf\x74\xe6\x60\xf2\x40\x2b\x5f\xda\xde\xf0\x8f\xfb\x7d\x75\xb3\xc5\x18\x92\x82\xf6\x39\x0c\x54\x0c\x6d\xa9\xf8\x4b\x0b\xf6\x0a\xd2\xfc\xf0\x02\x65\xbc\x09\x25\xfe\xe6\x01\x80\x6d\xbe\xf3\x61\x7e\x4d\xdf\x8a\x83\xf7\xdc\xd0\x89\xe9\xa4\x64\xc4\x5c\xcb\x53\x18\xdf\x36\x50\xcf\x5c\x8d\xca\x27\x30\xe5\xae\xe8\xae\xb5\x61\x65\xa9\x64\xb5\xed\x07\x96\x3a\xb9\x30\xd8\x20\x52\xb8\xa6\xe0\x20\x11\x68\xae\x4d\xcf\x2d\x43\x86\x3b\x74\x97\x39\x39\x14\x35\xb7\x0c\xbc\x78\xbd\xc0\xc6\x0e\x96\x7c\x80\x65\x8c\x57\x03\xac\xaa\x2b\x6a\x16\x9f\x33\x54\xc1\xa4\x68\xb0\xb2\x54\xe7\xa8\x19\xae\x18\x3a\xbb\xdb\xaa\x25\x0a\x8a\x87\x3b\xaa\x1d\x76\x94\x38\xe7\x30\xba\x57\xc5\xde\x96\x58\x4d\x43\xb3\xc7\x97\x58\xaa\xf6\x54\x11\xb1\xf2\x03\xcd\xdd\xbb\x8e\x3b\x7d\xbd\xb8\xf4\xf5\x2e\xe9\xc3\x8f\xb7\x71\x53\xc1\xad\xe1\x6d\x14\x42\x11\x80\xa2\xfb\x49\x49\x21\x70\x54\xe9\x97\x82\x47\x78\x14\x46\xc7\x1f\x65\xa4\x46\x45\x28\x64\x42\x99\x54\x74\xe5\xb1\x52\xe5\x62\xaa\xac\x4b\x43\xa2\xb9\x3a\xbb\xdc\x48\xdf\x94\x2e\x8c\x0a\x23\xe0\x5b\x32\x2a\x46\x96\xac\x30\x3d\x91\xd9\xf5\x07\x8f\x0a\x4f\x59\xda\x87\xd6\x2b\x8d\xa3\x01\x46\x0d\x40\x1d\x41\x79\x42\xa3\xcd\xa9\x05\x74\x2f\xb4\x78\x73\xd3\x55\x6f\xb6\xd5\x36\xe4\xb7\x2d\x57\xba\x94\x52\xdb\xd5\xd6\xc0\x7d\xed\xf9\x0d\x1c\x65\xb8\xa5\xcc\x38\x1b\x87\x8a\x10\x9a\x7d\x00\xad\x83\x63\x92\x43\x10\x27\x31\x06\xba\x9d\x67\x63\x63\x56\xa3\x3d\xca\x6e\x3c\x78\x00\x8b\x34\x7d\x25\x72\x55\x6a\x70\x6d\xcd\x8a\xc9\x5f\x52\xbf\xca\x88\x9a\x6e\xbc\x60\x28\x72\x4a\x91\x32\x6e\x13\x0b\x55\xd9\x34\xa8\xad\x62\x9a\x35\x88\x64\x65\xd9\x90\x17\x53\x9b\x4b\x27\x81\xe6\x6e\xed\x9b\x95\x8a\x64\xf0\xf3\x6a\x64\x50\x7f\x7b\x54\x22\x81\x4c\x16\x5f\x60\x91\x14\x5d\x8c\x8b\x74\x31\xcd\xa3\xdf\x55\x33\x41\x65\x0e\xc7\xe8\x45\xab\x5d\xc1\xdc\x84\x3a\x32\x62\x17\x86\x7a\x15\x19\x2c\xc6\x46\xb7\x96\xc6\x23\x2c\x0f\xa4\x82\x6d\x2e\x17\xf4\xf1\x7f\x27\xd3\xf0\x1b\xba\x57\x56\xe1\x80\x2d\x91\xb1\x57\x28\x74\xe5\x3e\x11\xd9\x6c\x21\xf5\xfd\x91\x23\x40\x3f\x2f\x58\xdc\x17\x2f\xfe\x1e\xf7\xdb\xf7\x77\x76\xb6\xf7\xe2\xe0\xf8\x95\x0f\x86\x09\x39\x05\x0b\xe7\x7d\x74\x73\xe3\xbc\x17\x6e\xf6\xde\x47\x2e\xfc\x74\xc7\x30\x63\xec\x1c\x62\x06\x77\x3c\x85\x22\xe9\x38\x49\xa7\x7b\x81\x1f\xdb\x2c\x76\xf4\xe3\x6b\x89\x9b\x2d\xd9\xb4\x79\xe6\x29\x44\x1f\x27\xa3\xb9\x4d\x19\xea\x74\xe1\x99\xb7\xff\xd2\x75\x0a\xe3\xc9\xfd\x53\xd9\x1b\xf6\x58\x83\x77\xdf\x03\x85\x33\xe3\xcd\x30\x5c\x19\xf3\x5f\xe3\xab\x97\x74\x30\x7b\x04\x4f\x39\xfe\x4b\x74\xf8\xe5\x0e\x8e\x83\xca\x8b\x25\xe4\xf0\x49\xec\xbf\xcf\xbd\xfc\xf1\x2c\x06\x8c\x83\xf8\x4d\x82\x72\x3e\x95\xa5\x15\x49\xb9\x29\x15\x90\x2f\xed\x8a\xfc\xaa\x05\x15\x58\x6b\x94\x07\xa0\xb3\x5c\x22\x5c\x35\xcb\x6e\xda\x12\x05\x5d\x34\x81\x27\x8a\x16\x53\x3d\x92\x6c\xa5\x29\xba\x72\xdc\xfe\xc9\xa0\x4c\xd4\x59\x9e\x17\x66\xbc\x0c\x73\xc7\x27\x98\x42\x25\x14\x31\xfb\x96\x8c\x69\x18\x87\x24\x44\x51\xf8\x19\xbf\xe4\xb8\xa4\x91\xe5\xfb\x43\xfc\x3f\x5d\xd0\x53\x92\x29\x71\x3c\xac\xe9\xce\x04\xc7\x89\xd1\xde\xc0\xd6\x5a\x13\x40\x68\xc5\x4d\x48\x6c\xd6\x67\xf7\x8b\xd9\x26\xc9\xd8\x96\xe0\xb3\x1f\x8e\x7a\xb3\x82\x22\x94\xb0\x5f\xf3\x15\x2b\x67\xa9\x89\xf1\x93\x73\x7c\x9c\x54\x5a\x57\xcf\x92\x2c\xa4\x09\x7b\xf1\x21\x7b\x4f\x97\x7b\xec\x2c\x08\xda\xf4\xc1\x1a\x98\xd4\xdc\x98\xa4\xe2\x31\x42\x14\x66\x04\xc7\x2f\x93\x94\x4e\x92\x0b\x7a\x98\x32\xd1\x8e\xc3\x5f\xf8\x05\x16\xb7\x50\x7f\x8d\xaf\x86\x09\x4a\x83\xca\x78\xcb\xca\xe1\x6f\x09\xa7\x28\x4e\x7b\x04\xa5\x13\x4c\x8a\xcf\xb3\x68\xa9\x77\x02\xfe\x8e\x2a\xb4\x61\x5d\x17\x52\x5a\x17\xf9\xd6\x6a\x96\xe2\xf3\xd7\xf8\xea\x5d\x8a\xb3\x0c\x73\x97\xab\x7a\x39\x4e\x66\xb2\xfd\x84\xbc\x0c\xd3\x8c\xf5\xe9\xb8\x1c\x65\x39\x6a\x18\xad\xae\xf5\x04\x47\x47\x51\xaa\x51\xab\x6f\xd0\xd2\x46\x1f\xf4\xdc\x3e\xf6\x46\x49\x20\x82\xbc\xbf\x4a\xa6\xd8\x28\xdc\x35\xf3\x77\x63\xf5\x38\x54\x6b\xcc\xdc\xd4\x82\x02\xae\xf5\x5c\xc8\x62\x5d\x1b\x2e\xce\xa3\x70\x74\x86\x03\x5a\xae\x6a\x77\xe1\xa6\x6b\xf1\x7c\xad\x57\x18\x8b\xf1\x34\x4d\xaf\xb6\xcc\x4f\xab\xf5\xd8\x28\xcc\x2a\x77\xdf\xda\xb7\x65\x57\xb8\xfa\xc5\x05\xd2\xec\x6a\xed\x68\xc1\xb8\x0d\x8c\xaa\x19\x2d\x7e\xee\x77\x3b\x1d\xfc\x43\x35\xd8\x8b\x34\xd4\x82\x64\xcb\xc2\xb4\x2b\x84\x7b\xee\x77\xab\x9b\x93\xd8\xd5\xb0\xb5\x07\xbd\x26\x83\x2e\xd0\x94\x2a\xea\x61\x36\x22\xb0\xc0\xda\x72\xf1\xcc\x12\xde\x72\x1b\x95\xad\x29\xba\xd6\x73\x4b\xdc\x4f\x81\x0a\x34\x38\x17\x5c\x8d\x58\xdb\x48\x6d\xbd\xf3\x57\xe3\x04\x2c\xf2\x2d\xa3\x3a\x57\xed\xd8\x42\xbb\x35\xea\x6d\xd0\x97\xea\xfd\xf9\x09\x39\xd8\x3b\xc3\x57\xee\x86\x1e\x95\x57\x71\x8a\xc2\xa5\xa2\xc6\x2f\xf6\xe5\x88\x39\x2d\xd9\x4a\xd3\xe4\x62\x27\xb9\x88\x37\x64\xc1\xfc\x6a\x62\x2b\x7a\x18\x4e\x4e\x89\x2a\x4b\x2f\x2b\x55\x0d\xde\xdc\x94\xeb\x89\xc8\x8b\xa2\x4a\xbb\x97\xcb\xb6\x4c\x2a\xfd\x27\xcf\xf7\xfd\xac\xe1\x6c\xdf\xe0\xf1\xf2\xc9\xbe\x9f\x99\x53\x65\x95\x2c\x33\xbd\x8f\x7b\x4a\x73\x55\xbe\x79\x35\x11\xd7\xf2\x5b\x98\x62\x7e\x5a\x6e\x8a\x59\x40\xfb\xdc\x20\xb3\xc1\xab\xd7\x33\x7c\x15\x24\x17\xb1\xf6\xf0\x55\x3b\x15\x3c\x0b\x77\xc1\xe4\x43\x0e\x18\xd1\x33\xac\xa2\x96\xf5\x88\xe3\x72\x25\x2d\x48\xad\xc0\x18\x2e\x9d\xd8\x91\x9f\x00\x02\x95\x05\x06\x50\xa3\x2c\xbc\xe0\xcb\x3c\x81\xb9\x8a\xcd\xbf\x44\xe1\xfc\x86\x73\x52\x58\x80\xc2\x0d\x4a\x17\x81\x68\x44\xa9\xaf\x7a\x51\xd1\x70\x79\x78\xdb\xbd\xfa\xf0\xb6\xf7\x6d\x50\xf0\xdb\xdf\x43\xe0\xf2\x8d\x61\x4b\xf0\xee\xe0\xdd\xc1\x87\xdd\xc3\x8f\xaf\x0e\x8e\x8e\x3f\x6e\xed\x6f\xbf\x3a\x38\x04\x2e\xfc\xe9\x0b\x4d\x65\x45\x8d\xf8\xcf\x25\x59\xd1\xfb\x77\x3e\x98\xcf\x00\xc4\xde\xce\xc1\x2f\xfb\x3e\xe0\x3b\x03\x7b\x6f\x76\x5f\x1e\xfb\x2c\xcc\x3e\xfd\x3a\xdc\xfb\xf1\xd5\xb1\x0f\x52\x4a\x51\xc1\xc2\xf9\x39\xba\xb9\x71\x7e\x16\x32\xa2\x9f\x23\x17\xbe\xbe\x83\xd0\x41\xe9\xc2\x84\xc8\xe1\xe3\x3c\x16\x67\xe2\x3c\x1e\x55\x48\x06\x56\xba\xe0\x4a\x7a\x9f\xe2\xcc\xe6\x10\xaa\x70\xe1\xd5\x04\xb3\x7c\x18\xc7\x09\x23\xb1\xaf\xf1\x95\x35\x28\x4e\xce\xb3\x6e\x58\x86\xaf\xdd\xa9\x94\xc6\x86\x67\x3b\x18\x4a\x4a\xe4\x21\xda\x01\x5d\x05\x8b\x3d\x17\x63\x72\x9d\x9f\x23\xef\xfd\xbb\xdc\x39\xce\xad\x3b\x29\x10\x3e\x4b\x37\x14\x0d\xee\xa1\x23\x8e\x39\x75\x1d\x51\x0c\xbb\x87\x8e\x38\x4e\xd6\xf6\xc4\xb0\xd7\xd5\x5d\xa1\xa7\x78\x42\x5b\x4b\x6b\x3c\xc2\x94\x57\xd6\xee\x88\x03\x43\x40\xd0\x90\x31\xf7\x00\x82\xae\xf4\x56\x51\xc2\x1d\x07\xdf\x61\xa6\xd9\x0c\x8d\xb0\x7d\x92\x4c\xdb\x8d\x08\x56\x72\x80\x3b\x81\x54\x04\x41\x6e\xda\x51\x03\x91\x86\xf2\x87\x87\x0b\x7c\xb2\x79\x7b\xf5\x86\xd1\x3c\x75\x28\x1d\x36\x58\x67\x9b\xc8\x89\xf6\x55\xbf\x5e\x30\xf6\xdb\xbd\x8d\x82\x00\x40\x77\x30\x21\xd3\x4e\xf0\x60\x23\xed\x74\x2c\x17\xb8\x76\x9b\x8e\x17\xb7\xa4\x13\xba\x64\xdc\xfa\x84\xbd\xab\x9b\x1b\x20\xcb\x6a\xda\x68\x2f\x0a\xc7\xa4\xd3\xb1\x66\x29\x46\xdc\x5d\x38\xa9\xbb\x99\xf6\x9d\x2e\xfc\x06\x7b\xc9\xd8\x75\x52\xd7\xad\x89\xd2\x44\xe4\xf5\x16\xbb\x74\x3e\x5d\x4d\x47\x15\x9b\x86\x2f\xf9\xa2\x54\xde\xc9\xda\x42\xbb\x2d\xe6\xad\xfc\xc4\x0a\xe0\xcb\x66\x6e\x6e\x1c\x6b\xba\xe3\xc2\xae\x1e\x49\x00\x13\x34\x3a\x7d\xc3\xb0\xa7\xc6\x6f\x67\x01\x01\xeb\x84\x3d\xf7\x11\xb2\x88\x6b\x5f\x6f\x7d\x38\x6e\xf0\x43\xfd\x65\xf8\x1b\xe4\xbf\xc8\xac\xcb\x9e\xb4\xfd\x1a\xd5\x1d\xdd\x79\x46\x92\x4f\xe8\xe4\x0a\x41\x0c\x95\x51\xe1\xaf\xcc\xa8\x70\xf7\x32\xcc\x48\x18\x4f\xfa\x78\x31\x60\xe6\xd8\x24\x69\xfe\x8a\x4e\x9c\xaa\x96\xe7\x73\xd8\x27\x1e\x9a\xcd\xa2\x2b\xf1\x7e\x4e\x7a\x9a\x74\x5d\x21\xde\xe0\x4c\x5d\x90\xc7\x17\x63\x4f\x1e\x21\xb6\xbc\x7d\xd3\xcb\x37\x90\xb7\x8b\x92\xd5\xd1\xe4\x28\xcb\x58\x79\xe2\x4e\x93\x00\x47\x3a\x61\x60\x09\xca\x84\xc3\xe8\xc1\x30\x22\x8c\x17\xce\x52\x63\xcb\x8a\x10\x07\x28\x8c\x33\xab\xf0\xa2\x20\x18\xe2\x43\xf1\x35\x66\xa0\xc9\x64\x74\xa5\x6e\xbc\xa4\x82\x3e\x1a\x4d\xc4\xcb\xdb\x61\x2b\xa4\x05\x1d\xda\x9d\xce\x88\x4d\xa4\xaa\x1b\x7d\xb3\x9a\x9a\x68\x69\x56\x2b\x45\xe0\xc5\x37\xca\x73\xa6\x5d\xc3\x7c\x1e\x24\x39\xe2\xcf\x0d\x9a\x00\x6c\x13\x2b\xc1\x5c\x80\xa3\x13\x3c\xd8\x34\xbe\xfa\xf9\x97\x27\xdb\x75\xdc\x3e\x00\x6a\xe7\xbb\x30\x4e\x6e\x6d\x59\x1b\x25\x88\x5e\xfd\x94\x32\x4a\x9e\x1d\x7b\xf4\xfe\xe5\x03\x20\x63\x26\xd3\xcf\xd2\x9e\x00\x40\x49\xb7\xb5\xec\x72\x8d\x02\xae\x4b\xdb\x14\xb6\xd6\x61\x12\xeb\xed\xfe\x84\x3d\xe2\xf4\xac\x98\xa8\x0d\xac\x11\x0f\xcb\x4a\x5a\x0c\xa3\x80\xcf\xb6\x8f\x40\x80\x79\x44\x42\x3e\x12\x3a\x38\xe9\x6f\x08\x8b\xab\x5b\x98\xc4\xcc\x55\x9e\xd8\xfe\x16\x10\x61\x0b\x84\x4a\xc1\x26\x8b\x53\x5d\xf2\xe6\xa1\x50\x7a\x75\x52\xc1\xdf\x3a\xca\xd8\x46\xaa\xbd\xb7\x0c\x8b\x0a\x9b\x48\x1e\x5f\x85\x52\xfc\x33\x67\xc0\x4a\x83\xca\x95\x35\x66\x4d\xed\xc8\x23\xe2\x9d\xb4\x7d\x80\xed\x9c\x88\xd5\x8f\x70\xd3\x56\x46\xd2\x0a\x25\x62\xfe\x13\xc6\x5f\x47\x8f\x14\x88\xdb\xb7\x87\xb1\x36\x87\x3b\x8c\xb2\x80\xc2\xf5\x4e\xe2\x8d\x46\x74\x46\xed\xcf\x3b\x1c\xda\x1a\xa9\xd5\x49\x9d\x1e\xeb\xb1\xe9\x89\x81\x82\x40\x80\xb4\xf9\xa1\xc1\x7d\xf7\x15\xab\x2d\x3d\x1f\x9c\x8a\x51\xcb\x28\x3e\x6e\x93\x63\xa3\x7c\x56\x58\xdb\xa2\x5c\xb3\x76\xc2\x9c\x94\x8a\xac\xf5\x06\xb0\x3c\x19\xb7\xe1\x99\xc3\xb9\xa3\xc6\x71\x84\x36\xf5\x8f\xfe\x5a\x0f\xc6\x3e\x00\xb6\x99\x38\xe4\xf9\x5a\x4f\x3f\xae\xc8\xa0\xd3\x71\xe2\x07\xbe\x79\xa4\x91\x41\xe1\x54\x63\x09\x7d\x23\x41\x3b\xdb\x5c\xfd\xc8\x2b\xf1\xbf\xc4\xbd\x16\x1d\xb0\x46\x59\x43\x5a\x65\x18\x3f\xf0\x41\x0b\xd0\xfb\x5c\x5c\x8c\xce\x23\x90\xa7\x29\x77\x21\x37\x2d\x3f\xe2\xf3\x9f\x37\x37\xd2\x50\x98\x0f\x91\xdd\x11\xb1\x71\x51\x96\x6b\x54\xa1\x62\xe5\xd4\x2f\x6f\xc2\x50\xe2\xc9\xbd\x21\x15\x5f\xa6\xee\x8e\x91\xb6\x59\x14\x8e\xb0\x43\x60\xcf\x85\xca\xd0\x56\xc7\x16\x2b\x5f\x24\xd9\x05\x5d\xc3\x68\x1e\x72\xd5\x5e\xc3\x4c\xb2\x61\x3f\x56\x14\xf7\x57\x41\x12\x05\xce\xb4\x71\x05\x31\x34\x19\xd9\x95\x08\xe1\x97\x7e\x23\x93\x36\xe6\xb7\xaa\x43\x35\x86\x81\x32\xf5\x34\xec\x3f\x85\x79\xa7\x9a\x64\x21\xc4\x8c\x66\x08\x26\x0c\xdf\x67\x19\x9e\x07\x09\x93\x44\x33\x0e\x8a\x24\xd2\x40\x94\x56\xdf\x41\x04\x29\xc3\x76\x2e\xa6\x67\x45\x8f\x34\x93\x02\xa7\x28\x54\x94\x7e\xe7\x0f\x45\x02\x43\x58\xee\xf4\xc5\x72\x0a\x54\xb4\x5a\xaf\x8f\x2b\xcf\x7c\x89\x4d\x2a\x71\xaf\xc9\xcd\x8d\x83\xf5\xf9\x1a\x08\x5e\xf2\xfc\xbc\xc4\x39\x3c\x2f\x54\x65\xc9\x23\xb2\x25\x3e\xa2\x20\x10\x1a\x85\x17\xd1\x3c\x95\x97\x78\xfd\x3c\xa1\x97\x76\xe6\x28\xa6\x36\xf0\x2c\x2f\x54\xd5\xa9\xc8\x6e\xde\x29\xc1\x97\x4d\x18\x62\x55\xac\xdc\x71\x49\x12\xab\xca\xca\x51\x54\x0b\xbe\x6c\x6a\x9d\xb6\x54\x06\x1d\xcb\x76\x98\x42\xa7\xe9\x84\x28\xe1\x64\x45\x2a\xe4\x62\xba\xb4\xaa\x80\xe5\xde\x38\x8c\x83\x3d\x4a\x36\xed\xa6\x05\xf8\xd3\x1c\x45\x99\x43\xca\x08\xe4\x2e\xdc\x0d\xec\xfb\x3e\x93\x17\x6f\xb2\x78\x73\x31\x7f\xc2\x10\x6f\x96\xbb\x91\x07\x72\x3f\x5e\x5b\xeb\x8b\x6a\x3b\x07\xbf\xec\x77\x3a\x8e\xac\x1a\x4b\xa2\x6c\xa9\xb6\x19\xfb\xdd\x7e\xfc\xe0\x81\x5b\xda\xbd\x92\x65\x2d\xd4\x3c\x89\x07\x96\xb2\x3a\x2f\x51\x4a\xf7\x6a\xb3\xbc\x6c\x94\x26\x51\xb4\x17\x93\x84\x19\x42\x5f\x0f\xf1\x29\x3a\x0f\x93\xb4\x0f\xb2\x69\x92\x90\x53\x00\x87\x51\x32\x3a\xeb\x83\x91\x90\x6c\x86\xe2\xd9\x6d\x8c\x51\x8a\x33\x02\xb4\xbd\x46\x37\xed\x56\x1c\xbc\xad\x16\x65\x16\x10\xac\xbc\xe7\x73\x13\x1a\xb1\xf2\x94\xa5\x77\xea\x09\xc4\x2c\x9c\x61\xc7\xe9\xc2\xf7\xd8\xfb\xe4\x3a\x3d\xbb\x4c\x30\x76\xaf\xe3\x4e\x87\x14\x9a\x5e\xd8\xcc\xee\xb9\x79\x79\xbb\x5b\x34\x98\x3a\xce\x37\x58\xd5\xd4\xda\x94\x3f\xca\xd5\xdd\x21\x3d\xb3\x85\xce\x5b\xaa\xb9\x99\x2d\x10\x91\x11\x70\xca\x1d\x57\x2d\x56\xe9\x7a\xa4\x82\x17\x9a\x2c\xff\xa6\xbd\x14\xef\xc8\xa9\x40\x04\x36\x9f\xe2\xdd\x29\xf7\x1c\x9e\xa3\x62\x55\x55\xc8\xbc\x73\xea\x71\x1e\x5f\x20\xef\x68\x86\x46\xb8\x6a\x9e\xf2\xe4\xb7\x82\xde\xda\x9c\x50\xdc\xf3\x06\x67\x29\x3e\xc7\x31\xa1\x48\x3b\x4b\x52\x72\xc4\xd0\x98\x72\x7d\xf2\x4c\x35\x90\x51\xa8\x7f\x58\xb3\xb6\x56\x77\x92\x8b\xf8\xb6\xed\x32\x7d\x8f\xde\xb2\x34\x23\x60\x48\xd0\x66\x36\x06\xc7\x68\xd8\xe9\x38\xed\x46\x0b\x78\x73\xa3\x55\x7c\x81\x46\x67\x4c\x77\xc1\x2c\x64\x55\xf2\x6e\x36\x42\x33\x25\xb7\xb0\x21\x51\x0d\x70\xf3\x20\x9b\x86\x25\x87\x6d\xd6\xd6\xf7\x14\x12\x46\x3b\x7c\x9e\x4c\xe7\x90\x91\x64\xb6\x37\x9d\xe2\x20\x44\x04\xbf\x4b\x93\x19\x9a\x48\xaf\xd7\x86\x65\xa8\x7d\xff\xc8\x47\x1e\x72\x83\x75\x3a\xcb\x2c\xcc\x55\xd1\xdc\xa4\x3c\x67\xec\x2d\xe7\xca\x12\x6a\xb4\xac\x3b\xcb\xb9\x57\x70\xfd\x4d\xcf\x6d\x61\xd3\x34\x27\x07\xe3\x3c\x4a\x0f\x97\x4c\x5a\x57\xa2\xc7\xbc\xcd\x88\x82\xdb\x01\xf7\x64\x5b\x48\xf1\x02\x4c\xf0\x48\x08\x93\x98\xb9\x73\x01\xa2\x66\x77\x35\x2f\x89\xbd\x14\x47\x88\xe0\xe0\x98\x99\x01\xde\xdc\x04\xc9\x88\x5d\xec\xc4\x53\x61\x61\x67\xb7\x61\xdc\x78\x73\x30\xcb\xfb\x90\x43\x5c\xc1\xf2\x0b\xae\xc8\x92\x23\x58\x17\x3d\xa7\x30\x68\x66\x51\x27\x9f\xa0\xda\x9e\x12\xda\x4f\xcc\xe7\x5d\xf5\x64\xb0\x82\x4a\xa9\x1b\x84\xb8\xd2\x3b\xae\xdb\xf4\x68\xed\x0e\xf8\x13\x41\x71\x59\x17\x77\xf0\x5b\x92\x5b\xdb\x7d\xe6\xa4\x3b\xa8\xa5\xb0\x66\xe9\x0d\xed\x1a\x58\x60\x6c\x6c\x21\xab\x09\x27\xc4\x4c\xe2\x2e\xcd\x6d\x2d\x73\x16\x2b\x64\x4e\x7b\xa1\x6f\x9e\x83\x99\xba\x03\x5a\xd5\xf5\xc5\xfb\xc4\xed\xa3\xe3\x0b\xad\xd3\x84\x3d\x68\xe2\xfa\xa7\x97\xbf\x25\xf2\xe3\x37\x95\x1c\x27\x79\x81\xc2\x53\x8f\x15\x15\x54\x38\x71\xd2\x84\x2b\x88\x42\xcb\xb5\xad\xb9\xaf\x23\x38\xc6\x70\xfa\x57\x78\x3c\x7a\x8d\xbd\xf9\x63\x98\x21\xf8\x5b\x04\x5f\x45\xf0\x45\x04\x7f\x46\xf0\x1d\x73\x80\x04\x5f\x28\x1f\x48\x10\x95\x67\x07\xc9\x2a\xba\xb2\x92\x96\xac\x42\x45\x66\x46\xc1\xd5\xfc\x1d\x12\x1b\x40\x54\xb8\x17\x87\x5e\xfc\xb1\x7f\xe4\xc5\x8f\x3f\x53\xea\xe0\x3a\xf1\xcd\x0d\x71\x17\x90\x54\x18\xca\x91\xb2\xcf\x9b\xa2\x5f\x76\xdd\xf7\xcd\x93\x55\xbc\xe0\x7e\x51\xd7\x81\x95\xae\x01\x47\x11\x1c\xd6\xbb\x06\xfc\xa3\xe8\x1a\xf0\xe9\x7d\xb8\x06\xe4\x60\xfc\xd7\x31\xe0\xdf\xcd\x31\xe0\x8e\xcd\x31\xe0\x71\x13\xc7\x80\x34\xe1\xa1\xee\x0d\x90\x36\xf2\x28\x77\xa2\xfc\x18\x1e\x54\x7b\xfe\x7b\x02\xdf\xd9\x3d\xff\x49\xdf\x7d\xdc\x3d\xe0\x7e\x9d\x07\xc0\x67\xf0\xb0\xde\x41\xe0\xcb\x5a\x07\x81\x77\x75\x0c\x78\x17\x87\x7f\xf7\xe5\xcc\xef\x9e\x1d\x07\xae\xee\xf0\x8f\xd0\x63\x22\xaa\x93\x5d\x36\xf6\x62\x2d\x02\x0c\x5a\x2c\x2b\x92\x82\x0f\x6b\x94\x68\x3e\xac\x79\xd8\xc0\x1e\x4c\xcc\x33\xe4\x2f\xf2\x0f\xbd\xf2\xcb\x69\x7e\x91\x01\xc6\xb1\xb3\xbe\xca\xb1\x13\xf2\x16\xe8\x7d\xac\xd2\x6f\x74\x72\x27\x2e\xe5\xaf\xe4\x4f\x5e\x19\x4e\x19\x61\x96\xf8\x5d\x38\xba\xbd\x69\xc2\xc7\x30\xf0\x19\xd4\x02\x44\x10\xbd\x5f\xac\x81\x07\xad\x07\x0f\xb2\x44\x65\x6b\x8f\x66\x99\x3d\x82\x4c\xff\xb3\x22\x11\xaa\x2e\x4b\x0a\xfe\xb0\x51\x40\x52\x55\xbd\xa8\xd0\xff\xd2\x0a\x8c\x79\x73\x05\x46\x69\x59\xe4\x6a\x68\xa1\xf0\x1a\x3f\x4e\x6e\xf4\xc8\x52\xd3\x12\xb4\xed\x3d\x4a\x05\x54\xc5\x43\xcc\x52\x79\x2f\xac\xf1\xdb\x43\x34\x19\x71\x5e\xd3\x27\xba\xa5\x26\x45\x1e\x8b\xa3\x2b\x7b\x6f\x9b\xc5\x51\x48\xf4\xb1\x8d\xcb\xc7\x6e\x5f\x99\x41\xe8\x55\xfe\x26\x61\x34\x46\xc9\x92\x80\x52\x26\x21\x95\x33\x34\xbd\x56\x36\x20\xa1\x5a\xf8\xb4\x1c\x4a\x35\x61\xd4\x4e\xef\x40\x77\x98\xb8\x42\xb7\x73\x6a\x5b\x0d\x92\x34\x5b\xbb\x06\x66\x7f\xd5\x66\x3c\x22\xbb\xca\xb3\xa8\xac\xad\x48\xce\x97\x26\x16\xb3\x2f\xca\x31\x44\x30\x85\x98\x85\x32\x60\x13\xcf\x43\x10\x24\x15\xc1\x09\x22\x98\xf0\xa2\x7e\xbb\x07\x13\x1b\x51\x48\x8c\xa6\x8c\x97\x85\x15\xc1\xe1\xf8\x18\x65\xbb\x2c\x14\x5d\x52\x79\xed\x5d\x71\xc7\x0c\xad\xb1\xe9\x73\x37\xff\xa7\xc9\xad\x1d\xfe\xab\x83\xf2\x1f\x70\x43\x1e\x46\xf0\x8a\xdd\x90\x4f\x13\x76\x55\x4e\xe0\x79\xfd\x55\xf9\x1b\x75\x55\x5e\xbf\x47\x2f\xfa\xa5\xab\xb2\x91\xce\xe3\x3f\xfc\x7b\x81\xfe\xbb\x5c\xa0\x7f\xb3\x5d\xa0\x7f\xbc\xd5\x05\x5a\xf7\xaf\xff\x50\xb6\xfa\x38\x77\xc3\xff\x84\x17\x33\xaf\xc8\x9f\xeb\x3c\xe8\xbf\x28\x65\x3e\x2e\xb6\xf0\x3d\x7c\x5f\x77\x8b\xee\x75\xe1\xa7\xda\xfc\x1e\xfc\xe5\x2b\xb8\x66\xaf\x17\xa2\x78\xb0\x67\x97\x42\x93\xf2\x5f\x72\x15\x67\x07\xeb\xf8\x5e\x0e\x56\x98\xc0\x8c\xd7\x1e\x15\x22\x6d\x8e\x8c\x83\x35\x85\xb3\x44\x85\xa0\x2a\x9c\xae\x18\x8e\x2c\x7c\x7d\x06\xdb\x23\xa3\x9c\x35\xea\xe6\x8e\xa8\xd7\x4a\xf1\xa7\x79\x98\xe2\xac\x35\xc4\x61\x3c\x69\x71\x9a\x19\xb4\xc2\xb8\xf5\x83\xfd\x70\x7a\xae\xc7\xd5\x1c\xd9\xe2\x6a\xae\x7a\x5f\xf8\x93\xae\x05\xb4\x16\xd3\x8e\x98\xb7\x02\xa1\x0d\x5b\xee\x7c\xa1\x10\x53\xbe\xcc\x8d\xe0\xc0\xb0\x3d\x68\x12\xba\xbe\x1c\xd6\xcb\x52\x8b\x14\xe2\x7b\xc1\x15\xc7\xd4\xbb\x87\x10\x5e\xa7\x49\xa5\x17\xc8\x95\xc3\x79\xf1\x1b\xc7\xca\x82\x1b\x89\xa2\x56\x01\xce\xc3\xa6\x4f\xe0\x05\xa1\xb2\x70\xf9\x9e\x8e\x09\x0e\x7b\xf7\x7e\xab\x28\xd1\xd2\x37\x3f\xbb\x21\x41\x92\xe3\x9d\x41\x30\x73\x21\x52\x8d\x14\xe9\xfc\xef\x26\x45\x4a\x12\x23\x40\xe7\xe4\x0e\xf7\xb7\x59\x8a\xcf\xc3\x64\x9e\x71\x9b\x9f\x14\xcd\xee\xe3\x41\x74\xc5\xed\xac\xdc\x97\x46\x71\x3e\x9a\x6e\xc7\x2d\xaf\xa5\xe3\xa1\xaa\x38\x63\x8f\x02\xeb\x86\x62\xe9\xab\xe0\x11\x46\x3e\x3d\x7c\x27\x4a\x1e\xcb\x18\x8e\x15\x6f\x0d\x0d\xdf\x2d\xd6\xb9\x24\xb3\x7b\x97\x4f\x8d\x6b\xe3\xa9\xe2\x05\x94\x77\x52\xf1\x12\x30\xd8\x8b\xfb\x20\x4d\x12\x02\x24\x72\x5c\xdd\x83\xfd\x2d\x8e\x94\x37\xfa\xf8\x0f\x46\x30\xa4\xab\xd5\xb1\x9a\xfe\x71\x8a\x46\x67\xb9\xcb\xd5\xa2\x03\xea\xb2\x2d\x6e\x94\x8c\x50\xc4\xc0\xc7\xad\x75\x02\xed\x5d\x55\x12\x8f\xc3\x89\x7f\x9d\x91\x34\x1c\x91\x7e\xbb\xbb\x10\x42\x21\x61\x92\xe1\x1b\x63\xf1\x26\x98\x38\x67\xde\xeb\xae\x5b\x31\x26\xc3\x9d\xba\xfd\x69\xc6\x38\x9c\x54\xc9\x14\xc4\x60\x0e\x86\xb4\x37\x0f\x65\x59\x38\x89\x1d\x3d\x0b\xf2\x57\x52\x9b\xd7\x8b\xbe\x26\x89\x4a\x62\xee\x3d\xc4\xea\x22\x4a\xb3\x5d\x28\x3a\x54\xde\xa8\x9f\x83\xf0\x71\x7f\x73\xd3\xae\xb4\xc9\x91\x56\x26\x45\xf8\xde\xdc\x68\x66\x2a\xca\xdd\x15\xb3\x13\xe6\xbf\x7d\x15\x9c\x72\x76\x88\x87\xc9\x3c\x0e\x76\x23\x6e\x71\xa3\x2a\x19\x36\x32\xee\xa6\x76\x1e\xbe\x41\x19\xf7\xe1\xa4\xbf\x5b\x53\xd3\xd8\x8d\xf6\xc6\x07\x73\x92\x85\x01\x76\x5c\xb7\x5f\xec\x71\x98\x10\x92\x4c\x57\xef\x94\xd9\xc9\x34\xee\x55\x5f\x34\x8f\xe3\xd6\xa6\x75\x0d\xa4\xd1\x54\xbf\x0a\x51\x35\xfe\x83\x5b\x7f\xab\x31\x1c\x8c\xc7\x47\xa3\x14\xe3\x78\x37\xaa\x7f\x1e\xa9\xcc\x8b\x84\xbb\x5d\xde\xb3\x03\xb2\x19\x8a\x73\x5e\xcf\xb4\xae\x6a\xe2\x17\x40\x15\x46\x41\xc0\xef\x12\x18\x82\x64\x3c\xce\xd8\xa8\xf8\x0d\x62\x2d\xe5\x90\xc6\x29\xd0\x9f\xc5\xa0\x20\x50\x4b\x60\x63\xd2\xc2\xb1\x53\x89\x74\xca\x0f\x71\x8e\x3a\xe2\x21\x7c\x25\x7c\xe4\x72\x15\x16\x7f\x79\x35\x3d\xf2\xaa\x7d\xfb\x28\x20\x84\x71\x86\x53\xf2\x02\x8f\x93\x14\x3b\xd8\x9b\x21\xba\x87\xa4\xeb\xf2\xd2\x88\x29\xc1\xe3\xfa\x8a\xa3\x70\x18\x85\xf1\x64\xb3\x41\x6b\xfb\x49\x80\xad\x13\x31\x9b\x12\xc8\x94\x2f\xcf\x6c\x86\xe3\x60\xfb\x34\x8c\x82\xe5\x4d\x69\x26\x48\xfc\xc1\x4c\xed\x3a\x2d\x35\x0e\x34\xf7\xb7\x75\x03\x8a\xba\x3a\xbc\xc4\x7b\x2a\x3e\xe4\x52\x43\xd2\xee\xba\xbe\x46\x71\x5e\x30\xc0\x11\x26\xb8\x55\x5e\x0a\x3d\xa3\x0c\x8d\xfc\x59\xce\x3b\xfd\x20\xae\x3a\xbc\xe5\x69\xbd\xa5\x9b\xf2\x49\x4b\x62\x5b\x1e\xa7\x00\xcb\x4b\x14\x7c\x53\x56\xdc\xba\x6a\x16\xc4\xa9\xd9\xe1\x56\x04\x37\x76\xfd\x5a\x0f\xa8\x23\xda\x4e\xc2\x4a\x4e\x3b\x3f\x84\xf8\xe2\xb6\xc3\xb4\x02\xa2\x40\xce\x0c\x6b\x49\x0b\x4e\xd8\xb7\xad\x59\x26\x7f\x02\x91\xe3\xb9\xa3\xbf\x21\xa4\x37\xdc\x10\x45\xd1\x95\x22\x10\x6c\x27\xd8\x19\xc2\x73\x3b\x20\xbd\x4f\x73\x9c\x5e\x49\x99\xe8\x56\x14\x39\xdf\x9e\x9c\xa6\x78\x3c\xe8\xc7\x09\x71\x4e\x24\x94\x7d\x0a\xe4\x81\x0b\x5b\xc3\x39\x21\x49\xcc\x33\xa5\x8c\x76\xe0\x56\x14\x66\xf7\x8e\x86\x65\xf9\x25\xac\x61\x61\x82\x2f\x09\x4a\x31\x6a\x58\xfc\x44\x08\xae\x70\x10\x32\x73\x4c\x9f\xcb\x05\xab\xe6\xa8\x52\xec\x05\x5a\xdf\x5a\x0d\x55\xd5\x22\x58\x70\x6a\x9c\xa4\x0e\x27\xd7\xdd\x0d\xe1\x5d\xb2\x62\xf9\x0a\xef\xf1\xc6\x46\xcb\xf2\x58\x60\x9d\xca\xb3\xb2\xae\xb5\x13\x3c\x70\x61\xdb\xda\x92\xbb\x81\x1f\x3c\x70\x37\xcc\x89\x18\xec\x4b\xed\x3c\x1a\xcc\x61\xad\xb7\xc1\xfd\x69\x0a\x67\xb7\xe8\x9e\x66\x52\x68\xc8\xdd\xc0\x6b\x6b\xc5\x89\x14\xf8\x9e\xca\x30\x18\xc5\xdd\xa0\xf8\x2d\xfb\x4e\x96\x5c\x65\x15\x9d\x31\x07\xa1\x7c\x2b\x57\xfb\x1b\xed\x74\xb0\x24\xb2\x4e\xee\x93\xc7\xde\x39\x65\xaf\xdd\x4d\x2c\x62\x47\x37\x57\xf5\x16\xcf\x4a\xc9\x71\x14\x8f\x8d\x12\xe3\xa8\xb8\xee\x8a\x4b\xe2\xbd\xbb\x68\xd7\xa4\x3b\x93\xa4\x42\xae\x73\x1b\x37\xee\xea\x7a\xaa\x49\x72\x9a\x8a\x6f\xc2\x2a\x0f\x86\xea\x6a\xe3\xd0\x6b\x6b\xbb\x07\x8f\x3c\x7c\x7e\xac\x47\x1f\x64\x2c\xb6\xe6\x5c\x50\x8c\x40\x5c\xb4\x06\x4a\xf3\x3c\x5d\x41\xf2\xf2\x17\x3a\xe4\x1b\xde\xd9\x18\x7a\x88\xe1\xf6\x5f\x21\x29\x42\xd2\x06\x3a\x43\x70\x9a\xc0\x57\x51\x3e\xa9\xed\x44\xf3\x32\xc8\xdf\xb6\xbb\x70\x2b\xc9\x23\x15\x6e\x27\xb5\x91\x0a\x5b\x86\xca\x7f\x01\x8f\xee\x5d\x42\x5f\x56\x7f\x8f\x0a\x06\x73\x5c\x5c\x51\x10\xd0\x47\x70\x54\x78\x27\x9c\xc0\x91\x37\x4a\xa6\xd3\x24\xe6\x4f\xdf\x33\x3f\x83\x23\xa6\x93\xf0\xdb\x3d\x38\xca\x55\xe2\x23\xef\x23\xaf\xe9\xb7\xbb\xb4\x44\x59\x3a\x3e\x5a\x55\x3f\x3e\xd2\x15\xe3\x23\x8b\xdc\x7e\x14\xa5\xc7\xc2\xf7\x47\xed\xbb\x54\x56\xa6\xf2\x09\x2e\x1f\x35\x86\xf9\x8b\x71\x3e\xbb\xa5\x0e\x46\xa4\x55\x0c\x2b\xae\x7e\xda\x9e\xfd\x69\xaf\xca\x4f\x93\x0b\xf7\xee\x41\xfc\xcf\xad\xda\x7d\x5b\x38\xff\x5c\xcf\xbf\xad\x7e\x8d\xd1\x8a\x1a\xff\x19\xca\xb2\x8b\x24\x0d\xfe\x86\x1a\x7f\x2d\xac\x2b\xc7\x15\x1d\x6d\x2c\x06\x01\xd2\x5e\x1e\x9e\x26\x70\x6b\xa9\x35\x40\x18\x16\xac\x01\x7a\xdd\xbf\xca\x1c\x40\xcb\x63\x7a\xdd\x35\x34\xe2\xda\x19\x40\x57\x15\x40\xc0\xb9\x70\xd6\x63\x0e\x5f\xe9\x39\x77\x55\xcd\xff\xdf\xca\xc8\xa0\x00\x80\x32\x30\x4d\x80\xd9\x00\xc4\xec\x09\x64\xcf\x61\x3c\x4e\xb4\x55\xc9\xd2\xb5\x24\x8e\xae\xfe\xb9\xf6\x0c\x69\x68\xb1\x67\xf8\xe9\xde\xed\x19\xf8\x23\x80\x9f\x53\xf8\x88\x2e\x81\x5c\x2d\xcb\x13\x80\xd7\x76\x13\x06\x6e\xdf\xf0\x6b\x29\xf3\x49\xd9\xbe\x01\x87\xf5\xf6\x0d\xa4\x36\xbf\x07\xe3\xaa\xfc\xaf\xcc\xbe\x61\xbd\x64\x4e\xa0\x88\xdf\xbd\x99\x25\xfc\x0d\x4c\x20\x3e\x7c\x51\x13\x08\x0c\x8f\xf4\xd7\x08\x06\x87\x95\x94\x38\x2c\xca\x4f\xc9\x07\x0b\x4d\x0c\x21\xde\x89\xb3\x78\x99\x21\x44\xf9\xcc\xd6\x0c\x21\x2a\x18\x34\x93\x6b\xa9\x8a\x47\xcc\xee\x80\xc9\x0c\xa7\xe4\xca\x29\x8b\xd8\x18\xad\xc5\x9b\xcc\x69\x08\xe8\x03\x39\x0c\xc0\x9c\xdf\x56\x18\x60\xfc\x6b\xe2\xf0\xa7\xbf\x42\x81\x65\x33\x89\xed\xd5\x8c\xaa\xf9\x31\x2d\xd1\x6f\xa5\x07\x2a\x5f\xd6\xbe\x61\xc5\x97\x30\x67\xb7\xbd\xa2\x6e\x61\x78\x84\xe1\xd7\xf6\x1e\xe6\xe3\x1d\x4c\x1a\x82\xab\x18\x4d\xc3\x91\xdf\xee\x59\x5f\x55\xd4\xc7\x9b\x95\x87\x9a\xfa\x2d\xb9\x73\x7e\xc2\xdd\x83\x7a\xbf\xc1\x4d\x25\x45\x41\x98\xe4\x9c\xf3\xad\x62\x5c\x4c\x23\xf8\xb4\x3e\xc6\x05\x9b\x9e\x9f\x72\xf9\xa8\x0c\x6f\xb1\xfa\x3b\x2d\x73\xb0\x65\x2c\x65\x17\x92\x51\x34\x70\xad\x77\x8f\x44\xde\x3d\x1e\x8a\xab\x87\xe5\xe6\xd1\x88\xbd\x8b\x4c\xf6\x8e\xfe\xe8\xe5\x1c\xd9\x3a\x44\x61\x81\xd3\x33\xf9\x9b\x22\x8f\x21\xf9\x1b\xeb\x61\x3d\x8d\x2a\x0f\xe9\x8b\x7b\x7a\x00\x60\x79\x60\xae\x9f\xcd\x1f\xf3\xb3\xf9\x6f\xf9\x3c\xf0\x90\x22\x8d\xa0\xbe\x55\x24\xed\xd5\x3d\x80\x52\x84\x53\xb7\x88\x92\x22\x83\xdb\x41\x5c\x98\xe4\xba\x5e\x84\xae\x92\x39\xc9\x8d\x3d\x23\x83\x71\xcd\x3d\xcf\x45\x1e\xc7\xe6\x34\x89\x72\xb7\x73\x51\xc5\xbb\x0b\x44\x73\x98\x63\x28\xbf\xdd\x83\x91\x5d\x0a\xb4\xc7\x0a\xd4\x4a\x81\x78\x1b\x15\x42\x20\xd1\x01\xc8\xb8\x6f\xcb\xdc\x45\xfc\x26\x18\xa3\x28\xc3\xa0\xed\xfb\xb8\xdf\x6e\xe3\xdb\xc4\xf1\xc3\x64\x2b\x0d\xd1\x61\x12\xe1\xcc\x74\x8b\xa8\x92\x2b\x85\xf0\x49\x24\x94\x26\x8c\x52\x48\x1d\xc9\x26\xe0\x12\x00\x21\xd4\xbf\xab\x2c\x69\x99\x04\x69\xe5\xf7\x21\x9c\xac\x19\xa2\xa2\x5b\x50\xe1\x8b\x64\x59\xa4\x21\x0e\x94\x3c\xbe\xd0\x07\xee\xb9\x60\x19\x01\x96\xe6\x8f\x14\xba\xf4\x76\x41\xff\x16\xae\x52\x5f\x50\x42\x65\x8a\xa8\xf6\x84\x0b\xb4\x1c\xa7\xed\x22\xaa\x73\x26\xa2\x4a\xea\x85\x53\xe7\x61\xc1\xab\xc3\xbd\x3c\x55\xc9\xe6\x43\xca\xda\xff\xeb\xd7\xe1\x6f\x27\xc6\x19\xdb\xc4\x38\x59\xf1\x70\xb7\x89\x71\x68\x9d\x87\xb9\x44\xe7\x91\x2e\xd1\xe1\x7e\x1d\x46\x75\x02\x93\x27\x70\x1e\x56\xba\x7d\x78\x0a\x83\x52\xa6\xf6\x5c\xe5\xb4\xae\xe1\xef\xe1\xac\x56\x10\x73\x5f\x02\x19\x45\x1a\xe4\x26\x09\xc5\x81\xc3\xe4\x29\x7c\xa7\x36\x17\xdc\xd8\x1f\x9d\xdc\xb3\xa4\xe4\x2f\x96\xb8\xbc\xfd\xbb\x19\x86\xbf\x8a\x20\x8a\x60\x86\x8c\xbb\xd4\x9b\x7f\xc4\x2c\x2e\xff\x59\xdc\x20\x73\x93\x56\xc5\x0c\xd6\x5c\x52\x9b\x3e\xe0\x29\x0e\x47\x8d\xbb\x3a\x7c\x27\x71\xaf\x09\x33\xc6\xe0\x63\x13\x1e\xd3\xb6\x18\x1d\x4f\x52\xdd\xff\xfd\x6b\xec\xbd\x7e\x0a\x55\x9b\x3e\x31\x42\x35\x89\x33\x55\xd0\x8f\xda\x18\xae\xac\xa7\x4d\x46\x94\x34\xbf\x71\xea\x54\xee\xf3\xb3\xda\x4c\xfc\x0a\x79\x45\x31\xc2\xbb\x32\x8b\x1c\xac\x4b\xf8\x45\x06\xa7\x59\x84\xad\x17\xf7\xaf\x59\x87\x79\x6b\xbf\x5e\x1f\x8a\x1c\xe0\xb3\x3b\x71\x80\xe6\xd7\xbf\x5c\xdf\xdf\x82\xeb\x3b\xb2\x71\x7d\x93\x26\x5c\xdf\x72\x6f\x5e\x57\xd5\x6c\xdd\x13\x38\xb5\xb3\x75\xa6\x2a\x6f\x58\xc7\xde\x3d\x83\xdb\xf5\xdc\xdf\xd6\x57\xa0\x86\xb3\x16\xd5\x09\x79\x41\x63\xf7\x0f\x57\xb5\xfd\xfe\x85\x1d\x7f\x5d\xfe\x73\x1c\x7f\x1d\x89\x00\x33\x77\xf0\xfc\x25\x63\xd4\xd4\x2a\x3c\x76\xff\x6e\x5c\x6d\x95\xaa\x63\xef\xbf\xc0\x17\xa9\xb4\x5a\xff\x1b\x9a\x5e\xdd\x9a\x6d\xf9\xbd\xc8\xb6\xdc\x8b\x3b\x52\x05\xc9\x7f\x25\x57\x7f\x37\x1e\xe6\xd2\xc6\xc3\x9c\xdd\x0f\x0f\xf3\xb1\x8e\x87\xb9\x68\xc2\xc3\xbc\xaa\xe7\x61\xde\xd6\xf3\x30\x6f\xbe\x02\x1e\xe6\x1f\xee\x06\x85\x79\x24\x3d\xfe\xc2\x8c\xc9\xde\x3f\x87\x31\x39\x16\x94\xf3\x4e\xac\x09\x51\x8d\xd4\x32\x27\x07\xff\x14\xe6\xe4\xdd\x57\xfd\x40\x03\xbe\x8a\xe0\x5e\x04\xc3\x04\x0e\x13\x98\x24\xf0\x2c\x81\x6f\x13\xb8\x9b\xc0\x83\x04\xbe\x49\xe0\x79\xa2\xe6\xb1\x7f\x1b\x7b\x12\x8b\xf9\xc8\x3c\xc3\xe9\x0e\x1e\x87\x31\x0e\x7e\x09\x03\x72\x6a\x0f\x00\xc2\x0e\xc9\x37\x61\xc6\xe8\x99\xc3\x1c\x39\x4e\xd2\x30\x58\x1b\xe1\x28\x5a\xbb\xa0\xf5\xd6\x3e\xe3\x34\x01\xae\x1e\xc4\x60\x14\x85\x38\x26\x87\x3c\xc4\xa5\xc7\x4a\xe5\xf0\xcc\x5b\xe4\x6f\x9a\xea\x1a\x85\x79\xdc\x12\x1e\xbd\xe8\x05\x4a\x2b\x07\xab\x7a\x48\xc6\xe3\x0c\x13\x56\x6e\x0d\x8b\xc1\xb0\xaf\x42\x63\xcb\x5b\xd2\xca\xdd\xdc\x74\xf3\x87\xf2\xc9\x74\x36\x27\x38\x78\x85\x79\x40\xfd\xca\x16\x66\x28\xcd\xf0\x5e\x4c\x9c\x09\x26\xdb\xa2\xd2\x11\xb9\x8a\x30\x85\xcb\x24\x37\xdb\xe3\xc1\x66\xc1\x29\x6f\xcf\xa5\xd4\x22\xef\x4c\x01\xb3\x2e\xe2\xc7\x04\x93\x17\xc9\x9c\x6d\xfc\xed\x1c\xfa\x12\x8d\xaf\x49\x32\xeb\xab\xc1\x10\x8f\x24\x33\x46\x91\xf8\x6b\x64\x3d\x87\xa7\xb0\xcc\x08\x8f\x89\x9e\x45\xbf\x59\x46\x4a\x47\xa9\xe7\xb0\x04\x96\xc5\x16\x4f\xcf\x62\x09\x2c\x8b\x4f\x4e\xcf\xe3\x29\x7c\xb2\x2a\x12\x58\x18\x2f\x5b\x96\x15\x81\x3a\x0d\x63\x8e\x53\x05\xb8\x8e\xad\xc6\x8d\x0c\xe9\xd5\x43\xc0\x2f\xed\x73\xf3\x70\x15\x0f\x27\x16\xdf\x26\xe2\x59\xb2\x74\x31\x32\xdd\x0a\xd0\x8c\x60\xe5\xe2\x24\x23\x28\x25\x1c\x69\xfd\xae\x85\x24\xe0\xcb\x19\x8a\x83\xad\x38\x9c\x0a\x2b\x4b\xab\xfd\xc6\x35\x07\x99\xd8\xe9\xe9\x2e\xab\x74\xcc\xcd\xff\xe0\x0c\xa5\x68\x9a\xf5\xaf\xb5\xae\xfa\xc5\xbe\x17\x5a\x14\x12\xd9\xd7\x4e\x12\x57\x3e\xe8\x99\xcf\x28\x7f\x7a\x94\x37\xa0\x99\x6d\x94\xf2\x2a\xcd\x3e\xb4\xb9\x17\xc0\xe3\x99\xfb\xd9\xd1\x81\x69\x9a\xd3\xba\xff\x3f\x7b\xff\xc2\xde\x36\x6e\x3c\x8a\xc3\x5f\x45\xe1\xdb\x93\x4a\x27\x20\x4a\x00\xbc\x3a\x55\xf3\x3a\xde\x64\x9d\xd6\x89\xb3\xb1\xd7\xdb\x4d\x8e\x9f\x3c\xb4\x04\xdb\x6c\x68\x52\x15\x69\x67\xbd\x89\xbf\xfb\xff\xc1\x00\x20\xc1\x8b\x64\xc9\x56\x2e\xfb\xfb\x6d\xb7\x91\x25\x12\x97\xc1\x60\x30\x18\x0c\xe6\x02\x5c\x60\x83\xee\x92\xaf\xf2\x35\xf5\xf3\x72\x8a\xc4\x41\xcf\xae\x70\xb7\x7a\x54\x5d\xa5\xa3\xff\xe5\xf9\xf6\xd0\xfa\xff\xb7\x66\x1b\x4f\x61\x0a\xfa\x6c\x3b\x1b\xb3\x64\xda\x75\x4e\xc3\x67\xdd\x86\x84\x74\xd8\x7a\xd4\x34\xaa\x68\x50\x0c\x5c\x8c\x34\x9e\xf4\x99\x58\xbc\xca\x17\x18\xdd\x95\x55\xf8\x4f\x79\x32\x75\x56\x39\xbe\xd4\x87\x97\xd1\x0d\x2a\x04\xeb\x28\xb6\xde\xbd\x4a\x8e\x91\xd8\x89\xb6\x3e\x55\xc3\xdd\x7a\x37\x74\xd0\x4f\x1c\xff\xfb\x2f\xa3\x61\x77\x71\xa8\x97\xfc\xcd\x68\x08\x27\xaa\xc1\xdf\xc7\xff\x18\x48\xf3\x24\xfd\x2e\x7f\x3a\x1a\x7e\x52\x8c\xcf\xfa\xf4\xa9\xb1\x06\x66\xbf\x59\x28\xbf\xe2\xf3\xd3\x34\xff\xb8\x65\xa9\xb3\xd9\xcd\x08\xc9\x9a\xff\x29\x47\x43\xcb\xc1\xb4\x18\xf0\xb8\xe0\x76\x92\xd9\xf9\x65\x69\xa1\x9e\x66\xff\xaf\x75\x33\x1a\x1d\x8b\xff\x2a\x5f\xd4\xe7\xdf\xb5\xa8\x53\x49\x32\x3f\xfc\x31\xc0\xfc\x8f\xe9\x5d\x6a\x3d\xdf\xdf\xf9\xf9\xe0\xfd\xfe\xab\xf7\x47\x2f\x9e\xfd\xf2\xfe\xc5\xab\x17\x87\xd6\x08\xfd\x68\xf8\x9a\xfe\x07\x7c\x4d\x61\xf3\x81\x70\x4f\xbf\x6f\x34\x6a\x95\x11\x7c\xca\x8c\x5b\xb5\x9f\xe9\x60\x18\x9d\xa8\x55\x2a\x46\x95\x3c\xa2\xc9\x7c\xb1\x0f\x1c\x1d\xd8\xbe\x78\x96\x81\xd2\x68\xdc\xd7\x54\x2b\x52\x55\xd2\xb3\x63\x28\xff\xe9\x7c\x71\xa6\x37\xa3\x5f\xed\xcf\x59\x85\x08\x91\x02\xe0\xea\x51\x42\xda\x71\x81\x0a\x5e\xca\x8d\x7f\x41\xc5\xfc\xb2\x94\x66\x21\x90\x2a\xb6\x91\x04\x3c\x53\x4a\xb5\x5e\xf3\xc3\x16\x1e\x1e\x3e\xb4\x4e\xf2\x3c\xe5\x71\x66\x58\x22\x6a\xf7\x02\x03\x87\x7c\x9d\x08\x25\x75\x47\xed\x88\x03\x3d\x85\x97\x45\xc8\x7a\xd0\x02\x43\x45\x37\xd0\xd3\xa6\xc3\xd5\xf7\x46\x23\x50\x21\xb8\x3a\xa8\xd3\x83\x5b\x14\x22\x01\xdd\xa3\xcd\x06\x21\x92\xee\x8c\xde\x2d\x68\xcc\xfa\x34\x61\x65\x62\xbf\xbb\x2d\xe6\xcc\xa6\xa3\x23\xec\x9d\x24\xfa\xc7\x7f\x2a\xff\x5f\x19\xf1\xcd\x54\x0f\xdc\x29\x38\x42\x4d\xb1\x77\x08\x91\x00\x4b\xb8\x6f\xf3\xaf\x97\x38\x24\x0e\xa8\x43\xef\x6b\x82\x33\x82\x23\x34\x20\xa8\x57\x59\xbd\x33\x3d\xfd\xbe\x58\xbe\xe2\xd9\x02\x93\x3f\xe6\xc7\x68\xd1\x0e\xf0\xf3\xf7\x05\xf5\x22\x30\xff\xfb\xc7\x00\xf3\x97\xbb\x3b\xc4\x28\x7f\xb8\x32\x2e\x79\x1d\x62\xb1\x80\x9f\xcd\x6c\x30\x46\x41\xed\x4b\xc3\x15\x97\xee\xf5\xa5\xe1\x7a\x3f\x58\x16\xb7\x40\x15\x5a\x14\xb8\x40\x77\x50\x1b\xa5\x03\x64\xab\xa4\x8a\x80\x82\x8b\x12\x45\x4c\xd2\xbc\x58\x78\x36\x5a\x8c\x11\x23\xc8\x41\x17\x1b\xd2\x99\x57\xb3\x64\xf9\xab\xc9\xdc\xe5\x33\x95\x64\xdd\x4c\xfb\xdc\x3d\x32\x0b\x7e\x22\x4f\x83\xf1\xe4\x9c\xeb\xb4\x27\xaa\x81\xb2\x67\xe6\x9c\x15\xe0\xbc\x2d\xd8\x43\xdd\x6b\x52\xbc\xc9\x3f\xee\xcf\xb8\x98\x8a\xcf\x9f\x1f\xa8\x3c\x9d\x80\x35\x1d\xf7\x30\x87\xb7\xa8\x1c\x35\xa7\x66\xe9\xa4\xc0\x60\x0c\x91\x41\x75\xb2\x58\x31\xf1\x60\xf8\xa0\x3d\x0a\xb5\x17\x43\x53\x0f\xc6\xa6\x80\x90\x14\xb2\xb1\x5e\x00\x1e\x38\x75\xfc\xca\xaa\xad\xaf\xaf\x8d\xf8\xf5\x3e\xe9\x82\x78\x19\x27\x69\x2b\x55\x50\x7d\x78\xdd\xc9\x2f\xb3\x7e\x1d\xc4\x9c\x9f\x25\x45\xb9\x38\x78\x6d\xab\x8d\x47\x8f\x6a\x55\x40\xb6\x66\x5d\xdb\x36\xd2\x7e\x17\xcf\xaa\x97\x6f\xf2\x8f\x8b\x26\xa6\x3b\x36\xac\x96\xbd\x92\xb3\x5a\x5d\xfc\xe3\x5e\xea\x82\xbd\xe7\x3f\x0e\x7f\xc9\xef\x9e\x05\x15\xfd\x25\x1f\x37\x7c\x85\xf9\x3b\x8e\x7f\x79\xf1\xc3\xe1\xee\xd8\x39\x1e\x5b\xf0\xcd\x42\xe2\xe1\xee\x8b\x1f\x7e\x78\xf6\x6a\x4c\x8e\xc7\x96\xfc\x6a\xdd\x0c\xff\x92\x7f\xfe\x3c\xfc\x4b\x3e\xfe\x74\x33\x12\x2d\x8d\x1e\xab\xb8\xb1\x1f\xf8\x75\x31\xfc\x4b\x3e\xc2\x17\xf1\xac\x2f\x7f\xca\x5f\xf2\x77\xfc\xf8\x66\x84\x4f\x93\xb4\xe4\xf3\xde\x74\x44\xe3\xf1\xb8\xd2\xe2\x71\xd0\xca\x49\xfd\xf1\x3f\xef\x41\x71\xdc\x9c\xbf\x42\x12\x58\x87\xee\xaa\x57\x9d\xe9\xaa\xde\x60\x4d\x45\xc3\x3e\xad\xf9\x0a\xa1\xba\xd6\xeb\xad\xa6\xda\xfb\x47\xe2\xfa\xf5\x2e\x0e\xc4\x2f\x4e\x25\xe5\x73\xe5\x42\xac\x33\xe8\x1a\x67\xde\x9d\xfd\xbd\x9f\x5f\xbe\x7a\x7f\x70\xb8\x7d\xf8\x4c\x69\xfa\x7f\xba\xeb\xb5\xd0\x11\x47\x1f\x38\xba\xe0\xe8\x3d\x47\x1f\x39\xda\xe5\xe8\x25\x47\x7b\x1c\xfd\xf6\x2d\xee\x8a\x8a\x18\xbd\xce\xd5\x8d\xd1\xcf\x39\x7a\x9a\xa2\xff\xe6\xe8\x79\x8e\x7e\xc8\xd1\x6b\x88\x35\x75\x91\xa3\xa7\x79\x2d\xba\xfc\xeb\x2b\x49\x58\xb7\x4c\x1c\x58\x16\x95\xf1\xe4\x43\x75\x43\x5d\x83\xf8\xef\x7b\x2c\xa1\xcb\x2c\xf9\xef\x25\x7f\x31\xd5\xeb\xe6\xfd\x19\xcf\xf8\x3c\x2e\xf9\xf4\xc5\x14\x24\x81\x3a\x43\x1f\xb8\xba\x75\x97\xc7\xbd\xd2\xed\x75\xdd\xfd\x1e\x3e\xb4\xc0\xd5\xef\x89\x52\x37\x9b\x00\x3d\xb2\xac\x55\x02\x96\x76\x07\x62\xa0\x0f\x2e\xeb\x6d\xeb\x51\x63\xf4\x2a\x3c\xf8\x54\xab\x2b\x04\x68\x7d\xbd\xdf\x7b\xb9\x9e\xad\x1b\xf6\xc9\x00\x7a\xed\x4c\x6a\xe0\x62\x27\x33\xa9\x25\x7d\x19\xd4\xba\x3a\xd7\xeb\xf8\x8b\xe9\x5c\x17\xd8\x2a\xf2\x62\x2d\x55\x59\x87\x7e\x65\xe4\x55\x4d\xbd\x15\x35\x2b\x45\x59\x33\x6c\xda\xdc\xdc\x1a\x8c\x88\xed\xfa\x81\x91\x64\xf2\x00\x5f\xcd\xf8\xf0\x01\xe9\x6c\x34\x55\xa5\x3a\xac\x84\x0e\xfb\x0e\xb5\x65\x4c\xe4\x39\xcf\xc6\x5a\xe2\x3d\xbd\x4c\xd3\x6b\x41\xa9\x49\x9c\x26\xbf\xf7\xd4\x80\x07\xca\x7c\x44\x06\x1b\xee\xdb\x85\xce\x78\x29\xe1\x9b\x82\x9e\xf1\x96\x54\x06\xb2\xa4\x92\x45\xdb\xa0\xfd\xc3\x79\xf8\xf0\x41\x63\xe4\xa6\x4b\x6c\xb3\x97\x05\x51\xe5\x15\xe4\xdc\x9c\x04\xb5\xe3\x75\x06\xfc\xf0\xe1\x50\x09\xe8\xb2\x5c\x07\x9e\x47\x8f\xb6\x96\xbd\xb6\xed\x5a\x86\x86\x85\x90\xf2\xe9\xd3\xeb\x17\xcb\xd9\x0e\xac\x9b\xa7\x69\x3e\xf9\x70\x98\x94\x29\xc7\x49\x3d\xc6\x73\x1e\x8b\x45\xb3\xc7\xaf\x78\xba\xb4\x8d\x78\x9e\xc4\x50\xea\x49\xf3\xe7\x23\xcb\x32\x01\x7e\x62\xb9\xd6\x96\xc5\xd6\x60\x4d\x5d\x92\x70\xcc\x30\xe6\x30\xf0\xdb\x45\x0d\xb3\x96\x3c\x34\xc8\x5d\xfd\xf6\x9a\x95\xae\xaf\x5a\x09\x8d\x9f\x7d\xab\x02\xf3\x8b\xa4\x6c\xd6\x32\xb4\xab\x93\x78\xce\xcb\x1f\xa4\x45\xd0\xc2\x4b\xc4\x41\xa3\xf6\x13\x6b\x9a\x7f\xcc\xac\x2d\x0b\x6e\x92\x6b\xe4\x49\x97\xe0\x5b\x1b\x10\xc3\x78\xa2\x03\x54\x35\x43\xab\x96\xf1\xc9\x0b\xa9\x2c\x5c\xb1\x15\xa7\xd5\x80\xe0\x18\xf1\xe4\xc3\x9e\xa0\x35\x15\x0f\x67\xa5\x96\xda\xab\x4a\x2d\x08\xc5\x29\xea\x19\x9e\x27\x71\x2d\x7f\xad\x06\x63\x0b\x75\x60\xcd\xb7\xa5\x1c\xe3\x9b\xc0\x9f\xf1\x12\xa0\xd7\xab\xe7\x45\x1f\x3d\xf4\x4f\x88\x21\x63\xe8\xa5\x67\xe1\x49\x9e\x4d\x62\x35\xf3\x9a\xbd\x8e\x6a\xb7\xf7\x7b\xec\x85\x1c\x11\xaa\x55\xa0\x67\xf1\xe8\xae\x81\x11\x25\xc4\x27\x62\xa9\xdf\xd1\x73\xe9\xdf\xb7\xba\xb9\xb7\xb8\x49\xaf\xf7\x12\xb9\xdd\x14\xab\xe9\xf6\xae\x19\x91\x35\x1a\x4a\x63\xcd\x54\x72\xa4\x12\x9b\x1c\xaa\xf2\x7d\x35\xc7\x29\x0d\x87\x8d\x27\x36\xaf\x08\xaa\xac\x17\x68\x5f\x11\x19\x21\xba\x34\x88\xab\x55\x4c\x71\x5f\x51\xa6\xb5\xe7\x8c\x86\x56\x9e\xd5\x51\xce\x3a\xcb\xc4\x74\xa4\xd7\x30\x48\x4d\xf1\xc1\x89\x71\xe0\xa8\x40\x3d\x46\x35\x10\xcd\x72\x12\x48\xcb\x80\xf8\x18\xb5\xb6\x26\x5d\xe1\x55\x5e\x26\xa7\xd7\x5a\xe3\xd6\xd9\xc0\x8e\x51\xc5\xb6\x55\x0d\x01\xf3\x51\xc2\x3f\x2a\xfe\x6f\x55\xef\x55\xd9\x03\x5e\x16\xc9\xef\xbc\x55\x5a\x3d\x55\xe5\xf5\x2f\x59\xe3\x75\x5e\x24\x99\xd8\x28\x9b\x55\xf4\x63\x55\xa7\xfa\x79\x7c\x83\xf2\xcb\xb2\x89\x26\x09\xf3\x56\x13\x57\x6a\x50\xeb\xc8\x69\xaf\xb5\xd9\x76\xd4\x09\x37\x40\x50\x63\x9a\x95\xc9\x2e\x43\x20\x21\xea\x18\x94\xd6\x07\x7e\x7d\x39\xc3\x3c\x03\x95\x8a\xfa\x55\xcc\xe2\x89\x18\xb9\x9a\x79\x19\x11\xca\x34\x46\x8e\x33\x50\xd7\x55\xe6\xd5\x0d\x72\x12\x5b\xc3\x62\x2b\x6c\x1d\xb8\x11\x35\x8d\xca\x65\x0b\x57\x09\xff\x68\x7f\xe0\xd7\x8d\x87\xaa\x59\x7d\x0a\x32\xde\x68\xae\x05\xa3\xea\x98\x18\x88\x9e\xd5\xc2\x13\xc7\x6f\x15\x65\x52\xd9\x5f\xf5\xda\x6f\xab\x61\xb5\x7b\x86\x01\xf5\x87\x9e\x6c\xb6\xbf\x9a\x61\xf5\x7e\xa2\x8d\xa4\x1d\x65\x24\x0d\x17\x43\x70\x4d\xa3\x66\xa5\xef\x8e\xc6\xdc\xf1\x65\xa0\xae\xc6\xd4\xad\x53\x45\xcd\xef\x6a\x55\x96\xc4\x0e\xab\xa3\xbf\x2d\x8f\x1b\x56\x8b\xce\x37\xb5\x29\xf9\xb3\x04\x11\xb0\x4f\xaf\xcc\xbc\x8d\xf0\x47\x2f\x12\x44\x61\x1e\x66\x71\x66\x44\xb1\x64\xed\x28\x96\x0d\xcb\x70\x51\xc2\x53\x25\xdc\x51\x95\xac\x93\x74\x42\x13\xa8\xb2\x01\x5a\x6c\x6e\x63\x46\xb7\x3c\x14\xc0\xe8\xf8\x0b\x7e\x8f\x99\x38\x18\x4d\xcb\x73\x57\xb5\x63\xa2\xbe\x88\x27\x43\xe3\x62\xb3\xc4\x5a\x6e\xd1\xdb\x81\xc9\xd2\x4d\x99\x41\xbf\x57\x76\xe4\x85\xe2\xd4\xad\x5d\xbf\xdf\x08\x5d\x1a\x72\x1b\xbc\x7f\x61\x99\x36\xef\x57\x05\xbd\xaa\x60\x67\x81\x99\x3b\xcf\x2d\x5d\xf3\x7e\x13\xf2\x37\x39\x58\x8f\x1b\xe6\x39\xfa\x98\x58\xae\x7c\x4c\xec\x2a\x09\x75\xf2\x08\x7d\xee\x2a\xe2\xab\xde\x43\xde\x7b\x51\xf2\x65\x3e\xad\x4b\x8a\x07\x49\x76\xd6\x77\x2e\xec\xbb\x50\x92\xa5\x97\x8b\x74\x0a\x18\x7d\x56\xd2\x5d\x2e\x50\x91\xd4\xc5\x87\x2d\x10\x79\x0f\x84\x52\x46\xe7\x23\x54\xa5\xcd\x8f\xaf\xd4\x43\x6d\x0d\xf1\x35\xe2\xbf\xd5\xbc\x5b\x70\xc0\x6a\xab\x13\xc0\x6c\x55\x1b\xe4\x41\x7c\x25\x76\xb6\x9e\x2d\xec\x79\x2b\xa6\x9a\xd3\xb3\x85\xe9\xc6\x57\x60\xaf\x6f\x9a\x7e\x2b\x62\xa1\x13\x93\xcf\x8a\x37\xd4\x60\x0a\x4d\xf3\x30\x4d\x7f\x59\x0f\xfd\xad\xa4\xfb\x3c\xfd\xa6\xf6\xf0\xcf\xf3\xb6\x72\xf7\x79\xf2\x2b\x92\xdf\xca\x99\x03\x6a\xdd\xf9\x1f\x6a\x68\x45\x8c\x7e\x36\xb4\xb3\xc9\x1a\xc0\x7f\x4d\x60\x7f\xca\x51\x56\xa0\x79\x51\x01\x1a\x17\xeb\x59\xec\x83\xea\x55\x31\x96\x34\xc9\x3e\xbc\x8e\xe7\xbd\x29\x49\xe4\xa9\x86\xe3\xd3\x7c\xfe\x2c\x9e\x9c\xf7\x5e\xbd\xbc\xcb\x8e\xc7\xe5\x8d\xa1\x44\x49\xb2\x0f\x47\x7c\x5e\x26\x93\xb8\x9b\xe6\xad\x32\x30\x7f\x30\xac\x9c\x2f\x55\xd0\xb3\x7f\x90\x87\x0f\x65\xaa\x85\x07\xe3\x71\xf5\xf2\x1d\x39\x1e\x7d\xfe\x6c\xfe\x7c\xdc\x03\x0e\x80\x09\x9a\xa7\x61\x89\x2f\x67\x63\xfe\x2e\xb3\xc9\xf1\x08\x65\x7f\xe7\x55\xda\x19\x78\x37\xcd\x3f\x66\xe2\xed\x23\x72\x3c\xba\x19\xa1\xf2\xe1\x43\x6e\x74\x3f\xe4\xef\x9c\x63\x59\xbf\xae\x77\x8c\x1a\xbf\x74\x13\xce\xb1\xc1\xf0\x2a\x8c\xa7\x85\x46\x9a\x42\xcf\x7f\x39\xbe\x56\x09\xdb\x6a\x70\xe7\xa3\x4f\xe5\x70\x2e\xef\x3d\x92\xb1\x19\x87\x77\x5e\x51\x91\x31\x9f\x09\xbe\xcc\xea\x22\x23\x94\x3d\x7c\x28\xda\xb8\xb9\x19\xdd\x80\xaf\xd2\x7a\x4a\x4e\xed\xe6\xd4\xda\xc8\x92\x4a\x49\x5f\x19\xfa\x65\x0d\x25\xe8\xbc\x27\xef\x81\xce\x60\xd9\x88\x80\x1c\x77\x0c\x0b\xb5\x9a\xff\x32\x4b\x93\xa2\xe4\xd9\xf3\xcb\x6c\x52\x8c\xdf\x1d\x1b\x95\x9f\xc6\x93\x0f\xfb\x99\xda\xec\x0d\x33\x2e\x38\x71\x49\xa9\x43\x1b\x12\x5c\xe4\x57\xfc\x30\x87\xec\x4a\x2f\x4a\x7e\xf1\xcb\x39\xcf\xe0\xb2\xbe\xa1\xb3\x55\x7b\xd4\x79\x9c\x4d\x53\xfe\x26\xcf\x4b\x1d\x73\xb6\xbb\xb3\x2e\x68\x6f\x85\x00\x33\xcd\x68\xca\xf9\x8c\x67\x4b\xf3\x40\x03\xb5\xb5\xea\xcc\x93\xb3\x24\x8b\xd3\x67\x57\xa0\xe2\x2c\x78\x79\x98\x5c\xf0\xfc\xb2\x1c\x1a\xdd\xf2\x66\xc8\x61\x09\x2f\xec\xc4\xdd\x17\x55\xbe\xbc\x27\x3f\xa5\xf8\xcd\x8b\x1f\x77\x0f\xb7\x7e\x4a\xf1\x0f\xfb\xbf\xbc\x1a\xdd\x8c\x8c\x55\xda\x42\xcc\x17\x18\x2c\x24\xcf\x6c\xc0\x07\xb3\x69\xc0\xdd\x98\xf3\x2a\xe7\x91\x10\x2d\xfb\x0a\x34\x98\x4c\xa9\xa5\xc2\xa5\x69\x41\x64\xa1\xae\xf4\x53\x7b\x16\x3d\x6e\x94\x6c\x6a\x9c\x9f\xf4\x10\xad\x11\x45\xa8\x32\x10\x94\xaf\x87\x1c\x0e\xb4\x82\x3b\xe0\x78\x3e\xcf\x3f\x4a\xcd\x63\x7f\x96\xa0\x26\x2e\xe5\xaf\x5f\x92\xf2\x1c\xc8\x60\x28\x36\x93\xd1\xd6\xf0\x7e\xdd\x5f\xce\xee\xde\x77\xdf\x72\x5d\xa3\x6b\x50\xbd\xde\xb3\xf3\x06\xe1\xc8\x7e\x0e\xf3\x6d\xd1\xfa\xbf\xf8\x75\x31\xe4\xa6\x7a\xb8\x76\x0b\x5f\x7a\x6b\xa1\x8b\xad\x40\x0f\x55\x59\x4d\x11\x77\xc1\x45\x19\x9f\xdc\x17\x0b\xf7\x25\x44\x5e\x4c\x9a\x20\x94\x3d\x1c\xe3\xa7\x14\xef\x3d\x7b\x7e\x28\x56\x5d\x51\xe6\xb3\xd7\xf3\x7c\x16\x9f\x55\x11\xb7\x35\x21\xb6\x56\xb2\xb4\x30\xd8\xd1\x78\x1a\xf2\x7b\x10\x4d\x07\xca\x2f\x4b\xab\x2d\xd5\x41\x26\xb0\xa2\x95\x3b\x78\x96\xcc\xf8\x70\xe8\xa0\x9f\x39\xfe\xef\x68\x48\x46\xa3\x05\x41\xf2\x2b\x59\x6f\x99\x68\x84\x45\x57\x60\xe4\x2a\xf7\xfa\xf9\x38\x6b\x26\xec\xfd\xfc\xb9\xdf\xe4\xf9\xf1\xfc\xe1\xc3\xda\x42\xbb\x95\x6e\x92\xd7\xf9\xe8\xe6\xa3\xcf\x9f\xe7\xe3\xf1\xb8\x8a\x96\x3e\xfa\xfc\x79\x58\x2e\xda\x51\x7b\x58\x38\xc4\xad\x1f\xb5\x33\x17\x2e\xb4\x0d\xd4\xac\xfa\xd6\x2c\xaa\xb2\x60\xc7\x1c\x5d\xa2\x7e\x43\x8d\x2b\xe4\xb6\x73\x96\xdf\x25\xe9\xab\x6a\x11\x14\x62\xc3\xa6\x75\xe2\x76\x36\xfd\xb1\x96\x41\x96\xef\x93\x6a\xde\xd3\x42\x76\xa4\x89\xaa\x47\x4d\xd5\x91\x03\x60\x2e\x9c\x9b\x96\x91\xa6\xec\xfc\xf0\x3c\xb9\x65\x83\xae\x3b\x1e\x3a\xe8\x2f\x1c\xe7\xa7\x23\x95\xc5\x60\xd5\xae\x89\xd1\x75\x43\xea\x5a\x34\x5d\x7a\x70\xa0\xb8\xf8\x27\xc7\xe5\x90\xf4\x30\xad\x79\xed\x1e\xd7\x45\xe6\x70\x54\x2d\xb7\x1f\x38\xfe\x79\xd4\x7f\xbc\x70\x8e\x6b\x26\x04\xb2\xf7\xfd\x5b\x53\xd7\xf9\xb3\xfb\x35\x65\x1c\x0a\x1a\x4b\x48\xdf\xb1\xf6\x21\x8f\x8f\x3e\xc5\x05\x36\x8f\x48\xc3\xa6\xad\xc1\xc3\x87\xea\xbd\x3c\x92\x0d\xd5\xfe\xd3\xa2\x86\xe1\x08\x55\x5c\xbb\x31\x1b\xd2\xf6\x95\x8f\xd6\xc9\x04\xd9\xe2\x9d\xcb\x18\x1a\xb8\xea\x75\xb7\x83\x29\x2f\xe3\xc9\xf9\x1e\x34\xc2\xe7\xf7\x71\x74\x55\x36\x8a\xf2\xc2\x4e\x7c\xab\x82\x1b\x88\x1f\xfa\x4e\x4f\x7c\xff\xb5\x2a\xf2\xaf\xb4\x2e\xdc\xca\x03\xb9\x9e\x75\xe3\x63\x9e\x0f\xf3\x62\x84\x16\xe9\x32\x8a\xa2\x6b\xfc\x08\x22\xf6\xfb\x9d\x67\xaf\x0e\x9f\xbd\x01\x1b\x48\xf3\x81\x34\x85\x94\x4f\x0e\xf7\x5f\x83\x35\x64\xf5\xcb\x7c\xf9\x74\xff\xf0\x70\xff\xe5\x98\x56\xef\xe5\x03\x59\xe4\x70\xff\xb5\xee\x80\x1d\x8f\xad\xfa\x67\xfd\x1a\x2a\x8d\x5d\xf5\x16\x7e\xd5\x2f\x05\x99\x8c\x3d\xf5\x4e\xfc\x90\xaf\x64\x17\xba\x65\xff\x78\x6c\x35\x9e\x34\x0a\xc9\xf6\x83\xba\x8c\xd1\x85\x7a\x02\xbd\x84\x75\x89\xba\x23\xf1\x4d\x77\x13\x1d\x8f\x2d\xe3\xb7\x51\x00\xf0\xe3\xe8\xd7\x15\x7e\xe0\x97\x42\x0f\x21\xfa\xb5\x42\xcf\xcd\xb0\x28\x3e\x7f\x1e\x16\x85\x34\x29\x2d\x8a\x11\x9a\x14\x63\x2b\x3e\x29\xf2\xf4\x52\xec\x04\x97\x8b\xf4\x22\x3d\xd6\x9e\x4d\x5f\x67\xe9\xa8\x2f\x73\xc9\xc2\x8b\xfa\xbc\x0a\x19\x53\xf7\xb3\x03\x28\xa1\x89\x5e\xb9\x28\x5d\x24\xa5\x7c\x0e\x12\x0a\x3e\x49\xb2\xa9\x4e\x27\x83\x41\xf1\x87\x67\x79\x91\x08\x20\xc6\x93\xa2\x7a\x56\xe6\xb3\xb1\x53\xfd\x92\x1e\xf3\x63\x2b\xbe\x2c\x73\xab\x7a\x9a\xf2\xd3\xd2\x28\x24\x19\xab\x2c\xd3\x73\xa6\x8d\xb3\xc9\x79\xde\xdd\x6a\xcd\x6b\xea\x71\x47\x01\xc3\x7a\x15\x30\xec\xf8\x89\xf9\x63\xeb\xd3\x0d\x4a\xc6\x73\x15\x13\xe1\xdf\x28\x1e\xcb\x3a\xe3\xf1\x38\x79\xe2\x6c\x25\x28\xad\x5e\xfe\x8a\xf2\xfa\x65\xfa\xc4\xd9\x4a\x51\x31\x9e\xe3\x4b\xc1\xc9\x04\x78\x92\xc5\xa1\xc9\xb8\xea\xb5\x78\xf8\x50\x89\xe0\xf1\x74\x6a\x20\xb2\x66\x2d\x7c\x84\x26\x42\x06\x1a\x9b\x79\xe1\xa5\xe8\xda\xc0\x2e\xd8\xe3\x27\x13\x0b\x16\xee\xe5\xe2\x78\x06\x68\x3a\x36\xa7\x7f\x61\xb1\xf3\xf1\x25\x4c\x81\x3d\x85\x3f\x8f\x62\x34\x1b\x5f\x8a\x89\xb3\xa7\xe2\xf3\x51\xfe\xb8\xf8\x98\x94\x93\x73\x41\x59\x93\xb8\xe0\x83\xa2\xa8\xe8\x7a\x4b\x3f\xd0\x0b\x70\xeb\x64\xce\xe3\x0f\x8f\xcd\xc7\x72\x3d\x6c\x9d\x3f\x1a\x5f\xca\x10\x07\x7f\xa3\x8f\xbb\xa5\xe4\x81\x5e\x3f\xa9\x58\x89\x51\xad\x55\xc9\x58\x2d\x55\x35\x63\x81\x6e\xcd\x44\x45\x79\x4b\xd9\xaa\xd9\x60\x06\x66\x39\xb4\x04\x46\x93\x3b\xb4\xc0\x54\x40\xf4\x37\xd4\x07\x75\xb7\xe7\x4e\x77\x26\xaf\x6d\x16\x34\xda\xbe\x51\x13\x93\xdd\x6f\x62\xec\xf1\xf4\x2e\x13\x53\x55\x5b\x77\x62\x44\xc5\x55\x26\xa6\x2e\x87\x96\xc0\xb8\xc2\xc4\xf4\x36\xb4\x6c\x62\xea\x0a\xb7\x4c\x8c\x59\xd0\x68\x1b\x94\x97\xa7\xe3\x4e\xd0\x0d\x73\x3d\x8e\xd0\x55\x6d\xd8\x7f\x8a\x2f\xe2\xf9\x59\x92\xed\xe9\xb8\x21\x67\xdd\x77\x6f\xaa\xc8\x21\xd7\xdd\x97\x87\x2a\x4a\xc9\x45\xf7\xd5\xd3\x2a\x4c\xc9\x5a\x0b\x79\x15\x1a\x18\x66\xe3\xf1\xb8\x35\x07\x9f\x3f\xab\x87\xe6\x1c\x88\xc3\xdd\xcc\x1e\x5f\x08\x1c\x9d\x8d\x50\xab\x9e\xe8\xaf\xaa\x66\x90\x8f\xaa\x75\x2d\x48\xfe\xaa\xae\xa5\x41\x6c\x56\x39\xdc\x7f\x0d\xe5\x1f\xf5\x96\xef\x03\xad\x51\x43\xc0\xb5\x26\x21\xaf\x4e\x81\xeb\x8d\xf7\xa2\x05\xff\x5d\xb1\xfb\xb5\xf0\x64\xf0\x92\x0a\x7a\x28\x78\x1b\xdf\xbd\x5e\x58\xb4\xc5\x26\xaf\x51\x35\xbc\x5b\xf8\xa4\x2e\xf9\x68\x7c\x75\xd3\xb8\x3f\x56\x9b\xa0\x92\x4a\xe6\x71\x56\x88\x83\xf2\xd8\x82\xaf\x69\x5c\xf2\x7f\x0f\x2b\x9b\xbd\x97\x71\x79\x8e\xe7\x62\xaf\x1c\x9e\x8f\x90\x35\xfb\x6d\x34\xa8\x8a\xfd\x3a\xb4\x46\x3d\xe5\x66\xb2\x9c\xf6\x91\x7e\x2f\x85\xac\x45\x6e\x8a\x73\x9e\xf2\x78\xb1\xa3\xe2\x42\x60\x2d\x7d\x77\x70\x91\x5f\xf1\x5e\x21\xc2\xf4\x9a\x7b\xad\x24\x06\xde\xb5\x64\xac\x34\x83\x7d\x71\x81\xb4\xa4\xa1\x4e\x38\x16\xe8\x75\x92\x2b\x6e\x8d\xc7\xe3\xf2\xf3\xe7\x72\x3c\x1e\x4f\x8a\xcf\x9f\xad\xd3\xe4\x37\x3e\x85\x87\x55\xa7\x2d\x29\x71\xe1\xb9\x4c\xa1\x07\x8e\x74\x8d\xe3\x65\xdf\xa0\xfa\xa0\x37\x9b\x81\x73\xfa\x2f\x1c\xff\xf6\xd3\xe3\xd3\x7c\x3e\x54\x61\x9e\x50\x36\xe6\x8f\xb3\x87\x0f\xb3\x07\xe3\x71\xed\xe0\x3f\x34\x44\xe0\x62\x98\x09\xba\xce\x84\x44\xd6\xe8\x71\xa8\x82\x5e\x59\x4b\xa4\xe2\xd1\x22\x61\x5a\x6a\xe8\xb2\xd1\x08\x65\x12\x5f\xd2\xb6\xd5\x9c\x0e\xf1\xf6\xf1\x28\x1b\x67\x86\xa0\x67\xd0\xc6\xa2\xc9\x5d\xa4\x28\x41\xe5\xf8\xe5\x70\x01\x34\xa3\xc7\xe5\xfc\xfa\x93\x40\x4b\x89\x8b\xe1\xe8\xf1\x83\x21\x1f\x97\x38\x1b\x8e\x46\x10\xc3\xe6\xf1\xe8\x13\x97\x01\xff\x15\x51\xad\x8f\x87\x9b\x9b\x49\xac\x84\x90\x12\xf3\x61\x36\xba\x39\x4d\xb2\x38\x4d\xaf\x3f\x95\xf8\x74\x38\xba\x59\x84\x26\x29\x99\x57\xd6\xfe\xb2\x44\x65\xaf\xa1\x08\x64\x92\x5f\xcc\x52\x5e\x72\x21\xcd\x72\xf1\x65\x60\xbe\x1e\xb5\x82\x94\xf5\x52\xca\x42\x3a\xd7\xe4\xad\xc6\x08\xba\x46\x1d\x64\xe6\xdf\x9f\x3f\xcb\x03\x48\xe7\x69\x5f\xe9\x5f\x7b\x4b\xff\x5a\xa9\x0a\xd0\x74\x9d\x7b\x4c\x7d\x88\x01\xf5\x57\xaf\xd7\xc6\x6e\x5e\x94\xfa\x0a\x53\x06\x75\x92\xa7\x0e\xe3\x72\x71\xc2\xb3\x32\xbd\xde\x9f\xf1\xcc\x70\x9c\x98\xe5\x33\x01\xdc\xbe\x4c\x1b\x31\xfe\x74\x63\x68\x60\xf6\xb3\xfd\xcb\xb2\x48\xa6\x7c\x27\x4d\x26\x1f\x6a\x4b\x9e\x74\x0c\x27\x07\x1d\x9b\xa1\xe7\xa2\x54\xbe\xff\x35\x6e\x45\x97\xa8\xea\x81\x96\x43\x9e\x7c\x00\x4a\x41\x01\xe3\xac\x15\x6b\xc2\x84\xef\x85\x4a\x39\x01\xeb\xfa\xb2\xe8\x8f\x4e\xa1\xd7\x9f\x91\x08\x63\xbc\xf6\x65\x1e\x1f\x7d\xe2\x4f\x86\x73\x05\xd8\x70\x84\xe6\x38\x2e\xcb\x78\x72\xfe\xec\x60\xa7\x5a\x04\xe2\x69\xc1\xc5\x69\xc9\xc0\xe9\x70\x34\xda\x1a\xce\xb1\x62\xe4\x50\x46\xaa\x8a\x1a\x35\x2b\x9d\x52\x17\x28\x4d\xe9\x55\xd7\xf2\x57\x4f\xef\x72\x9c\x3d\x00\xac\x7e\x38\x6e\x04\x07\xd3\xb4\xa2\x56\x5e\x72\x96\xe5\x73\xde\x8b\x3b\xf3\x06\x77\xd5\xbd\x4b\x62\xc1\xa4\xa5\xf6\x50\x5a\xb3\x5c\xe3\xb0\x2f\x22\xcc\xce\x39\x9f\x7c\xe8\xd9\xc0\xba\x97\xb8\xe6\xe0\x34\x72\x7b\x17\x47\xbb\x7f\x35\x03\x2d\x0a\x35\x29\xf6\x75\x9e\xb4\x48\xb4\xfb\x44\x2d\xaa\xde\x4b\x15\xc1\x64\x17\x68\xa6\xcd\x69\xef\x47\xda\x5a\x0a\xcf\x9a\x1e\x8d\xc9\xe8\x23\x27\x63\xd9\x34\x4d\x30\x4c\xaf\xfb\xd3\xd3\x83\xc9\x9c\x2f\x76\xbd\x5f\x40\xda\xf5\x7e\xde\xa6\xe6\x15\xa6\xb1\x89\x4e\x45\x9d\x3f\xa6\xf9\x49\x9c\x1a\x0d\x69\x7f\x43\xbd\xb1\x1b\xaf\xc6\xbd\x97\x63\x96\x2e\x69\x55\x97\x73\xc6\x45\x99\xb4\x60\x00\x77\xed\x87\x0f\x87\xd6\xb3\x62\x12\xcf\xa4\xb8\x23\x1e\x7d\xfe\x2c\x9e\x54\x3f\xe5\x45\xd5\xc2\x0b\xa7\x6a\xf4\x1d\xe4\x2f\x5c\x32\xdd\x41\x54\x01\x80\xba\xaf\x5a\x5b\x61\x4f\x89\x51\x6b\x02\xfa\xe8\x6a\x85\x99\xe8\xd9\x16\x34\x58\xe7\x79\x51\x36\x9a\xeb\x47\x7a\x2f\xe3\x46\x1d\xe3\xec\xd2\xb8\xc0\xd1\xdc\x48\xaf\x0c\xf9\x7b\xda\x8a\x8b\xd4\x7c\xba\x2a\x24\xcd\x5a\xab\xc2\xd1\x0a\xe0\xb4\x42\x67\x26\xad\xf5\xf4\x21\xe4\x67\xdd\xc1\xe7\xcf\xbc\xb5\x59\x3f\x51\x93\xab\x4b\x6c\x2d\x64\x1d\x6d\x4a\x5b\x71\x9a\xd7\x9e\xdb\x85\x2f\x5a\x94\xd8\x79\xdf\x3b\x85\xbd\x4d\x2f\x29\xd2\xea\x64\x49\xc9\x65\x13\xd5\x5e\x4f\xcb\xba\xe8\x2d\x33\x6a\x64\x3f\x6d\x6e\xc5\x2b\xac\xa5\xb6\x40\xe6\xa0\x45\xf6\x50\x1d\xd1\xed\x66\x03\x61\xb5\x8c\x10\xdb\x20\xc7\x21\x77\x79\xe8\x83\xf5\xa3\x64\x27\x85\x9d\x9f\x9e\xda\x85\xda\x2f\x4a\x6c\x6c\x1f\xa3\x2a\xa4\xd5\xf9\x77\x6a\x75\xaa\xe2\x4a\x3f\x85\xf4\x73\x1a\xd8\x59\x31\x7e\x67\x25\xd9\x69\x6e\x21\xeb\x63\x3c\xcf\xc0\x44\xbd\xce\x3e\xa0\x13\x06\x1c\xa3\xd3\xd5\xa5\xfb\xce\xdd\x4c\xd3\xd1\x5a\x87\x11\xe4\xa7\xf1\x65\x5a\xbe\x98\xe4\xd9\xc1\x79\x3c\xe3\x63\x00\xa3\x4a\x5a\x20\x8f\x40\x71\xca\xe7\x66\x91\xc6\xf3\xc3\x6b\x5d\xab\xf7\x0a\x45\x17\x59\x6e\x56\x54\x15\xeb\x9a\x15\xcd\x0a\x19\x16\x7e\xff\x74\xc8\x47\xff\x90\x16\xa8\xad\xde\x8d\x9b\xda\x26\xa8\x0b\x3a\xb5\x2c\x1d\xc8\xa7\x35\x34\x79\xdd\x9e\x4c\xf2\xec\x45\x76\x9a\x3f\x9f\xe7\x17\xa2\xfd\x76\x7f\x23\x0c\xde\x47\x5b\x7d\x2d\x74\xe1\xe7\x4f\xf8\x83\xfe\xde\x9a\x23\xa9\xf1\xcb\x47\xbd\x4d\x8f\x8d\xc8\x0a\xd5\x1b\xf0\x75\x5c\x9e\xd1\xf9\xd6\xd1\x94\xa2\x8d\x5a\x18\x6b\x95\x5f\x7c\xd0\xfd\x24\xd1\x60\x59\x68\x52\x14\x90\x2a\x41\x7c\x87\xd6\xb6\x2c\xeb\x46\xab\x80\xb9\x54\x01\x57\x84\xbd\x55\x4a\xfc\x8d\x1b\xc9\x37\xca\x79\xa2\x7c\xb9\x4a\xac\x9b\x1b\xcb\x71\xda\xd5\x92\x28\x25\xac\xe3\x2e\x3d\x43\xf8\x1b\xac\x0a\x1a\x8a\x3b\xbd\x88\xfa\x3b\xad\xc8\xbc\xd3\xa5\x5e\x7b\xb7\xf5\x28\xcb\x99\x1d\xea\xc5\x5a\xf7\xd8\xcc\x03\xd2\xed\xab\xca\x07\x72\x5b\x67\xaa\xa0\xea\x4d\x2d\xdd\xaa\x9f\xde\xf5\xdc\xd3\x9d\xe4\x33\xb7\xf5\x25\x4a\x55\x6a\xcd\xfb\x5a\x22\x34\x1d\x86\xd7\x8c\x96\x74\x75\x77\xbf\x22\x15\xa6\xa0\xd6\xda\xf5\x70\x28\x59\x64\xb9\xff\xb8\x6a\x67\x61\x28\xb8\xcb\xb9\xb4\xfc\x5f\xda\x84\x2c\xd4\xc3\x20\x2a\xf6\xa0\x8a\x54\x7c\x41\xfd\xae\xcc\x27\x15\x14\xca\x3a\xa5\x65\xb4\xc5\xb7\xc5\xec\x2e\x1f\x47\x9c\xa6\xb2\x94\x32\xd9\xaa\x7e\x2f\x8e\x0a\xf5\x80\xe3\xf7\x20\xc2\x4d\x6f\x3a\x03\x86\xba\xcb\x3b\x34\x20\xd3\x7d\x1a\x8f\xde\x49\xea\x93\xad\x1d\x2f\x70\xb0\xd2\x58\xe8\xd4\x36\xf6\x05\xc3\x8c\xf5\xf2\x96\x89\xb8\x05\x24\xa5\x2c\x34\xf3\x0a\x5c\xc4\x59\x7c\xb6\x84\x0f\x96\xbd\xb9\x52\x55\xdb\x8b\x8f\xbf\xa8\x39\x05\x7a\x96\xf5\x70\xad\xec\xf2\xe2\x84\xcf\xeb\xb0\x3b\x0d\x9a\x78\xd2\xf8\xb5\xe5\xf4\x50\x88\xd9\xda\x42\x15\x56\x4d\x01\x93\xc5\x79\x5b\xc1\xb6\x53\x36\xf4\x8f\x71\x69\xd4\x91\xb8\x02\x9f\x10\x0d\x36\x5c\x54\x5c\xc4\xbf\x0d\x1d\xd4\x2d\x69\x93\x91\x69\x3e\x2f\xc0\x5c\x78\x6c\x30\x67\x5d\xff\x18\xf7\x10\x81\x6e\xf9\x89\xb3\x65\x96\x7d\x44\xaa\x6e\x66\x73\x7e\x95\xe4\xbd\x06\x99\xce\x83\xc5\x4d\xea\x65\xa8\x3b\xaf\xa2\xff\x35\xa6\xa0\x17\x96\x06\x24\x36\x59\x31\x68\xa4\x86\x73\x68\x1e\xb7\x96\xea\x60\xd6\xa2\xb7\xaf\x1f\xa9\xf0\x6c\x5d\x9f\x9a\xae\x3f\x8d\xd8\xc7\x9a\xd1\x0a\x27\xd3\xca\xa7\x06\x32\xd5\x02\xea\xeb\x3c\xc9\x3d\xa2\x6e\xd2\x25\xfe\xda\x0e\x29\x29\x0e\x2e\xe2\x34\xad\x54\x76\x62\x86\x54\xe4\x16\x5d\x60\x7b\x36\x83\xe0\x03\x46\x99\xf9\x8e\x98\xc8\xa7\x10\xda\x64\x7b\x9e\xc4\x10\x60\x61\xe1\x5e\x0a\xfb\x6e\x5f\x0d\xbd\x6a\x81\xbf\x1a\x41\x87\xe0\xb7\x72\xed\xbd\xd5\xa7\x75\x8d\x5c\xce\x1d\x84\xf5\x10\x8d\x69\xf7\xdd\x29\xbf\x9c\x4b\x70\x2c\xe3\xe5\x8f\x79\x5f\x4d\x63\xcf\x78\x30\x1e\xf3\x9b\xf5\xd4\x8d\x4d\x10\x97\xda\x8b\x37\xa9\xbe\x75\x36\xb8\xf5\x2c\x62\x90\x1c\x5e\x72\x2c\x59\x5c\xd6\x88\x34\xdb\x3e\x8d\xac\xd6\x88\x71\x12\x68\xb6\xa4\xd2\x93\xad\x08\x7c\xbf\xe0\xdf\x0b\xf2\xa8\x12\x12\x6b\xd7\x26\x95\x95\x6e\x99\x48\x23\xcb\x2c\x93\x68\x64\x89\x4a\xa0\xd1\xe4\x51\xad\x64\x3c\xe5\x25\x9f\x28\x2f\xf6\xc2\xd4\x40\x2f\xe2\x94\x0f\x1a\xab\xb4\x0a\x06\xa7\x97\x90\xb3\x80\x33\x28\x42\xef\x21\x4b\x19\x90\xb6\x6f\xe5\x49\xb7\xec\x07\xce\xe8\x96\x48\xbb\x55\xc4\xad\x65\xcb\x58\x35\x46\xee\xad\x62\x39\x2d\x6a\xfd\x4a\xf1\x74\xbf\x4a\x29\x5e\xd4\x29\xc7\xd7\x8e\xcf\x03\x84\x60\x1d\x1f\x1b\x51\xc4\x81\x2b\xca\x68\x29\x12\x5f\xc9\xef\x1c\x9e\x41\x08\x71\xf9\xed\x18\xe9\x79\x30\x0a\xee\xa8\x47\xa0\x91\x54\x5f\x8f\x51\xcd\x45\x8d\xa2\xfa\x11\x34\x59\xfd\x10\xad\xf6\xf2\x57\xf0\x4c\xef\x7b\x61\x21\x85\xeb\x16\x18\x10\xca\x46\xbd\xb2\x8e\x51\x45\xee\x46\x31\xc9\x0e\x0c\xd6\xa0\x8a\x55\x6b\xd0\x28\xfb\x42\x26\xa1\x6c\x2d\x6a\x33\x54\x4c\x73\xca\xb7\x5a\xc0\x2c\x8e\x15\x73\x5a\xac\x18\xd3\x8f\xd4\x8e\xf6\x55\x88\x16\x39\x79\x66\x32\x4f\xf5\xac\xce\x2c\xa9\xce\x99\x17\xd5\xd7\x78\x36\xd3\xa1\x8c\x9a\x41\x5d\xba\x8d\x19\xcf\xed\xa4\xe4\x17\x32\xa9\x79\x29\xf1\xa6\x82\x7b\x21\x23\x5e\x0c\x2c\x5b\x56\xa9\xa3\xcd\xa0\x2d\xad\x4a\xa4\x5b\xdc\x0c\xed\xf2\x31\xc9\xa6\xf9\x47\x5b\x16\x59\x2d\x90\x80\x0e\x00\xe2\xa0\xff\x24\xc8\x45\x61\x15\x44\xa0\x4a\x8d\xd3\xcc\x0a\xa9\xe6\x6b\x61\xaa\x44\x33\xd2\x85\xf5\xee\x7d\x76\x76\x9e\x17\xa5\xfd\x7f\x76\xf6\x5f\xbe\xfe\x3f\xc7\x83\x4f\x83\x69\x52\xcc\xd2\xf8\x7a\x6b\x00\x61\x67\x1e\x0f\x6e\xac\x4a\xa5\x77\x7d\x9b\xfe\xb1\xab\xa0\x6b\x08\x3b\xeb\xeb\x24\x6b\xfe\x70\x87\xc5\x0f\x53\xab\xa3\x57\x6e\x97\xa5\x78\xdd\x98\x76\x6b\x39\x7d\xaa\x40\x10\xb4\x11\x08\x42\xd5\x9e\xe4\x59\x23\x99\xac\x8a\xc0\x93\x5c\x9c\x01\x0d\xd4\xa5\xd6\x98\xe5\x4e\x2c\x9e\xf7\x3f\x43\xd0\x88\x56\x68\x1a\x1d\x3b\x06\x22\x48\xf4\x65\x09\x85\x80\x2f\x8a\xe2\xca\x25\x5b\x71\x15\xff\x4b\xf2\x9b\x05\x45\x41\x1b\xd7\x0e\x9b\xb2\x24\x0b\xf8\xc5\x57\x52\x52\xdf\x1a\x71\x38\xd4\xd3\x50\x8a\x23\x59\x1d\xbb\xe1\xe4\xae\x81\x27\xce\x38\x7a\xcb\xd1\x15\x47\xcf\x38\xba\xf8\x46\x41\x28\xce\x8b\x7a\x20\x3b\xdf\xe9\x75\xc0\x49\x1d\x7e\x62\xfb\x8e\x20\xbe\xda\x3e\x7a\xbf\xf7\xec\xe8\xd9\xde\x7b\x32\x26\xc8\xfc\x4d\xc7\x54\xfd\xde\xd9\xdb\x3f\x78\xf6\x7e\x7b\x6f\x6f\x6c\x35\x7e\x5a\xea\xfd\xfe\xeb\x67\xaf\xe4\x2b\xf1\xcd\x32\x6b\x19\x35\xf4\xf3\xc3\xfd\x1f\x7f\xdc\x53\x2f\xe4\xf7\xba\xc6\xf6\xc1\xc1\xfb\xdd\xed\x97\x4f\x7f\x7e\xf3\xe3\xb3\x37\xef\x5f\x3e\x7b\xf5\xf3\x18\xa4\x26\xfb\x3c\xbe\x38\xb9\x9c\x9f\xf1\xb9\x7d\xc1\xb3\xcb\x66\x85\xfd\xa3\x67\x6f\x9e\xef\xed\xff\x62\x96\xd7\xb6\x4d\x3d\xc5\x0f\xdf\xbc\xf8\x51\xb4\x4e\xc6\x10\x9f\x8f\xcf\x8d\xc6\x2b\x9f\xf6\xbe\x0a\xb4\xaa\x50\xb5\xde\x5b\x5e\xa3\x13\xf8\x63\x16\x5f\xc9\xbd\xd2\x26\x7d\xa5\x68\xbb\x14\xb5\xe4\x7c\x1e\x2c\x74\x9b\xe9\x49\x12\xf8\x5e\x67\x1c\xce\xa7\xd5\x49\xf7\x7d\x16\x5f\xc9\x83\x67\xd6\xa7\xb7\xac\x2b\xdc\xee\xb2\xad\x0a\xd6\x07\x2e\xd5\xf2\xf2\x9a\xba\x54\x6d\x5d\x76\x74\x77\x5d\xec\x9c\x17\xb3\x3c\x2b\x92\x2b\xfe\x2a\xbe\xda\x4b\x8a\xb2\x3a\x82\x6b\x3f\xe8\x57\xf1\xd5\xc1\x25\x04\xb3\xaf\xdc\x21\xf5\x71\x1e\x46\xd0\x7a\x0f\x0a\x5d\xd3\xb1\x2f\x15\x25\xfa\xa3\x53\xe8\x2e\xf8\x54\x14\x59\x3a\xea\x2e\x34\x8b\xd4\xbe\x59\x7c\xb5\xa3\xb3\xc4\x2f\xcb\x58\xd1\x86\x7e\xb1\xa9\x6e\xd5\x73\x9f\xb2\xf1\x81\x0e\x19\x95\x14\xaf\xe2\xab\x37\xd5\x88\x20\xbf\xc6\xb0\x1f\xc7\xf2\x2c\x5f\x4f\x41\x67\x68\xb5\xa6\xb0\x53\xb7\x91\x99\xab\xd1\xe3\x92\x2c\xa0\x0b\xc0\x68\xdf\xe0\x89\x3d\x22\x4f\x39\xe6\xf3\x79\x3e\x1f\x5a\x2f\xc5\xb1\x6c\x96\xf2\x41\x63\x25\x0d\xac\x47\xfc\x91\x35\x88\x75\xe6\xa9\x62\x70\x9a\x5f\x66\x53\x3c\x78\x0d\x96\x47\x83\x8b\xf8\x03\x1f\x14\x97\x73\x3e\x28\xcf\xe3\x72\x90\x67\xe9\xf5\x20\xcf\xf8\x80\xff\x96\x14\x65\x61\x8d\x20\x83\x72\x37\x0d\xc5\x02\xf4\x1a\x89\x72\x97\xc1\xff\xb8\x34\xee\x20\xbb\x05\x8b\x59\x9a\x4c\xc4\x12\x27\xf7\xc5\x79\xc1\xb3\xa9\x22\xaf\x97\xbc\x28\x7a\x35\xd0\x42\x32\x12\x70\x4b\xff\xe1\x03\x08\x9b\x33\x7a\xbc\x80\xea\xa0\xdb\xac\xed\x1b\x2d\x17\xcd\x42\xdd\x91\x6a\x77\xbb\x68\x6e\x23\xc8\x8e\xa2\x68\x79\x4f\x7c\xd3\x0a\x47\xad\x68\xec\x2e\x33\x01\x24\xbf\x41\x5a\x23\xa9\xd2\x47\x4d\x5f\x64\x5b\xd6\x3c\xcf\x4b\x4b\xef\xb0\x1f\xd6\xb3\x8d\xed\xf8\x36\xbe\xe1\xa7\x75\x78\x1f\x63\xe6\xb4\xd0\xde\xc7\xa6\xd7\xd0\xce\xbd\xaf\x72\x30\x8f\xeb\x0e\x5b\x09\xd0\xaa\x22\xda\x96\xb9\xa3\xd1\xef\x83\x0c\xd7\xac\xca\xd0\xdc\x7d\x12\xf3\xb4\x65\x4e\x04\xc7\xb3\x79\x3e\xe1\x45\xa1\x28\x6e\x58\x42\x7c\xa4\x5a\x91\x6e\xbe\x5c\xbc\x88\x2a\x6a\xe9\x0a\x03\x8f\x39\x36\x77\xba\xf1\xb8\x4d\x59\x4f\x86\x2d\x5c\xe8\x7c\xd4\x4b\x1a\xad\xb5\x37\xcb\xea\x34\x84\x8c\xd1\x68\x0b\xb0\x22\xf7\xd7\x0a\x0c\xb5\xf1\x3f\x69\x11\xf6\xb0\x01\x35\x2a\x97\x55\xa6\x82\x39\x8c\x17\xf7\xdc\xde\xd2\x3a\x6d\x37\x63\xb2\xc8\x42\xfd\x4b\xdf\xc0\x9f\x10\xdb\x9e\xb4\xb1\x10\x4f\xa7\x43\x01\x6b\x0b\xcd\x9d\x72\x0a\x5b\xcd\xa2\x52\xb0\xd3\x41\x10\xeb\xc2\xd2\x44\x6c\x58\xae\xe7\x1d\xff\x05\xae\x25\xfa\x32\xf9\x1d\x15\x6b\x24\x5a\x11\x9b\xcd\x45\x9c\x64\x76\x1d\xfb\xe6\x4e\x69\xfb\x5b\x6d\xc8\x6d\x47\xb1\x9c\xf7\xdf\xe9\xb9\x43\x1f\x92\xea\x13\xd2\xc7\x2e\xa4\xa8\x1c\x9b\x8b\xfb\x7a\x98\x21\xae\x33\xca\x9f\x0c\x33\x23\x62\x9b\xc1\x8c\xd5\x70\xb2\x11\x2a\x71\x3c\x9b\xa5\xd7\xf2\x77\xe5\xfd\x6c\x88\x67\xd9\xe8\x66\xf8\x36\xae\x46\x5d\xf6\x8d\xba\x0a\x02\x37\xe4\x9f\x3f\x0f\xf9\xf8\x00\x67\xde\xef\xc3\x72\x34\x1a\x0d\xb3\xcf\x9f\xcb\xd1\x0d\x2a\x17\xcc\x76\xb9\xca\x6c\x9b\xaa\xb8\xff\xee\xff\x47\x60\xa3\x14\xd8\xd8\xfd\xce\xe7\xad\x71\xb8\x7d\xf9\x95\x80\xbd\x45\x99\x94\x9d\xd9\x93\xfc\x62\x96\x67\x32\xf5\x0d\xba\x4a\xf8\xc7\x9f\x2e\xb9\xb9\x65\xd7\x12\x4b\x15\xdf\xfd\xc7\xd3\xe1\x01\x7e\x73\x36\xe9\xc4\x77\xcf\x9a\xf1\xdd\xb5\x62\x68\x9c\xd5\x81\xdd\x37\x99\x05\x45\xea\x0d\x7f\x4c\x10\x41\x0e\x12\x63\xd1\xf5\xac\x25\xa9\x51\xf6\xbe\x67\x32\xa9\x09\xe4\xb7\xff\x05\x6b\xbb\x8c\x4f\x8a\x65\x2b\xfa\xed\x32\xe1\xef\x36\x0c\x70\x9d\x01\x5a\xbc\x4e\x1f\x27\xa7\xc3\x1a\x15\x0f\xe6\xa3\xf2\x7c\x9e\x7f\x04\x31\xf4\x99\x3c\xd0\x4c\xd2\xf9\x61\x7c\xb2\x97\x64\x1f\x06\x71\x36\x1d\x28\xf8\x74\x44\xf4\x41\x71\x9e\x5f\xa6\x53\x79\x62\x39\xe1\x83\xcb\x82\x4f\x07\x49\x56\x24\x53\x3e\xc8\x4f\x07\xf1\xa0\x1a\x8f\xc6\xdf\x30\x1d\x97\x78\x12\xa7\xa9\x22\x26\x34\x1f\x8d\x70\x72\xba\x0d\x3a\xc6\x71\x8c\x52\x9c\x4c\xc7\x09\x32\x72\x3f\x65\x5a\x00\x3d\x4d\xe3\xab\x7c\x79\x54\x37\xdd\x50\xdb\xce\x22\x99\xc2\xe6\x9c\xdd\x0c\x9f\xc5\x77\xdf\x9e\x8d\x4b\xaa\xdf\x8c\x4b\xaa\x37\xa9\xfe\xf6\x43\xba\x76\x76\x34\x85\x5c\x48\x8d\x86\xaa\xf9\x37\xf2\x6e\xf5\x91\x01\x2c\x85\x67\xed\xf0\x33\x78\x77\xff\xcd\x8b\xb7\xfb\xaf\x0e\xb7\xf7\xc6\xd6\x79\x3e\x4f\x7e\x17\xfb\x43\x6a\x21\x8e\x8f\x9e\xbd\x39\x7c\xb1\x23\x9e\x5f\xe9\x50\xac\x37\xc3\x67\xc5\xe7\xcf\xc3\x67\x2a\x58\xca\xb3\x62\x84\x5e\xdc\xcb\x3e\x4d\xc5\x7f\xd2\xba\x90\x34\xbe\xce\x2f\xcb\xf1\xb3\xc2\x00\x6b\x9d\x74\x8c\x46\xfa\x1f\x1d\x8b\x4d\x6a\x00\x6a\xa1\xb2\x8a\xaa\xb4\xdc\xe0\x4d\x96\x6a\xd9\x98\x1d\xc6\x27\xcb\x75\x1d\xba\xd7\xd3\x24\x9b\xf6\xdf\xce\xcb\x86\x8c\x53\x85\x56\xc5\x1d\x0a\x82\x5f\xd6\xb8\xc2\xcd\x58\x60\x47\x4f\xcd\x93\x77\xc7\x5b\xed\x9e\x17\x59\xb2\x39\xe0\x0d\x51\x4a\xd2\xc1\x49\xb6\xaf\x3a\xbe\xe9\xd3\x12\xdc\xa2\x22\xa8\xba\xeb\x68\x06\x9a\xaf\x0d\x7d\xc0\xd7\xb7\xbf\x39\x2c\xc6\x0e\xda\xbf\xbf\x11\x8e\x62\x0f\x2d\x43\x9c\xa4\x4a\xe1\x25\xd3\x6d\x34\x2c\x70\x04\xf7\x6a\x85\xb7\x2d\xe3\x13\xb5\x5b\xbf\xa8\x92\xb8\x99\xcf\xc6\xed\x65\x6c\x5b\x8f\x0e\x8b\x47\x8f\xfa\xf4\x79\x7a\x6f\x7e\xc3\x4f\x17\x58\x55\x08\xe1\x03\xce\xeb\x2d\x68\x8c\x2e\xc1\xe9\x4f\x0b\x83\x2a\xbc\xf0\xb3\x8b\x13\x3e\x9d\xf2\xa9\x78\x67\xae\x9a\x58\xdf\x35\x43\x62\xab\x5b\x53\x52\x55\x37\x43\x8d\x6a\x66\xfa\xa3\x6a\xd8\x6b\xb5\xa5\x0e\xf1\xc5\x02\x7b\x94\x45\xc5\x4d\x43\x12\x98\xca\x95\xb6\x83\x96\xe5\x8e\xb9\x2b\xac\x74\xf2\xab\xf5\x1b\x2b\x4d\x80\x5e\x49\xe6\xf4\x8d\x1e\xf3\x7a\x51\xad\xd2\x88\x3a\xca\xde\x43\xf9\x34\xac\x36\xa5\xce\x46\xf5\xcf\xea\xdb\x8b\x75\x2f\x59\x5b\xbb\xd3\xca\xa2\xf1\xef\x09\x0a\x56\x93\x8b\x05\xb1\x1b\xa2\xb1\xb6\xe4\x30\x49\x6d\xeb\x9d\x4c\x24\xd3\x20\xbf\xe3\xe5\x62\x34\xed\x44\xf8\x37\xaa\xbf\x9e\xe7\xff\xe1\x93\x92\x4f\x61\x1d\x5a\xe6\xed\x6e\x19\x9f\xcc\xe2\x8c\xa7\x70\xc5\x6b\x8e\xbe\x4a\x67\xa3\xac\x13\xd6\xbd\xd9\x7f\x9a\x20\x8a\xfc\xa6\x84\x2e\x43\xb1\x3b\xe8\x00\xff\x42\xf6\x97\x88\xeb\xaf\x05\x43\x7c\x55\x8c\x8d\x24\xaa\x87\xdb\x4f\x0f\xde\xbf\xf8\xc1\x1a\xa1\x37\xc5\x58\x67\x9e\xdf\x7a\x55\xa0\xcb\x82\x3f\x5f\xa4\x71\xac\x04\x4e\xdb\x7a\xf4\xba\x80\x64\xc7\xcf\x45\xd3\x3f\xdc\x25\x88\x38\xca\x51\xb1\x11\x9e\xcb\x53\xcd\x6a\x27\xa7\x73\x1d\x40\xfc\xca\x5c\x1e\x82\x46\xd2\x2e\x83\xce\xeb\x47\x2f\xa6\xe3\xa2\xfa\x25\xf6\xc9\x06\xaf\x96\x0f\x6a\x46\x9d\x26\xd9\x07\xdb\x7a\xf4\x5c\x70\x69\x90\x9c\x27\x63\xdd\x3f\x9e\xf3\x22\x4f\xaf\xf8\x8e\x3e\x11\x2a\x64\x0e\x5f\x16\x4a\x6f\x6c\x10\x6e\x05\xe0\xb8\x17\x66\xc5\x9b\xab\xa6\x86\x13\x24\x83\x9d\xe9\x3f\xef\xde\x29\x04\x34\xb5\xa5\xc7\xc7\x23\x9c\x28\xdf\xeb\xbe\xac\xa8\x95\x04\x70\x4b\x76\xd4\xaa\x5c\x0f\x23\x92\x42\xc9\x83\x86\x50\xb2\x30\x99\x6a\xd5\x90\xc9\x90\xa7\x53\x81\x56\x30\xb6\x59\xe8\x86\xa0\x02\x7b\xd4\x22\x8b\xb9\x2f\xed\x54\x49\x66\xee\xb2\x93\x18\x7b\x92\x9c\xde\xbb\x6e\x6e\xab\x6d\x49\x75\x85\xf6\xa6\xd4\x1f\x75\x76\xe9\x8e\xd4\xde\x8f\x36\xba\xb9\xd5\x79\x7f\x6e\xf5\x26\x78\xe2\x6c\xd9\xe4\xcb\xee\x38\x0d\x35\xe7\x01\x7e\x7f\x34\x35\xcc\x00\xdf\x9f\x18\x1b\x93\xfa\xf6\x6a\x1d\x55\x68\xf7\x54\xd5\xb0\x04\x32\x98\xba\xf8\x6c\x98\x71\x1d\xaf\x9a\x5e\x4f\x6d\x6a\xb7\x25\xcd\xd2\xb4\x00\x51\x52\xb5\xbd\xce\x8b\x0f\xbf\xe9\x74\x4d\x15\x9d\x56\xe6\x3b\x9d\x4c\x4b\x26\x7d\x6b\xc3\x1d\x39\x5c\x95\xa9\x09\x26\xad\x9b\xda\x09\xbe\x57\xc9\xfc\x4e\xca\x4c\x25\xf1\x3b\x29\x33\x60\x75\x50\xb7\xb1\x5c\x47\x43\x0b\xae\x2b\x17\xbd\xd4\x04\x59\xf5\xd9\xdc\x99\xe5\x40\x8c\x6d\x59\xad\xc0\x63\x54\x2f\x75\x69\x80\xa8\xa6\xe6\x85\xc1\xb2\x4c\xfe\x75\x5c\x29\x9c\xff\x73\xcf\x64\xbd\xb7\x6e\x3c\xe6\xc6\x31\x47\xf3\x3a\x2f\xbb\x78\x7b\xc7\xdc\xec\x26\x43\x35\x32\xaf\xcb\x16\x37\xbb\xb8\x37\xbf\x46\xef\x22\x0b\xae\x99\x05\x73\xa8\xd3\x60\xfe\x50\x08\x71\x50\xff\xda\x17\xbf\x96\x67\xc5\x54\x34\x55\x65\xc3\x44\x8b\x4a\x29\x89\xce\x4c\x9b\xd9\x31\x53\x7d\x9e\xa2\x7f\xa6\x5f\x3b\xfb\xf4\x8f\xdf\x87\x72\x5b\x8b\x3c\x95\xe1\x90\x21\xcd\xaf\x7f\x65\x34\x9d\xe7\xb3\x69\xfe\x31\x53\xc6\x4d\x0f\x9c\x0d\x2b\xb3\x6f\x43\xea\xef\xeb\x0b\xaa\xab\x72\x8a\x66\xc4\xa6\x5e\xa6\x61\x4a\x9b\x49\x9f\xc7\x4e\xbc\xcc\x63\xe7\xbd\xa2\xe9\x1f\x2a\x1b\xcb\xea\x95\x7a\xd3\x09\x36\xfc\xfe\x22\xbf\x2c\x38\xc4\x3d\x7f\x40\x7a\x58\x94\x9e\x54\x1d\x37\xed\x96\x8c\x28\xed\xfe\x97\x7a\x4f\x9a\x7a\x26\xe5\x20\xd6\xa3\x07\x68\x9c\x62\x17\xa8\x34\x56\x38\xff\x1a\x32\x95\x14\x4c\x97\x8e\xa4\x2b\xc7\x76\x85\xb8\x7d\x69\xd2\xf1\x81\x5f\x17\xc3\x67\xc5\x08\x5f\xc4\xb3\x3e\xbd\xde\xb3\xe2\x1d\x3f\xbe\x19\x99\x86\x3e\x63\x47\x9b\xc9\x74\xfb\x31\x5d\xf6\x3b\xe8\x5c\x13\xfb\x5d\x15\xe5\x8b\xd5\x04\x7b\x13\x2c\x53\x09\xd9\xd4\x44\x98\xa5\xaa\x1e\x46\xff\xb0\x49\xb7\xdf\xbb\x93\x4f\x36\x85\xb4\x92\x2b\x6a\x4c\xcb\xf8\xe4\xc5\x74\x39\x9a\x4c\xa8\x2b\x65\xe4\x82\xb9\xab\x75\xa2\x95\x04\x72\x33\xc2\xff\xc9\x93\x6c\x68\x0d\x2c\xd3\x0a\x6c\x47\xee\xa7\x2b\xe2\xf7\x03\xbf\x86\xb4\x48\x86\xef\xa8\x78\xdc\x5e\x6c\x46\xfb\x75\xc6\xb3\x35\xd5\xc0\xad\x24\xeb\x1a\xbc\xfd\xac\x9e\x92\x05\x8a\xf2\x9e\x88\x37\xfc\x36\x40\xcb\xf8\x44\xf7\xf0\x2c\x5d\x94\x7f\xbf\x51\x68\xcc\x1f\x3e\xe4\x7d\x71\xe8\xfa\xa2\xb5\x69\x67\xa5\x0a\x7f\x90\x26\x40\xe1\x7e\xd8\xca\x30\xf1\x2f\x55\x48\xbd\x3e\xcc\xb7\x95\x98\xd4\x63\x40\xd8\x6c\xb5\x65\x58\xa4\xb3\xa1\xf0\x66\x72\x95\x51\x1b\x18\x35\x99\x4d\xc7\x59\x83\xf8\xf5\xa2\x6f\x57\x58\x50\x7c\xb4\x70\xea\x76\xe4\x19\xa1\x5f\x62\xac\x5a\x57\x79\xbc\xe4\x8e\xd4\x25\x50\x7d\x62\xef\xa0\xf9\x49\xef\x14\x6b\xd7\xdd\xf6\xf3\x51\xdf\x3e\x62\x3a\x85\xd5\x60\x2f\xca\x04\xf6\xa0\xd5\x82\xce\x44\xdf\x47\x01\x8b\x87\xb8\x04\x7f\x2a\xd0\x12\xd4\xd9\xbf\xec\xc9\x43\x58\xc1\xd0\x20\xcd\x5b\x67\xbe\x0f\xc0\xee\x60\x86\x8b\x56\x93\x76\x87\x6b\xed\xcd\xef\xfa\x87\x73\x0c\x77\x34\x0d\x38\xd6\x25\xa8\x0e\x46\x64\x8c\xb5\x7f\xf1\x85\xc7\x8f\x5e\x4c\x77\x49\xa3\xd3\xb0\x19\xd3\x6a\x81\x85\x16\x2e\x61\x0c\x2a\x9c\xad\x89\x6b\xf9\x62\xa4\x83\xb6\x2e\x9e\x94\xb2\x31\x1b\x8b\x69\x7c\xed\x51\xa8\x7c\x25\xb9\x3e\x5c\xee\xe8\x48\x18\x2b\x24\xc9\xa9\x36\x99\xca\x23\x58\xe7\x7a\xf9\x91\xe3\xfd\x51\xbd\x75\xde\xba\xe9\xdc\x8c\xfa\xd3\x43\x09\xe4\xf5\x88\x7a\x7c\xd5\x56\x11\xef\x88\x83\x7d\x0d\x2e\x6e\xa9\xad\x4d\x6c\x64\xfe\x53\x71\x23\xb5\x1a\xbd\xdf\xc0\xb3\x2b\xc4\x1a\xbe\xd5\x0b\xb0\x3f\x1c\x8d\x50\x95\xee\x61\xd9\xa1\xb6\xd6\x45\x36\x07\xf4\xce\x39\x5e\xf2\xca\x50\xaf\xa0\x75\x56\xd5\x66\x5d\xb5\x7b\x7c\xb4\x37\x75\x2e\x97\x19\x6d\x3a\xaa\xb0\xbb\x7a\xc6\x6a\xab\x92\x35\x0e\xeb\xfa\x74\xfe\x9f\x02\xb9\xb7\x1e\xce\x8b\xf1\x5c\x40\xb4\xca\x7d\xd0\x10\x2e\x84\x7e\x4e\x50\x80\x2a\x95\xdf\x8f\xa7\xc3\x1f\x0b\xe4\xa1\x4a\x3b\xf8\xe3\xe9\xf0\x97\xb4\xab\x15\x68\xdf\x19\x2d\x38\x3d\x64\x4d\x2d\x41\xb7\x96\x21\xd1\x2c\x2f\xab\xc9\xca\xbc\x92\x5a\xff\x98\x0c\x57\x2c\x95\xed\x05\x84\x7a\xd3\x22\xa2\xa1\x48\x93\x02\xa1\xd4\x93\xed\xa9\x53\x8f\x3e\xfe\x1c\xf7\xa8\x31\x7e\x48\xd1\xaf\x31\x7a\x51\xa0\x37\xe0\x76\x2b\x4f\xd8\x9e\x3c\x61\xbb\xc6\x3d\x57\xad\xf4\x14\x6b\x55\xaa\x48\xd5\x62\x02\x9f\xd7\x93\xbc\x3c\x87\xeb\xad\x2c\xbe\x52\x3e\xac\x73\x2d\x8e\xc9\xd2\x52\x32\x93\x6e\xbf\x48\x66\x85\x03\xa0\xd0\x3b\x70\x8b\x7d\x9e\xcf\x2d\xf5\x77\xff\xb4\x7a\xaa\x9d\x65\x17\x9d\x0d\x1b\xd7\x6c\x33\x21\x04\x66\xa5\xca\x80\x2f\x61\xd1\xfe\x9a\xef\xc0\x8b\xf7\x50\x69\x0c\xf6\x2f\xcb\x94\x97\x4b\xeb\x02\xba\xf3\x5a\xc1\x28\x73\xe8\xd8\x32\x07\xa7\x51\x31\x9e\xcd\xd2\x64\xd2\xdf\x67\xc7\x33\x18\xb4\xaf\x95\x27\x72\x39\xbf\xe4\x50\x07\xb4\xab\x86\x66\xd5\xd0\xa3\xd6\xda\x11\x29\x4e\x00\x6e\x2b\x51\x43\x23\xd2\x32\x7d\x86\x0d\xd2\xac\x52\xdd\x5b\x0d\x6f\x62\x9e\xa6\xc9\xac\x48\x0a\xdb\x34\xf1\x81\xfc\x36\xd0\x54\x57\x70\x19\x3c\x19\xfc\x35\xc9\x4e\xf3\xbf\x0e\xb6\x06\xd9\x25\x78\xbb\x0b\x84\x36\xd2\x2d\x6a\x3d\x76\x3d\xb5\xa6\xbf\xf3\xed\xa5\x17\xcc\x51\xdd\xc8\xad\x77\xa3\xca\x0f\xf6\x32\x55\x6e\xb0\x4a\xbb\xde\xa4\xbc\x9e\xed\x4d\xdb\x71\x77\x4f\x4a\x90\x10\x72\x68\x8c\xa8\xb7\xf6\xb2\xb3\x07\xb4\xa0\xee\x6b\x09\xfa\x25\x41\x14\x88\xe4\xcc\xb4\x91\x26\xba\x00\x45\x3f\x09\x8e\x46\x9c\x76\x09\x6a\xfa\xef\xfe\xf8\xe1\xf9\x90\xc9\x5b\x5e\x66\xb8\xf1\x82\x37\x77\x63\xd5\x95\xed\x4d\xbf\x79\x4b\x90\x7f\xcc\x74\xa1\x17\x53\x78\x57\x79\x02\x2b\xcf\x70\xb9\x16\xeb\x76\xea\xdd\xb3\xaf\xf4\x0b\x5d\xb4\x5f\x91\xa0\x52\x42\x39\x6d\x97\xe0\x5f\x52\xf4\x01\x17\x67\x48\x79\x9a\x97\xaf\x51\x1e\xa3\x1f\x8b\x85\x7e\xc2\x4f\xef\xea\x86\x7b\xfd\x2d\xac\x93\x21\xb6\x25\xda\x2b\xd0\xaf\xe9\x31\x7a\x9a\x56\xa6\x77\x3f\xdf\x3d\x8b\x3d\x7a\xf9\x8d\xcc\xac\x9f\xa6\xe8\x69\xae\xc2\x75\x8a\x6f\x7a\x2c\xff\xfd\x4e\x0d\x7f\xdf\x17\x68\xb7\x40\x4f\x0b\xf4\x73\xed\x58\xfc\xcb\x3d\x82\x86\xbe\xd7\x21\x6a\xc7\x65\x8f\xde\xb4\x28\xf3\x99\xcc\xd1\x00\xe1\x19\x17\xf8\x7e\x54\xd9\x59\x4f\xf2\xe9\x35\x6e\xba\xa7\x58\x59\x6e\x17\x55\x0b\x0d\xdd\xc6\xe5\x05\xbf\x7b\xdb\xd5\xf9\xa9\xd5\x81\xf6\x67\x59\x54\x4f\xd9\x0f\x75\xc0\xba\x5f\xfc\xc3\x0f\xf8\x5f\xce\x3d\x22\x20\xfe\x7a\xcf\x3b\xbd\xf7\xd5\x50\xda\xb1\xb4\x1a\x5a\x77\x1d\x55\x2b\x9f\xc6\xe9\x8b\xa9\xd6\xd3\xbf\x6f\x9c\xe2\xdf\xd7\x59\x0e\x5a\x91\xa9\x16\x84\xcf\x92\x19\xe4\x9e\xc6\x93\x0f\x62\x57\xaf\x1f\x7f\x48\x66\xdb\x59\x22\xe3\x70\x8e\xad\xd3\x38\x2d\x74\xb8\xd9\x93\xeb\x59\x5c\x14\x72\xea\x35\xbc\xba\x7b\x41\x70\x10\x4c\xa5\x7a\x12\xa7\x32\xba\xca\x4a\x61\xb2\x16\x9d\x70\x2b\xd5\x48\x4f\xdf\xa0\x8f\x53\x5a\xf0\xd9\x3c\x2f\x73\xb1\x0e\xf1\x79\x5c\xec\x7f\xcc\x5e\xcf\xf3\x19\x9f\x97\xd7\xd2\x34\x9b\x23\x0b\xd0\x63\xc9\xb0\xed\xf0\x5d\x1f\xab\x8e\x44\x87\x4f\xfa\x67\x03\x37\x96\xd1\x50\x47\x7f\xed\x14\x6b\xad\x89\x35\xe3\xf5\xaf\xd0\xde\x6a\x61\x8e\xc4\xcb\x2a\xee\x92\x4a\xb9\xdb\x25\x8e\x9e\xe0\x49\x4b\x83\xdf\x55\x33\xfb\xa4\x31\xad\x55\xd8\xa4\xad\x76\xe0\xa7\x07\x0b\xa1\x21\x46\x72\xd5\xc3\x79\x3c\xc3\x05\x2f\x5f\xab\xd8\x7a\xcf\x55\x72\xfc\x3a\x55\x73\x3c\xe5\x3f\xe4\x59\xaf\xc2\xd4\x12\x07\x71\x4b\x5a\x0d\xe7\x07\x65\x5c\x6a\xcd\x6c\xcf\x40\xef\x1f\xd8\xe9\x17\xf3\x94\xaa\xbe\x9d\xad\x7b\x5e\x85\xc5\xbb\x96\x85\xe1\x75\x7e\x9b\xe7\x4d\x85\xc8\xf5\x0f\x73\xa6\xcd\xc7\x07\x7e\x7d\x39\x13\x92\x30\x08\xe4\x7d\xa6\x1f\x2a\x16\xd7\x0d\x7a\x40\xd0\x01\x9e\xfd\x7a\x50\x85\xed\x81\xd3\xa0\xa4\xca\x52\x62\xdf\x38\xff\xc1\x6f\x79\xfc\x7b\x29\x86\xbf\x0f\xe5\xd4\x5a\x6c\xc7\xa8\x82\x12\xfd\x31\xaa\x9a\xac\xca\x28\x7e\xd0\x78\xa1\x8e\x0d\xc6\x83\x63\xd4\x60\x67\x66\x4d\xf3\xb9\xa8\xd8\xf8\x7d\x8c\x7a\xf8\x8d\x39\x90\x2b\x3e\x9f\x27\x53\xde\x78\x2f\x4e\x4d\xdd\x5a\x00\xbe\x5a\x41\x46\x0b\x82\xec\x21\xbe\x3c\xac\x3c\xab\x2a\x22\x8a\x27\xbf\x9b\x25\x0f\x92\xdf\xa1\x84\xf8\xd3\x08\x69\x65\x90\xfa\x56\x03\xc5\xfa\x74\xa1\x97\x6a\xfd\x76\x3b\x2d\xf9\x3c\x8b\x4b\x2e\xfb\xea\x39\x82\x5f\xc7\xc7\xe8\xdd\x2f\xc5\x31\x84\xf2\x39\xfc\xa1\xdf\xa2\x20\x5e\x16\xfb\x4a\x9e\x70\x04\x55\x8a\x93\x5e\x1d\x80\x4a\x2e\x80\x46\xd8\xa9\x4e\x61\xa2\x8b\x19\x67\xda\x69\x12\xa7\xf9\x99\x3e\xaf\xaa\x56\xea\xe3\x2a\x3c\xb0\x55\x21\x19\x12\x4b\x2c\xb7\x62\x6e\xe7\x59\x7a\xad\x9e\xc8\x42\xda\x7a\xdd\x08\x79\xd4\x7e\xd7\x78\xa6\x22\x92\xd8\x31\x04\x77\x4e\x24\x2d\xd6\x50\xef\x67\xe2\xfc\x2f\x35\x8c\x06\xec\x36\x84\x6f\xae\x3a\x51\x56\xb5\x77\x0d\xcd\x55\xb5\x2a\xc4\xa1\x46\xb0\xa6\x05\xc7\x77\x55\xba\x5a\x12\x8d\x08\x5e\x5f\x3c\xce\x17\x8f\x6b\x7b\xe0\x7f\x27\x88\x04\x88\xb8\x4b\x63\x7d\xd5\x4c\xa3\x13\xe8\xeb\x3a\x47\xbf\xe7\xb7\x45\xfa\xfa\x7f\xd9\x40\xfd\xaf\x0a\xf9\x95\xe5\x19\x7f\xac\x9f\xdf\xe8\x2f\xa0\x3a\x58\xa9\x7e\x92\xa5\x89\xd9\x82\x75\x8c\xa6\x71\x19\x6f\x7d\x8a\x6b\x3e\x32\x74\xd0\x4f\x1c\xff\xfb\x2f\xe2\x3c\x0e\xfb\xd4\xc7\xcc\x42\xea\x29\x7f\x33\x1a\x5a\xff\x77\x30\xfe\xc7\x40\x09\x4f\xea\x79\xfe\x74\x34\xfc\x94\xcf\xe2\x49\x52\x5e\x6f\x39\xa8\x4a\xe9\xb7\x55\xe7\x1f\x1c\x3a\x68\x60\x53\xef\xff\x8c\xac\x9b\x11\x92\xb5\xfe\x53\x8e\x86\x96\x83\x69\x31\xe0\x71\xc1\xed\x24\xb3\xc5\xd9\x7f\x74\xac\xdf\x43\x6f\xd0\x91\xe8\xf1\xff\x56\xbd\xf5\xd7\x43\x77\x02\x65\x74\x5c\xf7\x57\x8d\xb9\x39\x5e\xd0\x8c\x37\x00\x68\xf6\x71\xcb\x78\xfa\xe0\xc2\xa1\x07\x5d\xa3\x36\x5a\x61\xf3\xbf\xc3\x38\xd5\x40\x6a\x93\xbc\xbf\xac\x2b\xbe\x8b\x22\x49\x6f\x52\xb6\x3a\xe3\x99\xfc\x7d\x6e\xa4\x67\xd3\x06\x8c\x63\xcb\x51\x92\xb4\x4e\x49\xcf\xe7\x60\x0a\x33\xc7\xf3\x4b\x7d\x67\xb5\x9d\x9d\x5d\xa6\xf1\xdc\xbc\x6e\x49\x70\x0e\x51\x69\xf8\x1c\x64\xe9\x37\x5c\xec\x05\xfb\xea\xd1\xb0\xbb\x5f\x27\xe2\x00\xb7\x3f\x7f\x03\x27\x26\xb0\xba\x98\xf2\xdf\xc0\x6a\xb3\x6e\x49\x7f\x19\x26\x00\x6a\x3b\xaf\x5a\x62\x82\x28\xef\x46\x92\x4e\x8e\x9b\xbe\xaa\x4a\x1f\x78\x39\x6b\x08\x12\xcb\x20\x5a\xa3\xd5\x56\xc6\x26\xd1\xee\xbc\xd3\xe4\xe8\x66\x7d\x5b\xc7\xd3\x7c\x3e\x7c\xdc\x9e\x19\xa5\x24\x7a\x3c\xea\xbc\x98\xe5\xb3\xe1\x68\xa8\xac\xe5\x2b\x8c\x4e\x93\x62\x92\x67\x99\x4c\xa8\xdd\x78\x35\xce\x2e\xd3\xd4\xb4\x2b\xd7\xf0\x2e\x4e\xe1\xa5\x70\x52\x70\xb0\xf4\x85\x28\x3b\x75\x06\x9e\x36\x72\x0c\x6b\x59\x93\xde\x46\xad\x7c\x92\x2b\xf7\x2a\x8b\xaf\xd3\x71\x23\x7f\x67\x7b\xa2\x97\x7b\x20\x75\xdb\x55\x19\x0e\xd5\xaf\xc7\x1c\x4f\x20\x55\xf9\x2e\xe4\x58\xfe\x3b\x57\x89\x24\xe5\x4f\x75\x28\xa9\x51\xaa\x4f\x69\x1d\xc2\xb8\x77\x34\x0b\xc8\x61\xd8\x6b\xf3\xfd\xc6\x39\x59\xcb\xa4\x3b\x34\x37\x75\x23\xa8\xdf\x3f\xef\xaa\x87\xfb\x56\x81\xfc\x2e\x72\x50\xc2\x35\x35\x70\x3f\xdd\x7d\x14\xe8\xed\xb7\xd2\x26\xe6\x0d\x85\xe8\xbf\xee\xe1\x39\x9c\x4c\x97\x66\xb5\x90\xe9\x08\x5f\xf4\x86\xea\xd2\x0d\xd4\x71\x9a\xb4\x01\xd6\x72\xdf\x0f\x51\xa5\x1d\xba\xec\x6b\xbb\xb4\xfe\xfb\x3b\xb2\x06\xce\xf3\xb4\x4c\x66\x77\x33\x00\xd6\x95\xa5\xe9\x6f\xe7\x7c\xf4\x6b\x8c\x2a\x5f\xb4\xbf\xa4\xe8\xb2\xe0\xcf\x7e\x4b\x8a\x32\xc9\xce\xb6\x80\x29\xdc\xa0\xeb\x18\xfd\x6b\xd5\xa8\xc1\x1b\x33\x1b\xe6\x93\xf1\x3b\x7d\x2b\x98\xf2\xd3\xb2\x7d\x47\x88\xac\x32\x9f\xe9\x37\xe2\xab\x7e\xac\xff\xc2\xab\x63\x54\x8a\x76\x7e\x13\x87\x12\x88\x49\x7c\x31\x15\xaf\xc4\xb9\x2a\x9b\x7c\xa1\x20\x0d\xbd\x01\x14\x2e\xb3\xe4\xbf\x97\x1c\x8c\x90\x53\xac\x66\xe4\xc5\x54\xeb\x1c\xe3\x45\x91\x1d\xf4\xcc\xaf\x17\xce\x41\x4d\x78\x45\x93\x69\x95\xfc\x7a\xac\xd1\x93\x62\x21\x72\x8d\x01\x29\x29\xd6\x4b\x78\x98\x8c\xd0\xce\x30\x1d\xf5\xc4\x76\xb8\x7d\xc1\x2e\xf0\xca\xaa\xda\xe6\x9f\x3f\x5b\xc6\xb6\xba\x0a\xdb\xd0\xe1\xdb\xdb\x08\x33\x1a\x35\x42\x86\xad\x64\x12\xab\x4b\x75\xa1\x55\x39\xa4\xfa\x04\x07\xf0\xb2\x59\x94\xf8\x51\x4f\x91\xf5\x08\x0a\xcc\x5a\x76\x7c\x15\xea\xf9\xc3\x87\x7c\xd2\x0c\x4f\xf8\x84\x6f\xe9\x09\x69\x76\x1b\x4f\xa7\x77\xeb\x53\x67\xc0\xaa\x57\x84\x14\x1e\x8c\x94\xaf\xe3\x46\x72\xfb\x6e\x02\xd8\x56\xfa\x7e\x33\xe1\x54\xb5\xe4\xee\xd4\xa8\x99\xdc\xdf\x6c\xb5\xb1\xae\x7b\x5b\x6e\xe4\xd8\x5f\x02\xf1\xe1\xfe\xeb\x9e\x86\x17\x43\xbc\x42\xbb\x12\xe8\x56\xc3\x0a\xd4\x2a\x2d\x56\x4f\xd3\x66\x0a\xff\xd5\x21\x5e\x0c\x2a\x94\x5e\x09\xd0\x9b\x3a\xae\x23\x28\xda\x96\xad\x06\x51\x62\xc1\xba\xbd\xc7\x12\x10\xad\x56\xf7\x41\x82\xcd\xf0\x87\x0f\xcb\x1e\xd2\x17\xcc\xe7\x5e\x74\x0f\x1d\xe9\xc0\x31\xd3\x62\x23\xa9\x24\xff\x92\xd6\x81\x63\xce\x2a\xed\xf8\xbf\xd6\xf6\xbc\x6a\x32\xee\xc6\xd6\xed\xdf\xba\x75\x37\xfd\x10\x93\xda\x01\x51\x1b\x0a\x69\x16\x8f\x0e\xf0\xcf\xd3\xd9\xd0\x52\x2a\x01\x65\xed\x60\xee\xfb\xb5\x37\x3c\xdc\x90\x54\xaa\x6c\xcd\x33\xa4\x62\xb6\x36\x5e\xaf\xf9\xa8\xa9\xb8\x6d\xe8\x6c\x51\x32\x85\x0d\xe1\xa6\x13\xfa\xe6\xab\x8a\x08\xf3\x65\x3b\xf8\x3a\xf9\xe7\x5b\x99\xdf\xfb\xf7\x1c\xad\xfb\x28\x2e\x4f\x6a\x6f\x1f\xf1\xc3\x30\xb4\xec\xec\x53\xc9\x74\x41\x82\x76\x45\x89\x73\x70\x20\xfd\x81\xcb\x12\xd2\x53\xb9\x37\x05\x7a\x71\x9e\x7f\x3c\xd4\x82\xdc\x02\xcf\xc6\x1e\x83\x68\xc7\x4c\xb2\xc2\xef\xd0\x00\x59\xd7\x1a\x73\xcd\x7c\x39\xf7\x3b\xc2\xfe\xba\x60\x7d\xae\xe6\x82\x2c\xb1\x61\x1a\x71\x35\x3d\x91\x6b\x25\x84\xe5\x98\xbe\xc7\xee\xaa\xd7\x50\xa0\xe2\xe1\x19\x84\xf8\xe9\xbb\x84\x32\x26\x75\x58\x5b\x42\xad\x58\x16\x1a\x4f\x79\x7c\xb5\xe0\x86\xcb\x98\x70\x59\xe1\x24\xbd\x5c\x00\x47\xab\x68\x65\xf3\x54\x1b\x33\x4d\x35\x85\x9e\x5c\x6b\xaf\x67\x83\x68\x47\x15\x5f\x52\x7a\xf8\x0e\x0f\xaa\x42\x9f\xcb\x5b\x5a\xb5\x80\x93\x9e\x05\xfc\x3d\x58\xb6\xf4\x26\xce\x8d\xbf\x53\x60\xcf\x0b\xf4\x53\x81\x92\x49\x05\x68\xfa\x9d\x02\xda\x0a\x14\x98\x4f\xee\x19\x1d\x2d\x9f\x7c\xfe\x3c\xcc\x27\x32\x3a\x5a\x3e\x19\xa1\xa2\xd3\xe2\xab\xfd\xc3\xf7\x07\x87\xdb\x6f\x0e\x9f\xfd\x30\xb6\xb2\xbc\xb4\x8b\x32\x9e\x83\x67\x3e\xc7\x3b\x3f\xbf\x79\xf3\xec\xd5\xe1\xb8\x4e\xa9\xc9\xf1\xeb\x37\xfb\x3b\xcf\x0e\x0e\x5e\xbc\xfa\x71\xac\x23\x10\x83\x45\x10\xc7\x07\x3f\xef\x88\x37\xe3\x2a\xe7\x2a\xe2\xf8\xd9\x9b\x37\xfb\x6f\xc6\x16\x04\x16\xb7\x6e\x86\x85\x80\xa7\x50\xf0\x14\x93\x11\x9a\xac\xbe\x3f\x75\x94\x2e\x55\x24\xf2\x97\xf1\x0c\xb4\x2f\x2f\xe3\x59\xf7\x0d\x2e\x78\x39\x2c\x26\xe6\x38\xd1\xa7\xa4\xca\x27\x64\xe9\x44\xb0\xf0\x08\xec\x4f\xb7\xc0\xb0\xb1\x8a\x8e\xb1\x25\xdd\x2d\x71\x99\x5c\xf0\x34\xc9\xf8\x41\xc9\x67\xaf\xf2\xf2\x40\xa2\xe9\xa6\x07\x18\xdd\xa5\x42\x5f\xa3\xbb\x69\x5e\xda\x3d\x5d\xaa\x74\xd3\x4b\x3b\x55\x76\x9d\xcb\x7a\xac\x27\xc7\xec\x54\x85\x65\x59\x6b\x84\xaf\xab\xa9\x5d\xd6\x9f\x9a\xf2\xc6\x08\xd5\xec\x0b\x3a\xca\xa6\xf1\x7c\xda\x1c\x67\x45\x1b\x4b\x7b\x3f\x90\xa5\x96\x75\x0d\x94\xd5\xe8\x18\x88\x6c\x41\xb7\x3a\x81\xf0\xd2\x5e\x41\xa7\xd0\x7b\x91\x70\xc6\x4b\x23\xbd\xd5\xf2\x70\xfb\x0d\x60\xcf\x78\x39\xe4\xa3\x3a\xd4\x4a\x25\x2a\x9c\x71\x33\x13\xdd\xfa\x2d\x56\xe3\xee\xb4\xa8\x6c\xa8\xef\xd8\x24\xd4\xfe\xa6\x09\x86\x2f\x57\x66\x09\x1d\x8e\xa0\x7c\x51\xf3\xc9\xf2\x70\x8d\xeb\x7a\xb6\xe6\x13\xc3\xb3\xf5\xde\x2a\xd6\x55\x0e\x46\x8a\x28\x1b\x27\xa2\xa5\x22\x95\xa9\xcc\x6c\xb4\x20\x43\xa6\x98\x8f\x36\xef\xc1\x31\x99\x7c\x6d\xcd\xe7\xf4\x2b\xed\xdf\x6b\xcc\x95\x5d\x94\x7c\x26\xcd\x40\x1a\xd3\xc6\x56\x39\xc8\xd6\x52\xa4\xb6\xed\x78\xe0\x54\x02\xe2\xa2\x5e\xd4\x61\xf5\x6b\xe2\xfd\x7c\xbd\xe3\x64\x4f\x46\xb5\xea\x7e\xb1\x75\x94\x14\xd0\x9d\xe6\xf3\x8b\x17\x55\x64\x9b\xa2\x8c\x4b\x3e\x6e\xee\xdc\xbd\x77\xbc\x2b\xbb\xfe\x95\x7c\x06\x29\xc1\x1e\x3e\x1c\x3a\xe8\x03\x7e\xf5\x5c\x39\x46\xd6\x7d\x8f\xb4\x77\x6b\x55\xf6\x90\xff\xa6\x9c\xf0\xaa\x47\xad\x7b\xcb\x24\xcb\xf8\x5c\x14\x1b\x35\x92\xf6\x1b\xfb\xc5\x2d\x19\x42\xdb\x28\xc1\xe6\x6e\x33\xac\x71\xd1\x6c\x5f\xed\x1c\x77\x68\xbb\xda\x77\x16\xb7\xad\xf6\x90\xbb\x36\x0e\xd5\xfb\x5b\x2f\x5e\x1b\x32\xe3\x92\xf6\xe5\xec\x8f\xc7\x0d\xa1\xe6\xbe\x67\xe1\xc9\xa4\xbe\xbe\xdd\x3b\x49\xd6\x55\x57\x99\x6b\xf0\x8e\x5e\x88\xd3\x49\xed\x1e\xb8\xcc\x17\xb1\x22\x36\x33\x02\xd0\xfa\xf7\x5a\x5d\xb0\xe5\x0d\x97\xe6\xf4\x80\x65\xa5\xbd\x2a\x21\xe2\x1b\x18\x53\xf2\x05\x61\x28\x63\x6d\x03\x18\x49\xbe\xc2\x1a\xf9\x05\x5b\x16\x78\xda\x9e\x4d\xfe\x79\x96\x82\x99\xa3\x2e\xd7\xe4\x67\xf2\x46\x1c\xbd\x6b\x1c\x28\xac\x76\x76\x42\x65\x86\xf7\x92\x4f\x93\xcb\x0b\xa5\x8b\x58\xc0\xd7\x92\xd3\xa1\xc9\xda\x92\xb8\x66\x6e\x2a\x5b\x21\x41\x56\x31\x8b\x33\x9d\xae\xf0\xf2\xe7\x61\xc3\xc3\xe9\xd7\x57\x93\x21\x43\x59\x8c\xa8\x4c\xbe\xd9\x71\x96\x12\x6d\x68\x23\x37\xaa\x5b\xf7\xe4\x3b\xf1\xd5\x47\x9d\xf6\x02\x34\x8f\x11\x51\xce\x57\xad\x60\x99\x4c\x07\xcb\x04\xaa\x50\x59\x84\x0e\xf0\xcb\xed\x62\x18\x8e\x1e\x4b\x4f\x27\x68\x70\xff\xbf\x97\x26\x79\x00\xdf\x59\xe0\x09\xf5\x40\x6c\xef\xf5\x72\x1b\x0d\xeb\x89\x40\x10\xa8\xa0\x63\x7c\x97\xc7\x68\x3f\x5d\xe8\xf6\x34\xfb\x5e\x37\x5d\xa9\x79\x99\x49\x85\xec\x5d\xae\x7f\x97\x37\xf9\xf5\xe3\x41\x9d\x7e\xaf\x98\x96\xc6\xb1\x9b\x42\xb2\x6a\xed\xeb\xe3\xf7\x6a\x0d\xfc\x36\x8c\x55\x5e\x70\x74\xc8\xd1\x3e\x47\xaf\xbf\x91\xc9\xca\xeb\xf4\x58\xfd\xa9\xb2\xfa\xdf\x75\x2c\xfb\xdf\x62\x08\xff\x2c\xd0\x89\x91\x2a\xe5\xfa\x3b\xd5\xc3\xed\x14\x28\x29\x04\xa2\xff\x59\xa0\x9f\x73\xf4\x34\x95\x46\x4f\x68\x9e\xa2\xd7\x39\xfa\x6f\x81\xe2\x09\x3a\x9b\xa0\x1f\x72\xf4\xbb\x98\x0c\x94\x4e\xd0\x4f\x31\xba\xaa\x14\x8c\x37\x88\x84\x34\x8a\xb6\x9a\xaa\x36\xfe\x1b\x34\xdf\x30\xa1\x90\xb6\x13\x9f\x6e\x4c\xcb\x89\x39\x6c\x60\xe5\xbb\xf9\xf1\x48\x8b\x44\xef\xe6\xc7\xba\xfa\x63\x65\x8f\xfa\x6e\x7e\x3c\xfe\x94\x6c\xcd\x51\xba\xf5\x80\x20\xf5\x72\xeb\xd3\xcd\x4d\x85\x26\x51\x09\x8c\x2c\x12\x5d\x17\x25\xa8\xfe\x9e\x8d\x50\x82\xd3\xf1\x03\xa7\x7e\xa6\xe5\xeb\x0c\x5f\x8c\x39\xca\xf0\x64\x5c\xa2\x0c\x4f\xc7\x0d\xd1\x66\x3e\xfa\x94\xe1\x1c\x56\xde\xe7\xcf\xca\x15\x6b\xca\x4f\x93\x8c\x6b\x07\x2c\x28\xf6\x89\x67\x97\x17\x7c\x0e\xbe\x1e\x0f\x1c\x90\xf5\xe6\x37\x62\xa1\xe3\x79\x03\x03\xd6\x65\x26\x6b\x4f\xad\x07\x63\x31\x3b\xf9\xe9\xe0\xe0\xfa\xe2\x24\x4f\x1f\x3e\x94\x7f\xc1\xdd\x67\x9e\x64\x67\x87\xf1\x59\xe5\xfc\xd5\xe9\xb1\x5b\x16\x7d\x92\x07\x01\xeb\x65\x3e\xbd\x4c\xb9\x75\x33\x42\x8b\x2a\x5b\xef\xdf\xf3\x42\x15\xd3\xd5\x1e\x38\x12\xdc\x72\xdc\x23\x5c\x94\x0f\x1f\x0e\xf9\x58\x0c\x60\x84\xc2\x87\xe5\xe7\xcf\xae\x78\x64\xe5\xd0\xbe\x35\xd6\x03\x91\xfe\x6a\x1c\xd7\xcd\xeb\x29\xe5\x8f\xe5\x65\x9b\x82\x48\xc6\x54\x1e\x0a\x61\x60\xf4\x38\x39\x1d\x66\x78\x3e\x9c\x2f\x82\x77\x8e\x2c\x75\xaf\x6e\xb5\xd1\x2c\x41\xe7\x70\x43\x21\x00\x2a\x00\x19\x35\x66\xf9\xe8\x34\x9f\x0f\x81\x84\x06\x49\x36\xe0\xa3\x0c\x4f\x87\x73\x94\xa0\x61\xcf\x4a\xe2\xef\xca\xe3\x9b\x11\x3e\x49\xb2\x29\x40\x86\x92\x51\xb5\x08\xe7\x02\x35\x59\x0f\x2d\xb7\xc6\xfb\xa4\x2b\xe0\x73\xac\xa0\xbf\xe9\x91\xfe\x79\x45\xbf\x02\xb2\x12\x59\xb1\x85\xca\x11\x2a\x45\x77\x79\x6b\x26\x54\xc1\x15\xdd\x01\x4b\x98\xcd\xd9\xd8\xb2\x50\x36\xcc\x70\x31\xb6\xf0\xdf\x66\x32\x64\x7a\xf1\x37\x71\x9e\x29\xfe\x56\xcc\x27\x7f\x83\xfb\x2c\x5c\x16\xd6\xe8\x66\xf8\xa9\xbf\x88\xd8\xca\xe0\x97\x1d\xcf\x12\x51\xb4\x23\xfb\x5b\x97\x05\x1f\x08\xdc\x4f\x4a\xeb\x71\xff\x24\x96\x0b\x89\x0e\x95\x78\x27\x8d\xe7\x49\x79\x0d\x9c\x7a\x7b\x96\x8c\xa5\x0a\x57\x91\x4c\x36\xec\x07\xeb\xb2\x4c\xd2\xe2\x6f\xe0\xc8\x51\xc9\x97\x76\x65\xa9\x0c\x39\x38\x93\xf1\xa7\x1b\x14\x2f\xd4\xa7\xdd\x34\x31\xda\x5d\x26\x3a\x7e\xb7\x85\x3e\xf5\x1f\xde\x38\x16\xb2\x66\xca\x5f\xa8\x82\x9f\x3f\x0f\xdb\x8f\x40\x57\xcf\x05\x03\x6e\x3e\x17\xdb\x75\x4d\xca\xe0\x5f\x74\x9a\x9c\x5d\x6a\xd2\x06\x96\x5d\xcf\xf1\x55\x9c\x26\xd3\xb8\xe4\xaf\xe2\x8b\xa6\x51\x5a\x72\x3a\x94\xa9\x45\xa4\x25\x77\xd7\x66\x0c\xce\xbe\x83\x2c\xbe\xe0\x83\x7c\x3e\x88\xd3\x24\x2e\x06\x17\x97\x45\x39\x38\xe1\x83\x78\x90\xe5\x99\xcd\x2f\x66\xe5\xf5\x40\x2e\x9d\x07\x16\xac\xc7\xbf\xfd\xbf\xe2\x6f\xb8\xe4\x45\x29\x56\xfc\xea\x4d\x66\x79\x39\x50\x47\x87\x41\x9c\x5d\x0f\x3e\x9e\x27\x25\x2f\x66\xf1\x84\x0f\x26\xe7\xf1\x3c\x9e\x94\x7c\x5e\x3c\xa8\xcc\xd0\x1e\x38\x37\x8d\x41\x66\xf9\xfc\x22\x4e\x93\xdf\x39\x74\xd0\x19\x6a\x1d\x66\x29\xdf\xcb\x3f\xf2\xf9\x4e\x2c\x1d\xf6\xcc\x26\x0a\x79\x26\xd7\x31\x2d\x5a\x2b\x48\x1e\x34\x4a\x5c\xce\x93\x0b\x6d\xdb\x6e\x62\x76\x08\x47\x54\x65\xb4\xdd\x85\x66\xc8\x47\x28\x79\xc7\x8f\x1f\x3e\x9c\xf2\x94\x97\x7c\x20\x7e\xc0\x93\x71\x86\xe6\x18\xca\x55\xd1\x34\x34\x21\x6a\x1a\x02\x57\x4d\x1d\x67\x89\xa3\x6c\xd4\x0f\xf9\xb6\xc0\x26\x2f\xc6\xed\x25\xa6\xf9\xd8\x7c\xec\xa0\x64\x9c\x3d\x9e\xff\x3d\xd1\xc6\xfb\xf3\x47\x8f\xe4\xd0\xe2\x71\xf2\x6e\x7e\xdc\x33\xac\x78\xb4\x78\x23\x89\x17\xd2\xb6\x60\x87\xa8\xc9\x6f\x3b\x44\x7a\xd3\x1c\x44\x3c\x9d\xb6\xa9\x53\x6f\x12\x06\x4f\x6e\x13\xd4\x5f\x0f\xcf\xf9\x40\xe7\xf1\xaa\x89\x33\x1b\xc8\xaa\x83\x34\x29\xf9\x3c\x4e\x07\xb3\xb8\x90\xd6\x8d\x83\xf2\x9c\x0f\x4e\xf3\x34\xcd\x3f\x26\xd9\xd9\x60\x16\x97\x25\x9f\x67\x5b\xb5\xa3\x93\xfe\xdf\xa7\x81\xf4\xf4\xb2\x05\xb1\x5a\x5b\xfa\x57\x75\x1c\x1d\xdc\xfc\x75\xf4\x58\xa3\xb6\x94\x5b\x44\x9b\xa1\x0e\xab\xf0\x67\x2d\xe2\x1a\x96\x48\xe0\xa8\x35\x8f\xe7\x71\xd1\x43\xb5\x0f\x1e\x24\xef\x16\x53\xd5\x71\xb3\x89\x33\x5e\xb6\xb1\xf8\xa0\xda\x49\x13\xb1\x3e\x7b\x36\xba\x1a\xa9\x87\xd7\x33\xae\x56\xea\x7e\x96\xea\x95\x5d\x23\x38\x29\x06\xb1\x40\x9d\x46\x65\x52\x0c\x2e\x78\x79\x9e\x4f\x71\x6d\x20\xba\x06\xb4\xb0\xfe\xbf\xeb\x59\x7f\x67\x01\x8c\xf2\x27\x1a\x60\x8c\x8f\xfb\x26\x3e\x39\x1d\xf6\xcc\xbd\x44\x7f\xd2\xf3\xa2\x33\xa0\xed\x6c\x20\xb6\xa7\x81\xf5\xd7\x47\xe5\x23\xeb\xff\x59\x83\xeb\xfc\x72\x10\xcf\xf9\xa0\x9c\x5f\x0b\x88\xcb\x7c\x50\xf0\x52\x32\x4c\x5e\x88\x9f\xd3\x9c\x17\xd9\x5f\x4b\x99\x35\x5a\x0f\x51\xed\x86\x03\xd8\x0e\x45\x0d\x60\x99\x26\x05\x2a\x26\x31\x4c\x90\x26\xc1\x1b\xa9\x28\xec\x6e\xa5\xf1\x0d\xba\x6d\x57\xe7\x4a\xb5\xfb\x85\x77\x76\xa5\x41\x5e\x6d\x73\xef\xc8\x1c\x62\x33\xbf\x87\x24\x10\x8f\x1d\x94\x8e\xab\xc0\x1b\x2a\xdf\x92\x84\x68\x28\x75\x63\xa3\xc7\xa9\x8c\xc5\x01\x1b\x8f\x95\x14\x76\x7e\x7a\x6a\x17\x93\x39\xe7\x99\x05\xe0\xe6\xe3\x2e\x97\xdc\x3d\x7c\xb9\xa7\x75\xe3\xfd\x59\x09\xeb\xb3\x4e\x51\x9d\xfa\xf2\xfe\xb2\xf5\x91\x6f\x92\xce\x05\xce\x7e\xce\x92\xff\xbe\x98\x8e\xad\xf7\x93\x74\xfe\x5e\x0c\xf8\xbd\xf5\x28\x46\xf1\xa3\x47\x88\xdf\x74\xa4\xef\x37\xfc\x34\xe5\x13\x21\xaa\xf7\x01\xaa\xde\x62\xd0\x61\xce\x2f\x27\xe5\xd0\x00\xbd\x86\xa1\xca\x10\x2c\x0b\xe5\xf3\xd1\xa2\x79\x2c\x50\xe5\xfd\x35\xad\x74\xe3\xc5\xb8\xf6\xad\x95\xc6\xa6\x96\xba\x24\x42\xc3\xa2\x66\x1a\xad\x73\x80\x89\xc4\xaa\x0c\xfa\x64\x40\xb1\xf5\xa9\xb5\xf5\xa0\x8f\xf3\xa4\x6c\x1e\x03\x8a\x9b\x9b\xd1\xc8\x04\x1d\x40\xac\x19\xd5\xfb\x78\x36\xe3\xd9\x74\xe7\xb2\x28\xf3\x0b\xa9\x6e\xee\x1c\xc7\x05\x09\xe4\x19\x7f\x95\x4f\x21\x94\xc7\x63\x8e\x93\xa9\x4a\x2b\x63\xce\x08\xe2\xb8\xe4\xbf\x95\x3a\x6e\xbd\x2c\xa0\x02\x51\x89\x86\x05\x3e\x8e\x62\x95\xed\x46\x75\x7b\x9e\xa4\x60\x9d\xde\x84\x49\xad\xe8\x83\xe4\xf7\xa6\xb0\xf3\xe0\xd5\xe5\xc5\x09\x9f\x43\x7e\xfd\xea\xeb\xdf\x9d\x27\xfa\x9e\xe1\x3a\xe5\xf8\x63\x32\x2d\xcf\xc1\xf1\x0e\x19\x4f\xcf\xc1\x69\x0c\x1e\x8f\xb6\xba\xc5\xf9\x23\x6b\xa6\xbd\xe8\x1a\x15\xe4\x8b\x36\x7c\xcd\x1d\xa0\x5f\x1e\x2b\x66\x69\x52\x82\xcc\x38\x7a\xe7\x1c\xb7\xc5\x33\xb3\x39\xe5\x3c\xc8\xa7\x3b\x71\x9a\x9e\xc4\x93\x0f\xdd\x19\x00\x73\xcc\x44\xc5\xbf\x3e\x33\x7d\x03\xa5\x76\x7c\xf4\xf9\xb3\x66\x85\xed\x57\xc8\xca\xf2\x8c\x5b\xea\xfe\xed\x3c\x2e\x8c\x02\x40\x8c\xa3\x46\x1a\xbd\x66\xe3\xb2\xc0\x63\x73\x2a\xc5\xa4\xa8\x99\x7c\x30\x1e\x57\xb1\x60\xbb\x6f\xc7\x55\x46\xf4\x7a\x36\xc5\x0e\x71\xa3\xc7\xd1\x82\x05\x16\xc8\xa8\x92\x47\xa1\x6a\x13\xd1\x7d\xc3\xd7\xd5\x2a\xec\xbc\x2f\x4c\x89\xf3\xc0\xcc\xc6\x9e\xdc\x26\x8d\x56\x56\x97\x87\xf9\x30\x43\xe6\x69\x98\xe3\xf7\x49\x26\x56\x67\x2d\xe7\x8c\xb4\x69\x8a\x1e\xba\x68\x5b\x8f\x3d\x43\x0f\xe6\xed\x6d\xa7\xee\xe7\x3c\x2e\x86\x8b\xaa\x8e\xb4\x4c\x03\x5b\x82\x72\xf1\x80\xae\x61\x43\xad\xfa\x97\x3e\x37\xf1\x78\x49\x37\x67\xbc\x5c\xdc\x8d\x40\x58\xac\x23\x9a\x9a\x05\x74\x0f\x0a\x8e\xc7\x0b\x0b\x8c\xe3\x05\x53\x29\x99\x9b\x9a\xca\xb4\x8f\xae\x54\x89\x6a\xd2\x7a\xd8\xc4\x83\xf1\x38\x6d\x11\x97\xf9\x7a\x9c\x8e\xd0\x83\x85\x83\x93\xa0\xdf\x98\xd8\xab\x11\xd7\x5c\x7d\x95\x19\x8c\x0a\xa9\xd1\x5d\x84\xc6\x5d\x5e\x5c\xad\x44\xb9\x34\xc4\x21\x53\x47\xa0\x31\xc9\x3c\x1b\x21\x45\x99\xa2\x84\xd4\xe5\x2d\x22\x95\x5e\x4a\xaf\xfc\x62\x16\x52\xb3\xc6\xcd\xe2\x12\xc3\x5b\xdb\x58\x6f\x45\x2c\x1a\x41\x23\x1e\x61\xdc\xc1\x37\x1f\xdd\x8c\x46\x5f\x61\x39\x2c\xa6\xd3\xbb\x2e\x91\x1b\x45\xa7\x72\x96\x17\x93\x62\xb6\x84\x12\x15\x63\xbe\x85\x08\x6b\x17\xf2\xfe\x5d\xe0\x56\x5a\xb8\x95\x14\xba\x3b\xec\x76\x33\xf7\x57\xef\x9e\xd3\x5a\xb6\x60\x9e\x92\xaa\x3a\x27\xd7\x62\x53\x91\xc5\xfe\x7b\xc9\xe7\xd7\xfa\xd6\x66\x68\x15\x57\x67\x7a\x4b\x7a\xcc\x9f\x80\x36\xb0\x91\xc1\xa1\x21\x36\x8c\xfe\xee\x3c\x7c\x58\xb6\xb6\xae\x76\x4f\x88\x3f\xb2\x06\xca\x9d\xa5\x59\x7b\xeb\xd6\xaa\x3d\x95\x5a\xd8\x68\x4e\x4e\x63\x3f\x17\xc0\x3f\x58\xc2\x25\xdb\xfb\x5f\x83\xf0\x2a\xab\x97\x2c\xe3\x73\x21\xcf\x2d\x6e\x07\x2d\xa2\xae\x7a\x9d\xb7\xa7\xac\x5a\xdf\x1d\x11\x6e\x38\xea\x1f\x61\x63\xc9\x74\xe8\xeb\x2e\x6b\x47\x99\xf5\x56\x3e\xd0\x6d\x2a\x5f\x74\xd0\xaa\x34\xac\x5f\x54\x6d\xfa\x05\x8e\x55\xbd\x27\x44\x71\x94\x5a\x54\x01\xd6\x64\xf1\xb7\x49\x3e\xe7\xb6\xfc\x2e\x6b\xa4\x4b\x50\xdb\x3a\xb2\x8e\x53\x94\x42\x6c\xc6\x18\xef\xe4\x73\xb9\x43\x14\x23\xd4\x77\x6b\x22\x43\xf7\x3c\x7c\x38\x94\x5f\xda\x07\x74\xcb\x6c\x56\x2c\x51\x5d\xae\xd9\xdd\x08\x4d\x80\x98\x74\xc8\x56\x39\xd5\x7a\xe8\xa2\x5e\xeb\xbd\x84\xc3\x28\x82\x92\x9e\xd3\x91\xa0\xca\x75\x90\xb4\x79\xda\xa8\xb0\x37\x16\x18\x9e\x4b\x4e\x3d\x9f\xe7\x1f\x8d\xdf\x07\x25\x9f\x3d\xcf\xe7\x1f\xe3\xf9\x94\x1a\x8f\x9f\x5d\xf3\xdd\x64\xca\x9b\x4f\xcc\x5f\x57\x70\xe8\xa9\x7e\xef\xc4\x29\xcf\xa6\xf1\xdc\xec\x29\x3b\x4b\xf9\x0f\xf9\xe5\x49\x6a\x56\x94\xc1\xa4\xd3\xcb\x8b\xcc\x84\xea\x80\xc7\xf3\xc9\xb9\x59\xec\xe2\xe9\xe5\x99\xf1\xfb\x39\x64\x38\xfa\x71\x9e\x4c\x77\xc0\x96\xbc\xf7\x95\x09\x9f\x0a\xb7\xac\x8d\x3d\x7b\x5e\xed\x56\xde\x04\xe6\x38\xd2\xfc\xd2\x6c\xe7\xc5\x45\x7c\x66\x76\xf6\x94\xa7\x66\xf1\xe7\x79\x3a\xe5\xf3\xfd\x19\xcf\x3a\x0f\xdb\x98\x30\x7e\xff\x5c\x34\x5e\x3f\x8d\xe7\x26\x2e\x76\x79\x3a\x7b\x91\x9d\xe6\xc6\xa3\x5f\xe2\x79\x96\x64\x67\x07\xca\xd2\xdb\x1c\x8c\x60\x48\x3d\xcf\x95\x3d\x79\xcf\x1b\xd1\xf4\x82\xc7\x1d\xd4\xee\x9c\xf3\xc9\x87\xce\xd3\x67\xbf\x4d\xd2\x58\x86\x88\x5a\xf6\xee\x70\x9e\xc4\xad\x81\x1f\x26\x17\x0d\x62\x84\xf6\xcd\xdf\xb9\x39\xe7\xbb\xf9\x45\x03\x6b\xd9\x87\x2c\xff\xa8\x6c\xed\xd6\xb9\x1f\xd2\xa6\x2d\xf9\xdc\x96\x1a\x84\x15\x95\x49\x57\x67\x76\x19\x9f\xd9\x67\x3c\xe3\xf3\xb8\xcc\xa5\x1a\xe9\xf1\x22\x80\x12\xbd\xe9\x1e\x1c\xfd\x38\xfc\xeb\xdf\xa5\xcb\xc3\x00\xb4\x49\x32\x61\x6d\x62\xe7\x97\x65\x9a\x64\x7c\xd0\xf8\x65\xcf\xe2\xf2\xdc\x26\xd6\x60\xf2\xdb\xd8\x22\x01\xf6\x42\x6b\x30\xb9\x1e\x5b\xd4\xc7\x94\x59\x83\xf9\xd8\x22\xd8\xb5\xfe\xf6\x8f\xae\x8e\xf3\xef\xa2\xe6\xca\x3d\x50\x6b\x30\x1d\x5b\x2f\xa9\x8b\x03\x44\x58\xec\x61\x12\x22\xf8\x70\xc4\x7f\x36\xc5\xc4\xb7\x19\xf6\x7c\x14\x60\xaa\x3e\xe4\x1b\x0f\x07\xc4\x26\xd8\x89\xb6\x09\xc1\xcc\x45\xf2\x13\xde\x21\x42\x11\x71\xb0\xeb\x82\x95\x97\x23\xff\x31\x51\x95\xd0\x38\xc2\x8c\x22\xf8\x80\x92\x88\xe1\xc8\xb5\x09\x0e\x28\xf2\x30\x8d\xe4\x87\x7c\xe3\x62\xe2\xe3\xc0\x45\x0c\x53\x22\x3f\xe4\x73\x82\x99\x87\x28\x26\xd1\x04\x33\x86\x28\xf6\x23\x9b\x61\x12\x21\x86\x03\xcf\xf6\x44\xcb\x2e\x26\x6e\x6a\xe3\x90\x62\xe2\x5d\xb9\x98\xf9\xb1\x04\x44\xfc\x47\x91\x73\x44\x22\x4c\x82\x1d\xea\x62\x9f\x20\x12\xe0\x20\x42\xd4\xc5\x61\x88\x88\x8b\x5d\x82\x14\x2e\xde\x5a\x7f\xfb\xc7\x5f\xe5\x66\x6a\x10\x5e\x6b\x3e\xd7\xc2\x35\x91\xb8\x66\x0c\x07\xd0\x2f\x8d\x52\x9b\x78\x36\xf1\x6a\xf0\x6c\x22\x20\x70\xc4\x73\x64\x3e\x47\xf0\x5c\x7c\xec\x91\x10\x01\x98\x8c\x0a\x54\x91\x10\x07\xa4\x55\x0e\x1a\x79\xbb\x41\xe2\x08\x11\xa3\xe7\xb6\x77\x44\xe9\x2e\x61\x47\x8c\xee\x86\x47\x24\xdc\xf3\x11\x75\x8e\x18\x8d\x29\xa2\x15\x6e\xe9\x79\x70\x44\xdd\x73\xff\x88\xb9\xe7\x81\xf9\xc6\xa6\x02\xeb\x81\x9f\xda\xd4\xa6\x2b\xc3\x56\xe4\x69\x32\x1d\x18\xdf\x5b\x88\x44\x24\xaa\xc6\x4e\x6c\x41\x91\x98\x46\x35\x86\x00\xcf\x0d\x04\x49\xdc\xc0\x47\xda\x44\xbd\xc4\x2e\x72\x52\xc0\xfc\x76\xfd\x18\x7a\xb9\x2f\xc4\x0a\x93\x24\x44\x40\x6e\x3e\x22\x11\x0e\xd9\xda\xd8\xeb\xd0\xa4\x60\x8d\x1b\x20\x49\x12\x62\x82\x08\x99\xd8\x0c\x47\xc8\xb1\x03\xc4\x30\xb1\x03\x14\x14\x0c\x13\x14\x88\xff\x26\xf0\x06\x05\x36\x3c\xb1\x83\x03\x4a\x11\x01\xec\x8a\x8a\xbf\x0f\x64\x13\x94\x4d\x6c\x8a\x43\xc1\x1e\x6c\x8a\xa9\xed\xd9\x5e\x01\x7f\x91\x67\x7b\x13\x78\x83\xc4\xda\xa5\xc8\x43\xde\x01\x75\x70\x84\x28\x43\xaa\xea\xef\x9b\xa3\x58\x26\xba\x22\x2e\x0e\xf6\x18\xb0\x9e\x30\xb5\x1d\xec\xdb\x04\x7b\x29\xc1\xae\x4d\xb1\x3f\x71\x30\x13\xcf\x90\x83\xa9\x20\x07\x5b\xfc\x26\x38\x4a\x6d\x0a\x05\xdc\x89\xed\x60\x0f\xfe\x11\x59\x52\xbc\x15\xa5\x44\x09\x5f\x10\x4b\x2a\xda\x13\x6f\x44\xe3\x91\x18\xf7\x0e\x25\x88\x62\x0f\x51\x07\xbb\x88\x8a\x39\x0e\x10\x3d\xb7\x99\x6c\x2d\x80\xe5\xcd\x90\x6c\xd3\x45\x04\xd3\x3d\xe2\x22\x7f\xa2\xe0\x10\x64\x49\x90\x84\x43\xfc\xf6\xf7\x22\x2c\x98\x31\xdd\x89\xb0\xe0\x69\x11\x0a\xb1\x8b\x3c\x14\x60\xc1\x26\xbd\x3d\x0f\xc3\xf7\x1d\x0f\x9e\x8b\xf7\xa2\x9c\x87\x05\x7b\x0d\x53\xd1\x13\xc5\x9e\x68\x9c\x22\x39\x14\xd1\x25\x81\xce\x88\x00\x1a\xa6\x03\x47\x3b\x02\x62\xe2\x09\x78\x3d\xec\x8b\x3f\x3e\x66\x57\x02\x66\x07\x01\xd0\xe2\x35\x66\x02\x5c\x44\xb0\x27\x96\x3d\xc5\x24\x95\xcd\x78\x29\x0c\x45\x20\x54\xe0\x46\x40\x0d\x1d\x8a\x87\x0e\x54\x8a\x52\x0a\x05\xdc\x89\x68\x48\x37\x26\x6b\x47\xa2\x4c\x4a\x01\xb7\x6e\x4a\xe0\xbd\x9f\x02\x55\xe0\x68\x22\x01\x17\x98\x08\x05\xe0\xa2\x37\xf1\xf7\x1c\x40\x13\x80\x21\x39\x33\xe2\xa9\xc0\xa8\x80\x49\x4c\x43\x94\xea\x79\x51\x13\x35\x91\xad\x30\x05\x95\x80\x4e\xce\xa4\x9e\x6a\x35\xd3\x48\xce\x32\x43\x15\x2d\x28\x62\x49\x35\xf1\x50\xa8\x28\x40\xd3\xc3\x14\xf8\x04\xf0\xc4\xfb\x2b\x31\xd5\x3b\x62\x33\x14\x98\x64\x4c\x80\x26\xe6\xa5\x22\xc7\xdf\x07\x2f\x19\xd0\x85\x9b\xda\x0c\x80\x23\x7b\x34\x14\x33\x45\x34\xfe\x02\x35\x41\x82\x22\x05\x1e\x48\xaa\x5e\x08\xd2\x0d\x11\x03\x02\x44\x54\xd4\x17\x40\x02\x65\x0b\xc8\x99\x22\x31\xec\xda\x72\x98\x81\xd8\xbc\xc5\x04\xeb\x12\x64\x4f\x74\x0c\xac\x9c\x8a\x7a\x02\x68\x86\xfd\x3d\x31\xf7\xa1\xaa\xaf\x96\x81\x0b\x04\x4f\x61\x74\xb2\xbe\xa4\x7c\x06\x48\x0c\x81\x89\x0b\x70\x6c\x00\x47\x2e\x25\x20\x35\x57\x35\x12\xa8\x46\xc4\x7c\xc0\x08\x44\x4b\xde\x9e\x0b\x63\xbf\x82\xfe\x99\x80\x34\x15\xcb\x4f\xd4\x95\x7f\x43\xb5\x38\x04\xb8\xa2\x2a\x4d\x55\xdb\x7b\x01\x26\x28\xc2\x24\x15\x1d\x33\xc0\x7c\x98\x2a\xb0\x26\xb2\x4b\x57\x21\x2d\x10\xfc\x05\xe0\x96\xef\xe9\x1e\xf1\xb1\x8f\xdc\x73\x0a\xab\x42\x6c\x0b\xde\x1e\x25\x82\x11\x4b\x32\xaa\xc8\x15\xa4\x0a\xa4\x6a\x02\x69\x6a\x1c\x03\xc2\x35\xfa\xd5\x74\x4c\x1c\x89\x66\xf8\x27\x1b\x90\xf3\xe5\x40\x23\x5e\xaa\x26\x58\x70\x6e\x77\x5d\xde\x66\xdb\x27\xf1\xf4\x8c\x4f\x7b\x79\xb6\x7e\xa9\x78\x37\xac\x8d\x70\xe2\x08\x51\x0a\x2d\x64\xd8\x85\x0d\x3c\x5d\xfc\xb7\x43\x5c\x2c\xb9\x37\x54\x75\xb1\xfe\x16\xfe\x3e\x78\x49\x99\x6e\x8e\xe2\xd0\x06\x56\x2d\xd8\xf7\x12\xbe\xbe\x03\x7c\x9c\x30\x24\xab\x0a\x06\xa4\x1a\xd9\xe4\xa8\x69\x73\xd4\xbd\x1c\x9e\xd8\x6a\x1d\x84\xc0\x6a\x61\x8d\x02\x3f\x77\x60\x91\x33\xc5\x4e\x7c\xc5\x82\x42\x60\x4f\xad\xe9\xba\x82\xb5\xf1\xe7\xe2\xfc\x9e\x16\x27\x53\xfb\x86\xd8\x2f\xc2\x89\x1a\x52\x68\x4b\x74\xfa\xf0\x97\x8a\xad\x48\x0e\x91\xfe\xb9\x1f\xff\xb9\x1f\xaf\xb8\x1f\xf7\x33\xa8\x25\xa7\xf4\x65\x2c\x8a\xb5\x5e\xc2\x0f\x79\x82\x67\x8e\x3c\xbe\xfb\x70\x74\xf7\xd6\xe6\x8b\x71\xca\xe7\xe5\xc2\xed\x40\xbd\xad\x8f\x97\x62\xc0\xee\xb9\x38\x0c\x5f\x39\x98\xfc\xc9\xda\xbe\x13\xd6\xe6\xaa\xd3\x07\x93\xc7\x11\x2a\xf9\x93\xfb\x27\x7f\xfa\x5f\xcf\x9f\x80\x3b\x45\x02\xa3\x01\xaa\x16\xf0\xfa\xe2\xd3\x12\x36\x41\x5b\x6c\x62\x85\xf3\x3a\x20\x14\xa6\x40\xcf\x2c\x70\x0b\x6a\xcb\xe1\x30\x75\x32\xa6\x36\x3d\x97\xeb\xb0\xa5\x3d\xb8\x4d\x24\x9d\x38\xb0\x52\xe5\x09\x3c\x84\xd5\x4e\xb1\x2f\xb8\x04\x55\x93\x1f\x2a\xe1\xda\x47\x72\x7d\x79\x3b\x20\x59\x52\xf1\xe6\x9e\xda\x83\xa5\xc8\x62\xed\xb7\xf0\x4b\x69\xc3\x7c\x31\x51\x82\x81\x12\xa5\x34\x91\x07\x81\x36\x21\x87\x8a\x20\xa9\xc4\x20\xfc\x15\xe3\xa1\xe7\x84\x00\xe3\x69\x52\xa4\xc0\x26\x05\x8c\x30\xcd\xb6\x14\xae\xc3\xd4\xf6\x70\x60\x47\x38\xd2\x9c\xce\xb7\x15\x21\x69\xbc\xed\xd0\x00\x58\x41\x88\x68\x80\x08\xd2\x20\xae\x8c\x93\x5b\xf4\x6c\x14\x7b\x40\x91\x81\x64\xff\x9e\x4d\x62\x42\xb0\xef\x21\xf9\x29\x35\x97\x38\x12\xd3\xc7\x58\x4a\xb0\xef\xda\x0c\x3b\x41\x8c\x7d\x82\x7d\xad\xd9\xc4\x84\xd8\x38\xa0\x7b\x34\xc0\x2e\x41\x3e\xa6\xad\xd7\x01\x15\x45\xf6\x28\xc3\xbe\x2b\xe4\x3f\x0a\x7d\x50\x24\x3f\xb5\x3a\x9a\xf9\x36\x49\x6d\xb1\x81\x30\xb2\x6d\x36\x20\xb8\xa7\x1f\x21\xb6\x2b\xd8\x11\x69\xb5\xed\x85\xd8\x65\xa9\x2d\x78\x30\x83\x66\x19\x92\x9f\x55\xb3\x21\x22\xa9\x0d\x9c\xb4\x0b\x97\x00\xcb\xc7\x14\x85\xd8\x8b\x3a\x63\x12\x48\x01\x08\xfb\x1a\x16\xec\x9d\x05\x80\x34\x82\xda\x40\xb9\x0c\x7b\xe1\x15\xc3\x2c\x6c\xbc\x40\xf2\x85\x38\x7b\x32\x44\xba\x48\x40\xd0\x28\xdb\xf3\xb1\x13\x89\x99\xf6\xa3\x56\x75\x80\x69\x4f\x00\x8b\x68\x84\xdb\x8d\xc3\x70\x52\x86\x9d\x48\x0c\xd6\xeb\x4e\xa4\x68\x1d\x47\x6e\x0a\xc8\x0a\x5a\xb5\x01\x91\xe7\x3d\x30\x7b\xa1\x18\x50\x0a\x13\x13\x76\x31\x21\xf6\xc6\xd0\x16\xcd\x32\x2c\x0e\x9e\xd8\xf7\x3b\x70\x09\x6c\xa6\x14\x33\xc1\x93\x59\x77\x50\x36\x90\x9f\xa8\x29\xf8\x47\x4f\x17\x92\x00\x69\x24\x30\x17\xd8\xa4\x83\x54\x41\x06\x47\x40\x1d\x4d\xc2\x31\xc8\xfb\xed\x4b\x12\x8a\xc3\xab\xb7\x2d\x36\x4b\x0f\x38\x1f\x11\x08\x07\xd1\x31\x44\xf5\x53\x78\x2e\xcb\xae\xa7\x1b\x6e\xc9\x88\xe6\x6a\xeb\x9c\x70\xbb\xab\x8e\x62\x42\x91\xfc\xd4\x54\x24\x44\x1e\x46\x51\x80\xdd\x48\x7e\x48\x3d\xb7\x8f\x89\x2b\x3e\x7c\x81\xa3\x90\xaa\x4f\x7d\xc9\xc0\x98\x8d\xdd\xf0\xcf\x85\xf4\xe7\x42\xfa\xfe\x17\x52\xdf\x69\xec\x96\xa5\x44\x37\x7e\x12\x53\x1d\x36\xa5\x82\xe6\xe2\x6d\x9e\xc2\x6a\x5c\x20\x06\x92\xa8\x87\xdd\x5d\x4a\x71\xd8\x46\x09\x09\xc5\x82\xf6\x62\x0f\x7b\x0c\xc1\x87\x44\x0a\xd0\xd1\x36\xc3\xbe\x38\x7c\xf9\xa1\x46\x95\x90\xda\x43\x21\x24\x3b\x91\x38\x45\x51\x1b\x87\xe2\xc4\x14\xb2\x3f\x17\xf1\x9f\x8b\x78\xc3\x8b\x78\x53\x8b\x83\x2e\x17\xa7\x43\x38\xa7\xb9\x48\x08\xd4\x62\x10\xdb\x04\x53\x71\x46\xa2\xa1\x46\x17\xc5\x42\xd0\x67\xbb\x4c\xac\x84\xce\x6b\xe6\xe2\x20\x44\x42\x76\x8c\xb0\x03\xca\x0d\xb7\xdb\x44\xd5\x4d\xf7\x0e\x15\xcc\x4d\x36\x71\x8b\xca\xc4\x6a\xa7\x01\xac\x3c\xb8\x9c\x0f\x30\x0d\x5a\x37\xcc\xf2\xee\x39\x42\xd1\x1e\x23\xa2\x4c\x80\x69\xd4\xbe\x84\xd6\xf7\xf7\x0d\x30\xa5\x95\xcc\x26\xc0\x8c\xa0\x8f\x30\x0d\x31\x8d\xec\xd0\xec\xdf\xa9\xaf\xc7\xf7\x04\x5f\xf2\xc5\xb2\x89\x70\x40\x90\x28\xb6\x5d\x9b\x19\x88\x9f\xf0\x62\x4f\x96\x21\xa1\x7c\x44\xfd\xba\x39\xd2\x36\x5b\x80\x8e\xa1\x57\xd4\xec\xb5\x69\xb5\xd0\x18\x75\x9f\xe5\xd0\x46\x2e\xbc\x05\xb5\x31\x1a\x4b\x4d\x05\xab\xe0\x80\x43\xed\x11\x71\x8d\x17\x04\x78\xa2\x8f\x9c\x2b\x7f\xbb\x55\x5c\xb5\xb2\xc6\xc6\xb5\xfc\xee\x5a\x19\xfb\x44\x9e\x32\xf6\x71\x31\x0d\x94\xb1\xcf\xba\x3a\xc3\xde\x63\xad\xda\x9b\x1c\x30\x9c\xf1\xb0\x07\xaa\x27\x4f\x10\xa1\x1f\x33\xa4\xf9\xb4\x87\x69\x80\x9c\x3d\x4f\x30\x02\x28\xb5\x5d\xbd\x13\x13\x47\x10\x73\x76\x81\xca\xeb\x3a\x88\x8a\x43\x9f\x8b\x5d\xf6\xf6\xc2\x26\xb0\x1c\x71\xe4\x9a\xb6\x19\xa1\x8f\xdd\x68\x57\x54\x6f\x3c\x15\x47\x58\x37\xdc\x23\x01\x76\x02\xb1\xa5\x34\x0d\x32\x02\x1f\x39\x69\x84\x03\x57\x2c\xa5\xc8\x35\xac\x32\xa8\x28\x2b\xd6\x9a\x1b\x6e\xca\x9a\xe4\x8b\x62\xe5\x25\xf1\xb1\xeb\x8b\x9d\x3e\x10\xb4\xe5\x8a\xf3\xb9\x96\xd5\x45\xf1\x2b\x1f\x87\x51\xe3\x05\x41\xc4\x66\xc8\x91\x92\x94\x8f\xa9\x17\x83\x95\x14\x7c\x28\xc9\x41\x6c\x13\xe2\x63\xdb\x7c\xa3\x05\x2a\x51\x65\xd9\x72\x52\x46\x7a\x9b\x59\x4c\xfe\x36\x9c\x4b\xd4\xaa\x67\x8e\x94\x6a\x10\xa1\xf5\x4a\xf1\xdf\x5e\x08\x4e\xbe\x4d\x1c\x44\x1c\x2d\x0e\x86\x50\x50\x3d\xd1\x90\xaf\x3e\xa3\xb7\x5b\x82\x10\x50\x14\x39\x41\x63\xa1\x13\x5b\x2d\xf4\x2b\xdb\x6f\x2c\x74\x21\x4c\x74\x17\xba\x84\x4a\xb4\xb2\x99\x85\xce\xba\x0b\x9d\x61\x87\xae\xbb\xd0\x97\x93\xf3\xca\x93\x62\x03\xbd\xf9\x77\x20\x4a\x0f\xaf\x4b\x93\x1e\xee\x92\xa4\x69\x4d\xfa\x3f\x9d\x18\x7d\xcc\x5c\x71\xd4\x09\xdc\xd4\xf6\xec\xb6\xf1\x99\x14\x0d\x98\x60\x3d\xf0\xe1\xe3\x20\xb4\xc5\xc7\x22\xf9\x60\x23\x5c\x0f\x91\xd0\xc0\x17\x0c\xda\x37\xd0\x45\x24\x02\xdf\x5e\xd8\x2e\x0e\xe0\x6e\x07\x48\x45\x2a\x3a\xe5\x79\xc1\xa6\xa9\x00\x33\x10\x00\x07\x7b\x42\x84\x0b\x7a\x4a\x21\x9a\x7a\xd8\x15\x27\x1f\xb7\x4b\x04\x86\x9d\xf1\xbd\x2d\x66\xab\xc5\xc5\xe4\xe2\x22\x04\x47\x9b\xb5\x98\x95\x82\xab\x38\xcd\xee\x92\xe8\x88\x78\xbb\xc4\xb4\x30\x75\x10\x3d\x27\x57\xfe\x6e\x65\x5c\x48\xd4\xc3\x46\xa1\x35\xac\x20\x97\xb3\x92\x6f\x4c\xf5\x9b\xe2\x42\x14\x79\x98\x78\xca\xe8\x11\x00\x43\x74\x5b\x9b\x40\x82\x59\x49\x04\x56\x2a\xde\xdb\x97\x94\x21\x6a\xca\x16\x04\x11\x13\xd9\x20\xaf\x9d\xd3\x23\x12\x98\xf3\x22\x9f\xba\x57\xe1\x39\x35\xc5\x08\xd1\x54\x2f\x35\x56\xc6\xf0\x9b\xb2\xe0\x8e\x02\x45\x8e\x0e\x76\xbd\x2f\x60\xc1\x4d\x10\xf5\x80\x1c\x5d\x4c\x7a\x08\xf2\x48\xbc\xf5\x5a\x4f\xbf\x0c\x45\xaa\x89\x67\xee\x36\xf1\x11\xf1\xd5\xa4\x30\x17\x66\x5e\x3d\x51\x84\xc6\x5c\xd8\x4a\xdc\x6d\xe2\x22\xe2\x6a\x1a\xa1\x50\x52\x3d\x51\x34\xe2\x6e\x8e\x22\xa9\x38\x30\x57\x90\x39\x12\xa6\xed\x1a\x32\x29\xd8\x63\xf2\xf6\xc2\xc6\x04\x79\x98\x86\x35\x59\xda\x2d\xb2\x0c\xb0\x90\x13\x59\xf8\xf6\x82\x61\x5f\x9c\x06\xa8\x77\x6e\x07\x06\xef\x53\xf4\x88\xc3\x73\x8a\xc9\x95\x1d\x61\x0a\xd3\xd0\xf3\xde\xc5\xee\x15\xa1\xe7\x00\x5d\xf3\x35\xa2\x38\xec\x10\x69\xdb\x97\x63\x43\xa7\xa2\x6d\x13\x33\xed\x39\x93\x98\x11\x5c\x84\x39\xc6\x94\x91\xce\x94\xc9\xc9\xdd\x08\x41\xd5\x46\xe8\x04\x50\xd3\x32\x95\xdf\x23\x9e\x10\x4d\x28\xc3\xc4\x4b\x6d\xdf\xf6\xcd\x53\x2a\x22\x21\xf6\x98\x2e\xe2\x03\xb3\x63\xd8\xa3\x46\x19\xd5\xee\x06\xa9\x6b\x15\x0c\xbe\xa4\xa1\xd8\x0b\x09\x05\xb5\x8d\x87\x99\x58\xbd\xe2\xb8\x13\x88\x63\x0d\x09\x1b\x9b\x27\x41\x62\x8b\xf5\xc4\xa9\x4a\x7c\xec\x51\x1f\xbb\x01\x22\x0e\x28\xac\x1a\x94\x42\x11\xed\x8a\xfc\x0d\x5f\xa0\xcd\x70\xb3\xda\x19\xc5\xf1\x15\x2b\x63\x6c\xb3\x42\x3b\xc5\x7e\xc3\x6c\xdf\x26\x57\x36\xa1\x06\x93\xa7\xc8\xb9\x22\x26\x2f\xd7\xb5\xfe\xe4\x62\x4d\x2e\xf6\x12\xec\x50\x42\xdc\x21\x2a\x1c\x02\x0a\x9b\x8f\xa5\x3d\x80\x14\xf0\x43\x2c\xa4\x38\x71\x96\x0f\x2b\xf1\x1e\xee\x9c\xb7\xeb\xa7\x95\xc4\x80\xbb\xde\x09\x6d\x07\xb5\x3f\x89\x6f\x2d\xe2\xf3\xb0\xe3\x53\x27\x08\xc5\x31\xca\x0f\x09\x89\xfc\xc1\x0e\xf1\xb0\x4f\xa3\x30\x24\x11\x72\xb0\xef\x46\xd4\xf7\x99\xe7\x0d\x88\x8f\x03\xe2\x44\x4e\x44\x90\x83\x1d\xe2\x50\x4a\x22\x16\xf9\x03\x12\xe0\x30\xf4\x9a\xcf\x76\x48\x84\x1d\x2f\x12\xa5\x9b\x2f\xa8\x83\x89\xeb\x10\x12\x92\x46\xdb\xd4\xc1\x81\x13\xfa\x2e\x63\x00\x07\xf5\x28\xa1\xd1\x60\x8f\xb9\xd8\x8b\x42\xdf\x75\x11\x0d\x30\x75\xa9\x47\xa9\x37\xd8\x61\x9e\x68\x23\x08\x5c\xc1\x6c\x31\x75\x1d\xc2\xa2\x60\x20\x9e\x92\xc0\x65\xae\x87\x68\x84\x5d\x37\xf2\x58\xc0\x06\xa2\x05\x16\x50\xe2\x8b\x33\x06\x76\xa9\xe7\x46\x2e\x1b\xec\x30\x86\x23\xcf\x8f\xa2\x20\x40\x8c\x60\xd7\x21\xae\x47\xdc\x01\xa3\x38\x72\x3c\x3f\x20\xe2\x61\x14\x45\x7e\x14\xba\x03\x46\xc4\xb1\x83\xd1\xc1\x9e\x8b\x1d\x4a\x59\xc4\x28\x53\xef\x03\x37\xa2\x83\x1d\x8a\xc3\xc0\x75\x22\xc7\x01\xa3\x3f\x87\x7a\xae\x1f\x45\x03\x82\x83\x28\x72\x68\xe8\x42\x61\x97\x05\x5e\xe0\xb1\x01\xc1\xd4\x21\x8e\xcf\x98\x07\xe0\x78\x7e\x44\xa8\x3f\xd8\x71\xb0\xef\x30\x27\x0a\xa9\x2f\x81\x0f\x7c\xea\x46\xd1\xc0\xc1\x5e\x40\x83\x20\x08\xa3\x08\x46\xea\x11\x46\x02\xd1\x34\xa1\x62\xce\x04\x3d\x08\xb4\xc0\xac\xed\xf5\x4d\xe5\xdb\xc1\x4b\x01\x5d\xe8\x39\x81\x1f\x88\x26\x48\x14\x04\x34\x04\xa0\xfd\xc0\xf1\x9d\xc8\x07\x1c\x7a\xa1\xe3\xb0\xc0\x1f\x50\x81\x7b\x27\x0a\x00\x0a\xc7\x75\x89\x4b\xd9\x40\x20\x25\xf4\x3d\x2f\x00\xd0\x88\xe7\x47\x41\x30\xd8\x61\x98\x30\x8f\x12\x06\x57\x1e\x41\x18\x50\x8f\xd1\x01\xc3\x9e\x4b\x3d\xe6\xb9\x62\x74\x8e\x13\x45\x91\x17\x0d\xc4\x8f\xc1\x9e\x40\xa3\x1f\x05\xcc\x85\x9f\x3b\x8c\x62\x12\x45\x11\x89\x88\xa8\x1f\x45\x51\x18\x7a\xa1\x98\x00\x2f\x0a\xa9\x1b\x84\xd0\x6a\xc0\x28\x75\xe0\x69\x48\x42\x27\xa4\x50\xd6\x75\x98\xeb\x8a\x21\x30\x86\x1d\x16\x44\xc4\x77\x01\x5a\xc6\xfc\xc0\x0b\x06\xe2\xa9\xeb\x07\x5e\x04\x96\x7f\x5e\xe0\xb9\x9e\x1f\x40\x13\x2e\x61\x5e\x85\x05\x37\x08\x83\xc1\x1e\x09\x71\xe4\xb1\x30\x10\xa3\xc0\xbe\x4b\x9d\x90\x44\xde\x60\x87\x84\x38\x60\x91\x4b\x99\x8f\x28\xa6\x1e\x65\xae\xcb\xfc\x01\x09\x31\xa3\x51\xe8\x12\x51\x58\x91\xb4\xab\xa9\xdf\x78\xb2\x43\x02\xec\xba\x8e\x1f\x86\xed\x82\x0e\x23\x9e\xc7\x42\x68\x94\x04\xbe\x1f\x51\xb1\xa8\x42\xe2\x87\x91\xa0\x65\xec\x8b\x5a\x82\x4c\xf6\xfa\x67\x6d\x53\xe7\x71\x57\x88\x91\x11\xa6\x60\xe5\x24\xa8\x5d\xec\xf2\x0c\x53\x8a\xe0\x43\xeb\x22\x7d\x5f\x88\x3e\x98\x04\xb2\xf0\x76\xab\x04\x72\x11\x73\x77\x61\x79\xb4\x2b\x0b\xbe\xcf\xc4\x61\xde\x53\x3b\x03\x71\xd6\xde\x18\x22\x1c\x7a\x2b\xef\x0c\xa2\x70\xd7\x99\x52\xbb\x33\xf7\x89\xad\x20\xef\x79\x58\xcc\xbc\x87\xdd\xa6\x7b\x24\x0b\x31\x8d\x26\x52\xf8\x03\xef\x54\x17\xb9\x38\x24\xb6\x2f\x64\x28\x0f\x07\x85\xed\x62\x42\xb1\x17\xd8\x2e\x0e\x5d\xe4\x4c\x6c\xcc\x88\x8d\x69\x60\x8b\xa5\x69\x13\x1b\xbb\xcc\x66\xd8\x8d\xb0\xeb\xc3\xfd\x19\x62\x98\x51\x3b\xc2\x6e\x88\x5c\x9b\x88\x0e\x52\x9b\x62\x12\x62\x1a\x4e\x6c\xec\x47\x62\x34\xbe\xcd\xe4\xad\x45\xe8\xda\x4c\x88\x69\xc4\x81\x3b\x3e\x5f\xd0\x8b\x1b\xd9\x98\x09\x28\x04\x7f\x74\xc0\xd6\xd2\xdf\xf6\xb0\x07\xdf\x22\xbd\x17\x7b\x88\xb9\x71\x84\x3d\x86\x22\x7d\xc7\xeb\x20\x86\x5d\xcf\xc6\xc1\x84\xe2\x20\xb2\x55\xe5\x80\xc2\x08\xc0\xd7\xd6\x16\x92\x9e\x29\xac\xd6\x48\x79\x6b\xad\xb3\x71\xb6\x69\xb3\xc6\x33\x89\x04\xdc\x24\x76\xb1\x87\x5c\x75\x29\xed\xd8\x2e\xf6\xc4\xbf\xed\xfa\xa9\x23\x2f\x95\x45\xd9\xb7\x17\x8e\x1d\xc4\x60\x58\xaf\x6f\xb1\x6d\xf5\x6b\xbb\x7e\x2a\x6f\xab\x31\x13\x32\xcf\x3a\x7b\xf0\x12\x50\x09\x0e\x09\x22\xde\x04\x3b\x42\xc4\xf1\xc5\xa4\xe2\x50\x60\x2a\x60\x36\x5c\x98\xdb\x60\xf6\x29\x45\x30\x2c\x4e\x04\x05\xa6\x82\x30\xb1\x03\x56\x84\x30\xa1\x44\x4f\xa8\x98\x5a\x22\x46\x19\x89\x43\x41\x40\xe2\x10\x85\xd5\x3d\x10\x15\x93\x1a\x8a\xa3\x1d\x95\x1f\xfa\x05\xf1\x6c\xec\x8b\x2d\x54\x30\x16\x0f\x6c\x5b\x3d\x65\x83\x28\xf8\x36\xdc\x99\xd1\x42\xde\xdb\x06\xa1\x8d\x05\xb1\xf9\x31\xc3\x44\x10\x9a\x16\xcd\x6c\x86\x9d\xd0\xc6\x21\x03\x42\x16\x80\xda\x01\x76\x03\x1c\xb9\xb6\x18\x0c\x32\x3d\x7a\xb1\x38\xb7\xac\x81\x42\xd6\x83\x42\x2d\x69\xfd\x36\xb6\x04\x57\xf1\x4c\x13\x08\xd7\x5a\x95\x3f\x2d\x9e\x19\x0a\x6b\x0d\x7c\xd3\x9b\x07\x34\xb8\x05\x05\x26\x23\x3e\x24\x1f\x61\xd8\x03\xdf\xdc\x40\x2c\x4d\x86\x29\x18\x5e\xfb\x02\xe7\x36\xc5\x4e\x88\x88\x8d\x99\x2f\xcd\x05\x05\xb2\x43\x6a\x0b\x64\x89\xd5\x9b\x62\x8f\x89\xc2\xc1\x04\x53\x6a\x63\x5f\x2c\x3a\xc7\xb3\x09\x45\x2e\xd8\x41\x31\x0c\x16\x11\x04\x47\x98\x79\x62\xa1\x06\x36\xc5\x2e\x58\x8b\x53\x1b\x07\x81\x68\x47\x6c\xa8\xb0\x4e\xed\x50\x2a\xa8\x1b\xb8\x26\x0c\xd1\x82\xd9\x62\x95\x31\x69\x24\x45\x63\x1c\x86\x38\xd4\x0c\x0d\x87\x1e\x76\xc1\x3e\x39\x90\x1f\xea\x22\x0b\x08\x2c\x20\x13\x1b\xdc\xdc\x6d\x17\xb3\x00\xcc\x3a\x42\x41\x60\xe0\xfd\xee\xc5\x82\x20\x10\x7c\x54\xc4\x14\x22\x86\x3c\xe4\x55\xec\xc0\x09\x71\xc8\xce\x9d\x58\x1c\x5b\x51\x68\x32\x0a\x27\xb2\xb1\x4f\x27\xc0\x6e\x04\xa3\x93\xe6\x1f\x3e\xf2\x05\x1f\xf3\x70\xe0\x99\x6c\xa2\x9e\x8e\x36\xe1\x2c\xf6\x4f\x6e\x31\x68\x08\x3f\xb1\x09\x6f\x77\x8a\x68\xb4\xeb\x36\xf5\x70\xbb\x8c\x9a\x0f\xd0\x26\x15\x05\xe0\x60\xf9\x55\x3a\x64\x55\x87\xd1\xae\x79\x37\xe9\xa2\xa0\xb7\xbf\x06\x7e\x21\xda\xc7\xa2\xcd\x4f\x1c\x1c\x83\x38\x40\x81\x82\x3f\xb0\x83\x6d\xf9\x4b\x9d\xeb\x48\x00\x1b\xb1\x17\x4b\xe2\x11\x1c\xd8\x43\xde\xb6\x26\x25\xd8\x78\x37\xb6\x45\x08\x69\x38\x10\x44\xc5\x82\x18\x54\xfb\x52\xc1\xaf\xb5\x86\x2e\x8e\x18\x72\xb6\x6b\x77\x75\x0f\x74\x19\xee\x11\x23\x4d\xef\xf6\x5d\x1a\xb5\x9c\xda\xa1\x9c\x51\xd3\xe8\xe9\xed\x4b\x1a\x21\x46\x76\x03\x28\xc4\x62\xe2\x09\x61\x47\x7e\x2a\x31\x85\x22\xe7\xdc\xd9\xd4\xe6\xf2\x47\x1c\xe4\xca\x7e\x41\x4b\xf6\x54\x83\xd2\x40\x6e\x14\x12\x09\xc1\xfe\xb9\x8d\x29\xed\x58\x9f\x51\x07\x11\x17\xfb\x35\xd5\x09\xae\xed\xda\x21\x76\x69\x4a\x6c\x71\x8a\xd8\xae\x88\x56\x91\xe9\x1d\x20\xa7\x2b\x41\xfe\x0d\x0c\x87\x06\x9b\xf3\x24\xf8\x9f\x46\x88\x2b\xb9\x2b\xaf\x4e\x86\x02\xe9\xb6\x27\xe3\xce\xb8\xf0\x4f\x9f\x41\xa8\x6b\xfb\xd8\x8f\x3a\x74\x76\x67\x76\xb8\xa2\xd3\xf1\x32\x99\xaa\x6d\x53\xba\x88\x4e\xd6\x76\x1d\x5c\x4a\x25\x3e\x84\xaa\xf1\x68\x1f\x95\x78\xf2\xb8\x47\x84\xa8\x05\x1f\xf2\xb9\x90\x6b\x08\x58\x37\x80\x13\x54\x85\x6c\x0f\x31\x76\x4e\x59\xeb\x39\x03\x5d\x8b\x77\x65\x43\x05\xb3\x21\x64\x74\xbf\xa2\x84\xd1\xb7\xc3\x18\x28\xd4\x5a\x3d\xe2\x00\x0e\x83\x35\xc4\x96\x3f\x28\x8a\x56\x34\x26\xde\x14\xeb\xd6\x86\xc3\xe2\x10\x62\x7b\xe2\x58\x79\x0b\xa7\x5e\xdd\xa8\xf3\xfb\xe6\xd2\xb7\x8d\xe3\x4e\x1c\xfa\xfb\x26\xac\x15\x3c\x4c\xbe\x24\x2b\x5e\x0f\xa8\xcd\xf0\xd8\x5b\x3a\x59\xc8\x5f\x1b\x32\xf9\xf6\xa6\xcc\x4b\x69\x84\x3d\x2a\xe8\xda\x93\x97\x40\x0e\x86\x83\x5a\x28\x1f\xc5\x04\x9c\x1a\x35\x82\x29\x76\x3d\x44\x31\xf3\xc1\x46\xd6\xc3\x6e\x94\x46\xe2\x1c\x1c\x61\x16\xf5\x14\x05\x27\xb8\xce\x71\x42\x45\x17\xdc\xc4\x81\xcd\x41\xd1\x2e\xf1\xb1\x4b\xf7\x88\x8b\x89\x38\x6b\x86\xd4\x90\x1a\x88\x38\x82\x22\x6f\xd7\x37\x9e\xb9\x28\x38\x6a\x8a\x1b\x88\xee\x32\xa7\x1d\xc2\x8a\x34\x84\x0f\x14\x81\x39\x8a\xb3\xeb\x1f\x11\x76\x1e\xe0\xa6\x00\x63\xd3\x5d\xff\x28\x38\xf7\x05\x3a\xa8\x20\x78\x86\x3d\xd3\x64\x18\x87\x04\xbb\x64\x97\x39\xeb\x9e\xe4\xd6\x08\xad\x22\x43\x8b\x78\x47\x34\xba\x0f\x8c\xe7\x21\xf6\x48\x1c\x80\xf7\xb5\x92\x47\x6c\x50\x30\xd1\x2f\x84\x66\x26\xf8\x7f\xcb\x1f\x0c\xa9\xb1\xac\x6f\xc1\xb8\x92\x7c\xf4\x6d\x23\x1e\x38\xb0\x6c\xee\x3b\x4d\x14\x07\x6c\x9b\x49\x8d\xb0\xef\x37\xb7\xcd\x3d\x12\x09\x0e\xf8\xa5\x16\x86\x87\x57\xbf\x18\x5e\xef\x04\xf5\x9d\x38\x5c\x6c\xc6\x52\xf1\xab\xf1\xa5\x97\x3e\x22\xa4\x26\x99\x80\xae\x7b\x71\xbf\x86\xa7\x98\xc2\xb5\x87\xdd\x45\x32\xdb\x57\x20\xbe\x2f\x39\xe0\x3f\x30\x31\xae\xee\xac\x2b\xb9\xeb\x76\x83\xcb\x83\x51\x12\xfb\x62\xf3\xb6\x94\xcd\xaf\x3e\xa1\x5f\xda\xbd\xb2\x47\x4c\x81\xc8\xc8\x9b\x10\x55\x20\xda\x2b\x61\x38\x10\x53\x1e\x80\xf5\x79\x25\x25\x33\x1c\x06\x82\x6a\x08\xc1\x04\x6e\xab\x22\x44\xab\xfb\x38\x21\xbd\x82\xb8\x4d\x91\x69\x11\x89\x89\xbb\xe7\x23\xea\xad\x22\x78\x18\xa1\x3b\x6d\x7a\xd7\xbd\x5c\x88\xcf\x04\xee\x0a\xc4\x87\x7c\xe3\x41\xec\x52\x21\xda\x60\xe6\x9a\x4e\x52\xe0\xf3\xe7\x62\x12\xd9\xc4\xc3\x62\x9d\xf8\x2e\x82\x0f\x35\xe2\x1a\x1b\x6f\x41\x02\xf5\x90\xd8\x11\xb1\x38\xf3\x85\xa1\x4d\x18\x0e\x49\x8c\x7d\xbf\xde\xdc\x30\x0b\x6d\x4c\x5d\xb1\xb0\xdc\xd5\x43\x9c\xde\x41\x8e\xfa\x76\xf3\x24\x84\x2f\x1a\xb7\x9d\xe3\xef\x23\x7e\x7d\xff\x53\xf6\xc7\x16\xe6\x60\xff\x93\xf1\xab\x30\xdb\x5b\x07\x29\xe7\x11\x76\x41\xf1\x11\x20\xf8\xa8\x36\x51\xc1\x11\xfd\x98\x61\x9f\x21\xa6\x3d\x64\x89\x8d\xa9\x6f\x63\xcf\xff\x52\x84\xf7\xe5\xc4\xc9\x7b\x50\x60\x4c\x00\xbb\x5a\xc4\x70\x10\x76\x02\x1b\xb3\x2e\xd6\xea\x69\xf8\x53\x30\xbd\x4d\x30\xfd\x73\x17\x5a\xc0\xd2\xbe\x58\x70\x85\x8a\x38\x77\x81\x20\xb6\x99\x74\xb9\xf6\xa3\x3f\xd7\xfc\xd7\x5d\xf3\x7f\xca\xfe\xdf\xa5\x74\xc3\xc8\x1f\x83\x15\x7c\xd5\xb3\x07\x24\x69\xd9\x88\x45\x0b\xf6\x08\xa2\x01\x0e\xd9\x36\x71\xb1\x0b\x69\x23\xf4\x12\x02\xe3\x9b\x28\x56\x8e\x1d\xb4\xe6\x3c\x04\x33\xcf\x76\x71\x48\xc4\x81\x9b\x78\xdb\xc4\x01\x63\x36\xf8\x54\xe8\x04\xab\x4f\x17\xbb\x47\x0c\x13\xb1\x6a\xc1\xe0\x9a\x19\x21\x08\x02\xe4\x1c\xb9\x42\xc6\xe9\x56\x0e\x44\x5d\x68\xf9\xca\x05\x4f\xf9\x36\x00\x82\x04\x7c\x05\x5c\x13\x68\x5b\x19\x33\x45\xac\xa6\x42\x1b\x8b\xa5\xe5\x5d\x91\x66\xf2\x0c\x82\xc8\xb9\x18\x78\x83\x08\xc8\x11\x58\x29\x1b\xf6\x47\x06\x86\xde\xbe\xf4\xc0\xa8\x2a\x84\x70\x00\x3e\xdc\x2a\xfb\xfa\x56\x19\x14\xda\xae\xcd\x04\x30\xd4\x55\x9f\xaa\x59\xec\x7b\xb6\x87\x43\x4f\xa2\x2b\x0e\x71\xe0\x22\xf8\x50\x76\x07\x01\x18\x5f\xc1\x60\xe3\xfe\xea\x62\xc4\x1e\xea\xef\x13\xb1\xcd\xfa\x98\x33\x17\xd3\x70\x1b\xa6\x88\x6a\x86\xea\x40\x18\x81\x10\x31\xba\x4b\xc4\x4a\xe8\xbc\xd6\xf5\xbe\xe0\xc9\xeb\x7b\x02\xad\x1b\xc1\xfb\xfe\xcb\x28\x26\x0e\x8e\x20\xdb\x4c\x54\x45\x44\x23\xbe\x4d\x70\x00\x1c\xd1\x95\x1f\x4e\x7d\x61\x85\x43\x41\x46\x61\x24\x3f\xd4\xf1\x01\x02\x92\xba\x77\xa7\xa5\x5d\x41\xe3\xf7\xa0\xee\xed\x10\x87\x02\x20\xbd\xc6\x42\x04\x51\x9b\x42\xc1\xf7\x43\x1d\x9a\x47\xb0\x86\x00\xe2\x93\xba\x1d\xad\x0f\xa5\xd8\x43\xfe\xc4\xb1\x21\x4b\x8e\x8d\x5d\x2a\x3e\x7d\x16\x83\x9d\xb2\xb4\x56\x56\xe8\x01\x5b\x48\xf2\x3f\x8a\xc5\x6c\xf4\x14\x4c\xbe\x4c\xe8\xb0\x65\xc1\x35\x43\x70\x87\x20\x2c\x15\x28\xb1\x31\x2c\x07\xb1\x03\xbb\x7a\x0b\xfe\xa3\xef\x2b\x30\x30\xcc\xae\x28\x0e\xe9\x2e\x0c\x78\x53\xf9\x74\x40\xc2\x10\x87\x20\xb1\x46\x69\x1d\xb5\xcb\x13\x82\xd5\xea\x57\x83\xeb\x09\x7c\x5f\x8d\xa9\xae\x7e\x73\xfe\x05\x28\x69\x09\x6b\x6d\xab\xb9\x97\x71\x1f\x70\x54\xf5\x82\xef\x83\xfb\xac\x4c\x88\x77\x10\x4c\xd7\x8a\xfe\xde\x0c\x37\x00\xd9\x04\x17\xd9\x02\x33\x8a\xdc\x5d\xd3\x6c\x8f\x22\xff\xa8\x79\x1b\x80\xe8\x6e\x33\x93\x94\x4d\x8f\x4c\xd1\x5e\x34\xf1\xf6\xa5\x8b\x98\x73\xe4\xef\x32\x7a\xc4\xd6\xb1\x9a\x25\x1d\x0c\xd5\xb0\x85\x40\x21\xae\x8a\x78\x24\x26\x91\xd9\xac\x11\x17\x09\xde\xbf\xbd\x70\x6c\x17\xfb\xe2\x80\x20\x83\x39\xc3\x2e\x10\xc0\xfc\x43\xf8\x3b\xf5\x54\x3c\x87\x2a\x11\x04\x38\x59\x43\x0e\x5b\x62\x80\x04\x06\xf7\x62\x41\x06\xa9\xed\x61\x57\x9c\x66\x6c\xd7\x76\xbb\x8e\xe4\x9e\xe8\x99\x52\x1c\x09\xf2\x60\xa9\x8f\x83\xc8\x16\x1f\x7b\x44\x86\x30\x87\xd8\xf9\x81\x07\x79\xe6\x76\x89\x97\x86\xd8\xf5\x6c\xf1\xb1\x07\x6b\xea\x48\x1c\x62\x21\x56\x73\x48\xe0\xc3\x34\xc8\xaf\x81\x58\xcb\x93\x63\xa9\x2f\x4c\x04\x7e\x3b\x06\xea\x91\x89\x7a\x5d\x00\x02\xb7\xf8\xc8\x89\x9b\xc8\x57\xbf\xb6\x9b\xc8\x57\x53\x72\x2f\x2b\xcf\x25\x30\x07\x98\x41\x20\xa5\x20\x48\xbf\xce\x14\x74\x7a\xb8\x97\x0d\xe8\x12\x8b\x30\x38\xe6\x52\xb1\xb2\x76\xdd\x23\x7f\x57\x70\xc4\xf6\xb1\x1c\x61\x1a\xda\xf4\x0e\x2b\x99\x50\xcc\x40\xe4\x13\x3c\xd7\xd5\x4c\x57\x77\x79\x87\x11\xb1\xc5\x23\x5a\x66\x70\xb5\x6e\x37\x6e\x2f\x43\x5c\x8a\xc4\xcd\x30\x3a\x60\x21\x61\xb5\x32\x48\x63\x65\x28\x0e\x13\xbe\x7d\xe9\x23\x1a\x1c\x09\x62\x4b\x7d\xdb\xc7\x4e\x27\xca\x92\x23\xa8\x8e\x44\x98\x79\x28\x14\x62\x06\x0d\xde\x5e\x08\x09\x1e\x74\x39\x5e\xea\x63\xca\x6c\xf1\x01\x1c\xc5\xc3\x6e\xb7\xbe\x20\x4a\x41\x91\x2b\x9b\xc8\x2e\xb3\x39\xd4\x17\xcc\x6e\x88\xe0\xa3\xda\x7b\x83\xf0\x4e\x78\xab\xc8\x0a\x0c\xfb\xfc\x5a\x3c\x90\xf7\xc7\x7f\x0c\x24\xae\x22\xb3\xdd\x9d\xc8\xef\xa4\x8a\x6a\x87\x37\x83\xd4\xc1\x9b\xb0\x29\x0c\x30\x71\x11\x63\xbb\xc4\xc1\x3e\xdd\xf1\x40\x79\xcb\x64\x28\x44\x12\x29\x6b\x83\xd8\x0c\xe4\x14\xda\x91\x60\x96\xc4\x81\xf7\xf0\xa9\x88\xc6\x91\xa2\x97\xe3\x0b\x41\xcb\x01\x11\xcd\xa9\x0c\xfd\xa5\xc7\x9e\x1f\x57\x81\x3a\xd5\x0b\x1f\x85\x3b\x0c\xbc\xcf\xc1\x36\x95\x31\xd1\xbd\x86\xea\xed\x4b\x12\x61\x27\x42\xe0\x02\x18\x8a\x93\x6e\x58\x1d\x77\x6d\x00\x30\x4c\x1d\x84\xc3\x00\x22\x41\x92\xed\x00\x47\xe2\x70\x1e\x55\xba\x42\x00\x7f\x02\x8e\xcb\x38\x08\x90\x8c\xab\xe3\x53\xf1\x65\x17\x3a\xd9\x61\x0e\x44\x59\x84\x8c\x9c\x34\x84\x4f\x17\xfb\x5e\x0c\x9e\xbf\xf0\x21\x7b\x13\xbb\xac\xa0\x29\x1f\x52\xcd\x84\x36\x26\x21\x66\x91\xf8\xce\xb6\x43\x0c\x91\x4a\x49\x58\x9f\x8d\x14\xd0\x5f\x50\x09\x53\x61\xb4\x8d\x6c\x07\x61\x0a\x51\x7a\x5d\x21\x3c\x0b\x41\xd8\x86\x23\x8c\x4d\xe2\x16\xbb\x87\x9c\x38\xd8\x73\x91\xf6\x51\x25\x36\x66\x90\x21\x37\x95\x86\xc5\xa0\x3f\x17\x23\x25\x61\x0b\x21\x42\x30\x66\x81\x18\xa3\xbf\xc3\x28\x06\xdf\x7b\xc4\x1c\x70\x48\x85\x13\xb4\x03\x9e\x1f\x20\xa5\x4f\x6c\x06\x4e\xd3\xb6\x40\xbd\xcd\x70\x44\xe4\xb7\x00\x47\x71\x73\xc6\x20\x81\x07\x0e\xa3\x14\x87\xbe\x8d\x41\xec\x0f\x83\xd6\xc4\x0b\x2e\x41\x22\x3b\x14\x58\x67\x08\x3e\xea\x03\x43\x88\x82\x38\xc0\x1e\x43\x41\x15\xf2\x5a\xfa\x79\x8a\x07\xea\x43\xed\x9b\x10\x9c\x99\xc0\xa1\x40\x8c\xd2\xd1\x0d\x89\xe9\x43\x2e\x5c\x10\x38\xe0\x76\xe9\x54\xe9\x89\x05\x7f\x22\x82\x93\x31\xdf\x58\x12\x8e\x1d\x22\xb1\x24\x26\x0e\x38\x50\x22\x57\xac\xa1\x08\x12\xe1\xf8\x42\xe8\x04\x4a\x73\xa2\x89\x2b\x97\x4a\x20\xfd\x84\x23\xf9\x25\xc4\xcc\xdb\x6e\xae\x09\xa7\x5a\x2c\xff\x13\x6f\xe2\x4d\xb2\x25\x2e\x92\x9f\x9a\x6c\xc5\x69\xf1\xdc\xa6\x62\xc6\x21\xf4\x6f\x4d\x95\x60\xaf\x4c\xbf\x27\xb2\x14\xf4\xe7\xa3\x10\x57\x21\x7b\xa8\x80\xc3\x0d\xc0\x65\x2d\xdc\x6e\xf3\xc7\xef\x85\x78\xfe\xbc\x61\xaf\xcd\xe9\x6f\x65\xa0\x4b\x67\xd1\x08\x6f\xa8\xcd\xf2\x76\xf4\xbe\xe9\x41\xb4\x7a\xa6\xb4\x14\x8c\xc9\x59\xdc\x61\x30\x1e\xb1\xc7\xe9\x1d\xcf\x93\xdb\xcd\xfd\x67\x71\x3d\x65\xd3\x1d\x37\x8f\x86\xe6\xdb\xc7\xbe\x2d\xf5\xa7\x77\xe2\xa0\xdf\x12\x7d\x7f\xc8\xe4\x0f\x0d\xce\x29\x05\x30\xcf\xe4\x9c\xd4\x3f\xb7\x83\xc5\x1e\x5a\xb6\x87\x29\xf9\xe3\x11\xf4\x1f\xc7\x08\xa0\x19\x1f\x2f\x4d\x93\x59\x91\x14\xbb\xf9\x3c\xf9\x3d\xcf\xca\xb8\x73\x49\x6c\x9e\x17\x08\x26\xca\x51\x31\x04\x1a\xa2\x38\xba\x9f\x97\x7d\x9f\x0f\xe4\x1d\x9a\xee\xf3\x84\x34\x9a\x76\xa1\xad\x3b\xb6\x7d\x4b\x44\x91\xd5\x71\x72\x57\x37\xe1\x3b\xe0\x68\x03\x5e\xbd\x2b\xe3\x6c\x35\x5d\xcb\x17\xf6\x20\xee\xd7\xb6\xb4\x3d\xdc\x34\xb1\x1f\xf1\x79\x99\x4c\x96\x92\xba\xc6\xb4\xab\xa2\x27\xff\x41\x28\x5d\x37\x2d\xa9\x72\xc3\xa4\xbe\x32\x4e\xfe\x58\x94\xbe\x3a\xce\xfe\x40\xa4\xfe\x3c\x49\x4b\x3e\xff\x71\x9e\x6c\x26\x34\x2e\x84\x59\x08\xfd\x94\x22\x72\x44\x1d\x33\xaf\x8b\x63\x43\xb4\xa8\x60\x4f\x48\x4f\xb0\x4f\x51\x0f\x07\x51\x0a\xc1\xbb\x90\x8f\xbd\x56\x51\x51\x32\x42\x34\xd4\x4d\xf9\xe1\x1e\x0d\xe0\x9a\x5e\xec\x5b\x2e\x5c\xf1\x6b\x21\x0c\x02\xd6\x1e\x11\x6a\x2a\xb2\x6d\xb2\xdb\xc8\xd8\x82\xc8\x15\x44\x0c\x6e\x54\xc4\x2e\x45\x04\x52\xec\x8a\x0e\x36\x24\x87\x8b\x5d\xf6\x4a\x1c\xc5\x63\xec\x55\x9e\xca\x98\x78\x98\x79\x69\x20\x36\xdb\x40\x1c\x99\x70\x9d\xd8\x4b\xbe\x93\x69\x04\xcc\x2a\x10\xfd\x36\x65\xe2\xd4\x47\xb0\x4b\x1a\xef\x02\x6a\x8b\x97\x8e\x38\x33\x89\x5a\x2e\xf6\xdc\xaa\xb9\xd0\x96\x7d\x11\x71\xf8\xa3\x5e\x0b\x0e\xf1\xf2\x88\x74\x93\xc8\xd4\xa4\xb0\xc1\x3c\x03\xff\x3b\x08\x62\xb5\x78\xa9\xdf\x26\x68\xf4\x66\x42\x31\x7f\x35\xb8\xe8\x1f\x7b\x11\x1d\x5d\x3c\xbd\x3c\x6b\xaf\x9c\x39\x9f\x94\x83\x8f\xc9\xb4\x3c\x1f\x5b\xcc\xb7\x06\xe7\x3c\x39\x3b\x2f\xe5\xf7\xb9\x60\xf6\xd6\xe0\x34\x49\xd3\xb1\xf5\xff\x3b\x85\xff\x59\x83\x7c\x16\x4f\x92\xf2\x7a\x6c\x89\x43\x91\x35\x28\xca\xeb\x94\x8f\xad\xa4\xc8\x53\xc8\x4a\xb3\x25\xbf\x71\xeb\x6f\xff\x30\x2e\x3f\x70\x10\x21\xe2\xe2\x90\xc5\x10\x24\x11\x3e\x14\xb1\x63\x37\xb0\x65\xf8\xb8\xe6\x0b\x31\x60\x22\xad\x67\xdd\x00\x79\xd8\x9d\x60\x16\xe1\xd0\x83\xf0\x94\xe2\x88\x03\xa6\x09\x98\x46\x07\x01\xa2\x10\xe3\x2f\x82\x13\x88\x9f\x52\x4c\x02\x48\x76\x11\x63\xc6\xa4\x79\x82\x74\x32\x21\x36\xa6\x98\x89\xc9\xa8\x1e\xc1\xcc\xb8\x10\x2d\x18\x4e\x7a\xf5\x41\x0f\x8e\x34\x32\x8b\x0c\x09\xe4\x47\xf5\x22\x90\x49\xa6\x02\x48\x0e\xd7\xa8\x07\x01\x95\xe0\x88\x58\xe9\xce\xaa\x1c\x34\x98\x00\xe8\x57\x4c\x80\x66\xb6\x2a\x23\xc4\x33\x8a\x9c\x7b\xb7\x09\xc7\x27\xbf\x6e\x93\x88\x36\x7d\x1c\xfa\x31\xc5\x3e\x04\x62\xad\x4d\x97\x83\xd0\xa6\xd2\xee\x5e\x9c\x33\x6b\x1b\x0f\x40\x38\xc1\x8e\x87\x28\x0e\xd4\x87\x7e\xc3\x42\x5b\xbc\xd9\x66\x38\x62\x08\x3e\x14\x52\x20\x9b\x38\xa5\x31\xc5\x21\x45\xb4\x4e\x55\x4a\x65\xec\x3f\x07\x22\x4b\x42\x68\x49\x8d\xe0\x00\x43\x5e\xff\x30\xda\xf3\x20\xbf\x69\x84\x7d\x96\xda\xd4\x76\x71\xd8\x26\xba\x06\x2d\x81\x3d\x1e\x11\xc7\x48\x98\xa0\x4a\xa7\xc9\x08\x24\xe0\x86\x4b\x03\x31\xa8\x40\x3a\x1f\x89\x3e\x1c\x2f\x56\x98\xd2\x17\x07\xb6\x0c\x04\x19\x06\xe7\x36\x18\xd8\x53\x48\x77\x5e\xbf\xc2\x61\x50\x37\x44\xe4\x3d\x04\xc4\x98\x6c\x91\x89\x78\x43\x6c\xb0\x11\x87\xd0\x87\xe2\xa3\x7a\x21\x1a\x55\x81\x2b\x1b\xe6\xfb\x04\x7b\x6e\x4a\x91\x87\xc5\x94\x51\xa0\xe2\x9a\xb8\x20\x01\x34\x01\x83\x43\xd3\xde\x90\xda\x38\x62\xa9\xf8\xcb\xa4\x95\x36\x45\xe2\x8b\x68\x40\xc0\x43\x6b\xb2\xa5\x3e\x8e\xd8\x76\xbb\x61\x46\xc5\xea\xf0\xf6\x18\x20\x3d\x10\x0b\x31\x00\x4d\x6f\xa5\x8c\x72\x42\x1b\xbb\x02\xad\x00\x72\xa5\xa4\xd2\xf8\x7e\xdb\x9d\x94\x66\x3a\x03\x1e\xcf\x27\xe7\x1b\xd9\x99\x7d\xb1\x68\xc5\xac\x6d\x13\x07\xb8\x23\x7c\x4a\xde\x0e\x01\x54\x21\x29\xae\xf8\xbf\x5a\x05\x55\x85\x0b\x20\x38\x2f\x16\xab\x44\x99\x55\x20\xf9\x5d\x3f\x81\xa9\x61\x36\xd9\xa4\xfd\x30\xf3\x10\x63\x98\x46\xa9\x1d\x60\x16\xd8\x01\x76\xc5\x6a\x75\xa9\xbc\x01\x15\xcf\x04\xb1\xeb\x68\xe3\xb0\x95\xa9\x1a\x5d\x26\x9d\xf0\x8f\x3b\x79\x7a\x79\x91\x6d\x26\x78\x23\x41\xde\xae\x67\x5e\xb0\xf7\xba\x26\xb7\xa2\x2d\x1c\x05\x66\x0d\x82\xbc\xb7\x2f\x09\x43\x34\xda\xf5\x8e\x82\xf3\xf0\xed\x05\x71\x90\xb3\x4b\xe4\x8f\xf6\x00\x20\x04\xcb\x0f\xf9\xe5\xc9\xa6\x02\xb1\xc8\xac\x83\x66\xce\xb9\x40\xf0\xf1\x68\x0f\x2e\x02\x43\x86\x02\x70\xd9\x88\xb0\x21\x53\x91\x66\x1a\x44\x08\xc8\x1c\x80\xcd\x79\x40\xcc\xe4\x31\xaa\xf1\x4d\x66\xb9\x88\x20\x2a\xdb\x02\x78\x49\x54\x01\xcc\x9c\x25\x00\xcb\xa8\xd0\x01\x68\x04\xdb\x10\x43\xf3\xdd\x24\x5c\x71\xca\xb3\x69\xbc\x99\x00\x32\xe0\xd5\xe2\xef\xd2\xe8\x28\x3c\x67\xd2\x24\x26\xdc\x0d\x8e\xfc\x5d\x06\x61\x4a\x65\x76\xc0\x2a\x0a\xaa\xd8\x7b\x43\x72\x24\x06\x14\x75\x5e\x4a\x6b\x1f\x7a\x4e\x43\xdc\xad\xc9\x20\x94\x39\x89\x8e\x02\xb0\xb6\x6a\xbf\x95\x60\x2c\x98\x1c\x10\x5c\xd6\x98\x9c\xdf\xc6\x56\x68\x0d\xc4\x71\xdc\xb5\xb4\xc0\x43\x6b\x79\xa7\x6b\x81\xb6\x7e\x2f\x0c\x7a\x11\xed\x7f\xd1\x6e\x5c\xe8\x86\x3a\x5f\xb8\x1b\x4f\x76\xe3\x7f\xe1\x6e\x7c\x73\x6a\xa2\x2f\xd5\x4b\xd0\x98\x9a\x2f\xd6\x4d\xd8\x98\x9a\x2f\xd6\x4d\xd4\x98\x9a\x2f\xd6\x0d\x71\x8c\xb9\xa1\x5f\x8c\x02\x08\x31\x27\xe7\x0b\xf6\x43\xcd\xd9\xf9\x82\xfd\x30\x73\x7a\xd6\xea\x67\x3d\x6e\xed\x2a\x71\xc9\x81\x0c\x00\x0d\x6f\x0b\x66\xd8\xae\x46\x88\x1d\x99\xa9\x7f\xa1\xfc\x26\xb6\x3c\x71\xfc\x93\x57\x40\x3d\x00\x18\xfa\x0c\x71\xae\x31\x01\x80\xf2\x9b\x60\xeb\x44\x32\x0f\x81\x70\xa9\x8f\x54\x88\x16\x84\x7b\x57\x4c\xaf\x13\x15\xa3\x61\x34\xfa\x65\x77\xc8\xdb\x6c\x48\xd7\x43\xe6\x8a\x2a\xe7\x0d\xef\x99\x2b\xea\x9e\x37\xbd\x87\xae\xa4\x89\xde\xfc\x9e\xba\xac\x5b\xaf\xd9\xed\x26\xf7\xd8\x65\xdd\xfa\x7d\x53\xbb\x91\xed\x63\x59\xaf\x41\xef\xd4\x7e\xf1\x6e\xc3\xde\xa9\xfd\xe2\xdd\x46\xbd\x53\xfb\xc5\xbb\x25\x4e\xcf\xdc\x6e\x66\x8f\x5b\xda\x2d\xe9\x9b\xdc\xaf\xd0\x2f\xed\x9b\xdd\xaf\xd0\x2f\xeb\x9b\xde\xcd\xec\xf1\x4b\xfb\x75\x5b\x1e\x6c\x5f\x63\xcf\x5f\x0a\x90\xd7\xb2\x72\x02\x17\xb2\x5d\xc2\x8e\xc2\xf3\x08\x07\xe1\x02\x0f\xd7\x0d\xbb\x7a\xfa\xdf\x85\x9d\xa5\x11\xcd\x84\x7d\x1d\x61\xc0\xc3\x6c\xd1\x0d\xd0\x12\xb2\x5e\x31\x62\xff\xc6\x77\xfd\x95\xa2\xeb\x7f\x89\x7d\x7f\x49\xc7\x6e\xef\x80\x37\xc4\xa6\x97\xf4\xeb\xf5\x0f\xf8\xcb\x77\xec\x37\x3b\xde\xf0\x7e\xb8\xa4\xe3\xa0\xd5\xf1\x66\x77\xc4\x25\x1d\x87\x7d\x53\xbc\xa9\x2d\x62\x49\xbf\x51\xef\x14\x7f\x85\x8e\x85\x0c\xd0\x33\xc7\x5f\xa3\x67\xd2\x3b\xc9\x9b\xda\x17\x97\xf5\x4c\x5b\xcc\xf8\xce\x3b\xe3\xdf\x67\x79\x7a\x7d\x96\x67\x83\x59\x9e\x64\x65\x31\xb6\x28\xc1\x34\x1a\xf8\x03\xc2\xe4\x47\x28\xf3\x6b\x8a\xbf\xf2\xcd\x46\xc7\xb1\x28\x8a\xfd\x1f\xd9\xec\x5b\x69\x70\xcf\x6d\xf7\x28\x8a\x29\xa6\x88\x62\x9d\x85\x1b\x7c\xbb\x8f\xfc\x5d\x42\x31\x3d\x8a\xb6\xeb\x97\xd2\x8b\x35\x44\xd1\x91\xa8\xf7\xd5\x95\xcd\x82\x7e\xa8\xbf\x1b\x1e\x51\xf7\x9c\xbe\xbd\x70\x6c\x6f\x37\x3c\x22\x91\xf1\x1d\x9e\xfb\x88\x38\xbb\xc4\x35\x4a\x11\xd7\x28\x26\x7e\xd4\xe5\xa8\x63\x94\xa3\x8e\x51\x4e\xfc\x30\xca\xf9\x66\x39\xdf\x2c\xe7\xcb\x72\x1b\x0a\xba\xf0\x45\x85\xc7\x05\x7d\xb3\xcd\xeb\x8a\xee\x6b\x99\xff\x15\xf0\xb0\x7a\xec\x87\xfe\xf8\xc3\x4a\xaa\xfe\xfa\x8b\x64\x81\xbe\x49\x3b\x97\xfe\x01\x57\xc9\x97\x8e\x08\xf1\xd5\x02\x25\xf6\x46\x18\x87\x2d\xe9\x1b\x91\x0a\x9c\x46\xbe\x1e\x49\xf8\xc8\xeb\x27\x82\xcd\xbb\x3b\x7c\x45\x3e\xb1\x76\x7a\x9b\xef\xc4\xf9\xe2\x8a\x67\xe5\x86\x8c\x3e\x48\x20\x2d\x32\x55\xd8\x18\xea\x60\xaf\xe5\x4d\xae\x2e\xc8\x65\x51\x96\x86\xd8\x77\xed\x10\xac\x60\x9a\x4e\xe7\x64\xb3\x97\xfa\x7f\x88\x0b\xf1\xb5\x06\xc6\xbe\xf1\xd5\x91\xfb\x8d\x6f\x8e\xbc\x6f\x7a\x71\x54\xd3\x77\xea\x61\xe6\x23\xf1\xb1\x47\x7d\x4c\xc1\x88\xae\x13\xf5\xa4\x45\xf5\x36\xc3\x91\x0b\x1f\xed\xe8\x28\x77\x21\xfb\x35\x02\xfe\x7d\x73\xa5\x23\xfb\x83\xdd\xbf\xdd\x69\x90\xee\x77\xa0\x58\xf5\xbe\x0b\xbd\xea\x57\xa2\xb7\x15\xd5\xa2\xeb\x2d\x5c\x84\x29\xb3\xb1\x4b\x76\x29\xc3\xe1\x7d\xd7\xae\x52\x4c\xdc\x4b\xbb\xfa\x4d\xb4\x1a\xee\xf7\xac\x29\xbf\xdb\x90\xbc\xef\x4d\x1c\xdb\x84\xa7\xc5\xb7\x50\x08\xd0\xaf\xa6\x10\x58\xa8\x8c\x58\xa0\x9f\x72\xbe\x67\xfd\x14\xf5\x70\xe4\x22\xe2\x63\x2f\x4c\xed\x48\x86\xb0\xf0\x83\x3d\x02\x6c\x29\x12\x00\x31\x41\x36\xac\x0a\x5e\x4f\x71\x84\x48\x94\x32\xcc\xc4\xc1\x91\x85\x7b\x32\x94\xad\xef\xc7\x66\x51\x19\x52\x2e\x62\xf0\xf1\xc5\xe2\xfe\x7f\xdb\x93\x54\x9b\x9b\x9b\x87\x6b\x1f\x33\x81\x0f\xf0\xf8\xd0\x51\x17\x24\x7a\xc8\x1d\xf1\x8c\x02\x3b\x38\xb7\xc9\xf7\x7b\x62\xff\x1f\x7b\x40\xfd\x53\x55\xf8\x1d\xa9\x0a\x2f\x6c\x57\x4c\x1b\xc3\x4e\xf8\x95\xd9\xd5\x57\x0d\x01\xfb\xec\x7a\x49\x00\x58\x86\x7d\x8a\x48\x80\x3d\x36\xb1\x99\x0a\x6e\xc6\xec\x08\xd3\xd0\x26\x8e\x2d\x24\x47\x6a\x13\xe7\xc0\x03\xfe\x43\x30\x43\xaa\xf4\x1e\xc1\x01\x45\x24\x4c\x31\xf5\xb1\x1b\x4e\x98\x0a\xb8\xc4\x50\x04\x0b\x00\xd2\x66\x86\x14\x11\xa7\x20\x14\xbb\xbe\xcd\xa0\xbc\x6a\x2f\x85\x5c\x29\x6e\xf8\xf6\x25\x11\x04\x20\x9a\x60\x3b\x84\x82\x24\x2a\xbe\x23\x21\x91\x0a\x1e\xe4\x22\x12\x4e\x20\x68\x49\x84\x42\x4c\x02\x3b\x14\x6f\x09\xc3\x21\x7c\x3b\x10\xd3\xef\x8a\x99\x09\x28\xe4\x34\x8e\x10\x09\x77\xe4\x43\xd9\x00\x65\xd8\xa5\xaa\xd1\xba\xaf\x0d\x85\xa8\x25\x21\x38\x06\x12\x4c\x82\x6d\x1f\x87\x3e\x82\x0f\xe5\xe0\xe6\xc9\x58\xeb\xf5\x53\xa0\xa2\xba\xc6\xdb\x0b\x08\xa4\x1a\xd0\x6d\x57\xbc\x77\x75\x55\x82\x04\xcb\x09\xc5\x83\x40\x7e\x28\xf2\x83\xaa\x94\xe2\x30\xda\x50\xf8\xda\x3f\x27\x7f\xb9\x00\xba\x3c\xac\x01\x76\xaa\x10\x1e\xd8\x61\xb0\xf4\xc4\x44\xaf\x9a\x5c\xbe\xbb\x48\x77\x93\xe9\xe2\x85\x4a\x3d\x4c\x22\xc1\x98\xdc\x6d\x5f\x30\x3a\xdf\xe0\x93\x10\x95\x07\x82\xa0\x35\x88\xcd\x16\x5f\x6d\xf5\x30\x88\xe4\x87\x92\x5c\x31\x0b\xb0\xcb\xc0\x9f\x87\x61\xca\x62\xd8\xc8\x5c\xdd\x26\x41\x38\x70\x6d\xec\xf8\xdb\x6d\x22\xa4\x4c\xf5\xe5\x8a\xc6\x5c\xdd\x22\x11\x85\x21\x15\xcb\x46\xd6\x15\x73\xc1\x8b\xf6\x36\xc2\x8c\x89\x0f\x54\xe6\xd7\x2e\x9d\x1e\xa6\x2e\x0e\xbd\x3d\xe2\xe2\xd0\x85\x7d\x51\x6e\xd1\xc6\xd0\x18\xf6\xc5\xf1\x37\x98\x78\x32\xbc\x37\x71\x64\xd4\x5f\xe2\x02\x69\x21\x41\x5a\x31\x09\x20\xba\x65\xa0\xfd\x4b\x85\xd4\xcd\x02\xe4\x61\x92\x6a\xef\x39\x1a\x93\x08\xd8\x7c\x54\xbb\x9a\x7a\xb6\x5f\x51\xf7\x66\xd6\x28\xe0\xde\xc3\x41\x98\xba\xd8\x15\x5c\xc2\xf5\x45\xbf\x1e\x38\xa5\x7a\xb4\x9a\x69\x3f\x42\x01\xa6\xd1\x1e\x15\x9b\xd3\x2a\x2b\x53\x20\x4f\x40\xef\xd7\xd0\x83\x87\x20\xc1\x7e\x94\x7a\x48\x88\x2c\x81\x67\x13\xec\xd9\xd4\xb7\xa9\xff\xf6\x02\xe2\x7d\xc2\x87\x8f\x7d\xf9\x11\xbb\x38\x24\xc8\xd5\x81\xd4\x89\x4d\xb1\xa7\x18\x5a\x93\x75\x31\xb1\x73\x86\xa8\x55\x1c\x36\x4f\xe0\x0b\x1e\x7b\x7b\x61\x13\xec\x7a\xf0\x11\x83\xc8\x04\x1f\x4a\x84\xc1\x9e\x07\x1f\xa9\x0a\x29\x2d\xa6\x35\x82\xfa\x91\xee\x5a\x6a\xe7\x31\x9d\xd8\x72\x5e\x6d\x98\x57\x5b\xcc\xab\x5d\xb1\x0c\x31\xaf\x92\xb2\xea\xc8\xa3\x98\x50\xdb\xc7\xeb\x6c\x09\x4b\x63\x67\x87\x10\xa5\x50\x6d\x09\x8d\x55\x27\x5d\x43\xb1\x9f\xaa\x8c\x1c\x7d\x0b\x59\xb2\xfe\x9e\x5d\x43\x37\xba\x89\x70\xbf\xff\x03\x57\xd7\x12\x36\xfb\xfd\xaf\xac\x10\x33\x14\x62\xf6\x5d\x90\xfd\x42\xad\x44\xdb\xa5\xba\xe4\xb3\xe7\xf9\xfc\x63\x3c\x9f\xd2\x85\x9b\x56\x80\x1d\x41\xcc\x1e\xed\xa4\x89\x83\xfc\x35\x7b\xc4\xc7\x1e\x04\xc0\x08\x30\xa1\x10\x97\x33\x8c\x09\x06\xd7\xef\xaa\x14\xf3\x21\xd5\xcd\xb9\x23\x4e\xa5\x10\x65\x23\xc2\x6e\x08\x31\x36\xb7\x05\x46\x11\xa9\xe2\x06\xa0\xaa\xbf\xb5\xf6\xa1\x81\xe9\xc2\x2f\x26\x37\x42\x5e\x13\x0c\x5b\xfd\x3a\xa2\x11\x9c\xc5\x4d\x08\x99\xd4\xc6\x60\x01\x4d\x03\x72\xd9\xd0\x5a\xdb\x40\x3b\xcc\xd0\xf6\x7c\x9e\x7f\x5c\x2c\x12\x04\xd8\xf7\x05\xd5\xf9\x32\xad\x8f\xa0\x21\x57\xfe\x36\xdc\xb9\x65\x98\xe6\x60\x8f\x88\xe3\x4d\x08\xc9\x6e\x2a\x0d\x2f\xc8\xa9\xc8\x39\x12\x2f\x40\x57\x2c\x4a\x9a\x47\x49\x75\xc3\xb3\x1e\x3e\xf5\x20\xf2\x39\x87\x51\x14\xe3\x4f\xd6\x65\xf6\x21\xcb\x3f\x66\x76\x51\xc6\xe5\x65\x61\x6d\xd5\x63\xfc\x59\xbe\x39\x80\x17\xe8\x3c\xbf\xe0\xc6\xcb\xdd\xfc\x82\xa3\x49\x7e\x66\x3c\xda\xc9\xcf\xd0\xe4\x9c\x4f\x3e\x98\xcf\xc4\x6f\x54\x26\x17\xbc\x30\x9e\x1e\x8a\xdf\xc8\xe2\xbf\x4d\xd2\xf8\x02\x02\x80\xd8\xe5\x3c\x89\xb3\xb3\x94\x9b\x00\x3c\xab\xdf\x1f\xaa\xd7\xcd\x4a\x52\xea\x5b\x50\x45\x06\xfd\x41\x16\x80\xd4\x53\x14\x40\xd3\x85\x92\xec\x34\xef\x29\xf3\x22\x3b\xcd\x1b\x45\x8a\x32\xce\xa6\xf1\x7c\xda\x2e\x74\xa0\x9e\x23\xab\xb8\x9c\x4c\x78\x51\xf4\x96\x3c\x90\xef\xea\xc2\x7c\x3e\xcf\xe7\xbd\x45\x9f\x89\x37\x75\xc1\x8f\xf1\x3c\x4b\xb2\xb3\xde\xa2\xbf\xc8\x77\x75\xe1\x73\x9e\xce\x6c\x01\xae\x59\x6a\x97\xa7\x33\x01\x29\x3a\x89\xe7\xe6\x5c\x3c\x8d\xe7\x05\xba\x2c\xf8\xdc\x9c\xf9\x82\xcf\x11\xe0\x7b\xab\xe5\xa3\x8f\x4e\x21\x95\xf7\x56\x3b\xb7\x37\xb2\xe4\x0b\x3b\x9f\xf1\xcc\xea\xbc\xde\x9f\xf1\x0c\x9d\xf0\x34\xdd\x6a\x26\xe6\x43\xc9\x45\x7c\x66\x76\x02\x49\x51\xd0\x24\xcd\x2f\xa7\x5b\xad\x68\xea\xc8\xe2\x2a\x8c\x9d\x7d\x5e\x05\x6d\x6c\xa0\xac\x13\xd2\xd1\xa8\x72\xa5\x42\xdf\xf5\x55\xd0\x61\xf1\x90\x75\x0a\x21\xa3\xec\xb3\x79\xd2\xc0\x70\x1d\x49\xaa\x51\xa4\x87\x60\xda\x31\xa7\x90\x75\x75\x61\x9f\x5c\x9e\x99\x65\x20\xa4\x0e\x2a\x20\xf2\xc5\x56\x3b\x14\x06\xb2\xae\x12\xfe\xd1\x9e\xc8\x68\x0e\x8d\x6a\x75\x90\x07\x64\xc1\xe4\xd8\x53\x88\x98\x60\xb5\x27\x49\x06\x52\x40\x13\xe5\xdd\xbf\xd5\x75\xf8\x47\xfc\x8a\x67\xe5\x56\xcb\x22\x03\xf1\x6b\x73\x2e\x9e\x5d\x8b\xe5\x76\xcd\xed\xf3\x64\xda\x5c\x64\xf2\x44\x84\xac\xa2\xe4\x33\xfb\x54\xee\x35\x36\x6d\x50\xba\xb1\x09\xa1\x58\x30\xcb\xad\x16\xf3\xbc\x41\xfb\x27\xff\xe1\x93\xf2\xff\x63\xef\x4f\x78\x1b\x39\x96\x04\x71\xfc\xab\xf0\xf1\x0f\x78\x5a\x78\x59\xd1\x15\x91\x77\x7b\x34\x0b\x5a\x3b\xb3\x5c\x80\x8d\x67\xac\xdf\x5f\x8b\x69\xc3\x18\xd0\x14\xbb\xc5\x7d\x14\x29\x90\x94\xec\x1e\xbf\xfe\xee\x3f\x44\x64\xd6\x45\x52\x12\x75\xf4\xe5\x96\xdd\x2a\x56\x55\x66\xe5\x19\x67\x66\x64\x04\x9c\x4d\xdf\xce\x16\xd3\x1f\x57\xcb\xcb\xe9\x6a\xf3\xfe\x45\x9b\x3c\xa9\xfe\xf9\xf2\x6a\x3d\xed\xab\x15\x9c\x4d\xd7\x93\xd5\xec\x72\xb3\x5c\x9d\x2c\x17\x6f\x67\xef\x3a\xf9\x80\x89\xd3\xd1\xd1\x41\x25\xae\xa7\x9b\xcd\x6c\xf1\x6e\x7d\x77\xa1\x93\xe5\xbb\x43\xcb\x4c\x78\x7d\x40\x91\x4c\x73\x0e\x2c\x74\x32\x5f\x1e\xd2\x75\xa1\xad\x07\x16\x99\xa9\xc8\x9d\x85\xfe\xbc\x9f\x34\xff\x72\x60\x35\x42\xd5\xee\x59\x49\x46\xa5\x43\xab\x10\xea\x76\x77\x0d\x6d\xb2\x7e\x68\xd1\x17\xd3\xc5\xd5\xdd\xc3\xce\x54\xf4\xc0\x02\xc7\xd7\xe3\xcd\xf8\xee\xf1\x00\x26\xc2\x87\xc2\xc6\x78\x35\xdd\xdc\x5d\xa2\x4c\xdb\x81\x45\x9e\xcd\x56\xd3\xc9\x66\xb9\x7a\x7f\x77\xb1\x89\xd4\x1f\x58\xee\x62\xb9\x99\xbd\x9d\x4d\x64\x96\x0f\x18\xd6\xe9\x7c\x7e\xe8\x18\x2c\xe7\xf3\xf1\xe5\x01\x28\xf2\x73\x97\x5a\xfe\x72\x74\xf4\x41\xf5\xe1\xe5\xe5\x6a\xc9\x95\xac\x5f\xce\x26\xcb\xc5\xfa\xe5\x7a\x35\x79\x79\xb5\x99\xcd\xd7\x2f\x9b\xc2\x8a\x89\x94\x06\x9b\x75\xff\xd5\xdb\xab\xc5\x84\xfb\xf0\x62\xaa\x36\x6a\x71\xf4\x47\xff\x6a\x3d\xed\xad\x37\xab\xd9\x64\xd3\xff\xfe\x86\xf6\xaa\xfe\x7f\xfd\xd7\x74\xfd\x7a\x79\x76\x35\x9f\xf6\xd5\x1f\xd7\xe3\xf9\xd5\xf4\xd5\x5f\xca\x0f\x2c\x84\x6d\x37\xf9\xf8\x7a\x39\x3b\xeb\x95\xfb\x52\x9a\xaa\x8f\xfe\x58\x4d\x37\x57\xab\xc5\x1f\xd3\xc5\xd5\xc5\x74\x35\xfe\x75\xce\xe5\xa9\xdf\x56\xb3\x4d\x75\x9f\x9a\x7c\x55\xa7\xa5\x4a\xa7\x1f\x3e\xdc\xde\xe9\x35\x0f\x55\xb1\x99\x5e\x5c\xce\xc7\x9b\x69\xb1\xfc\x75\x3d\x5d\x5d\x4f\x57\x1f\xa5\xeb\x49\x06\xcc\x55\xfd\x2d\xd7\x74\xbc\x81\xc9\xf9\x78\xf1\x6e\x3a\x1c\x2f\xce\xe6\xd3\xd5\xc9\x78\x3e\xff\x75\x3c\xf9\xc7\xba\x19\x98\x1b\xd2\xff\xf8\xf0\xfd\xf5\x78\xd5\x5b\x35\xe3\x74\xf4\x47\x75\xdb\x9b\xbe\x38\xfa\x63\x73\x3e\x5b\xc3\xa4\xce\x7f\x53\x41\x1f\xd2\xd8\xf6\xf6\xf7\x48\x24\x40\x16\xbf\x26\xdc\x9f\x77\xd3\xcd\xab\x56\x75\xf9\xcb\x29\xac\x67\x0c\x6a\xff\x3b\x67\xfc\xe7\x3f\x5f\x6c\xbf\x3a\x5e\x4c\x7f\xeb\x4d\x8f\xd4\xf6\xfb\x0f\xaa\x3d\xa5\xb8\x3d\x8d\x1f\xf8\x8b\xcb\xd5\x72\xb3\xdc\xbc\xbf\x9c\xc2\xfa\xea\x57\x86\x91\x5f\xa7\x7f\x5f\x1e\xb7\x67\xe7\xe8\x0f\x1e\x89\xc5\x31\xf7\xf8\xfb\xdc\xa8\x6e\xef\x7f\x9e\xfe\xf2\x3f\x0a\x3c\x3e\x3e\xde\x79\x0d\xb3\xc5\xd9\xf4\xf7\xbf\xbd\x7d\xb1\x39\xfa\xee\xbb\xdd\xd4\xcb\xab\xf5\xf9\x8b\xcd\xd1\xab\x9d\x94\xe3\x9f\x37\xbf\xa8\xd6\x58\xa4\xb9\x58\xdc\x54\xf6\xf7\x5b\x29\xeb\xcb\xf9\x6c\x32\x7d\xb1\x52\x78\xa4\xca\xe3\xe3\xed\x0f\xe7\xd3\xc5\xbb\xcd\xf9\x77\xdf\x9d\x4d\xe7\xd3\xcd\xb4\xd7\x4d\xfd\xf0\xa1\x33\x2a\xd3\x8b\xd9\xe6\x44\xa6\x76\xbd\x35\x2a\x3b\x8d\xde\xd7\xc3\x8b\xf1\xe5\x8b\x36\xaa\x4d\x5f\x6c\x8e\x3e\x1c\x7d\x50\xd3\x0f\x2f\x8e\xbe\xbf\x09\x6a\x57\x77\xa0\xd5\xf5\xbb\x62\x33\x7e\x57\xbc\x9b\x2e\xa6\xab\xf1\x66\xf9\x71\x10\xaa\xd1\x42\x5b\xc8\xd2\xbc\x6b\x77\x8a\x67\x67\x73\xdc\xef\x7f\x5f\x83\x6c\x35\x35\xfd\x7a\xc3\xf0\xe8\xdf\x0a\xfc\xee\xbb\x17\x9b\xbf\x1e\xf7\x27\xe3\x45\x7a\xdb\xeb\x33\x04\xb6\xf2\x56\x9b\xe2\x5b\x99\xe5\xf5\x56\xe6\xd6\x9a\x45\x3b\xfb\xf9\x78\x9d\x17\x35\xfa\x47\xea\xc5\xe6\x7f\xfc\xcb\xbf\xae\xaf\xdf\xf5\xae\xa7\xab\xf5\x6c\xb9\x38\xee\x27\xff\xe2\x49\xb7\xfd\x97\xbf\x6e\xfe\xfa\x2f\xfd\x1e\x8b\xc6\x3f\x2c\x7f\x3f\xee\x97\xbd\xb2\xa7\x5d\x4f\xbb\x7e\xef\x72\x35\x95\xa9\x18\xac\x2f\xa7\x93\xcd\xff\x61\x3e\x73\xdc\xff\xfd\xf5\xec\xec\x3f\x5f\xcf\xce\x7a\x17\xd3\xe9\xa6\x9f\xd6\x99\x7e\xbf\x98\x2f\xd6\xc7\xfd\xf3\xcd\xe6\xf2\xd5\xcb\x97\xbf\xfd\xf6\x1b\xfc\xa6\x61\xb9\x7a\xf7\x92\xca\xb2\xe4\x89\xea\xa7\x2c\xaf\x7e\x9f\xcf\x16\xff\xd8\x97\x11\x63\x8c\x2f\x25\xb5\xdf\x7b\xbb\x9c\x5c\xad\x19\x39\x8f\xfb\x6f\xc7\xf3\xf5\xb4\xdf\x5b\x2d\xc5\xa5\xe5\xc5\xbb\xfe\xbf\xfd\xcb\xab\x7d\x7d\xf9\x6a\x5a\x7f\xf4\xd7\xe9\x5f\xfb\xff\xca\x85\xfe\x5b\xff\xc3\x07\x46\x01\x6d\xa2\xb1\xaf\x3a\xc8\x01\xd3\xdf\x2f\x97\xab\xcd\x7a\x0f\x74\xfd\xf1\xe1\xfb\x9a\xfe\x2e\x5e\xac\x8e\xfe\x98\xbd\x7d\xb1\xf9\x79\xf5\xcb\x51\x45\x91\x7e\x5e\xfd\x52\x7d\x2e\xa4\x7b\x76\xcc\xaf\x8e\xff\x98\xbd\x5a\xa9\x39\x53\xbf\x9c\xf8\xea\x8f\x0f\x1f\x6a\x40\xe5\x8f\x18\x5f\x5f\xcc\xaa\x6f\xd5\x4c\x35\xf7\x8b\x23\x35\x83\xf9\xf1\x5f\xca\xe6\x5d\x45\xd0\x17\x70\x71\x3c\x55\x0b\x98\x1c\x6f\xd4\x02\xce\x3a\xb4\x41\xad\x8e\xfe\x58\xc0\x52\xc8\xc4\x3f\xff\x79\x13\xe9\xdf\xa8\x2d\x8e\xcb\xf4\x7f\xc5\x23\xb3\x80\x55\x67\x04\xfa\x57\x8b\xf4\xf5\x59\xff\x2f\xc7\x4c\x95\x96\x6f\x7b\x3f\xbd\xbf\xf8\x75\x39\xff\xee\xbb\xf4\x0b\x9b\xe5\x4f\x9b\xd5\x6c\xf1\xee\xef\xe3\x77\xdf\x7d\x77\x53\x8d\xbb\x79\x2b\x9c\xef\x67\x1a\xf0\xe1\x26\x31\x69\x7a\x23\xa9\xe0\xe6\x6e\xb6\x48\xe3\xec\xed\x0b\xfc\x6e\xf3\xdd\x77\x2f\xa6\xc7\xdc\x81\x23\x15\xbe\xdb\xfc\xf3\x9f\x86\x5f\xf5\x97\x52\x7e\xff\xb8\xea\xc8\xf4\xbb\xef\xf8\x1f\x34\xc5\x57\x53\x3a\xcd\x2c\x38\xb7\x68\xb2\x9a\x8e\x37\xd3\x17\x8b\xab\xf9\xfc\xe8\xfb\xd9\xdb\x17\x0b\x58\xbd\x58\xdd\xd4\xde\x95\xea\x9f\x4d\xdf\x8e\xaf\xe6\x9b\xfe\xf6\x30\x57\xc2\xcb\x91\x22\x69\xd0\x5a\x06\xa3\x19\xd9\xe9\xd1\xdb\xe5\xea\x85\x80\x50\x6f\xb6\xe8\x4d\x8f\x16\x70\xf6\x62\xa5\x66\xaa\x21\xe4\x9b\x86\x3b\xff\xbc\xf9\xe5\xc3\x11\xfc\x3a\x5b\x9c\x49\xcb\xd4\xec\xe8\xa8\x82\xae\x15\x0f\xcd\x62\x0f\x2c\x6f\xf5\xf7\x7f\xec\x63\xfa\xb9\xf5\x1f\xf6\x49\x04\x35\xfc\x72\xcb\x36\xaa\x3f\xee\xab\xcd\x91\xda\x70\x75\xdb\xac\xbb\x2b\x7e\x34\x6c\xed\x7c\xbc\xfe\xdb\x6f\x8b\x6a\xb8\x12\x0e\xf0\x07\x5c\xc6\xe5\x71\xbf\xaf\x16\x2f\x16\xb0\x3e\xde\xcf\x86\x44\xae\x5b\xbf\x1c\xcf\xe7\xc5\x3a\x2b\x8c\xeb\xfe\xd1\x87\x17\x7f\xdc\x23\xfb\x93\xf3\xab\xc1\x7c\x9e\xd7\x1f\x13\xbb\xca\xc0\xb3\x78\x71\x6b\xa3\x26\xe7\xe3\xd5\xa6\xdd\x0b\x35\xbb\xf3\x93\xe5\xc5\xc5\x74\x35\x99\x76\xbe\x1a\xdf\xfd\xd5\xaa\xfb\xc5\xfc\xae\x2f\xa6\xeb\xf5\x74\xb1\x99\x8d\x3b\x83\xac\x96\x77\x7d\x76\x31\x3d\x9b\x8d\x3b\x9f\xac\xef\xfa\x64\xbd\x9c\x6c\x57\x33\xb9\xeb\x9b\xcd\x74\x72\xbe\x58\xce\x97\xef\xde\x77\xbe\xbb\xba\xfb\xbb\xdf\x37\xc5\xf4\x6c\xd6\x1d\xf4\xb3\x3b\x3f\x5b\x8d\xaf\xa7\xdd\x26\x9e\x1f\xff\x3c\x6e\x2b\x6f\x33\x38\xc9\x33\x93\x5f\xcc\xe1\xdf\xab\x21\xcc\x6f\x96\xf0\x9a\x47\x27\x3f\xad\xe1\x27\xe9\x78\x7e\x9c\xc0\xdf\xeb\x3e\xe5\x57\x67\xf0\x77\xa9\x37\x3f\xae\xe0\x84\xc1\x25\x3f\x5d\xc1\xdf\xa7\xbf\x6f\xfe\xfd\x6c\x96\x5f\xfc\xa2\x2e\x99\x4b\xb5\x21\xf1\xf2\xfb\x8a\x94\xbc\x3d\x2e\xd5\xf5\xf1\xf9\xf7\x6f\xff\xf5\x3a\x8b\x9f\xdf\xbf\xfd\xeb\x5f\x13\x41\x78\x77\x7c\xfd\xf3\xdb\x5f\xea\xac\xef\x99\xea\xbc\x3b\x7a\xb7\x85\xa3\x2f\xde\x1f\x7d\xf7\xdd\x8b\xcb\x9f\xdf\xff\x72\xfc\xee\xe7\xf7\xbf\x1c\x7d\xd8\xc7\x15\x7e\x9b\x2d\xce\x96\xbf\x7d\xf7\x5d\xfa\xdd\x2e\xa1\x7f\x32\x1f\xaf\x66\x9b\xf7\x2c\xc3\xad\xfb\x47\x75\xb6\xf6\x6b\x18\x9f\x9d\xbd\xb8\xbc\x51\x9b\xbd\x01\x6d\x9e\x1c\x9b\x5b\x03\x7d\xdc\x5d\xde\x3d\xb9\x5a\x5d\x4f\x8f\xdb\xeb\xfe\x93\x7f\x48\xee\xd6\xbb\x9f\x26\xe3\xcd\x66\xba\xfa\x71\xbe\x6c\xbf\xfd\x71\x36\xdd\xce\x38\x9a\x2d\x76\xde\x0d\xa7\xe3\xcd\xeb\xf1\x65\xeb\x8d\x2c\xbd\x6e\xe5\x92\x66\xec\xbc\x9c\x2f\xaf\x76\x72\xfe\x70\xf5\xeb\xaf\xf3\x9d\xac\x3f\x2c\x7f\xdf\x6a\xde\x0f\xe3\xd5\x76\xa6\xc1\xef\xb3\x75\x7a\x77\x10\x4d\xbb\x65\xa9\xe1\x36\xba\x76\x8b\x56\xc1\x3a\xca\x6e\x63\xba\x5b\x54\x2c\x4b\x3e\xe8\xa0\x5d\x4f\x53\xcf\xf6\x46\x3d\xd3\xb3\xbd\x93\x1e\x41\x88\xb6\x67\x7b\xd4\xb3\x72\x47\x3d\xdf\x1b\xf5\xa8\x47\x91\x13\x7b\xba\x04\x2c\x6d\xce\xa5\xb1\x67\xf8\x32\xe2\x22\x34\xf6\x4e\x7a\x5a\x4b\xb2\xc6\x9e\x36\x55\x5e\x6d\xf8\xe3\x11\xff\x7a\xce\x62\x72\xc9\x39\xaf\x4d\xf5\xbf\xe9\xbd\xee\xe5\x8c\x46\xaa\xd4\x54\xfd\x50\xec\x55\x16\x7d\x0f\x3a\xad\xd7\x73\x50\x96\xbe\x47\x0e\xbc\x34\x96\x3c\x78\x9d\x1e\xb9\x4f\x01\x4c\xe4\x27\xe7\xf9\x3e\x62\x8f\x2c\x04\x79\xed\xf9\x16\x7d\xca\xa4\x7b\x64\x20\x12\xdf\x96\x72\xef\x5d\x55\x92\x01\x6f\x7a\xa3\x5e\x80\xb2\x44\x79\xd2\x2e\x3d\x62\x0f\x91\xaf\x27\xf9\xa1\x04\xd2\x3d\xcf\x45\x46\xf0\xb6\xe7\xc0\xf6\x24\x08\x63\xef\xa4\xe7\x00\x23\x3f\x68\xec\x39\xfe\x75\x96\x7f\xe5\xeb\x51\xb7\x03\xb7\x8c\xc5\xed\x56\xfd\x69\x06\x46\x79\x42\x4e\xda\x53\xd4\x4c\x1b\xa5\x09\x35\x69\x3e\x79\x9e\x1d\xdf\x36\x33\x9f\xe6\x88\x64\x2e\x13\x90\xb8\x9c\xcd\x0a\x08\x8d\xd2\x7c\x9e\xb4\xe6\xd7\xe4\x6c\x52\x3f\x4f\xf4\x57\x3e\x21\x77\x43\xe3\x3d\xce\xfe\xf1\x70\xc9\x99\xb1\x1a\xd8\x47\x5d\x44\x20\x02\xeb\xd3\x70\x13\x58\x32\x3d\x07\xce\x05\x79\x28\xb1\xe7\x40\xf3\x7c\x12\x70\xf3\x4e\xaa\xb7\x16\x9c\xb3\x55\x7e\x0b\x9a\x67\x50\x8a\xb9\x1f\xa2\x9b\xdb\x11\xdd\xb4\x11\xdd\xb4\x11\x5d\x4c\x80\x53\x36\x1d\xf8\xc9\xeb\x9e\x26\xf0\xa5\xe3\xbe\x96\xe4\x9a\x5e\x3f\x6e\x30\xb7\x4c\xa1\xbf\x76\xc8\xba\x09\xd5\x1f\x78\x6c\xef\xde\xfe\x0a\x1e\x6d\x17\xdf\x4c\xfe\xc7\xa7\x33\x15\x44\x9f\xf4\x08\x21\xba\xd8\x8b\x40\x5a\xf3\x44\x96\x96\x81\x0b\x7b\x14\x79\x90\x51\x83\xe1\x59\xd2\x25\x24\xa8\x33\x81\x5b\x85\xe0\x48\xc0\xd1\x50\x64\xe0\x64\x40\x67\xe0\xd4\xae\xe9\xc4\x9f\x89\x58\x7d\x8a\xc0\x9b\x4f\x74\xd0\xf3\xbe\xa0\x63\xef\x02\x1d\x5b\x93\xbb\x0c\x3a\x08\xd1\x86\x74\x5b\x82\x0f\x4e\x88\x9f\xc9\xd7\x44\xc5\xa8\xfe\x95\x70\x3d\x99\x73\xe6\xfb\x43\xa8\xd6\x3d\xce\x91\x7e\xed\x40\x76\xb8\x88\x72\xbf\x63\xaa\xbb\x07\x88\x7a\x72\xb4\xc7\xf4\x10\xd0\x98\x34\x93\xc8\xd3\x82\x50\x96\xdc\x48\x2a\xc1\xfa\xc8\xcf\x01\xe5\x08\x2b\xa2\x20\x73\x24\x61\x99\x65\xf4\x82\xe4\xd2\x63\x22\x40\x43\xe9\x59\xb8\x25\x86\x90\x9e\x5c\x4f\x0e\x21\x99\xf4\x24\xc4\x4c\x83\x0b\xf5\x33\x43\x26\x38\x17\x6b\x82\x61\x41\xa3\xd4\x1a\x23\xb3\x44\x08\xd6\xf2\x13\x12\xa5\xbc\x21\xb7\x31\xa4\xd4\x34\xea\x86\x7a\x72\x98\xa9\x6e\xfe\xa8\x27\x67\x9a\xaa\xde\xc9\xa4\x5a\xdf\x2b\x81\x62\xe4\x99\xd4\x26\x54\x0f\xed\x51\xb8\x4b\x22\xbc\xc7\x81\xbc\x8f\x4f\xb4\x1b\xcc\x43\x0f\x8e\xac\x50\xda\xc8\x54\x1c\x1d\xf8\x44\x83\x1d\x43\xa2\x07\x1b\x05\xdf\xc8\xd8\x1e\xe6\x71\x61\xec\xe3\xba\x31\xa6\x69\x4f\xd8\x88\x11\x88\x3f\xe1\xa7\x28\x4f\x7e\x2f\xd2\xfe\x89\xa8\xf9\x63\x4e\x3b\x3e\x63\xd5\xa1\x58\xd5\x31\x0c\xad\x57\x06\x9e\x48\xf1\xd6\xa4\xec\xd0\x0c\xda\xa1\x77\xf6\xc5\xe2\xa1\xdb\x62\xf1\x90\xb2\x6f\x5e\x1b\x45\xf1\xd4\x0f\x35\x9d\x52\x7c\xd3\xff\xb7\x7f\x7d\xc9\xb5\xb4\xc0\x44\x66\xd8\xf7\xb0\x64\xa4\xd3\xf5\x2f\x31\x64\x22\x82\x69\xdd\x21\x42\x82\x57\xd7\xbe\x95\x74\xc6\x9a\xde\xbd\x2c\x6b\x6f\x68\x09\x32\x3a\x0b\x90\xd5\xbf\xa9\x01\xb1\x6e\x8a\xdc\x95\x52\x3f\x3a\x6e\x40\xfb\x5e\xee\xec\x3d\x5b\xa3\x6f\x6a\x0d\xe9\x1e\x3a\x81\x91\xfa\x57\x6a\x20\x5f\xb5\x46\xee\x98\x58\xf1\xbd\xe1\x91\x69\xdd\xa7\x1c\xfa\x9e\xad\x31\x7b\x5a\xf3\xf1\x35\xf9\x7b\x8b\x49\x37\x68\xf2\xb6\xd1\xe4\x7d\x9e\x0e\x5d\xff\x0a\x74\x09\xb0\x71\x7a\x9a\xa7\x66\x8e\xab\x39\x4f\x30\xc0\x39\x28\x7f\x5a\x8f\x7b\x35\x0f\x32\x2f\xfb\xc0\xf9\xdb\x55\xb8\xed\xd3\x28\xdc\x9f\x83\x42\x1c\xa6\xc4\x7f\x2e\x8a\x71\x98\x93\xa1\xcf\x45\x41\x0e\xf3\x0e\xd4\x69\xdd\xc7\xf7\xf3\xf3\x6f\xff\xfa\x32\x55\xf2\xd9\x17\x0e\xee\xaf\xfd\x3d\x7e\xe1\xc0\x1e\xb0\x70\xf0\x89\x69\xe3\xc7\xd5\xef\xef\x9c\xee\x3f\xab\x9e\xff\x79\x88\xe5\x61\x6b\x07\x9f\x8f\x5c\x1e\xe6\x64\xea\xf3\x11\xcc\xc3\x7c\x50\x1d\x2a\x5b\x3c\xd0\xfd\xd3\xb3\x56\xb5\x4f\xab\x3a\x44\xf2\xfd\x88\x2b\x16\x8f\xa1\x21\x9f\x65\xc5\xe2\xb3\x8b\xd8\xcf\x0b\x0b\x1f\x0b\x05\xba\xcb\x0b\xd9\x14\xe1\x6b\x5d\x5d\x20\x41\x90\xfa\xb7\x61\x72\xa3\x94\xca\x90\x28\xdc\xcf\x80\x11\xf0\x64\x62\xdf\xba\xc7\x00\xa1\xe2\x95\xcd\xad\xe4\x48\x60\x0e\x32\x9f\x35\x3f\x6d\xdd\x7a\xa0\xba\x94\xf6\x3d\x67\x79\x92\x15\x8b\xd8\x23\x93\x11\x28\xff\x26\xae\xdf\xfc\x52\x6a\xa5\xf0\xd1\xcc\xea\x13\x13\x6b\xdf\xa7\xb6\xa5\x3c\xed\x7b\xce\x23\x5f\x0b\x03\x24\x19\x13\x49\x69\xdf\xe7\x41\x49\x25\xb5\xee\x25\xcf\x23\x57\x42\xbe\xea\xb5\x87\xe6\x57\x60\xaf\x06\xb6\xd8\xa6\x83\x49\xa2\xe1\xc1\xac\xe7\x8a\x13\xbc\xbc\xa8\x7e\x4c\xce\x9e\xd3\x6f\x9d\x75\x99\x2f\x4c\x55\x92\x6f\x7e\x7d\x26\xc1\x3e\xcf\x68\x4f\x16\x1a\x98\x38\x53\x5b\x24\xf3\x42\x9c\x9f\x57\x37\x3e\xe5\xea\xc6\xd7\x45\xa1\x1e\xb7\x62\x92\x61\x95\x34\x78\x0a\x7c\x7f\xc2\x0d\xe5\x41\xc6\x12\x6c\x94\x66\x5b\x27\xf4\x09\xb5\x15\xdd\x37\xd6\xc4\xaa\x4d\xc4\xda\xc4\xaa\x4d\xc4\xe4\x9e\x20\x06\x01\x25\x0f\xb1\x14\xf6\x8a\x5e\xb6\x4e\x8c\x11\xb1\x48\xb3\xd4\x22\xef\x75\xf0\x2d\x54\x6a\x11\xcc\x36\x39\x6b\x93\xb9\x36\xf9\xbb\x8b\xcc\x3d\x60\xf9\xe6\x81\x0b\x24\xe6\x5b\x5b\x20\x21\xd0\x48\x3d\x07\x81\x11\x86\x11\x8f\x7a\x01\xac\x73\x0c\x59\x4e\xeb\x7d\x7c\xb0\x4b\x31\x35\x18\x92\x9a\x22\x60\xa9\xe5\x99\x5b\x0f\x94\x90\xd7\xd8\x27\x5e\x6d\xf9\x58\xdc\xa0\xa6\xf5\x16\x8c\x27\xbe\x3f\xe9\x89\xef\x55\x69\x83\x25\x96\xf1\x8c\xe5\x04\x60\x5a\xc9\xf5\x42\x08\xf6\xf1\x5c\xe1\x79\x5d\xe7\x13\xaf\xeb\x7c\x6d\x6c\xe2\x51\x6b\x45\x5d\x8a\x9c\x50\xd9\x82\x36\x36\xa9\xac\x25\x25\x25\xd5\x84\x4c\x9d\x2d\x68\xd7\xbe\xbd\x8b\x43\x54\x99\x62\x33\x0b\xf4\x40\xe2\xdf\x96\x7d\x9f\x7c\x61\xea\x11\xcb\x48\xcf\x5a\xef\x9f\x7f\xe1\x87\x31\x21\xec\x30\x3b\x2c\xa1\x34\x61\xff\xc2\x50\x28\x65\x12\x6d\xd0\xb2\x30\xe4\x05\x8f\x30\xfa\x16\x86\xed\x67\x98\xb7\xaf\x02\x7d\x34\xf6\xd6\x61\x52\xe9\xb7\x46\x58\xdf\x6e\xc9\x23\x55\x9a\xe7\xd5\xa4\x4f\xb3\x9a\xd4\x3a\xee\xf2\x4d\x1d\x14\xb9\x99\xcf\x61\x10\x31\x94\x91\xd9\x59\xcf\x43\x2a\x3f\xb2\x6c\x4a\x98\x14\x24\x6d\xb4\xbc\xd1\x75\x2e\x9d\xbf\xd3\x8c\xd4\x92\x9c\x72\xa5\x65\x57\xb4\x49\xfb\xe1\xac\xfc\x26\xd6\xb9\xa4\x3e\xc1\x17\x97\xb6\x55\x44\x5c\x24\xc6\x12\x97\xc4\x81\xc4\x35\x19\x9d\xe4\x3e\xa4\x16\x08\x13\xf4\x5e\xd7\xb9\xf3\xa6\x8d\xfc\x9e\x88\xa9\x9a\xd7\xf9\x6d\x66\x87\x92\x3b\xdd\xa7\xd6\x98\xba\xe4\x9c\x3b\x6f\xeb\xc8\xef\xfd\x9c\xe3\xad\x58\x66\xbc\x6d\xa3\x89\x1b\xc5\xbf\x0e\x28\x69\x80\xf2\x13\x7a\x88\xa9\x39\x01\x7c\x94\x5b\x5f\xe5\xf1\xe9\x23\xcf\x80\xcf\x69\x39\x47\x29\x9f\xb0\xa2\x5a\x15\x52\x4a\xc1\x29\x53\x6b\x59\x06\x93\x6e\x7a\xd2\x8b\xe0\xbc\x4d\x0f\x22\x3d\x91\x3c\xcb\xad\x91\x9a\x93\x90\x42\xb6\xca\xe9\x64\x41\x2e\xfd\x9e\x08\xb5\xa6\xea\xad\xce\xc2\x4a\xd6\x35\x72\xbf\x74\x52\x72\xe5\xe3\x9c\x1b\x45\x37\xce\x6b\x76\xf7\x59\x75\xbb\x7d\x28\x13\xd0\x9d\xc8\xaf\x49\xe0\x94\x01\x50\x40\x83\x5c\xe2\x2a\x02\x5a\x2e\x91\xf7\x1a\xe8\x74\x9a\x02\xc2\x04\x98\x39\x57\x29\xdf\x95\x49\x8e\x93\x92\x4a\x29\x1d\x5b\x40\x2e\xe3\x29\x94\x52\xca\xcf\x40\x23\x5d\x74\x49\x04\x6b\x00\x56\xa7\x16\x88\xe6\x27\x40\x55\x03\xaf\x00\x9e\xfc\x9e\xd4\xe0\x28\x6f\x05\x48\x75\x0b\x60\x75\x6a\x8d\xa9\x4b\xce\xb9\x31\x21\x00\xdd\x73\x50\xcd\xcd\x83\xfa\x55\x9e\x8b\xaa\x10\xa0\xc6\x88\x1a\x47\x1a\x9c\x49\x38\x54\x63\x55\x85\x66\x2d\xc4\x6b\x90\xb1\x85\x9e\x19\x8b\x1a\xcc\xc2\x7a\x11\xb3\xa2\x62\x0d\x5d\x6b\x80\xa8\x45\xfd\x32\x10\x35\x34\xb2\xa2\x9a\x0d\x1d\x6d\x68\x6b\x8b\xda\xe6\x92\x1a\x1a\x29\xf5\x55\x90\x57\xb6\xe0\xba\x6c\x43\x71\x0b\xae\x33\xa4\x37\xd0\x5f\xe1\x43\x8d\x21\x0d\xd6\xb4\xf1\x28\x97\x54\x43\x7f\xaa\xef\x79\xd1\xf5\x23\x9c\xe1\x7a\xe6\xba\x0f\xe3\xba\x07\x9e\x6d\x7b\xe6\xc2\xf7\xe7\xc2\x07\x06\x0e\x7c\xe6\xca\x8f\xe1\xca\x07\x06\x2e\xdc\x33\xc8\xdf\x92\x85\xe2\x97\x7a\xb4\xf1\x59\xde\xf8\xf4\xf2\xc6\xf3\x72\xfe\xa7\x5c\xce\x7f\x16\x40\xee\x14\x40\x0e\x3c\xa6\xfa\x2c\x82\x3c\x44\x04\x39\x30\x18\xeb\xb3\x10\xf2\x38\x21\xe4\xc0\x90\xb3\x07\x2d\x16\x3c\x5b\xfd\xfe\x09\x37\x7f\xbe\x82\x73\xca\x64\x12\x5c\xa4\xe7\x93\x64\x60\x21\xcf\xc1\xe9\xcc\x88\xc2\x16\x6b\x7a\xb8\x8c\x24\x25\x05\xd0\x0e\xeb\x1a\x3c\x98\xf6\xae\x4f\x77\xff\xe9\xb3\x88\x8a\x5f\x84\xc0\xf6\xbc\x85\xf5\x99\xb6\xb0\x5a\x6e\xdc\xbe\x4a\x9b\x68\x2a\x21\x7a\x19\x29\x32\x3a\x21\xb4\x46\x93\x36\x85\x65\x82\xb4\x13\x39\x4e\x6b\x2b\x46\x0d\x26\xf2\x7c\xf3\xcf\x89\x60\x1e\x93\x38\x9b\x32\x95\xe9\x13\x27\x05\x04\x29\x8f\x34\x44\x26\x13\x4c\xbc\xe4\x43\x47\xbe\xe7\xe4\x73\x46\x6f\x1f\xc4\x83\x80\x93\xfa\xf8\x47\xf0\x30\x78\x56\x25\x25\x4f\x00\x47\xa1\x17\x20\x6e\xb5\x33\x21\x3b\x38\xcd\xc2\x13\x38\xed\x05\xe9\x03\x89\x70\x69\x4c\xec\x79\x08\x5e\xb0\xb0\xb4\xa1\x17\xc1\xa2\x80\x9e\x8b\x82\xea\x08\x68\x05\x21\xb5\x0e\xfc\xbd\x77\xc2\xe6\x75\x88\x69\x17\xdc\x25\x00\xf7\x09\xd2\x35\xc3\xab\x07\xef\x12\x56\xa7\x4f\xd0\x8a\xd4\xeb\xa2\x98\x50\x59\x74\x49\x74\x28\x19\xc3\x4b\x08\x5e\xda\x65\x4c\x10\x1c\xc9\x82\x58\xd3\xd8\xa7\x30\xf7\x16\x54\x13\xe8\x15\x22\x2c\x14\x24\xfd\xd8\xfc\x2f\x4d\x26\xcf\x02\x77\xbe\xce\x45\xf9\x3b\x92\xce\xa5\x49\x4a\x14\x86\x33\x62\x4c\x82\x7c\x92\xe0\xa4\xf4\x9c\x4b\xea\x13\xa5\xc1\x26\xdb\x17\x51\x09\x44\x84\x2a\x93\x54\xe5\x24\x1a\x3f\xbf\x90\x7b\xca\xfc\x41\x4c\xf2\x92\x4c\x95\x13\x8d\x94\xa1\x93\xd2\x60\x53\xa2\xbc\x75\x49\xb4\xf2\xc9\xdd\x85\xc9\x65\xc8\x5d\x2e\x39\xe7\x96\x1a\x73\x3b\xee\xb7\xc1\xf5\xfb\x71\xdf\xff\x59\x8c\xcb\xb7\x91\xa7\x83\x59\x1d\x9c\xeb\xa2\x63\x17\x55\xb7\xd0\x78\x0b\xc9\xbb\x24\x60\x8b\x3c\x6c\x11\x8f\x16\xbe\x76\xf1\xb8\xd3\xce\x0c\x43\x09\xd2\x1a\xd8\x6b\xe0\xb1\x05\xa1\x19\x66\x1b\x38\xae\x20\xbb\x81\xf5\x06\xfe\x5b\x18\x91\x4b\x6a\xe0\xd8\x3e\x9b\xb2\x7f\x5a\x53\xf6\x67\xc6\xf2\xe5\x30\x96\x47\x59\xe9\x7f\x31\x8c\xc6\x6d\x33\x1a\x77\x1b\xa3\x71\x8f\x61\x34\xee\x3e\x8c\xe6\xc0\x3d\x9c\x5d\xc6\xf3\x6c\xde\xff\xf9\xfd\x1f\x3c\xb3\xd0\x47\xb1\xd0\xe7\x8d\x82\x4f\xb9\x51\xf0\x89\xf8\x64\x99\xe0\xcd\x79\xc9\x64\xac\xee\x45\x30\x91\xb8\xfa\x68\xc5\xd9\x1b\x26\x33\xfc\x00\x65\x29\x9c\xc8\x1b\x4c\x2b\x20\xb2\xa2\x02\x16\x45\xc5\x77\x51\x16\xa4\xac\x0f\x9f\x86\xa7\x62\x04\xa2\x20\xcd\x4c\x24\x9b\xb4\x2c\xb8\xc4\x28\xe0\x6c\xac\x6b\x2d\x64\x11\x4b\x2f\xcd\x3a\x16\xc9\x82\x04\x37\xc8\x8b\x42\x13\xb8\xb6\x08\xc1\xe1\xd6\xa8\x7f\xa4\x13\x0e\xcf\x4c\xf6\x2e\x26\x7b\xe0\x2e\xc5\x21\xfa\xdd\xf3\xd1\x89\x3f\xe1\xea\xf9\xa3\x8e\x4e\x74\x28\xdb\xc9\x16\xd9\xeb\x52\xc4\x4f\x21\x30\x74\xe8\xcf\x16\x6d\x6a\x13\xae\xed\x05\xf0\x2f\x42\x26\x78\x5e\x8b\xfe\x5c\x6b\xd1\x4d\x9c\x91\xe7\xd3\x14\xaf\xd3\xe6\x4f\x10\x14\xb5\x36\x29\xcc\x3d\x07\x24\x4e\xaf\x0c\xe5\x5b\x49\x26\xc1\x4e\x1b\xaa\x9c\x25\x90\xb8\xae\x49\x87\x1b\x75\xba\x13\x71\xcb\x94\x26\x3d\xa1\x03\xed\xa4\xd0\x58\x7a\xd9\x7d\xb3\xb2\xf9\x65\x7c\x48\x3b\xd1\x22\xfc\x38\x11\xe6\x59\xc9\x37\x26\x9d\xb7\x92\x7d\xe7\xa0\x2d\xff\xa0\x0c\x1c\xe6\x63\xe9\x1e\x34\x13\x1b\x0f\xd1\x89\x64\x64\x83\x88\x32\x25\x4a\x5a\x2a\x36\x82\xe6\x4e\x13\x68\x2f\xec\xd2\x32\xd5\x30\x40\xe2\x3d\xc7\xa4\x13\x8d\xf9\x8d\x1c\x66\xe6\x7e\xa6\xf4\x08\xb2\xc5\xcd\xdd\x4b\xf7\x36\xe5\x08\x72\x56\xd8\x50\x9d\x5b\x7c\x09\xc7\xf4\x9b\x3c\x58\x59\xc8\x75\xdb\x74\x06\x5f\x3a\x14\x03\x0a\x97\x77\x49\x46\x0c\x22\x26\x09\xf0\xf3\x23\xc9\x9a\x4e\x99\xec\x15\xb4\x93\x1e\x84\x64\xe4\x41\x51\xfa\x6e\xb3\x41\x00\xa5\x11\x11\xd4\x73\x80\x56\xba\x5e\x4a\x4e\x44\x19\xd1\x28\x93\x84\x16\x4a\x23\x27\xb3\xc5\x3d\x80\x01\x5d\xda\x34\xa5\x9c\x0b\xa5\xb1\x79\xc2\x1f\xb9\xba\xfe\x75\x1a\xe5\xeb\x74\xd8\x1b\x8d\x1c\x82\x47\xe1\x10\xce\x27\x53\x91\x28\xe3\x5f\x6a\x59\xf7\x22\x6f\x13\xd0\x05\x14\xc9\x2b\x06\xe1\x3f\x54\x0a\xa3\x41\x14\xa0\x0b\x41\x98\x84\x2e\x63\x9a\xf9\x20\x2b\xef\xa5\x16\x02\x4b\xa5\x98\x17\x75\x1d\x36\x09\x30\x59\x39\x61\xde\xd3\x25\xe7\xe6\x07\xb9\xe3\x96\x97\x62\x51\x61\x42\x9d\xcb\x34\xc7\x09\x19\x74\x93\x9a\x8f\x41\xee\x99\xcd\x90\xab\x16\x43\x99\x37\x3b\x41\x0c\x2f\x65\x61\x48\x64\xdb\x42\x89\xc2\x15\x7d\x4c\xba\x72\x90\x4c\xd2\x03\xd6\x1e\x2a\x8d\x44\xd0\x57\x4a\x30\x69\x4b\xbc\xec\xba\xa7\x62\x02\x20\x0b\x6a\x65\x72\x64\xcd\xf7\x2e\x53\x06\x51\x66\x2c\x55\x39\x28\x1f\x65\x7c\x5e\x46\xfe\x64\xc6\xf9\xcf\x44\xfc\x99\x88\x3f\x6e\x25\xfb\xe3\x87\xa5\xf9\x72\x56\x59\xbf\x58\x1b\xee\x67\xf6\xf4\xd9\xd8\xd3\xf3\x12\xed\x27\x76\xcd\xf2\xcc\xaf\x9e\xf9\xd5\xe3\x97\x85\x9f\x03\x12\xfd\xd9\x17\x2c\x9f\xd4\xdc\xd7\x83\xf1\xe9\x50\x01\x0a\x3e\x6b\x9e\x4e\x82\x60\x04\xd2\xb5\x00\x71\x99\x76\x49\x3c\x90\x13\x17\x60\xd1\x08\x56\x61\x94\xa7\x4f\xc6\x9f\x46\xdf\x98\x38\xe0\x84\xca\xd8\x28\x6d\xd5\xc1\x72\x67\x85\x34\x07\x40\xe3\x13\x91\xc9\x47\x0f\x4c\x29\xcf\x84\x42\xca\x3c\x26\xcb\xeb\x74\xc2\xe6\x09\x1c\x35\x3f\xaf\xd3\x7e\x11\xeb\xb4\x4d\x8c\xe8\x27\x5a\xa6\x45\xab\xd0\x0f\x4d\x6d\x11\x8c\x05\x15\x74\x1a\x6a\x8b\x60\x54\x46\xb9\x21\xda\x26\x83\x22\x45\xd7\xbe\x95\x41\x8a\x78\xf3\xda\xa8\x70\xed\x87\x68\x4f\xc3\xa3\xa2\x19\x6b\xe2\x06\x11\x6e\xb7\xa8\xdd\x80\xa2\x63\xc4\xbc\xdb\x22\x29\xe3\xcd\x6b\x42\x69\x92\xa6\x87\x36\x49\xd7\x63\xa4\xcb\x9d\x31\x6a\x37\x51\x9a\x74\xd7\x20\xe9\x52\x0c\xab\x31\x8d\x12\xe1\xc3\xda\x64\xea\x61\xd2\xe5\xee\x30\xed\x34\xea\xae\x71\xe2\x46\x11\xa6\x56\x69\xba\xbd\x55\x77\xac\x68\x56\x2e\xb8\x58\x24\xaa\xa5\x6b\xf4\x3d\x11\x3e\x13\x9f\x42\xe1\x45\x3d\x39\xa6\xd1\x73\x2d\xe9\xda\xf5\x4c\x2f\x87\x65\xc8\x82\x16\x7f\xc0\x4a\x50\xce\x86\xbe\x17\xb2\x5f\xb0\x44\xd6\xab\x3c\xd5\x8f\xcf\xf5\xdf\xbf\xfd\xd4\x5a\x47\x6b\x5c\x84\x25\x76\x90\x6a\xc6\x58\x57\x13\x53\x1f\x30\xf6\x92\x90\x59\x35\x2f\xe6\x6e\x10\x4a\x3f\x34\x49\x3f\x32\x13\x17\x95\xd6\x55\x06\xb8\xa1\xa2\xac\x89\xdf\xe7\x92\x73\x56\xf4\xb9\x1d\xf7\xef\x87\x6e\xe6\x41\x97\x49\x5e\x28\x1b\x2d\xa7\x14\x31\xa1\x92\x17\x42\x5a\xaa\x13\x8a\x59\x35\x3e\x4f\x58\xe4\x09\x6c\x7c\xad\x9d\xb4\xbb\xee\x5b\x83\x42\x98\xfd\xb5\x25\x05\xa2\x2a\xbc\xea\x4e\x99\xdb\x71\xff\x7e\x98\x66\x3e\xa4\x1f\x84\xa9\x23\xb9\x6a\x2e\x39\xd6\xb5\xc5\xd4\x17\xfe\x4d\xcc\xad\x6e\x61\xf5\x53\x3b\x70\xe3\x71\x8d\xcd\xa4\x60\x94\xd1\x8f\xd5\xb4\x48\x7f\xf8\x37\xa4\x79\xc9\x35\x54\x72\x58\x99\xdb\x73\x40\xec\xcf\x5b\xd5\xd5\x8e\xdc\xf7\x79\xa8\xef\xed\x8a\xc5\x96\x60\xba\x85\x14\x54\x42\x89\x26\x43\x02\x26\x9d\x91\x82\x3c\xb1\x66\x94\x5c\x69\x26\xd7\x9a\x26\xbb\xd6\x94\x29\x29\x6d\x4a\x7d\x5c\xe0\x08\x0d\xd1\x85\xc6\xf4\x46\x6b\xd6\xa7\x58\x47\xa3\x9e\x26\x88\xe2\x8b\xb0\xc2\x9f\xe4\xe1\xfc\x56\x2c\x25\x04\xed\x29\x11\x9e\xda\xdb\xe1\xe3\xc6\x4f\xef\x4c\xf0\xe7\x61\x1d\xb7\xdb\xa7\x74\xda\xf8\x39\x58\xc9\xf3\x21\xd4\x2f\x3b\x4c\xee\xd7\xc1\xcb\x0f\xd2\x37\x9e\x09\xd9\xfd\x47\x4f\xef\x81\x87\xaf\x48\xa6\xb8\xa5\x67\x66\x0f\x5c\x7c\x5d\x52\xc6\x5d\x3d\x7c\x26\x9b\x4f\x46\x36\xef\xbf\x19\xff\x99\x04\xba\xc3\xbc\xac\x3d\xb9\x96\x43\x04\x36\xd6\x66\x03\x9c\xab\x14\xbb\xc1\x7c\xaf\x7d\x73\x6f\xdb\xb9\x3c\x49\x2e\x17\x7a\x1e\x74\x90\xf5\xb8\x60\x82\x30\x05\xc2\xea\x07\x6d\xb5\x85\x92\x7f\x35\xa0\x2c\xe9\x69\x4a\xcb\x5b\x04\xd1\x53\xb2\x10\x90\x05\x4b\xe7\x4c\xde\x3a\x24\x17\x1f\xab\x63\xdd\xef\x80\xce\xe7\x15\xf5\x0e\xf3\x51\xf6\x69\x44\xbd\x8f\xef\xf6\xec\x2e\xc2\x78\xe8\x56\xf9\xd7\x22\xe2\xdc\xb9\xd3\xfa\xc5\x20\xb6\xc4\xf7\x47\x89\x1a\x52\xa6\x7d\x7f\x2b\xf2\x41\x0c\xae\x7a\x92\x8d\x7f\xe3\xea\x67\xcd\x98\x9f\x18\x03\x86\xa7\xc3\xde\x3b\x86\x4e\xef\x82\xc2\x57\x25\xdd\xdc\xd4\x2f\xb3\x0b\x12\x5f\xb2\x6c\xf3\x00\xf3\x82\x7b\xd1\x89\xce\xca\xf9\x70\x3a\xde\xbc\x1e\x5f\x3e\x9b\x37\xf7\x5f\xf7\x72\xa4\x07\x6a\x7e\x65\x83\x4b\x7e\x24\xd8\x82\x78\x72\x63\xa0\x30\x80\xad\xbb\x1c\xbe\x24\x56\x91\x4c\x44\x35\x91\x84\x14\x4c\x2b\x36\x71\xb5\x62\x2b\xdc\x8b\xe4\xe0\xfb\xec\x37\x2e\xed\x86\x35\xd1\x50\x10\x62\xe7\xbe\x8a\x9e\xd2\x04\xe9\x92\x1c\xed\xfb\x1c\x82\xc5\x35\xe5\xa2\x05\x5f\xe5\x49\xf7\x75\x04\x42\xdd\xbd\xaf\xa2\x11\x4a\x2e\x32\xd5\xfb\xe6\x2e\xb7\x25\x95\x72\x4b\x34\x96\x07\x99\x05\x3f\x1b\x78\x3e\x99\x81\x67\x78\x4c\x0c\xb8\x3b\x40\x2a\xdd\x91\x2c\x09\xa4\xc3\x2d\x88\xc9\x43\x9e\xe8\x12\x14\x72\x74\x38\x39\x0f\xc7\xa2\x69\xa0\x2f\x17\x93\x3e\x03\x6e\x7c\x3a\x6b\x4b\x7a\x36\x39\x7b\xb0\xc9\x59\x1d\xf2\xa7\x15\xfe\x27\x40\x19\xb1\x0b\x2d\x87\x40\x4e\x7d\x3a\x56\x60\xb0\xfb\xb4\x0f\xb5\xea\x1c\xa1\x73\xff\xc5\xa2\xcf\xe3\x90\xe1\x93\x99\x72\xd1\xb3\xa1\xc5\xc7\xb0\xe5\xfa\x0a\xce\xf1\x64\xdc\xa1\xe6\x57\xf0\x39\xd4\xce\x06\xcb\xac\xa4\x98\xfa\x37\x21\x54\x59\x0b\x5c\x94\x61\x9b\x72\xc4\x2b\x57\xff\xd6\xe1\x9f\xf3\x9b\x32\x7f\xeb\xea\xdf\x2a\x16\xbb\xcb\x5a\x28\x35\xbf\x35\x37\xad\xcb\x48\x64\x23\xe5\x40\xd7\xfc\x66\x51\xce\x64\x5b\x2f\x93\x53\xca\xe6\xf7\x80\x23\x34\x5f\x85\xc9\xfc\x41\x71\x47\xeb\x29\xdc\x99\x59\x0d\xa4\xd3\xc9\xda\xe4\xd4\x52\x4b\xc0\x35\x0a\x10\x6c\x8e\x49\x4a\x4f\x64\x7e\xff\x79\xa1\xc6\x82\x15\x49\x2b\xfb\x07\x40\x59\xe8\x93\x25\x86\x60\x45\x6c\xc4\xe8\x5a\x92\xda\x47\x80\xaf\x87\xd8\xc0\x3f\xa5\x44\xf2\x45\x9b\x92\xb6\xe4\x86\x9b\x61\xf5\x06\x87\xab\x9f\x0d\xb0\x6a\x69\xc3\x75\xce\xbf\xef\x05\x17\x31\x97\x0d\xb6\xb9\xff\x24\x9e\x72\xcb\xce\x40\x3d\x09\x35\xbc\x79\xa3\xf4\x59\x60\x78\x12\xcb\xcc\xd1\x6c\xf1\x7c\x80\x7e\x39\x7f\xff\x6e\xb9\xe8\x5d\x2e\x67\x8b\xcd\xfa\xb8\x8f\x16\x9c\x20\x1c\x11\xb1\x20\x5e\x8a\xb1\x75\x74\xa1\x67\xc1\xda\xe4\xc8\x4e\x56\x2b\x50\xd0\x23\xb8\x5e\x04\x5d\x0a\x20\x59\x9f\x2c\xbb\x33\x33\x12\x70\xe2\xcc\x94\x70\x8f\x18\x9b\x04\x7c\x8c\xe7\x0e\x19\x86\x3b\x03\x46\x27\xff\x80\xa5\x1c\x13\x41\x63\xef\xbb\x70\x93\x3a\xf0\x50\x51\x70\x7b\xc2\x5c\x3d\x61\xee\x96\x09\x73\x8f\x9a\x30\xb7\x67\xc2\x58\xce\x70\x39\x7a\x77\x0a\xb1\xdc\x84\x33\x8e\x80\x72\xc6\xc6\x71\x92\xe1\xf9\xa1\x32\x3d\x24\x53\x71\x2b\xb1\x9a\xc5\x15\xbe\x69\x7d\x8d\x5c\xa2\x48\x30\x69\xd9\x88\x52\xa4\x63\x7e\x42\xcd\x8d\x42\x31\x89\x30\x40\xe1\xf9\x90\xf3\xc7\x5f\x03\xfb\x4a\x10\xed\xf0\x55\xa0\x36\xe2\x7d\x85\xc7\x6e\x5b\xc2\x75\xc2\x85\x90\x71\x61\xf4\x29\x91\xb1\x16\xf7\x4f\x3a\xc7\x70\x3b\xc7\x73\xf7\x00\xf8\x47\x23\x53\x35\x80\x77\xf5\x8b\xae\xee\xd1\x1a\xba\xe7\xe3\xa7\x9f\xd3\x43\x60\x9b\x86\x8c\xba\x54\x64\xd4\xa1\x23\xa3\x0e\x25\x19\x75\x69\xc9\xa8\x4b\x4d\x46\x5b\xf4\x44\x82\xdc\x57\xa7\x93\x04\x5b\x28\x82\x27\xd3\x7a\x6e\x93\x95\x2f\x60\x45\xed\xf9\x70\xe4\xb7\x7c\x38\xf2\x23\x69\x78\x5e\xac\x1f\xda\x2e\x25\x13\xe7\x2d\x5d\x85\x40\x49\xe9\x8b\xcc\x43\x08\x13\x27\x71\xe0\x53\xad\x46\x10\xd2\x08\xb7\xb0\x3a\x21\xab\x38\xba\xa4\xbc\x1c\x9d\xa2\x9e\x54\x4c\x82\x04\x9b\x6c\x9a\xd0\x68\xf7\xc7\xe0\x7f\x3e\xe0\xf7\x45\xa8\x91\x3f\xce\x9e\xb5\xc8\x86\x25\xf9\x1e\xf9\x14\xc0\xcc\x06\xe2\xfb\x28\x87\xf8\x31\xf4\x62\xb2\x44\x89\x2c\x66\x71\x5a\xce\x82\x62\xfc\x84\xd9\xd0\x26\x2d\x0e\x55\x8e\x0d\x6d\xf5\x2d\x4b\x53\xfc\xe3\x73\x05\xa2\x32\x69\x20\x23\xee\x5b\x2b\x39\xab\x73\x8f\x04\xa1\xa4\xd4\x94\xe4\xc2\xd1\xa6\xe3\xcd\x42\x16\x9c\x58\x2f\xf1\x53\xb6\xff\x29\x93\xb3\x53\xab\x93\x1f\x69\x27\x9b\xcf\xb2\x7e\x23\xbf\xc9\xfa\xdc\x8a\x13\x47\x93\xce\x23\xbb\x52\xbc\x26\x92\xc3\x4e\x53\x9e\x22\xdc\x07\xc6\x5e\x76\xec\x98\x06\x8e\x7c\x6b\x40\xd3\x52\x52\xac\x0c\xcd\x99\xeb\xc6\x90\xfa\x9c\xe2\xf6\x25\xc3\x4b\x9b\x6c\x34\x05\x5b\x74\x48\xee\x56\xb1\x84\x50\x62\x12\x44\x5c\xfa\xe4\x5e\xf1\x34\x3e\xd1\xbe\xcb\x49\xfe\x7d\xda\xdd\x96\x04\x55\x0d\x94\x25\xa8\x3b\x69\xc1\x61\x0d\x9a\x35\xa8\xe6\x19\xe8\x0c\xbe\xc0\x77\x03\x90\x2d\x20\xb5\xd5\x1a\x66\x9a\x9d\x51\xfe\xe0\xa4\x3d\x7f\x2d\x5c\x78\x0e\x51\xf1\x29\x4d\x4f\x9e\x29\xd3\xc7\x88\x17\xf1\xf9\x29\xd5\x61\xf6\xde\xdf\x6c\x28\x86\x2f\xd5\x49\xd8\x97\x4f\x8d\x9f\xd7\x32\x3e\xe9\x5a\xc6\x33\x79\xfe\x38\xb1\x06\x3a\x64\x38\xfd\x5a\x31\x3d\x48\x27\x25\x73\x7c\x4d\x13\x92\x9a\xaa\xdb\xe7\x26\x1f\xaa\x2a\x3b\x08\x1a\x5b\xe1\x16\x1c\x44\x23\xd0\x10\x82\x4c\x02\x3a\x30\xda\xe7\xa6\x3d\x32\x04\xc0\xb3\xf3\xff\xe7\xe5\xa2\x47\x2e\x17\x85\x52\x26\xc9\xca\x11\x5e\xb0\x5e\x40\x17\xa3\x6f\xe1\xca\x68\x2f\x13\xc9\x60\xdc\x05\xef\x0e\xf0\xef\x77\xd9\xff\xf1\xb9\xde\xf3\xd2\xd0\x17\xb1\x34\xf4\xd3\x64\xbc\xd9\x4c\x57\x3f\xce\x97\xdf\xd8\xea\xd0\x23\xbc\x49\xf5\x22\x60\x62\x2d\x41\xe2\xe8\x9b\xe4\xa3\x11\x19\x37\x20\xe6\x83\x71\x12\x90\x19\x48\xe7\x7c\x23\x51\x1d\x22\x4a\xc8\x21\x61\xe4\x04\xd6\xd6\x85\x30\xf0\x25\xbf\x6c\x64\x45\x36\xf5\xe9\x74\x5f\x19\x05\x9c\x62\x29\x5e\xda\x6c\xe9\x93\x97\xba\xb2\x4c\x9b\x2a\xa5\x80\x62\x4c\xdb\xa7\x21\x88\xc8\xeb\x42\xaa\xc4\xe7\x4a\x92\x20\x6c\xa5\x4e\x2d\x8e\xf4\xd2\x26\x8a\x14\x24\x0e\xdf\x58\x88\x96\x4a\x63\x10\x80\xa4\x14\x0e\x4c\x47\x01\xd6\x32\xf9\x8d\x63\xb1\x1a\x4b\x88\x24\xd6\x72\xde\x8b\x0b\xd1\x32\x1d\x99\xb5\x2e\x45\x0c\xb3\xa9\x9b\x2c\x44\x20\x81\x11\xb9\x27\x8f\x01\x26\xbf\x98\x31\x39\xd8\x2b\xc1\x3b\xdd\x63\x30\xb6\xa9\x50\xd7\x0b\x10\xbc\xb4\xc5\x8a\x61\x5e\x80\x14\xa5\x29\x20\x72\x92\x4b\x76\x79\x3a\x56\x63\x4f\xa0\x6d\x2e\xde\x35\x1d\xcc\x89\xd2\xfb\x54\x86\x10\xab\x18\xa8\x7a\xb0\x60\x82\x6f\x4f\xe0\xa3\x9c\x78\x09\x19\xf6\xb2\x11\x6b\xb5\xcb\xde\x51\x83\xac\x8c\x87\xe4\x4a\x2f\x46\x53\x3f\x39\xd0\x65\x9d\x57\xe8\xbc\x71\x72\x9e\x44\x7b\x97\x8c\xe4\x1d\xb5\xcb\x8a\xe2\x75\x90\xb8\x10\x39\x1d\xe8\x63\x72\x4d\x2a\xd1\xb7\xa3\xd4\x92\x63\x59\x96\xe2\x4b\x91\x0c\x44\x63\x52\xa2\x38\x40\x75\xe9\xa4\xa0\xb7\x52\x8b\x29\xab\x5a\x4a\xb1\x08\xa5\x54\x6b\x04\xef\x5c\xf2\x5e\xe8\x52\x59\x44\xc4\x44\xd1\x97\xb2\x17\x50\xa6\xa0\x70\xb2\x49\x60\xbc\x08\xa2\xde\x55\xf2\x56\xf2\xc0\xea\x5c\x8e\x99\x29\x72\xa2\xb7\x62\xc4\xee\x74\xfa\x30\x54\x7d\xf5\xa9\x16\x51\xc9\xaa\xb1\x28\x25\xce\x8d\x8c\x5b\x88\x52\x9d\xf8\x5b\xb4\x80\x26\x15\x2c\x7e\x1e\xa3\x95\x06\x91\xc9\x50\xcb\x84\x93\x10\x2c\x0f\x2a\xf7\x59\x4b\xa8\x1a\x6f\xeb\xe9\x20\x28\x43\x55\x8d\x6e\x77\x36\xa7\xa7\xc1\x48\x65\x39\xc3\xcf\x1e\x43\xfd\x64\x81\x48\x6f\x4d\xed\xa3\xfc\xaa\x71\x83\x22\xd6\x91\x6f\x64\x31\x82\x92\xab\x46\x67\x25\x7c\x58\x8e\x3a\x65\xa5\x2d\xa5\xa9\xb3\x8a\xb5\x2a\x95\x94\xf6\x45\x75\x12\x5d\xb5\x6b\x17\xe5\xc0\xa7\x59\xf0\x89\xfe\xdb\x14\x18\xc7\x89\xf8\x0a\x1e\x5d\x12\xef\x45\x20\x10\xb7\x95\x02\x11\x28\x89\x94\x66\x95\x9b\xe2\x53\x6c\xa1\x08\x84\x55\x35\x46\x42\xac\x95\xa9\x5a\x0f\xb6\x94\x53\xcc\x31\x45\x82\xf7\x22\xaf\xa0\x03\x5b\x4a\xb5\x3e\xca\x22\x88\xb7\x52\x2d\xe5\xbd\xa2\x90\x85\x6b\x94\x67\xe3\x89\x9f\x44\x8c\x91\x9d\x24\xae\x25\x99\x8a\xf8\x58\x75\x16\x53\x2d\xb2\x05\x95\x07\x83\xd3\x5d\x1e\x37\x97\xad\x3f\x13\xfb\x95\x00\xa4\x56\x3c\xf0\xca\xd9\x7f\x69\x51\x69\x6d\x75\x7c\x58\xd4\x21\x6d\x65\xbd\x30\xc7\x8f\x73\x81\xaa\xf9\x60\xc9\x2a\x56\xf5\xf8\x76\x6f\x73\x7a\x1a\x0d\x29\x4b\x6c\x27\x2c\xa5\x50\x70\x32\xa4\x7a\x6b\x5a\x1f\xee\xe4\xee\x8b\x31\xf7\x7f\x66\x6c\x7f\x22\xc6\xd6\x7b\x66\x4f\xdf\x0e\x7b\xea\x3d\x33\x99\x6f\x9d\xc9\x3c\xef\xc4\xdd\x7f\x27\xee\x29\x9d\x20\x3d\x33\xcf\x3f\x11\xf3\x7c\x4a\x27\x4e\xcf\x6c\xf8\x9b\x61\xc3\x4f\xe9\x57\xeb\x99\xa1\x7f\x53\x0c\xfd\xeb\x71\x72\xf6\xe7\xdb\xea\x7f\x66\xdd\x7f\x22\xd6\xfd\xac\xf7\x7e\x43\x0c\xf7\x59\xef\x7d\x66\x93\x4f\x68\xf3\xf4\x28\xdf\xf2\x5f\xa3\xad\xd3\xa3\x3a\xbc\xe3\x0f\xfd\x99\x8f\xfe\x89\xf8\xe8\xe3\x60\x63\x8f\xb7\xf7\x67\x9e\xfc\x6d\xf0\xe4\xc7\x01\xce\x8e\x33\xfd\x67\xfe\xfe\x2d\xf1\xf7\x87\x01\xcd\x73\x7c\x82\xcf\x17\xd6\xe5\xcf\x77\x92\xb6\x6b\x11\xf9\x2c\xd4\xfc\x89\x84\x9a\xe7\xc5\x81\x6f\x48\x10\x79\x5e\x1c\xf8\xe6\x85\x87\x67\x33\xf2\x8f\x24\x38\xac\xa6\x93\x4d\xef\xb7\xd9\xd9\xe6\xfc\xb8\xaf\x5d\xbf\x77\x3e\x9d\xbd\x3b\xdf\xa4\xfb\xb7\xb3\xf9\xbc\x58\x5e\x8e\x27\xb3\xcd\xfb\xe3\x7e\xb9\x1d\x35\xe1\xef\xb3\xc9\x3f\xbe\x41\x7f\x04\x8f\xb1\x38\x67\x9a\x96\x1c\x61\xe6\x1f\x4a\xce\x1a\xeb\x5f\x61\x8f\xba\xf9\x4d\x3e\x73\x9a\x5f\x79\x1f\x9a\xdf\xec\xcc\xb4\xfe\x15\x41\x4b\x37\xbf\xc9\x51\x6a\xf3\x5b\x39\xd9\x49\x79\x04\x5a\x4a\x4a\x1b\x31\xc4\x0f\x14\xe5\x81\x8b\x0e\x60\x9c\x3c\x24\x2a\x19\x20\x32\xc2\x3a\x61\x4a\x01\x4c\x90\x07\xce\x9e\x8b\x73\x10\xa3\x38\xa7\x92\x3b\xfc\x33\xd8\x51\xd6\x7d\x19\x75\x7b\x79\xb2\x35\x02\xdb\x63\xd3\x1d\xb7\xce\x98\xb6\x46\xbb\x9e\x86\xd6\xd4\x54\x53\xa5\x9b\x5f\xdb\x9e\xda\x0a\x54\x42\xf3\x6b\xdb\xa0\x51\x81\x8a\x6e\x7e\x6d\x1b\xb4\xf2\xf7\xa1\xfe\xb1\x69\xca\xec\xb3\x45\xd2\x97\x6b\x91\xf4\x4d\x52\x8d\x8f\xef\xe8\xef\x79\x1f\xfd\xa6\x7d\xf4\x6f\x92\xee\x3d\xef\x48\x7d\xc1\x3b\x52\xdf\x24\x09\x7c\xf6\x49\xf8\xbc\x86\xfa\x65\xad\xa1\x7e\x93\x8c\xe1\x79\x35\xe2\x53\xa0\x60\x67\x69\xe1\x87\xe9\x7c\x7e\x72\xb5\xba\x9e\x6e\x2d\x2d\x34\xee\x46\xb4\x56\x14\x87\x7a\x80\x0a\x53\x74\x5c\xa5\x15\xf9\xa1\xee\xbc\xe1\x3c\xf7\x70\x3b\x87\xfd\xde\xcb\x7f\xeb\x56\x61\xcf\x0b\x70\x34\x0e\x80\xa8\xe4\x92\x02\xe3\x86\xc2\x81\xf3\x27\xb2\x9a\xa6\xd0\x80\x31\x8a\x10\x42\x54\x1e\xa2\x51\x18\xe4\x77\x5d\x58\x70\x51\x39\xb0\x58\x38\xd0\x41\x61\x09\x3a\xee\x96\xa5\x1c\x38\x3b\xd4\xe3\xa6\xe1\x65\x41\xe7\xe0\x06\x8e\x33\xb9\x2a\x67\xa9\x22\x38\x85\x61\x82\x60\xb0\xf0\x10\x82\x32\xa0\x0b\x24\x15\x40\xdb\x02\x69\xcd\xb8\xa7\x0c\xa0\xe3\x37\x5a\x21\x8d\xb7\x4b\x70\xca\x0e\x75\x55\x53\x29\x57\xba\x97\x1b\xc1\x5e\x35\x51\xe7\xe3\xd5\x46\xa6\x6a\x7d\xfc\x47\x7f\xfc\xfb\x6c\x5d\x4c\xf8\x55\xff\x55\x33\x89\x83\xdf\x67\x6b\xc9\xa7\xfa\xbf\x8e\x57\xbb\xe9\x3f\x8c\x57\x55\xf2\xd5\xaf\xbf\xce\xa7\x7b\x72\xc8\xfb\x9c\x69\x32\x5f\x5e\x9d\xed\xe6\x39\xe1\xd7\x55\x16\x06\x99\x3d\x59\xf8\x75\xce\xf2\x6e\x35\xdb\x53\xc8\xff\x5a\xcd\xaa\x32\xa4\xb7\x3b\x19\xea\x08\x0e\xaa\x7f\x39\xdb\x93\x5e\xb9\xe6\x54\xfd\xcd\x6c\xf2\x8f\xdd\xf4\x7a\xad\x4c\xf5\xd7\xc9\x55\x43\x71\x39\x5f\x76\xb2\xb4\x5c\x38\xa8\xfe\xaf\xcb\xdf\x77\x32\xfc\xb0\xfc\x3d\x25\x9e\x4f\xc7\x9b\xe2\x62\x7c\xd9\x4e\xcc\x21\x4c\x55\xff\xd7\xe9\x7c\x5e\xc8\x40\x74\xbe\xad\x10\xea\x83\xfa\xdb\xaf\xff\x6f\x3a\xd9\xc0\xd9\xf4\xed\x6c\x31\xfd\x71\xb5\xbc\x9c\xae\x36\xef\x5f\x74\xa6\x54\xf5\xc7\x8b\xf1\xfc\xfd\x66\x36\x59\xf7\xd5\x0a\xce\xa6\xeb\xc9\x6a\x76\xb9\x59\xae\x4e\x96\x8b\xb7\xb3\x77\xdd\xcc\x3f\xb7\x87\xec\x97\xa3\x23\xd5\xbf\x5a\xa4\xc2\xcf\xfa\x7f\x39\xde\xbc\xbf\x9c\x2e\xdf\xf6\x7e\x9b\x2d\xce\x96\xbf\x7d\xf7\x5d\xfa\x85\xf3\xf1\xfa\x6f\xbf\x2d\xea\xca\xfb\x27\xf3\xf1\x6a\xb6\x79\xcf\x78\xbe\xee\x1f\xd5\xd9\xda\xaf\x61\x7c\x76\xd6\xad\xf8\xe8\x83\xea\xc3\xcb\xcb\xd5\x92\xfb\xb3\x7e\x39\xe3\x5c\x2f\xd7\xab\xc9\xcb\xb5\x24\xbf\x9c\x2c\x2f\x2e\xa6\xab\xc9\xb4\x48\xcf\xb0\x59\xf7\x5f\xbd\xbd\x5a\x4c\x36\xb3\xe5\xe2\xc5\x54\x6d\xd4\xe2\xe8\x8f\xfe\xd5\x7a\xda\x5b\x6f\x56\xb3\xc9\xa6\xff\xfd\x0d\x23\xa3\xfa\xff\xf5\x5f\xd3\xf5\xeb\xe5\xd9\xd5\x7c\xda\x57\x7f\x5c\x8f\xe7\x57\xd3\x57\x7f\x29\x3f\x08\x1e\xe4\x3a\x32\x2a\x34\x03\xfe\x1f\xe3\xc9\x66\xb9\x7a\xdf\x7a\xf3\xef\x17\x97\xf3\xe5\xfb\xe9\x74\xcf\xab\xff\xb5\x5a\x5e\x5d\xb6\xde\xff\x9f\xab\x5f\xe7\xed\x7c\x3f\x4e\xd7\xcb\xd6\xe3\xc9\x72\xb6\xf8\x61\xfc\xae\xf5\xe6\x87\xd9\x66\xb2\x9c\x2d\x5a\x6f\xfe\x73\xda\x7e\xfa\xbf\xcb\x45\xa7\xf8\xcb\x4e\x33\x7e\x5c\x5e\x2d\xce\xda\xcd\x3a\x39\x9f\x4e\xfe\xd1\x7a\xf1\x3f\x97\xf3\xf9\x78\xf5\xc3\x6c\x3e\x6f\xd7\x39\x5e\xb4\xf3\x9c\xac\xa6\x67\xb3\xcd\xc9\x78\x75\xb6\xf3\x61\xbb\xe8\xab\x55\xbb\x27\x3f\x6d\x96\xab\x76\x4b\xfe\xef\x78\x3e\x9f\x6e\xda\x19\xce\x97\x97\x97\xb3\xc5\xbb\x93\xf1\xaa\xfd\xfa\xc7\xd9\xbb\x77\xef\xb7\x1a\x50\x65\xed\x8e\xcc\xc9\x78\x3e\xb9\x9a\x8f\x37\xcb\xd5\xf1\xf5\x72\x76\xd6\x2b\xbf\xbf\x1e\xaf\x7a\xab\xe3\xc5\x8b\xfd\xb0\x73\xb5\x99\xcd\xd7\x2f\x1b\x88\x2f\x26\x02\xf2\x0c\x3c\x47\x6a\x76\xc7\x67\xeb\xeb\x77\xc5\x66\xfc\xae\x78\x37\x5d\x4c\x57\x5c\xa7\x7c\xf6\xfd\xde\xd6\xec\x63\x6c\xf7\x5c\x2f\xa7\xa0\x68\x18\xea\xe8\xeb\x4c\xde\xcd\x69\x2b\x3c\x7b\xa9\x48\xd1\x90\x42\xfb\x45\x41\xa7\xa6\xf5\x05\x17\xf1\xe6\x75\x50\x9a\x4e\xcd\x90\xc2\xa9\xa6\x4a\xec\x69\xfe\x7b\xd0\x52\x37\xb3\xa5\x21\x59\x70\xfe\xd4\x0d\x11\x6b\x96\x53\x16\xa8\xf0\xda\x80\xf3\xe7\x7b\xab\xca\xc1\x2b\xee\xe1\xc0\xa3\x8e\x73\x41\x12\x97\xa9\xac\xae\x41\xa2\x22\xa5\xab\x84\x49\xca\x57\xf7\xf8\x5a\x4d\x53\x2b\x19\x89\x2c\x45\xd5\x35\xa4\x98\x91\x72\x95\xa8\x55\xf9\xfa\x04\xb5\xda\x56\x5f\x83\xf4\xb2\xfe\x17\x24\x2e\x54\xba\x9a\x56\xd7\x9f\xa0\x56\xd7\x19\x61\xee\x62\x59\x5d\x4d\xab\x8b\x12\x70\x2a\x5f\xe9\xf1\xb5\xfa\xce\x08\x13\xb5\xfe\x99\x1c\xe4\x8b\xaf\xd2\x88\x7c\x7d\x82\x5a\x43\x67\x84\x9b\x49\x75\xad\x6a\xca\xd6\x50\x87\x27\xa9\x35\x76\x47\x58\x82\xa5\xa5\xab\x96\xe9\x4c\xd7\x14\x24\x31\x5f\xc3\xe3\x6b\xc5\xb2\x3b\xc4\xd2\xdf\x74\xd5\x25\xd7\x93\xae\xcd\x58\x9b\xa7\xa9\x16\xbb\x63\x2c\x80\x9c\xae\x5a\x86\x36\x5d\x1b\x24\x0a\xfb\xab\xbd\xe7\x9e\xd2\x93\x91\x4a\x24\x45\x61\x88\xe5\x29\xb9\x73\x7a\x73\x51\x16\x4e\x1e\xca\xd6\x03\x1a\x7e\xf0\x0a\x69\x88\xbe\x9d\xcf\xb7\xf3\xf9\x76\x3e\x32\xad\x7c\xfc\x50\xb6\x1e\x52\xbe\xb2\xf0\x5c\xb8\x1d\x92\xdb\x51\x97\xda\xac\xef\x29\xf8\x8a\x55\x48\xa7\x11\x4a\x3b\xf6\xca\x27\x3d\xa1\x40\xa3\xca\x6b\xdf\xd0\x71\x1e\x17\x6e\x5a\x38\xe5\x7e\xea\x94\xdd\x2a\x9b\x55\x18\x2c\x39\xd9\xd5\x4a\x4d\x9d\xdf\x9e\x6a\x1a\xba\x53\x34\xc3\xc8\x5f\xf2\x2c\x40\x19\x07\x08\x11\x95\x5c\x52\xe9\x96\x6f\xb5\x19\xea\x72\x5f\xaa\x26\x25\x9f\x9d\xe2\x61\xfc\xea\x76\xe0\x40\xad\x22\x10\xed\xb4\x9e\xce\x79\x14\x88\xb6\x46\x41\x12\x1e\x53\x2d\xb5\x86\xf9\x5a\x03\x36\x9a\x5f\x21\x83\xc4\xe3\xd9\x7a\x5f\x36\xef\xf7\xc0\xac\x2e\xb7\x60\x36\x0d\xc9\x56\xe0\x80\x4a\x5c\x7a\x02\xe8\xc0\x08\x9e\x58\x97\x35\x7e\x8c\x08\xce\xaa\x74\x4d\xdc\xdd\x81\x46\xb0\x34\x80\x00\x21\x4f\x3c\x1a\x85\x04\x46\xf4\x5f\xc4\x7c\x4d\xea\x27\x46\x56\x9d\x91\xc6\xad\xec\x40\xa1\x40\xb0\x7e\xcf\x08\xdf\xb2\x27\x74\x83\x28\x32\xf9\xfd\xb8\x4f\x16\x74\x48\xab\xf1\xe8\xc0\xa3\xac\xc8\x23\xe8\x7d\xcc\xf1\x01\xce\xc3\xb4\x05\x8b\x4a\xac\xae\x5a\x52\x0e\x04\x53\x70\xdf\x34\x18\x4a\x97\x3c\x91\x50\xc6\x02\x01\x49\xa1\x07\x6d\xf3\xb5\x4a\x73\xba\xd0\xe0\xc3\x9c\x20\x84\xc2\x80\x1d\xc8\xa2\x82\x5c\x32\xe0\x6b\xe5\xc7\x08\xde\x2b\xb9\x64\x89\x0a\xb4\x2e\xd2\xc0\x52\xbe\xa6\x04\x0b\x3a\x82\x67\x30\x93\x29\x93\x6b\x4a\x49\x2f\xc0\x69\x85\x4e\x96\x2c\xe4\x5a\x7d\x85\x8e\xcb\x8c\x27\x88\xa0\x51\x39\xd0\xca\x40\xd0\x5c\x74\x54\x46\xa1\x1f\x9a\x31\x81\x75\x4a\x2e\xa9\xed\x08\x5a\xa6\x4d\x73\x6b\x31\x5d\xd2\x1c\x03\x9a\x02\xc1\x28\x04\x8c\xe9\x92\xdf\x1b\x5d\x80\xe1\xfc\x65\x48\x97\xaa\x37\x48\x05\x42\xb0\x03\xcd\xb5\xcb\x25\x75\x5e\x88\x80\x1e\x1b\x55\xb5\x14\xb4\x56\x1a\xca\x30\x30\xe0\x9d\x92\x4b\x1e\x26\x9e\x8f\x68\xe7\x10\x09\x8c\x1b\xa3\x07\x1b\x54\xba\xa6\x0c\x08\x81\x94\x9f\x03\x0f\x7f\x18\x90\x56\xa4\xeb\x45\x16\x52\x1a\x21\x84\x16\xa9\x03\x6f\x41\x9b\x73\x03\x96\xda\x6f\x23\x49\xb7\x47\x68\x15\x45\x88\x66\x8e\x80\x01\x50\x8f\xa9\xe4\x96\xa5\x6b\xca\x6b\x54\x39\x01\xed\xc1\xa5\xa9\xe3\xb1\x27\x1e\x25\x1f\xdb\x05\x06\x30\x78\x6e\x40\x9b\xdd\x5a\xe2\xa4\x00\xf4\x05\x98\x02\xb4\x29\x20\xf0\xd8\xf9\x02\x81\x0a\xc0\x50\x80\xd5\x05\x68\x2a\x90\x47\x94\x47\xdb\x0e\x50\x03\x06\x95\xae\x99\x38\x44\x99\x33\x37\x46\x02\x81\x09\x5b\x8f\x56\x5e\x76\xca\x9d\x0d\x05\x38\x9a\x13\x90\x2b\x2c\x04\x1c\x34\x69\x2d\x58\x7f\x73\x21\xa0\xaa\x2c\x18\xc3\x74\x40\x7b\x95\xae\x15\x2c\x6b\x5b\x00\xe2\x79\x39\x0e\x40\x8a\xff\xaa\x04\x6e\x6b\xf0\xaa\x85\x2b\x51\x27\x70\x46\x14\xb0\xc4\x1a\x4e\x79\x98\x22\xcf\x1a\xff\x5f\x01\x1a\x43\x0b\xba\x79\x81\x50\x3a\x30\x61\x0d\x26\x2a\x02\x8c\x3c\xa5\x1a\xd0\x0d\x89\xc0\xf3\x78\x51\x1a\x2c\x1e\x0e\x6e\x8f\x6b\xee\xe6\x05\x38\x0f\x65\x1c\x63\x10\x90\x95\x6b\x2a\xdf\x00\x59\x40\x9a\x14\xe0\x5c\x01\x25\x7f\xe4\x5d\x01\xc4\xd8\x49\x05\x68\xcb\x15\x5b\x5b\x00\xf9\x35\xe3\x0f\x81\xd1\x8c\x63\x04\xde\x5c\x97\x43\xa6\x8b\x34\x90\x45\x5c\x95\xae\x09\xda\x3d\x03\x27\x71\xc5\x3c\x5d\x3a\x0e\xd0\xe4\xb5\x43\x97\x47\x46\x39\x86\x50\x13\x26\x60\x0d\xe3\x60\x54\x8e\x31\x21\x0a\xcd\xe4\xfe\x15\x01\xac\x19\x8b\x15\xa0\x4a\xd7\xf4\x9d\x4d\x08\x64\xc2\x1c\x1c\xc9\x78\x31\x6c\x0c\xb0\x04\x8a\x2a\x5d\x53\x46\xf2\x4a\x8a\x08\x40\x56\xc9\x25\xbd\x37\x05\x38\x3b\x2f\x34\x68\x9e\x4e\x8a\x3c\x02\xf6\xbc\x1c\x13\x8f\xb3\x4a\xd7\x3c\xff\x8c\x8c\x06\x82\x51\x8e\x47\x5d\x2e\x19\xb8\x80\xc9\x3c\xe8\xf8\x04\xfc\x98\xc9\x62\x80\xe0\x07\x96\xa9\x8e\x5c\x52\x43\xb5\xe6\x21\x72\xc8\x2d\xe3\xa1\x97\x6b\x9a\x36\x0d\x14\x0b\x6e\xd9\x5c\x83\x8e\x05\x77\x63\x0c\x11\x62\x05\x62\xd6\x08\xae\xaa\x08\xce\xa7\x4b\x4d\xec\x74\x22\x8e\xaa\x26\x9b\x1a\x50\x2b\x1a\x30\x6d\xf0\x2a\x5d\x33\x34\x06\x70\xca\x03\x5a\xa6\x8c\x41\x39\xb0\xc4\x03\xe6\x33\x65\x04\xcb\xc4\x91\xa7\xd8\x14\x50\xfa\x01\xc9\x9c\x57\x54\x09\x15\x41\xe4\x89\xa3\x58\x73\x6c\xa6\x8e\x56\xe0\x89\xc7\x8e\xd2\xa5\x22\x8f\x8c\xed\xa1\x43\x1e\xb1\x4d\x1e\x99\xab\xe4\x4b\x45\x38\x89\xf1\x88\xec\x40\xd6\x80\x4d\x33\x6d\x3c\x61\x68\x21\x66\x09\x27\xcd\x97\xf5\x4a\xcf\x51\x09\x4c\x05\x81\xc5\x50\xc1\x22\x4b\x16\x1e\x84\x28\xd6\x74\x91\x79\x80\x8f\xaa\x43\xad\x74\x38\xd7\x3c\x1d\x60\x89\x87\x22\xbf\x37\x05\x78\x3b\x42\xa3\x74\x09\x3a\x8c\x19\x7c\x2b\x31\x46\x18\x15\x60\x98\x40\x4c\xb0\x05\x65\x60\x90\x22\x08\x4c\x88\xc7\x62\x4d\xad\xd2\xb5\x82\x38\x9e\x96\x89\x30\x32\xa9\x5f\x56\xb6\x01\x79\xc0\x82\x1d\x43\xd4\x4c\x3d\x2a\xca\xe5\x99\x80\x6a\x40\x1c\x83\xb3\xb5\x50\xa2\xc0\x61\x01\xc1\x32\x49\xd0\x05\x78\x23\xf4\x12\xc1\xdb\x02\xbc\x90\x2a\xcf\x68\x25\x93\x53\x33\x5a\x4e\x65\xd4\x9f\x30\x37\x04\x26\x6d\x54\x00\x31\xc1\x61\xf4\x1d\x33\xd4\x78\x95\xae\x15\x61\x33\x54\xa0\xca\x92\x8c\x4c\xa1\x17\xe2\x23\x14\xcd\x99\x7c\xad\xbb\x25\x64\x8c\x4b\xd0\xd5\xb5\x9a\x19\x17\x84\x91\xb7\x58\x00\x13\xa3\x39\x82\xd7\x85\x01\x63\x3a\x04\x39\xa1\xca\x9b\xd7\xdc\x94\xc8\x75\xd8\x38\x86\xe0\x20\xb8\x7a\xcc\xa1\xb4\x10\xf8\x5f\xfd\xa6\x48\x0d\x22\x30\x98\xaf\x99\x04\x81\x8b\x05\xd8\x26\x3b\x4a\x76\x96\x14\x84\xa0\xb0\x2c\x21\xd7\x8c\x0f\x4d\x9d\x6f\x2e\x50\x60\x80\x69\xd6\x18\x45\xaa\xe3\x4b\x16\xa7\xc1\xc8\x48\x98\x41\x3b\x45\x50\xc2\x09\xd8\x7b\xf0\xbb\x52\x6b\x67\xed\x6f\x4b\x70\xad\x24\xc1\xdf\x8f\xfb\x3c\x76\x3a\x89\x77\xc4\xd2\x8e\x88\x77\x04\x74\x8f\xf8\xbe\xb2\xf1\x73\x83\xac\xc9\x02\xa4\x7f\x5c\xf1\xb4\xa7\xf8\xd6\x2e\x13\xe3\xb6\x05\xed\xdb\xd3\x4a\x0c\x0f\x76\x88\x08\x26\xce\x19\x90\x69\xa8\x71\x44\x69\x5f\x27\x9e\x17\x68\x47\x21\xc9\x3c\xb6\x23\x75\x32\xcf\x72\x76\x64\x18\x8a\xa8\x51\xbe\x0a\xb0\x8c\x3a\x91\x46\x5e\x59\x70\x66\x6e\xe4\x85\x01\x3b\x8a\x10\x2d\x53\x52\x13\x98\x70\x31\xe9\x1b\x10\x38\x46\x4d\xe7\x6a\x91\xc8\x1b\x45\xc2\xe2\xf2\x25\x4f\x3f\x29\x72\x43\x0a\xe0\xda\x52\x4c\x59\x10\xb7\x3b\x98\x31\xf3\x58\x57\xa1\x07\x58\x57\xe0\x9c\x61\xad\xa0\xa1\x44\x8e\x6d\x7d\x83\x05\x4b\xbd\x9a\x25\x1c\xec\x80\x77\x3d\x38\xf7\x8a\x1e\x75\xeb\x6c\xde\x13\x5e\x0e\x36\xcc\x79\x2a\x08\x3a\xd8\x30\xe6\xc6\xb5\x98\x7a\x59\xa7\x04\x8f\x3d\x9f\x4e\x68\xf4\x64\x3f\xd7\xc4\x9e\xd8\x0c\xa0\xe9\xa5\x03\x23\xd8\xf3\x8f\x0b\x8b\x70\x0b\x68\xf3\x2c\x5b\x11\x55\xd4\x9f\x1c\x72\x91\xb5\x3a\x03\xe1\xa6\xcd\xd4\x83\x4f\xca\xde\x32\x98\x8e\x29\x32\xb2\x98\x25\x26\x03\x0a\x71\x80\x40\xcc\x45\xa8\x96\xf0\x49\x44\x00\x3d\x94\xcd\xfe\x9d\x64\xd9\xab\x57\x88\x23\xd9\xa4\x97\xb2\x76\x8b\xa8\xab\x79\xd3\xef\x3d\xdd\x01\xce\x27\x45\xc8\x83\xcc\x90\x9f\x0e\x1d\x0f\x32\xd4\xbd\x65\xe2\x44\xd4\xf2\x63\xcf\xec\xd1\x57\x72\x12\xb2\x84\x58\xa0\xda\x7a\xab\xe4\x6d\x9b\xee\x3f\x2a\x18\xd5\x6d\x7c\x47\xd8\xb7\x9d\x17\xb2\x36\xf1\x67\x67\x2d\x08\xd6\x17\x0e\x22\x0e\x3c\x6b\xb0\x72\xc9\x3a\x45\x1a\x87\x07\x0c\xb3\x39\x0c\xd8\xb6\x2d\x41\x6f\xc2\xaa\x7b\xfb\x06\xbb\x03\xa7\x6c\x0d\xe3\x15\x88\x6f\x43\xf8\xcd\x5a\xd8\xad\xc8\xe3\x1e\x5e\xf4\x5d\x92\x90\x2c\x36\xc5\x1d\x41\xc8\x0d\x23\x10\xd6\x60\xe9\x6f\x02\x4b\x77\x23\x58\x06\x06\xcb\x20\xa6\x3a\xbe\x81\xcb\xf8\x89\xe1\x92\xb6\xe0\xd2\xcd\x35\x50\x81\xba\x2b\xf1\xa4\x41\xd8\x06\xc8\x1b\x46\xf4\x6e\x61\xe7\xc0\xc9\x3a\xd0\xcc\xf1\x69\x20\xe3\x20\xdb\xb9\x3b\x88\x2a\x73\x3a\x0b\x66\xc0\xac\x4e\xc9\xa5\xcc\x6b\xca\x2a\x42\x88\x23\x42\xa0\xf8\x27\x06\x1d\x04\x4c\x2b\x1e\x7b\x21\xe5\x96\x11\x3e\x50\x78\xfb\xec\xf2\xc6\x5d\xfd\xb8\x29\x9a\xd6\x53\xe1\xc3\x01\xe7\x3f\x9e\x0a\x1b\xee\x3c\x60\x70\x00\x27\x67\xce\xc6\x8c\xad\xd2\xac\x09\xec\x9f\x1a\xfa\x3d\x16\x7e\xe0\xc1\x44\xe5\xab\x65\xc8\x1b\xb9\xf9\x1d\xc3\x7c\x9b\xc0\x74\x38\x27\xbf\xa3\x92\x1b\x82\x7a\x6e\x2d\x7a\x64\x0b\xa8\x27\xd8\xa7\xd3\xa4\xd0\x0e\x35\x9e\xc6\xb6\xf1\x4d\x81\x43\xd7\xda\x57\xc4\x02\x02\x9d\x3a\x08\x34\x68\x8c\x42\x9d\x72\x43\x59\x76\xdf\x9a\x29\x37\xd0\xaa\x59\x0e\xf4\x63\x51\xce\x75\xbd\x73\xa3\x4a\x05\xda\x9d\x92\x87\xa8\x07\x06\x50\xf1\x5f\x7a\xef\x99\x80\x68\xd9\xac\x6c\x4f\x24\x9e\x92\x3d\xc7\xad\x57\xe8\x3a\xfc\x5f\xa1\x7d\xf3\x9a\xa2\xd2\xe5\xd0\x27\x80\x43\x54\xd4\x6c\x21\x5a\x25\x15\x9e\x46\x08\x61\xa0\xf9\xbd\x6e\xdb\xbb\x62\x39\xa4\x78\x6d\x87\xf5\xf6\x6e\xae\xa8\x3c\xf7\x6f\x2e\xa8\xf0\x9c\x50\xf5\x8a\xa1\xdf\x0d\x35\x3e\xdd\xce\xa3\x86\x12\x33\x0d\x28\xf3\xb6\xa3\x7d\x82\xf5\x71\x92\x2d\x3b\xb3\x77\x72\x5b\xf3\x68\x95\x1f\xda\x53\xbf\x3b\xb3\xed\x6d\xf9\x34\xb1\x52\x22\xd5\x7b\x80\x4a\x2b\x07\x21\x5c\x13\xf2\x44\x8a\x51\xb1\x6e\xa6\xd2\xee\x9f\x4a\x77\x8e\x10\x4d\x77\x49\x16\x0b\x88\x78\x5d\x60\x39\xd8\xda\xe6\x53\x55\x27\xde\x30\xa0\x92\x99\x17\x41\x76\xe7\xc6\x1a\x82\x57\x72\x29\xf3\xc2\xbe\xd7\x85\x51\x5b\xaf\x55\x7a\x3d\x62\xf8\x70\x07\xce\xd7\xcd\x32\xa9\xcc\x95\x81\xd2\xe4\x5d\xe2\x08\x91\x5a\xd3\xd5\x5d\x95\x14\x93\xc5\xa7\xb1\xde\xd3\xe5\x10\xdd\x29\xd1\x10\xcd\x75\x18\x06\xbe\x73\xd7\xe1\x2e\xa3\x14\xe2\x77\x4f\x64\xa6\xa7\xd3\x0a\xae\x06\xf2\x8a\xb5\x61\x54\x16\x10\xdb\x56\x2f\x1e\x22\x29\x33\x0c\x50\x76\xcc\x67\x58\xb6\xe2\xac\x23\x92\x8d\x4c\x2e\xa0\x69\x66\x01\x84\x10\xaf\x99\x34\xb4\xda\x0e\xc6\x09\xe7\x1f\x18\xa6\xf4\xa6\xde\x83\x51\x4e\x51\xc9\x4a\x9b\x01\x4f\xca\x34\x9b\x7f\xba\x40\x28\x39\xa7\xd7\xe9\x52\x65\x2f\xef\xf3\xae\x53\xa4\x93\xdd\x47\x4b\xad\xae\x68\xa3\xd0\x03\xb9\x53\x34\x80\xbe\x9d\xd0\x8c\xcd\x1b\x61\xb2\x21\x33\xbc\x20\x6b\xf4\x15\x9f\xf5\x10\x48\xa1\x1f\x91\xec\xca\x85\xc0\x22\x0d\x46\x85\x7e\x4c\x3c\x9e\x72\x29\xf3\xd6\xa2\xf6\xac\x6a\x63\x95\xb1\xbc\x3d\x63\x5a\x3c\x0b\xc2\x7d\x6f\xcd\x18\x73\xbe\x20\xbb\x0a\x7e\xa7\x8d\x4e\xe5\x7d\x69\x70\xc2\xee\xf3\xea\x7b\x41\x05\x84\x90\xfa\x3d\xe2\x09\x66\xea\xc0\xf3\x2d\x68\x65\x00\xdd\x35\x38\x3f\x2f\x15\xb1\x52\x46\x3c\x61\x54\x33\x69\x55\x8d\xc8\x13\x6c\xf8\x7d\x02\x54\xb8\xdd\x14\xe7\x19\x0d\x0e\x44\x03\x06\x49\x03\xe6\x1a\xc1\xd2\x88\x73\x86\xbb\xc1\x92\x4b\x34\x23\xd9\x25\x52\x6e\x88\xee\xcd\x05\x92\xec\x57\x8f\x0e\xc5\x94\xb9\x98\x63\x71\x29\x54\x2a\x77\x6e\xc0\x58\x41\x37\x03\x66\x67\xd7\x48\x2c\xcc\x9f\x42\x7c\xe2\x16\x2a\x0a\x60\x3a\x2c\x16\x74\x28\x40\xd3\xa0\xd9\x2f\x4e\x3b\x68\x56\x31\x2c\x32\xce\xec\x8a\xb7\x51\x8f\x51\xb6\x3b\xb1\xde\x4a\x67\x51\xc3\xec\xcf\x4f\x62\xbd\xd1\x2a\x5e\x97\xac\x3d\x79\x68\x8b\x63\x98\x2d\x13\x06\xc8\x3c\xb4\x16\x6a\x40\x27\xb9\x40\x36\x75\x1b\x16\xaf\x68\x18\x21\xe2\xb8\x95\xb9\x90\xed\x57\xd5\xfe\x5c\xde\xec\xf9\xf6\xdc\x71\xd5\xad\x8c\x54\x42\xd0\xdc\xa0\xce\x96\x55\x33\x5e\x4f\x61\x92\x17\x14\x0d\x78\xc4\x5c\x6e\x87\x96\x63\x55\xd5\x1b\xe9\x6d\x50\xf4\xe6\xc2\x83\x21\x45\x16\x58\x6a\x2c\x85\x56\xca\x35\x8d\x5c\x64\xf5\x94\x70\x68\x59\xc3\x68\x1d\x7a\x2a\xe8\x5c\x4f\xca\x42\x4c\x54\xca\xb4\x09\xcc\xbf\x8c\x66\x6b\xd6\x8c\x74\x32\x4a\x39\x2f\x74\xf7\xab\x61\x04\x8c\x52\x8f\x53\xe9\x9a\x79\x80\x05\xcd\xd4\x97\x75\x1b\x20\x2b\x9b\xf0\x95\x5c\x04\x2c\xde\x00\xd2\x20\x80\x96\x83\x59\x75\xfb\xc5\x06\x09\xed\x79\x04\xed\xba\x47\xb2\x18\x68\xb4\x1e\x7b\x46\x58\xdf\x60\x2d\xcf\x45\x84\x40\xbb\x99\x83\x1f\xef\x14\x4f\x40\xa4\x8c\x6a\x37\x28\xed\xc5\x6a\x2d\x0d\xda\xc1\x9c\x7c\x58\xe3\x29\x44\x9b\x64\x35\x62\xc7\x0e\x22\x2a\x57\xdb\x6d\x32\x5e\x87\x42\x33\xfe\x70\x96\xba\xa9\x4c\x03\x00\xe3\x69\xe0\x71\xc2\x12\x4a\xd9\x66\x2e\x6b\x55\x56\xa7\x01\xef\xc0\xbf\x58\x12\xd8\x01\xa2\x6c\x4a\x63\x4b\xd3\x14\xc3\x99\xd3\xf6\xda\x35\xa9\xf2\xd4\x4d\x0a\x03\x06\xb0\x70\x0c\xbc\x04\x14\x0b\x0f\x96\xc9\x2a\x86\x81\x05\xeb\x94\xad\xac\xd9\x64\x6e\x9c\x53\x28\x1b\xfc\x94\x2e\x39\xc1\xcb\x7e\xbb\x39\xa5\x30\x46\x02\xad\xe4\x92\xa6\xda\x03\x9a\x82\xc0\x9b\x41\x83\x3e\x41\x8c\x93\x1c\x08\xb1\x2a\x63\xbe\xd6\x65\xe9\xf2\x5a\x6f\x99\xd4\xea\x72\x42\x10\xa8\x48\x06\x40\xa5\x67\xa8\x64\x15\x57\x17\x06\xbc\x1b\x58\x9e\x3e\xdb\x18\x96\x55\x43\xfd\xe6\x35\x92\xd0\x69\x0b\x9a\xc6\x5a\xac\x3b\x6a\xeb\xa3\x82\x55\x76\x1e\x7c\x31\xe9\x33\x62\x2a\xe8\xa4\xed\x56\xab\x64\x6c\xe0\x55\xb8\x0e\x10\x64\x93\x5f\xf6\xf8\x1b\xda\x56\x95\xfa\xe6\x35\x19\x30\x8a\x0c\x58\x37\x29\x18\x2c\x29\xf5\x58\x8b\xdd\x95\x2f\x2c\x88\xbd\xe3\x29\x32\xde\x4d\xc0\x99\x6c\x13\x04\x5a\x91\x02\x8b\xb5\x06\x26\x3a\x5a\x64\xb1\x82\x06\x9a\x69\x96\x5c\xf2\x64\xd7\x75\x3c\x8e\x8c\x74\xbf\xe4\xff\xee\x49\x57\x9c\x2c\x75\xd8\x38\x29\x50\xe9\x42\x83\xe3\x56\x07\x53\x58\x88\xca\x5c\xd3\x0e\xa6\x8b\x3d\x1d\x6b\xbf\x36\x32\x54\x1a\x31\x67\xab\x8d\xb4\x58\x69\xb5\xe3\x5d\x64\xf4\x62\xd1\xa6\x95\x98\x79\xc5\x46\x73\x35\xc9\x26\x28\x9a\x53\x86\x37\x3d\x8e\x3c\x61\xb1\x6d\xef\xe4\xc5\xd0\x4f\xcc\xb1\xe4\xaf\x9a\xe9\x88\x05\xd3\xbb\x09\xd8\xc8\x18\xc2\x7c\xd5\x50\xa1\x99\x14\x5a\x70\xa6\xd0\x60\xf1\xd4\xc1\x56\x6b\x92\x7d\x12\xf7\x20\x00\xe2\xb8\x6b\x26\xc5\x95\x44\x1e\xb8\xed\x0f\x34\xf7\x31\xda\x31\x83\xbe\x92\x4b\x42\x38\x0d\x24\xf6\x56\x78\xed\x00\x19\x14\x64\x01\x11\xc8\x88\xb1\x14\x44\xe6\x15\x63\x31\x31\x69\xcc\x52\x94\x06\xc7\x30\x11\x88\x25\x23\xa3\x4c\x2d\xa7\x32\x7d\xe5\xd9\xd0\x60\x1f\xc5\x5b\x2a\xbb\xeb\x92\x65\x39\x8c\xe0\xcc\x44\x0c\x2a\x91\x0a\xf0\xb1\x00\xa2\x02\xc5\xc8\x52\x5f\x5b\xf0\x6e\x42\x05\x30\x64\x97\xbe\x80\xc8\xd8\xa4\x19\xd6\xc7\xc4\x0a\xb0\x5c\x2a\x46\x2a\x16\x5c\x61\xa0\x19\xd7\x75\xcb\x24\xae\xa9\xe7\x31\xad\xd6\x95\x91\xba\xe8\xcb\xc4\x23\x47\xc9\x66\xaa\x36\x19\x4a\x06\x54\x22\xd5\xa5\x4b\x6e\x00\xb0\x92\x4d\xa7\x58\x82\xb5\x27\x68\x45\x04\x29\xa1\xd6\x27\x50\xec\xc2\x9a\x72\x77\x38\x42\xeb\x4c\xdf\x8d\xe7\xb0\x49\xb9\x61\xe7\x98\x84\x0a\xa7\xb4\x2d\xb8\x77\xad\xd6\x0b\x3a\x6d\x0b\xd1\x5c\xc4\x9b\x0b\xa1\x7e\x0a\x69\x68\x46\x46\x85\x37\xaf\x8d\xa2\x70\x4a\x66\xa8\xe9\x7a\x67\x85\xfb\x9e\xa6\x3c\xe2\xe3\xee\xf7\xe3\xbe\xef\xf7\xde\x1f\xf7\x75\xbf\xf2\x77\x47\xd4\xf2\x77\x57\xf6\x7b\xab\xdf\x8f\xfb\x25\x44\xd7\xef\xad\xde\x57\x77\x9b\xd5\x78\xb1\x7e\xbb\x5c\x5d\x1c\xf7\xe5\x76\x3e\xde\x4c\x5f\x68\x77\xd4\x5b\x2d\x37\x7c\x1b\xcb\xa3\xe4\x28\xef\xb8\xbf\x58\x2e\xa6\xfd\xde\x7a\xb3\x5a\xfe\x63\x7a\xdc\xff\xff\x95\x65\x59\x3d\x15\xdc\xbe\xff\xb7\x9c\x2d\x8e\xfb\xab\xe5\xd5\xe2\xac\x7e\x5f\x35\xe4\xe1\x1b\x73\x1f\x63\x22\x30\x0c\xcd\x29\x95\x43\xbd\xb3\xf9\x7c\xdb\xb6\x5e\xf7\x00\xff\x4d\x87\x0d\xa4\xa9\x60\x65\x95\x96\xd5\x52\x65\x81\xf4\x1c\x0d\x58\x39\xb4\xde\x5d\x53\x02\xaf\x47\x4c\x8e\x19\x8f\xc4\x66\x99\x49\x65\x4b\x38\x15\x02\xaa\xef\x05\x1d\x37\x0f\xa0\x11\xd3\xe8\xa6\x7a\x85\x43\x8d\x5b\xc2\x39\x85\x53\xf4\xe0\xf4\x90\xdc\x29\xd9\x21\xc6\xfc\x88\x5e\x1e\xcb\xfc\x18\xf8\xc9\xb6\x84\x63\x2e\xfb\x5e\xe7\xec\x6f\x84\x61\x0b\x25\x09\x18\xa3\x69\xe0\xb8\xe5\xb7\x71\x1b\x94\x6e\xb5\x93\xba\x6d\x2f\x56\xdc\x2b\xb4\xbb\xcf\xd0\xa3\xbb\xe3\x71\x8f\x2e\x99\x5b\x2a\x23\xa1\xa6\xac\x20\x86\x73\x0d\x84\x23\x0c\x4c\xef\x59\xf2\x1d\xd7\xe6\x94\x65\xc1\x37\xf3\xc2\xb1\xe0\xc1\x02\xa1\x64\x9d\x6b\x88\x05\x01\xdd\x87\x44\xdc\xb4\x02\xfb\x19\x81\xe0\x30\x9b\x96\xa7\x06\x8a\xc3\x4c\x5b\x3e\x12\x90\x1c\x66\xc0\xf2\x59\x80\xe6\x09\x9a\x66\x95\x9b\x24\x1d\x9b\xd5\x4c\xe2\xab\x09\x07\xd0\xb2\x51\xa6\x88\x8a\x08\xbc\x57\x61\x67\x83\x2b\x95\xfd\x28\x6b\x95\x5b\x26\x14\x45\x16\x60\xe9\x6d\x0e\xd6\xb1\x26\xd1\x56\xb9\xc4\x88\x17\x23\xb7\x89\x07\xda\xd4\x82\x5b\xf3\xd9\x03\x1a\x66\x6f\x6e\xd8\x6d\x7b\x6f\xf7\xad\xc6\xed\xdd\x7e\xfb\x02\x29\xc1\x61\xe6\xa6\x1f\x0d\x2b\x0f\x33\x3e\xbd\x03\xf8\xd1\x0e\x58\xcd\x50\xba\xb1\xb3\xa2\x52\xa1\x19\xda\x6b\x1a\x6a\x3c\xc5\x9b\xed\xad\x0e\xb3\x3a\xbd\xb9\x7e\x8c\x60\x9c\x6c\x43\xcf\xc1\x85\x24\xd0\x8b\xfa\x2b\xc7\x05\x0e\x24\x0c\x0a\x01\xc1\xe9\x13\x8c\xa0\x93\x39\x89\x1c\x55\x24\xbe\x4d\xa7\x16\x53\x15\x8f\x34\xf7\xbc\x75\x14\x4b\x56\x8e\x58\xdf\xba\x07\xd1\x40\xfe\xea\x26\x5b\xe9\x03\x0d\x37\x6f\x6b\xd5\x67\xb0\x09\xb9\x77\x4f\xdc\x7e\xb3\x90\x5b\x10\xa6\x16\x47\xe5\x54\x9c\x0b\xa7\xe8\x04\x48\x09\x3c\xce\x59\x55\x65\xd0\x79\x88\x60\xfa\x1a\x3d\xf7\xc4\xcb\x81\x94\xd6\xb9\x90\xa0\xca\x11\xd9\x74\x64\x6e\x28\x8c\x6c\x5e\x54\xa0\x37\x42\x23\xe7\x42\xc5\x08\x74\x77\x04\x6e\x54\x0d\x6e\xd3\x0c\xb8\x11\xe4\x59\x95\x62\x2c\x18\xe4\xe3\x33\x58\x9f\xff\x2b\x25\x83\x6d\xd1\x33\xc3\x24\x8b\x2a\x02\x86\x89\xbc\x51\x87\x9e\x01\xee\x96\x64\x64\xf3\xcb\x9e\x72\x65\xfb\xd2\x49\x51\xe0\x74\x8d\x43\x6d\x4e\xe5\x7e\xb7\x35\xb9\xb9\x07\xeb\x1e\xdf\x46\xcf\x0f\xb1\x47\x3a\xc4\x46\xc8\x78\xe5\x9b\x65\x29\x32\x4c\xe0\xee\x84\xc2\x39\xd3\xc9\x82\xe9\xe4\x36\x1c\xcf\xad\xac\x3d\xec\xc8\x04\x8f\x91\x81\xb6\xd0\x50\x83\xa1\x81\x07\xab\x95\xaf\x8f\x69\x3e\xd0\xd0\xe7\x20\xa9\xf6\xc9\x85\xa0\x83\xad\x8f\x3e\xb5\xf1\xd1\xb7\x82\x39\x87\x58\xb6\xde\x29\xd1\x8c\xb7\x24\x9a\x42\x17\x16\xc8\xcd\xe5\xb4\x67\x5a\xee\xb4\x05\xf8\x70\x38\xea\xa4\xad\x0b\x85\xe0\x6c\x41\x10\xdc\x03\x70\xe3\x26\x04\x38\xc4\xbc\xf6\x0b\xe6\xf3\x87\x9b\xb0\x6e\xf1\xf8\x3d\x1b\x5a\xe2\xb6\xec\x69\xec\xe9\xc2\xd0\xb4\x76\xf7\x49\xd1\x29\xb9\xbb\x16\xd8\xb0\xec\xae\xb0\x85\x37\x17\xa5\x72\x63\xc3\xa2\x9d\x69\x76\x0f\x98\xf0\x9a\xa1\x26\x59\x7f\x03\x47\xd7\x06\x82\x1e\x58\x08\x5e\xd9\xca\xea\x49\x46\x4c\xf6\x93\xce\x0b\xf4\x3b\x89\x46\x51\x09\xc6\x9c\xa2\x05\xb7\x93\x18\xe5\xe0\x7e\x79\xbe\xe7\x3b\xb1\xb1\x03\xf7\xe6\xb5\x87\xa8\xb0\x1c\x6c\x35\x4d\x19\x85\xe6\x14\x4b\x59\x92\x25\x28\xdd\x4e\x06\xfe\x8e\xdc\xd0\xbc\x79\xcd\xd8\xa9\x68\x37\x87\xa6\xf4\xe9\x29\x1d\xb6\xab\x73\x80\x7f\xb1\xb4\xd3\x6b\x27\x85\x16\x6e\x56\x38\xd0\x8a\x65\x78\xb9\xf1\x80\x76\x4d\x69\x97\x1a\xad\xaa\x5e\xf1\x4d\xc1\x99\xe4\x86\xdf\xfc\x44\x69\xa7\x46\xa8\x59\x55\xa6\xcc\x01\x81\x8b\x93\x82\xc0\x46\xd9\xb7\xf4\x05\xa5\x3d\x34\x5f\x58\xb0\x5c\x38\xa2\xdc\xa9\xea\x15\xdf\x28\xce\x24\x37\xfc\xe6\x27\x2a\xf9\x73\xd2\xb2\x97\x13\xd2\xcd\x53\x9c\x8f\x7f\x2a\x48\x14\x25\xf7\x54\xf6\x0f\x07\x16\x44\x8b\xc0\x8a\x42\x05\xf0\x3c\xab\x9c\x47\xc2\x3e\x9d\x62\x39\xe4\x77\x3b\x19\x73\xfa\x1b\xd9\x5b\x63\x0a\xdf\x9e\x92\xa2\x9a\x92\xa2\x9e\x92\xa2\x9e\x89\x7a\x6e\xaa\x29\x51\xad\x29\x91\xa2\x54\x55\x66\xb2\x12\x14\xf3\x24\xda\x6d\x2b\xa7\xc9\x26\xe8\x45\x59\xe0\xde\xde\xc8\x77\x0a\xd3\x9a\xf6\xce\x04\x4c\xe7\xf3\xd9\xe5\xfa\x5e\xe6\x82\x58\x79\x94\x09\x69\xdf\xc0\xa4\x4d\x03\x03\x9e\x76\x2c\x52\x92\x3b\xc5\x2d\x12\x24\x6b\x77\xf7\x20\x41\x5c\xa7\x4b\x8b\x7c\xae\x5e\xe4\x43\xdb\x5e\xe4\xdb\xbf\x3e\x78\x0f\xc4\xfa\x3d\xd9\xa9\xbe\x3f\xee\x13\x36\x75\xe0\xad\x75\x3c\xc8\x65\x8e\x51\x61\x88\x04\x51\x8f\x03\xf3\xca\x50\xfb\xc0\x51\x02\x75\x43\xad\x4f\xc9\x0d\xf5\x29\x46\x88\x63\x9f\xad\x4d\xaa\xad\x4f\xf1\x87\x62\x4e\xc9\x6f\x2f\xcf\x98\x2d\x8b\xd4\xce\x41\x22\xa3\x1e\x6d\x33\x69\x52\xeb\x1d\x58\xb1\x02\x70\x61\xec\x00\xbd\x92\x4b\x26\xc1\xe2\x84\x25\x59\xd0\x8b\x8f\x97\xfc\x1e\xb4\x2b\x64\xb3\x6d\xc7\xd7\x4d\xf2\x06\x84\x6d\x6f\x28\x1e\x13\xf5\xd4\x94\x2e\xb9\xd7\xf2\xbd\xd2\x3c\x54\xba\xf1\x19\xa4\xc1\xb8\x42\x9f\xb3\x64\x3c\x90\x03\x2f\x58\xf9\xfb\x28\x93\x4f\x0b\xe6\xbe\x16\x5c\x48\x97\x94\xe0\x80\xa4\xd9\x46\x39\x55\xfb\x88\x48\x9b\x80\xd7\xe5\xa0\x79\xd7\xf4\xf4\xcd\x6b\x97\x9c\x86\xe8\x38\x11\xbb\x95\x32\x6d\x39\x22\xab\x0f\x3a\xb9\x5d\xd1\x80\xfa\x44\x67\x27\x1b\xe2\x0e\x43\x0c\x52\xa2\xaa\x3f\x7d\x0a\xda\x57\x81\x0e\x8e\x03\x38\x26\x53\xae\x5a\x61\xe2\xe1\x16\x75\xa6\x71\x16\xe3\x59\x08\x09\x40\x7e\xe7\xd8\x9f\x78\xb1\x31\xf8\x10\x28\x7a\xad\x51\x91\x66\x49\x97\x70\xa8\x91\x89\x8e\x65\x71\x17\x6f\xb0\x1d\xbf\xef\xfe\x74\x33\xea\xf5\x54\x60\x35\x3d\xed\xf9\xc1\xd6\x3c\x76\x67\x18\xeb\xa9\x1f\x77\x61\x42\xec\x91\xc4\xcb\x88\xc8\xda\xe3\x2e\x34\x95\x8a\xa1\x49\x3c\x7d\xb4\x61\x4f\xa6\xda\x14\x0d\x8c\x32\x96\x62\x91\x6c\x01\xda\xf0\xcc\x53\x50\x8a\x8f\x27\xec\xc0\x3f\x16\xa0\x1d\x04\x33\xe8\xa2\x0b\x76\xe0\x2b\x82\x18\x13\x58\x3b\x11\x17\x39\x08\x5e\xdc\x1b\x31\x07\x41\x57\xa4\x9f\x75\x51\x01\x5d\x21\x7e\x41\xf8\xdd\xae\xb3\x33\xf1\x66\xfb\x14\x56\x4c\x2c\xd7\xe8\x72\xc8\x0a\xe8\x20\xb0\xa6\x17\x6a\x67\x2b\x0a\x2d\xeb\xce\xce\x9e\x92\x78\x6c\xda\x5e\x19\x46\x7b\x2a\xce\xb3\x06\x16\x88\x67\x87\x6a\x53\x86\x52\x78\x9d\x12\x07\x3f\xb6\xf1\x86\x45\x46\x79\xf0\xba\xab\x6a\x06\x51\x2a\x06\x9e\xb3\xf9\x2a\x2f\x2b\xbe\xe2\x6a\x09\x4f\x31\x32\x4b\xa6\x2d\x53\x3f\x71\x1e\xe7\xec\x09\x6a\x45\x31\xfb\x1d\xe7\xc1\x2a\x15\xb2\xde\xd6\xf6\x2d\x85\x5e\x91\x98\xfc\x76\x0f\x04\x7c\x4a\x03\x3e\x07\xac\x46\x42\x14\x3b\x36\x6f\x76\xcc\x6a\x80\x88\x45\xaf\x30\x49\xda\x1e\xb2\x36\xc5\x42\x16\x26\xb5\xca\x9a\x53\x8c\xe7\x2c\xa7\x6d\x19\xf8\x11\xc8\x14\x84\x5d\x3b\x13\xcb\x5f\x0a\x51\xd4\xe9\x92\xe5\x98\xe4\x91\x2b\x9a\xc1\xb6\x95\x0e\x31\xd2\xc4\xa4\xfd\x75\x4f\xbc\x60\x64\x98\xa0\x6d\x3c\x62\xa9\x47\xbc\xbe\xb9\x53\xf4\xe7\x5b\xfe\xd6\xcf\x0b\x7d\x4d\x10\x07\x3e\x6d\x57\xb9\xaa\x59\x28\xe3\x60\xc4\x8a\x74\xd7\x36\x47\x3c\xf6\xec\xc0\x7a\xf2\xe4\xfc\x34\x87\x11\x82\x98\xa3\x9a\x41\xf7\x44\xba\x28\x7a\x72\x6c\x64\xfb\x34\x50\xc7\x1e\x8f\xfb\xe5\xc1\xda\x31\xf7\x40\xd9\xda\xdf\x1d\x8f\xaa\xda\xcd\x9b\x5c\x74\x0d\x2c\x58\x46\x0e\x5b\x23\x47\x22\x01\x3c\x45\x26\xa4\x4b\x1e\x1b\x2f\x22\xb4\x4f\x2a\x75\xfb\x14\x1b\x6b\xd0\xe0\xdc\x48\xd4\x0b\xa5\xdb\xb8\x80\x60\xc5\xfc\x72\x84\x32\x33\x18\xcf\x79\x8a\xc7\x5d\x4e\x50\x8a\x69\x5d\xdc\xe9\xde\xa7\x44\x01\xb1\xdd\x8f\x43\xda\xb6\x02\x25\x03\xe4\x26\xa5\xe2\x9e\x31\xb2\x92\x5c\xe3\xd8\x31\x95\x75\x95\x21\x21\x16\x8e\x19\xc1\x79\x41\x73\xc7\x9c\x39\x64\xb2\xbf\x65\x86\x2a\x0e\x34\x1d\x8d\x58\xb1\x49\xee\xf1\x76\x70\x2d\xb9\x27\x74\xe7\x06\x3c\x8e\x35\x4b\x31\x72\xa9\x59\x43\x28\x34\x2b\x45\x65\x21\xee\x99\x0a\x39\x13\x54\x70\xcd\x71\x0b\xf7\x42\xb2\x41\x34\x8c\x30\xa6\x36\xc2\x04\x2f\x1e\x02\x99\x7b\xfb\x3d\x00\xce\x38\xbc\x67\x0c\x48\xf8\x20\x90\x56\x72\x29\x6b\x8b\xd0\xa0\x10\x77\x10\xe2\xff\x2e\x17\x4f\xa2\xeb\xf3\x08\x0d\x29\x80\xb7\x73\xb0\xc5\xee\xf6\xd9\x90\x64\x87\x89\x00\x7d\x11\xc0\x77\x8e\xac\x89\xb9\xbd\x1b\x91\x67\x76\x8c\x66\xc8\xe4\x03\x47\x28\x7a\xa1\xeb\xd8\x92\x47\xa3\xca\x11\x26\xbf\x5a\x66\xc8\x94\x64\xe4\xd2\x71\xab\x9d\x8c\x60\xc2\xc8\x81\x76\x62\xde\xbd\x85\x4c\x0e\x02\x37\x93\xe5\xe6\xad\x14\x0f\x81\x1b\x99\x9c\x34\x51\x47\xb2\xc9\x95\x5b\x2e\x93\xca\x73\x0b\x3a\xdc\x9a\x93\xc4\x61\x1c\x95\xbb\x3b\x89\x17\x85\x85\x40\x05\x15\xd2\x04\x22\xd0\xf3\x82\x07\x4d\x34\xc2\x28\x46\x67\x51\x26\xdb\x30\x9d\x36\x6f\x5e\x07\x01\x46\x97\xea\x4c\x5f\x45\x30\xf8\xe6\x35\x22\x38\x59\x15\x32\x2a\x72\x1e\x12\xe6\xab\xdf\xbc\x46\x9b\xf4\x73\x99\x8c\x73\x0d\x3a\x4a\x7f\xdf\x5c\x04\x70\x46\x05\x08\x86\x09\x40\xe0\x8e\xe8\x1b\xe4\xcc\x7d\x7e\x8a\x6f\xc6\xdf\xda\x45\xb1\x07\x2f\x1e\xbe\xd1\x43\x72\xef\x8d\x01\x82\xcd\x37\x9a\x72\x92\xbf\x87\x87\xef\x9b\x85\xbf\xba\x52\x1e\xf2\xe4\xc5\x1b\x9c\x96\x1b\x0b\xd9\xd3\x37\x82\xc1\x7c\x23\x79\x1e\x57\x69\xdb\x7d\xba\x06\x8a\x3d\x92\x88\xe1\x06\x30\xf9\xf2\x06\x09\x2b\xdd\x6b\xd2\x1e\x57\x5d\xdb\x6f\x3a\x82\x91\x3e\x32\xd3\xd1\xf9\xc6\x49\x1f\xa9\x04\x09\x3b\xdc\xab\xf2\x3c\xae\xd2\x96\xdb\x74\xe6\x3a\x21\xf5\x91\x34\x24\xff\xe1\x08\xd1\xa7\x30\x42\x55\xda\x23\x28\xbf\xbb\x1f\xe5\x7f\x4d\x91\x61\x5c\x8e\xc1\x8c\x28\x79\x49\xda\x67\x58\x2c\x1e\x5a\x50\x64\x39\x46\x09\x07\x2e\xce\x0b\x02\x91\x3e\x6e\xfe\x20\xa6\x33\x66\x43\xbf\x73\x88\x41\xdb\xb9\xb8\xc0\xa3\x9d\xb4\xc0\xc8\xcb\x5a\xa5\x0b\x7b\xcc\x83\x0d\x15\xe0\xcc\x28\x1f\xb4\x30\xe7\x06\xc2\x9c\x19\x72\x61\xf6\x34\x43\xe5\x66\x50\x29\x32\xe8\x21\xb9\xc1\x99\x79\x21\x86\xc0\x61\x48\x71\x9b\x13\x78\x20\x23\xed\xe6\x87\xb8\x1d\xc4\x66\x8b\x11\xfc\xe7\xf4\x49\x18\x01\x0b\xd0\x46\x8c\xb1\x5b\x27\xe4\x11\x1c\xeb\x26\x38\xe2\x39\x0d\xcc\x95\x42\xf2\x44\x6b\x6c\x87\x6a\x3b\x56\x55\x70\x84\xe2\xd1\x50\xdb\x53\x22\xa0\x21\xb6\xcd\x93\x84\xbc\xba\x73\x7b\x4d\x60\xf6\xa7\x9c\x76\xb6\x9f\x28\x59\x98\x87\x73\xdb\xc9\xca\x75\x0d\x31\x9e\x32\x5b\xbc\x29\x89\x5b\xf0\x29\x85\x9a\xc0\x42\x82\x87\xc8\x9c\x4f\x7c\x02\x94\x43\xda\x39\xb9\xc2\x7c\xe1\x9a\x6e\x4c\xd8\x23\x27\x54\x66\xf6\x6e\x88\x66\x2b\x62\x12\x67\x4f\x27\x08\x77\x12\xc8\x8d\x22\x44\xad\xd2\x29\xa8\x6d\xf1\x3e\x79\xd4\xd4\x3a\xcf\x67\x19\xe6\x16\xa2\x2d\xa2\x1c\xfd\xda\x93\x59\x4e\x9f\xec\xc6\xac\xca\x31\x58\x6e\xb2\x7a\x65\x42\xc7\x6c\x0f\x42\x18\x58\xd6\x60\x6c\xcb\x54\x1c\x95\x3f\x35\x5b\x27\x56\xfc\x10\xdd\xbe\x97\x5b\xc1\x34\x4e\x3b\xa2\x2b\x2a\x3c\xd7\x3b\x87\x4a\x28\xee\x7f\x09\x25\xcb\x56\xa5\x97\x93\x26\x55\x92\x67\x91\x3f\xe0\x75\x01\x8e\x06\xb2\x76\xe3\xaa\xe1\x2f\x55\xab\x17\xe2\x0c\x3f\x9e\xcb\xb1\xa7\xae\xb4\x28\x72\x9f\x56\x04\xda\xed\xb1\x03\x12\x21\xc3\x0d\x91\xe9\x9f\x4d\x75\x0d\x0c\xeb\x54\xa6\x59\x48\x20\x64\xa1\x97\xbc\x6c\x20\x86\xf3\x98\xb6\x1d\xb6\xf2\xc8\xc7\x78\xef\x08\x5f\x37\xee\x7a\x21\x24\x00\x30\x7e\x88\x06\xec\xb5\x3b\x77\x4c\x07\x49\xd6\xf5\xeb\xe1\x01\xa7\x59\x96\xf5\xd7\x05\x98\x30\xe8\x9e\x5c\x2c\x55\xab\x90\x83\x4d\x37\x6e\x6b\x93\x16\x27\x9b\x76\x2c\x56\x49\x54\xad\x23\xb0\xb0\x4c\xdc\x0c\xb2\xd2\xd4\x53\xe4\xb6\xea\x81\x9c\xf9\x92\x4b\x6e\x4d\xfe\xfc\x3e\x76\xdc\x37\x1a\x56\x1d\x8e\xf9\x5a\x6c\xa4\xbc\x1e\x58\x6e\x8a\xad\xda\x83\x79\x74\xc8\x0f\x09\xaf\x11\xe2\x96\x83\x7b\x9e\x6e\x7f\xc3\x7b\x0d\x64\x77\xce\x9f\xa0\x1c\xfd\xf3\xf6\x94\xa5\x33\x7d\x5e\x5e\x17\x7e\x37\x0f\x7f\xa9\xe2\x10\xed\xa9\x87\xb2\xcd\xef\xb8\xe8\x78\x4e\x7b\x5f\x6f\x1d\xc2\x65\x08\x26\x25\x9e\x28\x31\x5d\x2a\xa6\x85\xa2\xe2\x1e\x6a\xa6\xa3\x77\x0c\xe5\xab\x58\x4e\x37\x52\x0d\x11\x89\xb7\xbc\x3c\x9c\x17\x6e\x4b\xf7\x6e\x2b\x20\xf9\x93\x87\x07\xbe\x23\x62\x95\x9c\xcc\x9e\x6a\x1e\x6c\xff\x4d\xdb\x55\x28\x4d\x43\x7c\xba\xf2\xf5\x56\xec\x3e\x46\x58\x4d\xe7\x85\xdf\x5e\xa4\x78\x84\x05\xfb\x56\x74\x40\x26\x0b\xe1\x29\x6b\xb0\xbb\x35\x88\x15\x2a\x05\x55\xed\x99\x17\x72\x36\x50\x16\xf4\x06\x54\x0a\x4d\x28\x6b\xa2\x20\x2b\x92\x2a\x80\xc7\x11\x79\x09\x3a\xd0\x5e\x29\x29\x7d\xd1\x76\xe5\x4e\xa2\x69\xb2\x34\x18\xda\xb9\x64\x99\xc0\xd0\x5c\x8e\x34\x33\xa4\xef\x3a\xb3\x2f\x1c\x50\x90\xad\xba\x49\x21\x46\xd8\x46\x5a\xc5\x6a\x58\x2c\xe4\x54\x21\x85\xb1\x06\xc7\x72\x5c\xcd\x95\x98\x44\x0e\xe4\x24\xb9\x5c\xd2\x6b\x0b\x21\xd9\xcd\x30\x99\xd7\xe5\xd0\xca\x62\xa6\xa8\xcd\xf5\x52\x76\x81\x40\x58\x80\x95\x70\x05\xf9\x92\x12\xc0\x58\x59\x21\x9e\xa4\x53\x88\x0e\xc1\xc9\x99\xce\x20\x3e\xb7\x0b\x4c\x6e\xf0\x99\x18\x37\xa4\xa0\x0c\xb2\x09\x3e\xd6\x25\x04\x39\x59\x1d\x1a\x71\x2d\xf8\x6c\x7d\xc1\x9a\x40\xbe\x56\x69\xc6\xcb\x19\xc5\x39\x82\xf6\x10\x69\xcc\x03\x5f\xad\x5a\x89\x75\xa9\x06\xe3\x07\x14\x01\x95\x5c\x72\x8a\x4b\x47\x59\xcf\xc5\x63\xb9\x49\xbe\x93\x6c\xf3\x99\x78\xaf\x49\xc8\x46\xcd\x2a\x58\x3a\x4f\x19\xdc\x1c\xc1\x8a\x01\x2b\x8e\x99\xeb\xca\x82\x73\x73\xea\x4c\x53\xa1\x07\x64\x78\xe0\xd3\xb5\x22\xc1\xe0\x1d\x57\x09\x3e\xcc\x21\x62\x41\x42\x3b\x71\x84\xc8\x9a\xbe\x9c\x39\xb7\x7e\x2e\x62\x94\x05\xe3\xc7\x95\x5c\xa4\xeb\x66\x91\xf8\xf5\x17\x27\xff\xf9\x5a\xe6\x75\xd3\xe0\x64\xc9\x7e\x40\x4e\xf6\xb5\x5d\x8b\xdf\x23\x78\x7d\xbf\x43\x2e\xae\x61\x36\x1d\x21\x29\x88\x81\x83\x87\xe0\x92\x0f\x7e\x86\xe7\xc2\x80\xc1\x82\xf5\x52\x2a\xa2\x9c\xd3\xf3\xa0\x69\xc4\xc4\x9f\xc7\x2a\x76\x21\x98\xe7\x4b\x56\x0a\x77\x01\x7b\x8e\xc0\x0c\xd2\x0d\x09\xc1\xe2\xbc\x80\xc8\xd2\xa6\xac\xe0\x90\x9c\x71\x34\x50\xaf\xc8\x8b\x85\x19\x46\x1e\x7c\x23\x29\xb5\x11\xbe\xcc\x90\xc4\x01\x10\x27\xde\x38\xde\x9e\xc4\x3c\x3f\x10\xdc\x80\x50\xb0\x58\xae\x79\x8a\xc4\x0d\xff\x79\x81\x63\x0a\xc2\xaf\x43\xcd\xb0\x65\xa5\x5b\x09\x65\xd1\xb2\x00\xa2\x9b\xb3\xd3\x98\x8f\x17\x4a\xe4\x03\xed\xb9\x47\xe3\x6d\x50\x95\x3e\xfa\x82\x41\x75\xb0\x0d\xe2\x28\x87\x8f\x2d\xd7\x3d\x44\x02\x3d\x87\x32\x00\xfa\x13\x2f\x48\x41\xe9\xa8\xa3\xb8\x13\x37\xe9\x4e\x96\xbf\x06\x29\xc2\x4b\xe3\x4b\xdd\xc8\x41\xd8\x12\xec\x79\xd8\x71\x09\x82\xb2\x86\xce\x14\xab\x9b\x50\x70\x7b\x91\x35\xa9\xb6\x2c\x25\x44\x81\x45\xa9\x73\x37\xde\x79\xcf\x7f\x03\x4a\x01\x16\x6a\x08\xac\xa0\xe3\x3e\x92\xd5\x36\x2b\x0d\x60\xef\xcf\x4c\xc3\x0d\x96\x86\x37\x88\x50\x3b\xac\x54\xf3\x7c\xdf\x93\xd9\xdd\x26\x42\x74\x19\xa9\x2c\xaa\x3e\x4d\xe9\xdb\x4c\x4e\xd8\x28\x72\xeb\xef\xc9\xe6\x6e\x5e\x8c\xd9\x65\xa2\xfe\xe9\xca\x77\x3b\x02\x96\xc4\xce\xbc\xf1\x24\x62\x92\x0f\x87\xac\x53\xc7\x81\x63\x54\x71\x35\x4b\x60\xa6\x8b\x34\xce\x26\xdc\xa1\x39\xef\x2b\x06\xa0\xe7\x62\xbe\xb0\xa3\x6a\x93\x07\xe3\x06\x01\x8c\x51\xa1\x72\x73\x5f\xb2\x34\x6c\xbd\x32\xbb\xba\x5b\x04\x1a\xfa\x5d\xb5\x5f\xcb\x82\xc0\xbe\x84\xd3\xce\x56\xa3\x48\xc7\xe5\xb9\x07\xeb\xc7\xdb\x3b\x94\xdc\xa5\xc2\x02\x0d\x35\xee\x34\x53\x54\x37\x97\xbe\x73\xac\x9b\xb9\x46\x41\xb3\xc9\x9f\x26\xb1\x82\x76\xc1\xf8\x2e\x71\x1c\x83\x1f\x5b\x90\x4d\xb3\x9c\x8d\x35\x21\x23\x4a\x5c\xea\x1c\x06\xd1\xd5\x72\x76\xb2\x83\xed\x72\xab\x6c\x0f\x97\x4b\xb3\xbf\x19\x0d\x81\xf5\x9d\x08\xc6\x8e\x2d\x10\x37\xaa\x76\x25\x01\x65\x28\x98\x46\x6c\x39\xbc\x29\x40\x34\x7c\x7c\x18\xe1\xc8\xf5\x46\xf0\xe7\x96\x19\x82\x61\xf9\xc7\xb4\x6c\x1d\x65\xa3\x29\x0e\x25\xdf\xc3\xe8\x04\x46\x39\x0d\x50\x82\xc5\x54\xcc\x29\xca\x36\x8a\x1f\x08\x49\x95\x4b\x0d\x4a\x55\xce\x87\x51\x0c\x14\x47\x8b\x34\x6e\xab\x72\x72\x3f\xe8\xa8\x72\x29\xd7\x9b\x0b\xae\x49\xbc\xf0\xf0\xb4\x32\xb4\xc8\x41\xf3\xda\x3d\x9b\x63\xb1\xd0\x30\x24\x70\xab\xaf\x9d\x78\x8f\xe9\xae\x99\xe4\x25\x1b\xf4\x10\x86\xcc\x69\xab\xb8\x2c\x98\x17\xd3\xc2\x79\x3a\xa5\xae\x6f\x4f\x8f\x40\x6e\x8f\x06\xc8\x92\x4b\x38\x77\x60\xcc\xd8\xa5\xc0\x34\xa1\x12\xa4\x9c\x08\xa7\xe7\x04\xce\x36\xb1\x60\xd2\xce\x60\x18\x92\x83\x32\x6e\x39\x28\x41\x95\x57\x77\xb8\x14\xf9\xcb\xec\xab\x74\x10\xcf\x69\xa7\x90\xfb\x10\xd5\xad\x7d\xdb\x5f\xe7\x37\xc7\x36\xaf\xa2\x07\x0d\xf2\xda\x62\x1d\x83\x85\x22\x13\xa4\xad\xb7\x45\x00\xa3\x0b\xc6\xbe\x2d\xda\x82\x61\x18\xb7\x88\x2a\x5d\xd3\x9e\x77\xdb\x51\xfd\xc8\x9c\xef\x38\xe9\xd4\xa7\x54\xbe\x79\x8d\x3a\x53\x8d\x81\x63\xad\xc3\xb5\xec\x1a\x7c\x8a\x37\xde\xd9\xa7\x2b\x1c\x18\xad\xdc\x10\xef\x77\x46\xbb\xcb\xe0\x24\xde\x48\x94\x95\x0e\x7b\x1d\x20\xe0\xb9\x05\xcf\x48\xe8\x9c\x32\x8d\xe3\x51\x03\xc1\xb1\x98\x38\x30\x2c\xab\x98\x46\x60\x69\x0a\x78\x20\xf6\x1f\xba\xee\x21\xde\x4e\x31\x80\x75\x43\xb4\xa7\xc4\xf8\xbb\xb3\x88\x8d\xf6\xfa\xc6\x25\x4d\x91\x59\x69\xdb\x8e\x81\xd5\x9f\x53\x86\x08\x57\x25\xef\xdb\x38\x4d\xd9\x76\xd7\xec\xf9\x96\x95\x24\x7b\xee\xb7\x9c\x74\xa0\xf2\xac\x10\x38\xb1\x44\x40\x9b\xec\x63\xcb\x7a\x89\xce\x4a\xf4\xaa\x43\x25\xad\x5d\x07\x00\xdd\xd0\xd6\x37\x41\x3a\x0b\x9b\xc4\x6a\x92\xc6\xb1\x15\xab\x59\x9f\x11\xdf\xb2\x0a\x67\xc1\x0f\x2c\x0b\xce\xb6\x92\x9e\x93\xd9\x56\xfe\xe4\xcd\x45\x59\x44\x30\x63\x16\x22\x74\xfe\x52\x22\xf7\xb0\xea\xe9\x07\xa2\x3e\xeb\x96\xdc\x2d\x5f\x32\xb2\x3f\xc0\x63\xc0\xd7\xd4\x66\xda\x69\x33\xa5\xfd\x7f\xcf\x94\x90\x4a\x10\x4f\x73\xae\x22\x15\x12\xeb\xaa\x1b\x52\x50\x05\x16\x7c\xc9\x5e\x6b\xb0\x6e\x9b\x3a\xa0\x44\x75\x0a\xe2\xdc\x44\xae\x15\x29\x66\xc9\xe2\x3e\xec\x5d\xef\xb4\x53\x6b\x71\xa3\xe6\x40\x0b\xc8\xd3\xd6\xe2\x37\xd1\x10\xfd\x16\x95\xeb\xfa\x8c\x50\x38\xdc\x76\x22\x71\x4a\x5d\xff\xea\x8a\x48\xac\x89\x35\x2b\x7e\x4c\xeb\x1c\xe8\x6b\x30\x3b\x62\x95\xd9\xe3\xff\xe2\x00\x07\x07\xf5\xa1\x7c\x42\x08\x98\x8c\x69\x3d\x18\xaa\xed\x69\xad\xf8\x15\xa9\x2c\x6a\x11\xcc\xfd\x3d\x17\xb4\x80\xb1\x14\xb3\x50\x92\x2d\xfb\x7a\xa9\xa3\x2c\xbc\x78\x6a\x1e\xe4\x3d\xa8\xda\xc5\xa0\x58\xfa\x7b\xec\x04\x17\x95\xee\x5e\x17\xc4\x5a\x74\x4d\xd3\xc4\x42\x26\xc8\x1e\xd6\xc0\xa7\xe5\x1e\xaa\x55\xcc\xa6\xce\x7b\xa9\xfb\xbb\x93\x2d\x5b\x09\x06\x48\x8f\x59\x38\x50\x72\xa9\xda\x8f\x54\x90\x62\x61\x3a\x5d\x32\x23\xf6\x02\xac\x56\x0e\xe4\xda\x2a\x2c\x26\xe6\x23\x0c\x11\xaf\xa9\x63\xca\x26\x1d\xd3\x80\x3b\xe3\xd0\xaa\xfa\x1e\x5d\xf0\xfb\x86\xdf\x89\x4f\x1d\x87\x13\x16\x32\xc5\x20\x86\x25\xf0\x02\x9c\xf8\x47\xf6\xe2\x3f\xa8\x12\x2e\xac\x29\x5c\xf6\x50\x6c\xd3\x25\x13\x5c\x20\xee\x4b\x00\x74\xe9\x52\x11\x6f\xf1\xfe\x25\x86\xec\x3a\x5d\xd2\xe8\x44\x25\x9e\x2a\x2d\x88\x9f\xca\x9a\x01\x7a\x25\x07\xfc\x64\xd8\xa8\x99\xac\xaa\x85\xf7\xe8\x69\xd8\xa5\x20\x26\x51\x88\xa0\xc7\x16\x50\xea\xae\x42\xe8\x89\xdf\x26\x89\x61\xe7\x59\x2e\xf4\x8d\x93\x5e\x84\x98\x7c\x7d\x99\x74\x49\x6f\x0d\x8b\x6c\x12\x2c\x4c\x43\x19\xd3\x25\xe3\xaa\x58\x7f\x73\x45\xdb\xbc\x4a\x24\x30\xb1\x02\x0f\xe9\x92\xe1\x21\x19\x9a\x76\x07\x42\x43\xd0\x85\x01\x39\xa9\x20\x69\xf5\x6e\x48\xdd\x87\x7b\x0c\x45\xcc\x43\x21\xc3\x51\x1f\x14\x68\x9f\x00\x40\xa0\xea\x10\x00\x78\x57\x9f\x03\xb8\xdf\xc1\xdd\x0e\x4c\xc9\xc9\x29\xf0\x76\x92\x60\x21\x19\xe2\x66\x6b\xb8\x42\xc0\xa6\x10\x74\x2c\xc0\xe8\xb1\x03\x16\xc8\x5b\x7e\x91\x6d\x21\x82\x11\xa9\x1c\x5b\x52\x7c\x4d\xa6\x13\x16\xe6\x70\x86\xbe\x0f\x00\xc4\x83\x25\x85\x49\xa9\x12\xec\x26\x9a\x00\x46\xef\xb4\x73\x20\x5e\xe3\x4d\x0a\xb8\x8a\x69\x87\xd3\x4a\x3c\x86\x4e\x6b\x5b\x85\x1e\xac\xcc\xec\x34\x8c\xc4\xc4\xd9\xb1\x3a\xb8\xbb\xca\x6a\x65\x7f\x4e\x6d\x39\x18\x55\xe0\x02\x58\x3d\xd4\x72\x5a\xca\xba\x31\xf8\x56\x70\x5c\xf1\xf1\xe9\x92\x94\x17\x1a\x21\xbb\x20\x28\xed\xbc\x10\x91\x73\xe0\xf8\xc7\x55\xe2\xa7\x9c\x77\xad\x5a\x71\xb0\x56\xb0\xdd\x13\x71\xdd\x25\x5e\xc3\x76\x42\x47\xe6\x2d\xc5\x1b\x3a\x58\x90\xda\x6a\x4f\x41\x40\xbe\xd0\x60\xab\x06\x8f\xb7\x3a\xa3\xb8\x33\xdb\xbd\x06\x67\xc4\xf1\x2e\xd8\x1d\x0c\xb9\x71\x3d\x67\x97\xeb\x99\x74\x4c\x85\x1c\xb8\x78\x30\xd7\xbb\x71\x3d\x67\x87\x6b\x10\x04\xd9\x48\x24\xc7\x1a\x69\x34\xd7\x05\x76\xc5\x84\x6b\x1c\x12\x9d\xf2\x78\xe9\x01\x95\x90\xcc\x2f\xb0\x89\xe1\xa9\x30\x8c\x31\x8a\x27\x3a\xb9\x66\x9a\x2a\x1b\xce\x40\x3c\xe8\x75\x20\xe1\x02\x0c\xcb\x34\xd7\x16\x1c\x9e\x7b\x40\xbc\x16\xad\x71\x4b\xe0\xe0\x16\x6d\xcb\x1c\x24\xda\x6a\x23\x76\x34\xad\x7e\x73\x91\x62\x35\x6b\x37\x64\x81\xcc\x9c\x92\x06\x72\x49\x0a\x89\x3b\x6c\x19\x22\xeb\x3b\xe1\xd0\xcd\x64\xbf\x73\xf8\x28\xcb\xe1\x37\x8b\xe0\xa2\xa3\x89\x4d\x51\x1d\xe7\x1c\x95\x2f\xfc\x20\x3d\xe5\x7d\x8c\x2a\x4f\x3e\x62\x15\x9b\x68\xe9\xa5\xb2\xca\x0e\x1a\xe7\xfa\x29\x33\x93\xda\x47\x89\xd9\x24\x61\x21\xe3\x80\x2c\x18\xf1\x00\x58\x19\x92\xaa\xe4\x12\x3b\x82\xf5\x63\xc3\x93\x66\x92\x7d\x6c\x5a\x3e\xd7\xc9\x7c\xe8\x94\x22\x50\x57\x12\x90\x71\xb6\xad\xd0\xab\x98\xe2\x5c\x07\xc7\xc8\x1b\x31\x5f\x53\x5a\x94\x95\x69\x94\x15\x78\x1b\xf2\xb5\x42\x38\xeb\xc1\x3d\xc4\x9d\x57\x83\x24\x04\x68\x6a\xd1\xb0\x39\x6a\xe5\xe4\xf5\x83\x44\xc3\x7d\xb2\xb4\x80\x3e\x82\xf1\x43\x0a\xd7\x74\x6e\x00\xfd\x75\x00\xed\x45\xee\xd5\x60\x7c\x16\x7d\x77\x2c\x8c\xca\x6d\x84\x12\x93\x88\x1d\xc9\x9b\xda\x6e\x75\x2b\xe1\x1b\xd0\xef\xe2\x82\xf1\x5b\x21\x8e\x72\xc3\x1e\x20\x5f\x4b\x27\xdb\x11\x5d\x1c\x04\x97\x38\x71\x04\xaf\xe5\x74\xbc\x13\x1a\x74\x2f\xf6\xdb\xd0\xaf\x34\x2f\xa1\x9e\x14\xff\x00\xb2\xb5\xcb\x3e\x59\xe0\xeb\x3a\x7b\xbd\x41\x57\xe9\x6e\x4e\x88\x67\xa1\xb2\x1b\x89\x2d\x6b\x42\x99\xc6\xd1\x40\x8b\x4d\x52\xba\xd6\x28\x18\x1c\x93\xb9\x96\x97\xdd\x42\xc2\x66\x68\x11\x1d\x43\xba\xe4\xf7\x8c\x4e\xfa\x54\x97\x6f\x2e\xe4\x38\x08\x7a\x56\x8a\xfc\x3e\xb8\x30\xe7\x87\xca\x0f\x7a\x9b\x0e\xfd\xc7\x78\xb2\x59\xae\xde\xdf\xbc\x12\xaf\x93\x67\x0a\xdd\x85\x32\x28\xdd\x28\x1b\xb1\xf8\xd3\x00\xd4\x35\x8b\x76\xa6\x00\xef\x47\xa8\x25\x50\xb2\x19\x62\x79\x6a\x9a\xe0\x74\xe9\x7c\x40\x28\x70\x5e\x98\xa2\xbb\x47\x18\x2c\x50\xc7\x1f\x93\x06\xaf\x4f\xbb\xa6\xd5\x09\xc6\xf1\xae\x19\x0b\x5b\x84\xbe\xee\xc7\x9b\xd7\x4e\xd9\x39\x29\x39\x92\x6d\x86\x2e\x29\x9d\xe5\xd0\xa4\xc5\xeb\xd0\x2e\x48\x7a\x42\x5a\x1c\x9e\x97\xa0\xfd\xb5\x85\xae\x55\x17\x58\x07\x41\x8b\x5f\xfe\xf2\x66\xbf\x38\xb7\x52\xd6\x0a\xc2\xf3\x21\x52\x0f\xb1\xe1\xce\xe1\x41\x0e\x04\x77\xe8\x5a\x66\xfc\xf8\xf8\xa2\xf5\x0d\x45\xdb\xc7\x17\xbd\xa3\xa8\x63\x4c\x23\x12\xda\x65\xb7\x5d\x83\x3e\x40\x41\xdf\x2a\x9b\xcc\xe3\xcb\x76\x3b\xa4\x4a\x3f\x59\xbb\xfd\x0d\x65\x3f\x45\xbb\xc3\x4e\xd9\xfe\xc9\xda\x1d\x6f\x28\xfb\x29\xda\x8d\x65\x9b\xe3\xb4\xe5\xcf\xb4\xcf\x66\x14\xc9\xaa\x83\x3e\x8d\x60\xb1\x4b\x97\x74\xe5\x08\xa4\xf4\x35\x5d\x2a\x9d\xc4\xda\xf2\xc8\xd4\x80\x0e\xa0\x2c\x2c\x9c\x76\x45\xc8\x5c\xf1\x9b\xd7\x68\x14\xc5\xa1\x3b\x25\x7f\x1e\x58\x22\x33\x7c\xaf\x9b\x7b\x8c\x7c\x2f\x67\xba\xca\x53\x72\xe7\xc4\x09\x4e\x1e\x4a\x7e\x30\xca\x89\xbf\x96\x26\xc5\xb4\x53\x42\x3b\x25\xa4\x94\xc3\xf9\x69\xa2\xfb\xcb\x8b\x8b\xe9\x6a\x32\x15\xe2\xbf\x3e\xfe\x63\x32\x9e\x4f\xae\xe6\xe3\xcd\x72\xf5\xaa\x65\xfc\x56\xbf\x54\xfd\xcb\xd9\xbb\x77\xef\x8b\x5f\xc7\x8b\x7f\xf4\x5b\x39\x7e\xe4\xb7\x3f\x8c\x17\xff\x50\xfd\x75\x0e\x07\x5e\xfc\x3a\x7e\xd7\xce\x52\x85\x09\xff\x61\xfc\xae\x95\x69\x32\x5e\x6d\xf6\xe5\x3a\x19\xaf\x36\xea\x37\x09\xb2\xf5\x6a\x3b\xea\x96\x5a\x6f\x96\xab\xe9\xab\xad\x58\x3f\x6a\x7a\xb5\x5a\xbe\xea\x06\x98\x50\x67\xe2\x5a\xe4\xd5\xb6\xaf\x11\x75\x39\x5d\xb7\xf3\xfe\x38\x5d\x2f\x55\x7f\x22\x6e\x94\xb9\x49\x67\xed\x26\x35\xde\x95\x15\x77\xfb\x55\xd7\x7b\xae\xea\xa7\x3a\x8a\x5f\x67\xf3\x79\x7f\xa7\xa6\x1f\x66\xf3\xb9\xea\x4f\x8b\xc9\xf9\x74\xd2\x19\xb1\xe4\x6d\x40\x5d\x2e\xaf\x16\x67\xaf\xb6\x4e\xc5\xaa\xd5\xd5\xe5\xb4\xdd\x41\x39\x3f\xa8\x7e\x5b\x2e\x5e\x75\x8e\x50\xa9\xf7\xd3\xf6\x9b\xff\x9c\x2e\xd4\xaf\xc9\xba\xf9\xd5\x8e\xbd\xb3\x5a\x5d\xfd\x3a\xef\x96\xf9\xeb\x7c\xaa\xfa\x9c\xb6\x3d\x55\xd9\xd8\x51\xf5\xa7\x59\x2b\x29\xde\xad\x96\x57\x97\x9d\xe6\xb7\xf7\x0d\x54\x95\x6f\x4f\x06\xf5\x36\x49\x14\xaf\x76\x64\x8c\x0f\xea\x6f\xbf\xfe\xbf\xe9\x64\x03\x67\xd3\xb7\xb3\xc5\xf4\xc7\xd5\xf2\x72\xba\xda\xbc\x7f\xb1\x0d\x94\xaa\xbf\x1e\x5f\xcf\x16\xef\xd6\x7d\xb5\x82\xb3\xe9\x7a\xb2\x9a\x5d\x6e\x96\xab\x93\xe5\xe2\xed\xec\xdd\x4e\xee\x9f\xdb\x10\xfa\xcb\xd1\x91\xea\x5f\x2d\x52\x05\x67\xfd\xbf\x1c\x6f\xde\x5f\x4e\x97\x6f\x7b\xbf\xcd\x16\x67\xcb\xdf\xbe\xfb\x2e\xfd\xc2\xf9\x78\xfd\xb7\xdf\x16\x75\x03\xfa\x27\xf3\xf1\x6a\xb6\x79\xcf\xe2\xcf\xba\x7f\x54\x67\x6b\xbf\x86\xf1\xd9\xd9\x4e\xdd\x47\x1f\x54\x1f\x5e\x5e\xae\x96\xdc\xad\xf5\xcb\x19\x67\x7c\xb9\x5e\x4d\x5e\xae\x25\xf9\xe5\x64\xb9\x9a\x16\xe9\x1e\x36\xeb\xfe\xab\xb7\x57\x8b\xc9\x66\xb6\x5c\xbc\x98\xaa\x8d\x5a\x1c\xfd\xd1\xbf\x5a\x4f\x7b\xeb\xcd\x6a\x36\xd9\xf4\xbf\xbf\x61\x70\x54\xff\xbf\xfe\x6b\xba\x7e\xbd\x3c\xbb\x9a\x4f\xfb\xea\x8f\xeb\xf1\xfc\x6a\xfa\xea\x2f\xe5\x87\x84\xcc\xab\x0a\x91\x9b\xd1\x1e\xac\x56\xcb\xdf\x8e\xdb\xc8\x32\xbd\xfc\x8f\xe5\xea\xb7\xf1\xea\x8c\x5a\xaf\xff\xfd\xfd\x74\x38\x3b\x9b\x76\xdf\xb4\x9f\xae\xa7\x8b\xcd\x71\x87\x26\x4c\x17\x67\xe3\x55\xbb\xa6\xc5\xbb\xf9\xf4\x7f\x2e\x65\xcf\xb4\x79\x7b\x3a\x9b\xfe\x76\xb2\x9c\x5f\x5d\x2c\xda\xad\xfa\x69\x3a\x5e\x4d\xce\xdb\xd9\x2e\x7e\xb8\x7a\xd7\x7a\xfe\x8f\xd9\x7c\x33\x5d\xfd\xaf\xd5\xec\xec\x44\x94\x88\xbd\x49\xed\xf6\xc9\x92\xdf\x6c\x7d\x3a\x5d\x6d\x66\x93\xf1\x7c\x4f\xd2\x70\xb9\x9a\xfd\xf7\x72\xb1\xe9\x24\x9e\xcc\x97\x57\xed\x72\xfe\xf7\xc5\xf8\x5d\xbb\xb2\x1f\xa6\xf3\x76\xf6\xff\x58\xce\xcf\xa6\xab\xbf\x5d\x4e\x17\x3b\x2f\xb7\x47\xa2\xf5\xfc\xff\x5f\x77\x92\x7f\x18\xaf\xda\x63\x31\x9c\xce\x2f\xff\xf7\xe2\xed\xf2\xb8\x4d\xe8\x56\x8b\xd9\xe2\xdd\x4f\x9b\x31\x8f\x71\xa7\x9f\xab\xd5\x72\xb5\xe7\xfd\x4f\x57\x93\xc9\x74\xbd\xde\x93\xc2\x45\xdf\xf0\x7a\x67\x68\x85\x28\xed\xbc\xfd\xf7\xdf\x27\xf3\xf1\xc5\x98\x41\xf5\xb6\xb4\xbf\xaf\x66\xe3\xad\x8e\xff\x7d\x76\xd1\x01\xc6\xe4\x62\xa5\x4d\x69\xda\x73\x3e\x5c\x5e\x74\x46\x6d\xf1\x8f\xc5\xf2\xb7\xc5\x4f\x9b\xf1\xe6\x6a\x7d\x7c\xbd\x9c\x9d\xf5\xca\xef\xaf\xc7\xab\xde\xea\x78\xf1\x62\x3f\xa2\x5d\x6d\x66\xf3\xf5\xcb\x86\x48\x14\x13\xa1\x12\x8c\x6d\x47\x6a\x76\xc7\x67\xeb\xeb\x77\xc5\x66\xfc\xae\x78\x37\x5d\x4c\x57\xcc\xed\xe4\xb3\xef\x6f\x6a\xd0\x96\x8a\x74\xcf\xd0\x83\x98\xfd\xd3\x78\xb0\x79\x81\x9a\x1c\x90\xce\xe1\xec\x76\xdd\x70\xdf\x70\x0a\xe8\x6e\x0f\x4c\x64\xc0\x2b\x94\xed\x80\x96\xab\x9d\xb2\x20\xf1\xd7\x00\xd6\x29\x0f\x94\x2f\x29\xc5\xa6\x68\x17\xa5\xc4\xc7\xd0\x46\xa5\x6b\x16\x78\x44\xb3\x31\x46\xb5\xce\x6f\x6b\xfe\x14\x69\x1c\x41\x93\x8a\xb5\x2b\x14\xa5\x21\x9a\x02\xc1\x53\x5a\x52\xb6\xb5\x77\x0b\x65\x00\x5d\xda\x41\x25\x4c\x97\x6a\xa9\x47\x4b\xcc\x86\x38\x49\xd1\x6f\x5c\x2c\x24\x02\x89\xac\x96\xdb\xe4\xed\x02\xcd\xbc\x80\x40\x80\xf6\xda\xb4\x23\xf2\x24\xdd\x17\x23\xa0\x3f\x21\xb1\x7e\x44\x2f\xfb\x14\x26\x87\x66\x33\x69\x1d\x5b\xe1\xee\x99\x20\x01\xbc\x27\x39\x8f\x0c\x5e\xea\xa5\x38\x2f\xd0\x16\xd8\x3d\x68\x66\x50\x95\xfc\x5e\xa1\xed\x3a\x90\x48\x56\xc6\x23\x0c\x4a\x9a\xa9\xd3\x22\x75\x00\x8f\x5b\xf9\xa4\x90\xdd\xe3\x61\x0f\x07\x8e\x20\xd6\xf7\xe9\x3c\x96\x3e\xd5\x34\x0c\xa7\x18\x46\x4e\x51\x79\xda\x75\x4c\xa5\xe8\x5c\x16\x1c\xdc\xa9\x36\xe7\x7e\xdb\x65\x55\x04\xef\xe6\x05\xed\x3b\x8f\xff\xa0\xe3\x6b\x12\xe3\xbe\x75\xbc\x24\x39\x32\x89\xcd\x08\xc9\x38\x77\x06\x28\x8d\x8d\x5c\xe6\xdd\xa1\xcf\x36\xdc\xe5\x5c\x46\xbe\x15\x66\x53\x6a\x79\x6c\x8b\x1b\x47\x67\x02\x6e\x72\x8a\x3a\xe8\x7b\x8f\xde\x6e\x50\x8f\xe5\xfe\xd3\x26\xf7\x04\x49\x0c\x80\x0a\x71\x52\x68\x88\xaa\x2c\xbc\xd2\x80\x85\x57\x7e\xad\x01\x95\xe7\xff\x27\x92\xa2\x7c\x21\x6f\x0a\xff\x13\xeb\x4b\x32\xba\xfc\xe1\x7f\xf7\x52\x11\xa4\x27\x05\x41\x60\xf2\x50\x10\x50\x61\x0b\xbb\x96\x5f\x65\x0b\x3b\x91\x14\xc5\xb8\x4b\xca\x2a\xf1\xa8\x16\xe5\x54\x53\xfa\xf4\xbf\x9f\x0e\x62\x35\xa5\xc0\x28\x7e\x94\x5c\x8b\x86\x79\x51\x82\x2b\x10\xec\x1c\x65\xef\xc7\x4d\x4a\xd0\x85\xd8\x4d\x88\x35\xa1\x29\xf8\x19\x41\x8e\xe2\x72\x06\x33\x29\x4a\xb0\xf2\x87\x29\x27\xa7\x72\x2e\xce\xe1\xc4\xfc\x9c\xcb\xe3\x14\x2e\x3c\x72\xbf\x4f\x28\xc5\xdd\xa1\x12\x8c\x92\x68\x31\x5e\x5c\x84\xa4\xd2\x7c\x0a\x39\xa7\x52\x99\x12\xcc\x6b\x84\x46\xb9\x49\x6e\x87\x98\xa2\xaa\xd4\x0e\x7e\x76\xa3\x08\xe2\x0b\xfa\x24\x8a\x33\x24\x71\x4f\xa2\xac\x78\xe8\xb3\x60\x47\x56\x42\x44\xc7\x13\xd1\x23\x25\x3d\xca\xf6\xa9\x38\xb6\x9e\x73\x4d\x04\x96\x0b\x27\x95\xba\x22\x9e\xb0\xa5\x32\xe4\x46\xcb\x74\x40\x3c\x49\x1e\x31\x93\x39\x81\x84\x91\x73\xa0\xaf\xb9\xcd\xa5\x92\x46\x73\xb2\x38\x1a\x22\x85\x60\x47\xb2\xc2\x8e\xf3\x54\x8c\x9d\x4b\x57\x78\x40\x79\x6c\xb8\xd5\x52\x21\xbf\x2c\xe5\xa3\x38\x27\xc9\x60\x26\x5c\x50\x55\x58\xfa\x3a\x72\x9e\x39\xc9\xd8\x9a\x39\x4a\xba\x9b\x0b\x54\x40\x9c\xa4\x86\xf3\x48\x88\x61\x3e\xd7\xc6\xbf\xe7\xd2\xb4\x64\x6d\x23\x33\x63\xb3\x73\x10\x6e\x13\x4f\x43\x9c\x57\xf3\x92\x27\x6a\x92\x4a\xd1\xb9\x55\xdc\xba\x34\x93\xd5\x54\xe7\x99\x56\x69\x96\xb5\xaa\x61\x21\x03\xcb\xbc\x02\x1e\x92\x0f\xb9\x69\x55\x37\x79\x3c\xa5\x79\x9c\x7e\xcd\x53\x7d\xc2\xcc\x90\x47\x52\x8b\x2f\x6a\x9e\x97\x1a\x1c\xff\xbb\x27\x91\x9c\x23\x03\x8f\x96\xc6\xe1\x88\x02\xcf\x14\x56\xe3\xe7\xf3\x04\x31\x44\xf2\x38\xe0\x3c\x27\x30\xe8\x06\xa5\x05\x00\x15\xf1\xf7\xdc\x48\x81\x6c\x6e\xb9\xce\x20\x06\xa6\x48\xdd\x94\x3d\x0f\x9e\xe0\x2a\x87\x1c\xde\x35\x42\xca\x89\xbf\xe3\x46\x6b\x70\x23\x94\xd3\x01\xe9\xfb\x8c\x06\x46\x00\x9e\xa4\x77\xe9\xfb\x04\xf9\x5a\x06\x31\x08\x11\xe7\xe6\x14\xd2\x9c\x84\x4a\x02\x6a\x26\x17\xe2\x73\x21\x3c\x1f\xd2\x03\x2e\xc9\x8e\x8c\xf4\xfd\x5a\xea\xd7\xdc\xd2\x39\xa3\x1f\x7f\x9b\x7e\x43\x46\x0e\x6e\xae\xf8\x2e\x9e\xe7\xb2\x47\x1e\x24\xa2\xd6\x9c\x2b\x96\x30\x6e\x10\xe6\xb9\x59\x93\x54\xa5\xc9\x83\xe6\x99\xbe\x48\xbb\x53\x3a\x8d\xd0\x81\x13\xd3\x51\x39\xb2\xae\x34\xd8\x11\x21\x13\xe2\x04\x46\x35\xb8\x8a\x54\xa1\xf2\x97\x02\x9a\xd5\x18\xcb\x80\x57\xc3\x9f\xa7\x63\x52\xa6\x61\x96\xbf\x54\x40\x9a\xaf\x52\x0a\xb1\xf3\x3c\xc1\x4c\xb9\xcd\x7d\x69\xdb\x61\x31\x44\x12\xed\x16\xdc\x08\x93\x92\x45\x29\x75\x23\xc1\x5e\x17\x42\xd3\xf9\xff\x13\x34\x90\xa8\xb7\x7c\x6a\xa0\xba\x0b\xff\xdd\x7b\x4d\xba\x2a\x8e\x20\x14\x42\xaa\x99\x7c\xdf\x42\xd7\x4f\x84\x8e\xa3\x56\xe9\x53\x26\x40\xb9\x90\xa7\xec\x35\x75\x7b\xbd\x97\xc2\x63\x91\xf1\x20\xa4\x95\x3b\x9e\x7d\xa1\xe7\xa5\x20\xb9\xce\xe4\xc4\x65\x12\x14\x84\x3c\x6d\x4d\xd7\xb5\xe0\xc6\x33\x72\x7e\x49\xc8\xa9\x33\xdf\x60\x7e\x11\x26\xb9\x4b\xa1\x48\xc3\xe9\xe4\x97\x98\x15\xa5\x2e\xd2\x33\x3f\x7e\xe6\xc7\x07\xf2\xe3\xfd\x04\xea\x16\x2d\xfd\xa0\x70\x42\x1d\xbf\xec\x7b\x1d\xbe\xdf\x97\x2e\x1e\x16\x47\xa6\x39\x86\x85\x16\xcc\x39\x2b\xc3\xd7\x25\xe0\x33\x69\xfb\x42\x48\x9b\xc9\xda\x87\x4e\xea\x08\x25\xfa\x64\x9e\xe9\xd3\x37\x4f\x9f\x84\x3a\x89\x19\xb4\x57\x35\x02\xdf\x5f\x7c\x3a\x2c\xde\x53\xa3\xf2\xdf\xae\xaf\x97\xc9\xe5\x2b\x88\x31\x98\xcc\xac\x50\x0b\x2a\x52\x77\x74\xd6\x8c\xa9\xa0\xf3\x84\x87\x5b\xab\x07\x77\x89\xa4\x93\x52\x30\x35\x69\xe0\x41\xb0\x9d\xc0\x31\x95\xa0\x3c\xf9\x21\x0b\xd7\x4e\x25\xfc\xb2\x27\x22\x59\x52\x29\xee\xe1\x1e\xb5\x7a\x70\x60\x70\xaa\x4e\x48\x82\x2a\x9e\x42\x4c\x04\x14\xf3\xa2\x49\x52\x04\xb6\x01\x39\x64\x80\xa4\x34\x82\xf2\xcb\xfd\xa1\x73\x44\x21\x3c\x5d\x88\xe4\xd1\x24\x19\x11\x5d\x91\xad\x3c\xd6\x61\x5e\x58\xf0\x45\x84\x58\x51\x3a\x57\x64\x40\xaa\xc6\xed\x84\xbc\x90\x82\x20\x47\xb7\x54\xd5\xc4\x83\xc7\xe4\x2e\x17\xf5\x72\xd8\xd3\x82\x4f\xe4\xdf\x16\x38\xc6\x74\x94\xbc\x39\x4b\x5e\x40\xe4\xe9\xd3\x7a\x8e\x29\x30\x71\xe9\xc7\xe2\xc6\xa1\xb6\xd3\x41\x2c\xc0\xd3\x48\xac\xe4\x94\x03\xda\x4a\xf6\xc4\x59\x46\xa4\xc1\x99\x14\xf9\x0f\x93\x93\x88\xda\x4b\x84\x98\x04\xba\x02\x93\x53\x33\x8d\x83\x76\x01\x12\x9b\x37\x2a\x3d\x4c\x87\x79\xba\x65\xdb\x00\x46\x27\x6f\x64\x12\xbe\xdf\x89\x6f\x52\xa7\x9b\x62\x83\xc2\x79\x21\x94\x74\xb7\x5d\xdc\x2c\x07\xa4\x02\xd8\xb8\xd3\x27\x1e\x14\x69\xe1\xbe\x82\xc5\x4a\xcb\xcb\xa0\xa1\xda\x6e\x94\xd1\x60\xc3\xb5\x06\x1d\x3a\x09\x2a\x25\xb0\xee\xa9\x15\xee\x0e\x82\x1c\x31\xd0\x7a\x24\x3e\x43\xc5\x2e\x77\xeb\x73\x69\xd3\x28\x88\x57\x87\x08\xdb\x85\x4b\x77\xe6\x3a\xf9\x2a\x77\x76\x77\x22\xb9\x74\x88\x66\x2e\x83\xe5\xb7\xbe\x96\x81\x3c\xdf\xd3\x66\x1b\xb8\x43\x73\x99\x98\xb0\x3b\x12\xcc\x1b\x43\xc1\xc5\xa6\xc3\x1a\xe0\xdc\x4e\xbb\x78\x34\xe7\x04\x9a\x69\xb2\xde\xed\x54\x21\xe0\xc7\x5f\x16\x72\xe2\x65\xa7\x8a\x04\x80\x14\x79\xe4\x7c\x81\x3b\x83\xca\x60\x70\x2a\xd0\xd1\x05\x9c\x16\x78\xa7\xb8\x07\x1a\xec\xc0\x8a\x4b\x8d\xda\x51\x98\x88\x8e\x41\x35\x6f\xd3\x49\x30\x49\xb8\xdf\xda\xf0\x21\xa1\x9f\x6e\xc6\xba\xe4\xb1\xac\xb1\x0e\x2c\xc0\x88\x33\x06\x52\x5b\xb1\x25\x0b\x07\x28\x07\x54\xc4\x22\x3f\x50\xbe\x56\x9b\x0c\x5a\x17\x60\xc2\x33\x22\x3d\x23\xd2\x97\x8f\x48\xfb\xb4\xb1\x43\x43\x83\x3d\x99\x26\x76\x8f\xe0\x53\xdb\xd8\x2b\x3e\x37\x44\xa0\x1b\x12\x41\xd8\x1e\x12\x14\x87\x2d\x76\x6c\xc1\x6a\x65\x9b\xa0\x68\x02\x47\x03\x9d\x1c\x38\x34\xb1\x00\x52\x04\xcb\x39\x31\xdc\x69\x70\x54\x40\x60\x8d\x29\xe8\x67\x24\x7e\x46\xe2\x27\x46\xe2\xa7\x42\x0e\xba\x5d\x9c\xfe\xd4\xe1\xc9\xb6\xf7\x50\xf7\x45\xf4\x79\xd0\x2e\xaa\x66\x6c\x27\x2f\x98\x27\x9b\xf3\x1e\xc8\x6f\xed\x30\xa7\xbd\xe7\xa8\xe2\x48\x4b\x24\x0f\xdf\xf5\x2b\x50\xef\xf3\xef\x34\x33\x59\xc9\x3c\x45\x33\xa3\xd4\x11\xe6\x01\x28\x16\x1d\xbf\x06\x65\xb3\x3d\x2e\xfe\x53\xc5\x29\x58\x04\x8f\x8a\xb3\xb5\xec\x57\xf9\x51\x12\x46\x29\x0f\x86\xf4\x8a\x5c\x53\x1c\x6e\x9b\x2d\x48\xc5\x52\xab\xea\xd6\xda\xb5\x5a\xe8\x1e\x79\xda\x63\x39\xf4\x24\x1b\xde\x12\x08\x82\xc6\x39\x84\x4a\xdd\x0e\x51\x6a\x4f\xd1\xb4\x12\x92\x57\x06\xa7\xca\x6b\x37\xd8\xca\x9e\x4b\xb9\x07\xe3\xba\x7d\xef\x3a\x1b\xfb\x44\x9b\x8d\x7d\x0c\x90\xcf\xc6\x3e\xf7\x5d\x33\xbc\x2d\x62\x53\x72\x02\x28\xb1\x1a\x52\x54\x33\x0f\x6e\xac\x55\x45\xa7\xad\x1c\xa4\x1b\x59\x71\x5c\xc2\xb9\x06\x75\x1a\x4f\x1c\x2a\x5d\x0e\x05\xca\x9b\x6f\x14\xb1\xd2\x67\xc0\xe8\x37\x17\x05\x0a\x3a\x4a\x4c\x82\xc6\x36\x23\x38\x30\x71\xc8\x9f\x77\xde\xb2\x0a\x6b\xc2\x08\x3d\x94\xe2\x49\xad\x6b\x90\xe1\x9d\x2a\xe7\xe2\x71\x98\x47\xc5\xb4\xac\x32\x88\xf3\x32\xae\x99\x3d\x91\xa0\x1e\xa6\xe5\x7e\xd4\x51\x91\xa3\x79\x8e\x39\xbd\x84\x45\x91\x98\x27\xb5\x0b\x3a\xcd\xb0\x05\x21\x76\x12\x50\x61\xa1\x55\x99\x24\x29\x97\x9c\x85\x78\x92\x50\x29\x95\xe4\xc0\x6c\x82\x2f\x83\x76\x4a\x25\x50\x39\x71\x92\x72\x33\x3a\x65\x23\xbd\xa7\x41\x26\x37\x10\xbd\xa4\xf2\x80\x91\x4e\x66\xe6\x37\x19\x53\xdc\x9b\x0b\xa6\xe4\x03\x94\xd0\x35\x59\x1c\x0c\x29\x4e\x5f\x7a\x53\xb5\xfc\xf0\x19\x3d\x28\xb4\x20\x95\xe2\x13\xb6\x85\xb9\x12\x39\x89\xff\xae\x0b\xd7\x41\x74\x16\x26\x76\x11\x3d\xb5\x8a\x4b\x79\x1a\x44\xd7\xbb\x88\xae\xa1\xa4\xfb\x22\xfa\x9d\xbe\xbd\x0f\x9b\x94\xe4\x8b\xd0\x3d\x00\x28\x2d\xdc\x17\x26\xed\x9e\xb0\x37\x6d\x6b\xd2\x3f\x3b\x30\x3a\x71\x9b\xa8\xc1\x9b\x79\x61\x8b\x6d\xe3\xb3\x24\x1a\x34\xde\xb7\x1d\xf8\x50\xf0\xe5\x26\xf9\xe0\x49\xa8\x9e\xc2\xd0\x1a\x2f\xe9\xb4\x6b\x0d\x57\x8a\xce\x1c\xde\x5c\x14\x06\xbc\xec\xed\x08\xa8\xa4\x85\xce\xa4\x2f\x14\x24\xb1\xf7\xc5\x17\x80\x1f\xb1\x08\xe7\xf7\xe4\x52\x34\xb7\xc9\x0f\xad\xd9\x05\x82\x96\x9d\xf1\xa3\x2d\x66\x6b\xe4\xd2\xb5\x4f\x87\xf8\xb4\x16\xb3\xd9\x0d\x8f\x22\x3d\xc4\x78\x8a\x7b\x1c\x36\xe2\xb5\x1b\xa2\x6d\x07\xe2\xda\xe7\xc5\xf1\x49\x38\xfa\x67\x86\xfa\xa7\xa2\x42\xe2\xdc\xa3\x3a\xd1\x2d\x0d\x53\x34\x68\x9d\xef\xb6\x20\xd1\x6c\xd0\xbe\x79\x4d\x5a\x51\x5b\xb6\x40\x85\xed\xc1\xce\x71\x02\x4e\xd1\xb7\xe7\x25\xbd\x35\xd7\xe1\x9c\xda\x62\x04\x17\xb5\x17\x1a\x6b\x63\xf8\xa7\xb2\xe0\x8e\x3e\x83\x63\x09\xc6\x7e\x04\x0b\x6e\x54\x64\x05\x1c\x0d\xe0\x1e\x80\x94\x00\xde\xf6\x2e\xbf\xa2\x4f\x26\x63\x62\x50\xda\xb4\x3c\xad\xe1\x8e\xa7\x35\x01\x34\x6d\x84\x95\x98\x01\x1a\x25\xfe\x61\x30\xc7\x30\x0e\xaa\x7a\x93\x61\xc4\x3c\x1d\x44\x12\x2b\xcc\xb7\x3b\x4c\x94\x4c\x6f\x2e\x0a\xf1\x45\x43\xa1\x01\xcb\x62\x0b\x2c\x3d\xb0\x9c\xa8\xc3\x9b\x0b\x0d\x2e\xf9\xd9\x12\xf7\xa7\x35\xed\xcb\xf0\x28\x8e\x0f\xf1\xba\x88\x40\x32\x0d\x7b\xd2\x0d\x98\x6b\xa4\x73\x69\x5d\x37\x59\x11\x84\x1d\x20\xdd\x3e\xcb\xf1\x44\x5a\xd1\x41\xde\xf1\x18\x8f\x5b\x53\x86\x3b\x53\x96\x26\xf7\x49\x00\xaa\x31\x42\x47\x02\xdc\x31\x95\x1f\xa1\x84\xde\x20\x0d\x68\xe7\x85\x2b\xda\xe7\xb7\xc5\xd1\x8a\xd5\x55\x16\x27\xc4\x4e\x83\x6d\x1f\x17\xcf\xe5\x3e\x21\x74\x1d\x16\x2c\x48\x9c\xbb\xe6\xf8\x6d\x12\x84\x80\x2c\xab\x3b\x29\x36\x5e\xe8\x30\x4f\x54\xcc\x62\x2d\x6b\x55\x7c\x19\x91\xcb\x61\xae\xdd\x36\x20\xd1\x9e\xe0\x39\xdd\xb3\x40\x4f\x43\xcd\x9a\xc3\x28\xa5\xcb\xa4\x4c\xeb\xa7\x15\xda\x09\x5c\xc7\x6c\xbf\xc0\xeb\x02\xa9\x45\xe4\xc5\x97\x45\x9b\x96\x57\x5f\x3d\x53\xb1\x2e\x15\x7b\x2d\x76\x28\x01\x76\x80\x0a\x82\x0c\x61\xf7\x75\xb2\x07\x48\x02\x7e\x00\x96\xe2\x58\x97\x0f\xb5\x78\x2f\x7b\xce\x83\xe6\x6d\x2d\x31\xc0\xee\xe9\x84\xed\x03\x6a\xcf\xc0\x77\x2f\xe0\xb3\x50\x3a\x2a\x7d\x90\x40\x09\x01\x31\xba\xde\x09\x5a\x70\x14\x43\xc0\xa8\x4a\x70\x26\x92\x73\xda\xda\x1e\x3a\xf0\x58\xc6\x32\xa2\x2a\xa1\xc4\x92\x08\xa3\x8e\x12\xce\x2e\x04\xdb\x7d\x77\x82\x11\x4a\x1b\x39\x77\x37\x81\x4a\x40\x53\x22\x06\xec\x94\x4d\x25\xf8\x32\x38\xa3\xb5\xb4\x83\x2c\x21\xc5\xde\x48\x1b\xb0\x31\x38\x63\x24\x1e\xbb\x21\x4b\x64\x7b\x27\xda\x72\x19\xde\x1b\x71\xb4\x4e\xa6\x44\x1d\x7d\x8f\xdf\xa2\x37\xda\x58\x45\x11\x8c\x89\x56\x7b\xdd\xe3\x12\xb4\x27\x4c\x3e\xe8\x0d\x59\x13\x8d\xee\x9d\x68\x0d\xd1\xba\x18\xbd\x78\x2b\x37\x25\x1a\x8b\xa6\xa7\x09\x62\x69\x9d\x97\xf0\x04\x31\x46\x17\x83\xe9\x69\xf1\x72\xa9\xa9\x37\x32\x50\x12\xe9\xa8\x49\xe7\x74\x6f\x22\xf5\x4e\x08\x82\x37\x65\x2c\x4b\x31\xfa\x2b\xc9\x1a\x17\x63\x0f\xc1\xc7\x58\x52\x30\x92\xd9\x68\x6f\xbd\xd5\x3d\x04\x2a\xb1\x74\x5a\x5b\x69\x8e\x75\x11\xc9\xf5\x4e\x4a\x70\xa5\x2e\x63\x20\x97\x1a\xef\x1d\x99\x18\x7b\x25\x58\x4f\xde\xfb\x10\xa3\xf4\xd4\xa2\x46\xcf\x45\x23\xf1\x9c\x49\x64\x1c\x20\x23\xb3\x36\xda\x37\x95\x6f\x7a\xaf\xb9\x75\xc1\x96\xde\x79\x2e\x02\xa3\xf7\x14\xa4\xd1\xce\x97\xae\x8c\x2e\x39\xab\x0f\x65\xa9\xbd\xeb\x11\x8f\x7d\x19\xbd\xb4\xa2\x34\x06\x0d\xe9\x1e\x0f\x4a\x70\xd6\x7a\x69\x1a\x5a\x17\xbd\xef\x9d\x68\x40\x6d\x09\xb5\x6c\x79\xf8\xe0\xc9\x6a\xea\x69\xb0\x86\xac\xb6\x86\x7b\x57\x96\x31\x46\x1b\x7b\xfc\xd0\x1b\xf1\x30\xba\xe8\xb5\x91\xc7\x13\x4d\x80\x31\x46\x8c\x12\xff\x22\xc6\x18\x82\x0d\x3c\x01\x36\x06\x32\x3e\x48\xa9\x5e\x13\x95\xf2\x36\x60\x28\x03\x49\x5e\x53\x6a\x63\xb8\x0b\x5a\x43\xa9\x7d\x44\x67\xa4\xb5\x5a\x3b\x6f\x7d\x8f\xdf\x1a\xe7\x6d\x14\xcb\x3f\xeb\xad\xb1\xce\x4b\x11\x06\xb5\xad\x47\xc1\xf8\xe0\x7b\x23\x0c\x10\xad\x0e\x9e\x7b\x01\xce\x50\x19\x30\xda\xde\x09\x06\xf0\x3a\x1a\xd2\xe2\xe0\xcb\x92\x36\x46\xbb\x14\xbf\x31\x06\x83\x9c\x39\x83\xb4\xa9\xa0\xbf\xf5\xe6\x04\x3d\x18\x53\xba\x10\xb6\x33\x96\x1a\xad\xd5\x41\x0a\x45\xef\x5c\x24\x46\xaa\x80\x2e\x44\x86\x65\x70\xfc\x15\x83\xc9\x68\xff\xac\x3d\x95\x3e\x6e\x24\xde\x8f\x84\x5e\x28\xc1\x8b\x03\x2c\x3b\xce\x21\x88\xeb\xc8\x12\x56\xdc\xc0\x8d\x50\x7c\x2f\x71\xe6\xc1\x56\x0e\x65\x94\x36\x43\x41\x8f\xed\x8f\x99\xee\x6b\x56\xe6\x6d\xe6\x0c\x58\xde\x9b\x31\x44\x08\xf6\x60\xce\xc0\x99\x77\x0f\x53\x56\xc7\x99\x6f\xf4\x9b\x6d\x81\x67\xde\x6e\xc7\xe1\xd3\x01\x28\x4e\x92\xf0\x27\xa7\x53\x8d\x32\x10\xc4\x77\xb9\xf8\xcf\x5b\x17\x06\x90\xc0\xfa\xc2\x88\xf3\xf0\x49\x01\x1a\x0b\x20\x09\xf2\x47\x05\x16\x60\x74\xa1\xc1\x44\x30\x4e\xf6\xcf\x94\x06\x4d\x45\x04\x13\x94\x29\x10\x25\x8c\x29\x01\x06\xa0\x30\x29\x92\x37\xcc\xe0\x0a\x9d\x76\x2d\x82\x29\x74\x8a\xc9\x22\x7b\x7c\x8e\xe1\xc5\xc4\x22\xc5\x15\xd4\x29\x64\xba\x05\xeb\x06\x16\xac\xdc\xd5\x61\xbe\xad\xd2\x66\x1c\xc1\x4a\xf0\xe9\x6a\x7d\x58\x83\xb1\x05\xf8\x09\x81\x8f\x45\xfe\xd8\x93\xf4\x40\xce\xda\x16\xae\xeb\x6d\xab\x35\x28\x4f\x15\x28\x0d\x53\xac\xf6\xb1\x01\xab\x4c\xde\x94\x2e\x0b\x03\x96\xff\x06\xcd\xdb\x32\x6d\x2a\x73\xde\x37\x17\x65\xe1\xc7\x62\x58\x0f\x6d\xb7\xf0\x04\x76\xd0\xbc\x4d\xbb\xd5\xa0\xd5\x7d\x1c\x1c\xdd\x1e\xb4\x0c\x21\xa0\x42\x3b\x49\x3e\xe2\x1c\x4f\x2a\x04\x92\x58\xeb\x85\x6c\x98\x27\x1f\xa2\x49\x04\x03\xd6\x08\xd6\xf0\xff\xb1\xf7\xee\xbd\x91\x24\x47\x9e\xe0\x57\xa9\xab\xfb\x67\x05\xb8\x9b\xc2\xcc\xdf\xbd\xd7\x07\xa4\x6a\xa5\xcd\xc1\x25\x57\xc2\xb4\x26\x04\x70\xb1\x58\x44\x67\xb1\x2b\x79\x13\x24\xeb\x48\x56\xb6\x5a\x83\xf9\xee\x07\x33\x8f\x88\x8c\x88\x7c\x30\x33\x19\x64\xb1\x5a\x2d\xa8\xa3\x92\xf1\xf0\xa7\xb9\xb9\x99\xb9\xd9\xcf\x88\x09\x53\xa0\x5b\xc0\xcb\x84\x62\x3b\xa1\x3c\xb5\xc8\xbd\x4c\x02\x49\x85\x55\x54\x5d\x2a\x70\x20\x9e\xd4\xc8\xaa\x1d\xe5\x4b\xfb\x00\x9d\x06\xcf\x5b\x28\x33\x96\x9c\xb4\xce\x35\x3e\x88\x92\x23\x05\x3d\x38\x7a\xc8\xe7\xb6\x21\x6a\xc9\x6e\xef\x2b\x01\xd5\x34\x2d\x1a\x6c\xa1\x4d\xce\x6d\x60\x84\x90\xb9\xa1\x3a\x80\x0d\x90\xac\xe6\xce\xa8\x7e\x44\x2f\xb0\xde\x72\x6a\xf2\xac\xd1\x10\xf6\x20\xd6\x04\x0f\xbc\xef\x02\x71\x24\x0a\xda\xe1\xcc\x76\xb2\xd6\x24\x36\x7d\xa8\xa0\x35\x38\x9a\x3e\x5f\x32\x1f\x69\x92\x08\x86\xc0\x4b\xd3\x64\x4c\x73\xe7\x79\xcc\x35\x49\xfa\x1a\x0d\xc6\x67\x77\x41\x1e\xec\x48\x9a\x07\x8b\x57\x6f\x0d\xce\xf0\xcb\x61\x09\x24\xd9\x4b\x95\x85\xc2\x69\x24\x65\xc5\x0f\xca\x80\x78\x44\x20\x24\x30\x8e\x17\x6a\x90\x1c\x3c\x5a\x56\x38\x84\xc0\xe5\xc4\x9c\xe7\xa7\x48\x3a\x66\x03\xf5\x60\xac\xd1\x28\x7a\x30\x3a\x43\xab\x89\x93\x14\x55\x10\x63\x07\x52\xab\x20\x3a\x41\x0b\x62\x0d\x4c\x2e\xcd\x41\x96\x10\x58\xc0\xa5\x96\x30\x77\x6d\x25\xaf\x03\x31\x93\xe0\xe5\x83\x19\xad\x50\xf2\xfb\x74\x99\xa8\x94\xe4\xcf\x33\x6a\x83\xb6\xc8\x54\x01\xd1\xac\x8a\x8a\xd5\x56\x15\xfb\x8c\xa2\x48\x1a\x3c\x2d\x85\xdd\x30\xa3\xcb\xee\x1f\x5e\x70\x60\xb5\x93\xe4\x3e\x1b\x36\xb1\x99\x8e\xb3\x31\xdf\x05\x7e\x62\x8a\x68\x77\x52\x94\xe6\x76\x94\x9a\xd6\xd0\x76\xca\xd7\xc9\x62\x7f\x15\xbe\x4e\x85\xa6\xab\x30\xcd\xfb\x67\x93\x56\x85\x9d\xf5\x0d\xc6\x57\xd0\x3e\xf6\x43\xe9\x2b\x0c\x1d\x82\x67\xa1\xfb\x08\x9e\xd9\x80\x1a\x64\x23\x76\x1d\x70\x27\xea\x3e\x70\xa7\x6c\xbc\x93\x6d\x11\x2c\x0d\x07\x26\x2a\x13\x2a\x31\xed\x67\x03\x7f\x6b\x35\x14\x08\xe8\x62\xb6\x09\x57\x77\x62\xcb\xb0\xa5\xc1\x61\x74\xfb\x9c\xd2\x28\xa8\x5d\xde\xeb\x7d\xd9\xab\x49\xf2\x29\x1b\x9c\x07\x79\xc9\x54\x28\x20\xd5\xd8\x41\x55\x33\xbf\x55\xc5\xaa\x98\x6a\x73\xf9\x16\x3b\x79\x74\x5c\xd0\xc1\x44\xa0\x1d\xa5\x89\xdc\x98\x13\xf1\xf9\x95\x06\xa2\x2d\xef\x33\x2a\x14\x5a\xf0\x1b\xaa\x63\xae\x6d\x75\x04\x4b\xb5\x20\x7e\xfb\x59\x47\xb4\x0d\x99\x9e\xd1\x72\x3a\xaa\xe5\x5f\xc1\x71\xe8\xdd\x74\x91\x04\xbf\x36\x42\x3c\x2a\x5c\xf9\x78\x32\xe4\x41\xd7\x2e\xe3\xce\x58\xf9\xaf\xd5\x41\xc8\x6a\x0f\x3e\x6d\xd1\xd9\xd9\xec\xf0\xc8\xa0\xe3\x43\x32\xd5\xd8\xa7\x74\x1f\x9d\x9c\x1c\x3a\x78\x90\x4a\xbc\x40\xd5\x38\xda\x45\x25\x4d\x9a\x5e\x64\x51\x0b\xdb\xb4\x5d\x85\xc8\x35\x28\xde\x0d\x12\x04\xd5\x0d\xb6\x53\xc6\xac\xc8\x8c\xee\x1b\xb1\xb5\xb8\xb5\x96\x0f\xfa\x05\xa9\x5e\xf5\xcf\xc8\x8c\xdc\x47\xfe\x6d\x01\xf8\x0b\x19\xc3\x23\x01\xf7\x9f\xe2\xe8\x6f\x79\x88\x8e\x74\x26\x9e\x8a\x75\xb7\x8e\xc3\xac\x84\x68\xc7\x6a\xe5\x13\x9c\xfa\x78\xa7\xce\xb7\xcd\xa5\x9f\xea\xc7\x59\x1c\xfa\x6d\x13\xd6\x11\x11\x26\x2f\xc9\x8a\x4f\x6b\xd4\x34\x3c\xf6\x89\x4a\xf6\xf2\xd7\x81\x4c\x3e\x9b\xca\xbd\x94\x12\x38\xc9\x3d\xec\xf2\x21\x50\x01\xa2\xa8\xc5\x7c\xab\x42\x09\x6a\xdc\x24\xa1\xb7\x4e\xd2\xeb\x8b\x8f\xac\x03\x9b\xea\xc4\x7a\x70\x02\x93\x76\xbc\x2a\x41\x70\x5b\xea\x44\x83\x2e\x38\x85\xc2\x56\xa8\x34\x47\x0f\x96\x16\x68\x01\x25\x55\x30\xf5\xa4\x06\x64\x15\x54\xb9\xb9\xef\xdd\xb3\x2a\x94\x43\x71\x43\xd1\xdc\x14\x63\x08\x2b\x1c\x08\x1f\x2a\x89\x3b\x4a\x31\xf7\x25\x9a\x55\x80\xa1\x00\xa3\x69\xee\xcb\xb0\xf2\x3c\x1c\x24\x69\x6a\xc1\xf5\x5d\x86\x21\x22\x58\x9c\x9b\xe2\x54\x4d\xee\x04\x68\x95\x0c\x2d\xe2\x4a\x81\xe7\x3d\xbb\x8d\xab\x08\x0e\xab\x20\xd1\xd7\x6d\x96\x38\x31\x30\xd1\x0b\x0d\xb3\x61\xfe\x3f\x8a\x07\x53\x4d\x5f\x4e\xf7\x60\x3c\x4a\x3e\xfa\xba\x88\x07\x85\x2c\x9b\xe7\x4e\x13\x41\x30\x33\x93\x2d\xc2\x5d\x2a\x98\x66\xdb\x5c\x60\x62\x0e\xf8\x52\x0b\xc3\xc1\xf1\x07\xc3\xa7\x69\x50\x6f\x24\xe0\x62\x1a\x4f\xc5\x57\xe3\x4b\x17\x5e\x21\x6e\x48\x26\xd0\xa9\x07\xf7\x27\x44\x8a\x35\x63\xed\xc0\xee\x93\xd9\x5e\x81\xf8\x5e\xb2\xc3\xdf\x30\x31\x1e\x1f\xac\x9b\xb9\xeb\x6c\xc0\xe5\xc5\x29\xc9\xbc\xd8\xbc\x1d\x64\xf3\xc7\x4f\xe8\x4b\x87\x57\xee\x10\x53\x04\x19\x79\x0a\x51\x45\xd0\x5e\xd1\x40\xe0\x29\x0f\xe2\x7d\xde\x49\xc9\x06\x62\x60\xaa\x41\x04\x94\xd3\xaa\xa4\xa8\x3b\x8f\x63\xe9\x55\xc4\x6d\x52\x7d\x8f\x48\x40\xbb\xf0\x8a\xdc\x31\x82\x47\x0f\xba\x53\xd3\xb9\x7b\x39\x8b\xcf\x28\x67\x05\x7c\xc9\x4f\x24\x3b\x92\x61\xd1\x06\xcc\x20\x25\x8f\xc4\xfc\x59\xc0\xa4\xd1\xe5\x3c\x88\x56\xc9\xa5\xe9\xf1\x66\x34\x2e\x45\x02\x75\x92\x57\x00\x58\xe7\x8b\x51\xa3\x81\x88\x15\xf8\x5e\x9e\x33\xc9\x8d\x46\x96\x17\x96\x3d\x1e\xe2\xf4\x0c\x39\xea\xeb\xcd\x13\x0b\x5f\x54\x8d\x83\xe3\x9f\x23\x7e\xbd\xfd\x29\xfb\xb6\x85\x39\xd9\xff\x32\x7e\x15\x98\xc5\x29\x83\xb2\x4a\x92\x41\x09\x7c\x50\xa6\x4d\x0f\x2a\x9b\x28\x4a\xe6\x5b\x03\xde\x28\xd3\x46\xc8\xa2\x06\xf2\xba\xc9\xc4\xfc\x12\x84\xf7\x72\xe2\xe4\x33\x28\xb0\x42\x19\xdd\x56\xc4\x28\x14\x14\x41\x83\xd9\x1e\xb5\xcd\x34\xfc\x26\x98\x3e\x25\x98\xfe\xb6\x0b\xed\x61\x69\x2f\x06\xae\xd0\x11\xe7\x5c\x08\x62\x66\x72\xc8\xb5\x4f\xbf\xad\xf9\xd7\x5d\xf3\xbf\xc9\xfe\x6f\x52\xba\x31\xf8\x6d\xb0\x82\x57\xd5\x3d\x24\x49\xcb\x24\x1e\x2d\xe0\x50\x51\x80\x68\x66\x68\xc1\x4a\xda\x88\x76\x09\x89\xf3\x4d\xaa\x9a\xc0\x0e\xda\x70\x1e\x04\xe3\xb4\x85\x88\xac\x70\xa3\x9b\x61\x21\xce\x6c\x72\x6d\x86\x53\xbc\x3e\x2d\xd8\xd2\x00\xf2\xaa\x15\x87\x6b\xd3\x83\x20\x08\xaa\x28\x2d\xcb\x38\xdb\x1f\x07\xfe\x56\x4a\x5e\x5b\x89\x94\x1f\x37\x80\x49\xc0\x37\x8d\x1b\x36\x5a\x37\xce\x4c\xc9\xa8\x5e\x56\x45\x5e\x5a\x6e\x8d\xc3\xe4\x19\xa8\x70\xc5\x1d\x1f\x27\xba\x8c\xe0\xe2\x30\xbb\x59\x3b\x42\x97\x17\x92\xea\x9c\xa2\xc0\x01\x78\x39\x55\xf6\x9b\x04\xbe\x04\xd6\x6a\x23\xc9\xdb\x6d\x73\x6d\x8a\x05\xef\xb4\x83\xe8\xf2\x70\x55\x11\x82\x55\x72\x69\xfc\x0e\x82\x38\x5f\x49\x67\xab\xdd\x9f\x73\x8f\x9d\xda\x5d\xa7\x32\xd3\xc6\x98\x1b\x0b\x14\x67\x32\x45\xd4\xcb\xd0\x5f\x80\x8b\xca\xd0\x1c\x79\x25\x6c\x3d\x6e\xbf\x7b\x41\xcd\xeb\x2d\x35\x6d\x1b\xc1\xfb\xf9\xcb\xa8\xc2\x02\x92\x64\x9b\x49\x1d\x22\x9a\x24\x02\x0e\xc2\x11\x6d\xbe\x14\x9b\x03\x2b\x88\x4c\x46\x92\x9f\x3f\xb6\xd2\x42\x06\x24\xb5\xe7\xd3\xd2\x9c\x69\xfc\x19\xd4\x3d\x8b\x10\xb9\x41\xed\x1a\x8b\x4a\x50\x9b\x22\xf3\xfd\xd8\x42\xf3\x30\x6b\x08\x82\x4f\x6a\xb7\xac\x3e\x44\xe0\x94\x5f\x16\x5a\xb2\xe4\x68\xb0\xc4\x57\x6f\x2a\xf1\x53\xce\xde\xca\xcd\xf0\x88\x2f\x24\xfe\xaa\x58\xcc\xa4\x5a\x30\xbe\x0c\x74\xd8\x21\x70\xcd\x28\xe1\x10\x68\x6a\x1e\x12\x0d\xb2\x1c\x78\x07\xb6\xed\x16\xfc\xad\xef\x2b\xd2\x31\x30\x6b\x82\x48\x92\x61\xfd\x44\xcc\xc4\xfd\xf9\x74\x44\xc2\x60\x25\x88\xd7\x28\x6d\x50\xbb\x1c\x0b\x56\xc7\x1f\x0d\x9e\x26\xf0\xbd\x1a\x53\x3d\xfe\xe4\xfc\x05\x28\xe9\x00\x6b\x1d\x9b\xb9\x0f\x71\x1f\x09\x54\x75\xe1\x6d\x70\x9f\xa3\x09\xf1\x0c\xc1\xf4\x24\xf4\xf7\x21\xdc\x80\x64\x13\xdc\x9b\x4c\x9b\x94\x9d\xf7\xdd\xf6\x48\xf9\x72\x78\x1a\xa0\x68\x3e\xcc\x24\xa5\xa9\xec\x8b\xf6\x5c\xc4\xe5\x85\x55\xa6\x28\xfd\xdc\x50\x69\x4e\xf1\x9a\xc5\xad\x11\xda\xb4\x2d\x0a\x85\xd8\x06\xf1\x88\x27\xd1\x68\x33\xc0\x45\x92\xe7\x92\xc9\x16\x3c\x2b\x08\x19\xcc\x59\x76\x81\x20\xf3\x2f\xf0\x77\xcd\x5d\xbe\x2f\x9f\x24\x01\x38\x39\x39\x77\xf5\xae\x26\x92\x38\xdc\xf3\x82\x0c\xb5\x76\x60\x59\x9b\xd1\x56\xdb\xed\x40\x72\xc7\x35\x13\x41\x62\xf2\x30\xb5\x87\x90\x34\x5f\x16\x98\x21\xcc\x05\x3b\x3f\x38\xc9\x33\x37\x47\x57\x47\xb0\x4e\xf3\x65\x21\x6b\xaa\x64\x25\x56\xb0\x9a\x23\xca\xa5\xef\x90\xbf\x69\xc4\x49\x91\x1c\x07\x63\x61\x92\xc4\xed\xf4\x86\x5e\xf5\x87\xbe\x7d\x41\x80\x5b\xbc\x2a\xaa\xe1\xe0\x37\x7f\xcd\x86\x83\xdf\x4c\xc9\xb3\xbc\x3c\x0f\xb4\x39\x80\x11\x20\xa5\x10\xea\xd7\x99\x82\xad\x1a\x9e\xe5\x03\x7a\xc0\x23\x4c\xd4\x5c\xe2\x95\x35\xb7\xa5\x9f\x33\x47\x1c\xab\xe5\x0a\x28\x6a\x3a\x63\x25\x23\x81\x11\x91\x8f\x79\xae\x6d\x99\x6e\x5b\xe5\x19\x3d\x32\xfb\x7b\x74\xc8\xe1\xea\xd4\x6a\xec\x4e\x86\x78\x70\x10\xa7\x61\x74\xc2\x42\x62\xb7\x32\x70\xb0\x32\x1a\x0e\x13\x2f\x2f\xbc\xa2\x50\x32\xb1\xd5\x5e\x7b\x28\xb6\x50\x96\x0a\xa6\x3a\x4c\x60\x9c\x8a\x2c\x66\x50\xb8\xbc\x61\x09\x5e\x6c\x39\xae\xf6\x40\x46\xf3\x45\x38\x8a\x03\xbb\xfd\x3d\x13\x25\x53\xe4\x09\xf9\xb6\xf7\xfb\x1c\xb6\x07\xcc\x36\x2a\xb9\x74\x7b\x6f\x88\x67\x8d\x5b\x47\x56\xe2\xd8\xe7\x37\xe2\x41\x3e\x3f\xfe\x36\x06\xf1\x18\x99\xed\x7c\x22\x3f\xcb\x14\x35\x86\x37\x93\xd4\xc1\x53\xf8\x14\x06\x40\xab\x8c\x99\x63\x01\x9e\x3e\x38\x31\xde\x9a\x0c\x85\x88\xa9\xf1\x36\xa8\xfa\x40\x4e\x51\x27\x66\x96\x58\xc8\x73\xb9\x36\x44\x53\x64\xd1\xab\xf0\x2c\x68\x15\x22\xa2\x15\x9d\xa3\x7f\x8e\xd8\xf3\x55\x07\xd4\xd9\x3c\xf0\x2a\x7e\x30\x12\x7d\x2e\xbe\xa9\xc6\x70\xf5\x6d\xab\x2e\x2f\x30\x41\x91\x94\x84\x00\x46\xd6\x74\x63\xa7\xee\x6a\x69\x60\xac\x0b\x05\x31\x08\x12\x24\xce\x02\x24\x56\xce\x53\x67\x2b\x94\xe6\x2f\x25\x70\x19\x42\x50\x19\x57\xc7\x13\xff\x98\x4b\x25\x1f\x4c\x21\x28\x8b\x92\x91\x93\xa2\x5c\x2d\x78\x57\x49\xe4\xaf\x5c\x72\x6d\xbc\xcb\x32\x4d\x79\x49\x35\x13\x35\x60\x04\x93\xf8\xb7\x99\x45\x10\xa4\x52\x8c\x1b\xdd\xa8\x69\xf4\x0b\x1a\x61\xba\x11\x1d\x0f\x76\xa1\x80\x04\xa5\xd7\xb2\xf0\xcc\x82\xb0\x16\x15\x46\x63\x35\x62\xf7\x92\x13\x07\x9c\x55\x6d\x8c\x2a\x6a\x30\x92\x21\xb7\xce\x8e\xc5\x62\x3f\xe7\x9e\x62\x1c\x0d\x08\x0b\xc6\x26\x70\x1f\xfd\x07\x43\x20\xb1\xf7\xca\x14\x12\x90\x2a\x1a\x74\x21\x91\x1f\x22\xa5\x2f\xb5\x91\xa0\x69\xcd\x43\xaf\x0d\x24\xcc\xbf\x02\xa4\x6a\x38\x63\x92\xc0\x03\x62\xaa\x21\x7a\x0d\x22\xf6\xc7\x30\x9a\x78\xe6\x12\x98\x74\xe4\x51\x37\x4a\x2e\x1b\x85\x21\xaa\x50\x05\x70\x46\x85\x0e\xf2\x3a\xc7\x79\xf2\x8d\xe6\xd2\xec\x9b\x02\xce\x8c\xa2\x14\x70\x2f\x8b\xb6\x20\x9e\x3e\x65\xe5\x80\xa0\x90\xb0\xcb\xa2\x4b\x4f\xcc\xfc\x09\x99\x93\x19\xdf\x5b\x12\x85\x8e\x8a\x97\xc4\xb2\x90\x00\x4a\x65\x79\x0d\x25\x49\x84\xe3\x59\xe8\x14\x4a\x2b\xd2\xd2\xe6\xa5\x12\x72\x9c\x70\xca\x3f\x22\x18\x37\x1b\xae\x89\xa2\x5b\x2c\xbf\xc6\x93\xf8\x3e\xd9\xa2\x55\xf9\xda\x92\x2d\x6b\x8b\x2b\x4d\x3c\xe3\x02\xfd\xbb\xa1\x4a\xf1\x57\xa6\xb7\x44\x96\x4c\x7f\x5e\x45\xe8\x20\x7b\x88\xdb\x61\x83\x84\xac\xc5\xd9\x98\x3f\xbe\x15\xe2\xf9\xed\x84\x7d\xe3\x4e\xff\x24\x03\x3d\x38\x8b\x3d\x78\xc3\xd6\x2d\xef\x43\xbb\x6f\x3a\x41\xab\x37\x8d\x95\xc2\x98\x3c\x8b\x1f\x8c\xf4\x87\xf7\xb8\x76\xc7\x73\x79\xbb\x79\xfe\x2c\x9e\x66\x6c\x3a\x73\xf3\x18\x58\xbe\x3d\x78\x9d\xed\xa7\x67\x71\xd0\xaf\x39\x7c\xdf\x64\xf2\x87\x01\xe7\xcc\x02\x98\xeb\x73\x4e\xf2\x2b\x1d\xf6\x47\x68\x69\x07\x84\xdf\x1e\x41\x7f\x3b\x4e\x00\x43\x7c\xbc\xba\xbe\xfe\xfc\x70\xfd\x30\xbf\xbb\xbf\xfe\xc7\xdd\xed\x63\xb5\x75\x48\xdc\xd7\x17\x10\xb0\x09\x54\x8c\x42\x43\x04\xe9\x79\x51\xf6\xbb\x62\x20\xcf\x28\x7a\x57\x24\x64\xaf\x68\x2b\x65\x9d\x59\xf6\x13\x88\x22\xc7\x8f\xc9\xb9\x61\xc2\x67\x8c\xd1\x04\x51\xbd\x47\x8f\xd9\x71\xb6\x96\x17\x8e\x20\xde\x6d\x6d\x19\x47\xb8\xb5\xc4\x5e\x5e\xdd\x3f\x5e\x2f\x0f\x92\x7a\x3b\xd2\xb6\x41\x4f\xfe\x46\x28\xbd\x2d\x3a\x53\xe5\xc4\xa4\x7e\xf4\x98\x7c\x5b\x94\x7e\xfc\x98\x7d\x43\xa4\xfe\xa7\xeb\xfa\xf1\xea\xfe\xbf\xdf\x5f\x4f\x03\x8d\x2b\x30\x0b\xd1\xd7\xa4\xb0\xa4\xa2\x9f\xd7\xa5\xd0\x82\x16\x15\x16\x2c\x3d\xc9\x3e\x45\x0e\x42\xaa\x05\xbc\x4b\x79\x70\xa3\x57\xf9\xcd\xa4\x28\xb6\x45\xf9\xb8\xa0\x20\xc7\xf4\xbc\x6f\x59\x39\xe2\x6f\x85\x30\x01\xac\x2d\x91\xfa\x86\x6c\x8d\xf3\x41\xc6\x16\x85\x6b\x41\x0c\x1e\x7c\x08\x96\x14\x4a\x8a\x5d\xae\x60\x22\x39\x9c\x77\xd9\x35\xab\xe2\x15\xb8\x2e\x52\x19\xd0\x81\x71\x75\xe0\xcd\x36\xb0\xca\x04\x9b\xc4\x5e\xf9\x59\x4e\x23\xd0\xff\x44\xd0\x6f\x6b\xc3\x5a\x1f\x82\xc5\xc1\xb3\x40\x9a\x1f\x16\xac\x33\xf1\x57\x16\x9c\xed\x8a\x8b\x3a\xd7\x85\xac\xfc\x91\x1b\xb5\x83\x1f\x96\xb8\x9d\x44\x66\x43\x0a\x13\xe6\x19\xf8\xe7\x20\x88\xe3\xf0\x52\xbf\x0e\x68\xf4\x34\x50\xcc\xaf\xd6\x2e\xfa\xb6\x17\x51\x79\xf3\x87\x2f\x9f\xc6\x2b\xe7\xfe\x6a\xf9\xf8\xee\xe7\xeb\x8f\x8f\xab\xef\xdf\x1b\xff\xfe\xdd\xea\xea\xfa\xd3\xea\x31\xff\xbe\x67\x66\xff\xfe\xdd\x4f\xd7\x75\xfd\xfd\xfb\xff\xf3\x27\xf9\xdf\xfb\x77\x77\x9f\xab\xe5\xf5\xe3\x2f\xdf\xbf\x67\xa5\xe8\xfd\xbb\x87\xc7\x5f\xea\xab\xef\xdf\x5f\x3f\xdc\xd5\x92\x95\xe6\xbb\xfc\xeb\xea\xfd\xef\xff\xef\xde\xe1\x07\x84\xa4\xd0\x42\x34\x95\x80\x24\xca\xa5\x21\x76\xb0\x41\x67\xf8\xb8\xe1\x03\xee\x30\x66\xef\x59\x1b\x94\x03\xbb\x04\x93\x20\x3a\x81\xa7\x64\x15\x47\x5c\x13\x80\xd2\x0f\x41\x91\x60\xfc\x25\xd1\x40\x7c\x4d\x80\x41\x92\x5d\x54\x60\x4c\x76\x4f\xc8\x41\x26\xa8\x81\xc0\xf0\x64\x74\xb7\x64\x66\xac\xa0\x05\x8b\xa6\xb7\x51\xf4\x44\xa5\xc9\x59\x64\x30\xe4\x4b\xf7\x20\xe4\x24\x53\x41\x92\xc3\x0d\xbe\x13\x40\x25\x51\x11\x3b\xdb\x59\x97\x83\x06\x50\x9a\xbe\x36\xdc\xb4\x7e\xa9\x19\x21\xde\x90\x2a\x9e\x5d\xa6\xa8\x4f\x7e\x53\x26\x72\x99\x1e\xa2\xaf\x08\xbc\x00\xb1\x6e\x5c\x97\x43\xd4\x94\xfd\xee\x59\xcf\xdc\xf8\x78\xc8\x80\x23\x14\x4e\x11\x84\xe6\xd2\x3e\x31\x51\xf3\x93\x99\x81\x64\x94\x5c\x9a\x41\x91\x6c\xe2\x44\x15\x41\x24\x45\x9b\x54\xa5\x94\xb1\xff\x0a\x41\x96\x14\x68\xc9\x76\x80\x03\x48\x5e\xff\x98\x16\x4e\xf2\x9b\x26\xf0\xa6\xd6\xa4\x2d\xc4\x31\xd1\x0d\x68\x49\xfc\xf1\x90\xd5\x48\x99\xa0\xce\xa6\x69\x50\x12\x70\xcb\xa1\x01\x77\x2a\xe4\xe0\x23\xae\xa3\x70\x55\x33\x52\xed\xc1\x81\xce\x40\x90\x31\xac\xb4\x38\xd8\x93\xa4\x3b\xdf\x3c\x82\x18\x36\x05\x61\x3e\x87\x10\x8c\xc9\x11\x99\xf0\x13\xd4\xe2\x23\x2e\xd0\x87\x7c\xe9\x1e\x70\xa1\x0d\x70\xe5\xc0\x7d\x1f\xc1\xd9\x9a\x94\x03\x9e\x32\x12\x2a\xde\x10\x97\x24\x80\x46\x71\x38\xec\xfb\x1b\x92\x86\x64\x6a\xfe\xd7\x64\x2f\x6d\x52\xfc\x83\x0b\xe0\xf6\xd0\x86\x6c\xc9\x43\x32\xb3\x71\xc1\x86\x78\x75\xb8\x85\x91\x41\x0f\xbc\x10\x83\x58\x7a\x3b\x63\x54\x11\x35\x58\x1e\x56\x69\x72\x67\xa4\x6a\xc7\xfb\x72\x7b\x52\x86\xe9\x0c\xae\xaa\xfb\xe5\x6a\x92\x9d\xd9\xf3\xa2\xe5\x59\x9b\x61\x21\xdc\x51\xae\x99\xb7\x0b\x80\xaa\x24\xc5\xe5\xff\x37\xab\xa0\xfb\xe0\x46\x08\xce\x55\xbc\x4a\x1a\xb7\x0a\x95\x7f\xb7\x77\x64\x6a\x8c\xc6\x29\xfd\x87\x8d\x53\xc6\x00\xa5\x5a\x07\x30\x41\x07\xb0\xbc\x5a\x2d\xe5\x13\x50\xbe\xc7\xc4\xde\xa2\x8d\xcb\x56\xd6\x7c\xb1\xcd\xa4\xaf\xaf\x7e\xfe\x70\x57\x7f\xb9\xb9\x9d\x06\xbc\x11\x95\x9b\xbb\xfe\x01\xfb\xce\xd0\xe4\x11\xda\x42\x19\xfa\x5f\xa0\x72\x97\x17\x68\x14\xa5\xb9\x2b\xc3\x2a\x5e\xde\x60\xa1\x8a\x39\xe6\x3f\xc6\x1d\x10\x08\x96\xff\x76\xf7\xe5\xc7\xa9\x80\x58\x72\xd6\xc1\x7e\xce\xb9\xc0\x7c\x3c\x2d\xe4\x20\x30\x1a\x15\x24\x64\x23\x41\x4f\xa6\xc2\x61\x1a\x44\x01\x64\x0e\xe2\x73\x1e\xb0\x9f\x3c\xa6\x29\x7c\xca\x2c\x17\x49\x50\xd9\xf6\xb4\x17\x53\xd7\x60\x53\x1c\x68\x70\x46\x85\x0e\x62\x11\x1c\xb7\x58\x8a\xdf\x4e\xc2\x55\xd5\x57\xb7\x1f\xab\x69\x00\x64\x24\xaa\xc5\xcf\x29\x95\x71\x65\xb2\x4b\x4c\x9c\x87\xd2\xcf\x8d\xc0\x94\xe6\xec\x80\x1d\x0a\x2a\xef\xbd\x11\x4b\xee\x50\xda\x7a\x98\xbd\x7d\x68\x45\x11\xb6\xbf\x34\x02\x65\x8e\xa9\x0c\xe2\x6d\x35\x7e\x9a\x9b\xb1\x67\x72\x44\x70\x39\x61\x72\xfe\xfe\xfd\xfb\xf8\xfe\x1d\xab\xe3\xf6\x7d\x2b\xf0\xd0\x46\xde\xd9\xf6\x40\x3b\xbd\x16\x23\xb5\x70\xf9\x2f\x5a\x8d\x95\x6a\xa8\x78\xe1\x6a\x5c\xae\xc6\xbf\x70\x35\xbe\x3f\x35\xe9\xa5\x6a\x09\x83\xa9\x79\xb1\x6a\xe2\x60\x6a\x5e\xac\x9a\x34\x98\x9a\x17\xab\x06\x8b\xde\xdc\xd0\x8b\x51\x00\x62\x7f\x72\x5e\xb0\x1e\xea\xcf\xce\x0b\xd6\x63\xfa\xd3\x73\x52\x3d\xa7\x71\x6b\xdb\x88\x4b\x85\x64\x00\x18\x44\x5b\x98\x9e\xef\x6a\x52\xa6\xec\xa7\xfe\x95\xf7\xa7\xd8\xf2\x58\xfd\xcb\x47\x40\x3b\x1a\xd0\xb3\x67\xb0\x5e\xd3\x6f\x80\xbc\x3f\x05\x5b\xc7\xcc\x3c\x78\xc0\xb3\x3d\xb2\x19\x68\x26\xdc\x73\x47\xfa\x14\x54\x8c\x81\xd3\xe8\xcb\xee\x90\x4f\xf9\x90\x9e\x36\x98\x47\x9a\x9c\x27\xde\x33\x8f\xb4\x3d\x4f\xbd\x87\x1e\x65\x89\x9e\x7e\x4f\x3d\x54\xad\x1b\x56\x3b\xe5\x1e\x7b\xa8\x5a\xbf\x6b\x6a\x27\xd9\x3e\x0e\xd5\x1a\x76\x4e\xed\x8b\x57\x1b\x77\x4e\xed\x8b\x57\x9b\x76\x4e\xed\x8b\x57\x8b\xc5\x8e\xb9\x9d\x66\x8f\x3b\x58\x2d\xee\x9a\xdc\x57\xa8\x97\x76\xcd\xee\x2b\xd4\x6b\x76\x4d\xef\x34\x7b\xfc\xc1\x7a\xed\x28\x82\xed\x35\xf6\xfc\x83\x0d\x72\x23\x2f\x27\x09\x21\x9b\xa3\x29\xe3\x2a\x41\x88\x7b\x22\x5c\x27\x0e\xf5\xf4\x6f\xc2\xcf\xb2\x87\x66\x62\x5e\x47\x18\x70\x60\xf6\x9d\x00\x1d\x20\xeb\x23\x11\xfb\x27\xdf\xf5\x8f\x42\xd7\x7f\x89\x7d\xff\x40\xc5\x76\x67\x87\x27\x62\xd3\x07\xea\x75\xbb\x3b\xfc\xf2\x15\xfb\x61\xc5\x13\xef\x87\x07\x2a\x0e\xa3\x8a\xa7\xdd\x11\x0f\x54\x1c\x77\x4d\xf1\x54\x5b\xc4\x81\x7a\xd3\xce\x29\x7e\x85\x8a\x59\x06\xd8\x31\xc7\xaf\x51\x33\xee\x9c\xe4\xa9\xf6\xc5\x43\x35\xd3\x88\x19\x9f\xbd\x33\xfe\x5f\x9f\xef\xea\x5f\x3e\xdd\xdd\xbe\xfb\x7c\x77\x7d\xfb\xf8\xf0\xfd\x7b\x42\xa0\xf4\xce\xbf\x43\x93\x2f\x31\xe7\xd7\xe4\x7f\xf3\x93\x49\xfb\xb1\x0f\xc5\xfe\x5b\x76\xfb\x6e\x2c\xb8\x2b\x6d\xcb\x54\x11\x90\x22\x68\xb3\x70\x4b\x6c\x77\xe9\xe7\x48\x40\x65\x9a\x6d\x1e\xe6\x28\xd6\xa8\x52\xc9\xdf\xbd\xba\xb1\x99\xe9\x87\xfc\x3c\x96\x64\x57\x74\x79\x53\x68\x37\x8f\x25\xa6\xde\x6f\xb9\xef\x15\x16\x73\xb4\xbd\xb7\xd0\xf6\x5e\xe3\x3f\x36\xef\x51\xd1\x7b\x8f\x8a\xde\x7b\xfc\x47\xef\x3d\xdf\x7f\xcf\xf7\xdf\xf3\xf9\xbd\x89\x40\x17\x5e\x54\x78\xdc\x53\xb7\x99\xde\x56\xf4\x5c\xcf\xfc\x57\x18\x87\xe3\xb1\x1f\x76\xe3\x0f\x37\x52\xf5\xeb\x2f\x92\x3d\xf6\xa6\x36\xb8\xf4\x1b\x5c\x25\x2f\x8d\x08\xf1\x6a\x40\x89\x3b\x11\xc6\x65\x4b\xfa\x4a\xa4\x22\xda\xc8\xeb\x91\x84\x57\x6e\x37\x11\x4c\x1f\xee\xf0\x8a\x7c\xe2\xe4\xf4\x36\x6f\x24\xf8\x62\x7d\x75\xfb\x38\x91\xd3\x07\x86\xec\x91\xd9\xc0\xc6\x50\x01\x6e\x14\x4d\xde\x1c\x90\xe7\x57\x4d\x1d\xc1\x5b\x1d\xc5\x0b\x66\x18\x74\x8e\xd3\x1e\xea\x7f\x13\x07\xe2\x27\x75\xcc\x7c\xe5\xa3\x23\xfb\x95\x4f\x8e\xdc\x57\x3d\x38\xda\xd0\x77\xed\xc0\x78\xc5\x97\x05\x79\x20\x71\xa2\xdb\x42\x3d\x19\x51\xbd\x36\x90\xac\x5c\xc6\xe8\x28\xe7\x90\xfd\x09\x80\x7f\x5f\xdd\xe8\x68\xbe\xb1\xf3\xb7\xb3\x3a\x69\xdf\x80\x61\xd5\xbd\x09\xbb\xea\x2b\xd1\xdb\x91\x66\xd1\xd3\x16\xae\x02\x32\x1a\x2c\xce\xc9\x40\x7c\xee\xda\x6d\x0c\x13\xcf\xb2\xae\x7e\x15\xab\x86\x7d\xcb\x96\xf2\xf3\xba\xe4\xde\x9a\x38\x36\x45\xa4\xc5\xd7\x30\x08\xd0\xab\x19\x04\xf6\x1a\x23\xf6\xd8\xa7\x8a\xb7\x6c\x9f\x22\x07\xc9\x2a\xf4\xe0\x62\xad\x53\x86\xb0\xf0\x61\x81\xc2\x96\x12\x37\xc8\x30\xd9\x98\x0e\xbc\x9e\x20\x29\x4c\xb5\x01\xc3\x8a\xa3\x89\x8b\x0c\x65\xeb\x7d\xd5\x7f\x35\x43\xca\x25\x23\x97\x17\xc3\xfd\xff\xba\x9a\xd4\x98\x9b\xf7\x95\x6b\x0f\x86\xc7\x43\x22\x3e\x5a\xd4\x85\x3c\x3c\x78\xe6\x38\xab\xa0\xc3\x4a\xe3\xdb\xd5\xd8\x7f\xb5\x0a\xea\x6f\xa6\xc2\x37\x64\x2a\xbc\xd1\x96\xa7\xcd\x40\x11\x5f\x99\x5d\xbd\x2a\x04\xec\x1f\x7f\x39\x00\x00\x6b\xc0\x93\xc2\x00\xce\x2c\xb5\x69\xc0\xcd\x8c\x4e\x40\x51\x63\xa1\x59\x72\x24\x8d\xc5\x0f\x4e\xf8\x0f\x82\x51\xcd\xdb\x0b\x84\x40\x0a\x63\x0d\xe4\xc1\xc6\xa5\x69\x00\x97\x8c\x4a\xb2\x00\x24\x6d\x66\x24\x85\xc5\x03\x12\x58\xaf\x8d\xbc\xdf\x94\x57\x4b\xae\x14\x1b\x2f\x2f\x90\x09\x80\x8b\x30\x1f\x90\x44\x12\xe5\xdf\x8a\x25\x52\xe6\x41\x56\x61\x5c\x0a\x68\x49\x52\x11\x30\xe8\xc8\x4f\xd1\x40\x94\x5f\x3f\xf0\xf4\x5b\x9e\x99\x40\x92\xd3\x38\x29\x8c\x1f\xf2\xcd\x5c\x00\x19\xb0\xd4\x14\xba\xa9\x6b\x22\x88\x5a\x8c\x12\x18\x88\x80\x61\xe6\x21\x7a\x25\x97\x26\xc0\xcd\x65\xac\xf5\xcd\x5d\xa1\xa2\xcd\x17\x97\x37\x02\xa4\x1a\x68\x66\xf9\xb9\x6d\x3f\x45\xc5\x2c\x27\xf2\x8d\x90\x2f\x0d\xf9\xc9\xa7\x44\x10\xd3\x44\xf0\xb5\xbf\x4d\xfe\x61\x01\xf4\x30\xac\x01\x14\x1d\x84\x07\x14\x46\x96\x1e\x4f\xf4\xb1\xc9\xe5\xb7\x17\xe9\xfc\xfa\xe3\xfe\x85\x4a\x0e\x30\x31\x63\xb2\x33\xcf\x8c\xce\xf7\xf8\xa4\xa0\xf2\x08\x08\xda\x80\xd8\x34\xff\xd4\xcd\xcd\x90\xf2\xa5\x91\x5c\xc1\x04\xb0\x46\xe2\x79\x0c\x90\xa9\x64\x23\xb3\x6d\x99\xa8\x20\x58\x0d\x85\x9f\x8d\x89\x90\x4c\x53\x97\xe5\xc2\x6c\x5b\x22\xf2\xcb\x92\x8a\x65\x92\x75\x65\xac\x44\xd1\x3e\x45\x98\x15\x7a\xa1\x32\xbf\x09\xe9\x74\x40\x16\xa2\x5b\xa0\x85\x68\x65\x5f\xcc\x5b\x74\xaf\x6b\x06\x3c\xab\xbf\x61\xe9\x32\xbc\x37\x16\x19\xf5\x17\xad\x90\x96\x62\xd2\xaa\x30\x08\xba\x65\x68\xe3\x4b\x59\xea\x36\x41\x39\xc0\xba\x8d\x9e\xa3\x0a\x93\xb0\xf9\xb4\x09\x35\x75\xda\x77\xd4\x3d\xcd\x1a\x95\xb1\x77\x10\x62\x6d\xc1\x32\x97\xb0\x9e\xeb\x75\x12\x94\xea\xa8\x9b\x69\x9f\x54\x00\x4a\x0b\xe2\xcd\xe9\x98\x95\xc9\x83\xc7\xad\xf7\x9b\xd6\x4b\x84\x20\x82\x4f\xb5\x53\x2c\xb2\x04\xa7\x11\x9c\x26\xaf\xc9\x5f\xde\x08\xde\xa7\x5c\x3c\xf8\x7c\xa9\x2c\x44\x54\xb6\x05\x52\x47\x4d\xe0\x1a\x86\x36\x64\x5d\x86\x77\xce\xa8\x46\xaf\xcb\xe6\x29\x7c\xc1\x99\xcb\x1b\x8d\x60\x9d\x5c\x2a\x11\x99\xe4\xd2\x88\x30\xe0\x9c\x5c\xea\x06\x52\x9a\xa7\x35\xc9\xf7\xa9\xad\x3a\x5b\xe7\x81\x96\x3a\xcf\xab\x96\x79\xd5\x3c\xaf\xba\x63\x19\x3c\xaf\x99\xb2\x36\xc8\xa3\x80\xa4\x3d\x9c\xb2\x25\x1c\xc4\xce\x8e\x82\x52\xd8\x6c\x09\x83\x55\x97\x43\x43\xc1\xd7\x4d\x46\x8e\x5d\x0b\x39\xb3\xfe\x1d\xbb\x46\x5b\xe8\x14\x70\xbf\xbf\xc2\xd5\x75\x80\xcd\xbe\xfd\x95\x15\xc1\xa8\x08\xe6\x4d\x90\xfd\x5e\xab\xc4\x38\xa4\xfa\xf1\xea\xf3\x9f\xee\xee\x7f\xae\xee\x3f\xd2\xde\x4d\x2b\x40\xc1\xc4\xec\x68\x2b\x4d\x9c\xe4\xaf\x59\xa0\x07\x27\x00\x18\x01\x90\x04\x97\x33\x56\x08\x12\xfa\xdd\xbd\x65\xbc\xa4\xba\x59\x15\xac\x95\x0a\xca\x46\x02\x1b\x05\x63\x73\xc6\x23\xaa\xb0\xc3\x0d\x50\x5d\x7d\x27\xed\x43\xef\xfa\x21\xfc\x3c\xb9\x49\xb9\x61\x33\x74\xf3\x57\x49\x49\x74\xf1\x7e\x0b\x4d\xb6\xc6\x00\xb7\x66\xd0\xf2\x5c\xd0\x49\xdb\xc0\x18\x66\x68\x76\x7f\x7f\xf7\xf3\x7e\x91\x20\x80\xf7\x4c\x75\x3e\xa7\xf5\x61\x1a\xb2\xf9\xef\x5e\x38\x77\x86\x69\x0e\x0b\x64\xf5\x26\x4a\xb2\x9b\xce\xc2\x2b\x72\xaa\x2a\x4a\x7e\x20\xb6\x62\x7e\xb3\xaf\x4a\x36\x27\x3c\xa7\x8d\x67\xdb\x89\xbb\xfb\x2b\xe9\xc5\xc3\xf7\xff\xf1\xfe\xcb\xed\xbf\xdf\xde\xfd\x7c\xab\x1f\x1e\xab\xc7\x2f\x0f\xef\xbf\xdb\xf4\xf1\xdf\xf2\x93\x1f\xe4\x81\x5a\xdd\xdd\x5c\xf5\x1e\xce\xef\x6e\xae\xd4\xf2\xee\x53\xef\xd6\x87\xbb\x4f\x6a\xb9\xba\x5a\xfe\x7b\xff\x1e\xff\xad\x1e\xaf\x6f\xae\x1e\x7a\x77\xff\xca\x7f\xab\xf7\x57\x7f\x5f\xd6\xd5\x8d\x00\x80\xe8\xc7\xfb\xeb\xea\xf6\x53\x7d\xd5\x6f\xc0\x1f\x37\xcf\xff\xda\x3c\x1e\x7e\x94\xa5\xbe\x3d\x9f\x64\xd0\x1f\xf5\x5e\x9a\xb4\xe3\x55\x69\x5a\xfb\xd2\xf5\xed\x4f\x77\x3b\xde\xf9\x97\xdb\x9f\xee\x06\xaf\x3c\x3c\x56\xb7\x1f\xab\xfb\x8f\xe3\x97\x7e\x68\xee\xab\xf7\x0f\x5f\x96\xcb\xab\x87\x87\x9d\x6f\xfe\x90\x9f\x6d\x5e\xbe\xba\xbf\xbf\xbb\xdf\xf9\xea\x1f\xf9\xc9\xe6\xc5\x9f\xab\xfb\xdb\xeb\xdb\x4f\x3b\x5f\xfd\x5b\x7e\xb6\x79\x79\x75\x55\x7f\xd6\xdc\xdc\xfe\x5b\xf3\xab\xfa\x33\xb7\x54\xfd\x58\xdd\xf7\xe7\xe2\x0f\xd5\xfd\x83\xfa\xf2\x70\x75\xdf\x9f\xf9\x87\xab\x7b\x25\xe3\xfd\xdd\x28\x46\x5f\xfd\x24\xa9\xbc\xbf\x1b\xe7\xf6\x56\xef\xf3\x03\x7d\xf7\xf9\xea\xf6\xfd\xd6\xe3\x3f\x7f\xbe\xba\x55\x3f\x5e\xd5\xf5\x77\xc3\xc4\x7c\xea\xfa\xa6\xfa\xd4\xaf\x44\x92\xa2\xa8\x65\x7d\xf7\xe5\xe3\x77\x23\x34\x75\xf5\xfe\xaa\x81\xb1\xd3\xab\x0e\xb4\x71\x30\x64\x5b\x90\x8e\xbd\x4f\xd6\x0d\xf4\xdd\xae\x0f\x5a\x58\x3c\xf5\xfe\x27\x81\x8c\xd2\x9f\xee\xaf\x07\x23\xbc\x41\x92\x1a\xbc\xb2\x83\x60\xc6\x98\x53\xea\xfd\xfa\x46\xff\xf8\xe5\x53\xff\x1d\x81\xd4\x51\x0f\x82\x7c\xf1\xdd\x18\x0a\x43\xbd\x5f\x5f\x5f\xfd\xac\x97\x19\xcd\x61\xf0\xd9\x06\xe4\x41\xbd\x97\xc9\xd1\x1f\x05\x31\xe1\xfd\x78\x92\x32\x90\x82\x5a\x36\xd1\xfd\xdf\x6d\x07\xfc\xab\xab\xf5\xd5\xed\xe3\x77\x23\x8f\x0c\x75\xf5\x4b\x7f\x2e\xfe\xf8\x0b\x2f\xb7\x5f\xae\xf4\xea\xfa\xe3\x70\x91\x65\x8d\x48\xbd\x7f\x78\xbc\xfa\xac\x7f\xca\x7b\x8d\xa6\x01\xa5\xf7\x36\x21\x55\x31\xb3\xfc\x6e\xc4\x3c\xff\x53\xfd\xf9\xc7\xff\xf7\x6a\xf9\x08\x1f\xaf\x7e\xba\xbe\xbd\xfa\xcb\xfd\xdd\xe7\xab\xfb\xc7\x5f\xfe\x4b\x9f\x3d\xa9\xf7\xab\xbb\x2f\x0f\x57\xef\xd5\x3d\x7c\xbc\x7a\x58\xde\x5f\x7f\x7e\xbc\xbb\xff\x70\x77\xfb\xd3\xf5\xa7\xc1\x7b\xc0\xcc\xe9\x77\xbf\x3b\xaa\xc4\x87\xab\xc7\xc7\xeb\xdb\x4f\x0f\x4f\x17\xba\xbc\xfb\x74\x6c\x99\x79\x5d\x1f\x51\x24\xf3\x9c\x23\x0b\x5d\xd6\x77\xc7\x74\x5d\x78\xeb\x91\x45\x36\x5c\xe4\xc9\x42\xff\xe7\x6e\xd6\xfc\xbf\x8e\xac\x46\xb8\xda\x89\x95\x34\x4b\xe9\xd8\x2a\x84\xbb\x3d\x5d\x43\x9f\xad\x1f\x5b\xf4\xcd\xd5\xed\x97\xa7\x87\x9d\xb9\xe8\x91\x05\x56\xeb\xea\xb1\x7a\x7a\x3c\x80\x99\xf0\xb1\xb4\x51\xdd\x5f\x3d\x3e\x5d\xa2\x4c\xdb\x91\x45\x7e\xbc\xbe\xbf\x5a\x3e\xde\xdd\xff\xf2\x74\xb1\x99\xd5\x1f\x59\xee\xed\xdd\xe3\xf5\x4f\xd7\x4b\x99\xe5\x23\x86\xf5\xaa\xae\x8f\x1d\x83\xbb\xba\xae\x3e\x1f\xb1\x44\xfe\xe7\x90\x5b\xfe\xaf\xdf\xfd\xee\x3f\xd5\x7b\xf8\xfd\xe7\xfb\x3b\xae\xe4\xe1\xf7\xd7\xcb\xbb\xdb\x87\xdf\x3f\xdc\x2f\x7f\xff\x20\xef\xff\xfe\xea\xe1\xe1\xea\xf6\xf1\xba\xaa\xf5\x43\xb3\xc6\x1e\xde\x7f\xf7\xd3\x97\xdb\x25\xf7\xe1\xbf\x5c\xa9\x47\x75\xfb\xbb\xff\x78\xff\xe5\xe1\xea\xdd\xc3\xe3\xfd\xf5\xf2\xf1\xfd\x7f\xdd\xd3\x5e\xf5\xfe\x7f\xff\xef\xab\x87\x8b\xbb\x8f\x5f\xea\xab\xf7\xea\x3f\xd6\x55\xfd\xe5\xea\xbb\xff\xa3\xf8\xcf\xbe\x24\xb9\xb8\xfb\x74\xf7\xe5\xf1\xfb\xc1\x8d\xeb\xdb\xef\x87\x1b\xf7\xf7\x7d\x29\xeb\xf3\x2f\xfd\x3f\x57\xd7\xf5\xc7\x2c\x8d\xf6\x6e\x0a\xc5\x8f\xef\xce\xea\xea\xfe\xe6\x43\x7d\xb7\xfc\xf7\xef\x07\x5b\xeb\xe0\xef\xf9\xf5\x03\x13\x41\xef\xce\x5f\xab\x4f\x0f\xc3\x3f\xfb\x7f\xdd\x57\x0f\xab\xef\x47\x92\x5d\x03\xb7\xd8\x97\x31\xfa\x1d\xfa\x4b\xfd\x65\xfb\x95\x8b\xeb\xdb\x7d\x77\x47\x9f\x7e\x3f\xd8\x6d\xfb\x6f\xff\x65\x30\x6e\x79\x2b\xee\x3f\xbe\xfb\xfc\xe7\xc1\x48\xb3\x98\xd3\x2f\xee\xdf\x6e\x47\x83\xb1\x18\xfe\xf9\x6f\x9f\xeb\xbb\xea\x63\xef\xc6\x7f\xbb\xfb\xf9\x76\x74\x6b\x71\xfd\x69\xf5\xf8\xe3\x97\xfa\xc7\xef\x47\x3b\x77\x75\xff\xf1\x61\x74\x6f\x71\xfd\xd0\x6f\xce\x0f\xbf\xdc\x2e\x7b\x7f\xfe\xeb\xd5\x4f\xf7\x57\x83\xc1\xfd\x1f\x77\x8f\x83\xee\x5e\xdd\x2e\xaf\xeb\xfe\xe0\xaf\xae\xee\x6f\xee\x6e\xae\x86\xdd\xfe\xc3\x97\xfe\x84\xfd\xb0\xbc\x7e\x78\xb8\x1b\x74\x7b\xf6\xf0\x78\x75\x7f\xfd\xd0\xef\xe9\x1f\xee\xee\xfa\x7f\x66\xf2\x7e\x18\x34\xee\xe1\xfa\x1f\xfd\xc6\x7c\xf8\x72\xff\x70\x77\x3f\xaf\x6e\x3f\x7e\xa8\xaf\x87\x14\xd6\x3d\xd9\xba\x39\xa6\x50\x96\x9b\x78\x60\x06\xad\xff\xf1\xc7\xba\x2f\xd6\xf7\xc7\xe3\x6a\x8b\xbc\xff\xfc\xd3\x4f\x43\x82\xf8\xf1\xae\xba\xef\x57\x3c\xfb\xf8\xf1\xaf\x57\x7f\x7f\xfc\x7e\x7d\x77\xfd\xf1\x5d\x31\xcc\xd8\x73\xbb\xdd\xa1\x8b\xbb\x75\xff\xe6\xdf\x86\xbd\xf8\xe1\x4b\xbf\x39\x17\x77\x77\xdb\xf4\x47\x7d\x72\xb9\xaf\x3e\xf1\x38\x0c\x88\x96\xd7\xf3\x5f\xef\x3e\xd4\xd7\x9f\xc7\x4d\xfd\x70\x57\xdf\xdd\xff\xe5\x7a\xf9\xef\xc3\xe9\xbc\xbf\xbe\xfa\x69\x59\x3d\xf4\xcb\xf8\xe3\xdf\x3f\xf3\xc0\x6f\x7d\x2e\xfc\x71\x74\xfb\x87\xbb\xfb\xc7\x3f\xf4\xd7\xf7\x4c\x64\x97\xeb\x1f\xaf\xeb\xeb\xc7\x5f\x68\xdf\x03\xec\x17\xb1\xba\xbf\xbe\xed\x4f\xf1\x5f\xaa\xcf\x57\xf7\xcb\xfa\xfa\xf3\x68\x6d\xfe\xf7\xfb\xbb\x2f\x9f\x07\x54\xf3\xf9\xaa\xea\x93\xfc\xbf\x7c\xfc\x43\xf5\xf1\xd3\x90\x55\xd4\xd5\xed\xb2\x7f\xe7\xcf\xf7\x9f\xaa\xdb\xeb\x7f\x6c\x4d\xfe\x5d\x6e\x5f\x9f\x77\xdd\x7d\xb9\xff\x24\xca\x70\xaf\x19\x75\x75\x73\x35\x60\x5f\xf7\x9f\xae\x1e\x07\x04\x56\xd7\x0f\x57\xbf\x0c\x66\xf9\xfe\xea\x76\xb9\x1a\x2c\x87\x7a\xc0\xa1\xaf\x7f\xbc\xaf\x06\x3c\xf2\xff\xb9\xea\xff\x75\x79\x77\x77\x33\xe4\x34\x7c\xe7\x5f\xfa\xad\xff\xdb\xf5\xed\xc7\xbb\x9f\xff\xf5\x8a\x99\xed\xd5\xd6\xfd\x8b\xeb\xed\x77\x2f\xaa\xbf\x6f\xdd\xfb\xc0\x22\x62\xbf\x73\x77\x77\x75\xbf\xf3\x3f\xfc\x7c\xfd\x38\xe8\xc8\x5f\x7f\xbe\xfb\x5b\xf5\x8b\x2c\xbb\x31\x1f\xfd\xa1\x91\x8b\x07\xbc\xe2\xfe\xae\xae\x07\x0c\xf2\xe3\xdd\x60\x3a\x07\x7f\x8e\xd8\xd9\x9f\xae\xef\xaf\x7e\xae\x06\xdf\xef\xa2\xf2\x1f\xea\xeb\x8f\x03\x02\xff\xdb\xdd\x7d\xdd\x7f\xe1\x2f\xf7\xd7\xb7\xcc\xd1\xba\x15\xfb\xc7\x76\x7b\xce\xdb\xfb\xd6\x8a\xa9\xea\xab\xc7\x01\xa3\xfc\xd3\xf5\xfd\xc3\xe3\xec\xba\x5f\xe8\x1f\xae\x1e\xab\x01\x23\x7f\xdc\xda\x7b\xb6\x6f\xdc\xdf\x3d\x3c\xac\xaa\xeb\x01\xf3\x2c\x59\x23\x1b\x12\xd8\x8f\x83\xaf\x7e\xb8\xbd\xfb\xf9\xa7\xba\xfa\xf7\x41\x83\xbe\x5c\xf5\x87\xe5\x4f\x77\xf7\x37\x83\xe6\x0e\xb7\xd4\xfb\xab\xab\xc1\xa0\x2f\x7f\x19\xb6\x2b\x33\x9a\x21\xe7\xe3\x19\xbd\x1c\xac\xc7\x0d\x1b\x66\x65\x7c\xe7\x83\xff\x7e\x5f\xfd\x38\xaa\x78\xc4\x8d\xff\x72\x77\xff\x78\x5f\x5d\x3f\x0e\xd6\xfe\xc3\x60\xb0\x17\xd5\xed\xc7\x87\x65\xf5\x79\xc0\x9f\xee\xab\x87\xc1\x1c\x6f\x38\xe1\x87\xbb\xfb\xdb\xe1\xa3\xab\xc7\xea\xba\x7e\x68\xa6\xfb\xbf\xae\xab\xfb\x77\xf7\xdf\xdf\xfe\x97\xdd\x02\xdb\x97\xc7\xeb\xfa\xe1\xf7\x1b\xe9\x4f\x2f\x45\xfc\x63\x81\xed\x77\xea\xfa\x89\xcf\x1e\xd6\x9f\xf4\x63\xf5\x49\x7f\xba\xba\xbd\xba\xaf\x1e\xef\xee\xf3\x67\xd5\xde\xcf\x1a\xf1\x70\x79\x77\x7f\xd5\x93\x0c\x7f\xf7\x5f\xb7\x77\x97\x69\x40\x18\x09\xe7\xd8\xf3\x6a\x53\x45\x46\x5d\xec\xdd\xd0\x3b\x9c\x88\xcf\x83\x73\x26\x85\xa3\x7c\xdc\x5b\x55\xcd\xb1\xef\xbc\x22\x5f\x3c\xb7\xf6\x36\xbe\x2f\x28\x0a\xdb\x7d\xed\x83\x6b\x4f\xd1\x57\xdb\xa5\x8f\x8e\x49\xa5\x11\x96\x36\x16\xa5\x01\xc2\x91\x13\x61\x9c\x13\xc4\x34\x6a\x57\x5c\xbb\xc1\x9b\x62\xa9\xc5\x62\x65\x21\x0e\xdc\x79\x72\x3d\x5b\xd1\x2f\x9d\x54\x32\x05\x95\x14\xca\x14\xca\xe7\x8b\x9f\x13\x95\x76\xde\x4f\x8d\x69\x77\x26\x85\x2c\xc6\x49\x21\xed\xdc\xec\x70\x3c\x3a\x2f\xec\x45\x30\x81\x13\x18\x53\xeb\xa0\xc3\x2e\x8f\xe5\x3a\xa8\xd0\xb3\x73\x77\xd1\x0a\x53\x51\x13\x01\xca\x91\x5c\xaa\x21\x80\x5b\x90\x07\xeb\x55\x54\xe4\x94\x07\x27\x29\x65\x1d\xaa\x04\x68\x96\x9a\x34\xc4\xa0\x2d\x18\x07\x68\xb5\x24\xa2\x45\xf0\xb1\xd6\x10\x48\x00\x37\xc1\x59\xb9\x68\x23\x99\x17\xf9\xd2\xf5\x43\xfe\x94\x07\x0b\x92\x63\x32\x2a\x6a\xc1\xed\x0c\xb4\x44\xfe\x46\xd0\xa6\x09\x9c\xd3\xa6\x2d\x99\xeb\x30\x35\xf1\x53\x02\x17\x16\x14\x20\x46\x1e\xae\xa8\xc8\x4a\xb2\x6b\x03\x58\x83\x4d\xe0\xd3\x52\x32\xff\x2b\x20\xa7\x08\x4c\xd0\xb9\x4a\x63\x16\x18\x05\x86\x17\xc1\x7f\xc0\x94\x0f\xfc\x24\x0b\x36\x36\x79\x87\x9c\xda\x8c\xc1\x51\x83\xfa\x44\x44\xf6\x2b\x13\xd9\x61\xdf\xdf\x63\x08\x0c\xe5\x44\x10\x4c\xd4\x56\xd9\x57\x9d\x65\xec\x66\x99\x6a\xab\xc5\x33\x34\xb7\x64\x1f\xc1\x0f\x8f\x95\x5a\x1d\x66\x92\x0d\x04\x2c\xf7\x25\xda\xca\x41\x88\x72\xa0\xda\x0c\x94\x1c\x7a\x4a\x22\x75\x2f\xf8\xd3\xbe\x05\xa0\x46\x15\x81\x54\x00\xef\x66\x0e\x82\x51\x72\x69\x4e\xd3\xba\xe2\x26\x62\x14\xe4\xc0\x18\x81\x97\xb6\x15\x24\xe8\x10\xdc\x65\x6c\xa8\xd6\x46\x92\x66\x39\xcf\xa3\x1e\x93\x22\x9a\x41\x4c\xfc\xab\x3b\x92\x6f\x3f\x9f\x88\x6f\x08\x34\xb0\x1f\xb4\x25\x41\x5a\x5b\xf0\x35\x0a\x7e\x7c\xc4\x32\x81\x9b\x6d\x5e\x50\xf9\x93\xa9\xf6\x25\x39\x61\x37\x60\x4d\xe5\x80\xe7\x2b\x76\x87\xfb\x11\x35\x44\x5c\x44\xe0\x29\x31\x9b\x04\x07\xb2\x51\x77\x9f\x3d\xb7\x1d\xae\x1b\x07\x5b\xa1\x69\xd2\x8e\xa5\x76\x75\x71\xe5\x04\xc1\x75\x8e\x00\x66\xc6\x32\x40\xeb\x2e\xca\x8c\x8c\x24\x11\x7f\xff\x85\x2e\x9b\x82\x8c\xd5\xb3\x67\xca\x37\x2d\x64\x36\x2e\xdc\x92\x32\x95\x9a\xc8\x34\xce\xe4\xda\x54\xc6\x2b\xd8\x03\xce\xd0\x35\x29\xd8\x3b\x37\x08\x27\x9b\x01\x20\x2d\x7c\xe6\xbc\xce\xcd\xb8\x9b\xe2\x05\xd1\x25\xa6\x8d\x80\xb9\x4b\x71\xe1\xb8\x32\x53\x48\x77\xba\x25\x1c\x78\x3d\x44\x5b\x13\x78\xaf\x49\x1c\x4d\x0d\xd3\x66\xbe\xb6\x4e\x25\x3c\x83\xb5\x05\xb4\xca\x02\xba\x85\xa1\x0c\x37\xcf\xe3\x18\x2f\x2f\x98\xad\x07\x08\x34\x43\x94\x4f\xb1\xfd\x34\x67\x9e\xc8\x22\x56\x3b\xbc\x5e\x61\xac\xb6\x5f\x24\xa0\xa4\xc3\x14\x3c\xfe\xab\x72\x8b\x27\xa0\x27\xf6\x2f\x8c\x10\x34\x44\xe2\x85\x21\x64\xf0\x9c\x85\xf1\x04\x04\x85\x95\x24\xf5\x08\xc9\xd6\x16\x0c\xcf\xa8\xf1\x03\xfa\x6e\x1c\xb0\x82\x59\x60\x50\x68\x4b\xde\xc1\x7b\x21\xc6\x22\x23\xfa\x9a\x84\x6b\x81\xb1\x0b\x92\xa4\x2c\x3d\xcc\x6f\x95\x33\x28\x18\xd3\x87\xee\xde\x54\xfb\x9c\x4e\xb4\x1c\x06\x3c\x0e\xd7\x8d\xcc\xf6\x60\xe6\x9a\x95\xe3\x78\xe9\x44\x59\x3a\xb1\xb7\x74\x24\x8d\xf2\xc2\x33\x57\x48\xe0\xe8\x05\x57\x8e\xc9\x4b\x87\xd7\x39\x86\xd1\xd2\x19\x6f\x9b\xff\xe3\x6a\xb7\x2f\xc6\xa9\x3b\xa6\x05\x97\x24\xe0\xce\x42\x11\xb5\x53\x56\x5b\x48\x15\x8a\xf3\x50\xe7\x6b\x25\x41\x7a\x98\xdd\xd0\x1b\x5f\xf2\x96\xe8\x49\x06\xa3\x58\x69\x83\xfc\x50\xbc\xcd\x37\x8a\x03\xaf\xdb\x58\x92\x05\xd6\xa3\x46\x4f\xb9\x3c\x45\x7e\x6e\x4c\x4e\x3b\x31\x2c\x18\x99\xce\x11\x8a\x34\x1b\xb7\xa5\x6d\xf2\xe5\x05\xf3\xde\x12\x69\x6e\x08\x42\xe4\x1e\x44\xab\x58\xd6\x5c\x18\x82\xe8\x14\xed\xa4\x9f\x26\x46\xf0\x94\xad\xbb\x0d\x09\x4c\x60\xd2\x3b\x49\xf1\xfe\xce\x03\x9a\x77\xe8\xde\xb9\x7c\x91\xbc\xed\xf9\x66\xef\x27\xcf\xa9\x7d\x27\x5f\xe5\xbb\x2c\xa7\xe2\xe0\x37\xba\xfc\xbc\xfb\x97\x4b\x9f\xa0\xd5\x66\xd3\x6a\x24\xae\xae\xa9\x54\x5a\x34\xf8\x5d\x00\xfa\x77\x68\xc0\xe0\xe0\x37\x46\x70\x8e\xdf\x71\x83\x9f\x01\x1c\xb5\x6f\xf4\x7f\x7b\x28\xda\xfe\x0e\x7e\xbb\x77\xb9\xfa\xee\x87\xd4\x3d\x41\x07\x6d\x2f\x52\xd3\x4a\x43\x12\x58\xf3\x8e\x0c\x14\x9e\x6b\x23\x6c\xea\xa7\x02\x4c\x68\x9e\x62\x82\x42\x66\x0c\x79\xe7\x96\x1f\x09\x42\x3b\x38\x54\x40\x6c\x67\x8a\x08\x6c\xee\x73\x7a\x47\xed\x88\x91\xdb\x4c\xb0\xf8\x87\x49\xf9\x0e\xa2\x94\xd9\x6b\xc6\x04\x7b\x93\x15\x9e\x62\xc1\x26\x89\x85\x25\xed\x25\xdb\x29\xc4\xa8\x3d\x18\xd7\xd3\xb9\x8d\x91\xb0\xda\x62\x4e\x1b\xed\x43\x93\xa2\x92\xec\x58\x3f\x31\x40\x83\x2f\x37\x95\x5c\xde\x68\x32\xe0\x35\xcf\xe6\x9c\x29\x71\xe1\x25\x0a\x89\x67\x71\xcd\x5a\xc4\xdc\x95\xe8\xe6\x7c\xb3\x36\x40\x81\xf7\x02\xbe\xb3\x42\x40\xba\xbc\x90\xf7\x14\xfa\xb9\x90\xc3\x1a\xc1\xa6\x95\x01\x5a\xe3\x4a\xcb\x3f\xe0\x71\x65\xc0\x99\x35\xce\x85\x0c\xf8\x4b\x0b\xde\x5d\xde\x48\x3a\x56\x07\xe8\xe7\x64\x6b\x16\x7e\x9d\xe6\xf5\xbd\xa0\x02\x72\x9a\xa2\x38\x97\x39\xaa\x35\x0f\x81\xfc\xc5\xaa\x0e\x29\x0b\xd6\x2c\x64\x96\x95\x34\x83\xa8\xc6\xc6\x75\xd2\x2c\x64\x52\x9a\xfb\x66\x8b\x77\x6e\x1f\xb0\x4c\x81\xcb\x11\x59\x21\x5a\xea\x28\x9c\x4a\xa3\x57\x5e\x7c\x58\xbd\x42\xfb\x10\xa0\xc9\xb3\xc5\x7f\x55\xfc\xbb\xf5\x3d\xb4\x3c\xa3\xac\x98\x39\x70\x86\x15\x32\x1a\xb8\xbc\x39\xab\x79\xe7\x28\xb4\x97\x54\x34\x9b\xdc\x2c\xca\xea\x04\x14\x3e\x18\xab\x22\xcb\x2d\xe4\x73\x3e\x21\x09\xf4\x20\x70\x97\x17\x24\x43\x4b\x39\x67\xd3\x26\x0b\x1b\x33\x4b\x53\x17\xb2\x13\xb2\x7e\x18\x35\x41\xe8\x5b\x86\x20\x1a\x0d\x88\x43\xb9\x22\x2a\x8a\xdc\x3b\x16\xde\xb8\x77\xac\x52\x9a\xc8\xff\x22\x3d\xe4\x8e\x92\x92\xbf\xb8\x9b\x4e\x34\x40\xab\x50\x04\x3d\x16\xa0\x70\x23\x40\xf5\xda\x35\x95\x25\x2f\x4a\xae\x37\x33\x8a\x3b\x8b\x60\x7b\x2a\xa8\xd8\xb6\x30\x6d\xfc\x11\x1b\x01\x5d\xbe\xdc\xd1\x90\x03\x88\x00\x7b\x18\x6e\x3f\xc1\x24\x59\x28\xac\x84\x61\xb0\x74\xf3\x7c\x7e\xf0\xe6\xa8\x2b\x3b\x14\x27\x40\x53\x6d\xcc\x06\x4d\xc4\x90\xf8\xd4\x97\x18\x45\x90\x18\x3c\xd3\xf9\xd9\xe5\x4d\xbe\x1f\xc0\xf0\xce\x2f\x49\xa1\x62\xe8\xc2\xd5\x22\xef\xfc\x31\xcc\xfa\x4f\x9a\xa0\x23\x63\xc5\x97\x35\x6c\xad\xe9\xee\x1c\x75\x8a\xa5\x6c\xd5\x96\xb5\x67\x1d\x87\xcc\x74\x15\x47\xb6\x9e\xfe\xfb\x5c\xc0\xe5\x05\xcf\x46\xe9\x57\x71\xbd\x23\x84\xf4\x3c\x3b\x63\xa1\xec\x9c\x46\x6c\xfe\xa4\x86\x71\x09\x97\x17\xbc\x5d\x4c\xd4\x32\xd3\x8d\x18\x15\x73\x7f\x62\xcb\x88\x86\x63\x46\x05\x0f\x9a\x29\x4a\xa2\x29\xda\x66\xbb\x51\xa3\xe2\xf4\x61\x1b\x34\x4e\xca\x90\x81\x3b\xd4\xba\x6d\x64\x9d\xfd\x8b\xfa\xef\xdf\xbf\xcf\x78\xa7\x1b\xe8\x4f\xec\x61\x7f\xf2\xef\xfb\xbf\x0b\x1c\xe8\xfd\x2f\xbb\x30\x76\x8e\xaf\x6c\x90\xcd\xe3\xc5\x6b\x33\xbd\xae\x71\x9d\x2f\x5b\xdb\x20\xc5\xcf\xf1\xd5\x0d\x33\x42\xf5\xfc\x32\x26\x61\x1e\xe0\x22\xeb\x45\x66\x90\xdb\x2a\x59\x0d\xde\x2d\x78\x6f\xf4\xae\xa7\xed\x3a\x20\xc7\xc2\x54\xa8\xc9\xab\x04\x3e\xf6\x3f\x2a\x1c\xb3\xbf\x54\xeb\x98\x23\x0f\x5c\x50\x6d\x78\xc6\xa6\x84\x6c\x5c\x15\xe3\xa1\x57\x7c\x19\xa6\xd4\x02\x4a\xab\x62\x3b\xcb\x96\x94\x69\xf2\x85\xc0\xab\x08\xd6\x0d\xda\x6b\x20\xe0\xe5\x8d\x81\x22\xe9\x7e\xfe\x2d\x95\x8b\xac\x23\x84\xc4\x7b\x43\x5a\xf0\x66\x1e\xc0\x21\x97\x18\xbc\x5c\x06\x0a\x3e\x6a\x04\xef\xeb\x00\xc8\x35\xd1\xc2\x83\x57\xa1\x0e\x62\xe0\x44\xa0\x05\x7a\x49\xe0\x85\xc3\x3a\xf4\xce\xdc\xad\x27\xef\x9b\x94\x14\x4a\xd8\x06\x4b\xce\xaa\x7f\x98\x47\xac\x45\x5a\xa0\xb8\x40\x52\x94\xc0\xda\xc1\xd6\x18\x13\x0f\x3f\xab\xec\x89\xbb\xe4\x78\xab\x23\x25\x5b\xda\x20\x22\x41\x15\x35\x81\x71\x9a\x64\x2b\xeb\x1d\xdd\xe5\x49\x49\x3c\x7e\x11\xa2\xe7\x61\x42\x3b\x94\xbf\xdb\xc6\x6d\x27\x29\xdb\xf8\x0f\x4d\x72\x60\x06\x41\x42\x31\x30\x55\x68\x24\x4c\x43\xae\xb9\x9d\x9e\xb7\x5b\x03\xd1\xcc\xc8\x2b\xea\x25\x8c\x65\x05\x35\x96\x0e\x28\xce\x0c\xd8\x1c\x5a\xd2\x70\x6a\x70\x4a\xac\x4c\xfd\x9b\x42\xca\x71\x8d\xc5\x22\x81\x98\x47\x42\x65\x20\x04\x65\xba\xcc\x89\xda\x09\x10\xc1\x6c\x73\xe0\xd0\x30\xd7\x9c\x97\xb0\x32\xc0\xd3\xd4\xb5\x80\x67\xc8\xd7\x96\x5b\xea\x44\x70\x41\x96\x61\xf2\xb5\x1b\x7f\xa3\xe4\x24\x88\xc5\x4e\xb9\x76\xfc\x1c\x9c\x5d\x23\x24\xaa\xc6\x69\x1a\x51\x72\x4f\xca\x41\xeb\xf8\x89\xe6\x27\x6b\x96\x87\x2b\x14\x41\x25\x5f\x9b\x56\xca\x22\x5c\x6b\xdf\x57\xa0\x36\x23\x7b\xc9\xa4\xc6\xea\x88\xaf\xb0\x90\x00\x63\xb9\x16\x4d\x24\xa2\x57\x81\x97\x27\xb2\xc2\x25\x97\x46\xd6\xb6\x10\xa8\x34\x34\x47\x0b\x68\x4b\x53\x0c\x24\x34\x0d\x96\x05\x34\x93\xbf\x95\x4b\xdb\xce\x48\x9a\x72\xb8\x17\xda\x7c\x69\x9f\x90\x36\x12\x36\xb6\x29\x84\x8c\x66\x8d\x4a\x44\x40\x09\xb4\x1b\x04\x0d\x61\x4e\x64\x4a\x7c\xc3\xe7\x4b\x3b\xfc\x36\xa8\xa2\x36\xca\xac\x0d\xa0\xad\x49\x63\xa6\x86\x2e\x2a\xae\x1d\x4f\xa6\x07\xab\xb6\x6e\xfb\x86\x22\x10\x62\x4d\x0a\xac\x29\x91\x17\x5d\x45\x96\x15\xc8\x7c\xed\x66\x1a\x45\x2b\x8c\x35\x82\x17\xcd\xd2\x2c\xc1\xf2\x74\x40\x34\x39\x01\x2c\xb1\xc0\x5b\xa1\x15\x0b\x9d\xdd\x58\xe8\x98\x1e\xc0\xa6\xb5\x03\x74\xdd\xd7\x16\x9c\x68\x1e\x12\xe3\x58\x74\x3d\x4a\x4c\x69\xf4\x2c\xdb\x68\xcb\x57\xa2\x44\x7b\x59\x30\x66\x6d\x21\x4a\x3e\x56\xe9\xa1\x01\xb2\x15\x7a\x40\xa9\x0b\x7b\x31\xce\x86\x65\xed\xb5\x83\x48\xdd\xcb\xb4\xd4\x08\xa8\x01\x59\x09\x93\x6c\xc5\x5a\xf0\x1f\x98\xd0\x9c\xb0\xd4\xe6\x45\x04\x1b\x57\x45\x69\xc1\xd8\x8a\x78\x1e\xa9\x5b\x05\x4c\x5c\x3c\x81\xcd\xbd\xe1\x03\x9e\x44\xc9\xbf\x4b\x61\x55\xac\x79\xf4\x6b\x4d\x0a\x4b\x74\xe0\x17\x39\xee\x51\x3c\x00\x88\xa9\x4c\x2e\xf9\x53\x2b\x0c\x32\x99\x7c\x29\x3a\x6d\xa2\x48\x35\x13\x22\x32\x8d\x4b\x78\xe1\xc6\x2c\x87\x60\x84\x9f\x32\x93\xb4\xcd\xa5\xe5\xb4\x8d\xf5\x95\x1b\xe0\xe7\x14\x20\x24\x26\x75\x4f\xbc\xcc\x72\xd0\xbc\xb3\xbd\x65\xe6\x64\x95\x09\x38\x48\x53\xc2\x66\xb4\x0f\xf0\xca\xec\x85\x39\x0d\xc3\xb4\xbc\x52\x3c\x4f\x4f\xd4\x08\x49\x5b\x59\x57\xc4\x8a\x92\x36\x10\xf2\xbc\x15\x20\x3b\x9a\x2e\xc0\x69\x03\x46\x17\xe0\x97\x04\x91\x7f\x2b\x02\x61\x18\x1a\x35\x22\xe0\x83\xfc\xe6\x7b\xfc\x97\xc2\x07\xfe\x2d\x7b\x79\x3e\xb2\xde\x46\xe5\xe0\xff\x2d\x0b\xe6\x86\xe0\x72\xca\x5d\x48\x2a\x9f\xc9\xe1\x9a\x80\x6a\xde\x55\x35\xb2\x4e\x88\x60\xe5\x3f\x03\x41\xfe\x75\xfc\xb6\xdc\x56\xf9\x91\x63\xb6\xaa\x0b\x40\xe5\x98\x9f\x4a\x8e\xe8\x42\x32\xf9\x5a\x55\x40\xe0\xb9\x91\xdf\x06\xd2\xde\x86\xb8\xa6\x01\xd4\x34\x22\x31\xa5\x31\x87\x5d\x16\x2a\x37\xd3\x66\xed\x6d\xc5\x9b\x4b\xfe\x40\xf1\x10\x39\xe6\x4a\xcc\x54\xfd\x92\x07\x92\x64\x6c\x92\x34\x92\xff\x8d\x80\x6b\xed\x20\xee\xae\xf8\x03\x73\x58\x9e\x0a\x49\xe7\xe9\x25\x4a\x57\x75\xd3\xf3\x8f\x77\x17\x11\x58\x43\xa5\x65\xd1\x0c\x7a\xd0\x0e\x92\xf2\x5c\xe2\x92\xef\x14\xca\x49\x53\x83\x1c\xa1\xf8\xa5\x6c\xed\xba\x80\xc8\x5b\x17\x4f\x9e\xb2\xe0\xca\xb0\xb7\xe3\x3c\x6a\x0d\x11\x78\x21\x00\x23\x03\x4d\x99\x32\xf8\xa1\x69\x86\x39\x6f\x87\xb4\x76\x40\x1f\x24\x9b\x32\x01\xaa\x08\xe2\x9c\x20\xcb\x81\xdb\xb9\x68\xfe\xfd\xc7\x3b\xe6\x20\xcc\x04\x97\x3c\x2d\x24\xd3\x13\x95\x03\x89\x5a\xe7\x15\xb6\xbf\x3d\x4c\x0a\x4c\x73\x3c\x77\xb6\xf9\x37\xac\x09\x90\x37\x11\x5a\xf3\xbc\x2f\x0b\xa1\xcd\xfc\x1e\x17\xcd\xef\x45\xfe\x38\xc8\x0d\x64\x42\x94\xff\x98\xf1\xd0\x32\xdf\xd4\x28\xd4\x9c\xb7\x10\xbb\x8f\x12\x9a\x52\xb1\x29\x55\x6a\x10\xdb\xbb\x76\xbc\x2e\x72\xbd\x46\xd6\x44\xae\xce\x71\x89\xf2\x9d\x6d\x5a\x9e\x54\x77\x37\x37\x88\xb7\x1d\xf9\x97\xf8\x9d\x9a\x64\xca\xd2\xda\xd4\x4c\x31\x78\x60\x7a\x72\x3b\x02\x8f\x80\xce\x29\xc8\xbb\x72\xb3\x7c\xd0\x2c\x1f\xc9\x03\xcd\x3b\x91\xab\x79\xf8\xec\x5a\x5b\x21\x52\x94\x55\xd1\xf4\x48\x35\x63\x36\xf8\x9a\x27\x47\xde\x58\xe7\x80\x70\xa6\x74\xc3\x14\x4b\xbb\x9b\x54\xe7\xb5\x6a\x9a\x25\x23\xdb\x70\x6e\x18\x37\x65\xed\x36\x45\xe4\x16\xa4\xbc\x72\x98\xca\xa5\xf7\x08\x61\xd1\x90\xc6\x3f\xc6\xac\xae\xf1\x40\x9f\x42\x49\x49\xca\x0e\x3d\xbc\x56\x49\x36\x87\xc4\xea\x08\x5f\x46\xbe\x1b\x72\x59\x18\x49\x46\x8e\xe5\x20\x2e\x97\x54\x51\x4e\xe5\x20\x61\x15\x8e\x0e\x10\xd7\xd2\x2e\x6e\x91\x1e\x34\xab\x07\x60\xbc\x08\xe2\xb2\x52\xcc\x7b\xcd\x92\x60\xe2\xf9\x36\x0c\x73\xeb\xd6\x3f\x0d\x10\x73\x21\xa2\x48\xe2\xdd\x90\xdb\x52\x64\x3b\x57\xd1\x1a\xb1\x20\x60\xad\xad\x04\xc1\x87\x9e\xf5\x41\xd0\xa2\x8a\x05\x09\xc4\xc2\xc0\x3a\x23\x07\x9f\x71\xe5\x25\x28\xba\xdb\xff\x50\x83\x23\x4d\x73\x7e\xbc\x40\x62\x79\xc6\x02\x4e\xe5\x06\x69\x48\xa5\x6d\xeb\x08\x41\x74\x4b\x16\x30\x0b\x05\xd6\xcb\x19\x69\x52\xc5\x4c\x0e\xad\x54\xbe\x36\x53\x24\xc8\xae\xa9\x44\x9c\x1b\x2a\x09\xe7\xcc\xa7\x9d\x8c\x88\xc8\x07\x9d\x38\x08\xd6\x29\x9a\x1b\x1a\xbb\x48\x61\x7f\x00\x48\x1d\xe7\xbc\x75\x84\x47\x5c\x21\x22\x83\x80\x8d\x32\x17\x8e\x79\x43\x92\xd3\x5a\xf9\x6b\x16\xb9\x13\xb1\xed\x49\xa1\x7a\x5f\x08\x1a\x92\xab\x3c\x88\xfb\x5c\x43\x6f\x1e\x9c\xf6\xe0\x66\x02\x13\xe0\x7b\x23\x20\xdf\x99\x82\xbf\x9b\xc0\xd0\xcb\xc3\x27\x67\x32\xb6\x4a\xd9\x69\xaf\xab\x29\x40\xe1\x75\x02\x0c\x0b\x34\xca\x0c\xbc\xc0\x62\x60\x8a\x62\x5d\x86\x3c\xb8\x81\x8e\xc2\xda\x79\xa2\x55\x04\x43\x33\x56\x73\x95\x5c\x1a\x32\xdd\xd4\x36\x85\x9b\x5a\x3e\x86\x2a\xfa\x2d\x53\xb8\xe6\x8e\x58\x56\x55\xac\xe9\x55\x6b\x54\x62\x6a\x18\x9a\xec\xb1\x6f\x9c\x97\xe2\x8e\xb4\xcc\xef\xb7\x46\x2d\xc5\x40\x04\xe8\x3a\xc3\xbc\xcd\x86\xf9\x00\x5b\xe0\x64\x12\x03\x34\x62\x0d\xa7\x25\x5a\xcd\x70\xd9\xd9\x1e\xe5\x80\x36\x06\xa9\xd8\x33\x48\x81\xdb\x75\xc4\x7b\x5e\x12\xf5\x38\x4f\x10\xfd\x2c\x7b\xc9\x6c\x9c\x64\x24\x97\xbb\x6a\xd7\x5e\x12\x4c\xaf\x39\xa5\x91\x77\xb3\x7c\x6a\x55\x2b\x7b\x7b\xe5\xab\xd6\x75\xc7\x76\x5b\x03\xd8\xa4\xfa\x5b\x05\x10\x2b\xaa\xd5\xe6\x33\xb3\xa3\x74\x9e\x4c\xe6\xd7\x0f\x85\x16\xfd\x4b\x43\x91\x54\xef\xf7\x6c\xac\x7c\x73\x57\x2e\x2f\x28\x2a\xd3\x34\x6b\xd3\xfa\xa8\x4c\x51\x8a\xd3\x92\x61\xb2\x31\x19\xcb\xa5\x10\xff\x93\x98\xf3\x1f\x4c\x60\x8d\x9d\x68\xd2\x9e\x00\x71\x3d\x73\xc2\xf0\x8d\x4e\xd8\x96\x33\x67\x1b\x57\x37\xc1\xfe\x4a\x51\x4c\x84\x05\x24\xac\xb5\xd3\x04\x49\xe0\x9a\x82\x26\x88\xbe\x32\x80\xa8\x4c\x67\x49\x11\x4c\x4b\xb1\xdf\x28\xa3\x3a\x2d\x16\x0a\xd6\xdc\xd0\x2d\x48\x6c\x39\xc1\x97\xa1\xda\x3c\xf6\xaa\x58\x3b\x08\x7e\x81\xcc\x1e\x54\x82\x84\xcd\x53\xe4\x5d\x9a\xa5\xf1\x58\x3b\x96\x44\x59\xc4\x20\x6e\xca\x76\xc5\x5a\x30\x3b\x87\x15\x8b\xa2\x2c\x73\xb2\x40\x27\xe8\x6f\x56\x90\x4e\x36\x75\x8b\x85\x2a\xd9\x59\xef\x06\x2a\x4a\xa5\xbc\x5b\x5b\xf1\x5e\x81\xe8\x36\xcd\x51\x46\x73\x73\xf2\xa9\xae\x55\xd4\xcb\xe4\xc0\x82\x6f\x00\xe3\x17\x98\x14\x26\x08\xae\xec\x4d\x2c\xb6\xc7\x9e\xc1\x2d\x12\xa0\x61\x5e\x6f\xfa\x16\x62\xfe\x3c\xd0\x02\xbd\xc2\x58\xeb\x20\xaa\xae\xb7\x7d\x31\xab\x79\x21\x88\xed\xc4\x95\x61\x4b\x3e\x23\x57\x87\xec\x6c\xec\xfb\x86\x62\x16\x82\x02\x2d\xa8\xe0\x92\x59\x83\xe3\x82\xfb\x7e\x5e\x4d\x4f\xa6\xb1\xc6\xfc\x46\x2a\x63\x52\xd9\x02\x49\x6a\xc3\x60\x9f\xb7\x36\x87\x53\xd5\xf8\x09\x16\x4c\x3e\x3c\x06\x09\x3c\xea\xc8\xf2\x6e\xcf\x00\x59\x24\x71\xec\xa8\x59\xbd\xe4\x91\xe7\x91\x71\x41\xc9\xa5\x1d\x7e\x12\xff\xd4\xce\x01\xcf\xe4\xf3\x0c\xd6\x86\xa9\x72\x2c\x3b\xba\x0c\x99\x8a\x59\xa8\x80\x10\x6a\x02\x4f\x8a\x16\xc8\xa2\x5b\x25\x8e\x7a\x72\x69\x95\x16\x27\xe6\x8a\xc4\xda\x94\x51\x41\x44\x6a\xae\x10\xdb\x5a\x45\x48\x8f\x62\xe5\x47\x20\x03\x31\x2e\x48\x8c\x33\x11\x30\xd5\x58\x80\x61\x3e\xcc\xed\x95\x87\xe3\xaf\x75\xf7\xb5\x4e\x10\x51\x07\xc1\x22\x0b\xe2\xb8\x68\xf8\xf3\xc2\xab\x38\xee\xa8\xb2\x40\x09\x90\xea\x6e\x24\x7a\x40\xf8\xcd\x30\x5d\x5e\x08\x3a\x2c\x5a\x70\xb6\x32\x2c\x7d\x9b\x2c\x82\xa3\x20\x9a\x59\xc7\xda\xb9\x9f\xf5\x9f\x64\xe1\xb0\xfd\x48\xa4\x57\x03\x81\x66\xe3\xaf\x51\x9c\x6a\x6c\xb6\x7e\x6c\x7f\xcd\x2b\xf2\x38\xcf\xee\x27\x9c\x97\x0c\x44\x16\xad\x59\x4a\x45\xde\xad\xbd\x78\x62\xe4\x18\x84\xd4\xa9\x19\x82\x50\x2b\xd3\xc7\x3a\x4d\x25\x5e\xca\xae\x6d\x2c\xd3\x3d\x42\xc4\xda\x40\xd2\x86\x69\x83\x12\x90\x78\x52\x0a\x82\xd7\xa0\xac\x8c\xcc\x55\xd4\x62\x44\x45\xf0\x56\xdc\x87\x58\x99\x6c\x06\x93\x98\x01\x56\x24\x11\x23\x3d\x68\x53\x88\x5e\x58\xc4\x8c\x58\x80\xa6\x8d\xa7\xc1\xe6\xa3\x29\x7c\x79\x2d\x18\xa6\x69\xb2\xe2\xde\x6c\xb2\xeb\xf6\xa0\xb3\x3a\x77\x96\xb5\x3b\xe6\xc4\xe1\xf2\x46\x7b\x88\x4e\xd3\xe1\x36\x77\x4f\x36\x04\x60\x76\x3b\x3c\x7d\x1a\xaf\xfa\x13\xdd\x5b\xb0\x11\xa4\x0d\x38\xdf\x00\x8d\x06\x08\xad\x87\x4b\xda\x21\x1a\x9d\x58\x01\x35\x15\x10\x58\x6a\x24\x75\xe6\x05\x4d\x05\x6e\x87\xcb\xe0\x99\x0e\x3a\x94\x61\x51\xa7\xef\x81\x6d\x2a\x30\x90\xd2\x71\x3d\x38\x27\x52\x81\xf5\x4c\x23\x0e\x0d\xa9\xc2\x24\x40\x7a\xa9\x05\xd2\x93\x1d\x46\xec\x70\x46\x7c\xe1\xf4\xc8\xb1\x2b\x39\xde\xcb\x7d\xad\x8d\x42\xd9\x8b\x03\x6b\x7f\xf9\xda\xec\xc9\x81\xb7\xae\x40\x1f\x24\x3c\x91\xf7\xa3\xc8\x2b\x4e\x80\x20\xf3\x4f\x4f\x25\xba\x39\x06\xa0\x52\xfe\xfa\x80\x04\x24\x9e\xca\x84\x2a\xf1\x47\x29\x17\x21\xb8\x8a\x62\xa7\x0d\x9d\xb6\x09\xc1\xe8\x00\xc6\x2e\x02\x84\x0c\x37\x3c\x6c\x9e\x1c\x3f\xd5\x08\x0e\xe2\x0c\x25\x40\x2c\x5f\xf3\x22\x0f\xa2\xde\x16\x73\x07\x03\xfb\x53\xa1\x68\x2e\x47\x12\x19\xbf\x53\xae\xed\x46\xef\xbd\xf2\xac\x2f\x7b\x59\xdf\x09\x6c\xea\xb9\x65\x4b\x7f\x90\x6a\x84\x28\x5c\x3e\xcd\x98\xe9\xcb\xc1\x67\x57\x27\x46\x65\x8c\x78\x6c\x6f\x3d\x8a\x2c\x46\x18\x01\xab\x6b\x4a\x1a\xd8\xcc\xd0\x09\x27\xaa\x79\x9f\x10\x8b\xeb\x8c\x9b\x96\x61\x46\x3b\x93\x43\x14\x1f\x68\x5a\xe1\x28\xe2\xf2\xf9\x81\x9f\xbe\x8b\x23\x70\x28\xe9\x57\x2a\xcc\x21\x5e\xdd\xb1\x2b\xcb\xf2\x1a\x1c\xce\x0c\x4f\x9d\x5c\x9a\x69\x32\x10\x58\xb3\x40\x2f\x5d\xf6\x5d\x97\x35\x89\xb5\x40\x64\x2d\xd5\x1b\x64\x11\x72\xd2\x9c\x0c\x98\xbe\xd3\x0c\x39\x09\xc8\xeb\x59\x96\x00\x59\x24\xc3\x19\x97\x29\xb9\x19\x4c\xab\x92\x50\x4e\xdb\x50\x6d\xb5\x85\x3f\x41\x71\x47\xec\x81\x36\xca\xf6\xc0\x9a\xa0\x38\xa2\x86\xe6\xd2\x49\x47\xae\x72\xbc\x01\xb9\xee\xf0\x96\x25\x42\xa3\xe5\x8e\xc9\x97\x7c\xdb\x28\x9c\x8d\xbf\xc7\x5c\x6e\x35\xaa\x4f\x23\xab\x55\x04\x45\xba\xbc\x10\x50\xd4\x22\x2c\x31\x8b\x24\x46\x0e\x56\x79\x8f\x77\x2c\x33\xd8\x55\x51\x6b\x94\x33\x91\x0f\x68\x73\x12\xa2\x1c\x49\xe2\xbc\x7c\xa7\x9a\xef\x27\x09\x53\x9c\x88\x1b\x50\x9c\x63\x01\x21\xbe\xe1\x95\xc9\x9d\x2b\xba\xce\x29\x0c\xb2\x32\x4b\x74\x2b\x2a\xf9\x57\xb5\xfd\x4e\x00\x14\xb8\x6f\xf7\x32\x4b\xf4\x82\xe5\x29\xcc\x2c\x8e\x45\x12\x1e\xa5\xe4\x3a\xe5\xa7\xf9\x7b\xd6\x7f\xd2\x58\xbf\xda\xaf\x2e\xc5\x73\x2e\x08\xda\x2b\x38\xa6\x37\x17\xbb\xef\x1d\xcb\x32\x2e\xce\xfa\x4f\xf2\x79\x7b\xfe\xe4\xf2\x46\x20\xc8\x8b\xd9\xf8\x53\x56\xab\xb2\x20\x3d\xfa\x52\x76\xd7\xf6\x63\x04\x64\x6e\xcc\xa2\xfa\x8e\xa6\xeb\x9d\x4d\x97\xfd\x9f\xa7\xde\x3f\x2b\xc8\x76\x13\xe4\x44\xbc\x1e\x69\x9b\x39\x89\x6b\xaa\x21\x39\xbd\x73\xd0\x1a\x49\x20\x26\xee\x4c\x00\x6b\xf3\xa5\xb9\x9d\x9c\xc4\xa6\x44\x16\xff\xf3\xb5\xa1\x91\x02\x42\x52\x09\xc2\x52\x83\x05\x17\x04\xee\x9e\x55\x8d\x0c\x53\x1b\xe7\x62\x0d\x5c\xe6\xc5\x8f\x82\xe6\x1b\x1a\x5a\xa0\x58\x61\xcc\x20\xbb\x7d\xfe\x17\x23\xeb\x25\xdc\x84\xf6\xd2\x36\x01\x75\xd3\xd4\x41\x73\x75\x9e\x81\x0d\x32\x2c\xb3\x12\x70\x72\x72\x8b\x6a\x98\xa2\x8c\x17\xac\x91\x43\x78\x49\xe0\x91\x5a\xc7\x05\x59\xc8\x49\x32\xac\xcc\xc4\xaf\xdd\x6d\x50\x79\x05\xc7\xda\x54\x8e\x29\xca\x6d\x02\x17\x1b\x9f\x09\x49\xa1\x42\xf2\x5f\x5b\x10\xc9\x01\xdf\xee\xaa\xc5\xd7\x64\x9b\xef\x89\xcb\x4a\xdc\x96\x2a\xfb\xd8\x4b\xd3\x9c\x49\x11\xb7\x5b\xbc\x1d\xfc\x1c\x83\xa8\xb8\x3d\xbd\x96\xd4\x54\x01\xfb\xe4\x15\xba\x91\x2d\x94\x0c\x24\x2a\x11\xe7\xe4\x77\x3e\x89\x95\x57\xdd\x7c\x90\x2a\x4a\xd6\xf1\xb1\x8a\xaa\xd3\x38\x49\x03\x95\xbc\x0f\xee\x2e\x00\xdd\xe5\x05\xaf\x4c\xdf\x14\x24\xa6\x95\x02\x8c\xd7\x96\x79\x1d\x50\xd0\x40\xa9\x8c\x9d\xa1\x0e\xb9\xe8\x92\x10\xac\xad\xc1\x30\x17\x6c\x5b\x90\x97\xf8\xb6\xdf\x58\x03\x8f\x35\x85\x0b\x84\x61\xbe\x1c\x79\x09\x52\x54\xcc\x36\xaa\x7c\xba\xd0\x19\x00\x79\x4f\x25\x55\x2c\xb2\x33\x8f\xc9\x1e\x09\x49\x45\x90\x37\x59\x33\x69\xc9\x37\xbb\x63\x29\x92\xe4\x36\x1b\x43\xa5\xf0\xae\x05\x1a\x5e\x94\x86\x54\xae\x91\x59\x82\x9d\x8d\xaa\x52\x9b\xd6\x5c\x5e\x20\xc9\x07\x85\x1c\xdd\xe7\x18\xb9\xc8\x1b\x5c\x08\x3a\x80\x27\xd6\xe1\xbd\x57\x11\x42\xed\x25\x0d\x94\x84\xd9\x91\xab\xb5\xd7\xa2\xf1\x46\x51\x9f\x65\x95\x1e\x9f\x21\xf4\xf0\x2e\x2c\x5e\x2f\xcf\x19\x02\x25\xc3\x9c\x43\x68\xa4\x2c\x39\x67\x9d\x28\x71\x18\x0f\x1e\xc9\xe0\xd5\xda\x89\xe7\x45\xda\x37\x97\x24\xa9\x34\x1c\x84\x3a\x32\x2b\x90\x0b\xb3\x3b\xe1\x79\x3b\x67\x25\x17\xbc\x1d\x9d\x78\xf7\x78\x20\x7b\x44\x54\xa6\x98\xfb\x52\x22\x7b\x88\x6a\xd2\x34\xf2\xb6\x8f\xdb\xd8\x0a\x34\xf6\xcf\x46\x57\x6b\x52\x27\x83\x6b\x1f\x48\x3f\xe2\x44\x36\xcc\xd9\x7a\xc4\x15\x41\x84\x40\xcc\x12\x6e\x3b\x4e\xcc\xf1\x17\x68\xa1\xb1\x87\xfa\x3a\x33\x48\x9b\x73\x91\x0d\xde\x16\x39\xc2\x48\x02\x95\x11\x34\xb8\x98\xfa\xc4\x76\xa7\x59\x0a\x5f\xe4\xca\x23\x20\x6d\x95\xb1\x69\x17\xcb\x9d\x4d\x56\xc5\x22\xd6\x9a\xb5\x12\x31\x19\x88\x57\x8c\xf8\x6e\xf2\x72\x60\x79\xaa\xa6\x1c\xad\x11\xe9\x92\x25\x44\xe2\xa5\xe3\xbc\xec\xfb\xbc\x79\x04\xab\x48\x6c\x8e\x3e\xc7\xa5\xaa\x2d\x1c\xff\xa7\x70\xc1\xf7\x0f\xa2\xf2\xc0\xa5\x67\x5f\x9c\x0a\x21\x88\xd6\xb7\x19\x3e\x31\xf9\x90\x91\x9c\x0d\xe7\x4c\xba\x88\xa1\x46\x9b\xd9\x58\x60\xc8\x55\xe7\x31\x32\x12\x65\x2c\x31\xad\x0d\x6e\xbf\x98\x76\x25\xf0\x5d\xa7\x6c\x91\xcb\xea\x83\x61\x06\x01\x2e\x9f\x4d\x92\xe7\xa1\xf2\x20\x72\x27\xcf\x4c\x74\xbd\x17\x8f\x4d\x75\x30\x86\x4d\x6f\x31\x0d\xa7\x38\x11\x11\x07\x11\x94\xf3\xf5\x2c\xca\x14\x69\xa3\xcc\xe5\xbf\xe7\xc6\x8a\xcb\x9f\x24\xd9\xec\xbd\x94\xdd\x3c\x31\xa9\xa2\x8c\x90\x1c\x2b\x77\x16\x55\xbe\x76\x6e\x1e\x41\x8e\xbf\xc5\x4d\x95\xf2\xa5\x9d\xb7\xc2\xb1\x78\xc3\x74\x1f\x9b\x6b\xb3\x81\xf1\x13\x34\x60\x3c\xef\x72\x2c\x30\x0e\xdb\xb5\x69\xf2\xb6\x3d\xfa\x97\xdb\xe5\x24\x5b\x15\xe5\x18\xc0\x8d\xce\x92\x0d\x6a\xa2\x36\x18\x81\x87\x91\x6b\xde\x38\x8d\x48\xde\x12\xc0\xdd\x46\x3b\xa1\x12\x7f\x9b\xb0\x72\xfd\xa3\x11\xe9\xf7\x4a\xa7\x75\x1a\xe1\xd3\x53\x04\x9a\x71\xa9\xad\x0c\xd6\x6b\xc0\x94\xb9\xb4\xc5\x82\xcc\x4c\x45\xa2\x00\x8a\xb6\x36\x4a\x8a\xca\x00\x51\x94\x95\x24\x39\xbf\xba\x40\x74\x93\xfb\x56\xa1\x13\x33\xa2\x5c\x9b\x9d\x86\xf9\x01\x4b\xc7\x3d\xb8\x2b\x88\x76\x05\x03\x08\x2c\xc9\xb5\x21\x81\xf0\x26\xa7\x9a\xcb\x1e\x20\x12\xa7\xd0\x16\xdd\x1b\x36\x34\x1a\xcd\x0c\xc5\x6e\x8a\x3d\xeb\x29\x89\x6c\x9e\xe6\xd9\xae\x3b\x06\xf3\x2a\x69\xe8\x41\xcd\xbd\xdc\x22\x8e\x0e\x2b\xf4\xf9\xa7\xf1\x24\xe7\xba\xb1\x3b\xd5\xa5\xf3\x53\x57\x1f\x98\xae\xa0\xb0\xd8\x86\x0f\x1b\x69\xc3\x53\x64\xe4\x36\xbd\x4e\xa1\x7d\xa9\x5e\xd9\x0e\x91\x0d\xed\xb8\x17\x47\x00\xb2\x9d\xde\x2d\xd7\xeb\x56\x2f\x90\x67\xe2\x6e\xf9\x0d\xd0\x5c\xf1\x2a\xdd\x0a\xfd\x6e\xf9\x97\xea\x56\xdc\x74\xcb\x1f\xd5\xad\xad\xb5\x96\xb1\x7a\xa7\xd0\xe2\x98\x51\xcc\x37\x91\xe7\xa8\x79\xdf\x8e\x3d\x77\x0e\xab\xfc\x1c\xdd\xe6\x05\xde\xe9\xd7\xa1\xf7\x82\x14\x71\x79\x61\x55\x5c\x87\x39\xba\xf2\xe4\xbc\xc4\x87\xbd\xdd\x30\xcc\x09\xc7\xed\xeb\x37\x47\x0f\xdc\xd4\xb6\xdb\x27\x65\x5c\x5e\x10\x4a\x03\x0d\x4d\xd3\x40\xd3\x8d\x9f\x29\xb6\xc6\xaf\xdf\x60\x69\xe0\x53\x03\x68\x0a\x1e\x40\xc2\x3c\x82\x74\x72\xb6\xfb\x43\x3c\x81\xb8\x85\x5b\x43\xb8\xd5\xc4\xa7\xc6\x90\x9b\x48\x98\xdb\x28\xae\x83\x5b\x84\xb9\x01\x96\xde\xa7\x4a\x48\x34\x32\xb9\x0a\x51\x6d\x4e\xd9\xe5\x37\x16\x62\xc7\x28\x36\x59\x7e\x58\x48\xcf\x76\x58\xe3\x9b\x6b\x2b\x3b\x89\xb4\x13\xa2\x62\xa1\xbe\xdb\xc4\x58\x59\x0c\x6a\x1c\xca\x81\x4a\xe2\xc6\x56\x34\xc3\x28\x4a\x80\x5c\x9b\x82\x8c\xc8\x3b\xb6\xc2\xc8\x2a\x66\xbe\x76\x8a\x03\x35\x88\x78\x0e\x42\x6a\xae\x45\xe7\x82\xe1\xec\x2c\x82\xb7\x4a\x2e\xb9\x9e\xd4\x64\xc3\x4b\x6a\x03\x91\x24\xca\xd7\xd6\x9b\x2c\xb8\xa2\x24\xcb\xd9\x2e\x5b\xa2\xbc\x67\x5b\x0d\x62\xad\xa4\x6b\xeb\xb0\x1b\x9a\xe5\x75\x0b\x01\x57\xb4\x15\xc8\x22\xbd\xd7\x76\x38\x50\xac\x50\x07\xb1\xe9\x8b\x40\x69\x36\xa6\x53\xc9\x73\x28\x86\xd9\xf1\x5c\x68\x9e\x8b\x59\x6f\xda\x54\x33\x95\xd3\x25\xc3\xf4\x72\xe8\xea\xb0\x82\xd8\xa1\x27\x49\x6a\xdd\xa2\xd6\x26\xa3\xea\x78\x65\x00\xcd\xda\x81\xb3\x73\x4c\x25\x61\xe3\xa2\x40\x72\x94\x0a\x31\xb1\x12\x90\x66\x9b\x02\x54\xaf\xdc\x89\x72\xea\x91\x78\x63\x51\x02\x74\x82\x8d\xd1\xb5\xb7\x39\x02\x01\x91\xac\xa3\xef\x75\x43\x3a\xe2\x27\xca\x11\x47\xc4\x02\x2c\x57\x6e\x77\xd4\x4c\x83\x7b\x27\x56\x6b\x0f\x4d\x50\x00\x93\x03\x88\x12\x0f\x7a\x10\x85\xd1\xf4\x3b\x99\xd3\x20\x03\x0a\xf6\x23\xcf\x47\xbf\x2d\x32\x93\x72\x39\xa1\x3d\xfb\x1c\xf8\x5a\xeb\x63\x00\xe1\x95\x3b\x89\x60\x4c\x45\x72\xd9\x45\x48\x7b\xda\x33\x4a\x98\x3b\x24\xe4\x2e\x6f\xf1\xeb\x91\xc9\xa1\xf6\xd0\x31\xed\x99\x86\x6c\x0e\x35\xc3\x1c\xd1\x0c\xd1\xba\x24\xe7\x9f\x53\x07\xc9\xe4\x29\x22\x3b\xa3\x7d\xf6\x98\x61\xca\x9a\x51\x5c\x16\x2a\xab\xd3\x8d\x4f\xbd\x71\xdf\x24\x17\x37\x8d\xeb\xf6\x86\x8b\x5b\xb3\x95\xd1\xba\xed\xf3\x19\x43\xea\x8e\x99\x72\x23\xf1\xe2\x41\xf4\xd4\xd7\xd9\x83\xd5\x66\x0f\x26\xca\xf6\x38\x1b\xaa\x71\xbf\xc1\x1a\x4d\x6a\x20\x8a\x78\x95\x20\xbe\xb4\x2c\x72\xc6\x38\xfb\xfd\xe3\xdc\x4b\x2b\x3c\x4e\xe5\x7d\x72\x35\x61\x67\x9a\xf0\x57\x60\x72\x67\x24\x22\x7d\x2e\x43\x3b\x23\xe9\xe7\xd7\x93\x5e\x1d\x78\x16\x77\xc0\xcb\x66\x17\xbd\x36\xe2\xac\xa7\x7b\xbc\x11\x37\xbc\x51\x0e\xc8\xb3\xb7\xfa\x82\xf7\x49\x5c\x7b\x60\x2d\xca\x82\xf9\x1a\x12\xe2\x45\xcb\xe8\x77\xf0\xf4\x6c\x93\x6c\x79\x3e\x3f\x91\x77\x66\x9b\xc7\xdd\x36\x71\x42\xb2\xd1\xd7\xa1\xd7\xfd\xe9\xf6\x8f\x12\x10\xa6\xa0\xdf\xfd\x4d\x38\x4e\x26\x00\xa7\x3c\xef\x07\x41\xc9\xa5\x99\x7e\xc3\xc4\x68\xab\xd7\xe7\x8c\x6f\x92\xce\xf7\xec\xa1\xbc\x95\xb8\xde\x26\xa3\xfc\xe5\x8d\xb6\xca\x4f\x4f\xe3\xfb\x27\xf9\x80\xc4\x75\xf4\xb6\xf0\x44\x15\x76\xcf\x96\x30\x50\xfc\xbb\x24\x53\xd3\x24\x95\x30\x38\x77\xe7\xd9\xfa\xce\x31\x31\x31\x9b\x92\xac\xc0\x14\x73\x32\x5c\x88\x63\xc4\x76\xb9\x08\x89\x39\xf0\xae\x74\xa3\x0c\x0c\x72\x77\x21\x87\x7d\x98\x7d\x83\xba\x63\x8d\x2e\xe8\xf5\xd4\x06\x1f\xa7\x7f\xbc\xe0\x88\x1d\xa7\x70\x7c\xfd\x11\x3c\xe0\xf5\x7b\x94\xb2\x32\xa0\xeb\x9d\xeb\xe5\xd4\x71\xab\xea\xab\xfb\xc7\xbd\x33\xd7\x3c\x7d\xd9\xa9\x3b\xd0\x04\x1a\x35\xe1\xad\x92\xff\x81\x2e\x98\xf1\x53\xf9\xab\x75\x15\x12\x24\x51\x71\xdc\xc8\x1b\x05\xce\x50\x72\xac\xb7\xce\x5f\xd9\x79\xd5\x28\x34\x73\x63\xc0\xc7\xad\xc7\x26\xe7\xa5\xc7\x05\x89\x4b\x17\x97\xb5\x5d\x44\x57\xcd\x96\x15\xb4\x49\xc1\xf7\x4d\xb1\xc2\xa6\xc2\x3c\x87\x8e\x77\x48\x0f\xd1\x94\x14\x36\x90\x9c\x45\x73\x9c\xca\x0f\x16\xac\xcd\xa5\xa1\x4f\x56\x8f\x50\xa2\x32\x2a\x80\x11\x65\x6c\x90\x4e\xbc\x29\x7f\x52\x62\xd8\xb3\xa4\x04\x23\x43\x62\x8f\x0a\xb0\xac\x90\x3f\x6c\x10\x4f\xc8\x67\xa4\x16\xc1\x3b\xb1\xbc\x3b\xff\x60\x10\xbc\x92\x4f\x95\xc1\x7f\xbc\x64\xfb\x78\xd3\x47\x89\x3c\xf2\x10\xd7\x54\x80\x1f\x23\xb2\x3c\x74\xcd\xe2\xc1\x5e\x50\x01\xa8\x62\x2d\x01\x4c\x32\xb6\x8b\x90\x01\xbb\xfc\x87\xa0\xd0\x2a\x9f\x0f\xfa\x05\x70\x4a\xa1\x7b\xc0\x0e\x43\xa3\x00\xfc\x10\x41\x9c\x04\x50\xe5\x7a\xbb\x1f\x2f\xd4\xc7\x9d\x0b\x52\x7c\x21\x9b\x60\x2d\x5c\x36\xc0\x22\x5e\x6f\x20\x6d\x58\x9c\x8b\xcb\x06\x2a\x45\x65\x24\x0e\xfe\x37\xf2\xbf\x2b\x44\x70\x1d\xc6\x87\xc9\x10\x35\x02\x86\x42\x1d\x6e\x0a\x36\xf8\x25\xa4\x0b\x88\xb5\x76\x10\x74\x82\xb4\x6c\x30\x4f\x7c\x83\xfe\x13\x1b\x10\x18\xf7\x81\xe9\x57\xca\xa7\x90\x2d\x39\xd2\xc4\xd3\xc7\xe4\x0d\xef\xd1\xa3\x06\x7c\xdd\xa5\x7d\xe6\x26\x8d\xa7\x6c\xd2\xc3\xa3\xa8\xbb\x69\xa0\xa5\x30\x42\x21\x01\x32\x2e\xcd\x88\x37\x33\x6a\x31\x43\xc4\xa3\x9d\x1c\xa0\x2d\x29\xae\x88\x77\x41\x32\xd5\xe8\x1d\x0d\x49\x14\xe3\xe3\x7d\x03\x8f\x74\x86\x2d\x05\xae\xae\x8a\x02\x55\xd4\xba\xfd\xc4\x8c\x3b\x39\xba\xa9\xf8\x66\x89\x6e\x1e\xca\x21\x9a\x47\x4e\x5f\x36\xf6\xd2\xbb\xbc\xc0\x06\x0c\xaf\xf2\x40\xca\x43\x97\xde\x43\x8b\x76\x37\xba\xa9\x7c\x53\x3a\xd2\xe5\x45\x52\x86\x4a\xd6\xc0\xb8\xaa\x89\x9c\x35\x5f\xbe\xbb\x22\xd7\x90\x29\x29\x8a\x13\x33\x4f\x29\xcf\x63\x06\x37\xca\x0e\xfa\x4a\xe2\x48\xc8\x2a\xe9\x68\x79\xe2\xf0\x6c\x8b\x08\x39\x8b\xef\x14\xf4\x49\x3b\x69\x50\xbc\x87\xa8\x75\xad\xd2\xdc\xfa\x49\x09\x70\x6b\x2a\xba\x51\xa7\x1d\xa3\xbe\x85\x21\xe3\xe6\x54\x94\xe2\x4b\x3d\x1b\x8e\x17\x79\x65\xc7\xe3\x2a\x43\xb8\x66\xde\xb4\x95\xce\x8e\x0b\x18\x34\x84\x0b\xa0\x0c\x98\xcc\xd3\x3f\xb7\x25\xee\x08\xdb\x39\x97\x0e\xdf\x78\xaf\xd1\xf6\x08\x99\x0e\x10\xf2\x16\x39\x4a\x92\xe9\x29\xa8\x31\xf0\x46\x1a\xc0\x2c\x49\xb6\x6b\x9b\xf1\xca\xe4\x5f\x0b\x69\x59\x68\x82\x20\xa0\x65\xcd\x1d\xfe\x77\xa9\xe5\x65\xfe\xa9\x9a\x47\xfc\xc1\x07\x34\x59\x5e\x41\xc7\x72\x42\x80\xec\x2c\x27\xbf\xfe\xf1\x8e\xab\x8a\x2a\x81\xff\x20\x37\x53\xc6\x9a\xeb\x7e\xc8\xa3\xa5\x40\x77\x29\x92\xcd\x5d\x50\xec\xf8\xbf\x07\x9d\xff\xe0\x96\xf1\x8d\xb8\xd4\xf2\x9e\x26\x91\x0f\x8c\xce\x8f\xe2\x87\x9c\xa7\x4e\x6c\x48\x66\x50\xee\xa9\x62\xc2\x41\xf7\x16\x10\x63\x98\x00\x14\x26\x8d\x10\xb4\x15\x9c\x3b\xaf\x79\x9c\x44\x8a\x35\xaa\x10\x99\xa7\x10\xc8\xb9\xa2\x85\x94\x8b\x8d\x20\xe4\x04\xa0\x8d\x00\x97\x45\x03\x1a\x88\x0d\x4c\x5a\x06\x69\x43\x81\xf1\xe3\xbf\x8d\xc8\x53\x4e\x39\x91\xb7\x7c\x49\x6e\x45\x6b\x1d\x17\x5d\x23\xa6\xe8\x58\x0b\xe7\x64\xc0\xaa\x20\x42\x9d\x20\xbc\xa9\xdc\xbd\xa8\x72\xca\x34\xb3\xc4\x46\xd0\x6b\xd1\x09\x79\x52\x4c\x86\xb6\x63\x89\x30\x75\xf0\x70\x24\x1f\xbb\xa6\xdb\xdd\x48\xe4\xae\x65\x14\xb8\x0d\x70\x9b\x28\x9b\x22\x4f\xcb\xd2\xc8\x68\xb7\x82\xdb\xd6\xfd\x2d\x5f\xb0\xb4\x8d\x4b\x12\x03\x9e\xe5\x4a\xe4\x6a\x05\x89\x8f\xf8\x6f\xdd\xfc\xcd\xff\xb6\x04\x62\x64\xd4\x4d\x26\xd3\x0f\xd9\xe6\xc7\x7f\x08\xde\xab\x6a\x7b\x3c\xc5\x20\xda\x5e\xc6\x53\xb0\x1b\x31\xb6\x81\xcd\xe3\x19\xd7\x3c\xe3\xbb\xa8\x23\x63\x13\xa2\x76\x59\xc2\xd5\x81\x97\xff\x82\x17\xcf\x3a\xf2\x7c\x07\xa0\x65\x86\xa2\x14\x74\x02\xa6\x39\xa6\x08\x2d\x99\x1a\x1b\x7a\x27\x81\xed\xcd\x94\xdf\x34\x62\x8a\x6e\xb9\x0e\x32\x4b\x7c\x55\x71\x39\x9a\xa6\x3c\xa5\xdd\x44\x5b\xb9\xfa\x65\xdb\x41\x99\x60\x81\x4b\x6c\x96\x40\x86\xab\xdc\x60\x0a\xe2\x52\xa8\x46\xf0\x71\x45\xe4\x27\x59\x4b\x3c\xa9\x99\x9a\xe4\x8e\x6a\xef\x66\x27\xea\xa4\x32\x90\xa1\x50\xdb\x32\x8f\xb4\x6b\xcf\x70\x73\x6d\x99\x2b\xa0\xb6\xc2\x1b\xbc\x34\xc2\xf1\x48\xa3\x6a\x18\x86\xca\xb0\x9d\x1e\xf0\x83\x30\xaa\x8c\x16\x1a\xa4\x97\xaa\xeb\xef\x14\x63\xe8\x3b\xad\x4a\xcc\xce\xa1\x6e\xb4\x1e\x49\x14\xda\x72\x56\x03\x4e\x07\xf9\xd7\x2e\xb5\x69\xc8\x41\x42\xe9\xb4\x40\x73\x82\x6d\x60\x1c\xc2\x3a\x34\xfa\x67\x12\x64\x51\xdc\xfc\xb7\x2c\x3a\x45\xa5\x58\x21\xc9\x52\x16\xc7\x74\x59\x7a\x51\xfe\x1d\xbd\x56\x72\x89\xff\x78\x77\x41\x16\x32\xbe\x1f\xad\xb5\xcf\x7c\x58\x96\x90\x11\xce\xca\x1a\xab\x4c\xc4\x92\x1a\x1c\x47\x2b\xeb\x52\x10\x95\xc0\x96\xa6\x78\x51\xfd\x1b\xb3\xcb\xbb\x05\x17\x96\xbc\x44\x94\xd0\xa0\xd8\xfe\x2b\x0f\x56\xc2\x12\x5a\x87\x69\x28\x92\x26\x09\x22\xce\x97\x36\xdc\xd2\x06\xcd\xef\xb9\x98\x2f\xed\xb1\x84\x63\x7a\x31\xd8\x62\xc4\x74\x7e\xfc\x86\x65\x31\xdf\x80\xe1\xbe\x9c\x21\x4f\x82\xfe\x91\x25\x09\x27\xad\x6b\x7a\x21\xc1\x91\x5a\x20\x68\xe5\x18\xa3\x8a\xe0\x83\x8a\x5d\x28\x86\xf6\x0d\x18\x31\xbf\x40\x16\x28\xae\xc3\x8a\x4a\x4c\xe0\xb0\x0a\xaa\x3d\x2c\xb1\xe0\x79\xc2\x59\xf4\x28\x92\x8a\x6d\xc8\x00\xaa\xb6\xde\x17\x32\xf1\x75\xb9\xff\x4c\xf6\x18\xa1\x59\x04\xc7\x0d\x70\x9b\x34\x9b\x2c\x23\x24\x5c\x4a\x04\x6a\xa1\x85\x59\x43\x82\xc2\xef\x18\x0a\xe3\xe4\x50\x72\xc6\xeb\x20\x74\x91\x9f\x94\xdd\xe5\xb1\xf2\x90\xc4\xa2\x62\x37\xbd\xb6\x12\x91\xbb\xf6\x40\x32\x2c\x11\x8e\x97\x28\x8f\xe9\xa9\xdd\xb2\xc7\x32\xcb\x48\x10\xcc\x2c\x81\x17\x89\xa6\x0b\x1a\xc9\x11\xc1\x81\xe7\x49\xa0\xba\x03\x18\x33\xc2\xb9\x69\x02\xfc\x11\x9c\x95\xb3\xcc\xdd\xcf\xc5\x7b\x42\x96\xab\x91\xc2\x34\x50\x9c\x49\xac\x6e\x6a\x09\x5a\x7c\xe7\x9a\x96\x5c\xde\x48\x26\xd3\x04\x91\x25\x4b\x08\xa6\x24\x03\xce\x55\x11\x0a\x96\x81\x8b\x4d\xf6\x3d\x23\xa9\x60\x48\xe5\x30\xcb\xe6\x9e\x98\x77\x26\x1d\x34\x37\x1a\x34\x2a\xc4\x3e\x6b\x81\x35\x3c\xb0\xc2\x48\xda\x98\x4d\xd6\x84\x74\x06\x41\x00\x6b\xf3\xa5\xa1\x5c\x05\x64\xd5\x10\xde\xbe\x75\x0b\xb1\xac\xc3\xdb\x8d\x22\x8f\x60\xa3\x06\x0a\x33\x0b\x36\x28\x9b\x4f\x4b\x31\x1b\x93\xd1\x8a\x0b\xaf\xc0\x4a\xb6\xb3\x25\x71\x5f\x6d\x9b\x26\xed\xbb\x3f\x64\x6c\x0b\x80\xb1\xb1\x80\x51\x86\xbd\x1a\x5b\xae\xc5\x0a\x07\x09\xe7\xc6\xee\x7a\xc6\x72\xa8\x58\xbe\x4d\x82\x6d\xd3\x78\x53\xfe\x0b\xda\xa9\xbe\x2d\xf6\x7c\xfc\x11\xd9\x37\xc7\x9c\x8f\xf1\xf3\xfb\x35\xb0\xe6\x63\xfc\x05\x5b\xe5\x36\x8a\x83\x9a\xa9\x46\x3c\x80\x15\x05\x51\xdc\x86\xdc\x21\xdb\x08\xdb\x8f\x2e\x6f\x78\x32\x93\x98\x67\x42\x93\xac\xa1\xe5\x4f\xf9\xef\x59\xff\x89\x3c\xcb\x1f\x23\x98\x49\xfb\xe5\xc6\xa7\xb7\xbf\x6d\x38\xc7\xfb\xdf\xb5\xd2\xb7\x09\x0a\xa9\x1f\x52\x01\x45\xca\x7c\x64\x40\xd6\x4a\xe2\x19\xc1\x08\x2b\x4a\xf9\x52\x34\x3b\x07\xf8\xa8\x36\x20\x9f\x02\x77\xe1\x99\x2f\xc5\x7c\xc9\xb7\x8d\xa8\x66\x61\xdb\x69\xb3\x69\xc2\x94\xbd\x0c\xa3\x5e\x12\x24\xd6\x69\x12\x13\x7c\xce\x72\xbb\x01\xb8\x90\x3c\xc0\xd6\xce\xc6\xdd\x92\x1c\x27\x81\x77\xe1\x06\x89\xbd\xf3\xbd\x81\x28\xae\xa7\x03\x24\x90\x4d\x15\xd3\x1e\x1c\xc4\x43\x07\x07\x60\x4c\x3e\x3b\x70\xe0\xc3\x69\x67\xfc\x4f\x60\x41\x8b\xaa\x8c\xf6\xff\xd3\xb2\x47\x69\x89\xb0\x3c\x82\xa3\x47\xa0\x38\x8f\xe0\x04\xe6\x3e\xd4\xbc\x51\x81\xa7\xbc\x4a\x52\xcf\x0d\x2b\x3b\x08\x67\x34\xb9\xf1\xb8\xb7\x75\x4f\x05\x42\x80\x82\xf8\x14\xc1\x9b\x9d\x1d\x10\xa0\x47\xc1\x0b\x0f\xcd\xb5\x25\x8c\x42\x0e\xcd\x47\xcd\x93\x6d\xda\xba\x16\x4a\xa7\x68\x91\x4f\x50\x39\x65\xea\xcc\x5c\xc0\x59\xf0\xb4\x16\x1f\x68\x03\xc9\x4a\x42\xc2\xe3\x1d\x07\x0e\xe7\xc6\xce\x69\x3c\x2c\x60\x5a\x66\x7c\xcf\xa1\x58\xc1\x34\xd8\x2d\x2d\x03\x88\xda\x03\xa5\x09\x24\x85\xc3\xc9\xae\xc9\x32\x2d\xa0\x78\xdb\x79\x70\xbc\xbd\x39\xdb\xe3\x0f\xc3\x16\x64\x2e\x11\xa1\x70\x2b\xc0\x34\x1b\x35\x4e\x91\x2c\xca\xb8\xc5\x81\x7a\x95\x9c\xb0\xc8\xf6\x34\xdc\x35\xa0\x79\x01\x62\x68\x50\xf9\x0c\x58\x27\xab\x88\xb7\xbd\x67\x8e\x8b\xdf\x6c\x49\x22\x40\xef\xde\x92\x4c\xb7\x1f\xf9\x3d\xfb\xd1\x66\x3b\x1a\xa3\x88\xca\xe3\x66\x37\x32\x20\x99\x67\x49\x91\xd9\xb9\x17\xe5\x26\x9c\x36\xd7\x63\xe1\x7c\xe8\x15\x3a\xd4\xf4\xbe\x39\x76\x71\xa0\x73\x63\x6b\xc4\x37\xca\x40\x0e\xf4\x70\x6c\x92\xf8\xaa\x2c\xe5\x40\x3b\x77\x19\x14\x7e\x7d\x8b\x69\x6c\x01\x10\x8e\x24\x9a\x02\xb1\x78\x2e\x79\xa5\x5b\x57\x64\xcb\xc4\x66\x67\x63\x45\x5f\xd0\xb6\x62\xaa\xc1\xf0\x02\x42\x96\xdd\x45\xef\xa7\x9e\xec\x1e\x54\x1a\x4b\xfb\xe2\xec\xb0\x57\x60\x39\xbd\x27\x07\xf5\xf9\xaf\xe1\xcd\x76\x4a\xaf\x9e\xf6\x80\xff\x1a\xac\x6e\xa8\xf8\x9f\xc9\xea\x9e\xf6\xac\xff\xb6\x19\xdd\xd3\x4e\xe5\xaf\xc8\xe6\xf6\x8a\x20\x47\x78\xa6\x4f\x29\x92\xec\xaf\x6e\x87\xd6\xfc\xcd\x72\xd5\x7d\x7d\x1c\xab\xb9\xcf\x10\x4f\x2b\x0b\x85\x53\xb6\x87\x83\x03\x8e\x34\xaa\x41\xe0\x84\x76\x80\x56\x7b\x30\x34\xb3\xcc\xdd\xe4\xd2\xbc\x3e\xbd\x34\xbb\xbf\xdf\xbb\xe3\xde\x8e\xf1\x33\xfb\xcb\xdd\xe7\x3f\x7f\xd9\x42\xbd\x39\xc7\x77\x82\x82\x32\x66\xee\x46\x28\x0d\xa9\x87\xc1\xe0\x94\x80\x43\xa4\xb9\x2b\x0d\xce\x29\x94\x84\x2b\x2a\x0d\xf6\x5e\x91\x42\xa6\x8d\x8d\x30\x23\x9f\x45\x4a\xe0\xd2\x02\x05\x96\x0c\x23\xc4\x3d\x99\xc7\x90\xf9\x02\x96\x38\xf6\x31\xdc\x86\xa5\xfc\xd3\x75\x3d\x11\x22\xa5\x31\xca\xce\x07\x39\x83\x95\x2b\x3d\x78\x01\x36\x4b\x0a\xdb\xf0\x51\xa6\x53\x01\xd1\x0d\x0b\xb4\x0a\x79\x49\xad\xb1\x00\xaa\x49\x41\xf0\x25\x0e\x60\x77\x29\x69\x08\xb8\x10\xe2\x4f\xa5\x9f\x1b\x5a\x83\xc7\x05\x2f\x3b\xb1\xad\x52\xea\x57\x58\x28\x4c\x75\x91\xb3\x74\x2e\x88\x94\x31\x62\xab\x5d\x18\x09\x7b\xe2\xdd\x39\x0a\x3a\x67\x87\xa7\xc4\xe5\x86\xb2\x9f\x65\x98\x7b\x31\x95\xcf\xd2\xf1\x0d\xe8\xbb\xfc\x6b\x7c\xce\x28\x1e\x6a\x7b\x83\xdc\x67\xa3\xb2\x2b\x6d\x70\x06\x4e\x76\xc7\xb6\x1e\x0b\x8e\x4a\x2f\x19\x59\xb3\x11\xcf\xb4\xec\x00\x4c\x82\xe4\x6a\xde\xcb\x69\x8d\x45\x1d\x80\xe4\xc4\x05\xb9\x77\x18\x6a\x24\x2d\x60\x7c\x46\xac\x6d\xae\xdf\x39\xf2\x25\x97\x3b\xac\xab\x69\xc4\xd9\x28\x71\x7f\xb9\xbe\x9d\x88\x62\x91\xe9\x6a\x3b\xdf\xf7\x02\x13\x48\x32\xe6\x7e\x9e\xed\x8d\x23\xae\x91\xa0\x6a\xb4\x10\x53\x2f\x45\x4b\x5b\xdc\x94\xce\x7e\x51\xc4\x17\x07\x4e\xa0\x13\x9b\xfa\x75\x00\x52\x01\x06\xa0\xd3\xe4\x24\x00\xbb\x8b\xd0\xce\x10\x89\x85\x24\x32\xce\xf1\x74\xa1\x87\x8d\x12\x9b\xf4\x19\xa6\x0f\x71\xa6\x73\x6e\x1a\xe2\xe2\x79\x85\x65\x63\x61\xac\xb5\x67\xa2\xe3\xcb\x0c\x73\xa2\x88\xa2\x07\xa2\x26\x4c\x27\x00\x0e\x9c\xa9\x25\xb3\x71\xcd\x9b\xaf\x88\x1d\x0b\x62\xa9\xc4\x10\x0c\x52\x34\x75\xfc\xaa\x0e\x60\xad\x16\xc3\x64\xf7\x49\x1f\x67\x6d\x9c\x96\xbd\xc8\x29\xcf\x4d\x3f\x7a\x5c\x91\xa0\x5f\x17\xb0\x2b\x45\xce\x59\xcb\x37\x4f\x67\xc0\xfd\xd4\x11\xe9\x10\x75\xb8\x2d\xd2\x08\xcf\xb6\xa7\x51\x77\xe0\x2a\x93\xe3\xd2\x71\x93\x43\xb4\x35\x39\x8b\x24\x81\x92\x72\xe8\x23\x53\x63\xf1\x15\xa6\xa6\xe6\x86\x4a\x93\x77\x6d\x44\x93\x24\xeb\x24\x89\x4a\xb5\xf3\x0c\xfa\x97\x71\xbd\x63\x2b\xb4\x09\x92\x2d\x96\xa6\xc8\x39\xba\x86\x0f\x83\x00\xb8\xd2\x9c\x22\x60\xd8\x7a\x6a\x32\xfc\x5e\x2a\x11\x21\xd1\xe5\x8d\x16\x3f\x46\x9b\x72\x99\x2b\xed\x2f\x2f\x24\xf5\x9a\x9f\x53\xb1\x8e\xab\x58\x9a\x1d\xf8\xcb\x87\x19\xc1\x09\x07\xb5\x94\x33\xf6\x10\x98\x54\x7a\xb0\xa9\xce\x09\xc7\xaa\xc0\xaa\x41\x68\x63\x69\x33\x8c\x65\x14\x98\xdf\x17\x1e\x14\x03\x6e\x0c\xf1\xa0\x0d\x24\x89\xbd\xc5\xcb\x06\xc5\x36\x76\xa3\x33\xed\x81\x03\xbd\x89\x70\x42\x92\x10\x1f\x5b\x76\x1d\x2d\x23\x73\x54\x51\x98\x0d\xa4\x57\x98\x04\x77\x02\x0c\xf2\x69\x4e\x4e\xdf\x9c\x71\x64\xbf\x54\xf6\x3a\xfc\xe1\x82\x50\xa1\x29\x1d\x44\x9b\x73\x6a\xe1\x64\x7a\xe2\x98\x15\x88\x34\x86\x66\x4e\x28\xd5\xd5\x98\x8f\xe6\x7d\x25\x0f\xe4\xb2\x61\x06\xc1\xbe\x0e\x33\xd8\xc6\x35\x68\x9a\x39\x9d\xde\x38\xfd\xaa\x3f\xf5\x0c\x81\xc4\x3d\xda\x81\x5d\x6a\xca\xa9\x8a\x9b\xcc\xe7\x41\x9b\xc6\x75\x36\x48\xbe\x6c\x71\x8c\x15\x87\xd6\x54\x1b\x20\xed\xc0\xf1\x34\x34\xb3\xf0\xc1\x43\x54\x56\x79\x65\xa1\xd9\x4e\xd6\x64\x81\x96\x32\x67\x9d\x87\xb6\xfc\xbb\x62\xcd\xa7\xf1\x9d\x8d\xba\xc9\x72\xcf\xc5\xca\xe2\x9f\x73\x83\x8e\xf6\xdf\x3c\xfe\x50\xe1\x9b\x8f\x2b\x1c\x6a\x0f\xf5\x97\x49\xe2\x2d\x4c\xa1\x30\xcc\x31\x95\x7e\x80\xa4\x5c\x94\x18\xe6\x7e\x98\xd5\x57\x41\xc2\x2e\xdf\x84\xfc\x69\xe7\x18\x4a\x53\x8c\xd0\x92\x31\xcd\x4d\x31\xcc\x33\x3a\x80\xff\x55\x39\xa0\x66\xd0\x9d\x8b\xeb\xdb\x3d\xfd\x69\x03\xb8\xc2\x1c\x8b\xb1\x1d\xc1\x8f\x63\x1f\x4f\x03\x86\xdf\x6e\xc1\x07\x59\xc0\x07\xb1\x27\x67\xe8\x15\xb6\x09\xeb\xc4\x6c\xab\xda\x3b\xd2\xd9\xa8\xe8\xf2\x86\xbb\x39\x63\x95\xb6\x8d\x9a\x31\x24\x2f\x36\x77\xe4\x5e\x54\x66\x32\x28\x7b\xb2\x32\x40\x34\x1e\x20\x7b\xf6\x00\x1d\x04\x7d\x3f\x7a\x1c\x24\xe2\xc5\x49\xc3\x72\xa4\x49\xc7\xc4\x8d\x34\x6e\x78\x53\x9d\x0f\xb9\xce\xcb\xe1\x89\xc9\x23\x2f\xc0\x61\x42\xec\x69\x10\x14\xd5\xd2\xfb\xf0\xae\x8c\x20\x86\x75\x80\xad\xdc\xf7\x98\x56\xa3\xbb\xa7\x52\xdf\x04\x63\xfb\x02\x34\x76\x08\xb9\x4a\x9a\xd1\x6b\x98\x94\x4e\xbd\x76\x61\x6e\xe9\xe5\x8d\x8e\x59\x8b\x74\x73\x4c\x20\x71\x97\xac\x96\xf5\xa6\x5a\xe2\x60\x4a\xf4\xfc\xc6\xf6\x43\xee\xf2\x9c\x1f\xae\x3d\x14\x69\xf4\xcc\xe4\xd4\xb6\x6e\xb5\xe3\x59\xa1\x8f\xa7\x9f\x71\xb6\xc4\x6a\x12\x5b\xcc\xb1\x73\x77\x91\xc7\xd2\x48\xa2\x02\xb9\xe6\x01\x0c\x60\x25\x05\x87\x93\x10\x6a\xc9\xce\xe9\xc2\xac\x3f\xa3\x79\x84\xc9\x82\x0b\x2a\x01\x0a\x66\x86\xa8\x2b\x66\xf0\x9a\x7c\x98\x01\xf3\xb6\x73\xf8\x5c\xdf\x5c\x1d\x5a\x2b\xa7\xf6\x39\x65\xcc\x8f\xda\x42\xf4\xda\x0a\xe4\xd1\x2e\xe8\x8f\x08\x72\x88\xe6\x6c\xcd\x2f\x49\xd8\x5e\x1a\xbd\x99\xed\xbe\xe8\x45\xa0\x8e\x0a\x49\xe2\x4b\x68\xa7\x4a\x6f\x21\x04\xdd\x26\x72\xb3\x72\xd9\x15\x6e\x3e\xb1\x21\xdb\x0e\x16\xc0\x78\x76\xf3\x82\x93\x8c\x14\xca\xf6\x96\x66\xb1\xb5\x34\x73\x16\xa7\x89\x94\x81\xa3\x39\x46\x14\x4f\xf3\x8a\x05\x1b\x84\x86\x54\x34\x29\x92\x44\x39\x0b\x1e\x6e\x2f\xf9\xd2\xba\xe7\x98\x8f\x10\x72\xaa\x68\x28\xa2\x4a\x92\x2e\x0a\x65\x92\xfb\x6f\x29\x79\x4b\x32\x07\x62\xcd\x7c\x56\x7b\xe1\x8f\xc3\x77\x54\x93\x1a\x1a\x8a\xed\x54\xc5\x7f\xbd\xaf\x26\xca\x98\x11\x58\x9b\x33\x76\x1e\x73\xc6\xd4\x24\x61\x9b\xed\x0a\xf3\xca\x60\x29\x49\xc8\xe6\xb1\x34\x58\x41\xea\x96\x5f\xa1\xc4\x55\x76\x2e\x05\xcc\x06\x0f\x24\x95\x5c\xfe\xac\x39\x2e\x19\x15\xdb\x56\x3a\x6d\x32\x88\x10\x55\x9a\xf7\x2d\x70\x4e\x85\xb9\xdc\xef\x99\xec\xa6\xcd\x31\x80\x39\xc9\x80\xd9\x05\x5b\x8f\x7b\x54\x90\x93\xea\xb1\x39\xf3\xbe\x39\xa3\x9e\x93\x46\xd1\xb5\x41\xa4\xca\x41\xf4\x73\x96\xf0\x4b\x3b\x47\x0b\xa9\x94\x1b\x68\xca\x1e\xe2\xba\xc4\x96\xd2\xca\x03\xf5\x4f\xc2\xa6\x3b\x45\xf1\x2a\x31\xb5\x0d\xc9\xa6\x68\x60\x84\x99\xe2\x8a\x34\x1b\x3f\x64\x4d\x14\xcb\x74\x79\x93\x14\x15\xdc\x5e\xb4\x2b\x59\xc4\x05\x2b\xc9\xf2\xc7\x44\x8e\x9a\x05\x04\xa3\xdc\x9c\x4c\x69\xfb\xb9\x3c\x51\xd1\x4a\xf7\x87\x44\xa0\x56\x6d\xe9\x3a\x9a\xe4\xff\x5a\x9a\x34\x4f\xa4\x1c\xf8\x6b\xb5\x37\x21\x31\x13\x44\x01\xae\x49\x02\xdc\xfc\x94\x14\xba\xd6\x4c\x23\x54\x19\x94\xad\x36\x35\x61\xe0\x46\x59\xe8\x67\x22\x42\x07\x89\x94\x5d\x78\x65\x07\xf9\x89\x7c\x5d\xa8\x04\xa9\x1f\x86\x9f\x73\x8c\x5b\xac\x05\x2f\x87\x2f\xfd\x18\x7d\xc9\x33\x5a\x27\x48\xac\xe3\xf5\x8a\xda\xd4\x7f\x79\x41\x05\x78\x52\x86\x7b\xa9\x7c\x8e\x6d\x28\xfd\x8a\xab\xd9\x94\xf9\x4c\xa1\xed\xfc\x81\x3d\xd6\x56\x78\xcc\x50\xd7\xda\xe4\x60\xe7\x39\x39\x30\x58\x3b\x20\x52\x7c\xe1\xc1\xe1\x71\x5d\x8c\xba\x2f\x96\xfe\x6c\xee\xd7\x08\x21\x6a\xa3\xcd\x57\x9a\xa5\x33\x46\x87\x8e\x19\x9d\xaf\x60\x70\x9c\x0c\x1c\x6d\x52\x32\x7b\x1e\x34\xfa\xaf\x65\x3d\x9f\x09\xc9\x3e\x25\x60\xf3\x6e\x14\xc3\x6f\x63\xe8\x93\x24\x33\x47\x30\x2c\xd4\x7a\x9f\x73\x0c\xb7\x21\x7c\x5e\x22\xc6\xfd\xac\xff\x84\x9f\x6d\x3e\x9a\x02\x42\x3a\x43\x8e\x3b\x08\x46\xec\x96\x66\xc6\x6b\x56\x99\x16\xdd\x56\x5c\x44\xb1\x00\xa2\x1a\xb3\x27\x9f\x0d\x8b\xd7\x1b\xb7\xde\x03\x39\x44\x33\x2f\x33\x66\xc7\x59\x9b\x9f\xe6\x8a\x36\x1c\x17\x76\xca\xc3\x7b\x30\xf2\x54\xf8\xa2\x0d\x7b\xf9\xa2\xdd\xca\x7f\x78\xa6\x1d\xf9\x9f\x77\x9d\x9c\x05\x5d\xbd\x8b\x71\x49\x2c\xd5\xe9\xa8\xc2\xbb\x0f\x4e\xb6\x85\xce\xfd\x56\x65\x63\x24\x65\x5e\x92\x6d\x58\x9c\x22\x1d\x38\x49\x80\x2d\x58\x33\xdd\x4c\x45\x20\x54\x6e\xce\xba\x2d\x2d\x0c\x42\x70\x8a\x0a\xb0\x8e\x77\x70\x92\x6c\xb4\x85\x24\xd4\x36\x0a\xfb\xa2\x7d\xc8\xf3\x42\xa8\xf9\xb2\xf5\x82\x9c\x63\x9d\x92\xca\x64\x07\x1b\xea\x0d\x67\x80\x88\xcd\xfe\xcb\xdb\x7e\xb3\xff\x9a\x13\xe4\xe7\x83\x19\x6b\x82\xc8\x1c\x49\x2c\xa8\x16\x58\x8c\x93\x2c\xe5\xa3\x91\x12\x62\x74\xf3\x8c\xeb\x37\xea\xaf\xe4\x97\xf6\x90\xcc\x3a\x89\x2b\xc7\xe8\xdb\xec\xbe\x6a\xfc\x02\x73\x42\x56\x84\xed\x21\x1b\x8f\xe9\x56\x1d\xbd\x66\x5e\x5e\x34\x29\x52\x53\x17\x53\xcf\x13\xe8\xca\xb0\x4a\x80\x8b\x1c\xfb\xc8\xd3\xb8\x2f\x67\xc5\x6e\x25\x79\xba\x29\x78\x76\x76\x98\x7f\xbe\x29\x79\x6e\x02\x9b\x37\xbc\xe0\xcf\x4c\x8a\x33\xa5\x20\xb8\x0f\xa6\x7d\x3a\x82\x7f\xae\x6a\xd9\x27\x79\x01\x52\x6c\x0e\x8b\x45\xe8\x12\x5f\xce\x2e\xb4\x59\x30\xdf\x30\xd5\x12\xc9\xed\x80\x78\x77\x44\xde\xd3\x08\x17\x63\xca\xab\xe5\xb4\xda\x56\x63\xc9\x4d\x20\x86\x7c\x5a\x7c\x23\xab\xeb\xc5\x54\xd6\x82\x3b\xe9\x21\x1e\xbf\x66\x30\x41\x48\x2a\x1e\x48\x01\x75\x1c\x6e\xcf\x71\x4b\x99\x24\x95\x73\xa6\x06\x0f\xde\xd5\x0e\x50\x89\x6b\xc2\x8b\x2d\xd6\xe3\xc0\x78\xbe\x71\x33\x80\x3b\x59\xe4\x7d\x83\xfc\xf5\x1c\x9d\xee\x1b\xdc\x59\xbd\xe4\x46\x47\x08\x34\x43\xfe\x50\x2e\x59\xc2\x8f\x60\x15\x16\xaa\x7f\x5b\x4e\x42\xba\x2f\x7e\x1b\xb2\x69\x86\xec\x79\xc9\x7c\xde\xec\xe2\x39\x2b\x41\xd0\x54\xb9\x63\x4e\xb5\x4e\x4d\xb9\x59\x4d\x62\xda\xf8\x3a\x1b\xd5\x09\xa1\xf6\x67\x88\x5b\xd5\x28\x0c\x5a\x1b\x30\x5e\x3b\x40\xf7\xad\xc8\x4a\x2f\xb1\xf8\x8f\x89\xfa\x7f\xc3\x12\xc1\xf1\x98\x00\x23\x69\x60\x60\x70\x99\x5f\x3f\x3c\xde\xdd\xff\x72\xc8\x83\x6e\xe4\x7b\x85\x0a\xd7\x11\x02\xd5\x0e\x92\xb2\xfd\x98\x31\x19\x89\x18\x6b\xed\x98\xc0\x52\x89\x85\xf8\xfa\xaa\x5e\x72\x38\x2e\x6b\x5a\xbf\x2b\x81\x8e\xf3\x9b\x70\x54\x89\x45\x21\x5f\xba\x41\xa4\x92\x38\x81\xd9\x55\x84\x38\xca\xfe\xef\xc0\xb8\x81\x53\x56\x64\x2e\x44\x11\xcc\x20\x3c\x2e\x07\x99\xd9\x38\x70\xdb\x10\x27\x8d\xd3\xec\x35\x83\xb1\xff\xb0\x17\x11\xfe\x6b\xfb\x95\x3d\x91\xb6\x99\x17\x7b\x04\x2b\x98\xf8\xa3\xcc\x40\x3d\xd2\x18\xb8\x01\x21\x8a\xd1\x72\x22\xdf\x36\x89\x2d\x4b\x76\x96\x20\x59\x95\x36\xf8\x70\x24\x87\x91\x09\x5c\xaa\x21\x0a\xf4\x9f\xaf\x10\xc1\x89\x5d\xd4\xb9\xc6\x95\x31\x82\x33\x8a\x70\x81\x5e\x78\xcc\x8c\x99\x47\x33\xa0\xaa\x29\x79\xa2\xc4\xcd\xcd\x58\x9d\x3c\x4c\xed\x12\x7a\xa1\x44\xc5\xbc\xc7\x91\x30\x78\xac\x46\xf0\x5c\x62\x91\x97\xe0\x3d\x89\xe3\xc6\x26\x9a\x1b\x15\xea\x08\x9e\xff\x53\x63\x40\x2f\x70\xe2\x0b\x2e\xe9\xf4\x0a\xdf\x5c\x73\x87\x12\x73\xf3\x24\xc8\x19\x2f\x62\x20\x42\xde\x84\x4c\x94\x39\x16\xd4\x3c\xd7\x4b\x24\x1b\x98\xff\xc6\xd4\x4e\x73\xd5\x4e\x33\x8a\xe3\x9e\x49\x1a\x23\xe0\xaa\xd8\x0a\x20\x82\x20\xe8\x8c\x66\x86\x28\xa8\x0c\xd8\x3e\x92\x05\xc7\xf5\x7d\xf3\x36\xa1\x97\x27\xd0\x67\x7b\x25\x18\x08\x92\xc5\xc8\xa4\x95\xa6\x01\x7b\x23\xca\x08\x04\x1e\x25\x41\x52\xf0\x4f\x70\xc9\x5e\x51\x2f\x66\x73\xc1\xa8\x62\x95\x20\x32\xf3\x89\xad\xa7\x17\x29\x20\xd3\x30\x22\xbb\x8b\x11\x39\xc8\xa9\x90\x1d\xed\xe4\x45\x5c\xe8\x8b\x19\x64\xbe\xba\xfc\x72\x9a\x6d\xe6\x48\x8b\xc6\xf1\x8e\xee\x40\xd2\xef\x9e\x67\x1e\x6f\x17\x09\x48\x62\x3e\x92\x1e\xef\x6e\x98\x1d\xc9\x23\xd8\xda\x29\x26\xfd\x9e\x9b\x1f\xd9\x9c\x0c\x00\xe3\xa5\xe4\x9b\x75\x2a\xb2\xd4\x8d\x28\x59\x93\xe4\xda\xed\x3c\x56\x89\xca\xb3\x40\xa7\x4c\x01\xde\x54\x3c\xf4\xad\x28\x9b\x20\x68\x62\x72\x9d\x40\xc5\xef\x31\xf9\x59\x00\x1b\x25\xac\xba\x6d\x30\xb1\xfc\x1e\x24\xd1\x29\x02\xeb\x0a\x72\xed\x31\x39\x3f\x6a\x7d\xe6\xa9\x3e\x65\x70\xd0\xae\xf5\xb3\xb6\xf5\x0d\xbd\xba\x4a\x2a\xcc\xd5\x36\xb7\x2d\x38\x81\xeb\x0c\x60\x7d\xbe\x34\xfb\x86\x97\x7c\x1c\xf6\xe0\xbe\x71\xb1\x19\xdb\x89\x67\xea\x45\xcf\x48\xa7\x3c\x20\x3d\x82\x45\x6e\xac\xea\x03\x38\x6a\x94\x9c\x5d\xce\x2f\x0b\x0d\x45\xca\xff\x61\xd4\x80\x46\x03\x85\xfe\x10\x0d\xc6\x16\xf3\x29\xf3\xbe\xd1\xe5\xbd\x5e\x83\xc5\x2d\x23\x7e\x03\xae\xb5\xa0\x02\x82\x55\x81\xf7\x4f\x14\x0a\xc2\x34\x19\x69\x09\x65\x35\x37\x0d\xb8\x00\x0e\x6b\x04\x67\xb8\x84\x67\x6c\x04\x93\x7a\x45\xbc\x59\x95\x70\x4f\xce\xbe\x91\x5a\x32\xab\xab\xfb\x9b\xc3\xba\x89\x11\xa4\x1e\xc1\x31\x72\xdc\x60\xb9\xe4\x99\x0c\x60\x82\x6e\xd2\x43\x17\xb1\xb9\x36\xb2\xb5\x00\x48\x78\x37\x73\xe2\xbf\xda\xaa\xea\xe2\xfa\xd0\x14\x37\x95\x8e\x82\x60\x25\xed\xb4\xe1\xf6\x05\x25\x97\xb6\x7d\x5e\x20\xde\xc5\x6d\x45\x2e\xf9\x3e\x18\x61\x88\x76\xb6\xdd\xee\x4d\x69\x13\xa9\x2f\xe8\xc1\x0a\x84\xd2\xac\x1f\x61\x90\xa1\x9d\x02\xc4\xb8\x70\x2c\xc8\x9a\x42\xa2\x44\x3a\xe1\x2b\xf0\x38\x45\x5b\x33\xa5\x0b\xb9\x57\x68\x40\x56\x78\xb7\xbc\x3c\xc4\xa8\xa1\x88\x35\xf1\x0a\xa4\x3d\x31\x16\x0b\x8a\xd9\xb8\x32\xa8\xbe\x6b\xd4\xe5\x45\x36\xc5\x51\x82\x34\x93\x2d\xa4\x15\xbc\x92\x08\x8b\x49\x64\xed\xe6\x7e\x5e\xf7\xed\xeb\x13\xa9\x4d\x64\xb9\x22\x2a\xc0\xd8\x5a\xf3\xb6\xa0\x4d\x99\xc0\x55\x90\xda\xae\x4a\x5e\xa1\x62\x9d\x16\x64\x41\xc2\x4e\xda\x67\x82\x52\x15\x12\x0b\xa9\xa7\x28\xbc\xf6\xed\x10\xd3\xf3\x65\x67\x8c\x10\xbd\x3a\x63\xc0\xda\xc1\x7e\xb9\xa3\xc9\x8e\xf0\x8c\x84\x71\x9b\x5e\x1c\x37\x36\xcc\xd9\xae\x34\x31\xab\x2f\x82\xca\xd7\x4e\xfb\x0c\x3a\xe5\x94\xa8\x55\x8f\x6e\x35\x73\x5b\x03\x14\x5e\x78\xd1\xfc\x26\x88\x9f\x26\x88\xbf\xd2\xa2\x99\x66\xe3\x3e\x86\x2c\x9f\x90\xb1\x16\xf9\x87\x5d\x1b\x08\x71\x41\x72\xc8\xb3\x01\xb7\x41\x81\xbf\x94\x6c\xbe\x41\x6c\x67\xb6\x4c\xe0\xd3\x58\x66\x2d\x16\x2d\x40\xa9\xd1\x0e\xe8\x4d\x10\xfa\x34\x47\x13\x5f\x9b\xc8\x8f\xb7\xf9\xbf\x4d\x02\x7f\xce\x49\x65\x4b\xde\x4c\x11\x51\x48\x22\xb6\x34\x61\x80\x50\xa3\x65\x25\x69\xac\x9e\xe5\x64\x77\x55\x00\xc7\x52\x9b\x6b\x37\xfb\x6c\x01\x22\xfc\x3a\xa2\xcb\xe5\x8d\x60\xab\x6a\xdf\xb7\xcf\x8b\x3e\x68\xb2\xa3\xf6\xde\xc5\xb5\x0e\xe0\xda\x65\xd9\x57\x08\x1d\xd8\x24\xc8\x93\xbf\x82\xc3\xd4\x57\x97\x54\x9e\x67\x86\x7e\x39\x39\xe5\x79\x56\xe5\xa3\xd6\x8b\xea\x32\xf1\x68\x02\x44\x28\xdc\x50\x56\x26\x5e\x07\x5e\xd2\xda\x38\x9b\x2f\x6f\x79\x5d\xfd\x6a\x2c\xda\xaf\xa6\x9a\x9e\x61\x92\x7b\xd5\x3d\x63\x57\xf8\xe8\x41\xc3\xa9\x7d\x53\xda\x68\x54\xf6\xf2\x46\x90\x9c\x30\xf0\x80\xbd\x06\xb3\xdf\xc1\x81\xb7\xce\x6c\x85\xb4\x67\xf7\xf7\x77\x3f\x7f\x8b\x27\xb7\x92\x4a\x89\x7c\xcd\xf4\x86\x4c\x58\x3b\xf1\x17\x65\x68\x09\x30\xae\xd1\x8d\x91\x54\xa8\x66\xc1\x54\x65\xe9\x74\xf0\xe9\x21\x46\x72\xb2\x85\xe4\x78\x88\x04\x74\xe0\x04\xb9\xc0\x28\xec\xf2\xc4\x69\x52\x2c\x4b\x83\x55\x68\x4a\x09\xf6\x1f\xa3\x28\xc8\x36\xa3\x51\xd0\x2d\xac\x51\x56\x68\x6c\xf8\x8a\x40\x24\xf0\x90\x05\x08\x4a\x72\xd2\x83\x4b\xb3\xc1\x4b\x72\x3b\x80\x3b\xc5\x60\x3f\xa4\xa7\xd5\x75\xfd\xf1\x30\x39\x91\x85\x28\x80\x5f\x71\x0c\xbf\x51\xa8\x11\xc0\x26\x2e\x48\xf2\x12\xe3\x3c\x95\x66\x03\x3b\xd0\x42\x44\x11\x6e\x25\xc7\x07\x74\xb5\x36\xbc\x3e\xcd\xe0\x0c\xb0\x23\x87\x1e\xc4\x26\x50\x52\x23\xc8\x4d\x4a\x0b\xc3\x5b\xda\xb3\x90\x9c\x3e\xdc\x7d\xde\xef\x80\x42\x09\x9c\x0a\x2b\x8d\x3c\xf2\x7d\xf4\x18\x49\x3a\xb7\x26\x3b\xba\x8d\x05\x38\x65\xec\x6a\xeb\x7d\xc3\xcb\x0b\x5c\x19\xc1\x8d\x9e\xe4\x2a\x2e\x2f\x04\x92\x74\x8e\x58\xa6\x39\x9d\x62\xca\x3a\xe8\x68\xe9\x95\xd9\xae\xd0\x82\x53\x34\x77\x5b\x0f\x78\x16\x76\xf4\xc9\xf1\xeb\x69\xee\x4b\x3b\xa7\xa9\x5c\x28\x88\x77\x35\xe7\x67\xf9\xe4\xbc\x3b\x38\x17\x1e\x69\x72\xe3\xc2\xd6\x43\x69\x9f\x2f\x89\xd9\xee\xd6\x43\xfe\x42\x99\x62\x05\x8e\x4a\x0b\x45\x98\xd3\x33\x8e\xb1\x04\xa3\xe2\xef\xdf\xbf\x8f\x82\x3b\xe1\x37\xb0\x13\x66\x83\x3b\x41\xf1\xfd\xbb\xfb\xbf\x7f\xff\x1e\xc1\xbd\x7f\x77\xff\x4b\xf3\xe3\xd8\x9d\x70\xe8\x06\x75\x55\x7f\xfe\x16\xf9\x39\xf1\x2a\x48\x54\x85\x2c\x27\x98\x56\xd4\x11\x09\x82\xc4\x0d\xaf\x63\x19\x60\x08\x02\x42\xa2\x9e\x9f\x5e\x72\xd9\x73\x8f\x45\x8b\x4d\x02\xba\x66\x69\xb3\x1c\x22\xff\x15\xcd\x39\x9e\x31\x9a\x96\x04\xc6\x8b\x24\x1c\x25\x7d\x36\xe5\x5f\x06\x2c\xae\xa1\x70\xcb\x42\x91\xc8\xc8\x10\x98\xf2\xad\x64\x53\x97\x84\xab\xae\x82\x08\x6d\xfb\x20\x78\x48\xf4\xc0\x2f\x1b\xca\xce\x80\x7d\xe6\x83\x0a\xd2\x6a\x88\xee\x0c\x49\x0b\xf0\xb7\x75\x4b\xa3\x59\xf0\x71\x39\x69\xab\xfc\x23\x59\x17\x34\x14\xee\x03\xab\x0d\x51\xce\x9c\xe4\x7c\x37\x5a\xd5\xba\x2b\x35\x43\x35\x1d\x50\x03\xcb\x2c\x59\xb8\x25\x0f\x6d\x00\x3d\xed\x11\x71\xcf\x30\x81\x0b\xe5\x00\x06\xe9\xd8\xb2\xd0\x46\x13\x18\xcb\x7d\xd5\x8e\x25\x2b\x07\xff\x5c\xf3\xfe\x81\xc4\x79\x1a\x93\x6a\x06\x47\x7c\x76\x7a\x03\x35\xad\x9a\x7a\xf6\x54\x4f\x11\xf5\xd6\xf3\xce\x32\x19\x65\xac\x78\x5b\xde\x59\x6f\x55\xfb\x1b\x8e\x1d\x6b\xdf\xb6\x45\xa7\xe7\x9e\xca\xe5\xe0\x50\xdc\x68\x74\x92\xdd\xc7\x55\x28\x01\xd5\xf9\x7c\xbb\x09\xbd\x76\x9a\x2f\xb3\xfe\x93\x22\x67\x6d\x0d\xa2\xc5\x44\x77\x79\x83\xac\x66\x46\x28\xfc\x1a\x05\x0c\x4d\x92\x76\xf2\xa5\x53\x5f\xc4\x37\x7a\xa5\x85\xd0\xa5\x2e\xbe\x74\x4f\x13\x5f\x96\x85\x96\x39\xd4\xc4\x0b\x2a\xff\x53\xe5\xf3\xf4\xf6\x38\x9d\x1b\x84\x82\xf2\x8a\x4b\x04\x17\x34\x77\xdd\xca\x01\x7f\xc8\xff\x1a\x41\xe1\xd5\x08\xd1\x64\x64\x37\x03\x45\xd0\xac\x31\xca\xaf\xca\x81\x91\xdc\xa9\x2d\xa7\xb0\xaa\x71\xe4\x36\x3e\x5f\x5a\x59\xd9\x38\x2d\xb0\xa6\x03\x19\x5b\xb2\x66\xb3\x12\x11\x42\xbe\xe4\xbb\xa2\x0d\xa6\xa5\x11\xfe\xe1\x59\x57\x20\x30\xf9\x87\x03\xcf\x0c\x3a\xa7\x06\x40\x2f\x6e\x28\xd8\x84\xdc\x27\xc9\x9a\x9a\x04\xa4\xfd\x5b\xf7\xcc\x38\x5a\x60\xd0\x40\xc4\x12\x57\xfc\x8d\xd8\xde\x12\xb1\x1d\xa1\xb7\x2d\xee\x3e\xed\x49\x07\xd2\x58\x10\xed\xbc\x97\x2b\x98\xd5\x2f\x9a\x53\x2c\x4d\x31\x47\x2a\xa9\x00\x9a\x63\x51\x9a\x62\xac\x8f\xc5\xfe\x0d\x4d\x65\x1f\x81\x82\x76\x24\x2f\x79\x4a\xcf\xda\x4b\xa1\x4e\xf8\x64\x14\xbf\xc4\x1d\x68\x8d\x0e\x42\x62\x61\x22\x2d\x04\x02\x52\xc5\x4d\x12\x8d\x11\xf8\x63\x04\x81\x01\xb7\x23\xe8\xe1\xfe\x9e\x8e\x73\x7e\x6b\x2a\x2c\xdb\x9d\x63\xbb\x0e\xab\x08\x6e\x91\xbb\x95\xf6\x64\x50\x91\x5e\xa9\xae\x6b\xf2\x6b\x60\x57\xea\x61\x5f\x3a\x85\x6e\x9a\x29\x3a\x04\x89\xbb\x77\x7a\x8a\x27\xc7\x74\xb5\x3b\xfc\x69\x27\x68\xdc\x36\xed\xde\xed\x49\x60\xc5\x95\x07\xe5\xe7\x64\xd6\x09\xe2\x8a\x4a\xdf\x1f\x67\x4d\xf3\xd0\xeb\xad\x53\x7e\xc7\xf8\x98\xe1\xf8\xcc\xf7\x89\x65\x27\x6b\xd2\x51\x02\xb3\xc2\xc6\xf0\x34\xa4\x44\x53\x64\x6f\xda\x39\x3a\x71\xab\x3c\x30\x74\x68\x41\xac\x1e\x26\xb2\xa8\xba\x73\x05\x2c\x8c\x9c\xb6\x16\xa7\xb4\xfe\xa0\xba\x6d\x94\x3d\x7d\xf0\x4a\xb2\xa3\xee\xa0\x46\xbd\xe9\x8e\x00\xaf\xcd\xc9\x0d\x89\xd0\x9c\x40\x84\x13\x8c\x37\xb9\x35\xad\x1c\xa0\x39\x77\x48\x8f\x55\xd2\xff\x72\x7f\x7d\xbb\x2f\x6d\x58\x36\x15\xa9\x34\xa7\x50\xba\x79\x2a\xd3\x3c\x54\x5d\xa2\x75\x6d\x95\xe5\xa1\x64\xdd\xa3\x14\xf7\xf1\xb9\x2b\xd1\xf4\xe0\x24\x99\x50\x29\xf5\x6f\x28\x5a\xa7\x39\x25\x28\x22\x7f\x69\x4c\x89\x66\xb6\xc9\xdc\xce\x55\x5d\x5e\x90\x53\x69\x8e\x58\x86\x39\x9d\xc2\xde\x0e\x8f\xba\xc2\x38\x8f\x23\x54\xeb\x54\x1a\x92\xec\x6f\xc5\x0a\x47\xb0\x8d\xdc\x08\xde\x55\xb0\xa4\xe2\xb4\x66\xec\x20\xd7\xd6\xea\x42\xa1\x81\xfb\x84\xc2\xee\x42\xfc\xa4\x89\x94\xdc\x97\xe9\xec\xf9\x1e\x54\x77\xf5\x2f\x9f\xee\x6e\xdf\x7d\xbe\xbb\xbe\x7d\x7c\xf8\xfe\xbd\xc1\x77\xe8\xc0\xbe\x33\xf8\x4e\xa8\xe6\x9d\xd0\xc3\xf0\xb7\x7d\x67\x4c\x73\x6d\xdf\xe5\x7f\x5f\xca\x83\x8a\x37\xdb\x11\xdd\x62\x04\x6f\xf7\x3a\xe3\x62\xe2\xfd\x3b\x93\xe9\x8a\x77\xc6\x1a\x01\x8d\xa6\x63\xd6\xc8\x6f\x3e\x4f\x27\xb9\x84\xbc\x18\x39\x9f\x65\xbf\x78\xe6\x5a\x7e\xbe\x15\x43\xd4\xf0\xb8\x15\x5e\x45\x0a\x9c\x5b\x47\xf0\x7e\xc4\x5e\x3f\x18\x71\xf8\xce\x1f\xa6\xf6\x47\x9c\x38\xda\xea\xd0\x4a\x22\x0b\x96\xaa\x61\xba\x52\x04\x0a\x9a\x1a\x2e\x4f\xe0\xc2\xf8\xe4\x5e\xb3\x9a\x83\x5b\xc7\xfc\x72\xf7\x59\x8b\xec\x08\xab\xc8\xcb\x1a\x5f\xdc\xa9\xb1\xfc\x4f\xed\xbf\x69\x1d\x65\x25\xd8\x95\xdf\xb3\x9d\x92\x5d\x7b\x1e\x6b\x4c\xbc\x1e\x86\x1b\xec\x8d\x65\xc1\x34\x94\x68\x56\x93\x40\x60\x64\xfe\xe2\xc0\xee\x82\x80\x3c\x8b\x77\x0e\xfa\xe7\xc0\xee\xe8\xd2\x3f\x65\xdc\xc1\xe9\x58\x8c\x1b\xe6\x61\x14\xff\x97\x57\x9a\x65\xd6\x51\xa2\x6b\xa8\x00\x0c\x6d\x2d\x46\x31\x45\xd8\x89\x97\xeb\x90\x6e\xf7\xf2\xa9\x63\x67\xfb\x0d\x5a\xb2\x06\x72\xf6\xdf\xee\xee\xeb\x8f\x87\xd2\xb2\x38\xab\x30\x56\x98\x58\xda\xcf\xd7\xc6\xba\x6f\x8d\xb6\x2b\x03\xbe\x42\x02\x19\x15\xd3\x3e\xf1\x92\xa4\x6a\x4e\x0e\x7c\x9a\x61\x82\x20\x56\x98\x40\x1b\xf2\xcc\x79\x9f\xb7\xbe\x24\x49\x00\x1f\x44\x13\x89\xa6\xb9\xe6\x39\x13\xbf\x2c\x0f\x2e\xb1\x08\x14\x5c\xe9\xc0\x2f\x75\xb6\x42\x81\x43\x39\x6d\x08\xaa\x78\xd0\x62\x02\xd6\xe2\xd3\xb3\xf6\x10\xc2\xbc\x49\x88\xb0\xa3\xc0\xa4\x3d\x78\xae\x9e\x62\x73\xed\x5a\x61\xf3\xe1\xc3\xa8\xe5\x9a\x20\xa1\x72\x10\x1d\x33\x75\x3b\x1b\x35\x5f\x72\xd1\x2a\xb4\xf3\x24\xd9\x33\x76\x8d\x98\x92\x44\xba\x3e\x34\xd7\xfc\x19\x38\x65\xc1\x84\xb9\x07\x4b\x52\xa6\x55\xf9\x9a\x1f\x67\x83\x16\x0f\x35\x19\x29\x55\xda\x64\x36\x18\xa3\x3e\x29\x27\x86\xb5\x71\x4f\xf8\x19\x4a\xde\xce\x20\x87\x02\x61\x93\x6c\x1e\x89\x8b\x74\x40\x7e\xed\xc1\xd8\x65\x8e\x08\xcc\xf6\x73\x19\xbc\x07\x19\x55\x25\xa3\xca\xcb\x82\x2c\x8f\x61\x92\x42\x9a\xc5\x65\x20\x28\x2f\xc6\xb5\x5d\x15\x93\x86\x88\xb3\x1d\xed\x75\xe0\xb1\xe9\x4f\xb5\xdd\x5b\x08\x36\x13\x8f\x9f\x6d\x8f\x54\x4b\x8e\x97\x37\x3a\xe5\x2c\xf4\x46\x26\xd8\x21\x37\xce\x4b\xeb\x5a\x67\x6d\x89\x80\x8b\xc0\x9d\x8c\xe6\xf2\x26\x48\x0f\x1b\xe2\xc1\x7c\x77\x96\xb1\x66\xf2\xb5\x91\x0c\x9c\x18\x6f\x63\x63\x31\xeb\xc2\x5e\x58\x5a\x90\xa0\x35\x33\x95\x89\xe3\xcd\xa6\x12\x7a\x2e\x5e\x40\xff\x0c\xeb\xa5\x4e\xa4\x8e\xf2\x84\x2e\x98\x3d\x38\x08\x61\xe7\xea\xff\x8d\x9d\xfc\x73\xb1\x93\x6a\xd7\x48\x69\x2b\x67\x28\xfb\x37\xb7\xa5\x86\xc2\x6b\x40\x39\x03\xd1\x60\x8c\x06\x4c\x4c\x15\x3b\x52\xd1\xda\x20\xf1\xb4\x2b\x0d\x46\xa2\x70\x91\x79\x50\xd4\x40\x98\x7f\x8b\x04\x33\x88\xcd\xd6\x86\x4b\x77\xe0\x65\xa2\xac\x84\x52\xdb\xce\x03\xaf\xa3\xdf\xcb\x1b\xdd\x24\xfe\x3e\x8e\xd9\x5d\x08\x17\xab\xb6\xb8\x98\x06\xd7\xd0\xc6\x51\x6c\xf0\xd7\x03\x8b\x8f\x85\xf0\xab\x58\x51\x01\xd6\xab\x7c\x6d\x68\xc0\x93\xb2\x90\xcc\xca\x83\x8d\x25\x1a\xb0\x92\xf7\xcc\xc5\x19\x15\x3c\x5c\xf9\xda\xf0\xe3\xa6\x98\x29\xbc\x83\x25\x35\x98\x54\xb7\x4e\x60\xa3\x54\x3f\xdb\x6e\x1e\x73\x00\x69\xf6\xb0\x29\x1a\x1c\x69\x0b\x6e\xb7\xd4\x79\xb2\x37\xf0\x71\x79\xd1\x4c\x21\x27\x98\x16\x02\x0a\x44\x5a\x45\x08\x51\x1c\x6f\x5a\x6a\x56\x5e\x1c\xe8\xdb\x6b\x7b\xb7\x09\xf0\x24\x6c\xae\xb9\x50\x91\xde\xbd\xe4\xa9\x8c\x10\xfd\x3a\x00\xba\xa5\xb8\xa4\x70\xf7\x02\x5f\xb9\x8c\x07\xa1\x5a\xfe\xc3\x08\xeb\xe0\xda\x11\x81\xa8\xda\x5d\xa4\xf2\x90\xdc\x8e\x66\x10\x24\xab\x21\xa9\xad\x46\x6b\x0f\x85\x9b\xbb\x26\x06\x20\x59\x95\xaf\xcd\x8a\x91\x03\xce\x88\x2b\x3b\x93\x54\xac\x72\x29\x1a\x37\x72\x66\x1d\x51\x46\x21\x97\xd8\x61\xd3\xda\x28\x93\x33\xb7\x72\xb6\x3a\x8a\x33\x43\x05\xc1\x4b\xa1\xf3\x04\xc6\x48\xb9\x72\x62\x49\x5d\xa2\x32\x39\xbd\x74\xd5\x56\x27\x14\x41\x0c\x1a\xa2\xe0\x4a\xa0\x69\xae\x8d\xfa\x02\xb2\x55\xe7\xe4\x7b\x25\xb3\xe0\x28\x2c\xce\x49\xee\xac\xcc\x82\x63\x93\x47\xab\x58\x07\xf0\x36\xa7\xe9\xdb\x55\x92\x49\x92\x90\x7d\x36\x8e\x89\xc8\xa0\x4b\x46\xb9\x6a\xbb\xd1\x06\x28\xc8\x8e\xba\x32\xb2\xe5\x6e\x7d\x2a\x72\x3d\xf7\x9a\x02\x60\x98\x6d\x0f\x1b\x05\x01\xb9\x8f\xd5\x68\xa4\x85\x1a\x64\x8d\x4a\x8b\x86\x33\xa4\x7a\x54\x79\x82\x9f\xf7\xd7\xe4\x14\xcf\x0b\xf0\xca\x9c\x83\x98\x9c\xcf\x65\x1a\xb2\xe0\x4e\x55\x58\xcf\xf0\x66\x1a\xcb\x8e\xe0\xe2\xba\x98\x1b\xac\x58\x92\x52\xbe\x3b\xd9\xd7\x39\xf4\x77\xc5\x8b\xe2\x3c\xba\xd8\xbd\x72\x1b\x72\xfb\x8d\x55\xfd\x3a\x58\x55\xcd\x32\x95\xa9\x46\x69\xbf\x35\x81\xf1\x9a\x9b\x2f\x20\x02\xa1\xb9\x36\x12\xb6\x98\x14\x04\xf5\xd6\x34\xd7\xb6\x75\x85\x07\xb7\xcb\x83\x8e\x85\xb8\xe8\x4f\xd1\x57\x8e\x0d\xec\x7b\x39\x4b\xcf\x3e\xcf\xb9\x81\xa5\xe7\x87\xfa\xfa\xe3\x81\x03\xd5\xbc\x70\x4d\xe8\x59\x6a\x93\x8a\xcc\xea\xdc\x20\x12\xc8\x95\x7c\x73\x63\x37\x13\x95\x22\x48\xbe\xc6\xcd\x6b\x94\x53\xc8\x92\xef\x95\xd6\x56\x70\x79\xa3\xad\x6a\x5d\x3a\x9a\xf4\x94\xbd\xc4\x7e\xa2\x5d\x4e\x85\x0d\x62\x72\x2c\x85\xe9\x99\xf9\x8c\xe6\x3d\xa9\x74\xc3\x70\x89\x35\xaf\xee\x63\x3a\xc5\xea\x5b\xaf\x53\x6d\x05\x4f\x74\x8a\xc4\x31\x29\x4e\xe6\x60\x20\x1b\x9e\x7b\xb2\x57\x25\x15\xe0\xf1\x88\x6e\x51\x04\x93\xfa\x36\xfa\x5c\xc1\x13\xbd\x62\xb1\xd0\x83\x3b\x05\x29\xe5\xd0\xde\x9b\x54\x02\x4a\x5b\xe4\x96\xc0\x54\x46\x40\x78\xf9\x52\x74\xca\x31\xe2\x8e\xe9\x71\x60\xcd\x6c\xfc\x76\x2e\x78\x0a\xa9\x3d\x07\x94\xb9\xed\x71\x46\xb0\xe1\xe8\x56\xf2\x86\xb6\xfd\xb2\xf6\xfb\xac\xed\xa7\xc9\xf3\x94\x78\x9d\x85\xad\x46\xae\x03\xb3\xf8\xa3\x47\x32\x42\x4c\xcf\x6b\xe4\x76\x3c\x5d\x7d\xfd\xf9\xc7\xbb\xea\xfe\x80\xbd\x59\xcc\x7a\x62\xf3\x0f\x2b\x2a\x0d\xcd\x43\x19\xe6\xa9\x74\xf3\x30\xcb\x0e\xe1\x7c\xc9\x6d\x71\xca\x83\x4f\xa5\x21\x30\xc8\x0f\xf9\x59\xd7\xa5\x80\xca\xd8\xb9\x14\x37\x7a\x96\x43\x83\x0c\x96\x5e\xac\xd3\x83\x67\x4d\xf5\x93\x25\x7e\xe7\xfd\x85\xb7\x4d\x30\x56\xf5\x8c\x12\x24\xe8\xcc\x6e\xce\x1b\x71\xff\x04\x22\x48\xe7\xe6\xcc\x25\xb7\x3f\xc2\x42\x0a\x2b\x91\x25\x9a\xcb\x0b\x92\xb3\x2a\x2a\xa5\x02\x30\x06\x8c\xd9\x6c\xc9\xc6\xa8\x30\x47\xdf\x73\xe8\x42\xae\xa4\x0c\x2b\xae\xb9\x1a\xbc\x9e\xff\x78\xa6\xc3\x5e\x7b\xfe\x8c\x4d\x8a\xda\xcd\xe1\x33\xff\x3c\xcb\x93\xe4\xe9\x4a\xe2\x73\x2b\xb1\x4f\x57\x42\xf4\xdc\x4a\xdc\x11\x95\xf8\xe7\x56\xe2\xa7\x9e\x93\xe3\x8c\xaf\x13\xcf\xd1\x71\x96\xa5\x89\xe7\xec\x38\xd7\x82\x89\xe7\xf0\xb8\x03\xff\x43\xac\xc5\xb0\x38\x7d\x0e\x07\x38\x7c\x4e\x3a\x84\x29\xe0\xbb\x2b\x0d\x67\xf1\x28\x0b\x96\x66\x03\xf7\x0a\xd5\x34\xfa\x0c\xbb\xa2\x3b\x66\x4c\x4c\x21\xe8\x3c\x5b\x9d\x93\xee\xbd\xec\x5e\x82\x86\xe5\x8e\xf1\xf8\x35\x0d\x3a\xa3\xbf\xfe\x40\x7f\x0f\x29\x0d\x27\x57\x14\x76\x6a\x0e\x87\x08\xaf\xdd\xa1\x09\x30\x54\x16\xac\x53\xb6\xc3\x4c\xd6\x16\x10\xb5\x99\x59\xb0\x5e\xd9\x8d\x41\x02\xad\x7a\xe5\x1d\xfc\x46\x63\x54\xa6\x1a\xf8\xce\xae\x0c\x58\x5b\x7a\x90\x5c\xdf\x86\x75\x40\xd3\x86\x55\x5b\xf0\xa6\xd9\x1f\xad\xed\x7f\xa5\x70\x4d\xf3\x9c\x67\x51\x4e\xfc\xa3\x38\x70\x79\x71\x51\x29\xb2\xef\x81\x78\xc5\x76\x7f\x61\x1c\xfc\x65\xf7\x79\x06\x9c\xe8\x24\xde\x90\xd2\x6c\x14\xe7\x24\xa2\x84\x57\x58\xe4\x36\x96\xf1\xf4\x1e\x13\x60\xaa\x46\x1e\x12\x4f\xf0\x03\xfb\x95\xe7\xfd\xf0\x6a\x9b\x76\x9e\x8e\x31\xd6\x3d\x67\x8d\x9e\xe5\xc3\x31\x76\xf2\xff\xd3\xf5\xfd\xd5\xcf\x55\x5d\xef\xc7\xf0\x24\xe5\xe7\x83\xfc\xf1\x2a\x96\xc3\xe8\x06\x45\x73\x43\x23\x8f\xf4\xd8\x4f\x59\x4a\xca\x5f\x5e\x58\x15\xe7\x86\xd6\x0e\x8a\x38\x27\x03\x71\xad\xed\x9c\x68\x6d\xe7\x68\xf9\x27\xf2\x4f\x7b\x79\x53\xa8\xc0\xaf\x79\x79\x2d\x42\x22\xb1\x06\x84\x39\x85\xb5\x85\x28\x31\x22\xdd\x3d\x6c\xee\x45\x48\xcd\x9d\xe6\x86\xcd\x00\xcb\x8a\x62\x49\x56\xbe\x26\xa0\x92\xa7\xd6\xe6\x1b\x2b\x8d\xe0\xf9\x86\x2d\xc9\x48\xb3\xa6\x92\xdc\xc5\x71\x2a\x23\xc1\x49\x6f\xfd\x73\xba\x21\x4e\x4c\x05\xb8\x58\x19\x70\x51\x99\x6c\xdc\xca\x36\x51\x31\xaf\x25\x1a\x0c\x5f\x19\xf9\x75\xb4\x35\x02\x3a\x4d\x67\xcc\x1b\x3a\x30\x71\xb2\xd1\x3b\xd6\xc5\xfa\xa0\x26\xf4\xfa\x5e\x6b\xcf\x71\xca\x1e\xb8\xae\x1d\x25\x72\x8c\x6d\x92\xd6\x69\xb0\x24\x6b\xa4\x94\x14\xd3\x23\x57\x53\xf0\x46\x73\x43\xb7\x57\x0f\x4f\x3f\x41\x88\x5b\x31\xad\x40\xf1\x3c\x6a\x60\x09\x6d\x36\x3a\xaf\xde\xb0\x4b\xab\xd0\xbd\xa5\xc5\x7a\xae\xea\x31\xa9\x5c\xb4\x97\xef\x1e\xb0\x34\x4e\xc3\x61\x79\x89\x44\x09\x1c\xb4\x2b\xba\xbc\xc1\x42\x15\x73\x6a\xff\x8a\xda\xf3\xf8\x15\xf3\x50\xa2\x9f\xa7\xb5\x5d\xc5\x12\xfd\x8a\xfa\x3f\x0c\xef\x6a\x3c\xcc\x48\xab\x58\xc6\xe6\x61\xf3\xef\x24\xb2\xc8\x86\x39\xee\x83\xc9\x94\x14\x3a\x76\xd8\x06\x0b\x2e\xcc\x46\xc9\xa9\x36\x30\xe2\xc8\x72\xdb\x39\x23\xd8\xf0\xba\x09\x86\xed\x7c\x77\xdd\x37\xcd\xf9\xce\x74\xd8\x3d\xd4\x27\xc9\xbb\x64\x13\xcf\x2e\x82\x43\x16\xc5\x8c\x92\x4b\x23\x95\x36\x2f\x4c\x28\x51\x0d\x4c\xfa\x06\x88\xca\x31\x7d\xf1\xbf\xaf\xc0\x36\x9b\xea\x5f\x90\xe2\x9e\x3e\x81\x7d\x41\x81\x73\xb7\x6b\xcd\x56\x54\xe9\xf5\xc3\x56\x4c\x69\x67\x10\x71\x62\x10\xd9\x58\x7e\xd2\x59\x26\xad\x5d\x2c\x68\x54\x05\xd2\x33\xeb\x38\x68\xca\x6c\xea\xf0\xcf\xac\xe3\xa0\x25\x33\xd7\x41\xc5\x33\xeb\x38\x68\xc8\x6c\xea\xb0\xcf\xac\xe3\x08\x3b\x66\x7c\x66\xf8\xe0\x31\x56\x4c\x7a\x66\x1d\xe1\x88\x3a\xfc\x33\xeb\x88\x47\x98\x0b\x8b\x67\xd6\x91\x8e\xa8\xe3\xb9\xe1\x9c\x58\x3c\x11\x9b\x4f\xf3\xbe\xfc\xe2\x95\x2d\x87\x5c\x74\x57\x08\xbd\x1d\x86\xd0\x37\x0e\xce\xf3\x58\xda\x39\x9d\x92\xee\x1f\xa7\x66\x10\xcf\x36\x79\x9f\xc1\x30\x9e\x6d\xf1\x3e\x83\x81\x3c\xdb\xe0\x7d\x06\x43\x39\xd7\xde\xfd\x0c\x06\x73\xae\x39\xf9\x39\x0c\xe7\x5c\x93\xee\x73\x18\xd0\x51\xd6\xdd\x89\x19\xd2\xa1\x3a\xe3\x09\x75\x4e\x15\xa3\x9a\x8e\x11\x1c\xd1\xa9\xb8\xa6\x55\x04\xef\xb7\xd3\x00\xc6\xa4\xf7\x05\x50\x1c\xe4\x0b\xc5\x51\x87\x35\xb1\x11\x59\x0d\x65\x3e\xd7\xaa\xf7\x03\xc9\x12\x22\xcb\xa9\xa7\x33\xd4\xdd\x76\xe1\xa6\xca\x73\xfa\xf4\x6a\x4a\x36\x9e\xac\x65\x4f\xb5\xe7\x5c\xa0\x51\x24\xb1\x7b\x59\x5c\x6f\x4d\xc4\x45\xef\x0f\x96\xd2\x37\x7f\x50\xef\x8f\xb8\xca\xe1\xdc\x5c\x82\x93\x68\x86\xd6\x92\xec\x9a\xe0\xee\xf6\x2f\xf4\x83\xbf\xa8\xff\x57\x9c\xe8\x68\x60\x73\x04\xe0\xca\xb8\x0a\x0d\x69\x49\x0a\xb6\xce\x70\x1f\x93\xf6\x93\x91\x56\x53\xdf\x57\x1d\xc4\x6f\xd6\x54\xff\xaf\x57\x1f\xef\x0e\xa0\xff\x2a\x2b\x29\xb6\xb7\x20\x58\xa8\x16\x60\x6e\x07\x36\xad\x34\x9a\x19\xa2\xc2\x0e\xe5\xa6\x80\x22\x88\x62\xba\x01\xbe\x11\xbf\x68\x8c\x55\x52\xad\x1a\xec\x74\x54\x09\x8a\xe6\x92\xa7\x32\x01\x1a\x9d\x56\x68\x6a\xed\xc0\x59\x2e\x3e\x8e\x92\x3c\x17\x75\xd4\x01\xd2\x29\x58\xcf\xdb\xa0\xbf\xff\x76\x7b\xa8\xd3\x85\xa4\x4b\x41\x40\xcb\x5d\x93\x8e\x6a\xee\x68\x3f\x9b\x34\xc9\xc0\x2c\x24\xb8\x07\x8d\xc4\x1b\x15\x3b\x00\xc6\x69\x11\x1a\x3f\x54\xb4\x2b\x34\xd5\xae\x0e\xab\xa4\x7a\xa3\xa2\x06\x1d\x76\x12\xe3\x4b\x55\x6f\x78\xb5\x83\xc2\x6b\x6e\xe4\xf3\x80\x8f\x7f\x58\xde\xdf\x1d\x3a\xa1\xb1\x19\xc8\xb4\xf4\xe0\x62\x65\x25\x88\x6b\x73\xba\xe6\xf8\xbf\x95\x46\x3f\x1b\x3c\x51\x12\xc3\x16\xd7\x64\x2a\x02\xa7\x08\xda\x70\x3c\xa7\x8a\x92\xfc\x3c\x00\x26\x59\x5a\x6b\x07\x6e\xf4\xa9\x17\xe8\xe4\x39\xb9\xad\xfa\x54\x53\x1f\x2f\x7f\x34\x2b\x4d\x25\x25\x70\xb6\x57\x45\x36\x71\xcb\x5f\x73\x2c\x80\xe4\x40\x30\x28\xdb\x1a\xc0\x0b\xf1\x1b\x26\x70\x6b\x3d\x68\x1a\x37\xce\xa9\x62\x6d\xc1\xd9\xcb\x1b\xe9\x57\x98\x0d\x1f\x1b\x92\x2e\x95\x09\x90\xe6\x18\xdb\xe1\xb0\x51\xd9\x36\x6c\x4a\x90\x45\xb9\xf4\xc9\xfc\xb4\x04\xf8\x1b\x1d\xd8\x17\xe9\xe9\x8a\xc0\x4b\x02\x45\xaf\xe4\x32\xb0\x7c\xd6\x60\x2d\xf7\xe7\xa9\xbe\xb2\xd0\xd0\x9d\x08\x09\x5f\x7e\x55\x4a\x70\x7b\x5d\x72\x7f\x3b\x1d\x3a\xe6\x74\x68\x60\x91\x44\x48\xa4\x81\xfc\x1a\x3d\x98\xa9\x89\x2d\x32\x01\x8f\x61\x4d\x8c\x50\xcd\x61\x0a\x5b\x39\x70\x34\x0e\xdb\x50\x10\xfd\x57\x20\xb8\xb5\xc6\x7d\xd8\xe7\xdf\xe8\xf1\xd0\x33\xd8\xfb\x9b\xe5\xe0\x53\x08\xaf\x5f\x93\xf5\x5a\x70\xa8\x03\xc4\xfd\xe4\x3d\x31\xcb\xfc\xed\x48\xe9\x2d\xb2\xca\xff\x9f\xbd\xbf\x6f\x6e\x24\x39\xee\xc4\xf1\xb7\xb2\xc7\x3f\x2e\xac\x88\xaa\x74\x67\xd6\xf3\x5e\xec\x1f\x10\x6d\x19\x8e\xc3\x58\x0a\xef\x1a\x8a\xe0\xdd\x2f\x2e\x7a\x40\xcc\x80\x3f\x35\x09\x1e\xc8\xc1\x68\x74\x71\xef\xfd\x1b\x99\xd5\xdd\xa8\xee\x06\x1f\x40\x62\xa5\x95\x6f\x2d\x6f\x0f\x51\x5d\x5d\x8f\x59\x59\x99\x55\x99\x9f\x1c\x84\x42\xd3\x5c\x61\xfa\x39\x28\xe2\x18\x4f\xfb\xfb\xd1\x5b\x7e\x77\xd3\xac\x7f\x5c\x3f\x3e\xde\xdc\x7d\x7e\x78\x5a\x88\x15\x98\x78\xf1\x11\xad\x51\x10\x25\xa1\xf3\x21\xd6\x10\x24\xdc\x34\x35\x1a\xc1\x47\x0d\x6e\x95\x63\x54\x93\xcd\x71\xaa\x6d\xd4\x40\x89\xb3\x35\x10\x22\x0b\xf3\x76\x5a\x86\x80\xce\x9b\xd0\x88\xac\x2f\xca\xd1\x24\x8f\x80\x24\x83\x54\x63\x1d\x04\x5f\x07\x88\xbc\xa3\x45\x5b\x6c\x77\x60\xa8\x91\x2a\x91\xa7\x0b\x05\x75\x80\x1f\x5d\x11\x88\x1a\x42\x90\xe0\xa4\x93\xe2\x11\x21\xca\xd7\x41\x61\x26\xa0\xc0\x04\x14\x0e\x1d\x0d\x52\xbc\x34\xb1\x05\x57\x1e\xb7\xd0\x77\x0d\x64\xcd\xe5\x58\x37\x15\x82\x89\x0b\x0c\xcc\x1d\x09\xeb\x00\xde\x4a\x68\xa8\x2e\x87\x41\x08\xb6\x91\xe6\x83\x0d\x93\x1e\x64\xe7\x47\xc4\x3d\x8d\x5f\xa9\xf6\x55\x83\xe0\x12\x7f\x3a\xbc\xbb\xad\x94\x14\xcd\xfd\x63\x06\x21\xe8\x9e\xc3\xd6\xa9\xb6\x75\xa1\x91\x90\x54\x47\xda\x2f\x6f\x81\xb8\x0a\x9e\xd4\x10\x57\x40\x86\x87\xcd\x06\x20\x08\x04\x94\x16\x44\xca\xe4\x38\xef\x93\x6f\x51\x9c\x18\x27\x23\xaf\xf2\xac\x44\x6a\x32\xd0\x82\xe3\x62\xad\x86\x8a\x07\x80\x49\x08\x78\xda\x13\xf7\x4b\xa0\x7e\xa7\x6d\xf2\x4c\x16\x1d\xe1\x1c\xeb\x16\xcf\x4c\xe4\x9e\x27\x99\x9b\xff\x0d\xc8\x94\x62\x85\x2c\x7d\x5a\x18\x23\xee\x4e\xc7\x46\x54\xc8\xe2\xea\x96\x49\x5b\x21\x78\x93\xc3\xc4\x79\xd2\x80\x04\x96\x6a\xaf\x7a\xf6\x22\x9f\xa6\x86\x27\x59\x50\x27\x72\x88\x75\x94\x18\x44\xa8\x65\xe4\x6a\xcf\x63\xec\x7b\x38\x06\x8d\x40\x60\xf9\x1b\x4b\x02\x43\xe1\x8d\x12\x3c\x39\x5e\x69\x3c\x55\x52\x61\xc5\x8b\x48\x6a\xe4\xef\x05\x18\xfb\x10\x49\x80\x50\xe7\x12\x64\x71\x30\x5b\xb5\x1d\xbc\xac\xfc\xd0\x40\xa4\xc1\xc4\x59\xdf\x52\x01\x8e\x08\x8a\xfc\x02\xa3\xa0\x6c\x18\x85\x5e\x91\x5b\x92\xe1\xc1\xe0\x44\x03\x55\x6c\x24\xc0\xbc\xc5\xda\x71\x91\xee\xe0\x97\x0d\x8e\x47\x85\xcc\x02\xa3\xb8\xb2\x36\x5a\xc2\xf9\x3a\x61\xb1\x56\xa1\xb8\x87\x2b\x30\x02\x90\x31\x6e\x31\xef\x43\x5e\x83\xe3\xc9\x46\x19\x44\xee\xe2\x46\xe6\x07\x3c\x29\x52\x60\x99\x99\xcc\x46\x23\xa5\x28\x00\xef\xef\x0d\x98\x8c\x69\xc1\xdc\x1c\xb3\x31\xac\x54\x99\x47\xbd\x96\xc8\x6a\x45\x78\x35\x99\x15\xc2\x26\x4f\x57\xf6\x0e\xf5\x27\x9f\x79\x3c\x17\xdf\x23\x87\xb8\xee\x5c\xf6\x50\xb6\x85\x2a\x2a\x3b\xb3\xbc\x01\xdb\xec\x66\x2a\xdb\xee\x21\xf3\xd5\x2d\xef\x2b\xd6\xd7\x24\x61\x7a\x32\xaa\x8e\xb8\xe1\xf1\xc2\xe2\xdf\x33\x12\xdf\xef\x22\x90\x67\xfe\xda\x9f\x76\x5a\xf1\x2c\x06\x37\x0a\xf4\x91\xc1\xb9\x5f\xba\x39\xf9\x7d\x68\x1d\xc3\x94\x81\x03\x80\x2e\xf3\x8c\xa5\x1b\xe1\x47\x97\x40\xc5\x56\xb9\xa5\x19\x87\xa4\x42\x9e\x71\xe6\x62\x4c\x1a\x55\x9c\x31\x97\x50\xf2\x68\xa9\xa0\xad\xfa\x24\x07\xc3\xbf\x97\x89\x38\x83\xe2\xfc\xeb\x7e\xfb\xeb\x7e\xfb\xeb\x7e\xfb\xeb\x7e\xfb\x9f\x7b\xbf\x7d\x2d\x90\xf6\xab\xf7\x30\x84\x18\x16\x64\x94\xf9\xd9\x77\xa8\xd7\xa2\x67\xff\xa2\xb5\xfd\xd7\xf4\xe5\x09\xfc\xec\x5f\xf7\xae\x5f\xf7\xae\x5f\xf7\xae\x5f\xf7\xae\xff\x87\xf7\xae\xb7\xdd\x56\xfc\x52\x55\x96\xb7\x99\x2b\x3e\xb1\x0f\x33\x4d\xd4\x9e\x67\xd8\x17\xb4\xe0\xff\x0a\x9a\xe3\x5b\x6d\x20\x07\x26\x5d\x4e\x5c\xdd\x09\x02\xd6\x41\xf5\x9e\x5f\x1a\xf7\x08\x91\x5b\x34\xd0\x90\xdb\xfc\xef\x0a\x00\xf0\x33\x5f\x6a\x1d\x0f\x01\xf0\x7c\x60\x31\xe7\x8a\x93\x81\x08\x21\xd6\x24\x18\x5c\x7d\x54\x3a\x39\x1b\x70\xe1\x0d\x67\x03\x01\xd0\x0b\x23\x98\x11\x33\x3f\xea\xd0\x59\x51\x75\xf5\x9e\xc9\x99\xc9\x49\xa8\x22\x1b\x1a\xcd\xec\x92\x37\xd0\x8a\x37\xe9\xaa\xdf\x62\x05\xc3\xd8\x62\x23\x4c\xc9\xd7\xcc\x77\x7b\x84\x31\xa8\x82\x06\x6b\x17\xa6\x12\x4b\x9d\x00\x61\xf4\xde\xf2\xbe\x23\x52\x08\xf3\xb3\x59\x47\x29\x22\x71\xf9\xa4\x90\x37\x11\x8f\x9a\x46\x9f\xc9\x0e\xe4\x36\xd3\x74\x27\x21\xdd\x05\xf4\xb6\x27\x3b\xb1\x13\xb2\xe0\x51\xaa\x21\x8d\x93\x36\xb4\x4d\x10\x39\xc4\xda\x49\x17\xc0\xda\x46\x98\x5e\x59\xa6\x84\xd0\xe3\x37\x9a\x14\x8f\xcb\xf0\x23\xf2\x60\xdc\x7e\xd8\x3c\x95\x53\x9b\x9c\xff\xd0\xd5\xb6\x24\x6e\x1e\xb3\xd9\xd1\x37\x52\xfd\x02\x93\x32\xe3\xd2\x72\xbb\x59\x5c\xd7\x93\x69\xe1\x5d\x3a\x81\x0b\x4d\x1e\x8a\xe1\x87\x32\x4a\x9b\x69\x2a\x37\xbb\xc9\xc3\x7d\x68\x1d\xca\xc6\xe2\xa4\xa2\xa4\x70\xd2\x06\x9d\x1b\x61\x9d\xec\xf4\x93\xc6\x6b\x19\x22\xa1\x8d\x38\x69\x64\xa6\x1d\x93\x9a\x4c\x5a\xe3\xc1\xe2\xf9\xe4\x4d\x32\x9a\xd9\xe0\x55\x41\x95\x57\xbc\x05\x04\x45\x11\x30\xcd\x04\xe4\xa3\x45\xfa\xc0\xcc\x56\xc8\x42\xf4\xaa\x7c\xd1\xf2\xf2\xf6\x9b\x53\x22\xc7\xfd\xba\x48\x7e\x5d\x24\xbf\x2e\x92\xb3\x5d\xd4\x0f\xf7\xc7\x53\x4e\x1d\xde\xb8\xf7\xbd\xea\x4a\xfe\x97\x7d\xd8\xf0\x52\x3f\xcc\x6b\x0f\x1a\xce\x76\x3f\x8e\x27\xdb\xfa\xfc\xca\x2d\x7f\xe5\x96\xff\x0f\x72\xcb\xb7\xf8\x2d\x3f\xc1\x2b\xdf\xa3\x19\xbe\x99\x77\xbe\x0c\xe0\xfb\xb2\x42\xe8\x8f\x2a\x84\x34\x9b\x68\x45\x6d\xf6\x13\x9b\x32\xd0\x05\x07\xf6\x39\x3f\x7d\xdd\xfe\xb1\xfe\x36\xdb\xed\xb6\x5f\x9f\xb6\xcf\xc9\xe8\xed\xe8\x25\xe8\xc3\xc1\xea\x5d\x82\x44\x90\x5d\x90\x83\x40\x8a\x68\x1e\x20\x9a\x51\x64\x43\x79\xb7\x20\x52\xc4\xfc\x68\x10\xf1\x95\x72\xc4\x57\x4a\xe0\x8c\xa2\x53\xa0\x24\x9f\x8f\x8b\x6c\x80\xac\x84\xad\x76\x45\x5b\xf2\xd1\x70\xc0\x85\x58\x7d\xf1\x36\xc4\x24\x49\xc3\x60\x8b\xd9\x24\xac\x31\x9c\xd9\x40\x30\x43\x87\x8a\x7c\x18\xbc\xf0\xd2\x72\x6a\x3c\x20\x2a\x2f\xdb\xd4\xc1\x9f\xe0\x50\xf7\xa9\xd7\xe8\x43\xa3\xff\xaf\x37\x8f\xab\xcd\x93\xf3\xe1\x20\xa0\x42\x3b\xa7\x4a\x10\x56\x68\xce\x09\x8b\xc4\x0d\x8b\x40\xa1\x00\xc2\x8d\xca\x43\xf4\x8b\xcc\x4e\x8c\x92\x68\x25\x68\x47\xf3\xc0\xfd\x7a\xe7\xe8\xf7\x81\x24\xcd\xd8\xfb\xd1\x9c\xdd\xc3\x9e\xe2\x79\x5c\xba\x9f\xbf\xf2\x0f\x12\x78\x3e\x48\xd4\x9e\x01\x15\xf4\x91\x8d\x09\x15\x99\x39\xba\x3d\xcd\xe5\xd7\x82\x3c\x38\xe6\x74\x61\x3c\xc0\xfc\x90\xc8\xc6\xa7\x0c\xf3\xb3\xce\xf9\x55\x76\x84\x34\xef\x1c\xe6\xe7\x9c\xf3\xfd\xb8\x8a\x77\x38\xe7\x0f\x59\xce\x76\xdb\x3c\xc3\x6b\x2a\xa6\x6c\xf4\xc3\xe0\xdc\x7b\x5f\x0f\xc3\x73\xdb\xf2\xb7\xc6\x25\xba\x92\x33\x71\x19\x57\xb7\x1a\x78\x1f\xf0\x73\xf4\x60\xc5\xae\x76\x63\xe0\x64\x67\x9c\x67\xa4\xb5\x90\x21\x33\xa3\xa2\x04\x5e\x96\x5e\xe9\x7b\x24\x90\x48\x2a\x6e\xb4\x5b\x7a\xa8\x5c\xe9\x4a\x48\xca\xce\xd1\x40\x64\x09\x97\xa9\x8c\x1f\x6d\x57\x48\x71\xe6\x65\x9c\x07\xde\xca\x0e\x63\x00\x01\xe5\x4e\x03\x32\x4c\xb3\x19\xbc\xa3\x04\x01\x5f\x03\x4d\xc2\xfb\x63\xd1\xc4\xa2\x0f\x82\x4b\xe2\x37\x71\x19\xe7\x68\xaf\x04\x2d\x25\xcc\x89\xf6\x08\xc9\xcc\x0d\x65\x00\x26\x8c\xfc\x0b\xed\x12\x03\xff\x32\xe0\x16\x01\x9c\xc2\x6a\x43\xb8\xc8\x08\x27\xef\x0d\xe1\xdf\x53\xb8\x07\x9b\x97\xb9\x04\x4a\xee\xa8\x1c\x0a\x22\x74\x30\x26\xc3\x37\x59\x92\xa3\x22\x2c\x43\xa7\x2b\x2c\xa9\x4f\x2e\x30\x24\x52\xe3\x3e\xbd\x38\xbc\x69\x4e\xaf\x3d\x5c\x7c\xe9\xdc\xe4\x17\x46\x5b\x18\xc4\x87\xd2\x8d\x70\x22\xa7\x98\x97\xc6\x3e\x4f\x65\x44\x4a\xb0\xbd\xfc\xab\x31\xa5\xcc\x84\x81\xfc\xf1\xe6\xee\x7a\xfb\xf5\xb2\xd9\x3e\xac\x9f\x0e\x4b\x90\x44\x09\x8a\x4d\x00\x4a\x9a\x1f\x23\xef\xc8\xbc\x99\x4b\xc0\x22\x70\x49\x61\xc5\x8d\x4c\xd3\x7c\x99\xdd\xb7\x99\xa2\xe4\x50\xe4\x0e\xf9\x86\xe1\xeb\x51\x76\x58\x8b\x52\xad\x1a\x56\xdb\x7b\x1b\xbe\xcf\x29\x32\xf7\xfe\x43\xfd\xe7\xa7\x59\x68\xe0\xed\x3e\x6d\x34\x55\xe5\xe9\xb9\xa2\x25\xb9\x21\x0d\x6f\xca\x1c\x99\x86\xb1\x24\xa6\x5c\xd0\xd5\xad\x66\x8e\xea\x97\x88\x1b\xaa\x96\x27\xc6\xb1\x7f\xa2\xfd\x37\x77\xcf\xb4\x5f\x51\x98\xa7\x82\xb6\x58\x36\xa3\x50\x26\xa8\xf7\x79\x55\xe6\x46\xfc\xfb\xfa\xe1\x71\xbb\x7b\x9a\x88\x28\x0a\xb1\x0e\x07\x71\x4f\x1b\x5a\x62\x35\xa7\x28\xfe\xc6\x9e\x7f\x8f\x07\xb1\x1a\x3a\x8e\x9f\x84\x4f\xf2\x2c\xb3\x22\xde\x1c\xe3\x78\x56\xfd\xd8\x21\x7b\xd2\x20\x3f\x64\x11\xcc\xe2\xa3\x22\x2f\x3e\xd2\x5c\xc0\xbb\xa4\xd5\xab\xed\xf6\xf6\x5f\x9f\x9e\x4e\xf4\xca\xce\x24\x8a\x47\x37\x75\x39\x4a\x58\x9b\x22\x13\xea\x95\xa0\x7f\x12\x42\xc2\x19\x0a\x22\x74\xab\x56\x4a\x38\xb1\x2e\x45\xd2\xbc\xf8\xdb\x9e\xcd\xca\xd6\xb0\x5a\x20\x6c\x36\x35\xda\x01\x06\x79\xcc\x30\xa3\xd5\x15\x11\x9f\xc9\x01\x3a\x45\xbe\x91\x7f\xf9\xf1\xce\xb5\xfd\xec\x1e\x40\xac\x77\xce\x31\x2c\xb1\x88\x08\x2f\xf1\x18\xec\x1c\x71\xa8\x65\x6d\xec\xbe\x94\x87\x24\x0e\x43\x18\x88\x48\xd5\x93\x30\x15\x4f\x4a\xc6\x93\x29\xfe\xfd\x97\x09\x76\xd7\xaf\x73\xfc\xbe\x39\xae\x64\x8e\x69\x34\x9b\xf1\x8c\x13\xf7\xdf\xd7\xdf\x9e\x02\x5c\xf3\x60\x5a\x6d\x8d\xf7\xbe\x03\x2a\x8f\xfc\xe8\x25\x7d\x70\xe1\xe2\xbb\x1d\x4b\x64\x17\xdf\xed\xbe\xc9\x3f\x8f\xbb\xfa\xee\xe1\xd3\x76\x77\xfb\xc3\x85\xfc\xd9\xd4\x8f\xeb\x7f\xd0\x0e\x08\xbf\x43\x04\x6b\x7e\xf3\xdd\x6e\xfb\x28\x69\xd6\xfd\xe6\x5c\x9c\xcf\x08\x36\xa4\x87\xd8\x80\x37\x1a\xbc\x99\x39\xd5\x59\xc7\x90\x55\x09\x78\xf3\x15\x14\x68\x88\xb6\xee\xdf\xe9\x20\x31\xc2\x16\x06\xaa\x2c\xdc\xa4\xc3\x3b\x09\x6b\x53\x85\xc6\x01\x79\xc5\x8f\xe2\x55\xfe\xac\x01\xab\xc1\x2e\x72\xc0\x1a\x1b\x05\x17\x7b\x6f\x36\x06\x7c\xda\x23\x78\xb3\xa0\xa8\x8c\xdd\xf8\x25\x05\x56\xf9\x59\x6c\x36\x34\xa7\x08\xd1\x37\x1a\x21\x04\x81\xea\xdd\x6b\x02\x81\x3d\xb6\xb8\xd7\x46\x62\x81\x35\xda\x68\xb3\x40\x39\x58\x33\x58\x1b\xd5\x87\x2f\x97\x10\xa8\x0b\x0b\x12\x4d\xae\x4f\x17\x77\x4f\xb2\x4d\x04\xe7\x35\x3f\x8a\x57\xf9\x93\xa2\x17\xc5\x57\xf2\xb2\xe1\x5d\x82\xe5\x73\x8a\x70\x12\x56\xd6\x73\x02\xfa\xdf\x92\x7a\xce\xe1\x3b\x3e\xa1\xa7\x62\xf2\x25\x25\x64\x2c\x5a\xd3\xe4\x80\x6d\x0b\xaa\xc0\x91\x7c\xa1\xba\xa1\x5c\xfe\xad\x26\x9b\x1b\x83\x2a\x42\xe5\xe5\x26\x20\xa4\xbf\x3d\xed\xff\x6c\x36\xb8\x7f\xfb\xbb\xa5\xd3\x8c\x72\x5f\xb8\x5f\xfa\x65\xac\x9f\xf7\x5a\x97\xfd\xca\x8d\x7f\x5e\x6e\xfc\x56\x8b\xb9\xb3\x1a\x76\x3d\x89\xe9\xfa\x1c\x59\x88\x42\x1d\x42\x03\x5e\x83\xff\x2b\x51\x85\xd3\x60\x9d\x22\x40\x45\x40\x2f\x91\xc5\xad\xcc\x98\x66\x85\x7e\x91\x24\xc0\xa5\x03\x6f\xcb\x03\x1f\x89\xa5\xdd\x68\xa1\xb6\x81\x12\x9a\x55\x7c\xa3\x22\x18\x5f\x9e\x7c\xe4\x0f\xc0\xc2\xe1\x2e\x40\x4c\x09\x23\x29\xac\x00\xe3\x49\xa4\x88\xe0\x48\x23\x78\x5c\xe4\x0b\x16\x3c\xec\x37\x67\x82\xfd\x1a\xce\xd1\x53\xfb\xde\x4c\xc4\xe2\x42\x36\xee\xe0\x0f\x08\xaa\xa4\x0d\x78\xfa\x75\x32\xcf\x3e\x99\xbf\x82\x3c\xfc\xca\x56\x7e\x29\x94\xf8\x77\x80\x2e\xb1\xb8\xf9\xb8\xab\x77\x13\x0d\xb7\x3c\x48\xb7\xf9\x08\x5d\xfc\x2a\x82\xa0\xe9\x44\x2a\xcf\xcf\xb2\x59\x04\xfa\x05\xa1\xbc\x74\xcb\x08\x89\xa6\x87\xe7\x82\x06\x17\xe6\x68\x97\xf6\xe8\x7b\xe2\xf7\x66\x5e\x9e\xc5\x1b\xe5\x96\x86\x86\x17\x57\xf3\x21\xfe\x9c\xdc\x2d\x00\x85\x46\xe2\x39\x13\x0e\x4e\x1b\x28\x81\x8b\x8d\x13\x23\x91\xc3\xad\x6d\xd5\xdb\x72\x50\xba\xfa\x80\xa4\x22\x44\xb3\x34\x38\x77\x4b\xb7\x09\x57\x1f\x50\x0c\xe5\xd1\x2e\xd3\xc6\x5d\xdd\x46\x70\xa8\x81\xdc\xa2\xe5\x06\x06\x12\x35\x06\x82\xcd\x77\x99\x1e\x4c\xca\x17\xfb\x67\xbb\x7e\x27\x08\x8e\x07\x02\xc8\xcd\xc6\x6e\x2c\x56\xd9\xa5\x91\x1b\x24\x3b\x79\xd7\x7e\x78\x26\xe3\xec\x10\x94\x41\xa8\x52\x23\xf1\xb7\x35\x46\x18\xde\xe6\x53\xd2\xe0\xa2\xac\x05\x03\x2e\x2d\x07\xc7\xfe\x1a\xe7\xe8\x97\xc6\x6c\xfc\x12\x2d\xf8\xb4\xa0\x28\x00\x7f\xaf\x6d\xdc\xf4\x88\xf4\xb7\xdb\xe6\x99\xc3\x33\xd1\x2c\x8d\xdd\xe8\x22\xf2\x98\x86\x98\x3d\xd4\x16\x28\xb1\xa8\x09\xe7\x7e\xf0\xd6\xf1\x92\xb6\x0d\x56\xe0\xa3\xc6\x50\xb2\x08\x0f\xde\x2a\xb9\x95\xae\xca\x43\x73\x1e\x14\x94\xee\xa0\x70\x78\xbb\x71\xe5\x65\x0f\x67\x30\x9c\x81\x79\x89\x17\x67\x9c\x58\x96\xda\xb6\xf2\xea\x43\xca\xcc\x63\x03\x09\x17\xd9\xe6\x07\xfd\x1c\x13\xb8\x54\x36\x50\x98\x11\x57\x16\x20\x46\x65\xc5\xc0\x26\x2d\x82\x34\x22\xcd\xd1\x02\x95\x35\x47\xf1\x04\x7b\xaf\x19\x42\x81\x0b\x04\x91\xb9\x76\x9a\x81\x4d\x1d\x2c\x50\xa5\x4c\xc5\x7a\x8b\xb8\x81\x58\xaa\xc1\xf5\x58\x5a\x60\xb3\xaa\x9f\xaf\x81\x30\x0c\x3f\x73\x10\x14\x55\x9b\x00\x3e\x2c\x3c\x78\x65\x0c\x90\xab\xc1\x51\x17\x45\xac\x52\x60\x3d\x04\xb7\x31\x45\xa1\x4a\x1c\xa1\x98\xb3\x48\x6c\xea\xe8\x06\x15\xf2\xbb\x28\x01\x9e\x62\x5a\x98\x4a\x2c\x68\x20\xd2\xa4\xbd\xb9\x1b\xa7\xac\x8a\xe1\x45\xc7\x6e\x7d\xf7\x8c\x25\x89\x38\xc8\x31\x6b\x44\xcc\xfe\x3f\xc2\x86\xe2\x2c\xf1\x56\x9f\x0e\xfb\xbd\xc4\x78\x23\x08\x89\x37\x12\x63\xc1\x25\xc5\xb4\x23\x8f\x45\x84\xe0\x99\x77\xba\xa4\x64\xa7\x16\x5f\x29\xce\x2c\x9f\x71\x59\x41\xc9\xa3\x5d\xe8\x5c\x43\xae\x6d\x91\x6b\xce\x6e\x7a\xc5\x0d\x85\x44\x73\x6f\x58\x5b\x12\x45\xab\xe4\xa9\x87\x06\x5f\xdd\x6a\x07\x9e\xb7\x6f\xef\x17\x6d\x08\xfa\x28\xde\x9f\xe0\x02\xa0\xaf\x03\xd7\x19\xba\x8a\x51\x27\x30\xa8\x25\x45\xfe\x6b\x29\x0f\xc5\x98\x2e\x36\x16\xbc\x84\xb7\x43\x29\x50\x8a\x5e\x24\x88\x9c\x86\x6e\x5c\x96\x8a\x60\xb9\x53\xe8\x1b\x9e\x62\x70\x61\x61\x78\xff\x55\x14\x4e\x0b\x6c\x7d\x8c\x8a\x8b\x4d\x94\x02\xa0\xc9\xfb\x28\x05\xa8\x92\xec\xa5\x08\xe6\xa9\x63\x00\x44\x20\xfc\x8e\xbf\xa2\x37\x9e\xc2\xbe\x78\x31\x6d\xc4\x94\x8b\x78\x47\xf4\x41\x0e\xcf\x7d\x1d\x79\xb2\xe5\xd1\x72\x50\xe2\x95\xe4\xb2\x50\xe3\xda\x07\x1a\x65\x00\xbd\xe2\x65\x34\xfe\x42\xb8\x8b\x42\x5a\xe4\xb2\x4d\xb6\xbe\x62\x41\x4c\x1e\xdd\x8e\xe8\x84\x2a\x1c\x2b\xe6\x8e\xe5\xda\xe1\xfb\xa2\x75\x57\x1f\x28\x29\x4a\x75\xf6\x7f\xcc\xa6\x7c\x98\x2f\x12\x67\x65\x9a\x9c\xf9\x73\xce\x37\x2f\xb0\xdf\x7e\x69\x9a\x87\xf5\xb7\x67\x6e\xa2\xa3\xa2\x1a\x9d\xc8\x0b\xae\x17\x18\x98\xae\x1d\xb8\xd4\x64\xa6\x1c\x7d\x8d\x56\xba\x63\x73\x7f\xe4\x7e\x9d\x87\x45\xec\x68\xbd\x86\x10\x67\x28\xf7\x24\xed\x95\x73\x3c\xfd\x06\xf4\xa9\x59\x15\x30\x71\x74\x10\x6a\xac\x98\xe0\xf3\xb3\x35\x20\x03\xa3\x23\x90\x5f\xa0\x67\xa1\x36\xf1\x6a\x66\x91\x9b\x6c\x3b\xa2\x22\x3e\x98\xf3\xa1\xc6\x44\x56\x4f\xaa\x54\x67\x57\xc5\xde\x7d\x52\x5b\x56\x39\x45\x8e\x95\x03\xa7\xb8\xaa\x14\xcb\xf5\x95\x62\x7e\x50\x29\xa0\x30\x73\xe0\x99\x2d\x49\x3c\xa9\x76\x8c\x58\xec\xc7\x8d\x06\xb2\xac\x22\x58\xa3\x50\xbc\x1f\x83\xb2\x1d\xd9\xe4\x70\xf4\x5c\xe5\xb9\xd0\x62\x22\x88\x50\x61\xec\x70\x2f\x70\x20\x77\x3d\x40\x8d\xe3\x91\xe4\x47\x69\x39\x98\x14\x66\xe3\x63\x23\x6b\x85\x96\x2c\xb9\x0d\x76\x0c\x74\x9a\x59\x66\xe0\x45\x23\xd1\x78\xcb\x97\xd1\x81\x71\x7b\x3b\x37\xc3\x4d\xc6\x41\x3c\xe5\xb6\xfe\x98\xcd\x59\x61\x52\xc1\xfc\x35\xba\x23\x3a\x8d\xd1\x66\xd6\xc7\xfa\x15\x21\x53\x86\xd5\xf2\x0c\xd9\x3c\x4d\xdd\x84\xf0\xbb\x22\x2e\x30\x29\x70\xae\x31\xca\x94\x92\x46\x5b\xd1\x39\x44\xc1\x17\x56\x1f\xf2\x6e\x0e\x31\xcd\x30\x9b\x48\xca\x33\x13\xb6\xe7\x6d\x18\x1d\x98\x05\x89\xd1\x78\xd6\x95\x5f\x58\x82\x6f\xb1\xf6\x11\x93\xde\x64\x67\xac\xd3\x05\x95\x9f\x6d\x0d\x5e\x45\x6e\x22\x0f\xa2\x04\x6a\x55\xd5\xcc\xf1\x3e\x27\x8f\xd6\xe8\x86\x00\x59\xa1\x5b\x31\x85\x90\x58\xec\x98\x3c\xf5\xa7\xd8\xd7\xbc\x99\x96\x49\x04\x2a\x30\x6e\x56\x4e\x76\x7b\x87\x8b\x16\xac\xff\x2b\x50\xf4\x13\x3d\xb3\x53\xd3\xc3\x7a\xf7\x79\xfd\x8c\x20\x1e\x15\x0d\xa6\xd8\x58\xa1\xd9\x36\xa5\xea\x26\x5d\x42\xcf\xcc\xd0\x2a\xec\xb8\xa0\x21\xc9\xd8\xa6\xb4\x5c\xe5\x24\xae\xf8\x12\x15\x07\x20\xa6\x90\x28\xdc\xb9\xbf\x64\xe7\xdf\x51\x0d\xd9\x76\xdb\xcc\x00\xd2\x50\xaa\x98\x65\x33\xc7\xee\x6e\xdb\x59\xf6\xc9\x96\x4c\x98\x1f\x07\x36\x18\x4e\xb2\x8f\x7c\x89\x91\x0b\xf3\x9d\x70\x65\xf1\xed\xe7\xda\xca\x17\x55\xc1\xae\xb9\xd5\x09\x42\x98\x0d\xd9\x07\x66\x2e\x3d\xe6\x2b\x67\xe4\xe0\x85\xdc\x85\x31\x0b\x5d\xfc\xef\xee\x87\x0b\x2b\xa2\xd7\x39\x98\x51\x10\x1b\xfa\xc9\x4a\x27\x01\x42\xc8\x53\xd9\x3f\x8b\xa9\x8c\x86\x47\x05\xfd\x64\xf9\x53\x2b\xf7\xaa\xf2\x45\x37\x26\xfc\xee\x1c\x1c\xea\x84\x75\x41\xb9\x83\x28\x10\x20\xf2\x6c\xdb\x99\x24\x25\xe6\x33\x96\xf6\x79\x68\x69\x3a\x72\x02\xf1\x6a\x7b\xc0\xdf\x35\xf5\xed\xd3\xf2\x97\x41\x10\xdf\x05\xef\x57\x1a\x01\x93\x96\xf3\xeb\x20\xa7\x02\x2c\xda\x17\x7f\x0e\x4e\x08\x02\x0b\x9b\xda\xf3\x5c\x78\xab\x8d\x76\x40\x71\x92\xe1\x47\x07\x56\x5c\xad\x04\x19\x5b\x84\x62\x37\x4b\x60\x14\xff\xd7\x9d\x02\x11\x6b\x15\x97\x86\x7b\x19\x88\xe7\xc8\xab\x8c\xeb\xec\x83\x60\xbf\x12\xd8\x78\x29\x27\x71\x9c\x6e\x38\xa3\x3c\x49\x84\xbe\xf6\x14\x97\x9f\x6d\x81\x7d\x87\xae\x3e\xc8\xb7\xca\x48\xac\xf1\x10\x2e\x23\xe7\x32\xa4\xc4\x0c\x9d\x55\xa3\x5c\x77\x1d\x58\xf4\x09\x19\xcc\x21\x1f\x2d\xa2\xd7\x16\xd0\xac\x20\x08\x84\x86\x2c\x27\x1e\x0a\x12\xf5\xc7\x69\x09\x0e\xd1\x18\x35\xec\xb5\x82\x18\xc0\xe1\xa6\x1a\x26\x69\x70\xb8\xe0\xa6\x24\xe5\x56\xd8\x3b\x01\x79\x39\xe1\xc1\x7c\xa0\x8a\x04\x7e\x20\x3c\x0a\x6a\x3f\xe6\x5e\x5e\x1a\xe1\x4b\x51\xf4\xa7\xf6\x64\xb2\xed\xd9\xd9\x4c\xe7\x1c\x4f\x18\x21\x04\xb3\xd2\xd2\xc3\x3c\x06\x26\xea\x00\x11\x0f\x7f\xd5\x10\x21\xf6\x93\x6c\x99\x08\xac\x68\x8c\x19\xca\x87\xe9\xc7\xa6\x61\x26\xe3\x54\x95\x0f\x7d\xc9\x0a\xe0\x06\xa7\xc8\xa3\xdb\xcb\x58\xb9\x97\x10\xe7\x29\x3f\xba\x63\x3c\xc5\x33\x57\x5c\x38\x42\x34\x9a\xf3\x86\x98\x1f\xad\x8e\xea\x3c\xd3\x9b\x69\x08\xa2\x34\x54\x4e\x69\xb8\xc8\xa2\x1d\xd9\x3c\x89\x65\x80\xc0\xf5\xc9\xa3\xfd\xdc\x6a\x88\x0b\xaa\x44\x5f\xf3\x8d\xf0\x5f\x56\x59\x6b\xcb\x6b\xd2\xe6\x45\xda\x1d\x10\x11\x04\xec\xcf\xd7\x85\xbf\x58\xaf\x28\x6d\x08\xd0\xd4\x1e\x3c\xab\xf7\xfe\x50\x25\xb2\x5c\x1e\x2c\x4b\x4b\x2e\x3f\xba\x33\xb4\xf7\xdb\x82\x4f\x96\xb0\xa1\x9f\x71\x09\x5b\xd3\x2f\x61\x3c\xba\x86\xc9\xaf\x2a\xe5\x32\x60\x48\xe4\xfd\xd3\x3b\x15\x79\x4c\x13\x84\xa3\xab\x38\x82\xa7\x76\x21\x5b\xfb\xcc\x42\x36\xac\xae\x62\xb7\x90\x2d\x38\xd6\x51\x3c\x73\x94\xc3\xdd\x9b\x70\x56\x8b\xb5\x88\xd6\xf2\xe8\xa6\xcc\x69\x02\x63\x1b\x03\xc6\x89\x15\xc0\x41\x5c\x42\x25\x88\x54\x0d\xb6\xe4\x14\xc4\xc3\x32\xae\xda\x18\xd2\x72\x57\x6d\x74\xc8\xb0\xfe\xed\x5f\xc3\xaf\x83\xaa\x1e\x0c\x78\xe5\x99\xe6\x38\x8f\x2c\x03\xde\x84\x98\x33\xf4\x74\x43\x41\xf1\xf2\xf2\x97\x14\xda\xa5\x2b\x12\x51\xd7\xa7\x37\xeb\xd6\xf3\xed\x97\xdd\x67\xf9\xf2\x49\x0b\xdd\x24\x17\x20\x7e\x49\x96\xf5\x0a\xcf\xd3\xe1\xbb\x30\xc1\x95\x26\xf0\x49\x3b\x30\x02\xf9\x42\x51\xe3\xcc\x83\x91\xee\xf4\xd0\x37\xbc\xff\x6c\xaa\xda\x4b\x1c\x61\xb1\xf4\xe9\x96\xa2\xa7\xa6\xff\x68\x50\xac\x18\x2c\x22\x54\x69\x69\x37\x66\xe4\x41\x56\xea\x74\x41\xd9\x8d\xd9\x07\xd6\x66\x27\x25\x64\xd9\xc7\x98\x26\xdf\xac\x4d\xda\xc5\x9c\xb3\x6d\x17\x7f\x48\xbd\x77\xad\xe2\x76\xe9\xfe\xab\x61\xb1\x28\x58\x3e\x09\x97\x86\xe6\x61\xec\x89\x97\x46\x66\x85\x1f\x90\x72\xee\xda\x32\x37\xb1\x05\xd0\x3d\xc4\xc8\xcb\xba\x1b\x80\x23\x19\x30\x0a\x44\x54\xb1\x0d\x78\xa7\x21\xd9\x25\x06\x30\xe5\x51\x7b\x9b\xce\x5f\x87\xfc\xe8\x54\x47\x4c\x5c\x44\x3f\x33\x93\x3a\xa8\x1b\xe4\x39\xd9\x3c\x8a\xa3\x2c\xe2\xe7\xaa\xa4\x9d\xed\x80\x6c\xaa\x23\x79\x30\x0e\x5a\xca\x2d\x82\x64\xf7\xc8\x5a\xcd\xa0\xfd\x47\x9a\x29\x40\x5a\xdc\xca\x76\xc0\xc7\x8d\x24\x7b\x18\x70\x3c\xdf\x5e\xf5\xd7\xa0\xea\x5a\x6e\x09\x7c\x0f\xf8\xa6\x78\xb0\x35\xe6\xcb\xff\xda\x70\xba\xe9\x5e\xa2\x86\x10\xb5\x5c\xa7\x80\x27\xb0\xfe\x6f\x3c\xd0\xcb\xbf\x13\xba\x25\xb0\x6e\xc1\x0a\x8f\xfa\xbb\xe2\x0c\xbf\x46\xec\x39\xd5\x42\xe1\xaf\xb5\x60\x07\xd2\x17\x81\x0b\x2c\xc5\xfb\x27\x03\xa9\xef\x59\xf8\xff\xa5\x73\xcd\xbf\x9f\xc5\x7c\x34\xfa\x66\xfa\xfb\xda\xf5\xff\x33\x45\x47\x92\x31\xb0\x1b\x1a\xb9\xf1\x6f\x74\x9f\x92\x53\x4f\x92\x40\x9f\x09\x39\xc4\xfa\x7a\x59\x7a\x3b\xc8\x9b\x61\x75\xd3\x41\x7e\xcb\x99\x0b\xc9\xad\x3f\x3a\xf0\x61\xe6\x59\x81\xf6\x87\x8b\x2e\x72\x5d\x54\xa8\x39\xeb\xe9\x7e\xef\x32\x22\xe7\x28\x17\x53\xa9\x95\x52\x44\x10\xcf\xcf\xee\x5d\x42\x01\xdf\xdf\xb3\x1a\x5c\x4f\x32\xe8\x3e\x83\x1a\x15\xab\xfb\x62\xa5\xd6\x39\x39\x5e\xbf\x71\x52\xbd\xe4\xd3\xc7\xab\x97\xd2\xb5\x60\xff\xf3\x4a\x95\xd3\xf7\x71\x03\x0f\xdd\x3f\xc7\x39\xf6\x7b\x27\xef\xdd\x76\x79\x99\x54\x87\x12\x01\xa7\xbd\x82\x4e\xdf\x8d\xce\x84\x04\x4e\xae\xf7\x29\x1c\x9d\xa5\x33\xcf\xe6\x94\x9a\x54\x9f\xa3\x01\xa3\x81\xc2\x86\xb7\xb5\xa7\x0c\x4c\x17\x24\x07\x52\x67\xa2\xed\x23\xb4\x55\x8c\xc7\xa9\x03\xfe\xf7\x82\xbd\xfd\x52\x3f\x4e\xc7\xdd\x7e\xff\x0a\x7a\x8b\x3d\xe1\x91\xf5\xf3\xd4\x26\xbc\xd1\xf8\xba\xd5\xf4\x2e\xbc\xa1\xcc\x97\xf2\x5a\x7a\xd7\x4a\x98\x79\x20\xa7\xe4\x51\x32\x75\x27\x1d\x0b\xf9\xd1\x4a\x4b\x04\xee\x5c\xab\xe1\x1c\x9c\x7e\xba\x1d\x1d\xc6\xe4\x8c\x10\x49\x67\x33\x25\xb5\xaf\x32\x25\xfd\xb7\xed\x6c\xb5\x5a\x3f\x73\xd4\xf4\x8b\xbd\x1c\xa4\x20\xe7\xec\x6e\x1e\x21\xba\x59\xbe\x5e\xe9\x6e\x57\x58\x1c\x45\x66\x13\x7b\x31\x86\x1b\xbf\xe4\x2f\x14\xe1\x5c\x8a\x98\xbc\xa5\x94\x0f\x43\x97\x52\xc2\xf4\x75\x5b\xef\xd5\x2d\x13\xb1\x1c\xbe\x02\xb9\x8e\xa0\xc5\xea\x14\x28\xb7\x6a\xf2\x82\xff\xcb\xc5\x0e\x5e\xa9\xf6\x55\x6e\xd0\xe4\x15\x9c\x04\x3d\x70\x96\x2b\xad\x0f\x94\xc4\x23\xb8\x9a\xcb\x18\x40\x74\x87\x8b\x2b\x3f\x18\x9e\xe1\x2b\x19\x2b\x3f\x97\xaf\xeb\xc1\xab\xfc\x23\xcf\xc7\xe0\x45\x57\xd3\x9b\x8f\x4b\x7f\xbf\xfb\x5c\xdf\xdd\xfc\xa5\x7e\xbc\xd9\x4e\xbd\xf1\xb7\xcd\xb7\xcf\xdb\xbb\xef\xee\xb7\x37\x77\x8f\x0f\x3f\x5c\x24\x88\xdf\x61\x84\xf8\x1d\x79\xa0\xe2\x2f\x62\xb5\xeb\x3b\x0a\xfc\xfb\xf0\x27\x86\x2e\x53\xf1\x97\x6d\x7f\x74\xff\xf2\x23\x96\x7f\xe4\x02\x52\x5f\x54\x57\xe7\xb9\x2e\xc5\xad\x22\x33\x1f\xa3\x33\x8c\xb1\x10\x4a\xf8\x06\xc1\x42\xa0\xd2\x44\x5b\xca\xb8\xfa\x60\x95\xc1\x25\xb9\x39\xda\xfd\xc9\x50\x08\x4f\x5e\x5a\x10\x37\x8f\xe8\x85\xf6\x4d\x50\x64\x06\xed\x93\x42\x04\x35\x25\x37\xd0\xd0\x49\x0d\x7c\x56\x26\x16\x73\xf0\x39\x99\x51\xfd\x63\xc4\x6d\x34\xe3\x1e\x94\xe3\xc7\x65\x5c\xdd\x56\x3a\xce\xc9\xec\xfd\x1c\x4f\xb1\x7d\x3c\x6a\x6d\xf4\xcb\xa5\xd3\x13\x94\xc6\x1e\xaa\x6c\x8c\xa1\x85\xf6\xe0\xdc\x89\x55\x76\xed\xa4\xec\xda\xf9\x4a\x30\xa3\x67\x91\xd1\x26\xb0\x60\xef\xaf\xef\x18\x09\xf5\x20\x4d\x28\xf5\x9d\xb3\xba\xa9\xcd\xce\x6f\xeb\xa6\xbe\x5b\x3d\x03\xd2\x62\x95\x31\x25\x88\x42\x0b\x17\x63\xdf\x07\x17\xf3\x54\x97\x83\x74\x39\x1d\x45\x45\x23\x70\xe7\x42\x86\x88\x2a\xcc\x4b\xeb\xfb\xa8\xdc\x9c\xe2\x9b\xbb\xf4\xbc\x72\xec\x21\xc9\x0d\x67\x48\x75\xc8\x97\x7c\x7d\x58\x0f\x07\x11\x35\x41\x94\x93\x7f\x0d\xac\x7f\xb8\x24\xc1\x3e\xc0\x43\xac\x1d\x6b\x23\xee\xa0\x92\x44\xb0\xa4\xaa\xe6\x90\x55\xe5\xb8\x20\x1e\xe2\x6c\x54\xb4\x2a\xaa\x3d\x97\x89\xa2\xa9\x58\xb3\xc3\x24\xe6\xf9\xdd\xcd\x38\x6a\x08\x46\x83\x8d\x8b\x5c\xa3\xd8\xad\x71\x9f\x5c\xbe\x05\x2f\x32\xa2\xc4\x79\xf1\x96\x73\x12\x2b\xa3\xfc\xd6\x1c\x2e\x3a\x05\xb6\xb6\x6a\x0c\xb8\xa8\x22\x90\x1f\x55\xc2\xba\xd8\x29\xb3\x72\x0c\x7e\xaf\xef\x4b\x62\xc5\x58\x46\x67\x32\x72\x72\xff\x4c\x08\xdd\xa4\x2c\xb2\x13\x46\x82\xd4\xbc\x7b\x56\x0e\xd5\x9e\xd0\x11\xff\x12\x20\xa7\x7f\x7a\x52\xa4\x42\x9e\x13\x16\x9a\x04\x3c\x33\x1c\x9f\x93\x08\xc9\x3d\x39\x27\x0b\x94\x4f\xd1\xbc\x73\x4a\xc2\x84\xff\xfc\xeb\xf5\x6f\x59\x61\x78\x56\x2f\xa0\x5a\x2e\xc7\x6d\x1e\xc6\xd6\x3f\xdc\xc8\x63\x56\xbe\xe9\xc4\x4a\xd6\x12\xb4\x87\xe8\x6b\xca\x81\x76\x7c\x6b\x27\xa5\xfb\xdf\xb3\xf2\x4d\xab\x33\xa0\xcb\xba\xfe\xb9\xb0\xa4\xec\x78\xab\xf7\xa3\xad\x3e\x6c\xe2\xd5\x07\xaa\x54\x9a\xa3\x5f\xda\xcd\x29\x75\x3f\xcf\xde\xbc\x32\xd5\x32\x43\xc2\x8a\xf9\x2a\x74\x30\x41\x5a\xa0\x88\x83\x99\x25\x48\x8a\xff\x3b\x0c\x9a\xd8\xad\x8c\x92\x2b\x26\x2d\x92\x52\x64\xaa\xcd\xa1\x14\x08\x66\x69\xaa\x0d\x82\x78\x68\xc6\x30\x8b\x60\xc4\xc7\xb2\x18\xd0\x0c\xe4\x36\x7e\xe1\xc1\x2a\x02\x97\x96\x66\x22\x8b\xbf\x99\xc5\x46\xe5\xe7\x64\x97\x71\x63\x97\x86\xe6\x51\xfe\xf0\xf3\x58\x88\x52\x5e\xc5\xe5\x50\x18\x54\x34\x1f\x62\x3a\x6a\x5a\xc6\x21\xb2\xd8\x29\xc2\xe0\xf3\xc6\xdd\xbf\x0c\x2a\x3e\xc3\x1d\xe3\xcf\x4e\x13\x72\xcf\x77\x36\xd2\xfd\x19\x83\x17\xe6\xe3\x54\xb1\x49\xf4\xfd\x12\x5e\x46\x20\xdb\x90\x36\x60\xfd\xf2\x15\x0c\xc0\x82\xb7\x33\x03\xde\x2b\x53\x5c\x8b\xe5\xa2\x7f\xc6\xe8\x85\x42\x26\xef\x5c\x2b\x5c\xc2\x5b\x9a\x68\xff\x4e\x0e\x79\x5f\xd3\x17\x77\xf2\x41\xef\x2f\x86\x13\xbc\x17\xa3\xe6\x7c\xfb\xdb\xfb\xe3\x97\xfd\x27\xe1\x49\x67\x88\x7e\x66\x80\xe8\x9d\xcb\xda\x80\x9b\x05\xb0\x49\x85\xce\x94\x36\x03\xe3\x73\xd1\xff\x19\x02\xa5\x1d\xf3\x43\x08\x10\x42\xeb\x8a\xc0\xea\xfd\x39\x60\x8f\x27\xab\x23\x8c\x0f\x7a\x36\xc7\xe3\x0c\x9c\xea\x3d\xf0\x22\xf1\xff\xbc\xd4\xfb\xb6\xfb\x62\x96\xd7\xcc\x32\x6e\x5c\x47\xac\xee\x67\x91\xd7\x9e\x3b\x06\x79\x69\x63\x97\xb0\x94\x6e\xba\x89\x4f\xe7\x71\xc2\xd8\xde\x75\xa9\xfd\x26\xfa\x7c\xff\x2d\xf6\x2f\x81\x8c\xde\x7f\x35\x3c\x14\x6c\xde\x46\x54\xc7\x04\x9b\xd7\xdf\xf8\xfe\xb2\x85\x9a\x97\xfa\xf1\x6a\x81\xe6\x8d\x54\xfa\xae\x5b\xea\xf7\x70\xd5\xf7\x06\xc2\xf9\x65\x2c\x8f\x77\x07\xc3\x29\xe5\x83\x37\xae\x8e\x53\xe4\x83\x53\x02\xe7\xfc\x5c\x17\xd4\x4f\xca\x05\x83\x73\xa8\x7f\x5f\xdf\xaf\xeb\xe3\xbe\xab\x27\x9c\x07\x89\x2d\x85\x12\x57\x99\x99\x01\x0c\xca\x64\x27\xc4\x7c\xf4\x87\x41\x21\xce\x29\x82\x15\xa7\xa7\xa8\x2c\xb8\x51\x30\x13\x2f\xa1\xb7\x17\x26\xfb\x62\x56\x2c\x9a\xba\xa8\x0c\x54\x05\x20\xbe\x3e\xe4\xe3\xb2\x54\x9a\x73\xd1\x33\xc7\xe5\xbb\xae\xbe\x4a\xd9\xdc\x8e\xbd\x07\x6c\x48\x93\x1c\xd4\x1d\x27\x8e\x13\x0e\x9d\xf2\x31\x30\x73\xaf\x38\xed\x21\xf3\x1d\xa3\xc8\xcd\x03\xf8\x86\x3b\xa8\x87\x1d\x94\x86\xeb\xdc\x41\x48\x9c\xbf\xf1\xe0\x78\x9b\x4d\x38\x1a\x86\x9c\x2b\x00\xaf\x85\xb9\x94\x3b\xe9\x5f\x76\x81\x89\x6e\xaf\xb9\x87\xe2\xd7\x95\xbb\x38\xf4\x5e\xbc\x69\xd6\xff\xb2\xdb\x7e\xb9\x3f\xc7\xd4\x1a\x54\xc6\xce\xd1\x8c\xe3\x57\xe0\x30\x70\xc3\xdc\xe0\x30\x72\xc3\xd2\x94\x0e\xf8\x52\x8a\x44\x04\x31\x34\x37\xd5\x12\x69\xce\x9c\xfa\xf8\xa5\xc8\x09\x73\x23\x71\x3d\x32\xe8\xa9\x3f\xdc\x19\x0d\xe2\xca\xbc\xaf\x0e\x53\xd6\x41\xd5\xcf\x52\x87\x1d\xd4\x61\x5f\x5b\xc7\x49\xb3\xe9\xba\x85\x4a\x56\xdc\x5f\x96\x66\x04\x4f\x55\x46\xbb\xb1\xca\x2c\xc9\x8d\x60\xc6\xfc\x7b\x97\x92\xbf\x68\xb7\x15\x45\x71\x19\xe7\x14\x97\x61\xd4\x86\x32\x20\x49\x54\x61\x39\x8c\x75\xa1\x70\x83\xaf\x6a\xc3\xd3\xda\x4b\x4b\xd0\x58\x95\x04\x2d\xe1\x80\x96\xa5\x75\xb7\xf4\xd7\xe0\x18\x56\x0d\xcb\x10\x24\x5c\xca\x15\xef\x2f\xe4\x59\xd5\x27\x3b\xa7\x78\x75\x5b\x69\x2b\xbf\xaa\xf2\x17\x7a\xfe\xf5\x8e\x96\xd3\x5f\x69\xf2\x9e\xd6\x6b\xce\x32\x71\x03\x26\xf5\x87\xfa\x7e\xbd\x5b\x35\x37\x67\x61\x52\x72\x1d\x65\x08\xfc\xcc\x83\x51\x1e\x7a\xe8\x5c\x65\x2a\x81\x98\x92\x78\xff\x68\x66\x5e\x2e\x85\xfa\x58\xe8\xcc\xbe\x89\x53\x42\xc8\x8f\xee\x33\x42\xb0\x0b\x4c\xe0\xc4\x2a\xad\x16\x4b\xc5\x58\x78\x23\x50\x8b\x34\x31\x8b\xaa\xb3\x35\xcd\x0e\xd8\xd6\xd6\x49\xb5\x22\x82\x26\x08\x62\x8b\xbf\x40\x09\x7f\x68\x10\x7c\x1f\x49\x4d\xe0\x2c\x4c\x05\x18\x59\xac\x8d\x19\xf4\x26\x16\x21\x34\x0d\xb5\xe5\x79\xd5\x05\xeb\x44\x08\xe2\x60\xac\xc6\xee\x20\x09\x8c\x05\xe3\x16\x4e\xe0\x25\x05\xf5\xcb\x66\x0f\xf2\x10\x7b\xb2\x90\xbe\xd6\x16\x48\xdc\x34\x0b\x50\x40\xab\x4c\x03\x68\x00\x4d\x6d\xc1\x8b\x4f\x43\xe7\xc1\xe5\xc1\x69\x09\x44\xe6\x78\x9c\x32\xaa\x08\xf7\x8a\xff\xeb\x04\x6f\x85\xb6\xee\x41\x3b\x3a\x01\xd0\x27\x8d\x72\xef\x27\x11\x2c\xf9\x91\x5f\x18\xf0\x1e\xd0\x34\x3a\x43\x48\xe0\xc1\xd0\x13\xfb\x20\x3a\xb4\xa0\x4a\xc4\x7b\xf1\xd0\x20\x25\x8f\xfe\x80\x2a\xca\x44\x5a\x30\x46\xd9\x22\x26\x64\xe4\x66\x8c\x9c\x5c\x33\x9a\x8c\x01\x23\x20\x38\x14\x79\xbc\x5d\x9c\xf1\xde\x2b\x1b\x70\xfb\x6d\x4f\x3d\x13\x22\xfd\x71\xb3\xbb\xb9\xfb\xd3\x59\xb6\x51\x1e\x3d\x31\xd6\xc6\x26\x01\x39\x2d\x97\x97\xc7\x02\x08\x11\xb6\x00\x82\x76\x18\xa5\x63\x89\x61\x6e\x68\xec\x7b\x71\x16\xe9\xc6\x2a\x4c\x23\x0b\xdc\x04\x2e\x2d\x64\x7c\x4d\x75\x68\x69\x2b\xaa\x74\xa1\x89\x84\xd6\x2c\x0e\x21\x29\xa5\xa9\x69\x32\x94\xd9\x16\xf2\xe6\xe3\x4d\x73\xf3\xf8\x0d\x9f\xbe\xfb\xb4\x60\x2d\xaf\x94\x64\xeb\x00\x06\x95\x3c\xaa\xd6\x72\x20\x68\x44\x88\x71\x11\x40\x2c\x20\xc1\xdb\x7a\xe8\x56\xcd\x54\x2c\x0f\x94\x98\xab\x15\x18\x33\xeb\x03\x27\x75\x8b\xf7\x50\xc5\x19\xa1\x00\x0c\x8b\xa7\x3e\xd4\x96\xb5\x20\x0b\x7d\xd8\x12\x9b\xdd\xa2\x11\x67\xe5\x1b\x19\xa8\xfe\xa3\xab\x5b\x5e\x69\x64\x6a\x41\xde\xa1\xee\x63\x5e\x38\x28\x48\x9d\x34\x2b\xdf\x54\x39\xac\x88\xf1\x2a\xc0\x29\x77\xea\x2f\x5c\xa0\x82\xf3\x19\xc6\x75\xa3\xdd\x20\x5e\x97\x85\xca\x35\x26\x63\x34\x3b\x57\x0b\x96\x1e\x75\xd7\xe5\x79\xad\x5b\x71\x45\x63\xe1\x77\x18\xdc\x50\x40\x4c\x17\x82\xd4\x91\x78\xe9\x1d\xc8\x24\x81\xf7\x6a\x10\x76\x06\x42\x12\x20\x82\xc2\xf7\x0a\x99\xf9\xb0\x58\x1d\x34\xaf\x62\x16\xbc\xc5\xb2\x38\x68\x07\x55\x54\x0e\x42\xdc\x54\xf5\x08\x5a\x90\x25\x70\xd6\x57\xa3\x69\x50\x00\xba\xc0\x32\x11\x18\x26\xa5\x6e\xf4\x2a\x5e\xf2\x14\x21\x62\xd3\x85\x53\x34\xf5\x18\x56\x50\x00\x27\x2b\xa8\xfc\x86\x39\x6a\xa3\xf3\x2e\xe1\x06\x6d\x16\x94\x49\xc4\xcd\x30\xf2\xa7\x60\x6d\x36\x90\x74\x00\x4f\x83\xb1\x74\x19\x77\xed\xb0\x5a\x0e\xc3\x7e\x75\xab\x3d\x98\xa0\x03\xa7\x08\x10\x24\x6b\x05\x35\x0f\x4b\xe8\x68\x17\x2c\xb8\x04\x11\x3b\x5c\x1e\x1e\x20\xf0\x89\xb7\xaa\xe0\x14\x86\x99\x68\x5c\xe9\xa0\x31\xa0\x97\xd3\xa1\x53\xac\x5c\x9f\x37\xf1\xb3\x2d\x10\xea\x0b\xeb\xd3\xbb\x17\xd6\x67\xd3\x07\x40\xa5\x63\x2b\xb4\xab\xe4\x2c\x7e\x56\x9e\x9b\x43\x80\xb5\xe1\x05\x64\x0e\x8b\xd3\x64\xec\x05\xa4\x59\xf9\xa6\x9d\x97\xfc\xcd\x59\x3c\xaf\xbc\xa0\x29\xf1\x24\xcf\x59\xb2\x08\xff\x5b\x83\x41\x0d\xc6\x68\xf0\x5e\xdc\x05\x05\x2c\xc4\xe6\xfb\x2e\xb4\x4a\x1e\x2d\xcd\x38\xa3\x0d\x50\xe0\x4d\x51\x46\xc9\x34\x95\xaa\x58\xa4\xa8\x9c\x72\x25\x1e\xab\x2c\x38\xe4\x05\x87\x82\x82\x1b\x61\x18\x2b\x8e\x78\x2d\xb8\x58\xac\x27\x82\x28\x00\xae\x86\xf7\x47\xa1\x14\x93\x78\xc6\x64\xca\x4c\xbf\x9c\xac\x95\xf0\xd9\x87\xa5\x32\x5d\x4e\xc1\x1d\x96\x53\xbb\xe4\xc6\xcb\x89\x0c\x67\xc4\xb8\x21\x08\xf6\x89\xd5\x14\xde\xbd\x9a\xba\x81\x7e\x33\xf6\xcf\x60\xa3\xa2\xa7\x41\x80\x2a\x39\x8b\xc4\x8d\x26\x3b\x74\x12\x99\xa3\xdd\x27\xf0\xee\xa1\xdd\x4d\x1b\x6d\x64\x71\x56\x43\xb8\x65\x81\x63\x56\xa3\xb3\x35\x05\xc6\x4b\xb9\x87\x9c\x89\x89\xc4\x2d\xd0\xb1\x14\x44\x76\x63\x21\xf8\xc6\x30\x7b\x48\x60\x06\x01\x89\x93\x91\x65\x37\x2d\x51\x8f\x8a\x6c\xb1\x9e\x25\x88\x32\x81\x8f\x5d\x4b\x97\x68\x36\x11\x2a\x3f\x72\xbe\xf9\x40\x95\x22\x12\x4d\xc6\x9c\x64\xb1\xf3\x12\x74\x15\x56\x2d\x6e\x9f\xdc\x07\x6b\x5b\x22\xfe\xf1\x5b\xb9\x03\x6e\xcf\xe2\xe4\xea\x57\x51\x7f\x76\x97\xe1\x00\xdf\xb9\xfb\x95\x27\xba\x01\x92\xcf\x67\x6e\x4e\xce\xdc\xce\x71\x27\x66\x2a\xd6\x35\xfd\x38\x1a\xd7\x3e\x82\xf1\xdd\xa0\x2f\xb0\xea\x10\x6b\xc3\xc0\x0f\x9a\x65\x03\xe2\xf9\x74\xed\xa3\x7d\x41\x1d\x7a\x59\xbf\x3a\x02\x36\x06\x28\xf1\x66\x15\x33\x04\xf3\x42\x6c\x58\x21\x0c\xf5\x40\x41\x22\x7e\xa1\x38\x66\x48\x28\xf0\xde\x24\xdb\xe4\x81\x36\x5e\x0c\x23\xf6\x6a\xec\xea\x1f\xb7\xbb\xc7\xdf\x3e\x8d\xb1\x4e\x11\x9c\x04\xd4\x0e\xbc\xff\x8d\x8c\x70\xe3\xe1\x78\xed\x3c\x76\xb8\xc5\x51\xbb\x9c\x56\xa6\xa3\xd5\x62\x39\x3b\xa7\x56\xfb\xfc\x65\xa6\xa0\x1d\xc9\x09\xe2\xb8\xda\x8d\x87\xf7\x5a\xe8\x0e\xc6\xfd\x72\xdb\x34\xf5\xfd\xc3\xfa\xb2\xde\x5d\x3f\x03\xe0\xac\x08\xe7\xa3\xe3\x91\x71\xb4\xe4\xf9\xf0\xb8\x44\xe3\x92\x68\x10\xa0\x55\x11\x5e\xdd\x6a\x54\x7e\x6e\x97\x64\xe6\xe2\x9b\x74\xc2\x34\x3d\x6f\x4c\x52\x01\x51\x23\xa0\x62\xfc\xa8\x0b\x79\xa8\xdd\x04\xed\x00\x4c\x8b\x59\xa1\xc4\x51\x8d\x0d\xcb\x86\x24\x8f\x7a\x92\x45\x0d\xcb\x79\xd6\x42\xe6\xf8\x2c\x3f\xcf\xec\xec\x1b\x5b\x2d\x78\x99\x36\x0a\xda\xda\xf9\x5b\x6d\x9e\x38\xbc\x3c\xf8\x1a\x14\x91\xd7\x8b\x03\xc9\x38\x8e\x22\x75\x16\x60\xd5\x0a\x42\xc3\x72\x64\x92\xc7\x24\xa6\x85\x2a\x8e\x98\x05\x28\x56\x06\x28\x40\x0c\x9d\x00\x65\xc2\x24\xde\x85\x2a\x17\xd0\xb1\x60\x8b\x6f\x04\x30\x44\x09\xe2\x44\x40\xa8\x22\x04\x1c\x37\x96\x8e\x37\x96\xf5\xbd\xbe\xb1\xf1\xc5\xc6\xbe\x96\xc9\x4e\x17\xfb\x3f\xff\xf9\xbe\xbe\xbb\x7e\x69\xa9\xfb\xb9\x29\xe5\xa7\x23\x67\x77\xd3\xa5\x1e\x86\x2b\xdd\x4b\xd4\x10\x09\xe7\x1d\xe7\x27\x3a\x21\x3e\xcb\x16\xad\xdc\x6c\x47\xdf\x82\x3c\x1a\xdb\xf0\xc2\x55\x79\xf5\x86\xd0\x9d\xd7\xb1\x40\xe3\x59\x4b\x2d\x17\x02\xb8\x90\xef\x53\x04\x97\xb4\x8a\x8d\x2c\x3a\xd5\xae\xbc\x1e\xef\xb4\x17\x96\x4e\xe2\xe6\x2f\xb5\x9a\xb0\x6b\x75\x78\x7b\xab\xd1\x9d\xb7\xd9\x47\x16\xfa\xf9\x09\x81\x8c\x20\xef\x32\x2d\x4f\x40\x9d\xf3\x5a\x6d\x32\xdc\xe0\x90\xf8\xf5\x94\xf8\xf3\x41\x60\xcb\x37\x55\x5b\x6e\x55\x5c\x29\x15\x55\x65\x5b\x41\x3a\x5e\x63\x05\xd1\x9c\x5c\x69\x6c\x98\xff\x28\x7e\x4c\xaa\x44\x07\xaf\x0e\xca\x7e\x04\xdd\x7d\x77\xb3\xfe\xb4\xaa\x9f\x09\x34\x2e\x8b\xa9\xee\xf9\x39\x3f\x79\x13\x45\x30\x54\x07\x60\x8d\xbb\xeb\x80\xa8\xcf\xe6\x35\x61\xfa\x13\xc4\x54\xfb\x0c\xab\x18\x3a\x04\x2e\x3a\xca\x60\x5e\x16\x9f\xca\x73\x2f\x39\x01\x1c\x5f\x94\x38\x48\x72\x4d\x81\x91\x75\x21\x9a\x93\xdd\x63\x11\x72\x48\x3c\xd3\xf9\xbb\xd3\x45\xa8\x11\xc9\x92\x5d\xf2\x9c\xce\x48\x8e\x73\xc4\x27\x25\x97\x2f\x02\x2e\x6d\x74\x00\x9c\xbc\x94\x53\x38\x13\x97\x13\x8a\xdf\xc7\x22\x66\x93\x53\x6e\x63\xb8\xd9\xe3\xa3\x4d\xe9\x1c\x56\xdc\xb9\x50\xe0\x6c\x1a\x6d\x84\xfd\xed\x07\x89\xca\xcc\x29\xee\x69\x83\x65\xc9\xda\x1d\x5b\x39\xa4\x7c\x8e\x05\x64\xcd\x0c\xac\x3b\x60\x11\xa0\x15\xaf\xf9\x4d\x00\xc4\x1a\xac\x39\x80\xae\x82\xb5\xa7\x4d\xa0\x99\x8c\x22\x6b\x5a\x33\xcb\xfa\xa1\x3c\xda\x16\x59\x85\x76\xd9\x0e\xaf\x35\x3c\x82\x56\xc9\xe3\xf8\xf0\x0e\x5e\xca\xf0\x5a\xc3\x9f\xef\xa7\x45\x7b\xa8\x04\x91\xc8\xca\x40\xd2\x86\xf6\x12\x25\xa0\xbf\x03\xe0\x21\x26\x56\xad\xe7\xac\x07\xcf\x44\x19\xf6\xdd\xe7\xa8\xe4\xd4\xd7\xa6\x7d\x02\xeb\x5e\x24\x7a\xce\xd9\xdf\x9e\xa0\xb6\xd9\x78\xc8\x85\x39\xc5\x25\x46\xb9\x8d\x7e\x76\xb4\xeb\xc1\x0b\xf9\xc1\xdd\x42\x7b\xf5\x81\x3c\x0f\x82\xa7\xa3\x2d\x47\xa1\x7c\xea\xbb\xf8\x66\x5e\x71\xb9\x6d\xb6\xbb\x3f\xdc\xac\xfe\xb4\xde\x3d\xb7\x87\x63\x05\x95\xab\x1d\x54\x41\xce\x83\xba\xbd\x04\x79\x7a\xc2\xcc\x71\xb7\xdd\x61\x06\xc8\x2b\xb3\x60\x41\x2b\xaa\x08\xe8\x6a\xe2\xbd\x84\xba\xf3\x02\xa6\xd9\xaa\xd1\xe0\x03\xff\xb7\x40\x07\x81\x54\x84\x44\x8a\x02\x54\x59\xf6\x8e\x4d\x7f\x74\xd7\x65\x1c\x97\xa2\x2a\x6d\x78\x94\xe4\xe8\xc8\x40\xac\x87\x21\x12\x98\xd1\x56\x51\xa2\x5d\x35\x72\x94\x2b\x8f\x51\x1c\x85\x6c\x17\xa6\x12\x38\x09\x9e\xed\x25\xc2\x76\x2d\xb1\xd7\xcc\x01\xa9\xdb\x82\x71\x1a\x50\x8d\xd2\x39\xc9\x1e\x81\xac\x3f\x85\xbb\x05\x30\xca\x20\x38\x2c\x8f\x20\x04\x4f\x17\xa2\x59\x60\x94\x43\x1c\x0b\x2e\x1c\xce\x32\x71\x61\x98\xc0\x29\x00\x85\x22\x26\x41\xbe\x96\x8a\x0b\x88\x89\xd5\x72\x57\xde\xd7\x4a\xda\x28\x28\x38\x09\xc6\xaa\x35\x12\xae\xa9\x36\x12\x2a\x8a\x1f\xed\xb0\x40\x95\xa0\x5d\x55\xc5\xd2\xa2\x1c\xdf\x89\x16\x72\x01\x28\x01\x0f\x30\xef\x8f\x02\x46\xfb\x3e\x66\x2b\x71\x50\x40\x6e\xe4\x4a\xa4\xf4\x8a\xe5\x74\x0f\x82\xd5\x1c\xe5\x30\x38\xd6\x06\x72\x5c\x96\x43\xc8\xd3\x7c\x1f\x13\xf8\xa3\x28\x46\x30\x41\x9c\xf2\xd2\x81\x8e\x66\x12\x84\xc7\x74\x18\xe5\xa8\x28\x8a\xc1\x8f\x69\x0e\xb1\xd5\x87\xf1\x3b\xfa\xe0\x2c\x80\x27\x6d\xc6\x83\xed\x8b\x04\x1a\xdd\xe7\xc0\x42\xd6\x1f\x9b\x6d\x6a\x67\x3b\x49\x28\x23\xdb\x14\x37\x75\x06\x88\x9e\x9c\x6a\xe4\x89\x91\xb9\x1e\x9c\xfe\x0c\xb4\x98\xaa\x8b\xc8\xc7\xd3\xfc\xc6\xb9\x96\x73\xdb\xf8\x7a\x89\x64\x7a\x1a\x73\xb9\xbd\xff\xf6\xd3\xf6\xb2\xb9\xb9\xff\xb8\x7d\x4e\x5b\x20\x01\x9c\x9e\x0b\xf3\xaf\x8d\x90\x6d\x8e\x6d\x91\x23\x23\x1a\x54\xd5\x9c\xe5\x5f\xde\x11\x50\x51\x16\xae\xa4\x93\x72\x6f\xbb\xc4\x6a\x4e\x6e\xe9\x8f\x64\xc8\x25\xb3\xf4\xa8\xe2\x1c\xcd\xd2\x03\xb9\xd9\x00\xaa\x03\x8d\x60\xdb\x6c\x08\x7c\x6a\x00\x49\x4e\xba\x67\x72\x77\x8d\x07\xf0\x6f\xf4\x12\x71\xa9\x3e\x9c\x11\x9a\x36\x24\x5c\x6c\x78\x1c\xa3\xdd\x10\xa4\x77\x82\x80\x4c\xa8\x48\x62\x77\xf1\x1c\x54\x9e\x07\xc7\x08\xa8\xb6\x15\xb2\x19\xda\x81\x51\x2b\x5e\x06\xd6\x1b\x13\x54\xcc\xd6\x88\x85\xfb\x81\xb9\x06\x84\x7c\x30\x5c\x26\x68\x64\xbd\xb8\x2b\xd6\xce\x73\xb8\xb0\xd7\xc0\xf0\xbd\x6a\x79\x73\x75\x7e\x43\x4b\x9f\xad\x6f\xe5\xe4\xd1\xf7\xa4\x26\x94\x2f\x00\x2a\x55\x5c\x86\xf9\x34\xb2\xd1\x29\x02\x07\x49\x2c\xc1\xb0\x0c\xf3\xb4\x74\x73\x0f\xde\x4e\x2a\x74\x62\xd9\xb0\x34\x2c\xf0\x4e\x5e\xca\xb5\x8c\x31\x73\x6e\x95\x9f\xbc\x35\x28\x10\xd8\x66\x49\x24\xb3\x71\xb2\x1b\xf8\x60\x61\xfc\xd3\xae\xfe\x3c\xaf\xef\xae\x9b\x89\xac\x5e\x9e\x1b\xbb\xd6\x12\x98\xda\x48\x5a\x27\x38\xec\x0b\x29\x1d\x2b\x8c\xec\xe9\x85\xd1\xb8\x30\xc2\xb7\xb7\xcc\x3c\x55\xd8\x5b\x5a\x66\x9f\x6c\x59\x3c\xbd\x30\xf7\xd4\x98\xbd\xa5\x30\x3f\x8d\xfc\x70\xd3\x3c\xae\x77\xcf\x5c\xfb\x18\x85\x83\xd3\x51\xb9\xf1\x31\xe6\xcd\x8b\x71\xba\x29\xb1\x96\x3c\x8f\x63\xd4\xcd\x17\xce\xde\x4f\x5a\xee\x46\x91\x19\x58\xc0\xe5\x2a\xde\xde\x89\xe9\xe9\xd3\x87\xed\x11\xc4\xa0\x03\xfa\xbe\x40\x3d\x0d\x23\x64\x82\xf3\x2b\x2d\x97\xf8\xfc\x67\x8e\xd7\xa3\xaa\x19\x22\xef\x1f\xad\x50\x60\x59\x10\x75\xe0\x07\x97\x86\x1e\x35\x0e\x60\x65\x83\x16\x00\x32\x0b\x21\x3f\x5a\x41\x45\xcb\xf5\xa2\x13\x53\x75\x77\xb8\xe9\x95\x98\x88\x24\x96\xc3\x12\xc2\xf2\x60\x32\x85\x2c\xbb\xc4\x91\xd5\x9f\x34\xfc\xea\x83\x68\xd4\xcc\x6c\x90\x6a\x94\x7b\x63\x34\x07\xeb\x8c\x4a\x93\x97\x32\xe5\x6c\x07\x0f\xd7\xf5\x8a\x14\xa0\xcf\x20\x37\x1d\xbb\x93\x40\x8d\x06\x9c\x99\xe5\x80\xa5\xf9\xd9\xee\x68\x87\x6a\xde\x45\x53\x09\xc4\xd6\x2d\x10\xd7\x91\x63\x67\x54\x05\x1a\x9c\xc4\x90\xb0\x39\x22\x55\xfb\x6c\x87\x40\x42\x47\xda\xfa\x00\x35\x56\x65\xb7\x23\x16\xea\xa9\x7d\xb6\x59\x2b\x10\x48\x62\x89\x4b\x10\xa4\xd7\xa1\xef\x75\x5f\xff\x9b\x75\xa1\x1f\xbf\x3c\x4d\x4f\x18\x95\x87\xa9\xbd\xe6\xc1\xc4\xba\x35\xa1\xda\x9b\xc1\x29\x44\xfb\xd9\x7b\x06\x36\x47\x9a\xf1\x69\x74\x5b\x62\xc6\xc7\x06\x7b\x3d\xa9\x5a\xbe\x7b\xcf\x32\x8e\x60\x48\x22\x45\x94\x56\x35\xa3\x6b\xe6\x80\x7a\x28\x4c\xb4\x47\x5c\x01\x8c\x51\x4e\xc2\x0e\xf7\xaf\x24\x98\x19\xbf\x38\x75\xe1\x0f\x80\xe3\xbc\xc4\xd2\x24\x3f\x12\x7d\x44\xab\x69\x3a\xc1\x6f\x24\xee\x0c\x00\x97\x83\x1e\xfc\xce\x07\xff\xa7\xee\xe3\x25\xcc\xa3\x41\x85\x71\x64\xb0\x3a\xa4\x0d\xb9\x95\x1d\x4e\x50\xfb\xd9\xa9\xd0\x2b\x05\x8f\x13\x1d\x09\xc3\x46\x1f\x88\x01\x0f\x55\xbd\x99\xd5\xfa\x61\x35\x42\x04\x32\xe0\x2c\x1f\xca\x41\xcc\xd0\xa6\x4a\xe5\xc5\x38\x24\x09\x23\x33\xa1\x09\xec\x31\x09\xf5\x54\x70\x93\x72\xfe\x8f\xd2\x1f\xd7\xa6\x47\x2d\x1b\x5d\xe8\x54\x7d\xe4\xbf\x23\x34\x92\x75\xe2\xf2\xb0\x8e\xeb\x39\xa1\x99\x71\xd8\x4c\x81\x75\x51\x41\xae\xc7\x2b\x39\x4a\xaf\xb2\xba\x2a\x43\x51\xe5\x9f\x33\xac\xe4\x8c\xa2\x3a\x68\x9c\x87\xef\x24\x76\x56\x64\x21\x5c\x92\x62\xf7\x39\xaa\xa8\x23\x20\xcd\x22\x7f\x15\xfb\x60\x93\xed\xa7\x74\x0a\xba\x46\x1a\x37\x5a\x49\x8c\xe1\x97\x98\xdc\xd2\x0d\xc7\xaa\xfd\xee\x14\xc6\x3b\xe6\x6f\x2e\x4e\xf8\xdb\xc0\x6e\x87\x6b\xcd\xa6\xb5\x63\x0e\xe7\x4e\x8a\x16\x56\x92\xb5\x55\x69\xb8\xf7\x4a\xe4\xdc\x08\xf6\x34\xde\xf5\xdc\x75\xd9\x90\x6f\x49\x08\xe0\x34\x32\xc9\x15\x05\xbd\x91\xc0\x51\xfc\x18\x9e\xd2\xe0\x51\xd6\xf4\x9c\xff\x6d\xc9\x96\x98\x27\xbe\xcc\x96\xe6\xa3\xd9\x6c\xbf\x7b\x65\xa5\x4f\xf0\xa4\xb9\x4c\xd6\x84\xff\x39\x7c\x93\x7d\xc7\x84\x23\xd9\x3c\x94\x79\x52\x04\xe5\x77\x34\x6e\xd9\x7c\x58\x26\x94\x47\xbe\x74\x1e\xe8\x3e\x7e\x65\xdd\x13\xfe\x03\x5e\x08\x45\xa6\x4c\x0f\xa7\xac\xb4\xb1\x96\xf6\xc5\xe1\x9d\x44\xf7\xed\x2b\xab\x8e\x13\x45\x64\x18\xe1\x0f\xab\xd7\x95\x93\x26\xa2\xce\x1f\xeb\xbb\xe3\xa7\x30\xa7\xda\x9c\x5b\x10\x17\x88\xbc\x03\x80\xaf\x73\x0c\xbd\x83\xe5\x2e\x8a\x15\xa2\xb3\x9b\xaa\x26\x39\xb6\xe4\x47\x3f\x56\x0e\x3c\x2d\x10\x82\x17\xf1\xcd\x94\x18\x8d\x02\xb3\x2d\xdb\x39\x2f\x0b\x33\x1b\x15\xac\x1c\x98\xa4\x8c\x9b\x96\xcb\x33\xef\x34\x17\x6c\xe4\x2a\x2a\x95\xc8\x94\xd2\xdc\xab\x0f\xae\x35\xc7\x4f\x6d\x74\x67\x53\x81\x77\x9b\x6a\x41\x62\x4a\x9d\xc0\xf2\xee\x45\x5c\x2a\xc5\xab\x0f\x86\x72\x80\x6d\x93\x1a\x2d\x52\xbd\x13\x97\x0a\xc7\xe2\x77\xe4\xbd\xc7\x01\x4a\x9c\x2e\x75\xf8\xe8\x4c\x3e\x81\x04\x4e\x4c\x1a\x6d\x68\x24\x7c\x98\x44\x19\x1e\x19\x68\xc8\xa3\x91\x57\xaa\xcf\x74\x34\xa7\xdc\xe7\x36\xc3\x8c\x6a\x94\x51\x0d\x33\x1e\xf2\x1c\xcd\xa8\xf3\x0d\xf1\xfb\x3a\xdb\x39\xff\x88\x5e\x24\xf6\x9a\xe3\xe6\x88\x2d\xaa\x55\xae\x41\x89\x6f\x0b\x36\xcd\x8a\x2c\x54\xe5\x90\xee\x28\x46\x5d\x72\x62\x48\x82\x2f\x7d\x74\xa4\x72\x51\x24\xe1\xdf\x5d\x86\x91\xa6\x30\x2b\x6f\xbe\x6d\x0e\x3d\x66\x0f\xb5\x2d\x72\x1a\xd7\x52\x56\x7c\x68\xf1\x7b\x87\xc0\x76\x4e\x46\xac\xfc\xbb\x01\x48\x5f\x37\x04\x8d\xc4\xfe\x43\xd1\xed\xba\xc7\xf8\xc2\xbe\xed\xa0\xac\x28\x34\x87\x2f\x8a\x7c\x25\xc9\xf4\xe5\x2c\x92\x1c\x85\x57\xe0\xe3\x38\xab\x94\xbb\x10\x1d\x0d\x5b\x20\x17\xb4\x2c\xbb\x14\x0d\x3c\x34\x7b\xe2\x93\x71\xf9\x65\xf7\xb0\xdd\x7d\xd8\xee\x9f\xc1\xc2\x14\x40\x67\x24\x88\xa3\xad\x91\x06\x56\x83\x99\xaf\x2f\x4c\x05\xac\x29\x86\x39\xa6\xa5\x83\xe8\x1b\x89\x4f\x42\x30\xd9\x00\xaa\xa9\x4a\xc2\x02\x43\xae\x48\x85\x61\xd8\x3d\xa0\x34\x94\x61\x99\xa1\x41\x58\x88\x6f\x6c\xf4\x4b\x0c\xf3\xb6\xb2\x20\x81\x71\x5e\x90\x32\x49\x55\x0b\xde\x43\x99\x33\x58\x09\xbf\xf7\xfc\xe9\xab\xe6\xea\x16\xd9\x10\x25\xcd\x31\x2c\xa5\x97\x4d\x8e\xc1\x33\xe8\x9b\xce\x0d\x2b\xbf\x96\xa6\x73\xdf\x8c\xe5\xfa\x90\x79\x94\x1d\x37\x90\x26\x62\x70\xeb\xbd\x82\x76\x89\x69\xde\xd7\x17\xd4\xa8\x7b\x4f\x88\xf7\x94\x16\x02\x3e\x7d\xaa\x66\x3b\x24\x8e\x66\x7b\xf7\x34\x5d\x78\xe5\xe7\x44\x7b\xbb\xa1\xa5\x1f\xe1\x13\x94\x68\xbe\x56\xf9\x25\x8d\xfc\xeb\x37\x76\x49\x34\x3f\x45\x12\x1e\x09\xa5\xa6\x52\x38\x84\x61\xd6\xa4\x68\x69\xaa\xf1\x8d\x70\x35\xbe\x11\xb6\xe5\x76\xc3\xa5\x64\x39\x5e\x6e\x6c\xed\xfc\x24\x70\xbe\x56\x60\x1d\x81\x0b\x13\x7e\x47\xf1\x3b\x32\xdd\xd3\x14\x3f\x51\xfe\x90\x27\x7a\xfe\x23\x3f\xfb\x3f\xf8\x69\x8a\x6c\x27\xa0\x5a\x8f\xc5\x59\xab\xb0\x7a\xcb\xbc\x20\x15\x77\x27\xf4\x6a\x09\xf0\x67\x9c\x1f\xf1\xb0\x35\x73\x32\x7b\x37\x27\x5c\x92\x11\xf7\x5a\xdc\xb8\x25\xfa\x0d\xed\xdd\xe6\xb5\xa1\xbb\xa7\xf7\x5e\xff\xb4\x7e\xac\x6f\x9a\xa7\xe1\xf9\x0d\x29\x3f\x2f\x5b\x44\x2a\xbe\xc2\xd6\x26\x0e\xc1\xb6\xbd\xc4\x30\xa6\xb7\x18\xc7\x0d\x06\x35\x29\xb4\x73\x0a\x43\x09\x7d\x3e\x72\xdb\x3b\x9d\x7e\x8b\xe2\xe3\x39\x8b\x37\xe3\xe2\x89\xe6\x98\xce\x56\xfc\x48\x9b\x3a\xd7\x54\x7d\x40\x69\x68\x1a\x59\x7f\x63\x1a\x19\x61\xdf\x46\x6d\x27\xb9\x68\x6c\x20\x2e\xfe\xdf\x2f\xe6\x7a\xeb\x81\xe8\xe1\x76\xea\x72\xbb\xbb\x9b\x5a\x88\x94\x9a\x09\xbd\xfd\xf2\x66\x7a\x47\x15\xcf\x78\x47\x35\xd6\x99\xde\x77\x47\x65\xdf\x7e\xe1\x35\xbd\xa3\xb2\x6f\xef\xe6\xe4\x8e\xaa\x6f\xd9\x59\xee\xa8\xfe\x79\x57\x3f\x3c\x67\x11\x24\x9e\x42\xcc\xca\x73\x94\xe8\xd8\xa3\xf2\x44\xab\x69\x41\x82\x61\x43\xe0\x5d\x4d\xc0\x7f\x74\x57\xf8\x96\xe5\x22\xf1\xed\x34\xc0\x6b\x07\xa2\x38\x88\x1d\x8e\xfd\xed\x42\x02\x02\x1a\x9a\xdc\x7f\x8d\x6f\xa7\xe6\xe8\x21\xd8\x06\xa3\xc6\x38\x1b\x35\x43\x75\xed\xbb\xfa\x80\x39\xf6\x30\xcd\xb1\x02\xe3\x17\x56\x14\x34\xc7\xa2\x26\x44\xdb\xd5\xdc\xca\xba\xac\xc8\x39\x16\x9f\x1c\xb1\xe2\x2e\xda\x3b\xab\x7f\x06\x8c\x5c\x67\x38\xab\x50\x7c\x4a\xc9\x03\xb9\x46\xf3\x6b\x1d\xb3\x64\xcc\x32\x9c\x81\x50\x43\xf4\x2c\xc5\x55\xad\xbd\x35\x26\x55\x35\xd9\x93\x8d\xd2\xf0\x25\x90\x03\x3f\x83\x48\x87\x98\xd7\x45\x4d\x6f\xe7\xe2\x94\x23\x32\x3b\x30\x86\x45\x3c\x8a\x60\x42\xa3\x13\x24\xfe\x6f\x61\xb8\x17\x64\xc7\x7a\xba\xd8\x7b\xf8\x45\x7a\xcd\xc8\xbf\x71\xc7\xb6\xed\x51\xa7\x77\x8d\x0e\x60\xf8\xbf\xc9\x69\x01\x81\xcf\xde\x4a\x36\x28\x0c\x50\xf9\xa6\xc5\x71\x5a\xb4\x9f\x1b\xa0\x69\x4c\x97\xa2\xe8\x37\xef\xd4\x8b\xfa\xee\xfa\x61\x55\xdf\x3f\x6b\x33\xfb\x8b\xda\xab\x89\xea\x82\x78\x2a\x05\x4e\x70\x14\x0a\xb5\x2c\x2b\x70\x8b\x20\x83\x1c\x21\xce\x29\x02\x8a\x25\x59\x20\x1e\xbf\x81\x92\x99\x15\xc8\xd9\xa0\x48\x0a\x52\x4b\x88\x87\x0b\x4b\x70\x51\x03\xf9\x85\x41\x39\xe7\x8b\x8d\x36\x60\x83\x84\x53\x2f\xdd\x88\x0b\xd7\x91\x51\x0d\x4d\x5f\xfb\x3c\x64\xff\xe9\x40\x7a\xd2\x18\xf9\xfc\x48\x79\x0b\x2b\x1a\x7b\x6c\xb8\x56\xc5\xb5\xce\x06\xcd\xe3\x61\x79\xbb\x84\x72\xb6\x3d\x9e\xc4\x06\x5f\x02\x73\x14\xc6\xe0\x10\x8c\x80\x0a\x1c\x12\x3c\x0f\x66\x28\x53\x2a\xdf\x1e\x1f\x06\x51\xba\xd2\x3c\xb2\xaa\x95\x58\x2f\xab\xc0\x95\xf6\xe7\xd9\xd4\xd4\x62\x61\x3c\x9e\xc4\x9c\x71\x58\xa3\x06\x43\x0b\x81\xdb\x90\x51\x73\x49\x1b\x88\x65\x90\x06\x2e\x1b\x1d\xd8\xb8\x88\xa2\x96\x86\xb9\xd4\xbd\x20\x0f\x26\xbf\x18\x7a\x90\x88\xfb\x80\x10\x80\xf1\xaf\x3f\x26\x9e\x0a\x17\x7f\xa8\x1f\x1e\x9f\x59\x6d\x22\xe0\x93\xdf\xd3\xc6\xee\x69\x73\x54\x70\x3f\x75\xf1\x74\x4e\x47\x26\x47\x1c\xe1\x9d\x72\x1a\x0f\xc3\xbf\x9d\x7a\xb8\x5d\xd9\x16\x7b\x12\x1e\xc7\x9f\xa6\xf9\x4d\x95\x2d\x3a\x5d\x09\x9e\x13\x95\xa4\xcc\x65\x5c\xb5\x4a\xf5\xa9\xda\xb1\x1d\x8c\x5f\x1b\xb1\xc5\x1c\xa0\xaa\x7c\x89\x22\xf5\xd6\xeb\x4c\xb4\x02\x74\x44\x7b\x3b\x51\x1a\x4d\x35\x3f\x29\x86\x80\x3f\xa6\x2d\x9e\x44\x4c\xcf\x6e\x6a\x6f\x22\xa4\xd7\xdd\x4a\x9d\x4a\x44\xcf\x5e\x3e\x75\xed\xb4\xd2\xcc\x03\xea\x17\x4f\x60\x3f\x5f\x6f\x8f\x78\xf3\x36\x82\x78\xdd\x3d\xd2\xa9\xc4\xf0\xdc\xc5\xd1\x90\xed\x6c\x77\x8f\xbb\xfa\xe6\x38\x26\xa1\xd4\xec\x04\xb6\xc0\x83\x75\xc7\x5c\x21\x8b\x3d\xa9\xdd\xd1\xe4\xe8\x8d\xb7\xc3\x86\xf7\x23\xd9\x0f\x07\x5b\xa1\x82\xca\xe5\xfd\xec\x88\xef\x25\x44\x25\xbb\xf2\xb2\xdd\x0c\xa3\x97\xb0\x86\xc3\x83\xdd\x2a\xf2\x07\xe2\xb2\x65\x5b\xbb\x23\xf2\x2a\x82\x89\xf5\x91\xf6\x1c\x3d\x3c\x27\xc5\x15\x2c\xa5\xae\x77\xc9\x96\x34\x02\xb7\xb4\xaf\x00\xb7\xb4\x43\x3c\xe1\x36\xdc\xe0\x3c\x2e\x05\xd1\xec\xcd\x0c\xf7\x5c\xad\xf9\x20\x5b\x2b\x4f\xb9\x19\x6c\x75\x02\x9d\x63\x43\x3b\xbf\xc6\x37\xb2\x75\x6a\xde\x44\x47\xf9\x74\xce\x17\x94\x6c\x9d\x4b\xd9\xb3\x65\xeb\xe4\xdd\x75\xe0\x0e\xd6\xe7\x15\x10\x29\xdb\x98\x1c\xd7\x7c\x50\xa2\xf8\xaf\x0c\x5c\x51\x9f\x12\x1d\xfc\x42\xee\x18\x29\x09\x46\xea\xdb\x3d\xc6\x7e\xda\xad\xd7\xcb\x9b\xf5\xd7\x67\x16\x85\x28\x15\x03\x8f\x3b\x8d\xcb\xc1\x49\x03\x6a\xdc\x94\x7e\xf3\xa8\x70\x6f\x0b\x41\x43\xca\xb8\xba\xd5\x46\x33\x0b\xa6\x38\x7f\xc3\x16\x5e\x36\x08\x7d\xd9\xa0\x6c\x35\x80\x40\x73\x07\x71\x89\xc3\xa0\xe2\x63\x4f\xc2\x30\xf5\x45\xdc\xdb\x91\x2b\xa2\x05\x5a\x52\x82\xb8\xf1\x60\x26\xc2\xa9\xcf\xb5\x24\x88\x73\xac\x96\x84\xc3\x6f\x37\x13\x77\xb5\xb2\x72\x69\xfa\xd5\x07\xab\xe2\xdc\xef\x69\x9e\x31\x2b\xa9\x9a\x23\x2d\x31\x4e\x5d\x79\x4e\x10\x40\xac\x4a\xe3\xdb\xfe\x6a\x4f\x73\x53\x76\x95\x33\xbd\x5d\x12\x31\x46\xce\xb2\xe3\xfe\x5d\x06\xa9\xe3\xa3\x35\xa3\xe8\xfd\x85\xba\xc1\x96\x84\x6d\x54\x39\x7f\x6c\x4b\xf2\x6f\x76\x2c\xff\x5b\x10\x20\x57\x52\x6c\x07\xe7\x21\xbf\xb7\x09\x27\xe2\x3c\x51\xbd\x62\x9e\x5e\x67\x13\x73\x02\x35\xbd\xce\xe4\xe5\x04\x4a\x7a\x4e\x0c\x39\x72\x83\x39\xaf\xef\xae\xff\x65\x57\x7f\x7c\xee\x16\xb3\x4a\x62\x2b\x59\x78\xea\x20\xa0\x07\x4c\x2b\x0d\x28\xf1\xe7\xac\x46\x56\xd3\x09\x30\x0a\xe0\x92\xfc\x55\x40\xd2\x90\xb8\xb7\xf1\x86\x60\x42\x7e\xb4\x73\x96\x14\x6f\x4e\x06\xac\x53\xa6\xf3\x17\xac\x74\x8b\xad\x64\x48\x09\x2c\x8f\x3c\xba\x8a\x63\xd2\xe0\x70\x26\xbe\x62\xa6\x30\x8e\x40\x81\xe1\xdf\x43\xc2\x95\x46\xa8\x3c\x58\x6d\x33\xe4\x59\xd4\x22\x5c\x58\x88\xf6\x81\x45\x20\x41\x56\x4c\x62\x64\x1b\x6b\x72\x40\x02\x09\x47\x85\x3d\x94\xf2\x60\x11\x0e\x30\xdb\xe0\x0c\xb0\xfe\xe8\xc0\xb9\x1a\x12\x41\x1a\x1c\x4e\xa0\x1c\x94\x89\x61\xf2\x01\x3b\xc8\x40\x70\xda\x03\x9a\x19\x39\x90\xa0\x21\xbd\xf3\x55\xde\x03\xe3\x5e\x3b\x70\xdc\x11\x41\x6c\xee\x2f\xfd\xfb\xf1\x96\x70\xb7\x5e\x2c\x30\x59\xc9\xb1\xfd\x5e\x6b\x05\xa6\xcc\xcd\x90\xe4\x76\x5b\x9e\x79\x89\x70\x3f\x94\x21\x90\x73\x32\x1b\x6a\x12\xf8\xa4\xfc\xcc\x5f\x3b\x20\xed\x20\xd0\x4a\x13\x98\xc0\x1b\xbf\xd7\x46\x47\x20\x23\x26\x3f\x1a\x2b\x30\x69\xe6\x20\x28\x07\x3d\x64\xa7\xa0\x76\x06\xbf\x0f\xe2\x4b\x5f\xc0\x8f\x73\x9f\x96\x3c\xee\xab\x4a\x83\x0d\x12\x8d\xb0\x05\x64\x7e\x40\xb0\xa9\x45\x62\x4b\x0a\xf7\x5c\xe9\x06\x21\x2e\x23\x44\xe4\xec\x14\xe5\xcc\x25\xb4\x1f\x40\xe0\x4f\x5c\x86\x2e\xe0\x7f\x83\xdb\x7b\x88\x49\xbe\xc1\xaa\x01\x0c\x1a\xe4\x64\x56\xb0\xfd\x7a\x21\x05\xa3\x06\x43\xab\xec\xf6\x85\xe0\x32\xe2\x96\x03\x1f\x1b\xc1\xe0\x9c\x53\x58\x22\x42\x0c\x35\x66\xa3\x88\x54\x7c\x4b\x1a\x8c\x59\xe5\xb3\x4b\x04\x27\xa1\xe8\xe5\xdf\xd3\xf1\x0d\x9f\x58\x5b\xbf\xbf\x5f\x3f\x67\xcc\xcf\x53\x17\xc1\x85\x59\x07\xa7\x56\x98\x69\x3a\x08\xae\x36\x4c\x5d\xf2\xc8\x0b\xc0\x82\xf7\x9a\xc0\x5b\x65\x80\x52\x7e\xe4\x37\x5e\x7c\x4a\x83\xe7\x34\x93\x1f\xfd\xae\xee\x35\x58\x3f\xe3\x95\xa9\xcc\x01\x55\x0c\x51\x2c\x7e\x96\x18\x20\x5a\x5e\x35\xc4\xf2\x38\x17\x2f\xb8\x69\x18\x35\x41\x90\xe0\x54\x02\xde\x5d\xb6\x43\x39\xc1\xde\x23\x48\xf5\x68\x4d\xeb\xf6\x04\xcb\xc6\xcb\xec\x22\x18\xf9\xe9\xe4\x78\xd9\x82\x93\xe5\x17\x57\x72\x5c\x2b\x86\x46\x9e\x17\x93\x57\x41\xc2\x98\x37\xe2\xc5\x28\x0b\x2d\x9d\xbc\xd0\x56\xa8\xc5\x89\x95\xa9\x47\x87\x0c\x64\xe8\xa2\x46\x03\xce\x5f\x31\x1f\xc3\x28\x2e\x08\x54\x4f\x16\x8e\xe6\x19\x57\x0e\xaa\x98\x0f\x98\x57\x5a\xe2\x1c\x22\x6b\x3d\x55\x60\x76\xa7\x1d\xc4\xc0\xab\xc7\xfd\x68\x38\x2f\xab\x1e\x21\xdb\xe4\xa0\x07\x4a\x35\x82\x60\x43\x75\xa2\xae\x75\x9d\x95\x89\x2c\x01\x47\x07\xa2\xb3\x3a\x03\xb2\xb7\x60\x6f\x07\x71\x9b\x20\xe0\x0a\x28\x71\x22\xb1\x94\xce\xd3\xe8\x82\xb2\xe0\xcc\x02\x09\x64\x30\xcd\x92\xe7\xac\xce\x91\xe3\x73\xe0\x78\x14\xb8\xcb\xe4\x54\xb5\x44\x0f\x46\x96\xd9\x5e\xa3\xe1\x36\x09\x3d\x77\x14\x6f\x72\x0e\xeb\x64\x51\xf9\xba\x6c\x43\x2e\x24\x4a\x21\x01\xac\xe5\x75\x93\x01\xa3\xc4\x08\xa6\x80\x8b\x15\x6e\xbc\x67\x5e\x78\xc9\x0c\x8a\xc4\x28\x29\x09\xf4\x9e\x80\xe3\x16\x23\xfd\xae\x45\xf4\xbb\x9b\x66\x7d\xf5\x04\xc8\x71\x7f\xa4\x00\xb4\x44\x6a\x74\x14\x97\xed\x34\x0f\x10\x2f\x3d\xb0\x0e\x82\xac\x35\x31\x2b\x57\x7e\xd5\x69\x91\x95\xaa\xf6\xdc\xc6\x95\x48\x1c\x62\x01\xc2\x83\x28\xff\xe6\x4c\x99\xb1\xf0\x73\x43\x15\x98\xff\x79\xf7\x3f\x1f\xff\xe7\xe3\x2a\x6b\xab\x51\xb7\x9f\x68\x84\x70\x99\x6b\x37\xaa\x6d\x45\xf7\xef\x5f\xbe\x13\x38\x02\xf0\x8d\x03\xaf\x1c\xd8\x39\x89\x73\x20\xa7\x47\x56\x0e\x03\xa4\x45\x54\x7e\x83\xb4\x8f\x9b\xb8\x34\xd5\x5f\xde\xae\x2b\x90\x22\xbb\xaa\xda\x1e\x18\x25\xff\x7b\x30\x5a\xfe\xd6\x66\xaf\xed\x46\xfb\x25\xd9\xbf\x7c\x27\xe0\x2a\x8a\xec\x9e\x59\xc7\xc6\xb0\x00\x66\x57\xd2\x4d\x48\xba\x02\xd1\xcd\x75\xa6\xe0\xb0\xd2\x15\x33\x78\x10\xcf\x49\x7e\xa9\xdb\x97\x79\x30\x2e\xdb\xa2\x20\x63\x2b\xf1\x5f\xd8\xfd\x75\x42\x57\x68\x62\x56\x4e\x8a\x77\x11\xae\xaf\x02\xab\x31\x8b\xf9\x6e\x4f\x1b\x02\xba\x64\x16\x25\xe6\xe5\x92\xaf\xf5\xdb\x55\xe9\x84\x0a\xcd\x78\xec\x78\xd0\xaa\x95\xf4\x9e\x45\x5c\xa9\x54\xe1\x43\x05\x36\xeb\x78\x5c\xb9\xa6\x39\x67\x3c\xa1\x9a\x91\xe0\x26\x27\x14\xc8\x63\x2d\x5b\x8c\x96\xd2\x35\x3e\x8c\xfa\x38\xe7\x7c\x27\xd4\x32\x3e\x54\x12\x0a\x70\x4c\xc2\x5c\xcf\xb0\x07\x1b\xde\xe9\x2f\x25\xa6\x2b\x8a\x5b\x95\xb8\x76\x75\x7f\xb9\x13\x6a\xf5\xc7\xfa\x16\xcf\xdd\xb7\x30\xd1\x47\xc8\x81\x5f\x09\x51\x2a\x14\xf2\x10\xe0\x4d\xde\xaa\x32\x3d\xeb\x4c\xd0\x3d\x65\x26\xb1\xe4\x93\xcf\x54\xfb\xf9\xb8\xfe\xd7\xe9\x42\x84\x90\x94\x3d\x30\x95\x9e\xa5\x38\x48\x25\x23\x11\x38\x86\x96\x99\x24\x61\x1c\x05\xcb\x48\x2d\xcb\x48\x2c\x86\xa4\x45\x2e\x93\x97\x64\xec\x57\x6f\xb7\x62\x55\xcb\x70\x1e\xb4\x2c\x62\xdd\x2e\xe2\x6e\x0d\xcb\x78\x53\x37\xde\xdd\x3c\x3f\x74\x03\xaf\x0e\xeb\xe5\x85\x3c\x99\x28\xa8\x27\xfe\x6e\xc6\xda\xda\xdb\xa5\xa0\x9f\xcd\x3b\xc8\xb5\x8c\xaf\xa8\xb5\xa5\x84\xef\xf2\xb0\x22\xb3\x45\xd7\x64\x49\xd3\xcd\x39\xed\x95\x93\x34\xbd\xe4\xcc\x9e\xa7\xbf\xff\xf4\xe9\xe9\xbd\x82\x05\x0d\x7b\x69\x78\x93\x17\x6c\x01\xa3\x1c\x0b\xca\x4e\x39\xb9\x41\x6f\xf2\x05\xd8\xbe\x02\xdf\xe8\x24\xd6\xec\xbe\x41\x6e\x3d\xd8\x85\x61\xba\x4a\x97\xc6\x40\x54\x91\x3f\xb7\x2a\x82\xa0\xd6\x07\xf0\xdc\x8b\x4b\x29\xde\xa9\x5c\x4b\xfb\xcf\x5f\x2e\xf2\x70\xbe\xf9\x4c\x12\x82\x92\x76\x6d\x34\x5e\x66\x3f\xc3\x24\x92\xaf\x03\xa7\x78\x8b\x31\x7b\x04\x94\x35\xef\x14\xef\x40\xa8\x32\x27\xb7\x0b\x39\x77\x01\xda\x4b\xcf\x50\xb8\xb9\x68\xd5\x76\xc1\x4d\x76\xcb\xb0\x21\x08\x0b\xde\xb6\x2b\x2e\x85\x20\x35\xc4\x79\xda\xed\xae\xdf\x2c\x75\x05\xb8\x24\xe2\x42\x78\xb3\xe0\x07\x0f\x0a\xab\x20\x0b\x61\xfb\xe0\x17\xd2\xcc\xb7\x33\x7e\x32\x4c\x0b\x11\xfc\x82\x1b\xcb\xf2\xe8\x86\x98\xe1\x77\x53\xd4\x4e\x98\x8c\x68\xb9\x8f\x03\x1e\x7a\xaf\xa5\xf7\xba\xeb\x7d\x5f\xe4\xdb\x16\xbd\x31\x3c\x93\x58\x74\xd0\xf3\x3c\x64\xb5\x63\x6e\xc0\x5d\x72\x97\x79\x0a\xb8\x65\xf4\x5c\xc3\x8e\x4e\x8b\xdb\xcb\x38\xb2\xd2\x67\x79\x70\x2d\x8f\xfa\x61\x80\x17\x6d\xfd\x6f\x5e\x0c\xff\xbe\x5e\x7d\x5b\x4d\xfd\xee\xef\x0b\xf7\x19\x01\x35\x59\x71\xe3\xb2\x0c\x60\xda\x7f\xb9\xc1\x98\xd3\x65\x3f\x6c\x53\xf9\xdf\x26\xb0\x3a\xbd\xaa\xc0\xe8\xfc\x1d\xa7\xba\xf6\xdf\xbc\x71\x73\x7e\x62\xee\xac\xdb\xd4\x05\xca\x42\xaf\x32\x59\x71\xf7\xbd\x30\x09\x9b\x59\xb8\x70\xbd\xcc\xfd\xc2\x4a\x60\x29\x58\xd2\xd5\x99\x0c\x44\x24\x59\xe5\xa6\x71\x35\xa9\x1b\x45\x6e\xee\xaa\x18\x6d\x55\xb5\x25\x9a\xae\x31\x9c\x83\xcb\x6e\xa9\x39\x8b\x30\x3a\xd3\x6d\xd2\xad\x3f\xdd\x4a\x58\xac\xd7\xbe\x95\x71\x22\xb0\xcc\x6d\x17\x79\xed\xa7\x55\x51\xa0\x08\xed\x32\x4a\x08\xb6\x61\x69\x9e\x1a\x2d\xde\x1b\xcb\xc8\xfd\x19\xca\x2c\xad\x94\xc4\xa3\x1c\xc0\x88\x66\x13\x94\x5c\x6a\xec\x23\x98\x4b\xcf\xea\x42\x92\x40\x1a\xc2\xcf\xbb\xd9\x78\xbb\x14\x68\x84\x34\xb1\xd1\x06\x58\x0f\x12\x4e\x8d\xed\x54\xd8\xf6\x3f\x6e\x9f\x93\x3e\xb5\x2f\x9d\x2c\xee\xc8\x03\xd8\x68\x11\x0d\xc0\x2c\x11\x1b\xe6\x2d\x86\x07\xf8\x20\x08\xcb\x7f\x42\x29\x1d\x7b\xe8\x08\x1b\xf2\x26\x67\xa4\xf0\x5c\xa1\xcb\x87\x43\x42\x01\x08\xa6\xd1\x4c\x36\xd4\xd5\xdc\x51\x07\xb1\xbc\x75\x49\x06\x90\x95\x5f\x45\x46\xc9\x7d\x91\x51\x09\x88\x47\x49\x56\x8f\x6d\xab\x8e\x79\x3b\xe9\x2b\x37\x6d\x73\x42\xb7\xba\x1a\x82\x24\x28\x1f\x4c\x37\xdc\xf4\x2c\x0d\x57\x62\xf3\x1d\x73\x1c\x81\x55\xcb\x1d\x98\xcc\x78\x43\x4e\x2c\x33\xc8\x6e\x2d\xe4\xdb\xb7\x9c\xb2\x1c\xc8\xef\xfa\x0a\xb1\x95\xaa\x04\x07\x9a\xdf\x6c\xf8\x93\x7c\x06\x61\x85\x6c\x1d\xeb\x8f\xcc\xb2\xa8\x3d\x81\x91\xbf\x98\x67\xb7\x93\xf3\x0e\xfe\x28\x8e\x42\x91\x49\xee\xe9\xa1\xec\xa8\x55\xa6\xbc\xa5\x5a\xfe\x37\xed\x0d\x98\x79\x02\x39\x12\x13\x52\xe6\x86\x72\x8f\xb5\x11\x3d\xbf\x58\x23\x51\x56\x08\xff\xcb\x8d\x97\x83\x86\x76\xb5\xbb\x56\x19\x68\xb7\x7e\x5e\x3b\xb9\x0a\xd3\x26\xca\xe2\xe2\x81\x93\x33\x04\x66\x93\xed\x62\xf6\x32\x85\x1e\xfc\xa5\xec\x5d\x3c\xc9\x81\x15\xa5\x24\xfa\xd2\x1c\x5d\x3f\xc6\x03\x09\x92\xa5\x3a\xdb\xc8\x0a\x13\x10\x47\xa1\xc8\xa2\x8b\xae\x60\x3f\xa9\x17\x7a\x5d\x16\x7a\x7b\xf6\x65\x0a\xf6\x45\xc2\xbe\xa8\xaf\x8e\xda\x77\x1d\x33\x93\x75\x92\x09\x92\x52\x9e\x39\x89\x95\xd6\x8f\xfe\xdb\x15\x0d\x62\x0a\x36\x3c\x05\x63\x86\xd3\x76\x90\x57\x9f\x81\xd8\x08\x24\x21\x5e\xb2\x5e\x13\xe5\x7f\x01\x92\x8a\x97\x01\x2c\xff\x2d\xee\x7d\xfc\x4c\xfb\x20\x72\xe7\x81\x6b\xfb\x76\xb1\xc4\x01\xc5\x96\x7c\xdd\x0e\xf8\xba\x39\x70\xf7\xc6\xb3\x94\xd9\xcf\x74\x3f\x14\xed\xbf\x51\x98\x5b\x47\x6e\xbe\x65\x26\x71\x81\xa4\xb2\xd0\x04\xa4\x4d\x51\xef\x7b\x19\x3b\xef\x49\xae\x9d\x68\xdf\xb2\x72\xa1\xb8\xcb\x0c\x73\xc4\xbc\x02\x65\x38\xbd\xea\xc6\xf5\x8d\x9b\x3c\x8f\x3a\x21\x73\x3f\xa3\x9d\x74\x45\xf6\x8c\xd3\x06\xa2\x61\x7e\x2b\xe3\xd7\xb2\x55\x2c\x58\xac\x0c\xf0\x61\x7d\x65\x8e\x9b\xda\x02\x93\xac\xce\x72\x26\xa9\x9c\xc9\x97\xe7\xb0\x25\xe0\x3c\x8b\x24\x7c\xcd\x64\x06\xd8\xcf\x46\x50\xd8\x32\xca\x96\x0d\xae\x5a\xd5\xe9\x69\x26\x38\x50\x85\xc7\xea\xe4\x11\xb6\xd7\x56\xd6\xb3\x3e\xd3\xb2\x3e\xa3\xfa\x01\x3e\x45\x8e\x19\x68\x5e\x41\xe5\xd0\x87\x2f\x0d\xf1\x53\x83\x4b\xe0\xe7\x89\x19\x87\x9c\xca\xb5\x8c\x2f\xb6\x8c\x0f\x8f\x33\xbe\x1c\x5c\xdd\xbd\x95\xf1\xc9\xd3\xca\x21\xa0\x07\xb7\x42\x11\x1d\xe4\xd8\x54\xfe\x73\x20\x61\x58\x36\x16\x22\xb7\xee\x20\x6d\x9f\x44\x00\x78\xea\x22\x6e\xe7\x88\x64\x2b\x92\x8d\x16\x33\x7f\x93\xd5\x94\x87\xf9\x95\xb3\x34\x05\xab\xf9\x69\xb7\x7e\xce\xd8\x8d\x97\x36\x42\xb8\x14\x14\x13\xb9\x07\xb1\xf9\xb8\x2a\xe6\xa3\xa6\x20\x7b\x0d\x32\xe1\x46\x2d\x07\xbb\x2b\x1e\x3b\x71\x49\x94\x03\x5a\xc1\xf0\x26\x48\xfb\xc9\xe9\xc6\x43\xb1\x5f\xb0\x9a\xba\x24\xe1\xef\x43\xed\x65\xcf\x03\xd3\x58\x60\xf6\x1f\x56\xe5\xc0\xb4\xb0\x0d\xab\x5e\x4a\xea\x67\x39\xbb\x90\xa1\x03\xbf\xd7\x86\xc5\x2a\x1e\x5d\x73\x34\xa3\x54\x58\x8c\xb5\x6d\x0d\x5b\x6c\xd3\x46\xfa\xda\x7b\xde\xb9\x8d\x10\x57\x3c\x5a\xc4\xf1\xcf\x9d\x0c\x17\xed\x0d\xef\xf8\x2e\xcb\x6f\x1a\x2b\xb9\xbe\xc1\x4a\x63\x05\x29\x77\x56\x7b\xe1\xae\x49\x0b\xd8\x8f\x46\x7c\x90\x98\x49\x49\x2e\x6d\x78\x09\x5b\x59\xe6\x22\x5a\xe9\x6c\x4c\xbc\x27\xc0\x4b\x92\x2b\xa9\xc0\xeb\x54\x8c\x68\x83\xea\x27\xeb\x1d\x07\x92\x51\xd1\x25\x56\xed\xa1\xaa\xe5\xed\x1e\x8c\x2c\x08\xb4\xe0\x2e\x6d\x66\x09\x41\x25\x90\xf3\xe1\xa0\x90\xa9\x6f\xcf\xbd\x6a\xda\x9b\x29\x5a\x15\x62\xeb\x61\x96\xfa\xf1\xc9\xcf\x7e\xec\x0b\xc5\xab\x31\xb2\x21\xc4\xbd\x96\x31\xcf\x1e\x8d\xe1\xd5\xc5\x8d\x8a\x32\x2c\x74\xec\x4d\xd3\xcd\xfe\x2b\x1a\xb0\x6a\x27\x52\x15\x13\x29\x94\x14\x21\x2e\x29\xae\x82\x6c\x1e\x42\xd6\x51\xfb\xfc\x87\x93\xeb\x89\x1f\x45\x6a\x6c\xd7\xc5\x44\xd6\x78\x3d\xdc\x44\x6c\xa5\xa4\x03\x27\x7f\x61\xd9\x5c\xca\xcc\x53\xbe\x58\xc8\xff\x2a\x8a\xef\x38\x87\x79\xd8\x3c\xe7\x4b\x83\x60\x53\x1f\xfc\xd9\xbd\xd5\xa1\xa6\xd4\xd4\xc5\x12\x89\x86\x18\x42\xd5\x4a\xcb\x75\x14\x93\x53\x62\xae\x1b\x51\x7b\x89\xff\x63\xdd\x82\xac\x18\xd9\xc7\x07\xb9\xa8\xf4\xd4\xfe\xb3\xd2\xd9\x5b\x1f\x6c\xd2\x4e\x64\x56\xc3\x22\x5a\x48\xf9\x2f\x2b\x77\x1e\x9c\x20\x57\x4d\x4e\x27\x88\x56\x07\xb9\x08\x82\x4a\xb4\x8f\x24\x77\x69\x39\xed\xf0\x56\xee\xb9\xaa\x1c\x20\xd1\x80\x8b\x4a\x90\x4f\x3d\x54\xa1\x01\x8a\x1a\x6c\x7c\x90\x20\x33\x0e\x21\x19\x09\x1e\xc2\x7c\x3a\x48\xfc\x42\x2f\x6e\x19\x28\x58\x28\x72\x90\xc9\xff\xae\xb4\x07\x97\xb8\x9f\x08\x9e\x57\x52\xd5\x06\x8e\x52\x09\xac\x5f\x88\x0f\x30\xc6\x06\x28\x80\x8d\x2b\x20\x04\xc3\x2d\xa3\xa4\xb2\x2b\x74\x9f\xb5\xc3\xb5\x4d\x40\x24\xd8\x53\xcc\x3e\xe2\x25\x79\xb9\xce\x09\xf9\xea\xae\xff\x63\x53\x35\x5c\x93\x38\xfc\xe6\xe6\xc4\x03\xb2\x30\x97\xc9\x6b\xad\x0f\xdb\x53\x53\x05\x46\x62\x1b\x75\x01\xae\x58\x04\xf1\xda\x2c\xc9\x40\x8c\xfc\x3a\x89\xfb\x7f\xea\x91\x73\xc1\xa3\xb6\x8d\x06\xf4\x40\x7e\x53\x35\x32\x2f\x2e\x71\x6d\xc1\xaa\xfc\xec\x6e\x1e\x25\x0a\x63\x72\x83\xb0\x3c\xe2\x3c\x3d\x0e\xdf\xe3\xb4\xa4\x14\xd9\x34\xc4\xb0\xc4\x0a\xd0\x0f\x50\xa4\x3b\x3a\x3a\xd5\x46\x69\x48\xfd\xdb\xdd\xed\xd3\x66\x14\xa8\x06\xa6\x33\xd9\xce\x2c\x14\x66\x64\x41\xf9\x39\xe1\x33\x76\x66\x52\xc4\xd5\x07\x66\xe2\x73\xaa\x96\x4c\x5f\xf3\x93\xfd\x94\x87\x2d\xb2\x50\xc5\x79\x18\x9a\xfa\x2c\x71\x0c\x5e\xcf\xcc\xc1\x2f\x88\x24\xce\xe6\x52\xc0\xf5\x4b\x13\x9f\xb6\x1c\x89\x75\x84\x71\x1e\x25\x68\xeb\x1b\xfc\x81\x8b\xdb\x8c\xaa\xc5\x93\xdd\x6b\xa8\x7c\x03\x46\xc4\xdb\x34\xb7\x4b\xbb\xa1\x6a\x89\x56\x82\xec\xc8\x0d\xae\xf1\x93\x88\xae\x43\xfb\x23\xb3\x34\x63\x33\xa2\x38\x33\x12\xc6\xb0\x03\xde\x16\xc0\xb5\xae\xca\x77\x58\xb3\x93\xac\xd7\xd0\x68\x71\xdd\x28\x03\xbb\x76\xaf\xde\x81\xc5\xa5\xc8\x43\xb2\x63\x83\x28\x88\xb6\xc9\x9a\x8b\x84\x69\x75\xcc\xa5\xa0\x72\xf3\xb8\x24\xbb\xf1\x60\x6c\x43\x9a\xc6\x33\xfc\x0e\x64\x2e\x23\xc6\x1c\x12\x3e\xd5\x54\x2d\x74\x9f\xa9\x51\xcc\x54\x0e\x91\x4a\x49\xb0\x08\x37\xd5\x42\x10\x15\x04\xfe\x5a\x50\x16\x0c\x42\x1a\x67\x66\x7d\xc4\xb7\xf7\x27\xa3\xf0\x4a\xa6\x85\x7f\x70\xf9\xd1\xa5\x06\x55\x35\xcc\xc5\x35\x42\x15\x16\x6d\x93\xa4\x5c\x2e\xb6\x97\xfe\x08\x28\x5c\x7d\x60\xce\x21\x6d\x4d\x72\x42\xe6\x3d\x44\x5c\xa0\x6f\xcd\x6c\xc8\x4b\xb0\xd4\x00\xa1\xe9\x5d\xed\xae\x58\x6c\x25\xc3\x13\x66\x52\xd3\xe3\x18\xd3\x82\x58\x28\x6c\x7a\xdf\xbe\x53\xcd\xf6\x87\xbc\xe2\xcb\xba\x79\x9a\x57\xc8\xc8\x1a\x3b\x77\x90\x66\x02\x0e\x4d\x07\x14\x44\x19\x45\x4c\x4b\x0b\xd1\xcf\x4a\x2f\x44\x54\xbc\x7f\x55\x61\x2e\x31\x7e\x66\xb2\x8b\xc8\xa3\xe5\x1e\x2c\x88\x45\xbf\x94\xaf\x47\x8e\x85\xc2\xaa\xa5\xca\xab\x0f\x0e\x92\xb2\x33\x88\x01\x62\x67\x27\xe2\x8a\x2f\xeb\xc1\x9b\xfc\x63\x2e\x5f\xd7\x90\x2c\x6f\x79\xed\x9b\x94\x79\xad\x34\x73\xf0\x26\x57\xf5\x1e\x47\xc0\x24\xae\x94\x76\x26\x07\xe5\xbd\xc9\x05\x09\xdc\x8d\x5b\x92\x19\xf9\x93\x10\x81\x0b\x63\x57\xe2\x83\x35\x1b\x2a\xab\xac\x60\x70\x0d\x6c\x38\xaa\x6c\x2d\x11\x40\x54\x00\x34\x3a\xcc\x88\xb7\x51\xea\x2d\x6e\xb2\x4d\x57\xda\x68\x08\x07\xb4\xe2\x1c\x7c\x8a\x53\xac\x88\xbe\x9d\xd5\x84\xe0\x52\x13\x38\xd7\x18\xde\xbf\x02\xa0\x1f\x58\x46\x27\x09\x06\x5b\x89\x41\xd8\xa0\x57\x6d\x67\xdf\xc1\x4e\xa3\x4a\xf3\x58\x04\x4f\x8e\x2a\xcc\xf1\x9d\xb1\xb1\x86\xd1\x7c\xcc\xa8\x7c\xe4\x3d\xa3\x0c\xd7\xcc\x79\xde\xce\xfb\x48\x50\x54\xaa\x38\xdc\x3c\xf7\xba\x1c\x41\x52\xd5\xde\x97\x9b\x65\xfb\xcd\xa9\xbc\x6e\x08\x9c\x79\xb7\xfd\xfa\xa9\xa9\xff\xf4\xb4\x86\xcb\x62\x90\x63\x01\xc2\x8f\x4d\xc8\xcd\x21\x9e\x92\x0c\x41\xb6\xcf\x31\x04\xbe\x0c\xee\x5f\x7c\xff\x0e\x9b\xf1\x2c\x91\x55\x82\x4e\x2a\x11\x73\xfc\x28\xd2\xdb\xf1\x08\x50\x4d\x17\x79\x20\x87\xc7\x95\x68\xb9\xa7\x87\x80\x3a\xe1\x2c\xbb\x62\xd9\xdb\x0c\xe3\xc1\x69\x08\x82\xba\x22\x9a\x47\x07\x5e\xc4\x2b\x39\xbe\x32\xde\x0c\x39\x48\xac\xa7\x09\x44\x92\x33\xf5\xa8\xbd\x54\x12\xc5\xa1\x01\xef\x30\x15\xaf\x04\x9b\xcd\x83\x2b\x3b\x21\xa2\x66\xa3\xc9\x6b\x74\x45\x8d\x12\x91\xa1\xc0\x75\x14\x3b\xaf\xa0\xc1\xf8\x86\x77\xbd\x61\x11\x2c\x48\xbf\x4b\x44\x40\x37\x08\xe2\xa5\x81\xbc\x26\xb9\x1e\x81\x10\x17\x81\x77\xae\x34\x64\x56\xa2\x76\x80\xa3\x05\x4b\x40\x4c\x3d\x2a\x83\xef\x3a\x30\x66\xe8\xc3\xdd\x96\xfe\x76\xd9\x81\x42\x1b\xde\xa1\x24\x4d\xcd\xf3\x9f\xb5\x32\x45\xc4\xdb\xba\x88\x7a\x45\x0b\xb3\xfd\x5c\x12\x20\xb0\xd4\xfa\xc4\x52\x11\x9d\x15\x5b\x13\x52\xa2\x19\x04\x77\x80\xff\x2d\xaa\x7b\xbb\x83\x9d\x6c\x5b\xd3\xa9\xe6\x79\x6a\x64\xaa\x47\xfe\x32\xe2\x5a\x73\xc8\x29\x8e\x36\x26\x30\x59\xa8\x11\x59\xb4\xe5\xbe\x1d\x2f\x34\xb6\x10\x80\xce\xd6\x65\xbf\x79\xce\xcb\x85\xa2\x33\x04\x3e\x51\x03\x21\xca\x21\x68\x4b\x0e\x45\x6b\xe4\x1c\x70\x14\x50\x8d\x8c\x16\xf4\x25\x21\x0b\xa2\x46\xce\xf4\x79\x7a\x8a\xef\x0e\x4d\x78\x3b\x9e\x28\x25\x89\x03\x2d\x84\x5b\xd2\x5b\xee\x47\x26\x0c\xb4\x0d\x02\x25\x6d\x21\x9a\x62\x57\x91\xc8\xd5\xc1\x88\xb8\xad\x44\xf1\xcd\x14\x32\x5c\x00\x27\xed\x6d\x53\x40\xc1\x9f\xea\x8f\xcf\xdc\xa5\x47\x65\xec\xd8\x75\x08\x12\x0d\xf7\xa5\xa5\x29\x39\x7e\x3c\x6d\x33\x1f\xb3\xfa\xc0\x9b\x45\xa2\x51\xa5\x09\xb0\x58\x32\x94\x37\x9a\x54\xce\x55\xf7\xe1\x3b\xb8\xb7\x9f\x76\x36\x3d\xd7\x53\xf9\xe0\x3d\x2e\x39\x62\xbe\x1f\x37\xba\x88\xa1\x9f\xc5\xab\x61\xc2\xbb\xd0\x6f\xe4\xca\xcf\x8b\x2a\x0d\x58\x0a\x31\x62\x40\x36\xae\x09\x4f\x1b\xc1\x89\xf6\x24\xe1\x80\xe6\x25\x11\x1b\x15\x0e\x2e\x1d\x7d\x25\xef\x53\x2e\x96\xdb\xe6\xcb\xed\x33\xb8\x74\x4e\x7c\xf3\x68\x8e\x74\x10\x82\xb5\xd5\x76\x89\x98\xcf\x90\x0c\x2a\x07\x61\xb8\x93\x30\x5f\xae\xca\x88\x6e\x46\x82\xaa\xcc\x29\x42\xf4\xc3\x53\x8b\x25\x1d\x7c\x3f\xc4\x0c\x4f\xaa\x13\x74\x4a\xa3\x7c\x63\x59\xe7\xb2\x60\x86\x8c\x4b\x01\x21\x78\xb3\x47\x96\xb3\xcb\x80\x48\x12\x16\xcb\x88\x51\x78\x8c\xb3\xd2\xfc\x3f\xbb\x39\xc6\xe5\x7b\xf0\xd0\x8c\x2a\x05\x71\x21\xea\xae\x4f\x85\xfd\xb9\xec\x53\xa9\x14\xa0\xf4\x20\xa6\x5f\xee\xf6\x80\xc5\x4b\xc9\xef\x58\x6d\x36\x4b\xd1\x43\xca\x9f\x17\x01\xb3\xdf\x29\xb7\xcb\x2e\x7f\x38\x70\x3a\x43\x05\x63\xa9\xdd\x0a\xe6\xdf\x19\x7b\x30\x16\x28\xac\xa2\x70\xd6\x0a\xfc\xb4\x02\x33\xa7\x92\x2d\x10\xff\xff\x9c\x6c\x99\xc4\xb9\x4e\xdd\xc7\x87\xde\x22\xbb\xed\xc3\xc3\xa6\xbe\xd9\x3d\x0d\xa8\x26\x90\xd0\x7d\x40\x07\xa9\x36\xe5\xd8\x9e\x87\x10\x0f\x92\xe7\x4a\xf4\xbd\x3a\xa9\xd4\x8a\xc0\x49\xa5\x59\xfe\x25\xb9\xe2\x49\x5e\x92\x47\xee\x18\x4c\x1b\x8e\x8f\xdb\xe0\xb4\x9b\x75\xc1\xf9\x72\xfd\xe6\xea\xb6\xd2\xb1\x0d\xe3\x87\xa2\x44\x9b\x59\x17\xd4\x2f\x87\x26\x3f\x45\xe6\x39\xa2\xca\x4e\xb6\xdb\x38\xda\x83\xe2\x40\xbd\x7a\x8f\x53\x28\x1e\xdb\xde\x47\xd5\xed\xdd\xb0\xba\x93\x76\xbc\xd1\x8a\x89\xbc\x60\xcc\x28\x5a\xb6\xa6\xf9\xdb\x75\xf5\xe9\xf1\x9d\x60\xaf\x0c\x23\x63\x6b\xda\x38\xc0\x37\xd7\x31\xdd\x7f\x2e\xe5\xca\xe7\x39\x5a\x36\x76\x86\x5e\x61\x27\xa9\x0a\xe2\xa6\xea\x52\x0e\x23\xc9\x59\xed\xac\x0b\xa0\x81\x19\x86\x46\xe2\x9a\x1e\x42\x6a\x9c\x18\xca\x7e\x4a\xd1\xaf\x6c\xcb\x9b\xb1\xe6\xb6\x8f\x2f\x8f\x07\x62\x1d\x54\x68\x77\x16\xfe\x2b\xff\x92\x6b\x01\x66\x18\x3f\x7b\xef\x7e\x86\x91\x9e\x5e\x90\xfc\x76\xfd\x58\x3f\x39\x0a\x01\xda\x8b\x84\xb0\x19\x1f\x28\xcb\x0d\x93\xdc\x07\xb1\x42\x6f\xf3\xa3\x95\x4b\x22\xff\xe4\x5e\x81\x0f\xf9\xd1\x7d\x21\x1f\x88\x1d\x92\xcb\x8f\xfc\x05\x6b\x93\xde\xcc\xb9\xba\xab\x5b\x62\xdd\x91\xc0\xd2\x2a\x7b\x52\xb1\xfa\x09\xbc\xfb\x4b\x74\xc6\x07\x0d\xc6\x6a\xf0\x4e\xe7\x04\x37\x97\x00\x9a\x08\x86\xae\x6e\xc5\xd0\xcd\xc6\x83\x0c\x83\xaa\xc5\xa0\x0d\x92\x6d\x39\x05\x62\x7f\x76\xe2\x32\xce\x72\x09\x14\x22\xc7\xe1\x0e\xc8\xec\x11\x48\x02\xaa\xa2\xdf\x68\x23\xf5\x6f\x0c\x98\x9c\x32\x47\x03\xe4\xf7\xda\x6f\x2c\x78\x92\xa4\x37\x04\x64\x1e\x1c\xd2\x58\xcc\xf5\xce\x05\x78\x7a\x99\x27\xc5\xe5\xda\x08\x21\xec\x2d\x44\x3b\x97\x8c\x6f\x08\xa2\x3c\xc0\xb9\xc0\x04\x48\x2c\xda\x19\x6a\x34\x98\x08\xc9\xcd\xc9\x80\x6b\x08\xac\xd5\x7e\xc3\x53\xcd\x7f\x3b\x25\x52\x99\x89\x82\x41\xc5\x03\x13\x1b\x0d\x91\xb5\x59\x4c\x0b\x62\x69\xf5\x34\xd0\x5e\x3b\x69\x8d\x1c\xa2\x99\x6a\x80\x9f\xc7\x4d\xd2\xe5\x75\x17\xaa\xc0\xd9\x28\x2d\xc9\x6d\xf4\x78\x73\x18\x1e\xf4\x68\xdc\x98\x6a\x2c\x19\x0f\x3e\x51\x28\x51\xff\xe2\x42\x2e\x29\x04\xef\x78\xa0\x5e\x4b\x83\xae\x6e\xb5\xd5\x61\x82\x40\x41\xe0\x52\x67\x9d\x50\x9e\x24\xcb\x69\xda\x06\xd3\x12\x71\xa3\x4f\x42\x21\x71\x32\x24\x79\x50\xc6\xd8\xbc\x4e\x9c\x0f\xbf\x23\x89\xbf\x17\xbf\x23\x9f\xc1\xb5\xc6\x38\xbb\x4f\x72\x45\x29\xf9\xb1\xa0\xee\x2a\xdb\x3d\x8b\x51\x32\x8a\xc5\x02\xc9\xd3\xa8\x6a\x1e\xc1\x2d\x31\x35\x72\x99\xb3\x2a\x0c\x81\x5b\xe3\x26\xf1\x58\xbb\x44\x59\xe1\x39\x48\x35\x97\x24\x07\xa0\xb9\xcc\x57\xdb\x2f\x1c\x69\x55\xee\x56\x6f\xcf\x6e\x5a\x33\x5b\xf1\xfd\xe3\x86\xf1\xea\x63\xaa\xbc\xcc\xb5\x79\x1e\x0f\xf9\x4a\x2c\xba\xbb\xef\x5f\x6d\x4e\x35\x6e\x81\xec\xd0\x69\xa3\xcd\xd4\x33\x6d\x8f\x76\x62\x91\x67\xf7\xb6\xb7\x95\xa6\xd6\x56\x9a\xdf\xa7\xcb\x00\x51\x99\x4a\x6c\x48\x4d\x95\xdd\x55\xaa\x55\x67\x36\xe6\x5a\xeb\x41\xee\x59\x6b\xc2\xd7\xd9\x48\x6d\x30\x89\x25\xd9\xc0\x20\x77\x89\xd5\xa5\x84\x18\x48\x60\xe5\xb0\x5a\x49\x2c\x56\x54\xe9\x2f\xdf\xe5\xa9\xa4\xd6\x10\x2f\x4f\x65\x3f\xa1\xcc\x66\x99\x35\x99\x55\x9e\x36\x14\x23\x97\x2a\x1f\x75\x32\x1f\x1f\x7a\x9c\x74\x46\xe7\xb9\x9f\xd9\x58\x46\x0c\xed\x38\xaf\xc9\xad\xea\x0c\xcf\x25\x4d\x78\x7c\xeb\xdb\x96\xb2\x4f\x5b\x6e\x8b\xea\x5b\x95\x1d\xa7\x72\xe8\xf1\x0d\x2f\x96\x9e\x9b\x52\xcb\x4c\x73\x1b\x36\xdd\x2b\x6d\xa1\x63\xa7\x4b\xfe\x28\x3b\x2c\x09\x4e\x1d\x6e\x34\x82\xd9\x6b\x0b\x91\xff\x4a\x7b\xcd\x1f\xb8\xfc\x19\x42\x5c\xb6\x15\x66\xdb\x61\xb1\xad\x97\xc9\xdb\x68\x82\xd0\xe4\xd1\xe4\x8c\xc2\xd2\x32\x77\x6b\x08\x9c\x6a\x4d\x01\xe7\x27\x58\xe2\x65\xfe\x35\xb2\xbe\xd9\x3d\x3c\xce\x6e\xc6\xf1\x2f\x86\x5c\x4e\xa0\x00\xc9\x40\xc2\xa5\x05\x37\xe3\xda\xa9\xbf\xf1\xca\x11\x6f\x69\xa3\x43\x3d\x78\xa1\xdb\x5f\xcb\x33\x21\x05\x9b\x8c\xc7\xe0\x6a\x70\x07\x8f\x69\xa7\xc1\x6d\xc2\x30\x89\xab\xdc\xe8\x78\xf5\xc1\xb2\x9e\x1f\xe7\x86\x96\x27\xb1\xb4\xe9\xb6\xca\xb3\x22\x2e\x81\x2d\xd0\x6a\x9d\x6d\x95\x4d\x7f\xcf\x20\x97\xe9\x4b\x92\x29\x15\x84\xfa\xa3\xef\x51\xce\x84\xcb\x57\xaa\x7d\xb5\x21\x08\x4b\xa4\x27\x5f\x1b\x89\xe5\x34\x7a\xc5\xca\x1c\x98\x3d\x81\x78\x66\x3d\xf9\x5e\x82\x5f\x8d\xda\x93\x5f\xf1\xbe\x6c\x2d\x17\x30\x1b\x7e\x7b\xe8\xef\xd5\x07\x0c\x8a\x0c\xf8\x0d\x41\xc4\xbd\xb6\x1b\xcb\xdd\x88\x1b\x6d\xf7\xda\xce\x31\xec\xed\x1c\xb9\x0d\x71\x63\xaf\x6e\x03\x20\x6a\x0f\xa7\xa1\x58\x1d\xf6\x8f\xbf\x73\x72\x23\xdb\x5a\x5f\xa5\x22\x83\xe6\x3f\x99\x85\xb8\xbd\x19\x14\xd6\xbf\xb0\xc3\x44\x0d\x8e\x39\x82\x95\x6f\xa6\xaf\x84\x86\x26\x4d\x32\xfc\x86\x8e\xbf\xb1\x93\xe6\xa2\xdf\x98\x71\xde\xe9\xad\xc2\xb3\xdb\xf2\x77\xdf\x1d\x09\x9c\x5e\x37\xeb\xc7\x67\x50\x2c\x09\x05\x6e\xd7\x40\xe5\x6a\x09\xe5\x2c\x8f\xdc\x39\x26\xf3\x10\x46\x00\x2d\x72\xd3\xe9\x14\xa6\xda\x40\xb0\x02\x70\xda\x13\x77\x72\x9a\xa0\xf2\x33\x23\xe6\xd1\x87\x63\x43\x31\x4a\xac\xbb\xc3\x03\x54\x12\x43\xbd\x05\x85\x49\xf9\xd1\x89\xf4\x04\x15\xd7\x18\xb9\xc6\xd8\xdf\x00\x1d\x1a\x79\x75\x0b\xce\x0a\x0c\x4c\x3d\x0a\xa0\xac\xe5\xe0\x71\x53\x4d\x0e\x1d\x49\x22\x38\x3a\x59\x8b\xe2\x50\xd4\xd9\x3c\x08\x70\x5d\xea\x54\x92\xd8\x1f\x45\x4a\xd4\x1f\x29\xa2\x38\xa0\xc4\x36\xe0\xb2\x68\x2e\xd9\x6c\xb4\xab\x17\x70\x86\xe0\xc4\xec\xa5\x37\x28\x20\x01\xfc\x8d\x80\xf6\xea\x56\xd6\xb6\x06\x47\x9b\x53\x6c\xa9\x8e\x28\x12\x12\xb0\xc9\x18\x88\x61\x86\x46\x6c\x0b\xcd\xc1\x2c\x44\xfc\x55\x2b\x89\x46\xe9\xdb\x67\x77\xb6\x41\xd5\xaa\xd2\x96\x77\x32\x1d\x59\x22\x76\xe0\xa3\xce\x9c\x2d\x8a\xe7\x37\xf4\xa0\x16\x46\x00\x32\x4c\xd8\x00\xd2\xca\x64\xac\x08\x9f\xd1\x8c\x6d\x52\x01\xc8\x2a\x0b\x41\x2c\x1f\x98\x38\x34\x77\xd9\x64\xc8\x55\x4a\xca\xe9\x6c\xf9\x83\x82\xb4\xc1\xc3\x67\x92\xce\xe6\x2b\x11\x1f\x50\xe5\x0b\xea\x2a\x69\xa0\xda\x03\x05\xe5\x3b\x0c\x13\x54\x46\x24\xf4\x8c\x95\x71\x50\x16\x79\xc2\x9c\x5f\x65\xfb\xcc\x28\x88\x24\x56\x82\x9b\x92\x91\xbb\xf1\x4d\x35\xc3\x00\x46\x04\x47\xd3\xc7\x4d\x17\xa3\xf8\x20\xeb\xde\x9a\xf6\xd9\x16\x79\x18\x43\x41\xd5\x0b\x82\x30\xe1\x67\x2c\xf5\x89\x59\x1c\x75\x2c\x27\x09\x7a\xcf\xa5\x83\x90\x14\xcb\x25\x46\x89\x94\x88\x5e\xb1\x44\x30\x43\x84\x24\xc6\x9d\x3d\xb0\x49\xc8\x48\x89\x7e\xe5\xb8\x25\x12\xd5\x1a\x59\x93\x53\x46\x06\x25\x41\x14\xf7\x70\x53\xa3\xe0\x77\xe7\x67\xcb\xde\x20\x68\x56\x3e\x37\xd5\x4a\x9c\x6d\xc4\xec\xd4\x40\xe2\x45\xc2\xc4\x4e\x65\x20\x18\x8f\x32\xca\x96\x67\xd8\x76\xd3\x2c\x56\x52\x09\x8c\x5b\x49\x40\x2b\x1e\x77\xa3\x58\xad\xb2\x19\x1b\x47\x9c\xf8\x24\xb2\xa1\x06\xeb\xb5\x01\xd6\xd4\x82\x76\x75\x80\x64\x54\x38\xc4\x5a\xe7\x79\xe3\xaa\x57\x1a\xc8\x6a\x31\x98\x12\x5f\x33\xa7\x1d\x90\xd7\xa7\x9c\x8f\x1e\x51\x49\x79\xdc\x15\x79\xf0\xb2\x83\x24\x45\x83\x25\x63\x78\x7f\x5b\x10\x89\xeb\x7f\xd3\x82\xab\x38\x89\x7f\x55\xaa\x5f\xe0\xc1\xe3\x0a\x58\x55\xd0\x39\x90\x9a\x91\xfd\x53\x72\xbb\x07\x09\x40\xa3\x33\xda\x4b\x8c\x1a\xbc\x6f\x34\x33\x10\xb0\x46\x62\x71\x45\x5e\xda\xf1\x10\x5b\x5e\x0e\x1e\x92\x18\x0f\x75\x63\xa0\x01\x6d\x71\xd8\x59\x34\xfb\x5d\x6a\x32\x3a\xb9\x83\x75\xe0\x92\xb4\x44\x22\xf7\x87\x03\xb4\xb8\xa0\x6f\x45\xdb\x64\xc8\x65\x89\x4e\x27\x96\x79\x87\x98\xba\xac\x16\x4a\xcf\x5d\xea\xba\xde\xf7\xdc\xce\x32\x49\xf6\x57\x1d\x0a\xf3\xa5\xee\x00\x6f\xd9\x33\x01\x3d\x54\x9a\xa9\xbb\xd2\x6d\x90\x25\x17\x01\x0b\xf0\x5e\x25\xa8\x5b\x38\x99\x22\xac\xc4\x1a\x5b\x90\x82\xc4\x97\xcf\xf7\x44\x63\x90\xe9\xdd\x80\x40\x5e\x3f\x31\x8c\x45\xf7\xdf\xa5\xdf\xa3\x2c\x5b\x31\xc3\xac\x47\x4d\xe4\xbe\x30\x95\x7b\x16\x3b\x12\xe6\x47\xbb\x6e\x9c\x06\xf4\x8d\xce\x9b\x80\xf3\x35\x66\x26\x46\x3d\x59\x91\x13\xa6\x3d\xa0\xb3\x97\xc9\xcc\xf7\x64\x36\x44\xcf\xaf\xb4\x58\x1d\x72\x55\x1a\x8c\xad\xdb\x38\x71\xc5\xde\x83\x7e\x36\xa6\xc6\x90\x5d\x15\xa3\xa9\x9f\xa6\xc6\xa2\xfb\x27\x9f\x09\x0c\x86\x51\x70\xda\x58\xd1\x7a\x66\x14\x99\x97\xe7\x47\x3b\x8a\x24\x86\xbc\xba\x05\x43\xc2\x1a\x4c\x3c\x30\x5e\x18\x9a\xf6\x3c\x3b\x80\x35\xc9\xf9\x4b\x6f\x7c\x9e\x51\xab\x04\x59\x74\x44\xad\x10\xdd\x41\x16\xe0\x61\xa5\x4c\xb3\x1a\x30\xd5\x24\xee\xde\xa6\x20\xdc\x64\x99\x70\xb9\x68\xd7\xd1\x67\x94\xa3\x43\x0b\x71\x8c\x71\xd5\x52\xae\x7f\x66\xf1\x1f\x86\xe9\xa4\xa3\xf4\x09\xeb\xe3\x1d\x3a\xc4\x7a\xd4\xb4\xc3\x50\x33\x65\x6a\xc0\x85\x38\x72\x78\x70\xbe\x11\x53\xd9\xe7\xf9\xde\x61\xf1\x4f\xe9\xb1\x00\x78\x63\x91\xcb\x6b\x70\x71\xc1\x83\x90\x94\x07\x1e\x38\x1b\x94\x3c\xda\x99\xc5\x7c\xa0\xaa\xc6\x31\x2f\x0e\x1c\x52\xfc\x1e\xe4\x71\x18\x2a\x57\xf2\xc9\xdc\xc7\x93\xae\xd0\x8e\x69\x1a\x62\xb4\xcb\x0d\x5d\x69\x02\x09\x8a\xce\x9b\xa0\xc4\x61\xd0\x1e\x8c\x95\x7e\x8b\x35\x8c\xd8\xbe\x12\x6f\x9e\x72\x40\x1c\xbd\x8e\x90\x04\x0b\x8e\x55\x3e\x41\xc2\x45\x6d\xa1\xe2\xef\x3c\x97\x82\xb3\x2c\xbe\xc6\x5e\x77\x09\x2c\x28\x30\x43\x5d\x71\x1e\x81\xff\x48\x3a\x8a\x0d\x15\x0f\x25\x33\x3c\x09\x7d\xea\x99\x53\x88\xd3\xbf\x67\x1d\x84\x0c\xa7\x7b\xde\x64\x6c\x8d\x81\xd9\x78\x7e\xe6\x52\x2d\x10\x69\x16\x50\x2e\xb9\xb9\x22\x89\x90\x51\x26\x47\x18\x77\x2c\x4b\x15\xdd\xbc\xfa\x20\x47\x1e\x15\x38\x66\x68\x5c\x72\x87\xf9\x26\x06\xc3\x21\x73\x29\x62\xd9\x84\x0e\xe2\x39\x66\x7b\x62\x67\x66\xa3\x37\xd2\x1b\x11\xe5\xd4\xb8\xb4\xbe\x9e\xab\x0f\x99\x19\x57\x10\xa9\x1e\x7f\x8f\xd9\x52\xfa\x48\xc9\x49\x16\x52\x12\xad\x6e\x58\xb2\x38\xc9\xe4\xcc\x36\x3f\x72\xfa\xa1\x9a\xab\xdb\x20\x71\xf8\xc6\xd5\x09\x48\x24\x13\x32\x6f\x38\xc3\x42\x51\x8c\x0e\x2c\x3e\x3d\x2a\x93\x16\xb2\x84\x99\x00\xdd\xd5\x07\xf1\xb3\x21\x3f\xf9\x16\xb3\x44\xe3\xcc\xa4\xad\xcf\x8e\x35\xf5\x63\x2d\xaf\xfb\x13\xdc\x5c\xcb\xd5\xad\x93\x2c\x94\x79\xd2\x13\x1d\x9c\x8c\xda\x2b\xda\x32\xe9\x61\x96\x5a\x4d\x05\xd6\x5d\xdd\x3a\x8d\x15\x58\xcf\xba\x9b\x32\x70\x68\xae\x67\x75\x44\x20\x04\x9d\xc9\x8f\xee\x8d\x15\x86\x29\x86\x56\x6d\x50\x0a\x69\x81\x17\xef\x5a\xca\x61\x71\x6c\xa7\x90\xb1\x14\x95\x0b\x36\x07\x1d\x01\x7c\xca\x4e\x56\x07\x49\x9d\x19\x04\xcd\x24\x00\x0d\x65\x47\xa9\xd6\x60\x24\x24\x35\xf5\x20\x79\x46\x8b\x15\x0d\xf6\x9f\x1f\x1e\xd6\x77\x8f\x37\x75\x23\x7a\xec\xc3\x0f\xff\xe7\xa2\xbe\xbe\xd6\x8f\xeb\x3f\x3f\x5e\x7c\x7f\xd0\x6f\x67\xd7\xd7\x3f\xad\xff\xfc\xa8\x2e\xea\xa6\xde\xdd\xea\xed\xa7\x4f\x83\xb7\x9c\xf8\xfb\x4f\x9f\xd4\xfd\xcd\xdd\xc7\x6d\xbd\xbb\x2e\xde\xfd\xa1\x4d\x52\x77\xeb\xaf\x45\xf2\xbf\xad\xbf\xaa\x8b\x8f\x5f\x3e\x7e\x6c\xd6\x7a\xfd\xe7\x55\x53\xdf\xd6\x8f\x37\xdb\xbb\xb2\xd4\xdf\xca\xdb\x7f\x3e\xbc\x54\x17\x9f\x77\x37\xd7\x7a\x7f\xb3\xfe\x5a\xe6\xfb\x97\xdd\xcd\xf5\xf2\x86\xcb\x5b\x09\x80\xa4\xae\x77\xbb\xed\x20\x47\x06\x96\x9c\x71\x72\x9f\x69\x53\xdf\x5d\x4f\xf3\xcc\xeb\xbb\xeb\x41\x16\xbd\x6a\x6e\x56\x7f\x3a\x9e\xf1\x92\x5f\x0d\x73\x7f\xde\xd5\x1f\x8f\x67\xfe\x97\x5d\xfd\x71\x98\x77\x7b\xbf\xbe\x3b\x9e\xf7\xf7\xf7\xeb\xbb\x3e\xef\xed\x76\xbf\x9e\x66\xfb\xb0\xdd\xaf\xd5\xc5\xa7\x9b\xdd\xc3\xa3\xae\x6f\x06\x3d\xe9\x4e\x34\xd5\x6e\xfd\x70\xf3\x97\xf5\xf7\x25\xc8\x0d\x27\xa8\xed\xc7\xff\xff\x7a\xf5\xf8\x50\xbc\xf8\x7d\x4e\x51\x1f\xb7\xdb\x3f\x95\x33\xb0\xdd\xfe\x49\xd5\x0f\x8f\xeb\xdd\xcd\x43\x99\x3e\x6b\x93\xd4\xc7\x2f\x9f\x07\x13\xf6\x59\x3d\xac\x6e\x1e\x1e\xb6\xbb\xb2\xf0\x1f\xdb\x24\xf5\xb8\x59\xef\x6e\xb7\xb7\xeb\xc7\xf5\xae\x78\xfd\xd3\x21\x55\xdd\xaf\xef\x56\x37\x4d\x49\x3d\x92\xa0\xee\xb6\x8f\x65\x3f\xfe\x6d\xfb\xb8\x56\xbb\xf5\xa7\xdd\xfa\x61\x33\xe8\x9e\xa4\xa8\x87\x6f\x77\xab\xb2\xfe\x6f\x77\x2b\x75\xc1\x54\xa3\x9b\x9b\x87\x01\x59\x33\xd9\x2c\x6e\x1e\x1e\xdb\xd7\xab\x7a\x77\xfd\x30\x7e\x7f\xc9\x89\xea\xe2\x71\xb7\x5e\x4f\x48\xaf\x43\x4a\x57\xcd\xcd\xe7\xcd\xe3\xc7\x2f\xcd\xc7\xe2\xe5\xa2\x4b\x53\xd7\xdb\xaf\x77\xcd\xb6\x2e\x97\xc5\x3f\xb5\x49\xea\xcb\xfd\xe8\xcd\x7f\x48\x82\x6a\xb6\xab\x72\xc8\x17\xdb\xd5\x9f\xd4\x97\xbb\x51\xea\x7f\x48\x82\xfa\xf2\xb0\x1e\x8c\xf8\x7f\xf0\x6f\x75\x71\xbf\xbd\x67\x09\xa0\x6c\xf0\x1f\xb6\xf7\xbf\xff\xf2\xa8\x3e\x09\xf4\xd7\xf7\x63\x2c\x30\x5e\xbf\xc3\xa5\xcb\x39\xd7\xc3\x7c\x6b\x75\xdf\x7c\x29\x6b\xfb\x43\xf3\xe5\x41\xdd\xde\xdc\x0d\x12\x3f\xf0\x6f\x75\x21\xc9\x3a\x7b\xb3\x5e\x8c\x5f\xe7\x1b\x7e\x75\xc1\xe5\x1d\xc9\xc3\xe5\xb6\x59\x3e\xd6\x65\xbb\x7e\x5b\xdf\xa9\x8b\xc7\x9b\xdb\xf5\xb1\xaf\x7e\xe2\xf4\xf6\xb3\xc7\x5d\x3d\x20\x90\x9f\xf8\xb7\xca\xdf\x7c\x3f\xb6\xbc\x50\x8f\x75\x49\xcc\x3f\xd5\x9f\x39\xe5\x61\x98\xf4\xa0\x36\x37\x0f\x8f\xdb\xdd\xb7\x22\x79\x9e\x53\xd4\x6a\x34\x39\x97\x32\x37\x2d\xc7\x94\x97\x13\x9e\x99\xb3\x08\xbf\xfa\xbe\x3e\xbc\x6a\x19\x95\x34\xeb\x08\x37\x93\xf4\x2e\xd3\xe6\xa6\xb9\x3e\x92\x87\x93\x73\x96\xd5\xf6\xbe\x6c\xed\xe5\xf6\xfe\x9b\xda\xac\x9b\xfb\xb2\x07\xeb\xe6\x5e\x35\xdb\xcf\x83\xd9\x5f\xf0\x6f\x4e\xdd\x7e\x79\x1c\x26\x6f\xbf\x3c\xaa\xfb\xdd\xcd\xdd\x90\x84\xfe\x90\x53\xd4\xd7\xed\xae\x29\xe9\xf9\x8f\xfc\x5b\x3d\x34\x37\xd7\x83\xec\x3f\x4a\x82\x5a\x35\x37\xf7\xe3\x2d\xe3\xb2\x4b\x53\x9f\x6e\x76\xeb\xaf\x75\xd3\x0c\xb9\x9b\x24\x29\x5e\xcb\x83\xd5\xf6\xf0\xa8\x76\xeb\xeb\xed\x80\x21\x5c\x6f\xd5\x97\xbb\x41\xda\x7f\xdc\x5d\x6f\xd5\xc3\x6a\xb7\x1d\x94\xfa\xa3\x24\x30\x43\x6d\xd6\xfa\x61\xfd\xf8\x78\x73\xf7\xf9\xe1\x62\x44\xf8\x3f\xb6\xe9\xea\xe2\xf1\xeb\x56\x7f\xad\xbf\xe5\x71\x1f\xe4\xfb\xe9\xeb\xf6\x8f\xf5\x37\x19\xf9\x07\xf5\xf0\xf5\xe6\x71\x55\x12\xe0\x8f\x92\xa0\x1e\xb7\xdb\x66\x40\x58\xfc\x5b\x5d\x7c\xbd\xb9\xbb\xde\x7e\x65\x52\x79\x18\x90\xf4\x1f\x25\xfd\x92\x93\xfb\x4c\xb7\xf5\x9f\xa7\x59\x3e\xd4\x7f\x3e\x64\xb8\xb9\x3b\x92\xe1\xe6\xae\xcf\xb0\x5b\x33\xd9\x1e\xa9\xe8\xdf\xf3\x0b\x75\xf1\x97\xed\xf6\x56\x0f\x8b\xb9\xda\x6e\x6f\xff\xf5\xae\x7d\x35\xe2\x2d\xfc\x8e\x99\xcb\x9f\xd6\x25\xbd\xfd\xf7\xf5\x37\xd5\xdc\x7c\xdc\xd5\x83\x35\xb3\xc8\x29\xea\xe3\xb6\x79\x1c\x6c\x38\xcd\xa3\xfa\xba\x5b\xdf\x0d\x46\xed\x8f\x92\xa0\x3e\x7e\x69\x9a\x87\xf5\xb7\xf5\x60\xc7\xc9\x49\xea\xb1\xde\x7d\x5e\x3f\x0e\xd6\x2a\x27\xa8\x4f\x4d\x7d\x3b\xe0\x5f\xfc\x5b\x6d\xb6\x5f\x76\x9f\x59\x48\x2a\xd7\x40\x97\xa6\x2e\xee\xb6\xba\x5e\xad\xd6\x0f\x83\x89\xfd\xb7\xed\x4c\xd2\xd4\x76\xf7\xb9\xbe\xbb\xf9\x8b\x48\x24\xe5\x16\x5a\x24\xab\x8f\x75\x53\xdf\xad\x06\x2d\xcd\x29\xea\xe2\xe6\x5a\x7f\xac\xaf\x3f\x0f\xc6\xfd\x5f\xaf\x7f\xcb\x49\x6a\xb7\xbe\x5f\xd7\x8f\x03\x02\xe6\x84\x96\x2c\x3f\xef\xb6\x5f\xee\xc7\x34\xf9\x2f\x9c\xa8\xee\xeb\xfb\xf5\x8e\x97\x52\xb9\x1e\xbb\x34\xf5\xb0\xd9\xdd\xdc\x95\x9c\xe9\x47\x49\x50\x17\xb9\x97\x37\x1f\x6f\x9a\x9b\xc7\x6f\x1a\x07\xec\xa9\x7c\x85\xe3\xac\xf4\x64\x56\x52\x17\x0f\xdb\xdd\xa3\xfe\xf8\xad\xcc\xf2\xe3\x76\xf7\xf8\xdb\x6f\xea\x62\xb5\x6d\x9a\xfa\xfe\x61\x2d\x3b\xed\x80\x5f\xb5\x2f\x78\xb3\x55\x17\xeb\x3f\xdf\x8b\xe8\x35\xca\xf4\xcf\x92\x2c\x59\x3e\xee\x6e\xd6\x9f\x56\xf5\xc3\x60\x88\xbb\x34\xa9\x67\xbb\xd3\xf7\x37\xab\x3f\xad\x77\xa3\x6a\xb6\xbb\x3f\x48\x32\x67\xba\xff\xa6\x1f\xb7\xba\x67\x41\x17\x23\x36\xf9\xd3\xf6\xc0\x89\x2e\xf2\x96\x39\xec\x79\xde\x35\x49\x5d\x5c\xef\xea\xcf\x22\xd4\x0d\xf7\xa2\x43\xc4\x54\x75\xbb\x1d\x50\xcb\x87\xed\xf6\x4e\x3d\x7c\x29\x93\x7e\xfc\x72\xa7\xbe\xd6\x77\x03\xd6\xc9\xd2\xe8\xaa\xd9\xde\xad\x87\xdb\xca\xdd\x5a\x5d\xe7\x58\xc2\x65\x65\x39\x65\xd0\x18\xbd\x92\x48\xad\xc7\xdb\x94\xa3\xb8\xaa\xb5\x04\xf7\x2c\x87\x59\x12\x54\xd3\xc5\x40\x2c\x97\x6d\x97\xa6\xee\x59\x2c\x1c\x50\xdb\xc3\xe3\x5a\xdd\xb7\xe1\x94\x06\x12\x47\x4e\x6a\x89\xf8\x2f\x37\x13\x12\xbe\xba\xb9\xef\x87\x77\xa4\x58\xf4\x10\xa5\x6a\x97\xf1\x19\xbf\x9f\x20\x36\x2a\x16\xcc\x46\x22\x99\xfa\x74\x33\xd8\xf7\x7f\x77\xf3\xb0\x51\x9f\xb6\xbb\xdb\xef\x87\xb8\x03\xea\xd3\x97\xf5\x60\x6f\xf9\xb2\x6e\xd4\x43\xe7\xbe\xf8\xfd\x11\x97\x46\xf5\x58\x7f\x1c\xb4\x42\x3c\x5d\xd4\xc5\xf5\xf6\xf1\x88\x2c\xd2\x5b\x31\xaa\xbd\x38\x17\x7c\x3f\xf6\x36\x50\xab\xde\x88\xf9\xfb\x63\x96\xcd\xea\xe3\xfa\xb1\xfe\x7e\x68\x0b\xd8\x53\x77\xbe\x6d\x9c\x92\x77\x4e\xff\xbf\x2a\x0b\xf5\x70\xbd\xfe\x74\x73\xb7\xfe\xc3\x6e\x7b\xbf\xde\x3d\x7e\xfb\x87\x89\xc6\xa7\x2e\xd6\xd7\x37\x8f\x17\x6a\x07\xd7\xeb\x87\xd5\xee\xe6\xfe\x71\xbb\xbb\xdc\xde\x7d\xba\xf9\x3c\xcd\x0b\x59\x40\xff\xcd\x6f\x5e\x5f\x38\x8b\xee\xfa\x84\x1a\x38\xff\x29\xe5\x67\xae\xf8\xba\xb2\x45\x4e\x3e\xa5\xf0\xeb\xed\xea\xcb\xed\xfa\xee\xb5\x6d\x67\x0a\x3f\xa5\xf8\xfa\xfa\xfa\xb5\xe3\xde\x7c\x39\xa9\xe1\x2b\xde\x6c\x9a\x57\x16\xfe\xb1\xbe\x3b\xa5\xec\xdd\x5a\x54\xd2\x57\x95\xfd\x3f\x86\x72\xfa\xff\xef\x94\x7a\x1e\x6e\x3e\xdf\xb1\xf8\xf1\xba\x4e\x88\xf8\x7a\x72\xf1\x2c\xc2\xbc\xba\xfc\xed\x97\xc7\x53\x2a\x10\x9d\xf0\xee\xe6\xee\xf3\x6b\xa7\x61\xdb\x9c\x54\xfe\xa7\x86\x85\xc5\x4d\xbd\x7b\x6d\x17\x4a\xc9\xe5\x24\x32\x6d\xd6\xaf\xad\xe3\x7f\x1c\x3b\xd3\x39\x69\xd6\xef\x6f\xee\xee\xd6\xaf\x5e\x16\xed\xe1\xd2\x49\xbd\x79\x7c\xac\x57\x9b\x13\x56\x75\x2f\x5c\xfd\xf2\x6a\xc9\x27\x3c\xfa\x7a\xfb\xf5\xb5\xcb\x24\xcb\x82\x6f\xa8\xe3\xd5\x4c\x36\xe7\xff\xcd\x6f\xd4\xc5\x97\xbb\x5c\xfa\xf5\xc5\x7f\xf9\xe1\xf1\xdb\xfd\x7a\xfb\xe9\xbb\xac\x7b\xfc\xd7\xff\x9a\xff\x85\x4d\xfd\xf0\xfb\xaf\x77\x7d\xed\x17\x97\x4d\xbd\xbb\x79\xfc\xf6\xaf\xab\xed\xdd\xc3\xc5\x6f\xfa\x6c\x65\x32\xd4\xd7\xd7\xd3\x5a\x7f\xf3\x7f\xd5\x05\xfc\xe3\xfd\x6e\x2b\xe7\x58\xff\x78\xc3\x39\xff\xf1\x61\xb7\xfa\xc7\x07\x79\xfd\x8f\xb7\xeb\xeb\x9b\x5a\xe7\x1f\xf0\xf8\x70\xf1\xfd\xa7\x2f\x77\x2b\x26\xce\x7f\x58\xab\x47\x75\xf7\x9b\xff\x73\xf1\xe5\x61\xfd\xdd\xc3\xe3\xee\x66\xf5\x78\xf1\xdf\x9e\x18\x1b\x75\xf1\xbf\xfe\xd7\xfa\xe1\xc3\xf6\xfa\x4b\xb3\xbe\x50\xff\x67\x5f\x37\x5f\xd6\xdf\xff\x97\xea\xff\xfe\x46\x3d\xc2\x07\xae\x20\xb7\xe5\x87\xf2\x98\x63\xb5\xdb\xde\x6f\xb6\x77\xeb\x0f\x5f\x1e\xd7\x47\x5f\xfc\x50\x9e\x36\x5d\xaf\xb7\xff\x52\x37\xcd\x7a\xf7\xed\x87\x81\x12\xd0\xd4\xdf\x7e\x3f\xc8\x9a\xd3\x66\x4d\x53\xa4\xfd\xeb\x6d\xfd\x79\x3d\xfd\xfc\xc3\x97\x87\x9b\xd5\xbf\x6d\x07\xd5\xff\xee\xa6\xb9\xfd\xf1\x71\x77\x73\xff\x43\x79\x08\x50\x5f\x4b\x8b\xca\x0e\x64\x31\x65\xd4\xf8\x9c\xf8\x1f\xf7\x93\xa4\x7f\xda\x7e\xbd\xfb\xa1\x54\x33\xbe\x7c\xfa\xd4\x4c\x7a\x78\x59\xdf\xae\x77\x75\x91\x3a\x49\xf8\x5d\xfd\xf0\xf8\xbb\xed\xee\x6b\xbd\xbb\x1e\xf4\x99\xc9\xe1\x87\x52\xb4\xfc\xba\xde\x95\xf5\x3d\x6e\xef\x07\x3f\xd7\xf7\xd3\x52\xfe\x50\x7f\x79\x28\x9b\xf4\x87\xa6\xfe\xf6\xc3\x7e\x7b\x73\xfd\x5d\xf5\xdf\xf6\xf5\xee\xbb\xdd\x0f\x77\xff\x70\x9c\x94\xbe\x3c\xde\x34\x0f\xff\xf8\xb0\xff\xac\x1f\xeb\xcf\xfa\xf3\xfa\x6e\xbd\xab\x1f\xb7\x3b\x26\xa7\xdf\xfc\xb7\x51\x81\xbb\x23\x26\x60\x27\xb8\xa3\xb4\x96\xf5\x41\x19\x04\x3f\x23\xb9\xd6\xe1\x47\x6b\x7d\x94\xf1\x4d\x96\x1e\x0c\x4d\x5e\x26\x65\xc1\x86\x85\x91\x6b\x13\xf4\x50\xc5\x7a\x9c\x45\x6c\x60\x16\x49\xc2\x58\xc6\xd9\xe8\x6a\x58\xf5\xf5\x5e\xdd\x56\x9a\x1c\x18\xbb\x88\x8a\xab\x5a\x4a\xad\x0d\x20\x54\x39\xe0\xb3\x04\xd9\x82\xca\x77\xdf\xca\xcd\x66\xe5\xaf\xda\xfb\xd8\xe1\xff\x1d\x19\x83\xa7\xbd\x81\x3a\x84\x6e\x9f\x7b\xa0\x22\x24\x2b\xfd\x1a\x75\xb7\x52\xbe\x68\xda\xe8\x96\xbb\x52\x72\x4d\xe9\x16\x6d\x49\x09\x42\xa8\xc7\xdf\x57\xda\x40\xb8\xba\x98\x44\xa3\x66\x22\x39\xc3\x24\x22\x41\x32\xca\xd0\xdc\x43\x35\x6e\x3c\x2a\xcb\x13\x99\x78\x22\x8f\xbc\xe4\x44\x65\x37\x1e\xe2\xf4\x1d\x3a\x79\xbd\x94\xcf\xa7\x6f\xdb\x4a\xaf\x3e\xa0\x51\x7e\xee\x97\xa6\xda\x84\x57\xcf\xca\xf3\xce\x49\x2d\xfa\x40\xee\x14\x99\x63\x0d\x27\x7c\xae\x5b\xf2\xcd\x53\xfd\x32\xf4\x5c\xbf\xba\x7a\xaf\x3e\x98\x4a\x0c\x64\x9f\xeb\x98\x84\x7e\x7c\x25\xb9\xfd\xf9\x87\x0b\x03\xc9\x8d\xe2\x22\x23\x16\x61\x8b\x63\x1b\x17\x19\xaa\xd0\x86\x46\xe6\xbf\xde\x57\x33\x5d\xe4\x70\xc9\x6f\xac\x7a\x08\xba\x53\x30\xbb\x33\xd0\xad\xcb\x57\xe6\xbd\x99\x12\x6a\xd2\xb4\x74\x10\x42\x6f\x28\xcc\x14\x8a\x41\x59\x40\x09\x1e\x41\x46\x80\xee\x0e\x96\xc6\x99\xcf\x90\xdb\x54\x0b\xc9\x68\x50\xb0\xb7\xfa\xb7\x6d\x15\x57\x1f\x9c\xb8\xcd\x2f\x05\x3f\x6c\x41\x32\xdf\x18\xcf\x48\xae\x06\x85\x56\xe3\xa8\x33\xbe\x68\x29\x69\xda\x98\xf2\xb7\xa2\xa5\xa9\x8a\xc6\x4a\x19\x57\x1f\x28\x2a\x59\x4d\x66\x79\x2e\x2e\xe7\x32\xbc\xdb\x78\x9c\xad\x1d\x8e\xb3\x80\x9d\x23\x8f\xb3\x38\x22\x3e\x31\xc8\x24\x60\x7c\x34\x1c\x64\x84\xf4\xde\x25\xd2\x12\xaa\xeb\x08\xd5\x80\x0f\x3d\xad\x86\x23\xa4\xda\x45\x0f\x9f\x10\xe9\xf6\xfe\x1c\xd4\x69\x2a\x61\xa9\xe3\x09\x2d\x87\x4c\xd9\xb9\xa9\x9e\x9d\xd1\x4a\x66\xd4\xcb\x84\xce\x4d\xf5\xe4\x8c\x9e\xce\x48\xfc\x38\xc0\x7a\x80\x94\x5e\x3f\x4a\x59\xac\x39\xc7\xe6\x13\x15\x8d\x01\xb6\xec\xc8\xef\x9b\xaa\xa1\x27\x36\xe1\x19\x57\x9e\x78\xc9\x02\xba\x1a\x9d\xc2\xce\x8c\x3f\x80\x23\x4d\xa5\xed\x9f\x98\x37\x1b\x25\x40\xd6\x2d\x4d\xa3\xe9\x8d\xdb\x30\x7b\x05\x4a\x8e\x51\x31\x8a\x4e\xe6\x13\x5a\x8b\x36\xbb\xbe\x3e\x3a\x6e\xfd\xdb\x63\x03\x98\xa3\xe7\x16\x60\x92\x7a\x34\x80\xd5\xdb\x06\xf0\xd9\x26\xd1\xa8\x49\x26\x47\xdb\x74\xc0\xf4\x0d\xd6\xd6\x87\x51\x43\x8d\x49\x07\x28\x10\x5e\x75\x1e\xb7\x59\x37\x6e\xc2\x2d\xc4\x46\x1b\xc5\x44\x2f\xe5\x47\x2b\x2c\xf5\x25\x9f\xb5\x03\x66\xfc\x36\x9f\x26\xb4\xe0\x38\xd9\xda\x1d\xad\x80\xde\x1b\x85\x38\x43\xc1\x96\x14\x28\xcc\x6c\xe7\x96\x4d\xb7\xcc\xdc\x18\xf0\x71\xf2\xda\x58\x31\xd0\xc4\x05\x25\x81\x73\x03\xb4\xd3\x22\xfa\x6a\x4e\xef\x99\xdc\xd5\x3c\x45\x2c\xf9\xe5\x5f\x73\xb1\x3d\xd7\x20\x1a\x36\x28\xfb\x27\x88\xa9\x23\xaa\x6a\x56\xd0\x89\x18\x58\x4a\xa4\x8c\x7a\x4c\x2a\xaa\x24\x15\x12\x19\x3f\x00\xce\x42\x76\x48\xe8\x4c\x95\x5a\xdf\x07\xf7\x44\xeb\x3b\xf0\xea\x13\xdb\x6f\x46\x2f\xf3\x35\x99\x60\x60\x9b\x2a\x03\x60\x7b\x41\xbf\x76\xe7\xd9\x7a\x79\x02\x0a\x37\xff\x6a\xe2\xe6\x9f\xd7\xf3\xd5\xad\x10\x56\x00\x1f\xeb\x21\x65\x65\x47\x32\xb1\xa5\x5d\x46\xf0\xae\x6e\xfd\xca\x28\xf5\x76\x65\x2e\xaa\x6a\x89\x11\xc6\x44\x89\x2d\x14\x34\x26\xf0\x51\x70\x04\x28\x40\x48\xb3\x94\x81\xa6\x63\x3c\x88\xf2\x28\xc8\xef\x5c\xf8\xc1\x15\x46\x1c\x80\xac\x68\x60\x03\x3f\x1b\xd4\x39\x2d\x91\x12\x08\x6a\x79\xb4\x1c\x55\x22\x96\x3a\x41\x97\xaf\x42\x7e\xb4\x0a\x90\x76\x10\xfc\x6c\x54\x92\xa0\xef\x56\x40\x47\xea\xd5\x40\x47\x5a\xda\x76\xe1\x34\xb9\x68\xcc\x1c\xca\x59\x1a\x73\x3e\x5e\xff\xc2\x9f\x36\xda\xcf\x92\x00\xe2\xf7\x6d\x15\x9f\x94\x98\x6a\xac\x14\x56\x1d\x37\x74\x10\x8d\x8e\xea\x9c\x03\xd7\x3e\x5a\x5d\xd7\x3a\x4d\x60\xd3\x5c\x78\xd4\x6c\xe4\x60\x25\x50\xb8\xcc\x66\xf7\x56\x1c\x10\x07\xa4\xa1\x5b\xd2\x78\x86\x6c\xf6\x10\xb0\x31\x10\xbc\xf6\xe0\x70\x4a\xa8\x75\x41\xa8\x3a\x47\xa2\xf6\xaf\xe7\x27\x2f\x8d\x3e\xfd\x5d\xb2\xed\xb6\x57\x03\x36\x32\x24\xa9\x23\x1c\xb2\x0e\x60\x79\x41\xd8\x8e\x14\x0c\xb8\xa0\x41\x48\xdc\xa8\xd4\x39\x0c\xfc\x15\xa9\xec\xb4\xe5\x69\xc4\xcf\xbb\x5f\x87\x2c\x5e\xb5\xec\xda\xe5\x47\x57\xb5\xf6\xdc\x17\x94\xf3\x1a\x6c\x4f\x6d\x04\xec\x88\xd5\x6a\xd1\xb8\x03\x58\xaf\xc2\x21\x32\x7a\xc7\xe7\x3f\xa0\x60\xf1\xbf\xc4\xe4\x9e\xa0\xf2\x13\xb6\x89\x17\x26\x90\x4e\xd9\x22\x46\xf1\xfd\xe4\xf0\xf0\x1c\x52\xb5\xe0\x72\xb3\xa2\x15\x1b\x9e\x7d\x43\x1a\xa9\x54\xc8\xb4\x01\x74\x4d\xff\x06\xb3\x35\x7d\x3a\x98\x53\x57\x5e\x03\xd1\x0c\x05\x7e\x83\x1f\x9d\xad\xb1\xf2\x7b\x0f\x61\x61\x2a\x9e\x27\x0b\xf6\x99\x8f\x0b\x45\xc6\x8a\x0a\x53\x28\x43\x98\x23\xf8\x07\x89\x56\x64\xf3\xa3\x9b\x8f\xfc\xb9\x44\xb1\x34\x60\x90\x3f\x1c\xb5\x43\xe7\x55\xf7\xcc\xd7\x57\x1f\x0c\x29\x53\x35\xfc\x93\xec\x42\xf6\x4c\x88\x4b\xbf\x30\x2a\xc7\x3f\x30\xd5\x12\x13\xd0\x74\xde\x4f\xdf\xa3\x25\xd0\xb9\x0c\xb6\xc0\x94\x63\x12\xbb\xfd\xa7\x06\x7b\x36\x1e\x2f\x4c\x4a\x62\x2e\x4b\x80\x07\x7e\x4c\x87\xda\xfb\xd7\x0f\xb5\xe1\x89\x79\xef\x68\x0f\x9a\xa2\x5f\xf8\x76\x72\x34\x59\x9e\x8d\x9f\x87\x9a\x83\x9c\xcd\xa4\x82\x86\x35\x44\xae\x7c\x36\xf4\xd6\x45\xde\x6e\xe4\x0c\x6e\xaf\x79\xec\x24\x10\x3d\x4f\x4d\x7d\xac\xf1\x62\x48\x3f\x18\x24\x89\xf7\xb1\xd7\x54\x1e\x6d\xc8\x79\x86\x85\x27\x96\x09\x8f\x1d\x4a\xc0\x02\x8f\x4b\x07\x09\xeb\x71\x8b\x20\xe5\x62\x8f\x4f\xbc\xb1\x99\x32\xd4\x70\x81\x72\xad\x6e\x81\x79\x11\x17\x8d\x29\xc6\xe2\xea\xb6\xd2\x48\x10\xf3\x49\x24\x97\x42\x5e\x23\xf5\xeb\x5d\xb5\xd8\xd1\x11\x17\x56\x71\xcb\xf6\x74\x64\x97\x3a\x9d\xdc\x03\x04\x54\xe6\xe8\x54\x0c\x99\x05\x7a\x65\xaa\x6e\x1e\xf2\xe9\x9a\xb8\x30\x1e\x9d\x88\x59\x79\x0e\x62\xaa\xc1\x49\x89\xe0\x85\x5a\x78\x71\x02\x92\x44\xbe\x1f\x36\x22\x87\x13\xc8\xd4\x7b\xec\xdb\xa7\x47\xbf\xe5\x9c\x0a\x69\x34\xfe\x72\xce\x36\xa6\xf9\xf6\x82\xe8\x18\xb9\xb7\x70\x09\x71\x4e\x16\xc2\x82\x0c\x78\x9e\x0f\x2a\xf1\x0c\x08\xc5\xf3\x78\x8e\x16\xa8\xc0\x3d\xd0\xad\xc7\x33\xc5\x05\x22\x18\x15\xe7\xb6\x84\xc0\x97\xf3\xa2\x97\x60\x13\xb0\x1a\xe2\x26\xc4\xab\x5b\x16\x7d\xe6\x76\x89\xd5\x26\x82\x0f\x0d\x82\x73\xda\x6e\x02\x38\x2f\x7f\x2b\x3b\x37\xa7\x05\xf8\x3f\x4e\x54\xdc\x6f\x09\xe0\x50\x60\x16\xea\x12\xb3\x90\x5f\x5e\xdd\xa2\x67\x91\x84\xf7\x75\x71\x77\xac\x7a\x60\x79\x66\xa6\x01\x2c\xe6\x47\xd5\xb9\x90\x58\x75\x12\x00\x17\x3d\xd7\x3a\x11\x58\xc4\xbf\x12\x22\xf4\x32\x73\xd4\x10\xe7\x1e\x30\x14\xa9\x4a\x42\x94\x6f\x08\xec\xac\x48\x3c\x14\xf0\x06\x47\xe0\x63\x2d\x42\xca\xde\x61\xb5\x03\x27\xf1\xb3\xbb\x4b\x20\xc3\x9c\xcc\x35\x99\x9c\x4d\x68\xfd\x41\x51\x20\xa7\x05\xd0\xc3\x63\xc3\xeb\x50\xee\xcb\x1c\x38\xaf\xdc\xc1\xdf\xb1\x2b\xf5\x0d\x6e\xb6\xc7\x1a\xf9\x4b\x22\xe6\x0f\x72\x70\x8f\x06\x7c\x31\x87\x19\x45\x5e\x66\x6b\x90\xc8\x53\x98\x35\xd9\xd8\x13\x25\x0e\x88\x32\x2b\x89\x13\x97\xc5\x17\x70\x36\x8e\xce\x64\xde\x74\x59\x77\xa8\x47\xf2\xb2\x4c\x99\xf2\x60\xb1\xe9\x82\x4c\xd9\x12\x7c\x13\x88\x74\x04\x93\xfa\xb7\x52\x82\xcf\x08\x65\xed\x58\x22\x38\x89\x3b\xf8\xda\xa6\x4e\x8e\x70\xcb\x7b\xee\x73\x9c\x77\x8b\x23\xa1\xf8\x35\x0b\xd0\x03\xf6\x87\x36\x20\x7e\x93\x49\x15\x73\x0d\x28\xdb\x1b\x49\xd8\x2a\xbf\x8c\xa3\xb8\x1e\xfe\xe0\xed\xac\xad\xb2\x4b\x2a\x12\x94\x55\x76\x4e\x76\x44\x17\x64\xc1\x36\x02\xed\x62\x26\xd7\xa7\x04\x24\xbe\x68\x83\x66\xb1\x48\x4a\x0e\xbc\xbf\xfa\x60\x64\x53\x10\xa4\xb9\x95\x96\x11\xd6\x92\x4d\x03\x26\xfe\xbd\x20\x81\x7c\x0a\x61\x49\x71\x72\xa0\x8f\xd5\xe0\x44\x9f\x97\xc5\x3e\x00\x99\x26\x40\xd4\xae\x86\x4c\x05\xed\x56\x24\x87\x5b\xc3\xa4\x2a\x00\xe2\x52\x5a\x32\x1b\xbc\x29\x5a\x75\x86\x4d\x5b\x82\x01\x8a\xae\x9f\x83\x2b\xa5\x73\x8c\xb9\x81\x2a\x36\x5e\x02\xea\x39\x37\xc3\x2e\x9c\x76\x31\xbc\x41\x42\x72\xd1\xf8\x5d\xd7\x98\xc9\x26\xda\x59\x63\x9c\x81\x1e\x29\x23\x4d\x22\x6f\x71\x12\xa8\x51\xe2\xfe\xf5\x00\xc2\x39\xe2\x85\x84\x91\x58\x64\xd2\xad\x62\x23\x90\xfa\x10\x70\x53\x2d\x28\x32\xc7\xb4\x60\x07\x31\xa8\x0e\x9f\x54\x3c\x53\xa9\x0c\xeb\xc5\xfb\x86\x07\xb7\xc0\x90\xa3\x22\x56\xbc\x7c\x51\x50\xea\x5f\x31\x7d\xaf\xb8\xa8\xc0\x16\x2d\xa1\x0a\xf3\xa2\x51\x3c\x19\x9b\xac\xf4\xf6\x49\x22\x8f\xb9\x05\x3a\x96\x5c\x59\x09\xb7\xe2\x74\xf9\xbe\x66\x98\x76\x5c\x65\x60\xa8\x2a\xc1\x6c\x8b\x91\x69\xda\x20\x37\x73\x19\xff\x05\xca\x81\x7d\x2a\xa3\x77\x54\x59\x5c\x74\xf3\x72\x32\x72\x27\xaa\xd0\x24\x90\xf3\x7d\x37\xea\x0e\x17\x98\x20\x35\xda\xa8\xb2\xef\x87\x6a\x2d\x24\xa7\x2d\x24\xbb\xa9\x9a\x76\x16\x27\xd4\x55\x18\x00\x9d\x83\xc0\x8c\xe0\x0d\x39\x89\x9c\x77\x40\x28\x70\x82\xd9\xe1\x5a\xf7\xf0\xce\x2f\x38\x33\x13\xac\x04\x42\x61\x74\x65\x34\x8b\x9c\x2b\x1e\x5c\x88\xc9\x88\xef\x74\x01\x7c\xa0\x8a\xca\xce\x45\x4e\x71\x28\xc3\xf3\x28\x6a\x70\x69\x91\xe4\xcc\xcc\x16\x9b\x73\xcb\xe9\xec\xf0\x32\x7a\x9e\x58\x7a\x0e\x60\x8c\x0e\x02\x0e\x72\x78\x59\x4d\xf5\x4f\x89\x0e\x1b\x07\x9a\x4c\x86\x8e\xb7\x0a\xed\x3e\xce\x93\x20\x70\x14\x60\x97\x59\x4e\x10\x3d\xdd\x37\x3a\xf0\xc0\xe5\xe3\xed\xc3\x50\x07\x04\x23\xbb\xf9\x91\x6b\xd1\x93\x39\xe4\x2f\x7a\x3a\x9f\xbe\xf3\x6e\xa3\x04\x19\xab\x04\x93\x26\x29\xa4\xb9\x19\x85\xfd\x23\x33\x0a\xfb\x17\x21\x9a\x26\xf1\xca\x8c\x30\x88\xa9\x57\x89\x8e\xe6\x96\x16\x3c\x0d\xae\x0c\xbb\x0a\x9e\x58\x53\xff\x71\x96\x2b\xf3\x7e\x54\xc8\xbd\x6f\x0a\xd4\x78\x0a\x84\xfc\x2c\x54\x83\x38\x52\x87\xda\xce\xb4\xa4\x78\x17\x97\x83\x20\x1c\x90\xa9\x95\xb0\x32\x69\x86\x24\x60\x0f\xd4\x61\x1c\x57\x4c\x13\x5e\xce\x6a\xfb\xf6\x67\x60\x80\xc8\x8d\xb5\xb6\x7d\x1e\xba\x40\xc3\x38\x58\x7d\x6d\x67\x62\xed\xb2\x22\x59\x5c\x3d\x17\x57\x30\x69\xc4\x15\xf6\x64\x5f\xc3\x15\xa0\xf2\xcf\x31\x06\x93\xf9\x02\x54\x7e\xe9\x17\x2c\x74\x3a\x01\x3e\xfb\xf9\x59\xc3\x2f\x92\x2e\x9f\xe7\x0d\xbf\x6c\x9a\x7c\x3a\x18\x79\xc7\xd7\x8c\xb2\x12\x0a\x57\x21\x6d\x8a\xb0\x70\xc2\xd8\xf6\x69\x80\x84\xd6\xb1\xb6\xd8\x48\x14\xdc\x08\x64\x27\xbc\xcd\x9a\xa5\x85\x30\xe6\x6d\x46\xd9\x27\x18\x9b\x58\x15\x9f\x43\x3b\x62\x61\x94\x15\x3e\x95\x00\x85\x49\x8f\x74\xdf\xfd\x18\xfe\x92\x17\x5c\xd3\x9d\x7e\x84\x42\xeb\x1d\x6e\xdc\x95\x82\xe0\x05\x76\xa7\xf8\xbc\xe2\x5d\x93\x08\x42\x68\x1c\xc4\xa4\x9c\x40\xe7\x00\xef\x37\x4e\x83\x4d\x02\x3f\x18\x9c\x9c\x28\x1f\xa4\xac\xd4\x9e\xf2\x5a\xc8\xb3\xdc\xcb\x58\x46\x42\x79\x35\x12\xfb\x93\x1f\x0b\x23\xc6\x66\x4e\x39\x59\x62\xa6\xe2\xfd\x39\xf0\x82\x0f\xa1\x18\xd9\x24\xc8\x46\x72\xd0\x64\xe7\x09\x7c\x19\xe2\x54\x44\x34\xd3\x00\x79\x0d\xe4\x25\xd8\x5b\x05\xf1\x5c\xb2\x0d\xb5\xa0\x46\x3e\x13\xb8\xc4\x99\xb7\x3d\x1f\x92\xe0\xa0\xac\x79\xf3\x0b\x09\x23\x67\xe5\x4f\xdb\xe5\x91\xf8\x8f\x41\xc0\xf4\x0e\x21\x48\x58\x6c\x0d\xcc\xad\xce\x25\x47\x93\x60\xb2\x10\xef\xb4\x63\xe8\xc3\x16\x94\xbb\x96\xa3\x0d\xdf\x81\x6d\xb5\x0c\xd3\x40\x40\xd6\x9c\xc9\x00\xb2\xb0\x21\x80\x33\x7d\x10\x55\x0a\xf9\xd3\xc8\x93\x15\xfb\x8b\x4a\x6d\x01\x75\x90\x03\x89\xbe\x3f\xd9\xa4\xe9\xbd\xdd\xb1\xff\x1f\x7b\x6f\xfa\xdc\xc8\x92\xe3\x09\xfe\x2b\x69\xf9\x65\xad\xcd\xdc\x61\x01\xf8\xfd\x76\xeb\x03\x5b\xd5\x33\x31\x36\xd4\x74\x6d\x67\x17\x67\x4c\xdf\x58\x4c\xbd\x47\x59\x85\x52\xb9\x92\x92\xdd\xaf\xc7\xe6\x7f\x5f\x03\x3c\x22\x18\x07\x49\xf1\x08\xe6\xf1\x3a\xab\xf2\xb9\xa4\xb8\xfc\x02\xe0\x70\x38\x80\x5f\xbb\x76\xf8\x4d\x02\x74\x15\xa9\xae\xdf\x62\xa1\x0d\x2f\x21\xac\xa8\xcf\x91\x94\xa0\xe8\x36\x5a\xfb\x45\xba\x0f\x6e\xa7\x3a\xec\x9d\x6a\xc9\xf3\x45\x1e\xcc\x60\xb6\x25\xcf\x92\x35\x9d\xd9\xb6\xdd\xd9\x2e\x4e\x9c\xed\x37\x44\x70\x00\x41\xca\xf5\x61\x5d\xf0\x46\x54\x52\x39\x46\xab\xe5\x04\xd7\x85\x75\x31\xb7\xe0\x8d\xe2\x6d\x13\xd5\x42\x22\xf2\x24\x4e\xa1\xc8\x91\x01\xaa\x1c\x38\x96\x01\x8e\x65\x00\x06\x60\xce\xb3\x40\x02\x4d\xde\x05\x58\x6f\x24\xc0\x4a\x70\x0c\x31\x41\x20\x2d\x07\xc6\x45\xd4\xbc\x87\x26\x51\x01\x00\xad\x9c\x48\xb1\x08\xa8\x24\x6f\xa4\x14\x13\x88\xfb\xf3\x38\xc2\x92\x32\x90\x68\x3b\xc1\xcb\xc8\xbb\x6e\x29\x1a\x5b\x85\x80\xa0\x4f\xcb\x11\x7b\x93\x77\xd7\xb9\xa8\x15\xab\xd0\xbd\x0d\xb2\xf7\x22\x45\xb5\xe7\x86\x3a\xf0\x73\x2a\x24\xa7\xfd\x78\xe9\xe9\x44\xb9\x4c\xe3\x61\x69\x98\xe8\x49\x20\x44\xa9\x35\x41\x4a\xe5\x0b\x83\xac\xb1\xcd\x88\x39\x80\xb6\x50\xec\x48\xcc\x3c\x46\xd2\x65\xfb\x30\xba\x9d\x24\x2d\x7b\xe9\x17\xfc\x0d\x66\x3c\x12\x2b\x78\x3b\x5d\x18\x95\x53\xe3\xcb\x26\xf7\x78\x81\xa9\x24\x0f\x71\xf4\x59\x12\x67\x0d\x1f\x36\x7e\x57\xa5\xfc\x8a\x32\x58\x1a\xaa\xab\x1d\xf5\x89\xbb\x7a\x77\xcb\x8d\x23\x1c\x40\x90\xc5\xe6\xb3\x03\x4c\x45\xbe\x5e\xfa\x05\xe1\xdd\x2d\xf9\x6e\x9f\x87\xef\x6b\x7e\xd0\x14\x9b\x98\x9b\xde\x47\xa4\xac\xdf\x9c\xe2\x74\xed\xad\xd9\x8a\xf9\xa0\x8d\xf9\x72\x3b\x5b\x85\xa2\x24\x2d\x27\x1e\xb8\xe1\xed\x28\x03\x72\xf6\x6c\x11\x96\xbc\xaa\x8c\x3e\xcb\xbd\xa6\x76\xb6\x46\x77\xc3\x51\xb3\x35\x3a\x3a\x6e\xa3\xbe\xa6\xf1\xc1\xb6\xa5\xef\x68\x46\x03\x37\x84\xfa\x90\xa1\x18\x18\x36\xbb\x6f\xf0\x27\xe4\xc0\xcc\x97\x7e\xe1\x4b\x73\xb1\x19\xad\xd9\xb3\x5b\xf0\x39\xce\x64\xe0\x90\x22\xb0\xe9\x62\x3d\x8c\xac\x53\xf5\xd3\xc2\x67\xe3\xb9\x91\x85\x24\xdf\x9e\xf5\x6f\x63\xde\x35\xcd\x46\xdf\x6c\xab\xbb\x7b\x44\x1d\x59\xfa\x98\x1c\x1c\xa5\xd0\xf1\xad\x0c\x90\x3f\xea\xda\xd8\xb1\xfc\xb0\x66\xf3\xef\x7f\x7a\x1f\xc5\xb3\x7c\xeb\x7b\x4f\x5b\xaf\xf2\x1d\x07\x5f\x27\x55\x60\xa5\x02\xb4\xd7\xab\xc1\xd5\xe1\x2e\xd7\xab\xc1\xe7\x1a\xfc\xf5\x6a\x08\x9d\x69\xe0\x7a\xa6\xaf\x21\x76\xe7\xe1\x3a\x55\xa4\xee\x44\x5c\xa7\x0a\x2c\xba\x53\x71\x74\x1d\x27\x1f\xbd\x4c\x24\x84\x58\xa9\x08\x6b\xda\x98\x92\x8a\xbb\x5b\xb4\xf5\x1f\x68\xef\x6e\x45\xfe\x97\x71\x41\x7e\x9d\xbd\x42\xf8\x8f\xc0\xbf\x7b\x41\x6a\xb4\xf5\x1d\xaf\x8a\x92\x8a\xfa\x0f\x23\xe7\x72\x05\xa0\x9f\xa3\x03\x93\x58\x3c\xf4\x70\x65\x25\xf3\x30\xc5\x05\x9a\x3e\xca\x3e\x6b\xee\x1a\x12\xce\x79\x3f\xe9\x15\x86\xbe\x01\x80\x2f\x45\x88\x56\x22\x91\x88\x57\xfa\x6e\xbb\xc8\x4b\xc3\x86\x62\x7f\x1b\x00\x7c\x99\xd8\x1f\xbb\xf0\xe5\xe8\x2a\xf0\x91\xd5\x46\xbf\xd2\x08\x89\xb4\x01\x23\x26\x1a\x6d\xe5\x20\x35\x6a\x16\xb8\x73\x4c\x8a\x78\x09\x35\x76\xd9\x6e\x9b\xdb\xdd\x00\xeb\xcb\x5e\xf2\x95\xe6\x22\x5f\xf7\xe0\x8c\x06\x8b\x37\x01\x9c\x24\x86\x0d\xca\x36\x20\xe2\xca\x49\x56\xcd\x04\x91\xbf\x67\x8c\x72\xed\x7b\x8a\xc0\x4b\xc2\x6c\xe2\xdd\x7d\xcc\x45\x3d\xd7\x92\xe0\x38\xce\x12\x38\xab\x52\x93\x3b\xb3\x50\x28\x60\xf2\x2e\xac\x4c\x4e\x32\x8b\xd2\xa1\xa0\x2d\x7f\xd4\x43\xe1\x75\x00\xe3\x17\x49\x8e\x60\xb3\xb5\x4e\xca\x3c\x2f\x3e\xe7\xe1\xe7\x8d\x4f\x7b\xe6\xc2\xfa\x3d\x42\x0c\x33\x23\x2e\x9b\xa6\x83\x84\x40\xa8\x02\xeb\x13\x16\x30\x48\xd6\x7f\x30\x5e\xd5\x2e\x9c\x51\xbc\xdd\x14\xab\xdd\x16\x79\x35\x32\xfc\xac\x97\x75\x89\x3b\xd2\x3b\x9e\x31\x46\x80\x02\x6e\x28\x87\x73\x48\xde\x66\x63\xc1\x29\x94\x13\xce\x7a\x56\x98\x9c\xc1\x48\x1c\x98\x0f\x4b\x2f\x60\xb2\x6d\x8a\x7e\xed\x04\xec\x59\x96\x2b\x29\x1a\xcd\xdf\x27\x4d\x50\x84\x95\x06\x9f\x9b\x81\x60\x9d\x76\x50\x38\x65\x79\x4e\x7d\x3e\x79\x77\x3c\xc6\xae\xdd\x12\x82\x91\x8c\xdf\x92\x6c\xdf\x75\xaf\xfb\x6c\xbb\xea\x57\x23\xc9\x4d\xe5\x30\xf9\x06\x65\x32\x48\xf2\xda\xa2\xc4\x19\x64\xc7\xbc\x4e\xd3\x2f\xd3\xff\x26\xa1\x5d\x4a\x4b\x41\xe5\x75\x8d\xd7\x3b\xd3\x6e\x06\x08\xd8\x47\xbb\x2b\xc1\x04\x90\xc9\xd2\xe2\x42\xeb\x00\x8d\x76\x90\x78\x57\x69\xc3\x74\xb4\x4b\x2b\x23\x68\x06\x98\x78\x6b\xc7\x94\x1b\x1a\xca\x6d\x2d\x2f\xf2\xff\x45\x04\x9b\x56\x0d\x3c\x84\x61\x52\x54\x06\x22\x89\x0d\x29\x67\x20\x6f\x53\x90\x0b\x12\xbf\xe7\xb9\xf7\xfc\x86\xf7\xd9\xd7\x98\xd5\x61\x45\xfc\xb4\x38\x12\x6d\x83\x21\xbc\x57\xa4\xce\x20\xd1\xa1\xc4\xea\x65\x32\xd8\xef\xf5\x25\x23\x5b\x94\x86\x87\x05\x05\x10\xbd\x9d\x18\x25\x70\x11\x31\x2e\x4c\x01\xe2\x16\xda\xbf\x6b\x6a\x2c\x67\xf9\xc6\xf8\xae\x55\xf2\xda\x42\x3e\x31\xbe\x5d\x57\x5c\xbb\xc1\x96\x76\x81\x74\xaa\x53\xd7\x00\x94\xde\x89\x67\xab\x75\x5b\x08\x58\x6d\x74\x17\x02\x76\xfb\x08\xcb\x7a\x0b\x7e\x26\xde\xb0\xd0\x20\x54\x0a\x94\x9a\x75\x6a\x7b\xb5\x90\x50\x7e\x27\x3c\x14\x2f\x40\x8f\x0d\x90\x14\xc5\xca\x6b\x9f\x9d\x35\xb9\x98\xf3\x56\x83\xf7\x65\x6b\xaa\x02\x58\x21\x32\x3f\x37\xb2\x8d\x0c\x61\xa3\x69\x4e\xe2\x75\x9b\x96\x10\x10\xc2\xd6\xcc\x52\x54\x5a\x16\x31\x27\x2b\xa3\x10\x29\x15\xe0\x46\x8f\xcd\x9d\x08\xfa\x53\xb2\x9b\x0f\x71\xd0\x0b\x16\xd0\x66\x5d\xf4\x43\x9c\xd6\x9a\xa8\x6f\xf8\x59\x17\x0b\xbb\xa6\x0b\xf0\x67\x33\x39\x84\x45\x18\xd5\xe4\x47\x35\xc5\xf5\x89\xd8\x82\x93\xf6\xe9\x10\xfa\xea\x74\xfd\xd9\x6f\xb0\x1b\xd7\xf2\x4d\xb9\x37\x73\x87\xe9\xb2\x1d\xea\x2e\xf2\x72\xc3\x40\xfc\x88\xe4\x1c\xa0\xb8\xd6\x64\x5b\x92\x0f\x5d\xba\x95\xa1\xa9\x24\x46\x89\x0b\x09\x89\xc7\x01\x0b\xc8\x33\xc2\x27\x56\x22\xa5\x8e\xb5\xe0\x8d\x62\x19\x9a\xe4\x2f\xfb\x64\x23\x4a\x0c\x07\x79\xa0\x7e\xfc\x56\x3e\x9f\xca\x56\x4b\xed\x32\x30\x87\x35\x59\x79\xc9\xf7\xc5\xa0\x2c\x12\x3f\x17\xf5\x32\xc7\x57\x99\x77\xf7\xbc\xa6\xf3\x51\xd7\x42\xfa\xb5\x6c\x6d\xd0\xcd\x37\x65\x06\x0c\x4f\x95\xb3\x02\xa0\xd0\x34\x66\xdb\xcc\xbb\x47\x51\x99\xa9\x96\x0e\x49\x44\x84\x6e\x7e\x3b\x05\x7c\x63\x84\xe6\xcb\x4b\x98\x5b\xf3\xf2\x5b\x11\x2f\xf2\xbc\xd4\x75\x0f\xa9\x08\x92\x85\x18\xe7\x81\x97\xdd\xec\xc1\x65\x15\x76\xe3\x7e\xc1\x07\x81\x7e\xe8\x1c\xb1\x58\x2d\x8b\xdb\xd6\xa4\x2d\x10\x38\x96\xe6\x28\xc3\x16\xd6\x9e\x65\x34\xe6\x28\xa7\x9c\xfc\x5d\xe4\xb4\x40\xe7\x5a\x19\xa0\xf6\x6b\x9e\x55\x7b\x23\x84\xc6\x8f\x9b\xe6\xf1\xa2\x0e\x12\x3c\x59\x7a\xef\xa0\x96\x7f\xfe\xb4\x5b\xfd\x97\x21\x4a\xac\x7a\x51\x18\x44\x3a\xa3\xed\x4b\x80\x52\x70\xc8\x98\xbc\x1b\xed\x07\x01\x81\x4c\xa5\x49\x81\xa7\x2e\xf2\x7f\xa1\x21\x90\x20\xb4\xc4\x2d\xe7\xc9\x1f\x7e\x48\x5b\x0a\xac\xd1\x50\x88\x3f\x8a\x80\xd6\x6c\x10\xa1\x77\x88\x58\xb7\xee\x27\x09\x9c\x4d\x02\xbd\xc4\x52\x7f\x7c\x7d\xea\x8a\x6b\xff\xce\x55\xec\x2a\x6b\xff\x10\x55\x9f\x04\xf2\xc2\x67\xf9\xda\x37\x07\x43\x32\x39\x74\xd2\xd7\x45\x43\xb2\x49\x03\xba\x2a\x41\x90\xad\x2c\x4b\x6d\x81\xaa\xf0\x8d\xe5\x52\xa2\xa7\xe6\xd8\x00\xa5\x20\x7f\x39\x63\xcd\xd6\x42\xdd\x08\xd0\x9e\xdb\x44\x39\xd7\xef\xde\x54\x9d\x06\xdd\x3d\x82\x97\x7d\x13\xda\x25\x50\xda\x86\x06\x02\x5a\x39\x19\x37\x2d\xb0\x66\x3e\x39\x02\x61\xe8\xf6\x12\xa9\x42\x1a\xa9\x78\xb7\x37\xfc\x42\x04\xaa\xff\x35\xeb\x17\x5f\x0a\x95\x6e\xde\xf0\xcb\xfe\x6d\xf9\x0d\x72\x7e\xaa\xe6\x0d\x69\xc6\xa5\x2a\xde\x37\x65\x0d\xb2\xe2\x6f\x8a\x10\x4d\xa7\xeb\x5d\x93\x92\x38\x34\x53\x14\x80\x4c\xbf\xd3\xa4\x94\x3f\xd1\xcd\x41\xd0\xf9\xea\x99\xca\xe2\x75\x54\xd2\x89\xd9\xec\x68\xcd\xaa\x93\x96\x6f\xef\x62\x19\x15\xd9\x95\x91\xb4\x19\x81\xf9\x47\x05\x1d\x16\x69\xc5\xbc\x94\xf8\x6f\x1d\xf8\xff\x2f\x3a\x28\xf9\x43\x85\x4d\xbc\x41\x41\x92\x11\xff\x0f\x1e\x74\x89\x83\xb0\xff\xf1\xee\x16\x8d\xe2\x37\x09\xc4\xf9\x43\x3b\xe5\xb4\x7b\x11\xbc\x1f\xe5\x94\xdb\xc4\x16\xe8\x99\x20\x6a\xb9\xca\xcf\xbc\x68\xa7\xe5\x71\xed\x16\x69\x88\x7c\x7c\x8a\x98\x54\x18\xd6\x9a\x56\x85\x72\xe0\xb4\x6c\xcb\x0b\x2d\xb1\xcd\x1f\xa2\x22\x02\xa7\xa2\xc2\x50\xfa\x55\xa1\x3c\x18\x65\xf3\x76\x9f\x17\x46\xc1\x62\x5c\x18\x5a\x6b\x33\x42\xdc\x7e\xd9\x02\x6d\xc7\x21\x24\x76\xee\xcf\x4b\xc6\x77\xce\x53\x68\x36\x3c\x68\x37\x4c\xbb\x4a\x10\xa0\x4d\x0e\x96\xcc\x47\x64\x27\xf4\x8e\x86\x8b\xfe\x64\xf3\x74\x26\x67\xfc\x78\xa3\x7b\x88\x1b\xf7\xf0\xc9\x5e\x27\xae\xc1\x18\xa0\x80\xc1\x8b\xfb\x3a\x2b\x49\xca\x55\x28\x78\xe6\xee\x86\x12\x18\x39\x23\x93\xd8\x52\xc9\x9a\x70\xf2\xdc\x8f\x14\x3e\x65\x57\x24\x6a\x6a\x87\x99\x32\xe6\xbb\xee\xc2\xe2\x23\x50\x55\x9b\x4c\x56\xf9\x5e\x12\x0c\x75\xcc\x98\xf0\xcc\x98\x1d\x92\x21\x26\x18\x40\xed\x21\xd5\x8c\xa9\x89\x5f\xd0\x4e\x3e\x91\xb4\x07\xa7\x2c\x84\x39\x8a\x2d\xf0\x06\x8d\x18\xaa\x53\x3e\x06\x14\x8b\x48\x54\x23\x72\x3a\x9e\xa4\xf3\x2c\x7a\xf0\x95\x07\xc1\x95\xab\x90\x67\x1a\xec\xdc\x2a\x02\x3f\x27\xae\xa5\xe2\x59\x8e\x60\x17\x18\x56\xbc\xfa\x24\x25\xb4\xcf\xff\x5f\xe5\xb3\x4c\x12\x24\x7b\xc3\xdb\x54\x8d\x15\x0f\x0f\x01\xdd\x90\x40\xf0\xfa\x06\x09\x9e\x42\xce\xe8\xd1\x74\xd4\x65\xb4\x7c\x9d\x20\x8a\x77\x07\x16\x3a\x81\x5d\xd5\x88\xf5\x42\x81\x5c\x7a\xa6\x67\x10\x97\xcd\x3e\x45\xd3\xc6\x4c\x44\xce\x37\x84\x99\x98\xa3\xb8\x73\x2a\x8a\xaa\x1d\x18\x11\xa9\x20\x80\x8d\x81\x87\xdf\xb0\xfa\x9c\x24\xb3\x54\x94\x32\x6c\x58\xf7\xaf\x02\x48\x5e\x9b\x1b\xc1\xb8\x17\x5e\x44\xf9\x84\x58\x34\x9b\x0f\x9c\x30\x51\x23\xe3\xd3\x94\x74\x7f\x9c\xbc\x21\xa7\x30\xec\x26\xd6\x3d\x64\x5a\x49\x4a\xa0\x1b\x92\x79\xe2\x61\x92\x4f\x34\x3f\x4f\x91\x0d\x3f\x49\xf4\x04\x12\x3d\x55\x37\xe9\x66\x16\xfe\xdf\xbc\x95\xff\xa5\x9f\x6b\x56\x7d\x5e\x7e\x79\xe9\x43\x31\x7c\x79\xb9\x57\xef\x5f\x5e\xef\x3f\xeb\x5f\x73\xa6\x80\x1e\x16\xc7\x36\x53\xa4\x7a\x79\x7d\xfa\xfc\x4b\x3f\x3f\x9f\xfa\xfc\xf4\x6f\x7d\x5c\x1f\xfe\x5b\x3d\x4b\xfe\x8c\x5f\x86\x09\x35\xd4\xfb\x5f\x97\x2f\xaf\xbb\xaa\xe9\xe4\x29\x50\x2b\x89\x84\xfc\x65\x18\xd0\xad\xde\x6f\x78\x63\xaa\xf3\xed\x3e\xee\x56\x1b\x3f\xa9\x5e\x72\xdc\xda\x2f\xa3\x48\x36\xf5\x3e\xa3\x2a\xe8\x3e\x2a\x4a\x13\x35\xd1\xde\x96\xec\xd8\xa3\x07\xfe\xfc\xf4\x6f\x9f\xda\x47\x1e\xbf\xf4\x81\x14\xb6\x0e\xca\x6a\xdd\x3a\x8c\xfd\xb2\xcb\x8b\x4c\x90\x2b\x1e\xf5\xcb\xeb\xf3\x08\xd8\x22\xfb\xda\xa8\xf7\x8f\x5f\x5e\x1e\x56\xfa\xd3\x53\xbf\x8a\xf6\x54\x56\xbd\x7f\x78\x5c\xfe\x76\xaf\x7f\xcb\xfb\xf3\x1e\x2e\x4c\xe7\x1c\x44\xbd\x7f\x16\x43\x8e\x5e\x56\xd5\xfb\x5f\x76\x18\x03\xdb\x07\x9e\x3e\xdd\x8f\x1f\xf8\xe7\x4f\xf7\xcd\x70\xef\xa8\xa8\x6b\x20\x50\x8f\xed\xe2\xfe\xcb\xae\x15\x5f\xbd\xdf\x3e\x30\x1a\xb8\xbe\x62\xf0\x7f\xae\x9b\x03\xbc\xc3\x19\x6f\xe5\xff\x7e\x79\x5a\x3d\x2c\xab\x6b\x26\x00\xff\x20\x35\x8c\x32\x80\x97\xcb\x97\xf5\xeb\xf2\xb7\x3f\xf5\xd0\x3d\x7a\x59\xb2\xff\x75\xfd\xe5\xf1\x6f\x2f\x7f\xde\x75\xb1\x97\x62\xfb\xc3\xf2\xe3\x7f\x59\xae\xba\xa9\xab\xff\xc7\xfd\x97\xd7\xe7\x65\x35\xb8\x5a\x2e\x3f\x7f\xfe\x7d\x70\xed\x2f\x0f\xab\xd7\x2f\xcf\xdd\x2b\x37\xeb\xe5\x6b\x06\x58\xec\xd6\xba\xac\xfe\x9e\x2f\xbe\xf4\x13\x83\x3f\xbf\xfe\xe3\xf3\xd3\xdf\xef\x3f\x0d\xaf\x76\xb3\x8f\x7f\xfa\xdb\xd3\xbf\xff\xa9\x87\xb4\xf4\x5b\xef\xd3\x2f\x7f\xef\x7e\xf4\x9f\x3e\x6d\xee\xab\xa7\xcf\xdd\xda\xff\xf1\xe9\xe9\xef\x8f\xcb\xe7\xbf\xf7\xfa\x52\xfd\xfa\xe1\x75\xd9\x4f\xf2\xdd\xff\x73\xbd\x7c\xbe\x3f\x25\x7f\xf7\x36\x83\xbd\x5e\x49\x0a\x7b\xc9\xdf\xad\x1e\xce\x4a\xfb\xad\x96\x7b\x5f\xab\x09\x6f\xf5\xf4\x7c\xdf\x21\xbb\x6e\xa2\xf0\xdc\xf4\x87\x09\x62\xbb\x82\x80\x9a\x36\x61\xee\xd9\xae\x93\x81\x9f\xe7\x88\x0d\x36\xbf\x5b\xda\x8c\xe8\x6f\xb7\xb9\xaf\x09\x62\x85\x04\xc4\x6a\x02\xe1\xd2\xf1\x36\xdb\x65\x04\xf4\x1c\xe6\x2f\x26\xcd\x30\xc7\xa2\x8e\x5e\x88\xa9\x8d\xa5\x17\xb3\x25\x18\xc3\x1f\x28\xbc\xe4\x6d\x9e\x09\x72\xb0\xdd\x02\xdc\x53\x46\x29\xed\xbe\xe4\xb4\x1c\x61\x52\xb1\xf7\xd0\x25\x77\xc7\xde\xdd\x06\x45\xb8\x7d\x4a\x75\x4f\x44\x59\x5d\x10\xbf\x52\x79\xd6\xd0\xde\xc7\x9a\x07\x26\x4a\xd7\xfb\xc3\x0d\xf5\x38\x05\xef\xf2\x79\x22\x9a\xc3\xa4\x24\x25\xc1\x10\xbd\x97\xac\x06\x13\x2b\x39\x14\xd6\x6e\x09\xd4\xde\x2d\x34\x90\x53\x45\xbe\xa5\xdc\x0e\x2c\x65\x49\x28\x44\xac\xf2\x59\xa7\x23\x78\xbb\x84\x9c\x5b\xba\x31\xb1\x47\x0d\x64\xe7\x04\x41\x92\xdb\x0b\xc6\xf7\x10\x4f\x99\x92\xb6\x55\x12\x1c\xf8\xee\xcb\x0a\x48\xcc\xa1\xbc\xdb\x8f\x60\x47\xd0\xc8\xca\x8a\xdb\x03\xdf\x57\x72\x7f\xf0\xb2\x98\x52\x15\x8c\xbb\x9c\x7d\x41\xed\x9c\xc4\x49\xc9\x98\x41\x8f\x8b\x08\x64\xa5\x43\x8a\x3b\x34\xc2\x5d\x6e\x46\xf2\xee\x51\x47\x88\x24\x0e\x1b\x63\xe4\xe3\x04\x5e\x51\xa8\xf2\xc0\xf5\x6a\xe0\x26\xf1\xb8\x56\x7a\x3b\x68\xc3\xd7\x21\x04\x4d\x60\x5c\x15\xa0\xf0\x5a\x42\xc0\xfb\x8d\x44\xa3\xc1\x56\x3a\xe9\x1d\xfd\xd3\x12\x62\xe2\x2b\xdd\x8e\x5c\xff\x5d\x4b\xaa\x98\xa3\x13\x4f\x91\x1d\x80\xd3\x2a\xbf\x9c\x87\x6e\x58\x2b\xd8\x79\xb6\xb9\x04\x3f\x1a\x56\x08\x41\x71\xa3\xe7\xe2\x6f\x62\x10\x02\xb7\x1a\xdb\x60\x40\x95\x87\x16\x08\xda\x91\x20\xaf\x8a\x7c\x3c\x3b\x26\x2e\x8c\x60\xe4\xb0\xd1\x4f\x25\x0c\x8c\xdd\x49\x83\x85\xae\x69\x50\x8f\x88\x10\x75\x26\xc2\x39\xf1\x06\xc2\x30\x8f\x0f\xdf\xad\xa9\x50\xef\x22\x43\x7e\x5d\x92\x27\xed\xa2\xc3\x5c\xad\xb2\x32\xc7\xaa\x9e\xe3\xed\xab\xf5\x68\xcd\x43\xed\x51\x45\x38\x7c\x5f\x19\x30\x51\x31\x11\x55\x63\xd6\x45\x95\x59\xb7\x26\xc0\x7a\x4b\xd6\xc8\x1e\x70\x2e\x27\x03\xe9\x5c\x84\x68\x98\x22\xbb\x64\xd9\xff\x5e\xe6\xe5\x71\x84\x46\xb3\xe6\x4f\x20\xa5\x7e\x80\x19\xea\x8f\x48\x7f\x86\x06\xb2\xa2\x50\x49\x5c\xe3\x46\xdf\x55\xad\xd0\x3d\x66\xe2\x46\x73\x2e\x33\xd4\x9f\xa7\x3e\xdd\xc8\x3c\xd5\x21\xa3\xc2\x40\xeb\x62\x20\x62\xa4\x6b\x16\x4c\x9c\x27\xf1\xf4\xa3\x5e\x13\x74\x23\xa2\xda\x2a\x06\x02\xae\x50\x8d\x14\x98\x9b\x6c\x2f\x23\x1c\x74\x22\x4b\x28\x99\xaf\xd9\xa8\xfb\x4e\xa1\xa9\x3a\xe2\x09\xb6\x7d\x47\x9e\xcd\xf5\xbe\x1c\x94\x3f\x59\xfe\x5b\xb0\xfc\x2d\x59\x10\x9f\x68\xc4\xce\xc2\xd8\x7b\x94\x82\x32\xd4\xea\x10\xbb\x88\x8d\xe9\x7d\x5d\x2c\x2c\x58\xbb\x2e\x06\x73\x2e\xe3\x8d\x4c\x89\xa3\x15\x49\xce\xeb\x78\x45\x1a\x2d\x48\x42\x64\xdc\xfa\x76\x34\x47\x54\xba\x6d\xf7\x48\x6c\xb5\xbb\x97\x29\x94\x2b\x2f\x4c\xde\xcd\x14\x80\x1a\x9c\xf8\x48\x90\x87\x48\x95\xf6\xac\xed\xf9\x3e\xd8\x43\xcc\x89\x8d\x16\xc3\xb4\x01\xe4\x87\x40\x08\xdd\xe4\x24\xa4\xc4\x7f\x9c\x78\x2c\x4b\x2c\x16\xf2\x0d\xa9\xe9\xc4\xbc\xbb\xfb\x95\x66\xaf\xa8\xec\x65\x17\x8b\xca\xe6\x7a\x3a\x8e\xf9\xa6\x0e\x32\xc4\x8a\xfb\xc6\x1d\x24\xe5\xc1\x1b\x2e\xba\x01\xd8\x51\x19\x5a\xd8\xee\x95\x3a\x0f\x50\x6f\x3a\xda\xfd\xe5\x14\xab\x08\x29\x5f\xf6\x6a\x54\x71\x41\xc3\xa0\xf2\x51\x3e\xb5\xd8\x4f\xa7\xe6\xef\x6e\x4d\x21\xfe\x4e\xb1\x74\xe0\x7d\x15\x74\x60\x32\x46\xb0\x5c\x98\x34\xb7\x32\xb9\x76\x91\xc0\xd1\x1c\xc5\x4b\x9b\x50\x04\xc6\xf6\xbb\x10\x59\xdb\x32\xa4\x12\x10\x6e\x30\x80\xab\xc4\x39\x3d\x17\xdb\xe8\xdf\x5b\x07\x06\x55\x2c\x4d\xc1\x42\x19\x03\x44\xb1\x9a\xda\x93\x71\x80\x4e\x48\x81\x6f\x98\xdd\xa0\x88\x0b\xf2\x10\x70\x67\xbb\xe6\x53\x0d\x41\x15\x25\xed\x32\x8b\xe2\x00\x56\xb2\x1b\xb6\x49\x2f\x35\x44\x57\xe9\xc8\xda\x60\x04\xc2\x79\x3d\x14\x44\x10\x71\x39\x48\x65\xaf\xc1\xa0\xa6\x33\x66\x97\xf7\x72\xb3\x41\x8e\x65\xd5\x8c\xc0\xb4\x89\xf1\x8f\xc8\x7a\xec\x20\x9e\x98\x1b\xff\x1c\x3c\x8c\x36\x05\x3b\xf9\xd2\xd0\x57\x99\x66\x0f\xde\x6b\x16\x03\x65\x4e\x89\xa6\x25\xeb\xac\xeb\x4e\x6b\x01\x85\xaf\x58\xe4\x9f\x37\x8f\x0e\x4e\x10\x74\xa7\x41\x76\xec\x4d\x9d\xce\xdd\x08\xcc\xc3\x92\xd2\xb6\x9f\xf6\x3c\xe7\x73\x4b\x98\x33\xa7\xef\xba\xad\x51\xdc\x39\x72\xe6\xf4\x7d\x69\xd3\xa7\x43\x61\x33\x46\x75\x73\x0e\x88\x5f\xe7\x5a\x77\x47\x56\x83\x33\xe2\xc2\x77\x86\x98\x39\x1c\xdf\x6f\x0c\x44\x89\x97\x91\x03\x32\x72\x03\x32\x41\x5d\x0b\x44\x89\x43\xe9\x36\xa8\x90\xe8\xda\xc1\xec\xaf\xfb\x17\x86\x32\xba\xad\x4b\xa4\x27\x53\xaf\x81\x84\x4c\xe6\x8e\x77\xde\x24\x64\x8c\x6a\x2b\x64\x1f\x59\x19\x46\x55\xb0\x94\x75\xc2\x09\x94\xb8\x30\xd9\xe9\x06\x73\x86\x11\x0a\x5c\x9c\x9c\x9a\xff\xc8\x24\xf6\x39\xe7\xa0\xb1\x23\x8c\x0e\x39\xd6\xf4\xdc\x05\x9a\x70\xa6\x8e\xc8\xcd\x3e\x4a\xae\xdf\x93\xb7\xa4\x81\x92\x44\xd8\xb2\xb2\xeb\xe3\x74\x73\xc9\xc3\x90\xc6\x22\xb9\x49\x61\xff\xf5\xa6\xf4\x8c\xc4\xf6\x57\xc2\x3e\x39\x0b\x5e\xa3\x94\xe4\x92\x55\xa3\x81\xd9\x09\xd9\x0d\x1d\x98\xf8\x5d\x70\xd7\x11\xc0\x17\x6d\xe6\x8c\x64\x6b\xd8\x11\x08\xb3\xd6\xc1\xbf\x26\x2f\x4c\x2a\x41\x4c\xbc\xdb\xa0\x74\x0d\x76\xdb\xdb\xd0\xef\x0e\x58\xa9\xa7\x7f\xe7\xf3\x9e\x29\xf6\x42\xe2\x0d\x6a\x6c\xc9\xca\x46\xcf\x07\xb5\x86\x10\x34\xb8\xc8\x29\x6a\x20\x08\x6e\x41\xc3\xf8\x41\xb9\x32\x2d\x42\x19\x16\x86\x4a\xe2\xdf\x28\x2c\xdc\x9a\x80\xdc\xe0\x33\x06\x25\xc9\xcd\x42\x3e\x36\xb8\xd7\x54\x3f\x25\x2a\x9a\x97\x40\x39\x49\x83\x24\xc9\x9a\x99\x2e\xba\x9e\x9c\xc4\xba\x01\xa6\x4a\x72\x1b\x4a\xc1\xfb\xe3\xbc\x9f\xee\xfb\x75\xee\xc9\xf4\x73\x7a\xd3\xcc\x76\x31\x41\xde\x04\x06\x30\x66\x26\x89\xad\xa5\x68\x1b\x66\x8c\x72\x6b\x84\x90\xda\x04\xb6\xe2\xd0\xee\x54\x21\x57\x47\xaf\x90\x97\x60\xd7\xbb\x5b\x24\x95\x4a\xb2\xf9\xc3\x12\xf4\xda\x1e\x5c\x18\xf0\x41\x85\x92\x8a\x5e\x6a\x23\xab\x8a\x45\x28\x31\x1b\xd4\x3b\xcf\xeb\xfc\xc7\x75\x71\xdf\x32\x53\x0b\xda\x84\x57\xa9\x44\x1a\xb5\xbb\x19\x8d\x50\xa2\xef\x41\x49\x4a\xbb\xd7\xac\x18\x4b\x72\x66\xea\xa4\xfe\x0d\xe2\xb2\x9d\xfb\x34\x18\x29\xc9\x33\x22\x61\xc1\x39\xab\xae\x65\x41\xe3\x94\x14\x3d\x41\x73\x55\x70\x39\xb2\x92\x40\xcd\x65\x23\x88\x33\x2c\xe5\xcd\xbc\xa1\xc7\x6e\xc0\x44\x43\xb6\x95\x44\x2d\x70\x31\x97\xdd\x00\xbf\x1c\x7a\x71\x13\xc4\x3b\xac\x2b\x21\xca\x35\x12\x42\x9a\xcc\x6c\x1e\x16\xa1\x4c\x0b\x57\x86\x81\x34\x28\x94\xdb\xc7\xe2\x85\x92\x76\x1b\x5b\x0a\xab\x0f\xee\x09\xee\x27\x8b\x98\xc9\x71\xf1\xec\xf7\x26\xbe\xaf\x85\x8b\x77\x01\xf5\xe8\x76\xa1\xaf\x44\xfa\x89\x1c\xbc\x22\x64\x9e\xa4\x7d\x3b\x8b\xdf\x09\x5c\x18\xc6\xc3\xe7\x80\x20\x35\x8c\x92\x97\xab\xac\x4b\xf4\x25\x83\x3b\x42\x32\x94\x64\xc1\xd2\x2c\x00\x6b\xb8\x6d\x82\xa4\xdc\xe8\x29\x87\xc5\xec\x53\xe5\xfb\xfd\x93\x1e\x5e\x99\xed\x0c\x58\x33\x1b\x0e\xe1\x55\xe0\x07\xed\x57\x86\x1f\xcc\x9a\x85\x85\xe4\xd6\xac\xd5\x2e\x05\x2f\xcc\x36\x51\x2b\x85\x8e\x72\x2a\xb0\x6f\x4c\x59\xdc\x01\xf9\xe5\x20\x28\x47\x98\x08\x7c\x3a\x30\xaa\xe4\x59\x5f\xb2\x83\x7b\xdb\xd6\xdc\x3d\x6a\x8c\x9d\x4c\xe0\x92\x60\x75\x6d\xc0\x5a\x01\x9c\x5f\xf2\xbc\x28\xda\x66\x71\x90\x04\x7b\xcc\x03\x46\xe0\x48\xb7\x6f\x29\x5c\x24\x88\x25\x22\x90\xbb\x7b\x44\xcb\xf3\x97\x80\x8c\x4e\x90\xb3\x15\x92\x18\x73\xa4\x18\xa0\x0c\x92\xa6\xca\xe4\xcc\x14\xa2\x41\xa0\xd5\x5c\x74\x9e\xc2\x6c\xca\xbe\x1a\xda\x20\x49\x92\x07\x96\xfa\x43\x84\x35\x9d\xf1\x9e\x22\x56\xa7\x77\x44\x87\x2d\x56\xe0\xae\x6d\x44\xc5\x5b\xa9\x94\x87\x6c\x11\x4f\x9f\x02\xb0\x34\x27\x52\x16\x82\x67\x7a\x62\x72\x6a\xa9\xa9\x48\x80\xe9\x2a\xe4\x74\xd2\xda\xf8\x13\x78\x70\xbf\x6d\xc4\x83\xf5\xda\x40\x38\x9f\x00\x64\x12\x5b\xd5\x6d\xb8\x0e\x75\xaf\xca\x61\x1c\x42\xe1\xd6\x1a\xdc\xd7\x14\x3e\x87\x45\xfa\xa3\xb6\x3c\x7f\x06\x02\x7e\x05\x39\xf1\x55\x21\x08\xc5\x23\x72\x82\x1d\xb1\x1c\x0e\x6e\xf3\x4d\xa3\xc6\x85\xe9\x6c\x1f\x83\x32\x0b\xd3\xbd\xe0\xa7\xdd\xbe\x9a\x02\x9c\x93\x94\x31\xbd\xd8\xbb\x62\x00\x28\xcd\xd4\xcc\x1c\x2a\x39\xab\x04\x64\x2c\x97\xf9\x9e\x03\x64\xea\xb3\x92\x93\x94\x19\x92\x72\xc4\x33\x7f\x4b\x02\x25\xdc\x0c\x0b\x89\x16\x97\x32\x93\x50\x52\x04\xd1\x2d\x1c\x14\x71\x16\x21\xaa\x2d\xf8\x10\x1a\x20\xa7\x24\x81\x0d\x49\x38\x66\xc7\xa9\x8b\x32\x6b\xa3\x85\x68\xeb\xb2\x56\x40\x98\x58\xfd\x0c\x25\x91\x6d\x2e\x9b\xb5\x50\x20\xf7\x17\x18\x21\xb9\x25\x7a\xe9\x82\x6f\x92\x9e\x72\xe3\x5d\x14\xc0\xb3\xa9\xba\x85\x01\x42\x5a\x50\xb1\xec\xf7\xca\x02\xf1\x4b\x45\x54\x67\xf4\x4b\xfc\x14\x52\x5d\xe6\x1b\x41\x67\x10\xd1\xed\xe6\xcc\x39\x0d\x31\x2d\xac\x24\x99\x6c\x2f\x6f\x67\x78\xa2\x43\x84\x9c\xcd\x65\x90\x70\xd7\x74\x13\xee\x92\x2a\x16\xdd\x24\xbb\xf9\x8d\xa9\x0e\x11\x72\x00\xce\x34\x04\x3b\x1b\xcd\xac\x50\x9f\x22\xb5\x97\x60\xbf\xab\x89\x6d\xe7\xb5\x9f\x71\x49\xbc\xb7\x77\x09\xa7\x7a\x0f\x27\x6b\x2a\x14\xa9\x07\x8e\x93\x33\x4f\x4b\x7e\x71\x53\x39\x08\x49\x3b\x89\x4f\x1f\xef\xdf\xe6\x28\x2d\xb6\x61\xd1\xcf\x0f\xaf\x70\x90\x76\x9e\xd5\x44\x41\x14\x8a\x52\xf4\x93\x34\x34\x8d\x98\x08\x3f\x8f\x12\x38\xe5\x4a\xa2\x45\x58\x07\x49\xc5\x6a\xc0\x63\xa5\x41\xce\x98\x5c\xce\x25\x6c\xdb\xdd\x4e\x21\xc0\x87\x7c\x9b\xc7\x96\x37\x3d\xeb\xb0\x70\xa5\x07\x37\xab\x63\xba\x3a\x6b\xa4\xdb\xd0\xf0\xb2\xe7\xc1\x37\x6b\x32\x83\xeb\x92\xf1\x1d\xdc\x62\xfc\xa1\xdc\xc0\xbb\x5b\x4a\xca\x60\x19\x16\x64\xd6\x06\x92\x9c\x61\x4b\x82\xb0\xd6\xff\x29\xe3\x06\x94\x34\x15\x76\xdf\x0f\x32\xe1\xc7\x99\x21\x0e\x60\xed\x1d\xdc\xd8\x7e\x73\x82\x38\xac\x29\x5d\x4e\x15\xc7\x59\x46\x46\xc3\xd7\x28\x4d\x3b\x34\x9e\x89\x30\xff\xc7\x39\xbb\x9f\x5f\xf7\x0b\x27\x41\x35\xe9\x60\x89\xa1\x06\x8f\x1a\x08\x6f\x10\x21\x4a\x7a\xf8\xa4\x62\x9d\xeb\x40\x50\x47\xa9\x00\x27\x87\xec\x92\x92\x8e\xe5\x2d\x8a\x10\xb6\x49\xb1\x8a\xec\xed\x0a\xc1\x58\x4d\xac\x12\x38\xc0\xa4\x9d\x4a\xe0\x93\x36\xe0\x05\x15\x5c\x10\xf9\x3b\x19\x9e\x03\x04\x5a\x0e\xaf\x3b\x30\xc8\xca\x7c\x58\x59\xb0\x29\x7b\xea\x45\x30\x0e\x92\x95\xaf\x65\xa8\x78\x49\xf6\x60\xea\xfd\x86\x8a\xbc\xca\x50\x06\x46\x85\x18\x6e\xa8\x69\x36\x89\x8f\xa0\xf4\x04\xa3\x24\x88\x27\x81\x90\xde\xee\x0f\xea\x51\xb8\xbb\xc5\x82\x97\x31\xd6\x51\x66\x0e\x92\xc4\x1f\x67\x7a\xb0\xb2\x06\x39\x5c\x69\xcc\xeb\x3b\x46\x9d\x31\x56\x02\x49\xee\xf9\x0c\x68\x3b\x73\x41\x3e\x10\x32\xa4\x5e\xcd\xb6\xa6\x90\xcc\x4c\xa3\x5b\xf5\x36\x2a\x81\x31\x2b\xa3\x2d\xa0\x74\x4b\xf3\x20\xca\x37\xb5\x7c\x53\xa3\x26\x6d\xb5\x01\xc7\xb7\x64\x68\xbd\x5b\x46\xb5\xcd\x17\x9f\x6c\x5e\xf9\xb6\x6a\x2d\x37\xad\x50\x81\x15\xad\xd0\x86\x39\xc8\x93\xbc\x45\x98\x05\xde\xac\x84\x76\xc7\xa2\xb6\xdd\x9e\x68\x75\x30\x35\x29\xe8\x96\x16\x78\x07\xa2\x9d\xde\x47\x0a\xc5\x1e\x52\x28\x74\x4b\x0a\x37\x11\x30\xe5\x24\x8f\x36\x63\xe0\xc5\x96\xe4\x74\x4b\x0a\xba\x21\x05\xd5\x21\x85\x86\x12\x3a\x34\x8d\xe2\x17\x21\x94\xd0\x4b\x0c\x4a\x46\x15\x2b\x27\xc0\xb3\x3c\x3e\x09\x4c\xd2\xa2\xb1\xf0\x3e\x90\x77\x69\x37\xc6\x66\x28\xb8\x48\xbc\x21\x8e\xb1\x21\xfe\xdc\x94\x13\x00\x3a\xc7\x7c\x5a\x07\x8a\xed\xe3\xd6\x9d\xa3\x5a\xa4\xee\xb0\x8e\x86\x4f\xd0\x42\x6c\x1d\xca\x1d\x1b\x7a\xd6\xb2\x3c\x38\x30\xbc\x12\x09\x7a\x8a\x61\xca\x90\x91\x0d\xca\x70\x7f\xa4\x97\xe0\x48\x67\x5c\x23\x09\x90\xc1\xca\x01\xef\x25\xd1\x08\x9a\x60\x54\x68\x66\xe8\x65\xa5\xf1\x5b\xcf\x59\x4c\xcc\xfb\x11\xd2\x32\x80\x8f\x82\x8e\xd6\xea\x67\x88\xda\xac\x8c\xb8\x34\x0b\x12\x8a\xb1\x82\xa5\x2b\x46\x5b\x2f\x72\x3c\x33\x57\xc3\x5b\x7a\xc0\x5b\x99\x8d\x7c\x87\x71\x8b\xed\xc5\xee\x2d\x2f\x27\xcf\xc2\x5a\x5a\x78\x4b\xb7\xbc\xa5\xb7\xbc\xb5\xec\x72\xb9\x88\x1d\xa3\x29\x73\x4d\x97\x43\x78\x1b\xcc\x22\x28\x40\x90\xff\xea\xc5\x44\xfc\x7f\x2b\xc1\xae\x31\x4b\xcc\x49\x57\xa5\x2c\x1a\xb3\x43\x06\xd6\xf1\x36\x17\x79\xe8\x0d\x73\x21\xd3\xdd\x8d\xe4\xbf\xff\xc1\xe8\xf9\x7a\x02\x01\x65\xf2\x73\xd9\x88\x04\xe6\xf8\x00\xb2\x8f\x8c\xa2\x13\xc5\x2d\x01\xdb\xa8\x2c\x38\x3f\xa7\x0c\x10\xe0\x44\xab\xe7\xe5\x89\xbc\xe4\x3d\x33\x15\xcb\xea\xa0\xa4\x46\x03\x9e\x25\x9f\x98\xf7\x98\xd2\x1d\xef\x4a\x2c\xb7\xc4\xe2\x12\x25\x34\x20\x97\xf5\x74\x83\xe1\x9d\x2a\xab\x01\x21\xd4\x65\x3d\xa9\x50\x78\xfe\xae\xad\x04\x91\x75\x99\x78\xfe\x52\x33\xe9\x3c\xbb\x31\x31\x81\xc5\x3f\xb6\xb8\xea\x46\xbb\xee\x13\x57\x64\x54\x27\xc7\x90\xa0\xf5\x97\x71\xa5\x65\xbb\xa6\xc1\x1a\x20\x56\x36\xc0\x98\xb9\x55\xa6\xe8\xa6\xcc\x13\xde\x29\x23\x44\xbf\x40\x2c\x9b\x14\x93\x32\xbc\xca\x2c\x4c\x0f\x1d\xca\x65\xd2\xe8\x64\xdf\x03\x9c\x8b\x87\x14\xa5\x92\x48\x10\xa8\x72\x34\x54\x68\xed\xf5\x82\xbd\x83\x66\x41\xae\xa4\x53\x00\xb2\x0f\x52\x38\x0a\xb2\xf4\xa0\xad\x98\xb6\x17\x94\x51\xa6\xa4\x00\xce\x55\x62\x48\x35\xfd\xd3\x5e\x54\x5b\xd0\x97\xdc\xb3\xa0\x21\x2d\x42\x27\x93\x2d\xd7\x21\x99\xde\xb2\x63\x0d\x45\x70\x42\xf0\x3d\xb0\xd7\xac\xbf\x95\x38\xb4\x73\x85\xc1\xf0\xca\xa1\xd2\x16\xfe\x56\x1c\x70\x03\x14\x7e\xa2\x6d\xd0\x8f\x3d\xfb\x17\xef\x8e\xc4\x99\x99\x68\x93\x20\xd0\xfc\xb2\x89\x22\x1a\x9b\xbb\x15\x50\xd4\x74\x0d\x7a\x43\x02\x13\xf6\x38\x67\xd3\xbe\xc4\x82\xdf\xf1\x6e\x68\xdf\x0c\x45\x85\xe9\xea\xf4\x85\x76\xe6\x55\x9b\x51\x7a\x07\xd0\xfd\x19\xf8\xed\x5f\x4d\xd0\x1c\x8f\xdf\xfe\x03\x8c\xf1\x31\xe7\x4b\x6f\x1a\x3b\x66\xfd\xc4\xf2\xe2\x27\x1c\xe2\x75\xa6\x63\x0f\x1f\x36\xa7\xf7\x67\xba\x17\x9f\xcf\x82\x67\x39\xe1\x0e\xb4\x86\x4e\xe2\x8c\x03\x16\x09\x02\xb7\x92\x70\x6e\x55\x68\xf4\xca\xb3\xa8\x43\xaf\xd0\xbe\x04\xd1\x8a\xac\x92\xbf\x96\xfc\x7b\x63\x46\x66\xcd\x46\x83\x8f\x95\x93\x94\x05\xe0\xfa\x6a\x92\xe3\xfd\x86\xad\x0a\xed\x21\x98\xa5\xe4\x6e\x6a\x5e\xd4\x09\x28\xdc\x08\x0e\x5b\xa8\x23\xc4\x94\x24\xb5\x92\x86\xdc\xdd\x52\x64\xcd\x9f\x2c\xf8\x9e\xf0\x36\x04\xc1\x54\x05\x6f\x19\x58\x9f\x94\x40\xd0\x9e\x35\x0f\xa2\xd1\x80\x38\x93\xf3\x8f\xed\x7e\x85\x97\x82\x95\xe6\x9d\x2e\xf7\x8e\x37\x53\x26\xf2\x4f\xa4\x97\xdc\x51\x52\xf2\x17\x77\xd3\xc9\xe1\xb9\x55\x48\xac\x1c\x67\x8b\x77\xd1\x92\xde\xb6\x5d\xa7\x66\x7b\xdd\xbb\x64\x4b\x2a\x2f\x57\xf6\x92\xf7\x16\x8a\x4a\xea\xa2\x9e\x17\xfa\x94\xf4\xb2\x74\xb0\x42\x39\x1c\xa5\x02\xc4\x8d\xc3\x0d\xc0\xe3\x07\x57\x4e\xaa\xd6\x1c\xaa\x16\xf3\x19\x01\x81\x2b\xc9\x42\xa0\x7e\x2d\x72\x80\x1c\xfb\x6d\x39\x35\xfd\xe9\xfe\x6d\x90\x4c\x29\xf1\x4e\x3d\x80\x65\x1d\xbc\x85\x13\x41\x88\x49\xce\xd4\x32\x70\xb0\x94\xdb\xc5\xd7\xf3\x60\x0c\x89\x40\x9b\x1c\x09\xd0\x95\x1f\xd7\x27\xcd\x65\xf7\x3d\x0b\xce\x71\xab\x07\x81\x64\x4a\xce\xa1\x79\xb3\xb2\x65\x52\xed\x34\x04\xfa\xda\xac\x3d\xc3\x66\x67\x65\x3a\xc1\x2a\xcd\x2c\x5c\xa4\xfe\x1d\x24\x31\x61\xa5\xf3\xf8\xe8\x48\xaf\xbb\x03\xb5\x5b\x09\xf7\x29\xce\x66\xa9\x23\x1d\xdc\x0e\xb4\xa0\x10\x16\xc3\x5e\x7d\xbc\x05\x18\x32\x9c\xd0\xa2\xe5\x85\xae\xef\x61\x41\x62\xf5\x71\x99\x19\xbb\x07\x1b\xed\x87\xcf\x68\xba\x3d\xd0\xf4\x43\x0b\xe1\xc9\x15\xb9\xdd\x8e\x0e\x07\xc6\xeb\x3b\x5b\xf6\x1e\xa3\xea\xef\x4b\x14\x76\x97\x05\x14\x41\x49\xae\x9b\x0e\x59\x0e\x57\xdd\xdd\xa3\xc0\xae\x2a\xd7\x7f\xb9\x2f\xdf\xe5\xf5\xb5\xa0\x2f\x6e\xdf\x97\x13\x03\x42\xf9\x04\x12\xd8\xa0\xb1\x18\xee\x84\x7a\xc4\x83\xc2\x53\x7d\x02\xc1\x03\x04\x72\x28\x17\xe4\x61\xc5\x8f\x64\xff\xe5\x55\x68\x32\xef\x23\xcb\xd5\x9c\x94\xb2\x73\x72\x92\x0c\x78\x37\x58\x3e\xea\x91\xca\x56\xf7\xde\x27\x6a\x11\x39\x92\x90\x5f\x9b\x08\x72\x08\x5c\x5d\xd6\x0b\x84\x8f\xda\x8e\xda\xdb\x8c\xc5\x5d\xb3\x6e\xd3\x70\xdd\x6e\xe7\xb5\x3f\x47\x77\x8f\x02\xc7\xeb\x76\x51\xd0\xe0\xc9\x73\x55\xf7\xa3\xf8\xd9\x41\x70\xbb\x59\xfa\x3c\xbf\xa5\x81\x76\xdb\x24\x8a\xdb\x6b\xbe\x27\x65\x07\x41\xb6\xbb\x00\xf7\x86\x41\xb6\xbe\x1f\x0a\x6f\xef\x6e\xc5\x60\x22\x51\xc4\xa6\x98\xc8\x7a\x25\xe0\x69\xed\x2e\x66\x17\x86\x92\xdc\xdf\x03\xa0\x24\x58\x0e\x38\x02\x50\x4a\xa4\x92\xc4\xd8\x4c\x63\x50\xca\xbe\x23\x0e\x4c\xa8\x24\x5f\xa9\x03\xab\xad\xb6\x83\x13\xf4\x16\x00\x89\x20\x6d\x08\xa2\xa9\x3c\x84\xc4\xc4\x9f\xe6\x28\xc8\xb0\x18\x2b\x56\x9c\x1c\x6f\xc4\x5c\x89\xae\x8a\x39\xe3\x86\x75\x19\x5e\x66\x41\x28\xcf\x38\x88\x28\x45\x17\xc0\x7a\xdb\x88\x93\xb4\xd1\x83\xca\x68\xe2\xd1\xeb\x0e\xbd\xea\x0e\x7d\xf3\x80\xb8\xf7\x79\x55\x2c\xfb\x83\x5f\xff\x35\xeb\x0f\x7e\x3d\x25\x57\xb2\x6e\x61\x90\xa3\x8f\x42\x42\x1d\xbf\xca\x14\x8c\x6a\x98\xd6\x10\x35\xb2\xdb\x2d\x04\x4b\xc3\x1f\xb2\xbd\x9d\xce\xc9\x6d\xac\xf1\x54\xa6\x35\xf3\x75\x4c\x6b\xbb\xbd\xfb\x0f\x0e\xe2\x34\x82\x4e\x44\x48\x3c\x80\x30\xc5\xb7\xef\x6e\xbd\xa2\xb0\x60\x62\xab\xbc\xf6\x50\xc4\x61\xa0\x5f\xc1\x54\x87\x89\x37\x54\x51\x5c\x18\xc2\xdd\x23\x49\x34\x19\x02\xba\xca\x03\x19\xed\xf3\x81\x28\xef\x7a\x46\x81\x82\x19\x76\x8a\x29\x72\x0a\xf3\xdd\x1b\xa6\xa4\x0b\xc8\x6a\xc7\x6a\xed\x7e\x94\x41\x3c\xcb\x3e\x37\x95\xf1\x6a\xf7\xfa\x3e\xca\xad\xd6\xe4\x86\x3d\x64\xbb\x6a\x37\xd5\x98\x11\x4a\x58\x51\x6b\xb7\xcb\xe2\xe5\x40\x77\x8f\x85\x32\xc5\x4c\x20\xb1\x6b\x21\x6e\x24\xbd\x7d\x73\xa5\xf5\x49\xb9\x6c\x71\xef\x8c\x0e\x16\x10\x53\x1e\x20\x34\xf2\xeb\xb3\xc0\x09\x5f\xb0\x2e\x77\xbe\x4e\x0e\x0a\x77\xc1\xd7\x0f\x2e\x8f\x11\xd0\x88\xb1\x0b\x97\x11\x7c\x50\x52\x34\x4a\x09\x79\xed\xcb\x04\x31\xcc\x86\xf7\x3a\xef\x9d\x64\xbc\x39\xbc\x45\x3b\x66\x76\x6f\xa3\x98\xb3\xcd\x36\xd7\x46\xed\x47\xdf\xcd\x36\xd5\x3e\x72\xf7\x98\x80\xc4\x55\xd5\xd0\xa0\x83\xa8\xeb\x0e\x92\x07\x13\x07\x3d\xc4\x5e\x0f\x1f\x3d\x24\xa3\xc5\xc6\xd1\xad\x53\x77\xeb\x94\x59\x92\x93\xe0\x53\x4e\x21\x7a\x2c\xd0\x4d\x9a\xbc\xf7\xd4\xd7\x72\x35\x44\x50\xf8\xb5\x18\x8b\x7a\x06\x08\xa4\xb3\x4d\x7a\x87\x84\xea\xb7\xe4\xbc\x37\x79\x03\x7d\xcd\x1b\x16\x28\x0a\x6f\x20\xc4\x8b\xb8\xa3\xcb\xd9\x78\xe9\xf7\xa7\xa0\xf9\xc7\x20\x93\x8e\x50\xf8\xe1\xbe\x1f\x69\xb0\x3d\x44\xea\xe3\x72\xf3\x8b\x06\x0a\x7f\x77\x4b\xe2\x6a\xc1\x9b\x67\x10\x24\xa7\xd6\x8b\x26\xf2\x7f\xb3\xed\xd5\x22\x27\xb9\x93\x87\xef\x1e\x35\xd3\x34\xdf\xe9\xbf\xa7\x76\xbf\x87\x58\x87\x24\x14\xa7\xac\xe6\xfd\x3c\xc0\x75\x36\xf1\x1f\x6f\x1d\xb8\x9c\x1a\x0f\x53\x3b\xf2\x52\x3f\x35\xb5\xf7\xd6\x02\xaf\xa8\x58\x26\xd5\xb8\x01\xd5\x10\xcc\xbc\x27\x93\x91\x96\xff\xc0\xd7\xa1\x08\x41\x85\xed\xac\x1b\xd4\x12\xa3\xd0\x31\x8d\x78\x8d\x40\xb3\xf6\x6b\xaa\xa9\xe0\x2b\xaf\x18\x8f\x12\xf2\x72\x16\xdd\x0b\x7a\xfa\xd1\x84\x6f\xb1\x26\xfc\x47\xb4\x62\x6c\xed\x32\xab\xec\x1f\xa9\x1d\xb3\x42\xcb\x98\x6d\x87\x2c\x37\xc9\x1b\x2d\x43\xdb\x0c\x1a\x72\x6b\x9c\xd5\x3b\x70\x46\x8f\xf6\x25\x6a\xf2\xf5\xef\x5f\x52\x14\x79\x01\x62\x21\xee\x0f\xf1\xac\x8b\xf1\xca\x04\x65\xd7\xda\x2f\xd1\x4b\xfe\x1d\xdf\x7a\x1a\x6a\xc3\xd3\xcd\x5d\x9d\xe5\xe0\xf8\x5c\xe6\x06\x5b\x85\x7e\x9d\x16\x7e\x49\x22\x7b\xb8\x68\xf4\x54\xf2\x82\xdf\xbe\x92\xe3\x66\x45\xe0\x49\x79\x70\x41\x49\x5c\x5d\x06\xf2\x43\xc9\xa7\x25\x65\xbd\xa8\x49\x5a\xd3\x84\x0b\xb4\x10\xe2\x32\x49\x44\x79\xe3\xe4\xcb\x2d\x49\xa8\x4d\x76\xf9\xd2\x04\x0e\xb5\x05\x4a\x3a\x01\x8a\x11\x51\x22\xf5\xba\x71\x26\x3c\x9c\x49\xd1\x4d\x0e\xcb\x22\x39\xa9\x10\xc7\x60\xfe\xe1\x37\xb1\x34\xfd\x20\x00\x45\x49\x51\x4b\xc0\x20\xae\x86\xb4\x42\x56\x30\x1c\x58\x71\xe3\x0c\x80\xd9\x43\x38\xf4\xdd\xc7\xc0\x23\x10\xae\x3d\x58\x5a\x51\x3e\x88\xf2\xe0\x9c\x26\xc5\x43\xab\x0d\xf8\xd3\x9c\xa3\x0e\xd9\x51\xad\x32\x58\x76\x60\x52\xb3\xab\xcb\xd0\xeb\x67\x1d\xee\x1e\xb5\xd7\xb4\xb6\x0b\x74\xe5\x49\x98\x8f\x07\x0f\x1a\x31\x89\x4c\x20\x40\xba\xc1\x00\x0e\x55\x6a\xc2\x84\xa2\xa2\xe6\xe7\x07\x81\x75\x8f\xfc\xa0\x72\x40\x4e\xda\x00\x64\x96\x94\x24\x23\x5f\xda\x02\xaf\x22\x58\x1e\xe9\x60\x6f\x9c\x78\x94\x17\x39\x97\x52\xcc\x4e\x54\xfc\x63\xed\x21\xfa\x1b\xa6\x0c\xbe\x46\xf2\x4c\xe1\x99\x5a\x28\xd6\x49\x31\x1c\x4a\x44\x5b\xf6\x6f\x6d\x05\xfe\xb6\xa9\x53\x18\xb0\x59\x5c\x98\x61\xf4\x58\xd1\x3f\x94\x59\x87\x05\x1e\x8b\x61\x38\xc6\x33\xeb\x60\x70\xec\x8f\x81\x52\x58\xac\x04\x3d\x96\xf9\x57\x05\x30\xda\x66\x22\xb3\xeb\x1d\xec\xab\x98\x7d\xd5\x1e\xf6\x95\x18\x84\x92\x8c\xec\x8c\xfb\x1c\xcc\xe2\x5c\xac\x60\x69\xa5\x25\x6d\xbb\x66\x16\xd6\xcc\xc2\x12\x1a\xab\xf7\xb0\x30\xb7\x2f\x41\x91\x36\x04\x68\x86\x1c\xac\x98\x83\x95\x59\x89\xcf\x26\x33\x30\xb3\x52\xe2\x07\xea\xa8\x5f\x66\xe0\x9e\xc5\x5d\xa6\xf0\x26\x1f\x68\x18\xc3\x42\x84\x24\xdb\x92\x95\x9f\xc5\x82\x68\x1d\xfb\x78\xc1\x5d\x26\xd6\x08\x2c\xdb\x3c\x89\xcc\x48\x5a\xcc\x9c\x80\x12\x9c\xcb\xbd\xd0\xa1\x1b\xbd\x50\x28\x0a\x10\x92\xb2\x25\x21\x98\x70\x83\x51\xc2\x01\x84\xa4\x8d\xc0\xf1\xaa\x30\x21\x1f\x93\x72\x65\x1a\x24\x2a\xe8\xc8\x94\x7c\x50\xc4\x7b\x20\x15\x4a\xbb\x20\x2c\xa7\x63\x61\x2f\x88\xf7\x06\xa2\x5d\x09\xa4\x25\x31\xcf\x58\x49\x04\x55\x40\x11\x3a\xbf\x7e\x20\xcb\xe3\xce\xbb\x23\x81\x08\x0d\xb8\x20\x5c\x27\x08\x61\xcc\xc9\x39\xb1\xa6\x70\xb2\x29\x98\x22\x1c\x53\x21\xef\xaa\x94\xad\x7f\xc8\xc8\xba\x1b\x4c\x20\x6b\x47\x0d\x4b\x27\xe3\xea\x36\x48\xbc\xd0\x8e\xb9\x78\xdb\xda\x29\xb8\x38\x29\x32\x03\x84\x69\xdf\x21\x81\xa4\x5c\x49\x8b\xb1\x33\xe3\xd1\x3c\x9c\x71\x75\xfa\xec\xcb\x6d\xd9\xb6\xc0\xf2\x76\xd5\x98\x59\xe6\x9d\xcc\x3a\x72\x64\xc3\x0b\x93\x95\x34\x35\x9d\x3b\xfc\xff\xfa\x8d\x33\x74\xd7\xae\xaf\x1b\xc4\xec\xbd\x6c\x97\x24\x1e\x11\xd4\xfa\x45\x14\xda\x4a\x08\x82\x24\x40\x25\x08\xb9\xc8\x77\x0c\x58\xe6\x55\x9c\x61\x90\x40\xa1\xd0\xe0\xf6\xa2\xa2\xec\x4c\x11\x96\x96\xe7\x4f\xe5\x32\x0f\x2a\x41\xd4\xf9\xf9\xad\xb8\xd4\x82\x4b\xd2\x11\x9f\xfc\xb7\x15\x71\x64\xb7\x42\x49\x50\x48\xeb\xaa\xf8\x5f\x23\x8d\x82\x57\x82\x4f\xba\xa3\x79\x5a\x00\xd9\x24\x5c\x80\x8a\xad\xff\x38\xf7\x49\x67\x84\xf8\x6e\xa5\x26\xf5\xc0\xb2\x79\xa0\x0b\x37\x73\x39\x6e\xa7\xd8\xca\xaa\x20\x7e\xde\x38\x90\x48\x0a\xa2\x78\xa0\xf9\xde\xc9\xa0\x66\x09\xc1\x2f\xbb\xba\xac\xd5\x23\xd1\x82\x4c\xcf\x27\x8f\xab\x94\x84\x07\xdd\x80\xd8\xed\xdc\xdc\xdd\x0a\x96\xb1\x32\x45\x99\xc0\xdb\xa5\xb8\x84\xa8\x5c\xb6\x3d\xce\xfe\xe8\x92\xa6\xc8\xd5\x65\x3d\x23\x50\x24\x39\x84\x2e\xf8\x5f\x23\x73\xa3\x93\xdc\xea\x3d\x7d\xdd\xa4\xdc\xf7\xbc\x78\xa7\x4e\xd6\x09\xf0\x41\x5b\x65\x0d\xf3\x75\x2e\x1b\xfb\xa8\xf8\xdd\x5b\x81\x97\xb1\x1d\xdc\x67\xca\x0e\xf9\x98\x44\xa9\x4c\x2d\xf8\x7a\xed\xb1\xdf\xab\xd6\x36\x95\x62\x5d\x6e\xdb\xa8\x73\x1b\x47\x61\x02\xdc\x27\x0d\x21\xce\x9c\x63\xd9\x94\xcb\xba\x82\x7a\xa8\xce\x30\x31\xfc\x3f\xf7\x55\xf5\xf0\xf9\xa5\xb6\x78\x1a\x88\xa6\xb5\xba\x19\xf3\xfe\xdd\x33\xef\xc0\xc0\xa4\xf7\xef\x9e\x7f\x6f\x7e\x3b\x75\xdf\xd5\xdb\x6d\x11\xab\xbf\x26\x8d\x98\x1e\x3d\x4b\x3a\x37\x62\xf9\xed\x2b\x67\xec\xa0\xfa\x35\x0b\x58\x82\xb1\x4b\xcc\x19\x63\x70\xbb\xb9\x93\x3f\x7b\xae\xeb\xb9\xe2\xfa\x8d\x13\x6a\x76\xe3\x9a\x89\x45\xca\x49\x35\x6f\xdf\xb8\x7b\xdf\x43\x73\x14\x0e\x3a\xe5\x53\x9d\x37\x4e\xe8\x84\x97\x4e\xf4\xbb\x21\x42\x19\x21\xb1\xb8\xde\x26\xf3\x68\x45\xb2\xea\x26\x02\xa9\x45\x38\x3f\x7d\xe2\xe9\xc6\xa5\xd4\xf8\x86\x43\xf1\x95\x28\x71\x2f\x66\xe4\x8e\xb5\xc7\x4b\x60\x1b\xce\x72\xd8\x68\x2e\xeb\x31\x8b\x12\x92\x63\x97\x24\x31\x46\xb9\xac\x25\x38\xcb\xad\x2c\x2f\x72\xd1\xac\x10\xe4\x75\x8e\xac\x93\x23\x97\x5c\x36\xf7\x9c\x68\xa9\x71\xb0\xf2\x60\x1f\x1b\x5c\xc9\xaa\x13\xc1\x52\x5d\x6e\xdf\x56\xf9\xed\x28\x4b\x50\x6c\x57\x3b\xa9\x55\xe5\xd5\x90\x58\x5c\xe7\xb2\x6e\xa8\x04\x51\x71\xe7\xa2\x60\xbd\xc6\xd6\x2f\x04\x24\xd6\xaa\x1f\x6d\x2e\x74\xb3\x5d\x0f\x24\xdb\x43\x96\x6c\x29\x17\xed\xe6\xda\x40\x4f\x6a\xf3\xe2\xb3\xc6\x34\x5e\x79\x86\x6f\xea\xfe\x9b\x02\xac\xc4\x75\xf4\xd7\x9c\x7a\x4e\xee\x6e\xb3\x1f\x24\x45\x70\x6e\xc0\x60\x58\x27\xfa\x96\x0c\x47\xdb\x1b\xb5\x11\xa4\x79\xe9\xee\x31\xc8\xa2\xb7\x1c\x3e\x23\xd1\x91\xf5\x95\xee\x65\x01\xb3\x90\xb7\xfc\xe0\xad\x83\x55\x92\x63\xb2\xcc\x55\x1e\x47\x8b\x8d\x44\x1c\x1c\x3f\x65\x30\xc4\x43\x4a\x9a\xf8\x39\x96\x5c\xa1\xad\x90\x77\xf2\x01\x42\xf7\x70\x9e\x34\x98\x34\x17\x0c\x6b\xa4\x12\x1d\x20\x1e\x78\x0e\x0d\x4f\x30\x52\xe9\x07\x46\x7c\x0f\x3e\x54\x62\x30\x8a\xa5\x1d\xdf\xf3\x73\xd9\x1b\x19\xec\x7d\x54\x49\xe2\x0d\x60\x55\x2c\x36\x1b\xbd\x42\x41\x73\x56\xb1\xa5\x0c\xc9\x99\xa9\xc8\xae\x23\x60\xaa\x72\xbc\x75\xd8\xf7\x29\x31\xd1\xd4\x17\x31\x8d\xbf\x45\x12\xcd\x49\xb6\xec\xed\x79\xc5\xf5\xc8\x08\x28\x1c\x78\xd4\xb1\x34\xc3\x63\x89\xdb\x9c\x93\x98\xa8\x44\x03\xd8\x3c\xc6\x5f\x3b\x59\x9f\x1d\x6b\xb4\x41\x61\x21\x87\x3a\x54\x21\xeb\x27\xdd\xe4\x2d\x7c\xd9\x29\xbb\xd6\x34\xe0\x7c\xe9\x0b\xf3\x60\xb1\xe6\x2d\xe1\xf8\x4d\x0c\xca\x96\xe8\x46\xaf\x31\xa7\x16\x65\xe8\x5f\x8f\x95\xe4\xa2\xa7\xbe\x21\x00\x68\xed\x04\x8d\xaf\x00\xa7\x88\xc4\xb4\x76\xcc\x5b\xac\xf5\xc5\x4a\xb3\xee\x18\xcd\xe0\x26\x86\x75\xcf\xe6\x94\x9c\xce\xad\x02\x1f\x14\xf9\xb5\x24\x4c\xcd\x6f\x76\x3b\x93\x94\xa1\xf5\x40\x5d\xe5\x31\x30\xb2\xe3\xf7\x6b\x3f\x90\x27\x15\xd8\xfe\x90\x69\x6e\x17\x2f\xa9\xa1\x12\xab\x65\xdc\xf5\x0a\x6a\x1a\x68\xb4\x3c\x37\xe2\x80\xa8\x90\xea\x81\x96\xfc\xc1\x6b\xc9\xd3\x76\xd2\xfa\xf8\x7f\x8d\xa0\x4d\xff\xf7\x8a\xf7\x59\xbf\x0c\xf6\x5d\xea\x65\xbd\x7c\xee\x63\xf4\x2e\x9f\xef\xd5\xcb\xeb\xf2\xf9\x97\x3e\xf8\xa0\x7a\xbf\x5e\x56\xbf\x6a\xbe\xd3\x05\x8e\x6d\x50\xbf\xd4\xdf\x6a\x1c\x9d\x5f\xc6\xd0\x3a\xea\xbe\x06\x75\xf9\x65\x8c\xf3\xa2\x56\xcb\xea\xfe\xd3\xc7\xe5\xf3\x2f\xcb\x0e\xca\x70\xbe\xa4\xee\x37\xf7\x9f\x5e\x3b\x37\xfe\x89\xff\x56\xaf\xcb\x97\xbf\x77\x41\x7d\x25\x65\xb5\xfa\xb5\x5a\xfe\xf6\x4b\x3f\x69\x97\x7a\xf8\xf4\xb7\xa7\x7f\xff\x65\x90\x2d\x47\xad\xb3\x34\xfb\x65\x24\xdf\xd4\xfa\x7e\xf9\xfc\xfa\xcb\x20\x30\x5e\xbd\x97\xcb\xfa\x6f\x12\x20\xff\x7e\x78\x3b\xc7\xcd\xab\xf7\xaf\xcb\xea\xef\xfa\x6f\x39\x2c\xf5\xfd\x2f\x3b\xa3\x55\xd5\xfb\xd5\x7a\xf9\x5a\x3f\xd4\x7d\x66\x1b\x9b\xa2\x3e\x67\x47\xbe\x5f\x46\xae\x7d\x3c\xfe\x9f\x3f\xff\xae\x7f\x5d\xae\xee\xfb\x13\x50\xbb\x06\xa8\xf7\x9f\xf2\x11\xe9\xe8\x91\xce\xd1\xa9\x7a\xff\xb2\xfc\x38\x7a\xa0\x3e\x54\x52\xef\x5f\xc5\x9e\x36\x00\x66\x6e\x6c\xe4\xed\xed\x21\x30\xf3\xd6\x0a\xf7\x7f\xd4\x1e\x04\xde\x1e\x2d\xaa\xf7\xbf\x2e\x37\x4f\xcf\x0f\xaf\xf7\xef\xd5\x33\x6c\x81\x5d\x6f\x04\xd7\x75\xf0\x30\x30\xc5\xfd\xc3\x3f\x1c\xf9\xe1\xfb\xc7\xe5\x43\x75\xcc\x57\x1b\x92\x3c\xfa\xcb\x1f\x97\xc7\x35\xb7\xa1\xe7\x7f\xf8\x87\xeb\x82\x28\x77\x2b\x7d\x0b\x45\xf9\xf5\x7e\xb5\xfe\xf4\x54\x3d\xfd\xf6\xfb\x35\x91\x94\x5b\x50\xea\xdb\xff\x39\xfb\xdc\x45\x40\x5e\xdc\x76\xfe\xf8\x97\xa7\x2f\xaf\xf7\xcf\x3d\x34\xe4\xd7\x7f\x7b\x7a\xfe\xfb\x87\x7f\x7b\x78\x5d\xad\x77\x5c\xbf\x7f\x7d\x7d\xf8\xf4\xdb\xcb\xf8\xce\x7f\xad\x9e\xfe\xd6\x47\x41\xfe\x5b\x75\xdf\x85\x36\xbe\x7d\xfa\xdb\x43\x0f\x27\xf9\x1f\x97\xaf\xaf\xf7\xcf\xbf\x77\xae\xcc\x3e\x7f\xae\x1e\x56\x4b\x1e\x86\x2e\xc8\xf2\xd3\xc7\xde\x87\xef\x9f\x1f\x1f\x3e\x2d\xab\xce\xa5\x3f\x3f\xbc\x7c\xae\x96\xbf\xf7\xde\x79\xfc\x3c\xe8\xd9\x7f\xa9\x9e\x3e\x7f\xee\x3e\xf3\x97\xea\xcb\x6f\x0f\xdd\x8a\x98\x67\xaa\xa7\xe5\xc7\x9b\xea\xe9\xcb\xc7\xce\xf5\xbf\x7e\xde\x75\xf5\x9f\xfe\xfd\xf3\x53\x1f\xbb\xf9\x71\x70\xe1\xc3\xfa\xe1\xbe\xfa\xf8\xbf\x46\x57\x46\x17\x6e\xd6\xf7\xab\x2e\x60\xf3\xbf\xdc\xbf\x3c\x7d\x79\x5e\xdd\xff\xe5\xe9\xa9\xd7\xcd\xe5\xeb\xf2\xa6\xfa\xf2\xd2\xef\xd7\xed\xfd\xe3\x53\x6f\x14\x6f\xfe\xf2\xd7\xee\x28\x7f\x79\xa8\x3e\x3e\x7c\xfa\x6d\xf7\x30\x77\x27\x72\xfc\xe9\x0f\xaf\x4f\xcf\xcb\xdf\x7a\xb0\xd8\x4f\x2f\xaf\xbd\x16\xbd\xac\xff\xf6\xb4\x7c\xfe\xd8\x9b\xe7\x2f\x2f\xdd\x57\xfe\xfb\xfd\xef\xc3\x47\xfe\x7c\xbf\x79\x58\xf5\xd0\xb1\xff\x71\xb9\xfa\xfb\x97\xcf\xa3\x0b\xff\x72\xff\xf2\xfa\xf4\xdc\xc7\xe5\x7e\xfe\xf8\xe7\x87\x97\xde\x68\x2d\x57\x7f\xff\x70\xff\xbc\xe9\x35\xfd\x7f\x3e\xfc\xfa\xd0\x1b\x85\x4f\x1f\xfb\xc4\x57\x3d\xad\xfe\xfe\xf2\x5f\x9f\x9f\xfa\xb5\xf2\xd5\xce\xdf\xf3\xe5\xef\xf7\xcf\xdd\x76\xfe\xf5\xd3\xc3\xa7\x97\xd7\x65\x55\xf5\x30\xbb\x87\x57\xfe\xc7\xd3\xa0\xfa\xbf\xac\x9f\x3e\xdd\x97\xcb\x4f\x1f\x5f\x7a\x2c\xf1\x2f\x5f\xaa\xfb\xe7\xbf\xdc\x7f\x5a\x3d\x54\x35\xf8\xb6\x7a\x85\x7f\x6d\xc5\xc3\x08\x06\xfd\xbf\x3c\x54\x59\x25\xa0\xee\xb4\x3d\xdc\x74\xc7\x76\xf6\xe9\xe1\x71\xc8\x41\xff\xca\x63\xfe\xfc\xb0\xb9\xef\x91\xcd\xc7\x87\xe5\xcd\x7a\xf9\xe9\xb7\x66\xdc\x6e\x9e\x3e\xbd\x3e\x3f\x55\xf3\x2f\xdd\x57\xff\xf2\xf4\xb1\xd7\xb1\x1e\x2b\xfe\x8f\xe5\xe3\xfd\xcb\xe7\x01\x9c\xfa\xd3\xc7\x5e\x9b\xf9\xef\xe1\x30\xd7\x74\x35\xfb\xb8\xfc\xdc\x27\x38\x26\xaf\xd1\xc3\xff\xdf\x97\x87\x6e\x1b\x6e\x96\x9f\x97\xab\x87\xd7\xa7\xe7\x3e\xc3\x3c\xbc\xf4\x2f\xfd\xb7\x4f\x1f\xbf\xac\x06\x4f\x2d\x3f\xf6\x50\xcf\xff\xfa\xf2\xb7\xce\x5f\xff\xef\xf3\x40\xd0\xb4\xa3\xdd\x93\x2b\x9f\x5e\x97\x0f\x9f\xee\x9f\x17\x4f\xd5\x97\xc7\x9d\x77\xba\xd7\x3e\xfe\x79\xf3\xb1\x47\xd4\xc3\x3a\x66\xaf\x4f\x8f\xdd\x3f\x5f\x5e\x1e\x7e\xfb\xf4\xd7\x97\xde\x57\xfe\xf2\xfc\xb4\xba\x7f\x79\xf9\xe7\x4f\x3d\xc9\xfd\x8f\xd5\x97\xfb\xd7\xa7\xa7\xd7\xf5\x3f\xff\xfa\xeb\xae\xcb\xdd\x11\xfc\xf0\xe7\xee\x84\x2c\x6e\x47\x0c\xc5\xb4\xc1\x5c\xf5\xb2\xeb\x46\xb7\x7d\x1f\x1f\x1f\x3e\x3d\xbc\xbc\x0a\x76\x7b\x1f\xa6\xbe\xc7\x92\xe5\x7d\xf5\xf0\xef\x3d\x86\xff\x5c\x3d\xf5\x64\x14\x0b\xd3\x7f\x7d\x5e\xfe\xfa\xeb\xc3\x6a\x78\xf9\x03\x2f\xda\xc3\x8b\xf5\x2a\xd3\x63\xc5\xea\xe1\x53\x8f\x59\xfb\x7f\xfe\xf9\xe1\x65\xf5\xf4\xe9\xd3\xfd\xea\xb5\x3f\x4b\x83\x2b\x7f\xfd\xb4\x7c\x5e\xad\x07\xdd\x1c\x5d\xb9\xb9\x7f\x7e\x7d\xf8\x95\x85\xe6\xb7\x83\xc9\xff\xbf\x77\x0b\x8e\xe1\x51\xeb\x53\xf5\xfb\x6f\x4f\x9f\x4e\x39\xe4\xfb\xfc\xf4\xf0\xe9\xf5\xe5\x4f\xef\xd3\x3b\x0c\x60\xf1\x5d\x7a\x47\xe1\x1d\x46\x70\xf9\x17\x2f\xbf\xb8\x77\x88\x75\x89\x29\x3f\x25\x4f\xef\xf1\x7a\x39\x35\x1d\xae\xe5\x0d\x97\x21\x81\x89\x21\x45\x09\x4c\x5c\x18\x2a\xed\x82\x02\x44\x57\xfa\x8d\x46\xf0\xa5\x5d\x60\x02\x5f\xfa\x05\x46\xfe\x1d\xf3\xef\x45\x69\x17\x36\x67\x4b\x94\x64\x28\x85\x24\x48\x0e\x60\xed\xdc\xe4\x6c\xca\xd4\x05\x4e\x10\xec\xce\xc1\xe6\xb4\x34\x16\xd0\xf7\x0c\x0b\x72\x6a\xb3\x03\x73\xe3\x3c\x48\x18\xab\x4c\xb1\xb6\x43\xdc\x34\x08\x73\x0a\x90\x31\xee\x3b\xa8\x2d\x08\xc1\x6b\x5c\x17\x83\x4b\x0a\xa1\xe0\xcd\xbf\xf8\x9f\x2c\xa8\x8b\xba\x26\xdf\xbf\xe3\x6a\x12\x50\x85\x90\xac\x64\x4a\x9b\x53\x14\x88\xcb\x05\xd9\x92\xec\xdd\xa3\x98\x49\xad\x59\xdb\x0d\x81\x95\x4b\xc7\x74\xef\x2d\x30\xdf\x66\xea\xc4\xd5\x9c\x02\x98\xc0\x3d\x73\x4d\xd7\x5c\x17\xca\xc9\x80\xb3\xaa\xa8\x3b\xe1\x17\x42\x4a\xed\x2c\xf5\xe2\x6b\x14\x42\x22\x99\x5c\xc0\xb0\xe1\xa9\x26\x99\xf6\xf6\xaf\x8d\x07\xef\xba\x7f\x3b\x28\xc2\xb1\xd3\x7a\x8b\x85\x62\x2a\xf1\x90\x2c\xd3\x4d\x11\x14\xf9\xbb\x47\x09\x7a\x14\x88\x88\x05\x39\xf0\x71\x9d\x03\x9d\xf8\xef\x04\xe4\x46\x23\xeb\xf3\x00\xf6\xa3\xbf\xba\x8b\xfd\x14\xd8\x4d\x01\x82\x51\xc6\x81\xb5\x4b\x39\x5f\x95\xa2\xa8\x5d\x67\xc4\xc0\x96\x1d\x13\xa4\xac\xaf\x7b\xf0\xa4\x25\x1b\xb3\x11\x98\xff\x5c\xe6\x9b\x89\x6f\x93\x9b\xc9\xa9\xa9\x14\xcd\x51\x95\xf5\xca\x43\xe1\x2a\xee\x63\x74\x3d\x50\x5c\x04\xdf\x05\xec\x40\xb0\x0e\x62\xa8\x9c\x40\xfd\x2d\x7b\x31\x47\x75\x6e\xff\x54\x89\x97\x93\x32\xcb\xec\x8a\x90\xcb\xc6\xb0\x8c\x41\x39\x88\x69\x5d\x2c\x31\xe5\x44\x5d\x82\x3b\x2f\xff\xf7\xf9\x14\xbf\x48\x95\x01\x44\x4d\xcc\x1d\x08\xde\x2a\x6c\x92\xa7\x89\x6b\x9b\xd7\x80\x54\x05\x70\x4e\x22\x1f\x3b\xcd\x35\x4e\x1c\x71\x2a\x6d\x20\x29\x03\xd1\xcf\xac\x1c\xfb\x35\xa7\x7e\xa8\x3a\x83\x7a\x77\x2b\xb8\x62\x06\xbc\xad\xb4\x80\x4b\xbb\x25\x49\x96\x3b\xa1\xd5\x6c\x81\x0e\x72\x08\x29\x3e\x04\xb9\xc8\x2d\x8d\xe2\x49\xe7\xc4\xb6\x8e\x5c\x17\xb6\x89\x22\xd1\x65\xac\x15\xc1\x1e\x97\xd7\xb7\xa9\xb1\xc1\x69\x08\xb6\x32\x90\x78\xa0\x7d\x06\x65\xb3\x4c\x9c\xa6\xce\x80\xd7\xf5\x9e\x85\x44\x92\xb7\x32\xbb\x0d\x49\x99\x6f\x08\x5c\xa8\x85\xe0\xf2\x28\xf6\x53\x97\x69\xe6\x4b\xfe\x72\x2f\x24\x56\xa1\xad\x08\x82\x36\x40\x3b\xd0\x9f\x4e\x66\x7e\xee\xba\x64\x02\xf5\xf9\x58\x5e\x5a\x69\x9a\xd1\x09\xe2\x76\x16\x78\x1a\x43\xd0\x66\x09\x3e\x6c\xbd\xd6\x59\xa0\x15\x95\x08\x08\xec\x10\x56\x76\xe3\xcc\x61\x61\x14\x95\x01\xb2\x5b\x94\x2c\xf1\x44\xcb\xc7\x0d\xc6\x41\x91\xea\xb2\xa6\xf9\x00\xe8\x74\x9a\x19\x23\xc7\xaa\xa6\xc9\xec\x2c\xb6\x47\x41\xc7\x5e\x9a\x3a\xeb\x4a\xdc\xde\x60\x89\xe4\x2a\x03\x56\xea\xeb\x34\xc4\x80\x78\xd1\xcf\x25\x7f\xac\x4a\x4b\xf0\x52\x79\x73\x04\x00\x41\x12\xee\x72\x4b\x24\x67\x9d\xa4\x3a\xcc\x65\x3b\xff\xcd\xd0\xec\x10\x12\xf5\x16\x61\x02\xf1\x90\xf3\x9a\xda\x06\x22\x2b\x9f\xee\xd9\x59\x0b\x8b\xa3\x9a\x07\x58\xfc\xfb\xbd\x41\x01\x39\x83\xa2\xdd\x91\x2d\xfc\xac\x05\x9d\xbc\x80\x7e\x23\x33\x53\xe7\x20\x87\x4c\x0e\x95\x36\xe0\x7c\x5d\xe6\x3b\x4e\x12\x51\x56\x46\xd6\x12\x88\xa1\x6f\x08\x6f\x3e\x35\xd1\x6a\x8c\x51\x02\x20\x0a\x08\xc4\x54\x1b\x25\x82\x31\x6e\xd3\xa8\xca\x22\x59\x89\x8f\x40\x3e\xba\x60\xc6\xda\x0a\x49\xd2\xe2\xa8\x19\x65\x49\x96\xb2\xbe\x25\xe8\x4a\xbd\xf5\x06\x01\x89\x35\x17\x37\xa3\xa2\xce\x70\x12\x3a\x49\x0d\x9b\x56\x5c\xda\x2f\xdb\xa2\x4f\x3a\x26\x74\x9a\x91\xa4\x02\xc9\x65\x23\xa9\x10\x33\x48\x94\xa4\xcd\xf5\x90\xcc\x8c\xbc\xa2\x36\x4a\x4c\xfc\x17\x12\xc4\x81\x07\x1b\xb7\x7e\x07\xdc\xe2\x69\xed\x73\xf5\xb8\xd7\x8e\x5a\x2c\xaf\xc5\x4b\x12\xe3\x4a\x83\x97\x9c\xa3\x08\x64\x20\x68\x49\x74\x28\x27\xe2\xad\x17\xb7\x50\x09\x6b\x76\x37\x96\xe5\x6c\x02\x1b\x94\x53\x49\x39\x9e\x9f\x08\xde\x75\xa8\x86\x0a\xf1\x99\x95\xb2\x59\x4b\xc8\x48\x12\xe7\xce\x81\x10\xcb\x4d\x99\x27\x89\xaf\xcf\x65\xc3\xf4\x21\x68\xaa\x98\x04\x78\x8d\xf2\x33\xa6\x51\xc9\x61\xef\xda\x31\x29\xe4\xfb\xae\x3f\x4c\xb2\x40\xa2\xa4\xae\x94\x24\xc8\x6d\xa2\x69\x11\xdc\x15\x16\x10\x55\x2e\x9a\xdc\xde\x9a\xbc\x6e\xf4\x87\xde\xc8\xee\x85\xd3\xd8\x29\x85\xc5\xd9\x3e\xe6\xf3\x76\x4a\xe0\xac\x78\xda\xef\x73\x9e\x3f\x21\xdf\x3f\x25\xe9\x55\x80\x80\x15\xaf\xc2\xe2\x49\x94\x33\x3e\xbb\x96\x9f\x6d\xd0\x04\x28\xc3\x2e\xa2\xdf\x75\x92\xf8\x4a\xde\xaa\x95\x16\x1e\xd7\xf9\x18\x54\x58\x01\x8a\x50\x19\xd1\x16\x25\x0d\x5e\x90\x25\x54\xca\xa2\xf6\x5c\xf2\xbc\x42\xd2\x2c\x43\x40\x34\x0b\x9a\x64\x49\x6e\x5a\x74\xc9\xd2\x65\x5a\x4c\xe6\xc0\xd4\x64\xe2\x4c\x12\x6b\x4a\xd1\x4c\x31\x57\xe4\x81\xc2\x1c\xe5\x98\x3c\x42\x9a\x91\x15\x7f\x40\xdb\xf1\x4d\x15\xaf\x0d\x02\xa4\xe5\xa8\xa9\x1a\xac\x6f\x86\x6d\x36\x18\x36\xb5\xad\xfa\x92\x7e\x34\x4c\x2f\x1c\xc5\x9a\x12\x2f\x59\xdc\x17\x8a\x2a\x97\x75\x6d\xdc\x99\xc4\x2b\xc4\x78\xfa\xb2\xba\xcb\x0d\xcd\xd3\x3b\xe8\x85\x12\x1f\x49\xcb\x02\x23\x97\x0d\x97\x78\xe6\x54\x51\xcf\x58\x61\x42\x59\xfc\xbd\xc0\xd1\xf9\x6d\x8e\x69\x67\xc4\xfb\x49\x8d\xab\xe5\x09\x3e\x5c\xeb\x0c\x25\x82\x15\x3b\x71\xac\x39\x97\x0d\xfa\xca\x80\xe7\x26\x2c\xd1\x88\xaf\x87\x69\x9d\x3d\x74\xc6\x74\x90\x28\xf9\x6e\x2e\xf8\xba\xc6\x22\x55\x80\xb2\x1f\x10\x26\x6d\x78\x94\xf5\xb1\xc2\x83\x15\xbf\x4d\xca\x45\xae\x31\x69\xde\xa0\x25\x51\xf8\x58\xf7\xdf\xc1\xb9\x03\xfc\x87\x6c\x09\x9c\x60\x55\x37\x85\x44\xe3\x96\xe4\xfb\xa2\xa6\x50\x54\x1a\x5c\x98\xa2\x74\xbc\x37\x62\x1a\x1a\x1c\x67\x0b\xb0\x4b\x27\x7e\x5a\x61\x31\x08\x1d\x16\xc7\x87\x52\x6a\xe8\x01\x77\x4b\xf6\xcd\xa2\x7b\x29\x37\x62\x22\x95\x00\x0b\xc8\xde\x25\xa1\x0a\xca\x43\xec\x39\x82\x80\x65\x65\x50\xf7\x2f\x8b\x03\x34\x82\x35\x73\x4c\x8a\x08\xbc\x5b\xf4\x9c\x13\x54\xb1\x90\xab\x95\x76\x92\xa6\x97\x06\xd9\x01\xc4\x25\xf4\x94\xd6\x9f\x82\xc8\xf8\xed\x7a\xd3\xcb\x00\x29\xea\xe9\x15\xe9\x81\x78\x59\x1d\x65\x2a\xa8\xeb\x3d\x72\xf5\x3a\x25\x25\xc3\xe9\xb8\x81\x53\xc1\xd5\xfe\x08\xe4\x79\x02\x0c\xad\xc1\x1a\xd0\xf5\x6a\xa4\xb1\x13\xb0\xee\x62\x38\xda\xef\x06\xb0\xae\x27\xda\xb7\x07\x3f\x53\x6c\xd9\xb2\x4b\x91\xef\x27\x40\x6b\x92\x2b\x44\xee\xa5\x4d\x95\x03\xa3\x1c\x50\xcf\x27\xc8\x42\x10\x37\x32\x26\x29\x8a\x42\x53\xaa\xfd\x6d\x90\x1a\x85\x0b\x9a\x63\x76\x06\x8c\x2d\x11\x9a\x61\x06\x15\x7e\x2c\x27\xff\xe7\x8f\xcc\x33\xae\xac\x03\xd3\xc7\x9a\x6d\x1a\x3c\xd1\x62\xf0\xa3\xae\x6f\xa7\xac\x10\xff\x49\x66\xf9\x04\x68\xe0\x3f\xce\x7a\xb5\x3b\xcb\xed\x57\x5d\xaf\x26\x25\x2f\xde\x43\x68\x2b\xb0\x93\x12\xe8\x38\x00\x4e\xd7\x10\x25\x19\xf3\xb7\xa5\xb3\x9f\xab\xdf\x37\x5a\xfd\x6a\x3f\x88\x89\xac\x95\x05\x74\xb3\xfd\x69\xb0\x46\x03\x56\x1a\x9d\x0e\x5d\xa8\xb4\x6c\x2f\x88\x58\x8d\x6f\x08\xaa\x51\x85\xcc\xe3\xfd\x17\x6a\x48\xe1\xfa\x4e\x1f\xd9\x49\xea\xbd\xbb\x75\x75\x8e\x43\xf4\x15\x4a\x88\x8f\x97\x04\xb0\x5e\xfb\xb9\x6c\xfa\x71\xb2\xfd\x8e\x44\x83\xa0\x1f\x75\x75\x4e\x82\x46\xd2\x34\x1c\x73\x87\xa4\xaf\xf3\x6c\xac\x2d\x7c\x85\x16\x5c\x56\x38\x67\xdb\xc7\x8c\xd8\xa2\xc5\x19\x7a\x67\x0f\xb9\xba\xc9\x6c\xa4\xca\x50\xf7\x40\xed\xd0\x44\x75\x9b\x6f\x8a\x4e\xdb\xfb\x5d\x54\xf5\x33\xdc\x09\x33\xc6\xdd\x2a\x8e\xb3\x33\xbe\x71\x22\xf1\xad\x09\xec\x72\xcb\xdb\xf7\x4c\x38\x87\x6d\x6a\xdf\x90\x68\x7a\xf2\x2a\xfb\x71\xed\x4d\xbf\xc9\x6b\x94\x4a\x50\xf0\x70\x98\x9e\x6b\xbb\xc4\xed\xf2\x55\xd5\x8d\xaa\xb5\xbc\x34\x50\xd7\x30\x2e\xd8\xb5\x58\xf1\x73\xbd\x14\xc6\xfc\x36\x7f\xb2\xeb\x4b\x4e\x8a\x02\xeb\x9d\x3d\xf7\xf2\xba\x01\x77\xb7\x82\xa6\x97\xcf\x0e\xf2\xf9\x5c\xcc\x60\xaa\x02\xf3\x83\xc5\xdd\xad\x84\x64\x39\x5f\x89\xf9\xbe\x88\x1b\xb4\x10\xe7\x5e\xc2\x03\xfc\xdd\x2d\xca\x99\xa3\xb5\x0b\xf4\xe0\x6d\x85\xa8\xdb\x87\x26\xcb\xd8\x20\x67\x59\xce\x2c\xa4\xca\xf9\xa0\x46\x26\x49\x8d\x80\x69\x29\x7e\xfc\x66\x9b\xb3\x8a\x00\xc5\xf7\x3e\x6b\xa7\x9d\x3e\xa9\xdc\xe7\xca\x48\x12\x73\x1e\x0a\x39\x94\xb7\x32\xc9\xa4\xfa\x78\x99\x57\x9c\x12\xee\xd4\xdd\x2d\x86\xdc\x1f\x55\x8f\xe9\xa2\x37\xdc\x7b\x73\x31\x1e\xa9\xa9\x1d\x08\xa0\xf7\x12\x63\x00\xe4\x59\x99\x0a\x4c\x0f\x09\x97\xc3\x65\x39\x07\x06\x26\xe2\x95\x3d\xec\xba\xab\xf9\xae\x2c\xec\x72\xc7\xef\x5c\xd8\x73\x3d\xe7\xf4\x65\x1f\x90\xfc\x9b\x69\x0d\x77\x53\x4b\x84\x22\x6a\x03\xc1\x2c\x03\x8b\xb2\xd0\x1c\x18\xa0\x26\x26\x95\xb0\x8f\x54\x2c\x73\x07\x01\x9a\x59\x00\x09\xb8\xc7\x36\x99\x19\x81\x53\xbe\x45\x41\x44\x25\x80\x57\x5f\x9b\x94\x0c\x90\x80\x29\x72\x97\x4c\x0b\x0b\xd7\x24\x5e\x3c\x93\xc4\xce\xcb\x3c\x3f\x65\xbe\xcf\xbd\xe9\x8e\xfb\x75\xee\x07\xa8\xf9\xbe\x04\xed\x0e\xca\x6a\x05\xef\x1d\x13\xae\xcc\x8e\xda\x2d\x53\xa7\x4a\x22\xee\xc0\xc4\x0d\xe2\x58\x8e\x86\x0c\x6f\xca\x72\x34\x2a\xb3\xcd\x60\x44\x19\xe7\x1a\xfd\x5e\x39\x5a\x07\xbd\xb2\x10\x75\x5f\x5f\x88\x9a\x7d\x79\x3c\xfb\x82\xa3\x9f\xc8\xf3\x48\x01\xe9\x32\xaa\x6c\xb3\xf1\x61\x01\x28\xb2\x2c\xf4\xc5\x23\x6e\x37\x3e\xbd\xdb\xe3\x8d\x0f\xed\xdf\xf8\xec\xcb\x39\xbe\xb7\x1b\x3f\x65\xe3\xe5\xb2\xf1\xaa\x69\xde\x27\x4c\x01\x3b\xcc\x93\xd2\x8d\x1f\xd8\x8f\xd2\x0a\xce\xd4\x1e\x22\xe4\xc1\x8b\x1a\x15\x16\x1e\x6c\x3f\xce\x53\xb1\x22\x52\xe9\x00\x4e\x1b\xb0\x6e\x3c\x29\x41\x00\xe7\xfb\x77\x64\x1a\x36\x09\xd0\xce\x49\x92\x26\x71\x35\xbb\x1e\x08\xb1\x1b\x3b\xde\xcc\xdf\xf8\x93\xf5\x1c\x86\x4c\x85\xe4\x79\x9b\x20\xfe\x57\xe3\x79\x1e\xb7\x94\x3f\xab\x21\xe1\xba\x10\x0f\xdd\x5e\xa4\xf6\x76\x14\xee\x1e\x35\x41\x64\x7e\x9d\x93\x64\xcb\xca\x0e\x52\xe2\x37\xe5\x43\xe5\xb2\xb3\x9f\xe1\x15\x33\x02\x2a\x0b\x45\x94\x8b\x8a\x2f\xce\xe5\x9a\x80\x54\x30\xf1\x35\x28\xcd\x72\x46\x6c\xb0\xfb\x1c\x5f\x24\x01\x19\x4f\xf9\xcb\x77\x8f\x1e\x5c\x86\xbb\xd4\x02\x17\xce\xa5\x36\x0b\x42\x20\x33\xcf\xa7\xfd\x64\x7b\x16\x2a\x45\xb6\xf2\x3c\x14\x04\x51\x22\xcc\xeb\xd9\x5b\x17\x8b\x28\x37\x14\x41\x1c\x0e\xcc\x9c\x2c\x78\x15\x37\x01\x5c\x5c\x17\x55\xae\xeb\xee\xd6\x50\xed\x8c\xc3\x3b\xc7\xb6\x7e\xac\x1b\x40\x3c\x16\x98\xfa\x0d\x20\xdf\x6b\xc0\xc9\x9a\xfc\x5b\x44\xb8\xd6\xb4\x29\xaa\xde\x60\xec\xef\x56\x05\x64\x35\x20\x2e\xc5\x6b\x53\x8a\x5a\x9c\x50\xd2\xe0\x5d\x85\x19\x2d\xd7\xc8\x5a\x15\x15\xce\xeb\x09\xe2\x49\x91\x09\x65\x52\x0b\x39\x41\x3d\x2f\x52\x19\x46\x58\xec\x6b\xa7\x12\x3b\xb7\x39\x89\x4b\xc3\x6e\x5a\xff\x6a\x94\x7e\x90\xce\x8f\x27\xcc\x0c\x30\x9f\x4e\x23\x48\x71\x61\xf2\x77\x8f\xe8\x34\xbf\x2d\xcb\x40\x5d\xc7\x0e\xbe\xea\x55\x72\x02\xd5\xe5\x5a\xf6\x23\x07\x9c\xb0\x03\xda\xb1\xa8\xdb\xce\xae\x67\xb4\x6e\xf7\xed\x99\xbb\x56\x7d\x9d\xa5\xc8\x71\xf6\xcc\x69\xb7\x3d\x6f\x0a\x78\x24\x08\x4b\x41\xc5\x0e\xad\x73\xb5\xac\xe1\x0e\x37\x16\x4c\x3a\x96\xef\xe6\x75\xaa\xc9\xa5\xe4\xd4\x0d\xdb\xe4\x76\xe2\x76\x55\x69\xcb\x4c\x45\x63\x66\xb3\xbc\xd5\xa0\x97\x42\x8b\xa7\xb0\xe6\x75\x3e\xe4\xdc\x09\xce\xb5\x9c\x5b\x7f\xc1\xf4\x62\xe5\x7f\xb2\xe0\x8f\xc5\x82\x47\xef\x10\xfb\xda\x11\x14\x75\x82\x1e\x2f\xbf\x4d\xbe\x37\xfc\xa9\x02\x1d\xa0\xcb\x83\x9a\xcf\x96\x8c\xee\x1e\x35\x6a\x0f\xd6\x4a\xa1\xcc\x02\x8b\xbe\x6f\x2e\x18\xa7\x25\x1e\x68\xab\x73\x5c\x5d\x6f\x5a\x17\x0b\xb2\x80\xb8\x2e\xf6\x2b\x4b\x8f\xe8\xc4\x13\xcf\x7a\x65\xf2\xd3\x47\xeb\x35\x87\xb7\xd4\x6f\x51\xd5\xa6\x68\xb5\x1a\x6b\xb6\x03\x26\x4e\xd6\x8d\xec\x6c\x87\xad\x02\xb4\x2c\x1f\x67\x06\x32\xfa\x56\xe3\xd9\x8f\xbc\xb5\xaa\x50\x90\x5d\x80\x48\x13\xa0\xdd\xad\xd1\x48\x9e\x29\xd7\xa8\x34\xda\x8a\xef\xf2\x1f\x53\x98\x3e\x6a\x8a\x0a\x12\xaa\x86\x50\xbd\x1a\xd1\x4d\x4d\x55\x06\x21\x36\xd3\x9e\x6d\x92\x45\x3c\x28\x41\x13\x24\x8d\x24\xe9\x0b\xc7\x5c\xd0\x0a\xd3\xcc\x37\xb6\xfb\x79\x88\x09\x62\x3a\x20\x37\x2f\x35\x4b\xf4\xb5\x96\x74\x94\xd6\x12\x6a\xad\x25\xd0\x41\xad\x05\xf7\x2b\x2d\x69\xa7\xd2\x72\x89\x2d\xe2\x18\x85\x45\x60\x48\x3d\x93\x8e\xf7\x1d\x8d\xc5\x06\xd6\x58\xec\x71\x3c\x55\xeb\x2b\x66\x29\x99\x34\x3b\xe9\x34\x25\xc9\xa5\xe8\x2b\xb4\x5b\x5f\x31\x51\xd1\xc2\xef\xd6\x52\xfe\xe8\x7b\x85\x3f\x14\x6f\x1d\x69\xb8\xe9\x21\x11\x24\x48\xf1\xfa\xf6\x9a\x9c\x00\x62\x0a\xcf\x6c\x49\x90\x1e\xc1\xb8\x6c\xd4\x1e\x60\xf9\xc7\x20\x66\x34\xa6\x63\xb2\x3d\xba\x0b\x90\x16\xcc\xe0\xdd\xd0\x63\xf0\x90\x48\x8c\x69\xd0\x4b\x8c\x97\x3f\x23\x67\xa6\xd4\xcb\x77\x96\x21\xc1\x13\x50\x2f\x01\x6b\xdb\x24\x39\x10\xb4\x80\x4e\xf1\xb0\x1a\xc9\xac\xcd\x22\x4b\x92\x63\x5b\x3b\x47\x0b\x84\xcc\x7e\x5e\x4e\x25\x72\x8c\xa2\x24\x4b\xb6\xac\x0a\x24\x9e\x60\x37\x27\x49\x04\x49\x90\xf0\xee\xd6\xa9\x4c\x40\x98\x9d\xf1\x17\x06\xc1\xfa\xb9\xa0\xae\x93\x18\xd5\xf9\x82\x5b\xb0\x32\xe1\xab\x3c\x1e\x69\x83\x16\x2e\x0a\xd1\xf8\x4f\x39\xd4\x8f\x39\x87\xee\xde\xa1\xec\xd1\xf3\x54\xd1\x83\x6d\xc8\xd8\x92\x62\x3e\x0d\x69\x46\xd1\x20\x48\x8e\xc4\x5d\x91\x58\x4b\xf2\x22\x45\x7c\x27\xb9\x61\x84\x98\xb4\xe4\x09\xdc\x6a\x86\x13\x85\x8f\xd1\x28\x6c\x4f\xc2\xe9\x24\xd4\xbf\xcd\xe3\x7b\x20\xd0\x4b\xdc\xba\x5d\x5d\x16\xdf\x38\x56\xaf\x1f\x83\x18\x20\x2d\x47\x31\x66\x3a\x2a\x92\xe6\x75\xdb\x96\x23\xcc\xb2\x33\x40\x5d\xd6\x1a\xab\x01\x4f\xba\x3f\x53\x24\x81\xc2\x36\xc7\x58\x52\x5d\xf6\xba\x12\x20\x4d\x14\x75\x78\xfd\x00\xd4\xef\x24\x22\x6e\x1b\xb6\xb5\xa4\xc0\x62\x23\x97\x79\xca\xb8\xa6\x20\x33\x75\x6e\x8c\x55\x3f\xb8\x8c\xe5\xab\xcf\x0e\x9d\x5f\x3d\xb2\xac\x49\x5a\x91\xc3\x23\x25\xf1\xc0\x28\xb0\x52\x13\xc2\xee\xfe\xbe\x1d\xdc\x25\x2b\x49\x2e\x9a\xb9\x67\x46\x3d\xb5\xb3\x9d\xf6\x4d\x10\x47\x47\x19\xfa\x83\x6b\x67\x8e\xb4\xd9\x65\xb8\xe9\x16\x9a\x1c\x24\x7a\x76\x5c\x59\xa8\xcb\xba\xc3\x45\xce\xda\xbb\xeb\x0d\x0d\xd6\x55\xc0\x5d\xf6\xe3\x10\xc8\x6d\x23\x77\x2c\x0a\x9d\x4c\x58\x83\xa5\xe1\xf9\x7e\xf5\x7a\x99\x19\x57\xb0\x03\xdf\xbf\xfb\xfd\x4f\xef\x31\xbc\x7f\xf7\x6f\x0f\x1f\x5f\xd7\x7f\x7a\x8f\xf6\xfd\xbb\xf5\xfd\xc3\x6f\xeb\xd7\x3f\xbd\xdf\x81\x07\x75\x5e\xad\xd4\xaf\xd5\x4b\xa5\xe4\xda\x4a\xe9\x0a\x75\x9a\x9d\x3d\xed\x54\xfa\x46\x4f\xcf\x73\xfb\xb5\x43\x97\xee\xbc\x28\xe1\x6c\xe0\x7d\xad\x30\x29\xd6\xc7\xe7\x98\x64\x05\x2e\xb1\xd8\x4c\xe7\x3a\xed\x86\xae\xd3\xe2\x7b\xc0\x6c\x55\x1a\x5a\x10\x96\x19\x82\xa7\x00\x17\x67\x03\x1f\x2f\xb1\x96\xb0\x56\xb0\x94\xdc\x08\xdb\x04\x09\x1a\xc8\x6b\x70\xbe\xb4\x8b\xc0\xaf\x06\xac\x10\xd0\x8d\xc0\x72\xc3\x82\xd2\x9b\xa8\xa6\xe2\x62\x70\x6b\x15\xa5\x05\x99\xd2\xd0\xe6\x24\x1f\xd7\x83\x7d\xf7\xdf\x9f\xe3\xf5\xb1\xd4\x7c\x94\xed\xb7\xe5\x9f\x74\x39\xfb\x1c\x15\xe5\xd1\x56\xd8\x91\x12\x57\xa8\xd1\xf4\x6a\x9c\x52\x30\x1d\x01\x7e\x3c\xb1\x58\xda\x5f\xa3\xdb\xd5\xcb\x49\x84\xd2\xfe\x3a\xfd\x30\xcc\x55\x49\x3a\xa4\x8d\x06\x87\x63\xa8\x62\xc1\xd6\x61\x79\x34\x55\xc0\x50\x18\x04\x0c\x65\x37\x91\x65\x00\x1b\x94\x14\xb5\x6d\x0a\x7c\xd4\xe0\xb2\x78\x21\x70\x72\xde\x46\x2a\xb4\x79\x17\xb4\xb8\xba\xa8\xc1\xd5\xec\x00\x73\x8e\x0c\x3a\x8c\xac\x6c\x15\x3a\x11\x4c\xa5\x7d\x53\x50\x9d\x19\x70\x14\x2f\x08\x38\xda\x4b\x7c\x7b\x36\x86\xd3\x49\x8d\x3d\xbb\xb9\x2d\x35\xa7\x8b\x59\x76\xcf\x1e\x6b\x42\x41\xb4\x67\xef\x73\x8e\xe0\x39\x27\x6b\x8a\x21\xe5\xce\x20\xd9\xd0\x07\x51\x17\x2a\x0d\x0d\x91\x3e\x16\x2a\x1e\x4b\xb0\x27\x8d\x8b\x9f\x54\x38\xee\x94\x10\x53\x09\xc3\x53\x8e\x03\x32\xe2\xd9\xdb\x08\xec\x64\x4b\xba\x7b\x8c\xda\xb0\xc8\xa4\x32\xfb\xef\x53\x28\xe3\x86\xca\x13\x02\x2c\x8e\x32\xf4\xd7\x02\x3a\xab\x86\x6a\xab\x1a\x76\x34\xae\x60\xb4\x19\xe2\xc8\x6f\x7c\x89\x11\x5c\xd8\xa5\xcb\xf1\x97\xee\x6e\xa3\x4a\xa5\x5f\x84\xf2\x84\x3d\xe4\x81\x06\x9b\xfd\xea\xa5\x68\x4f\xdc\x8e\x24\x49\xb4\xda\x76\x80\x71\x0a\x6d\x49\x9b\x58\x1a\xdb\xe8\x7f\x51\x21\x37\x0b\xb9\x5d\x8f\xe8\x55\xc1\x5d\xc5\x70\x52\x12\xc3\x03\xcd\xb4\xdf\xb9\x26\xb8\xb7\x47\x47\x98\xdc\x33\xf5\xa2\xad\xc7\xd3\xde\x3d\x7a\xe5\x2e\x1f\xcb\x37\x2d\xf2\xdf\x80\x6f\xf6\xb5\xc9\x0c\xda\xd4\x2a\x2e\x6f\x2a\x10\x36\xe5\xa2\x56\x20\x28\x8e\x36\x31\xcc\x52\xe4\xb2\x7e\xd4\x57\x37\xea\x6a\x0e\xb3\xd4\x5e\xeb\xd6\xfe\xde\xd8\x49\xa3\x8f\x0f\x1b\xe1\x49\x11\x65\xb2\xc9\x53\xe4\xba\x53\x84\x27\x4f\xd1\x01\xeb\x9a\xb2\x3b\x06\xd6\xd8\x85\xef\xaf\x64\xb6\x3b\x9c\x92\xf2\xb4\x9e\xc6\x8b\xac\x40\x66\x52\x62\x1d\x00\xf6\xd4\x39\xcb\xaf\x61\x94\xa9\x97\xda\x62\xbb\xd4\x7e\x05\x9b\x0c\xd5\xb5\xda\xb6\xd6\x6b\x98\x47\x46\x2b\x87\x88\xdf\x22\x56\x92\x78\xc5\x81\x8f\xa5\x29\xc0\xf1\x42\x67\x93\xf2\x0b\x4a\x82\x34\x0a\xd6\xce\x03\x0b\xd9\xb4\x46\x02\xd7\x18\x1e\xf8\x52\x87\x90\x1c\x73\x66\x04\x1b\xe6\x94\xbf\xda\x4b\x42\x01\x64\x8f\x50\xb1\x08\xc1\x74\xbd\x5b\x9a\x06\x4e\x66\x9e\xf8\xde\x17\xa5\xc9\xcc\x13\x93\xd0\xef\xb1\x06\x8a\x09\xa9\xf7\x28\x0b\x45\x97\x76\x05\xd8\x5f\x12\xdf\x0d\x56\x16\x4d\x0a\x28\x55\xbc\x7c\x24\x3b\x26\xe5\x52\x96\x92\xe5\x20\xb1\x85\x16\x90\xee\x6f\x4c\xda\x67\x6e\x68\xa7\x5d\xc3\x8e\x38\xe9\x6c\x67\xa0\x80\xe8\x79\x7c\x4c\x77\xb1\x91\xe4\xc4\xe1\xab\x0e\x65\xbd\xf1\xea\xcd\x72\x84\x64\xe6\x02\x13\x0e\x96\x3f\x7e\xe9\x7e\x8c\xa6\x65\xb2\xfd\x9b\xed\xcb\x99\xea\xf4\xfd\x18\xd1\x26\xbc\x39\xfa\x74\xf7\x48\x51\xb9\x92\xfc\x82\xdc\x7a\x9a\xcd\xc2\x28\xdb\x88\x60\x7f\xf6\xf7\x34\xdd\x18\xbe\xd6\x80\x2f\x1b\xb3\x83\x64\x26\xa9\x51\x0a\x71\x21\x3b\xc1\x85\xe2\xa8\xfd\xd7\xf7\xb9\x86\x5c\xbe\xb1\xb9\x36\x19\x1c\xd9\x90\x46\xb2\xcf\x06\xc6\x4a\x09\xc3\x0b\x97\x4c\xfa\x19\x3b\x04\xfc\x8a\x3b\x84\x33\x05\xea\x79\x94\xbe\x3f\x5f\xed\x05\x74\xd0\x77\x15\xeb\x41\x0f\x5d\x51\x67\xa7\x6f\xa2\xb3\xfb\xaf\xaa\xb3\xf3\xf6\x57\x80\xb5\x83\xf2\x8b\x4e\xe6\x12\x9e\x9e\x62\xe1\x59\x75\x0f\x0a\xc5\x27\x40\x23\x84\x34\xcf\x08\x0c\xe2\xe1\xe2\x51\x45\xe8\x3a\x5f\xd5\x1f\xbb\x82\x7a\xdd\x24\x8d\xda\x8a\xf1\x04\xd6\xaf\x50\x51\x86\x1f\x37\xa8\x32\x8e\x3f\x38\x2b\x2e\xa0\x0b\x53\xb0\x86\x46\x60\xe3\x8d\x95\x8c\xbb\x98\x9d\x5e\x0b\xa7\xd0\x36\x3f\x4b\x74\x0b\x14\xfd\x2c\x2c\x51\x86\xa1\x85\x17\xd7\x08\x82\x53\x4c\x37\x24\xc1\x00\x2c\x25\x30\xff\x30\x66\x71\xc4\x26\x94\x9f\xbb\x61\x5d\x82\x00\x49\x94\x0a\xc1\x7b\xaf\x3b\x70\x85\xd3\xe1\xef\x73\xf9\x98\x6e\x0b\x32\x05\x3b\x9e\xba\x05\x99\x80\x19\x8f\xde\x82\xbc\xc5\x8a\x56\x19\x48\x3d\xef\xe5\x80\xbc\x25\x11\x1f\xbf\xe5\xe0\xec\x4b\x23\x90\xd3\x06\x1c\x4d\xcf\xb1\x47\x1d\xc1\x36\x0b\x4f\x10\x37\x1d\x37\xf4\x1d\xd7\x10\x99\x07\x47\x47\x76\x62\xa7\x13\x6c\x64\xdc\xd0\x3a\x40\x72\x37\x46\x50\x71\x92\xf8\x3f\x07\xaa\x19\xd9\x08\x27\xda\xef\x8c\xcf\x1b\x36\xdf\xf6\x7b\xba\xfd\x98\xfb\x16\x07\x8c\x13\x30\xdd\xfe\x5d\xcf\x64\x4c\x76\xc8\x8d\xf3\x28\xa6\xea\x7a\x66\x4a\xb4\x43\x04\x37\x35\xdf\x1c\xf0\xd0\x64\x7a\xc9\x88\xff\x61\x86\x02\xc5\xb3\x45\xe2\x91\x1d\xe7\x1f\x81\x21\xea\x0e\x4e\xb2\x67\xda\xb1\xd5\xb4\x1b\xff\xb6\x5d\xb8\xa3\x5b\x86\x2b\x6d\x35\xfb\x04\x17\xbf\x9e\x42\x75\xf2\x39\x1f\x8e\xf7\xc4\xa4\x4c\x03\xd3\x8e\x8a\xc4\xdf\x1d\xa5\x17\x46\x99\xbc\x4f\xd6\x5e\x15\x47\x50\x0e\x6f\x38\x30\x89\xcf\x2c\x90\x68\x1f\x56\xc0\x06\x82\x1c\x56\x18\x48\xe6\x26\x03\x00\x89\xab\xa4\x32\x82\x25\x44\x85\xc0\xf5\x9c\xa6\x23\xfd\x3c\x37\xbc\x36\xe9\x1f\x79\x8c\xf8\x16\xe1\x7f\x6b\xf5\xe5\xb4\x03\xc8\x0b\x55\x17\x7f\x2d\x8e\x09\xf5\x1d\x63\x00\x33\x9e\xd5\x19\xda\xc6\xf7\x75\x7a\x79\x55\xf2\xdd\x7f\x9c\x79\xe4\x9a\xfb\x55\x66\xd2\xca\x0b\xe9\xbc\x75\x72\x7f\xb6\xcf\xa3\x38\xf2\x32\xdd\x67\x87\x65\xe6\xa7\x49\xe6\x42\x93\x4c\x64\x6a\x88\xb6\xb2\x60\x83\xb6\x60\xed\x5a\xd7\x29\xbf\xfb\xf9\x3b\x35\x78\x49\x53\x87\xbe\xc5\xb5\xc0\x1a\xd7\x02\x7d\xa5\xad\xee\x0b\xdc\x6d\xfe\xef\x1f\xc8\x40\x93\xc0\x35\xda\x47\x46\xae\xb4\xfa\xa7\xbd\xe6\xa7\xbd\xe6\xbb\xb0\xd7\x34\x7c\xea\xc1\x44\xed\xc1\xf4\x44\x29\xaf\x1f\x50\xc4\xaf\xc0\x9f\x13\x9a\x63\xd4\x50\x0d\x33\x92\x3a\x20\xaa\x0e\x07\x12\x2f\x95\x66\xcd\x8c\x3c\xc9\x4e\xf4\xdb\x70\xf8\x7f\x26\x4b\x4d\xfe\xe8\xb5\x0d\x2e\xf4\xbe\xff\x36\xff\xef\x78\x45\x4b\x60\x66\x7a\x54\xa0\xe8\x0f\x44\x63\xa7\x28\x75\xc7\xc4\x26\x7f\x53\xc9\x73\xaa\x75\x06\x3d\xaf\xa2\x84\x02\x23\x2d\x10\x7e\x16\x12\xce\xda\xf9\x50\x49\x82\x30\x2f\x53\xac\x31\x80\x39\x01\x31\xf9\x04\x8b\xce\x49\x5b\x14\x2b\x5b\x14\x3f\x91\x71\x69\xac\x1a\x82\xf7\xed\x36\x62\xa5\x01\x9d\x06\x87\x1a\xbc\xe3\x71\x92\x24\x8f\x4e\x7b\x10\x7f\x57\xc1\x8f\x89\x49\x39\x88\xd3\xb8\xb6\x8f\xc3\x21\xf7\x2a\xaa\x19\xae\xfb\xeb\x28\xaa\x6f\x35\xfb\x7b\xd7\xb8\x2e\xb5\x00\x7d\x1f\xd2\xe0\x58\x2b\xd1\x77\x29\x0b\x8e\xf5\x4a\xbf\xba\x24\x78\xd3\x24\xb3\x4f\x0e\x04\x2d\xf9\x50\x42\x62\x11\xa0\x0d\x14\x5e\x47\x5e\x52\xcf\xd7\xf3\xa2\xe7\xa1\x95\x8c\xb8\x26\xf2\xe6\x6d\x22\xeb\xd2\x25\xda\xd1\xa9\xd6\xa5\xef\x81\x35\xf6\x5a\xa0\x30\xf1\xc7\x28\x23\x4c\x40\xb0\x10\xec\x9e\xf9\xe4\xf9\x29\x92\x8e\xe0\xcd\x09\x2a\x54\xe0\x09\x3c\xc5\x38\xba\xdf\x90\xf4\x1d\x32\xed\xfe\x3c\x11\x17\x30\x69\xcf\x9a\xf5\xe7\xfb\xcd\xc3\xea\x7e\x12\x54\x2d\x71\x3d\x2b\xc9\x6e\x1b\xa1\x49\xd1\x48\x9f\x5c\xc7\x51\x68\x7d\x3f\xb4\x02\xcd\xdd\x63\xa1\x68\x41\xbe\x24\xbb\x40\x27\xe1\x15\xa6\x58\x50\x00\xbf\x66\x65\x78\xa2\x4c\x3e\xc4\xab\x5e\x69\x17\xbe\xa4\xb8\x71\x6b\x5a\xf8\x6e\xcb\xc7\x01\x36\x0b\xa2\xc1\x80\xd3\xc5\x4d\x31\xdb\xa6\xf8\x32\x0d\x20\x28\x8f\xfc\xfc\x5b\xe9\xab\x26\x9e\x95\x58\xcf\xca\x04\xce\x72\x71\x1c\x6c\x33\x1a\xe4\x75\xdc\x50\x99\xc0\x08\x66\x02\xab\x1b\xf5\xad\xa8\x48\xa0\x68\x3a\x97\x98\xff\x14\x96\x98\x20\xd1\x46\x83\x09\x25\x15\x8b\xc1\x14\xf7\x9c\x03\xd5\x2e\x8e\xf8\xef\xf7\xbf\xff\xed\x69\xf9\xfc\x71\x22\x96\x88\xe5\x70\xe8\xe9\x4d\xbe\xed\xe3\x83\x92\x8a\x92\xba\x37\x96\x76\x81\x45\x69\x76\x09\xbb\x33\x1c\x13\x42\x8e\x1a\x36\xd7\x08\x8f\xcd\xde\xd8\x88\x57\xac\xa2\x8e\x7d\x76\x57\xac\xc2\xe5\x2a\xd2\x15\xab\xc8\x91\xca\x64\xae\x58\x45\x0e\x55\xa6\x6b\x4e\x77\xec\x12\xd4\x55\x22\xdd\x53\x8f\xa0\xae\x52\x05\x16\x3d\x8a\xba\x4e\x1d\xd8\x23\xa9\xeb\xd4\x41\x3d\x9a\xba\x4e\x1d\xa6\x47\x54\xd7\xa9\xc3\x76\xeb\xe8\x58\xfe\x58\x2f\x9c\xb0\x1a\xd7\x21\xde\xae\x7d\x71\xc2\x2a\x7c\x4d\xbd\x80\x66\xd4\x19\x03\xc1\x9d\x13\xa3\x72\x68\xc1\x9f\x66\xcd\xb9\x95\xbc\x4a\x6b\xda\x50\x89\x89\x57\x20\xdb\xfe\xae\xad\xae\xff\x70\x9d\x1b\xae\x7b\x03\xef\x6e\x93\x22\x5b\x06\x5e\x81\xf9\x75\xed\xca\xb0\xc0\x90\x7f\xe7\xeb\x68\xf8\x77\x5e\xe2\xeb\x17\x1e\xd1\x40\x8c\x2a\x94\x32\x52\xfc\x9e\x64\x1a\xbb\xbb\x25\xa7\x30\x95\x64\x16\x18\xd6\x94\x5f\xe7\x3f\x0c\xff\x61\x78\x97\x90\x4a\xe2\x7a\xd6\x4c\x1a\x77\xb7\x94\xe4\xf1\xd0\x7d\x3c\xe4\xc7\xc7\xcb\xfd\xed\xd3\x97\x97\x49\x52\xb2\x62\x54\xc6\xce\xb0\x50\x58\x6b\x23\xac\xa2\xd8\x05\xd2\xb2\x7b\x8d\x0a\x55\x2c\xa8\xff\x9c\xbc\x29\x69\x4c\x6d\x0b\x93\x54\xe8\xa8\xe2\x82\x3a\x17\x14\xe6\x93\xf9\x59\xe7\x4a\xab\xc1\xbc\x41\x31\x6f\x2b\xc3\xbc\x89\xec\xc2\x95\xa2\xc6\x05\x16\x1d\xa0\x4c\x52\xc5\xc6\xf6\x81\x2f\x2f\x53\x02\x3b\x50\xa9\x9d\xd1\x60\xc5\x0e\x79\xe7\xb2\xec\x5e\x93\x51\xc3\xfe\x73\xfc\xe2\xdd\x23\x82\x91\xdc\xf0\x76\x29\xbf\x41\xb3\x31\x24\x90\xd1\x2a\xfa\x97\x95\x5c\xde\xb5\x0d\x5a\xbe\xac\x27\xd3\xfa\xc8\x49\xa2\x4c\x02\x43\x95\x76\x39\xab\x72\xc4\xd6\xc5\xa2\xc6\xc7\xae\x31\xaa\x13\x69\xbe\x3b\x1e\xc9\x4b\xa6\xd2\x4a\xbe\x58\x2f\x79\xfb\xfc\x36\x71\x9f\x03\x39\x60\xb0\x15\x18\x30\xae\x34\x05\x98\x0a\x8c\x16\x8b\xc1\xe8\xe1\xfa\x33\x77\x8f\x88\x60\xac\x38\xfe\x94\x1e\xbc\x5f\xa2\x15\x18\x57\x29\x1b\xc3\x0a\xa2\x0e\x10\x6d\x19\x36\x9a\x4a\x03\xce\xcd\xf8\x3e\xaa\x5c\xe6\xb1\x0f\x19\x73\xbb\x22\xb0\x92\x9d\xd6\xa9\x06\x3a\x1e\xe7\x02\xac\x9a\x20\x86\x1d\xef\x61\x50\x92\x84\xd6\x80\x68\xf0\x60\xa4\x05\x41\xe5\xb2\x68\xd2\x8f\xca\xe9\x83\x47\x89\x5e\xa4\x0d\xad\x0d\x38\x33\x1b\xb5\x55\x51\x92\xde\x24\x08\x3b\xa8\xf7\xf0\x98\x9f\x02\xbb\xef\xea\x5c\xaf\x3e\x75\xe6\xdd\x42\x34\x10\xdd\x76\xd6\x5b\xf0\x7c\xdc\xd2\x49\x6b\x71\x10\x98\xbe\xe6\x2b\x53\xb6\x75\x88\x87\x9f\xe3\x06\xc7\x71\xbd\x6d\xe6\x48\xc9\x67\x6b\xb7\x89\x32\x21\xe5\xec\xe9\xbd\xb1\xde\x43\x17\x4a\xe8\xe2\xfb\x20\x9c\x1d\xcf\x90\x74\x7e\x57\xe2\x8d\xb8\x33\x73\x57\xd2\x28\xc0\xc5\x27\xf0\xd6\x92\x1f\x73\x2a\x97\xcd\x82\x2b\xc9\x46\xf7\x4c\xea\x99\x27\xb2\xe6\x7c\x9b\xe3\xb9\x92\x7b\x52\x39\x13\xc1\xab\x04\x36\x32\x2b\x50\x5f\x64\x6e\x19\x45\x44\x26\x66\x91\xf9\xa8\x49\x12\x69\x87\x32\x6c\x84\x78\xfc\xaa\xd0\x60\x92\x86\xc2\x69\x08\x41\x7e\x22\x60\xf8\x20\x99\xee\x49\xe0\x74\x24\xd5\x34\x26\x48\x77\x8f\xac\x5c\x68\x2c\x98\xa4\xbc\x14\xf3\x24\x72\xc5\x40\xb0\x0d\xd1\xcd\x04\x11\x5a\xe5\xb2\x5e\xd6\x1b\x92\xbb\xcb\x79\x8f\x42\x2a\x31\x2c\x98\xd2\x56\x60\x48\x92\x7c\xd7\x0c\xff\x92\x93\xd3\x2a\x28\x9c\x00\xb0\xd9\x94\x93\x45\xaf\x0a\x05\x26\x89\x77\xa8\x34\x56\x71\x23\x6b\x66\xd2\x99\x9b\x6e\xf8\xf1\xd0\xb4\xb9\x79\xd5\x7a\xd5\xf9\xcc\xd1\x32\xe1\xd4\x10\xd2\xad\x3c\xe8\xbb\xab\x16\x3a\x0a\x78\xe5\x34\xc4\x7f\x5b\xf3\xe7\x81\x51\x63\xd6\x2d\x31\xdc\xdd\x8a\x1f\x61\xc2\x43\x93\xfc\x52\x68\x49\x47\xad\x21\x9a\x32\xdc\x3d\x12\x38\xe4\xf6\xfa\xf9\x11\x53\x59\xb5\x34\x70\xf7\x88\x05\x78\x52\x49\xd0\xa4\x5b\xfa\x83\x48\xda\x42\xc4\x2d\xf9\xb5\xab\x38\x6e\x09\xb6\x63\x2d\xa6\x02\x8a\xc4\xe2\x25\x99\xbb\x47\x94\x23\x4b\xec\x4f\x31\x53\x81\x1c\x9e\xe5\x83\x0b\x88\xe6\x43\x3d\xe9\x92\x8b\x97\x7f\xb7\xb9\xdb\x27\xc8\x89\xf3\x70\x0a\xf6\xc9\x88\x7e\x06\x99\xa7\x97\xd7\x89\x14\x65\xb2\x60\x96\x94\xb3\x52\x4b\x1e\x47\x39\xaa\xa8\xff\x0e\xb3\xee\x9d\xa2\xcd\xdd\x2d\x06\x48\x03\x7e\x99\xcf\x30\xb9\xc8\x29\xbc\xf9\x57\x5d\xc3\xaa\x6e\xef\x34\xa8\xf2\x75\x8e\xf1\xd6\x3f\x04\x0d\xb8\x3a\x13\x01\x6c\x37\xae\x69\xbb\x07\x63\x6d\x72\x3a\x6d\x8c\x5c\x9d\x46\xb7\xc4\x42\x04\xa0\xe4\x15\xe3\x22\xf7\x2d\x29\x0b\xc9\x2d\x78\xb6\x79\x97\x62\xc5\x59\x75\xf0\x4c\xfb\x8d\xbb\x47\x2d\x6b\x60\xe0\x8f\xc5\x85\xb8\x20\x3a\xd8\x61\x10\x7c\x77\xae\xc9\x8e\x20\xbb\xcf\x04\xe8\xec\x51\x0b\x88\xc7\x0c\xcf\x39\xf6\xbb\xa6\xbe\x5c\xc7\x89\x15\x9e\xe7\x9c\x38\xf2\xdc\x70\x40\x92\x45\x7d\xd5\x64\xd6\x26\x45\x10\x9b\xff\x5e\x08\xa2\xae\xaf\x69\x82\xf8\x01\x13\x38\xc5\x5b\xd2\xa8\xc8\x7d\xc8\x6f\x7b\x90\x1c\xe0\xf9\x3b\xff\xf1\xee\x16\xd3\xf6\x9b\x05\x04\x2d\x50\x57\x20\x10\xba\xfc\xf3\x85\x7f\xe1\x8b\xba\xbe\xf8\x52\xff\xde\x3c\xf4\xa1\xf9\x80\x64\xa2\xab\x3f\x7b\xe2\xa8\x9f\xe2\x04\xdc\x18\x26\xb0\x33\x07\xdd\x19\xf0\x7b\x26\xe0\xa9\xfa\xfd\xb7\xa7\x4f\x97\xb9\x03\x7f\x7e\x7a\xf8\xf4\xfa\xc2\x95\x83\x51\xfe\x1d\x52\x2e\x02\xf8\x77\xbc\xe4\xf1\x2f\x53\x4e\xff\xc8\xc1\x83\xc4\x01\x7c\xed\x81\x57\x16\x9e\xa8\x42\xe6\x00\x55\x01\x56\xf3\x1d\x1d\x16\xfc\xc4\x9e\xf1\xbf\xd4\x43\xb6\xf1\xd1\x10\x0f\xdc\x85\xa1\x12\x8b\x85\x6d\x93\x46\x69\x2a\x13\xb8\x9b\x08\x41\x91\x62\x7a\x0c\x4a\x74\x98\x85\xb1\x6b\x2a\x16\xd9\x0b\x79\xda\xa6\xbd\x91\x8e\x5a\xa0\xa1\xe6\x24\xa0\xd7\xb8\xd2\x3c\x43\x4c\xbc\x72\x62\x2a\xbf\xb3\x04\x8e\x2b\xfe\x3b\xff\xe7\xea\x9f\x91\x7f\xae\x11\xc1\xad\x8a\x3a\x6b\xbf\xd1\x02\x3f\x07\x2c\xbe\x49\x46\x9f\xaf\x20\x5f\xe5\x0f\xea\x02\xa2\x60\x5d\xe9\x04\x49\xaa\xaa\x79\x86\x9f\x60\xa6\x8c\xfc\xe4\x8d\xb0\x09\x7f\x9f\x42\xc6\x2c\x90\x26\x9e\x3e\x26\xa7\xec\xee\xfe\xa0\x12\xe3\x58\x57\xe4\x73\xe5\xc5\x04\x1e\xc9\x24\x50\x06\x6e\x55\x13\x0a\xd5\xff\x99\xfa\x3f\x57\x22\x6d\x98\x6b\x91\x16\xfc\xdc\x94\x64\x30\x74\x50\x21\xe5\x73\x55\x05\x84\x55\x8f\x70\xb1\x6e\x1b\xf2\xba\x4f\x53\xb6\xc1\x0d\x46\x43\x80\x7b\x4c\x57\x6e\x08\xef\x69\x61\x31\x60\xd5\x98\x79\x32\xbd\x25\x47\x0c\x10\xf3\x91\x51\x68\x6a\x50\x36\x7e\xa4\xfe\xfa\x9e\xf6\x9f\xb9\x4f\xf5\x5f\x79\x9f\x4a\x9e\xb9\x6f\xad\x31\xec\xed\xbe\x61\x29\x92\x2f\xcb\x20\x08\x7f\x3a\x45\xcc\x97\x92\xab\xcb\xad\xb4\x00\x6e\xe8\x9a\xb5\x75\xcb\xda\xbe\xc3\xda\xcc\xf8\x5d\x61\x90\x19\xdf\x88\x8c\xcb\x9f\xf9\x8f\x77\xb7\x64\x78\x57\xe0\x4b\x34\x0b\xc2\x35\x16\x0b\xfe\x8b\xaf\x5b\x59\x87\x4a\xa1\x5b\xa1\x5e\x6c\xae\x87\x7c\x59\x68\x3a\xec\x5d\x88\x4e\x00\xa8\xa1\x01\x40\x4d\x60\x7d\xeb\x99\x19\x77\x7c\x00\x71\x68\xcc\x4f\x89\x5e\xa6\x2c\xf0\xcc\x4a\x93\x2a\xb4\x81\xc0\xcc\x21\x3f\x0d\x84\xba\xd7\x1e\x92\xac\x02\x2c\xce\x85\x81\x9a\x9f\x55\x1e\x73\xca\xc3\x90\x80\x2a\x02\xa3\xed\x5a\xa3\x3d\xb4\x36\x1a\x89\xfa\xfd\x7a\xb3\x78\xf2\x3e\xed\x28\xff\xdc\x6b\x4f\xd5\x1b\xc9\xb9\x92\x42\x59\x84\x55\xbd\x08\x9b\x7a\xbd\xc7\x7a\xbd\xe7\xf5\x2f\xd4\xeb\xbd\x28\x4d\xf5\x7a\xef\x9b\xf5\xde\xf6\xd6\x7b\x5f\xaf\xf7\x46\x66\x9a\x6a\xb1\x69\xeb\xdf\x7d\x0d\x4c\xf9\xe6\x6a\xcf\x9c\x9a\x17\x7d\x69\xe1\xd1\x22\xf6\xc4\xc0\x63\x59\x6c\xcc\x06\x33\xe9\x31\x63\xb2\x72\x53\xcb\xf9\x50\x37\xcc\x69\xd4\xbc\x7f\xcb\x3c\xca\x74\x96\x8f\x70\x64\x3c\xb8\x5c\x15\xb5\x1c\xb6\x9a\xa9\x94\xbb\x64\x20\xbd\x25\x91\xf1\x86\x3c\x58\x96\xc0\x5e\x88\x13\xf9\xd1\xdc\xa0\xe9\x49\x7a\x2a\x8a\x3e\xc2\x45\xf6\x34\x7a\x3e\xa3\xae\x23\x2c\xa1\x0e\xd2\x3e\x3b\xc7\x87\xd7\xa7\xe7\xe5\x6f\xd3\xc0\x34\x1a\xe5\xc1\xa7\x75\xb1\xd2\x80\x51\x1b\xb0\xa8\x53\xf6\x23\x37\x46\xa3\x93\x9f\x1f\x04\xfa\x37\x29\x7e\x36\xc4\x05\x25\x30\x61\x55\x28\x03\x36\xa9\x04\xd6\xa8\x6c\x36\x17\x48\x75\xf3\x82\x4e\x8b\x2f\x24\xbf\x6b\xcd\x82\x5f\x79\xa9\x8f\xc4\x3e\x48\x75\x41\xd5\xb5\xde\x3d\x6a\x31\x5e\xfb\x95\x06\x63\x20\x7a\xed\xa0\x10\x23\x97\xd3\xbc\xca\x83\x75\x33\x23\xe6\x7e\xb3\x35\xfa\x2b\x01\x09\x34\x76\x43\x50\xc4\x99\x35\x60\x48\xe5\xb2\x35\xc5\x60\x84\xb0\xb2\xaa\x60\x79\x60\x04\x5a\x0c\x8d\xa6\x8d\x03\x0c\x27\xd6\x44\x04\x89\x16\xe4\x96\x3b\xea\x41\x71\x2d\xdf\x5d\x0f\x57\xe3\xea\x6a\x62\xaf\x9a\x0f\x0e\x0c\xd3\x33\x29\x41\x44\x34\x61\xe1\x21\xd2\x0d\x5f\xf5\x0a\x0b\x65\x05\x8b\x2f\xca\xcf\x55\x80\x20\x62\x49\x6c\x7f\x28\x60\xa8\xfc\x15\x13\x34\x38\x82\x18\xb4\x03\x12\x94\xd2\x94\x3f\x6f\x12\xf7\xc2\x2b\x29\x9a\x3e\x04\x08\x7e\x91\x20\x4a\x27\x9c\x51\xb9\xec\x76\x62\xc7\x60\x9d\x7e\x9a\x73\x8a\x3d\x23\x81\x43\x95\xa0\x48\xdc\xd3\x04\x88\xe7\x35\x7b\x0d\x5e\x40\xa0\xbc\x32\x2d\x1e\x6f\x9b\x9f\x7f\xca\x0e\x8c\x62\x51\x22\x44\x23\xdb\xe1\x99\x89\x60\x82\xca\xe5\xf6\xdc\x59\x88\xfc\x6d\xca\x95\x5e\x19\x73\x75\xca\x1d\xd4\xf3\x15\x28\x37\x83\xbf\x11\x44\x89\xc6\xb0\x20\x29\x4c\xaa\x1a\xdb\x99\x57\x84\xe8\x6b\x81\x13\x04\x04\xcb\x01\xb9\xfa\x17\x17\x54\xa1\xd1\x29\x6e\x59\x2d\x53\x4e\x13\x39\x1b\xbd\x2b\xc0\xe3\x82\xe9\xff\xce\x73\x83\xbe\xd5\xb3\xa3\xad\x06\x47\x31\x9d\x72\x16\x22\xd5\x65\xbe\xe3\x81\x34\x4f\x7e\x00\x09\x72\x68\x0e\x63\xb2\xd1\x3b\x46\x51\x00\x00\x9d\x36\x40\x40\x96\x29\x2b\x00\xd9\x3d\x3c\x7f\xcd\x73\xe4\x7c\x0c\x6f\x36\x10\xe9\xb2\x25\xe7\x8f\xcc\xb8\x41\x20\x6c\x49\x3e\x63\xc1\x5b\xa0\x65\x00\xcb\x7b\x3c\xdb\x9c\xaf\x83\xe7\xbd\x51\xb2\xc2\xc8\xb1\x61\xe4\x86\x81\x0d\x4e\xc5\xc9\x0b\xe4\x55\x6e\x36\x38\xf6\x57\xcd\x3c\xfe\xe0\xa7\xd3\x01\x92\x60\x7a\x52\x5c\xc5\x0c\x51\x8e\x16\x3c\xef\x27\x82\x65\x82\x2b\x12\xeb\xe0\x76\x11\xc1\xa5\x95\xce\x41\x1a\xa4\x83\xe2\x8b\x5a\xee\xcb\xaf\x33\x93\xc0\x2a\x29\xf2\xf0\x78\x10\x5d\x7c\x91\x96\xfd\x3b\x85\x6c\xdf\x45\x91\x60\xc5\x5d\x8c\x54\x46\x19\x02\x47\x2a\x42\x48\xb5\x5a\x86\xeb\xe2\xc6\xb0\x1a\x6e\x58\x1d\x17\x48\x5c\x12\x69\x24\xf1\x22\x31\x2b\x83\x98\x95\x41\xe4\xf9\xa4\x74\xf4\x7c\x92\x85\x22\xf1\xd7\x5d\x10\x03\x63\x14\x08\xde\xa8\xf2\x58\x50\xdc\xdd\x17\xf2\xe0\x68\xa3\x69\x36\xea\x4f\x7e\xcd\x73\x6f\x48\x4e\x9e\xf9\xbb\x12\x81\x6c\x64\xb3\x50\xa4\x05\x7a\x30\xf6\xf4\xe1\x8b\x10\xc2\xfe\x2a\x65\xd6\x4e\x3d\xdd\x3e\x3e\x52\x37\x77\xab\x80\x7d\x03\xd2\xb4\xee\xc0\x04\xaf\x78\xd3\x29\xaa\x23\xb3\x2a\xe5\x53\x65\xd4\xd9\xde\x30\xce\x62\x62\x24\x45\x3e\x04\xb7\xd6\x10\xc2\x59\x24\xb5\x86\x48\xb3\x41\xd0\x69\xd6\xc6\x82\xab\x2c\x60\xd0\x01\x88\x44\x64\xb8\x5a\x64\xf8\xa8\x79\xdd\x67\x2d\xb6\xfe\x65\x8f\xc8\xf8\x01\x48\xac\xae\x12\xa3\x78\x72\xf8\x3c\x7d\xaa\x33\x95\x93\x91\x0b\xbd\xad\x8e\x88\x39\x84\x78\x91\xc0\xe5\x50\x95\x90\x73\x11\x71\x55\xe0\x09\xd8\x75\x9b\x65\x7b\xab\x8d\xec\x53\x45\xae\xe4\xdb\x71\xac\x54\xdc\x68\x04\x3f\x02\x3c\x0c\x60\xa2\x86\xa8\x6c\x04\x93\x8b\xe6\x7a\x40\x70\xe9\x2c\xba\x56\xf9\x5f\xad\xea\x68\x30\x76\x14\xb7\x09\x2e\xe9\x00\x5e\x4c\x1d\x31\x34\xeb\xa1\x69\x34\xdb\x78\x78\x3d\xfc\x01\x88\xfb\x6b\xca\xcf\xeb\x38\x8d\xb0\x6a\xb4\xcf\x9e\x72\x53\x7d\x79\x79\x1d\xa3\x41\x0b\x29\xd7\xf9\x94\x8c\x57\xb1\xa4\x00\x6e\x43\xa5\xc1\x85\x29\xda\x3f\xcc\x22\x81\x0f\x33\x49\x78\x81\x0d\x16\x71\xa1\xea\x77\xee\xde\x9f\x60\x91\xd9\xed\xaa\xcc\x2d\x70\x0a\x8b\x32\x82\x5b\xc4\x92\x55\xb2\x71\x6d\x8a\x1b\xb1\x30\x24\x0f\x99\xa2\x74\x27\x54\x2c\xc9\x49\xee\xab\xea\xe1\xf3\xcb\x7d\x6d\xfa\x82\x02\x6b\xeb\x97\x83\x94\xde\xbf\x7b\xe6\xab\x62\x07\xfb\x9d\x7f\x09\xe9\xf8\xaf\xef\x43\x94\xaf\xc1\xc4\x05\xcf\x8a\x99\x8d\xf7\x45\x5e\xd0\xfb\x5b\x49\x54\x28\x07\x3e\x72\xaf\xc8\x2f\xdc\xae\x47\xea\x0f\xd4\x01\x98\x62\xde\x14\x80\xab\x13\x9c\x3c\x76\x47\x4e\x74\xdd\x70\x12\x74\x4e\x11\x53\xff\x10\xf1\x84\x50\xad\xaf\x30\xbb\xc7\x5a\x61\xa6\x9a\xef\x63\x8d\x26\xfb\xbb\x5e\x5b\x6b\x2a\xf1\x97\xf3\xb1\xe4\x41\x97\x13\x4b\xde\x39\xed\x03\xf8\x3e\xa7\xf7\xe6\x98\xd6\x6c\xa9\x68\xcd\x62\xb9\xc1\xc4\x3a\x86\x3c\xb3\x9f\xc3\x3e\xd2\x3b\xd6\xdf\x63\xdc\xb4\xda\x7f\xa5\x71\x41\x31\xf8\x8e\x6b\x7a\x67\xf0\x9d\x29\xde\xb1\x0c\xda\xfe\xa4\x77\xc6\xd4\x65\xf3\x0c\xff\x3c\xa3\x45\xee\xa8\xc1\xfa\xfa\x96\x8f\xc9\x5c\x45\xbe\x0a\x2f\x1e\x63\x77\x99\x8e\x13\x8f\xb1\x82\x5c\x41\xd6\x1d\xe7\x17\x71\x90\xe5\xb0\x00\x9b\x16\xad\xf8\xa6\x0c\x64\xbd\x03\x4f\xf2\x28\x3e\xac\x21\xa8\x9d\x51\xa1\xb1\x5d\xa1\x6a\x6a\x39\x63\xae\xec\x11\x9d\x68\x0c\x12\x7d\xbd\xe0\x2d\xe3\xc5\x05\x9e\x15\x7b\x33\x80\xec\x30\x56\x4c\xe4\xfe\x70\xa8\xf7\x5b\xf5\x88\x67\xe1\x44\x95\x68\xaf\x95\xe4\x40\x8d\x3d\x26\x3c\xc8\xa9\x47\xd6\xb6\x2f\xac\x71\x5a\x2d\x25\x7b\xfb\x86\x34\x63\x46\x56\x52\xd4\x0e\xc2\x09\x22\x8a\x33\x8b\x1c\x83\xc6\x9e\x77\x70\x48\x77\xb7\x2c\x45\x8b\x7c\xf6\x99\x4a\x1a\x11\xcf\xde\xc4\x21\xd7\x1b\xc3\xe3\xec\x19\x7b\x25\x0e\x13\x4b\xf6\xab\x95\x25\xaa\x96\x38\x0e\x3a\xa1\xa6\xe8\x47\x42\xe7\x04\xa7\x84\x83\x3a\x07\xcb\x3b\xbf\x1c\xc0\x8f\x69\x49\xf1\x22\x43\xbc\xf6\xe0\x7c\x45\x10\x93\x76\x27\x2c\xff\x7b\x80\x9a\x73\x75\x17\x4c\xff\x89\xa3\x70\x9c\xae\xf3\xad\x97\xef\x33\x53\xc6\x5f\x93\xa2\xdf\xb6\x51\x1c\x18\x4f\x02\xa7\xfc\x04\x2b\x57\xff\xfd\xfc\xd9\x6b\x8b\x8e\x63\xbc\x22\x0e\x0c\x7c\x21\x14\x3e\xb2\xc6\x10\x38\x0d\xd6\xd6\x6b\x42\xbb\x1c\xf6\x50\xdf\xea\x77\x4f\x6c\xd5\x01\xcd\xe2\xe8\x95\xf0\xac\xf4\xeb\xdd\xea\x7a\x36\x84\xd9\xe7\xcf\xd5\xc3\x6a\xf9\xfa\xf0\xf4\x69\x9c\xab\x68\xa0\xc4\xc7\x77\xf1\x9d\x95\xff\xb0\xd8\xfe\xb3\xf5\xd5\x78\x99\xc9\x60\x50\x17\xa6\x77\xf1\x1d\xba\x5c\x60\xf1\x8e\xb0\x2e\xed\x3b\x4c\xb9\x38\xa1\xc2\x5d\xcb\xe4\x70\x87\xc2\x3d\x31\xc5\xbb\xf8\x8e\x7c\x2e\xb0\xe0\x5d\x49\x2e\xe5\xd6\x9e\x2d\xc9\xb1\xd6\x83\xd1\x68\x36\x1d\xb1\xdb\xde\xf1\x90\xba\xb6\xe7\x27\x98\x2b\x76\x18\x04\x76\x0c\x29\xff\x73\x75\x49\xb8\xfd\xd7\x5e\x94\x67\x2e\xb3\x0e\x8c\xc7\x15\x93\x0c\xa7\x94\x84\x3c\x9c\xb9\x44\xd9\x04\xd6\xe5\x09\xb5\x8e\x7d\xa0\x77\x0c\x6e\x33\x9f\x76\x3b\x89\x3c\xc4\xbe\x99\x60\x61\xb2\xa3\x33\xbd\x1c\x33\xb8\xdb\xbe\xb8\x6d\x1f\x79\x7c\xfd\x76\x04\x4e\xa9\x35\x1e\x35\xb8\x46\x3a\x55\x97\xb4\xfd\xb7\xbd\x58\x9c\x54\x6b\x3a\x66\x70\xcf\x90\x03\xc7\xee\x2b\xaf\x26\x17\xce\xdc\x6a\x4e\xc7\xb6\xe7\x6e\x39\xa7\x65\xe3\x73\xf7\x8c\xd3\xb2\xf5\x99\xdb\xc5\xe9\xd8\xfc\xa8\x8d\xe4\xd5\xd9\xfe\x50\x2b\xc2\x49\x93\x71\x89\x18\x38\xd4\x8a\xf8\x75\xf6\xee\xe9\xc8\xbd\xfb\x34\x92\xe8\x58\x6b\xf3\x15\x45\xc1\xb9\x06\xe8\xa9\x85\xc1\xb9\xa6\xe7\x1d\xe2\xa0\x66\xf8\xc3\x42\xe1\xca\x76\xe6\x4b\x04\xc2\xb9\x86\xe5\xa9\x45\xc2\x51\x66\xe1\xaf\x20\x14\x0e\xb4\x23\x1c\x69\xaf\x88\x25\xba\x0d\xad\xed\xbc\x3e\x01\x51\x84\xca\x83\x5b\xd8\x12\xcf\x3a\x0d\x89\x3f\x84\x85\xe0\x98\x9e\xa4\x23\xad\x04\x8d\xdd\xc9\x8a\xd1\x69\x6b\x71\xf2\x5b\x7b\xd3\x4e\x63\xd3\x51\x86\xc9\xfe\xc7\x99\x39\xcf\xfe\xfa\xbe\x54\x6e\xed\xd7\x3b\xb0\x11\xa7\x7f\x7d\xc7\x76\xaa\x3d\x02\x70\x17\x8f\xcc\xa1\xc3\x54\x77\xf9\xd0\xec\xc3\xe9\xd8\x7e\xfe\xa2\xb1\xd9\xb1\x1b\x1a\x20\x76\x5c\x32\x36\x3b\xb6\x3e\x83\xaf\x5f\x34\x36\x3b\xf6\x38\xfb\xe1\x46\x4e\xff\xfc\x8e\xcd\xcc\xb9\x0c\x75\xa1\xdd\xf8\x64\x16\x3b\xd3\x5a\x7c\x36\xd3\x9d\x69\x97\x3d\x9f\x51\x8e\x83\x8a\x98\x90\x75\x8e\x02\x79\x98\x92\xdc\x0f\x54\x78\x68\x21\x3f\x9f\x01\x0e\x54\x78\xdc\x8a\xed\x14\x16\x3b\x57\xeb\x7d\x86\xce\xbd\xf5\xfd\x18\x2b\xf5\x5b\xbd\xb8\xf6\x2a\x7d\x96\xe9\xfe\x02\x91\x72\x86\xb5\xfc\x02\x81\x72\x86\x15\xfc\xec\x55\xfd\x18\xf0\x8b\x49\x85\xd7\x9b\x00\x15\xd3\x8a\xae\x7d\xd5\x1d\xb0\x55\x5c\x22\xb8\xf6\x55\x77\xc0\x28\x71\x89\xd8\xda\x57\xdd\x14\xd6\x87\x37\xaa\x78\xdb\xf2\xd0\x07\x29\xfd\xf2\x50\x7d\x7c\xf8\xf4\xdb\x5e\xa7\x4b\x4c\x10\xa3\x32\xa5\x07\xa4\x99\x80\x41\x4a\x91\x25\x91\x55\x0e\x90\x16\xc6\x94\x44\x0b\xb7\xeb\x89\xfa\xf5\xbb\x5b\x2a\x94\xc1\x12\xc3\x82\x62\x99\x36\xa6\xf4\xf9\x79\xc0\xf6\x61\x16\xce\x48\xca\x95\xf2\xce\xb2\x77\x27\xff\x71\xa1\x8b\xcf\x9e\x09\x8e\x32\xbf\x71\x77\x42\xe7\xab\x78\xf9\xd0\xa4\x35\x1e\x23\x7e\xfc\xa4\x35\x1e\x21\x82\xe2\xc1\x2c\xf2\x53\xda\x50\x07\xa3\x3a\x59\x95\x47\x48\xa2\x7a\x58\x27\xab\xf2\x08\x69\x54\x8f\xeb\x54\x33\x79\x40\x20\x0d\xc7\x75\xaa\x2a\xd3\xf1\xe3\x3a\x55\x95\x58\x1c\x3b\xb0\x34\xd5\x54\xe2\x11\x82\xa7\x1e\xd9\xe9\xea\x3c\x46\xf6\xf8\x89\xeb\x3c\x42\xfa\xbc\x81\x5a\x71\x7a\x9d\x47\xc8\x9f\x37\x60\x2c\x4e\xaf\xf3\x08\x09\xd4\xf4\x73\x32\xb2\x3d\x46\x19\x0a\x13\xd7\x79\x8c\x46\x64\x26\xa6\xa1\x23\xa4\x50\x83\xee\x30\x59\x9d\x07\xc4\xd0\x0e\x7f\x52\x2c\xc9\x5c\xc9\x9b\x94\x0e\x08\xa7\x29\x8f\xa4\x08\x8f\x3b\x93\xba\x44\x2d\x3a\xf3\x20\xea\x22\xc5\xe8\xcc\x93\xa7\x8b\x54\xa3\x33\x4f\x99\x2e\x52\x8e\xce\x3c\x51\xba\x4c\x3d\x3a\xf3\x0c\xe9\x32\x05\xe9\xcc\x03\xa3\x8b\x54\xa4\x33\x0f\x87\x2e\x53\x92\xce\x3c\x19\xba\x4c\x4d\x3a\xea\x10\x67\x62\x3d\xe9\x90\x5c\x28\x8e\x1f\xde\x09\x6b\x3d\x4a\x1c\x9d\xa5\x2b\x1d\xaa\xf5\x18\x81\x74\x9e\x16\x71\xa8\xd6\x63\x44\xd2\x79\x7a\xc4\xa1\x5a\x8f\x11\x4a\xe7\x69\x12\x87\x6a\x3d\xca\xf2\x7d\x96\x2e\x71\xa8\xd6\x83\xe7\xd8\xad\x75\x78\x02\x0b\xc8\x22\x02\xd9\x8a\x24\x41\xd8\x3e\x5b\xcb\x11\xa6\x1a\x74\x60\xe2\xc8\xef\x9e\xb4\x60\x05\x9c\xd1\xff\x83\xd6\xf8\x03\xa1\x73\xf8\x8e\x4c\x53\x76\xfe\x5d\x18\x36\x87\x3f\x86\xb1\xfe\xa8\xae\x1c\x6b\xb1\xef\xea\xac\x91\xa7\xd8\x18\xd1\x56\x7b\x60\x5d\xa8\xe2\xdd\x2d\x79\x45\xae\x24\xbb\x20\x93\x41\xaf\xe4\x0f\x8c\xdd\x3f\xe4\x8e\x55\x58\x94\x14\xbb\xcf\xc5\xee\x73\xb1\x46\xca\xba\x38\x8c\x08\xc3\x51\x74\x9b\x16\xa6\x58\xfb\x8d\x59\xbb\x3d\xa6\xc6\x50\x9b\x1a\x13\x77\x30\x2c\xc8\x74\xe0\xc4\x62\xe7\xf7\xce\x75\xb9\x6c\x15\xba\x12\xb1\xd3\x51\xc4\x4e\x47\xf9\x8f\xee\x9d\x58\x0f\x8e\x2b\xd1\x75\xdf\x71\xdd\x77\x5c\xf7\x1d\x27\xef\x5c\x1e\x01\x75\xfa\x40\xa1\x05\x6f\x47\x59\x46\x50\x5b\x08\xbe\x42\x8d\xe0\xff\x40\x83\x79\xe6\x91\x76\x37\x74\x84\x72\x3a\xb9\x4a\xf3\x6f\x45\xc3\x44\x0e\xec\x61\xbe\xb1\xca\xed\xe6\x94\x6b\xc4\x4d\x7d\x73\xc1\x75\x66\x9a\xd8\x9f\x02\x60\xf2\x60\xa7\x3a\x6a\x67\x81\xb5\x38\x06\xa2\x59\x2f\xfb\x1b\x13\x42\x88\xbd\x15\xe1\x60\xf8\xcf\x14\xab\xc3\x64\x47\xb5\x53\x1d\x89\xed\xce\x28\xf6\xd6\x12\x6a\x36\xb4\x8e\x3d\xcb\xcf\x68\x2d\xbd\x2c\x42\xe8\x07\x3a\x61\x3b\x32\x06\xe9\x7c\xd3\xd1\x91\x31\x47\x17\x18\x8a\x8e\x0c\x32\xba\xc0\x2c\x74\x64\x40\xd1\x05\x46\xa0\x23\x83\x87\x2e\x31\xf9\x1c\x19\x2e\x74\x89\x81\xe7\xc8\xd8\xa0\x0b\xcc\x39\x47\xc6\x01\x5d\x62\xbc\xd9\x6d\xca\x98\xd6\x56\xb3\xdb\x70\x31\xa9\x69\x66\xb7\x95\x62\x5a\x43\xcc\x6e\x9b\xc4\xb4\x66\x97\xdd\x16\x88\x69\x8f\xa4\x76\xdb\x1b\xa6\x3d\x82\xda\x6d\x5d\x98\xd6\x58\xb4\x7b\x07\x3f\xad\x69\x68\xf7\xb6\x7c\x5a\x43\xd0\xee\xfd\xf2\xb4\x66\x9f\xdd\x07\x36\xfb\xdd\x69\x6e\xfe\xf2\xd7\xbd\x9e\x34\x64\x24\x23\xac\x81\x22\x30\x1f\x6f\x10\x5c\x49\x06\xa2\x59\x42\x70\x10\x9a\xc8\x78\x49\xe0\x1a\xdc\x02\x11\x8c\x59\x6b\x1c\x07\x65\x9f\xa9\x67\x18\x01\xd6\x88\x80\x6e\x09\x11\x1a\x30\xbd\x42\xa0\x67\x4c\xb1\xd1\x0e\xec\x9a\x80\x76\xdd\x5c\x44\x10\x73\x13\xeb\x1d\xcd\xf6\x20\x40\x52\xbe\x24\x0f\xc6\x2d\x0c\xc4\xce\x6b\xfc\x92\x2a\x16\x7e\xad\x05\xa8\xea\xe4\x7b\xe5\xb8\x36\xaf\x22\xe0\x22\x81\x73\x65\xff\x1d\xc9\x94\xe8\x4b\xbf\x71\x60\x4f\xbf\xb5\xe0\x5e\x0c\xaa\x8a\xc0\xea\xf0\x9a\xc0\xbb\xcd\x60\x38\x72\xfb\x4c\xb1\x76\x60\xcf\xb9\x57\xee\xa8\xce\xe4\xa1\x5c\x90\x03\x74\xfb\xc6\x5f\x26\xe7\xee\x96\x32\x4a\xe1\x12\x10\x1a\xf8\x6d\xfe\x95\xc7\xab\x7f\x4d\x03\xca\x94\x6d\x2f\x4a\xb7\x24\x37\x4c\xf7\x75\xc5\xbf\x5e\xa6\xf3\x6d\xd5\x58\x92\xbc\xca\x16\x5c\x38\x8e\xac\x17\x2d\x2b\x4c\xeb\xd7\xd5\x27\x78\x32\x42\x34\x6f\xd0\x77\x93\x37\xa1\x9b\xf3\x41\x93\x06\xde\xe0\x5c\x38\xe2\xbc\x01\x1b\x7d\xba\x4e\x47\x91\xce\x63\x9e\x9f\x0c\xd2\x9b\xc0\x73\x0e\xdd\xbf\xce\x99\xfb\xc9\x3b\xcf\x13\x28\x56\x32\xdd\x5c\x4a\x9e\x6b\xa4\x36\xbb\xde\x4f\x62\xbc\x2a\x31\x9e\x1b\xa4\x7b\xaa\x7c\x65\xa2\x61\xf1\xba\x09\xe0\x0f\x4b\xd7\x23\x91\x36\xbe\x63\x4b\xe4\x69\x0e\x19\xc7\x9e\xa0\x9c\xca\x84\x6e\x13\xc1\x72\xcf\x91\x9b\x8d\x4d\xea\x1f\xb2\x8a\x9c\xa0\x24\x99\x92\x4c\x3d\x31\x92\xd5\xbb\x7f\xee\xd6\xa4\xd3\x9c\x13\x02\xb1\x4e\xf5\x93\x13\xaf\xc2\x89\xd3\x9c\x11\x7c\x6b\x92\x9f\xdc\xf8\x7e\x86\x96\xd4\x4b\xba\xed\x34\x0a\x52\x86\x81\xf8\x36\x0f\xe0\x1a\xc1\xd2\x6c\xf0\x8d\x3a\xbb\xd6\x4f\xc2\xbf\x2a\xe1\x9f\x71\xd0\x30\x95\x05\x7e\x77\x62\xf0\x9f\x5b\xd5\x3f\x1a\xe5\x75\xb6\xaa\x4e\x1d\x2b\x11\xce\x73\x21\xe8\x99\x5d\x6e\xef\x1f\x9f\x9e\x7f\x1f\x5a\x5e\x06\x16\xe4\x2d\x4e\xbd\xdd\xda\x7d\x2e\xcb\xf2\x36\xb4\xee\x5e\x5a\xc5\x01\xcb\x2b\xd9\x69\xaa\x38\x94\x8b\x14\x9d\xa2\x50\xda\x05\x86\x92\x16\x14\x96\xdb\xe3\x2e\x52\x54\xa2\x07\x8f\x3c\xf9\x4e\x26\xdf\x2f\x68\x57\x20\xed\x69\xc7\x2d\x1d\x8e\x57\xa1\xb4\xb3\x6e\x8d\x69\x63\x4b\xbb\x48\xa5\xa1\x8d\x5d\xd3\x22\x75\x4f\xdf\x48\x8d\x72\x47\x9e\x76\x0a\xd3\xad\x98\x42\x89\x69\x43\xa5\xa1\x6e\x8f\x35\xf1\x38\x98\x53\x8e\xc4\x0e\x18\x6a\xcf\xa0\xc1\x09\xb6\x0c\xd3\xcd\xe7\xe5\x29\xe6\x0d\x29\x0c\x8b\x03\x63\x7d\xb5\x74\xf2\x4d\xe6\xd7\x31\x46\x61\x14\xa8\x18\x1e\x8a\x4d\x5c\xdb\xec\x2d\x33\x1b\x78\xcb\x6c\x13\xc7\x5e\xc9\x33\xbb\xe1\xec\x6e\x02\xde\x0e\x75\xd8\xfd\x29\xbf\x2f\x4d\x1d\x6f\x55\x62\x9d\xcb\xf9\xc6\x06\xb0\x83\x01\x2f\xcb\xf6\xfe\x3d\x6b\xd2\xa7\xf9\x7e\x1f\x17\x30\x7f\x16\x9b\x5f\x14\xbd\x7a\xce\xd2\x73\x6e\xea\xc0\xab\xc8\x95\xcb\xf2\xd6\x9f\x2f\x55\x2e\x4b\x35\xcf\x44\x56\xbb\xdb\x0c\xb6\x32\x0e\x1c\xb2\x4c\x21\xcb\x32\x65\xda\xf4\xf2\x3d\xce\x25\x03\x68\x96\x83\x48\x24\x2d\x00\x62\x27\x31\xf2\x59\x21\xb0\x53\x5a\x49\xc3\xa9\xbb\x03\xab\xd0\x2c\xd2\x76\xaa\x35\xed\xee\xf2\xc6\xbe\x41\x9f\x25\xa6\x05\xa5\x3d\x0b\xff\x02\xcd\xdd\x2d\x92\xa2\xa2\x8c\x0b\xa4\xb5\xbd\x7b\x8c\xaa\x28\xd1\x77\xfe\x20\x9b\xff\xb8\xdc\x09\x36\x13\x32\x3a\x28\x82\x98\x75\xf3\xb7\xf3\x9f\x4d\x3e\xf3\x9e\xd5\x88\x04\x91\xcb\x20\x3f\x9a\xdb\x44\x35\x0e\xef\xd8\xb8\xe4\xdc\x9c\x0a\x70\x7b\x74\xac\x0b\x86\x69\x30\x40\x57\xb3\xb8\x40\x9c\x0c\x4a\x0d\xc6\xeb\x48\x5d\xc5\xf9\xde\x9a\x47\x9b\x5a\x64\x8e\x59\x6e\x2c\x03\x18\xa3\x42\x03\x2a\x8a\xda\xaa\xa2\x99\x74\x5a\x23\x38\x64\xce\x8e\x4a\x8a\xfa\x38\x0a\x92\xd5\xee\xba\x13\xd8\xa3\xf0\x1f\xd0\x8c\xd0\xdb\x15\xfe\x79\xf9\xba\x7c\x0b\x53\x8c\x3c\x38\x65\xa1\x88\x37\x44\x10\x82\xfc\xca\x3c\xe3\xc0\xf2\x8f\x00\x49\xf6\xf2\x4b\x8c\x10\x32\x9c\x5a\xeb\x59\xa9\x80\x16\x7c\x7f\x55\x68\xf0\x4e\x11\x14\x49\x23\x44\xab\x1c\x38\xf9\xe5\x03\x6f\x53\x80\x82\x6c\x57\xf8\x43\x18\x81\xec\xaa\x50\xe0\xac\xc6\x8c\x25\x6e\xad\x36\x20\x89\xe4\xcd\x86\x56\x2c\xd1\x35\x18\x52\x0e\x92\x98\x18\xf8\xa7\x81\xe0\xa4\xa2\x1b\x63\xa5\x5d\xa6\x60\xad\x48\x5a\xda\x36\x7f\x22\x1f\x01\x2b\x90\x70\xf6\x8d\x7e\xa1\xcb\xfd\x92\x9f\x32\x40\x61\xd7\x00\xe9\xed\x00\x11\x38\xe2\x8e\x04\x6d\x20\x5a\x1d\xc0\xc9\x2f\x1f\x48\x3a\xd4\x1d\x9e\x1b\x26\x47\xb0\xca\xf2\x6c\x10\xb2\x1a\x1e\x20\x29\xa2\x05\x15\x37\x4e\x06\x2d\xb1\x74\x93\x96\x86\xfa\xe7\x49\x58\x63\x07\x0f\xb1\xa3\xc2\x02\xa2\x5b\x69\x0b\xc9\xa8\x42\xc7\x8c\x5b\x10\x63\xfe\xcd\x82\x91\x23\x37\xc7\xd3\x48\xe0\x94\x61\xa1\xc4\x57\x55\x7b\xff\x85\x7f\x13\x44\x5e\xb9\xa6\xe5\x1d\x74\x40\xe6\x86\xbc\x7c\x8e\x20\x08\xac\x5f\x32\xb9\x36\xd5\x54\x7b\xf7\x28\x0f\x04\xf0\x61\xa5\xe5\x86\x36\x60\x49\x91\x96\xeb\x34\x43\x0b\x36\xa9\x5c\xd6\xf2\xdd\x2a\x2a\x36\x4c\x4d\x4b\xf4\x2c\x4e\x72\x99\x79\xdc\x2a\xb0\x41\xea\xf3\x75\x59\xdb\xa8\x72\x0b\x9d\xdf\x18\x40\xda\x59\xd5\x72\x54\x95\xb6\x1a\x9c\x39\xbf\x2a\xca\x08\x8b\x90\x9c\xa6\x4c\x58\x26\xd6\x95\xf1\xa8\xe9\xfa\x49\x6b\xf2\x6f\xd4\x0e\x1b\x13\x62\xe2\xa7\xea\xab\xaa\xbd\xff\x92\xc7\x13\xac\x20\xe6\xe6\x0f\x9d\x40\x09\x87\x6c\x21\x7f\x34\x4e\xb8\xdc\x9a\x40\x56\x06\x3b\x82\xdb\x4d\x31\x3f\x89\xb3\x4f\x9c\x95\x10\xc0\x72\x80\x43\xa3\xa1\x88\x9a\x2a\x2d\x56\x88\x6b\x88\x19\xbb\xd6\xfb\x13\x25\x5d\x6a\xc4\x21\x6e\x85\x20\xc9\x07\x07\xde\x68\x23\x38\x2a\xda\x28\x9e\x2a\x5e\x28\x2b\x20\xa7\x8a\xab\x99\x72\x44\xc1\x93\x10\x9d\xd2\xd0\x86\x20\x9e\xb9\x9c\x4a\x00\xe4\xe4\x20\x81\x3f\x94\x69\xc3\x9d\xaa\xbd\xfe\xf1\x24\xe2\x65\xee\x65\x3f\x75\x85\x1f\x4a\x1c\x9f\xa0\x2b\x5c\x6a\x1f\x23\x54\x0d\x93\x18\x41\x74\x17\x48\x28\x91\x52\x18\x55\xa1\x81\x2c\x97\x56\x7e\x0f\x66\x19\x64\x6b\xce\x45\x51\x7b\x65\x8a\x40\xc3\x1b\xde\xb4\x3b\xe5\x00\x13\x6f\x46\x3c\x98\x23\xf6\x24\x57\x34\xb4\xf1\xc6\x75\xe3\xce\x92\xb8\x1b\xed\x20\x8d\xd3\xe6\xd4\x1f\x9d\xd6\x48\x37\xa5\x6d\xca\x9d\x68\x9b\x3a\x6e\x3f\x69\xe3\xca\x81\x01\xf2\x2a\x31\xa9\x2a\xbe\x1f\xfc\xc6\x43\xa8\xa0\x70\x50\xf8\x09\x77\x82\x67\x05\x64\x2b\x6e\xe3\x84\x02\x7a\x1e\xf9\xcf\x64\x36\xda\x43\xb8\x89\xcc\xf5\x3c\x2e\x08\x5c\x53\xb0\xaa\xae\x71\x8a\x18\xe9\x6b\x49\x65\x62\x95\x61\x86\x06\x9c\x98\x7e\x5d\x17\xe1\x2d\xb2\x90\x0b\x41\xe5\x32\x4b\x40\xaf\xc5\xf8\x42\x81\xa5\xa3\x53\x52\x34\x1e\x02\x08\x18\x56\x16\x08\x55\xc1\x02\x9c\xeb\x22\xc3\x75\x19\x6d\x80\xcc\x82\x07\x31\xdc\x90\x85\xa8\x88\x78\xe4\x02\x29\xd6\x16\xa2\x22\xb3\xaf\x2a\x26\x85\xe3\xaa\x42\x6c\xaa\x42\x3c\x76\xb1\x39\x6e\x62\x0e\x1e\x2e\x7f\x57\x44\x75\xa9\x55\xf2\x00\x78\x65\xd2\x04\xe1\x5a\x0a\xfe\x1f\x97\x0a\xdf\xc4\xed\xbc\x4a\x2c\xfd\x1b\xfb\x19\x1b\x2b\x56\x66\x47\x1b\x9a\x49\xa0\x3f\x3b\x9b\x19\x8a\x1b\x0f\xce\xbc\x2d\xfd\x77\x6e\x5c\x2e\xc9\x3f\xff\xfd\x6c\x5a\x8e\x4f\x6a\x7f\x74\x5a\x81\xef\x4b\xe2\x5c\x12\xe9\xff\x73\x59\xfb\x6a\xcb\xda\x59\xb9\x0a\x3e\x8f\xf0\x67\x77\xaa\xf4\x07\x35\x7a\x1b\x97\xcc\xde\x92\x82\xa4\x39\x17\x52\x4e\xe1\x1e\x77\xd9\xe9\xb0\x5a\x3f\xf7\xf3\x49\xd8\x34\xca\x0f\x41\x01\x8c\x53\x68\x96\x56\xd9\xa6\x47\x41\xb1\x34\x38\x4e\x69\x45\x02\x63\x46\xfd\x68\xaa\x3b\xb1\x27\xa7\xa9\xfe\x35\x7e\xff\xc9\x87\x4d\x6f\x6b\xfe\xbd\xc3\xa6\x7f\xb9\x7f\x79\xfa\xf2\xbc\xba\xff\xcb\xd3\x53\xb5\xf7\xb4\xa9\x6b\xbe\xe2\x1d\xd3\x12\x2d\x6f\xca\xeb\x01\x25\x12\x57\x4f\x0c\x60\xd3\x3c\x82\x51\x14\xa1\x08\xb3\xee\x33\x44\x50\x24\x65\xc1\x93\x64\xef\x09\x7e\x86\x5e\xa1\xaf\x7d\x30\x8d\x55\xc8\x3c\x9b\xaf\x14\xb2\xd3\x34\xbc\x81\x46\x01\x2e\x36\xb4\x44\x03\x49\x52\x95\xa6\x26\x36\x28\x02\x7a\xd9\x63\xcf\x31\xf2\xde\x18\x13\x37\x2d\xb9\x5e\xb5\xf2\xf2\xf5\x0c\xcb\xdf\x7a\xe5\x39\xcd\x3c\x7a\xec\xea\x13\x15\x8d\x67\x47\x75\x66\x47\x04\xdf\xdd\x6d\x9e\xb4\xee\x24\x07\x48\x4e\xe3\x41\x42\xe0\x97\xae\x38\xa9\x27\xc7\x16\x23\xc8\x56\xde\x8e\x1b\xa3\x20\xf0\x6a\xf4\x26\x5d\x7b\x64\x55\x6c\x19\xb8\xbd\x52\xd4\x6f\xbb\x28\x01\x06\xbc\x32\xf0\xcc\x4a\x99\x07\x34\xb1\x40\xe7\x62\x36\x7c\xa9\x6d\xce\x55\xe9\xfe\x2c\xf3\xe1\xa4\x29\x7d\x4f\x34\x4e\x88\xbb\xa3\x29\x20\xcd\xba\x54\x68\x0c\x24\xc7\xfd\x97\x81\x98\xc2\x95\x25\x7f\x30\xf4\xa8\x3f\x28\x4a\xe0\xe7\x42\x04\x6a\xec\x96\x75\xc6\x4e\xff\xec\xde\x5c\x98\x73\xa9\xee\x1d\xaf\xd5\x4c\x53\xae\xa1\xa9\x42\xb3\x5a\x69\x01\xa3\x1a\x86\xfb\x26\x48\xc4\x85\xed\x35\xf5\x98\x21\xf9\xa1\x12\x27\x5d\x30\x23\x97\xed\xc6\xb7\x73\xd2\x5d\xfb\x90\x25\x87\xc7\x3d\xfe\x53\x75\xd4\x5d\x65\xa1\xf0\x3a\x9c\x31\x31\x3f\xb3\xb8\xf5\x14\xa0\x0f\xeb\x87\xfb\xea\xe3\xcd\xfa\x7e\xf5\xf7\xfd\xfa\x0f\x02\x89\x01\x78\x69\x0d\x84\xa4\x72\x59\x6b\xfb\xe0\x49\x13\xab\x99\x56\xfe\x35\x57\x8b\xc8\x9b\x07\x9c\x4b\x18\x89\xab\x34\x38\x0b\xc6\x2d\x87\x0f\x29\x7e\x68\x36\xfa\x2c\xef\xe1\xa4\xc6\xb9\x65\x75\x3c\x6d\x22\x18\xde\x22\xa1\x01\x93\x0d\x0b\xbc\xff\x00\xcb\xbf\x7a\x2f\xbf\xba\x0a\x8c\x05\xd6\x58\xad\x06\xa4\x15\xc8\x72\x20\xf7\xb5\x83\xc2\xd5\xbf\xca\xa3\x0b\xfe\xe6\x9d\xe8\xcd\x0e\x92\xe1\x0f\xa3\x46\xf9\xcb\xa3\x46\x59\xb5\xac\xd1\xa4\x21\x92\x46\xd2\x0e\xac\xe5\x9f\x72\x79\x91\x00\xed\xd2\xf2\xa6\x4d\xe5\xb2\x39\x06\xc1\xa8\x89\x47\xca\x46\xb1\xef\x4a\x99\xef\x39\xfe\x90\xd9\x73\x43\x99\xd9\xf8\x6b\x86\x17\xca\xbd\x3a\xcf\xc9\xc9\xca\x0a\xde\x3e\xa2\x87\x18\x96\xa8\x1a\xc1\x87\x60\x51\x71\x51\x79\xe5\xe7\xe4\xf3\x78\x86\x30\x6b\x1f\x51\x24\xfb\x30\x63\x2a\x9d\x78\x5b\x91\x60\x2f\x62\xea\xa9\x3e\x3b\x7f\x50\xa2\x7a\xd4\x96\xc5\xa9\x17\x15\x45\x9c\x8a\xc9\x42\x92\x81\xcb\x81\x0b\x4b\xe4\x1a\xa0\x55\xa1\x34\xc9\x73\x2c\x4f\xf8\xd1\x60\x14\x52\xe7\x19\x94\xf3\xa1\x09\x82\xad\x32\xa3\xff\xe4\xf1\x3f\x2c\x8f\xe7\x9e\xda\x0d\xb8\xaf\xd6\xd9\x15\x2a\xf0\x56\x49\xd8\xa7\x78\x4c\x8a\x4a\xce\xcb\xb3\x6c\x73\xed\xd2\x22\xa0\xb2\xdb\x94\x16\x06\x62\xd2\x04\x18\xbf\x53\x9a\x91\x9c\xb1\x3f\x37\xcc\x27\x79\x47\xe7\x1c\xa4\x1b\x02\xfb\x15\x99\xcc\xb3\x3c\xcd\x65\xbe\x61\x45\xd4\x82\xa5\x15\xab\x90\xa2\x47\x26\xb1\xa4\xa4\x61\x16\x1f\x05\x64\x34\x42\x34\x4c\x98\x1e\xeb\x32\x93\x9e\x05\x64\xfa\x34\xe6\x7b\xa5\xcf\x26\x78\xa5\xd7\xa1\x26\x0d\xec\x1f\x66\xc7\xfb\x07\x5d\x8c\x2e\xdf\xa3\x6f\x73\x5d\xef\x4f\x47\xc2\x8c\xa8\xfe\x18\xa2\xf7\x3f\x47\xee\x8f\x73\x45\xee\x72\x60\xee\xd7\x01\x28\xe8\x04\xe6\x0f\x2f\xd9\x7e\xb8\x98\x96\xac\x7c\xff\xaf\x9f\xda\xf7\x1f\x56\xfb\x26\x82\x88\x0a\x0b\x1e\x60\x8c\xb9\x9f\x95\xb6\x10\x51\x8a\x5d\xbb\xee\x39\x7a\x70\x49\x61\xc8\xcf\xa9\xce\x73\x39\xa7\x47\xfb\x5c\x94\xf1\x37\xd5\xf0\xb1\xa2\x7e\x4c\xe7\xc7\x92\xbc\x11\xaa\x7d\xb5\x4a\xf1\x73\xfb\x7e\x90\x62\x29\x2b\x92\x08\xce\xf5\x77\xea\x9a\x14\x49\xcb\x13\x4f\x97\x33\xac\x71\x9a\x25\xe6\x1d\x4f\x73\x84\xa1\x29\xcf\x48\x67\x83\x5f\xf0\x06\xdf\xd7\xb3\xec\x8c\x6e\x5e\xeb\xee\xef\x75\xfe\xb2\xab\x76\x3d\x91\x3d\x44\x69\x4e\xc5\xf1\x06\xf8\x03\x76\x80\xff\xf6\xf8\xf9\xe9\xf9\x75\x7f\x64\x5d\x54\xb6\x44\x0b\x31\xcc\xf3\x69\xbb\x5f\xa0\x5b\x13\xcb\x67\x8f\xeb\x00\x1e\x17\xbe\xa4\xb8\x30\x45\x19\x07\x91\x8b\x14\x07\x71\x8a\xbe\x1b\xf3\x18\x95\xbd\xbb\xe5\x81\xa0\x12\x8b\x8d\x06\x23\x76\x8f\xa0\x7c\x89\xfb\x72\x34\x9c\x6c\xe5\x42\x48\x96\x17\x62\x8a\xbb\xf9\x28\x29\xa2\x4a\x3b\xf0\x51\x8a\xdd\x4c\xe9\x80\x14\x61\x69\x3a\x9f\x28\x14\x95\xe2\x9a\x30\x55\xbc\xda\xb7\x6a\xe8\x04\x9b\xd8\x7c\x10\x7e\xd4\xfc\x9f\xbb\x9b\x3e\xca\x12\x8f\x99\x91\x1b\x9a\x5c\xb3\xe2\xd6\x26\xc5\x1c\xd1\xef\xdd\x63\x21\xe7\x91\x5b\x9a\xdb\xf8\x12\xaf\x17\xf1\xf2\xcd\x95\xce\xd3\xa2\x62\x8e\x3d\x1c\xff\x76\x74\x7b\x59\xd0\x47\x93\xf7\xe1\x38\xb2\x35\xe0\x46\x9a\x68\xf3\x85\x2b\xc5\x1e\x0c\xa8\xb9\x24\x1a\x67\x36\x56\x75\xfa\xe1\x8b\x89\xfb\xac\x90\x82\x29\xed\x01\xf6\x54\x7b\x80\x22\x1c\x50\x4b\x5c\xd0\x48\x95\x39\x67\x43\x3d\x5e\xee\x08\x85\x14\x2b\xd6\x55\x9c\x14\x2d\x19\x63\x4f\xdb\x6a\x69\x5d\xf5\x68\x1d\x75\xe7\x21\xa6\x69\x45\xa6\x8c\x9b\x61\x9c\xff\x39\xab\xa5\x4f\x3b\x97\xcb\x33\x4e\xe1\x4f\x19\xd1\xe9\x00\xba\x0e\x1a\x2d\xdc\x77\x33\x13\x19\x39\xec\xa4\xd1\xff\x79\xae\x7c\x19\x85\x5d\xe2\xda\xd1\xfa\x6e\xbe\x2d\x2d\xbf\x19\x45\xe5\x25\x65\x00\xf1\xe5\x94\x3f\x99\xcc\xbe\x6b\xbf\x92\xde\x46\xe3\x9f\xfe\xfd\xe0\x46\xc3\x0f\x16\x3c\xcb\xfb\xb9\xb8\xa6\x85\x1f\x64\x08\xe2\x99\x0b\x73\x2b\x33\x18\x16\xa6\x18\x8e\xb5\xed\x8f\x75\xe9\xb7\xcb\x21\xd6\x83\x49\x1b\x5f\x4e\xb5\xc9\xa0\x08\x46\xcc\x17\xc6\xed\x54\x6f\x4c\x01\xe8\x59\xbf\xc1\x8e\xfa\x23\xe4\xcf\x77\x92\x90\x9e\x6c\x71\x77\xab\x50\xc6\xaa\xbd\x4a\xc6\xa9\xdb\x8c\x6f\xd8\xd4\xcb\x37\x1a\x7d\xfa\xe0\x1f\x5b\xf5\xfe\xba\x14\x31\x41\xbc\xfd\xb7\x96\xe6\x57\xc9\xb0\xfe\x4d\xc9\xe9\x42\xfd\x5f\x22\x96\x8d\x5d\x06\x70\x46\x49\x51\xdb\x6b\x34\x42\x74\x1b\x03\x31\x8d\x33\xda\x4e\xa4\xdb\x0f\x25\xdd\x01\xd5\xfe\xda\x84\xfd\xc3\x69\xfe\x18\x14\x51\x77\x8d\xd6\xb8\x8e\x07\x97\x08\xff\xf6\xb8\x2d\xc8\x94\x18\x67\x9d\xaf\x72\x2d\x92\x53\x0b\xa9\xf4\xf5\x4a\xdc\x8e\xe8\x14\xdb\x8c\xf4\x06\xeb\x60\xcd\x3a\xe4\x37\xb4\x76\xc7\x70\x8b\xdb\xc1\x2d\x67\x6c\x04\xbe\x66\xcb\x2e\x8e\xde\xdc\x49\x0c\xfd\x20\xc4\xc3\xdb\x8b\xaf\x4f\x27\x3f\x37\x06\xdf\x96\xe2\x2e\x8a\xde\xdb\x4d\x6f\xbc\x90\xec\x0a\xee\x0a\xf1\x5b\x91\xd8\x8f\xb3\x29\xf8\xeb\xe7\xea\x69\xf9\xf1\xa6\x7a\xfa\x72\xc0\x15\xb1\x00\x83\x0a\x4d\xeb\xc9\x43\x52\x1a\x5a\x62\x01\xbc\x92\x4b\x59\x93\x4d\x01\xd6\xc9\xc1\x62\x21\xc9\x49\x8a\xe6\x34\xbc\xd0\x09\xbc\xf2\x80\x33\x09\xf1\x94\x22\x8f\x3a\x42\x3e\x1c\x52\x09\x3c\xe5\xa2\xbe\x21\x47\x5a\x14\x05\x1f\xda\x97\xf2\xe7\x2c\xd4\xd9\x5a\x9a\x6d\x1b\xe6\x43\x3e\x5b\xe5\x4c\xd3\x40\x46\x83\x37\x4b\x09\x46\x89\xdb\x50\x96\xa8\x1d\x58\x15\xb9\xa1\xb1\x69\x2d\xf2\x03\x4e\x45\x15\xf2\x41\x56\x9b\xff\xa3\x50\x10\x2b\x0d\x45\x84\x40\xe0\x1d\x98\x99\x57\x2d\x5d\x79\x30\x51\x91\x2f\x09\x85\x1b\x4c\x5c\x46\xd5\x72\x36\x24\xa3\x4f\x4a\xe6\xfe\x96\x73\x89\x44\xca\x46\xd7\xf5\x00\x36\x8a\x0a\x40\x5b\x69\xc7\xff\x57\x6e\x70\xf6\x58\x1b\x75\x83\xc2\xb4\x90\x43\xc1\x0e\x8b\x92\x2a\x16\x98\x2a\x02\x17\x14\x17\xdd\xcf\x6e\x2b\x9b\x6a\xb7\xf3\x7d\x35\xff\xf2\x1d\x90\xc9\x84\x6a\xe2\x2c\x40\x40\x25\xc5\x59\x44\x18\x31\x17\x35\x45\x29\x20\x27\x0e\x9a\x91\x19\x2a\x9b\x46\x6a\x9e\x31\x50\x04\xcd\x44\x7a\x45\x76\x62\xb1\xd9\xe6\x72\x6f\xfb\x78\xc5\x04\xf6\x90\xea\xd8\xcd\x02\x08\x0f\xb2\xd6\xac\xc3\x5a\xcd\x6b\x3f\x8f\x88\x4e\x5b\xdd\xbf\x37\x2e\xbc\x10\x8c\xb2\x90\x20\x46\x03\x96\xf7\x8e\xc8\x7b\x47\x6c\xf7\x8e\xe0\x8d\x06\x94\x5c\x76\x05\x0f\x37\xa0\xcb\xdc\x78\x96\x30\xb7\x92\x9e\xc9\x1e\x82\x2c\xb8\x6c\x1f\x3a\x99\x3c\x09\x29\x17\x75\xa7\xc0\x47\xb0\xa4\x86\x59\xa2\x24\xb5\x5c\xb2\x8d\x4f\x4c\xd1\xbc\xc1\x52\x06\xa3\xe4\xd1\xfa\x7e\xa4\xcc\x0f\xb0\x31\xee\x27\x49\x7e\xfa\xb7\x4f\xdf\x40\x93\xf2\x4e\xa5\x46\x17\x92\x27\x63\x52\x14\x97\x46\x35\x24\x52\x68\xfa\x8e\x54\x26\x07\x45\xea\x36\x4e\xd1\x9a\x25\xe3\xb5\x35\x28\x0f\x45\x37\xcc\x0a\x02\x02\x25\x39\x54\x88\x90\xec\x02\xfd\xf6\x48\x41\x46\x4c\x15\x0b\xb9\x53\x69\x96\x6f\x7a\x20\xe4\xd0\x28\x0a\x10\x62\xe5\x94\x53\x4e\xbb\xfe\x97\x35\x42\x98\xca\xa7\xeb\x3b\x6b\xfe\x04\x48\x3a\x09\x62\x50\x16\x7c\x5a\x4e\xae\x05\x4d\xc8\x0a\xb3\x21\x2b\x6c\xdb\xfd\x4d\xd5\xa2\x3d\xec\xf3\x53\x4b\x9a\x4a\x4b\xfa\x7e\x38\xed\xc2\x9c\xaa\x5d\x3e\xfb\x2a\xda\xc1\x37\xe6\xbe\x0b\x15\xb1\x2b\x29\x95\x6f\x2f\x77\x8d\x8e\xe9\xcf\xa1\x84\xef\x53\x13\xfa\x4b\xf5\xe5\xb7\x87\x4f\xfb\xfd\x59\x93\xf8\x65\xfb\x92\xfe\x7f\xf6\xde\xac\x47\xae\x24\x57\x13\xfc\x2b\x81\x7c\x9a\x06\xcc\x88\x43\xda\xfe\x50\x0f\xde\x2a\x74\xfb\x00\x1e\xb7\x7b\x3a\xef\xf5\x01\x02\xfd\xe2\x37\x52\x55\x2e\xdc\x13\x52\x96\xa4\xf2\x3b\xd5\xbf\x7e\xc0\xcf\xce\xf1\xb3\xf8\xa2\xf0\x45\x4a\x65\x96\x50\x95\x26\x8f\xb3\x99\x19\x8d\xa4\x91\x34\x2e\x65\x9d\x29\xbb\xd9\xc9\x81\xf0\x22\x28\x6f\x09\xc4\x7b\x51\x33\xc2\x03\x58\x69\x68\x2f\x63\x9a\x48\xd9\x2d\xfd\xf8\x65\x83\x7a\x33\x9e\x32\x2f\x9c\x2e\x9f\xdb\xaf\xa1\xc9\x48\x68\x5c\xcc\xb0\x14\x89\x44\x8c\xc8\xe8\x4a\x30\xe2\x96\xb2\x9b\x0e\xa9\x9a\x08\xd3\xdc\x44\x18\xb7\xbc\x19\x46\x13\x6c\xa0\x80\x61\x23\x23\x55\x7f\xb9\x9f\xe8\xd3\x8b\xa8\x42\x95\x16\x43\x5f\xae\x31\xe2\x97\x92\x76\x09\xb3\x58\x4b\x58\x86\x2f\x7f\x10\xce\xe6\x1c\x96\x1e\x70\xdb\x96\x75\x1a\xe1\x96\x22\xaa\xc8\xa8\x0f\x8e\x2a\x6a\x7a\x33\x87\x05\xf2\x64\x71\x85\xfd\x36\xaf\x39\x6f\xe5\x18\xc8\x1c\x14\xc4\x09\xcc\x9c\x00\x68\x97\xf8\xdc\x7e\xe1\x08\xa6\x47\x84\x9d\xa5\xb8\x94\x74\xcd\x60\xcc\x77\x08\x55\x8a\x71\x25\x8a\xa2\xa1\x68\x77\x62\xd0\xfc\x31\x90\xf9\x47\x2c\xee\x85\x47\x2b\x7b\x66\xa7\xdb\xcb\x61\x9d\x31\xb1\x14\xc2\x1f\x05\xf1\x3d\x35\x70\xfb\xf2\x06\x4d\x9d\x21\x05\xfe\x63\xf2\xf5\x3f\x4c\x74\xef\x3f\xdf\x96\x7c\x17\x07\x82\xe9\xee\x75\xfe\xbc\xfb\x9f\x63\x37\xf8\x11\x1e\xfc\xea\x5d\x60\xe4\x79\x6a\x23\xf9\x60\x15\x3f\xfe\x59\x48\xed\xf7\x14\x29\xfc\xdf\xda\x0f\xbf\xfe\x7a\x50\x13\x7d\x58\xdb\x44\x2e\x1a\xbf\x1c\x07\x0b\x78\x73\xc4\xd1\x60\x7a\xc1\xca\x3a\x53\xca\x28\xf0\xee\x9a\x25\xf3\x5a\x64\x29\xe1\xe9\x25\x98\x46\x25\x61\x91\xb9\x47\x15\x4f\x57\x7b\x97\x97\x71\x1d\xb7\x7e\x17\xbf\xe4\x93\xc6\xb2\x46\xd1\xfe\xc0\x2b\x44\xd8\x1e\xe6\x3d\x38\x2b\xc0\x3f\x7c\x31\xec\x7d\xdb\x15\xba\xbf\xdf\xa0\x99\x62\x6e\x2d\x79\x67\xc9\x75\xe3\x3f\xed\xa3\x77\x39\xe4\xcf\x87\xb6\xcf\x97\xe4\x0f\xb3\xcd\x77\xf9\x88\x6e\x5d\xac\x6d\x22\x17\x36\x8e\x82\x0a\x83\x61\x2f\xe5\xa5\xd4\xe1\xda\xb6\x90\x94\xde\x33\xf8\x8a\xc5\x41\xac\xc7\x2b\xd7\xe0\x87\xd6\x71\x74\x56\xb7\xf2\xa4\x08\xe0\x37\x6b\x61\x0a\x0b\x26\x1d\xfa\x60\xb2\xa3\x60\xa4\xd9\xb2\x9b\xdd\x90\x88\x20\xed\xa7\x47\xf1\x86\xfd\x92\x07\xf4\x52\x25\x47\xf1\x42\x76\xca\x87\xf6\x63\x62\x83\x27\xef\x91\x28\x75\x48\xbf\x31\x76\x01\xb3\xb5\x50\xd0\xbc\xc3\x93\x43\x0b\x14\xfc\xa1\x7e\x46\x29\xda\xfc\x15\x98\xcc\x2d\x30\xfe\x1d\xee\xa9\x0f\x67\x22\xd0\x66\x75\x2a\x90\x22\xfd\xd4\x32\x6d\x23\x85\xac\x2f\x25\xe3\xaa\xd5\xf8\x98\x5f\xe9\xd5\x6c\xe7\xfe\xab\xf2\x07\x17\x86\xf9\xc2\xf4\xa6\x6f\x3e\xbc\xfc\xfa\xf7\x63\x95\x84\x3f\xb4\xff\xf8\xeb\x87\xf7\x0f\xbf\x7e\x78\xf7\xfe\xf3\xa7\x3f\xfd\x54\x28\x3e\x88\x50\xce\x0f\xfa\x8b\x1b\xfd\xd3\x93\xef\x7e\x05\x2a\xf9\xa1\x3c\xd4\xff\x86\xc7\xf0\xeb\x3e\xd6\xc9\x68\xd2\xd2\x35\x6b\x71\x5b\x59\xc7\x19\x2e\x34\xc6\x35\x14\x4c\x58\x86\x83\x1b\x5e\xf5\xbc\xb5\xb8\x8b\xa2\x9b\xce\x66\x26\x30\x12\x76\x8e\xfc\x42\x28\xa2\xc6\x55\x37\x00\x8a\xc6\xf1\xd2\x21\x86\x62\x7a\x4b\x08\x09\xb9\xd7\x2a\x4d\x3a\x31\x8e\xfc\x86\x22\xf5\x3c\x51\x7f\x2e\x51\x71\x67\x72\xd1\xea\x0b\x91\x82\xdb\x16\x2a\x61\xc3\x14\xbd\x41\xd3\xa9\x1c\x3a\xc9\x6d\x22\x76\xc7\x6e\x59\x5e\xba\x4b\xac\xc2\x67\xcb\x1b\xfd\xce\xe7\x7b\xbb\x4c\x52\x74\x76\x8a\xc8\x6b\xc5\xf5\x6d\x51\x7a\x75\xda\xbf\xeb\x07\x31\xf0\x3b\x2e\x14\xa2\x29\xcb\xbc\xc6\x1b\x5f\xed\x70\x5a\xa9\x41\x1a\x4a\xdc\xcb\x75\x57\x60\xfe\xd5\x47\xcf\x1f\xdf\x3e\x7f\x7e\xe8\x76\xa8\x7f\xfc\xe9\x27\xe5\xd4\x3f\x3d\xfc\xe7\xbb\x5f\x3e\x6f\xff\xf4\x93\xfc\xf4\xb0\x7d\xfb\xee\xaf\xdb\xcf\x7f\xfa\x29\x51\xbc\xe9\xa4\xf8\x7b\xe6\xc2\xaf\x99\xc9\xe5\x75\x7d\x7e\xf7\xa4\x76\x63\x0c\xda\x89\x12\x33\x4d\xb2\x7c\x16\xc1\xd7\x09\xfa\x68\x5a\xcc\x5f\x3d\x5e\x50\xe6\x6e\x87\xd4\x10\x1d\xeb\x96\x74\xef\xbc\x93\xaf\xa9\x6a\x23\xb0\x29\xed\x99\xcd\xb2\x50\x04\x8b\x5a\x8a\xa7\x26\x1f\x26\xe8\xa8\x8f\xff\x81\x6a\x52\x3a\xca\x2a\xed\x3d\x5b\x72\x81\x8a\x85\xb7\x04\xdc\x26\x22\xeb\x8f\x25\x3b\x4a\xfe\xd9\xc2\xfc\x6b\x99\x44\x51\x1f\x77\x2d\xee\xee\x98\x52\x58\x40\x42\x95\x5e\xc1\xe8\xc8\xad\x51\x72\xf3\x87\xf7\x02\x1c\x48\xc2\x5a\xee\x61\xb2\x4e\x86\x9b\xa5\x94\xb5\xf8\xad\x5b\x27\xb8\xaa\xa8\xfe\xce\xe3\x0c\x6c\x8a\xbf\x3d\xee\x4f\x6e\x21\xc5\x57\x5a\x8b\x5f\xde\xa3\xe6\xc4\xf7\x07\xca\x2b\x05\xf5\x7e\x6f\x92\x72\xb8\x37\xb9\x61\x6f\xca\x07\x7b\xd3\x5d\x62\xd1\xb0\xa2\x0c\x07\xa5\x02\x87\x1b\x26\x29\x57\x2e\xe0\xad\x55\xf8\x7e\xf3\x3d\xf2\xf5\xd5\xfb\x5e\x6b\x46\xf9\x0e\x91\xf4\x96\xe8\xb9\x4a\xff\x8e\x62\x3c\x51\x09\xed\x4a\xbc\xb9\xa5\xcc\x5b\x5f\xb9\x78\x93\x14\x71\x52\x7f\xec\xc1\xd6\x19\x12\x70\xaa\xfb\x95\x67\xbb\x97\xb1\xe3\x52\xcf\xf0\x77\x9f\x7e\x6d\x37\xa7\x4f\x10\x1c\xca\x0c\xaa\xe0\x34\x13\x38\xc4\x78\x0a\x3b\xe1\xb9\xee\x49\x8a\x25\x5b\x29\xf3\xeb\xde\x48\xa0\xb0\xf6\x87\xda\x2a\x7a\x78\x52\x60\x4b\x58\xfa\x75\x58\xde\x5c\xb0\x6a\xa6\xad\x27\x4a\x0f\x99\x52\x7c\x90\x4c\xec\xba\x9f\x85\x8a\x7f\x48\xc4\xf1\x21\x12\x0f\x3f\xc4\x3d\xe8\xe3\xdd\x3f\xfa\xe8\x9d\x9c\xa5\xa3\x71\xa2\xb2\x88\xa0\x9a\x2c\x82\x0c\x86\x24\x31\x01\x75\x2b\xd7\x18\xdf\x52\xf9\xa4\x5f\x4b\xa1\xb0\xf0\xa4\x60\x96\x81\x41\x71\xd2\xcf\xb0\xa3\xec\x36\xd3\x9b\x54\xdc\xf8\x23\x8a\xb7\xdd\x47\x66\xdd\xa1\x92\xa5\xd7\xcf\x28\x08\x66\x39\x77\x24\x52\x13\x37\x54\x84\xca\xfe\x14\xd8\xf2\x38\x86\x26\x5e\x56\x4f\xec\x9c\x36\xfd\xcf\x00\x93\x3b\xc4\xf5\x8d\xca\x09\xca\xba\x23\x11\x61\xca\x69\x25\xee\x9e\xa4\x79\xb4\xea\xec\xcd\x4a\xfa\x11\x5a\x1c\x11\xd7\x03\x97\x3d\x71\x36\x14\xe5\x1c\x45\xfe\xf0\x19\xbf\x48\x3e\xf8\xa7\x20\xae\xdb\x74\xec\x48\xaa\x08\x2e\x13\xa5\xb5\xa2\xe0\x52\xdc\xa1\x7f\x98\x77\x2a\x34\x2d\x23\x5d\xe3\x03\x7d\x89\x90\xb1\x27\x6d\x55\xde\xe7\x27\x3d\x86\x42\xb0\x72\x47\x5a\xef\xb3\x12\x4c\x3a\xe9\x87\xf2\x7b\xf6\xf6\xbe\x9a\x0a\xbe\x29\x02\x5f\x73\x8e\xf8\xed\x24\x31\x64\xb4\xce\x6e\x19\xd6\x69\xe9\x5e\x9b\x37\xf3\x4e\xd2\xcf\xb7\x5f\x86\x3b\xd4\x25\x1c\xea\xfd\xee\x22\xf9\x0a\x38\x58\xa4\xbf\xc5\x16\xfd\x23\x71\xcc\xef\x11\xe7\x6e\xaa\x4e\x8a\x2a\xb7\xde\xed\x32\x79\xae\xc8\xd6\x6d\x1a\x52\x0c\x9a\x61\xd3\xf0\x5f\x61\xd3\x18\xef\x90\xa6\x1f\xcc\xef\x3e\xd9\xcc\xbf\xbe\xfd\xf8\xf2\xee\xfd\xe6\x4c\x61\x6f\x31\x61\xe9\xc7\x79\x77\x4d\x5a\x4b\x99\x1f\xde\xcb\xec\xf0\x3e\x8d\xde\xd0\x4f\x3c\x3d\x7a\x93\x54\x96\x2f\x24\x4b\xaf\x7f\x49\x59\x73\x43\x19\xf2\xfd\xad\xfe\x6f\xbd\xcd\x8f\x13\x6c\x7e\x2a\x36\x77\x16\xbf\x38\x58\xfc\xe4\x12\xa5\xf6\x88\x8f\xdd\x5c\xa8\x7f\xe0\x40\x31\x3f\xb0\xa3\x54\x1e\x38\x53\x7e\x48\x0f\xc2\x54\x58\xff\xf5\xc4\xfc\xc0\x91\x3a\x61\xbf\xfe\x4a\x94\xcb\x43\xd2\x37\xbc\x3e\x8c\xf7\x2f\xd1\x2a\xef\x3b\xf1\xd7\x6a\x69\xaf\x01\xc5\xeb\xe7\x7b\x06\x5e\xb7\x69\x61\xe7\xbc\x22\xa7\xda\x64\x59\xfa\x8a\x7a\x9c\x95\xa5\xa3\x14\x86\x1b\x32\x21\xf4\xe5\x73\xc9\x5b\x8a\xfa\xec\xec\xa0\xf5\x72\x62\xb8\x5a\xc9\x74\xaf\x9a\xde\x6f\xb1\x8d\xdd\x4d\x99\xbb\x37\x4e\xbf\x46\x39\xfa\xcd\x31\xfa\x35\xca\xd3\x39\x7c\xde\x6b\x4f\x7b\x54\xd6\x2d\x1f\xa9\x3b\xd9\xa0\xe9\xf6\x65\xa8\x71\x7e\xb4\x57\x4e\x4e\x47\x2d\x0e\x56\xcd\xf1\xe3\xd6\x2b\xd0\xfc\xeb\xe9\x57\x87\xc0\x38\xb7\x5f\xde\x49\xc3\x3a\xbf\x02\xf7\xd9\x15\x23\x81\x31\x65\x5e\xb3\x23\x4e\x2d\x23\x00\xb9\xec\x84\x9a\xdc\xda\xee\xaf\xb5\x30\xa5\xdc\x46\x0a\x6c\xdd\xd3\xa3\x38\x82\x70\xe2\x97\x9c\xd6\xe2\xb6\x91\xb0\xa1\x16\x92\x75\xbf\xc5\xbe\x5a\xf5\x7a\x1d\xd7\x3c\x5f\x67\xfc\xde\x8c\xf2\x91\x01\x95\x42\xd9\x1d\x07\x81\xad\xff\x4c\x41\xf6\xf4\x12\x29\x9a\x40\x21\x8d\xc0\x72\xbd\xea\xf3\x5d\xf3\xdb\x2b\xe3\x61\xbe\x1c\x38\x30\x77\xe8\xb7\x91\x52\xb6\x9e\xdc\xb7\x67\x22\x93\xd3\xb0\xbd\x93\xee\xd7\x46\x8d\x2f\x6b\x28\xb7\xb0\xa2\xab\x7c\x76\x1f\xce\x78\x6e\xfe\xf2\xf6\xa4\xe0\xae\xbb\x12\x1b\x16\x0a\x65\x92\x43\xd4\x15\x4b\x12\x57\x01\x39\x25\x74\x79\x27\x89\xa8\x99\x62\x50\x50\x3a\xe3\xc9\x87\x49\x2a\x51\x86\x51\x30\xac\x32\x50\x3e\xe1\xc8\xd5\x21\x05\x8c\x9f\x64\xd8\xd8\x77\x7b\xbf\xa0\x16\x12\xae\x63\x6d\x75\x7d\x9d\xd5\xb1\x2d\x46\xe9\xcf\x84\x82\x0e\xa3\x0d\x04\x1f\xa8\xe8\xec\xfe\xd7\x24\x8b\x9a\x0e\xbc\x9f\xa0\x1d\x4d\xb0\x87\x4d\xbc\x2c\xd1\xe2\x99\x31\xb3\xaa\xce\xca\x1e\xdd\x86\x0a\x95\x7d\x0f\x4d\xa1\x18\x57\xca\x54\x51\xca\x5c\xca\xe8\xb6\x41\x4d\x36\x6a\x4a\x4b\x22\xa6\x99\xdc\xc9\xc9\x52\xcc\xad\x43\x0d\x40\x47\x99\x17\xa3\xbb\x43\x67\x17\x1d\x52\x9d\x1b\xfe\xf7\x8a\x3c\x37\x28\x2d\xfb\xb9\x65\x0a\xd1\x30\x53\x14\x73\xed\x42\xac\x54\x26\x74\x86\x3d\xf9\x8d\xa3\x50\x0c\x9a\xde\xce\xc2\xd1\x0a\xa5\x5b\x13\x13\xbd\x96\x22\x44\xd7\x05\x12\x60\xf4\xad\x23\x41\xb1\x71\xbe\x37\x05\xfc\xd0\x53\x7e\x8f\xc4\x72\xa5\x36\xf4\x1d\x71\xde\x9b\x95\xa5\xef\x8b\x13\xff\x5e\xd4\x9d\x89\x9c\xb1\xf8\xf5\xd7\xf6\xdd\xf3\xe6\xf3\xbb\x0f\x07\x49\x84\x7a\x65\x3d\x40\x57\x4f\xc7\xbc\xc0\x2f\xb0\xbb\x9d\xb3\xed\x95\xbb\xf4\x70\x6c\xd3\xde\x1b\x1c\xdc\x5d\xba\x38\xbb\xb1\x3a\x31\x7e\x26\x15\x1f\x8b\x85\x9a\x4b\xc5\x71\xaa\x38\x42\xdf\x8b\x4b\x27\x3b\xdf\x9b\x53\x5d\xb3\x66\xae\xe6\x54\x77\xaa\xac\xdd\x51\x5c\xf8\x16\xa3\x7d\x69\x4c\xd4\x81\xae\xe3\x11\x3f\xa7\x0b\x74\xd3\x2b\xb0\xed\xe4\xc1\xdd\x5d\x30\xed\xc4\xd7\xcf\x9a\x6a\x2f\xc0\xb2\x13\x9f\xf7\x67\x68\xf5\xbf\x6e\x3e\x7f\x7e\xfb\xf1\xb4\x6f\x9b\x4a\x3f\x05\x27\x3c\x69\xb2\x59\xa9\x34\xd3\x0a\x05\xe3\xc9\x79\x1b\xab\x52\x17\x48\x90\x78\x6e\xbc\xb1\x19\xa6\x54\xac\xea\xfd\xd6\x29\x33\x4f\xd4\x64\x83\xfc\x6a\x4c\xcd\x65\x15\xa4\xce\xc9\x0a\x48\xc9\xe1\x97\xe2\xd6\x8e\x82\x0a\x02\x01\x15\x91\xf7\x9b\x3c\x93\x57\xdc\x63\x7f\xec\x2e\xb2\x2d\x84\xbc\xae\xb5\x06\xf4\x7e\xd6\xfb\xb9\xbf\x5f\x4c\xa0\x9c\xd7\x4e\x88\xe5\xe0\x26\x5e\x31\xce\x2f\x31\x86\x83\xdb\x92\x0c\xde\x5b\x87\x63\x5f\xee\xc6\x5d\xc3\xa5\x65\xc9\xbc\x8e\x5b\xbf\xf6\x5b\xc4\x6d\xdf\x4d\xb9\xf8\x4d\xd6\xf0\x0e\xa2\xf7\xef\x43\x02\xbc\xdc\x7a\x22\xa1\x8b\xe3\x9f\xad\x38\x49\x6e\x99\xa2\xb7\x82\x5c\xdf\x14\x92\x41\xf3\xdd\xe0\xf0\x1d\xf2\x92\x7e\x65\x59\x85\x2f\x35\xcd\xfe\x56\xc4\x71\xa3\x98\xaa\x28\xa4\xab\x3f\xc7\x21\x18\xdd\x16\x89\x7c\x32\xa9\xcf\xf2\xc9\x48\x36\x56\x47\xf4\xfd\xa1\x94\x50\x4e\xf3\x42\x8e\xdd\xe4\xee\x2c\x14\x0f\xc0\x13\xe3\xd7\x42\x51\x16\xfb\x38\xb7\x19\x2c\x86\x00\xb8\xc6\x52\xc8\x14\x05\x50\x58\xa8\x90\x0f\x49\x7f\x04\x82\x26\xed\x24\x8f\x15\xad\x06\xd3\x8e\x63\x14\xb1\x54\xfc\xce\xea\x63\xb3\x0f\x48\x04\xf7\x47\xd6\x70\x09\xe4\xfd\x86\x49\x94\x39\x75\xef\x09\xb1\xb2\xa6\x26\xad\x58\x28\x82\x6f\x84\xd8\xc6\x9a\xde\xad\xd8\xf1\xe3\xa8\x7b\x4f\x4d\xb6\x4c\xd2\x7a\xca\xce\x64\x72\x69\xc5\x91\x8a\xe1\x4c\xaf\x2f\x74\xff\x5d\x73\xe4\x2b\xc3\xd9\xcf\x62\xc3\x38\x95\xc1\xe4\x6c\x57\x1a\xe8\xab\xa1\x15\x4a\xd1\x78\x4a\x65\x00\x67\xeb\xc8\x45\x13\x29\xb9\x3b\x2d\x99\xaa\x98\x1c\x4e\x9d\x2f\xef\x33\x23\x88\x7c\x7b\xd4\x3d\xca\xf8\x2f\xf0\xa9\xfa\x8a\x46\xf0\x8b\x19\xfe\xd9\xda\xb6\xbf\x0d\x70\x8f\xb1\xc0\xae\x96\xed\x6f\xc7\x19\x5e\xe3\x96\x74\x5a\xaf\x78\xfc\xf0\xef\xef\xda\xd3\xa7\x0d\x82\xda\x71\x3c\x52\xfc\xca\x31\x55\x51\xc2\xb9\x8a\xde\x01\x15\xbd\xd9\xc4\xa5\x84\xb5\xe8\xf7\x54\x73\x14\xbf\x46\xe6\xe6\xdd\x25\xf2\xf3\x6b\xbc\x84\xbe\x86\x2d\xe1\x6b\x00\xa4\x20\x03\x4a\x5a\x4b\xde\xca\xd3\x8b\xcd\x56\xf5\x68\xb9\x28\x04\xf5\xf4\xba\xfe\xeb\xe6\xdf\xdb\xb7\x07\x25\x88\xe7\xa0\x2a\x5f\xc1\xb0\x33\x3e\x7b\x9c\xa7\xa5\x52\x51\xfa\x4b\xf9\x61\xc6\x76\x09\xfd\x04\x70\x65\x8d\x54\xdf\xcb\xb8\xf6\x4f\x8f\xd1\x38\x59\x4b\x5e\xba\xe6\x22\xd4\x39\xbb\xac\xf7\x1a\x2b\x56\x55\x74\x55\x5d\xb3\x15\x1d\xab\xa8\x5c\xe6\x9a\xb5\x1c\xf7\x75\xbd\x6c\x55\xff\xe5\xed\xe7\xff\xfc\xf0\xf1\x3f\xfe\x7b\xfb\xe1\xdf\xcf\xd0\x6c\x54\xd1\xd0\xc9\xd6\x72\x9e\x7a\x79\x6e\xa7\xe5\x69\xed\x65\xb1\x69\xe7\x84\x73\xd4\x27\x91\x0d\x7b\xd3\xa7\x53\xb4\xf8\xfd\xdc\x98\xea\x32\x42\xb9\x50\xa3\x32\xad\x73\x6d\x63\x9a\x6d\xb3\xe8\x9f\xc5\xf8\xea\xfb\x58\xea\x0d\x0a\x00\x76\xec\x35\x93\xf7\xc6\x91\xcf\xfa\x21\xe7\x3a\x13\x6e\x63\x78\xa1\xfa\x00\x9b\xda\x76\x4c\xda\x9b\x4c\xc1\x6d\x44\x1f\x94\xfa\x74\xd5\x11\xd8\x5b\x8a\xdc\x5a\x92\x60\x9a\x67\x4b\x2c\x96\xbc\x58\x64\xc1\xcf\xde\x92\x13\xe5\xb8\xe9\x93\xc5\x93\x99\x2d\x71\xd1\x2b\xb2\x60\x46\xbe\x7a\xee\xbd\x62\xb9\x1b\xaa\x7f\x7a\xb1\x4e\xc5\xea\xb4\xe0\x64\x78\x2f\xbf\x07\x3c\xde\x6c\x2a\xcb\x8e\xd4\x1f\x1e\x39\x62\x36\xc9\xd4\xda\x07\x7b\xf9\xc9\x8a\xee\x4d\x21\x21\xee\xd5\x92\x58\x4a\x96\xbc\x65\x14\x89\xe1\x68\x78\x9f\x5f\x8b\x8a\xb3\xb5\xe8\x3a\x6a\xfe\x60\x22\xf8\x1f\xf9\xa4\x4a\x50\x7a\x7a\xb1\xde\x3a\x8a\x0a\x27\x51\x85\x86\xbc\x23\xd5\x51\x55\x5a\xf1\x9e\x10\x64\xa5\x30\x61\x52\x08\x4d\x87\xc1\xc4\xf8\xa6\x02\xd5\x89\xa9\x6d\xfd\x7e\xd0\x79\x78\x12\xac\xc9\x7e\x59\xb8\x51\x39\x2b\x92\x24\x5d\x32\x0e\x94\x78\x21\xe4\xbc\x41\xd3\xf1\x45\x12\x23\x8e\x92\x6f\x2d\x12\x4d\x00\x96\xde\xd4\xb6\x7e\x26\x50\x06\x90\xa4\x25\x06\xd0\xe7\x70\x43\xea\x64\xeb\x11\x71\x4d\x8e\x6b\xd3\x91\x1f\x49\xa6\x88\x73\x94\xd0\xb7\xfd\x90\x5d\x30\x81\x62\x78\x26\xaf\xcb\x4a\xd9\x51\xc0\x16\x1b\x28\x45\x1d\xa7\x18\x19\x66\xc8\x45\xe5\x5c\xa9\x6b\xe6\x4d\x6d\x9b\xce\x4b\x42\x8c\xae\xdc\xc1\xdc\xea\xfc\x45\x9e\x5e\x92\x89\x9b\x03\x24\xb1\x41\x87\xcd\x14\xb8\x55\x71\x85\x9a\xb8\x39\xf8\x02\x05\x2c\x1c\x36\x76\xef\xba\xb6\xde\x4b\x16\xde\xcb\xaa\xc3\x4a\xef\x00\xdd\x18\x67\x71\xb2\x99\x50\x33\x0c\x6d\xc7\xa9\xc8\x89\x4a\x14\x00\xc0\x62\xb2\x4a\x95\xaa\xf2\xd3\x0b\xbc\x27\x32\x95\x03\xda\x20\xe7\x74\xf5\xeb\x28\x6a\xd3\xf5\x46\xae\xd8\x44\x2e\xfd\x8d\x12\x00\xca\xe4\x33\xce\xba\x46\x1d\xa8\xc0\x95\x49\x16\x23\x54\xc5\x99\x4b\x52\xa0\xf2\x65\xb5\x79\xce\x2b\x33\x37\x32\xb4\x3b\xd8\xb8\x5c\x35\x35\x04\xf2\x5b\x2b\xa0\x32\x50\x1f\x38\x12\x8f\xa1\x62\x75\x21\x2a\xc6\x8d\x28\x38\x58\x1c\x48\x9d\x01\x7f\x4e\x5d\xdb\x23\x48\x14\xf8\xf5\x2f\x05\x01\x6b\x0c\x5f\x78\x1e\x3c\xe2\x2d\xd7\xe0\xf1\xaf\xc7\x53\x16\x0c\x1b\x49\x6d\x7b\x25\x07\x69\x90\x5a\xca\x09\xf8\xbd\xe9\xcc\x32\xb9\x3f\x27\x6f\x6c\x24\x57\xcc\xe1\x54\x6f\xe4\xc2\x59\x55\xd1\xde\x2c\xa1\x62\x77\xd5\xf2\xc4\x19\xb7\x18\xed\x3a\xc6\x29\xca\x73\x7c\xc5\xbe\x83\xa7\x59\xe9\x98\xe3\x9b\xee\x87\x32\x24\x87\x28\x09\x0e\x48\xce\xd3\xaf\xf9\xd3\x8b\x15\xb6\x85\xd8\xfd\x60\xb0\x3f\x18\xec\x01\x83\xfd\x6a\x1e\x21\xbf\xbd\x1d\xe7\x32\xb3\xf1\xab\x6d\x39\x77\x60\xe9\xb7\x3a\x41\x20\x30\xc8\x91\x0b\x9b\xa4\x7c\x34\x0d\x29\x76\x99\x02\x71\x68\x2d\x64\x4b\x60\x1f\x82\xa7\x4a\xef\x7f\xad\x1c\x2c\x5e\xc8\xde\xa7\x5c\xd2\x08\xa5\x6c\x03\x71\x36\x73\xd7\x4c\x26\xc7\x96\xb2\x62\xe2\x5e\xb0\xb4\x42\x11\xa9\xc3\xbf\x1a\xaf\x1f\xf7\x06\x31\x1a\xc4\x90\x94\x66\xd2\xbe\x3e\x94\xa5\x10\x15\x38\x65\xd1\x39\x5b\xa1\xfd\x96\xd2\x37\x5c\x55\x4d\x38\x12\x52\xec\xac\x5c\xb6\x11\x6c\xc6\x0a\x88\x24\x8a\xd9\xaa\x56\xbe\x67\xbc\x3f\x18\xfd\x0f\x46\xff\x6a\x46\x7f\xdd\x29\xd1\x5d\x4f\xd4\x8e\x47\x08\x7e\x1d\x1e\x7c\xcd\x91\x04\x7b\x4a\x62\x0a\xe5\xb4\x99\x32\x21\xb6\x28\x76\x07\x26\xb4\xe7\x59\xba\x1a\x45\x35\x6c\x71\xcf\xe4\x3c\x89\xa3\x58\xb0\xbc\x46\x99\xdb\x94\xee\x14\x9d\x43\xb6\x38\x34\x9b\xa0\x7d\x03\xa4\xb3\x63\x25\x5d\x39\x55\x3f\x90\x57\x47\x83\x7f\x03\xd3\xc7\xa3\x64\x42\xac\x7a\x53\x36\x73\xd4\x54\xc2\x75\xa2\xdc\x77\x86\xcb\xc8\xde\x14\xe5\x00\xf3\xd9\xa6\x1a\x01\x3b\xa1\x15\x10\x12\x20\x5d\x94\x1b\xab\x38\x00\x8a\x73\xa6\xb6\xdd\x17\x55\xf3\x13\xca\x2d\x2c\x2d\x33\x7e\xae\x7c\xc4\x25\x8b\x53\xc8\x19\x91\x8f\xe8\x7f\xca\x18\x94\x1f\x65\xe5\x8c\xba\x4f\x81\xf1\xfb\xca\xf8\x3d\xd8\x7c\xb0\xca\x4b\xe6\xcc\x87\x8d\x0a\x3b\x42\x5e\xb1\x65\xcc\xaf\x60\x36\xcf\xba\xc3\x29\xd3\xd6\x3b\x69\xcf\xca\x6c\x50\xad\xc0\x3f\x37\x56\xb5\x33\xab\x8a\x48\xa3\x58\x31\x55\x5a\xd9\x77\xc7\xc6\x19\x5b\x44\x1e\x4a\xeb\x7a\x12\xeb\x28\x9b\x39\x76\x31\xa1\xd7\xd0\x6f\x5e\xae\x9b\x43\xec\x76\x78\xa7\xdd\xe8\x8a\x2a\x54\x2d\x38\x70\xf4\x93\x4e\x19\x50\xcb\xe9\x99\x74\xfb\x24\xf6\x54\xe0\x82\x49\xc2\x9f\x48\x28\xc3\xbb\x52\x59\x6c\x0b\xaa\x58\xcc\xa1\xde\xef\xae\x73\xab\x17\x1c\x45\x19\xc1\x1a\xcf\x28\x6f\xac\x63\x88\x41\x71\x50\x77\xb8\xd1\x08\x44\xf1\xc4\x51\x0e\xdb\xe6\x6f\x96\x92\xeb\xb2\x81\xf8\x6c\xa1\xd5\x4f\xd4\xff\x8a\x04\x46\xd5\x7f\x33\x1f\x49\xdd\xf9\xb8\x98\x5a\xd8\xa4\xdb\x28\x80\xea\x07\x6a\x9a\xed\xf2\xb7\x1d\x8f\xa7\x7e\x9d\x7f\xd5\xdd\xd8\xd5\xcd\xf1\x41\x83\x36\x88\x0c\xf6\x71\x33\x57\xda\x11\x96\xa7\x88\x1f\xe4\x3e\x60\x5b\x2a\x4f\xf8\xc1\x0d\x7e\x70\x83\x33\xdc\x60\xac\x56\xb0\x89\xba\x5c\xfc\xed\xcc\x22\xf7\x3c\x6a\x1e\x4b\x0a\x52\x23\x39\xfc\xe6\x0e\x12\xc1\xcc\x70\xd6\x61\xbe\xdf\x2a\xb5\x9e\xac\x23\xd6\x19\xba\x36\x73\x13\x58\xa3\x32\xb4\x57\x52\x3d\x25\xc4\xdc\x90\xf3\xf3\xbb\x36\x04\x5c\x99\xf5\xf3\xab\x72\xf4\xdb\x12\x8f\x7c\x41\xff\x37\xf3\x2a\x27\x0e\xac\x26\xc5\x03\x75\x1e\xc5\x4b\xb2\x81\x3a\xff\x83\xf1\xff\x60\xfc\xdf\x84\xf1\x8f\xcd\x2f\x6c\x32\xc5\xa0\x5f\x3e\xac\x36\xee\x15\x6d\x42\xb9\x83\x71\xe4\xfe\x49\x69\xbf\x91\x4e\x38\x52\xfe\x84\x22\xdb\x30\x0f\x6b\xb6\x52\x83\xfb\xe2\x45\x9a\xe2\xef\x29\x37\x6e\xe7\x39\xf0\xf3\xdb\xcf\x9f\xdf\xbd\xff\xeb\xa7\xd3\x71\x04\x8d\x6e\x00\x92\xc8\xfb\xcd\xdc\x6e\xa2\x12\x00\x2a\xc6\x3d\x53\xf0\xc0\x74\xa6\x26\xda\x8a\xb3\xa1\x58\x0a\xbc\x53\x52\xde\x88\xae\x1b\x9a\x0e\x07\xf5\xa9\x50\x59\x99\xef\xda\x9e\x13\x65\xa9\x32\xf3\xd4\x8e\xe6\xab\x4d\xaa\xb5\xc0\xcf\x6d\x73\x84\x41\x09\xe5\x6c\x13\x0e\x1b\x13\xac\x3f\x69\x28\xbd\x1f\x2c\x56\x4e\x3a\x8b\xa7\xdb\x2f\xbe\x94\x9e\x70\xa4\x6b\x7b\xc4\xf2\x09\xf6\xd5\xe4\x6b\xd3\x0d\x5c\x58\x69\xbc\xa5\x12\x2c\x15\x3e\x38\xd6\xf7\xe4\xd0\x15\xc0\x94\x6a\x53\x3f\xa8\x37\x98\x44\x79\x50\x93\x46\x7c\x41\x94\xc5\x45\x8c\x76\x5f\x88\x09\x6e\xb4\xe0\xf6\xb8\x3e\xb2\x04\x73\x30\x8e\x9c\x6f\x75\xff\x68\xb6\x0c\xa5\xa3\xa8\x8c\xd2\x75\x52\xb0\xf3\xc8\x33\x4c\x94\x45\x05\x13\x0f\x6e\x12\xc1\x78\x0e\xac\x84\xca\xda\x9a\xa2\x14\xbe\x98\x2f\x91\x6b\x0c\x47\x5d\x38\x05\x58\xda\x6f\x5e\x31\x13\x4f\xcd\x15\x51\x25\x21\xc7\xfa\xa8\x02\x38\xf5\xac\xad\xb1\xd5\x5e\x3b\x59\x24\x33\x42\x27\x04\xf9\xa7\x68\xc2\xcc\xc1\xa3\xe6\x28\xab\x8e\x0b\xe0\x45\x81\x6b\xb9\x7f\x9d\x2b\xb8\x23\xda\x8a\x17\x2c\xe4\x42\xb5\x23\x4e\x10\xa6\xcb\x6d\xa6\xf2\xda\x60\x34\x57\x52\x17\x0a\xee\x98\x17\x47\x1d\xca\xd3\x63\xd1\xed\x2d\x91\x83\x36\x97\x80\x14\x69\x9f\x15\x54\xd7\x43\xdf\x39\xb4\xf2\x82\x59\x16\xf7\xa9\x31\xa4\x43\x23\x0e\x0b\x2e\xd8\xd3\xcb\x90\x64\x3c\x80\x81\x94\x89\xbd\x77\xdf\xdf\xfd\x22\x6a\x20\x10\x96\x85\xa3\xec\x0d\x9a\x8e\x6b\x67\x48\xa9\x8a\x41\x39\xd5\xa6\xa3\x82\xee\x8d\x1a\xbe\xd5\x64\x85\x25\x8e\x91\x7d\x87\x24\x92\x30\x5f\xb0\xe3\x58\x9b\x3d\xa2\xea\xbd\x03\x6e\x78\xb5\xd7\x95\x27\x4e\x46\x3c\xb1\xdf\x70\xe5\x27\x7b\x1b\x1a\x25\xc5\xff\x56\x65\x95\x68\xc9\xc7\xbf\xd5\x0d\x55\xe5\x1f\xa4\x7f\x77\x2d\x25\x84\x48\xbb\xc3\x57\x05\xa7\x28\xbe\x45\xab\x8d\x1c\x3c\x83\x3b\x24\xf5\x11\x4a\xbc\xc1\x9c\xd3\xb0\xc6\x14\x93\x25\xc9\x2b\x81\x4d\x31\xf1\x91\x2f\x34\x90\x06\x97\x72\x38\x78\xbd\x47\x28\xac\xa9\x97\x51\x86\xd6\xe9\x7e\xd3\x9b\xca\xad\x12\x96\x64\xf4\x2e\x96\xd2\xb1\xe1\x29\x45\xe3\x01\xec\xcb\x87\xfd\x57\xc1\xc1\x85\x96\x12\x24\x78\x05\x50\xac\xf0\x51\x61\x60\xc5\x90\xae\x05\xe0\x71\x35\x54\xb7\x7b\x31\x33\x5c\x60\x77\x0c\xf7\xa5\xe9\x67\x51\x05\xb7\x18\x49\x2d\x93\x57\xb2\xfd\x1b\x29\xcd\xd5\x33\x02\xdf\x5a\xd0\x88\xca\xcc\xf3\xf7\xa8\x5e\x6f\x15\x9e\xe6\x18\xc8\x0d\x20\x2d\x6d\x95\x81\x92\xfc\x8d\x9c\xde\xa4\xe8\x48\x62\xdb\x41\xea\x00\x12\x18\x29\xe5\x2d\x53\x39\x18\xaa\x24\xe3\x1c\x39\x6e\x11\xb3\x4b\x3e\x3d\x83\x5f\x37\x09\xe2\x25\x47\x8a\x0a\x0c\x0c\x29\x57\xf7\xef\x83\x01\xa9\x08\xd7\x9e\xc4\x12\xd3\x61\x52\x68\x61\x31\xd3\xe7\xfe\x86\x43\x2a\x07\x79\x35\xb6\x4c\x41\xd7\x78\x31\x03\xb1\xe9\x10\x3b\x3e\xbd\xe8\x7e\x89\x5a\x06\x62\x20\x8e\xa8\x2c\x2b\x8b\x40\x21\x18\x34\x7b\xee\x2b\x89\x92\xee\x77\xc2\x08\x00\xe9\xa3\x55\xa2\x8a\xc8\xba\x4b\x5a\x45\xfe\x44\xb2\x09\x55\xd5\x48\x79\xd8\x25\x84\x7c\x54\x64\x13\xc8\xa5\xba\x7c\x4b\xf1\xe4\x14\x01\x83\x0a\xd7\xba\x7b\x01\x24\xda\x73\x8e\x06\x4d\xd3\x1f\xa8\x89\x37\xae\x69\x2d\x96\x45\x29\x4a\xd1\xa3\x4a\xb5\xaa\x0a\xd6\xce\x49\xc4\x92\xcb\x9b\x80\x84\x2b\xfb\x92\x43\x10\xdd\x59\x87\xcd\xce\xaa\xa4\x59\xfb\x0a\x79\x2d\x9e\xbc\x42\xb6\x78\xf8\x5f\x43\x5e\xe6\x4d\x50\xb9\x3e\x0c\xc2\x7d\xf7\x01\xdf\xd6\xef\x17\x64\xb6\x4a\x0e\xc1\xd8\xd9\x43\xfe\xa3\xa2\x33\x51\xb8\x6c\x02\x65\x1c\x74\xed\xa5\xf1\xa4\x23\x68\xb5\x5f\x42\xbc\xbc\x76\xcf\x5b\x26\x71\x6d\x0d\x91\x29\xe4\x15\x3c\x1b\xc4\xea\x87\x41\x3e\x60\xc5\x0e\x9f\x5b\x45\x0c\x90\x51\xb6\x54\x02\xa0\x1d\xe0\x57\x93\x52\x5d\x88\x23\x23\x4e\x58\xe8\xb6\xae\x24\x76\x01\x0a\x97\x70\xc4\xf3\x71\xc4\xde\xa8\x54\xeb\x8c\x6a\x4e\xca\x36\x1a\xdd\x2d\x9a\x91\x2b\xbb\x22\x3a\xb7\x58\x96\xb8\x51\x8c\x70\xa9\xbf\xd9\x28\x3c\xfc\xca\x35\x04\x39\xe2\xe0\xbe\xf7\xfa\x8c\xf2\x14\x5d\xd8\x4d\x32\x69\xcf\x6d\x54\x97\xc1\x19\xad\x6e\x99\xb3\xd7\x5c\x54\x2a\xda\x1e\x5e\x0f\x4a\xb8\xd0\x59\x65\xfa\x31\x4f\x91\x57\x82\xb3\x8d\x7c\x30\x06\x78\xc2\x23\xd9\x8f\xe3\x83\x09\x90\xf7\x2d\xd6\x43\x16\xfb\x2f\xe2\x14\x35\x18\x71\xad\x12\x51\x9c\xbf\x24\x91\x5c\xd8\x4d\x07\x67\xea\xd5\x16\xcf\x8f\xbf\x54\x74\x5b\x74\x0a\x03\x5d\xb9\xd9\x3b\x5d\xf7\xd8\xc6\xc9\x87\xd9\x5d\x8c\xbc\x65\x78\x3e\xcd\x17\x46\x59\x49\xa1\x90\xda\x0a\x8c\xe9\x8b\x80\xd3\xf6\xf0\xaa\x05\xdf\x03\xc0\x47\x23\x04\xb2\x07\x74\x54\x0c\x1f\x8c\xc1\xd6\x41\x78\x95\x2e\x0f\x86\x58\x11\xa0\x05\x15\xe5\x3c\x9a\xb7\x53\xba\x54\xa6\x2e\x76\x0e\x40\x83\xed\xd4\x85\xb5\xf8\xc5\xe4\x7a\x8f\x8a\x4f\x2f\x36\x53\x76\xaa\x52\xcb\xc2\xa9\x2e\xea\xaa\x42\x0a\x51\x41\xd5\xd1\x2a\x64\x0c\x37\x3a\x4f\xd8\x0e\xd8\xaf\xaf\x3b\x7b\xce\x24\xf8\x1a\xb5\x04\x96\x07\xee\xda\xfe\x5e\x2e\x28\x8b\xe6\xa8\x0c\x2e\xf9\xaa\x91\xa8\xba\x12\x20\x6e\x4b\xd7\xee\x35\xc1\x04\xfb\xc5\x6f\xae\x91\x44\xdd\x22\x10\xae\xa2\xfd\x0c\x32\x35\x1c\x27\x9c\xb4\x98\x5a\x4e\xaa\x94\x64\x68\x25\x79\x50\x4b\x7c\xe9\xcf\xfa\xbf\x9e\x5a\xa2\x54\x82\x42\x3d\x7b\xfd\x02\x9e\x2b\x4d\xd8\x02\x35\xb9\x5a\x19\xcb\x40\x24\x54\x54\x5b\x39\xad\xac\xcc\x54\x07\x05\x81\x6b\x59\x35\xc7\xf1\xca\x15\xb8\x8e\x6c\x55\x70\x9d\x29\x26\xde\x1b\xc8\x49\xb3\x41\xb1\x6e\x6a\x3e\x56\x07\x82\xe0\xb6\x3a\xf5\xc5\x81\x53\xcf\x0f\x55\xe5\xd5\xaa\xca\xeb\x8e\xc9\x8f\x9a\x1f\xfe\xf3\xdd\xe7\xe7\xed\xe9\xa4\xc4\x0e\x8b\x92\x75\x93\x75\x8d\x52\x61\x26\x3f\x8e\xb5\x11\x9c\xb5\xa5\x65\x22\x76\xa3\xcb\x81\x44\xf0\xe8\x4a\x40\x30\x99\x7c\x1e\x95\x58\x57\x09\x32\x94\xb5\xa4\x2f\x26\xa9\x53\x64\x1d\x87\x74\x0c\xe3\xa9\x35\x7d\xd2\xd2\xd7\x87\x56\xa9\x56\xe8\xc3\x80\x56\x4e\x2a\x9e\xdf\x29\x90\x29\x11\x4b\x8d\xcf\x91\x7d\x7c\x0e\x53\x1e\x22\x74\x4e\x94\x0f\xb9\x38\x31\x8a\xdc\xb1\xa3\xf3\x69\x8c\x91\x34\xf5\x3e\x1d\x1d\xcb\x6c\xb2\x2f\x0e\x27\x74\xb7\x7e\xc2\xb9\x7e\xd2\xfd\xfa\x89\x67\xfa\x89\x24\x35\xad\x08\xe7\x21\x52\xcb\x51\x2c\x43\x4f\x4c\xfe\xf5\x7d\xa5\xaf\x80\x75\xd7\xfb\xd6\xdf\x8c\x87\xd7\x3b\xd8\xde\x8c\x99\xd7\xa7\x51\xb8\x15\x57\x5f\x5b\x64\xf7\xfe\xd8\xfb\xca\xa2\xb8\x5f\x09\x9f\xcf\xf6\x1e\x5f\x9b\x30\x7c\xd8\x5f\x3a\x57\x0e\xd7\x50\x8e\x7b\x0e\xbe\x3e\x64\xf1\x38\x09\xee\x73\xdf\xfe\x06\x1b\xcf\x15\xd0\x48\xbf\x93\x23\xe5\xd7\xcc\x25\x5f\x9a\x5f\xfc\x7a\x3e\x76\x9d\x43\xf9\x1d\xb8\xd8\x75\xde\xa3\x77\xe0\x61\xd7\xe5\xe7\xb8\x9d\x83\xbd\xa6\x22\xf1\xd7\xe0\x5f\xaf\x28\x51\xfc\xd5\xb8\xd7\xe9\xbe\xe3\xab\xc2\x15\x06\x96\xd0\x22\xb1\x22\x32\x32\x1e\x24\x76\x16\x43\xce\x9d\x61\x67\x5b\x8e\x73\xe7\x79\x5b\xeb\x71\x7d\x47\xac\xed\x34\xa8\xd2\xb7\xf2\xa6\xce\x17\xa7\x8e\xff\x9e\x75\x97\x0c\xd5\x30\x68\xdf\xb2\x16\xd9\x32\xe5\xa7\x97\x60\x9a\xad\x65\xca\x67\x2f\x2c\x95\xc8\xa7\x17\xd2\x70\x01\xd5\x7b\x0a\xf9\x65\x58\x73\x7e\x7d\x79\xad\x2f\xe4\xa7\x7f\x45\x72\xfa\x15\x32\xd2\x7f\x65\x68\x4e\x5f\xb4\x14\xca\x6f\x0c\xc9\x1f\x29\xee\x8f\xe1\x0b\x0e\x28\xd9\x11\x87\xc3\xca\xf8\x08\x17\xfa\xa7\xc3\x92\xdf\x55\xb6\xfb\xff\xf5\xe1\xef\x9f\xdf\x7e\x3c\x93\xd8\xd2\xb0\xa7\x9c\xda\x40\xcc\x36\xe0\xa8\xb8\x77\x15\xb4\x4c\x1e\xc6\x3d\x5e\x71\x31\xcc\x6b\x87\xe3\xe0\x7d\x76\x38\x31\xcd\x9a\x79\xc5\x9e\x1c\x9b\x8c\x03\xbe\xc9\xab\x46\x5f\xbd\x5b\x0e\x8c\x5c\x69\xaa\xd5\x41\xb2\x19\x8d\xb4\x1a\xa2\xbb\xee\x56\x9c\x8c\x84\x5d\xa2\x38\xce\x4d\xa7\x23\x95\xd0\x0a\xc5\x62\x04\xa7\xcd\x93\x37\xed\x85\x03\x3d\x1f\x4e\x9f\x41\x9d\x42\x79\x9a\xd7\x1a\xd6\x58\x2f\x2b\xd7\x20\x63\x11\xea\x42\xf8\x38\x73\xcc\xd4\x71\xb7\x56\x87\x68\x64\x3a\x85\xd1\x07\xbc\xe1\x53\xa1\x52\x17\x9f\x88\x05\x0c\xb6\x6c\x67\x00\x6b\xac\x2c\xf5\x56\xab\x43\xb1\xa3\xa1\x74\x6b\xcb\x58\xe0\x95\x18\xce\x8a\x39\x5e\xd7\x83\x27\xd9\xb8\xbb\x47\xee\x95\x53\xf7\xb7\x5a\xfe\x3b\xa4\x36\xf8\x8d\x40\x7c\x8f\x84\xf9\xf5\xb0\x1c\xe2\x42\xa6\xe0\xbf\x2e\xee\xde\x21\x57\xfe\x9e\x9b\xc1\x9e\x80\x92\x02\xc4\xb6\x4b\x27\x37\x17\x74\xb8\xb9\x27\x43\xbb\xde\x6e\xf4\x1d\x89\x0f\x97\x59\xa2\x5e\x9d\xe9\xff\x37\xda\x63\x6e\x8e\x61\xff\xed\x98\xce\xad\x69\x51\x7f\xcb\x3d\xe8\xe6\xbc\xa4\xbf\x19\xc3\xbc\xce\x6e\x72\x57\xc5\x38\x5c\x9e\xb8\xd7\x30\xc5\xb4\x8f\xe4\xa9\x87\xb5\x86\xe3\x62\xec\xd9\xdd\x3d\xf5\xf4\xc8\x8e\x72\x34\x85\x8a\x6c\x28\x8f\x9d\x7d\x9c\x69\x5a\x21\xd1\x35\xe7\xb2\x0e\x54\xdc\xf4\x81\x68\x9a\x5d\x24\xce\x2b\xe1\xc9\xeb\xdc\xbf\xae\x0c\x05\x9e\x27\x35\xb9\x83\x27\xf6\xda\x2c\xc6\x5f\xd9\x77\x8e\x4c\x00\x4e\x94\xbc\x92\x1f\x75\x64\xeb\x48\x56\x70\x1d\x88\xa9\xf5\xc4\xc5\x7a\x6a\xca\xac\x3b\x41\x77\x8a\xa5\xa2\x03\xf6\xdb\x48\x92\xc6\x03\x46\x86\x9f\x65\x26\xe6\xb6\x7b\x26\x4c\x46\x32\xf4\xfe\xf4\xc2\x4c\x19\xc5\x37\xd2\x91\x91\xb0\x5e\x11\x47\xe2\xd6\x52\x68\x36\xd6\xa8\x34\xae\xf7\x56\x1c\x90\x9d\x72\x0c\x16\xdb\x95\x24\xa9\x60\x91\x86\x38\xeb\x7c\xbc\x99\x41\x45\x55\x92\x5a\x99\x8e\x9f\x5e\x3c\xc5\x64\x1d\xc5\x38\xfb\x90\x54\x47\x2e\x21\x41\xc6\xcb\xa5\x30\xc5\xc9\x0a\xa1\x1c\x08\xc0\x00\xa8\xe8\x53\x7e\x0e\xb4\x3a\x18\xc7\x15\xb8\x77\xaa\x76\x97\x51\x0f\xc8\xe1\xb0\x36\xe6\xfd\xd7\x81\x01\xc5\xcc\xd6\xee\xe2\xa9\x30\xc1\x15\x27\x55\x7b\xc5\x66\xb6\x8d\x5b\x87\xe4\x05\x67\xd0\x0e\x53\x0f\xc0\xb9\x2f\xa2\xb7\x27\x5f\x54\x50\x08\x06\xcd\xc4\x22\xd2\x7a\x12\xb1\x89\x1c\x2f\xc6\x94\xe6\x7c\x9d\xed\x24\x8c\x62\x04\x94\xa7\x17\x2b\x8e\x82\x89\xe4\xc2\x0f\x34\xdf\xa3\xf9\x0f\xeb\xcb\x6b\xad\x2f\xae\x66\x34\xa1\x14\x0f\xad\x2f\xae\x06\x80\xc5\x09\xef\x2f\x84\xd4\xec\xfc\x83\xd7\x7f\xef\x44\xf0\x9b\xf3\xfa\xdf\x99\x25\x6b\xfd\x78\xda\x8a\xc5\x26\x2c\x25\xac\xf3\x56\xd6\xa3\xd4\xc0\x56\xac\xcc\xb3\x09\x87\x9d\xd2\xef\xf6\x6e\xb9\x59\x5d\x63\xb8\x59\x72\xda\xc9\x36\xef\xe2\x56\xd6\x2c\x5b\x87\xd4\xcb\xb2\xe6\x34\x1b\xcb\xd8\x9a\x29\x46\xd6\x8e\xe7\x89\x8d\xe7\x29\x70\x25\x6f\xf3\x41\xad\xcf\x69\x5a\x5c\x6e\x90\xb4\x97\xd7\x2a\xcf\x37\xbb\xb2\xe4\xb8\x96\x66\xc9\x7e\x17\xa7\x5f\xdf\xfa\xdd\x25\xa5\x0e\xcf\xe7\x65\x01\xc4\x99\x72\x42\x34\xfc\x85\x50\xbe\xdd\xa9\x45\x02\x35\xf5\x94\x92\x03\xf9\xd1\x39\x65\x19\x1d\x17\x0a\xc5\xaf\x58\x4c\xb0\x16\x2f\xf9\xaa\x2b\x1d\xc8\xdf\xbe\xb6\xf7\xb0\xab\x24\xc3\xcd\x4e\xb6\x4c\x21\xa9\x84\x94\xc0\x41\xc7\xa6\x94\x1f\x56\x91\x8b\xad\x22\xa0\xa0\xae\x36\xf0\x3c\xdd\x5a\xb8\x98\x71\xdd\xa1\x6a\x21\x8a\x05\x6f\x9b\xaf\x8b\xd2\x2a\xd0\x1c\x88\x32\xfb\x42\xc5\xb7\xe3\xfa\xad\x75\x0f\x93\xe1\x81\x93\x77\x05\x09\x26\x25\x9a\x05\x45\x29\xc0\xf3\x7f\xe7\xd5\x0a\x1f\xe6\xf5\x38\x43\x31\x2c\xaa\x63\x29\x79\xf7\x4b\x43\x51\x65\x94\xa5\xa4\x2f\xef\xac\x99\xfc\xd6\x1f\x29\xac\x79\x95\x66\xd9\xed\xab\xc4\x65\x8a\x77\x3b\x26\xbf\x94\x66\x31\x1d\xa6\xae\x8a\xe1\xb4\xcb\xf7\x42\xdd\x42\xb1\xeb\x7d\xd2\x91\xed\xe0\xb1\x96\x66\xcb\x14\xe7\xa8\x79\x98\xc3\xfe\xc8\x6e\x7d\x8f\xb4\x68\x67\x17\x6b\x2b\x94\xe4\xc4\xbe\x7c\x76\x8d\x6e\xd6\xc1\x00\x31\xc3\xcd\x91\x25\x43\x0c\xed\x11\x23\xfc\xd7\x49\x72\xa3\x92\x3a\xf7\xd5\x6c\x82\x6a\xf4\xfb\x68\xc0\xef\x17\x55\xae\x48\xf9\xf3\xcf\x9b\xde\xe6\x4b\xfc\x4a\xa8\x2c\xe6\x1b\xab\x38\x9d\xfc\xe5\x54\x71\x8d\x9e\x34\xdf\x58\x8f\xe9\xef\xfd\x46\xf2\xbb\x67\x72\x67\x77\xf5\xbb\x94\xd5\xb9\x70\x87\x7c\x6d\x06\x91\x57\xeb\x9e\xff\xef\xe2\xd7\x5f\x0f\xf4\xcf\x0f\xed\x3f\xfe\xfa\xe1\xfd\xc3\xaf\x1f\xde\xbd\xff\xfc\xe9\x4f\x3f\x49\x7e\x10\x79\x70\x4d\xd7\xee\x7f\x88\x3c\xe8\xad\xa6\x6b\x9d\x0c\xff\xdf\x5f\xc4\xbb\x37\xea\xa4\xb3\xe1\xb0\xd7\xce\x63\x6d\x44\x1e\x72\xd7\x34\x0f\xbe\x36\x4e\x1e\x38\x76\xad\xe4\x07\xf6\x5d\x0b\xd8\xde\xa2\x25\xce\x06\x82\x8f\xc6\xda\xc4\xfd\xef\xac\xdd\xa2\xf1\xdd\xff\xfa\xbf\xf5\xf9\x1b\xfd\x1b\xe6\x2b\xd3\xcd\x39\xef\xe1\x10\xf7\xb0\xd9\x4f\x5b\xf2\x00\x0e\x27\x1d\x90\xee\x13\x39\xd3\x79\x10\xeb\x3f\x9d\xa6\x1a\x07\x35\xf5\x84\x92\x7a\x69\xd4\x0c\x97\xfb\xf4\x71\x2e\x62\xa6\x9f\x47\xb9\xb1\x8f\x73\x91\x32\xfd\x3c\x6e\xed\x23\xbf\x06\x2f\xbe\x0e\xc5\xde\xe0\x35\xf2\xb5\x69\xf8\x06\xd3\xc7\x57\xa3\xea\xdb\xa3\x7d\xae\xa1\xaf\xdb\x23\x7d\xae\xa1\x86\xdb\xa3\x7c\xae\xa1\x8f\x3b\x44\xf7\x74\xd5\x7a\x07\xc7\xe1\x62\xdc\x10\xcd\xac\xa2\xbc\xa3\x10\xdb\xc6\x92\x6a\xf0\xdb\xab\xea\x21\x9f\x8f\xac\x99\xd3\xae\x90\x0f\x3d\x19\x54\xde\xde\x10\x30\xb0\xbb\x73\xc5\x00\xf2\xab\x6c\x8f\xf9\xd0\xf0\xe8\x87\x25\x68\xae\xb2\x3a\x96\xdf\x89\x20\xff\x2a\x0e\xd7\xbc\x5a\x9a\xff\x56\xfc\xf8\x4a\xe3\xd8\xd7\xe7\xc6\x57\xda\xab\xbe\x22\x2f\xbe\x2d\x6a\xe9\x3a\x4e\x7c\x5b\xc4\xd2\x75\x7c\xf8\xb6\x68\xa5\xeb\xb8\xf0\x8d\x51\x4a\x22\x26\x6e\x29\x9c\xaa\xda\xda\xac\xf3\x55\xf6\xe1\x73\x61\x3f\x73\x35\x76\xcd\x7e\x29\x79\x27\x5b\x7f\x99\xd6\x77\x49\x50\xd0\x6b\x2a\x7e\x6f\x90\xc4\x74\xc8\x64\x6a\x6b\x3a\xca\xbc\xe4\xb2\x8b\x67\x76\x9f\xd3\xdd\x97\x6f\x65\x9a\x55\xf6\x78\x91\xf6\xf9\xe6\xed\xc7\xcf\xef\xfe\xf2\xee\x79\xf3\xf9\x74\x59\x4a\x27\x26\x2e\xc7\x05\x33\xc5\xe4\xb5\xe4\x99\xe6\xce\xa5\xa5\x90\x2c\x25\x2a\xdd\x71\xb5\x34\x28\xad\x93\x97\x7e\x9d\x97\x4e\xda\xc6\x64\x0a\x71\x93\xf5\x6a\xde\xa7\xc6\x35\x62\x98\x32\xaf\xf3\xd8\x98\x29\xe6\x6e\x29\x19\x2a\x2d\x8d\xe2\x0d\xd3\x38\xe8\xef\x02\xa1\xff\x5c\x42\x86\xae\x97\x38\xf4\xc2\x57\xf6\x72\x2e\x1b\x43\x57\xfb\xd5\x0d\xbd\x34\x57\xf6\x72\xd6\x21\x5e\x90\x39\x99\x13\x89\xdb\xc4\x5a\x82\xdb\xf5\x79\xac\x3c\x79\xc3\x48\xee\x57\x90\x98\x38\x11\x64\xb5\x9a\x5e\x45\xef\xc6\x4d\x24\x41\x5d\x9c\xbd\xcf\x12\xec\xa3\x2d\x4c\x52\xfa\x00\x15\xab\x6f\xe0\x13\x56\x3f\x71\xac\x13\x5b\x4b\x0d\x73\x43\x31\x6f\xe0\xa1\xeb\x6b\x96\x60\xee\x53\x18\xeb\xdf\x0b\x4f\x2e\x18\x34\x1d\x2e\x61\xe8\x92\xa8\x5c\x12\x74\x71\x4e\xf5\xbd\x6e\x65\x6f\x3f\x85\xbe\x6e\xad\xef\x51\xb8\xec\x8f\xbc\xfa\xf7\x38\xb0\xee\xd4\x91\xc3\x32\xf2\x19\x29\x8b\x65\x99\x76\x4c\x71\xc9\x85\x9a\xab\x72\x00\xbc\xee\xec\x1a\x12\x78\x97\x08\x41\x76\x4c\x7c\x8a\xb1\xee\xec\x55\xa7\xf7\x67\xf5\xc5\xfd\x28\xbc\x91\xbc\xce\x4b\x68\x47\x7d\xa6\x85\x1b\x76\x8a\x6b\x06\xfa\x4a\x15\xf3\x77\xa1\xdd\xa4\x8b\x53\x26\x5c\xb5\xbb\xdd\x9a\x30\xe1\x5a\x9e\x78\x5b\xb6\x84\x6b\x39\xe2\x8d\x21\x03\x7f\x70\x7e\x78\x9d\x7a\x34\x96\x0d\x21\xab\xef\x1c\x39\x7f\x92\x03\xc5\x83\xe3\xb2\xfe\xbd\x2b\xc6\x75\x4e\x85\x3a\x60\x4c\x42\x29\x1f\xa4\x5a\xa8\x3a\xcd\xd7\xe0\x53\xd7\x29\x61\x77\x55\x01\xd2\xc5\xde\x19\xc5\xb8\x66\xe9\x87\x4c\x7d\x56\xac\x8c\xc4\x71\x36\xde\xc4\x71\x08\xb5\xae\xab\xac\x39\x2b\xb2\x66\x72\xde\xe4\x7d\x4d\x3f\xcb\x4e\xc1\x5c\x6a\x85\x8a\x52\xdd\x79\x9f\x1e\x75\x5b\xc4\xa6\x28\x7e\xcd\x28\x16\x1f\x74\x87\xcc\x6b\x8e\x4b\x94\x4f\x4c\x4b\x4e\x6b\x71\xcb\xbb\x45\x0e\x38\x23\x8e\x42\x51\x62\x4a\x26\xd6\xdc\x98\xf0\x6e\x6d\x28\x25\xe3\x29\x94\xfb\x52\xed\x22\x2a\x0c\xe2\x50\xdc\x70\x34\x88\xa7\x17\x74\xeb\x4d\xa3\xb4\x9b\x40\xb0\x23\xda\x35\xc7\x69\xd7\x11\x77\xaf\xdf\xc1\xa9\xe3\x9f\x01\x24\xb7\x97\x09\x1b\x44\x2a\x29\x24\x41\x91\x3b\x9a\xdc\x73\x62\x1d\x5a\x0a\xc6\x1d\x11\xa8\xee\x54\x3d\xa9\x96\xf2\x70\x14\x97\x69\xcd\xb2\x84\x40\x79\xcc\x27\xb2\xe6\xd1\x60\x92\x72\x95\x62\xbe\x98\x12\x2d\x52\xbe\xc6\x78\x3e\x77\x47\x3f\xb2\xa7\xc7\x9a\xf7\x5d\x87\x28\x6e\xc9\xe9\xe9\x85\x6d\xd2\xf1\x2a\x3d\xff\x70\x31\x79\xad\x8b\xc9\x1f\x53\xaa\xb8\xaf\x4f\x0b\x8a\xbd\xf4\x9d\x0a\x85\xfb\x20\x3b\xe2\x4b\xc9\xa5\x4e\x2a\x19\xd7\x89\x1a\x9c\x45\xcf\x22\xf9\x4b\xb4\xbe\x52\xa8\x5c\x5f\x5a\xe7\x3b\xf2\x40\x59\x7c\x7c\xde\xbe\xdb\x9d\xb6\xff\x49\x31\x4e\x14\x14\xb2\x0c\xeb\x69\x2a\x15\x23\x4b\x29\x73\xd7\x1f\xbd\x76\xb7\xdc\x1c\xde\xc8\x24\x32\xda\xf0\x36\xce\x22\x77\x39\x2c\x46\x0f\xe8\x0b\x77\x0b\x45\x50\x5c\x59\xc6\x35\xfb\xad\xdf\x38\xb3\xb7\x07\xc7\x6c\x99\x72\xfa\x84\xc4\x31\x48\xc6\xec\x96\x81\xc2\x02\x85\xc9\xa8\x4f\xcd\xeb\xab\x55\x5b\x9a\x25\x5f\x62\xcd\x3c\x9f\x66\xbe\xd1\x2e\x64\x29\x91\x62\xfc\xd4\x18\xf4\x6f\x88\xdd\x62\x3f\x3c\x23\xd1\xe8\x80\x77\xca\xcd\x5b\x5b\xf3\xdf\xac\x41\x53\xd3\xf1\x75\xdf\xba\x63\x1e\x0d\x2e\xc4\xb9\x8d\xe4\xb2\x8d\xe4\xfa\x65\x41\x4d\x13\xa4\x88\xf6\xdc\x5a\x6f\x1c\x95\xb0\x76\xa3\x08\x6b\x31\xcd\x8e\x85\x7c\x6b\xbd\x45\xba\xef\x23\x81\xe5\x37\x9a\xf3\xc6\x9b\xac\x8a\xf0\x0d\x45\xc3\xd9\x08\xea\x88\xd4\xe0\xed\x15\x47\x23\xcd\xeb\x50\xbc\x59\x4a\xf3\xf4\x28\x32\x46\x4e\xb6\x6c\x78\xc9\xc3\xe8\x31\xb5\x6d\x5c\x0c\x7f\xe3\x85\xfb\xb8\x30\x9f\x40\x83\x31\x96\xa2\xd4\x21\xcb\x4a\x44\xb1\xf8\x22\x1c\xb8\xca\x71\xb8\x21\x41\x9d\xf4\x30\x1d\x84\xd5\x41\xbc\x8e\x54\x38\x2f\xf9\xb5\xf0\x39\x4b\x26\xdf\x16\x17\x4f\x8c\xd0\x9f\xe1\xb9\xff\xf6\x7e\xf3\x83\xeb\x9e\xea\x3d\xec\xb9\x6e\xd1\x5d\xf6\x2c\x67\x0d\x94\xf2\x88\xf7\xe1\xdd\xbb\x33\x5b\xde\xc9\xb6\x28\x3f\xe5\x31\x6a\xa7\xfc\xcd\x58\xab\x33\xa5\x16\x3d\x50\xc5\x79\x3d\x29\xba\x29\xa6\x59\x07\x8a\x6d\xc5\xe5\x63\x49\x29\x10\x4e\x5b\xe5\x5f\x95\x22\xb3\xee\x16\xa3\xa5\xab\xdf\xbe\x1b\x7f\xcd\x66\x02\x25\x21\x11\xcb\xaf\xe7\xaa\x24\x3c\x5e\x4e\xfd\xda\xd3\x8b\x37\xee\x37\x61\xb3\x8c\xe5\x3f\xcb\xae\x8e\xfb\x20\x5f\xaa\x9e\x0f\x88\x16\xef\xc2\xa8\xcf\x33\xc7\x6f\x8f\x4d\x57\x70\xc8\x37\x1f\xde\xbf\x7f\xfb\xfc\xf9\xf4\xa9\xb4\x47\x96\x99\xac\xfa\x6a\x24\x09\x26\xf6\x25\x28\x55\x1b\x54\x68\xb2\x27\x0e\x9b\xd9\x3d\x1b\x49\x10\x1e\xb7\x93\xa5\x2a\x09\x7a\x5f\x0c\x9a\xfa\x2e\x7e\x86\xa5\xc8\xd1\x3b\x36\x2c\x9d\x57\xfd\x80\x1a\x95\x1e\xba\x3e\x50\x34\x0a\x4d\xc5\x50\xd5\x9b\xac\x37\xb3\xcb\xa6\x5e\xde\x0a\x15\x5f\x85\x07\xd5\x57\x94\xcd\xb9\xf9\x17\xaa\x26\xe6\x17\xf3\xcb\x78\xe9\x6e\x5c\x3e\xdd\x0c\xa5\xc3\x40\xb5\x6b\xc8\x0c\x8b\x68\x38\x9d\x5a\xc7\xb2\x16\x85\xd1\xc9\xf5\x58\xbf\x7a\x18\xe7\x2a\x5d\xfc\xf9\xdd\xa7\xe7\x2f\xe0\x1c\x8b\x2e\x45\x5c\x00\x3a\x71\x5f\x31\xc4\x44\xc3\xbc\x14\x62\xb7\x93\x25\x94\x73\x67\xe2\x50\x2a\xa6\x83\x25\xa7\x75\x7c\x7a\xe4\x40\x6c\x54\x8f\xd4\x4f\x6d\x3c\x89\xd1\xff\x5e\x81\x36\xba\xd5\xdd\x2d\xe5\xa1\x73\xc8\x73\xe9\x96\xae\x21\xf6\x47\x57\xdf\x86\x25\x97\x9d\xe2\xc7\x2c\x89\x53\xd8\xf9\xe5\x38\x5b\x95\xe5\x9a\x19\x60\x24\x2b\x84\x9d\x6c\x3d\x15\x7f\x0c\x14\x62\xc3\xd6\x51\x42\x85\xb5\x06\x91\xde\x6b\x69\x40\x13\xaf\x26\x02\x07\xc3\xc8\x25\xdb\xfc\x79\x79\x43\x0c\x16\x6d\xbc\xa4\x63\x02\x08\x94\xc1\x62\x26\x33\x61\x08\xd5\x58\xd3\xfb\x98\xac\x53\xb9\x70\x3d\x4e\x81\xfe\x0e\xab\x13\x5f\xbb\x7b\x9e\xa3\xa7\xd5\xbb\xf7\xff\x71\x9a\x92\x12\x45\x23\x9e\x9c\x6a\xa8\xb0\x27\x91\xf7\x1b\x6f\xfa\xf2\xb2\x81\xa2\xc0\xae\x55\xa4\x36\xfd\x4e\x1f\x28\x84\xd6\x53\x2c\xd6\x53\x0c\xc3\x1b\x66\xff\x46\x8e\xb5\x69\xf6\x29\x2b\xd2\x24\x9b\x33\x2b\x01\xe6\x96\x49\x50\xbe\x3a\x6f\x02\xe5\x62\x42\x5f\x84\xa9\xb1\x5d\x86\xbf\x28\x26\x9a\xde\x5c\x96\x51\xf9\x76\x95\xa9\x56\xa9\x2a\x9b\x40\x45\xfb\x2c\x7b\x91\xd8\x64\x72\x65\x78\xc3\xd4\x37\x5a\x47\x31\x58\x47\x51\x9e\x2d\x30\xd8\xa2\xd2\x96\xd5\x7d\x7d\x91\xcd\xde\xc0\xba\x07\xc7\xdd\xaa\x8b\xa2\xe8\x51\xa2\x2c\x9b\xf9\x2c\x5a\xdb\x67\x22\x92\xe7\x4a\x55\xb5\xfa\x17\x0e\xc8\xb6\xcd\x66\x18\x96\x90\x02\xa8\xd5\x05\xb2\xd3\x05\x32\xa7\x16\x08\xc5\x11\x5b\x5d\x9c\x62\xa6\x2b\x64\x8f\xaf\x50\xad\x1c\x88\x33\xa5\x6e\x94\x84\xfd\x40\x15\x73\x29\xe6\xd8\x0a\x19\x14\xb2\x9a\xae\x50\x0f\xef\x01\x35\x82\x8e\x2a\xf4\x43\xab\xd3\x77\x97\xa8\x48\xe7\x90\xfb\xdf\xde\xb7\xe7\xd0\x3b\x18\xc4\x85\x16\x13\x55\xcf\x2c\xa6\x5c\x8e\x39\x2b\x01\xa7\x4b\xb9\xcd\x14\x9d\xd1\x66\xe5\xd8\x38\xae\x7b\x88\x33\x12\x29\xc5\xd7\x92\xcc\x8a\x51\xea\x3d\x95\x36\x50\xc8\xba\x48\x97\xb0\xcf\xf3\x98\xc6\x14\x54\xea\x13\xb9\x04\x3d\x92\xa2\x47\x8a\x2b\x4c\xd1\x08\xb7\x7a\x49\xaf\xc7\x13\x0b\x77\x40\x8c\xf8\x4a\x44\xc1\xf8\x95\x4e\x2d\x9b\x43\xdb\xc1\x95\xab\xfb\xa6\xfd\xf0\xf7\x5f\xba\xca\x57\xa7\x05\x50\x24\x32\xd7\xb5\xc8\x3b\xcb\x0b\xae\xe7\x09\xa3\x03\x05\xd4\x1f\x31\x42\xd9\x6d\x2d\xf2\x05\xce\x9f\xb0\xac\xf2\x73\x71\x26\x91\x4f\xb5\xe9\x51\x82\x95\x41\x2f\xa5\x10\xbb\xcd\xb4\xf2\xa7\x62\x7f\xc8\x96\x99\x82\x3c\x3d\xe2\x09\xe5\x1c\x69\x99\xc9\x2b\xec\xbc\x4a\xf5\xbe\x3f\x4d\xc3\xf1\x5e\xf1\x5b\xa6\x58\x5a\xd4\xe1\xcd\x69\x53\x48\x92\x29\x7d\x6d\xb9\x9a\x6b\x5e\xe9\xc9\xed\x74\x6c\xcf\x83\x39\x29\xa3\xca\x60\x6a\x6d\xad\x45\xc6\x81\x8a\xd7\x99\xcc\x49\x98\xbc\xce\x21\xdd\x4d\x3c\x91\xa2\x48\xea\x98\x74\x8b\xcd\x94\xc3\x4e\xd9\xcf\xd6\xca\x4e\xc8\x2f\x23\x35\x79\x6c\x8c\x30\xb2\x15\x47\x61\x6a\x9f\xb8\x27\x26\xfc\xfc\xbc\x69\x4f\x1b\x6a\x22\xca\xa8\x33\x31\x2f\x13\x65\xbf\xca\x86\x1b\x12\xbf\x40\xbc\x3a\x9a\xde\x34\xa1\x50\xf4\x5b\x6a\xd2\x26\x29\x03\x43\xd3\x4b\x3a\x09\xc5\x33\x61\x99\xe2\xda\x34\x5d\xd0\x71\x53\x28\xfa\x45\xd1\xd5\x28\x75\x49\x70\x27\x10\x47\x23\x5b\x4b\x4d\x59\x14\x12\x5d\xcf\xfd\x36\x0e\x2d\x8c\x55\x9e\xe1\x50\x9b\x0e\x50\xca\xe8\xb9\x50\x09\x26\xeb\x1a\xe7\xba\xd0\xe8\x07\x45\x0f\x59\x65\x30\x15\x49\xfb\x5a\x72\x96\x32\x83\xf5\xab\x14\xa6\xc4\xc6\xfd\xc6\x3a\x4c\xfb\x6e\xfa\x48\x43\x60\x52\xa8\x04\x1b\x64\xa5\x22\x56\xdc\xcc\xc1\x98\x88\x45\x05\xa2\xd0\x03\x52\x29\x67\x2f\x1b\x06\x4a\x46\xba\x42\x7c\x4d\xe8\xda\x7e\x33\x4b\x28\x9b\x3e\x01\x96\xf2\x12\xe5\x9c\x05\x80\xdc\xcc\xef\x15\x8f\xfe\xe6\x80\xd4\x0d\xd4\x1b\x50\x6f\xdf\xd4\x3e\x94\x87\x01\x7c\xbe\x36\x1d\x6c\xed\xfd\x0a\x6f\xa3\x76\xad\x78\xf2\x69\x67\x29\xca\x66\x86\x17\x96\x55\x21\xb7\x42\xac\x5a\x0a\x47\x13\x69\xc8\xd4\xe9\xc9\x67\xe3\xfc\xd2\xe9\x32\xe7\x6c\xd0\xf4\x3c\xc5\x47\x5b\x28\x38\x64\xaa\x77\x50\x0b\x7d\xde\x8c\x17\xbd\xb2\x93\x4c\x7a\x33\xee\x79\xc9\x97\x96\x47\xf4\x92\xf0\xe8\xae\xfe\x1d\x76\x0c\x36\x93\xaa\xd5\x1a\x6c\x66\xcf\x65\xb8\x72\x99\x85\x54\x0b\x76\xee\xa5\x11\x0c\xec\x7a\xdb\xde\x21\x5d\xff\xeb\xc7\xcd\x5f\xfe\xf2\xee\xf9\xb4\x09\x36\x52\xf0\x46\x1a\x15\xa2\x28\xe7\x3d\xb4\x60\xd5\xa6\x0c\xbf\xc7\x14\x5a\x26\xe4\x56\x5b\x8c\x1f\xe9\x4e\x18\x12\x45\x95\xb6\x44\xe9\x58\x64\x85\x8b\xe2\x87\x8f\x55\xcb\x8a\xa0\xb4\x27\xdc\x8b\x52\x44\x3a\x39\x95\xcf\x67\xdf\x1b\xc6\x72\x47\x2e\x2b\x09\xdd\x4d\x07\xa4\x12\x70\x8a\x5b\x4b\x21\xcf\x6e\xa8\x2c\x7d\xc9\x51\xd6\x97\x50\x59\x45\x9c\x46\x29\x2f\x6e\x28\x23\x37\x6f\x0f\xdf\xa0\x1d\x17\x1e\xa4\x24\xfd\x03\x63\x99\x8f\xf3\x6e\xc6\x5e\x41\xd2\x07\x9e\xae\xb4\x2e\x8e\xae\x10\xbc\x5b\x15\x39\x97\x92\x28\xb8\x63\x70\xd1\x35\x53\xa1\x15\x85\x5f\x91\x6a\x30\x8f\xe9\xab\xff\x8e\x62\x83\x3d\xe3\xfa\x76\xb9\xbb\xbe\xa7\x50\x37\x97\xaf\xb5\x8c\x67\x0d\xbe\xc2\x54\x70\xec\x93\x0e\xd6\xb0\xd2\x08\x1f\xeb\x7d\x31\x59\xdc\xe1\x1b\x17\x8c\xea\x58\x30\xf9\x58\x38\x73\x11\x59\x2d\xc2\xf3\xc0\x62\x22\x74\x9d\xb2\x71\xba\x0f\xa0\xa9\x9b\x9c\xaa\x42\x2a\xcf\x94\x65\xaa\xea\x86\x53\x01\xd4\xc9\x5e\xb2\x66\x67\x03\xf9\xbc\x98\xdd\x51\x56\x96\x0d\xab\xec\x55\x78\x85\x52\xbe\x2c\x1b\xd4\x10\xc9\x83\xd0\x9b\x29\x8a\xcd\x5b\x95\x5a\xb2\xea\x58\x79\x88\x68\x8a\x2a\x21\x3a\x92\xb2\x85\x93\x06\x37\xb0\xcb\x36\x7d\x46\x19\x6c\x41\xda\xbf\x04\x88\x90\x0b\x6e\x90\xff\x15\x6d\x05\x5d\x42\x16\xcf\xb0\xc1\x48\xd2\x20\x5a\x42\x9e\x54\xa9\x4c\x52\x6d\xfa\xc7\x9b\x8c\x3b\x4b\x55\x1f\xd2\x22\x50\xd2\x09\xa5\x21\xf2\x06\x15\xbb\xfd\x0c\x44\xb5\x6c\xf8\x25\xca\x53\x3a\x67\x69\x7b\xfb\x6b\xfb\xe1\x1f\x47\xd9\xee\x05\x8c\xad\x2b\x39\x24\x28\xbc\x32\x93\x07\x33\x05\xd7\xda\xac\x60\x2a\x53\x23\xb6\xd3\x66\x85\x55\xf4\x71\xcd\x8e\xe6\x89\xd5\xc7\xd6\x6c\xfd\xfc\xd3\x4f\xc7\xb1\xec\x02\x1e\x58\x73\xb2\x29\xff\xe6\x86\x92\x6b\xad\x2a\xb3\x9c\x46\x46\x1a\x0a\x94\xd3\x8e\xc7\xd3\xc0\xa5\x16\x4f\x86\xc9\x51\x5c\xd3\x16\x3b\xbb\x48\x4a\x6a\x69\x67\xc7\x1f\xb0\xf5\x62\x6b\xf1\x74\x1a\xdb\xe8\x87\xa1\x3c\x3d\xb2\xee\xab\xd4\xe4\xd6\x26\xeb\xd7\xaa\x09\xf8\x36\x19\xff\xf4\xc8\x62\x44\x05\xd3\x8c\x42\xc6\x39\xd5\x0a\xc3\xaa\x8f\x62\x3f\x57\x11\xf1\xe9\x25\x9b\x48\x4d\xb1\xc9\xf8\xb5\x08\x5e\xb5\xfe\x55\x00\x3b\x6d\x24\xfb\x9e\x96\xf5\xb4\xd5\xab\xb3\x06\xfb\x58\xe1\x38\xb1\xb7\x35\x3a\xc4\x98\x4d\x58\x01\x86\x6d\x21\xd6\x35\x90\x78\x4b\x9f\xae\xf6\x29\x46\xd2\xa4\xbf\x8a\x27\x2b\x5d\x46\x47\x3e\x2a\x0e\xac\x50\x17\x5d\xf2\x2d\xdd\xf9\x9f\xfa\xa3\x22\x7c\xb6\xcd\x14\xac\xa7\x1c\x0f\x90\x6e\xad\x5d\x95\x0e\xa5\xc3\xb4\xcb\x09\xd1\x2f\xdf\xb6\xef\xfe\xbf\x7b\xd0\x3c\xf6\x12\x76\xd8\xef\x0a\xed\x7d\xba\x7d\xb1\x4c\x51\x47\x5a\x94\x59\x27\xd7\xdf\xed\x0c\xa0\xaa\x51\x14\x72\x8a\xc7\x54\x64\x31\xbc\x6a\x86\x0f\xde\x8b\xd6\x1d\xd5\x94\x06\x2a\x4d\x1c\x0e\x11\x27\x68\x8d\x6e\x07\x87\x23\x64\x47\xc9\x1b\x0e\xe3\xf1\x8d\x3e\x77\xeb\x00\x3b\x2c\xe2\xa2\x1c\xdf\x35\x24\xee\x75\x30\x6c\x86\x11\x4a\x43\x78\xb5\x29\x93\x31\x0e\x5f\xbc\x75\x8c\x3d\xea\x75\xa5\xb8\xa8\xf8\xa3\x63\xd4\x4d\xd1\x3a\xdd\x35\xe7\x50\xe4\x15\x17\x42\x2a\xe4\xbc\xa0\x5c\xf6\xd5\xf5\xcd\xe8\x93\xb7\x0e\x32\xfc\xb4\xb7\x7d\x45\xa3\xfa\xe3\x06\xe6\x3e\x34\x9d\x2a\x88\x5a\xfb\xc1\x21\xf5\xb3\x33\x1c\xb6\x42\x28\xda\xe1\x9d\x52\x52\xda\x04\x8a\xb0\x93\xf5\x8c\x23\xd8\x4c\xec\x97\xba\xda\xb1\xb5\x6c\x64\x1b\x49\x64\xd1\x7b\x7e\xee\x0f\xb7\xf7\x5d\xde\x3a\x87\x9e\xd9\x8a\x0a\x62\xaa\x7b\xa8\x7c\x13\x9c\x09\x7d\xe4\x73\xa3\xcc\x26\xaa\x1a\xb3\x2c\xe4\x58\xa7\xe8\x0d\x9a\x5e\x6c\x0a\x48\xe6\x95\xcc\x7c\x90\xb5\x0a\x49\xf0\xad\x27\x89\xaa\x63\x4f\x0b\x6a\xa4\x62\xa9\xac\xe0\xe7\xda\x50\xf6\x8b\xa0\xdf\x08\xbd\x8f\x33\xce\xd7\x51\xe9\x6d\x3e\x9c\x02\x71\x0b\xe5\x3b\x54\xad\xf2\xde\xc4\x0e\x92\xde\xa0\xd9\x1b\xc8\x4c\x54\x22\x0f\xe4\xb2\x41\xd3\xdd\x40\x6c\x8a\xf3\x5b\x45\x9e\x96\x2d\x7c\xac\xbd\xd3\x89\x65\x83\xa6\x9f\x98\x88\x72\x6c\x60\x12\x2b\x76\xeb\xd6\xa3\x42\x91\x57\x39\xd1\xef\xe3\x20\x88\x03\x25\x9d\x79\x48\xb5\xe9\x49\xc5\x93\x77\xc8\x5e\xae\x92\xa0\xc8\x64\xb3\x4a\x85\x4a\xeb\xa9\x51\xc0\xf0\xc1\xdc\x47\xcb\x71\x8f\x9d\x54\x54\x79\xe7\x42\xd1\xe9\xe2\x06\xd8\x5f\x87\xc5\xf5\xba\x55\x2c\x95\x19\xc5\x8d\x57\x89\xd9\xef\xbd\xdd\xb1\xb0\x30\x66\x34\xa9\x36\x1d\x01\x22\x95\x3a\xbb\x56\x85\x66\x9b\xfa\x5a\x35\xd1\x59\x51\xd6\x15\xc8\x29\x43\x85\x51\x25\x6e\x46\x52\x7e\x47\x9c\x6e\x95\x28\xc3\x7f\xc2\xe5\x8d\xc0\x78\x59\xa5\x73\x6c\x29\xaa\xcb\x88\x11\x5d\x66\x19\x19\x52\x29\x06\xc3\x4a\x48\xcc\xa6\x50\x38\xf2\x59\xe5\x9c\xbd\xd1\xb4\x21\x1c\x59\xb0\x92\x99\x28\x72\x28\x78\xc7\x44\x26\xcb\x71\xed\x1a\x2a\x14\xe2\xca\x61\x13\x68\x28\x97\xe9\x1b\x26\x18\x7d\x43\x51\x2e\x00\xe7\xdc\x1e\xe7\x0e\x1f\x52\xfc\x1c\xef\x90\xc5\x59\x7d\x0d\x49\xec\x33\x89\x22\x7a\x67\x7c\x1f\x16\xbb\x5f\x1e\x38\x15\x24\xe4\x7f\x0f\x69\x31\x9d\x61\xc6\xd9\x10\xb7\x4a\x6d\x39\x0f\x37\x19\xce\xfb\xf0\x62\x84\x3d\x36\x4f\x20\xa3\xca\x6b\xb4\xaa\x54\x3d\x4a\xc1\x17\x7c\xdd\xa7\xd3\xe8\x39\xee\x4e\x60\x82\x83\x58\x39\xbb\xd5\xad\xd9\x99\x6d\xfd\xbf\xb5\x9b\x4f\x67\x6c\xe4\x10\xcd\x04\x7a\x89\x60\x81\xb2\x5f\xfb\x2d\xcf\x7d\xc9\x64\x26\xe8\xf1\x1a\x8f\xae\x3c\x05\x38\x9c\xbb\xb8\xf0\x24\xc5\xa0\xe9\x41\xee\x84\xb2\x22\x6c\xd7\xd4\xcb\x19\x7c\xd7\x2f\x25\x6f\x3c\x89\x37\x68\x3a\x60\x2b\x57\x8a\x94\xaa\xd9\x3c\x07\xe3\x78\x23\xaa\xf9\x49\x3d\xac\xa8\x55\x78\x79\xa9\x78\x09\x24\xec\xaf\x29\xa9\xc2\xf9\x4f\x54\xac\x93\x21\x2e\x82\xa4\x58\x21\x4e\xad\xb2\x74\xef\x0d\x7b\xb0\x37\x07\xce\xd2\x50\x48\x2b\xae\xa9\x8d\xe2\xda\x6f\x23\xb2\x70\xea\xe6\x5a\xf1\xbf\x09\x0b\x04\x2d\x48\x7f\x00\xcb\xa6\x1f\xd6\xdd\x8e\xf9\x59\x55\x4d\xa5\xf3\x0e\xfa\xe5\x38\xf4\x0f\x0c\xea\x4b\x76\x6b\x3c\xae\x2b\x90\xb1\x02\x3c\x09\x11\x00\xe1\xa4\x6c\x9c\xae\x8b\x33\x7e\x38\x44\x86\x85\x51\x12\x65\x5d\xb2\x31\x47\x69\xaa\x01\x0f\x6b\x36\x7d\x65\x18\xe6\xd3\x63\x07\xb0\xb2\x07\x58\x59\x09\x0c\xaf\xe2\x96\x0a\x9d\xeb\x4e\xdb\xa7\xfe\xee\xbf\xbc\xbc\x7b\xff\xee\xd3\xe7\x8f\x9b\xcf\x1f\xce\x94\xaf\xf4\x88\x06\x52\x05\x68\x13\x29\x45\x83\xa6\x52\x85\xfe\x54\x4c\x0a\x0b\x55\xa2\x4d\xdc\x5b\x12\xcc\xe8\xad\xa7\x97\x06\xa7\x34\x0a\xb8\x7a\x4e\xd5\x17\xd2\xd8\xff\xbd\x18\xdf\x69\xaa\x89\x16\x91\x37\x97\x24\xd3\x3f\x6f\x53\x8f\xd8\xb2\x98\x62\x5e\xd4\x02\x11\x83\x59\x9a\x03\x65\x84\xfe\xad\xc5\x63\x8f\xaa\xca\x1e\xda\xee\x09\x56\xed\x4e\xc7\xd4\xc2\x44\x30\x25\x0c\xa3\x1b\x00\x53\x0e\x2d\xb1\x58\x62\x7e\xb6\x38\x78\xb2\x6c\x3b\x8a\x89\xfa\x63\xa1\x63\x48\xa6\xb6\x1d\x7e\xe9\x67\x54\xce\x19\xb3\x61\xa1\xb8\x9e\xa6\xff\x54\x3c\x8c\x74\x37\xdb\xb9\x54\x35\x36\x92\x94\x0d\xb9\x54\x43\xce\x7a\x51\xad\x51\x99\xa5\xdf\xd9\x1b\x8b\x4b\xa7\x62\xb8\x2f\xb7\x2d\x22\x96\x0a\x55\x55\x5a\x2b\x96\x22\xcf\x2c\xe3\x0d\x72\xcc\xc0\x29\x59\x99\x71\x8e\x0b\x72\x79\x60\x6a\xa8\x0a\x0e\x4f\x75\x94\x2c\x0a\x1b\x72\xa3\x50\x1e\xf2\xde\x52\x83\x8a\x46\xca\x59\x66\x87\x4b\xf0\x5b\xd6\x7d\x88\x5b\x6d\xac\xcc\x5e\x76\xba\x45\xf8\xa5\x38\x58\xb9\xa7\xb7\x02\x44\x51\x15\xeb\x64\x93\x4c\x1a\xbe\xe7\x55\x00\x63\xca\x62\x79\xa3\x8f\xb9\xbd\xd5\xcf\xab\x1e\xb5\xe2\x44\xb1\x18\x56\x38\x0f\xd3\x50\x64\x20\xef\x5b\x9c\x74\xc9\x8c\x74\x9a\xea\x8e\x5f\x0b\xc4\x19\x8a\xb3\xa1\x48\x24\x17\x76\xa2\x4c\x73\xdc\x9f\xe1\x68\x24\xb6\xfa\x02\x0f\x23\x34\x14\x4d\x75\xf0\xd6\xae\x0a\x4f\xbe\x65\x30\x0a\xd7\x72\x3d\xf3\x04\x30\x47\xa0\xd6\xb9\x35\xa9\x65\xca\xc9\x2a\x28\x9b\x62\x52\x7f\x4a\x06\x4b\x03\x85\xd4\x52\x34\x32\x7b\x0d\xb0\xda\xea\x00\xc7\xb8\x85\x1b\x3a\xfa\x16\xa0\xd7\xbb\x2a\x98\x42\x3a\xdd\x7f\xd2\x65\xab\x1f\x65\x55\x54\xe6\x63\xd5\x95\x6b\xd2\xca\x41\xb7\xf2\xd3\xb9\xe3\x62\x8b\xdd\x3b\xe7\xf1\xec\x81\x4a\xae\xb4\x15\xd3\xa6\x1f\x54\x89\xc0\x85\xb5\xa8\x74\xb7\x98\xdc\x1a\x21\xe9\xd3\xa3\x78\xdd\x89\x24\x6f\x1c\x39\x95\xf9\x11\x3e\xc5\x38\x8f\x74\x4e\xd5\x2e\xb7\x18\xdf\xc1\xe6\xd5\xbd\x72\xa3\x5d\x7b\x14\x06\xa5\xdc\x30\xd5\x48\xa8\x4c\x0e\xb1\x50\xf3\x28\xff\xab\xbc\x7a\x15\x0b\x95\x27\x66\x51\x09\x34\x40\x8c\xef\xa5\x5b\x97\xad\x50\x08\x2d\x05\x07\xc8\x36\xc5\xea\x64\x0f\x78\x67\xd5\x2f\xbd\x02\x32\x95\x0d\xc4\x38\x19\x0e\x47\x55\x68\xd2\xe5\xd6\x55\xad\x5f\xb0\x14\x94\x58\xe0\x40\x28\xc3\x79\xa5\xa2\x87\xa8\xcc\x5b\x75\x53\xde\x9b\x8d\x1b\x2b\xe4\x94\xab\xc6\x05\x43\x60\xe4\x91\xd8\x08\xee\xd9\xa4\x9d\x0a\x8c\x53\x37\xfd\x25\x26\x77\xa7\x90\xe1\xa4\xdd\xf8\x58\x59\x96\x6e\x82\x2a\xfb\x26\x37\xe5\x58\xd2\x71\xac\x19\x1f\x68\x92\x85\x0a\xd4\xf3\xac\x38\x63\x05\x15\xb1\xc1\x44\x02\x78\x56\xf2\x06\xcd\x84\x67\x0d\x2c\x6b\xfc\x2e\x58\x56\x00\xcb\xf2\xf3\x5b\x3d\xcb\x32\xb2\x41\x3c\x67\x1c\x4e\x24\x74\x28\x60\x83\x4c\x99\xc1\xb8\x26\x03\x52\x8d\x0c\xe3\x85\x4e\xe3\x27\x64\xac\x63\x1d\xb1\xae\xa4\x42\x65\x1a\x24\xcb\xca\xba\xb2\xab\xac\x8b\x4f\xf2\xae\x03\x5a\x24\x17\x7a\xe6\xa5\x92\x6d\x1a\xc4\xdb\x29\x0b\x9b\xf1\x14\x0c\x06\xba\x69\x34\x6e\xce\x89\xea\x44\xbe\xcc\xc0\xea\x78\x26\x3c\x2c\x8e\x78\xd8\x94\xb9\x75\x3c\xac\x67\x61\x31\x9b\xd8\x8b\xc1\xc7\x58\xd8\x74\x3c\xca\xf8\x3b\x16\x16\xe6\x9f\x6e\xa2\x82\x7e\xcf\xc5\xe6\xdc\x91\x42\x52\x5e\x96\xf7\xbc\xac\x90\xdb\x83\x48\x52\xcf\xcb\xb2\x2c\xc8\xd3\x28\xd0\xbc\x43\xdd\xa7\x17\x0b\xeb\x8b\xa7\x24\x27\x59\x99\x3f\xca\xca\x92\x91\x4c\x27\x42\x9a\xbf\xe8\x70\x3f\xb5\x7c\x6e\x3e\xfe\xf2\xe7\x8f\xe7\x62\x7d\x9c\x37\x79\x96\x72\xfd\x8b\x91\xae\xf3\x9a\xf6\x4f\x8f\x4e\x86\x64\x6b\xeb\x8b\xf8\xf0\x31\x76\x39\xe2\xc3\x91\x84\x2b\x1b\xe6\x86\x24\x80\x11\x33\x7e\xdc\x22\x97\x8d\x3a\x50\xbd\xe7\xc6\x1e\x8e\xc9\x5f\x47\xa7\x80\xfa\x6a\x57\x74\xf0\x85\xbd\x6a\x34\x85\x6b\x7b\x38\x1f\x57\xc3\x30\x50\x64\x55\xd5\xc6\xa6\x46\xae\xd1\xdf\xc5\x76\x17\xb3\xaf\x4d\xc7\x7b\x0a\x13\xa3\xac\x1c\x47\xe2\xb8\x11\x84\x2d\x68\xd3\x6d\x3f\x01\x4e\x17\x15\x91\x18\xfa\x2f\x8c\x39\xbe\x36\xdd\x43\x8d\x52\x37\xdc\x71\x92\xee\x47\x8e\x82\x83\x69\xb3\x27\xff\x61\x68\xf7\x3a\xbe\x65\xb8\xb0\x09\x4c\xd0\x30\x41\xa6\x7d\x9e\x2d\x9b\x28\x06\x34\x26\x51\xe8\x9a\x5e\x1d\x4f\x56\x56\x70\x94\xe0\x40\xf0\x73\xf3\xa6\x8c\xd8\x74\x82\xf2\x59\x50\x1c\x29\xc6\x45\xd2\x39\xa6\x61\xa2\xa3\x5e\xaf\x3f\xe9\x7c\x38\x08\x6d\x00\xdc\xf2\xa8\xcc\x5e\x63\x29\x5b\xca\x4b\xf1\x14\xa3\x8e\x32\x9a\xb2\x8f\xe5\xb7\x38\x2e\xca\x70\x44\x72\xb1\x36\x7b\x81\x20\xab\x06\x51\x0d\x6e\xc1\x6f\x54\xc9\x36\x69\xf0\x75\x16\xe5\xd2\x8b\x19\xbc\xa0\xf9\xa7\xa5\x34\x93\x62\x8d\x95\x6d\xc7\x6d\xa4\x51\x41\xc3\xc6\x8c\x86\x7b\x01\x04\x8e\xa6\x43\xbf\x2c\x7b\xe4\x9c\x9b\x1d\xa6\x83\x7c\xec\xf1\xaf\xd5\xb9\x93\x97\xcd\x14\x4f\x75\x8f\xce\x14\xf6\xb8\x8c\xcf\x98\x29\xc2\xe3\xa0\x55\xa5\x8e\x1a\xcc\x04\x8b\xee\x98\x60\xd8\x50\x61\x8b\x42\x1e\x13\x12\x63\xbb\xff\x7b\x86\xfd\x6c\xfa\x61\x3d\x3d\x06\x14\x12\x5f\xf4\xae\x1e\x61\x6f\x0a\x6e\xb0\xbe\xc1\x8c\xef\x54\x67\x35\x7d\xe1\xe9\x05\xde\x42\x4d\xdc\xcc\xdf\xec\x3d\x83\xc2\xe2\xe8\x9b\x92\xa9\x89\x4f\x2f\xdc\xa0\x18\x7d\x72\x8b\xa2\x8b\x57\xfa\x00\x19\x78\x17\x54\x4a\x50\x90\x05\xf2\x2a\x0e\x8c\x29\x46\x65\x13\x25\xfe\x29\x1d\x34\xd5\x4c\x67\x84\x42\xda\xc2\x70\x80\xc1\x97\xa1\xf7\x8e\x4e\x12\x39\xf7\xf4\xc2\x62\x33\xa5\xad\x8d\x14\x0e\x0a\x49\x2e\x65\x4e\xbe\x8d\x4d\xba\xa5\x47\xea\x10\x77\x8f\xbd\x8d\x8a\x4e\x10\xdd\xba\xa3\x83\xcd\x14\xfd\xd9\x08\xa4\x0c\x27\x8b\x29\xc1\x60\xb7\xc6\x21\xc5\x56\x28\xc5\x83\xea\x9d\x4f\x2f\x4e\x45\x86\x42\xde\x5d\x00\x60\xd7\x50\xde\x43\xb8\xb1\x9c\x28\x5c\xb2\x3e\xf5\x75\x6e\x4e\x94\x28\xb9\xcc\x5e\xb5\x97\x1f\xfe\xfc\xee\xd3\x7f\x7c\x3a\xe3\xad\x66\x02\x25\xbf\x60\x9c\x20\xee\x45\x69\x05\x8f\x44\xe3\x97\xee\xe8\x4d\xbc\xb3\x96\x46\x39\xc7\xfc\x26\xce\x22\x45\x96\x7e\x1d\x97\x72\x6b\x42\xd6\x91\x6b\x8e\x29\x47\x87\x92\x75\x9c\x79\x99\x8e\xdd\x8c\x78\x07\x86\xaa\xc3\x71\x42\x6f\x90\xb8\xcc\x6b\x6e\x96\xee\x54\xc1\xc0\xab\x1c\xd4\x22\x02\xd0\xf8\xd8\x90\x18\xc9\x42\x74\x50\xf9\xd8\xa0\xf0\x92\x71\xcd\x12\x9f\x39\x84\xad\xaf\x13\x5e\xf3\xd1\x75\xe9\xfb\xee\xa5\x3a\x96\x35\xfb\xe5\x2d\xee\x8f\x0f\xf3\x34\x08\xc5\xc3\x3f\x2a\x6f\x44\x29\x5f\x2a\xf9\x23\x98\x96\x92\x15\x8a\xaa\xf4\x46\x55\x56\xf7\x47\x53\xa3\x97\x94\x28\x1c\xe5\xa4\x34\xe1\xe1\xd8\xd6\x9f\x25\x74\x41\x1b\xc8\xaf\xa3\x9a\xd4\xe0\x65\x8e\xb7\x59\xe5\xa4\xbb\xc5\x45\xd7\x4f\x46\xc4\x1e\x50\x51\x39\xbf\xf4\x7c\x59\xf7\x79\xa4\xad\x51\x3d\x31\xf1\x5a\x64\xeb\x95\x05\x52\xa2\xc1\xa7\x09\xb5\x90\x22\x39\xde\x44\x72\xaa\xdd\xba\x5e\xbb\x8d\xe4\x92\x0d\x94\x54\x83\x0c\xb9\x36\xfb\x77\x32\x71\x6a\x55\xd9\x65\x72\x69\xe1\x55\x27\xf6\xbd\x62\xbc\x9f\x68\xbc\xcc\xc7\xef\x4b\x59\x2b\x14\xf2\x89\x24\x6d\x60\xd1\x8d\x7b\x53\x25\xce\x0e\x55\x8d\xc1\x44\x8b\xdb\x04\xd3\x1b\x33\x74\x61\x00\x84\xc2\xb5\xa9\x97\xe1\xc9\xa1\x84\xcf\xb1\x36\x23\x31\x2f\x95\x15\x3b\x8a\xce\x48\x33\xb2\xf8\xc1\xa7\x71\x01\x8f\xef\xd8\x3b\xbf\xed\xd1\x21\xdd\xd1\x6d\xef\x5b\xf3\xb0\x2b\xcb\x07\x7e\x5b\xfe\x75\x55\x32\x8e\x82\x83\x2d\x21\xed\x2d\x20\x90\x3c\xf4\x7b\x62\x36\x52\x9d\xe3\x61\x63\x88\xc3\x6a\x76\x6f\xdc\x23\xc6\xfc\xfb\xe0\x9d\x75\x4e\xac\xf0\x55\xed\x1f\x2a\x3f\xef\x25\x3a\x87\x93\x16\x56\xed\x3f\x18\x37\x24\xb8\x1a\xbd\x85\xfc\x58\xaa\x42\x6d\x52\x8d\x05\x28\xbd\xef\x43\xb6\x49\x89\x48\x25\xe5\xda\x74\x44\xc4\x95\x05\xb6\x4c\x29\x90\xdb\x04\x95\x5f\xc2\xc8\x18\xc4\xf5\xfc\x88\x73\x6d\x3a\xec\x20\x81\x27\x1d\x32\x74\xd5\x92\xfe\x3d\x71\x23\x3a\x72\x2b\xc4\x0b\x95\x45\x0c\x9a\xf1\x30\x25\x53\x4e\xf5\x40\xb3\x20\x0b\x9a\x6a\x15\x2e\x2a\x35\x78\xbf\x55\x5e\xb5\x88\xc4\xc5\xc4\xde\x45\xbf\x5f\x69\x04\x7d\x7b\xed\xd6\x8f\x38\x1b\xab\x80\x6d\xab\xcd\x2e\x6d\xb2\x72\x87\x3c\x36\x6b\xe6\x68\x55\xbe\x1c\x42\x04\xe1\x74\xca\x5b\x05\xf9\xd8\xe3\xb9\xf3\x74\x78\x2d\x2e\x9d\x4b\x04\xf0\x2f\xeb\xc7\x33\x59\x52\x92\x11\xdd\x1a\x0f\xea\x87\xce\x8a\xde\xcd\xf5\x0d\x09\x63\x8d\x44\x3f\x02\x57\x48\xf6\x4b\x09\xbb\xbc\xbc\x39\xa8\x65\x56\xcb\x21\x1e\xab\xe6\x72\x41\x4d\xb6\x73\xb9\xe7\x87\x7a\xd5\x71\x5c\xac\x3a\x5d\xd5\xd1\x59\xa2\x0e\x94\x4d\x5e\xc2\x1b\x74\x1d\xb7\x96\x79\x95\x28\xa9\x46\x3d\x3d\x3e\xb6\xd5\x25\x64\x9a\x37\xa7\x59\x89\xe9\xd2\x4e\x32\xd3\x24\xb9\x4c\xcd\x17\x3b\xfb\xc0\xdd\x64\x04\x29\x38\xbf\xf2\x2a\xe9\xcc\xc7\x34\xee\x14\x8e\x2c\x2b\xd7\x10\x4a\x16\x20\xd4\xda\x35\x54\x13\x68\x6d\x66\xcf\x8d\x23\xaa\x09\x46\xdb\xf1\xdf\x6c\x49\xca\x4a\x99\x54\xa1\xe6\xd6\xc4\x2a\x7b\x44\x72\x35\xfd\x71\xbe\x11\x93\xce\x95\x60\x2b\xf3\x2e\xae\x46\xa3\x73\xde\xdf\x3f\xff\xfc\xe7\x1b\x4b\x4d\x7c\xd9\x58\xa0\x2a\xb5\x74\xa6\xd0\x1f\x76\xd0\x3f\x94\x1d\x14\x5e\x7c\x51\x9e\x99\x9c\xe8\x6e\xce\x54\xaa\x3f\xbb\x0a\xb8\x4c\x22\x9f\x2c\x05\x87\x10\x1c\xdb\x89\x3e\x4d\x19\x85\x49\x8b\x12\x28\x13\x73\x6b\x29\xab\x00\xd4\xc4\xbd\xc8\x0c\x53\xaa\xa8\x54\xef\x9f\x6b\xf8\x32\x5b\x46\x2b\x14\xe4\x53\xcd\x0c\x20\xd4\x68\x93\x13\xe2\x22\x9f\xab\xbf\x0f\x39\xcb\x54\xc4\x52\xf0\xf5\x07\x93\xf0\x81\x59\x40\x07\x1f\x36\xf3\xec\xaa\x02\xa6\xd8\xe2\x50\x8a\x78\x01\x8f\x1b\x3f\x1c\xf6\x55\x59\x29\x16\xed\x49\x65\x1c\x8b\xc9\x05\xeb\x8c\x90\x2f\x3f\x43\xea\xe4\x6a\xb7\xeb\x60\x73\x37\x2b\x2c\x04\x1b\x69\x54\xab\xb8\x07\x00\x7f\xe6\xa2\x5a\x12\xc3\x78\xcb\x19\x5e\xea\xf1\x32\x00\x26\x95\x56\xbe\x08\xc3\x8d\xa7\x10\x0d\x9a\xca\xee\x1d\xb1\x60\xf5\x00\x44\x37\x07\xe2\x27\x56\xe9\x48\x8c\x40\x88\xd2\x55\x3d\x89\x5d\x3f\x23\x1e\xb9\x02\xc5\x8c\x00\x74\x37\x83\x71\xa1\x62\x38\x3f\xab\x1a\x0e\x23\x65\x11\xb8\x91\x5a\x4f\xd1\xe3\xd7\xd6\x0a\x95\x5d\x26\x41\x26\xa1\x37\x82\xb3\xc7\x26\x1b\xbc\x29\x8d\x02\xa2\xfb\xc8\xd3\x8b\x8d\xba\x5c\x71\xcb\x14\xe2\x06\xd1\xaf\x52\x1d\x2e\xb8\x0f\xc6\x77\x38\x46\xbd\xc4\xb8\xf3\x6d\xac\xbd\x81\xe4\xa8\x31\xf5\x94\x25\x55\xf6\x96\xd4\x8b\xcc\xa8\x82\x74\xee\x2f\x81\x9a\x58\xbd\x1f\x07\xed\xd9\xe1\xc4\x9e\x9c\x6f\x55\xea\x05\x9a\xf7\x44\xd0\x28\x18\x11\x0e\xc8\xcf\x55\xd2\x0d\xc1\xd6\x74\x5d\x01\x3e\x03\xca\x83\x8a\xa5\x82\x05\x84\x46\x20\xc0\x3c\x4b\x5e\x59\x47\xb1\xfa\x9f\xd4\xc6\xfb\x4f\x7a\x5f\x7f\x15\xe3\xf0\xcf\x66\xca\x03\x40\x41\x82\x00\x7c\xa5\x39\x74\x3c\xcb\xd1\xdc\x74\xbc\x65\x3a\x43\x38\x23\x22\x1c\x11\x51\xfd\x31\x51\xec\x10\xb9\xe8\xe7\x04\xc9\x51\x44\x1f\x51\x7e\x56\xd3\x0d\xe7\x04\x0a\xf8\x99\x85\xc4\x43\xa3\x40\xc0\x19\x64\x64\x12\x79\x7a\x49\x14\xd8\x34\xbf\x19\xa0\xdc\x1c\x50\x23\x42\x3f\x06\xa8\x19\xab\xc0\x31\x4a\xb2\x6c\xee\x08\xa9\x02\xbf\x5d\xe9\x8e\x4e\x52\xee\x21\xe5\x51\x38\x8c\x51\xce\x2c\x83\x5a\x9f\xa5\x86\xda\xf9\x7a\x74\x91\xb8\xfe\x52\xb2\xfe\x79\x20\xe4\xa0\x2c\x1d\xbf\x9f\x1e\x5d\x43\xb1\x18\xc9\x97\x19\x9f\xf1\x4a\x6f\xb8\xbe\xf8\xd5\xeb\xed\xd6\x33\x5e\x86\x14\x11\x1c\x48\x2e\x67\x40\x57\x24\x1c\xfa\xaf\xed\xdf\xdf\x7e\xfe\xf0\xe1\xf3\xf6\x5c\x40\x77\x84\xe3\x8e\x24\x94\x15\x45\x8d\x37\x2e\xc6\xe1\x1a\x9b\x42\xbe\xb5\x41\x77\xa7\x40\xa9\xac\x04\xa1\x6f\x51\xda\x40\x31\xdb\x00\x7f\x21\x33\x64\x25\x11\x4a\x19\x25\x21\x90\x10\x6f\x31\x3b\x6a\x32\x75\xa3\x18\x25\xb6\x31\x9c\x8c\x5b\x73\x20\x97\x57\xdc\x50\x13\x4c\x26\x19\x07\xe6\xe9\xde\x6d\x0a\x22\x84\x22\x25\xe5\xe0\x06\xe9\xca\x25\x5e\xa6\x80\x88\x25\xc7\x2b\x4e\x08\x42\xcf\x6b\xe7\x36\x82\x53\xde\xde\x89\x1f\x4a\x0a\xf2\xe7\x8c\xd8\xae\x82\x41\x51\xa5\x60\xb3\xf3\x23\xa5\xc8\x52\x6c\xa3\x12\x5e\x24\x37\x66\xd4\x23\x68\x3e\xa1\x8a\x84\xa3\x26\xc0\x0c\x57\xda\x2e\x9d\x96\xbb\xea\xd4\x60\x1a\x81\x8f\x74\x07\x41\xea\xc2\xe8\x2a\xb8\xea\x5a\xca\x14\x76\x96\x05\x19\x64\x50\x72\x02\x79\x8d\x8c\x43\x32\x21\xf0\xae\xea\x31\x0e\x0f\x56\x91\x8d\x20\x80\xbe\x8f\x5e\xa9\x52\x41\x88\xba\x80\x21\x21\xa3\xe1\x62\xfe\x04\x47\x12\xa4\x56\x07\x01\x47\x1d\x41\x40\x5c\xd4\x66\x30\x9d\x55\x83\x79\xf5\xe2\x5e\x31\x0c\xc6\x9c\x5b\x84\xdf\x72\xd9\x4c\x4d\x6c\x70\x7c\xc5\x05\x57\x9b\x1e\xc6\x2c\xd5\x19\x31\xe4\xda\xec\xaf\x07\x4b\xbe\xb4\x81\x18\x41\xc0\x69\xed\xf4\x41\x9d\x89\x76\x38\x1c\xc0\x53\x50\xbe\xe4\x6a\x16\xad\xda\x74\xeb\x5c\x02\x24\x9b\x9a\x88\x26\x0c\x19\x64\xb2\xb3\x94\x52\x1b\xa8\x04\x1b\x89\xc3\xc1\xdc\x47\x90\x87\x1d\xcd\xe3\x4c\xcb\xad\x85\xf5\x3d\xaf\x9c\xd0\x23\x32\xe0\xf5\x6c\xe2\x38\xb1\xfe\x8f\xbf\xfc\xe5\xb4\x0f\x76\x4f\x9a\xb2\x27\x4d\x64\xc2\xe9\x29\xd3\xed\x29\xd3\x9d\xa5\xcc\x01\xc9\x8f\xd2\xe4\x8e\x99\x7c\x2b\xe6\x62\x55\x71\x54\x6f\x46\xb9\x1a\xac\x88\xb1\xda\xe6\x19\xe9\xaa\x50\xac\x61\x4e\xc1\x95\xf8\xd2\x59\x92\x45\x3e\xbc\x39\x47\xe9\xa8\xd6\x1d\x50\xed\xe8\xef\x8e\x5e\x83\x0a\x8f\x61\x1f\xaf\x85\x40\x34\x87\x42\x1f\x48\x20\xd5\x11\xeb\xce\x32\xe3\x51\x13\x2e\xb3\xb8\xc8\x74\xf6\x5c\x54\x56\x0e\xf0\x6d\x74\x94\x7a\x62\xc4\x91\xf9\x69\x6a\x9c\xa0\x64\xa5\xc6\xd6\x46\x45\x47\x9d\x7a\xd0\xf7\x02\x0f\x2b\x9a\x6c\x45\xf3\x09\x9e\x5a\x86\x2b\x9b\x8b\x3b\x6e\xda\x3e\xd1\xc6\xf1\xba\x04\x27\xb0\x72\xbc\x86\x35\x6d\x57\x53\xf6\x4b\xc8\x09\x65\xdd\xd8\x64\x82\x63\x08\x97\xc5\x94\xa4\x11\xb0\x21\x49\xc5\xed\xca\x46\xc2\xfe\xb0\xac\x56\x4a\xe0\x63\xd4\x3b\xe5\x32\xdd\x0c\xce\x10\x6f\xa8\xcd\x9e\x78\xa5\x23\x5e\x46\x94\x9a\x42\xd9\xa3\xc9\x2b\xa4\x89\xad\x4b\xac\xf2\x4f\x47\xb3\x82\x28\x24\x73\x91\x5f\xe8\x84\x5a\xff\xe7\xc7\x0f\xcf\x6f\x3f\x7d\xfa\x1f\xef\xd7\x8f\xa7\x6d\x37\x18\x85\xc4\x49\x0c\x94\x8a\x19\x56\xb1\x41\xa5\x35\x8a\x69\xc3\x88\xfb\xe0\x51\xf4\x87\x90\xaf\xb1\x14\x35\x3f\x4d\x6d\xbb\x5b\x70\x7a\x4c\x38\x69\x1b\xa2\xb9\x51\xb2\x61\x6c\x41\xac\x29\x37\x74\x53\xac\x7c\x54\x86\x3a\x53\xc8\x5d\xc3\x0d\x02\xb5\x45\xa1\x59\xdb\x4e\x93\xc5\xc1\xd1\xaa\x0a\x5e\xc1\x4f\x42\x14\x15\xf6\xb1\x45\x20\x21\xc2\x0c\x21\x31\xc5\x38\x89\x22\xdf\xcf\xf7\x16\xbe\xe1\xa0\xd5\x36\x2a\xe0\x35\x55\x9b\xee\x67\xe5\xeb\xe0\x47\x86\x52\x16\x4b\x39\x2c\x18\x99\x53\x6a\xdb\xe9\xc5\x59\xe5\xb6\x40\x19\xa9\xd0\x50\x6a\xcb\xa5\x31\x84\xe0\xd4\x9a\xca\x38\x0b\x40\x52\xe2\xd3\xcd\x05\x5e\x90\x08\x4b\x26\xe7\x28\xc5\x09\x1c\x20\x14\xbb\xdc\x82\x61\x51\xd2\x45\xaa\x59\xde\x7b\x28\x80\xcd\x45\x88\xdd\xfb\x6f\x0f\xb3\xba\x9e\xa7\x08\x14\x75\xd5\x64\xdd\x06\xa9\x07\xba\x45\xf3\x94\x11\x15\xc6\xba\xeb\xa2\xa9\xd7\x4b\xf5\x2b\x71\x2d\x30\xad\x4c\x42\xe4\x63\x41\x6c\x44\x6b\xbd\x6a\x1b\x4c\x69\xdb\xac\x10\xb0\x25\xd5\x0b\x14\x88\x36\x49\xa8\xa0\xd2\x17\xb1\x6b\xe1\xa9\x3d\x36\x56\xab\x5a\xd1\x2a\x93\x15\xf2\x8a\xcc\xc0\xe5\xc1\x13\x4e\xb7\x7d\x44\x77\x15\xee\xda\x7a\x27\x50\x74\x96\x46\xab\x69\x49\x25\x98\x4b\x32\x6a\xb8\x19\x7c\xc4\xb0\x3b\x48\xf5\xb9\xcb\xb3\xb4\xed\x93\xbf\x2d\xaf\xd9\x8f\x70\x00\xdf\x78\x7a\xb1\x6c\xf2\x92\xc3\x9a\xc3\xc9\xea\xc6\x27\x2d\x81\xd3\xc8\xaa\x4f\x9f\xde\xfd\xf5\xfd\xbf\x7d\x7a\x7b\x26\xac\x2a\x1b\x4e\x9b\x71\xe1\x15\x86\x53\x90\x0f\xda\xcc\x4b\xb2\x34\xd5\x4c\xf4\xa4\xaf\x79\x6a\xd2\x26\xe8\x9d\xd0\xbf\xa8\x7c\xd5\xab\xb0\xee\xc3\x62\x7c\xa7\x0b\x9a\xf4\xa7\x2b\x70\xbe\x82\x34\x23\x42\x04\xca\x5a\x02\xa5\xb4\x61\x64\x55\xab\x6d\xd7\x81\x58\xb8\x55\x46\xee\xda\x7a\x39\xd7\x1d\xcf\xb9\x96\xc9\x29\xd3\x08\xbc\xd0\x3d\xc4\x99\xda\x0e\xd3\xca\x38\xb7\x4c\x4a\x58\x83\x4f\x82\x87\x49\xc2\x53\x9e\x84\x46\x31\xc5\x5d\x24\x5f\x54\xc9\x80\xeb\x76\x0f\x9e\x68\x9c\x5f\x2a\xe1\xd6\xe2\x5d\x97\xe7\xbd\x9b\x9c\x6b\x63\xc2\x46\x7f\xa0\xb4\x44\x0e\xf0\x95\x37\xb2\x74\xcd\x66\xde\xb3\x20\xbe\x61\xad\xfc\x0f\x67\x24\x88\xfc\xbf\x16\x99\x1d\x62\xe0\x60\xbc\x9c\x1d\xd2\x20\x35\x09\x23\xd7\x27\x92\xf0\xe8\x8e\x17\x26\x7c\x4c\xb7\x41\x33\x0d\x25\x03\x23\xf5\xd2\x46\xe5\x8a\x89\x64\xe5\xaa\x47\x5b\x33\x66\xdf\x43\x97\x97\xe2\xfc\x24\x46\x25\x51\x29\x7b\x93\xbd\xab\x15\x7b\x62\xb5\x81\x5f\x2e\x82\x60\x26\x14\x55\x48\x40\xea\xb3\xfd\x2e\x96\x15\x93\x20\xd3\x2a\x76\xa9\x7e\x95\xbd\x4d\x2a\x0b\x72\xec\x53\xb4\xf0\x04\xb7\x42\x30\x73\x9c\x85\xbe\x3d\xa9\xec\x80\xa8\x3b\x9e\x86\xdd\xd5\xb2\x53\xdb\x4c\x01\x42\x5c\x03\xe7\x92\x85\xc0\x1f\x6e\x14\x1a\xd8\x8d\xf4\x12\x91\x62\xe2\x16\x9b\x10\xba\x30\xed\xd6\x0a\xf0\xc9\xaf\x10\x04\x7d\x24\xdb\xdb\x39\x57\x84\x69\xe8\x4a\x3a\x86\x4d\xf2\x65\x6c\xf2\x73\x6c\xea\x84\xea\x16\xf1\x0e\xc0\x25\x77\x88\x4b\x43\x87\x97\x1c\x78\x4f\x79\xe7\xe7\x0f\x2f\x67\xb9\xa6\xa7\xa6\xcf\xa6\x8b\x20\x52\xe3\x17\x83\x99\xad\x7f\xe0\xe9\xa5\x81\xc4\xb2\xa9\x79\x02\xab\x97\x10\xc2\xc4\xbb\x3d\x4b\x16\xe3\x3b\x7d\x74\x79\x43\xfe\xe2\xe2\x21\x93\x0c\x64\xb5\xa6\x4a\xe2\x8d\x2b\xba\x01\xd6\xb6\xc2\xdd\xeb\xc6\x5c\xf3\x8d\x0b\xe5\xd8\xb5\x4d\x67\xae\xf3\x59\xf7\x63\x79\xae\xc1\x4e\x42\x51\xc0\xee\x8a\x2a\x44\x9b\x79\x22\x00\x47\x99\xad\xb2\xf8\xb1\x33\x47\x75\x4c\x28\x42\xd9\x3f\xc3\x8e\xdf\x35\x02\xdd\xbd\x10\xfc\x60\x33\xc4\xcf\x50\xad\x1b\xb0\xeb\xbb\x60\xc4\x10\x27\x4b\x1e\xf1\x2d\xa9\xd4\xd4\x22\x28\x6f\xe0\x75\xc4\xa8\x06\x27\xd9\xaa\xe2\xe1\x6c\x86\x75\x58\xa5\xed\xb0\x8f\xd2\x41\x20\x1c\xe2\x21\xab\x7a\x23\xc3\x1d\x15\x81\x28\xf8\x67\x4b\x2e\x21\x57\x62\xf2\xa8\x84\x41\x8c\x9c\x25\xba\xa9\x14\x53\xdb\x01\x4c\xba\x6f\x84\x85\xc0\x78\x22\xa3\xfc\xf2\xec\x14\x06\x9e\xe4\x19\xc3\xaa\xf6\x8f\x84\xec\xd5\x3a\xae\x44\xc1\xbd\x91\x1a\xed\x04\xd5\x02\x19\x21\x53\x35\x7a\xb2\x50\x28\x07\x90\xe4\xaa\x9c\xc5\xa4\x80\xa7\xc8\x14\x53\x05\x59\x27\x85\x66\x59\x08\xd4\xc7\xda\x76\x7b\x13\xdc\x83\x70\x62\xe3\x13\xbc\xa6\x31\x04\x93\x8c\x6e\x6c\x3a\x90\x8d\xca\x39\x10\x76\xf6\xdb\x19\xec\xb1\x01\xd2\x90\xf3\x5d\xdb\xdf\x8b\xc1\xf6\x13\x1d\x4f\x17\x76\xd3\x0a\x8a\x39\x98\x74\x04\xde\x29\xe7\xe0\x2a\x1d\xfb\x21\xbf\xa5\xc3\x02\x2f\xaa\x35\x66\x1f\x5b\x0e\xd9\xdf\xc9\xc6\x2b\x47\xf4\x83\x1a\x45\xc9\x5b\x0a\xe9\xb9\x06\x83\x81\xbb\x59\x4f\xc5\x75\x6b\x9d\x16\x0e\x81\xfe\x4e\x06\x13\xfb\x08\xcf\x9f\x1e\x15\xae\xa9\x26\xc2\x79\xc6\x69\x12\x87\x2a\x8d\xe8\x12\x5b\x65\x8d\x96\x9a\xfc\xc9\xc2\x64\x8d\x5c\x19\xca\x4a\x23\x45\xbf\x91\x6a\x08\x95\x51\xd8\x38\x25\xb6\x4a\x0c\xc6\x37\x8a\xbd\xb5\xed\xa7\x55\x04\x26\xee\x67\xf2\x4e\xff\x9f\x53\x45\x4d\x57\x2d\xb9\x7f\xa3\x02\x9a\xe0\x6a\x19\x6b\xc2\x33\x42\xf3\xaa\x51\x9e\x63\xcd\xaf\xad\xbf\x23\x6f\x9c\x37\x6e\xc8\x17\x9d\x74\x0b\xf1\x69\x31\xc3\x5d\xec\x12\xca\x24\xcb\xb6\x79\xb6\x94\x10\xa1\x68\x75\x06\x5e\xa9\xc8\x3b\x18\x16\x36\x0e\x19\x7f\xfa\xd4\x71\x35\xbf\xaa\xed\x52\xaf\xfa\xda\xf4\x44\x5e\x2a\xcb\x3c\x4a\xfe\x30\xac\x9b\xe3\x6c\x03\x73\x7f\x46\x6c\x9e\xf7\x16\x86\xf7\xde\xc1\xd4\xc5\x8d\xd4\x53\x89\x66\xc8\x6e\x07\x0f\xa5\xf0\x4c\xc1\x23\x68\xb9\x3b\x03\x86\xf1\xbe\x96\x6c\xdb\x38\xb8\x78\xba\xbd\xa3\x27\x9b\x60\x51\x5a\xc0\x45\xca\xb9\x6b\x9b\xb1\x03\x69\xbd\x27\xb1\x6b\xf7\x6a\x25\xcc\x3d\xc9\xb8\xa1\xe6\x87\x5e\x5a\xb8\x06\x58\xd3\x8c\x8a\x67\x0e\x88\x02\x3f\xad\x54\x10\xb6\x4b\xd8\x97\x95\x30\x95\xec\xfb\x29\x58\x47\xc8\xc6\x57\x5f\xaa\x6d\xfd\x3e\x0c\x76\xb5\x00\x48\x7f\xa5\x67\x9e\x87\xd0\x33\x03\xd3\x75\x38\x20\xae\xed\x80\x50\x16\x67\x26\x52\x53\xac\x8e\x72\xac\xd6\xcf\x91\xcf\x6f\x1c\x68\xd2\x15\x53\x23\x0d\x32\xb2\x53\x60\xec\x37\xe8\x74\x3f\x36\x8a\x1f\x1b\xc5\x8f\x8d\xe2\xc7\x46\xf1\x63\xa3\xf8\x67\xdc\x28\xce\xea\xc0\x27\x74\xea\x4c\x4d\x82\x4e\xed\xc8\xfd\xf4\xf0\xf9\xe3\xe6\xfd\xa7\xbf\x7c\xf8\xf8\xf2\xa7\x9f\xf0\xb3\xdd\x7c\x7e\xfb\x7f\x59\xe5\x35\x0f\x8e\x98\xff\xcb\xc3\xc7\x0f\x9f\x71\xa9\x90\xc8\x7f\xb9\xd6\xda\xfd\x5f\x37\x1f\xdf\x7c\xf8\xe5\xb4\xd3\x71\x30\xe3\x53\x5b\x6f\xb2\x2a\xd0\xd3\x74\xa3\x79\xf4\x40\x30\x37\x58\xa1\xca\xa4\xaf\x6c\xf2\x7a\xa2\x9c\xce\xfb\x2a\x17\xf5\x35\x3f\xc6\x71\x26\x4d\xcd\x89\xe7\x3b\xd3\xe7\xaf\xb7\xf9\x70\xba\xb0\xb7\x74\x51\x6f\x7e\x6e\x4e\xbe\xac\x37\x7d\xfe\x52\xd7\xdd\x51\x6f\xe1\xc2\xde\x2e\xc3\x91\x38\xeb\xad\x5c\xd8\xdb\x65\x58\x92\xe6\xd6\x95\x83\xde\xce\xa2\xbf\xbb\x0c\x4b\xf2\x01\x39\xbe\xf9\xe5\xcf\xbb\x5f\xce\x99\x46\x64\xa1\x1b\x7c\x9f\x5d\x0b\x05\xbe\x4d\x7f\xa5\xa9\xc6\x11\x79\x7a\xd1\x2d\x7e\xc1\x35\x49\x5b\xcd\xff\x20\xd5\x6c\x62\x86\xac\x2e\xf9\xb2\x0a\x03\x73\x3b\x48\xad\xaf\x91\x37\x5e\xb7\x59\x3f\x98\xb7\xbd\x6e\xf7\xfa\xf7\x62\x7c\xa7\x93\x52\xf0\x0a\xb2\xff\x65\x58\x62\x54\x30\xc9\xa8\x1b\xd3\xa7\x1b\x93\x06\x6e\x93\xd9\x8c\x6f\x74\xee\x90\xdd\x3b\x37\x10\x3d\xbe\x81\x94\xe0\x9c\xd7\x81\xb2\xdf\xaa\x7c\x7d\x70\xc8\x84\x33\x0c\xf8\x6c\xa6\xb0\x65\x8a\x0b\x6e\xb0\x75\x36\x83\xe9\x7b\xf8\xd4\x0d\x96\xe0\x86\x9a\x6c\x38\x2f\x45\x25\xf1\x5d\x73\xac\x9b\x4c\x12\x74\xab\x89\x6e\x87\x81\x54\xcf\x2b\x19\x2a\x03\x62\x0f\x35\x9c\x7f\xee\xbf\x66\xfa\x1f\xd7\x33\x10\x45\x15\x5e\x17\xf2\x15\x3e\x1b\x38\xeb\xe4\x3e\x73\x60\x63\x33\x45\x93\xc9\x89\xc2\x66\x1f\x3a\xc7\x26\xd5\x8c\x83\x57\x73\x92\x6e\xb2\x01\x33\xcd\xb5\xe2\x66\x1c\x8e\x42\x21\x17\xe5\x5d\xb3\x55\xb1\x6d\xd7\x2c\x86\x8e\xfb\x17\xaf\x67\x2b\x9c\x71\xfe\x4d\x45\x36\x63\xfa\xc2\xef\xc5\x94\xbe\xfa\x07\x9f\x1e\x05\xf5\xe4\x38\x6f\xbb\x18\xee\xc8\xa6\xec\x97\xce\x16\x8a\xa6\x50\x00\xaa\x49\xdc\x12\xa7\x85\x6e\xf0\x26\x0f\xae\x49\xfd\x07\x9e\x1e\x23\x82\xd4\xf2\x52\xa9\x67\xa7\x32\xf2\x82\x21\x45\xf2\x48\x96\xc4\x29\x8f\x70\x8f\x07\x8c\x23\x41\x1e\x0a\xda\xe9\x17\x92\x0e\xec\xc5\xa3\x12\xcc\x32\x53\x88\xf5\x63\xb3\xb1\xe9\xa7\x74\xfd\xd6\x85\x72\xdc\xcc\x46\x65\x13\xa1\x5a\x4e\xd4\xef\xa8\x02\x8a\x2c\x1c\x29\x18\x34\x7d\x3a\x99\xee\xef\xc5\xf8\x4e\x97\x14\x10\x89\x56\x31\x0e\x5c\xd7\x29\xb0\x02\xc1\x35\x00\xc2\xe1\xd0\x5d\x83\x5c\xb7\xb9\x92\x9a\x03\x03\x70\xa3\x18\x53\x80\xdc\x31\xc5\xeb\x5d\x70\xde\x7c\x78\xff\x79\xf3\xee\xfd\x99\xc3\x3a\xe4\xec\x59\x0e\xc1\x55\x6c\xa7\xce\xba\x6c\xbc\x89\x63\x6f\x5e\x78\xd6\xac\x65\xfc\x04\xbe\xf1\xf4\xe8\xe1\x07\xbc\x74\xb2\xbe\xe1\xb4\x1c\x1a\xde\x28\x91\x06\xd7\x44\x1a\x3b\xcb\xe3\x8b\xd5\x3d\x63\xc7\x6e\x31\xba\x56\x5f\xbd\x81\x4d\xfa\x2e\x77\xf4\x75\xdd\x0f\xaf\xdf\x70\xe2\xcb\xd7\xf7\xdf\xbd\x7b\x83\xfc\x94\x6e\xe8\x3c\x5d\xda\xf9\x8c\x09\xde\xcd\xab\xbc\x20\xb4\xd9\x23\xef\x79\x2a\xbd\xb1\x00\x87\xfa\xaa\xc9\x8f\xaf\x99\x5c\x1f\x5c\xf3\x91\x5b\xa8\xc2\xc1\x93\x6f\x98\xfa\x8d\xa7\x97\x68\x9a\xf9\xc7\x55\x81\x9f\xf7\xa7\x5a\x5a\xfd\xf6\xc1\x67\xec\xec\x71\x53\xbf\xf0\xf4\x52\x4d\x1f\x5f\xef\xeb\x2c\x5f\xed\xeb\x37\x33\xa9\xf5\x87\xf6\xef\x2f\xa7\x75\x32\x48\x26\x21\x6f\x6a\x01\x93\xda\xf6\x9b\x40\x67\x18\x61\x57\x9b\x6e\x5c\x88\x31\x71\x50\xb8\x8b\xef\xda\x3a\xc3\x04\x03\xdc\x2d\x9e\x03\x92\xd7\x99\xb8\x3c\x93\xf3\xb6\xa6\x78\x75\x6c\x05\xc1\xbf\xf5\xdf\x4f\x2a\xd0\xa4\x6a\x5d\x64\x36\xb2\x23\xf7\x5c\x81\x5d\x6c\x4d\xb9\x4b\x4d\xb0\x28\xaf\x86\x9f\x0b\x07\x13\x48\x6d\x7b\xfc\x54\x61\x64\x87\x5c\x75\x2e\x50\x34\x6e\xc8\x47\x9d\xe1\x95\xf3\xdc\xa5\x4b\xce\x4a\xa9\x21\xd7\x6a\x6d\x48\xdb\xb9\x0b\xd5\x99\xc2\x21\x5f\x77\x9d\x35\x2b\x02\xe7\xbc\x74\x8d\x8e\x5d\x9e\x11\x35\x53\xac\x6e\x34\xd6\x5b\x76\xd6\x7f\xb2\xec\x0c\xcc\x8a\xce\xf8\xb5\xe4\x37\x00\x5b\x74\xa6\x54\xf5\xbf\xa6\xbe\x35\x4e\xd6\xae\x79\x53\x0b\x13\x16\x8a\xb1\x86\x37\x4b\xae\xf5\x3a\x2f\xaf\xdb\x3b\x5e\x64\x25\xc9\xbc\x71\x4c\xce\xa0\xe9\x96\xd8\x50\x2e\x3b\xcb\xe4\x37\x82\x82\x8a\xb5\xad\xf3\x8a\xf6\xb2\xf0\x9c\xb9\x40\x5a\x0b\xfd\xe6\x69\x40\xf1\x61\x39\xfb\x03\xee\x23\xcd\x94\xfd\x40\xc8\x57\x05\x63\x2d\x8d\xee\x83\x17\x69\x1a\x87\xda\x6c\xad\xdb\xb5\x77\x1c\xb1\xfa\x73\x97\xc8\x97\x71\x86\x0b\xd8\xd6\x50\x9a\x65\x31\xba\xda\xbd\x7d\x93\x7a\x2b\x48\x9f\x39\xeb\x5f\x15\xc1\xee\x12\x8f\x7b\x0f\x32\xe9\xbe\x7b\xfb\x26\x85\xf7\x8b\xd3\xe7\xd3\xd3\x2f\x97\x4e\x7f\xae\x01\x7f\x3b\x94\x78\x9d\xdb\xc8\x57\x41\x87\x57\x7a\x72\x7c\x15\x54\x78\x9d\x9f\xc7\x57\x41\x83\x73\x0e\x1b\x53\x6d\x30\x2e\x2b\x9b\x57\x56\xc9\xd5\x0f\xdd\x65\xeb\x2c\x8b\x75\x3f\xfb\xea\x38\xea\x51\x18\x60\x8d\xaa\xaa\x4c\x48\x48\xe3\x8c\x40\x05\x68\x8c\x5b\xc3\xb7\x7d\x23\x38\x84\xa9\x6d\xe5\x59\x19\xd6\xeb\xae\xa6\x12\x89\x27\x5e\x48\x84\xec\x12\x47\x71\x03\xc8\xc5\x93\x15\x79\x46\x95\x77\x6b\x59\x6b\x9f\x16\xfa\xbd\x62\x6a\x5b\x6f\xa1\x20\xa1\x20\x04\x25\x05\x7c\xb6\x29\x1b\x05\x43\x6f\xcf\x87\xbd\x5c\xb6\xcd\x62\xf8\x1c\x26\xfa\xf4\x08\x27\xda\xe0\xd7\x85\x9a\xfe\xcd\x85\x6b\x54\x60\xa8\x6d\x37\xa2\xea\x6b\x8b\xd4\x99\xce\x75\x6d\xaf\xd6\x19\x7d\x77\xc7\x14\x74\x8f\x0e\xce\xb8\x7d\x04\x03\x5b\x46\x12\x51\x59\x38\xb8\x3f\xbb\xbd\x13\x34\xc6\xac\x1d\xbf\x72\x95\xc2\x81\xfc\xf0\xdf\xde\xb5\x6f\x7f\xde\x6e\x3e\x9e\x49\xbe\xd9\x98\x82\xb4\xb9\xb2\x62\xaf\xfb\x6d\xc0\xa1\xd6\xe0\x98\x84\x78\xb3\xb0\x8c\xa3\x6b\xde\xa4\xb5\x94\x39\xb9\x37\x33\x72\xe7\x71\xdd\x71\xed\xa6\x06\x28\x2e\xe3\x9a\xdd\x16\x29\xf5\x27\xcf\x2f\xe3\x3a\x6d\x23\xf9\xd2\x4a\x2d\xa7\x12\xc6\x45\xac\x74\x77\xf6\x7c\x59\x7a\xab\x03\x36\x81\xd2\x22\x42\x3e\xcf\xdd\xf9\xba\xa4\xde\x88\xb2\x49\x02\x8b\xfa\x5a\x9a\x36\x50\x8c\xfa\x47\x98\xc4\x22\x70\x97\xb8\x55\x6a\x1c\x1c\x4b\x6d\x3a\x0a\x44\x64\x9b\xcf\x3b\xd4\xf0\x0e\x5d\x6e\xa9\x38\xff\x80\xad\x7f\x96\xd0\x22\xef\x50\x93\x6b\x0d\x14\x7d\x74\x87\x03\xdd\xa6\x18\xa9\x79\x6b\x91\xcb\x4f\x9f\x12\xba\x21\x46\xe1\x5b\x2e\xf3\x63\x34\xfb\x95\x4c\x62\xfc\x32\x3e\x01\xf8\xbe\xc6\x4c\x4d\x66\x57\x43\xaa\xb9\x96\x99\x68\x1b\x4b\xce\x22\xa3\x93\x42\x02\x29\x0d\x9b\x3c\x83\x5d\x4d\xd5\x04\xd8\x29\x78\xf1\xe4\xce\xaa\x4e\x73\xf0\x1c\x02\x8a\x7c\xd4\x19\xa7\x60\xa4\xd9\x91\x4f\x2d\xce\x8d\xfa\x35\xd9\x87\x85\xd5\xc0\x40\x1c\xd7\xbe\x9a\xdc\x0e\xc5\xf5\xff\xe7\x0b\x27\x27\x14\x8d\x9f\x85\x50\xa0\x74\xcf\x9a\x65\x9b\xd7\xfe\x09\xf1\xfd\x4a\x21\x71\x7b\x49\x31\xef\xb9\x57\x7d\xcd\x96\x3e\xed\x07\x22\xb2\x2c\x95\x1b\xfb\xa5\xd7\x35\x92\xb8\xf5\x3b\x5d\x9c\x1b\x1c\x1a\x8c\x13\x5d\xe9\x59\x5f\x5d\xbe\x76\xed\x49\xfc\xd3\x8b\xd8\xda\xd3\x45\x49\xf4\x0e\x0d\xa3\xde\xe8\xe7\x76\x79\x9b\xd7\x01\x89\x9d\x26\x5d\xe2\xfe\x93\xe2\x39\x37\x4b\xb9\x14\x82\xdd\xfe\xf6\xa1\xfd\xc7\x5f\x3f\xbc\x7f\xf8\xf5\xc3\xbb\xf7\x9f\x3f\xfd\xe9\x27\x69\x1e\xb8\x79\x90\xe6\x21\x3f\x70\xac\x0d\xcb\x03\xe7\xbe\xc5\x3d\x6e\x2e\x15\x24\xf7\x49\x4d\x04\x19\x47\xf4\x9f\x2e\xe3\x88\x5c\x9f\xd4\x64\xf8\xaa\xaf\x5f\xf5\x37\xa6\x4a\x49\xa7\x40\x12\x2b\x44\x44\x6a\xe3\x1f\xd8\xd7\x66\x80\x12\x1e\x99\x27\xab\xff\xd2\xa9\xc7\x7e\x06\x07\x13\x18\x81\xc5\xbf\xfe\xa3\xe5\xe8\x04\x74\xe9\xe2\xb0\x80\x5d\x8b\xc1\xa3\xc9\x0f\xb1\x36\xd2\x3c\xf8\xae\x91\xfd\x74\x9b\xfd\xa2\xeb\x05\x96\xbe\xc5\x27\x6a\xdb\x7d\xfd\x82\xd9\x2b\x06\x9d\xc0\xbe\x88\x0e\x6a\x9b\x1f\xc4\xf7\x6d\x7c\x90\xd8\xb7\x18\x60\xd7\x36\xa3\x21\x8e\x31\xd5\x8f\x86\x78\xc9\xc8\xf8\x38\x0c\xf3\x83\xc3\xe7\xba\x16\x60\xe8\x5a\xf4\x5d\x5b\x01\x38\x6b\xeb\x2e\xa0\x12\x96\xe3\xf0\x00\x9c\x3b\x48\x34\x7d\x8b\xd5\xea\xda\x3c\xfc\x39\x3c\x80\xa5\xab\x2f\x4a\xb3\xff\x71\xc1\x68\xdc\x04\x39\x75\x22\xff\xd0\xc5\xb9\x91\x68\xd9\x4f\x3e\x2b\x32\xff\x6c\xbc\xee\xb3\xe1\x28\xec\xea\x42\x49\xee\xdb\x31\xfe\xe4\x61\xa1\xf6\x4b\xe7\x00\x38\x27\x7d\x1b\x71\xa5\xb6\x17\x90\x20\x4f\x59\x93\x74\xb0\x3b\xca\xf0\x2e\x41\xcb\xe3\xbc\x69\x98\x5b\x1e\xcd\x2d\x8e\x68\xc6\xf7\xa8\xb1\xa7\x87\x7c\x41\xaf\x87\x67\xb3\xff\xf6\xe9\xdf\xcf\x55\x50\x92\xd2\x65\xfb\x52\xd9\x8a\x87\xba\xc7\x70\x48\xa3\x24\x5b\xde\x74\x39\x57\xf2\xde\x6f\x0b\x92\x8a\xca\x46\xce\xf4\xca\x43\x63\x03\x24\x57\x2a\xf8\xaf\x53\xb9\xab\x01\x2d\xcb\x92\x03\x85\xb4\xe9\x83\x20\xf7\x2e\x77\x06\x75\x22\xad\x33\x9e\xb2\xdb\x0a\xb9\xf8\xf4\x12\x20\xb4\x2e\x98\x5c\x84\x6f\x50\x2f\xf8\x64\x53\x6a\xbe\x08\x27\xb5\xe9\xc6\x59\x54\x83\xc9\xe4\x2f\x8e\x63\x9f\xc4\xb6\x20\x53\x8c\x4b\xad\x8d\x2a\xe8\x39\x54\xc6\x1b\xeb\xac\x35\xb6\x97\xd2\x3e\x2a\xc3\x45\x8a\xbc\xe6\xb4\x8c\x54\x64\x23\x55\x69\xdc\x7b\x22\xd5\x41\xa2\x90\x88\xef\x9a\x1a\x0d\xa5\x3f\x91\x30\xb0\xe6\xc3\x91\xa1\xc4\x11\x13\x07\x72\x2d\x15\x87\xaa\xe0\x0b\x44\xbf\xf9\xaa\x66\x31\xe2\x58\x39\x18\x2e\x5b\x47\x21\xb7\xf0\x50\x42\x18\xca\x0c\xa6\xa6\xc2\x74\xab\xcd\x4e\xd7\x70\x6c\xfe\x55\x15\x85\x52\xd9\xfa\xaa\x7d\x4f\xae\x5b\x4a\x65\x67\x3d\xf9\xc9\x8d\x3e\x0d\xba\x90\xf3\xd3\xec\xe8\x94\x77\x4c\x2c\x4b\x2e\x94\xf3\xa6\xba\x05\xf6\xc1\xc0\x6c\x7b\xec\x59\x71\xc0\x39\x6f\xd9\xb2\xec\x20\xd0\x52\x2c\x14\xf7\xdd\x02\x8a\xc8\xe5\x31\x54\xe3\x51\xcd\x95\x22\x72\x3c\xec\x9f\xb2\xc4\xed\x68\x65\xa6\xdf\xf0\x96\xe2\x62\xbc\x3a\x66\x58\xd0\xa7\x47\x71\x28\x0c\x13\x96\x12\x77\xa2\x73\xd1\xbf\x9f\x5e\x02\x39\xd8\x71\x51\xc2\x2c\x84\x16\x71\xbd\xb7\xc4\x66\x79\x1c\x7c\x56\x24\x0a\x14\x90\xbe\x92\x37\x13\xa4\x61\x6a\x92\x0a\xd2\x09\x39\x37\x53\x8b\xb4\x2c\x81\xe2\x19\xe2\xab\xba\x08\x0a\xdb\xf9\xfd\x99\x72\x4d\x09\x12\x71\x31\xd7\xa6\xa7\x42\x78\xba\x09\xb9\x5c\x9b\x9e\x0e\xd9\x21\xe3\x93\x6a\x57\x27\xe9\x70\x55\x10\xa0\x9b\x96\x59\x1f\x88\xc6\xed\xbd\x23\x0c\x94\x96\xad\xaa\x32\x8a\x79\x41\x31\x4f\x4e\x61\x9e\x50\x28\x3b\x2a\xc8\xe5\x8b\xc2\x1f\x5b\xc5\xaa\x9d\x2a\x9c\x28\xfc\x78\x0e\x59\x62\x57\xca\x13\xc8\x02\xdc\xa5\x34\x45\x95\x24\x43\x25\xf4\xd3\xa8\x12\x14\xb0\x1d\xfc\x27\xb9\x84\x2f\xb2\xde\x4d\xd8\xe8\xff\xda\xfc\xb2\x39\x7b\x0c\xcb\xf9\x19\x79\x62\x6d\x44\xc4\xa9\x85\xd7\xca\xb3\x45\xff\x96\xbd\x5e\xb6\xb8\xfc\x06\x35\x55\x91\x6e\xd6\x78\xc2\xe9\x37\x1b\xbf\x73\x94\x9e\x55\xb5\x37\x0d\x05\x5b\xa8\x98\x80\x7f\xe1\x7e\x29\x9f\x02\x05\x83\x94\x51\x8c\xb2\x03\xfe\x7f\xbf\xff\xdf\x9f\x9f\x03\x39\xdb\xe0\x86\xd7\x85\xc7\xbf\xdc\x90\xdb\x5a\x79\x86\x4f\xae\x75\x94\x4c\x26\x67\x33\x6a\x7e\xba\x4f\xfa\x43\x2f\xda\xee\xe2\xb3\x62\x8c\x20\xfd\x57\xa2\x6c\x52\xbd\xba\xf3\x84\xac\x69\xd9\x34\xe4\xad\x23\x36\x82\xd6\x51\x41\xbf\xb5\x3c\x9c\xde\xf7\xfa\xbf\x4f\x1e\xcf\x7a\xeb\x61\x66\x43\x69\x2b\xeb\xf4\x4d\xeb\x28\xaf\x85\xf8\x0d\x67\x8a\x06\xc5\x93\x1c\xfe\x31\xf2\xa6\x90\x20\xc9\x43\xfd\x97\xf3\xa7\xa4\xdf\x8c\xf5\xff\x9f\x38\xda\xfa\xb7\xe5\xb8\x74\xf2\x7f\x1e\x1e\xa5\x31\x9c\xbb\xee\x99\xd8\x36\xba\xd5\x58\x31\xf2\xc9\x8a\xfe\x61\xc5\xca\x27\xfc\xab\x97\x7f\x16\x24\x07\x29\x06\xaf\xfd\x9f\xeb\xb7\x86\xc9\xc2\xca\x7e\x61\x7f\xae\xd5\xa5\x8c\xaf\x99\xc0\x12\xa9\x8e\x9c\x2c\x3b\x82\xeb\x00\x5b\x3e\x58\xd1\xdc\xad\xa8\x1b\xaf\x68\xee\x57\xd4\xe9\xd4\x26\x6b\xea\xba\x35\x75\xba\xa6\x72\x72\x4d\x7f\x56\x3c\x12\xe9\x10\x0a\xa3\xa9\x4b\x2a\xa3\x25\x95\xba\xa4\x42\x6c\x1a\x7c\x42\xd9\x9d\x6e\x44\xc5\xf8\xba\xa8\x0a\x57\xa4\x39\x80\xf7\xaf\xd2\xb5\xde\x31\x35\x23\x92\x42\x1b\x0c\xc1\xea\x3d\x21\xe5\x9c\xe5\xd9\x2a\x76\x30\xfe\xab\x7e\xc5\x7a\x43\xa8\xac\x05\xb7\x4c\x63\x9b\x8a\xfc\xda\xeb\xb3\xc5\xee\x61\x39\x9a\x44\x62\xb1\xca\x7d\xbf\x26\x63\xa0\x27\x96\xff\xb9\x31\xfb\xff\x29\x2a\x5c\x4b\xc1\xff\xf7\xfb\x5f\xfe\xfe\x7c\xae\x9e\x24\x2a\xb8\x62\x59\x19\x19\xae\x82\xb2\x46\xa4\x45\xb0\xce\xc6\x0d\x0b\x62\xce\x65\x38\x38\x85\x33\x76\x04\x44\x42\xd7\x74\x0c\x15\xcf\x2c\x0e\xdf\x90\x5a\x87\x5b\xe7\x84\xd2\xcc\x4c\xe2\x4c\xb4\xce\xc4\x4f\x37\x75\x65\x8e\xbf\x61\x22\xa5\x2f\x77\x95\x11\x59\x30\xf6\x1b\xe6\xae\xab\xfa\x5f\xcf\x3c\x91\xeb\x2b\xbd\x51\x76\x55\x73\x34\x04\xa4\xa2\x52\x7c\x0c\x06\x49\x89\xc5\x51\x5a\x0e\x11\x9d\xc8\xbc\xb3\x74\x24\xe5\x99\x91\x60\x30\x3b\xe3\xa8\x89\xd6\xd7\x3a\xc7\xe2\xf1\x6b\xe3\x75\xfb\xf7\xbd\x0c\x80\x14\x61\xb1\xca\x78\x9e\x62\xd7\xec\xef\x04\x0b\x3b\xb4\x57\xa6\xef\x7b\xce\x5f\xad\xe0\x5d\x29\x4f\xef\x50\xdc\xb9\x37\x4f\xd7\xd0\x92\x63\x7d\xe0\x4b\x8a\xde\xb9\x86\x37\xf8\x0a\xb4\x50\xab\xd2\x86\xb0\x74\x7e\x3c\x17\x23\x4b\xa7\x7b\x15\x26\x6a\x95\xb8\x29\x29\x45\x38\x6d\x38\xd4\x78\x0e\x15\xcf\xf0\x6b\x73\x08\x3e\x14\xb7\x3c\x0a\x6f\x5d\xa8\x37\x82\x34\x51\x28\xef\x67\x24\xc2\xf0\x17\xe0\xac\x3d\xe0\xe5\x53\x17\x67\x5a\xdc\x06\xb1\x0b\x35\x82\xa1\xef\x02\x62\x34\xb8\x73\x40\xc1\x8d\xea\xc8\x64\xbc\x81\x43\x94\x24\xec\xb5\x3e\x1b\xb6\x7e\x71\xf0\xba\xe9\xbf\xfc\xf4\x52\x41\x76\xff\x1e\xea\x44\xba\x4e\x2c\xd7\xa2\xbe\x5f\x61\x22\x0c\xbc\xf4\x97\x1d\x2a\x1f\xd9\xf2\xdf\x7e\x7a\xf7\xe9\x2c\xc3\x28\xa8\x9d\x1c\xc9\xf9\x6d\xb3\xe8\xeb\xd2\xf5\x18\x26\x35\x4f\x9c\xac\xc4\x23\xc9\x9a\x43\x21\x43\x64\x08\xad\x87\x4a\x33\xa9\xcf\x76\xf5\x2e\x59\xb6\xcd\xb1\x7b\x8a\xae\x0c\x89\x3a\x71\xf7\x35\x05\xe1\xfe\x63\x53\xa1\x0a\x35\xca\x9b\x55\x44\xec\x01\x1e\x46\x92\x26\xdd\x81\x8f\x91\x68\x4c\x28\xb7\xd9\x05\x5b\xd7\x58\x8e\xbd\x1f\x03\x3e\x52\x54\xb8\x3b\x9c\x25\x4a\x72\xa7\xdc\xd6\xb4\x7e\xb0\x54\xd7\x54\x9e\xfa\xf3\x88\x60\x8b\xbc\xe5\xc7\xa6\x08\x33\x38\xa6\x7f\xf2\x5b\x48\xc0\xd5\x43\x57\xb5\xcc\xf1\x93\xc8\xe5\xa0\x73\x3c\x42\xb5\x48\xf6\x50\xe1\x7b\x74\x82\xa3\x85\xbc\x09\x63\xde\x6c\x7e\xdd\x3c\xbf\x3b\x5b\xb3\x38\xa8\x72\xd2\x0c\xbe\xdf\xa8\xed\xbd\xd6\x05\xda\x27\x75\x61\x38\x68\x3b\x87\xca\xbc\xfb\x89\xf4\x6f\xde\x72\xb8\x74\x6d\xdf\xfd\x9b\x37\x39\xe7\xe9\xea\x96\xa5\x9b\xa1\x1e\x6e\x4c\xd7\xeb\x06\x0b\xbc\xd3\x2e\x84\x87\x54\x41\x7b\x0c\x77\x57\xf7\x71\x98\x08\xe0\xe7\xbf\xfd\xfd\xdd\x59\x77\xf7\x74\x08\xe2\x32\xea\x5f\x41\x3c\x59\xda\x7c\x4b\xfc\x09\x67\x33\xc6\xf8\xda\x61\x33\xed\x6e\xe7\xa6\xdd\x5d\x84\xe7\xb3\xa5\x4c\x50\x13\x91\x6f\x08\x31\x4b\x69\x92\x8d\x08\xb5\xa1\xbc\xac\x54\x8c\xa3\x50\x4c\x9f\x4c\x2a\xf3\xec\xb1\x9a\xcd\xdd\xeb\x33\xd5\x6f\xbe\x8a\x46\xe9\x20\xaf\xc3\x34\x73\xfb\xf1\x54\xee\xa8\xd0\xef\x59\xc7\x54\x33\x05\x4e\xb3\xd7\xf7\x29\x16\x06\x45\xf0\x22\x55\xdf\xcd\x9d\xc7\x54\xe6\x89\x2d\x94\x4d\x17\x37\xbd\x15\x4c\x99\x12\xb3\xc5\xfe\xae\x3b\xd2\xde\x42\x05\xe5\x78\xf4\x8c\x6e\xfe\x6d\x2d\x34\x4a\xba\x9f\x6d\x54\x3d\xef\xcb\xda\x08\xaa\x64\x5e\xef\x78\xe4\x10\xb2\x20\xbe\xb5\xb5\x87\x61\x78\xb6\xeb\x7a\x3c\x3a\x3b\x1d\x1d\x1e\xd1\x19\xac\xe2\xfe\x2b\x32\x1d\xa0\xb9\x78\x80\x73\x57\x51\x3e\x81\x40\xcd\x04\x81\x5c\x53\x31\xa8\xc5\x23\x76\xb4\xa8\x53\x0c\x92\x5c\x51\x08\xcf\x21\x04\xf1\x3a\x14\x72\xcd\x57\xc5\xa1\x78\xc0\x45\x96\x1f\x3e\x7d\xfe\xef\x1f\x3f\xfc\xfd\xd7\xd3\xf2\x05\x53\xa3\xb4\xba\xb5\xec\x17\xf8\xcd\x43\x61\xc8\x68\x9c\x5b\xb3\x6e\xfc\xd3\xeb\xfa\xd3\x6a\xb3\x3d\xf2\x92\xa0\x02\x32\xcb\xda\xb9\xc3\x7b\x5d\x6f\x4f\x8f\xa8\x27\xe2\xe0\x6a\x28\xcd\x9a\xdd\x52\x2f\x5c\x9e\x26\x74\x38\xee\x6b\xa8\xc9\xdd\x81\x19\x95\xa1\x06\x46\xbe\xbe\xd2\xc6\x24\x01\x29\xf2\xf8\x65\xde\x5a\x59\x97\xad\x65\x59\xa7\x2d\x8f\xf9\x3d\x9b\x4b\xbc\x12\xba\xfc\xfc\xf3\x80\x17\x71\xfa\xfd\xb0\xb5\xcc\x6b\xb7\x65\xb9\xfa\xfb\xd3\x43\x15\x76\x3d\x6c\x74\x0e\xf9\xe8\x89\x0d\x5d\x72\x1e\xd6\xe5\xe6\xef\x27\xf0\x4a\x5d\xb9\x2b\xe9\xa9\x08\xc0\x0f\x2b\xee\x7e\xbc\x69\x28\xb0\xf3\x92\xb8\x20\x94\xa1\x69\x38\x84\xe8\x1f\x1a\x6a\x3c\x97\x18\x5d\x8a\x01\x35\x83\x63\x68\x38\xc7\x87\xc6\xb8\xe6\x61\xd5\x98\xf2\xf0\x46\x95\x7a\xdf\xb8\xe0\xc4\xa7\x87\x86\x7c\xae\x3f\x4d\xa2\x22\x0f\xf8\x3e\x7e\xad\x6a\xa7\xf8\xfd\x86\x03\xc5\x14\x7d\x4c\xa1\x7b\x2c\xd6\xea\x36\xfb\xef\xd4\x0b\xe5\x61\x55\x7f\xb8\xe6\xe1\x0d\x6c\x86\xb9\x71\x2e\x8e\x07\xa2\x5f\xf2\x31\x24\xc9\xe3\x61\xef\x27\xf8\xf4\xf0\xe8\x81\xfd\x4c\x25\x3e\xac\xea\x6f\x87\xdf\x2c\x87\x7f\x8c\x9f\xc2\xef\xa7\x87\xc7\x04\x9c\xf0\x94\xf3\xc3\xaa\xfe\x4e\xd4\xf8\x87\x55\x39\xf8\x3d\x7e\x06\xbf\x9f\xc6\x08\xf6\x4a\x87\x3e\x60\x3a\x2a\x9f\xe8\x56\xfa\xb0\xe2\x3c\xfb\x1d\x1f\x56\x71\xf8\xc7\x3f\xa0\xf6\xb4\xf1\x0f\x6f\xb8\x50\x0c\x22\xd9\x27\xe3\x1f\xf0\x09\x4f\xde\xa7\xc4\x41\x42\xfd\x3b\x3c\xac\x46\x9f\xbe\x78\x74\xee\xa7\xde\x7a\xa2\x33\x6c\x1e\x56\x5d\x8e\xec\xe1\xd7\xc3\x8a\x79\xf2\x43\x6f\xb9\xfa\xe3\x8d\x38\x8a\xae\x8e\xaf\x79\xa8\x1f\x69\x46\x03\xac\x50\x7f\x58\xed\x3f\xff\x74\x28\x8e\x7d\xfe\xf0\x71\xf3\xd7\xb7\x8b\x5f\x36\xbf\x7e\x3e\x13\x2a\x83\xea\x4d\x63\xc1\x08\x92\x52\xde\xda\x99\x36\xb4\xf5\x6b\x29\x23\x71\xa9\x7b\xef\x22\xfe\x37\xcf\x92\xac\x2c\x24\x1a\x49\x5b\x2b\x61\x5d\xb6\x12\x46\x42\x83\x33\x6e\x2d\x7e\x31\xba\xd0\x3d\xfc\xf4\x62\xc5\x59\xd9\x8a\x9b\x67\x08\x9c\x24\xcd\xb2\xca\xf8\x2e\x8b\x9b\xe9\x86\x37\x1c\xec\x52\x13\xef\x73\xb6\xeb\x4e\x7f\x7b\xe4\x2c\x71\xdd\xb7\xfd\x01\x58\xb9\xa6\xee\x95\xad\xcd\x6b\x69\xb6\x69\xcd\x7e\x2b\xbb\x34\x96\x75\xbb\x27\x2e\x12\x57\x66\xf8\xf5\x2f\x1f\x7e\x79\x7b\x7e\xa3\x76\xa8\x36\xab\x7a\x47\x6e\xad\x47\x9a\x34\xca\x6e\xad\xbc\xbd\x8c\x53\xb9\x05\x95\x0e\x93\x92\x45\xf4\xa6\x10\x4f\x82\x74\x9b\x15\xb2\x59\x23\x4a\x72\xfa\x12\xe5\xb4\x0b\x38\x29\xf5\x5d\x5e\x7b\x37\x79\x40\xef\x47\x92\x49\xc2\xd5\x40\x19\x39\x86\x03\x54\xe8\x49\xca\xc9\xa6\xf5\x54\x42\x35\xc7\x75\xe7\x45\xd9\x4d\xdf\x65\x3f\x96\x90\x7c\xb1\xc4\x1e\x5f\xb3\xb3\xaf\x51\xb0\x94\x23\xdc\x60\xc3\x34\xdd\x5a\x0f\x90\xa7\x47\x15\x3a\x70\x8c\xc1\xd2\x22\xce\x56\x90\xb0\xbb\xe8\x74\x7c\x4d\x31\x6c\x91\x15\x42\x08\x05\xe3\x62\x7a\x7a\x64\x24\x06\x74\x0d\xc5\xd0\xf6\x37\x83\x5f\x8b\x6b\x3d\xc5\x6c\x91\xc9\xc3\xd7\x0c\x29\x69\x2d\xb9\x2b\xc2\x89\x92\x27\x35\x6d\x28\x05\xaf\x70\x46\xa4\xc1\x1a\x3f\xb4\xef\xa8\x9f\x49\x2b\x7d\xf8\x32\xdb\xd0\x1c\xf3\x50\x5c\xd7\xbb\x19\x33\xe1\x42\x53\xce\x11\x0c\x97\x01\xda\x6b\x38\xca\x8e\xb8\x0d\xa0\x97\xda\x40\xc2\x76\x22\xb0\x90\x43\x5e\xdd\xe1\xeb\xe4\x32\xae\xea\xf4\xe0\x83\x99\x81\x11\xa3\xfe\x2b\x9e\xac\x6a\xaa\x38\xbd\x5b\xc2\x68\x28\xdd\x78\xaf\xe1\x12\x03\x96\x1b\x09\xd4\x84\xf9\x9c\x13\x05\x37\x9f\x53\x6c\x31\x63\xbf\xce\x88\x9d\xdc\xdf\xc4\x79\x04\xeb\x84\x83\x9d\x49\x68\x94\xfc\xaa\x28\x76\x64\x4a\xe1\xc4\xe4\x3c\xa2\x2a\x59\x27\xe7\x47\x5f\xed\x06\x76\x91\x8c\x77\x84\xc6\x4f\x17\xee\x65\xe4\x6c\x86\xb3\x84\x18\x29\xe4\x8a\x2e\x75\xc8\x6d\xa6\x80\x53\x9a\x0c\xc7\xf1\xb2\x43\xe9\xd4\xc7\x5a\xfc\xd0\x99\xfa\x9a\x18\x4e\xf5\xc2\x5a\x1a\x9d\x25\x2e\x73\x32\x1e\x61\xe3\x97\x59\x9c\x0e\xd2\xef\x87\xfd\xc8\xaa\x83\xfa\x17\x86\xc6\xa5\x1b\x5b\x7d\x51\x4c\xa5\x9b\xfd\xd8\x70\x99\x51\x7b\xe1\xd2\xc1\x1d\x22\x4c\xad\x63\xe9\xa4\xb5\xdd\x60\xd6\x91\x22\xaf\x90\x96\x29\x71\x3b\x19\xd9\x8b\x8d\x14\xac\xee\xb5\xb8\x5f\x5a\xfd\xd3\x51\x0a\xeb\x44\x29\xe9\x35\xb0\x10\x95\x0c\x0f\x63\xd5\x2e\x5a\xe9\xcd\xcb\xdb\x4f\xbf\x6e\x9e\xcf\x56\x2c\xf4\xc4\x13\x6d\x53\x07\xec\x5a\x1c\x81\x21\xa1\x6a\x94\xd6\xd6\xbf\xc6\x8c\xd8\xa5\xea\xb1\x32\xd6\x1b\x41\xc8\x6d\xb2\x9e\x9a\xb0\xce\x97\xa5\x60\x3d\x5c\xee\xa2\x7c\x0f\xb5\x83\xaa\xa3\xb2\xac\x0b\xb9\xbc\xc2\xe5\x48\x13\x13\x0b\xca\x28\xad\xc4\xd4\xc5\x55\xa8\xd5\x04\x99\x8e\x72\xdc\x4c\x47\xa8\x23\x1f\x67\x28\xe9\x3b\xb9\x6d\xf1\x1b\x03\x47\xde\x79\x59\x47\x3f\xf7\xcd\x96\x79\x65\xc8\x89\xcf\xb7\x7e\xe5\xe9\x25\x99\x66\x17\x50\x62\x59\x9e\x5e\x6c\x30\x69\x1b\xf0\xb7\xde\xd1\xad\x44\xff\x7c\x7a\x09\x36\x2d\xb9\xac\x59\xb6\x37\xf3\x82\x73\xd6\x3d\xdd\x95\xa2\x72\x54\x4f\x0e\xc1\xa7\x11\xf8\x19\xc8\xf9\x96\x71\xe0\xa4\x02\x1d\x39\xf7\xf4\x88\xe3\x1c\xce\x6d\xa9\xa9\xf7\x8b\xd5\x7f\xd6\x2c\x94\x45\x5f\x41\x99\x2d\x1c\xdb\x5d\x14\x6b\xc5\xf3\x11\xff\xcf\x0f\xa7\xcd\x91\x52\x7d\xaa\x9b\x4d\x34\x5d\x52\x0a\x1b\x6d\x5c\x8f\x2f\x98\x68\xe3\x52\xe2\xf8\x82\x89\x6b\x89\x8b\xe1\x02\xbe\x02\xdf\xef\x51\xe9\x20\xeb\x8d\x5f\xcb\xb8\x96\x10\xfc\x9f\x27\x17\xac\xd7\xae\x46\xaf\xd8\x1b\x19\x5e\xa4\x10\x0d\x87\x25\x07\xf2\x7e\xc1\xe4\x9d\xe1\xfe\xb4\x0f\x11\x37\x1c\xc9\xfb\x5d\x46\x86\x8c\xf9\xdd\x00\xd9\x40\x27\x4b\x21\x1e\xdc\x16\x68\x68\x21\xae\xf1\x89\xc3\xdb\x5d\xd7\x4f\x0a\x53\xf1\x4b\x86\x2b\xcf\x45\x1e\xe3\x47\xc8\x44\xc8\x1b\x2e\x4b\x6e\xd6\x2c\x4b\x69\x76\x4c\x2a\xc3\xda\xc3\xc1\x4b\x83\xee\x9b\x65\x39\x36\x38\xa8\xa6\xa7\xe6\x5d\x6a\x26\xf5\xed\x65\x41\x96\x03\x92\xbd\xf9\xf0\xfe\xf3\xc7\x0f\xed\xea\xef\xef\x67\x68\x36\x9d\x4b\x05\x5f\xd9\x60\x13\x41\xd3\x8d\x9c\x52\xa0\x50\x5a\x56\x39\x87\xc9\xf3\x46\x10\xe6\x2b\x43\xb0\xaf\xf5\x96\xf2\x6d\xbc\x51\x55\x26\x0a\x10\xb2\xdc\xb3\xa0\xde\x83\x87\x87\x84\x37\x5c\xcf\x5c\xf1\xef\xa7\x42\x6c\x6b\x11\x02\xab\x7f\xef\x02\x31\x3f\x5b\x2a\xa8\xda\xa0\xc2\x29\x3b\x5b\x03\x66\xdc\xc2\x79\xd4\x68\xf0\x43\x56\xe5\xac\xf8\xa5\x64\x9f\x37\xbe\xa1\x1c\x4d\x6d\x07\x6e\x45\x1c\x9f\x3b\xd7\xa9\xa2\x9f\xda\x77\x55\x78\xe7\x48\xdc\x56\xd6\x79\xdb\x7c\xea\xb6\x8c\x26\x21\x8a\xd7\x05\x9b\x29\x5b\x8f\x22\x06\x1e\xff\xfe\xec\x6b\x79\x31\xd4\x34\x76\x3b\x55\xe3\x9f\x95\x85\xba\x9a\x0e\x90\xbd\x89\xf5\x3c\x3d\xc9\x2a\xc3\xe1\x2b\x53\xcc\x6f\xaa\xa8\x81\xdd\x00\x49\xf3\xb3\x37\x1d\x60\x70\x76\x1c\x28\xe6\xe7\x44\x1c\xea\x39\x29\xca\x30\x7a\x8f\x5c\xd1\xda\x37\xf9\x48\xb9\x66\xf0\xaf\x17\xba\x1b\x3f\xe3\x48\x18\x25\x0c\xa2\xc9\x6f\xf0\x57\x42\x7e\x45\xa4\xbb\xae\x79\x67\xea\xd7\x6f\x13\x31\x6b\xdc\x0d\x1c\x46\x3d\xca\xf9\xf8\x7a\x82\xbf\xd2\x0b\xc5\x38\xbf\x55\xcd\x60\x1e\xb4\xe9\xa8\xb8\x49\xdc\x66\xfd\x0a\x6a\x43\x37\x4b\x5d\x30\x5f\xab\x9d\xa8\x44\x91\x54\xcf\x52\x78\xf9\x25\x1e\xdc\x5d\x32\x64\x77\x48\xc0\x70\x5a\x93\xd1\x29\x88\xee\xff\xe3\xac\x58\xdd\x03\x17\x99\x08\xab\x09\xef\x5b\x10\x97\xb5\xff\xbe\xf9\xe5\xaf\x6f\x7f\x39\x4a\x64\xfd\xcd\xef\x7b\xa1\xce\x4d\x41\x4e\x4e\xe1\xd6\x85\x3b\xd7\xab\x3b\xdd\x6b\x4d\x83\xe0\xbf\x12\x6b\x61\x47\x22\x9b\x44\x4e\x4c\xda\x3b\x49\x5b\x31\x24\x79\xa7\xcf\xbd\x91\x02\x87\xdc\x58\x75\x80\x3a\x16\xd3\x0f\xea\x8a\x99\xfa\x93\x33\x7d\x25\x3f\xde\xf8\xa4\xe2\x54\x6d\xeb\x5c\x13\x35\xc5\x52\xd0\x29\xa0\x50\x4a\x5f\x2b\x06\xa5\x1a\xaa\xaf\x61\x22\x5f\x9b\x7a\x23\x50\xc8\xe4\xe4\x4d\x65\x47\xdc\xd4\xea\xed\x23\x96\x55\x93\xd2\x66\xe3\x6b\xec\xa4\x53\xb8\xe1\x9f\xda\xab\x23\x8e\xd4\xa0\xa0\xa3\xd2\xd1\x06\x95\x57\xd2\x50\xb4\x90\xa4\xd8\xbe\xec\x21\x23\xdd\x7e\xb6\xd5\x7d\xa9\xfe\x1b\x48\xe0\xe5\x69\xa8\x68\xab\xfc\xfb\x1e\x1c\xfb\xf2\xe5\x08\xf3\xe5\x18\x25\x6d\x44\x7c\x4b\x2d\x42\xfe\xf1\x4f\x3f\x9d\x28\xf7\x7b\xee\xe3\x71\x76\x13\x7f\x7c\x1d\x56\x35\xf5\xc1\xfc\xae\x78\xcd\xa6\x7d\xfb\xf1\xf3\x49\x7e\xd9\xdd\xfd\x0a\xdc\xe6\x4c\xbf\x72\xba\xdf\x57\x52\xe1\x56\xd7\xab\xab\x07\x16\xf6\x89\x61\x1c\xf4\xb1\x7c\x0d\x59\x21\xd3\x9b\x90\x0b\xd4\x04\x55\x94\x61\xfd\x63\xaa\x55\x44\x95\x92\xa2\xad\x3e\x73\x9c\xac\xa2\x83\x87\x71\x54\xf8\x5b\x93\xd2\x19\xa8\xba\xd3\x50\xbd\x0b\xab\x0e\xe4\x97\xae\xb9\x58\xf4\xbc\x66\x2a\xfe\xf4\x54\x50\x45\x46\x07\xec\x6b\x64\xb9\x29\x54\x50\xd6\x19\x59\xa4\xf7\xa9\x18\x04\x06\x2d\xb7\x74\x0e\x65\xfa\x67\xb7\xfb\x85\x5d\x49\xa9\x49\xa7\x71\xf6\x2c\x19\x91\x0c\x83\xfa\xd4\x75\x74\xcd\x0c\xc2\xfc\x2e\xfe\x3a\xc2\x7c\xae\x26\xb4\x93\x87\xa3\x27\x64\x1f\x5e\x3a\x59\xb3\xee\xb2\x8a\xce\x70\x95\x86\xab\x76\xcd\x69\xae\xb8\xeb\xc8\x2d\x3c\x92\x5c\xd7\x76\xbf\x8c\x05\x4a\x66\xa2\x9c\x17\xbe\x81\x97\x4c\xd3\x53\x5d\xf5\xc3\x2c\xcf\x10\xd0\x1d\x29\x75\xc1\xeb\x1c\x69\x24\x94\x0e\xe5\xd9\x4a\xad\xa2\xe7\x22\xba\x43\x10\x46\xac\xfd\xf9\xa8\x1d\xb2\x18\xbf\x8f\xf7\x47\x87\x8e\x98\xd7\xcc\x9b\x23\xbd\x61\xf1\xfc\xbe\xbf\xac\xfc\xb7\xeb\x30\xaf\x13\x65\x87\xcc\xd1\xac\x5c\x52\x92\x6a\x29\xa8\x71\xdd\xa9\x29\x1c\x7e\x46\x39\xa4\x5a\xe4\xd7\xe8\xe3\x4b\xaf\xe4\x9a\xe0\xbd\xc9\x0a\x8a\x08\x40\x98\x44\xd1\x21\xd1\x78\x2b\x4a\x97\xce\x50\x28\x14\x65\xcb\x69\x33\x84\x91\x39\xeb\x3a\xc6\x3d\xba\xd6\x81\xfb\x49\xf7\x15\xdd\xa5\xd7\xe2\xc9\x1f\xa6\x5d\xc7\xf4\x29\xb5\x96\x49\x90\xe0\xc0\xbf\x29\x38\x5f\x40\xa9\xc0\x5a\xf4\x29\x2a\xca\x76\x9f\x79\x7a\x74\xa8\x24\xe8\x64\x6c\xd1\x36\xac\xdb\x4c\x91\x15\xb2\x5e\x77\x76\xdc\x80\xd4\x70\xae\x6e\x0d\xe7\x0f\xfe\x4f\x1e\xe1\xde\x1b\x53\x67\x7b\xf1\x18\x63\xbf\x24\xb5\x7f\x7b\xcc\xdd\x59\x08\xa5\x8a\x21\xfb\xa4\xe5\xbe\x62\xa8\x2b\x48\x69\x50\xf6\x2e\xa5\xb6\x60\x5f\xba\x12\x91\x55\x2a\x4c\xb1\x6b\xa7\xe2\xe4\x62\x26\x4e\x22\x5b\x76\x97\x97\xfc\x8c\x64\xc7\x5e\xf7\x23\x47\x49\xc7\x55\xb7\x24\x0e\x3f\xb0\xfc\x1c\x06\x1e\x28\x5d\xaf\x96\x42\xbf\xf0\x61\xf7\x4a\x09\xf4\x56\xd2\x9a\x6e\x35\x53\xda\x3a\xb5\x91\x7e\x13\xe2\xf2\xba\x87\x22\xdc\x03\x11\x9b\xb5\x82\x21\x6a\x12\x2c\xb1\x45\xcf\x6a\xa9\xb3\x15\x4a\x0e\xb1\x1f\x4b\xce\x57\x92\x54\x27\x1b\x22\xe1\xcd\x3e\x17\x6b\x3d\x4b\x95\xd2\x62\xf3\x89\xe7\x25\xba\x1f\x24\x74\x92\x84\x4e\x62\xda\x19\x99\xfe\x3b\x10\xd9\xbe\x34\x7a\x77\x5a\x5c\x9b\xd5\x84\x7f\x7c\xfb\xcb\xbb\xcd\x9b\xed\xe6\xfd\x5f\x0f\x7c\x77\xe6\x3e\x34\xc6\xcf\x72\xff\xc4\x69\x5d\x3c\x31\xb2\x54\xea\xd9\x31\x85\x34\xcb\x77\xee\x64\xcb\xf1\xf8\x8d\xc3\x7c\x41\x71\x9a\x2e\x08\xa9\x68\x5c\xb3\x8e\x4b\xd7\xac\xaf\xf3\x04\x9a\xa5\x17\xe0\xe3\x8e\x7e\x3f\x8d\x13\x11\xf8\xb3\x4f\xde\xe0\xed\x73\x2e\xc3\xc1\x4d\xae\x3e\xfe\x3e\x1f\x3e\xf4\xf3\x91\x84\xd8\x95\x66\x29\xcd\x6e\x1f\x87\x5e\xf3\xc6\x29\xb3\xc2\x19\xdc\x36\x50\x74\xe3\x7b\x48\xf9\x76\xa1\xdf\xcf\x64\x3e\x19\x35\x22\x51\x36\x72\x70\x59\x25\xbe\x2e\x55\x4d\x3c\xfd\x75\x7f\xfb\xd7\xd3\xe9\xaf\xe7\xdb\xbf\x9e\x4f\x7e\x7d\xb4\xd6\x57\x7f\xbd\x9c\xfe\x7a\xbc\xfd\xeb\xdc\x0c\xe2\xc1\x2b\x89\xf0\x76\x33\xf9\x2d\x34\x7c\x91\x31\xfb\x16\x9a\xbe\xc8\x7e\x7d\x0b\x8d\x5f\x64\x3e\xbe\x99\xf8\x2e\xb2\x8e\xde\x4c\x8c\xaf\x32\x97\xde\x8d\x38\xcf\xf5\x96\xbe\xd8\xdb\xa5\xc4\x7a\xae\xb7\xfc\xe5\xde\x2e\x24\xde\x73\xbd\x95\x93\x1a\xad\x34\x86\x4f\xed\x08\x4b\x09\x8b\x44\x49\x95\xce\xd4\x27\xab\x14\x47\x31\xd6\x9d\xe4\x9a\xf3\xb0\xe6\xb4\x6a\x0d\xa5\x37\x6c\x55\x40\x58\xc6\x75\x54\x71\x3c\xac\xe3\xa6\xaf\x8f\x9f\xf6\x27\x09\xd9\xca\x37\x12\x63\x70\x18\xb4\x98\x8f\xa0\x1b\xe9\x35\xd3\x3f\x60\x74\xf7\x3c\x5d\x60\x39\xaf\xdc\xdd\xc6\xbd\x2f\xb2\xda\xdf\xc6\xbf\x2f\x32\xd4\xdf\xc6\xc1\x2f\xb2\x5e\xdf\xc6\xc3\x2f\xb2\x2e\xdf\x81\x8b\xbf\xca\x16\x7c\x47\x3e\x7e\xa6\xbf\xf8\x8a\xfe\x2e\xe6\xe4\x67\xfa\x4b\x5f\xee\xef\x72\x5e\x7e\xa6\xbf\xfc\x8a\xfe\x2e\xe6\xe6\x67\xfa\x2b\x67\x8c\x28\xd5\x49\x6b\xcf\x44\x55\x61\x6d\x99\xf8\x1b\x32\xcd\x40\x57\x1d\x50\xe8\xde\xf0\x1d\x2b\xec\xaf\x9a\x02\xbf\xf6\x90\xe5\x37\xd5\xc5\xe1\x4e\xbd\x54\xd4\x5c\x4b\x5c\x72\x7a\x7a\x69\xac\xef\xfe\x96\xe9\xdf\x9c\x67\x7f\xfb\xd9\xdf\x8d\xfe\xfd\x28\x62\xc4\x2f\xa5\x59\x8b\x6c\xa5\xde\x96\x66\xcd\x59\xff\xa8\x29\x5d\xc7\x77\x7c\x77\xa7\xb1\x11\x8f\x35\xdb\x03\x35\xf3\xec\x59\xd2\x51\xc1\x61\x93\xc8\x17\x93\x86\x8c\x0f\x1e\x25\x3f\x75\xc4\xb5\x0f\x15\x5c\x16\xb3\x87\x14\x65\x82\xf9\x9e\x85\x8c\xef\x65\xb1\x6e\x3c\x41\xb9\x97\xfd\xfa\x0b\x22\xce\xaf\xa3\x3a\x75\xd5\x9c\xe8\x0f\x0c\xba\x4e\x99\x61\xa0\xc0\x2b\x04\xdd\x7c\x33\x3a\x04\x5f\xfc\xbe\x97\xf3\x1a\xab\xfd\x77\xc0\x9a\x5f\x6f\x09\xfe\x92\x2d\xf5\x5f\x37\xbf\xbe\xfd\xf3\xc7\x77\xbb\xb9\xfb\xfa\xfc\xa0\xe2\x4e\xb5\x9a\x3c\xaa\xe8\x2c\x9d\xac\x2f\x2a\x19\x73\x78\xa2\xce\x0e\x35\x16\x1d\xb9\xb0\xf1\x14\x50\x23\x59\x3a\x85\xce\x53\x70\xf8\x7b\xd1\xff\xda\x7b\x73\x0f\x6f\x3d\xbd\x34\xca\x16\xfd\x46\x60\x80\xd7\xa6\xcb\x66\x42\xc5\x59\xfd\x7b\x31\xbe\x83\x7b\x78\x5b\x1a\x4a\xb7\xc5\x39\xa8\x46\x29\xa7\xc7\x2e\xc7\xc7\x3e\x7a\xeb\xdc\xd8\xe5\xf8\xd8\xeb\xdb\x97\x8e\xfd\xd0\x77\x35\x1a\xe6\xb5\x38\x0a\x61\x99\xe1\x7e\x5e\xc8\x79\x25\xcc\x71\x38\x88\x3e\x74\xab\xef\x2a\xb2\x7b\x24\xca\x69\x33\x06\x44\x0f\x22\x7b\x14\x44\xc3\x4b\x4f\x2f\xf5\xd0\x76\x51\xe3\xf9\x6a\xe1\x20\xde\xaf\x21\x07\x33\xbe\x81\x5b\x28\xf0\x5c\x5f\xbe\xa7\xdb\x2b\x82\xaa\xf7\x13\x39\x58\xeb\xe3\x13\x19\x5e\xc2\x44\x7c\x9d\xc8\x74\xa9\x2b\x3a\x04\x73\xb0\xd2\x11\xfe\x99\x57\x4e\xe4\xb4\xf3\xab\x03\xf2\x89\x52\xee\xd2\xaf\x91\xe1\x35\xe5\xb9\x1c\x61\xab\x1c\x71\x39\xab\x60\x21\xe7\xff\x7f\xf6\xfe\x85\xbd\x71\x1b\x49\x14\x86\xff\x8a\x9b\x9b\xf5\x88\x69\x10\x26\x00\x5e\xe5\x30\x5e\xc7\xc9\x8c\x32\xc7\x9d\x64\xd2\x89\x66\xc7\x97\x64\xd9\x14\x6d\x71\x9a\x26\x1d\x92\x52\x77\xc7\xd6\xfe\xf6\xef\xa9\x02\x78\x95\xe4\xb6\xec\xce\x9c\x3d\xdf\xbb\xdd\x8f\x29\x12\x04\x71\x29\x14\x0a\x85\x42\x5d\x8e\xd1\xba\xc5\x6d\x5d\xb4\xd5\x75\x7e\x52\x7d\xda\x35\x14\x86\xa5\x31\x44\x65\xd2\x46\xa3\x14\x75\x46\x6d\x83\x3f\x16\xad\x77\x12\x58\x7e\x4a\x11\x88\xfd\x58\x05\xcb\xff\x89\xf3\xe9\x69\x7a\x91\x2e\x61\xe6\x30\x32\x72\x3b\x9a\xcc\xa3\xb6\x7b\x2c\xd0\x21\x65\xe3\x28\xd9\x27\x6c\xbb\xf0\xee\x69\x5a\x92\xb8\xac\x13\xa9\x91\xd7\xce\x09\x13\xb8\x02\x46\x99\xfd\xb4\x49\x60\x53\xf1\x24\x2d\xd2\x07\xf4\x0e\x39\x1e\x71\x43\xc9\x78\x22\x6f\x13\xd1\x4c\x2f\xf4\xbc\x4a\x6d\x1b\x75\x98\xe5\x45\x62\x84\x4b\x19\xa3\xb6\x03\x33\x83\xb9\xc3\x45\xc6\x90\x6e\x18\xfe\x57\xa7\xf0\xe1\xed\xee\xa7\xe2\x98\x84\x09\xcc\xae\x03\xa8\xbd\x43\xf0\xfd\x0d\x36\x63\x1c\xd6\x8c\xd0\x26\xb6\x32\xf7\xb4\x0d\xfb\x58\x3e\x99\x52\x3d\x04\x33\x00\xd3\xec\xaa\x46\xa1\xf7\x71\xc2\x3b\x71\x5f\x55\xfc\xe8\xc7\x6e\x5e\x37\xb2\x3e\xae\xff\x50\x3b\xea\x0c\x0f\xb7\x43\xe6\x7a\x74\x3b\xc4\x26\x7d\x9f\x7f\x01\x44\x9e\xa2\x70\xf7\xaf\x80\xd0\x0e\x6a\x58\x43\xa1\xc3\xb4\x46\xc6\x7a\xd5\xec\x8b\x20\x84\xf1\x14\xac\xaf\x17\xff\xbe\xa4\x62\xcb\xa9\xc3\x63\xf5\xbd\x3e\xf5\x46\xdc\x7a\xe4\x4a\x8b\x5e\x88\xbd\x76\xf8\x48\x7f\xf8\xe4\x6b\xb4\x4f\xee\x0e\x9e\xd1\x43\x2a\x4b\x3a\xde\xfc\x84\x9b\x56\xe6\xa1\xab\xb3\x6e\xbb\x7c\xca\x31\x22\x55\xa3\x06\xe6\x62\xbc\xeb\x5a\x5d\x89\xa3\x56\x96\xcb\xba\x53\x42\x15\x82\x21\x17\x9e\x8a\x7a\x4f\x51\x5f\xea\x2e\xb6\x66\x83\x82\xb8\xd4\x0f\x17\x35\x42\x2d\x0c\x2a\xc6\x4e\x39\xba\x6d\x7b\x12\x3e\x6e\x5a\x87\x1f\xaf\xbf\xf4\x3f\x71\x71\xfb\x58\xeb\xad\x47\x4b\x0c\x8e\xb3\xe4\x26\xac\x92\x7c\x68\xd8\xdb\xf3\x7d\x21\xbd\xc1\xb9\xe8\x5b\x19\xbd\xae\x98\x4a\x81\xd7\xb1\x0c\x76\x6c\x51\x01\xa9\xb5\x5e\xaf\xf4\xf8\xc8\x5d\xea\x40\x76\xf4\x36\xd5\xe8\x0c\x32\x8c\x9a\x88\x0e\x7a\x99\xba\x2a\xde\xc5\xe0\xd4\x76\x88\x43\x31\x28\xa3\xea\xbf\x8a\xec\xe1\x88\x63\x60\x60\x6c\x22\xaf\x6a\x52\xb5\xad\x7a\x9e\xe4\xc1\xc3\xe0\x0a\x2e\x8c\x91\x0b\xed\x71\xbb\xa1\xf0\xd1\x93\x1e\x47\x4b\x30\x4f\x5e\x6a\x56\x8b\xbb\x86\x1c\x38\x0b\x19\x63\xbc\xaa\x3d\x93\x80\x79\xe8\xd9\xc4\x87\xfc\x7e\xfd\x91\x49\x90\x0a\x20\x83\xed\xcb\x88\xbc\x4e\x57\x90\x61\x53\xce\x8f\x95\x97\x54\x4b\x1a\x8e\x48\x5f\x9d\x4d\xfb\x9e\x27\xa5\x40\x43\x37\xee\x50\xce\x42\xc6\x95\x07\x6f\xc5\xf5\xc3\xc4\x33\x04\xb5\xd1\x89\xb1\x0c\x81\x8c\x57\x45\x00\xda\x2f\xcf\x54\x31\xd6\x31\x80\x5f\x0e\x42\xa3\x50\xcb\x70\xa3\x6a\x51\xc6\x42\x8c\x10\x57\xf3\x3d\xc0\x7f\x62\xc4\x03\xc6\xd5\x55\x7d\x80\xce\xa0\xcd\x0d\x45\xa9\x4a\x60\x97\xe2\x39\x84\x79\xf3\x5d\x34\xee\x6a\x21\xc7\x80\xe4\x50\x1b\x29\x99\x1b\x3a\xd2\x78\xcc\x62\x03\x24\x73\x01\xc9\x1c\x44\xb2\x76\xc3\x5a\x7f\xf5\x64\x4e\xcd\x95\x01\x97\xa9\x2d\x42\x1f\x3d\xf4\x3b\xed\x90\x5b\xe8\x46\xf4\x58\x86\x3a\x94\x57\x59\x6d\xfb\xd1\xd3\x39\x33\xf4\x85\xc9\x71\x38\xd1\xa5\x14\xab\x25\x0d\x18\xee\x99\x59\xca\x7b\x74\xe7\xa5\x1a\x6b\xf8\x6c\x17\x3e\x6c\x40\x4f\x4e\x92\x93\x07\x5c\x51\xa0\x57\x28\xe6\x53\x0f\x79\x8d\x81\x69\xa7\x63\x1b\xca\xa2\xdc\xaa\xaf\x8a\x6c\xb8\xd2\x24\x2a\xc2\x68\xd2\x72\x7e\xe2\xd6\x34\xf4\xa9\x0d\xe4\xd7\x6e\x98\x6c\x83\x5a\x7e\x6a\xc8\x18\x3a\x1e\x3b\xc6\xb8\x32\x6e\xeb\xf4\xbd\xd3\x80\xe7\x52\x0d\xa1\xb6\xc3\xca\x76\xd6\xf2\xa1\x47\xa4\xb5\x48\xe5\x94\x1b\xa8\x0d\xec\x4a\x5b\x79\xd1\xfa\x76\xb2\x2d\xc3\x3a\x65\x2e\x90\x0c\xbf\xab\x92\xee\x51\x06\xbb\xe1\x79\xcf\x69\x18\x50\x14\x9f\x9d\x32\x40\x1d\xbb\xeb\x6c\x86\xfb\x06\x75\x07\xdf\xdb\x9c\x58\xa9\x81\x51\x51\x84\xdd\xf5\xd2\xc5\x5c\xc2\x53\x86\xdf\x30\x16\xa2\x9b\x25\xbf\x86\xbd\x69\x70\x6a\xda\xc4\xa6\x02\x83\x71\x78\xf2\xa2\xa6\xa2\x04\x20\x77\x52\x2a\x18\x15\x6e\xe8\xc2\x74\x71\xdb\x40\x47\x18\x9f\xd4\xa2\x3e\x76\xd1\x97\x17\xd5\x6a\xee\x60\xe0\xa3\x94\x51\x8f\xfa\x2c\xf4\xa8\xeb\x10\xaf\xb5\xca\x90\xce\xc4\x6c\x76\x3c\xac\xb3\x03\xdc\xe7\xfa\x12\x40\xc9\x99\xcf\x60\x9d\x60\x3e\x61\xde\xb1\x8f\x0e\x57\xda\x78\x31\x12\x21\x38\xb5\xec\xd0\x97\x94\xb9\x0e\x87\x6b\x08\x02\xb8\x04\x5f\x33\x8a\x6b\x43\x0f\x93\x7c\xe8\x88\xea\xf2\x70\x6d\xc0\xc0\x04\x2e\x4f\x71\x89\x6f\xfc\x7d\xa1\x6f\x41\x83\x32\x91\x1a\xd0\x57\x8b\x9a\x5d\x07\xb3\x00\x5e\xd7\xa3\xbe\x55\xc7\xb8\x07\x44\x07\xa0\xcc\x29\x4b\x2d\x0c\xc0\x6a\xf5\xfc\xae\xf9\x06\xa3\x5d\x83\x86\xb6\xb7\xcf\x92\x08\x5b\x18\x76\xc0\xa4\x96\x35\xa7\xa6\x07\x35\xfb\x46\x8b\x4b\x18\x15\x96\xb9\x06\x4f\x0d\x46\x85\x4f\x19\x0f\x51\x5b\xdf\xad\xd7\x32\x26\xe5\x4f\x4c\x32\xff\xf2\xaf\x46\x7b\x47\xa8\xe9\x2d\x3d\x63\xf1\xda\xe2\x97\xba\xc8\x9e\x8a\xc8\x80\xf9\x6d\xe0\xfc\x36\x50\x40\x11\x22\xb1\xf2\x1b\xc3\x70\x98\x50\x04\xe0\x0a\x35\x88\xae\xf7\x3c\xea\x73\x43\xfa\xb3\xed\x78\x12\x36\x01\xef\x52\x68\xfe\x10\xda\xd2\x4b\xee\xce\x42\xed\x21\xe3\xa0\x5c\x67\xa9\x19\xc7\xdd\xde\x8c\x13\x84\x9f\xa2\x8f\x52\x2a\x80\x36\xb8\x30\x43\x1a\x76\x9c\x71\xa0\x02\x28\xa2\xc4\x3f\x45\xe8\xb8\x6f\xf0\x53\x0e\x64\xd8\x72\x80\xb8\xf9\xc4\x6f\xac\x31\x0c\x19\x49\xcc\xb7\x8f\x7d\xea\x62\xac\x17\xd5\x17\x17\x70\x5b\xf0\xd4\x40\x6a\xde\x3a\xae\xc2\x66\x78\x3e\x24\xcd\x71\x55\xee\x91\x94\x94\x5a\xdc\xe8\x79\x83\x47\x90\x61\x90\x81\xe7\x38\x4b\x6c\xa2\x39\xf3\xed\xcb\x80\x4d\xac\x89\x4b\x3d\x71\xcc\x64\xfb\x9a\xc8\x72\x0e\xb1\xa9\xcf\xa6\xc2\xa4\xa6\xbf\xf6\xd2\x45\x8b\x5f\x3e\xe1\xd2\xa7\x1c\xd2\x5e\xb8\x28\xfc\xc7\xf8\xaa\xa6\x3f\xf5\xcf\x5e\x71\x0c\xc6\x83\x46\xc1\x52\x6b\xdc\x3a\x7b\xe5\x49\x05\x7e\xce\x97\xce\xdc\x79\xa2\x12\x7f\x47\x0c\x87\x41\xd1\x59\x88\x7c\x52\xc3\x2c\x6d\x8a\xd1\xbc\x34\xa8\x65\x3d\x22\x4a\xf3\xdc\x0c\xd1\x4d\x22\x5e\xd4\x80\x7f\x8a\x38\xcd\xc7\x6b\x71\x9a\x65\xdb\x9f\xe2\xd9\x6d\xe8\x7a\x0e\xa6\x95\xb3\x6d\x24\x01\xc8\x18\x59\x60\xf0\x86\xa1\x7d\x29\xf5\xd9\x83\x03\xc9\x6c\x1c\x48\x4e\xb8\xb3\x29\x16\x33\x2c\x59\xde\xd2\xa0\xe2\x14\x58\x6f\x97\x70\x98\xe7\xbb\x46\x62\xee\x42\x9b\x11\xdc\xcc\x50\xcb\xc3\x81\xe8\x15\x61\xc8\x40\xdc\x3e\xee\xf7\x80\x17\xa6\x8e\xbd\x94\xa3\xaa\xc2\x34\x1f\xf7\xf1\x80\xd5\x40\x66\xa9\x89\x52\xf6\x5e\xfb\xf1\xa5\x73\x76\xc3\x0d\xe6\x4c\x6d\xea\x59\xa9\x45\x39\xec\x9a\x1e\x1f\x9c\x4c\xcd\xb9\x9f\xe2\x68\x9e\xe5\x69\x7e\xfd\x01\xa7\x5e\x19\xdc\x69\xc5\x22\x8d\x0b\xe3\x36\xce\xa2\x24\xd5\xc6\x9d\x58\x26\x90\xfe\x03\x26\x13\xed\x76\x9e\x67\xb1\x31\x0f\xb3\x59\x19\x57\xdd\x5c\x3f\xc0\x8b\x89\x4c\x27\x5a\x96\x1b\xef\x92\xab\xa4\x9b\xe1\xbb\xfc\xef\xc9\x55\x42\x92\xac\xac\xc2\x34\x1d\x77\x83\x2b\x61\x0a\x59\x64\xeb\xef\x7e\xae\xd3\x48\x1a\x7e\x88\x8b\xb2\xf3\xea\x14\x13\xc8\x9b\x34\x8f\xde\x76\x92\xbf\x82\x67\xa2\x61\x72\x69\x5c\x17\xf9\xe2\x56\x1b\xbe\x2e\xd1\x25\x2b\x79\xb3\xc8\x66\x69\xdc\x7d\x89\x09\x04\x5a\xde\x49\xc5\x66\x6b\x45\x18\xbd\x35\xca\xb8\x58\xc6\x45\x0f\x38\x61\xf4\xf6\x35\xa6\x12\x6d\x1e\x16\x33\x63\x96\x94\x6f\xbb\x19\x26\x61\x31\xfb\x3a\x29\xa1\x49\x61\xf4\x76\x71\x6b\x14\x71\x59\xe5\x45\xdc\x6b\x14\xbe\xf9\x51\xbe\x20\x32\xdf\xda\x6b\x32\x8b\x97\x49\x14\x77\x41\xf0\xb5\x4c\x21\x6f\xe3\x0f\x6f\xf2\xb0\x98\x75\x5e\xfd\x1f\x95\x44\x6e\xf2\x45\xd9\xed\xe3\x2b\x78\x26\xb3\xb0\x9c\x0f\x3f\xf9\xba\x4e\x23\xf3\xbc\xac\xc6\x7d\x6f\xf3\xa4\x94\x9e\x92\xc7\x6b\xbe\x93\x49\x94\x2e\xca\x2a\x2e\x3a\x6f\x4e\x64\x0a\x09\x6f\x6f\xd3\x24\x42\x19\x41\xb7\xd9\xc7\x9d\x64\xf2\x66\x91\xa4\xb3\x24\xbb\xee\x0d\x83\x4c\x22\xd1\xed\xa2\x5b\xea\x0f\x3f\x93\x9b\xf8\x26\x2f\x3e\x74\xbb\x83\x09\x44\x9b\x85\x55\x68\xa8\x96\x68\xbd\x4e\x55\x61\xdd\x1c\xad\x88\xcb\x7c\x51\x44\xb1\x71\x9b\xe7\x7d\x14\x57\x2f\x7e\xc8\xf3\x94\x94\xf3\x24\x4e\xbb\x80\x79\x8d\x09\x44\x93\x2f\x8c\x68\x1e\x47\xbd\x21\x96\xef\x4f\x20\xb9\xc9\xf4\x7e\x3d\xc3\x7f\x92\xe4\xe6\x36\x2f\xba\x90\xfd\x16\x13\x48\xfc\x7e\x90\xfe\x0d\x26\x10\x6d\x71\x9b\xe6\xe1\xcc\x88\xd2\x7c\x31\xeb\x16\xf8\x33\xa6\x9f\x40\x32\xd1\x66\xf9\xbb\x6c\x73\xb6\xaf\xd5\x1b\x99\xf1\x36\x5d\x5c\x27\x59\x77\xca\x62\x02\xb9\x4a\xf3\xdb\xdb\x2e\x4c\xff\x8c\x09\x24\xca\x6f\x6e\x17\x83\x81\x55\x49\x64\x96\x94\xb7\x69\xd8\xfd\xe8\x6b\x99\x42\xaa\xb8\xb8\x49\xb2\xb0\x3b\x89\x7f\x52\x49\x24\xca\x67\x71\xaf\xb4\x59\xdc\xc5\x91\xcd\x28\x42\xde\x84\x55\x15\xf7\x06\xfd\x2b\x99\x42\x6e\xf2\x37\x49\xda\x47\x6e\x48\x20\x55\xf8\x26\x8d\xbb\xf0\xfc\x09\x13\x88\x96\xc5\xd5\xbb\xbc\x78\x6b\x5c\xa7\xf9\x9b\xde\x0c\xfc\x4e\xbe\xf8\x0b\xa4\xb7\xd9\xca\xb8\xaa\x92\xec\xba\xdc\x90\xf3\xb5\x7a\xd5\xc9\xfc\x2e\xa9\xa2\xf9\xa6\xac\xf8\x82\x14\xf9\x00\x98\x3f\x62\x02\x59\xde\x74\xd2\xa6\xaf\x88\xb6\xbc\x79\x67\x84\xb7\x3d\xaa\x35\x7d\xf5\xf7\xe3\xdb\x5b\x12\xc5\x45\x95\x5c\x01\x5c\x7a\x60\x6c\x53\x49\x58\x44\xf3\x64\xd9\x7d\x7b\x2c\x53\xc8\x22\x5b\x7f\xf7\x73\x9d\x46\xa2\x3c\xcb\xe2\xa8\xea\x0d\x0e\xa6\xc0\x48\xaf\xbf\xfc\xba\x49\x24\x69\x92\x75\xc9\xef\x69\x92\xbd\x25\x8b\x6c\x90\xfa\x33\x26\x10\x0d\x31\xd4\x50\x10\xd3\x7a\x14\x23\x5f\xcc\x14\xbc\xea\x6c\x65\x14\xa6\xf1\x5a\xa6\xd7\x90\x5a\x67\xa9\x8a\xf0\xea\x2a\x89\xd6\x32\xfd\x24\xd3\x89\x16\x49\xef\x83\x46\xba\xc8\x54\xa6\xd6\x1f\x21\x99\xc5\xb7\x69\xde\xc3\x61\x4c\x20\xf3\x38\x4d\xde\x77\xe9\x1f\x3c\x93\xab\x34\x2c\xdf\xf6\x66\x49\x58\xbe\x25\xe1\xec\x26\xc9\x92\xb2\x2a\xc2\x2a\xef\x0e\xee\x71\x37\xbd\x5e\x1a\x8a\x64\x19\xaf\xad\x0d\x90\xd8\xcd\x80\x2b\x48\xb9\x31\x1b\xac\x23\x25\xc9\x96\x37\xdd\x41\xfc\x6e\xfa\x2a\x26\x65\xd9\x23\x58\xaf\xbf\x26\x6f\xd2\x45\x5c\xe5\x79\x35\xef\x2d\x7e\x2a\x0d\xd6\x47\x75\x6b\xe4\x57\x57\xda\xa6\x3c\xdf\x5f\x5d\x11\xed\xb6\xc8\xa3\xb8\x2c\x8d\x3c\x33\x96\x37\xbd\xe5\x5e\xbe\xf8\x3e\x03\x8c\x0d\xcb\x32\xb9\xce\x8c\x45\xd9\xa7\xbd\xc7\x98\xfc\x73\x09\x2b\x41\x95\x77\xd1\xfc\xb8\xca\x6f\x60\x41\x2c\x0c\x20\x09\xfd\xa5\xb0\x40\xb2\xa0\x45\x33\x63\xb6\xec\x51\xb3\x93\xd9\xd7\xcb\x19\x60\x6a\x15\x26\xd9\x80\x2c\xa9\x34\x39\xe0\x78\x6b\x2c\xf3\x74\x71\xd3\xc7\x9f\xfa\xdd\x14\x5f\x11\xed\x2a\x49\x63\xa3\x84\x1d\x47\x37\x5b\xb3\x0d\x21\xda\x6f\xeb\x0d\xfc\x9b\x6c\xdf\xa2\x7c\x33\xee\x05\xca\x26\x45\x38\x0b\x7b\xd3\x1b\x9e\x49\x54\x87\xf5\x1a\x6f\x08\xf5\x45\xca\xdf\x16\x49\x6f\xe0\xe0\x99\x24\x2a\xda\xe4\x78\x3d\x00\x25\x29\x54\x60\xb9\xf1\x7a\xac\x39\xa2\xc1\xba\xbd\xce\xf2\x34\xc1\x62\x88\xa6\x16\x71\x23\x94\xf1\x0e\xb4\xf5\xd5\x5c\x45\x42\x00\x0e\x6e\x16\xaf\x97\xd5\xf8\xb3\x27\xf0\xbe\x1c\xbc\x29\x49\x56\x7b\x48\x1e\x6f\xf0\x9a\x8c\xdf\x0c\x3e\x21\xb7\x79\x17\x00\x3f\xe4\x33\xa2\xdd\xc4\xb3\x24\x34\x22\x69\xd7\xad\x8d\x37\xdb\x7b\x13\xad\x0a\x6f\xe3\xf5\x39\xd5\xe8\x31\x92\xb0\x3e\x9f\x18\x6f\x38\xb3\x20\x5a\x94\x18\x51\x1f\xbf\x92\x93\x59\x17\x27\x0c\xbe\x11\x2b\xf8\x8a\x7c\xff\xe6\x9f\x71\x54\xd1\x59\x7c\x95\x64\x30\x13\x6e\xe3\xa2\xfa\x30\x5a\x67\xaa\x89\xa6\x18\x46\x52\xd0\x59\x5c\x46\x45\x72\x5b\xe5\x40\x81\xae\x92\xeb\x0d\xd9\x29\x8c\x9f\xae\xef\x50\x7c\x94\xdf\xdc\x84\xd9\xec\xb1\xe5\xd7\x6b\xf3\x4e\x75\xc8\x45\xd6\x40\xc6\xff\xb1\x15\xc9\x6f\x76\xaa\x26\x4d\xa2\x38\x2b\x1f\x5d\x43\x67\x29\xdc\xa9\x9a\x76\x39\x8b\x1f\x0b\xb6\xf3\x66\x37\x73\xb9\x53\x55\x45\x1c\xc5\xc9\xe3\x47\xff\x7c\xb0\xb7\xda\xad\xb2\x59\x0c\xb4\xf6\xd1\x55\xf5\xf6\x7a\x3b\xd6\x94\x85\x8f\xc6\x67\x58\x38\x77\x2a\xfc\x2a\x4f\x67\x71\xa1\x68\xf2\x63\x3b\xd3\x21\xe3\xd0\x15\x6d\x91\xc9\x9a\x66\xda\x8b\xa0\xfa\x70\x1b\xe7\x57\x7b\xef\x92\x6c\x96\xbf\xdb\xdf\x97\xbf\x74\x1e\x96\xdf\xbf\xcb\x9a\x96\x68\x27\x69\x58\x24\xd5\x87\x6f\xa3\x3c\x2b\x35\xbd\xc9\xd6\x4d\xa6\xe1\x6c\xb6\xa1\x76\x7d\x45\x34\x7a\x70\x5b\xe4\xd0\xc3\xf2\x20\x81\xac\x07\x65\x11\x1d\x94\xf8\xfa\xa0\x8a\xdf\x57\x46\x3c\x4b\x2a\xa3\x54\x73\xb0\xd4\xc6\x57\x8b\x2c\x02\x22\x34\x8a\x49\x45\x32\xfd\x4e\x5b\x94\xf1\x5e\x59\x15\x49\x54\x69\x87\x5b\x80\x45\xb4\x5f\x7f\x8d\xcb\x57\xf9\x6c\x91\xc6\x1a\xb9\x5b\x86\xe9\x22\x1e\xbf\x30\x57\x72\x33\xff\xbe\xfa\x66\x96\x54\x6a\x2b\xdf\x21\xea\x8b\xdb\xb8\x90\x10\xec\xa5\xbe\x59\x4f\xab\x8a\xe4\x6d\x5c\xcd\x8b\x7c\x71\x3d\x0f\x7a\x0b\x4f\x9c\x75\x33\x7e\xbf\xa8\x06\x29\x93\xe4\x7a\x9e\x26\xd7\xf3\x2a\x2e\x82\x2e\xd3\xff\xbe\x3a\xc9\xd3\xbc\x9b\x76\x1a\x66\xd7\x8b\xf0\x3a\xee\x24\x1d\xa7\xc9\x75\xf6\x53\x7e\x3b\x4c\x7a\x95\xcc\x66\xe9\x5a\xc6\xaf\xf2\xaa\xca\x6f\x82\x2e\x63\x39\x8b\x8b\x34\xc9\xe2\x41\xcd\xc3\x0f\x7f\x84\xf6\x0d\x5e\xa0\x28\xe0\x6f\x8b\xbc\xea\x7e\xfc\x43\x98\x64\xd5\x8f\x79\x9a\xf6\x3a\xf3\xdd\xe2\xe6\x4d\x5c\x9c\x26\xe5\x5a\xc1\xa7\xf1\xd5\xb0\xdc\xbf\x2e\xca\x2a\xb9\xfa\x30\x48\xfd\xb6\x0a\xd3\x24\xda\xd8\xae\x4d\x65\x0e\xd3\x4e\xe2\xac\x0f\xdf\x3f\xe7\x59\xf5\x3a\xf9\xbd\xdb\x76\xdc\x81\xbe\xc9\xdf\x0f\xda\x29\x3f\x1d\x76\x7e\x91\xa6\x71\x35\xc8\xf9\x55\x9e\xce\x82\x65\x9e\xcc\xf6\xcc\xc3\x65\x58\xec\x15\x41\x36\xda\x8c\xdd\x8b\x2a\x49\xcb\x83\x72\x79\x6d\x54\xe1\xb5\x71\x1d\x67\x31\x32\xba\x80\xdd\xfa\xe1\xa0\xc0\x62\x9b\x2c\x17\x3d\x18\xa1\xf3\xd8\x41\x18\x67\x93\x70\xf4\x68\x2d\xdc\xa5\x41\x4d\x67\x10\x97\xd9\x44\x09\xbe\x21\x28\xb7\xd1\x3f\x97\xbc\xd4\x52\x7e\x26\x30\x7a\xc1\xdc\x70\x8f\x65\x74\xdf\x4e\x70\x5f\x93\xf8\x18\x71\xc6\x09\x31\x58\x33\x5e\x6a\xc9\xa2\x8b\x11\x9c\xad\xb9\x4b\x85\x88\x2c\xa9\xc7\xec\xa2\x1b\x6b\xea\x79\xf2\xce\xa6\x02\xe3\xc1\x88\x13\xee\x50\xc1\x09\xf3\x51\xae\x6a\x51\x57\xe0\xc9\x13\x27\x9d\x2e\x9d\xbd\x62\x52\x57\x85\x51\x6b\x6e\x51\xdb\x8a\xb8\x74\x16\x6b\x53\xcf\x27\x32\xa0\x2f\x15\x62\x49\x4d\x07\xa3\xd2\x3b\x18\xfb\x1e\xcf\xbd\x7c\x74\x25\x86\x77\x13\x2c\x04\xe3\xe0\x08\x97\x70\x1e\x49\x2b\x75\x84\x00\x64\xc0\x60\xf9\xf8\x91\x90\x59\xa7\x0c\x1d\x1e\xd9\x11\x97\xfa\x53\x82\x3a\xe8\x13\x0d\x7e\xa1\xc2\x9d\x83\x85\xf6\x24\xf4\x1d\xac\x19\x8c\x6a\x47\xb9\xca\xa6\x9c\x49\xf5\x2a\x9f\x32\x17\x35\xac\x76\x71\xba\x81\x21\xee\x36\x16\xc7\xdc\x27\x94\xc7\xb7\x97\x87\x5a\xad\xbb\x96\x37\x0c\x1b\xcb\xa9\xc5\x89\xdf\x0f\xaa\x35\x61\xe6\x12\x03\x7e\x5b\x7c\x70\xcc\xc6\xc9\x2e\x56\x17\xc3\xf0\x9c\x32\x1e\xa5\xd3\x29\xbe\x1b\xae\xd2\xd8\x2d\x52\xd5\x86\xa2\xb9\xf5\x29\x8a\x5e\x0f\x57\xd9\xa1\x40\xdb\x88\x81\x30\x01\x4b\xbd\x89\x8d\x31\xa2\x28\xcc\xdb\xa6\x76\xc2\x29\x9f\x60\x86\xce\x1b\xa6\x8e\x9f\x77\x0b\x7e\xd1\x0f\xff\x88\x01\x6b\x1c\xca\x37\x15\x3b\x37\xf0\x00\xa2\x97\x4e\x76\xab\x8e\x0f\xa3\xab\x02\xc5\xe2\xe6\xc4\xa6\xae\xbd\xa9\x8f\x73\x6e\xd1\xb5\x17\x3b\x76\x71\x80\x9e\x18\x35\x90\x70\x67\x82\x21\xb4\x36\xf5\x67\x82\x59\x9e\x09\xd8\xf5\x38\xc7\xbd\xb5\x68\xeb\xa0\xcb\x60\x13\x1d\x84\x16\x4f\xc6\x3a\xb6\x8e\xd0\xa2\x87\xd0\x4f\x2f\x7a\x18\x8f\x1a\x43\xa3\x31\x73\xce\x9c\x7e\x91\x73\x63\xab\x2e\xf9\x23\x86\x0a\x56\x0d\x22\x70\xe2\xa1\xa2\x7e\xbb\xa8\x49\xdd\xb5\x53\x17\x4f\xc3\x30\xf4\x38\xaa\xe8\xbb\xd4\xb3\x8e\xfb\xe3\xc6\xa9\x4f\x7c\x2a\xac\x14\x75\x01\x6c\x2a\x4e\xb1\x54\xfb\xb8\x8f\x54\x4d\x55\xcf\x1a\xe2\x86\x03\xd9\xba\xc0\x33\xe2\x53\xd3\x83\xca\x05\x61\x94\x75\x8c\x9a\x3c\x87\x78\x13\x8b\x3a\x9b\x50\x92\xf9\x13\xc6\xa6\xdc\x1d\xc2\x01\x5e\xb9\xc4\x9c\x32\x93\x32\x7f\xee\x50\xc7\x3f\x46\xaf\x9d\xac\x39\xf6\x24\xaa\xc6\x67\xa0\x8d\x09\x3c\x08\xb3\x27\x9c\xd1\x8d\xf3\x9f\xf9\x13\x6e\x4f\xb9\x83\x13\x75\x73\xf3\x5c\xca\xc5\x5c\xa0\xf6\xc6\xda\xa4\x62\xbb\x19\x0c\x0e\x41\xde\x65\x05\xb7\x4f\x2a\xa0\x31\xcc\x9f\x32\x67\xee\x0c\xa2\x3f\xba\xc3\x75\xca\x9f\x76\xe3\x05\x62\x70\xf1\x09\xeb\xc7\x16\x64\xcb\x81\xfa\xc3\xdc\x59\x5a\x13\xfb\xe1\x3c\x13\xe6\x2e\xad\xa1\x65\xb0\x39\x11\x6c\xd0\x20\xde\xd3\x43\x81\x96\x9f\xbd\x62\x9c\x30\xb4\xa1\xb1\x96\xca\xec\xc1\x9b\x38\x53\xbe\xc9\xec\x61\x27\xe6\xa5\xe5\xad\xb7\x81\xce\xee\xf9\xf9\xb4\x08\x9f\x8a\x61\x27\xba\x0b\xba\xbd\x53\xec\xde\x35\x02\x05\xc3\xe4\x3d\x16\x2a\x37\x06\x23\xde\x84\x99\x3b\xc3\x61\x18\xf2\xd8\x22\xcc\x5e\xc3\x03\x6f\xca\x9c\x09\x17\x9d\x5a\x31\xdf\xd9\x8d\xc1\x91\x9b\x41\x2b\xbf\x5d\x49\xdb\x3a\xf0\xe5\x6e\xe7\x01\xc4\x1d\x60\xde\xc3\xe0\x17\xbb\xc5\x4e\x1e\xc0\xdf\x22\x7c\x1d\x6b\xb9\x37\x85\xf5\xb9\x8f\x04\xec\xec\x86\xc3\x3b\x67\xe9\x4c\x76\x0b\xd8\xd4\xa7\xef\x9c\xb8\x9b\x2a\x74\x26\xac\x0b\x78\xc8\xd6\xa9\x70\xf7\x15\xa5\x07\x76\xb5\xeb\xdc\x4a\xa1\x2d\x74\x5b\x3a\x01\xce\x7a\x23\xb1\x9b\x73\xca\xc4\x29\xfa\x79\xc5\x68\x0c\xf6\x84\x99\x18\xb9\x6e\x23\xd5\x76\xe9\x26\x46\x02\xde\xd8\xd4\x66\xa9\x83\x9b\x33\x9b\x0a\x67\x8e\x26\xa3\xcf\x24\x8f\xeb\x33\xbc\xbb\xf3\xde\xd6\x65\x07\x15\xc8\x80\x23\x70\xd7\xe8\x3b\x70\x3d\x13\xe7\x99\x5c\xdf\x3a\x23\xe2\xda\x84\x59\x9b\xcb\xdd\xde\x8e\x67\xf0\x99\xc0\xea\x01\x71\x71\x36\xaf\xaf\x6b\x7c\xe6\x53\xea\x1c\x6e\x83\x4c\x0c\xce\x6a\x53\x4f\x40\xb5\xdb\x38\x78\xeb\xb9\xec\xed\x3a\x17\xd2\x97\xc2\x6c\x45\x74\xc9\x7b\x3b\x13\x67\x89\x3c\x2f\x3c\x3e\xb3\x29\xc3\xcd\x84\x87\x20\x97\xc5\x7b\x03\x86\x0b\x5f\x3e\x83\x68\x73\xea\x10\x66\x53\x36\x2c\x96\x51\x89\x5a\xb2\x56\x46\x87\x8c\x5e\xf3\xe1\x33\x76\x10\x3e\x40\xce\xab\xeb\xf0\xfb\x80\xfb\x34\x9b\x85\x8e\x78\x6d\x38\x80\x79\xfa\xe1\x3a\xcf\xf6\x6e\xf3\x24\xab\x4a\xd8\xbc\x5b\xce\x9e\x4b\x2d\xb6\x87\x77\x68\x9d\xba\xe7\x50\xc7\xee\xde\x3a\xd4\xb4\xf7\x6c\xea\xca\x1b\x0b\x2e\x2e\x65\xce\x9e\x45\x6d\xbe\xe7\xed\x35\x65\x3c\x79\xac\x6d\x6a\xbb\x84\x59\xd4\xe3\x21\x75\x9d\x5a\x2f\x99\x11\xea\x09\xea\x8a\xc8\x24\xd2\x13\x3c\xa3\xae\x65\x48\x15\x35\xee\xa6\x06\x27\x8c\xda\xee\x92\x4d\x5c\xea\xb8\x53\xe6\x51\x0e\xdb\x5d\x21\x52\x66\x50\xd7\x8d\xe0\x8a\x26\x3c\x46\x6d\xf0\xe3\x19\x30\x7d\x51\xe5\xcd\xab\x45\x5f\xdc\x60\x50\x1f\xa7\x8e\x90\x97\x1a\x75\x91\x11\x36\xbd\x14\x1b\x24\x8e\x25\xd5\x81\x8b\x6c\x5a\xdb\xe4\xa7\xa3\x21\xc6\x30\xe4\x16\x75\x80\xb3\x15\xd0\x1d\xc1\x5b\xae\x85\x72\x37\x32\xa1\xbb\x06\x75\x3d\x19\x6e\x89\xe3\x4f\xc8\xa9\xc3\x08\xaf\x8d\x63\xb0\xb1\x84\xa5\xd4\xf1\xa9\x0b\x1d\x74\x31\xa6\x6b\xad\xb1\xcf\xa8\x30\xa8\x63\x45\xd4\xb6\x50\x57\x99\x53\xee\xc0\xd5\x71\x4a\x83\x0a\x20\x69\x06\x23\xd4\xe1\x13\x8b\xba\xfe\x92\xcd\x31\x2f\xfa\x68\x64\xd4\x74\xd1\x06\x13\x7e\x1d\x01\xd9\x6d\x14\xab\x11\xea\xb4\x96\x5e\x18\x3d\xc8\x31\x30\x38\x34\x75\x61\x19\x42\x8b\x1b\x2e\x9d\xa3\x2b\x5a\xc5\xa8\x2f\x22\xb4\x1a\x33\x65\x64\x15\x29\x3d\x43\xd9\xa2\x03\x9b\x2e\x01\x83\x52\xeb\x7b\x93\x16\x30\xcf\xa0\xa0\xff\x2b\x48\xfa\xb8\x20\xa9\x2b\x9d\x7f\x88\x8d\x34\xa7\xd6\x20\x32\x6c\xdf\xd1\x91\xb5\x74\x86\xb1\x65\xfd\xae\xc1\x35\x14\x71\xf6\xca\x21\xd6\x84\xfb\x3b\x72\x7d\xc3\xe5\x5f\x10\x67\x22\xf8\xd2\xa1\xdc\x3f\x65\x1e\x4c\x71\xa7\x1b\xc8\xdb\xc4\x59\x3f\x05\x1e\xc9\x99\x0a\xd1\x6f\xd5\x7c\xcd\x1e\xd1\x9f\x70\x73\x69\x50\x57\x9c\x0a\x41\x05\x61\xbd\xb8\xed\x2e\xec\xf0\x7a\x91\xd4\x89\x73\xf6\x8a\xc3\xcd\x84\x79\x53\xce\xd6\xbd\x1f\x7d\x74\xf2\xd7\xde\xfc\x94\xdf\xc7\xd6\xed\xa3\xdb\xfa\xf1\x63\xa6\xb6\x57\xbc\x0f\x34\xa6\xed\x15\x1f\xf0\xe7\x71\xaa\xa8\xdb\x00\x65\x21\xa0\xd0\x73\x84\xd5\xb3\x5b\x81\xb4\x1a\x54\xd6\x60\x53\x6a\x0d\xf6\x50\x35\xa8\x3c\x0e\xa0\xe2\x3e\x61\x56\x17\x34\x16\x61\x62\x1d\x58\x8f\xb5\x99\x5a\x93\x8b\xb7\x47\x49\xdb\xd0\x92\x31\xb4\x48\x73\xa8\x6d\x87\x68\xbe\x66\xd5\x76\x3d\x48\x10\x19\x06\x68\xc5\xf8\xf3\xf2\x6a\x2a\x93\x08\xe1\x18\x68\xe3\xd9\xae\xea\x40\xc0\x60\x15\x88\x0c\x8b\x08\x79\x2e\xe1\x7a\xc4\xa5\xae\xba\xc3\x48\xf1\xc7\xb6\xd4\xe6\x36\x1b\xd3\x18\x13\x23\xab\x79\x3d\x43\x4c\x54\xa9\xf6\xa0\x3a\x8b\x72\x75\xa9\x17\x75\x8f\x5a\x3b\x1f\x16\x74\xed\xb5\x9a\xbe\x72\x9f\x58\x92\x94\x0e\xfa\x6a\xcb\x4b\xd3\x53\xbb\xd7\x53\x26\x0f\x7a\xfc\x8f\x76\x35\x1c\x76\x55\x10\x8b\x3a\x68\x5c\xea\x12\xab\xf6\x48\x63\x12\x8c\x5a\x18\x3e\xbb\xa3\x5b\xa4\x32\xed\x09\xe3\x56\x0c\xb0\xa8\x63\x13\xde\xdf\x6a\xc9\x31\xc0\x27\xb4\x68\x76\x60\xaf\xe4\xae\x09\xec\x9a\x4f\x9f\x3e\x22\x0e\xf5\x81\x61\x1c\xf2\x90\x1e\x9a\x1b\x63\xdd\xe6\x64\xc8\xb7\xd6\xdf\x3c\x63\xd7\x8b\xc6\x8a\xf6\x43\x7d\x66\xd6\x04\xf0\x60\xd8\xe5\xfa\xc3\xa7\x2f\xa9\x0e\xb0\x3f\x6b\xdb\x4c\xb5\x17\x99\xee\x66\xc3\x33\x1c\xf3\x87\x47\x1a\x76\xb2\xc4\xa3\x1e\x30\x4a\x16\xf0\x61\x8d\xbd\x1c\xce\xdd\xb9\x21\x85\xf1\x16\xe0\xbb\xe5\xb4\xaf\x38\x61\xa7\x28\xce\xc4\x78\xd1\x21\x72\x20\xac\x9d\x3b\x14\xe0\xe4\x93\x1e\xe1\x23\x4c\xd9\xee\xb4\x47\x99\xa6\x07\x0c\x65\xca\xe1\x06\x10\x67\xce\x18\x3e\x10\x8c\xac\xa8\x22\x97\xf0\x96\x02\x30\x2e\x99\x4c\xd3\x93\x97\x4e\x39\x2a\x11\xad\x49\x1c\xab\x6d\x86\x41\x6d\xf7\xec\x15\xc6\xbd\xe4\x26\x75\x59\x6a\xe1\xa9\xa4\x49\x39\x87\xc9\x87\x7b\xec\xe7\x6c\x9a\x39\x36\xd2\xa2\xae\x77\xec\x50\x61\x13\xbc\xa8\x69\xec\x42\xf9\x82\xf2\x90\xc9\x88\xf9\x78\x95\x2d\xb3\x60\x31\xed\x18\x72\x51\xdb\x43\xa1\x79\xc7\xf6\xcd\xa2\x3e\x80\x8b\x0b\x79\x51\xc9\xc2\x47\xeb\x17\x0f\xb8\x75\xaf\x36\x28\x41\x2f\x08\xdc\xa0\x1e\x8b\x38\xda\x4c\x59\xd2\xca\x5e\x08\x79\x27\xa8\xcf\x97\xb0\x93\xb6\x71\x9c\xec\x76\xa0\x2c\x6a\x71\x83\x3a\x2c\x32\x30\x34\x8d\x69\x38\x92\x3f\x77\x98\xbc\x03\x56\x71\x49\x4d\x1b\x03\xd8\xf8\xc0\x7d\x02\xa5\xb2\x30\x10\xbc\xbc\x0b\x1d\xf4\x59\xd0\x14\x49\x6c\xca\x7c\x83\x53\xcb\x9b\x02\x3f\x1c\x0e\x70\xa0\xbb\xf4\x51\xd3\x99\x32\xff\xd8\x96\xd1\x95\xdd\x0e\xd7\x58\xc3\xf4\xec\xc6\x90\x41\x4a\x65\x04\x1d\x8e\x7e\x12\x5c\x22\xa8\xe7\x1b\x32\x74\x20\xdc\x31\xb4\x27\x84\x1e\xc8\x42\xe5\x1d\xa7\x9e\x83\xa7\xf2\x91\x89\xe1\x54\x19\xb5\x0d\x84\x87\x21\x10\x10\x08\x87\x86\xa6\xc3\x06\x74\x67\xea\xd1\x9b\x68\xad\x86\xc7\xd6\xd9\x86\xd6\x5a\xcc\x8d\xd4\x12\xe0\x51\xcb\x93\xbe\x89\xf0\xce\x9f\x7a\x4a\x16\x8f\x0e\x11\x6a\x5f\x2a\x9c\x0a\x62\x2e\x99\x49\xbd\x08\x06\xd6\xb2\x20\xc5\x23\x0e\x75\x71\x8c\x04\xde\x95\x86\x43\x39\xf4\xd9\x72\xe5\x9d\x43\x3d\xfb\x63\xe5\x9d\xf8\x68\x18\x6a\xe3\xf1\x80\x90\x6d\x23\x75\x23\x9f\x25\x30\x16\xe6\x04\x37\xdf\x38\xe9\x7b\xc2\x15\x36\x11\x48\xd8\x7b\x6f\xf0\x8b\xe7\xaf\x6c\x4a\xe9\x66\x2b\xbf\x6d\x41\xbb\x7a\x5c\x3e\xe1\x93\x1e\x7f\xf6\xac\x93\x3c\xd6\x37\x5e\x86\x5d\x51\xdf\x17\x9b\x3d\xe5\xde\x84\x39\x67\xaf\x90\x6e\x4e\xbc\xa9\xb3\xee\x54\x77\x97\x53\x5a\xc2\xc4\xa0\x3e\x3e\x94\x4b\x73\x6f\x22\xcc\x33\x94\xf9\x38\x13\xce\xa7\xcc\xda\xa9\xca\x2d\xe2\x71\xa5\xf3\xf4\x00\xa0\x99\x8b\x0b\x26\xfb\x48\xfb\x96\x0e\xb0\xc8\x1f\x83\x1a\x73\xd7\x46\xcd\x99\xf6\xcf\x22\x08\x9b\x7b\x6b\x7c\xf5\x1c\x76\x4f\x1f\xcf\x34\x18\x7f\x18\x1d\x61\xaa\xd1\xb9\x61\x96\x21\x01\xc7\x77\x02\xdc\x96\x43\x9d\x9f\xf2\xdb\x87\xa0\x66\x4d\xba\xbb\x67\x0e\xfb\x8c\x4f\x86\x9d\x0e\xf9\x28\xc4\xbc\x89\x73\xf6\x0a\x78\x55\x34\x1e\x9d\xec\xe6\x8c\xa3\xcf\x54\x03\x13\xfb\xd1\xda\xb8\x89\x06\x82\x62\x8e\x87\x66\xcf\x3c\xb7\x69\x54\xf6\xb6\x2b\x6e\x10\x31\x61\xd6\xd2\x9e\xf3\xa9\x3d\x67\x56\x64\xa2\x4d\x32\x23\x26\xf0\x6f\x84\x2d\x19\x8b\x4c\x62\x52\xc7\xc0\x04\x43\x1d\x0e\xba\x73\xc3\xa6\xe2\xd4\x83\xe5\xdc\x9f\x72\x7b\x62\x47\x06\x7e\x69\x30\xc8\x68\x20\x16\x89\xc8\x94\x89\x90\x00\xdf\xce\x99\x58\x1a\x7c\x62\x5f\x64\x17\xd5\x45\x85\xa1\x17\xd1\xdc\x9e\x51\x61\x08\x22\x64\x5d\x0c\xe5\x68\x82\xe0\xff\x39\x5b\xda\x94\xa5\x0e\x15\x86\x4d\xd9\x84\xf9\x4b\xc3\x9d\x33\x16\xe1\x97\x44\x18\x98\xd1\x10\x53\xe7\x04\x57\x75\x81\x7e\x61\xe0\x43\x93\x88\xdf\x9f\xc1\x6b\xa3\x2e\x98\x3f\xe7\xd4\x4a\xa1\xef\x8c\x3a\x73\x41\x19\xdc\x03\x1b\x00\xe9\xa7\x8c\x51\xd8\x95\x4e\x7c\x6a\x9f\xd6\x1f\xfc\xbe\xf7\x8a\x99\x4a\x48\x90\xc2\x3a\xcc\xe6\x06\x3f\x6d\x92\x76\x68\xd1\x3a\xea\x30\x37\x92\x6c\x30\xc7\xc1\x10\xc4\x32\x00\x0e\x16\x31\xb1\xc7\x8c\x58\x84\x2d\x0d\x1e\x49\x22\x82\x3b\x35\x18\x8a\x88\x51\x8e\xae\x77\xe0\x59\xe0\xd5\xa6\xce\xd4\x9b\x03\xd4\xe6\x06\x5f\xf2\xb9\x21\x96\x7c\x6e\x53\xbf\x1e\x16\x93\x62\x64\x68\x03\xfd\xd0\x62\x24\x43\x41\x1d\x1c\x5f\xc3\xa4\xb6\xa1\x0a\xc4\xb0\x7f\x1c\x7b\x48\x59\x84\xd8\x41\x05\xfa\x85\x40\x89\x27\x74\xfe\x84\x23\xf3\x6e\x03\x93\x29\x7d\x9c\x9a\x84\x01\xe5\xda\x01\x10\x6a\x53\x30\x10\x24\x33\x14\x2f\xd8\x7b\x0c\xd5\x11\x9c\x3d\xc6\xd5\xaf\x4a\xbf\xa8\x9e\x26\xc5\x00\xb8\x8a\xb9\xc1\x9c\xa5\x3d\xb7\x00\x34\x4c\xec\x8e\xa6\x73\x87\xba\xdb\xf0\x54\xc2\xf8\x04\xc5\x3f\x88\xaf\x1c\xb1\x15\xee\x00\x79\x04\x45\xcf\xee\x7e\xaa\x20\xed\x00\x7a\xa5\x86\xc2\xbb\x89\x43\xed\x53\x1f\xb8\x36\x0b\x51\x13\x0a\xf1\xa8\x7f\xda\x7c\xf6\xfb\xde\x2b\xee\x01\xfc\xed\x25\xc6\xa0\x14\x88\x07\x2e\x4e\x49\x01\x63\xd9\xce\x3c\x8e\x93\x9a\xe3\xf4\xf4\x0d\x8b\x30\xa8\x85\x01\xfe\x60\x93\x61\xa3\x63\x52\xb4\x6c\x06\x64\x83\xd1\xf7\xf1\x0f\x18\x46\x8e\x1e\x27\x05\xe5\x73\x39\xf4\x02\xca\xc0\x3f\x26\x1b\x0a\x3c\x0d\x60\xab\x21\xd3\x80\x41\x05\x94\xc2\x78\xeb\xb2\x09\x73\x03\x70\x10\x50\x10\x30\x50\x50\x91\x42\x6d\x50\x58\x5d\xa7\x8b\x5c\x29\x7c\x68\x53\xf7\x04\x36\xcf\xc0\xfd\xfa\x40\x71\x5c\xc4\x25\xd9\xd1\x21\x2a\x3d\x5a\xe8\xd3\x6a\x38\x6f\xe5\x4c\x65\x7c\xda\xad\xfb\xc0\x09\xf3\x36\xbd\x80\x5d\xa0\x74\x11\xc1\xe4\x2e\x50\x40\x8e\x7a\x03\xb4\x75\x17\xd8\xe3\xfd\xfe\x88\x5d\x20\x54\xda\xf1\x29\x51\xef\x02\x99\xc0\x6d\x18\x6e\x35\x18\x6c\x61\x2c\x3f\x7d\xda\x1e\x70\x10\x41\xc4\xa2\xa6\x23\xc5\x8e\x76\x2b\x77\xf4\x5a\xb9\xa3\x27\xc5\x8e\x5c\x8a\x1d\x77\x8c\x6b\xd8\x1b\xca\xae\x0a\xfb\xd6\xc1\xb4\xa9\xc7\x31\xaa\xa7\xd3\x89\xe5\x09\xdb\x05\xca\xfd\x53\x0f\xf5\x86\x7c\x2a\x44\xf7\x25\x3a\xda\x69\xb7\x67\xd2\x4d\x07\x75\xd9\x29\x17\x44\x48\xd1\x95\x6d\x13\x5b\xfa\x26\x63\xe8\xbf\xc9\xb3\xe1\xe2\x9c\x02\x15\xc2\x5d\x84\xdb\xf2\x6d\x40\x0a\x9b\x46\x9c\xdd\x18\xb6\x81\x3e\xa1\x6d\x62\x9f\x72\x5f\xba\x3e\x0a\xa1\x58\x2c\xbb\xe1\x6e\xd0\x29\x9e\x90\x97\x3a\xe5\x79\x3e\x2c\x98\xa9\xe2\xe6\x73\xaf\xd3\x36\x1f\x5d\x47\x78\xa7\x0e\x1e\x05\x5b\xd4\x75\x7b\xa0\x40\x2f\x2b\x7e\xca\xe1\xce\xa6\x96\xd5\x0d\x71\x4a\x1d\x61\x50\x21\x52\xfc\xd4\xa1\x96\xd5\xed\x32\xae\x8d\x4e\x8a\x1f\x01\x5d\xe0\x83\xf3\x17\xf4\x00\x56\xb7\xe7\xec\x95\x87\xbe\xd9\x05\xf5\x38\xd4\xe5\xe3\xfe\x96\x08\x6a\x01\x0d\xb5\x4e\x7d\xea\x5a\xb0\x9a\x88\xe7\x79\x6e\xf7\x60\x6f\x2c\xcc\xb9\x61\x77\xfb\xe8\x59\xa8\xab\x97\x0a\xe8\xa3\x45\xfd\x7e\x1f\x6d\xdb\xa0\xcc\x81\x97\xb0\xb0\xf3\x4e\x44\x58\x22\xfd\xf8\x09\xa0\xcd\x2e\xe1\x3e\x9e\x31\x35\x2f\x55\x5d\x67\xaf\x94\x63\x92\x89\x47\x2d\xf7\x14\xe9\x98\xb0\x52\x0c\x3f\xcd\xe8\x2e\x1b\xcb\xb5\xe8\x9b\xa2\x9e\x68\x82\x35\x13\x4d\x98\xed\x44\x13\xbb\x79\xbb\xe9\x4d\xad\xda\x5e\xe4\x01\x1d\x50\xd3\x21\xfe\xdc\xe0\x4e\xe3\x29\x08\xb9\x8f\x79\x3f\x81\x3c\x89\x94\x0c\xaa\x61\xd6\xdc\x60\x1d\xb4\xc4\x7a\x98\xfb\xe4\x7a\x36\x78\x8e\x92\xf5\xf8\x9f\xb6\x9e\x75\x67\x4b\xb2\x1e\xfe\x89\xfb\xb3\xee\xab\x48\xd5\xd3\x1d\x1f\xf3\xf9\xe3\x63\xaf\xd5\xe3\xe3\x11\x2a\xef\x1e\x8d\x01\x71\x35\xa8\x38\xb5\xd0\xe3\xa3\x97\x5a\x94\xdb\x86\x45\x79\x7f\x56\x59\xf2\x72\x8a\x94\x90\x79\x29\xae\x62\x70\xe9\x13\x69\xb2\xa3\xbb\x47\x67\x88\xc7\xca\x10\xea\x7f\xd1\xf8\x7f\xd1\xf8\x01\x34\xb6\xb7\xa0\x31\x60\xdf\xa9\x74\xce\x08\x0c\x98\x27\xb5\x72\xfa\x5d\x96\xb8\xdc\x47\x6d\x13\xf6\x7e\x36\xf2\x55\x18\x56\x9c\x73\xca\xbb\x6b\x43\x5b\xdf\x73\x70\xbb\x6f\xfc\xb7\x15\xc5\x39\xf5\x30\xd2\xbc\x0f\x3b\x3e\x73\x80\xe6\xc2\xec\x76\xe6\x99\x68\xee\xa2\x06\x8c\x4d\x3d\x27\x64\x1c\x76\x00\xbc\xe3\x0c\x0e\x58\x28\x9b\x1f\xdb\xd4\xf1\x09\x5e\x5a\x26\xc0\x27\xcc\x0e\xd1\x57\x1c\x5e\xe4\x0b\x2e\x55\x61\x18\x3b\xb6\xe4\x49\x67\x73\xba\xca\x80\x62\x50\xcf\x5e\x52\xcb\x0f\x99\x40\xfe\x57\xb4\xba\x36\x96\xe4\xd6\x2c\xe2\x50\xe6\xcb\x8b\x92\x17\x51\xdb\xc7\x33\xd6\xc6\x21\xb2\x4d\x3d\xa9\x76\x6d\x53\xcf\x9b\x62\xa1\x21\xba\xd2\xb2\x1b\x9b\x36\xd8\x4d\xb9\x86\x45\x6c\xca\x1c\x79\x51\xb5\x48\x97\x77\x1d\xc7\xa7\xb0\xd3\xc2\x73\x59\xcf\x6d\x7c\x5b\x19\x48\xde\x28\xf3\x8e\xa9\x67\x51\xaf\xe6\xee\x5a\x40\x3d\xd3\xc5\x2b\xe1\x66\x68\x4b\xa3\x01\xbf\x71\x6b\x65\xa3\x50\x5c\x9e\xcd\xca\x4b\xc3\xcb\xc0\xa6\xc0\x43\xb9\xbf\x2b\x2f\xb5\xc4\x1f\xf7\x07\x16\xec\x7b\xf0\xd2\x7c\x80\x8e\xba\xc4\xb1\x43\x19\x27\x4e\xc7\x6d\xa8\x8f\xda\x37\xe6\x9c\x87\x2e\x75\x05\xc1\x8b\xea\xb1\x0b\x5b\x44\x80\x3c\x71\x1a\xc0\x33\xd8\x0a\x5a\xc0\x33\xbb\x96\xbc\xd4\x20\x03\xfe\x0b\x0f\x50\x7c\x79\xa9\xbf\xf0\xa0\xc4\x2e\x9f\x2d\x35\xdd\x39\x35\xed\x29\x33\xc3\x3e\x90\x3d\x07\xfe\x26\x7c\x3d\x1d\x0d\x07\x9f\xe2\x4d\xb6\xa7\x4a\x07\x1c\x32\x07\xcc\x80\xa9\xdb\x78\x0b\xc6\xfd\x13\x35\xdd\x21\xdc\x8c\x1a\x6e\x08\x7d\x2e\x2f\xf2\x4d\x03\xe8\xde\xc8\x18\xf5\xc8\xd8\xc7\xe8\xf3\xcd\xae\x0f\xed\xd0\x3f\x2b\x27\x9c\x4f\x98\x4f\x4d\x7f\x69\x51\x26\x8e\xbb\x5d\x24\xdc\x24\xdc\x9d\x53\xde\xeb\x38\x51\x00\x99\x72\x8b\xda\x0c\x76\x2b\x00\xe1\xc6\x2d\x31\x97\x3e\x3c\x6d\x79\x72\x65\xb5\x9e\x3f\x3d\xea\xc2\xae\xdb\x71\xe4\x45\x1d\x47\xc8\x21\x3a\xb6\xe5\x38\x79\xcd\x71\x3d\xda\x50\x70\x6b\x68\xcc\x89\xa2\x38\x41\x76\xda\x43\x6e\x70\xb6\x68\x11\xce\x97\xd4\x75\x42\x41\x05\xec\x8c\x6a\x67\xd3\x06\xc3\x40\x48\x80\x2c\x96\xbc\xc8\x64\x2e\x15\xd3\x88\x00\x6e\x5b\x34\x8a\x69\x30\x13\x1c\x03\xd8\x73\xd8\x34\xf3\x7a\xe7\xcc\x0c\xea\x5b\x28\xe2\xaa\x37\x1b\x7e\xb3\xd5\x33\xa8\xcf\xa4\x91\x8b\x45\xda\xb3\x53\x81\xe7\x8a\x9e\x20\x2d\xa5\x91\xbb\x7b\xe0\xc2\x8f\x6d\xca\x00\x51\x59\x4d\x58\x7c\x34\xf4\x74\x29\x6f\x67\x01\x61\xb8\x03\xb4\xdd\x10\xca\x26\x78\x51\x80\x87\x75\xc6\x9a\x72\x27\x94\x08\xdb\x0e\x22\x20\x35\xb3\xd7\x92\xe5\xd8\xee\xba\xe4\xf5\xd7\x8e\xc6\x98\xfc\x01\xbd\x07\xdb\x06\xd6\xcc\xa1\x1e\xf1\xa4\x72\x30\x60\x35\x6b\x42\x05\xe1\x89\xac\x3f\x37\x37\xbd\x01\xc2\x77\xca\xd0\xf3\xae\xcf\x88\x43\x1d\xc2\xbd\x4d\xf9\xa8\x65\x6d\x29\x80\x51\xff\x54\x79\x01\xf7\x52\xc3\xa1\x9e\xb1\xa1\x11\x44\xe5\x9c\x9b\xc7\xc3\x37\x0e\x6c\x9c\xa1\xf5\x96\x45\x3c\x54\x87\xf7\xa9\xd2\x2b\x58\x2b\x61\x63\x2b\x88\xea\xe0\xf3\xfc\x46\xa2\x68\x1a\xe5\xe5\x96\x0f\x30\xf0\xd1\xd6\xab\xe3\x1a\xd1\x43\x67\xbc\xc7\x02\xda\x29\xea\x45\x0e\x9d\x22\x72\x2b\xe4\x80\x61\xbc\x23\x44\x12\xb6\xd4\x33\xe5\x72\x57\x5d\x67\x37\x70\x1b\x8b\x86\x64\xf5\x9a\x6b\xa2\x23\x73\x43\x6e\xa3\x85\x23\x2f\xf5\x0b\x4f\x50\x9b\xf4\x69\x0d\x72\x32\x1e\xf0\x2f\x3c\xc5\xe2\x80\x70\x30\x20\x78\x8d\x8f\x43\x54\x6b\xe2\x4a\x3f\xa7\xb7\xb4\x70\x02\xd4\x1d\xb6\xeb\xf2\x52\xa7\xe2\x7a\x6e\x61\xd0\xc2\xd6\xf1\x33\xf0\x53\xd8\x27\x86\x62\x42\x93\xb6\x6e\x1e\x71\x8e\x5a\x4e\x6a\x08\x79\xeb\xb1\x89\x60\xd4\x9e\x0a\x31\xe1\x6b\xbe\xb1\x77\x11\x15\x75\x5d\x2a\x3c\x80\xf1\x96\x90\x18\xef\xfa\x4f\x43\x79\x40\x54\xcb\x32\x10\xdf\x1c\x74\xdf\xfa\x34\xac\x97\xed\x78\x14\xd6\xa3\x5a\x44\x83\xf3\x36\x93\x38\x2f\x1a\x9c\x17\xde\xbf\x1e\xe9\x51\x2d\x17\xc0\xe9\xa6\xb0\x02\x19\x02\x18\x2b\x1f\x10\xc7\x6f\x15\xbb\x24\xee\x0f\x90\xc6\x24\xd2\x4e\xde\x43\x59\xb2\x2b\x2f\x35\xee\x3b\x35\xee\xa3\x99\xbd\xf0\xea\x17\xbe\x6d\xc8\xed\xa3\xeb\xca\x4b\x0f\xff\x7d\x40\x7d\x75\x19\xe0\xbf\x27\xe4\xa5\xc1\x7f\x7f\x88\xff\xb0\xd0\x30\xbe\x09\xff\x1d\x79\x19\xe0\xbf\x2b\x2f\x5d\xfc\x5f\xe3\x5f\x85\x89\x71\x02\x42\x26\xed\x20\x1b\x43\xc8\xce\x04\x38\xe5\xb6\x94\x7b\x0b\x36\x77\x28\xf7\x96\x8c\xc2\x14\x00\xb8\x3e\x65\x16\x0c\x3c\x8d\xdc\xbd\xc9\x7b\x9e\x12\xbf\xca\xd3\x19\xd1\xde\xa0\x97\x00\x23\x4d\xca\x9e\x87\xd0\xd6\x79\x00\xd1\x22\x65\x1e\xbc\x96\xa9\x6b\x37\x4c\xb4\x0c\x0d\x03\xd6\x32\xb5\xf6\x02\x44\xbb\xca\xb3\xca\x28\x93\xdf\xfb\x2e\xbc\x94\x69\x2a\x49\xd0\xfe\x69\x3c\x34\x88\x22\xda\x3f\xa5\xa9\x90\x51\xc5\xef\x7b\x45\x77\x4c\x88\x88\x16\xa1\xa5\xe5\x5a\x9e\xd6\x9c\x9d\x68\x61\x9a\x5c\x67\x46\x1a\x5f\x55\x6b\xd9\x7a\x96\x29\x75\xce\x22\xb9\x9e\x6f\xc9\xda\x68\x10\x12\xed\x36\x4c\xb2\xca\x28\x50\xd1\xb9\xe7\x75\xad\xd5\x7f\x56\x2e\x4e\x8d\xdf\x16\x79\x15\xaf\x79\x38\x45\x5d\x54\x02\xd5\x8c\xfb\x07\x16\x64\x51\xeb\xd3\x8c\x37\xe8\xd8\xd4\xad\x94\x1d\x5f\x6b\xa1\xec\x78\xb7\xd3\x1b\xfb\xdb\xeb\xeb\xe6\x6e\xd6\x59\xde\xa0\x6e\xc9\x5a\x1e\xa9\x72\x52\x67\xba\x41\xbd\x88\xb5\x4c\x52\x5d\xa2\xce\x54\xe5\xb7\x6b\x39\x7e\xca\x6f\x49\xaa\x0e\xb0\xc7\xeb\x67\xda\x44\x43\xef\x3c\x51\x9e\xe6\xbd\xbe\x36\x07\x3b\x64\xde\x9e\x0b\x8c\x37\x9e\x16\x90\x04\xc5\x42\xe3\xa1\x9c\x88\xe4\x52\xec\x39\x5e\x13\x84\x92\xb2\xbb\xd9\x1e\x6f\xd9\x84\x93\xb2\x66\xab\xc6\x1b\x58\x2d\x52\xb6\x8b\xd0\x78\xe3\xd2\xb4\xfa\xa3\xbd\x20\x75\xc9\xc0\x47\x7d\x20\x15\xe1\x32\x4e\xff\x50\x07\x48\x58\xc3\x9a\xfb\xa3\xef\xb3\x49\x9e\x26\xb3\xf0\x43\xd7\x3b\x50\x11\x26\x7d\xe7\x3e\x7f\x8e\x8b\xa2\x9b\xe3\x24\x2c\xc2\x65\x98\xf5\x52\x6e\x6e\xe3\xa2\x9f\xf6\x55\x1e\xf6\x5c\xe7\x24\xd1\x87\xa8\xe7\xb0\xe8\x55\x78\xfb\x2a\x2c\xde\xf6\xaa\x3a\xc9\x6f\x6e\x81\xe2\xf6\x72\xf5\xab\xee\x3a\xfe\x49\x8a\xdb\x34\xec\xfb\x36\x2a\x16\xd1\xdb\x5d\x5c\xf4\xb4\x0e\xb4\x8c\x08\x3d\x68\xa1\x8b\x1e\x92\x3c\xd7\xb3\x8f\x6c\xc8\x26\x37\xed\x3b\xa8\x4c\xd4\xfa\x56\x7c\xc2\x9d\x35\x9b\xe4\x9e\x35\x32\x71\xa7\xdc\x1e\xd8\xce\x4a\x1b\xf1\x29\xf3\x29\x86\x66\xc1\x83\xa3\x8e\x84\x02\x56\xec\x48\x6e\xa4\xe4\xa6\x0c\xd7\xcd\x29\xb3\xe6\xad\x6d\x08\xac\xac\x7c\xc9\x26\xdc\x5b\xf2\xb9\xb5\xb4\x27\xb0\x45\x0f\x2d\x6a\xc3\x32\x5b\x1f\xa1\x19\x1e\x6e\x0e\x27\xc8\xd5\xc1\x4b\x52\x6b\xad\x9b\x86\x85\x21\x0d\xa8\xeb\x1c\x5b\xc0\x46\x58\x92\x97\x60\x52\x65\xdb\xe5\xa8\x1e\x86\xb1\x8f\x7c\x62\xd5\x01\xcd\x4c\xe2\x61\x88\x82\x89\x10\x43\xb5\x29\xe7\xb8\xd9\x29\x62\xd4\x33\x7e\xf6\x8a\x99\x18\x0d\xc3\x0b\xbb\xcc\x8a\x14\xba\x59\xd4\xb5\xc9\x5a\x32\x81\xe4\xb3\x1b\x94\x2f\x12\x73\xed\x33\x4e\x6d\xe4\x3c\x8e\xfb\x8c\x3f\x9a\xf7\x5a\x82\x70\xef\x4c\x71\x61\xed\xbf\x0d\xe3\xba\x5d\x1b\xe2\x93\x8c\x29\x07\x0e\xea\xb8\xcf\xee\xa3\xb9\x23\xb7\xd1\xb6\xe8\x39\x23\xe1\x49\x4d\xdb\x66\x24\x18\x8c\x84\xf5\x7f\x1f\xf6\x1c\x60\x8f\xc1\x75\x5d\x00\xdd\x3a\x9e\x9e\x0d\xb7\x22\x0d\x7d\xf8\x14\xd3\xd0\x06\x76\xd7\xa3\xcc\x09\xd1\x87\x15\xef\x7a\xdb\xc2\xd0\x12\x28\xb7\x76\x07\x50\x17\xd4\xb1\xa9\xeb\x9f\xba\xe8\x00\x4b\xfa\xc4\x67\x1e\x1a\x19\x78\x0e\x61\x1d\x61\x83\x8f\x22\x28\x8b\xa5\xc0\xdd\xfa\x22\xa2\x0e\xba\xcd\x22\xa8\x55\x60\x52\x5f\x18\x16\xf5\x78\x4a\x7d\x41\x7c\xe9\x04\x05\x85\x62\xa2\x95\x56\xa0\x10\x17\xf7\x95\x42\x5e\x6a\x36\xdf\xa2\x32\x34\x8e\xbc\xd4\xd3\x09\xea\xe2\x54\xf8\x28\x34\x0c\x19\xb5\xd1\xfe\xb2\x16\x95\xa0\x0d\xa0\x27\x80\x3d\x46\x95\x65\x3f\x12\xd4\x76\x0d\x4e\x1c\xd8\x04\x08\xea\x79\xb0\xc3\x70\x0c\x9b\x72\xfb\x78\x00\x11\xd2\x02\xeb\xec\x06\x58\x6d\xea\xda\x91\xc1\x29\xea\x71\x70\x03\x76\xc8\x16\x33\x30\xcc\x8b\x0d\x3b\x17\x68\x0a\xe5\xe2\x94\xa3\x8c\x8f\xbb\x94\x7b\x29\xec\x11\x50\xff\x07\x8d\x9d\x6c\xc2\x5c\xb4\xa8\x74\xa5\xae\xf0\x09\xc3\x60\x0b\x18\x50\x8c\x0b\xca\x1c\xe2\xc8\x58\x8f\xd4\xe6\xa9\x61\x51\x74\xfb\xc5\xd0\xe6\x45\x06\x08\x34\x98\xa0\x26\x0c\x9d\x8d\x58\x56\xef\xb3\x61\x6f\x66\xa7\xb6\x84\x1d\x77\x42\x6a\x75\x36\xd5\x54\xd8\x80\x8b\xd4\x42\x73\x42\xb5\xa3\x00\x28\xe0\xac\x78\x14\x19\x78\x58\xff\x4c\xc5\xe8\xe5\xd4\xb6\x52\x81\x36\x3f\x68\x45\x60\x30\xca\x7c\x14\x7b\x33\xe7\x14\xc5\xde\xd4\xf4\x53\x80\x94\x01\x3d\xe5\x14\xad\x2c\x5d\x78\xe5\xa1\x9d\x3a\xc7\xd6\x37\x92\x0b\x80\xd1\xa9\x83\xfa\x16\x26\xe5\x6b\xa1\xef\x54\x8d\x9f\x80\x8c\x39\x58\x33\xda\x58\x63\xf8\x35\xe6\xa4\x0e\x15\x18\x22\xd9\x37\x7c\xb4\x36\x75\x8e\xa9\xcd\x5b\xac\xf2\x11\x74\xa7\xa8\x3f\xce\x4c\x6a\xc3\x6b\x56\x0f\x87\x49\x9a\x02\x9f\xd3\x38\x05\x58\x81\xf1\xc3\x1d\x74\x19\x87\x48\x60\x87\x7d\x89\x25\x4c\x4e\xd3\x05\x40\xa2\xb8\x9d\xa1\x1e\x98\x05\x48\x8e\x0e\xaf\x06\x40\xc5\x5d\x2f\xe7\xa9\x25\xb7\x9f\xb6\x08\xa9\xdd\xca\xcb\x09\xb5\x05\x35\xfd\x08\x83\xd7\xc1\x3a\xe6\x18\x02\x3b\xe2\x1b\x0e\x35\xdd\x54\xda\xa0\xa0\xb1\x6f\xff\x33\xd8\xa5\xa7\x92\xec\x99\x5e\xd7\x58\x1a\x16\x65\x07\xb1\x13\x08\x22\xa0\x2f\xf7\x23\x0b\x26\x13\xa0\xbd\xc7\xd1\xfb\x1f\xc2\x90\x19\x36\xf5\xfc\x63\x29\xc0\x6b\x8b\x6e\xfb\xbf\x46\x17\x81\x8b\x1a\x90\x44\xd4\x74\xd8\x81\x24\xbe\x0f\x34\x66\xa3\x4a\x04\x73\x5b\x95\x88\x56\x23\x82\xaf\x0d\xe0\x93\x67\x08\x47\xb6\x85\xc1\xfa\x75\xcc\xb9\xd4\xc3\x6b\x96\x44\x94\xba\xb8\x21\x3a\x1a\xf4\x5b\x01\x9b\x6f\x50\x98\xa5\x0e\xfe\xd5\xeb\x9f\x07\xe0\xb0\x22\x0c\x66\x82\x73\xc9\x42\xe1\x0c\xda\x69\x77\x17\x37\xa0\x17\x4b\x40\xd1\xbe\xb1\xe9\x94\x9b\x13\x6b\xca\xbc\xee\xa2\x63\xa0\x7b\x30\x57\x1c\x03\xcd\x22\x6e\x3d\xc9\x30\x1e\x3b\x17\x94\xbb\x53\x6e\xcd\x0d\xbe\x16\x49\x1c\x55\x70\xd6\xc2\x69\xa2\xe1\xea\x5a\xcc\xae\x4e\xff\xcf\x5e\x61\x38\xbb\x89\x03\x0b\x84\x69\x50\x3c\x19\x30\x30\xfa\x93\x6d\xb0\x63\x47\x8e\xb8\xdd\x44\x47\x65\xc4\x9b\x9b\x67\x37\x9c\x98\x53\x97\xda\x5e\x88\x96\x16\x5e\x2b\x82\xb2\xe5\x1a\xc2\x9c\x63\xe6\x13\xd6\xc4\x50\x11\xa8\x77\x7b\xf6\x8a\xdb\x14\xb5\x86\x04\x2c\xf0\xb0\x9a\xdb\xbd\x75\x1a\xe8\x7e\x9d\xaa\x16\x69\x95\x7d\x7d\xfa\xee\x3e\xfa\x42\xab\x45\x85\xcc\x25\xdc\xda\x0c\xc2\xb9\x4d\x11\x10\xa6\x27\xa3\x67\x61\xf0\x36\xfb\xb8\x3e\x0a\x60\x78\x6a\x63\x01\xa3\xb2\x43\x3f\xea\xcc\x8f\xee\xc5\xc3\x54\x92\x3b\xe8\xe2\xc0\xa2\xdc\x03\xfc\x15\x78\x1e\xdd\x2c\xdb\x0c\x23\xa6\x39\xd4\x7f\x02\x0e\xfb\x06\xda\xd8\x18\xd2\xa8\xdf\x9a\x1b\x0c\x7a\xe2\x13\xde\x28\x21\x02\x2e\x3b\xd4\xf6\x97\x1e\xb5\xd7\x4f\x37\xa8\xe7\x4c\x80\x56\x47\xf2\xd8\xc5\xc4\xb8\x72\x80\x56\x7e\x88\x0b\xb8\x5d\x4b\xf8\x64\x7c\x2d\xc3\x06\x72\x64\x30\x02\x6c\xa2\xed\x10\xbc\xd4\x0d\x13\xc8\x5d\x78\xa8\xad\xab\x48\xa6\x03\x7c\xcc\x71\xcb\x0f\x29\x5e\x13\xf5\xf3\xe6\x36\xb5\xbc\xf5\x7a\x8f\x87\xf5\xa2\x63\x10\x58\x58\x9e\x57\xad\x30\x51\x59\xd0\x99\x73\xea\xb0\x2d\xa7\x3c\x02\xa8\x80\x4f\x05\x7a\x88\xf3\xdb\xc9\x57\x0f\x9e\x72\xbc\x35\xc1\x66\x0b\x9b\xa2\xda\x0c\x65\x8e\x01\x5c\x4b\x38\x9c\x7b\x82\x7a\xae\x61\xcf\x4d\x64\x92\xe5\x1a\x24\x9c\x47\xa2\x5f\x93\xff\xec\x15\xce\xcb\x09\x73\xa6\xcc\x9d\x8b\xb3\x1b\xc3\x31\xec\xa9\x4b\x2d\x17\xa6\xb2\x83\x1c\x56\x33\x95\xf1\xf8\xdb\x3e\x66\x3e\x22\x85\x5f\x1f\x91\x31\x74\x55\x05\xb3\xd9\x41\x15\x8f\x47\xb7\xa3\x93\x7f\x6d\x05\x81\x5d\xf9\xa7\x60\xaa\x05\x60\xaa\x43\x99\xdf\xf7\xde\xe0\x12\xe7\x94\xc3\x82\x4a\x7c\xb4\x73\x85\x41\xef\x19\xf5\xe0\x01\xff\x29\xa7\x0e\x27\x1e\xed\x1b\xaf\xf8\x94\x89\x29\x6c\x53\x7b\x66\x27\x54\xc0\x9e\xf2\x94\x09\x3c\x19\xf4\x52\x8c\xfd\x06\xf4\xbf\xeb\x1f\xc0\x72\x50\x49\xb8\x4d\x10\xc4\x4c\x19\x9e\x9d\xf3\x87\xfd\x08\xd4\xdd\xc0\xfd\x09\x77\xa8\x6b\xa7\x86\x74\x78\x4b\x9d\x29\x77\xa9\xe9\xcc\x81\x67\x5b\x72\x48\xb6\x00\x6f\x19\x20\x5c\x9d\xcc\xa8\xcb\x4f\x2d\x34\x80\x63\x53\x9f\xba\x7e\xea\x51\xd3\x33\x04\x15\x62\xea\x51\x8f\xcd\x19\x75\xa6\x0e\xb0\xca\x1e\x1a\xa7\x8b\x25\xa7\x32\x91\xb1\x53\x01\x30\x90\x63\xb4\x81\x5a\xed\xb4\xb0\x73\x5c\xd8\x39\xf0\x22\x72\x6d\xb7\x51\xf1\x51\x2d\xef\x8c\x3a\x1d\x95\x47\xea\xb1\x4f\x50\xa3\x18\xd4\x08\x5b\x80\x3f\xb6\x46\x4b\x32\x2f\x6d\x1f\xff\xf0\x1a\xed\x61\x8d\x2e\x65\x62\x5b\x8d\xae\xfd\x69\x56\x1d\x21\x54\x6c\x54\x9b\x70\x9b\xf8\xd4\xb7\xa6\xcc\x9a\x70\x31\x85\x3d\x81\x7f\xca\xf0\x3c\xd2\x9b\xfa\x13\xc6\xa7\x36\xba\xdf\x41\xe5\x0b\xeb\x18\x38\x59\x5b\x74\xa6\x93\x6b\x4f\xa5\x67\xaa\xde\x1b\xea\x5a\xd4\xf2\x4f\x19\x47\xab\x7b\x3e\xe5\x62\xce\x97\xb0\x3c\xa7\x3e\x7a\x17\x98\x72\x6f\xce\x97\x42\xe2\xb2\x23\x0c\x4e\xdd\x41\x01\xc2\x35\xa8\xcd\xa6\x2e\xf5\x9c\x7e\xa5\x6d\xd3\xa5\xc9\x22\x83\x36\x32\x77\xce\xcf\x6e\x4c\xc3\xc1\x07\x36\xe7\xc0\x9e\xa0\xd0\x42\x4c\x39\xaf\xdf\x41\xff\x9c\xf9\xba\x24\xa0\x96\x2b\x6e\x0d\x9b\x68\xc2\xb2\xc4\x6c\x2a\xd8\x1c\x55\xca\x2c\x87\xf8\x91\x81\x9b\x60\x8e\x71\x1b\x51\x39\x09\x17\x0e\x2b\x75\x90\xc2\x9a\xb8\x63\x33\x65\x6c\x6d\x66\x87\xd4\x71\x5a\x5d\x0e\xea\x59\x90\xfb\xec\xc6\x00\xbe\x52\xa0\x05\xb0\x8d\x41\x79\x77\x51\x44\x43\xe3\x99\x4d\xfb\xa0\xda\xac\xf7\x98\x39\x84\x39\xf5\x22\x67\x61\xc0\x5c\x95\x82\x64\xcf\x23\xfc\xec\x06\x95\x88\x7c\x1b\x88\xa2\x2d\x26\xcc\x5d\x72\x74\x97\x03\xab\x82\x22\xf5\x16\x35\x61\xc9\x98\x00\x89\x99\x32\x77\x02\xcf\xbd\x0c\xcc\xc5\x3c\x48\x83\xe6\x7c\xba\xf6\x5e\x30\xea\xdb\x28\x98\x81\x3a\x96\x7c\xbe\x56\x05\xf3\x65\xa6\x5d\x8d\xfb\x9e\xdb\xfb\x57\x78\x38\xcc\x7c\xec\x13\xae\xdc\xc2\xa0\xa6\x6d\x50\xc7\xc1\x5f\x56\x02\xcb\xe0\xe2\x2d\xf6\xff\xec\x95\xea\x6c\x24\xf5\xe7\x55\x46\x0c\x55\x68\x97\x52\x5b\x8d\x91\x1a\x18\x13\x86\xce\x08\xb9\x4b\x01\x5d\x84\x0c\xb2\xea\x60\x69\x90\xa7\x34\xf0\x03\x03\x3f\x96\x03\x00\xa8\xea\x19\x36\xb0\xe3\xa8\x25\xd7\xc4\xf4\x75\x7c\xdc\xef\xdb\x28\x38\x43\x85\x7d\x19\xd6\xda\xe3\x11\x30\xb5\x06\xb5\x5c\xe9\xed\x83\x49\x96\xc5\x4a\x81\x53\x70\x61\x8b\x27\xe6\x26\xec\xbc\x71\x4f\x2d\xdc\xe3\x6e\xb9\x84\xbb\xb0\x20\x09\xf7\xec\x15\x56\x4f\x98\x8f\x73\x89\x5a\x1c\xfd\x70\x09\x6a\xda\xb2\xc5\x84\x95\xd0\x5b\x57\xf6\xf6\xd1\xf1\x12\x37\x8c\xd1\xd0\x94\xcc\xa1\xae\xbb\x07\x5b\x35\x7b\x8f\x5b\x78\x15\x2a\xc5\xdb\x63\xd0\xee\xbd\x4e\x96\xa7\x5a\x1b\xb5\xc7\x09\x9f\x80\x31\x41\x75\x52\x97\x03\x1b\x2c\x88\x2d\x55\xee\x18\xaa\x31\xaa\xe7\xe3\xee\x1b\x85\x6c\xf0\xc5\xd9\x8d\x49\x7c\x6a\x39\xa1\x80\x57\xa2\xfe\x12\x3d\x25\x08\x03\x2e\xc7\xdd\x37\xf8\x0e\xb0\x16\x2d\xdf\x3f\xd9\x96\x59\x4e\x0e\x46\x5d\xf4\x87\xec\xfa\xad\x78\x05\xe5\x34\xe8\x82\xcd\x52\x81\x4c\x81\x7b\xb0\x3d\x29\xce\x47\x7d\x88\x14\x98\x5b\x9b\x87\x3e\xf0\x50\x44\x5e\xeb\xef\x99\x45\xa4\x07\x35\xcf\xa7\x2e\x20\xa1\x0f\xd9\x3c\x4e\xe4\xb5\xcd\x66\x78\x50\x8c\x41\x6d\x11\x31\xea\x33\x19\xb5\x1f\x96\x07\x03\x9d\x8e\xe0\x1d\x93\x6e\xbb\xd6\x9a\x29\xe7\x2d\x47\xa6\x8a\x5b\x29\x7a\x35\xb3\xa5\x95\x20\x30\x54\xb6\x87\x4a\xa2\x96\x6b\xd8\x94\x0b\xd8\x3a\xc1\x9c\xf0\x0c\x26\xbd\xfd\xdb\x0c\xd8\x2b\x8e\x2f\x0d\x87\xc2\x12\x25\x3d\x6e\x61\x01\xae\xc1\xa9\x03\x0c\x18\x37\x1c\xa5\x2e\x6f\xc0\xa4\x61\xa1\x4f\x5d\x98\x71\x6e\x2d\x8b\x66\xa8\x71\x6f\x9e\x70\x17\x1d\xe9\xb8\x28\x5f\xc4\x0d\x33\x67\xd4\x22\x75\xf3\x76\x1d\x35\xc3\x78\x13\xce\xae\xe3\xd9\x46\xe4\xab\x5f\xfe\xbf\x83\x84\x0f\x75\x87\xf7\xbb\xc3\x7d\xd8\xd6\x01\x3b\x8f\xf1\xdc\x7d\xe2\xd6\x07\x3e\xcc\xe0\x40\x3b\x81\x1e\xa1\x10\x42\x1e\x08\x50\x5b\xba\x14\xc1\x20\xbe\x16\x0a\x7b\x5d\xc3\xc2\x60\xe3\x30\x60\xff\x22\xbc\x38\xc6\x56\xfb\x9d\x1d\x29\x07\xbc\xb0\xa9\xe9\x0f\xe3\xec\x13\x6a\x73\x43\x22\x34\x4a\x31\x5d\xfb\x7f\xf0\xbc\x3b\xe1\x88\xeb\x4c\xa0\xe3\xa4\x7a\x68\x6c\x97\x74\x86\x69\x0b\x32\xd4\xb1\x22\x76\x44\x07\x31\x78\x89\x0f\x1a\x86\x9c\x10\xa6\x0c\x38\xe1\x60\xb0\x89\x4f\xc4\x01\xff\xff\x01\x11\xbc\x31\x09\x43\xd1\x82\x23\x5d\x28\xca\x59\x0c\xb7\x06\x5c\x8e\xbb\x6f\xea\x59\xbc\xcb\xa8\x6d\x5f\x5c\x61\x54\x98\xa7\xc2\x8a\x70\x6a\x59\x38\x32\x00\xb5\x9d\x06\x67\x30\xe4\xdd\x41\xda\x4a\x1c\x8e\x5d\xe0\xd8\xdc\x8e\x72\x17\x9e\x55\x32\x06\x80\x00\x02\x67\xd7\xb1\xa3\xd1\x5f\x90\x80\xac\x5c\x5e\xd4\x34\x14\x30\xd5\x3d\xeb\xff\x9b\x33\xf1\x23\x70\xef\x10\xe5\x5d\xc7\xf8\x09\xb5\xed\x34\xe7\xfb\x1e\x03\x95\xbe\xc8\xb6\x1d\x9b\x47\x11\x58\x8e\x7d\x8c\xaa\x98\x4e\xe7\x4c\x0f\x4f\x04\xed\xd0\xa1\xc2\x27\x4e\x2d\xca\xc3\x2c\x86\x43\x05\xcc\x9a\xfe\x0b\x66\xcb\x2f\xc8\xb0\xa4\xa6\x0e\xd8\x5c\x32\x16\xf6\x65\x8a\xea\xe9\x18\x63\x4d\x58\xed\x21\x16\x9e\x56\x7a\xf0\xd5\xd3\x9d\x03\xba\x75\xcd\xe1\xa0\x4d\x86\xec\x05\xb6\x15\xff\x54\x17\x04\x31\xd7\x01\xe1\x3e\xa9\xfd\xf8\xd9\xae\x1d\x18\x7a\xb5\xf3\xd1\xdd\xab\x33\xf1\x7a\xe6\xbf\xb0\x22\x5b\x76\x6a\x1b\x0c\xdd\x3b\x78\xd4\x3f\xf5\xd1\xc8\x80\x53\x57\x4c\x76\x72\x6e\x2e\x7a\xde\x37\x99\x90\x92\x15\x4e\x1d\xaf\x95\xac\xb0\x8e\x0b\x4e\xea\xef\xe0\xce\xd8\x5a\x77\x5d\x0d\xbd\xe9\xf6\xc5\xb7\x60\xa3\x77\xca\xd1\xa0\x81\x99\xd0\x57\xde\xb1\xf0\x32\xd0\x91\x4b\x6b\xab\x66\x50\x5f\xcc\x45\x88\xee\xd5\x1a\xf3\x21\xdf\xa2\x4e\x6a\x77\x9d\x94\xc2\x36\x10\xbd\x21\x77\x4c\xd8\xea\xda\x9f\xee\x73\x96\x09\x74\x90\xb8\xc1\x2c\xbf\xb1\x8e\x66\xbd\x91\x82\xc6\xf7\x9a\xca\x0c\x36\x17\x61\xdf\xf7\x01\x23\xd4\x45\xc9\x11\x27\xbc\x67\xda\xc6\xa8\xc5\xba\xf6\xe9\xaa\xf6\x5d\x1d\xdb\x76\x3d\x0b\x00\xcf\xed\xa3\xdf\x14\x43\xba\x46\x11\xe8\xf2\xc2\x37\x2c\xea\xa7\xa8\x59\x60\x51\x7f\xf2\x68\x5f\x15\x83\xe9\xe6\x52\xa4\x19\x96\xac\xc0\xa4\x42\xfd\xe2\xce\x3d\x15\xc8\x13\x8a\xda\x3d\x8b\xac\x5f\xfe\x7a\xf0\x7b\x62\xa3\x7e\x04\x1e\x1b\x52\x8f\xc8\x20\x67\x11\x46\x16\x43\x13\x81\xce\x6c\xbd\xc8\x2e\xaa\x48\x20\x0b\x8f\x9e\x5d\x08\xfa\x33\x99\x78\x27\x2e\x75\xe5\xb1\x9b\x4b\xd1\x36\x1f\xd6\x3f\xd9\xa6\x5d\xbc\x6f\xf4\xe7\x1f\xa3\xfe\xdc\xb0\xd0\xb7\x10\xae\x4b\x14\x79\x7d\x6a\x63\x8a\x8d\xbe\x47\x98\xf2\x44\x63\x63\xa0\x13\x46\xfd\x47\xd6\x36\x74\x81\x8e\x14\xc3\x96\x23\x24\x88\xf2\x49\x64\x48\x97\x25\x2c\xe5\xd4\x22\x0e\x75\x22\x6c\x47\x5d\x33\x7a\x20\x41\x05\x96\x08\x13\x4c\x43\xbe\x66\xb2\x08\xca\x22\xf4\x87\x04\xc9\x9e\x1a\x12\x1f\x86\x04\x46\xdb\x82\x25\x14\x61\x69\x08\x6c\xbf\x63\x58\xa8\x65\x6e\x1b\x82\x78\xd4\x8d\x18\x75\x88\x40\xbf\x26\x92\xe0\x79\xd4\x25\x22\x12\xd2\xa5\x0e\xa4\x18\xf0\x46\x18\x1e\x75\x4f\x04\x7a\x4e\x01\xb8\x0b\x53\x0d\x64\xdd\x9d\x47\x42\x63\x48\x2d\x2c\xe9\x8c\xc8\x8d\x4c\xe5\x47\x88\x61\xf3\x6d\xf4\xcf\x62\x52\x27\x45\x8f\x31\x2e\xb5\x4e\xb8\x40\x8b\x1f\x39\xd2\xc4\x23\x1c\x98\x19\x7f\x6e\x88\xc6\xd7\x13\x02\x0c\xc1\x25\x87\x0d\xbd\x46\xa1\x31\x07\x5c\x11\x06\x26\x69\xfe\xcf\x39\xba\x79\x71\x09\x9f\x1b\x3e\x54\xa4\x66\xf7\x89\x54\xd2\x40\xc0\xa3\x0f\x21\x93\x30\x46\x98\x39\xf1\xba\x15\xa1\x0f\xa9\x52\xb9\xa5\x22\x6c\xce\xa9\x93\x2a\xab\x07\x28\xc9\x26\x42\xd6\x87\x1e\x6d\xf0\xd4\x9c\xc8\x5e\x79\xc4\xa4\x5e\x0a\xc3\x20\x28\x9f\x33\xf3\xb4\x01\xc1\x23\x21\x68\xaf\x3b\x0c\xce\xc3\x6a\xbb\xb4\xd6\xa7\xb8\xba\xb1\x13\xa0\x8d\x28\xdf\xc2\x51\xb3\x08\x97\xca\x1e\xb0\xa5\x93\x38\x86\xc6\xb1\x14\xf8\x41\x46\xcc\x08\x7d\x67\xb9\xe8\xb8\x09\x12\x05\x6a\xd2\xb0\x48\xcd\x68\xf4\x63\x08\xf3\xc4\x40\xd7\xd1\x54\xf9\xf2\x39\x61\xd0\x1b\x8e\xae\xa9\x2d\xc2\xf1\x44\x8a\x13\xee\x97\xe8\xa9\x07\xb2\x4b\x77\x3a\x9e\x2c\x1e\x5d\xf1\x28\x1a\x65\xc1\x6f\xa9\x8a\xb5\x0c\xf4\xd8\x4a\xf9\x89\xa8\xcb\xe3\x40\x2f\x80\x72\x70\x7f\xc9\x95\xe7\x20\x09\x56\xd6\x38\xa1\x12\xe8\x1d\x8b\x9f\xa0\x97\x0f\x9f\x02\x86\x30\xf8\xc8\x85\x3e\xfb\x8d\x33\x21\x1b\x27\x38\x6a\x46\x50\x2f\x92\x8e\x27\x1d\xe9\x6a\x94\x3a\x92\x53\x50\xf8\x68\x2b\x7c\xf4\x94\x1b\x20\x4f\x55\xdc\xb8\x25\x92\x25\xa9\x72\xfc\x8d\xe5\xd8\xfd\x72\xb0\xf7\xfd\xef\x19\x4e\x7e\x48\xf5\xd1\x7f\x96\x2c\x89\x11\x74\x2b\xba\x34\x78\xe3\x27\x49\x9a\x8f\x48\x9f\x66\xe8\x48\xc9\x3b\x11\x28\x60\xc1\x18\x5c\xd8\x14\xd9\x63\x35\xe6\xcf\x70\x3a\x46\x78\xeb\x30\x4d\xcd\x2a\x83\x4d\x04\x4f\x0d\x81\xf1\xbe\xd8\xdc\xa4\x3c\x82\x1e\x61\xc0\x49\xc4\x72\x2e\x89\x96\xd2\xd1\xe1\xa9\x5c\x19\xd0\x89\x13\xf6\x5d\xfa\x78\x62\x72\x69\xaa\x61\x79\x22\x84\xf4\xc8\x25\x38\x2c\x02\x78\xa6\xc9\x08\x37\xe7\x06\xb7\xd7\xbd\x5d\x09\x2c\xae\x06\x29\x02\x13\x49\x05\xa3\x6c\xca\x77\x71\xb2\x36\x58\x04\x3c\x2a\x0f\x8f\xed\xa5\xe1\xc2\x48\xa8\x05\x4c\x28\x78\x7b\x40\x0c\x4f\x98\x72\x71\x45\x18\x1e\x9d\xe2\x06\x88\x30\x33\xc5\x19\xa3\x48\xba\xd5\xba\xa7\x6b\x9d\x56\x9d\xd4\x6c\x22\x12\x30\x74\xe7\x0b\xd5\x49\x00\xd4\x9e\xb6\x18\xa3\x78\xe8\xca\xdc\x49\xe3\x46\x0b\xd2\x76\x77\x4f\xd6\xcc\x7d\x87\x30\xc0\x2a\xab\x75\x7c\x87\xcb\x04\x3f\x65\x3e\x45\x73\x72\x6c\x31\xf6\x15\x19\x19\xa0\x80\x92\x1e\x60\xfc\x2e\xea\x1b\x9c\xf0\x29\xf3\xe7\x1e\x15\x27\xdc\x86\x96\x73\x9b\xba\xb2\x2b\x58\x3a\x34\xde\xc5\x85\x5b\x39\x13\x4b\x1d\x84\x09\xb5\xe7\x86\x43\xad\xa9\x43\x9d\x1d\xda\x3f\x0c\x2d\x60\x11\x21\xdb\xa3\x28\x0e\x43\x47\x64\x38\x28\x91\xa1\xd0\xa0\x19\x21\x39\xb3\x6a\x56\x44\x4e\x72\x43\x4e\x4d\xb5\xbc\x7a\x18\x36\x03\x68\x99\x5c\x25\xa4\xe3\x31\x5c\x24\x25\xc9\x41\x12\x27\x17\x4b\xe9\x53\x8e\x61\x65\x0d\x49\x6c\x8a\xc1\x02\x78\x4d\xa4\xda\x82\x84\x2a\x88\xd7\x4d\xac\x9d\xd4\x89\x7e\x13\x3d\x6c\xa2\x2b\x9b\x88\x44\xcc\x53\xd5\xaa\xf2\x85\x2a\x1f\xf5\x54\xa7\x48\xbb\xe4\x4c\x73\x0d\x49\xbb\x70\x91\x8f\x98\xa2\x4d\xd2\xa9\x9e\x24\xa2\x2c\x92\xa6\x77\x8a\x92\x12\x49\xa0\x79\x24\x97\x27\x49\x55\xd0\x9d\x2e\x31\xb1\x4e\x39\x7d\x80\x6e\xb9\x46\x4b\xb7\x86\xb9\x19\xd2\x32\xbf\xa1\x85\xb2\x3e\x39\x14\xb5\x27\x40\x2e\xeb\x93\x74\x9b\x4b\x05\x27\x97\xc0\xfc\xf6\x89\x80\xe5\xe0\x14\x47\xf4\x69\x8c\x27\x34\x81\x3b\x38\xfd\x9d\xf5\xe9\x3f\xe5\x3d\xff\x8e\x54\x8a\x3c\xd8\x9c\xdb\xa7\xdc\x03\x0a\x69\x3f\x9e\x5e\xa9\x95\xdb\x55\xc3\x6d\xd7\xce\x0b\x81\x66\x41\xbf\x7c\x54\xb3\xc1\xc8\x19\x92\x5e\x11\x6e\x4e\xdc\x35\x5a\x75\x5a\xb7\xb8\xb9\x79\x22\x7f\x6a\x01\xb1\xf0\xa8\x0f\x64\xa1\x99\x9d\xc8\xe3\x71\x83\x63\xaf\x2d\xc5\x0c\x7a\xaa\xf7\x3c\xb5\xd0\xb3\xa2\xa7\x80\xe5\xd7\x34\x12\x63\x21\x23\x5f\xdb\xb0\x47\x1e\xb2\x47\xb8\x04\x4e\xa1\x96\x27\xb2\xb5\x16\x15\xb2\x91\x0c\xb5\x2f\xd0\xa1\x33\xab\x49\x48\xc7\x91\x9f\x90\xbe\x3c\x81\x88\x9c\x72\xf4\x5c\x82\x8d\xc4\x46\xe0\x88\xe0\x04\xe6\xd4\x45\x7a\x83\x0b\x3f\x2e\xa8\xb8\x5d\xa8\x2b\x81\x11\x3a\x6d\x9e\x76\x61\x3d\x07\xba\x9d\xb5\x29\xce\x36\xee\xc9\xa7\x36\xe1\xd6\x89\xfc\x21\xbd\x9f\x13\x17\x68\xa0\x45\x1c\x20\x89\x0e\xfc\xb8\x72\xbf\x50\xff\x3f\x71\x60\x21\xb6\x08\xe4\x13\x0c\xbf\x12\x0c\xb9\x04\xd8\xef\xa0\x3f\x45\xfc\x15\x54\xb9\x20\x7d\x8d\xeb\x49\x53\xc1\xef\x7b\xb2\x7a\xff\x04\xa1\xe0\x13\xa9\x30\x48\xd0\x6c\xdb\x7e\x8d\x89\x8e\xcc\xeb\x94\x92\xde\xb9\xc8\xdc\x30\x6a\xbf\x66\x48\x25\x7c\xf9\x7a\x0d\x42\x3b\x48\x57\x84\xec\xac\xfa\x25\x83\xdf\x08\xbd\x15\x98\x8a\x50\x39\x8a\x37\xe8\x81\x01\xbd\x53\xa2\xb3\x3f\x22\xda\xbf\x07\xe1\xc0\x6d\x09\x07\x55\xc9\xef\x7b\xaa\x19\x7e\x4b\x3a\x6d\x64\x4e\x19\x7e\x6e\x97\xea\x9e\xd4\xcf\x43\x68\x20\xaa\x70\x5f\x15\xb8\x0b\x38\x86\x0e\x9d\x91\x57\x61\x53\x60\x4f\x60\xbb\x06\x8d\x86\xfd\xd1\x89\x60\x28\x94\x04\x62\xc0\x38\x5e\x4d\x2a\xa6\x3e\xee\x99\x14\x17\x4a\x7d\x82\x61\x17\x04\xb1\xe7\x86\x47\xed\x16\x76\x18\xa0\xc9\xb0\x80\x76\x4e\xd6\x79\x1e\x09\x94\x25\x73\xe7\x7c\xca\xd8\xba\x17\x5b\x13\x98\x05\x40\x04\x7e\xc2\x1c\xe4\x79\x7d\xd8\xa3\x59\xc4\x95\xf3\xc7\x9d\x7b\xd4\x3e\xe1\x30\x81\x5c\xd8\xb7\x01\x0b\x22\x4c\xe2\x53\x77\x29\x77\xb8\x12\x6a\x30\xf9\xd0\xe8\x05\x7e\x27\xdc\x5a\xfa\x73\xb7\xe6\xd1\x52\xb9\xdf\x14\x53\x6e\x0f\xfd\xef\x4a\xa7\xad\x7c\xe8\x5b\x74\x09\xab\xe9\xa9\x02\x17\x0c\x20\xb0\x76\x4b\xc3\x9e\x33\x6a\xa7\xb0\xfe\xda\x13\xbe\x0b\x67\x30\x10\x61\xf9\x28\xc2\xf2\x1b\xf1\x95\xd7\xd5\xa6\xde\x95\xdd\x18\x1c\xc1\x73\x93\x70\xbe\xc7\xb9\xba\x32\xb1\xc7\x6c\x75\xe5\xde\x1e\x73\xd5\x95\xd9\x7b\xe8\x40\x76\xdd\xbb\xeb\xe3\x85\x4d\x00\x94\xb9\xbb\x34\xdc\x89\x33\xe5\xe6\xef\x7b\xaf\x3c\xc2\xec\xb9\x58\x8a\x89\x37\x5d\x17\xd0\x3c\x5e\x08\xf4\x00\x85\x7a\xdd\x27\x47\xdd\x89\xba\x71\x4a\xca\x1c\x8d\xd8\x81\x9d\x30\x74\x24\x69\x93\x01\xb1\xd2\x24\xa6\xec\xb0\xb2\x77\xc2\xa8\xc3\xbc\x54\x61\xd4\x5d\xb8\x43\xd1\xfa\x2e\xda\x0d\xbd\xfd\xae\x0c\x05\xb3\x71\x4a\x72\x98\x92\x6d\xa7\xb1\x43\x30\x41\x9f\x31\x3d\x97\xac\x76\x22\xfb\xaf\x9c\x9e\xee\xdc\x10\x9f\x62\x86\x36\xe0\xda\x69\xd9\xdf\x3a\x0f\x5d\xea\x6f\x9f\x89\x0f\x8b\x84\x36\xcf\x42\x74\x86\xa3\x7e\x87\x33\x11\x25\x19\xea\x77\xfb\x6c\x7c\x48\x8c\xd2\x74\x44\x7a\xac\xec\x68\x1a\x3a\xdd\x8e\xb8\x8f\x2b\x72\x43\xac\x7a\x65\xfd\xbb\x8d\xbd\x60\xb8\x1e\xb1\x13\xc6\x30\xda\x34\xe1\x82\xe0\x0e\xcb\x2e\x79\x7d\xe4\x00\x7f\x91\x54\x34\xb6\x80\x15\xc5\x2b\xa0\x37\x43\x11\x18\x73\xe0\x4b\x55\x8e\xdc\x49\x02\x70\xa2\x7a\xa7\x87\xb8\xc3\x0c\xa5\xb5\x2c\x71\xa5\x54\x29\xb5\x2e\x73\x29\xad\xcd\x50\xb7\x19\xfe\x5e\x4b\xcf\xc6\x9e\x2a\xd6\x7b\x3a\xf7\x00\xf4\xdf\x02\xfc\x33\x90\x37\x52\x5b\x36\x56\xbb\x65\x97\x46\x44\x1c\x5f\xca\x7d\x52\xbd\xa2\x1b\x1c\x25\x39\xf6\xc4\x3e\x81\xed\x8b\x43\xb8\x94\xf6\x12\x7f\xc9\xac\x35\x7f\xd7\xbc\xe7\xc7\x7d\xe8\xf9\xdd\x5f\x9f\x93\x1e\x32\x9d\x28\xb0\xc7\x4d\x18\x57\x2e\xa3\xed\x14\xb6\x45\xd8\x56\x64\x5e\xeb\x3f\xa1\x7e\x6d\x34\x51\xb1\xa6\x8c\xcf\x0d\x77\xe9\x41\xc5\xce\x5c\x2c\x99\x29\xbd\x96\x33\xd1\x88\x87\xf0\xfc\xb9\x9e\x83\xaf\x85\x90\x94\x18\xe1\xf1\x74\xee\x83\x39\x84\xf1\x89\xbb\x74\xe6\xfe\x94\x71\x18\x6d\x8b\x30\x67\xe2\x2f\x0d\x3e\xb7\xa7\x6c\xf7\xf5\xb4\x8f\x88\xc2\x04\x44\x04\xda\x03\x83\x5f\x23\xa2\xa1\x90\x10\x7e\x4b\xb8\x6f\x50\x13\x51\x10\xd5\x08\x31\xce\x05\x96\xf0\xb4\xbd\xdd\xbf\x1c\x4f\xfe\xef\x63\xc9\x6e\x38\xf2\xc8\x9d\x22\xec\x93\x26\x2e\x54\xe7\x4f\xd9\xda\xbc\x7d\x88\xa4\xf7\x83\xf1\xa3\x13\x83\xed\x12\x65\xc0\x8c\x8e\xf4\x44\x28\x81\xad\xa8\x45\xef\x0d\x47\xd1\x88\x96\x05\xe9\x4b\x51\x94\xec\x97\x29\xd9\xaf\x92\xe8\x0c\x0b\x44\x71\x7a\xd7\x49\x7c\xb7\x28\x4e\x4c\xb4\x6c\x85\xbd\x02\x6e\x0e\x6d\xdc\x69\x49\xa1\xa1\x12\xeb\x74\x24\xc9\xec\x04\xe1\xeb\xd4\x92\x64\x97\x70\xc2\xdd\x25\xef\xc8\x90\x6d\x43\x8a\x4b\x70\x07\xad\x84\x93\x8e\x94\xa4\x0a\x19\xbd\xcc\x25\x78\xf8\xe4\x36\x72\x84\xa1\x24\xb9\x96\x00\xbb\x1f\x97\x24\x6f\x2e\xa3\x11\x6c\xef\x2e\x4b\xb6\x3b\xb2\xe8\x5a\x92\xac\x64\x38\x52\x5c\xb5\x34\xd4\xc1\xa0\xab\x7c\xc6\x4b\xf9\x26\x7a\xd2\xaf\x65\xb1\x00\x0d\x04\xa9\x40\x98\xd8\x44\x8d\xf6\xd3\xd7\x00\x3c\x25\x12\x14\x4d\x02\x1b\xf1\xf1\x4e\xc2\x63\xbb\x15\x43\xe3\x90\x72\x8c\xf1\xa0\x24\x97\xae\x92\x5c\x7a\x06\x9b\x03\x8f\x26\x3b\x72\xca\x71\x4d\x63\x13\xb6\x2e\x97\x99\x1b\x7c\xea\x51\x36\x71\x96\x4e\x83\xc5\xd4\x92\x11\x75\xd1\x97\xa3\xb7\x44\x99\x9b\xb9\xb4\x64\x20\x00\xe4\x12\x61\x24\xf0\xb0\xd1\xae\x8f\xa0\xea\x8e\x49\xb6\xdd\x9c\xf3\xa5\x05\x6c\xbb\xf9\xbb\xe2\x84\x5f\x39\x84\xb9\x6b\x54\xc5\x5f\x2a\x99\x4d\x37\xd1\x96\xb1\x3c\x26\xcc\xc3\xd8\x17\x5e\xaa\x42\x64\x4c\x9c\xdd\xc2\x53\x0c\x79\x61\x3c\x2e\xdb\x30\x21\x44\x2b\xb5\x5c\x9b\x9d\x4a\x1c\x68\x58\x32\xd2\x88\x21\x51\xaf\xc9\xdb\x3b\x24\x6a\x97\x5c\x35\xa3\xd5\x7c\xe6\x0f\xcc\xe7\x13\x81\x67\x4f\x92\x91\xed\xcd\x43\xa6\xc4\xe5\x1c\x91\x5c\x48\xea\x70\x02\x5b\x17\x35\x03\x05\xce\x40\xc2\xdd\xc1\x29\x8c\xbd\xf1\x14\xa6\x9e\x83\xce\xae\x73\x70\xf3\x3c\x6e\x97\xf6\x07\x4b\x72\x7a\x25\x29\x81\x31\xe1\xea\x0c\x50\x09\x8c\x01\x07\x1a\x51\x86\xa3\xce\xc5\xb8\x3c\xcf\xc1\x69\x8b\x02\x10\xdc\x59\x61\x68\x09\x18\xc5\xa7\xad\xac\x68\x66\x2a\xa0\x46\x41\xc5\x9c\x3b\x94\x29\x79\xe8\xe3\xa6\x20\xeb\x9c\xdf\xac\xc9\x42\x23\x75\xd6\x2c\xd4\xb9\xb3\x55\x1f\x4e\xd5\x41\x35\x2c\xca\xd0\xd3\xbe\x81\x01\x7a\xd6\xb7\x4e\x38\x13\x71\x1e\xf2\xce\x3c\x94\x0e\x18\xf0\x97\x53\x2f\x45\xbf\xb4\x18\x8f\xc3\x3c\x41\xf6\x43\x4e\x42\x56\x4f\x42\xaf\x9e\x84\x78\x0e\xc1\xac\xb9\x55\x13\xef\x14\x77\xa8\x50\xb5\x3b\x65\xd6\xef\x7b\xaf\x30\x03\x4e\x54\xa8\x99\x3d\x96\x59\xd9\x10\xad\x43\xf9\xfd\xd9\xca\xd7\xa3\x51\x21\x97\x47\xee\xa6\x81\x8d\xa4\x0e\xfe\xda\xd4\x2b\x39\x75\x88\xba\xc7\x67\x1b\x17\x43\x4c\x83\x3c\xaf\x99\x3c\x25\x92\x51\x6a\xe0\x17\x7a\x87\xea\x49\x3c\x92\xd3\x49\xea\xdc\xa2\x4e\x07\x30\x68\xbc\x61\xec\x31\x85\xa8\xd4\xd2\x92\x81\x4e\x88\x4a\x7b\x8d\x47\xf7\x5c\x15\x0c\xbf\x3b\x93\xf5\x66\xe7\xa7\x62\xf8\x5a\x6d\x30\x8d\x27\x89\x60\xd6\xe5\x6b\xfe\x84\x2f\x99\xe8\x33\x12\x27\x5c\xca\x7e\x85\x94\x79\x22\xe5\x75\x80\xd1\xe1\x13\x3c\x76\x93\x07\xa3\x9e\x3a\xa8\xc3\x28\x41\x53\x66\xcf\x39\x5f\xba\x58\x10\x53\x07\x05\xf8\x16\x20\x32\xe1\xc8\x89\xd5\xc7\xd6\x3d\xa6\x45\x5a\xcc\x0b\xcc\x8c\x01\x57\x0c\x01\xc5\xb1\xb9\xbd\x99\x67\xf3\x81\x65\xf3\xa5\x8c\x8b\x89\x89\x05\xdc\x38\xe7\x53\xb6\xcb\x69\xe4\x30\x7e\xf7\xff\x0d\x30\x7c\x0a\x20\x3c\x89\x46\x3d\x6f\xb6\xa4\x08\x18\x24\xb2\x78\x92\xbf\x69\xee\x00\xe3\x87\xdb\x0b\x3e\xe7\xd3\x75\xb9\xe3\xa3\xe7\x7d\xeb\x03\x6c\xeb\xcc\xf7\x30\x8c\x29\x15\x56\x64\x78\xa8\xe4\x6a\xa0\xc3\x15\xee\xc1\x2f\xb3\x4a\x17\xdd\xce\x58\x68\x7c\x65\x1d\x03\xcd\x62\x44\x5e\x95\x46\x21\x4e\x50\xc7\x49\x6d\x6a\x63\x5c\x17\x3e\x30\xcd\x35\x30\xae\x55\x63\x5f\xcb\x1c\x83\xda\xd6\x94\xdb\x68\xc4\x2b\x50\xbb\x11\xff\x5b\x86\x4f\xb9\x7b\x22\x2c\x19\xbc\xd2\xe1\x4a\xf5\x03\xcd\xc0\x9b\x56\x9e\x61\x88\x26\x3c\x64\xe9\x87\xc7\x16\x9c\xba\x62\x69\x63\x54\x10\x0b\xaa\xe5\xd4\xf5\x7b\x56\xc5\xc2\x40\x0b\xe0\xc6\x88\x0c\x78\x02\xd7\xa1\x2e\x8f\x0c\x97\xba\xd8\x73\xcb\xb0\xe1\x53\x66\x19\x8c\x97\x12\x08\x9c\xe0\x13\x41\xa3\x4a\x21\x41\x81\x3a\xdd\x78\xd8\xdd\xea\xf1\x35\x8d\x7a\x6e\x88\x83\x3a\xce\x8d\xc0\x1b\x8c\x2a\x03\xcb\xb7\xa0\x96\x15\x0a\xca\x6d\x8c\x05\xad\x3a\x85\x2e\x7e\xa8\x67\xa5\xd8\x6e\x2a\x80\x69\xb1\x7d\x43\x84\xd4\x63\xd4\x6b\xba\x6e\x73\x83\x32\x7f\x02\x5b\x5e\x27\xa4\xae\xd7\x7a\x49\xa1\x8e\x4f\x2d\xea\xba\x8d\xbb\x4f\xb4\xfe\xf4\x53\xf4\x3d\xc4\xa9\x65\x01\x8c\x54\x24\x5e\xc1\xa4\x0f\x21\x66\xa3\xa9\x5a\xc8\xa8\x83\x87\x28\xad\xdb\x31\xce\xa9\x25\x52\xe9\x06\x81\x32\x11\x52\xc6\x5a\xb7\xb7\x26\xa1\xa6\x1b\xc1\xd5\x31\xa8\xe9\xa3\x9d\x1e\xa3\xa6\x33\x81\x69\xc0\x53\x43\x7a\xe4\x31\x6c\xca\x7c\x62\xa3\x31\xa3\x45\x1d\x2b\x85\x61\x35\x6c\x3c\x4c\xb4\xad\x53\x97\x4a\x8d\x43\xc4\x51\x9b\x11\xa8\xc4\xa3\x75\x6f\x98\x41\xf9\x71\xb7\xeb\xc8\xfc\x32\x41\xfd\x94\x13\x81\x21\x69\xa4\x3b\x05\xde\x8d\x14\x45\x1d\x7b\xee\x50\xdb\x4d\x65\xd0\x57\x8b\x32\xaf\xe7\x10\xd6\xc4\x40\xa6\x02\xa3\x6a\xa0\x8a\x39\x5c\xcc\xc6\x2c\x04\xe3\xd9\x89\x81\x07\x58\x93\x50\x0f\x30\xdf\x4f\x6d\xca\xd0\x22\x90\xcd\x5d\xca\x9c\x01\xd0\x90\x95\x43\x57\xd9\xc7\x8c\xba\x78\xcc\xd8\x78\xe1\x6a\x30\xe1\x0c\x4f\x54\xd1\xc5\x8c\x60\x73\x26\x5d\x3b\x99\x30\x22\xae\x7b\xca\x64\x38\xe0\x5d\xbd\xfa\x02\xd6\x0d\x5c\x85\xc3\xfc\xb2\x1f\x43\x04\xc2\x75\x22\x60\x61\x6f\x1d\xef\x21\x22\xd0\xb5\xa9\x47\xa5\x19\x7b\x8a\x01\x9e\x36\x13\x01\x82\x48\xca\x1d\xf4\x28\x81\xca\x28\xf0\x83\x76\x8e\x1e\xd0\x03\xc0\x1a\x9b\x85\x1d\xff\x4d\x40\x03\x28\x13\x38\x15\xd0\x1f\x73\x48\x45\xe3\xec\x01\x15\x62\x29\x13\x30\x07\x98\x1f\x52\x4b\x06\x98\x90\x6f\xd0\x58\xd9\x4b\xb9\x34\x2f\x12\x7c\xe2\x52\xcb\xe9\x16\x8d\x4e\xea\x0d\xca\xb9\xd4\xee\xb3\x27\x0e\xe5\x56\xd7\xe2\x99\x11\xa8\x8b\xc1\x3e\xc8\xc6\x0d\xb0\x1f\xe2\x7c\xac\xdd\xbc\x50\x21\x28\x43\xdb\x62\x80\x04\xec\x3b\x04\xb5\xed\x39\xa7\x1e\xb4\xa5\x63\x0e\x41\x61\xd8\xd9\x29\xf3\xa9\x03\x78\x9e\x3a\xd4\xf1\x61\x66\x84\x43\xa7\x69\x80\xe3\xd4\x11\xd8\x68\xe0\x83\xc5\x31\xf5\x39\x7a\xd6\x23\x75\x64\x01\x00\xd3\xa3\x2d\x3d\x25\x4a\xfc\x69\xcd\x9f\xe4\x5d\x55\x2c\xa2\xb7\xe3\x81\xef\x43\x12\x2a\xef\x6b\xe3\x75\x87\x6c\x24\x0a\xbb\xfe\x42\x4f\xc2\x82\xdc\x84\xb7\xe3\x9e\x31\x27\x89\xa4\xcd\xf6\x78\xcd\x8a\x9b\x68\x37\xe1\xad\x71\x83\xc6\x9e\xda\x78\x83\x05\x28\x79\x23\x8d\x07\xc6\x6b\xe6\x04\xe4\x4d\x1e\x56\xe3\xbe\x9a\x21\x89\xea\x23\xf3\xf1\x86\x63\x74\x68\x6a\x38\x7c\x87\x29\xe4\x2a\x2e\x8a\x0f\xe3\x81\x88\x89\x54\x92\x8f\x1e\xaf\x71\xd6\x44\xcb\x33\x63\x2e\xd7\xda\x6e\xb3\x9b\x05\x78\x45\xb6\x78\xf6\xec\x81\x9b\x68\x08\x42\x8d\x14\xb4\xf5\x5d\x79\x82\xae\x2b\x07\x39\x69\x3d\x02\xba\xfe\xc8\x92\xc3\x45\x95\x3f\xa6\xe0\x28\x2c\x74\xfd\x0f\xf6\xa0\xda\xa9\x6f\xab\xff\xd4\x07\x5c\x78\x7e\x72\x17\xaa\x43\x98\x28\x27\xa3\x9b\xde\xb4\x55\xeb\x77\x45\x5c\x2d\x8a\xec\x2e\xce\x16\x37\x71\x11\xbe\x49\xa1\x3c\xf2\xae\x48\xaa\xfa\x5e\x36\x79\xd1\xbc\x93\x95\xc6\xab\xd5\xc3\x9d\xde\xe8\x80\xf4\x93\x77\xba\x65\x08\xdb\xee\x76\xd2\xba\x1d\x5d\x86\xc5\x5e\x15\x68\xda\xa1\xec\xf1\x5e\x4c\x93\x6c\x16\xbf\xff\xfe\x6a\xa4\x35\x26\x47\xfa\x97\x06\xdb\xdf\x1f\x55\x2f\x03\x2d\x0a\x33\x99\xba\xa7\xe9\xa4\x97\x37\x4c\xe3\xa2\x5a\xcf\x8c\xc9\x83\xcc\x1d\x22\xd5\xcd\x3e\x0f\x4b\x45\xc5\x34\x9d\x8c\xaa\xa3\x3f\x7d\x51\x2e\xaf\xf7\x96\x71\x51\x26\x79\x16\x68\x8c\xb6\xa6\x20\x7f\x7a\x59\xbd\xfc\x93\xb6\xb7\x4c\xe2\x77\x5f\xe5\xef\x03\xcd\xdc\x33\xf7\x84\xb3\x27\x1c\x6d\xef\xb6\x88\xcb\xb8\x58\xc6\xc7\xe5\x6d\x1c\x55\x3f\x86\x55\x92\x07\xda\xfb\x57\xc9\xec\x1f\xaf\x92\xd9\xde\x4d\x1c\x57\x9a\x34\x92\x7a\x7f\x93\x66\x65\xa0\xcd\xab\xea\x76\x7c\x70\xf0\xee\xdd\x3b\xfa\x4e\xd0\xbc\xb8\x3e\xe0\xa6\x69\xc2\x40\x69\x32\xcb\xf8\x7d\x9a\x64\x6f\x37\x65\x64\xbe\xef\x1f\xe0\x5b\x6d\xef\x2a\x8f\x16\x25\x20\x43\xa0\x5d\x85\x69\x19\x6b\x7b\x45\x0e\x0f\xc9\xcd\xb5\xf6\xe5\x9f\xc6\x9b\xfa\xf2\xff\x4c\xeb\xf5\x97\xf1\x4b\xed\x0b\x28\xf4\x4b\x6d\xb5\x5a\xe9\x2b\xe2\x5b\xc2\xf5\x1e\x46\xdb\x8c\xce\x46\x15\xb9\x7b\xdb\xe6\xaa\x67\xd5\xde\x6c\xb5\xd2\xa5\x97\x5f\x74\xd8\xeb\x58\xae\xc3\x75\x12\x06\xd9\x88\x99\x8e\xf0\x75\x92\x06\xd9\x48\x38\xae\xaf\x93\x3c\x38\xd7\x8a\xf8\x4a\xbb\x3c\xac\x8b\xd9\x2b\xdb\xf9\xb9\x17\xef\xef\xc7\xb4\x88\x6f\xd3\x30\x8a\x47\x07\x17\xc5\x45\x76\x7f\x51\x1c\x5c\x13\xed\x22\xd3\xf4\x15\x54\x11\x05\x45\xd0\x69\x41\x53\x4a\x3c\xc2\x26\x4f\x46\xd5\x3c\x29\x49\xac\x13\xf8\xa5\xbf\xce\x92\xab\xab\xb8\x28\x83\x4a\x3d\x67\xd7\x67\x79\x16\x07\x99\x7c\x44\xec\xfb\x2e\xbc\x89\x03\x4d\x93\x29\x19\x3e\x44\xf9\x2c\xbe\x49\x8a\x22\x2f\x54\x32\x50\xe4\x3f\x03\x4c\x83\x17\x4c\xa6\xd4\x03\xfb\x3a\x2a\xf2\x34\xfd\x21\x2f\x13\x68\x46\xf3\x3a\x5a\x14\x65\x5e\x1c\x47\x55\xb2\x4c\xaa\x0f\x41\x16\xbf\xdb\x0b\xe9\xf2\x36\x96\x6f\x71\x78\x4e\xe6\x61\x76\x1d\x0f\x5f\x95\x58\xde\x30\x75\x56\xe4\xb7\xc3\x34\xa4\x10\x4d\xc3\x67\x09\x8e\xf7\xac\x69\x41\x52\x62\x83\x3b\x29\x79\xa6\xaa\xec\xd2\x8b\x55\xfd\xee\xa7\x7c\x11\xcd\xe3\x59\x17\xb8\xab\x95\x1a\x96\x5f\x47\x31\x39\xbf\x7b\x1b\x7f\x18\x6b\xf9\x2d\xbc\x2c\x35\x52\xc6\xd5\xb8\x5b\x90\x84\xaf\x7a\x1d\xc4\xe4\x45\x77\x00\xf6\xf7\x63\x20\x0a\x9d\x94\xa0\x37\x3e\xf4\x2a\xc9\x66\xa3\x58\xa7\x51\x11\x87\x55\x3c\xd2\xf5\xd5\x8a\xc8\x0a\x61\x2c\x5e\xe1\x58\xfc\x25\xcd\xdf\x84\xa9\x46\xae\xbb\x35\x37\xa8\x23\xcb\x6b\x73\xdf\xdf\x8f\x86\x49\x41\x36\xe2\xae\xe5\x3a\x7a\x8d\x1d\xed\xab\xa6\xba\xec\xfa\xf8\xaa\x8a\x8b\x69\x12\xbf\xfb\x36\x4b\x2a\x4d\x2d\x04\x9d\xfa\x00\x0b\x63\x6c\xfe\xa1\xec\x63\x11\x5f\xdd\xdf\x77\xd1\x8b\x16\x8b\xec\xfb\x45\x55\x26\xb3\xf8\x38\xbb\x5e\xa4\x61\x31\xea\x7c\x1f\xd3\x4e\x8b\xba\x0f\xb2\x7f\xf4\xaa\xc8\x6f\x7e\x8a\xdf\x57\xc7\x45\x1c\x8e\x60\x36\x5c\xd1\x2c\xac\x92\x65\xfc\x4d\x1a\xdf\xc4\x59\x45\xe2\x06\xcc\x40\x85\xdb\xef\x69\x9e\x8d\xb4\x3e\xe2\x69\xa4\xa9\xb8\x6a\x27\x59\xb7\x9d\xa3\x75\x48\xc6\x5d\xec\x8d\x47\x95\xbe\xd2\x57\x1b\x6a\x92\x98\xaa\x91\x58\xe1\xac\x44\xae\x19\x7d\x23\x87\x72\xc3\x17\x6f\xd2\x45\xd1\x69\xd1\x0e\x0d\xea\x4c\x98\xd9\xe8\x05\xdb\xd2\x22\xcc\xf5\x29\x2a\x30\xb7\x54\x10\x61\x86\x2e\x50\x81\xe6\x3c\x1e\xac\x0d\x59\x99\x02\x52\xd5\xd5\x41\x21\x9b\xeb\x83\x69\x3f\xac\xed\xe3\xd5\xc0\x57\x7f\x4e\xd2\xb8\xdc\x52\x72\x19\x57\x58\xff\x28\x96\x34\x04\xb2\xb4\xe8\xff\x75\x8e\xb1\x2d\x1e\x46\xfc\xe4\xaa\x37\x99\x6b\xb6\xa3\x9b\x46\xe1\x67\xd4\xa3\x0a\xfa\x61\x05\x54\x80\x5e\xe5\xc5\x37\x61\x34\x57\xfd\xff\xb6\x8a\x6f\x46\x1b\xd1\xb4\x8c\xab\xef\xf1\xcb\x6f\xaf\x1a\x58\xd1\xb7\xf1\x07\xe0\x7e\x16\x45\x11\x67\xb2\x1f\x3a\xf2\x48\xaa\xd0\xe3\xd9\xec\x53\x17\xf9\x63\x7c\x93\x2f\x3f\x4d\xa1\xfa\xaa\x03\xe9\xef\xb3\xaf\xe3\xb2\x2a\xf2\x0f\x1b\x60\x2d\x17\x91\x66\xcc\xf6\xf7\x07\x09\xb4\xca\x1b\x1a\xd1\xa7\x95\xeb\x08\xb6\x56\x7c\x4c\x2a\xfd\x4e\xab\xd1\x40\x7b\x11\x04\x15\xcd\x8b\xe4\x3a\xc9\x6a\x22\x2d\xd7\x96\x98\x5e\xd7\xa8\xa2\xf7\x97\x90\x4e\xae\x0e\xa9\x5e\x87\xc3\xe6\xaa\x5f\x0c\x3a\xa3\xa8\x67\x1f\x45\x65\x49\xf8\x41\x53\x41\x77\x96\xae\x17\xad\xa0\xd6\x2c\x65\x75\xa3\xdb\x95\x70\x7d\xf9\xa5\xf1\x4d\x52\x8d\xe2\x4e\x1f\xba\xb4\x6c\x6b\x1d\x32\x97\xfa\x18\xa0\x24\xd9\x80\x6f\xb3\xab\xbc\xb7\x76\x75\xe8\xe8\xd6\xb2\xfa\x14\x7b\xad\x41\xcd\x6c\xde\x0c\xcb\x86\x3d\x90\x1f\x9e\xc7\xa4\xba\x6c\x3f\x86\x1d\x4e\x2c\x47\x79\x43\xf5\xc9\xd5\x28\x5b\xa4\xe9\x8b\x20\xd6\xeb\x09\xdd\x8e\x41\x6f\x4e\x77\x86\xa6\x45\x09\xa0\x02\x31\x20\xcf\xfe\x7e\x39\xaa\xf4\x17\x41\x00\xac\x5c\x53\x94\xc2\xa1\x87\xd8\x25\x59\x47\xb6\xa9\x8e\x2e\x40\x0f\x37\xa0\x87\x6c\x43\x07\x0d\xc9\x5a\x26\x2c\xe1\xa7\x7c\x94\xd1\x34\xbe\xaa\x48\x46\xab\xfc\x56\x5f\xc5\x69\x19\xef\x3d\xa6\xc0\x4e\x4e\xd5\x95\x06\xac\x45\x7c\x9d\x94\x55\x5c\x7c\xaf\xa6\xc3\x03\xb8\xa8\x58\xae\x4d\xdf\x2a\x34\xfd\x38\x22\x77\xbe\x2e\xe3\xea\x6b\xc5\xe9\xbd\xae\xc2\x6a\x7b\xcd\x0d\x3f\x58\xf3\x95\xeb\x34\x4a\x2b\xe2\x70\xf6\x7d\x96\x7e\x18\xb0\x90\xfa\x6a\x75\xa9\x93\x78\x35\xd2\x0f\x23\x7a\xb1\x30\xb9\x6b\x5f\x85\xd1\x86\xed\xf4\x5e\x16\xbf\x1b\xc5\xf7\xf7\x91\x3e\x0a\xe9\x3f\x84\x33\x0a\x69\xf8\xb7\x6b\x9d\xd4\x0f\x3f\x9a\x6f\x74\x7d\x45\xea\x42\xa2\x9b\xdb\x20\xa4\xff\x79\x7b\x33\xba\xab\x3e\xdc\xc6\xe3\x88\x94\x71\x1a\x47\x55\x5e\x94\xe3\xf3\x73\x2d\xbb\x7e\x6f\x74\x18\xef\xcb\x4b\x02\x1b\xaa\xbf\x2d\xe2\xe2\xc3\x00\xe7\x11\x69\x0e\x47\x0c\x98\xca\x90\xfe\xe5\x6a\x94\x13\x57\x27\x7c\x3f\xd6\xf7\xf7\x47\x21\x4d\xfe\xf2\x6a\x94\x05\x21\x3d\xf9\x71\x32\xd2\x75\x5c\x71\x8a\xf8\x2a\xc8\xe8\x55\x52\x94\x15\xb4\x28\xc9\x6e\x17\x55\x39\xbe\x6b\xf8\xff\xb1\xd6\xdc\x6a\x24\xc3\x84\x0c\xef\x1b\xc6\x7f\xac\x35\xb7\x1a\xd9\x8c\xcd\x63\x6d\x73\xba\x46\xd4\xfa\xd7\x72\xcf\x2b\x92\x2f\x2a\xd5\x86\xde\xf4\x1f\xaf\x33\x70\x2d\xb1\xea\x11\x40\x8d\x48\x04\x1f\x37\x8c\x18\x50\x01\x49\x2f\xb4\x15\xb9\x8a\xc3\x6a\x51\xc4\xe5\xf8\x3c\xa4\xbf\x7e\x95\x8d\xce\xef\x6e\x8b\x7c\x99\xcc\xe2\x71\x4a\xff\xfa\x33\x59\x94\xf1\x37\xef\x93\xb2\x4a\xb2\xeb\xf1\xc8\x24\x21\xfd\xcb\x6d\xa4\x6f\xe0\x26\x8a\x95\x4e\x6e\x16\x69\x95\x8c\x5f\x98\xab\x4b\xfd\x92\xcc\xe2\x28\x2d\xc7\x82\x2c\xc3\xa2\x1c\xbb\x24\xca\xb3\xb2\xc2\xe1\x03\xf0\x44\xf9\xcd\x6d\x1a\x03\x56\x6a\xf9\xd5\x95\x46\x04\x51\x60\xc4\xb7\x92\x3d\xbb\x24\x72\x07\x48\x34\x18\xe2\x2a\xbe\xb9\x4d\xc3\x6a\x48\xd5\x70\x68\x47\x21\xfd\xe9\xfa\x6c\x64\xca\xf8\x47\x61\x11\x87\x1a\x31\x09\x03\xfc\xfa\x75\xf1\xf3\x88\x13\x0d\x36\xce\x1a\x3c\xff\x76\x76\x3c\xd2\x11\x05\xf0\xb3\xbf\x14\xf1\x68\x80\x4f\x7b\x1a\xca\x4c\xd4\x20\x13\x0d\x3f\x8b\xdf\xfe\x73\x98\xcf\x30\xae\xe4\x62\x01\xf9\x9b\x95\x03\x32\xff\xcd\xf9\xeb\x48\x75\xa7\xc2\x7d\xa2\x3e\xea\x74\x8b\x54\xed\x26\x11\x50\x2c\xce\xa2\xf0\xb6\x5c\xa4\x21\x62\x06\x27\x92\x75\xfc\x3a\xae\x62\xec\xe6\xd8\x5c\xe9\x24\xa2\x80\xfc\x3f\x84\x45\x78\x13\x57\xb0\x4b\x5d\x83\xff\xb9\x9c\x29\x38\xaf\x56\xa4\x7e\xf8\xd1\x7c\xb3\xba\x5c\x91\x91\x49\x12\x7a\x9d\xe9\xa3\x73\x1c\xc1\x6f\xbf\xfd\x4a\x1f\xe9\x32\xf5\x9d\xa3\x8f\xb4\x59\x5c\x26\xd7\xd9\x18\x3e\xd2\x94\xe4\x51\xbf\x24\x11\xbd\x2d\xf2\x2a\x87\x54\xd2\xc5\x7a\x29\x58\xd2\x3f\x45\xa9\xd9\xa7\x2e\xb0\x33\xf5\x9e\x53\xea\xfa\xeb\x5b\x80\x3d\xe4\x29\x35\x72\x2e\x73\x5d\x0e\x2b\x6f\x76\xbc\xb0\x56\x7e\x92\xee\x6c\x23\x13\x5b\xfa\x56\xfc\xfa\xf3\xee\x03\x3b\xa0\x22\x9f\xb0\xe8\x1e\x0d\xfa\x84\xe5\xd6\x64\xec\x13\x16\x29\xf7\x4f\x5b\x0a\x4c\xfc\x53\x7d\x24\x49\xd1\x5d\x59\x85\x55\x12\x49\x71\xeb\x96\x1a\x42\xfa\xfa\xab\xdf\x86\x15\xe0\xd7\x75\xf9\x51\x50\x04\xbd\x3a\x1e\xc0\x35\x9c\xd1\x04\xa7\x32\x22\x9c\x94\x9f\x2d\xc8\x2c\x18\x8d\x16\xc1\xaf\xa3\x8e\x5c\xab\x23\xd4\x5a\xe9\xfa\xa3\x16\xe4\x85\xbe\x22\x0b\x95\xf3\x26\x9f\x05\x21\xcd\x8f\xbf\x52\xab\xee\x62\xa5\x37\xef\x92\xec\x9f\x41\x48\xa3\xbf\xbe\x1e\xdd\x41\xaa\xbe\x22\xb6\xc7\x98\xfb\xb0\x20\x50\x09\xfa\x6a\x81\xe0\x5f\x17\x1b\x84\x31\x93\x6c\x45\x4e\x5e\x6d\x78\xf1\x2a\xa9\x65\x85\x21\x4a\x05\x95\x80\x30\x0f\xb2\x91\xf0\x6c\x4f\xe8\xa4\x6c\x64\x85\x51\x90\x8d\xb8\xed\x33\x57\x27\xf3\x20\x1b\x79\x9e\x69\x72\x9d\xdc\x06\x5a\x94\x67\x55\x91\xa7\xe5\x37\x52\x42\x77\x15\x68\xcb\xce\x76\xe7\xf5\x87\x2c\xd2\xc8\x4d\xa0\xd5\xb5\x6b\xe4\x75\xa0\xe5\x88\x20\x1a\x79\x1b\x68\xc5\xfb\x77\xf1\x9b\x69\x98\x26\xb3\xb0\x82\xef\xdf\x05\x2a\x80\xa3\x46\x4e\x03\xed\x4d\x9e\xa7\x71\x98\x69\xe4\x7d\xa0\xd5\xab\x93\xb1\x94\xb9\x93\x3c\x53\x67\x1b\x1a\x39\xc3\x76\xcc\x70\xea\x86\x69\xa7\xb8\x6f\xb0\x39\xf2\xe9\x44\x65\xfe\x36\xd0\x6e\xf2\x59\x9c\x7e\x9b\x95\x55\x98\x45\xb1\x46\x7e\x0a\xb4\xdb\xb0\x8a\xe6\x1a\xf9\x7e\x8b\x3c\xb3\x3b\xee\x1d\x39\x1c\x50\xa1\x5a\x18\x57\xe7\x3e\x29\x62\x59\xf7\x3a\x33\x78\x95\x17\x23\xc9\xc8\x9f\x5f\x92\x2c\x88\xe9\x0d\xd4\x3a\x3a\xf8\xe5\xa2\xfc\xfc\x62\x74\x74\x51\x7e\x3e\x3a\xff\x45\xbf\xfc\x5c\x87\x67\x1d\x9e\x83\x2f\x47\xf4\x73\xfd\x40\x27\x45\x90\x9d\xf3\x4b\x5a\xde\xa6\x49\x35\xd2\x08\x86\x63\x33\x0f\x93\x2f\x0a\x9a\xc6\xd9\x75\x35\x3f\x4c\x5e\xbe\x94\xcc\x58\x18\x14\xe7\xc9\xe5\xc7\x8b\xbe\x0f\x82\xe0\xfe\x45\x10\xdc\xe3\xcf\xfd\x97\xc1\xfd\x97\xf7\x5f\x04\xf7\x5f\xdc\xcb\x1a\x0f\xe5\x6e\x24\x08\x8f\x2a\x14\x76\xfe\xb9\xee\x47\x76\xce\x2e\x61\xb2\x21\x10\xb4\x97\x21\x45\x06\x4e\x1f\x8f\x1e\x5b\x71\xa0\xba\xb4\xa9\x5c\xa8\x34\x80\x4a\xdb\x0a\x0a\x59\xc1\x78\xbd\xca\x66\x28\xcc\x20\xa8\xe1\x00\x1c\x66\x70\x17\x46\x51\x5c\x96\x75\xd1\xe3\x87\xda\x0f\x60\x45\x09\x43\xc3\xd6\xc7\xef\xe3\x68\xb1\x81\x9b\xaf\x48\x46\x0a\x92\x90\x50\xc2\x39\x0d\xc2\xa3\x8c\xce\x3e\x64\xe1\x4d\x12\x49\xdc\x1a\x67\xb4\x83\x86\xdf\xbc\x87\xb5\xa5\x4c\xf2\x8c\xe4\x90\x77\x9c\xd4\xe7\x40\xc5\xfe\xbe\x06\x33\x38\xbb\xd6\x82\xfa\x94\x30\xdd\xdf\x1f\xa5\x41\x4c\x07\x68\x34\x4a\x75\x9d\xbc\x28\xee\xef\x5f\xa4\xf7\xf7\xa3\x64\x7f\x3f\xa1\xc8\xe6\x15\x0b\x60\x57\x5e\x04\x81\x24\xb6\x47\x29\x8d\xc2\x34\x1d\x25\xa4\x20\x15\xc9\xf5\x71\x3a\x92\x37\xed\xf6\xf3\x3a\xae\x4e\xea\xc6\xfd\x10\x56\xf3\x87\x11\x54\xd3\x48\x16\xb0\xc3\xec\x8b\xb8\x46\xb0\xec\xe5\x4b\xbd\x7a\x19\xd4\xcf\x06\x0b\x82\xec\x28\x3e\xcf\x2e\x69\x55\x24\x37\x23\x7d\xac\x69\xd0\xb4\x28\xac\x46\x9d\x54\xa2\x51\x4d\xaf\xfb\xdd\x85\x71\x0d\x9b\x1f\xc2\xa2\x8c\xd7\x67\x0b\x92\x3a\x19\xac\x10\xe7\x5d\x02\x53\x26\x0c\x2a\x5a\xe5\xaf\x11\x72\x23\x9d\x00\xb8\xe2\xf7\x55\x11\x46\xd5\x71\x71\xbd\xb8\x89\xb3\xaa\x1c\x85\xb8\x15\x4e\x55\x2b\xbf\x34\x65\x29\x79\x70\x7e\x79\x18\x76\x4e\x33\xca\x83\x6b\xe0\x3b\x9b\x14\x40\x91\x1f\xe3\xeb\x6f\xde\xdf\x8e\x0e\xee\xee\x57\x07\x44\xbb\xd6\x74\xcc\x21\xa7\x5c\xf7\xbd\xec\xcd\xd6\xf9\xb3\xbf\x7f\xa0\xeb\xb5\xbc\x6a\xb4\x76\x1e\x48\xb2\xe0\xd5\xa8\x7b\xb0\x32\xba\xbf\xd0\x55\x6b\xd4\xf4\xbe\xbf\xd7\x74\xfd\xb0\x2a\x3e\xe0\x80\x64\xb4\x1c\xe9\x87\x2f\x46\x55\x90\xd1\x6c\xa4\xeb\x74\x96\x67\xf1\x61\x03\x1d\xb9\x21\x3e\xcc\xe9\xed\xa2\x9c\x8f\x0a\x7d\xb5\x8a\x70\x06\x26\xfa\x5d\x46\xe3\x51\xa2\xaf\xae\x92\x2c\x4c\xd3\x0f\x77\x19\xbd\x1a\xe9\xab\x95\x4e\xf2\x8d\xad\x4b\xd7\x53\x2b\x40\xf6\xe4\x6a\x34\x8a\x83\x58\x0d\xa8\x4e\xcb\x2a\x2c\xaa\xf2\xef\x49\x35\x1f\x55\x2f\x61\x78\xeb\xf9\x10\xd7\xed\x87\x21\x4f\xae\x46\x3c\x08\xea\x71\xb8\xbf\x6f\x46\x24\xe0\xfb\xfb\x99\x9e\xc8\xe6\x66\x47\xb0\x15\xba\xc5\x6d\x1f\x8a\x1a\x7a\x28\x3a\x4a\x75\x12\xaa\x91\xfd\x36\x9b\xc5\xef\xc7\x02\x68\x83\x39\xe6\xf0\xc3\xc6\x0c\x7e\x0c\x36\x0e\x57\xe3\xb6\x98\xf4\x9c\x35\xc8\xf7\xb8\x8f\xf5\xc3\x38\x2d\x63\x85\x27\xf8\xb9\xea\xc7\xb9\x06\x4b\x60\xb7\xe8\xb4\xc1\xfe\xa6\x0e\xb9\x98\xfd\x50\xe7\xc9\xcf\xcd\x4b\x12\x16\x45\xf8\x41\x56\x9a\xd7\xfd\x66\x47\x39\x14\x5d\x8f\xbb\x76\x09\xbb\x2e\x7d\xac\xce\x90\xd7\x5a\x5a\x37\x15\xdb\x1a\xae\x0e\x15\xc0\x4a\x1d\x0f\x09\x1b\xd2\x97\x74\xa6\x54\x7f\x26\x6c\x9a\xdf\x6a\xf1\xd1\x60\x4a\x69\x97\x30\x46\xda\x48\x0b\x82\x20\x3e\x37\xeb\xfe\xdc\xdf\xd7\x23\xdd\x1d\xe8\x76\xfd\xd6\x6b\x39\x51\xb3\x7a\x5d\x8c\x90\xc2\xbf\xd4\x01\x8d\xf5\xc3\x6c\x7f\x3f\x3b\x37\x2f\xe5\xb5\xb3\x60\x6d\xc4\xb9\x9a\x30\xc8\xce\x35\x35\x37\x40\x1a\x69\xbd\x59\xaa\xe9\xf8\x0c\xfd\x6f\x86\xac\x90\xad\x57\x15\x05\x5f\x6a\xfa\xb9\x79\x79\xa8\x4a\x2c\x1e\x5d\xe2\x03\x24\xea\x24\x4f\x17\x37\xd9\x3a\x40\x6b\xe9\x47\x50\x0f\x5e\xd9\x8c\xf5\xfe\xbe\x1c\x57\x58\x40\xeb\x97\xe7\xec\x72\x7f\xbf\xfb\x44\x0a\x20\x6a\x40\xd9\x14\x81\x5c\x5b\x14\xaa\xa3\x51\xd5\xeb\x59\x8b\x9b\x7b\xfb\xfb\x7b\x5b\x80\xda\xcc\xc3\xbd\xfb\xfb\x6d\x79\x92\x01\xc4\xeb\x2f\x10\x7a\xf2\x9c\x22\xd9\x4e\xc3\x36\x4d\xf5\x4a\x75\x5e\x2f\x64\xd1\xed\xb4\xa9\xda\x19\xd9\x9d\x6b\x59\x50\x0d\xe6\x5a\x12\x74\x3f\xaa\x3e\x3a\xd7\xb2\xc1\x5c\xcb\xda\xb9\x96\x6d\x9f\x6b\xab\x43\xd5\xc2\x04\x88\xa1\x3e\x2e\x70\x19\xe9\xaf\x47\xb8\xfe\x90\xf6\x24\xb2\xb7\xcc\x7f\x7c\xc9\xc2\x61\xed\xad\x55\xe1\xa6\xb5\x2a\x81\x35\x2c\xd9\xb8\x06\x5d\x14\x47\x78\xde\x7e\x7f\x78\x70\xad\x13\x18\x97\x76\xc5\x38\xd7\xfe\x7d\xa4\x5f\xdc\xad\x82\x8b\x8b\xa3\x8b\xc5\xd5\xd5\xd5\xec\xbf\xfe\xf4\x6f\x5f\x7c\x79\x4f\x0e\xc7\x2f\x8d\xcb\x97\xb0\x96\xec\x35\x8b\xc9\xc1\x1e\x4c\x4a\x85\xdd\x61\x0d\x20\xb1\xbf\x1f\x62\x86\x28\x1e\x85\x0d\x9c\xa5\x3c\x67\xcb\xda\x90\xa4\x55\x5c\x6c\x3a\x73\xa9\x5e\x04\x9d\xa5\x1f\x17\xfc\xfa\x29\xd3\xf7\xf7\xab\x1e\x1d\x19\x64\xd4\x57\x1b\xd0\xb3\x99\x57\xd5\x3a\x96\x65\xdb\xb1\xac\x1d\xee\x41\x25\x30\xf6\x5d\xc4\x4b\x82\x6c\x80\x78\x61\x07\xf1\xb2\xf3\xec\xa3\x88\x97\x0c\x10\x2f\x69\x11\x2f\x79\x04\xe2\x85\x3a\xd2\x70\xc0\x2f\x25\xdc\x25\x3f\x04\x77\xa8\x0e\x95\x44\x63\x4d\xdd\x68\xa4\x88\x7f\x5b\x24\x45\x3c\x03\xde\x57\xde\x69\xe4\x26\xc9\x4e\xb1\xae\xb1\xd6\xdc\x6a\xe4\x26\x7c\xdf\xa4\xd6\xb7\x98\x57\x86\xbd\xc7\xbc\xdf\xa9\x7d\xd5\x4d\xf8\xbe\x49\xad\x6f\x35\x72\x1b\x56\x55\x5c\x64\x63\x4d\xdd\x40\x4a\x59\xbe\xcb\x8b\x19\x24\xc9\x3b\x4d\x2a\x20\x16\xf1\x58\x53\x37\x58\xc7\xd7\x61\x15\x63\x0d\x5f\xa3\x10\xfc\x26\x7c\xaf\x52\xe4\x8d\x46\xc2\xf4\x76\x1e\x8e\x35\xfc\x51\x4f\xdf\xd5\x9d\xed\x3e\x69\x24\xbe\x09\x93\x74\xac\xe1\x8f\x46\xe6\xf1\x7b\x8c\xa9\x3e\xd6\xea\x3b\x8d\xa4\xf9\xbb\xb8\x38\x09\xcb\x78\xac\x35\xb7\x1a\x59\x14\xe9\x58\x5b\x14\xa9\x46\x16\xb7\xb7\xf5\xfb\xe6\x56\x23\x59\x5c\x56\x00\x47\xf9\xab\x11\x18\xed\x63\x18\xbf\xb1\xd6\xdc\xca\x54\xc9\x4f\xcb\xe4\xef\xd5\x3e\x15\xf6\xb8\x61\x92\x95\x63\xad\xbe\xd3\x48\x21\x85\xc0\x85\x14\xbd\x44\x8b\xb2\xca\x6f\xc6\x9a\xfc\xd5\xc8\x2c\xb9\x4e\xaa\xb1\x86\x3f\x1a\x89\x8a\x78\x96\x54\x27\x21\xc0\xb2\xbd\xd7\x48\x95\xdc\xc4\x63\x0d\xae\x1a\xf9\x67\x99\x67\x63\x0d\xae\x1a\xb9\x46\xc5\x8b\xe2\xa7\x79\x98\x8d\xb5\xce\x43\xef\xcd\x37\xbf\x2d\xc2\xf4\xa7\xbc\x97\x41\xa5\x69\x24\x8d\xcb\x52\x7e\x5e\xdf\xb5\x69\xcd\x87\x83\x04\x8d\x44\xf3\x3c\x89\x60\x70\xf1\x17\x7a\x71\x75\x15\x17\x71\x86\x3d\x51\xb7\x1a\x89\x97\x71\x36\xd6\xe0\xaa\x91\x7c\x36\x1b\x6b\xf9\x6c\xa6\x91\xab\x10\x36\x24\x63\x4d\xfe\x42\x6d\xe1\xed\x3f\xe2\xb0\x80\x6a\xe4\x1d\x8c\x7c\xfa\xfd\x15\x0c\x79\xfa\xfd\x95\x46\xf2\x2c\x86\x27\xfc\xd1\x48\xa6\x1e\x33\xf5\x7c\x13\x46\x80\x41\x91\x46\xc2\x32\x4a\x92\xb1\x86\x3f\x1a\x99\x85\x55\xf8\x73\x91\x8c\x35\x75\xa3\x91\xdb\xbc\x80\xf1\xca\x8b\x4a\x23\x69\x58\x9d\xe6\xd9\xf5\x58\x53\x37\x1a\x89\xdf\x57\x71\x56\xe2\x89\x40\x73\xab\x91\xab\x24\x8d\x5f\x27\xbf\xc7\x63\xad\xbe\xd3\x48\x9c\xcd\x90\x48\x8d\xb5\xfa\x4e\x23\x2d\xe9\x1a\x6b\xed\x3d\x60\x4a\x72\x13\xd7\xb3\xa8\xf3\x80\x2d\x48\xaa\xc5\x2c\xc6\x26\xe0\x1d\xe0\x6c\x76\x5d\x27\xd6\xb7\x72\x2e\xe5\xa5\x9a\x4b\x39\x60\x69\xb1\x48\x01\xa5\x50\xe9\x10\xda\x25\x5b\xa7\x91\xe4\x26\x04\x5c\xc3\x1f\x8d\x2c\xb2\xe4\xb7\x05\xa0\x37\xfe\x02\xe4\xaa\x6f\x6e\x6e\xab\x0f\x00\x3b\x79\xa7\x91\xe4\x76\xac\x25\xb7\x88\x97\x70\x8b\x3f\x80\x3d\xc9\x0c\xf0\x25\x99\x21\x1c\x63\x04\x22\xcc\xcf\x6c\x36\xd6\xc2\x6c\xa6\x11\x18\x41\x18\xbd\x2c\xaf\xb0\x38\x9c\xdf\x3f\x21\x9a\xaa\x1b\x9c\xdf\x2a\x45\xde\xb4\x74\xea\xa7\x02\xda\xd5\x7d\x82\xdc\xe5\x5b\xc8\x5a\xbe\xd5\x48\xf2\x06\x30\x12\xae\x30\x4f\xa1\xee\xef\x33\x98\xa6\xf2\x4e\x5b\x91\xef\x02\x9c\x77\x71\x01\x7d\xf8\xb1\x16\x14\xfd\xd0\x24\xfd\x39\xd0\x90\xea\xb6\x29\x5f\x07\x35\xd3\x44\xfe\x19\x68\x37\x71\x59\x22\x8c\xfe\x12\x64\xf1\xbb\xd1\x47\x65\x39\xea\x4c\x5a\x09\x82\x4a\x58\xb7\x31\x45\xc9\x87\xa2\x02\x95\x7c\x4e\xf2\x45\x56\x05\xe6\x06\x05\xac\xeb\x78\x5d\x29\x29\xee\x6b\x41\x35\x85\x3f\xb4\x82\x36\xb9\x80\x17\x5f\x01\x0b\xd6\xdd\xb6\xb7\x82\xaa\xf5\x43\x67\x92\x11\x75\x3a\x9c\x04\x52\x62\x93\x1d\xc5\x5d\x11\xc1\x38\x86\x6d\xf3\xc3\x2d\xe9\xe8\xfc\x75\x5b\x92\x60\x4b\x1a\xde\xe1\xfe\x7e\xa4\x4a\x0a\x67\xb3\xba\x4d\x27\x92\x20\xc6\xc5\x28\xd1\x75\x12\x36\xcd\x0e\x67\x33\x18\xa4\xb2\x16\xba\x6d\x3a\x2e\x6f\xcf\x9b\x49\xf1\xb1\x26\x6e\x06\x96\x84\x15\xb0\x06\x35\x10\x48\x18\xbc\x1a\x55\xed\xe6\x39\x54\x9b\xe7\x24\x08\xd7\x36\xcf\x29\xc9\x83\x44\x6e\x9f\x49\x19\xbc\x1a\xe5\xb4\x66\x02\x4a\x59\x80\xd4\x71\x1c\x68\xdd\x54\x41\xaa\xbe\x49\x82\x82\x2a\x74\x4d\x3e\x02\x55\x54\x65\x0c\xaa\xfd\xfd\xb8\xfe\xe2\xc3\x4f\x1f\x6e\xe3\x17\x41\xf0\xe3\x86\xb4\x3f\xab\x6e\x1d\x65\x54\xc1\x51\xe9\x9c\xc7\xe4\x3c\xb9\x24\xb9\x3e\xd6\xc6\x61\x9a\x8e\x61\xeb\x56\xed\xef\xaf\xe7\x7a\x74\xbb\x1e\xd7\x18\x92\xeb\xab\x43\x80\x66\xa9\xa0\x99\x06\x65\x17\x9a\xd1\x48\x57\x42\x87\x85\x7e\x57\xd2\x78\xb4\x68\x85\x0e\xa5\x14\x3a\xb4\xef\xc3\xfe\xfb\x50\xbe\xc7\xf3\x7d\xc9\x26\xc9\x4e\x6d\x47\xb4\x8e\x3e\x46\xaf\xdf\x9b\xa7\x87\x62\xc9\x49\xd2\xc7\x8b\x44\xf5\xa4\x08\x92\x35\xbc\x08\x83\x42\x8d\x70\x1a\xbc\x60\x80\x5d\x19\x8d\xdf\x47\xe9\x62\x16\xd7\x1c\x60\x89\xd2\xba\x66\x8f\xb7\xfe\xfe\x21\xa8\x07\x80\x8b\xe1\x8d\x44\x5e\x9d\xbc\x48\xa5\xf6\x07\x6d\x05\xdb\xb2\x43\x7a\x2d\x8e\xcb\xf7\x92\x6c\x6f\xc3\x7b\x35\x67\x92\x6a\x74\xd7\x9b\xf1\x2b\x62\x12\x59\x05\xc9\xc9\x0b\x00\xe8\xfa\xc7\xe7\xf9\xe5\x91\x6c\xff\x78\xe3\x4b\xf2\x82\xe9\x87\x19\x8d\x3b\x1a\x4f\xe1\x6c\xf6\x75\x1c\xe5\x45\x2b\x4c\xdf\x5e\xaf\xfa\x92\x68\xf8\xa3\xe9\x24\xab\x55\x1a\x9e\x54\x98\xfa\x96\x68\xb5\x5e\x04\x96\x18\x4b\x25\xcc\x93\x34\x2c\xcb\xa7\xb5\xb1\x53\x00\xd1\xba\x4f\x58\x7e\x72\x9d\xe5\x85\x3c\xc5\x96\xb7\x41\x9d\xd6\x62\x74\x09\x7b\xe9\x78\x54\xb6\x18\x9d\x28\x8c\x6f\x71\xf4\x75\x98\x25\x55\xf2\xfb\x86\x3d\xa3\xa2\xe0\x24\xa9\x31\x0f\x3b\xd1\xa1\xf9\x0d\x8d\x3f\x0c\xb1\x1d\x65\x5d\x54\x79\x9e\x5d\x02\x45\xee\xa7\x04\xe7\x97\xb0\x85\xeb\xa5\xa9\x8d\x12\x6a\x52\x14\xca\xb6\x62\x9c\xac\xf4\xde\x34\x1a\x00\xed\xe3\x0d\xdd\xb6\xd8\xa4\x4f\x5c\x6c\x42\x49\xf3\xd2\xfb\xfb\x51\xfa\xc0\x2a\x13\xea\x3a\x49\x69\x96\x67\xd3\x06\x65\x9b\xa6\x97\xe7\xc9\xe5\x66\x01\x3c\x82\xa6\xd8\x22\x9c\xff\x9e\xae\x89\x7a\x46\xdb\xf2\xbe\x30\xb7\x88\x53\xae\x46\x06\x7b\x11\x04\x31\xed\x09\xf2\x5a\x71\x49\x7f\x03\x79\xd4\xd9\xa2\x0e\x5e\xf5\xf6\xcf\x71\xb3\x22\x11\xcd\x28\xde\xbf\x33\xba\xaf\xfa\x35\x75\xc5\xef\x8f\xff\xea\xf0\x61\x58\xf6\xf5\x24\xce\x2b\xc0\xb8\x1d\xbf\x00\x8c\x94\xc7\x94\xc1\x8e\x5f\x1e\x1a\x2c\x08\x82\xa2\x31\x6d\xa9\xf4\xfd\x7d\xb5\x81\xce\x94\x42\xd8\xc7\x30\xa1\x2a\xf2\x14\x00\x2b\xe7\xca\x0e\xb9\x83\xbb\xd5\xc7\xf1\xac\x93\xff\xbc\x85\x79\xbb\xf9\x3f\xc4\xcd\xff\x65\xf0\xc2\xec\x28\xf5\x26\x9b\x14\xd9\x9b\xd9\x45\x42\xa5\x32\x16\xce\x66\xc7\x59\x96\x57\xa1\x3c\xb3\xda\x32\xd9\xee\xea\xb5\x5a\x8a\x21\x2a\x52\x3f\x4b\x49\x06\x09\x9b\x22\x60\x31\xef\xcc\x7e\x92\x94\xc7\xe5\x87\x2c\x1a\x87\x24\x29\x9b\xf3\xd2\x0e\x2f\xfe\x22\x08\x8a\x41\xab\x6b\xa6\xbb\xde\x15\x6f\xa7\x10\x7f\xa9\x19\x12\xb4\xa6\x2a\xba\x8d\x26\x92\x0e\xc5\xa4\xcb\x65\x8c\x2b\x12\x67\x55\x52\x7d\x18\x67\xb8\xbf\xfb\xa1\xdb\x8b\xe4\x28\x41\x72\x5d\x4b\xca\x65\xce\x1f\xa4\x02\x55\x81\xaf\x07\x49\x2a\xe3\x2c\xbe\x0a\x17\xa9\xd4\x25\xc4\x6c\xbd\x04\x95\x49\x4e\x3e\x75\x7c\x87\xc7\x6b\xe1\xa2\xca\xf1\xf0\x2d\x3e\xba\x6b\xef\xc7\xdd\x17\xab\x5a\xa0\xd3\x23\xa1\x6b\xc4\x6a\xbb\x04\xfe\xae\x26\x7c\x1d\x40\xb4\xc3\x5d\x8e\xcf\x2f\x49\xcb\xc0\xc1\xd3\x16\x44\x1c\xdf\xd5\xeb\xe1\xf8\x6e\x33\xe1\x1b\xdf\xad\xd6\xd4\x9d\x20\xa9\xc5\xde\xf1\xdd\x6a\x45\x70\x95\x7e\x6e\x19\x9d\xe5\xf3\x79\x45\xad\x48\xbb\x80\xc1\xf3\xe1\xe6\x0d\x15\x92\x82\xaa\x7b\x74\xdb\x41\xbb\x87\xb6\x1c\x6b\xf2\x7a\xbe\x51\x5e\xcf\x7b\xf2\x7a\x7e\xf9\xd4\x5d\x4a\xbd\x4d\x29\x8e\xea\xa9\xfd\x43\x33\x6d\xaf\x72\x3c\xa8\x7d\x91\xe9\xe3\x51\xf1\xc0\xba\x57\xef\x55\x37\x7c\xac\xaf\xf1\xc3\xf5\xdb\x3f\x10\x06\xd7\x71\x43\x0f\xb0\xd4\xc3\xe2\x28\x53\x2c\x98\xa4\x21\xed\xf4\x27\x95\x3e\x8e\xbb\x1b\x92\x7a\xdc\x80\xaf\xa4\x6a\xcb\xfe\x5d\xfc\x7e\x01\x4c\x75\xd1\x4b\x08\xfa\xef\x7b\x1d\x6d\xe7\xcb\x03\xca\xd8\x5d\x3a\xd4\x21\x97\x48\x74\xbe\x93\xca\xa5\x15\xed\x12\xcd\x15\x2c\xf1\x87\x1d\x4d\xe8\xa7\x0e\x36\x70\xf4\xf7\xf7\xa3\xec\xc1\x31\x05\x26\x73\xc3\xfc\x6f\x31\x9b\x4a\x82\x0d\x80\x52\x76\xbc\x1b\xe7\x55\x7d\xee\xb0\x89\x95\xf9\xc8\x97\x87\x75\xfb\xa4\xc6\x4e\x4b\x65\x46\x19\xe9\x83\x86\x14\xfa\x2a\xb9\x1a\x6d\x68\x53\xef\x74\xa4\x96\x46\x7c\x4f\x37\x1c\x9a\x8c\x36\x7f\x33\xa8\x69\x97\x46\x25\xfa\xaa\xd6\xa9\x3e\x69\x3b\x58\x77\x3e\xeb\x5a\x2c\x6c\xcc\xf2\x31\xd1\xc4\x61\xdc\x76\x14\xd5\x97\xfb\x6b\x6a\x10\xfc\x40\xc3\x6c\x76\x7f\xbf\xe9\x05\x5a\x53\x6c\x48\xcf\xf2\xea\x48\x59\x1e\xbf\x8d\x3f\x74\x86\xa8\xdd\x87\x6d\x60\x33\x0b\xfd\xae\x51\x88\x6a\x8c\xcb\x37\x7c\x7a\x5e\x5c\xee\xef\x67\x00\x90\xd3\xfc\x3a\x89\xa0\xa7\x4d\xa7\x47\x31\x29\xc8\xe6\x6f\xe8\x55\x12\xa7\x33\x84\xe9\x60\x34\x56\xfa\xb8\x06\xf1\xc6\x12\x87\x5d\x6c\x2b\xd8\x5a\x64\x6f\x50\xd6\x0b\xdd\x2e\xe9\x42\xd3\x45\x80\xa1\x3a\x80\xb8\xbf\xc7\xa7\x8e\x0c\x7c\x3d\x45\xc9\xb7\xd5\x8b\x5a\xea\x3d\x78\xec\x67\x6a\xc4\xdd\xea\x59\x4a\xb5\xd5\x83\x92\x84\xd6\x4f\x52\x0a\xaa\x9e\x5a\xf1\xfe\xfe\x3e\xcc\xff\xfa\x83\xaf\xc3\xaa\xf3\x01\x3c\xe9\xfb\xfb\x78\x3c\xb6\x8e\xbc\xc8\xa0\x00\xd9\x1a\xc5\xd8\xe9\x2d\x08\xdc\x64\xdb\x26\xf8\x80\xc9\xda\xaa\x89\xe0\x71\xd7\x51\xf7\x48\x6d\xac\x69\x87\xb5\xde\xd4\x17\xfc\x68\x14\xd3\x75\x25\xba\x24\x47\x57\x05\xe5\xfd\xfd\x83\xaf\x91\x5f\x7e\x28\x83\xdc\x3b\x7c\x24\x07\xee\x5e\x81\xeb\xff\x48\xbe\x66\x4b\x00\x00\xfc\x58\x5e\xb5\x61\x50\x38\xbc\x89\xa6\x00\x94\xcf\xef\xfa\x1a\x18\x6c\x78\xe4\x57\x9c\x9b\x92\x29\x53\x4f\xec\x92\x14\x31\xe2\x48\x14\xb7\x07\xd2\xab\xcb\xfe\xce\x7f\x58\xd7\xb6\xa1\x02\xb4\x7e\x2e\xf8\xb3\x75\x92\x91\xe9\x77\x59\xb3\x31\xd9\xdf\x7f\x91\x0d\xf7\xa1\x0f\x8f\x48\xfb\xed\x47\x07\xaf\x93\xf5\x71\xa3\xd8\xf9\xa0\xb7\xc3\x7b\xf4\x47\x6a\x8d\xd4\xc7\xdd\x1e\x0e\x3b\x38\x04\xeb\xf7\xcd\xdb\x35\x90\x76\x5e\x61\x0f\x32\xba\x36\xbe\x41\x45\xb6\x7d\xd2\xa0\x59\x57\xae\x12\xa5\x71\x58\x6c\x97\xde\xf7\xac\xba\x9e\xc1\x67\xf4\xd6\xab\x4e\x41\x2d\x58\x0f\x07\x6f\xd4\xc9\x7f\x46\x58\x07\x5d\x3b\x2c\xdd\xe6\x45\x71\x28\x35\x7e\xa4\xd0\xbb\x95\x75\x36\x55\xf5\x59\xc4\xcd\xb5\xc5\x74\xb8\x15\x0c\xaa\xb5\x24\x12\xf7\x76\x75\x41\xd5\x7b\x6c\x8e\xd7\x75\xf2\x7b\x70\x27\x4f\xa1\x0f\x7e\x39\x0f\x8d\xdf\x8f\x8d\xb3\xcb\x97\x9f\x1d\xc8\xb3\xe8\x6f\xde\x27\x55\x39\x3e\xa8\xd3\x55\xea\xdf\x93\x6a\xfe\xfa\x36\x8c\xe2\xf6\x93\x8b\x12\x3f\xba\x09\xa3\x6f\x67\xe3\x83\x5f\x46\xe7\xa6\xe1\x87\xc6\xd5\xb1\xf1\xe7\xcb\xce\xed\x58\xbf\xb3\x57\x5b\xde\xe9\x9f\x1d\x90\x3c\x4b\x3f\x7c\x8d\xe7\xc3\x07\xbf\xc0\x2b\x2c\x33\x29\x31\xa9\x6e\x0a\x24\x1f\x74\xce\xba\xb1\x71\x97\x07\x9d\xd3\xed\x83\x73\xd9\xd6\xf2\x36\x8e\x92\x30\x3d\x99\x87\x45\x18\x55\x71\x31\x3e\x38\xff\xaf\xff\x7e\xf1\x1f\xff\xf6\xd9\xbf\xff\xb2\xff\xf9\x48\xff\xf5\xfe\xe5\x85\x11\x1c\x1d\x8e\xff\xa4\x11\xfa\xc5\x97\x17\x77\x17\xab\x8b\xf3\x8b\xcb\x8b\x8b\x8b\x83\xcb\x83\xeb\x84\x84\xb3\x25\xa0\xc4\xec\x1b\x3c\x78\x6f\x7a\x6a\x1a\x3e\x7d\xf1\x6f\x9f\xfd\xfb\xfe\x9f\x3e\x7f\x79\x10\x1c\xfd\xf2\xeb\x7f\xdd\xdd\xaf\xfe\xdb\xb8\x7c\xf9\x1f\x6d\x86\xcb\xd1\xd1\xb8\x7d\x32\x2e\xef\x4c\xe2\xb0\x55\xe7\xbd\x7e\x34\x3a\x1a\x5f\xd0\x9d\xbe\xd0\x3f\xff\xec\x80\xbc\x09\xcb\x24\xaa\x5b\x34\x1a\x9d\xff\xf2\xc5\x97\x23\x5d\x36\x9b\x12\x32\xbe\x28\xff\x43\xbb\x7c\x39\xba\xa0\xfd\x17\x87\xea\x85\xfe\xb9\x7e\x3f\xd2\xe8\x4b\x4d\xd7\xff\x63\x34\xba\x38\x47\x60\xde\x31\x22\x56\x17\xf4\xe3\xf7\x97\xfa\xfd\x68\x54\x8f\xb7\x81\xc3\x73\x41\xf5\x97\x35\x72\xdc\x71\xb2\xd2\xf5\x1a\x73\x6a\x2d\x06\x39\x90\x43\xbc\x52\x6f\x7b\x88\xd4\x64\x53\xb8\xd4\xa8\x38\x1c\xfc\xf2\x6f\x47\x88\x34\x80\x26\x77\x62\x75\xdf\xdc\x3b\x2b\xfd\xb3\x83\x84\x48\x95\xff\xc9\xa3\xf3\x5f\xa5\x79\x08\x28\x06\x30\x37\x5e\x5e\xc2\x58\x48\x6c\xd3\xeb\x71\x81\xa7\xcf\xf1\xe1\x3c\xfe\xe6\xf2\xfc\xe2\xe5\x85\xd1\xcf\xf6\xd9\x01\x99\xc5\x51\x72\x13\x22\x66\x60\x21\xf2\xdd\xbd\xfa\xfa\xe5\xfd\xb9\x82\x90\xfa\x46\xf6\x28\xfc\xba\xfd\x4a\xb5\xea\x25\x34\x09\xcf\x9c\xb1\x45\xa3\xa3\xb1\x60\xa3\x8b\x83\x7b\xe3\xfe\x82\xea\xa3\xa3\xb1\x79\x74\xce\x84\xed\x7a\x97\xf7\xec\xdc\xe4\x97\xba\x7e\xc1\xee\x65\x3e\xee\xdf\x0b\x53\x1f\xe6\x25\xc2\xf0\x31\xaf\xc1\x2f\xf5\x0b\xae\xeb\x32\x33\x3b\x77\x20\xfd\x9c\x1b\xfe\xe5\xc5\x4c\x3f\xba\x98\xdd\xf1\x95\xfe\xd9\xfd\x2f\x58\x50\x53\x88\x79\xc4\x2f\x84\xfc\x62\xc3\x47\x50\xc5\xb9\xe5\x41\x8a\xe5\x78\x97\xe7\x26\xde\x43\xf3\xfc\xcb\x73\xee\x00\x86\xc8\xef\x9c\x7e\x8e\x36\x83\x69\xea\xba\xae\xaa\x85\xd6\x62\x5b\x2f\x66\xf7\xfc\xdc\x34\xbc\xcb\x5e\x67\xda\x1c\x58\xac\xea\x91\x7e\x61\x3d\xd8\xa1\x03\xa9\x3b\x82\x34\x88\x5d\x1e\x21\xf4\xb1\x74\x71\xa9\xc3\xf8\xd9\x48\x74\x2e\x55\x3e\xc4\xc0\x18\x16\xae\xf2\xa3\x9f\xf4\xbf\x5e\x14\x38\x05\xe7\x55\x75\x5b\x1e\x8d\x2f\x0e\x2e\x0e\x46\x47\xe3\x77\xef\xde\x5d\xd0\xfb\xd1\xd1\x8b\x77\xef\xde\x41\xa3\x5f\x48\x8c\xd6\xf5\xce\x4c\xee\x4e\xf3\xcf\x3b\xe9\x30\x69\x2f\x4a\x9c\x46\xf7\x58\xce\x8e\xdf\xec\xde\x92\x87\x6a\xec\xbc\x03\x98\xa6\x79\x14\xa6\xf3\xbc\xac\x7e\x5e\xeb\x76\xf3\xea\x62\x3c\xc2\xd1\x92\x14\xc3\x24\x30\xf3\x58\x0d\xb1\x3b\x6b\x75\xef\x9c\x9b\x86\xa5\x1e\xc5\xea\xde\xb1\x3b\xcf\x1c\x9e\x6d\x1c\x62\x09\x7f\xc7\xb6\x05\x02\x5c\xbf\xef\xd4\xf0\x47\x55\xb1\xb9\x3f\x7f\x50\x6d\x00\xd0\x24\xab\xe2\x22\xcc\xe2\x0d\x00\xdd\x32\xee\x2f\xbb\xab\x01\x10\x52\x54\xfe\x39\xf8\xe5\xfc\xe2\xbd\x69\x1a\x17\xef\x5d\x24\x25\x8d\x16\xd0\xc1\x2f\x70\x37\x46\x82\x7d\xf9\x52\x96\x0a\xe5\xbc\xa4\x97\x2f\x47\x87\xf5\x13\x2e\x65\x9f\xbf\xa4\x77\xab\xfb\xff\xfe\xaf\xcb\x97\xc1\x96\x74\x1d\x88\xe1\xe1\x9b\xb0\x8c\x1d\x4b\x3f\x22\x23\x95\xed\xc5\x67\xfb\x7f\x22\x23\xfd\xf3\x97\x87\xc1\x85\x41\x7f\xfd\xef\xf1\x7f\x5c\x1c\x1c\xfd\xfb\x45\x79\xf9\xf9\x11\x12\xda\x14\xc9\xec\xc5\xe8\xe8\xfc\x25\xd0\x4f\xdf\x1c\x5d\x50\xf3\xa5\x7e\x04\x60\xf4\x2e\x8f\x2e\x66\xa3\x0b\x7a\x31\x7b\xa9\x1f\x49\x14\xcb\xae\x21\x77\xa9\x72\x33\xaf\xc9\x0e\x53\xdf\xbd\x6c\xb3\xdf\x5f\xcc\xee\x18\xe1\xab\xe6\xf3\x0b\xa4\xc8\xc9\xed\xd4\x02\x58\xe2\x5b\xb1\xd2\x2f\xe8\x47\x6e\xe5\x37\x0e\x2e\xa5\xb8\xfe\x02\x27\x72\x31\x83\xe5\xce\x5a\x8d\xf5\x3b\x77\xb5\x9e\x7c\x3f\x46\x6a\xb4\x9e\xd9\x59\x29\xaa\x6c\xe3\x28\x23\x01\xb1\x2e\x2f\x66\x40\xde\x2e\x66\xf7\x88\x49\x17\xb3\xfb\x8b\x99\x8e\x6b\xcc\xa3\x72\xea\x80\x56\x8f\x6e\x81\x0d\x2d\xf8\x43\x9a\x30\x1a\xd6\xa6\x23\xfc\xb7\xb6\xc4\x42\x58\xac\x7f\x64\x12\xb6\xfa\xd7\x35\x50\x6c\x6f\xa0\xd8\xda\x40\xfe\x2f\x6c\xe0\x03\x63\xc9\xb7\x36\x50\xfc\x0b\x1b\x68\x6f\x6f\x20\xdb\xda\x40\xeb\x5f\xd8\x40\xa7\x6e\xe0\x18\x66\xf0\xa6\xd6\xd8\x7f\x50\x6b\x36\xd5\xc6\x88\x0b\xed\xd1\xf5\xd1\xbf\x77\xb8\xde\x3b\x46\x56\x48\x9f\xa2\x64\x56\x48\x0a\x25\x70\x5d\xb8\x3f\x67\x5c\xb1\x1b\x7a\xfd\x1a\x89\x11\x93\xdc\x10\xd0\x3d\xa6\x56\x0f\xac\xbf\x93\x17\xb5\x17\x6b\x26\xf2\xec\xf2\xce\x5f\x7d\x76\x20\xb5\x18\x0f\x7e\x39\xff\xcb\x8f\xdf\x7e\x3d\xbe\xfc\x7c\xd4\xbc\xe5\x2b\xfd\xdc\x00\xba\xdc\x26\xd9\xeb\x49\xcc\xdc\x90\x06\x54\xf2\x7a\x45\xbe\x0a\xa4\x3e\xf2\x9b\xb8\xd2\xc8\xcf\x41\x47\xdd\xf7\xb7\xa0\xab\x6e\xfc\xf7\xa0\xab\x5c\xfc\x8f\x40\x1b\xee\xc2\x34\xf2\x59\xd0\xd5\xcf\xfe\x6b\xd0\xd5\xcb\xfe\xdb\xd3\xad\x4c\x93\x12\xb7\x88\x0f\x6e\xd0\x95\x1f\x19\x65\x9f\xd3\x11\x80\xab\xa3\xde\x07\x3f\xae\x68\x15\x97\x3d\xa7\x37\x49\xf9\x5d\x5e\x7d\x95\x86\xd9\xba\x1f\xaa\x46\x84\xf1\x44\x0b\x98\xe6\x60\xef\xc8\x0c\x82\x20\xbe\xbf\x57\x4d\xdf\xdf\xd7\xb4\x17\x41\xa0\xac\x27\x62\xbd\x36\x31\xdc\x98\x2b\x1e\xf6\xef\x87\x46\x5d\x7d\xab\x85\x06\x49\x82\x17\x8c\x84\x81\x56\x56\x61\xb5\x28\x35\x92\x06\xaf\x46\x4a\x24\x7f\x1d\x57\x1d\x07\xad\xa8\xcd\x35\xaa\x3a\xf6\x78\x69\xa3\x3a\x96\xae\xa9\x8e\xe5\xb5\xea\xd8\x61\xf9\x2e\x01\xe8\xe7\xfa\x5d\x14\x96\xf1\xde\x57\xe3\x24\x88\xa9\x1a\xbd\x51\x46\x7e\xa7\xad\xe8\x41\x27\x61\xf0\xd5\xe1\x9b\x22\x0e\xdf\x1e\x42\x66\xa5\x36\xae\xbe\xc0\x2e\xe1\x17\x5d\x19\x01\x7c\xa3\xf2\x75\xbe\xdc\xfb\x79\x9c\x04\x06\x7b\x11\x64\xad\xf0\xe7\xfc\xe7\x4b\xc8\xfc\x73\x37\xdb\x6f\x6b\x65\x37\xc8\x0d\x79\x7f\xeb\xe6\xfd\xfb\x5a\xde\x06\xf5\x21\xef\xdf\xbb\x79\xff\xb1\xd6\xcb\xe1\xc4\x80\x4f\xfe\xd1\xfd\xe4\xb3\x71\xd2\x18\x75\x7c\x19\x54\xe7\xf9\x25\x09\x83\xcf\xba\x39\xfe\xda\xc9\xf1\x45\x9d\xe3\xaf\xab\xe4\x6a\xf4\x22\xd1\x31\x5f\x47\x17\x2b\xed\xeb\x62\xa5\xa8\x8b\xa5\x1c\xce\xaa\x3e\x8c\x13\xf2\x36\x96\xba\x05\xe1\xaa\x83\x3b\x67\x71\xb1\xe1\xc4\xb4\x99\x18\x66\x17\xd3\xa2\xfc\xe6\x26\xfc\x31\xbe\x8e\xdf\x6f\xf0\x17\xd6\xda\xff\xd7\xe6\x3c\x1a\xd1\xd0\xa0\xb4\xb5\xf7\xf8\x3f\xc1\x68\x14\x3e\x9d\x0c\x94\x1b\x14\x8f\x2b\xfd\xae\x42\x79\xe7\x3f\xcb\x3c\x0b\xaa\x9e\xe5\xef\x56\xdb\x35\xf4\x1b\x85\x5f\xf4\x14\x25\x3b\xa7\x04\x3b\xea\x4c\x42\x81\x2f\x46\x59\x90\x1d\x65\xe7\xe1\xe5\x58\x96\x7d\x1e\x5e\xea\xfd\xa1\x4a\xa5\xda\x5c\xba\xa6\x36\x57\x03\xaf\x95\xdd\xd1\x84\x79\x59\x70\xb7\x22\x21\x95\xae\x01\xe4\x3d\xf6\x12\xef\xc2\x45\x95\xd7\x52\xd6\x1f\x16\xe5\x1c\xa7\xb6\xde\x3a\x35\xfd\xcf\x76\x14\xb5\x73\x29\x1f\xde\x53\xfe\x45\xb4\xa0\xb6\xa0\x6e\x3d\x49\x34\x66\x5b\xd2\xa4\x3a\xd6\x57\xed\xd8\xc4\x1d\x1d\x8e\x15\x74\x75\x1d\x51\x5e\x8c\xd6\xcc\xf8\xe2\xfb\xfb\xda\xab\x41\x2f\xad\x3e\xcd\xeb\x26\xc6\x7b\xb5\x98\x36\xbf\xda\xc3\x73\xa2\xd5\x28\xd6\x5b\xd3\xec\x6c\x2f\xc9\xf6\xd0\x47\x98\x76\x95\x17\x37\x7f\x29\xf2\xc5\xad\xf6\x22\xc8\x20\x05\xcd\x58\x68\x52\xe2\x2f\x5a\x61\xeb\xfa\x5d\x25\xd5\x02\x0f\xdb\xd1\xc5\x17\x3b\x8e\xea\x7f\x8e\x42\xfd\xa8\x6a\xb4\x09\xe3\x78\x14\xea\xfa\xb8\x4d\x08\xf5\x8f\x8e\xac\x74\xe1\x05\xad\xa9\x1d\x40\x34\xa7\x98\x31\x2a\x68\xc1\xb5\xd3\x79\x39\x77\xd0\xc4\x7c\x0c\x80\xc7\x56\x37\x66\x9a\xb5\x94\xb9\x1d\x9c\x2a\x96\x0b\x59\x0f\x52\xd5\x3a\x5c\x2a\x09\x17\x59\x27\x16\xdb\xea\xa8\x49\xec\x7f\x02\x7c\xe2\x01\x68\x1e\x07\x8d\x78\x67\x68\x40\xdb\xc6\x95\x84\x06\xa9\xba\x20\xe9\x40\x22\x8b\xbb\xa7\xd8\x2f\xd8\x61\x0d\x92\x42\x82\xe4\x6e\x03\xae\x14\x97\x7a\xa3\x6f\x2c\x5d\x4b\x40\x5a\xd7\xbb\x44\x16\x40\xb9\xe7\xc5\xe5\x79\x02\x55\xe3\xaf\xb4\xaa\xdb\xcb\x36\x75\xa2\xc0\x4e\x14\x1b\x87\xb4\xb8\x7c\x11\x40\x11\x63\x55\x24\x96\x87\x36\x7e\x99\xa2\x13\x0d\x1d\xc0\x76\xc7\x43\x2d\xfc\xf8\xe9\xb4\xb3\xca\xff\x5a\x6e\x38\x89\xeb\x99\x52\xc8\x93\x7f\x5a\xc6\xd5\x2b\xa9\x7f\x32\xea\x38\x4a\x39\xca\x6a\xad\x94\x31\x94\x7b\xf8\x22\xdd\xdf\xcf\xf6\xf7\x9b\xd4\xff\x13\x7f\xd8\xdf\x1f\x85\x41\x37\x41\x7e\x9e\x07\xff\x3f\xf6\xde\x85\xbf\x6d\x1b\x59\x1c\xfd\x2a\x11\x6f\x57\x4b\xfc\x0d\xab\x52\x5e\xdd\x52\x41\x75\x1d\xe7\x51\x37\x71\xe2\xc6\x49\xba\xad\xcc\xed\x65\x24\xd8\x66\x4b\x83\x2a\x09\x25\x76\x2c\x7d\xf7\xfb\xc3\xe0\x4d\x82\xb2\xf2\xd8\xdd\xf3\x3b\xf7\x9e\xb3\x8d\x45\x60\x30\x78\x0f\x06\x83\x79\x14\xab\x55\xfc\xac\xdf\x7f\x06\xe4\x4b\xff\x75\x1e\xe2\x55\x75\xdd\x39\xd3\x6c\xb5\xe2\xe9\x64\x73\x76\x12\x45\x68\x5c\x05\x34\x55\xe1\x61\xa5\x49\x61\xc4\xa1\x41\x72\xc1\xf7\x88\x2f\xc3\x74\x21\x5c\x92\xd2\x6a\x33\x5e\x5f\x1b\x05\x53\x8e\xa3\xf5\x3a\x42\xe0\x04\x07\xbb\x3d\x57\x5a\x3c\xae\x6e\x83\x9f\x17\xd6\x9e\xed\xaa\x87\xaa\x7a\x7c\x1c\x53\x9a\x22\xe5\xb7\xa6\x16\x54\x58\x4d\x33\x3c\x20\x5f\xeb\x89\x29\x71\x45\x4f\xe1\x11\xa8\x4e\xaa\xb5\x6c\x64\x5e\xef\xcd\xe7\x87\xee\x1c\xd5\xce\x0c\x91\x0c\xe1\xda\x7a\x04\x5d\x16\x6d\x2d\x04\x8f\xc3\xf6\xde\xcd\x14\xc7\x79\xa8\xed\x8f\x3a\xfc\xb5\x5a\x4b\x4a\xdd\xea\x2f\x5b\x0b\x74\xc3\x42\xa0\x62\x15\xb8\xaa\x03\xdd\x8d\x7b\x06\x47\xac\xa8\x47\xfc\x0d\xb5\x80\x0e\x8a\x8c\x9d\x2d\xb3\x33\xda\x23\x44\x81\xe9\x94\x7e\x3f\x96\x8d\x10\x4b\x5b\x1f\xcb\x08\x77\x35\x8c\x74\xd5\x12\x23\x6c\xab\x69\x56\xe2\x71\x33\x76\x99\x76\xdf\x48\xda\x03\xfb\x2e\xab\xe9\xbe\xd2\xe3\x69\x25\x0d\x6a\xba\x90\x41\x03\x26\x1b\xf2\x92\xe8\xdb\x08\xb3\x4f\xc6\x3d\xcf\x38\x7d\x52\x56\x17\x19\x0f\x20\xb7\x99\x49\x74\x31\xbf\x8a\xc6\x6d\xec\x20\x46\x65\x99\x7c\x74\xce\x3f\xc2\x8f\x8d\x99\x0e\xd2\xcd\x70\xa6\x67\xa0\x56\xb3\x15\xa4\xe8\xff\x56\x35\x6b\xb5\xef\x28\xc2\xb9\x74\x5f\xfb\x64\x59\x14\xbf\xd2\xac\x8a\x91\x6f\x1a\xaf\x49\x8e\x80\x39\x2c\x19\x3f\x8f\xd1\xce\x08\xe1\xc2\xcb\x78\x94\x5d\xc5\x08\xe9\x7b\x15\x93\xf7\xaa\xe8\xea\x62\x1e\x25\x95\x63\x80\x9e\x63\x8e\x33\xcc\x71\x81\xbc\x1b\xd5\xc5\x95\x0f\x56\x28\xb0\xdc\x03\x13\xe3\xef\x81\x01\x26\x00\x5b\x1b\x27\x8c\xc6\x21\xa7\x79\xe8\x36\x8b\x36\x8a\x24\x77\x9f\x53\xe2\xda\x15\x67\xbe\x9b\xf7\xab\x98\x61\x2a\x47\x87\x93\x77\x31\x73\x58\x55\x06\x0a\x5a\x39\xce\x70\xa1\x2e\x94\xba\x16\x75\xac\x31\x84\xe3\x92\x70\xc9\x9a\x4a\xd3\x39\xd0\x1a\x47\x03\x30\x8c\x94\x94\x97\x50\x5c\xca\x6f\x15\x7d\xa3\xc0\xe5\xe0\xf7\xbc\x3e\x2c\xe7\xf9\x69\x2e\xbd\xd0\x97\x83\xdf\x2f\xf4\xe7\x34\xc5\xe5\x60\x56\x94\x8c\xca\xf2\x31\x45\xb8\xb4\xc7\x27\xb3\xc2\x07\x8d\x61\xb3\xe3\x77\x0b\x67\x76\xad\x60\x8d\xbe\x82\xf8\x60\xe2\x7e\x24\xd7\x40\xd1\xa9\x51\xad\x4c\x7a\xa3\xb5\x56\x50\xad\xca\x92\x2b\x35\x42\x3b\x30\x82\x90\x79\xbe\xbf\x40\xa3\xaf\x81\x65\xd2\x2c\x35\x6d\x26\xa8\x56\xa6\xa4\x81\x2d\x69\x01\x2a\x27\x1b\x1e\x14\x42\x78\x1e\xbf\x8d\x99\xbd\x71\x20\xac\xc6\x47\x94\x47\xce\xdc\x52\x84\xab\xe9\x69\xda\xef\x2b\x36\xd3\xf1\xaa\xa6\x1d\x2a\x83\xe3\x32\xfd\x31\x3b\xa7\xb3\x3f\x1d\xcd\x26\x4b\x35\x95\x7f\xb3\x0e\xdf\xd6\xa2\x98\x9c\xb2\x99\x2a\xa8\x91\x57\x94\x69\x63\x3c\xf9\x31\x7d\x9d\x3a\x68\x2b\x5a\x53\x2e\xb6\x7b\x87\x4b\x63\x38\x3a\x40\x14\xf1\x03\x19\x8a\xdf\x67\xe2\xbe\x22\x9d\xdf\x22\xe5\xf8\x57\xfa\x8f\x9b\x2a\xb8\x74\x60\x70\xc6\x3e\xb8\x64\x35\xad\x8b\xaa\xe1\x98\x3f\x90\xeb\x4d\x50\x53\x38\xeb\x35\xbb\xca\x77\x76\x04\xdf\x6f\x96\x90\x5f\x13\x4f\x51\x33\xc1\xa9\x54\x45\x7b\x69\x60\x9e\xf2\x54\xb9\x90\xb8\xa5\xbb\x25\xa6\x4c\x7b\x15\xb3\x4e\x71\xdc\xd4\xb8\x8d\x44\xa9\xe2\x68\x2b\x16\x4f\xa0\x10\x8c\x70\xd0\x40\xa1\x6f\x72\x14\x73\x71\x53\x71\xbb\x61\xaf\x2c\x5c\x5d\x59\x28\xe1\xad\x2b\x8b\x68\xa3\xbc\xb2\xb0\x81\xac\x54\x4f\xb6\x33\x8c\xfa\x22\xc3\xac\x5b\x71\x79\x9d\xa9\xd0\x35\x1f\xd0\xb8\xb2\xd7\x19\x0e\xd7\x19\x77\x29\x3a\x8b\xe3\xa2\x7c\x4f\xf7\x82\x26\xd2\x5f\xba\xef\xb5\x1f\xf8\xae\x9d\x0f\x8a\xca\x2d\x30\x7b\x39\xcc\x09\x1d\xe7\x0f\x3a\x36\xf6\xee\x08\x2e\x3c\x2d\x3a\x90\xa7\xa4\x9d\xb6\x33\x4a\x5b\x74\x66\xb0\x28\x17\xb1\xeb\xb4\xda\xcd\x53\xca\x57\x14\x8f\xd0\xb8\x4d\x08\xec\xa0\xb5\x88\x01\xe6\x5f\x8d\x1c\x34\x72\x36\x07\x18\xa8\x29\x7f\x9d\x5f\xd0\x72\xc9\x5d\x8b\x7a\x2d\x65\x76\xce\x19\xb1\x2b\x9c\xcf\x41\x56\x14\xe5\x87\xc3\xec\x12\x54\x2a\x81\x89\x94\xb3\xbc\x01\x6a\x02\x97\x2e\x70\x26\x59\xc7\x15\x1d\xc8\xcb\x5a\x9c\x53\xec\x15\xc2\x53\x8d\x0c\x6f\x40\x96\x22\x94\x50\x69\x88\x5a\x8b\xea\xe5\xaf\x69\x4e\xd3\x7e\x7f\x4e\x0b\xca\xe9\x2d\x37\x71\xdd\x18\x1f\x97\x22\x06\x46\xc8\xc4\x5d\x70\x0e\xd6\x30\x3d\xea\xf9\x04\x48\xb7\xbc\xd7\x2c\x6e\x2e\xe0\x94\x0c\xc7\xf4\x41\xa8\x90\x89\xdc\xe2\x54\xca\x68\x8b\xd0\xd0\x14\x37\xa8\x6b\xaa\x5d\xb3\xb7\x6b\x1d\xd3\x9d\x1d\x34\x76\xb4\x16\x0d\x23\xd0\xe9\xd1\xbc\x4d\x90\x94\x5f\xbb\x4f\x75\x5b\xd7\x45\x79\x2a\x74\xb3\x23\x3b\xc1\x88\xb1\x75\x5c\x0f\x5e\x52\x84\x0b\xda\xf6\xd8\x1c\x53\x52\xd0\xd5\x2a\x2e\xa8\xb8\x91\xa0\x29\x1d\x48\xff\xbe\xef\x95\xb7\x0e\x32\x4a\x49\xe4\x27\x45\x98\x4e\xe9\xe0\x05\x3d\xcb\x1c\xb0\xdb\x29\x89\xfc\x24\x09\xf6\xb0\xe4\xe7\xe4\x4e\x4a\x22\xf1\x23\xc2\x05\x95\xa4\x59\x70\x80\x65\xb8\x39\xa5\x68\x4e\x69\x9a\xf3\xf6\x2e\x34\xe1\xed\x5d\x89\xef\xed\x7d\xa8\xea\xed\x7d\xf9\xb9\xc7\xae\x5e\x32\x0a\x15\xc8\x9f\x11\x2e\x9d\x2a\xea\x70\x15\xb5\xa8\xa2\x36\x55\xbc\x28\x19\x25\x43\xd1\x81\x52\x20\x10\x78\x5f\xb2\xe3\xe5\xbb\x8b\x9c\x43\xdd\xfa\x43\x67\x3d\xca\x2b\x7e\x05\xcd\x50\xbf\x75\x86\xf6\x7f\x7f\x07\xb2\x8c\xbf\x7c\xa7\xd4\xcb\x4a\xc3\xdc\xb5\xc5\x4d\x62\x03\x54\x35\xe1\x9e\x0b\xe9\xb7\x44\x95\x33\xa0\xf7\xdd\x8a\x2d\x70\xed\x0c\xc9\x2c\x3c\x24\x33\x31\x24\x33\x33\x24\xfb\x6a\x53\xbc\x64\xc5\x15\x8c\x81\x9b\x20\x6b\x7f\xa2\x45\xab\x12\x48\x0c\x87\x9f\x64\xc1\x80\xc7\x97\x60\x77\x14\x98\x4d\x92\x60\x1a\xff\x1e\x9b\x37\x10\xdf\x75\x6a\x6f\xe5\xca\xc2\x8f\x64\x3c\x41\xd0\x32\x86\x32\x62\xc8\x9a\x89\x6a\xc1\x14\x05\x8c\xd2\x5e\x51\x44\x78\xe6\x8c\xcb\xf2\x0b\xc4\x65\x20\xde\x10\x9c\x9f\x24\x09\x9d\x01\x2c\xac\x76\x30\x40\x4f\x1c\x9e\xd1\x29\x19\xeb\x7c\x24\x09\x80\x34\xf7\x6b\xd4\x74\xe8\xb2\xcb\x5f\xaf\xc2\x8b\x16\xda\x46\xed\xaf\xca\x92\x9b\x29\xd8\xba\xca\x66\x41\x5b\x63\x42\xdb\x7d\x53\xb3\xfd\x35\x3a\xe4\xa3\x17\xf5\x2b\xe4\xca\x89\x7c\x07\xd3\x15\x45\xf2\xd1\x47\x61\xf1\x1f\x16\x54\xaa\x65\x2a\x1d\x50\x7b\x9a\xb0\x94\x10\x71\x14\x10\x36\xf6\xa4\xb5\xbc\xdd\x5f\xb3\x1f\xb6\xe8\x71\xbf\xdf\x33\x95\xb9\x42\x4a\x41\xe1\x57\xab\x50\x4e\x46\x91\x99\x84\x46\x7d\xee\x38\xa9\x5f\xa6\x75\xbc\x7c\x5e\x7e\x08\x1b\xe8\xda\xe0\x77\xce\xeb\xb3\x04\xdf\xcf\x6a\x1a\xeb\xb7\xe8\x86\x5f\xdd\xf0\x9c\x5a\x21\x7c\xd3\x61\xa2\x75\x55\x68\x4e\x44\x7d\xd3\x0f\xd8\x71\xc8\x07\x7a\xe9\xc1\x40\x9f\xe7\xe0\x3f\xce\x3c\xda\xbb\x19\xe1\x45\xf1\x79\xad\xeb\xf7\xb9\x1e\x46\xc7\x1d\xef\xa0\xb9\x9c\x63\x8e\xbe\xa8\xf9\x7a\xc5\xeb\x95\x76\x46\x79\x3c\xa5\xa9\xf1\x9c\x67\xaf\xb1\x9f\x41\x89\x24\x1b\xbb\xe5\x4e\xca\x6b\xe3\x8c\xae\x1b\xf3\xee\x22\xab\x6a\xfa\xa4\x28\x33\x1e\x53\xb4\x33\xfa\x81\xd8\x26\xb2\x92\x1b\x87\x6a\xdd\x23\x2e\x1d\x5d\xd3\x49\x14\x25\x14\x57\xea\x93\x8b\x4f\xbb\x0e\xda\x72\xfa\xaa\x99\x34\xd9\x61\x3d\xb2\x53\x25\xac\x47\x9c\xb0\x79\xb2\x03\x9b\xad\x8e\xf4\xfb\xaf\x92\x66\xca\xe7\xc9\x49\x43\xf0\x08\xdc\xb4\x52\xe6\x3e\xbe\xba\x78\x57\x16\x93\xce\x9c\x44\x23\x19\xcc\xbd\xe4\x68\xa0\xdc\xd4\x13\x6b\xee\xa0\xa5\x78\xdc\x74\xbc\x68\xf2\x66\x09\x57\x9a\x13\xed\x9c\x4a\x8c\xdb\x20\x22\x84\x49\x55\x10\x42\xd8\x44\xe2\x3e\x19\x08\xec\x4a\x63\xe8\x04\x3b\x1f\x50\xab\xa3\x54\x50\x34\x99\xbc\x2e\xac\xbb\xa9\x8f\x58\x7d\x63\xff\x3b\x80\x5e\xf0\x84\x9d\x48\x57\x3b\x52\xcd\xc9\xc1\x6b\x92\x70\x2b\x49\x24\x38\xf2\x47\x23\x32\x90\x51\x72\xe9\x86\x0d\xae\xcc\x00\xe9\xa0\xe1\x05\x1f\xb5\x52\x04\x4d\xe7\x63\xc7\xab\xee\xf5\x7a\x5c\x41\xa2\x0e\x94\x9c\xd5\x75\x7e\x26\xb0\x5e\x37\x8a\x26\xe0\x29\x42\x37\xcb\x68\x92\xfc\x92\xf3\xf3\xd7\x55\x1e\x14\x0d\x75\xf8\xbb\xa5\x13\x1a\x24\xb6\xc9\x96\xb4\x38\xaf\xbb\xef\x2d\x5f\xa2\x00\x60\xf1\xdf\x74\x94\x35\x9e\x55\x91\x7f\xab\x0a\x93\x2c\xd7\xb4\x4a\xf7\x20\xe6\x68\x42\xed\x93\x35\x9a\xbc\x8f\x39\x4a\xfc\x99\xb8\x5e\x63\x8e\x12\x6e\x95\x4a\xe6\x94\x48\x7b\x8f\x93\x9d\xdd\x74\x72\x32\x07\x0d\xd5\x1e\x98\x0c\x9c\xbc\x93\x26\x12\xbb\x13\x6d\x74\xa0\xac\x12\xa4\xbd\x41\x3c\x49\x4e\x46\xa2\xe4\xe8\x76\x7a\x32\x5f\xa9\xcc\x3b\xd3\xe1\x28\x45\x68\xb2\xfa\x45\x5a\x85\x80\xa6\xe0\x3d\x53\x62\x77\x32\x1d\xed\x7e\x97\xa2\xc9\x4a\xe0\x53\x65\x86\x5a\x87\x50\xa2\xba\xbe\xbd\x5e\xdd\x91\xa5\xef\x89\xd4\xfb\xd3\xd1\xee\xfd\x14\x41\x63\xa6\xaf\x4f\xea\xd4\x58\x61\x88\xba\x94\x89\xc4\x1d\x40\x1f\x27\x13\xa4\x8a\xa1\xc9\xea\xf6\xdd\x93\x64\x32\x1c\x42\xb9\x93\x01\x4e\x4f\xe6\x3b\xf1\xa4\x97\x20\x34\x91\xe6\x2c\xb7\x15\xa8\x93\xaf\xb2\xa6\x1f\x7f\x4b\x57\x7a\x54\x50\xab\xa6\x64\x62\x9b\x27\x4a\x88\xff\x07\x33\x96\x4f\x63\x99\x8d\x88\xfc\x51\x47\x24\x30\x3d\xc5\x6d\xaa\xde\xcb\xeb\x17\xd9\x0b\x1d\x01\xf2\xe5\x69\xec\x7b\xed\x0f\xab\x19\x69\x76\x4e\x93\x52\xea\x3e\x88\x70\x12\xfd\x4b\x1b\xf2\x5c\xdf\x5d\xa3\xdd\x58\xce\xf3\x4a\x9b\x9a\xec\xc6\x30\xb7\x30\x49\x52\xf5\x52\xe7\x7c\x13\xb5\xde\x4d\x00\x5b\x17\x7c\x00\xb5\xae\xf8\xf6\x1a\x4d\xf4\x2f\x1f\x2d\xbc\xb3\x00\xda\xad\xdb\xd5\x85\x76\xdd\xd6\xb6\xe2\xae\x08\xb2\x63\xec\xdc\xf7\x0a\x3d\xc6\x81\x87\xf9\xff\xc0\xcb\xdb\x84\x3a\x65\x56\xab\xed\x70\x27\x5f\xf0\x04\x19\xac\x2f\xfc\x20\xe9\x83\xc2\xb4\xb5\x1e\x62\x37\x30\x17\xfa\x29\x0b\x97\x9f\xeb\x6e\xc4\x04\x37\x95\xfb\x2a\xa6\x08\xe9\x7d\x24\xb2\xe6\x54\x6b\xab\x22\x67\x19\x28\x48\xbd\x33\xb2\x7f\xe3\x5b\x70\x41\xc4\x10\xfe\x3b\x9f\x83\x71\xaf\xec\xf7\xff\x5b\x4f\xc2\xd9\x96\x4f\xc2\x72\x18\xb6\x7b\x15\xc6\x85\x4b\xa9\xa4\x16\x87\xbe\x7f\x64\x68\x70\x91\x2d\x02\x4a\x75\x3b\x74\x8d\xf0\x8c\x9c\xc5\x35\xbe\x83\xc6\x8c\xcc\xa6\xc3\x14\x57\x64\x36\x1d\xa5\x38\x27\x33\xb1\x52\x9a\x54\x0b\x62\x38\x6d\x89\x79\x4e\xce\xe2\xa5\xc0\x9c\x93\xb9\xc4\x3c\x87\x68\x34\x64\xde\xc0\x0c\x84\x4b\x60\x3e\xdf\x12\xf3\x82\x9c\xc5\xe7\x02\x73\x45\x16\x02\x73\x4e\x16\x12\xf3\x62\x7a\x3b\x5d\x37\x17\x2d\xc3\xd5\xee\x08\xe7\x5b\x6a\x6c\x8b\xbd\x21\xee\x67\x0a\x08\x59\x2b\x71\xa5\xac\x4b\xe1\x32\xd7\xe6\xb2\x6c\x51\x60\xe3\x0f\x8e\x5f\xca\x83\xa8\xb5\x9d\x7a\x43\xe5\x0a\x27\xfa\x76\x83\xc6\xca\x96\x9b\xa9\xdf\x8f\x8d\xea\x40\x28\x5f\xab\x8c\x7c\xc1\x1a\x0f\xd6\xb5\x19\x12\xe1\x3b\x84\x98\xc9\x64\xc8\xca\xd9\x29\xb1\xbe\xdc\x18\x8e\x76\xdd\x68\x31\xf0\x29\x45\xec\x70\xc4\xc4\x1c\x99\xa1\x5b\x7b\xde\xaa\x34\xdd\x6a\xc8\x0b\x4e\xf3\x33\x91\xd1\x79\x87\xd5\x7e\x03\xa5\x94\xdc\xb0\x87\xf0\x19\x88\x1e\x64\x72\x62\x6e\x2e\xe8\xb2\x62\xe5\xc9\xd4\xa5\xe4\xb8\x37\x44\xae\xd7\x2c\x68\x11\x78\x53\xb9\x81\x9e\x1b\xd4\x8d\x0e\xa8\x85\x46\xad\xbf\x17\x2d\x2c\x58\x4a\xbd\x0f\x2b\x85\x70\x81\xc0\x6d\x94\x79\xcc\x82\x29\xf3\xda\x5e\x05\xda\x6e\x87\xd7\x6a\x08\x5b\xf5\x89\x05\x75\xe3\xaf\x35\xac\x04\x0c\xd4\x29\xf5\x2c\x1e\xa0\x50\x68\x4c\x27\x34\x14\x9a\x21\x9a\x7e\x13\xed\xf0\x9d\x28\xdd\x89\x4c\x90\xa0\xc4\xc1\xfe\x9e\xaa\xb7\x6f\xc0\x6b\x84\x6e\x03\x90\xba\x39\x77\x6d\x47\xe3\xe6\x6b\xde\xb7\x11\x8e\x70\x04\x1e\x74\xdb\x1d\x6a\x2c\x6a\xd0\x4a\x1f\x44\x08\xe1\xa5\xb8\x6a\x28\xb9\x87\x73\x98\x7a\x52\x8e\xb5\xab\xfb\x26\x3a\x75\x46\xc9\xb5\xb8\x7f\x85\xf8\xaa\x4d\x63\xaa\xae\x74\x74\x8d\x8b\xcf\x29\x6e\xc2\x60\xfc\xeb\xa4\xde\x91\x71\x93\x04\xae\xea\x8b\x70\x9d\xd4\x3b\xdf\x58\x5c\xef\x8a\x6c\xf6\x67\x91\xd7\x3c\x39\xa5\x60\x77\xbf\x78\x5e\x7e\x08\x9b\xcb\xc0\x5a\x02\x17\xbb\x7c\x12\x9d\x0c\x77\x4f\xf8\xc9\xfb\x93\xd3\x93\xcb\x21\xdd\x3d\xb9\x1c\x9d\x9e\x5c\x7e\x77\x1a\x25\x90\xa1\xbf\xd0\x1a\xf3\xf2\xa1\xd4\xfc\x0e\xe3\x84\x16\x4f\xf8\x24\x1a\x45\xd2\xde\x25\xe2\xd5\x92\xc2\xef\x24\x1a\xc2\x62\xee\xf7\xa3\xd3\xac\xa8\xa9\xfe\x80\xbf\xa2\xe9\xbc\x7c\x54\x2e\xdf\x15\x41\x66\x17\x56\xa6\x00\x81\x29\x4d\xde\x53\xcc\xcb\x03\xc6\x37\x34\xa2\xdf\x6f\xac\x8c\x09\x2c\x89\x03\xc6\x05\xec\x6a\x35\x1a\x22\x50\x81\x15\x48\xe5\x95\x79\x53\x8f\xcc\x25\x5e\x34\xf4\xc3\x79\xce\xa9\x1c\xe3\x0d\xd5\x6f\xbf\x29\xff\xe5\x6a\xa7\xa6\x3b\x62\x5f\xda\xcd\x29\x86\xa5\x1d\xd8\x56\x49\xe2\xe8\x87\x5b\xe7\x86\xc4\x76\xd6\x2b\x15\x48\xd5\xb9\x8a\xc5\xed\x9c\x30\x4b\x65\xf5\x30\xd0\x7a\x96\x2d\x82\x83\x2f\x87\xc0\x59\x72\x7d\xb1\xde\xfa\xd9\xc5\x62\xec\xc6\x76\x89\x20\xf5\xaf\x65\xc9\xbd\xe4\xbf\x43\xf2\xff\x75\x79\xfb\x3b\x2f\xf9\x01\x24\x17\x3e\xec\x0f\x90\x78\xe6\x27\x9e\x7c\xab\x31\x3c\xf1\xd3\x4f\x54\xfa\xbd\x7d\x2f\xfd\xff\x91\xc9\xdf\xdf\x1f\xcb\x01\x5c\x54\xf4\x34\xbf\xdc\x34\xbb\x56\x69\x8e\x5b\x77\xb3\x50\xb6\x5e\x9e\x6e\x5d\x96\x22\x8b\x05\xca\x2a\x47\x90\x5d\xc6\x6a\x32\xe0\x06\x9c\xaf\xf6\x18\xb8\xf2\xf4\xdf\x9f\x82\x34\x99\x22\x5c\x11\x3e\xe1\x83\xdf\x7f\x07\x41\xcf\xef\xbf\x27\x17\x02\x6c\x9a\x22\x9b\x04\x9e\xe4\xed\xa7\xd6\x06\xef\x8d\xc6\xf3\x52\x90\xf4\x9c\x38\xb9\x7e\x20\x3e\x15\xf4\x54\x99\x05\xc8\x3a\x3b\x80\x05\x03\x2b\x16\x0d\x8d\x19\xc2\xd2\x5c\x00\x57\x2e\xe6\xf5\xfa\xc3\x79\x5e\xc0\x93\xb7\x39\xec\x4c\xe7\x2e\xbc\xce\x29\x89\xd0\x0c\xbc\x9d\x49\xcf\xbf\x4a\x95\x04\x1e\xe2\xe9\x20\x5b\x2c\x8a\x2b\xe9\x07\xcf\xa8\xf0\x30\xf2\x8a\x9e\x16\x50\x4e\xb7\x4a\xc6\xf6\xf7\x94\xee\xdf\x51\x3f\xf6\xa9\xe4\x38\x9d\xd8\x09\xa8\x61\x69\x21\x32\x40\x62\x38\x65\xe9\x1a\xe1\xfd\x2e\x09\x0a\x48\x25\x1b\x31\x18\xe6\xda\xa7\x29\xf8\xc8\xe3\x32\x51\xfa\x75\x55\x3a\x8d\x2c\x1c\x7f\xc1\x3c\xbb\x7d\xde\xa3\x17\x19\xe2\x8a\xb8\xfa\xea\xed\x17\xb0\x31\xb3\x51\x36\x99\x8e\xb2\x99\x93\x6a\xca\xd2\x71\xf0\x75\x2c\xd7\xaf\x63\xb9\x7a\x1d\x6b\x3f\x8f\x7d\xa4\x55\xa9\xe3\x40\x1d\x55\xe5\x8c\xd6\x1b\x1d\x11\x4e\x95\x8a\xd1\x99\x8d\x38\xaf\x3d\x1c\xea\xea\x71\xe4\x12\x40\x70\xfb\x3c\x8c\x10\xee\x8d\x36\x06\x5e\x63\x4a\xe1\x42\x2b\xd4\xab\xe7\x1d\x0e\x3e\xf5\xc1\x25\x6b\xc6\xcf\xa1\x25\x10\xed\xc0\x7f\x25\xca\x1b\x6f\x58\x99\x62\xf7\x1a\xaf\xa1\xa8\xb3\xed\x99\xd3\xe8\xca\x6d\x74\x87\x97\xed\x40\xa3\xf5\x44\x16\x24\x8a\x70\x49\x86\xe3\xf2\x81\x6e\xd6\xee\xed\x71\xa9\xa7\xab\x26\xf9\xb4\x4c\xc7\x85\xa3\xda\x5b\x05\xe2\x45\xd5\x26\x5e\x94\x6a\x0d\x34\x27\xb3\x53\x5b\xa7\x5a\x01\x27\xd4\x1d\x17\x0e\x17\xb8\x37\xc4\x1d\x06\x0f\xed\x8e\xe0\x8c\x78\xc5\x3d\x4b\x38\x47\xe0\xe2\x57\xb9\x31\xe4\x41\x5b\xe6\x72\x27\x28\x73\xb9\xe3\x6a\xd7\xdd\x49\x13\xb5\x55\xa6\x07\xa9\x5e\xea\x82\x9e\x4e\x0f\x52\xcf\x8f\x73\x6b\x83\xa2\x71\x43\xa6\xb6\xef\xfb\xf9\xd5\xa3\x94\x2b\x57\x8e\xaa\x7f\x53\xef\xbd\x32\x5c\x66\x73\x37\x55\x7c\xd0\xcf\xee\x2d\xce\xc8\x34\x85\x60\xa2\x5d\xee\xbe\xdb\x14\x2a\xe8\xaf\x5c\xf5\xbf\xe8\xf7\x43\xa1\x34\xd1\x75\xa6\x3c\xf1\xcf\xec\xd6\x4a\xf2\x89\xab\xba\xee\xfa\x7e\xe7\x28\xe1\x38\xe8\xb3\x35\xe9\x6e\x69\xd5\x6a\x66\xd8\x1d\x3e\x4f\x71\x5e\x8b\x7d\x9a\x30\x88\x44\x96\x39\x4f\xe3\xee\xd6\xef\x14\x3c\x50\xef\x55\xd8\x5e\xdc\x3c\x72\x6c\xa1\xa4\x65\x97\xbb\x40\x9a\x24\x46\x93\x31\xee\x6c\x51\xd6\x18\x90\x40\x94\xc6\xd9\x79\x5e\xcc\x15\x22\xbd\x39\x6c\x47\xb7\x88\x3b\xb3\xb5\x60\x72\xe2\x7e\x24\x60\xd4\x30\x4d\xfd\x9d\xa2\xcf\xfd\xe6\x66\x91\xc1\x1b\x6e\xd8\x17\x19\x16\x17\x73\x5c\x6d\xa4\x18\xb9\x4b\x31\x3e\x27\xc8\x0b\x21\xaf\x42\x21\xf7\x32\x74\x4d\x2d\xf9\x91\xf1\x31\x04\xa9\x63\xe1\x23\xa7\x09\xa9\x9a\x3e\xf1\xc8\xb9\x33\x75\x12\xcc\x8d\x51\xa0\x52\xb6\xee\x2c\x1b\x6c\x9e\xe9\x70\xa3\xfe\x8d\x2d\x82\xff\xb5\x82\xb0\x96\x8c\x7e\xc2\xb1\xde\x79\xd6\x56\x5d\x27\xa9\xbb\x83\x6e\x18\x90\x0a\x33\xc7\xde\x7c\x8f\x92\x88\x6b\x45\xbc\x63\x4a\xa2\x25\x33\x9f\x6f\x3f\xc7\x3c\x05\x97\xb8\x96\xfd\x98\xe1\xe5\xd8\x32\x86\x0c\xe1\x78\xe9\x19\xa8\x40\x11\x84\x7c\x6e\x2e\xc3\x4b\x10\x02\xaa\xcf\x02\x2f\x07\xbf\x5b\xa7\xef\xa4\x16\xdf\xa0\x99\xab\x8c\xc3\x20\x36\xd7\x72\xf0\xbb\xea\x34\x2c\x44\x95\x54\xd1\x53\xd5\x7d\xad\x49\x67\x33\x54\xe9\x76\x06\x78\xa9\x17\x34\xaa\x91\x95\xd7\x47\x59\x5d\xbb\x03\x49\x7a\x23\x91\x31\x07\xbd\x48\xf8\xfd\x2e\x9b\xfd\xf9\x98\xcd\xa5\x92\x32\xb9\x5e\xe3\xe5\x60\x0e\xfa\x78\x32\xc5\x38\x1c\x47\xa2\x9c\x55\x94\x35\xd1\x8d\xe8\x44\x5c\x16\x93\xa5\xa6\x97\xc7\x5c\xde\x21\x65\xfd\xae\x91\xce\x72\xa0\x3c\x15\x90\x52\x64\x9a\x77\xf7\x5a\xda\x1d\xab\x0f\x91\x95\xd5\x57\x6c\xf6\xd6\xcd\x6f\xa4\x34\x07\xf4\x61\xce\xe6\x39\x3b\x3b\xe6\x55\xc6\xe9\xd9\x15\x79\x06\x94\x2b\xaa\x68\x36\xe3\xf9\x7b\x90\xb6\x0d\x36\xc0\x47\xc8\x9f\xb1\x7e\xdf\xfb\xec\xa6\x47\x91\x12\x3f\x44\x84\x50\xeb\x19\x14\x8a\x9b\xa1\x72\x85\x64\x20\xcd\xea\x10\x75\x5d\x4b\x49\xbc\x92\x2b\xb8\x18\xd0\x78\x77\xd4\x23\xe7\xc6\x0b\x86\xd8\xfa\xfd\xbe\x07\x42\xce\x2d\x03\x38\x88\x70\x97\x34\x6d\x1e\xc7\x33\xb2\x17\x2f\x11\xf6\x35\xf5\x11\x8e\x6a\xaa\x75\x90\x66\x4a\x4f\x7f\xe6\xcd\xb8\x25\x10\xfb\xf1\x12\x05\xec\xa9\xbc\x05\xde\x32\xa9\x32\xfa\xe5\xca\x46\xd5\x75\xf7\xde\x9d\xd7\xef\x1b\x05\xef\xe6\x4a\x46\x86\xe3\x02\xc3\x84\xa1\xb2\x8b\xf1\xf7\x99\x91\x7f\x4b\x06\x4f\xe9\xce\x3b\x5e\xaa\xc5\x6e\x79\xec\x96\x30\x96\x70\xbd\x76\x91\x20\xee\x1f\x86\x37\x21\x54\x06\x29\xd6\xe6\x54\x9f\x9d\xcf\x55\x4a\x8c\xb6\x44\xe1\xd5\x6f\x63\x3b\x3b\xa9\xff\xb1\x71\x97\xa3\xae\x14\x9e\x5a\x8d\xfb\x77\x0c\xf8\x7f\x67\x98\x6d\xd0\xe4\x00\x51\x0c\xd8\x51\xa8\xdb\xb7\x84\x36\xc4\x13\x8e\x0e\x39\x51\x75\x84\xaf\xb5\xb2\x93\x20\xf3\x49\x6f\xb8\xd1\xfc\xd0\x1a\x26\x6f\xdd\x3f\x43\x4c\x35\x9f\x26\x2b\x26\x7e\x26\x64\x21\xaf\xcf\xf5\x1a\xd7\x6e\x53\x8c\x81\x84\x42\x40\xd7\x6b\xd4\x54\xc8\x04\x7a\xbf\xe1\xd1\x67\xdc\xa1\x4b\x04\x2f\x06\xd3\x14\xd3\x6d\x42\xa9\x0b\xfe\xc4\x79\xe3\xf9\x02\xd3\xcd\x33\x20\x73\xea\x18\xe9\xb6\x89\xd7\x63\x6b\x60\x8f\xcb\x65\x35\xd3\xa6\x29\xf6\xb4\xf2\x86\x63\xcf\x3f\xa4\x3e\x17\x7b\xe3\xac\x43\xc1\xb6\xcb\x12\x9b\x54\x73\x26\xcd\x11\x9f\xbc\x8f\x29\x4a\xa6\x34\x4d\x9c\x6b\x6a\xbd\x71\x3c\xcc\x02\x70\x0e\x6b\x1a\x30\xf8\x6c\x60\x69\x5b\x7e\xba\xf5\xdd\x34\x4c\xa6\xd2\x26\x1b\xd0\x51\x73\x0b\xdf\xe6\xea\x3b\x5e\x29\x4d\x94\x15\x2d\x00\x13\x17\x9b\x9c\x9d\x11\xf5\x6c\x6c\x75\x85\x75\x00\xbc\xb9\x79\x2e\x84\xd7\x67\xe0\xa9\xf4\x8e\xb3\xdc\xa0\xbc\x6f\x2b\xce\x27\x25\x5a\x44\xe8\xf2\x8f\x0d\x90\xaa\x73\x80\x45\xbb\x83\x86\x74\xb2\xce\x5c\xb1\x71\xb1\x93\x60\x58\x43\x9d\x48\x2f\xe9\x6c\xc9\x1d\x5a\x6f\xe8\x9e\xc0\x79\xa4\x2d\xee\xc4\x09\xa0\x82\xdf\x28\xc3\x3c\x45\x5c\xaa\xb2\xe4\x60\xb6\xe7\x7e\xf9\x26\xb6\xce\xd8\x8d\x02\x9a\xe5\xe1\x09\x68\x6d\x8e\xc6\x30\x6b\xe2\xb5\x74\x66\xd3\xf4\xb8\xd3\xd4\x34\x70\xb2\xc5\x5d\x27\x1b\x09\x8f\x4f\xd7\x19\x89\x5d\xfa\x79\xc3\x91\xe2\x12\x60\x45\x69\xdd\x3e\x98\x49\xda\x60\x98\xa7\x83\x99\x3d\xf6\xc2\x44\x46\x1a\xd2\x3e\xee\x74\x42\xbb\x66\x90\x9d\xdd\x9c\xe9\xa6\x34\x3b\x3a\xee\xc4\x0b\xef\x15\xce\x06\x7b\xe8\xde\x28\x36\x07\x0a\x18\x7b\xc2\xea\xc0\x6d\x95\x39\x47\x81\x77\x53\x99\xb2\x94\x50\x29\x9a\xdf\x3c\x01\x7e\xfc\x82\x4f\x69\x1b\x9d\xdc\xd4\x3a\x4b\x6d\x95\x01\x66\xb3\x91\x34\xd5\xe1\x66\x5a\xd7\xac\x2d\x5b\x7d\x91\x55\x7f\xee\xd5\xc6\xea\x6c\x63\xd4\x05\x75\x07\x0e\xd8\xe1\x36\xb0\xb4\x09\x24\xe6\x3d\x0f\x87\xde\xde\x4b\xb6\x6f\xa3\x99\x49\x42\xe0\x2c\x99\xe9\x1e\xc5\xc7\x34\x6d\xb6\xf6\x8d\xbd\x8d\x6f\x6c\xaf\xb9\xb5\x77\xb6\xd8\xc1\xb4\xa1\xcd\x06\xcf\x96\xad\x3e\xa6\x78\xaf\xdd\x6a\x65\x1f\xb8\xb1\xc5\xf2\xe2\xdc\xd9\x5c\x85\x22\xd4\x54\x5b\x9a\xf4\x86\xa6\xe5\xbf\xab\x43\x63\xab\x66\x47\x00\x1c\xb5\x1a\x7e\x54\xe5\x35\xcf\xd9\x4d\x31\x39\x16\x0a\xac\xb3\xf5\x16\xcf\x86\xb1\xd6\x58\xb6\x6d\xb3\x86\x0f\x34\x9b\xc2\x1d\xfc\xa6\x56\x4b\xa8\xcf\x19\xf2\x9e\x87\x61\xeb\x06\xab\x66\x39\xed\xdd\x5c\xe6\x26\x2a\x12\x24\x1b\x31\x1f\xfc\xee\xc4\x09\x14\xfc\x43\xe8\xac\xf2\xa1\xa6\x34\x5d\xad\x7a\x5d\x90\x60\xe5\xed\x92\x11\x2d\xdd\x88\x91\xb8\x18\xf8\xec\x81\x43\xe8\xf7\x1b\xcd\x08\x65\x4c\x69\xaa\x51\x38\x0c\xc5\xda\x55\x4d\x3e\xad\x68\xc0\x29\x8a\x3a\x87\xcf\x8c\xc3\xa6\xe6\x81\xa3\x05\xe5\x0e\x07\xe4\x72\x2f\x6e\x84\x33\x29\xda\x8a\x6d\xd4\x64\x1c\x05\xc4\x65\xd1\x4d\xc5\x65\x0c\x67\x59\xb6\x21\x51\xbb\xb9\xac\x1b\x54\x59\xa2\x68\xc9\xde\xa2\x1b\x19\x2d\x67\x26\x7c\xdf\x23\x5f\xdf\xb7\xc4\x7a\xac\xcf\x19\xc9\x45\x99\x32\x74\xa2\xbc\x82\x78\x62\x3b\xee\x1b\xb0\x23\xc3\x5b\x1a\x89\xe1\xa7\xfb\xf8\xb0\x8c\x5b\x8b\xcd\xb4\xc8\x74\x5a\x27\xbe\xa6\x5b\x82\x33\xdd\xa3\x66\x93\x7b\xa1\x7c\xe5\x2d\xc0\x59\x71\x4d\x37\x30\x2d\xb7\x30\xde\x8a\xf4\x5d\x29\x84\x36\x59\xa7\xd3\x89\xde\xd0\xd8\x87\xb5\x84\x0b\x0d\x31\xa4\xb2\x11\xab\xad\x51\x7b\xe2\x59\xfb\x0d\x6a\x48\xe4\x74\xee\x5a\x67\xd5\xc6\x0e\x5d\x43\xab\x53\xaa\x09\xa3\x8e\x7f\x0d\xa5\xcf\xde\x20\x2a\x63\xe8\xee\xe3\x5c\xad\xb6\x29\xea\xb7\xdd\x2b\x79\x63\x47\x1a\x16\xf1\x8d\xc6\x6e\xc6\xa2\xa2\x25\x25\x62\xd0\xad\x4b\x4d\x23\x26\x6b\xed\xc7\xae\xc5\xb6\x90\x8f\x1d\x0e\xa9\x0a\x12\x1a\x2f\x7e\xfb\xa6\x82\x4d\x2a\x83\x9d\x8b\xcb\xe6\x92\x6d\xe2\x82\x1b\x17\x06\x4f\x3a\xd0\xa2\xb1\xdd\x2f\x9e\xe6\x99\x8f\x75\x3e\xf3\xd9\xbb\x52\xeb\xbc\x21\xac\xeb\xd1\x56\x5e\x6f\x36\xbc\xd4\xaa\x6b\x86\x3d\x5b\xb6\xc1\x65\xce\x21\xef\xa6\x8c\x3b\xaf\x2c\x9b\x70\x3a\x24\xfc\xe6\x66\x06\xce\xc2\x4f\xc0\x6d\x9b\xbd\xa1\xad\x7a\x94\x43\x57\x2b\xd2\x1b\x22\x3f\xa8\x99\x7f\x2b\xee\x70\x54\x25\xeb\xb2\x0f\x18\xea\x14\x01\xa7\x26\xad\xbc\x4f\xf4\x71\x42\xc9\x19\x9d\x56\xf2\x51\x32\xa6\xb8\x52\xd1\x31\x6f\x76\x70\xd2\xda\x90\x1d\xa7\xec\x8d\x31\x4c\x35\x55\x81\xbd\xa7\xe3\x64\x83\xe6\xe3\x3e\x68\x93\x35\xc5\x2b\x72\x8b\x4d\x79\x4a\x82\x25\x07\x01\xf5\x25\xc9\x44\x06\x98\x92\x56\xe1\xf6\x1b\xa9\x12\xf6\x5a\x05\x26\x07\x8b\x52\xc4\x19\x45\x9b\x5f\x66\x99\x09\xf5\x48\x5d\x26\xab\xe3\xb6\xb8\xd9\xdf\x51\x7e\x1a\xf7\x3a\x65\x21\xf2\x40\xee\x66\x1c\x15\xbd\x0d\x3d\x03\x5c\xb7\x8f\x33\x78\x76\x74\x64\x1c\x7e\x58\x58\x9b\x1e\xe8\x7b\x53\x0f\xc3\xf9\x98\x2e\xd2\x29\x75\x04\x68\x7e\x9d\xd2\x17\xa3\xdb\xfa\x58\x7b\x41\x12\xcc\x4b\xaf\x01\xae\x17\x92\x75\xc6\xc4\xb1\x0a\x9e\x3e\x35\xde\x93\x78\x3a\xe5\x69\x8a\xc6\x9f\xdd\x02\x19\xa8\x57\x3a\x45\xfe\x94\xe6\x8e\x69\xf3\x8d\x49\xb9\xdc\xf3\xfb\xb0\x46\x49\x80\x99\x50\x4f\xb2\x3e\x93\xe3\x32\xd9\xa2\x1b\xbe\xa4\xd1\xc4\x96\x97\xc2\x8b\x0d\xa0\x48\x3f\xa1\xb7\xa6\xd4\x13\x6c\xa0\x31\x77\x9f\xc5\x82\xf3\xbc\x55\x1f\x09\x6d\x48\x52\x78\x2a\x76\x82\xf5\x41\xd6\xb1\xf0\x42\x23\xa2\x08\x86\xf1\x6b\xc9\x5b\xef\x26\x2e\x81\xd5\xa9\xdd\x02\xca\x86\x83\x59\x8d\x77\xd2\xf8\x6e\x7a\x7b\x68\xcc\xfb\x86\xa3\x99\xa7\xd3\x3f\x52\x63\x1a\x28\x3f\xad\xd3\x88\x26\xa7\xd0\x6d\x4e\x25\xa8\x1e\x4d\x8d\xf9\xa2\x22\xfe\x22\xc9\xd0\xfc\x4a\xd1\x7c\x46\xaa\x16\xcd\xcf\x89\xf2\x98\x87\x33\x92\x0f\xa4\x86\xd5\x44\xaa\x72\x68\xfb\x97\x7c\xe0\xa8\x7f\xe1\x90\x9a\x87\x14\x92\x26\x6d\xd3\x19\xbf\xa8\x14\x31\x66\xfd\xbe\x73\xbd\x23\x44\x79\x8d\x69\xcb\x2a\xf3\xf0\xc9\x8d\x33\x34\xc9\x06\x0a\x41\x8c\x92\x6c\x40\x99\xfa\xe9\xb0\x5c\x02\x6f\xe6\x5e\xc2\x9a\x42\x58\x30\x38\xc9\x9a\xb7\x5d\xd7\x0b\x7a\xe5\x7b\x41\xaf\x94\x0b\xaf\x4e\x56\xf3\x86\x10\xa4\x52\x6e\xa1\xf7\xde\x41\x8a\xb9\x1a\xcb\x2e\x0f\x42\x72\x58\xb1\x53\xa4\xf9\x4a\xb4\xd1\x99\x48\xc3\x98\x68\x42\xc1\xb9\xb2\x76\x40\xf6\xe2\x00\xe1\x3f\x3f\xcf\x60\x7c\x56\xb2\xf7\xb4\xe2\xaf\x4b\x31\xd3\x8f\x32\x9e\x6d\x8e\xce\x72\x2e\x9d\xba\x89\x22\xba\x40\x4c\x35\x3d\xd6\xe4\x0c\xb9\x3e\x22\x5c\xd0\xee\xb8\xda\xd6\xed\x39\xce\x08\x5f\xad\x04\x6f\xa0\x4b\xe1\x82\x44\x91\xd1\xb4\x2d\x65\x00\x82\x82\xb0\x89\xa7\xa9\x37\xb5\xca\x55\x25\x8e\xd2\x08\x25\x25\x6e\x3a\x99\x2f\x53\x34\x11\xff\x76\xb8\x88\x71\xd5\x73\x4b\x0f\x23\x07\x8c\x58\x7b\x99\x77\xcc\x41\xf2\xc0\x70\x64\xb8\xc0\x15\x4a\x72\xc1\x75\x3a\xfe\x5e\xc4\xdd\xd1\xe4\xae\xa5\xc9\x06\x21\x44\x34\x68\xb5\x12\xff\x36\x2c\xf3\x57\xab\x80\x57\xfb\x00\xec\x93\xbc\xa0\xc1\xc4\xe7\x79\xad\xf6\x63\xa8\x21\x10\xc8\x44\xb6\x34\x3c\xad\x16\x40\xbf\x08\x67\x8e\x97\x99\x26\xc2\xee\xb9\xcd\x4f\xe3\x40\xa8\x09\xc4\x07\xd9\x62\x41\xd9\x3c\x66\xb8\xd7\xa3\x8e\x73\xd3\x5b\x81\x6e\x34\x63\x03\xb8\x81\x01\x0c\x22\x30\xe6\xa3\x97\xb3\x62\x39\xa7\x07\x17\xd9\x19\x55\x8e\x1f\x47\x60\x61\x29\x4b\x4c\x58\xd2\xb5\x6c\x72\x39\xc9\x74\x90\x73\x7a\x11\xe7\x48\x35\xe9\xe7\x81\x8d\x40\x04\xaf\xe0\x4e\xc3\x29\x0a\x58\x01\xfe\x4e\x7d\x05\xe1\xde\x50\xaa\x9f\x8a\x81\xa8\x48\x6f\x04\xa1\x9d\x6b\xca\x5f\x5f\x2d\x28\xd2\xfe\xa4\x9d\x24\x29\x53\x98\xf9\x8e\xe2\x92\x8a\x34\x7c\x52\xbd\x38\x70\xaf\xe2\xb3\x0d\x6e\xde\x42\x65\x57\xab\x46\xd2\xec\x43\x03\xdd\x4d\x38\x82\x05\xac\xeb\xb9\x76\x81\x97\xb4\x51\xa0\xe9\x45\x2e\xa9\x48\xaf\xc7\xb4\x39\xe6\xee\xa8\x47\x7c\x4f\xfe\x52\x26\x64\x94\xaa\x28\x6a\x48\x11\xc4\x50\xaf\x7b\x55\xbf\xcf\x06\x1f\x72\xb0\xa1\xad\x88\x11\x9f\xc9\xb4\x8d\xd1\xad\xad\x79\xc1\x74\x98\x12\xcf\x2b\xd5\x74\x98\x82\xa2\x18\xc2\x12\xbf\x36\x19\x35\x4a\x75\xce\x04\xae\x56\xce\x47\x8f\x90\x40\x4f\x11\xb4\xad\x37\x74\xdc\x7a\x9b\xe5\xf3\x81\x5a\x7e\x40\x33\xbf\x32\xd8\x0b\xb7\x68\x41\x37\xd6\x7c\x11\x27\x07\xea\xf3\xe7\x6e\xb5\x0a\xe5\xdb\xa9\x9a\x34\xd7\x9a\x03\x2e\x8e\x2c\x31\x70\xf6\x52\xf9\xc9\xc3\xb8\x6e\x5b\xa8\x6b\xf3\x62\xc7\xa0\xc3\x2b\x3e\xa3\xf1\x10\x8f\x44\xdd\x7f\x94\x39\x03\x80\x35\x1a\xcb\x29\x24\x8e\xdf\x2e\x35\x0d\xea\xc7\x54\xe9\x0c\xbf\x97\x52\x4c\x93\x88\x30\xf3\x57\x12\x32\x2c\xef\x84\x19\xa6\x4f\xb4\xe9\xc7\x2f\xf1\x94\xae\x49\x54\x2d\x4e\xa8\x4e\x7f\xe9\xb2\x88\xf2\x06\x08\x9e\xd2\x3d\xc5\xd4\xca\xf3\x8c\x7e\xbd\x0e\x79\x4e\x77\x1e\xeb\x71\xe9\xaa\xb1\x02\xb8\x77\x91\x76\xb3\xa7\x75\x4a\xfc\xec\x69\x6d\xac\x06\x4a\x71\x26\x02\xe1\xf7\xee\xe7\x7f\x52\xbc\x1f\x97\x21\xe5\x41\xc1\x6b\x1d\x55\xf9\x45\x56\x5d\x3d\xa3\x1d\x31\xd4\x3d\x69\x95\x2f\xaa\x92\x14\x51\xae\x29\xb6\xad\x26\x79\x5e\xdb\x1a\x65\xf8\xf9\x4a\xdd\x88\x3d\xdf\x8a\x5a\xd8\x21\x2e\x53\xfa\x37\xe9\x06\x73\xc4\x35\x7a\xe0\x15\x3b\xd6\xd0\x54\x92\x77\x74\xb9\x17\x5b\xb7\x2a\x33\x69\x76\x71\x59\x77\xcf\x1c\x2c\xd4\xf4\x4b\x82\xed\x44\xdc\x6e\x95\x7d\x7b\x34\x08\xb5\x7c\xc8\x71\x18\xee\x10\x56\x86\xa8\x91\x94\xb8\x2e\xc5\xbd\xbe\x98\xd3\x75\x03\x22\x70\x64\xeb\x7a\xd9\x73\xc0\xc6\x50\xc7\x34\x1d\xfb\xe7\xb0\xdf\x50\x51\xab\x73\x2e\x9b\x10\x45\x8e\x65\x5a\xa3\x55\xee\x28\x66\xc8\xb9\x88\x52\x23\x4f\xc9\xd0\x7a\x28\x98\x24\x83\xdb\xfa\x4e\x9e\xf2\x54\xc7\x31\x32\xa2\x22\xa7\x2d\x36\x32\x91\xa7\x62\x76\xd1\x54\x30\xfb\x92\xb0\x02\xc1\x17\x10\x8a\xae\x95\x17\x7f\x75\xf5\xd3\xe5\xb4\xac\xcb\xf1\x43\xa8\x98\x2f\x46\x6b\x4e\xe1\xd8\xae\x43\x8e\xf0\x5d\x12\xb0\xcd\xca\x6b\x95\x52\x62\x21\x59\x0d\x50\xfe\x03\xdb\xaa\xee\x67\x16\xe9\xcf\x3b\x90\xe4\x39\x3d\x0b\xbf\xc3\x9b\xe7\x14\x1b\xff\xc9\x6e\x03\x79\x94\xbb\x8b\xcd\xdf\x9a\xdc\xba\xde\xe9\x5a\xac\xb3\x0f\xaa\x53\x9b\x56\xf3\x8d\x5b\xa7\xbd\x6f\x54\x7f\x62\xf4\x69\x7b\x26\xc7\x59\xd3\x23\xbe\xc0\xd6\xf6\x8e\x9f\xa9\x0b\x7c\x4e\x32\xef\x02\x4f\x49\x2e\x87\xc5\xb6\xc0\xb9\xbf\x66\xfe\xfd\x35\x53\xf7\x57\xb9\xfc\xc9\x92\x0e\xac\xdf\xc7\xb6\x3e\x5b\x8a\x25\xc5\xa5\x7e\x70\x2b\xba\x5d\x1c\x85\xf6\xec\x99\x4e\xfd\x4e\x63\x8e\x9b\x7d\xc6\x52\x55\x74\xf3\xdc\x4d\x5a\x23\x65\x43\x20\x7c\x10\x58\x29\xb2\xf7\x92\x8e\x81\xdf\x84\x03\x42\x24\x40\x5f\x26\xea\xef\x94\xa7\xea\xac\x47\x89\xcd\xed\xf7\x7d\xfe\xde\xc0\xa2\x0e\xec\x2e\x48\xab\x81\x0a\x04\xa1\x9b\x1f\x5d\x8d\xaf\xf5\xf6\xa8\x36\x69\x84\x09\x94\xe0\xd3\x1d\x10\x32\x6c\xd0\x8d\x84\x09\xf7\x43\xaf\x79\xd5\xb4\x56\xb6\x17\x2b\x8d\x09\x22\x5c\x35\x43\x55\x54\xe9\xa0\x51\xb7\x8a\x9f\xd6\xb5\x5b\xaa\xe6\xa4\xf5\xfb\xa1\xd0\x6f\x66\x0b\x0d\x21\x14\x6a\xab\xd2\xf6\x36\x2a\xcc\x36\x0a\x85\x41\xcd\x4d\x5c\xbc\x2a\x9d\x66\x69\xbf\x5f\x06\xdb\x3d\xcd\x44\xd3\x71\xb6\x43\x46\x7a\xaf\xcd\x64\x10\xcf\x59\x33\x88\xa7\xdc\x6a\xf6\x35\x7e\x5a\xe9\x17\xe8\xd6\xe0\x78\xe3\xd2\x92\x26\x1e\x2f\x2f\xc4\xe9\xbf\x59\x09\x05\x33\x27\xb4\x58\x8b\xe2\x9b\xd1\x68\x0b\x32\xe4\x7d\x9b\x77\x4e\xc0\xec\x83\x11\xb6\x78\x0d\x6f\xb4\x2e\xee\x8d\x90\x77\x3a\xe7\xee\xe9\x1c\xb3\x69\x95\x92\x5c\x49\x77\x37\xd6\xa7\xc9\x63\x86\x0b\x32\xc4\x25\x04\xf7\xdc\x3c\xb1\xa5\x9a\xd8\x8c\x94\xad\x89\x9d\x91\x4c\xd1\xc8\x9b\xda\x3b\xf3\xda\x3b\x93\x97\x46\x52\x60\x06\x71\x01\x65\x07\xa6\xe2\x66\x00\xb3\x26\x18\x8d\x19\x42\xb8\xd8\xd9\xd1\xeb\xe0\x1c\x5d\x97\x03\x1a\x9f\xdb\x75\x50\x3a\xeb\xa0\xd9\x67\xfd\x4e\x72\x2d\xdd\x7e\x85\xf2\xc6\xde\x7e\x9c\x8b\xfd\xb8\x44\xd0\x8e\xe5\x74\x9e\xea\x48\x70\x2a\xa0\x21\x24\xaf\xd7\x08\x5b\xf3\xeb\x66\xc8\x8d\xcd\x8f\x48\x9f\xb2\x66\xf4\xeb\x4d\x37\xa5\x5d\xad\xba\x72\xb3\x0d\x79\xf2\x8c\xee\xca\x65\x22\xcb\x57\xaa\x4e\x5b\x42\x8a\x4d\x10\x6f\xe9\x6a\xd5\xf3\xb0\x0f\x1a\x2a\xcb\xab\x55\xcf\x3f\x19\x37\x42\x43\x00\xb8\x46\x75\x08\x7d\xc1\xc8\xb8\x21\x6d\xe9\x0d\x5c\x41\x57\x98\x4f\xe5\x84\x2a\x10\x70\x45\x2f\xd4\x4c\x86\xf8\xcc\x3a\x42\x7c\x76\x8d\xbe\x38\x01\xdd\x26\xb5\x2b\x18\xb7\x11\x58\xb5\xa4\xd6\x48\xe1\x6b\x4f\xf7\x3c\xe9\x0d\xd7\x01\x75\x33\xa5\x91\xf1\x55\xd7\xee\x7f\x7c\xe1\x4e\xb6\x1e\x54\xbf\xd7\x31\x4a\x82\xd9\x9e\x5e\x9e\x79\xe5\xd8\xee\xb1\xf8\x7f\xcf\x58\xb5\x3a\xde\x1a\x2e\x57\x0b\xcf\x79\x63\xd7\x3a\x45\x9b\x6f\x6f\x06\xac\x6d\x31\xe5\xe8\x7e\x36\x60\x09\xc5\x9f\x32\xc0\xac\x79\xf8\xb2\x8e\xfb\xb5\x8a\x72\xed\xc0\x7d\x06\x49\x70\x5a\xb9\x1d\x2d\xe8\x6e\x98\xe0\xc7\xbd\xd6\x38\xb8\x13\x3f\x27\x3c\x09\xed\xd8\x16\x5d\xb3\x41\x95\x82\x9f\x27\xa6\x0a\xe3\xd9\x38\xa1\x6e\x79\xf7\xbd\x09\x1a\xaa\x4c\x4c\x36\x14\x6f\xf1\x0f\x43\xe4\xf8\xa0\xe8\x7e\xb0\xf2\xb1\x34\x65\x66\x83\xd6\x73\x9a\xa3\xcd\xe8\x5a\x35\x35\x04\x03\x1d\xc6\x4d\x03\x7b\x81\x9f\x34\xc4\x1b\x34\xd5\x02\xce\xc4\x55\x06\x70\x01\x3e\x4f\x74\x60\x9f\x78\x42\xb2\x82\x4f\xbb\xc8\xb4\x6e\x03\xd4\xa7\x2a\xa1\x68\x52\xad\xcb\x8f\x13\x29\xaa\xd5\x23\x1d\xd4\xfd\xdf\x66\xca\xe2\xad\x7d\xd0\xd9\x76\x37\x49\xa3\x3a\x19\x23\x7c\xfd\x05\x06\x2c\x5e\x8b\x1a\xe2\x8d\xad\x1a\x18\xd3\xc6\x46\x6e\x37\x41\xb6\x32\xb9\x11\x0c\xb9\x3d\xe9\x90\x4f\x7d\xcd\xe5\xa0\x02\x32\x6e\x21\x32\xeb\xb8\x6a\x36\x16\x57\xa8\x3a\x77\x31\x29\x0d\xbb\xa6\xac\x93\x5a\x52\x0c\x54\x3a\x6e\x6f\xbc\x69\x8a\x2b\xd4\xa6\xd3\x3c\x18\xa1\x5d\x6b\xe1\x65\x4e\xdd\x56\x4d\xd3\x62\x5d\xad\x82\x35\x35\x85\xc1\xa2\x7d\x52\x2e\xea\x8b\x52\x6f\x0e\xf9\x6e\xec\xed\x5d\x54\x0d\x91\x6a\x0b\xc0\xd5\xdf\x71\x92\x37\x14\x30\x4a\x09\xb3\x0f\x08\x1f\x7e\x41\xe0\x27\xa5\x9c\xf7\x6a\x19\x60\x17\x9d\xd7\x85\x2f\xf1\xec\x2d\x36\x34\x35\x2a\x1f\xaa\x42\x3a\xf7\xbd\x0f\x8b\xc3\xda\xd5\xed\xf0\x22\xb8\x20\x9c\x11\x13\xe8\x65\x49\x07\x36\xcc\x82\x75\xcc\x26\x65\x9d\x4a\xf6\xe4\xba\x6c\x83\x28\x9e\xad\x98\x42\x3f\x52\x78\x1c\x34\xc5\xfd\xe0\xad\x38\x93\xdb\x44\x32\xdb\x8e\x7a\x8e\xac\x34\xc3\x2d\x7f\x70\x8e\xbd\xe9\x69\x59\x29\x56\xf4\x0d\x14\x8f\x33\x4f\x70\x13\x56\xd1\xd1\xa3\x31\x32\xe2\x08\xad\xde\xa3\x82\x1d\x4b\x4f\x2f\x8a\x50\x84\xdb\xd5\xad\x1c\x60\xde\x13\xa4\x5a\x47\x7e\x1a\xf7\x62\x3a\xcd\xdd\xad\xac\x78\x84\x7e\x1f\x22\x60\x12\xc2\xd0\xb5\x80\xd0\xba\x4e\xda\xc9\x9d\x6e\x41\xb3\x93\x5d\x67\xeb\xdc\x28\x87\x83\xe7\x68\xef\x6c\xf4\x33\xc3\x94\x97\x82\xaf\x41\x1f\x12\xcc\x1b\xad\xd7\x9b\xe7\x94\x68\xe5\x28\x47\xb3\xc8\x3e\x22\x5e\x52\x4b\xff\x95\xf2\x0c\x23\x7e\x3b\xe9\xf4\xb9\xd8\x6e\x7e\xe2\x21\x1d\x38\xbb\x23\xa6\xe0\x9f\x20\xe4\xa8\x4b\x14\xc6\x5e\x0b\x13\xbe\x46\xfd\x7e\x8f\xea\x76\xcf\x27\xd4\x51\xbf\xb2\xc9\x10\xaf\x52\xa9\x62\xad\xa1\x56\xe5\x8a\x3b\x14\x8d\x93\xa3\x6b\x38\x40\x74\x06\x13\x37\x69\xb9\x12\x60\xfa\xf7\xd8\x1c\xb4\xaf\x73\x7e\x15\x5f\xd3\x8b\x9c\x3f\x7e\x4f\x19\x4f\x7a\xa3\x35\x5a\xe3\xd1\x70\x88\x8c\xa8\xcb\x95\x63\x29\x3f\x87\x6a\x96\xc1\x35\xa6\x79\xa2\xe8\x91\x7c\x93\xd3\xbf\x0a\xe1\x82\x68\xf0\x31\x27\xf9\x58\x8a\x05\x97\xf1\xf5\x1a\xb7\x34\xdb\x40\x5b\xac\x42\x38\x47\x1d\xb6\x5f\xf9\x69\xbc\x3b\xea\x11\x6a\xfd\xb9\x4c\xd3\x08\xb5\x9e\xb1\x45\x22\xae\x48\x26\xc3\x47\xf1\xe9\x30\x4d\x95\x87\x69\x13\x45\x33\x84\x5d\x3e\x82\x40\xa3\x62\x3e\x1d\xc9\x32\x2c\xae\x70\xa9\x15\x28\xa5\x78\xc6\x3e\x96\x37\x1c\x1f\xe6\x10\xc6\x68\xec\x41\x84\x35\x9c\x72\x32\x94\xba\x74\xce\x71\x97\xe4\x03\x2f\x2e\x96\x12\x70\x91\xc2\x4d\x1e\xe7\xa2\x49\xb9\x68\xd2\xda\x2a\x2d\xd0\x81\xa8\x58\xdc\x2f\x44\x33\x7e\xfb\x02\x62\xbf\xc8\xba\x5c\x55\x29\xea\xd3\x6b\xad\x79\x41\x11\x42\xb2\x7b\x57\x4a\x5e\x4b\x21\xf3\x06\x21\xf9\x46\xf4\x01\xdf\xf5\xea\x4d\x21\x58\x71\xa2\x7e\xb8\xd4\x1c\xea\x77\x48\xc2\x63\x4a\xa2\x3d\x1b\x30\x36\xc2\x07\x94\x44\x4f\x72\x0a\xae\xb4\x20\xe1\x35\x25\xd1\xc1\x42\x7f\xbd\xa4\x24\x92\x11\xa2\x74\xca\x11\x25\xd1\x51\x56\xd7\x1f\xca\xca\x94\x79\x01\x69\x9c\xd3\x8a\xe9\xa4\x57\x94\x44\xaf\x32\x76\x46\x75\xc2\x13\x4a\xe2\x65\x5c\x91\xeb\x35\x7e\x4c\xf1\x34\xba\x30\xa2\xea\x3a\x4a\x11\x5e\xc6\x15\x3e\x10\xe9\xc6\x3f\xba\x4e\x7d\x2d\x52\xdf\xd3\x0a\x88\x97\x4a\x3b\x82\x34\x1b\xe1\x4b\x25\xbf\x54\xc9\x4b\x53\xf8\x85\x48\xb1\x67\xac\x4e\x7e\x05\x2d\xc8\x59\x7e\xb1\xbc\xd0\x21\x4d\xa3\x8b\xec\xd2\xf9\x4e\x11\xae\x1c\x85\x8b\x47\xf4\xb3\x4e\xfd\xa6\xdb\xbc\x71\x53\xa1\x52\xec\xeb\x49\xd3\xb3\x23\x9c\x86\xf3\x2b\x96\x5d\xe4\x33\x75\x06\xa8\x6d\xda\x5a\x27\xe2\x3e\x0b\x2e\x43\x15\x66\xa3\xea\x66\x94\xf6\xaa\x49\xdc\x61\x5e\x43\x3a\x8e\x5c\x5c\xf9\x95\x93\x46\x63\x7c\xa1\x44\xd8\x30\x21\x8e\x82\xa8\x23\xa9\x45\xea\xa1\x13\x69\xab\x95\x51\x65\xaa\x04\x8f\x2d\x78\x10\xb8\x64\x8a\x8f\x35\x02\x2d\xc1\x75\x93\x48\x7b\xaa\xa1\xfd\xfe\x13\x78\xa5\xef\x90\x8a\x58\xf7\x63\xe2\xfa\xc1\xcf\xab\xf2\x03\x04\x9e\x90\xb2\x04\x58\xd1\xb7\xf8\x39\xbd\xa5\xbd\x05\xde\x2a\x4f\x6f\xfd\xdd\xd5\xd4\xfb\xfb\xad\x0f\x39\x3f\xbf\xa5\x77\x18\x00\x7b\x1a\x9a\xf8\x56\xc9\xcf\x69\xf5\x21\x17\xe4\x8b\xdf\xfa\x50\xb2\xbf\x8b\x7f\xab\x3f\x07\x91\xb8\xcb\x88\xfd\x27\x26\x57\xfc\x4b\x31\x43\xc9\xb5\x24\x5b\x7f\x50\x72\x3d\xcf\x58\x5e\x9f\x27\xdf\xfe\x6b\xba\xb7\xfb\xdb\xc9\xe5\xec\xfe\xc9\xe5\xfc\x1f\x27\x97\xb3\x7b\xe9\xce\x37\xdf\xe2\xd3\x8a\xb2\x99\x93\x3b\x3c\xb9\x9c\xdd\x96\x50\xb3\xef\x4e\x2e\x67\xdf\x9f\x5c\xce\x04\x74\x76\x72\x39\x7b\x77\x72\x39\x3b\x3d\xb9\x9c\xd1\x93\xcb\xf9\xdd\x93\xe5\x70\x74\xef\xf6\xc9\xe5\xfc\xfb\x93\xcb\xf9\xbb\x93\xcb\xf9\x4c\xa4\x7c\xf7\x0f\xc0\x7a\x46\xab\x8b\x8c\x59\xac\x77\x4f\x2e\xe7\xf7\x01\xe6\x72\x7e\x0a\x10\xf5\xc2\x34\x2b\xdb\xfd\x78\x72\x79\x3a\x3a\xb9\xa4\xe2\xbf\xef\x4f\x2e\xe9\xfc\xe4\xf2\xf4\xce\xc9\xe5\x69\x76\x72\x79\x3a\x13\xe0\x39\xae\x96\x75\x9d\x4b\x94\x27\xcb\xe1\xdd\xd1\x70\x57\xfc\xb9\x7d\x2a\xfe\x1d\x8e\x20\x8a\x1b\x7e\xba\xa9\xb7\x27\xf5\xbf\xa7\xbf\x0a\xef\xc6\x1e\x2b\x98\xed\xfb\x2c\x0b\xdc\xd4\x6b\x09\xb5\xc6\x1f\xbd\x7e\x0f\x77\xbf\xdf\x3c\xd1\x06\xe0\x6b\xcf\xb5\x41\xbc\x71\xba\x87\xbb\xdf\x7f\xea\x8c\x0f\x77\xbf\xef\x9c\xf4\x87\xff\xcb\x3a\x1f\x98\xfa\x0d\xdd\xb7\x67\xc8\x1b\xda\xd4\x38\x57\xa7\x8a\x3e\x15\x7e\x13\xb7\xa7\xba\x8e\x39\xce\x11\x04\x04\x69\x1e\x0c\x46\x5d\x17\x02\x62\xec\x9f\x67\x55\x36\xe3\xe0\x7f\x50\xa7\xfd\x72\x9e\x73\x7a\xbc\xc8\x66\x74\x22\x98\x39\xe2\x46\x09\xd0\x7d\xdb\xdb\xfd\xed\xd6\xff\x6d\x69\x5b\x13\x19\x8e\xd2\x9d\x6f\x54\xf0\x00\xc1\x45\x7e\x21\x0e\x84\x75\x70\xb6\xac\x58\x9c\x67\x32\x80\x50\x45\xd8\xa0\x28\x67\x59\x41\x27\xfa\x47\xd2\x88\x06\xa2\xd4\x6a\xad\xdd\xe4\x73\x00\xbb\x29\x7f\x00\xb5\x4c\xb6\x01\xb2\xe7\xf1\xb4\x92\xd1\x45\x6f\xfd\x41\x27\x7f\xd0\x69\x95\x42\xc7\xb1\x4e\x7d\x4a\x27\x4f\x55\xea\x28\x4d\xc7\xb6\x33\x3a\x58\x6a\xa2\xcd\x5f\xfe\x9d\x7d\x52\x95\x6d\xd5\x35\x05\xeb\xf4\x30\xef\xf7\xe1\x92\xfb\x91\x4e\x3e\x8a\xfb\xab\xec\xa1\x4e\x7d\x48\x27\x0f\x55\xea\x28\x4d\xd7\xeb\xb8\xc2\x0c\xe7\x08\xf7\x7e\x36\x61\x1f\x94\x24\x01\x8a\xb4\xd6\x1a\x9b\x8e\xd2\x84\x4d\x87\x29\x42\x13\x6b\x2a\x57\xe1\x1c\x4f\x55\xb9\x14\x25\x96\x61\x37\x5b\xe2\x2f\x37\x64\x4d\x40\x9d\x57\x6d\x99\xe9\x47\xd9\x2d\xac\xfe\xfe\x92\xf3\x73\xa8\x38\xc5\x47\x32\x05\xad\x2d\xd2\x5f\x3e\x0d\xa9\x1a\x2b\xec\x7f\xb6\xab\x50\x19\x6e\x4d\xbf\x76\xd5\x24\xd9\x44\xb9\xbd\xf1\x01\xb5\x3e\x6d\x5d\x8b\x26\xe6\x05\x03\xc2\xb9\x16\xd6\xe1\x8c\x54\x13\x75\xf1\xb4\x33\xd8\xf3\x98\x7e\x41\x20\xfc\x94\x0c\xad\x56\x36\x9e\x10\x21\x24\x9f\x98\x01\x4f\xec\x9c\x1c\x0d\x66\x32\xda\x11\x66\x78\x9a\xe3\x2c\x75\xfb\xf3\xcd\x36\xfd\x01\x5d\x2e\x4b\xaa\x18\xb2\xaf\x4a\xbd\x11\xa8\xa1\x29\xd1\x48\x3d\xd1\x3f\x92\x29\xd3\xab\xa0\xa5\x88\x56\x35\x14\xd1\xa4\x3f\x7b\xe7\xde\xdd\x8b\x73\xb2\x3b\x22\x7a\x74\xcc\x2d\xb8\x40\x48\x0b\xe0\xa5\xe8\xb1\x94\x7a\x6a\x65\x53\x4f\x2d\x3f\x8d\x73\x64\x2f\x8d\xce\x40\x30\x9e\xe5\xac\x16\x23\xa1\x87\xde\xb4\x33\x70\xcb\x34\xc3\xf4\x13\xf5\xc2\xfc\x89\x6e\xc3\x8b\x5a\x5b\x28\xcb\x1a\x42\x59\xb0\xc1\xd0\x2a\xe2\x84\xfa\xed\xef\x7a\x3e\x6b\x2b\xe9\xff\xec\x48\x6e\xae\xf7\x60\x59\x66\x4c\x71\xd9\xc9\x74\x74\x2f\xc5\x8f\x72\x46\xab\x7a\xbf\x58\xbe\x4b\xa6\xa3\xbb\x78\x74\x1f\x8f\xbe\x17\xa9\xf5\xac\x7c\x4f\xab\x64\xaa\x12\x7e\xda\x7f\x68\x7e\x1f\x66\xb4\xe6\x55\x99\x4c\x47\xb7\xb1\x49\xaa\x39\xad\xf6\xb3\x6a\x2e\xa0\x52\xfc\x36\xaf\xb3\x64\x3a\xba\xa3\xf2\xd7\x9e\x42\xba\x6e\x90\x0d\x92\x33\xa8\x97\xef\x6a\x15\xf6\x46\x87\x25\x18\x61\xfd\x13\xa1\x96\xd8\xc5\x55\xf7\x23\x43\xcc\xc8\x70\xcc\xac\xb5\x0d\xdb\xd9\x41\x7c\x27\x8c\x9f\x61\xb6\x33\x42\x3a\x8c\x83\x38\xb1\xa4\x7e\xd7\x10\x8f\xf0\x6d\x7c\x07\xdf\xc5\xbb\x77\xf1\xee\x1d\xbc\x7b\x1b\xef\x8e\xf0\x50\x86\x4e\x60\xc4\x36\x6b\xcc\x7e\x10\xb5\xed\x92\xdb\xa2\x8e\x6a\xba\xa9\x96\x74\xac\x74\x98\xfe\x36\x1a\xea\x3e\x8c\x86\x84\xc4\x39\x19\x0d\x77\xe1\xec\xce\xc9\x10\xe1\x7c\xed\x95\x1e\x62\x5b\x1d\x42\xc4\x76\x44\xb9\xf0\xe5\xc8\xa1\x8c\x95\x17\xbd\x43\x56\xf2\xed\xbf\xe2\x7b\xc3\xd1\x3f\x56\xf7\x86\xb7\x87\xab\x7b\xc3\x3b\xff\x58\xdd\xbb\x3f\xba\xbd\xba\xf7\x8f\xef\xef\xac\xee\xdf\x19\xde\x5d\xdd\xff\xee\xde\xf7\xab\xfb\xdf\xdd\x1f\x89\x7f\x6e\x8b\x7f\xee\xac\x86\xf7\x45\xc6\x9d\xef\x87\xe8\x64\xbe\xf3\xcd\xb7\x3a\x50\xdb\x84\x93\x48\xcd\x78\x94\x7c\xfb\xaf\x7b\xd3\xd1\xee\xbd\xb4\x91\xab\x27\x5f\x00\xdc\xf5\xf2\xc4\x42\x10\xa9\x77\xa6\x77\xbf\xf3\x4b\x35\x56\xa3\x00\x8a\x27\xc9\xed\xd1\x9d\xd1\x6a\xf4\x8f\xe1\x70\x75\xe7\x1e\xf2\xe0\x7f\xda\x7f\x08\x88\x20\x28\xef\x70\xf7\x5e\xba\x9a\xde\xff\x47\xea\xc3\xd8\xc5\x2c\x40\xef\x0b\xd0\xd1\x68\xe5\x20\x02\xdf\xa0\x91\x5e\xdd\x11\xc2\xed\xcb\xa2\x11\xd8\x29\xdd\x3c\x5c\x48\x72\x96\x23\x5c\x92\x5c\xcb\xd0\x73\x4f\x6a\xee\x08\xcd\x1b\x17\xef\x1c\x17\x4d\xf9\x4f\xa6\xe8\x60\x8d\x67\xe0\xbc\x9a\x44\x11\x9e\x93\xc3\xb8\xb0\x54\xbe\xdf\x2f\xa7\xce\x67\x3a\x99\xfa\xdf\x69\x52\x0c\x66\x15\x9d\xe7\x5c\x8c\xfa\xeb\xab\x05\x75\xde\xe3\xe7\x8a\xa4\xd4\x64\xde\xa2\x97\xe7\xa4\xb6\xf4\x72\x46\x7e\xa2\x71\xa6\x56\x1a\xe6\xd3\x73\x71\x9d\xae\xe2\x0c\x11\x72\xde\xef\xb3\x38\x43\x78\x49\xce\xf1\xcc\x27\x3e\x0b\x74\x3d\x1f\xd0\x78\x61\x89\xcf\x5c\x13\xcf\xde\x2c\x48\x3d\x4d\x43\x71\x81\xa7\x19\x5e\x6e\xa6\x99\xcf\x1c\xe6\x57\x81\xfd\x93\xc6\xea\x44\xd1\x41\x31\x0c\xf4\x3f\xdb\xd0\xf6\xc4\xa1\xfa\xec\xf3\x19\x13\xe6\xb3\x1e\xf4\x06\xd6\x03\xa2\x22\x6d\xe0\x12\x54\x83\x3f\x0e\x4a\x56\x5c\x3d\xca\xcf\x72\x8e\x8f\x06\x73\xf1\xd7\xed\x16\xdf\x16\xcb\xbb\xac\xce\x67\x8f\x2f\xb2\xbc\xc0\x47\x03\x2a\xfe\xba\x68\xd8\xb6\x68\x04\x29\x99\xf1\x1f\xe9\xe5\x7e\x59\x94\x15\x3e\x1a\x9c\xab\x9f\x2e\xb6\xaa\x0b\x9b\x7f\x8c\xb7\x06\x96\x21\x63\xcc\xd4\xb3\xe7\xad\x17\x73\x7c\xe2\x2e\x01\x13\xec\xdc\x39\x41\xbd\xc1\xb6\x4d\xca\x79\xc3\x2a\x71\xa4\xbd\x1c\x31\x75\x3b\x78\x10\x25\xf0\xf7\x87\x28\xa9\x08\xfd\x81\xbb\x81\x47\x1f\x10\x9d\x49\x64\x2e\xe1\x81\x53\x31\x33\x75\x70\xd1\x47\xae\x8d\xa7\x2a\x1d\xe5\xac\xbd\x8f\x37\xc8\x71\xed\x0b\x80\x1f\x21\x52\xe2\x15\xdb\xa2\x32\xf1\x2d\x55\x91\x7e\x1f\xd2\x54\x98\x34\xed\xc3\x0a\xb5\x77\x0f\x13\xec\xa7\x06\xc8\x53\xd9\xcc\x4c\x56\xe5\x61\x94\xfc\x0f\x23\xe4\x68\x70\x91\x33\x91\x35\xc9\x79\x9c\xe1\x1c\xf3\x41\xa9\x62\x78\xae\x56\x62\x58\x50\x92\xf3\x38\xc7\x99\x9f\xf1\x80\x44\x68\x8b\xfa\xdb\x1b\xd7\x0c\x6a\x71\xc3\xca\x04\xe1\x17\xc5\x47\x83\x8b\xec\x52\xb4\xcf\x9d\xf4\x72\x9b\x75\x88\x5f\x9a\xc8\x0e\x3d\x77\x29\xae\x56\x7a\x01\x4a\x4a\xf6\x40\xf3\x4d\x1d\x6c\xed\x45\x76\xf9\x5c\x92\xbc\x20\x3b\x67\x5b\x55\x7f\x59\xab\x9c\xb0\x90\xfa\x71\x75\x8b\xa6\x49\xa9\xf2\x4d\x4d\x9b\x6d\x3d\xd8\x72\x31\xb8\x65\x97\x5f\xd6\x2d\xcd\x83\x68\x33\x57\x25\xd8\xbe\xa9\x67\x39\xdb\x6e\xd0\xe7\x5f\x7d\xd0\xb7\x68\xda\x76\x83\x7e\xbe\x55\xd3\x8e\x64\x08\x3d\x7b\xcc\x7a\x44\xa3\x32\xe4\xc2\x9c\x4b\xfa\x91\x44\xde\x86\xd4\x1d\x1d\x57\x08\x67\xca\x86\x2f\xd3\x4a\xd7\x84\xe9\x5f\xfd\xbe\xf9\x39\xcd\x8d\x2f\x95\x49\x28\x31\x69\x3d\x0e\x19\x28\x0b\x0f\xf1\x9d\xf4\xc7\x33\x7a\x65\x6b\x7a\x46\xaf\x9c\xca\x9e\xd1\xab\x60\x7d\x7e\xfa\x86\x2a\x9f\xd1\x2b\xaf\x94\x0c\x2c\xd5\x32\x08\xe9\x51\xdb\x53\xfb\xfb\x19\xbd\x72\xdc\xec\x80\xa6\x83\x1c\x3a\xed\xf1\x06\x8d\xa9\x1d\xab\x40\x78\x4a\x36\x61\x09\x18\x2e\xc9\x87\x89\x98\xa1\x09\x9b\x72\x08\x53\x64\x0a\xae\x56\xb1\x83\x04\xd6\x96\xa8\x02\x61\xb7\x19\x24\x8a\xac\x75\x92\x20\xb3\xd6\x9b\x53\x2f\x6f\x46\x9a\x76\x17\x9b\x46\x87\x33\x3c\xad\x36\x33\x42\x8b\xad\x96\xdb\xab\xae\x9d\xa0\xd7\xff\x6a\x05\x61\x57\xcd\xc9\xd3\xb1\x43\xbc\x47\xae\x20\x94\x20\x5e\xde\xd3\x57\xc7\x7e\xaa\x32\x76\x46\xfd\xbd\xe4\x21\xc7\x0d\x34\xde\x1e\x3b\xfd\xca\x1c\xc9\x9b\xc5\x22\xc8\x91\x2c\x75\xfa\xcd\x1c\xc9\xfb\x4f\x6a\x52\x83\x6f\x90\x2d\xf3\x05\x30\x7a\x40\xbd\x06\x55\xf4\xaf\x65\x5e\xd1\xb9\x68\x4f\x47\x43\xce\xb6\x5a\x10\x2f\x68\x5b\xee\xe2\x59\x57\x31\x47\x97\x08\x14\x59\x02\x1c\xb2\x03\x02\x76\x4f\xad\x95\x5c\x79\xe3\x36\xde\xb0\x8c\xaf\xbe\x60\x46\x83\x4d\x03\x91\xe2\x31\x9d\x95\x6c\x5e\x4f\x3e\x0e\x78\x7e\x41\x41\x06\x27\x53\x12\x99\xe2\x0f\xae\x48\xb9\x79\xa2\x2f\x6e\x38\x54\x43\x6a\x5d\x1f\x07\xcb\xaa\xc0\x95\x2b\xf1\x02\xd9\xda\xb2\x2a\xac\xc0\xd5\xf5\xa0\x11\xca\x92\x9e\x34\x46\x89\x42\xe7\xba\x9f\xb8\x0d\x89\x20\x24\x3e\x2f\x6b\xfe\xc6\xcf\xbd\x03\xb9\x10\xb9\x3d\x63\x54\xe4\xae\xed\x95\xa9\x82\x7b\xd1\x91\xc0\xa8\x54\x63\x9c\xbe\xbe\xfb\x92\x59\x69\x6b\x85\xf6\x46\x70\xfd\x94\x85\x7f\x3a\x7e\xf9\x62\x00\x04\x04\x42\x18\x90\x5e\x4f\xd0\xe2\xa6\x4f\x1a\x66\x03\xad\x8a\xf2\x36\x66\x5d\x78\x7f\xfc\x51\x97\xac\x73\x0a\x45\xbd\xfb\x9c\xc4\xcb\x38\x27\xd7\x6b\x7c\x34\x38\x83\x40\xaf\xd5\xeb\xf3\x4c\x8c\x40\x41\xeb\x5a\xfc\x44\x78\x19\xe7\xce\xb7\x0f\xa8\x73\x9d\x24\x65\x8f\xe3\x14\x51\x29\x4d\x4c\x16\xb0\x5d\x1a\x14\x76\xcc\xc0\xef\x35\xee\x37\xb1\xb9\x82\x20\x7b\xc1\x9f\xb4\x65\xc0\xdc\x91\x01\x1b\x2d\x3d\x9c\x3b\x02\x60\xa3\x57\xa0\x86\x68\xc2\xad\x64\x38\x7c\xa1\x51\x0a\x04\xca\xc4\x51\xd5\x84\x02\xab\xdd\x36\xd7\xd5\x30\x34\xde\x39\x62\x8a\x70\x6e\xf5\x0b\xf5\x0f\xdd\xc8\x8c\xec\xf3\x29\x4b\x71\xa1\x22\x01\x56\xfd\x7e\xee\x69\x1b\xf9\x6a\x42\xa5\x63\x8a\x6f\x64\xb8\x39\xc2\x75\x5b\x32\x2e\xa3\x27\x22\x3c\x53\xce\x6b\x4a\x69\x45\x47\xde\x72\xb8\xd7\x97\xbb\x23\x5c\xe3\x0c\x33\x5c\x20\x84\x67\xa1\x3a\xcb\x9d\x91\x57\x62\x47\x94\x60\xaa\x44\xe1\xd8\xe6\xb5\xd7\x7c\x48\xc3\x0c\x5d\x87\x35\xb3\x3a\xd5\xcc\xd0\x1a\x61\x4f\x27\x8d\xa3\x35\xbe\x3d\x1c\xa2\x75\x5c\x20\xdc\x1b\x11\x42\x02\x42\x15\xf7\x5a\x16\x62\x22\xd4\x9c\xc1\xa5\x50\xa0\x38\x16\x8b\x2e\x17\x27\xc1\x97\xdc\xf0\x8e\xb9\xa3\x77\x12\xbc\x0a\x37\x6e\xc8\x1c\x75\xde\xe2\x6f\x79\x3b\x25\xa9\x88\x1b\x44\x5f\xb3\x25\x2e\x13\x82\x5c\xba\x67\x37\x5e\xb8\xe4\x83\x0d\x25\xdb\x1b\xb4\xa3\x76\xb2\x45\xf5\x1b\x31\x3c\xf0\x31\x58\x41\x84\xa3\xdb\x63\x47\xf7\x2d\xd7\x92\x2c\xcf\x5d\x0b\xe9\x8d\x70\x4d\xa8\xab\x05\x2f\xa6\xb5\xee\xf7\x1d\x8d\x75\x65\x74\xea\xd9\xf8\x8e\xe3\x52\xcc\x3b\xc7\x33\x3d\xb9\x08\xf5\xfb\x33\x13\x07\x4b\xff\x02\xb3\xe3\x42\xdb\x96\xea\xb6\x95\xb6\x61\x7f\xde\x70\x2c\xee\xe9\xbb\xa6\x4b\x4b\x9d\xa3\xe6\xf7\xcf\x28\xaf\x49\xa7\x83\xe6\xc3\xb6\x68\x9a\xa4\xda\xc1\xf1\xe3\xa7\xe2\x70\x0b\x1f\x7e\x39\x1f\xc8\x3b\x14\xef\xe0\x59\xde\x5c\x91\x89\xf4\xb8\xe6\xa4\x4c\x86\x09\x73\xaf\xd0\x56\x86\x61\x61\x75\x8a\x84\x35\x32\x8e\x86\x6c\xc4\x41\xb3\x5a\x49\x7f\x53\x06\xd6\xb4\x4f\x93\x3d\x27\xcf\x3f\x8c\x67\xe7\x65\x3e\xdb\x82\xa3\x7a\xbe\x15\xc7\x7a\x10\xe0\x58\xbd\xe3\x66\xe3\x5b\xa8\xf7\x02\x0a\xd2\xb6\xd5\xca\xbc\x6d\x6a\x56\x22\x70\x13\x9b\xe7\xa7\xa7\x14\x42\x04\x38\x57\x95\x20\x01\xb4\xfd\xb9\xec\xea\x0f\xed\xf7\xe3\x1e\x9f\x3e\x86\x30\x0a\xd3\xc7\xe9\xf4\x68\xc0\xe4\x2b\x70\x8a\xfa\xfd\x25\x6c\x5f\x08\xcc\x46\xcd\x79\x0e\xeb\x4c\x01\x69\xa5\xe5\x4f\x65\x86\x97\x54\x63\xb0\x1c\xa5\xd6\xb1\x78\x24\x03\x34\x0a\x86\x79\x36\xa3\x0b\xae\xcc\x2f\xbc\x79\x54\x85\x6f\x9e\xc8\xdf\xbe\xfc\x5a\xf6\xb7\xdb\x3d\x32\xf4\x6a\xa7\xef\x69\x37\x4b\x67\xaa\x7e\xfc\x29\x55\x87\x05\x83\x50\x35\x4c\x43\x5e\xab\xc7\x79\x8f\xc9\x0c\x5c\x62\xcb\xf9\xdc\x6b\x9a\xd3\xa0\x83\xad\x1a\x04\x32\x20\xad\x07\xce\x36\xb2\x76\xfe\x92\xb6\xac\x1d\x73\x1f\x84\xec\x32\x67\x83\x79\xfe\x3e\x9f\x53\x36\xd7\x9d\x6e\xf2\x76\x72\xdc\x83\x77\xce\x7e\x3f\xff\x61\x88\x56\xab\xf6\x5a\x72\xde\x2f\x50\x53\x91\x5f\xdf\x1f\x21\xca\x6b\x45\x46\xe3\xea\x01\x39\xcc\xf8\xf9\xe0\xb4\x28\xcb\x2a\x86\x9f\xf5\x5f\xf0\x9a\x80\xfa\xfd\x98\xfe\xad\xea\x91\xe1\x6a\x15\x57\xe0\xf0\x34\x66\xa4\x37\x44\x98\x7e\x5b\xf5\x08\xa9\xfa\x7d\xfa\xad\x97\xde\x63\x08\x8d\xab\x1d\x32\x32\xeb\x87\xad\xe3\x1c\x9b\x47\x4f\xdd\xf4\xae\xa9\x3a\xcd\x20\xd2\x7a\xc7\x6c\xbd\xfe\x92\x8b\x8e\xae\xfb\x6f\xa3\xe1\x90\x90\xa1\xe6\xa8\xff\x76\x17\x3e\x13\xf3\x49\xc8\xb0\xf1\xe0\x41\xb3\xc5\xaf\x34\xab\x6e\x5e\xde\x2f\xb7\x22\x91\x8f\x3d\x12\x69\x95\xc5\xbb\xd4\x2a\x1c\xa5\x69\x64\x6e\x66\x85\xab\xf7\x2e\x6d\xb3\x1b\xda\x13\x9a\xfe\xd7\xe5\x05\x0d\x3a\xcd\x03\x37\x79\x9a\x8b\x8c\x80\x25\x8a\xd6\xe3\x4d\x5a\x1a\xe0\x55\x13\xe0\x08\x21\x45\xbc\xbd\x26\x46\x2f\xa8\x8a\x91\x15\xc5\xcb\x53\x7f\xae\x37\xd0\xeb\xa3\xff\x09\x83\x8b\x99\x38\xc6\xcc\x13\xd8\x2f\x39\x3f\x7f\x5d\xe5\x17\xb1\xac\x35\x27\xbe\x9f\x19\x43\x97\xc2\x73\x61\xbb\xd3\x81\x93\x10\xc2\xd6\xe0\x16\xb9\x9d\xab\x71\x83\x71\xd2\x7f\x6f\x0e\x4b\x46\x3f\x61\x0e\x5f\x7c\xca\x1c\x06\x08\xe1\xff\x3f\x81\x5f\x30\x81\xc1\xf9\x63\x9f\x36\x81\xaf\xb6\x7d\xb2\xbe\xc8\x66\x07\x73\x78\x20\xf4\x74\xe7\x9e\x6c\x5b\x3e\xab\x67\x79\x8e\x8f\xe4\x5f\x17\xc3\xa3\x6d\x31\xcc\x33\x9e\xbd\xa9\x04\x0e\xf5\xcb\xc5\xf2\xc7\x17\x30\x22\x37\x1d\xb7\x2a\xf5\x07\x32\x34\xbf\x1f\x90\xfb\xf7\xee\xdd\xb9\xd7\x71\xe8\x2d\xca\x8a\x77\x1d\x79\x4f\xb7\x6b\x68\x07\xcb\x6d\x96\xad\x34\xd2\xc2\x91\x7a\x5b\xae\x9c\x00\x51\xb6\x3b\xd5\x74\x98\xe2\x8f\x83\x22\xd3\xcf\xe3\x3a\x79\x04\xc9\x25\x3b\x0b\x3d\x2b\x1f\x89\x02\xcf\x4b\x76\xb6\xf5\x22\xfa\xf8\x25\x7d\xfa\x77\x2a\x1c\x36\x9f\x43\xa5\x16\x57\xec\xdf\xa4\x76\xb5\x24\xc9\x88\x94\x50\x8f\x14\x5f\xb8\x0d\x29\x9b\xd7\x82\x32\x7c\xb2\x56\xe2\xc3\xff\x69\x63\x89\xcb\xae\x61\x1c\xda\x01\xd3\x03\xce\x06\x79\xfd\x8a\x4a\xf5\x96\x7e\x5f\x95\x2b\x91\xaf\x7d\x42\x34\xc2\xa2\x91\xb1\x5a\xf5\x7c\x04\x65\x7b\x22\x6a\x39\x11\xf5\xb6\x13\x51\xf3\xac\xe2\x9f\x37\x15\x6f\xbe\x80\xa6\x04\xaf\x33\xbe\xa0\xd2\xea\x48\x8e\x7a\x44\x9c\x63\xb7\xc7\xec\x01\x05\xfd\xc8\xfc\x34\xa6\x7f\x63\x82\x71\x05\xf1\xfb\xd8\xf3\xb8\xd8\x10\xc2\x87\xe8\x4f\x95\x5f\xd0\xd6\xb3\xb9\x47\x86\xfe\xda\x96\xea\x16\x19\xc7\x40\x11\x72\xbe\x9c\x7b\xaa\x0a\xbf\x6c\x8d\x42\xd0\x92\x23\xf8\xd3\x42\xf2\xeb\xd6\xcb\x3d\x78\x8d\x32\xaf\xf2\xc6\x6f\x1a\x08\xe8\xf4\x06\xd0\x39\x37\xfa\xcd\x04\x8d\xde\x78\x88\x95\x5a\x21\x8a\x79\x63\xd9\x75\x79\xcf\x14\x05\xf5\xb2\x73\x9f\xce\x57\x2b\xfb\x90\xef\xc8\x73\x3d\x08\xa9\xc4\x5d\xb6\x9e\x39\x37\xad\xc9\x6f\xbe\x6c\xbc\x82\xd7\xce\xcd\xcf\x07\x4a\xa7\x5d\x3d\x1f\xf0\xd6\xf3\xc1\xd4\x7f\x3b\xd0\x92\xd1\x26\xbf\x86\x4b\xa3\x18\xdf\xf5\x56\xc0\x91\x56\xba\x3c\x8c\xab\x86\x2f\x23\x70\x77\xd7\x44\xca\x09\xb5\xf4\x9e\xf7\x48\x0e\xaf\x05\x56\xd9\xcd\xf5\x8e\x54\xa7\x86\x3d\x73\x00\x4a\x75\x91\x74\xc1\xb4\x0c\x36\x94\x3a\x3d\x1a\x2c\x59\xfe\x97\x98\x27\xfc\x39\xa5\x26\xae\x19\xf7\x06\x27\xd5\x0e\x8e\x1e\xf1\x50\x82\xa4\x44\x37\x9f\xde\xd4\xbf\xd0\x00\x80\xd3\xeb\xd5\x2a\x93\x52\x65\x0f\x02\x25\x45\x20\x55\x2f\x13\x3c\x0b\xb1\xb5\x4b\xb5\xa5\x28\x59\x76\xb3\xb5\xf3\x26\x5b\xbb\x40\xd7\x4b\x5f\x51\x75\x09\xfb\x29\x0b\xbe\xea\xd8\x27\xdd\x4f\x79\xd7\xe1\x9b\x3c\xcc\x13\xbd\x76\xd4\x70\x6c\xff\x08\xc4\xcc\x23\x50\x86\x0b\x29\x1c\x3c\x17\x44\x3a\x3f\x8d\xd9\x20\x9b\x6b\x73\x59\x2b\xf4\xeb\xf7\xe3\xf3\x86\x11\x18\xae\x70\xde\xf6\x6d\x6d\x1e\xd4\x18\x92\x7b\x4a\x36\x76\x77\xd4\x23\x59\xbf\x1f\x6b\x9f\x5d\x61\xb3\xfc\xac\x47\xb8\x79\x2b\xa0\x60\xab\x1a\x6c\x8d\x54\x2f\xd4\x27\x20\x2e\x10\x5a\xc7\x0c\xd7\x38\xc7\x15\x2e\xe5\x4b\x5c\xef\x5c\x4d\xf4\xf5\x7b\xef\x5c\x91\x8b\xb8\x71\xa4\xc4\x40\x6d\x5a\x2f\xc8\xa5\xa6\x8a\xe5\xe0\xfd\x7a\xa3\x19\xc6\xbf\x49\x83\x03\xf7\x1a\x62\x1f\x56\xf2\xc7\x17\x0b\x7e\xb5\x41\x89\xe3\x67\x6e\x5f\x10\x2d\xbf\x2c\xee\x03\xf9\xe2\xed\x5d\xe8\x28\x77\x03\x2b\xb9\xde\x12\x6e\x8e\xae\x04\x3c\x12\xd7\x0a\x6f\x0f\xc8\xed\x7b\xf7\x1a\xbb\x22\x97\x31\x86\xf2\x56\x8c\x21\x73\xf4\x5b\x4d\x6c\x77\xd8\x5a\x6d\xbd\xef\x6a\x61\x6f\x75\x47\x7f\xdd\x2d\xe7\x17\x3c\xd9\x7e\x3e\xaf\x26\x8d\xdb\xc7\xb7\x11\x4a\xcc\x4a\x00\x91\xa8\x32\xf0\x27\xa4\xa4\x83\xb7\x77\x27\x3f\x73\xb8\x82\xa0\xa4\x91\x73\x7f\xf2\x4c\xe7\x68\x90\xd5\x4a\x27\xc9\x7d\x24\x6b\x84\xb7\xe8\x38\x27\xee\xf5\x26\x6e\x57\xd3\xbc\xd9\xcc\xf2\x79\xf5\xf6\x6e\xa0\xda\x30\xe4\x7d\x94\x74\xa1\x70\x2f\x87\x7e\x11\x84\x70\x58\x80\x92\x2f\xb6\xbe\x37\x51\xf6\x35\xee\x82\x9e\x1e\x15\x76\x74\x17\xe3\x4a\x34\x77\x59\xe7\x0b\x29\x0b\xb1\x2c\xa7\x20\x3a\x6a\x12\xa3\xee\xc0\x1a\xb3\xf3\xac\xda\x2f\xe7\x74\x8f\xc7\x43\x1b\x5b\xe3\x07\x12\xed\x45\x7e\x5e\xbf\xcf\x1f\x90\xe8\xb7\x46\xea\x84\xef\xb6\x20\x77\x46\xc3\x84\xae\x91\xf2\xe3\x3b\x1c\x97\x0f\x32\x6b\xbb\x53\x6a\x7f\xff\xb5\x35\xaa\xc9\xa6\x65\x8a\x47\x43\x34\x2e\xd5\x3b\x41\x5c\xff\x1f\x72\x1b\xe1\xfa\x87\xef\xc5\xef\x5d\xf2\x3d\xc2\xc5\x0e\xa9\xd7\x39\x89\x0b\x12\x8f\x86\xbb\xc5\xdf\x46\x43\x24\xfe\x23\x24\x9b\x5a\xec\x69\xb7\xc8\x0b\x86\x68\xeb\x49\xe3\xff\x81\x49\x3b\xab\xf2\xb9\x9e\xb3\xe8\xe9\xab\x83\x47\x89\x38\x44\xe3\x8a\x54\x83\x8a\x2e\x8a\x6c\x46\xe3\x6f\x4f\xea\x6f\xcf\xb0\x98\x3e\x93\xb2\x2b\x13\x9c\xfb\xd9\x3d\x19\x23\xa6\xd2\x29\xf7\x10\x1a\xdb\x35\x10\x0d\x47\xb7\xef\xdc\xbd\x77\xff\xbb\x7f\x7c\xbf\xf7\x70\xff\xd1\xe3\x27\x4f\x7f\x3c\xf8\xe9\xd9\xf3\xc3\x17\x2f\x8f\x7e\x7e\x75\xfc\xfa\xcd\xdb\x5f\xfe\xf9\xeb\x6f\x11\x2e\x88\x31\x43\x29\xcd\x4e\xc4\xb5\xfb\xc6\x50\x7c\x7b\x5b\xf0\x6e\xc3\xf1\xec\x41\x39\x9e\xed\xec\xa0\x9a\xc4\xb7\xff\x4f\x5c\xaf\x56\x05\xfa\x5b\x5c\xec\x8c\xd0\x4e\x66\x0e\xb7\x0a\x96\xc4\x1e\x8f\x67\x08\xa1\xbf\x15\xe3\x9c\x8c\x08\x11\x33\xd8\x35\x3f\x62\x34\xb6\x9e\x1e\xd6\x35\x3d\x1d\x9a\x33\x1d\x46\x06\xe1\xe3\x66\x83\xa1\x81\xb2\x1a\xd8\xc6\x92\x60\xd2\xa5\x2b\xe2\x9c\x49\xea\x09\x72\xde\x50\x0f\xaf\xd8\x7f\xc0\x00\xc3\x25\x02\x13\x43\xed\x13\x41\xed\x4d\x3c\x0c\x31\x4c\xd0\xd7\xd1\xf7\xdf\x0d\xf1\x10\x8f\x30\x9f\x0e\xd3\x89\xf8\x27\x19\x62\x3e\x1d\xa5\x60\xb9\x0e\xbf\x6f\x8b\xdf\xb7\xd3\x64\x88\x04\xd7\x2f\xd8\x28\xcf\x34\xc1\x73\x98\xa2\x67\x03\x7f\x8a\x89\x87\x58\x39\x3e\x33\xd4\x3e\x17\xf5\xe8\x6f\xa9\xa1\x28\x75\xf2\x6e\x52\xee\x19\xeb\x4d\xfd\x39\xca\x61\x19\x8b\xed\xbb\xa1\xbe\x8b\xe1\x4c\xa4\x87\x0d\x47\xc4\xc8\x4d\x2a\xd6\x61\x38\x52\xb1\xcf\x32\x1c\xd9\xa8\x54\x54\xde\xb0\x99\x0a\x66\x2d\x19\x5e\xc3\xb0\x39\x06\x1a\x5b\x97\xcd\x2e\x9b\x65\x67\xdb\xd1\xd8\x8d\x3c\xa1\xab\x6c\x17\xd2\xe5\x7d\x5d\x49\x56\xb6\x83\x15\x5c\x7e\x4a\x13\x9a\xea\x05\x17\x59\xfd\x67\xb7\x6e\x01\xc3\x12\x02\x81\xf7\x2a\xa9\x20\x39\x67\xe4\x7a\xef\x51\xf2\xed\xbf\xe2\xbd\x47\xd3\xe1\xee\xf7\xe9\xf5\xed\x35\x3a\x99\x5f\xff\x63\x3d\xdd\xdb\xfd\x0d\x12\x46\xb7\xd7\xdf\x7c\x8b\xf7\x1e\x03\xd0\x63\x17\xe8\xce\xfa\x64\x7e\x3d\xba\x0f\xd9\xcf\x21\xfb\x79\x17\x0e\x09\xf4\x1a\x80\x5e\xbb\x40\x2a\xe7\x37\xc8\xf9\xcd\xe4\x98\x92\x77\x45\x1d\xb7\x87\x02\xe8\xe1\x9e\x00\x7a\xb8\xd7\x2e\xfe\x10\x1a\xf7\xd0\x6b\x9c\x6c\xf6\xc3\xa7\x90\xf3\xd4\x43\xac\xb0\xde\xb7\xed\xfb\x07\xc0\xfe\x08\xb0\x3f\xb6\x60\x6d\x37\xee\x02\xdc\x2b\x80\x7b\xe5\xd6\x76\xfb\xce\x5a\x42\x8f\x1c\x68\x00\xfe\x15\x80\x7f\xdd\xd8\xb3\x7d\xa8\x79\xff\x47\x17\xe3\xbd\xe6\x0c\xec\x43\xb5\xfb\x5e\xb5\x23\x68\xf8\x3e\xd4\xb1\xff\xeb\xc6\xc1\xdf\x87\x21\xde\xff\xcd\x6b\x35\xd4\xfe\x08\x46\xef\xd1\xe3\x36\xe2\x47\xcf\x20\xe7\x99\x97\x03\x63\xf0\xe8\x25\xe4\xbc\x0c\x8d\xab\xc4\xfa\x18\xb0\x3e\x7e\xdc\x9e\xad\xc7\x30\x27\x8f\x9f\x7a\x2d\xb9\x07\x39\xc7\x90\x73\xdc\x6e\xe3\x93\x03\x91\xf3\xe4\xa0\xdd\x92\x27\xd0\x92\x27\x2f\x03\x39\x30\x60\x4f\xfc\x01\x1b\x3a\xe3\x32\x82\xd6\x0a\xd0\xa7\x0f\x05\xe8\xd3\x87\xa1\xee\x48\x64\x4f\xa1\x3b\x4f\x1f\xb7\xe7\xf1\xb6\xdd\x05\x4f\xa1\x95\x4f\x0f\x36\xac\x20\xe8\xe7\x53\xd8\x2d\x4f\x9f\xb7\xdb\xfc\x14\xda\xfc\xd4\x6b\xf3\x77\xcd\xa9\x7c\x0a\xfb\xe8\xe9\xeb\xd0\x9a\xb2\xcd\x82\x71\xfb\x11\xf0\xfd\xe8\x8f\xc1\x77\x90\xf3\x06\x72\xde\x78\x63\x0d\x6d\x38\x80\xae\x1e\x04\xba\xea\x8c\xc7\x01\x74\xe1\xc0\xef\xc2\xf7\x90\xf3\x33\xe4\xfc\x1c\x1c\x4b\xe8\xfe\x01\x34\xea\xc0\x36\x6a\x08\xf3\x30\x34\xeb\xee\x00\xd6\xc1\x81\xbf\x0e\x60\xa2\x0e\xa0\xeb\x07\xaf\x1b\xc8\x61\x26\xbd\xb9\x05\xe8\x9f\x60\x6d\xfc\x14\x5e\xa5\x00\xf1\xec\x17\x01\xf1\xec\x97\xee\x19\x53\x70\xb0\x7b\x9e\xfd\xe6\x93\x3f\x5b\xdd\x1d\x01\xf4\x1c\x56\xd1\xf3\x87\x2e\x50\x6b\x46\x9e\xef\x03\xd0\xfe\x86\x1a\x61\x80\x9f\xc3\x5a\x7a\x7e\xb0\x91\x26\x3c\x87\xe1\x78\x1e\xa0\xa8\xcf\x61\x7a\x9f\xbf\xd9\xdc\xe0\xb7\x00\xf4\x76\xc3\x7a\x05\xb8\x43\x68\xf3\xe1\xfe\x16\x3b\xe9\x10\x0e\x93\xc3\x47\x81\x7d\x02\xdd\x3f\x84\xc5\x75\x18\x20\x36\x87\x40\x6c\x0e\x9f\x75\xb5\x78\x68\xeb\x80\xf5\x73\xd8\x24\xc0\x22\x07\xc6\xe3\xb0\xb9\x3c\x60\xc2\xdd\xc1\x93\x15\xc2\x10\x1d\xbe\x09\x2e\xd4\xef\x15\x3d\x07\xb4\x2f\x60\xb1\xbf\x78\x1e\x84\x84\x6e\xbd\x80\x95\xf6\xc2\xa7\x42\x70\x00\x1c\x41\xb7\x8e\x9e\x75\xed\x26\x98\xad\x23\xa8\xe0\xe8\x79\x7b\x33\x1e\xc1\x56\x38\x3a\xee\x3a\x3f\x64\x1d\xd0\xed\x23\x6f\x19\xc8\x9c\x9f\xe1\xcc\xfc\x79\x6f\xc3\x6a\x03\xb8\x57\xd0\xfe\x57\xed\x9d\xd2\x20\x3d\xaf\xa0\x39\xaf\x8e\xdb\xd3\x77\x0c\x35\x1d\x7b\xa7\xf3\xed\xe6\x90\x1f\xc3\x42\x3a\x6e\x2f\x7e\x49\xe8\x9d\x21\x3f\x86\x75\x72\xfc\xb8\x7d\x14\x1c\xc3\xc6\x38\xf6\x8f\x02\xa0\x2b\xc7\x30\xd4\xc7\xcf\x02\x65\x0e\x21\xe7\x70\x3b\xb2\x71\x0c\xdb\xe2\xf8\xed\xc6\x33\xfb\x35\x4c\xd9\xeb\x00\x01\x7c\xfd\x02\x72\x5e\xb4\x9b\xf1\x1a\x16\xee\xeb\x57\x5d\x7b\x1a\x08\xf3\x1b\x18\xc8\x37\xde\x40\x3a\xac\x8a\xac\xe3\x2d\x00\xbd\xdd\x6b\xcf\xc3\x5b\x38\x5d\xdf\x3e\xdd\xb8\xde\xfe\x09\x23\xf5\xcf\x67\x2d\xba\xe1\x38\x65\x39\xff\x14\x4e\xb4\xf1\x0c\x19\x12\xa1\x53\x2b\x31\x98\x9e\xd4\x27\xbb\xe9\xce\xb7\x67\x39\x48\x12\x7c\xa1\x44\x05\x31\xb4\x07\xb5\x8a\xa4\x7a\xbb\x91\x6f\xcc\xca\x6e\xe5\xec\xd6\x9c\xf5\xfb\x73\x08\x83\x04\xbe\x3c\xc0\x41\xa2\x79\x6a\x9d\x95\x4b\xc6\xab\xab\xfd\x72\xde\x7c\x02\xd5\x92\x26\xdb\xa0\x7f\xa9\x41\x0a\xb7\xc9\xb8\x69\x21\x84\xc4\x5c\x35\xed\x2e\xda\xe1\xa6\x95\x77\x91\x23\x10\x81\xc5\xf5\xed\x19\x0e\x3f\xb1\xb8\x72\xa9\xdd\x7b\xf7\x20\xc2\xac\xb8\x49\x7f\x2b\xe6\x00\x7f\xb7\xfe\xf6\x4c\xa0\x9a\x2f\x67\x34\x0e\x5e\x2e\xe5\x03\x6b\x4c\x77\x38\xfa\xdb\xf7\xdf\xad\x45\x6b\x6f\x7c\x99\xcd\xdf\x65\xcc\x7f\x87\x76\x06\x27\x55\xc6\x52\x0b\x46\xae\x3d\xff\x5f\xbf\x50\x2c\x5d\x9d\xfd\x45\xb1\xf2\xfb\x94\xfc\x4a\x31\xf8\x9f\x48\x38\xc7\xda\x7b\x44\xc2\x38\x36\x7a\x49\x49\xc5\xb1\xb2\xe6\x4f\x0a\xf8\x29\x1b\x9c\xd4\x1c\x2b\xc3\xf3\x64\x06\x3f\x55\xfa\x9c\x63\xed\x4b\x29\xf9\x86\x62\x63\x84\x99\x9c\x42\x69\xa9\x6a\x9e\x94\x50\x44\x7d\x2c\x39\xd6\x36\xb3\xc9\x39\xc7\x60\x5c\x9a\x2c\x38\xd6\x77\xac\xe4\x3d\xc7\xd6\xc3\x48\xf2\x33\xc5\xe0\x7a\x23\xa1\xa2\x1c\x78\x9a\x4d\xce\x38\x16\x17\xee\xe4\x8a\xe3\x65\x55\x24\x17\x1c\xff\x51\x97\x2c\x79\xc7\xb1\x6b\x82\xf2\xa7\xf7\xa9\x0d\x3b\x7e\xe7\xd8\x98\x9a\xfc\x68\x7f\xeb\xec\x0f\x1c\x4b\x5d\xf8\xe4\x90\x63\xa3\x51\x9e\x3c\xe7\x58\xa9\x56\x27\x97\x1c\xd3\xf7\x94\x25\xbf\x71\x5c\xce\xe7\xc9\x63\x8e\xa5\xbe\x6a\x72\x20\xb0\x49\x2d\xd1\xe4\x35\xc7\xa0\xd8\x98\xbc\xe4\x18\x94\xab\x92\x23\x8e\xa5\x9a\x55\xf2\x42\x0c\xcd\x2c\x79\xc5\x31\xe8\x35\x25\x4f\x38\x56\xca\x49\xc9\x23\x8e\x17\x65\xc5\x93\x3f\x38\x56\xfa\x34\xc9\x53\x8e\xe9\x25\xa7\x0c\xfc\x6a\x07\x16\xa5\xdd\xdc\x56\xc2\xe3\xc8\x13\x9b\xb7\x4c\x83\xab\xfb\xaa\x59\x61\x07\x0c\x61\xd6\xef\xb7\x2e\xcb\xd5\xe6\x67\xe1\xdc\xb5\x00\x37\x16\x85\x43\x9c\xe9\x78\xfa\x32\x88\x2b\x6b\x05\x6d\x2d\x08\xd3\x41\xd0\x21\x44\xae\x1b\xa7\x39\x23\xc5\xb4\xb0\xa2\xd9\xb1\xb6\x2c\x33\x4d\xdd\xf4\x3a\x9a\x35\xb5\x49\x1a\xce\x4d\x64\x50\xdf\xfc\x34\xee\x95\x60\x9f\x9e\xd7\x8f\x65\x38\xf7\xc7\x06\xbb\xa7\x56\x91\x9f\xc6\x65\xbf\x7f\x33\x1c\x08\x28\x79\xf8\x65\xcc\x34\x1c\x57\x78\x9a\x61\xaf\x27\x32\xfa\x34\x8e\xd0\x86\xd7\xb2\x0c\x99\xce\xbd\x0f\x48\x37\xf1\x69\x5e\xd0\xe3\xfc\x63\x30\x88\xcc\x27\xae\x1a\x8d\x6a\xf3\xa2\xd1\x50\x9f\xbc\x66\x6c\x6c\xdf\x6a\x70\x91\x33\x81\x63\x62\x7e\x25\x62\xdd\xf4\x46\x8e\xf8\x9f\x99\xe8\x11\xbd\x38\x23\xbd\x38\x36\xcb\xa6\x44\x83\x5a\x34\xe0\x07\x92\xf7\xfb\xc5\x03\x81\x2e\xbb\x84\x26\x21\x78\x29\x00\xe7\x0b\x21\x71\xb1\x6e\xba\x98\x8a\x02\xe7\xd8\x14\x0c\x0a\x8e\xb1\xd6\xd4\x4a\x3e\x72\x6c\x95\x85\x92\x87\x1c\x3b\x6a\x34\xc9\x1b\xd8\xc5\xa0\xbe\x92\xfc\x25\xa8\xac\xd2\x65\x49\x7e\xe1\x58\x69\x71\x24\xbf\x72\x5c\x2d\x8b\xb0\x73\x70\x3b\x4b\xfe\x1c\xb1\x90\xae\x06\xc3\x95\xb3\xfb\xc0\xc5\x79\x21\x75\x22\x96\x35\x2f\x2f\x04\xcc\x16\x41\x2c\xc5\xf8\x6c\xd4\x69\x29\x65\x94\xca\xb2\x19\xa5\xd2\x1d\xd8\xac\x6b\x35\x7e\xa5\x95\x78\xf3\x2a\xfc\x3c\xaa\x25\x57\xdf\x93\xbc\xa0\xf5\xc4\xfe\x84\xf5\x07\xeb\xc1\xe4\xa8\x9f\x89\x25\x60\x20\x72\x75\xd4\x10\xd8\x74\xe8\x46\x92\x10\xe0\xfd\xbe\x01\x10\xab\x93\x19\xe7\x36\x59\x50\x9f\x52\x74\x43\xac\x46\x0d\x87\xa5\xc7\xc6\xc0\xc8\xca\x17\xf6\xe4\x1b\x8e\xf3\x8b\xec\xec\x93\x07\x39\x2c\x8d\x04\x54\x9b\x07\x1a\x40\x10\x66\x13\x46\x3f\xdc\x3a\xaa\xca\x8b\xbc\xf6\xb8\x1e\xad\xac\x30\xde\x7e\x22\x1c\x4e\xcf\x1a\xa2\xe3\xbc\x79\x98\xe4\x7a\xbf\x67\x08\x17\x24\x1f\x08\x82\x38\x91\x7f\xbc\x77\x66\x49\xd1\x63\x4e\x0a\xe7\x2d\x38\x82\x76\x47\x84\x14\xe0\xb4\xd4\xd3\x4e\x51\x87\x8a\xe8\xd0\x81\x80\x1a\xc3\x32\xf8\x25\x9f\xf3\x73\x62\x7f\x4e\xec\xcf\x64\x88\xe1\xe3\x47\x9a\x9f\x9d\x73\xe2\xfc\x9e\x38\xbf\x93\x21\x2e\x07\x25\x2b\xca\xcc\x53\x47\xe2\xa4\x1c\x7c\x10\x58\x7e\x70\x90\xf7\xfb\xe5\xe0\x1c\x4a\xfd\xe0\xa2\x13\xc9\x00\xab\x88\x5a\x03\x56\xa5\x4a\x58\x4c\x63\xde\xc5\x4b\x8a\x5e\x89\x65\xa5\xb0\x61\x8d\x20\x45\x68\x0d\x8d\x04\xed\x23\xb7\x95\x34\x0e\x22\x50\x05\xea\x6a\x46\xde\xbc\x7a\x3e\x98\x01\xa7\x25\xbd\xb0\xbc\x79\xf5\x3c\xce\x91\x52\x60\x27\xc3\x71\x66\x4f\xfa\x4c\x9c\xf4\x9e\x96\x4f\x6e\xb4\x7c\xf8\x6a\xb5\xa1\xae\x38\xe0\x93\xc2\x93\xc2\x63\xad\xab\x91\xfc\xc4\x71\xbe\x48\xfe\xc9\x31\x3c\xd2\x26\x94\xe1\xb3\x2a\x9f\x27\x9c\x09\x3e\x8b\x26\x8c\x61\xf5\xf4\x90\x94\x0c\xab\x97\x84\xa4\x66\xd8\x95\xf2\x27\x33\x91\x55\xff\x99\x2c\x19\x16\x0c\x78\x72\xce\x9c\xeb\xd5\xe9\x67\xbe\xe7\x1a\xb7\x1d\x72\x59\x0b\xca\xe2\x7a\xd4\x77\xfd\x05\xa1\x71\x6e\xde\xb9\x5d\x06\x29\x9b\xe6\x52\x6f\x8e\x18\x87\xff\x8e\x53\x1e\x5b\x7e\x5a\xa4\x93\x85\xf8\x37\x16\x44\x3c\x91\x3f\x1b\x00\x0e\x79\x77\x75\x12\x3d\xf3\x1c\xb6\xfd\x33\xea\xfb\xff\xfe\xa8\xf4\xbe\xde\xb8\xdc\x30\x30\x4d\x03\xb5\x0d\xe3\x72\xf6\xbf\x74\x5c\x7a\xc1\x81\x61\x25\xbf\x69\x64\x44\xdb\xae\xc4\x85\x95\xcd\x93\x53\x86\xcb\x2a\x79\xcf\xc4\xf6\x4d\xce\xd8\x1a\x5f\xb0\xb6\xdd\x8e\x7b\xa4\x5d\xc5\x4c\xbf\xbc\x73\xf2\x2e\x66\xc8\x75\x45\xab\x0a\x68\x52\xa1\xc2\xbf\x30\x84\x63\x4a\xf8\x60\x96\x15\x05\xa4\x20\xe4\xc6\xbf\x90\x83\x7a\x54\x95\x8b\x9a\x4c\x53\x4c\xdd\x3c\xab\x03\xa7\x23\x61\x91\xeb\x35\xa6\x83\x77\xcb\xbc\x98\xeb\xd8\x28\xcb\x0a\x20\xf6\x37\xa0\x3c\xd5\x21\x82\x44\xda\x4b\x7e\x4e\xab\xb7\x5a\xd5\x58\x22\x9c\x2d\x2b\xad\x43\xbb\x11\x2e\xaf\x5f\x40\x48\x3c\xb1\x26\xc4\x17\x00\xef\x67\x45\x61\x93\x24\xc0\xc3\x9c\xcd\x73\x76\x06\x89\x36\xfa\x0d\xd3\x81\x6f\xce\x28\xd7\x3d\xda\x97\x37\x78\x5a\x6d\x8a\x54\x23\x23\xae\x01\x4f\x33\xa3\x3a\xec\xa4\x72\x42\x63\xa3\x20\x6e\x08\x78\x63\x4c\x4e\x21\x86\x86\x1f\x7d\x68\xca\x52\x34\xae\x6c\x90\x5f\x2e\x12\x70\xd5\xad\x5e\x69\xea\xa4\x97\xbc\xca\x66\xdc\xc6\x19\x09\x46\x3a\xcc\x4f\x65\x5c\x7e\x15\x7d\xc4\x4e\xaa\x71\xa4\xc4\x21\x0c\xd8\x06\x00\xd6\x01\x30\xe5\xa9\x0c\xd5\x1c\xca\x51\xf1\x55\x03\xb1\xcd\x54\xf7\x5f\x3a\x7e\x99\xf6\xcb\x62\x79\xc1\xea\x4f\x46\x35\x7e\x3a\xc8\xe6\x73\x19\xfe\xd8\x51\xd9\xd4\xd1\x05\xbb\x57\x32\x16\x9c\x98\xe7\xbb\x42\x8f\x6a\x36\x9f\xef\xd5\x57\xcc\x69\x41\x38\x90\x9a\xee\x86\xe4\xb4\xb8\xbd\x7f\x78\x2e\xb1\xbb\x14\xe8\x25\x89\xd2\x11\xf3\x8b\x41\x5e\x43\xa5\xfd\x7e\xa1\x58\xce\xa0\x86\x6e\x65\xb5\x55\x6f\x32\xb4\x31\x7d\x13\xec\x76\x26\x71\xab\x1f\x37\xa1\xc6\x95\x3b\x18\x8e\x6a\x46\x57\x44\x39\xab\x9b\xeb\x2a\xb7\x87\x27\x00\xe8\x82\x72\x5e\xd3\x91\x3b\xa5\x20\x00\x49\x6d\x2c\xce\xee\x79\xdc\x58\xc9\x17\x15\xd7\xad\xd0\x0a\xfa\xd3\x74\xfc\xe5\x5d\xda\x0e\x2a\x3c\x41\x5a\x3d\xd8\xce\xd3\xff\x84\xe1\xf9\x4a\x68\xb6\xed\xb2\xd2\xc2\xbf\x14\x2b\x1e\x6e\xde\xcd\xda\x9d\xd3\xc7\xdc\x49\xd5\x42\xda\xfe\xdc\x32\x25\xb5\x7e\xe5\x34\x1d\x6f\xa8\xa8\xdf\x8f\x6b\xb2\xa9\x21\x1b\xf4\xea\x07\x8b\xaa\x5c\xbc\xc8\x2e\x28\x21\x72\x28\xd6\x48\x4d\xec\xf6\xcd\x55\x73\xf0\x09\xfd\xfb\xb4\x06\x6d\x9a\x9c\xda\x99\x9c\x70\xa8\x3d\x3a\xa8\x28\x88\x92\xe1\xec\x5c\x48\x0f\x10\xbb\x23\x42\x0a\xa3\xe2\x18\x00\x41\x56\x37\x3f\x90\xb9\xf6\xfd\x59\xd9\x55\x51\x20\x04\x2c\xd6\x0c\xac\x62\x1c\x42\xac\xcd\x2e\x66\x0d\xb3\x0b\x69\x28\x33\x73\xec\x20\xe7\x9a\x18\x6b\x2f\xe3\x73\x45\x92\xb5\xea\xa0\xf1\x9d\xf9\x82\x5e\x2e\x6b\xb0\x56\x38\x9f\x28\xee\x34\xab\xeb\xfc\x8c\xc5\xd7\x2e\x44\xe2\x17\x58\xe3\x73\x94\x6c\x04\x40\x78\x3e\xc8\x18\x2b\x79\xd3\xab\xde\xd1\x00\x04\x66\xaa\xbb\x0b\x36\x6d\xc2\xa5\xf1\x39\xce\x51\xc3\xbf\x93\x60\x35\xd5\xcf\xb2\xd2\xbf\x04\xcb\xa9\xf0\x5c\x05\xf1\x18\x2c\x2a\xe4\xca\xe6\x5a\x91\xe0\x4b\x6e\xb0\x55\xb1\x27\x12\x2c\xd7\xa0\xb1\x45\x26\x18\x56\xb9\x95\x6e\x64\x0a\x9b\x24\x68\xeb\x02\xc1\x65\x9a\xb9\x54\xc6\x3d\x00\x5b\x8d\xdc\x82\xc7\x3b\x42\x7c\x7a\x34\x65\x69\xda\xef\x47\x52\x08\x19\xf5\x08\x9b\x50\x33\x84\x90\x19\x2b\x20\x84\x12\xd0\x59\x94\x90\xfd\xbe\x29\xab\xe0\x81\x25\x34\x4d\x3a\xa3\xfc\x31\xc4\x61\xdf\xcc\x97\xb4\xa2\xf5\xdd\x09\x46\xeb\xbb\xe3\xc5\xe8\xbd\x63\x14\x56\x21\x4e\xef\x19\x65\xb4\xca\x67\x50\x5d\x4e\xeb\x40\xd2\x94\xa5\x93\x50\x62\x52\x4d\x80\xec\xd7\xbc\x5a\xc2\x0b\x91\xac\xda\xed\x84\xa5\x47\xb4\xe2\x57\x36\xfe\x7c\xb8\x53\x1e\x79\x12\x05\xc4\xc2\x23\xe4\x55\xbf\x4f\xa7\x5c\x4e\xeb\xc4\xfc\xf2\x6a\x6e\x16\x79\xe2\x14\x71\x7e\x1a\x72\x62\xd1\x4c\x87\x0d\x4c\x3a\x88\x3d\x0c\x7f\x4c\x31\xc3\x12\xd2\x89\x3e\x7e\x4e\x67\x7f\xda\x9e\xed\x6d\xb9\x7c\xec\xb4\x41\x48\x72\xaa\x9b\x9c\xd3\xcd\x76\x6f\x8d\xc1\x58\xad\x9a\x49\x4f\x42\xd4\xdb\x89\x0a\x21\x23\xfa\x83\xea\xbc\xfa\xbd\x5a\xc5\xca\x27\x7b\x78\x82\x62\x2e\x9d\xef\xe1\xcc\x1a\x3e\x87\x2e\x54\x62\x2b\x2f\x8b\x02\xee\xf6\x85\xe2\x6b\x3b\x98\x00\x73\xd1\x28\xc5\xde\xd9\x08\xb9\xf5\xc8\x30\x38\xc1\x4a\x78\xdc\xea\xf7\xe3\x4d\x3c\x08\x38\x49\xee\xce\x26\xd7\x60\x1b\xb6\x81\x87\x29\xd3\x1b\x50\x4c\x4b\x19\x56\x7c\x53\xd7\xa6\x65\x80\x2e\x71\x71\x7c\x6e\x2e\x03\x14\x62\x9a\x43\x87\x31\x4f\xe5\xf3\x59\xee\x2d\x83\x1e\x79\x32\x89\x06\x51\x22\x23\xe8\xae\x11\xc4\x93\x6d\xed\xc4\xcd\xeb\xf2\xda\x84\x0b\xd6\x51\x59\x09\xb9\x00\x23\x3b\x88\x95\x4d\x28\xc2\x5e\x86\x17\x5e\xfb\x1d\x84\xd7\x56\x0b\x4c\xd6\xa6\xf8\x25\x10\x9d\xee\x17\x59\xad\xbd\x58\x2b\x7c\x98\x0b\x36\x08\x8c\x4d\x7d\x44\x28\x80\x09\xe1\x56\x6d\x3d\x36\xa9\x40\xf0\xf0\x30\xc0\x14\x11\x9e\x84\xf0\x32\x40\xdd\x59\x88\xe1\x4f\xeb\x41\x37\xaa\x06\x22\xd1\xd3\x09\x0d\x0c\x99\x1d\xd0\x63\x77\xa4\x5d\x9a\xf4\xf5\xda\x44\x11\x4a\xe2\x2d\x6a\x44\x5f\xb5\x4a\xe7\xae\x39\xdb\x74\xc9\x34\x3b\x9b\xd1\x0f\xb7\xde\xea\x38\x29\xd7\x6b\xf1\xbf\x28\xc2\x53\xe7\x7c\xcc\xaa\x2a\x0b\x9e\x8d\x5a\xe8\x28\xc9\x38\xc4\xac\xbe\xe6\xf4\x62\x91\xd0\x35\xe6\x60\x6b\x11\x47\xe2\x3b\x32\x0f\x43\xa2\xb2\x7a\xf0\xd7\x12\x0d\x00\x69\xcc\xac\x95\xb5\xdd\x3f\x02\x51\x77\x75\x15\x99\xc7\x6f\x63\x26\xf6\x23\x2f\xc5\xf0\x22\x1c\xc9\xc1\xb2\x27\x1e\x88\xe5\x1c\x09\x1d\xce\xc5\x76\xd3\xd1\xe3\x37\xc9\xc4\xb6\x64\x7c\xc8\x4d\xb8\xb0\x33\x89\x26\xd1\x86\xf6\xa6\x60\xed\xca\xb7\xe6\xcc\xb6\xac\xaf\x21\xc1\x1b\xaa\x80\x20\x7e\x61\x29\x48\x30\xeb\x3d\x77\x0c\x19\x42\x48\x46\xf8\x3f\x3f\x6e\x37\x54\xe6\x70\x93\x8b\x45\x71\xb5\x57\x14\x02\xce\x80\x6c\xc1\x0f\x00\x33\xe6\x16\x16\xb7\x0e\x3e\xa0\x52\xff\x42\xdf\x01\xbd\x6f\xe7\x76\x24\xc3\xc8\x79\x99\xe6\xe2\x05\x7e\x05\x3d\xcc\xc1\x43\x88\xab\xf3\xf4\xcf\x09\x87\x47\xf8\x04\x1e\xd7\x6f\xe6\xb7\xc5\xc1\xb8\x25\x24\x1c\x90\x5b\xc2\x2a\xb6\x58\x9d\x65\x6a\x70\x5b\x92\x43\x51\x74\x5f\xf0\x63\x1b\x65\xbb\xd2\xe7\x28\x5f\xad\x7a\xbc\x2d\x7c\xf4\xe8\x95\xe6\x84\xc4\x0d\x54\x0c\xdb\xf6\xd0\x3d\x42\x4d\x33\xe1\xe9\xb7\xeb\xc4\xb5\x0c\x8c\x7b\x16\x3c\xca\x38\x5d\xad\x64\x43\x89\xa8\x5a\x51\xe9\x1e\x39\xb6\xd4\xb3\x63\xef\x06\x57\x17\x48\xec\x8c\x61\x23\x48\x77\x35\x33\x47\xa7\x19\x88\xef\x8a\x80\x5f\x57\xf7\xca\xad\xf6\x9e\xe9\x4b\x2c\x9f\x94\x0d\xd6\xd2\x7b\x78\x2e\xa6\xa3\xb4\x89\x6f\x22\x12\x93\xdb\xc4\x00\x4e\xa6\x22\x25\x4d\xa6\xa9\xf6\x6b\x31\x1c\x2f\x1f\x94\xfa\x69\x67\xb9\xb3\x83\xca\xe9\x32\x35\x4b\x31\x16\x5f\x71\x86\x2b\xe9\x33\x5b\x1c\x5f\x5b\xde\x03\x33\xb1\x2e\xb7\x07\x86\xa5\xb9\x3d\xb8\x5c\x9d\xa2\x71\x08\x8d\x67\xab\xd5\xd3\x41\xce\x72\xc3\x47\xab\xe1\xca\xf0\x0b\xac\x4c\xdb\x74\xc8\x72\x42\x8e\x27\x55\x72\xed\xde\x38\x2a\x2d\xe5\x0b\x52\x0e\xb0\x6c\xab\xd0\x9a\x16\x35\xbd\x95\x9f\xc6\x72\x85\x14\x66\x81\x14\x84\x3c\x72\x3f\x3e\xb8\x1f\xcf\x57\xab\xa2\xb9\xc8\xd0\xbf\xbb\xa9\x63\xdd\xd4\xf6\xf2\x42\xcd\xd4\x7a\xf0\x92\x22\x2e\x86\xbf\x80\x62\x5a\x1a\xf3\xc9\xc7\xe9\x38\xd2\x8b\xdf\x3e\xff\x55\xc0\xde\x38\xed\x27\x15\xc2\x1d\xbd\x7f\x82\xcf\x7d\x96\x0b\x61\x2e\x57\x05\x1c\x58\x0b\x7c\x4a\x0e\xe3\xc2\x8a\x9a\x4e\x95\xa8\x69\x41\x4e\x5b\xa2\xa6\xf7\x64\xa1\x54\x59\xcf\xe0\x8c\x37\xcb\xe5\x0c\xdd\x70\x06\xbf\xc7\x67\x8d\x76\xe4\xe6\x11\x60\x1f\x5d\x9f\x0e\x68\xbc\x6f\x25\x2e\xa7\xf2\x11\x40\x0f\xb7\x9d\xf6\x63\xc1\x53\x37\xc6\xf9\xc5\x41\x63\x2d\xbc\xd5\x7a\x41\x57\xa4\x35\x25\x93\xc2\xfa\x3a\x19\xa6\x49\x01\x32\xb3\x2b\xc9\xec\xf5\xfb\x4d\xd4\xb3\x0f\x0d\xd4\x3f\x02\x07\x7f\xe5\x32\x61\x57\x96\xab\x42\x78\x8b\xf2\x72\x4d\x74\xcd\xd6\x2b\x7c\xa5\x39\xcf\x8e\xe5\xe6\x2c\xac\xee\x29\x0f\x20\x81\x26\x77\x9f\x32\x62\x89\x23\x74\x7d\x13\x47\x20\xea\xfd\x8a\x1c\x88\x20\xd7\x62\xa6\x2e\x3e\x67\x63\x70\xdd\x18\xb1\x0c\xdd\xcd\x70\xe1\x2d\xb4\xce\x91\x6e\x96\xc3\xfe\x96\x22\x4f\xd4\xbe\x9b\x34\x28\x45\x52\xc9\x47\xec\x77\x44\x8b\x54\x4c\x7f\xe4\x19\x1a\xe7\x98\xe2\x6c\x07\x94\x5f\x6f\x60\x4d\xa7\x59\x0a\xed\x68\x37\xe6\x9d\xa2\x8c\xd0\x4b\x01\xb7\xfe\x5c\xba\x38\x91\xab\x25\xe9\x49\x49\xc6\x8d\xa7\x60\x03\x45\x70\x87\xb5\x60\xc4\xd6\x6a\xa5\xa8\x8a\xb7\xd9\xb1\x82\x25\xdc\xb8\xa8\x0d\x15\xf7\x66\x29\x40\xc7\x51\x22\x11\x4d\x87\xe9\xda\x95\x13\x34\x26\xa9\xeb\x39\x50\x2b\xaa\x4d\x53\xdf\xdd\x55\x4f\xbb\x2e\xbf\x5e\x2b\x65\x33\x3d\xfb\xb2\x89\x4f\xca\x4a\xb7\x39\xf4\x10\x0c\xa8\x71\xbd\xb1\x50\xf6\xae\x86\x37\x71\xf5\x60\xf9\x72\x21\x0a\xd6\x50\x72\x6c\x44\x43\x3e\xdb\x1c\xe7\x06\x23\xa4\xc4\x3e\x00\x88\xba\xe8\x20\x67\x5e\x99\xac\x55\xc6\x05\xd0\x65\xce\x58\x59\xd1\x37\x6c\x4e\x4f\x73\x46\xe7\xba\x6c\xd1\x2e\x1b\x00\xc4\x0c\xf7\x86\x08\xe1\x9e\xab\xf6\x52\x23\xa3\xfe\xcb\x8c\xcb\x44\x50\x11\xef\xf7\xbb\x3a\xdf\x9d\x33\x65\x5e\x98\x5e\x66\xc3\xf4\xa6\xfd\x7e\x5c\x0f\xce\x8a\xf2\x5d\x26\x6e\xff\x9f\x5c\x1c\xe1\xeb\x50\x9f\x92\x02\xbb\xc3\x94\x64\xb8\x35\xc9\x49\x60\xe2\x3b\xd9\xea\x7e\x9f\x4f\x3f\x05\x3e\x9d\x7c\x22\x7c\x52\x62\x77\x2d\x24\x39\x0e\x0f\x45\x52\xaf\xdb\xf2\x34\x67\x65\xde\x28\x5a\x33\x5a\xe0\x92\x17\x07\x71\xac\x55\xae\x8e\x39\x5a\xad\x58\xbf\xef\xa5\x69\x1f\x29\x19\xc9\xad\xa9\x00\xbe\x8d\xa6\xa3\x74\xdc\xcb\xc4\xbd\x4b\x92\x3d\x37\x0a\x80\xdb\x48\xe8\xd1\x06\x31\x09\x0e\x3c\x21\xdc\x0e\x3e\x21\xdc\xf6\x9e\x10\x6e\xa7\x58\x6d\xfd\x43\x88\x98\xd4\x50\x84\x60\x41\x45\x08\x66\xdf\xdf\x76\x47\x3d\xe7\x65\x50\x47\x5d\x11\xd7\x09\xc7\x20\xe2\x36\x21\xfa\x5e\x30\xc9\x35\xbf\x3d\x4a\x51\x52\x3a\x4d\x8d\x4b\x28\x02\x76\x4e\x23\x84\x35\x9c\x32\x30\x18\x44\x08\x1e\xad\x36\xbb\xc9\xd4\x23\xd7\xef\x8f\x08\xa1\x9b\x24\xce\xe2\x8e\xad\x2d\xa9\xc4\x4c\x44\x11\x5a\xdb\xed\xaa\x2a\x8f\x92\x9a\x16\xa7\x49\x84\x70\x6e\xe6\xe2\x74\xf3\x55\x4d\x53\x53\xd0\xe6\xca\x1a\xd4\x4f\x81\x8c\x63\x4e\x32\x5f\xa6\xe8\x92\xf8\x1e\x89\x29\xc9\x24\x43\x83\xfa\xfd\x5e\x5b\x6e\x02\xa1\xa4\xb3\x80\x5c\x4f\x6a\x21\x99\xca\x7c\x10\x5c\x21\x84\xc1\x1b\x6a\x97\x88\x0f\xa9\x23\xb2\xad\xaa\x14\x2b\x16\xc0\x52\xc3\xf6\x0b\x02\xa8\x06\xca\xe3\xff\xe6\x67\x95\xb8\x90\x43\x21\x57\xcb\xf5\x1a\xcf\xc4\x3f\x4b\xb1\xbb\x0a\xef\xd1\x20\xf0\xf6\xa7\x7c\xd2\x0d\x95\x53\xc6\xb8\x6a\x9c\x11\x55\x97\x68\x25\x3e\x87\x20\xfd\x55\x87\x74\x45\x3e\x0e\x21\x5c\xb5\x89\x4e\xbf\x1f\x2f\x49\x20\x5d\x00\xfb\x87\x8d\xff\xdd\xac\xbc\x47\x1a\xf9\x81\xca\xc3\x07\x51\x38\xdd\xc7\xdf\x8b\x9b\x0f\x4a\x2f\x9a\xee\xe3\xfc\x25\x61\xb4\x66\xfa\x7d\xd8\xc9\xa4\xa3\x96\x46\x2b\x57\xab\x6d\x80\xcd\xee\x11\xff\x67\x0e\x58\xd9\x50\xfd\x25\xd9\xdb\xc6\x3a\xcd\x9a\xf2\xf6\x73\x64\xde\xf2\xdd\xee\xa9\x67\xf6\x17\x89\xe0\xf6\x75\x57\x5a\x8c\x57\x28\xe7\x2d\x45\xa5\x4e\x0e\x70\xe2\x67\x94\x3f\x92\xcf\xe8\x4a\x4b\x30\x57\x7c\xb8\xe0\x73\x0d\x3e\x7d\xd9\x80\xf5\xb8\x20\x66\xd9\x5e\xed\x99\xe7\xf6\x9b\x55\x37\xf4\xe1\xa5\xd5\x37\xfa\x7d\xae\xbd\xfa\x08\xd6\x6d\x8d\xf0\xe9\x57\xc3\xdc\xf3\x50\xf7\xfb\x91\x22\x17\xe2\xa2\x4d\x78\x43\x4b\x00\x9e\xe2\xf0\xfb\xc0\xe8\xd4\x19\xcb\x79\xfe\x91\xb6\xc6\xa6\xc0\xb2\x26\xfc\x05\x23\xda\xa4\x59\x0d\x45\x8d\x75\x6b\x71\x8c\xe5\x11\x27\x7a\x60\x35\x0c\xde\x03\x77\xad\x27\xf8\xbd\x24\x33\x67\xe4\xda\x3a\xcd\x4d\xf2\x81\xaf\x2d\x17\x53\xbc\xc0\x4b\xd3\x92\x02\x73\x84\x33\x47\xb3\xd0\x94\x69\xa8\x1b\xfa\xe5\xd0\x7a\x7c\x46\x72\x41\x1f\xf7\x82\xac\x87\xda\x41\xb8\xc2\x67\x08\x9f\xf6\xfb\xbd\x33\x4d\xb3\x05\x89\xb1\x1f\xe4\x54\x2b\x16\x56\x4b\xf6\x92\x21\x6c\x97\xab\x7a\x52\x79\x8f\xcf\xb0\x38\xb7\x3f\x6d\xb8\xf4\x0c\x15\x03\x3d\x8b\x95\x55\x9d\xc3\xb9\xab\xb3\xbb\x9e\x99\x2a\x7b\x43\x57\x45\xe5\x55\x22\x65\x0d\x66\x80\xa5\xda\xf6\x15\xe9\x5d\x81\xe6\xaa\x33\xcf\x13\xff\x33\xb9\x02\xce\x57\x9a\x07\xca\x93\xa7\xf9\x3d\xc8\x96\xbc\xdc\x87\xeb\x23\x08\x1e\xf2\xc0\x5b\x15\x55\x7d\xc2\xd7\x6b\x84\xf0\x55\xbf\x7f\xe5\xde\xad\x24\x50\xbf\xdf\x8b\xaf\xda\xc2\x89\xab\x86\x70\x02\x5d\xe7\x2d\x35\x64\x77\x14\x86\xb8\xf9\x18\xee\x2b\x92\xe5\x5d\xda\xd9\x5d\x65\x36\x6e\xdb\xd2\xc0\x35\x55\xcc\xf2\xcd\x2a\x7b\x82\x63\xd9\x5a\xa7\xaf\xd9\x83\x4f\x50\x10\xff\xbc\x5a\x3e\xbb\xcf\x9b\x04\x29\x66\xaf\x8b\x39\xb8\x59\x30\xb3\x15\x32\xa4\x64\x33\x79\x48\xc6\x51\xe1\x2b\x1c\x45\xa2\x8b\x33\x08\xb4\x07\xfb\x08\xf8\x52\xfc\x8e\xe8\x25\xa9\xd5\xcd\x27\xcd\x04\x25\xc7\xd1\x0e\xd2\xc6\x76\x3f\x3b\x2d\x8b\xdf\xad\x56\xd4\x28\x76\xe4\x8e\xf2\xca\x15\xae\xf4\xd6\xed\x0d\x11\xbe\xc2\x17\x8d\x35\xd1\x50\xe3\xff\xa4\x59\x05\xf8\x4d\xbb\x60\x04\x92\x99\x6d\xf6\x93\x60\xe3\x4d\xcf\xae\x3c\xcd\xb6\x27\x40\x36\xf6\xf1\x9e\x4f\x38\xf6\xfa\xfd\xbd\xc0\xe3\x45\x2f\xde\x6b\x09\x01\x51\xcf\x31\xb7\xb8\x69\xdf\xee\x6b\x81\x2f\xc3\x19\x19\x42\x1c\xc3\x4f\x9b\x22\x3c\x93\xb6\xa9\x4b\x72\x18\xef\xb5\x35\x13\x59\x50\x33\x51\xdf\x8c\xfe\xfb\x54\x03\xde\x20\xc5\x58\x1e\x08\x76\x8c\x90\xec\xff\x8b\x64\xa4\x63\x10\xfe\xe3\x74\x05\xcf\xba\x68\xca\x3c\x4c\x53\x02\xa9\xd3\x08\xe9\xa4\x0c\x47\x29\x10\x9e\x7d\x79\x4f\x75\x49\x48\xdd\x45\x42\xe6\x3e\x09\x99\xe3\x19\x42\x38\xdb\xd9\xf9\x9a\x74\xe4\x26\x9d\x52\x79\x73\xdb\x8a\x3f\xba\x5e\xa3\xb1\xcf\xf4\x64\x34\xde\xc3\xfb\xf8\x1c\x14\xd5\x30\x95\x13\x2b\xdb\x85\xf0\x33\x60\x1c\xf4\x0a\x3a\x5a\xd6\xe7\xfd\x7e\xbc\x07\xc3\x43\xda\x86\x6c\xee\x80\x71\x4f\x0a\xcd\xf1\xcc\xc8\x1e\x4d\xf5\x72\x94\x19\xbe\xce\xeb\xbd\xf9\x9c\xce\x75\x35\x49\x6f\xb8\x46\x78\xb8\xc6\x7b\x4a\x74\x41\x7c\xf3\x65\x6b\x16\xc7\x77\xd8\xee\x08\xe7\x84\x8f\xf3\x07\xa4\x02\xbb\x37\x8b\xbd\xa2\x17\xe5\x7b\xba\xc7\xe3\x5c\xd4\xf0\x0a\xbe\xfc\x3a\x54\x8b\xa6\xe9\x1a\xdd\x48\xaa\x63\xf5\x04\xd2\xa2\x9f\x13\x3b\x9c\x7b\x89\x37\x7c\x20\x74\xb4\x9f\x8a\xe5\x82\x0b\xa3\x47\xd0\xd5\x2c\x4c\x53\xc1\x79\xc2\x2c\x04\xa6\x02\xad\xf5\xd3\xa2\x6e\x95\x79\xbd\xbd\xc9\x58\xed\x13\xf5\xe2\xc9\x34\xd5\x0e\xea\x5d\xce\x5e\x70\xc5\x0d\xc6\x7d\x9a\x62\xcd\x59\x27\x10\x23\xbd\x4b\xf8\xda\x95\xa3\xa4\xab\x93\x1b\xf2\xb5\xde\xec\xf8\xdc\xc8\x49\x3a\xd6\x79\x24\x0b\x44\xb8\xc2\xe7\xb2\x13\x0b\x18\xde\x1f\x69\xac\x44\x3f\x4d\xd6\xbe\x14\x80\x6a\x65\x3e\x05\x77\x1e\x0b\x5a\xe5\x17\x94\xf1\xac\xe8\xf7\x1b\x77\x68\xbb\xbe\xc9\x42\x0e\x6b\xf9\x9e\x56\x55\x2e\xc5\x0e\x52\xb6\x12\x2f\x9a\x55\x08\x8a\xd0\xf3\xa6\x4e\x2d\xb1\x0e\x29\xd4\x62\x50\xd1\xd3\x8a\xd6\xe7\x8f\xf2\x3a\x7b\x57\xd0\x18\xe1\x85\x11\x94\xb5\x2b\xdc\x42\x75\xc6\xb3\x1a\x0d\xe8\xc2\x32\x74\x5d\x79\x5d\x01\x87\xa3\xd2\xc2\xca\x0a\x4b\xc3\x63\xde\x55\xbd\x54\xd7\xe9\x58\x10\x5d\x39\x53\x38\x22\x98\xbd\xb0\x6d\x00\x34\x8e\x74\x27\x7c\xf0\x2e\xab\x69\xb8\x79\x89\xd8\x4b\x63\x2b\xc1\xac\x64\x15\xa0\x40\xe3\xdc\x11\x9d\x2a\xbd\x2c\x84\xe1\xd3\xee\x03\x41\xff\xbc\xe8\x70\x8d\x7c\x34\x69\x24\x6c\xb2\x1b\x71\xe3\xcd\x58\xcd\xfb\xa4\x9d\xdc\xac\x44\x35\xab\xb1\x21\xc3\x6d\x6b\x00\xa9\x06\x36\x52\x37\xb7\xb2\x09\xec\x36\x35\x98\xd7\x6a\x2f\xc2\x2c\xb8\x84\x37\x2f\x5e\xb5\x6e\xcf\x28\x7f\xf9\xc1\x3c\x4a\x3c\xa2\xf5\xac\xca\x17\xbc\xac\x62\x9b\x7f\xa4\xa5\x22\xa0\xcf\x25\xe3\x08\xd3\x29\x4f\x95\x2b\x14\xbd\x03\xa4\x44\xcd\xbe\x95\x61\x8e\xaf\xcf\x28\x4f\x1c\x0e\x58\x2f\x95\x09\x68\x74\x4b\xee\x95\xa2\x24\x5f\xe3\xda\x05\x2c\xd0\x75\x4e\x0a\x9c\xf5\x88\x20\x13\x40\xfd\x6a\x03\x8e\x0b\x84\x7b\x6c\x30\x3b\xcf\xd8\x19\xec\x73\xab\x33\x39\xe5\x69\xe3\xd3\x5a\xbd\x16\x82\x75\x20\x05\x28\x26\xa7\x62\xc4\xdc\x70\x25\x36\x00\x40\x8c\xae\x95\x5d\x33\x45\xd6\xb0\x97\x6a\xc3\xde\xe6\x83\x77\x63\x80\xb5\x49\xb5\xd5\x65\x7e\x2a\x29\xe3\x01\x9b\x55\x54\x10\xbe\xfd\x72\xc9\x38\x09\xa6\xee\x8c\xb0\xa7\x07\x6b\x1e\xb7\xe3\xbf\x47\xcb\x9a\xde\x92\x31\xb8\x22\xad\x3a\x6a\xda\xfc\xea\xf2\x17\xfa\xee\x50\xe0\xfb\xbb\xe6\xb6\x82\xf8\x71\x14\xa3\xeb\x5b\x6b\x14\x21\x14\x23\x4c\x1b\x8a\x5d\x8e\xb4\xe2\x66\xa2\x87\x73\xf2\x14\xd4\x59\xc1\x3f\xb6\x20\x12\x2e\x2b\x23\xcf\x41\x7d\x6d\xd4\x7e\x6b\x26\x31\x23\xac\xdf\xb7\xaa\x32\x3d\x63\x29\x3f\x61\xc9\x05\x05\xe1\xbf\x79\xe5\x59\xad\xa6\x29\xc2\x99\xc3\x24\xfb\xd8\xfb\xfd\xee\x3c\xcf\x6e\xab\x13\xa8\x4b\x4c\xcf\x49\xbe\xc9\x04\xc0\xe5\xe0\x99\xe2\xdb\x17\xfe\x93\x61\xd3\x68\xc2\xf8\xbf\xe2\xfa\x41\x8d\x4d\xfd\x42\xe9\xb8\x95\x42\x2e\x68\xcc\xb5\xd4\x88\xb6\x06\x46\xed\x09\x39\x61\x72\x85\x67\xb8\x85\x04\x18\x9b\x4c\xf2\x3a\xe1\x31\xec\xc8\xf2\x86\xb0\x0b\xe6\x3f\x36\x82\x4f\x3e\x6f\x04\xa7\xa9\x79\xf6\x2c\xc8\x70\x5c\x3c\xa0\x83\xaa\xfc\x70\xc0\xe9\x45\x3d\x2e\xb4\x1b\x87\x72\xe3\x40\x8f\xb3\x7e\x3f\x9b\x16\x69\x68\xb8\xa7\x45\x8a\x4b\xd4\x1e\x74\xf5\x0a\x88\xd6\x62\xf0\x19\x4a\x6e\x58\xf4\xae\x66\xb9\xfb\x18\xb6\xd5\x2e\xbc\xa2\x72\x0b\x6a\x4c\x7a\xb7\xe5\xf0\x20\x78\xf3\x9b\x54\x4e\x68\xc3\x90\xe3\x15\x18\x85\xf9\xb6\x1d\xab\x55\x4f\x5f\xd0\x26\x60\xee\xdd\x30\xc7\x9a\xb4\x52\x34\xff\xad\x88\x40\xa2\x8b\x6b\x0b\xc7\x5e\x2e\xaa\xf1\x85\x19\xa0\x29\xd1\x25\xe1\x40\xb8\xe3\x21\x25\x33\xac\x7e\xa5\xae\xab\x10\x8a\x18\x1c\x79\xb5\x24\xc0\x45\x00\x08\x38\x51\x07\x89\xf7\x20\x99\xe3\x02\x33\x14\x10\x0a\x95\x01\x4c\xd2\x6f\x9d\xcf\x25\x94\x08\x5d\x5b\xec\x4a\xbe\x53\xe3\x19\x39\x8c\x4b\x2b\xa1\x99\x29\x09\x4d\x4d\x66\x2d\x09\xcd\x92\xd4\x4a\xa1\x6f\xde\x6e\xdd\x52\xd4\x9b\xf9\x97\xbe\xb9\xd1\xda\x3b\x47\xd7\xb3\x01\x8d\xcf\xed\x9d\x76\x26\xb5\xf6\xd6\x9e\x09\x62\xc3\xef\xc4\x46\x65\xe6\x2b\xea\xbb\xa5\x68\xbd\x92\x6c\xb6\xad\x10\x8b\x47\x4c\x63\xad\x29\x90\xf7\x69\x25\x19\xc1\x64\x4f\x30\xdf\x0a\x32\x85\x26\x37\x17\x4a\xa4\x02\xab\x2f\xe2\x97\x21\x85\x5c\x44\x3c\xf1\x21\xac\x13\x0e\xff\x1d\xa9\xdb\x59\x01\x38\xad\xb0\xef\x15\x62\xb1\x3b\xaf\x17\x5c\xd9\xfc\x67\xe0\x45\xae\x99\xd5\xf2\x23\x97\x35\xfc\xc8\xc9\xf5\x97\x29\xb9\x1d\x23\x67\x74\x5a\xca\xce\xc6\x0c\x97\xea\x15\x06\x39\x8a\x07\x85\xaf\x78\x50\x78\xfe\x1b\x8c\xbe\x45\x05\xec\x93\xf8\xb7\x47\x08\x98\x2a\x4d\x79\x4a\x18\xc2\x06\x22\x07\x88\xdc\x42\xe4\x0a\x82\x35\x94\xb8\x6e\x5c\x08\xfa\xaa\xe9\xae\x9d\x98\x63\x0e\x91\x84\x5d\x0d\x19\xb0\x95\x6c\x26\xa6\x89\xb1\xa0\xc4\xcc\x73\x91\xe2\x10\xe8\x2d\x8c\x68\x29\xe2\x53\x96\x12\x3a\x65\x29\x30\x85\x74\x1d\x23\x47\x8d\xeb\x64\x39\xbc\xfd\xdd\xbd\xd3\x6c\x46\x02\x67\x17\xa3\x1f\x62\xbe\x5a\x51\xb4\xc6\x1a\x72\x51\x95\xef\x49\x31\xf8\xf5\xe3\x77\xf1\x35\x2f\xff\xa4\x2c\xa1\xca\x7d\xe9\x55\xe2\x60\x5b\xcb\x8a\xf0\xbb\x4d\xbe\x78\x3c\x9e\x14\x46\xce\xb0\xa5\xf2\x72\x3c\xa7\xb3\xfc\x22\x2b\x8e\xf2\x05\x25\x5c\x26\x15\xe5\x2c\x2b\xe8\xc1\x9c\x30\x0f\xe4\x98\xaa\xf8\x23\x24\x1a\x48\x15\x4d\xa9\x16\xeb\xa4\xe3\x48\x8b\x3f\x8e\xa9\x7a\xd5\x32\x86\x2e\x2d\x2c\xf1\x10\x97\x83\xf9\x7b\x04\x8b\xed\xc3\xe3\xc1\x23\x09\x80\x82\xa8\x9b\xc0\x70\x19\x57\xa0\x35\xe5\xc7\x57\x17\xef\xca\xe2\x40\x69\x48\xc5\x21\x96\x5b\xa9\xbc\x04\xc8\x12\xba\xa6\x3a\x70\x2d\x45\xad\x0e\x68\x9f\x0c\x39\x9b\x6b\xec\x98\x12\xed\xc3\x2e\xd0\x56\xa4\xf4\x76\x22\xad\x66\x5e\x14\xe5\x07\xd5\x39\xd9\xce\x7e\x3f\xa6\x8e\x73\xe4\xe0\xf0\x74\x95\x45\xda\xab\x92\xd7\x82\x66\x69\x6b\x79\xe4\xd8\x36\xf0\xe9\x28\x95\x3e\xfd\x7e\xa3\x55\x19\x8b\x4f\x24\x03\xfb\x58\xca\xc4\xab\x8c\xd5\x4f\xca\xea\x42\x55\xda\xb5\xff\xe0\xdd\xd3\x19\x36\xe3\x1e\x91\x8e\x2d\x63\xe1\x2e\xae\x01\x60\x3e\x2d\xab\x8b\xd8\xf6\xfc\xd9\x80\x81\x17\x4e\x35\x82\xd0\x41\x2f\xf4\x55\x78\x68\x40\x4c\xdc\x58\xac\x32\xbc\x1c\xb8\x7b\xd5\x1a\x59\xc1\x81\xb1\x6e\x24\xad\x96\x96\xba\x7b\xa8\x84\x5d\xf0\x4a\xe8\x44\xc7\xfa\x61\x34\x71\xc2\x96\x39\x91\xc7\x50\x32\x94\x06\xc9\x76\x8c\xdd\x30\x97\x82\xd4\x15\x82\xce\x8d\xb4\xcd\xb6\x48\x40\x8e\xe1\xc9\xae\x93\x87\x6b\x32\x1c\xd7\x0f\xca\x71\xbd\xb3\x83\xaa\x1d\x12\x0d\xa3\xb6\x3a\x5c\x6b\xa9\x07\xae\x8e\x7a\x50\xc9\xf5\xdc\x5d\x38\x49\x78\x2c\x9d\x91\x4f\x02\x8b\xd9\xaa\x0b\xda\x0d\x10\xac\xf3\x8f\x1a\x54\x85\xe4\x0f\x33\x2b\xfd\x7e\xec\x93\x94\x46\x3e\xc2\x2a\x21\xb8\x49\x3a\xb6\x00\xe9\x2c\x83\xda\xdb\x97\xf4\x86\x86\x26\x7f\x2a\x49\x8e\x8b\xc1\xf3\x27\x4f\xe3\x72\xf0\xd3\x4f\x08\xcb\xdf\xc5\xa0\x2e\x9f\xa2\xcf\x27\xd6\xfb\x5b\x13\xeb\x16\xa5\x56\xe2\x08\xd5\x2d\x2d\x33\xce\x6b\xe5\xb6\x53\x8a\xc0\xdb\x74\xaf\xa6\x1c\x2e\xf5\x5d\xaa\xd0\xca\x10\xc0\xc3\x33\x0c\xd4\x68\xfd\xe7\xd8\x34\x2b\x3e\xd2\x30\x31\x9d\x3e\x4e\xc9\xcd\x90\xa1\x2e\x49\xfe\x00\x7d\xf6\x74\xd9\x49\x99\xe7\x15\x29\x06\xc5\xd3\xdb\xf1\xb5\xb8\x26\x25\x14\xe7\x6c\xb1\xe4\x75\x72\x2d\x0e\xfb\x24\x12\xff\x46\xf8\xd4\x0f\x53\x2c\x15\x1c\x9d\x84\x68\xad\x67\x6d\xaf\x3d\x6b\x98\x7f\x2d\x87\x77\x60\x86\x24\x93\xcc\xa5\x11\x21\x47\x32\x07\xce\xe9\x02\xde\xe1\xde\x6f\xf0\xd4\xa0\x6e\xd0\x98\xc9\x97\xdc\x8a\x1c\xca\xdd\x14\x8a\x9d\xad\xc3\x9a\xf2\x76\x58\x53\x26\x0e\x5e\xed\xf8\x55\x90\xf9\xad\xa2\x9a\xaa\x88\x05\xda\x7f\xca\x45\x56\xff\xe9\x5c\xce\x94\x5d\xb3\x9b\xaa\x9b\x45\x63\x4f\x08\x59\x53\xfe\xf8\x3d\x65\x1c\x26\xa3\x4b\x46\x16\x45\xfa\x32\x28\x15\x38\x0b\x90\x54\x0d\x78\x76\x06\x0e\x78\x64\xf0\xbc\x83\x17\x47\x6f\x5e\xab\x18\x79\x9c\x5e\xf2\xac\xa2\x59\x94\x50\x22\xdd\x60\xbc\x2b\x2f\x23\x42\xfc\xe2\x57\x0b\xba\x5a\x45\x55\x36\xcf\xcb\x8e\xbc\xd3\xbc\xa0\xa1\xac\x49\x04\x32\x45\x1a\x25\xaa\x5a\x37\x52\xdf\xf1\xe3\xe7\x8f\xf7\x5f\xab\xaa\x01\x6a\x2d\x11\xe8\x7e\xb6\x9c\x9e\x2b\x29\xe3\x3e\x73\xce\xf4\xc0\x7e\x30\x3c\x71\x4c\x57\xab\x98\x0a\x56\xff\xde\x47\x70\x05\x19\xb3\xd5\x8a\xa3\x35\xe6\x1d\x9b\x83\x9b\xcd\xe1\xac\x7f\x6f\x33\x44\x6b\x7c\x4a\x33\xbe\xac\x68\x9d\x4c\x8b\xc1\x5f\x2f\xff\x48\xd7\x08\x73\xb1\x33\x8e\x59\x37\xaf\x89\x21\x64\x7b\x8b\x8e\x41\x6d\x9a\xd7\x14\xab\x40\xf3\x99\x15\x65\x73\x5a\xd1\x8a\x38\xd6\xca\xaa\x05\x24\x37\x04\x43\x50\x8a\x0c\xdb\x41\x7b\x9e\xd7\x9c\x32\x2a\xb7\x89\x7c\xef\x29\xe6\xc0\xb9\x93\x48\xb1\xa3\xa2\x9b\x04\xe6\x5d\x25\xd4\x45\xc9\xf7\xcf\xb3\x8a\x44\xbf\xab\x14\xd0\xbd\x2a\x68\x56\x19\x7e\x35\xaf\x0f\x18\x2c\x4b\x9b\xc2\x38\xad\x58\x56\x28\x42\x69\xd2\xc5\xc9\x18\x64\x39\x45\x46\x60\xdd\xfa\xd7\xc4\x46\x4f\x8d\x93\xe5\xd8\x0e\x96\x4c\x23\x1d\xa0\xaa\x8f\xb4\xe6\x76\x08\x16\x59\xc5\xf3\xac\x38\x2a\x6b\x78\x3b\xb4\x3b\x4e\x33\x1b\xf2\x54\xa6\x5d\x39\xa7\x79\x55\xf3\x17\x25\x3b\x14\x9b\xb4\xac\x25\x11\x51\x0c\xc4\x69\x4d\xae\xbf\x4f\x22\x88\x6c\x12\xe1\x2c\x89\xa6\x7b\xbb\xbf\x65\xbb\x1f\xd3\x08\x47\xff\x27\x32\x9f\x90\xad\x0e\xa9\x8c\xcd\xab\x32\x9f\xef\x9f\x57\xe5\x05\x25\xbd\x91\x91\xa7\x51\xa7\x7e\x13\xb7\x16\x73\x32\x1c\xf3\x07\x54\xdb\xd3\x72\x2d\x63\x63\xf0\x5c\x30\x8e\x26\x11\x21\x6c\x12\xeb\x3e\xec\xee\x76\x74\x1a\x25\xa6\xc9\x53\x96\xaa\x02\x30\x50\xea\x59\x9b\x7e\xb8\xf5\x8a\x9e\x3d\xbe\x5c\xc4\x2e\x20\x92\xf1\xfb\x88\xda\xdb\x8d\xb1\xd0\x33\xd3\x1c\x22\x07\xb9\xb1\x2f\xc1\xfc\x41\xa8\x65\x86\x2b\xca\x6a\xfe\x4a\xf9\x33\xbe\x01\x93\xea\x8a\xdb\xf8\x65\x51\x20\x49\x3c\x4c\xdc\x0e\xe2\x6c\x12\x9b\x3a\xd9\x50\xd9\xee\xa6\x96\xec\x06\xd1\xa9\xa6\x84\x8b\xe8\x87\xec\xd3\x53\x5a\xb9\x82\xd3\x8a\x0c\xc7\x95\x9d\xd2\x4a\x4f\x69\x4e\xe8\xb4\x82\x29\x85\x28\xff\x4e\x69\x65\x3a\x6f\xe6\x25\x4f\x27\xc6\x1c\x49\xdc\x0d\xce\xcb\x62\x4e\xab\xb8\x42\x49\xae\x86\x41\x89\x5a\x1e\xca\xca\x5d\x54\xfe\x85\xec\xb4\x9c\x2d\xeb\xd7\xf4\x52\x59\x0e\x38\x5b\xcc\xee\x67\x38\x77\xea\x58\xb3\x5e\xe2\x94\x78\x9b\x49\x17\xd6\x76\x6f\x4b\xa0\xc0\x0e\x0f\x50\x27\xa7\x3b\x9a\xce\x0d\x0a\xc8\x74\x36\x3a\x8e\xa0\x6d\x8a\x26\x95\xec\x89\xf8\x92\xf4\x85\x83\x47\x5c\x14\x22\x7c\x5b\xa2\x7e\x57\x2c\x2b\x83\xf9\x61\xb1\xac\xbe\x16\xe2\x3f\xe9\xd5\xbc\xfc\xc0\x0c\xee\x67\xf4\xea\x51\xf9\x81\x7d\x45\xf4\x60\x8c\xe1\xe2\x3f\x12\x09\x5f\xab\x02\xf8\x63\xb0\x1f\xc0\x72\xf8\x4a\xa8\x17\x59\xcd\x95\x3d\xeb\xe0\x3c\x63\xf3\x82\x02\x7a\xe9\x07\xd6\xab\xc4\x2c\x2c\xcd\x0a\x75\x2d\x2b\x67\xb9\xaa\xfd\xa2\xcf\xbb\x5e\x6b\x3d\x6b\x42\x63\xd6\x6f\x6f\x68\x6e\x48\xfb\xe5\xc5\xa2\xa0\x9c\xce\x81\x92\x60\x93\x63\x4e\xcf\x26\x32\xc9\xdd\x52\x08\xe4\x6b\xe9\x42\xeb\xa8\x36\x6c\x4a\xfb\x98\x3b\xa3\xfc\x0d\x13\xb4\x9e\xca\x2a\x62\x84\xda\x11\x20\x1a\xe8\x30\x45\xc6\x7a\x55\x1d\xc8\x5e\xd4\x57\x81\x0e\x53\x3c\x0d\x1f\x8e\x7e\x0c\x58\x35\xc2\x1f\xaa\x9c\x77\x89\x5e\xd5\x20\xcb\x03\x97\x3a\x0c\x4b\xbf\x1f\x2b\xb7\x05\x16\x40\xbb\xba\xb0\x29\xc1\x73\xdb\x10\x1e\x4b\x46\x54\x82\x94\xc2\x3f\xc9\x8b\x82\xce\x8f\x39\xf0\xbf\xf6\x39\x35\xab\x68\xf0\xf1\xc6\x98\xbd\xe1\x7c\xac\x8d\xbd\x65\x75\xe5\xe9\x69\x4d\xf9\x51\x56\x51\xc6\xf5\xa0\x01\xb3\x45\xc8\xbc\x9c\xc1\xcd\x62\x90\xcd\x78\xfe\x9e\x3e\x96\xfc\xaa\x74\xf3\x2f\xc5\x05\xf6\x49\x49\x5b\xbf\xde\x72\x50\xd7\x94\x1f\xd3\x82\x42\x23\x5e\x89\xc5\x3b\x89\x2b\xe2\xe5\xab\xcc\x63\x9e\x55\x1c\xe7\xc1\xbc\xc7\x6c\x8e\x12\xd3\x12\x93\xdc\xef\xb7\xd3\x94\x22\x16\x54\x05\x0f\x3a\x71\x45\x86\xbb\x31\x23\x9b\x41\xe1\xf6\xb2\x5c\x14\xf9\x0c\x06\x73\x70\x51\xbe\xa7\xd0\xa2\x58\xb0\xdb\x55\x36\xe3\xb4\x8a\xf0\xee\x88\xde\x43\x68\x87\x0d\x04\x4b\xa8\x8e\x24\x84\xaf\xdf\xd1\xb3\x9c\x25\x15\xa6\x6c\x9e\xe4\xeb\x71\x45\x28\xce\x89\x1e\x1d\xe3\x90\x81\x4f\x78\x52\xe1\x8d\x43\xb3\x29\x33\xae\x70\xae\x4e\x50\x09\x21\x5b\x2f\x8e\x23\xdd\x59\x7d\x43\x0a\xe6\xc7\xe0\x16\xbd\x28\xb2\x45\x4d\x61\x3b\x33\xe8\xe4\x63\x36\xf7\xba\x98\xeb\x8c\x76\xef\x2b\x91\x25\x47\x2f\x46\x8e\x97\x6e\x87\x24\x84\x97\x1d\x05\x97\x2e\xdd\x67\xbf\x39\xec\x59\x90\x71\x1a\xb3\x07\x84\x8e\xd9\xce\x0e\xd2\xab\x16\xb8\x99\x29\x4b\xbd\x73\x7f\xca\x52\xcd\x79\x35\x8e\x7a\xa6\x85\x8c\xbd\x51\xc3\xb1\x92\xcb\xa9\xab\x26\xba\xa4\xa0\xcb\x43\x39\xee\x79\x7e\x1e\x9d\xba\x36\x38\xbc\xf1\x2e\x10\x3a\xe2\x3d\x7d\xe0\x27\x2b\x8b\x4f\x9a\x0c\xdd\x67\x05\xfa\xe7\x0b\xb8\x83\xb4\x71\x8b\x91\x1b\xef\xec\x28\x34\x05\x65\x5a\xed\x4c\x0e\x11\x4d\xc7\x56\x1a\xe2\x21\x3c\xaa\xe8\xfb\x4e\x84\xbb\xbb\xf4\x07\x32\xdc\x0a\xd5\x79\x7e\xca\x9f\x6f\xa4\x36\xd2\xd4\x85\x3e\x18\x2a\xdf\x39\x8c\x50\xac\x48\x80\xee\x59\xcc\xd1\x98\x99\x2e\x04\xa7\x5a\x49\x8e\x2b\xa7\xa3\x5e\xbe\x0c\x33\xe8\x2e\x87\x2a\xd5\xe1\x0c\xc6\x8d\x55\xe2\x43\x61\xff\x33\xb8\x82\x2a\xd4\x6a\x72\xa5\x98\x47\x38\x14\x24\xeb\x68\xb8\x3e\x41\x81\xe3\xc3\x8c\x9f\x0f\x2e\xb2\xcb\x20\xd7\x8f\xa9\xbb\x83\x60\x14\x5f\x6d\x10\xc6\x00\xcd\x16\x83\xc7\x09\xc5\x2c\xd8\x44\x8a\xc6\xdc\x0e\x21\x6f\x0d\x21\x97\x43\xd8\x1e\x79\x4d\x73\xd5\x08\x70\x7f\x40\x78\x4a\x18\xee\x1c\x77\x1d\xde\x31\x37\x43\xcd\x48\x6e\xfb\x25\x39\x97\x3d\x79\x89\x3b\x90\xdc\x52\x47\x1f\xdb\x2c\xb5\xea\xa6\x1c\x4c\x64\x4e\x2c\xc9\x66\x78\x1c\x8c\xb1\x41\x6e\xa7\xfd\x60\xc8\x34\xac\xbd\x16\x53\x33\x66\x03\xa0\xde\x3f\x34\x56\xbb\x4a\xde\x1d\xa5\x63\xa4\x7f\xef\x8a\x36\x0c\x09\x21\x2a\x01\x04\xf2\x1a\xc1\x83\xf0\x95\x2f\x80\xd3\x62\xdc\xd9\x19\x3b\x5d\x54\x89\x58\x63\x07\x03\x92\xcd\xad\xee\xd8\xf5\x9f\x5a\x51\x8b\xb1\x43\x93\x16\x7d\x54\xae\xa7\x9c\xa4\x61\x8b\x83\xeb\xa4\x97\x96\x96\xc9\x0b\x44\x47\x14\x07\x7b\xc9\x32\x22\x12\xcb\xf9\xb8\x8c\x0f\xc8\xa5\xcd\x9b\x5b\x80\x19\xc2\xcd\xd5\xd4\x23\xfe\x0d\x4e\xaf\x3a\xc3\x15\xc8\xd3\x12\x2e\x66\x71\xf4\xe3\xeb\xc3\xe7\xea\x8e\x86\xc6\x1c\x7c\x8d\xa8\x1c\x25\x7b\xc3\xbd\x21\xee\x8d\xbc\x6a\xe6\x79\xbd\xc8\xf8\xec\x5c\x02\x72\xc9\xf4\xb2\xd6\xb2\x1e\xb7\x06\xcd\xc6\xc5\x70\x2e\xcd\x00\xfb\x4b\xce\xcf\xc5\x4a\x9a\xb0\xa4\x8b\x0d\x6e\x75\x94\xb0\xb5\x33\xd8\xea\x46\x75\x03\x65\x21\x74\xf0\xe1\x3c\x9f\x9d\xaf\x56\x74\xf0\x27\x85\xc8\xa3\x63\x67\x2b\xb5\xfb\x20\x55\xa0\x7a\x3d\xb7\xc5\xe6\x9a\x6f\xb8\x6e\xbb\x9e\x20\xc1\x00\xec\x8c\xd0\xf8\x1f\x84\x90\x7c\xb5\xba\x7b\x5f\xfc\x9d\xc4\x8c\xc4\xdc\xdb\xee\x48\xad\x51\x41\xaf\x06\x94\xcd\xd1\x2e\x23\xe2\x44\x8a\x19\xb9\x7b\xbf\x27\xca\x18\x32\x26\x4e\xb2\x98\xa1\xa4\x49\xd9\xd8\xee\x48\x50\x6d\x55\x45\x93\x78\x27\x95\x26\xd6\x05\xcd\x2a\x45\xbf\xc1\xff\x8a\x84\x84\x73\x4d\x24\xec\x8e\xec\x6b\xb1\x9a\x32\x39\xf8\x14\xf7\x46\x38\x0b\xaf\x4b\x3a\x58\x54\x70\xef\x53\xfa\x05\x31\x42\xc9\xe8\x8e\xec\xab\x73\x91\x36\x4b\xf8\x13\x70\xa3\xe4\xf6\x77\x02\xd1\x06\x41\x9f\x5a\xe3\xee\x61\x34\xdc\x78\x91\xf0\xf7\x53\x57\x63\x02\x9d\xf2\x97\xda\x91\xbc\x6d\x6f\x5c\x6b\x38\x0b\xac\x36\x5c\xf8\xb4\x9e\x0e\x66\xbc\x2a\x9e\xd1\x2b\x01\x93\x15\x5c\xfd\xba\xa0\x3c\x83\x9f\xd9\x83\x3b\xb7\x57\xab\x38\xeb\xf7\x47\x77\x7a\x84\x64\xfd\x7e\x5c\x88\x55\xb2\x5b\xc8\x65\xd3\x83\xa5\xd2\x9a\x5e\x95\x8b\x01\xd6\x9f\x68\x2f\x6b\x77\x84\x10\xd6\x0b\xd2\xac\x99\x42\x1f\x09\x08\x39\x74\x37\x66\xea\x2d\x7b\x70\x5a\x95\x17\xfb\x2a\x84\x70\x9c\xb9\xd2\xd5\x29\x37\x51\x90\x75\xb3\xe4\x89\x1f\x73\xd4\x3e\x6c\x03\x5c\x45\xe0\xd0\x76\xc6\xab\x42\x58\xb5\xed\x01\xd9\xc0\x65\x5b\x47\x40\x1e\xa9\x47\x28\x38\xb3\xc1\xe5\x61\xec\xc6\xf3\x2e\x64\x5d\x2b\x28\xc7\x9f\x4b\x2d\x5c\x11\x87\x33\x99\x1b\x58\xce\xb1\xe2\x32\x05\x4b\xd9\xef\x37\xf8\xca\xc6\xfd\x21\x0e\xb1\x86\xed\xeb\x83\x2f\x02\xe8\x68\x41\x5b\xce\x12\x94\x25\xfa\x9e\xd4\xdf\x86\x54\x25\x7c\xea\xdc\xe2\x8c\x32\xb2\x3b\x52\xdc\xe0\x10\x57\x20\xf3\xbe\x81\xf1\x33\x5c\x84\x5d\x68\xa1\x9e\x72\x34\xae\x76\x76\x1e\x68\xbd\x84\x31\x82\x97\xbc\x5c\x5f\x56\x2c\x2d\x6c\x2e\x6b\xd5\x75\x77\x19\x67\x84\xdb\x70\xba\xd5\x0f\xb9\xe1\xc3\x5a\xdb\x92\xef\x8c\xcc\xb3\x02\xd2\xa1\x75\xa5\x5f\x33\x1f\x29\x71\x9a\x82\xfa\xfd\x6a\x67\xa7\x5b\x4e\x9e\x11\xeb\x45\x57\x5d\xac\xbd\x3d\x95\xf4\xe2\x6c\x67\x14\x2c\x8d\x6c\x58\x9e\xc6\x52\xcd\x7e\x20\xfe\xe2\x54\xd4\x3c\x70\x07\x68\xad\x02\x27\xc1\xf3\x2a\x95\xed\x18\x21\xbd\x79\x4b\x32\xe1\x5c\xbc\x85\xa3\x6f\xb7\x9e\xb8\xba\xc5\xa9\x0d\x3b\x39\x35\xaf\x95\x28\xf8\xf4\x31\xe1\x49\x88\x8f\x75\xc8\xfc\x13\x29\x67\xee\x7e\x36\xe6\xe0\xce\xd7\xe1\xe4\x86\x18\x26\xfb\x75\x7e\x41\xcb\xa5\xba\xa2\x01\xe1\x52\x29\x07\xf3\x2d\xc4\xeb\x24\xc8\x0d\xfa\x68\x48\x6d\x3e\x5c\xdb\x0a\x76\x83\x2c\x0b\x0c\x84\x1a\x33\x28\x78\x7c\x78\x5b\x32\xfe\x8e\x26\xe0\xef\x48\xdf\xcf\x99\x3d\x56\x51\xa2\x3f\x38\xc2\x2c\xc4\x8c\xa2\x35\x1e\x0d\xdd\xa3\xb2\xf3\x26\x24\x57\x81\xfb\xe6\x25\xa7\xb7\x7d\x8f\x8a\xa9\x5a\x33\x2d\xe1\x70\x4c\x3d\x85\x44\x97\x0e\x77\x5a\x73\xf9\xeb\x85\x4d\x7a\x2c\xe9\x71\x57\x1f\xcb\x9d\x8b\x9c\x44\xd1\xd8\x2f\xb2\x5a\xe9\xd3\x20\xc8\xbe\x56\x37\xb0\xaf\x41\x6e\x38\xbf\x49\xac\x4c\x2a\x23\xb3\x51\xcb\xd2\xed\x7a\x6b\x5c\x36\xdf\x3c\xc7\xe1\xb5\xa3\x78\x78\xff\xf2\xc5\xf5\x3d\x0a\x61\xde\x62\xa0\x02\x67\x1f\x6f\x9c\x91\x6b\x3c\xf4\xf4\x97\xbd\x41\x09\x9c\x2a\xf6\xcd\x73\x9a\xaa\x27\x4e\x97\x3c\xb4\x1f\x3b\x7d\xb2\x39\xf6\x28\x76\xbf\xcf\x7a\x1d\xb4\xdf\x44\x63\x61\xe6\x4d\x9a\xb6\x4f\x2d\xa7\xc3\xa1\x21\x6d\xc0\x39\x1b\xa1\xeb\xbc\x3c\x05\x10\x67\x7a\xfb\xfd\x28\x6a\x3f\x49\x38\xfb\xe7\x11\xad\x79\x55\xb6\x7d\xce\xb9\x43\x05\xc5\x1b\x4f\x2f\xfa\xa1\x5a\xbe\x12\xc3\x88\x05\xc0\xa6\xc3\x34\x0e\x3f\xdd\x38\xbe\xd6\xc6\x81\x7c\x30\xe6\x56\x2a\x48\xf8\x2d\x23\xd7\x0b\xa9\xa5\x92\xd4\x83\xfd\x53\xbc\xac\xe9\xe3\xcb\xbc\xe6\x39\x3b\x4b\xe2\x21\x2e\x06\x4f\x17\x33\x14\xb7\x6d\xd3\x3e\xb0\x35\xc2\x17\xcb\x82\xe7\x49\x6f\xb8\xc6\x7f\x32\x32\x8d\x74\xec\xda\x08\x47\x3a\x0e\x6e\x84\xa3\xac\x58\x9c\x67\xfa\xef\x8b\xe5\x05\xad\xf2\x99\xf8\xac\x67\x79\x1e\xe1\x68\x9e\xf1\xec\x4d\x05\xbf\xf2\xb3\x9c\x47\x38\xa2\x17\x59\x5e\x88\xbf\xef\x29\x8b\x70\x74\x4e\x2f\xf7\xcb\xa2\xac\x22\x1c\xfd\x51\x97\x22\x45\x07\x34\x97\x3f\x9f\x97\xec\x4c\xfc\xa2\xd9\xe2\x57\x9a\x09\x30\x13\xe4\x1c\x7e\x2b\x55\x93\x08\x47\x17\x99\xa8\xb8\x9c\x8b\x06\x2e\xca\x4a\xd4\xe5\x84\x4a\x8f\x70\xc4\xf3\x0b\x01\xb7\x5c\x2c\x4c\x99\x65\x25\x9a\x22\xc3\x5b\x47\x38\x82\x68\xbe\x11\x8e\xce\xf2\x6a\x1e\xa5\xf8\x77\x06\x02\x74\xd9\xa5\x0f\x5f\x12\x34\x94\x3a\xd1\xfb\x02\x8a\x54\x59\x23\x72\xa8\x52\xc8\x79\x45\x4f\x09\xc5\x99\xab\x5a\x92\x19\xad\x54\xa5\x7c\x44\x72\x9c\x05\x54\x49\xb2\x41\x5e\xab\xd9\x38\x5e\xbe\xab\x67\x55\xfe\x4e\xba\xed\x17\x19\x40\xa7\xac\x27\x7f\x91\x74\x08\x9b\x5f\x7e\xa9\xda\xc1\x15\x83\x73\x44\xe1\x6c\xe0\xaa\x34\xc5\x08\x67\x1b\xd5\xba\x14\x01\xaa\x23\x1c\xb6\x7f\xd4\xa4\x1a\x80\x1a\xb6\x8f\xfa\x18\xd2\xd9\x8e\x63\x77\x76\xf6\x92\x1d\xb0\xbc\x7d\x74\xe9\x49\x81\x51\xe5\x64\x9a\x7a\x46\xc9\x8b\x0e\xab\xe4\x98\x4e\xa3\xea\xd2\x38\x6d\x60\x28\x95\x4e\xd2\xfe\x64\x46\x15\x57\x5c\x98\xa2\x88\x90\x16\x24\x5c\xa4\x4c\xac\x29\x96\xb6\x71\x21\xed\xb8\xa9\xdf\x8f\x7b\x74\xd0\x50\xd1\x03\x8b\x22\xf7\xf1\x31\x1c\x0b\x9d\xfa\x9a\x86\xb8\x55\x0b\x16\x97\x03\x41\xf6\x1d\xa7\x72\x30\x7c\x8e\x16\x9e\xbe\xad\x55\x97\x6a\x45\x6b\x18\x93\x00\x0b\xa3\xba\xc8\xf4\x79\x66\x33\x60\xeb\xd6\x07\xec\xb4\xd4\xaf\x99\xef\x72\x36\x57\xcb\x4b\xad\x0e\x29\x71\x72\x34\x0c\x8a\x65\x05\x69\x81\x79\x92\x21\xd3\x1b\x87\xae\xc2\xec\x1e\xc3\x10\x28\xbc\xee\xcc\x18\xa8\xf6\x21\xa9\xec\xb7\x2c\x8a\x5e\x97\x96\x91\xb3\x34\x9a\x1b\x68\xd0\x54\x1a\xef\x50\x6a\xc2\x9d\x83\xd2\xcc\x59\xd0\xaa\xce\x6b\xfe\x1b\xad\x4a\x34\x56\x95\xb6\x47\x79\x42\x93\x60\x73\xb4\xa6\xbf\x2b\x09\x81\x43\xf9\x25\x53\x43\x2d\x38\x0c\xc5\xfa\xf8\x3b\xd9\x57\x77\x0e\xcc\xcf\x0d\xec\x07\x6d\xad\x09\x42\x3d\x11\x62\x50\x59\x40\x91\x0b\x4f\x45\xc3\xcc\xbe\xab\x25\x10\x3a\xae\xf4\x59\x8f\xb7\xaa\x41\xe9\x97\x34\x25\xb6\xcd\x81\x18\xe2\x5e\xcc\x1b\x6b\x2b\xbc\xb0\x36\xad\xaa\x7e\x5f\x2d\xa9\xae\xf5\x24\x78\xb2\xce\xd9\xe3\x46\xab\x52\xa9\x1f\xf0\xc0\x44\x32\xeb\x73\x23\x3c\x2c\xde\x84\x42\x61\xc9\x47\x76\xed\x2c\xbb\xcc\xc7\xf9\x69\x6c\x38\x18\xa3\x9f\xe9\xbd\x73\x6c\x1c\x6b\xbf\x1c\x76\xea\x70\xa9\x2a\x1d\xb4\xe9\x7d\x80\xce\x42\x7c\xad\x36\xa4\xb8\xbb\x77\xc6\x5f\x46\xeb\x0d\x0b\x86\xbb\xef\x56\xfa\x7c\x53\x0b\x5e\x6e\x2f\xde\x2d\x1b\x71\xa6\x73\xfa\x38\x6d\x93\x97\xe9\xe3\x74\xfa\xbb\x95\xcb\xb4\x73\x9a\x94\x32\x00\xe1\x91\x4c\x7d\x17\x6e\x1d\xc8\xda\xc1\x4a\x17\x39\xed\xc0\x6e\xdd\xb4\xb4\x4f\xf8\xa1\xf5\x04\xe2\xec\x09\x69\x38\x73\xb3\xda\xa6\xbf\x79\x5d\xd9\xaa\x19\x65\xc1\x29\x74\x07\xd5\x71\x9f\x50\x6e\x1c\x65\xb8\xdd\x5a\x17\x25\x92\x07\xf1\x68\x75\x00\x5e\x2e\x0a\x57\xff\x1a\xfc\xaf\x1c\x37\xd6\x2f\x95\xba\x35\xde\x42\x6f\x5d\xf4\xac\x56\xaf\x61\x80\x86\xeb\x56\xb0\x71\xb3\x5f\x3b\x6f\xcb\x66\x27\xd5\xd4\xf8\x83\x6f\x90\xae\xf7\xf2\x5e\xe5\xdf\x8b\x5f\xd3\x8b\x45\xe1\x3a\xdc\x0f\x0a\x35\xfc\x00\xe2\xd3\xc7\x29\x5c\x18\xa6\x3c\x25\xe2\x43\x5c\xae\xe6\x54\x5c\xeb\x6e\xd1\xe9\x65\x8a\xcd\xef\xc7\xea\x0d\x55\x33\x4c\x71\xcb\xc2\x5a\xf7\x0b\xbc\x1e\x74\x9f\x0d\x91\xf6\xb6\x70\xcb\x65\x9c\xb8\xb8\xa9\xcd\x44\x49\xb1\x37\x95\x2f\x24\x10\x3f\xf8\x19\xd9\x7c\x0e\x97\x54\xf7\x4d\xa8\xde\xc2\xc9\xbd\x64\x13\x9a\x33\xd6\xde\xc2\x84\x8e\x1d\x9a\xe6\x64\x8c\xf9\x20\xd4\x4f\xe0\xd9\x42\x19\x9e\x27\x66\x2f\xc7\x9b\x4a\xa4\x0e\xdf\xf0\x86\xd0\x97\xb6\x4e\xa2\x14\x23\x2c\xa6\x49\xed\x87\xe0\x1a\x80\xb7\x9b\xe9\x6f\x86\x00\xb5\xdd\x2f\x95\x15\x11\x00\x76\xae\x7f\x4b\xb7\x50\xc1\x6b\x6a\x81\xb4\xdd\x9a\xd1\xce\x60\xd7\x65\xd5\x19\x81\xba\xac\x1c\xc3\x43\x63\x86\xa3\x48\xa3\x6f\xbf\x63\x00\x5d\x6f\x37\x8d\x84\x66\x38\x69\x77\xa7\x4f\x5c\x58\xd9\xa5\xc4\x8b\x2a\x2f\xd6\x7a\xf7\xc5\xdc\xbf\x52\x28\xcf\x1c\xff\xed\xdb\x3a\x6e\xf5\x32\x60\x78\x32\x30\xf2\x06\x6b\x53\xb1\xc7\x3e\xc7\x24\xec\xd7\x3b\xf7\xe3\x62\x70\xfc\xf0\x2f\x84\xf5\xc7\xcf\xf5\x1f\xfa\xe3\x1d\x43\x1b\x0d\x91\xa4\xe2\x15\x78\xe6\x9a\x46\x11\x8e\xd8\x99\x92\xc1\x44\x51\x8a\x21\xa5\x69\x85\x14\xcc\x81\xd4\xd4\x58\x6e\x18\x76\x33\x89\xcc\xcf\x08\x57\x97\x20\x53\x10\x69\x4a\xc8\xa0\x7e\xbc\xb0\xc0\xbe\xd4\xa1\xba\x04\xb1\x03\x64\x48\xf9\x43\x75\x39\x2b\x2f\x16\x59\x45\x45\x9a\xfa\xa9\x53\xcb\xda\xa4\x96\xb5\x4a\x05\x97\xe8\xb5\x4c\x96\xbf\x21\xbd\xa2\xf3\x9c\xef\x67\xd5\x1c\x72\xcc\x97\xc8\x53\x02\x0e\x91\x61\x64\x1d\xd5\xe5\x3c\x3f\x85\x58\xda\x1c\xd2\xf5\x87\xcc\x39\xcb\x55\x2a\xc8\x43\xaa\x4b\x10\x88\x88\x14\x25\x19\xa9\x2e\x75\xc8\x09\x48\x54\xbf\x21\xfd\x3d\x65\x90\x06\xa2\x93\xea\x92\x5e\x72\xca\xea\xbc\x94\x89\xfa\x43\xe4\x48\x1b\x3e\x91\x2c\x7f\x41\x5a\x5e\xd0\xe3\xfc\x23\x74\x5a\xff\x16\xe9\x67\xa0\x74\x50\xbd\x3e\xcf\xd8\xe3\xbf\x96\x59\xf1\xba\x14\x10\xed\xd4\x06\x6c\x03\x48\xe4\x6a\x59\x8e\xc8\xb2\x72\x9d\xea\xf2\x8f\x5a\x36\x51\x0a\x78\xaa\x4b\x2d\xe1\x11\x69\x56\xda\x03\xbf\x9f\x97\xec\x4c\x25\x4b\xc9\x4f\x75\xa9\x45\x3f\x90\x6c\xc4\x40\xe2\x77\x5d\xeb\x86\xe8\xdf\x6e\xba\xd3\x99\x46\x12\x40\x69\x29\x12\xe4\x5b\x91\x92\xf8\x50\x32\x25\x99\x63\x04\x4c\xd5\xe5\x45\x06\x8b\x0e\x04\x4d\xe2\xcf\xe5\xa3\x8c\x53\x99\x02\x3f\x55\xaa\x7c\x95\x51\xe9\xf2\x43\xe5\x48\x51\x94\xca\xd1\x72\xa9\xea\xf2\x22\x67\x06\x93\xfc\xa9\x52\x1d\x4c\xfa\x43\xe5\x38\x98\xf4\x87\xc8\x29\xe7\xb0\x44\x41\x08\x56\x5d\x2e\xb2\xba\xfe\x50\xca\x55\xab\x7f\x43\x7a\x59\xc1\x12\x94\x52\xb2\xea\xd2\x11\x93\x41\xb2\x2b\x35\xab\x2e\xb5\xdc\x4f\x64\x59\x19\x60\x75\x59\x89\x8b\x08\x24\x4a\xc9\x76\x75\x09\x51\xd3\x23\xf9\x57\x7c\xdb\x30\x1a\x22\xd5\x7e\x89\x3c\x9e\x5f\x00\xac\x14\xca\x55\x97\x46\x2a\x27\x12\x1d\x11\x5d\x75\xb9\xac\x60\x77\x80\xa8\xae\xba\x94\xb2\x3a\x48\x50\x52\xbb\xea\x52\x8b\x23\x81\x7c\x18\xd1\x64\x75\x09\xe2\x3c\xd8\xb2\x52\xae\x27\x16\x6c\x3e\x97\x0b\x37\xd7\xbb\x97\xaa\xad\x4b\x1b\x76\x62\xbf\x3f\x64\xf1\xf4\x2d\x83\x70\xc2\xca\x66\x0c\x64\xaa\x3f\x7e\x8e\x0d\xac\x6b\x5e\x05\x0a\xeb\x53\x13\x94\xe2\x55\x59\x86\x6e\x72\x2a\x84\x0f\x10\x58\x31\xac\x14\x2b\x41\x2e\x78\x45\x5c\x7f\x05\x33\xd3\x8b\x72\x4e\x8a\x41\xb9\xf7\x50\x53\x77\x88\xbf\x2c\xf3\x72\xf6\x07\x29\x06\xb3\x9f\x8e\xe3\x6b\xa7\xda\x0b\x86\xdf\x31\x5c\x0e\x7e\xfa\x29\xc5\xf9\x85\x58\x3d\xe2\x1c\x28\x07\xf4\x23\xae\x07\xcb\x7b\xb8\x1e\xbc\xf9\x67\xaa\x07\xca\x8a\x3f\x0f\x7d\xe7\x29\x21\xa3\x3f\x42\x57\xab\xeb\x35\x6a\xda\xd9\x4e\x1a\xea\xf5\x0c\x53\x34\xa1\x4d\xa8\xc1\x22\x5f\xd0\x38\x1e\xe2\xf3\xc1\x1b\x14\x3f\xd7\x2f\x4a\x08\x25\xf1\x10\xcf\x06\xe5\x29\x92\xe6\x46\xf6\xd3\xc0\xc4\xa0\x01\x69\x5a\xfa\xbc\xe9\xa1\xc3\xb4\xd5\xc4\x07\xf1\x1d\xb5\x6f\xfa\xba\x5e\x8b\xeb\x45\x85\xf0\x35\x35\xf1\x38\x0c\x7b\xe4\x7a\x07\xbd\xb5\x60\x53\x9e\xc6\x39\x82\x0b\xbf\x69\xcc\x65\xc3\xd9\x91\x6d\x0b\xce\x2d\x27\xa7\xe2\xec\xf5\xc8\xa3\x49\x0c\x52\xc6\xaa\x39\x3c\xab\x55\x3b\x6d\xca\xd3\x0e\x61\x63\x85\xc5\x5c\x61\xd1\x63\x94\xc4\x32\xc4\x55\x9c\xe3\x21\xae\x30\xc7\x14\xf4\xcd\xa4\xed\x96\x6e\x7c\xd8\xef\x5d\x85\x95\x99\xf2\xb5\x5c\xd9\x7f\xae\x11\xae\x6c\xdf\x7e\xfb\x1f\xd9\xb7\xe1\x57\xe9\xdb\x63\x97\xd3\x86\x49\x3c\x1a\x00\x9f\x82\xff\xa2\xb0\xde\x0c\xe4\x81\x0b\xf9\x9b\x0b\x79\xe8\x7c\xb8\x25\x5e\x07\x71\x17\x2f\x4f\xf1\x4b\xee\xe3\x7e\x19\xc4\x2d\x20\x0f\x9d\x0f\xb7\xc4\x51\x57\xbb\x15\x7f\x85\x7f\x69\x34\xff\x45\x57\xf3\x75\x81\xc3\x76\x9a\x5b\xfe\x55\xa0\xc2\xd9\x79\x99\xcf\x28\x3e\x6c\xf4\xe6\x49\xa0\x2a\x0d\xea\x7e\xb9\x65\x1e\x85\xd0\x4b\x16\x10\xff\xda\xe8\xca\x1f\x41\x58\xc9\x01\xe2\x6f\x1a\xc0\x4f\x43\x8d\xd1\xc0\x87\xfe\xb7\x5b\xee\x63\xa8\x12\xc3\x4c\xe2\x9f\x1b\xd5\x3c\x0c\x55\x63\xc1\x0f\x9b\x29\x6e\xd9\x37\x81\xaa\x0c\x1b\x8a\x9f\x37\x46\xf7\xaf\x20\xf4\x59\xce\x31\x6d\x40\xfe\x12\x80\x04\xb6\x15\xf3\x06\xe4\xaf\x21\xc8\xf7\x94\xe1\xdf\x1a\x80\xdf\x04\x00\x25\xd3\x8a\x0f\x1a\xa0\x3f\x05\x46\x44\x81\x1e\xba\x5f\x6e\x99\x9f\x03\xe8\xdb\xbc\x2d\xfe\xbd\x51\xd5\xb3\x40\x55\x81\x62\x87\x5d\x39\x2e\xae\x7f\x6e\x6e\x02\xfe\xb3\x51\x37\xc8\xfe\xbb\xeb\x0e\x54\xea\x96\xe6\x55\xbb\x36\xcd\x8c\x63\xd6\xa8\x8a\x05\x80\x05\x97\x8e\xdf\x35\x00\xab\x00\xa0\x66\xc6\xf1\xeb\x06\x70\x1e\x04\xf6\x58\x70\xfc\xa1\x51\x26\x0b\x74\xba\x59\xe6\x30\x98\xec\x62\x29\x36\xd4\x8c\x7f\x6c\x54\x59\x6e\xa8\xb2\x59\x97\x5b\xae\x0e\x55\xa2\xef\x09\xb8\x6a\xd4\x32\x0b\x40\x5f\x64\x33\xfc\xaa\x01\xb7\x0c\xc2\xc1\xbd\x02\x17\x0d\xd8\x79\xa0\xe5\x1a\xf6\xd0\xfb\x74\x4b\x9d\x87\x6b\x90\xf7\x0a\x5c\x36\xea\x58\x84\xeb\x50\xd0\x87\x8d\x04\xb7\xe4\x69\xb8\x1e\x79\xa3\xc0\x75\xa3\x9e\xf7\xe1\x7a\x14\xf4\x61\x23\xc1\x2d\x79\x16\xaa\x47\xde\x9f\xf0\xac\x51\xcb\x55\xa8\x16\x05\x7b\xe8\x7d\xba\xa5\x2e\xc2\x35\xa8\x31\x58\x36\xea\x78\x17\xae\xa3\x31\x62\x56\xa5\xd4\x96\xdc\x0f\xd7\xa3\xc6\x60\xde\xa8\x67\x2f\x5c\x4f\x63\xc4\x74\x82\x5b\xf2\x38\x50\x0f\x2b\x19\x7d\x79\x8a\x5f\x34\x2a\x79\x1b\xa8\x44\x81\x1e\xba\x5f\x6e\x99\x3f\x43\xe8\x15\x2f\x70\xd9\xc0\xff\x7b\x08\xbf\xcf\x37\xb0\x36\xcb\xf0\x21\x50\x43\x39\x9f\xe3\xc7\x0d\xec\x3f\x86\xe0\xa0\xf1\x47\x0d\xc8\xc3\x40\x3b\xbc\x6e\xb6\x7a\xf9\x3c\x80\x5b\xdf\xae\xf1\x79\x03\xfd\x65\x00\xbd\x01\x3e\xf4\xbf\xdd\x72\xbf\x05\x2b\xe1\x9c\x56\x0c\x9f\x35\xea\x78\x1c\xac\x43\xc2\x1e\x7a\x9f\x1e\xf3\x19\xa8\x01\x6e\xf2\x78\xd1\xc0\xff\x3a\x80\x5f\x42\x1e\x3a\x1f\x1e\xf3\x19\xc2\xad\x44\x07\xf8\x7d\x03\xfd\x51\x00\x98\xe7\x17\x14\x5f\x35\x00\x5f\x04\xda\x01\x80\x87\xf6\xb7\xc7\x5f\x06\x10\x1b\xc9\x02\x3e\x6d\xb2\x98\x21\xe8\xaa\xc0\x17\x0d\xb8\x47\x81\x56\x08\xb8\x43\xf3\xd3\x63\x2c\x03\x58\x41\x36\x89\x9f\x34\xf0\x3e\x0d\x40\x2a\x89\x22\x7e\xd4\x80\xfd\x18\x5a\x1d\x65\xc5\xf1\x1f\x0d\xc0\x87\xa1\xa3\x4a\x8a\xd6\xf0\xd3\x06\xec\x9b\x00\xac\x11\x2a\xe2\xc0\x2b\x02\x48\xde\x5d\x36\x32\x30\x32\x16\xc1\x61\x23\xc1\x63\x2b\x03\x55\x6b\x11\xe5\x36\x35\xff\x1a\xa8\xd9\x94\x3f\xf4\xbf\x3d\xde\x33\xd4\x65\x25\x70\xc5\x1f\x9b\xdc\x67\xa8\x7b\x1a\xf8\xd0\xff\xf6\x38\xd0\x40\x25\x56\x16\x06\xa5\x1f\x36\xb9\xcf\x40\x55\x8d\x22\x87\xcd\x54\x8f\xe3\x0c\xad\x0f\x2b\xd5\xc3\x6f\x9a\x1c\x67\x1e\x5c\x26\x20\x12\xc5\x7f\x35\x80\x79\x08\x58\x0b\x50\xf1\x2f\x4d\x0e\x33\x00\xad\x44\xee\xf8\xd7\x26\x93\xf9\xff\xb2\xf6\x25\xcc\x6d\xdb\xd8\xe3\x5f\xc5\xe2\xa4\x1c\xa2\x84\x64\xd2\xce\x49\x1a\xd6\xa4\x69\xd3\x74\x37\x71\xb3\x75\x7a\x6c\x65\x6d\x86\x22\x21\x89\x0d\x0d\x6a\x41\xc8\x8e\x6b\xea\xbb\xff\x07\x0f\x07\x41\x4a\x4e\xbb\xff\xf9\x65\x26\xb4\x70\x3d\x00\x0f\xd7\xc3\xc3\x3b\x0e\xe4\x95\xc3\xf6\x77\xa6\x40\x59\x1e\x9e\x02\xee\xf0\xf7\xe8\xcd\x43\xed\xda\x36\xa2\xbe\x3e\x54\x9b\xcb\x51\x53\xa2\x1f\xdf\x2a\x13\xc0\x69\xb9\x0c\x86\x36\x20\xb0\xf1\x19\xcc\x71\x49\xb6\x14\x64\x5c\xc1\xaa\x81\x6b\x38\x5b\x80\xdd\xc6\xc9\x06\x12\xa6\xe6\x87\x7a\x88\x37\x8e\xac\x2a\x65\xb9\xa8\x26\xef\x02\xa6\x1b\x27\x6b\x70\x8c\x9f\xd5\xda\xf8\x19\x27\xf5\xd0\xf8\x59\x45\x82\x08\x73\x63\xfc\xac\xc4\x19\x66\x93\xcc\x75\xe8\xba\x1d\x1a\x44\x6b\xd0\x7d\xdd\xb7\x91\x5b\x83\x41\x34\x09\xcc\x18\x55\xa8\xac\x55\xc7\xce\x30\x45\x7f\x10\xab\x03\x03\xa1\x11\xfb\xce\x0d\xf5\x28\xf1\x03\x83\xa1\xd8\xbb\xf8\xd1\x60\x8e\x34\x07\xb2\x96\xd7\xd9\xea\x6f\x4d\x92\xfc\x40\xdb\x54\xe1\x77\x4e\xa0\x47\x95\x1f\xa8\xce\xb0\x98\xf1\x3f\x86\x64\xf9\xa1\xb6\x6d\xf0\x6f\x83\x6c\xeb\x43\xad\xd8\xd8\x26\x6c\x7a\x54\xf8\xe1\x69\x5a\x6e\x30\x65\x7d\xa8\xcb\x03\x39\x57\xbc\x2c\xb0\x18\x64\xbc\x39\x90\xb1\x90\x74\x30\x1b\x64\x5c\x1d\x68\x67\xe1\x10\xcc\xc5\x80\x5a\xbe\x3b\x00\x38\x63\x05\x5e\x0e\xe0\x5e\x1f\xc8\x57\x73\x7c\x33\xc8\xb6\x38\x8c\x7a\xbc\x1a\xe4\x7b\x75\x20\xdf\x75\xc9\x3e\x48\xca\xa0\x1e\xe4\x7d\x79\xa0\x4b\x26\xef\xbb\x5e\xb0\x47\x36\x1f\xaa\x21\xfb\x0c\xa5\x9a\x41\x0d\xbf\x1c\xaa\x41\xe7\x7d\xd7\x0b\xf6\x28\xe7\x03\x35\x18\x82\xe9\x03\xdf\x52\x9c\x0f\xaa\xf9\x78\xb0\x49\xcd\x27\xbc\x1d\x64\xbc\x3d\x34\x27\x17\x19\xc3\xeb\x41\xc6\x37\x87\x66\xe5\xa2\xbb\x09\xcb\xdf\x48\x79\x02\x7b\x57\xee\x3f\x81\x7c\x0c\x1e\x78\xf9\x70\x5e\x28\x80\x11\x48\xbe\x63\x98\x2a\xee\x23\xf9\xa0\x7e\x76\xec\x41\xf2\x5e\xc6\x28\x5e\x1e\xf9\x09\x7e\x2b\x8e\x1d\xf9\x56\x05\x14\x57\x8d\xfc\x01\x21\xcb\xfa\x22\x7f\xca\xb0\x65\x70\x91\x9f\x55\x70\x55\x0a\xf2\x5f\xf9\x13\x58\x54\xe4\x57\xf8\x79\x43\x19\xf9\xb7\xfc\xa5\x78\x45\xe4\x91\xfc\xbd\xcf\xc0\x21\xff\x1a\xc4\x93\xdf\x64\x84\xe1\xa4\x10\xc1\x31\x05\x56\x09\x61\xf2\x97\xe1\x85\x10\xae\x42\x3d\x0e\x05\x29\xdd\x48\x52\x41\xc8\x30\x0c\x48\xc3\x41\x58\x29\x27\xb9\xfa\x01\xf7\x76\xb2\xd5\x01\x6d\x1a\x6d\xad\x83\xea\x00\x27\x4b\x08\xaa\x0b\x2b\x59\xe9\x80\xce\x7a\xad\x83\x3a\xeb\x2b\xf0\x1e\x07\xb7\x18\x72\x09\xbf\x35\xaa\x3f\xc9\x40\x5d\x14\xe4\x16\x7e\x40\x86\x37\xf2\xa7\xb9\x8f\x90\xb7\x2a\x04\x57\x07\xf2\xbb\x0c\x00\xa5\x4f\x7e\x80\x9f\x7a\x7a\x92\x1f\x65\x48\xd2\xde\xe4\xbd\xfc\x65\x29\x6c\xf2\x13\x04\x79\x45\x5e\xcb\x1f\x40\xf5\x92\x3f\xe4\x4f\x4d\xd6\x92\xef\x01\x7e\xcd\x05\xf9\x13\x50\xa2\x08\x53\xf2\x8d\x0c\x58\x3a\x91\xfc\x2c\x83\x86\x7a\x23\xbf\x42\xa2\x26\xb3\xc8\x23\x19\xea\x68\x20\xf2\x2f\x80\xd8\x51\x3a\xe4\x37\x0d\x18\x88\x13\x42\x4b\xc0\xbc\xa6\x55\x88\x28\xf5\x04\xab\x1b\x4a\x58\xa9\xab\x21\x1c\xa2\xe1\x90\x22\x99\xfc\xad\x8e\x22\x52\xcb\xdf\x70\x42\x90\xa6\x04\xa4\xaa\x73\x80\x6c\x21\x61\x43\x0a\x5d\xb0\xdc\x90\x4d\x09\xb3\xa7\x2c\xc8\xb2\x54\x3d\xa6\xe4\x46\xfe\xca\x58\x41\xee\xe4\x8f\x9a\x93\x6b\x0d\x85\x2c\x4a\x35\x64\x72\x5b\x20\xaf\x4a\x35\xd4\x10\xb8\x2c\x1d\x54\xcb\x9d\x80\x7c\x2a\xb5\x6c\x1b\xf9\x08\xd5\x2e\x32\x46\x6e\x4b\xb3\x8e\xc0\xc9\x31\xf9\x61\xb8\xae\x54\xf4\x85\x5d\x79\x2a\xfc\x63\xb7\xd8\x54\xc4\x6b\x77\x91\xa9\xa8\xef\xfb\x2b\x4d\x45\x7e\xc3\x2c\x86\x54\x44\x65\x3a\xa9\x82\xab\xd2\x19\x24\x15\xf5\x8f\xde\xa0\xaa\xb8\xff\x72\xbb\x0c\x75\x26\xe6\x0c\xb5\x8a\xfa\xb7\x19\x7d\x15\x2c\xcb\x83\xab\x55\x25\xfe\x73\xb0\x64\x55\x2c\xe5\x66\xd8\x54\x38\x57\xa3\xa5\x02\xeb\x72\x7f\xb9\xaa\x94\xcc\x5d\xb3\x2a\xaa\x76\x16\xa8\x8a\x29\x7a\xab\x54\xc5\x6d\x7a\x4b\x55\xc5\xdd\xf0\x6e\x4c\x55\xcc\x2f\x65\xb7\x82\x55\xcc\x5d\x6f\x19\xab\xb8\x45\x6f\x2d\xab\xb8\x97\xbc\x9b\x2c\x3a\xa6\xb4\x4b\x5c\x03\x77\xd6\xb9\x8a\xf9\x68\xd7\xb8\x0a\xbf\x73\x17\xba\x8a\xfa\xec\xac\x76\x15\xf3\x9d\x5d\xf2\x2a\xfc\xa1\xbf\xda\x34\xd2\xcd\xf2\xd7\x73\x4c\x2f\x7a\x15\xfa\x96\xeb\x29\xaa\x82\x6f\x4a\x78\x1a\xde\xe1\x93\x67\x8f\x9f\x3d\xed\x1b\xb1\x9f\x50\x90\x47\x68\xdc\xa3\xa5\xe7\xf1\x49\x9d\x33\x2c\xbb\x29\x57\x99\xa8\xf9\x64\xdb\x50\xfe\x72\x05\xb2\xca\x4e\xec\xa6\xca\xc4\xb2\xe6\xd7\x98\x91\xe3\x15\xcd\x3f\xd5\x57\xc7\x57\xc5\x71\xa9\x74\x84\x29\xc2\x9c\x1c\xbf\xbb\xfc\xe1\xbb\xa3\xab\xe2\xd8\xc6\x95\xe4\xf8\x03\x2f\x0b\xca\xc4\xd5\x71\x30\x4d\x66\xcf\xc6\x2f\xe6\xed\x55\x71\x7f\x82\x77\xe8\x6a\x32\xf9\x9a\xdf\x24\xc1\x55\x11\xa2\xe3\x09\xfd\x4c\x73\xe5\x6b\xe6\xf8\xbb\x62\x45\xaf\x8e\x07\xf1\x15\xe1\x6d\x5b\xb6\x6d\x86\x6b\xe5\xb5\x6b\x6a\xd5\x3d\xcd\x8f\x77\x75\x41\xdb\xf6\x69\x12\x06\x59\xdb\x96\x68\x16\xcf\x11\x6e\xc8\x28\xf3\xfd\xe3\x5f\xe9\xe2\x9f\xa5\xb8\x3a\xee\x5a\x96\x93\xc6\xf7\x8f\xff\x25\x64\x27\xc2\xab\xc9\x55\x11\x76\x69\x5b\x55\x48\xa9\x68\xee\xb5\xa4\x20\x5b\xdf\x0f\xb7\xb3\x78\x8e\xd7\xe4\xf8\xc7\x0d\xe5\x99\x0b\x78\x43\x8e\x5f\x6e\x36\x15\x3d\x7a\x55\x5f\x6f\xb6\x82\x72\x9d\xd4\x21\xf2\x86\xb2\xa2\xe6\x08\x2f\xc9\xf1\xbb\x2c\x3f\xfa\xf1\xf2\xe8\xb7\xa3\xf8\xaa\xb8\xfa\x36\x98\x3d\x57\xf8\xb9\x2a\xd0\xd5\xb7\x1d\xc8\x1b\x72\xfc\x7e\x9d\x31\x51\x5f\xff\xe3\xb2\x8b\x5d\x91\x8d\xef\x07\xc7\xef\xea\x45\x59\xd1\xab\xe3\xab\xdb\xae\x07\x6d\xdb\xd5\x26\xd7\x46\xbd\xcd\xd7\xef\xeb\x92\x89\xe6\xfc\x04\xe1\x3b\x72\xac\x75\x4d\x3b\x60\xd7\x64\xd5\xb6\x77\x6d\x7b\x7c\x4b\x17\x3f\x5e\xb6\xdf\x54\x59\xfe\xe9\x1b\xca\xf9\x5d\x0b\x1d\x3c\x7a\x57\xb2\xd2\xfc\xac\x17\x65\xfb\xc3\x77\xaa\x5e\x67\xfc\x17\x12\x84\xec\x91\x86\x2a\x10\x7e\x45\x8e\xaf\x16\xaf\xf8\x8f\x97\x57\x8b\xae\xaa\x97\xe4\xf8\xb6\x64\xa6\xa0\x40\xf8\x92\xac\x7d\x5f\x2e\x62\x79\x55\x3a\xfe\x85\x72\xb9\x8f\x01\xda\xbf\x96\x03\xf3\x35\x3a\x46\xe9\xa5\xef\x07\x97\x44\x2d\xd6\xe0\x52\x0e\x2d\xc2\x97\xbe\x7f\x79\x4e\xe2\x27\xbe\x1f\xac\xc9\x28\x96\x63\x1d\x29\xa5\x8a\x5f\xc8\xc2\xf7\x83\xbc\x6d\xd7\xbe\xaf\xad\xf3\x5d\xb6\xed\xe5\x59\x7c\x32\x89\x63\x84\xf0\x27\xc2\xda\xb6\xf2\xfd\xfa\x9c\xbc\xe8\xa4\x29\x3e\xba\xf7\x9b\xce\x04\xac\x17\xfc\xa7\xbd\xba\x6a\x90\x17\xd2\xd0\x0b\xa6\xc9\x23\x08\x5d\x5d\x35\x5f\x7b\x8a\x68\xbb\xc5\x6f\x1c\x7d\x35\x6b\xa7\x80\x68\x59\x5d\x90\xf2\xe7\xe4\x63\x20\x90\x9a\x43\xca\x95\x8f\x95\x7b\x60\x93\x06\x24\x19\xb9\x52\x8b\x0a\xf9\x2c\x32\xb6\xff\xc1\x54\x86\x81\x61\x33\xca\xcb\x27\x64\x45\x61\x50\x4e\xf9\x2c\x9e\x87\x65\x02\x3a\x9c\x8e\x64\x48\x4f\xbc\x59\x36\x65\x5d\x56\xc5\x45\x5d\xd0\xc6\x6a\x94\x9e\x47\xe9\x78\x2c\x10\xd5\x12\xc6\xaf\x64\x8e\x80\x2a\xe5\x70\x08\x38\x06\xc1\x3a\x1e\x6d\x4f\xe2\x44\x56\x33\xc9\x36\x1b\xca\x0a\x55\x5c\xb8\x1c\x5a\xe3\xb1\xc6\xf4\x74\x68\x8d\xc7\x2a\xdd\x68\x1f\x0d\x41\xe9\xf6\x16\x61\x70\xd9\x34\x69\xc4\x5d\x45\x27\x79\xa3\x74\xc7\x39\xc2\x9e\x52\xae\x77\x4c\xef\xa1\xb2\xd7\x88\x41\x3d\xb2\x9c\xec\x79\x20\x90\x76\x04\x0b\x9e\xbe\x0c\x76\x32\x12\xa5\xd9\x99\x51\xf1\x4a\xc3\x30\x1b\x80\x13\xb3\xcc\xf1\x7c\xe5\x70\x92\x87\xfd\xeb\x3a\x6c\x73\x4f\x1a\x2a\x5e\x0a\xc1\xcb\xc5\x56\xd0\xc0\xe3\x75\x45\x41\x7b\x92\x36\x94\x09\x65\xa3\x1d\x61\x07\xe6\x77\x0a\xbd\xe5\x32\x38\x25\x44\x4c\x58\x5d\xd0\x0f\x77\x1b\x50\x1f\xb2\x3c\x0d\xd9\x17\xe4\x90\x13\xd6\xc5\x86\x8d\x09\x04\x4a\x8b\x5a\x42\x89\xe3\x03\x60\xd6\x75\x23\x40\x0b\xde\x58\x74\x1c\x45\xbb\xdb\x75\x59\xd1\x61\x25\x0e\x4f\xdb\x0a\xad\x03\x87\x44\xce\xa8\x9e\x96\xbd\x66\x74\x30\x04\x49\x8b\xba\xb8\x53\x46\x30\x77\x60\x44\x0b\xfc\x89\x36\xeb\xac\xa8\x6f\x7f\xaa\xeb\x41\xa8\x0f\x28\x45\xb2\x0d\x0f\xa6\x1a\x01\x16\x87\x87\xfe\xc0\x92\x4b\x61\xc1\x69\x03\x16\x6d\x1b\x38\x49\x21\x09\xd8\xd4\x3b\xf2\xe4\xa2\x09\xdd\x19\xfb\xe3\xc0\x89\x8f\x75\xa6\xe2\x1d\x79\x08\x2b\x5b\xc5\xcc\xb5\x55\xcc\x66\x7c\xee\xfb\xa3\x8f\x81\xfc\x81\xcc\x8e\x26\xd1\x1c\x12\xef\xc8\x0b\x21\xba\x6b\xf4\xed\x70\x09\x28\xbb\x90\xee\xe6\xf1\x85\xf5\xa2\xed\x3c\xf6\xe6\xd6\x77\xac\x08\x78\xdb\x52\xcc\x10\x86\x08\x65\xd7\x11\xa4\x71\xca\xdd\x03\xce\xdd\x2c\x5c\x39\x4e\xfb\x86\x24\x61\x84\x39\x58\x89\xfc\x50\x6b\xc4\xcb\xe4\x80\xf6\xe6\x46\x67\xeb\x5f\xf3\xad\x2c\x03\xab\x6f\x88\x92\x1f\x34\x44\xc9\x4c\xc2\xbe\x21\x4a\x81\x30\xdf\xc1\x3e\xfe\x9e\xf4\x09\x19\x63\x9d\xd2\xd9\xe8\x2e\x9c\x4d\x9b\x82\x95\xae\x2a\xbb\x9b\xdc\x72\xb9\x80\xf9\xa4\xbe\x65\x94\x7f\xab\xbb\xeb\xbc\x5f\x38\x85\x24\x00\xeb\x8d\xab\xa4\xb7\xce\xbb\x45\xa7\xa8\xa1\x9c\xae\x6d\x8c\xa3\x52\xb5\x11\x2b\xc5\x62\xeb\x9b\x01\xc7\x68\x4f\x9b\xc3\x69\x9a\x72\xe7\xa0\x0c\xa6\xbb\xc2\x68\xdf\x9a\xb1\xb1\x26\xb1\x8f\x4a\x76\x24\xda\x36\x10\xe4\x7e\x87\x30\x45\x74\xb2\xce\x1a\xc7\x89\x2a\x58\x47\x09\x46\xf1\x88\xc8\x63\x6c\x24\xf6\x93\x61\x06\xce\xf8\x1c\x8c\x68\xa3\x03\x8b\xe6\x0f\xd7\x99\x98\x36\x56\xeb\xfb\xe3\x98\x90\x00\x3c\x08\xd1\x8c\xcb\xb3\x78\xf6\x9f\xab\xe6\x6a\x1b\x45\x59\x34\x3f\x56\x40\x09\xb5\x47\x53\xb7\x7f\xf2\xb6\x8d\x70\x45\xca\xb6\x8d\x52\xeb\x3f\xac\x73\xb8\xe3\x5d\x09\x0f\x67\xca\x7f\xdd\x59\xd4\xb6\xf5\x39\x11\x96\xeb\x19\x06\x62\x9c\xa1\xb4\x0a\x49\x3d\xce\x70\x15\x12\x36\xae\xbe\x62\x38\x23\x75\x18\xef\x76\xab\xe9\xe1\x29\x60\x0c\xca\x92\x08\xd3\x9e\x1d\x59\x42\xb5\x0d\x16\xd5\xca\x5d\x22\x69\xc5\x3e\x0c\x39\xbb\x9d\xa9\xa4\xa6\xb1\x40\xf7\xbb\x9d\x22\x1e\xbe\x77\xe9\x64\xa5\x7c\x51\x38\x86\xee\x97\xce\x6f\xb8\x9b\x47\xae\x19\x67\x4e\x5e\x1b\x0b\x60\xda\xde\x04\xa4\xba\x33\xf6\xcf\xe1\x26\x13\xa5\xac\xb3\x80\x1e\x86\x0c\x95\xcb\x80\x82\xb9\x53\x8b\x26\xa6\xc7\x70\x1c\xef\xbe\x77\xa6\xa1\xad\x64\x80\xa4\xb2\x00\xc4\xc8\xe6\x9d\x91\x50\xd2\x32\xf2\x32\x34\xa5\x93\x65\x80\x12\xc7\x14\x06\x35\xad\xd6\x99\xc7\x36\x2f\xda\x61\xb7\xa2\x86\x8a\x01\x89\xa3\x71\x21\xb4\x12\xab\x2d\x18\xd2\x54\xeb\x16\x95\x45\xdb\x6a\xeb\x4c\xf0\x7e\x28\x29\xb2\x3d\x4b\x31\xa5\xb1\x0e\x53\xf6\xec\xbb\xb8\x18\xb5\xaa\x64\x80\x6d\x86\xd4\xd6\xf0\x0d\xb9\x17\xb5\x32\xcd\xb5\x2f\xdc\xeb\xbd\xaa\x0b\xfa\xae\xe4\xbc\xe6\x93\xf7\x59\xd3\x78\xbb\x1d\xfe\x99\xdc\x37\x39\xaf\xab\x2a\x19\xc5\x3b\xfc\x5f\x72\x5f\xf3\x72\x55\xb2\xc4\xfb\xfa\xba\xde\x36\xd4\xdb\xe1\x5f\xbb\xb8\x50\xee\x4c\x9e\x33\x68\xff\xde\x5b\xa5\x24\xc2\x25\xb1\xf3\x3d\x1b\xce\x77\x8e\x52\xb9\x9c\x32\xb0\x55\xd4\x2d\x1a\xe5\x25\x32\x1b\x83\xd9\xd4\x8c\xd8\x94\xb6\x2d\xc3\xca\x59\x17\x3c\x54\xf6\x45\x4b\x16\x54\x58\x8c\x4b\x58\x3d\x65\x28\x4b\x62\x4e\xb2\x30\xc6\x32\xc4\xc6\xe5\x57\x0c\xb9\xc5\x76\x40\x91\x3e\x22\x33\xcf\x9b\x77\xad\xff\x87\xa1\x06\xd3\x47\xba\xbe\x33\x42\x53\xf4\x48\xa9\x7c\xfe\x2b\x78\x84\x42\x79\xc2\x99\x8d\xe2\xd1\x8c\xce\x9d\x57\x36\x77\x87\x9d\xd1\xce\xcd\x95\xf3\xaa\x36\x9c\xd2\xb3\x39\x3e\x60\xd9\x9f\x81\xfd\xd5\x40\x6e\x4a\x0e\x8d\xc4\x9c\xd7\xb5\x00\xdd\x3b\x6f\x67\xd4\xb5\xfa\xa5\x73\x6b\xc1\x51\x75\x68\x4d\x19\xe9\x85\x03\x8a\x92\xe0\xb7\x6e\xde\x82\x35\x55\x39\x33\x7f\x43\x58\xf8\xfe\xb7\xf0\x82\x84\x19\xe0\x48\x50\x72\x3c\x93\x9b\x5b\xb1\xbc\xda\x46\x4f\x9e\x3f\x93\xdf\x17\xd1\x58\xfe\x59\x3e\xbe\xda\x46\x4f\x23\x08\x3c\x5d\x2e\xaf\xb6\xa7\xd1\x63\x19\x38\x8d\x5e\x40\x20\x53\x01\x48\x79\x0c\xd9\x1e\x17\x8b\x27\x57\xdb\xc7\x14\x02\x2f\x96\x79\x7e\xb5\xcd\x72\x08\x14\xcf\xb2\xe5\xfc\xd8\x31\x59\x41\x3b\x7c\x1e\x5f\xdd\x3a\x77\x36\x7a\xee\x5d\x7d\x7e\x1e\x79\xbe\x1f\xd0\x89\xa8\x7f\x36\xec\xbe\x00\x8d\x86\xde\x5f\xda\x56\x50\x53\xd0\x7d\xe6\xa3\x3d\xea\x5c\x4c\x47\xa3\x40\x4c\x9a\x7a\xcb\x73\x77\x7a\x5e\xdd\x7a\xe8\x7c\x1c\xfb\x3e\xb4\x45\x02\x33\xb0\x12\x88\x71\xde\xfe\xe8\xbe\x9a\x24\x6c\x4f\xc3\x33\x07\xcc\xcb\xcc\xc4\x7c\x68\x89\x79\x14\x01\xb2\x33\x8d\xec\x53\x85\xd3\xd3\xa7\x12\xe7\x8f\x9f\x9f\x8e\xe1\xcf\x0b\x40\x7d\x0c\xa8\x5f\x14\xf0\x85\x31\xc9\x63\xf8\x9e\xc0\xf7\x31\x7c\x9f\xc0\x57\x8e\xd5\xd3\x58\x0d\x4f\x9c\xc9\xef\xe3\x05\x04\x9e\x50\xf9\x7d\x16\xc9\x6f\xf1\x14\xa2\x8a\x1c\xbe\x14\x02\x14\x06\x96\x42\x79\xfa\x1c\xbe\x99\x4a\x90\xd5\x3e\x8b\x65\x85\xcf\x4e\x01\xf0\xb3\xc7\x12\xf0\xb3\x0c\xa0\x3c\x5b\x48\x90\xcf\x28\xd4\xf2\x6c\x79\x7a\xb5\x8d\x9e\xc7\x90\xf2\x3c\x7e\x01\x5f\x48\x79\x7e\x02\x29\x27\x4f\x54\xe0\x19\x7c\x5f\xa8\x80\xac\xe0\x85\xea\xfe\x8b\x48\x76\xe9\xc5\xa9\x6c\xd9\x8b\xc7\xd0\xef\x17\x8f\x9f\xc3\x17\x72\x3d\x51\x51\x4f\x64\x67\x5f\x3c\x85\xbc\x4f\x25\xe0\x17\xcf\x65\xfb\x5e\x2c\xa0\xdc\x42\x76\xf5\x45\xae\xb2\x02\x76\x5e\xe4\x50\xba\x90\xd5\xbe\xa0\x50\x8c\xca\x62\x59\x14\xc3\x57\xc6\x64\x50\x69\xf6\x18\x62\x1e\x43\xcc\xe3\x67\xf0\x7d\x0e\x5f\xe8\x46\x06\xcd\xc8\x9e\x40\x26\x40\x66\xf6\x4c\xfd\x96\x2d\xca\xa0\x15\xd9\x73\x28\x0c\x6d\xc9\x54\x2b\x32\x18\x9d\x0c\x46\x27\xcb\x01\x1e\xb4\x28\x83\xb6\x64\xd0\x96\x05\xb4\x65\x01\xad\x58\x9c\x52\xf8\xca\xb1\x5e\x28\x34\x2c\x1e\x3f\x86\xaf\x2c\xb6\x78\xf2\x14\xbe\x12\xdc\x02\xb0\xb0\x00\x2c\x2c\xa0\xe6\x05\xf4\x7f\x91\x47\xf0\x85\xfc\xd0\xf1\xfc\x14\x46\x3a\x7f\x1c\xc1\xf7\xa9\x0a\x3c\x87\x6f\xa6\x02\x32\x73\x0e\xc8\xcd\xa1\x8a\x1c\x80\xe7\x00\x3c\x87\x0e\xe5\x30\xff\x72\x98\x79\x79\x0e\x79\x72\x88\x87\x8a\xf2\x02\xca\x16\x10\x0f\x7d\xcb\xa1\x6f\x05\xf4\xa7\x50\x3d\x29\xa0\x27\x05\x54\x56\x40\x1f\x0a\xa8\xa6\x80\x6a\x8a\x3c\x83\xaf\xac\xa6\x28\x4e\xa0\x40\x01\x05\x00\x6a\x01\x7b\x12\x3d\x8d\xe1\xfb\x78\x0c\x7f\x64\x09\xfa\xf8\x19\x04\x1e\xcb\x9a\xe8\x02\xd2\x17\x2a\x7d\xf1\x02\xbe\x0b\xf8\xca\xc6\xd2\xfc\x39\x24\x40\x9b\x97\xf1\x73\xf8\xca\x4c\xcb\xd3\x27\xf0\x7d\x06\x5f\x88\x79\x06\x6d\x5e\x3e\x93\x60\x97\xcf\x61\x92\x2e\x9f\x3f\x86\xef\x53\xf8\x42\x5e\xb5\x3b\x2e\x5f\xa8\x00\xcc\xeb\x25\x54\xb5\x94\x38\x8a\xa3\x93\x62\x2c\xff\x9c\x46\xf0\x3d\x51\x81\x67\xf0\x7d\x01\xdf\x0c\xbe\x05\x7c\xa9\xfc\x3e\x79\x0e\x5f\x48\x7d\x42\xa1\xc0\x53\x28\x0d\x0d\x8a\xa3\x67\x8f\xe5\x57\x0e\x78\x1c\x3d\x7f\x02\x5f\xa8\xe9\x39\xc0\x78\x21\xbf\xa7\x4f\x96\x57\xdb\xf8\x59\x0c\xd5\x3d\x8b\x65\x81\x67\xaa\xee\x67\xa7\x10\x78\x72\x02\xdf\x53\xf9\x7d\x06\xbf\x9f\xc1\xef\xc5\x33\xc8\x24\x37\x9c\xf8\x19\x74\xe0\x59\xfe\x02\xa2\x0a\x48\x2f\x64\xc2\xf3\x48\xae\x88\xf8\x79\x04\x81\x4c\x36\xf4\xc5\x89\x44\x43\xfc\xe2\xe4\x04\xbe\xcf\xe0\x2b\xfb\xf1\xe2\x14\x62\x4e\x01\xc8\x8b\xd3\xc5\xd5\x36\xce\xe2\x67\xf0\x95\xc9\x99\x9c\x6c\x71\xf6\x44\x8e\x4a\x9c\xc9\x9d\x2a\xce\xa0\xb3\x99\x9c\x18\x71\xf6\xf4\x09\x24\x3c\xcd\xe5\xf7\xd9\x29\x04\x9e\xa9\x80\xec\xe1\x02\xf6\x8e\x78\x11\xc9\xc6\x2d\xa0\x6b\x8b\xd3\xa7\x10\x05\x78\x85\x35\x15\x2f\xe4\x9a\x8e\x17\x4f\xa1\xd5\x0b\xe8\xe8\xe2\x79\x04\xdf\x58\x7e\x33\xc0\xcc\x22\x7b\x02\xdf\xe7\xf0\x95\x9d\xca\x4f\x72\x99\x90\x9f\x9e\xc2\xf7\x29\x7c\x65\xdb\xf3\x02\xaa\xcd\x8b\x13\xf8\x3e\x86\x00\x8d\xe0\x7b\xa2\x02\xcf\xe1\x2b\x11\x54\xe4\x90\xb9\xa0\xb2\x7c\xb1\x84\xe9\x50\xc8\x53\xf2\x24\x8a\x72\xf8\x16\xf2\x0b\x20\x4f\xa2\x65\x74\xb5\x3d\xc9\xe9\x52\x06\xf2\x65\x7c\xb5\x3d\x29\x28\xa4\x14\xea\xc8\x3d\xc9\xe0\x94\x3d\x81\xc0\x8b\x17\xf0\xcd\xae\xb6\xd9\xd3\xa7\xb2\x48\xf6\x54\x0e\x66\xf6\x54\xa2\x28\x7b\xfa\xac\x90\x5f\x09\x31\x7b\x2a\x41\x65\xcf\xe5\x76\x97\x3d\x8f\x9e\xc2\x77\x21\xbf\x27\x4f\xe0\x0b\x31\x72\xc3\xcc\x9e\x43\x75\xd9\x73\x28\xf0\xe2\x44\x22\x33\x7b\x21\x37\xea\xec\x05\xac\xb3\xec\xc5\x13\x48\x81\x05\x91\xbd\x90\xd3\x30\x7b\xb1\x38\x85\xaf\xca\x2c\x17\x5d\x06\x1b\x72\x96\xc1\x46\x9f\x65\x27\x54\x7e\xe5\xd2\xcd\x32\x39\x21\xb2\x4c\x2e\xb7\x2c\x93\x38\xcd\xb2\xc7\xa7\xf0\x85\x02\xf2\x4c\xc9\xb2\xc5\x09\x14\x5b\x3c\x86\xef\x33\xf8\x3e\x87\x2f\x00\x92\x3b\x51\x96\xc9\x93\x30\x5b\xd0\x27\xf0\x7d\x0e\xdf\xe2\x6a\x5b\x68\x0a\x63\x29\xf1\xb5\x5c\xc4\xf4\x6a\xbb\x54\x14\xc8\x92\x46\x32\x8a\x9e\xa8\x80\xec\xf3\x72\xf9\x82\xc2\xb7\x47\x8d\x54\xb4\x77\x7f\xce\xb5\x81\xdb\x97\x22\x88\xd0\x39\x79\xf6\xf4\xb9\xef\x67\x96\xd2\x70\xc4\x4a\xa8\x4b\x0f\xa7\x01\x3b\x8b\xa6\xe2\x3c\x4a\x3a\xef\x5c\xc8\xf7\x25\x6c\x63\xd0\x53\x20\x94\x22\x11\x12\x76\xe0\x32\xda\xd0\x7d\xe2\x5a\x9c\xb3\xe9\x38\x4e\xe2\x54\x89\xdc\x08\x42\x98\xf5\x3e\x92\x2a\xee\x48\x20\x42\x86\x8e\x4f\x70\x46\xf8\x59\x34\x05\x72\x39\xa7\x65\x15\x94\x28\x81\xc0\xb2\xaa\x6b\x1e\x28\xca\x39\x73\xee\x52\x34\xc8\xd0\x54\x24\x2c\x85\x1f\x8c\x64\x89\x20\x59\xa8\x29\xe7\x9c\xc2\xf5\xae\x43\xd0\x96\xf6\x78\x27\xa9\xcd\xa0\x9b\x2a\xef\x00\xa5\x7b\x7d\x2b\xed\x85\x60\x56\xce\xa1\x6e\x30\x1d\x7c\x26\x7c\x3f\x9b\x88\xfa\xdc\xb6\xa3\x4c\x65\x18\x2e\xde\x3a\xcf\x88\xc8\x18\xdf\xf7\x16\x74\x59\x73\x0a\xde\xcc\x38\x29\x93\x9c\x92\x12\x61\x95\xe7\x4b\xf9\x47\x6e\xfe\x9d\x23\xa9\x33\x22\x7c\xca\x93\x9c\x42\x17\x8b\x87\xb4\x2a\x9d\x89\x70\x46\x4e\x1e\x3f\x9b\x7a\x0b\xf3\x4f\x34\xe2\xb6\x59\xf4\xfe\x35\x4d\x23\x6e\x2f\x2e\xbe\xfa\xea\xab\x0b\xf8\x87\x2f\xf0\x45\x6c\xff\xa9\xb8\x8b\xb7\x0f\xfe\xfb\x3b\xe9\xba\xa2\xc5\x83\xff\xb0\xac\x1e\xea\x57\xf0\xbe\xfa\x2a\x8e\xe1\x67\xfc\xf6\x4b\xe0\xbf\x50\xad\x4a\xf7\xac\xff\x0e\x94\xc4\x8f\x4f\x1e\x9f\x11\xea\xfb\xf4\x8c\xc4\x4f\x4e\x1e\x4f\xbd\x9f\xbc\x24\x7e\x72\xfa\xd4\x46\x3e\x7b\xfe\x64\xea\x31\xf8\x77\x71\xc1\xbf\xfa\x8a\x63\x7e\x71\x71\xdd\xfd\xe3\xff\xe3\xbf\xeb\x43\xff\x98\xfd\xf7\x15\x63\x32\xd3\xff\x0a\xf5\xff\xeb\x9f\xa9\xfc\xc2\xf4\xe4\xfa\xfa\x42\xfd\xe8\x86\xba\x43\xd6\x58\xa2\x05\x25\xf1\xb3\x67\x16\x63\x27\x27\x27\xd1\xd4\xe3\x5e\xf2\x3c\x7e\x71\x62\x22\x9f\x9f\x44\xa7\x53\xef\xd6\x4b\x9e\x9f\x44\x8f\x09\xa1\x53\x6f\xe1\x25\xde\x5b\x4f\xdd\xcb\xd4\x4d\xe1\xc1\xab\x58\xf4\x4c\x05\x9e\x67\xf9\xfc\x18\x33\x72\x3c\x93\xf3\x70\x7e\x8c\x39\x39\x9e\xbd\xfd\x89\xcf\x8f\x71\x29\x7f\x2d\x62\x36\x3f\xc6\x19\x39\x9e\xc9\x1f\xce\x8e\xd7\x33\x8b\x5a\xd1\x1b\x5a\x19\x87\x4e\xb0\xbe\xb4\x81\x26\x51\x13\xb6\x1b\xb2\xf3\x6a\xdc\xa8\xd5\x9d\x13\xaf\x12\xdc\x23\xa4\x99\x7a\x6f\xbd\xc4\xfb\xc9\xd3\xce\x23\x6a\x7b\x9f\x37\x19\x7c\x7f\xa4\xaf\x57\xb5\xe3\xa7\xc6\x6c\x1f\x5b\x5b\x02\x17\xf2\xd6\xbc\x26\x51\xba\x3e\xdb\xa6\x61\xb8\x46\x85\xba\x9e\xd3\xa0\x76\xf7\xe5\x35\x42\x1d\xef\x6d\x43\x22\xbc\x24\x79\xba\x81\x22\x1b\xd5\xb8\x1b\x52\xcc\x36\xf3\xd4\xbb\xf6\x08\xb9\x99\xca\xdf\x64\x99\x2c\xc9\xcd\xce\x94\x5a\x91\x08\xdf\x91\x3c\x5d\x41\xa9\x95\x2a\x75\x4d\x8a\xd9\x6a\x9e\x7a\xb1\x47\xc8\xb5\xef\x7b\xb2\xf1\x77\x53\x19\x47\x3c\xe6\x25\x5c\xf5\xe1\x1a\xf9\x7e\x70\x47\xae\x31\xa4\x5f\xfb\x7e\xa0\x72\xfc\xe4\xc9\x7b\xa8\x86\xbf\x20\x31\x7e\x45\x8a\x59\x34\x4f\x17\x67\xdb\x71\x9c\x86\xe1\x42\x55\xf2\x92\x14\xb3\xc5\x3c\xf5\x42\x8f\x90\x97\xbe\x0f\x95\xbd\xd2\x7f\x8b\xd9\x22\x8c\xe7\x53\x99\x81\x78\xb1\x97\x78\x58\x65\x7a\x65\x92\x7c\x3f\x50\x05\xda\xd6\x63\xf2\x2f\x82\xea\x17\x73\xf2\x0a\xe1\x57\xe4\xa5\xad\xff\x92\x44\xe9\x25\xf4\xed\x52\x55\xfb\x0b\x29\x66\x97\xb0\x19\x03\xd0\x5f\x90\x0c\x12\xef\xc2\xb3\xcf\x41\xde\x57\x10\x0f\xb9\x3f\xb9\x06\x4c\x3e\x91\xcb\x30\x4e\x3f\x9d\x6d\x7d\x1f\xf2\x14\xb3\x4f\xf3\x34\x0c\x3f\x75\x63\xf0\x91\x5c\xfa\xbe\x37\x82\xb4\xcb\x71\x3c\x6f\x5b\x95\x3b\xd6\xb9\xa7\xd0\x99\x0b\x0f\xdf\x92\xcb\xf4\xf6\xec\x53\x1a\x86\xb7\xa8\x98\xdd\xce\xc9\xc7\xf4\x92\x7c\x1a\xc7\x3b\xdb\xf0\x37\x24\xc2\xef\x48\x9e\xbe\x81\xc6\xbf\x51\xcd\x79\x4b\x8a\xd9\x9b\x79\xea\xbd\xf5\x08\x79\xa7\xe1\xbe\x9d\xca\x38\x22\xe7\x9e\x1e\x98\xb7\x12\x19\xef\xc8\xdb\x6e\x14\x3e\x93\x28\xfd\x0c\x80\x3e\x83\xa1\x6f\x95\xaf\x98\x7d\x9e\x6b\x21\xda\xdf\xdd\x7e\xfe\x4e\x3e\x87\x71\xfa\xbb\x6c\xb9\xcd\xf9\xfb\x1c\xa5\x61\xf8\x7b\xd7\xd5\xef\x08\xb4\x22\xf8\x3c\x2d\x66\x9f\xc7\xf1\x3c\xc9\x11\xfe\x81\x7c\x47\x48\xa0\xe2\x7f\x3f\xdb\x4e\x65\xb1\x24\x47\x68\xfa\x9d\x59\x1a\x49\x8e\x3f\x90\xcf\xe9\x87\xb3\xdf\xd3\x30\xfc\x80\x8a\xd9\x87\x39\xf9\x21\xfd\x4c\x7e\x1f\xc7\xb6\xb1\x3f\xe2\xf7\x72\xfa\x5f\x90\x28\xbd\x38\xdb\x82\x65\xf2\xd2\x34\xe3\xc2\x34\xf8\x27\x72\x01\x4d\x09\xc3\x0b\x99\xcb\xf7\xdd\x2c\x69\x18\x5e\xa0\xf4\x7d\xe7\xc1\xb3\x0a\x22\xfc\x13\xbe\x40\xda\xd3\x8a\x04\xf0\x9a\x5c\xe0\x6f\xc9\x7b\xb3\xe2\xfe\x20\x1e\x17\x15\xac\xe2\x38\x89\xfa\xa0\xbd\xb7\xde\x88\x48\xc0\x0a\xae\x69\xe7\xf7\xe4\x75\xfa\xfd\xd9\x05\x34\x30\x33\xb5\x7f\x2f\x1b\xf8\xfa\xec\x7b\xdf\x0f\xde\x1b\xbb\x34\xdf\xe2\x08\xab\x56\xc4\xf8\x35\xfe\x1e\x21\xfc\x6d\x48\xfe\x50\x0c\xc0\x3f\xc9\xf7\xba\xb2\xef\x25\x30\x20\x0c\x2c\xa4\x34\x0c\xbf\x97\xfd\xd8\x83\x73\x82\xff\xb4\x70\xf0\x6b\xf2\x3d\x74\x4b\x82\x78\x2d\x41\x3c\x50\xb1\xec\xbe\xe6\x89\xda\xfd\x28\x88\x09\x79\xaf\x1e\x99\x6f\x68\xe5\xfb\xc1\x8f\xa4\x36\xaf\xef\xff\xb9\x6a\x42\xc5\xea\x87\x1c\xb0\x23\xfe\xd8\x3d\x48\x83\xf4\x30\x38\x37\xb0\x28\x8e\xb0\x93\x8e\x10\xc2\x31\x21\xff\x0a\xde\xa3\x43\xd0\xaf\x9a\xf0\x91\x82\x0e\x39\x44\x3d\x1e\x00\xef\x0d\xde\x76\xec\x26\x6e\xc1\x95\x81\x1d\xb0\xf7\x13\x4e\x6f\x28\x6f\x68\x80\x92\xf7\xbb\x9e\x55\x84\x35\xed\x3f\x09\xd6\xbc\xa0\x3c\x75\xc8\x21\x42\x94\x67\x07\x9d\x44\x0a\x49\xa8\x0a\x70\xa9\x81\x0c\x7b\x70\x03\xe6\x98\x97\x94\x0c\x9f\xd0\x80\xfb\x95\x15\xca\xc9\xa7\x31\x37\x84\xf6\xa3\xc0\xd3\xf1\x28\xee\x5e\x9c\xe9\x24\x13\x22\xd3\x1e\x64\x50\x2f\x14\x78\x35\xf3\x42\x09\x3e\xb5\x73\x95\x13\x3a\xf9\xa8\x59\xe0\x0d\xbc\x5f\xda\x10\xb9\xdf\xa1\x14\x4c\xe6\x07\xf2\xdb\xb6\x1b\x8a\x3a\xa3\xa5\xae\x18\xc0\x4d\x9f\x21\xe8\xc0\xf0\x7d\x27\xa0\x81\x38\x02\xca\xb4\xd7\x5d\x25\x20\x30\xec\xf1\x81\xd8\x03\x9d\x2e\xa8\xdb\x69\x27\xf4\x97\x9d\xc6\x25\xe1\xbe\x0f\x36\xae\xe5\x76\x60\xe8\xea\x3f\x83\x52\x96\xc9\x80\x83\x09\x08\x20\xa5\x95\x8c\xc8\x2c\x22\x4c\x1c\x18\xe0\x47\x3b\xe7\xc5\xed\xae\x37\x3f\x6e\x3a\x75\x03\xf3\xb4\x8b\xba\x7b\xc8\xdf\x7a\xf8\x3b\x41\x58\x5d\x03\x98\x7b\x0d\x60\xb3\x72\xee\xbe\xfa\x71\x57\x50\x9b\xf6\xcd\x61\xec\x8b\x34\xc0\x63\x9b\x71\xc4\xdd\x77\xdf\xb1\x67\x78\x4b\xbf\x5e\xbe\x57\xb9\xb4\xad\x3d\x84\xa1\x9f\x0c\xb8\xbb\x77\x1b\xaa\x2c\x34\x7c\xa2\x81\x00\x86\x6f\x5e\x17\xf4\x1a\x5e\x48\x7e\x58\xb1\x9a\x3b\x63\xbf\xa0\xdd\xbb\xe7\x43\x13\x66\x92\x6f\x79\x53\xf3\x97\xb9\x28\x6f\x4a\x71\x97\xf6\x04\x2a\xe0\x19\x7e\xcb\x7f\xdc\x0c\x72\xbd\x71\x27\xf3\x97\x32\x90\xd9\xdc\xbc\xb6\x3b\x62\x19\x1c\x8d\x63\x42\xfe\x0c\x18\x16\x33\x3e\x47\xf2\x9c\x52\x16\x2b\x65\xc8\x11\x5a\xef\x4f\x79\x3d\xbc\xd6\xf6\x99\x23\xb1\x4e\xd5\x63\x99\xfb\x9c\x36\x78\xe4\x5a\x52\x2d\x6c\x8d\x05\x98\x77\x71\xb2\x2e\x97\x83\xbc\x2b\x37\xaf\x23\xe1\x6e\x6b\x71\x87\x70\xba\xef\x92\x25\x91\x0b\x4a\x36\x59\x99\xc3\x1f\xc5\x8e\xe4\xbb\x86\xd1\x88\x7a\xf3\x9e\xd7\x9b\x6c\x05\x92\x23\xd3\xbd\x18\x80\x92\x67\x2c\xa7\xd5\x37\xdb\xc5\xa2\xa2\x72\x26\x74\xa2\xf0\x74\xa0\xc0\x31\x22\x74\x6f\xee\x4c\xf7\xa3\x92\x88\x90\x5e\xe3\x1c\x61\x79\x00\x09\x7d\xc4\xbf\xf4\x9f\x0e\x6e\xfb\x9c\x05\x91\xf1\x15\x15\x6d\x4b\x27\x0d\x37\xa6\x38\x1d\x11\xf9\xde\x9c\x03\xff\x41\xfd\x0d\x5b\xae\x87\xd8\xa7\x93\xc5\x56\x88\x9a\x4d\x05\x89\x93\x13\x37\x78\x9a\x3c\xb6\x41\x58\x3a\x27\x08\xe1\x05\xd8\x4b\x54\xae\x86\x7c\x3f\x56\x50\x04\x39\x45\x58\x28\x69\x7b\x8a\xdf\x52\xfc\xb9\x77\x1f\x2e\x97\x41\xe5\xfb\xf5\xd9\x8b\x8e\x56\x57\xe2\x91\x9f\x03\xaf\x28\x6f\xec\x23\x99\x57\xf0\x6c\xb5\xca\x16\x15\xf5\x4a\x76\x44\xdb\x16\x22\xbe\xe5\xf5\x06\xc2\xbd\x03\xe9\x77\xe8\x9d\xb6\xa4\x4c\xc8\x3b\xdb\xd5\xcf\x81\xd7\x6c\x32\xe6\x61\x0f\x98\x63\x0b\x0f\xa5\x6f\x03\x8a\x6d\xf4\x4c\xe0\x87\x64\x99\xbc\xcf\x1e\x18\xc1\x8e\xe4\x20\x76\x22\x5b\xda\xd7\xeb\x1b\x5a\xae\xd6\xb2\xb7\xef\x28\x31\xfe\x5f\x7f\x2d\x0b\xb1\x3e\x23\xb1\xef\x8b\x5e\xae\xf3\x13\xdf\x1f\xa9\x4e\x3f\xd7\x6a\x08\x8c\xbc\xa3\xd3\xfd\xc6\x25\x4e\xd4\xe7\x2c\xf2\x94\xc1\x25\x4f\x0b\x5d\x24\x47\x25\xab\x4a\x46\xc7\x8b\xaa\xce\x3f\xa5\x47\xb7\xb2\xbe\xe4\x28\xde\x7c\x4e\x8f\xae\x33\xbe\x2a\xd9\x98\xcb\xfa\x92\xa3\x71\xbc\xf9\xdc\xbd\x36\xb2\x81\x8c\x54\x7e\x3d\x56\x2e\xf9\x3d\x4f\x1e\xc6\x9d\x68\x94\x8b\xc5\x11\x79\x6b\xdd\xd1\xbe\x35\x76\x2a\x25\xee\x1e\xc4\xd7\x4b\x79\x81\x3c\xa1\x2f\x3d\x79\xc4\x93\xdb\x40\xe0\x08\xc7\x68\xb2\xa2\xe2\x9b\x7a\xcb\x8a\x92\xad\x5e\x55\x25\x98\x86\xcf\x05\xf8\x64\x92\x59\x62\x7c\xf2\x60\x96\xd4\x91\x81\xc3\xa3\x60\xc4\xda\x56\xee\xff\x4b\xf0\x2e\x02\x3d\x95\x84\xce\x5b\x4a\xb8\x0a\x8d\x75\xec\xd9\xa9\x42\xf2\x0f\x14\x7f\xa0\xe4\x74\x44\xbc\x2b\x76\xc5\x16\x9e\x16\x35\x3a\xbe\x62\xc7\xd6\x11\x89\xfb\xac\xdf\x49\xf3\x45\x58\xbf\xb0\x76\xae\xf0\xcf\x08\x4f\xad\xe7\x74\xe7\xa9\x8f\x79\xf2\x6c\x93\x1b\xa7\xf2\xe9\xd4\x7f\x89\xce\x88\x3e\xd1\x02\x81\xbd\x2b\x49\x1e\x5a\x86\x5d\x39\x8e\xd1\xb4\x1c\xc7\x49\x89\x70\x45\x32\x07\x24\xf7\x24\xc0\x11\xa9\xa6\x81\xde\x81\x33\x7b\xfc\x56\x08\x61\x11\x92\x2a\x8c\x51\x62\x53\x11\x16\xa4\x0c\xe3\x8e\x23\xb5\x3b\x64\x39\x93\xda\xfe\xf3\x2b\x36\x6d\x25\x16\x76\xf8\x47\x4a\x6e\x4b\x56\xd4\xb7\x72\x10\xac\xc3\xdc\xe9\x50\x9c\xa3\x03\xd1\x93\x0e\x19\x91\xbe\x70\x48\x27\xeb\x61\xd6\xf6\x6e\xb7\x6f\x95\xd5\x0a\xb8\xf5\x84\x87\x1e\xf2\x2b\xdc\x09\xbe\xe9\xee\x8d\x82\x91\x90\x07\xac\x12\x95\x32\x32\x8e\x68\x44\x28\xf2\xfd\x68\x44\x84\x51\xbc\xf9\x8e\x15\x4a\x26\x37\xf0\xa0\xb5\x1f\xea\xef\x58\xe1\xc1\x49\xf3\x9e\x12\xaf\x66\x79\xbd\xb9\xf3\x4a\x16\xfc\xd0\x6d\x3e\xa8\x6d\x83\x1f\xe8\x60\xc1\xe8\x9c\xd8\x53\x0d\x48\x3d\x84\x3d\xd3\xab\x8e\xa2\xf8\x41\x9e\x6f\x32\x23\xc2\x17\x8a\x87\x89\x7f\xa2\xe4\x7e\x87\x5f\xcb\x6f\xb7\x59\x69\xf5\xcb\x7b\x4b\xde\x98\xa3\xf3\x04\xec\xbb\x16\x74\x43\x59\x41\x59\x5e\xd2\xe6\xef\x52\x47\x08\xff\x44\x67\x74\x4e\x5c\x01\x24\xb3\x98\xf7\x28\x1f\xea\xfb\xaf\xf7\x9e\x97\x29\x42\x94\xbc\x96\x40\x3a\xca\xd2\xf7\xf7\xcb\x6a\x8f\x00\x07\x00\x40\x0a\x32\x1b\xaf\x04\x05\x31\xf3\xf4\x21\xd2\x4b\xa6\x26\x62\x87\x70\x40\x09\x95\x0b\x84\x22\x04\x45\x88\x80\x3f\xea\x56\xf9\x40\x0f\x8e\xff\x33\xbb\xba\xbd\x1a\xcf\xc3\xab\x63\xf3\x23\xfc\x7c\x5d\x3d\xb2\xaf\xfd\x66\xef\xfa\x83\x06\x9e\xa4\x11\xcb\x1c\x0e\xf0\xe3\xcf\xd7\x95\x07\xb4\xe8\xdf\x85\xfa\x47\x53\xb3\xbf\x06\x0b\xf6\x21\xed\x4d\x70\x0f\xf4\x54\xf5\x96\xee\x12\xda\xb6\xea\xb7\x27\x67\x88\xe7\x10\x32\xdf\xeb\x79\x21\xc8\x1f\xb4\xf3\x7f\xf9\x13\x9d\x09\x8d\xc8\x72\x19\x8c\x2c\x93\x1e\x72\x7b\x72\x1f\x3f\xde\x54\x59\xc9\x3c\xa4\xfd\x0d\x31\x4b\x6d\xff\xb9\x2f\x44\xe0\x0e\x52\x49\xfe\xec\x60\x5b\x59\xb3\xa3\x92\x1d\x95\x68\x54\x0e\x8b\x66\x72\x65\xf0\xfd\x58\xb8\x21\x78\x1f\xbd\x30\x9b\x13\x3e\xcb\x24\x5d\x39\xcb\xe6\xa4\x94\x3f\xc1\x73\x99\x3b\xa4\x58\x4c\xd6\xb4\xda\x50\xae\x65\x65\xb9\x13\x24\x6e\x1a\xc2\x62\x72\x5d\x17\x60\xb8\xac\xb1\x74\x6f\x05\x82\x7b\x4e\x02\x9f\x55\x73\xe2\x44\xcc\xaa\x79\x6a\x05\x75\x80\x11\xd0\x5f\x7a\xdf\x68\x14\x7f\x1b\x08\xbc\x8f\x1d\x8a\xa6\x7f\xca\x15\x90\xc0\x57\xde\x01\x1d\x0b\x03\xd4\xca\x0d\x8f\x22\xe2\x3c\x76\x88\x14\x2e\x61\x72\xdd\x83\x97\x1e\x57\x56\x58\x47\x75\x83\x29\xdb\xd2\x13\x42\x34\x23\x21\x49\xec\xb4\x3c\x2a\x59\x23\x24\x71\x59\x2f\x8f\x60\xe5\xc3\x89\x52\x9a\x0b\xd7\x4c\x92\x23\x20\xe2\x53\xee\xf6\x45\x7b\xfe\x4b\x07\x32\x42\xa9\x3c\xa6\x18\xe5\xef\xea\x82\xea\xdb\xb8\x0d\x07\x02\x01\x7d\x2f\x31\x37\x22\x34\x45\x82\xb0\x49\x23\x1b\x8b\x29\x51\xd1\x96\x7a\x68\xdb\x7b\x19\x4e\x28\x86\x0c\x89\x70\xe6\xec\xaf\x83\x6b\xd6\x48\x2b\xd9\x40\xbf\x81\x16\xb5\x21\x10\x0d\x82\x41\xf9\xf7\xfe\x9d\x1f\x6e\x59\x9b\x5a\x1b\xb2\x6e\xb4\xe4\xa1\x0e\xc8\xb5\x64\x38\xc8\x22\x5b\x80\x2e\x9d\x68\xdb\xe7\xda\xe9\x5d\xd6\x88\x57\x75\xb5\xbd\x66\xef\x4d\xf9\x2e\x4a\x91\xfa\x1a\x92\xa4\x9d\x2e\x5d\xd0\x32\xe2\x47\x9e\xe5\x15\x25\xcc\x99\x25\x8f\xba\xb1\x0e\xc4\xd8\x50\x7f\xe8\x2c\x6a\x5b\x71\x2e\x4f\xbc\xf2\x4f\x8a\xc4\x9a\xd7\xb7\xa0\xc5\xf0\x9d\xbc\xe3\x05\xde\x87\x35\xe5\xf4\xa8\x6c\x8e\x58\x7d\x24\x01\x1f\x79\x61\x20\x42\x53\x38\xf4\x60\xbc\xd7\xf4\xc8\xd2\x4f\x1e\x72\xfc\xb6\xd3\x74\xc4\xa0\x3d\x4d\xea\x5c\x8e\xa3\x14\xae\x65\x56\x8f\x01\x74\x0c\x38\x95\x73\x00\x67\xe0\xcc\x6f\xcb\x3e\x49\x7c\x68\xff\xce\x67\x19\xba\x67\xa4\xd4\x3e\x00\xc5\x98\x58\x37\x37\x1a\xf8\x4c\x38\x42\x65\xff\xe8\xbf\xbc\x49\x8a\xa7\x24\x02\x32\x76\x8a\xaf\xa5\x00\x8f\x10\x32\x12\x2b\x20\x61\x8c\x87\x47\xba\x24\x73\xe4\x56\x94\x96\x92\x34\x93\x99\x40\x2a\xaf\x23\x5b\x64\xd3\x91\xbc\xc4\x6b\xf8\xbd\x64\xa1\x12\xb9\xa5\x66\xc2\xb0\xec\xdb\x25\xfc\xd7\x5e\x4b\x87\x0d\xc4\x03\x33\x1f\x9a\xb3\x0f\xad\x42\x7d\x60\xff\xec\x71\x27\xc4\x98\x4e\xd6\x40\xa6\x03\x83\xc2\x41\x3e\x4d\x79\xca\x09\xd7\x74\x06\xe2\x3a\x5b\x48\x5c\x79\xba\xfe\xc5\x83\xda\xcc\xdd\xd5\x2a\x75\x95\x44\x54\x32\x66\xe4\x4f\x8d\xd3\x06\x0c\x6d\x5a\xa5\x80\x94\xa7\x82\x70\xec\x54\xeb\x3e\x83\xf2\x6e\x02\x94\xf3\x11\x11\x8a\x0b\x12\x92\x5e\x7c\x6f\x52\x98\x76\x84\x42\xcd\x43\x47\xf6\x4f\xf4\x79\x78\x90\x9c\xd2\xa4\xa8\x5d\x09\x4c\x10\x30\x34\xc0\x5d\x4e\x81\xa5\x84\x87\x53\xb2\xc3\x25\xcc\x46\x4a\xca\x34\xaf\x99\x28\xd9\x96\x1e\x51\x98\x92\x98\x85\xfd\xa9\xdb\x6d\x66\x4a\x47\x62\x44\x15\x6a\xba\xf5\x51\x91\x28\xad\xce\x74\x74\xd7\x8c\xaa\x13\x85\x56\xb3\xbb\x9a\xf7\xea\xaf\x8d\xfb\xfa\x31\xa9\x6d\x25\x61\xe5\xd8\x03\x11\x7d\x71\xbe\x73\x83\x08\xdf\x17\x67\xfa\x67\xa8\x16\xbc\x63\x16\xa4\x5f\x48\x89\xc8\x06\xaa\x09\x4a\x7f\xaa\xb3\x98\x6f\x37\x80\xb7\x36\xb1\x27\x4e\x28\x1c\x2e\xa0\x75\x0e\xab\x78\xa7\x60\xce\x13\x2b\x67\x43\xee\xc1\xc0\x85\x25\x42\xe4\xee\x63\x41\xa4\x76\x4b\x33\x7b\x65\xbe\x36\x6f\x6d\x8d\x28\xf3\x4f\x77\xee\xc4\x2d\xc5\x80\x6f\x09\x17\x4b\x35\x27\xe5\xbe\x9d\xaf\xc7\x72\x59\x3a\x46\x47\x86\x05\x34\x4c\x22\xf4\x2f\xdf\x8f\x08\xd1\x60\x1d\x93\x1a\xc2\xb9\x81\xc8\xb6\xaa\x9d\x44\x56\xe0\x4a\x3b\xf4\x81\x6b\x28\x67\xd1\x54\x24\x0e\xe2\x9b\x87\x72\xc9\x33\xa9\x33\x94\xd1\xcf\xa5\xa4\x7c\xb3\xcf\x46\xef\x0a\x5b\xb1\x5f\x81\xfb\x23\x3c\x8e\x7b\xd6\x33\x84\x3d\x04\x14\x56\xcc\x7c\x40\x6e\x67\x14\xc8\xc8\x9c\xef\x43\x80\x56\x16\x03\x20\x9c\xb3\x29\x17\x01\x03\xa3\x9c\x98\x21\xd8\x9b\xcc\x6d\xf1\x90\x1f\x5e\x58\x5d\x03\xb6\x7a\xdb\xb2\x73\x31\xed\x10\x29\x50\xc2\xce\x22\x27\x22\x42\x09\xdd\x05\x42\x55\xa2\xea\xed\xd7\xe4\xd8\xfc\x10\x0f\x4a\x15\x8b\x3d\xa9\x62\x85\x0f\x57\xdb\x81\xed\xfe\xed\x32\xec\x68\x5d\x91\x7d\xb5\x0c\x73\xb0\x9f\x13\xe7\x30\x37\xba\x03\xb8\x07\xa0\xf9\x22\x00\xed\xbb\xd5\x9e\xe1\x83\xc2\x1b\x4a\x3f\x3d\x54\x5a\x57\x6a\x04\x65\x34\x40\xd4\xb6\x6a\xc5\x0d\x20\x31\xfa\x59\x0c\xf8\x55\xa6\xc8\xd9\x7e\x1f\xd0\x5f\x57\x14\x86\x68\x50\x05\xcd\xfa\xfa\x04\x8e\x13\x90\x07\xda\x7a\xf8\xc2\x32\x15\x84\xd0\x44\x28\x71\x66\xda\x88\x29\x35\x0a\x52\x09\x50\x78\xba\x71\x61\x68\xe0\xe0\x21\xda\x68\x26\x7e\x95\x7b\x2e\x39\xcc\x07\x31\xe5\xb4\xff\x87\x0c\x54\x09\x3b\x75\x17\x33\xb6\x07\xa0\x5e\x6e\xb2\xbc\x2f\x06\xd3\xf7\x55\x21\x81\x1e\xcf\x3a\xe5\x17\xdd\xf0\x2f\xa0\x00\xa5\xa8\xeb\xc8\x5e\x13\xe8\x70\x32\x7d\x2a\x37\x70\xdf\xdf\xd3\x35\x71\xa8\xcc\x2f\xcc\x45\x28\xfe\x17\x83\x64\x38\x36\x7a\xbb\x35\xe3\x24\xce\xc7\x31\x1a\xce\x5e\x81\x47\xc3\x89\xb6\xc8\xf2\x4f\x3f\x6f\xfa\x9a\x33\x3a\xfb\x98\x0c\xfb\x93\x03\x39\xfb\xd0\x0c\xef\xd1\xc0\x67\x1d\x0d\x6d\xdc\xb0\x0c\x09\xe2\x3f\x5c\x4c\xe3\x2e\x7f\x8f\xc6\x3e\x40\x5e\x0f\xa3\x94\x29\xa6\x07\xe9\x70\x80\xb9\x97\x0c\x85\xc6\x41\x7f\x39\x4f\x0f\x34\xc9\x26\xf6\x9a\x85\x92\x68\xb8\x9e\xe4\x40\x68\x65\xcf\x03\x18\xea\x43\x76\x74\x8b\x34\xbc\xff\xd3\xa6\xc0\x3b\xec\xa1\x27\x4d\xb3\x7a\x47\x76\xf5\x1a\x62\xd6\x9d\x52\x9a\x20\x36\xd3\x49\x3f\xeb\x52\xbb\xe4\xb8\xef\x6b\xd5\xe4\xf3\x68\x2a\xbb\x92\x04\xdc\xf7\x41\x53\xcd\x0e\xb6\xdc\x72\x88\xab\xe3\x8c\xb9\xba\x77\x95\xe4\x00\x57\x90\x4d\x07\x9a\x0f\x09\xdd\xc1\x6b\x60\x6f\x31\x2a\x87\xdb\x16\x3e\xb6\x5c\x4e\x44\x48\xd9\xb1\x45\x0e\x34\xc4\xe6\xdc\x5f\x00\xf9\x96\x83\xc9\x9b\x2f\x6f\xdb\x0e\x4a\x9c\x39\x2a\xb1\x33\x00\xb7\x2e\x0b\xfa\x5a\xf1\xe9\x33\xde\x1c\xd2\xa6\xb2\xa3\x18\x12\x9a\x3a\x6c\x4d\x11\x74\x76\xc3\xfa\x19\xc7\xe0\xbd\xb3\x57\x4d\x55\xd7\x9f\x5e\xae\x69\x56\x3c\xb4\x3b\x74\xb7\x4a\xbb\x4b\xf9\xbe\xe8\xca\x05\x74\xd8\xf2\x45\xd6\xd0\x0f\xf5\x27\x7a\xc0\x3d\xc3\x03\x10\xa9\xef\x3b\xc5\xba\x09\xa3\x54\xb7\xd6\x07\x75\xc9\xe0\xf6\x6e\x68\xc3\xae\x17\x62\x87\x37\x82\xec\x6b\xc8\x3a\x65\x34\xce\x8b\x3a\xb7\xc5\x25\x99\xc9\x8c\xff\x9f\xcf\x6f\x2d\x34\xd0\x54\x84\x68\xdb\xba\xc6\xd1\xe7\xb3\x91\x72\x8f\x88\x9d\x3b\xf7\x52\x0c\x75\x73\x67\x54\xd5\x0e\xcc\x88\xef\x29\x93\xd7\x8b\xfb\x5d\xfa\x0b\x64\x54\xc2\x04\x54\x36\x09\xd2\x7b\xd7\x3f\x97\x46\xd4\xf7\x40\x60\xfa\x66\x98\xbb\x57\x0a\xc3\xf0\x70\xb6\x79\x8e\xee\x99\xdb\xf0\x32\x35\xf7\x0b\xd5\x94\xfa\x86\xf2\x2a\xbb\x6b\xe4\x65\xa7\x21\x31\xce\x49\x94\x6a\x30\x64\x14\x61\xb7\x6d\xf5\xe1\x76\x75\xb4\x56\x93\xe6\x67\x34\x35\x9b\x40\x39\x6b\xe6\x29\x3f\xa7\xbe\x5f\x1a\x39\x93\x06\xc7\x98\xe2\x72\xd6\x84\xf1\x1c\x73\x84\x9b\x90\x9c\xe0\x9c\x58\xfa\x95\xca\x75\x0d\xef\xc2\xe5\x32\xa8\x27\xf5\x26\xfb\xef\x96\x22\x5b\x9c\xe1\x66\xcc\x30\xc5\x9e\x6e\xf4\x91\x17\x0a\x84\x1b\xc2\xc2\x13\xc5\xe2\x05\xc1\x62\x76\xd6\xa4\x2c\x24\x27\xe6\x1e\x5f\xce\x58\x18\xcf\x53\xf5\x87\x04\xd9\x34\x0b\x8d\x1e\xb7\x0b\x68\xb7\xc3\x19\xc2\xa6\xeb\x15\x66\x7b\xc3\xcd\x86\x63\x8d\x1b\x12\xa5\xcd\xd9\x10\x95\xdd\x6d\xae\x41\x75\xd0\x98\x9d\xee\x1e\x8c\x12\x34\x49\x89\x41\xa9\x9c\x36\x49\x36\x59\xac\xc0\xa5\x59\xdb\x66\x80\x62\x08\x4c\x33\xed\x45\xab\x93\xc8\x70\xef\x54\x23\xa1\xac\x1b\x34\x6d\x6b\x7e\xcd\xa2\xf9\x88\x0c\xe6\x96\x19\x85\x95\x2c\xfb\x1b\xd0\x4e\xc0\x0a\x71\xe8\xe6\x73\x3a\xa9\x37\xb2\x02\x98\xf0\x6f\xca\xd5\xba\x92\x17\x4d\x65\xf1\xc6\xf7\x7f\xa6\x81\x33\x1b\xb9\x02\x8f\x70\x46\xf4\xc4\xe6\x28\x2d\x81\xe1\xa9\x30\x56\x82\xa7\x73\xf9\xf3\xe5\x52\x50\x79\xdd\x6f\xb2\x1b\x1a\x8c\x74\xbc\x6c\x27\xc9\xf4\x0f\x9c\x4d\x34\x0e\xa6\x3a\xed\x95\x0a\x12\x9b\x90\xf4\x13\xe0\x1d\xa1\x97\x53\x5d\x26\x19\x21\x44\xb5\x72\x6d\xda\xff\x9a\xcb\xcb\x39\xe5\x40\x43\x9a\xf6\x9b\x48\xe2\x5c\x9e\x86\x69\x38\x0c\x1f\x00\x65\x05\xa2\x8e\x4c\x57\x1c\xb1\x17\xd1\x67\xe4\x00\x08\x5c\x12\xab\x58\x0e\x4c\x6e\x0e\x35\x39\xbc\x43\xf7\xc2\xbb\x11\x01\xc7\xa3\x08\x0b\xf3\xc2\x36\x3c\x6c\x2d\xfb\x02\x97\x38\xd3\x35\x54\x04\xa4\xdd\xc5\xd8\xe9\x49\xc7\x0d\x9d\xc6\xf4\x34\x89\xa3\x08\xe1\x9a\x88\xb4\x3e\xaf\xd2\xf1\xb8\x86\xf9\x53\x9f\x91\xac\x7f\xed\xd3\x41\xa8\xbb\x21\x8f\x68\x90\xe1\x7a\x1c\x83\xb9\x1b\x67\x40\x65\x37\x72\xdf\x87\x37\xcb\x3a\x0c\x72\xf7\x02\xbf\x16\xd3\xbc\xdb\x7f\x93\x08\xc9\x3a\x5c\xd4\xda\xfb\x7d\x9d\x2a\x09\xd6\x3f\x82\x46\x6d\x2a\xb0\xb2\xba\x89\x68\xc8\x90\x54\xb3\x9f\xca\xb6\xe5\xe7\x5b\x04\x5c\xe3\x7a\x1c\x63\x4e\xb6\x76\x2c\xca\x9d\xc6\x0f\xae\x48\x76\xce\x0d\x9b\xe3\x11\x0d\x38\xce\xc6\x31\x72\x1a\x8f\x6b\x52\x4d\x37\x02\x64\xd3\x2e\xb3\x1b\x5a\x04\x1c\x57\x38\x43\x89\x45\xff\xaf\x34\x50\x63\x84\x70\xd6\xd1\x26\x8a\x15\x97\x61\xd1\xed\x79\x0c\xdd\xdf\xc9\x21\x67\x7a\x53\x34\x8f\x14\xb5\xe2\x32\xb2\xde\x1a\x20\x44\x8c\xe3\xb6\xe5\x5f\x3d\x21\x24\x92\x5d\x21\xe5\xe4\xa6\xa4\xb7\xaf\x79\x7d\xed\xfb\xfc\x4c\x85\x3e\xd4\xd3\x5a\xad\x16\xe5\x40\x0f\xd7\x70\x65\x7b\x5b\x32\x1a\xa0\x1d\xf8\x70\xd4\x8d\xb3\xd3\x58\xd5\x86\x70\xed\x88\x28\xed\x9d\x37\xce\xf2\xcd\x40\xa5\xf5\xdf\xf0\x26\x35\x44\x36\x66\xea\x0c\xc9\x34\x97\x3a\x03\xf2\x1e\x8e\x3d\xcf\x03\xe2\xe7\x5a\x04\xa5\xd9\x1a\x51\x3a\xca\xe4\xcd\x38\x40\x29\x5a\x08\x6d\xca\xd4\xec\x0d\x2e\x04\x47\x72\xa9\x63\x3c\xd0\xc9\xa2\xca\xd8\x27\xd9\xb5\xee\x59\xc1\x46\x05\xea\x95\xc7\x99\xc7\x86\x6f\xf0\x5f\x57\xe2\x0a\xa6\xfa\x1e\x9c\x61\x7c\x60\x9a\xe5\xec\xa4\x0b\x07\x47\x7d\x6d\x8c\x38\x4a\xcb\x30\x44\xf7\x1c\x5e\x7f\xa2\xb9\xaa\x91\x21\x35\x27\xec\xcb\xb7\x50\xc4\x09\x56\xf6\x78\x84\xba\x2b\xea\x5b\x81\x59\x4e\xbb\x3d\x46\xba\xec\xc9\x91\x17\xaa\xe7\xc3\xd0\x3b\x5a\x66\x65\x45\x8b\x23\x51\x1f\x65\xc5\x8d\x5c\x43\x47\x8d\xe0\x34\xbb\x9e\x78\x68\xb7\x11\xff\x0b\x65\x26\x07\x78\x45\xd5\x54\xb1\x64\x4c\xd8\x51\xd7\xda\x69\xb2\xef\xd3\xf3\x3d\xca\xc6\x10\xb5\x3d\x6a\x47\xde\x7d\x24\xf9\xf4\x65\x5a\xce\xf5\x07\xda\x1d\x93\x7b\x3c\xe2\x74\x90\x61\xb6\x47\x31\xcd\x41\xa9\x7c\x2f\x3a\x24\x27\xae\x1f\xd1\x2f\x41\x90\x67\xbb\x3e\x60\x95\xe4\x9b\xa4\x4c\xb5\xe3\xe7\xe0\x38\x38\x6a\xff\x83\xcc\x29\x3f\xf9\xfa\x18\x04\x44\x9a\xf2\x4f\xed\xee\xfb\x8b\x4d\x1b\x4b\x42\xb9\x87\x09\xb3\x2a\xf7\x6e\xe0\x80\xf5\x70\x9f\x78\x3c\x8f\xac\xfb\xc8\x2e\x72\x3c\x06\xb0\x76\x2f\xda\xdb\xee\xcd\x59\x33\xd8\x62\xf5\x5e\x45\x31\x9c\xcc\xb0\xac\x85\x59\x79\x0c\x3b\xe4\xb8\xdd\xd6\x7a\x59\x11\x66\x68\xd0\x1f\xb9\xe7\x1c\x98\x59\x70\xe7\xa1\xd3\x9f\xf5\x94\xb2\x9b\x48\x47\x3f\xa3\xa4\xfb\xdd\x63\x5c\xf4\x3b\x0f\x4d\x5e\x8b\x40\xec\x63\x06\x25\x42\x51\xf6\xaf\x86\x94\x7a\x47\xa7\x73\x41\xa8\x7b\x43\xa2\x60\xab\x63\x63\x2e\xed\xe6\x19\xcd\xdc\xba\x8c\xd3\x4f\xd0\xe2\x17\xca\x96\x90\xd3\xe6\xde\x83\xd8\xcb\xe1\x66\x89\x33\x5c\xe9\x93\xb5\x26\x95\xea\x2f\x1c\x86\x15\x0e\x04\xd9\x8a\xa0\xc2\x02\x21\xbd\xeb\xe6\x8a\xac\x32\x6f\x48\x08\x6f\xcd\xf6\xda\x18\x32\x7e\xb8\xc7\xe6\x6a\x8f\xe5\xf0\x4c\x34\x9b\xa3\x34\xe0\x6d\xbb\x55\x2c\xb8\x49\xbe\x46\xbe\x3f\xda\x9a\x6d\x75\xab\x3b\x0f\xc9\xb8\x24\x0b\x11\xd4\x78\x8b\x73\x33\xd8\xdc\xf7\xb3\x4e\xec\xf9\x95\x08\xb6\xb8\x94\x23\xad\x9b\x6d\xf2\xa1\xee\x1c\x93\x34\x65\x97\xd5\x64\x70\x24\x0e\x9d\x1d\x1a\xde\x67\x8c\x8d\x0a\x46\xac\x91\xb5\x60\x9a\xfc\xa7\xbd\x6a\x42\x04\x7c\xf5\x60\x91\xe5\x9f\x56\xbc\xde\xb2\x62\x8c\xa6\xc1\xd5\x65\x88\x8e\x91\x7e\xcf\x57\x4f\x14\xd4\x0a\x0a\x45\x98\x19\xe3\x63\x26\x4a\x47\x84\xcc\x35\x5c\xa6\x5f\xfb\x67\xf1\x7c\xea\x69\xca\xd8\x4b\x3c\x4b\x18\x7b\xa9\x96\xeb\x9b\xf1\xf9\x14\x4c\xd5\xb0\xd9\xc9\x3c\xe9\x99\x5d\x83\x36\x82\xe1\x35\x99\xe6\xd8\x5e\xf3\x8c\xa5\xa5\x19\x9f\xa3\xb6\x85\xbf\xc6\xde\xd2\xc9\xdc\xd2\x14\x0e\x6f\xfe\x17\xd1\x19\xbc\x91\xb3\xc3\xbc\xcc\xb0\xc9\xb2\xca\x84\xa0\xec\x72\x93\xb1\x46\xb7\xa9\xf6\xfd\x40\x5e\xaa\xcc\xb0\xbb\x59\x54\xc7\x1a\x79\xb5\x92\x13\x45\xce\xca\xe2\x4b\xc7\x31\x47\x78\xed\x80\xca\x8a\x42\x9e\x1f\xda\x5d\xf2\x4c\x96\x57\xc2\x0d\xfa\x70\xbe\x14\xc1\xb5\x08\x98\x43\xa1\xa3\x74\x54\x98\xb9\x24\x87\xb4\x50\xfc\xc4\x2f\x50\xfb\xd3\xa0\x26\xa3\x18\x57\xbe\xaf\xa9\x08\x8e\xa1\x10\x52\x7f\x88\xb9\x32\x60\x4d\x77\x27\x0d\xb9\x14\xc1\x42\x56\x5b\x98\x8a\xf1\x5a\x56\x8d\xd7\x0a\x4f\x1b\xb2\x96\x43\x2b\x0f\xbc\x74\xe3\xfb\x41\x43\xbc\xeb\xb1\x17\x06\xcd\x74\x23\xaf\x5f\x61\x93\x6c\x10\xdc\xf5\x46\x75\xdb\x6e\x47\xa4\xd1\x6a\xa1\xf9\x59\xa1\x66\x7f\x8a\xca\xc0\xb9\x1a\xea\x58\x9c\x87\x4f\xe8\x29\xc2\x5b\x94\x6e\x49\xb3\xd3\xb1\xa4\x50\x04\x87\x01\xb0\xa9\x1b\x3d\x7f\x97\x2e\x04\xb9\x9a\x54\xf9\xb4\x0c\x96\x78\x2b\x17\xf2\x52\xe9\x70\x7e\x92\xbb\x1e\xfe\x28\xbf\xdd\x26\x71\x2b\x7a\x3b\xd2\x75\xc6\x3f\x51\xfe\xa0\xe2\x57\x27\x98\x3a\x5c\x4c\x37\x87\x4d\xf6\x98\x0b\xc3\x8c\x81\x20\x0c\x37\x15\xf4\x4c\xb3\x58\xa8\xef\x86\x4f\x1b\x43\x6b\x29\x61\xc8\x11\x9d\xf1\x39\x1c\xf7\x01\x6b\xdb\x80\xc9\x8d\x06\x69\x7e\x41\xff\x9d\xc3\x82\x7d\xeb\x3e\x0a\x2d\xe5\xd8\xba\x87\xb8\x7e\x50\x56\x9b\x9d\xec\xb1\xda\x00\x81\xc8\xee\x47\xa9\xc6\x17\x30\xe1\x31\x37\x45\x44\x3d\x28\x60\x22\xdc\xec\x6a\xd7\xf0\xfd\x11\xdf\xab\x5b\xde\x58\xa1\x8e\x7c\x0d\x06\xfa\x45\x2d\x7f\x55\x44\xbd\xcb\xa9\x34\x80\x8a\x5c\x9e\x47\x4f\xf9\xb6\x37\x0a\x5f\xd6\xbc\x05\xa1\x45\x35\x08\xa9\x22\x9c\x94\xce\x2c\xc8\xba\x4e\x4a\x96\x57\xdb\xa6\xbc\xa1\x6f\xe9\x52\x4c\xb5\x86\x2e\x11\x89\xd1\xd5\x45\x8e\x8e\xad\x68\x5b\x6f\x51\xd7\x9f\x24\x30\x6f\x44\x2a\x38\x93\xda\x96\xc9\x8d\x5b\x55\x30\x29\x59\x43\xb9\x90\xb0\x40\x0c\x49\xfe\x77\x86\x4b\x6e\x0f\xb7\xf2\xd0\x51\x10\xb1\xda\x65\xb2\x89\xa8\xdb\xd6\x6d\xcb\x4f\x72\x0d\x4f\x41\x49\x18\x9a\x02\xca\xc2\x8a\x8d\x2a\x03\xdd\xc5\x95\xef\x02\x86\x4b\x5c\x21\xdc\xfc\xdf\x22\x2a\xf8\x9f\x9a\xd6\xb6\x8e\x4a\x72\x87\x22\xa2\x51\xa4\xef\x97\x87\x90\x04\x62\x59\x0f\x61\xc9\xb4\x41\x82\xee\xb7\xe2\xa1\xc1\x32\x38\x92\xc1\xb1\x70\xf0\xdb\x21\x6f\x2c\x7a\xe8\xe3\x70\x08\xe0\x9c\x80\x79\x44\x87\x8f\x82\xb7\xe4\x5f\x81\x8a\x31\x42\xb8\x61\x90\x4f\xcb\x24\x52\xf6\xcb\x2c\x52\x0b\x12\xa5\xc5\x59\xdd\x21\xb5\x50\x48\x5d\x93\x7a\x56\xc0\x1e\xa0\x9a\xb1\x96\x23\xa7\x77\xd1\x37\x22\x68\xf0\x5a\xe3\x03\xa5\x9b\xa9\xbc\x83\xaf\x61\xc7\x81\xbc\x1b\xdb\x64\xf9\x2b\xdc\xa2\x04\x12\xcb\x9d\xdc\x5b\x3b\x39\xb3\x25\x89\xd2\xe5\x99\xc3\x9a\x5a\x1a\xbd\xcf\x66\xb6\x9c\xeb\xd9\x7e\x03\x9a\xe1\x81\xfc\x13\x92\x2d\xd2\x48\xb9\x01\x1c\x4d\xdf\x48\x22\xe4\xc6\x34\xa4\x6d\x03\x15\x4f\xb6\x58\xb6\x48\x8e\x7d\xed\x8c\xcc\x0d\x42\x89\xce\x11\x3e\x9c\x65\xa7\x8e\xcd\xcf\xa0\xe7\x8a\x1b\xdf\x6f\x46\x70\x92\x36\x32\xaa\x41\xea\xe0\x5c\x91\x59\xad\x24\x05\x73\xd5\xe6\x3b\x7c\xdd\x1f\x80\xf1\x89\x4c\xbe\x96\xc4\x76\x87\xec\x05\x89\xd2\x85\x8b\xec\x05\xd2\x47\xf5\x6c\x31\x57\x1d\xbd\x6b\xdb\xe0\x6e\x7f\x3a\x41\x06\xd5\x4f\xc5\x9e\x80\x23\xaf\xe3\xb3\xbe\x22\x51\xfa\xea\xec\x3a\x0d\xc3\x57\x68\xa5\x4a\xde\xa1\x54\xff\x6a\xec\x94\x59\x39\x56\x4d\xc5\x40\x18\x3b\x15\xee\xda\xea\x5e\xc7\x67\xc2\x8c\x05\xd3\x3b\x0f\xd3\xcb\x85\x41\x93\x95\x01\x3f\xb3\x3a\xc0\x34\xda\xaf\x6b\xca\xc0\xf0\xb9\xef\x53\xc3\x28\x15\xe3\x31\xee\x64\xa7\x4d\x4d\x53\xaa\x18\x8b\x9d\x8e\x81\x70\x35\x28\x06\x3b\xf2\x9e\xb9\x39\xe1\x9e\x5d\x62\xc6\x0c\x8e\xb4\x7e\x16\x5c\x41\x29\x4a\x7b\x80\xc8\x80\x93\xf9\x9d\x73\xda\xfc\x6d\xf8\x4a\xe9\xed\x30\x7c\x57\x72\xef\x07\xd1\x13\x0d\xef\x6f\x01\xe3\x38\x71\xd4\x5a\x3e\x3c\x90\x55\xed\x59\xbd\xac\x3f\x0e\xa4\x8a\x5c\x81\x1d\x2d\x5d\x62\x97\x55\xb9\x0c\xa2\x51\x67\x75\x82\xa5\x86\x25\xb8\x2c\x59\x11\x28\x06\xac\xfe\x99\xc9\x03\x8c\xab\xcd\xbd\x84\x3f\xa8\x6d\xa1\x07\xe3\x1f\x44\x20\xec\x51\x9d\x4d\xc7\x59\x02\x59\x45\x8d\x4b\xb9\x31\xb4\x2d\xb4\x7e\xfc\x41\x68\xb5\xac\xb2\x18\xd3\x49\x59\x38\x3e\xbc\xdc\x26\x63\x4e\x3e\x0a\x65\x2b\xb9\x37\xbe\xdc\xd9\xeb\xb5\x87\x1b\x65\xd5\x96\xbb\x56\x6d\x83\x52\x89\xc0\xda\x29\xa7\xad\x74\x16\xbe\xaf\x56\x53\x20\xa6\xaa\xf9\x09\x34\x4e\x6f\xe0\x3f\x4a\xca\xb0\x34\x9b\xc5\x59\x84\x40\xfe\xc7\x46\x1c\xa0\x43\x2e\xdc\x11\x81\x0e\x8c\x22\xd7\x7b\xd8\x7e\x72\xec\xba\x0b\xfb\x5f\x7b\x2c\x4f\x37\x7e\xe0\x74\xe3\xb3\x72\x9e\x66\x07\x7a\x1b\xf4\x8f\x18\xf7\xd0\x77\x0f\x40\x7d\xcc\xb9\x68\xc8\x86\x68\xb0\x11\x07\x44\x5e\xbf\x15\xae\x95\x4d\xd5\x26\x2d\xbc\x89\x2b\xe8\x56\x36\xec\x56\x65\xbb\x55\x93\x28\xad\xcf\xaa\xae\x5b\xfa\x14\x69\x48\xa5\xb7\xd0\x66\xaf\x67\xc6\x36\x81\x4d\x81\xf9\x19\xc9\x2b\x6d\x29\x82\x5c\x53\x1f\x6a\x6e\x9a\x3c\x30\x45\x4b\x84\x0b\x95\x45\xd4\x98\xab\x59\xd9\x65\xf8\x20\xb4\x15\x95\x51\xb0\x3d\x27\x91\xef\x17\x67\x24\x6a\xdb\xed\x19\xfc\x3e\x27\x80\x0a\x15\xea\x1a\xd5\x5f\x86\xbe\x5f\x0e\xd6\xb0\xa9\x8d\xa1\x73\x12\x25\x4e\x28\x42\x6d\xab\xaa\xf9\x1f\x81\x41\xef\x38\x3a\x33\xe0\x4c\x38\xb2\x92\x26\xa3\xc8\x55\x03\xfd\xa3\xbf\x91\xa7\x82\x5c\x28\x01\x12\x6a\x56\xf6\x38\x96\x13\xb7\x2f\x71\xea\x08\xc4\xf7\x36\x13\x33\xb0\x9c\xfc\x21\x02\xd6\xad\x0a\x42\xf8\x54\x24\xbf\xd1\xc0\x55\xff\xfc\xd3\xd9\x3a\xcf\x29\x08\x1f\x28\x06\x71\xdf\xc6\x8d\x9c\xfd\x8f\x3a\x66\xe9\xe8\x1b\x01\xaf\x6a\x5d\x26\xf5\x46\x46\x7e\x12\x01\x47\x29\xe2\xf2\xa0\x91\xed\xde\x6f\x36\xd4\x1f\x3a\x2a\x85\xdf\xf4\x1a\xff\x11\x18\x6d\x83\xb9\xe8\x0a\x9b\xea\x4d\xe5\x80\x96\x6b\xb9\x0c\x02\x79\xcf\x2f\x0f\xec\x2b\x8e\xe8\xa9\xda\x1d\xed\x38\x98\x77\x14\x55\xe0\xb6\x2c\x56\x14\xd4\xb4\x40\x4a\x8f\xeb\xe3\x92\xef\x0d\xbf\x1c\x6c\xdf\xff\xd9\xbc\x59\x39\xc3\xda\x49\xc2\xbb\xef\x6b\x5a\x2a\xcd\x92\x60\xbc\x3b\x6f\x3b\x44\x19\x1c\x41\x49\xae\xd8\x40\x6f\xe4\x26\x2d\x7f\xf5\xae\x42\xa6\xb0\xba\xec\xb2\x87\x66\x27\x53\x66\x7d\x7a\x62\x6d\xb6\xe3\x0f\x6c\xd4\x3d\xec\xf7\x4c\x91\x2f\x83\x40\x1e\x35\x4e\xf2\x03\x7b\xf8\xa8\x3c\x84\xcf\xb2\x47\x73\x98\x97\x18\xd8\xdf\xe4\xd7\x10\x27\xf0\x2a\x73\x10\xdf\x6d\xfb\x40\x47\x91\x1d\x89\xd2\x19\x89\x4e\xe0\x7f\x48\x27\x61\x46\x02\x4a\x94\x1f\x45\x23\x69\x6c\x4d\x6a\xf7\x25\x67\x1d\x99\x72\x25\x39\xcb\x95\x0a\x38\x21\xd4\xc8\xcc\x86\x56\x98\x77\xd7\x19\x22\x66\x46\x4e\x39\x4b\x33\x22\x77\x67\x34\x94\x53\x56\xa2\xba\xd9\x01\xa1\x61\xcb\x13\xea\x12\x67\x15\x54\x5b\x13\xc2\xba\x6a\x6b\x53\xed\xbe\x21\x2b\xf0\xd0\x77\xaf\x0c\xc1\x18\xb1\x6d\xb3\x58\xbb\x91\x17\x98\x69\x79\x74\x73\xe7\xe0\x84\xaa\xdd\x47\xae\xe2\x7b\x7b\x57\x86\xcd\x5b\xcd\x50\x52\x76\xd7\x73\x25\xa0\xac\x6f\xd2\xe3\x52\xdd\xa3\x01\x09\x0a\xce\x4f\x0e\x9c\xac\x0f\x87\x8d\x09\xef\x11\xdb\x99\xbd\x91\xb3\x90\x04\x1c\x0e\xbe\x7d\xa1\xcc\x71\xa6\x2b\xd9\x3f\xe3\xfe\xdd\x23\x3b\xf5\x2b\x29\x74\xb0\xa8\xf3\x54\x00\x9b\xb8\x64\x54\x6e\x63\x0c\x33\xfd\x56\x89\x6d\xbc\x76\xac\xf4\xab\xbc\xff\xeb\x28\x27\xf5\xd5\x3a\x63\x2b\x50\x67\xc7\x4c\xbd\xde\x0d\xf9\xdb\x8c\x00\xce\x53\x76\x3e\x00\x09\x6f\xcc\xfd\x4a\x58\x07\x98\x50\xb4\x53\x42\x47\x8f\x1e\xe0\x58\xcb\xde\x13\x8a\xbf\x53\x12\x7e\xd8\x88\x89\xa9\x31\x25\x6c\xaa\x84\x5a\x50\xe2\x0a\x89\x80\xd3\xba\x7b\x23\x45\xaf\x98\x83\x40\x96\xef\x1e\xf5\xde\x81\x4a\x46\x2f\xea\x03\x62\x45\xbf\x29\x1e\x3d\xda\xe1\x97\x34\x78\xa4\x1f\x90\xff\x25\xc8\xfd\x0e\xff\x53\xf4\x14\x85\x7e\xeb\xce\x8f\x11\x6d\xdb\xe3\xff\x5c\x35\x5f\xef\x2b\x81\xb9\x5c\x9f\x1e\xe7\x71\xfa\x4f\x91\xfc\xcb\xda\xd2\x67\x33\x3a\x6f\xdb\x40\xfe\x01\x35\x6f\xfd\xda\x72\x75\x19\x1e\xaf\xb0\x97\x5f\x8f\x1f\xf9\x5e\xcf\xa5\x65\x4f\x08\xf8\x77\xa3\x12\x6c\x6f\x57\xb8\x99\x7a\x9b\xac\x28\x4a\xb6\x32\x0a\xbf\x93\x78\xf3\xd9\x4b\xd4\x2b\x3f\x27\xf7\x1b\x4e\x93\xdf\x03\x6f\xc3\xa9\x87\x67\x6c\x8e\x1d\x73\xcd\x63\x89\x1d\x0f\xe1\xbc\x66\x82\x32\x91\x30\x9c\xd7\x55\x12\xe1\x4d\xdd\x24\x11\xce\xaf\x13\x8a\x05\xcf\xca\xaa\x64\x2b\x90\xe1\x4c\x46\x31\x06\xbd\x51\x08\x35\x09\xf8\x84\xfc\x11\x78\xa3\x81\x27\x61\xfd\xca\xb3\xcd\xa6\x64\x2b\x0f\xed\xe4\x74\xa4\x59\xb3\xe5\xd4\xd5\x74\x52\x67\x1a\x09\xc4\x84\xd3\x46\x4c\xd5\x1f\x3d\xf1\xe1\xd6\x1f\x86\x56\xfa\x44\xa7\xce\xca\x71\x3c\x4f\xf4\x8b\x41\x65\xac\xe8\x70\xe0\xae\x46\x98\x4b\x5c\xab\x37\x36\xc6\xf0\x77\x20\x79\xa1\xcd\xd2\xeb\xea\xe5\x66\x5b\x91\x35\x0d\x32\x2d\x23\x54\x94\x5c\xe9\x96\x2a\xce\x48\x07\x80\x33\x27\x04\xda\xb5\xf2\x50\xdc\x90\xd9\x1c\x57\x2c\xc8\x30\x07\x9f\xbf\x38\xc3\xa0\xeb\x6a\xaa\xa1\x9f\x05\xe5\x2c\xab\xde\xa9\xea\x0a\xdf\xff\x8d\x06\x19\x42\xea\x51\xb7\x27\x88\xd1\x8f\x30\x32\x2c\xd0\x08\xfd\x9b\xfc\xf8\x40\x26\xcc\x3b\x91\x17\xcf\xdb\x03\xde\x09\xc1\x00\x34\x1b\xda\x87\x67\x93\xb0\x93\x4d\xc1\x44\x18\xe8\x81\xeb\x6c\xa3\x47\x44\x51\x05\x1b\x75\x3f\x8f\xb0\xc4\xb6\x9e\x2a\x3d\x97\x1d\xbf\x1f\xc2\xba\x82\x56\x4e\x03\x3b\x0f\x00\x97\x00\x10\x77\x71\x79\x96\xaf\xe5\x0c\x41\x49\xd0\xcf\xd9\xb4\xed\x20\xc2\xe1\x37\x00\x14\x84\x83\x01\x9c\x7e\x19\x15\xe5\x94\xba\xdf\x29\x5a\xa2\x31\x87\x4f\xd7\x1d\x90\x48\x95\x9d\x49\x83\xe3\xab\x45\x7e\x3d\x16\xd9\xc2\xba\xd1\xa9\x3b\x67\x16\xa8\x6d\xeb\xc9\x7f\xb7\x94\xdf\x29\xfd\xe8\x9a\xfb\xfe\x20\x22\xf0\x26\xaa\xbc\xa7\xe7\x97\xa9\xa3\xf3\xb6\xe2\xa9\x0c\xe3\x5b\x9e\x6d\xc6\xeb\x2c\xff\x64\xb5\x45\x95\xb9\x14\x8f\x53\x56\x50\x2e\x37\x4f\x0f\xdb\xd7\x32\x3e\xd9\x70\x8a\xd4\x9f\x0e\xd8\xde\x78\x0f\xd2\xf7\x87\xd9\xd5\x7f\x12\xce\xe3\x65\xdf\x04\xc1\xc9\x89\x07\xfb\x51\xc9\x6e\xb2\xaa\x2c\xf2\x75\xc6\x3b\x2b\x02\x62\x22\x4a\x51\x51\xe2\x5d\x5d\x6d\xbd\x70\x60\xc9\x72\x62\x4c\xc5\x07\xf1\x53\x10\x61\xea\xe9\x4f\x67\xbc\xcc\xc6\x55\xb6\xa0\x95\x87\x35\x18\x84\x9d\x63\x9d\xb1\xde\xe3\x51\x63\x58\x1e\x70\xd9\xc2\x5b\xe3\x24\x44\xed\x40\xd3\xbe\x40\x1d\x48\x40\x68\x11\xad\xd8\xf7\x47\xc7\x47\x47\x7b\xfb\x34\x75\x14\xed\x24\x49\xe4\x79\x78\xc0\xb2\x75\xf6\xa0\x4e\x41\x1f\xa5\xde\x91\x07\x16\xe6\xc1\x75\x4e\x67\x4b\x7e\x1c\xb7\xed\xe9\x89\xd1\xe5\xd7\x48\x28\xc3\x18\x06\x3f\x23\xca\x76\x03\xc2\x3c\x24\x19\x66\x44\x01\x71\x78\xa3\x02\xd3\x49\x6f\x8f\x45\x89\xc0\x85\x84\x76\xad\xc5\xd2\x9a\x0d\xcd\xcb\xac\x02\x41\x56\xbc\x26\xa3\x38\x85\x87\x29\x2d\xdc\x8f\xee\xf3\xa1\xe7\x12\xa3\x44\xff\x9a\x67\x2b\xa5\x0e\xef\x5a\xb0\x4b\x53\x74\x5f\xc0\x7c\xff\x81\x15\xf4\x33\xd9\xa4\x8a\xcb\x59\x28\x77\x49\x02\xe1\x1b\xb2\x9c\x2e\xd5\x2b\xe3\x78\x93\x58\xb2\x64\x23\xeb\xbd\x51\x98\x59\x0d\xeb\xb4\x96\x1f\xb6\xfa\x99\x72\x83\x37\xe1\x0d\x42\x69\xde\xdb\x29\x94\xb1\x8f\xce\xd8\xc5\x6c\x35\x47\xc9\x0a\x81\x53\xb9\x8d\x51\xd3\x53\x32\xc5\x9b\xba\x09\x6f\xf0\x4a\xb9\xde\xa9\x42\x72\xa3\xe3\xc8\x0d\xbc\x7d\x2d\x35\x8d\xb8\x09\xc9\x4d\xa8\xac\x86\xdc\x99\xb3\xa1\x54\x5e\x01\x08\x59\xce\xa2\xb9\xb1\xb7\x07\x18\x1d\x3e\x18\x2e\xc8\xf5\x18\xe0\x7f\x75\x9d\x06\x77\xa4\xdf\x58\xdb\xca\x7f\x04\x0b\x84\x3d\xbb\xa8\xd1\xdf\x72\x33\x74\xf7\xa0\xa1\x8d\x2b\xe1\xd9\x5e\x2d\x40\xb1\x5d\x59\x83\x90\xad\x6d\x5b\xef\x8a\xe9\xdf\xd3\xe0\xe1\x26\x75\x25\xa6\x72\xb5\x3e\x8e\x0a\x2f\x81\x1f\x27\x8f\x0f\x2c\xdb\xbd\x26\xdb\xc6\x00\x86\x4c\x63\x62\xb9\x09\xdf\xf5\x31\xe5\xcc\xbe\xf7\x92\x54\x59\xd7\x55\x21\x49\x43\x59\xee\x2f\xa0\xfe\xc5\xd0\xdf\xcd\x51\x72\xe7\xd4\x9d\x3e\x30\x09\x62\x0c\xb9\x40\x79\x66\x07\xe8\x3a\xd2\x65\x2c\x49\xbf\xb7\x04\xba\xe9\xf8\xe0\xdc\xea\x0a\x23\xac\xda\xa6\x3c\x9b\x45\xa6\x32\x0b\x5e\x09\x56\xf5\x16\x29\x91\x2b\x7e\xeb\xae\x78\xbb\x4c\x62\x84\x59\xdb\x2a\xf7\x79\xeb\xb6\xcd\xda\x56\x1f\x37\xaf\x08\x93\xfb\x6f\xca\x7d\x3f\x78\x15\x12\x8e\x70\xa9\x7e\x95\x8a\xf6\x7c\xd9\x6d\xc0\xb3\x7c\x8e\x5f\x69\x27\x2e\xdd\x4b\xc4\xe5\x51\xc9\x8e\x1a\xd4\x0c\x55\xd5\x2f\x11\x18\x67\xb8\xab\xa8\x37\x02\xeb\x88\xb0\xf7\xab\xdf\x2f\xfb\x43\x74\x89\x9b\xd9\xe5\xdc\x71\x65\x7b\xe8\x38\x7f\x89\x76\x87\x13\x72\x57\x20\x8c\xf7\x85\xab\x3b\x29\x3f\xf3\xea\x8f\xc1\x7e\x67\x49\xca\x69\x19\x7a\x47\xf9\xf5\x78\x59\xf3\x9c\x8e\x17\x60\x05\xce\x4b\xbc\x61\x8c\xdd\xa4\x72\x79\xb3\xac\x1b\xbc\x25\x79\x68\x39\x8d\x69\x77\xbb\x2d\xcc\x65\x5e\x99\xef\x14\x96\x58\x19\x05\x41\x41\xc4\x6c\x3d\x97\x47\xd0\x79\xee\xfb\x85\x7e\xbd\xca\x51\xba\x0e\x43\xa4\x37\xce\xfa\x9c\x6c\x3b\xf3\xc4\xfd\xf6\xa6\x54\xc9\x03\x68\xe9\x0b\x99\x7b\x9c\x23\xc8\xa0\xe4\x0b\x71\x83\x70\xa6\x6e\x1b\x20\xa9\x0b\x19\x4d\xb6\x9c\xc8\x5f\x2e\xdb\x2b\xdb\x73\x33\x35\xe2\xbe\xcf\x1c\xa6\x41\x5a\x2a\x86\xeb\xa1\x29\x8a\x4b\x84\x65\x7e\x58\x91\x86\xc0\x2a\xd9\x66\x2b\x26\x8c\xd2\xa2\x79\xa5\x06\xc9\x8e\xaf\x3c\x99\xda\x16\x0c\xcf\x1c\x1a\xbf\x07\x3c\xc2\xa9\x49\x27\x09\xb6\xa1\x03\xb5\xfc\x7a\xac\x98\x11\x9e\xbc\x12\x16\x48\x4d\xd9\x03\xad\x69\xa8\xf8\x99\xd1\xa2\x14\xd9\xa2\xa2\x41\x69\xfc\xa5\x0d\x1b\x50\xa2\x6e\x71\x0d\xcf\xbd\x9e\x0d\xae\x8a\x0d\x45\x83\x5d\xce\x50\xa9\x6f\xf4\xc0\xcd\xe9\xb1\xa7\x61\x80\x70\x8e\xb7\xb8\xc0\x6b\xbc\x21\xa5\x59\xe4\x4b\x12\xe1\x1b\x12\xe3\x95\x3c\xef\xef\xd4\x29\x58\x2e\x83\x3b\x42\x96\xe8\xbe\x21\x39\xd9\x92\x5a\x26\xad\xad\x94\x89\xfc\x73\x47\xe2\xe3\x8e\x95\x70\x2d\x2f\x02\x0b\x33\xf9\xd4\x5b\x96\xc3\x09\x7f\x65\x8c\xae\xf2\xd9\xab\x39\xbe\x24\x2f\xcd\x3b\xaf\x3c\x8e\x9c\xf7\xda\x4b\xfd\x5e\xfb\x52\xf3\x8a\x96\xbe\x7f\xe9\xcc\x07\x74\xad\x26\xc2\x65\x67\xd6\xef\xa5\x9e\xc6\x4b\xcb\x52\x7a\x09\x2c\x25\xf9\x3d\x5f\xb6\xed\xa5\xcb\x98\x7a\x09\xfc\xb0\xa5\x03\x1f\x39\x76\x9c\x5e\x02\x63\xea\x25\xf0\xa2\x96\xbe\x7f\x77\xfe\x52\x3f\xe8\x41\x0a\xce\x89\xe7\x21\x7c\xd9\xa3\x2e\x1b\x25\xec\xe3\x44\x42\x0e\xb8\x69\xd4\x24\xa8\xa7\x75\xe8\xa5\x4a\x2b\x00\xa2\x65\xaa\x96\xd6\xbe\xab\xfa\xfd\x0c\xb6\x06\x56\x97\x41\x66\xa7\xac\xb0\x99\x65\xeb\xef\x7c\x3f\x58\xb4\x6d\xb0\x70\x88\xf7\x2e\x17\x7e\x09\x62\x0b\x97\x8a\x78\xf4\xfd\x20\x58\xb7\x6d\xb0\x96\x97\x08\xa4\xe9\xd2\x4b\x43\x58\x5e\x4e\x32\x33\x9d\xbb\x8d\xf4\x17\xb9\x91\xf6\x52\x1c\x08\xb3\x5f\xe6\xc4\x4d\x9b\xfd\x32\x4f\x7b\x08\x0e\x46\x05\xbc\x4f\x14\xe6\xa5\xf3\x52\xbf\x4f\x14\xe4\xa5\xb2\x7e\x7a\xa4\xba\x7c\xae\x11\xac\xf8\xab\x80\x62\x60\xfe\x49\xfa\x65\x61\x1b\xf3\x89\x44\xe9\xa7\xb3\x85\x99\x47\x9f\x42\x72\x82\x16\xb3\x4f\x61\x3c\x57\x78\xc8\x15\xca\x16\xb3\x4f\x73\xc5\x97\x2e\xda\xb6\xb0\x43\xdb\x99\xc5\x8d\xd2\x8f\x67\xd7\xdd\x6c\xfc\x88\x32\x06\x56\xb7\xae\x67\x1f\x55\x41\xd9\xf4\x42\x3f\xc2\x44\x08\x26\x7e\xb9\x0c\x20\x97\x9e\x55\x72\xf3\x9a\x6e\xc2\x38\x91\x3f\xd0\x78\x89\x0b\xf7\x31\x57\xa6\x43\xfb\x71\x97\x5b\x6f\xa3\x69\x61\x26\x5d\x50\x90\x51\x8c\xe0\x09\x7d\x79\x4e\x36\x9a\x48\x33\xad\xbc\xed\x64\x8a\x36\xf8\x0e\xe9\x45\xa8\x4d\x22\xbf\x21\xcb\x70\xe5\x1c\xb9\x23\xfd\xc2\xf2\x8e\xbc\x39\xbf\x9d\xae\xec\x9e\x7c\x3b\x5e\xa2\x64\x95\x0a\x7b\x53\x0f\x04\x7e\x87\xab\x69\x15\x36\x49\x83\xb7\x78\x19\xbe\xd3\x50\x08\xb9\x9b\xe6\x89\xe7\xe1\x1a\xaf\x01\xeb\x6f\xce\xc9\x2d\xba\x5f\x11\x03\x4c\x82\xc2\x4b\x72\xab\x6d\x64\x2c\xc9\x1b\xbc\x25\x9e\xb7\x5b\x59\x1b\x97\x99\xdc\xec\x67\x37\x61\x38\x47\xb8\x22\xbf\x89\x40\x05\xb0\x70\x68\x24\xa4\xa9\x12\xd3\xcb\xb7\x24\x4e\xdf\x76\x7c\xfb\xb7\x72\x44\x7b\xad\xed\x03\x7f\x3b\x47\x18\x00\xbf\x0d\xe3\x01\x60\x57\x2b\xbe\xcf\x31\x03\x9d\x2b\x2d\x43\xc5\x69\x23\x0e\xeb\xec\x62\xa6\x38\x94\xbd\x77\x96\xee\xbd\x02\xef\xcb\x3a\x39\x0f\x8c\x81\x61\xc3\x35\x60\x63\xc5\xd4\x34\xfd\x8d\x06\xff\x0a\x6c\x10\xa1\x31\x0b\xe3\x24\x56\x59\x59\x5d\xe8\xac\xc0\xd2\xeb\xe4\x48\xd7\x65\x51\x50\x46\xbe\x19\x9a\x04\x68\x0e\x69\x6a\xc8\x7d\x36\x23\x22\xcd\xce\x58\x9a\x11\x7d\x72\x56\x20\xf8\x27\x3b\x08\xa2\xa6\x8f\xb4\x8e\x0d\xce\x94\xda\x01\xc9\xc2\x0a\x5a\x8a\xb5\x9a\x57\xe5\x68\x3b\x00\x55\xa1\xac\x28\xe0\x2d\x1b\xf8\x1c\x28\xd8\x5f\x19\x28\xbd\x37\xed\xfa\x9b\x16\xb8\xd2\x9c\x4d\x39\xc9\xd9\xa4\xa0\x55\x76\x47\x8b\x57\x59\x55\x2d\xb2\xfc\x53\x93\x6c\x65\xc2\x96\x25\x81\xfc\xca\x6e\x3a\x5e\xd8\xd6\x0c\x47\xc8\x75\xf4\x77\xc0\x86\xc9\x3e\x1b\x93\xcd\x68\xcf\xee\x69\x89\x76\x68\x87\x15\xe3\xbd\xc7\x6f\xcf\x24\x46\x3a\xc4\xaf\x3b\xb5\xc2\x2d\x4b\x2d\x52\x1e\x16\xb4\xa0\x33\x31\x0f\x9c\x91\xdb\xb0\x87\x14\x02\x84\xa4\x8b\xd9\xca\x79\xdc\xef\x2e\xd4\x36\x6d\x56\xce\x53\x10\x50\x95\xf7\xe1\xe9\x4a\x8d\x41\xe2\xad\xb6\x42\x50\x0e\x71\xd7\x5d\x05\x89\x26\x69\x65\xf4\x9d\xc9\xaa\x8e\x4c\x75\x27\x5f\x30\xfd\x48\xb5\xb3\x15\x90\xbe\xc4\xc6\xb2\x6f\xfd\x0e\x26\xaa\x26\x23\x80\xa4\x81\x08\x6d\xf8\xcd\xe1\xae\x7a\x9b\xba\x29\x25\x80\xe4\x88\xd3\x2a\x13\xe5\x0d\x85\xcb\x1b\xf0\xeb\x3b\xff\x9c\x92\x44\x1b\x44\x19\xde\xae\x71\xf4\x2b\x2b\xd0\x05\x11\x56\xc1\x1e\x6d\x64\x92\x94\x69\x48\xdb\x26\xed\x90\xf7\x4f\x75\x59\x3f\x41\xa6\xac\xa3\xe3\x36\x30\x13\xf1\x10\x5f\xd2\xae\x6c\x49\x7f\xc2\xfe\xa1\xed\xef\x4c\x83\x87\x0b\xe9\x25\x6c\x59\xb9\xcc\xfc\xc2\x6c\xb2\xd8\x96\x95\x40\x89\xe6\x50\x3b\x7a\x5d\xbd\x06\xe9\x97\x39\xd7\x39\xb3\x6e\x71\xaa\x92\x8c\xcb\x5c\x78\x44\x80\x61\xd0\x8c\x2e\xf1\x65\x94\x42\x2e\x9d\xc9\x64\x56\x45\x3b\x5e\xe9\x88\x88\x8e\x6d\xea\x30\xc2\x46\xba\x59\x8a\x41\x1f\xd8\x4c\xc4\x96\xc4\x4e\x06\xe2\x94\xc4\x7a\xfe\xa1\x04\x2c\x9f\x0e\x3a\x47\x98\x83\x07\x9d\xf3\x3e\x38\x64\xce\xc3\x56\x39\xb5\xbf\x40\xba\x57\x1b\x18\xe9\x31\x7b\x93\x7e\x9c\xf1\xdf\xcc\x24\x65\x30\x60\xe6\x77\xb2\xe5\x9e\xc4\x49\x17\x44\x6c\xea\x06\xdd\x26\x27\x41\x2f\xa5\x87\xef\xce\x55\x75\x0f\x58\x0f\xb4\x12\x6c\xb6\xd4\xaa\x25\xda\x97\x2c\x80\x41\x76\x72\x1a\xb9\xc4\x6f\xc0\x85\x4a\xd0\x5f\x6f\x08\x73\xd7\x1d\x36\xa6\x5f\xbc\x64\xf4\xda\xb3\xdb\x21\x25\x10\xa0\x31\x75\xcb\xb3\x8d\xc2\x2e\x34\xc2\xe9\xed\x30\x43\xa2\xe6\x9c\x99\x10\x76\x12\xba\xdc\x5a\xcf\xce\xc5\x2e\x32\x70\x27\x90\xf3\xbb\x37\x88\x7d\xc6\x6b\x32\x8c\x45\x32\xda\x51\xf6\x72\x76\x54\x10\x2a\x56\x9b\x61\xd7\xa4\xfe\x70\xa8\x54\xd9\x34\xf5\x4b\xeb\x75\x9a\xe0\x37\x16\x3b\x5f\x06\xf0\x4d\x6f\x54\x87\x71\x16\x28\xb4\x5c\xa5\xaa\xb6\xeb\xeb\xac\x19\xe4\xbd\x82\xbd\xb1\x75\xdf\x9c\x54\xce\x71\x37\x7a\x47\x5e\xb8\x0f\x1f\x7b\x15\x5d\x8a\x44\x22\xd3\xd1\x0d\x28\x3f\xd3\xe2\x7b\xc8\x34\xe5\x2a\xf4\xbe\x6e\x92\x31\xd7\x25\x3f\xd4\x22\xab\xc0\xf2\x2e\x0a\xbd\xcd\x67\x6b\x15\xd7\x0b\xf7\x73\xc8\x0c\xde\x5f\x4f\xb2\x7d\x24\x95\xfd\x39\xbc\x9f\xc5\xec\x49\x3b\x73\xe4\x39\x7d\x7b\x07\xf4\x74\xa3\x58\x4a\xa6\x5b\x9d\xb1\xa8\xa6\x6d\x33\x43\xee\x00\x66\x71\x4d\xec\xf8\xfe\x15\x46\xb5\x1b\x66\xef\xff\x02\x75\xca\x2c\x66\x7d\x88\x77\xaf\x48\x39\x0f\x7b\x82\x6f\xe9\x5f\x62\xb0\x46\xb8\xea\x23\xac\x76\xf6\xec\xe1\xa8\xcb\x2b\xa5\xeb\x39\xdc\x3b\x38\x37\x10\x3e\x88\x3b\x79\x35\xcb\xda\x76\x94\xcd\x86\x4f\x9c\x4c\x65\xf0\xe6\xe0\x55\xd9\x29\x43\xea\x21\x7b\x55\x61\x58\x74\x98\x93\xfb\xd2\x61\x78\x47\xfb\x43\x40\x2b\xe1\xa0\xdf\xe0\xf6\x2d\x5d\x8a\x87\xdb\x34\x98\xa9\x1d\x3a\x75\x33\x7f\x60\x8c\x72\x67\xca\x22\x49\xf0\x1a\x8a\xcb\xe8\xd1\x9b\x32\xaa\xc2\xcb\x0d\xcd\x7b\xca\xf4\x5a\x54\xed\x60\xbe\x59\x33\x77\x4e\xe7\x2d\xc9\x86\xfc\xc5\x1c\xf9\x7e\x36\xcb\xe7\xe9\xd6\xf7\x0f\xe3\x6b\xb6\x9d\x1f\x9a\x90\x5f\xc0\x46\x3e\xec\xb6\x49\x85\x8e\xea\x64\xaf\xef\x49\x60\xd1\x5d\x81\x26\x59\x55\xae\x98\x9c\x60\x30\xa0\x36\xa4\x8f\xa2\x4e\x94\xea\x63\x30\xc4\xbb\x26\x1b\x95\x48\x29\xec\x8a\xdd\x99\x83\x33\xfb\x84\x90\x96\x24\x43\x19\x29\x41\x73\xf1\xb2\x5c\x54\x25\x5b\x61\xed\xfd\xa5\x74\x58\x21\xbe\x7f\x60\x6f\x2d\x51\xfa\xd2\x34\xd6\xb1\x95\xbf\xc7\x0b\x34\x84\x50\xf7\xaa\x26\x69\x18\x4d\x05\x95\x40\xca\x94\xce\x2b\x71\x47\xa6\xd8\x58\xb9\x1d\xb9\x4f\xbf\x2e\xd5\xe2\xa4\x20\x43\xb6\x60\xe7\x90\xc1\x2f\x0d\xd5\x8c\xc5\x80\xa6\x7c\xe9\x5a\xab\xb9\x64\x9d\xc6\x1e\x78\x9c\x88\x64\x01\xb8\xfc\xf5\xad\x03\xf6\x5e\xf3\xc1\x5a\x98\x2e\x0a\xcf\xf8\x7c\x8e\xb5\xbf\x0a\x47\x7b\x8e\xb9\x42\x9b\x70\xe8\xa9\xf1\xe9\x98\x35\x99\xdc\x08\x41\x53\x3d\x82\xcd\x50\xa7\xa7\x95\x2b\xa1\x5e\x19\x71\xcd\x7a\x56\xcd\x71\x6e\xb7\xca\x99\xba\x92\xee\x0b\x3d\xe8\x59\x10\x06\x4d\x37\x96\x53\xd0\xae\xea\xc2\x89\xe7\x21\x94\x1a\xcf\xd8\xef\xea\x6d\xa3\xdc\x6f\x34\x6d\x9b\xef\x33\x4a\x4b\x70\xec\x30\x06\x2b\xfe\x4d\xb7\x3b\xfe\xc2\x82\x06\xe7\x0a\xdf\x5f\xde\x29\x73\xe0\xae\x36\x93\x6c\x51\xdf\xd0\x69\xd6\xdf\x34\x73\xcc\xf4\x02\x69\x5b\xa5\x3f\x8f\x92\x6c\xc0\x9c\xc7\x85\xac\xcb\xe3\xb4\xe0\xd9\xad\xe7\x5e\xf6\x7e\xe9\x53\x16\xf2\x06\xf1\xe6\x12\xdc\x73\xa3\xfb\x80\x75\xcb\xa7\x6d\xdd\x90\xc3\x17\xd0\xe2\x31\x25\xe1\xc6\xd9\x3f\xac\xd3\x54\x1b\x75\x50\x86\xd8\xbb\x63\x05\x16\x2f\xf0\x80\x6f\x28\xff\x5e\x37\x3b\x28\xc7\x64\xff\xb4\x31\x26\x2e\x26\x5a\x88\xe5\xad\x82\xf4\xc0\x69\x6d\x32\xc3\xb6\x41\x4a\x88\xdd\xf5\xea\xe9\xcc\x5d\x98\x3b\xd3\x93\xae\x0a\x7d\x97\x23\x9e\xbd\xcb\x61\x07\x17\x20\x3c\xa0\x72\x2a\x0b\xfa\xd0\x96\x03\x27\xa4\xd9\x9b\x2c\x7e\x3f\xb1\x9e\xb1\xfc\xa1\x34\x9a\x35\x2a\x6a\x25\xb7\xea\x7c\x92\x5f\x03\x93\xcb\x11\x59\x93\xc1\xef\x3a\x26\xfd\xa2\x2e\xee\xf4\x65\x0f\x99\x5b\xc3\x81\xeb\x68\xea\xa5\x43\x04\xc8\x8b\x81\xf6\x01\xa0\x36\xdf\xb1\x3c\x45\xfb\x5b\x7f\xe3\xfa\x29\x80\xbd\xd8\x43\x2e\x32\x34\x18\xbb\x3f\x77\xe5\xf5\x04\x98\xe4\x60\x9d\xbf\x57\xfe\x6d\x20\x86\x72\x20\xd8\x2e\x45\xaa\x97\xa2\x26\xf6\x1d\x25\x0b\x2d\xe7\xa5\x2f\xbc\xce\xfd\xc3\x75\x9c\xe0\xb8\xc1\xd8\x33\x9f\x73\x0b\xf6\x0f\x98\xc4\xbc\x6e\x5d\xca\xac\x78\x22\x30\xd5\x41\x51\xae\x6d\x63\x42\x18\xd4\xa2\x6c\x4e\xab\x45\x2a\xe3\x56\x5f\x5e\xce\x48\xae\xba\x0e\x1c\xd1\x86\x7f\xb9\xef\x43\xa5\x72\xe7\xe7\x07\xa4\x32\x6f\xfb\x4c\x07\xb0\x24\xb5\xc9\x72\xd3\xb1\x0f\xf5\xc6\xd1\x7d\xec\xe7\x05\x90\x3d\x04\x8c\xf7\x01\x0c\x31\xf3\xce\xcc\x43\x2d\xfc\x52\xbc\x57\x8b\xea\x8d\x63\x88\xba\x17\xdf\xb9\x72\x70\xc7\x0b\x44\xc5\xbc\xcf\xde\xde\xae\x39\xae\xca\x4f\x54\xbb\x74\xb0\x8e\x02\x5e\xd5\xd7\x9b\xad\xa0\x8a\x37\x3f\x7d\x20\x3e\x10\xf2\xfa\xa3\xd5\xcd\x15\x17\x9f\x93\x7b\x98\x9d\x9b\x8c\x37\xf4\x07\x26\x02\xe6\xee\x01\x08\x2b\x69\xb6\xfd\x54\x25\x0e\xbb\x33\x2e\xcf\xcb\xe6\x22\xbb\x08\x38\x6c\x41\xc8\xf7\x6d\xd8\xfa\x84\x18\xf6\x99\xf0\x9e\x04\xcc\x5b\x17\xef\x4f\xa2\x71\xb7\x49\x33\x58\x5f\xdf\x64\x6a\xaf\x73\x74\x92\xfa\x23\x65\xb2\x37\xb0\x6e\xfa\x0b\x63\x0c\xd0\x1d\x98\x8b\x3d\x68\xbf\xff\x2d\x68\x7a\x0a\x1c\x00\x37\x9c\x03\xdf\xf5\x7d\x67\x69\x46\x8f\x9e\x00\xf7\xd7\xd9\x26\xa1\xae\x54\x15\x06\xe4\x38\x71\x10\xde\xa5\xda\x13\x55\x23\xd0\x9e\x09\xe0\xe1\x21\x6f\xb3\xce\xf8\xfc\x4b\x55\x81\xa5\xac\x83\xd5\xc9\x94\xa1\x8c\x60\xbf\x9e\x52\xd5\xf3\x1b\x35\x55\x95\x73\x74\xce\xbe\x50\x55\xf9\x60\x55\xe5\x1c\x2b\x0f\xae\x49\x5f\x43\xe1\x07\xe7\x90\x34\xea\x32\x32\xea\x47\x4d\x39\xb1\x9e\x4f\xa9\x0f\xcc\x51\x2a\x70\x08\xeb\xce\x46\x8d\x38\xeb\xc7\x7e\xa8\xd1\xde\x28\xcb\xf8\xd9\x86\x03\xa8\x79\xfa\x3f\x70\xf0\xc4\xb9\x96\xd6\xbe\x90\x15\xe9\x9f\x21\x83\x5d\x69\xca\x12\x6d\xcc\xb4\x53\xc5\xea\xf1\x9e\xc0\xa8\x15\xe6\x04\xfa\xc0\x50\xca\x7d\x7f\xa4\x58\x5c\x53\xc5\x45\x48\xc0\xb4\xa0\x66\xa4\xfa\x7e\x00\xbc\x5e\x8e\x19\x6e\x78\x40\x81\x05\xa9\x1c\x4a\xc1\xfb\xfd\xcf\x9b\x42\x99\x3c\x43\x58\x69\x99\x1e\x62\x77\xc9\x2a\xc9\x1f\x20\xb0\x04\x9e\x54\x1e\xe6\x37\xba\x4c\x7e\xb0\x16\xa3\x54\x03\x2e\x08\xb3\x24\x08\x30\x1e\x09\x55\x56\xcf\x3a\x8b\x43\x40\x3c\x2b\xaa\xf9\x6d\xd0\xbf\x46\x69\xf0\xb8\xd4\x22\x74\x3b\xc5\xc3\xd3\x10\xbf\x63\x01\xd7\x75\xa9\xf9\x24\x8b\x24\x02\xcb\xd1\x49\x38\xe6\x34\x17\xca\xba\x90\x9c\x67\xa5\xb3\x6a\x4a\x35\xa7\xcc\x7c\x2a\x27\xea\x07\x5e\x67\x8d\x5a\x96\x4d\x32\x8a\x9d\x29\xf6\xbe\x47\xee\x0a\x9d\x1d\x54\x9b\xc6\xb1\x36\x95\x03\x56\xd9\x02\x0e\x1c\xa3\xee\x62\x00\xf5\x0c\x2f\x66\x0d\x9a\x02\x47\x5d\xa6\xcd\x9a\x79\x02\x52\xb5\xb9\x00\x3a\x46\xfe\x20\x02\x26\x98\x62\x5d\x3d\xe0\x57\x47\xd2\x54\x5d\x73\xdb\x36\x38\xa8\xe2\x4c\xfa\x17\x6e\x23\xe6\xab\x7c\xc6\xc1\x7e\xa8\x88\x19\xbb\xd6\xd6\x06\x1e\x07\x5d\x17\x1d\x0b\xd4\xc4\x88\x94\xdd\x6b\xc0\x20\x3f\x99\x29\x85\x7e\x89\x9c\x5e\x21\x52\x3a\xc6\xfa\x34\x33\xce\xf1\xc3\x24\x8f\x1b\xdb\xa9\x26\x40\xb8\xaf\xd0\x35\x8e\xd3\xda\xbc\x41\x28\x95\x2e\x9c\xcb\x3f\x61\x3c\x4f\xe1\x45\x32\x5b\x34\x41\x33\x59\xd4\x42\xd4\xd7\xe3\x5c\xff\x40\xe7\x27\xd6\x5c\x88\x4d\x0d\xf3\x89\xa8\x37\xe8\xf8\x64\xcc\xe0\xc7\x6e\x67\x0c\x8a\x98\xe2\x26\x1e\x6e\x3e\x12\xff\x58\x8d\x46\x1f\xd3\xb0\x5e\x82\xa1\xc1\x32\xc7\xa8\x0a\x79\xcd\x40\xa8\x7e\xa3\xee\x0e\x0d\xc9\xd4\x13\x42\x4e\xb4\xad\x28\xb8\xaa\x53\x56\xe0\x82\x64\xf6\x7d\x5a\x62\xef\x94\x90\xc6\x12\x39\xdd\xf6\xad\xa4\x65\x1e\x83\x24\x8c\xb6\x18\x01\x5e\xc3\x1d\xae\xa4\x91\x76\xcc\x14\x41\xa9\xcc\x63\xe6\x08\xa5\x68\x3c\xce\x95\xfe\x53\x2f\x69\x7b\xa6\x83\xdf\xb1\xe2\x6f\xc1\xda\x2a\xcb\xbd\xdb\x54\x29\xda\x18\xb9\xab\x88\x90\xdc\xf7\xb7\x84\x74\xe0\xc6\x6e\xb9\x69\xe3\x52\x85\x0f\xcc\xe4\xe4\x5b\x16\xdc\xc2\x65\x6b\x8b\xf6\x27\x04\x47\x08\x48\x84\xb6\x2d\x15\x69\xd0\xb6\xb2\x56\xfd\x40\xbd\x25\x39\xce\xc7\x24\xc6\x05\xf1\x20\xd5\xdb\x41\xdb\xe2\x18\x84\x3d\xf7\xa4\x4c\x47\x9a\xcc\x69\x72\x4e\x29\x53\x06\x73\x08\x51\xa1\x49\x55\xaf\xca\x3c\xab\x7e\xfb\xf6\xfd\x0f\x6d\xbb\x1f\x67\xf3\x15\xf4\xa6\xcc\xa9\xca\x36\x1a\x18\x88\x52\x17\x89\x0b\x6b\xa2\xeb\xc2\xf5\xba\xd5\x49\x01\x7e\x56\xc4\xd8\x83\xab\x5b\x3b\xd6\xfa\x92\xef\xad\xd4\xd6\x40\xec\x52\x50\x9e\xb5\xc6\x9a\xa8\x3a\x8f\x77\x8e\xfc\xac\x56\x96\x3b\xd0\xd9\xe3\xbd\x7e\x61\x3e\xc8\xf6\xef\xbd\x6c\x32\xc6\x6e\xbb\x92\x1c\x14\x50\xe9\xd7\x4c\xd3\x7f\x42\x8d\xd6\xd7\x0c\x8b\x7a\x93\x08\xb9\xb6\xbe\xe6\x58\x2d\xb5\x44\xe8\x35\xf7\x35\x97\xcb\x6d\xef\xea\x51\xba\xde\x68\x37\x69\x7e\x1e\x81\x80\x02\x37\x63\x8c\x40\x92\xe8\xd0\xc6\x26\xcf\x3c\xd2\xec\xcd\x22\xeb\xd8\x30\x9e\x6e\x66\x1a\x08\x21\x7c\xba\xb1\xfb\x4c\x12\xcd\x93\xe6\x21\x54\xef\xac\xbb\x3b\xdf\x1f\x81\x45\xc0\xb2\x6d\x47\x25\x74\x18\x34\xca\x14\xcd\x6a\xec\xaf\x0c\x27\x7d\xaf\x29\xb3\x68\x9e\x96\x64\x39\x55\x48\x5b\x02\x0c\x8d\x32\x15\x08\x6b\xde\xa1\x04\x01\xf6\x96\x12\x7b\x06\x77\x4b\x8d\xbb\x5d\xf2\x13\xb3\x4a\x5d\x37\xa0\xac\xb6\x19\xab\x1d\x0b\xb2\xaf\x48\x69\x76\x36\x27\xf6\x8e\x04\x37\xe1\x0a\x1d\x9f\x80\x45\x01\x38\x65\x06\x5b\x39\x56\x66\x04\xae\x2d\x6a\x7c\x7f\x14\xdc\x9d\x5d\xcf\x16\x73\x94\x2e\xc2\x50\x1d\x77\xaf\xf4\x25\x20\xb0\xd8\x2c\xa6\x1a\x0f\x89\x42\x0c\x32\xd5\x3a\x3d\x0c\x80\xa9\xa8\x33\x43\x79\x83\xbb\x5e\x66\xd9\xe7\xc5\xf4\x7a\xb6\x18\xc7\xf3\x24\x32\x1d\x97\x2d\xe8\x6e\x0f\x03\xe4\xfb\x7e\xf0\x6a\xb2\xa8\x57\xdb\x46\x4b\x82\x5a\x39\xd8\x92\xad\x2a\xfa\x0a\x3c\x68\xaa\x2d\xfc\xbd\x12\xd0\x6f\xdb\xe0\xd5\x84\x8b\x7a\x43\x6e\xf0\xab\x09\x57\x95\x90\x15\xc2\xaf\x76\x76\x4f\x47\x0a\x24\x1c\xcc\xe6\xb4\x26\x19\x42\x58\x75\x3e\x73\xfb\x96\xa9\x86\x40\xe3\xcb\x69\x06\xa0\xc1\xa8\x86\x1d\x39\x88\xd5\xbf\x33\x33\x8a\xf0\xd8\x70\xc1\xf0\x4f\x4c\x63\x34\xd2\xf0\x22\x80\x64\x7b\x1f\x39\x8a\x4d\xaf\x0f\x9b\xc9\xc4\x5a\x8a\x8e\x44\x69\xde\xc9\x00\xe4\x21\x39\x95\x24\x78\x43\xe8\x2c\x07\x49\x95\xb3\xa0\x96\xbf\xe7\x68\x1a\x94\x24\xc2\x19\x89\x71\x45\xd4\xc8\xa0\x44\x9c\x35\xd3\x8c\xc4\x61\x50\x12\x31\xae\x51\x12\xe4\x8e\xc8\xfc\x69\xdb\x0a\x70\x8e\x2c\x41\x9d\xce\x95\xda\x77\x49\x82\x8c\x34\xe3\x1a\x8d\x63\x2c\xce\xc1\x75\x72\x65\x57\xaa\x12\x3a\x02\xd2\x41\xd2\x07\xd0\x86\x93\x39\xae\x01\x0a\x23\x24\x70\x2d\x9e\x4c\x55\x23\x12\x53\x18\x20\x31\x84\xcd\xac\x61\xca\x3d\x05\x32\x87\x20\x9d\xe5\xe3\x93\x39\x91\x40\xc7\xa7\x73\x15\x8e\xe7\x0e\xc0\x14\xc9\x1a\x4f\xc2\x20\x1f\x93\x53\x34\xb7\xdd\x04\xd1\x3e\x33\x71\x99\xef\x97\x04\x3a\xa0\xad\x29\x75\xdd\x35\x1d\x85\x2a\xc2\xc7\x73\xdf\x1f\xc9\x1f\x4f\xf6\xeb\x08\x00\xcd\xb2\x6b\xb6\xef\x5a\x38\x49\xef\x91\xf2\x5c\x4f\x38\x06\x0a\x20\x29\x31\x65\x45\x92\x61\x73\xfa\x27\x15\xee\x0e\xcd\xa4\xc6\xe6\x30\x4d\x1a\x87\x08\xfd\xb6\x47\x98\xff\xc4\xa0\x13\x1a\x33\x43\x8e\x2e\xb5\xb2\xb5\x01\x23\x60\x08\xa9\xef\x73\x11\xee\x7f\x69\x4f\xfa\xa9\x74\x34\x23\xd2\x52\xa9\x96\x33\xb0\x7d\x33\x2c\x5b\x8e\xc7\x87\xec\x19\xfc\xd1\x31\x31\xf4\x96\x02\x97\xf8\xa1\xc2\x10\xa6\x7b\xc4\xa3\xb6\x88\xaa\xc4\x92\x86\xa2\x2c\xee\x6d\x52\x84\x21\xda\xbb\x17\x8a\x39\xb9\x77\x3d\xb0\x31\xa5\x5f\xf8\xc0\x4d\x45\x55\xf6\xee\xf0\x3d\x03\xed\x09\xd2\xb8\x17\x3e\xb7\x15\x7f\xb0\x60\x70\x1b\x14\xae\x7b\xdd\x3f\xa1\x11\xd0\x14\x87\x7b\xac\xf8\x19\xaf\xd6\x9a\x97\x40\x86\x29\x1f\xe8\x67\xcd\x30\xd8\x4b\xb2\x4c\x90\x81\xf5\x58\xf7\xf0\x03\x8f\xc1\xf6\x2c\x1d\x2a\x87\xba\x0d\xd1\x2f\x54\xca\xc6\x7a\x5f\xde\xe6\x1b\x97\xad\xb1\xf5\xfd\xbb\xe9\x38\xa0\xc0\xd3\x7c\xe8\x74\x54\x34\x87\xe5\xf7\xec\x71\x90\x54\x69\xe4\xf0\x66\x11\x4a\xac\xff\xdc\x5f\x24\x62\x37\xd9\x8a\xfe\xf6\x23\xb0\xc6\x54\x27\x34\x2f\x55\x4b\x3a\xb7\xad\x81\xa1\xb8\x2b\x12\x86\xa3\xcb\xfe\xbf\xb7\x58\x1e\x95\x7f\xb7\xc1\x1f\xea\xcd\xc1\xf6\xfe\xfb\xef\xb7\xb7\xc7\x2f\xfc\xaf\xa3\xb9\x05\x6a\xde\xe6\x65\x04\x33\x25\x15\xbd\xff\x3a\xe3\x68\x7c\x8b\x19\x9f\xab\x97\x06\xc5\xe8\xfd\xc4\x94\x7d\xbf\x43\x0b\xf2\xd7\xe1\x23\xcd\xc8\x5e\xe0\xfe\x0b\xaf\xff\x70\xe3\x01\xfd\x26\x73\x49\x22\xd9\x0e\x76\x95\x92\x51\x49\x20\x75\x66\x5d\x14\x87\xc0\xab\xea\x3c\xab\xb4\x97\xc2\x8a\xfc\x57\x68\xf3\xb5\x3a\x5e\x92\x54\x55\x48\x6e\x9d\xb5\x81\x92\x6a\x3c\xe0\xb2\x28\xbc\x61\x4f\x22\x51\x16\x69\x5b\x4f\x51\xe5\x50\xa3\x75\x06\xe5\xce\x55\xc5\x3b\x7d\x88\x10\xae\x42\x52\x43\x4f\x02\x07\xd0\x34\x4a\x7e\x66\xc1\x45\x00\x46\x21\xf5\x1b\x93\xa2\xaf\x06\xb9\xbe\xb1\xb9\x14\xf5\x1c\x92\x06\xeb\x9d\x2e\x24\x4d\xe7\x7a\x0d\x50\x55\x39\xa8\xaa\x5c\xb7\xbb\xff\xee\xb9\x89\x28\xca\x1b\x79\xb0\xf4\x49\x6f\x4e\x34\x79\x03\x46\xc9\x6b\x50\xcb\x32\x48\x60\x88\x8f\x89\x69\x09\x2e\xc7\xc4\xb4\xdd\x4a\xe7\x58\x14\xb3\xb6\x1d\xb1\x4e\xcf\xcd\xf2\x1d\xcb\x3f\x29\x7f\xf8\xae\x10\x12\x4d\xac\x94\x21\xa8\xaf\x6f\x76\x6a\x08\xff\x17\x3c\xbb\xd4\x3e\x1f\x57\x1d\xad\x56\x8e\x2b\x00\xd9\xa1\xe3\x51\x6f\xea\x19\x4e\x0f\xcc\x21\x2b\x00\xaa\xfd\x1a\x21\xfc\xab\xe2\x52\xfd\xa0\xfe\xc8\x0b\x28\x2e\x51\xef\x05\xf6\x1f\x3d\xdd\x42\x74\xdf\xe9\x1b\x04\xa2\x33\x53\x09\x5c\x9a\x12\x0b\x5c\x4d\xf5\x11\x9c\xa8\xf3\xd1\xb1\x6f\x5d\x4d\xd5\x2c\x20\xb5\x26\x56\xf5\x5f\x3d\x39\x4c\x5b\x6a\x59\x3d\x97\x73\x73\xd8\x5c\xac\x14\x35\x7e\x54\x4c\x2c\xa4\x7d\x0b\xac\x69\xc0\xf7\xb4\x94\x71\x03\x62\x93\x38\xb7\xee\xb5\x40\x2f\xe8\xbc\x6f\x5d\x60\x1a\x34\xfd\x08\x9c\x13\x4f\x31\x98\x3c\x94\x34\xda\x60\x0c\x89\x64\x74\xb6\x14\x94\x7b\x08\x8f\x2c\x4b\xb2\x0a\x4c\x5e\x42\xf2\x69\x33\x8e\x93\x06\x3b\x31\x8e\x7b\xed\xed\xc0\xd6\x6e\x15\xb0\x29\x1d\xc7\x09\xc5\x31\x21\xf5\x4c\xcc\x27\x15\xbd\xa1\xd5\x88\x68\x07\x8f\x05\xd9\xd2\x00\xe8\x49\x84\xd7\x24\xa7\x78\x43\xb6\x41\x83\x8b\x3e\xf8\x9e\xd1\x65\x49\x6e\x6c\x26\xb5\x58\x53\x0e\x79\xd7\x36\xef\x88\xe4\x08\x61\x67\x17\xfc\x57\x8f\x98\x89\x52\x30\x38\xab\x11\x3d\x14\x13\x71\xce\x37\x46\x7a\xb7\xa3\xaf\xc1\x90\xac\x5e\x5d\xfb\x23\x25\x37\x28\x8e\xc2\xde\x7e\xd4\x9b\xc5\xe6\xb2\xaa\x2e\xa9\xa5\x25\xd4\x43\xe3\x27\xd0\x99\xd2\xff\x64\xfb\x76\x8a\x3a\xbf\x6d\xd6\xb0\xfc\xe7\x9f\x68\x45\x4a\x0c\x56\x6f\x27\xf5\x56\x34\x65\x41\x09\x47\x38\x73\xfc\x0d\xee\xf1\xe8\x8a\x3a\x07\xce\x0a\x0b\x0f\xee\x95\xe8\x2c\x32\xe3\xfd\x4f\x16\x70\xe3\xb0\x4c\xbd\xc8\x8d\x63\x6c\x78\x90\x25\xa1\x22\xe0\x98\x21\x9c\x11\x9d\x2b\xe4\xc6\x8b\x59\xb9\x0c\xca\xf3\x6c\x1f\x8e\xcd\x81\x95\x19\xf9\x9e\x4d\x0b\x55\x45\x8c\x63\x94\x8a\xb3\x08\x5c\xfe\x46\xae\xfb\x0d\x28\x52\x22\x63\x3b\xb7\x26\x9c\x07\x14\x57\xb0\x0a\x61\x01\xbc\x16\x41\x85\xeb\x49\xbe\x0e\x83\x1a\x70\x73\x1e\xb5\x6d\x6d\x10\x73\x1e\x4d\xe3\x24\x42\x8a\x09\xd9\xf4\x2d\xe6\xe7\xa4\xd1\x72\xef\x90\x9c\xeb\x17\x91\xd2\xe4\xca\x53\x53\x3d\x51\x69\xee\xc3\x39\xe5\xce\x9b\xc0\x58\x1f\x77\xc6\x64\x88\xdb\xbf\x8c\x34\xb4\x63\x9d\x8a\xfe\x0b\x02\xc3\x62\x1c\x23\xbd\xe1\x9f\x11\xbe\xc3\x25\xb6\x96\x70\xee\x17\x74\x55\xb2\x24\x03\x52\xbe\xfc\x0b\x30\x40\x72\x9c\xf3\x1d\xce\x70\xe9\xb6\x53\xf0\xbd\xb7\x0b\x25\xda\xaf\x19\xff\x08\xdb\x9e\xe8\xd3\x5c\x43\xe4\xf2\x56\x04\x46\x20\x14\xd7\xb2\x53\xc3\xde\x83\x38\x02\x82\x46\x75\x81\xa9\x87\x35\xd9\x18\x59\x0f\x9f\x2a\x11\x80\x84\xea\x6b\xf8\xb9\x2b\x0f\xcc\x79\x8f\x7e\x18\xeb\xf3\x5e\x4d\x7d\xf3\xba\x52\x29\xe4\xe2\x9a\x44\xb0\xdf\xf5\x37\xb2\x51\x84\xb7\x72\x73\x14\x7b\x9b\xa3\x1c\xd3\xad\x9a\x35\x05\x09\x0e\x2f\xf8\x69\xc6\x93\x92\x23\xdd\x8a\x0c\x6f\xa1\x25\x69\x4d\x82\x9c\xc4\x23\x52\xa8\x1d\x0b\x4d\x95\x7e\x0b\x68\xbf\x8c\x63\xdc\x90\x7c\x2a\x7f\x26\x2a\x7a\x1c\xc3\x76\xb6\xc6\x1b\xbc\x54\xd4\xf3\x8d\xfa\xb3\x1a\x8e\x99\xda\x8b\x00\xc1\x99\x23\xdd\x73\xf0\xe8\x1f\x8d\x18\xd7\x2a\x88\xa3\x18\x8c\x9c\xc9\x5c\x67\xa4\x04\x21\x6d\xba\x14\x67\x44\x6e\x01\x4b\x22\x64\x75\x08\x4c\xbb\x29\x25\xc4\x3b\xad\x09\x7e\x63\x14\x9c\xf9\xf8\x46\x95\xb8\xd1\x1e\xf0\x39\x5e\x90\x6b\x42\xf2\x74\x45\x96\x61\xb0\x98\x46\x49\x8c\xf0\x86\x2c\xa6\x7a\xff\x4f\xcc\xae\x8a\xd7\xe4\x7a\xaa\x0a\x27\xba\xb0\xe2\x9b\x01\x93\x6a\x45\x48\xd3\xb6\x2b\x42\x6a\xe4\xfb\xab\x30\xc4\x1b\x12\x11\xb2\xb2\x50\x56\x03\xeb\x4b\x53\x03\x36\xd1\x28\x58\x8d\x83\x5c\xad\x4f\xd3\xf1\xea\x8c\x94\xf2\x9c\x19\x36\x44\xb3\x84\xe0\x98\x06\xef\x88\x2b\xbc\x31\x13\x14\x0b\x79\xfc\xae\xc9\x2b\x75\xc0\xde\x91\xf2\xec\x95\xc4\xd5\x74\x1c\x27\xe5\x39\x79\xa5\x61\x83\x09\xc2\x6e\x73\x62\x78\x45\x6a\xaa\xc5\xa2\xf0\x0a\x4b\x0c\xe0\x3b\xcc\xc7\xae\xef\xc3\x92\x1f\xb6\x57\xed\x8e\xab\x35\x08\x57\xaa\xd7\x83\x78\x44\x1a\x35\x6f\xec\xf8\xf2\xa0\x6b\x78\x3e\x6d\xe4\xd4\x51\xc6\x8e\x71\xde\xe1\xc4\x9e\xbd\xb6\x57\x72\x53\xc7\x95\x1a\xd9\x08\x97\x8e\x1e\xb1\xaa\x0c\x04\x31\xcf\x23\x23\xc3\xd7\x55\x8c\xb7\xa4\x5f\x21\xcc\xde\x06\xf4\xf8\xf6\x50\xdb\xab\x30\x65\x3c\xd8\x9a\x5a\x7d\x7f\x0b\x0b\xb9\x02\xfa\xa0\x9c\xd5\xe3\xb8\xb3\xea\xed\xf8\xa2\xc8\x1e\xc0\x92\xde\x59\xb8\xb2\x90\x5b\x4f\x60\x3f\xc3\x39\xa9\x27\x94\x15\xe9\xf1\x55\x63\xfc\xf9\xf5\x9e\x05\xf2\x31\x58\x48\xc8\xc7\x63\x7b\x0c\x6c\x7b\xba\x97\xea\xb9\xc2\xa0\x43\xbd\x5a\x28\x13\x06\xe5\x6c\xad\xac\x9a\x06\x1b\xa5\x67\x47\xf2\xb6\xdd\x4c\x44\x7d\x46\x1a\xcb\x3c\x7d\xaf\x08\xb0\x78\x44\x36\x0a\x5b\x53\xab\x7a\x96\xe3\x0d\xe8\xb7\xc5\x89\x75\x69\xd3\x60\x05\x0a\x21\xcd\x7d\xbb\x21\xcb\xb3\x6c\x9a\x8d\x97\x61\x4c\x5f\x24\xcb\x71\x96\x06\xa3\x6d\xdb\x16\xe7\x37\x60\x7e\x8f\x6c\x70\x41\x6e\xd0\xce\xa0\x69\xdb\xb6\xc1\x96\x94\xb3\x6e\xf4\xe6\x08\x6f\x95\xda\x66\x03\x05\xee\xd5\xe0\x60\x51\x27\x12\xdd\x18\xda\x94\x6c\x55\xdb\x76\x32\xb3\x52\x59\xb6\x59\xb7\xda\x44\x73\x9d\xe4\xfb\x99\x1d\x4d\x59\x3e\x10\x3d\x1a\xb2\x00\x86\xa2\x1f\x5d\x4a\x67\x36\xf7\x82\xa1\xfb\x0b\x46\x8c\xe8\xc7\x9e\x80\xb1\x23\xfb\x31\xe0\x6c\x3c\x7e\x01\xca\x41\x17\xec\x4b\x8a\xc6\x56\x1b\x5f\xbd\x57\x0c\x32\x7f\x0e\xbc\x05\xf7\x10\x4a\xff\x17\x20\x3b\x57\x64\xe5\x82\x19\x9f\xab\x17\xac\x27\x19\x73\xfc\x24\xb2\xab\xf3\xfc\xd4\x91\x05\x71\x38\x24\x0c\x01\x17\xc7\x98\xad\xc1\xac\x6d\x1d\x45\xe4\xfa\x30\x7a\x2d\xef\x65\x88\x5d\x9b\x90\x0e\x6d\xaa\x7c\xb6\xff\x3c\x84\x3b\x5c\xcf\xc4\xbe\x70\xa2\x41\xb5\xdb\x47\x86\xec\xe5\xef\xa1\xb7\x9e\x92\x18\xb1\x17\xf3\x72\x73\x1c\xdb\xfe\x97\xe7\x27\x4e\xff\x3b\xde\x51\x09\x37\x91\xd8\x91\x15\x80\x37\xfe\x7b\xd7\x51\x75\x67\x68\xec\x7e\x87\xb9\xfc\x94\x56\x2a\xbd\xd1\x02\x2a\x6f\xe5\xa6\x9c\x39\xd1\x8e\x54\x6d\x45\x22\xb0\x11\x97\xf5\x84\x69\x7b\x2e\x9b\x0f\xc9\x25\x57\x8e\x5c\x72\xca\x66\xf5\x9c\x64\x7a\x74\x65\x65\x61\xe6\xd4\x1c\x96\x98\xab\x0c\x8e\xf0\x8d\x61\x99\x5a\x61\xf7\x9c\x4b\x0a\x63\x28\xcd\x97\x88\x43\x22\x71\xb8\x13\x56\x4e\x18\x76\x64\x93\x13\x8e\x5d\x11\xc8\x44\x1c\x12\x88\x73\x48\xb3\x9c\xf7\xe4\x7b\xac\x5c\xcf\x17\xb9\x60\xf4\xcb\xf7\x70\xc8\xe4\xb8\x27\xe6\x1d\x2b\xa8\xea\xbd\xfa\xb0\x87\x1e\xee\x39\x61\xbe\x6f\xb7\xbf\x27\xf8\xcb\x62\x4c\xc7\xbd\xdb\xd2\xf8\xd4\xd2\x34\xf6\x78\x54\x8c\xa1\x6f\xcc\xdd\xcb\xda\x28\x3c\x8a\x34\x9d\x07\x2c\xa9\x72\x4f\xba\x57\x29\x2a\xda\x78\xb3\xdb\x57\x61\x88\x6c\x64\xe7\xc9\x5b\x5e\x86\x42\x72\x20\xa1\x23\xb2\xa6\x59\x18\x40\xbf\x72\x5a\x56\x41\xe9\x12\x26\xc7\x1c\xb5\x6d\x8c\xbe\x16\x49\x16\xba\x37\xb2\x82\xf7\xac\xea\xd5\x39\x66\x04\x50\x9a\x8a\xc3\x76\xf0\x04\x01\x89\x07\xd1\x49\x7a\xfa\xbe\x76\x24\xbf\x73\xc8\x8a\x35\x3f\xe0\x56\xca\xf1\x6c\xc6\x3a\x01\x44\x10\x60\xdc\x17\x42\x64\xb5\x18\x6b\x3b\x0a\xde\xbe\xa1\x39\x78\xa8\x21\xe5\xdf\xe0\xb8\x08\x7e\x77\x0f\x92\x22\x10\xf9\xdb\x58\x33\x29\x2a\x1b\xf5\xef\x31\x70\xbe\x76\x39\x38\x2c\x29\xba\x4b\xc4\xb6\xaa\x80\xec\x6d\x70\x4e\x7e\x53\xe4\x5c\x05\x34\x37\xf7\xfd\x5c\x5f\xc4\x80\x6e\xb0\xb7\xe6\xdc\xb1\x68\x88\xac\x22\x76\x2e\x2f\xd8\xf7\x37\xc6\x83\x19\x36\x23\x7d\xc0\x81\xd9\xd8\xce\x82\x5c\x5e\x8c\x15\x3c\x6c\xe7\x6a\xa4\x7e\x82\xa6\x4d\x10\x64\xe3\x77\xee\xad\x5c\x6f\x7b\xbd\xe9\x8a\xc6\xdb\x4e\xd8\x34\x77\x14\x58\xf9\xc3\x12\x5c\x1f\xea\xb6\x0d\xc4\x90\xe3\xf8\x5a\x52\x08\xdd\x1d\xba\xa7\x31\xcb\x06\x79\x3b\x63\x9b\x3d\x41\x39\x09\x94\xcd\xf8\x1c\xd6\xb7\x03\xcb\x11\x48\x5c\x3a\xd3\x46\xbb\x6d\x81\x0b\xb3\xba\xf9\x68\x9b\x8e\xda\xd6\xaa\x7a\x5b\xe9\x12\xb4\x1b\x3e\x00\xae\xa5\xb1\x22\x7b\xa7\x77\x27\x1f\xf7\x7d\x66\x7d\xa8\x39\x96\x4a\xb7\x20\xcc\xf5\xd6\x55\x48\x3a\x10\xa9\x1f\xec\xf6\x13\x88\xe8\x84\xc3\x24\x6c\xc7\xa6\xa4\x30\x1e\xdc\x3e\xd4\xe8\xa3\xf0\xfd\xef\x3b\x3e\x8d\xd3\x90\x15\xac\x3b\xab\x4a\x78\xe6\x78\x7d\x83\x52\x7f\x9a\x52\x2c\xe4\xe8\xbc\x4b\x9c\x42\xc1\x24\xe8\x62\x42\xc2\xb1\x81\x1b\x12\xde\x01\x15\x67\x3d\x57\x72\xcc\x69\x57\xbf\xf6\x5e\x46\xc3\xaa\xb9\xe3\x70\x6f\x66\x21\xc7\x31\x4a\xb3\xa9\xae\x51\xe7\x34\x8a\xfd\xda\x69\x0f\xee\xca\x93\x4c\xbd\x96\xf4\xda\x94\x40\x85\x3b\xdb\x5d\xa7\x29\x5a\x09\xec\x4e\x4d\x06\x01\xbc\x99\xea\x70\x6d\x11\x68\x58\x39\xf5\x7d\xa8\x49\xa5\x6a\x73\x6b\xd0\x67\xad\x0b\x11\x37\x83\xfe\xd4\xbe\xdf\x3c\x54\x49\xad\x2b\x99\xe4\x35\xcb\x33\x11\x80\xea\x7e\xad\x7b\xa5\x15\xb1\x90\x4d\xed\x15\x6e\x74\x51\x74\xa8\xf7\xea\x5a\x53\xee\x4b\x3b\x4a\x6a\x98\x9d\xa9\xf5\x7f\x31\xd5\x7f\x43\xc2\x13\x61\x22\x43\x35\xd5\x61\x2e\x1e\xd4\x5c\x76\x85\xf4\x6f\xb8\x61\x97\x1d\x9e\xa1\xd6\xe4\xbc\x21\x77\xca\x2f\x89\x62\xca\xd3\x0c\xc4\x30\xcb\x4e\x0c\x53\xff\x0c\x4b\xd3\x2a\xfe\x40\xab\xf0\x28\x10\x67\xdc\xce\x8d\xb6\x15\xe7\x84\x9b\x91\xb7\x4c\xc1\x81\x74\xa8\x25\x42\x95\x20\x98\x99\x21\x99\x91\xd3\x6c\xdb\xc0\xfe\x06\x3f\x59\xe3\x98\x90\x3f\x83\x0a\x33\xe4\xfb\x95\x16\x52\xeb\x29\x54\x01\xfe\xef\xf7\xf7\xb8\xbd\xcd\xd0\xdd\x62\x70\x3f\x91\xcc\xe6\xf8\x10\xaf\x91\x38\x14\xe5\xdd\xf0\x20\xc4\x19\xd1\xdd\xc2\xd5\xa0\x32\x38\x19\x3f\x8a\xb6\x65\xe4\xa1\x8d\x4d\x93\x75\x30\xa5\x92\x0c\x03\xce\x13\xd6\xc9\x0f\xd7\x07\xb6\x6d\xed\x70\x36\x4b\x9b\x30\x44\x75\x48\xaa\x59\xa3\xf6\x60\xb8\x5d\x8f\x88\x3a\x07\xb8\xbc\x66\x97\xcb\x20\x23\xa4\x13\x1d\xec\x6d\xf7\x25\xa9\xc3\x6a\x96\xa9\xb2\x63\x81\xb3\x30\xd4\xcb\x97\xd4\x63\x01\x86\x92\xc1\x62\xb0\xf2\xa8\x64\xf7\x38\x86\x46\x84\xa5\x06\x76\xc0\xcf\xa2\x69\x94\x38\x55\xf4\xea\x60\x21\xe1\x5f\x57\xb3\x6c\x0c\xf9\xe2\x24\x42\xaa\x3a\x9c\x85\x84\xef\x1e\xe8\xbd\xa3\x46\xfc\x10\xfd\xae\xce\x25\x46\x22\x3c\x78\x10\xe4\xe6\x6e\x5d\x82\x87\xb0\x74\x54\x6a\x7b\x1d\x20\xa2\x04\xb3\x4d\x1e\x03\x7a\x6e\x21\xdf\x0f\x43\x76\xc0\x3a\xf1\x62\x30\x9d\xb4\x92\xd3\xba\xbe\x55\xa6\x31\xcb\xda\x7d\xec\x56\xa9\x1b\x4e\x37\x19\xa7\x5d\x06\x77\xc5\xbe\xd2\x27\xb4\x92\x66\x26\xe6\x20\x1c\x45\xa8\x13\x95\xae\x73\x73\x23\xe1\x72\x55\x37\x35\x6f\xfe\xda\x1e\x22\xf0\xb5\x1b\x53\xe7\xdf\xc8\x5f\x39\x74\xf4\xa3\x7c\xdb\x88\xfa\x5a\x89\x02\xa5\x95\x6d\x52\xdf\x97\x00\x93\xf0\x27\xbc\x67\x07\xa3\x56\x34\x80\x68\x5b\xb0\x04\x2e\x33\x6c\x78\x79\x0d\x6a\x4a\x86\xbd\xe4\x96\x33\xde\x5b\x02\xc5\xda\x09\x94\xd5\x96\x43\xb4\x4a\x33\x11\xb5\x4e\x3e\x3b\x40\xb3\x74\xae\x0a\xe8\xf5\x46\xdc\x05\x48\x79\x3f\xd0\xf4\x58\x15\x50\xdc\xa0\x74\xeb\xfb\x2f\x25\xc2\xb7\xb8\x54\x07\x46\x90\xb7\xad\x23\x00\xb5\xae\x6f\x55\x9f\x7f\x5d\x53\xa6\x07\x8c\xad\x90\x2e\xd5\x4c\xd6\x34\x2b\x70\x89\xd2\xbc\x6d\x7f\x81\x18\x9c\x75\x0c\x12\x87\xbe\x79\xc9\xfb\xcf\x16\xfa\x51\x6e\x68\x79\x63\xf4\x37\x64\xaf\xe4\x9d\x77\x8f\x99\x00\x70\x94\xd9\xcd\xde\xcd\x5a\xcd\x0e\x4f\xbd\x12\x94\x7d\xc5\x35\x78\xb0\x05\xa5\x35\x93\x20\xea\x0d\xe1\xc0\xb1\xed\x45\x6b\x55\x25\x87\x1a\xe5\x46\x3a\x0e\x72\xa3\xaf\xbb\x66\xe7\x4e\x83\x15\x14\x65\x5a\x76\x99\x09\xdd\x18\x6b\x61\x16\x48\xf7\x5f\xd5\x3d\xd2\x98\x65\x73\xac\x16\xd8\x33\xe1\xd1\x41\x5c\x81\x1b\x5f\x7d\xf3\x57\xcf\xb3\x69\xd9\x53\x94\x0b\xaa\xf3\x68\x5a\x75\xc2\x07\xf6\xfa\x1f\x20\xa5\xed\xbd\x03\x2f\x6a\xf0\xe2\xd6\x39\xeb\xfb\x9f\xf0\xea\x2a\x43\x37\x34\xaf\x59\x91\xf1\xbb\x0e\xe5\xb5\x6e\x8f\x9e\x9a\xc4\xf3\x70\xdd\x1f\x02\xa8\xdc\x19\x88\xba\x37\x10\x2a\xd5\x0e\x47\xdd\x1f\x8e\xc9\xf3\x27\x5f\x9b\xf6\x77\xc3\x61\xcb\xe8\x3e\x3a\x6a\xa7\xbc\x67\xbb\x90\x6a\x99\x47\x51\x6f\xe4\x8c\x87\x1b\xb8\x18\xdc\xb1\x7f\xe1\x7b\x8f\x6d\x2e\x99\x50\xe7\x38\xfb\x5b\xfb\x48\xef\xba\x02\x0e\x33\xe1\x2a\xd6\x74\x53\x4a\xbd\xa3\xa9\xf1\xc1\x20\x5b\x3f\xd6\x51\x0e\xf7\x03\x8d\x2b\xcd\xa9\xcc\x89\x57\x09\xee\x49\xe2\xdd\xbe\x8a\xec\xbd\xd6\x82\x0f\x7f\xfb\xf0\x86\xf5\x04\x56\x77\x28\x50\x05\x71\xc2\x1c\xe1\xec\xb0\x56\xfc\x90\x2d\xa8\x76\x50\x5a\x78\xae\x99\x9c\x6c\xd1\xd4\xd5\x56\xd0\xf4\xc8\x28\x7e\x53\x50\x0f\xbc\x62\x47\x5f\xfa\x27\xea\x0d\xa8\x19\x0e\xd4\xc2\x8d\x53\x89\x69\x33\xa6\x09\x43\x7f\x07\x92\x9a\x13\x50\x98\x8f\x05\xda\x53\xd6\x2c\x02\x87\x14\x91\x77\xe8\x42\x5e\x5e\x4b\x49\x8c\xac\x49\xe1\x32\x0c\x3a\x34\x6e\x02\xf7\x69\xed\x91\xe6\xba\xc3\xdb\xa4\xc2\x4d\xd1\x53\x0e\x5a\x06\xbd\x6b\x3f\xbc\xce\x15\x0a\x7f\x42\x1e\x3e\x7a\xc4\x18\x21\x81\xe6\xd3\x13\xc2\xd1\x40\x6c\xd1\xb0\x34\x36\x4e\x9e\x69\xa9\xd8\xeb\x49\x39\xa1\xac\x18\x07\x1d\x77\xbd\xe8\x71\xd7\x55\x72\x8c\xd0\xf4\x24\x89\x11\xce\xd0\x2c\x9b\xef\x94\x80\xef\x9a\x06\x05\x2e\xdd\x17\xb4\x21\x2f\xc7\x55\x15\x1e\x59\x09\x74\x0e\x7d\x82\x96\x63\xe7\xb4\x2b\xc9\x28\xd6\x5e\x35\xa8\xeb\x49\x43\x53\xa7\x74\x96\xcd\xd3\xa0\x52\x9c\x70\x26\xe9\x50\x51\x9f\x0b\x10\xff\xd4\x21\x42\xe0\x32\xc9\x03\xbb\x00\x2a\xcd\xf9\x46\xd8\xb2\xec\x2b\xe5\xae\x06\xc7\x8a\x30\xbb\xa1\xd5\xd4\xe3\xa2\xf2\x12\xd5\x9e\x4c\x1e\x04\xa3\x08\xed\xca\xb6\x75\xda\x89\x76\xc1\x0d\x66\x6d\x1b\xe9\xeb\x32\x9f\xae\x13\x8e\x7b\xfd\x2c\x71\x61\x2c\x1a\x9b\x65\x84\xef\xc8\x26\xa0\x78\x35\x94\x22\xc5\xd7\x64\x13\x88\x71\x2c\x53\x7a\x62\x21\x08\x2f\x88\xbd\x8f\x47\x84\x50\xfc\x4a\x87\xb9\xef\x0b\x42\xd6\xf8\x25\x89\x08\x29\xf0\x25\x19\xdd\xb4\x6d\x41\xc8\x8d\x23\x21\xb9\x0c\xae\x61\xfb\xb9\x53\x0f\x7f\xa7\xaa\x39\xbf\x90\x20\x9f\x2e\x92\x57\xf2\x78\x9d\xd6\x49\xb0\x9a\xde\x25\xd7\x8a\xbd\x91\x6e\x83\x5f\x30\xe4\xc6\x41\x90\x4f\x5f\x25\x0b\xe4\xfb\x97\xd3\x46\x66\xba\x4e\xee\x90\x91\x84\x96\x99\xb4\x22\x4b\x77\xff\xfb\x84\x3f\xe2\x5b\xfc\x26\x5d\x4d\x83\x4f\x24\xf7\xfd\x85\x82\x7f\xa7\x76\xa1\x8f\x24\x9f\x36\xc9\x12\xc4\x5f\xba\x87\xa3\x5b\x92\x4f\xeb\x44\xce\xe9\x12\xdb\xe7\xab\x37\xb2\xf4\x2b\x55\xf1\xb5\xae\x32\x91\x30\xa7\x83\xe2\x49\x8d\x3f\x92\x91\xa9\xaa\x49\xee\xf4\xbe\x75\x0b\x91\x00\xa1\x4e\xae\x55\xfd\x6f\xa0\xb8\x5b\x4f\xd2\x20\xbc\x0d\x3e\xe9\xfe\x7e\x1c\x7f\xea\x3a\x65\x7f\x9d\x01\x02\x7d\x7f\x1b\xd4\x36\x4e\x2d\x36\x48\x90\x00\x6e\xd5\x4f\xfc\x66\x2c\x7f\x19\xac\x80\xb9\x90\x4b\x1e\xdc\xe1\x4c\x9b\x70\xcc\xc8\x1d\xc2\x97\x3c\xb8\x86\x18\x88\xb8\x46\x38\x18\x55\x3a\x5f\xa5\xf3\x55\x36\x5f\xa5\xf2\x55\xe4\x1a\xed\x10\xbe\x57\x72\xb9\xea\x31\xbf\x52\x42\xd9\x6b\xed\x89\x33\x40\x78\x03\x12\x5b\x8a\xfc\x5a\x6b\x41\x84\x8d\xe2\x97\x15\x3a\x02\xaf\x27\xf9\x1a\x6f\x40\x1e\xc5\x8e\xda\x52\xed\x50\x6b\x2d\x90\x72\xa3\x82\xba\x24\x5e\x91\x3f\x44\xb0\x44\x44\xfe\xb9\x41\xf8\x8e\xf4\x61\xad\xa6\x4b\x77\x53\x0b\x63\xe5\x1a\x02\x54\x87\xae\x49\x11\x28\x30\x78\x35\x8d\x94\x92\x1b\xd4\xad\x3d\xc9\xae\x7c\x3f\x50\x13\x53\x4d\xd2\x93\x69\xb0\x0d\xcc\x08\xaa\x31\x51\x86\x52\xed\xa0\xc8\x41\x50\xb8\xd6\x63\x6a\xd1\x8d\x92\x61\x51\x95\x63\xdc\x45\x9a\x9c\x7f\x7b\x68\x77\x7d\x2a\x25\x73\x75\xf2\xb9\x15\x23\x56\x76\xd4\x97\x75\xbe\xb5\x6e\xbb\x9c\x6b\x51\x0a\xce\x00\x7f\x60\x82\xf2\x9b\xac\x0a\xc4\x64\x51\x95\x0c\x7c\xad\xa9\x4b\xc6\x28\x4a\x85\xa6\xe5\xbe\x2d\x6f\x34\xe1\x71\x53\x36\xe5\xa2\xac\x4a\x01\xa4\xcc\x90\xe6\xfb\x46\x42\xf8\x29\x13\xf4\x3c\x9a\x5a\x78\xa4\xa1\xc2\xd6\xe2\x18\xf2\x03\xb5\xbe\xd7\xb2\x71\x01\x6a\xdb\x77\xb2\xd9\xf8\x8b\x15\x06\x8c\x8c\x18\x9a\x7a\x5e\xe2\x69\x5b\x3c\xbb\x87\x5b\x80\x92\x07\x93\x14\x3d\xf0\xc5\xae\x69\xf8\xae\xa8\xc9\x47\x7d\xcb\x73\x1b\xbd\x77\xad\x5b\xaa\x14\x3c\xc0\x7d\xdb\xbe\x01\x05\x52\x47\x43\x5e\x43\x53\xd9\xc0\x5e\x62\xc9\x56\xdf\x54\x5b\x0e\xa6\x36\xc8\x28\x72\x4d\x24\xf6\xb0\xf6\x40\x11\x78\xe5\x7a\x10\x5c\x3c\x6c\x92\xef\xbf\x53\x4d\xc2\x71\xe4\xba\xcd\x7b\xa3\x49\xc4\x2f\xd4\x33\xb2\x69\x3c\x5b\xad\x4a\xb6\xfa\x60\x8c\x09\x3e\x5c\x3d\xc2\x1e\xab\x35\x59\x3c\x72\x2e\x95\x9c\x66\xc5\x8f\xac\xba\x73\x8a\x5b\x9c\x05\xca\x27\x04\x84\xc1\x1d\xc4\x1e\x5e\x25\x9a\x3e\x38\x83\xa0\x5f\xa4\x7a\xc4\x9a\xce\xea\x21\x79\xb3\x02\xfe\x97\xef\x3b\xaf\x3e\xb4\x7a\x5d\x73\xb0\x27\xfd\x59\xbc\xa3\x6c\x3b\xd2\xdc\x97\x86\x56\xd0\xa6\xfe\xf8\x72\xda\x50\x49\xcf\x36\xbe\x7f\x78\x78\xf6\x34\x9d\xdd\x72\x20\xea\x70\x12\xa1\x7d\x8b\x28\x9c\xe6\xb4\xbc\xa1\x85\x9e\x59\x08\x7f\x1a\xcc\x97\x77\x7f\x35\x2c\x30\x19\x07\x23\xac\x11\xb8\xa8\xb6\xfc\x21\xfc\xc5\xf8\xcd\xdf\xc5\x1f\xc2\xfd\x0d\xc3\xd1\xc6\xd7\x1b\xc7\x5f\x4c\xd9\x6e\x60\x1d\xfc\xaf\xcb\x25\xcc\x8f\x1d\x8e\x9f\x44\x6e\x8f\xdf\x7e\xe1\x39\x56\x49\x28\xca\xa5\x6b\x0d\x4a\x18\x5a\x5e\x5d\x4e\xc5\x5f\xbf\x37\xc2\x09\x59\x3a\xa0\xbe\x90\x51\x12\x7a\x9a\x93\x26\x7a\xaa\x0c\x8d\xe1\x20\xe5\x5a\x1b\x6c\xd6\xcc\xc1\x57\xc7\xc1\xc7\xc7\x9e\x01\x77\x70\x4f\xab\xf9\x4d\xb0\x5f\x97\xa1\x16\xc4\xd3\xb7\x3b\x6d\x11\xd3\x48\x7f\xe4\xca\x4a\x88\xed\x70\xd8\x8b\xd0\x92\x0d\x05\xd9\x8c\x19\x66\x64\xb3\x73\xce\x50\x9d\xf1\xa1\x47\xb2\x82\x18\x95\xb8\xb1\x52\x94\x1b\x6d\x7d\x3f\x1f\xaa\x1a\x83\x93\x80\xbd\xd8\x07\x91\xa6\x2e\xe5\x4a\x23\x6f\x1c\x23\x4d\x83\xf7\xfa\x37\x06\x66\x72\x70\x73\x3e\x89\xa2\x27\x6d\x7b\x73\x36\x96\x3f\xe0\x81\xe5\x0c\xc4\x3f\xc7\xe4\x06\xe1\x7f\x52\xf3\x12\x56\x20\xfc\x99\xeb\x00\xc2\xf9\x40\xdd\x65\x45\xa2\x74\x75\x96\xf7\xd4\x5d\x56\x61\x88\xa0\x08\x58\x4e\x58\x29\x73\xd0\xeb\xf3\x81\xd0\xb7\x92\x67\x50\x7e\x82\x49\xf7\x84\x3a\x78\xfc\x45\xe9\xdd\xf9\x9e\x76\x88\xf5\x02\xf6\x40\x0a\xb9\xc3\x7b\x29\x1a\x09\xfb\x09\x8e\xaa\xc9\x6e\xb7\xb3\x3a\xa9\x19\xa8\x63\x07\xce\x8c\xb6\x4a\x11\x21\x71\x0f\xfe\xcf\xdd\xc1\x3f\x7c\x6d\x36\xda\x38\x83\xd7\x66\xd7\x8f\xb0\x7d\x5b\x16\x73\xcc\xb5\xb1\x18\x47\x0f\x13\xbc\x37\x30\xc3\x77\xe8\x1b\x68\x71\x4f\xc9\xdf\x07\xec\x02\xa6\xbc\xbe\x8e\xc0\x33\xe0\x66\xea\x2c\x51\xa5\x2e\x9e\xd0\x03\xfd\x4a\xf5\x5a\x5e\x56\x75\xcd\x03\x3e\x06\x73\x32\xe6\x39\xcf\x81\xa8\x25\xdf\xcc\x8f\x84\x87\x74\x20\x94\xa0\x1a\x88\x33\x42\xe5\xad\x95\x03\x43\x53\xfe\x52\x9e\x46\xc1\x22\x2c\x65\x20\xff\x62\xb9\x3f\x2a\xec\x38\xc2\x6b\xba\x48\xed\xb6\x2e\xad\xcf\xb2\x69\x90\x91\xda\x80\xfb\xaf\x08\x1e\xd1\x40\xe0\x1a\xa1\x07\x9a\x80\x50\x62\x2f\x75\x0d\x16\xae\x33\xce\x73\x52\x01\xc1\xdd\x83\xd4\x20\x34\x7e\x00\x12\xae\x88\x75\x19\xad\x44\xa6\x32\x2c\xea\x4e\xa6\xab\xc2\x59\x18\xbb\x63\xf2\x1d\x3f\x68\x28\x17\xf3\xbe\xd0\x44\x0a\x8c\x20\x4d\x1c\x89\x7a\xe3\xbe\xa0\xea\x73\xd3\x0a\x03\xc1\x33\x92\x1d\xaf\xe9\x5e\x4c\xc2\x0e\x0c\x2b\xce\x08\x18\x7d\xc1\x15\xb9\xdf\xa5\xa2\xd3\xae\x15\xf5\xe6\x3c\x53\x76\xde\x94\x16\x29\x44\x85\x99\xd1\x0e\x50\x27\xb2\x9a\x7b\xe1\x1b\xb0\x8a\xd6\x10\x93\xf9\xbc\x1e\x83\xab\x01\xd5\xfa\x12\x55\x5d\x85\x0a\xce\x19\x9f\x46\x4a\x81\xba\x7b\xe1\x34\x65\x4b\x73\x63\xcf\x3b\x0b\xed\x4a\xd1\x37\x68\xa6\xb5\xd5\xb3\x46\xe3\x0c\xa5\xf9\x88\x94\xf2\xc6\xe3\xc0\xcf\xd5\xc6\xe6\x6e\xf8\xae\xbd\xc9\x28\x61\x07\x45\x6c\x8a\x2f\x63\x14\x54\x39\xf7\xa3\xf6\x71\x2a\x63\xc7\x5b\xbc\x26\x8a\x5b\x76\xb8\x32\x89\x05\xb5\x1b\x2b\xd6\xde\xf9\xda\x32\x58\x00\xe5\x4a\x7d\x43\xa5\x85\x6b\x30\x4e\x49\x97\xe2\x2c\x8e\xa6\x95\x53\x0d\x89\xb4\x82\xfa\x59\xd1\x8f\xef\x1d\xba\x00\x63\x3b\x0e\x36\xd3\x28\x89\x23\x84\x8c\x16\xfb\xf9\x3a\x2c\xc6\xa7\x0e\xf2\xa0\xa8\x4e\x0c\x4d\xf6\xf1\x1a\x61\x47\x93\xee\x07\x3d\x6d\x15\x8a\x24\x81\xf9\x9e\x2b\x7d\xc0\xc1\x64\x23\x9a\x59\x76\x68\x5e\x02\x29\x67\x67\xe5\x5e\x0e\x14\xba\x02\xdb\x1f\x60\x07\x85\x5a\xac\xc9\xb2\x15\x15\x8a\x01\x1f\xa0\x74\x58\xfc\x7d\xdd\x68\xa1\x45\x21\x57\xa0\xc0\x4a\xe3\x6d\xef\xe6\xa1\x2c\x8b\xbd\x83\x44\x67\x5d\xfe\x68\xf7\x4a\xfd\xc0\x29\x94\x41\x85\x11\x88\x99\xab\xce\x76\x9d\xdf\x9f\x10\x44\x98\x74\xb6\x97\x2e\xd1\xe2\x6a\x00\xbd\xef\xc9\xfa\xec\x75\x23\xdd\xaf\x41\x75\x0f\xee\x9c\x17\xb2\xa1\x4a\xe3\x44\x7b\x42\xd0\x01\x51\x2b\x3f\x9a\xb2\x63\x2e\xed\x76\xb1\x27\x01\x04\x7b\x90\x52\x1a\x71\x16\x1a\x5c\x94\x95\xbc\xb7\xd2\xd4\x1f\x2c\x42\x75\x46\x8c\xb9\x56\x33\xb1\x73\x4d\xcf\x1c\xa3\x67\x86\x8c\xe2\x89\x93\xc1\xdc\x99\xcd\x0a\x0e\xf9\x0e\xa5\x80\xf1\xd2\x41\xa1\x0d\x7c\xe8\x29\x01\xfc\xa4\xa7\x9e\x3d\x84\x07\x13\x69\x2c\xd0\xd9\x49\xdb\x06\xac\x6d\x8b\x52\x76\x0c\x6c\x34\xec\x10\x7e\xad\x3a\x3e\x8a\x10\x66\xbe\x2f\xd3\x10\xae\x64\x0e\x79\xc9\x72\xbd\x8f\xdb\xa1\xef\xad\x20\xdb\xfd\x03\x62\x69\xea\x87\x35\x89\xf6\x45\x7b\x59\xa0\xf9\xf0\x30\x90\x0f\xf5\x46\x4d\x36\xa5\xcd\xd0\xeb\x1a\x11\x7b\x32\x71\x8b\x8c\x37\x93\x86\x8a\x4b\x93\x27\x10\xe8\x90\xe0\x9c\x0b\xbc\x47\x13\xed\xe7\x20\xc2\xc5\xc6\xb7\xce\x74\x39\x8c\x8f\xfd\x46\x59\x68\xca\xde\xd8\x97\xe5\xf8\x24\x36\x46\x01\x9b\x0a\xf3\xb6\xee\xec\xaa\x07\xc7\x18\x76\x56\x39\xc8\xa8\x6d\xf9\x10\x4b\x6a\xed\xe1\x65\xd9\xd7\x4e\x3e\xb0\x39\xff\x05\x22\xcc\x22\xfe\x32\xc2\x65\xae\xa0\x87\xaf\x3f\xf8\x61\x77\xb8\x87\x05\x3a\x7b\x8f\x1c\xc3\xa3\xd4\x25\x70\x35\x49\xe1\x4e\xa4\x44\x3c\x30\xc1\xe4\x5d\xc7\x66\x39\x48\x73\x39\xa3\x93\xec\x11\xaf\xaa\x65\xce\x08\xed\x57\xa4\xb2\xc8\x7a\xbe\x20\x6f\x8a\x17\x99\x12\x55\x3d\x7c\x00\xb3\x24\xc2\x45\x9d\xeb\x86\x72\xec\xae\xa1\x84\x87\x60\x55\x2e\x14\x9d\x35\x39\xdc\x37\x7d\x97\x88\x81\x2d\xbc\x9e\x3c\x2c\x53\x6c\xce\xef\xf9\x61\xdf\xbe\xf9\xb5\xb6\xdc\xc5\x95\x63\x90\x1b\xca\x45\x67\x9f\xf5\x80\xc7\x85\xeb\x92\x8d\xf5\xfb\x4f\xbc\xf9\xec\xa1\xbe\x7c\xf4\x8d\x9d\x1a\xca\x84\x2f\x38\x17\xa9\x79\xf9\xe7\x17\x61\x9a\x37\xa1\x38\x8a\xbe\x4a\x8f\x64\x0d\x36\x66\xbf\x8a\xb5\x53\x45\xca\x27\x22\x5b\x28\x43\xa2\x65\xf7\x73\x1c\x63\x1a\x70\x84\xc1\xd7\xd5\x92\x06\x1c\x7b\xaa\x90\x87\x5d\x26\x48\x6f\x26\xf8\xbe\x08\x5c\x2a\xd0\x93\x98\x28\x41\x0f\x7a\x07\x40\xca\x83\x40\x4a\x77\x9c\x25\x8c\xde\xbe\xed\x41\xdf\x6b\x26\x34\x18\x85\xf2\x35\xcd\x3f\xd1\xe2\x77\xca\x6b\x25\xe4\x3d\x8a\x3b\xb7\x12\x1d\xc6\x8c\xad\xd3\x92\x69\x51\x78\x3b\x3e\x5d\x8a\x2a\xef\xc5\xcf\x25\x9a\x76\xe9\xf7\xdc\xf1\x7e\xa2\xa4\xff\xc8\xbe\x74\x2c\x75\x67\xf7\x39\xed\x59\x0a\x8d\x41\x26\xd9\x9d\x80\x36\x83\x7e\x29\x8f\xc1\x40\x5c\x7f\xc2\x75\xe2\xbd\xc1\xb0\x91\xf6\x45\x79\x51\xd5\xf9\x27\x0f\x0f\xd3\x0d\x29\x3d\xe5\xf0\x12\x98\x78\x91\x9b\xc7\xb9\xc2\x3f\xf4\xc0\x4f\x87\x47\x4e\xaf\xb5\x01\x9d\x74\x7b\xc0\x38\x10\x53\x9e\x44\x48\xbf\xaa\xa3\xc4\x6d\xad\xdd\xf3\xa3\xbd\x36\x3a\xaf\xe2\x7f\xdd\x34\x2f\xf2\x10\x16\xd3\xfd\x81\x3c\x88\x09\x37\x03\xd7\xee\xb4\x87\x98\x70\xf3\xc0\x6b\x3c\x9d\xe8\xfd\x44\xbd\xb6\x3b\x99\xf6\x1a\xa5\x04\x0c\x0e\xa0\xcb\x9c\x47\xee\xe0\x6b\x64\x99\x24\x5d\xc9\x38\x60\x87\xb0\x76\xb0\x6b\x7f\xa7\x31\x80\xa0\xd1\xc1\x95\x00\xae\xf4\x9c\xe1\x03\xe1\xe5\x48\x3d\xd4\xc9\xfc\x7f\x9a\x8c\x6f\xb2\xfc\x53\xf0\xe0\x72\x8a\x10\xbe\xd7\x1a\xbf\xb2\xe5\xd6\x1c\x95\x0c\xec\x76\xb8\xb7\x4a\x7a\xe7\x57\x6f\xb1\xb8\xbd\x74\x8e\x4a\x3a\x58\xa4\x5d\x61\xaa\x1b\x54\x94\x4d\xb6\xa8\xe8\x1b\x99\xae\x1b\x4e\xc1\x62\xb3\x6d\xe2\x37\x19\x77\x60\xec\x97\xd2\xfb\x86\x87\x1e\x6a\xac\x9c\xa7\x7b\x6d\xed\xcf\x63\xa7\xa5\x83\x09\x3e\x68\xe7\x2f\x94\x8b\xbf\x68\xa6\x04\xb0\x57\x46\xed\x90\x7b\x6d\xec\x8d\x91\xeb\xd8\x7d\x6f\xd6\xac\x0f\x6f\x6b\x6a\x96\x2c\x7c\x7f\xb4\x9c\x7a\xf1\x09\x2c\x05\xd8\xe0\xf6\x57\x83\xf3\x16\x32\x84\x72\xe0\x99\x64\x1f\xcf\x60\xce\xf2\xfb\xbd\x9e\xa9\xe8\x41\xbf\xf6\x71\xb3\x77\xa0\xd2\x83\xaf\x4f\x60\x48\x3c\x88\xe9\x29\xee\x54\x6e\x83\x4e\xe5\xe0\x21\x7e\x67\xa0\xd0\x4b\x08\x9b\x5a\xc1\x15\xaa\x64\x8f\x5e\xf3\xfa\xfa\x7d\x5d\x32\x79\xd8\xa8\x3b\x73\x8c\x03\xb0\x0c\x16\x1a\x63\x60\xe8\xf8\x04\x25\x0f\x97\x33\x05\x43\x6d\xc4\xeb\xf8\x04\x5b\x33\x62\x31\x42\x23\x42\xa7\x87\x3a\xa3\x11\x99\x74\x5d\xe2\xe0\xcf\xaa\x87\x28\x60\xbf\xbb\x03\x7f\x03\x6e\xac\x9c\xc1\x73\xf8\x75\x03\xa7\x27\x36\x0f\xc2\x07\x52\x24\x42\xd0\x0e\xa8\x95\x3f\x7b\x35\x38\x46\xb3\xbe\xd1\x77\x22\x30\xb3\x49\x80\x04\x45\x7b\x96\x5b\x8d\x99\xdf\x9e\xad\x53\x4b\x5e\xa5\x3f\x2b\x18\x03\x8b\xb7\x8f\xb5\x35\xe9\x21\x90\xb6\xe5\xa3\x83\x60\xca\x30\x44\x07\x4b\xc8\x6d\xee\xb0\x59\x3b\x78\x4d\xc0\x50\xbf\x6a\x3a\xfe\xfb\xcd\x76\x4c\xe5\x3c\xc8\x49\x63\x2e\xe9\xae\x08\x04\x65\x21\x46\x09\x30\xf5\x4c\xbd\x83\x21\x67\x12\x30\x5b\x2d\x31\x56\x9b\xd5\xb1\x73\xb0\xd0\x37\xea\x38\x57\xa5\xde\x18\x36\xac\xb9\xdc\xea\x72\x6a\xe1\xbf\xae\x79\x6e\x8b\x2b\x27\xb3\xba\xb4\x29\x20\xf3\x1f\x35\x75\x55\x16\x47\x82\x67\xac\x51\xf3\xc6\xc3\xdc\x18\x83\x33\x19\xff\x1f\x75\xef\xde\xdd\xb6\x8d\xf5\x8d\x7e\x15\x8b\xab\x2f\x1f\xa2\x82\x14\x29\x69\x3a\x33\x94\x61\xad\x34\x69\x9b\x4e\x9b\xde\x92\x5e\x32\xaa\xa6\x07\xa6\x60\x0b\x0d\x45\xaa\x24\xe4\xc4\xb5\xf8\xdd\xcf\xc2\xde\x00\x08\x90\x94\x93\x99\xf7\x59\x67\xad\xf3\x4f\x22\x83\xb8\x5f\xf7\xf5\xb7\x97\x89\x37\xb0\x2f\x24\x52\xf0\x83\x8f\xee\xa9\x7c\xdb\xb0\xab\x6e\x84\x83\x99\xdf\xfa\xb3\x61\x1e\xc5\xf7\x76\x20\x72\xa6\x88\xfe\xf2\x7b\xc8\xf0\xdf\x8a\x77\xea\x55\xf9\xd2\xd6\xe2\xe7\xf2\x99\x85\xc4\xca\xcf\xde\x33\xce\x81\x4c\x27\x06\x39\x90\x13\x47\xa8\xfc\xa0\x1f\x6e\x9c\xf7\xb5\x1e\x35\x7f\xdd\x47\x82\x5a\xc5\xe3\x9d\x45\xbb\xb3\x20\x78\x4d\x43\xff\xfa\x80\x57\x99\xdc\x9d\xca\x17\x3c\x88\xbd\x6c\xbd\x2b\x09\x2f\x91\x3f\x2b\x76\x87\x84\x6c\xfa\x25\x06\xd1\x4c\xff\xaa\xbc\xbb\xe4\x97\x8e\xc5\x74\x7b\x76\x06\xd8\x65\x38\x52\xd0\x50\x72\x82\x55\xe6\x9b\x8d\x89\x03\x32\xa4\xcc\xbc\xb7\x08\x19\xae\x12\x1e\xaa\x3f\xab\x95\x67\x8b\x6b\xbf\x01\xc6\xd5\x3a\x00\x3e\xe8\xb5\xd9\x89\x94\x34\xd4\x04\x2e\x33\xf0\x3f\x8a\x46\xbb\xf2\x50\x8b\x4d\xf9\xb6\x08\x58\xa0\x9e\x42\xf7\x3f\xd2\x39\x1b\x5b\x84\x86\xce\x80\x41\xea\x47\xee\xf0\xbd\xec\x6c\xdc\x8e\xa6\x6d\x1f\x5e\x5e\x9f\xcf\xd2\x2f\x26\x8a\x6a\x48\x6a\x24\x64\x0d\x1d\x10\x81\x74\xd6\x64\x48\x41\x7f\xff\x9a\x00\x5f\xfd\xba\x62\xb3\x76\xc7\x7c\x64\x76\x0c\x48\x28\xd9\x5d\xb6\x4b\x05\xf5\xdc\x58\xd2\xd1\x1c\xa1\x01\x0d\x6f\xef\x8b\x39\xa8\x87\xd6\xad\xf3\xe1\xd9\xf9\x4a\xcf\x51\x3a\xa3\xea\x56\x3f\x10\x3a\x1d\xcd\xfc\xbf\xbb\xfc\xa3\x46\x7b\x20\x94\xdd\x3e\xc9\x94\xbc\x91\xea\xf6\x39\x04\x43\xa9\x06\xbf\x3d\xe5\x79\x2e\x36\xe9\x8c\x3a\xd3\x7a\xaf\x5b\xd8\xdc\x0b\xd4\xf1\x41\x3f\x3d\x89\xbe\xae\xcb\x53\x9a\xf8\x7f\x7e\x5f\x9a\xb6\x60\x1d\x75\x41\xb9\x49\xc7\xe3\xd7\x15\xdd\xf1\xea\x0d\x44\xe4\xc4\x0c\xde\x92\x09\x72\x97\x15\xcb\xac\x98\x96\xfb\xda\x06\x36\x4d\xc5\xb4\x7c\x5b\xd4\x5f\x56\xe5\x61\xcf\xb2\x82\xdd\x95\xfb\x3a\x5d\x89\x35\xed\x05\xe9\x5c\xad\x01\x4d\x16\xa6\xd8\x07\x8f\xea\x8b\x8e\x17\x2a\x8e\x87\xd0\xce\xbd\xa6\x40\xbf\x46\x54\x75\x7b\x37\x1a\x62\x94\xbb\x8d\x03\x78\xdb\xa6\x44\x7c\xe6\xa2\x75\xd1\x28\xc6\x63\xa2\x56\xc5\x1a\x83\x8d\x76\xa3\x1c\x21\x54\xa3\x1e\x6c\xdf\xa3\x03\xd2\x57\xd5\x1a\xad\xde\x87\x17\x13\x11\x2b\xbb\x5f\x71\x39\xcf\x4f\x15\xb2\x6d\x91\x53\x19\x56\xc3\x15\x8e\xc7\xde\x28\xa8\x9c\x66\x3b\xd2\x34\x6f\xb7\x32\x17\x49\x3b\x60\xd2\x24\x05\x69\xae\x64\xc1\xf3\xfc\xf6\xce\xc6\x6e\xf5\x67\xb0\xab\xd3\xf5\x46\x8f\xf0\x8e\x7a\xd8\x6a\x3d\xcd\x76\xe6\xb0\x80\x6f\xcd\x68\xb8\x0a\xc8\x0d\x73\xdf\x99\xf3\x1f\xaa\x44\x4f\x7b\x77\xb2\x03\xd7\x99\xaf\x2b\xc4\xce\x5b\x74\xc3\xa0\x7a\xb1\x0b\x7e\xd5\x79\xe4\xda\x0f\xef\x3a\x5b\xf0\x36\x0f\xd7\x5d\x96\x89\x5a\xf1\xb5\x8f\x8b\x34\x5b\xe4\x6d\x9e\x5c\xef\x01\x9d\x27\x5f\x93\x26\x11\x38\x45\x4d\xe2\x6b\x6e\x7e\x08\xf7\xe8\x0e\x84\xa1\xd6\xce\x6d\xc0\x8f\xb9\x35\x82\x1b\x29\xef\x0a\x7a\x9a\xcb\xfd\x5e\x5f\xb4\x9e\x34\xd2\x13\xa5\x62\x40\xc1\x40\x40\xc3\x86\x73\x4e\x4e\x88\x33\xd5\x10\x89\x66\xa8\x07\x94\x46\xa2\xe0\x21\xa0\x00\x51\xbf\x62\x48\xb8\x49\xb7\x07\x43\x25\x90\xe8\x03\x3a\x13\x7b\x19\xd6\xdd\x1d\x2f\x98\x1c\x10\x94\xea\x07\xd7\x55\x1c\xbf\x56\x98\xbc\x3b\xd4\xca\x04\x3c\x10\xbe\xff\xe0\xf1\x28\xfc\x68\x08\x56\x81\x25\x5a\xae\x58\xe7\xf0\xee\x34\x34\xf4\x6a\xff\x6e\x15\xed\xe7\x85\xe7\x18\x18\xe6\x31\x7a\xf7\x0b\x56\x58\x67\xc1\xe3\xb1\xe8\xd8\x4d\xe8\x45\x1b\xb4\xba\x71\xd4\x92\x3f\x8a\x38\xd6\x2f\x7c\x2d\xe1\x71\xf6\x93\x41\x95\xe3\x75\x9f\xa2\xea\x3f\x0d\x3a\xd4\xd0\x60\xd4\xde\x46\xfc\xda\xbc\x53\xd8\xe4\xe6\x99\xa1\xdf\xc2\x36\x32\x99\xc0\x26\xb5\xd9\xbc\xf2\xbf\xde\xb7\x91\xbb\xd5\x02\x5b\x03\xcb\x73\xc9\x2b\x8b\xcf\xfa\x07\x24\xf5\x67\x67\x34\x3c\x3d\xb0\x1e\x7c\xf3\xc7\xa1\xc6\xad\xf2\xaa\x64\x5f\xc1\xdb\x6f\x2b\x68\x7f\xf9\xd6\xb4\x68\x92\x3d\x7e\x44\xd5\x80\x31\x0d\xeb\xd4\x18\x74\xd0\x17\x93\xb5\xf2\xb3\x62\xf8\xbc\x14\x3d\x07\x90\x71\xa7\xee\xf1\x37\x9a\x04\xf3\xc2\x34\x59\xa6\x0a\x76\x2d\x7f\xf7\x72\x50\x55\xfd\xfe\x7a\x27\xef\x74\xbd\xa8\x46\x0b\x67\x1d\x36\x67\xe7\xa1\x47\x15\x91\x71\xea\xdb\x38\xaf\x3e\x56\x7c\x88\xbb\x9f\x90\xe1\x9a\x2f\xec\x19\x0a\x3a\x04\x97\x4f\x88\x56\xd9\x91\x56\x77\x67\xc6\x04\x23\x0b\x26\xe1\x5c\x75\x14\x59\x71\xfc\xac\x4a\x94\xa7\x69\xbb\x4f\x59\xd5\xad\x8d\x98\x98\x78\xa7\x2c\x99\xe6\xad\x84\x00\xa8\x18\xcd\x7a\xc1\x0f\xc6\xbe\x4a\xbe\xd5\xf3\xbb\x18\x98\x35\x7d\x92\xef\xf7\xa5\xec\x15\xa1\xc5\xa9\x85\x6a\x89\xc2\x11\x53\x1e\x55\x48\xe2\xf8\xb3\x0a\x4e\x7f\xbb\x35\xdb\xfb\xaf\x3d\x61\x7b\x39\x90\xa9\xbb\xfc\x71\xfc\x06\x4e\x9d\xea\x12\xec\xb6\x3e\xa0\x36\xfb\xe3\x42\xb3\x50\x31\x45\x22\x14\x74\xc6\xbf\x57\x70\x37\x78\xdb\x43\xc9\xd3\x57\x02\xad\x70\x50\x03\x57\xc3\x01\x3b\x6e\x6e\x18\x6b\x28\x30\x7d\xbb\x15\x22\x07\x9c\xec\x5f\x0d\xfc\x41\xe7\xb6\x0e\x93\xbe\x81\xd0\x11\xc1\xe5\x87\x68\x6d\x5e\x3d\x41\xad\xaf\x8d\xa7\x77\xaf\xe6\x38\xfe\x02\xe7\xdb\xbb\x5a\xf1\x12\x35\x11\xf9\x68\xbf\x65\xb3\x39\xfd\x24\x3a\x9a\x51\x04\x63\x0e\x1e\x95\x7e\xa4\x8a\x1d\xd8\xbe\x62\x26\xb4\xe0\xf8\xaa\x50\xe5\xcf\x52\xbc\x8d\xc8\x09\x09\xce\x7d\xd0\x33\x54\x22\x29\xc6\xf5\x68\x0d\x97\x57\xbe\x2d\x44\x65\xbd\xdd\x9c\x0d\xd2\xb8\x42\x3b\xaa\xa5\x64\xa3\x99\x33\x21\xc2\xd4\x8b\x84\x07\x40\xc8\xb2\x28\x84\x91\xe6\x1c\x8f\xbc\x8b\x83\x1c\xda\x7d\x01\x54\xfc\x68\xee\x10\xe1\xe3\x78\x74\x63\xdd\x8d\x5a\x37\xc5\xc3\xc3\xd9\xec\x32\xea\x05\x71\x77\xde\x69\xf7\x38\x91\x19\x57\x34\x1c\xc5\xa4\xf0\x9c\xda\x27\x01\x04\xe8\x7b\xbd\xd1\x3c\x4f\xb4\xd0\xca\xcb\x68\x5c\x3d\x19\xd6\x7b\xeb\xb2\xce\x74\xca\xb9\x48\x7a\x5e\x72\xee\x46\x7f\x48\x43\x23\x27\x62\x22\xf3\x2d\x86\xf0\x79\x7d\xcf\x89\x9c\x50\x6b\x93\x64\xb7\x47\x22\xbb\x50\xdf\x58\xcc\x97\x9a\xe6\xa4\xd1\x14\x28\x3d\x11\xc5\x66\xe1\xdc\xa0\x00\x88\xc4\xf7\xe9\x0d\xdf\x5e\x65\xb1\x4c\x5a\x50\x58\x8b\x75\xbb\xac\x54\x62\x83\x8f\x4e\xb3\xed\x78\xee\xb9\x16\x29\xaa\x00\x1a\xd7\xcb\x33\x50\x81\xce\x31\x99\xa7\x80\xa1\xeb\xfc\x8a\x54\x97\x14\x7f\x0c\x34\xb8\xd9\x47\xa3\x39\x2d\x8d\x63\x32\xa1\x35\xd8\x5a\x8e\x98\x5a\xfe\x13\x03\x66\xa5\x25\xcd\xd0\x92\x47\xb2\x8e\x2d\x8f\x41\xd6\xa9\x87\x6c\x79\x00\x62\x87\xd6\x27\x6c\x79\x3a\x25\xbb\x96\x3c\xa5\xb5\xe4\xa9\x7d\x4b\x1e\xb0\xb1\x0e\xec\x56\xc0\xa8\x2e\x7c\xda\x5a\xe4\x88\xcc\xbf\x86\x12\x90\x5d\x78\x49\xc6\xdf\x6e\xc8\xce\xe7\x40\x2e\xe6\xe0\xe5\x34\x9a\xb9\x50\x0c\xe1\xeb\x99\x3c\xf3\x6b\xc3\x47\xf1\xb4\x49\xc9\x26\xa8\x6f\x94\x13\x3f\xc6\xc1\x99\xd4\x5b\xea\xa0\x00\x0a\xb9\x4b\x22\x93\xa1\x0f\xaa\xec\x5c\x84\xce\x16\xcb\x59\x6e\xee\xf8\xed\xa5\x78\x0e\xea\x05\x13\x83\x9b\x72\x9b\xfc\x53\xb1\xf5\x3f\x00\xa7\xdc\x43\xa8\xf2\x62\xcd\xca\x55\xbe\x86\xdd\x66\x39\xce\xe3\xf1\x56\x24\x3a\x95\x46\x5b\xb9\x11\x18\x3c\xbb\x0d\xd2\x8c\x88\x00\xbc\xad\xa2\x24\x7c\x55\x86\x55\xc4\xf1\xad\x48\x74\x2a\x8d\x0e\x85\xa9\xc4\xbb\x61\x3d\x33\x63\xc0\x15\xf1\x6d\x3b\x4f\x9b\x17\x81\x91\xa0\x13\xe7\x40\x13\x8a\x46\x06\xc7\x21\xa2\x2a\xf8\xdc\xbe\xfa\xed\x7b\x3d\xbd\x92\x85\xac\xb7\x89\x0f\x0c\x2b\xdd\xdb\x62\x65\x24\x16\x9e\x3c\x21\x8b\x8f\x10\x37\xab\xba\xbd\x6b\x13\x1d\x1b\x0f\x12\x14\xcf\xf0\xaf\x92\x81\x1b\xb6\x6f\xf4\xd0\xaf\x5c\x5f\x57\xf9\x6d\x22\x28\xaf\xae\xe1\x71\xa8\x87\x5a\x1b\xc8\xd5\x6d\xde\xc3\xfd\x94\x1e\x34\x5b\xd8\x3a\x2a\x7e\xfd\x0e\x08\x53\xb5\xfe\xd2\xe9\x83\x4e\x0a\xba\x71\x22\xaf\xdf\x13\x28\xe3\x77\x86\x9f\xe8\x0c\x12\x3c\xc6\x94\x06\xa3\xac\x1d\x8f\xea\xc3\xfb\xf6\x1f\x77\x2c\xe8\x55\x2e\xad\xbf\x0d\x90\x8c\xf2\x7a\x9b\x03\xdf\x5e\x95\x85\x92\xa2\xea\x85\x38\xd4\x5b\x07\x69\x3f\x97\x17\x54\x79\x8a\x7e\x91\x94\x92\x06\xbe\x3c\xa5\xec\xe0\xae\x21\xd8\x85\xea\x37\xd3\x87\xbc\x70\xa4\xcb\x58\xf3\xaf\xcf\xb8\x12\xe3\xf6\x6d\x79\x5b\x56\x6f\x5e\xc9\x9d\xa0\x15\xbb\x06\x64\xed\x7e\x8d\x9a\x8e\x59\xad\x2d\xc0\x5b\xe5\x63\x8c\x01\xf1\x8f\xa0\x33\x28\x4d\xa0\xdd\xc6\xc7\x8f\x67\x33\xd2\xbe\x79\x1c\xb1\x63\x06\xc1\x39\x5a\xe8\xa8\x1c\xe2\xb6\xdd\xe6\xa2\xa6\x25\xe3\x3e\x0f\x79\xd1\xf6\x7c\xc7\xdf\x3d\xb7\x5d\x45\xd7\x89\xe5\x4f\x22\x51\xd3\x5d\xb9\x11\xb4\xc2\x99\x25\x46\x3e\xca\xae\x14\xe0\xb1\x55\x9a\x0e\x5c\x94\x78\x2d\xe8\x0c\xac\x24\xd4\xb6\xc5\x6a\xf3\xc3\x60\x61\x9b\x74\x90\x2f\x8b\x9a\x1e\x98\x89\x77\x2d\xea\xc5\x61\x19\x7e\x64\x87\x34\x03\xf4\xf1\x20\x31\x14\x3d\x6e\xd8\x28\x3f\x1e\x2d\x90\xcd\xc8\x0d\xd1\xdd\x8b\xd9\x88\x1d\xe2\x38\x19\x65\xc7\xe3\xe8\x70\x3c\x66\x36\x6e\xf9\x88\x1d\xec\x4f\x9d\xea\x02\x95\xeb\x74\x2f\x6a\xf9\x96\xcd\x16\xa3\x4d\x1c\x6f\x5d\x28\xbf\xc5\x78\xbc\x25\x1b\x96\xaf\xb6\xeb\xb6\xb9\xd5\x76\xbd\xd8\xc4\xb1\x44\x59\x6f\x65\x5c\x63\x38\x4e\xc7\x13\xfd\xe2\xb3\x6a\x5a\xf3\x1b\x91\x10\x5a\x01\x08\x25\xfa\x1c\x20\x74\x4f\xb0\x18\xe7\xec\xbe\xd5\x88\xe3\x5b\x98\x74\x84\x13\xae\x7a\x6d\xe8\x86\xff\xcf\x63\xc6\x66\x4b\xdb\x1e\x2e\x96\xdf\xa8\xde\xe5\x6e\xd7\xba\x18\xa6\x78\xd2\xc2\x3d\xfc\x4c\x00\x48\xc4\x68\x06\x7a\x8b\xde\x1e\x36\xed\x51\xdc\x1e\x2e\xd5\x33\xfe\xf5\xd3\xa9\x9d\x16\xe9\x5e\x1c\xb8\xca\xbd\xab\x26\x14\xa9\x4a\x5f\x9c\x0a\xe0\x59\x12\xc0\x4a\xf5\xd0\x23\xd2\x10\x34\xfb\xab\x65\xcf\x4a\xa1\x03\x90\xb1\x40\xd5\xba\x14\x6f\xf7\x65\xa5\x98\xb1\xf3\x00\xad\x7f\x2e\xd8\xbf\x2a\x1b\xf1\x40\x93\x5a\x68\x24\xb2\x91\xaa\xac\xbe\xaa\xf1\xb5\x66\xa3\xaa\xf3\x0c\x1a\x11\xa2\xce\x6a\x3e\x38\x3d\xf0\xa0\x05\xa6\x9f\xd3\xea\x99\x87\x6c\x28\x21\x5f\x99\x5b\xd6\x11\xb3\x82\x4b\x01\x7e\x02\x26\x8d\x15\xd6\x9a\x63\x57\xb3\xba\x72\x1f\x31\x50\x34\x5b\xad\x3d\xf5\x5e\x26\x4f\xa9\xc9\xdd\x75\xa7\x3a\xa3\xb5\xbb\x01\xa0\xb9\x28\x22\x7c\x8f\x14\x36\xad\xf9\x66\x33\x6d\x06\xf7\xb8\xf0\xc3\xcd\xba\x6f\xaa\x3c\x77\x02\x42\x07\xed\x57\x0c\x41\xfb\x0d\x24\x7a\xb2\xc5\x38\x2e\xa6\x95\x28\x36\xa2\x12\x1b\xcd\x10\x30\xf3\x09\x40\x0e\x00\x65\xca\x86\xbc\x9e\x2f\x6e\xf4\x5d\x1e\xc7\xc9\xb5\x71\x5f\x6e\xa7\xa7\x8d\x1c\xef\x87\x09\xa0\xdc\xdf\xa7\xfe\xa8\x26\xed\x19\xb0\x7b\x06\x3d\x06\x68\x65\xc1\x0f\xf3\xd6\x49\x45\x52\x7f\xdc\xe3\x53\x65\x35\x2d\x65\xa7\xea\x9c\xc7\x31\x9f\x78\x7f\x3f\x44\x47\x7f\x0f\x80\x05\x81\xce\x0a\x0f\x40\x89\xda\x59\xb9\xc8\xf5\xb4\xe0\xef\x49\x8e\x65\x83\xfe\xb8\xe9\x23\xf4\x77\x00\x2c\x65\x0e\x05\x8c\xeb\xae\x3b\x04\xc3\xdc\x45\xfd\xe0\x23\xe6\xcb\x7c\xf3\x91\x5b\x03\xbd\x44\x39\xaf\x01\x1a\xa8\x95\xde\x04\xbb\xde\xcf\xf2\x0b\xc6\x57\x55\x61\x90\xfe\x93\x21\x5d\xed\x01\x9d\x31\x03\x36\xe7\xae\x6d\x0f\x8f\xee\x78\x2c\xce\x59\x8b\x55\xb7\x4c\xf0\x37\xab\x6d\x75\xb4\xfd\xc8\x14\x49\x93\xf6\xcf\x0b\xb5\x0c\x33\xb7\x9f\x1c\x4e\x20\x26\x91\xb4\xfd\x74\x8e\x14\x2e\x94\xab\x7c\x14\x41\x03\x19\x47\xc2\x16\xa9\xed\xe8\x79\xb1\x0c\x4b\xf9\x38\x85\x36\x13\x2d\x88\x6d\xeb\x55\x79\x51\x9c\x68\x69\x46\xa1\xad\x82\xb4\x8d\xbd\x2a\x59\xd1\x10\x03\x80\x4a\x7d\xa1\x00\x43\x5f\x35\x03\xf4\xe6\xef\x19\xcf\xb5\x11\xa2\xb9\xb7\x80\x46\x7e\x79\x90\x4f\x9a\xe7\x19\x4e\x15\x9c\xf9\xd2\x46\x45\x6d\x4f\xff\xa9\xd3\xf8\xdf\x9f\x70\xef\xfc\x82\xfb\x56\x27\x08\xa9\xef\xe4\xdf\x43\x9f\x55\x20\xba\x14\x26\xe8\x86\x3a\x1e\x47\x9f\x77\x82\xa1\x3d\x93\x37\x7a\xb9\xba\x05\x0b\x76\xc7\x33\x25\x6f\xc4\xe7\xb9\x4a\x15\x44\x1a\x6f\x83\xc6\x3b\x49\xa6\xdd\xa5\x3f\x26\x82\x04\x1f\x12\xb2\xa8\xa6\xbc\xc8\xb6\x65\xf5\x6d\xb9\x11\x71\x8c\x20\x8b\xc5\x26\x8e\x87\x3a\xe0\xe7\x45\x89\x5d\xfb\x37\xf3\x3f\x52\xfb\xc5\xac\x6a\x15\xfc\x49\x0b\x14\x66\x9a\x62\xee\xb7\x4d\x77\x85\xbc\xbf\x48\x8b\x91\xa7\x57\xd5\x22\xd0\x5e\x7c\x02\xdd\xb0\xee\xd6\x1d\x03\x97\xa2\x2c\x44\x44\xe8\x7b\x8e\x6c\x2f\x70\xa9\x59\x5b\x00\xb6\xb3\x43\xd7\x14\x67\x6b\x22\xdb\x3e\x4b\x65\x1b\xa4\x42\xf9\x88\xdc\xb6\x87\x35\x60\xb5\x78\x91\xe3\x30\x6a\xff\x2f\x5b\x21\xf2\x57\xbc\xba\x16\x8a\x31\xb5\xec\xd9\x2e\x43\xcf\x53\xe5\x07\x2d\x0d\x0c\xec\x08\x6d\xe3\x8c\x66\xe6\xbc\xd1\x83\x77\xb5\xd0\x0d\x9b\x2d\x36\xe7\x99\xa5\x3b\x36\x56\x1e\xb3\x65\xd9\x6a\x83\x50\x78\x5b\xeb\x29\x0e\x08\x2a\x05\x6c\x80\x6d\xd7\x49\x97\x31\x6e\x22\x1c\xe7\x23\x86\x5f\x17\x24\x67\x65\x92\xe3\x8d\xbb\x87\xf0\x1a\xd6\xa3\x4c\x9d\x6b\x12\x75\xeb\x4d\xe3\x62\xeb\xc5\x3e\xff\x2b\x71\x7f\xd1\x08\x4d\x93\x22\x72\x31\x99\x43\x88\xd8\xd1\x9c\x50\x08\x8e\xbe\xa5\x07\x7d\x5d\xd0\x7d\x1c\x27\x2f\x12\xbf\x32\x42\xfd\xbf\x3e\x08\xe1\xbe\x50\x6d\x20\x13\x7a\x80\x4b\x28\x37\xe3\xf0\xd7\xcb\xf7\x6d\x7f\xda\x76\x62\xc1\x43\xb3\x9b\x2b\x9a\x93\xe6\x30\x66\x5b\x78\x78\x11\x98\x32\xb7\xf3\xd1\xe8\x6b\xae\x7f\x47\x98\x17\x9c\xd0\xf7\xec\xd6\x48\x5f\x85\xc1\xad\x84\x77\x0b\xed\xde\x24\x7a\x3f\xb9\x53\x1f\xfc\x31\x62\x5f\x25\xde\x9f\xa1\x30\x19\xf5\x49\xed\x47\x8b\x2b\x32\x7a\xf0\xef\xe4\xab\x6f\xbf\xff\xe9\xd5\xf1\xd5\xe7\xbf\xbe\x7a\xf2\xe3\xe7\x4f\xc8\x47\x0e\x4a\xaf\xcd\xae\x67\x0c\xf0\xf3\xa0\x45\xef\xce\xf8\xbc\x9d\xfb\xcb\x72\x73\x4b\x45\x78\x4b\xf4\x3f\xbb\x03\x4f\x48\xcb\xb2\x9e\xe8\x34\x2a\x26\x3c\xe9\x76\x78\x7d\x81\xae\x02\x57\xfc\x47\xbd\xad\xe0\x42\xab\x85\xfa\x1c\xdc\x92\xbc\x0b\x49\x04\x37\x90\x7e\x88\x6c\x9c\xcf\x04\xc4\xdf\xe6\x78\x3d\xc9\x73\xa8\x47\xcf\x4b\x31\xe5\x9b\x0d\xd6\x5a\xe9\xbf\xf0\x66\x4c\xbc\xfe\xdb\xb1\xd8\x2b\xaa\x49\x0e\x84\xbe\x48\x8a\x16\x06\x06\xff\x74\xaa\x1d\x48\x69\x5d\x6a\x03\x55\x7d\xd1\x55\xc0\x19\x42\x7c\x46\x4b\xdc\x35\x01\xe9\xd2\xa5\x5c\x68\x87\x70\xe9\xd0\x2d\xe8\x30\xf8\xc9\x0c\x24\x8e\x03\x50\xd3\x88\x12\xe9\xc1\xcc\x1e\x0c\xb9\xdd\x42\x72\x2b\x47\x06\xd2\x8a\x8d\x66\x8b\x45\xa5\x4f\xec\x1d\xe2\x5f\x9f\x94\x45\x77\x79\x80\x11\x32\x01\xa4\x02\xd5\xa3\xc7\xb8\xb4\xd7\xb1\x45\x79\xf5\xa0\xab\x03\x87\x7f\x90\x6d\xdf\x05\xd2\xe0\xd3\x1e\x68\x13\xf4\x0e\x37\x71\xe4\x09\x7d\x4f\x9b\xb4\xcb\x15\xf4\x25\x10\x5d\xee\xa0\x27\x4d\xc1\x28\xe8\x00\xc5\x81\x93\x68\x52\xbe\x71\x3e\xc0\x12\x4d\x9d\x17\x00\xf2\x4a\xc1\x08\x5a\x12\xba\x97\xf8\xbf\xa1\x51\xd8\x68\xde\xa8\x69\x2d\xaf\x0b\x9e\x27\x82\x46\xb8\x68\x11\x15\x81\x17\xa6\xed\x95\x6f\xb9\x5c\x09\xbd\x4a\x78\x87\x58\xcb\x87\xb0\x8f\xa7\x72\x03\xa3\x92\xf8\xad\xda\x35\x47\xa5\x64\x44\xbb\x02\x1c\x78\x6b\x7a\x53\x40\x4f\x77\x66\x08\x4f\xf8\x54\x67\xfa\x73\xeb\x21\x0f\x06\xfc\xa0\x31\xbc\x00\x43\x70\x79\x95\xc0\xc4\x17\x84\xdc\xa1\x89\xf6\x01\xff\x34\x9e\x73\xbd\xb9\xaf\xcc\xdc\xc3\x29\x77\x42\x5a\x2f\xf6\x80\x34\xb8\x4a\x3d\xfb\x19\xf4\x24\x19\xf2\x90\x44\x45\xf9\x46\xbf\x24\xe6\xa1\x33\x6a\x5d\xbd\x80\x1e\x6e\x7e\x2b\x12\x1c\xd6\xc2\xbb\xd3\xee\x5c\x0e\xad\x0a\xde\x16\x18\x30\xfe\x51\x28\xca\x3e\x55\x62\xf0\xfa\xf1\xf3\x0f\xd8\xab\x8f\x5b\x6b\x1f\x0f\x9a\x51\x9e\xf2\x19\xb5\xe8\xd3\x6a\xca\x73\x79\x5d\xfc\x82\x38\x20\xc7\xe3\x50\x48\x93\x13\xb6\xd3\x5e\x20\x6d\x06\xc1\x46\x26\x3d\x8f\x4f\x63\x63\x11\xea\x43\x82\x78\x2a\xbe\x90\x83\x33\xf4\xd5\xa2\xa8\x85\x28\x82\xf8\x18\x57\xc9\xa8\x80\x10\x18\x06\x3b\x67\xb0\x4b\xfa\xe6\xd1\x99\xae\x07\xfe\xf2\x5d\xbe\x38\xa1\xde\x97\xcf\x78\xf6\xe6\x1a\x3c\x65\xc3\x12\x6d\x7a\x58\xd6\x72\xb2\x90\x15\xa6\x8f\x5f\xe6\x88\xad\xed\xb4\x20\x88\x1b\x54\xfa\x90\x41\x25\xa0\x70\x7b\x15\x35\xa7\xc6\xa0\x3a\x3b\x00\x41\x63\xc7\x12\x8d\xc6\xbd\x8d\x0f\x82\x08\x44\xae\x1c\x22\x90\x43\x8e\xa7\x8d\xf7\x11\x90\x5c\xa1\xf8\x77\x32\x27\xbe\x3f\x04\x68\xd3\x9c\xc0\xb3\x0a\x62\x20\x5b\x9b\xcb\xca\xc5\x96\x1e\xc2\x51\x6d\x1d\x54\x49\x3f\xf6\x4f\x01\xfd\xf4\xd1\x74\x71\xe0\x13\x91\x43\x18\x74\xce\xa4\xef\xf7\xe6\x6f\x96\x9c\xc9\xc0\xf6\x8e\x5b\x82\x1e\x3b\xf9\xa5\xbf\xe6\xc6\x53\x2e\xa2\x6e\x00\x5f\x15\x85\x15\x8f\x39\x49\x08\xa7\x41\x51\xbf\xf2\x9c\x8c\xe7\x6d\x61\x2b\x56\xeb\xd5\x35\xce\x69\x38\x45\x43\x99\x96\x76\x3e\xd3\xc9\x9c\x9e\xec\x6c\xd8\x18\x1e\x0b\x7d\xcd\xb5\x68\xba\x23\x1b\xf9\x6d\xe4\x45\x70\xba\xee\x51\x05\xab\xb5\xa6\x06\xe6\x14\xcd\x34\x85\x6f\xa6\x69\xc3\xe1\xae\xe4\x9a\xe6\x68\x31\x2a\xaf\x92\xa8\x56\x95\x2c\xae\xa3\x11\x53\xb7\x7b\x51\x5e\x9d\x71\x10\xfa\x18\xe9\x33\xe5\x10\x76\xc8\x42\x35\x9f\x58\xd1\x3a\x02\xae\x04\x78\x65\x92\x95\x85\x92\xc5\x41\x68\x7a\x64\xd6\x14\x28\xb6\xbe\x73\x75\xa4\x9c\x42\xcd\x69\xde\x38\x1e\x52\xc5\xf1\xa8\x8a\xe3\x7e\xde\x53\xcd\x99\x2a\xc0\x32\x9a\xf8\x21\x86\x6f\x83\x1b\xd0\x1c\x2b\x70\x03\xf2\x82\x2f\x2d\x5e\xa0\x41\x5d\xbb\x16\x2c\x08\x77\xd2\x89\x6e\x32\x1e\x3b\x84\x8b\x62\x55\xad\x61\x97\xba\x2e\xc2\xc6\xc4\xa9\x2a\x99\xfa\x30\x68\x61\xec\xca\x59\x34\xd6\x77\x4b\x1e\xc7\x89\x45\x7c\xce\xea\x5a\xf3\x49\x2c\xbf\x77\xa2\x81\x6d\xf0\xfa\x5e\x3a\xc4\x68\x03\x88\x2d\x82\xcd\x74\x3c\xce\x8d\xef\x69\xd3\x65\x6b\x0b\x17\xd5\x30\x4a\x91\xc5\x85\x4d\xe7\xbd\x87\x3b\x98\xcf\xdb\x60\x27\x5e\xc1\x4b\x7d\x15\x66\xbc\x94\x26\x50\x9e\x8b\xfb\xaa\xb6\xb2\x46\xf1\x38\xd8\x41\xb1\x8a\xf2\xae\x67\x04\x3b\x8d\xbe\x6c\x33\x4e\xae\x20\x67\x44\xfa\xa5\x3f\xcc\xd9\x81\xf2\xc0\xe7\xe6\x74\x93\xe6\x2a\xf2\xda\x0b\x7d\x75\x3e\xb0\x31\xc3\x4c\xb2\x7f\x9d\x6a\x27\x2b\x37\x98\xd3\xe7\x42\xd8\x80\x5f\x7f\x6b\xd8\x53\x89\x1c\xcc\x81\x17\x67\x7f\x4d\x30\x36\xc2\xd9\x1c\xaa\x70\x7c\xcd\xe9\x61\x99\xb8\x01\x90\xdd\x5c\xdc\xa7\x33\x9b\x0c\x6e\x20\x2f\xfe\xd3\x02\x60\x45\xe3\xc6\xbe\x72\x4d\x86\xf5\x75\x06\xef\x0f\xa4\x9d\xc1\xf5\x3d\xd3\x50\x1e\x94\xce\x95\x9e\xa1\x44\xc9\x08\x18\xbd\x66\x5d\x5f\xfa\x8f\x50\x1d\x91\x05\x47\xa1\x65\x0b\xab\x90\x9d\x6e\x0d\xd7\x4a\x53\x81\x6d\x76\x53\x3e\xac\x1c\xf2\xb4\xb9\xf1\xd9\x40\x7b\xb2\x80\x28\xbc\x7f\xad\x5b\x88\x71\x6b\x61\xf5\x78\xe6\xd9\x43\xcd\xc1\xe4\xc9\x6d\xce\xfa\x7d\xfb\xb9\x76\x4b\xe3\xdd\x74\xee\x2c\x85\x63\x82\x6e\x77\x3a\xdb\xb6\xb4\x1e\x38\xa0\xde\xb1\xec\x1d\x11\x8b\x27\x11\xd1\x68\x82\xbb\xd5\x30\xc0\x41\x93\xe1\x91\xee\x1c\x3a\xaf\xf2\xa0\xf5\x88\xd0\x43\x1c\x6f\x2e\xd8\x7c\xf6\x18\xb4\xb8\x56\xe3\x65\xae\xd1\x5c\xee\xbf\xe7\x9a\x04\x90\x45\x2d\x54\x32\xdb\xbf\x23\x7e\x07\xba\x1d\xad\x78\x51\xe7\xc0\xcb\x45\x45\x19\x91\x16\x4e\x82\x77\x08\xb3\xbf\x1c\x40\x86\x3f\xea\xbe\xdb\xe7\x8c\xd0\x51\x1d\xc7\x23\xcd\x28\xef\x08\xea\x99\x6d\x76\xc0\x53\xd5\x04\x24\x78\xda\x0b\x94\x01\xb5\xaf\xc6\x32\x24\xab\x5c\x9f\x49\x2a\xbc\x3f\xf4\x60\xbc\xe0\x4b\x46\x86\x6f\x48\x3b\xca\xfb\x4c\x1e\xef\x72\x72\x6d\x5e\x1b\xe8\x86\x77\x64\x5d\xb8\x4f\x06\x63\xfc\x98\x52\x36\x18\x8e\xde\x60\xa1\x30\x84\x77\x84\x1f\x3a\xcb\x09\x21\x07\xef\x3a\x5b\x70\xcf\xf9\x95\xb7\xee\xb3\x33\xff\x01\x68\x9d\x1a\xe6\x66\x77\x3b\x3a\x8d\x0f\xd0\x7c\x3c\xa4\xd2\x4c\xbb\x3e\x27\x84\x15\x75\xe3\x47\xf2\x7e\x44\x4d\x9b\xf4\x3d\xae\xf7\x73\x5b\x99\x05\x7e\x0c\xff\x34\x08\x91\xb3\x36\xa5\x35\x9b\xd6\xfb\x71\x2b\x44\xfe\xec\x57\x66\x7f\xbd\xb6\xbf\x8c\xcd\x2d\xef\xd9\xdc\xea\x49\x30\x68\xaa\x78\x89\x86\xc0\xb6\x6e\x68\x20\xbc\x7b\x55\x1e\x32\x77\x03\x79\xf4\x0f\xbb\x96\x89\x74\xc4\x91\x0c\x58\x08\x7a\x2b\x13\x4e\x68\x35\x95\x85\x54\x09\x27\x4d\x2d\x7d\x8f\x51\x90\x43\xb0\xd0\x10\xf7\x29\x46\x07\xb4\x28\x08\xa0\x2b\x46\x4a\xce\x33\xc2\xa1\x41\x3d\xc8\xd4\xb3\x01\xf5\xbc\x60\xb3\x85\x38\xf7\x6b\x32\x54\x98\x18\x8f\xc9\xad\x35\xf1\xc1\x68\x03\x6d\xa6\x95\x58\x1b\xd7\xf6\xa7\x92\xcd\xe8\x13\x69\x08\x3a\x17\x13\x23\x20\x0b\x71\xb2\x45\xae\xf8\xaf\x40\x1a\xb6\x7f\xbf\xf6\x63\xf5\x43\x48\x1e\x31\xdd\x08\xc5\x65\x0e\x42\xd6\x77\xb2\x66\x4c\x4c\x9f\x7f\xf7\xe3\x57\xff\xfa\xee\xdb\x57\x4f\xbe\xf9\xfd\xc9\xaf\x5f\xbd\xb4\x01\xec\x20\x9f\x17\xbd\x6e\xa8\xe8\xcf\x9f\xff\xf8\xea\xab\xa7\xa6\xe0\xb2\x70\xc5\xd2\x30\xe6\x5d\xdb\x23\x42\xef\xde\xa5\x8a\xde\x06\x51\x90\x7e\xf6\x86\x03\x43\x5b\x38\x13\xb1\x77\x1f\xb3\x27\x92\xaa\xe9\x2d\xfe\xef\x41\x86\x1b\x56\xe1\x10\xc7\xf3\xd9\x43\xc6\x36\x4e\xb7\xe6\x29\x43\xb6\x55\xb9\x33\xa6\xda\xcf\x79\xf6\x66\x39\x2c\x06\xd9\x97\xb2\x50\x02\x21\x89\x6b\xab\x1b\x01\xe7\x5d\xeb\xb8\x7a\xba\x4a\x5f\x14\xd5\xfd\xc6\x4e\x41\x0b\x9f\x2c\x00\xfb\xe0\x83\x3a\x19\x21\x06\xb6\x95\x39\xbd\x94\x9a\x05\xd0\xcc\xec\x3b\x50\x2b\xdd\xd2\x9c\x3d\x91\x0b\x88\xc3\x34\xdd\xe8\x89\x7f\x01\xb2\xf4\x44\xda\xbf\x7f\x85\x00\xb0\xf0\xf3\x35\xcd\xd9\xdc\xc3\xad\x34\x72\x96\x8c\x95\xee\x9a\xa7\x7b\x67\x42\x6a\xc0\x58\xb2\xc0\x6e\xc3\x84\x58\xcb\x02\x30\xa1\xcc\xb7\xd8\x38\x1e\x79\x1c\xef\x31\xaa\x16\xe8\xac\x6a\x22\x52\x7b\x4a\xae\x98\x9a\x2a\xd0\x56\xd1\x1b\x56\xa2\x74\xe7\x6a\xc4\xb2\xc5\x15\xbb\xf2\x74\x45\x1d\xe0\xdc\x1b\x1f\x33\x57\x5e\x25\x37\xab\xeb\x35\xa8\x11\x18\xbb\x0a\xa6\xb9\xaf\x13\xbb\x5a\x80\xcc\xf4\x4c\x34\xd8\xf1\x51\x11\xc7\xa3\xad\x15\x03\xe7\x56\x0f\xaa\xbb\x1c\xc7\x60\x7b\xeb\x39\xe2\x78\xc6\xb6\x63\xfe\x71\x4e\x08\x7d\x76\x22\x07\x86\xbb\x85\x2c\x10\xbf\x00\xa6\x20\x8e\x5f\x0a\xbd\x5a\x37\xa5\xdc\x24\x65\xe8\x94\x00\x06\x5b\x38\x45\xb6\x2b\x06\xe4\x97\x7f\x9c\xd3\x5d\xcf\x80\xf8\x29\xdb\x8d\xcb\x41\x4b\x9a\xc5\xed\xf9\x6c\xb9\xf3\xfd\x87\x76\xe3\xdb\xc9\xe3\x19\x49\x9f\xb2\x41\xb9\x36\x7d\x3a\xbe\x1d\x3f\x9e\x11\xda\xa2\x03\xee\xac\x65\xf3\xd3\x86\x34\x4f\x25\x18\x50\xcc\x46\xdd\x2d\x85\xa7\x2e\x18\xc8\xb2\x33\xae\x40\x7e\x56\x06\xaf\x80\x3f\x9a\xd2\xbd\x20\xd2\xfd\x7e\xcd\xf8\x09\x88\x6e\x67\x29\x1d\xb4\x65\x11\x46\x02\x13\xe6\x20\x07\x55\x7e\xa3\xc1\xb7\xd7\xb4\xd0\x97\xa4\x6b\x3b\x8e\xd5\x03\xf7\xc7\xf1\x28\xda\x4f\xbf\xc6\xb1\x70\x9f\x7e\x5d\x84\xc3\x2d\xfb\xef\x9c\xbe\x09\x9f\x48\x96\x3c\x91\x1f\x3f\x95\xe3\x82\x3c\x48\x9e\xca\xf1\x9c\xd0\xf1\xf8\xa9\x24\x4d\x43\x1f\xea\xc3\x9c\x26\xae\xc6\xb1\x3f\x05\x63\xc6\x09\x69\x9a\x7c\xf9\x44\xb2\xc9\xf4\xf1\xa3\xb4\xd0\xbf\xe6\x8f\xd3\x03\xa6\xfc\x2d\xdd\x63\xf5\x93\xf9\x83\x47\x78\x90\x7f\x97\x9d\x57\x0d\x5e\x17\x0c\x55\xc6\x04\xbe\x35\x2e\x9e\x19\x53\xcd\xe2\x77\xff\x3d\xd3\x5f\x78\x75\xdb\xc7\x6a\x38\xf3\xaa\x59\x85\x95\xac\x1b\x1a\xd4\x21\xfe\x3c\xf0\xbc\xee\x99\x29\x30\x60\xa4\xad\x68\x0f\x20\xc5\x45\x5b\xc9\x88\x85\x95\x1e\x8f\x22\x8c\xcb\x66\x32\x04\x69\xad\x9c\x30\x34\x8a\xeb\xe7\x04\xf3\x38\xab\x4e\xf7\x47\xb2\x06\xa9\xa1\xfb\x0b\xb4\x2b\x5c\x39\x03\x04\x67\x99\x40\x8e\x47\x4c\x87\x00\x6a\x15\xfc\xd7\x5a\x66\x58\x89\xd6\xac\x33\x15\x1b\x21\xf6\x4f\xcb\xfd\xed\x30\x81\xb0\x5a\xd3\x7b\xfb\x2b\x56\x6a\x0d\x0a\x88\xb7\x32\xc9\x55\x12\xf6\xdb\xf6\x8b\xf6\xbf\x60\xdf\x1c\x05\x20\xde\x9e\xfd\x0e\x6f\x66\x30\xc1\xa4\xd3\xd5\xba\xdc\x09\xb5\x95\xc5\xf5\x4b\x13\x2f\xea\x3d\x44\x4d\xd8\x5d\x61\x44\xdd\x7e\x4f\xc4\xda\x06\xb2\x6b\x17\xdd\x4d\x58\xd8\x78\x56\x16\x8a\xcb\xa2\xee\x6e\x5d\x40\xef\x11\xc4\x8b\xdf\x0b\xbe\xdf\xfd\xf6\x0b\xbb\xbc\x55\xb0\xbc\x05\x3a\xd4\x03\x9c\xb6\x09\xef\x42\x2e\xd8\x2c\x8e\xa5\x02\x73\x23\x55\x26\x84\x9c\xb3\x36\x58\xb0\x59\xc8\xc9\x1c\x89\xb0\xb7\x83\x87\x09\x67\xde\x1e\x26\x3d\xdb\xfa\x1c\xb5\x41\x29\x64\xc7\x1e\xc4\xd7\x43\x38\x71\x41\xfd\x82\xdf\x02\x5d\x4b\x25\x53\xba\xa3\x6a\x5a\x97\x95\x4a\xc2\xf6\xac\xaf\x85\xa6\x44\x4c\x78\x1a\x1b\xa7\x86\x34\x84\x16\xec\x2f\xc4\x07\x6f\xbd\x64\xe6\x5d\x87\x75\x63\xd7\xac\x56\x7c\x4d\x4b\xfd\xdf\x64\xbe\xa6\x35\x93\x0a\x5c\x5d\x12\x42\x73\x5b\xa1\x09\x39\x3c\xca\xed\xba\x2d\xeb\x8b\x59\x5a\x5f\xb0\x99\x0b\x4d\xa8\x0b\x99\x7e\xb8\x62\xf4\xc0\x4a\xaf\x32\x98\x53\xba\x61\xa5\xab\xc5\xe6\x64\x2c\x87\xd9\x4a\x4b\x97\x50\x42\xc2\x82\x9f\x6b\x8a\x71\x32\x29\xa8\x9a\xd6\x7b\xb0\xee\x9a\x4c\x38\x7d\x48\xcd\xee\xdf\x2c\x0f\x69\x46\x37\xcb\x2c\x3d\x90\x36\x5c\xa1\xd9\xd9\x7a\xaa\xbd\xd8\x13\xa1\xbb\x82\xc9\xb3\x32\x15\x09\xaa\x8e\x47\x41\xd6\xd4\x8f\x22\xf2\x8d\x0c\x82\xbf\x6b\x1e\x64\x59\xd9\x19\x07\xa6\x62\x1c\xb8\x13\x4f\xe6\xf4\x87\x44\x04\xb1\xb3\xc7\xc9\x5c\xd3\x9f\x5e\xa6\xa5\x29\x9e\x6d\x53\x7d\xc1\x8b\xa9\x2a\x3d\xf4\xfb\xd6\x3d\x43\xaa\x16\xa9\xb8\x8d\x34\x2d\x16\xed\x27\x55\xfa\x5b\xf4\x1b\x4d\xf0\x39\x47\x55\xe8\x9c\x0a\x3a\x07\x1e\x71\xf0\x61\xa2\xda\x11\x90\x09\x22\x36\x66\x0e\xa5\x51\x98\xd0\x46\x2e\x7b\x1c\x27\xd5\x98\x41\xfd\xd3\x6c\x0b\x3e\x70\xd3\x6c\x4b\x68\xa5\x20\xae\x9a\x07\x9b\x3f\x2c\xac\x47\x7c\x8b\x7e\x40\xcd\x00\xe6\xc2\x8b\x9b\x59\xad\x17\x46\x50\x6e\x16\xe7\x9d\xe6\xe6\xcc\xbd\xab\x08\x85\x3f\xe1\xba\x55\xa4\x8d\x0d\xfe\xdc\xb8\xa3\x17\xe8\xd9\xea\x5f\x68\x2d\x86\xbc\x3b\x81\xbd\xb1\xea\xff\xf5\xe2\x16\x36\xae\x01\x8c\x34\xdb\x8e\x0b\x3d\xd6\xd4\x7d\x19\x1b\xe1\xf3\x44\x19\x83\x6c\x9d\xd3\x6b\xe2\x2b\xa3\xba\xd5\x64\xd4\x4e\x53\x9e\x5f\x0a\x4f\x37\xd5\xa6\x7f\x07\x29\x84\xbe\x0a\xa5\xcc\xaf\xbc\xe2\xbd\xe8\xf5\xc2\x33\x57\x6f\x43\xcd\xa0\xf5\x3a\xfa\xab\x1a\x54\x36\x83\x4f\x80\x3e\x04\xf0\xa5\x21\x5e\xdb\xce\xd8\xfc\x84\x5f\x48\x10\x30\xd8\x01\x3f\xbb\xb0\x2b\xba\x8a\x2f\x45\x31\x1e\x53\x07\x00\x0f\x12\x73\x0f\x13\x3c\x3c\x6b\x33\x66\x82\x68\x4d\xb3\x2d\x18\x46\x9a\x2d\x14\xc7\x51\xc4\xd8\x0f\x09\xee\x53\x12\xc7\xc9\x48\x2f\xa1\x7e\xe2\xb3\x5d\x6b\x4b\xbf\x2d\x73\x90\xaa\x20\xf0\x00\xda\x45\xf9\xa0\xe0\xb2\xf5\x5b\x6c\x9d\x83\xbc\x93\x5b\x2c\x8b\x95\x58\xa3\x2e\xa5\x75\xd8\x81\xc0\xd9\x92\xdc\x25\x7d\xef\x47\x3c\xaf\x80\x21\xfd\x5f\x4f\xb8\xf3\x03\x06\x10\x0b\xf8\x0c\xbf\xcc\xd7\x7f\xa9\x44\x10\xfa\xb9\x6a\xcd\x04\x24\xab\x96\x10\x05\x7d\xbe\x90\xba\xdc\xd6\xb8\x8b\x7d\x2d\xc0\x48\x03\xac\x57\x0b\x2a\x69\x45\x8c\x92\x3f\x73\x06\x12\x3e\x86\x48\x3e\x70\x04\x39\x13\xfa\xf2\x87\xc8\x7e\xde\xc9\xfa\x48\x25\x99\xbe\xfc\x51\x1e\xe2\x11\x06\x0d\x32\x7e\xb8\x66\x10\xa4\x40\x95\x34\x63\xb8\x4c\xf4\xc0\x3e\x12\x2e\x76\x38\xc1\xf8\x8b\xc2\x84\x10\x27\x74\xcb\x7e\x48\x32\x42\xf7\x4c\x26\x59\x1b\x21\x99\x5e\x31\xcc\x30\x31\xb1\x27\x40\x53\x7f\xa5\xa7\x42\x18\x7b\xb7\x64\x46\x73\x60\x94\x0c\x09\xd7\x42\xfc\xb9\x8a\x28\x5a\x44\x4c\x5c\x1e\x67\xaf\x63\x36\x1c\x5e\x27\x37\xcc\xaf\x68\x32\x27\x0b\x9e\x6c\x28\x86\x58\xa4\x7b\x42\xaf\xf4\xbb\x6b\xaa\xc6\xee\xd0\x2b\x42\x6f\x9c\x63\x85\xeb\x91\xf9\x78\xd3\xc6\x78\x3f\x30\xb6\xd1\xf4\xcc\x9c\x31\xd7\x09\x9e\x1c\x28\xba\xbd\x78\xc1\xd6\xb3\x2d\x19\x6f\xc7\x41\x72\x0d\x97\xe6\xde\x0b\x0c\x77\xcd\xf2\x64\x1e\x74\xf4\x3a\x58\x9d\xe1\x0a\x28\x48\x47\x4f\x35\x9a\xad\x66\x7a\x45\x31\x3c\x53\x30\x8e\xf1\x9c\x5e\xb7\x23\xf9\xa0\x11\xe8\xca\xc6\x9b\x7e\x1f\x6c\xfd\xc1\x24\x8e\xe7\xf4\xca\x0c\xee\x43\x7a\xa7\xd7\x64\x3b\x54\xf9\x1e\xcf\xc3\x6d\x6f\x72\xae\x2e\xe6\xbd\x95\xd3\x8d\xea\xfd\xd5\x1f\xeb\x2d\x69\xee\x3b\x27\xdf\xba\xa7\x60\xd4\x42\x58\x24\x15\x95\xd4\x73\x08\x7b\x23\x36\x1d\x4f\x52\x9b\xec\x3b\x94\x9a\xa0\x2b\xf6\xd3\x2a\x07\xe2\xb2\xd4\x77\xe8\x88\x49\x1b\x1a\x9a\x6b\x56\xb1\xde\xf2\x4a\x6c\x9e\xcb\x5a\x2d\x8a\x38\x1e\xd5\x9a\x8e\xc5\x9c\xb4\x26\x54\x98\x9f\x15\xad\x09\xb8\x66\x0b\x13\x4c\xd9\x27\x4a\x7e\x6c\x49\x04\x35\xcd\x76\x44\x6d\xab\xf2\x2d\x90\x33\x9f\x57\x55\x59\x25\xd1\xab\xad\xac\xcf\xac\x05\xe4\x99\xac\xcf\x78\x5e\x09\xbe\xb9\x3d\x93\xc5\xd9\xa1\x16\x53\xf4\x27\x2f\x33\xa6\xa8\xae\x80\x09\xba\x01\x7d\x27\xbc\x5c\xf4\x0b\x83\x07\x6f\x6f\x5f\x17\x69\x14\x5c\x55\xcd\x6f\x3a\x6c\x7d\x77\x3c\xbe\x56\x61\x69\x78\x01\x95\xf7\xe0\xd1\xce\x4b\x01\xcd\xdd\x25\x10\x0e\xd4\xc2\xda\xbb\x66\x96\xaf\xd2\xe7\x64\xc0\x2a\xdc\x57\xd3\xe8\x82\x3e\x08\xbf\x74\x78\xb7\x9b\xb2\x40\x56\x4a\xff\x71\x28\x7a\x7f\x3e\x13\x7b\xb5\x05\x24\x53\xf7\x57\x3a\x7f\x60\xe0\x9d\x73\x5e\xab\x17\xe5\xe6\x95\xdc\x19\x68\x52\x9d\xf0\x52\xe4\x90\xe0\xe5\xf9\x6e\x1f\x7c\x36\x40\x55\xde\xf7\x4a\x5e\xcb\x22\xcc\x83\x49\x6d\xbe\x6b\x51\x88\x8a\xe3\x1c\xeb\xbf\x77\xfc\xdd\x97\x6d\x92\xee\x60\x90\x92\x7a\xe6\x11\x7f\x04\x36\x69\x18\xc5\x43\xf3\x7d\xc6\xd9\x5a\x95\x29\x90\x6d\x54\x1f\xb2\xf4\x9f\xc2\x51\x94\x48\x3d\x36\xf6\xc6\xff\x09\xcc\xd5\xa8\x47\x16\x52\x47\xfd\x8d\xe7\x84\x7e\x1b\xb8\x9a\xb5\x2f\xeb\x7b\xca\x35\x18\x42\xa2\xed\xee\x97\xd2\x02\x77\x2d\x84\xbb\x6e\x7f\x48\x04\x31\xa4\xdf\x82\x88\xe9\xbe\xdc\xfb\x0e\xcb\x7f\xc9\x6e\x10\x0e\x31\xdd\xca\x5a\x95\xd5\xed\x42\x9a\x65\x35\x55\xb1\x19\x5c\x1c\x9c\xe6\xb4\x6c\x3d\x4b\x21\x3c\x97\xb4\x8b\xc5\xaa\xe3\x51\xfa\x2b\xc3\xd4\xb4\x84\x5f\x60\x3a\x6a\x7e\x25\xd1\x38\x6a\xbf\xd8\xb0\xbc\x33\x12\xc7\xd2\xdf\x19\x17\xe5\x04\x68\xce\x65\x40\xaf\x98\xde\x81\x5c\x16\x7c\x00\xd3\xc7\xb3\x19\x39\x1e\xa3\x8f\x07\xeb\x24\x18\xb9\x74\x90\xbd\x53\xcb\xe4\x4b\xb0\x4c\x28\xf5\xd3\xfa\x83\xfd\x45\x52\xfc\xe1\xa6\x70\xe4\x3e\x99\x89\x5c\xba\x84\x30\xab\xbe\x41\x47\x98\xb2\x0a\x3e\x4c\x1e\xae\x6d\x51\x53\x12\x17\xc2\x6f\x14\xc3\xbe\x35\x89\xa4\xde\x74\x12\x42\x72\xf6\x43\xc2\xad\x95\x3d\xa1\x33\xa6\x79\x48\x7f\x9f\x01\xcd\xd7\xa6\x69\x56\x50\x33\x7f\xaa\x44\xa6\x22\x75\x85\xf1\xf5\x33\x9b\xda\x7b\x28\x6b\xf6\x43\x22\xb1\x1b\xc0\xd1\x26\xfa\xe6\x1c\x59\x6e\x9e\xc4\xf1\x67\x7a\x96\x6a\x91\x53\x93\x8b\x72\x76\x67\xea\x4c\x57\xa6\xbe\x35\x6d\x0f\x5a\x2a\xbd\x53\xd7\x98\x52\x46\xa5\x43\x16\x32\x98\x32\xd9\xde\x0f\x0b\x62\x3e\x81\x8a\x2a\x21\xa6\xe0\x6a\x66\x27\x4f\x6f\x2e\x3f\x43\xe3\xd7\x5c\xe8\xfc\xde\x61\x1f\x8f\x65\x78\xb2\x69\xb0\xbb\x98\x0c\x2e\x9d\xb2\x9d\x75\xe9\x5d\x37\x15\x0d\xb6\xb3\xec\xdc\x32\x76\xbf\xd1\x1c\x50\x0e\x04\x8d\xcc\xf6\x7c\xb2\xd9\x88\x8d\x7f\x73\x7e\x16\x5c\x25\x3f\x00\xee\x2f\x78\x2d\x19\x57\x8a\xc2\xc8\xef\x12\x41\x8e\x47\x65\x71\x19\x3d\x54\xe1\xde\x41\x55\xab\xa8\xde\xf3\xa2\xfe\x3d\x1a\x8b\xa9\xdc\xac\x21\xd0\xb4\x40\xb6\xc6\x49\xa1\x85\x75\xd7\x23\x7e\xdc\x18\xb4\xe0\x43\x72\x4f\x53\xbc\xee\x74\x14\xe4\xae\x98\xee\x78\xf5\x46\x6c\x5e\xea\xba\xe3\x38\x49\xe4\xf1\x98\xf4\x5b\x63\x77\x0d\x21\x2b\xbe\x66\x41\x7e\x42\xc7\x63\xde\x78\xdd\xfe\xb3\xb5\x38\x0c\x7c\x9d\x9c\xe0\xd0\xe0\x0a\x7a\xe1\xb1\x0b\x22\x56\xc5\x1a\x6b\xad\xa6\xe2\xdd\x3e\x97\x99\x54\xf9\xed\xd3\x5c\xe8\xd7\x7d\x69\xa4\x53\x8e\xf4\x29\x08\x49\x01\x36\x09\xe7\x0c\x00\x09\xdd\x01\x77\x62\x01\xc4\xd1\x4c\x45\xdb\xb5\x5f\x82\x15\x19\x42\xaa\xec\x8e\x19\xa4\x94\xc5\xe0\x38\x2a\xfd\xf6\x59\x68\x43\x3f\x4a\xfa\x78\x2c\x49\x85\x5d\xfb\x53\x26\xc5\x4a\xae\x5b\x4e\xa0\x6a\x10\x43\xa5\x62\xdf\x28\x67\xea\xdc\x36\x00\x11\xcb\x46\x95\x6b\xaf\x03\xa1\x58\xf8\x4d\x18\x9b\xa9\x02\x6d\xf3\xaa\x95\x5c\x1b\xad\x46\xee\x69\x7d\x10\x6a\x23\xf7\xa1\x36\xee\x5a\x03\xd4\x7c\x55\xae\x69\xc6\x66\x8b\xcc\x47\xe3\xc8\x34\x3d\xce\x57\x99\x5d\x10\xc6\x6a\xf3\xcb\x19\xea\x9d\x89\x05\xc7\x11\xd6\x86\x00\xce\xc1\x30\x56\xae\x59\xee\xb9\x79\xb9\x89\x7f\xed\x68\xc3\x81\xd9\x13\x03\xa3\x12\x76\x38\xf6\x46\x32\x13\x5a\x2c\x07\xa5\xbe\x08\xa0\xc9\x49\xca\xbd\x3b\x2e\x67\xee\x1a\xa4\x25\x5b\xad\x17\x95\x35\x16\x34\xf7\x58\xd9\xb4\xe2\x3c\xb4\xc6\xf5\x26\xaa\xb6\x92\xb8\x1c\x63\x77\xe2\x5d\x8d\x74\x28\x56\x03\xb4\x41\x66\x6e\xe5\x32\xcd\x34\x4f\x07\x64\x01\xfa\xef\x37\x84\x2a\x47\xeb\x6e\x34\xad\x98\x91\xe4\xc0\x36\xd3\x1d\x57\xd9\x36\x79\xf0\x6f\xdc\x68\xc9\x6f\x9b\x31\xf9\xe8\x81\x7e\xb4\xfe\x4a\x14\x45\xa5\x7a\x72\x58\xcd\xd7\xc4\xb8\x55\xfd\x90\x94\x64\xb5\x59\x83\xd3\x17\xdd\x88\x5c\x28\x71\xa6\x7f\x6b\x82\xd6\x6d\xab\x16\x11\x57\x06\x01\xeb\xbd\x47\x1e\xe5\x3d\x08\xc0\x6a\xa6\x59\x62\xd0\xc3\xf3\xd9\x82\x8f\xf4\x1f\x05\xfc\xb1\xd4\x87\x9f\x2a\x56\x90\x14\x93\xf5\xca\x61\x00\x40\x56\x10\x5f\x26\xf8\x56\x26\x92\xaa\x6e\x52\x71\x3c\xaa\x80\x35\xf8\xa7\xeb\x13\x95\x18\xb8\x8d\x41\xcc\x3c\x08\x21\xb8\xc3\x10\x63\xbb\x30\xf6\xeb\xf1\x28\x8c\xb7\x0e\x21\x54\x81\x6c\xc1\xc8\x17\x3f\x32\x2f\x93\xd5\xa0\x24\x04\xaa\x96\x20\x6a\x0c\xa4\x67\x3f\x9c\xda\x75\x1f\xd2\xaa\x0b\xe2\xdf\x17\xb3\xf1\xf1\x98\x54\xfa\x22\x74\x5d\x31\x72\x36\xbe\xa6\x20\xfc\x45\x24\x57\xb2\x80\x7e\x5b\x31\x5a\xd5\x13\xa3\x05\xd2\xd4\xaf\x07\xc8\x32\xaf\x69\x73\xf5\x91\x85\x04\x55\x05\x0d\xaa\x96\xfd\xaa\xfd\x79\xf8\xd5\xab\x1a\xca\xbd\x40\x51\x6e\x90\x49\xf0\xae\x6f\xa5\x79\xd7\xe0\xbd\xa5\x92\xfd\x90\x54\x64\x21\x35\xc1\x66\xc9\x9a\x6a\x55\x39\x66\x72\xcd\x14\x2d\x6c\x15\x24\x55\xf6\xa7\x87\x57\xe7\x1a\x70\xf9\x4e\xe1\x64\xb5\x8d\x53\xce\xaa\x38\xae\xcc\x9b\xbb\x28\x98\xff\x54\x83\xb2\xb7\xfb\x3e\x83\xb1\x6b\xf8\xec\x87\xef\xbe\x2d\xe2\xf2\x1f\x8f\xa7\xba\xa1\x5a\xa2\xd2\x5c\xe0\x40\x72\xca\xe3\x11\xc8\x59\xd9\xbe\xe6\x96\x60\x66\x55\x98\xa0\x73\xf4\xf4\x3d\x09\xd1\xf9\x06\x92\x11\x7d\x54\xd3\xd8\x93\x76\xfa\xbd\xae\x9f\xb3\x0f\xa6\x8e\x1b\x70\xcd\x76\x44\x9e\xa6\xfe\x96\x86\xb6\x0a\x88\x31\x58\xb9\xf4\x33\xbd\x21\x6c\xd6\x90\x4a\x72\x64\x3f\xed\xce\x34\xa7\x3e\xd9\x54\xd0\x2a\x8e\x47\xf3\x91\x1e\x1a\x18\x76\xfc\x28\x36\x65\x1c\x7f\x29\x13\xcb\x54\x40\x9f\x90\xa8\x6c\x47\x81\xa1\x05\xe5\x26\xfd\x96\x7f\x1b\x6c\x17\xb7\x49\xee\x92\xa7\x18\xae\x1a\xc4\x94\x2f\x43\x88\xc5\x88\xa0\x6c\x33\x8e\x75\x26\x7d\x16\x4e\xe5\x03\xaf\xa8\x13\xd8\x1c\x77\xb8\x66\xa9\x32\x8b\x67\xc0\xb9\x53\x1f\xcc\xdd\x57\xee\xae\xd6\x5d\x3d\x59\x80\x4b\x1d\xa8\xc5\xac\x5a\xf1\x00\xef\xbd\x26\x73\xac\x3a\xb1\x4d\x41\x35\x62\x43\x71\x97\xa7\x40\x25\xe2\x6f\xc7\x50\xde\xde\x33\x07\x14\x28\x3a\x9c\x86\xdb\xfb\xa7\x81\xe2\x55\x44\xa8\xdd\xa7\x23\x66\x07\xbd\x74\x17\x95\x9d\x85\xce\x5e\x9e\xcc\x49\xaa\x1a\x7b\xc4\x8d\x55\x0c\xf4\xf5\x52\xf2\x5a\x93\x8c\x9a\x21\x71\xb7\x32\x2a\x14\x3a\x57\x35\x0e\xf5\x7c\xb6\x9c\xcc\xd3\x39\x59\x54\x7a\x91\x39\x37\x76\xe0\x00\x7e\x96\x8c\x8a\xe3\x11\xf6\x91\xc5\x7e\x05\x6f\x55\x3d\xb6\x30\x54\x7c\xb6\x9b\x5e\x0b\x85\x42\x90\x24\xb2\x01\xe3\x23\x12\xc7\xaf\x7a\x58\x99\xd0\x8e\x5e\x44\x47\x72\xeb\x6e\x61\xa4\xfe\x5a\xe4\x20\x98\x6e\x9f\x04\xdc\x93\x1e\x42\x27\x9b\x53\xef\x43\x17\xe5\x93\x8d\x66\xf4\x12\xa7\x9d\x38\x51\x72\x00\xf4\x1d\x85\x40\x4f\x92\x03\xc7\xef\xc6\x8e\x67\x02\x05\x53\x73\x3f\xa3\x99\x19\x14\xc4\x5b\x4a\x90\x5a\xa8\xec\xfe\xa3\x64\x15\x90\xde\x7b\x54\x32\xd5\xbd\xa2\x06\x9e\x34\x80\xa9\x0a\xde\xb1\x9a\x95\xba\xf1\xdc\x6a\x89\xca\x38\x2e\xed\x6f\xdd\x1f\x9a\x19\x15\x23\x63\x36\xcf\xb2\x4e\x4d\x19\x58\x79\x28\x01\xbf\x74\xfe\x85\x66\x2a\xea\x91\xcb\x0c\x50\x48\x98\x13\x10\x2c\x91\xe3\xe8\xbc\x76\x94\x13\x42\x25\xb0\x1c\x78\x88\x6a\x9a\xb5\xfa\x29\xb9\x6c\xdf\x3f\xe5\xbd\x7d\xa9\x67\xc2\x96\x73\x9f\xf2\x40\xa2\xe7\x23\x94\xda\x80\x74\x1d\x69\x4c\x9f\x9d\x09\xa5\x93\xc1\xb7\x01\x11\x65\xf0\x7d\x95\xc3\xbc\x19\x62\x99\x66\x2c\xc2\xad\xf2\x8d\xb8\x52\x91\x2c\xce\xea\xe5\xc8\xaa\xa5\x01\xe6\xbf\x9e\xca\x22\xcb\x0f\xb5\xbc\x11\x60\xb5\x73\xb0\x05\xc0\x24\xb8\x53\x02\xd2\xfc\x22\x3f\x5a\xa3\x30\x67\x1d\x74\x05\x8e\xa2\x49\xb6\xc4\x9f\xe7\xf0\x7e\x19\x15\xf0\xb9\xfe\x0d\x97\xa0\xcd\xad\xca\xe3\x31\x39\x2c\xf5\x8f\x0b\x9b\x53\x95\x17\x98\x0f\x15\xa6\x71\x9c\xdc\x8a\xa4\xb6\x97\x09\xc2\xa5\x7e\x5e\x80\xcb\x3f\xad\xfb\x8c\x1a\x16\x0b\xe7\xf3\x6e\x32\xc9\x17\x96\x6f\x68\x10\xd7\x50\x33\x39\xf5\x94\xab\x72\x27\xb3\xd6\xf9\xa7\x25\x4c\x37\xac\x9e\x5e\xc9\x62\x93\x54\xe7\xb3\xe5\x3c\x9d\xcc\x09\xdd\x7a\x04\x38\x24\x1f\xd2\x4c\x8f\x66\xc3\x6a\xbd\xc4\x1b\x3a\xa9\xe8\x26\x8e\x37\xa1\xfa\x91\x03\x0b\xa8\x4f\x65\xf7\x13\xc4\xad\x97\x2a\xd9\xe8\xbb\x2c\x8e\xa1\xca\xed\xf9\x2c\xdd\x5e\xcc\x1c\x44\x47\x8e\x35\xa3\x8b\x4a\x83\x48\x09\x5e\xc7\xcc\x15\x06\x79\x21\x21\x4b\x0f\x04\x60\x10\xa0\x4b\x7b\x5a\xd1\xfd\x89\xee\xec\x97\x39\x66\xc1\xba\x51\x93\xe6\x5c\x9b\x3c\x48\xb8\x81\xed\x5b\x1d\x8f\xf3\x85\xdf\x43\xfd\x9d\x53\x49\x8e\xc7\x91\x8c\x63\x2f\x69\x34\x23\xc7\xa3\xfb\x7b\x32\x90\x67\x62\x32\xe9\x63\xc4\x0b\xf5\xf9\x46\x2a\x7d\x9b\xa1\x4a\x1e\xa4\x08\x41\x78\xda\xda\xbb\x8f\x2c\xc9\xaf\xf9\x02\x50\x40\x66\xdb\x25\x0e\xf3\xc2\x94\x5d\xc2\x03\xe7\xa0\x48\x27\x73\x82\x03\x4d\x8b\x8b\x99\x66\xde\xb3\x2d\x63\x49\x75\x3c\xfa\xe7\x91\x04\x8a\x7d\x4c\x3c\x0f\xa5\x17\x93\x79\x0b\x6f\x3a\x9e\xd3\x99\xad\x54\xbc\x3d\xeb\x40\xa3\xfa\xe4\x44\xc6\x8d\xbe\xd7\xc7\x1e\x68\xc7\x89\x50\x64\xc0\x40\xe8\x34\x2f\x0c\x3b\xfd\xc9\xab\xe5\xd0\x21\x92\xef\x32\x5e\x64\x22\xc7\x88\x1e\x18\xf1\xd9\xf1\x83\xca\xf1\x83\x46\xcd\x67\x5e\x77\x27\x40\xc2\xb2\x69\xdf\x00\xac\x9a\xda\x6a\xd9\x68\xd6\x38\x12\x00\xd1\x79\xba\x21\x7e\x80\xf7\xa1\x9c\xdc\x21\x4c\x90\x6e\x9d\x21\x65\x41\x00\x38\x3a\xa9\xa6\xaa\xc4\x94\x42\xdf\xa6\x98\x22\xde\x29\x26\xd1\x3e\xf2\x6c\x36\x42\xa2\xd9\x52\xd9\x8c\x93\x86\x50\x9f\xe0\x78\x3f\x9d\xd1\x27\x2f\xec\x10\x96\xc9\xfd\x4f\xeb\x43\x54\xec\x92\x14\xf9\xe9\xca\xcd\x5f\xe5\xe6\xaf\x0a\xe6\xcf\x76\xd3\x33\x6e\xde\xb8\x65\x41\xa0\xcc\x9d\xf5\x78\xb5\x2d\x3a\xf9\x8a\x79\x30\x36\x9c\x98\x12\x0b\x53\xc2\x68\xe2\xeb\xc3\x7e\x5f\x89\xba\xd6\x27\xc1\x5a\xd0\xc1\x75\x15\x10\xa1\xef\xa1\x3d\x1d\xc9\x09\x62\x2b\xb3\x67\x34\x71\x63\xb7\xcd\x1b\x85\xe6\xb0\xc3\xd4\xa8\x75\xb3\x34\x82\x3d\xb3\xa3\x0b\xa7\x9d\xeb\x82\x12\x0d\xbd\x5e\x36\x0a\xc8\xe0\xeb\xe5\x41\xb0\xf9\xaf\x97\xb2\x02\x9f\x45\x31\xb5\xe4\x54\x1c\x27\xa3\xea\x78\x9c\xcc\x19\xfb\x2b\xa9\xec\x5d\x79\x3c\x26\x9a\x93\x26\xc4\x8a\x61\x9b\x86\x50\x4f\x6c\xe5\x8b\xc9\x24\x5b\x79\xb1\xd0\x8b\x66\x6d\xe8\x97\xaa\xed\x0f\xf7\x1e\xdd\x0a\x89\x96\x1c\xaf\xd9\x19\xa1\x28\x98\x91\x03\x82\x19\xb9\xaa\x51\x3e\xa7\x09\x4f\x90\xbe\x94\xd6\xb8\xe7\x78\x84\x24\xd8\x4a\xfa\x55\x23\xfa\x56\xbf\x43\x50\xa7\x55\x4d\xe7\x6b\xba\x61\x7e\x0e\x54\xee\x6c\x59\x5b\x91\x2a\xc9\x22\xd9\xe8\x9a\x46\x79\xf8\x4c\xc7\xf1\x48\x93\x2c\x87\x61\x29\x10\xd6\xd5\x10\x9a\x6c\x2f\x3a\x85\x7f\x44\xf3\x83\xd1\xb6\x5b\xba\x84\x9d\x8e\x12\xa4\x46\xf3\x5f\x68\x98\x65\x1c\x17\x24\x3d\x10\x5a\x8f\xd9\xc1\x92\xe1\x8f\x1a\x0f\x18\x38\xd4\x3f\x81\x5d\x19\x69\xa7\xbe\xe5\xcf\x17\xf2\x82\xcd\x16\x93\x89\x24\x5b\xbd\x1f\xcd\x61\x5b\xc9\x75\x7b\xde\xf4\x1f\xf6\xc8\xc9\xe5\x2a\x8a\xd6\x27\x6e\xae\xc6\x98\x09\x6c\x91\xaa\xf6\x61\x16\xb8\x53\xa5\xce\x47\x2c\x10\x8b\x1e\x8f\x51\x64\x93\x56\xb3\xf5\xf1\x38\x1b\x75\xb5\x1a\x76\x5b\x1a\xab\xa7\x85\xd3\x54\x0d\xb3\x8b\x84\xde\xd8\xf7\xc8\x08\x53\x2d\x53\xb2\x5a\x2f\x3a\x0a\x36\x50\x4b\x17\x71\x6c\x37\xb2\x63\xaf\xf5\x7e\xbe\xe4\x49\x2b\x70\x00\x60\x19\x94\x2b\xbb\x3c\x6d\x4b\x9a\x46\xb7\x8d\x35\xfe\xc8\xf7\x3d\xf1\x49\xb6\x43\xbe\x65\xe8\x66\x41\x31\xef\xf1\x58\x84\x74\x7d\xdb\x8b\x1c\xa9\x74\x5a\xb2\x48\x33\xcf\x11\x63\x6a\xc9\x81\x3f\x4f\xb9\x61\xa7\x69\x1d\x7c\xc3\xc4\x14\x33\x19\xa1\x6e\xe9\xc8\xfb\x44\xb2\x72\x95\xad\xe9\x28\x29\x96\xd2\x69\x20\x46\x32\xe4\x87\xd2\x91\xfd\x46\xc8\x22\x1b\x8f\x11\x88\x63\xc4\x6c\x3d\xd8\x5b\xee\x8b\x4f\xf8\x80\x12\x76\xb1\xc0\xfb\x57\x37\x8a\x4a\x2f\xab\x45\x33\x22\x49\xb3\x7d\xe1\xf5\x31\xd2\x54\x49\x16\x8e\x36\xfc\x4c\x26\x92\xd6\xf0\x7a\x75\x7b\x18\x14\x05\x89\x92\xa4\x77\x4e\xdc\x90\x8e\xe6\x0d\x59\xe4\x4c\x36\xe6\xa8\xaf\x17\x9f\xc9\x24\xd7\x75\xd5\x1d\xd9\xef\xc1\xd7\x5d\x71\x5f\x77\x05\x9e\x92\xad\x4e\xc9\x57\x30\x1d\x8f\xe3\x31\x0f\x35\x4c\x1e\xf4\xeb\x7f\xf1\x42\x50\xcf\xa1\xc9\x6d\x1d\x69\xa5\xd6\xc6\xa8\xd6\xbd\xcb\x4a\x93\xb1\x23\x78\x4f\x2a\xe0\x14\xcd\x64\x94\x4e\x5d\x4b\xef\x9a\xc5\xc1\xd3\xf9\x55\xe6\x48\x70\x56\x2c\xff\x85\x09\xe9\x0f\x49\xa9\x13\xa1\x12\x4e\x7f\x31\xd9\xe8\xa8\xb0\x6c\x36\x6e\xda\x10\xfb\xbe\xfb\x38\x7f\x23\x93\x8a\x34\x58\x79\x3e\x74\xde\x14\xb9\x1b\x29\x7b\xde\xf2\x7b\xce\x5b\x45\x68\x7e\xe2\xbc\x61\x88\x40\xd7\xc5\x86\x34\x74\xdf\xce\x4e\x7b\xb5\xed\xf1\x6a\xdb\x13\x03\xfe\xb5\x4d\xf6\xb0\x73\xaf\xec\x04\x5d\x4d\x6f\x1a\x1f\xc5\xf9\xaa\xbd\xa6\x66\x36\x16\x3f\x92\x98\x68\xa2\x26\x72\x66\xa4\xcd\x5f\x07\x02\xde\x21\x8d\xbd\xe1\x4c\x81\x6c\x44\xd6\xd6\x98\x8a\x3a\xbc\x2a\x6b\xda\x29\x80\xdb\x6d\xbf\xc2\x5f\x9a\xd9\x6a\x48\x5f\x7e\x8b\xd2\x84\xbb\xab\xca\x86\x04\x42\x72\xdc\xfc\x3f\x51\x7e\xb8\xd4\x82\xf9\x92\x6c\x88\x59\x61\x3d\x3d\x01\x94\x00\x7d\x3d\xc1\x3a\xf4\xa6\xb2\xc2\x68\x87\xdd\xe6\x83\x85\xf0\x40\x77\x80\xdb\xe1\x1e\x32\xea\xc6\x92\x51\x9a\xc1\x37\x71\x2e\x02\x92\x9d\xe0\x4c\x87\x26\xbd\xa7\xec\x66\x5b\xe3\xb3\x51\xe2\xa5\x5f\x04\xe4\xb8\x31\xd3\x69\xa3\x43\xd9\x96\x9c\xc8\xb6\xd3\x96\x9b\x31\xaf\xa5\x05\x74\x4b\x12\xaa\x8c\x85\x47\xc0\xf0\xc0\x63\xa8\xda\x4e\x8e\x25\x75\x16\xba\xf0\x38\xae\x9c\x81\xe5\xba\xf7\x34\x36\x46\x7f\xe5\xf5\x79\xe1\x6a\xba\xe0\x20\x84\xbc\xeb\x70\x0a\x95\x4a\x38\x05\x2e\x88\x07\xfc\x8f\x6d\xce\x3d\x9a\xfd\xe6\x08\x55\xc6\x7c\x6b\xc3\x7a\xd6\x28\xb4\x38\x1e\x13\xf7\x9c\xe2\x9e\x5a\x9e\x44\x52\x2c\x33\xd0\x8c\xd8\x5d\xc4\xad\xb5\x62\x8e\xd6\x8a\x25\x1b\xcd\x69\x6d\xfc\x62\x17\xa7\xcc\x95\x92\x9a\xfd\x2a\x92\x3f\x00\x01\xb4\x32\x7e\xb6\x08\x1a\x0a\xb4\x6c\x4d\xf3\x53\x64\x2c\x63\xd2\x3a\xbc\xba\x7b\x8d\x41\x50\x97\x06\xca\xeb\xf3\x61\x9d\x17\x02\xaa\x01\x94\x64\x97\x22\x11\x84\x7e\x2f\x93\x0a\xb6\xe3\x01\x63\xf9\x9e\xec\xa5\xeb\x0e\x1f\xb0\xeb\xa6\xfd\xb8\x70\xbf\x28\x00\xd6\xbf\x90\xa1\x97\x2e\x68\x1a\xac\x1b\xaf\xa0\x9d\xaf\x4c\xb5\x29\x9e\xa8\x50\x4f\xa4\x3e\xf2\x25\xf2\x44\x1e\x43\x64\xa2\xab\x61\x10\x88\x5e\xe4\x1a\x31\x04\x6b\x0d\xba\xfd\x00\xd6\x5a\x11\x3a\x4a\xc4\x00\x34\xbd\x9a\xcc\x35\x11\xec\x5f\x1a\xb8\xe3\x2b\xa6\x26\xf3\x45\x75\x51\x2c\xaa\xc9\xc4\x9e\x23\xd8\x8e\x15\xf1\xec\x73\x8d\xff\xa1\x7e\xd6\xcf\x64\x51\x2b\xcd\xdf\x95\x57\x67\x5b\x45\x8e\xc7\x6a\x2c\xa7\x79\x59\xbe\x79\xa2\xef\xb4\x73\x45\xc8\x5d\xc1\xaa\xf1\xdc\x3c\xe9\xcd\x40\x77\xfc\xfe\xf7\x3e\x52\x08\xe4\xe7\xf6\x4f\x8b\x7c\x67\x50\x1b\x3a\x66\xf8\xb8\xa7\x26\xdc\x9a\xdf\x2f\xd0\x10\x76\x09\x96\x71\x29\x26\x8f\x18\xe6\x3a\x1e\xfb\x84\xe9\x77\x32\xb1\x88\xdb\x50\xc6\xb4\xdb\xee\xd5\x8c\xa4\x37\x5e\xba\x81\xfc\x36\x20\xb1\xf8\xec\xdb\x20\x12\x84\x6e\x82\x14\x8c\x7d\xb1\x39\x1e\x0f\x16\xbb\x13\x4f\x3f\xd7\x07\x3f\x0f\xe4\x03\xe6\x1c\xa7\xee\x44\xf7\x4e\xfb\x62\x13\xc7\x5d\x13\xcc\x2d\x00\x1b\xb8\x9d\xd4\xc6\xaf\x40\xa9\x4e\x27\xd1\xe3\xda\xb6\xa4\xf1\xdc\x60\x07\xdd\xc2\x1b\xbc\xe6\x95\x26\x1b\x8c\x51\x78\x45\x50\xcd\x57\xd0\x9f\xe0\x42\x31\x52\xa3\x38\x06\x51\xd5\x80\x40\x05\x21\x2b\x5b\xe9\xd2\xdc\x7f\x70\xae\xfb\xf2\xad\x05\x72\x97\x05\xa1\x52\x01\xc7\x09\x8a\xe7\x82\x25\x9c\xad\x2a\x5a\xac\xc9\x6a\xb6\xa6\x15\xe3\xab\xf9\x9a\x50\x8b\x44\xc4\x2c\x12\x91\x32\x9e\xd5\x9a\x83\x82\x3e\xd4\x89\xbe\xf9\x36\x2d\xcf\x53\xc0\x8d\x6b\x26\xde\xce\xb0\xf4\x0d\x58\x6e\xbd\x57\x10\xcc\x54\x64\x21\x96\xc6\x01\x84\x55\xa9\x32\x49\x0e\x53\x07\xb5\x07\x5b\xe6\xdb\x94\xee\x86\x24\xf7\xf7\x5a\x3b\xd0\x9c\xa1\xab\x9e\x33\x79\xb8\xe3\xd3\xac\xdc\x4b\xb1\x39\x1e\x93\x04\x33\x31\xee\x4c\x1e\x34\x51\x8d\x9f\xf5\x7d\xb1\xe8\xc6\x56\x09\x95\x03\xe5\x78\x4c\x6e\xb9\xab\x7a\x55\xae\x9d\xf7\x07\x4a\xf3\x3b\x1f\xd1\x17\x04\x3e\x21\xaa\x6a\x68\x26\xc1\x3b\x34\x98\xcf\x95\xbb\x6f\x86\x3b\x2f\xce\x33\xef\xe5\xc5\xdf\xac\xb2\xbc\x37\xce\x6a\x45\x33\xeb\xcd\x40\xa8\xe6\x82\x31\x83\x7d\x7f\x2b\x48\xd3\x1f\x1d\x85\xa0\xce\x99\xfb\x4e\xee\x72\x36\x72\x77\x4d\x8e\x4a\x9d\xbd\xd1\x20\x80\x07\xa8\xd4\x6b\xe3\x6d\xbb\x4b\x1e\xd8\xfc\x78\xc6\x96\x55\xeb\xa4\x43\xbb\xc4\x44\x52\x4d\x0a\x7d\xbb\xe8\xb5\x45\x2e\x0b\xf7\x2d\x85\x04\xc3\x94\x61\x52\xdb\xd4\x53\xde\x53\x2a\xeb\xa7\xd5\xaa\x93\x11\xa3\xc9\xdb\xbf\x4b\xa3\x9f\xc8\x0c\x93\x99\x4a\xfd\xa0\x2a\x8b\x11\x20\x97\x20\xec\x4c\xaa\x84\x53\xe9\x14\x63\x96\xaa\x93\xb4\x20\x94\x7b\xad\x3f\xe1\xce\x78\x17\x70\x6c\x9c\x5b\x2a\xf8\x7b\x87\x10\x56\x8a\xcd\x4e\x5a\x66\x99\xfc\x10\x26\x45\x8d\x99\x40\xa5\x25\x28\x20\x8c\x67\x1e\x02\x10\xb6\x2d\xbf\x6c\x5b\xce\xb6\x32\xdf\x54\xa2\x60\xa2\xdb\x96\x73\x65\xea\xc3\x66\x89\x55\xb5\x5e\xa8\x31\x90\xfb\x87\xe2\xcd\x4b\xf9\x97\xbe\x4e\x0a\x9d\x60\x7c\xa9\xa5\xdf\xab\x06\x5a\xaa\xe5\x5f\xc2\x06\x54\xb0\x90\xac\xbd\x01\x37\x6f\x03\x58\x09\xbd\x1d\xfb\x22\xd8\xda\xb8\x7a\xda\x53\x62\xdd\x0f\x49\x43\x83\xe2\xaa\x1c\x28\x5c\x7e\x60\x61\xf0\xda\x3b\xe5\x00\xec\x78\x05\xf4\xe6\xf5\x79\x0b\x03\x9b\x61\xf8\x87\xf0\x7b\xb6\x6d\xe8\x13\xde\x36\xc2\xee\xdc\xfc\x0d\x48\x9a\xdb\x9d\x61\x96\xa0\x31\xaf\x10\x20\xa1\xa4\x21\x0d\xe2\x51\x0e\xb4\x62\x62\xac\x16\xc5\x79\x05\x7b\xc4\xee\x6c\x57\x1b\x78\x59\xb6\xab\x30\x69\x57\xed\x9f\x2a\x91\xa0\x24\x95\x34\x42\x5b\xa6\x88\x34\x5e\x37\xcc\xc1\xc5\x20\xe2\x16\xdf\x37\x0d\x7d\xb6\xf4\xf3\xe5\x02\x1b\xb5\x65\x49\x43\xd1\x65\xa1\xdf\x79\x4d\xe8\x7a\xfd\x19\xdb\x6d\x81\x87\xc2\x6f\xde\x5c\x1b\xc2\x01\xf2\xab\xf6\x57\x37\x9b\x66\x59\x4e\xc4\x41\xd6\x3b\x59\xad\xaa\xe0\xe4\x34\x54\x13\x9d\xdf\xf6\x3a\xd6\x56\xa1\xe7\x54\xc0\x9c\x0a\xa2\xaf\x4e\xaf\xc9\x95\x58\xb7\xce\xbd\x4d\x43\x5f\xfe\x67\x6b\x0c\x50\xd7\xf7\xac\xad\xcb\x34\x61\x6a\xc8\x07\xd8\x9e\x61\xff\x66\xf0\xbd\x80\xed\xf7\x55\xb1\x06\x88\x0c\xef\xd0\x82\x28\xfb\xdc\xbd\x75\x6d\x50\x21\x2a\x27\x9a\xb6\x63\x95\xbd\x4a\x40\xd6\xe1\xf5\x11\x18\x22\x1a\xec\xa3\x7c\x52\xb9\xf3\x8f\x5a\x8b\xb0\x7b\x66\xfb\x14\x93\x09\x9d\x83\x20\xaf\x3d\xf7\x60\x47\x9d\xa8\x09\xe3\x16\xcd\x57\xb0\x19\x1a\x2f\x8a\x09\x93\x8d\x8d\x72\x05\xb3\xa0\xce\x1f\x3e\xee\x55\x6e\x2d\xbe\x8f\xc7\x51\xf8\x65\x35\x5b\x7b\x14\xf1\x13\x6e\x25\xfd\x60\x75\x88\x39\x2d\x52\x75\x69\x06\xe4\x2e\x45\xf0\x97\x7d\xc2\x93\x92\xac\x69\xb7\xd2\x60\xf7\x9c\x38\x0e\x03\xfe\xf8\xfd\xc5\x52\x24\xac\x5a\xad\xdb\x1e\x89\x0f\x39\x37\x7a\x52\xc6\xcc\x71\x48\xe1\x59\xea\x1e\x82\xe1\x3e\x54\xc1\x35\xe1\xba\x62\xd1\x11\xbb\x1b\xc6\xa0\x43\xca\xa9\xd7\x37\x6b\x36\x86\xf8\x43\x35\x58\x72\x79\x97\xd7\xc5\xe3\x59\x3b\x1f\x39\x0b\x3f\xfe\x9f\x87\x8f\xc7\x0f\x1f\xd3\x92\xe5\x8b\xf2\x3c\xfc\xb4\xb0\x1e\x45\x66\x29\x64\x70\xca\x4b\x5a\x8e\xd9\xc3\xc7\x84\x2c\xa4\xdb\x86\x76\xf0\x74\x70\xf7\x8d\xc7\x15\x9d\x19\xa1\xa3\xb7\x80\xa6\x5a\x26\x3b\x77\x4d\x6e\xb6\x04\xc4\xde\x7b\xb9\x97\x79\x9e\x10\xa3\x28\x17\x13\xc6\x9b\x86\xb6\x5f\xd2\x10\x9c\x63\x34\xb8\x43\xcf\xd9\xdc\xaa\x3b\xd0\xd7\x66\xb1\x29\x0d\x23\xab\x47\xa8\x9f\xe6\x5e\x9f\x45\xb7\x92\xc9\x63\xfa\x98\x18\xf5\x18\x8e\xc2\xe2\x27\x4f\x98\x8b\x03\x66\xe7\xc3\xc6\x2f\x37\xde\xd2\x7f\xb9\x32\xae\x56\x2a\x20\xa6\x6f\x98\xe8\x8e\xeb\x78\x4e\x67\xfa\xc6\x77\xb6\xbb\x55\xbf\xa7\x64\xe1\x8e\x33\x7a\x13\xdb\x03\x54\x51\xb5\xa6\x82\x55\x8d\x72\xdf\xcd\x0f\x13\x46\xbf\x37\xb6\x8b\xf9\xcc\xeb\x4d\x30\xef\xef\xbf\xa4\xff\xf7\xb6\x38\xb7\x06\x3b\xde\x9d\xc8\x27\x68\x94\x22\x41\x42\xf1\x6d\x22\x68\x4e\x0b\x12\x60\x79\x98\x6b\x2c\x1f\xba\xc6\x78\xd3\x20\x9e\xc2\xcf\xbc\x67\xeb\x06\xf6\x15\x6e\x1c\x67\xb2\x38\x2b\x48\x31\xdd\xf2\xfa\xbb\xb7\xc5\xf7\x55\xb9\x17\x95\xba\x4d\x2a\x62\xae\xbd\x55\xb5\x06\xec\x52\xb2\x30\xbe\x5f\x99\x25\x1e\x01\xfe\xc7\x87\x61\x78\xe3\x74\x1f\x7f\xea\xf7\xf2\x3c\x71\x5e\xcc\x96\x01\x0d\xa2\xbe\x07\xf0\x3a\x24\x8e\xbf\xc2\xd8\x32\xcd\xcf\xdc\xc7\xa9\xc8\x05\xaf\x7c\xda\xa8\xdd\xcd\x50\x81\x66\x4b\xdb\x87\x7b\xfa\x16\x31\xd9\x68\xd1\xa6\xd1\x4a\x53\xce\xa8\xe1\x45\xd7\xe1\x2a\x8e\x55\x97\x1d\x0b\xac\xf6\x95\x66\xb1\xa0\x06\x08\xf5\x8f\x9b\x53\xc2\x5b\xb2\x68\xc5\x05\x49\x61\x9b\x33\x60\x42\xf8\xb0\xbd\x29\x4c\xe0\xc3\xaf\x45\x52\xd0\x20\xa8\xb8\x39\x26\x9c\x20\x7a\x5f\x37\xce\xd8\x1b\x64\xa8\x27\x9c\x50\x10\x33\x54\x34\xc2\x06\x22\xd2\x58\x83\x32\x10\x60\x41\xa2\xb1\xb5\x01\xf7\x4b\x4d\x8f\x57\x44\xef\xda\x70\xf2\x8c\xb4\x69\x70\xfa\xec\xbc\x99\x1b\xac\x08\xe6\xb4\x6a\xe7\x2f\xa0\xec\x5d\xb4\x1a\xe9\xc6\x39\x51\x8b\x91\x3c\x1e\x93\xcf\x0c\x65\x04\x7e\x96\xe4\x78\xfc\x5a\x24\x15\xb5\xaf\xf4\x58\x82\x1a\xa7\x90\x49\xe1\x8f\xb8\x30\xfb\xc2\x0b\x96\xcf\x46\x33\xfa\x86\x27\x86\xa5\xda\x14\x49\x11\x0c\xda\x22\xaf\x17\x54\xd0\x5f\x45\x02\xea\x00\xd2\xd0\x27\x22\xf9\x99\x1b\x38\x1e\xce\x66\xf4\x6d\xd7\xef\xcb\x23\xf3\xac\xab\x22\x90\x4c\xe6\xea\xf6\xb6\xb5\xdc\xb0\xf1\xf8\x77\xee\xc3\x8b\x04\xd2\x09\x84\xec\xa8\x8c\xc7\x29\xe9\x46\xa6\xf4\x72\x26\x15\x7b\xa6\x7b\x68\xb2\x32\x83\xae\xcd\xd9\x2a\xa8\x51\xb3\xfc\x7c\x35\x5b\xd3\x92\x55\x66\x47\x7d\x5b\x6e\x84\x35\xf7\xe8\xb9\x08\x62\x48\xc3\x36\x23\x2b\xa7\x59\x5e\x16\x02\x62\xa4\x80\xcc\xd0\xf8\x64\x40\x2b\xc6\x06\x84\x1a\xcb\x0f\x68\xb1\xeb\xee\x20\x7a\xbe\xb7\x35\x81\x0b\xdf\xf8\xdd\xd6\xeb\xa9\xac\xbf\xc7\xcb\x1f\x7b\xb5\x00\xd7\x34\x00\x44\x11\x6f\xcf\x5e\xf0\x84\x53\x0c\x9a\x62\x07\xb5\xf8\x10\xbd\xc1\xf3\x56\x6f\xa0\x8b\x18\x0d\x95\x78\x7b\xf6\xd6\xc8\xe5\x73\xeb\x75\x60\x80\x52\x9e\x25\x15\xe5\x74\x34\x27\x34\xbf\x98\x1d\x8f\x33\xc6\x72\x63\x6c\xcc\xf1\xa6\xf8\x65\x2b\x8a\xcf\x35\x3b\xe5\x60\xc5\x8c\x28\x45\xec\x73\x9e\x89\xcd\x2f\x12\xa4\xb5\xdc\x91\x3d\x20\x8a\xe5\xfe\x6c\xfe\x2b\x01\xd7\x1f\xc0\x18\xf5\x8b\x85\x20\xa6\xf6\x60\xea\x1d\xce\x8b\x4d\x2e\x5e\x94\x87\x5a\x20\x64\xdc\xf1\xe8\x57\xd8\x87\xff\x95\xd7\x45\x59\x89\x09\xe2\x0f\xb6\x00\xc0\x95\x21\x71\x4c\xe0\xe0\xa0\x8e\xf6\x0b\x33\x2b\xec\x06\x00\x3b\xf2\x99\x72\xb6\x53\x68\xf4\x05\xae\x64\x28\xf0\x2c\x0c\xb3\x08\x79\x0a\x3f\x4f\xdf\xc5\xf9\x2b\x68\x47\x16\xd7\x67\xae\xfe\x33\x34\x06\x39\xdb\xf3\x4a\x49\x9e\xe7\xb7\x67\xe5\x8d\xa8\x72\x94\xa1\x9f\xf1\xe2\x4c\xbc\x93\x35\x14\x41\x40\xdd\xdf\x75\x17\x1b\x3e\xe5\x9b\xcd\xab\xf2\x39\x6a\xf2\xe2\x18\x74\xf8\xbe\x01\x88\x15\xb9\x45\xba\xfa\x57\xe2\x9d\x8a\x1a\x63\x00\xfb\x2d\xff\xd6\x20\xe4\x01\x42\x02\xf4\x37\x03\xd5\x96\x67\x0d\x53\x0f\x18\xc2\x54\xe4\x2e\x8b\x63\x6f\x6a\xe2\x78\x94\x9d\x88\x66\xf2\x87\x4a\x2a\xc2\x58\xd6\x86\x22\x43\xa1\x7b\x1c\x27\x25\xc0\xab\x06\xd5\x80\x79\x34\xce\x22\x5c\x6b\xb3\x53\x91\xa8\x8a\x38\x36\x41\xbb\x7e\x11\xfc\xcd\x4b\xa1\x20\xde\x8b\x67\x5d\x03\xcf\x86\xf7\x37\x6c\x77\x93\x97\x90\x05\xc4\x5f\x09\xbc\xf0\xf4\xfe\xaa\x3b\xd6\x3d\xcb\xd0\xa0\x07\x0e\xbb\x22\x69\x98\x2b\xb4\xea\xe9\x14\x31\xac\xec\x4a\xad\x49\x0a\x90\x5c\xba\x21\xbe\xd9\x74\x1a\x22\x54\x59\x6f\x3c\xae\x14\xcf\xb6\x20\xce\x15\xa4\x49\x2a\x04\x0a\x52\x09\xa7\xb5\xb3\x6b\x04\xeb\x51\x13\x85\xd5\x6c\xbb\x65\x61\xd3\xac\xc5\x98\x77\x1d\xd0\xf1\xb8\x6e\x3a\x53\xfd\x3e\x6b\x27\x45\xee\x3e\x53\x06\x35\xf4\x6b\x91\x28\x3a\x23\x58\x85\x3e\xfe\xdf\x15\x60\x95\x1a\xc7\x57\x22\xe1\x43\xe6\xaa\xb4\xcf\x17\x9b\xa2\x09\x56\xe3\x19\x3c\xbd\x01\x1b\xc8\x24\x74\x80\x71\xaf\x7f\x9b\x1c\xb8\x4a\xa3\x2c\x4e\x57\x68\xb6\x7e\x42\x3a\x03\x4c\xb8\x7d\x62\x28\x37\xb6\xaf\xb0\xe1\x32\x38\xc8\xfa\x72\xcf\x4e\x69\x83\x82\x63\x7f\x55\x25\x19\xed\x4c\x53\x2b\x18\xf5\xa0\xf7\xf5\x75\x54\x2b\x5e\xa9\x97\xea\x36\x87\xbf\x44\xb1\x71\xbf\xb3\x1a\xee\x2b\x6e\x6f\x28\xf8\x4b\x49\x95\xb7\x10\x90\x07\xb3\xbe\x8b\xc3\xb9\x59\xd5\xc5\x01\x75\xc8\x19\x3d\x38\x2d\x88\x1d\x4c\x1c\x4b\x9e\x64\xfa\x45\x85\xe7\x3b\xa3\x11\xee\x20\xf4\x8b\xa5\x19\xe5\xce\x72\x9b\x37\x6f\xef\xa5\xf5\x1c\xbe\x59\xdf\xc2\x78\x90\x0e\x14\xf8\xda\xe8\xc9\x03\x35\x74\x1c\x43\x24\x6c\xfa\x54\x60\x64\xe7\x08\x5a\x88\x48\x80\x4b\x07\x06\x66\xe0\x92\xbb\x29\x82\x6c\xb4\x40\xed\x62\x01\x1e\xfd\x2d\xe1\x8f\x5e\x5d\x06\x1c\x17\x6d\xf0\xbb\xe2\x33\x30\x66\xb3\x56\xf8\xad\xec\x06\x4c\xda\x9e\xab\x24\xf7\x0f\x19\x45\x6a\x51\xf7\x3d\x10\x11\x6c\x96\x40\x04\xfe\x2a\x92\x9c\xd8\x49\x4e\x2d\x08\xe4\x08\x0c\xb7\xc1\x9e\x07\x32\x58\x54\x1c\x34\x3b\xd3\x04\x82\x49\x27\x34\x68\x8c\xbd\xe8\xb6\x5e\x5a\x91\xb2\x2d\x1a\x76\x22\x8e\x47\x3e\x61\x07\x4e\x18\x70\xf0\x72\x9a\x7b\x51\x97\x08\x69\x30\x9c\x59\xaf\xf4\xb0\xee\xb5\x13\xfd\x64\x68\x02\x9d\x26\xe1\x0f\x5f\xe4\xb6\xaa\xd7\x84\x1e\xd8\x2f\x2a\xc9\xc8\xe2\x70\x21\xba\xf7\xb7\x53\xc8\xf6\xbe\xb0\x8c\x9e\xc8\xcd\x0e\xfd\x2f\xad\xa2\x96\x34\x8e\x6b\x18\x18\xdf\x15\x12\xea\xa0\x5e\xe8\x8d\xc2\xe2\x59\xf4\xb6\xaf\xbe\x58\x50\x5a\x6b\x8e\x4c\xbb\x8f\x9d\x22\x2d\xe9\xa5\xb1\xd1\x5c\xf3\x0d\x12\xf5\x0e\x19\x72\x11\xc8\x16\xe0\x11\xeb\xb1\x04\x60\xdb\x10\xc7\xff\x6c\xe3\xf1\x22\xaf\x6b\x1a\xb4\x6c\xb8\xb9\xff\x1a\x1a\x1c\x47\x7d\x30\x3a\x54\xb4\x41\xfd\x8d\xe3\xe8\xb2\x2c\xdf\xe8\x46\x23\x23\x76\xd6\x25\xf4\xac\xb3\xb9\x67\x8f\xa2\x3b\x80\xdc\xd5\xc0\xfa\x06\xd1\x1e\xcc\xe2\x82\xfa\xeb\xb9\x0a\x5d\x07\xcc\x01\x71\xec\x5b\x6e\xf7\x78\xc1\x2a\x95\xa8\x25\x4f\x7f\x15\x09\xb7\xf0\x78\x84\x4e\xe6\x8c\x89\x36\xbe\xa6\x5f\x10\x8e\x4c\xd5\x2d\xa6\x4a\x42\x83\x32\x55\xd3\x9a\x5a\xfb\xda\xc2\xee\x0c\x7d\x10\x7f\x05\xf7\xcb\x64\x8e\x88\x1d\xf8\xa5\xf2\xef\xad\x05\x04\x09\xad\x8e\xc7\x42\x26\x15\xed\x54\x25\x2d\x01\xc4\x41\xfd\x63\xf5\xe0\xec\x55\xa1\x29\x61\x98\x94\x3c\x8e\x93\x3f\x0a\x7d\x49\x54\xa7\x1c\x93\xaa\x41\x36\xab\x2d\xd0\x7d\x68\xa8\x3e\xf3\x05\x9a\x82\x90\x36\x60\x1b\xb2\x72\x56\xa4\x69\xff\x5e\x14\x3d\xe6\xb0\xd6\xcc\x61\x41\x26\xe5\xa2\x86\xbb\x42\x52\x2b\x32\x1b\xd7\x00\x1e\x54\xb9\x1d\x6b\xf9\xb9\x8a\x0a\x30\xec\x0a\xe6\xb7\xa5\x39\xba\xd8\xa6\xa3\xde\x8e\xf2\xcf\xd0\xce\xda\x6b\x78\x49\xe6\x59\x48\x46\x46\xd0\x83\x71\xa5\x5f\x40\x2f\x6a\x6b\xd9\x3c\xf4\x0d\xb7\x1f\x06\x53\x83\xaf\x3f\x15\xdb\xb0\xec\x89\x0f\x9e\x8e\x1d\xaa\xf0\xd5\x1b\x16\xe4\x21\x1c\xef\x46\x9c\x1a\x6f\x5f\x33\xf2\x97\x97\x46\x05\xa1\x73\x42\xff\xfb\x49\x19\x9e\x93\xc1\xe4\xde\xa8\x80\xf9\x7e\x6b\x98\xef\x17\x83\x7c\xf7\xce\x14\xf5\x10\x51\x79\x75\xdb\xd3\x30\xdc\xab\x6f\xf4\xf8\xf1\x6f\x78\x80\x1e\xa9\x0f\x98\xee\x5c\x9d\x84\xe6\x5b\x26\x9a\x43\x69\xd2\x7d\xe3\xb1\x21\x03\x3e\x27\x2c\xf4\xf4\xa6\xef\x78\x28\x5a\xf7\xa9\x50\xa3\x02\x43\x40\xdb\x55\x61\x47\xa5\x67\x16\xcc\x20\x83\x94\xa1\x06\x2b\xb7\x0b\x48\x0f\xdf\xc1\xcc\xd8\x40\x0c\x26\xf7\x6d\x25\xd7\x0b\x6b\xc6\xcc\xe1\x3d\x00\xda\xd2\xd3\x74\xd0\xb6\x9e\x40\x86\xa5\xd7\xac\x33\xe3\xe0\xaf\x9a\x14\xa4\x79\xf1\x5f\x13\x64\x27\x5f\xba\xc5\x00\x96\x6d\x67\x7c\xe3\xb1\x20\x7e\xfa\x4a\xac\xed\xab\xb4\xe8\x50\x65\xba\xf3\x2f\xde\xf3\x4c\xf9\x1a\x2f\xbb\x08\x70\x0d\xa3\x3a\xf1\x89\x48\x5e\x98\xfd\xfa\x2f\xce\x66\xf4\xf3\x76\xd3\x9e\x89\xc4\x88\x23\x0c\x5a\x19\x4a\xd6\x7d\x43\x27\xef\x69\x11\x6f\x83\xfc\x0b\x7c\x1e\x2b\x78\x63\x66\x84\xbe\xe4\x88\x47\x01\xdd\xb7\xfa\x9d\x95\x81\xa0\x8b\x30\xee\x0a\x59\x93\xb5\x8d\xa3\xaf\x37\x2e\x33\x7a\x62\x27\x18\x65\xde\x9f\xc0\xff\x1b\xca\xc1\x27\x0a\x30\x21\x17\xbc\xf0\xe0\xad\x4c\x72\x60\x2c\x86\xa2\xbc\x9e\x0d\x56\x65\xec\x77\x2b\x05\xbc\x2d\x4a\xfc\x6a\x91\xb3\x17\x32\xb1\x5a\x09\xc3\xed\x00\xbf\xfa\x4c\x26\xc8\xd1\xb5\x02\xb3\x7f\xf1\xb6\x39\xf4\xc5\xf5\x75\xab\x2f\xc5\x9e\x49\x23\x69\x73\xb0\x67\x06\x9a\x8c\x2f\xe1\x47\x1a\xe5\xaa\x8a\x2c\xbd\xa4\x44\x01\x81\x2e\x4e\x18\xf6\x60\x07\x43\xdb\x9e\xef\x25\x4e\xb4\xc1\xea\xf2\xed\xaa\x1a\x80\x8e\x80\xaf\x38\xa2\x9f\x48\xb3\x48\x3e\xf7\x55\xa7\x42\x24\xbe\x2a\x95\xde\x65\x65\x51\xab\xea\x90\xa9\xb2\x4a\x3f\xe7\xa0\x0d\xe8\x29\x03\x8a\x25\x4e\x00\x4a\xe8\x27\xed\x2a\x52\x35\x11\xb4\x20\xa9\xf7\xd9\xff\xe8\x7e\x8e\x9d\x52\x8d\xb6\xea\xb7\x93\xea\x76\x6b\x27\x11\x68\x97\x8b\x31\x03\x05\xb3\x6f\x86\x11\xa8\xca\x82\x6e\xd1\x82\x58\xf5\xef\x90\xe6\x37\x50\xba\x06\x05\x49\x43\xaf\x85\xfa\x99\xe7\x87\x50\xed\x88\xf7\xe2\x0f\x86\xc1\x7a\xcf\x20\x89\x43\xa3\x66\x8c\x89\xa5\x4a\xd5\xf4\x8f\x52\x16\x89\x38\x1e\xfd\xad\xc2\x2b\xae\xca\x2a\x21\xa4\xa1\xb5\x6d\x93\xcb\xa4\xdf\x6c\xa5\xfc\x69\x75\xf4\x55\xb7\xd9\xc9\x7c\xb1\xe1\xfe\xe6\x50\xc6\xda\xb6\xa0\x1f\x99\x8e\x17\x43\x06\xb7\xdd\x5d\x26\x88\x13\x5a\xd9\x7e\x45\xf4\xea\x90\xe7\xe9\x68\x86\x88\x6c\x78\x10\x77\x71\xfc\x5d\x65\x34\x72\x3b\x3a\x03\x53\xe2\x76\xfb\x29\xd8\x7e\x84\x1a\xd9\x22\x44\x25\x4e\xfb\xc8\x13\xd7\xa6\x84\xa0\x8a\x1d\x94\x99\x5e\x3d\xc2\x62\x69\xff\xd4\x1b\x8c\x56\xb8\x32\x43\xd5\x58\xa1\xd4\x3f\xcd\x20\x6d\x39\x41\x68\x5b\x63\xb0\x26\xc5\xb2\x4a\x2b\x5c\x93\x28\x82\xbf\xa3\x28\x2d\x4e\xae\xce\xb5\x80\x99\x19\xd8\x10\x50\xc0\x7c\x7e\x0e\xf2\x51\x3f\xd4\x48\x1c\xa3\x45\x95\xab\x01\xb3\xa4\x5d\xa2\xc7\xf5\xd7\xde\xb8\x76\xb9\x44\xdb\x38\x02\xe5\xa4\x03\xef\xeb\xaf\xa8\xd3\x0e\x9a\xf8\x59\xd6\x07\x8e\xd1\x02\x06\x8a\xf4\xcc\xb0\x90\xa5\x69\x5b\x25\xf4\x0f\x05\x95\xea\xb9\x78\x5a\x1e\x0a\x75\xbf\xa1\x85\x33\x81\x3c\x95\x0d\x32\x34\xd4\xd2\x26\xf7\x66\xf3\x37\x74\x43\x0d\x6d\x33\x34\xf0\x76\x9d\x61\xf4\x28\xff\x3a\xb5\x48\x01\x2c\x43\x18\xc3\x46\x1c\x8f\xd1\x56\xf0\x4d\x04\x87\x15\x81\xc4\x23\xb4\x2f\x32\x49\xf8\x47\x1a\x89\x02\x32\x1d\x8f\x91\x2a\xf1\x87\x3d\xe2\x00\x4e\x9e\x5a\x04\x75\x3d\x71\x75\xeb\x78\x5b\x9f\x9c\x3d\xe7\x6a\xd1\xd0\x1e\x3e\xca\x7d\x85\x06\xc0\x54\xe0\x12\x31\x73\x10\xdc\x22\x78\x44\x7e\x95\xe1\xe1\xe8\xef\x01\x40\x26\xa7\xea\x78\x9c\x91\x54\x10\x13\x7a\x4d\x9f\x60\xdf\x87\xf8\x43\xaa\xf6\xcf\xdd\xf1\x28\x08\xd6\x82\x8f\xdd\xbd\x15\xfd\xb3\x5f\x91\x8a\x63\xff\x56\x18\xa8\xa8\xee\xd6\x44\xee\x7e\x30\xf5\x6c\xbc\x7a\x86\x4a\x7e\x76\xfb\xfe\xb2\x5f\x27\x9d\x95\x82\xe3\xa1\xba\xf3\xd2\xeb\x85\xf3\xce\xf5\x5d\xc9\x4e\x21\x81\x49\x40\x58\x92\x3e\x78\x0a\x76\x7c\x25\x03\xfc\x94\x36\x51\x6f\xd2\xe3\xd1\xff\x6e\xc9\x32\xa4\x1c\x3c\x73\x73\x07\x2d\x1f\x9c\x03\xf4\xbb\x69\x6f\xec\xe7\xd2\xdd\xe4\x95\x99\xea\x86\x50\xbe\xb9\x7f\xc5\x3c\x93\xa8\x21\xf0\xa6\x2a\x40\x61\x3f\xb5\x3f\x4e\xf5\xa2\xf2\xe0\x9f\x61\xe5\xfd\x40\xfa\xc3\x46\x41\xf6\x65\xf4\x96\xab\x13\xaa\xd4\xc3\x8c\xb7\xef\x45\xa1\xe9\x0a\x13\x7b\x00\x7e\x43\xa0\x81\x85\x62\x6a\xa9\xac\x06\x41\x92\x54\x36\xff\xe9\xab\x7e\x2d\x06\xef\x80\x80\xd5\x5a\xad\xff\x37\xfb\x0c\x3a\x42\x0c\xca\x24\xef\xef\x1d\xa1\x9a\x9c\x62\xb2\x45\x61\xb0\x2f\xf5\xd0\x14\x9f\x04\xb3\xeb\x2e\x7d\x77\x43\x1b\xb5\x7a\xb7\xea\x1a\x1d\x57\x8e\xc7\x68\x0c\xa1\x4f\x23\xd2\x6f\x7e\xf0\x48\x75\xba\x60\x9b\x37\x02\x6a\x79\x1a\x24\x46\xb6\x60\x2f\x0b\x00\x33\x33\xf4\xb3\x0b\x7e\x51\xa6\x18\x61\xe2\x04\x4d\xb4\xe2\x6b\x47\x16\x15\x4d\xd3\xda\x9f\xab\x38\x86\x77\x01\x1c\xeb\xde\xd3\xdd\x90\x71\xe7\x4c\x9a\xc0\xde\xca\x0f\xec\x6d\xe4\x4e\x0a\xe1\x55\x3e\x97\x26\x30\x06\xb0\x5e\x34\xd3\x09\xdf\xc8\xa4\x24\xc8\x8a\xc9\x2b\xf0\x3a\x55\x25\xe5\x2c\xa3\x11\x87\xe0\xdc\x11\x63\x85\x75\xff\x0e\x80\x6e\x72\xe3\x08\x7e\x40\x8b\xf7\x83\xbd\x3b\xce\x67\x8b\x6a\x95\xbb\xeb\x67\xb3\xcc\xd2\x9a\x6e\x96\x75\x9a\x19\xb8\x43\xff\x6b\x4d\x6b\xd2\x09\x94\xd1\xc7\x7a\x6b\x12\x23\x99\x55\x84\xd6\xbe\x5f\x76\x7d\xc1\x66\x8b\x7a\x32\x21\x96\x54\xad\x56\xf5\x9a\x2c\xca\xa5\x30\x7f\x97\x86\x9d\xd0\xe4\xe5\x2b\x47\x5e\xea\xe3\x7f\x28\x36\x65\xb0\x27\xc8\xdd\xde\x14\x42\xcf\x60\x24\x37\x4f\x67\xd2\xdf\x22\x5b\xd3\xf0\xbd\xd6\xad\x12\xa0\xb3\xb1\xd6\xf7\x16\x80\xea\x4d\x81\x5a\xa8\xcf\xe1\xb5\x91\xc5\x75\x70\xf2\x7d\xc6\x4f\xc0\x15\x31\x90\x2f\x7c\xf0\x31\x77\x43\x0d\x6b\xda\xb5\x7b\x6d\xc5\x0e\x3e\x03\x4b\xbb\x36\xe7\x9e\xf2\x0e\x2e\x14\x03\xe2\x5b\xb5\xc8\xb3\xe3\xb1\x5a\x74\x9d\x37\x02\xa5\x1f\x1c\x6b\x9b\xa6\x9f\x9e\xb6\x64\x61\x48\xaa\x3b\x58\x24\x85\xcb\x50\x34\x9a\x7e\x6b\x75\x84\xe9\xa0\x00\x79\x31\xc4\x77\xfb\x69\x00\x1f\x0d\x53\xec\xcb\xa5\x5c\x3c\x3f\x5b\xd2\x69\x2a\x81\x47\x69\xe8\x8e\x57\x6f\x9e\xe6\x82\x17\x7e\xb3\x83\x22\x04\x4c\x04\x11\x6d\x9b\x9a\x40\x25\xdd\xd4\x21\x3a\x54\x58\x25\x86\x0f\x61\x67\x71\xbd\x3b\xb0\x76\x43\xc9\x9e\x2b\x79\x28\x84\x08\x21\x86\xeb\xce\x60\x44\xc7\x80\xbe\x57\x86\x31\x77\xfb\x77\x46\x8c\x6f\xd3\xc0\xaa\x98\x45\x04\xd7\xfa\xd7\xe1\x2a\x18\xb4\x3c\xe3\x77\xdf\xfd\x68\x21\xef\x80\x0a\xed\x55\x1c\x92\xe2\xf7\x2d\xf5\x42\x21\xec\xfa\x6b\x8b\x5a\xed\x88\x09\x87\x64\x4f\x95\x05\x63\x87\x4c\x66\x87\xf6\xb2\x41\x4f\x30\xa2\x2f\x8a\x74\x87\x9e\x13\x33\x81\x4f\x1d\x13\x6a\xdd\x84\x7b\x4e\x91\x95\x0b\x90\xde\xca\x8d\x3b\x29\xec\xae\x69\x81\x6f\x11\xb6\x72\x54\xc4\xb1\x14\x68\x65\xd8\xcd\x8d\xeb\x3d\x9a\x35\xfa\xbe\x80\x63\x82\xbd\x1d\x96\x01\xb4\x27\x25\x8c\xea\x02\x78\xc6\x41\xc5\x71\xdc\x49\x58\x89\x75\x1c\xeb\x21\xd2\x62\x60\x7c\xad\x67\x77\xaf\x94\x51\x01\x8b\xa4\xf3\x09\x60\xb5\xee\x19\x4d\x43\x80\x71\xfc\xaa\xb8\x2a\xfb\x7b\x00\x22\xea\xf7\x98\x0f\x2b\x84\x74\x24\x22\x3a\xb6\xd1\x80\x2b\x25\x3e\xe2\x8a\x0b\x44\x81\x64\x6f\xa2\x18\x30\xc2\x41\x1e\x7b\x29\xe9\xde\xa4\x8a\xa2\x05\x53\x2a\xf0\x89\xc7\x20\x2d\x34\x18\x46\xda\x59\x24\xc8\xf9\x34\xe7\x75\x6d\xb2\xc3\x6f\x7a\x79\x6d\xd3\xcc\x2f\xfa\xb6\xe2\x7b\x9b\xe6\x7e\x53\x63\x37\x99\x3a\x83\xcd\xa6\xd1\x24\x35\x28\x5e\x21\xf3\x7f\xb2\x25\x19\x53\x4b\xfb\x3b\x8d\xc0\xec\x61\x68\x9b\xa2\x0a\x1d\x32\xbb\x0e\x47\x69\x74\xc9\xb3\x37\xd7\x96\x3a\x50\xcb\xc8\x74\x3c\x4a\x07\xaa\xb7\x5f\xdc\x40\x22\xb0\x48\x5a\x55\x6b\x58\xa6\xdf\x13\x10\x23\xd5\x0a\x93\xda\x58\x79\xfa\xcf\x31\x8b\xce\xa2\x71\x61\x2c\x74\xc1\xaa\x76\xe1\xfc\x38\xf0\x29\xdd\x95\x37\xe2\xff\x7f\x53\x40\x8d\x93\x96\xde\xa7\xb2\x1d\xb3\xdb\x80\x05\xc1\xd1\xea\x6d\xe7\xec\xba\x39\x78\x79\xab\x6c\x0b\x93\x86\xe8\xd7\xbc\x2d\x7c\x63\x60\x9b\x21\x62\xfd\x98\xaf\x66\x6b\x17\xf6\x0e\x88\xf3\x16\x18\x10\xb3\x90\x71\x62\x7e\xc5\x71\x3e\x62\x16\x25\x68\x19\x9d\x45\x69\x14\x91\xb1\x2d\x90\x93\xe3\x11\xce\x48\x30\xf3\x66\xe7\xa1\x85\xe9\x3d\xf3\xde\x17\xd2\x21\x45\xa0\xef\xeb\x9f\xd1\x76\xb7\x22\x00\xdf\x92\xed\x16\x6d\x58\x53\x39\x2d\xca\xe7\x18\x79\x16\x34\x34\xd6\xd2\x20\x0c\x22\x3d\x23\xd4\xf8\x08\x5a\xa3\x5f\xda\xd7\x36\x29\x7b\x5e\x40\x39\x67\xad\x8f\x57\x6b\xd2\x4e\xb7\x75\x94\x78\xa2\x96\x85\x85\x54\x49\x9d\x85\xbd\x63\x7f\x2d\x0f\xe5\x1b\x28\xb7\x45\x09\xa1\x33\x2a\xad\x83\x05\x53\x94\xa3\x1d\x48\x1b\x0a\xa8\x62\x68\xe3\x2d\x5a\x4d\xc5\x02\xcc\xb1\xac\x0b\xc0\xf8\x4d\x91\x48\x42\x68\x05\x86\xdd\xdc\x69\x80\x09\x86\xec\xef\x69\xa3\xbd\x25\xd1\xad\x6d\x8a\x84\xfb\x86\xbf\xc6\x7a\x88\x53\xd9\x97\xd0\xa8\xa5\x4a\xc1\x39\x92\x50\xd9\x38\xa9\x29\xb2\xc6\xed\xa9\x32\xcb\x1b\xba\x90\x59\xd3\x07\x6a\xad\x10\x7b\xbc\x9d\x0d\x82\xc6\xef\x91\xa1\xd2\x02\x8c\x9b\xc1\x08\xe2\x78\x8c\x2a\x74\xf8\x86\x87\xf6\x33\x63\x27\xd1\x91\xb6\xe3\x72\xde\xf9\xf6\xa5\xa9\x72\xa0\x8c\x0a\x6c\xeb\x5f\xdd\xee\xc5\xd2\xae\x72\xaa\x08\x6d\x8d\x40\x11\xf5\xbe\xfd\x9b\x86\xc6\xaf\xe9\x68\x4e\xd1\xe6\x18\x33\xe2\x6f\xda\x33\x54\xc5\xaf\xbd\x64\x87\x34\x67\x07\x2d\x98\x37\x6c\xbd\xcd\x5b\xf3\x0f\xd2\x50\xa7\x7f\x7d\xa2\x06\x28\x1b\xe0\xe3\xed\x5b\x95\xf8\x35\x11\xb4\x66\xf0\x4d\x3d\x16\xa1\x6f\x42\xc8\xed\x7b\x7e\x15\x9a\xb3\x5f\xb8\x0d\x8f\x78\x97\xd2\x80\x5d\x42\xd8\x38\x37\x95\x12\xf0\x2d\x25\x80\x5b\x9a\x2f\x26\x5c\x80\xb4\x96\x8d\xa8\x31\xd5\x99\x0c\xba\xbd\xc7\xfa\xbb\xb1\xf5\xf6\x45\x30\x27\xbe\x88\x7e\x71\xe3\x03\x8c\x83\xb5\x9c\x4f\x8e\x02\x95\x22\x2c\x3a\x61\xd7\xba\xd1\x59\x8d\xf1\xee\xb4\xe4\xe4\x04\x96\x7f\x69\x59\x63\xc4\xf1\x5f\x8c\x8c\xb5\x4b\x0d\xd6\x2e\x92\x31\xeb\xa6\xae\x87\x7f\x01\xc9\x78\x09\x32\x56\x1b\x4b\x1a\x08\x8b\x86\xa8\x08\xb6\xac\xf9\xd0\xc2\x64\x62\x12\x22\x84\x42\x40\xb9\xe2\x78\x2c\x12\x17\x11\x80\xc4\xb1\x11\x6a\xd5\xdd\x79\x75\x79\x9a\xf1\x58\xea\x23\x09\x44\xf6\x93\x3c\xef\x4c\xac\xe5\x7d\x56\xeb\xfe\x84\x0d\x5d\x85\xff\xc9\xbe\x31\x26\x2c\x56\x38\xa4\x27\x03\x25\x70\x3a\xc5\x76\x8f\x50\xd1\xd0\x7d\x59\x7f\x51\x95\xc8\xad\xf7\xb7\x73\xa0\x61\xf2\xbd\x24\x3c\x11\x92\x63\x26\x4f\x0e\xc2\x99\x3e\x49\x5f\xeb\x34\x06\x68\x0d\x7e\xe1\x70\x4f\x34\x9d\x37\x9a\x2d\xc4\x84\x71\x3a\x1e\x17\x4d\x7b\xe5\x80\xee\x4a\x11\x50\x19\x6e\xc4\x3b\xdd\xe1\xae\x2e\x00\x4f\x5f\xe7\xc0\x65\xdb\x85\xb5\xeb\x37\x8a\x78\x18\x08\xa0\x53\x6d\xdb\x58\x98\xb3\x85\x67\x1f\xf9\xa1\xa3\xf3\xe6\xc5\x6c\xef\x80\xbd\x1f\x87\xc1\x3a\x61\x38\xaa\xa1\x59\xb9\x1f\xe2\x87\xc0\x24\x9d\x27\x1f\xaa\x57\xec\xea\x9e\x7b\x05\xcc\x20\x3a\x2a\x68\x2f\xf8\xfd\xa0\xbe\xfd\x55\xb9\xa7\xca\xd7\xbd\xab\x50\x17\xaf\x3f\x8a\xbc\x15\xb6\x29\x4f\x73\x0d\xcc\x6f\xc0\x06\x62\x58\xac\x1e\x77\x08\xc9\x50\x93\xe5\x0f\x13\xab\x3d\x6b\x4d\x88\x61\xae\xd0\x1b\xe3\x59\x99\x85\x8f\x98\x66\xb8\x80\xc5\xf2\x58\x49\x13\xfa\x65\x50\x1d\xba\xb0\x01\x14\xed\x49\x80\x83\x6d\x11\x33\xd0\x86\xce\x66\xd1\x57\x88\xfe\xf7\xbc\x00\x7b\x3b\x01\xe0\x82\xad\x63\x9e\xbf\x44\xb4\x20\x14\x31\x68\x0c\x6f\xed\x2f\xc7\x07\xad\x82\xf0\xa2\xb8\x81\x8f\x8b\x65\x88\x43\xa1\x87\x33\x7c\x7a\x03\x90\x18\xde\x5f\x9e\x6d\xd2\xdd\xa6\xcc\xd2\x8a\xb6\x15\xa6\x7e\xed\xfa\x16\x72\x65\x20\x2b\x8c\xc1\x3a\xb9\xa4\xa3\xd9\xc9\x92\x6b\x7a\x52\x3d\xdf\x05\x80\xb7\x5a\x00\xeb\x0c\x8d\x96\xc6\x48\x20\x1a\xcb\x24\x69\xe6\x3b\x0f\xd2\x0c\x82\xa3\x54\xe0\x56\x63\x05\x9f\xe0\xce\xc3\x69\x4e\x2b\xab\xb0\x6b\x7f\x01\xe9\x41\x16\x95\x33\xac\x81\x49\x28\x09\x2d\xad\x41\x50\xd5\x00\x94\xce\x37\xf8\xa4\x13\xb8\x86\x0f\x85\x9e\x83\xee\x86\xd2\x37\x84\x6f\xf0\xf2\x3c\x07\x2d\x28\xda\x9c\x52\x6f\xba\xc9\x80\xcf\x71\xd7\x91\x48\x11\xcf\x7a\xed\x8d\xd8\xac\xd4\x1a\x9c\xad\x98\x87\x47\xa1\x0b\x18\xfa\x54\x51\x08\x39\xe8\x3a\x86\x9d\xa5\xef\x78\xe2\x3a\xde\xe2\x03\x3a\xc1\x16\x0b\x77\x88\x79\x21\x56\x18\xb9\xe7\x54\x88\xb5\xc2\xa2\xcd\xc9\x8d\x89\xa7\x26\x86\x8d\x5c\x42\x07\x00\x36\x24\xfe\xc1\xbd\x1f\xca\x7c\x7a\x19\x2d\x32\x88\x75\x2e\xfd\xc6\x1e\xe7\xf0\xe2\xb6\x32\x3d\xa3\xbd\x7d\x51\x6e\x4e\xaa\x85\xf5\x09\x43\x51\xe9\x46\x2a\x5f\xc5\x1b\x66\xcb\x76\x0d\x6d\x45\xf6\x27\x05\x65\xe6\x74\x2e\x0d\x6a\x4e\xe2\x27\x92\xf4\x95\x70\x8a\x6f\xf7\x1a\xdc\x87\x24\xf1\x52\xec\x8f\xc7\xe8\xb7\x22\x02\x32\xf8\x99\x3d\xec\x5d\x21\x0e\xd8\xfe\x8c\x18\x2a\xda\xc1\x04\x88\x50\x61\x22\xcf\xbb\x1b\xc2\x19\x43\x3b\xdb\x21\xeb\xab\xd7\x0d\xe4\xeb\x6e\x92\x36\x24\x6c\xe3\x99\x65\xf8\x59\xbb\xde\x97\x18\x9f\x11\xa3\x28\x1a\x31\x3d\x60\xef\x69\x16\x91\x4c\x85\x35\xcc\xf4\xad\x86\xa0\x7d\xb8\x0e\xbf\xe2\x6c\xd6\x1a\x28\xbe\xe2\x1d\xf9\x94\xbc\x4a\xbe\xe3\x89\x22\x74\xb4\xd3\x7b\x5c\x90\x38\x1e\xfd\x5e\x24\xca\xa1\xac\x09\x42\xee\x5e\x02\x76\x99\x3e\x6c\x5f\xf1\x36\xdc\x86\x8d\x3c\xbd\xad\x74\x41\xd8\xa7\x00\xd3\xc6\x15\x7f\x55\xf1\xa2\xbe\x12\xfa\x62\xc9\x05\xd2\x40\x71\x3c\x52\x53\x59\xff\x68\xbc\x58\x12\x42\xac\xbb\xa2\x35\x08\x35\xee\x49\x5f\xc8\x5c\xe8\x5c\xa2\x0a\x92\x06\x30\x63\x29\x67\x4f\xaa\x8a\xdf\x26\x92\xd0\x92\xcd\x68\xed\x1b\x04\x8e\xc7\x25\xc4\x3f\xa9\x64\xa2\xba\xb6\xcb\xc2\xa8\x92\x0a\x20\x41\xc0\x0a\xb2\x20\xe8\xfb\x65\xe0\xae\xc0\x03\xb8\xd5\x25\x71\x3d\x90\x13\x2b\x6a\x1e\xa4\x86\xa0\xf6\x0e\xcb\xf6\x75\x77\xd6\x3e\x67\xcf\x6b\x25\xa2\x06\xec\x7e\xa0\x65\xcd\xb8\xd8\xdf\x2f\x50\xe5\x6a\x7b\xe4\x7e\x43\x54\x72\xa2\x57\x5c\x73\x84\x99\x6f\x54\x58\x18\xbc\x41\xeb\xcb\xc0\xf3\xbc\x7c\xfb\xac\x2a\xf7\x7a\xd2\x34\xa3\x56\x5b\x8c\xcb\xfb\xf2\x50\x81\xf7\x34\xa9\x13\x2f\x3e\x15\x3e\xa5\xed\x82\x2c\xaa\x69\x59\x88\xaa\x2a\xab\x21\x40\x1a\xdd\x35\x9d\x21\x2f\xf9\x80\xe1\x79\x35\xad\x44\x7d\xc8\xd5\xe2\xc1\xea\xb7\x77\xb3\xd9\xe4\xb7\x77\xb3\xbf\xff\xf6\x6e\x26\x26\xbf\xbd\x9b\x5f\xad\xef\x1e\x36\x0f\x8c\x80\x8a\x1c\x8f\x09\x5f\x15\x6b\x26\x08\x35\x75\x56\x82\x6f\x9e\xd4\x9a\x09\x4e\x40\x60\x7d\x60\xb3\xc5\xa1\xc5\x67\x3e\x8c\xc7\x24\x4b\xaa\xd5\x61\x4d\x0f\xa6\xf7\x30\x25\x08\x6b\xbb\xa9\xf8\xf5\xb5\x2c\xae\x75\x71\xcd\x62\xc1\xd2\xfa\x50\x7d\x05\xb9\x98\xcc\x49\x4b\x6f\xf5\x4a\xe9\xcd\x0f\x70\xae\xb5\x50\xaf\xe4\x4e\x94\x07\x95\x0c\xdc\x2f\x4e\x7c\x02\xfa\xd1\xe9\x55\x99\x1d\xa0\xff\x0f\x67\x64\xa1\xaa\x5b\x13\x37\xa0\x73\x40\xae\x85\x7a\xc6\x15\x4f\xa2\x57\xe8\xab\x24\xaf\x12\xe3\x42\xb4\x5d\x9c\x1c\xc4\x68\x28\x79\xaa\x09\x56\x08\x1a\xa0\x19\x23\xdf\x96\x25\x21\x00\x89\xe6\xb6\x58\x01\x38\xeb\x5b\x77\xa2\xf6\x6c\xb6\xd8\x9f\x6f\xdb\xa7\x71\x4f\xae\x6d\xf6\x28\xa2\xdb\xd5\xde\x81\x71\xc1\x6f\xd0\x44\x46\xba\xed\x88\x2c\x54\x4f\x53\x9c\x6c\x9c\x56\x93\x9a\xed\x4e\xe8\xa9\xd9\x69\x32\x90\xb5\x5d\x91\xbb\x00\xff\xf4\x3b\x03\x86\x6f\x0b\xe9\xc6\xd0\x52\x26\x70\xa0\x81\x63\xb6\xe7\x99\x8d\x10\xfc\x74\x2b\xf3\x4d\x32\x54\x8c\xd0\xa1\x54\x13\x28\xdd\x35\xfb\x3d\x37\x64\x86\x8d\xa5\xab\xd7\xe7\xf3\x5c\xe8\x9f\xf5\x67\xb7\x4f\xad\xe3\x9a\x6f\x0e\xf0\x9e\xac\x89\xe7\x9b\x1b\x11\xea\xc5\xc7\x57\x03\xc6\x02\x60\x30\xd9\x16\x58\x40\x00\x27\x23\x2b\x6b\x8a\x36\x64\xd3\x6a\xb6\x9e\x96\x7b\xab\xf7\x1a\x50\x2d\x22\xe1\xe3\x38\x4d\x35\x1e\x13\x91\x14\x2b\xb5\x06\x50\x68\x9d\xe3\x5b\xce\x46\xf3\xf6\x65\xf8\xd1\x7b\x19\xdc\x54\x2d\xd4\x34\xe3\xd9\x56\x6c\x9e\x6e\x79\xf5\x8b\xdc\x68\x2e\xc1\xa4\xe8\x2d\xf7\xdc\x80\x6a\x99\xa4\xef\xf9\x66\x23\x8b\xeb\xe7\x26\xce\xad\x61\x47\x2e\x79\x55\x3f\xcd\xe5\x7e\x2f\x90\xfb\x80\x00\x07\x80\x31\xe1\x54\xf2\x5f\x70\x76\xf7\x28\x8d\xbe\xe7\x87\x5a\x44\xf4\xef\x69\xf4\x19\xcf\xde\xd4\x7a\x5d\x23\xfa\x8f\x34\x7a\xc5\x2f\x23\x3a\x7f\x94\x46\xc6\x53\x72\xfe\x69\x1a\xbd\xdc\xca\x2b\x15\xd1\xf9\xdf\xd2\xe8\xa9\xaa\xf2\x88\xce\xff\x9e\x46\x4f\x72\x9d\xf4\x0f\x57\xd3\xc3\x59\x1a\x3d\xe5\xfb\xfa\x9b\x32\x7b\x13\xd1\x87\x7f\x4b\xa3\xcf\xeb\x2c\xa2\x8f\x1e\xa6\xd1\x4b\xac\xfd\x11\x34\x7b\x2d\x7e\xda\x47\xf4\xd1\x27\xf8\xfb\x59\xf9\xb6\x88\xe8\xa3\xc7\xba\xbd\x4d\x44\x1f\x7d\x9a\x46\xcf\xcb\x9d\xce\xfc\xb7\x34\x82\x48\x29\xf4\xd1\xdf\xd3\x08\x8a\xfc\x23\x8d\x30\x14\x0a\xfd\x64\x96\x46\x58\xf2\x13\x5d\x4f\x25\x0b\xf5\x32\xab\xf4\x9f\x8f\x53\xe3\xbc\x1c\xd1\x4f\x3e\x4d\xa3\x67\x88\x29\x45\x1f\xff\x23\x8d\x16\x11\xfd\x74\x9e\x46\x2c\xa2\xff\x98\xa7\xd1\x8b\x72\x13\xd1\x7f\x3c\xb4\x3f\x1e\x99\x1f\xf3\xd9\xa7\x69\xf4\xb1\xfe\xff\x6f\x90\x75\x3e\xfb\x47\x1a\x4d\x22\x3a\x9f\xcf\xd2\x68\xaa\xff\x9f\xa7\xd1\x83\x88\xce\x75\x4b\x28\xcd\xc5\x01\xcf\xff\xf6\x08\x33\xfe\xfd\x53\x68\x6a\xfe\x77\x53\xc1\xdf\xff\x9e\x46\x54\xff\x6f\x2a\xfa\x87\xa9\xe8\x1f\xa6\x22\xdd\x87\xff\x27\xa2\x0f\xf5\x54\xae\x22\xfa\x50\xcf\xe3\x6f\xbf\xe9\x1f\xf3\x34\x5a\xeb\xff\x1f\xa6\xd1\xff\xe8\xff\x3f\x31\x7d\xfc\xf4\xd1\x43\x3d\xab\x7a\x4e\xf4\xcf\x47\x76\x2e\xf4\x1f\x9f\xd8\x59\xd3\x7f\x3c\x76\x13\xf6\xe9\xa3\x87\x7f\x7b\xd8\x4e\x87\xfe\xf3\x91\x9d\x69\xfd\x87\x9d\x7f\xfd\xfb\xd3\x76\x95\xf4\x9f\x7f\xf3\x17\xea\xd3\x47\x8f\x66\x0f\xdd\x14\x37\xf4\x99\x26\x78\x9e\xf1\xf3\xb9\xfe\x77\x3c\x26\x5f\xf0\xd5\x33\x3e\xfe\xe4\xef\x6b\x86\xbf\xfe\xf1\xe9\x9a\xbd\x04\xdb\xed\xe4\x19\x6f\xfd\x1b\xfe\xe0\xec\xd3\xc7\x8b\x3f\xf8\x39\xfb\xc7\x6c\xf1\x87\x29\xf8\x07\xb7\x79\x81\x1b\xd2\xa7\x40\x1f\xce\xe4\x0f\xaf\xe0\x97\x9c\xcd\x17\x5f\xf2\x73\x36\x7f\xb8\xf8\xd2\x94\xfb\x92\x8f\xe7\xf3\x39\xb4\xf8\x25\x1f\xc3\xb8\xd7\x2c\xfa\x22\x1a\x7f\xc9\x81\x68\xfa\x8b\xb3\x3b\xcf\x6d\xe4\xb3\xe0\xec\x21\x8d\xfb\x60\x92\x2c\x47\x1f\x91\x07\x64\x21\x98\x5a\xb5\x78\xc1\xeb\xd0\x89\x4d\xb3\x5d\x81\x41\xca\x64\xde\x35\x49\xd1\xef\xc8\x83\x7f\x27\xd9\x6e\x73\xdc\x09\xc5\x8f\x3b\xf2\xd1\x03\x89\x8f\x6d\x49\x08\x67\xa3\x99\xf3\xcd\x7d\xf0\x6f\x9e\xe4\x8a\x2c\xfd\x0c\x45\x98\x21\xc9\x8e\x99\xaa\xf2\xa3\x7e\x3e\xab\x32\x0f\xea\xaa\x6c\x56\x50\x0d\x3e\xf8\x77\x9d\xe8\x53\x1a\x56\xd7\x73\xec\xff\xa9\xa8\x44\x56\x5e\x17\xf2\x2f\xb1\x39\xdb\x95\x1b\x79\x25\x45\x75\x56\xf0\x9d\x48\xcf\xa2\xb1\xe6\x37\x21\xc6\x88\x17\x62\x44\x30\x7d\xd2\x27\xd1\x58\x80\x10\x5f\xff\xad\xef\x00\x4c\xe0\x26\x61\xb7\xc1\xbf\x25\xfe\x0d\xf7\x05\xa6\x78\xe1\x56\x7f\xf2\x26\x5e\x2f\x88\x9d\xd9\x33\x59\x9c\x09\x04\x9a\xe8\xa0\xcf\x14\x4e\xcb\x20\x0c\xf8\xf9\x83\x7f\x27\xba\xb3\xc7\x2b\x9e\xe7\x7a\x70\x87\xeb\xed\x31\xd9\x88\x23\x57\x44\xf1\x6c\x4b\x3e\x32\x84\x4d\x41\x82\x40\x42\xd1\x74\x3a\x8d\x18\xab\xc8\x9d\x09\x98\x09\xf5\xb9\x30\x44\x2d\xb5\xfb\x75\x52\x98\x2d\x11\x9d\x45\x84\x7e\xc6\x89\x33\x9d\xea\xdb\x4c\x61\xb8\x14\x5a\xda\x58\x44\x9c\x39\x95\xd3\x64\xbe\x4c\x4a\x6b\x63\x06\x55\xe5\xac\x22\x29\xa4\x39\xa5\xd5\x78\x4e\x82\x0c\xd0\x4b\x62\x5c\xe7\xd4\xaa\x84\x11\x23\x48\x7e\x3d\x62\xf9\x10\x4c\x43\x56\x16\xb5\xac\x95\x28\xd4\xd9\xa5\x04\x2b\x99\xfa\xec\xaa\xac\x60\x2d\x51\xc7\xa8\xeb\x61\x79\xe3\x8d\xdb\x0d\x37\xd3\x33\xaf\x88\x58\x65\x6b\xa6\x56\x99\x93\xb7\x7a\x6b\xf6\x67\x0f\xaf\x32\x51\xec\x9f\x9a\x87\x21\xe0\xd4\xb2\x54\xe8\xdb\x02\x50\xf2\x6a\x25\x50\xff\x37\x67\x8c\x59\x1d\x60\x54\x94\x60\x89\x1b\x79\xeb\xd0\x7e\xdc\x1d\x72\x25\xa3\xd6\x37\x53\x3f\xc1\x89\xb4\x3a\xd3\x08\x75\x12\x9b\x08\xa9\x33\x6f\xd1\x61\x52\xa2\x55\x79\xf9\x87\xc8\xd4\x19\x30\x26\xeb\x68\xc4\xbe\x83\xbf\x03\x40\x46\x73\xa3\xa0\x07\x4e\x50\x85\xa5\x42\x71\x8c\xfe\x27\x44\x30\xb7\xd3\x64\x03\xac\x79\x19\x06\x36\x43\xbf\x16\x08\xfd\x69\xa0\xd0\x73\x17\x44\xca\x27\xbc\x7e\xf1\x4e\x44\xcf\xc5\x45\x2c\x45\xfa\x05\x5f\x89\xe9\x1b\x71\xab\xef\x41\xbb\x3c\xf8\x04\x33\xa6\x8e\x47\x78\x83\xf1\x17\x3e\xd1\xf8\x5b\x3f\x12\xcc\x47\xdf\x7c\xdd\x8d\x46\xd1\x0a\x3c\x79\xae\xbe\x16\xb7\x71\x0c\x55\x81\x77\x73\x70\xe2\x93\x9f\x97\x6a\xaa\x2f\xb2\xaf\xc5\x6d\xaa\xa6\xfa\x32\xfa\x5a\xdc\x92\x38\xc6\x5e\xb8\x02\xed\x95\x00\x25\x4c\xbe\xd4\x95\xd5\x25\x74\xb7\xda\x02\xf6\xca\x18\x15\xa8\x9a\x92\x57\xa6\x23\x38\x12\x97\x71\xf8\x2e\xf9\xa8\x85\xec\xdf\xc6\xf1\xa3\x4f\x18\x73\xf3\x84\x1a\x0e\x5e\x85\x6a\xe4\x82\x0d\xcd\xa5\xe1\x27\x0b\x70\x50\xe7\xb9\xfa\xb2\xe2\xfb\x2d\x74\x23\x79\xd4\xad\x12\xfe\x07\xe1\xa7\xfe\x49\xe8\x6b\x9e\x14\x14\x23\x7f\xb8\x6e\xfd\xd3\x73\x49\x1c\x58\xd0\xbf\xf8\x4a\xac\xfd\x08\xd4\x3f\xf0\x1e\x96\xa6\x63\x99\x9c\xad\xab\x33\x26\x2d\x02\x3f\xc0\x76\x7b\x2a\x8c\x2a\xbd\x68\xb9\x7b\xa9\x34\x17\x5d\x95\x3b\xfa\x43\x52\x91\xa9\x2a\xc9\x39\x9b\x2d\xec\x56\xad\x30\x0a\x87\x91\x2d\xa2\x89\x27\xe5\x36\x58\x0e\xb9\xc3\x9f\xc6\xc1\xda\x02\xe9\x56\x36\x7a\x7b\xd3\x95\x98\xb4\x54\xb0\x67\xc7\xa8\x2e\x34\x4d\x3c\x99\x68\xe6\x46\x58\xe6\xa6\x5a\x29\x13\x60\x06\x7e\xa9\x92\x46\x63\x8b\xfa\xb9\x78\x65\x44\x2e\x6e\x72\xbe\xee\xec\xda\x52\x24\xc6\x26\x45\x8d\x35\x57\xe5\x6c\x89\xce\x67\xc7\x63\x75\x11\xe8\x15\x10\x17\xd7\x8b\x83\xfc\x6b\xa7\x32\xac\x7c\x9a\x6d\xbd\x8a\x8c\xdf\xde\x72\x20\x80\x58\x45\x8b\xf3\xd9\x32\xe2\x57\x68\x5a\x81\x88\x22\x7e\x74\x77\x91\x77\xc0\xa1\xac\x50\x8b\x31\xe4\x82\x7d\x29\x96\x64\x13\x87\x73\xb4\x15\x49\x41\x3b\x59\x30\x0e\xa1\x59\x2e\x5a\x32\x79\x3e\x5b\xfe\x00\xf1\xac\x57\xb3\x35\xad\xf5\xdf\x8c\x25\x73\x06\x91\x58\x6e\x44\x4e\x7a\x3d\xc3\xc0\xd4\xf0\xf1\x62\x76\x3c\x0e\xf7\xc4\x22\x2b\x7c\x57\x60\xfc\xdf\x03\xfb\x5e\xff\xca\x68\x0e\x2d\x16\x61\xec\x84\x74\xa6\x37\xd2\x7e\x91\xb3\x5a\x0c\x89\x66\x4c\x59\x01\xb9\x18\x3b\x34\xb4\xdf\x4d\x34\xd5\x85\x08\x47\x93\x39\xcd\x89\xc5\x66\x89\x18\xab\xe3\x38\xc9\xf5\xb2\x14\x34\x07\xe7\x54\x8c\x23\x0e\x3d\xd1\xf9\x4d\x28\xa5\x85\x67\x59\x0b\x7e\x8a\x39\xad\x49\xd3\x74\x53\x7b\xfd\x4f\x67\x90\x66\xdb\x4b\xcd\x84\x91\xe6\x2f\x3e\xbd\xe4\xb5\xcc\xd8\x1d\x68\xd4\xa3\xeb\x52\x13\x9e\x48\x43\x63\x90\x45\x93\x64\x28\xe9\x9f\xf6\x3a\xe1\x1b\x59\x00\x81\xac\xa9\x62\xfb\x37\x52\xc8\x9f\x17\x1b\x9b\x00\x14\xb5\xa6\xb1\x6d\x02\x38\x1c\xbd\xdc\x71\xcd\x9d\x20\x89\xad\xbf\x58\x62\xdb\x52\xd9\x36\x0d\xeb\x43\x92\x3d\x8d\x36\x22\xd7\xbd\x00\xec\xfd\x88\x3a\x9e\xcd\x7d\xf8\x0c\x07\x46\xcd\x85\xd9\x32\x75\xbd\x1c\xaf\xf8\xa5\x4e\xbb\xe2\x87\x5c\x01\xb7\x67\x8a\xe8\xdf\x69\x24\x8b\x8d\x28\xd4\x93\x83\x2a\xf5\x58\x94\xa8\xd2\xa8\x10\x6f\xf5\x21\x78\x52\x6c\xbe\x82\x8f\x11\x45\xfa\x3f\x8d\x54\x79\x7d\x9d\x8b\xef\x6e\x44\xf5\xb6\x92\x9a\xb1\xf8\xbc\xce\xd2\xa8\x96\xc5\x75\xde\x8a\x28\xa2\x86\xfe\xc5\xa7\xfb\xec\x19\x36\xc9\xee\xf0\xb5\x78\x12\xa5\x26\xbe\xe5\x93\x3c\x8f\x28\x26\x3e\xc3\xee\x0a\x05\xb6\x1a\x36\xf5\x5f\x51\x6a\xcc\x8d\x4d\x57\x5d\x2a\xda\x14\x63\xae\xd7\x9d\xbf\x81\xbb\xd1\x93\xf9\xac\xcc\x60\xe6\xed\x07\xbd\x2e\x26\x1d\x96\x08\x53\x7f\xda\x47\xfe\xca\x9a\xfe\xe8\x35\x08\x17\x18\x3f\xc0\x06\xd1\x1f\xbe\xac\xca\xc3\x1e\xb7\x0b\x7e\xc1\x7d\xe2\x3e\x99\x6d\x03\x4f\xaa\x2b\xe4\x36\x83\xf9\xd0\x96\x71\xfb\x06\x2b\xeb\x2c\x23\xd4\xe8\x56\x1a\x7b\x88\xf7\x67\xfb\xd9\xec\x10\xfc\xfa\x52\x4f\x32\xbf\x71\xb9\xbf\x88\xd2\xe8\x4a\xb6\xf5\x7f\x69\xfe\xfe\x56\xbc\x53\xe1\xec\xda\x2f\xdf\x57\xe2\x26\xfc\xf2\x05\xcc\x33\x88\xa1\xc2\x0f\x3f\xb6\x1f\xbc\x25\x5d\xb9\x4d\xf5\x8d\xa8\x6b\x9b\xba\x76\xa9\x2f\xbc\xc1\xfc\x64\x16\xba\xdd\x3b\x41\x03\x3f\x99\x15\xf6\x3f\xeb\xe9\x1b\x48\xf7\xe8\xb0\x34\x82\x03\x8e\xdb\x50\xec\x78\x56\xdf\xda\x3d\xf8\x45\xd4\x39\xdd\x66\xd6\xa3\xf0\x1e\xc0\xd4\xef\x07\xf6\xc7\xb7\x83\x9b\xe3\x49\x6f\x91\x71\xdf\x0d\xad\xf0\xcf\x51\x78\xde\xfd\xf1\xb6\xdf\xbc\x1d\x19\x75\xef\x02\xb3\xdb\xfb\x07\x1d\xe6\xa6\xb3\x83\x7e\x29\xab\x4d\xb8\x81\xbe\x8e\xd2\xe8\x8d\xcc\x73\xff\xc0\xbd\x8a\xd2\x48\x55\xbc\xa8\xf7\x65\x2d\x74\x95\x6e\xdd\xbe\x8b\xd2\xa8\xdc\x8b\x02\x72\xc3\x8c\xee\xb8\x7f\xb2\x77\x9b\xfe\xc1\xde\x6d\x06\xce\xf5\x6e\x33\x70\xac\x4d\xa2\x3d\xc5\xbb\x4d\x70\xa8\x77\x9b\xe1\x33\xbd\xdb\xd8\xc3\xdb\x49\xed\x1f\x74\xdd\x15\x7b\xa4\x5d\x6a\x70\x34\xfd\xf3\x1c\x1e\xcd\xe0\x38\xeb\x9a\x82\xe3\x6c\x77\xca\x6e\xd3\x39\xcd\xfe\x05\xf0\xfe\xe3\x7c\x2a\x97\x5d\x6b\xfd\xfd\xf4\x91\xdf\x6d\x82\x13\xbf\xdb\x04\x07\x7e\xb7\x39\x71\xde\xbd\x0f\xe6\xb8\xc3\x3a\xe6\x6a\xf8\xac\xf7\xbf\xb5\x0b\xdd\x3f\xed\xbb\xcd\xc0\x61\xdf\x6d\x7a\x1b\xb3\xe2\xfb\xbd\xd8\x74\xa6\xd2\x1f\xaa\x97\xc3\x5f\x85\x7b\xee\x0c\xf3\xb5\x7b\x65\xf8\xd7\x7d\xf7\x6d\xe8\xed\x0e\xff\x22\x59\x99\x9b\x84\x46\x78\x8d\x44\x6b\x38\x01\xe6\x2d\x65\x97\xcb\xe0\x38\xa4\xfe\xab\x87\x56\x19\x39\xbb\x73\x27\x23\xcd\x38\xed\xbc\x94\x83\xde\x13\x61\x8c\x5a\x31\x75\xae\xbc\x89\x75\xc2\x25\x34\x48\x05\x5f\x5d\xf0\x2e\xa7\xf6\x5c\x0f\x55\x0c\xbc\x87\x6f\x50\x05\x3c\x36\x04\x21\x48\x1c\x34\xda\x47\xc2\xc6\xc2\x69\x23\x10\x04\x3e\xf2\x2d\x27\xe9\xe2\x0f\x00\x43\xe7\x72\x9f\xfb\x90\x2b\x4b\x1b\xeb\x0a\x23\x8a\x98\xc0\x5a\x6d\x1c\xb4\x39\x9d\x91\x26\xbd\x3f\x13\x68\xce\x8d\xe1\xba\x17\x39\x0b\x7d\xd4\xd0\xd1\xb8\x69\x48\x43\xdb\xeb\xe6\x83\x46\xef\xd7\x58\xd9\x40\x94\x09\x1a\x27\x9a\x28\x60\x07\x65\x26\xc3\x84\x03\x33\x5f\xa1\xd7\xae\x4d\xbb\x81\xdf\xdf\xa8\xe8\x35\x2a\x06\x1a\xb5\x69\xb6\xfe\xce\x39\xf9\xa0\xb1\x59\xd6\x32\x03\x91\x6a\x59\x6d\x6a\x33\xa1\x34\xda\xc8\x9b\x08\x28\xf6\xf1\xe3\x85\xdf\x1b\xcd\xe5\xea\x8c\xfa\xf2\x4f\xee\x72\xdd\xd2\x8c\xaa\x72\x9f\x16\x8d\x29\x84\xd3\x7d\xb2\x73\x48\x3b\xff\xef\xf5\x0e\xd4\xdd\xbd\x3e\x85\xda\xa9\x67\xf2\x66\x5a\x5e\x5d\xd5\x42\x81\xfa\x64\x3c\x9f\x75\xfa\xbc\x38\xb5\x6f\x2a\x18\x01\x38\x67\x0d\x9e\x41\xfd\x05\xd4\xa3\xe2\x54\x0e\xfd\x25\x31\x75\xbc\xe7\x40\x07\x59\x6c\xad\xef\x29\x13\x64\xd1\x65\xda\xab\x6b\xb8\x40\xc7\x99\x7b\x28\xb8\xb5\xad\x45\xb3\x2c\x1f\x5e\x87\x0f\xa0\xa4\x2b\x70\x64\xce\x07\xd5\x51\x7f\x76\x9b\x0c\xb8\xa9\x15\xc0\x3e\x7b\x77\x4c\x43\xef\xac\x12\x7f\xbc\x2b\xf5\x73\x76\x29\x79\x9d\xce\x9b\xb0\x4d\x60\xa6\xfe\x6f\x1a\xae\xda\x86\x3f\xa0\xcd\x0f\x9d\xa9\x13\x8d\x0d\x19\x7f\xb7\x37\x2c\xa1\x15\x1b\x74\x82\x5e\x28\xf6\x23\x44\x9c\x23\x82\x29\x34\x1f\x03\x1c\xb9\xc0\xaa\x58\x34\x89\x27\x12\x01\x99\x16\xfa\xfc\x54\x84\x50\x91\x27\xa3\x19\x98\x6c\x2b\x3a\x99\x23\x42\xf3\xfb\x27\x7b\xe2\x8d\xfc\xe4\x71\x7e\xef\xd8\xdd\xf1\x86\xe7\xe9\xbd\xd7\xcf\xd9\xff\xfd\x29\x6f\xe8\x2f\xae\xdf\xa7\xee\xc8\xff\x2f\xba\xfd\x9e\x6e\xfd\xf7\x7b\xf7\x43\xfb\x36\x7c\x67\x0e\xdf\x89\x67\xd5\x34\xdb\x9e\x0b\x8b\xd6\x92\x54\xe6\xad\xaf\x05\xaf\xb2\x6d\xf2\xe0\xb7\x97\x0f\xc8\xd2\x3f\x2d\x69\xe5\x0f\xe8\xa7\xfd\xf0\x48\xf4\x76\xfa\x39\x99\xcc\xd1\x89\x23\x72\xf9\x41\xd0\x71\x4f\x89\xa0\x80\x91\x95\xbc\xa7\x81\x3d\xbf\xf6\xf2\x7f\x40\x03\x6d\x01\xcb\xea\x9d\x2e\xf0\x1c\x9a\xd0\x4f\x54\x5b\xe2\x9e\x33\x81\x45\xc2\x12\x65\x7e\xd8\x15\x1f\xd4\x0a\xe4\xf4\x4b\x7d\x50\x4b\x5e\x29\xcd\xe5\x7d\x48\x4b\x6f\xcb\x6a\x83\x25\x5a\xe6\xe6\x3d\xcd\x5c\xeb\x8c\x5e\x99\x0f\x69\xc6\x2b\xa3\x7b\xf6\x21\xcd\xd8\x9e\x05\x2c\xed\x70\x19\x24\xf4\xec\xd4\x6d\xc4\xbe\x94\x85\xf2\xca\x02\x77\x74\x7f\x51\x6f\xa1\x02\x1e\xf9\xfd\x0d\x7a\xfd\xd4\xc5\x3e\xac\x2d\xaf\x90\xc7\x02\xbe\xbf\x31\x37\x8f\x01\xe3\xf7\xde\xe6\x5c\xb1\x56\xb6\x37\x5c\x06\xbf\xb7\xef\x7d\x54\x83\xac\xd2\x95\x7c\x71\xb2\x97\xbd\x92\x7c\xb3\x69\xcb\x69\x56\xf0\x43\x5b\x3c\x5c\xaa\x8a\x67\xa6\xd1\x5a\x54\xea\x15\xbf\x3c\x45\x12\x75\x4c\xa1\xa2\xdf\xbc\x62\x2f\xcb\xab\x5e\xd1\x0e\xac\x88\xe8\x99\x6e\xc1\x85\x69\x0d\xf7\x14\xbf\x7c\x29\xff\x12\x83\xca\x17\x03\xc2\x68\x03\xe6\x27\x84\xe6\xec\x8f\xa4\xbd\x3d\x6d\xa8\x52\x3e\xcd\xb6\xb4\x22\x0b\xe3\x6c\xf4\xcf\xa4\x9a\xe4\xff\xa7\x22\xa4\xe9\x77\xbf\x4e\x14\xac\xac\x95\xcb\x76\x5c\xd4\x06\x20\x8d\x96\xa7\xe6\x3d\xd5\x2f\x88\xc8\x9e\x96\xbb\x1d\x2f\x36\x49\xe4\x26\x52\x4f\x4f\x28\xd7\x19\x9a\xda\xd3\x0a\x9e\x81\x19\x3b\x65\x63\xa5\xb9\xc9\x55\xb5\x0e\x19\x4a\x69\x41\xea\xf8\x86\xf2\x96\xf4\x91\x1e\x5f\x89\xaa\x0f\x08\x79\xa3\x99\x49\xee\xc7\xac\x37\xe2\x7d\x69\x02\x32\x4e\xb3\xed\x64\x4e\x08\xfc\xb8\x98\x91\xa1\xef\x63\xb0\x23\xf7\x31\xd6\x12\x88\x48\x59\x3d\x51\x89\x29\x3f\x0e\x13\x1e\x42\x70\x6e\xbf\x89\x87\x84\x4a\x1a\x8d\xdd\xbc\x45\x2d\xbc\x3a\x66\xbb\x40\xa5\x9d\x17\x78\x3a\xef\x8e\x6d\x32\x37\xa3\xcb\x07\x06\x72\x4f\x1f\x67\x64\x2c\x86\x6c\x5c\xc7\xb9\xcd\x91\x7b\x28\x40\xae\xca\xc9\x9c\xfa\xe9\x9d\xee\x93\xa6\x08\x80\x87\x24\x95\xb0\x23\x03\xc0\xa6\xa4\x00\x20\xde\xae\xec\xff\x7f\x61\xbf\x78\xc6\x33\xc5\x05\x9b\x2d\x8a\xc9\x84\x74\xc6\x3f\x38\x66\xaa\x56\x45\x1b\xa8\x14\x63\x4e\x6a\x82\xc7\x42\xe4\x2c\x86\xda\x3b\x15\x91\x0f\x21\x3e\xcc\xf5\xa4\x4f\xac\x6a\x11\x83\x8c\x98\xc1\x00\x25\x38\xc5\x24\xb5\x72\xcf\x0f\xbe\x8e\x8a\x88\x46\x00\xb9\x0f\xe7\x2e\xd4\x95\x0c\x57\xd2\xc9\xa4\x39\xeb\xd6\x72\x09\x99\xa4\x61\xc6\xe1\x0f\xf5\x01\xe4\x7f\x45\x15\x9d\x7b\x4a\xcb\x2a\xa8\xd0\xf0\x60\x78\x71\x55\x6d\xfd\x85\x49\x92\x6c\x2b\x00\xca\xa6\xaf\xab\x1c\x49\x88\xc2\x22\xd1\x43\xfb\x46\xe4\x61\x78\x3f\xfe\x2e\x29\xe0\x22\x44\xc9\x91\x4f\x52\xb6\x7d\x56\x49\xe1\xbb\x43\x32\x17\xb0\x44\x69\xc2\x94\x71\xfc\xb1\x9c\xa5\x9c\x16\xd3\x5a\xc9\xec\xcd\x6d\x8b\xb3\xd3\x8e\x49\xe6\x1e\xbc\xd8\x10\x6e\xe8\x28\x51\x4c\xe5\x2b\x15\x78\xe6\x77\x0c\x66\x45\x51\x1f\x2a\xf1\x7d\x99\xe7\xfa\x9e\x5d\x58\x80\x0b\x17\x1e\x79\x2b\xaf\x14\x95\x6c\x34\x07\x5b\x63\x11\x98\xda\x83\xcd\x2c\x5a\x0c\xd7\x87\xfd\xbe\x12\x75\xfd\xf9\x46\x1a\xdf\xee\x22\xb0\xa8\x85\x7a\xd8\x08\x42\xd2\x6a\x06\x6f\xc4\x3e\x6b\xae\x64\xc1\xf3\xfc\xf6\xae\x9b\x0b\x30\x84\x86\x6a\x9d\xdb\x49\x90\x18\x6c\x3e\x87\xdb\xe5\xcb\x76\xdb\xe4\x79\xd7\x86\xc7\xd6\xf4\x46\xdc\xbe\x14\x7f\x82\x1d\x00\x4c\xd7\x2f\x60\xd8\x33\x60\x7b\xf3\xe0\xb7\xff\xb1\x96\x55\x4a\x3f\x3b\x7e\x71\x30\x40\x4d\x79\xae\xaf\x8f\xe4\xf1\xcc\xbf\x08\x3a\x19\x99\xf4\xe6\xc6\x2b\x4c\xbb\xd3\x5f\x09\x5d\x17\x81\xb0\xe8\xba\xf3\x72\x1c\x9d\x45\x63\x1c\x42\x1b\xf5\xd2\x0c\xbb\x6c\x87\xd7\xee\x82\xb2\x37\xe6\xae\xe3\x6e\x78\x2f\x78\xbd\x7a\xc1\xf7\xf5\x80\xb1\xf0\x9f\x3c\x51\xb4\x93\x6d\x55\xad\x29\x84\xb2\x83\x19\x74\xcb\xd0\x7a\x9f\x18\x4a\x42\xbc\x53\x15\xff\x5a\xdc\xd6\x71\x6c\xaa\xe9\x7d\x81\x7a\x8e\xc7\xce\x67\x6c\x07\xbe\x35\x26\xde\xf6\x22\xb0\x9c\x1a\x9c\x53\x45\xa8\x5b\x3d\xc8\x80\xc1\x01\xde\x88\xdb\xe7\x26\xd5\x38\xc6\xd3\xc4\xcf\x77\x3c\xb6\x95\xea\x5d\xfc\x52\x24\x05\xa1\x6f\x30\x76\xfe\x68\x24\xdb\xd9\xad\xc3\x8b\x48\xf7\x59\x5f\x94\x66\x65\x46\x70\xf7\x78\x26\x3d\xa3\xb0\x7f\x4b\xd8\x90\xce\xb0\xa7\xa0\x6a\x08\xb8\xc8\x9c\x63\x80\x8b\x3a\x1e\xa1\x48\x37\xe7\xe0\x01\x5f\x3e\xf8\xf7\x75\xb9\x7a\x32\xf9\xd7\xda\x6d\xd8\x54\x4d\x77\x25\xdc\x55\x41\xdd\xa4\x21\xe9\x60\xbd\xdd\x5c\x04\x0e\x56\x96\x9b\x00\xc9\x76\x16\x0e\x79\xdf\xbd\x67\x94\x88\xa9\xe2\xd5\xb5\x50\xe0\x30\x09\xbf\x46\xac\x6b\x8f\x7f\x2d\xd4\x17\x52\xe4\x9b\x84\x00\x80\x83\xc5\x41\xc8\x0e\x35\xfb\x2a\xf9\x16\x10\x0c\x8c\x83\x10\x21\xe4\x2e\x8f\xe3\xf2\x7c\x3e\x8f\xe3\x87\x7f\x0b\x6c\x92\x12\xfd\xe6\xe8\x9e\x02\x04\xad\xbe\x46\xdc\x45\x65\xf2\x2c\x54\xe7\x12\x99\x7f\xca\x58\x75\x3c\x0a\xb7\x38\x26\x88\x5b\x9d\x43\x6b\x0b\x4d\x66\x65\x39\x93\xcb\x0a\xe3\xf7\x8c\x64\x1c\xff\xfd\xef\x80\x65\x3d\xfa\x5e\x37\x79\xb9\x14\xce\x1c\x4c\x78\xe6\x60\x03\x8e\x09\x06\xd9\x9a\x46\x99\x7e\x9c\xe1\xea\x1b\x5d\xc6\xb1\xae\xf2\x93\x4f\xa1\x4a\x11\xee\x11\x53\x5b\x1c\x3b\x23\x7f\x8f\x88\x1d\x4e\x4d\xb0\x72\x3a\x37\x7d\x7c\xf0\xdb\xa5\x17\x9c\x2b\xab\xca\xba\xde\x72\x59\xfd\x76\x69\xf7\x42\x4f\x90\xe4\xc2\xe3\x90\xd0\x2d\xac\x63\x9b\x6f\xf3\x7b\x8f\xb1\xce\x95\xe8\x86\xdd\x74\x1f\x8f\x68\x45\x86\x53\x92\x3c\x4f\x54\x10\x2b\xcc\x75\x27\x22\xf4\x5a\x38\xaf\x07\x38\x98\x87\x7d\xa4\xcf\x63\x90\xbc\x2b\x0f\xb5\x28\x6f\x44\xa5\x3f\x91\xe6\xd5\x3d\xd5\x5d\x0d\x57\x77\x75\xb2\xba\x46\x33\x1b\xed\x81\xde\xc0\x56\xd6\xbb\xc3\xdf\x5f\xe8\x6c\x67\xcc\xd1\xda\xb7\x6a\xd7\xa2\xef\xba\x0a\xb6\xff\x2b\x67\xa1\xe3\x0b\x77\x3c\x9a\x53\x00\x8e\xe9\x76\x77\xb8\x39\x3e\x1e\x2f\x21\x4c\x96\xb1\x30\x6c\xc5\x62\x66\x04\x28\xfd\x32\x56\xe4\x0b\xb4\x14\x2c\x18\xcb\x9c\x2d\xa6\x39\xd1\xe8\x6e\x04\x6e\x77\xd0\x6d\x88\xea\xf4\x76\x2b\xb3\xad\x26\x16\xcc\xcf\xf3\xf9\x8c\x1c\x8f\x23\x73\x50\xec\xa3\x30\x64\xae\xee\xac\xc8\xd2\x8a\x2c\xa2\xdf\x2e\x23\xb0\x6a\x3d\x05\x26\x83\x77\xe1\xff\x44\xe3\x62\x1c\xfd\x4f\xf4\xfe\xab\xb0\x01\xf7\x3f\x09\x71\xdd\xc2\x89\x2c\x8b\xaf\xc5\xed\xf7\x9a\x30\xd0\x17\x76\x83\x7e\x27\xfb\x9c\x5e\xe5\xf4\x26\xef\x3d\x7f\xb0\xb6\x4a\xee\x84\x8b\xc6\x50\xd6\x36\x0a\xe2\xe5\x41\xa9\xb2\x60\x85\x47\x7a\x5e\x77\xd6\x17\xc8\x78\xeb\xb7\x02\x6b\xed\x96\xaa\x98\xf2\x4c\xc9\x1b\xf1\xaa\x3c\xe8\x19\x2c\x4c\xf7\x34\xd5\x52\x56\xaa\x86\xe4\x44\xdf\x6b\xf2\x2a\x29\x06\xe9\x2d\x4d\xdf\xc1\x6e\x6b\x2f\x08\xfa\x7b\x91\x14\x1e\x02\xb4\x5e\xb2\x04\xa3\xa8\xa1\xe3\x8b\xa8\xd0\x3f\x8b\x5f\xe6\xfa\x2a\xa4\xf7\x7a\x8f\x0d\x17\x9a\x35\x74\x3e\x9b\x11\x03\x43\x74\xe9\xaf\x74\x65\xfc\x2e\x35\xa1\xf6\x1c\xfc\x33\x39\xab\x96\x43\xe2\x7c\xe7\xb0\x69\xe9\xda\xab\x3c\x8e\xaf\xf2\x69\x56\xee\xf6\xbc\x12\xc6\x64\x74\x99\xec\x73\x76\x65\xb6\x5f\xa4\x2a\xb9\xcf\x45\x44\xd2\x7d\x1e\xc7\xfb\x7e\xde\x2b\x24\xe9\x6e\x72\x93\x42\xf7\xb6\xe4\xa6\x3c\x5c\x42\x49\x5d\x5f\x98\xc7\xd5\x8e\x3a\xe6\x08\x82\xb5\x49\x62\xad\xb3\xa2\xc5\x8f\x89\x22\xd6\x33\x8c\xce\x81\x4e\xb0\x9e\x6e\x26\x72\x4c\xeb\xc6\x37\x90\xac\x27\x21\x19\x55\xc7\xe3\x28\xdc\x5a\x68\x00\x89\xd4\x7f\xf4\x34\x97\xd9\x9b\xc8\x92\x2c\xa6\xb7\xfa\x70\x70\x16\x3d\xc3\xbf\xc6\x3c\xb5\x13\x80\x31\x13\x38\x8b\x5e\xe1\xdf\x63\x4e\x28\x9c\x8f\xd7\x3c\xe1\x60\x48\xa8\x96\xe8\xdd\x92\x3e\x84\xdf\x2f\xe4\x66\x93\x8b\xc8\x7a\xb9\x90\x31\x07\xb4\xa2\xf7\x13\x09\x18\x3d\x00\x98\x00\x3a\x52\xa1\xa5\x70\xf5\x5f\x90\xf5\x15\xc3\xb0\x9a\x21\x01\x7f\x3f\xb9\x5e\xe1\x61\x96\xb4\xa2\x5c\x6f\xb4\x38\xd6\x23\x94\xcb\x70\x5f\x21\x09\x9b\x2f\xbd\xfd\xfc\x45\xf2\x7b\xa5\xb7\xe2\x8c\xa4\xa2\x47\x3b\x08\x82\x54\x80\xa4\xfd\x88\xbf\x0e\xa7\x4f\x28\x04\x64\x48\xa2\xac\x2c\xae\xe4\xf5\xa1\x42\xdc\x9f\x48\xef\xef\x6a\x69\x03\x6b\xa7\x77\x4d\x68\x1a\x2b\xa7\x87\x02\x62\x52\xe1\x0f\x96\x3c\x5d\x16\xde\x1b\x5e\x38\xd2\xa0\xb0\xcf\xe0\x32\xd2\x6c\x22\x87\x1d\xe7\xb6\x1e\xac\x1d\xc8\x5b\xd3\x76\x4f\xa8\x25\x8a\x45\x53\x23\xf7\xa7\x0e\xb9\x07\x95\x21\x36\x54\x30\xfe\x45\xa0\x13\x16\x27\xd4\xfb\xa0\xef\x1f\xdb\x23\x1b\xd2\x4c\x4e\xf9\x66\xf3\xad\x78\x0b\x65\xf0\x27\xbb\x5c\xfa\xbd\xb5\x84\x8c\x2b\xb0\x2b\x6f\xc4\x77\xc5\xb3\x8a\x5f\x43\xa1\xf6\x4f\x36\x4a\x74\x51\x1c\x9e\x57\x12\x30\xa7\x0c\xf4\x57\xd6\x5a\x71\x2f\x5a\x5a\x5e\xdf\x34\xcf\xaa\x72\x1f\xc7\xef\x30\x40\x5d\xb8\xbb\xda\xc9\x41\x0b\xe1\xac\xf5\x99\x55\x84\x5c\x4c\xe6\x3a\x55\x25\xf0\xc5\xc0\xd5\xca\x35\x71\x2a\x6c\x72\x3e\xd3\x4f\xc2\xbb\x1f\x45\x7e\x31\x23\x98\x57\x1a\xc0\x5e\x72\xe1\xbe\x9d\xcf\xc8\xc0\xf6\xb2\x5c\xa1\x7d\x7a\xb9\xbe\x41\x33\x56\xc9\x8e\xa6\xbe\x86\xc9\x18\xbc\x70\x89\xe3\x8d\x7c\x37\x59\xe3\x83\x88\xe9\x22\xe7\xb7\xb2\xb8\xfe\x2c\x3f\x54\x00\x30\x05\x27\x6a\xcb\xeb\x2f\xf0\x0e\x5a\x9e\xcc\xc8\x46\xf3\xf4\x2d\xb2\x21\xd7\x22\x91\x00\x20\xb8\x17\xd5\xb4\x7c\x5b\x88\xea\x59\x48\xe0\x68\xca\x27\xfb\x80\x7c\xa8\xe6\x3c\x98\x9c\x76\x48\xe8\x68\x8b\x22\x1b\xba\x19\xf8\x58\x62\xf5\xfc\x78\xd4\xec\x91\x22\xb4\x32\x1b\xea\x78\xfc\xa7\xb4\xf2\x12\x83\x0d\xaf\xff\xa9\xec\x7e\xa5\x75\x1c\x8f\xf6\xc7\x63\x1e\xc7\xff\x60\xac\x5c\x0e\xbf\x4f\x27\xfa\x3c\xbd\x2c\x37\xb7\xe6\xae\xbe\xdb\x57\x10\x31\x16\x7d\x0f\x53\x00\x4a\x93\x03\x5e\xd0\x69\x27\x11\x70\x7d\x03\xfd\x32\x67\xfc\x78\x04\x01\x0d\xbf\xac\x35\x1b\x92\x4b\x51\xa8\x5f\x27\xc2\xfe\x22\xe3\xde\xd7\xd7\xee\xeb\x6b\x72\xc1\xe6\xb3\x86\x6e\x06\xbc\xd3\xb9\x7e\x4c\x17\xa7\x77\xcb\xec\xc4\x6e\xc9\x68\x06\x8e\xd5\x6c\x54\x79\x47\x4e\x93\xb1\x1f\xb4\xe8\xef\xcd\xe7\x16\xfd\xea\xbe\x45\xef\x7d\x34\x8b\x7e\xcf\xfe\x9c\xdd\x4f\x6f\x0c\xad\x0f\xed\x4c\x0d\x5e\x0d\x03\x89\x09\xb0\xfe\x15\x55\x94\x93\x81\x00\x21\x79\x1c\xc3\xd9\x58\xf4\x0f\x31\x6c\xc7\x05\xec\x53\x1b\x48\x97\x66\x8c\x03\x46\xd1\xc1\x5d\x23\x10\x53\xd9\xdd\x90\x23\xbb\x63\x97\x49\x8d\x59\x7d\xdf\x7d\x5a\xb2\xfa\x62\x32\x5f\x1e\x56\xf5\x3a\x35\xd2\x63\x70\x70\x4f\x93\xd2\xe4\x76\x41\x24\x68\xed\xa5\x20\xea\x35\xf5\x5e\x03\xc6\x2a\x78\x44\x48\x7b\x82\x92\x92\xf9\x75\x52\x40\xbb\x40\xca\x17\x00\x2f\x6a\x36\x99\xb7\x78\x09\x1b\x76\x8b\xcc\xbb\xa9\x67\x51\x32\xd7\xf7\x8f\x64\x52\xd2\x8d\x95\x15\x6f\x50\x50\xec\xce\x62\xba\x69\x6c\xa3\xcb\xc9\x9c\xb1\x5a\x8f\xf5\x60\x71\x2e\x14\x4f\x38\x7d\xae\xaf\xbe\x83\x8b\x8f\x5b\xae\x09\xad\x09\xbd\xab\xcd\xa1\x9b\x3b\x84\x89\x8f\x61\x63\x45\x0d\x21\xa9\xad\xe1\x62\x1e\xc7\x7a\x82\xac\xea\x23\x8e\xf1\xb1\xb3\x23\x0e\x26\xd9\x6f\xcd\x3a\x06\xd6\xc4\x36\x6c\xd3\xea\xf1\x9c\xe8\x07\xff\xde\x1e\xd8\xb5\x25\xe9\xd7\x32\xe1\xb4\xa6\x25\xfd\x93\xa4\x49\xcd\x66\x38\x26\x03\x46\xbe\x2a\xd7\xba\xa6\x3f\xdb\xfc\xb0\x39\xb6\xac\x58\x20\x3e\x41\x7b\x86\xae\x85\xfa\xac\x3c\x80\x5b\xe1\x53\x38\xf4\x3f\x8a\x4c\x25\x84\x5e\xf9\x28\x27\x37\x89\x53\x7a\x8c\xc7\x57\xf4\xe0\x2d\xda\xd0\x72\xeb\xed\x76\x20\xf2\x2a\x99\x8d\x00\x6a\x9d\x6e\x09\x20\x30\xf6\xe9\x98\x2e\x19\x87\x05\xb6\x54\x01\x9a\xc9\x96\xa9\xc1\xfa\xbd\x80\xfe\xab\x35\x00\x2a\x75\xf5\x79\x07\xf6\x47\xf2\x91\xd0\x13\xe2\xa9\x9d\x28\x08\xa8\x73\x42\x37\xf6\xab\xf2\xbf\x2a\xf3\x75\xdf\x46\x8e\x38\xc0\x5d\xd1\x4a\xb8\xe1\xef\x1b\xe6\x43\x6b\xb6\xd2\x6c\x42\xaf\x83\x98\x13\xce\x86\x8a\x7a\x12\x72\x3f\x3f\x59\xdc\x9c\xb3\xeb\xc5\x8d\x15\x40\xde\x32\xe8\xd4\x8d\xe9\xcf\x8e\xbd\x4e\x6e\xe9\x9e\xe6\x64\xb1\x67\xec\x6a\x29\x03\x85\x4e\xa5\x92\x1b\xba\x03\x7d\x90\xfe\x9f\x90\xf4\xd6\xee\xcd\x9d\xbe\x63\x4e\xe6\xd5\x95\x5e\xd1\x1c\xd0\x4f\xa4\x8b\x71\x1c\x16\xc0\xb3\xd9\xee\xdb\xac\x13\xd6\xc2\xdb\xbe\x12\x4f\x4d\x67\xa7\x52\xb7\x87\x1b\xb8\x54\xe1\xaf\xaf\x0a\x55\xfe\x2c\xc5\xdb\x44\xa1\xe7\x0f\x0c\xfa\x92\x3e\x65\x25\x7d\x82\x07\x5d\xd9\x83\x4e\x5f\xb2\xa7\xe6\x68\x2f\xa4\x4a\x9e\xd8\x63\xfe\x92\x5c\xcc\x96\xc9\x25\x7b\x82\xc7\xfd\x25\xab\x55\xf2\xd4\x12\x48\x4f\x5c\x1c\x90\x14\xb2\xd8\x32\xac\xd4\x99\x80\x4e\xc2\x72\x86\x7e\xfe\x99\x75\xc7\x45\x16\x3f\xaf\xea\x35\x1b\x62\xfa\x6c\x04\x1c\xcd\x07\x60\xe3\xb2\xa7\x3e\xd1\xfb\x7e\xc6\xf4\x0e\xd6\xd7\xb6\x26\x96\x51\x87\xa1\x37\xae\xd1\x66\x58\x53\xda\xd6\x33\x4c\x86\x90\xb8\xe6\x53\xce\x0e\xb8\x7d\xb3\x6d\xab\x0a\xa1\x25\xe3\xc6\xff\x1c\x3d\xa5\x46\x4c\x67\x88\xe3\x72\xaa\x4a\xfc\x1d\xd6\xa2\xdf\x82\x7c\x6c\x32\x33\xc8\xc0\x58\x32\x1f\xb5\xde\x5a\xb3\x74\x6e\xbb\x9d\x1d\x8f\x59\xab\x8c\x6d\x2b\x82\xb7\xc3\x8f\x2f\x4f\x6a\x66\x52\x26\x26\xe1\xe3\x04\xf0\x9c\x18\xeb\x28\x8e\x96\xf3\x74\x32\x27\x17\xb3\xf6\x46\x3f\xe0\xb8\x2a\x54\x15\xd9\x71\x6d\xd8\x61\x92\x1f\x8f\x89\x4e\x9e\xc0\x30\x3e\xf6\x7c\xca\x96\x93\xb9\xee\x65\xcd\x0e\x8c\x65\x93\xf9\xf1\xa8\xff\x5f\x6e\xce\x67\xe9\xe6\x62\xd6\xe0\xc5\xc6\x57\xd9\x38\xa9\x97\xe0\xc2\xb6\xa6\x7b\x56\xa3\x57\xda\xd6\x8c\x93\x5e\xb1\xfd\x72\x8b\x9e\x69\xdb\xa9\x2a\xe9\x0d\xdb\xf7\x1d\xea\x9c\xe8\x40\x4f\xd3\x95\xbf\x7e\x37\x4b\xe5\xde\x42\xd4\xeb\x9a\xa3\x7c\x45\x6f\x08\xad\xe0\xf9\x6e\x43\xbc\x70\xfa\x92\xd0\xcb\xe0\x04\xfd\xac\x4f\xc9\x9f\xa4\x69\x92\x03\x6e\xbe\x0d\xfb\x57\x95\x40\xfc\x8a\xe4\x80\x1a\x66\xb6\x01\xbc\x4e\xfc\xeb\x7c\x83\xbe\x9a\x71\xec\x51\x1d\x55\x57\x09\xcb\x58\x1e\xc7\xfa\x72\x6e\x08\x9d\x3f\x9e\x79\xc7\xea\x9a\x39\x72\xee\x7c\x3f\x55\xe5\x7e\x39\x79\x38\x4b\x5d\xda\xc5\x7e\x7a\x59\x2a\x55\xee\x96\x0f\x67\xe9\x6c\x71\xfd\x01\xcd\xf8\x74\x9e\xc3\x4c\x1c\xb3\x6b\xaa\xdb\xd7\x1d\xd0\xed\xb7\xd2\xc2\x6b\x7d\xa3\x8b\x21\xa9\x82\x66\x18\xae\xd8\xfc\xc1\x8c\x2a\xd4\x40\xa8\x1e\x75\xfb\xc1\xc4\xfd\xed\x07\xb2\x0b\x3b\x42\x79\x2f\x0e\x41\x1b\x73\xa0\xc1\xeb\xb7\xea\xe2\xc7\xcd\x46\x7a\x4b\xa3\xac\xac\x8e\x63\x10\x0b\x2d\x6f\x12\x41\xd2\x6b\xd0\x17\xd3\x1d\x96\xb9\x26\x8b\xe1\xa1\xee\x3e\x94\x60\xbd\xfd\x00\xd2\x16\x07\xd2\x52\x8a\x4d\xa2\x8c\x60\x21\x7d\xab\x7b\xa6\x0f\xb8\x5d\xa2\x38\x06\x61\x67\xfa\x90\x31\xb9\x4c\xaa\x38\xfe\xa7\x34\x00\x44\x15\x79\x9f\xe0\xac\x4f\xc8\x92\xf4\x11\x6a\xa1\xde\x2c\xfb\x22\xc9\xa7\x65\xa1\xdf\xab\x17\xa2\x38\xe8\x16\xdf\x56\x7a\x3f\x10\xdf\x07\xfe\x36\xd0\xd7\x1a\x42\xa9\xf0\x63\x6b\xbe\x95\x89\xa2\x48\x38\xa0\x88\xc0\xfb\x8e\x71\x3f\xc1\xf2\x4a\x25\x26\x0f\xc8\x0f\xfa\x75\xb4\xce\xbc\x33\x00\xfb\xf2\x4c\xf9\x5b\x2b\x7e\x87\x6a\x09\xd7\xfb\xa2\x53\x83\xf1\x5d\xc6\x40\xf0\x76\x00\xbb\xae\xaa\x91\x72\x84\x2b\x50\xe5\x21\xdb\x8a\x9a\x48\xe6\x7e\xaf\x66\x6b\xcb\x5c\x51\x3e\x94\xfc\x1a\x4d\x4b\x54\x75\x7b\x27\xdd\x29\xc5\xbc\x26\x83\xc1\x70\x3a\xd8\x35\x19\xcd\x1b\x79\x95\xc8\x0b\x24\x2f\xae\xf2\xb2\xf4\xe2\xb1\x1b\xb4\xfe\xfa\x14\x25\x37\xad\x00\x8b\xbb\x15\x80\xe1\xde\x30\xfc\x42\xee\x71\x13\x25\xcb\x9d\xce\xe4\x44\x65\x08\x5b\x5b\x9a\xcb\xe3\x78\x1c\x3d\x15\x20\x14\xb3\xeb\xf0\x06\x2a\xe6\x13\x88\xc7\xb3\x9f\xe4\xd3\x1b\x29\xde\x7e\x07\x86\xbc\x8b\x30\x0e\x7c\xb7\xff\x2f\xf7\x22\x1b\x0a\x09\x9f\xbb\xf1\x65\x5b\x99\x6f\xbe\x2d\x37\x10\x19\x5e\x77\x24\x8b\xe3\xec\xfe\x51\x5f\x38\x14\x8a\xb3\x5b\xe8\x28\x15\x54\xd8\x6d\xc1\x7d\x08\x2b\xaf\x13\x9a\xac\x77\x2a\x23\xaa\x08\x85\x41\x79\xdb\xf9\x32\x0f\x62\xcf\x9a\xcd\xe1\x50\xf3\x65\xf6\x06\x43\xe0\xb8\x02\x4f\x4d\x81\xdf\x8b\x76\xd9\xa8\x22\xc7\x63\x48\x68\x58\xdd\x2a\xcc\xa9\xad\xae\x3d\x5c\x11\x89\xe3\x4e\x5b\xde\x47\x3a\x32\x36\xdf\xa8\x52\x81\x5c\x19\x7e\xdf\x41\xe1\xe3\xf1\x0d\xc8\xd7\xee\x39\xbd\xca\xeb\xf3\x93\x3c\x04\x0c\xb3\x17\x93\x9b\x19\x76\xcf\x37\xab\x29\x4c\x1e\xfc\x56\x7f\x9c\xed\x26\xf5\xe4\xb7\x97\xe3\x07\xd7\x34\x8a\xc8\xd8\x23\xd6\xb7\xc2\xcf\x9a\xfc\xfb\xf8\x5b\x4d\x7e\xab\x3f\xd6\x19\xcf\xa0\x54\x44\xe8\x5f\xfa\x22\x6e\x6e\x72\x3f\x56\x31\xca\xce\x7b\xb2\x4f\x1f\x97\x52\xc9\x9d\x18\x7f\x32\x9b\x5d\x88\x38\x46\x92\x4c\x39\x1d\x08\x01\x1d\x91\xa7\x06\x69\xe0\x28\xbc\xcc\xd9\x9d\xc5\x12\xe9\xc3\x5d\x7a\x6a\xb9\xe9\x57\x85\x54\x51\xd3\xd0\x9f\x73\x76\xd7\xd0\x37\x79\x80\x3d\xf4\xbb\x7f\xd9\x8d\xd4\x88\x8d\x92\x22\x8e\x8b\x11\x7b\x99\xb7\x50\x37\x01\x74\xda\x17\xa6\x68\x4d\x25\x53\xcb\x2b\x91\x5e\x8b\x85\xf4\x4d\x48\x86\x84\x18\x9a\x78\xe2\x95\x7e\x3a\x4f\xe6\x14\x88\xee\x55\x4d\xe1\xc7\x7d\x39\x51\x65\x58\x4d\xf5\xff\xf7\xe5\xcb\x05\x78\x1d\x56\x53\xf8\x71\x3a\x67\xb9\xd7\x99\xf4\xff\xfe\xb9\x79\x6b\xb6\x94\x5d\x7f\x80\xfc\xd7\x5b\x47\x16\xd7\xcb\xe4\x55\xd2\xdb\x50\x81\x2e\x54\xa7\x45\xfe\x91\xad\xe5\x5f\x9a\x14\x51\xb7\xb9\xd0\x2c\x17\xa2\xa9\x45\x51\x37\x07\xa6\x03\x2e\x5d\x9a\x3c\xff\xb0\x46\x5e\x2b\x60\x4e\x37\x95\xc3\x09\xc5\x7d\x78\xff\xcb\xf9\x19\x18\x91\x81\x82\xa9\x1d\xf4\xf3\xc0\x8e\xa2\xd5\x9b\xaa\x4e\xac\xe9\xe7\x79\x10\x6c\xda\x14\xc3\x70\x37\x66\xc2\x98\x62\x6a\xf9\x2c\x51\x24\xbd\x6b\xe8\xb3\xe4\xe7\x5c\x73\xe0\xce\x22\x40\x4d\x6f\x78\x7e\x10\x8b\x9e\x26\xa4\x5a\x3a\x04\xe7\x8a\x2a\x40\x92\xa5\x06\x50\x2e\xb0\xbe\x03\x48\x41\x6b\xf1\x95\x62\x46\xc0\x66\xf6\x02\x3d\x63\xaa\x81\x59\xdd\x94\x99\x89\x27\x8d\xd6\x8e\xcf\x73\xbc\x55\x5e\xea\x25\xa9\x57\xca\xfb\x6b\x6d\xd0\x7d\xb9\x85\x7b\x85\x25\x80\x52\x97\x12\x08\x1a\xa9\x47\x1b\xa0\x16\x71\x77\xaf\xb4\x0b\x84\x8a\xc9\x27\xb9\xa9\x4e\x05\x7b\xa8\xc5\x8e\x3d\x71\x2d\x8d\x59\x74\xd6\x5f\xec\x5f\x2a\x5b\x1b\xc0\x66\x6b\x2a\x8e\xdd\x19\xeb\x9f\x74\xb5\xa6\xfa\x50\xe4\xfc\x16\x7e\xeb\xd1\x7f\x29\x8a\x74\x06\xa9\x68\xe4\x37\x9a\xd3\x9e\xb8\x50\x27\x02\x01\x25\x36\x10\xa1\xc1\xd7\x0f\xe9\x04\x40\x71\xfc\xaa\xc8\xca\x9d\xbe\x6c\x26\x73\x9a\x1d\x94\xff\x67\x40\x45\x42\x0b\x9e\x0c\x55\xff\xed\x22\x7b\x03\x5b\xf2\x25\x45\xb3\x1b\xb4\xe8\xa8\xf7\x22\x93\x3c\x47\xdb\x5f\x20\x6f\xa9\x9a\xf2\x83\x2a\xa1\x47\x71\x3c\xda\xc5\x31\x0f\xa9\x3c\xea\x0c\x50\xde\x43\x1b\x0e\x19\x71\x41\xa4\xa9\x87\x33\xd2\x0b\x43\xe3\x03\x1f\x5e\x89\x44\x79\x77\x04\x10\xb4\x1b\xf0\x86\x47\x0a\x3a\x27\x40\x01\xfb\x79\x36\x97\x79\x86\xaf\xa9\xe9\xdd\xb2\xa7\xad\xd0\x47\x09\x5f\x3b\x67\x1b\x80\xa2\x29\x62\x31\x72\xcd\x63\x8d\x28\xbc\xfe\xeb\x0b\x28\xbc\xaa\xb5\xa7\xf1\x88\xcc\x82\x2c\x9c\xa4\xbf\x72\x7c\xbf\x71\x20\x6b\x1a\x4f\x44\xeb\x51\x01\xc2\x3c\xbe\x50\x6b\xd3\x1b\x8c\xff\x16\x0f\x19\x00\x3c\xb5\x96\x48\x58\xb0\x6b\x38\x71\xaa\x82\x82\xdc\xb5\xad\x78\x62\x5c\x63\x8b\x41\x8e\x47\xa8\xb8\x20\x06\x34\xbe\xa0\x15\xbb\x13\xc5\x26\x9d\x79\x4f\x96\x4c\x74\x2d\x81\x4a\x3f\x29\xd8\x7b\xc0\x59\xbd\xec\xc8\x43\xd1\xb9\x78\x44\x68\xa2\x6f\x22\xef\x1b\x99\x8a\x62\xe3\x61\x1c\xb7\x37\x63\x0b\xef\x64\x43\xa1\xe4\xe2\xca\x29\x6a\x5d\x60\x02\x48\x9d\x08\xf8\x0f\x84\x2f\x9a\xb0\x14\x00\x53\x63\x77\xe5\xc7\xc5\xb8\xfa\xb8\xba\xf8\x64\x36\x6b\x3a\xb3\x0e\xc4\xb7\x79\x31\xdd\x20\xa4\xb7\x6f\xa4\xde\x19\xfe\xbe\x95\x57\xc9\x1c\xe1\xf0\x81\x6c\x0f\xa5\x21\x46\x7d\xac\xda\xef\xab\x59\x1b\xc2\x62\x5a\xf1\x8d\x3c\xd4\xbf\x9e\xb3\x39\x58\x4b\xc1\x5f\xaf\xcf\xd9\xbc\x49\xa0\x19\xd8\x8a\x92\xe8\xb9\x1e\x34\x89\x80\xc8\x2e\x76\xca\x0b\x0b\x1e\xd4\x5a\x1b\x84\x73\x7e\x07\xc3\x4a\x39\xd5\x0c\x24\xdc\x32\xfb\x4a\xdc\xa4\x7c\xa2\xdf\xfb\xcd\x39\x7b\x34\x9b\x19\x13\xaf\x06\x54\xff\x9d\x11\x81\xfd\x9e\x57\x1f\xcc\x6f\x9b\x4b\xb3\x2b\x7b\x7e\x2d\x7e\xa5\x61\x2e\x55\xee\xfb\x99\x5e\x43\xa0\xdc\xa1\xa9\x47\xe6\xd6\xdb\x3e\xdd\x6d\x16\xd6\x0e\x43\x61\x18\x3e\x72\xa8\x3a\x01\xde\xfa\xde\xde\xb7\x4f\x9f\x57\xc9\x02\x61\xb0\x01\x74\x9b\x16\x9a\xd6\x03\xfc\xaf\x0a\x06\x08\x72\x79\x68\x25\x8e\xed\xbc\x4e\x0c\x29\x75\xfe\x68\x36\x6b\xf1\x98\x02\xa7\xba\xa0\x01\xeb\x54\xb6\xc8\xd9\xa8\x9a\xea\x49\x3f\x1e\xf5\xd3\x8a\xbf\xc9\xd2\x70\x92\x25\x2d\x49\x6a\x32\xf4\x72\x99\xac\xc1\xad\x53\x92\xb4\x65\x63\xcb\x41\x36\xb6\xf4\xd9\x58\xda\x81\x0d\xc8\xed\x4d\x95\xe3\x4d\x45\x85\xbb\xdd\xc1\xcc\xb3\x91\xc9\xa9\x79\xcd\x34\x11\x92\x47\x54\xf6\x3e\xe3\xaf\xce\x12\xb6\xf7\x0d\x70\x5c\x88\x5a\x1b\xc7\xc9\x8f\x70\xf5\x0e\x88\x89\x08\x7d\x36\xf8\x09\x22\x6b\x8c\x66\x84\x02\x77\xe6\x1a\x13\x64\xa0\xa3\xf0\x62\xbc\xdd\x0a\x91\x0f\xde\x9f\x6f\x64\x70\x7f\xb6\xe5\x9e\x7d\xf7\x02\x0c\x1f\x5e\x76\x47\x72\xb2\xac\x23\x0c\x07\x06\xef\xce\xba\x25\x2e\xbc\x68\x22\x9d\x34\x08\x23\x32\x6b\x00\xaa\xd9\xa7\xf2\xf5\xfd\x1b\xb8\x74\x29\x72\xf7\xff\xd2\xf6\xe6\xed\x6d\x22\xd9\xc3\xe8\x57\x91\x78\xfb\xc7\x5b\x35\x2a\x2b\x68\xb7\x90\xcb\xfa\xb9\xb3\x74\xd2\x93\x74\x32\x71\x3a\x3d\x33\x6a\x4d\x1e\x8c\x4a\x12\x13\x0c\x1a\x40\x72\xdc\x86\xfb\xd9\xef\x53\xa7\x16\x0a\x84\x1c\xf7\x3c\xf7\xfa\x0f\x0b\x8a\xda\x97\x53\x67\x3f\xfa\xf6\xf8\x02\xb7\x07\x60\x17\xcd\x19\x50\x13\x73\xda\xbc\xf3\xd4\xa1\xd0\xba\x94\x7e\xc2\xbc\x8c\x29\x5e\xd2\xab\xc4\xdb\xf0\x5f\x84\x67\x57\x89\xd2\x66\x68\x72\xe5\x0c\xc1\x1d\x1b\x3c\x3c\x7f\x43\x60\x53\x2a\x15\x3f\x4d\x65\x45\xf8\x9e\x9a\x18\x16\x2f\x26\x93\x2b\xa8\x7b\xe9\x66\x5a\x98\x2d\x09\xe3\xb8\xc6\xf6\x8c\x52\xa2\xa6\x17\xc1\x01\x63\xf2\xb6\x39\x73\x82\x0b\x41\x04\x13\x98\x48\x5c\x90\xb4\x6a\xb6\x7e\xca\x50\x3b\x58\xa3\xd0\xb6\x51\xbb\x49\x66\x9d\xe7\x1a\x06\x9f\xbd\xf1\x2e\x40\x81\x0c\xaa\xd7\x36\x42\x0a\x07\x39\xc6\x32\x00\xc4\x55\x1c\x94\xa7\x15\x07\xe5\xc2\xad\x87\x61\xf5\x0f\xdb\xc5\xcc\xcf\xd6\x6b\xe1\x4c\x24\xbe\x63\x2b\x6a\xf9\xf1\xee\xfe\x1d\x40\xd5\x86\x7a\x13\x6f\xf3\xe6\xd6\xdb\x30\xdb\x6e\xef\x34\x42\xf4\x0d\x59\xc1\xed\xc6\x32\x34\x16\xac\x5d\x9c\x06\xbc\x39\xb7\xb5\x0e\xbe\xb1\xd5\xac\x05\x46\xc3\x2d\x67\xd6\xca\xe2\x1d\xff\xb5\xf0\x2c\xea\xa6\x89\x4f\x2d\xde\x86\x1b\xf0\x4a\x9f\x6d\x82\xf5\xec\xc6\x4b\xd9\x78\x48\x3e\x3a\xe1\x4f\xef\x5f\x84\xdb\xab\xbf\x5d\xfd\x78\xc5\xff\x9e\xbf\x1e\xfd\x78\xf5\xf2\xaf\x57\x57\x2f\xaf\xde\x42\x02\x4f\x7f\x79\x75\x75\xf5\xe6\xf9\xa7\xab\x97\x57\xef\xef\x28\xb5\x08\xe0\x15\xdd\x3b\x41\x90\xc9\x20\x71\xb4\x47\x8e\x19\x09\xfc\x7f\xb4\x12\xce\xc7\x23\x4c\xa2\xee\x17\x7e\xef\x44\xd2\x24\x1c\x00\xca\x23\xa3\x47\x11\x71\x38\xe4\x04\xcd\x44\x11\x13\xe5\x97\x78\x55\x75\x69\x1e\xa9\x8d\x52\x10\x4e\xa6\xba\x80\x59\x7e\xf2\x30\x01\xca\xb6\xf9\xe8\x81\x0f\xf5\xa2\x50\xce\x5b\x8f\x70\x34\x8e\xe3\xa6\x5a\x37\xb7\x61\xcb\xad\x42\xe5\x49\x55\x01\x1b\x91\xdd\xc0\x83\xf7\x12\x0f\x16\x1f\x80\x68\x90\x5f\xb6\xe5\x17\x00\xeb\x8d\x2d\xbc\x4e\xaa\x95\xdf\x84\xfb\xa4\x31\xe3\x3b\x95\xb1\x90\xc4\xcf\x2f\x9e\x09\x5b\x64\x90\x01\x3e\x22\x11\x32\x82\x58\x09\xe3\xe4\x74\x05\x18\x0a\xbc\x4d\x04\xf4\x68\xc6\x16\x99\x50\x50\xfc\xe0\xa1\x8f\x9e\x24\x8d\x65\xe7\x54\xb5\xb5\x1e\x96\xae\x06\x3d\xf4\x2e\x81\xfe\xf1\xbe\x81\x3e\xc9\x0f\x15\x42\xad\x29\xb2\x20\xf9\x28\x23\xaa\x24\xb8\x4e\xf2\xc8\x48\x45\x86\x2e\x52\x73\x8f\x23\x23\x8b\x6d\xb7\x23\x09\x0f\x24\x31\x67\xdb\xaf\x13\xbe\x77\x40\xfb\xe6\x9d\xea\xcf\xd7\x10\x7f\x0d\xeb\x8e\x8d\x7d\x6c\xdb\x5f\xc3\x85\xbf\x94\x41\x93\x16\xfe\x92\x5c\x87\x78\x76\x08\x34\xf1\xba\x0e\xa2\x20\xdd\xbe\x01\x7d\x01\xf3\x4d\x64\xd0\xd4\xb0\x88\xce\xf0\x2e\x2c\xb9\xa3\x7b\xfc\x2e\x5c\xec\x25\x51\x3d\xfb\x59\xf5\x23\xe5\xd5\x54\x29\x62\x2b\xde\x65\xc1\x6d\xf0\x07\x0b\xd9\x26\xb8\x09\xc2\x20\xbb\xb7\x28\xdd\xb0\xec\x79\x7c\xbb\xdb\x67\x6c\x05\xe4\xb9\xb4\x65\xe5\xa0\x15\x64\xcf\x1f\x59\xb4\x62\x89\x20\xa9\xf5\x27\xc9\x6a\xa9\x7c\xa7\x16\x9f\x64\x0b\x17\xaf\x43\xe5\x22\x29\xa5\x9f\x43\xf2\x3a\x94\x4c\x0b\x61\x8d\x92\xa4\xf4\x6b\x08\xe7\xe6\x5d\x48\x17\xcb\x92\xf2\x78\x7b\xcc\x58\x97\x2a\x2d\x32\xa2\x28\x50\x22\xc2\xe2\x95\x48\x53\x65\x91\xea\x01\x27\x42\x5a\xf7\xcd\x03\xba\x11\x21\x2b\xc5\x72\xb9\x11\xb5\x38\x86\x65\x95\x4c\xee\xba\x86\x40\x2c\x84\xed\x10\x9b\xfd\xdf\x28\x96\x0a\x02\x7c\xb3\x86\x78\x16\x8b\x6a\xc0\xf4\xda\xb6\x91\xf9\x2a\x38\x49\x50\xad\x4f\xf6\x54\x14\x94\x01\x4e\x9f\xfd\xeb\xf7\xf4\x2f\xcf\x30\xa7\x09\x38\x12\x9a\xe7\xcf\x7e\xbf\x96\x56\x09\x22\x1f\x96\xba\xaa\xc6\x38\x90\x4f\x2b\x43\x41\x01\x91\x75\x0a\x99\xb4\xd2\x38\xc1\x44\x55\x41\xe9\x8f\x79\xee\x5f\xf6\x46\x8e\xa8\xae\xad\xdc\xe0\xce\xd4\xa8\x0b\xe1\x58\xd3\x87\xf0\xe7\x56\x14\x67\xd6\x4c\x7c\xa0\x34\x9a\xfb\x34\xbb\xf4\x84\x21\xeb\x5c\xa9\x41\x28\xd3\x55\x35\x01\xae\xe3\xc2\x9c\x8b\xfc\xa9\xc1\xb3\x15\x9d\xfc\x35\x0a\x32\xb7\xb4\xe3\x96\xd9\xce\x9a\xb3\xd5\x63\x78\xf2\x51\xf3\x4a\x23\x4c\x7c\x6a\xc4\x24\xf5\x95\x60\xd4\xb2\xc8\x96\x3a\x22\x7c\x5d\xb5\xc2\xdf\x82\x6c\xfb\xc9\xbb\x49\x8d\x48\x1b\x86\x48\xc4\x7f\x16\xe2\xd9\x6e\x76\x76\xb6\xc3\xdb\x0e\x0d\xc9\xaa\x43\xad\xdf\x33\x30\x6e\xdb\x5e\xf8\xb6\x8d\x56\x1d\xfa\x33\xf2\xcf\xb6\x18\x93\x55\x9b\xee\x15\xbf\x6d\xe3\x21\x8f\xac\x40\x4c\xc4\xaf\x0d\xf8\x2d\xa7\x5d\xdb\x9e\x92\xa3\x6d\x40\xda\x8e\x3e\xa4\xa0\x2f\x73\xe1\x19\x6e\x7d\xd5\x71\x5d\x2b\xfd\x8e\x03\x35\x3f\x2f\xd6\xb0\x4b\x0e\xa5\x8f\x16\x4a\x33\xdb\x3e\x28\x27\x5b\x17\xba\x0b\x52\xa0\x5b\xed\xd7\x0c\x14\x80\xd6\x4a\xea\xbc\x21\x1b\x1d\x2f\xab\x90\xa7\x11\xe2\x4f\x07\xd9\xeb\x38\xfe\x4a\x1b\x2c\x51\xdf\x85\x32\x2c\x16\x16\x57\xda\xb7\xba\xf1\xd3\x3f\x81\x5f\xfb\x2d\xa4\x86\x37\xe3\x97\xe1\xb1\x0a\xb8\x38\xb0\xc7\x26\x8f\x84\xe3\x90\x89\xa9\x80\x14\x96\xd4\xec\x59\xdf\x71\x48\x4c\x65\x3c\x13\x30\x4d\x53\xb8\x57\x85\x39\x76\x19\x92\x94\x7e\x02\x21\xb1\x2f\xfa\x17\xac\x51\x6c\xdb\x49\x75\x96\x2f\x7b\x38\x58\xa3\x6f\xa1\x6d\x7f\x0b\xc5\xf1\x11\x5e\xd7\x7f\x8f\x2c\x4c\xa9\x40\xf0\x6a\x45\xfe\x47\xe5\x14\xaf\x94\x3a\xf8\xc1\x07\xe8\x54\x81\xbb\xd5\x5c\x22\x36\x8e\xf4\x93\x6c\x46\x34\x92\xd9\x16\xfb\x25\xc6\xf2\xfc\xa5\xba\xe6\x5a\xcb\xb6\x5d\x6e\x6c\x18\x2c\x54\xf1\x81\x25\x1a\x0f\x84\x23\xf2\x57\x94\x36\x78\x12\x5b\xb0\x65\x81\xcb\xcb\x61\x45\x95\x62\xd5\x1e\x6e\xc1\x37\x7c\xb3\x92\x6d\xbd\xc9\xb3\xde\x6c\x7b\x49\x9d\xd9\xf6\xec\x4c\x2c\xdb\x4e\xe7\x58\x6c\x97\x64\x4d\x77\x4a\x8b\xe6\x40\x77\xa0\x2b\x33\xdb\x95\xca\x6d\x20\xc1\xb8\x74\xe6\x6b\xbe\x09\xd7\x52\xf3\x01\x74\x35\xb0\xab\x56\x4d\x33\x44\x6d\xbb\x1d\xcf\x0f\x3c\xe7\x41\xe4\xd4\x4a\x51\x42\xbd\xe9\xd8\xc1\x1c\x39\x74\xfd\x6d\xe7\x6f\x28\x55\x21\x27\x31\x76\x63\xbe\x92\xb0\x9a\x22\x32\x70\xca\x9a\x97\x36\x35\xde\x6c\x1b\xad\xe9\xc1\xe8\xa3\x96\xf6\x6e\x64\x80\xaa\x35\xc9\x62\xf7\x20\x82\x52\xf9\x73\x7f\xb1\xfd\x1f\x5f\x36\xb9\x74\x53\xa5\x6e\x17\xe4\x39\x8a\xe7\x72\x67\xea\xf1\x19\x1c\xda\xcb\x70\x0e\x46\x69\xae\x86\x0d\x10\x7e\x4a\x90\xe9\x1b\x4c\x84\x2d\x26\x7c\xfa\xc8\x3c\x30\xc5\xdc\xe0\x22\xe3\x13\x63\xdb\x9f\x04\xfe\x47\xc0\xe4\x9c\x34\x2c\xde\x45\x1f\xb4\xa6\x8f\xd2\xe9\xaa\xcc\x9e\xdd\xf3\xeb\x9d\x63\x3c\x8d\x87\x86\x36\x74\x9a\x9e\xf5\xca\x63\xfc\xa6\x22\x95\x10\x01\x09\x6f\x62\x2f\x59\x71\xd2\x04\x5c\xa1\x9b\x09\x4d\x41\x95\x0c\xf1\xbc\xd4\x56\x96\x5e\x10\x11\x26\xb5\xc0\x64\x10\x5f\x49\xab\xc8\x07\xa9\x77\x13\x8a\x11\x89\x90\xc4\x25\xb6\x15\xd5\x42\x8b\xc9\x16\x5e\x86\x10\xb7\xdf\x51\xc4\x8b\x88\x80\x54\x40\xa8\x7d\x3d\x22\x39\xad\x0f\x95\x5b\x03\x8e\x53\x12\xf8\xc0\x0a\x37\x4f\x1d\xdc\xc0\xc2\xdb\x01\x6e\x70\xcc\x4e\x12\x1a\x1d\x9d\x9f\x84\x9f\x9f\x44\x9d\x9f\x40\xe7\x50\x11\xd1\x51\xa0\x40\xf7\x65\xcf\x71\xf2\x3c\xe1\xe4\x87\xca\x72\xd6\x5b\x9a\x80\x3e\x30\x3c\x73\x95\x60\x54\xc6\x00\x04\x37\x15\x82\x85\x13\x52\x11\x5f\xdd\xab\x0e\xa5\xd4\x80\x14\x11\x82\x6b\x9f\xcd\x78\xc1\xa0\xa6\x00\xa1\x63\xdf\x1f\x55\xa3\xfc\x4b\xc4\x60\x7c\x80\x1f\x42\x0a\xf8\x98\xd1\x39\x85\x73\xe9\xab\x05\x00\x5b\x59\x8d\x5c\xc6\x5a\x82\x40\x79\x0c\xf7\x18\x75\xbf\x92\x4a\x8d\x50\xcf\x18\x98\xc6\x3c\xd2\x3c\x9e\x85\xca\xc4\xb9\xd2\x12\x3f\x5a\x66\xf5\x95\x90\x57\x61\x83\x3f\x18\xed\xc8\xa4\xee\x84\xbf\xc1\x1c\xbc\x9e\x45\xb9\x35\x11\x5d\xf3\xe8\x83\xe0\xb7\xb9\x09\x47\xda\x38\xbd\xc9\xbc\x15\xbc\x08\x1f\x97\xb3\x48\xb9\xd3\x27\x99\x0a\x40\xb9\x61\x99\xf2\xfe\x21\x99\x75\x9e\xd4\x48\x54\xee\x2e\x45\xbc\x3c\x22\x5a\x74\x23\x63\x3c\x1f\x0c\x5c\x19\x58\x7f\x57\x59\x96\x04\x37\xfb\x8c\x21\xc0\xc2\xfd\x38\x49\x98\x9f\x59\x24\x9a\x5b\x96\x6b\xc5\xeb\xb5\x25\x79\x84\xf5\x8c\xde\x2e\xc8\xbc\x10\xa8\xb9\xe4\x91\xbc\xe9\x8e\x85\xa1\xbf\x65\xa0\xcf\xd0\x36\x95\x03\x7e\x09\x75\x18\xba\x6f\xc8\xe2\x5d\xf6\x12\xe6\x9d\x60\x31\x78\x37\x69\x1c\xee\x33\x36\x6b\x09\xad\x11\xb7\x75\xd6\x63\xb7\xb3\xd6\x4e\x44\xb7\x02\xb6\x03\xf0\x04\xdc\x56\x6f\xf7\x6d\xd6\x12\x7c\x01\xb7\x05\x99\x6e\x83\xe8\xac\x92\x10\xef\x33\x3e\xfd\x6e\x2b\x8a\xc1\x84\x28\xd3\x0c\xa9\x05\x5b\xca\xb6\xf9\x55\xb4\x0e\xe3\x3b\xb7\xb5\x0d\x56\x2b\x16\xcd\x5a\x65\x6f\x12\x16\x7a\x59\x70\x60\xba\xcd\x81\xd9\xa6\xb3\xfb\x36\x2b\xdd\xa5\xa5\x60\xaf\xc2\x89\x1e\xc1\xb3\xb0\x7a\x8e\xe3\xec\xbe\xc1\x9d\x50\x99\x29\x90\x24\x12\x39\x8d\x1b\x69\x46\xc6\xcb\xdd\x88\xe0\x94\x56\x6f\xf7\xad\x95\xc6\x61\xb0\x6a\xdd\x84\x9e\xff\xd5\xc2\x84\xaf\x26\x26\x46\x00\x8f\x8f\x0d\x98\x55\x46\x42\x1a\x09\x52\xa5\xd4\x32\x4e\x69\x60\xdb\xd2\xdb\x3f\x33\x74\x2d\xcf\x22\x37\x2a\x91\x37\x5f\x07\x17\x00\x85\xa9\xd2\x69\x16\x84\xc8\x11\xba\x35\x92\xd0\x50\xf6\xb3\x57\x19\xe2\x2f\x1d\xc4\xaf\x7a\xc7\x3d\xeb\xf1\x63\x47\x83\xf4\x17\xef\x17\xe4\xe3\xa6\x90\x09\x06\xf6\xae\x2f\xf9\xb8\x72\xb3\x43\x85\xd1\x5f\x10\xd4\xe9\x5f\xd2\xd1\xa8\x3f\x1d\xdb\xb6\x7f\x31\x1a\x0f\xfa\x8e\xcb\x53\xf8\x03\xa4\x4c\x06\xc3\x01\x9e\xf7\xdd\x1e\xc6\x98\x9c\x45\x65\x78\x80\x93\xe6\x4c\x5b\x30\x48\x6d\x74\x56\xa2\xae\xa7\xbf\x7b\x48\x14\x99\x45\x10\x14\x3d\xab\x84\x90\x00\x9f\x25\xd5\x34\xad\x6e\x4b\x75\x08\x08\x37\x02\xf7\x24\x0e\xb0\xaf\xfc\x2d\x27\xab\x74\x1e\x19\x63\x40\x0a\x6b\xf6\x0c\x05\x75\xa5\xdd\x90\x06\x0b\x6f\x29\xd4\xd6\x9a\x94\x64\x6d\x3b\x14\x5a\xaa\xff\xd3\xa7\xd0\x46\x72\xe9\xcc\xc3\x6e\x16\x5f\xf2\x8a\x5c\x11\xa2\xe3\x02\xb4\x62\x8f\x07\x25\x6d\x3e\x6a\x01\x2c\x65\xb6\xbf\x82\xa7\x09\x53\xcb\x20\xc9\xe6\x8c\x57\x0a\x12\x41\x33\xee\x65\x64\x06\x54\x6d\xd4\xcf\x88\x69\x9c\xe7\xef\x05\xbb\x94\x64\x42\xff\x3f\x06\xbb\x90\x87\x1b\xc6\xd1\x26\x87\xb0\x68\xe5\x56\xe6\x12\x42\x4b\xfa\xa8\x8c\x00\xa1\x66\x65\x9e\xa2\x88\x9c\xf5\xc4\xcc\x0a\x95\x3e\xbd\xa1\xcd\xb9\xc9\xf3\x1e\xa5\xa1\xe9\x6f\x66\x45\xcb\x14\x4a\x93\x0b\x87\x6c\x29\xaf\x6c\x25\x74\x8d\xcb\x30\x43\x5b\x4e\xf0\xcd\xb7\x17\x34\x84\xd0\xd6\xdb\x0b\xba\xef\xf2\x0e\x6e\x2f\x65\xd4\x13\xdb\xde\x5e\xd2\x7d\x17\x3a\x5f\xd1\xbd\x28\xb5\x7b\xb7\x64\xd5\x10\x4e\x42\xa0\xcf\x95\x3d\x99\x88\x8b\x66\xc6\x2e\xf9\x0a\xb2\x32\x94\x14\xeb\xd0\x4c\x87\x80\xe7\x10\x2a\xa4\xd9\xa5\x23\x94\xb0\x3d\xa5\x9c\x1c\xd3\x70\x9e\x88\x8e\xb8\x29\x02\xf9\x1d\x91\x63\x11\x71\x5a\x2e\x68\x6c\xdb\xfc\x9a\xcf\x62\x30\xa1\x09\xe7\x22\xdd\x4d\x11\x4f\x23\xe0\x18\x4a\x54\x20\xb3\x42\x25\x7a\x54\x3e\x8d\x49\x38\xaf\x8e\x2d\x45\x3e\xe9\x95\xd1\x39\xb0\x5b\xfd\xec\x93\xca\x78\xfd\x82\xd3\x08\xc8\xeb\x24\x24\x21\x7b\xe8\xda\x5a\xd5\xbe\x9e\x09\xea\x96\xef\x5b\x31\xc7\x29\x92\xf3\x0a\xc3\xa8\xd8\x97\x1e\xf2\x3c\xb9\x74\x6c\xfb\x40\xab\xc7\x2e\xcf\xdb\x88\xb7\x90\x00\xec\x29\x63\x6c\x91\x84\xf8\xe8\x80\xb1\x84\x3f\xeb\x82\xa3\xc6\xb7\x24\x16\xd6\xab\x7f\xf7\x90\x78\x9a\x69\x31\x72\x08\x38\xa0\x67\x1a\x2d\x97\x3a\xfc\x20\x3e\x4b\x95\x17\x13\x14\x5d\x30\x15\x16\x3f\xba\xa4\xf2\xb9\xc3\x44\xa4\x79\x30\x20\x56\x93\x22\xac\x43\x32\x43\x13\xff\x07\xa9\xf9\x58\x20\x43\xb7\x32\xa3\x2c\x44\x01\x51\x5d\x94\x33\xad\xc2\x74\xd1\x70\xa6\x3d\xdb\x18\x9a\xb0\x49\x9e\xd7\xe0\xb3\x8f\x4a\xd9\x82\x72\xfa\x28\xd2\xdb\x8e\xf1\x45\x6a\xca\xf2\xf2\xc2\xff\x1f\xcf\x53\x52\xaf\x70\x19\xae\x68\xf9\x8d\x6c\x39\xaa\x0f\x81\xe0\xfd\x5b\x88\x3a\xcf\xc2\x1d\x4b\x50\x26\xdc\x15\x8a\x20\x00\x98\xec\x68\xdb\x99\xf1\xc9\x71\x70\x9e\xfb\xa8\xbd\xc3\xb3\x1d\x6d\xf7\xc4\x2c\xae\xcd\x5b\x43\xde\x18\x58\x84\x7f\x26\x07\x9a\x30\xb4\x26\x5b\x3c\xb7\xee\x2c\x77\x65\xdb\x3c\x95\xd2\xf5\xdc\x8a\x2c\xb7\xbd\xca\xf3\x67\xbf\xa7\x92\x1f\xb6\x96\xeb\x69\xed\x80\x3f\xb3\xb2\xed\xf6\xce\xb6\xdb\x07\xdb\x46\x07\x6a\xf1\x5e\xec\x6d\x7b\xdf\xa6\x07\xfc\x10\x5d\x00\xe0\xa5\x3d\xe2\x23\xac\x97\xa0\x84\xbc\x3a\x48\x38\x2f\xbc\xa7\x07\x4c\x22\xbe\xc1\xda\xd0\x73\x2c\xbe\x0a\x1a\x30\x16\x01\x82\x3c\x12\x1a\xbe\x6c\x5a\x5e\x86\x3c\xb2\xe1\xcb\xbd\xe9\x6e\x83\xec\x3a\x58\x09\xf3\xc5\x4d\x79\x37\xbf\x3a\x66\x53\x82\xd9\x11\xc7\x6e\x63\xa9\xa2\x00\x40\x0c\x24\xc3\xfa\x86\x4d\x4d\x7b\xa0\x63\xad\xa4\x52\x76\x4a\x3e\x22\x86\xbb\x41\x14\xb1\x44\x24\xe4\x39\x47\x0f\xba\x4a\x86\x27\xc3\xa0\x56\xca\x54\xb8\x67\xe9\x59\x77\xf4\x97\xd0\xd0\x0a\xc6\x64\x80\x67\x01\x85\x6b\x37\x93\xea\xba\xe0\x39\x7d\x87\x3b\xd1\x5f\x7c\xd8\x90\x4a\x8b\x3a\x11\xfe\xea\x8c\x9c\x9d\x81\xc8\x7b\x36\x10\x8c\x86\x19\xf2\xe8\xdf\x39\xa4\x8b\x49\x80\x71\x37\xde\x67\x69\xb0\x62\x33\xa1\xbc\x71\xe1\xcc\x83\x0b\xea\xb8\x01\x07\xac\x02\x91\xc2\x0f\x9e\x31\x95\x6a\x85\x3a\x74\xf4\x97\x48\x99\xc6\x7b\xb0\x26\x2f\xc2\x0a\x67\x4a\x46\xe2\x56\xfe\x2a\x42\x2f\xcd\xae\x00\x4d\xfe\x25\x5e\x31\x5a\x4b\x13\x6a\xc5\x65\x2a\x90\x91\xd5\x8c\x90\x24\xf3\x09\x95\x37\xa1\x02\x1a\x86\x9c\x20\x16\x9a\x53\xa2\xcd\xf8\x96\xa3\x88\x3c\x51\x67\xdb\x24\x9e\xcf\x3e\xb0\x24\x88\x21\xce\x2a\xa4\x25\xcc\x5b\xbd\x78\xff\x4e\xca\x0d\x84\xde\x4b\x89\x73\xfd\xbb\x42\x55\x7f\x8a\x4a\xa4\x0d\x70\x92\x28\xcf\xa3\xae\xc0\x48\xb1\x01\x13\xa5\x06\x92\xe1\x86\x5f\xf9\x62\x7b\x19\x21\x8e\x0e\xaa\x04\xaf\xd9\x39\x1b\x09\xa9\xc5\x37\xa0\x35\xf3\x80\x88\xda\x0b\xcb\x36\x7f\x8b\xff\xa7\x3f\xb7\x12\x19\xa8\x02\x72\x48\x7c\x81\xbe\x8a\x50\xd0\xbd\xf5\x76\xca\xe6\x4d\x1d\x85\x58\x4a\xd8\xa8\x2c\x46\x69\xdc\xf5\xe3\x30\xf4\x76\x29\x9b\xc7\x00\xda\x63\xa1\x2c\x41\xe2\xf2\x74\xfc\x54\xd5\x87\x16\x46\xdf\x37\xde\x4a\x18\x01\x97\xf9\xfe\x08\x2b\x5e\x0a\x40\x83\x9e\x1e\xfb\xdf\x11\x4c\x6d\x94\x1c\x7f\x31\x55\xc0\x23\xed\xdb\x0d\xda\x07\x86\xc5\x87\x38\x15\xfe\xcb\x55\xb9\x43\xc0\xee\x3e\xc5\xe0\x40\x92\x1f\x78\xb9\x09\x22\xea\x08\x80\xcc\xb7\x76\x42\xb3\xd9\x2c\xa1\x89\x21\x28\x94\x5c\xf5\x3c\x4f\x9a\x7a\x67\xae\x1c\x30\x15\xcb\x82\xb6\x6d\xbe\x35\x15\x16\x27\xa1\x34\x5f\x74\x66\xc1\x45\xb5\xbb\x0d\x2e\x48\xab\x19\x16\xc1\x52\x20\x06\x11\xb4\xa1\x98\xff\xad\x1f\x43\xbe\xec\x10\x39\x41\xcf\xf8\x8f\x61\xdd\x2f\x04\x80\x6e\xb8\xe6\x40\x0e\x2a\x1c\xdc\x81\xa2\x72\x9e\xb7\x5f\xa2\x84\x64\xe6\xb4\x26\x19\xfa\x3b\xdf\x96\x62\xff\x39\x62\x16\xc5\xb2\x09\xa0\xd1\x76\x48\x46\x93\xea\xba\xf0\xf9\x25\xed\xcc\xe0\x6b\x24\x2c\xcd\xe6\x7f\x43\xe2\x01\xbb\xac\xe2\xd4\x5c\x37\xe3\x61\xe2\x99\x18\x01\x26\x81\xc0\x3d\x42\x3a\xe0\xc8\x02\x1f\xef\xa7\xfb\x1d\x9b\x67\x42\xcd\x31\xa6\xc2\xa6\xa0\x1d\xda\x76\x8f\x67\x28\x7b\xa1\xf9\xac\x50\xb0\x1c\xae\xae\x03\x0e\x4a\x65\x22\x84\xa4\x29\x84\x1c\xe0\x6c\x4b\xb3\x22\x67\xb1\xb1\xa8\x6d\x9a\xcc\x70\x4c\xcd\x24\x29\x0f\x66\xdd\x5b\xe6\xa5\xfb\x84\x11\x9f\xa6\xfc\x70\xa5\x86\x1b\x31\x89\xae\x1b\x86\xab\x67\xbd\x59\x70\x81\xfc\xb9\xaf\x83\x97\x61\x58\xf3\x32\xe4\x5f\x70\xe1\xcc\xa1\x22\xd7\x5f\x04\x4b\x19\x95\x56\x99\xe7\xcd\xc2\x0e\x1d\xa8\xa0\xb4\xde\x22\xec\xf4\x85\x59\x20\x44\x87\x8c\x29\x95\x4b\xbe\xa7\x7f\x67\x88\x57\x24\xe6\xdc\x15\x4b\xb0\x08\x96\x98\xac\xc0\x96\xb0\x93\xc8\x75\x40\x10\x62\x2f\x6e\x53\xd0\x59\x80\x8f\x1d\x94\xcc\xc1\x9e\x0e\x64\x22\x7b\xb2\x52\x1e\x87\x56\x74\x8f\x42\x40\xfe\x45\x78\xf5\x72\x25\x57\x24\x28\x59\xd3\x5b\x1a\x77\x23\xf6\x2d\xbb\x0e\x6e\x38\xbc\x25\x3b\x1a\xce\x8f\x27\xf8\x2c\x72\x9d\xd9\x76\xb6\xa5\x5b\x33\xb3\x08\x1a\x4e\xf7\x68\x4b\xb6\xe6\x32\x39\xb5\xed\x29\x99\x31\xab\xae\xbf\x3d\xdb\xf1\x1d\x33\xdb\x75\xe8\x16\xb6\x11\x58\x36\x44\x9a\x14\x29\x05\x35\x31\x70\x2c\x83\x78\x9f\xaa\x9e\x1d\x68\x34\x5b\xcf\xd6\x74\x5d\xff\xa2\xbb\xb1\x26\x6b\xb3\x1b\x1c\xa4\x9c\xea\x47\xe7\x00\xfd\x38\x74\xe8\xba\xa9\x1f\xc5\x0b\xd3\x96\x21\x88\x82\x8c\x1e\xeb\xcd\x2a\xff\x4b\x20\xcb\xa6\x11\x47\x27\x03\x1a\x75\x57\xc1\x81\xb2\x63\x3f\x65\x5e\x95\xd1\xa5\x1c\x71\xcd\xb2\x59\x46\xb3\x3a\x60\xcb\xca\xd0\xac\x6d\x47\x38\x7e\x34\x1d\xaa\xa1\xb9\x0b\xa7\x7d\x7e\x17\xac\x36\x2c\x33\xdc\xaa\x95\x6e\xd4\x24\x18\xd3\xc6\x49\xa5\x1b\x4a\xa9\x41\xc9\x3b\x64\xdb\xed\x5b\xb8\xae\xb0\x14\xbe\x34\x78\x37\xc6\xff\x0c\xd1\x83\xe2\xef\xbb\xfc\x92\x65\xdf\x32\x37\xa9\xa8\xc4\xa4\xa0\xb5\x06\xfc\x76\x0e\x51\x33\x38\xbd\xc9\xf7\x7c\xd1\x95\x51\x93\x93\x2a\x3d\x1b\xa4\xec\x79\xbc\xbb\x7f\xbe\x57\x9a\xa6\x52\xa3\xf3\x7d\x88\x12\x3c\xab\xf6\xc7\x11\xfd\x11\x74\x4a\x53\x27\x1a\x23\xc6\x27\x35\x27\xbb\x99\x0a\xf3\xe9\x90\x5f\x39\x99\xf6\x9d\x9e\x17\xb8\x00\x1e\x76\x85\x03\x0f\xe6\xf3\x15\x96\x3c\x28\x8b\x02\x53\x5e\x89\xd6\x8e\xa5\x23\xb3\xe3\x8a\xea\xea\x47\x21\xc8\x14\x1e\x63\xf6\x73\x8a\xca\xf0\xc8\xd5\xc0\xef\x2f\x04\x14\xfa\x25\x04\x87\x10\xb1\x71\x4e\x66\xc9\xf7\x54\xbe\x62\xd2\x94\xa5\xac\x01\x93\x54\xd8\x35\x34\x0d\x4f\x70\xb1\xde\xa0\xa0\x6a\x2e\x89\x67\x1f\x50\x7a\xd2\x56\xa3\xa1\x39\x53\x31\x28\xc6\xc4\xd7\x7a\x93\x3e\x58\x3d\x46\xdd\x74\x1b\xdf\x7d\x10\x4e\x2f\x2a\x01\x5a\xc0\xe4\x35\x00\xb5\x6b\x8e\xa5\xaf\x82\x4c\x3a\x3f\x21\x1f\x38\x19\x58\x6e\xbd\x92\x95\x6a\x24\x1a\x4c\xdb\x7a\xaa\xe6\xd0\x0a\xb3\x50\x25\xf4\xa8\x88\x03\xdb\xfc\x94\x81\xb1\x57\x02\x4e\xd9\xde\x88\x10\xcd\x79\x1e\x5f\xd0\x9a\x26\x7f\x12\xa0\xa4\x51\x8b\x51\x88\x97\x5e\x25\xf1\xed\x8b\xf7\xef\xe0\xa0\xf5\x95\xf2\x6d\x40\x2c\x89\x15\x43\xbf\x6a\x3a\xd4\x1c\x59\x37\xb0\xe6\x07\x50\x13\x63\xa0\x93\x45\x56\x71\xc4\x0f\x73\xd1\x54\x8f\x68\xf0\x64\x45\xc2\x57\xe6\xe3\xd5\x36\xf6\xaf\xaa\x19\x5c\xad\x54\xf8\xe3\xf5\x32\xaf\x4d\x8d\x54\x48\x11\x5e\x2d\xbd\x95\x9c\x81\xeb\x98\x4f\x0f\xa9\xe4\x8a\x23\x56\x6a\x24\x07\x27\x54\xca\x0d\x0b\x09\xd0\x48\x7a\x5e\xf6\xec\x65\xb4\x42\x65\x69\x21\x2f\xac\xaa\xd3\x1a\xa3\x6f\xe8\x8d\x31\xda\xdd\x3d\x1c\x58\xf9\xba\x87\xe3\x5b\x90\xca\x7d\x92\xfa\x09\x63\xd1\x47\xe6\xad\x58\xf2\xd6\xbb\x81\xe8\x08\xd1\x86\xad\x2a\x77\x0c\x9b\x4b\x3b\x99\x43\x5d\x3a\x90\x04\xde\x59\xc8\x8b\x59\x84\x61\x57\xe7\x12\x07\xa4\x39\x63\xbd\x07\xbb\x84\xf1\x1b\x47\x9f\x13\x5a\x57\x2a\xa3\xcf\x85\xbe\x12\xbf\xd4\xda\x25\x7b\x88\x69\xcf\x20\xba\xd9\xea\xa9\xa6\xca\x76\xe8\x40\x58\x7d\xd4\xdb\xf8\xae\xa1\x41\xa0\x4a\xda\x2c\xcf\xdb\xb2\xbd\x26\x4c\x3b\xcf\x11\x92\x6d\xe7\x39\x47\x7e\x84\x19\x50\xe3\x89\x27\xfa\xdb\xbb\x7d\x98\x05\xbb\xd0\x74\xed\xcf\x70\x7d\x2a\xcc\x6b\xac\xc1\x85\x52\xbd\x53\xcd\x7e\xa1\xaa\xea\xa1\x0d\x03\xaf\x77\xf3\x78\xc2\x05\x39\x5b\xa9\x87\x48\xc2\xd9\xbf\x05\x9b\x0a\x25\xe8\x2a\x3d\xfb\x04\x34\x51\x1a\x01\x1e\x4d\x84\x46\x00\xc8\x12\xab\xb4\x15\xa5\xd5\x14\xbe\x75\xf3\x5c\xfa\xcc\xa7\xf5\xdc\x79\x2e\xb4\xc9\x2e\x8e\x0b\x61\x05\x86\xaf\xc2\x10\x44\x64\xa9\xe4\x81\x49\xbf\x33\x7f\x80\xaf\x46\x29\x35\xe3\xc8\x8c\x7e\x11\xf4\x3d\x26\xb1\xca\xb3\x56\x8c\x00\xf5\x2c\x73\x00\x9d\x13\xe6\x79\xc8\x89\xd3\x3c\x6f\xc7\x79\x1e\x8b\x47\xe1\x76\x26\xcd\x38\x56\x8b\xc1\xf3\xa6\x48\x89\x65\x8a\x87\x15\x43\xa7\xda\x71\xe2\xd3\xe6\xa1\xbe\x02\xfe\xf2\xbf\x79\x7f\x78\x6d\x0f\x1c\xe9\x75\xc1\x5e\x42\x12\x09\x1c\xaf\x5f\xf4\x97\x44\xd0\xdb\xae\x53\x90\x3d\x6d\x9c\x9b\x4f\xb1\xac\xc7\x13\xfd\xdf\x2b\x36\x78\xba\x28\x65\xd3\xba\x5a\xb2\xa5\x2b\xa0\x3d\xe6\xe2\x67\x21\x7e\xca\x8c\x2e\x24\xcc\xf6\x54\x74\x69\xbb\xd8\x96\xdf\x54\x67\x8c\xc4\xfe\xf2\xcc\x78\x1b\x2c\x0b\x8e\x9b\xb4\xfd\x3c\x6f\xef\x6b\x48\xc1\xf1\xe2\x01\x9b\x9c\xac\x39\xfd\xc7\x93\x9e\xc7\xfb\x08\xbc\xc4\x2a\x19\x28\x84\x3e\x00\x2f\x8c\x3b\x7a\x87\x7c\x20\x0c\x88\x2f\x39\x10\x64\x5f\x3e\xf0\x0f\x58\xda\xc4\x1f\xf0\x43\xb1\xb3\x6d\x24\x43\xca\x9b\xba\x99\x73\x8e\xeb\x48\x66\x45\xbd\x3a\x4c\x76\xfa\xdb\x0a\x34\xdb\x8f\xfa\xcb\xf7\xd3\x6a\x25\xa4\xb3\x3b\x8c\xb1\xfb\x84\x4c\x64\x2d\xcc\x4b\x38\x4e\x58\xee\xcc\xb9\x91\x69\x8d\xdd\x48\x81\x14\x7e\x67\xfc\x54\x32\x95\x40\xd7\x5b\x30\x95\x6e\xd9\xed\x8d\xa1\xfd\x83\x38\xa1\x55\x3b\xe8\xb5\xc2\xcd\x87\x7c\x56\x31\x21\xaa\x73\xb1\xf0\x31\x5f\xeb\x84\xd6\x6e\x9d\xf7\xa5\xdd\x5a\xc4\x91\xbc\x4f\x10\x96\x5c\xe4\x66\x14\x58\x81\x74\xff\x56\x2a\xac\xd4\xcb\xd3\xb6\x53\x08\x35\xda\x06\x88\x76\x0c\x5c\x2b\xd7\xd7\x5b\x54\x87\x9c\xda\x32\x80\xa8\x80\x59\x29\x26\xc7\xd9\x74\x27\x44\x4e\xfd\x5a\xef\xc3\xd1\x82\x3c\x09\xa4\xce\x9a\x78\x96\x15\x88\xd5\xcc\xc0\xac\xc2\x31\xd2\xc0\xcf\x34\x41\x5a\x23\x6f\xb3\x02\xe7\xea\x13\xaa\x7a\xf8\x26\xe2\x08\x6a\x9c\x3c\x6d\x30\xfc\x9c\x9b\x27\xf7\xd8\x02\xae\x72\x8e\x39\x12\x73\x1b\x47\x57\x91\xcf\xd2\x2c\x06\xcf\x04\x5e\x10\x31\xc5\x5d\x68\xbd\xd4\xb7\x3a\xe8\xdc\x57\x7a\x28\xee\x7d\xa3\x57\x56\x14\x8b\x55\xb4\xda\xea\x96\xd2\xe8\x71\x22\xd5\x8a\x6c\x1b\x21\x71\xad\x1f\x0d\x10\x71\x64\xf8\x14\x16\xd1\xd6\x58\x84\x79\xd5\x97\x23\x17\x1c\xe2\x1a\x0e\x83\x80\xf3\x45\x74\x95\xda\xdf\x62\x75\x20\x37\xe1\xbe\x32\xbb\x3a\x3f\xff\x70\x74\x77\x2b\xc3\x81\x53\x98\xc1\x2a\x38\xd4\x97\xd2\xf4\xaf\x7c\x5c\xac\xed\x1c\xed\x63\x9f\x05\x07\xb6\x7a\x55\x9f\xe0\x72\xd9\x25\x1e\x30\x3b\x35\x93\x27\xb4\xe4\x4b\xdd\xaf\x38\x0c\x2b\xe8\x49\xdf\xc1\x6e\x14\x68\x04\xaf\x89\xe8\x78\x1c\x28\x54\x78\xf4\x10\x70\xa2\xbe\x05\x76\xc2\x97\x18\x4b\x0e\x5e\xa8\x1b\x68\x31\x81\x4b\xdf\xd6\x15\xf6\x51\x56\xef\x24\xc9\xaa\xd5\x9f\xac\x1b\xec\xd0\x4e\x1d\xa7\x23\xc4\xfa\xb1\xd3\xa4\xe7\xab\x84\x06\xed\xba\x3c\xe3\x17\x70\x2f\x5f\x85\x06\x47\x99\x44\x32\xcf\xa6\x41\x42\xbb\x41\x04\xa2\x33\x1c\x55\xf3\xea\x24\xa0\xa8\xcc\x92\x39\xac\xd2\x42\xf7\x58\x04\x62\xdb\xed\xfa\xa5\xa2\x8e\xd5\xd1\x8d\xf1\x24\x74\x94\x03\x9e\x7b\xdb\xde\xcb\x5a\x0c\xe8\x7d\xec\x27\xa6\xea\xce\xdf\x60\x80\x1d\x73\xbe\x82\x35\x7a\x66\x70\xb9\x44\x5d\x67\x12\xe3\x6e\x62\x71\x69\x0e\x99\xe6\x72\x21\x73\xf5\x34\xfb\x4f\xf5\x32\x4b\x82\xcd\x86\x25\xef\xa3\xbf\xb2\xfb\x17\xf1\x5d\x84\x1e\xf8\xa4\xba\xa5\x79\x8f\xf4\x58\xef\x9e\x93\x2a\xff\xc4\x55\x0e\x58\xd5\xd6\x17\xc0\x42\x78\xac\x87\x04\x09\x6d\x04\x9b\xbe\x22\xad\x92\x20\xa6\x01\x81\x90\xd6\xd3\xdf\xc7\x9a\x93\xef\x62\xcd\x91\x6d\x27\xc7\xba\x99\x99\x27\xfd\x49\xbd\x0b\xc0\xdb\x1d\xf9\x15\x13\x14\x09\x74\x3a\xe1\x3f\xc2\xf4\xed\xe4\x41\xe7\x27\xab\x8e\xe4\xf0\x1d\x28\xb9\xa5\xb4\x66\x66\xd4\x6e\xde\x7c\xe8\x18\xe1\xa9\x66\xc1\x27\xe5\x76\x62\x8a\xa4\x58\x57\x13\x43\x9c\xec\x29\xbd\xab\x26\x0d\x84\x51\x48\x3d\x45\x18\xc5\xd4\xd3\x84\x91\x43\x69\x08\xbe\xf8\x84\xc2\xf2\x65\x62\x06\xe2\x05\x71\x43\x02\x81\xbc\x44\xe4\xae\x1f\x18\x82\xba\x49\xa8\x43\x87\x29\x71\x03\x89\xc1\xfd\x9c\xce\x11\x1f\xeb\x4b\xdb\xb6\x48\xbc\x48\x0c\x2f\x93\xb6\x8d\x62\x5a\xb3\x11\x96\xd5\x5f\x04\x06\x6d\x26\xbe\x5f\x06\xa5\x70\x4c\xdf\xec\xa1\xd6\x4e\x2d\xb3\x3b\x94\x22\x46\x77\x09\x4a\x64\x65\x18\xcf\x45\xd4\x29\x91\x0b\xc2\x41\x81\x78\x28\xa2\x65\x0a\xa0\xec\x6e\x25\x1f\x3b\xca\xc7\x38\xe1\xc2\x73\x56\x18\xff\xca\x71\x21\xd9\x8b\x56\xe3\x52\x82\xba\x57\x5d\xd3\x34\xcb\x1c\xa5\xb4\x1c\x89\x26\xc7\x5e\x04\x07\x98\x19\xc1\x42\x74\x51\x6a\xf4\x63\xdf\xe9\xc9\x9e\xc8\x02\x65\x2a\xf4\xa5\x2e\x01\x20\xed\xa8\x9c\xa1\x52\xeb\x5e\x6e\x8d\xd2\x00\xe0\x11\x17\xf9\x16\xe8\xf1\x82\x51\x79\x53\xcc\xb3\x94\xf2\x9a\x4b\xc5\x3d\x70\xf8\x8b\xbc\x0e\x8d\x49\x2a\x1f\xf8\xb6\xe3\xd9\x0c\x1d\xcc\x3d\x70\x72\xf8\x11\xe0\x24\x7a\x87\x9a\xae\x15\x56\xd2\x37\x46\xcf\x94\x9b\x95\x5a\x30\x9b\x0a\xd3\xc7\xbf\x3d\xcb\x8e\xd5\xba\x01\xfc\xec\xb5\x1b\x02\xb2\x6d\x2a\x77\xeb\x25\x5f\x41\x07\x23\x58\xa3\xad\xb2\x2b\x10\x46\xed\xef\xbc\xe4\x2b\x48\x63\x13\x69\x53\x23\xb4\x62\x1b\x0c\x1a\x5a\x0d\xe6\x89\x59\x37\x58\x51\xca\x8a\x02\x75\xb6\x65\xfc\x30\x88\x08\xb1\x2b\x1d\x18\x78\x74\xc7\x37\x1b\x44\x4b\x76\x30\xb6\xed\x3d\xfa\x59\x49\xd1\xc5\x21\x25\xfc\x80\x62\xc1\x33\x8e\xc1\xe3\xe9\x1a\x59\x6b\x2f\x4c\xc1\x1d\x7d\x7d\x40\x02\xf4\x30\xc9\xc6\xb5\xb0\x29\x21\x58\xd3\x67\xff\x42\xbb\x84\xe5\xab\xe0\x90\xef\xf2\x30\xc8\x21\x53\x7e\x93\xe0\x1f\x9e\x05\xea\x02\xe1\x73\x0d\xf7\x07\x00\xeb\x67\xff\xba\x49\x9a\x3e\x82\x4b\xaa\xac\x41\x38\xa4\x1a\x5c\xdb\xb6\x6f\xc4\xb5\x3b\x50\x67\x76\xb8\x68\x10\x70\x82\xef\xd8\x15\x32\xbf\x2c\x0e\x4b\x3c\x93\x5d\xdd\x35\x76\xcd\xb6\x91\x88\x68\xb0\x06\xb0\xd4\x96\x6e\x23\x5b\x15\x21\x2b\x9f\xcb\xcc\x90\xd5\x95\x0e\xbd\xf6\x7d\xc7\xb9\x11\xbe\xbc\xcc\x54\xc7\xf1\x1c\x70\xdc\x65\x61\x0c\xb2\xb6\x19\xdf\x84\x24\x6b\xd3\x68\x86\xf9\x65\x6c\x4a\x02\x61\xc7\x6b\x45\x10\x94\x90\x88\xf8\x24\x23\x29\xc6\x64\x4b\x7f\x56\x90\xcf\x30\xc8\x4a\x4b\x88\x99\x56\x40\x21\xc6\xb3\x95\xe1\x93\x79\xab\x9f\x67\xfc\xca\xff\x1b\x5a\x61\x4a\xff\x86\xb6\x18\xaf\xba\xbb\x78\x87\x30\xd9\xca\xdf\xf4\xec\x4c\xcb\x88\x56\x0b\x67\xd9\xa6\xdb\x85\xb3\x14\x92\xad\xd9\x4a\xd8\x30\x41\x76\xf5\x94\x75\x3a\x45\x69\x76\xe6\x90\x35\x75\xc8\x81\xf2\xa2\x64\x03\x65\xc9\x7d\xa9\xee\x73\x50\xca\xa4\x1b\x6d\xaf\xb5\xbb\xb8\xb7\xed\x83\xa9\x6c\xbb\xc3\x94\x6e\xaa\x09\x33\xdc\xe9\xec\xf4\xba\xdf\x52\x3e\x00\x72\x03\x23\x20\xcf\xcb\xea\x6f\x15\x00\xe4\x27\x5c\x8d\x7f\xbe\x73\x1d\x4c\x6e\xcc\x4f\x5b\xf3\x13\x9e\xad\x2f\x9e\xdb\xf6\xad\xd9\xa2\xae\x68\x7d\xd6\xc3\x94\xde\x98\xdf\x6e\xcc\x6f\xbc\x63\xeb\x99\x00\x29\x2b\x7d\x02\x8d\x26\x6c\x3b\xa3\xd2\x7f\x20\xc8\xb0\x67\x3b\xdb\xde\x5d\x8a\x2b\xf1\xbf\x6d\x72\x77\x76\x46\xd6\x9d\xce\x6c\xb5\x58\x95\x5c\x2a\x7a\xab\xcd\x07\xca\xaa\x8c\xad\xf8\x2f\xb1\x43\x3b\xcf\xf8\x0e\x25\x7c\x7d\x60\x91\x64\xa1\x1d\xae\x6f\xe5\xce\x0f\x90\x13\x0e\xf9\x95\x30\xb2\xdb\x61\x72\x4d\x61\xd7\xe9\x09\xe4\x2b\xa0\x5b\x73\x4b\xe5\xb1\x72\xf3\xe5\x39\x6f\x26\xcf\x83\x0c\x5d\x91\x6b\x3c\x47\x1b\x4f\xee\xd8\x15\xb9\x22\xd7\x86\x1d\x61\xdb\xc1\x2e\x80\xd7\x3a\xbd\x66\xfa\x83\x39\xa2\x23\x9b\xe5\x0a\x75\x82\x2f\x65\xd9\x7f\x55\xb2\x21\x8f\x59\x4f\x0d\xef\xcc\xf3\xa7\x22\x5e\x4d\x8a\x55\x35\xa1\x13\xa9\x91\xc9\xdf\x25\xb3\x6b\x22\x92\x13\xac\xb0\x47\x48\x96\xa6\xfe\x9e\x60\x85\x81\x04\xb5\x01\x7b\x24\xcc\xc4\xc2\x05\xb3\xa4\x2a\x34\x52\xb0\x9c\xd5\xe6\xa0\x60\x47\x52\x37\x72\xee\x1c\x0d\xb2\x92\xe7\xc4\x10\x35\x65\x6c\x5a\x5b\x29\x69\x87\x81\x4c\x23\x2c\x8d\xab\x4e\x12\xe5\xeb\x04\xd4\x6a\x9b\xc8\xdd\xec\xd7\x48\xdd\x88\x55\x21\xd2\x91\xd8\x53\x5e\xac\xb5\x1a\xca\x98\x55\x95\xe2\x0e\x35\x22\x77\x49\xe3\x7c\x73\x7f\x35\x98\x95\x35\x8f\x36\x29\xc7\xf5\x32\xc4\xfa\xf9\x74\xd8\xae\xb2\xd9\xb9\x8e\x23\xe6\x96\x89\x98\x1c\x2f\x86\x62\x3a\x35\x09\xd3\xf4\x6e\xad\x4f\x87\xe8\x01\x32\x99\x59\xac\x5e\x71\xc5\xff\xa6\xb9\xca\x4d\x07\xfb\x83\x3c\x9b\x8f\xe4\x8b\x18\x5b\xa5\x72\xd5\x35\x66\x43\xa5\x33\xad\x5f\x1f\x55\xb6\xe4\xd3\x2d\xec\x0c\x2d\xab\xc2\x83\x79\xe5\xa5\x99\x56\x80\x6c\xd0\x9d\xdc\x7a\x69\xc9\x36\x50\xf9\x9a\xce\x3d\x0c\x22\x03\xbb\xc5\x5e\x31\xfb\xf5\x4f\xab\xc1\x28\x0e\x81\xf8\x05\xaf\x36\xc2\xf3\x86\x8e\x8c\x21\x5c\x7f\x4a\x73\xa4\x9a\x7e\x8c\x74\xd3\xf2\xff\x91\x42\xca\xff\xff\xfa\x25\xf3\x93\x7a\x24\x30\xa3\xbf\x62\x17\x45\xd5\x45\x0b\xa4\xa6\x44\x56\x57\x94\x20\x1f\x50\x80\x71\x51\x53\x5f\x41\x49\x83\x91\xa8\xe1\xa8\xad\x60\x5a\x22\x59\x51\xd9\x80\x49\x56\x3e\x92\xca\x3c\xa6\xce\x86\x88\xa8\x54\x31\x9d\x72\x76\xdf\xac\xd3\x42\xf0\xd0\xb6\xe3\x4b\x3a\x95\x06\xa1\xa6\x19\x74\x35\x41\x50\xee\x24\x82\x7d\x68\xc8\xc6\x1b\xd4\x23\x8e\xf5\x22\xf4\x80\xab\xb6\xb2\x7a\xc8\x24\xea\xae\xbd\x34\xfb\x00\x55\x1b\x72\x77\xde\x57\xaf\x2a\x85\x17\xaf\xcc\x70\x33\x55\xef\x81\x74\x4e\xf8\x25\x52\x8e\x81\xa0\x3f\xd2\x03\x44\x3b\x00\x26\x83\x97\xf9\x5b\x70\x17\xa9\x88\xae\xef\x75\x10\xb0\x86\x48\x33\x84\x04\x79\x09\xbe\x3d\x79\x2d\x48\x99\xc6\xce\xbc\xaa\x4a\x8f\xf0\x2c\x5d\xbe\x93\x5a\xf3\xc8\x53\x0e\xdc\x58\xa9\x15\x43\x2c\xc1\xb5\xa9\xab\x3a\x48\x3f\xc6\x75\x5f\x87\x8f\xab\x8b\xa8\x6b\x0b\x4e\x92\xf0\xd5\x84\x2c\x0e\x9b\xc1\xd1\x90\xa1\xa9\x61\xbc\x88\xed\x2e\x14\x9d\x20\x60\xa0\xa1\x17\x22\xbc\x3a\x31\x61\x26\xe9\x26\x5d\x4e\x88\x8a\x88\x75\xa4\xd2\x44\x16\x5b\x98\x3c\x68\xb6\x9e\x5b\xf1\x57\xa5\xaa\xb3\x0a\xdc\xa8\xab\x52\xd5\x29\xc1\x0f\x95\x8e\x22\xb5\x07\xc9\xd3\xba\x0c\x1b\x97\x5f\xaf\x15\xb8\x67\x40\xb1\x63\xd8\x2c\x4f\x96\x50\xac\xaa\x80\x36\x6a\x7e\x37\x4e\x5e\xad\xf6\x3f\xa3\x0c\xa2\xaa\x7e\x82\x46\x88\xce\xfa\x1d\xb5\x90\x5f\xff\x9c\x5a\x88\xba\xb9\x0d\xaf\xa1\x44\xda\x64\x93\x84\x3e\x4f\x64\xec\xce\xd2\x3e\x8d\x37\x0e\xc0\xef\xb7\x20\xdb\x8a\x15\x57\x86\x81\x3f\x83\x21\x5c\x95\x73\x27\x43\xc9\xaf\x82\x83\x05\x8e\x68\xbf\x1b\x02\x27\x94\x06\x43\x8f\xf9\x43\x4f\xba\x19\xfb\x14\xef\x68\x93\x25\x64\xd6\x68\xeb\x71\xd6\x73\x48\xd0\xcd\xe2\x5d\x27\x04\x13\x0b\x0f\x8c\x32\x30\x04\x4e\x07\x97\x71\x4f\xa9\x0a\x9c\x1a\x8b\x9a\x42\xb6\xce\x3a\xa1\xf0\x92\xe9\x09\x17\x9a\xb8\x8c\x3f\x58\xdb\x10\x27\xf4\x64\xcc\xfb\xd6\x60\xb9\xcf\xde\x0a\x0e\x6e\xa3\x6c\xf5\xb4\x34\x95\x08\x86\x2d\x13\x53\xa3\xd0\x6d\xed\x1c\x4f\x78\x11\x8a\x77\x2a\x43\xc7\xda\x7d\x93\x18\x47\x35\x0f\x78\xa4\x64\x72\x5a\x20\x57\x7d\x53\xd5\xe8\x1d\x79\xcb\x4b\x1c\xb0\x44\xac\x3e\x30\x58\xb8\x3a\x96\x69\xdb\xca\xf8\xbe\x22\x7d\xa8\xe3\x2a\x0e\xc9\x1a\x51\x85\x87\x23\xb4\x69\x66\x30\xd8\x8e\x04\xc3\xfa\xd4\x88\x4b\x3a\x22\x59\x5d\x52\xf5\x01\x55\x32\x0a\xa7\xbc\x70\x2b\xa2\x63\x44\x4b\x99\xc7\xb2\x3c\x47\xb5\x8e\x34\x35\x67\x59\x8f\xd7\xc6\xa1\x93\xec\x68\x05\x4d\xab\x4d\xf8\xf7\x64\x96\xaa\xd5\xfa\xbe\xfb\x8e\xe0\xb2\x57\xcb\x7f\x24\x11\x0e\xd6\xe8\x89\x42\xe1\xf6\xad\x16\xfe\xea\x29\x68\x94\x00\xeb\x69\xc6\x59\x72\xff\x50\x2d\xa0\x62\x5f\x08\x9d\x93\x37\x0c\x3f\xd4\x27\xa2\x51\xd4\xab\xcb\x2b\x79\xef\xf1\x66\x6d\xc2\xe1\x4f\x1c\x8f\x53\x27\xc2\x39\xaa\xf7\x84\x94\x57\x88\xe1\xc2\xf8\x4e\x60\x34\xf5\x35\x91\x1f\x4e\xd0\x96\x75\x0a\x40\x1e\x9e\x3f\x2d\x97\x05\x75\x12\x79\x53\xb2\x06\xf1\x2c\x33\x7b\x58\xef\xa3\x42\xc7\x8e\xfb\xc8\x51\x73\xd9\xd1\x2a\x9d\xe2\xd4\xa4\xbb\x7d\xa7\x14\x11\x0b\x75\x4b\xd1\x99\x3c\x67\x73\x94\x1d\xd1\x38\x46\x6f\xb0\x8b\xd8\x71\x7d\x63\x07\x8c\x3e\x8f\xae\xb7\x93\x33\x69\x68\xda\x45\xd5\x9d\xa7\x48\x1a\x7d\x72\x35\xf4\x39\x09\xbb\xf4\xd9\xe4\x54\x7e\x75\x2a\xf3\xfc\x3d\x43\x11\xc7\x34\x13\x25\x94\xad\x28\x96\x56\xa9\xe6\x66\x87\x2c\x3c\xdd\x0c\xe3\x5f\x55\xfa\x08\x68\x24\x7d\xcc\x07\x6b\x14\x88\x68\xec\xcd\xa0\x51\x17\x13\x6e\x35\x25\x6a\x7f\x04\x75\xc0\xeb\xd3\x8d\x6d\x3f\x5b\xfc\xbe\x5f\x4f\x1c\xe7\x8c\xff\xac\xd7\x2a\xaa\x7f\x50\x0a\x59\x1b\xfd\x8e\x63\x22\x5a\xd0\xea\x8b\xa6\x32\x62\xca\xc2\x57\xb1\x19\x21\x43\x5b\x61\x9b\x0c\x47\x61\xce\x74\xde\x77\x06\x94\x7a\x62\xea\x50\x42\x2d\xc1\x19\xb4\x30\x39\x1f\x8f\xc7\x94\x7a\x15\x61\xaf\x6a\x5c\x6d\xff\x4a\xac\xfa\x7d\xb4\x8a\x2d\x5c\x18\xb1\x4e\xb4\x99\x66\x10\xa1\x44\xb1\x85\x03\xcd\x16\x4e\x2f\x7c\xdb\x4e\xcc\x3e\xa5\x98\x56\x3b\x99\x02\xf7\x35\xd5\x76\xd4\x35\x49\x2c\xb8\xc7\x09\x54\x14\x41\x4c\x54\x23\x67\x92\x52\x34\x18\x50\x73\xeb\x2f\xe2\x99\x59\xae\xa0\xa4\x02\xcd\xbf\x64\x83\x3c\x0f\xb4\xa7\x18\xa0\x1b\x2f\xcf\x7a\x73\xb9\xe4\x94\x55\x6e\x3a\xd7\x7c\x0d\xcc\x26\x84\xef\xa2\x13\x08\xf1\xd1\x17\x9a\x19\xa8\xbb\xf1\x51\xd8\x18\x66\xff\x0d\x2a\x2f\x1d\x03\x55\x8f\xe7\xa3\x9c\x55\x03\x06\xc8\x5d\x2a\x40\x84\xba\x29\xab\x30\xa2\x7e\xf2\x9b\xf8\x5b\x06\x41\x7b\xea\xb2\x15\xdb\xa7\xa4\x37\x8f\x6a\x6d\x64\x0c\x1d\x07\x68\x07\x05\x5e\xed\x97\x9f\x04\x92\xfa\x07\x06\x48\xd6\x00\x48\x38\x89\x7d\x9c\xaa\x89\xc9\x6d\x02\x31\xd8\x89\x4f\x93\x06\x3f\xce\x60\x78\x68\xdb\xed\x2d\x27\x86\xca\xcb\xd7\xe4\x53\xbc\x37\x3b\x6e\xdb\x67\x3d\xca\x7b\x27\xa5\xe8\xda\x3f\xbd\x87\x6d\x3b\x09\x50\x44\x32\x0f\xa3\x48\xe9\x11\x78\x98\xfc\x2a\x3a\xb2\x27\x2b\xaa\x18\x08\x7e\x9a\xf2\xfd\x41\x2a\x1e\x96\x2b\x5f\xd6\xc6\x17\xa1\xef\xf9\x01\x34\x3f\x1e\x8b\x62\x74\xa2\x2e\x6a\x38\xae\xe1\x90\x30\xf0\x2d\x12\x9c\xce\x52\xfa\xb6\x51\xde\x64\x1c\xd3\x9d\x0c\xbc\xfd\x1e\xb5\xe0\x0f\x5c\xeb\x5a\x1d\xa4\xa3\xeb\x9e\xad\x81\x00\x18\x61\x8e\xdb\x2a\x1f\xbc\x46\x86\xbf\x9f\xad\x05\x5a\x2f\x73\xa8\x8a\xfe\x38\x83\x53\xea\xb6\x7a\x8e\xe3\xcc\x5a\x37\x9e\xff\x75\x93\xf0\x61\x42\xe9\x70\x6e\x25\x9b\x1b\x0f\xf5\x47\x23\xd2\x2a\xff\x75\x9d\x11\xb6\x5c\x2b\x4b\xbc\x28\x15\x7a\x31\x16\xee\x58\xba\xce\x8a\x5b\x9d\x59\x4b\xf8\xad\x39\x93\x83\x72\x66\xf5\xef\xc7\x1e\x76\xe2\x9d\xe7\x07\xd9\xbd\xcb\x1b\x9a\xb5\xd6\x41\x98\xb1\xc4\x6d\x79\xe1\x6e\xeb\x21\xf9\x8d\x8e\xf0\xcc\x02\x91\xf6\x9e\xd6\x4c\x76\x94\xf3\xd0\xcf\x01\xbb\x93\xdb\xed\x1f\x1c\x92\x55\x83\x54\xa4\xb6\xfd\xfd\x72\x9f\x62\xe0\xf3\x92\x7d\x59\x5e\x41\xec\xa8\xe9\xb2\xca\x73\x54\x32\xce\x0c\x18\xd7\xb2\x84\x21\x48\xfd\xa8\xd0\x0d\x49\x8e\x6f\x97\x72\x93\x57\xdd\xf8\x27\xdd\x15\xcb\x44\x28\x0f\xd1\xe4\x15\x3f\xfb\x1a\x3a\x1c\x10\x26\x5f\xf1\xc3\x17\xc6\x89\x5b\xc3\x2b\xae\x8e\xf7\x56\x51\x6f\xdb\x34\x64\xa8\x06\xa5\xd9\x08\xfb\x1d\xe9\x7f\xd0\x4c\x1f\x99\x41\x69\x0e\xa5\x56\x57\x9b\x9f\x33\x75\x78\xaf\x21\xa4\x90\x44\x5e\x1a\x67\x8b\x78\xfa\x76\xec\x20\x36\x97\x33\xe7\x5a\x16\x9e\xa9\x59\xe4\xdf\x7b\x2b\xaf\xe4\x47\x7a\xc4\x9c\x58\x06\x1e\xa7\x64\x1d\xa4\xde\x38\xed\x99\x49\x2f\xa3\x95\x0e\x48\xf9\xf8\xac\x57\x22\x0f\x0a\x3b\xc7\xa6\xb5\xa3\x1b\xa1\x95\x74\xfc\x05\x90\xbf\x66\x90\xb0\x3b\x82\x00\x2b\x11\x91\x64\xca\x6f\x6e\xb1\xeb\x6e\xbc\x24\x05\x7e\xad\x02\x95\xa8\x09\x7e\x52\x5f\x11\xc7\x47\x93\x8e\x1f\x84\x6d\x02\xd4\x8b\x61\x67\x08\x05\x25\xea\xcc\x9a\x36\x51\x93\xbc\xaa\xe5\x49\xf3\xc3\xfa\x34\x95\xf3\x24\xa2\x61\xd5\x1a\x87\x98\xd4\xc6\x9c\x5f\x3a\xb6\xad\x56\x88\x9a\xa7\x62\x0e\x30\xdb\xe7\x30\x1b\xbb\xac\xd3\xb9\xe8\x39\xf3\xef\x75\xce\x23\x23\xc7\xc1\x2e\x6a\x5c\x3e\x11\x3f\xbd\x72\x4a\x41\x87\xd4\x01\xe5\xb0\x5f\x9f\x2a\x83\x61\x26\x7a\x5c\x67\x96\x29\x0c\x77\x45\x4b\x12\x92\x2a\xa9\x87\xc1\xcb\x12\xd5\xd3\x76\x9b\xd5\x29\xa5\x66\x19\x18\x7e\xa8\xe5\x3b\x21\x7c\xe9\x35\xc6\xc5\xa9\xba\x47\x9e\x19\x34\x0a\xe8\x0e\x11\x30\xf9\x54\x2e\x95\x17\xd1\x92\x26\x24\xe0\x7b\x97\x3f\x7a\x35\x87\x58\xf8\x01\xc2\x8b\xd9\x76\x20\xdf\x0b\x37\xc0\x05\x93\x3e\x60\x65\xe8\xa6\x88\x30\x08\x5c\x46\xaf\x43\x12\x21\x0b\x8e\xa6\x45\x2c\x93\x69\x6e\x38\x71\x80\x51\x83\xea\x07\xc4\x23\x68\x3b\x98\x17\xba\x8d\x57\x4c\x1a\xab\x56\x4b\x09\xc5\x26\x33\x50\x14\x79\x13\x40\x34\x2c\x59\xb2\x74\x08\x6c\x91\x3e\x79\x13\x54\xd3\x95\x5f\x5f\x88\x62\xc7\x93\x0d\xff\x8c\x96\xca\x2a\x3d\x37\x5b\x64\x58\x99\xd0\x4f\x41\x19\x9e\x6b\x9d\x98\x6d\x56\xf4\xac\x1a\xbb\x0d\xec\x44\x43\x25\x8b\x66\xa5\xfb\x0e\xf0\x14\x28\xbe\x02\x83\x75\x26\x9e\x83\x8c\x25\xa8\x49\xed\x34\xa0\xce\x6c\x56\xfa\x3c\x00\x11\x8c\xc2\xa6\x33\x22\xa2\xfc\x72\x6c\xc8\x93\x3a\x26\x01\xf5\x3a\x86\xcf\x31\x70\x10\x08\xea\x52\x1e\xc6\x45\xd2\xe9\x14\xa5\xfe\x0f\x27\xbc\xb4\x1b\xca\xe0\x92\x3a\xb3\xe0\xec\x0c\x6f\x94\xc7\xd1\x8c\x44\x8b\x60\x49\x92\x0c\xf1\x5f\x61\x88\x0e\x4f\xfe\xb6\x53\xea\xc9\x14\x85\x98\x59\x23\x38\x94\x45\x38\xe5\xe5\x38\x40\x79\x39\x4e\x6f\xcd\xff\x4f\xd6\xf0\x32\x85\x17\x6f\xf5\xfb\xde\x19\xf7\x7c\x01\x0c\xe0\x3f\x83\xff\x6b\xfe\xbf\x7f\x0e\xff\xa7\xf0\x7f\x05\xff\xe1\xeb\x78\x0c\xff\x27\xf0\x7f\xfa\xfb\x7e\xcd\xd6\xeb\xdf\xf7\xeb\xf5\x7a\x7a\x06\x3f\xfe\xf2\xd9\x86\xd4\xb7\xb0\x0e\xa0\x6a\x74\x10\x64\x1b\x1f\xd9\xe6\xe5\xb7\x1d\xe2\x94\xe6\x3e\xf1\x59\x07\x49\xff\x92\xd6\xef\x99\x85\xe1\x32\xc9\xf9\x13\xb1\x36\x16\x26\xf2\x20\x70\x70\xb1\x4e\x58\xba\x05\x19\x51\x75\xd8\x1f\x42\xcf\x67\xdb\x38\x5c\xb1\xc4\x22\x59\xd4\xa4\x91\x66\x16\x57\xbb\xa9\xe2\x39\xd3\x2a\xf7\xaf\x0a\x71\x66\x91\xdb\xf9\x91\x0a\x99\x6b\x38\x47\xac\x90\x1d\x49\x7c\x07\xbe\xc6\x5e\x72\xfa\xc5\xac\xa6\xe5\x7b\x51\x2b\x8a\xb3\x16\xba\x67\x19\x6e\xdd\xb0\x96\x2f\x00\x1e\x84\x44\x6b\x25\xfb\x28\x0a\xa2\x4d\x8b\x81\x7e\xbe\x55\x76\xaf\xe2\xac\xb1\x77\xea\x50\x6f\x58\x06\x80\x5c\x46\x2c\x30\xec\x92\x69\xa6\xab\xaa\x38\x93\x7c\x7a\x5d\x46\xb1\x7a\x65\x86\xc3\xc9\x3f\x59\x9f\x2e\x69\x54\x99\x64\xe1\xbb\xf8\xc0\x3e\x07\xe9\xde\x0b\xc3\x7b\x8b\xb4\xaf\x20\xfd\x6e\x1b\x87\xe0\x4a\x59\xc4\x03\x10\xe2\xca\x12\x7c\x6c\xd9\x2d\x07\x78\x12\xa6\x56\x85\x85\x10\xed\x92\xdc\x56\x40\x96\x08\x01\xd7\x5c\xc2\x74\xaa\xf2\xb3\x07\x11\x8c\xa9\xdc\x7a\x3f\x7b\x28\xc2\xb3\x80\xdf\xa9\x2b\x96\x79\xfe\xb6\x7c\x02\x39\x24\x49\xba\x5e\x26\xd2\xd5\x13\x62\x24\xc8\x73\x29\x21\x82\xbd\xf6\x2d\x4b\xbc\xbf\xb2\xfb\x54\x40\x2d\x48\xf3\xe3\x68\x1d\x6c\xf6\x09\x7b\x27\x22\xac\xeb\x0f\xa6\x9b\x3e\x98\xdf\xbb\x50\x0d\x41\x86\x4e\xb5\xc8\x62\x79\x0c\xb0\x8f\xd5\xea\xe9\x26\x00\x55\x70\x53\xa0\xfd\x0b\x78\x6f\x4f\xeb\x93\x03\x71\x43\x7e\x82\xa2\x7c\x86\xbf\x53\x7b\x6a\xf2\x2f\xb3\xb9\x6f\x3a\xaa\x02\xc6\xbe\x6b\x39\x16\x69\x3a\x75\x3e\xa7\x34\x44\x3b\xbf\xb0\x6f\xd9\xa7\xf8\x5a\xa1\x5b\xb5\xad\x54\x8f\xc2\xa8\x8e\x85\xca\x2e\xcf\xa8\x15\x81\xf7\xcf\xea\xea\xff\x06\xae\x98\x7f\x94\x0e\x99\xab\x01\x2d\x8f\x11\x3b\xe9\x16\xb6\x8c\x6d\xf4\x78\x91\xb7\x6c\x9d\x55\xca\xf0\x84\xea\x25\x25\xe7\xb8\xe1\x70\x9c\x5c\xa6\x72\x91\xe4\x0c\x93\xec\x78\x89\xa4\xfe\xb9\xa8\xde\x22\x3d\x72\x1b\x1c\x37\xfb\x2a\x4e\x6e\x3d\xb1\x8e\x4d\x90\xb0\x30\x0a\xa5\xdb\xf8\x4e\xb0\x63\x7e\xdb\xb2\xe8\x5a\xc5\x28\x84\x7e\xdf\x24\xfa\x78\x9e\xe6\x07\x58\x66\xf3\x86\xaa\x84\x4e\x6f\xf6\x86\xae\x3f\x6b\x24\x35\x7d\xe7\xdd\x83\x30\x41\x63\x0c\x0a\x7f\x6b\x98\x44\x13\xed\xcb\x6c\x1b\xbd\xab\x2d\xb4\x40\x3f\x05\xcf\xfe\x38\xbd\x86\x77\x0a\x81\xb7\xd8\x59\x55\xe1\xea\x29\xc4\xa8\x52\xdb\x29\x91\x2c\xca\xa8\x65\x51\x4a\x33\xe1\x16\x4f\x35\x62\x32\x67\x1b\x46\x96\x1d\x47\xf4\x95\x28\xb0\xde\x05\xab\xc4\xdb\xbc\x80\x80\xac\x6d\x87\x7c\x11\x10\xc3\x0b\xc3\xf8\x8e\x27\xbe\x0a\x42\xd0\xf6\xad\xc0\x19\x98\xaa\x1f\xc3\x20\xfa\xfa\x11\x5c\x35\x8c\x06\x8e\xf1\x41\x6c\xea\x77\x5e\xb2\x09\x22\x8b\x98\x5f\x84\x78\x93\x6f\xb3\x72\x2f\xa4\x41\xb4\x09\xd9\x73\xe3\xfb\x07\x96\xf0\xf5\x85\xee\x94\xf9\xee\xe2\xe4\x2b\x27\x18\x2c\x08\x11\xa3\x52\x5e\xb0\xd0\xbb\x2f\x93\xd6\x21\xdf\xa7\xd1\xf5\xce\x8b\xe0\x02\x26\x9f\xf4\xce\xf4\x56\xab\x77\xf1\x8a\x3d\x0f\xbd\x54\x1c\xa3\xf2\x93\x29\x95\x28\xeb\xda\x47\xab\xf8\x05\xdb\x65\x5b\x8b\x53\x1b\xa7\xae\x24\x7e\x68\x55\xd4\x78\x5d\x82\x66\x62\x6d\xe4\x87\x97\x42\x49\x4d\xf4\xb4\x3f\x12\xd5\x1f\x02\x76\xb7\x8b\x93\x4c\xcd\x53\xcf\x79\x2a\x9a\x71\xeb\x7d\x7b\xad\x62\x7b\xbe\x05\xd4\xcd\x22\x3d\x36\x34\x06\xd4\x20\xf6\x6e\x00\xc1\xa7\xb6\x86\x12\x40\x29\xc4\x28\xf3\x6e\x00\x4b\x6d\xdc\xbd\xe5\x44\x54\x2a\x2a\x43\x1e\x75\x33\xef\x86\xa3\xe9\xdf\x68\x96\xe7\x96\x55\xe8\x2b\x5f\x86\x28\xd2\xbb\x4a\xbb\xab\xb3\x08\x78\xc1\x7d\x6c\xc6\x53\x96\xbd\x50\xd9\x4d\xea\x63\xb7\x4d\xbc\x54\xef\xd5\x02\xbd\x0e\x9b\x43\x8e\x56\x49\x2b\xd0\x21\xd8\x82\xa3\xcb\x94\x3e\x14\x33\x56\x52\x6c\xf4\xc1\x8f\xa3\x34\x4b\xf6\x7e\x16\x27\x2e\x13\x11\x5b\xcd\xd0\xcf\x1f\x45\x60\x1d\xcd\x80\x92\xba\x7e\xe6\x5c\xe8\x30\xf9\x29\xcb\x04\xed\xe3\x1a\x43\x2b\x43\x14\x6e\xcb\x38\xbe\x24\xa0\xc9\x82\x2d\x67\xfc\x1f\x04\x81\x11\x74\x55\x9b\xb2\x3c\x47\x90\x18\x91\xac\x1e\x4e\x88\x09\x8e\xa9\x90\x28\x2d\xd8\x52\x68\x3a\x92\x88\x04\x10\x3d\x0f\x5e\x2c\xd1\x80\x00\x29\x42\xa4\x0e\x36\x8c\x64\xd3\xd0\xb7\xaa\xe0\x56\x76\x6d\xc1\x96\x90\xfb\x45\xec\x1f\x87\xc0\x96\x66\xa9\xb1\x5f\x10\x6f\xb5\xfa\x2b\xa0\x47\x6e\x6d\xd7\x6d\x55\x08\xdd\xae\x8c\xa0\xbb\xc8\xe6\x16\xa7\x6d\x2c\xd7\xda\x47\xa0\x4b\x6f\x2d\xd1\xcf\x9e\xf0\x96\x21\x14\x48\x8e\x6a\x32\x6d\xf9\x8e\x6b\x24\x11\x75\x66\xd1\x45\x56\x86\x43\x8a\xc0\xcb\x3d\xa7\x8c\xf9\x14\xf2\x87\x6e\xe4\xdd\x32\x4a\x59\x29\x40\x4a\x77\x20\x1f\x89\x48\x4f\x88\x07\xbc\xd5\xea\xbd\x08\xec\xeb\x06\x41\x49\xd0\x19\x78\x5d\xd6\xcd\xe2\xaf\x2c\x9a\x67\xae\xf6\xcc\x8f\x2a\xcb\x28\x3c\x4a\xc8\xe8\x91\xd7\xbc\x8b\xf8\x08\xb1\x97\x6d\xa4\xad\x5b\xef\x1e\xd0\xfa\x1b\x06\x7c\x65\xb6\xde\x87\x5d\x0b\xcf\x50\x1d\xa7\x54\x23\x4f\xa8\xc3\x71\x4a\x94\x61\x70\x56\xaf\x94\xec\x23\xc4\x16\xc9\x12\x5f\xd0\x60\x86\x93\x4e\x67\xc6\xd4\xc0\x12\xe2\x40\x3c\x2f\x64\x4c\x98\x8a\x5c\x4c\x1e\xf8\x06\x73\x13\x08\x5f\xcc\x51\x08\x37\x23\xf1\xce\xfb\xcf\x9e\xb9\x91\x6d\x47\x5d\xf1\x4c\x76\x49\x10\x27\x41\x76\x2f\x12\xd5\x5b\x9e\x3b\x45\x33\xf0\x52\x39\x0a\x33\x74\x72\x57\x86\x48\xee\x74\x38\x35\x0e\xc7\xa7\xc0\x72\xa1\x9b\x26\xfc\xd4\x62\xeb\xbe\x37\xac\xb6\x5a\x20\xbe\xd0\x6a\x48\xb0\x14\xb0\xfe\x47\x01\xb0\xc1\x55\xd7\xa3\x1b\xa2\xb1\xfb\xa0\x6c\xa7\xc7\x50\x60\x22\x78\x15\xfc\xf6\xaa\x8e\x40\x2c\x9c\x6a\xb6\xad\x9a\xcd\x6c\x5b\xc5\x3e\x32\xd3\x90\x50\x20\xe7\x57\xbd\xb9\x9b\xcc\x90\x14\x73\x19\xf6\xc0\x15\x51\x9b\xdc\x6c\x0e\xd1\x98\x8c\x88\x4b\x98\x64\x52\xfe\xbe\x8a\x7d\xc2\x61\xc3\x5b\x11\x13\x9b\x48\x06\x90\xea\xad\xc6\xa1\xbe\x33\xe9\xd5\x48\x07\x24\xa2\x67\x3d\x19\x28\x21\x6b\x88\x8c\x90\xc9\x98\x17\x81\x0a\x11\x83\x8d\x20\x0c\x97\x91\x6d\x23\xd5\x1d\x33\x98\x03\x13\x80\xdc\x0c\x7e\x41\x12\x5a\x6d\x7f\x97\x04\xb7\x70\xa1\xd8\xf6\x27\x39\xf5\x86\x1b\x18\x8f\x06\xca\xf6\x32\x84\x30\xb4\x60\x84\xa9\x15\xa6\x22\xe2\x49\x63\xc1\xa8\x94\xb9\x6a\xcb\x67\x61\x26\xa9\x2c\x2e\x51\xd8\xf5\xb7\x73\xc7\xed\x61\xdc\x29\xed\xfa\x52\x1a\xcf\xd2\x8b\x68\xd6\xe9\xa4\x58\x0d\x81\xc3\x50\xe9\x6a\xac\x61\xaa\x66\x0e\xa5\x1e\x58\xb9\x94\x81\x84\x7c\x7d\x5c\xfd\x45\xb2\x94\x3d\xee\xfa\xdb\x4b\xc7\xb6\xff\x1a\x94\xeb\x96\xa8\xe8\x4d\x1e\x81\x8c\x7c\x3c\x98\xfc\x0a\x31\xa6\x39\x14\xfe\xc4\xe1\xcf\x55\xe6\x36\xde\x95\x57\x99\x5e\x70\x01\xe1\xf9\xf8\xa0\x44\xfa\x78\x81\x24\x83\xc8\x03\x04\xc2\x76\xab\x56\x38\x16\x58\x69\x09\x3f\x30\xba\xaf\xec\x31\xa1\xc8\x4c\x22\x7a\x90\x15\xfd\xc0\x8c\xcf\xd2\x36\x94\x08\xb8\x85\x4a\x86\x15\x7e\xd6\x87\xa0\x6e\x22\x32\x2f\x9f\x2d\x9c\xd1\x68\xd1\x5f\xce\xb4\x0f\x56\xc5\x37\x0b\x69\xd2\x09\x2e\x2f\x41\xa8\x8f\xc2\x79\xb4\xe8\xff\x25\x3c\xeb\x2d\x5d\x07\x5f\x52\x0f\x07\x34\x2c\xb5\xae\x11\x7c\xec\xf4\x96\x17\x1e\xc6\x0f\x50\xe1\x5f\xc0\x09\xa6\x74\x4d\x48\xc3\x4e\xaf\x90\x8e\xe9\xb2\x79\xc9\x89\xb3\x24\x5c\x69\x59\xd8\x3d\xd3\x36\x68\xf1\x85\x33\xcf\x5c\x87\xd2\x58\xa2\xdf\xda\xc4\x28\x3e\xeb\x89\x59\x12\x81\x59\x2a\x81\x21\x0f\x3a\xa4\xbf\xe6\x7e\x6a\x19\xbd\x70\xe6\xfc\x4e\x18\x19\xe8\x67\x14\x49\x17\x2c\x7a\x6d\x91\x0a\x59\x87\xa1\xbc\x1b\x41\x63\xc2\x2f\x77\xf3\x32\xaa\x0a\x44\x9e\x14\xbe\x2d\x9c\xa5\x51\xae\xbe\xfe\x02\x5a\x2e\x44\x94\x9a\xa8\x8e\x58\x94\x0e\x5f\x75\x2c\xff\x45\xb6\x54\x91\xfa\xcb\x90\x34\x42\xfb\xf2\x08\xb8\x7a\x8b\x6c\x89\x83\x05\xff\x59\x82\xff\xdb\x7d\xba\x45\xf2\xbd\x74\x55\x0e\xb9\xd4\x21\x93\x9e\x4c\x17\xd9\xb2\x74\x66\xda\x51\xbe\x4c\x45\xd1\x45\xb8\x5c\xce\x62\x5d\x5f\x8c\x55\xe0\x19\x81\xc8\x09\x0b\xc5\x60\x61\xbe\x2f\xe7\x65\xe3\x66\x32\x76\x79\x02\x07\xff\x95\xfe\x89\x14\x6c\x9c\x7c\x67\x96\x5e\x04\xdd\x2f\x9b\x30\xbe\xf1\x74\xac\xc5\x54\xf5\xcc\xa7\xfa\xdb\x22\x5d\xce\xfc\xee\x2e\x61\x2b\xe4\xc1\x7a\x62\x21\xe7\xfe\x03\x25\xc4\xef\x1e\xbc\x10\xeb\x86\xc4\xab\xa1\x8e\xb9\x61\x02\x53\x80\x20\x72\x0d\xeb\x54\xee\x27\xb5\x95\x36\xf2\xb4\x21\x46\xfd\x0c\x45\x44\x1a\xb1\xcc\x23\xe9\xad\x3e\x02\x6f\xf5\x67\x3d\x97\x71\x48\xa6\x43\x20\x16\x44\x50\x65\xcf\x21\x8a\xf5\xa3\x2d\x55\xd5\x64\x55\xbb\x3f\x47\x12\xc3\xd4\xed\x41\x7c\x1b\x2b\xbe\xf9\x37\x83\x98\x7f\xea\x76\x9d\x57\xc1\x84\x0b\x5d\x03\x90\xe7\x46\x02\x44\x73\xda\x40\xc4\xcc\x2e\x88\xd0\x6b\x69\xe8\x93\x6c\xf6\x07\xd9\x6c\xb5\xd2\x6a\x15\x3a\x30\x77\x73\x15\x7f\x8f\xf4\x8c\xfd\x23\xd2\x40\x52\x57\x80\x45\x28\x79\x50\xb2\xc3\x05\xe1\x70\xeb\x4a\xea\xe6\x36\xd7\x57\x56\xf3\x90\xc5\x3b\x97\x11\x90\xd4\x3b\x85\x51\x27\xaf\x8b\x30\xb3\xcb\x9d\x0a\xad\xc0\xe9\x41\xe9\x4f\xa1\x20\x42\x3b\xe0\x4a\x60\x12\x8d\x3c\x45\xed\x96\xf9\x28\x78\x22\xd3\xa1\x61\xd4\xe2\x89\x5d\x50\xae\x25\x6c\x86\x19\xbb\xa8\x66\x98\xb3\x5a\x09\x97\x5d\x7a\x10\xb8\xd5\xe3\x8d\x39\x1c\x70\x57\xe0\xb9\x3c\x71\x09\xd5\x30\xed\x37\x39\x09\x89\x98\x06\xe7\x78\x1a\x48\x94\xe7\x01\xcc\x45\x07\x05\x73\xdd\x9e\x18\xef\xd9\x7f\x32\x94\x60\x97\x5f\x3a\x92\xa1\xfa\x89\x7d\x3b\x9a\x77\x3d\xe9\x61\x82\xcc\x19\x2c\x4b\xf1\x75\x07\xf5\xe7\x86\x42\xf1\x51\xa1\x0d\x03\xdd\x00\x4e\x8b\x1f\xe7\x17\x31\xe1\x8e\x16\xea\x55\x12\xdf\x92\x2c\x3e\xfe\xf0\x29\x2e\x80\x70\xf8\x0d\x5c\xe3\xba\xa7\x2d\xfe\xcd\x92\x24\xa4\x88\xd1\x9f\x1b\xb7\x35\xc6\xd2\xe1\x3e\xf8\x06\x50\x51\x04\x32\xc9\x2d\x55\x6a\x26\xd4\x52\x6a\x26\x16\xc9\x6a\xfa\xf9\xfe\xed\x59\xb0\x89\xe2\x84\x9d\x81\xb1\x5c\x6a\x11\x2b\x4b\xf6\x10\x18\xe9\x98\x56\xad\x08\x32\x51\x86\x89\x07\xdb\xa5\x1a\x6f\x39\xc3\x22\x80\x12\x84\x31\x08\x29\x1c\x93\x32\xe4\x84\x77\x13\x1f\x98\x8c\x39\x11\x31\x11\xbe\xa2\x1a\xec\xc0\xfb\x86\xbc\xe6\x20\x07\xb5\x0d\x51\x09\x60\xa0\x7a\x62\xa8\xb7\x4b\x64\x4e\xb8\x68\x35\xd2\xf1\xac\xd2\x0d\xa6\x62\x16\x64\x52\xf7\x47\xb4\x76\x99\x82\x87\xb2\x2c\xde\x5d\x56\x3f\xcc\xe5\x98\xce\xaa\xc9\xee\x89\x7a\x2e\x68\x0a\x66\xf2\xea\x33\x26\xb1\xce\x01\xdd\xb9\xf4\xc1\xf3\x86\x7f\x56\x49\xc5\x45\x66\xa8\xf2\x86\x52\xc7\xbd\xc2\x06\x97\x2f\xe0\x69\x9f\x5a\x16\xd1\x3e\xf7\x83\x39\x8a\x69\xc3\x84\x54\x5b\x20\xb5\x0a\xc0\xc0\xca\x45\xc2\xd1\x3f\xaf\x24\xa6\x8e\x6b\xdd\x06\xab\x55\x08\xf1\x35\xa1\x97\x4d\xf3\x5c\xeb\xf8\xb3\x3e\xae\x76\x34\x16\xaa\xf7\x24\x32\xdd\xed\x94\xb7\xc8\x4b\x19\x7b\x5e\xe8\x35\x44\x25\x63\xdc\xb6\x3f\x26\xc2\x0a\xa3\x64\x95\x57\x33\xbd\x65\xeb\xcc\xb6\x5f\x98\xb9\x04\x73\x5c\x42\x5b\x00\x30\x31\xe1\xd0\x26\x24\x30\x4c\xb7\x36\xf9\x44\x46\xb6\x08\x6b\xab\x56\xe0\x82\xd4\x3d\xf2\x70\x0a\x68\x1f\xe2\x4a\x3a\xe8\xed\xf1\x0f\xdb\xda\x87\x5f\x77\xee\x2a\x2c\x53\x40\xe6\xa2\x2a\xd9\x84\x98\x18\x4a\x9f\x6e\xcd\xfe\x20\x3b\x0a\x05\x6d\x78\x0b\x0a\x17\x6c\x29\x82\x80\x6b\xbb\xc8\xb2\xab\x2f\xa5\x88\xb1\x4e\xab\x7d\x52\xb4\x1d\xd8\x5a\x05\xd1\xea\x43\x9c\xbe\x3e\x02\x3f\x8a\x38\xeb\xcd\x32\x88\x98\x12\x70\x1a\x2e\xa3\x67\x59\x89\xe4\x78\x35\x94\x5e\x3a\x95\xcf\x6c\xbb\x8d\x3c\xfa\x31\x2c\xbf\x79\x24\x80\x3a\xb1\x8a\xe3\x31\xeb\x74\xca\x38\x11\x5e\x41\x38\x3d\xff\xba\x4e\x07\x9b\x98\x85\xd0\x20\x67\xdf\x32\x16\xad\x4a\x2b\xc6\x1f\xef\xcb\x02\x89\xe1\x35\xb7\x12\x3b\x36\xcf\x85\xbe\x8a\x28\x9c\xe7\x89\x22\x33\xe7\x1f\x43\xa9\x2d\x98\x08\x6b\x1e\x18\x7a\xa9\x89\x58\x15\x0c\x62\x97\x5d\x38\x73\xe5\xc6\xd4\x15\x4e\x4c\x0b\xf2\x1b\x9f\xc5\x15\x0b\x59\xf6\xf8\x00\x00\x09\xab\xe0\x48\x0d\xfa\x50\xf3\xe8\x11\x7f\xde\x1d\xd1\x8a\x85\xdd\xbf\x79\x62\x05\xcd\xb1\x8b\xd5\xe2\x23\x32\x47\x63\x7a\xc4\xbd\x70\xe6\xe2\x8a\x0a\xf8\x75\x24\x32\x15\xae\x48\x92\x45\xb2\xd8\x0d\x8a\xc2\xd8\x17\x9f\x4f\xef\x0b\xe2\xd1\xe4\xf4\xde\x08\xeb\x7b\x43\x84\x96\xcc\x66\x9d\x4e\xac\x20\xbc\xba\xc5\x42\x69\x46\x55\x46\x5d\xf2\xe6\x1e\x4d\x01\x5e\xb8\xe2\x87\x7a\x04\x85\xf4\x95\xa6\xa1\x03\x12\x95\x9b\xa9\xe2\x40\xbe\x15\x8a\xdd\xf4\xf9\xb1\xc5\x50\xba\xf2\x10\x4f\x92\x2e\x38\x7d\xd2\xae\xdc\x70\xb0\x71\x6c\xbb\x9d\xc8\x5d\x03\xaa\x59\xcd\x6b\x26\xb8\x76\x8f\xed\x4c\x19\x43\x0a\x1b\x0b\x11\xaa\x6d\x14\x0a\x97\x4f\x82\x5a\xf9\x39\x42\x11\x09\x4d\xcb\x32\x09\x07\xc3\xee\x26\xf6\xc2\xe7\x10\xba\x09\x22\x88\xc3\x9c\x98\xa9\x98\x04\x92\xb8\x11\x46\x5b\x32\x8c\xc4\x2b\xbe\x1f\x62\xa0\xea\xe5\x3e\x50\x41\x85\x32\xdb\x0e\x29\x4d\xaa\xd8\xba\x6d\xbf\x49\x50\x44\x7e\xe0\xfd\x48\x65\x17\xe0\x76\x8b\x01\xbd\x25\x29\xdf\xef\xa5\xba\x79\x95\x04\x4b\x1a\xe2\x5f\x72\x52\xcc\x4c\x5f\x84\x4b\xa3\xd3\x34\x58\x84\x4b\xb9\xd9\x7e\x8b\x93\x55\x8d\x65\x20\x18\x4a\x0d\x7c\x01\x19\x5d\x1c\xd8\x00\xa0\x56\x23\xb8\x01\x99\x66\x28\x55\x88\x5a\xc4\x2a\x01\xa9\x66\x2a\x46\x59\x1b\xe2\xda\x06\xfe\xd7\x7b\xdb\x4e\xda\xd4\x08\x1d\x16\xcd\x3b\x9d\xc4\x3d\x3b\x8b\x0c\x50\xa7\x43\x54\x41\x88\x9c\x84\x21\x8f\x04\x78\xde\xc0\xc9\x4c\x18\x62\x24\xc0\x85\x5b\x86\xa7\xf2\x9a\x32\x96\x9f\x19\x2e\x1a\x38\xe9\x6d\x33\x03\xdf\x8a\x0c\x62\x6b\x43\x34\xaa\x10\x95\xdd\x81\xc0\x8a\x58\x75\xd6\x60\xb1\x55\xb2\x25\x18\xd4\xfe\x93\xc2\x88\x4c\x77\x17\x88\xf8\x36\x42\xc5\x07\x3c\xe3\xc8\x97\x04\xf3\x6b\x24\xde\x6c\x42\xe0\xb2\x42\x20\xe6\x4a\x17\xa5\x4d\x9e\x6d\x33\x5a\x67\xb3\x42\xe6\x3c\x47\x75\xd6\x31\xa4\xcb\x63\x56\x4b\xc5\xf3\x4f\x15\x4c\xdb\xb0\x12\x34\xf5\xf2\x75\x7e\x0b\xbb\xaf\xff\x64\x01\x43\xaa\xa1\x12\x3f\xc1\xf8\xa4\x60\xa3\xb1\x5b\x9c\xba\x92\x01\x85\x4f\xca\x2f\x4e\x88\xb2\x28\x7d\x83\x7e\x91\x1c\xc7\x82\x94\xd6\x32\xc7\xf5\xb4\xa5\x1b\xbe\x63\xeb\xb3\xb6\xbe\x2e\x7c\x4f\x78\x82\xc0\x05\x51\xe8\xcf\x31\x78\x7b\x9f\x18\x2c\x3c\xe0\xf8\x09\xe9\xea\x9b\x68\x1d\xbb\xcd\xf6\xb1\x55\x4d\x03\xed\x5f\x55\xa0\x4a\xcc\x40\xa2\x00\x6b\x62\x25\xee\x25\xa9\x4e\x9d\x24\x8d\x51\xdf\x0a\x88\x8e\xcf\x2a\xb5\xdf\x78\x52\x5a\x4b\x84\x06\xb8\x2a\x24\xf0\xc5\x93\x65\x04\x4a\x66\xe2\xfc\xee\x3f\x65\x5e\x62\x20\x9c\xee\xb7\x48\x31\xd5\xe5\xe4\xbc\x89\xb2\x98\x93\x69\xc7\x53\xa4\xb8\x0f\x88\x51\x93\x5a\xab\x33\x2d\xf4\x65\x08\x1e\x56\x24\xcf\x42\x30\xdb\x2b\x4b\x75\x2c\xc3\xc6\xd8\x3d\x26\xb2\xe7\xaa\x35\x7e\xc0\x88\x83\x75\xcd\xae\x72\x21\x22\x02\x48\xea\x5e\x31\x9d\x03\x03\x63\x01\x1c\x98\x64\xb1\xcc\xc8\xd3\x6e\xa1\x35\x9a\xe5\xb9\xa3\xed\x63\xf9\x37\x38\xbe\xf3\xea\xa0\x3f\x54\x42\x83\xab\x25\xfc\x10\xa7\x34\x2b\x14\x26\xe8\xfe\xa2\x36\x8f\x70\x74\xc6\x9b\xd3\xcd\xf0\xdd\x94\xb2\xec\x3a\xf8\xe3\x48\x54\x51\xbb\x54\x8f\xa1\xd8\xf1\x6c\xe4\xf9\xb3\x7f\xfd\xbe\xea\xfc\x20\x61\x9b\xf4\x6b\xc2\x30\x9e\x33\xa1\xbc\xc3\x8a\x99\x06\x2f\xd5\x53\x5e\x55\xa8\x16\xae\x20\xf8\xe0\x14\x25\x90\x3d\x5e\x40\xec\x59\x9a\xa0\x4c\xf9\xca\x6e\x8a\x4d\x6a\xdb\x3f\xc9\x0d\x65\xba\x01\xa9\x53\xf4\x25\x2a\x07\x2a\x9c\x01\x69\x20\xef\x49\x0d\x95\x87\x2e\x6f\x58\x96\xe2\x52\x5c\xe2\xcc\xb2\x0b\x9d\xae\x6e\xcd\x4c\x44\xda\xd6\xe9\x8b\x6c\xd9\x8d\xe2\xd7\x62\xa3\xe1\x87\x03\xbf\xa3\x03\x62\x89\xaf\x3a\x66\x61\xa7\x13\x28\xd9\x99\x58\x6a\xf0\xc2\x24\xb4\xd7\x68\xdb\x29\x21\xa0\x54\x13\xb0\x88\x92\xa7\x69\xaf\xdb\x4d\x02\x5d\xe9\xe9\x87\x93\x0b\x04\x64\x93\xef\x8f\x73\x97\xfc\x36\x25\xe0\x22\x2c\x5a\x3d\x96\xf1\x67\x9d\x51\xf6\xa6\xb2\xb3\x1a\x81\x94\xef\xf9\x5b\xb6\x2a\xd9\x3c\x33\x25\x4d\x7b\x64\xcc\x7f\x28\x80\xa1\x80\x63\x79\xe0\x0d\xd8\x56\x4d\x03\xd2\x72\x1b\x54\x79\x3f\x44\xb9\xfb\xc9\x73\xe5\x61\x15\xb1\xb3\x3a\x5b\x09\x5f\x76\x47\x52\x79\xbc\x69\x6b\x61\xdb\x5e\xa9\x3e\x9f\x5e\x8d\xf4\xce\xdb\xbd\x88\x8f\xc8\xb6\xaa\x78\x6d\x66\xf8\x3f\x36\x9c\xe2\x48\xa5\x57\xa5\x4b\xc5\x27\xab\xf4\x17\x5f\xff\x82\x30\xf9\xa8\x17\xb7\x9c\xaa\x86\x7b\x4d\x69\xc2\xeb\x2b\xc6\x9c\x3e\x66\xce\x5b\x7d\x29\xc4\x9e\xe5\x4b\xb1\x92\xd8\xbe\x25\xc7\xa7\x2e\x5e\x4c\xb2\x02\x13\xa1\x8d\xd1\x80\xfe\x55\x26\x53\xea\x6c\xcc\xca\xd8\x80\xef\x81\x7f\x6c\xa8\xcd\x57\x89\x65\x41\x1c\x67\x84\xe1\x79\xb6\x60\x4b\x97\x01\x0f\xaf\x54\x0c\xfd\xb3\xd7\x3a\x14\xff\x4d\x40\x15\x19\x46\xf3\x7b\x55\x48\x18\x54\x94\x17\xf2\x93\x8b\xaa\x6b\x19\xca\x0a\xb5\xc5\x27\x96\x94\x6a\x7c\x45\x41\xae\x98\x80\xfe\x09\xdb\x04\x69\xc6\x12\x81\x13\x53\x43\x45\x01\x38\x8d\x0d\x82\x9c\x3c\x47\xd1\x22\x5b\x52\xc6\xff\x3d\x48\x69\x85\xbb\xe0\x08\x3b\x4f\x5f\x24\x4b\x1a\x14\x46\xcd\x3f\x41\x86\xc6\xfa\x85\xfd\x41\xb5\x0b\xf0\xc5\x13\x75\x69\x39\x09\x90\x30\x0f\xbb\x84\xad\xdc\x80\x1c\xbc\xd0\xf5\x0a\x5c\x80\x6e\x0e\x00\xe3\xff\x84\xd4\xe2\xf0\xb6\x25\x5c\x08\xb5\x84\x22\x40\xcb\x8f\x77\xf7\xad\x0d\xcb\x84\x9b\xf1\x96\xa1\x86\x63\x09\x9f\xaa\xc8\x6a\x59\x25\x6d\xfa\x5b\xd8\x0a\xa2\xd6\x4b\xaf\xdc\x35\xd8\x7c\xa9\xcf\xc4\x6f\x21\xb6\xed\x3f\xd0\x7f\x42\xf2\x5b\x88\x81\xde\x7d\x6d\xd8\x69\x2c\x7e\x0b\x97\x0d\xf7\x5e\xeb\x78\x81\x58\xd7\xdb\xed\xc2\x7b\x83\x2b\x92\x6c\xc0\xec\x8c\xa3\x2e\xc8\xec\x01\xaf\xb3\xf4\x53\x7a\xc5\xd0\x4b\x0f\x93\xd7\x61\xb7\xd4\xeb\x4e\xe9\x83\x52\x05\x77\x7f\x0d\x49\x4d\x51\xdc\x7d\x11\x16\x3c\xbf\xb0\xd8\x78\x17\xaf\xaa\xbe\xd6\xda\xe2\x13\xd8\x82\x80\x9c\x10\x54\x0b\xc2\xd0\x12\x57\x6e\xfd\x2b\x65\x98\xbc\x30\x3b\x6f\x76\xdc\x68\xe6\xcd\xbb\x97\xb5\x60\x39\xaf\xd8\x82\x2d\x69\x56\xeb\x0b\x12\x8d\x1d\xfb\x8d\x7b\x00\x0d\x99\xa6\x3b\x88\x75\xd3\xaf\xc1\xee\x53\x2c\x7c\x0d\x16\x05\xae\x36\x8b\x40\x2f\xfe\xd9\x2e\xf4\x82\xc8\x22\xa2\x7a\x23\xcb\x4b\x4e\x9b\xa7\xc7\xb1\x7c\x2a\xcb\x58\xeb\xe8\x8b\xd8\x3f\x55\xac\xb2\x52\xba\x18\x47\x9b\x38\x50\xbd\x4a\x98\x47\x8f\xec\x42\x38\xe6\x38\x7f\x81\x32\xec\x3e\x14\x58\xdb\x40\xc3\x2f\x69\x67\x5d\xa5\x36\x07\x3c\x66\xa9\x03\x07\xa6\x65\xea\x03\x2d\xd3\x31\x2f\xb0\x2b\xad\x0e\x78\x99\xca\x2b\xaa\x7c\xa6\x95\xaf\x58\x21\xb3\x5d\xad\x56\xa7\x50\xb8\x37\x88\xd5\x03\x9f\x19\xb9\x68\x04\x77\x9f\xc2\x35\xab\xae\x6e\x4b\x15\x3d\x6c\xdb\x11\xa5\x2a\xd0\x70\xf7\x26\x5e\xdd\x97\xa6\x74\x09\x78\x6f\x10\x83\x8f\x79\x15\xc2\x22\x48\x44\x7c\x0b\x84\x37\x9e\x75\x9c\x70\x4c\x18\x9c\x47\xf1\x67\x62\xa5\xfb\x9b\xdb\x20\xb3\x48\x02\x03\x0f\x99\x77\x60\xd7\x90\xf4\x8e\x65\xdb\x78\x75\x15\xc6\x11\x33\xa2\x83\xf2\x42\xb3\x80\x7a\x5d\x51\x0e\x22\xc2\x08\x1e\x85\x4a\xaa\x78\x0c\x41\x20\xb6\x10\xe9\x81\x7e\x34\x53\xc3\x42\x3a\xee\x48\xf1\x43\x51\x64\xdd\x75\x10\x05\xe9\xf6\x4d\xc5\xc5\x5c\xc4\x01\x68\xea\x1d\x18\x4d\x48\x04\xf2\xf8\xa3\x9d\x60\xea\x40\x47\xdd\x2c\x6e\xca\x51\x49\x0f\xd2\x5f\xbc\x5f\x88\xb0\x73\x2f\x5d\xcf\x57\xa2\xcb\x41\x53\xd5\xdb\x48\xe8\x1c\x0b\x7c\x57\x5e\x06\xd4\xb2\x88\x9e\xd8\xcd\x9f\x9b\x58\xdb\xb6\x54\xff\x0c\x14\x1e\x2a\x90\xf3\x03\x16\xfa\xc6\x3b\x0d\x30\xa7\xc4\x8e\xfa\x10\xc5\x11\xb3\x24\x9f\xeb\x75\x88\x4c\xcd\x87\x52\x05\xac\x1c\x66\xd5\x47\x1c\xa9\x3a\xf5\x2e\x4a\x76\x56\x2b\xae\xaa\x93\xb1\x6e\xbc\x5e\xd3\x0d\x23\xac\xcb\x0f\x2e\xff\xbd\xdb\x32\x16\x82\x5e\xed\x87\xe0\x1b\x0b\x53\xfa\x39\x20\xac\xfb\x22\xf6\xe9\x4b\x8f\x30\xc3\xe9\x36\xfd\xc4\xc0\xa7\xc0\x3e\xca\x24\x7f\xea\xdf\x44\xb8\x9f\x96\xaf\xff\x20\xac\x1b\xa4\xbf\x49\x5e\x12\x8d\x78\xf6\x0f\x5e\x9a\xd2\x1f\x79\x3d\xc1\x26\xf2\x42\x7a\xcf\x13\x79\x75\xf4\x07\xde\x6d\x61\x6e\xf3\x32\x5a\xd1\xb7\x81\xc6\x94\x6e\x3c\xd0\xdf\x08\xe9\x7f\x12\x5e\x43\x9c\xd2\x04\xf2\xde\xee\xf8\x73\xc0\x9f\x39\xe0\x4d\xe9\x47\x5e\xd9\x6d\x70\x0b\x70\x33\xa5\xaf\x18\x5c\xb7\x69\x1c\x1e\x04\x54\xff\x37\x4f\x90\x4a\x15\xf4\x27\x26\xcb\x69\xc0\x95\xd2\x3f\x78\x9a\xe0\x4d\x42\x9e\x1f\xc5\x08\x77\xf7\xa0\x36\x40\x7f\x65\x84\x19\x0a\x87\xf4\x37\xfe\xae\xf5\x4b\xe8\x7f\x44\x6e\x90\x4b\xa4\x34\x0b\x89\xd2\x9a\xa4\x7f\x78\xe2\xf9\x17\xef\x96\xd1\x1f\x3c\x98\x97\x77\xf1\x2a\x58\x07\x2c\xf9\x2b\xbb\xa7\xbf\xf1\xa4\x30\x8e\xbf\xee\x77\xfc\xf5\x3f\xfc\x35\x8a\x93\x5b\x30\xbe\x11\x1a\x9a\xf4\x57\x9e\x28\xc8\xbf\xeb\x2c\x61\xde\x2d\xfd\x07\x6f\xef\x7a\xeb\x25\x02\xcd\x7f\x07\xfe\xc0\xe9\x3b\x9e\xcf\x78\xbf\xf3\xe4\x0c\x0b\xc1\x29\xfd\xcc\xdf\xd9\x97\xaa\x83\x4f\x7a\x0d\x23\xff\x92\x66\xf1\x8e\xdf\xe4\xde\x06\x28\x11\xfa\xb9\x4c\xa6\x5f\x98\x08\xc0\x04\x7a\xde\xf4\x13\x61\xda\xa3\x00\x7d\xc9\x27\xfa\x56\x7c\x78\x5d\x0e\x35\xa5\xaf\x3c\xa1\x29\xfc\x3a\xec\x1e\x58\x02\xb7\x83\x35\xea\x8e\x47\xdd\x9e\x63\x91\xd7\x61\xc1\x51\xc4\xe1\x60\x7a\x3e\x69\x16\xc5\xd3\x08\x4d\x46\xfd\x61\x1f\xcf\xf8\xb2\x80\x17\x23\x9a\x14\x64\x3a\x1d\x8d\xc6\x27\x4b\xf4\x9c\x41\x7f\x50\x2b\x31\x98\xf6\x1f\x69\xe3\x7c\x32\x3c\xaf\x15\x18\xf6\x86\xbd\xf3\x93\x05\x86\xe7\xe3\xa3\x02\x93\xf1\xf0\x74\x9f\x26\x4e\x6f\x34\xa9\x95\xe8\x4d\x47\x93\xc1\xc9\x12\xd3\xf1\x68\xd4\xab\x95\x98\x0c\x27\x93\xde\x51\x89\x08\x0d\xa6\x83\x21\x26\x11\xea\x8f\x7b\x78\xa6\xa7\x61\x30\x1a\x0e\x2b\x15\x74\xaf\x92\xc4\xbb\x87\xab\xb7\x20\xe7\xc3\x5e\xbf\xa1\xaa\xfe\xf9\xb8\xff\x84\x3a\x82\x14\x7e\x0b\x32\x99\x0c\x26\xc7\x13\x1b\xa1\xde\xb8\x3f\x2a\xeb\x99\x4e\xa6\xbd\xea\x60\x90\x05\x15\x58\x98\x6f\x22\xdf\xcb\x0a\x32\x3d\x3f\x6f\xec\xd1\xf4\x7c\x32\xed\x3f\xad\xaa\x75\x9c\xbc\xf4\xfc\x6d\x41\x46\xe7\xc3\xc9\xb4\xa1\xae\xc9\xc4\x19\x4d\x9f\x56\x57\x10\xf9\xe1\x7e\xc5\x52\xbe\x3f\xfb\x4e\xd3\x10\xfb\x93\xe9\x13\x87\x28\xf5\xdf\x0a\x32\x9a\x0c\x8e\xf7\x48\x84\xce\xcf\x7b\xbd\x27\x76\xeb\xd6\xdb\x15\x64\xd2\x9b\x1e\xef\xcd\x08\x0d\xc7\xfd\x91\xf3\xb4\x6a\x12\xb6\xda\xfb\xac\x20\xe7\xe3\xf1\xf4\x78\x0f\x46\x68\xd2\x9f\x4e\x9f\xd8\x23\x50\xd6\x2b\xc8\x70\x34\x9d\x0c\x9b\x96\x6f\x30\x1e\x3c\xb5\xa6\x38\xc9\x0a\x32\x1e\x4c\xa6\x4d\x9b\xbc\xd7\x3f\x1f\xf1\x4d\x0e\x9b\x5d\xd7\x37\x18\x3a\xbd\x61\xfd\xb0\x8f\xa7\xc3\xd1\x93\x6b\x38\x3f\x77\x46\xa3\x5a\x0d\xfd\xf3\x69\xff\x78\x30\xaa\x44\x7f\x30\x18\x8c\xc1\xe8\x10\xc1\xf6\xc7\xc4\xa3\xe2\x58\x68\x44\xd7\xa8\xae\xc9\x48\x42\xec\x79\x2d\x6a\xa4\x94\x7a\x79\x9e\x20\x0f\x94\x89\x33\x0a\x4a\xad\x90\x65\x1e\xb8\x59\x51\x90\xe1\xf9\x68\x74\x1a\x1a\x19\xfd\x19\x0c\xce\x45\x7f\x84\xdd\xee\x77\x3b\xd4\xd4\x83\x79\x80\x18\x76\x59\x77\x1d\x7a\x1b\x4e\x12\x0f\x06\x93\xa7\x35\x0e\xa7\x8e\x37\x1e\xa1\xf3\x51\x8f\xa7\x86\xf5\x79\x21\xb1\xf4\xcc\xfc\xe4\xa9\x52\xe7\xd0\x9c\xac\x90\x77\x35\xd4\x93\x15\xea\x4c\xf3\xc0\x3d\x56\x40\xcf\x73\x5e\x26\xe6\x65\x62\x5d\x26\x2e\xcb\x78\x30\xc5\x93\xd1\xf4\x18\xfa\x34\x0c\x12\xa0\xc1\x9f\x5f\x71\x09\x02\x1e\x5d\x72\x99\x47\xae\x79\xdf\x19\x9f\x1f\x9f\x83\xa6\x69\x9f\xf0\xa7\x3f\xdb\xa1\x5b\x6f\xf7\x68\x67\x6e\xbd\x9d\xec\xc8\xd4\x99\x0e\x8f\x81\x69\xd3\x61\xe8\x4d\xcf\xff\x7c\x47\x04\x28\x7a\xb4\x2f\x22\x8b\x3a\x0b\x53\xe7\x91\x6b\xd3\xe8\x0e\xc0\xb6\x3f\xdf\x1f\x80\x67\x8f\x76\x07\x72\xa8\xde\x38\x3d\xe7\x49\x90\x02\xe0\xe3\x7f\xd1\x9b\x38\x79\x1c\x4e\xf0\x0c\x6a\xc7\x8c\xce\x47\x4d\x37\xe8\xf9\x78\xd4\x1b\xd7\x2f\xf5\xae\x60\x05\x36\x36\x6f\xa8\x5f\x26\xd2\x4b\x2e\x24\xf2\xcd\x30\x1d\x37\xa2\x20\xe7\xc3\x21\x47\x89\x1a\xdb\x20\x01\x6d\x6e\x85\x17\xd5\xed\x08\x46\x42\xa9\xb6\x23\x4c\x29\x66\xf5\x0f\xdd\x74\xeb\xdd\x0a\x0f\xd7\x5b\xef\x16\x02\xa8\x90\xe1\xb4\x3f\x68\x1a\xf8\x68\xe4\xf4\x8f\x06\x5e\xc1\x66\x76\x5e\x92\xb2\x37\x51\xc6\xa1\xdc\x79\x23\x22\x33\x74\x7a\x13\xe3\x52\x1d\x0f\x87\xd3\xda\x65\x01\xb0\xae\xe9\xe6\x9b\x4c\xc6\xc3\xc7\x6f\x3e\x01\x0b\x2b\xd8\xc6\xb8\x37\x9e\x9e\x44\xa8\x48\x84\x7a\x93\x7e\x1f\x8c\x6e\x47\xe3\x49\xff\x1c\x52\xc6\xc3\xfe\x18\x1e\x7a\x93\x3e\xff\x9d\x4e\x47\x1c\x0e\x47\x68\xd8\xeb\x8f\x20\x4b\x7f\x70\x3e\x80\x84\xe1\x60\x00\x5f\xc6\xc3\xc9\x04\xca\x9c\x9f\xf7\x7b\x50\xef\x78\x34\x38\x87\x4f\xbd\xfe\x64\x00\x99\xa7\x93\x29\xbf\x4b\x22\x34\x9a\x72\x0c\x8c\xe7\x71\x38\x2e\x0e\x88\x66\x7f\x0a\x9d\x18\xf4\x07\xc2\xa6\x73\xdc\xeb\xcb\x16\xce\xcd\x41\x37\x4c\xf9\xf5\xfd\xed\x4d\x1c\x16\x64\x34\xee\x9f\x1f\x4f\x5b\x99\x33\x42\x93\xc1\xf9\x64\x84\x0b\x32\x1a\xf6\x46\xc7\x27\xde\xcc\x39\xed\x4d\x1c\xbe\x11\xa6\xce\x64\x74\x7c\xf3\x57\xea\x74\x46\xe7\x53\x9e\x73\x30\xee\x3f\xde\xfa\xb4\x3f\x18\x9e\xf3\x9c\xe3\x61\xc3\x8e\x37\x73\x0e\xc7\xe7\x3d\xde\xcf\xf3\xf3\xf3\xde\x31\xa0\x34\x73\x8e\x47\xe7\xe3\x1e\x2e\x08\x8c\xec\x34\x75\xc1\x09\xa2\x3a\xc9\xc3\x47\x78\x9a\x58\xe0\x04\x51\x9d\x58\xe0\x23\x3d\x59\x02\x08\xa2\x7a\x1b\x7c\xc4\xa7\x7b\xc5\x29\xa2\x3a\xd1\xc3\x47\x7e\xba\x04\x27\x89\x6a\x25\x60\x06\x4e\x93\x6e\x9c\x24\xc2\x33\x7e\x72\x87\x63\xb1\xcb\x27\x03\xd8\x83\xe7\x13\x67\x0a\x0f\xfd\xe9\x68\x04\xfb\x74\xea\xf4\x7b\xb0\x19\xf9\xb5\x03\x5b\x78\x3a\x98\x4c\x60\x33\x0e\x27\x93\xe1\x00\x93\x6a\xc3\xbd\x26\xf2\x42\x35\x3c\xea\xf7\x9d\x73\x79\x8b\x0d\x26\x70\x8b\x7d\xba\xdf\x31\xb0\x23\x3c\x01\xa1\x83\x35\x4a\x0c\xe5\x42\x36\x13\xe6\x87\x1e\xe2\xe8\x53\xc7\x6a\x05\x29\x98\x1c\x7a\x9a\xb5\x6d\x01\xfc\x1c\xf4\xfb\xa7\xc7\xaf\xbb\x21\x00\xc3\xd3\x7a\x71\x6c\x14\xc0\xef\x88\xa6\x9e\x59\xcf\xbd\xe8\xff\x66\xad\x94\x65\x2d\xab\x23\xbb\xe9\xa5\x2d\xaf\xa5\x6f\x23\xe8\xe3\x79\xbf\x37\x1d\x57\xad\x91\x8e\xdb\x06\xaf\xbc\xe3\xe1\x68\x7c\x7a\x52\x27\x93\x3e\xbf\x80\xff\xdc\x68\x9e\x34\xa7\x51\x4b\x8e\x19\xba\x3b\x18\x1f\x9f\x64\x6b\x9f\xb2\x16\x47\x05\xfd\xcc\x2a\x81\xf7\xf9\xd8\x99\x68\x32\x51\x22\xcc\xe3\xbe\x83\x91\x25\xd3\x2c\x73\xbb\x06\xf3\xc5\x52\x65\x6e\x62\xb3\x6b\x05\x12\xcd\xe0\xd7\xfe\x3c\xe7\x3a\x69\xd1\x5b\xca\x78\x43\xbc\xaf\xa3\xde\xb4\x7f\x0c\xca\x1a\x3b\x3b\x19\x4f\xce\x7b\x62\x4b\xf6\x47\x43\xa7\x27\x10\xeb\x89\xd3\x1f\x4f\x38\x62\xcd\xb7\xfb\x70\x3c\xc0\x24\x86\xd3\x3c\xed\x9d\x63\xc2\x41\xcc\x79\xaf\xc7\xa1\xb6\xcf\x87\x3b\xe0\x15\xec\x01\x42\x4d\x46\x3d\x4c\x56\x9a\xdc\x21\x5b\x4d\x3b\x91\x9d\x40\x49\x1e\x45\x44\x3c\x04\xb1\x03\x53\x29\xf3\x5c\xd3\xfa\x90\xc9\x81\xae\x9b\x87\x4d\x36\x54\x3c\xb4\x29\x3d\xcc\x36\xb6\x8d\x0e\x34\x41\x07\xb2\xbe\xec\x1b\xd9\xfb\x7a\x96\xc4\xe5\x71\x4f\x6e\xc9\x0d\x79\x0e\xc1\x9b\x3e\xd3\x2d\xca\x30\xf9\x4a\x1d\x30\xa2\xfa\x2c\x44\xc6\x94\xd2\x9d\x6d\xc7\xe8\x33\x06\xfd\x80\x7b\xea\xf3\x4c\xb7\x34\x9a\x47\xec\x0e\xc4\x7b\xe8\x1e\xbb\x3b\x74\x8f\x67\xf7\x97\x5f\x67\x5f\x3b\x1d\x7c\x4d\x37\xf3\x03\xca\x16\x5f\x97\xe4\x2b\x76\xe1\x77\x8f\x6e\xc9\x57\x72\x8d\x4b\x7b\xb8\x2b\x8a\x9e\xd3\x15\xca\xc8\x67\x8c\x81\x8d\x5a\xa9\xd3\x5d\x2c\x67\x6d\x74\x43\x03\x74\x45\x9e\x63\x0c\xc1\x86\x74\xdd\x21\x7a\x4e\x0e\x64\x71\x23\x25\x15\x5f\x97\x10\x6d\x4a\xbd\xea\xa6\xe4\xf6\x51\x01\xb4\xe8\x57\x72\xcb\x21\xc3\xa8\xd7\x70\xcf\x68\x58\xda\x9f\x0c\x25\x26\xd9\x9b\xea\xdd\x20\x56\x38\x7c\x54\xa0\x96\x91\x88\x84\xd2\xc0\x8b\xa4\xa0\xce\x41\x7c\xea\xa1\x94\x6f\x8d\x00\x85\xc4\x17\x9e\xfd\x6d\x3b\x6a\x53\x69\x03\x3d\xf3\x2f\xf7\x10\xc3\x0d\xc5\x34\x5d\xec\x3b\x9d\x25\x6e\xd3\x58\x87\x65\x2d\x4a\xe3\x41\x9e\x71\x2f\xf4\x2f\x10\xcb\xf3\x7d\x2b\x88\x5a\x29\xb6\xed\x74\xb1\x5f\x52\x4a\x75\x44\x43\xfe\x2d\xcf\x75\x40\x57\x66\xdb\x67\xbd\xa2\x30\xf6\xdc\x83\x42\x81\xdc\x10\xb5\x1d\x61\x41\xfb\xed\xfd\x9a\xbf\xf5\xf8\xc9\x81\xb3\x7b\x1a\xd4\x18\x87\x65\x30\x1e\x0c\xc5\xf4\xf4\x9d\xe9\x64\x20\x0e\x8b\x3c\x37\xb1\x9e\x34\x7e\x56\xfa\x3d\x67\xc0\x27\x23\x40\x8b\x25\xc8\x52\xf9\x94\x1c\x6f\xfe\x1e\xa5\x8c\x44\xb4\xcf\x7f\x02\x3a\xe0\x3f\x7b\x3a\xe4\x3f\x2b\x3a\xe6\x3f\x5b\x3a\xe1\x3f\x3b\x3a\x02\xa9\xcf\x6a\x56\x5f\x83\x35\x39\x90\x0d\xb9\x2f\x0d\x7f\x61\x73\xd3\x10\xad\x31\xb9\xa2\x1e\x7a\x0e\x31\xcf\xd0\x81\x6c\x30\xf9\x4c\x63\x74\x05\xbb\x9d\x7c\xa1\xf7\x79\x9e\x92\x3b\x9a\xcd\xbf\xa0\x35\xf9\x8c\xdd\x28\xcf\xb7\xf0\xac\xa3\x98\xcd\x3e\xcb\xcd\xcd\x57\x60\x97\xe7\x5f\xf9\x0a\x5c\x61\xdb\x46\x37\xf4\x1a\xdd\xd2\x2b\xd8\xed\xe4\x39\x26\x0c\x83\xa5\x3e\xbe\x5b\x7c\x5d\xd2\x1b\x6d\x55\x72\x83\xd3\xbb\x20\xf3\xb7\x7c\xbc\xbe\x97\xb2\xd6\xc0\xd5\xe1\x77\xe1\x7d\xe4\xaa\x0d\x2b\xde\xc7\xea\xfd\xab\x78\xef\xbb\x3e\xba\x23\xb7\xca\xef\x65\xb5\xb2\xa1\xab\xdd\x51\xc3\xfb\x44\x65\x56\x21\xdc\xe6\x67\x3d\x37\xc8\xf3\xfd\x7c\xef\xde\x55\x37\x84\x82\xbc\x7b\xe4\x60\x72\xeb\xed\xdc\x3d\xea\x61\x22\x9d\x9b\xee\x51\x1f\x93\x34\xbe\x65\xee\x1e\xf1\xab\xfe\xc0\x92\x7b\x77\x8f\x86\x42\x3b\xd6\xdd\xa3\x91\x78\x02\x19\xa0\xbb\x47\x63\x55\xf2\x23\xe3\x17\x87\xbb\x47\x13\xb8\x8e\x47\xd3\xde\x69\x62\x72\x34\x9a\x8c\xe4\xa1\x9b\xf6\xce\x87\x8e\x3a\x74\x1c\xd9\x22\x21\x0d\xa4\x67\x33\x96\x56\xae\x8d\x86\xc3\xe8\x5d\xd2\x51\x2f\xcf\xdb\x49\x5d\x67\x27\xa3\x8b\xa5\xdc\x2d\xc2\x33\xa6\x92\xc4\xd3\x87\x02\x2f\x4c\x51\x79\x69\x36\x15\xc7\x6e\xaf\x28\x48\xaf\x4d\x69\xb6\x60\x4b\xf4\x63\x1c\x87\xcc\x8b\xf8\xbd\x16\x17\x18\x18\x36\xe3\xfe\x31\xae\xd8\x78\xc9\x88\x11\x9e\x24\x02\x95\x33\x3e\x70\x98\x21\xd6\xb1\x1d\xd9\x76\x65\x18\x91\x69\x51\x91\xe7\xc7\x12\xbc\x5e\x41\x7a\x10\x70\x98\x9c\x9f\x4f\x9d\xd3\x08\x26\x60\x68\x12\x07\x13\xa7\xb5\x76\x86\xc5\xc1\x8d\x4b\x2c\x82\x34\x4e\x76\x05\xf2\xa5\xc4\xc7\x0f\x89\x8a\xa4\xca\x01\x5e\xc6\xef\x41\x0f\xed\xf9\x1d\x18\xf2\x9f\x1d\x65\xf3\xed\x59\xcf\x75\xc8\x9a\x32\xbe\x1d\xc1\xf8\x2f\xbd\xe8\x63\x65\x1e\x1d\xac\xd1\x8e\x1f\xab\x15\x7e\xf0\xe9\x6a\xb1\x5b\x92\x5d\x87\xae\xa5\x1e\x19\xff\xd8\xa1\x6b\xc2\xe6\xbb\x0b\xc7\xdd\x5e\xd0\x9d\x74\x44\x11\x23\xeb\x23\x30\x2e\x5a\x1c\x27\xbb\xdd\x65\xf7\x2d\x8f\x5f\xb4\xad\xbb\x20\xdb\xb6\xa2\xb8\x15\x44\x41\x16\x78\x61\x4b\x78\x83\x94\x81\x3b\xd9\x7c\x77\x49\x1d\x77\x7b\xb9\x9b\xf1\x6a\xb1\x68\xd8\xb6\x11\xbf\xd1\x7d\x22\x5a\x27\xfb\x52\xdf\xc1\xaf\x9e\x1a\x61\x05\xc0\x81\xa6\x34\xda\x49\x39\x38\xe5\x93\xff\x18\x3b\x49\xde\x29\x81\x9e\x65\xaf\xc4\x1a\x24\x13\xcf\xb0\xf5\x3f\xb1\x5f\x4c\x0f\x1a\x29\x05\xcf\x90\x3e\xbf\x6f\x08\x5c\x35\x09\x12\x00\x8b\xdf\x0a\xf3\xd4\x8d\x78\xea\x8a\x86\x28\x46\xfb\x33\x1f\xe2\x25\x6f\xa9\x33\xf3\x2f\xf6\x33\xbf\xd3\x21\xdb\x4e\x07\x7b\x68\x45\xb6\x84\x2d\xfc\xe5\x51\xc4\x47\xba\x25\x2b\xbe\xd3\x27\xa3\x06\x5e\x71\xc9\x7d\xe1\x37\x41\x85\xe2\x5e\xc8\x50\x94\x9c\x5a\x1b\x9e\x8f\x4f\xd3\x2e\x7c\xb6\xf8\x7c\xc0\x90\xd7\x61\x1c\x27\xa4\xae\xa7\xa0\x86\x0a\xc6\x87\x54\x79\x09\x21\x1e\xed\xcd\xbc\x8b\x60\x26\x32\x24\xd4\x23\x11\x65\x0b\x6f\x39\x4b\x6c\x3b\x43\x6c\x91\x9c\xf5\x96\x24\xc2\x97\xce\x0c\xb3\x45\xb2\xa4\x6c\x71\x76\x96\x2c\x67\x49\x9b\x52\xaf\xd3\xb1\x6d\xf0\x31\x42\x23\x0d\x21\x59\x51\xb9\xe0\x95\x59\x49\xe9\x9e\x32\x2b\x5b\x56\x86\xff\x24\xa4\x0e\x98\x90\x84\x17\x41\x9e\xc7\x17\x1e\x6f\x2b\xec\xc4\x4b\x1a\x5e\x04\xb6\x1d\x5f\x78\xf3\x04\x65\x8b\x70\x49\xa2\x45\xbc\xc4\x17\xd4\x99\x67\x8b\xb0\xd3\x59\xba\xd1\x22\xe6\x3f\xe1\x45\x50\x4d\xd1\x3c\xa8\xa2\x61\xf1\x5b\xac\x74\xdd\x12\x97\xfd\xe1\x7b\x20\x7e\xd6\x2f\x65\xcf\x17\xe7\x73\x0f\x72\xba\xa0\x64\x86\xf8\xde\x70\xf8\x3e\x88\xb0\x7c\x13\xcf\x11\x06\x9e\xb7\xd3\xc0\xc5\xd7\xeb\x33\x9d\x0c\x46\x92\xcf\x27\x30\x5e\xaf\xa4\x38\x42\x0d\xb0\x0d\x08\x4d\xe2\xef\xe3\xb9\x33\x8d\xd9\x43\xa4\xde\x00\x49\x66\xbd\x82\xca\xe0\x95\x5e\x31\x93\x0d\x35\x3a\x8c\xf3\xdc\x43\x19\xb6\x6d\xa1\x2f\x42\x51\x46\xf9\xf4\x62\x51\x40\x62\xb6\x44\x1f\x80\x6c\x1e\x0b\x8e\x5d\xcf\x39\x7d\xfb\xc0\x04\x9c\x86\xcd\xa5\x65\x82\xa0\x99\x90\xa8\xd8\x71\x05\x9f\x8e\x13\x07\xa7\x41\x2d\xa7\xdb\x24\x5f\xd2\x99\x4c\xcf\x4f\xb5\x42\x22\xe2\xe1\x87\x2c\xb9\xd7\x17\xd9\x3c\x43\x1c\x9a\x2e\x1c\xbe\x75\x7a\x4b\xec\x66\x28\x52\xa1\x5a\x42\xfc\x10\x20\x46\x2c\x00\x7f\x16\x09\xc1\x8d\xf0\xa8\xdf\xc0\xbb\xd1\x7c\x0b\xb9\x48\x41\xc6\x84\x9f\x58\x2c\x8c\xaf\x95\x16\x8a\x47\x1d\x12\xd2\x07\x8e\x85\x37\x18\x10\x73\xdc\xdb\x6d\xb7\xbd\x4e\xa7\x28\x88\x48\x33\x73\x05\xb4\xed\x14\xc5\x2c\xe4\xc7\xa9\x59\xff\xaf\x20\xa5\x44\x14\x85\xc7\x3e\x42\xfb\x85\x1a\x5a\x8c\x1f\x8a\x53\x0b\xc1\x69\x92\xcc\xb6\xdb\x41\x35\x60\x47\x54\x1d\xc8\x43\x31\xf3\x1a\x7b\xf2\xe8\xe8\x22\x18\x43\x51\x10\x86\x3c\x63\x9a\xb5\x59\x0a\xf0\xc3\xcf\x9d\xd3\x82\x67\x89\x0d\x07\x34\x41\x0f\x45\x37\x8b\x05\x29\xce\x4f\x4b\x82\x2c\x4b\x02\xc3\xef\x20\x2f\x40\x7d\x93\x73\x72\x06\x88\xf8\x60\x34\xe8\x3f\x22\x0e\x18\x01\x4d\x19\x94\xcc\x0c\xb8\x49\x78\x1f\xab\xe7\x52\x75\xe5\x93\xb7\x81\xb3\x29\x59\xc5\x29\xb5\xae\x14\x51\x68\x51\xea\xa1\xe3\x95\xd3\x44\x63\x81\x70\x05\xba\xcf\xbd\x63\x85\x58\x0e\x2c\xcd\x08\xe6\x70\xfc\xd8\xdc\xfa\x35\x12\x6c\xe5\x95\x25\xad\x0a\x78\xe2\x2f\xfb\x30\xb4\x8e\x24\x48\xa8\xae\xd1\x66\x9c\x07\xb6\xc8\x96\x72\x59\x22\xfc\x50\x14\x28\xa3\x31\x9f\xac\x10\xe3\x79\xe4\xa6\x1c\xdc\x61\xd7\x7a\xaf\x18\x34\xfc\x3a\x40\x19\x87\x0a\x01\x47\xf7\xbc\x30\x64\x0c\xcf\x8d\x11\xbb\x49\x51\x90\xc9\x74\x3c\x3e\x8d\x26\xa9\x09\xbc\xe5\xad\x9e\x44\x3c\x05\x72\xf9\xac\xfb\x0c\xb6\xa0\xf5\xac\xfb\xcc\xe2\xb8\x62\x86\xcb\xde\x1a\xc3\xc8\xf8\xce\x6c\xf7\xc8\x71\xbe\x80\x8f\x4a\x07\x8a\xe2\x37\x6e\xef\x31\x36\x5a\x1d\x9d\xac\x62\xbc\xc6\x7d\x51\xee\x61\x66\x46\xe4\x33\x10\x60\x40\x28\xa5\xbe\xf2\x86\x65\x1f\x54\xa6\xf7\x6b\xc4\x89\x71\x86\xdb\x94\x1a\x65\x0b\x5c\x90\xfe\xf9\x64\x70\xfe\x3d\xc6\x95\x01\x3c\x1f\x84\xff\x7c\x46\xe0\xac\x65\xfc\x9c\x8d\x47\xbd\x47\x38\x5a\xc3\xe9\x78\xa8\xe0\xe6\xb9\xd3\x93\x78\xd2\xa8\x37\x18\x57\x39\xfb\x47\x2e\xc2\xe5\x58\x83\xee\x1a\x52\x3c\xd4\x83\x40\x46\x47\x0d\x19\xdb\x8a\x46\x84\x01\xc7\x68\x50\x61\x98\x7e\x77\x4c\x2c\xda\xdf\xb2\x04\xf4\x5a\xdb\xa8\x67\x73\x24\x4c\x3a\xaf\x95\x69\x7d\x9e\x76\x97\x48\xdd\xd7\x36\x1a\xf2\x77\x31\x13\x30\x05\x80\xf6\x3d\x91\xa1\xd6\x9f\x0e\xa6\xdf\x9f\x8f\xa6\xe9\x0c\x81\x13\x31\x03\xdd\x62\x36\x17\x13\x13\x12\x0f\x41\x84\x27\x97\x71\xda\x07\xa0\x5b\x7f\xfa\x08\x87\x19\x56\xeb\x91\xcb\x2b\x28\x67\xde\xb6\x83\x6e\x39\x35\x73\x31\xc3\x6e\x22\x6b\x84\xa9\x1e\x0c\x9d\x47\xd4\x8a\x26\x8e\xe3\xc0\x58\xe5\x9e\xac\x8a\xa5\x4e\x5e\xd3\xfc\x94\x05\x28\x21\x8c\xc8\xdd\x96\xd5\xd6\xc3\x31\xd6\xc2\x29\x8c\xf3\x99\x08\x6d\x59\x75\x44\xf9\xe6\x9c\xf4\x1b\x24\x4d\xcd\xdc\x43\xe0\x62\x07\xdf\xe1\xb8\xaa\xeb\x4b\x98\x4a\xc3\xb6\x93\xc4\x4b\x00\xcc\xe2\x28\xce\x5a\xf2\xdb\x4e\x0e\xb4\x65\x75\xf8\xc2\x75\x2c\x4e\xd5\xf0\x67\x06\x0a\x8c\x70\x32\xfe\x5b\xb8\x20\x87\x38\x69\x37\xcf\x2d\x7a\x28\x48\x8f\x3c\x54\xbc\x7e\x94\x85\x8a\x02\x2f\x7a\x4b\x7e\xfc\x47\xd3\xe1\xe4\xbc\xc1\x26\xe2\x88\x41\xae\x14\x6e\x6d\x5b\xab\xde\x7a\x61\x68\x52\x51\x5e\x18\xba\x19\x79\x73\xfd\xe5\xf5\xa7\x77\x6f\x5f\xbc\xb8\x72\x4b\xd4\xcd\xb6\x35\x3b\x13\xa4\xe3\xe3\xf1\xf9\x23\x2c\x70\xb5\x69\x34\x6e\xea\x51\x88\x4b\x0f\xad\x02\x0f\xc1\x83\xdb\xc0\x93\x72\x56\xa9\x97\xfa\x9d\x2b\x39\x9c\xd7\xf2\x23\x86\xdd\x07\x7e\x78\x7b\xbd\xd1\x74\xd8\x30\x07\x4f\xe0\xbc\xb3\xcb\xa9\xe3\x4c\x7a\xd3\x69\x7f\x34\x9c\x0c\x9d\xe9\xb4\x27\xf7\x42\x86\xac\x77\xde\xb7\xe0\x76\x7f\xdb\x02\xe7\xb5\xe0\x0e\x7d\xc5\xbe\xb5\xd8\x37\x9f\xb1\x15\x5b\x59\xa5\xd5\x3c\xdf\x0a\xc3\x5e\x7f\x74\x02\x62\x3d\x3c\xbf\xbe\xfe\xb8\x0f\xd9\xdb\x20\xcd\x5c\x87\x3c\xbf\xbe\x06\xfd\xfc\x17\xcc\x0f\x3d\x69\xfc\x04\xa9\xa0\xea\xac\x32\xe9\xe0\x41\x32\xe1\xc5\xfb\x77\xd5\x37\x81\x49\x94\xef\xe0\xde\x0b\x5e\x7b\xe4\x85\x97\x79\x9f\x12\x2f\x4a\xd7\x2c\x79\x93\xb1\x5b\x99\xeb\x55\xa0\x3b\xc1\x97\xf8\x2a\x0c\x9f\xc7\xa1\xf2\xd6\x27\xd2\x8e\x12\x5e\xc5\xc9\xad\x32\x28\x11\x29\xc2\x80\xbd\x4c\x7b\xc7\x56\x81\x27\xab\x7d\x17\xdc\x82\x7b\x5f\x40\x31\x5d\x87\xfc\xe2\xdd\xb2\xd5\x2f\xf1\x8a\xbd\xf3\x76\xfc\x35\x5e\x31\xd9\xc5\x0f\x5e\xc0\xc7\xf7\x9f\x3d\x4b\xd5\xa0\x3e\x84\xfb\x4d\x10\xe9\x07\x55\xc7\xf5\xe7\x9f\x84\x5b\x5a\x99\xed\xfa\xf3\x4f\xc2\x8f\x74\xf9\xfe\xc1\xcb\xb6\xd7\x6c\x63\x24\xc4\x41\x94\x95\xaf\x95\xb9\xba\xfe\xfc\x93\x98\x9b\x38\x51\x13\x73\x0d\x7e\xfe\x7f\xdc\xaf\xd7\x65\xad\x7c\x89\xae\xb7\x8c\xa9\x6a\x3e\xb1\x6f\xd9\xa7\xc4\xf3\xbf\x3e\xd7\x8b\xa4\x93\xd4\x7b\xbc\xf7\x65\x2f\x39\x64\x1d\x0f\x7b\xa7\xa5\x97\xe7\x63\x67\x34\xc0\x5d\x40\x68\xd0\xb3\x75\x90\xb0\x75\xfc\xed\xf7\x67\xe8\xf7\x55\x07\x3f\x0b\x2a\x60\xa3\x9d\xd8\x76\x27\xe1\xe7\x9d\x3c\x8a\x86\x8a\x2a\x8d\x92\xcf\xde\x5d\xbf\x79\x99\x7f\x4a\x82\x15\x8b\x32\x69\x4b\x99\x60\x8e\xcf\x3c\xa2\x17\x2a\xd1\xd6\x40\x1f\x64\xa3\x42\x6b\x97\xc4\x3e\x4b\x39\x92\x9a\xa0\xa0\x2b\xdf\x70\x41\xa0\xe9\xd3\x00\x61\x30\x1e\xd5\x94\x00\x22\xef\x10\x6c\x44\x94\x0c\x0e\xca\x93\xab\x0d\xc4\x87\x02\x97\xbe\x04\x98\x8d\xa7\xfc\x54\x49\x89\x10\x80\x98\x50\x8f\x9a\xc4\xd4\x53\xfd\x21\x29\xf5\xba\x2f\x58\x14\x13\x9f\xc6\xb6\x1d\x2b\x2d\xdc\x34\xcf\x53\xdb\x4e\xd5\x2b\xd9\x53\xdf\xb6\xfd\xee\xe1\x7c\xb6\x07\x07\x15\x28\xa1\x7b\x65\x0b\xd4\xb5\x30\xa7\xf7\x2e\x1d\xdb\x4e\x16\xce\xf2\x62\x38\xef\xb9\x1d\xc4\x1f\x61\x25\x30\x26\xed\xc0\xb6\x43\xdb\x46\x6d\x94\xd0\x50\xad\xe3\xcb\xd5\x86\xa9\x45\xe4\xf4\x31\xcf\x7b\x49\x27\x43\x0c\x51\xfe\x74\xb6\xe7\xdb\x24\xbe\x35\x32\x42\xf3\xa2\x62\x43\x80\x1b\xf0\xdb\x79\xf4\x18\x3f\xa0\xb2\x87\xae\x76\xbb\x90\xfd\xc6\x6e\xfe\x1a\x64\xb2\xe6\xdf\xbb\xcf\x4e\x6d\x24\x50\xcc\x38\xcd\x19\xab\x6b\x30\x34\x09\x02\x17\xac\x63\x69\x04\xd5\x5a\x02\x10\x9c\x0e\xa6\x27\x80\xe0\xc2\x32\x4d\xae\x88\x55\x35\xa0\xb2\x88\x15\xa4\x06\xb6\x6b\x11\x4b\xdd\xbd\x6f\xd2\x97\x1a\x83\xb1\x88\x95\xc5\x6f\x63\xdf\x0b\x99\xd4\x22\x21\x9a\xa6\xb2\x88\x88\x30\xf3\x7e\x6d\xf1\xf1\x39\xa3\x06\x1e\x77\x33\xd6\x50\x5e\x57\xfd\xd1\x70\x20\xf9\xdd\xc3\xc1\xc8\x11\x1b\x4c\x92\x74\x31\x7c\x1f\xf5\x47\xb8\xbb\x06\x41\xca\x64\x3a\x3c\xef\x0b\xa1\xa3\x98\x2f\x90\x3a\x4a\xa1\xcc\x4a\x23\x6a\x20\x75\xe4\x78\x62\x1f\x93\x5d\x03\xb9\xa2\xe9\x83\x0c\xe2\xf0\x78\xc2\xa3\xcf\x36\x48\x5b\x41\x94\x66\x5e\xe4\x83\x17\x57\xfc\x20\x65\x0c\x75\x19\xa4\x14\x39\x38\xae\xe1\xb4\x81\x09\xb1\x43\xaf\x92\x86\x22\xac\x44\x17\xd5\x64\x92\xe0\xa2\x9e\x42\x3c\x9d\x06\x11\x7e\x6a\x16\x5d\xa5\x65\x69\xe9\xd9\xda\x20\x4b\x48\xd6\xc4\x30\x33\xb8\xeb\x24\x20\x52\x3a\x24\x24\x9e\x60\xba\x94\x6c\x58\x46\xae\x28\xeb\x0a\x3b\x3f\x72\x4d\x45\x80\x16\xf2\x59\xd5\x4d\xbe\xd2\xab\x79\xe2\x5e\xcf\x93\xc5\xf3\xa5\x8b\xf8\xff\x3c\x7f\x28\xb0\xd1\xf2\x17\x7a\x35\xf7\x5d\x1f\xbe\xac\x90\x4f\x9e\x93\x87\x02\x2f\x9e\x2f\xc9\x1d\xfd\x62\xe8\x9f\xad\xe3\x04\xad\x39\x16\x9e\xe1\x88\xb6\x53\x74\x35\x5f\xbb\xcf\x3b\xe8\x7a\x6e\x75\x2d\xd7\xfa\x3f\x16\xee\xac\x85\x3d\x8c\xcf\x56\xd8\xb6\xbf\xda\xf6\x16\x7d\x25\x6b\x4c\x36\xf4\xcb\x62\xbd\x24\x91\x6d\xa3\x7b\x88\xd5\x13\x65\xcf\xbd\x30\xfc\x89\x65\xd7\x2c\x9b\xa3\x1b\x1a\x43\x3e\x6c\xdb\x52\x02\xea\x7e\x5d\xac\x97\x98\x1c\x68\x64\xdb\xf7\xf3\x7b\x37\xe3\xc5\x51\x3b\xca\x73\x89\x97\x6d\xb4\xab\xde\x03\x87\x03\xb7\x94\x75\x6f\x82\x68\x65\xdb\xd1\x7c\x8f\x0e\x24\xc1\x2e\x03\xfb\x50\x9e\xb0\x43\x07\xec\x7e\xb6\xed\x10\x1d\xf0\xdc\xe3\x2f\x07\x82\x18\x28\x85\xe5\xf9\xc1\xb6\x0f\xf2\x71\x63\xdb\x1b\x78\xc4\xb6\xbd\x42\xb7\xc4\xe2\xcf\x22\xa6\xc1\x0a\x7d\x21\x6b\x72\x8b\xc9\x67\xdb\x46\x5b\xe4\x93\x80\x3e\x37\xcf\x31\x16\xf3\x16\xf0\x79\x23\x2b\xe4\x2f\x82\x25\x5f\x2b\x61\x1e\xea\x85\xb6\x7d\x67\xdb\xed\xbb\xc5\x7a\xc9\x6b\xbe\x83\x4f\x80\x0b\x03\xb6\xfb\x5d\x92\xcd\x24\xc0\xdb\x6d\xa6\x03\x1e\x6b\x4a\x0e\x38\x3f\x84\x9f\xc3\xd3\xdc\x96\xa9\x23\xa4\xc2\xaf\x64\x06\x63\xf9\x3d\x1a\x08\x23\x44\xf0\xd6\xeb\x57\x11\xdc\x23\x94\xf8\x23\x5b\x73\x54\xc6\xb6\xe5\x83\x28\x9a\xe7\x28\x99\x87\xb0\x08\xc8\xc3\x4d\x8e\x02\xa5\x9d\xa3\x67\x1e\x09\x5c\x10\x38\xfa\x8f\xb0\x1f\x01\xa2\x04\xa5\xd0\xc7\x2b\x07\xc3\x09\xc3\x04\x9a\xfc\x2e\xef\x13\xf8\x52\x06\x53\x95\xb9\xde\x3c\x84\x1c\x0d\x5d\xd5\x26\x99\x15\x43\xd2\x82\x40\xb3\xff\x2d\xe5\x22\xec\xee\xcd\x94\x02\x8b\xe9\xd2\x0e\x84\xb4\xfa\x4f\xdb\xd4\x48\xae\x5b\xcd\x5a\xa6\x0a\x0e\x86\x65\x77\x1e\x91\x6c\x9c\x5e\xf7\xfa\x4a\x27\xf3\x40\x74\x28\x68\x9a\x14\xb9\x45\x50\x50\x99\x14\xd2\x9f\x9e\x3f\x8d\x0b\x22\x81\xb9\xd7\xb4\x01\x43\x9a\x68\x83\xf3\x0d\xcb\x8c\xd1\xbe\x60\xa9\x9f\x04\xbb\x2c\x4e\x48\xcc\x29\x20\x62\x45\xde\x2d\xb3\x30\x49\x39\x92\x62\x69\xaf\x51\x16\xa5\xf5\xb9\xe5\x19\x05\x2e\x83\xda\x49\x9e\x27\x1c\x00\xe8\xf2\x5d\x93\xb2\x36\x17\xed\xe1\xe5\xdf\xdf\x5c\x7f\xba\x76\x63\xf2\xe1\xe3\xfb\x0f\x2f\x3f\xba\x29\x79\xfe\xfe\x97\x57\x6f\x7e\xfa\xf5\xe3\xd5\x8f\x6f\x5f\xba\x3e\xe8\x32\x0d\x46\xa7\x71\x54\x03\x15\x3c\x12\x2b\xd5\xf5\xb1\xd4\x5c\xf0\xee\x9b\xea\x4c\x10\x20\xa6\x20\x50\xfe\xbf\x3e\xd2\x7c\x79\xc5\xd4\x8a\x75\x95\x87\x93\x78\x55\x06\x54\xd8\xa4\xb0\xd4\xc0\x4b\x95\xeb\xcf\x6a\x87\x82\xa3\xa9\xdf\x41\x89\x0c\xb4\x58\x70\x7d\x04\x6e\xd0\xa8\x8c\xe2\x21\x86\xe7\x4c\x12\xd1\xa7\x2f\xc4\x3a\x83\x57\xde\xeb\x17\xfd\x79\x08\xa1\x19\x70\x9e\x87\x28\xe0\x0f\x2e\x7f\xe5\xf8\x28\x5b\x2e\xb2\x65\x9e\x07\xf0\x1a\x88\x57\xc1\xca\xe9\x9d\x9e\x63\x60\x61\x4b\x83\x89\xe1\x64\xa2\x98\xd4\x83\x91\xc2\x73\xce\x87\x83\xe9\x50\xe0\x39\xc7\x22\x8a\xd3\x2b\xdf\xf6\xaa\xab\x4d\x62\x9c\xe7\x20\x12\xf9\xdf\xff\x2d\xcb\xe7\x79\xb8\xe0\xdb\x62\x09\x12\x71\xa7\x41\x61\xb5\x64\xa6\x97\x52\xd9\x12\x4e\x4a\xe1\x4d\xa8\xb9\x3c\x71\xa9\xcb\x95\x3e\x81\xe1\x23\x84\x13\x0d\x93\x1c\x23\x86\x5d\x70\x82\x1a\xa0\x48\x8f\xc3\x43\x22\x2a\x31\x96\xca\x78\x29\x0a\x2b\xca\x78\x30\x30\x8e\x90\x82\x70\x80\x4f\xe7\x53\x24\xfc\x62\xb2\xbf\xd3\x47\xb6\xc8\xb4\xe0\x91\x77\x69\x2e\x36\x90\x9b\x20\x90\x10\xc2\xe6\x6b\xe0\x75\x34\x6c\x40\x66\xdb\xac\xfb\xce\xcb\xb6\x14\x24\xba\xb6\x5d\x91\x63\x66\xc7\x3a\x94\x02\xf1\xfa\xb4\x0d\x52\xdb\x2e\x9f\x71\x9e\x37\xe4\x15\x61\x61\x6d\x5b\xfc\x36\xe7\x49\x59\xb8\xb6\x6d\xfe\xbf\xf9\xbb\x68\x43\xb5\x85\x9b\xf4\x28\x40\x62\x85\x70\x9e\x2b\xc8\x80\x2c\xe3\x8b\x85\x11\x27\x3e\x9d\xc7\xd8\xf3\x5a\x18\x64\x68\x58\x80\x5c\xa8\x7a\x19\x99\xcb\x22\xe1\xb7\xc8\x60\xf4\xaa\x72\x5e\x85\x80\x08\xe4\x8e\xc3\xd1\x68\x7a\x8a\xee\x79\x00\xdc\x68\x3c\x3d\x0d\x65\x1b\xa8\x63\xc5\x2b\xb3\x88\x7e\x94\xfc\x16\x0b\x17\x64\xe4\x0c\xa7\x8f\x28\x20\x97\x17\x95\x54\xe5\xf1\xc0\xb2\x72\x7c\xde\xaf\x5e\xe9\xb6\xdd\x0e\xfe\x0c\x43\xd2\x43\xc2\xd9\x1f\xb1\x3c\xeb\x31\xc6\x64\xd7\x83\xbb\xdc\x99\x3e\x6a\xb1\xa2\x17\xc5\xe8\xa4\x96\x98\x49\xb9\x58\x2c\xe5\x75\x9c\x24\xaf\xe8\xa8\x1e\x77\xbb\x1d\x22\xeb\x0f\x0b\x28\x81\x23\xaa\x11\x39\xb8\x68\xf2\xae\xa7\x2c\x11\x28\x68\x7a\x72\x48\x40\x2c\x0b\xbb\x21\x38\xdb\x0b\x0b\xd2\x1f\x8f\xa7\x8f\xd9\x00\x95\x43\x28\x85\x7e\xfd\xe1\x64\x2c\xf1\x39\x7d\x97\x69\x01\xe4\x2c\x40\x5e\x37\x88\xd2\x1d\xf3\x33\xc1\x72\xc2\x79\x5e\x4f\x6a\x64\x7d\x22\x70\xc4\x5a\xce\x40\xad\x4c\x41\xa6\x3d\xa7\xc1\xa6\x51\xb3\x4c\x04\x80\xef\xf5\x9c\x9e\x80\x9c\xf2\x0a\x4b\x4b\x16\xad\x5f\x12\xac\xfb\x12\xc7\x59\x95\x43\xda\x0a\x86\x03\x7f\xdc\x81\x69\xcf\x68\x3a\xc5\x64\x4d\xa5\xa0\xaf\xe5\x85\x09\xf3\x56\xf7\x4a\xc1\x27\xf8\x83\xad\x2c\x72\xa0\x71\xb7\x04\xce\xc1\x1a\x85\x79\xbe\x92\xe1\x07\xa0\x77\x1b\x2a\x5f\xf3\x1c\xc9\x27\x1a\xb1\x3b\xe4\x90\xb8\xfb\x1b\xf3\xbe\xbe\xf3\x76\x18\xcf\x36\x1c\x97\xa2\xf0\x9f\x6c\xf8\xb9\xa4\xf0\x9f\x6c\xba\x29\xa4\xa7\x2c\xab\x78\x16\x93\x2c\x7e\xc8\xc4\x6f\x27\x01\xc4\x0f\x68\x8d\x4b\xca\x75\xed\xf9\xde\x8a\x51\x26\x2a\x81\x32\x24\x2b\x48\xd0\x34\xff\xd0\x32\xe2\xab\xc5\x8f\xb3\xd7\x9c\x45\xb4\x55\x14\x3a\x76\xc8\x3d\xdd\x22\x0b\x86\x64\xe1\xd9\x6e\x71\xbf\xa4\x6d\xa7\xa9\x9b\x7b\xc4\xc8\xfd\x77\x3a\xe9\xf3\x3c\x8f\x75\x51\x54\x32\x67\x8b\xfb\xa5\x7b\xb2\x93\x22\x53\x61\x48\xf5\x1f\x52\x96\xb9\x09\xe1\xa7\x39\x20\x5b\x2f\x75\x3d\xc2\x22\xa0\x7b\x9b\x70\x29\x38\x27\x60\x29\x99\x20\xc6\x29\x44\xf0\x3a\x94\x41\x48\xbf\x47\x71\x2f\x75\xbb\x81\x2e\x73\x2a\x1d\x07\x81\x5e\x1a\xee\xf2\xcb\xa0\x4d\x29\xd3\x13\x60\xbd\x89\xfc\xf8\x76\xe7\x65\xc1\x4d\xc8\x5a\x09\xf3\x59\x70\x60\x09\x69\x59\x1d\xd6\xb1\x5a\x09\xfb\xcf\x3e\x48\x4c\xfe\x7b\x04\xca\x02\xa0\x0e\xfe\x1d\x01\xb2\x40\xdf\x05\x9e\x03\xca\x00\x86\x0e\xc6\x91\xd9\xe6\xe3\xec\x2f\x2d\x0f\x61\x60\x97\x05\x65\x29\x68\xc2\x86\x0b\x6f\xc9\x9f\x40\xff\x6c\x3a\x19\x3c\x06\xaa\x39\xbc\x33\xda\xa9\xd8\x99\x9b\x17\x8f\x06\x59\xc2\x6c\x58\xa0\xd8\xa0\x68\xd2\x7f\x44\xb9\x10\x64\x43\xa0\x07\x51\x13\xf5\x24\xdd\x52\xca\xd3\x04\x18\xd7\x25\x32\x5f\x35\x28\x0d\x9a\xbc\x90\x36\x65\xe7\x63\xef\xf5\x1a\x8c\xcb\x1e\xbf\x01\x34\x3e\xad\xf1\xd5\x58\xdd\x90\x42\x79\x99\x83\x64\x0e\xac\x4c\x02\x89\xec\xe9\x62\x49\x56\x14\x74\x0f\x81\x90\xb7\x48\xc9\x6d\xb4\x38\xe8\x7a\xf6\xaf\xdf\xd3\xbf\xa0\xb9\xeb\x87\x5e\x9a\xea\x79\xc5\xbf\xdf\x3c\x23\x3b\x9a\xa0\x6d\x97\x7d\x63\x3e\x87\x66\x6d\xf1\x88\x7c\x4c\x0e\x8f\x61\xba\x52\xcd\x45\x69\xe8\x21\x9f\xec\x09\x83\x38\x5f\x75\x86\x46\xaf\x28\xc8\xe6\x3b\x55\x49\xde\x1e\x07\xf3\x82\x9f\x67\x5d\xa5\xf7\x91\xaf\x69\x2a\x17\xd2\x7e\x62\x91\xd8\xad\xb5\x74\xc8\xdb\xf0\x51\x77\xc0\xe8\xe9\x3a\xcf\xdb\xed\x1d\xda\x12\x80\x8b\x4d\xdc\x97\xd9\x46\x19\x19\x1a\xf7\x4d\x7b\xc5\x71\xfa\x3a\x0f\x40\xeb\x98\xa0\x03\x90\x68\x38\xcf\xdb\x07\x24\xee\x03\xf1\x6c\x94\x60\xb4\xed\x14\x38\xcf\x59\x81\xe7\x1b\xf7\x50\x10\xe0\x9f\x3e\x45\x0d\x59\x5f\xaf\xcf\xfe\x4f\xfe\x7b\x79\x3e\x7f\xef\x3e\xab\x29\x09\x2a\x14\x3a\x5d\x70\xac\x5e\x63\xd1\x11\xa5\xfb\x3c\x8f\xda\xd4\x17\xea\x6d\x78\x9e\xa0\x0c\xbb\xed\x76\x86\x0b\x12\xd3\xb0\xf4\x3a\xd2\x74\xd0\xb5\xf3\x49\xe5\x76\x9b\x93\xde\x5d\xf0\x79\xfc\x36\xbe\x63\xc9\x73\x2f\x65\x10\x8d\x8f\x86\xdd\x95\x97\x79\xf4\xa1\x20\x3e\x0d\xbb\xbf\x5c\x7d\x7a\xf3\xf9\x25\xb5\x7e\xb1\xc8\x9e\x86\xdd\x0f\xef\xdf\xfe\xe3\xd5\x9b\xb7\x6f\xa9\xf5\xc1\x32\x4e\x62\x58\x10\xa0\x0a\x9e\xc0\x39\x53\xa3\x11\x3e\x06\x39\x29\xc0\x6f\xee\xa7\x58\x77\x49\x38\x00\xcc\xb1\x0a\x1c\x08\xbe\x03\x07\x8e\x23\xaf\x08\xe7\x4e\x94\xf1\x0b\x00\x0b\x98\xe0\x35\xc2\x84\xef\x14\x15\xf0\xa1\x3f\x3c\x31\xee\xb6\x53\x90\xb1\x33\x78\x04\x83\xd4\x76\x56\x1a\x6d\xf4\xfe\x9c\x9e\x50\x4d\xed\x51\xc3\x73\x94\x81\xe6\x2a\x9e\xb7\xdb\x99\x6b\x09\x97\x02\x16\x05\xcd\x5e\xa0\xbf\x86\x93\xde\x23\x26\x19\x00\xa9\xea\x38\xa1\x30\x88\x0e\xa5\xcd\xe2\xb0\xd4\xfc\x32\x37\x42\xd3\xfc\xa7\x60\x36\x6a\x82\xd5\x06\xca\x2f\x41\x96\x30\x2f\x2d\x6f\xc4\x00\xd4\x32\x3d\x53\x5b\x93\xc4\x4a\x69\xc1\x99\x34\x38\xd2\x68\xa2\xbe\x05\xc9\xed\x69\x86\xc1\xf7\x94\x5b\x48\x3c\xe3\xb3\x04\x80\x11\x22\x66\x85\x1c\xb1\x26\x92\x60\xb3\x30\x16\x9c\x22\xa1\x29\x49\x29\xcd\x54\xf0\xc2\xf2\x22\xe7\x78\x73\x48\x18\x2e\xdd\x69\xc5\x1c\x10\x85\x34\x2d\x4e\x14\x0d\xd6\x28\x96\x2f\x61\x39\xfc\x10\x93\xa8\x28\x48\x6f\x38\x1a\x1d\x73\x44\x1a\xa5\x40\x83\xf3\xe1\xa0\x8f\xbb\x6f\x24\x42\xa0\x19\xe2\x02\x65\x18\xf4\x27\x7d\x53\xcf\x47\xe0\xd3\xa3\xf1\xb9\xc4\xa7\x25\x4e\x91\x9e\xd2\xb9\x3c\xad\xad\xe3\x8b\xc9\xdb\xd3\xac\x63\xb5\x54\xeb\xd6\xec\x58\x4f\x8c\x06\x28\x21\x42\x6f\xd2\x43\x9d\xb6\x2f\x62\xee\x85\x88\x91\x3d\x69\xf7\x80\xb7\x1f\x2f\xf6\x4b\x9a\x82\x5a\xcf\x64\xea\x34\x5c\xbe\x8d\x23\x07\x51\xd9\x91\xcd\x1d\x9c\x4e\x31\x4e\x60\x8c\x8a\x71\xca\x5d\xcd\xaf\x62\x98\x5b\x41\x37\x0c\x7a\x60\x8c\xcd\xe9\x86\xd1\x70\x3a\x1c\x49\xa3\x3b\x31\x3d\xdb\x92\xb0\x00\xba\xa1\x3f\xed\x8d\xf8\x4d\xab\x71\xb2\x43\x39\x7f\x1b\xbd\x10\xe4\x9e\xc3\x4c\xe0\x5b\x92\x5b\x1a\x76\x4d\xce\x25\xb9\xa1\x9b\x86\x85\x7a\x4e\x37\xdd\x1f\x7f\xfd\xe9\xa7\x7f\x7c\xb9\xbe\x7a\x75\xf5\xf1\xcd\x97\x37\x9f\x5e\x7e\xbc\xfa\xf4\xfe\xe3\x35\xb9\xa2\xeb\x0a\xae\x77\x4d\x85\xac\x30\xb5\xc8\x67\x6a\xb1\x28\x4b\x02\xfe\xfc\xf5\xcf\x2f\x5f\x48\xd6\x64\x43\xbe\xe0\x87\x14\x45\x24\x23\xd2\x07\xe5\x1d\x79\x4d\xde\x91\xb7\x47\xca\x26\x94\xd2\xb5\x6d\x7f\x52\x5c\xa6\x4f\x80\x0e\x3f\xb7\x6d\x06\xce\x26\x55\xf2\xcb\x05\x5b\xce\xaa\x26\x45\xd6\x57\x76\x9f\x8a\xeb\xbe\x75\x2d\x7e\x3e\xbb\x27\x19\x9c\x11\xbb\x6b\x45\xda\x23\x6f\xf1\x84\x7c\x1c\x30\x7c\xab\x6e\x41\xf2\x4f\xda\xee\x91\x97\x15\xb9\xde\x1b\xfa\x72\x71\xb5\xcc\xf3\x97\x0b\x93\xb9\xb7\xcc\xf3\xb5\x6d\xbf\x5c\xac\x97\xe4\x13\xe5\xc3\x79\x93\xe7\x6f\xd1\x1a\x93\xf7\x54\xe3\xab\x99\x6d\xbf\xec\xca\x89\xce\xf3\x37\x7c\xe0\xef\x6d\x1b\xdd\x51\x1f\xbd\x97\xb6\x34\xa0\xdf\x88\x71\x9b\xd2\xba\xc3\x56\xdb\xbe\x03\xa3\x44\xdb\x46\x6d\xcf\xb6\x7d\x74\xc7\x73\xdd\xd8\x36\xda\xcf\xf7\xe8\x8e\xdc\x60\x37\x46\x77\x8b\xab\x25\xce\xf3\x1d\xba\x23\x57\xe4\x2b\xc6\x64\x85\xee\xc8\x37\xd2\x76\xe0\x68\x78\x1c\xc4\x2f\xbe\x2d\x29\xff\x72\x6f\xdb\x6b\x4a\xaf\x6d\xfb\x8d\x6d\xbf\x01\xee\x7a\x1b\x5e\xa1\xf6\xdb\xf9\x16\xbd\x94\xcc\x75\x72\x8d\x5d\xf4\x4f\x0e\x81\x3e\x35\x6c\x8d\x00\xbd\x51\x0e\x79\x31\x59\xe3\x60\x8d\x5e\x53\xa1\xef\x96\xba\x6f\xd1\x35\x26\x7c\xd1\xdc\xcd\xfc\x93\xfb\x16\x89\x05\xc4\x44\x4e\x81\xfb\x16\x7d\xc6\x05\xf9\x02\xd6\x36\xef\xf8\xea\xbf\xc6\xe8\x79\x9e\xff\x33\xcf\xdb\xe2\xfd\x25\xc6\xb6\xbd\x43\x2f\xc9\x3b\xf2\x7a\xf1\x4e\x05\xb6\x4b\xd0\x83\x10\x94\xba\x19\x81\xe9\x71\xdb\x0e\x11\x62\x4a\x97\x17\x2f\xc8\x6b\x75\x09\xa0\xb6\x97\xe7\x5f\x30\x5f\x98\xab\x65\x9b\xd2\x4f\xa2\xba\x2b\xf2\x89\x3c\xf0\xc1\xb9\xeb\x02\x93\xc3\x22\x5b\xd2\x4f\xe4\x35\xa7\x9f\xf8\xb9\x7b\x02\xc4\xd0\xec\x04\x89\xa1\xd5\xc0\x82\xc1\x4e\x90\x50\x73\x5f\x42\x88\x55\x09\x00\xb6\x25\x00\xd8\x95\xe0\x66\xcd\x49\x66\xe3\xa0\x1e\x68\xbb\x37\x5b\x2c\xbb\x7c\xf6\x6c\x1b\x59\x7c\x17\x58\x41\x84\x3c\x2a\x13\x11\xc6\x73\x14\xd0\x3d\xda\x23\xef\xd4\xe6\x41\x09\x0d\xb0\x7b\x80\x98\x63\xed\x14\x25\xc0\x51\x3f\x92\x67\x3d\x68\xa9\x76\xb2\x58\xcb\x88\x39\x42\xdf\xb6\xc0\xf3\x84\x3e\x14\xee\x0e\xaa\xf2\x51\x82\x31\x89\x11\xcf\x05\xc2\xd2\x84\xac\x8f\xfd\x94\x0a\xb8\x61\xb2\x6c\x1e\x8e\x20\x96\x9b\x90\x66\x78\xe5\x1e\x38\x7a\xc4\x41\xe2\x23\x4c\xc5\xf1\xe0\x11\x61\xe3\xf0\xfc\x7c\x3c\xfd\x9e\x02\x07\x52\xe6\x3b\xc2\x52\x6a\xd4\x6b\x40\x2e\xc0\x14\xc8\x67\x41\x48\x22\xc3\x2c\xc8\xa8\x18\x12\xb3\x64\x1f\xf9\x55\x7a\x55\xf4\xa4\xa3\x68\x04\x94\x5c\x3a\xf3\xc8\xcd\x30\x4a\x80\x6e\x1d\x0f\x1f\xf1\x08\x00\x98\xdf\xf7\x15\x39\x4b\xd3\x79\xad\xbe\xf9\x69\xcb\x5a\xb7\xe0\x9a\xb2\xb5\x8a\x59\x1a\xfd\xdf\xac\xe5\xf9\x3e\xdb\x65\xad\x84\x6d\xf6\x21\x5f\xe8\x6f\xbb\x84\xa5\xa0\x0e\x54\xd5\xe0\x1b\x8c\x06\x8f\xe0\x75\xa5\x8e\x88\x41\xad\x4a\x1a\x36\x14\x8e\x22\x06\xd2\x2e\xfd\x7c\x7a\x3e\x3a\xc7\xdd\x2c\x09\x6e\x85\x71\xfa\x79\xef\x7c\x04\x56\x61\xda\xf3\x0a\xd9\x6b\x9f\x20\x64\x45\xf7\xb6\xbd\xef\xaa\x4d\x0f\xc4\xea\xa2\x73\xb6\x9c\x3b\xdf\x9e\x05\x64\x47\x3d\x83\x3a\x3d\x6f\x53\xea\xa3\xb4\x63\x39\xe7\x16\xce\xf3\x7e\x5f\xbf\x7f\xeb\x8d\x41\x74\x5f\x67\xea\xfa\x92\x1c\x43\x2b\x8c\x8b\xca\x86\x98\x37\x51\x4e\xb1\xa0\x41\xb5\x99\x1d\xbf\xd4\x2e\x2f\x2f\x9d\x3c\x47\x9c\x68\x8c\xf0\xbc\x37\x76\x7b\x0e\xc6\x85\xeb\x17\x04\x0e\xf8\x29\xa6\x63\x15\x83\xec\x8f\xa6\x3d\x69\xa4\x04\x5a\x42\x62\xaa\x24\x13\x31\x85\x69\x1d\x4f\x1d\x01\x37\x04\xaf\x5a\xb0\x21\x05\xc3\x71\x45\x0d\x51\x31\xd9\x52\x4b\x88\x52\x2d\xb2\xa3\x7b\x64\xbd\x79\xf9\xe5\xc3\xc7\xf7\x9f\xde\x5b\x7c\x8a\x2a\x8c\x81\x43\x53\xb4\x81\x0b\xab\xb3\xed\x58\x97\xc0\x4d\xba\x78\x26\x5f\xea\x34\x3a\xeb\x42\x78\x0f\x74\x40\x96\x05\xee\x52\xfd\x30\xe6\x74\xde\x4c\xf9\x28\x12\x7e\x48\x7f\x03\xe9\x87\x72\x2b\xa4\x76\x93\x74\xb6\x5e\x90\x7b\xb3\x3b\x40\x85\x53\x7e\xcd\x5d\xf9\x59\x70\x60\x7f\x97\x2b\x63\x6d\xb3\xdb\x70\x1d\x80\x30\x49\xd3\xe3\xc5\x3d\xb5\xf6\xda\x5c\xa3\x5d\x57\xe2\x9d\x6b\x1d\xde\x55\x7c\xeb\x05\x91\x6d\x27\xf3\x0d\x4a\x2a\xd2\x6e\x00\x6b\x24\xa3\x3e\xb2\x82\x75\x02\xb2\xe2\x92\xb1\xd8\xe4\x79\x95\xa4\xf5\xb0\x7c\x59\x37\x4d\x7c\xe9\xc9\x02\x59\xff\xf6\x0e\x9e\x98\x78\xd7\xc2\x04\x31\x0a\xc6\xbb\x59\x39\x0d\xaa\x53\xb8\x1b\xef\x58\x04\x5e\x69\xf5\x2c\xea\x0e\xbf\x92\x10\xba\x32\xad\x84\x75\x5f\x15\x08\xbb\x7c\x0c\xda\x07\x37\xa3\x3a\x28\x2a\x3b\x3b\x9b\x61\xa9\x94\x7d\xbf\x58\x2d\x17\xe1\x82\x2d\x35\x81\x7f\x8f\x70\x31\x8b\x17\xbb\x65\x95\x69\x21\x6f\x02\xa1\x33\x5c\x17\xe3\x08\x76\xa4\x41\x53\xb7\x21\xe8\xc7\x7a\xb1\x5a\x0a\x2b\xce\x08\x96\x6a\x4d\x20\x05\x16\x34\xe2\x2d\x30\xec\x46\xf4\x1e\x55\x54\x30\x22\xd7\xeb\xae\xf9\x51\x01\x49\xf7\xa3\xd6\xd5\xa6\x31\xc5\x64\x3a\x96\xd6\xd5\xd2\x8e\x20\x2c\xcf\x4c\x5c\xba\x3f\x00\xbe\xd7\xf9\x70\x32\xc4\xb3\xac\xbb\xa6\x20\xb7\x99\x37\x89\x68\x38\x5e\x51\x1d\x24\x3f\xcc\x33\xc3\x64\x93\xc6\x7c\x55\x03\x9a\x0a\x7f\x08\x2a\x48\x13\xd9\x53\x47\x78\x3f\xf0\xc0\x24\x21\xa2\x01\xf8\x3f\x20\xc9\x22\x5a\x56\xd5\x9c\x79\x47\x9f\x24\x7a\x72\x86\xd3\x91\x1c\x9c\x18\x67\x6d\x70\xd2\x8a\xc2\x90\xdd\x12\xbf\x59\xf0\x44\xf6\xf4\x7b\x0a\x15\x2b\x8e\xc4\x97\x4a\x82\x5b\x6a\x99\x4a\x11\x1c\x4c\x58\xca\xde\xc0\x12\x93\x38\xf7\x8e\xcc\x55\x82\x35\x00\x3f\x92\x89\x59\x0a\x51\x84\x49\x13\x6b\xd3\xb6\x0d\x60\x24\x94\xe3\x05\x35\x61\x05\x51\x2b\xb2\x6d\x30\x5e\x8e\x6c\xbb\xcd\xf7\x8b\x9a\x9c\x3d\x12\xf1\xb5\x6c\x3b\x59\xec\x96\x60\xf0\x9a\x2d\x69\x24\xbd\x64\x44\xf4\xa1\x62\x1f\xb1\x85\x2a\xe6\xd1\x62\xbb\x74\x93\xc5\x76\x49\x0c\xfb\x96\x95\xfa\xb6\xe2\xdf\x56\x4b\xc3\x92\xa2\x57\x68\xad\x3d\x5f\xf9\x12\x73\xfd\xa3\xe5\x6a\x1a\x68\x80\x0d\x26\xa1\x2e\x2c\xc0\x51\x82\x1f\x80\xfa\xde\xb0\x0c\x86\x98\xe7\x56\x2a\x1f\xb1\x12\x8f\x5b\x57\xbe\xcf\xd2\x34\x4e\x84\x7c\x3c\xdd\xef\xf8\x19\x34\xb8\xf4\x95\x29\xaa\x8c\x5e\xd8\xa1\x80\x6a\xe5\x53\x76\x96\x41\xa3\xf6\x47\xa3\x91\xe4\x16\x4b\xb2\xbc\x76\x6c\xe4\x26\xf3\x4b\x81\xd6\xbe\xdc\x9b\xab\xef\x6d\x2b\xb9\x53\x56\xee\x91\xc4\x86\x09\x83\xb7\x4c\x1c\xa4\x3d\xae\xb0\x82\xc1\x69\x5c\x69\x1e\x17\xac\x11\xcc\xa7\xd6\x2d\x08\x51\x3b\x40\x5e\x77\x0d\x41\x98\x08\x98\x9f\x70\x74\xae\x3f\x1c\x9f\x16\x36\x1a\x9a\x38\x72\x78\x82\x17\x31\xea\x9d\xe3\xee\x5a\xea\x41\x0b\x66\xc4\x77\x24\xf5\x27\xb4\x93\xc0\x73\xf1\xfc\xf4\x27\x24\xe5\xfc\xee\x62\x59\x22\x11\xdd\x75\x13\x5e\x19\xdb\xb6\x25\x2e\x04\x29\xa7\x98\x9b\x62\x20\xd3\xae\xb6\xb4\xb8\x33\x45\x9d\x31\x2e\x0a\xc4\xb0\x2b\x24\xec\xc2\x81\xd0\xe8\x11\xd1\xce\x18\x3c\xc0\x8a\xb9\x01\xd4\x42\xba\x11\x45\x96\x80\x6e\x42\x97\x58\xe9\x99\xc1\xa2\x9e\x1e\x67\x93\xd0\x85\x63\xca\x24\x00\xde\xd9\xa4\x3f\x38\xaf\x6d\x87\x93\xf5\x09\xfc\x2e\x2d\x08\x10\x3f\xa7\x95\xb8\xc5\xc6\xac\xf1\x0c\x0d\x97\x47\x12\x07\x02\x85\x97\x09\xe4\x4d\x69\x58\xc1\x7a\x14\xe0\x24\x7b\xea\x37\xca\xaf\xe2\xb9\x5f\x33\x27\x6c\x40\xf5\x3d\x19\x70\x5d\x98\xa4\xeb\xf8\xa1\x8b\x74\x29\x4d\x7b\x2b\xbe\x3a\x4c\x15\x15\xdb\xce\x4c\x65\xe5\x68\x6e\xe8\x6f\xb9\x95\x4f\xfe\x7c\x2f\x82\x56\x15\x04\xb8\xa2\x7f\xc6\x8d\xc1\x43\xd1\xad\xe8\x88\xe3\x82\xc0\xd2\x3f\x45\xc4\xa4\x55\xf6\xf4\xf9\x01\x6e\xec\xa8\x37\xe9\x69\x4f\xc5\x55\x8c\x34\xd1\xee\x71\xbe\xa3\xca\x9c\x08\x3f\x51\x3e\x75\x40\x0e\x05\xd7\x6d\xc4\x61\x74\x82\xdb\x01\x8a\x49\x04\xa6\x4e\x09\xfc\xa6\x68\x4f\x22\x71\x23\xcf\x94\xc7\x80\x4b\x7f\x86\xe1\x3b\xcd\x16\x7e\xa7\xb3\xc4\xb6\x8d\xfe\x9f\x10\x32\xe6\xb9\x28\xa0\xaf\xe0\x3d\x9f\x37\x8e\x0a\x3c\xfd\x30\x1c\xab\xb5\x70\xb2\xf9\xf1\x6d\x0e\x70\xb5\xb6\xcd\x8f\x18\x01\x11\x7d\x28\x1a\xd5\x2d\x48\xf2\xdd\xfb\x3a\x00\x2c\x46\x3a\x51\x79\xe8\xb9\xfd\x82\xf4\xc4\xc9\x0c\xe6\x4d\x0c\x6e\xc9\xca\xd2\xee\x58\x32\xdb\xce\x0c\xc3\xc6\xc2\x8d\x0a\x02\x9c\xc7\xa7\xec\x05\x83\x2a\x01\xc7\x74\x0d\x53\x94\x56\xce\x4a\x9e\x23\xeb\xcb\x17\xd8\xd1\x5f\xbe\x58\x41\xf4\x50\xcc\x1b\xd0\xec\x76\x8f\x5f\xe3\x05\x70\xbf\x11\xa3\x09\xfa\xce\x24\xa0\x3a\xa3\x82\x18\x8d\x60\xde\x05\x8c\x51\x44\x16\x4b\x7e\xcf\x44\xe6\x21\x12\x5e\xc8\x8f\xec\xe2\x75\x9f\xc0\x55\x86\x71\x3c\x89\x87\x12\x4c\xb2\xb9\xd0\xf5\x77\xa3\xae\x6e\x87\x26\x24\x2a\x38\xde\xad\x9c\xb5\x91\xe9\x64\xdc\xe0\xa0\xb2\x91\x6f\x6c\x58\xbd\x0b\x59\x6d\x45\x17\xd3\x30\xbc\x3f\xd6\x13\xb2\x16\xe2\x92\x02\x8f\x7c\xc0\x42\xeb\x58\x4b\xab\x28\xc8\xa4\x37\x7e\xc4\x7f\xa3\x21\x9c\x30\x41\xa5\xf2\x7f\xf1\x44\x2d\x40\x12\x43\x9c\x7b\x6d\xf0\xce\x11\xb8\x00\x45\x10\xa3\x5b\x2a\xea\xd8\x76\xdb\x43\x31\x95\x3a\x80\x79\x2e\x3e\x4b\xf3\x92\xa3\xaf\xaa\xaa\xf6\xf7\xab\x52\x50\x35\x96\x7a\x85\xa1\x72\x4f\xe8\xc7\xd1\x81\x25\x99\x74\xf1\xd7\xca\xe2\xd6\x2e\x09\x6e\x03\x4e\x27\x6a\x57\x39\x05\x01\x25\xd4\x47\x78\x42\xc3\xb1\xd3\xc0\x14\x6a\xb6\x62\x86\x53\xd0\x34\x53\x8a\x21\xa6\x23\xa7\x51\xcb\x90\x47\x6c\xbd\xf4\x4d\xb4\x0a\x7c\x96\xda\x36\xca\x3a\xd4\x5a\x59\x9c\x7a\x53\xaa\x7c\x90\xb4\x81\x24\x11\x25\xfe\xb9\x97\x32\x99\x1c\x40\xf2\xed\x3e\xcc\x82\x30\x88\x54\xea\x2d\xa4\xae\xe2\xec\x2a\x54\xe5\x81\x51\xda\xdd\x47\x81\x0f\x81\x87\x20\x6d\x6f\xa6\x5d\xb3\x4c\x35\x7f\xb0\x44\x30\x13\x11\xa3\x15\x92\xee\x2d\x4c\xc0\x72\x78\xf8\x98\x0b\xe7\x72\x2f\x19\x97\x83\x21\xaa\x83\xb9\xe4\xd7\xee\x13\xbd\x8a\x2b\xc6\x00\x78\x10\x9f\xd5\xb5\x44\xb2\x3c\xb7\xe0\x0b\xc7\x80\x63\xa9\x20\x2b\x12\x70\x9e\xf3\x2d\x02\xf1\xc7\x5c\x29\xfe\x2a\xc8\x78\x32\x7d\x44\xce\x28\xd5\x76\xff\x0b\x0e\x99\xdc\x6e\x5e\x18\x2a\x46\x59\x1c\xb5\xac\x0e\xab\x90\x79\x20\xba\x79\x8a\xbb\x0b\x41\xb8\x76\xd7\x42\x47\x57\x48\x79\xc2\x72\x4a\x41\x97\x98\x43\x14\x81\x8e\x37\xba\xc1\x78\x54\x34\xc6\x71\x6d\x25\x20\x8b\xe6\xcc\x35\x84\x11\x33\x7e\x47\xa6\x70\x38\xf7\x24\x25\x0f\x75\x03\x73\x65\xdc\x8f\x89\x6f\xdb\xed\xc4\xb6\x3d\xb4\x37\xad\xc5\x62\xd0\xf9\x06\xe4\xea\x31\x97\x31\x13\xc9\xf6\xeb\x0d\x26\x02\xe0\x24\x8a\x97\xff\x1d\x07\x22\x0b\xb6\xcc\x73\xc4\x7f\xb4\xec\x18\x34\xe9\x9e\xc2\x63\x04\xa3\x7c\xde\x98\xf5\xe5\x8b\x1f\x27\xec\xec\xdf\xe9\x97\x14\x62\x9e\x7c\xf9\x62\x91\x90\x26\x0b\x6f\xc9\x07\xee\x91\x87\x0a\x53\x2f\x04\xef\xa4\x0d\x51\x20\x34\xb2\x29\xd8\xec\x81\x56\xeb\x9b\xa1\xef\x99\x9b\x88\x71\xf0\x9f\xd2\xa5\x65\x36\xcf\xdc\x87\x02\x17\x18\x59\xca\xb6\xd2\xe2\x37\x95\x8c\xcd\x26\xd3\x5c\x6b\xd0\xed\x8f\xbb\x3d\x8b\xdc\xc6\x2b\xe6\x26\x73\x6b\xb7\x4f\x98\xe5\x5a\x02\x58\x58\xc4\x8f\x77\xf7\xc2\x5f\x97\xf5\xfb\x37\x6f\xda\xea\x3b\xbd\xe1\x59\xdf\xe9\xf7\x5b\x2f\x58\x14\xa4\xad\x0f\xfb\x74\xfb\xd5\x4b\xd8\xa1\x85\xfe\x08\xe3\x20\x89\xfd\xaf\xdd\x64\x8f\x2d\x12\x06\x3e\x8b\x52\xe6\x5a\xdb\x2c\xdb\xa5\xee\xb3\x67\x9b\x20\xdb\xee\x6f\xba\x7e\x7c\xfb\x4c\xe5\x7c\x26\x27\xee\xd9\x4d\x18\xdf\x3c\x3b\x88\xae\x3c\x7b\xfb\xe6\xf9\xcb\x5f\xae\x5f\x5a\x24\x05\xc5\xc9\x27\xd5\x60\x15\x1c\xd5\xec\x8d\x46\x4f\xd2\x66\x1a\x0c\xa6\x1a\xd5\x14\x4c\x61\xe0\x7c\xf0\xe3\x8c\x95\x46\xab\x08\xb8\x2c\xd0\x4c\xf9\xfa\x3c\x5e\xb1\xab\x4c\x38\x0f\xd3\x3e\x6a\x6a\x9e\x19\x8f\xb4\xea\x4a\x76\xeb\x1e\xfc\xbb\x85\x10\xb6\x74\x4b\xe1\xd6\xdf\x51\xe5\x38\x4c\x1d\xed\xed\x85\x93\xe7\xdb\x4b\xba\x9b\xb3\xb9\x65\xc9\x4b\xdf\x45\x09\x4d\xd1\x8a\x6c\x31\xbe\x18\x8d\xfa\xd3\x71\x9e\x27\x97\xa3\xf1\xa0\x37\xcd\xf3\x6d\xa7\x47\x29\xdd\xe5\x39\xda\x8b\x3c\x9d\x1e\xcf\x35\x1e\xf4\x9d\x3c\xdf\x5f\x8e\x26\x83\xe1\x60\xce\xe6\x31\x14\x77\x13\x97\xcd\x7d\x70\x5f\xb6\xed\xf4\xb1\xbb\x3f\x83\x8c\x1d\x94\x9c\x41\xbd\x17\x17\x3d\x07\x77\xc6\xa3\xff\x97\xbc\x7f\xe1\x6e\xdb\xc6\x1a\x85\xe1\xbf\x22\x71\x3a\x1a\xa0\x82\x69\xea\x6e\x51\x46\x34\x6e\xd2\x4c\xd3\x4b\xd2\xa9\xd3\xcc\xd3\x91\xd5\x1c\x9a\x84\x2c\x4e\x28\x52\x25\x21\x3b\xae\xc5\xf3\xdb\xbf\x85\x2b\x41\x8a\x92\xe5\x34\x9d\xe7\x7c\xeb\x6d\xd7\x72\x44\x12\xd7\x0d\x60\x63\xdf\xf7\xa0\x37\x2c\x47\x6f\xf3\xf9\xd4\xdd\x0d\x8f\xdf\x26\x40\xc3\x1e\x44\x00\xb7\xf1\xd9\xc1\x3c\x0c\x05\x55\x27\x00\x5c\x01\xbb\x94\xbd\x4b\xb0\x4b\x03\x1e\x06\x77\x6b\x66\xb5\x23\x46\x74\x20\x5f\x22\x78\x60\xfd\x6a\xb5\xb3\x76\xd6\xb6\xbe\xb4\x18\xe0\xe5\x5b\xf1\xe6\x0b\x0b\xa2\xe0\xf0\x5a\x68\x1f\x03\x6e\x62\xa4\xd1\x69\xa7\xc5\x6e\xb0\x18\x27\x20\x46\x3e\xe2\xc2\xe4\xae\xf1\x6a\x23\x5e\xc5\x65\x88\xf0\x74\x4b\x6e\x00\x3a\x10\x91\x38\x70\x03\xd0\x85\x88\xa6\xe1\xca\x0d\x40\x8f\x07\xba\x3a\x1b\x1c\x30\x2b\x94\xb1\x1a\xc3\x5a\x4f\xae\xe6\x21\x5e\xb5\xaa\x3d\x10\x84\x80\xf8\xa8\x9d\xbb\x9a\xda\x22\x6a\xbb\x6d\x2a\xf5\x02\x81\x06\x81\x2a\x2a\xb0\xcf\xe2\x97\x0c\x5f\x9f\xb6\x5a\xe9\x79\xbf\xc3\xa3\x56\x0c\xc7\x87\x32\x4f\x14\x77\xb3\x30\xa8\x29\x4c\x7b\xc4\xd5\xcc\x55\x88\x87\x68\x97\xb0\xb0\x89\x41\x94\xe7\x20\x37\xe8\xec\x18\x73\xfe\x41\x92\x73\x28\xc1\x1e\xbb\x92\x7e\x54\xf4\x96\x05\x27\xb4\xd5\x6a\xd2\x59\x32\xe7\xe9\xd1\x51\x39\x49\xaf\x66\x96\x62\xa9\xfc\x45\x0f\x5e\x1a\xd2\x7b\xb7\x93\x0b\xcd\xd6\xc8\xd9\x8f\x7f\xf9\xc2\x95\x08\xe5\x56\xab\xa9\xa0\xb4\x48\xcc\xa7\x0f\xe4\xfe\x65\xc2\x33\x26\x1d\x72\x8a\x93\xd8\x26\xd4\x61\x0a\x91\x27\x7f\x86\xf1\x23\x8e\x26\x8c\x2e\xd0\x02\xf0\x73\x67\x1a\x82\xb8\x4d\x91\x03\x5d\x4f\x89\xb2\x39\xab\xbc\x7f\x95\x44\x90\xca\xe2\xf0\x3d\xa6\x6e\x54\xd7\x20\x1f\xf3\x01\xa7\xf6\xc1\x9e\x38\x3a\x8a\xc6\xd2\x4a\xc5\x06\x6d\xf2\xf4\xd6\x32\x06\x5c\x0a\xc4\xa8\xcf\xce\x0e\x48\xd2\x2a\x00\xdb\x03\xa5\xc2\x87\xe6\x19\x03\x0c\xcf\x8e\xbd\x13\x28\x84\x47\x79\xe0\x82\x9a\xfd\x47\x51\x60\xa5\x70\xd7\xde\xab\xa6\x2f\xd1\x0f\xa7\xf3\x87\x87\x58\x59\xe3\x74\xa8\xf0\x2a\x31\xe0\x76\x69\xd2\x72\x56\xb8\x77\x71\xcb\x59\xc6\x4f\x99\xc4\x17\xf2\x0d\x81\x3b\x43\xea\x95\x9d\x7f\x28\x60\x4e\xc8\x8f\xbc\x57\x8a\x55\x2e\x38\xaa\x0c\x73\x3b\x24\x2e\x3e\xca\x78\x61\x33\x74\x0c\xa0\xd8\x92\xd9\x42\x2d\x88\xd8\xc6\x13\x09\xe8\x51\x93\xdd\x53\xac\xc5\xc2\xf1\x2a\x96\x8c\x91\xff\x14\xc6\xa8\x44\x6c\x17\x7d\xca\xb4\xe2\x10\x25\x40\x26\xf2\xe0\xf2\xe0\xfd\x2e\x7e\xc3\xbe\x34\xde\x13\xc0\x3c\xb8\x09\x53\x46\xc0\x4b\xc6\xaf\x64\x77\x37\xa5\x2e\x6d\x5b\x16\x17\xa3\xec\xf7\xc7\x7b\xc8\x27\xe9\x6c\x0f\x45\x3c\xc7\xd6\xef\x96\xa1\xc7\xd2\xdc\xf2\xef\x73\xc6\xae\x4a\xf4\x9b\x42\x9e\xb0\xad\xb7\x5f\xd7\xa4\x3d\xfe\x44\x8d\x03\xce\x9b\x97\xca\xce\x10\x1b\xcc\x82\xde\x27\x3a\x2a\x92\x5a\x0b\x4f\x62\x78\xb1\x00\x6c\x4d\xbc\xc6\x2e\x28\x38\x1b\x33\xea\xd5\x46\x27\x3a\x38\x22\x33\x46\x1b\x20\x66\x70\x28\x21\x3c\x90\xfa\x43\x1e\xf9\x87\x51\xe5\x8f\x93\x07\x8e\xc2\x8a\xa9\x17\x07\xc9\x0a\x08\x07\x9d\x8e\x6d\xb8\xe6\x1c\x3a\x99\x12\x3e\xc0\x6a\x03\x33\x9c\x9e\xe5\x12\xd8\xb6\xe0\x7b\xab\x1d\x81\x76\x3b\x6c\x7b\xa8\x37\x14\xe9\x62\xea\xac\x0e\x0f\x5e\x01\xa5\x7b\x72\xc7\xec\x53\x7e\x55\x26\x02\x39\xe2\x2a\xb5\xe3\x3d\xc0\xca\x9d\xd5\x39\x7d\xf5\xbb\xfb\xbc\xbe\x4a\xfa\x74\x53\x0b\x2f\x23\x7b\xf5\xbb\x65\x05\x54\x39\x38\x1d\x77\x39\x3a\xca\xaa\x42\xc9\x73\x52\xe5\xf6\x53\xf2\xf7\xf2\x60\xab\x75\x1a\x7b\xfc\xd4\x33\x72\x51\x06\xb3\x91\x47\xc1\x83\xdc\x79\xbc\x77\x40\x2e\x6a\xb8\xef\x1a\xec\xfe\xd9\x78\xa4\x0d\x38\x24\x27\x7b\xf8\xd0\x4b\xa3\x8d\xed\x16\xa8\x9f\x98\x71\x60\x21\x4f\x1f\xbe\xdd\xf2\x08\xaf\x0a\x32\x5c\x97\x2a\x63\x40\xb3\x7e\x1e\xf1\x4d\x11\xda\xa6\x1c\xf1\xa7\x63\x40\x26\x99\x53\xaf\x98\x52\x54\xf0\xa9\x89\xde\x69\x02\xf9\x8f\xa5\xb1\x66\x08\xac\xbb\x0f\x19\x27\x70\xab\x16\x28\x0b\x6e\x7c\x92\x4d\x37\x2e\x7f\xbc\x0b\xe9\x32\xd9\xd0\x4b\xee\xdf\xb3\xdd\x46\x07\x3d\x80\x7d\x3e\xfd\x26\x77\x64\x57\xc2\x30\xb9\x79\xfd\x19\x99\xeb\xa0\x64\x72\x27\x5b\x6d\x32\x61\xef\x71\x22\xd8\x72\x02\xa7\x9b\x19\x99\xbb\x59\xab\x15\x4c\x03\x40\xa1\xbb\x64\x77\xb9\x52\x47\xce\x88\x70\x1b\xee\x9c\xed\x0b\xb1\x65\x5d\xd1\xab\xf8\xea\xf6\x6a\x71\x95\x36\xae\x3e\x7a\xce\xd5\xa6\x33\x3c\x73\xae\x36\x5d\xc7\x11\x7f\x3b\xfc\x6f\x97\xff\xed\xf1\xbf\x7d\xfe\x77\xc0\xff\x0e\xf9\xdf\x11\xff\x7b\xc6\xff\x8e\xf9\x5f\x8f\xfd\xed\x2e\xd8\xdf\xc1\xe2\x6a\xd3\x93\xad\x75\x79\x99\xee\xf8\x6a\xb3\x20\x8b\x85\xc5\xee\xeb\x1a\xdd\xe5\x63\xc6\xb6\x86\x21\x91\x0c\xec\x1b\x15\x57\x7a\x52\xe8\x80\x32\x1d\x9f\x9a\x87\x9a\xe9\x0c\xc6\xfd\x9d\x04\x17\x22\xa8\x3f\xb7\xa9\x13\x86\x36\xeb\xe2\xc6\x5f\x14\x2c\xc1\x2d\x5e\x03\x2b\xcc\x9e\x73\xfd\xd8\xe5\x3a\x25\x5e\x20\xbc\x98\xd1\x0d\x5e\xc8\x70\xed\x35\x0c\xc0\xac\x88\x84\x3c\xbb\xe5\x31\x33\x55\x36\x3f\x00\x67\xce\x5c\xd8\xc8\x21\xee\xee\x26\x5e\x5b\x10\xad\x76\x76\x49\x54\x72\x79\x91\xe2\xb2\xd9\xed\x7c\x57\x56\xc6\x4d\xef\x19\x9d\x91\x4f\x0a\x83\x47\x69\x4a\x5a\x98\x3d\x4a\xaa\x5b\x99\x3f\x36\x6f\xb6\xdb\xe6\x7d\xce\x05\x41\xbe\x47\xeb\xa3\xa2\x4a\xe3\xc5\x44\x8a\x36\x97\x38\x00\x11\xe2\x26\x88\x0e\xd7\xca\x50\x7c\xd2\x41\xe9\x8e\x9f\xf8\x84\x9e\xa7\x13\x2a\xf2\x0d\xac\x80\x87\x4f\x3a\x9c\xe4\x8c\xdc\x22\x97\x07\x9d\x8b\x94\x1c\x21\xce\x80\x07\x91\x0f\xd6\xed\x90\x11\x3b\xce\x24\x3e\x0f\x27\x71\xbb\x8d\xd6\xed\x36\xe4\x8a\x21\xaf\xd5\xda\x80\x25\x5a\x23\x8f\x9b\x57\x70\xc3\x4e\x56\xbe\x03\x11\x7f\xdf\x6e\x23\x4f\xdf\xa3\x4b\x15\xfc\x7b\x8d\x96\x39\x43\xa9\x3c\x35\xe8\x93\x37\xdb\x59\x6f\x38\x84\x87\xa0\x29\xa1\x58\x24\x7f\x69\xe2\x30\x47\x3a\x1f\x41\xc8\x7d\x7a\x0f\x64\x31\x32\x37\x76\x67\xdc\xed\xd5\x75\x96\x51\x8f\x1a\x7d\x35\x19\xda\x1f\xf4\x20\x30\x97\xca\x08\x4e\xcc\x91\x27\x7a\x60\xbf\x45\xff\x3c\x93\xe9\x93\xa7\xae\xb5\x7c\x22\xd5\x86\xd0\x9c\x8b\xb3\xc7\x45\x04\xdd\xce\xf8\x28\xd0\xd4\x84\xe5\x6d\xf2\xa2\xc0\x68\x1d\x88\x31\xeb\xbc\x1e\xb5\x64\xfe\x53\x33\xe8\x40\x14\x01\x4b\x35\x69\xb1\x85\x18\xd5\x38\x80\x3f\x06\x07\x19\x80\xc6\xdb\x55\x7c\x46\x3a\x27\x10\x0f\x4d\x32\x9b\xab\x2f\x0c\xf9\x34\x19\x56\xef\x9c\x26\x60\xd6\x99\xa3\x0e\x3a\x71\xe0\xb9\x83\x7c\xcc\x47\xc4\x0b\x59\xc7\x00\x2f\xdb\x6e\x9b\x3e\x07\x8c\xc8\x70\x52\xa3\x7e\x3e\x0a\x1a\xea\x58\x64\xd3\x44\x81\x91\xc2\xed\xd6\x71\xbd\xe2\x31\x17\x61\x71\x6b\x82\xb9\x28\x78\xec\xdb\x99\x6c\x80\xc2\xf9\xd2\x55\x48\x99\xb5\xd5\xe9\x9e\x1d\x09\x6e\x23\x63\x8d\xd8\x57\x02\xbd\x0b\xef\x06\x11\x09\xda\x51\xe8\x5d\xcb\xce\x45\x30\x31\x47\x65\x30\xe2\x01\x7d\xa5\xf9\xa3\x10\xd7\x06\x05\x51\xb7\x94\x26\xf5\x86\x9d\xfe\x1a\x47\xdc\x01\x7a\x81\x23\x5b\x7b\xe3\x82\x92\xde\x3a\x03\x22\x9b\x81\x9a\x6e\x99\xb7\x5b\x0b\xd0\x3d\x70\x75\xfd\x12\x49\xd0\x70\x9e\x97\x2f\x97\xeb\xa0\x0f\x61\x1c\xb8\x94\xc1\x62\xe7\x72\x58\x68\x35\x91\x0e\xe2\x15\x63\x62\xb3\x1a\x28\x55\x49\x40\xdb\x6d\x25\x3c\xa2\xdb\x6d\xfa\x4c\x87\xcb\x9f\x02\x55\x49\x0a\x97\x91\x2f\x49\x6c\xd4\x74\x20\x74\x7d\x29\x6c\xc7\x38\x9e\xa6\xae\x72\xda\x60\x4f\x74\x96\xce\xdd\x59\x8a\xd8\xbf\x73\xd4\xec\xc0\x1c\xa9\xcf\xc2\x48\xf3\x16\x7b\xb6\x8e\x31\xcd\x7f\xa7\xde\xbd\x88\xf3\xa1\x8c\xf1\x43\xa0\xab\xb0\xdf\xca\x0f\x04\xa2\xe6\xa6\xd5\x0a\x94\x59\x57\x66\x35\x31\xbe\xe5\x6e\x02\xdc\xd0\x27\x01\xb7\xca\x3d\x40\x52\x7a\xaa\x9c\x0e\x64\x7b\xc3\x13\x85\xf1\x0c\xc7\x4f\x3f\xa6\x22\x5f\x17\x4f\x55\xfa\xe8\xb1\x6a\xaa\x0b\x1f\x58\x2b\x6f\xcd\x50\xc3\xc3\xca\x5b\x7f\x26\xac\x93\xa3\x7e\xad\x7d\xc5\xa3\x77\xcd\xd9\xd8\x39\x83\x76\x44\x16\x54\x78\x8f\x09\xd4\x12\x15\x74\x88\xb0\x65\x39\x1b\x1d\x83\x39\x9a\x1e\xb0\x44\x2e\x54\x4b\x92\x98\xd1\xb3\xd1\xb8\xd5\x8a\xce\xcf\x7a\x39\x7a\x10\x9f\x8e\xc0\x27\x93\x2a\x20\x28\xa2\x87\xe6\xce\xb3\x41\x3f\x7d\xee\x82\x92\xf3\x8a\x14\x0d\x15\xa2\x4e\x26\x1d\x29\x13\x75\x12\x6d\x54\x88\x3a\x49\xbf\x55\xa8\x3a\x9e\xfe\x43\x7a\x4a\x70\x2d\x01\x77\x93\x08\xcc\xa4\x0f\x37\x32\x79\xc9\x7d\x91\xbc\xe4\x08\x38\x2f\x72\xf4\xc0\x1b\x74\x6b\xcd\x5c\x50\x80\x96\xd8\xd7\xb9\xd0\x32\xb0\x64\x44\x5e\x02\x08\x5a\x40\x74\x8d\x13\x43\xe4\x33\x5d\xb8\x14\x2d\xa0\x38\x6c\x4b\xd8\x6a\x01\xe0\x81\x18\x2f\xab\x59\x25\x62\x8c\xf1\x0d\xd7\xae\x97\xb3\x4a\x44\xdc\xa6\x48\x65\x95\x88\x71\x3c\xbb\x15\x59\x25\x62\x9d\x55\x42\x56\x2d\xb2\xab\x68\x09\xd2\x1a\x2c\xd1\x0a\x5d\x0b\x2b\x1b\x6e\x6f\x6d\xe6\x60\xb9\x71\x63\x08\xee\xc1\xf5\xc9\x8a\x67\x5f\x09\xb0\x33\x59\x9d\x5f\x4f\x56\xed\x36\x0a\xda\x6d\xb8\x62\xf4\xd9\x92\xd1\x67\x7c\xbe\xb3\x55\x61\xfe\x9a\x2a\x42\x2c\x40\xa9\x20\xc4\x7a\xc3\x1a\x61\xd2\xa3\x2e\x76\x45\xa6\x2e\x19\x19\x68\x6f\xa6\x2e\x1e\xf9\x5a\x6e\x10\xa1\xd2\xd8\x14\xa4\x0b\xf7\xb0\xeb\x9f\x0d\x55\x5a\x3b\x71\xc6\xf8\x06\x19\xf6\x3b\x92\xec\x17\x02\xa0\xdb\xe2\xe0\x71\x07\xbb\xfe\xa0\x3f\x60\xe4\xfa\x6c\x8e\x56\x38\x04\xf7\x3c\x9d\x2e\x5b\x43\xf6\x5b\x64\x04\x7b\x8e\x37\x26\xb5\x23\x8a\x00\x75\x3c\x20\xba\xa8\xfd\xce\x56\x8c\x7d\xbd\xe4\x7b\x33\x49\x19\x1f\xf0\x0e\x37\x4b\x45\xc3\x05\xb8\x55\x4b\x75\x7b\x3e\x12\xd9\xed\xc0\xba\xd5\x5a\x3f\xeb\x09\x07\xd1\x85\x4e\xb9\xc6\xbe\xdd\xa8\xc2\x37\xe7\x43\xa7\x37\x91\xd6\x36\x82\x96\xc7\x96\xc5\x57\x99\xe0\xe1\x60\x42\xce\x47\xc3\x09\x69\xb7\x75\xa4\x4c\x25\x65\xe2\xc4\xe4\x73\xa9\x62\x63\x97\x9a\x4a\xd3\x35\x1c\x0a\x4f\xba\xe1\x58\xfc\x3b\x72\xe4\xbf\x5d\x37\xc6\x3d\x91\xe9\x48\x66\xff\x3a\x93\x5f\x3a\x6e\x8c\xfb\xf2\x8b\x14\x69\xba\x31\xee\xe6\x62\xaf\x39\x93\xf4\xbc\x3f\x9a\xa4\xed\x36\xbc\x97\xaa\xd0\x0f\x2e\x6d\xa7\xe8\xd6\x8d\x73\x91\xea\x48\x42\xaa\x56\xd5\x4a\xed\xdb\x13\x62\xdf\xe6\x10\x89\xa6\xee\x35\xe6\x6a\xb7\x21\xc5\xf7\xb3\x74\x6e\x7f\x90\xba\x43\xe0\x40\x14\xaa\xdf\xca\x8e\xfb\xa4\x03\x85\x0d\x0a\x08\xdb\x98\x6a\xcb\xdb\x17\xff\xf8\xea\xeb\x97\xdf\x5c\x3c\x7f\xf5\xed\x77\xec\x2a\x0b\xf3\xfc\x18\xbc\xfb\x7c\xbb\x6d\x5e\x6c\xb7\xcd\xcb\xed\xb6\xf9\x8e\xa1\x86\x24\xad\x30\x55\x46\x04\x0c\x6e\x3b\x28\xf0\x6e\x24\x50\x04\x5b\xbb\x77\xb0\x2a\x99\x25\xd3\x15\xe3\xee\x57\x5c\x5e\x32\xb9\xd5\x89\x84\x66\x73\xb4\xe1\xd6\xc8\x93\x02\x92\x1b\x3e\xef\x94\x47\xe9\x6c\xb5\xae\x41\xc8\xef\x7a\x51\x22\x00\x61\x9d\x52\xa6\xac\x19\xad\x76\x1e\x4f\x4f\x3a\x46\x4c\xf3\xa9\x7a\xe0\x96\xff\x6d\x91\xce\x87\x91\x92\x3e\xa0\xf0\x99\x0f\x62\x38\xed\xb8\x27\x1d\x6e\x8c\xca\x10\x4e\x02\x42\xb5\x32\xf1\x04\xf2\xec\x11\xe1\x2c\x6d\xb7\x85\xc9\x1f\x1f\x30\xcc\x00\x45\x6c\xd4\x5a\x41\x21\xae\x92\x81\x73\x20\xcb\xa1\x81\x1c\x0a\x6d\x97\x88\x44\x1b\x15\xe2\xfe\xa4\xc0\x1d\x59\x81\x05\xfc\xe2\xca\xd9\x14\x52\xb4\xa0\xb8\x72\x96\x85\x6a\xa0\x74\x79\x68\xe9\xd0\x2d\x0e\x81\xf5\xed\xe5\x9b\xd7\x96\x12\x67\x87\x8b\x7b\x7e\x87\x24\xe0\xd4\x3e\x95\xae\x47\xf7\x38\x31\xf5\xd6\xab\xe2\x51\xe9\xad\xaf\xc5\x2b\xad\x62\x7d\x8e\x93\x92\x80\x15\x5d\xe0\xd3\xd9\xd5\xe6\xc5\x99\xe3\x9c\x5c\x6d\x5e\xbc\x7c\xf9\x72\x7e\x7a\x83\x2e\xf1\xe9\xaf\xc6\xdb\xaf\x5e\xbe\x9c\x7f\x71\x8a\xde\xc9\xb7\xcf\x8b\xb2\x5f\x9c\xa2\x0f\xb8\xb9\xd8\x6e\xb3\x5d\xf1\x84\xa1\xec\x2b\x22\x50\xce\x18\x32\x9a\x5b\x4d\x7c\x0b\x44\x10\x3d\xeb\x21\xe7\x4f\x0f\x9e\x4b\x72\xe3\x59\x2b\x30\x19\xe6\x7a\x8f\xb3\x5d\x2e\xef\x6f\xd6\xd5\xd5\x26\x58\x38\x43\xf6\xcf\x59\xaf\x6f\xfd\x8d\x11\x84\xc0\x92\x2f\xc5\x3b\xb8\xdd\x8a\x72\xc4\x0b\x8c\x02\xec\x89\x35\x7c\x57\xab\x82\x5b\x17\xe1\x7c\xd9\xd6\xe2\x61\xe8\x40\xc0\xc3\xe3\x14\x5b\x13\xb6\x5a\xcd\xa5\xa1\x74\xf1\x45\xf8\x1c\x5a\x17\x48\x48\x26\x6b\x8a\x40\x8a\x34\x3b\x04\x51\x73\x09\x0a\xf3\x73\x9a\x43\x9e\xc5\x08\x53\xe4\x81\x5b\x24\x3c\x5b\x60\x8e\xbe\xa9\x75\xea\x4f\xf1\x3d\x88\x11\x3d\xe1\x0a\x27\xfe\xb3\xdd\xd1\xbb\xfb\x06\x5c\xf2\xa4\xec\xcd\x1b\xf0\x0e\x85\x70\xbb\x65\xff\xca\x17\x97\x28\x85\x53\x06\x10\xab\xfd\x1c\xac\x00\x41\x0e\x44\x9d\x21\x74\x49\x3e\xb9\x6d\xb5\x0c\xf4\x23\xf6\x9e\x12\x0d\x08\xa1\x4e\x4f\x21\xa1\x0f\xdb\xed\x7b\x86\x7b\xd4\xc6\xdc\x73\x88\x4a\x70\x0c\xb1\x07\x3e\x4c\xef\x5c\x39\xb7\x54\x0f\xf7\x7d\x21\x9d\xd4\xa2\xf5\x70\xca\x10\xcb\x05\xfa\x06\xba\x21\x3f\xab\x3c\xb9\xf7\x23\xe2\xd7\x89\x72\x6e\x07\xa9\xcd\x86\x8f\xe4\x24\x78\x5e\xf6\x61\xc7\x4c\x76\x0b\x1f\x84\x6b\x65\x6d\xae\xf4\x0a\x2f\x2a\xf5\x1a\x1a\x16\xd9\xd2\x5b\x31\x0a\x5f\xb0\x7e\x39\x7a\x10\x9e\x4c\xae\xf2\xac\xe5\x02\xf6\x7e\xff\x50\xda\x9c\x02\xb5\x48\xfe\xd1\x33\x45\xdd\xe9\xfe\xbe\x25\xfc\x6b\x75\x02\x4d\x8c\x3d\x39\xb8\x30\x47\x0f\xe5\x8f\x2e\x8f\xfe\xd6\x1b\x8d\x86\x07\x04\xde\x86\x70\x46\x60\xa1\x8a\x4c\x86\xdb\xd9\x9b\x42\xd0\x23\x86\xda\x0c\xb7\xdb\x92\x88\x26\xb2\x17\xa0\x23\xc4\x31\xb5\xc6\x0e\x35\x3c\x43\xc4\x80\x22\x8f\xc9\x94\x02\x1e\x32\xc3\x9d\xcd\xf9\xc6\xe0\x39\xe8\xcb\x0b\xcb\x53\xed\x1f\x33\xcb\xde\xa0\x27\xe6\x20\x2c\x9f\x8c\x51\x2b\x8f\x50\x21\x6d\x53\x4f\x42\xdc\xc5\xd3\xca\x97\x7b\xe4\x89\xf9\xcb\xaf\xc6\xb5\xa0\x7e\x02\x19\xca\x7d\x71\x2b\x56\x4a\x9a\xe2\x14\xb2\x89\xe1\xf0\x4c\x2a\x0f\x2c\x2d\x1a\x32\x97\x44\xd9\xd4\xed\xf0\x14\x59\x59\x6e\x75\x48\x2e\xd6\x6c\xfe\x5f\x1f\x24\x40\x92\x0f\x10\x25\x80\x6b\x9a\x9f\xc4\xaf\xf6\xc6\x35\x6a\x96\x7a\xf3\xd7\xce\x60\x30\x82\xf2\x42\x13\x07\x44\x4c\xd8\x2b\x84\x34\x51\x21\x97\x49\x0a\xb9\x4c\x86\xe5\x74\x0d\x11\x8c\x8f\x3d\x2e\x82\xd9\x60\xcf\x10\xc1\x64\x70\x12\x49\x15\x15\xd2\x20\x32\x27\xee\x9b\x82\x97\x0c\x09\xdc\xe4\x86\x86\xe0\xa5\x4e\xe2\x82\x28\xde\x48\x36\x2c\xc6\xd4\x16\xb5\x50\x88\xa9\x58\x1a\xcd\xe7\x3e\xd3\x99\x11\xa7\x89\x21\x54\x71\xb9\x71\x7a\x8c\x42\x88\x64\x8d\x76\x91\xc7\x91\xb1\x73\xcd\x0e\x14\x52\xaf\x61\x9d\xdb\x0a\x23\x48\x7a\xa3\x3e\x04\x96\x97\xdd\xc7\xbe\x86\x01\x3f\x21\x75\xb6\x5a\x8f\xed\x44\x23\x9a\xae\x24\x75\xa2\x62\x7f\x26\x85\x10\x2c\x2b\x90\x98\x5f\x20\x8e\x2a\x47\x24\x14\x61\xcb\xc2\x94\x77\x5d\x58\xfc\x2f\x0a\x4e\xfb\xb6\x70\x0e\xbb\x29\xd6\xfe\xbe\x70\x24\x5b\x15\xf1\x0b\xae\xb5\xff\x25\x7a\xae\x9d\xae\xd0\x05\x6f\xa1\x3f\x1c\x33\x76\x47\x63\xac\x77\x3a\x49\x00\xfa\x50\xf8\x75\xbe\x2f\x1c\xa0\xef\x0a\xb7\xb5\x6f\x8a\x60\x08\x3f\x14\xea\xbc\xef\x0b\x8f\x9f\x8f\x85\x3f\xca\xbf\x0b\xcd\xde\xd7\x85\x64\xe0\x55\xa1\xc2\x7c\x8b\xd5\xc2\xa0\x37\xfc\x4c\x8f\xc7\x5d\x88\x7e\x2c\xc2\xb0\xbc\x2e\xf6\xf5\x4f\xbb\x59\xe1\x5f\xe2\xef\x81\xb5\x0c\x83\x80\xc4\x16\x44\x2f\x94\xa2\xce\x42\xff\x29\x79\x5e\xff\x03\xbf\xe6\xfb\xfc\x77\xfc\xda\xd8\xe7\x2f\x20\xfa\x4a\x6a\x8f\x67\xff\x99\xa3\x9f\x71\xa8\x34\x8b\xbf\xe1\x9f\x5b\xad\x9f\xd9\xcb\x7f\xe1\xb0\x08\x04\x89\x7e\xc1\xa1\xfd\x4f\xe9\xb3\xf4\x05\x7e\x67\x2f\xd0\xb7\xf8\x83\xbd\x40\xff\xc4\x17\xf6\x02\x7d\x87\xef\xec\x05\xfa\x1f\x1c\x15\x19\xaa\x09\xc1\x3f\x00\xa9\x17\xcf\x2c\x88\x28\x7f\x4e\xd6\x27\xc5\xab\x98\xbf\x12\xca\xcd\x94\xe0\xe6\x2f\xdb\x6d\xf3\x97\xd9\x7f\xe6\xf2\x1f\x7b\x11\x4a\xc7\x66\x14\x12\x9c\x31\x16\x7f\x57\x0d\x3e\x6a\xe2\x15\xf8\x16\x3c\xe4\x87\x62\x9c\x7e\x2b\x4e\x2d\x2f\x21\xe4\x7f\x23\x1e\xf4\x34\x87\x3c\xf4\xe9\x8e\x5f\xa9\xd8\xf3\x5f\x80\xaf\xa4\x03\xa8\x74\x63\xfe\x6a\x46\xe7\xe8\x5b\x59\x08\xa5\xad\x16\x69\x62\xfc\x55\xab\xf5\x2d\x2b\x88\x52\x98\xbb\xdf\x22\x8f\xd4\x87\x08\x26\x33\x32\xc7\x2b\xf0\x9b\x26\x6d\xfe\x01\x62\x89\x46\x5e\x20\xea\xdd\xb8\x04\x05\xd2\xd1\x24\x4c\x62\x6e\x04\x9d\x6d\xb7\x20\xb6\x8d\xb7\x98\x42\x14\xe7\x28\x22\x95\x8c\xa6\x28\x85\x0f\x14\xf3\xa1\x10\x40\x09\x7f\x81\xd6\x8c\x35\xbb\xe5\x99\x57\x6f\x41\xac\xbb\x5d\x83\x14\xa2\x00\x10\x82\x42\x38\x05\xa9\x99\x6b\x8c\x91\xb1\xe8\x25\x6c\xb5\xe8\xec\xe5\x7c\x16\xce\x19\x5d\x2a\x7e\x61\x9e\xa6\x17\xaf\x40\x8a\xcc\xbc\x6d\xf7\xc0\xe1\x62\x5c\x08\x5d\x59\x77\xbb\xfd\x96\xfd\x8b\xee\x41\x07\x3d\xe4\x10\x22\xdd\x00\x63\x7e\xd9\x60\x43\x94\x42\xe8\x7e\x2b\x7f\xe5\x28\xa9\xc2\x6b\xad\xf8\xd2\x18\x2f\x00\x65\xdd\x5e\x83\x58\x3b\x08\x06\x04\x18\xce\x55\x3f\x81\x14\x99\xe6\x9c\xa0\x99\x31\x8a\x22\x63\x20\xe0\xe9\x0b\x23\x22\x56\x8b\x7b\x6c\x42\x44\x72\x94\x91\x1a\x23\x81\x5b\xe1\x3d\xee\x81\xef\x04\x0d\xae\x19\xf1\x26\x90\x29\xfc\xbf\x6a\xb5\x38\xd0\x28\x23\x95\x03\x06\x64\xde\x3e\x68\x82\x78\xbb\x65\x2f\x44\x35\xfe\x9b\x08\x05\x87\x7c\xc9\x01\xba\x0c\x33\x06\x08\xca\xb8\x1a\x46\xb9\xfb\xf5\xbb\x64\xc1\xc6\x91\xe2\x5b\xb6\x74\xe1\x02\xc4\x6c\x7b\xa9\x26\x53\xd1\x24\xfb\x21\x8a\x87\xf8\x0b\xee\x1d\xa4\x6f\x0f\x39\x44\xc6\x50\x34\x41\x00\x62\xde\x75\xcc\xfa\x4d\xb9\x8b\x9a\x99\x58\x4e\x2c\x48\x9e\xa3\x4d\x1d\x3c\xfe\x09\x16\x92\x83\x2e\xf4\xc8\x3f\x01\x5a\xba\x09\xc5\xa8\x88\x80\xc7\x47\xfe\xe3\x7f\xb8\xc7\x4c\xce\x37\x69\x50\xd7\x2e\x61\x90\x44\x31\xfe\x27\xa0\x53\x4a\x5c\xd1\x49\x5a\xea\x24\x2e\x75\xa2\xfb\x00\x4d\xca\xa6\xff\x15\x22\x90\x77\x94\x22\x7e\xa2\x58\x67\x69\x3e\xf1\xb7\x5b\xf0\x33\x2e\x8b\xac\x96\xe0\x37\x61\xed\x29\x6d\xa3\xfe\xa5\x58\x4e\x15\x10\xdc\x6b\x98\xe9\x6d\xc4\x9e\x23\x3b\x32\x68\x23\x8d\x5a\x41\xc3\x38\xf3\xe9\x0d\x30\x1f\x95\x3b\x16\xa2\xf8\xdf\x62\x2f\x19\x27\x34\x86\x0f\xc5\x2e\xf2\xd8\x7a\x13\x86\x3f\x8c\xfd\x21\x7e\xce\x5e\xce\xf9\xfe\x02\xc5\x76\xe1\x07\x8f\x9d\x1b\xbe\xbd\xf8\xb1\x8a\x61\x91\xcc\x25\x6b\xb5\x52\xd2\x6a\x85\x84\x23\xa0\x1d\x7f\x8a\x8c\x50\x37\xce\x21\xf2\x08\x17\xde\xe4\xe8\x1b\xf0\x1b\xe6\xb8\xdd\x70\xaa\xd8\xc5\x96\xbf\x0b\x52\xc5\xa6\xde\x4d\x0e\xd1\x37\xe0\x67\x64\x95\x2c\x4b\xac\x3a\x39\x8e\x47\xc0\xbf\x85\xa4\x8e\xb1\xce\xf6\x02\x67\x04\x7d\xb0\x17\x38\x22\xe8\xbd\xbd\xc0\x09\x41\xef\xec\x05\xf6\x09\x7a\x6e\x2f\xd8\x95\x81\x37\x04\x5d\xda\x0b\x1c\x10\xf4\xaa\xde\x29\xd9\x23\xe0\x6b\xd9\x22\xca\x5a\x2d\xf0\x2d\xf8\x0d\x59\x06\x36\xb4\x76\x27\x5c\x8f\xfd\xd5\x7c\x8c\xba\x79\x0e\x51\xb2\xdd\x7e\x03\xbe\xda\x97\xb5\x28\x23\xe8\x61\x13\x67\xde\x42\xa4\x3b\x64\xfb\xd4\xe4\x05\x8c\xad\x23\x52\x23\x7a\x6b\x93\x88\xf6\x25\xb3\xe5\xe7\xe8\x41\xec\x3a\xf7\xe7\x1c\xa2\x9f\xc0\x35\x88\x09\x2c\xc1\xef\xad\x08\x14\x5d\x90\xe6\x2f\x76\xd8\x24\xd6\xca\x26\x23\x02\xfa\xe5\x09\xf2\xb0\x8b\xec\x5b\xb8\x5a\x47\xa4\xfa\xad\x93\x97\x5a\xde\xcb\x87\xa9\xe1\x66\x05\xc7\x5a\x2b\xee\x34\x24\x71\x2b\x40\xa0\x9b\x10\xb0\x92\x21\xd5\x51\x85\xa7\x8c\x08\xda\x89\x74\x91\x10\xb4\xcf\xb5\xd2\xf5\xc9\x91\x43\xdd\xe1\x0d\xb9\x13\xb8\xbb\x61\xf5\xdf\x00\x88\x7e\x04\x3f\xa3\x17\x10\x7d\x9c\xbd\x9c\x73\xe0\x74\x3a\x66\xc0\x1b\xc6\x7e\x75\xba\xbd\x43\xb9\x9e\xeb\x64\x7b\x86\xb5\x96\x11\x36\x48\xd2\x7f\x5c\xb8\x37\x1c\x39\x3c\x6c\x41\xa2\xdc\x14\x4f\x68\x22\x49\x9d\x93\x94\xdc\x84\x19\x4d\xef\xb9\x0d\x57\xa2\x88\x22\x5e\x40\x14\x2d\x0a\x94\x58\x34\x49\xd0\x55\x41\x90\x09\x23\x8f\x3a\x66\x58\xfa\x83\x7b\xc0\x37\xa2\x17\xf8\x33\xaa\xfc\xc1\x4d\xb9\x1b\x2d\x62\x06\x89\x34\xae\x9b\x59\x3c\xc7\x14\xc5\x42\x55\x32\xae\x73\x4a\x2a\x58\x09\xee\x54\x28\xdc\x07\x2c\x6e\xd6\xda\xad\x61\x24\x8a\xe2\x75\x16\x4c\x39\xea\xf6\xce\x76\x17\xc2\xa8\x64\x70\x2a\x83\xe1\xa8\x5b\xd7\x01\xe7\x60\x20\x8a\x01\x5f\x55\xf6\xa3\x3b\x1a\xf6\xba\xec\x07\x97\xe1\xb2\x1f\x5c\xb4\xc1\x6d\x30\x86\x35\xf1\xd2\xea\x54\x82\x85\xbd\xa1\x61\xa4\x5d\x64\xb1\xd8\xb7\xf0\x7f\x7c\x5d\x85\x0b\x81\xbb\x6b\xae\x57\x63\xe3\x5b\xce\x6f\xe1\x35\x32\x15\x52\x94\x2b\xf1\x7c\x64\xc8\x1f\xb9\x39\x1e\xcc\xd1\xb0\x3f\x1a\x1d\x62\x10\x79\x10\xd6\x8b\x28\xe2\x4b\xda\xef\xd5\x28\xcb\x2a\x65\x59\xc1\xb3\xb3\x6e\x4d\xee\xdb\xa2\xa0\x14\x30\xb3\xa2\xc3\x41\xaf\xc6\x59\xb8\x28\x9a\x11\x2f\x15\x8d\x76\xba\xa3\x1a\x3b\x69\xa3\xa4\x52\x9d\xf2\xc4\x78\x35\x81\x33\xcd\xa2\x51\x28\xb2\x30\x8c\xeb\xec\xb0\x0a\x23\x7d\xce\x8b\x85\x9a\x17\x9b\xa4\x15\x53\x7b\x14\x02\x36\x07\xa7\x7b\x20\x85\x6c\x11\x4e\x56\xb6\xe7\x69\x86\x6e\x12\x56\xd3\x89\x7b\xc0\x88\x04\x8b\xf4\xaf\x1c\x75\x87\xdd\xf1\xae\xfa\xa1\x98\xd2\x26\xce\xfc\x64\xcd\x8e\x11\x87\xc0\x60\xd0\xaf\xb1\xf3\xaa\xf0\xfd\x2f\xc2\x6c\x9d\x64\x7c\x19\x06\xa3\x9a\xc0\x69\x45\xf1\xa0\x28\x79\x36\x72\xc6\x87\x8a\xf2\x4d\x40\xf8\x09\xed\x8e\x07\x35\xa6\x5e\x46\x51\x42\xbd\xc0\xa3\xde\x77\xe4\x9e\x15\x1f\x75\xc6\x35\x26\x3a\xbb\xc5\xf9\x0a\x3b\xdd\x1a\xf7\x93\xa2\x6c\x72\x9d\x91\xf4\x56\x61\x95\x71\x6f\x34\xda\x95\x07\x17\xa5\xd7\x1e\xbb\x47\xe3\x1f\xd4\xfe\xed\x8f\x46\x35\xb9\xcb\x76\xf6\xaf\x3c\x16\xbd\x9e\x53\xbb\x85\x3b\xdd\xb3\x01\x2c\xac\x8a\x18\x42\xdc\x91\x96\x48\xf3\xfe\xa8\xf0\xbc\x2d\x45\xa2\xdd\xe7\x6e\xab\xc2\x41\xf9\x22\x46\x85\x74\xae\x0d\x67\xfe\x5c\x19\x02\x17\x2e\xb6\x01\x23\x31\x03\xd8\xc4\x8c\x61\x8e\x40\x80\x32\xe4\x43\x94\xcc\xfc\x39\x4e\x84\x41\x4d\x9e\xa3\xd1\xe0\xe0\x16\xee\x8f\x46\xe5\x3c\xe1\x39\xea\x38\xbd\xee\xfe\x3b\xf3\xac\xdf\xe9\x56\x2a\x9c\x8d\xc7\x35\x96\x34\x85\x45\xfd\xd9\x6e\x8d\x51\xff\x40\xc4\x98\xde\x68\xdc\x81\x93\x18\x70\xf0\x9b\x41\x1a\xd3\x1c\xf5\xcf\x0e\x08\xd4\x7b\xc3\x71\x7f\xb0\xaf\xe6\xb0\x33\x38\x94\x2f\xe4\x6c\xdc\xed\x57\x01\xd1\x3d\xab\xc1\xa0\x7a\xd9\xcf\x06\x83\xb3\x4a\x8d\x41\xd7\xa9\x71\x6a\x57\xe3\x99\xec\xb8\x7e\xec\xf3\x6e\xe7\x10\x65\x3b\xa6\x92\xf4\x00\x65\xf8\xa1\x94\x4c\xb8\x69\x64\xed\x6d\xee\x49\x63\x65\x38\xbf\x0b\x79\x52\x11\x09\x0f\xe3\x84\x31\xd1\x09\xe7\xbb\x28\x7b\x54\x65\xb6\xdb\x10\x64\x88\xfb\x9b\x4c\x23\x97\xe6\x39\x3a\xeb\x0d\x0f\xe4\x85\xea\xf5\x46\x3b\xd0\x38\x1b\x39\x07\x3c\x2d\x46\x83\xf1\xce\xb6\xe8\x74\x0f\xa4\xc8\xea\x3a\x1c\xb3\x96\x01\xee\x9c\x1d\x70\x85\x1f\x3b\xe3\xfe\xb8\x52\x63\xe4\x74\x0e\x78\x0a\xf7\xc7\xce\xa8\xb7\x33\xaa\xe1\x81\x4c\xc1\x7d\xa7\xe3\x54\x37\xce\xb8\xe7\x38\x07\x3c\xf3\x06\x67\x83\xea\xcc\xbb\x9d\xf1\x21\x45\xd1\x78\xb8\x73\x4a\xbb\x67\xbd\x03\x67\xa8\x3f\xee\xf6\xaa\x7d\x8c\x87\x83\x9a\x24\xfa\x85\xc8\x7d\x38\x1e\xed\x3b\x3b\x67\x65\xcf\xf8\x1a\xb1\x31\xc5\xd6\xcc\x3b\x59\x5c\x9c\xbc\xbc\xba\x0a\xdc\xb9\x65\xb0\xc5\xd5\x9c\x57\x52\xcb\xf0\x55\xb2\x89\x03\x2f\x0d\x49\x36\xb5\xc0\xd4\x05\xd3\x73\x7c\x75\x95\x6d\x7f\x85\x60\x8a\x2d\x25\x03\xa2\xc8\x82\x5b\xf6\xc9\x82\xe6\x2b\x30\xe5\x65\xbf\x80\xd0\x82\xae\x65\xe5\x28\xc5\xac\x8d\xee\x60\xe6\x9c\x0c\xe6\xdb\xee\xcc\x39\xe9\xcf\xaf\xae\x82\x6d\xe7\xea\x2a\x60\xff\xce\x3a\x27\x63\xfe\xe2\xea\x2a\x80\x60\xea\x5e\x5d\xd9\xc7\x97\x87\x0f\xbd\xdc\x42\xa1\x39\xc3\xf9\x43\x07\xf5\x73\x0b\x79\xd8\xba\x8a\x59\x7b\xec\x8f\x1e\x75\x88\x2c\x17\x3e\x8c\x72\xf6\x0e\x1a\x2f\xb7\x2e\xdc\x36\x8e\xf8\xef\xf4\xb4\xd1\x71\xbb\x6e\xcf\xed\xbb\x03\x77\xe8\x8e\x5c\xb7\x51\x79\x71\x26\x3a\x84\xe5\x1e\x87\xe5\x1e\x53\xd6\xe3\xd3\x06\x50\xe9\xd9\x65\xef\x4a\x2f\xce\x6a\x5e\x94\x9e\x3b\x76\xd7\xee\xd9\xfd\xda\xf1\x0d\xd8\xf8\x2a\x03\x2c\xbf\x09\x91\x05\x1f\x3a\xa8\x9b\xef\x19\x69\x69\x7c\xae\x78\x67\xbc\x18\x55\xc6\xc7\x1f\xcb\x05\x0e\x8d\xaf\x9f\xf3\x8d\xb8\x33\x20\x07\x75\xf2\x63\x86\xdd\x13\xc3\x36\x06\xe9\xaa\x81\xeb\x17\xc3\xca\x20\xc5\x10\x2b\x05\x0e\x0d\xb2\xb7\x77\x90\xdd\xa3\x06\xd9\xaf\x0c\xd2\x2d\xa0\x2b\x5f\x0c\x2a\x83\x54\x43\xac\x14\x38\x34\xc8\xee\xde\x41\xf6\x8e\x1a\xe4\xa0\x34\x48\xd7\xdc\x02\xfc\x45\xbf\x32\xc8\x62\x88\x95\x02\x87\x06\xd9\xd9\x3b\xc8\xfe\x51\x83\x1c\x1a\x83\x74\xcb\xfb\xb4\xe3\x9a\x87\x55\xbc\x38\xdb\x5b\xc0\x1c\xa4\xbb\x6f\x4c\x83\xa3\xc6\x34\x62\x63\x82\xd5\x33\xe3\x96\x91\x47\xa3\xee\x45\x69\x78\x0d\xe3\x20\x33\x7c\xf9\xd7\x99\x73\x32\xf6\x4e\x7e\xbf\x38\xf9\x37\x43\x7d\x39\x9c\x1e\x44\x23\x35\xc7\xf6\xaf\x84\x2e\x1d\xf3\xdd\x5f\x3b\x57\xb1\x55\xa4\x6d\x39\xbd\xca\xbe\xbc\x3a\xbd\x3a\xb5\xbf\xfc\xe2\xf4\x66\x85\xac\xd2\xa7\xf8\xf4\x86\xbf\xa1\x69\x28\xdc\x43\x63\x72\xd7\x50\x81\x21\xc0\xd4\xfd\xd5\x32\x00\xf3\x05\xbb\x31\xdc\x5f\x0b\xd0\x78\xec\x9d\x05\x39\x05\x6e\xd4\x2b\x57\x62\xdf\xb3\x3d\xdf\x3d\xf9\xdd\xdf\x7b\xa7\x91\x8f\x9e\x4f\xa7\x91\x5b\x19\x97\x6e\x81\x55\x28\x16\x0f\x9a\xaf\xc5\x0d\x67\xac\x64\xa9\xac\x57\x2d\xcb\x98\xc7\x1b\x0b\xe6\x13\xdf\xbe\xed\x3f\x32\x9e\xa4\x34\x9e\x63\x06\x23\x1b\x47\xbe\x7d\x3b\x7c\xa4\xf1\xec\x88\xc6\xbd\xda\xc6\x0b\xd2\xc2\xcf\x51\x7f\xdc\xe9\x1d\x19\x14\xeb\x8c\x67\xba\xab\xcd\xaf\x96\x82\x07\x3e\x2a\x2e\xc0\x15\xde\xa7\x04\xe6\x93\x70\x0f\x8c\x52\xfb\xb6\x5f\x5b\x03\x85\x7b\x26\x9e\xda\xb7\xc3\xbd\x35\x44\x40\x9d\xfa\xa0\x01\x04\x4e\xd9\x28\xd8\xbf\x7d\x77\xa8\xf2\xcd\x1a\x30\x08\x73\xd4\x19\xf5\x2a\x0e\xc3\xf0\x61\xc7\x90\xae\x70\x90\x43\x09\xca\x26\x75\x9e\xd0\x33\x40\x5a\xdd\xc1\xe0\xfc\xbc\xdb\x87\xcf\x9e\x3d\xeb\xf6\x91\x7a\xd1\x19\xb2\x17\x9d\x21\x02\xc3\x41\xf7\xcc\x69\x11\xf6\x78\x86\xba\x83\x41\x8b\xcc\xed\xff\x24\x61\x0c\x2c\xdb\xe2\x09\x97\x76\x18\x07\xd5\xad\x74\xc1\x9b\xcd\x51\x8a\x43\xec\x4c\xc2\x73\xdc\x6b\xb5\xb8\x11\x9c\x36\x85\xc5\xed\x76\x28\xc2\x5a\x3d\x73\x84\xf3\xba\x6d\xb1\x02\x33\x67\xae\x72\xc2\x90\xbb\x86\xf4\x5b\x7f\x15\xdf\x7a\x51\x18\x34\x5e\xfd\x68\xc1\x09\xc1\xc4\xce\x36\xd7\x42\x9a\x06\x3a\x30\xf7\x30\x60\xac\x10\x81\x70\xe6\xcc\x51\xf9\x73\x34\xeb\xcc\x21\xa2\xc2\x8a\xd7\x83\x79\xb8\x00\xe6\x38\x1e\xe9\x4a\x59\x20\x97\x73\xf4\x77\xdc\x70\x01\xe8\xcc\x99\x3f\xeb\x77\xc7\xfd\xf1\x70\xd4\x1d\x0f\x1e\x69\x48\x07\xe1\x74\xe6\xcf\x9e\x3d\x73\x54\x02\x7f\xd5\x4e\x77\x30\xd8\x6e\xe9\xac\x33\x7f\xd6\x19\x8e\x46\xa3\x6e\xe7\xb8\xf6\x78\x65\xb6\x86\xbc\x2e\x2c\x5a\xee\xd5\xb4\x2c\x7f\x75\xe7\xcf\x86\x83\x41\xef\x53\x3a\x60\x9b\x83\xb7\x60\xf4\xd4\x3f\xd8\x93\xfc\xd5\xe3\xbf\xfe\x48\x8f\xe7\xe7\x67\xbc\x1d\xd1\xb3\xb2\xd8\x3e\xd8\x60\x9e\xa3\x10\x83\xb4\x16\x37\x19\x16\xaf\x3c\xa9\x28\xb0\x1c\x4b\xc4\x12\xb0\x3c\x4b\x06\x07\xbb\xb0\x60\x85\x35\x51\xde\xa7\x09\xca\x90\xcf\xf7\x78\x86\x1d\x44\x71\xc7\x41\x31\xb6\xc6\x16\x4a\xb0\x83\x88\x36\x6f\x6a\xb5\x2c\xc7\xc2\x6c\x4b\x27\xf3\x56\x0b\x58\x1f\xe5\x43\xbb\x33\xdf\x6e\xad\xff\x29\x9e\xa6\x20\x69\xe3\x2e\x6b\x68\x08\x5d\xcb\xb1\xce\xe5\xfb\x56\x4b\xfc\x7b\xce\x1a\x6f\xb5\x40\xd2\x6e\x23\x8a\xcf\x58\x67\x23\x71\xc9\x24\x93\xe4\x5c\x1f\x29\x71\x8a\x64\x75\x51\x79\x7e\x8e\x63\x98\xe1\xec\x4b\xda\x06\x29\x60\x2f\xe0\x49\x28\x60\xc8\xb3\x5b\x86\x0b\xd0\x19\x36\x31\xa6\x50\x98\xc2\xb3\x06\xbc\x4a\x03\xd6\xc2\x52\x4d\x74\x9c\xb6\x6a\x25\x2a\xb7\xd2\x64\xf0\xaa\xd4\x7b\x69\x41\xd9\xec\x6e\x75\x8f\x57\xcf\xd9\x71\xcc\x0e\x9e\x22\x9a\x24\x8d\xc8\x4b\x6f\x88\x05\x27\x49\xbb\xcd\x2a\x24\x18\x63\x7f\xb7\x24\x59\xad\xe9\x7d\x23\xf1\x29\xa1\x7a\x37\xcd\x32\x94\xcc\x73\x44\x4c\x2d\xb0\xa1\x83\x2d\xb9\xc5\x84\x66\x34\xc9\x22\xdd\xfd\x6e\x47\x3f\x84\x59\x16\xc6\x37\x8d\xff\x13\x13\xfa\xb7\xc6\xda\x4b\xbd\x15\xa1\x24\x15\x22\x76\xba\xdd\x82\x90\x61\xa0\x75\x14\x52\x60\x9d\x5a\xa8\x0b\x11\xc1\x21\xc3\x4c\x14\x87\x02\x1b\x71\xab\xdf\x5e\x17\xa2\x1d\x33\x56\x1e\xd0\x48\x5a\xe6\x71\x3c\xfb\xec\xa4\x23\x02\x69\xd0\x65\x98\xd9\x2b\x2f\xfb\xf0\x7d\x12\xdf\x70\x13\x7b\xe9\xa3\xe6\xc1\x87\xbd\xe7\x80\x95\x77\x1b\x56\x9b\x0a\xa7\x85\x18\xa7\xb8\xd7\x9d\xa4\xcf\xb0\x33\x89\xf1\xc9\x49\x0a\x43\xe1\xf5\x57\x34\x8c\x71\xb1\x1a\xe7\xe7\xbd\xee\x49\xcc\x16\x4a\xe8\xaa\xed\xeb\x90\xb2\x82\x38\x16\x9e\x13\x32\x45\x2a\x5b\x7e\x2a\xd0\x3b\xdd\x7f\xc6\xc5\x50\xf8\x22\x59\x70\x52\x6a\x4e\x59\x4b\x02\x8a\x3a\x0e\x44\xe5\x01\x39\xc8\x2c\xfb\xcc\x91\x9a\xf0\xa2\x40\x65\xbc\xa5\xd2\x6c\xe8\xb9\x86\x5e\x4c\x28\xaf\xc1\xed\x41\x5b\xa5\x56\xc4\x76\x7c\x1c\xa0\x31\xa1\x0d\x2f\x08\x52\x92\x65\x2e\x8f\xb6\x98\xf3\xcd\x6f\x76\x7a\xce\x56\xf6\x30\x1c\x1a\x8b\x24\x6d\x84\xeb\xbe\x58\x1a\x01\x8c\x2c\xfc\x9d\x08\x37\xaf\x75\x72\x07\xba\xa8\x32\x15\x09\x96\x6b\x2f\x23\x38\x03\xe6\x74\x0c\x80\xa9\x2f\x7a\x56\xe2\xd3\x32\xc9\xa8\xfc\xfc\x7f\xeb\xbe\x2f\xc2\x34\xa3\xb8\x32\x07\x67\x5a\xee\xa6\xdd\x81\xae\x1e\x82\xa8\x17\x79\x19\x55\x5d\x9a\x15\x4b\xd5\xf4\xe4\x4e\xba\xee\x9e\x0f\x1d\x35\xb9\x34\xf1\x02\xdf\x3b\x62\x2c\x66\x5d\x45\x28\x69\xdc\xae\x65\xa0\x3c\xab\x85\x17\xc6\x06\x01\x44\x8b\x94\x7c\xbb\x27\x0f\x18\x47\xef\xd4\x82\xcf\x9c\xed\xb6\xcf\x36\xb5\x3a\xcc\xb6\x05\x15\x21\xc0\xad\xf3\x79\xa6\x2b\x1e\xa9\xaf\x14\x1b\x9b\x08\x00\xa8\xce\x01\xe5\x20\x93\x06\x3f\xa5\xd7\x6a\xbe\xdb\x2d\xe5\xc0\x84\x2e\x60\x07\xbb\x66\x6b\x62\x5c\x02\x40\xdd\xe6\x45\xe6\xcc\x63\xf2\x91\xd6\xcc\x5a\x26\x9d\x14\x71\x95\x3a\x10\x89\x19\xec\x03\xee\x97\xd4\xd8\x5b\xb0\xdc\x81\x14\xfe\xd6\xde\x8f\xa9\x74\xfe\x11\x9e\xdd\x62\x7b\x09\xc7\x1b\xbd\x6d\x20\xa2\xdc\x01\x07\xc7\x13\xc8\x06\x90\x42\x94\xf2\xac\xc8\xed\x36\x4a\xdb\xed\x72\x5f\x4a\xef\xb1\x27\xab\x1b\x07\x6f\xdb\x3a\xb5\xda\xe6\xb6\xc9\x11\xc9\x01\x37\x8d\x5d\x77\x23\x8e\x32\x11\xb5\xd9\x8f\x6e\xb8\xc6\x19\xa2\xf6\x6b\x22\x0e\x05\xc9\xa1\x88\x5f\x2d\xa3\xc0\x0d\xfa\xdd\x47\xbc\x01\x63\x3b\x00\x14\x3d\x6c\x6a\xac\x4a\xee\x73\xf4\x5d\xcd\xeb\x55\x9e\x1b\x32\xfd\xb3\xc1\x99\x54\x29\x77\x9c\x61\x8f\x6b\x81\x66\x96\xdc\x17\x24\xb5\xe6\x13\x7d\x45\x45\xda\x25\x44\x84\x1f\x0c\xed\xb7\x37\xff\x06\x0e\xe2\x09\xdc\x51\x1f\xa2\xd0\x7e\xbf\xf9\x19\x74\xd8\x8f\xdf\xfe\x7d\x01\x44\x50\x42\x65\x38\x16\xda\xc9\xc7\x3b\x00\x27\xa1\xfd\xcf\xe1\xb7\xc0\x8a\x6f\x9e\x47\x5e\x96\x59\x28\xb6\xe9\x92\xac\x48\xdb\x3a\xe1\xff\x5a\xac\xf6\xc7\xf5\x50\x34\xb3\x0c\xff\x03\xac\xab\x4d\xb7\xd7\xf5\x1a\xbc\x68\x48\x23\x9e\x4f\x3d\xcf\xf5\xb0\x44\x1c\xae\x07\x35\xa6\xfb\xf8\xa3\x70\x63\xe3\x63\x41\xac\xf6\xa8\x73\xc6\x9b\xfd\xea\x9f\x1f\x00\x84\x45\xcd\xec\x88\x9a\xfd\xda\x9a\xfe\xe3\x35\x47\x9d\xda\x9a\x9b\x47\x6b\x3a\x3d\xbf\xb6\x66\xf0\x68\xcd\x4e\x6f\x5c\x5b\x73\xb9\x6f\xe1\xb2\xb5\x17\x5b\x68\xc4\xea\xfc\xf2\xda\x07\x1d\x94\xa0\x2e\x72\x90\x15\xdf\x9c\x14\x3b\x00\x9d\xa9\xef\x5d\x94\x1d\xfc\xde\x43\xfe\xc1\xef\x7d\xb4\x39\xf8\x7d\x80\x82\xbd\xdf\xf7\x6e\x28\xfb\x8b\x70\xb5\x8e\x42\x3f\xa4\xc5\xd6\xba\xe4\x9c\x12\xdf\x30\xf7\x6b\x52\xda\x51\xa5\x12\xcf\xbd\x8c\x58\xc8\xfa\xfa\xa7\x9f\xac\x47\x0b\x5d\xfe\xfc\xfc\xf9\xd7\x97\x97\x8f\x17\xfc\xfe\xcd\x3f\x1e\x2f\xf4\xaf\x8b\x9f\x5e\x3f\x5e\xea\xd5\xeb\x97\x6f\xd8\x5e\x67\x13\x5e\xd7\xf0\x0e\x0f\x5e\x1c\xae\x3c\x4a\x02\x97\xe4\x79\x71\x50\x17\x87\xd7\x7b\x50\xac\xf7\x12\x0d\xd1\x50\xbd\x1f\xaa\xdd\xd4\xad\x07\x38\x2d\x40\xcd\x58\x69\x7d\x9e\xff\x91\x12\x60\xad\xb2\x9b\x93\x90\x92\x55\xc3\x42\xfc\xb7\xd5\x16\xc0\x2f\x27\x34\x66\x47\x17\x55\x31\x40\x68\xbf\xfb\xee\x37\x30\x42\x6b\x94\xda\x6a\x42\xb0\x0e\x36\xaf\x16\x16\x4a\xed\xd0\x4f\xe2\xac\xf4\xf9\x22\xfb\x1a\x58\x8d\x99\x40\x10\x2b\x92\x51\x6f\xb5\x46\xd6\xdc\xe5\x28\x63\x45\xb2\xcc\xbb\x21\xc8\x6a\x28\x48\xde\x56\xb2\x72\x49\xb4\x28\xbd\x92\xbc\x2c\x0b\x6f\x62\xf0\x90\x23\x22\x8d\x9f\x09\x9f\xc8\x54\xfc\xe3\xf2\xf5\x45\xba\x1f\xf6\x55\xfd\x9e\x1a\xbf\x5d\x9e\x7a\xf2\x85\x47\x89\xc8\xe9\xec\x7b\x11\x91\x81\xc5\xb8\x1f\xc4\x3d\x06\xe0\x76\x0f\x27\x40\xe1\xc3\x37\x2a\x3b\x81\xb8\xf3\x7e\x4f\x62\x82\xa9\x24\xa0\xc2\x8c\x26\x29\x77\xb4\xe6\xcf\x1c\x6d\x62\x2b\xf0\xd2\x0f\x96\x78\xc3\x21\x84\x9b\x92\x58\xf5\x37\x19\x4d\x56\x1c\xd6\xd8\x8a\x92\xd2\xd1\xe2\x05\x14\xcc\x71\x53\xd3\x2d\xef\x01\x41\xb3\x87\x0f\xe4\xde\xb5\xe2\x9b\x37\xf1\xf3\xa5\x17\xdf\x90\xcc\x92\xe1\xaf\x77\x75\xb4\xac\x9d\x09\x51\x43\x53\x54\xb1\x1a\xa9\xfe\x60\xfb\x9b\x34\x25\x31\x7d\xc7\x9a\xb1\x57\xde\x1a\xdc\xf0\x7c\x5d\x51\x72\x73\x49\x53\xe2\xad\x5a\x2d\xe3\xa1\x54\x5a\x12\x2c\x0c\x10\x76\xba\x89\xab\x62\xa6\x18\xdf\x80\x7d\x55\xe1\x84\xea\x01\x70\xc9\x4b\x0c\x51\x46\xe8\xdb\x70\x45\x92\x0d\xad\x31\xd8\xa7\x76\xe6\xa7\x49\x14\xbd\x4d\xbe\x4a\x28\x4d\x56\x7c\xc5\x18\x0b\xaf\x20\x72\xb1\xa0\x24\x7d\x17\x92\xbb\x57\x71\x48\x77\xa0\x22\xf9\x93\x9d\x36\x54\xfd\xf2\x87\x7d\xd5\xf5\x2a\xd9\x22\x42\xdd\xd7\x11\xe1\x99\xce\x54\xed\x35\x3e\xa2\xd8\x37\x24\xbc\x59\xd2\x3c\x9f\x43\x4e\x80\x40\xfb\x6a\xe3\x74\x47\x83\x85\x57\x2b\x12\x8e\xc9\x1d\x20\xdb\xed\x2d\x04\xa1\xfd\x4b\x6f\x08\x42\xfb\x27\xe7\x1a\xc2\x1c\xdd\xca\x7a\xfe\x6a\x8d\x43\xfb\x7f\xd6\x2b\x20\x4e\xc6\x2d\xca\x48\x44\x7c\x9a\xa4\x99\x3b\x9b\xf1\xcd\xb5\x4a\xe2\x90\xa7\x6f\x9d\xa3\xdb\x90\xdc\xfd\x73\x43\xd2\xfb\xba\xd0\x0f\x13\x8e\x9a\x42\xfb\x1f\x0b\xe0\x31\x8c\xd4\x15\x8f\xe1\x3f\x7e\x00\x0c\xb5\x3f\xff\xe9\x1b\xc0\xad\xd7\x69\x31\x43\x1c\x4b\xea\x2d\x47\x61\xbc\xde\xd0\xcc\x7d\x90\xcb\xea\x5a\xf2\x07\xdb\xd1\x64\x45\x5c\x4b\xd0\x12\x88\x9f\x04\xd7\xe2\xff\x58\xc8\x38\x09\xae\x65\x3c\x58\x48\xe3\x51\x4b\xfd\x62\x47\x9c\x46\xac\x25\xf6\x8f\x85\xf4\xd6\x72\x2d\xfd\xd3\xca\xd1\x82\x78\x74\x93\x92\xcc\x9d\x85\xf6\xdb\xb7\x2f\xe6\x28\x20\x7e\x94\xb9\x7d\x74\xeb\xa5\x99\xdb\x13\x46\xb8\x1c\x38\xbe\xe8\x49\xb4\x77\x72\xed\xa5\x16\xea\xa1\x02\x09\xf6\x91\x40\x70\x73\x34\xeb\x20\x83\xfe\x32\x0b\xcd\x91\x49\x99\x21\x8b\xbd\xe8\x21\xdd\x72\xb9\xad\x97\x49\x6a\xc9\x7f\xdf\xa8\x66\xeb\xfb\x16\xad\x54\x9f\xd4\x1d\x6a\x0c\xcc\x7c\x3f\x47\xb3\x3e\x2a\xdf\x57\xf3\x39\xa2\x64\xb5\x8e\x76\x6d\x73\xd5\x35\xc4\x2e\x1d\x07\x45\xa8\x8b\xba\x92\x6a\xe4\x14\x0c\xbb\x9d\x3a\xf2\x45\x07\x75\x0b\x72\x62\x81\x7a\x68\xac\xae\xa7\x5e\xf9\x56\xe2\x0d\x1a\x17\x03\x15\xc4\x61\xdd\xbd\x21\xc1\x42\xf7\x50\x9a\x5d\xa3\xa8\x80\x16\xd2\x08\x83\xed\xfe\x20\x4c\x09\xcf\xad\x98\xb9\xb3\xd4\x7e\x33\x40\xa9\xbd\xfa\x80\x52\x3b\xbb\x41\xa9\xfd\xd3\x4b\x94\xda\xf1\x78\x8e\x78\xee\xc3\xcc\x9d\xfd\xad\xd8\xb0\xb3\xf7\xf1\x8d\xcc\x65\x78\xf2\xd7\xe7\x6f\x7e\xf8\xf1\xaf\xf3\x87\x75\x92\x85\xdc\x7d\x26\x25\x11\x3f\xb0\x93\xbb\x30\xa0\x4b\xb7\xe3\x38\x7f\x9d\x2c\xf9\x71\x15\xbf\xd7\x5e\x10\x08\x1b\xdd\xb5\x3b\x58\x7f\xd4\xcf\xd7\x1c\x6b\xf0\x57\xc9\x2d\x49\x17\x51\x72\x77\x72\xef\x7a\x1b\x9a\x4c\x16\x49\x4c\x4f\x16\xde\x2a\x8c\xee\x5d\xeb\xfb\x8d\x1f\x06\x5e\xe3\x79\x12\x67\x09\xdb\xc0\x3f\x24\xb1\xe7\x27\x68\x95\xc4\x49\xb6\xf6\x7c\x82\x32\x2f\xce\x4e\x32\x92\x86\x8b\x5c\x5f\x01\x75\x23\x3e\xb9\x23\xd7\x1f\x42\x7a\x22\xca\xb0\xa1\x77\x87\xce\x2a\x6b\x2c\xbc\x80\x84\xf1\xa4\xfe\x75\xfe\x77\x55\xed\x03\xb9\xe7\x79\x22\xd5\x17\x1e\x79\xed\x21\x59\x7b\x7e\x48\xef\x5d\x67\x42\x53\x2f\xce\x16\x49\xba\x72\xf9\x2f\xb6\x7b\x7e\x01\x27\x1d\x67\xfd\x11\xe6\x34\xd1\x05\x3b\xf5\x05\x1d\x98\xe7\x7f\xff\xf3\xbb\xb0\xf5\xc9\xa9\x5d\x53\xb1\x34\x7c\x4d\xf8\x1a\xdc\x89\x75\x1c\x3a\x4e\x6e\xb3\x7b\x59\x6c\xb8\xc3\x8d\x5c\x27\x69\x40\x52\xb5\xbc\x9d\xf5\xc7\x46\x96\x44\x61\xd0\xf8\x4b\xcf\x67\xff\x4f\xae\x3d\xff\xc3\x4d\x9a\x6c\xe2\xc0\xfd\x4b\x67\xc1\xfe\xcf\xed\x88\x75\xf3\x87\x1a\xf7\xce\x3c\xdf\x0b\x4a\x8d\x07\xd7\xc1\x82\x38\xb9\xad\x28\xba\xba\xf6\x64\x8a\x4f\xf7\x3a\x4a\xfc\x0f\x93\x95\x97\xde\x84\xf1\x49\x44\x16\xd4\x1d\x2a\x18\x30\x9e\xdd\xb5\xcf\x06\x64\x25\x9a\x8a\xc2\x8c\xd6\x35\x25\x2a\xbb\x8e\xb9\xf9\x4b\x33\xab\xab\xe4\x27\x51\x92\xba\x7f\xe9\x76\xd8\xff\xa5\xd1\x13\x7f\xe1\x2c\x3a\x8f\x35\xd0\x68\x34\xc4\xfc\xe2\x45\x72\xa8\xfd\xf1\x99\x73\x3d\x3e\xb6\x31\x92\xd6\xc2\x5e\xb6\xe5\x3b\xbd\x71\xf7\xfa\xd8\xb6\xb2\x0d\xcf\x7c\x78\x68\x6c\x23\x8f\x0c\x9d\x63\xdb\xbb\xf3\xd2\xf8\x40\x63\x8b\xde\xd8\xef\x74\xcd\xcd\x7a\xa0\xb0\x00\x71\x09\xea\x62\x21\x1e\xa9\x7f\x24\xd0\x7b\xfd\xf1\x59\x70\x7d\x64\x5b\x87\x61\x4e\x46\x7d\xbf\xe7\x1f\xd9\xd4\x11\x20\x27\xbe\x3f\x3a\x76\x96\x8f\x41\xbc\xe3\xf7\x9d\x45\xfe\xb7\x39\xf2\x39\x71\xfd\x82\x50\xc2\x6f\x4c\xd7\xc9\x21\xba\x2d\x85\x3a\x55\x21\x49\xde\x03\x83\x49\x30\x78\x84\xbc\x48\xb3\x53\x47\xe0\xd1\x12\x81\x47\xb7\x5b\xc2\xc5\x67\xa2\xe4\x2a\x09\x18\x2b\x77\xf1\x95\x24\xe9\x08\x4f\x2f\x2e\xbe\x85\xf1\x7f\x70\x68\xfb\xdf\x5e\x82\x87\x70\xc5\xb5\xbe\xee\x6c\x96\xda\xe4\xf7\xf9\x3c\x17\x04\x25\x37\x03\xaf\xb1\xac\xaf\x93\x50\xfd\x4f\x8d\x28\xca\x33\x45\x51\xa3\xf1\x48\x19\xa6\x8f\x46\xe3\x11\x4f\xc7\x69\x52\xa9\xf7\xdc\x77\x4f\x9a\xed\x5d\x83\x18\x16\x1c\x6f\x91\x1c\x5c\x41\x42\x02\x27\x86\x08\xa4\x98\x1a\x32\x35\x68\xbf\xe7\x04\x37\x26\x28\x2d\xd8\x9d\x58\xb1\x3b\x22\xfa\xfb\x1e\x37\x2d\x4e\x71\xdf\x10\xc1\x56\x18\x14\xfd\xfb\x6c\x73\x9d\xf9\x69\x78\x4d\xf6\xb3\x48\x01\x78\x57\x8a\x48\x86\x4a\xb5\x84\xfb\x97\x1e\x65\x91\x96\xae\xc1\xb3\x46\x88\x8c\xc6\x01\x63\x8f\x62\xf2\x91\x0a\xf6\xea\xbd\x4c\x74\x4a\xf5\x38\xd4\xd0\x6a\x78\x0a\xa5\x5b\x59\x7a\x19\xd7\x01\x48\x9d\x80\xe4\x20\xd3\xe4\x2e\x16\x09\x9f\x54\x39\xd1\xa1\xa1\x39\x08\xed\xd7\x13\x13\x0c\xa2\xf7\x82\x29\x22\x1f\x77\x39\x21\xee\x1e\x59\x9d\xb6\x28\x59\x9d\xb0\xd1\x26\x26\x90\x73\x2c\x71\x0e\x52\xfb\xe3\x3f\x61\x8e\x86\xa3\x41\x4d\x14\xee\xba\x4d\x76\x5f\xb3\x6a\x1b\xbd\xc9\xe4\xde\xea\xa9\xf4\x06\xdd\x71\xe7\xac\xa3\x12\x73\xf5\xc7\x8e\x0c\xa6\x37\xe4\x61\xad\xb9\xeb\x4c\xbf\x7f\x26\x03\x68\x9e\x75\xfb\x22\x44\x72\x45\x8b\xab\xf7\x20\x65\x4f\xdf\x28\x37\x5b\x39\xa1\x30\xbb\xf4\xbd\xc8\x4b\x79\x78\x63\xc5\x17\x17\x0b\xcf\xa6\xaa\xf7\x20\x55\x7b\x30\x0a\x17\xb5\xb0\x14\x8c\x2e\x5b\x0c\x9d\x15\x3c\xb6\x45\xca\x21\x2c\x76\xbb\x9d\xac\x85\x3f\x12\x26\x28\x2e\x18\xce\xfd\xbb\xd3\x34\xa6\xe5\x63\x53\x0d\x94\x2c\x2a\x74\x86\x5f\xe1\xeb\x43\x4c\x05\x43\x68\x7f\x5f\x24\x6e\x60\x1f\x67\x9e\x7d\x3d\xd7\xaf\xf8\x13\xd0\xb3\x24\xdb\x2d\xdd\x6e\xe3\xa9\xd8\x51\xdf\xcb\xa6\x5d\xf5\x18\xd9\x3e\xcc\xe5\x4b\xd6\x58\x62\x7b\x41\x00\xd2\x69\x2a\x76\x4a\x22\xa0\x2a\xa6\x2c\x35\x40\xe2\x61\xbb\xf5\xed\x5b\x7b\x93\x91\x17\x64\x9d\x12\x9f\xd1\xb2\x97\xf7\xb1\xbf\x4c\x93\x38\xd9\x88\x1d\xff\x8d\x17\x07\x51\x18\xdf\xb4\x5a\xcd\xc4\xce\xee\x63\x9f\xbf\x7d\xcb\x36\x38\xf7\x2d\xaf\x2c\x0d\x48\x64\x07\xef\x69\x7a\x7f\x69\xbc\x85\xe8\x09\x5d\xd5\xf5\xd4\x6a\x81\xba\xd7\x6c\x8b\x54\xdf\xc7\x4a\x77\x67\x7c\xe0\x27\x5c\xad\x7f\x52\xe0\x20\x73\x98\x75\xbb\xc7\x4c\x80\x50\x99\x2a\x31\x72\xc4\x3f\x61\x72\x80\x54\x87\x2b\x52\xa5\x97\x87\x8a\x69\xd9\x9b\x94\xc7\x35\x23\x13\x6d\xde\xcf\xe3\x8d\x08\x74\x83\x18\xaa\x0e\x48\x46\xc3\x98\xb3\x14\xc8\xc3\xd4\x0e\xb3\x4b\x9a\xac\xd7\x24\xe0\xfe\xe6\xdb\xad\x57\x84\xfb\x26\x38\x6d\xb5\xd2\xca\x6e\x9c\xa6\x22\x19\xac\x8a\xf7\x97\x03\x02\xa7\xc4\x26\x5c\xf3\x49\xa1\xeb\x0b\x8e\xc8\x66\x17\x34\xcf\xed\xa2\x20\x28\xb5\x48\x75\x87\x44\x8b\x40\x97\xa1\xce\xc2\xc7\x2f\x53\x1c\x00\x0a\x8d\x58\xd3\x14\x49\xe7\x97\x70\x12\xe2\xd8\x2e\x40\x6c\xde\xc6\x6c\x25\x08\x30\xf3\x39\xa7\x3c\x5b\x76\xab\x15\xda\x9b\xb8\xa8\xc3\x2e\x98\x14\x51\x53\xf6\x74\xcc\x4d\x63\x1c\x0b\xe3\x12\xa1\x76\x69\xbd\x65\x83\x64\xf7\xa6\x30\xf6\x88\xee\x76\x1d\xae\xeb\x2e\x95\x22\xa7\x7e\xd5\x27\x1d\x09\x85\xa4\x88\x64\x4d\x54\xc8\x72\x32\x89\xdb\x6d\x48\x67\xf1\xdc\xf0\x54\x8f\xb5\x6b\x3d\x77\xdb\x55\xd1\x65\x58\xff\x75\x21\x67\x79\xc0\x3f\x55\x28\xb3\xef\xdd\x8e\xf9\x82\xcc\x9c\xb9\x5b\x43\xf9\x10\x5b\x84\x74\xdd\x13\x23\x91\x5b\xc4\xb1\xbd\x00\x28\x94\xaa\x37\x35\x75\x9a\xfc\x98\x26\xab\x30\x7b\x04\xe0\xe6\xae\x20\x38\x00\xc4\xdc\x15\x44\x23\xd9\x09\xad\xdb\x13\x86\xbd\x1e\x26\x79\x9d\xef\x7a\xcc\x47\xb8\xbb\x4a\x04\xa4\x52\x38\x39\x67\x84\x00\x48\xec\xef\x21\x4a\x6d\xe1\x21\xbd\x47\xc6\xd7\x48\x79\x63\xa9\x41\x3f\x05\x0a\xb3\x6f\xb7\x80\x60\x86\x02\xe4\xa4\xb7\x5b\xf9\x03\xa2\x66\x8d\xf5\x49\x9c\x34\xe4\xf7\x46\xb8\x5a\x47\x8d\x05\x63\x07\xac\x72\x72\x7f\x76\xb1\x1e\x75\x77\xfb\x8f\x11\x88\xf2\x0a\x0e\xc5\xc5\xdc\xe7\xba\xca\x07\x81\x39\xdc\xa6\x83\x18\x61\x51\x5a\x9d\x1c\xf1\x43\x5f\x75\x55\x4d\x8f\xc5\x70\x72\xbe\x64\x02\x1c\x14\xda\xbf\x43\x0e\x36\x3f\x59\xad\x23\x42\x4b\xe7\x20\xe7\x19\x94\x6b\x12\x4f\xd7\x4d\xb3\x8e\xb0\x5c\xed\xa1\x83\x7b\xc3\xbe\xf4\xef\x26\x77\xe0\x68\x5a\x58\x37\x5b\x10\xc1\xd4\xf6\xd6\xeb\xe8\x5e\x3c\x17\x61\xed\x0c\x02\x18\xe6\x80\x91\x3e\x1d\xa7\x0b\xed\x5b\x08\x8f\xef\x8d\x14\x28\x6f\x97\xf6\x0e\x4d\xda\x1b\xf1\xc8\x20\x76\xe6\x2f\x49\xb0\x89\x08\x23\x52\x42\xfb\x2e\x49\x3f\xe0\x14\x85\x35\xb4\xb8\x2a\xb8\xff\xe4\xed\x86\xf1\xaa\x0d\x86\xd1\x99\x97\xa3\x7b\xe9\x80\xef\xf4\x99\x33\xdd\xa5\x50\x8b\x7e\x77\xc8\x72\x44\xa1\x2b\x88\xb8\x80\x44\xde\xbd\xd2\xc9\x64\x94\x1d\x37\x69\x89\xa2\xe7\x67\x2f\xa2\x4d\xb6\x54\x91\xcc\x4b\x58\x85\x7c\x24\xfe\x86\xd6\x12\x64\x05\x56\x7a\xe6\x6c\xb7\x06\x31\x5e\x33\x52\xdd\x4c\xed\x40\xc5\x35\x2f\xcb\xa8\x6c\x55\xa2\xff\x94\xfc\xb6\x21\x19\xbd\xe0\xd1\xb6\x82\xfd\x57\xde\x6e\xd6\x8a\x67\xdd\x5a\x10\x77\x4d\x10\x77\x0d\x10\xb3\xbb\xb8\x89\xf9\x45\xcd\xe6\x23\xe3\x2f\xa7\x52\x9f\xc3\xa1\x58\xbb\x08\xd5\x11\xd6\xcc\x10\xa5\xd0\x25\x26\x90\x15\xdb\x10\xda\x8c\x4c\xe3\x0e\xf1\x83\x9e\xf0\x48\xd4\x74\x3f\x27\xeb\xc7\x1d\xf6\xd3\x97\x11\xb4\x46\x32\x48\xb6\xd3\x75\x78\xe0\xe3\x3d\x5a\x39\x11\xc5\xa8\xa2\x99\xfb\x10\xc6\x81\xda\x05\x82\x7b\x11\x19\xfc\x04\xbd\x81\x53\xa4\xb8\x2e\x41\x0b\x59\xaf\x79\x6e\xe8\x1a\x3d\x9b\x70\x10\xae\xdd\xeb\xca\xf0\x57\xf5\x27\x2c\x7f\xad\xd7\x96\xab\x6f\x37\x86\xfb\xca\xdc\xa1\x60\x0e\xb9\x5d\xac\xf5\xb5\x51\x92\x8f\x8b\x9b\xc3\x0b\x82\x48\x8f\x55\x96\x7d\x6e\x94\x55\xb8\x8e\x15\x57\xbf\x81\x41\x31\x05\xc9\x3e\x8e\xe2\xf1\x21\xf3\x40\x50\xfb\x07\xca\x28\x96\x43\x83\x8b\x5b\xad\xd8\x1c\x8a\xe7\xfb\x64\x5d\xc3\x35\x21\x33\x68\x2f\x69\xb5\x2c\xf5\xa9\x30\xb6\x12\x50\x13\xf4\xbf\x5c\x05\xa0\xb8\x8b\x20\x91\x4d\x18\xf4\xc0\x9b\xc2\x95\x7b\x97\x24\x7a\x6c\xe2\xc0\x41\xbe\x9d\x2c\xe0\x81\xb9\x03\x07\x6d\xec\xf7\xf0\xc0\xec\x81\x83\x32\xdb\x87\x00\xe6\x3b\x37\xf2\x26\x26\x1f\xd7\xc4\xa7\x24\x68\xc4\x09\x0d\x17\xa1\xcf\x29\xe9\x06\x1b\x4b\x91\xf3\x7b\xae\x76\x9d\x20\x14\x5e\xd7\x31\xef\xd5\x98\x2a\x3c\x87\x8e\xb0\xd1\xb2\x5e\x5b\x0c\xbf\x10\x7b\x13\x8b\x08\x2a\x01\xdf\xdd\xaf\x8d\x0e\x35\xbc\x44\x0f\x7c\x74\x07\xba\x90\xed\x7e\x6d\x21\x15\xa5\x08\x56\x5a\x78\x2e\xf7\x5f\x0d\xcc\x77\xf6\x6b\x79\x20\x52\xf9\x39\x59\xd6\x7e\xe7\x74\xea\x12\x58\xcf\x2d\x88\x96\x07\x26\xa4\xca\xbd\x56\x43\x14\xf7\xe1\xfa\x09\x22\x2a\x7d\x51\x22\xef\x0f\xa3\xd5\xfd\x77\x6c\xe9\x86\x4d\x51\x28\x6f\x2a\xef\xe0\x15\xfb\x83\xb0\x92\xa8\xe5\x1b\x05\x9e\xd6\x4c\x19\x67\xc9\x2b\x17\x9d\xfa\x05\x62\x3b\x08\xb3\x35\x63\x6b\x50\x81\xdf\xb9\x65\x1f\x37\x4a\xa9\x34\x05\xa1\xc1\xd9\xec\x93\x20\x95\xba\x92\xe3\x04\x4b\xbb\xd8\xb9\x32\xbd\xa5\x6c\x86\xd4\xee\xb4\xc7\xda\x11\xa7\x87\x40\x89\xd5\xab\x5c\x98\x6c\xdb\xdf\xbf\x07\x0f\xb6\xfe\x5c\xe3\xce\xfa\xf6\xf5\x71\x54\xc0\xdb\x4f\xf1\x10\xdb\x3c\xd6\x3c\x29\x8a\x01\xd0\x09\xd5\x18\x2c\xde\xd3\x15\xbf\x20\x39\x9b\xb0\x28\x0b\x94\x39\xa2\xac\xdc\x6e\x66\x5f\xea\x96\x33\xba\xc3\x71\x2e\xa2\x5e\x4a\x79\xed\x0d\xfb\x79\xc6\xa3\xdd\xac\x8e\x3f\x17\xca\x51\xa8\x86\xd6\x70\xf6\xc5\x36\x33\x1f\xdc\xd7\x3c\x25\xa7\xfd\xe3\x9b\xcb\x57\x6f\x5f\xbd\xfb\xfa\xfd\xab\xd7\x2f\x5f\xbd\x7e\xf5\xf6\x17\x14\x7e\x2a\x81\xb8\xb7\xc5\xba\x83\x5b\x3e\xa1\xe5\x8c\x42\xc6\x31\x25\x15\x31\x74\x71\x48\x3d\x44\xec\xf7\xe4\x96\xa7\x94\x99\xcd\xd9\x43\x18\x2f\xc2\x38\xa4\xe4\x6d\xb8\x22\xff\x0a\xe3\x20\xb9\x13\xf9\xd1\xde\x5f\x6f\x16\x0b\x92\x5e\x86\xbf\x13\x9c\x9e\x77\xa6\x1d\x37\x65\x6f\xef\x78\x11\x56\x18\x87\xfc\x6d\x88\x42\x8c\xf1\xbe\x59\x4c\xc1\x9e\x2e\x1c\x24\x8d\x75\xc5\x3f\xaf\x76\x8a\x30\x9c\x6f\x14\x28\x3e\x20\x52\x83\x5c\xea\xdb\x78\x44\x70\x21\x01\x31\x91\x5e\x52\x6c\x27\x2a\x48\x8b\xef\x05\x08\xb8\x50\x63\x19\x2e\x28\x80\xe8\x58\x39\x33\x81\x25\x91\xf5\xe1\x61\x99\x03\x92\xa6\x43\xe4\xae\xf1\x5c\x4a\x71\x6f\x08\x7d\x9d\xdc\x01\x88\x34\xda\x78\x4f\xd3\x70\xf5\x15\x1f\xdf\xdb\x25\x89\xff\x41\xe8\xd7\xbc\xee\xa7\x8d\xef\x08\x59\x0f\x8a\x25\xd0\x76\x57\x13\xa5\x38\x9e\x9a\x13\x70\x1f\x1b\x62\x88\xcb\x58\x9d\xe7\xcd\x94\xee\x3c\x7b\xd5\x02\xb7\xf6\x6b\xfd\x51\x4b\xea\x24\xdb\xa2\x74\x0d\x53\x8a\x23\xfb\xce\xfe\xfa\x87\x1f\xdf\xfe\x22\xb9\x27\x89\xa5\xd2\xac\x58\x65\x7e\xc1\xde\xd8\xff\xd2\xd7\x18\x0a\x19\xdd\xc9\x6e\x1b\xc2\xbf\xad\x01\x41\x21\x84\x28\x86\x4a\xee\x94\x60\x67\x92\x9c\x7b\xad\x56\x93\xc8\x91\x4d\x92\x76\x1b\x4a\x32\x38\x9d\x25\x2a\x11\x9e\xaa\x90\x61\x67\x92\x95\x2b\x64\x66\x85\x6c\xae\x48\x32\x53\x52\xaa\xe7\x51\x22\x9a\x0d\xad\x89\x24\x16\xf5\xfc\xcb\xf4\xb2\xa1\xa0\x91\x7b\x66\x2f\x0d\x53\xb9\x57\xb7\x5b\x0f\xda\x31\xdb\x63\xa6\x98\xb7\x76\xfd\x0e\x4a\xe7\x2a\xfb\x55\x9d\xb4\xe2\x24\xe9\x7d\x54\x60\x12\x94\x96\xce\x23\x0a\xf5\x66\x40\x1e\x76\x26\xde\x79\xd8\x6a\x35\x01\x39\x49\x67\xde\x9c\x9b\x3d\x9e\xc7\x70\x02\x3d\x9d\x93\xab\x11\x3e\xa3\xad\x16\xf0\x74\xb6\x20\xe0\xa1\xf0\x84\x42\x88\x3c\x86\xd6\x53\xee\xc7\xe0\x13\xe0\x20\x0f\xa2\xb4\xa4\xf0\x41\xcf\x1f\xbf\x99\x58\x8f\x15\xbe\x8b\x27\xc5\x18\x8f\x86\xc7\xa9\x23\x7f\xa9\x13\x37\x6d\x72\xf4\xf1\x9f\x35\xef\x97\x65\x15\x12\xd7\x47\xc9\xe0\x6b\x82\xab\xdc\xe1\x35\xf9\x7d\x98\x15\xf7\xa1\x5f\xa8\x9b\x36\x9f\x5f\xab\xc9\xa9\x3e\xf3\x62\x2e\x2b\x37\x61\x0e\x3c\x76\xe3\x2f\x31\x28\x69\xaf\x18\x97\x7f\x0f\x52\x9d\x35\x05\x5f\x03\x53\x2a\x98\xaa\xab\xb9\xd2\x7d\xca\x6f\xb3\xb8\x74\x9b\xe9\x03\x2d\x6e\x30\x71\xb8\xc4\xa5\xa5\x8f\x85\x78\x54\xa7\x49\x3c\x19\xa7\x08\xf3\xcc\x0a\xc6\x45\x92\xca\x8b\x84\xee\x25\xf9\x19\x5a\xd8\x54\x04\xb6\x87\xb4\x67\x54\x22\x12\xad\x72\x2c\x0e\xba\xa9\x3a\xa3\x8f\xaa\x35\xf7\xe2\xc3\x44\xe0\xc3\x66\x19\x21\x68\x8c\x25\x8f\x9e\x86\x16\x57\x7e\xc8\x63\xc5\x56\x94\xa7\xca\xe2\xb8\xd8\x99\x84\xe7\xf1\x24\x6c\xb7\x61\x3a\x0b\xe7\x02\x41\x19\x97\xc3\x5e\x32\xf7\xe0\xc8\x4a\xe8\x4c\x5b\x08\x9b\x6b\x20\x89\x74\x63\xcd\x9c\xc9\x1f\x1e\x3c\x91\xd4\xf5\xa4\x82\xfb\x65\xee\x2b\xa7\x60\xf5\xf6\x13\xd8\x8f\xcf\xab\x76\xcc\xa4\x3a\x66\x5a\xc4\xa5\x67\xc4\xb3\x1a\xb3\x48\xc1\x43\x79\x76\xa0\x78\x96\xce\x0d\xfc\xfd\xe8\xa8\x0d\x12\x7b\x1f\x67\x60\x8e\x0d\x19\xf3\xd0\x8f\xc5\xf9\xe1\xca\xab\xa3\xb5\x7a\x07\xc1\x22\xf7\x36\xa3\x3d\xd2\xb2\xe9\x41\xb9\xd9\x4f\x26\x42\x8e\xe9\xbd\x7c\x85\x82\xbd\x77\x28\xd2\x34\x42\xf5\x3a\x65\x95\x8c\xeb\xd4\x28\xb7\x8f\x98\x60\x43\xc8\x0c\x52\xa2\x10\x13\x65\x07\xa5\x37\x62\xc7\x08\x6d\xf4\x7d\x61\x54\x63\xea\xd8\x09\xbf\xaa\xd2\x1c\x84\xf6\x3d\xf2\xed\x6b\x08\x77\xb5\x2d\xa8\x2c\xd8\x58\x0b\xd9\x2b\x0f\x79\xfe\x29\xe2\x82\xc7\x78\xfe\x1d\xdc\x1f\xaa\x11\xd7\xcb\xd5\xf7\x21\x35\xe3\x8c\x97\x78\x4a\x46\x67\x0b\x01\x23\x3d\x1e\x0f\x1d\x6a\x4c\xca\x20\x77\x24\x0b\x0a\x4f\x1c\x83\x0f\x8c\xc3\x6d\xb6\x5f\x92\x55\xd6\x74\x61\x8a\x31\x8f\xda\xe2\xe6\x2e\x16\x50\x9d\x1a\xbf\x4b\x4a\x55\x57\xef\x4c\x45\xce\x2c\x19\x49\x72\xf6\x68\x02\x0b\x49\x92\xfc\xab\xe6\x86\x4b\x0b\xcd\xd0\x9f\xb3\x73\xb2\x0d\xf7\x7b\x11\xbb\x46\x4d\x46\x08\x8e\x8a\x4b\xbc\x6e\x17\x1d\xc6\x7a\xfa\x0e\x94\xa8\xe1\xa1\x8c\xf4\x26\xc6\xf2\xc9\x11\x70\xcc\xac\x8f\xb2\x66\x2a\xd4\xf8\x38\x71\xa0\x3c\xbb\x75\xe4\xf3\x26\x31\xa9\x6e\x4d\xd5\x17\x2e\x4b\xca\x87\x56\xb5\x25\xe7\x07\x27\x27\x9d\x26\xc6\x31\x67\x21\x05\x21\x1a\xa3\x0e\xcc\x73\xb5\x72\x8a\x9c\xb3\xef\x78\x8a\xe8\xde\x78\x37\xb4\x64\xdd\x12\x7e\x5f\xb3\x84\xbe\xa9\xdc\x1b\x8e\x3b\x8e\x54\xee\x49\x93\x23\xaf\x20\x1d\xa3\x82\x48\x4c\x0a\x7d\x67\x56\xe8\x3b\xfd\xa7\x10\x6f\x6c\x98\x9e\x80\x44\xa4\x82\x87\x18\x14\x5c\x54\xa1\xe0\x2a\x56\x1b\x1c\xde\xd1\xae\x81\x47\x67\xe7\xa5\x32\x5e\x89\xca\x94\x5e\x55\x50\x22\xe3\x95\x38\x6e\x54\xc2\x56\xa1\xed\x9b\x49\x11\x79\x38\x93\x26\x81\x0f\x7b\x4a\xe5\xe1\x02\x58\x89\x88\xbc\x5d\x48\xf0\xe1\x43\xc9\x26\x29\x9d\x82\xda\x41\x56\xed\x55\xd8\x4b\x14\x55\x90\xa7\x60\x39\x2f\x40\x04\x21\x74\xeb\xdb\x69\x3a\x95\x5a\x82\x0e\x65\x75\xd8\x6d\x23\x47\xaa\x02\x83\x3c\xbd\x09\xbe\x70\xea\xc8\x45\x4f\x21\x88\xa9\x69\xb5\x71\x50\xa2\x5a\x65\xd6\xdf\x1f\x8d\xd9\xab\xd5\xc1\x1e\x0a\xe7\xbd\x42\xe7\x47\xe1\xf3\xa3\x5b\x2d\x30\x38\x7c\x0a\x05\x26\x10\x43\x6d\xbb\xbb\xf4\x51\xa9\xbd\x0a\x75\x74\xb4\xcc\xda\xbc\x76\xaa\xc0\x7d\x44\x4c\x5d\x77\x29\xfe\x21\xc9\x74\xfd\x15\x78\xb0\x49\xe3\xf5\x45\x1c\xfc\x44\xfc\x7b\xff\x00\xcd\x24\xd6\x66\xed\xa5\x24\xa6\x6f\xd2\x1f\xf9\xbf\x59\xd9\x60\xb4\xf2\x51\x62\xf4\x9d\x11\x94\xc9\xe3\xce\x0e\x3f\x22\xdf\xec\x34\x27\x38\x97\x1d\xdd\xd6\x21\x9b\xc7\x10\x4b\x73\x18\x61\x70\xa8\x04\x17\x7b\xf0\x5b\xa8\x28\x3f\xcf\xbe\x43\x91\x7d\xfd\x34\x4e\x5e\x44\xc0\x12\xfd\x66\x13\xe3\x42\xce\xaa\xe6\xc9\x62\x62\x97\xc5\x5d\x4c\x78\x9b\x3e\xda\xe0\x0b\xa0\x39\x56\xe0\xa0\xd4\x5e\x41\xe0\xc1\xa9\x8f\x3d\xd7\x6b\xb5\x80\x8f\x3d\xbe\xd1\x50\x84\x3d\xb1\x6d\x50\x82\x3d\xbd\xde\xc8\x6b\x62\x86\x48\x5b\x2d\xb0\x91\x99\x95\x24\xe9\x0a\x3c\x88\x54\x7b\x1b\x73\x35\x60\xab\x95\x71\x74\x58\x7a\x6b\x5f\x87\x71\x00\x36\x10\xa2\xd2\x6b\x9c\xed\x16\x62\x03\x86\x10\x22\x7e\x6e\x63\x4a\x3e\x52\xbc\x41\x12\xd9\x60\x1f\x29\x24\x81\x23\x64\x9c\x6c\x9c\xa0\xec\x09\x64\xeb\x2e\xbb\x2d\xe9\x3e\xde\x4b\x59\xb8\x5c\x85\xed\x24\x39\xde\xdc\x91\xee\xb7\x1a\x65\xfc\xd4\x9b\xf4\x92\x50\xa1\x47\x92\x72\x29\xde\x3f\xd2\xc1\x36\x4a\xbb\xdc\x35\x2b\xfe\xcc\xbe\x80\x52\x9d\xfc\x28\x4e\xbf\x2a\x66\x38\x38\x57\x14\xe3\xa3\x67\xab\xc9\x2f\xb1\x3e\x30\xde\x33\x7d\x70\x70\xfe\x62\x0f\xd6\xa2\x2e\xc5\xbb\xd5\x40\xe0\x50\x2d\x21\xce\x65\x83\xab\x19\x0d\x8c\xa7\xe6\xfb\x77\xd2\xcc\xbf\x5a\x34\xc6\x3c\x61\x9d\x83\x32\x61\xd3\x55\xd3\x8f\x0e\x25\x55\x83\x9e\x62\xd3\x2c\x4c\x36\x91\xe7\x4f\x63\x59\xea\x44\x44\x87\xf7\xa9\x5e\x0f\xd5\xbe\x4e\xc8\x54\xa3\x07\xd7\x85\x04\x62\x21\xfa\xf0\xc1\xfc\x0f\x6f\xf8\x7d\x2b\x5e\xab\x6f\xac\x5d\xe5\xfa\x92\x3c\x7c\x53\xa3\xee\x42\xd2\x37\x92\xd1\x48\xbd\xc5\x12\x37\xac\x2d\x90\xa9\x9e\x36\x32\x6d\x6d\xeb\x57\xf5\x68\xb0\x28\x21\x87\x5e\xfd\x78\x77\x88\x0a\x2c\xfb\xee\x1e\xb6\xfa\x4f\xee\xb0\xb0\xf1\xb8\xf6\x82\x06\x9b\xa4\x05\x27\x3c\x9c\x54\xdd\x8c\x63\x35\xe3\x54\xef\x8b\xa3\x7b\x9c\x82\x1d\x1b\xee\x14\xd5\xda\x7a\xf3\x83\xa4\x00\x91\x42\x9e\xab\x56\x59\x67\xd7\x52\x12\x47\xd1\x0f\xc6\xb6\x2f\x4d\xca\xa0\x18\x76\x2f\x49\x21\x3c\xae\x57\x77\xfb\x3c\x5d\x76\xaf\x26\xda\x7f\x1d\x0f\x77\x57\x43\x57\x67\x65\x05\xc0\x60\x3c\x1a\x0f\x65\xe2\x8c\xce\x60\x30\x90\x09\x13\x04\x6f\x97\xec\x0b\xf0\xa6\x5b\xe3\x50\x34\x2e\x7d\x19\xd8\x48\x58\x0d\x60\x32\x2d\xc2\x92\x6a\x59\xa5\xd5\xe0\x68\x31\x6b\x24\x3e\x8f\x6d\x10\x34\x82\x0d\xcf\x17\xaa\x27\x2c\xb2\xf2\xf1\xe0\xb4\xba\xf2\xca\x5b\xd7\x5a\x3c\x17\x1d\xd0\x76\x07\x59\xb0\x61\x56\x52\x11\x8e\xd8\xa1\x84\x32\xc8\xe6\x55\xdc\x68\x58\x10\xba\x96\x8c\x19\x11\x7b\x2b\x82\xad\x9f\x4b\x7d\xcb\x2d\x4f\xb5\xd9\x92\xa6\xc9\x76\xa3\x61\x55\xe8\x0f\x01\x10\x83\x02\xe7\xe1\x92\xb2\xa3\xe3\x63\x54\xa8\xc5\x03\xa4\xe6\x7b\x73\xc4\x99\x96\x2a\xa8\xd3\x43\x93\xf4\x67\x83\xa2\xd1\x4c\x87\x49\xe6\x50\x58\x63\xbe\xf7\xf8\x1e\xa7\x93\x1d\x99\x48\xe1\x54\xb0\x33\x64\xad\x7e\xab\x0c\x09\x65\x78\x67\x44\x68\x83\x6b\xe6\x56\xd1\xd9\x16\x73\x79\x1a\x70\xe2\x52\x34\x31\x18\xdb\x29\x59\x25\xb7\x44\xe6\xe3\x57\xd7\xb1\xb4\xf2\x2c\x54\xb3\x01\x76\x26\xc1\xb9\xca\x15\x3b\x69\xb7\x03\x18\xcf\x82\x79\xb9\x76\xb8\x60\xc8\x23\x62\x64\x67\x06\xe1\x43\xaa\xd7\xc1\x04\xb7\xb2\xb6\x62\xa8\x2e\x33\x83\x63\x09\xfc\x16\xc0\x07\x8a\x03\x73\x90\xc9\xd4\x07\x81\xdc\x81\xd0\x9d\x05\x73\x1e\xd9\x91\xdb\x70\x7f\x80\x8c\x6c\x55\x63\x5c\xe2\x93\x0e\x5a\xe3\x4d\x31\xc8\xe5\xf9\x5a\x3a\xa6\x2c\xf0\x66\xb6\x9c\xcb\x11\x7a\xf6\x77\x10\x2c\x20\x64\x43\x58\x54\x50\x8c\x18\xc5\x2d\x1b\x05\xdd\x6e\x67\x73\x74\x5b\x1e\x0b\xc5\x54\x1d\x2d\x1f\xdc\xaa\x61\x41\x57\xda\x37\xdc\x42\x3e\x3a\x33\x56\x61\x52\xf2\x4a\xf1\x82\x5d\xf3\xdc\xc2\x1f\x45\xec\x29\xed\x6d\x25\xa4\x8f\x3a\x52\xac\x0c\x26\x27\x6d\x10\xb5\xe5\xa3\x1b\xeb\x68\x71\xc2\xb0\x50\xca\x53\x5c\xb6\x90\x18\xf3\xcd\xb4\xdd\xc6\x9a\x65\x2e\x6a\xea\x48\x94\x71\x89\x4b\x50\xb2\xee\xaa\x99\x80\x76\x52\xab\x50\x50\x7c\xd4\xa0\xb2\xb3\x74\x4e\x87\x09\x90\xe3\x83\xd5\x0d\x39\x4b\xe7\xb9\x90\x15\xed\x0d\xba\xba\x89\x53\xe2\x27\x37\x71\xf8\x3b\x09\x1a\x94\x78\x69\x90\xdc\xc5\x0d\xab\x4d\xdb\x56\xc3\x0b\x02\xf6\x32\x69\x5c\x1a\xad\xda\x16\xcc\x25\x2f\xb8\xcb\xbf\xca\x9d\x8d\x31\x0e\xe1\xee\x67\x19\xf6\x46\x1e\x81\xb0\x3c\x1d\x76\xc9\x87\x12\x98\x05\x80\x6a\x1a\x99\x85\xfc\xf0\xcd\x75\xfc\x4a\x2e\x99\x0c\x4b\x92\x4b\x68\x80\x58\xec\x1b\x71\x04\xd8\xc0\xbd\xda\xc3\x5f\x0a\xb1\x87\xbd\x69\xdd\xf9\x9e\xc5\x73\xd7\xd3\x21\x71\x62\xc3\x38\x9c\x9d\xd1\xc7\xec\x74\x76\x91\xcd\xae\xd4\x95\xec\x97\xb3\x2a\xab\x4c\x8d\xd7\xfd\x52\x4c\xdc\x43\xee\x3a\x44\x5f\x5e\x95\xa3\x26\x4f\x97\x4b\x61\x8e\x66\x73\x98\x67\xe2\x3c\x70\xad\x37\x57\x09\x41\x03\x19\xa6\x30\x47\x5c\xc2\x7a\x14\x51\x70\x5b\x43\x14\x84\x85\x60\xb7\xd9\x41\x21\x7e\x90\xbe\x30\x2a\xd3\x66\x46\x68\xe3\x28\x82\x4b\x79\xdf\x98\x4a\x6a\xe1\x8e\x5b\x72\x56\xb3\x5e\x7c\xfd\xe3\x4f\x5f\x3f\xbf\x78\xfb\xf5\x8b\x66\xe3\xa7\x8f\xdf\x5e\x36\xee\xbc\xac\xc1\x7a\xa1\x09\xeb\xa8\x11\xe8\x9e\x1a\x59\xd1\x95\xa0\x1c\x1a\x4b\xd9\x59\xe3\x9a\x2c\xbd\xdb\x30\x49\x1b\xd7\xf7\x0d\x3f\x09\x48\xc3\xa3\x6e\xe3\x2a\xb6\xda\xd4\xce\xa8\xe7\x7f\x90\xa4\x78\xda\x6a\xa9\xde\xa3\xe4\x06\x58\xac\x43\xb7\xf1\x95\xe7\x7f\x60\xdd\x79\x8d\x6b\x9e\xeb\x51\x36\xae\xda\xb4\x1b\x6f\x97\x5e\xfc\xa1\x71\x9f\x6c\xec\xc6\x79\xcf\x82\x13\xee\xd1\x74\x73\x34\x24\x4c\xc5\x47\x8e\xce\x06\xbd\xfe\x71\xe6\x1c\xaf\x7e\xa9\x59\xa0\x28\x47\x2f\xb2\x9a\xf7\x49\x8e\x16\x75\x6e\x38\x59\xc9\x0d\x47\x58\x76\x54\xec\x3d\xce\x46\xfd\x7e\x9f\x91\x7b\x9f\xdd\x86\x03\x42\x5b\xa0\x86\x3d\x9e\xe9\x87\x85\x8d\xa2\xaa\x30\xd8\xbc\x7f\xfd\x34\x69\x63\xa9\xee\xd7\x9f\x43\xdc\x58\x6a\xf1\xf9\x61\x79\xa3\x32\xfc\xf9\x1e\x56\xa2\xb8\x7f\x7e\x1f\x27\x2d\x49\xd2\x50\xfa\x24\xe1\xad\x01\xa8\x27\x49\x70\x2b\x0d\x1c\xb0\x68\x3f\xa8\xb6\x2c\x00\x56\x00\x24\xd3\x21\xff\x74\xb0\x00\x4d\x14\x94\xfd\x63\xef\xa7\xa6\xd2\x92\x72\x41\x88\x67\x67\x10\x10\xc8\xe9\x0e\x34\xe8\xf6\xfb\x8f\x64\x36\x38\xe0\xb0\x97\xe5\xe8\xf5\x41\x1d\x98\xf0\xc1\x17\x2e\x6e\x5e\x71\xb6\x2a\x06\x54\x83\x4e\xcf\x19\x95\x38\x80\xcf\xab\xf4\x14\xea\x71\xa9\xf3\x64\xc4\xcf\x4b\xcf\xe7\xb1\xea\x52\x14\xda\xef\x53\xb2\x78\x9e\x6c\x62\x8a\x19\xcd\xf8\x3e\xcc\xd4\x4a\xed\x53\x85\x1e\xaf\x41\xbe\x21\x8c\x67\x65\x1d\x02\x58\xeb\x90\x6b\x15\x25\x1e\xe1\x95\xe5\xc0\x95\x38\xb8\x49\xb6\x5b\x43\x19\x0a\xcd\x60\x03\x5c\x81\x6a\x6a\x53\xe5\x6c\xb5\x3d\xba\x2a\x64\x48\xb1\xe2\xf8\xf1\x21\xc8\x52\x61\x12\x4f\x0a\xff\x7e\xd9\x6d\x19\x6a\x60\xb7\x0a\xbf\xe5\x22\xfb\x0e\x1a\x0e\x05\x55\x9d\x7a\x61\xdf\x55\x82\x9c\xcc\x9a\x0d\xb5\xa1\x59\xc1\xc0\x19\xcd\x73\x81\x40\x61\x79\xca\x8a\x1b\x24\x8e\x58\xe1\xfd\x96\x98\x0e\x4a\xec\x8f\x10\xc0\xb2\x67\x99\x67\xdf\x43\xe4\xe3\x07\x65\x2c\xe6\xca\x64\xfd\xdc\x68\x07\xe9\x8d\xa3\x5e\x3b\xe8\x2e\x0d\xa9\xcc\xfd\x9c\x23\x05\x66\xb3\x56\xa5\x44\x31\x81\x03\x85\x34\x80\x54\x19\x90\xe2\xcc\x60\x9f\x0d\xdf\xfe\x1c\x19\x2b\xa1\x8a\xa7\xe6\xf2\x94\xdb\x2e\xc0\x5c\x14\x2e\xde\xe5\x48\x8e\xaf\xf8\x28\x5f\xe4\xa8\x3a\xf7\xd4\x56\x6f\xf2\xfc\x69\x9a\x92\xe3\xfd\x49\x45\xca\x16\xd6\x3f\x57\xd2\xd4\x9b\xbb\x3c\x72\xfb\xbd\x2f\x33\x27\x35\x71\x5a\x48\x21\xd8\xd8\x67\x25\xf5\xd8\x85\x68\x8c\xb2\x7c\x34\x6a\x04\x0c\xf5\x83\x28\x7a\xa8\xea\x23\x3f\x41\xd0\x66\x0c\x67\x22\x08\xcf\xea\x6b\x7e\x7c\x26\xca\xe7\xc4\x3c\xe9\xa4\x84\x1f\x49\x81\x60\xa4\x04\x6e\xe7\x0c\x72\x93\x9f\xaa\x4c\x57\x39\x6a\xfe\xe2\xf3\xe4\xa9\xa3\x9a\x3c\xbe\x75\x57\x8e\xf7\x9f\x9a\xcb\x65\x6d\x92\x6d\x83\xfe\xd9\x50\x26\xa9\x34\xa4\x74\xda\x4c\xf7\x7f\x9f\xc0\x40\x54\xa4\xc4\xd9\x47\x68\xd0\x23\x09\x0d\x2e\xf0\xfe\xa3\xa4\x46\x1d\xb9\xb2\x4b\x6b\x78\x4f\x24\xce\x88\x98\x1f\xe7\x4e\x6b\x0e\xb1\xb7\x8f\xec\xf5\xec\x64\x43\x89\x16\x39\xcb\xc7\x57\x8c\x99\xc4\x21\xf2\x04\x5b\x89\x1d\xe4\x7d\x06\xf2\x98\xbf\x2e\xba\x43\xd2\xf0\xb5\xe8\x51\x2a\x9e\xd9\xcf\x76\xbb\xe2\xbe\xfd\x09\x04\x35\x32\x24\xbd\x9f\x95\xaa\xde\xdf\xae\xb1\x78\x59\xc1\xba\xf8\x9a\xe8\x2a\x96\x6c\xa3\xb6\xa5\xd2\x8b\xef\x78\x39\xf5\x6b\xfd\xa6\xfa\xa6\xdf\x54\x7f\xee\x0a\xf1\x15\xcf\xf9\xc4\xa5\x7b\xcd\xb0\x42\x8c\x96\x38\x76\xdf\xbe\x9f\x9a\xf1\x30\x42\xa9\x95\xcb\x18\x25\x0a\x42\x21\xde\x08\x78\xb2\xeb\x21\x3b\xbd\x4b\xfc\x60\x44\xb9\x5e\x7f\xc6\x00\x24\x7c\xa7\xa2\xc8\x54\xad\x7f\x07\x01\x9d\x29\x43\xb3\x93\xce\x9c\x11\x54\x11\xa6\xf6\x3a\x59\x33\xb2\xa9\xc6\x8f\xb8\x54\x9c\xbb\x3e\xe8\xd2\x1d\x6c\x1a\xad\x29\x51\x24\x9d\x39\x73\x91\xbc\x81\xff\x42\xc0\x41\x81\x1d\x43\x40\x51\x04\xed\x28\x5c\x50\x20\x1c\x27\x3d\x28\x40\xb1\x38\x5a\x1e\x9e\x92\x6c\x13\xd1\x4b\x19\x9c\xb7\xd6\xdf\x9c\x2b\x90\x0e\x86\x1f\xa8\xd0\x61\xb7\xca\x81\xb3\xdc\x38\x84\x5a\x96\x83\x6e\xff\xb4\x5b\xbe\x32\x21\x46\xa5\x7b\x3c\x26\x2b\x27\xd1\xf9\x2c\xb8\xe7\x41\x68\x17\x89\xb6\xc5\x8b\x27\xa3\x0a\xd1\x98\x10\x8b\x2d\xa1\x69\x9d\xcd\x1b\x55\x36\xc6\x47\x1d\xdb\x1d\x0b\x74\xde\x84\x61\x83\xce\x0e\x09\x0f\x7b\x03\x0f\xa0\x61\xa1\x8d\xe6\x05\xe4\xa4\xa5\x82\x9d\x26\x3f\x91\x6c\x9d\xc4\x01\xa6\xda\xe0\x5d\x6c\x74\x2a\x36\x3a\xaf\x12\x04\x60\x23\x21\x39\x8b\xe7\xca\xc1\x3a\x86\x86\x90\xf9\xf1\x5b\x42\x27\xfd\x10\x23\x38\xc1\x1d\x78\x9c\x75\xed\x63\x57\x61\x29\xfa\x98\x80\xbd\xf2\x44\xd3\xd3\x9b\xa6\xec\xc4\x62\xbc\x9c\x9e\x9c\x94\xbf\xb8\x95\x47\x67\xc2\x8b\x52\xc4\x80\x1a\x2a\xb6\xa0\xbc\x7b\xa4\x2c\x94\xa6\xf7\x3f\x95\xde\x03\xe5\xc7\xb5\x73\x25\xa7\xca\x4d\x00\x96\x1c\xb1\x2a\xf5\xf7\x0a\x4c\x85\x96\x16\xd7\x0c\xc5\x24\x28\x88\x19\x0f\xca\x70\xbc\xdf\x73\xc7\xc7\x30\xdf\x4f\x3f\x08\xcc\x1f\xc1\x1c\x0d\xce\x9c\xd1\x71\xdc\xfc\xef\x8f\x85\xdf\x91\xa1\x32\xb8\x40\xac\xd7\x3d\xeb\x1a\xe7\xd9\x33\xf9\xa6\xd0\xfe\x16\x82\x0e\x04\xa9\x9d\x2c\xe4\x04\xe5\x9e\x2b\x68\x26\x2e\x68\x18\x77\x8e\xb4\xaa\xfd\xba\x56\xf8\x8a\x1e\x0d\x18\x24\x65\x0b\xd2\xcc\xcb\xbe\xaf\x8b\xb8\x54\x8a\x6c\x51\x9a\x92\x51\x66\x5a\x53\x71\xa7\x4d\x53\x40\xad\x1d\xe2\x6b\x4c\x34\x4b\x1d\xe6\x30\x07\x04\xba\x61\x9e\xa3\xde\x60\x74\xa4\xa1\xf8\x8b\xc7\x64\x97\xc5\xc4\x4b\xaa\xea\x33\xc7\xe9\xca\x4c\xed\x42\x6b\x9d\xe0\x18\x8c\xfb\x7d\xa7\x5b\x12\x25\x7d\xbe\x7b\x35\x5c\x00\xf3\xea\xd3\x67\x7d\xe6\x28\xd5\x1a\xbf\x08\x53\xad\xdf\xf0\x41\x8a\x18\xd3\x50\xe8\x06\xbf\x63\x9f\x5b\x2d\xa9\x2f\xbe\x21\xf4\x47\xc5\x15\xbd\x59\x80\x14\x62\xac\x54\xc9\x05\xb7\xf4\x20\x7c\x43\xe5\xfb\x0f\xe4\x3e\x03\xa9\xb6\xee\xf3\x41\x52\x51\x8b\x17\x22\xe7\x19\x99\xe7\x10\x25\x42\x25\xf7\xd8\x0d\x2f\x4d\xf9\xd4\x25\x5f\xb4\x4f\xf1\x81\xeb\x7e\xca\xfe\xba\x54\x4c\xd2\x5e\x87\x6b\x22\x14\x8c\x3f\xc3\xba\x11\x65\xe5\xf3\x73\xcb\x8d\x69\xa1\xe6\x38\x7c\x20\x1b\xda\xc9\x4c\xb3\x6f\x8f\x6a\x74\x5b\xba\x80\x9a\x18\xa7\x5a\x2b\x1a\x1a\x0b\x9c\xb2\x8d\xe3\xa0\x08\x3b\xa6\x28\x2e\x13\x8d\xf8\x98\x0b\x49\x5e\x40\x40\x66\xd9\x1c\xa2\x0d\x6e\x76\x26\x22\x3c\x84\x6f\xd0\x0e\x0f\x3b\x71\xb9\x36\xdb\x2d\xd8\x70\x0b\xe8\x76\x1b\xa2\x70\x96\xcd\x31\xa9\x8b\xd5\xa5\xd5\x87\x9a\xab\xa9\x8d\xbe\x05\xda\x6d\x0f\x63\x9c\x6e\xb7\xcd\x8d\xa0\xd2\x78\x7c\x21\x85\x0e\xa7\xb4\x4e\x99\x64\x46\x85\x99\xd1\x39\x0e\xd9\xd5\x48\x72\xf4\x90\x43\x37\x84\xc8\xbc\xca\x60\xce\x40\x8e\x7c\xec\x4c\xfc\xf3\x74\xe2\xb7\xdb\x30\x03\xbe\xd4\x7d\xc7\xe5\xd3\x9c\x23\x7e\x9c\x3e\xf9\x14\x07\x7b\x4e\xb1\xa4\xdd\x2b\xbe\x02\x32\x52\xa9\x38\xc5\xce\xd9\x48\xd0\xf9\x5d\xa7\x37\x92\x41\x4b\xfb\x7d\x67\xd4\x15\xd1\x8d\x86\xe3\xfe\xd9\xb8\x1c\xf2\xcd\x24\xf6\xa6\x65\x1a\x50\xab\xf4\x85\x66\xaa\x0e\x6f\xd6\xc7\xd2\x99\x45\xf6\xf7\x73\x86\xd2\xd4\x89\xae\xa5\x2d\xf7\xef\x4b\xf6\xc5\xb3\xef\xd4\x69\x4a\x85\x70\xb0\x16\x9f\x8a\xcd\x2a\x7a\x64\xe7\x8f\x17\x0d\x0f\xee\xbc\x43\xcd\xe9\xdd\xa6\xc4\xfd\x6c\xd1\x6b\x36\xe5\x31\x4d\xe8\x0d\x0b\xf7\xec\xd9\xa3\x5a\x31\x77\x96\xd8\x84\x10\xa2\x34\x17\x11\x52\x15\x86\xf4\x6d\x0a\xff\x2b\xe0\xd6\x77\x1b\x5d\x92\x18\x1c\x0b\x12\x0d\x4e\xf4\x09\x53\x86\xb0\x12\x0c\xf1\xa9\xb0\xaf\x85\xd8\x46\xd8\x6c\x42\x43\xd0\x9b\x42\x5d\xe0\x09\x5b\x3d\xb3\x97\xff\xe6\x7b\x7d\xbb\xdd\xc9\xe0\x47\xea\x17\x44\x38\xb7\xec\xe6\x63\xa4\x24\x65\xac\x41\xc3\xf7\xe2\x38\xa1\x8d\x6b\xc2\x35\xf7\x45\x24\xc5\xbd\x2b\x28\x89\x1b\x63\x0d\x43\x0e\x24\x13\x32\xb5\xc3\x4f\x6d\x51\xbe\xd5\x52\xbf\x18\xcc\x51\x78\x08\xc4\x58\xce\x19\x1c\x2e\xc7\x26\x19\x97\x8c\x9c\x08\x12\x44\xb0\x38\xb2\xa9\xd8\x13\x70\x42\xb0\xe4\xdd\x10\xc5\xa1\x1d\x24\x31\x91\x24\x70\x58\x26\x81\xd5\xa2\x86\x30\xa7\x53\x73\x93\xb8\xa0\xd8\x5f\x42\x83\xa0\x86\x53\x1c\x98\x50\x2d\xbf\x11\x2c\xeb\xed\xfd\x5a\x86\xfc\x51\x96\x4b\xa4\xd5\x52\x2b\xb7\xdd\x12\xd8\xb6\x1a\x61\xd6\x60\x4b\x51\xf0\x6d\x96\x6c\xc7\x2d\xfb\x1a\xd9\xf7\x53\xe2\xaa\xf5\xe1\x77\x3d\x57\xa6\x71\x0a\x77\x38\x3c\x92\xc2\x8d\x6b\xb5\xd7\x7b\x28\xba\x81\xd3\x91\xca\x33\x81\xf5\x77\x52\xf4\x69\xa4\xce\x49\x0b\xb9\xb9\xcb\x63\x7c\xa7\xc6\xc8\xa9\xfa\xa3\xc6\x98\x2c\x1e\x1b\xa4\x29\x7b\x15\x22\x9b\xfa\x41\x7e\x5e\xc1\x4d\x84\x4b\x74\x59\x45\x88\x13\xc1\x29\x90\x24\x1a\x52\xe0\xa0\x28\x82\x5c\xd6\x14\x72\x71\x0b\x03\x03\x0f\xfe\x77\x14\x18\xde\x1f\xb6\x04\xd9\x15\xae\x85\xb5\xb8\xd8\xb8\x71\xe3\x52\xe6\x29\xb9\x81\x3d\xe4\xa0\x07\x71\xfd\x10\x54\x38\x2e\xba\x71\x0e\xf3\xba\x08\x6a\xd4\x40\x7c\x79\x99\x8b\x51\x52\x7c\x5e\x60\x62\xe8\xd7\x52\x1d\x15\x99\x6d\xd6\x9e\x73\x9c\x29\x4c\x5d\x4e\xc9\x12\x00\xb8\xd5\x46\x19\x00\xba\xa0\x39\xf2\x22\x9e\xb9\xc7\x2f\x08\x46\x33\x73\xa9\x57\x81\xf6\x6c\xdf\xdb\xdc\x2c\x29\x4e\x73\x69\xeb\x74\xac\x04\x2c\xfb\xac\xb2\xaf\x48\xc9\xbe\x54\xb3\xd2\xec\x94\x0f\xce\x94\x80\x3d\xc5\x2e\xe4\x09\x42\x72\x11\xd5\xad\x90\x7e\x79\x0a\x2e\x61\xad\x2c\xfc\xe9\x2e\x23\xa6\x88\x42\xf5\xa3\xe6\x2c\x67\x29\x51\x73\x54\x46\xcd\x35\x31\x49\xeb\xb5\x65\x91\x94\x57\xd4\xfb\x95\x01\x01\x25\xc5\xa9\xbf\xfa\x45\x5a\x88\x6a\x09\x56\x28\x0a\x78\x98\x9f\xeb\x05\x65\x87\x38\x84\x13\xee\xd2\x24\x05\x51\xac\x98\x57\xe8\x96\x52\xfb\x45\x06\x19\x3d\x3e\xec\x1c\x47\x8f\x5f\x3f\xb6\xaf\x3b\xe3\xd1\xa8\xb7\xef\x60\xf3\x71\xfd\x7e\xc3\x71\x2d\xb7\x70\x43\xbd\xce\xb0\x77\x1c\x4a\xa9\xeb\x39\xda\x63\x8b\x54\x0a\x09\x6c\x44\xec\xe5\x41\x4f\x4b\x37\xc1\x1f\x0c\x92\xab\x37\x65\x0d\x9e\x8a\x0b\xf1\xb4\x48\xbf\x2a\x53\x2b\xee\x33\x7d\xaf\x8b\xe0\x13\x6c\x78\xb4\x2a\x1d\x42\x57\x87\x43\x8b\x3f\xc7\x89\xcd\x74\xb8\x41\xd1\x4d\xa5\x13\xf3\xcc\x3e\xcd\xc8\xe4\x69\x67\x56\x4d\x92\x1d\xd9\x62\x86\x21\xf2\xec\x80\x5c\x27\x9b\xd8\x27\x81\x69\x8c\x2a\x14\xa6\x1e\xcf\x4a\x6c\xb8\x61\x7b\x45\x00\xd9\x66\xe7\x13\xb4\x5f\x7e\x44\xbc\xf4\x85\xec\x50\x99\x61\x15\x7d\x90\x4a\x90\x5a\xa5\x94\xd6\x76\x19\xf5\x63\x2d\x43\xb4\xb8\xb9\xfc\x5d\xc0\xc3\x27\xb9\xaa\xca\xce\xb8\x9a\x0e\xee\x04\x1d\xac\x13\x32\x97\xea\x1c\x0c\x1e\x53\x03\x08\x35\xef\x92\xb8\x5e\x43\x67\x52\x01\x56\x61\x2d\x6f\xae\xc9\x7e\x9b\x31\x6d\x51\x63\x76\xfd\x58\x3c\x8b\x1a\x70\x4f\x0a\x42\x55\x09\xb5\xb9\x25\x3d\x81\x55\xaf\x17\x74\x60\xcd\x84\xb4\xa8\xd6\x84\x8c\xdb\xdf\x92\x2a\xf8\xf3\x1c\x8d\x07\xdd\xfe\x71\x18\x34\x78\x0c\x83\x0a\x3c\x66\x62\x50\x35\xf1\x4f\x0c\xfd\xc8\xad\x14\x6a\x48\x0b\x8d\x15\x34\x9e\xf2\x04\xbd\xfb\x34\x2a\x42\x9a\x99\xcb\x3c\x16\x9f\x95\x92\x30\x9b\xfe\x74\x0a\xe2\x29\x3a\xb4\xd2\x64\x52\x14\xda\x61\xf6\xf5\x6a\x4d\xef\xd9\x79\x7f\xba\x9a\x4c\x57\x3e\xb4\xf9\x8f\x3d\xf3\xb2\xb1\x1a\x8d\x52\x11\xd0\xba\x04\xb0\xc3\x58\xa1\xd8\xde\x39\x3a\x1b\x0d\x8e\xf4\xfb\xfa\xf8\xf4\xdd\x6b\xae\xf4\xe1\x6b\xd2\x33\xaf\xc9\xbd\x1b\xb0\xe6\x9a\x64\xf3\xf2\x52\x7d\x4d\x7e\x20\xf7\x5a\x0b\xfa\x59\x2e\x4a\xbd\x21\x65\x47\x3b\xdd\xfc\xb7\xc8\x5b\x73\x66\xa1\xb8\xf2\xbe\x23\x7c\x7f\xd5\x49\x2f\x5a\x2d\xe0\x69\xd8\xa4\xb0\xf6\x52\x94\x9f\x0f\x82\x83\xf0\x70\xec\x8f\x06\x74\x28\x88\x64\xc3\x67\xcb\x18\xf1\x84\xe2\x78\xca\x4a\xba\x64\x47\x8b\xb7\x5f\x81\xa7\x7c\x07\x26\x46\x76\xae\xef\xc8\x3d\xf7\x33\x4a\x19\xa5\x6b\x2e\x8c\x0c\x08\xfe\x81\xdc\x97\xdc\x59\x1f\xed\xa4\xf0\xab\x55\x10\x75\x26\xa9\x32\xd3\xfc\x40\xee\x6b\xe2\xfa\xaa\x03\x5c\x39\x4a\xfd\x41\xff\x48\x82\x76\xf9\xff\xe4\x51\x5a\xa7\x24\x08\x7d\x8f\x16\xfa\xf3\x65\x98\x5d\xa4\x37\x9f\xf9\x20\xe9\x6e\x4a\x9d\xfc\xb7\x8e\x51\x31\x49\x46\x73\xaa\x19\xb2\x03\xe5\x4b\x93\xbd\x27\xd1\x8f\x3b\xdc\xa1\x6e\xdf\xf0\x3a\x96\xbd\x20\x8d\x49\x36\x31\x6d\xb7\x9f\xae\xcf\xde\x87\xff\x49\x65\x23\x0e\xcf\xc6\x47\xda\x0b\xd6\xe1\x74\x6f\x0f\x67\x25\x14\x2b\xf5\x1a\xe0\xc3\xb4\x45\x54\xd0\x16\xd1\xf1\x3e\xab\x5e\x14\x5d\x7b\xfe\x87\xcf\x43\x57\x24\x05\xb7\x2e\x9a\x35\xf7\xdb\xd3\x4c\xf7\x9e\xb2\xdb\x18\x8b\x20\xc2\xe5\xdd\x81\x14\x96\xd1\x30\x54\xcb\xd5\x3d\x73\xfa\xc7\x2d\xd7\x8f\x8f\x85\xcf\xea\xf4\xfa\x1d\x47\x86\xcf\x62\xd8\x48\x48\x18\x3b\x83\xee\x60\x24\x54\x62\x9c\x58\x15\x2a\xb1\x7e\x7f\xc8\x0a\x14\x79\xfc\x26\x55\x2d\xa9\xc0\xe5\x3b\xa4\x27\xee\xee\x90\x94\x7e\x31\x1c\xa1\xb4\x25\x53\x2e\x3e\x5c\x96\x72\x7f\x19\x3a\x45\x9e\x2e\xc4\x87\x39\x74\x33\xfb\x5e\x08\x1e\x7f\x83\xa0\x03\x51\x3c\xe5\x6a\xed\x00\x4a\xdf\x8b\xc4\x7e\x0b\xeb\xf4\x18\x5c\x0e\xf2\x5d\x2e\xac\x74\xb8\xe6\xfe\x28\x08\xfe\xfc\xf9\x30\x6f\x49\x07\xde\x2c\x14\x1b\x75\x62\x74\x4b\x01\x51\x89\xcd\x3d\xdd\x94\xdd\xb8\x48\x49\xe3\x3e\xd9\x34\xa2\x24\xf9\x10\xc6\x37\x8d\x45\x92\x36\xfe\xcf\xca\x5b\xbf\x4d\x00\xfc\x3f\x53\x43\xc9\xf1\x59\x70\x7c\x22\xbc\x1d\xfe\x5c\x0c\x9f\x88\x88\x75\xff\x2b\xf8\x5d\x4c\x30\x35\x31\x7a\x81\xe7\xb7\xdb\x0b\xe0\xd5\x93\x43\x4f\xc1\xf1\x89\xf0\xce\xff\xec\x18\xfe\x11\x8b\x25\x89\xde\x7b\xdd\xb3\xe3\x76\xfb\xb7\x8f\xa1\x77\x21\xb2\x53\x29\xc3\x4a\x38\xc0\xfb\xa3\xbc\xe7\xbe\xf0\xfa\x93\x8a\x40\x30\xb4\xef\x85\xaf\x00\x1f\xcc\x71\xb6\x58\x37\x8f\x49\x04\xa5\x2d\x4f\xa8\x0d\x78\x84\x85\x4f\x45\xf2\x1e\x1d\xc4\x73\xc7\xa5\x1c\x79\x64\x9a\x75\x66\x32\x85\x6a\xc3\x2b\x96\x45\xe0\xcd\xc8\x50\x61\x22\xaf\x64\x35\xf6\x02\x02\xc2\x5f\x16\x76\x31\x69\xd9\x2e\x06\xa5\x46\xca\xbe\x18\x11\xe4\xa1\x54\x68\x89\x63\x08\x73\x17\x58\x31\x1f\xab\x31\x92\x56\x0b\xc4\xa5\x04\x94\xb5\xf7\x37\x37\x59\xe6\xea\xe2\x83\x42\xcc\xbd\x80\xfc\x63\x49\x25\x26\x87\x51\x98\x9f\xc4\x3c\xe2\x47\x4c\x3f\xb3\x64\xb4\x84\xc5\x8a\x5e\x3e\x5d\x34\xfa\x87\xb3\xdb\x3c\xb2\xd5\x0e\x8b\x37\x0a\xc4\x18\x9a\x30\xf3\xd8\x2d\xed\x69\x8f\x1b\x11\xce\xd4\x16\xa1\xef\x85\xc5\xb0\x61\x48\xac\x1c\x0c\x9e\x2e\x0e\x11\x8d\x9c\x57\x60\x59\x98\x9a\x4a\x97\x5c\x61\x60\x2a\x7a\xdf\xb5\x24\x96\xe5\x1e\x4d\xf7\x20\x9d\x12\x6a\x50\x36\xdf\xc8\x3b\x91\x7f\x0e\x61\xe5\x54\x62\x65\x31\x01\xe9\xe9\x60\xbf\x0f\xe3\x98\xa4\x97\x9b\x6b\xd3\x1d\x45\xbf\x3c\x1c\x5e\xdd\xd3\xea\x1b\x35\x5e\x33\x40\xaf\xcc\x1f\xa4\x30\x19\xa7\x8c\x16\x54\xda\x5f\xa4\x4d\x8c\x69\xab\x25\xca\xa4\x4f\x10\x20\x95\x57\xd8\xe1\xe6\xbf\xc6\xb4\x5a\x2d\xfd\x42\xc2\x5e\x19\xe7\x1d\x90\x23\x1d\xf2\xd5\xf8\x2c\x1e\xc4\x07\x1c\x80\x0d\x69\xb0\x18\xf0\xc4\x98\xcd\xc9\x09\x22\xfa\xaa\x92\x5b\x4c\xf4\xa0\xd2\xa1\x40\x77\x07\x00\x3b\x60\x7a\xc4\x7c\x5b\x39\x8f\x70\x25\x1a\x77\xc7\xfd\xb3\x84\x68\xbb\xc4\xa7\x69\x9d\xfb\xc7\x04\xb8\xa6\x47\xdb\xd3\xf8\x2c\x43\xce\x63\x7a\xcb\xc5\x85\xf7\x5b\xbb\x3d\x29\x8c\xa8\x22\x7e\xf2\x10\x43\x4b\xc5\x7e\x29\xac\x4e\xd3\x22\xfe\xa8\x76\x99\xe4\xf2\x78\xf5\x00\xb8\xa5\xca\x7f\x41\x0a\x7c\x84\xbf\xe4\x9f\xe7\x46\xa8\x40\xc7\x05\x5e\xe7\xd8\x81\x66\x79\xa5\x9f\xd0\x11\x55\x4c\x4f\x43\x7a\xd2\x41\xf4\x59\x67\x7f\x85\x9a\x05\x0b\x93\x18\xa5\x15\xef\xc5\xba\xfa\x28\x6d\xb5\x40\x33\xde\x6e\x53\x8c\x71\x0c\x5b\xad\xb4\x7a\xea\x0b\x19\x5a\xa5\x6a\x99\x70\xed\x8d\x47\xc3\xe3\x8c\xed\xdf\x3c\x46\xb8\x72\xbb\x7d\x45\xb8\x9e\x0d\xc7\x15\xc2\xf5\xb3\x3a\x3e\xed\xb3\x9f\x09\xed\xef\x78\x7c\x51\x6d\x3f\xb3\x7b\x40\x05\x91\x0b\x01\x65\xc4\x18\xe3\x76\x0f\x16\xe1\xbc\x6c\xbf\xd7\x39\x32\x21\x70\x5d\x20\xb6\x4f\x27\x82\x8f\x21\x57\x4d\x79\xe3\x9f\x48\xae\xc2\x7d\x26\x3c\x26\x45\xfa\xa8\x4e\x7d\x3f\xef\xfb\x67\x90\x89\x7f\x98\x2c\x7c\x32\x11\xf7\x49\xc4\xd8\x9f\x4e\x27\x7d\x2a\x65\x24\x07\x24\x8a\x15\x5a\xdd\x5d\xe7\xe8\x89\x61\x16\x55\x50\x52\xe9\x2e\x25\x25\xac\x61\x55\x34\xcd\x9d\xa6\x4d\xd2\x6a\x6f\x21\x11\x9b\x29\x2d\x54\xfd\x3b\x25\x9e\xec\xe8\xb6\x3b\x47\x19\x9b\x42\x1a\x84\xb6\x5a\x4f\xf2\x6e\x3f\x36\x46\xf5\x5e\xd5\xe2\x0e\x5c\x04\x23\xf2\xc4\x60\x2c\xfb\x9a\xa9\x84\xa7\x7e\xe2\xe4\xfe\x30\x3d\x59\xa2\xd2\xb8\x18\xf4\x28\xcc\xfa\xdb\x13\x0c\x8e\x46\x1d\xe7\x4c\x20\x56\x91\x36\xb9\x62\x63\xb4\x5f\x40\xce\x33\xf5\x0b\x13\x54\x1f\x02\xe8\x3e\x19\xbd\x85\x0b\x50\xcd\xfa\x95\x50\x2f\x2a\xbc\x1f\xa9\x17\x9d\x3b\x86\x3c\x32\xb4\xff\xf5\x59\x51\x1f\xef\xe1\xbf\x83\xf8\xc4\xcc\x04\xef\x2a\x23\xcf\x3c\x19\xed\xe1\x62\xd0\x28\xc6\xed\x76\x21\xaa\x9b\xc4\xe7\x58\x47\xb9\xac\xd9\x48\x88\x87\xfd\xab\x2b\x70\x90\x1d\xda\x51\x10\x0e\x47\x47\x0a\xee\x7e\xfa\x5c\x36\xa4\x9f\xc9\xd0\x43\x24\x3a\x25\x4f\x35\x17\x2d\x50\x35\x3b\x0b\x28\x34\xac\x13\xcd\x56\x91\xb6\x6a\x8c\x61\x11\x66\xbe\xd5\x6a\xc6\x76\x46\x48\xcc\x4d\x1a\xa6\x20\x96\x86\x8e\xa8\xb4\x1f\x21\x74\xe3\x4f\xe3\x0b\x9e\x92\x3b\x4e\x0f\x03\x37\x3b\xb5\xd1\xc7\x0e\x20\x28\x95\xfc\xb6\x68\xc2\x50\x5c\xd7\x7a\x03\x1f\x40\xb6\x55\xeb\xcd\x5e\xef\x48\xdb\xa3\x23\x6d\x28\xcb\x8c\xa7\xdc\x25\x2a\x74\x6f\x85\x66\x34\xf4\x39\xba\xed\x82\x58\x48\x2b\x36\x90\xc2\xa3\xfa\x11\x2b\xc8\x9a\x0c\xf2\xec\x08\xbe\x49\xdf\xc8\xc4\x37\x0a\xb9\x89\xb0\xf8\x71\x19\x90\x38\xfd\xac\xe8\xad\xdc\xb3\xd1\x6f\xb9\xd7\x3f\x60\x2b\x69\x64\x3c\xd8\xdd\x85\xd9\xce\x2e\x7c\x4f\xbd\x35\xdb\x62\x38\x44\x19\x7f\x10\x39\xe9\xd4\x93\x8e\x9a\x53\xfe\x1c\x6d\xb7\x3b\x25\x12\xf6\x8e\x5f\x3d\x2b\x08\x52\x38\x05\x46\x14\xe9\x0b\x90\x41\x59\x9e\x77\x96\x42\x97\x31\x80\x46\x89\xb4\xf4\x99\xc3\xa9\xe8\x43\x74\x2a\x4d\xe7\x6b\xba\x4e\x35\xe0\xb6\xdb\x10\xd6\x66\x32\xd8\x2f\x4a\x64\x84\xaa\x10\x19\x8a\xde\xeb\x42\x7b\x6b\x47\x71\x7a\x14\xe1\x4a\xf7\xa9\x5d\x8e\x0b\x10\x68\x8e\xa8\x12\xb7\xfa\xb3\x0e\x69\x27\x72\xcd\x41\x99\x9f\x39\xaa\xe7\xa5\x60\xf7\xa5\x81\xa9\x61\x91\xa3\x86\x45\xb4\x63\xed\x11\x92\x31\x79\xe3\xf5\x8f\xb5\xf1\x7e\xfb\xa8\xaa\xaa\x50\x6d\x57\x51\xd5\x1f\x56\x55\x65\xc7\xd9\x48\x7e\x92\x1d\x03\x87\x9d\x0a\x9f\xf7\x79\x6d\x19\xcc\xa6\xff\xa8\x3d\xc3\x71\x64\x58\x69\x32\xa9\x50\x1d\xe8\x7b\xf1\xe9\x5a\x81\x1d\x93\xea\x4f\xb5\x92\x34\x0c\xc4\x84\x01\xe4\xe3\x1b\x55\xa4\x58\xe3\xbc\xaf\xe4\xcc\xcc\xc9\x01\xe3\xc4\x12\x4c\x0f\x9d\x47\x15\xaa\xeb\xfb\x4a\x90\x80\x8a\xa5\x42\x8e\xb8\xa3\xd7\x51\x87\x21\x3d\x3e\x72\x43\x9d\x59\xce\xd1\xae\xad\xa1\x7d\xc7\xb3\x15\xeb\x2b\x7b\xbf\xd3\xa2\xd7\xc4\xda\x29\x7e\xaa\xdd\x0a\x67\x5e\xbb\x3d\xe7\xee\xe0\x52\x7c\x6b\xb0\xca\x86\xaf\x21\x74\x2b\xae\xab\xdc\xe9\x34\x47\xdc\x59\xe3\x38\xe7\xba\x1a\x88\xfc\xb9\xb9\xff\x10\x2b\x6a\xa6\xa1\x27\x28\xb4\xef\x92\xf4\x03\xdf\xf7\x6b\x12\x07\x61\x7c\xb3\x6f\xdb\xab\x5a\xfb\x79\x91\x4f\x54\x92\x3a\x7b\x62\x88\xb3\x57\x42\x78\x9b\x51\x8f\x12\x99\x13\x49\xc9\x79\x02\x25\x1f\xd1\xb3\x31\x03\x60\x37\x71\xac\x58\x9b\x30\x50\x61\x58\xb8\xdb\xd1\x45\x76\x1f\xfb\xaf\x02\x90\xa2\x18\x51\x15\x0c\x53\x4f\x5d\x9f\xd9\xc8\xd3\x56\x92\xaa\x81\x50\xe5\x4d\x4b\xc9\x6f\x1b\x92\xd1\xa2\x25\x35\x22\x0a\x65\x42\x2a\x1d\x72\xd2\x2c\x78\x88\x9f\xf8\x44\xed\xa9\xde\xe6\x19\xa1\xaf\x62\x4a\xd2\x5b\x2f\x02\xc4\x5e\x44\x9b\x6c\x29\xb2\x31\xa9\x20\x64\x86\x50\xa7\x0c\x88\x3f\x65\x54\x46\x7a\x00\xad\x73\x62\x10\xe5\xcf\xcd\x8e\x52\x54\x49\xb0\xeb\x05\x9f\x70\x8f\x09\x3d\x11\x43\xda\x46\x3e\x12\x7f\x53\x9f\xd9\x6b\x27\x25\xad\x81\x26\xa4\xa5\x92\xa8\x1d\xc6\x37\x0d\xaf\xe1\x7b\xb1\x4f\xa2\x88\x04\x0d\x4f\x08\x85\xa5\xc7\x59\xb1\xfb\xcd\x6d\xf6\x5e\x76\xac\x7d\xc5\xe3\x22\x2c\xfb\xce\x3c\x5a\x2d\x31\x69\xb9\x1d\x1e\xd9\x80\xe5\xcd\xab\xf7\x10\x77\xd7\x30\xc9\xb4\x43\x33\xe7\x23\x45\xdc\x9e\x58\xd3\x47\xec\x3c\x03\x4d\x9d\x85\xf0\x81\x67\x7d\x8e\x71\xb3\x19\xb6\x5a\xe1\x76\x5b\xc0\x25\x84\x79\xb8\x00\x69\xe9\x62\xa9\x84\xed\xff\x84\x40\x93\xec\x1c\x54\x4e\x26\xcf\x1a\x2d\xc0\x9d\xa1\x14\xc7\xe5\x40\xf7\x13\x3d\x6c\xc3\xd3\x46\x1c\xf9\xe2\xd9\x40\x4e\xe5\xb6\x45\x19\x1e\x72\x9e\x47\x00\x91\x21\xe7\x53\xd4\x81\x48\xc6\xb3\x78\x6c\x21\x10\x91\x50\x37\x0f\xbf\xa9\xea\x79\x1a\x2a\xde\x41\xc2\x66\xe8\xc3\x27\x22\x56\x63\x69\x6a\xd2\x94\xc2\x1c\x71\x67\xc0\xa3\xae\x9b\xba\x70\xf6\x9e\x19\xa3\xd9\xcc\x13\xff\x59\xad\x60\x88\x1d\x27\x77\x55\x93\x97\x4b\xb5\x80\x17\x42\xb5\x46\x95\x54\xe6\xae\xd6\xe6\xe5\xcf\xbb\x7d\x50\x1d\x9e\x2b\x23\x34\xd1\x8c\x19\x98\xa1\x6e\x0a\x6a\x7e\x05\x95\xc0\x6e\x98\x82\x84\x4d\xf9\xe4\x76\x17\xe1\x85\x47\x39\x84\x80\xc8\x17\xed\x3d\x5d\xde\x53\x67\x7e\x73\xdc\xec\x43\xbe\x34\x8f\x8a\x8b\xd0\xee\xa8\x63\x76\x4e\xc8\x8d\x47\x09\x3b\x75\xea\x77\x13\xe3\x0b\xc6\x7c\x17\x6f\xc4\xcc\x5c\x8f\xd3\x48\x0a\x09\xe0\xd9\x1c\xa5\xca\x0a\xa7\xd9\x41\x85\x2b\x61\xa0\x84\xec\x75\x12\xa9\x3f\x71\x13\xa4\x4f\xdd\x04\xfb\xa6\xcf\x00\x66\x4e\x5f\x6f\x06\x76\x34\x53\xe8\xee\x2a\x0b\x8a\x59\xd1\x6a\xb8\x61\x5e\x45\xe3\x60\x7e\xad\x3f\x22\x0a\x96\x00\xd6\x24\x95\x80\x31\xa4\xca\xf2\xc8\x50\x9c\x9b\xf6\x25\xb8\xe9\x4c\x82\x84\xc7\x00\xc2\xc4\xd6\x97\x9e\x40\xc3\x88\x08\x9c\x08\xa1\xc8\x72\x7b\xb7\x0c\xd9\x7c\x30\xd5\xb6\x27\x95\xee\xd8\x92\xc6\x42\x63\x3d\x31\x8a\x4d\x60\xc5\x6d\x71\x22\xe5\xf8\x45\x0e\xe6\x10\xe6\x88\x07\x33\x3a\xce\xe7\xe4\xdf\x87\x49\xe8\x1a\xcd\xef\xe5\xfd\xea\x3a\x89\x5a\x2d\xf1\xaf\x1d\x52\x11\xd4\x7b\x5a\x79\x76\xad\xbf\xff\x5d\xfd\xb6\x18\x96\x1d\x0c\x8e\x8b\x94\x50\x97\x0d\xfa\x49\x23\x2a\x82\x8f\x6c\xb7\xd6\xdf\xff\x6e\xc4\x22\xc9\x11\x4f\x14\xfd\xc9\xa2\xd1\x63\x86\x21\xe1\x00\xac\xf4\x63\x91\x68\xcd\x82\x0c\x1c\xe6\x9b\xf7\x56\xfb\x07\x8f\x2e\xed\xd4\x8b\x83\x64\xc5\x10\xd7\xa8\xe3\x7c\xde\x8c\xe7\xa5\x1b\x48\x97\x3c\x9c\x46\xad\x30\x49\x4f\x36\xb4\x91\x2c\x1a\xa9\x17\xdf\x90\x52\xfe\xb2\x0b\x59\xe2\xcd\x86\xbe\x59\xfc\xc4\x3e\x1b\x39\xcc\x3e\x31\x6b\x59\x8e\xb8\x20\xe7\x93\x23\x69\x7c\xb6\xe9\xc7\x49\x83\x44\x84\x63\xac\x46\xc8\x98\x82\xdf\x36\x84\xbb\x1e\x1b\x00\xe0\x5e\x97\x9f\x63\xce\xa3\xd1\xf8\xc8\x30\x93\x75\xd9\x21\x3e\xdb\x9c\x45\x22\xab\x86\x81\x57\x82\xd2\x7c\xc5\x5c\x8c\x74\x6a\xc1\xe7\x98\x3c\x4f\xce\x7e\x78\xf2\x7a\x2e\x29\x43\xd1\x19\xa1\x6f\xc3\x15\x49\x36\x14\x94\xb4\x28\x3c\xad\x68\x8e\x1c\x98\x1f\x88\xc9\xc9\x80\xc5\xfb\x7c\x4c\xd6\x52\xee\x53\x4d\x4e\x35\x7d\xbf\xbf\xe9\xf1\x68\x3c\x3c\x6a\x2d\x3f\x1c\x5e\x4b\x6e\x83\x64\x87\x19\xff\x77\xbb\xad\x21\x65\x49\xab\xb5\x63\xb3\xad\x84\x30\x79\x8e\x78\xcc\xba\xe3\x0c\xe6\x8f\x17\x9f\x1c\xd1\xb5\x19\x30\xab\x70\x7c\xe1\x03\xea\x3c\x16\x25\xa8\x0e\xea\x75\xd1\xc3\xd4\x3a\xac\xf6\xae\x03\x8f\xd1\xf9\x09\x4b\x5c\x04\x0a\xd8\x4d\x94\x9f\x3f\x82\x79\x72\xc4\x43\x06\x3e\xbd\xd7\x66\x93\xd4\x43\xad\x90\xed\xd6\x47\x51\xe3\xe1\xe4\xd4\xb0\xea\x92\x32\xa9\xfd\x7e\x36\x7c\xd2\x19\x33\x96\xb9\xae\x57\x45\x67\x3d\x0e\x10\x1e\x7a\xf1\xa8\x4d\x58\x97\x6a\x6a\x53\x32\xea\x13\x91\xbb\xa4\x37\x4a\x7f\x2c\xcc\x2a\x64\xbc\xc6\x4a\x40\x47\x11\xaf\x91\x7b\xaf\xc9\x28\x8e\x7e\x11\xb7\xb5\x9c\x4e\x23\x5c\x80\x43\xd1\x18\x77\x23\xd1\x1d\x88\xc6\xa4\xc3\x29\xd6\x7b\x7f\xc5\xc5\x72\xd6\xfb\x81\xfd\x98\x26\xb7\x61\x40\x82\x86\x44\xc5\x41\x42\x84\x43\x98\x9f\xa4\x29\xf1\x69\x74\xdf\x08\x57\x6b\x71\x2f\x35\x76\xa8\x1c\xd3\x17\xcc\x4c\x52\x94\xe7\x8c\x5a\x15\xe1\xfb\x92\x6a\xf8\xbe\x54\x04\x33\x93\x9f\xb3\x7d\xf1\x10\x0f\x99\x0f\xd4\x04\x35\xa4\x85\xc5\x2e\x2d\x62\xcc\x95\xc2\x82\xd6\xd8\x43\x96\xc2\x70\x89\x46\xb9\x48\x22\xb4\x7f\x87\x88\xea\x69\xec\x5b\x2e\xcf\x5e\xfe\xfb\xd8\xf5\x2a\x02\x7e\xcb\x7a\x00\x4e\x26\x4a\xf8\x2d\xf9\x13\xe1\x48\x2e\x85\xd9\x70\x27\xb8\x1e\xd5\x71\xf5\x10\xe5\xd2\x1f\x1e\x83\x8f\xcf\xbd\x50\x23\x08\x32\x9f\xa7\xdc\x96\xc1\xb0\x6f\x65\x08\x06\x25\x63\x13\x25\xf6\xa2\xba\x58\x47\x1a\xa4\xd5\xd0\x84\xc5\xa7\xd8\x0c\x42\x28\x01\x25\x38\x19\xeb\x97\x64\xd3\x58\xab\x6d\xa5\x13\xd7\xf2\xd0\x97\xdf\xb1\xa5\x9e\x5a\x5e\xdc\x08\xe3\x5b\x2f\x0a\xd5\xb6\xb3\x5c\xeb\x6f\x45\x0e\x5d\x64\xfd\xcd\x82\xc8\x6a\xdc\x2d\x49\x4a\x1a\x1e\x3b\xb6\xc4\x5b\xf1\xe4\x79\xe4\xe3\x9a\xf8\x94\x04\x76\x83\xf5\xe2\x7b\xb1\xea\xa9\xe1\xc5\x8d\x37\x7a\x5f\xa2\x86\x4c\xed\x87\x84\x61\x2d\x6a\x24\x69\x43\x05\x6d\xb4\x2d\xcd\xbb\x94\xce\x82\x88\xaa\xc6\x8e\xfc\x51\xd8\xe3\xdd\x93\xaf\xb0\xfa\xdd\xe0\x20\x23\xba\x6f\x7c\x9e\xb6\x5a\x3a\x25\x98\x30\x02\x56\xaa\x8d\x78\x0e\x27\xa5\x60\xd4\x39\x77\xf1\x7f\x8c\x8e\xd3\x2a\x9a\xe1\xa8\xd3\x87\x93\x18\x8c\x7b\xdd\xfe\x00\x02\x8a\xac\xf7\xef\x49\xf6\x43\x22\xd8\x57\x99\x05\xa8\xe9\xb0\xf5\x54\xc1\x3b\xd4\xbe\x14\xb1\xbe\x52\x10\x83\x5e\x9f\x21\x3f\x86\x08\xf9\xd3\x60\xd0\xed\x43\x86\x0b\xf9\xd3\x68\xdc\x77\x20\x43\x87\xe2\x5b\xbf\xd7\x81\x6c\xc8\xaa\xb1\x5d\xae\xd7\xfa\x98\x92\x1b\xf2\x71\x6d\xa1\x18\x9f\x82\x2b\x00\xc1\xb4\x79\x35\x85\xdb\xab\x2b\x30\xeb\x9c\x8c\xe7\x57\xc1\x97\xec\x61\x76\x95\x5d\x5d\xce\xb7\x57\x33\x30\x75\x67\xbf\x5e\x5d\x5d\xcd\xe7\xfa\x2d\xfc\xf2\x6a\x7e\x7a\xc3\x61\xb8\x89\x59\xe3\xb3\xd3\x2b\xf0\xf0\x00\x66\x57\x77\x5f\xcc\xdb\x30\xcf\xaf\xe0\xd6\x7c\x3c\x45\xf1\x1c\x59\x37\x16\x7a\xf0\x93\xf8\x3f\x72\x44\xae\xc5\x38\xc5\x72\x7e\x36\x35\xc6\xd3\x5f\xc1\xd4\xbd\x02\x57\x53\xf7\x0a\xc2\x2f\xaf\x7e\x3d\x65\x63\xbd\xfa\xc2\x7c\xf9\xc5\xe9\x44\x9f\x50\x4a\x32\x86\x7a\xd8\x09\xd9\xf9\x69\xa7\x64\x1d\x79\x3e\x01\xa7\x6a\xf4\xa7\x37\xc8\xb2\x20\x9c\x16\x9f\x28\x7b\xa1\x9f\x62\xf6\xe4\x12\x33\x5e\xb4\x91\xf5\x23\x9d\x5a\x1f\x2d\xd7\xb2\x74\x36\x2f\x3b\xcc\x7e\x22\x37\x5f\x7f\x5c\x83\x18\x4e\xe3\x19\x9d\xb7\x5a\xec\xaf\xed\x7b\x6b\xba\x49\xc9\x6b\x6f\x45\xb2\x69\xec\x12\x10\xcb\xdc\x5d\x28\x84\xec\x09\x85\x46\x0c\xc2\x8d\xa9\x6c\x36\x43\x67\x8a\xa6\xa7\xd4\x25\x36\xc9\x7c\x6f\xcd\x31\xbd\xae\x16\xec\x84\x69\xb6\xb2\xcd\xf5\xda\xa3\x94\xa4\xb1\x3e\xdc\x31\x9c\x63\x8a\x8c\x09\x2d\xab\xd5\xda\x80\xea\x3c\xc4\x27\x9d\xa9\xf5\xf0\x50\xd3\x0c\x45\x56\x9e\x33\xd6\xd6\x82\x39\xb1\xa9\x77\x83\x6b\x6e\x09\x53\xc7\xa8\xce\x5b\x8a\xea\xfc\xdd\xd8\xb5\xad\x8d\xf0\xbd\x67\x9d\xa9\x77\xd2\x71\x1d\x76\x85\x77\x26\xfe\xb9\x27\x62\x48\xcf\xfc\x93\x8e\x69\x8e\xef\x0b\x73\xfc\xb5\x08\xab\x2d\x37\x39\x04\xdc\x47\x2a\x2a\x9e\x95\x50\x28\x43\x1b\x28\x7f\xa6\x28\x40\x0f\x39\x44\x8b\x4a\xd1\x10\xc7\x76\xea\xdd\xc9\x52\x21\x5a\xaa\x74\xde\xc5\x3d\x4b\xec\xeb\x4d\x18\x05\x60\x81\xd6\x5c\x3e\x89\xe4\x8b\x62\xfe\x11\x4a\xd0\x46\xec\x90\x40\xd8\x14\xeb\xf6\x37\x78\xb3\xdd\xb2\xed\xc5\xdb\xdf\x20\xeb\xa3\x05\xd1\x12\x9f\xfe\xca\x76\xb2\x3a\x22\x57\xf0\x94\xcb\x90\x40\x04\x27\xcb\x56\x0b\x6c\xb8\x47\x46\x14\xae\x5f\x6c\xd6\x11\x8f\x24\x91\x81\x4d\x7b\x39\xeb\xcc\x21\x94\x00\x78\xc8\x75\x3a\x8b\x05\xe3\x5d\x13\x18\x2e\x40\x62\x2f\xbd\xec\xcd\x5d\xfc\x63\x9a\xac\x49\x4a\xef\xc1\x42\xa6\x0c\xbe\xc5\x3e\x48\x66\x8b\x39\x0a\xe0\x64\x3d\x5b\xcc\xf1\x83\x5c\x5d\x37\x03\xb7\x72\x5f\x42\xc4\x18\xc0\xcc\xbd\xad\xee\xde\xed\x76\x36\x17\x16\x0f\x37\xe8\x1e\xfb\x20\x42\x01\x44\x2b\xec\xa0\x6b\xec\xa0\xe7\x78\xe6\xcc\xd1\x05\xbe\xaf\xab\x85\x2e\xf1\xbd\xca\x58\xa7\x8e\x57\x8a\x4a\xa8\x33\x45\x1e\x8a\x64\x38\x7a\x94\x21\x1f\x6d\x30\xdd\x6e\x53\x46\x01\x28\x88\xf2\x2c\x39\xeb\xea\xd4\x36\xd0\xa0\xae\x7e\x22\x0b\x92\x32\xd6\x5d\x92\x58\x3f\xc7\x01\x59\x84\x31\x09\xd8\x5d\xc5\xcb\x17\xb7\x22\x61\x08\x72\x0a\x12\x7c\x31\xbb\x9e\xa3\xe7\xb3\x76\xfb\x7a\x8e\xdb\xed\x15\xca\xb0\x05\xa6\xe7\xba\x5c\xb2\xdd\x6e\x90\xf5\xcc\x82\xd0\xe5\x5f\x5c\x0b\xdd\xe0\x15\x07\xff\x12\xaf\x67\x9b\xb9\x2d\x61\x68\x60\x8e\xea\xad\x20\x52\xfe\xb2\x95\x11\x35\x38\x84\x67\xab\x93\x9b\x39\x62\x3d\x26\x92\x8e\x29\xf7\xcb\x3b\xcd\x75\xda\x70\x45\xeb\x18\x0d\xf8\xb8\x1d\x9f\x74\xe6\x53\xeb\xea\xea\x43\x51\xd1\x2c\x30\xe7\x8d\xb8\xd6\xd5\x95\xfe\xdc\x8e\xdb\x37\xc5\x9e\xce\xa1\xe9\xc4\xa2\xb7\x6b\x80\x8b\xbc\xf7\x99\x3a\x3b\x01\x5a\x22\x0b\x5a\x5c\xfb\xe5\xc9\xe9\x54\x81\x77\xcc\x54\x22\x35\x95\x0b\x36\x83\x68\x77\x06\x17\xb5\x03\x7f\x3e\x6b\x47\xf3\x9a\x91\x37\x08\xb8\x44\x1b\x71\x20\xc9\xc7\x75\x92\xd2\x0c\xeb\x9b\x8f\xdf\xd3\x8f\x48\xd8\x3e\xef\x35\xdd\x1f\x0e\x06\x67\xc5\x35\x2d\x2f\xed\xc8\xbc\xb4\xf7\x5c\xcc\x1a\x31\xd3\x22\xc7\x94\x98\xe2\x03\x5b\x4e\x97\x48\x11\x36\x45\x19\xf5\x52\xea\xc6\x88\xc4\x81\x9b\xe6\x39\xb1\x57\x8c\x5c\xfd\x89\xf8\x9b\x34\x0b\x6f\x49\xd1\x6a\x8c\x52\xc4\xcf\x13\x7c\xf0\xb1\xbf\xdd\x3e\xe4\x7c\xa4\x1b\xc4\xd6\x72\x8d\x16\xe8\xb6\x8a\x32\x71\x66\xe0\xa9\x8c\x5d\xd7\x10\xdd\xec\xc5\xab\xd6\xbd\x05\xd1\x3d\xce\x8a\xeb\xf5\x5e\xdc\xab\x68\x85\x7d\x79\x55\x3d\x5f\x7a\x29\xba\xc6\xbe\x20\x86\x39\x52\x60\xe8\x82\x61\x0b\x07\x5d\x62\x07\xbd\xc3\x0e\xfa\x80\xb9\xf6\x3b\xc5\x0c\x33\xdc\x33\x42\x86\x80\x84\xfd\x58\x89\xd3\xff\x1e\xdd\xb1\xef\x2b\xad\x9f\xd8\x8d\x0c\xfe\x5c\x04\x04\x67\x2b\xbb\x4a\x52\xd2\xa0\x4b\x2f\x6e\x24\x31\x69\x88\x61\x34\xfc\xa5\x97\x7a\x3e\x25\xa9\x05\x27\x2b\xac\x2f\xd2\x15\xbb\x0c\x04\xf2\xe0\xd7\x77\x19\x6f\xbf\xaf\xe0\xf1\x3b\x81\x02\xd4\x9e\x5c\x21\x6b\x76\x75\x75\x79\x75\x95\xcd\xb7\x60\xea\x82\x69\xd3\x52\xa7\xe5\x0e\x69\xb2\x28\x45\xc9\x1c\x59\xb5\x74\x8f\x22\x06\x2c\x38\xfb\x55\x57\x7d\x8f\x56\xc8\x9a\xc3\x36\x6c\x5b\x10\x19\xb0\x9d\xfd\x1a\xae\x36\xf3\xb6\xa4\x5c\x72\xae\x27\x98\xf0\x83\xb8\x6a\xb5\xc0\xbb\x36\x06\x42\x07\xc1\x30\x10\x7a\x87\xac\x8c\x86\xfe\x87\x7b\x0b\x6e\xb7\x33\xcb\x9a\xc3\x99\x33\x57\xd9\x45\xd0\x12\xeb\xa2\x29\x7a\x07\xd1\xba\x78\x4e\xd8\xf3\xb2\xd5\x5a\xb7\x5a\x60\x29\x54\xce\xe7\x78\x2d\x7e\x4c\xd7\x5c\xc1\xeb\x2e\x45\x78\x44\xb4\xdc\x6e\xd7\xf0\x1d\x06\x97\x18\xf0\x9f\xa2\x14\x6c\x8b\xa7\xa2\x43\xed\xa8\xd8\xbc\x10\x3c\x10\x5b\xcc\x9b\x56\xab\x79\xd1\x6a\x5d\x3e\xfb\x50\xbc\x5b\xc2\x0b\x9e\xf2\xe2\x12\x05\xf8\x1d\x44\xed\xf6\xc5\x44\x25\x7b\x6f\xae\xb7\xdb\xe6\xc5\xee\xba\xff\x1c\x5f\x7b\x11\xa3\x93\x82\x46\x40\xa2\x70\x15\x52\x92\x36\x16\xc9\x26\x0e\xb8\x30\x57\x44\x9b\x17\x39\xd6\x4e\x4e\x2e\x5a\x2d\x70\x3d\x05\xd7\x33\x67\xde\x6a\x6d\x9e\x7d\x68\xb5\x9e\xcb\x2c\xf1\xfc\x1d\x2a\xa3\xc1\x58\x2e\x48\x8c\x3e\xa0\x0d\xe4\x7f\x20\xba\x9e\x75\xe6\xa5\x6a\x9d\xfd\xd5\x36\xec\x8e\x64\x7f\x58\xb5\x6e\xb9\x5a\x77\x7f\xb5\x00\x5d\x42\xfe\x87\x55\xeb\x95\xab\xf5\xf6\x57\xbb\x64\x2b\xc7\xfe\x40\xe8\xca\x1a\x87\x7a\x80\xe8\x03\x7e\x87\x9a\xb7\x4a\x3f\x75\x89\x31\x7e\xd7\x6a\xb5\xdb\xef\x94\x7c\xf7\xb6\xd5\x6a\xde\xb4\x5a\xd7\xad\x96\x00\x98\x22\x0e\x9f\x00\x37\x06\x35\x55\x0d\x42\xf4\x7c\x1f\x9a\xee\x75\x07\xdd\x47\xa4\xb4\x9f\x99\x9d\xea\x0c\xcf\x86\x1a\x4f\x0f\xce\x46\x9d\x8e\xc6\xd3\xc3\xe1\xb0\x3b\xd2\xec\xd4\xa0\xe7\x74\xc7\x10\xa2\x4c\xd4\x73\x9c\x11\x2b\xe9\x97\xb0\xfd\xa6\xc4\x94\x05\x25\xdc\xbf\xe4\x4f\x67\xfd\xb1\xc3\x98\x32\x8d\xe5\xd7\xc2\x16\x85\x4b\x3d\x30\xa3\x76\xe8\x33\xc5\x8c\x8a\x54\x77\xfa\x69\x52\x66\x59\x0b\x7a\x99\x42\x9d\xc0\x8c\x27\xf3\x62\x9c\xaa\xb6\xe0\xcb\x0f\xb1\x7f\x0f\x39\x8a\x19\x75\x19\x10\x5f\x38\xfe\x2e\xc9\x47\xb4\x60\x3f\xd6\x5e\xd0\x2f\x06\x79\x5b\xf2\x30\x2f\x30\xd1\x49\xe3\xbd\x42\x44\x36\x4d\xbe\x4f\xee\x48\xfa\xdc\xcb\x18\x6b\xac\xab\xde\x98\x8c\xdc\xd5\xd5\xec\xe3\x66\x0e\xec\xb6\x22\x71\x89\xbe\xbe\xe9\x34\x06\x94\xd1\xb4\x2e\xb1\x19\x8e\x7e\x9e\x04\xe4\x82\x02\x76\xf5\x63\x8c\xc9\xcc\x99\x4f\x19\x47\x90\x13\xdb\x0b\x82\xb7\xc9\x07\x12\x33\x26\x0e\xcc\xd6\x3f\xce\x21\x98\xba\x0f\xe0\xea\xd7\x29\x04\xb3\x5f\xf3\xf9\x97\x30\xdf\x82\xd9\xc5\xc9\xbf\xbd\x93\xdf\xe7\x10\x9e\x22\xe3\x1e\x0c\x91\x27\x46\x13\x61\xeb\x47\xd6\x70\x3c\xeb\xcc\xb7\xdb\x66\x33\x66\x07\x31\xc1\x3c\xdb\x85\xde\xc0\x9e\xdc\xc0\x1e\xb2\x2e\x18\x0e\xc6\xb7\x20\x9e\xf5\xe7\xdb\x6d\x3c\xeb\xcd\xd9\xda\xd3\x59\xc6\xf3\x32\x15\x6d\x31\x7e\xaf\x3b\x37\xd0\xd3\xe5\x7d\x4c\xbd\x8f\x2a\x6d\x85\x14\xba\x04\xc9\xe6\x3a\x22\x8d\x98\xdc\x70\xdb\xd1\x86\xd5\x8e\x67\xce\x5c\x60\x27\x5a\xa5\x6d\x33\xb8\xaf\xb9\x9f\xe3\x0f\x71\x72\x17\x37\x7e\x8e\x43\x3f\x09\x48\x83\x32\xb0\x98\x8d\xf9\x76\x18\xdf\x92\x34\x23\x6f\x16\x62\xda\x6b\xf6\x96\xcd\xc3\xfc\x82\x1e\xe9\xb3\x42\x4f\xf3\xac\x8b\x1a\x46\x6b\x83\x46\xb4\xca\x03\x59\x85\x59\x16\xc6\x37\x8d\xc0\xa3\x9e\x1c\x15\xb2\x1a\x27\xcf\x1a\xfa\x8a\x5b\x23\x73\x1c\x70\x22\x20\x8a\x22\xdc\x8c\x18\x79\xd9\xf4\xed\xeb\xd5\xba\xd5\x6a\x26\xfb\x20\x70\x91\xd1\xd4\x8b\x1a\x2b\xd6\x69\x4a\x7e\xdb\x84\x29\x09\x78\xb8\xac\xbd\x20\x49\x44\x9c\x2e\x3f\xf2\xb2\x8c\x2d\x5a\x78\x4c\xd3\x5a\x28\x9b\x6d\xd6\x0c\x67\x95\x9b\xcf\x1a\x77\x21\x5d\x86\x71\x41\x5b\x34\x78\xf3\x24\x2b\xd8\x46\x03\xa5\x15\x06\xb7\x53\xcb\x6b\x5a\xae\xe5\x61\x2d\x40\xa0\x33\x32\x9f\xa5\xf3\xed\x16\xc8\x5f\xb8\xa6\x22\xe7\xa0\xd9\x77\x14\xe1\x42\xf6\xe0\x49\x58\x79\x76\x98\x7d\xb5\x5a\x7f\xef\x65\x94\xe7\x76\x2a\x2f\x57\x8a\xad\x99\x5e\x2f\x5e\x05\x59\x73\xab\xe0\x8b\x3d\xdb\xe3\xf3\x9e\x5a\x5b\x8b\x31\xf7\x50\xbf\x61\x8d\xb5\xb1\x7a\x62\xef\x8d\x7e\x64\xe7\xac\x44\xb9\xbf\xd0\xd8\x1e\x95\xb6\x91\x35\xd3\x1d\x87\xc8\x18\x0b\x8a\xa7\x96\x24\xa3\x54\xd5\x08\x59\xec\x94\xcf\xae\x36\xc1\x99\xe3\x9c\x5c\x6d\x82\xeb\xc5\x62\xce\x1e\x7d\xf1\xb8\x58\x2c\xe6\xdb\xd9\x15\xfb\xbd\x60\xbf\x21\x64\x7c\x83\x49\xa4\x45\x82\x6b\x91\x91\x8b\x00\x0f\xb0\x2f\xb9\x94\x62\x33\x4c\xa3\xda\x2c\x13\xb3\x78\x3e\xb3\xae\x9b\x96\x58\x18\xf5\x80\x77\xb5\x01\x96\x85\x42\x7c\xd2\x29\xb8\xa9\x65\x01\x0a\x22\xe7\xca\x2e\xb5\x53\x70\x75\xf5\xd1\xb6\xb7\x57\x57\x1b\xdb\xe6\xff\x4e\xa5\x34\x0d\x4c\xdd\x93\xbd\x1f\xe1\xf4\x14\xed\x62\xf1\x1b\x40\x18\xe2\x9c\xd0\x67\x61\xbb\xd3\x6a\x81\xb8\x8d\xad\xab\xab\x8d\x9e\xf9\x02\xa4\x20\x6c\x77\x20\x84\x88\x15\xe9\xca\x22\x27\xd5\x32\xf4\x84\x95\x81\x10\x85\xbc\xc9\xee\x7c\xbb\xe5\x0d\xe7\x10\x85\xe7\xc3\xc1\xa0\x37\x38\xdc\xb8\x28\xd4\x37\x9a\x7f\xf9\xf2\xe5\x4b\xbe\xa0\x39\x07\x1b\x5b\x62\x0e\x7b\xe8\xf2\x93\xed\x16\x7b\x03\x44\x53\x6b\xf6\xab\xe5\xb2\x3d\xd1\xf6\xf5\x5e\xc8\xd1\x43\xe6\x27\x6b\xe2\x5a\xdc\x27\x22\xe1\x9e\xc4\x5e\xf4\x32\xf2\x6e\x32\xd7\xba\xb0\x50\x44\xbc\x80\xb1\x16\x9c\x47\xcc\x21\xe2\xd7\x83\x3c\x9d\x2f\x3c\x6a\x98\x83\xe9\xd3\x63\xea\x82\xb4\x19\x28\x43\x0d\x82\x38\xc0\x18\x6b\x61\xd2\x76\x2b\xae\xe5\x32\xe3\x43\x20\xc7\x21\x65\x96\x80\xc0\xed\x16\xc4\xfb\x9a\x16\x4a\xa7\xfd\x49\x8f\x18\x15\x20\xba\x37\xe2\xfc\xf8\x06\x29\xb5\x93\xb4\xcf\xa6\xc9\x25\x6f\x4d\x6e\x2a\xa8\x89\xad\x33\x74\xd2\x11\xea\xa8\x37\x4a\x9b\x89\xd3\x56\x8b\x30\x50\x67\x34\xdd\xf8\x34\x49\x5b\x2d\xc6\x64\x99\x6f\xb8\xac\x00\x22\xeb\x07\x6f\x6d\x89\xe4\x70\xd6\x25\x11\x75\x0b\xcd\x51\x66\xce\x97\x77\xa1\x2c\x42\x32\x59\x89\x0b\x6b\x7f\x0e\xb7\xaf\x60\x4c\xc1\xd4\x3d\xdb\x76\x86\xdb\x5e\x97\xed\xea\xe7\x91\xb7\x5a\x93\x00\x4e\x39\xd1\xf2\xc5\xa9\x10\xc9\x16\x99\x0c\x0d\x10\x70\x6d\x06\x84\x0f\x71\xab\x05\x08\x8e\x15\x48\x1c\x73\xe9\xe0\x43\x2e\x4f\xd9\x43\xe6\x6e\x50\x5d\x3e\xa0\xf4\x59\xe1\xa0\xf0\x10\x24\x31\xa7\x06\x5d\xf9\xab\x23\xd9\x68\x32\x4b\xdb\xed\x39\xa3\x47\x2b\xde\x28\xd2\xb6\x60\xe1\x6e\xf2\xda\x44\x48\xfa\x32\xf7\x28\x25\xab\x35\x6d\xd0\xa4\x21\x8c\x9e\x48\x23\x4e\xe2\x93\x50\xa5\xa8\x52\x02\x5c\xfb\x2a\x7e\x15\x37\x92\x34\x20\x29\x2b\x7b\x4d\x1a\xaa\x08\xe2\x15\x3c\x06\x17\xa9\x8f\xc9\x1a\xab\x4d\x46\x1b\x4b\xef\x96\x34\xbc\xc6\xac\x62\x5f\x35\x07\xb0\xb1\x22\x74\x99\x04\xb6\x25\x93\x3e\xa3\x25\x6e\x3a\x68\x81\x9b\x9d\x02\x2a\xa6\xde\x08\x97\x49\x73\x02\xf3\x32\xc8\x84\x09\xb2\x52\x7c\xa9\x3b\x85\xf1\x87\x0c\x5c\x88\x54\xe1\xb3\x60\xdd\x05\x98\x03\xc8\x34\xc9\x48\xef\x1f\x9a\x4b\x65\xca\x5d\xab\xad\x5a\x84\xb1\x17\x45\xf7\x3c\x4b\x9e\xbc\x7b\x83\x3c\xcf\x73\x10\x43\xae\x7e\x63\x54\xee\xc6\xce\x00\x9c\x34\x41\x8a\x37\x76\x0c\x20\xe4\x83\x98\x28\x99\xaa\x54\xa8\x71\x6a\x29\x10\xfb\xb6\x86\x1d\x34\xef\x7f\x49\x1a\x64\x0d\x56\x58\x72\x81\x20\x28\x48\x8f\xed\x36\x60\x28\x87\xfd\x23\xaf\xb7\xc7\x5a\x5c\x7a\x8c\x20\x30\x6e\x7c\x49\xe4\xc8\xf1\x4c\xe8\xec\x16\xc8\xdf\x73\x1c\xa0\xc0\xf6\xa2\xd0\xcb\x18\x41\xcf\x3f\xf0\x27\xf6\x05\xe6\x52\xc9\xb8\x84\x0f\x1b\x9b\x80\x65\x01\xa0\x8d\xbd\x00\x8c\xde\xf5\x3d\x7f\x29\xbd\x12\x80\x25\xa5\x8c\x19\x43\x8d\xc4\x7e\x7f\x43\xa8\x1c\x97\x22\xdd\x76\xa8\xfc\x18\xdf\x9a\x64\xf6\x2c\x9e\xef\x63\xbe\xce\x3a\xbd\xff\xae\x2e\xab\x7f\x36\x18\xef\xd7\x50\xf1\xd4\x6f\x15\x74\x7e\x50\xca\x2b\xd6\xe7\x2b\x2f\x23\xe2\xf4\x5c\x93\x46\x94\x78\x01\x09\x1a\xd7\x64\x91\xa4\x44\x53\x6d\x5f\x45\x89\xff\x81\x11\x67\xd5\xe6\x41\x71\x44\xf6\x31\xa8\xa3\xb3\xc7\x2c\x6c\x3e\x2f\x8c\x06\x9d\x71\xb7\xfb\xbf\x00\xa3\xe7\x1e\x25\x37\x49\x1a\x92\x4f\x83\xd3\x68\x38\x1e\xfd\x57\xe1\xd4\x19\x77\x86\xc3\xff\x05\x38\xc9\x73\x27\xe0\x24\xe8\x31\x0d\x9c\x89\x34\x1c\x16\x82\x5b\xeb\x22\xcb\xc2\x9b\x98\x04\x16\xd2\x88\xc7\xb5\x9e\xc7\x75\x64\x0b\xd8\x0b\xd8\x6e\xe7\xac\xfb\x5f\x95\x64\x8f\x3a\xa3\xb3\xf1\xff\x02\x60\x2f\x79\xe0\x98\x4f\xdc\x7d\x83\xe1\x63\x51\x10\x3e\xb3\x18\x69\x74\x76\x36\xd0\x62\x24\x6e\x14\xa0\xc5\x48\xfd\x41\xff\xac\x50\xca\x77\x07\x5c\xa6\x24\xa4\x48\x1c\xe3\x6a\x29\x12\xc7\x2d\x5a\x8a\xc4\x4f\x90\x96\x22\xf1\x65\x87\x70\x52\x26\x3a\x0b\x40\xa0\x8a\x22\xb3\xf4\x21\xd9\xf7\x21\xdb\xf7\xc1\xdf\xf7\x61\xb3\xef\x43\x50\xfb\xa1\x00\x99\x7e\xb9\x1f\xaf\x3e\x62\xf6\xf1\xff\xa2\xe0\x4f\x09\xf7\xe4\x92\x75\xce\x06\x1d\xbd\x64\xfc\x6e\x93\x62\xbf\x71\xb7\x3f\x60\xfb\x63\x6d\x0a\x01\xd1\xa2\x24\x2e\xbc\x15\x0b\x3d\xec\x8c\xbb\x10\xa2\x9b\x92\x60\xf1\x5e\x8e\x79\x3c\x62\x4f\x2b\x81\xf1\x3a\x67\x9d\xb1\x29\x4a\xbc\xfe\x7f\x87\x9f\x79\x5e\xc7\xcf\xdc\xfc\x7f\x8a\x9f\x79\x5e\xe5\x67\xb6\x5b\xda\x6a\x1d\xb2\xa2\xad\x61\x78\xfc\x3d\x0c\x8f\xff\x67\x32\x3c\xfe\xff\x1f\x30\x3c\x1b\xc4\xc3\xd6\x2e\x3f\x33\xc3\x13\xec\x65\x78\x38\x7f\xb5\xa9\x67\x78\x82\x63\x19\x9e\xa5\xbc\x1a\x37\x8c\xe1\xd1\xe7\xf6\xf9\x9f\xad\x02\x60\x35\x2e\x0c\x5b\xaf\x4b\xfc\x20\xd8\x1c\xb6\x2b\xb8\x8d\xc0\xda\xf3\xc3\xf8\xc6\x6d\x76\x72\xf4\x0e\x3f\x90\x8f\xc4\x77\x85\x22\xd4\x38\xa0\xec\x2d\x62\x9b\x7c\xf7\x13\x7b\x8b\xb8\xf6\xd9\x95\x87\xb8\xf8\xc6\x5f\x23\xa9\x33\xd8\xfd\x2c\x3f\xa0\x6c\x1d\x85\x74\xf7\x33\x7f\x9d\xa3\x0f\xf8\x21\x47\xef\xd9\x9f\x3b\xf6\xe7\x1b\x3c\x9b\xa3\x1f\xb0\x25\x97\xd7\x42\xdf\xe3\x07\xf9\xdb\x3d\xbd\xba\x02\x53\xd7\x01\x53\x77\xe6\x9c\xf4\xe6\x33\xe7\x64\x34\x7f\x70\x50\x37\xdf\xce\xfa\x27\x23\xf1\x3c\x85\xd3\xad\xb2\x6f\xdb\x7e\x9c\x5d\x05\x17\x27\x2f\xbd\x93\xc5\xfc\xa1\x9b\x6f\x37\x5c\xce\xa8\xdf\xf4\xf3\xed\x43\xf1\xd8\xce\xe1\xd6\x57\xba\x85\xad\x94\xca\x6d\xb9\xf5\xce\xd4\x9d\xb9\xb8\x39\xdf\x9e\xcf\x70\x73\x0e\xb7\xb3\xe9\x97\xed\xf9\xd5\x74\xfb\x70\x15\xb4\xc1\xd4\x45\x57\xc1\x97\x70\x9a\x5f\x4d\xa7\xb2\xd6\x29\xe2\x52\x47\x39\xdc\x03\x43\xfd\x0c\xe3\x93\x3d\xe6\xe8\xa3\x34\x9c\x2b\xcc\xf1\xb6\xe7\xea\xe7\xb3\x2d\xb8\x0a\xae\x02\x35\x3e\x08\x4f\x6f\xd0\xbf\xb1\xbe\x43\xde\xf1\xf5\x17\x38\xf9\x14\xc0\xe9\xf4\x14\x59\x16\x9c\x75\xe6\xe8\x6b\xac\x7d\x04\x81\x83\x56\xc5\x99\x3b\xfd\x78\x0a\xd1\x2b\xfc\x90\x6b\xdc\x5e\xdc\x55\x6f\x0b\xf1\x65\x53\x98\xdd\x1a\xca\x77\xcb\x42\x0c\x75\xdf\x73\xcd\x4f\xab\x65\xd9\x36\xfb\x65\xd9\x9e\x55\x58\xd7\x18\xa5\x3d\x0b\x59\x37\xf7\x16\x44\x96\x6d\x89\x03\xd3\xec\x18\x99\x16\xd8\xa3\x8e\x53\xc3\xcf\xc2\x1b\xfc\x16\x58\x1b\x0b\xa2\x1f\xd9\x0f\x56\xf3\x35\x7e\xb8\x71\x9b\x0e\x0a\xd9\x9f\x15\xfb\xb3\x71\xdf\xa0\x7b\xf7\xc7\xbc\x18\xf2\x4f\xca\x1e\xa3\xc8\x3f\xc1\x6e\xc2\xd9\xc5\x1c\x3f\x98\xb6\x4e\x2e\xcd\x51\xa8\x6e\x01\x11\xe7\xd7\x7e\xff\x9e\x6f\xe9\xf7\xef\xa1\xf1\x1b\x7f\x57\x6c\x74\xa1\x1a\x57\xc7\x3b\x6a\x84\x71\xc3\xf8\x0a\xc9\x2c\x9a\x9b\xc5\x67\x91\x3e\xde\x6c\x00\xd2\x7e\x00\xc7\x88\x3f\x2d\x22\xef\x26\x63\x77\x24\x70\xd0\xbd\xa1\xce\xc2\xa9\x38\x4f\xc0\xd2\x82\x77\xaf\xb0\x70\x33\x8d\x02\x5f\x1a\x0a\xbf\x77\x0a\xe8\x4a\x7c\x7d\x0a\xb4\xac\x1a\x8b\x5f\x5f\x5e\x75\xa0\x50\x03\x16\x4d\xbc\xa8\x90\x0c\xcd\xef\x0a\xe3\x48\x02\xeb\x8d\xe1\xd9\x4f\xb9\xac\xda\xd2\xd8\x52\xb7\x21\x9b\xda\x76\xfb\x90\xa3\xb0\xce\xb6\xf7\xeb\x69\x79\xf3\x11\xe8\x96\xb6\xec\xd5\x29\x98\xb1\x43\xf1\x25\xfc\xe2\x34\x44\xbb\x18\xac\x4a\x7d\xcc\x3a\x3c\x53\x3d\xf2\xb0\x65\x71\x3d\x0b\x4a\x84\xb3\x7c\x86\x8d\x1c\x8a\x80\x32\x7c\xfd\x90\x43\x99\x5d\xf2\x1f\x42\x07\xc2\xed\x65\xa8\x7c\xf7\x8b\x7c\xc7\xf6\x59\xd4\x6a\x81\x10\x57\x20\x1a\x22\x73\x37\xcf\x4c\x8d\xc5\xbc\xcd\xb6\x35\x6b\x8d\xeb\x62\xb8\x3d\x38\xeb\xc3\xd3\x7d\x78\x41\xf0\x8b\x7c\xc1\x3a\xf0\x78\x07\x2f\x41\xd8\xf6\x78\xf9\x30\xe3\x01\x21\x62\x2f\x7a\x13\x47\xf7\xdb\x2d\xd0\x67\x35\x95\x9b\xa6\xd5\x02\x89\x7e\x50\x5e\xff\x65\x58\xa6\xec\x54\x65\xd8\x9b\xbe\x04\xd5\x0f\x6d\x8f\x27\xe5\x29\xbd\x83\x10\xfd\x64\x1e\x50\x2a\x1b\xdf\x6e\x49\x61\xf5\x5a\xe3\x0b\xd0\x04\x4d\xb1\xc6\xfc\x9f\x92\xfd\x20\x64\x6b\x31\xad\xd2\x90\x69\xb9\x8c\x22\x18\x1d\xc8\xd3\x5c\x72\x93\xa7\x2a\x04\x8c\x0d\xfa\x9f\x52\xc8\xe5\x5b\x63\xeb\xa0\xce\xd0\x28\xf7\x8f\xb2\x81\xac\x05\x38\x5a\xb2\xc3\x78\xbd\xa1\x33\x22\x6c\x5d\x4e\x3a\xf3\xed\xd6\x82\x35\x5f\xda\xa4\xb0\x7f\x61\x65\xb6\x7b\x6b\xd7\x7d\xa9\xd4\x96\x6f\xcf\x3b\xfa\xa7\x59\xe0\x99\xaa\x2d\x9f\xb7\xdb\x77\xfc\x66\x96\x27\x80\x1b\x99\xf2\x3b\xea\x14\xa9\x82\xd9\xe6\x3a\xa3\x29\x50\xe3\xe8\xa1\x1e\xa3\x53\xab\x6c\x98\x46\x04\x45\x6b\xc0\x41\x8b\x3a\x4b\x0f\xeb\xa3\x05\xa7\xc2\x62\x3b\xdb\xfe\x65\xf6\xeb\x5f\xae\xe2\xf9\x97\xfc\x82\xfc\xcb\xec\x57\x38\xff\xf2\x0a\xc2\x2f\xd9\x05\xc6\x6e\xc7\xca\xdd\x08\x4f\x5d\x6d\xea\x7d\x44\x61\x54\xde\x0d\x86\x76\x0d\xb2\xdd\x22\x26\x88\x6a\xc0\x84\x62\x38\xb5\x2c\xae\x1c\x84\x56\xb1\xcc\xbf\x1f\xd8\x0e\x0e\xd4\x08\x02\x94\xf6\xc6\x57\xa5\xd8\x4a\xaf\x14\xf6\x60\xb7\xd5\x4c\x3a\xf4\x98\x26\xd3\x73\x13\x41\xfe\xcc\xe5\xe8\xdc\xcb\x5b\x8e\xec\xbc\x3f\x81\x04\x5b\x8e\x61\x9d\x5a\x18\x3a\xea\x7a\xbf\x99\xf6\x1b\xea\x3b\x1b\x88\x75\x29\xad\x9c\xa6\x6c\x79\xd6\xc5\x0c\xbe\x93\xb0\xf9\x0e\x11\x74\x3a\xfb\xf5\x2a\x43\xf3\x76\x59\x91\x48\x67\x64\x8e\x05\xcb\x5c\xb2\x76\xff\x97\x92\xf1\x9c\xfe\xca\xc9\x04\xc5\xe6\x90\x1a\x01\xf9\xcb\xc8\xbb\xd1\x32\x1d\xaf\x91\x85\xf1\x4d\x64\xd8\xdb\x35\x04\x55\xe2\x9c\x8c\xdf\x7f\x61\xc1\xc9\x6b\xd9\xa3\xee\xea\x17\xf3\x7a\x55\x17\xa1\x87\x22\x94\xe0\x6f\x0a\x2b\x71\x46\xd8\x22\x5f\xa0\xe0\xe4\xe4\x64\x02\xb9\x28\x1f\x44\xf8\x9b\x59\x32\x87\xb6\x52\x07\xb6\x5a\x91\xfe\xdd\xc4\x38\xdb\x6e\x23\x9b\x2b\x12\x45\xa0\x13\xae\x4d\x6c\x62\x2c\x5f\xb2\xaf\xec\xce\x6c\xb5\x9a\xe5\x7d\x4d\x55\x3c\x01\x24\x0a\x40\x86\x08\x3d\xfc\x9d\x34\x5e\x41\x91\xcd\x49\x6a\x14\x17\x56\x76\x10\x3e\xf8\xf8\x81\x13\xbd\xdf\xf3\x41\xbb\x9e\xb1\xf5\x92\x0d\x5d\x6f\xa8\x1b\xd9\x4b\x2f\x0e\x22\x92\x6a\xed\x37\x4a\x11\x85\x8c\x4a\xf6\xd2\x8c\xb8\xac\x5d\xfe\x2b\x9f\x98\xbe\x42\x0d\xbf\x00\xd7\x17\x6c\x65\x2e\xa5\xba\x02\x1b\x4b\xf6\xad\xf8\x60\x90\xf5\xe6\xd7\x7f\xca\x05\x15\xbc\xc6\x1e\x9f\x34\x69\x43\xe9\x27\xf1\x2d\x49\x29\xf7\x8f\x6c\x24\x69\x63\xa3\xed\xa8\x69\xa2\xfc\x86\xea\x36\xe8\x77\x3a\xb0\x50\xf9\xca\x7f\xd0\x32\x89\x26\xc6\xf4\x60\xd7\xd9\x66\xbd\x8e\xee\x1b\x9c\x90\x69\xdc\x2d\x49\xdc\xf0\x93\xf5\xbd\x88\x41\x24\x1a\x2c\x7a\x7e\xc1\x98\x3b\x46\x65\x15\xc4\x2a\x61\x07\x5c\x9e\x57\xf2\xff\x63\xef\xdf\xfb\xe3\x36\xae\x7c\x5f\xf8\xad\x58\xda\xf3\x68\x93\x5b\x94\x53\x55\xb8\xcb\x61\xf4\xf8\x12\x27\x19\x5b\x8e\x4f\xe4\x64\xf6\x8c\x5a\xc3\x5d\x40\x55\x91\x1d\x51\xdd\xda\xcd\x66\x2c\xc5\xd2\x79\xed\xe7\x53\xdf\x05\x74\x17\xd0\x20\x25\x7b\x9c\x99\xcc\x8c\xfe\x29\x12\x8d\x55\x40\xa1\xae\xeb\xf2\x5b\x6b\x1d\x9f\x6c\xf7\x77\xb6\xc9\x9d\xed\xf1\xc9\x57\x1c\x0f\x57\x5b\x7b\x79\xe9\xdd\xd1\x5d\xe9\xcd\xc8\x44\xde\x38\x11\xee\x7e\x2a\x3c\xe6\xfd\x53\x30\x41\xdf\x3f\xf5\xcf\xde\xbc\x39\x8a\x7f\x4e\x7f\x78\x7b\x7c\x72\x27\xfe\xf7\x74\xfb\x2c\x71\x30\x3a\xd9\x9c\xfe\x70\x61\xaf\xe2\x19\xe5\x3e\x97\xf3\x2a\xca\x5d\x23\x96\xf1\xe9\xb3\xc8\xd6\x3c\x1e\xb8\x0d\x35\x8a\xd8\xd7\x77\xe6\x97\x47\xdb\xe3\x49\xc7\xcd\x83\x8b\x06\x37\x81\x8f\x98\x9c\x74\x62\xb2\x0b\x1d\x1f\x7f\xe2\xa7\x1c\x88\x3f\x39\x70\x41\x38\x19\x03\x4f\x96\xe1\x68\x74\x98\x3c\x3d\x7f\xfd\xec\x17\x27\xab\x1b\xa1\x49\x09\x0c\x97\xf7\x9f\xc7\x09\xf4\x3a\xb2\xb5\x00\x6a\x5e\xac\x1d\x81\x7e\xc7\x40\xfc\x81\x49\x3f\xfd\xf2\x68\x7b\x7f\x15\x79\x9e\xde\x9b\x2b\xf6\x61\x1b\x85\xdc\xc1\x40\xb8\xe9\x0d\x84\x91\x07\x98\x1a\x08\x97\xa7\xab\xc4\x40\xf8\xcd\xd3\xe5\x8d\x70\xac\x01\x3f\x35\xd7\x4f\xcb\xe3\x9d\x69\xee\xf2\xf8\x87\xcd\xc7\xfe\xe8\x72\x2f\xca\x6f\x30\xcd\xf5\x7a\x87\xc1\x79\xc2\x9f\x30\x5d\x1f\xe2\x8c\x17\x57\xf3\xd5\xe9\x7a\xf0\x0a\x38\xe9\x26\x2c\xd5\xfa\xf8\x93\xcb\x5f\x0e\xde\x2f\x9f\x1c\xff\xe0\xd6\x3f\x1c\xad\x4e\xff\xf9\xe8\xea\xa4\x3b\xb9\x3c\x59\x9e\x6c\x8e\x8f\x45\x89\xc0\x36\x00\xfb\x35\x3e\xef\xf6\xe8\x6b\x75\x72\x79\x7c\x7f\xf5\xb1\x6c\x2d\xf7\x6f\xa2\xba\xbc\xbf\xfa\x38\xd9\x95\x8e\x8f\xfb\x40\x24\xab\xe4\x35\x7d\x8c\x2e\x7b\xff\x74\x78\xdc\xc9\x65\xfc\x3f\xa9\xf7\xe6\x8d\xde\x07\x41\xb9\x1e\x76\xc2\xab\x93\xaf\x9f\x2e\x9f\x9d\x5c\xee\xb7\xc1\x13\x5c\x5f\x12\xf4\xcb\xf5\x89\x3e\x7e\xaa\x9e\x7d\x62\xef\x9f\xba\xf8\x54\x37\x6c\x89\x77\x9f\x46\xbe\xc7\xdd\xbb\xb7\x3c\x3d\x3d\x7d\xfc\x68\x79\xda\xc3\x71\x1e\xde\x7d\xd6\xdf\x48\xf0\x39\x70\xb7\x8f\x8f\xdf\xbe\xed\x97\xd9\xde\x75\x65\x32\xa3\xed\xc9\x2f\x12\x07\x31\x30\x8a\x9c\xf7\xc7\xfd\x20\x4d\xc8\xbb\x78\x2e\x9e\x2f\x5f\x5c\xbf\x1e\xf0\x8c\xc3\xfa\xbc\x7a\xb8\xf9\x78\xb2\x7a\x1f\x8d\xf9\xce\x87\x12\xec\x4a\x3c\x71\xfa\x76\x0d\x53\x79\xc4\x07\xbf\xdc\xcd\x86\xf1\x5c\x78\x79\x7c\x7c\xf2\x72\x78\x24\x71\x6b\x8e\xdf\x26\xb2\xde\x69\xfc\x92\xe3\x5f\x9c\x7c\xf5\xf1\x5f\xfc\xe6\x6a\xb9\x5e\x9d\xde\xcd\x3f\xce\x3f\xd6\x77\x4f\xbe\x9a\xfa\x05\x9d\x7e\x19\x7f\xa3\xb9\xdb\xe5\x5f\x7c\x3c\x91\x4f\xbf\x8b\x3f\x39\xdf\x9d\xfe\x99\x7b\xfe\xd5\xe9\x5f\xe3\x3f\x2f\xad\xcb\x4f\xff\x78\xf2\xd5\x0e\x4e\x79\x3a\xe5\xfa\x7a\xbd\xed\xea\x74\x25\x12\xce\x08\x7c\xc3\x4c\xe9\x0f\xcd\x7f\xea\xff\x3b\x4e\x33\x9a\xb5\x47\x9b\xd3\x3f\x89\xb8\x39\x60\xcb\xa2\x08\xb3\x5b\xc1\xb6\x5f\xc1\xcb\x53\x9b\xae\xe0\x7f\x3a\x5a\xf6\xee\xb2\xfb\xc5\x67\xc7\x8b\xcf\xb2\xf8\xde\xfe\xb6\xb7\xad\xb1\x78\x1f\x46\x69\xf3\x87\x28\x1c\x45\xd9\x3d\xca\x44\x0f\xbf\x3d\x19\x73\xfe\x62\x11\xe8\xcf\xdd\x87\xdb\x13\xc1\x15\xad\x06\x0e\xe0\x31\x13\xe3\xa1\x7c\xc9\xee\x20\xde\x2d\x8d\x3d\xd0\x68\xb5\x63\x2c\xde\xc6\xf3\xe3\x46\xeb\xfc\x51\x7f\x6f\xb2\x91\x0f\x71\x99\xe4\xdc\x38\x1b\xce\x8d\x33\x99\x37\xfd\x4f\x71\x66\x7f\xd5\xb3\xb2\xc7\xf2\xf0\x91\xcc\xbb\x7f\x11\x87\xdd\xf7\xa7\x3f\xbc\x7d\x78\x76\xfa\xc3\xdb\xb7\x27\x5f\xf5\x0e\x0d\x73\x22\xf2\x64\xce\x47\x56\xe0\xe4\x17\x4f\x1f\x2c\x9e\x2e\x9e\xfd\xf0\xf6\xe8\xf8\x7f\xdd\x7f\xf4\xf1\xc9\x62\xf1\xaf\xff\xf0\xe6\x7f\x2c\xae\x70\x8c\x5c\x2c\xfe\xe1\x5e\xfc\x14\x59\xe5\x93\x09\x92\x0c\x76\x94\x8f\xcf\xa3\x80\x7c\x47\x7f\x72\xb4\x3c\xfd\xf6\xde\xbd\x3b\x77\x8e\x36\x6f\xde\x6c\x3f\x96\xed\xe0\xde\xbd\x3b\x44\x98\x3b\x3e\x7e\x24\x82\x30\xf1\xa3\xd7\xa7\x77\x54\xdc\x09\xee\x7e\x69\x9f\xfb\x7f\x8e\xc2\xec\xd3\x4f\x9f\x9d\x6e\x7b\x29\x9f\x7d\xff\x8a\xcb\xa7\x97\x82\xbb\xe3\xbf\xd3\x2f\x8e\xb6\x93\x91\x5e\x9e\x88\x54\xf9\x70\xfd\x68\x0f\x28\xdb\xee\x7c\x2a\xde\x1c\x1d\xdf\x3d\x7e\x38\x04\xc6\x12\x91\xfc\x21\xe1\x07\x37\x73\x53\x64\x77\x0c\x5d\x7d\x7c\x69\xaf\xb6\xbf\x23\xa9\x0a\x8b\x40\x9d\xd8\xd3\xe7\x89\x4e\x81\x70\x6c\xeb\x7b\xf7\xec\xbd\x7b\x77\xe3\x40\x58\xc9\xfa\x03\x8b\x28\x8e\x11\xdb\x8f\xcf\x2f\xd7\x2d\xd8\xc9\x6d\xf2\x34\xfb\x28\x79\xf6\x43\x75\x7c\x62\x63\x1f\x87\xf5\xe6\xd7\xb6\xbb\x38\x58\x87\x89\xe7\xe4\x69\x6c\xc2\x03\xfd\xc9\x66\xcf\x82\x6e\x4f\x96\xc7\x9f\x1c\xaf\x8e\x36\x27\xf7\xef\x5b\xf6\x8e\x93\xe5\xe9\xa6\x97\x7a\x8e\x36\x7b\xde\xf3\xcd\x1b\xcd\x50\x4a\x8b\x96\x7f\x9d\x9d\x22\xe9\x32\x7a\x0b\xf9\x52\xb8\xa3\x11\xb1\x3f\x8d\x32\xc8\xc9\x9d\x27\x3b\x68\xa8\xdf\xfd\xf7\x0f\x47\x77\x14\xb7\x12\x06\x34\xde\x1f\x5d\xfe\x63\x24\x7a\x3b\xe6\xbe\x66\x9a\x73\xe7\xce\x93\xa7\xfe\x99\xd0\xc9\x1e\x3a\x43\xb4\x13\xb4\x84\x82\x43\x63\x27\x88\xc5\xba\x9c\x5e\x37\xec\x6e\xfb\x01\xba\xbb\x5e\xf9\x28\x12\xac\xde\xbc\x41\x3a\x38\x3d\x3d\x5d\x11\xd6\xef\xd1\xdd\x73\x90\xb0\xf7\x8f\x86\xe9\xfc\x28\xce\xe0\xbb\x77\x8f\xdf\xbc\xb9\xbb\x5a\xff\xe6\x9f\xef\x7e\x72\x38\x71\xad\x4c\xdc\xe5\x6e\xe2\x2e\x47\x13\xf7\xce\xa6\x9f\x88\xbf\x79\xc8\x7b\xe5\x65\x33\x73\xf1\xe4\xf2\xf4\x4f\xf2\x01\xc9\x9a\xb5\x7b\x4e\x69\x7e\x7e\xed\x9e\x79\xef\xde\xe5\xa3\xcb\x7e\x2e\x5c\xee\xa7\x42\x9c\x72\x9b\x47\x97\x6f\xde\x3c\x7d\xf6\xf0\xf2\xde\xbd\x78\x67\xd7\x51\x9f\x5f\xd8\xe5\xd4\xec\x37\xc1\x30\x7f\xe4\x53\x1f\xe8\xed\xd3\xcd\x33\x11\x83\x1e\xc5\x7f\x1f\xf6\x1b\x72\xfc\xff\xed\x89\x3d\x7d\xfa\x6c\x92\xff\x64\x19\x8e\x96\x1f\xb7\xb6\x7b\xbe\xf1\x61\xe7\x86\xfe\x99\x5c\x0b\x56\x20\x8a\x17\x7b\x59\xe3\x7c\xb3\xbe\x7e\xf9\x30\x61\xcc\x76\x95\x4f\x56\xa7\xcb\xab\x6f\xec\x37\xc9\x4f\x1c\x4b\xf7\xee\x4d\xd8\xfa\x64\xee\xdd\x15\x31\xe4\xce\xbe\x4e\xe4\x49\xfd\xc7\xbc\xe5\x36\xd4\xfb\x76\xef\xb9\x78\xc7\x4f\xe1\xf2\xfb\x06\xdc\xf6\x80\xc1\x82\x7d\x7b\xfb\x1e\x0d\x8d\x79\xba\x7b\xea\xb3\x87\x3e\xb9\xf8\xc4\xca\xc9\xb7\xc1\x45\x4f\x5a\xd5\xff\xe4\x9f\xaa\x67\x7d\x4e\xd6\x93\x2b\x09\x78\x38\x9c\xb7\x57\xfd\x79\xbb\x3e\xbd\x3a\xe0\x98\xbb\xd3\x75\xcf\x31\xdf\xa4\x37\xe8\x4e\x96\xbd\xa8\x7b\xb9\x63\x8b\xaf\x8f\x7f\xb8\xfa\xd8\x1f\x5d\xef\x4f\xe6\xab\x84\x2d\xfe\x88\xd4\x94\x3b\x37\xf2\x7b\xf7\xec\x60\x99\xf4\x47\xf6\x64\x73\x5f\x1f\x3f\xb4\x6f\x8f\x9e\xfa\x67\x27\xb2\x13\xf4\x47\xd3\x4d\x87\xcc\x69\x22\x4a\x6e\x8f\x4f\xec\xcc\xca\xdd\xec\x57\xee\xe6\xe4\xf2\xf4\xc8\xbe\x7b\xe5\x9e\xac\x4f\xb7\x9f\x2c\x1f\x1d\x8d\x16\x70\xfc\xf1\xb6\x53\xe7\x8e\x3d\x58\xbc\xf3\x07\xc9\xf1\x43\xcb\x31\x97\xb0\x80\xc3\xf1\x7c\xb4\x13\x41\x45\xbd\x7b\xdc\x1f\x77\xcf\x67\x8e\xe8\xf5\xc9\x2a\xcd\x81\x72\xc3\x9a\x57\xc7\x27\x57\x49\x3f\x1e\x9c\x24\xfb\x70\xb7\x3f\x41\x90\xf2\xa7\xbb\x07\x1f\xf9\x93\xe5\x53\xf5\xec\x64\xf9\x54\xc7\xc2\x3c\xdb\xcd\x07\x2b\x62\x92\x9d\x17\x93\x3e\xf2\xb1\x75\xf0\x83\x07\x7b\x71\x4f\xf1\x3c\x65\x17\xf9\xf4\x78\x37\x56\x8b\x82\xe7\xcc\xcc\x18\x4e\x89\xe4\x30\x8c\xbf\xc7\x1a\xd7\xab\x5b\x0e\xae\x1b\xce\x2d\x1d\xef\xbc\xe3\xd8\xd2\xc3\xd3\xd7\x37\x30\xcc\x38\x67\xec\x99\xe6\xc4\xd7\xf3\xcd\x9b\xbb\xeb\x0d\xd2\xfd\x7e\x47\x5c\xa7\x75\xed\xe9\xf2\xe9\xe5\x83\x0d\x1e\x45\x22\xf2\xdf\xbf\x7f\x79\x62\xe7\x7c\xa9\xed\xbc\x5b\xf8\xc4\xc3\x7b\x93\x68\x67\xe2\xbe\x85\x92\x10\x83\x71\x5c\x02\x77\x76\x66\xe5\x59\x4d\xcc\xe3\xeb\xab\xed\x3e\xb8\xcb\x47\xab\xf5\xca\xbf\x78\xb9\x7d\xfd\x51\x6f\xb5\x0f\x1f\x0d\x3c\x68\xdc\xae\x5f\xf8\xcd\xb9\xef\x2d\x35\x57\x27\xdd\xbf\x31\x96\xc8\xf5\xe9\xd3\x67\x27\xee\xb4\x3d\xf2\xfb\x89\xea\xfa\x89\x7a\x75\xea\x0e\x26\xea\xc5\xe9\x55\x3f\x51\x93\x5d\xe2\xe2\xf8\xd1\xd1\xe6\xf4\xf2\x64\x79\x7a\xf1\xf4\xd3\x67\xf7\xee\x5d\x4c\x6d\x0a\xc4\x24\xb8\x96\x8d\x73\xc2\x1a\x7f\x75\x74\x31\x18\x44\x06\x36\xb2\x3b\x59\xc7\x15\xdd\xd3\xef\xd6\xf1\xc5\x5e\x4d\xf0\xf2\xf8\x07\xf7\xb1\x3f\x7a\xb9\x9f\xff\x2e\x9d\xff\x5f\x1d\x5d\xf7\xa6\xb6\x55\xbf\x6b\x58\xd4\xd0\x6f\x22\xe7\x7b\xfc\xf6\xe4\xf9\x94\xc9\x1e\x45\x26\xdd\x2d\xf4\x93\xd5\x60\x8a\xb5\x2f\x5f\x5e\xbe\x96\x50\xa7\xbb\x98\x18\xbd\x04\xcf\x11\xf7\x2f\x89\xa7\xa6\xc6\x16\x38\xaf\xb1\xbf\x7b\xbc\x9b\xba\x71\x9b\x8b\xcf\xfb\x61\xd8\xe0\xee\xa8\xb9\x9d\xed\x93\x49\x77\x8d\x75\x0e\x9b\xd3\x9d\xe6\x6d\xe7\x56\xd4\x07\xad\x3e\x3e\x59\xa6\xc1\x70\x6f\x4d\xca\xa9\x3f\xd9\xfe\xd2\x3f\x30\x9f\xdc\xbf\xbf\x3d\xde\xa9\xef\x8e\xb6\xbf\x54\x6f\xde\x4c\xa9\x7f\x79\xba\x7d\x24\x24\x0f\xf7\xd1\x41\xb6\xcf\x22\x27\xbe\x8a\xa2\xd4\x00\xc3\x39\x1e\xd2\x17\x7d\xd2\xeb\x26\x6f\x3a\x83\x63\xc5\xfe\x14\x9e\xf8\x33\x09\x5f\x6f\x4f\x87\xdb\x12\x50\x91\x09\xd6\xff\x33\xb6\x49\xed\x2c\xba\xa7\xfa\x93\xcb\x5d\x58\x95\x4f\xee\xdf\x1f\xc2\x5c\x9c\xce\x55\x7b\x7a\xf9\x40\x3f\xfb\x64\x1d\x25\x89\xa7\xeb\x67\xa7\xab\xa7\x97\xcf\xfa\x0c\x30\xc3\xde\x7f\x67\xb5\x67\xe7\xfa\x20\xf1\xbb\x29\xf2\xab\xbe\xb7\x87\xc8\xdd\x89\x18\xd3\x0f\xc3\x28\x6d\x8b\x3c\x32\x9e\x75\x63\xe2\xed\xf1\xc9\x2a\x4e\xcb\xc9\xe6\xbb\xdf\x76\x53\x59\xa8\x8f\xde\x1c\xe9\xa7\xfc\xf6\x0d\x9a\x60\xdf\xbf\x78\x98\xe6\x03\x9f\x3b\x3f\xad\x77\xce\xa7\xc9\x89\x77\xb2\xed\x13\xcd\xfa\xf4\x88\xdd\xdb\x4c\xd2\xf6\xf9\x93\xff\x47\x02\x60\xd2\xc4\x39\x66\x63\x77\x40\xb2\x83\x8f\xda\xbb\x73\xb1\x7b\x84\xb9\x5f\xc0\x66\x07\x43\x8d\x2b\xed\xae\x79\xc7\x0f\xfd\x7d\x71\x07\xfb\xec\x68\x7b\x72\xf7\xcb\x21\xca\xd7\xf1\xa3\xc9\xe2\x19\x38\x01\xa2\x73\xfa\xf7\x5c\x1e\xab\x71\xce\xda\xe5\xa9\xfa\x64\xf9\x4b\xff\xc9\xf2\xfe\xfd\xe3\x55\x94\x35\xf6\xcb\x60\xc9\x71\xb2\x19\x10\x0b\xb7\x72\x9e\x47\x76\x76\xb6\xaf\x64\xcf\xb3\xc7\xc7\x0f\x8f\xe2\xb4\xe3\xdd\x7d\xb3\xf1\xab\x8c\xeb\x01\xff\xca\xfd\x6c\x57\x9f\x5c\xfe\x72\x93\xce\xf6\xcd\xd3\xcb\x67\xcc\xe7\xf8\x0f\x53\xfa\xbe\x7e\xb6\x9f\x88\xfd\xb0\xf7\x52\xfa\xea\xf8\xed\xf1\x54\x45\xd7\xa3\xa3\x2e\x96\x57\x64\xf0\x7e\xf8\xb7\xef\xb7\x79\xb5\xc9\xde\x78\xf0\x2a\x4a\x62\xbb\xa3\xdc\x8a\x30\x7e\x22\x31\x51\xc0\x05\x2c\x07\x5f\xe3\xfb\x24\x70\xbe\xfc\xe5\xe9\x2e\xae\x52\xb6\xcb\x84\x00\x9f\x79\xf7\x2e\xd1\xf8\x2e\x4f\x37\x8f\xc6\x20\xdb\xcd\x6e\x0b\xdd\x1e\x3f\x7c\xa0\x8f\x47\xe9\x1b\x47\xca\xec\x77\x89\x50\xb3\xaa\x76\x19\x86\xf8\xfe\xc8\x20\xdc\xfd\x07\x8e\xa5\x81\x99\xf8\x07\x1a\x75\xf7\x1e\x3f\xbe\x79\xa3\x4e\x4f\xef\xdb\x7d\xb3\x95\x44\x5f\x5a\x9f\xa0\x0b\xbc\xfb\x7f\xd2\xaa\xe3\x03\x61\x7d\xba\x7a\xba\x0f\x28\xf5\xac\xff\xa2\xf5\x89\x3a\x49\x7e\x37\xe2\x9e\x7b\xf7\x7f\xde\xfc\x9c\xab\xd9\xe7\x5c\x8d\x9f\x72\x3f\xd9\x18\x79\xa2\x3d\xbd\x6f\x4f\xee\x88\xa0\x68\x65\xeb\xb1\xbf\x4a\xc6\xe1\xe7\xed\x4e\x2b\x9d\xf9\x0e\x13\x4d\xef\x95\x9c\x3c\xe1\xed\x5b\xc1\x6e\xa4\x1b\xdc\xb0\x43\x3e\x52\x0f\x57\xc7\x27\xcb\xb8\x71\x1d\xf2\xcf\x72\xd6\x8f\xb7\xd7\xdd\xc4\x15\x7e\x7a\x7e\x47\x1d\xc4\x81\xd1\x3a\x5a\x46\xce\xcb\xa6\xfb\x18\xfc\xea\xce\x30\x73\x94\x18\xd2\x1e\xe8\x87\xdb\xe3\x5f\xfd\xea\x57\xea\xe4\x26\xa9\x71\x93\xae\xcb\xc8\x7e\xcf\x60\x16\x40\xc4\xec\xa2\x54\x9c\xcf\xcd\xfc\xcb\xc1\x8a\x7f\x7c\xbc\xcf\xe3\xaf\x23\x77\x2e\x68\x88\xcd\xee\x1c\x94\x00\xba\x7b\x54\x4f\x7c\x6c\xff\xf9\xcb\x1b\xf1\x02\x82\xfb\x1e\xda\x76\xb4\x3a\x4d\x9a\x77\x7c\xfc\x36\xde\x3c\x3d\xdd\xec\x32\x1d\xdd\x49\xed\x60\xfe\x04\x69\x72\x75\x7c\xef\x5e\xff\x11\x77\xef\x1e\x3f\x7c\xd7\xf7\xc8\x77\xec\xd5\x81\x27\xcb\xe1\xab\xb6\x13\x8c\xcb\x72\xe7\x1f\xad\xe2\x06\xb0\x7c\x9b\x28\xec\x25\xfe\xc1\xa7\x9f\x7d\xfe\xeb\x07\x7f\xf8\xee\x8f\x7f\xfa\xdf\xff\xfc\x2f\xd6\x9f\x3f\x78\xb1\x7e\xf9\x7f\x5f\xff\xf5\xd9\x9b\xee\xe8\xd1\x9d\x5d\x10\x84\x37\xd7\xf1\xea\x36\xd0\xe0\xab\x31\x81\x79\x7b\x3c\x36\x01\xca\x3c\xbb\xfb\x99\x04\x63\xd0\x91\xdd\x39\x3d\x3d\x7d\xbc\x83\xb9\xc5\xed\xe0\x1d\x93\xbe\x0f\xc0\xb3\x9f\xf5\xf1\xc8\x98\x7a\xf8\x4e\xfd\x79\xc7\x9f\x7b\xfd\xc3\x51\xd2\xec\xe3\xb7\xbf\x38\x88\xb1\x25\x2a\x96\x3f\xf7\x1e\xd1\xf1\xe4\xfb\x95\xd6\x3a\xd7\x5a\xbf\xcb\x6c\x3a\xf8\x9d\x50\xbc\x5c\x2f\x57\xdb\x69\x53\x79\xdc\x2f\x4f\xf1\x84\xde\x0b\x5c\x7b\x57\xe8\x3f\x1e\xfd\x15\xf4\x53\xa4\xfb\xfd\x2d\x0c\xf7\xf5\xdd\xe3\xf7\xe9\xb7\xc4\x84\x3a\xd3\x36\xdb\xae\xff\xe2\x3f\x8a\x5d\xf2\xe5\x97\x5f\x7e\xf9\x96\x10\x04\xeb\xeb\xad\x58\x31\xaf\x0f\x3c\xa7\x6f\xed\xd7\xa7\x04\xcf\x58\x3c\xfb\xc5\x5c\x80\xd6\xd8\x93\x8f\xee\x3e\x5d\x2c\xae\x16\x8b\x27\xcf\xee\xc6\x07\xb4\x8b\xc5\x67\x77\xdf\x9e\xfc\xb0\x7f\xe8\xd3\x83\x67\x26\x20\x9e\x5f\x9c\xfc\x26\xa5\x3d\x3a\xa0\xbd\xba\xff\xe6\x7f\x3c\xfd\xd7\xc5\xea\xd9\xff\x5a\xac\x1e\x41\x8d\x2d\xe6\xee\xab\x03\xca\x8f\x7f\x71\x98\x4c\x63\xdf\xb6\xb7\x43\xc5\xab\xf4\x83\x3f\x3e\x9c\x47\xcf\xf7\xa8\xd7\x19\x87\xfa\x93\xb8\x2d\xca\x81\xc1\x34\x9a\x1c\xc9\xbd\x44\x36\x03\x3d\xdb\x9e\x40\x7f\x5f\x3f\xbc\xef\x51\x8f\x9c\xce\xec\x78\x58\xa5\x37\x6f\xde\x6c\x7e\x75\xf0\x98\x43\x79\xfc\xa7\x1e\x49\x32\x5f\x77\x87\xe8\xc8\x93\x3c\x55\x12\x6c\xf6\x6e\x16\xcb\x3d\xfa\x6c\x67\x31\xe8\x3b\xa1\xc7\xa4\x2d\x9f\x25\xc0\xa9\xe3\xd1\xf8\xcf\x2d\xd6\xa3\x85\xbb\x3f\xb7\x89\xdc\x39\x62\xeb\xb8\x77\xef\x17\xff\x8a\x5e\x60\x80\x14\xc5\xae\xbb\x77\x8f\x9e\xfb\xe5\x61\x17\xef\x01\xf1\x77\xd5\xdd\x3b\xb2\x09\xbd\x07\xf8\x60\xdd\x6d\xed\xe5\xb0\xf5\xac\x37\x1f\xb5\x3f\xad\x0f\x59\xa8\x3f\x66\x49\x1d\x2d\x1e\x7d\xfb\xe8\xd6\x59\xc6\x3c\x48\x66\xd9\x7b\x7c\xcc\x72\xb5\xf5\xe7\x7e\xf3\x91\xbd\xfa\xa8\xef\x1a\x1c\x9a\xe7\xf6\xa9\x3b\xef\x10\x6f\xef\x4a\x77\x0e\xdb\xf9\x9b\x37\x77\x77\xb0\xe4\xe1\xb7\xf7\x69\xd1\xc6\x93\x0b\xd7\x7d\xf4\xfd\x7a\xe3\xde\xa7\x5d\x13\x58\xcd\xbb\x96\xd2\x7b\x34\xe1\x2a\xbe\x89\xd7\x85\xf5\xe6\xa3\x17\xd7\x97\xdb\xe5\xcb\x4b\x2f\xa3\x79\x75\xd3\x70\x1e\x4e\xaf\x5e\x7f\xae\x9f\xf5\x29\x12\x26\x36\xff\xd3\x3b\xea\x24\xee\x5c\xb7\x6f\x64\x47\xa2\xf2\x3a\x3c\x96\x76\x2b\x71\xfe\x44\x88\x62\x21\xc1\x4a\x1e\x1e\xdd\xd0\x32\x91\xc4\xee\x1e\xb1\xee\x26\x61\x30\x56\xe9\x5c\xa4\x51\x7b\xbf\xb7\xaf\x6e\x08\x87\x58\x17\x8d\x7e\x38\xe6\xcd\x06\xb2\xa7\xbd\xbb\xea\xef\x56\x9f\xba\x4b\xfb\xe2\xee\x49\xef\x2b\x72\x77\x71\xed\xea\xcc\x3e\x5d\x5c\x3b\x27\x41\x57\x5c\x11\xd8\x74\x77\xf4\xfe\xdc\xdb\xd5\xd9\x37\xf8\x37\x5d\x8d\x2b\x2a\x95\x56\xcc\x26\x15\x2f\xd6\x93\xf7\xa8\x22\x92\x87\x3e\xb8\xcb\x94\xfc\xb2\xbb\xf0\x2f\x96\x9d\xbd\x3c\x13\x47\xa1\xc9\xbb\x32\x97\x56\xae\xa6\x95\x5f\x5e\xd8\xd6\x6f\x97\xdd\xd9\xb7\x71\xfa\xae\xb6\xc4\x60\x3a\xfb\x72\xbd\x79\x71\x75\xf7\x84\xb0\x24\x8b\xeb\xd0\x52\x3b\xb4\x79\x18\x55\x5e\xd9\xed\xfa\x72\x69\x57\x67\xbf\x5d\xfa\xcd\xfa\xfc\xf2\xf5\xcb\x8b\xc9\xcb\xb5\x4e\xc2\xd2\xf8\xe9\xcb\x57\xdd\xd2\xaf\xb6\x67\xbf\xd9\x78\xff\xfc\xec\xf1\xf5\x15\x1f\xf1\xcd\x5a\xda\x30\xf9\x8a\x3c\x3e\xc8\xf7\x0f\xca\x6f\x7b\xd0\x6d\x3d\x9e\x4b\x8f\xd7\xf3\xf5\x67\xfb\xaf\xaf\xd9\x48\xcd\x6e\x52\x73\x63\xdb\x65\xb7\xeb\x28\x55\xd2\x40\x55\x86\x70\x48\x75\xf6\xeb\x57\x5b\xbf\x72\xde\x9d\x7d\xba\xaf\x50\x5b\x2a\xd4\xb3\x15\x1e\xdb\xed\x85\x7f\x61\xb7\xf4\x4b\x32\x54\xf3\xe3\xdc\xa6\x3d\x14\xe6\xda\x39\x33\xc6\x49\x5b\x42\x5b\x30\xca\x6e\xb6\x2d\x33\x55\x3f\xdb\x57\xf5\x15\x55\xfd\x6c\xd5\x27\xd7\x2f\xfb\x98\xfd\xfb\xef\xae\x78\x97\xaa\xaa\x49\x85\x17\x7e\xb5\xb4\xab\x3d\x5d\x91\x41\x57\xd4\x13\xba\xcd\xfa\xfb\xfd\xfc\x34\x9a\xd1\x31\x7a\xf2\xfa\xbf\xf8\xab\xad\x9d\x4c\x24\x65\x6e\x59\x4b\x9f\xd9\xcb\xe5\xca\x5f\xf9\xdd\x93\xb5\xcc\x7c\xdd\x8e\xdb\xf9\x99\x7d\x71\xfd\x62\x47\x64\x4b\x06\xd1\x4e\x46\x1d\xa2\xd1\xc7\x8f\x56\x86\x4d\x57\xc6\x41\x3b\xae\x96\xdd\xd9\xd7\x76\xbb\xdc\x75\x85\x7a\xb0\x78\x35\x6d\xc4\xd5\x95\x3d\xfb\x93\xbd\x98\x7b\xb0\x77\xb3\xf3\xe0\x33\xbb\xb5\xcf\x93\xaf\xeb\xe4\xeb\x26\x0d\xf7\xab\x73\x7b\xb9\xdc\x0f\x42\x53\x33\x08\xcd\x84\xec\xc2\x2e\x9f\x5f\x5d\x3f\x5f\x4e\x3a\xb8\x4a\x3e\xac\x2b\x27\xef\xbf\x5c\x77\xcf\xcf\x7e\xdd\x67\x16\xda\x0f\x60\xc1\x1b\x4c\xd1\x8c\xdf\xb0\x7e\xb9\x7e\xb1\x0e\xeb\x1d\x5d\xa6\x79\x6c\xa6\xcd\x2c\xdd\x6e\x85\x25\x15\xac\x54\x68\x27\x15\x5e\x9d\x7d\xb1\xb1\xdf\x47\x06\x60\xdf\x06\x25\x6d\x98\xf4\xf2\xc6\x5e\xbc\x98\x7e\x62\x9e\x7e\xe2\x64\x57\xfb\x6c\x63\x97\x97\x97\xfe\xec\xdb\x01\x95\xb4\x7b\x81\x04\xeb\x32\x93\xb5\xfe\xd9\xf5\xf9\x64\xce\x59\x99\x73\x56\x4f\xe8\x2e\x96\xfb\x0f\xd3\x15\x5b\x99\xae\x8a\x31\xd1\xeb\xbf\xda\xd5\x76\xb9\xf2\xbb\xed\x74\x7e\xaf\x18\x7d\xc0\x64\x8e\x7c\xfe\x8f\x5f\x9d\x7d\xbe\x7e\xf1\xd2\x6e\x97\xed\xf2\x72\xb9\x7d\xbd\xef\xcd\x4c\xba\x3f\x1b\x7f\xc1\x41\x85\xe9\xf1\xe1\x33\xd9\x1d\xf2\x77\x54\xfb\x9d\xf3\xeb\xf3\x8d\xe5\x14\x19\xea\x36\x72\xf4\xd8\x77\xbd\x72\x5f\xf7\xc6\x25\x57\xf9\x74\xc9\xe9\xc3\xaf\xfe\x83\x75\xb1\xcf\xae\xe6\x76\x2c\xe3\x65\x8a\xfa\xc3\x86\x3c\xd9\x6e\xd6\xcf\xfd\x55\x32\xe9\x3a\x99\x74\xfe\x90\x54\x46\xe3\xec\xd3\x95\x3b\xfb\x36\x32\x1c\xd7\xfd\x59\x37\x54\x55\xd2\xc3\x2a\x3b\xa8\xfa\xc7\xd5\x32\x2c\xbd\x9b\xeb\xa4\x5c\x76\xfd\x26\x1c\xb6\xed\xb0\x96\x2c\x92\xab\xb8\x8d\xef\xf7\xfe\x2c\xe7\x09\xb9\x6b\x7f\xdc\x13\x3e\xdb\xf7\x30\xe1\xe8\xe4\x7c\xad\xcb\xfa\x20\x1c\x1d\x3f\x37\xe9\x00\xb8\xc3\x01\xb8\xf5\x5d\x9f\x8f\x47\x53\x1e\x16\x46\x11\xef\xe2\xcf\x56\x5a\xd0\xcd\xb7\xc0\xa5\xbf\x66\x3f\xb2\x05\x5f\x4c\x5a\x20\x9c\x55\x3e\x79\x45\x3a\xcb\xba\x99\x59\x76\xeb\x2b\x7e\x3d\x79\x85\x3c\xcc\x4c\x3f\x32\xf0\x91\x95\x99\xfd\xc8\x2a\x4b\xbb\xd9\xfe\xc8\x16\x7c\x39\x59\x34\x3c\xcc\xb7\x93\x16\x54\xb9\xb4\xa0\x99\x6f\x41\x7a\xb8\x05\x3f\x69\x81\xdd\x2c\x0f\x4e\x65\x98\x2c\x6f\xe7\x67\x86\xbd\xee\xec\x55\xe4\x33\x3f\xbd\x6c\xed\xea\xb0\x32\x4c\xa6\xcb\x84\x43\x9b\x9c\x38\x9f\x5f\xd8\xe7\x2f\xec\xdc\xfe\x3d\xb0\xdf\xf9\x41\x85\xe4\x68\x97\xbd\xd8\xda\xf1\x36\xfb\xf9\x85\x8f\x4b\x3e\xd9\xb3\x33\x9a\xae\xa7\x3b\x63\x4f\x37\xb7\xa1\xd8\x16\x9e\xc9\xb6\xed\xb4\xca\xd5\xd5\x0d\xbb\xb6\x4f\x39\xbc\xe9\x77\xae\x5f\xb4\xcb\xd5\x72\x75\x7e\xf6\xc5\xd2\x76\x9b\xa5\x30\x8d\x8f\xed\xe6\xf9\x7e\x9f\x50\xb2\x7f\xab\xac\x0c\xef\x59\xf5\xf0\x44\xd5\xb6\x95\xd3\x29\xbc\xf7\x33\xbe\x5c\x6f\xf6\x1f\x34\x6c\xa7\x0a\x06\xc5\xa8\xf7\x7f\xcc\x4c\x1f\x6a\x27\x0c\x8c\xbb\xe9\x29\xbf\xb5\x97\x61\xd2\x09\xc1\x1b\x39\x8d\xcc\xb4\xce\x8b\xf5\xea\xec\x77\x2b\xb7\xec\x7a\x11\x62\x72\x8c\xd9\x9a\x19\x66\xeb\xc9\xde\xbc\x5e\x6d\x37\xeb\xcb\xb3\x6f\x97\x1d\x90\xf5\xfd\x27\xca\x9e\x6a\xf2\x29\xfd\xcb\x6d\x22\x32\x98\x4e\xce\x95\x6e\xfa\x09\x91\xea\xec\xd7\x2f\x6d\xb7\xbd\x4d\xa2\xf1\x7e\x96\xcf\xfb\x7c\x7d\x1d\xd9\x80\xf3\xb3\x3f\xac\x5d\xac\xee\x37\x76\x9e\x07\x08\xe5\xac\x5c\xf8\xf9\xf5\xca\x2f\xc3\x7a\x33\x15\x44\xeb\xc9\x6a\x9f\xad\x33\xb4\xf7\xf0\x94\x1b\x3d\xab\xb9\x85\x89\xfa\xfc\x7a\xb3\xf1\xab\xee\xf5\xcc\xbc\xb1\x32\x6f\xba\x71\x77\xbd\x7e\xb9\x59\xae\xa3\x04\x77\x79\x69\x5b\xbb\x79\x3d\xc7\xf4\x0f\xef\x9a\x6e\xfb\xaf\x37\xcb\xcb\xcb\x54\x8a\x93\x81\x53\xf9\x64\x48\x7a\xba\x39\x39\xce\x38\xc6\xc1\x4c\x27\xe2\x41\x95\xcf\x12\xa9\x21\x17\xa9\xa1\x79\x47\x95\xcf\xf7\xd3\x5d\xe6\x8a\xee\xea\xf9\x2a\x73\x82\x96\x70\xb5\xaa\x18\xcf\xf6\x2f\xfc\x95\xdf\xf8\xed\xdc\x3e\x3a\xf4\xd2\x64\x5b\xfc\xc2\xff\xc5\xae\xec\xb9\xdd\xa4\x72\x81\x3c\xbb\xa9\xc2\x3c\xe5\xe1\xee\x61\x6b\x2f\x6b\x68\xdc\x4f\x5f\x2c\x57\xe7\xad\x4d\x05\x82\x4a\xd6\x4e\x35\xde\x1c\xbf\x88\xc7\xd5\xa4\xd1\xe5\x6d\x8d\x5e\xbf\x58\xae\xd6\x67\xdf\x2d\x2f\xfd\x74\xf6\x77\x54\x93\x33\xa3\x6b\x26\xd5\xae\x5f\x5e\xae\x5f\x4f\x8f\x19\x13\xd2\x37\x4d\xaa\xfc\xda\x6e\x2e\x5f\x9f\x7d\xf1\x7a\x65\xaf\xe2\xba\xbd\x69\xfd\xc8\x9c\xaf\x67\x0f\x9e\x5f\x9f\xbf\x7e\xb9\xbd\x55\x9b\xa2\xba\xb9\xc3\x56\xa5\x3c\x4d\x67\x26\x0f\xbd\x6c\xed\xd5\x0d\x07\x66\x7f\xfe\x4d\x6b\xbc\x58\x6f\x97\xdd\x7a\x35\xab\x46\xba\x41\x01\xf3\xeb\x95\xa4\x08\x13\x25\xc5\x2a\xee\x37\x93\xe9\x78\xd8\xf7\xc3\xeb\xc3\x7b\x3c\x2a\xdd\x54\x4b\xd9\x54\xc7\x13\x68\x57\x2b\xb2\x37\x5f\xfb\x28\x79\xc9\xf6\xf3\x78\xbd\xda\x26\x9c\x72\x66\x84\xbf\x36\x37\x54\xdf\x71\x44\xef\x6c\xfe\x0d\x8a\x96\x5f\x6f\x2f\x96\xeb\x97\xc9\x66\xa2\xe5\x8d\x3a\x1b\x2f\x92\x81\xee\x70\x89\x18\x27\x07\x82\x73\xb7\x57\x48\x76\x1f\x2b\x5a\x0a\xdb\x9a\xf9\x2a\x73\x27\x67\x26\x5b\x49\x36\xde\x7d\x7e\xe3\x57\xf1\xa8\x98\x95\x4d\x8c\xc8\x26\x46\x95\x93\x2a\xeb\x17\x7e\xcb\x78\x5f\xd8\x97\xe9\xf9\x57\xc8\x56\x5d\x84\x5b\xe9\x93\x1e\x98\x51\x5b\xd6\xb3\x47\xcd\x6f\xfc\x7a\x73\x9e\xea\x89\xb4\x1c\x0b\x5a\x1d\xbc\x0b\xba\x19\x36\xa6\x6b\x64\x2b\x6d\xe7\x2b\xcc\x49\x80\x32\x63\x8d\x1b\xf7\xf2\x6f\x2e\xed\xf9\xfa\x72\x39\x3e\xd3\x85\xb2\x2b\x6e\xa0\xbc\x79\x6e\xd5\xb7\xac\xe5\xdf\xac\xb7\x17\xf1\x2d\x87\x5c\x40\x90\x7d\x2c\x4c\x96\xe5\x6f\x36\x76\xb5\xbd\x98\x65\x7e\x6f\xd0\x07\x8b\x06\x35\x2e\x9c\x09\x9b\xa2\xb2\x4a\x58\xc7\x49\x07\x43\x7f\xd8\xbb\xf2\x78\x3d\x11\x48\x7f\x73\xfd\x67\xbb\xb1\xdb\xe4\x04\xb1\xa2\x59\xb2\x53\xba\xd5\x9f\xed\xa5\x3d\xfb\xcd\x7a\xe5\x66\xb5\x4b\x4e\xb8\x16\x37\x91\x6d\x7e\x73\xbd\x79\x71\xfd\xfc\x22\x7d\xbe\x9c\x50\x76\xbc\xf8\x22\x57\xf8\xfd\xd2\x6d\x2f\xf8\xd2\x2f\xaf\x2f\x2f\xe5\x6a\xa2\xb6\x90\x8f\x08\xc1\x4f\x2a\xaf\xce\xaf\x2f\x27\xda\x87\x7f\xb4\x2f\x52\x2d\x55\x26\xf2\x7f\x3d\x57\x71\x44\xaa\x45\xa1\xa5\x27\x9a\xcb\x84\x74\x76\xbd\x37\x7c\xbf\x6d\xa6\x9f\x35\x53\x6b\xcf\x70\xb8\x4a\x84\xb8\x6a\xf6\x5d\xc2\x39\x5d\x26\xeb\xd7\xf6\xd3\xb0\xb2\x53\xfa\x65\x58\x9e\xfd\x61\x7d\xb1\x5c\x9d\xbf\x9e\x4e\xae\xec\x16\xc3\xc6\x6f\xed\xea\x7a\xb5\x4e\x3e\xbe\x32\xa2\xc3\xca\x26\x2f\xd8\x6e\xe6\xb5\xb6\x9d\x9f\x55\x58\xfd\xd6\xb7\x1b\xff\x7d\xc2\xf2\x34\xc2\xf2\x4c\xbe\x73\x79\x7e\x71\xf6\xed\x66\xf9\x17\xbb\xf5\x67\x7f\xbc\x8a\x32\xd9\x66\xb3\x3e\xb7\xdb\xe4\x93\x5d\x2b\xfb\x4d\x3b\x53\x75\x8e\x7c\x08\xbf\x3f\x19\x87\xe5\xc6\x9e\xdb\x95\x4d\xb4\x3a\xb9\x68\x75\xc6\x9b\xed\xef\xbe\xfd\x74\x2f\x77\x27\x52\x9a\x11\xdd\xb8\x19\xf7\x7b\x7a\x34\x7d\xe1\xaf\x08\x08\x8a\x5a\x64\x88\x29\x91\xec\xbc\x21\xb0\xff\x4c\x96\xdf\xe8\x70\xbb\x49\x11\x35\x52\x25\x63\x52\x08\x7e\x76\x0f\xfe\xdd\x8b\x97\x7e\xb3\xb4\x97\x67\x9f\x6e\xec\x0b\x7b\xb0\x2f\xc9\x80\x89\x6e\xa4\x9b\x98\xc6\x44\xc8\x7a\xb2\x7c\x6d\xff\xef\xbc\x6c\x23\xb6\x8c\xae\x92\xda\xed\xb4\xf6\xee\xe3\xe3\x49\x65\x2f\x2e\xed\x5f\xa6\xbb\x84\xb9\x45\xb6\x99\xd6\xdf\x6c\x2f\x0e\x55\x0a\x26\x55\xed\x4c\x9a\xff\x8f\xf6\x2f\x76\xa4\xb1\xb5\xa2\x20\xb7\xcd\xf8\xc8\xfe\xca\x2e\xb7\x17\xf3\xaa\x63\x99\x66\xdd\xc4\x9a\xf4\x95\x5d\xd9\xd1\x7a\x1f\xb1\x9f\xdd\x2d\x4c\x1b\x35\x6f\x3a\x54\x4c\x77\x8b\xb6\xf7\x2b\xbb\x6a\xaf\x13\x05\xa4\x98\x52\x32\xdd\x4c\x3e\x65\x75\xfe\x6a\xb9\x53\x90\x26\x33\x4d\x4e\xba\x30\xfd\xf2\xd5\xca\xba\xfd\x02\x50\xf2\xc1\x6a\x22\xe4\x7e\x65\xb7\xf6\xf9\x78\xa1\x88\xba\x5e\xcd\xd3\x9d\x7d\x7b\xb1\x5e\x61\x01\x9b\x59\x36\x99\x0e\xd2\xf2\x69\xdd\xd7\xf6\xe2\xec\xeb\x65\x32\x58\xc2\x2c\x35\xe3\x63\xfc\xab\x0b\xbb\x59\x5f\x5d\x1c\x0e\x98\x49\xb9\xbd\xc9\x4c\xf8\xea\xe2\x85\xdf\x24\xfb\x99\xf0\x54\x93\x0d\x16\xa2\x03\x41\x56\x37\x2c\x2b\xdd\x4c\x89\xd7\x7f\x3e\xb0\xa8\xdc\x66\xfb\xfc\xea\xe2\xda\xd9\xef\xed\xc1\x39\x99\x27\x6a\xbb\x29\x93\xfa\xb5\xdd\x6f\xc2\x4a\xf4\xda\x6a\xa2\xd7\xc6\xf6\x74\xa6\x67\xf8\xa0\x57\x91\xfe\xd5\x1c\xf5\x9c\x7d\x53\xce\x37\xa5\xab\x5b\xe9\x9d\x5b\xca\x72\xdc\x77\x8f\x7c\xae\x9e\x6d\xd6\xcc\xe1\xa6\xb4\x7c\x86\xc9\x6f\xa3\xff\x3c\x61\xd1\x44\x8e\xe8\x6e\x6d\xd8\x17\xfb\x59\x23\x67\x95\xad\x6e\x6d\xcf\xaf\x13\x96\x5c\x94\x45\xed\x98\x59\xfe\xda\xbf\xec\x2e\x6c\xc2\x85\xca\x57\x76\x93\x56\x23\xc0\x5c\x2e\x9f\xfb\x43\xfd\x87\x74\xa8\xd1\x93\x1a\xcb\x17\xed\x75\x32\xb7\xe4\xb1\xcd\x94\x68\xe5\xed\x66\xba\xaf\x88\x30\xe8\xe7\xf9\xc1\xbe\xca\x67\x83\x60\xf4\x62\x56\x09\x35\x6c\x67\xd3\x69\x36\x54\xbe\x49\x2b\xa3\x6e\xd1\x00\x7d\xbd\xbc\xda\x7f\x90\xcd\xd1\x16\xda\x89\xd4\xf7\xf5\xfa\xfb\xd9\x63\x79\x2f\x21\x8f\xa8\x5f\x77\x37\xe9\x9d\xa5\xfd\x7e\x22\xd3\x7f\xfd\xda\xdd\x70\x30\x38\x33\xcb\xe0\x3c\xb6\x17\xf6\xcf\x76\x35\xbb\x14\x5d\x21\x55\xaa\x83\x2a\x7f\x5e\xaf\xce\x6f\x51\x51\xcc\xcb\x02\x8f\xed\x73\x7b\x65\x37\x73\xcc\xf1\x0d\x2a\xc1\xc7\xf6\xd2\xbe\xb6\x97\x89\x72\x5b\xc9\x61\xa2\xdc\x78\x0d\x3c\xb6\x2b\x67\x53\xd6\x5f\xac\x3a\xaa\x2e\xa6\x64\xcb\xee\xc2\xfa\xf9\x1e\xf2\xdd\x0d\x8d\xd8\x74\x17\x7e\x5a\xa3\xba\xe5\xb4\x7f\x1c\x3f\xd3\xbe\xb8\x45\x16\x98\x87\xdf\x1c\x62\x27\x76\x6a\x89\x59\xdd\x7a\x71\x8b\x66\x73\xf4\xac\xdf\xbf\x94\x30\xbc\xc9\x9a\x14\x11\xdf\x4c\x94\x0a\x8f\xed\x6b\xc1\xff\xdc\xa8\x7c\xbd\x69\xa4\xbc\xf3\xc1\x2e\xdd\x66\x39\xcb\x8f\xf9\x7c\x76\xb6\x3e\xf6\x7e\xeb\x97\x67\x8f\xed\x6b\xff\x3c\xd9\x86\x3a\xd9\x86\x26\x4d\x4b\x68\xe7\xce\x52\x6b\x45\x4d\x67\xa7\xd5\x56\xce\x9f\x7d\xb5\x7c\x6e\x9f\x5f\x2f\xe7\xa0\x50\xc3\x64\x75\xd3\xa6\x6d\xd6\x4b\x51\x8b\x91\x8c\x75\x76\x49\xd9\x59\x75\xd0\xae\xea\xcd\x4a\x31\xa9\xde\xeb\xd4\xa6\x9d\xb2\x8c\x47\xdd\x0c\x4f\xdb\x0f\xf4\x01\xf9\x55\xe7\x2f\x2f\xed\xca\xaf\xaf\xaf\xc6\xf0\x9b\x1d\xc3\x9c\xe8\x28\x3b\xd1\x51\x8e\xe5\xc3\xf7\x78\xc6\xfe\xd8\x32\xc2\x39\x9a\x09\x17\x30\x7e\xc6\xc1\x19\x20\x28\x23\x53\xbe\x47\x25\x18\xfc\x29\x5c\x46\xd4\x45\x66\x3a\x29\x6e\xac\xff\xed\xb2\xdb\xee\x6c\xce\x87\x5b\x54\x98\x28\x24\xb3\x54\x21\x79\x30\xa0\xa3\xb7\x7c\xe7\xbb\x8b\x55\xec\x9b\x7d\xe3\xc4\x46\x65\x26\x8a\x86\xc7\xeb\x83\xd5\x5f\xdc\xc2\x98\x3d\xee\x43\x6a\x9d\x7d\xb7\x5e\xf9\x41\x21\x98\x1c\xe6\xc2\x02\x56\x7a\xf2\x8e\xd5\x39\x78\xb6\xfd\x41\x2a\x02\x9e\xae\xed\x3c\xe1\x8d\x2c\x77\xdf\x38\x11\x40\xa6\xb8\xb7\xc7\x9b\xe9\x9c\xb4\xe9\xba\x9e\x18\xf6\x1e\x5f\x5f\x6e\x6f\x38\x53\x86\x73\xcb\x4e\x6b\xbc\x13\xfa\x71\x83\xf2\xf5\xf1\x6b\xbb\x7a\x61\x13\x8e\x56\x54\x7e\x7a\x22\xb8\xf6\x64\xb3\xaa\x09\x2b\xaa\x89\x89\xc6\xe5\xa0\x46\x62\x07\x11\x46\xd8\x4e\x96\xc0\x37\x5f\x25\x3c\xaa\xac\x34\x35\x61\xbe\xbe\xb1\xad\xdd\xde\x74\x00\x0d\x3c\xc9\xa4\x6f\xbe\xf1\xdf\x9f\x7d\x67\x97\x67\x5f\x5f\x27\xc6\x5b\x59\x84\x7a\x22\xbe\x7d\xe3\xbf\x9f\x6a\x37\x8a\x5b\x18\x96\x59\x9b\xa1\xd1\x85\xb0\x6b\x63\x55\xd0\x37\xd7\x57\x17\xd7\xb3\xe2\x5d\x35\x7b\x22\xfc\xfe\x3c\x35\x4a\xeb\x52\xda\x3b\xb1\x1c\xfd\xfe\xf2\xec\xf3\x8b\xe5\xf3\x65\xc2\x5d\x16\xc2\x5d\x56\x13\x3a\x77\xf6\xdb\xeb\xd5\xf9\x9c\x19\x3e\xbb\x85\x9d\x8b\xf5\x7e\xb7\xb5\x97\x37\xa8\x20\xfb\x4d\xc0\x1c\x56\xfa\x66\xbd\xd9\x5e\x9c\x01\x06\xbc\x81\x59\x98\xe7\xbf\x62\xdd\x6f\xfd\xe6\xc5\x0d\x2f\x2c\x66\x39\xd6\xbe\xd2\xd5\x0d\xac\x5e\x90\x63\x26\xb8\xc3\x5a\x4f\xd6\xe7\x33\xfc\x5e\xf6\x8e\x8f\x7b\xb2\xbe\x7e\xc7\xc7\xcd\x6f\x02\xb1\xee\x77\xd7\x9b\xe7\x07\x1f\x97\xdd\x62\xcf\xfa\xfd\x4b\x39\x48\x76\x3a\x9f\xb3\x3f\xf8\x6e\x7d\xbe\x5a\x8e\x15\xf5\x79\x2e\x36\x92\x31\xc3\xf6\xfb\xcd\xf2\x75\x22\x92\xcb\x21\xa0\x26\xba\xab\xdf\x6f\xe2\x7f\xab\xad\xbd\x3c\xdb\x1b\xe5\x66\xec\x40\xc5\xfc\x47\x5d\xd9\xf3\xe9\xe9\x2e\x46\xc5\x76\x7e\x4a\x5d\xbd\xb0\xab\x03\x1d\xa2\xbe\x65\xfd\x7e\x6b\x2f\xec\xf7\x17\x67\xbf\x7d\xb1\x5e\x9d\xcf\x6d\xa2\xc3\x48\xd5\xd3\x6a\x97\x2f\x5e\x6f\xfc\x6a\x96\xf5\x10\x51\xf0\x60\x41\x7f\x6b\xaf\xcf\x3e\x5f\xae\xce\x7e\x6b\xaf\xe7\x4c\x8e\x37\x70\xb8\xdf\x5e\xd8\xf3\xab\xb3\x6f\x6d\x62\xf2\x14\x3b\x6f\x3d\xee\xe8\x6f\x2f\xec\xf2\x6a\xbb\xbe\x3a\xfb\x62\x79\x35\x3b\xbf\x9d\x9b\xdd\xa2\xbf\xbd\x58\xfb\xd5\x72\x46\x92\x31\xe9\xbe\xae\x0f\x2a\xdd\xa8\x37\xd1\x52\x47\xbb\x69\xfb\x0e\xaa\xcc\x23\x30\x64\x2f\x9a\x00\xc7\xbe\xbd\xb4\xaf\x97\xab\xf3\xb3\xcf\xed\xc6\xcd\x8b\x35\x76\x76\x42\xa4\xfa\xd9\x4f\x37\x7e\xdf\x8b\x5e\x4e\xa2\x30\x31\x1c\x7f\x7b\x65\x2f\xe3\x32\xb8\x4d\x0b\xd8\x9b\x90\x26\x13\xe9\x0f\xfe\xcf\x36\x41\x7f\xda\x46\xe4\xf5\x66\xbc\x66\xfe\x70\xfd\x62\x39\xb0\xf0\x37\xc0\xc3\xb3\x5b\x16\xf9\x1f\xae\x57\xa9\x29\x50\x70\xc2\x7a\xc2\xb7\x3d\xb1\x2f\xec\x66\xb9\x4d\x51\xcf\xc2\x76\xa8\x09\xd2\xe4\x89\xbd\xde\xd8\xab\x8b\xed\x26\x9d\x5c\xa2\x79\xac\xc7\x47\xd7\x93\xb8\x3f\xb8\x79\xd4\x53\xcf\x28\x4f\x36\xc0\x27\x17\xf6\x2f\x37\x00\xab\xe4\x14\x39\x58\x1e\x4f\x2e\xe2\xb6\x6e\x57\x8e\x23\xcf\x6e\xcf\x7a\x20\xcc\xd5\xac\xd5\xdc\xce\xae\xe6\x27\x4b\xe7\x2e\xa6\x5e\x15\x72\xca\x0e\xed\x0c\xd3\x1a\xab\x0b\x7b\x99\x6c\x63\x42\xa7\x26\xc0\x8b\x9e\xec\xec\xd3\x4d\x77\x61\x77\x80\x9e\xe9\xd0\x49\x87\xf8\xf9\x17\xbd\xb0\x97\x97\x7c\xda\xd9\x9f\x38\x29\xb7\x29\x84\x48\x90\xf2\x7e\xac\xdc\xb9\xed\x00\xe9\x0d\x74\x13\xde\xee\xc9\x7a\x63\xcf\x9e\xac\x5f\xbc\xf4\xd3\xdd\xac\xd7\x13\xbb\xd9\x55\xf2\x64\xfd\x7a\xfd\xa2\x5d\xcf\xee\x4a\xc5\x2c\x4b\xf8\x44\xbc\x9d\xce\x76\x7c\xf1\x94\x25\x56\xa6\x15\xfd\xd9\xa4\x1f\x5f\xfa\x6e\x99\x2a\x7c\x83\x98\x16\xc2\x44\xb7\xf2\xe4\x7a\xe5\xec\x04\x39\x2f\x1b\xc3\x04\xde\xb6\x23\x9c\xdd\x4c\x3a\x81\x73\x75\xdd\xa4\xce\x4b\xbf\x11\x9d\xbd\xc8\x23\x4f\xae\xdb\xfe\x32\x31\x4e\xc3\x39\x99\x09\xa7\xba\x7f\x09\x86\x8a\x28\x06\x8d\x24\x38\xb1\x93\x54\xd3\x8f\x39\xac\x94\x8a\x6c\x22\xa0\x4c\x8c\x6f\x73\x95\x3e\x9f\xc3\xef\xdd\xa0\x87\x1f\xd5\x7f\x97\xc2\x41\xcc\x9a\xc6\xde\xd2\xee\x59\x0b\xbe\x48\x4b\xc6\xdf\xd2\xf4\xf7\x93\xfb\xfc\x2d\x42\x44\xf2\xb8\xcd\xeb\xb3\xe9\x8e\x9e\xaa\x1f\x9f\x26\x16\xb7\xf6\x20\x83\xf5\x8f\x78\xe6\x04\x86\x2c\x4a\x8f\xb9\xac\xd8\xe3\x67\x6e\xb7\xeb\xd5\xd9\x93\xe5\xf9\xea\x9f\x36\xcb\xed\x72\xba\x04\xb3\xf2\x16\x18\xed\x93\xd7\x97\xeb\xed\xf2\xec\x1b\x7b\x9e\x00\xa2\xac\xec\xdb\xb6\x1e\x9b\x16\x9e\xbc\xde\x2c\x6d\xa2\x4f\x13\xe9\x53\x55\xf9\x0c\xd5\x2c\x86\xab\x2e\xe5\x38\x18\x6f\x37\xdf\xd9\x73\x7b\xb9\x3e\x4f\xcc\x0f\x72\x90\x4f\xa4\xda\xef\xec\x79\x6b\x57\xdf\x27\x4a\xe7\xaa\x14\xba\x6a\x4a\x37\x1e\xe5\x36\xbf\x4d\x3f\x8b\x10\x95\xca\x50\x22\x6b\x34\xd3\x87\x2e\xcf\xbe\x1b\xc9\x2e\x56\x6c\xbe\xd6\x1e\xd0\xfd\x69\xe9\x13\x74\xac\x20\x03\xac\x75\x07\x74\xff\xfb\xda\xae\xce\xfe\x31\xee\x66\xb7\x08\xb8\x03\x1f\x58\x4c\x5b\xfd\x7c\x33\xaf\x47\xe8\x45\x90\x6e\x4a\xff\x62\x79\x99\xf0\xcc\x72\xd8\x4c\x14\x27\xdf\xd9\xd5\xf9\xf5\x76\x82\x84\xd7\x1d\x00\x69\xa3\x6f\x9b\x82\x52\x13\x2c\xc1\x7a\x25\x1e\x31\xa3\xb3\x33\x85\x2d\x4e\x19\xcd\xef\xfc\xe5\xf5\xf9\x75\x62\x62\x93\x59\x35\x11\xf6\xbe\xbb\xb0\xa9\x81\x4d\x89\x89\x4a\x4d\x70\x75\xdf\x5d\xd8\x04\x34\x21\xbb\x84\x9a\xec\x12\xdf\x2d\x5b\x3f\x62\x52\xa4\x8b\xd5\xe4\x24\xf8\x6e\x19\x96\x2b\x7b\x7e\x91\xc0\x66\x38\xfb\x8c\x9b\x3e\x6e\x73\x71\xbd\x9d\x17\xb0\xeb\x59\x2d\xe2\x77\x1b\xbb\xba\x7a\xb9\xde\x6c\x05\xd8\x65\x5f\xde\xe6\xef\x38\x8c\xe7\xa4\xd3\xfe\x18\xa5\xde\xed\x0d\x02\x65\x3d\xab\x13\x1c\xc0\xf2\x9f\xdb\x95\x75\x80\xd0\xdb\xf5\x66\x79\xbe\x5c\xd9\x01\x34\x91\xe2\xd3\xb4\x60\x47\x75\x39\xfe\xda\xf7\x7a\xc8\x0c\x8e\xa6\x16\xb0\xf5\x84\xeb\xfd\x53\x32\x5a\x56\x00\x9e\xb6\xcc\x26\x24\x9b\xa5\xf8\xea\x3d\xf1\x97\xbe\x1b\x1d\x1f\x41\x06\x38\x78\xf5\xae\x2a\x37\xe9\xb7\xfa\xad\x61\x38\x00\x26\x00\xff\x3f\x79\x77\x83\xa8\x21\xfc\x8c\x9e\x98\x81\xff\xe4\x37\x72\xd2\x4d\xdd\x86\xb4\x34\x73\xbc\x9f\xfd\x93\xdd\xd8\x28\x59\x2c\xb7\xd3\x85\x5c\xde\x22\x58\xfc\xf3\x8c\xf1\xda\xe6\xd8\xba\x6d\x3e\x66\x37\xfe\x79\x39\x07\x86\x11\xf9\xc3\xe6\xf5\x84\xf6\xcf\xc0\xcc\xfd\x2b\x7b\xbe\xb1\x2f\x0e\x54\xb5\xb9\x00\xd4\xf3\x09\x7b\xfa\x2f\x76\x65\x5b\xfb\x57\xbb\x39\x7b\xf2\x7f\xaf\xed\x66\x2a\x95\x96\xb7\xd8\x7b\x77\x2e\xfa\xb3\x62\x48\x3f\xeb\xdb\x10\x27\x72\x3b\x56\xcb\xca\x63\xf7\xe6\x92\xb1\xd2\xfd\xcd\xde\xa2\x72\x50\xd1\xa5\x58\xd9\xac\xff\xd5\x98\x39\xdd\xaf\x49\xd5\x17\xae\x1e\x7e\xed\x26\x1e\x1a\x6f\xf6\x60\xb7\xbd\x1b\xc6\x58\xa8\x7e\xb3\x07\x82\x24\x9e\x1a\x6f\x12\x47\x88\x6a\xff\x6a\xb6\x5c\xf9\xf8\xba\xce\x66\x7d\x52\xea\xd4\xe7\x4d\x90\x72\xcf\xde\x9e\x90\x51\xfa\x1d\xbe\xdf\x91\x8d\xbb\x5c\xda\xab\x87\x77\x7f\xbf\xbd\xf0\x9b\xbb\x27\xcb\xab\xcf\x5e\xbc\xfc\xda\x5e\x6d\x1f\xde\x51\xfd\x48\xab\x07\x8b\x57\x3a\x2c\x5e\x55\xe1\xc1\xe2\x55\x13\x16\xaf\xac\x03\x34\x57\x53\x36\xb1\x94\x9d\x37\xab\x33\xca\x96\x12\x22\x6b\xc4\xd1\x35\x96\x45\x45\x59\xe3\xf3\xda\x52\x76\x02\x69\x8a\x65\x57\x03\x6c\xea\x42\x2c\x7d\xcb\x85\xf7\x60\x9d\x0a\xfc\x8e\x55\x11\x4b\xdd\x51\xc6\x87\x97\xce\xc1\x71\x78\xca\x00\xdb\xd1\x52\x76\x1c\x03\xa6\x3f\x0d\xd0\xae\x72\x23\xc4\x1b\xb5\xf1\x94\x41\xa4\x50\xac\x7f\xfc\x5e\x38\xb1\x04\xc2\x8e\xd0\x80\xba\xe1\xa2\x8d\x6f\xae\xa5\x81\xb5\x8b\x5f\x54\x7b\x83\xef\x68\x4e\xe9\x28\xe3\x53\x9b\x46\x53\x72\xd7\xc6\xae\x69\x5a\x7e\x69\x33\xd0\xe4\x3c\xa9\x69\x2d\x65\x6c\x52\xd3\xf1\x4b\x57\x52\x52\xa1\xe3\x6e\x17\xa8\xe0\xb8\xe1\x6a\xb9\xa0\x86\xe3\x45\x9e\x57\xfb\x42\x7c\x57\x05\x0e\x48\x99\x53\xd2\x7c\x4b\xd7\x58\xad\x29\x63\x9b\xac\x89\xaf\xb0\x19\xbf\x64\x90\x66\x15\xa5\xa5\x6c\x29\xe3\xf7\xd8\x9c\x16\xdb\xbc\xa4\xa4\x5a\x0e\x51\xee\xb9\x51\xf0\xba\xc2\xc8\x45\x4d\x49\xc5\x82\x96\xdb\xb2\x00\x9c\x58\x3d\x10\x28\x24\x25\x2f\xa4\xa3\x2c\x5d\x64\xe9\x22\x4b\x17\xd9\x96\xbb\xf4\x8d\xa5\x6f\x2c\xbd\x62\xe9\x0f\xdb\x51\x8b\xd9\x61\x9d\xe6\xa1\x8e\x0b\x3a\xc2\xd2\x11\x36\x48\x6b\x42\x2d\x3a\x40\xca\x9c\xd2\x51\xc6\x67\xb4\x74\x47\x4b\x77\xb4\x74\x47\x4b\x77\xb4\x74\x47\x4b\x47\xb4\x74\x44\x9b\x17\x94\x25\x25\x94\xf4\x40\x2b\x3d\xd0\x16\x54\x28\x6a\xb9\xa0\x46\xc1\x1b\x4a\x6e\xd0\x01\x6d\x25\xb7\x6b\x5e\x41\x07\xb4\x75\x2b\x3f\xd1\x26\x26\x4c\xdb\x94\xfc\xd4\xd0\xf0\x86\x47\x35\xdc\x16\x17\xfa\x96\x65\xd4\xda\x42\x2e\x2a\x4a\x79\x0a\x6b\xb1\x6d\x2d\x17\x2d\x17\x1d\x23\xd7\x32\xb3\x5a\xe6\x54\x4b\xef\xb5\xf4\x5e\x2b\xbd\xd7\x32\xb3\x5a\x99\x59\x2d\xdd\xd7\x86\xb6\xe7\x00\x61\xb9\xe2\xb3\x3a\x3a\xab\xa3\x9b\xba\x8c\x97\x74\x59\x5c\x2c\x1d\x7d\xd3\xd1\x2b\x9d\xf4\x47\x47\x7f\x74\xac\xf2\xae\x68\xe5\x27\x1e\x45\x7f\x74\xf4\x87\x58\xc2\x55\x57\x95\x20\xa7\x78\x07\x5d\xd0\x31\x15\x3a\x26\x41\xc7\x24\xe8\x98\x04\x1d\x9f\xd1\xf1\x19\x5d\x27\x2f\x72\x10\xb9\x4a\x2e\x78\x06\x73\xa1\x63\x2e\x74\x7c\x4c\x17\x14\x65\xd6\x63\xb3\x80\x04\x44\x52\xc7\x27\x39\xda\xef\x68\xbf\xc0\x17\x94\x2b\xe2\xee\xe5\x68\xac\xa3\xb1\x8e\x69\xeb\x18\x35\xd7\xf0\x3a\xd7\x50\xa3\x35\x94\x1d\xa5\xa7\xe4\x0d\x9d\x10\xd1\x5a\xd7\xb5\x72\xc1\x7d\xc7\x03\x5d\xec\x1c\xd1\xca\x28\x47\x3b\x1d\xed\x74\x81\x46\xc9\x4e\xe7\x99\xb9\x3e\xa3\xba\xcf\x62\x75\x5f\x74\x0f\x04\xcf\x44\x99\x51\x16\x94\xb1\x93\xbc\xcd\x29\x63\xa7\x7a\xda\xc3\x31\xa9\x3c\x9d\xe7\xbb\x8a\x92\xdf\x99\x03\xde\x59\x4a\xea\x4a\x6b\x3c\x5d\x14\xf2\x38\x03\x43\xe9\xe0\x7e\xab\xf8\xb6\xc0\xa4\x0c\x4c\xad\xd0\x51\xba\xb6\x67\x8e\x17\xd7\x5a\xc5\x45\xaa\x15\x9b\xa3\x56\x5d\x47\xe9\x29\xe3\x6d\x13\x7b\x58\x9b\xdc\x53\xf2\x4b\x9c\x20\xda\x14\xfc\x5e\xf0\x7b\xc1\xef\x35\xbf\xd4\xfc\x52\xf3\x4b\xdc\x17\xb4\x69\x4b\x4a\x6a\xb5\xfc\xde\xf1\x3b\x2f\x36\x1d\xbf\xc7\x7e\xd5\x59\x1c\x59\x9d\xe9\x92\x92\x5f\xe2\xaa\xd4\x59\xdc\xde\x75\x56\xb9\xde\x57\x01\xd7\x00\xdb\x7b\x08\xe0\xd8\x48\x8d\x40\x8d\xe0\xc5\xd5\x11\x1b\x94\xeb\x4d\x51\x28\x36\x9b\x5e\xbf\x89\x34\xea\x10\x46\x8b\x5e\x26\x05\xe8\x5b\xf5\x78\x5f\x3c\xd7\xf3\xde\x81\x1d\x91\x14\xe2\x4a\x53\xe6\xbd\x78\x1a\xcb\xb8\x93\xeb\xca\xf1\xbf\xa7\x41\x95\xe7\x22\xd8\x1e\x6b\x87\x99\xd6\x53\xf2\xbf\xe6\x46\xcd\x1b\xeb\x8a\x16\xd5\x3c\xab\x66\x3b\xd0\xb5\xe5\x22\x94\x3d\x67\x1d\xa5\x56\x88\x1b\xd3\x21\xc2\x1a\x2e\x32\xb9\xa0\xad\x4d\xae\x05\x4f\x95\xc5\xb2\xf4\x94\xdc\xa8\x8a\x5e\xea\x8d\xa5\x95\x2a\x3c\xbf\xe9\x68\x46\xc3\x08\x37\xcc\x06\xdd\xc4\x75\xa8\x6d\x3c\x9e\xb5\xd5\xfc\xcf\xd7\xdb\x8a\xff\xab\xf8\x5c\x5b\x53\xcf\x32\xba\x56\x86\xc0\xd2\xbb\xd6\x7a\x11\x9c\x63\xd9\xe9\xde\x09\x73\x71\xad\xdb\x9c\xf7\xb6\x4c\x9d\x56\x86\xb0\xa5\x45\x6d\xc8\x25\xbe\x43\x1c\xe2\x2e\x63\xfe\x75\x71\xf7\xd6\x5d\x6e\x05\x78\xd6\xe1\x4f\xd6\xf4\x6e\x65\x78\x44\x40\xdc\x72\x43\xa6\x6c\xc7\x47\x74\x6c\x7d\x9a\x7d\x42\xbb\x10\x9f\x12\x98\x47\x81\x79\x14\xb4\xa7\x8c\x77\x43\xce\xef\x39\xbf\x33\xaf\x03\x8d\x0b\xf1\x0c\xd4\xa1\xa0\x2e\x33\x2e\x30\xbb\x43\x25\x25\x34\xf1\xfc\xd7\xa1\xa3\x8c\xbb\x98\x0e\x4e\xfe\x87\x3e\x6e\x05\x3a\xc4\xad\x40\x87\x50\x88\x8f\x01\xbe\x29\x2d\xea\x3f\xc5\x85\xb1\x5c\x44\x26\xc6\x28\x01\xfa\xa9\x92\x3b\x95\xa1\xcc\x62\x59\xf3\x0b\x13\xd8\xa8\x86\x0b\x41\x74\xb0\x2c\x8d\x0a\xba\xf7\x50\xc5\x80\xdb\xf5\x76\xdc\xc5\xb5\xc9\x4d\xd5\x3b\x76\x62\x6c\x6b\x7b\x63\xdb\xe2\xda\xb4\x55\x4e\x59\xc4\xb2\x29\x17\xd7\xa6\x8b\xb3\xc9\xb0\xc9\x9b\x8e\xe1\x30\x5d\x3c\x7b\x8d\x33\x25\x65\x2d\x3e\x25\x1d\xa5\x17\xff\x92\x58\x96\x72\xa3\xe4\xa7\x4a\x8b\x08\xcd\x05\xbb\xac\x71\xb4\xd8\xc5\x83\xce\x38\xcb\xff\x2d\xff\xb7\xfc\xdf\xf1\x3f\x1f\xc2\x8e\x6a\x5c\x5c\x43\xc6\x17\x59\xaf\x01\x8c\x65\x63\x89\x68\x90\xf7\x81\x0d\x00\xf2\x96\xe0\x79\x3d\x17\xa1\xeb\x61\xe4\x82\x61\x07\xc2\x5e\x51\xd6\x49\x30\x8e\xc8\x3e\x64\x3a\xf2\xaf\x19\xfd\x93\x69\x9f\xf7\xf1\x0f\x16\xd7\x99\x89\x33\xa2\x09\xc1\xf5\x11\x0a\x10\xa2\x5c\x2f\x4b\x21\x7d\x55\xbd\x10\x16\xa5\x58\x96\x60\x14\x66\x89\xa7\x52\xf7\x61\x55\x16\xd7\xb6\xea\x14\xa5\xa6\x6c\x05\x8b\x99\xa3\x6c\x73\xbd\xce\x0d\xdf\x5c\xdb\xbb\xe8\x62\x71\xab\x7b\xc3\x5b\x2c\xbb\x92\x8b\xb8\x3b\xdb\xda\xd9\xde\x6a\x82\xc9\x27\x17\xcb\x8f\xc7\xa5\xc2\xf5\x9e\x15\xb1\xec\xf8\x49\x88\x59\xbc\x16\x3e\xd2\x5a\x36\x32\x6b\x79\x8d\x8d\x13\xdc\xda\x9c\xff\xe3\xd4\xb6\x36\x6e\xa9\xd6\xc2\x63\x58\xeb\xf8\x29\x50\x03\x86\xcb\xb6\xaa\xa2\xac\x29\x63\xbd\x56\xf3\xbb\x16\x22\xcd\x4f\xa6\x12\x97\x2e\x50\xa4\x5d\x0f\x26\x8d\x65\xe4\xf8\x6d\xeb\xf9\x9f\x5d\xd0\xc2\x8e\xb8\xca\xe6\xbd\xbf\x46\x2c\xe9\x56\x57\x45\xce\xd0\x55\x0c\x64\x60\xb3\x0b\x36\x4e\xa9\x60\x4b\xfe\xe7\xdb\x02\xfb\x48\x68\x55\x45\x94\xa7\xc8\xf6\x85\x56\xd7\x72\xd1\xc5\x32\x32\xc0\xa1\x8d\x4c\x6f\x68\x33\x68\x73\x88\x22\x87\x10\xda\xce\x40\x1a\xb9\xfe\x20\x21\x96\x02\xe2\x5c\x70\x51\x6c\x09\x2e\x32\x2f\xc1\xb1\x97\x04\xe7\xb9\x11\x8f\x90\xe0\x78\xad\x67\xc3\x8e\x62\x3e\x96\x95\x0c\xc3\x4a\x45\xd9\xf5\x56\x16\x22\x0c\x15\x04\x18\x72\x0f\xc4\x33\x27\x96\x6d\xe0\x22\xce\x89\x10\xba\x9a\xb2\x89\xa5\xe3\xb6\xe3\x77\xc7\xef\x4e\x7e\x97\xda\x71\xd8\x43\xf0\x95\x38\xf7\x88\x39\xa3\xa5\xf4\xbd\x69\x63\x16\xa7\xda\x81\xc3\xac\x10\x82\x5b\x4a\x8f\x8d\x5e\xca\x80\xa9\xcc\xf7\xba\x52\x54\x10\x6d\xaf\x89\x40\x84\xcd\x10\x61\x55\x89\x20\x9c\x0b\x7c\xb4\x14\x21\x19\xe0\x9a\xeb\xf1\x6b\x88\xe5\xfa\x81\x04\x9b\x42\x38\xf7\xbd\x69\x11\x88\x84\xeb\x91\x12\xc4\x49\x80\xcc\x3b\x2e\x18\x62\xc7\x2a\x76\xc1\xe4\x82\x57\xe8\x90\x75\xdb\x5e\xe4\x05\x2e\xd1\xf6\xa8\x09\x54\x5d\xb1\xe9\xa1\x13\xe2\xb8\x63\x38\x59\xff\x89\xec\x2f\x26\x40\x08\x3b\xde\xda\x59\xdb\x9b\xf2\xd0\xd1\xe5\xa2\xaa\xa3\x57\xa4\x09\xfd\x07\xb3\xb1\x39\x36\x33\xe7\x4a\xf9\xe0\x38\xf3\x06\x8c\x8b\x93\x96\xb2\x92\x5c\xc8\xb8\x28\xca\x5e\x69\x8b\xad\xac\x1e\xb7\xa4\x57\x86\x96\x94\xbc\x4f\x35\x8c\x02\xbf\x64\xcd\x83\x64\x60\xdc\x7e\x78\x8a\x52\x9a\x2e\x8d\x2e\x13\x30\x82\x93\x51\xca\x28\x4b\x69\xba\xc5\x7a\xde\x89\x11\x9d\xd6\xb2\xa3\x38\xc7\xc3\x86\xf8\x61\xf4\x9e\x6b\xe5\x0b\xe3\x79\xe9\x5c\x9c\x72\xce\xc5\x29\xe7\x7c\xdc\x10\x9d\x67\x35\x39\xaf\x5a\xa2\xcd\xf0\x93\xae\x09\xf6\x54\x52\x56\x94\x0c\x07\x0c\xac\xf3\x79\xd3\x6b\x7c\x30\xe4\x35\x3d\xb0\x2d\x09\x8c\x81\x5e\xc7\x7b\x79\xb0\xb7\x8c\x77\x95\x0c\x7b\x26\xfd\x97\xd5\xd2\x99\x94\x8c\x6a\x95\xc9\xa8\x73\xd1\x18\xd1\x73\x42\x25\x13\x2a\xd8\x7a\x4e\xf1\x23\xca\x1c\x69\x56\x3f\xa9\x11\xd2\x5d\xd7\xf6\x7d\x27\xbd\xd6\x1c\x0c\xb8\xf4\x5a\xdf\x7a\x99\xba\x96\xf6\x5a\x2f\xd6\x14\x3e\xc7\xa4\x53\xb6\xee\x21\x36\xb4\xda\xf6\x36\x7b\x26\x66\xd7\x43\x76\x68\x5b\x35\x6e\xa2\x68\x75\x72\x59\x77\x85\x4e\x80\xc4\x15\xc3\xdf\x32\x15\xd8\xa1\x1c\x7c\x8c\xeb\xbc\x7c\x8f\x97\x4f\xb0\xc9\x9c\xcd\x0a\x06\xb9\xde\x2b\xa4\x1c\xc2\xf9\x30\xe2\x9e\x41\x46\x02\xe9\xe7\xaf\x8f\x9b\xa5\xf3\x59\x48\xd6\x68\xcd\xc8\x46\x56\xdd\xf9\x9a\xcf\x6d\xe4\xa3\xed\x83\xfd\xb7\x7b\x19\x78\x2f\x6b\xd7\x26\x1d\xc1\xec\x09\x91\x7b\x76\x41\xb1\x40\x23\xcf\xee\x02\x6f\x0a\x51\xcc\x74\x21\xe3\x97\x0c\xca\xc8\xcf\xb9\x10\x77\x62\x07\xdf\xe5\x42\x0e\x4d\x2e\xbf\xfb\xfd\xda\x2f\xf4\x83\x64\x62\x48\x7f\x17\x6c\x11\x25\x4f\x2a\x79\x46\xe9\x7a\x53\x35\x33\xa6\x18\x77\xb7\x28\xe8\xa9\xd4\x95\x26\x99\x17\xec\xee\x43\x0f\x3b\x9b\x2e\x13\x76\xb9\xc8\x9b\x38\xe7\x7c\xd2\x75\x79\x91\x4e\xf7\x74\xc2\x48\x13\xfa\xee\x6c\x9b\x64\xee\x77\x69\x4f\xe9\x96\xb2\x93\xad\x2e\x99\x3e\xf9\x9c\xe6\xb3\xcb\x64\x7b\x6a\x46\x53\x97\x65\xcd\x76\xe2\xe2\x79\xec\x9c\x62\x0b\x60\xd5\x3a\x56\xad\xd3\xd5\x7e\xb3\xce\x1a\x99\xdd\x4c\x90\x2a\x99\x27\xd2\xfe\x61\xff\xe6\x49\x16\x5a\xc7\xff\x8e\xff\x7d\x3a\x73\x64\x9a\xf5\x9f\x6f\xb3\xe4\x23\x11\xa3\x92\xe6\xf7\x11\xd5\x64\xb7\x63\xe7\xcb\x65\xbb\x92\x43\x47\x7a\xab\x63\xc0\xba\x78\xe2\x3a\xd4\x05\xae\xa3\x19\x5d\x5b\xa5\xc7\x50\xb5\xff\x46\xd9\x7a\x87\x4f\x6a\x93\x5d\xae\x3e\xfc\x30\xd1\x17\x97\x74\x42\xd9\x24\xe7\x96\xa1\x6c\xd2\xaf\xb7\xe9\xb1\xd4\x24\x2b\xb9\x95\x09\x28\xea\xe9\x20\xdb\x50\xf0\xfd\x57\xa2\x0d\x0e\x8d\x1d\x7f\xbb\x44\x4c\x90\x6f\x93\xc9\x28\x13\xce\xe5\xf9\x58\xfb\xcb\x37\xd5\x8c\x5b\xad\x98\x66\x75\x64\xaa\x5c\xad\x8d\x5c\x34\x68\xa2\x25\x6e\x91\x81\xcc\x38\x4a\x8f\x4e\x59\x94\xc7\x59\x46\x59\x51\x52\x83\x93\xa9\x96\x63\xb3\xae\xa8\x41\x03\xea\x9a\xd6\xc0\x0e\xb9\x16\x01\x71\xce\xe2\x9c\x6a\xd0\x4d\x18\xfd\x2a\xc1\x31\x7d\x3e\xde\xd1\x7a\x30\xb0\x9c\x67\x3e\x0b\xc9\xaa\x90\x7e\x8d\xa2\xf2\xa0\xfc\x46\x55\xe1\xbc\xf7\xc9\x5e\x52\x26\x2b\x44\xe6\xc9\xb0\xfc\xd9\x10\x4a\xb6\x91\x4a\x56\x7f\xc5\xda\x69\xc6\xad\x15\x88\xfc\x3e\x34\x21\x3b\x58\x9b\x3e\xb5\x67\x28\xd8\x5a\x6a\x79\x12\x1b\xdd\x1e\x5d\x19\x4b\x99\xed\x88\x12\xfb\xd1\x1e\x2c\x02\x7c\x7b\x08\xe3\x33\xbe\xb7\x1e\xb8\x32\x9d\xb1\xe3\xc5\xd0\x9b\x12\x74\x48\xa7\xa8\xf0\x56\x65\x46\x29\x93\xb7\x4c\x98\xa2\x7d\x65\x01\x23\x95\x6d\xb2\x60\x2a\x97\xec\x62\xb5\x1c\x0d\xb5\x2c\x25\x4b\xd9\xee\xad\x4a\x7b\x88\xbb\x1c\x3b\x21\x6d\x28\x9c\xa1\x33\x2c\x77\x39\x6f\x5d\xc5\x3a\x93\xf3\x66\x58\xf5\x65\xba\x38\xf2\xa4\x57\x8b\x2a\x61\x7e\xaa\xf1\x57\xf7\xee\x29\x45\x41\x8b\x9c\xb4\x88\x52\x16\x3a\x3c\x8c\xcd\x29\xab\xfd\xd2\xb7\x50\xb6\x7c\x47\xcb\x9e\xdd\xe5\x7b\x2e\x54\xf6\x38\xd8\x5a\xa7\x39\xf9\xb4\xdb\xef\x6e\x99\xac\xb2\x22\xdd\xe9\x58\xf7\x1c\xb2\xe8\xd1\x9c\xe7\x65\xa1\x63\x16\x75\xae\x6f\xab\x98\xaf\x6a\xe1\x47\x1b\x39\xf5\xd5\x62\x1c\x44\x6c\x91\x04\x3b\xa0\xc1\x2c\xcf\x4e\xd3\x54\x63\x28\xf9\x58\x93\x32\xd1\xc6\xa5\x2c\x86\x4f\x9a\x29\x9b\x54\x4e\xfb\x8b\x94\x59\x1a\x8e\x56\x3f\x63\xac\xea\x9d\x56\x3a\x5e\xd4\x95\xc2\xc8\x26\xaf\xcb\xbb\x99\x7d\x90\x57\x94\x93\x07\xb5\x23\xa4\x04\x23\xd3\xca\x5e\xaf\x94\xb4\x35\x99\x02\xc2\x1e\x1a\xba\xc4\x64\x94\x05\x25\x5d\x6a\x84\x47\xe4\xf7\x4c\xfe\xa7\x0b\xe5\xf4\xf2\x39\xbd\x9f\xcb\x71\xc1\x71\xef\x73\xa8\x38\xee\x7d\xde\x09\x08\x8c\x92\x67\x30\x67\x3c\x67\xbe\x2f\x6a\x39\x6a\x29\x85\x92\x9d\xa3\x84\x9e\xf5\xe3\x61\x02\x3c\x1b\xbd\x2f\xe1\x5d\x2b\x7e\xaf\xa8\x5b\xb9\x84\xcf\xe1\x39\x8d\xb4\x4b\x46\x98\x29\xd8\x73\x7a\x6d\x97\x72\x38\xe3\xe5\xdf\x83\x40\xe5\xd0\x46\x45\xe2\xba\x26\x4f\x8e\x67\x91\x2e\x5a\x7a\xb2\xa3\x84\xc1\x1e\xaf\x38\x2b\xbd\xea\x69\xb1\x08\x58\x5e\x85\xa4\xb3\x64\xef\x1a\xb3\xd5\x26\xe5\x33\x86\xbd\x32\x75\x5c\xf1\xae\x4e\x96\xa8\x77\xe9\x57\xb8\x64\xbd\x4a\x08\xbc\x5e\x92\x72\x4d\xba\xf1\x8d\x77\x9d\x01\xf7\x25\x1f\x4b\x03\x3b\x39\x62\x07\xa9\x51\x78\xd0\x42\xb6\xa0\x3a\xd9\x82\xe0\x96\x87\xce\x30\xc9\xa7\x57\x2c\xc5\x4e\xc6\x30\x4f\x3f\x49\x06\x54\xf8\x6e\x61\xb0\xe0\xfa\xbd\x9c\x60\x3b\x16\x95\x8b\x5a\x78\x8f\x26\xe1\x4b\x85\x5b\x18\xb8\xad\x2c\x39\x64\x5c\x2a\x69\x34\x19\x4b\xbe\x4d\x77\xf8\xf1\xc9\x2d\xf1\x19\xbd\x70\x7c\x7e\x1c\x80\x31\x64\x72\x34\x64\xe3\x98\x89\x08\x5c\x9d\x1e\x85\x31\xf4\xd6\xf4\xad\x4b\x43\x0b\x06\xaf\x47\x2f\x93\xd0\x9e\x5e\xfb\xd1\xaf\x62\xf2\x1d\x8e\xab\xfe\xd7\x09\xac\x49\xba\x33\xcc\xc0\x73\x3e\xef\x76\x76\xdf\x1e\xda\x7a\x77\xde\xd8\x9b\x54\x09\xbb\x2a\x02\x8a\xdd\x39\x4d\x63\x82\x1a\xa2\x43\xa7\x56\xda\xde\x3e\x1b\x06\x83\xa9\xe8\xb2\xdf\x47\x9f\x99\x53\x96\x3b\xe5\x66\x60\x68\x42\x80\xe3\x0a\x21\xb4\xb3\x88\xd2\x5e\x1e\x72\xb3\xa6\xfd\x7a\x74\x4c\x0e\x98\xdd\x2c\x3d\xf3\xf6\x47\xdb\xb8\x37\x39\x87\xcc\x0c\x54\xec\xf3\xd5\xae\x4f\xfe\xb8\xb2\x57\x57\xcb\xf3\x55\x82\x70\xf9\x77\x37\x91\x17\xd8\x70\xc4\x38\xde\x9b\xc5\xff\xbd\x0c\xe2\x1f\x4c\xe1\x1f\x4c\xe1\x1f\x4c\xe1\x1f\x4c\xe1\x1f\x4c\xe1\x1f\x4c\xe1\x7f\x43\x53\xf8\x07\x23\xf8\x7f\x5b\x23\x78\xdc\x86\x3e\xd8\xb8\x3f\xd8\xb8\xff\xfb\xda\xb8\x5d\xf5\x5f\xc1\xc6\x4d\xe9\xff\x36\x86\xee\xfa\x83\xa1\xfb\x83\xa1\xfb\x83\xa1\x7b\xdc\xe5\xff\x05\x0c\xdd\x83\x89\x5b\xd4\xfc\xf2\x13\x6d\xff\x60\xee\x5e\x7c\x30\x77\x7f\x30\x77\x7f\x30\x77\xff\xfc\xe6\xee\xea\x1d\xe6\xee\xfd\x79\xf5\xc1\xe8\xfd\x9f\xd1\xe8\x9d\x8f\x1e\xf4\x2e\xa3\xf7\x07\x3b\xf7\x07\x3b\xf7\x07\x3b\xf7\xb8\xc3\x3e\xd8\xb9\x93\x93\xfb\x83\x9d\xfb\x3f\xc4\xce\x4d\x29\x9d\xaa\xa5\xeb\xe7\x4d\xdf\x30\x16\x2d\x3d\x32\x00\xd9\x82\xec\x27\x63\xbb\xf8\x7a\x67\xd0\x4d\x02\xb1\xcc\x46\xea\x9a\x8f\xf4\xe2\xd3\x10\x2d\xfe\x80\x83\x38\x6c\xc5\xee\xae\x4b\x9b\x71\xb5\x6b\xc6\x2e\x06\xf4\x41\x66\x86\x51\x70\x8a\xaf\x77\x15\x24\xfa\x51\x4f\xfd\xe9\x83\x7f\xb1\x0f\xfe\xba\x78\x65\xed\xe2\x55\x5b\x2c\x5e\xb5\x76\xf1\x2a\xb6\xee\x95\x2b\x17\xaf\xe2\x1a\x79\x15\xca\xc5\x2b\x0e\x6d\x85\x2d\x41\x19\xf4\x6c\xca\x38\x2e\xc4\x20\x62\x30\x26\x19\xdf\x51\xfa\x24\x63\x4a\x95\x53\x96\x94\x15\xa5\x95\x1b\xe2\x22\x1e\x30\x73\x73\x9b\x35\xa1\xb2\xb8\xe1\xa8\x0c\xab\x76\x56\x63\xc3\xca\xe2\xf9\xa7\x32\xd8\x66\x95\x85\x82\x12\xe3\x51\x8e\xa9\x30\x47\x61\xae\x0a\xec\xd3\x45\x86\xc9\xae\x88\x7b\xa1\x2a\x8a\x26\x96\x12\x41\xa6\xa8\xb1\x9a\x3b\xb9\x88\x72\xb5\x2a\xd0\x0b\xa9\x22\x98\xc5\xb5\x2a\x8d\x00\x14\xb0\x5b\x96\x71\x89\xa9\xb2\xc4\x5e\x8e\x72\x56\x95\x2e\xa3\x04\xbf\xe0\xa5\x2c\x29\x21\xf5\x90\xb2\x3e\x54\x89\xd9\x1c\xbd\xa6\xaa\x22\x67\xaa\x2a\x2d\xb6\x75\x23\x5e\xe8\xd8\x8c\x2a\x5b\x60\x6e\xd7\x04\xf9\xa4\x62\x45\xb3\xd0\x7b\xaa\x8a\x2f\xad\x82\x4d\x62\xa2\x69\xec\xea\x9a\x9f\x4c\x4e\x59\xa7\x41\xaa\xeb\x34\x60\x8e\x4d\x52\x6c\x63\x2b\xac\x5b\x86\xae\xc6\xc6\xd5\xa8\x1c\x43\x79\x86\x21\x1d\x3b\x76\x83\x9d\xba\x11\x2b\x6d\x53\x62\x8c\x97\x6f\x6f\x30\xa6\x35\xb0\xc1\xaa\x61\x70\x9a\xb8\xaf\xa8\x06\xe0\x41\xd3\x88\xc9\x3e\x32\x24\xaa\x41\x26\x50\x4d\xcb\x1d\xac\x7f\x8d\xbc\xb8\x69\xc5\xca\xcf\xbb\x30\xb1\x35\x8e\x47\x61\x97\x6c\x9c\x98\xf1\x3d\xef\xc5\xd4\xd7\x04\xf9\xbf\xc3\x40\x5f\x88\x9d\x1e\x13\x37\x98\x11\x4b\xd7\x5a\x2d\xd6\x77\x7a\xc2\x82\x16\x51\x16\xb4\x84\xcd\x30\x9c\xc7\x63\x56\xd9\x0c\xab\x77\x86\x99\x3c\x83\x94\x2f\xb7\x68\x60\x94\x05\xd0\x60\xb1\x49\xdb\x4a\x4c\xe3\x95\x98\xe0\xe5\xb5\x98\x5f\x6d\x2d\xf6\x7a\xac\xb0\x56\x3e\xda\xf2\xd1\x56\x3e\xda\xf2\xd1\x96\x8f\xb6\x2d\xef\x6d\xa5\x7e\x2b\xd6\x7b\x9e\xe2\x20\xf2\x52\xf2\xa8\x80\xe5\x59\xbe\xb0\x8d\xcc\x9a\x42\x6d\xac\x50\x1b\xab\x56\xbe\xb0\xe5\x0b\x5b\xf9\xc2\x96\x2f\x6c\xf9\xc2\x96\x2f\x6c\x33\xa9\x9e\x89\x9d\x1e\xf3\x36\x5f\xd5\x16\xf2\x3f\x6d\x6f\x19\xd6\xb6\x12\x1b\x3b\xf5\xe4\x0b\x5b\x16\x5e\x2b\x4b\xae\x65\x58\x5b\x74\x48\xaa\x6d\xb0\x78\x63\xcd\x6d\x1b\xa8\x1a\x9e\xdb\x60\x29\x07\xf1\xd1\x5a\x1e\x85\x6d\xb5\xb5\x62\x28\xb7\x90\x5a\x79\x20\xdf\xdf\xf2\xe5\x9d\x7c\x27\xaa\x56\xd5\x29\xb1\x53\xf3\xa1\x9d\xac\x92\x8e\x0f\xed\x4c\x6f\x43\x17\x83\x3a\xa6\x6b\x99\x9a\x5d\x81\xcd\xbb\xa4\x0a\xdf\xd3\x31\x3f\x3b\xf9\x92\x8e\xf9\xd9\xc9\x97\x20\x24\xab\x4e\xbe\x04\x8e\x59\x89\x6e\x53\x75\x8c\x8f\xb0\x70\xaa\x6b\xc5\xa4\x2e\x06\x72\x8f\x69\x9c\x8a\x8c\x4f\x17\xa4\xc4\x92\x2d\xeb\x06\x96\x5a\x39\x69\xbd\xa3\xf5\x4e\x5a\x0f\x6b\xad\x1c\x0d\x76\x39\x06\xed\x42\xaa\xb0\x27\x39\x19\x07\x47\xbb\x9d\xec\x86\x68\x4f\x94\x93\xe6\xbb\x06\xb2\x46\xee\xb0\x3b\x38\x81\xc4\xa0\x84\x54\x8e\x46\x4a\x6c\x15\xe5\xc0\x7d\x78\xa5\xc5\xfe\x2d\xc6\x70\x43\x89\xe1\x5b\x36\x06\x78\x48\xe5\xd9\x2d\x7d\xcd\x6d\x0c\xf5\xbe\x2e\xc5\x54\x8e\x89\xbb\x16\xbb\x39\x23\xe9\xd9\x9b\xbc\x65\x9b\xf5\xcc\x6a\xcf\xac\xf6\xf4\x9a\xa7\x0d\x12\xb0\x44\xf9\x8e\x67\x49\x4b\x9c\x3c\x04\x8c\x01\x0a\x7c\x25\x1a\x1a\x85\x2d\x50\x05\xf8\x34\x15\xca\xd8\x7b\x22\x49\xaa\x50\x77\x49\xb4\x65\x63\x63\x89\xd1\x55\x49\x58\x2d\x15\xb9\x5b\xad\x60\xa0\xb4\x8a\x93\x59\xab\xd8\x7b\x1a\x93\x9f\x56\x25\x56\xf5\xd2\x73\x3b\xf2\xe5\x5a\x89\x51\x56\xd5\x50\x61\x26\x1f\x72\xa4\x61\x55\x54\x58\xc2\x55\xc7\xa3\x24\x2c\x8f\xc2\x9c\xa9\x10\x1f\xb5\x89\xdc\xb6\x36\x62\x21\x35\x51\xe0\xd0\x92\x97\x48\x9b\x02\x4b\x3a\x56\x4c\x23\x2d\x32\xb4\xc8\x48\x5c\x31\x53\x73\x47\x4c\xb8\xa6\xe6\x8e\x24\x5b\x33\xb1\x13\xb5\x81\xc1\xd3\x06\x13\xa7\x41\xb7\xac\x4d\x8b\x1d\xbf\xe3\x7e\x27\xf7\x69\xa6\x11\xe3\xab\x71\xbc\x13\x8e\x55\x67\x71\xaa\xe9\x8c\xa9\xa6\xb3\x78\x1e\xe8\x4c\xcb\x1d\x8c\xaa\x43\x6a\x3b\x2c\xb9\xbb\xc4\xbc\x90\x05\x21\x0b\x8e\x48\x4d\x98\x8f\xcb\x38\x0e\xba\x24\xa5\xb2\x2e\xb1\xbe\x96\xb5\xdc\x89\x0b\x7d\x17\xb4\xd3\x73\x11\xe4\x4e\xa8\x93\x78\x6b\x71\x19\xe8\x8a\x65\xa0\x2b\x40\x05\xbb\xc4\x56\x3a\xcd\xd4\xae\x93\xd8\x6b\xbc\xb4\x92\x01\xab\x18\xb0\x21\x79\x4c\x9c\x5c\xba\x02\xa1\x50\x61\xed\xad\xe5\x61\x75\x14\x4c\xb4\x04\xb9\xd1\x75\x9c\xbb\xba\x86\xbd\xd5\xb5\xe5\x4e\xdc\x6b\xf6\x01\xa3\x8a\x24\x0d\x08\x46\xe9\x21\x40\x1b\xf0\x82\xa6\x92\x8b\xb8\xbf\xef\xc2\x5f\xdb\x36\x96\xf2\x00\xc0\x65\xfb\x4c\xf4\x65\x12\xb9\xad\xc8\xb1\xc0\xc7\x06\xca\x76\xad\xd9\x7c\x75\x9b\xcb\x45\xde\x12\xfd\x31\xe3\x22\x8a\x4b\xba\xc5\x68\xdf\x62\xb4\x17\xec\x91\x06\x42\xb4\x4b\x7f\x12\xa5\x43\xdd\xc1\x12\x68\x64\x05\x2d\xb2\x82\xee\x00\x05\xec\xd2\x9e\xd6\x69\xe2\x3e\x2c\xf8\xad\xd4\x01\xe8\x21\x9a\x6e\xdd\x79\xac\xf6\xde\x8b\xa1\x9e\x47\xd3\x1d\x1d\xc0\x0d\x4c\x1f\xbb\xa0\xb7\x54\xec\x73\xcd\x04\xa6\x52\x90\xa9\x14\x80\x26\x04\xf9\x66\xd4\xcd\x3a\xe4\x72\x87\xc5\x20\xe1\xa7\x35\x66\x07\x1d\x80\xa7\x04\xe0\x23\xa1\x90\xdb\xcc\xa7\x40\xfb\x25\xb2\x98\x0e\x2d\x86\x7c\x18\x01\x1d\xc0\x16\x04\xe6\x7d\x90\x19\x1f\x3a\xee\x77\x72\x1f\x6c\x4c\x90\x95\x19\x22\xdf\xa5\xc5\x64\xa5\x83\xe3\x35\x92\x3e\x28\x78\x01\x04\xc8\x03\x02\x0f\x10\x50\x47\x88\x2c\x83\x51\xf1\x94\x33\xaa\x12\x18\x80\x58\xfe\xe3\xc9\x65\xb4\x32\x94\x15\x25\xf8\x52\xad\x33\xca\x82\xb2\x91\x9f\x5c\x2c\x23\x9f\x65\x34\xc6\x7c\x1d\x0f\x26\xa3\x05\x91\xaa\x8d\xdc\x0e\x5c\xc4\x53\xca\xe8\x4c\x40\x04\xe0\x06\x34\x53\xc2\xe8\x9c\x3b\xf1\x20\x30\xba\xe6\x25\x71\xfe\xee\xd2\x24\x02\x09\x10\x10\xaa\xe9\x0a\x9f\x64\xe7\xf1\x90\x61\x3c\x30\x9d\xe7\x4e\x3c\x81\x0c\xc3\xba\x4f\xc8\x58\x50\x82\x00\xa0\x45\x43\xc8\xb9\x92\x9f\xf0\xfc\x1f\xb2\x6a\x02\x58\x90\xb8\x57\xc6\x59\xb9\x10\x14\x82\x05\x78\xd0\xca\x9d\x96\x3b\xad\xdc\x69\xb9\x23\xb8\x09\x4e\x1b\x23\x86\x5e\x03\x58\xcb\x48\xa4\x66\xe3\x1c\x77\x9c\xdc\x89\x07\xa8\xf1\x06\x54\x81\x2a\x28\x4b\x12\xfb\x6b\xc9\xef\xcf\x4f\x59\x4b\xd9\x01\x3d\x90\x1b\x0d\x54\x18\xab\x32\x00\x1b\x99\xb2\x72\x27\xce\xdb\x4c\x76\xe7\x0c\xc0\x46\xa6\x59\x7e\x99\xe6\x2d\x5a\x9e\xac\xe3\x56\x9f\x69\xc9\xa3\xa5\xdb\x30\x4a\x8c\x35\x4a\xf4\xbf\xb8\xce\x65\xe2\x37\x4c\x95\x7d\x84\xb3\x2e\x4d\xb8\xe3\x92\x10\x73\x71\xa3\xb3\xa5\x96\x0b\x2d\x58\x06\x4b\xd9\x26\xf9\x8c\xa3\xd8\x60\xcb\x2a\x48\x72\xe3\x58\x5f\xb6\x50\x8b\xc4\x60\x2b\x01\x00\x00\x83\xb2\x95\x31\x5c\xc4\x95\x6d\xab\x5a\x20\x0f\xad\x60\x21\xe4\x4e\x67\x41\x41\x14\x60\x19\x94\xa6\xcc\xe4\xa2\xa0\xac\xe4\xc2\x52\x76\x02\x93\x30\x69\xd8\xed\x8c\x30\xc9\x3c\xad\x6e\xb9\x08\x72\x11\x2a\xca\x96\x12\xc8\x44\x00\x0b\xa1\x04\x0b\x11\x67\xd5\x2e\x2c\x74\xe4\x1e\xf6\x69\x17\x3b\x72\xbe\x09\xa4\x22\xb2\x04\x16\x84\xd3\x2e\x93\x41\x9c\xb5\xb6\xf1\xa5\x5c\x70\x47\x30\x0c\x0d\x2f\x18\x72\xca\xc7\x95\x64\xad\x34\xd3\xe6\x86\x32\x97\x8b\x36\xcd\xa4\x50\x52\x82\xb0\xa8\x3c\x3f\x59\x70\x18\x91\x2f\xb2\x36\x1e\xa3\xd6\xb6\x10\x61\x3b\xb2\xb0\xd8\xd6\x02\x26\xb1\x1d\xcf\x05\x7a\x65\x2d\xf0\x8e\x21\xb7\x8b\x17\xcc\x86\x91\x44\x2f\x39\x38\x0d\x2d\x00\x8e\x92\xb2\x91\x0b\x90\x18\x5a\xee\x68\xee\x48\x2a\xac\xd6\xc8\x45\x2d\x17\x3e\x49\x7a\x05\x42\xa4\x2d\x7a\x40\x47\x93\x24\xbb\xf7\x26\x4d\x2c\x99\x25\x59\x29\xd1\x4b\x0a\xea\xc5\x81\xbc\x0e\x72\x7c\x05\x1b\x4f\xac\x60\x2b\xb9\x00\xdf\x20\xb1\xeb\x03\x0d\x0d\x22\x1a\x84\x56\x83\xdf\xd0\xe0\x37\xd0\x94\x07\xa4\x85\x20\xd2\x42\x68\x33\x88\x33\x81\x7c\x64\x02\xf9\xf0\x00\x3c\x14\xa5\xa6\xcc\x28\x73\xca\x12\xd2\x96\x1b\x8e\x97\xc0\xd2\x06\xd1\xbc\x06\x4c\x42\xc1\xc1\x57\x07\xc0\x48\x41\xb4\x29\xc1\xd1\x7e\x31\x57\x04\x1f\x0f\xd9\xe0\x2b\x9e\xe6\xe3\x52\x0b\xc1\x68\xc0\x18\x91\x4d\x0e\x21\x97\x8b\x82\x0b\x54\x75\x81\x73\x21\xc8\xb9\x10\x00\x2c\x84\x80\x78\x1c\x42\x07\xa6\xc3\xc9\x1d\xc7\x1d\x01\xb8\x04\x37\x1b\xd6\x72\xd0\xd6\xa2\x05\xef\x94\x28\xfe\x51\xc1\x76\x62\x89\x06\x0b\xe7\xc0\xe9\xee\x00\x05\x02\x22\x40\xcd\x3c\x84\xff\x46\x21\xbc\x53\x1d\xa1\xf9\x1c\xd2\x36\x74\x8b\xbd\xe5\x1e\xf5\xe5\xa0\x80\xd6\x62\xf0\x16\x0b\x6b\xce\x9d\x5c\x14\xa4\x62\xb3\x1d\x52\x38\x60\x88\x1d\xc2\x6f\xba\xc4\xa6\xd2\x89\xfa\x4d\x0c\x26\xdd\x18\xaa\xd1\x7f\x97\x58\x09\x06\xa4\x03\x06\x02\x51\x6c\x76\x41\xf4\xfe\x82\x64\x10\x43\xc5\x10\x81\x10\x4d\x6f\xdf\xc8\xac\x4c\x6c\xa8\x85\xd8\x84\xe5\xa2\xac\xc6\x88\x8c\xbe\x23\x51\xa3\x63\x3d\xed\x94\x68\x34\x31\xa4\xf7\xb6\x4a\x74\xd9\x43\x6f\x4a\x3f\x8a\x39\x63\xc8\x32\x50\x26\xfd\x28\x70\x93\x21\xad\x29\xe6\x80\x80\x75\x23\x14\x49\xdb\xc5\x68\x31\xe4\x1c\x13\x6b\xa4\x5c\x88\x99\x19\x8d\x9a\x13\x55\x26\xea\x3e\x89\x9c\xe9\xbc\xe6\x3b\xb5\xa8\x47\xb1\xeb\x7a\xdd\x9b\xd8\x44\xfb\x2d\x64\x18\xc4\xc6\xa3\xd9\xc7\x61\x04\x2a\xe3\x3b\xa9\xe3\xf3\x64\x68\xb3\xe2\xa6\x5e\xab\x4c\x3a\x9a\x7a\x84\xb0\x18\xd2\x5a\xd4\x49\x1f\xb4\x46\x94\xdf\xfb\x3e\xd8\x8d\x59\x96\xb4\x0b\xf3\x32\x62\x98\xf3\xad\x4e\x27\x99\x18\xc4\xb1\xd0\x0c\x79\x90\x69\x4f\x6f\x86\xc1\x14\xb4\x4b\x62\x5a\x8e\xe0\x14\xa2\x4c\xef\x47\xae\x96\x8b\x1e\xef\x23\xed\xf1\x62\x24\x17\x5b\x1b\xab\xc6\xe5\xb9\x98\x8a\x16\x49\x52\x37\x5a\x5d\x09\xca\x49\x68\xf9\x2a\xd7\xf5\xf8\x26\xaa\x38\xec\x4d\xae\xdb\xcf\x3d\x0f\xd4\xc1\x6b\x51\x3f\x63\xa5\x1d\x3e\xb7\xc6\x30\x51\xd7\x62\x80\x90\x9f\x9c\xe8\xb2\x65\x98\xb8\x10\xb4\x8f\xc7\x0a\x36\x24\x7b\x74\x62\x02\x12\xcd\x33\x56\xaf\xa0\x04\x3f\xc0\x02\x94\x97\x05\xcc\x2f\xc1\x88\x2e\x3b\xe3\x4e\xc6\xc0\x61\x91\xd9\x29\xae\x05\x7e\xe1\x64\xb1\x52\xf6\x70\x09\x3d\x42\x48\xf4\xe3\x0a\x42\xa3\x13\x2b\x5a\x87\xa1\xa6\x2b\x64\x09\x94\x7a\x91\xe6\xf4\xd8\x99\xe8\x06\xa3\x54\x95\x4c\x6a\x8c\x01\xc2\x47\x39\xe7\xda\xa4\xbb\x8c\xd8\x39\xf2\x74\x5a\x88\x0d\xa6\x4e\x27\x84\x1d\xe1\x20\x86\x04\x7a\x89\x1f\xef\x80\x88\x12\x7b\x6a\x6f\x25\x6c\xc4\x4a\x28\x2b\x2e\x4b\x8c\x85\xdc\xd6\x23\xd0\x8f\x98\xcd\xf4\x62\x1f\x42\x15\x0b\x61\x8f\x05\xe8\x31\x52\x9e\xfb\x3e\xdb\x2f\x4b\xd5\x83\xa0\xcc\xde\xdc\xd5\x9b\xb0\xc4\x8e\x23\x20\x1a\x19\xda\x21\x12\x6a\x3d\x46\x45\xf4\x7b\x50\xba\xfb\x18\xc1\xe5\xa1\xe7\xaf\xcc\xde\xaa\x32\x2c\xa3\xfe\xfb\xea\xe4\x2b\x5b\xd9\x4a\x68\x66\x5e\xee\x2d\x7d\x38\x32\x38\xf8\x66\xe7\x4a\x6a\x88\x01\xde\xd1\x34\x07\x94\x6a\x97\xb6\xce\xc8\x2a\x4b\x01\x0d\x83\xaa\xbe\x69\x46\x80\x86\x7e\x64\xf3\x6c\x40\x2f\x74\x8b\x24\x46\x36\xb8\x05\x8c\xa1\xc2\xb4\xb9\x9a\x57\xd7\xf2\xea\xba\x84\x18\x01\xdd\xd5\x2c\xb5\x5a\x6c\x52\x35\xd6\xa1\x77\xc4\x7d\x55\x6e\x34\x0b\x7c\x0a\x43\x18\xcc\xfd\x79\x99\xc2\x10\x76\x20\x00\xb1\x37\xca\x85\x18\x10\x65\x57\xf0\xde\x2d\xd2\xa4\x40\xc9\x4e\x98\xb3\x7a\xca\x14\x85\x26\xb6\xf6\x50\x8f\x80\x06\xc3\x63\xc5\xaa\x36\x04\xa5\xb5\xfb\x75\xd6\xc8\x23\x1a\x31\xb4\x29\xb1\x05\x51\x66\x29\x98\x60\xf7\xb5\xd5\x4c\xfc\xdd\xce\xa5\xa7\x88\xaa\x53\x30\xc1\x10\xa2\x57\xb0\x7f\xfd\x3e\x56\xb0\x69\x0d\x18\x46\x26\xc1\x90\x90\xaa\x1d\x81\x09\xfa\xe7\x97\x76\x91\xc0\xd0\xba\x64\x89\xb3\x71\x89\xa8\xee\xba\x61\x32\x8c\x92\x2c\xe2\xff\xe3\x3a\x41\x42\x76\x9c\x3a\x63\xf4\x25\xc7\x82\x65\x7b\x10\x34\xa3\xd8\xef\x3a\xdb\x89\xc5\x50\x0e\x0f\xcc\xe9\x20\x13\x45\x17\xe0\x3a\x78\x86\xae\xeb\xcd\xd2\xd2\x03\x62\xd7\xef\xb1\x4e\x62\x5c\xef\xc1\x4e\xa5\x5c\x08\x38\xc0\x27\x27\x6c\xd6\xaf\x91\x14\x0e\xd9\x6f\xfd\x65\x62\x8a\x67\xb4\x5c\x6f\x6d\xa5\xb5\xde\x8a\x5d\x15\x73\xae\x17\x58\x1e\x1e\x34\x4e\x34\x83\xce\x0b\xf7\xd4\xc3\x34\x68\x47\xd0\x3d\xa0\x51\x20\x6e\x3d\x80\xc5\x27\x3c\x12\xf6\xce\xd0\x87\x3c\xa6\x77\x43\xdd\x63\x07\xb9\x90\x9d\x27\x74\x66\x91\x00\x5d\xdb\xb9\x40\xcb\x60\x65\x77\x68\x28\xcc\xfc\xbc\x69\xd8\x71\x7c\x3b\x42\x0d\xf4\xa3\xd5\x03\x2a\x86\x75\x4c\xd9\xa6\xa8\x80\x61\x8f\x56\xb2\xdf\xf5\x3c\x07\x1b\xb6\xe1\x94\x63\x81\x7b\x23\xa0\x00\xf8\x0a\xd3\xa4\xdb\xa1\x58\x77\x7b\xb4\x28\x1b\x21\x20\x2d\x9f\x73\x9b\xf3\xd6\xc3\x36\xfa\x5c\x7e\x17\x23\x75\x6f\xee\xe6\x15\xcc\x5f\xcf\xc4\xf2\xe0\x41\x7d\x41\x85\x82\x0a\x70\xb0\x83\xf9\x18\x7a\x60\x41\x1e\x34\xa0\x2f\xc5\xec\xcb\x94\x16\x54\xb6\xf3\x6c\x36\x5e\x36\x9b\xc1\xbc\x2c\x6d\x16\x96\x09\xe4\xe5\xee\xc4\x16\x04\xa4\x6c\xf1\x00\x68\xbc\xc0\x9b\x51\x27\xc7\xc9\x91\xf0\x31\x56\xc8\xda\x36\x35\x22\x0f\x1b\x8f\x73\x33\x20\x8e\x32\xdd\xc7\xfa\x89\x32\x01\xfe\x95\xa3\x04\x23\x80\x5c\x7a\x97\xdc\xbd\x01\x39\xdd\x1f\x3c\xa8\x9a\x29\x5c\xa5\x4a\xc7\x3d\x78\x95\x5a\x9e\x87\x8a\xda\xcd\x06\xd5\xb6\x89\x7d\xf6\xeb\x7d\xd8\xec\xcf\xed\x95\x77\x67\xb3\x46\xd7\xb6\xb8\xd9\xd8\xaa\xf1\xeb\xd3\xe0\x2b\x14\xaa\x0c\xa5\x99\xd9\xca\x34\x19\x25\xc6\x02\x63\x43\x6a\x6d\xcd\x0e\xac\xad\xed\xbf\xa3\xb5\x35\xb1\xb3\xbe\xb7\xbe\xdd\xc9\xc5\xed\xda\xea\xf7\xd4\x81\x0e\x7a\xcd\xc8\xed\x68\x07\xe6\x4b\xbb\xd8\x0f\xda\x89\x17\x98\x43\xa9\xfd\x5f\x58\xe3\xf9\xb7\x50\x6c\xe6\x7f\x23\xf5\x66\xd5\x52\xfa\x7f\x83\xae\x73\xaf\x76\xe3\x42\xb2\xa6\x94\x71\xfb\xd9\x29\xd7\xf0\xa8\xa9\xb0\x62\xdb\xaa\xae\x12\x4d\x5b\xed\x63\x29\x59\x10\xe6\xd5\x6e\x94\x25\xa5\x3d\x50\xf0\x88\x82\xaa\x2d\xeb\x44\xc1\xd3\x86\x5b\xf5\x33\x37\x68\x3e\x66\xf3\x8e\xed\x72\x20\xde\x2c\xe0\x8f\x84\xcb\x79\x79\x72\x24\x0b\xec\xd8\xff\x79\x5e\xec\x03\x9b\xf2\x1f\xca\xa6\xd8\x51\xb2\x87\x2c\x3d\x4c\x2e\xf7\xd8\x9d\xf5\xf7\x7e\xd3\xd9\x2b\x3f\x3e\x50\x76\xa7\x89\x0b\xc9\x21\xf2\x0a\xfc\x89\x56\x9a\x32\xa3\x2c\x28\x2b\xca\x86\xb2\xa5\x74\x94\xd0\xe3\xf3\xcd\xae\xa1\xd8\x35\x94\xd6\xd0\x6b\xe8\x35\xf4\x44\x90\xd0\x1a\x7a\x03\xbd\x81\xde\x40\x6f\xa0\xc7\x11\x5e\x1b\xe8\x0d\xf4\x1c\x19\x9a\x08\x02\x1a\xf3\xb4\x06\x94\xa1\x09\xab\xa0\x01\x65\x68\x8c\xe7\x1a\xbf\x79\x8d\x3b\xb7\x8e\xb2\x9d\xd2\x91\x11\x52\x3a\x0e\xae\xd2\x58\xb3\x35\xee\xd7\x6c\x3f\x4a\x13\xc5\x42\xe7\xbc\x25\xe7\x2d\x05\x6f\xc1\x4d\x5d\x17\xbc\x05\x67\x7b\x0d\x22\x48\x13\x81\x40\x83\x8b\xd0\xf8\xdd\x6b\xcc\xf1\xba\x84\x1e\x87\x76\x5d\x42\x5f\x42\x5f\x42\x5f\x42\x0f\x26\x48\x03\xa0\xd0\x1c\xb8\xba\x82\x9e\x03\x57\x57\xb4\xbf\xa2\xfd\xec\x6d\x4a\x83\x4d\x60\x6f\x54\x1a\x47\x74\x0d\x12\x49\x73\xea\x6a\x80\x25\x9a\x10\x0f\x1a\xa0\x85\x06\x60\xaf\x34\xa1\x0d\x34\x18\x0b\xcd\x99\xac\xb1\xcc\x6b\x2c\xf3\x1a\x24\x83\x06\x62\xa1\x2d\x94\x44\x37\xd0\x98\xea\x35\x70\x1f\xdd\xd2\x4f\x20\x1b\x06\x76\xc2\xa5\xec\x04\xb7\xf1\xbf\xd7\x1d\x6d\x01\x93\xa3\x01\x69\x68\xa2\x76\x68\xc2\x07\x68\xe2\x1f\x68\xc7\x2b\x71\x87\xd7\xe0\x76\x34\xb8\x1d\x8d\xad\x5f\x03\x94\xd0\x9e\x26\x82\x8e\xd2\x9e\x0e\xf1\x3c\xdf\xd3\x44\x0f\x3d\x48\x29\x0d\xc0\x47\x07\xe8\xe1\x32\x34\x20\x18\x4d\xdc\x11\x1d\xa0\x64\x02\x1b\x26\xb0\x61\x02\x1b\x26\xb0\x61\x02\x1b\x26\xb0\x61\x02\x1b\x26\xb0\x61\x02\x1b\x26\xb0\x61\x02\x1b\x26\xb0\x61\x02\x1b\x26\xb0\x61\x02\x1b\x26\x30\x9e\xab\xca\x30\x81\x0d\x13\xd8\x30\x81\x0d\x13\xd8\x30\x81\x0d\x13\xd8\x30\x81\x0d\x13\xd8\x30\x81\x4d\x06\x83\x64\x40\xa7\x18\xe6\xab\x21\x34\x8a\x61\xbe\x1a\xe6\xab\x01\xf3\x80\x5f\xbf\x32\xcc\x51\xc0\x04\xca\xe4\xe1\x46\x4e\x4e\x27\x8c\xdc\x21\x0b\x07\x9a\x25\xc3\xcd\x5c\x65\x0c\x57\xc6\x70\x65\xc0\xf1\x32\xc7\xa3\x32\x42\x27\x64\x8e\xb0\x32\x04\x2e\xc8\x18\xa9\x8c\x91\xca\x18\xa9\x8c\x91\xca\x18\xa9\x8c\x91\xca\x18\xa9\x8c\x91\xca\x18\xa9\x4c\xe0\x71\x19\x83\x34\xb0\x82\x44\xac\x61\x90\x32\x70\x59\x39\xa7\xa2\xc2\x3d\x5a\xe5\x2c\xa3\x9c\x65\x94\xb3\x8c\x72\x96\x51\xce\x32\xca\x59\x46\x39\xcb\x28\x67\x19\xe5\x7c\x6e\xce\xe7\xe6\x2c\xa3\x9c\x8f\xce\x09\x89\x93\x57\xd0\xf3\xe5\x39\xcc\xeb\xc0\x82\xf2\x3b\x2b\x07\x1f\x63\x95\x83\xc8\xca\xe9\xcf\x9c\x55\x94\x37\x3c\x07\xd0\x52\xce\x52\xca\x89\x12\x92\x03\x57\xca\x59\x50\x39\x0b\x2a\x67\x41\xe5\x44\x0a\xc9\x89\xac\x91\xb3\xa0\x72\x16\x54\xce\xb0\xe4\xc0\x70\x72\xb0\x2f\x39\x81\x69\xf2\x16\x7a\x16\x57\x0e\x2e\x27\x07\x13\x93\xb3\xb6\xf2\xb8\xc7\xab\x1c\x60\x4c\xce\x3a\xcb\xbb\x9a\xd2\x52\xd2\x71\x0c\x1f\x6e\xd1\x2a\x67\xf8\x72\x10\x86\x39\x08\xc3\x9c\x31\xcc\x19\xc3\x9c\x31\xcc\x19\xc3\x9c\x31\xcc\x19\xc3\x9c\x31\xcc\x19\xc3\x9c\x31\xcc\x19\xc3\x9c\x31\xcc\x19\xc3\x9c\xd5\x96\x03\x60\xca\x19\xc8\x9c\x81\xcc\x03\xf4\xac\xb9\x9c\xe1\xc4\xdc\xa9\x72\xd6\x5c\xc1\x9a\x2b\x58\x73\x05\x6b\xae\x60\xcd\x15\xac\xb9\x82\x35\x57\xb0\xe6\x0a\xd6\x5c\xc1\x9a\x2b\x58\x73\x05\x6b\xae\x60\xcd\x15\xac\xb9\x82\x35\x57\xb0\xe6\x0a\xd6\x5c\xc1\x9a\x2b\x58\x73\x05\x6b\xae\x60\xcd\x15\xac\xb9\x82\x35\x57\xb0\xe6\x7a\x39\x63\x24\x5a\xdc\x2c\x41\xdc\x28\x34\xbc\xb7\x68\xa0\x29\x33\xca\x82\xb2\xa2\x6c\x28\x5b\x4a\x47\x09\x78\x02\xc4\x0b\xa6\x06\xed\x91\x27\xb0\x34\x68\xaf\xa1\xd7\xd0\x23\x5a\xa0\x0d\xd0\x68\x03\x34\x0e\x01\x1a\x87\x00\x8d\x36\x40\x7b\x03\x3d\xad\xf3\x06\x7a\x62\x50\x78\x40\x34\x60\xb9\x34\x66\x0b\x8d\x8e\x40\xa3\x23\xd0\xe8\x08\xb4\xcf\xa0\x07\x31\x85\xe7\x80\xf6\x44\xa9\xf0\x48\x31\xe8\x0e\x34\xba\x03\x8d\xee\x40\x7b\x04\x1a\x54\x07\x1a\xd5\x81\xc6\x89\x40\xe3\x44\xa0\x51\x1d\x68\x54\x07\x1a\xd5\x81\x46\x75\xa0\x51\x1d\x68\x54\x07\x1a\x27\x02\x8d\x13\x81\xc6\x93\x5b\xfb\x12\xfa\x12\x7a\x40\x36\xa0\xd3\xb5\x27\x92\x07\xce\x05\x1a\x07\x6f\x8d\x26\x41\xfb\x0a\xfa\x0a\x7a\x84\x26\x94\x81\x1a\x88\x9a\x26\x68\x8b\x26\x68\x8b\xc6\xc3\x52\xa3\x5f\xd0\x04\x70\xd1\x98\x02\x34\xb0\x76\xed\x1b\xe8\x1b\xe8\xd9\x47\x35\x1a\x64\x8d\xef\xb4\x46\xc6\xd7\xa8\x20\x34\x8c\x9f\xc6\x99\x45\xa3\x87\xd0\x1e\xcc\x8f\xb7\xd0\x83\xcf\xc1\xb6\xa2\x81\xb8\x69\x0f\x44\xcb\x13\x4b\xc5\xb7\xd0\x13\x17\x03\xe8\x9b\xf6\x82\x9d\x21\xba\x8a\xef\xa0\x47\xd2\xc5\x68\xa4\x3d\x00\x22\xdf\x41\x8f\xd4\x0b\xbc\x5e\x7b\x07\x3d\xe2\x9d\x27\xa6\x85\x07\xeb\xe4\x1d\xf4\x48\x7a\x28\x40\x34\x00\x3a\xed\x3d\xf4\x1e\x7a\x40\x43\xde\x43\xef\xa1\xf7\xd0\x7b\xe8\x09\x86\xe2\x89\x8a\xe1\x81\xfd\x78\xc4\x68\x4f\xa4\x16\x1f\xa0\x27\x08\x08\x1e\xf6\xda\x07\x11\x58\x95\x04\xee\x48\x05\xe2\x5e\x06\x66\x5e\x8a\x4d\x49\x87\x4c\xe2\x78\xa4\xd2\xf1\x48\x20\x16\x60\x57\x60\x2e\x08\x03\x3c\x91\x85\x19\x45\x71\x3b\xd3\xa1\xe1\x42\xa4\xfd\xc0\x80\x88\xb9\x6a\x2f\x32\x53\x56\x37\x4a\xcc\x94\xd5\x8c\xc0\x4c\x59\xa5\xf2\x72\x35\x23\x2f\x53\xf6\x22\x32\x25\xc2\x2b\xd1\xe6\x7a\x69\x99\x08\x1d\x13\xd1\x97\x12\xc9\x18\xdb\xf8\x44\xf2\xcd\x0f\xc5\x5c\x4d\x59\x50\x12\x29\x24\xca\x8a\x06\xbd\xb1\xe9\xca\x0e\xe9\x17\x1a\xa2\x95\x74\x44\x16\xe9\xb0\x94\x0f\xc2\x71\xcd\x6d\xa4\xea\xae\xe6\x41\xb1\x1f\x4d\x17\x57\x83\xe9\x6a\xa1\x71\x94\x84\x1f\x69\xa0\x6f\xa0\x6f\xa0\x6f\xa0\x6f\xa0\x6f\xa0\x6f\xa0\x27\xb6\x08\x8e\x65\x06\xc7\x32\x83\x14\x67\x70\x2c\x33\xc4\x97\x32\x9d\x85\xde\x42\x4f\xfc\x91\xae\x85\xbe\x85\xbe\x85\x9e\x88\x24\x48\x78\x06\x09\xcf\x00\xa1\x35\xe8\x63\x4c\xd7\x41\xdf\x41\xdf\x41\x4f\xd4\x12\x22\x54\x99\xae\x83\xbe\x83\x9e\x38\x26\x9d\x83\xde\x41\xef\xa0\x27\xb2\x49\xe7\xa0\x77\xd0\x3b\xe8\x89\x75\x02\x38\xd7\x74\x3e\x4b\x34\x08\x5d\xa2\x40\x78\x87\xea\x40\x53\x66\x94\x05\x65\x45\xd9\x50\x0a\xaa\x47\x28\x41\xfb\x14\xd0\x17\xd0\x17\xd0\x17\xd0\x17\xd0\x13\x11\xa4\x2c\xa0\x2f\xa0\x2f\xa1\x2f\xa1\x2f\xa1\x2f\xa1\x07\x12\x52\x96\x6d\xa2\xb7\x80\xb2\x86\xb2\x86\x12\x45\x45\x59\x43\x59\x43\x59\x0b\x25\x4f\x6e\xa0\x6f\xa0\x6f\xa0\x6f\xa0\x6f\x9a\x44\xfd\x91\x51\xa2\xc3\x20\xd0\x48\x15\x8f\x18\x5b\x19\xb9\xeb\x28\x81\x29\x01\xd4\xb4\x55\x46\x85\x8c\x0a\x19\x15\x32\x2a\x64\x54\xc8\xa8\x40\x38\x94\x8a\x8e\xab\xe8\xb8\x8a\x8e\xab\xe8\xb8\x8a\x8e\x23\xa0\xa0\xad\xe8\xb8\x8a\x8e\x03\xfb\x69\x2b\x3a\xae\xa2\xe3\x2a\x3a\xae\xa2\xe3\x2a\x3a\xae\xa2\xe3\x88\x01\x65\x2b\x3a\xae\xa2\xe3\x2a\x3a\xae\xa2\xe3\x2a\x3a\xae\xa2\xe3\x88\x13\x35\x51\xee\x54\xc0\xa8\x80\x0a\x55\x80\x94\x88\x1c\x65\x2b\x7a\xb7\xa2\x77\x2b\x7a\x77\x50\x03\x75\x89\x16\x08\x1a\xcc\x4e\xb6\xa2\x4b\x2b\xba\xb4\xa2\x4b\x2b\xe9\x52\xe0\x5c\x55\xc3\x43\x2d\x15\x2c\x0f\xb5\xd0\x5b\xe8\x2d\xf4\x40\x94\x2a\xc0\x49\x55\xcb\xef\x2d\xbf\xb7\x3c\x07\x84\xd2\xa0\x71\xe2\x09\x5d\x9d\xa8\x9d\x7e\x4e\x85\xd3\xed\x3a\x26\x93\xfa\xa7\xcd\xab\x95\xe6\x35\x49\xdd\xac\x26\xa9\x9c\xd5\x24\xe9\x1e\x25\x82\xc6\x67\x88\xe0\x90\xaa\x95\x4a\xc1\x1f\x88\xed\x56\x7c\x6f\xdb\xf2\x7d\x14\x47\x43\x88\x07\x51\xf2\xa8\x2c\x55\x0f\x55\x7b\x8d\x8f\xc3\xc1\xd1\xd5\xa2\x45\x12\xb7\xf5\xb6\x37\x55\x53\xc7\x8b\xf7\x9a\x12\xb3\x8c\xe8\x82\xc4\xfa\x22\x2d\xec\x1d\xed\x7a\x20\x82\xe8\x8f\xe6\x54\x46\x98\x28\x67\x55\x46\x12\xbc\x60\x4e\x65\x24\xe0\x91\x39\x95\x11\x56\xec\x79\x95\x51\x33\xa3\x38\x92\x76\x4f\x14\x47\x2f\x76\x8a\xa3\x49\xee\xfb\xc3\xd4\xf7\x3f\xca\xb7\x4b\x9c\xba\xec\xce\xc3\xaa\x44\xe6\x4d\x9d\xa2\x66\x5c\x98\x0e\xbc\x96\x1a\x84\xbf\xde\x37\x41\x42\xe3\x85\x6e\x87\xff\xae\x61\x62\x05\x6a\xdd\x55\xf5\x1e\x10\xed\x24\x48\x9b\x2b\x81\x32\x03\x0c\x77\x4d\xbb\x03\x34\xdf\x8c\xfa\xc5\x48\x6b\x78\x48\x8f\x8b\x1d\x41\x54\x67\xc0\xa9\x71\xc5\x67\xaa\xf1\x29\xf6\x34\xee\x17\x2a\x72\x4a\x36\x97\xf0\x55\x02\x13\xed\xf1\xa1\x95\x6c\xd0\xdd\x0e\xfe\x39\x46\x7c\x56\x6a\x0f\xf8\x0c\x52\x36\x09\x82\x52\xc0\x8e\x6a\x8f\x56\x8c\x47\xd8\x80\x4f\xec\x11\x85\x45\x18\x70\x85\x81\xa0\x83\x81\xf8\x3e\x21\x34\x93\x78\x46\x62\xce\xdf\x9b\xe6\xd3\xa5\xfa\x6e\x03\x7b\x6f\x35\xdd\x19\x4a\x87\xb9\x26\xa6\xcf\x64\x8a\xad\xc7\xf9\x61\x27\xf3\x4b\xfc\x0a\x45\xf5\x84\x5e\x47\x3c\x46\x74\x27\x8a\x8f\xfc\xbd\x1c\xf2\x50\xab\x94\xb9\xfe\x11\xde\x79\x3f\xb7\x47\xde\xd8\xff\xee\x6f\xe8\x6d\x67\x3e\x78\xdb\x7d\xf0\xb6\xfb\xe0\x6d\xf7\x9f\xdc\xdb\xae\xf8\xdb\x7b\xdb\xfd\xbd\xfa\xd9\x49\xcc\xc8\xff\x32\x1e\x74\x7f\xdf\x7e\x72\xa9\x87\x5c\x4e\xfc\x7c\x7c\x28\xfe\xce\xdc\xe5\xfe\x1d\x1c\xe5\xaa\x1f\xe7\x01\x67\x74\x26\xe0\x85\xac\x3e\x70\x98\xfa\x0f\x70\x95\xda\xb9\x47\xcd\xf8\x42\xcd\x38\x41\xfd\xcd\xbc\x9f\x54\x14\x5a\xac\x42\x68\x99\xba\x42\x55\xa9\x2b\x54\x7b\xab\x2b\x94\xf8\x40\x8d\xdc\x9e\xd0\x5b\x54\x3c\xa4\x22\x60\xe6\xdf\xb3\x3b\xd3\xd8\x91\xa9\xfa\x79\x1c\x99\x50\x55\x58\x51\x55\xfc\x4c\x5e\x4d\x94\xdd\x8c\x53\xd3\xcf\xe2\xcd\xd4\xa9\x9f\xd3\x67\xe9\x3f\x87\x67\x52\xef\x7f\x44\x3c\xda\x50\x89\xee\x24\x4a\x71\x41\x94\xd5\x1f\x3c\x93\xde\xc3\x33\xa9\x6f\x17\xf4\x1f\xfc\x8f\xfe\x5e\xfd\x8f\x3e\x78\x19\x7d\xf0\x32\xfa\x1b\x79\x19\x7d\x70\x2c\x5a\x7c\x70\x2c\x5a\xfc\x3c\x8e\x45\xef\xf6\x25\x9a\xba\x0f\xfd\xe7\xf5\x0f\x9a\xf1\x53\x79\x2f\xd7\x94\x0f\x7e\x28\x8b\x0f\x7e\x28\x37\xf9\xa1\x6c\x77\xea\xf9\xef\x96\xdb\x4b\x7f\x08\x1d\x46\x1b\x0f\xfc\x12\x80\x9a\xee\x04\x7e\x69\x00\x6d\x88\x03\x04\x8a\x90\xd0\xc8\x05\xb8\x9a\x60\xe5\xc2\x86\xbd\x6b\x83\x38\x30\x84\x2e\x79\xf9\xf5\x3e\xf9\xdd\xcb\x97\x73\xb8\xe5\x4f\x1f\xfc\xcb\xd4\x03\x06\x6d\xa0\x46\xa1\x85\x33\x83\x22\xfb\x88\xd2\x0a\x08\xaa\xa2\x8d\x28\xa5\x35\x2a\x41\xb0\x1b\x4a\xa3\x11\xd4\xe4\x29\xd3\x1a\x7a\x0d\xbd\x86\x1e\xcb\x93\x26\xe5\xa0\xd6\xd0\x1b\xe8\x0d\xf4\x58\xa4\x70\x83\x50\xb8\x41\x28\x6d\xa0\x37\xd0\x93\xfa\x8e\xdc\x27\x4a\xa3\xea\x03\x15\xa2\x34\xaa\x6d\xb0\x21\x4a\x93\x01\x0d\x6c\x88\xc2\x37\x42\xe9\x1c\x30\x6c\x0e\xb8\x15\x6d\xa0\x46\x2b\xa7\xb1\x5e\x68\xb2\xed\x01\x1c\x51\x1a\x23\x80\x2e\x78\x32\x49\xc1\x34\x7a\x4b\x8d\x71\x41\xa3\x7a\xd5\xe8\x95\x35\xda\x72\x8d\x1a\x56\x97\xd0\x93\x7e\x4b\x97\xd0\x97\xd0\x63\x85\xd0\x28\xfd\x34\x36\x12\x4d\x5e\x2a\x5d\x41\x8f\x8a\x5d\xe3\x1e\xa4\xc9\x3c\xa8\x81\x59\x6a\x60\x96\x1a\x98\xa5\x46\x6b\xa9\xd1\x5a\x02\x6a\x51\x1a\x7f\x21\x5d\xd3\xfe\x5a\xa0\xc9\xe0\x2f\xb5\xa8\x7c\x35\xea\x79\x0d\xf4\x52\x63\xd1\xd1\x92\xa1\x4d\x93\x0c\x4b\xa3\xbc\xd6\x8d\xa0\x9c\xe9\x1c\x4b\x93\x48\xd3\xa6\x51\x61\x6b\x92\x71\x69\x10\x98\x1a\x04\xa6\xb6\xd4\xb2\x02\x7e\xa6\x16\xf1\xc4\x95\x46\x21\xaa\x81\x60\x6a\x20\x98\xba\xe5\x35\xad\x00\x98\x79\x1c\x16\x17\x0d\xd4\x52\x93\x85\x4b\x03\xb2\xd4\x98\x35\x35\x86\x22\x8d\xa1\x48\x03\xb2\xd4\x80\x2c\x35\x20\x4b\x2d\xf3\x0f\x6d\xb4\xf6\x34\x11\xfb\xa7\xc6\xaa\xa9\x3d\xef\xc2\x24\xa4\xb1\x88\x6a\x4c\x4d\x1a\x8d\xb5\xc6\xe6\xa9\x83\x7c\x3d\x40\x59\x8d\xe9\x53\x63\x52\xd1\xc1\x83\x51\x06\x1e\xcc\xd4\x36\x4c\x6d\xc3\xd4\x36\x4c\x6d\xc3\xd4\x36\x4c\x6d\xc3\xd4\x36\x4c\x6d\xc3\xd4\x36\x4c\x6d\xc3\xd4\x36\x4c\x6d\xc3\xd4\x36\x4c\x6d\xc3\xd4\x36\x4c\x6d\xc3\xd4\x36\x4c\x6d\xc3\xd4\x36\x4c\x6d\xc3\xd4\x36\x4c\x6d\xc3\xd4\x36\x4c\x6d\xc3\xd4\x36\xe8\xd2\x0d\xd3\xd9\x30\x9d\x0d\x10\x7c\xc3\x74\x36\x92\xe5\xd0\x60\xaf\x45\xbf\xab\x0c\xf3\xd9\x30\x9f\xc9\x5b\xa6\x32\xe6\x5b\xc6\x7c\x1b\x1c\xd1\xde\xe5\x75\x46\x09\x51\xa3\x0f\x3d\xd0\xc0\xe2\x66\x0c\x60\x86\x78\xad\x32\x40\xe9\x19\x70\xf4\x0c\x38\x7a\x86\x61\x2b\x63\xec\x32\xc6\x2e\x63\xec\x32\xc6\x2e\x63\xec\x32\xc6\x2e\x63\xec\x32\xc6\x2e\x13\x6b\x36\xa3\x46\x46\x33\x95\x61\x19\xca\x18\xb4\x0c\x60\xa9\xca\x8d\xe0\x9a\x15\x25\xa8\x5e\x96\x5d\xce\xb2\xcb\x59\x76\x39\xcb\x2e\x67\xd9\xe5\x2c\xbb\x9c\x6e\xc8\xe9\x86\x9c\x65\x97\xd3\x19\x39\xcb\x2e\xc7\x74\x9e\xe3\x24\x90\x57\xd0\x63\x51\xc9\xe9\x17\x14\x6f\x2a\xa7\x5f\x72\xec\x29\x39\xde\x01\x39\x8b\x2b\xc7\x5e\x91\xb3\xb6\x72\xcc\x43\x39\x2b\x2c\xc7\x3c\x94\xb3\xb6\x72\xd6\x56\xce\xda\xca\x59\x5b\x39\xa6\x98\x1c\x1b\x51\xce\xda\xca\x59\x5b\x39\xb6\x86\x1c\x5b\x43\x8e\xd5\x32\xc7\x69\x20\x67\x51\xe5\x58\x6e\x73\x96\x56\xde\x0a\x5a\x19\x7a\xc0\x02\x39\x46\xdc\x9c\xc3\x23\x67\xc9\xe5\xf8\x12\xe4\x1c\x21\x79\x27\x68\x65\xe8\xf1\x25\xc8\x19\xb6\x1c\x5f\x82\x9c\xc1\xcb\x19\xbc\x9c\xc1\xcb\x19\xbc\x9c\xc1\xcb\x19\xbc\x9c\xc1\xcb\x19\xbc\x9c\xc1\xcb\x19\xbc\x9c\xc1\xcb\x19\xbc\x1c\xc3\x65\x8e\xa9\x28\x67\x20\xf3\x00\x3d\xab\x2f\x67\x20\x73\x81\xa9\xb3\xfa\x0a\x56\x5f\xc1\xea\x2b\x58\x7d\x05\xab\xaf\x60\xf5\x15\xac\xbe\x82\xd5\x57\xb0\xfa\x0a\x56\x5f\xc1\xea\x2b\x58\x7d\x05\xab\xaf\x60\xf5\x15\xac\xbe\x82\xd5\x57\xb0\xfa\x0a\x56\x5f\xc1\xea\x2b\x58\x7d\x05\xab\xaf\x60\xf5\x15\xac\xbe\x82\xd5\x57\xb0\xfa\x52\xff\xc9\x9b\x5d\x26\x47\x8e\x91\x37\xbb\x3f\x22\x0e\x69\x1f\x3f\x4e\x13\x7f\x5c\xfb\xf8\x71\xda\xc7\x8f\xd3\x5e\x09\xc0\xb9\xa3\xf4\x40\x92\xa1\xd7\xd0\x6b\xe8\x51\xde\x93\xc0\x46\x7b\x0d\x3d\xa9\xea\x3c\x56\x01\xa2\x99\x6b\x58\x48\x0d\x0b\xa9\x89\x66\xae\x89\x66\xae\x3d\x06\x25\x6f\xa0\x37\xd0\x67\xd0\x67\xd0\x67\xd0\x67\xd0\x67\xd0\x93\x85\xce\x67\xd0\x67\xd0\xe7\xd0\x63\xc8\x40\x02\xd5\x60\x43\x34\xb1\xcf\x35\xb1\xcf\x35\xb1\xcf\xb5\x27\xa3\x1c\x52\x9e\x86\xdf\xd4\xf0\x9b\x9a\x08\xe8\x9a\x08\xe8\x9a\x08\xe8\x9a\x08\xe8\x1a\x39\x43\x13\x01\x5d\xc3\x6f\x6a\xf8\x4d\x4d\x04\x74\xed\x4b\xe8\xc1\x93\x78\x6c\x2e\x04\xd8\xd6\x1e\x93\x0b\xfc\xa7\x46\x5b\xa8\x7d\x05\x3d\xd6\x15\x5f\x41\x5f\x41\x4f\xf6\x3a\x32\x4e\x6a\x2c\x7e\x1a\x8b\x9f\x46\xc5\xa0\x51\x31\x68\xcc\x7e\xda\x63\x83\x23\x55\x8c\xf6\x0d\xf4\x0d\xf4\x0d\xf4\x0d\xbf\x63\x0e\xf1\x96\xdf\x2d\xbf\x5b\x9e\x83\xed\x06\x71\x5c\x7b\xcb\x73\x30\x99\xa0\xb1\xd1\x18\x0c\xb5\x07\x41\xeb\x41\xd0\x22\xb2\x6b\xcf\x44\xf1\x30\x69\xe4\xbb\xd4\x78\xbd\x69\xdf\x41\x0f\xa4\x56\xd0\x37\xbe\x83\xbe\x83\x1e\x76\x8e\x3c\x98\x1a\xe5\xa1\xf6\x0e\x7a\xf2\xf1\x79\xec\x69\xde\x41\xef\xa0\xc7\x16\x85\x62\x44\x7b\x0f\x3d\x09\x9d\xd1\x5b\x69\xef\xa1\xf7\xd0\x63\x23\xf3\x58\x69\x48\x63\xa1\x3d\x19\xfd\x10\x7c\xb5\x07\xa3\xeb\x31\xd5\x78\x0c\x68\x78\xe2\x69\x14\xb4\x9a\x08\xff\x3a\x28\xe1\x3e\x41\xe0\x4f\xfc\x77\xe5\x02\xec\x7c\x90\x6c\x87\x24\x9d\x9a\x3a\xf3\xce\xf8\xef\x82\x5f\x16\xa2\x52\xd8\x5a\xb9\x00\xf4\x2d\xba\x4e\x1d\x40\x74\x07\xb1\x23\x0e\x8e\xb9\x75\xea\x98\x2b\x17\xa1\x3d\xf0\xc5\xc5\xb3\x15\x3f\x3b\xa3\x51\x10\x1a\xd8\xd5\x9f\xe2\x98\x2b\xe6\x2a\x3c\xe8\x0c\x3e\x72\x7b\x8f\xdc\x9d\x13\xee\xd8\xfd\x36\x4e\x7c\x23\x39\x7c\x0c\x19\x66\x0d\xa8\x3b\xd3\x95\x00\x6b\x4b\x80\xb5\xa4\x96\x31\x24\x36\x30\x1d\x69\x14\x3b\xd2\x1c\x0e\x2e\xba\x35\x37\x6a\x6e\x08\xdc\xb9\x06\xd5\x5c\x83\x6a\xae\x41\x35\xd7\x20\xac\x6a\x5e\xda\x40\xdf\x40\xdf\x40\x2f\xf9\x12\x1b\xe8\xc9\x4c\xd8\x09\x2e\xab\x81\xde\x42\x6f\xa1\xb7\xd0\x63\x76\x03\x45\x60\x3a\x0b\xbd\x85\x1e\x0b\x1c\x79\x03\x0c\x0e\xaf\x86\x54\xb8\xa6\xc3\x18\xd7\xb5\xd0\xb7\xd0\xb7\xd0\x63\x97\x23\xc3\x80\xe9\x3a\xe8\x3b\xe8\x31\xd1\x75\x1d\xf4\x1d\xf4\x1d\xf4\x58\xeb\xc8\x45\x60\x3a\x07\xbd\x83\x1e\xc3\x5d\xe7\xa0\x77\xd0\x3b\xe8\x09\x77\x08\x82\xc1\x74\x1e\x7a\x4f\x8f\x7a\xa0\xca\xd8\x63\x40\xc8\xd9\x32\x97\xff\x73\xca\x92\xb2\xa6\xc4\x7c\x96\x03\x1b\x23\xdb\x60\x59\x40\x5f\x40\x5f\x40\x5f\x40\x5f\x40\x0f\x22\xb4\x2c\xa0\x27\xad\x61\x59\x42\x5f\x42\x5f\x42\x5f\x42\x0f\x5c\xb4\x2c\xa1\x2f\x3b\xf1\x92\xa6\x84\xb2\x86\xb2\x86\x12\x54\x5a\x59\x43\x59\x0b\x25\x4f\x6e\xa0\x6f\xa0\x6f\xa0\x6f\xa0\x6f\xa0\x6f\xac\x38\x5b\x53\xe6\x94\x00\x58\x31\x8b\x55\x46\xee\x82\xb4\xc5\xac\x54\x65\x50\x66\x50\x66\x50\x66\x50\x66\x50\x66\x50\x66\x50\xd2\x63\x15\x3d\x56\xd1\x63\x15\x3d\x56\xd1\x63\x15\x3d\x46\xde\x72\x5b\xd1\x63\x15\x3d\x56\xd1\x63\x15\x3d\x56\xd1\x63\x15\x3d\x56\xd1\x63\x15\x3d\x56\xd1\x63\x15\x3d\x56\xd1\x63\x15\x3d\x56\xd1\x63\x15\x3d\x56\xd1\x63\x58\xe0\x6d\x85\x41\xb3\xaa\x80\xf0\x56\x40\x78\x2b\xa0\x7d\x15\xbf\xd7\x82\xe9\xe3\x39\xf4\x67\x45\x7f\x56\xe0\xb6\xab\x5a\x40\xc3\xd0\xd0\x87\x15\xbd\x57\xd1\x7b\x95\xf4\x1e\x70\xc1\xaa\xe1\x69\x16\x4a\x0b\xa5\xe5\x69\x16\x7a\x0b\x3d\x9a\x50\x5b\x59\x48\x51\x19\xd8\xaa\x85\x0a\x6b\x61\xd5\x42\xd5\xf2\xd4\x96\xa7\xb6\x90\x62\x32\xac\xc0\x8f\xda\xaa\xc3\x0c\xdb\xf1\x39\x91\xa5\x48\xfc\xd2\x6f\x73\x45\x97\x9c\x88\x3b\x57\xf4\x79\xef\xf3\x39\x87\xf3\x76\xd6\xe1\xbc\x98\x75\x38\x97\x0c\x31\xa2\x86\xea\x0d\x5d\x65\x9f\x2b\x03\xf5\xf6\x4f\xf6\x41\x2f\x52\x8b\x83\xa8\x6b\xf3\x1f\xed\x7c\x8e\xee\xf2\xa7\xf8\x9e\x8b\x2a\xcb\xd5\x45\xa2\xdb\x6e\x25\x65\x98\xe8\x13\xd1\x7d\x7a\x25\x5e\xe9\xa2\xaa\xeb\xd3\x9b\x48\x6a\x97\x2a\x55\x6f\x8d\x9c\xd7\x7d\x9f\x5e\xcf\x8a\xa1\x26\x51\x4c\xf5\x79\x16\xc5\x2b\xbd\xcf\xf8\x24\x8e\xe8\x9d\x9d\x73\x3a\x37\x3a\xd1\x1c\x3d\xde\x43\x87\xed\xe6\xf9\x5e\x59\x94\x09\x12\x32\x13\xf7\x4d\x2c\x31\x2a\xaf\xf1\xda\x13\xe9\xad\x00\xac\x54\xe0\x06\x59\x20\x28\x14\x38\x43\x16\xc8\xe6\x05\xe2\x42\x81\xb8\x20\x08\x02\x55\xc2\x45\x97\x24\xf0\x50\xf8\x4e\xa8\x12\xf1\xa9\x24\x00\x86\x2a\x91\x0f\x4a\xc1\x2b\x96\x08\x05\x25\xce\x8e\x25\x42\x41\xe9\x05\xe0\x89\xb7\x23\xc8\x1a\x55\x89\x4b\x2a\x7b\x84\xaa\x2c\x4f\xa9\x90\x74\x2a\x22\x4c\xa8\x0a\x47\xc8\x0a\x87\xc7\x5a\x0b\x4c\x13\x4f\xc5\x5a\x73\xbf\xc6\x31\xb1\x36\x85\x5c\x54\x94\x8d\x5c\x50\x47\x60\x8c\x35\x6e\xe4\x35\x36\x68\x55\x83\x5d\xab\xbd\x60\x33\xf1\x9c\x6c\x24\x0b\x7c\x83\x77\x70\x43\x7a\x20\xd5\xe0\x9e\xde\x14\x92\x56\x01\x9f\xf4\x06\xb1\xb2\xc1\x69\xb6\xa9\xfb\x7c\x0b\x5c\x20\x79\x35\xad\x54\xa4\xff\x1a\x41\x93\xa2\xab\x6b\x24\x69\x7a\xd3\x09\x9e\x93\x1b\x48\x4e\x0d\x7e\xa1\xc0\x14\x94\x15\xb0\x9a\x55\x02\xcb\x04\x77\x29\x2d\x01\xac\xa0\x2c\x8a\x29\x8b\x38\x6f\x65\x0c\x2c\x3e\xca\x16\x0f\x7a\xd0\xc8\xca\x56\xf2\x3f\xa0\x4e\x69\xa1\xad\x05\x6f\xc9\x03\xa5\x85\x96\xb1\xb5\x92\xd7\xdd\x22\x0b\x5a\x69\xa2\xa5\x89\x96\xc6\x59\x1a\x67\x05\x96\x4b\x5e\x5a\x25\x60\x05\xd5\x2a\x01\x56\x82\x76\x94\x36\x62\xf2\x57\x2d\x6d\x6c\x69\x63\x2b\x6d\x6c\x73\x41\x59\x0a\x98\x92\x6e\x6c\xe9\xc6\xb6\x14\x94\x25\xff\x4b\xbb\x5a\xe6\x5f\x2b\xd8\xf6\x96\xae\x6b\x05\xdc\xdb\xd2\xae\x96\xae\x93\x1d\x48\x75\x48\x85\x9d\xbc\xbe\xe3\xf5\x92\x81\x4f\x61\x38\x55\x92\x36\x5b\xb1\x37\x29\x8c\xcb\x8a\xe4\xa3\xaa\xe3\xf5\x1d\xaf\xef\xa4\x8f\xf0\xdc\x52\x30\x21\xaa\x93\xb6\xc0\x79\xa8\x4e\xda\x02\xeb\xa1\x3a\x69\x0b\x8e\x50\x0a\xab\x84\x82\xd3\x50\xf0\x12\x0a\xf7\x26\x25\x6b\x54\xe1\xe5\xa0\x48\xe0\xa7\x1c\x1d\x25\x59\xa7\x14\x5b\x8f\x72\xd2\x52\x47\x4b\x65\x07\x52\xe4\xcb\x52\x8e\x2e\x72\xb4\x11\x0b\xbc\x72\xd2\x46\x47\x1b\x1d\xca\x32\xd7\x09\x58\x12\x41\x1d\x98\x92\x12\x1b\xa1\x22\xb7\xb4\x72\x02\xc9\x64\xf1\xe0\x99\xaa\xc4\x60\xa0\x90\xe5\x94\xe4\xb5\x53\x08\x67\x0a\x03\xb2\xf2\xad\xdc\xa7\x0b\x3c\x4c\xb4\xf2\x92\x18\x1f\x09\x3a\xb0\xea\xb0\x67\x2b\x9c\x0c\x15\xf6\x50\x15\xd0\x3b\xc1\xba\x2b\x01\x62\xa8\x80\x36\x32\xa0\x47\xc2\x9d\x50\x85\x5a\x52\xef\xe3\xe9\x1d\x24\x6a\x02\xca\x68\x25\x2e\x82\x8a\xb4\x62\x5a\x21\x5c\x2a\x76\x43\xad\x60\xfd\x55\x21\x20\x46\x04\x42\x05\x5f\xac\x15\x12\xa1\xc2\x02\xa1\x15\xc8\x37\xc5\x9b\xb5\x42\xf6\x53\xb5\x90\x81\x48\x24\xb5\xb8\x56\x92\x9c\x1d\x37\x01\x9d\x15\x92\x33\x5f\xf2\xd8\x0b\xba\xb0\x42\xaa\xae\x32\xb9\x40\x04\x86\x41\xd1\x78\x43\xe9\x0a\xd1\xb2\xc2\x3b\xb6\x6a\x25\xdb\xbd\x13\x64\x9f\x23\x9b\xbd\x64\xab\xc7\xdf\xb8\xc6\x1b\xb6\x46\xa0\xac\x71\x5f\x6d\x04\x63\xd7\xe0\x34\x2c\xd8\x26\xdd\xe0\x11\x6c\xf1\x39\xd0\x16\xf7\x63\xcb\x1a\xd1\x80\xad\xb5\xa0\x91\xb4\x45\x6a\xb5\xe0\x18\xad\x80\xf8\xc0\x16\x69\x71\x25\xd2\x2d\xda\x83\x36\x93\xdc\xf1\x88\xe2\xad\xf8\x4c\xb7\x34\x56\xb2\x19\x69\x56\x99\x6e\x31\xb0\xe8\x16\x3f\xda\x96\xc0\xcf\xba\x15\xdc\x1d\x19\x18\x35\xb6\x7f\x2d\x87\xaf\x86\xa1\xd6\x92\x51\x58\x63\xfb\xd7\xf0\xc9\x1a\xec\x85\xee\x08\x35\xa5\x49\x36\xab\x05\x4a\xa7\x9d\x5c\x48\xf2\x79\x27\xc9\xde\x05\x4a\xa7\x82\xf0\xdc\x41\xb2\xae\x6b\x52\xa8\x13\xf0\x1c\x63\xaa\x71\x92\xd8\x1c\xe9\x29\x53\xe2\xec\xd1\x34\x94\xc2\x10\x4b\x9c\xee\x0a\xde\x16\x0b\x93\x2d\x61\xed\xca\x46\x58\x5f\xc9\x52\x0e\x03\x1c\x04\xaf\x06\x1c\x0d\x54\x15\xf9\x27\x6d\x6d\x04\xc1\x86\x8f\x5d\x0d\xa7\x5b\xc3\x11\xd6\xf8\x9d\xd5\x0c\xab\xad\x3b\x00\x6e\x82\xd3\xaa\xe5\x51\x24\x1a\x6f\x8c\x04\xca\xc6\x21\xaf\xc9\x05\x6c\x86\xab\x9c\x20\x2d\x2d\x27\x81\x6d\x80\x24\xdb\x06\x00\x58\x03\xa6\xce\x1a\x41\x86\xc1\x44\x5b\xbc\xf1\x2c\xec\x30\xdb\xb7\xb5\x95\x44\xbd\xe6\x73\x00\xca\x5b\xdb\x4a\xb8\x6b\x18\x46\x8b\x5f\x9a\x85\x61\xb4\x30\x89\x16\x8f\x34\x4b\x02\x76\xeb\xa5\x36\xb0\x37\x4b\x24\x24\x8b\x63\x5a\xcb\xf9\x66\x5b\xa0\x66\x6d\x14\x7a\x6d\xeb\x05\xdb\xe5\x17\xd7\x41\xec\x8f\x01\xe7\xf8\xe0\x8d\x5c\x98\xd9\x4c\xdb\x2e\x38\xb1\x7a\x63\xda\x15\x56\xa5\xb2\x29\xe6\x47\x70\xd6\x7b\x63\x26\x25\x98\x0d\xc1\x13\x0c\x69\xe0\x84\x1b\xea\x13\xe8\x49\x3e\x37\x68\x7d\x99\xf2\xa8\x4e\xd2\x81\x0a\x16\x09\xd7\x6f\x87\x12\x65\x97\x32\x73\xb0\x1d\xab\x7c\x84\x09\x30\x82\x2b\x12\x86\x14\xfe\xb2\x12\xbc\x45\x6d\x12\x7e\xb8\xb5\xa9\x31\xd9\xc8\x8b\x84\x41\x14\x9e\xb0\xd8\x73\x86\xa4\xda\x1b\x90\x18\x3c\x45\x10\xe7\xce\xc1\xd1\x39\x41\xfc\x48\xde\x37\x90\xa3\x7d\x8e\x70\x6f\xba\xd4\x3a\x2b\xa6\x73\x41\xa7\x90\x25\x7a\x30\x56\x2a\x81\x97\x88\xcf\x19\x5f\x28\x99\x09\x43\x2e\xf6\x4a\x8c\xe9\xa0\x80\x76\x79\x3d\x05\x7d\xc2\x0d\xc9\x16\x5a\x4a\x28\xcf\x9e\x83\xec\x12\x27\xb5\x2a\x1f\xc1\x52\x04\xc5\xd2\xf7\x0c\xe6\xfc\xa1\x4b\x00\x89\x39\x2b\x68\x10\xf8\xef\x21\x97\xb6\x7c\x26\x28\x1d\x87\x99\xd5\x67\x3d\x62\x40\xa5\x66\x59\x9a\xa3\xc5\xe8\x6f\xda\x91\x64\xd1\xe7\x14\xec\x93\x58\xf6\xd8\xac\x62\xb1\xf3\xfc\xeb\x19\xf5\x31\x8b\x4e\x69\x16\xbb\x10\x8e\x92\x58\xdd\x39\xc9\x56\x2c\xec\xba\x64\x7d\xf6\x79\x3a\xfd\x64\x62\x09\x80\x68\xb0\x89\x3f\xd8\x0f\x81\x18\xc5\x25\xdf\x72\x6f\xe4\xee\xd1\x44\x3b\xb8\x46\xd5\xa7\x84\x95\x46\x97\xc9\x8c\xca\x24\x2b\xa2\xe0\x4b\xfa\xac\x9e\x22\xbe\x48\x2a\xe5\x4c\xda\xd8\x27\x24\x96\xcf\x15\x51\x44\xb2\x78\xf6\x49\x51\x8b\x3d\x5e\xaa\xee\x91\x25\x7c\x34\x19\x82\x49\xcf\xef\x9c\xf8\x7c\xb9\x86\xe6\x4a\x4a\x64\x1f\x46\x10\x0d\x1f\x7a\x3c\x43\x9e\x00\xbd\xb2\x72\x04\xb7\x18\x65\x97\x26\xfb\x75\x10\xb8\x54\x20\x3b\x70\x10\x9c\x5a\x60\x55\x07\x3d\xc2\x45\x48\xb0\xf2\xc6\xa7\x09\x55\x5d\x29\x31\xc0\x24\xcd\xb0\x64\x37\x1e\xb0\x5e\x6d\xb2\x40\x24\x01\xaf\xab\xdb\x04\x0f\x44\xe2\x53\x2f\xc8\x45\x9f\xe7\xa3\xc4\xa4\x03\xd8\xa4\x4c\x86\xab\x14\xb8\x00\x7b\x43\x9d\x2f\xf6\x39\x6e\x25\xcf\xfe\x80\x13\x98\x24\x2e\xed\xb7\x01\x49\x48\x2f\x83\x46\x82\xf7\x4e\x4b\xd2\x52\x84\x35\xb0\xe9\xae\x03\x57\xd1\x19\xf1\x5e\x35\xa3\xc9\x49\x43\xfc\x90\x2d\x73\x84\xe4\xe8\xa5\x52\xd7\x43\xdf\x64\x44\x6d\x9a\xc7\x70\xd8\x58\x7c\x9a\x8a\xf0\x71\xb7\xcf\x01\xf8\xd2\x76\xcb\xd5\xf9\xd9\x58\x54\x1b\x84\x90\x36\x95\x3e\x70\xf4\x12\xe7\x90\x06\xbb\x5d\x03\xbb\xd6\x8b\x25\xb0\xcd\x83\xf0\xd1\x8b\x1d\xea\x50\xec\xa0\xec\x76\x52\xc7\x20\x5c\xf4\x62\x85\x4a\xc4\x83\x5e\x30\x50\xa9\x44\x40\x29\x5e\x57\x26\x61\xfb\x71\x6f\xa2\xf2\x84\xdf\xa7\xec\xf6\x7c\x3e\x96\x28\x5c\x9f\x55\x8b\x80\x79\x1b\x83\xdf\x25\x0c\xbe\x30\xe5\xbc\xae\x13\x77\xc2\x9e\xc1\xe7\xb3\x07\x6e\x1d\x77\x24\xf1\xb5\x19\xb8\xf5\x2a\x65\xd6\x29\xdb\x09\xaf\xce\x9e\xbf\x63\xcf\x7b\x96\x5c\xdd\xc8\x92\x77\x7b\x96\x9c\x77\x0f\x5c\x78\xcf\x7f\xeb\xdb\x38\xef\x31\x6f\x1c\x84\xd1\xa5\xc4\xbd\x07\x77\x12\x85\x89\x05\x2f\x56\x8d\x5b\x41\xe4\x7f\x29\xab\xdb\x39\x5e\x22\xaf\xa8\x5a\x18\x5e\xb9\x21\x5e\x43\x63\x86\x17\xc7\x14\x8c\x0c\x55\x2b\xee\x29\x18\xad\x50\x2d\x69\xdc\xd9\x75\x03\x63\xa4\x1b\x4c\x44\x0d\xcc\xca\x9e\x57\xa5\xd4\x94\x42\x45\x7b\x2d\x51\x73\x2c\x86\x27\x8b\x33\x92\xa5\xbd\x16\x2f\x24\x4b\xd4\x19\x4b\xa3\x2d\x3b\x85\xb6\x30\xd0\x03\xb7\x5a\x50\xe2\x57\x92\x39\xe1\x5c\x35\x65\xb6\xe7\x62\x07\x8e\x95\xb2\xa4\x24\x97\x13\x46\x95\x96\x68\x21\xad\xef\x7d\x4f\x3a\x4a\x9c\x52\xb0\x4d\x8c\x99\x5a\x3e\x05\x38\xa6\x06\x82\xac\x71\x5e\x8b\x0c\x2c\xbc\xa6\x1f\x38\x4e\x8b\x32\xc1\xe2\xf8\x3c\xb0\x89\x73\x0c\x22\x6c\x1e\xda\xcb\x81\xff\x13\xc6\x0f\x2f\x04\x3c\x02\x1a\xf4\x7a\x0d\x41\x04\x64\x75\xf6\x0c\xa1\xe5\x3d\x78\x61\x5a\xfc\x2f\xad\x45\xc1\xba\xe3\x04\xf7\x8c\xa0\xe7\x7f\xef\x27\xcc\x5d\x1b\x85\x4c\xdb\xe2\xf2\xd0\x7a\x61\xf4\x2a\xca\x26\xe5\xf6\x26\x7c\x5c\x3e\xca\xb1\x7a\xc8\x13\xc9\x85\xa8\x0d\xeb\x04\xd5\x96\xf0\x42\x23\xf6\xa7\x67\x12\x42\xc2\x0a\xf9\x84\xef\x01\x91\x39\x00\xd5\x24\x75\xb2\xf0\x79\x3d\x3e\x8e\xf3\x47\x99\x84\x05\x42\xf3\x95\x49\x88\x72\xfd\xe3\x59\xa0\x39\x46\xa7\xcf\xc9\xcf\x37\x03\x55\xed\xf8\x9c\xc9\x37\xf7\x81\x0b\xe4\x27\x98\xa2\x4e\xa7\xdc\x90\x4e\xb8\x21\xe2\x1b\x08\x8c\x7c\xe0\x83\xfa\x6f\x6c\x45\x0d\xb8\x67\x35\xac\x40\xfa\xe5\x7f\xc9\xe4\x0b\x7e\x1e\xac\x67\xe0\x24\x0a\xa6\x9c\xe3\x94\x04\xcd\xda\xb3\x45\x37\xf2\x4b\x6e\xca\x28\x0d\x2c\x92\xf0\x4b\xa2\xc4\x24\x7d\x40\xcf\x22\x09\x3b\xd4\xa3\xfc\x00\x76\x36\xd5\x84\xe7\xe1\xbd\x92\xe1\x58\x7a\x85\x4e\x6b\xf3\x43\x5e\x85\x97\x34\xdc\x68\x38\x2e\xc1\xe1\xef\x79\x14\x61\x40\x46\xac\xc7\x98\xcf\xd8\xb1\x14\x94\xe5\x88\xa3\x48\x0f\x4e\xbf\x3b\x38\x7f\xbd\xea\x2e\xd7\x57\x87\x47\x67\x4e\x84\x46\xf4\x9a\x1a\xe9\xc8\x28\x87\x79\x4c\x61\xe5\x51\x28\x5d\x8d\x62\xbd\x94\x12\x8b\xa3\xac\x4c\xf2\x8a\xd5\xee\x15\xdf\xac\x57\x57\xb3\xc7\xf3\xbc\x26\xb5\xfa\xa0\x49\x9d\x68\x52\x8d\x68\x52\xf7\x8a\x54\x39\xba\x1b\x4e\xd4\x26\x77\xef\x50\xa7\xee\xf5\xa8\x9d\x4e\xf5\xa8\xee\x26\x75\x29\xa5\xd9\x6b\x4b\x01\x3f\xfd\x74\x65\x29\xa5\xd9\xeb\x4a\xa5\x15\x3b\x5d\x29\x65\xfd\x5e\x3a\xd2\x44\x39\xca\x2f\xd2\x0f\x83\x8a\xb4\xd7\x87\x52\x96\xf3\xea\x50\xd8\x30\xd1\x79\xb2\x6b\x4f\x95\x9d\xea\xa7\x2a\x3b\x13\x2d\x67\x10\xf5\x26\x65\xb7\x57\x6b\x8e\x55\x99\x94\x7a\xaa\xc9\x94\xef\x19\x34\x99\xee\x50\x5f\xb9\x57\x54\x0a\x10\x2c\x55\x54\xfe\x8d\xf5\x91\xbd\x0e\x12\xb0\x96\xb8\xd7\xfc\x24\x85\xa4\xc4\x2a\x84\xff\x51\xa2\x15\x54\x28\xc7\x14\xf1\xfc\x54\x26\x3e\xd9\x2e\xd1\x5a\xd6\x37\x28\x2d\x27\xaa\x49\x4a\x70\x43\x68\x08\x7b\x2d\xe5\xcf\xa4\x98\xa4\x84\xbf\x23\x71\xbc\x26\x82\x91\xc6\x01\x50\x57\x68\x2b\x7e\x92\xde\xd2\x50\x56\x94\x70\x8c\x20\x85\x9a\xac\x19\x69\x32\x29\xeb\x44\x9d\x89\x7f\x31\xa1\x09\xf6\x4a\x4d\x4a\x43\x29\xda\xce\x52\x14\x9c\xd9\x4d\xda\x4e\xbe\x00\x8d\xd7\x54\xf3\x99\x89\xe6\x93\x52\x74\x99\x8c\x0a\x2b\x4f\xb7\x80\x93\xa6\xba\x50\x4a\x61\x29\x8d\xa8\x42\x61\x45\x81\xeb\xb4\x7c\x73\x6b\xdb\x91\x8e\x94\x92\xdb\x44\xf2\x43\x85\xa6\x5b\xf4\x98\xba\x25\x88\x9f\x1c\xdc\x9a\xb8\x49\x1a\x9d\xc1\xad\x7a\x54\x45\x69\x6e\x52\xaa\xd6\x3f\x42\xa7\x0a\xa6\x41\x11\x5a\x4d\xf9\xe2\x27\xa8\x59\xdd\xa1\x9a\xf5\xdf\xa2\x5f\x45\x73\x0a\xa8\xa0\x57\xaf\x76\xf9\x8f\xd7\xa8\xea\x54\xa3\x6a\x44\xa3\x4a\x29\xc4\x84\xe7\xe2\x98\xb0\x04\x4c\x99\xe8\x58\x81\x2e\x58\xe2\xa4\x11\xe5\xc4\x12\xdf\x64\x4e\xf7\x8a\x3b\xf1\x4f\x50\xb7\x8a\x1b\xaf\x4b\xf4\xac\xc2\x96\xd7\xff\x85\x15\xac\xfa\x46\xcd\xaa\xb0\x88\xd9\x5e\x0f\x36\x70\xd4\x37\x6a\x59\x71\x3d\x73\xe2\xd2\xda\xab\x5c\x07\x35\x2b\xa5\x30\xdc\x62\xcb\x17\x8f\xcd\xb1\x96\x55\xf4\xab\xa2\x4c\xcd\xc4\xfc\x9e\x27\x0a\xa4\x91\xc6\x95\x4f\xcf\x46\x7a\x57\x4a\x3d\x55\xbb\x8a\x6b\xed\xfb\x28\x51\x53\x65\xa0\x28\xb4\xd0\x4c\x4c\xf4\xaa\x7d\x87\xd4\xbb\xae\xe0\xb8\x75\x20\x9b\x1c\xc8\xa6\x41\xeb\xda\x9a\x54\xa0\xe2\x13\x5b\x37\x15\xae\x46\x0a\xd8\x2c\x1d\x63\xb7\x1f\xe9\x41\x25\x4b\xe9\xf6\x9e\x2a\x84\x47\x9d\x28\x69\x7b\xbf\x62\x71\x25\x36\x85\xf8\x8c\xce\xaa\x6f\x43\x22\x4b\x65\x4d\xa2\xca\x6d\x13\x0d\xa7\x4f\x54\xb5\xf9\x48\x55\xbb\x18\xbc\x16\x45\x5f\x3b\xaf\xa9\xad\xdf\xa1\xa9\x65\x64\x8b\x66\x46\x6d\xcb\x1d\x71\xca\x9b\xa8\x70\x45\x74\x9a\xa8\x70\xdd\x4d\x8a\x5c\x71\x24\xc4\x9f\x76\x10\x0c\xb3\x3d\x18\xe5\xa7\x2a\x78\x47\x3a\xdd\x22\x55\xe9\x8a\xee\xf6\xa7\x69\x74\x27\x4a\xdc\xf7\x50\xdc\x56\x89\xe2\xf6\x83\xae\xf6\x76\x5d\xed\x37\x7b\x71\xf0\xfa\x45\xbb\xf3\x7f\x52\x0f\x9a\xc5\xab\xd6\x2c\x5e\xb5\xd9\xe2\x55\x1b\xff\xef\x1e\x2c\x5e\xb5\x12\xdc\x4c\x44\x3a\x02\xa7\x97\x41\x2e\x70\x4f\xa8\x44\x37\x09\x80\x4b\x35\xa5\xc4\xfa\x42\x88\x94\xac\xbb\x8a\x60\x15\xaa\x09\x12\x71\x8c\x3a\x56\xc8\x88\x42\xa1\xac\x90\xa1\xff\x51\xad\xdc\x69\xb9\xd3\x4a\x2c\xae\x96\x18\xec\x62\xca\x55\xe8\xbe\x54\x27\x64\x1d\x64\x12\x8e\x4f\x75\x95\x44\x6e\x92\x3b\x3c\xcd\x49\xc8\x28\x87\xaf\x92\x93\x3a\x84\xe8\x53\x4e\xc8\x1c\x64\x1e\x97\x4a\x85\x63\xa0\x12\xf7\x4f\x45\x0c\x64\x25\xd1\x87\x15\x2e\xd2\x5a\x49\x50\x1c\x45\xf0\x6a\x09\xe5\xa7\x61\x2c\x74\x56\xc2\x24\x66\x70\x76\xa5\xc4\x7a\x81\x8f\xd0\x95\x04\xfe\xad\xe0\xab\xaa\x20\x17\x30\x3b\xb5\x44\x39\x46\x3c\xd5\x0d\x67\x92\x46\xed\xad\x1b\x61\xa9\x1a\x90\xcc\x56\x6c\xdb\x56\x64\x7f\x79\xa9\xe5\xa5\xad\x44\xc5\x69\xe1\xc6\x5b\x61\x24\x89\xb4\xa5\x3b\x69\x68\x47\x43\x25\x02\x82\xee\x22\x99\x21\x4e\x92\x51\xf0\x3e\x46\x55\xfc\x24\x11\x66\x14\x41\x7c\x75\x21\x60\x5e\x60\xb5\xba\x96\xa8\x34\xdc\xc9\x25\x4d\x0e\xb1\xeb\x4d\x8e\x68\x6e\x08\xce\x6e\x2a\x89\x11\x5c\x49\x9c\xdf\x00\xbb\xa5\x44\xeb\x28\x71\x62\x0c\xbc\x17\xdb\x53\x86\x4c\x91\x69\x36\xa6\x8c\x04\x13\x99\xa1\x8f\x33\xf2\x1b\x64\x06\x60\x74\x66\x62\x47\x64\x86\xbd\x31\x33\x05\x17\xb5\x90\xd5\x90\xb5\x72\xa7\x95\x68\x2f\xa2\xf1\x20\xa2\x6c\x29\xa9\x9e\x89\xb6\x67\x6b\x09\xb1\x52\xc3\x1e\xd5\x12\x3b\xa6\x76\x30\x57\x12\x2e\xa5\x51\x5c\xc8\x9d\x46\xee\x04\xb9\x20\x12\xa2\xa5\x3f\xac\x25\x36\x6c\x2b\x77\xda\x40\xb0\x43\x86\x2f\x04\xdd\xcc\x32\x3b\x3d\x82\x2f\x93\xe4\x6c\xb2\x04\xab\x5a\x94\x4c\xbb\xdd\xc8\x7b\xd9\x37\x48\x8e\x1b\x7a\xaf\x4c\xb6\x83\x80\x2e\xaf\xf7\x22\x16\xad\x57\x70\xc5\x28\xb0\x45\x8f\x66\xb4\xcd\x28\x2e\x45\x21\xdb\x0c\x0e\xad\x9d\xf8\xa5\x76\x95\x00\x13\xc5\x47\x5f\x3c\xf1\x83\x6c\x40\x81\xe3\x77\xc0\x14\xb6\xd3\xd3\x59\x3c\x7d\x85\x1b\x11\x19\xd7\xc1\x5b\xef\x40\x93\xa8\x2c\x09\x98\x3e\xf8\xbd\x36\x2e\xd9\x16\x7d\xdb\xef\x59\xb0\x5b\x12\x9e\x83\x96\x85\x4a\x2e\x24\xe3\xa2\x58\x18\xc3\xb0\x7b\xf6\x18\xce\x60\x93\x26\x0e\x5b\x21\xfa\xbd\x21\x52\x85\x4f\x0d\xb2\x65\xa2\x8c\xc3\xd9\x37\x48\x54\xd6\x5d\x60\xd2\x9e\xcd\x93\x20\xac\x6c\x1c\xae\x93\xe3\x08\x49\x24\xee\xb3\xf2\x0e\xf9\x5a\x79\xa1\xe3\x8e\x0c\x93\xe3\xd4\xda\x1d\x61\xcd\x88\x65\x1a\xc2\x9f\x34\xe9\xae\x2c\xda\xc8\x1e\x5f\xca\xc5\x10\x4a\xa3\x49\xcf\xbf\x31\x33\x92\x06\x00\xd9\xf9\x7a\x8f\x8f\xfd\xfe\x65\x1c\x4a\x7b\x92\x45\x12\xa7\x40\x42\xb2\xca\xf3\x5d\x3e\xf2\xd2\x1f\xdc\xc1\xfd\xe8\x60\xee\xfb\xb4\x4c\x03\xae\x14\x72\x21\x0a\xe9\x21\xfc\x43\x8f\x9a\x1d\x02\x84\x94\xe9\x21\xbc\x8b\x19\x20\xd6\xfa\x9e\xb7\xac\x53\x60\x6d\xe8\xc4\xf6\x1f\x46\x47\xe5\x0e\xb0\xda\xcc\xf4\x70\x7f\xd4\x75\x32\x7f\x65\x32\x4e\xfa\x45\xbc\xcd\x3b\x94\x10\x8e\x40\xe1\xae\xb3\x2e\x99\xef\xad\xdc\x11\x35\xaf\xb0\x67\x84\xdd\x76\x4e\x78\xbf\x7d\x48\xd1\x2e\x3d\x34\x55\xd7\xff\x8a\xa3\x73\x90\x86\x85\xd0\xa4\x47\xa9\xdb\x9d\xa5\x5f\xf8\x6e\xf9\xc2\x5e\x9e\x1d\x9c\xa9\x3f\xc3\xf1\xf9\xbe\x27\x66\x7f\x48\x72\x67\x7c\x48\x8e\xce\xc5\xfe\x28\xe4\xce\x8f\x3c\x0a\x49\x0d\x71\xf3\x51\x38\x3a\xf0\xde\xe3\x8c\x6b\x7e\xee\x33\x6e\x7c\x1c\xfc\x3b\x6d\xfa\xf3\x5b\xb2\xc8\xa1\xbb\xbd\x6b\xb4\x0f\x95\xe5\x8f\xde\x87\xfe\x06\x5b\x4f\x33\xb7\xf5\x08\x1e\xfd\xd6\xad\xa7\x68\x6e\xde\x7a\xde\x63\x5f\xf9\x59\x76\x84\x83\x4d\xe0\x96\x45\x9a\xa4\x2c\xc3\xe1\x7f\xbc\x46\x27\x4c\x9b\xd1\xe5\x1c\x17\x54\xbf\x9b\xb1\x49\xb8\x8f\x59\xae\x60\x60\x04\xf2\x77\x1d\xf1\xd3\xad\x3a\xf9\x94\x69\x84\xe3\xf1\x97\xdc\xc0\xbe\x8f\xb8\xef\x31\x5b\x2d\x9b\x51\xcf\x56\xa7\x9c\xf4\x98\x79\x96\x94\x9e\xc2\x3c\x4b\x10\xa1\x9e\x2b\x1e\xf1\xbe\x23\x0e\x17\x06\xf6\xbd\x59\xce\x22\xfc\x34\x5e\xf3\xe7\xe5\x25\xf7\x1c\xe3\xbb\xd9\xba\xaa\xf8\x51\x6c\xdd\x7f\x03\x3e\xed\xe7\x61\xcd\x8a\x11\xcf\x95\xee\x75\xa4\xaa\x3c\xe4\x98\xfa\x16\x98\xf1\x4e\x65\xf7\x4c\xd2\x94\x15\xea\x83\x91\xff\x6c\xac\xcd\x84\x43\xf9\x9b\x33\x25\xfb\xed\xe0\xdb\xdd\x6e\xf0\xed\xf5\xaa\xdb\x5e\xdb\xed\x72\xbd\xea\x37\x83\x3b\x0f\xfe\xc7\xff\xef\xc1\x62\xf1\xbf\x4e\x1e\x2c\x16\xbf\x78\xf8\xc9\x62\xf1\xe8\xff\xbf\x58\x3c\x7d\xb0\x58\x3c\x3b\x5b\x2c\x7e\x58\x2c\xde\x2e\x5e\x59\xbd\x78\x65\xab\xc5\x2b\xdb\x2e\x5e\xb5\xe5\xe2\x55\x5b\x2d\x5e\xb5\xf1\x7f\x49\xfe\x26\xb1\x10\xb0\x01\x17\x92\x66\x17\x2b\x6e\x21\x0e\x36\x84\x07\x28\xd8\x5f\x0a\x6c\x79\x05\x2e\xf8\x05\xe6\xb6\x02\x4b\x6c\x81\x13\x7c\x49\x9a\xae\x12\x77\x76\x02\xd3\xab\x92\x64\x5d\x25\x89\xb8\x4a\x5c\xd5\x09\xdc\xa9\xca\x52\x6c\xbe\xe4\x64\x2b\xb1\xa7\x49\xc4\x5a\x55\x51\xa3\x92\xd4\xbf\xec\x2f\x4a\xd6\xaa\xaa\x01\x20\xd5\x6c\x53\x0d\xc1\x10\x1a\x52\xbd\x35\x95\x44\x11\xc7\x8e\x49\xb8\x03\x8b\x7b\x3e\xe1\x59\x15\x3e\xa3\x0a\x9e\x5e\x11\x2f\x48\xe1\xa1\xad\xd0\xbd\xa9\x20\x71\x9e\x03\x9e\xf6\x24\x4f\x50\x21\xeb\x37\x3d\xcc\x73\x24\x4e\x94\x74\x3f\x2a\xd0\xce\x20\x5c\x12\x42\xbb\x92\x40\xc3\x0a\x56\x47\x91\xe7\x28\x13\xa8\x7b\x86\x73\x77\x8e\x6b\x3c\x91\x49\x35\x09\x52\x34\x31\xfa\x75\xc9\x4a\xd4\x98\xbc\x35\xc9\x4f\x34\x5e\x89\xba\x72\x3d\x1c\x5f\x2e\x6a\xb9\x20\x6a\xae\x18\x8a\x88\x52\xaa\x1b\x50\x45\x0d\x19\x91\x2c\x4e\xf2\x96\x3c\x5f\x56\x3c\xf6\x2d\x10\x23\x2b\xd1\x72\xac\x18\x7f\x24\x64\x6d\x8b\xcd\xaa\x25\xa9\x80\x6e\x49\x5e\xd6\xa1\xfa\xd2\x68\x12\x35\x27\x82\x66\x87\xd2\x02\x46\xd3\xc0\xd0\xb4\x64\xc7\x51\xe2\x42\xac\xc8\x67\xa3\xc4\x21\x58\xe5\xdc\x91\xb4\xbc\xaa\xc0\x7e\x53\x64\x72\x01\x82\x81\xc4\x07\xaa\xe2\x7f\xb2\x06\x11\xb1\xd9\x64\x68\xca\x4c\xa6\xe2\xe6\x9f\xc5\x8d\xdc\x64\x26\x1e\x24\x15\x9e\x77\xa6\xc2\x0b\x18\x80\x97\xc1\xe6\x67\x2a\x2f\x87\x42\xdc\xbf\x4c\x03\x72\xc1\x34\xb8\xf5\x36\x12\xd5\xb6\x21\x55\x0f\x91\xe4\x0d\xf3\xc1\x74\xa1\x11\xe3\x11\x0e\xb3\x41\xf2\xf3\x60\x42\xe2\xb4\x12\x1d\xa0\x01\xe2\x63\x04\x05\x63\x98\x24\x06\xf7\xfe\x4c\x29\x61\x00\x54\x46\x29\x0c\x80\xd6\x94\xb9\x5c\x60\x82\xca\x14\x25\x2a\x11\xcb\xff\x84\x84\x25\xf8\x83\xe5\x44\xb3\x25\xee\x7d\xb6\x54\x62\x94\x22\x89\x0e\x8e\x9c\xa5\x84\x92\x2d\x25\x94\xac\x58\xab\xea\x8a\x8b\xce\x53\x72\x5e\x49\xd2\x87\x9a\x04\x2d\x35\xd1\x73\x1b\xcc\x43\x0d\x20\xac\x86\xf4\x0c\x02\x35\xb0\x80\x0c\x6c\xe3\xb8\xed\x30\xf7\x48\x12\x07\x0b\x95\xe5\x86\x95\x1b\x18\xc1\x2c\x76\xac\xd6\xb7\xc4\x34\xf5\x94\x18\x7a\x84\x0d\x26\xab\x5c\x90\xee\x09\x74\x4c\xf0\x04\x3b\x0f\x84\xd2\x0a\xe4\x65\x0b\x84\x33\x08\x84\x33\x08\x64\x64\x0b\x41\x89\x7f\x67\xec\xbd\x20\x61\x0b\x43\x50\x24\x21\xc6\xd0\x13\x70\xa5\x0f\x41\xf3\x93\xa6\x8a\xe6\x17\x43\x82\x09\x26\x66\x60\x21\x06\xe0\x54\x01\xdf\xf9\x80\xef\x7c\x90\xdc\xd7\x21\x94\x37\x9c\xe0\xfd\x26\x8a\x62\x59\x12\x4e\xb8\xc1\x10\x84\x0e\xbb\x0c\xa3\x73\x1a\x1d\xb7\xde\x07\x04\xdc\x31\xd5\x72\xa4\x86\x94\x3d\x2d\x85\xa7\x7e\xb0\x87\x79\x35\x72\xd1\x74\xe9\x91\x29\x86\x8b\x50\x14\x23\x6e\xb8\x3f\x04\x87\x50\x8a\xe8\xb8\xfb\x5c\x33\x78\x8e\xb6\xe2\x39\x2a\xc0\xad\x81\x3b\xce\x76\xec\xa4\x43\x39\xed\xfa\x1c\xc6\x1d\x3c\x49\xe7\xf6\x96\x09\x27\xb6\x28\x37\x32\xa1\xc1\x10\xd8\xb1\x38\x21\x00\xb4\x3e\x0b\x4f\x21\x11\x1d\x69\x86\x84\x76\x25\xcc\xee\x10\xe5\xd2\x49\x00\x36\x61\x77\x68\xcc\x8e\xe1\x17\xa0\x7f\xef\xff\xe9\x47\xe7\xb5\x58\x55\x06\x6d\x35\xcf\xf3\x82\x30\x13\x83\x57\x2e\x06\x8f\xde\xfa\x81\xe6\xbd\x91\x9c\x38\x76\x7c\xc4\xcb\x8b\x7b\xc4\x5b\x25\xa1\x11\x25\xe9\x8d\x58\x20\xea\x54\xae\xe8\x79\xea\x21\x00\xde\xd8\x2e\x81\x53\x6a\x9f\x58\x07\x98\x57\x90\x54\x23\xbd\xfd\x6c\xb0\x10\xf4\x1c\x42\x23\x61\xe1\x1a\x98\x11\x6f\x06\xe3\x04\x56\x89\x90\x9a\x12\x6a\x21\xac\xc7\xb9\x71\x0a\x09\xe3\x97\x2a\xe4\xbf\xdd\x83\xa7\x3f\x5f\xaf\x56\xbe\xdb\xae\x37\x67\x87\x27\xfa\x19\xdb\x2b\xd6\xf1\x1c\xae\xba\x20\x68\x70\xc6\x3a\xcb\xf8\x9f\x08\x78\x81\xcd\x2a\x2e\x8e\xe4\x15\x89\xa2\xc2\x5e\x5d\xcc\x3c\x7d\xb1\x78\x30\x3e\xd6\xfb\x73\x0a\xfb\xf7\x6e\x8f\x27\x40\x04\x01\x64\x0d\x31\x59\x0c\x56\x3a\x03\x3c\xd0\x60\x9f\xcb\x94\xee\xf6\xbb\x5f\xdc\xf7\x02\x46\xcc\x00\x90\x30\xb0\x74\xfa\xcd\x21\x28\x37\x59\xa5\x12\x16\xcf\x25\xed\xde\xc3\xe3\x3e\xbf\x5c\x5f\xf9\xd9\x86\x1f\x2f\x16\xcf\x22\x43\x13\xcf\xe7\x76\x38\xa5\xe5\x50\x35\x2a\x2f\x93\x83\x46\x8e\x98\x26\x39\x61\xe4\x6c\x69\x28\x5b\x4a\x47\x29\xf2\x86\xa6\xcc\x92\x83\x47\x8e\x9c\x8a\x92\x5a\x44\x57\xa8\x88\xae\x30\x9c\x41\x39\x65\x49\xc9\x41\x44\x3c\x0a\x72\xa7\x98\x86\x36\x90\x3b\xc5\x34\xc4\xa3\x68\x88\x47\xd1\x10\x8f\x62\x38\xb8\x9a\xe4\xdc\x72\x9c\x45\x19\x25\xbd\xcf\x39\xeb\x45\xfc\x54\x52\x92\x20\x48\x89\xf2\x3d\x24\xc7\x11\xe9\x83\x34\x52\xab\x86\x52\x43\xa9\xfd\x70\x4a\xf5\x3b\x3b\x51\x76\x02\x56\xaf\x80\xb1\x32\x30\xae\x01\xc0\x67\xf0\x42\x43\x0c\x6c\x22\xe2\x04\x22\xe2\x04\x24\x8b\x00\xe7\x14\x88\x6d\x13\x88\x6d\x13\x82\x6a\xf6\x5b\xb4\x6c\xcb\x25\x7b\x77\x99\x25\x23\x1b\x76\x23\xfb\xe5\x72\x65\x2f\xe7\x46\xf6\x15\x59\xfc\x68\xba\x51\x84\x23\x51\x32\xdd\x14\xdd\xa1\xe8\x0e\x25\xbf\xd0\x4d\x5a\x3a\x4b\x27\xaf\x59\xee\x5e\xf3\xbb\xd5\x72\xbb\xbc\xe1\x45\x56\x5e\x54\x53\xca\xff\xcc\x1e\xcd\x72\x23\xeb\x22\xb1\x8c\x0c\xb1\x8c\x0c\x29\x58\x0d\xf1\x8b\x0c\x51\x89\x8c\x37\x2a\x79\xe9\x54\x4c\xbf\x81\x3d\xff\x9f\x91\x3f\x5f\x2c\x3e\x4e\x38\xf4\x3d\x57\xbe\xe3\xc8\xdf\x87\x1b\xff\x6f\xc0\x81\xff\xdb\x98\xee\x9e\xdd\xfe\x37\xb0\xd8\x40\xc7\x54\xf5\xf7\xc0\x6f\xcb\x8e\x0c\xbb\x6d\x66\x78\x6f\x12\x49\x28\x9e\x68\x80\xee\x19\xc9\xe3\xb0\xe3\xca\xab\x11\x57\x4e\x59\xec\x79\xf3\x77\xb3\xc7\x94\x9a\x12\xe6\x9b\xa0\x5e\x86\x8c\xc4\xc6\x93\x56\xc4\x10\xbd\xcb\xb0\xaf\x18\x58\x45\x43\x02\x62\x43\xf4\x2e\x43\x18\x58\xe3\x25\x92\xd0\x98\xd1\x96\xb5\x06\xef\x60\x80\x7d\x18\xf2\x08\x1b\x4f\xc4\xbf\x5b\x18\x71\x61\xb4\xff\xd3\xb2\xd8\x3b\xb6\xba\x4c\x99\x6b\x76\xd9\x82\x92\xdf\x71\x96\x0a\x04\x1e\x0b\xc2\x8c\x4e\x78\xef\xc8\xb2\x06\x2f\x5c\xf0\xc0\x88\xbf\x1f\x0b\x5e\xa5\x8c\x38\xa5\x7f\x0f\x6e\x5c\x52\x15\x68\xca\xfc\xef\x9b\xf3\xfe\xc0\x73\x7f\xe0\xb9\xf7\x47\xf4\xd5\xfe\x88\x7e\xe9\x57\xb3\x7c\xe5\xd1\x62\xf1\x74\xb1\xf8\x41\xd4\x3f\x94\xdd\xa0\xb2\x31\x0a\xee\x17\x4e\xca\x28\x62\x9d\xf5\x2a\x0d\x94\x19\x19\x1b\x62\x06\x6b\x22\x5a\x0c\x22\x39\x19\x22\x39\x19\x22\x39\x19\x22\x39\x19\x52\x29\x19\x30\xce\xa6\x22\xeb\x72\xaf\xdc\xf0\xc2\x69\x52\xcb\x53\x8b\x74\xc2\x15\xe9\x84\xf1\xc7\x32\x0d\x69\x98\x1b\xd2\x30\x37\xe8\xce\x1b\xd2\x30\x37\xb4\x81\x2c\x7d\xa6\x21\x0d\x73\x83\xca\xbc\x21\x0d\x73\x43\x1a\xe6\xc6\x09\xa7\x69\x77\xba\x11\x62\x29\x1a\x62\x29\x1a\x62\x29\x1a\x62\x29\x1a\x38\xbe\x4c\x29\xb1\x80\x90\xf5\x47\xc1\xe1\x2b\xe1\x22\x85\xe7\xcf\x29\x49\x13\xa4\xa1\xd4\x50\x92\x6a\x65\xd0\x1b\xb0\x35\x65\xec\x66\x99\xfc\x2f\xbb\x1c\xdb\x1f\xdc\xa2\x17\x4a\xf2\xac\x30\xbd\x03\x38\xb9\x80\x15\x2b\xc0\x1b\x04\x2f\x1c\x65\x6c\x4f\x60\xb6\xec\x14\x00\xec\x4b\x65\xe2\xf9\xf2\x64\xef\x94\xfa\xfa\x45\xbb\xbe\xdc\x8d\xec\x3f\x2c\x16\xf7\x7f\xf9\xe0\x57\x8b\xc5\xbf\xfe\x9f\xc5\xe2\xcd\xff\xbb\x78\x65\xcd\x83\xc5\x2b\x5b\x2e\x5e\xd9\x7a\xf1\xca\x36\x8b\x57\xb6\x5b\xbc\xb2\xfe\xc1\xe2\x55\xab\x17\xaf\xda\x7c\xf1\xaa\xad\x17\xaf\x5c\xb5\x78\x45\x6c\x56\xc9\xeb\xa5\xc8\xeb\xa5\x8c\x38\x00\x18\x9c\x23\x0d\x28\x65\x65\x3c\x71\x6b\xf1\x5e\x31\x92\x47\xd2\x04\x61\xe4\x0a\x18\x39\xe2\xbc\xc2\xd2\x64\x12\x24\x14\xaf\x88\x42\x40\xfb\x05\x11\x68\x4b\x25\x8e\x32\x84\x03\x25\xcf\x91\x2a\x09\x04\xca\x59\xa6\x4a\x27\x89\x25\xc5\xa8\x0c\xc3\x86\xd7\x08\x49\x7b\x55\xd5\xff\x2f\xe8\x2b\x3c\x4b\x82\x78\x96\xe0\xbc\x12\x70\x7c\x0d\x92\x10\x10\x4f\x8c\x20\x89\x06\xb9\xdd\x49\x52\x3a\xd8\x32\x47\x58\x66\x2f\x1e\x9e\xe2\xb5\xca\xc1\xa1\x82\x96\xb2\x10\x4e\x0d\x37\x03\x2d\x5a\x52\x78\x49\x02\x3f\x29\x92\xaa\xa8\x40\xda\xc5\x20\x1e\xb8\x81\x5e\x0b\x12\x9a\x87\x50\xdd\x2a\x90\x12\x92\xbc\x35\x2a\x38\x79\x22\x01\x1d\xc9\x77\xaa\xc9\x3c\xa5\x33\xb1\x0d\x67\xd8\x86\x61\x51\x75\x45\xd8\x43\x1c\x89\x75\xe3\x30\xe2\x35\xf0\x53\x6d\x29\x71\x40\x88\xa3\xd9\x56\x12\x3b\x04\x23\x55\x00\x6d\x1f\x5a\x49\x39\x4f\xce\xfc\xd0\x39\xb9\x20\xd4\xa2\x93\x0b\x72\xde\x07\x2f\x17\x24\xb4\x0f\x24\xab\x0f\x41\x96\x7c\x0e\xbf\x64\x58\xf8\x56\xac\x5b\x48\x0c\xb5\x5c\x20\xec\x49\x10\x55\xa3\x48\x05\x4b\x1c\x71\xa3\xe1\x9b\x34\x19\x46\x0c\x81\xc4\x0d\x81\xc4\x8d\x46\xa4\x20\x60\xb8\xd1\x5a\x92\xba\xc3\x3d\x69\xd2\x08\x1b\x6d\x24\x19\x3c\x61\x15\x61\xf7\x34\x1b\x0b\x41\xc1\x8d\xce\x24\x93\x18\xb1\x1e\x73\xb1\xa9\xd1\x44\x9d\x4b\xb4\xc6\x5c\x92\xc5\x8b\x99\x0d\x5a\xb6\x0a\x2d\x39\x69\x33\x02\x43\x66\x28\xe0\x4c\xc6\xb2\xcf\x08\x58\x63\x72\x76\x82\x5c\x1e\x99\xe7\x16\xcb\x1c\x64\x39\xf2\xaf\xa4\xe1\x32\x64\xc5\x36\x55\x83\x9d\xaf\xea\x64\x1f\xab\x44\x31\xcb\x76\xc6\x59\x6d\x80\xbb\x9b\x86\xe3\xd9\xe0\xaf\x6d\x1a\x3c\xf9\x0c\x33\xd2\x34\x81\x6f\xc5\x99\xc1\xb4\x62\xee\x23\x07\xa5\x69\x39\x02\x0c\xdc\xb2\xe9\xc4\x15\xa0\x63\x5f\x24\xf2\xaa\x21\xde\xbf\x11\xf3\x8d\xf1\xe4\x98\x17\x94\xa6\xc1\x6a\x63\x24\x1e\x85\x09\x64\x72\x17\x33\xb1\x21\x34\x66\xa6\x94\xec\x5d\xec\x72\x1a\x56\xd2\x88\xe6\x56\xf2\xa0\x21\x3d\x67\xec\x75\x99\x04\x6d\x91\x74\xbc\x1d\x76\x47\x45\xa9\x29\x4b\x31\x45\x92\xeb\x0c\xb6\x3d\xd3\x3e\x3e\xcf\x28\x31\x38\x22\x76\x1b\xf1\x4c\x30\x71\x5f\xcb\x4c\x6c\x7b\x26\xc9\x06\x33\x53\x89\x75\x52\xee\xb7\xdc\x91\xc7\x64\xf1\xab\x73\xb1\xf4\xe5\x18\xf7\x6c\xce\xc0\xd9\xbc\x23\xd4\x9e\x40\x1b\x2a\x2d\xd1\x0e\x89\xda\x67\x24\xd3\x38\x81\xf5\x88\xa3\x58\x4b\x46\xad\x9a\xbc\x68\x35\x38\x03\x5b\x93\x56\xdd\x56\x95\x84\x67\x01\xf2\x40\x0e\x74\x16\x8e\x6d\x61\x17\x5b\x43\xd6\x2c\x60\xdc\x01\x27\xf7\xe0\x48\x51\x05\xa8\x3f\x10\xc3\x36\xf8\xb2\xd7\xfd\xc2\xa6\x4a\x46\x60\x05\x43\xa8\x84\x69\x14\xdd\x2e\x7e\x03\xf8\xc2\x06\x10\xe9\x21\xa0\x37\x08\xa2\x37\xf0\x02\xb0\x88\x47\x5f\x90\x58\xa6\x21\x78\xee\x48\x4a\xac\x30\xd5\x17\x09\x6f\x39\x24\x06\x86\x5b\x14\x73\x6a\x9f\xcc\xa4\xee\x43\xdd\xf5\xf1\x27\xb8\x80\xbf\x71\x56\x25\x00\x8b\xd0\x8d\xcc\xb3\xe4\x75\xe8\xb0\xec\xfa\x6e\x48\xce\x22\x3c\x4a\x48\xb8\x21\xd9\xa8\xf6\x1e\x9f\xbd\x5d\x71\x60\xc1\xc4\xd3\xb7\x18\xf1\x2a\x5d\x62\x54\x1c\x0c\xfc\xa3\x04\x4f\x92\x72\x48\xd2\x60\x38\xd2\x50\x0c\xd9\x59\x04\xef\x55\x8b\x1f\x41\x9e\x7c\x9c\x15\x00\x86\xe4\x1a\x27\x7f\xd1\x00\x62\x06\x63\xe0\x25\x39\x52\x1f\x8e\xa5\x28\x53\xf4\x85\x87\xb7\xf5\x92\x73\x47\x0c\xd6\x5a\xbe\xb3\xd8\x83\xb1\x4b\x81\x64\x37\x62\x04\xc6\x9e\x9a\xa5\x90\xe9\x21\x3f\x89\xd8\x80\x65\x2c\x7a\xec\xbe\x38\xbc\x12\xae\xd8\x49\x72\x33\xe7\x6b\x49\xf2\x24\x60\xea\x72\x8c\xfa\x10\x6e\x70\x6c\x41\x95\xc8\x89\xe0\xd6\x9d\x38\x5d\xe3\x67\xeb\x77\x7e\xb6\xdd\x28\x2e\x24\x8c\x73\x8f\x8c\xc7\x89\x77\x87\xcb\xf1\xa9\xd5\x55\x5c\x15\xf4\x83\x1d\xa8\xac\x13\x10\xc6\x30\x1a\xc2\xbb\xa3\xaa\x17\x84\x94\x43\xfd\xb3\xcb\xa7\xd5\x27\x22\x49\x0d\xec\x7d\x9a\x1f\x9d\xf2\xe4\x69\xd7\xef\xbe\xcb\x8d\x32\x7b\x54\x89\x7d\xd9\x77\xa9\x58\xd3\x25\x95\xf1\x1f\x19\x52\x69\x39\xd8\xec\x3e\xc3\xd5\x2e\x13\xcb\x28\xd5\x87\x64\x72\x93\xc6\x76\x40\xf5\xc7\x48\xa1\x3e\x05\x19\x8e\xcb\x43\xf2\x17\xeb\x16\x7b\x0f\x01\x9d\x4c\x4a\xc1\x38\x54\x32\x0f\xbb\x56\x04\x1d\x91\xc6\x46\x12\x88\x20\x0c\x54\x3a\xe6\x22\xf6\x54\x69\x2a\x38\xc9\x74\x25\xef\x1c\x67\xb2\xc2\x09\x61\x07\x55\xa2\xbb\xfb\x6c\x3c\x40\xdc\x87\xbe\x10\xb7\x80\xa6\xcf\x3f\x9f\x66\x18\x79\x92\x28\xd2\xaf\x37\x1b\xbf\xea\x5e\x9f\x1d\x70\x7e\x3d\xaf\x57\x24\x7c\x56\x7b\x2b\xc3\x94\xb0\x4a\x61\xc7\x0b\x09\xeb\x31\x3a\xe1\x6d\x8d\xe6\x54\xf6\xc6\xd1\x16\xe8\xd9\xe9\x3c\x52\xb2\x2f\x64\x8b\x9b\xec\x64\xfd\x8e\x22\xa0\x89\x21\xc5\x8a\xb8\x8d\x84\x5e\xc2\x11\xd1\x34\x51\x33\x3e\x79\x7e\x98\x52\x7f\xf2\xb9\xff\xfa\x7f\xfe\x3f\xf6\xde\x86\xb9\x6d\x1c\x59\x1b\xfd\x2b\x8a\x6e\x95\x57\xba\x51\x14\x82\xa2\x44\xc9\x73\xb4\x29\x8f\xa3\x24\x3e\x93\xd8\x5e\xdb\xc9\x9c\xdd\x24\xa5\x0b\x91\xa0\xc4\xb5\x44\x6a\x49\xca\x19\x27\xf6\x7f\xbf\xc5\xa7\x41\x12\xa4\x48\x7d\x38\x99\x24\xf3\xbe\x67\xab\xd6\x13\x91\x0d\x10\x68\x34\x80\x46\xa3\xfb\x69\xa9\xd2\x3a\xa9\x16\xfb\x4d\xb5\xd7\x6f\xa3\x4e\xa9\x7b\xea\x6e\x9b\x59\xc9\x2e\xa5\xee\x4f\xb9\x1d\x46\x74\xf2\xbc\xa6\x15\xc3\x21\xef\x9a\x78\x5a\x2a\x1c\x5d\x28\x48\xa3\xd1\xac\xc8\x4d\x3a\x33\xe0\xbc\x60\xd1\xc9\x20\x3d\x11\x90\x16\xaf\xaa\xec\x3b\xea\x88\x52\xc9\xcb\xeb\x6c\x8a\x6a\x86\x34\x26\x3a\x03\x44\x35\xc3\xd1\x13\x39\x4b\x74\xc6\xa1\x0f\x02\x96\x1a\xb9\x49\x74\x66\xd1\x5f\xe8\x78\x80\x8a\x66\x80\x8a\x66\x70\xff\xd2\x31\x82\x7a\x27\x66\xa8\xde\x89\x19\xaa\xc3\x6b\x4b\xef\x90\x9a\xd4\x99\xc4\xf5\x75\x48\x1b\xeb\x20\xe2\xb2\x3b\x89\x15\x34\x44\xfb\xeb\x5d\xd8\xc1\xf4\x2e\x2a\xe9\xd1\xf5\x08\x25\x97\xad\xd6\xf6\x30\x99\x74\xf2\xbb\xdc\x55\xf5\x43\x80\xb9\x3e\x21\x63\x20\xc2\xc9\xf5\x09\xd9\x2b\x01\xbb\x23\x95\x91\x12\x9d\xa3\x4c\xcf\xc8\xe9\x16\x3a\xfe\x0e\x48\xa9\x28\xa0\x87\x7c\x9b\xed\x70\xf2\x3e\xb7\x3d\x29\x62\x55\xbc\x0f\xc8\xcb\x15\x1d\x3c\xe3\x43\xa7\xf8\xf0\x07\x25\xc1\x48\x4e\x83\xf8\x2b\xf6\x3a\xf9\xd1\x09\xaf\x70\xaa\xeb\x6f\x38\xdb\xfd\x74\xa7\xba\x7d\xce\x73\x7b\x1e\xab\xf0\xd7\x7c\xd8\xa9\x0a\xff\x36\xac\x8d\xa7\x29\xf2\x16\xc5\xf1\x83\xd1\x31\x09\xe7\x01\x9d\x71\xb4\x0f\x80\xf2\xc8\x33\xa4\x33\x8e\x6f\xc2\xe1\x4f\x67\x1c\x15\x02\x91\x45\x47\x9a\x20\x9d\x01\xf2\x1d\x69\x82\x74\xa4\x09\xd2\x99\x4d\xb5\xe3\x3c\x43\x80\x1d\x85\x83\x1b\xa3\x19\xae\xaf\x9d\xe2\x3a\x26\x6e\x3b\x91\xb4\x4e\xef\x60\x2d\xe9\x00\x7d\x40\xef\x60\x1b\xeb\x10\x86\xc8\x8e\x87\xbd\x2e\xb0\xed\xbb\x94\x68\x1a\x57\x4f\x7a\x17\x5b\x8a\xde\x8d\xd7\x42\xbd\x47\x64\xb8\x72\xd1\x09\x91\xa4\x70\x40\xc4\x81\x98\x6e\x56\xf4\x3e\xcd\x78\xfa\x31\xd1\xf1\x03\x06\xb5\x09\xae\x6e\x27\xb8\xd3\xfe\xb9\x8f\x84\x3f\xc9\x31\xb0\x78\xc2\xc3\x5f\xb3\xf4\x98\x27\xcf\x6e\x40\xc8\x8b\x8f\x5a\xf8\x6b\xff\x35\xce\x5b\x08\x15\x76\xc8\x45\xf4\xaf\x79\xf8\xfa\x76\xe7\x26\x3a\x36\xad\x9d\x97\xec\x24\x09\xe6\x5f\xe7\x74\xc4\xff\xf7\x74\xf4\x27\x9f\x8e\xfe\x95\x59\xc3\xc5\x92\x07\x3c\xf2\x93\xc0\x81\xda\x87\x3f\x90\xe6\x07\xe9\x38\x74\x4a\xc0\xaf\xc3\xd6\xaf\x6b\xd8\x46\x10\xec\xa0\x03\x42\x4e\xd7\xe0\x44\xaf\x69\xca\x41\xe4\x5f\x4a\x84\x85\xeb\x89\x71\xb1\x7e\xaa\x47\xa1\x5f\x66\x8e\xcb\x3c\xe0\xd3\x80\x2f\x67\xe5\x85\x06\x4a\xa1\x30\x07\x31\xb9\xfe\x95\x8d\xbd\x28\xb4\xfc\xe3\x7d\x8b\x0d\x58\xaf\x77\xe8\xac\x3c\x2b\x72\x7d\xaf\x21\x9a\x5f\x44\x5b\xfc\xb1\xf4\x83\x28\x1c\xbe\x97\xdf\x3c\xba\x3c\x3e\x39\x49\xda\xa3\x3d\xf9\xf0\x87\xa9\xf8\x54\x1d\xcd\x97\x33\x3e\x11\x91\x6b\x65\x19\x24\xf9\x93\xcf\x1f\xfe\xe0\xfc\xc3\x1f\x93\xee\x87\x3f\x26\xbc\x98\x50\xd2\xe9\x7d\xf8\x03\x8a\xb4\xa6\x03\x43\x4b\x27\x98\x48\x1d\x20\x8b\x3a\x64\x56\xd3\x81\x85\xa5\x23\xb1\x98\x4e\x59\xe1\x90\xb5\xb1\x43\x41\x18\x1d\x64\x70\x4b\xd2\xd9\xe1\xe8\x01\xd9\xd3\x3a\xc8\x99\xb8\x3d\xc3\xdd\x93\xb5\xac\x76\x0e\x5d\x43\x40\x73\x33\x80\x6c\x64\xf4\xc9\xc5\x04\xf9\xe6\xd4\xbc\x60\x5a\x17\xb1\x61\x5d\x8a\x68\xeb\x02\x99\xac\x3b\xa1\x1f\x3b\x23\x84\x75\xc9\x89\xa3\x8b\x0c\x6a\x5d\x3a\x5f\x76\x71\xe4\xce\x63\x87\x51\xcc\x59\x0f\x40\x5a\x3d\xc2\xe6\x92\x40\x62\x3d\xf4\xa2\x87\xec\x89\x3d\xd2\x2c\x25\x9e\x18\xb6\x85\x14\x43\xcc\xa6\x1f\x28\x43\x00\x56\x3d\x24\x60\xeb\xe1\x34\x6b\xd2\xd7\x4c\xdc\x6d\x98\xd0\x33\x34\x13\xd0\x4c\x26\x21\x76\xe2\xe2\x4d\x33\xe1\xa4\x82\xec\x24\x9a\x09\x1d\x9a\x34\x17\xad\x0f\xf5\xb8\x4f\xea\x31\xf0\x60\x34\xca\x6e\xac\xf5\x91\x31\xb3\x4f\x5c\xea\x23\x23\x5f\x9f\xd3\x0f\x24\xb6\xeb\x4f\x08\x9d\x0c\xec\xe8\xc3\xf7\x44\xeb\xe3\x04\x2e\x91\xc6\xfa\x50\xee\xfb\x14\x9e\x93\xa0\xa6\xa2\x81\x29\x50\x2a\x7e\x20\x63\xe7\x80\x32\x0f\x48\x94\x31\x53\x4d\xda\xd0\xa7\x37\x18\x7b\x5c\x08\x6a\x70\x3d\xd3\x06\x03\x02\x34\x43\x2a\xbe\x01\xa7\xd4\x10\x38\x7a\x0c\x90\x7f\x8f\xb0\x68\x34\x60\xd1\x68\x83\x09\x7d\xb9\x2c\xe9\x43\x86\xbe\x0a\x65\x5f\x66\x7e\xb0\x09\x8f\x95\x72\x41\x38\x4f\x14\x5c\x33\xf2\x09\x02\x10\x1a\x46\x22\x9f\x12\x02\xbe\x08\x1a\x87\xa7\x12\xc7\x59\x87\x23\xe9\x1d\x47\x16\x73\x8d\x23\x73\x1d\xa7\x00\x24\x40\x4c\x6a\x80\xc0\xd1\x00\x34\xa9\x01\x08\x47\x03\x10\x8e\xc6\x71\x36\xe1\x00\xcc\xda\x94\x63\x02\x7f\xad\x0c\x35\x8d\xc4\x8c\x77\xe9\x91\x20\x20\xb5\x27\x15\x09\x27\x88\xbb\x1c\xc7\x34\x0e\xd0\x0a\x8d\x23\x03\x29\x27\xf6\x72\xb0\x97\x13\x7b\x01\xc4\xa3\xf1\x09\xc1\xaf\x11\x22\x2d\x95\x07\x93\x39\x31\xb9\x3c\x6f\x45\x8a\x52\xcb\x91\xc3\x90\xd3\x4a\x91\x20\xb3\x51\x93\x1d\x6b\x2d\x7b\x05\xb1\x73\xa2\xd1\x1b\x84\x88\x82\x9d\x13\x62\xe7\x04\xec\x9c\x10\x3b\x27\x60\xe7\x04\xec\x9c\x74\x08\x05\x97\x8a\x83\x87\x84\x62\x5a\x9e\x03\x43\xc1\xc4\xed\x65\xc8\xb8\x5d\x7a\x42\x50\x70\xce\x93\x0c\xff\x0d\x90\x74\x12\x05\xae\x4f\x88\x70\xf4\x21\xac\x53\x13\x5a\xa1\x26\x10\xd3\xc9\x80\x82\xd5\x06\x80\x92\x1b\xa0\x21\xc8\x33\x39\x41\x9e\xc9\x09\xf2\x4c\x4e\x90\xc9\x75\xc2\x51\x15\xf2\x4c\x4e\xe0\x74\xa5\x01\x48\x55\x9b\x70\xaa\x10\x5c\xde\x21\x0b\x07\x81\xf4\x6a\xeb\xb9\x38\x80\x2f\x47\x2c\xb5\xc0\x52\x4b\x23\xac\x3a\xf0\xd4\x02\x98\x99\x66\x81\xa7\x16\xf1\x14\x70\x32\x9a\x45\xac\xdb\x94\xbf\xc3\x2a\x42\xda\x51\xf4\x1d\xbc\x41\x34\x52\x47\x52\x80\x3b\xfa\x41\xf8\xc0\xc4\x38\x64\x3a\xd3\x2c\x62\x1c\x52\x9d\x69\x04\xfe\xa2\x21\x5f\x99\x46\xe0\x2f\x1a\x00\x5f\x34\x8b\x84\x0e\x20\x46\x1a\xa5\x6c\xdc\x98\x08\xc4\x2a\x26\x02\xb1\x09\x68\x83\x9a\x01\x09\x04\x0a\x97\x66\x11\x2c\x70\x92\x1b\x04\x28\x7a\xc4\x20\x1b\x0c\xb2\x89\x41\xc0\x95\xd1\x6c\xe2\xc9\xa6\x4c\x21\x04\xc3\x47\xb1\x88\x58\x20\x25\x46\x31\xc9\x92\xc4\xe1\xa3\xad\xcf\x26\x9b\x46\x2e\x89\x08\xb1\x06\xe0\x9d\x9a\x3d\x20\x32\xac\xed\x04\xf0\xaa\x01\xea\x54\x43\x0c\x9d\x46\x47\x2a\xcd\x86\xe7\xe4\x5e\x89\x47\x68\xba\x25\x10\x7f\xa8\x05\xde\x34\x9a\x00\x66\xa0\xc0\x6e\x8a\x2c\x8c\x1a\xa0\x63\x34\xd1\x47\x5f\x91\x80\x51\x13\x38\x45\x68\x48\x07\xae\x09\x98\xa4\x05\x27\x9c\x40\x0c\x8f\x00\x6a\xab\x26\xd0\x48\x52\xfd\x34\x24\x49\xd4\x90\x24\x51\xa2\x05\x0a\x9b\x6a\xb1\xe9\x8a\x3e\xe6\x35\xe5\x01\xd7\x80\x2d\xab\x39\x84\xb0\x0d\xd0\xa7\x2c\x81\x09\xc3\x5f\xf4\x6b\x1d\x23\x90\x91\xf6\xc4\x70\xe0\xcd\x00\x9c\xe9\x11\x3c\x2c\x29\xe6\xba\x24\xf5\x48\x65\xe2\x50\x82\x74\x63\x1a\x52\x28\x6a\xe4\xfc\x88\xcc\xbd\x4c\x27\xdf\x4d\x1d\xf9\x10\x75\xaa\x59\x07\xb4\x9e\x0e\xc8\x41\x9d\xdc\x26\x75\x64\x47\xa4\x53\x32\xd3\x91\xc7\x92\x4e\xc9\x4c\x07\xc2\xa0\x4e\x96\x24\x1c\x99\x99\x0e\x73\x30\xd3\x01\x15\xa8\x53\xfa\x44\x1d\x6e\xed\x3a\x20\xf6\xc8\x06\xce\x60\x03\x67\x3a\x65\x54\xd4\xe1\xfd\xa9\x93\xf7\x67\x07\x09\x49\x3b\x04\x51\xd8\x61\x5d\xfc\xa5\x37\x48\xe6\xd9\xa1\xb0\x75\x24\x0b\xce\x27\x45\xed\x50\xe2\xc5\x0e\xec\xdb\x06\x24\x84\x21\xdd\x1d\xa3\x1c\x1f\xac\x07\xcf\xce\x5e\x9f\xde\xc4\xeb\x19\xeb\x51\x05\x3d\xe4\xa3\x4c\xc3\x91\xe3\x2e\x92\x39\x9c\x99\xc8\x95\x6a\x6a\x04\x70\xcd\x00\x70\x48\xd8\x85\x26\x02\x71\x4d\x8a\x88\x97\x90\x89\xc4\x23\xf8\x19\x31\xb3\x47\x65\x90\x40\x34\x07\xa6\x48\x3d\x30\x27\x84\xac\x88\xf8\x7c\x82\xcb\x36\x6d\x40\x67\x23\x8d\x66\x9f\xbe\xd2\x47\x9e\xd1\x3e\x15\xe9\x03\xa1\xba\x4f\x11\xf9\x7d\x74\x9a\xac\xbc\x6c\x00\x3f\xd8\xf2\x6c\x30\x80\x55\xa4\xd1\x1d\x90\x9d\xcf\xa4\x1f\xc0\x8d\x24\x40\x3c\x36\xe0\x28\x43\x55\x0f\x2c\x60\x02\x50\xd5\x12\x72\x91\xaa\x4e\xc0\x16\xc1\x42\x8e\x0a\x38\xc0\xb3\xcb\x60\x14\x3b\x04\xa3\x08\x30\xc6\x04\x80\x5b\xfe\x98\x28\x09\x64\x24\x38\x22\x79\xe5\x22\x9b\xfc\x64\x22\xd1\xb7\xbb\x04\xc8\xfd\x24\x43\x44\xa4\xaa\x25\x16\xa2\x41\x89\x6f\xe1\x7b\x4c\xa1\xa7\xcc\x32\x01\x79\x48\x55\x23\x2d\xe5\x86\x64\xb9\x16\xcc\xd2\xcc\x02\xca\xb7\x45\xa3\x6f\x11\xc0\x37\xa5\xd9\x45\x0a\x52\x0b\x33\x87\x16\x58\x06\xf0\x34\x66\x53\x9b\x6c\x4a\x54\x4a\x6f\x60\xb3\x2e\xa6\x22\xa5\x37\x70\x55\x2e\x64\x1f\xa5\x37\x80\x36\x2f\x4d\x45\x8a\xd7\xe8\x0c\x1d\xb0\x99\x03\x0c\x4e\x87\xe4\x45\xe6\xdb\xc7\xc4\x72\x68\x4a\x39\xc8\xe2\xea\x58\xf4\x9e\x32\xf1\xd3\xd4\x77\x80\xcb\xe9\xd8\xf4\x46\x66\x2c\xa5\x37\x32\x63\x29\x55\x80\xde\x38\x0e\x91\xc1\x37\x4d\x43\x24\x86\x06\x9c\x47\x02\x9c\xd0\x71\x59\x54\xc8\x6b\x4a\xae\x2e\xac\xf3\xb0\x54\xa6\x3a\x59\x5f\xe1\x80\xcc\xc8\x01\x39\xcd\x65\x4a\x97\x33\x78\x63\x08\x15\x24\x20\xae\xc6\x00\x2f\xa4\x8d\x34\x9f\xec\x94\xee\x31\xac\xae\xcc\x7c\x4a\x26\x4a\x83\xb2\x72\xd2\x0f\x91\xa4\xe5\xd4\x31\xe2\x3a\x8d\xaf\x6e\xc3\x24\x0d\xfc\x42\x1d\x71\xc1\x3a\x41\x49\xe8\x36\x0c\xa9\x00\xef\xd0\x29\x6f\x8b\x8e\x4d\x4e\x27\x0c\x06\xdd\xe6\xf4\xa3\x4f\x3f\xe2\xea\xed\x09\xbd\x81\xd9\x96\x90\xbe\x75\x00\x0f\xea\xb4\xf1\xe9\xd8\xf8\x74\xdb\xa2\x37\xb8\x46\x22\x53\x9d\x8e\xfd\x4f\xa7\xfd\x4f\xb7\x91\x5b\x54\xc5\xd9\xd4\x05\xe5\x31\x82\x56\x54\x8e\x8f\x40\x3f\x3a\x5d\x15\x2c\x01\xee\x83\x06\xbd\x19\xc0\xa4\x8a\x88\xf4\x0e\x6e\x04\x3a\x1a\xa7\x37\x0e\x3c\x08\xb1\x51\x74\x34\xa0\x7a\x32\xfa\x0e\xc3\x47\x19\x55\xcd\xfa\x22\xfe\xcb\xc9\xd0\x3a\xc1\x1b\x87\x7e\xa0\x8c\xa1\x91\xb9\x34\x7e\x63\xd0\x14\x19\x40\xa8\x38\xed\x71\x1c\x29\xce\xb9\x41\x80\x20\x46\xbc\x68\x73\xb2\x73\x73\xc4\x4a\x70\x3a\x93\x72\x04\x48\xf0\x1e\x92\x88\xf6\x60\x61\xed\x19\xf4\x02\x19\x39\x53\x44\x51\xbc\x31\x9d\x0c\x86\xca\x44\x02\x2c\x6e\xa2\xbc\x09\xe3\x3c\x37\x91\xdf\xd4\xec\x4f\x28\x69\xa6\x43\x69\x31\x29\x21\x26\xa7\x54\x98\xb0\xe4\x6a\x80\xae\x42\xd0\x41\x02\xd7\x4f\x1f\xed\xc3\x91\x9d\x96\x63\x89\xd7\x2f\x41\x48\xc9\xab\xbd\x4f\x5e\xed\xf0\x86\xef\x23\x79\x7c\x82\x48\x8a\x49\xc2\x07\xe8\x07\x2d\xcd\x09\xd2\x7f\x8f\x7e\x00\x35\x34\x81\x27\x9d\x10\x3c\xa9\x41\x3f\xc8\xd7\x1d\x7f\x09\xeb\x14\xf0\x34\x7c\xe0\x50\x9d\xf0\xba\xa7\xd5\x3a\x85\x23\xa5\x1f\x84\xfd\x4f\x1f\x40\x2c\x08\xe7\xd0\xdc\x12\xf8\x51\xca\x1c\x80\xc4\xa0\xdc\xa6\x6c\x4f\x36\xa5\x08\xd0\xd4\xd4\x4f\x84\x61\x4a\x49\x02\xb0\xaf\xf2\x09\xd0\x59\x27\xda\x80\x7e\xc4\x95\x4d\x18\xbd\xc1\xfd\xf1\x84\xe0\x60\x26\x3a\xfd\xe8\xd3\x0f\x90\x51\xdf\x27\x5d\xba\x4e\x86\x9f\xfe\xa4\x07\x0f\x28\xc2\x50\xa7\x44\x03\xd2\x64\x68\xc6\x2a\x9a\x4d\x59\x4e\x6d\x44\x81\xd9\x26\xd2\x09\xda\x66\xcc\x63\x87\xb6\x3f\x87\xc7\xfb\x9a\x43\x27\x46\x87\xdb\xf0\x9b\xa2\x37\x68\xa8\x43\x07\x2f\x67\x02\x57\xd8\x09\x20\x12\x1c\x9c\xc2\x1c\x3a\x85\x39\x13\x84\x60\x4d\x30\x51\x1c\xc0\xfc\x3a\x48\x46\xe2\x20\x19\x89\x83\x24\x12\x0e\xf6\x30\x07\x47\x31\x67\x02\xdd\xd9\x99\x4c\xf0\x02\x98\xe5\x0e\xe0\x1a\x1d\x42\x48\x71\xec\x3e\xc2\xbc\x70\x1e\x70\xec\x58\x1f\x73\x6c\x87\xde\xa0\xe5\x64\x92\x74\x60\x92\x74\xc8\xd8\xec\x08\x32\xff\xa7\x99\x58\x71\x97\x4e\x3f\x10\xec\x45\x30\xa2\x0e\x96\x7d\x87\x96\x7d\xc7\x41\xd5\x0e\x8e\x0d\x0e\xee\xfc\x1c\xc7\xa6\x37\x36\xde\xd8\xf4\xc6\x2e\x26\x6e\xd0\xd6\x2d\xb3\x64\x60\xb6\x60\x8f\xb7\x74\x89\x6c\x09\xc7\x78\xc0\x51\xa6\x28\x97\x4f\x32\xc7\xfd\xc4\x7e\x8b\x1f\x32\x03\x2c\xd2\x90\xe6\x60\x57\x52\x78\x07\xca\x5d\x20\xcd\xa7\x9a\x62\x3e\x95\xb0\xa1\xe4\x87\x41\xf0\x2c\x12\xb8\x06\x66\xda\xc4\xc8\x0c\x14\x4a\x87\x2a\x70\x00\x73\x4a\x59\xb9\x6d\xf4\xbc\x0a\xb5\x4d\x76\x72\x20\x4d\xc9\xf8\x81\x74\x06\x96\x4d\x9d\xc4\xa5\x73\x7a\x1d\x41\xd9\x10\xe8\x47\xaf\x93\xdd\x2d\xe0\xf6\xd5\x26\x1d\xdf\x76\x90\x93\x35\x01\xa5\xe8\x99\xb9\x9b\x95\x84\xab\xf0\xd7\xd7\x80\x3e\xa9\x11\x32\x06\xae\xb4\x13\xd0\xd3\xbe\xc2\x5a\x62\x2a\x2a\x4d\xec\xe0\x66\x4f\x61\x2a\xa5\xbb\x55\x71\xca\x80\xeb\x5c\xb8\x4a\xc1\xbd\xb9\x4d\xe8\x27\x32\x47\xad\xcc\x31\x06\x90\x56\x09\x7b\x8b\x8b\x86\xe4\xc2\xa4\x12\xf8\x97\xe1\x05\x6e\xa4\x6d\x38\x91\xdb\x82\x11\x52\x2a\xa5\xdc\x48\x60\x47\xac\xb5\x01\x4e\x8c\xe5\x28\x43\x18\xbb\x82\x72\x42\x25\x8c\xec\x56\x31\x12\x69\x9f\xd2\xd1\x66\x39\xd0\x13\xc9\x55\x5c\x6c\x64\xd9\x86\x71\x59\xa2\xb0\x25\x37\x8c\x49\xbb\x38\xe5\xcc\xcd\xf0\x88\x91\x2f\xdf\x06\x20\x7c\x26\x83\xb8\xdb\x40\xb9\x04\xab\x89\xee\x91\x26\x52\xde\x0c\xe5\x86\x23\xc9\x48\x91\xcf\x14\x47\x11\x1a\x7d\xc2\x54\x21\x90\xde\x24\xdf\x70\x5f\x69\x5b\x47\x57\x03\x43\x30\x32\x12\x57\x49\xa6\xbd\xea\xa9\x23\xe7\x28\x81\x28\x68\x83\x9a\x10\x2e\x41\xc2\xb5\x94\x21\x65\x8c\xc6\x8f\x06\x8b\x30\x8c\x15\xf4\xe2\xdc\x95\x47\x1f\x77\x1d\x12\xf5\xb6\x8f\xcb\x12\x82\x81\x15\x98\x2e\x62\xe0\xac\x5f\x89\xa0\x2f\xf9\x4c\x73\x1a\xdd\x11\x6a\x74\x3d\x84\xb9\xc8\x30\xbf\xa9\x15\x8e\x8e\x22\x58\x6c\x63\xe6\xe2\x2f\x86\xba\x43\x59\x5a\xa8\x78\x87\x70\xb2\xe4\x2a\x50\x92\xa6\x05\x7f\x2d\x5a\x1d\x3e\xa4\xb9\x5a\xba\x54\xa0\x90\xac\x25\x19\x12\x4a\xd0\xd2\x51\xc6\x27\x09\x3d\xa2\x98\x1f\x9a\x79\x3d\xa6\x48\x15\x1c\x52\x60\x9d\xb1\x2d\x0b\x45\x2c\x53\x1d\x11\x35\x91\x1d\x4d\x29\x5a\x48\x24\x90\x72\x02\x66\x4b\x80\xc3\x10\x34\x43\x5d\x06\x25\x6c\xb2\xca\x45\x46\xa9\x9b\x25\x78\x0f\xcf\x85\x11\xc9\x8e\xd0\x72\x21\x2f\x0e\x6d\x42\x2a\x22\xc8\x1a\x4c\x5b\x5b\xa3\x8c\xd6\x74\x41\x8a\xc9\x2b\x97\x03\x86\xd7\x8c\x5a\x58\x96\x21\xef\x43\x06\x38\x2c\xa1\x86\xf5\x0f\x0a\xb8\x18\x68\x25\x86\x6f\x2e\x51\x9e\xcc\x02\x83\x5b\x39\x81\x0f\xca\xa4\x79\xb2\xff\x14\xeb\xd4\x55\x98\x21\xa3\xc9\x08\xac\x98\x04\x4c\x2e\x16\x4e\x3f\x17\xf1\x94\xac\xa0\xb9\xb5\x33\x87\xb8\x8c\xf5\x90\x72\xf0\x98\x34\xdf\xfa\x5b\xf2\xe8\x25\xb1\x70\xf4\xa3\xaf\xf0\x4c\xe6\x08\xdc\x82\xbf\x4c\x01\x69\x04\x2e\xda\xcb\x66\x6e\x4f\xee\x14\x94\x71\x86\x1e\xf5\x95\x4b\xec\xea\x2c\x7c\xa8\x84\x30\xa6\x13\xa4\xa3\x1e\xad\x37\x92\x17\x2a\xa4\xb1\x93\xc2\x50\x17\x70\xca\x32\xb9\xb5\x8d\xce\xc7\xbb\xf7\xa0\xb1\x70\x39\x0f\x59\xe8\x23\x33\x50\x5f\x8f\x47\x83\xd4\x58\xbb\x8f\x06\xf6\xa9\x81\x7d\xdc\xb2\xf7\x61\x23\xb1\xfb\x58\x80\x28\x2c\xd3\xee\x9b\x31\x7b\x48\xdb\xb5\xfb\xfd\xce\x47\xb5\x39\x69\xb8\x99\x9d\xbb\xea\x4e\x10\x2e\xd5\x9d\x57\x18\xb9\x14\x83\xc9\x53\x72\xb3\x4c\x52\xc1\x0b\xe5\x66\x15\x99\xd0\x93\xa9\xa1\x3b\xca\x66\x61\x10\x14\x14\x2d\x2a\x70\x60\x70\x4c\x9a\x34\xfd\xd2\x0c\xf3\x04\xa2\x25\x6b\x22\xbd\xc2\x20\x94\xeb\x7c\xde\x42\x87\x96\x76\xf2\x70\xc0\x5f\x7c\xa8\x90\xc3\x90\xe5\x18\x20\xf7\x7c\x3d\xb7\x3b\xd9\xea\x76\xac\x49\xa1\xd6\x55\x77\x00\x9b\x09\x65\xc1\xef\xea\xe4\xf5\xf0\x24\x93\x1e\x79\x59\xed\x4c\x72\x00\xdc\xc9\x78\x63\xd1\x4a\x82\xfb\x2c\x65\xd1\xc2\x4a\x9e\x5c\x9b\x0f\x06\x1f\x54\xb8\xee\xdc\x8a\x08\x38\x30\x8b\x32\xc3\x3f\x3c\x99\xbe\x4c\x6f\x85\xbf\xa4\x37\x42\x1f\xb3\x64\x60\xe6\x5e\x39\xf5\x99\x50\x14\x96\xbd\x92\xea\x13\x7c\x19\x6c\xb8\x85\x9c\xf8\x16\xbd\xc1\xf6\x48\xa6\x5a\x99\x20\x5f\x38\xe4\xac\x82\x76\x38\xd4\x0e\x99\x2d\x9f\x50\x20\x1d\x43\x28\xfa\x27\xa5\xce\x97\x98\xfd\xe0\xb1\x43\xbb\xa5\xcc\xa3\x4f\x0b\xa3\x03\xcf\x00\xc7\x92\xf7\xff\x93\x6f\x8a\x49\x9e\x68\x34\xb4\x26\x49\x2f\x20\xca\xd3\x25\x94\x25\x54\xe4\xa2\x2f\x93\xaf\x92\xc6\xa0\x25\x0b\x44\xb6\x6e\x19\x93\x9c\xff\x64\x41\x1d\x24\x45\x82\x52\x22\x40\x9d\xc0\xfa\x81\x30\x45\x5b\x90\x6e\xa5\x0f\xd4\x65\xde\x78\xa2\xe8\x19\x03\xc5\x1d\x05\xaf\x09\x76\x9f\x80\x25\x0d\x7a\x4e\xce\x1a\x14\x7c\x40\x0e\x2a\x98\x0b\x02\xe2\x99\xe4\x13\x23\x48\x4d\x14\xc0\x19\x43\x74\x09\xf2\x8e\x1c\x5a\x40\x0f\x8f\x21\x41\x50\xf4\x08\xb7\xb6\x45\x8f\x86\x1b\x6b\x99\xa0\xb5\x4c\x60\xb1\x10\xe4\x36\x25\x95\x56\x33\xa7\x0e\xe1\x53\x7d\x89\x30\x4f\x9a\xa2\x44\x98\x27\x78\x14\x62\x49\xa2\x49\xd2\x46\x3e\xc9\x61\xc5\xc9\x33\x83\xa1\xe2\x74\x4a\x6c\x7c\xfa\xd1\x97\x4b\x78\x6f\x90\xf3\xb6\x51\x57\xbb\x64\x59\xed\xa9\xcb\xaa\x14\x4f\xa3\x40\x92\x73\xae\x61\x38\xdd\xe8\x79\x12\x53\x5d\x9b\x04\x67\x99\x12\x97\x91\xa8\xd2\x92\xba\xc0\x9b\x6a\xdd\x82\x49\x4c\xbc\xbe\xaa\xec\x3a\x86\xea\xe5\x72\xe4\xdd\xd6\x5b\x6e\xf8\xeb\x62\xf9\x9a\x87\xd1\xe1\x23\x2d\xf3\xde\x58\x39\x8e\xa3\x40\x73\xd2\x06\x85\x2a\x26\x8e\x53\xdc\x53\xb2\x1a\x9f\x0b\x87\xaf\xe6\xd1\xf8\x64\xea\xf9\x01\x9f\xcc\xc5\xf8\xd8\xb7\xc5\xf8\xdc\x77\xbd\x28\x73\xe1\x85\xf3\x05\xbc\x6a\x7b\xf1\x5a\xc2\x00\x69\xc9\x18\xa0\x1e\xd4\xb4\x45\x69\x42\x22\x84\x11\x6a\x04\xd2\xa0\xc1\xb0\x49\xd6\x48\xa4\x6b\xd4\x35\x32\x16\x6a\x3d\x18\xb4\x10\x5a\x9f\x4f\xb7\xe2\xe0\x84\x0d\x7c\x1d\xf2\x5d\x74\x1c\xa7\x9f\x3f\x5a\xcb\x05\x3b\x71\xf1\xea\xe4\x52\x26\x98\xb4\xf7\x9b\x9c\x76\xea\x09\x8d\xe9\xc4\x58\xdb\x5c\x33\x46\xbc\xf6\x3f\x89\xc0\xe2\xa1\x90\xbd\x5e\x73\x76\xb1\x1d\xc5\xc7\xe5\x0f\xf8\x58\xc0\x31\x57\x63\xb8\x3c\x65\xf1\x5a\xac\xc1\x58\xab\xc1\x2f\x57\x63\x08\xbd\x60\xc0\x16\x61\xb8\xa0\x66\x48\xf5\x06\x1b\xae\x06\x1b\xae\x06\x7f\x5d\x8d\x21\x19\x16\x03\x62\x09\xcc\xb9\x1a\x83\x3f\x32\xd3\x41\x8f\xcc\x6e\x70\xe3\xd5\xe0\xc6\xab\xc1\x8d\x57\x63\x3a\xe8\x91\xdd\x0d\x56\x43\x8d\x21\x35\x17\xc3\x05\x37\x83\xbf\x00\x43\x6a\x2d\x06\x7f\x01\x38\xfc\x6a\x0c\x29\xc0\x18\x70\x4d\x18\x12\x91\x31\xb8\x0e\xc0\x3b\x5f\x63\xb8\xdf\x63\xb8\xac\x84\x49\x58\x83\xbf\xbe\x06\xa7\x60\x0d\x4e\xc1\x1a\x83\x33\x01\xeb\xe2\x2b\xb8\xd7\x65\xb8\xbc\x64\xf0\x9e\x61\xc0\x38\x61\xb8\x1a\x87\x98\x68\xac\x07\x7a\xdc\x69\x32\xa0\xa7\xb0\x1e\xe8\x01\x19\xcd\x7a\xa0\x07\x28\x0b\x03\x6a\x33\xc3\x1d\x3a\x33\x41\x0f\xc7\x04\x06\x57\x20\x66\xa2\xfd\x26\xda\x6f\xe2\xf2\x95\xf5\xd1\x01\x5c\x8a\x32\x04\x1c\xc3\x68\xad\x31\x5c\x1a\x33\xf8\x2e\xb0\x01\xba\x87\x5b\x76\x46\xd7\x80\x08\x35\xd0\x18\x2e\xd8\xe1\xbc\xac\x21\xe0\x40\x83\xdb\xb2\xc6\x70\xaf\xcc\x70\xbf\xce\x38\x28\x31\x01\x18\x7c\x1c\x18\x7c\x5c\xd8\x04\x7c\xc2\x45\x26\x9b\x80\x92\x6e\x9b\x61\xa4\xd5\x18\x6e\x30\x19\x3c\x1c\x18\x6e\x99\x11\xbf\xa0\xc1\xef\x59\x43\xfc\x82\x86\xf8\x05\x8d\xe1\x0e\x96\xd9\xf8\xa4\x8d\x8a\xe0\x5f\xc2\xe0\x5f\xc2\x70\xed\xc9\x90\xa6\x0f\x7e\xb6\x1a\x13\x68\x22\x92\x09\x32\xf8\xd1\x30\xc4\xb3\x30\xc4\xb3\x30\x78\x03\x31\x38\xa2\xc0\x95\x5a\x63\xf0\xec\x61\x88\xed\x61\x88\xf6\x61\x70\xaa\x87\xfd\x58\xd3\x21\xc0\x3a\x04\x58\x87\x00\xeb\x10\x60\x1d\x02\xac\x43\x80\x75\x08\xb0\x0e\x01\xd6\x21\xc0\x3a\x04\x58\x87\x00\xeb\x10\x60\x1d\x02\xac\x43\x80\x75\x08\xb0\x0e\x01\xd6\x21\xc0\x3a\x04\x58\x87\x00\xeb\x10\x60\xa0\xd8\x6a\x3a\x04\x58\x87\x00\xeb\x10\x60\x1d\x02\xac\x23\xb1\x8c\xa6\xc3\xc1\x40\x87\xbc\xea\x70\x63\xd2\x21\xaf\x3a\xe4\x15\xce\xc5\x9a\x0e\x19\xd5\x21\xa3\xb8\x62\xd5\x74\x83\x42\x7a\x06\xf8\xe6\x80\x42\x7e\x64\x64\x90\x96\xf9\xa6\xa9\xee\x68\x89\x0b\x1a\xdc\xc6\x20\x76\x65\xbe\x67\x70\x3d\xe8\xe0\x06\x4d\xeb\x60\x34\x3b\x18\xcd\x0e\xfc\xdb\x3a\xe4\xa8\xd5\x81\x57\x45\x07\xd8\x3d\xf0\x3e\xd7\x3a\x18\xc8\x0e\x06\x12\x91\x27\x5a\x07\x03\xd9\xc1\x40\x76\x30\x90\x1d\x0c\x64\x07\x03\xd9\xc1\x40\x76\xc8\x71\xac\x83\x31\x4c\x7c\xd8\xfa\xf8\x0b\x22\xf8\xc3\x18\x84\x51\x64\x60\x96\x19\x98\x65\x06\x66\x99\x81\x59\x66\x60\x96\x19\x98\x65\x06\x66\x99\x81\x59\x66\x50\x1e\x4c\x74\xd7\x40\x77\x0d\xcc\x32\x03\x9d\x36\x10\x36\x61\x98\xa0\x47\xcf\x0d\xd3\x51\x7c\xe7\xf0\x1c\x13\xcb\x80\xcb\x95\x01\x9f\x20\x03\xec\x36\x30\xc9\x0c\xdc\xb8\x1b\x70\x68\x01\xd0\xb1\x66\x0c\x40\x0f\x57\x16\x03\xf3\xcd\xc0\x7c\x33\x30\xdf\x0c\x0e\x7a\x0e\x7a\xcc\x37\x03\xf3\xcd\xe0\xa0\x87\x5f\x83\x01\xf7\x0e\x63\x02\xfa\x09\xe8\x31\xf7\x0c\x38\x3a\x18\xf0\x21\x30\x30\xf5\x0c\x78\xbf\x18\x70\x24\x80\xe7\xb8\x66\xc0\xe7\xc3\x40\x3e\x43\x03\x93\xd1\xc0\xf0\x19\x88\xdd\x30\x30\x7c\x06\xbc\xed\x0c\xb8\x82\x18\x18\x43\x03\x63\x68\x60\x0c\x0d\x8c\xa1\x81\x31\x34\x30\x86\x06\xc6\xd0\xc0\x18\x1a\x18\x43\x5c\x90\x69\x06\xc6\xd0\xc0\x18\x1a\x98\x8c\x06\xfc\x47\x0c\x0c\xa4\x81\x81\x34\x10\x53\x65\x60\x4a\x1a\x18\x4e\x5c\xcc\x68\x80\xf4\xd1\xba\x98\x92\x5d\x4c\xc9\x2e\xa6\x64\x17\x53\xb2\x8b\x29\xd9\xc5\x94\xec\x62\x4a\x76\x31\x25\xbb\x98\x92\x5d\x4c\xc9\x2e\xa6\x64\x17\x53\xb2\x8b\x29\xd9\xc5\x94\xec\x62\x4a\x76\x31\x25\xbb\x98\x92\x5d\x4c\xc9\x2e\xa6\x64\x17\x53\xb2\x8b\x29\xd9\xc5\x94\xec\x62\x4a\x4a\x07\x49\xc5\x1b\xb2\xe8\xe6\x40\x49\x16\x11\xc3\x92\xf3\x0b\xc8\xdd\x0c\xe7\xee\x74\x81\xac\xc4\xa0\xff\x32\x98\x43\x99\x88\x7b\xc7\x80\x39\xc6\x00\xb2\xc4\x00\x77\xc6\xa0\x09\x30\x58\xd9\x18\xac\xa4\x4c\xe0\xee\x17\x46\x52\x06\x0c\x21\x06\xd4\x25\x06\x60\x34\x06\x35\x9a\x41\x8d\x66\x40\x94\x63\x40\x94\x63\x50\xa3\x19\x10\xe5\x98\xc0\x9d\xbd\xd0\x41\xaf\x83\x1e\xb9\xb1\x01\x33\xc8\x60\x71\x65\x50\xae\x19\x94\x6b\x06\xe5\x9a\x01\xbd\x83\x51\x60\x24\x3c\xdf\x19\xd0\x3b\x18\xfc\xdf\x19\x94\x6e\x06\xa5\x9b\x41\xe9\x66\xf0\x8e\x61\xd0\xb9\x19\x74\x6e\x06\x67\x69\x26\x90\x68\x1b\x3a\x37\x83\xce\xcd\xa0\x73\x33\xe8\xdc\x0c\x3a\x37\x83\xce\xcd\x80\x20\xc8\xe0\x43\xce\x44\x0f\xf4\x3d\xd0\xf7\x40\x0f\xff\x02\xc0\xcb\x30\x61\x82\x1e\x2e\x0f\x48\xe2\xc4\xa0\x82\x33\x61\x82\xde\x04\x3d\x2e\xb8\x71\x48\x67\xf0\xd9\x61\xf0\xb7\x67\xf0\xb7\x67\xa2\x0f\x7a\x24\x28\x10\x7d\xd0\xc3\xe1\x44\xc0\xf7\x43\x0c\x40\x3f\x00\x3d\x16\x53\x06\x8b\x12\x03\xbe\x36\x83\xb2\xcb\xa0\xbb\x33\x1c\x0f\x99\x80\xa3\x02\x14\x78\x06\x53\x30\x03\x26\x28\x43\x16\x65\x06\x53\x30\x13\x70\xca\x80\x81\x8e\x21\xaf\x19\x83\x47\x10\x13\x13\xd0\x23\xe8\x52\x90\xb8\x20\xe6\x52\x58\xa0\x87\x37\x0b\xec\xdd\x0c\x58\xff\x4c\x58\xa0\x87\x03\x8e\x40\x40\xa6\xb0\x41\x8f\xab\x78\x61\x83\x1e\xde\x1e\xc8\xf3\xc0\x10\xfc\xc6\x70\x12\x60\x70\x28\x62\x02\x99\xc4\x85\x00\x3d\x1c\x21\x04\x32\x93\x0b\xe4\x78\x10\x02\xf4\xc0\x53\x03\x84\x38\x13\xf0\x8f\x40\x84\x0d\x03\xb2\x0f\x03\x38\x10\x13\x40\x85\x47\x58\x1d\x13\x98\x02\xc2\x21\xe7\x02\x48\x37\x25\x57\x48\x9c\x17\xa4\xbf\x02\xe4\x92\x4c\xe0\x0c\x19\x50\x19\x1d\x3d\x12\x4f\x86\x9c\xf3\x02\xf9\xbc\x38\x90\x05\x3a\x26\x17\xfc\x16\x30\x8a\x0e\x39\x61\xc0\xe5\x89\xd1\x05\x0e\x73\x30\x20\x64\x5d\xcf\xdc\x1b\xf0\xd7\xac\xf4\x6e\xc0\x5f\xb3\xc4\xb9\x01\x7f\x4d\xd5\xb7\xc1\x2c\xf1\x6d\xc0\x5f\x73\xb3\x6b\x03\x02\xcb\x70\x4e\x80\x6e\x9c\x78\x36\xc0\x97\x9d\x75\x0c\xd5\x59\x01\x7f\x29\x28\xad\xb7\xe6\xab\x40\x11\x58\xcc\xa4\x70\xb5\xb8\x1c\xdd\x76\x27\x1e\x0b\x79\x27\x05\x86\xbf\x5d\xfc\xed\xe1\x6f\x1f\x7f\x39\xfe\x02\x13\x0e\x4d\xb6\x10\x91\x65\x01\xb3\xc8\xa2\xb8\x2c\x38\xbd\xe8\x48\x99\xa8\xc3\x43\x51\xb7\x00\x51\x84\x48\x0a\xdd\x02\x44\x91\x85\x48\x39\xab\x4f\x94\x08\xdd\x02\x44\x91\x45\xa8\xfe\x88\xec\xb2\x00\x51\x04\xdb\x91\x6e\x21\xe6\x15\x77\x66\x3a\x0c\x43\xba\x85\x58\x3a\x0b\xf1\xaf\x30\x0f\xe9\x30\xb2\xea\xc8\xe9\xad\x03\x6b\x5d\x47\xb8\x86\x0e\xa8\x75\x1d\xe1\x1a\x3a\xbc\x1f\x75\xa4\xbb\xd3\x91\x07\x5e\x87\xe9\x48\x87\xe9\x48\xb7\x26\xa0\x47\x5c\x1a\xac\xee\x3a\xac\x48\x3a\xac\xee\x3a\xac\xee\xba\x65\x81\xde\x02\x3d\x62\xf4\x10\x1c\xa3\x5b\x88\xd1\x23\x6c\x3e\x98\xdd\x74\x0b\xe1\xad\xc8\xc3\xa1\x5b\x08\xb0\xb3\x6c\xd0\xdb\x14\xaa\x06\x7a\xd1\x51\x9c\x41\x2c\xc5\x17\x64\x93\x17\x08\xef\xc5\xab\x2b\xef\x21\xcd\x67\x2f\x9e\x05\xbc\x17\xaf\xae\xbc\x67\x20\xfb\x89\x41\x8e\x09\x44\x09\x87\x05\x64\x1b\xed\x21\x8b\x7f\xaf\x0b\xfa\x2e\xe8\x29\x5b\x0a\xc2\xa8\x7b\x5d\xd0\x03\xa4\xae\xd7\x03\x7d\x0f\xf4\x3d\xd0\xf7\x40\x8f\xab\xf1\x5e\x0f\xf4\x3d\xd0\xf7\x41\xd9\x07\x65\x1f\x94\x7d\x50\x22\x4c\xbb\xd7\x07\x65\x9f\x28\x51\xf3\x00\xf4\x03\xd0\x0f\x40\x3f\x00\xfd\x00\xf4\x88\xcc\xe3\xbd\x78\x9c\xb9\x19\x6f\x4e\xdc\x44\xb6\x55\x13\x6e\x0f\x26\xf2\xb9\x98\xf0\xbb\x30\x75\xa2\x81\x8f\x85\x89\x44\xa8\xf0\x81\xe3\x00\x74\xe4\x26\x42\xde\x4c\x84\xbc\x99\x1d\x14\xe8\xa0\x40\x07\x6e\x16\xe0\x9f\x09\xfe\x99\xe0\x9f\x09\xfe\x99\xe0\x9f\x09\xfe\x99\xe0\x9f\x09\xfe\x99\xe0\x1f\xdc\xea\xb8\x09\xfe\x99\xe0\x9f\x09\xfe\x99\xe0\x9f\x09\xfe\x99\xe0\x9f\x09\xfe\x99\xe0\x9f\x09\xfe\x21\xf2\x91\x03\x63\x96\x03\x63\x96\x03\x63\x96\x9b\x3d\xea\x80\x09\x57\x10\x13\x6e\x1f\xf0\xbd\x30\x4d\x54\xd4\xa7\x98\x77\x54\x04\xf6\x9a\x60\xaf\x09\x77\x15\xb3\x2f\xe2\xbf\x60\xa9\x09\x33\x3e\x37\xc1\x53\x13\x3c\x35\xc1\x53\x73\x80\xaf\x11\x4b\x91\xde\xd6\xe4\x28\xc0\x51\x29\x07\x3d\x07\x3d\x07\x3d\x07\xcd\x04\xcf\x91\x23\xd6\x44\x2e\x5a\x73\x82\x7a\x90\x8b\x36\x71\x56\x41\x0d\x56\x5f\xf1\x58\x41\xb8\x3e\xa1\x25\x22\x4a\xa2\xc2\xc3\xa2\xaf\x78\x58\xc4\x75\x6d\x70\x90\xc8\x7c\x0e\x4a\x13\xee\x48\xc7\x00\xc2\xcd\x4b\x2f\xd0\x73\x37\xb5\xe9\x7d\x6c\xee\x1e\xcb\x4a\xae\xae\x72\x86\xfa\xe4\x1a\xd9\xc9\x99\xaa\x99\xbc\xf2\x81\x49\xd4\x10\xeb\x76\x6b\x98\xca\x93\x9b\xd6\x01\x99\xa1\x7b\xbb\x58\xa6\x65\x64\x1d\xe5\xaf\xb0\xb5\x8e\x6a\x7f\x36\x33\x93\xb2\xdd\xc3\xb5\x58\x9f\xcc\xd4\xb0\x8c\xdb\x13\x79\xed\x45\x57\x5d\x84\xd4\xa7\x91\x29\x94\x8c\xcd\x64\xf1\xa4\x16\x4a\x90\x3d\x79\xb3\x4a\x06\xea\x32\x9b\xb4\x60\x55\x36\x69\x36\xa9\xb2\x49\xd3\x95\x79\x99\x4d\xba\xef\x54\xda\xa4\x07\x39\xcb\x34\x21\xf4\x51\xbb\x6d\xa3\x93\x4b\x76\xe3\x59\x33\x1e\x70\x2b\x12\x41\x89\xc9\x6d\xe5\x90\x8f\x9a\x83\xdc\x55\x0e\x80\x24\x4a\x0c\x7c\x08\x05\xed\xe3\xfa\xa5\x8f\x1b\x6c\xf8\x41\xd9\x03\x3c\x1f\xe0\x39\x1c\x9b\x6c\x04\x9a\xdb\x1c\xcf\x91\x9f\xdb\x86\x2f\xa9\x0d\x44\x02\x1b\x69\xee\xed\x09\x9e\x43\x6e\x53\x9b\x21\x3e\x5c\xb0\x94\xbd\x5d\x2e\x73\x96\xb2\xa3\x27\xff\x2a\x86\x82\xc1\x8d\x1e\xc1\xeb\x1a\x9c\x18\x35\x86\xfc\xf7\x88\x5d\xd7\x10\xbb\xae\x41\x03\xd0\x18\x5c\xe9\xa1\x07\x68\x0c\x9e\xf4\x0c\xb0\xb8\x88\x69\xd7\x10\xd3\xae\x01\x44\x42\x63\x08\x9b\x62\x0c\xf4\x40\xf5\x65\x3a\xe8\x75\xd0\xeb\xa0\xd7\x41\x8f\x28\x05\xa6\x83\x1e\x81\x4b\x08\x78\xd7\x18\x82\x40\x18\x82\x40\xa0\x61\x68\x0c\xd1\x34\xd0\x33\x34\x04\xc2\x6b\xd0\x33\x34\x78\x46\x6a\xcc\x80\xd9\xc5\x80\x19\x05\x26\x02\x06\x9b\x03\x82\xe5\x35\x04\xcb\x6b\x50\x42\x34\x86\x48\x25\xd6\x45\xcd\x5d\xd4\x8c\x48\x07\x86\x48\x29\x86\x40\x07\x86\x90\x11\x86\xa8\x1b\x18\x4e\x35\x86\x9c\xfb\x30\x7f\x6a\xac\x07\xfa\x1e\xe8\x11\x52\xc5\xe0\xd1\xce\x7a\xa0\x07\xde\x01\x33\x41\x8f\x10\x39\x86\x10\x39\x86\x9c\x45\x0c\x27\x76\x86\x13\x3b\xc3\x89\x9d\xe1\xac\x8e\x24\x4f\x1a\x74\x22\x8d\x21\x66\x8e\x01\x62\x99\xf5\xc9\x08\x86\xa3\x3c\xa3\xc0\x0a\x84\x77\x6b\x0c\xa7\x78\x80\x72\x68\x14\xea\xad\xb1\x01\x3e\x81\x88\x14\x36\x20\x7b\x1a\x98\xc3\xd1\x24\x8e\x4f\x20\x2e\x05\x68\x1d\x1a\xc3\x61\x9e\xe1\x30\xcf\x38\x4a\x71\x32\xb3\xa1\x14\x82\x70\x35\x86\xd3\x3c\xc3\x69\x9e\xe1\x34\xcf\x60\xa1\x61\x13\x32\x95\xa1\x3a\x84\x62\x31\x9c\xda\x01\x1a\xa0\x01\xfc\x43\x03\x68\x80\x06\xd0\x00\x8d\xe1\xbc\xce\x70\x5e\x67\x38\xaf\x33\x9c\xd7\x19\xc9\x9f\x40\x13\x05\x9a\x08\x43\x0f\x13\x68\x22\xe2\xe7\x18\xc2\xdf\x18\x22\x11\x19\x22\x11\x19\x4e\xea\x0c\x01\x71\xcc\xa1\xde\xc3\xe6\xc2\x10\x17\xc7\x60\x73\x61\x00\xa3\xd0\x21\xda\x3a\x44\x5b\x87\x68\xeb\x10\x6d\x1d\xa2\xad\x43\xb4\x75\x88\xb6\x0e\xd1\xd6\x21\xda\x3a\x44\x5b\x87\x68\xeb\x10\x6d\x1d\xa2\xad\x43\xb4\x75\x88\x36\x02\xe8\x35\x1d\xa2\xad\x43\xb4\x75\x88\xb6\x0e\xd1\xd6\x21\xda\x3a\x44\x5b\x87\x68\xeb\x10\x6d\x1d\xa2\xad\x43\xb4\x75\x98\x79\x75\x88\xb3\x0e\x71\xd6\x61\xec\xd5\x21\xce\xba\x41\xb6\x35\xd8\x79\x11\xa1\xa0\xe9\x90\x67\x1d\xf2\xac\x43\x9e\x3b\x90\xb7\x0e\xe4\x2d\x09\xc6\xdc\x16\x79\x89\xbf\x20\x1a\x60\x8c\xf3\x51\x98\x30\xeb\x74\x30\x80\x1d\xc2\xe4\xe9\xc0\xfc\xd9\x81\xe1\xb3\x03\xc3\x67\x07\x86\xcf\x0e\xc6\xae\x83\xb1\xeb\x60\xec\x3a\x64\xa4\xc3\xd8\x75\x30\x76\x1d\x8c\x5d\x07\x63\xd7\xa1\x28\x52\x8c\x5a\x47\xa2\xd5\xc0\x9a\x86\x41\xeb\xc0\x46\xa1\x19\x3a\x99\xc8\x00\x3f\x82\x69\x67\x60\xda\x19\x98\x76\x06\xa6\x9d\x81\x69\x67\x60\xda\x19\x98\x76\x06\xd8\x60\x80\x0d\x06\xa6\x9d\x01\x66\x18\x98\x76\x06\xcc\xd1\x06\xcc\xd1\x06\x10\xcc\x8d\x3e\xc1\x9b\xe0\x39\xf8\x62\x80\x2f\x06\x4c\x87\x06\xec\xd0\x06\x26\x97\x81\xc8\x1d\x03\x73\xcb\x40\xcc\x97\x81\x19\x66\xc0\x24\x6d\x60\x6e\x19\x98\x5b\x06\xe6\x96\x81\xb9\x65\xc0\x30\x6d\xc0\x30\x6d\x60\x6e\x19\x98\x5b\x06\xc1\xaa\x20\xf8\xce\x80\x79\xda\x80\x79\xda\xc0\xa4\x32\x60\x9e\x36\x30\xb5\x8c\x09\x19\xbe\x40\x0f\x43\xa8\x01\x58\x75\x03\x81\x79\x06\xa6\x9c\x01\xab\xb5\x81\xb8\x3c\xc3\x22\xc3\x17\xe8\x61\xb5\x36\x30\x6c\x06\xac\xd6\x06\x06\xcf\xc0\xe0\x19\x18\x3c\x03\x83\x67\x60\xf0\x0c\x0c\x9e\x81\xc1\x33\x30\x78\x06\x06\xcf\xc0\xe0\x19\x18\x3c\x03\x83\x67\xc0\x5e\x6d\x20\xf4\xc8\xc0\x40\x1a\x04\x1b\x8a\xd9\x67\x60\x20\x0d\xb2\x78\x62\xf6\x75\x31\xfb\xba\x98\x7d\x5d\xcc\xbe\x2e\x66\x5f\x17\xb3\xaf\x8b\xd9\xd7\xc5\xec\xeb\x62\xf6\x75\x31\xfb\xba\x98\x7d\x5d\xcc\xbe\x2e\x66\x5f\x17\xb3\xaf\x8b\xd9\xd7\xc5\xec\xeb\x62\xf6\x75\x31\xfb\xba\x98\x7d\x5d\xcc\xbe\x2e\x66\x5f\x17\xb3\xaf\x8b\xd9\xd7\xc5\xec\xeb\x62\xf6\xa9\x31\xc4\xd5\x21\x42\xb9\x30\x9a\xea\x70\x09\x20\x90\x33\x40\x0e\x30\xe0\xf1\x33\x38\x0c\x32\xc0\x90\x33\x24\x04\x60\xc0\xe6\x67\x22\xee\x1c\x13\x08\xe5\x11\x0c\xf4\x0c\xf4\x0c\xf4\x0c\xf4\x0c\xf4\xb8\xb4\x03\x3a\x39\x13\x3a\xe8\x75\xd0\xeb\xa0\xd7\x41\xaf\x83\x5e\x07\xbd\x0e\x7a\x1d\xf4\x1d\xd0\x77\x40\xdf\x01\x3d\xe2\x42\xe0\x58\xc2\x10\x1c\xc6\x90\x49\x81\xc1\xfb\x88\xc1\x15\x8b\xe1\x42\x9a\xc1\x21\x8b\x21\x66\x8c\x01\x2a\x81\x09\x03\xf4\x06\xe8\x0d\xd0\x77\x41\xdf\x05\x7d\x17\xf4\xe0\x23\xc0\xb0\x19\x70\xf3\x19\xf2\x2f\x30\x78\xaf\x30\x81\x4b\x47\xdc\x4a\x33\xdc\x4a\x33\x40\x24\x31\x20\x81\x33\x5c\x4d\x33\xe0\x45\x33\xc0\x30\x33\x81\xd0\x20\xdc\x52\x33\xf8\x01\x33\x61\x82\x1e\x31\x3f\xc0\x27\x60\xb8\xa9\x66\xb8\xa9\x66\xa2\x0f\xfa\x3e\xe8\xfb\xa0\xef\x83\x1e\xc6\x4c\x84\xb6\x31\xd1\x07\x7d\x1f\xf4\x03\xd0\x0f\x40\x3f\x00\x3d\x00\x80\x04\xc2\xf5\x05\xc7\x73\x8e\xe7\xc0\xcc\x87\x93\x1f\x13\x08\x32\x82\x97\x24\x13\x1c\xf4\x88\xec\x12\x13\xd0\xc3\x4c\x03\x50\x04\x06\x0f\x36\x26\x20\x28\x02\x01\x29\x02\x26\x1b\x38\x60\x30\x60\x25\x30\x84\xcd\x31\x84\xcd\x31\x81\x20\x27\x61\x81\x1e\x01\x2a\xc2\x02\xbd\x0d\x7a\x1b\xf4\x36\xe8\x61\xce\x11\x00\x2d\x82\xb6\xcc\x04\x82\xa2\x84\x0d\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\x01\x7a\xc4\x72\x01\xb5\x82\x09\x01\x7a\x24\x05\x17\x0e\xe8\x29\x64\x07\x86\x20\xe0\x66\x33\x38\x85\x30\xb8\x5e\x33\xe1\xc0\xe4\xa4\x51\xa4\x0e\xcc\xbc\x85\x80\x1e\xfa\x01\x03\xad\xd3\xa1\x1f\xb0\xbe\x16\xa2\x7b\x4a\x02\x7a\x60\x24\x23\x22\xd8\x47\x1d\x0a\x8e\x73\x60\x59\x24\x2f\x66\xe6\xc0\x6c\xe8\x50\x24\x5c\x12\xa9\xd3\x57\x23\x75\xe8\x07\x90\xbb\xf2\x31\x38\x13\x42\x60\x82\x2d\x8a\x92\xc6\x40\x5d\x7d\x48\x40\x0e\xd9\xa5\x70\x57\xab\xe3\x36\x36\x8b\xc7\x51\x42\x70\x7a\x64\xd6\xea\x28\x81\x38\x64\x96\xc9\x05\xe2\xc4\x53\x42\xb7\x7a\x40\x29\xb2\x7a\x30\xba\x20\x90\xc6\x42\xee\x17\x0b\xb9\x5f\x2c\xe0\xae\xe8\x00\x36\xd7\x2d\x40\x72\x5b\x48\xfb\x62\xe1\x2a\x55\xb7\x00\x2c\x61\x01\xc8\x0c\xf9\x2b\x74\x0b\x59\x5e\x60\xc4\xd7\x2d\x00\x41\x21\x16\x57\xb7\x90\xe5\x05\xa1\xb8\xba\x85\x2c\x2f\x16\x60\xdc\x2c\x44\xea\x58\xc8\xf2\x62\x01\x86\x09\x7e\x4f\x3a\xfc\x9e\x74\x0b\xc0\x6e\xf0\x7b\xd2\x2d\x80\x44\xc1\xef\x49\x47\x14\xaf\x6e\x71\xd0\x73\xd0\x23\xae\x07\x68\x24\x3a\x5c\x8f\x75\x24\x12\xd4\xe1\x60\xa8\xc3\xe1\x57\xc7\xc2\xa9\x03\xcb\x5e\xb7\x10\xed\x63\x01\xaa\xc9\xb2\x40\x0f\xd4\x36\x80\xcb\xeb\x88\xf8\xd5\x2d\x0b\xf4\x16\xe8\x11\x03\x64\x01\x82\xca\x02\x94\x9c\x05\x28\x39\x84\x00\xeb\x16\xb0\xc3\x2d\x60\x87\x5b\x36\xe8\x11\x19\x64\x09\xd0\x0b\xd0\x23\x2f\x8e\x25\x28\xdf\x9a\x4e\xe1\x32\xf8\x4b\xff\x36\xf0\xb7\x87\xbf\x7d\xfc\x45\x60\x8d\x81\x88\x1b\x03\x11\x35\x5d\xd0\x23\x36\xa5\xd7\x05\x7d\x17\xf4\x5d\xd0\xc3\xaa\xd0\xeb\x82\xbe\x0b\xfa\x1e\xe8\x7b\xa0\xef\x81\xbe\x07\x7a\x98\x1c\x7a\x80\x0a\x44\x18\x26\x07\x40\x08\xef\xf5\x41\xd9\x07\x65\x1f\x94\x88\xca\xe9\x01\x60\xb0\xd7\x27\x4a\xd4\x3c\x00\xfd\x00\xf4\x03\xd0\x0f\x40\x3f\x00\xfd\x80\x53\x60\x0f\xfe\x1a\xf8\x4b\xd0\x85\xb0\x8e\xe8\xf4\x16\x46\x1b\x04\x9e\x98\x1d\x50\x76\x40\x89\x28\x19\xb3\x03\x4a\xe4\x90\x35\x3b\xa0\xec\x80\x12\x1c\x33\xc1\x31\x13\x1c\x33\xc1\x31\x13\x1c\x33\xc1\x31\x13\x1c\x33\xc1\x31\x13\x1c\x33\xc1\x31\x13\x1c\x33\xc1\x31\x13\x1c\x33\xc1\x31\x13\x1c\x33\xc1\x31\x13\x1c\x33\xc1\x31\x13\x1c\x33\xc1\x31\x60\xd5\x73\x60\xd5\x73\xc4\x90\x72\x60\xd5\x73\x13\x00\xc1\x26\x42\x9c\x4c\x13\xd6\x20\x64\xd2\x30\xc1\x4f\x13\xfc\x34\xc1\x4f\x13\xfc\x34\x61\x03\x34\xfb\x64\x7f\x02\x0d\x78\x68\x82\x7b\x26\xb8\x67\x12\xf7\x08\xf9\x71\x80\xda\x38\x28\x39\x28\x39\x6a\xe3\xa0\xe7\xa0\x87\x49\x81\x9b\x1c\xa4\x30\xd9\x73\xb8\xd7\x70\x73\x02\xaa\x09\xa8\x26\xa8\x75\x82\x5a\x11\x62\x64\x22\xb8\xc8\x84\x0d\x82\x9b\x16\x8c\x5b\x16\xba\xe3\x74\x73\xb1\x2e\xa5\xa6\xa6\xc4\xa9\x14\xb6\x9e\x34\x70\x23\x67\x6a\x4a\xe3\x00\x72\xa6\x26\xe9\x7b\x33\x29\xf5\x09\xed\x3a\x65\x5e\x91\x0c\x66\x23\x72\x63\x93\xc1\x2d\x3d\x32\x6e\xf5\xd9\x57\x39\x4a\xe2\x7d\x12\x05\x40\xfe\xc6\xc6\xde\x1e\x92\xd2\x55\x7b\x7f\x07\xc9\x9e\x84\x06\xeb\x2a\x1e\xdd\xb0\x90\xd9\x36\xf9\x9c\x0a\x72\x59\x27\xd7\x49\x72\xf5\x23\x34\x2f\x5c\x0a\xa6\xd0\x49\xe4\x1e\x97\xf3\xb0\x14\x7a\xe6\x54\x49\x00\x90\x89\xa3\x1a\x59\xc0\xa4\xeb\x24\x79\xa4\x4a\x6f\x49\x8b\xe7\xec\x4f\x89\x67\x23\xdb\xdb\x8f\x2e\x33\xfa\xfc\x3e\x73\x23\x31\x06\x36\x51\x62\xa3\x8a\x9e\x7c\x08\x6a\x1f\xfe\xe8\x77\x1f\x08\xb0\xf4\xf1\xbe\x65\x32\xb3\x3f\xd8\x06\x53\x64\xcf\xf9\xa2\x80\x68\x99\xeb\x17\x3c\x1d\xf3\x19\xbb\x4b\x72\x62\x1c\xcd\xfc\x42\x2d\x32\xf1\x6e\x69\x6c\xc0\x44\x09\x4f\xe9\xe4\xaa\xf1\x78\xe4\xcf\x5d\xee\x8d\x5f\xb9\x22\xf0\xa7\xf3\xdb\xe5\x2c\xcc\xd7\xbb\xe6\x95\xad\x94\x0e\xf8\x24\x45\x54\x02\xe4\x25\x2e\xd7\x7b\x9a\xa1\xe2\xab\x52\x32\x04\x82\xf7\x21\xb0\x20\x1c\x4e\x64\x2e\x2b\x09\x1c\x04\x13\x55\xcf\x20\x44\x20\x9c\xe0\x7b\x5d\x2a\x0f\xf7\x8e\x1e\x41\x21\x48\xe0\x20\x9b\x20\x85\x08\x18\x88\xf2\xe0\xc3\x10\xbf\x11\xb8\x47\x62\xf5\x30\x05\xb8\x07\x7e\x79\x94\xb9\x5e\x82\xd1\xee\x1b\x95\x67\x57\x47\xe5\x15\xd3\xe5\xe5\x0c\xd7\xe2\x7f\xdd\x68\xbf\xda\x8d\xf6\x43\x39\x80\xeb\x51\xb0\x10\x9e\xcb\xbd\x4c\x2c\x8b\xa0\x58\x4f\xb2\xe4\x89\x4a\x0e\x0f\xe5\x3e\x43\xa9\xec\x46\x84\x51\x5c\x57\x6e\x2c\xf5\xf7\x6b\x71\x69\x69\x4a\x23\xa5\x25\xbf\xf2\xb9\xeb\x89\xd4\xb0\xac\xa0\x1c\x10\x96\x01\x5d\x89\x4f\x4c\x4b\x2d\xb2\x58\x2d\x52\x7a\x4e\x50\x13\xbc\xe7\x98\x85\x39\x59\x88\x89\xc8\x7d\x34\x0c\xf9\xf8\x1d\x9f\x95\x95\xc8\xc5\x4a\xa4\xf0\x7c\xdd\x5c\xf1\x88\x5f\x2b\x0d\xa6\x94\x66\x13\xb8\x08\x64\x59\xd0\x14\x7a\xe1\x4d\xf9\xdc\xcd\x98\x4d\xd1\xc8\xdf\x18\xd3\x0a\x5e\x6a\xa5\x98\x56\x4f\x76\x86\xb3\x12\x54\xa3\x23\x94\xc6\xcf\xb8\x7b\x1d\xae\xae\xdd\x32\x80\xef\xed\xe1\x44\x14\x18\x26\xa3\x59\x7b\x6a\xb2\xef\x5f\xfd\xa5\xbf\xf0\x1d\x3f\x63\x8b\x0e\x33\x11\xc0\xba\x0b\xa1\xf1\x69\x34\xbc\x52\x3c\xe0\xb3\x45\xb1\x51\xf9\x98\x41\x0a\xa4\x95\x79\xd8\x29\x37\x7d\x4e\xf4\x02\xee\xce\xe7\x99\xe4\x29\x00\xae\x0a\xd1\x6a\x5a\x90\xcf\x3c\x7c\x47\x92\x27\x4f\x2d\x31\x73\xed\x8c\x3c\x03\x32\xc9\x48\x8e\xb9\xc7\xed\x78\x43\x39\x9a\xf8\x81\x3b\x75\x3d\x3e\xcf\x0a\x50\x80\xbf\x04\x55\xc9\x30\x49\xd4\xd2\x81\xbb\x36\xdd\x34\xca\xc5\x2b\x1d\xdf\xb5\x8f\x2a\xf9\xca\xe2\x21\xbe\x36\x9f\x70\x6f\xbd\x28\x53\x75\x03\xc4\xe5\xda\x3d\x95\x4f\xc7\x33\x7e\xbd\x28\xea\x91\x86\xba\x1d\x43\x39\xb1\xe9\x42\xcd\x36\xcc\x7c\x59\x65\xaa\x6e\x88\xa5\xef\xd2\x0f\xdc\x42\x67\x59\xe6\xd4\x8a\x44\xe0\x5f\x0b\x65\x1c\x2a\x31\x6a\x94\xeb\x58\xb5\xbc\x1f\xf0\x70\xb1\xde\x7b\x4a\xa5\x96\x44\xa2\x4e\xd4\xb6\xfb\x8b\x45\x96\x3d\x4b\x7b\x82\x7c\xf3\xff\xdf\x87\x0f\x5f\x9e\x48\x74\xeb\xc9\x93\x0f\x7f\x4c\x06\x1f\xfe\x98\xe0\x1f\x8e\x9a\x4f\x69\x82\x05\xb4\x00\x42\x3f\x20\x1c\xc4\x27\x0a\xfc\xbc\xa1\xe4\xc2\xec\xa6\x19\x31\x7b\x70\x02\x94\xa9\x2d\x65\x52\x4b\xda\xfb\x35\x6c\xed\x36\xf6\x67\xbd\x90\xa0\x52\xe6\x34\xca\x01\x53\xc3\x3d\xa9\x32\x4b\x64\x1f\x26\x47\xa4\xa9\x95\x09\x21\xe1\xf5\xc1\xe0\xd1\xb1\x19\xc5\x85\x7e\x98\x09\x8c\x4b\xa6\x03\x22\x8b\x00\xe5\x4c\xd4\x60\x97\xd0\x10\x5c\xaf\x6b\xb0\x42\x68\xd8\xed\xd2\xfc\xb5\x54\x06\xc6\x85\x62\x6e\xa1\x27\x2a\x8e\xf5\x13\x05\xc8\x5a\x02\x99\x30\x32\xa5\x3c\x51\xe1\xab\xf1\xa3\x4b\xf6\x13\xb2\xcb\xa8\x49\x81\xca\xd0\xa0\xc9\xe6\x92\x03\x76\xdf\x86\xcc\x9c\xa4\x53\x07\x0e\x7e\x01\x66\x59\x7b\x92\xa1\x2d\x6b\x3d\x25\x9d\xba\x84\x5b\xa6\xf7\x12\x6f\x99\x80\x40\xd6\x72\xf0\x28\xb9\xd5\x3b\x9a\x23\xb3\xf2\x54\x41\x30\x43\x33\xec\xe8\xd0\xb0\x75\xa0\x74\x74\x74\x0b\x3f\x00\x16\xd2\x01\xee\x5a\x19\xd0\x72\x92\x95\x40\x66\x22\x20\x37\x07\xca\xab\x43\x6e\x0e\x84\xb1\x2c\x73\x43\x02\x23\x63\x3d\x47\xc1\x9e\x69\xd4\x29\x95\x4e\xff\x49\x9a\xb8\x51\x06\x7d\xc8\xf4\x8d\xb9\x7c\xe8\x32\x99\xce\x44\x66\x3f\x8f\xff\x9a\x78\x34\xc0\xb5\xf8\xc0\xd9\x92\x5f\x87\x70\xf1\x2b\x00\x9f\x93\x28\x42\x5d\x39\x28\xc2\x23\x22\x0f\x05\x9d\x03\x7c\x4e\xa1\x9e\xc9\xb7\x80\xb4\x82\x89\x7a\x0c\x06\x24\xbf\xed\x88\x4e\x2e\xbc\xb0\x34\x5a\x65\x07\xb8\xe6\x9e\x12\xe9\x0a\xa8\x86\x1d\xe1\x9a\x93\x80\xd7\xce\x07\x15\xa8\xf9\x83\x82\x04\xd0\xff\xbf\x30\x76\x11\x06\x60\xdb\xb1\x50\xa7\x53\x48\xc9\x63\x4a\x98\x68\xb2\x1e\x10\x1e\x40\xc7\xfe\x33\x01\xa7\xa9\x03\x2a\xe0\xb4\x84\xcd\x46\xee\xd0\xff\x4d\xcd\xf3\x93\x82\x4f\x53\xe4\x32\xb1\x98\x22\x0e\x27\x86\x84\x7b\x61\x59\x90\x60\x5e\xcb\x3c\xf6\x97\x91\x7a\xfe\xa7\xd4\x04\x5a\x07\xb9\xd5\xc9\xca\x26\x7d\x24\xd3\x3c\xc5\xaa\xda\xb2\xf2\x84\xeb\xf8\x41\xd1\x8e\xb1\x73\x00\x7b\x9a\xad\xf4\x43\x2e\x9a\x5d\xf9\xc2\xed\x32\x70\xfd\xa8\xec\xf4\xf6\x20\xb8\x95\x5c\xd5\x81\x3b\x9f\xab\x9d\x27\xdd\x56\x33\xe0\xa0\x62\x20\xb9\x29\xc5\x1c\x14\xe2\x07\xe0\xb4\x0f\x61\xc8\xc1\x73\xa5\x10\x55\x58\xfe\x71\x59\xe9\x08\xdd\x51\x43\x1b\x43\x11\x88\x62\x67\x72\x36\x4f\x23\x1f\x0a\x79\xc3\x3d\x3e\xe5\x81\x7a\x38\xa3\x36\x96\x41\x11\xf7\xe8\x78\x04\x7f\xc6\x3e\x41\x39\xe5\x0e\x0b\xcf\xdd\x1b\x11\x8e\x8f\xae\x57\xc1\xaa\xd0\x84\x5e\x6e\xdf\xf9\x4a\x58\x89\x27\xd9\xba\x97\x9a\xc0\xd4\x4e\xf9\xd3\xa0\xa8\xae\xe7\x01\x2f\x54\x2d\xf7\xf9\x6a\x39\xf7\x6f\x8b\x6a\xf1\xd7\xc4\xc6\x5b\xf4\x43\xe5\xf3\x68\x7a\xbb\x8c\x36\x5a\xd0\x34\x6b\x17\x0c\x04\x65\xf5\xcd\x1d\xe8\x47\xf3\x09\x0f\x2b\x0e\x36\x29\x6c\x4d\x8e\xfe\x76\xc1\xdd\x52\xf3\x93\x82\x43\xa3\xd0\x47\x33\xd7\x5f\x2a\x92\xcc\x28\xf9\xc5\x5f\x1a\xf0\x13\xe8\x2e\x0c\x49\x93\x52\xf4\x4f\xb8\xa8\xff\x08\x18\xbe\xaf\x04\x40\xcb\x86\xea\xa5\xf0\x83\xa9\x6a\xda\xda\x0f\xc1\x95\x42\x9b\x2a\x7d\x35\x2a\x1c\xd9\x95\xcf\xcf\xf9\xd4\x9f\xbb\xea\x92\x5f\x05\xa1\x58\x30\x70\x7f\x3d\xa4\x81\x22\xb0\x2f\xfd\x68\xb6\x26\xdf\xda\x7b\xc5\xc4\x9d\x0b\x32\x7f\x19\x70\x2f\x9a\x95\x9e\xf1\xff\x44\x38\x22\xba\xd9\x28\x83\x23\xa2\x17\xf6\x87\x2a\x3c\x22\xfc\x95\x77\x21\x96\xe2\xb2\x6b\x1a\xb9\x4e\x09\x71\xad\x6c\xbc\x49\xbe\x01\x8a\xf6\xa4\xd8\xcd\xea\x84\x03\xc6\xde\x69\x07\x28\xd2\x93\x20\xee\x71\xe2\x62\x36\x86\x86\xd9\xf0\xb0\xb1\x69\xbe\xd9\x08\xf7\xb2\x7b\xf4\x06\xbe\x2b\x14\x27\xe7\xfc\x08\xb8\xd3\x1c\xb6\x69\x09\x9c\xa9\x9d\x4b\x70\x57\x06\x67\x2a\x12\x97\x07\x3e\xa9\x48\x95\x2f\xd5\x75\x82\xeb\xe1\x9a\x7a\x0e\x4a\x93\xcb\xa8\xe6\xd5\x97\xab\x7f\xf3\x80\x47\xca\x96\xfc\x67\xa2\xd4\xc3\x1c\x53\x8e\x52\x4f\x3f\xec\x0a\x98\x7a\xb2\x95\x52\x22\xc5\x14\xb3\xde\x51\xbb\xe1\xfd\x9b\xcf\xf9\xf8\xa5\xef\xd9\xa5\xc6\xd3\xaf\x00\x38\xea\x2b\x97\x8e\x7c\x90\xe3\x5d\xb0\x58\x5d\xcf\x54\xde\x7d\x97\x84\x04\xd6\x96\xb4\x04\xf4\xc2\xde\x98\x97\x80\xb4\x2b\x6e\xf6\xb2\xee\xbc\x52\xd6\xf1\x1d\x33\x5f\x75\x34\xad\x5b\x85\xdd\x2a\xe1\x5a\x27\x9b\x60\x54\xab\xa0\x2f\x0b\x57\x05\x74\xe2\xcf\x60\x8c\xde\xff\x39\x20\x50\xff\x07\x02\x9a\xbc\xe2\xde\x74\xa5\xd8\xbb\xc9\xd6\xc7\x08\xdd\x16\x60\x21\x1d\x6d\x1d\x10\x37\x9f\x6c\x2c\xc9\x2c\x26\x8a\x38\xaf\x3b\xc2\x9b\x52\xa0\xe4\x83\x01\x3f\xd5\xbe\xb8\x8e\x3b\xbe\xf0\x67\xae\x37\xbd\x2d\xee\x9f\x9d\xbc\xfe\xa9\x58\xd9\x3b\x83\x3c\x43\x56\x9e\xef\x2b\x57\x06\x09\x10\xba\xa1\x12\x45\x41\xf9\x1d\x5b\x25\x76\xa5\x45\x19\x41\xad\x5c\x24\xc7\x2b\x31\x09\xc4\x27\xe5\xde\x8f\x5c\xb7\x37\x25\xb2\x31\x14\x6c\xd7\x87\xc2\xb9\x1a\xca\xc2\xf8\xca\x0d\xf8\x94\x7b\x3c\x6d\x44\x15\x76\x72\xe1\x48\x22\x4f\x08\x64\x9f\x29\x60\x7d\x25\xc6\x1a\xda\x53\xb2\x6f\x9d\x2c\x96\x22\x70\xf9\x7c\x7c\x14\xf0\x12\x8d\x9f\x18\x68\x48\x73\x05\x5d\x55\x11\x86\x61\xce\x91\xe0\xc4\x9b\x89\xc0\x8d\x84\xad\x68\x13\x74\x4a\xec\x10\xb0\x02\x6c\xf7\x06\xb4\x85\x1e\x2d\x76\x88\x4d\xd4\x7a\x26\x1d\x22\x29\x85\x0d\x5c\x5d\x39\xdd\xe8\x10\xa2\x3b\xb9\xaf\x30\xb8\xa4\x31\x0b\x8e\x23\x0c\x5e\x67\xcc\x82\x99\x80\x01\xde\x92\xc1\xed\x8c\x61\x6c\x99\x05\xe7\x4a\x0b\xd1\xc7\xa4\x67\x33\x9b\x7e\x60\xb8\x19\xe1\x58\x6b\x1a\x60\xc6\xe1\xb6\x48\x6a\xae\xae\x39\xb0\x2b\x53\x9e\x3e\x4d\xb7\xc1\x63\xac\x8b\x03\xbe\x86\xc6\xa3\xd3\x0f\xbd\xdc\x7e\xea\xd8\x64\x49\x4a\x90\x3a\xb1\xf0\x4c\x54\x34\x1e\xba\xee\x4e\x9c\x4b\xe8\xc4\xda\xd7\xc9\x61\x86\x7e\xc0\xb6\x23\xc1\x0f\xb9\xad\x1a\x53\x92\x19\x23\xf2\x43\x10\x5a\x81\xbb\x8c\x5c\xdf\xe3\xf3\xf1\x39\x9f\xcd\xf9\x4d\x71\x57\xa5\x2b\xe7\x1c\xe0\x29\x59\x85\x1c\x73\x53\x55\x41\x34\x5b\xbf\x16\xa2\xba\x72\x48\xaa\x5d\xaa\x2b\x27\x19\xff\xcd\x6f\x78\xee\x7a\x30\x45\x9a\x8e\xf5\x06\x3e\x20\x14\xee\x81\x0d\x5b\x3a\xce\x39\x03\x5b\x99\x0a\xbf\x71\x37\x9a\x95\x5f\x62\xe6\x11\x33\xed\x8f\x6a\x21\xcf\xe3\x76\x36\x7d\xb2\x1c\x2a\x0f\x4f\x9b\x02\x2d\x68\x53\xda\x14\x7b\x87\xb4\x29\xa4\x11\x59\xc0\xc0\x48\x73\xa8\xa8\xed\x8e\xf8\x75\x7e\xde\xe7\x91\xd1\x6d\x05\x19\x5d\x85\x3c\xd7\x6d\x5a\xee\x91\x5a\x99\x26\x5e\xa7\xd3\x35\x15\xe0\xe6\x1e\x56\x6b\x93\xee\x11\x06\x76\xf9\xc2\x41\x6e\x5b\x09\x20\x60\x8e\xa1\xb7\x7c\x36\x7e\xed\x2a\x83\x48\xb7\x23\x03\x44\xe6\x0e\x54\x0b\xd3\x6f\x33\x1e\xf8\xe1\x6c\x7d\xd4\xf4\x32\x2f\x95\x0f\xfb\x62\xff\xd2\xad\xb9\x4c\x9b\x48\xf8\x98\xa9\xcd\x97\xcc\xa0\xaa\xd9\xe3\xb7\x99\x1b\x71\x6f\x7c\xb9\xe0\xf3\xf9\xf8\x12\x42\x5d\x54\x53\xb0\x55\x1b\x74\x21\x91\x73\xc9\x48\x76\xf5\x22\xca\x62\xae\xfa\x85\x08\x94\x6d\x49\xe6\xd7\x00\x98\x82\x49\x60\x00\x26\x50\x13\x28\x3f\x32\x33\xb1\x0e\x11\x94\x3a\x1b\x38\x39\xae\xf9\xff\x5e\xf3\x20\xc8\x9d\x00\xf2\xd0\xba\x22\xd7\x8a\x95\xcd\x3f\xf1\x35\x1d\x9a\x8a\x27\xc8\xb9\x5c\x35\x67\xab\xbb\xeb\x6b\xae\x78\x18\x7c\x45\xfe\x9a\xca\x94\x35\xfd\x27\x4a\xe6\x1a\x7a\x8f\xb8\xb4\x2c\x8d\x8d\xda\x98\xc8\xf5\xca\xb2\xeb\x6d\xca\xac\x47\x48\x46\x0a\x7a\x51\x8a\xaf\x02\xb4\x13\x1b\x37\xa2\xcc\x46\xc0\x84\x0d\x8f\x70\x86\x33\x05\xb3\x7b\xb4\x23\x00\x1e\x84\x12\x9b\x32\x9b\x22\x09\xa8\x02\x41\x7b\x45\x25\x62\x83\x0e\xc4\x06\x1d\x77\xa8\x1d\xbd\x3c\x59\x44\x92\x05\xc2\xcc\xa5\x03\xa0\xc8\xee\x2d\xe9\x00\x70\xed\x5a\x11\x56\x6d\xe0\x6f\x2f\x45\xb1\xcf\x87\x55\x57\x40\xb9\x2b\x8c\x16\x4b\x6b\x96\xad\x34\x59\x7e\x13\xdc\x58\x53\xe6\x1f\x0b\x00\x2e\x59\xb2\x13\xa5\xb4\xbb\x98\xac\xb2\xc2\x3b\xe4\x82\x99\x64\x69\x9e\x81\x3e\xcd\x06\xf9\xfa\x3c\xc1\x83\xf1\x51\x99\x7d\x72\x27\x0c\xf4\xb5\xaa\x7e\xfd\x8e\xa0\xf3\xb9\xaf\x87\x19\x5f\xb2\x1c\x13\x4e\xf1\x78\x4b\x2e\x15\x4a\xb9\x5b\xab\xca\x65\x25\x05\x38\x57\x3f\x73\x6b\x57\xec\xc8\x79\x08\xf6\xdc\x6d\xc3\x1b\x3e\xe3\xff\xe6\x5e\xe9\x32\x91\xa2\x80\xf7\x72\x05\xae\x79\xc8\x83\xb2\xa3\x79\x7a\x8b\xda\xcf\xd1\xcf\xf9\x2d\x9f\x2b\x0e\x2d\x3b\x64\x07\xdb\x90\x10\xcc\x51\x52\x81\x51\xf6\x2f\x3a\x01\xdb\x6a\x52\xce\x37\xdc\xb3\xb9\x7a\x85\x92\x66\x64\x9c\xe0\xaf\xc8\x91\xba\xd6\x8c\x8b\x72\xce\xa5\x60\xa6\xd8\x8e\x04\x39\x08\x3a\x79\x7e\x04\xd6\x4c\x14\x0b\x93\x9f\x97\xb4\xfd\x6f\x42\x82\xce\xd5\x14\xf2\x80\x2f\x36\x98\x3e\xbe\x16\x32\xda\xac\xba\xfc\x78\x23\x6c\xe1\x70\xd7\x0e\x5c\xaf\xec\xc4\x9e\xdc\xa3\x0e\x78\xae\x8c\x88\x84\x3b\x7e\xc3\x6f\x15\x7b\x61\x9a\xab\x03\x40\x10\xe4\xe3\xc7\x27\x02\xfe\x45\x0e\xfd\x70\x06\x6a\x1d\x9e\x2d\xc6\xbf\xb9\xd7\xfc\x7a\xe5\x96\xb9\x2e\xe7\x60\x63\x2d\x8b\x4e\x19\x76\x8e\x6b\x22\xf0\xdd\xc8\xb5\xc6\xc7\xab\x20\x74\x6f\x44\xa9\xfc\x27\x9e\xe6\x94\x75\x80\x2e\x8f\x24\x5e\x3d\x41\x0e\xe4\x4e\x7b\x69\x95\xd5\xf7\x2e\x54\xad\xbc\x19\xcc\x5d\xda\xbc\x71\xe3\xad\xb3\xc4\xea\xb1\x03\xea\xb3\x5a\x8d\xbf\x26\x03\xdd\x9c\xed\xcf\x50\xd5\x9b\xdc\x58\xfa\xde\x14\x8e\xd7\xd9\x52\xdc\x47\xa8\x64\x1f\x90\x62\x38\x78\xb0\x3e\x5c\xa8\x09\x7f\x94\xf5\x09\x75\xa9\x0f\xa8\xb0\x8a\x4c\x5f\xa5\x6d\x49\xee\x95\xd5\x55\xe8\x4d\x50\xec\x3e\xcf\x45\x3b\x08\xb5\x20\xdc\x6e\x7b\xf4\x28\xd7\xfb\xd5\x3c\xaa\x58\x94\x1e\x96\x2f\x20\xc7\xa0\x5b\xee\x2d\xb8\xa2\xa2\x25\x69\xee\x06\x6a\x4e\x1b\x4a\x63\x93\x24\xab\x51\xd6\x96\x53\x3e\xe1\x51\xd5\x7a\x91\xcf\x8f\xc1\x49\x5e\xb9\xda\xb5\x53\xee\xd9\x6e\x72\x7b\x5a\x72\xdb\xb9\x15\xe6\x5e\xa8\xd6\xfa\x53\xf1\x69\x7c\xc5\xdd\xf1\xeb\x95\xe2\xe3\x57\x9d\x44\x8d\x4e\x56\x6c\x80\x20\x46\x9c\xac\x58\xee\x64\x75\x2a\x3e\x95\x8e\x74\xea\xef\x32\xa1\x9d\x0e\x3f\x7a\xaa\x6f\xf4\xe9\xb5\xa2\x30\x9a\xa4\xf1\x51\x9a\x5c\x93\x22\xcb\x4d\x55\xb3\x3d\x5d\x85\xb3\x55\xa9\xd2\xcd\x14\x84\x72\x05\x7a\x5c\x29\x7a\xeb\xf2\x6b\xe1\x4d\xc7\xe7\x2b\x6e\xcd\x56\x62\xfc\x6a\xe1\x7b\xd3\xb2\x5b\xa1\x02\x50\xb5\xdc\x02\x6d\xd5\x17\x06\x8b\xa7\x41\xee\x31\xea\x20\x9d\x4d\x55\x0f\x4c\xd6\x23\x86\xf6\x06\x8a\x11\xeb\x6c\x3e\x3e\x9e\xb9\xd7\xae\xa2\x2d\xd1\xb5\x82\xa5\x0a\xcb\xd9\xdc\x1e\xbf\x5a\x79\xd3\x32\xe7\xd3\x42\xc4\xd0\x87\x42\xe6\x10\xcb\xe1\xeb\x86\xa8\xb8\xbe\x93\x88\xcf\x2b\x6e\xa9\x12\x8c\x7a\x5c\xf5\xc8\xf4\x35\x7a\xb1\xfc\xa9\x1f\x44\xb3\x31\x22\x2c\x2a\x36\xbd\x44\xbb\x28\x96\x3c\x17\xc1\xa2\xe2\xcb\x69\x7a\x9c\xf5\x22\x61\x85\x12\x53\x9a\x38\x27\x77\x94\x8a\x2b\xb8\xf4\xa7\x25\x6a\x4d\x27\xd7\x5d\x73\xad\xcc\x6a\x4b\x0f\x33\x98\x9f\x7c\xc9\xab\x55\x70\x5d\x7e\xc3\x9d\xe5\x7b\x51\x8b\x04\xee\xad\x62\x52\xf8\x13\xf3\xee\xe2\x54\x54\x9a\x77\x97\x5e\x50\x82\x5d\x2a\xb2\x25\xf3\x2e\xe9\x4b\x13\x53\x09\x46\x38\x0b\xf9\xb4\xb8\x73\x92\xff\x47\x79\x7e\x22\x95\x05\xe1\x82\x7b\x6b\x46\x5c\x96\x5b\x0c\xa1\x19\x27\x2e\x5f\xea\x52\x7c\xce\x67\xfc\xd3\xac\x6c\x0a\xd3\xae\x91\x6e\x9a\x5d\x45\xc6\xe0\x20\x45\x4e\x8e\xb6\x83\x98\x91\xaa\x0c\x0c\xea\x87\xe6\x8b\xdb\x40\x78\xa5\xea\x41\x9a\xe1\x28\x5f\x62\x35\x3e\x76\xbd\xf1\x2b\x5e\xea\x95\xa2\x24\x0a\x51\xca\xcc\xf8\x34\x1c\x9f\x67\x12\x91\x25\x6a\x33\x55\x2a\x5f\x78\x6e\x89\x6a\xaf\xab\xab\x16\xd6\x43\x9b\xe5\x9a\x14\xf2\x79\x24\x82\x8d\x76\xbc\x34\x57\x11\xb9\x38\xd1\x0f\x5c\xf6\x92\xca\xe9\xe4\x36\xa3\x0b\xf1\x6f\x1e\x73\x3e\xb5\xe0\x24\xa9\xe0\x3a\xf8\xab\x2c\x64\x17\x2b\x4f\x75\xe4\xa8\xc8\x54\x9a\xd1\x5f\xf2\x05\x0f\xdc\x48\x0d\x96\x49\xf2\xa5\x03\x33\x95\xfc\x65\xb5\x7e\x47\xa8\x65\x56\x01\x0f\x67\x51\xa0\x32\x30\x49\x6e\x87\xb4\x76\xf0\x44\xe4\x7d\x5b\x51\x21\x2f\x67\x3c\x80\x5d\xaf\xe4\xfc\x22\xf5\x33\x5b\xed\xf2\xe5\x8c\xdf\x54\x78\xf3\x27\x27\xb9\x9c\x1c\x5c\xba\xb6\x3d\x2b\xc6\xd5\xd1\xae\x58\x9a\x80\xc7\xb6\x73\x85\xa7\xde\xef\x81\x1b\xb9\x6b\x3b\x94\xea\x5a\x04\x34\x51\x9b\xee\xe6\x6c\xe0\x85\x66\x51\x4a\xf9\xa6\x78\x33\x3e\x57\xd6\x9b\x6f\x96\xeb\x98\xef\x92\xf1\x98\x0c\x95\xc0\xd9\xd2\x6c\x87\x0e\x6a\x8e\x51\xca\x78\xf2\xf4\xb5\x1d\x55\x55\xd9\xb4\x90\x77\x92\x99\x9d\xa3\x0f\xf8\xf8\xd2\x5f\x2c\x45\x91\x79\xd2\xd6\xab\xa6\xb2\xb2\x1c\xb9\x73\xe6\x6b\xb8\xf5\x17\x13\xbf\x74\xfa\x4a\xcd\x99\xeb\x2a\xfd\xca\xb3\x79\x21\xac\x4a\x66\x85\xa5\x04\xad\x74\x71\x60\x59\xca\x64\xbe\xbc\x9d\xfb\x91\x3b\x3e\xe5\x53\xc5\x1b\x8e\x93\xa8\xf3\xbe\x6e\xa9\x94\x81\xcb\x95\x23\x29\xf9\x92\x6b\x26\x20\x8a\x4d\x0d\xcc\x47\x34\xb7\x66\x1a\xa4\x31\xe1\xac\xdb\x27\x58\xe1\x7e\x4f\xb1\xd3\x5c\xf1\x29\x9f\xfb\x53\xc5\xc8\x48\x1a\x6c\x21\x3d\xb0\x91\x2b\x31\xe1\xde\x27\xc5\xb6\xb3\x43\x76\x60\xb5\xb8\x3b\x7e\xad\x6a\x98\xe5\x09\x7c\xf3\x05\xae\x72\x3a\x54\x21\x65\x2f\xfd\x80\x17\x15\x87\x07\x3e\xe3\x40\xd6\xe5\xe4\x43\xc4\x07\xf8\x41\xab\x0c\xe7\x76\xbe\xe6\x77\xae\x88\x94\x23\x27\x2d\x11\x85\xc4\x91\x8e\x5a\xe4\x7a\x4d\xd9\xee\xaa\x8a\x0e\x72\x5f\xa5\x7e\xad\xaa\x08\x5d\xf1\x85\x3b\x57\x36\xf8\x9f\x36\x5f\xbd\x5d\xc8\x57\x3f\xa1\xd9\x3a\x71\x8a\x2b\x23\x2c\x09\x8e\x25\xcd\xd9\xec\x43\x11\xb4\xee\x8a\x7b\xd3\x55\xb9\x41\x5c\xa3\xfb\xfa\x34\x8f\x53\xe9\xdd\x7b\x45\x56\x22\xd5\x35\x56\xe4\xad\xe8\x4a\x7a\x22\xa5\x19\x62\xbe\x9a\xae\x94\xdb\x1a\x9a\x2d\xdf\x3a\xe5\xbe\xbd\x7b\xca\x7d\x52\x9b\x10\x12\xa7\x59\x26\xec\xdb\x39\x55\xff\x6a\xc6\xd5\x6b\x1a\x8d\x0c\xff\x9a\x39\x61\x39\x1a\xc5\xc9\xa4\x34\x6f\x7c\x77\xa2\x90\xbb\x13\x91\xdb\x42\x49\x1f\xda\x94\xd1\x7d\x2d\x89\xbb\xe6\x90\xf0\x20\x07\xb3\x46\xbe\xfc\x9a\x83\x45\xde\x81\xc5\xdd\xb1\xd5\x95\xc5\x75\xe2\xc3\xe9\x2c\xf3\x1f\x29\x4b\x38\x8c\xa0\xa4\x9c\xc1\xed\xca\x0d\x66\xab\xa8\xfc\xec\x98\xdc\xc9\x99\xca\xa2\x6d\xab\x93\xec\x6d\x7c\x3c\x8a\x2a\x0e\x16\xb9\x54\x9b\xb9\x13\xc9\x3b\x85\x97\x69\xb2\x5e\x5d\x61\xdf\xef\xdc\xb3\x66\x7e\xd9\xd1\x30\xd5\xde\x06\x52\x1c\xd5\x42\x01\xf7\xa6\xe3\x63\x37\x2a\x3d\x9f\x27\x6a\xac\x3c\xa2\xa9\x25\xff\x29\x3e\xbb\x6b\x46\x9b\x8e\xba\xce\xe4\xc2\x8c\xe1\xcd\x9f\x26\x7e\x54\xeb\x51\xba\x95\xcf\x4e\x3c\xa0\x1f\x96\xe2\xeb\xf3\x2f\xee\xf1\x09\xff\xcc\x83\xf1\xe5\x7f\x56\x3c\x28\xea\xb7\xbd\x9c\xcd\x28\x3e\x27\x7d\xbc\x6f\x99\x06\xeb\x99\x0a\x98\x40\x2b\x6a\x79\xcd\x2f\xf5\x55\x28\x6a\x61\x14\xb8\x56\x54\xff\xc5\x6b\xdb\x8d\xa8\xf5\x25\xca\xa8\x9a\x5f\x02\x11\xad\x02\xaf\x36\xbf\xbf\x6f\xfe\x72\xc3\x83\x5a\xd0\x72\x87\x5e\xc3\x1c\x98\xbd\x6e\xb3\xc5\x87\x5e\x83\x69\xbd\xce\xa0\xd9\x9a\x0f\x1b\x8d\x60\xa8\x14\x4c\xfe\x59\x13\x8d\xe6\x97\x57\x8d\x68\xe6\x86\x2d\xd1\x6c\xc5\xff\x6d\xbb\xe1\xd1\xdc\xbd\x11\xc3\x47\x1a\xfd\x5e\x79\xe1\x6a\x12\x5a\x81\x3b\x11\x43\x4f\x7c\xaa\xb9\xed\x3f\xfe\x71\x2f\xbf\x3c\x6e\x88\xd6\xfb\x2f\xd7\xe2\xf6\xb0\xee\x4d\xcf\xbc\xe7\x22\x8c\x02\xff\xb6\xde\xba\xe1\xf3\x95\x50\x5b\x9a\xaf\x99\xad\xd5\xdc\xf6\xc4\x1f\x51\xa3\xb9\xfe\xdc\xf2\x17\xcb\xb9\x88\x44\xa3\x79\x7f\xff\xb1\xd9\x12\xf7\x8d\x66\xb3\xfd\x61\xa5\xe9\x66\xd7\xe1\xd6\x50\xc5\x5f\x90\x6d\xf2\xc4\xa7\x86\xb8\xbb\x0b\x9a\xf7\xad\x40\x52\x2e\x03\xff\x66\xc8\xdb\xff\xfc\x6c\x36\xbe\x44\xfe\xb5\xf0\x0e\x83\x96\xc3\xad\xc8\x0f\x6e\x0f\x83\xac\xb6\xfb\x66\x2b\x2e\x65\x6a\xbb\x0e\xc6\xf9\xb4\x64\x34\xdc\xfb\xd6\x1f\xff\x5d\xf2\x9c\xdf\xb7\x7e\x0f\x4b\x47\xaf\x15\xb1\x92\xe7\xbe\x3a\xaa\xf1\xf8\xb9\x77\x77\x0d\x77\xf8\xe5\xbe\xd9\x6c\x5f\xfd\xf6\x72\x58\x8f\xae\xa7\xf5\x56\xd0\xbe\x3a\x1e\x0d\xeb\x91\x25\xea\x2d\x37\x1e\xf4\x2f\xc2\x76\xe3\x8a\x0e\xdd\x98\xaa\x65\xcd\x57\x61\x24\x82\xab\xdb\xa5\x78\x2e\xc8\x5f\xc0\x0f\x0e\xeb\x0b\xee\xf1\xa9\x58\x08\xc0\xb6\x06\x30\x80\x4d\x0f\xbf\x44\x6e\x34\xa7\x0d\xe7\xf3\xaa\xf6\xdb\x6a\x22\x02\x4f\x44\x22\xac\xbd\x0c\x5c\xbb\xde\x9a\x13\xd9\x39\x9f\x8a\xc3\x2f\x73\x7f\xea\x1f\xcf\x79\x18\x1e\xd6\xa3\x98\xfc\x49\xfc\xa0\xde\x92\x35\xfc\x2e\xe6\x96\xbf\x10\xb5\xc8\xaf\x45\x33\x51\x7b\xf7\xe6\x13\x0f\x44\xad\xb4\xde\xda\x89\x17\x46\x7c\x3e\x17\x41\xbd\xe5\x7a\x51\xe0\x1f\xd6\x37\x92\xdb\x22\x96\xa1\x20\x44\xc5\xa1\x08\x6e\x5c\x4b\xc4\x3f\x78\x54\x3b\xb9\xaa\x45\x82\x2f\xc2\x9a\x27\x84\x1d\x7f\x5b\x38\x8e\xb0\x22\xf7\x46\xcc\x6f\x6b\xe1\x6a\xb9\xf4\x83\xa8\x66\x8b\x1b\x31\xf7\x97\x71\xd7\x25\x35\xca\xca\xc7\x35\xee\xd9\x35\xcb\xf7\x1c\x77\xba\x0a\x84\xf2\xf1\x27\x13\x1e\x0a\xbb\xc6\x97\xcb\xb9\x6b\xf1\x98\xc1\x61\xcd\xf5\x6a\xbc\x46\x02\xfa\x47\xed\x93\x1f\xcc\xed\x76\xed\x24\xaa\x4d\xf8\x9c\x7b\xd4\x28\x81\xa6\x84\x35\xdf\x29\xfb\xae\x5f\xe3\x96\x25\xc2\xb0\x16\x88\xd0\x5f\x05\x71\x91\xf8\xf3\x49\xa7\x5a\xb5\x4f\x6e\x34\xcb\xd7\x62\x09\x2f\x5e\x4b\xdc\xcf\xc2\x8e\xbb\xeb\x07\x53\xee\xb9\x9f\x65\x7b\x22\xbf\xb6\xe0\xae\x17\xf1\xb8\x61\xd4\x8f\x28\xf0\xe7\xa8\x41\xfd\xbc\xf0\x6e\xdc\xc0\xf7\xe2\x7f\x87\xed\xff\x9a\x04\x7f\x8f\xff\x7f\xe5\xd7\x26\x62\xea\x7a\xb5\x55\xe8\x7a\xd3\x72\xe6\xb7\x6a\xb7\xfe\xaa\xe6\xb8\x41\x18\x33\x6c\x39\xf7\x6f\x6b\xbc\x96\x89\x52\x4d\x0a\x5b\xdc\x90\x5b\x7f\x15\xd4\xac\x99\x1f\x0a\xaf\xe6\x7a\x4e\x10\xaf\x81\x2b\x2b\x5a\x05\xa2\x5d\xbb\x9a\x89\xb2\x52\xf1\x2c\x75\x6d\xc9\xb7\xb8\x9f\xb7\xb5\xa5\xef\x7a\x51\xcd\xf1\x83\x0a\x61\x70\xbd\x48\x4c\x03\x74\x9f\x98\x85\xcf\x2e\xe7\x3c\x72\xfc\x60\xd1\x02\x17\xf8\x7c\xee\x7f\x0a\xd1\xf2\xc8\x4f\x9a\xbd\x58\xcd\x23\x77\x39\x17\xf1\xb0\x5d\xcf\x7d\x6e\x27\xad\xc8\x18\x72\x1e\xf8\xf6\xca\x8a\x6a\xb6\x6f\xad\xe2\x76\xd2\x57\x2c\xee\xd5\x26\xa2\xe6\xf8\x2b\xcf\xae\xfd\x17\xaf\xcd\x02\xe1\x0c\xff\x36\x8b\xa2\x65\x78\xf8\xf4\xa9\xed\x5b\x61\xfb\x66\x11\x8b\x6f\xbc\x72\x3d\x15\xde\x53\x12\xe6\x27\x68\xff\x13\x45\x9e\xe2\xf6\x3f\x75\x3d\x5b\xfc\xd1\x9e\x45\x8b\xf9\xdf\x6a\x11\x0f\xa6\x22\x1a\xfe\x6d\x3c\x99\x73\xef\xfa\x6f\x7f\x9f\x89\x40\xfc\xd7\x53\xfe\xf7\x76\xfd\xfe\xfe\xbe\x35\xcf\x4d\xec\xe3\xd1\x57\x4c\xec\x63\x7f\xb1\x58\x79\x6e\x74\x5b\x1b\x51\x8d\x1b\xa6\xb6\x25\x36\x4e\xec\x8a\x0a\x4b\xe6\x74\x15\x65\xe3\xea\x78\xd4\xac\xb9\xa1\x5c\x23\xfe\x16\xd6\xce\x96\xc2\xab\x5d\x62\x3e\xa8\xe3\x6d\xbb\xf1\xe2\x3b\x59\xc5\xa5\x48\x84\xdc\xe4\x23\xb5\x4f\xee\x7c\x9e\x09\x64\x24\x16\x4b\x3f\xe0\xc1\x6d\x2a\x59\xbe\x47\x82\x31\xf7\x2d\x3e\xaf\x2d\xb8\x35\x73\x3d\xf4\x61\xe2\xfb\x51\xbc\x39\x2f\xcb\xe5\x38\x29\x67\x8b\xd0\x0d\xe2\x25\x05\x43\x14\x7f\xdd\x0d\xcb\xe8\x63\xe1\x88\x66\x02\x12\xb2\x0a\x69\x0d\x4a\x9a\xe5\xd9\xb2\x44\xb9\xc8\x3d\xfd\x3b\xfe\xbc\xf0\x83\xda\xc2\x0f\xe2\xf9\x1a\x71\x77\x1e\xd6\x42\x21\xc0\xe9\x9c\xa8\x1d\x3e\x7d\x8a\x45\xd7\x4a\xd8\x29\x45\xa3\xed\xfa\x10\xc1\x75\x61\x9a\x8a\x28\x8a\xa7\x75\x18\xf1\x20\x12\x76\x6d\xba\x72\x6d\x45\xba\xfc\xe1\x97\x0a\x79\x0a\x23\xee\xd9\x7c\xee\x7b\x42\x95\xa7\x9c\xbc\xfc\x65\x46\x38\xeb\xcb\xd6\x11\xfe\xd1\x23\x72\xdf\xea\x99\x5a\x47\xdb\x49\x0b\xf9\x47\x89\xf2\x10\xa4\xca\xc3\xf0\xcb\xeb\xa3\xd3\xe7\x27\xa7\x2f\x0f\xeb\x4f\x57\x6e\xbd\xf5\xee\xf2\xfc\xd5\xe8\x62\x34\xfe\xfd\xe4\xea\xd5\xf8\xb7\xb7\xbf\x8e\x2e\x4e\x47\x57\xa3\x4b\xbc\x7d\x7a\x13\x2e\xe3\x65\xe7\x49\xbc\x96\x3e\xb9\x4e\x87\xa6\xde\x3a\x39\x3d\x3e\x7b\x73\x7e\x74\x75\xf2\xeb\xeb\x11\x91\xba\x5e\xbc\xf3\xf1\xc8\x9d\xcc\x45\xbd\xf5\xfb\xc9\xbf\x8e\x2e\x9e\x8f\xdf\xbc\x7c\x73\x35\x3e\x7e\xfd\xf6\xf2\x6a\x74\x41\x64\x9f\xdc\xcf\x3c\xb0\xeb\xad\xa3\xdf\x2f\xc7\x44\x44\xcf\xf9\xa7\x30\x7b\xf7\xaf\xb7\x68\x90\xf2\xf6\xf3\x2a\x10\xe9\xfb\xe7\x67\xc7\xbf\x8d\x2e\x72\x04\xb6\x6f\x5d\x8b\x20\xa5\x90\x9f\x3f\xbf\x38\x7b\x79\x31\xba\x94\x9d\x21\x71\x79\xb2\x0c\xfc\x69\x20\xc2\xb0\x7e\x7f\xdf\xea\xf7\x07\xfa\x6e\x4c\x7d\x5d\xaa\x91\xb5\xce\x4b\x1e\x87\x79\xf5\x5b\xef\x77\x7a\xa4\x7d\x1b\x3d\xb3\xaf\xc7\xda\x77\xaa\x88\xfb\x50\xe4\xfc\xbb\xbb\x86\x0f\x45\xee\x7d\xd0\x4e\xc6\xe3\xf8\xec\xf4\xea\xe2\xec\xf5\xf8\xfc\xf5\xd1\xe9\x68\x3c\x3a\x7d\x7e\x7e\x76\x72\x7a\x15\x77\xe9\xdd\xc9\xf3\xd1\xc5\xf8\xf8\xd5\xd1\xe9\xcb\xd1\xf3\xa1\xf6\x71\x58\xdf\xb3\x4c\xbd\x15\x28\x1f\x7a\x7e\x74\x75\x74\x3c\x3a\xbd\x52\xea\x64\x4a\x9d\xeb\xaf\xa9\xb8\xf2\xfc\x62\x74\x39\xba\x1a\xea\x1f\x87\xf5\xe2\xc3\xfc\x97\x8e\xcf\x4e\x5f\x9c\xbc\x1c\xbf\x38\x79\x3d\x1a\x9f\xbc\x39\x3f\xbb\xb8\x1a\x3d\x1f\x76\xf2\xed\x5f\x23\xd8\x56\xc5\x78\x74\x71\x71\x76\x31\x34\x36\x56\x43\x44\xf9\xaa\x5e\x8e\xae\xc6\xb1\x10\xbf\xbd\x1a\xc5\x8d\x3d\x7b\x7b\x71\x3c\x1a\x76\x95\x6a\xca\x08\xd6\xab\x88\xbb\x3c\xbe\xbc\x3a\xbb\x18\x5d\x0e\x7b\x85\xd2\xca\xbb\xf5\x82\x67\x97\xe3\x93\x37\x47\x2f\x47\x97\x43\xb3\x50\x2c\x7d\xb3\x5e\x28\x69\xc7\xf8\xfc\xec\xec\xf5\xe5\xb0\x5f\x28\x99\x7f\xbd\x5e\xfc\xdd\x9b\xf1\xe9\xe8\xea\xf7\xb3\x8b\xdf\x2e\x87\x83\x42\x59\xe5\x5d\x69\xc1\x17\x67\xaf\x9f\x8f\x2e\x2e\x87\x4c\x5b\x2f\x28\xdf\xe5\xcb\x9d\x9c\x8f\x5f\x1c\xbd\x39\x79\xfd\x4f\x29\x38\x43\xa6\xca\x55\xf1\x6d\xbe\xec\xbb\xe3\xf1\xd1\xdb\xab\x57\xa3\xd3\xab\x93\xe3\xa3\x58\x4c\x98\xae\x94\x2d\xbe\xa5\xb2\xf1\x92\x72\x74\x72\xf1\xf2\xe8\xfc\x7c\xf4\x7c\xfc\xee\xfc\x38\xfd\x6e\x2c\x63\x55\x6f\xb3\xb2\xa5\xe2\xc9\x0c\x59\xb6\x5a\x36\xcb\xdf\x4a\xb9\x64\xdd\xca\xf2\xaa\x50\xc6\x14\x31\x2f\x47\xff\x73\x72\x79\x75\x72\xfa\x32\x6e\xe0\xe5\x90\xf5\x64\xe1\xb5\x57\xf9\x52\x47\xef\x8e\x4e\x5e\x1f\xfd\x7a\xf2\xfa\xe4\xea\x9f\xe3\x7f\x9d\x9d\x8e\x2e\x87\xcc\x54\x8a\xae\xbf\xcf\x97\xbf\x7c\xfb\xeb\xe9\xe8\xea\x72\xc8\xfa\x4a\x21\xf9\x30\x4f\x79\x7a\xf6\x7c\x34\xbe\xfa\xe7\x79\xfc\x85\x81\x42\x9c\x3d\xcf\xd3\x67\x42\xae\x6b\x0a\x79\x41\xc2\xe3\xc7\x17\xa3\x97\x27\x67\xa7\xe9\x12\xa4\x33\x49\x9e\x7f\x9e\xd1\xc7\x23\x18\x7f\x30\x2b\xa1\xcb\x12\xc5\x37\xf9\x32\x29\x79\x47\x21\xcf\x53\x62\xfb\x29\x95\x06\x1d\xd2\x50\xf9\x7e\x73\x79\x29\x11\x7a\x77\x43\x1d\x39\x99\x00\x4d\x6e\x5a\xbf\xbc\x38\x7b\x7b\x7e\x39\xd4\x7b\x69\x15\x25\xaf\x8b\xa5\xdf\x61\x6c\x75\x33\x57\xe6\x9d\x32\xb6\xe9\xc3\x93\xd3\xcb\xab\xa3\xd3\xe3\x64\x84\xf5\x7e\xae\x48\xfe\x6d\xb1\xac\x32\xd2\x83\x5c\xb1\xe2\x58\xe3\x45\x61\xb4\x3b\x5a\x5a\xa4\x74\xbc\xe5\x1b\xea\x26\x7a\x99\x15\x65\x4a\xd1\x12\x02\xb9\x5b\x91\xca\x50\xbe\x03\x61\xe7\xaa\x26\xd8\x52\x83\x1c\xd6\x4e\x67\x53\x2d\xea\xb8\xca\x55\x76\x7c\x79\x35\x3a\x97\x93\x27\xde\xa2\xff\xe7\x9f\xe3\x93\xd3\x17\x67\xc3\x4e\x2c\x63\x9b\x69\xa8\x9e\xe3\xd7\x27\x19\x17\x62\xa1\x52\x1e\x10\xc5\xaf\x17\xa4\xea\x65\x64\xb1\xe0\x14\x9f\x12\x2d\xbe\x14\x6f\x77\xaf\x47\x60\x4a\x2c\x2e\xf9\x67\x0a\xdd\xe5\xd5\x11\xb1\xae\x9f\x50\xc9\x27\x0a\xcd\xf3\xd1\xe5\xf1\xc5\xc9\xf9\x55\x36\x9a\xc3\xce\x20\x21\x5f\x7f\x59\x6f\xf9\xcd\x56\xa8\x1a\x25\x63\x15\x4a\xec\x6a\xa5\x0c\x57\x93\x7f\x0b\x2b\x0a\x61\x92\x7c\xc3\x97\x25\x16\xc9\xd4\x88\xb8\x66\x8f\x94\x7a\x9f\xf7\x0c\x55\x4d\x45\x74\x49\xb5\x35\x44\xb3\xbd\x74\x97\xa2\xd1\xd0\x5a\xbc\x7d\xd1\x6c\x78\xcd\x66\x3b\xad\xa6\x11\x35\x0f\x4b\x0a\xa8\xef\xef\xef\x5b\xf4\xed\xe5\x6a\x32\x77\xc3\xd9\xfa\x97\xa5\x29\x54\xad\xa2\x1d\xdd\x2e\x45\x93\x2c\xa0\x22\xab\xc2\x9a\x0b\x1e\x8c\x6e\x70\x92\xaf\xa8\x25\x61\x42\xdb\x16\xb0\x91\x2a\xa5\x03\x11\x8a\xf5\x82\x85\x72\x29\xf3\x92\x52\x59\xb3\xca\xbe\x19\x0f\x50\x34\xcc\x7f\x79\x2a\xe2\x46\xff\x22\xb9\x1f\xdd\xdd\x35\x22\x69\x25\x8e\x1a\xac\x30\x56\xed\x30\x26\x6e\x45\xcd\x66\x2b\x4a\xad\xb9\x49\x51\x51\x66\xd5\x8d\x72\x56\xdd\xe8\xee\x4e\x34\xef\x5b\x42\xb5\xea\xce\x55\xab\xae\x48\xad\xba\x4a\x6d\x2d\x69\x57\xb2\x4f\xbc\xc3\x7a\xe0\xfb\x51\xfd\x9e\xbe\x7c\xdf\xd2\x3b\xdd\xee\x4e\xa7\x81\x7f\x95\xa8\xfd\x8b\xbc\xda\x8f\xa3\x05\xe9\xfd\x7a\x4f\x67\x5d\xd2\xfb\x4d\x63\xa0\x19\xb1\xde\x9f\x1e\x01\xc2\x7d\x6c\xf1\xb2\xe9\x38\x95\x83\xad\xbc\xfd\x3f\x0d\x6f\x35\x9f\xcb\xf7\x33\x1e\x9e\x73\xcb\x75\x5c\xeb\x98\x0e\xb4\x29\xd1\xa3\x84\xf9\xd1\x75\xf0\x4e\x04\xa1\xeb\x7b\x65\x15\x38\x82\x47\xab\x40\xbc\x98\xf3\x69\x58\xf6\x5e\x1e\x08\x37\xd4\xa0\x36\xb1\xcd\xc3\xb3\x49\x28\x82\x1b\x3e\x99\x8b\x86\x3a\x35\x72\x38\xc9\x07\x07\x96\xef\x85\xfe\x5c\xb4\xe7\xfe\xb4\x51\xbf\xfa\xed\x65\xed\x37\xd7\xba\xc6\x49\xb8\xf6\xf6\xa4\x36\xe7\x2b\xcf\x9a\x09\x9b\x4c\x7a\xc9\x07\x6a\xf1\x34\xa9\xfd\x3d\xfe\x5f\xad\xfe\x58\x34\xef\x9b\x65\x73\x5e\x44\xe7\x4a\x83\x2a\x67\x4e\xae\xd5\xc5\x99\x37\xdd\x52\x49\x2a\x02\x6b\x55\xa5\x55\x84\x22\x3a\x09\xcf\x03\xff\xdf\x72\x78\x2a\x1b\xb2\x36\x82\x65\xad\xd9\x5c\x55\xbe\x39\x6b\x15\xaa\x6d\xba\x4a\x85\xa1\xb2\x41\x99\xbc\x94\xb5\x64\x43\x05\xf9\x66\x64\xd5\xa8\xdf\x7f\xa1\x88\x5b\x65\x0b\x54\x99\x5c\x6b\x43\x28\xa2\x77\x39\x99\xac\xac\x26\x2f\xba\x65\x9d\xd9\x52\x51\xbe\x43\xf9\xea\xd2\x6a\xdc\xf0\x7c\xbe\x9a\xba\x9e\xec\xd9\x91\x15\xb9\x37\x1c\x11\xb6\xeb\x7b\x4e\xbe\x42\x37\x7c\x17\x53\x5c\x05\x2b\xd1\x48\xf6\x84\x5c\x5d\xb4\x54\xe6\xa4\x52\x7d\xbd\xf1\x0b\xf1\x04\x1d\x0e\xd7\xd8\x79\x77\x57\xf1\xa2\x8d\xba\xb6\xbc\x7e\x2f\x3e\x6e\xa7\x78\x1f\x7d\x7c\x16\xd3\x1c\x6e\x24\x51\xf8\x97\x72\xa1\x6c\x24\x95\xee\x3c\x1a\x0e\xc5\xc1\xc1\x7f\x5f\x9e\x9d\xb6\x97\x3c\x08\x73\xbb\x9d\x1b\xbe\xf1\x6d\x21\x05\xfe\x52\x31\x59\x6e\x1c\xd2\xaa\xb1\x6b\xcc\xdb\x6f\x46\xad\x79\xfb\xea\xbc\x1d\x6b\xc0\xcf\x8f\x5e\x9f\x9d\x8e\x12\xb3\x56\xf6\x51\x5b\x58\xbe\x2d\x7e\xe5\xa1\xe8\x19\xd5\xdb\xa5\x68\x79\xc3\xfa\x7f\x09\x2f\xa6\xb5\x0f\xeb\xe9\x4e\xd9\xc6\x72\x17\xfe\xee\x46\xb3\x86\xd7\x3c\x38\x88\xda\xc2\xb3\xe9\x67\xfd\xef\xf5\xe6\xc1\x41\x23\x1a\x46\x58\x41\xa3\xc0\xf5\xa6\x0d\xaf\x3d\x17\xde\x34\x9a\xb5\x22\xf9\x8f\x27\xf5\xbf\xd7\xe5\x3f\x9b\xcd\x16\x8f\xfc\x89\xaa\x80\xb8\xa1\xe4\xc6\x29\x5f\x88\x0b\xf1\x9f\x95\x1b\x94\x08\xe5\xde\xfc\x90\x4c\x18\x9f\x1e\xbd\x89\xf5\xef\x7f\xbc\x3d\xb9\x18\x3d\xff\xea\xab\x59\x7f\xeb\xd5\x6c\xe9\x26\x1e\x34\x5b\x56\x66\x66\x5b\xa5\xb6\x37\x7b\x18\xef\x29\xe3\xdf\x4e\x8e\x7f\x83\x9a\x3a\x3e\x7a\xfd\x7a\xfc\xdb\xe8\x9f\x97\xf5\xd6\x6c\xfb\xce\xab\xee\x2a\xb1\xdc\x29\x5b\xcb\x49\x24\x16\x6b\x3c\x84\xd2\x40\xa6\x56\x11\xcf\xe1\x98\xa8\x61\x37\xef\xee\xbe\xdc\xff\x12\xbc\x8f\x3e\x0e\xa3\x16\xac\xd2\x97\x91\x1f\xf0\xa9\x68\x87\x09\x49\x0b\xb2\x4c\xc3\xeb\x3a\xb7\x8d\xa0\xd9\x2c\xa7\x8c\x8a\x94\x5e\x7e\x59\x28\x6d\x56\xc6\x75\x65\xca\xe4\xaa\x4f\xda\x2a\x9a\xaa\xda\xb8\xf0\x6f\x44\x79\x3f\xa9\x97\xde\x7a\x2f\x49\xfb\xac\x79\xef\xa3\x8f\x2d\xb5\x7f\x5e\xa1\x3f\x59\xe5\xaa\xa4\x42\xcf\x2d\x91\x4c\x39\x7d\x94\x8f\xfd\xe2\xf8\x41\x03\x6d\xa8\xb9\x5e\x2d\x6a\x46\xf1\x66\x77\xf6\xc9\x3b\x0f\xfc\xa5\x08\xa2\x5b\xcc\xa3\xaa\x2f\x7a\xcd\x5f\xaa\x5e\xd9\x99\x00\xb7\x96\x0f\x38\x91\x94\xe9\x21\x91\x5f\xb5\x42\x13\x13\x31\xe1\x84\x17\xae\x02\xf1\x36\x14\xc1\x73\x1e\xf1\x13\x5b\x78\x91\xeb\xb8\x22\x88\x35\x6a\xd2\x9c\x45\x94\xbc\x1d\x79\x51\x70\xdb\xf0\x5a\x71\x1d\x52\xad\x8e\xbf\xf1\x3b\x2c\xe0\xf2\xa5\xb2\x4d\xc6\xef\x7e\xe5\xd6\xb5\xeb\x4d\xcf\x2a\x14\xfa\x96\x22\xb9\xf5\x7a\xcb\x1d\xd6\xb3\xd5\xe9\xe0\xa0\x11\x0c\xa3\xf7\x5e\xdb\x76\xc3\xe5\x9c\xdf\xbe\x70\xc5\xdc\xfe\xd8\x72\xf1\x0c\x15\xd1\x13\xb5\x29\x0d\xd1\xfa\x22\xc9\x0f\x03\xf9\x35\xf7\xbe\xd9\x7a\xa4\x15\x9a\xe5\xfb\x73\x04\xeb\x6c\xdb\x21\xd7\x6a\x8d\x9e\xd5\x6f\x45\x58\x3f\xac\x7b\x7e\x52\x3a\x2a\xf9\xc0\x1b\xbe\xdc\xca\xfa\x05\x5f\x5e\xf9\xcf\xa9\xde\x4b\x5a\x61\xa3\x84\xe9\xc5\xcf\x7a\xb2\x32\xef\xbe\xc0\xe0\xcb\x48\x2c\x65\x1d\x67\x81\x2d\xd6\xa5\x38\xc7\x63\x65\xc8\xd5\x51\x4b\xc6\x9a\xde\xc4\x55\xd2\xf3\x20\x1e\xe8\xa0\x1d\x46\x62\x19\xbe\x8f\x3e\x26\x23\x81\x0f\x0d\xbd\x0a\x11\x08\x4a\x5a\xf8\x9a\x4f\xc4\xbc\x44\xdd\xfa\x86\x6d\x9b\xe3\x13\x3b\xb7\x8a\xde\x25\xd7\x8c\xae\xef\x95\xb6\xae\x64\xaa\x14\xda\xe6\xb5\x6d\xa5\x8e\x61\xb4\xe3\xbc\x90\x9f\xdf\x32\x70\x3b\x7d\x5e\x1d\x93\xfd\x3e\x7f\xe5\x46\x73\xf1\xe0\x7e\xe3\x3a\x7e\xa7\x1e\x07\x22\x0a\x5c\x71\x53\xaa\x5d\x29\x07\xfa\xa9\x88\x72\x1f\x69\xd3\xd5\x5a\x53\x59\x11\x22\x1a\xef\xf4\x1f\xef\x05\xfe\xfb\x71\xed\x41\xdb\x89\xd7\x86\xf0\x59\xf9\xe3\xf7\x82\xfe\xf1\xf1\x30\xde\x5d\xd7\xda\x59\x3a\x79\x73\x4d\x4d\x28\x55\xbb\x43\xdc\x06\x14\x7a\x26\x19\x12\xcf\xe8\x2b\xff\x0d\x5f\x36\xe4\x8b\xe6\x61\xd1\xd8\x91\xd4\x13\xef\x08\xc2\x86\x1a\x5a\x35\x49\x5c\xa7\xf1\xc8\x6b\xca\x8f\x25\x87\x57\x11\x04\x7e\xd0\xa8\x47\xc1\xad\xeb\x4d\x6b\x91\x5f\x2b\xa9\x10\xbe\x2b\xf5\xc7\xe2\x71\xbd\x5d\x7f\x1c\x3d\xae\xd7\x26\xab\xa8\x86\xee\xbf\xe1\xcb\x65\x5c\x6e\xe5\xd9\xc2\x71\x3d\x61\xd7\x9b\x50\x37\x92\x5b\x5b\xe2\xff\xa1\x68\xc5\xbc\x3b\x8c\x5a\x28\x74\xe8\xb5\x3d\xbe\x10\xf7\xbf\xb8\x4e\xc3\x6b\xbb\xe1\x1b\xbe\x6c\xaa\x2b\xa6\xc2\xc4\x46\x40\xd6\x09\xb7\xc0\xb4\x20\x65\x9a\xfb\xcc\x6b\x4f\xd4\x2d\xe2\x99\x97\x92\x05\xea\xbf\x1b\x6e\xc2\xc2\x1b\xdf\xb5\x8b\xfd\xbf\x52\xfa\x0f\x41\xa4\xfe\xd5\xea\x8f\xa9\xb1\xb2\xd3\x9e\x5f\xf3\xf1\x95\x94\x4d\xa9\xc7\x8f\x5d\x6f\x1e\xca\x4f\xd0\x17\xb4\xb5\x31\x52\x64\x73\x83\xa6\x53\x39\x63\x14\x9d\x3d\x56\x55\x1e\x3a\x17\xa2\x9d\x65\xff\xe0\xa0\x21\xb5\xa2\x2d\x93\xa0\x62\x02\xab\x07\x3f\xaa\x48\x2e\x5a\x3c\xe2\x65\xad\x9f\xe5\x94\xab\xb8\xca\x6b\x71\x4b\x45\x72\xfa\x5d\xb9\xb2\xf5\x67\x74\xbf\x5c\x7f\x89\x5a\xa4\x54\x57\xa9\x30\x6a\xbf\xa9\xaa\xf8\x44\x44\x13\xaa\xbc\xef\xc5\x5d\x2c\x91\x6e\xaf\xed\xb8\xf3\x48\x04\x99\xe9\xc9\xcb\xbc\x23\x62\xc5\x31\xab\xb4\x51\x35\xd9\xee\x9b\xca\x8e\x9f\x2b\xf2\xa0\x25\x8a\x4e\xb1\x72\x3d\x3a\x38\xa8\xd7\x1f\x0d\x93\x5f\xeb\x5f\x81\x6e\x51\xd1\xe3\xdc\x0e\x51\x32\x45\xb2\xcf\x3e\x7a\xe4\x25\xdf\xf5\xd2\xed\x3a\xfd\xd8\x6a\x69\xf3\x28\xdd\x8f\x16\x22\x8c\xf8\x62\xdb\xea\x5b\xae\x24\xb4\xe7\x3c\x8c\xde\xa2\xba\xe1\x73\x1e\x89\xb6\xe7\x7f\x6a\x54\x0f\xb2\x72\x4c\xcd\xe4\xfa\x6c\x5e\x62\x35\x29\x65\x6b\xe1\xeb\xf1\xea\x1c\xc9\x75\xf0\x11\xa3\x9f\x4a\x83\x92\x37\xda\x2f\xc4\xb5\x78\x1f\x88\xdb\xd8\xc8\x11\x49\x86\x35\xb2\xd6\x3f\xf1\xe2\xa9\x10\xf3\xa5\xd1\x6c\x3e\xed\x09\xe3\xef\x1d\x4d\xb5\x43\xe5\x24\xbb\x4a\x30\x45\xc2\xf5\xfc\xf4\x8f\xe4\xf4\x1f\x66\x96\xa4\x75\x8d\xb4\x9a\x1b\x99\xa6\x2e\xda\x8e\x1f\x8c\xb8\x35\x53\x4c\xac\xad\x4c\xd2\xa3\xc7\x43\xef\x71\xfd\x10\x3b\x50\xab\x16\x1f\x9a\xa3\x76\x38\x77\x2d\xd1\xd0\x5a\x4f\x74\x55\x31\x49\x37\xcc\xea\xaf\xca\x0d\x34\xfd\xf4\xc1\x81\x68\x87\xcb\xb9\x1b\x35\xe2\xba\x9b\xb1\x4e\xdd\x28\x96\x8a\x8f\x8b\x92\xe6\xb0\x1e\x0b\x4a\x28\xa2\x86\xf7\x5e\xfb\xd8\xf2\xde\xb3\x8f\xcd\x7b\x5c\x05\x64\x47\xd9\xdd\xd6\xf9\x59\x7a\x28\xdc\xb0\xd4\xad\x09\xea\x9e\xcb\x5e\xe1\x52\x03\x34\x56\x20\x78\x94\x1e\xd8\xb2\x8f\x2a\x9d\x28\xa8\xca\x1b\x4f\x39\xa9\x70\x7c\xbc\xbb\x2b\xd4\x9f\xe9\xda\x38\xf0\x89\x42\xfd\xeb\x67\xc6\xfd\xa7\xed\x9a\x8a\x57\xa6\xe9\x47\x2d\x6a\xa4\xda\xc5\x32\x2e\x54\x8f\x56\x7e\x71\x0d\x33\x35\x6c\xbd\xba\x2d\x5c\x23\x79\xfa\x42\x53\x28\xad\xe7\x97\x8c\x8b\xca\x6c\x4a\x65\x62\x83\x18\x89\xc7\x75\x69\x0d\xa8\x97\x69\xe8\x95\x42\x33\xcb\x2c\x33\x05\xf1\x4b\x58\xda\x12\xcd\x92\x0b\xae\x37\x47\x97\xbf\x0d\xeb\xff\xaf\xfc\x5f\x9d\x0c\x0e\xce\xd0\x6b\x74\x7a\xe6\xa0\xd9\xba\x19\x7a\x8d\x6e\x57\x1b\x74\x9a\xad\xe9\xae\x56\x88\x68\xed\xca\xe8\x86\xcf\x5d\x1b\xbe\xca\x97\xe4\x47\x3e\x8c\x4a\xec\x13\xd6\xdc\xf7\x30\xca\x52\x0d\xdd\xc0\xa5\x07\x1b\xcc\x6c\x21\x96\xc7\xfe\x72\xcb\xbc\x4b\xd8\x73\x14\x04\xfc\xb6\xed\x86\xf8\x6f\x43\x34\x9f\x89\xb5\xf5\x24\x35\x9d\x26\x35\xc7\x9a\x5d\xf3\x50\xfa\x89\x7a\x96\xf0\x1d\x2c\xec\xcf\xd2\x15\x5e\x28\x2b\xf8\x61\xbc\xe5\x92\x0a\x5a\x1f\x0e\xa3\xdb\x65\x4c\x2e\x9e\x91\xea\x1b\xd3\x29\x96\xa4\x53\xbe\x10\x61\x43\x34\xdb\x81\xb0\x57\x96\x72\x7d\xe5\xb5\x82\xb4\x1d\xb2\x24\xa9\xef\x99\x0d\xaa\x15\xb4\x4a\xeb\xcc\xbc\x6a\x1b\xa2\x15\x34\x9b\x2d\xef\x7d\xf0\x71\xa8\x76\xe6\x7d\xf0\xb1\xd9\xf2\xee\x93\xe2\x34\x2f\x1a\x59\x65\xe7\x81\x1f\xf9\x71\xc3\xcf\x9c\x78\xd1\x69\x1e\x8a\x54\xc8\x72\x2c\x49\x37\x57\x2f\x14\x41\xf4\x42\x39\x6d\x84\x47\x4e\xb4\xcd\x4c\xf1\x04\x3b\x28\x74\x3d\xb2\x2e\xc3\x16\x24\xf5\xd5\xa4\x9e\xb6\xe3\x7a\xf6\x89\x67\x8b\x3f\xca\x46\x48\x40\xf1\x1f\x0e\x87\xd1\x7d\xb3\xf9\x5f\x5a\xc5\xc1\xa9\xaa\x79\x0d\x78\x0b\xaf\x3c\x3e\x99\xc3\x85\x37\xfe\x54\x7a\xa6\x88\xcf\x50\xae\x97\x9e\x1c\x6a\x61\x26\xc3\xf2\x7c\x51\x6f\xb6\x1e\xb1\x5f\xbc\xf5\x7d\x51\x5d\x77\xf3\x9d\x89\x37\x28\x4b\x34\x1e\x3f\x0e\x5a\x5a\x2b\x52\x95\xbe\xa9\x88\x60\x06\x17\xb9\x66\x6e\x5a\x53\xd6\xf8\x94\x57\x42\x53\xca\x47\xa2\x6d\x0b\x9e\x98\xd8\xf3\x9f\x84\xc5\x46\xd8\x2f\xf6\x50\x80\xd5\x35\xbc\xbc\xd1\x0d\xaf\x59\xdd\x9a\x9a\x20\x1b\xce\xfd\x3a\x4d\x56\xf9\xa2\xbd\x92\x6b\xbe\x5c\x5a\x76\x54\xa3\xe9\xcc\xda\xbc\x5f\x9f\x4e\xf9\xcd\x70\xb9\x0a\x67\x8d\x08\xd4\xb1\x54\xb7\xde\x7f\xcc\x71\x05\xbd\x01\x6b\x2a\xb4\x94\x1d\x78\x20\x76\xe3\xc1\xc6\x76\xbe\xa7\x26\xc6\x73\x17\xf4\x71\x53\xe5\x66\xb4\xde\xde\xca\xf5\x55\x35\x76\xe6\x65\xe6\x59\x54\x32\xd7\xca\xc4\x38\x4a\xa6\x99\xb8\x6f\x1e\x36\x2a\xcd\x12\x85\xa6\xc0\x24\x91\x4c\x27\xa8\x85\xf1\xf1\x5c\x9d\x47\x33\x1e\xc6\xc7\xf5\x5c\x23\xa4\x75\xa2\xb2\x83\xe1\x95\x7f\x21\x2a\xac\xde\x65\xcb\xfd\x83\x07\x29\x6a\x87\x33\x7f\x35\xb7\xe5\xd7\xb2\xd9\x01\x7b\x0b\x76\x84\xfc\x45\xbe\xbb\xe0\xc1\xed\x55\xe0\x4e\xa7\x22\xd8\xa9\xb1\x5f\x2f\x46\xcb\xdc\x47\xf3\x0d\x3a\xf1\xdc\xc8\xe5\xf3\x8d\xe6\x26\x5a\x88\x1f\x79\x6d\x37\x94\xc6\xf2\xf8\xb4\x88\x65\x19\x07\x2a\x30\x40\x56\xe4\x7e\x5e\xe3\x81\xd7\xa4\x2a\xdc\xe1\xfa\x8c\x2d\xb1\x51\xc9\xaf\xc2\xa6\x84\x93\xa2\xdb\x4c\x43\x19\xd3\xc3\xb4\x2d\x1c\xbe\x9a\x47\x28\xf0\x2c\xff\xf3\x50\x71\x31\x40\xcb\x8e\x56\x91\x7f\xc9\xcb\x4d\x8e\x65\x8b\xdf\xc1\x41\xfc\xdb\x3f\xf5\xa3\xa4\x24\x3d\x91\xc6\x55\x6f\x7e\x8b\xdf\x9e\xb8\x89\x55\x44\x3f\x10\x07\x07\x8d\x47\x42\xbd\x5b\x96\xea\xb3\x1b\xca\xab\xcb\x11\x36\x8f\x58\x21\x53\x88\x94\xb3\xc1\x16\x0e\x6e\x68\x78\x23\xd7\xf2\xbb\xbb\xe2\x60\xc7\x4f\xd2\xae\x48\x21\x8b\x9f\x05\x74\x05\x1b\xfe\xca\xad\x6b\xe1\x61\xbd\x8c\x1f\x67\x7d\x2a\x36\xae\x5c\xbe\x1f\xc6\x52\x59\xd7\x1a\x17\x1f\x15\x5b\xbf\xce\x77\x72\x71\xe1\x61\x28\x42\xc5\x79\xe3\x05\x09\xbf\xd2\xe8\x0a\x92\x8d\xed\xdd\x7b\x00\x73\xce\x1b\xa4\xe7\xfa\x01\x14\xc6\xcd\x8b\x4e\x2b\x3e\x85\xca\x11\xb0\x9f\xbd\x77\xda\xd7\x27\xe9\xcf\x8f\x87\xef\x3f\x66\x2a\xfa\x4d\x52\x6b\x18\x1f\x6e\xb3\x5f\x52\x15\xfa\xbb\x56\x78\xbc\xa6\x64\x04\x2d\x97\xbe\xcc\xc9\xb4\x93\xd7\xc5\xe1\xf7\xe7\x2e\x96\x73\x91\x36\xbf\x11\x34\x7f\xe1\xcf\x3c\xda\xfc\x78\xf3\x30\x59\xc6\x3f\xf1\xc0\x6b\xd4\xb1\x98\xd7\x26\x2b\x77\x6e\x63\xe9\x4e\x96\x6d\x69\x59\x3d\x2c\xaa\x49\x69\xd3\x6a\xf5\xc7\xc1\xe3\x7a\xad\xf1\xff\xd4\x1f\xbb\x8f\xeb\xcd\x58\x67\xca\x99\x9d\xeb\x8f\x0b\x77\xca\xf1\xd1\x39\xd6\x3e\x13\x16\xcb\x9a\xc4\xae\xbb\xd8\xa3\x47\x51\x7e\x66\x34\x22\x75\xf9\x8a\x32\xfe\xd3\x49\x97\xba\x79\xe2\xe1\x3b\xea\x47\xe2\x4a\xd1\xbd\x16\x59\x00\x6b\x16\xf7\x3c\x3f\xaa\x4d\x44\x2d\xa9\xa2\x76\x74\xfa\xbc\x36\x91\xd7\x88\xcd\xc3\x28\x6f\xc6\x3e\x38\x78\x14\x29\x86\xec\xdd\x3f\x97\xab\x25\xf9\x58\x98\xd9\xab\xf1\xa9\x19\x0f\x4f\xfd\xe7\xfe\xe2\x98\x82\x6b\x1f\xfc\xb1\x42\x3d\xe5\x9f\x7b\xd4\xa8\xfa\x20\x26\x74\xd0\x4c\xec\x06\x5f\xf9\x45\xaa\xad\xae\x1a\x8a\x2b\x6b\xdc\xa2\x81\xae\x29\xf9\xa8\x40\x4a\xee\x42\x51\x41\x94\x5b\x91\xc3\x5a\xfd\xb1\x17\xab\xed\x8a\x5d\x30\xbf\x10\x6c\xd8\xa7\x17\x6d\xbe\x5c\xaa\x5b\xdc\x66\x37\x96\xd2\x93\xf9\x6e\xae\xa7\x0d\xbf\xfd\xfa\xc5\xcb\xc6\x4d\xfb\xa2\x59\x74\x43\xf5\xb7\xba\xa1\x4a\xa7\xd3\xd6\x6d\x7c\xca\x67\x66\x5f\x6b\xb6\x16\xc3\x71\xa3\xe2\x48\xdd\xfc\xa5\xd8\x2d\x58\xdf\xc2\xd6\xa2\x6d\x67\xcf\x2e\xc4\xd4\x0d\xa3\x80\xc3\xed\xb3\xb1\xa3\x4f\xa9\xf0\x62\xf9\xda\xe4\x38\x1d\xd1\x66\x50\x3e\xdb\xcb\x0c\x8e\xcd\x2f\x8b\xf6\x42\x84\xa1\xf0\xa6\x22\x68\x4b\xdf\xe7\xc6\x97\xf8\xa8\x7a\x28\x5a\x4b\x7e\x3b\xf7\xb9\x7d\x18\xe5\xcc\xe9\x3b\xde\x44\x64\x26\xe6\x78\x0d\x41\xdf\xa3\x40\xf0\x05\xf9\xf3\xa9\x27\x84\x00\xcc\xd8\xe5\x12\xfe\x17\x95\x0f\xef\xc5\xc7\x67\xf9\x35\x57\xc6\xdf\xd7\x26\x81\x7f\x2d\x82\x9a\x3b\xf5\xfc\x78\x96\xd8\x2b\x0a\xfd\x8f\x97\x21\x62\x3b\x38\xec\x3b\x35\x71\x23\xbc\xa8\x56\x7f\xec\xb6\x5f\xbf\x17\x1f\x9b\x87\x8d\x42\xfd\xc3\x2f\x8e\x88\xac\x99\x08\x0e\xa3\x56\x18\xf1\xc8\xb5\x46\xf1\xe4\x38\xf4\x5a\x98\x24\xd4\x21\xd8\xb3\x56\xed\xa8\x95\xf5\x31\x79\x74\xdf\x52\xd9\x9b\x39\xd5\x8a\x56\x89\xb4\x06\x6d\x7c\x0c\x07\xb2\x78\xee\x4b\xee\x3f\x4b\xff\x75\xf8\x25\x1e\x07\x45\xdd\xd8\xe6\x26\xaf\x78\x08\xa8\x03\x92\x7c\xef\x59\x23\x50\xc7\x45\x75\x87\x6f\x05\x6d\xa5\x87\xca\xab\x78\xb2\x6b\xca\x99\x85\x18\xff\xbc\x44\xb2\x25\xfb\xed\x1a\x8f\x22\xb1\x58\x46\xf1\x4e\x97\xd6\x13\xff\x58\x79\xc9\xc0\x0b\x9b\x46\xe2\x10\xee\xc1\xad\x47\x4c\xbd\x42\x83\xba\x0a\xfb\x62\xdc\xa0\x57\xdc\xb3\xe7\x9b\xb4\x93\x9a\xca\x59\xb9\x98\x9d\xfa\x91\xeb\x48\xf0\x87\x61\x74\x77\x57\xaf\x67\x36\x4c\xbe\x5c\x0a\x84\x44\x3f\xf0\x13\xd1\xb3\x92\x8f\x64\x1e\x81\x51\xf3\xee\xae\x51\x42\x71\x70\x50\xf6\x74\x58\xf2\xec\x71\xbd\x56\x6f\xb6\x76\x25\x8e\x9a\x87\x65\xa4\x6a\x8f\xe3\x03\xe3\xe5\x66\xd1\x69\x05\xa9\x2a\x94\x13\x9e\x28\x15\x1e\xfe\xac\x11\xdc\xdd\x35\xa4\x74\x55\x8c\x12\x0c\xec\x5c\x95\xb1\x24\x46\xc3\x6a\x5f\x34\x1b\x42\xc5\x8b\x49\x31\x68\x72\x81\x1b\x5e\x5c\xbe\x5c\x12\x83\x82\x24\xca\x6d\x6b\xa4\x4c\xe9\xe8\xe3\xe3\x7a\xed\x13\xce\xc4\x51\x4d\x11\xb6\x14\x9d\xa3\xb0\x60\x4c\x84\xe3\x07\x02\x5a\x9a\xe3\x07\x8b\x53\xba\x03\x8f\x17\x03\x7b\x4d\x7a\xdd\xa8\x5d\xcf\x8b\x6a\xc2\xa5\xed\xd7\xdc\xc9\xf2\x72\x77\x57\x6c\x7d\xe9\x44\x4a\x1b\x30\x15\x91\x84\xd7\x88\xb7\xe1\xfc\xe2\x95\x5d\xd6\x87\x2b\x6b\x26\x5f\xce\x78\x58\x9b\x08\xe1\x29\x9d\x5f\x33\x07\xa4\x8b\xce\xd6\xfb\x4a\x75\x0d\xf1\xda\x72\x65\x6c\x44\x55\xd1\x02\xde\xda\xa2\x2f\x9a\x2d\x2f\x37\x9a\x78\x5a\xaf\x37\xef\x5b\xeb\xfb\x48\x32\x3f\x62\xbd\x1d\xff\xc0\x4a\xca\xa7\xe2\x59\xe1\x37\xbc\x51\x9a\xf1\x99\x4c\x3e\xb8\xbb\x5b\xd3\x90\x5b\xc1\xb0\xe1\xb5\x95\x25\xfc\x59\xee\x57\x3c\xc7\x0e\xeb\xf5\xe6\xe3\x06\x56\x87\xe6\x2f\x24\xdb\x75\x39\x14\x35\x52\xe6\x85\x67\xf9\x2b\x2f\xe5\xe2\x7a\x4f\x82\xf8\x69\xd9\x4e\xa7\xf8\xd9\xb6\x16\xa9\x8d\xe8\x6d\xe4\xce\xdd\x28\xd9\xd1\xa7\x8d\xf8\x6f\xac\xa2\xa8\x9b\x86\x0c\xc9\x39\x6f\xad\x19\x04\xf0\x66\xa9\x3c\x7f\xe1\x07\x0b\xe5\xdd\x76\xad\xa2\xca\xfb\xf1\x45\xe0\x2f\x36\xaa\x8c\xc9\xf2\x40\x1e\x2a\xbf\x94\xf4\x68\x93\x25\xb3\xa8\x84\x78\xb1\x12\xb2\x5e\x43\xde\x22\x01\x0f\x51\xb7\x9d\xb6\xaf\xa8\x29\xa3\x51\xf7\xcd\x75\x36\xb5\x4b\xaf\xca\x73\x81\x09\x65\x75\x6e\xeb\xf8\x16\x2f\x1f\xaf\xa8\xfc\x3f\xcb\x2e\xd4\xf1\x99\x78\x73\x50\xdf\xcb\x2d\xfb\x50\xb1\x1c\x29\x45\xe4\x13\x94\x6c\xb8\xad\x20\xa6\x5b\xf0\xf0\x5a\x21\x79\xc3\xc3\xeb\xdc\x7b\xf8\x18\xe5\x08\x96\xb9\xf7\x79\x07\x22\xe5\x5b\xea\xf3\xb4\x44\xab\x50\x40\x06\xd4\xa1\xc4\x89\xb7\x5c\xe5\x28\x13\xd7\x53\xc9\xbb\x22\xab\xcb\xfa\xbf\xc1\x7f\x4b\xf1\x67\x4a\x54\x1a\xd5\xc5\x89\x9c\x52\x76\x18\x91\x8c\xb1\xeb\x42\xa2\x72\x39\xcf\xc0\x0a\xda\x37\x7c\x49\x74\x15\xef\x1b\xee\xba\x4b\x6d\x70\xdf\xbc\x17\xf3\x50\x14\x4f\x5a\x6b\x5e\x57\xd2\x8c\xfb\xfc\xec\x4d\x82\x04\xd5\x4a\x16\xf7\x32\x17\xac\x3c\x7b\xb3\xd1\xd8\x4d\x2d\x8c\x97\x0d\x45\x08\xc9\x29\x23\xc8\x9c\x32\x48\xde\xbd\x67\x5e\x23\x48\x9c\xc9\xe4\x3f\x7e\xa9\xbc\x5d\x58\x73\xc4\x75\x13\x16\x48\xa7\x99\x4a\xdf\xe2\xca\x86\x17\x77\xa2\xb5\x66\x2b\x6e\x33\x8d\x2d\x03\x2c\x5a\xd2\x15\x1a\x2a\x44\xda\x0e\x18\x6b\x5e\x20\xd5\xfd\xb7\x5d\xf5\x82\x92\x55\x2f\x80\x6c\xbb\x72\x99\xfb\x15\x9f\xc6\x14\x0a\x9a\x4d\xb7\x9d\x36\x85\x9e\x25\xdf\xff\x05\xe2\xe3\x3a\x8d\xa0\xb8\xbe\x34\xf1\x30\xb5\x2e\x48\xed\x6d\x37\x2b\xb2\xac\x3b\x2b\xde\xe0\x05\x41\x45\xb4\x5f\x22\xa6\xc1\x4e\x62\x4a\x35\x41\xfb\x52\x24\x35\x17\xe6\x8a\xc5\xe0\x2b\xd9\x5d\x7e\x93\x51\xc5\x71\xe2\x4a\xc5\x4a\x11\x24\x1e\x9a\x09\x1f\x88\xf7\x3c\x5e\xd2\xe2\x03\x51\xbc\xe0\xa6\x7b\x50\xb6\xdc\xf2\x96\x47\x1b\x4f\x69\xfb\xb6\xdc\x62\x54\x8a\x46\xbe\x0d\x9b\x5b\x8c\x06\xde\x97\xc8\xf1\x86\x55\x20\xe6\x6e\x59\x93\xcb\x8c\x87\xb8\x3b\xff\x25\xb9\x97\x28\xed\xa6\x7a\x37\x92\xc8\xd3\x6d\x7b\xd6\xe6\xb6\xfd\xfc\xd6\xe3\x0b\xd7\xca\xe6\x6a\xbc\x6c\x16\x4c\xe6\x99\xf8\x6f\x36\x93\x17\xee\x15\xd6\x0c\x6c\x65\xad\xdb\xc1\x04\xae\xf2\xba\x8a\x5d\xa9\x75\x38\x5e\x1f\x83\x83\x03\x36\x1c\x0e\x83\x24\x8a\x8b\x0f\x83\xf7\xda\x47\xcc\x4e\x10\xcd\x77\xbd\xbf\x91\x6e\x27\xd2\x55\x27\x5e\xc6\xe8\x22\x67\x7e\x70\xd0\xe0\xc3\x79\xf3\x3e\xbd\xda\xe1\xf1\x0c\x57\xec\x87\x91\x3a\x5b\xb3\x2f\xfb\x43\x8f\x22\xbb\x89\x13\xcd\x5f\xfc\x67\x21\x39\x52\xf8\xab\x48\x55\x09\xfd\x76\x28\xe8\x16\xa8\xc1\x5b\x6e\xf3\x3e\xb3\x5f\xd3\xae\xf4\xb7\x9c\x00\x36\x0f\x0b\x33\xfd\xb0\x56\xff\xdb\xe3\xa4\xf9\xb0\x06\x52\x17\xe4\x3f\xf1\xf1\xc7\x7f\xab\xff\xad\x79\xbf\x21\xb2\x65\xcf\x5d\xea\x4c\x86\xdd\x67\xab\x7d\xd5\xd6\x93\xfb\x4a\x43\xd0\x04\x29\x44\x9a\xc8\xf9\xfb\x67\xed\x35\xb9\x30\x14\xe9\xe1\xbe\x84\x23\xd1\x61\x3d\xf9\x66\xbd\x7e\x9f\xdf\x81\x72\x8a\xda\x9f\xd5\xb2\x58\x75\xa9\xd8\x01\x73\x8c\xde\x72\xf3\x2d\x63\x42\xa5\x3b\x64\xb1\x8a\x0d\x6a\x5d\xda\x87\xb6\x94\xa5\xcc\xa7\x3a\x75\x01\xbe\xbb\x2b\xe8\x48\x6f\x8b\x3d\xe1\x37\x82\xee\x63\xd2\x85\x8e\xf6\x9a\x78\xb6\xdb\x35\x1e\x9f\x90\x17\xb5\x69\xe0\xaf\x96\x12\x26\xd4\xb5\x61\x06\x98\xf1\x1b\xa1\xdc\xc6\x90\xa0\xd6\xdb\x35\x37\xf5\xc7\x1b\x96\xdd\xb0\xb4\xbc\xec\x08\x77\xdf\x32\x7a\x7a\xa7\xb7\x13\xfe\x80\xbb\x0d\x1f\xd6\x6b\xf4\xcc\xae\x69\x10\xfe\x80\x04\x00\x5e\xc3\x1d\x7b\xc8\x51\xce\xf2\x3d\xaf\x6c\x14\x0b\x91\x5a\x84\xf0\x70\x77\xd7\x50\x7f\xaa\x3e\x93\xf1\x99\x55\x7d\x57\x80\x0a\x28\x38\x03\x56\x84\x03\x0a\xda\xc4\x63\xd5\xf2\x93\xeb\xd9\xfe\xa7\x66\x34\x0b\xfc\x4f\xb5\xf8\x0c\x3b\x92\xd1\x08\x8a\x3d\x86\x76\x85\x9a\xef\xcd\x6f\x53\x44\x46\x5e\xfb\x24\x26\x2a\x8c\x6b\xbb\x4e\x5c\x8c\x86\x54\x65\x7b\xee\xd3\x8b\x56\x2c\x5b\xcb\xc0\x8f\x7c\xcb\x9f\xb7\x82\x61\xd4\x9e\xf9\x61\x44\xb6\xe3\x4f\x74\xd8\xfe\x5d\x4c\x2e\x7d\xeb\x5a\x44\x8d\x46\x1d\x10\xa0\xf5\xe1\x70\xe8\x3d\xab\x7f\x0a\xc3\xfa\x61\xfd\x53\x58\x6f\x3e\xae\x1f\x3e\x7d\x5a\x8f\x45\xd4\xe2\x51\x23\x68\xd5\x9f\xc6\x4f\xe9\x8b\xf3\xa1\xdb\xbe\x4d\xd8\x53\xea\xa5\xf4\x29\x6c\xfb\x9e\x34\x47\x0c\x23\x18\x02\xda\x13\xd7\xb3\x1b\x51\xb3\x25\xdf\x42\xb0\x87\x91\xb4\x65\x14\x5e\x5a\x73\x3f\x14\x98\x21\x04\xa2\x9c\x7f\x8f\xb7\xf4\x28\xfe\xdd\xbc\xcf\xcc\x72\xed\x3f\xfe\x91\x34\xec\x4b\xfc\xd5\xc3\xbc\x39\xf4\x53\xd8\x0e\x04\xb7\x6f\x2f\x23\x1e\x89\xe1\x70\x98\xf2\xa1\x7d\x76\x3e\x3a\x3d\x38\x00\x45\x28\x3c\xbb\x51\x98\x02\xe4\xde\x3f\x57\xc3\xf9\x3d\xfb\x0d\x75\xb0\x32\x90\x7f\xf3\xd7\x9e\x25\x34\x65\xdf\xfb\xe2\x2f\x05\xd9\xe9\x0f\xc5\x7d\x33\xdb\x9c\xa0\x89\x7e\x0a\x6b\x52\xba\xe3\x89\x10\xcf\xea\x5b\x11\xd5\xfc\xa5\xf0\xea\x39\xbc\x81\x33\xef\x38\xe6\xd4\x36\x14\x96\x21\x7c\x1f\x93\xd6\x24\xcc\x17\x5f\x1b\x1b\x3d\x7f\x68\x6c\xf4\x7d\xcb\x30\x8c\xde\x6e\xeb\xcb\xa2\x64\x62\xaf\xf2\xeb\x4b\xa7\xdf\xed\x77\x68\x7d\x21\x77\xd5\x78\x79\x19\xb0\xbe\xc1\x08\xde\xa4\xa3\xf5\x3b\x7a\xb3\x15\x66\x8b\x8e\x35\x7c\xef\xb6\xc5\xe7\x96\xdf\xfe\xad\x77\xd4\xe2\xed\x55\xb7\xc5\xdb\x6f\xff\xa7\x35\x6f\xff\xf7\x8b\x8f\xad\x15\x96\xa4\xea\x0b\xb0\xfd\xd9\xb5\xf0\xed\x61\xd8\xf6\x8f\x7e\x95\x37\x4f\x41\xcc\x06\xf9\xce\xf5\xfe\x3d\x0c\xdb\xd6\x7f\x5f\x36\xbe\x24\x78\x1d\xe1\xe1\xfb\x8f\x2d\x77\xb1\xf4\x83\x28\x3c\x7c\xff\xfe\x63\x32\x49\xad\x66\xab\xba\xd9\x09\x67\xbb\xba\xd6\xd9\x89\xb3\x76\xf9\xd2\xdd\x5a\x5e\x96\x22\x49\xb6\xe6\x65\x08\x93\x56\x7e\x28\x24\xd7\x73\x00\xef\x5e\xc3\xd0\x74\xad\x8b\xb1\x00\x48\xcb\xd9\xfc\xbc\x51\x3f\x3a\x3f\x39\x9e\xbb\xc2\x8b\xc6\x6f\x2f\x47\xe3\xe7\x67\x6f\x8e\x4e\x4e\xeb\x18\xa4\x2a\x9a\x57\x57\x57\xe7\xe3\x33\x00\x35\x5d\xd6\xe3\x31\xac\xde\x38\xa4\xfe\x5f\xb8\x5e\x8c\xd7\xc1\x24\x2e\xd1\xf6\x17\xdc\xf5\x86\x75\x65\x09\x2c\x2c\xb2\x58\x53\xe1\xf0\x57\x45\x10\x8f\xcf\xb3\xfa\x61\xfd\x71\xd9\x8b\xc3\xba\x34\x44\x3f\x1a\x7a\x49\xcc\x91\xfc\xa8\x27\xdb\xe3\xcb\xe0\xd0\xb3\x64\xdb\x09\xdd\xa9\xd7\xc8\xff\xfa\x32\x13\x1c\x12\x41\x66\xd2\xdf\xdf\xc4\xaa\x79\xd0\x96\x4f\x9f\xa5\xff\x3a\xfc\x72\xdf\x6c\x2d\x79\xc0\x17\x09\xe9\xeb\x11\x91\xd2\xc3\x67\xc9\x3f\x70\xc7\xd6\xc2\x9b\x40\xc4\x0d\x3d\x97\x20\xa4\xcf\xbe\xe4\x7f\x1f\x16\x09\xee\xf1\x0d\x94\xfc\xe4\x46\xb3\xe3\x40\x40\xa3\xe0\xf3\xf0\xd9\x97\xc2\x83\xc3\x35\x12\x14\x2e\xd9\xc4\xa7\x22\x7a\x7b\x52\x7d\xd7\xba\x89\x35\x05\x46\xdd\xe7\x98\xda\x8c\x47\xfd\x4b\x20\xc2\xa5\xef\x85\xe2\x2a\x9e\x74\xf5\xc9\xdc\x9f\xd4\xef\xf3\x41\x05\xf1\xd2\x7c\x21\xfe\xb3\x12\x61\xd4\xa8\xbf\x1c\x5d\xd5\x5b\xf5\xa7\xf5\x56\x94\xd3\x18\xdf\x9e\xbc\x70\xe7\x1b\x43\xe6\xeb\x99\x14\xc5\x1a\xd7\x5c\x90\xa3\x68\xf0\x35\xed\x8f\x1e\xd8\x7e\x4f\x3d\x7d\x4e\xb7\x03\xdb\x6c\x67\x74\x09\x6b\xb7\xf2\x90\x2f\xdd\xa7\xd2\x3f\x2a\x2c\xf2\x13\x70\xcc\x29\xc0\xf7\xf7\x6c\x91\x48\x3e\xaa\x34\xe8\x46\x04\xae\x73\x7b\x64\xe1\xea\x63\xd3\x20\xef\x39\x7a\xd5\x0d\x3a\x3f\xbb\x4c\x5b\x84\xd4\x6c\x5e\x11\x45\x43\xc4\x2a\x4e\x32\x75\x9a\xc5\xb6\xbe\xb6\xf9\xf2\xb8\x42\xf9\xfd\xb3\xdb\x3b\xb7\xf9\xf2\x69\xaa\x79\x3f\xa0\xe1\xbf\xba\xde\x86\x58\xba\x6f\x36\xe8\x6b\x6d\x9e\xe0\xbb\x6b\xe3\x1e\x37\x09\xf1\x3d\x82\x07\x56\x29\x28\xde\x9f\xdd\xb0\xf8\x08\x1b\x3e\x0d\xe5\xf7\x4b\x1b\xf8\x32\x3e\xe5\xfd\xb8\x16\xe2\x90\xb9\xa5\x89\xd0\x43\x8f\x53\x9d\xf5\x47\x34\xd3\x76\xc3\x54\x30\xf3\x0b\xce\xd1\x8d\x7b\x3c\xf7\x57\xf6\x77\x5e\xff\xf8\x8d\xfb\xd4\x92\xdf\x5d\x6b\x90\x3c\xe7\x8f\xbc\xa9\xeb\x09\x0c\xf0\x0f\x68\x9d\x3c\x8e\x0a\x34\x62\x2a\x1b\xb1\xd6\xd4\x77\xee\xf2\x54\x44\x9f\xfc\xe0\xfa\x07\x34\xf1\xc6\x5d\x7a\xe9\xc7\xa3\x52\x24\xbc\xef\xdb\xa8\x54\x49\x2f\x36\x47\x62\xb6\x5d\xcd\x56\x8b\xc9\x32\x70\xff\x8c\xcd\xa4\x1e\xeb\xa4\x75\x17\x01\xae\x0d\x4f\x6a\x74\xc3\xe4\x1f\x08\x60\x25\x92\x96\x04\x8e\x11\xd0\x62\x9b\xa9\x85\x63\x5b\x9f\x12\x98\xfd\xa7\x91\xd2\x0b\x2f\x8f\x71\x77\x09\x8a\x91\x67\x23\x05\xca\x77\xdf\x81\xd6\xda\xba\xc7\x36\x34\x4d\x9b\xff\x9c\x47\xdc\x12\x5e\x84\x71\xfc\x21\xe2\x93\xb2\xda\x56\x9b\x12\x55\x35\x16\x96\xcd\x8d\xa0\x2c\x0f\x14\x29\xdb\xda\x22\x50\xb6\xa5\x88\x93\x6d\x3d\x40\x98\x6c\xa5\xfd\x5e\x59\x07\x5f\xf8\x73\xbb\x74\x24\xfe\x0a\xbd\x73\x92\xc6\x97\x76\xed\xd8\x5f\x2c\x57\x91\xb8\x48\xf2\x28\xfd\x35\xfb\x68\x51\x2f\x2a\xfa\x98\x74\xee\xdc\xf7\xcb\xd1\x9c\x7e\xfe\x0e\x26\x79\xae\x96\xd4\x85\xd2\x6e\x56\x6f\x82\x7f\x85\x1e\x66\xbb\x68\x79\xe7\x7c\x1b\xc7\xcc\x1f\xbe\x1c\x7a\xbe\x2d\x22\x6a\x48\xe9\x62\x78\x76\x79\xb2\xe0\xd3\xbf\xea\x44\xf2\x43\x57\xb6\x5e\x19\x05\xf1\xc7\xd2\x0f\xa2\xab\xdf\x5e\x1e\x23\xbd\xdb\x0b\x3f\x78\x97\x6c\x6d\x3f\x7a\x73\x7d\x4a\x19\xe7\x9e\x52\x13\x4b\xb7\x5a\x62\x90\xb2\xcb\xf2\xe5\x72\x7e\xfb\x73\xf6\x26\xba\x9e\x52\x87\x76\xeb\x09\xd9\x60\x7f\xce\xae\xc8\x81\xa1\x26\xee\xd6\x1d\xba\x37\x49\x17\xed\xa9\xeb\x7b\x7c\x2e\xc1\x58\x7f\x86\x1e\xc9\x0b\xb6\x5d\xba\x12\x8a\xe8\xe8\xf7\xcb\x9f\x40\x09\xe5\x9f\xc2\xd2\x16\x73\x32\x28\x9d\x17\x1b\x1e\x2f\x64\xe7\xc7\x3f\x6c\x95\xe5\x9f\xc2\xa7\x37\x4b\x6b\xed\x94\xf7\xfb\xe5\x86\x0d\xe0\xab\x17\x56\xfe\x79\xcb\xc2\xca\x3f\x2b\x0b\x2b\xff\xbc\xc7\xc2\x1a\x77\x48\xd9\x32\xbc\x62\xb7\x48\xcc\x7f\x28\xbf\x83\xa4\x09\x6b\x3c\xff\x13\xf7\x32\xfa\xe8\x16\xb6\x4b\xa2\x8c\xf5\xf4\x60\x4f\xf6\x97\xee\x69\xd4\xc1\xec\x06\xe0\x3c\xf0\x1d\xb7\x14\x56\xf2\xfb\x0d\xc4\x32\x6d\xc3\xda\x48\x1c\xdd\x70\x77\xce\x27\xee\xdc\x8d\x6e\xff\xe5\x7b\x3f\xb6\x9d\x25\x8d\x59\x6b\xf0\xe5\x6a\xe2\x89\xe8\xcf\x90\x9c\x9b\xa5\x75\x62\x6f\x11\x1c\xa2\xc9\xe4\x06\xbf\xf7\x14\x9b\x30\xe9\xc1\x46\x4d\xe8\xe8\xf7\xcb\x1f\xbb\xba\x7f\x13\x0d\xe8\xc7\xf7\x62\x4f\xcd\x87\xf6\xe2\x74\xfd\xfc\x19\xd4\x04\x8c\xc5\x1e\x2a\xc2\xba\xf2\xf6\xe3\x47\xe1\x01\x4a\x5b\x3c\xdd\x3f\xaf\x36\x19\xdc\xbe\xd3\xc2\xf4\x19\x99\x1d\xa2\xbc\x0e\xb6\xb9\x65\xdf\x8f\xb7\xd4\xb8\xfd\xf4\x30\x34\x3e\xb1\x5d\x54\x99\xe0\xbf\x7a\x39\x4d\xbc\x02\xb6\xac\xa8\x29\x59\xb6\xa8\x26\x8f\xf6\x59\x57\x91\x9d\x34\x31\x66\x24\x16\x7d\x6f\x6d\x5e\xaf\xf5\xfc\x47\x8f\xdd\x7a\x9b\xf7\x98\x1a\xef\xb6\xed\x84\xbb\x7c\x52\xbd\xc2\x0f\x54\xd6\x9c\x02\xa2\xe0\xe9\x0d\x3e\xb2\xed\x52\x7f\x0f\x41\x48\x3c\x32\x86\xc1\x37\x10\x84\xdc\xad\xbf\x32\xc8\xef\xdc\x20\x5a\xf1\xb9\x34\x5d\xfd\xec\x3c\xaa\x94\x19\xaf\x15\xec\x21\x0f\xd5\x6a\xf5\x77\x5c\x2a\x15\xb5\x38\x2a\x5b\x76\x7e\xec\xb1\x44\x0e\x6e\xf9\xc1\x24\x7e\x79\x22\x81\x0b\xb7\x1e\x09\x37\x56\xad\x0a\x4c\xea\xbd\x5a\x7f\xea\xe6\x2a\xff\xa6\xf2\xb2\x3e\x1b\x4a\x74\xca\xcf\x95\x49\x8a\xbe\xe3\x8a\xf7\x4d\xf4\xca\x9f\xa2\x27\x0f\xd3\x2d\xb3\x69\xf0\x53\x68\x97\x34\x26\x5f\xa7\x5f\xfe\x14\xa3\xf1\x10\xc3\xe0\x4c\x58\xd7\x27\xce\x73\xa4\x2e\x7f\xce\xc5\xc2\xf7\xe4\x19\xb4\xcc\xef\xed\xfb\x2c\x51\x32\x8f\xba\x8d\xd6\xe4\x96\xa8\xf5\x09\x4d\x0d\xff\x81\x9c\x97\x8d\xfd\x16\x53\xfa\x67\xe9\xcb\x83\x26\x35\x35\xfe\xe7\x99\xd5\xc9\xb8\x7c\xd5\xb4\xfe\x59\x46\xe4\x01\x13\x5b\xa9\xbc\x3a\x4c\x32\xfc\xe4\x46\xd6\x2c\x9e\xd7\x16\x0f\x45\xfd\xf9\xe8\xf5\xe8\x6a\x54\x3f\x54\x1b\x39\x8b\xa2\x65\x92\xca\xb5\x9e\xee\xe9\x8a\x53\x73\xea\x24\x1d\x35\x5b\x5e\xf3\x17\x54\x14\x4f\xeb\xf5\x5a\xa6\xb1\x92\xbb\x6b\x15\xaf\x46\x47\xcf\x4b\xea\x98\x09\x6e\xef\x5e\x49\xe2\x33\xbe\x5e\x8f\x1c\x93\xdd\xab\x3a\x3f\xba\x3a\x7e\x55\x52\xd1\x92\xc7\x1c\xdc\x5a\x4d\x90\x55\x14\x0f\x74\x49\x3d\x7e\xb8\x03\x77\x94\x6a\xde\x96\xd6\xb2\xda\xb5\x12\x89\x6b\x73\x58\x8e\x90\xf6\xd6\x0b\x57\xcb\x58\xd8\x84\x0d\x48\x36\x11\x46\x87\xb5\x4c\xa3\x6b\x36\x5b\x0d\xad\x35\x6f\x8f\x9b\x3b\x90\xde\xef\x1d\x6d\xd2\xe0\xc0\x34\x73\xdb\xe2\xb4\xd9\xa2\x7f\xfb\xad\x7e\xf2\xcf\xb0\xd5\x6f\x16\x03\x52\xf8\xd6\x80\x94\x24\x48\x42\xd7\xd9\x6e\x41\x12\xa5\x41\x0f\x41\x7b\x7e\x7e\xdf\x3a\x2e\x8b\x9f\xf8\x94\xc6\x43\x0c\xbd\x06\x62\x31\x9a\x14\x18\xd1\xe9\x18\x7a\xf3\x97\x34\x46\x81\xaf\xa5\x90\x14\x07\x07\x75\x6f\xb5\x98\x88\x40\xc1\x00\x47\x1a\x88\x37\xbe\xed\x3a\xae\xb0\x0f\x0e\x64\x32\x04\x95\xc0\xe3\x0b\x71\x70\x50\xc6\xc7\x0d\xb5\x86\xee\x67\x51\x5a\x5b\xfc\x8f\x83\x83\x7a\x52\x5d\xae\xcc\xdc\xb5\xc4\x7d\x43\x34\xef\xd3\x4e\xcc\x55\xf4\x51\xca\xbe\x29\xee\xee\x12\x24\xf3\x47\x69\xd9\xbb\x3b\xca\x9d\xf3\x68\x38\x14\x6d\xcb\xb5\x83\xec\xdb\x19\x11\x5e\xe4\x28\xa9\x6b\x25\x94\xf0\xae\xcf\x9a\xe1\x97\xf6\x7a\x0d\x4f\xfd\xe0\xa0\x41\x95\x0f\x93\xca\xef\xee\x2a\x18\xda\xcc\xd3\xfa\xe1\x89\xe7\xf8\x77\x77\x4e\x23\xf9\x77\xb3\x79\x70\xf0\x48\xcb\x9a\x10\x3e\x84\x13\x50\xd7\xe0\x98\x5a\xda\xcb\xec\x75\x9e\x7f\x88\x88\x39\x29\x2f\x93\xbc\x2c\x29\x71\x29\xac\x40\x44\x1b\x4a\x11\x41\xae\xa4\xc4\x3d\xc2\x2a\x59\xf1\xc5\x3c\x49\xae\x74\x24\x3c\x5e\xd9\xd2\xe4\xa5\x32\x8e\xd6\x8f\x1f\xc7\xd5\x43\x9a\xb0\xe4\xd1\xac\xb4\x09\xf1\x8b\xc2\x07\x66\xbb\x7e\xe0\x7d\xdd\x77\x6d\xab\xde\xaa\xcf\x6d\xbe\xac\xb7\xea\x9e\xef\x89\xfa\xc7\xb6\xeb\x59\xf3\x95\x2d\xc2\x86\x68\xbb\xf6\x62\x8c\xfc\xec\xf9\xd6\xc4\xf4\xe3\x89\xeb\xd9\x63\xdb\x2b\x6d\x95\x4a\x50\x59\x76\xc9\xc3\xf0\x93\x1f\xd8\x5b\x6a\x48\xc8\xca\xea\x81\xc9\x68\x4c\x5e\xe3\xe3\x09\x0f\xc5\xc6\x06\x95\x51\x6f\xad\x95\x90\xae\x77\xac\x94\x88\xb7\xd6\x49\x3f\x78\x14\xed\x5a\x6f\x56\x60\x6b\xdd\xb1\x4c\xee\x53\x75\x4a\xbf\xb5\xe6\x55\x28\x82\x7d\x6a\x4e\xe9\xcb\x6a\x0e\x7c\x3f\x1a\x5b\xbc\xba\x2a\x49\x50\x56\x76\x15\xcc\xab\xcb\xad\x82\x79\x69\x99\xb8\x31\xbb\x0a\x4a\x09\xf1\xb6\x3a\xc5\x82\xbb\xf3\x2d\xdc\x29\xa7\xdf\x56\xf3\x36\x01\x5c\xa7\xdd\x56\xa3\x6b\xef\xd1\x50\x49\xbc\xad\xce\x1d\xc4\xae\x94\x7c\x5b\xbd\xf1\xbf\x2b\xd7\xdf\x4a\xea\xe2\xa2\xec\xda\xd6\xd8\x9a\x73\x77\x31\x96\x18\xbc\x61\x69\x7d\x25\x74\xe5\x35\x21\x60\xd4\x2d\x5f\xb9\xf2\x24\x1b\xca\x87\x72\x33\xdc\x52\x07\x91\x95\xd5\x93\x9c\xde\xc6\x95\x0c\x5a\x27\xdb\x58\x4f\xd5\xc4\x5a\xa3\x2a\xab\x25\xb4\xfc\xe5\x86\x56\xe0\x75\x69\xb9\x6b\x77\x39\xa6\x28\x9f\xb1\x25\x82\x98\x21\x09\xb8\xf5\x5a\x1d\x05\xd2\xc2\xc6\xb7\x7c\x90\xae\xe8\xdb\x8a\x02\xab\x6a\x2c\xbe\x9d\xa7\xb4\x45\x68\x95\xea\x19\xf1\x0b\x45\xc7\x70\x1e\xa4\xa8\x05\xd6\xac\x5c\x45\x0b\xac\xd9\xee\x2a\x6b\x8e\xf2\x86\xb2\xf5\x97\x12\xcb\x77\x4a\xb3\xa7\x0f\xd1\x4b\x2c\x32\xbf\x3c\x3f\xbd\x3c\xad\x92\xc1\x3c\x49\xb3\xb4\xfc\xa9\x6f\x8b\xe3\x93\xe7\x17\x9b\x2a\x48\x68\xca\x6b\x38\xf7\xed\x6d\x15\x48\x92\xf2\xf2\x32\x56\x6a\x5b\x1d\x0a\x59\xb1\x1e\xcf\xbd\xba\xad\x98\x00\xf2\x5d\xa1\x44\x7c\x8e\x3e\x0f\xfc\x3f\x6e\xc9\x0a\xb4\x22\xa8\x86\xbb\xbb\x12\xd8\xa6\x9d\xc5\x48\x10\x60\xf8\xc1\x41\x3a\x87\x94\x31\x97\x2f\x73\x05\x5e\x5d\x5d\x9d\xa3\x11\xe7\x52\xcd\x2a\x95\x96\x35\xaa\xf2\x3a\xde\x5e\xbc\xde\x5c\xfc\xed\xc5\xeb\x8a\x92\x72\xe1\xde\x52\x3c\xdd\x0c\x0a\x75\x5c\xee\xd6\x85\xcb\xcd\x7d\xb8\xdc\xda\x89\xcb\xca\x5e\x5c\xee\xd6\x8d\xcb\xea\x7e\x78\x3e\xde\x95\x4f\x6d\x7a\xd7\xbc\x6f\x54\x89\x4d\xb3\x20\x5c\xd2\x15\xbf\x72\x56\x2a\xef\x0b\xab\xe8\x62\xd7\x75\xa0\x6c\x99\x76\xc3\x2b\xb1\x58\xce\x79\x54\x58\x27\xae\xfb\xe1\x3b\x5a\x71\x4a\x5b\x93\xbd\x2e\x74\x63\xe1\x57\xec\xb2\xf1\x8b\x62\x97\xbf\xc5\x31\xed\x86\x07\xb5\xe3\xd6\x51\x06\x2e\x71\x99\x41\x4e\x5c\x0f\x1b\x8d\xe3\x9c\x3d\x09\x29\xe9\x13\x04\x9d\x49\xc3\x53\xac\x2f\x1e\x20\xb3\x52\xc0\x33\xc9\x50\x09\x17\xe1\x35\x5b\x0d\x3e\x8c\xda\x16\x9f\xcf\x25\x80\x04\x88\x9b\x18\x5d\x02\xa4\x18\x8a\x16\xcf\xd0\x0c\xbc\xad\x68\x06\x92\xd4\x6e\xbc\x6b\x78\x84\xdc\x83\x93\x5b\x2b\x29\x11\x7f\xa6\xa9\x7e\xb1\x99\x22\x49\xbb\xed\x49\xb3\x2c\x97\x0f\x6f\x88\xe6\x1a\x8a\x54\xbc\x92\xbd\x5c\xf1\xc0\x06\x80\x72\x02\x1f\x50\xfb\xdb\x0b\x77\x2e\xfe\x56\xb3\xf8\x6a\x3a\x8b\x6a\xae\x17\x97\x72\xc3\x48\x78\xd6\x6d\xbb\x4e\x98\x26\xbb\x02\x1e\x6c\xee\x09\x95\x5b\xeb\x4d\x2b\xfa\xa1\xfd\xd9\x06\x81\xb0\xa9\x4f\xf9\xb2\x0f\x18\xa7\x8d\xa6\xb9\x92\x99\x2b\x6f\x0f\xd0\x4a\xa4\x73\x12\x37\x22\xb8\xfd\xae\x35\xaf\x4f\xd3\x7b\x9a\x80\xc8\x61\x95\xfc\x6b\xf7\xc1\x92\x38\x10\xbb\x0f\xd8\x36\x84\x88\x4d\x03\x96\x2f\xbb\xff\x80\xad\x77\x7e\xe7\x8e\x52\xc9\x1d\xbb\xb9\x23\x96\x43\x65\x57\x4b\xca\x3f\x68\xde\x2d\xf7\x19\xca\xf8\x73\x57\x22\x8c\x2e\x44\xb8\x9a\x47\x7b\xf7\xb4\x0a\xfc\x61\x87\x4e\x52\xd1\x07\xcc\xbf\xef\xd9\xbf\xcd\x48\x12\x3b\xf4\x52\xad\xe0\x27\xef\xeb\x16\x50\x8a\x1d\x3a\x9b\xab\xe1\xa7\xec\xed\x36\xec\x88\x4d\xeb\x90\x52\xf0\x9b\xec\x1a\xbb\x9f\x33\x12\x47\xab\x52\x6d\x35\x79\xf9\xc0\x63\xeb\x6a\xe5\x96\xab\xf0\xf1\x8b\xe6\x5e\xdb\x42\xc2\xa0\xbd\xc6\x62\x47\xd8\x8c\x2d\x03\x53\x5a\xcb\xff\x8e\x52\xc5\x28\xad\x73\x6b\xaf\x21\xdb\x02\x1f\xb2\x65\xa8\x72\xa5\xbf\x83\xfa\x95\x37\x3f\xe0\xf2\xad\xd4\xe2\xe0\xaf\x8a\x47\x1c\x72\xcf\x10\xb6\x8c\xcc\xb9\xbb\x2b\xe4\x8d\x2e\x12\x34\x0f\x0e\xd6\x9e\xed\xa3\xec\xed\x2e\x6a\x0e\x5f\xb8\xf3\xf2\xc3\x2b\xbd\x2a\x5e\xfa\x79\x15\x17\x85\xf4\xaa\x49\x7a\xe0\x57\x9c\xf0\x62\x31\x2c\xa5\x85\x7c\xee\xad\x60\xe6\xc4\x64\x77\xd9\xdc\x84\x1f\xb3\x49\x2a\xb3\x72\xdf\x79\xc9\x48\xac\xbc\xa5\x63\x93\xbc\xcc\x5f\xc1\x5e\x07\xef\x36\x18\x1a\xb3\xd7\xfb\x2d\x0a\x09\x07\xe2\xb3\xf9\xee\xfc\xde\x11\x20\x67\x13\xeb\x4b\xaa\x78\x90\xd2\xfb\x35\xa3\xe0\x7a\xa1\xb0\x56\x81\x28\xb7\xe3\x25\x6f\xf3\xc3\x90\xb6\xb7\x7c\x18\xd2\xd7\xfb\x0d\x83\x8c\xe4\xce\xb8\xb1\xe3\x58\xec\x8a\xe2\x53\x39\x12\x65\x15\x7c\xf7\x71\x98\xf1\xf0\x9c\x5b\xae\xe3\x96\x1b\xfe\xb3\xd7\xfb\xdb\xdd\xf7\x1a\x04\x12\xc9\x3d\xa7\xc2\x4e\x28\x44\x1b\x67\x42\x49\x0d\xdf\x79\x39\x5a\xf8\x15\x5a\x06\x19\x06\x77\xf7\xe4\x79\x80\xcc\x67\xfd\x7e\x10\xd3\x37\xa1\x29\xed\xc8\xf5\xa4\x8a\xef\x2e\xf7\x3f\x9a\xed\xe8\xf8\xde\x5c\xdf\x08\xf1\xb4\x03\xcb\xd3\xf2\xff\x57\xf1\x9b\x7a\xbd\x37\xb3\x77\x03\x9d\xda\x81\xeb\xeb\x15\x7d\x23\xf6\xef\xae\x84\xff\x59\xb7\x0c\x4b\x1e\x08\x2f\x7a\x53\x55\x7b\xf6\x7a\xad\xdc\x66\x6f\x2f\x95\x36\x89\x91\xa3\xcb\xc7\xf7\xf5\x0c\xea\xad\xde\xaa\x5b\x89\x77\x3c\x20\xfb\xa6\x14\x85\x59\x27\x34\xb1\x7a\xab\x0e\x59\xf0\xe7\xf5\x56\xfd\x66\x51\x6f\xd5\x53\x0c\x35\x49\x5f\x6f\xd5\xe5\x35\x51\xde\x2b\x4c\xfd\x64\x73\x7f\x55\x5a\x8e\xfb\x1b\xee\xf1\xa9\x58\x08\x2f\x22\xa3\xf1\xde\x12\xb8\x03\x24\xd8\x0e\xe2\x57\xa8\xe5\xff\xaa\xa9\xaf\xf6\x7d\x6f\xf6\x6f\x86\x2a\xdb\x81\xf3\x1b\xce\xdc\x7f\x36\xd3\x65\x52\x99\xd3\x2a\x8e\x2a\xef\x7f\x9a\xc1\xda\xfb\xec\xb9\x0b\xea\xda\x2e\xc3\x94\x95\xff\xce\xca\x9f\xb5\x5c\x95\x7b\xe6\x2c\x57\xc5\xd1\xbc\x2e\x25\x8c\x5f\x3c\xd0\xbc\x15\xf0\x45\x69\x95\x01\x5f\xec\x37\x7a\x09\xfb\xf6\x1e\xb7\xcd\xc0\x3d\x3b\x0c\x5c\x56\xc1\x83\xe6\xd7\xe2\x01\x32\x2a\x43\xc1\xdf\x70\x6b\xe6\x7a\xbb\x76\x79\x4f\x68\xba\xca\x9e\x6f\xa8\xe7\x21\x0c\xf8\x5e\x97\x74\xfb\x41\xd9\x55\xf6\xbe\xba\x9a\x07\x8d\xfe\x6a\x9f\xd1\x97\xdf\x74\xe7\xfb\x1c\x51\xf7\x04\xbe\xab\xec\xf8\x86\x7a\xbe\xbb\x22\xc9\x3d\xcf\x8f\x60\x55\x2f\x77\x30\x55\xde\x17\xd4\x38\x7e\xe3\x52\xfb\xcb\xfc\xbf\xf6\x30\x27\xf3\xc4\x87\xb2\xc4\xa0\xcc\x13\xa7\xc9\xaf\x32\x40\x47\x81\x3f\x9f\x57\x38\x24\x67\xaf\xcb\xcb\x9d\xcf\xb9\x27\x5e\xf1\xf3\xd4\x8e\x58\xe6\x43\x54\x4e\xbb\xa1\x42\xb9\x33\xde\xdd\xcd\x1b\xa5\x2f\x8a\x66\xe4\x39\x9f\x88\x79\xf9\x00\xd1\xab\xa2\x13\x52\xaa\xa9\x8e\xa5\x42\x3d\x96\xa8\xe6\x63\x82\x35\x2f\x3f\x3b\x6c\x2b\x55\xf9\x15\x19\xd3\x7a\xac\xf4\x24\xb3\x3d\x1f\x23\x84\x69\xe3\xf7\xb6\x96\x7f\xd8\x97\x2b\x7d\xc9\xf6\x28\xbf\xed\xcb\x0f\xe9\xe7\x7e\x7d\x7b\x48\x7f\x36\xf6\xc1\x53\xa5\xcf\x2b\x97\xb8\x8d\xa1\x2e\x15\x01\x2e\x3b\x88\xd8\x46\x79\xda\xe8\x39\xaf\x38\xca\xe3\xf4\x96\xad\x3f\xc5\xa6\x5b\xc2\x5d\x9e\x2d\xa3\x13\xaf\x62\xb2\x26\xaf\x2b\x1c\x7b\xb7\x78\x05\x97\xb9\x04\x2b\xc2\x93\x98\x7e\x37\x2d\x36\x39\xc2\x0d\x75\xbd\x98\xf3\x1b\x7f\xe3\xb2\xa5\x90\x6d\x5a\x6d\xa4\x42\xb7\xb5\xa6\x84\xb0\x50\x57\x76\x40\x2f\xad\x21\x7b\x5d\x52\x0e\xa7\xf3\xca\x62\x78\x5b\x28\x45\x3e\xbf\x47\x2b\xdb\x8d\x5e\xfb\xd3\xa9\xeb\x4d\xcb\xc7\x71\x9d\xae\x50\x11\x19\x0d\x4a\xbf\x4d\xaf\x0a\xf4\x94\x0b\x32\xba\xcd\x8e\xf9\x77\x77\xb3\x46\xd9\xf3\xa2\xc4\xb9\xcb\x17\xf2\xc6\xb0\xe4\x5b\xc9\xcb\x42\x99\xeb\xd5\x44\x04\x9e\x88\xc4\x66\x37\xd3\x22\xd5\x57\x6f\x0c\xd0\x73\x5f\x09\x3e\x8f\x66\xc7\x33\x61\x5d\x8f\x12\x17\xeb\x32\x1e\x57\x92\x97\xaf\x28\x18\xab\x69\x43\xfd\xbd\x76\x21\xba\x5a\x9c\x39\xbf\xfb\xc1\x35\xb9\xc7\xdf\xdd\x95\x04\xe2\x16\x68\xd6\x1c\x61\xef\xee\x16\x70\x82\x2d\xd6\x1d\x28\xc6\x81\x52\x96\xa8\x04\xc5\xb5\x2b\x9c\x8d\xaf\x45\xf9\x08\xca\x77\x85\x12\x12\xa0\x57\x49\xe7\xf5\x75\x8e\xf0\x33\x3f\x2c\xbf\x08\x8b\x5f\x7c\xed\x5d\xdb\x72\x93\xa3\xf9\xb2\xcc\xbd\x7c\xe7\xdb\xb9\xbc\x8f\xc5\x26\x77\xf2\x74\x09\x8f\x97\xef\x75\xf6\x15\x87\xf3\x53\x2a\x01\x95\x8b\x57\x9e\xe4\x01\x86\xbd\xb0\x0c\xf5\x99\x60\xf1\x76\x3c\x14\xec\x0f\x1f\x5d\x79\x2e\xd8\x5c\xd5\xcf\x7c\x22\xdc\x80\xdf\xbc\xf1\xd8\x8f\x32\xdf\xdb\x46\xb3\x73\xa8\x7d\x85\xe5\x6c\x5f\x67\xa1\x77\x4b\x6b\x0f\xd7\xa0\xad\x98\xd3\x1b\x5d\x83\x72\xa5\x7f\x72\x89\xd9\x8c\x43\xbd\xa5\x9b\x69\xc9\x9f\xd7\x97\x79\x17\x34\xeb\x2d\xbd\xfc\x4a\x83\x98\xbf\x97\xbf\xd0\xef\x97\x0f\x32\x86\xed\x83\x69\xbd\xa5\xbb\x65\x95\xfc\xec\xe3\xbb\x13\x46\xf6\x96\x7e\x97\x41\x5b\x7f\xdf\x45\xb1\x72\xa9\xfb\xb3\xae\x08\x4a\x7a\xbd\x17\xdb\x37\x22\x7d\x6f\x61\x77\x5a\xf6\xbb\xdf\xe2\xf0\x42\x97\x2b\x60\x40\xd6\xc9\x36\xd6\x52\x79\x29\x54\x46\xf8\xad\xf7\x42\xe5\xe0\xa0\x3e\x0f\xcf\x57\x93\x79\xc1\xcb\x28\x8c\x10\x65\x57\xe6\x42\x19\xbf\xc9\x7b\x24\x2d\xad\x0a\xe6\x10\xaa\xfa\xbe\xc2\x46\x63\xfe\x60\xfb\x7e\x25\x48\xf6\x1e\xb6\x7d\xd4\xf1\x33\xef\xc9\xbb\x03\xb4\xef\x6e\xd3\x7f\x70\xa7\xbf\x83\x3d\x7f\x3f\x38\xf7\x2d\x6a\x7b\x59\x35\x3f\xf3\x60\xef\x01\x04\xbf\xc7\x45\xc6\xc3\x87\xfb\x07\x5d\x62\x7c\x0a\x8f\x54\x2c\xf4\xaf\x3b\xc2\x73\xcb\x12\x61\xf8\x9b\xb8\x3d\x79\x5e\xbe\x1e\x67\xef\x8b\x2e\xcc\xb1\xb6\x53\xb9\x8e\x2b\xef\xf3\x57\xbe\x10\xb8\xd2\x22\xf4\x2a\xbf\xfc\x02\x96\xe3\x28\x69\x43\xf9\x42\x9c\xa7\x29\x94\x0f\x43\xd7\xf7\xae\xfc\x6b\x51\xfe\x4d\x95\x00\x67\xfc\x22\x77\x8b\x27\xfc\x09\x0f\x63\x56\xbf\xf2\xc3\x68\xa3\x19\x6a\x9d\xee\x67\x32\xf9\xfe\x2c\x66\x5a\x5a\x87\x10\x3d\xf4\xc2\x0f\x16\x90\xf7\xcb\x88\x5b\xd7\x15\x4c\xa9\x22\xff\xb3\xec\xb1\x0f\xb7\xaf\xfe\x18\x5b\xe9\xdc\xe7\xf6\x84\xcf\xb9\x67\x89\xe0\xd2\x9a\x89\x85\x38\xf1\x22\x11\x78\x7c\x5e\xce\x80\x6a\xfa\xff\x33\x8d\xb0\x7e\xa9\x11\x36\x0c\x67\xbf\x89\xdb\xca\x29\x95\xbd\x2e\x9a\x53\x97\xd6\xd7\x5d\x24\xf3\xcf\x25\xd1\x45\xfc\x33\x45\x14\xf1\xcf\x7f\x52\x14\xd1\xee\xfe\x39\xcb\xc0\xbd\xe1\x91\x20\x45\xb4\x62\x83\x28\xd0\xe4\xcb\x43\xa1\xde\x5c\x3c\x47\x92\x2b\x9d\xb7\x94\x96\x96\x2e\x18\x53\x4b\xe3\x99\xac\xaa\x3b\x4e\x6b\xfd\x22\x33\x56\xd4\x9f\x97\x12\xe3\x4d\x7a\x91\x77\xb3\xb4\x7e\x80\xe9\x77\x5d\x5f\xdb\xcb\xec\xbb\x4b\x02\x9a\x8d\xc7\xd0\x7c\xe1\x07\x1c\xf7\xc3\xbd\x7a\x1b\x7f\x2e\xb7\x17\xef\xd9\xcf\x5d\x32\xc2\x6c\xed\x6f\xb1\x92\xef\xae\x28\x56\xb8\x35\xc3\x9d\xb9\x6c\x5b\x58\x8b\x46\x5d\xc3\x98\xdd\x57\xea\xd6\xd8\xb0\xdf\x59\x65\xc7\x14\x35\xdb\xce\x2a\x25\xd5\xfc\xcc\x67\x95\x1d\x52\xda\x6c\x95\xbd\x77\xdf\xd4\xe4\xb3\x05\x67\xa8\x7c\x7d\xfc\x75\xee\x5b\xd7\x7f\xb6\x40\xe6\xf6\xe2\xaa\xa0\xdb\x50\x09\xb6\x0d\xff\xcc\x20\xdb\x6f\x86\x6b\x9c\x6c\x46\x0f\x99\x6f\xf9\x74\x3f\xfb\x4f\xb8\x5d\xd2\x05\xed\x32\xe3\x8a\xf5\xfc\x15\xa6\xdc\xa6\xac\x41\x5b\xe7\xdc\x86\xeb\x8b\xed\x93\xce\x7a\xe8\x38\xef\x7f\x7d\xb1\x25\xf7\xd0\x0e\xfb\xda\x83\x2f\xa3\x7e\x48\x50\xc0\xb7\xb4\xe3\xc7\xfd\x7f\x2d\x97\xa5\x3d\x59\xbe\x43\x36\xa5\xad\xac\x2f\xd4\xf1\xdd\x35\x0a\xa7\xda\xf1\xc7\x29\x73\xfb\xd9\x27\x18\x2b\x74\x3f\x57\x1c\xa2\xdc\xcf\x45\xda\xc8\xad\x70\x75\x8a\x5f\x14\x68\x3f\xfb\x9e\x28\xd9\x14\xf0\x18\x5b\x02\xfe\xb5\x17\x10\xd6\x03\x57\x66\x75\xf4\x1e\x6e\x9b\xaf\x4e\x30\xb4\x8f\x75\x5e\x66\x72\xfc\x89\xd7\xe4\x7d\x12\x5d\xed\x61\xa1\x7f\x78\xc7\xbf\x9f\x8d\x7e\xe7\xb4\x58\xbb\x69\xbe\x7f\x6d\x3b\xfd\x03\x46\xbd\xb2\x96\xbf\x92\xad\x7e\xed\x0c\x7b\x77\x17\x36\xca\x9e\xff\x54\x1e\xc1\xdf\xca\x3c\x2c\xd5\x9a\x9d\x2c\xc4\x0a\xed\x86\x1a\xc9\x50\xb4\xb5\x32\x22\xdb\x5a\x4f\xa5\xfb\x7b\x39\xe9\x9f\xe6\xf5\x1b\xf8\x5e\x24\x3c\xfb\x9c\x4c\x69\x27\xcb\xf2\xbd\xb9\x48\xf5\xed\x7c\x81\x43\x59\xa7\x5c\x5d\xca\xbb\x51\xa4\xfa\x49\x0c\xde\x09\xbe\xd6\x86\xa3\xe7\x4f\x6e\xcb\x2e\xef\x6e\x91\xa8\xc4\x9a\x6d\x6d\x74\x29\x86\x91\x64\xa3\x4f\x31\x28\xd6\x6d\xe1\xe4\x06\xf1\x5b\xb5\x67\x71\x4a\x50\xb4\x9e\x6e\x9a\x52\x37\xe5\x93\x28\x7e\x5c\xb9\x5a\x25\x2f\x4b\xca\x5c\x6c\xed\xe5\x1a\x55\xa9\xc1\x76\xdb\x12\xb5\x46\x55\x69\xf6\xdd\xb0\x34\x15\x89\xb6\xd4\x51\xc9\xc3\x32\xc2\x07\xaa\xb1\x5f\xe5\x3f\xbc\x67\x96\xc9\x6a\x05\x67\x63\x45\xdf\x19\x24\x2e\x8c\x78\xb4\x0a\xcb\xd7\x00\x7a\xb7\x3f\xab\xd5\x9e\x5d\xa2\x8e\x07\x1f\x19\x36\x25\x2f\xdc\xe3\xcc\x90\x54\xf3\x33\xeb\x8f\x7b\xa5\xd2\xdc\xfd\xd4\xf0\x35\x5d\xff\x6e\xc7\x86\x3d\x12\x6f\x6e\x39\x37\x54\xd4\xf4\x33\x0f\xfc\x7e\x29\x3b\xf7\x38\x39\x7c\xd5\xd0\xff\x98\xa3\xc3\x5f\xf6\x00\xf0\x57\xf3\x99\xf8\xcb\xaa\x83\x0f\xda\x8b\x1e\xb4\xef\x7f\x6c\xb6\xbc\xfb\x46\xd0\x9e\x9f\xef\x98\xf4\xf3\xb8\xd9\x38\x42\x76\xcf\x4b\x24\xfd\xa4\x7f\x07\x6d\xdb\x6d\xf5\xb3\x5f\xcb\x4b\x4a\xfd\x79\xac\xa6\xfe\x3c\x52\x53\x7f\x1e\xa7\xa9\x3f\x8f\x73\xa9\x3f\x8f\x9b\xad\x4f\xd9\xd7\x29\xfb\x83\x50\x1f\x24\xff\xac\x89\x46\xf3\xcb\xab\x44\x7d\xc8\x12\x3d\x88\x56\x3c\x83\x93\x6c\x0f\x8e\x1f\x5c\xf8\xfe\xfa\x7d\x78\x92\x1f\x9b\x07\xd3\x55\x2c\xaf\x61\x7b\x2e\xbc\x69\x34\xfb\xbb\x76\x70\x90\x9a\xa6\xd3\x97\xef\xb5\x8f\xcf\xd4\x1f\x87\x5f\xee\x65\x42\x8a\x2f\xde\xf4\x8d\x6f\xaf\xe6\xe2\x50\xb4\xd2\x64\xc0\x87\xef\x3f\x26\x59\x55\x6f\x1a\xb4\x9e\x44\x32\xbb\xeb\xb3\xf7\x5f\x24\xd9\x21\x78\xb6\x0a\xc5\x3b\xb4\x2c\x21\xb8\xff\x78\xf8\xfe\x63\xb3\x75\xd3\x88\x90\xca\xe2\x8c\xb2\xdf\xe6\x8a\x2d\x2f\xd5\x62\x0a\x95\x52\x76\x1a\x4b\xc9\x85\x14\x90\x7c\xf1\xf9\x79\x5c\xfc\x78\xce\xc3\xf0\xf0\x3a\x2e\x12\x3f\xfa\xa8\x66\x7f\x4d\x92\x6d\x88\x32\x81\x88\x72\x02\x11\xdd\xdd\x89\xe6\x7d\x2b\xa1\x5c\xf8\xf6\xf0\xa8\xed\x1f\xfd\xda\xf8\x12\x8b\xf7\xa1\xb8\x6f\xa6\xef\x5c\xef\xdf\xc3\xa3\xb6\xf5\xdf\x97\x8d\x2f\xf7\xf4\x9d\xfb\x56\xdf\x1c\x74\xba\x3b\x25\x79\xbd\xf9\x57\x49\x26\x57\xf7\xbe\xc5\xaf\x4b\x9e\xf3\x34\xc3\x6b\xcb\x1d\x36\x1a\xc1\xd0\xbd\xbb\x6b\xb8\xc3\x2f\xf7\xcd\x66\xfb\x62\xf4\x8f\xb7\x27\x17\xa3\xe7\xc3\x7a\x20\xfe\xb3\x72\x03\x61\xd7\x5b\x41\xfb\xf7\x57\x27\x57\xa3\xcb\xf3\xa3\xe3\xd1\xb0\xfe\x69\xe6\x46\x22\x5c\x72\x4b\xc4\x6f\x46\x6f\x8e\x4e\x5e\x0f\xeb\xc8\x37\x17\xff\x7e\x77\xf4\xfa\xe4\xf9\xf8\xe4\x7c\x58\xbf\xe1\x73\xd7\xae\x9d\x9c\xd7\xb8\x6d\x07\x22\x0c\xb3\xb7\xaf\xce\x2e\xaf\x14\x92\x99\x1f\x46\x05\xba\xe3\xb3\x37\x6f\x8e\xc6\x97\xa3\xf3\xa3\x8b\xa3\xab\x51\x5c\xdf\xe5\xb0\x6e\xf9\x8b\x05\xaf\x85\x62\xc9\x03\x1e\x09\xbb\xe6\x2e\xab\x68\xc7\x67\x17\xe3\xe3\x93\xe7\x17\xe5\x85\x6a\x7e\x50\xb3\x5c\x3b\xa0\xd2\x27\xcf\x2f\xc6\x67\xef\x46\x17\xaf\x8f\xce\x51\x66\x58\x8f\xdf\xd5\xfc\x1b\x11\xcc\xf9\x12\x84\x29\xdd\xef\x27\x57\xaf\x4e\x4e\x55\xb2\x4f\x6e\x34\x73\xbd\x94\x8a\xfa\xf7\xe2\x1f\xcf\x4f\x93\xce\xc5\xff\x56\xf9\x12\x37\x4d\x7d\x7f\x72\x1e\x37\x27\xa1\xba\xba\x38\x3a\x79\x7d\x72\xfa\x72\x7c\xf9\xfa\xe8\xf2\xd5\xb0\xee\xf9\xb5\x28\xe0\xee\xdc\xf5\xa6\xb5\x70\xce\xc3\x59\x4c\x74\xf9\xf6\xd7\xd3\xd1\xd5\xf8\xe4\x74\x7c\x71\x74\xfa\x72\x34\xac\xd3\xa5\x70\xd2\x96\x80\x7b\x53\x0c\xcd\xc9\x79\x4c\x23\xa9\x25\xe9\xc9\x79\xcd\xf5\x6a\xb2\x80\x4a\x79\x7a\x76\x55\x4a\xed\xf9\x51\x59\x09\xea\xce\xf9\xd9\xc5\x55\xd2\x11\xca\xe8\x8d\xba\x64\x69\x77\x49\xf4\x35\x27\xf0\x17\xb5\x70\xc1\xe7\xf3\x5a\xe4\xd7\xe6\x3c\x48\xbf\x0a\xca\x84\xfd\x4a\x09\xc9\x7d\x1a\xde\xd3\x17\x27\x17\x6f\xc6\xe7\x47\x97\x97\xbf\x9f\x5d\x3c\x8f\x87\xd4\x73\xdc\x60\x51\x4b\x22\x61\x63\xaa\xd3\xb7\x6f\x46\x17\x27\xc7\xe3\xb3\xd3\xd7\xff\x1c\xd6\xbd\xd5\x42\x04\xae\x55\xf3\xbd\xf9\x6d\xfc\xf6\xfc\xe8\xea\x6a\x74\x71\x3a\xac\x2f\x79\x14\x89\xc0\x8b\x9f\xbd\xbc\x18\x1d\x5d\x8d\x2e\xc6\x57\xaf\x8e\x4e\xc7\xff\x1a\x5d\x9c\x0d\xa5\x5f\x5d\x6d\x0a\x25\x32\xa8\x45\x33\xee\xd5\x3e\x8b\xc0\x8f\xc9\xdf\x9c\x9c\x0e\xeb\x0b\x17\x45\xdf\x1c\xfd\xcf\xb0\xbe\xe0\x7f\xc8\xe7\xe3\xd7\x23\x7a\x47\x6b\xa4\xa4\x90\x4f\xf9\x1f\xd9\xd3\xd3\xb3\x54\xd2\x20\xd0\x9e\x9f\x8a\x59\x85\x2c\xc7\x1d\x2e\x11\xe2\xb8\xd7\xa0\x3f\x39\x3d\x7e\xfd\xf6\xf9\xe8\x72\xfc\xf6\xe2\xf5\xf8\xc5\xc5\xd1\xcb\x37\xa3\xd3\x2b\x54\xbc\x0a\xe6\x35\x27\xe0\xd3\x78\x4d\xce\x51\xfe\xe3\xed\xe8\xe2\x9f\xe3\xf8\x03\x6f\xa8\x09\xff\x59\x89\xe0\xb6\x46\x79\xd7\xa9\x95\x90\x84\xe7\x47\x57\x47\xaf\x4f\x2e\x51\x1b\x44\xc0\xe6\x11\x9f\xbb\x61\x44\x72\xfa\x76\x34\xac\x47\xc1\x0a\x03\x79\x3a\xba\xfa\xfd\xec\xe2\xb7\x58\x6e\x4f\xce\xc7\x6f\x4f\x4f\xfe\x11\xbf\xcd\xb6\xfd\x5a\x18\x89\xb8\x8b\xb5\x95\xe7\xfe\x67\xad\xc8\xe9\xd9\xf3\x51\x52\x6e\xbd\x94\xe7\xdb\x62\x6b\xd1\xcb\xe3\xb3\xf3\xd1\xf8\xe4\xf4\x6a\x74\x71\x39\x3a\xbe\x3a\x39\x3b\xcd\x55\x74\x72\x2e\xc5\xca\x05\xca\xac\xc0\x72\xb8\xb1\xaa\xb5\xb6\xf0\x40\xf0\x5a\xac\x00\x72\xd7\x0b\x6b\xf2\x45\xed\xe4\x3c\xae\xe5\xc5\xeb\xb3\xa3\x2b\xd9\xf9\x64\x7c\x69\x1e\x0d\xeb\xce\xdc\xe7\x51\x5c\x81\xbb\x4c\xc7\x9a\xe6\x12\x66\xd1\xeb\xa3\xd3\xf1\xd9\xdb\xab\xf1\xd9\x8b\x64\xd2\xdc\xcc\xb9\x57\xf3\x57\x51\xcd\x77\x72\xf3\x93\x66\x4a\x22\x85\x71\x75\x30\xa1\xd7\xe8\xdf\x29\xe5\xd1\xbb\xa3\x93\xd7\x47\xbf\x9e\xbc\x3e\xb9\xfa\xe7\xf8\x5f\x67\xa7\xa3\x74\x38\xd4\xf0\xa2\xda\x67\xdf\x13\x0a\x4b\x69\x36\x5f\x8c\x2e\xcf\xde\x5e\x1c\x8f\xc6\x2f\x2f\xce\xde\x9e\x8f\x4f\x8f\xde\x8c\x92\xc9\x9d\xd8\xcd\x6a\xc0\x78\xac\x79\x7c\x81\x72\x54\x77\x79\x41\xaa\xbd\xaa\xe4\xab\xab\x2b\x2c\x85\xff\x3f\x7b\x7f\xc2\xdd\xb6\xad\x2e\x0a\xa0\x7f\x45\xe2\xed\x63\x81\x08\x66\xa4\xa4\xe9\x20\x05\xd1\x4e\x9c\x64\xef\xec\x66\x6a\x9c\xb6\xbb\x95\x75\x7c\x68\x09\xb6\xd9\xd0\xa0\x4a\x42\x4e\x5c\x4b\xff\xfd\x2d\xcc\x00\x09\x52\x72\xd2\xf3\xce\xbd\x6b\xbd\xb5\xba\x1a\x8b\x04\x31\x7e\xf8\xe6\x41\x14\x2d\xc3\x11\xa7\xd2\x1c\x0f\xf2\x7f\x1d\x42\x71\xf8\xf2\xe7\x23\x7e\x47\x65\x8f\x8a\x81\x17\x7d\xf4\xc4\xbc\x78\xcb\x97\x8f\x9f\x3c\x7b\x69\x56\x29\xf8\x5c\x67\x65\xfa\xb9\x7e\x92\x41\x94\xe2\x06\x45\x04\x04\xa7\x9b\x0d\x48\x05\x09\x9c\x91\xe4\xc5\xd1\x49\xfd\x26\x8a\xab\x30\x9c\xe3\xa8\xe5\x5d\x84\x88\xfc\xd0\x5f\xd9\x48\x7e\xe1\x3d\x34\x4d\x5f\xff\xfc\xea\xc9\xb3\x77\x27\x6f\xdf\x1c\xbd\x78\xff\xe2\x97\x67\xf8\x9e\x6c\x5c\x7b\xec\x36\xb7\x38\xee\xbe\x69\x6b\x9e\x99\x86\x47\xef\xdf\x71\x70\xe4\xd4\x8a\x03\x97\x77\xe3\xbf\x91\xdf\x75\x34\x69\xeb\xc6\x43\x31\x0f\x82\xdd\xb8\x4d\x4c\x37\x02\x57\x7c\x2b\xdb\xf3\xbf\xcd\x8b\xc0\x19\x7f\x27\x9b\x35\xdf\xd4\x3e\x12\x14\xf4\x7b\xb7\xb1\xa4\xa0\x8d\x46\x7c\xd3\x5f\xbc\xc5\x3f\xd4\x9b\xca\xe7\xad\x1f\xe8\xd3\x1b\x86\xbf\xab\x9d\x63\xe3\xb5\x00\x96\xd1\xa8\xe5\x63\x0f\x5c\xea\x6f\x7f\xf9\x16\x8f\xee\x85\x3f\xfc\xe5\xdb\x8e\xaf\xf4\x8c\xef\xb7\x7d\x1b\x9c\xf3\x8b\xb7\x78\xf4\x8d\xfb\x45\x63\x4f\xcc\x6a\x1e\xf8\xcd\x42\xab\xe0\x6c\x84\xc4\xa8\x27\x47\xcf\x24\x9c\x8c\xbe\xad\x7d\x56\x6b\xd0\xe8\xe1\x97\x6f\x9b\x7d\x7c\xe7\xf7\xd1\x6c\x52\xeb\x45\xa2\x84\x37\xef\x4e\x1e\xbf\x7e\xfd\xe6\xfd\x63\x41\x0f\x46\x1e\xb4\x04\x5a\xd4\xfa\x10\xac\xcd\xc8\x83\x1b\xfe\xa8\xd6\x2a\x84\xf9\xee\x79\x40\x13\x68\x21\xfb\x78\xfd\xe6\x44\x70\xd5\x27\x92\xad\xbe\xc7\xa1\xc5\x7f\x66\xda\xd5\xb8\xc2\x7b\xf7\x64\x53\xff\xb1\x6c\xfd\xee\x3f\x1a\x15\xde\xe3\x90\x60\x7e\x9a\xb7\x9a\xbf\x3f\x79\xf1\x9c\xcf\x90\x37\xfc\x46\x36\x6c\xbc\x09\x7e\xf3\xe3\xb3\xdf\xf0\xbd\x07\xcd\x2f\x7e\x7c\xf6\x5b\x84\x52\x21\x55\x48\xd9\xe5\xbb\x6f\x7e\x18\x7e\xb3\x97\xec\xf2\xea\x59\x58\x76\x79\xff\x36\x28\xbb\xa0\xdf\xff\x0a\x3c\xcf\xb7\xe8\xd7\xcb\xc0\xf3\x62\x8b\x7e\x3a\x0a\x3c\xaf\xb6\xe8\xed\x55\xe0\xf9\xc2\x95\x8d\x22\x9b\xaa\xeb\xc0\xe4\x3a\x4e\x85\xc8\x64\xe9\x45\x72\xf4\xfe\xf1\xeb\xa7\x8f\x5f\x72\x62\xab\x50\x16\x8e\x2a\x96\xd2\x65\x9a\x17\x94\xe8\x0f\x0f\x2e\x8b\xa5\x20\x49\x2e\x5a\x3b\xb1\xe2\x96\x6e\xc6\xa9\xdb\x81\x95\xbd\x52\x88\xf2\x20\xc1\xca\x37\x1b\x90\xcb\x09\x3c\x7d\xf6\x0b\x8e\x96\xe4\x2a\x42\x24\x79\xfb\xee\xcd\x53\x1c\xad\xca\x62\x19\xa1\xdc\x1c\x07\x2a\x82\x7d\x14\x9b\x0d\x28\x64\x1f\x56\x37\xe5\xae\x9a\xf7\x78\x64\x96\xe2\x2e\x2b\x42\x85\xed\xbd\x0a\xf6\x5e\x6d\x36\xa0\x92\xbd\xbf\x7c\xca\xd9\xfb\x7c\xc9\x59\x7a\x0e\xd2\xaf\x39\x7f\x28\x7a\x21\xc9\x9b\x17\x4f\x0f\x71\x54\x64\xcb\x45\x84\x2a\xdb\xe7\x22\xd8\xe7\x62\xb3\x01\x0b\xd9\xe7\xe1\x33\x2e\x42\x1a\x6d\xe0\xf3\xa2\xbc\xe4\xdd\xbd\x78\xfa\xec\xf5\xfb\x17\xef\x7f\xc3\x91\x56\xbb\xe9\x37\x2f\xdf\x3c\x7e\xfa\xe4\xf1\xcb\xc7\xaf\x0f\xf9\x09\xe5\x45\xba\x7c\xa2\x02\x80\x74\x8b\x57\xcf\xde\x3f\xe6\x7c\x2f\x8e\x2e\x09\x4b\x39\xc3\xab\xdf\x28\x84\x63\x78\x42\xfd\xfc\xcd\xd1\x8b\x57\x8f\x39\xdf\x56\x54\xc2\x7b\x52\x3e\x5f\x38\xf7\xe0\xc1\xe8\xbb\xef\x87\x7b\xdd\x83\x8b\x4e\x51\x1d\x53\x70\xff\xdb\xef\x7e\x80\x28\xc3\x14\xdc\xbb\xff\xe0\x41\x8d\x93\xb9\x9d\xe2\x27\x5d\x2e\x55\x16\xbd\x90\x86\x99\xcf\x90\x24\xb6\x0d\x60\x88\xa2\x1b\x72\x99\xb1\x67\x57\x84\xb2\x71\x7f\xb4\x75\x6c\x16\xcb\xe5\xd3\x6b\x9a\x5e\x66\x8b\x1d\x3d\xf6\x5d\xad\x59\x8b\x7e\x69\x14\xd4\x2f\x8d\x5c\xfd\xd2\x68\x3e\x1e\x4e\xea\x0a\x6a\x6a\x61\x64\x46\xe7\x9b\x0d\x99\xb1\x39\x04\x70\xbb\x05\x37\xa3\xba\x5a\x2b\x45\x39\x2a\xb0\xd2\x3c\x61\x90\x63\xfd\x57\x8a\x59\x1c\x47\x51\x1f\x63\x36\x65\x63\xfe\x14\xba\xd3\x99\xa6\x63\x9a\x2c\xc9\x59\xba\xce\x99\x50\x2f\xb9\x6f\xf3\x69\x3e\x9e\xd1\x64\x71\x91\xe5\xcb\x92\xd0\xa4\x24\xcb\xf5\x82\x80\xa0\xde\x9e\xcc\x98\xf0\x20\x9c\x63\xe6\xf5\x87\xc8\x16\xdd\x6c\xe1\x1c\x26\x97\xe9\xca\xd3\xc7\x9f\x15\x25\x90\x3b\x76\xb3\xf5\x8f\x5d\x2a\x00\xcf\x41\x31\xcb\xe7\xe8\x1e\x87\x09\x32\x1b\xce\x51\x85\xc9\x6c\x34\x47\x0b\xec\x4c\xe9\x2c\xa3\xcb\x90\x96\x5f\xba\x33\x62\x8c\xd3\x2d\x44\x6b\x9c\x25\xbf\x27\x67\x19\xc9\x97\xaf\xd2\xd5\xcf\x8c\xcb\x0b\x19\xa9\x92\x73\xc2\xe7\x98\x2d\x53\x56\x94\xd2\x07\x71\x01\x27\x6c\x96\xce\x31\x25\x1f\x7b\x65\xf2\xfa\x05\xa8\xd0\x1a\x6e\x51\x8e\x87\xa8\xc0\xaa\x50\x27\xa1\xac\xcc\x44\xa5\xce\x49\xfe\xb0\x50\x87\x3c\xc9\x07\x03\x98\x5a\x3d\x9a\xec\x60\xf1\x11\x30\xb8\x85\x13\x0f\xee\xa8\x98\x1a\x92\x2d\xde\x10\x50\xc0\x06\x18\xa2\x61\xe3\x7c\xf7\x5e\x02\xed\x1a\xee\xf5\x0b\xc0\x38\xfa\xad\x0d\x88\x2a\xc2\xde\x67\x97\xa4\x58\x33\xe0\x0c\x6c\xcc\x03\xd5\x4c\xf6\x32\x4f\x2a\x22\x8f\x55\xac\x6b\x8b\xee\xb9\xf3\xdc\x6e\x21\xa0\xfa\x13\x19\xc1\xa5\xd5\x8b\x5b\xf4\xe0\xc1\xf0\x87\xfb\x7b\xa1\x8c\x77\x01\x94\x71\xe8\x52\x30\x0a\xbe\x7b\xf0\xed\x37\x02\x2e\x68\x42\x41\xc6\xa9\x09\x05\xa3\xef\xee\x7f\x3b\xe4\x44\x81\x82\x6f\x7e\x18\xdd\x1f\x71\x0c\xce\x5f\x17\x1e\xda\xf5\xe0\x8e\x24\xd5\x2a\xcf\x18\x88\x92\x08\x22\x8a\x87\xa8\xc4\xc3\x49\xf9\x90\xe9\x33\x2d\x07\x03\x48\x1f\x3e\xc4\xdf\x23\x3a\xc0\xab\xb4\xac\xc8\x0b\xca\x00\x9b\x95\x73\x34\x1a\xda\xa3\x7e\xf4\xe8\xd1\x70\x8b\x96\x01\x05\xfa\xdd\xff\x02\xf7\x1e\xcc\x86\x07\x0f\xe6\x9b\x7b\xb3\xe1\xc1\x37\xf3\xd9\xf0\xe0\x87\xf9\x66\x36\x1c\xcd\xa7\xe2\x4f\xf1\xbf\x29\x3c\x4e\xfe\x77\xda\x7d\x75\x37\x61\xa4\x62\x80\x24\xac\xcc\x2e\x01\x84\x5b\x74\x81\x9b\x18\xcd\xec\xd3\xdd\x48\xaf\xba\x0f\xee\x71\x94\xa2\x76\x6a\xb3\xe9\x2f\x01\x9b\x0d\xe7\x10\xc6\x31\x9b\x8d\xe6\x71\x3c\xe0\xff\x3c\xc2\x43\xf5\xd7\xc3\xfb\xf7\xb6\x68\x15\xdc\xa2\x59\x7a\xf0\x17\x9f\xce\x00\xcc\x0e\x92\xb9\xf9\x05\xef\x1c\x27\xfc\xc7\xfc\xe6\x1e\xda\x7e\x75\x37\x6b\xcc\xf4\x2c\xd4\x1b\x00\x42\xdc\x86\xe3\xe3\xbb\xf0\xf8\x2e\xd8\xa7\x6f\x08\xc0\xf1\xdd\xe3\x8f\x03\x78\x07\xcc\x8e\xef\xce\x93\x3b\x70\x0a\x07\xa1\x01\xaf\x76\x6c\x0d\xa2\x78\x21\x77\x01\x95\x2e\xb8\x8c\x04\xb8\x70\xc0\x8d\x0f\x46\x0f\x1f\xde\xbf\x77\x50\xaa\x5d\x9c\x65\x28\x1b\xbc\x4a\xd9\x45\xb2\x2a\x3e\x82\x7b\x88\xbf\x82\x07\xa3\xf9\x16\x9d\x87\xb7\x4a\xcc\xde\x39\xb5\xe2\x48\x98\x96\x00\xb4\xb3\xbc\xc6\x14\x08\x1d\x3b\x44\x97\x98\x82\x07\xdf\x8f\x46\xdf\x41\x74\x6a\xab\x73\x1f\x0a\x5e\x6f\x27\x95\x15\xd6\xd5\xa4\xca\x2e\x57\x39\x31\x28\xe6\x55\xba\x12\xb8\xf1\x55\xba\x02\xb3\xd9\x75\x92\x7e\x68\xd3\x2b\xc8\xcf\xb3\xea\xb0\xb8\xbc\x4c\x8f\xc8\x8a\x08\x2d\xdf\xcb\xac\x62\x00\xce\x91\xf9\xd4\x53\x22\xe8\x6f\xfe\xc5\xd8\xea\x4d\xc9\xff\x5f\x79\x8d\x6b\x4a\x04\xdd\xfc\xb5\x50\x71\xfe\x53\x6a\x38\xdf\x5f\xa4\xf4\x77\x52\x16\xf5\x0f\x8d\x46\xc1\xf9\x8a\x94\xd9\xe2\x0d\xcd\xaf\xbd\xb6\x1d\x5a\x04\xfd\xa9\xdc\xf4\x5f\x33\x76\x51\xac\xd9\x4f\x6b\x52\x5e\x4b\xc3\x5b\x57\x3f\xae\x1a\x21\xd8\xcf\xcf\x65\xfe\x5c\xe9\x36\xbd\x7e\xde\xbf\xfb\xd9\xac\xf4\x7d\xb9\x26\xde\xcb\xa6\x52\x41\x37\x15\x47\x76\x68\xcd\xc3\x81\xcf\xb8\x24\xed\x35\x7f\xfe\xe7\x92\xb6\xb4\x93\x12\xb7\xd7\xfa\xc5\xea\x4d\xb9\xf3\x0b\xff\x60\xbd\xef\xf8\xba\xc5\x19\xbf\x2d\x0b\x56\x2c\x8a\xbc\xbb\xa3\x10\x50\x49\xd5\xf1\x8b\x55\xb5\xc7\x4c\x7e\xf9\xb6\x36\x8b\xab\x6f\xf7\xfa\x2a\xb8\x02\xfd\xed\x3e\x6b\x68\x6c\x5b\xb0\x8d\xb7\x3e\xd5\xb0\x0a\xb7\xac\x29\x0a\x6a\x1f\xa9\xe0\xae\x23\xd2\x04\xa5\x76\x65\x43\x63\x79\x3b\x7b\x09\x68\x1b\xbc\x4e\x5e\xa6\xa7\x24\x7f\x53\x3e\x36\x1e\x11\x81\x3e\xde\xbe\x79\xe7\x8f\xfc\xb6\x28\x43\x63\x05\xf4\x0d\xde\x67\x9e\x5f\xa0\x0f\xec\xbe\xf6\x41\x7e\x45\x8b\x5f\x8d\xb9\xef\x0d\x7d\x46\x97\x95\xd7\xde\x57\x41\xe8\x4f\xde\x2b\x93\xd5\x51\x9e\x56\x17\xb6\xbd\x51\x46\xa0\xcb\xe4\xf0\x55\x22\x55\xb2\xde\xeb\x86\x0a\x42\xb6\xd4\xd2\x30\xb8\x59\x14\x54\x96\x45\x4f\xf3\x67\x9f\x56\xa5\x4c\x61\x12\x74\x8e\xe9\xf7\x89\x2c\x13\xbf\xdd\xb6\x8d\xf0\xe3\xb3\xdf\xbe\xac\xff\x0f\xe4\x9a\xf7\x3e\xf7\xa4\xac\x99\x09\x9b\x3a\xf2\xe9\x41\x87\x7f\x60\x0b\xf9\xe0\x1c\x2b\x20\x8e\x93\x90\x86\xb9\x80\xbd\x3e\xe0\xb1\xa3\xa9\xae\x68\xab\x39\x30\x36\x5d\x02\x06\xa7\x5c\xb8\x19\xaf\xc1\xcd\x16\x5d\x27\x57\xbf\x1b\xeb\x24\xea\x0f\xa1\x10\x7c\xb6\x66\xd0\x26\x04\x7c\xc9\xe8\x71\xac\xf9\x20\xc1\x12\x35\x88\xb2\x7a\x39\xb5\x53\xb3\xa6\xe7\xe0\xe4\x3c\x58\xfb\xb2\x99\x45\x77\x23\xcc\x27\x55\xad\x4f\x2b\x56\x02\x3d\xd1\x83\x11\x74\xa6\x53\x83\xf8\xe6\x94\x2c\x46\xfa\xa2\x53\x62\x9a\x59\x42\x51\x53\x1c\x34\xfe\x5f\x04\x6e\x61\xb7\xa8\x19\xc7\x6c\xcb\x67\x79\x8b\x13\x77\x28\xdc\x17\x2d\x61\xd5\x0a\x68\x82\x9a\x76\x6c\x9d\x24\x18\x9f\x33\x78\x76\x06\x18\x34\xdb\xc3\xe0\x66\xd3\x3e\x0b\x6b\x8c\xe7\x73\x09\x4c\x43\x53\xae\x2f\x9d\x48\x05\x60\x72\xf5\xed\x97\xce\xa6\x85\x8a\x7e\xe1\xe4\xee\x0a\x19\x60\x3a\x3e\xbe\x7b\x7c\xf7\xff\x0d\x01\x8c\x69\xfe\x7d\xb3\x39\xfb\xf2\xb3\xfd\xbb\xf7\x33\xd8\x4a\x4e\x18\x51\x69\xe8\x1c\xdf\xf5\x11\xcd\x10\x7d\xc7\xa5\x20\xf1\xae\x6a\xbe\xfc\x9e\x8b\x43\x43\x3e\x06\x85\x19\xfe\x6e\x42\xf2\x8a\xdc\x64\x67\xa0\x5f\xaa\x21\xfb\xa3\x49\x86\xbf\xdf\x4a\xd5\x87\xfe\x90\x23\xd5\x0c\x69\x1c\x66\x04\x70\x05\x8a\x29\xdc\x0a\x70\xfc\x9c\x0d\x6c\xe3\xc4\xbf\x14\x10\xc1\xff\x99\x1d\x7f\x3c\x3e\x98\x0f\xa0\x11\x28\xcd\x51\x3b\x08\x38\xe8\xf2\x10\x44\x26\x6d\xa2\xc7\x17\x4f\xf4\x78\xba\x39\x8e\x21\x98\xfd\x17\x9e\x0f\xe0\x31\x06\xb3\xff\x8a\xe7\x03\x78\xf7\x7c\x8f\x49\x7b\x22\x52\x2b\x06\x7c\x2b\x7c\x69\xbe\x00\xf5\x9e\xb7\x9e\xab\xe0\x23\x5b\x07\x3e\x52\xae\x09\xad\x9c\x8a\xeb\xe7\xc6\xc7\xa6\xa8\x44\x19\x66\x76\x97\x32\xc8\x61\x73\x09\x32\xa8\x95\x71\x0b\xa9\x75\xaa\xcd\x71\x09\x72\x38\x05\x14\xa7\xa8\xc4\x0b\x90\x43\x04\x84\x6e\x28\x2e\xf9\xff\x21\xff\x1f\xc6\xe2\x49\x7d\x19\x35\xef\x27\xbe\x16\xb5\x18\xe3\xaf\x1e\xa2\x71\x5b\xc7\x7f\xb9\xb1\x6c\x47\xf6\xfb\x42\xa2\xfd\x45\xbc\x8d\xd5\xef\xa8\x7f\x0f\x92\xf9\xcd\x10\x7d\x33\xdc\xea\xe7\x0d\x1c\x18\x3e\x64\x4f\xc8\x6d\x3d\xec\x86\xd8\xf1\xbf\xb9\x76\xfd\xf9\xa3\x6f\xef\x3b\x8d\x94\x1f\x95\xbf\x3b\x8f\x0f\x7e\x9f\x03\xfb\xf7\xf1\xc1\xf1\xc9\x71\x32\xbf\xe3\xbc\x85\xd3\xbf\x6b\xa3\x5e\xac\x5e\xd0\xb6\x4b\xe1\xb0\x59\xae\x1d\x42\x59\x6b\xec\x95\x28\xd5\x95\x28\xd5\x95\xc8\xf0\x02\x94\x10\xa5\xfa\xda\x84\x2f\x47\x1c\x2f\x41\x0a\xa7\x75\x2d\x70\x76\x06\x00\x11\x37\x85\x3a\x37\x85\x89\xbf\xd5\xd0\xe4\xbf\x98\xd1\x3c\x0e\x31\xc6\xe5\x66\x03\x40\xb9\xa1\xa2\x2d\xb4\x67\x73\x0f\x26\x19\x5d\x92\x4f\x6f\xce\x40\x34\x8c\xe0\x43\x73\x49\xfa\xa3\x2d\xc8\x90\xb8\x95\x0b\x90\x36\xf7\xae\xe9\x58\x68\xf7\xee\xb3\x2e\xa1\xdd\xe5\x7b\xb7\xc1\x3d\x2e\xde\xa1\x6a\x93\x29\x34\x27\xb0\xce\xf3\x09\x2b\xaf\x6f\x4a\xa1\x86\xcb\x93\xd7\x84\x5d\xa6\xd5\x07\xce\x34\x2f\x52\xb6\xb8\xe0\xb8\xca\x9d\x90\xfa\xbb\x4c\xb4\x9f\x17\xa0\x7b\x2e\xfd\xb3\x56\xbd\x7a\x23\xfd\xc1\xfe\x37\xc1\x2b\x8e\xeb\xf0\xa5\xad\x68\x61\x10\xab\xc1\x85\xb7\x2f\x01\x0f\xd2\x2f\x02\x8b\x45\xb6\x2c\xd5\x16\x1d\x0a\xf7\xda\xdb\x03\x06\x2a\xeb\x4b\xa7\x71\x7c\x01\x28\xe4\xff\x2f\x6b\xab\xd7\xdf\x5e\x01\xc2\xd9\xb1\x2b\xc0\xac\x02\x9f\xce\x86\xf3\x47\xe5\x6c\x34\xdf\x6c\xe8\x6c\x34\x7f\x58\xce\x86\x73\xb8\x05\x14\x95\xee\x26\x34\x7c\x89\x03\x28\x85\xaf\xea\x57\xe1\xa8\xfb\x3f\xb4\xa8\xe9\x7e\x6b\xea\x89\x25\x61\xbe\x90\x38\x16\x6b\xc2\x7c\x7d\x6a\x4d\x35\xa8\xaf\x3b\x3f\x77\xc9\x6e\xbe\x36\xec\xb3\x79\x2d\xb3\xe6\x86\x39\xa5\x77\x0f\x63\x4c\x15\xb9\xe0\x60\xcc\x57\x02\xe5\x22\xe2\x78\x40\x8d\x2d\x85\x4a\x5b\x4a\x97\xe4\xdb\xc9\x15\x34\x75\x7b\xff\xf3\xab\x51\xfc\x79\xe7\x92\x46\xf7\xbe\xff\x9c\x35\xbd\x58\xfd\xac\x9c\x20\xf7\x82\x39\x3e\x6f\xb9\x04\xc3\xe9\x19\x08\xcc\xf0\x2b\x40\xa0\x40\xae\x67\x45\x09\xb2\xa4\x02\x70\xd2\x07\x14\x67\x09\x05\x10\x26\xcb\x82\x92\x09\xe4\xb8\x49\x2c\x4e\x7c\xa4\xfa\x6a\x20\x82\x90\xf3\xb0\x58\x86\xc4\xd1\x29\xbc\xc9\x12\xc2\x05\x96\xb3\x8c\xa6\x79\x7e\x7d\x93\x25\x67\x80\x0b\x24\xf6\x4a\x49\x7f\xf0\xb7\xc6\x1d\xfc\x33\x28\x88\x56\x97\x4c\xe9\x94\xca\x94\xf6\xfc\xb1\x7b\xb7\x6b\x6e\xe8\xe6\x0a\x38\xa7\xa0\x95\x8b\xc1\xeb\xe1\xd8\x50\xfe\x76\xd6\xde\xb3\xd9\x04\x70\x4e\xcd\x04\xd0\xa2\xd5\x70\x3d\x02\xf6\x53\x3e\x6d\x36\xab\x5b\xa8\xa0\x9c\xcd\x68\x31\x4a\xb4\xc4\x21\x11\xcc\x2e\xb2\xaa\xe1\xf3\xd1\x76\x88\x34\x8e\xfb\x24\x09\x2f\x9a\x93\xf4\x6e\x51\x37\x74\x70\x4d\x93\xd9\x17\x1c\xa1\xcc\x17\x86\x99\x3c\xc4\x46\x0d\x68\xb6\xd9\xb0\x87\x23\x67\x92\x8d\x40\x85\xe0\x2c\xe5\xdd\x7e\xfc\xd7\xff\x65\xb7\xbb\xcd\x1f\xfd\x76\x37\xbc\xcd\x76\xf1\x65\xfa\xde\x7e\x0a\x20\x88\xfe\x6b\x76\x7c\xbc\x7a\x79\x70\x92\x00\x78\x7c\xfc\x71\x3e\xf8\x2a\x82\x4a\x74\x68\x42\x4a\xc8\xb8\xd2\x7e\x18\xbb\xa7\x7b\x0b\xcc\x44\xe3\x58\x85\xde\xee\xf6\xe3\xa1\x5b\x77\xea\xed\x4e\xfa\xc1\xb9\x37\x8d\xd0\x9f\x4b\xf5\xcc\x0e\x03\x00\x8e\x8f\x3f\x0e\x20\x40\xe2\x9f\x01\xdc\xc8\xdf\xd0\xd9\xeb\x26\xe8\x04\x63\x61\xea\xca\x28\xc7\xfc\xfd\xb7\x00\x83\xd2\x86\xde\xbd\x1b\x84\x02\xdf\x02\xdf\x2e\x58\x0b\x3f\xc7\x5b\x9c\x75\x1d\x43\x4c\xb9\x1c\xc3\x91\x2b\x85\x53\x05\x07\x1c\xef\xab\x4b\xb6\x43\xb1\xd3\x42\x8f\x76\x60\xbd\xf0\x57\x41\x9e\xe8\xcb\x97\xa7\xb9\x9c\xff\x3b\xd7\xc8\xaf\xea\x0b\x1a\x84\xfc\xf0\x2a\xe5\xa3\x83\x91\x0c\x02\x57\x22\xb5\x59\x89\x43\xa6\xfd\xc8\xaa\x20\x00\xbd\x2f\x03\x1c\x5a\x57\xfe\x49\x95\x18\xa6\xc6\xae\x08\x4f\x88\x76\xd4\x24\x54\x3f\x6d\x7e\x9a\xf5\xb1\x4a\x25\x57\xa2\x14\x97\x46\xa4\x7c\xc5\x45\x09\x4d\x22\x72\x45\x22\x32\x9c\xbb\x24\x42\x7c\x56\xe0\xcc\xe2\x04\xe1\x5c\x99\xc6\x71\x6a\x27\x3d\x2b\xe6\x71\x5c\xf4\x31\xa6\x4d\x14\xe0\xc6\xf6\xc8\xa3\x92\x24\xa3\x82\x37\x79\x42\x40\x65\x49\x46\x2e\x48\x86\xcf\xf9\x2a\x7f\xba\xfd\xe2\xb6\x4b\xb8\x45\xa5\x1b\x8e\x7d\xea\x86\x63\x97\x26\x1c\xbb\xf4\xc2\xb1\xf9\x57\xa3\xef\xef\xdf\xff\xae\xdb\x5b\xcf\x38\xf0\xfe\x30\xfc\xee\x81\xf4\xe0\x55\x0e\x46\xa9\xf0\xc6\xbb\x77\xff\x7b\x38\x31\xae\x45\xb9\x39\xef\x68\x4d\x97\xe4\x2c\xa3\x64\x69\xf9\x83\x8f\x19\x5d\x16\x1f\x1d\xcf\x53\xf9\x20\x59\x16\x0b\xe1\x20\xbb\x35\xfd\x14\x9d\xfd\xac\xca\x62\x41\xaa\x2a\x8e\xa3\x99\xcc\xe4\xa0\x9f\xcc\x23\x8c\xf1\xcd\xd6\xe8\x89\x64\xd2\x08\xf5\x12\xda\xee\x2b\xbe\x89\xd5\xc7\x8c\x1f\x08\xd1\x76\x86\x9b\x45\x5a\x91\xde\x70\xec\xb8\x76\xa6\xc9\xef\xaf\x27\xe2\xf1\x68\x6c\x1c\x60\x87\xf3\x89\xf2\x7c\xad\x35\x7d\x26\x0c\xde\x66\x90\x85\xdc\x4f\xa4\x61\xb0\xe9\x31\xfc\x4d\xd0\x63\xf8\x1b\xd7\x63\xf8\x9b\xf9\xf8\x66\x8b\xf2\xe6\xb7\x0f\x82\xdf\x3e\x70\xbf\x7d\x20\xbe\x2d\xf0\x6c\x8e\x2a\xfe\xbf\x05\x3e\x18\xa1\xb5\x54\x2e\x71\x16\x28\x39\x2b\xca\x67\xe9\xe2\x02\xd4\x89\x0c\x47\x7b\xc5\xd9\x59\x45\x18\x2a\x31\xc5\x78\x81\x96\xb8\x8c\xe3\xf5\x66\x73\xb3\x9d\x28\xf7\xd8\x0f\xe4\x9a\xef\x62\xb3\x0f\xab\xe7\x11\x9e\xbc\x74\x2e\x2e\x8f\xec\x2e\x12\x77\x45\x6d\x3c\xe7\xda\x68\x51\x5e\xa6\x79\xf6\x17\x79\x5b\x16\x2b\x52\x32\x91\x42\x16\x94\xa8\x80\xa8\x52\x07\x92\x26\x1f\x46\xe3\x0a\x67\xbc\xa7\xd3\x92\xa4\x1f\x26\xea\x71\x7e\x7f\x5c\xe1\xdc\x3e\xd6\x87\x52\xb9\xfd\x1e\xb1\xeb\x5c\x06\xd4\x03\x8a\x4a\x54\xa1\x02\x6e\x97\xb3\x72\x8e\x2b\x7e\x05\x36\x9b\x2a\x59\xad\xab\x0b\xb0\x84\x68\x8d\x97\x68\xc1\xf9\x0f\x54\x18\x88\xe0\x0b\x59\xe2\xe8\x98\xf6\x0e\x7a\xd1\x84\x5d\x94\xc5\x47\x71\xd8\xcf\x64\xd2\x86\x9f\x45\x0e\x89\x1e\x2b\x7a\x29\xcd\x2e\x53\x46\x7a\xcb\xb5\xf8\xc9\x2e\x48\xef\xac\xc8\xf3\xe2\x63\x46\xcf\x7b\x22\xc5\x43\x35\x8e\x74\xe6\x80\x25\xd4\x7f\x15\xc9\x1f\x45\x46\xc1\x12\x42\x83\x00\x2a\x0b\x40\x6b\x0b\x40\x6a\xcb\x98\xdc\x93\xa8\x62\x69\xc9\xa2\x31\x49\x44\x82\xa2\xd2\xf3\xe6\xd5\xaa\x40\x20\x55\x2b\x48\x35\x46\x04\xc2\x2d\x74\x76\x30\xe2\x88\x4e\xf6\xf1\xb4\xa0\xa4\xb3\x8b\xa5\x8c\x77\x68\xf4\x40\x2a\x56\x16\xd7\xaa\x13\xf9\xa3\xbb\x1f\xf5\x81\xec\xca\xb9\x2b\x17\x1a\xf7\x68\x15\x21\x2b\x58\x9a\xbf\xcf\x2e\x39\x4b\xbf\x02\x24\x21\xb9\x08\xea\x40\xc2\x20\x79\x7e\x2e\x0d\x1e\x48\xe4\xd7\xbb\x3c\x62\x29\xe3\x7f\xf3\x5b\xcf\xff\x62\x9b\x0d\x49\x56\x17\x69\x25\x0a\x19\x21\x29\xb4\x94\x53\x62\x3b\x1d\x97\xa8\xdf\xa7\xc9\x32\xab\x64\x12\x10\x94\x62\x92\x9c\x2c\x53\x96\xba\x92\x4e\x9f\xa3\x7b\x90\xc9\x17\x38\x85\x28\xb3\x13\x5e\xfd\x4d\x97\x3b\x8a\x50\xfa\xb9\x97\x7b\x18\xc2\x0b\xdf\x3a\x6d\xbe\x9d\x8f\x65\x37\x3a\xa5\x85\xda\xc5\x31\x41\xce\x2e\x8e\x19\x32\xbb\x38\xa6\x48\xed\xe2\xb8\x44\x66\x0b\xc7\x19\xb2\x5b\x97\x22\xbd\x6d\xe3\x7e\x3f\x77\xce\xf0\xcc\x3b\x43\xa3\x96\xe8\x65\x2a\xf7\x6e\x71\xd6\x7b\x95\xae\xa6\xa0\xc4\x44\x78\x07\x31\x08\xf9\x41\x55\xfc\x4f\x8e\x67\xe0\x98\xbf\x9a\xb1\x39\xdc\x6c\xd4\x5f\x98\x42\x54\xda\x11\x2e\x5d\x2e\xd8\xe8\xff\xc7\x46\x21\x35\x23\x8e\x05\x79\x84\x18\x44\xc4\x78\xc4\x0c\x46\x70\x2e\xec\xcc\x87\x38\xe8\x13\x35\xda\xa2\xc7\xad\x6f\x8e\x70\x98\xd1\x98\xcd\xb7\xe8\x03\x2e\x00\x9c\x80\x0f\x9b\x4d\x88\x54\x3d\x93\x3b\x0e\xe3\x18\x1c\xe2\x1c\xd4\x55\x9c\x9c\x03\x99\xb0\x38\x66\x7d\x8c\x35\x15\x34\xe4\x50\x7d\x3b\x91\x22\x2f\x67\x3b\xb4\xd5\x7c\x38\x61\x98\x25\xab\xb4\x24\x94\xc9\xc2\x3a\x4c\x54\xef\xb6\x46\x90\xb0\x32\x9e\x58\xfb\x00\x83\xde\x82\xc5\x18\x1f\x36\x1b\x35\xa6\xcd\xcc\x94\x5c\x72\xb6\x85\x54\x4d\x1f\x01\xaf\x5f\xd5\x8a\x77\x2b\x03\x88\x70\xa3\x27\xc4\xb0\x69\x77\x44\x72\xc2\x99\x12\x0e\x00\x97\xc5\x5f\xaf\x02\x4f\xab\xc0\xc3\x22\xf0\xec\x23\x39\xfd\x90\xb1\xda\x0b\xab\x73\x72\xe6\x6b\xf9\x43\x96\x88\x3c\x63\x80\xa0\x19\x9d\xc3\xed\xf8\xf1\x16\xc0\xc0\x21\x4b\x64\x34\x9b\x4b\x23\x8d\x0e\x28\xc8\x30\x49\x44\xe2\x01\x3d\xd8\xe3\x3c\x07\x8c\xe3\x90\xe1\x24\x7d\x98\xe9\xa8\x82\x74\x30\x80\xa5\xa4\x2e\xd9\x2c\x9d\x43\xe9\xfc\xc0\x3b\xc8\xeb\x1d\x70\x7e\x34\x8f\x63\xd5\x3a\x37\xb4\xa0\x54\xd1\x10\x1f\x05\xcd\x46\x2f\x71\x7f\x64\x59\xad\x4f\xfc\x32\x7c\xdc\x6c\xc0\x47\x0c\x42\x90\xa7\xa1\x68\x6a\xe0\xea\xb4\x58\x5e\xcb\xd0\x20\x4e\xc8\x79\x77\xfd\x8f\x49\xc5\x09\x64\x1c\x47\xbf\x8a\x6d\x7c\xbc\x5a\x91\xb4\xe4\xb7\x35\xca\x68\x4f\xbd\x95\x93\x60\xb8\x6f\x62\x97\xcc\x67\xfd\x26\x57\x1a\x89\x8e\x22\x55\x16\xc2\x5c\xc6\x6f\x45\xba\xf7\x38\x06\x7d\xc0\x30\x47\x0a\xa6\xf7\x38\x7e\x19\xc7\x80\x61\x35\x85\x68\x40\x92\xc5\x45\x5a\x3e\x66\x40\x58\xfc\x7e\x5e\xad\x48\x79\x98\x56\x04\xc0\x81\xb9\xce\x23\xe8\x74\x00\x11\x13\x37\xfb\x77\xfc\x18\x3d\xc3\x87\xe8\x05\x3e\xb2\xdb\xf4\xde\xe2\x0c\x93\xda\xa7\xb7\x3f\x0f\x93\x94\x64\x95\xa7\x0b\x02\x64\x90\xc1\x1c\x82\x99\xb0\xd2\xde\x3d\x47\xd1\x57\xa3\x83\xaf\xee\x45\x70\xc2\x38\x3f\xc1\x39\x9d\xad\x9e\xc9\x1b\xf4\x16\x03\xf0\xe6\x76\x31\x6e\xca\xfb\xf2\x4a\x7a\x51\x4a\xce\x45\xb3\x45\x1d\xd2\xdc\x27\xd7\xcd\x52\x5d\x2f\x75\xf7\x3a\x0d\x73\xbf\x8b\x5f\xae\x26\x5a\x20\x86\x7d\x3e\x7d\xe6\x7f\x2a\x60\x79\x87\x44\xf6\x42\xfd\x76\x15\xbb\xab\xb5\x5a\xe5\x8e\x6f\xe9\x66\x13\x45\x36\x66\x4f\xb2\x5a\xe1\x6f\x50\x89\x32\x57\x3c\x12\x1c\xbc\xb0\x0b\xdd\x52\xa6\x7a\x03\xb7\xe8\x8d\x2b\x53\x65\xae\x4c\xf5\xc6\xc8\x54\x6f\x3c\x99\xea\x0d\x44\xaf\x9b\x11\x6e\x27\xa0\xe5\xf0\x9d\x74\x4c\xaf\xdf\xbc\x79\x2b\x6c\xbd\x6f\xc5\x24\xd1\x3b\x1c\xd1\xf3\x03\x42\x45\xd8\xee\x73\xf1\x23\x27\xe9\x15\x89\xd0\x53\xf1\x43\xd1\xef\x08\xfd\x81\xa3\xc4\xfd\xfd\x4f\xf1\x5a\x6e\x52\x46\xcf\x23\xf4\x97\x6c\x60\x9f\xd8\xbb\xf1\x84\xaf\x9b\x73\xe7\x8d\xaa\x6c\x1a\xdb\x93\x89\x26\xb7\x02\xb2\xc0\xdd\xff\x02\x07\xd3\xd9\x71\x72\xbc\x9c\x0f\x20\xb8\x9c\x56\xf0\xae\xb1\x34\x32\x4e\x85\x24\xf2\x7b\x78\x6f\x3a\x1c\xff\x0c\x44\x70\xcc\xf3\xbc\x48\x65\x78\x0c\x44\x6c\x76\x6f\xee\x88\x61\x3f\xbb\x50\x15\x55\xc2\x79\x6c\x3a\x22\xf7\xef\x90\x31\xb1\xad\xfe\xac\x81\x03\x49\x2e\xd2\xea\xcd\x47\xaa\xef\x06\x88\x96\xeb\x52\x3a\x81\xc0\x69\x13\x88\x74\x38\xd9\x10\xa5\x38\x8a\x84\x30\xd2\x48\xd4\x06\x0d\x5e\x6e\x5b\x26\x98\x8e\x8f\xab\x41\xfd\x29\x9c\xaa\xe7\xb3\x03\x8e\x1c\x06\xfc\x17\x48\x06\xd3\x63\x08\xa7\x10\x4e\xbf\xba\x9b\x41\x41\x3b\xa4\xda\x3c\x87\x86\xfc\x08\x44\xff\xf5\xfb\x0b\xd2\x53\xd9\xbb\x96\x3d\x96\x5d\x72\x61\x41\x40\x75\x2f\xfa\x5a\x8b\x08\x04\x7d\x1d\xf5\xb2\xaa\x97\x51\x81\x18\x92\xaf\x21\x44\x37\x7a\xc1\xe3\x21\x5a\x92\x3c\xbd\x1e\x0f\x11\x49\xab\x8c\x9e\x8f\xa3\x68\x3b\x29\xb1\xb7\xf5\xb9\xd8\xfa\x9c\x6f\xfd\x44\x6a\x35\xf2\xd9\xfd\xf9\x44\x72\xb8\x05\xe7\x70\xfd\xf6\x05\x6f\xfc\xcd\x1c\xca\xd6\x5c\xc4\x7a\x30\x9f\x54\x71\x0c\x52\x5c\xc1\x2d\xa7\x62\xbd\x12\x0b\x95\x48\x5f\x6d\xef\x02\xf7\xb9\x60\x69\x03\xea\x1e\x0e\x39\x46\x97\xab\x8c\x9e\xaa\xc9\xca\xa5\x55\xbd\x53\x92\x17\x1f\x7b\xc3\x5e\x5a\x12\x91\xa2\x29\xe5\x72\x12\x91\x89\xef\xf8\xcd\x50\xc2\x94\x90\xd3\x19\x59\x25\x11\x44\x0b\xdc\x1f\x42\x94\xf9\xdd\xf2\x85\x7f\x71\x9f\x8b\x38\x96\x96\xcd\x05\x01\x6b\x34\x44\x9f\x7b\x26\x0a\x91\xdb\x93\x29\xd5\xc9\x64\xfa\x64\xd2\xed\x56\xe3\x40\x03\xda\xbf\x7e\x71\x38\xf1\xad\x68\x1a\x9b\x51\x87\x50\x99\x59\xfc\xe6\x9a\xdb\x1b\xf3\xb8\x17\x9c\xc7\x3d\x77\x1e\xf7\xc4\x3c\x84\xb5\x58\x33\x49\x25\xa7\xf0\x04\x52\x49\x1a\xcb\xb9\xe0\x7e\xf8\x7a\x11\xb5\x66\x7c\x3b\x85\xaf\xea\x28\x7f\xca\x06\xd1\x38\x1a\xd0\x41\x34\x89\x38\x50\x9b\x96\xff\xf6\x63\x3b\xa3\x08\x51\x3c\x9c\xd0\x87\x44\x32\x03\x1a\x04\xe9\x60\x60\x7c\x8a\xd4\x9b\x8c\x91\x4b\x40\xe1\x84\x0d\xf0\x57\x60\x88\x4a\xa4\x5f\x9c\x13\xa6\x71\x89\xd4\x14\x94\x10\x6e\x0d\xb7\x27\x16\xa2\x38\x0d\xfd\x45\x0d\x01\x65\x30\x8e\xfb\x59\x22\x04\xed\xea\xd7\x8c\x5d\x80\xe8\x24\xe2\xbc\x8e\x1a\x2a\x27\x20\x83\x7a\xb8\x59\xc6\xaf\x96\x90\x7b\x1e\x33\x56\x66\xa7\x6b\x46\x38\x4a\x12\x74\x90\x39\xc0\xf1\x93\x0d\x67\x57\xdc\x16\x70\xcf\x98\x05\xce\xd8\x4a\xa3\x7c\x11\x13\x1a\xc7\x7d\x5a\x9f\xac\xc8\xfc\x29\xcf\xc5\x4e\xc8\x99\x1c\xe6\xec\xcc\x16\xa2\x02\xc0\x38\xe6\xbb\xed\x4c\xe9\x47\x09\x29\xfb\x4f\xc8\x82\x15\xe1\x4c\xae\x1e\x85\xce\x71\x14\xb5\x8c\xf1\x1f\x87\x18\xd7\x2a\xc7\xc0\xe9\x48\xe4\x0a\x95\xfe\x78\x64\x36\x9c\x8f\xc1\x10\xa5\xc9\xd5\x5b\x08\x08\x1c\x13\xc1\x7b\x11\x22\xe8\xe8\x3b\x72\xfe\xec\xd3\x0a\x44\x37\x37\xc7\xc7\xd5\x1d\x8e\x94\x21\xff\x63\xbb\x8d\x50\x74\x1e\x39\x2a\x4b\x46\xec\x25\x94\xac\x7e\x88\x3e\x68\x70\xa0\x13\x8a\x09\x49\xc8\x27\xb2\x00\x04\x4e\xa0\xc2\x46\x94\xe3\xd8\x09\x21\x49\x9e\x56\xec\x05\x97\x4c\xf1\x50\xf3\x76\xce\x4d\xa3\xc4\x17\x2d\xdc\xd0\x4e\x94\xe1\xd2\x70\x9b\x84\x20\x87\x8e\x99\x63\xe5\x47\x63\x44\x9b\xe6\xc1\x6e\x36\x80\x2a\xec\xf8\x36\x27\x69\x65\x30\x59\x2f\x55\x38\x4c\xe2\x43\xe2\xa0\x43\x91\x3c\xad\x67\x74\x53\x25\xe4\x13\x89\x22\x88\x32\x67\x6e\x96\x53\xc9\x84\x26\x65\xec\x68\x42\x4a\xe2\xdf\xc8\xd9\x1c\x51\x91\x49\xf5\x13\x03\x70\xd2\xa7\x4a\xa1\xae\x37\x4a\x99\x16\xdc\x36\x66\x9f\xc4\x22\x09\xbe\x7b\x30\x30\x11\xbd\xf0\xee\xb9\x3d\xaa\x94\x78\x26\x43\xbd\x59\x99\xb3\x59\x76\x26\xa4\x81\xca\x10\x13\x90\xa1\x81\x49\x23\x0e\x81\x2b\x04\x6a\xb4\x18\x8d\xda\x6d\x9e\x8d\xe6\xbe\x14\xb2\x75\x80\x35\x0f\xcf\xa8\x5d\x58\x48\x58\xf1\xb2\xf8\x68\xba\xb2\x0a\x6f\xe2\x71\xd8\xc2\x32\xb2\xd9\xf0\x7f\x1c\xf0\xa9\x6a\xe0\xe3\xde\x3e\x0a\xa5\x4e\x57\x7b\xe3\x30\x4f\x89\xc9\x41\x67\x38\x47\xa9\x82\xf0\xb0\xea\x37\xab\x43\x14\x81\x9b\x4d\x2a\xcf\x8d\x40\x94\xcd\xc8\x1c\xd3\x19\xe1\xc8\x21\xd5\xbd\xeb\xdd\xce\xeb\x6c\x2f\xc5\x6c\x56\xcc\x27\x69\x10\x27\xd0\x19\x9b\xe3\xb5\x5c\xf2\x16\x6e\x51\x81\x47\x93\xc2\x06\xe4\x17\x83\x01\xcc\xad\x4d\xc4\xd9\x81\x85\xd9\x01\xad\x11\x4d\x44\xfa\x68\xa9\x2a\xfe\xce\x28\xe9\x93\xab\xac\xca\xd8\x7b\xc9\x14\x03\xfe\xc1\xc4\xd7\xee\xab\x16\x42\xd5\xe5\xbc\x1f\x35\x7a\x48\x69\x95\xc9\x69\x9b\x46\xf7\xea\x9d\x90\x3f\xd7\x84\x2e\xdc\x7e\xee\xd7\x9a\x08\x3b\xba\xf3\xfe\x9b\xda\xfb\xc7\x52\xa8\x71\x5a\x3c\xa8\xb5\xf8\x91\x5c\x9f\x95\xe9\x25\xa9\x9c\x36\xdf\x36\x56\x73\x9d\xbb\x7d\x7c\x5f\x7b\xff\x8e\x9c\x91\xb2\x36\xd3\x1f\xc2\x33\x39\xbc\xc8\xf2\xa5\xbb\x31\xf5\x9d\x53\xed\xde\x91\x33\xb7\x55\x7d\xff\x44\xe8\x82\xdb\xa0\xb1\x77\x2c\xb5\x47\xa4\x35\xf8\x1d\x8a\xf6\x92\x54\x45\x7e\xe5\x22\x30\x9d\xee\x46\xa6\x5b\xfc\x3f\x06\x93\x29\xc8\x70\xb5\xcc\x6b\xff\x92\x29\xeb\xd3\x39\x61\x87\x52\x18\x5d\xca\x0d\x24\x70\xc6\xe6\xf6\xab\x25\x71\xf9\xa3\x99\xc6\x0c\x4d\x2a\x31\xd5\xbe\x47\x77\x8f\xab\x3b\xe8\xb8\xba\x73\x37\x40\x11\x43\x19\xca\x8d\x7b\x74\x34\x8e\xb0\x48\x82\xa2\x6f\xb8\x2f\x7e\x6b\x8b\x95\xb2\x02\x8c\xa5\x78\xa8\x76\x34\x12\x5c\x1a\x7e\xd4\xbb\x13\x49\xed\xfc\x58\x0a\x8c\xfa\xf5\x1d\xfe\x8e\xb7\xd1\xaf\x33\xba\x28\xa5\xac\x3f\xee\xd2\xed\xb9\x42\x1c\x7c\xe4\xfc\x22\x70\xab\x7a\x5a\x92\xdb\xf7\xf4\xb0\xd6\x53\xcd\xa4\xe6\x8a\x48\xcc\x5c\xc2\x5e\x9a\x67\x69\xd5\xca\x8f\x73\xce\xbf\x5a\xaf\x56\x45\xc9\xc8\x92\x0b\x4a\x72\xd1\x77\x22\xc1\x7a\x4b\x0c\x19\xe9\xa9\xd9\x83\xd3\xc1\x48\x62\x77\xf4\xc8\x25\x9c\x10\x5c\x6e\xb5\xc2\xcf\xc8\x85\xc7\x77\x36\xb3\x83\xe3\x8f\xf3\x01\xe4\x6c\xc5\xc3\xe9\x0c\x1f\xcc\x1f\x89\xbf\xed\x9b\xaf\xee\x3a\x62\x5f\xb6\xd9\x68\x9d\xe0\xc3\x6f\xf4\x48\x34\x28\x01\xda\x75\x12\x13\xc1\xbb\xcf\x32\xd9\x44\xe5\x8e\x99\x8d\xe6\x28\xc7\xd9\xec\xde\x1c\x15\x38\xe3\x52\x9e\x5a\xcd\x19\x01\x29\x2a\xf8\x8e\x3c\x8c\x30\xce\x85\xe7\x2c\x88\xee\x44\x7d\x9c\x6e\x36\xe2\xdf\x02\x72\x9a\xa1\x1b\x17\x28\x85\x50\x6c\x9a\xc0\xd0\x63\x6a\xa8\x00\x15\x5b\x72\x21\x99\xac\x23\xc2\xc0\x4c\xe5\x52\x8d\x46\xd1\x1c\xa2\x95\xfb\xe2\x2c\xcd\x2b\xfe\x66\x18\xcd\x1d\x86\xeb\xcc\xbb\x4f\x17\x82\x9b\x96\x0e\x79\xfa\x4f\x54\xea\xc7\xcc\x3e\xb6\xee\xbf\x06\xb8\x32\x94\x6a\xc9\x3d\xba\x13\x09\x8a\x49\x30\xce\x50\x21\x7f\xb2\xcd\x86\x61\xac\x4d\x3a\xfd\x3c\x8e\x69\x1c\x37\xb3\xc3\x67\x71\x0c\x72\x9c\x4d\xcd\x4c\xc6\x66\x22\x10\xf5\x8b\x38\x2e\x43\x5f\xa5\x71\x0c\x0a\x9c\x4e\xcd\x44\xc7\x66\x9e\x10\xe5\x71\x5c\x6c\xc5\x46\x5d\xf9\xdc\x68\x75\x67\x5c\x91\xfc\xac\xba\x83\xa6\x75\x3e\xf4\x9c\xd4\x65\x20\xf2\xb1\x77\xcd\xb1\x51\x72\xba\xd6\xc8\x58\xf4\x79\xdd\x96\x35\x9d\x35\xf2\x7a\x9c\x2c\xcb\xec\x8a\x94\x98\x05\x14\x8d\xa2\xd7\xb0\x9e\x4f\x1e\x0d\x9f\xc0\x25\x71\x36\x5e\x76\x59\x92\x8a\x63\x4c\xca\xc8\x27\x49\x71\xde\x0b\x29\x59\x92\x52\x0a\x11\x27\x2f\x7c\x0e\xff\x11\xe0\x62\x35\x7e\x9d\x1f\x86\x14\x9c\x24\x59\xac\xcb\x92\x50\x49\x45\xb4\xb2\x9c\x8b\x7c\x24\x59\x14\x39\xff\xa9\x50\x76\x85\x6f\xb6\xcd\x87\xb3\x28\x9a\xab\x17\xb2\x9f\xf7\xd9\x25\xc1\x43\x33\x21\x97\x47\xe8\xda\x07\xb1\x9a\x12\x33\xa9\xb4\x3f\x2c\xd6\x94\xe1\xa1\x08\x1d\x5b\x92\x95\xfe\xc9\x59\x2b\x94\x3b\xe4\xe1\x1f\x91\x2e\xc3\x69\xd5\xd9\xfc\x8a\x49\x6b\xb0\x62\xd3\x2d\x19\x53\x0a\xbc\xaa\xb7\x10\xd5\x25\x7a\xa7\x1c\x31\x90\xb3\xec\x13\x59\x8a\xec\xd8\xbd\x94\xf6\xfe\xfb\x1f\xff\xdd\xab\xb2\x73\xda\x03\x24\x39\x4f\xf4\x27\xe0\xeb\x7f\x9c\x15\xc5\xd7\xa8\x37\x4b\x92\x64\x0e\x61\xc4\xa5\x39\x61\x0e\x10\xb8\xa4\x0a\xf3\x7a\x67\x80\xee\x38\x4a\x06\xd1\x50\x54\xfc\x14\x0c\x96\xd4\x1c\x11\x54\xe1\x42\x2c\x6a\x52\xb9\x91\x52\x7b\xd1\x3d\xf9\x21\x26\x28\x35\xb2\x80\xe5\xc1\x0a\xc4\x20\x14\xc6\x77\xd1\xa8\x92\x8a\xa6\xec\x0c\x8c\xfc\x39\x2c\x30\x6d\xb0\x66\xfc\xac\x26\xe5\x00\x2f\x9c\x13\x42\x19\xff\xad\x0f\x08\xe5\x72\xc8\x85\x52\x60\xd5\x8e\xa1\xa0\xf9\x75\xaf\x12\xf3\x80\xbd\x94\xba\xa8\x18\xc0\x9e\xb3\x97\xfc\x74\x7a\x55\xc6\x7a\x19\xad\xb8\x5c\xc5\x11\x81\x39\x07\x18\xf1\x05\xc8\xf4\xf8\xdf\x21\xbe\x8c\xb1\x04\x00\x24\xba\xae\xc6\x29\xb2\xfd\x56\xe3\x1c\xd9\xd9\x0a\x75\x91\x9c\xea\x38\x43\x85\x4c\xfa\x5f\x73\x80\xb2\x9b\xb5\x0b\x58\x5d\x6e\x50\x89\xdc\x15\x62\x50\x44\x5f\xa8\xbe\xe3\xd8\xfc\x99\xac\x54\x8d\x43\xed\x18\x42\x8d\x95\x50\x25\xc7\x93\xd7\x49\x4b\x12\x0a\xbf\xa3\x14\x97\xc2\x21\x44\x7c\x21\x07\x69\x03\xb5\x53\x8e\xc6\x8c\xe9\x76\xb2\x4b\x6b\x40\xe0\x0d\x87\xbf\x19\x99\x87\x5f\xa6\x21\x41\x25\x4b\xd2\xa5\xcc\x2a\xb0\x85\xdb\x2d\x97\x5f\x45\xf5\x5a\x45\x1f\x4a\x02\x94\x2f\x57\x05\x20\x9c\xf8\xe7\xff\xb5\x3c\x7a\x87\xd2\xca\x63\xfb\x3a\x42\xbd\x24\x49\x60\xef\x72\x5d\x31\x09\x06\xa4\xa7\x18\x15\xad\x79\xe4\x12\xb5\xc8\x0e\xef\xb9\x7c\x88\xed\xe8\x09\x63\x55\xc6\xd6\xf2\x34\x7b\x5f\x1b\xbf\x8f\x5c\xfa\x7d\x44\xa8\x17\x41\xce\xa1\x2a\xe5\xa1\x80\x9c\x61\x0d\x72\xae\x73\x32\xa6\x06\x24\xca\xe9\x8d\x3c\xae\x71\xb9\x0d\xc1\x87\xbd\x15\x61\x20\xa9\x21\x31\x17\x85\x4d\x24\x00\x39\xe8\x3b\x31\xe8\x09\x22\x43\x05\xe4\x2c\x47\x48\x9a\x9a\xca\x6a\xcc\xf9\xe3\x84\x33\x2c\x48\xef\x2a\x44\xe6\xc3\x31\x75\xa1\xdc\x1d\xdd\x02\xbc\x9d\x84\x59\xe6\x21\xef\x53\xfd\x80\xf5\x2b\xa0\xc4\xad\x5d\xb7\xc0\x9b\xef\x3d\x54\x31\xb2\xaa\xc6\xfc\x3a\x90\x55\xd5\x16\x19\xb0\x20\x80\x22\x29\x95\xee\x35\x17\x21\xd7\xed\x45\x3b\x1c\x12\xa4\x8c\x11\x6d\x53\xf1\xda\xe2\x52\xf1\x76\x66\x66\x56\x13\x23\x32\x8a\x5d\xa6\x9f\x44\xb0\xbc\xf3\x0d\x44\xa9\x55\xd8\xf8\xbd\x65\x0a\x3d\xdd\x57\xdb\x91\xee\xb5\xca\xc7\xed\x26\x37\xbd\xce\x20\xff\xa0\xf0\x49\x97\xc1\x06\x52\x4c\x26\x1a\xd5\xb7\xdb\xa1\x1e\x13\x20\xcc\x40\x30\xd1\x9f\xa2\x21\x8a\x22\x9d\x5f\x54\x06\x13\x5a\x2a\x34\xb8\x0b\x93\xaa\xb8\x24\xa1\xaa\x58\x37\x82\x2e\x3b\x24\xd9\x7f\x32\x82\x5b\x13\x8c\xf8\x98\x80\xa1\x1a\x47\x6f\x7a\xb2\x94\x28\x11\xf7\x87\x1c\xc3\xb0\x52\x68\x8c\x71\x89\xb2\xad\x9d\x2a\xa0\x98\x6e\x36\x7f\x82\x92\xd3\x34\x3b\x63\x9a\x08\x93\x00\xa2\x89\x34\x09\x70\x06\x3b\x91\x26\x86\xca\xde\x9d\x89\x39\x31\xb5\xed\x92\x26\x57\x98\x9a\xcc\x88\x1a\xa7\x4f\xf5\x1f\x52\x0d\x5a\x3c\x81\xe0\x66\x2b\x44\x8f\x07\x18\x67\x92\x68\x96\x0e\x45\xb0\x3a\x84\x8c\x03\x92\xe7\x90\xa0\xa8\x44\x81\xfb\x23\x61\xda\xc9\xe1\x4d\x81\xfb\x43\x65\x03\xba\xd9\x4e\xf4\xac\xe3\x18\x54\xea\x4f\x6c\x56\x82\x72\x6c\xa6\x50\xc1\xad\x07\x74\x03\x4c\xcd\x1e\x0c\xd4\x1e\x4c\x24\x29\xaf\x13\xab\x9c\x4f\x6b\x91\x64\xd5\xb3\xcb\x15\xbb\x3e\x62\x64\x85\x0b\x54\xe2\xc5\xb6\x0e\xcc\xf5\xad\x59\xe7\xb9\x82\xec\x6f\x90\xda\xd1\x31\x55\xc8\xb3\xec\xa6\xa7\x2d\xf6\x67\x8f\x9e\x9e\x5c\xa6\x1f\xa4\xa9\xfa\x71\xc5\x80\x7b\x0b\xe5\x6b\xcf\x66\xcf\x9b\x70\xb1\x09\x51\xcb\xfa\xba\xdf\x77\x8d\x36\x9b\x4f\xea\xd5\xd2\xe5\xc1\x40\x73\xd6\x41\x8a\x18\x52\x46\x60\x9c\x26\xf9\xfd\xa9\x11\xdd\xc6\x35\xa6\xc7\x93\x3d\x15\xc1\x12\xbd\x68\xf9\xda\xca\x9d\x46\xec\x54\x76\xb5\x24\x82\x8e\x4c\xe8\xc8\x87\x7a\xb6\xea\x5e\xf6\x47\x28\x93\x68\xc0\xc8\xbd\x7b\x71\x08\x88\x62\xa6\x40\x4b\xb0\x17\xc2\x48\x49\xd1\x92\xe4\x84\x09\xe6\x4d\x41\x5d\xbf\x34\x0a\xc8\xb4\x97\xd1\x1e\x83\xd9\x19\x60\xb3\x74\xee\xf2\xa6\xc6\x51\xec\xe6\x26\x82\x8f\xf0\x10\xde\x94\x1c\xb0\x85\x1f\xe3\x76\x6b\x38\xb6\x6f\x91\xba\x4b\x54\x5b\xec\x32\x24\xbd\x56\xc7\xc6\x1b\x36\xc8\x17\xb5\x02\x58\x03\x2c\x6e\x43\x28\x7c\x08\x17\xd2\x86\x4b\x42\x52\xff\xf7\xa4\x8c\xe3\xf4\xd1\x30\x8e\x41\x7a\x80\x4b\x7b\xdd\x4a\x79\xdd\x8c\x7d\xa7\x1b\x7a\xfa\x4e\x3d\xbc\x5d\xe6\xc4\x52\xcb\x10\x52\xc2\x4c\x82\x6e\x2b\x26\xb0\x3b\xe7\xd3\xad\x49\x67\x2c\x28\xde\xcd\x51\x81\xf3\x59\x39\x47\x15\x3f\xa4\x82\xaf\xa8\x8f\x33\xbe\x3a\x5c\x48\x0b\x1b\x5f\x6f\x1c\x67\x0f\x71\x91\x10\xba\x94\xbf\x40\x8d\xa1\xe3\xb0\x7d\x78\x74\xc4\xe1\x5b\x4c\xc4\xd1\xa2\x94\xe8\xeb\xa8\xc7\x2e\x52\xd6\x23\x9f\xb2\x8a\x55\xbd\x53\xc2\x3e\x12\x42\x05\x07\xc7\xb2\x4b\x52\x71\xae\x3e\xfa\xda\x71\xd2\x35\xc3\xa2\xaf\x2f\xab\x48\x08\x08\xde\x7b\x35\x0d\xf9\x36\xab\x7a\x69\x5e\x15\xbd\x53\x22\x8a\xaf\xc8\x63\x5c\x72\xe8\x4c\x85\xb1\x25\xcf\x49\xee\xa8\x2f\x77\x8d\x9e\x06\xc7\xcc\xc4\xd3\xaf\x21\xe4\xdb\x34\x82\x28\x75\x37\x07\xa2\x2a\x8e\x01\xdf\x44\x7c\x63\x1e\x8e\x53\xa4\xa6\x39\xce\xb6\x10\x31\x2b\x08\x84\xbd\xde\x98\x11\x0b\x6e\xb6\x1c\xfa\xf8\xfd\x9c\x64\xc6\xbc\x90\x85\x35\x9b\x21\xc6\x5c\x9b\xa4\x9a\x4a\x5c\xbe\xe6\xbc\x58\xa4\x79\xbb\x3d\x4a\xe0\x1e\xb9\x3b\xe7\xd9\x15\xa1\xbd\x3c\xab\x44\x81\x19\xc9\x7e\x47\xc2\x8f\x18\x10\x0e\x30\x66\x49\x96\x96\x86\x84\x3d\x5f\xe7\xe6\x0c\xdc\x02\x2a\x1a\xf3\x59\x95\x9b\x0f\x59\x42\x00\xd0\xbd\x54\x5f\x43\x25\x80\xb8\x44\xc6\xd0\xdd\x3d\x10\x80\x44\x46\x0f\x34\x32\x9a\xcd\x7d\xe4\x22\x68\x73\x0b\x92\xb0\xee\x25\x1e\x9e\xff\x60\xa8\xbe\x12\x64\x4e\x49\x4f\x98\xa9\x96\x9e\x14\xbb\x50\x35\xae\x14\xc4\x72\x69\x16\x49\xe6\x33\xb3\xea\x8d\xfe\x48\x70\x08\xa8\xc2\x43\xb4\x68\xe5\x60\xb5\xef\x5c\x93\x6c\xa2\x85\xca\x58\x5e\x2a\x94\x3a\xd5\x7f\x8c\x6b\x04\x21\x60\x84\x75\x5c\xb3\x95\x5b\x92\xe6\x30\xeb\x76\x62\x48\x3a\xe9\x0c\x17\x7e\xeb\x2c\xa9\x0a\x50\x80\x26\x02\x62\xc2\xb0\xa3\xa2\xa6\x6a\x9a\x50\x13\x21\xfd\x60\xbb\x85\x86\x7f\xfd\xfb\x3b\x37\x16\x30\xce\xdd\x4a\xd2\x8a\xd6\x78\xe8\x7b\xa9\x2f\x38\x79\x1c\x0c\xd0\xda\xec\x2a\x5e\x40\x54\xe0\x62\xb3\x59\x3f\x1c\x6e\x36\xeb\x47\x23\x94\xe3\x9c\xff\xaa\x50\x85\xd7\x5a\xff\xb2\x86\xa8\xdc\x42\x8e\x63\x6b\x10\xa3\x8c\xc7\x84\x56\xeb\x92\x48\x5c\xc9\x81\x43\x03\x52\x4f\x0e\x52\x09\x6f\x1b\x8d\xbf\x86\x02\x45\x8d\x22\xa1\xfc\xfc\x82\xfe\x32\xda\x2b\xca\x25\x29\x15\x6f\xbf\x36\x40\xa6\x6c\xb8\x4b\x3c\x9c\x64\x9c\xd2\x65\x0f\xd7\xd3\xda\x38\xaf\x25\x87\x22\x99\x19\x00\x85\xab\x4f\xa5\x6b\xcb\x71\x14\xb2\x24\x8b\x3c\x2d\xc9\xb2\xe7\xde\x09\x45\xd4\xf5\x2c\x22\x38\x1e\x62\x4e\x71\xc0\x12\x8f\xee\x82\xf5\xc1\x48\x79\x42\x5d\xe0\xf5\xc1\x08\xad\x6a\x84\xf8\xac\x95\x64\x5f\xe1\x33\x43\x88\xf5\x81\x2d\x02\x70\x89\x32\x4d\x23\x97\x8f\x86\xd3\x0c\xe3\x8b\xe9\x68\xbc\xbc\x93\x8d\xd3\x59\x26\xa8\xe1\x9d\xab\x89\x2f\xc5\xad\x06\x67\x92\xae\x0f\x0a\x64\xc7\xc0\x05\xa2\x01\x56\x94\x48\x3f\x78\x05\x18\x39\xd2\x80\x64\xb9\x37\x54\xfa\xe8\xca\x98\x09\xbb\x9c\x40\x25\x9e\xfa\xde\x91\xf4\x5b\x15\x07\xb7\x91\x31\x85\xdd\xb1\xd3\xf9\xd4\x6a\x0b\x06\x03\xc5\xba\xfd\x70\x9b\x11\xde\x91\xb3\xdd\xeb\x1a\x0d\x9d\x85\x59\x29\xc5\x1a\x50\x9d\x25\xee\xbb\xc2\x9f\xda\xdc\x64\x6d\xd8\x74\x88\x21\x72\xb5\x76\x42\xdf\xe6\x2a\x51\x06\x03\xe4\x7f\x85\x89\x42\xd9\xcd\xc0\xe1\x7e\x3f\x64\x9f\x0c\x07\x64\x47\xc2\x4c\xc1\xe5\x62\x47\x93\x10\xc7\x80\x60\xeb\xe4\x70\x45\xb8\x64\x0c\x91\xfb\xec\xee\x3f\x8e\xef\xdc\x3d\x47\x7f\x40\xf7\xc9\xc7\xc1\xdd\x73\x14\x50\xb6\xfc\x31\x88\x0e\x22\xd7\xa7\x7b\xeb\x7c\x36\x36\x0e\xab\x77\xcf\xd1\x5f\x10\xcd\x08\x62\x73\x2e\x30\x57\x6a\x5f\x38\xd3\x73\x0e\x32\x74\x8f\x0b\x9f\xe9\x6c\xc8\xaf\x4a\x3a\x1b\xcd\x27\xe1\x6d\x34\x89\x4a\xa6\x74\x10\xf5\xa2\x41\x3e\xce\xd1\x19\x68\x70\xa5\xa8\xe5\x10\x6e\xb6\xda\x1d\x72\x97\x7e\xac\x57\x3b\x10\x21\x9b\xb6\xcd\x49\x01\xf0\x68\x84\xf4\xb2\xc6\x39\xca\xb3\xcb\x8c\x8d\xcb\x44\xfc\xbb\xd9\x0c\x15\x74\xa5\xf9\xb8\xdf\x2f\x13\xfd\x03\x65\x74\x91\xaf\x97\xe4\x88\xe4\x67\xe3\xc2\x01\xd7\x0a\x15\x65\x76\x9e\xd1\x34\xd7\xe3\x8c\xed\xae\xed\xa7\x61\x93\x46\xf9\x36\x0d\xa2\xbb\x94\xcd\xa6\x86\x83\x2b\x65\xd0\x87\x42\x55\x2e\x14\xeb\xa7\xa4\xb7\xae\x3c\x6e\x43\x00\x30\xe7\x30\x94\xce\x31\x3a\x5b\xe7\x79\x24\x02\x6b\x95\xf4\x3e\xed\xf2\x71\x15\xad\xb7\xe3\x3f\x03\xea\x13\xd4\x1f\xd6\x14\x95\xf7\xf6\x42\x51\x56\x69\x50\x93\xe5\x94\xd7\x38\xba\xac\xf9\x71\x37\x6d\x6d\x72\x02\x98\xc9\x5f\xbe\x9a\x95\x3f\x71\x8c\x45\xe2\xb7\xc6\xe8\x46\x63\xab\x40\xc5\x79\xe7\x42\x50\xfd\xb1\x05\xa2\xfa\xeb\x90\x72\xc4\x1b\x51\x98\xc1\xd4\xa3\xa6\x1d\x4d\x3c\x57\xbb\x20\x3e\xde\x3a\x56\xca\x53\xc7\xe1\xa9\x5f\x67\xbb\x42\x95\xd5\xad\x1f\xc5\xa1\xe7\x2b\x35\x05\x04\xff\xca\x59\x35\x25\x67\x70\xe4\xa2\xfe\x0c\xb9\xe5\x93\x29\x6f\x2c\x0f\xc5\x34\x84\x70\x4c\x84\x81\xcf\x0e\xf2\xb8\x66\x45\xb5\x60\x44\x14\x18\x31\x0d\x46\xd4\xf1\x0c\x39\x22\x36\x7e\xc0\x1a\x95\x9b\xc1\x75\x41\x5f\xd8\x6f\xe7\x7e\xcc\x9d\xd8\xf0\xa2\xf9\xf5\x77\xc1\xaf\xbf\x9b\xc7\xb1\xfb\xab\xa6\x66\xb7\x21\x7b\x86\x67\x19\x33\xb4\x2a\xad\xa0\xcd\x81\x76\x55\x54\xcc\x79\x50\x22\xb3\xec\x4c\x2d\x3b\x75\x42\xf8\xb2\x41\xaa\x37\x21\x47\xd5\xfa\x94\x3f\xcc\x33\x4a\xc6\xca\x68\xfd\xcb\x1e\x65\xb9\x91\x56\x8c\x99\x4a\x11\x01\x13\xf3\xa2\xa0\xd5\x3a\x9c\x3c\x44\xd2\x24\xd3\x89\xca\x17\xee\xe4\x64\x34\x6f\x24\x4f\x2c\x14\x58\x5c\x08\x61\x36\x12\x64\xb5\x22\xb4\xcb\x82\x8d\xca\xc0\x00\x9b\x8d\x7d\x56\xf1\x67\xa8\xc4\xb3\x39\x44\x80\xe2\x12\x0a\x24\xa6\x82\xc3\x28\xba\x02\x0c\x5a\x51\xee\x22\x0d\xc8\x6f\x7e\x1e\x74\xd1\xa9\x74\x1d\xb0\x81\x2e\x39\x49\x9b\xa8\x14\xde\xd8\x0f\x44\x0b\x60\x23\x54\xd0\x07\xdf\x69\x40\xf9\xf9\x08\x7f\x01\x74\x52\x7b\xa7\xa2\x42\x7c\x5f\x82\x8f\xc4\x0d\x87\x91\x06\x84\xcf\x8f\x20\xff\xec\x8b\x20\xa2\xcf\x9b\xd7\x60\xea\x82\xbb\x8a\x50\x45\x55\xb3\xe1\xf7\x4e\xc3\xef\x4d\xc3\x45\xb3\xe1\x0f\xc1\xd9\xfc\xe0\xce\xe6\x87\xf9\xd8\x98\xe6\x01\xdf\xc0\x7f\x69\xbf\x0a\xab\x14\x77\x30\x00\xca\x51\x81\x2a\xb4\x90\x0e\x17\xff\xba\x65\x99\x7a\xd7\xc1\xa2\x53\xf6\xf7\x87\xd3\x06\xee\xcf\x5f\x5f\x85\xab\xcd\x86\xaf\xee\x17\xa2\xa4\x27\xfe\xe3\xa5\x84\x86\x4a\x8c\xb5\x40\xb3\x39\x9c\xac\x0d\x82\x2f\xd0\xda\xa5\x0b\x1c\x0d\xf0\x6b\x21\xc9\x01\x98\xa5\x73\x59\x7b\x6d\xad\xe9\x6b\x61\x1d\x3c\x28\x5a\x4b\x02\xbe\xc4\x6b\x4e\x88\xc5\xc7\x55\x72\x96\xe5\x8c\x94\xe1\x2c\x3f\x5a\x81\xfa\x58\x13\x5f\xe1\x5b\x9c\x9d\x81\xa5\xd1\x2c\xb9\x8a\xc7\x1c\x7a\x5e\xac\x17\x78\x39\x5b\x9a\xd4\xf6\xf3\xc9\x45\x22\xf4\xd1\x6f\x68\x7e\xad\xe7\xae\xe6\x0d\x37\x9b\x0b\x77\x19\x79\x73\x19\xfa\xc0\x74\x87\xd3\x65\x9b\x51\x90\xd4\x01\x05\x6e\xe1\x78\x76\x44\x00\x43\xb3\xb9\xfa\x4f\xda\x89\x50\x7f\x04\xe7\xb7\xf0\x2f\xd9\xdb\xb6\x7f\x3b\x23\xef\x6d\x25\x2b\x93\xe1\x6f\x7d\xfa\x82\x56\xac\x5c\x2f\xa4\x63\x80\x42\xdf\x80\xe9\xf0\x7b\xa8\xd2\x95\x6a\x15\xe1\x42\x64\x16\x3b\x5a\x9f\x2a\x1f\x12\x87\xa5\xac\x6b\xac\x05\x60\xd5\x34\xd8\xd2\x76\x22\x96\xee\x8f\x2c\x72\x35\x94\xa6\xaf\x49\x26\x42\xf1\x59\x22\xdc\x27\xce\x8a\xf2\xf2\x05\x65\xc5\x6b\xf2\x51\x77\x0c\x52\xb8\x65\xc9\xaa\x24\x57\x59\xb1\xae\x5e\x17\x4b\x82\xc9\xed\x84\x3f\x23\x81\xb5\xaf\x68\x42\xdb\xc7\x57\xe4\xb0\x43\x48\xe4\x6c\x66\xfb\xf7\xb4\x6b\xab\xf8\x97\x2d\x6b\x0b\xee\x5e\x5b\x38\xa5\x39\xb5\x8e\x53\xc9\x94\x7e\xce\x9a\xec\xa6\x4f\x80\xfd\x21\x39\x30\x94\xda\x56\x9c\xb9\x90\x4d\x84\xa1\x61\xec\x5a\x7b\x38\xbe\xca\xe2\x38\xac\x8c\xd3\x3b\x2e\xa9\xb8\x33\xff\xf7\x85\xd9\x16\x22\xb8\xb1\x49\x69\x4d\xdd\x25\x6a\x1a\x13\x6f\xaf\xc2\x60\xc9\x7a\xb5\x4c\x19\x79\x23\x8f\xd6\x1e\x32\x12\x31\x61\x0a\xbf\xd5\x64\xfc\x6e\x00\xdb\xd7\x2b\x41\xd8\x78\x2a\x03\x5f\xca\x57\x09\x33\xe1\x10\xa0\x66\xc1\x6f\x59\x1a\xc7\x20\x35\x3a\xf8\x54\xad\x34\x8e\x01\xc8\x42\x60\x9a\x42\xd8\x05\x9d\x2a\x9d\x85\xea\x05\xde\x7c\x8b\x71\xe6\x2d\x47\x18\x8b\x45\xb6\x8b\x06\x31\xa0\xe9\xaa\xba\x28\xd8\xa1\x7c\xae\x11\x2c\xf2\xbf\xc7\xaf\x54\x98\x78\x8e\x9f\x00\x3d\xce\x24\x93\x7f\xbc\x16\xee\x65\x64\x05\x72\xb8\xf5\xd5\x79\x82\xeb\x97\x0f\x3a\x3c\xa5\x95\xef\x43\x06\x85\x5b\x4f\x7d\x82\x82\x5b\x93\xd3\x7a\x5f\x68\x24\x2d\x26\x58\xdb\xe6\x47\x65\x1c\x67\x1d\xbb\xb4\xeb\x88\xf7\x75\xf6\x98\xcd\xf7\x40\x7e\x41\x4f\x2c\x7d\x9b\x6a\x4f\xe0\x78\x38\x69\xdd\xa6\x5c\xfb\xe6\x75\x23\xaf\x34\x8e\x8b\xda\x69\xa4\x02\xd4\x29\x67\x3e\x38\xba\x76\xdc\x49\x8a\x6e\x74\xa4\x12\x15\x34\x5a\x89\x8b\xd8\x75\x90\xcd\x4d\xb9\x24\xe5\x39\xd1\xbf\x0e\x7d\x61\x54\x2a\x27\x3b\xb0\x66\xb6\x13\x33\x4a\x19\x38\x7c\x66\xc2\x33\x45\xb9\x73\xd8\xbc\x47\xda\xa5\x43\xe3\xb0\x3f\x81\xb6\x84\x4d\x39\x9e\x46\xfa\x97\x35\x32\x8d\xa9\x63\x70\x6a\x48\x9d\xd6\xfd\x43\xca\x61\x44\x39\x81\x28\xf9\x8b\x28\x5b\xf6\xed\x3d\x6e\xda\x7c\x21\x1c\xaa\x2a\x1f\xb9\x5a\x12\x58\xf7\x45\xe2\xfb\x38\x51\x78\x54\x98\x51\x4d\x54\x00\x7f\x6b\xd0\x3a\x2a\xdb\xf0\x00\x9c\x68\x17\x79\xa1\x56\x9e\x18\xcf\x93\x69\x9b\xdf\xc9\x38\x34\x8a\xa6\x2f\xa8\xee\x12\x92\x89\x49\xb7\x5d\x72\x88\x3a\x5d\x42\x76\xa0\xec\x9d\xbe\x1f\xf5\x9d\x6a\x37\xd0\x4f\xfa\x65\x1c\x53\x11\x4b\xe2\xec\x8f\xb2\x00\x65\x7c\xa3\x0c\xc6\x13\x3e\x10\x1f\xd3\x72\xf9\x5c\xae\x41\x6d\x60\x19\xc7\xa5\x02\x86\xcd\x46\x83\xc5\x84\xb8\xce\x30\x53\x2a\xf7\xc1\x3c\x00\x19\x1c\x53\x87\xcf\x35\x6e\x3c\x99\x55\x88\x31\xcb\x92\x75\x6f\xc7\x7e\x56\xca\x16\x63\x47\x88\xaf\x30\x90\x9f\x39\xec\x84\xf4\x5c\xa8\x23\x2a\xd8\x80\xc9\xb4\xee\x63\xd4\xed\xc2\x90\xea\x4d\x15\x00\x05\xb4\xbd\x63\xb3\x19\xc2\x3b\x19\x44\x69\x68\x93\xf4\x26\x07\xf7\x2a\x6d\x03\xb9\x2d\x44\xb7\x44\x63\x69\x27\x12\x2b\x07\x5d\x68\x6c\x4f\xcb\x41\xc0\xcb\x30\xc0\xda\x79\x76\x04\x94\xe2\xcc\x10\x9c\xcc\x12\x1a\xce\x78\x7c\x2b\xca\xf8\x34\xf8\x03\x11\x90\x58\x72\x46\xbc\x3e\xce\x6e\xb8\x17\xe1\xd0\x7b\x33\x17\xac\x8d\xb9\x28\x11\x27\x74\x19\xbd\x2a\x3e\x10\x19\x5c\xe6\xe8\xb6\x49\x52\xd7\x7c\x23\x22\xb5\xe8\x88\x24\x8e\xba\x1c\xf5\xfb\x99\xd5\xa3\x07\x3c\xef\x44\xcf\xef\x0b\x96\xe6\xd8\x54\x7e\x96\xda\x7f\xc1\xde\x16\x01\x77\x18\x94\xd5\x55\xe3\x32\x0c\x38\x9b\xec\xa6\xce\xa8\x6c\xa3\xcf\xa5\x38\x08\x25\x7d\xc5\x31\xa8\x70\x93\xe8\x4a\x22\xee\x32\xab\x05\x0c\x50\xf0\x36\x36\x29\xb7\x84\x3f\xdf\x41\xf8\x5d\xd0\x77\x96\x38\x44\xa1\x8d\x1b\x76\x01\x7d\x2e\x7d\x54\x6e\x79\x91\xaa\xd0\xd5\x6b\xa3\x4b\x3b\x91\x7f\x87\x8d\x43\xe3\x3a\x99\x61\x4b\x9d\x57\xe8\x82\x89\x4b\xa5\xa9\x6b\x2a\x77\x32\x3d\xad\xf8\x7d\x32\x14\x2d\xc7\xe9\x1d\x10\xd8\xa1\x83\x11\x44\x05\x4e\xef\x04\xb6\x74\xa2\x22\xfd\x6c\x37\x0f\x87\xd3\xa8\x24\x57\xa4\x14\x91\x7b\xda\x01\x4e\xc6\x01\x9a\xe7\x05\xce\x0f\x0a\x37\x41\x9f\x30\x94\x8c\x0b\x6c\xc4\x4b\xb5\x6a\x3e\xfd\xad\x04\xe8\x26\x37\x50\xc4\x71\x55\x83\xc4\x02\x2a\x87\x4d\xcf\x86\x30\xd9\x53\x50\x42\xa1\xe1\x71\xe9\x76\x75\xb0\x18\x08\x0f\x07\xe5\xac\x74\xd0\x94\x87\xad\x77\x93\xd5\x93\xbe\x12\xda\xff\x97\xad\xe1\x50\x75\xf5\x5a\x5b\x70\x94\xb2\xdf\xc8\x5b\x86\xa9\x2a\x89\xec\x0b\xd5\xb8\x54\x1f\x09\x65\xec\x61\x9e\x56\xd5\xeb\x54\x78\x54\xcb\xc7\x42\x0f\x6b\x1f\xa7\x9e\x4d\x48\xd9\x5f\x8c\x8e\x0c\x17\xf2\x81\x07\x5f\xb7\x30\xe4\xd4\x90\xa3\x99\xb0\x2b\xed\x68\x0b\x8f\x56\xf4\x69\xcb\x4e\xf0\xfe\xd6\x5f\x98\x2b\xec\xbc\x70\x0f\x6f\xd8\x30\x28\xf1\x75\x69\xed\xe3\x27\x09\x17\x7a\x83\x11\x45\x43\x8e\x91\x84\xd0\x10\xfa\x2e\xa4\x3c\x5d\xa9\x7a\x67\xe7\xae\x6b\x90\xaf\x6d\xf7\xe3\x57\xcc\xf5\xf6\x44\xfb\x9d\x41\x02\x5c\x0a\x30\xe9\x18\xb8\xdc\xe6\xf4\x3c\xd1\xbe\x4a\xfa\x16\x0a\x01\xd9\xf8\x5b\x3c\x01\xf6\x0d\xd4\x32\x76\x69\x78\x69\x45\x53\x65\x33\x29\x77\x2b\x5f\xfe\x52\x4d\x59\xc8\xf9\xda\xd8\x94\xe9\x87\xf9\x66\x03\x72\x1c\x58\x21\xbe\xd9\x42\xe4\xaa\x47\xd3\x70\x78\x0c\xe8\xb3\xcd\xa6\x9f\x37\x7d\xf1\xa0\x70\x0b\x24\x73\x4c\x09\x48\x67\x64\x8e\x72\x44\x35\xf1\x13\x4e\x6b\x56\x7a\x5a\x14\xab\xeb\xb6\x2d\xd4\x79\xad\x54\xce\x17\x67\xa2\x9e\x59\xc7\x9f\xbc\x57\x4c\x84\xd8\x15\xed\x13\x0c\x44\xf9\x9c\x99\xc8\x3c\xa0\x63\x65\x7a\x16\x9d\xd7\xe9\x6a\xcb\x7c\x03\x29\x76\x86\x41\xbd\xfa\xd0\xd5\xab\x0f\x95\x39\x2f\x90\x18\x67\xe4\x67\xe2\x51\xe6\x89\x32\x90\x41\xc7\x4f\x95\xa3\x1a\x66\x98\x2a\x53\x94\xce\x6d\x9a\x0a\x6d\x7d\xed\xee\x64\x41\x6c\x14\xc4\x45\x41\x4c\xe4\xe2\xa1\x1a\x16\x0a\xde\x61\x7e\x00\x1f\x40\x86\x4a\xce\x3a\x1b\x7b\x5c\xea\xa3\x9c\x06\x12\x42\x69\x97\x34\x1a\x16\x19\x52\x83\x9a\xe4\xbc\x1d\x90\x03\x9c\xff\xf6\x55\x74\x0c\xda\x31\x1c\xdc\x15\x46\x69\xb5\xa6\x12\x9b\x85\x91\x1c\x4a\x6b\x58\x58\x90\x88\x10\x42\x1d\x0c\x50\x6a\x80\xae\x8d\xb3\xd9\x65\x21\x0c\x62\xee\x3a\x1a\x6d\x3f\x17\x0f\x5e\x34\x1d\xb3\xa6\x97\x76\x0c\x1b\x1c\xa8\x66\x49\x0d\xea\x60\xbb\x95\xc9\x56\xd1\x21\xb1\x1f\x9b\xb2\xa6\xca\x23\xb8\x1c\x37\x40\x04\x28\x6d\xf2\x94\x8e\x87\x70\x50\xd3\x90\x44\xd1\x16\xc9\xa0\xc3\xdf\x6b\x57\xc3\xcd\x0a\x6c\x8c\xe3\x88\x24\x9e\x71\x9c\xff\xf6\x8c\xe3\x2a\xf1\x53\x49\xd8\xe2\x42\x24\x4f\xce\xe8\xb9\x66\x87\xfd\xb0\x8e\xda\xbe\x66\xae\x96\xd9\x53\x60\x84\x0e\xbd\xed\x0c\x8d\x8c\x1a\x6c\x60\x54\xdb\x8e\x01\xd9\x63\xc5\x82\x71\xd2\x1c\x91\x85\xbb\xf3\xb8\x38\xb7\x1c\xb7\x15\xa0\xba\xec\x92\x9a\x36\xa9\xac\x31\x71\x9c\x3b\x20\xa6\x6d\x42\x88\x18\x7c\x0a\x6f\x08\xf6\x7c\xc4\x3e\x10\x14\x25\xd1\x20\x84\xad\xa0\x75\xf6\x3a\x71\x5b\xf9\xe8\x4b\xa7\xac\x73\x0f\x5e\xfa\xd6\xd4\xee\x02\x1a\xf5\x31\x85\x13\x8e\xca\xa9\x08\xcd\xe7\x2c\x73\x91\x54\x22\xb3\x9b\x16\xe2\x06\xd4\x26\xf7\x1e\xeb\x97\x43\xc4\xa9\x77\xee\x9a\xfe\x73\x74\x05\x0a\x93\xd4\xad\x9f\xc5\xf1\x10\xe3\xdc\x68\x70\x94\xff\xec\xd7\xff\x2d\x27\x62\x1d\xc6\x19\xfa\x3a\x82\xff\xdd\x93\x9f\x91\x65\xef\x2f\x52\x16\x3d\x35\xc5\x2a\xe9\x81\x9f\x2b\xd2\x33\x1f\x41\xf7\x2b\xd4\xbb\xe9\x19\x37\xaf\x1e\x2b\xd7\xa4\xb7\x85\xff\xdd\xcb\xce\x7a\xd7\xc5\xba\xf7\x31\xab\x2e\x84\x6f\x76\x9e\x17\x1f\x25\x70\xc2\xaf\xf9\xa4\x2d\x2f\xfc\x69\x07\x17\x7c\x5b\xee\x57\xb3\xdb\x96\xef\xcd\x0d\xbc\x5b\x43\xeb\xcb\xa2\xf8\xb0\x5e\x69\x26\xd8\x70\x46\x8a\x3d\x3c\xd1\xd8\x4e\xdf\x2f\xc3\x84\x9e\x28\x48\x6d\xbe\x30\x17\x59\xbb\x95\xa8\xe7\x42\x67\x73\xb4\xbe\xbc\x4c\xcb\x6b\xdb\x9a\xa3\x2d\x11\xb0\xee\x39\x2f\x9d\x9c\xa6\x8b\x0f\xcf\xb3\x3c\x6f\x8c\x67\x34\x67\x66\x60\xcb\x54\x77\xad\x70\xb3\x01\xbb\x77\x41\x4d\x58\xef\xaf\x88\x6c\xf0\x1b\xea\x8c\x4d\x92\x65\x01\xfe\x64\x11\x67\xef\xe4\xa3\xf3\xbc\x38\x6d\x7c\xbb\x73\x02\xc2\xc5\x85\x76\xf5\x61\x96\xd1\x31\x40\x60\xda\xbb\xf7\x47\x78\xd2\xd0\xf6\x85\x43\xbb\x29\xe9\xd2\xd1\xa5\x05\x5d\x86\x7c\x0f\x81\x00\x3b\xa7\x73\x3f\xf9\x00\xa3\xe2\xbd\xbd\x3c\x4f\xfd\x51\x2d\xaf\x93\xf8\x66\xb7\xb6\xea\xd1\xb0\x96\x90\xa6\x3f\xb4\xcc\x71\xeb\xe7\xed\xc5\x4f\x3c\x26\x37\x74\x01\x1c\x7f\x21\x8b\xc3\x3b\xa5\x1f\x73\x43\x07\xde\xdd\xdb\x9f\x6c\x48\xa6\x78\x84\x71\x68\x1f\x7d\x3f\x8c\xc0\x65\xd3\x3b\x35\xf1\x46\xdf\x6c\xd8\x54\xb6\xee\x22\x75\x03\x8e\x83\x14\xc9\x6a\x53\xdf\x8c\x6b\x8b\x74\xf4\x37\x9c\x13\x6a\x2c\xc8\xcd\x9c\x22\x3e\x6d\xd3\x77\x05\x78\x6c\x86\x34\x2b\xee\xea\x4b\x77\x02\xbd\x93\xda\xc4\x05\xeb\x56\x5f\xaf\xda\x91\xc7\x31\x68\xc1\x92\x61\x08\x69\xc1\x9c\xf5\xd3\x13\xa9\xf5\xdd\x33\x69\xf9\xd0\xe0\x82\x7a\x87\x7b\xe2\x28\x07\x5e\xea\x23\x86\x07\x74\x5c\xe9\x5c\x03\x48\xdb\x76\x19\x56\x08\x8f\xc2\xb8\xa3\xd6\x59\x27\x23\xd6\x06\x0c\x3e\xd9\x22\xdd\x03\x9d\x48\x89\xa4\xc3\x6c\xd4\x8a\xff\x84\x00\xdb\x81\x98\xdd\xf7\x2e\xa5\xe3\xcf\x6f\x38\x1f\xda\x60\xa2\xd5\xf8\xcc\xa2\xa5\x16\x5f\xa8\x76\xa4\xd4\x4d\x19\xfb\x38\x0c\x87\xae\xd0\xe0\x98\xa2\xba\x7d\x3c\x27\xed\xd0\xae\xed\x3c\xc4\xd7\x6d\xb4\xef\x55\x4b\xc2\x10\x0b\xa4\x62\x33\x5b\xf7\x79\xb3\x49\x93\xfc\x3e\x62\x8d\x85\xf1\xcf\xf8\xab\x2d\xdc\xc5\x33\x74\xef\x8b\xb1\x34\xb5\x71\xd6\x26\x25\x23\xdf\x18\xb6\x73\x63\x98\xb1\x7d\x88\x12\x01\x36\x2a\xb3\x08\x65\x5d\x40\xa5\x93\xe7\x3e\xec\x79\x23\x92\x63\x61\x32\x95\x69\x0a\x7c\xfd\x4b\x4b\xc6\x3a\xbb\x37\xe3\xdf\x00\x41\xfd\x11\x2a\xa5\xd7\x0d\x20\x1d\x50\x0d\x3d\xe5\x4e\x11\xee\x5b\x45\xf2\x11\x50\x28\x8d\x14\x9c\x64\x35\x5a\x23\x6f\x47\x16\xbc\x59\xa1\x88\x53\x90\xf9\xc0\x90\x85\xa7\xd7\xfc\x74\xda\xd2\x72\x46\xe6\x63\xbe\x7c\xc8\x27\xe1\x60\x01\x9d\xc0\xd2\xbb\x12\x75\x34\xd3\x59\x19\x14\x69\x1f\x68\x6f\xc1\x88\x62\xff\x58\xb8\x5c\x63\x2b\xed\x86\xe8\x31\x67\x75\x03\xd1\xf5\x22\x7d\x70\x03\xd2\xe9\x1c\x33\x99\x06\xba\x79\xe5\x42\xdc\x5b\x30\x89\x67\xb3\xdf\xfa\x86\x32\x7e\x16\x81\xe1\xd9\x1c\x93\x30\x9a\x64\x73\xb8\x75\xe8\x44\x90\x39\xe8\xae\xb4\xfa\x05\x0b\xd2\xba\xc9\x96\x99\x4d\x48\x1d\x2c\xd9\x1c\x53\x44\x7c\x88\x10\x59\xda\xa0\xcb\x2b\x3e\xcf\x68\x9a\x77\x00\x83\x87\x8d\xbb\xe8\xb8\xe9\x74\xe5\x70\x9c\x35\x0e\x51\xee\xc4\x6c\x3e\x31\x09\x79\x65\xf8\x74\x88\x1e\x13\x25\xcc\xdb\x32\x04\xb6\x8e\x44\x87\x19\x6e\x07\xa6\xf7\x12\x07\xf8\xd4\xac\xab\xd2\x06\xab\x11\x3e\x3a\x17\xb6\xb5\xfa\xc3\x09\xe8\x97\x9b\x4d\x26\x74\x33\x8f\x4a\xf1\x8f\xc8\xaa\xe6\x9d\x01\x45\x2a\xd7\x93\x7b\x12\x3b\xbc\xb1\x3d\x20\xea\xe2\x19\x74\xe8\xb1\xca\x82\x45\xcd\x5f\x25\xe7\xa5\x5b\x98\xe9\xa1\x7e\xe3\xf8\x44\xcc\xe6\x93\x7a\xe3\xa6\x73\x17\x2a\xe4\xc4\x2a\xfc\x1b\xc8\x45\x70\x93\xbb\xbf\x2d\xb4\x50\xee\x28\xc7\x5a\x93\x12\xe3\x34\xf9\x30\x9a\x32\x95\x1d\x6b\x5c\xca\xb4\x20\x71\x4c\x4d\xbe\x2c\x54\x6e\x36\xa0\xd2\x11\xa2\xc5\x5d\xe2\xb0\x8e\x99\x84\x91\x0a\x6e\x35\x15\x62\x62\x49\xd3\x92\xe8\x32\x91\x82\x5b\x9f\xcd\x51\x81\xa9\x79\x45\xbd\x57\xaa\xd4\xbf\x5c\x47\x36\x1b\xce\xd1\x02\xff\x0a\x2a\x38\x31\x83\x0e\xd1\x42\xff\x39\xe2\x5b\x53\xa1\xc5\x5c\x0b\x87\x47\xc4\x57\xf5\x64\xc2\x9c\x17\x60\x38\x6d\x9a\x06\xd9\x5e\x3a\x77\xf4\x47\x8e\xc5\xf0\x77\xe2\x05\x17\x5d\x03\x8a\x4c\x79\x9b\x53\x40\x9d\x10\x0a\x91\x77\x5b\x1b\x0f\xd5\xdc\x43\xb1\x07\x6d\x91\x10\x6e\x50\xcf\xb7\x26\x9b\xb4\xd2\xc1\x50\x88\x80\x30\xbd\xa6\x79\xae\xb4\x32\xa8\x44\x85\x36\x13\x59\x6d\x26\xce\x50\xe5\xeb\x33\x71\xca\x9f\x78\x1a\x4d\x9c\x23\xc1\x36\x06\x55\x9a\x78\x81\x2a\x6d\xa1\x76\xd4\xb5\x45\x5d\x49\x5b\xf8\x5a\xd7\x42\xfb\xa5\xa1\xca\x0a\xe9\xf4\x36\x42\xba\x8b\xd6\x2c\x84\x6b\xdb\xc9\xe7\x5c\x4b\x47\xc9\xab\xa8\xa6\xb6\xbc\x53\x91\x8b\x91\x4f\x9f\x23\x12\xe7\x8e\xb9\x59\x64\x34\x77\x1d\xdc\xa6\x38\xa6\x3a\x50\x46\x24\x3a\x28\x07\x94\x03\xf4\xdd\x1c\xf1\x9b\x47\x38\xcc\xf6\x47\x1e\xc0\xa6\xfa\x66\x28\xd3\xb8\xd3\xca\xc0\xf2\x33\x02\x0a\xa8\x5b\x2e\xa0\x41\xca\x6b\x93\xc5\xfe\x60\x84\x96\x78\x34\x59\x3e\xc4\xeb\xc9\x52\xd7\x2c\xb8\x10\x9d\x2d\x65\x67\x17\x4e\x67\x80\x0e\xf4\xcf\x3b\x25\xbc\x9b\x9b\xbe\x2f\xe0\xb6\xc4\x39\xa2\x22\x2f\x65\x14\x21\x82\xd3\xb6\xeb\x43\x8c\x09\xd9\xd1\x89\xcb\x47\x75\x3d\x39\x45\x99\x2c\x5d\x3a\x87\x88\x6e\xc1\x27\xe2\xdc\x8f\x67\xe4\x8b\x6b\x57\xdc\x47\x54\x7a\x4c\xac\x8a\x8f\x60\x34\x44\xec\x60\x64\x48\x91\x78\x5e\x16\x6b\xba\x04\xe4\x0e\x85\x77\x65\xda\xd9\x17\x5d\xc5\x74\xd0\xfb\x5b\x5c\x6e\x03\x9f\xf6\x46\xea\xa2\x60\xe2\xb7\x99\x28\x0c\x80\x7f\xb0\x6a\x65\x67\xd0\xba\xc8\x5c\x6f\x60\x3e\x50\x9d\x72\x97\xac\x20\xea\x04\x52\x37\xad\x11\x2b\xb3\x4b\x20\x02\x32\xde\x70\x8e\x2a\x8e\x95\xea\x3b\x1a\xca\x2a\x9b\xa1\x7c\x6a\x14\x66\x38\x5a\x7d\x8a\xdc\xd4\x5f\xd4\xe4\x36\x9e\x0d\x0e\xe6\xd3\xd9\xf1\xf2\x38\x99\xcb\x04\xfc\xf3\x3b\x22\x95\x71\x2e\xd5\xdf\xb3\xd1\xdc\x70\xa0\x65\x5b\x99\x81\xc3\xa3\xa3\xde\x9a\x66\xcc\xa9\x37\xe0\xe6\x72\x19\x47\x46\xeb\x4d\x6d\xcd\xcb\x74\x90\x69\x18\x7b\xc1\xc5\x40\x12\x88\x5e\xdf\x25\xd4\x98\x74\xfd\x64\x8e\xfb\x43\x51\xe0\x04\x44\x1f\xb3\x25\xbb\x40\x17\x24\x3b\xbf\x60\xe8\x32\xa3\xbf\x8a\xdf\x97\x19\xfd\x97\x7a\x94\x7e\x52\x8f\xd2\x4f\xea\x51\x4e\xce\x18\x62\xc5\x0a\x9d\x16\x8c\x15\x97\xa8\x14\x4f\xcf\x0a\xca\x8e\xb2\xbf\x08\x2a\xd6\x8c\xb3\x44\xf2\x2b\xf5\xe3\x8d\x4c\x0e\xb5\x4a\x97\x9c\x37\x7c\x5f\xac\xf4\x9f\x2f\x79\x5f\xea\xef\x27\xb2\x3b\xf5\xeb\x9d\x1a\xbe\x3c\xcf\x28\xff\x40\xfe\x25\xda\xcb\x3f\x55\x73\xf9\x43\xb6\x3e\x15\x79\x31\xde\xa5\xcb\x6c\x5d\xa9\x1f\x72\x1a\xf2\xef\xf7\xc5\xca\xfd\xc9\xfb\x72\x7f\x8b\x3e\xdc\x07\x72\x04\xf9\x84\x91\x4f\xa2\x6a\x05\x65\x68\x45\xca\x6a\x45\x16\x2c\xbb\x22\x91\x4a\x17\x10\xa1\x08\x3a\x97\xe7\x2d\x09\x45\xca\xa1\x35\x5a\xa2\x0b\x3f\x8b\xc2\x10\xb5\x15\x9c\xcc\xaa\x77\xe4\xb2\xb8\x4a\x73\x1b\xca\x34\xce\xbc\x32\x94\xf2\x6f\x91\x03\x27\x75\x6a\x52\xf2\xbf\xc4\xc3\x1c\x19\xf3\xdc\xb8\x10\x39\x26\x33\xb2\x54\xc5\xcb\xaa\x71\x55\x8b\x90\x5d\xd4\x23\x64\xd7\x4e\x38\xec\x12\xa9\x0a\xad\x17\x32\xfc\xf5\xb5\x30\x47\xbc\xeb\x34\xa8\x34\xcd\x29\xce\x02\xb5\x2a\x27\xad\x8c\x3d\xe5\x44\xa4\x18\x55\xa2\x5a\x19\xd0\x7b\x8b\x4b\xd8\x8e\x05\x82\x39\xe3\xbd\x6a\x67\xa4\x2d\xe3\xa1\x63\x03\xda\xc2\x2d\xd0\x33\x4b\x74\x02\x4f\xa4\x07\xf1\x69\x72\x97\x0e\xc3\x30\xed\xf5\xa5\xcd\xa2\x3b\xd1\x5c\x7b\xd1\x78\x2f\xc8\x1c\xa5\xb8\x9c\x96\x89\xd3\xb9\x10\x96\x9c\x12\x46\xd9\x34\x6b\xbe\x4e\xfd\x69\xed\x0e\xa3\x44\xca\x9b\x7f\xcd\x29\xf9\x12\x9b\xf5\x9a\x78\x8b\xfa\x13\xa3\x53\x79\x4d\xd0\x85\x6c\xef\xce\x82\xa2\x5c\x18\x3e\x6d\xa3\x35\x44\x2b\x5c\xc4\x71\xe1\x3e\xbc\x6a\x7e\x59\xa2\x15\x6f\x7b\x6e\x44\x84\x6b\x63\xd4\xba\x34\x7f\x9d\x62\x91\xb9\x3f\xc2\x18\x97\xe8\x10\xeb\xf4\xae\x8a\xcd\x4f\xab\x2a\x3b\xa7\xc0\xff\x75\xb3\x45\x4b\x88\x56\xa2\x82\xe7\x62\x3a\x9b\x8f\x55\xbc\xaf\x59\x98\x75\xc7\xe3\xbb\x72\x81\xae\xd0\x21\xaa\xf8\x54\x8e\xf0\x50\xe4\x4b\x0a\xa2\xd0\x23\xeb\x09\xea\x5a\xa2\x15\x67\x75\xc4\x49\xec\x5a\x5b\x4f\xd5\x89\xbd\xe5\xb0\xd5\x80\x7f\x71\x1e\xa7\x62\x5c\x19\x1d\x79\x8d\x2e\xd1\x11\x5a\xc3\x49\x78\x60\x2d\x78\x6b\x16\xa5\xc4\x67\xe0\x1a\x51\x91\x74\xa3\x66\xce\xef\xc2\xfd\xa5\xc6\xfd\x3a\x05\x0a\xb8\xb4\x9d\x78\xd7\xbf\xab\x97\xcc\x50\x10\xda\xc7\x98\xc5\xf1\xb9\x10\x94\xa8\x96\x80\x7e\xc1\x25\x01\xe7\x4e\x2e\xe1\x7d\xb7\xe2\x31\xfa\x45\x6e\x84\x23\x8f\x3c\xbf\x1d\x92\xa9\x94\xa1\x4e\x27\x94\x10\x16\xaa\xb7\xd2\x95\x4a\x21\x1a\xc3\x5b\x94\x41\x34\xb3\xe3\x6a\xd7\x93\x91\x6d\x51\x86\x7f\x05\xcd\xd1\xe0\xbe\x55\xc7\xac\x5a\x65\xc6\x74\xcd\x39\xe1\x46\x27\xab\xfb\x6e\xbd\x85\xed\xc8\x22\xdd\x4c\x53\xa8\x59\x76\x3f\xa5\x74\x8b\x5b\x9c\xca\xe9\xc0\xa5\xe2\xdc\x61\x54\x41\x8e\x29\x01\x39\xca\x10\x83\xda\xdb\x80\x3a\xdb\xd8\x52\xa3\x5c\x24\x01\xcd\x5b\x5a\x3a\x55\xc7\x09\x2a\x50\x2e\x62\x58\x66\xc5\x1c\xe7\x32\x37\x75\x69\x21\xe0\xe9\x0e\x08\x70\x54\xc5\x35\x60\xa0\x2d\x94\xc6\x85\x00\xe5\x20\x64\x88\xec\x73\x51\xb6\x32\x23\xa2\x1e\xbc\x16\x9a\x99\xd6\x1e\xca\xbf\x5b\x6a\x03\xc9\x97\x33\x99\x97\x7a\x2e\xd0\xd7\x73\x93\x5e\x1c\x75\x26\x16\xbf\xd9\x4a\x75\xf1\x1f\x4a\x14\x91\x5d\x21\x5b\x38\xa2\xf9\xca\x96\x8e\x80\x88\x3a\x0b\x68\x9b\x5d\x60\x89\x2a\xc9\xbc\x48\x96\x00\xb8\xdc\xa3\xd7\x00\x0d\xd8\x9d\xa5\x79\x7e\x9a\x2e\x3e\x38\x39\x58\xea\x84\xce\x29\xc6\xf0\x8e\x9f\xa6\xce\xcb\x61\x93\xca\xf8\x09\xa6\xeb\x09\xfb\x6c\x9e\xec\x59\x48\x32\xe8\x0f\xb7\xfe\x07\x6e\xba\xec\xa1\xcd\x91\x3d\xdc\x22\xc6\x89\xb7\x7b\x68\x5d\xe6\xf3\x9f\x04\x43\xd4\xed\x3f\xcb\x29\x85\x1d\xed\xd1\xd0\xaf\x22\xdb\x1d\x64\xee\x71\x25\x6d\x40\x56\xcb\x2e\x65\x79\x95\x4c\xc9\x1c\x86\xf3\x80\x32\xfb\xbc\x3f\x83\x6e\x0e\xc4\x1d\xbb\x79\x8e\x1e\x1d\xd6\xa5\x67\xd5\x9d\xb3\xac\xec\x1f\xc4\xd6\xd8\x6b\xe8\xae\xa7\x8d\x67\x54\xe8\xb3\x65\x11\x45\x36\x87\xe3\x40\x83\x38\x06\x52\xbf\x2d\x0a\x4b\xf3\xcb\xfb\x4f\x99\xb0\xe3\x17\x82\xfe\xba\x1d\xb2\x3f\x2d\x96\xd7\xd2\xdb\xd2\x77\xd8\x69\xbf\xe7\x27\x36\x0f\xa5\xe3\x22\x93\xa7\xd7\xa4\xac\x9e\x5c\xbf\x58\x9a\x87\xea\x19\x9e\xcd\x03\x20\x54\x92\xf3\xac\x62\xdd\xa1\x11\xb3\x39\x2a\xf1\x79\xd3\x8c\x2e\x13\x04\x68\x26\xa1\xa3\x8e\x93\x38\x9e\x5a\x29\xba\xe5\x5a\xbc\xf2\x33\xe9\x2b\xd6\xdc\x4a\x91\x54\xe5\xce\x3f\xa6\x11\x84\x70\x52\x5f\x38\xa7\xde\xd6\x4d\xef\x44\x8c\xf3\x56\x2c\xb7\x9b\x95\xb5\xdc\x47\x86\x17\x60\xd8\xd8\x63\x34\xf4\xbc\x0c\x99\x53\xc7\xd2\xdd\x84\x44\xa7\xcf\xe4\x0c\xa9\xe3\x09\x69\x9c\x1a\xb5\x5a\x72\x36\x97\xaa\x15\xcf\x89\x79\x77\x2e\x1b\x94\x7d\x7e\x85\x4e\x51\x9e\x04\x69\x5f\x3a\x6f\xcb\xd0\x42\xf3\xa3\xfc\x00\x8b\x29\xa0\xf8\x63\xe3\x74\x0b\xf4\x0e\x3d\x47\x37\x5b\xfe\x5f\x86\xfe\x49\x50\xde\x62\x2e\x94\x12\xfb\x19\x58\x38\x2e\x9a\xb7\x65\xc3\x84\x20\x2f\xb3\x4f\x6d\xe1\x18\xe4\x4e\xd2\xea\x92\xfc\xb9\x26\x15\xf3\xb2\xb7\x2e\x0b\x52\xd1\xaf\x55\x4e\xdf\x5e\x51\xf6\x2e\xd2\xaa\x97\xe6\x25\x49\x97\xd7\xbd\x53\x42\x68\x6f\x49\x2a\x56\x16\xd7\x64\xc9\x29\x8a\xc8\xf8\x93\xef\x01\xa7\xf2\x5c\x3e\x0b\x50\x73\x1f\x50\x83\xa9\x1f\x19\xbc\xd9\xa3\x6e\xab\x40\x39\xa5\x01\x31\xb7\x74\xb6\xc0\x1d\xc2\x34\xb9\xd5\x0c\xea\x1a\x57\x80\x06\x73\xb2\x32\xbc\x90\x69\x90\x6c\x3e\x0f\xcd\x3a\x27\xee\x4d\xe1\x64\x4e\xd0\x1b\x58\x83\x71\x07\x97\xf0\xe3\x59\xa3\x75\x52\xd0\xa7\x72\x63\x41\x93\xca\x94\x89\xda\x74\x15\xc9\xed\xa0\x1e\x93\x81\x74\xed\x38\x2c\x89\xb6\xbb\x92\x45\x9d\x13\xa6\x67\x09\x27\xcc\x8c\x60\x72\xa7\x86\x66\x3a\x71\x72\xb9\xeb\x09\xe8\xb4\xe0\x0c\x4e\xe8\x23\xac\x3d\x68\xf5\x5b\x55\x12\x98\xa2\x91\xe3\xff\x61\x86\xde\x35\xc7\xda\xe8\x22\x67\x6f\x17\x94\x71\x3a\x69\x32\x40\xe7\x19\x15\x09\x7a\xaf\x49\xd9\x2b\x75\x1e\x8b\x65\xef\xf4\xda\xd1\xa4\x39\x07\x63\xa6\x97\x73\xac\xdd\x41\xac\x25\x27\xb9\x02\x0c\x45\x91\xfc\xcf\x74\xb2\x06\xcd\xbd\x15\xda\xdf\x12\xba\xa5\x35\xb7\x6e\xf5\xf6\xcb\x34\x9c\x7b\x4b\x0e\xc6\xd9\x75\x43\x48\xfa\x4a\x1d\xa9\x90\x1c\xff\xe9\xf0\xb5\xb5\x23\x55\xce\x7d\x54\x05\xb7\xf1\x8d\x88\xc6\x99\x38\x18\x00\xdd\xe0\xb6\x55\xba\x96\xc1\x70\xe2\x0f\xff\x9d\x28\x6c\xc4\xdf\x89\x3f\x1a\xef\x58\x5a\xea\xb7\xfc\x4f\xff\xfd\x59\x46\xb3\xea\x82\xbf\x96\x7f\xf9\x6f\x33\x9a\x89\x4f\xf9\xbf\xfe\x9b\x8a\xb0\xb7\x85\xe2\x98\xc6\x59\xe2\xfc\x74\xab\x6b\x97\xb3\xe1\x1c\x7a\xdf\x69\xb8\x1f\x2b\x31\xcb\xdc\x18\x95\xbd\x5a\x38\xfe\x48\x67\x2c\xbe\xbd\xbc\x03\xce\x52\xab\xb4\xc3\xe2\xb5\xde\x69\x40\xc4\x6b\x47\xc0\x7c\x42\x9c\x7a\xf0\xe4\xe0\xcf\x35\x59\x93\x65\x84\x7e\xf6\x1f\x2f\xb3\x8a\x83\xe2\x32\x42\x7f\x12\xb7\x5c\xbc\xfb\xe6\x57\xc2\xa9\xc7\x6f\x04\xdf\x70\x01\xa0\x5a\xa5\x0b\xf2\x62\x39\x8e\x22\x54\x11\xf6\xbc\x28\x95\x3e\x6f\xdc\x1f\xa9\x07\xaf\x8a\x2b\xc2\x7f\x5d\xa4\xd6\x4c\xc4\x7f\x97\xbc\x21\x59\x3e\x21\x67\x45\x49\x24\x9b\xba\x1c\xf7\x47\x5b\xf4\x55\x5b\xd7\xba\xa7\xc6\x40\xfb\x75\x3d\xdc\xa2\x7f\x13\x1c\x9d\x9c\xd0\xf3\x13\xd5\x22\x42\x3f\x75\xd4\x50\xbb\x0a\x17\xc2\xde\xcf\xa8\x11\x45\x21\x39\x4d\xad\xc9\xa9\xe1\xc1\xe2\xb8\x51\xc1\x37\x12\xb7\x29\x82\xc6\x5a\x25\x7e\xab\x5c\x3b\xa0\xc4\xd9\x54\x99\x5c\xc7\x0c\x4e\x4b\x29\x2e\x98\xfc\x6e\xbf\x72\x4c\xa6\x70\x60\x2a\x9b\xf9\x01\x80\xa9\x03\x4f\x36\x28\x70\xe2\xfe\x36\x12\x1b\x08\x3c\xc5\x37\xdb\xbf\x37\x50\x2f\x3d\xad\x8a\xf2\xb4\x35\x50\xcf\x54\x83\x08\x45\x90\x05\xfa\xdd\x2b\x92\x4c\x94\x64\xa4\x33\x32\x17\x45\xb0\x55\x58\x99\x8c\x7d\xd3\x57\xe6\x47\xa2\x34\x72\xe8\x3f\x92\x75\xff\x89\x80\x1f\x09\x44\x84\xdd\x8a\x7d\xcf\x96\x9a\x71\xbf\x28\x2a\xf6\xcc\x77\xaf\x3f\x21\xf4\x3c\xa3\xc6\xb9\xde\xf2\xe3\xbe\x06\xc9\x61\xe3\xc5\xcd\xb5\x0d\x14\x01\x7f\x29\x70\x3e\x6f\xe8\x7b\xcb\xf3\x21\x6d\x30\x2a\xbf\xea\x8c\x56\x07\xd1\x80\xa1\xca\xfa\x69\x7b\x8d\x42\x47\xbb\x17\x45\x51\x89\xbc\x24\x91\xf3\x26\xdf\x14\xa9\x1a\x34\xf0\x6b\x4b\x03\xe5\x60\xbd\x82\xd6\x98\x2d\xd5\x5b\x8f\x5c\x11\xca\x9c\xe4\xfc\x14\x7d\x1d\xf5\x4e\xc9\x82\x23\xff\x96\x4f\xbc\x18\x8b\xe8\x38\xf2\xb9\xc4\x7e\x04\x9d\x32\x9d\x54\x24\x37\x68\x15\x5d\x6e\x31\x51\x3f\x1c\xc4\x9b\xa2\x29\x3b\x20\x17\x93\x55\xbd\x35\x95\x65\xc5\x96\xfd\xaf\xe5\x6c\x22\x49\x9c\xfa\x18\x64\x98\x8b\x93\xd1\xb2\xa0\x9c\x64\x66\xcd\x29\xb5\x14\x32\xe8\xdc\xb0\x66\x01\xf0\xe0\x66\x05\x0a\x8d\x8a\x09\x4a\x1d\xda\x19\x08\x03\x21\x22\x88\xf3\xd5\x85\xc4\xe3\x63\x86\x56\x17\x69\x45\xc6\x14\x2d\x94\x7c\x3e\x2e\xb7\x13\xc5\xc9\x17\x3a\x9f\xb2\xe9\x4c\xdc\x08\xa5\xda\x78\x72\xfd\xcc\x98\xab\x6f\x6c\x0a\xea\x00\x48\x6d\x36\x40\x24\x39\x7f\x0a\x91\xfc\x57\x24\x95\x66\x10\x09\xf7\xac\xff\x10\x8f\x81\x49\xcd\x30\xe9\x19\x23\xe5\xf3\x5c\x94\x3b\xad\xfb\x1a\xe4\x86\x37\x2c\xe0\x84\x08\xde\x30\xd7\x0c\x21\x41\x23\x88\x52\x0b\xe3\x33\x36\xdf\x6c\x14\xd6\xe5\x3f\xb6\x4e\x2e\xe5\x6e\x41\x5a\xe9\x7f\xfc\x2b\x23\x11\x53\xe3\x19\x66\x9e\xb0\xc8\x19\xa6\xd6\xbc\x82\x3e\x27\xea\x74\xd2\xc2\x86\xee\x02\xa3\x5a\xfd\x59\x2e\x57\xc9\xfa\x94\x84\xf6\xf4\x0a\x15\x74\x34\x58\x52\xd6\x9e\xfc\xd0\x37\x22\xa1\x0c\xf7\x41\x83\xe2\xde\x0f\x52\xdc\xfb\x73\xb8\xd9\xb8\x3f\x4d\x2a\x41\xbb\x2d\x80\x41\x94\x0b\x9c\x48\x95\x17\x5d\xb6\x44\x22\x62\x52\x8b\xbf\x61\x70\xd3\x59\x62\x8b\x56\xb0\xea\xfc\x5a\xe6\x93\x2d\x38\xa5\xd4\xe0\x5d\xcc\x98\x96\xae\x7f\x22\x1a\xf5\x66\x4b\x71\xd7\xfb\x80\xc6\x31\x6d\xe3\x02\x60\x1c\x57\x71\xbc\x48\x3c\x32\x09\x6c\xac\x35\xe2\x5d\xe3\x05\xe2\xe4\xba\x12\x90\xbe\x50\x0c\x03\xc6\x3f\x92\xcd\x46\xb1\x0f\x7d\x8c\xd5\x73\x6d\x16\xab\xdd\x38\x23\xac\xd8\x2b\x27\x53\x84\x86\x08\x28\xf1\xd8\x19\x5c\x26\xd9\x32\x8e\x49\xe2\x1a\x3f\x39\x6b\x43\x12\xc9\x69\xf2\xbf\x8c\x84\xb6\xd5\xd9\x42\xd3\xa4\xa6\x61\x04\x6a\xae\x7a\x05\x88\xff\xa5\x72\x3c\xa3\x0b\x5d\x92\x6c\x29\xc4\x8a\x7e\xa6\x8c\x4f\x13\xde\x51\x53\xf3\xc7\xdb\x0f\xb7\x9e\xd8\xaa\x16\x2a\x2c\xbe\x3f\x89\x79\x49\x71\xa3\x1a\x0c\x5c\xea\x2a\x11\xd3\x4d\x9b\xcd\xda\x2a\x38\xc7\x4b\xc7\x54\x5d\x19\xeb\xf4\x02\xc9\xad\x1c\xe7\x28\xab\x9e\x37\x26\x36\xbe\xd8\x42\x74\xa1\x01\xeb\x09\x81\x28\x4f\x0a\x2a\x1c\x91\x5c\x1c\xb4\x50\x6f\xb7\x50\x36\x78\x5a\x50\x52\xc7\x51\x0c\x97\x0d\x39\x36\x87\x13\x26\x70\x55\x59\x17\x62\x19\x1a\xe9\x44\xeb\x65\xeb\xa9\x6b\xc8\xb7\x09\x3e\x33\x4c\xdd\xce\x33\xd1\x39\xd5\x9d\x66\x42\x32\x0e\x09\xf5\x39\x44\x6b\xf3\x57\xbe\xe5\x47\x16\x52\x21\xfa\x7a\x0f\x54\xd6\x3d\x9e\x1d\x45\x62\x1f\x97\xbe\xdd\xb1\x3f\x32\xae\x54\x19\x1e\x4e\xb2\x87\xba\xe5\x24\xd3\x3e\x54\x29\xa6\xb3\x4c\xe1\xbc\xfa\x0d\x4b\xe1\x66\x43\x66\xe9\xbc\x8f\x31\x9b\xa5\x73\xd3\xe9\xd6\xe8\xe4\x81\x66\x2a\x2d\x1c\xca\x6e\x57\x9c\x05\xbb\xd2\x10\xac\xf3\xd2\x28\xa8\x35\x1f\xad\x20\x3a\xaf\xb5\x59\x18\x08\x37\x6d\x26\x2b\x9d\x7a\xd6\x03\xd3\x92\x70\x82\x2b\x91\xf3\x4a\xc5\x41\x75\x93\xad\x1f\x01\x41\x57\x10\xfd\x04\x08\x3a\x87\x2e\x05\x5a\x92\x76\x1a\xe4\x39\xed\x7a\xba\x13\x87\x66\x74\xa3\xbb\xa6\xb5\x8f\x63\x75\xdd\x97\xc8\xd7\xd0\xc2\xae\x06\xd4\x5c\x9c\xa1\x64\x81\x96\x1c\xa7\x96\x88\x36\xd2\x0a\xbb\x15\x41\xa8\x88\x57\x21\x5b\xe8\x3a\xfc\x8a\xb4\xda\x6a\xaa\x87\xe9\xe2\xa2\x3d\x3a\xa8\x6d\x7d\x26\xf3\x78\xdb\x2a\x4c\x83\x89\x4b\x73\x77\xdc\x30\x11\xf1\xd1\xa5\xfa\xf4\x50\x26\xea\xee\xd3\xcc\xc0\xe1\x0e\xaa\xec\x9c\xa6\xb9\x92\x93\x9f\x17\xe5\x0b\x4a\x49\xa9\x08\xe3\x3e\x56\x5f\x6f\x44\x2f\xe4\x9a\xa0\x3f\x64\x81\x85\x36\x13\x6d\x9f\xcc\xfe\x4d\xe6\x4e\x05\x28\xd5\xcb\x19\x61\x8b\x8b\xd7\x9a\x72\xd8\xf9\x8b\x8c\xec\xca\x6b\x38\xa8\xfa\x34\x75\x03\x15\x50\xbe\x24\xe9\x15\xb1\xd9\xa3\x39\x23\xd1\x1f\x09\xe6\x08\x8e\x69\xd2\x38\x72\xa1\x46\xa9\xed\xa1\xbd\x43\xa6\x9f\xaa\x8e\x64\x8d\x02\xb3\xe3\x98\x5a\x86\x73\x41\x30\x38\xe9\x7d\xc2\x82\x0c\x4b\xd3\xcd\xa6\xb8\xf9\x63\xa4\x9b\xf5\x2e\x3b\xb8\xcc\x7b\x99\x79\x0c\xac\x3e\xfe\x4c\x6f\xb2\x98\xd1\x8f\x04\x95\x70\x42\x4d\xcc\x3f\x15\x3b\x99\xd7\x1c\x40\xbc\x59\x5e\xa6\xe5\x07\x35\xc3\xc7\xd2\xc1\x8b\x2c\x0d\xf7\x45\x50\x7f\x28\xaa\x62\xc6\xb1\x48\xec\xdd\xa4\x6c\xc6\x38\x68\xa0\xbd\x2c\x16\xa4\xaa\xc4\xf6\xbd\x2e\x96\x72\x7b\x91\xa1\xee\xfd\x91\x13\x11\x41\x56\x69\x49\xfc\x8d\x36\xf7\xb4\x1b\xf9\x21\x8a\x5b\xae\xb7\xdc\xe5\xfa\x8d\x68\x3f\x0b\x1a\xc7\x65\xad\x4a\xf6\x24\x1c\x93\xa3\x28\x94\xac\xa4\x2e\x98\x1a\x51\x36\x20\x85\xf0\x46\xd6\xb1\x4e\xad\xbb\xbd\x3d\xaa\x74\x1e\xe2\x77\x0a\x5c\xce\xd2\xf9\x66\xf3\x1f\x82\x2a\x57\x5f\xb1\x30\xfc\x2f\xdf\xfe\x14\x09\x75\x79\x37\x2f\xb4\x0f\x23\xe4\x16\x31\x1f\xe7\x0e\x23\x54\x18\x46\xa8\xd2\x8c\xd0\x22\xcc\x08\xf5\x87\xc2\x0d\xc2\x95\x94\x38\xac\xf0\x23\xbe\x25\x7a\x92\xe5\x85\x17\x17\x59\xae\x7d\xff\x84\x2d\x5b\x29\xf3\xbb\x31\xa1\xac\x8c\xd5\x57\xc6\xeb\x56\xec\x32\x34\xe5\x80\x25\x1b\x5a\xca\xbd\xb3\xb8\x43\x9f\xa6\xe5\xbb\x14\x55\x2f\x2d\xba\xfe\xc9\xf3\x4f\x54\x20\xa3\x22\x23\xd2\x38\x4e\xf5\xad\xca\x70\x7f\x28\xf5\xba\x9a\xbf\xc9\x31\x99\xe4\x38\x57\x49\x6a\xf8\x16\x4d\xa0\x2c\x76\x1c\x00\xc3\x9c\xc3\x8f\x53\xdc\x54\xeb\x11\xbb\xaf\x07\x87\xf1\x0c\x96\x3b\xaf\xef\xc8\x2b\x1a\x5c\x60\x81\xeb\x27\xa0\x5f\x6c\x36\x05\xc6\xf8\x37\x02\xe3\x18\x94\x2d\x3c\xca\x0e\xa4\x89\x8c\xad\x48\x9c\x91\xdd\x5d\x71\x01\x93\x93\x82\xaa\x53\x3c\x2c\x2e\x57\x92\xe4\x21\x51\x9c\xc3\x49\x69\x52\x91\x92\xb5\xc3\x90\x2c\x85\x16\x52\x7c\x19\x6e\xa9\x4c\x33\x2a\xef\x84\x05\xd6\xdd\xc8\xc3\xd4\x95\xe8\xb9\xb2\x44\xa8\x60\xaa\x4a\xf4\xaa\xc0\x42\xdd\x7b\x63\x97\xb4\x70\xa4\x6d\xa6\xe2\xf6\x07\xb1\x52\x2a\xbc\xb2\xf3\x36\xfc\x2e\x39\x22\x2e\x9e\x39\x37\x57\x5f\xa3\x15\x48\x91\xf7\x02\x95\x89\xb9\xc5\x8a\x4b\x2d\x13\x75\x97\x95\xe4\x38\xa1\xc9\xc9\x32\x65\x29\x26\x68\x0d\xf4\x02\x10\x4b\x84\x82\x07\x51\x24\x43\x59\xf8\x35\x57\xb5\xf7\x39\x2c\x91\xe5\xf3\xa2\x54\xd6\xc1\x29\xdb\xc1\xc3\x66\x2e\xd3\xa3\xeb\x09\x97\x0e\xf5\x36\x0a\x50\x9a\x54\x85\x2b\x32\x11\xd7\x88\x6f\x71\x93\x70\x6f\x31\x85\xe5\xb9\x30\xd3\xf2\xce\x64\xab\xc7\xb8\x14\x4a\xc0\x6c\x5a\x1e\x64\x63\x56\x67\x81\xb4\x6b\x8d\x61\x5d\xcc\x39\x51\x63\x4f\x9d\x8e\xc6\x07\xa3\x2d\xdc\xc7\xa6\xe9\x09\x4e\xb7\xe4\x06\xbb\xf1\x5a\x5d\xe9\x8c\x1c\x18\x27\x1a\x4b\xaa\x42\xc6\x29\x4b\xdb\x01\xbc\x3f\xf2\x21\xbb\x01\x8a\xb2\xd4\x0d\xe7\x67\x71\x7f\x08\x11\xc3\xfd\xbe\x77\x07\x3c\xf7\x1f\x97\x61\xd7\xd9\x66\x44\x81\xb9\xcd\x86\x59\xed\x3b\xbb\x9d\x96\xbd\xee\x24\xb3\xd3\x47\xa6\xae\x6a\xa7\xe4\xe3\xbf\xec\x56\xd5\xf4\xe8\x75\x76\xbb\xe5\xad\x8f\xdd\xfd\x46\x35\x34\xed\xbf\xd4\xd6\x35\xbe\x82\xca\x78\x09\x4b\x8a\xe4\x13\x19\x9d\x52\xa7\x49\xb7\x4d\xb2\x1d\xa3\x98\x51\xe9\x68\x8c\xe9\xc0\xbe\xc8\x2a\x66\x4d\x08\x67\xfc\x0a\x3e\xa7\x8e\xd5\xe1\xe3\x05\xa1\x3f\xad\x33\xc2\xdc\xa7\xd4\xe1\xda\xff\xe5\x5a\x32\xdc\x85\x98\x32\x62\xcf\x28\x23\xa5\xd9\x4c\xdd\x87\x79\x2d\x28\x50\xe3\x75\x03\xb9\xd7\x02\xdb\xb7\x01\xdb\x44\x93\x22\x74\xa4\x64\x08\x53\x0f\x73\x29\xfe\x74\xf7\xb3\x3d\xa4\xd6\xbb\x0b\xde\xa6\x06\xf1\x30\x6b\xbf\xdd\xe2\xad\xd5\x90\xa9\x30\x5c\x2e\x3a\xa0\x7a\x5e\x43\x23\x34\x75\x71\x46\x22\xa7\x09\x33\x3e\xe0\xbe\xd7\x86\xbe\x22\x8a\x29\x6a\xc1\x66\x5e\x53\xc4\xa0\xd2\x49\x9c\xa6\x79\x4a\x17\x76\x16\x7c\xb5\xa2\xba\xfd\x18\x84\xae\x8f\xcc\x05\x82\x74\xce\x11\x75\xee\x2e\x50\x00\x66\x72\x01\xd5\x00\x56\x38\xfc\x38\x9e\x5b\x81\x91\x77\x17\xea\xf7\x8f\x45\xc7\xd8\x09\xe6\x5c\x94\x7e\xd7\x6c\x95\xae\x4d\x2f\xd4\x5a\x93\xec\xe0\x00\x6a\x5e\xa9\x6b\x7f\xfc\xee\x67\xd9\xdc\x43\xb3\x0c\x6a\x7d\x82\x3f\x0b\xad\x31\x1b\x8c\xd0\x10\x09\x79\xc2\x70\x68\xa6\x1a\x59\xf0\x8b\xa1\x68\xef\x98\x6d\x6b\xcd\x54\x05\x57\xef\xb4\x5b\xae\xab\x3a\x18\xe2\x02\xd8\x3e\x8e\x7e\x6d\x27\x65\x2a\x10\x6f\x36\x40\xb5\xaa\xc1\xab\x64\xd0\x10\x6d\x0c\xd7\x51\x11\xa9\x1e\x59\x12\x1a\x37\x8e\x4b\xeb\xef\xc0\xbf\x50\x70\x5d\x43\x98\x83\xc1\x6e\x22\xdc\x91\x0a\x56\xa1\x48\x4f\x6d\x21\x94\x37\xc2\x71\x36\xc8\xc1\xd0\xd6\xbd\x57\x4a\x9a\xd2\x85\x16\xa7\xd6\x73\x68\x99\x2a\xc8\xbc\x7e\xe2\x5a\x1f\x5b\x6a\x65\x6f\xa3\x85\xa3\xf3\xd5\xec\xc2\xad\x14\x1e\x9a\xd9\x60\x9e\x22\xb1\xb6\x13\x3b\xeb\xe0\x35\x57\x64\xd3\xf5\xb4\xa8\x82\xda\xd9\x10\x1b\x6a\x1f\xa2\xa8\x9e\xe2\xda\x5e\x6f\x57\x11\x42\x21\x92\x6a\xe2\x32\xa8\x26\x2e\x67\xd9\x7c\xee\xda\x35\x3c\xbd\x4a\x10\x12\x24\xff\x2d\x83\xea\x73\x9b\x94\x76\x4f\xcb\x97\x72\x90\x2a\x05\x32\xf4\x3c\xa1\x9a\x00\x97\x9d\x01\x6d\xf0\xe8\x59\x05\x8d\xec\x24\xa8\x0a\xe9\x96\x83\x5a\x06\x17\x92\x1c\x1f\x2a\x8e\x85\xe7\x92\xf5\xb3\x11\xae\xff\xee\x03\x81\x38\x13\xeb\x99\xc3\x91\x99\xdc\xc9\x0e\x52\xef\x7a\xdb\xa5\xd6\xdb\xae\xa5\xb1\x82\xe1\x94\xc3\xb0\xbd\x94\x2d\x47\x41\x94\x28\x64\xd7\x2d\x73\x70\x94\xfe\x18\x35\x1a\xe4\xba\xb2\x35\xde\xb7\xe7\xf3\x0c\xb2\x39\xa6\x92\xb6\xf5\x5e\x77\x04\xe9\xa7\xc6\x83\x2a\xc8\x9e\x4c\x9b\x8c\xa0\x62\xab\xb5\x17\x8e\xff\x4e\x26\x6d\x90\x46\xc9\x9f\x89\xce\x93\x16\xfa\x5e\x1b\x92\xfd\x77\x56\xa7\xbd\xd0\x5d\xec\xa9\x86\x09\x83\x8e\xaa\xf3\xd2\x3c\x95\xb1\x2e\xce\x9f\x4d\xb3\xc4\xf6\x0c\x18\x2a\xd5\xa4\x83\xfa\x06\xa5\xd1\x2d\x21\x32\x6a\xb2\x4e\xba\x26\xd2\xa4\x88\xf2\x09\x69\x92\x2d\xfb\x18\x13\xfe\x57\x6d\x3c\xd7\x95\x2e\xa0\x4a\x60\x6e\xf0\x63\x68\x56\xed\xdb\xd1\x05\xc6\x8a\xad\x43\xe2\x76\xf9\xbe\x6d\xa4\xe6\xcc\x56\xfa\xbe\x6c\xb4\xd5\x4b\x6e\x4f\x6f\x4f\x27\x2e\x54\x9c\x56\xdb\x21\x25\xb2\x1b\x13\x20\x3a\x0e\x7a\x7b\x4a\xdf\x60\x27\x3d\xf0\x1e\xc3\x7a\xa2\xb8\xf8\xde\x65\xaf\xbc\xdc\xbd\x75\xe5\x03\xf1\x95\x0f\xa2\x63\xb7\x95\xae\x9a\x61\xdb\xe9\x27\x0c\x65\x0d\xd9\xbb\xa6\x4f\xda\x4f\x17\x1c\xb4\x7a\x04\x54\xb9\xc4\x2b\x4b\x2f\xc6\x7b\x2c\x62\xa7\xed\x80\xcf\x8b\xd2\x1a\x3b\xb6\x10\x0d\xfb\xb8\x4b\x7a\x54\x09\x63\x40\x78\x22\x7f\x09\x7d\x64\xf7\x3c\xa4\xd7\xaa\x9c\x86\xea\xdb\xcc\xe6\x0d\x75\xe7\x52\xdf\xaa\xf6\xa9\xef\x70\x33\xe9\x30\x75\x85\x2d\x5d\xda\x3f\x60\x4a\x1a\x9a\x22\xdc\x1f\x8e\x3d\x9d\x87\xe5\x1c\xf6\x59\xd8\xbe\x33\x0d\x6a\x64\xdb\x27\x6c\x73\x0f\x28\x9f\x60\x67\x5e\x5c\x6c\x7e\x47\xe8\x92\x94\x19\x3d\xe7\x8c\x55\x77\x72\x21\x27\xa2\xec\x6d\x59\x5c\x66\x15\xa9\xab\xef\x48\x4d\x93\xac\xe9\x7f\x65\xdf\x74\xd8\x4f\x98\xf0\xb4\x60\xde\x14\xeb\x96\x94\x9d\xb7\x80\x68\x8e\x40\x78\xa8\xd4\x39\x82\x33\x20\xde\xe3\xdf\x08\xa2\x2e\xe3\xa4\x53\x37\xb6\x69\x72\x27\x1d\xcc\xb5\xdf\x91\xe4\xf3\x83\xba\xe2\x36\x2c\xce\xe7\xe2\x4f\x74\xeb\x5e\x21\x19\x87\x67\xb5\x77\xe8\x4f\xa2\x45\x87\x20\xbd\x16\x69\xee\x20\x0a\xdd\xc2\x3f\x09\xbf\x86\x2d\x69\x08\x3b\x3a\x73\x61\x99\xb3\xe3\xbb\x32\xc3\x7d\x66\xc1\x82\x83\x91\xd4\x4a\x6b\x89\xb6\x21\xa3\x4b\x0c\x13\x7c\x17\x36\xe9\x1b\xe8\x0f\xeb\x03\x64\xce\xb3\xa0\x3e\x4d\x17\xb7\x86\x41\xad\x56\x9d\x0d\xf4\xd9\x2a\x05\xfc\x96\xa7\x1f\x4e\xca\x87\xbb\x3f\x98\x94\x83\x01\xac\x94\xc4\x1e\x6e\x39\x2b\xe7\x28\xa2\xe7\x07\x15\x4b\xcb\x03\xc9\x38\x92\xa5\xe3\x77\x1d\x54\x23\xe8\x2d\x6b\xaa\xe0\x74\xf2\xd8\x30\x1b\xa0\x96\xa1\x19\xa6\xd9\x7c\xc2\xca\xeb\x1b\x2d\x5a\x9f\xf9\x72\x99\xa8\x77\xb7\x3d\xcb\x68\x9a\xe7\xd7\x46\x5b\x91\xe2\xe1\x24\x7d\x98\xe9\x05\xa6\x83\x01\xcc\x66\xe9\x1c\x68\xc6\xc6\x1a\x8b\x86\x93\xfc\xe1\xee\xc9\x4c\xf2\xc1\x00\x2a\xcb\x50\xcd\xc4\xda\xf1\xf1\x2c\x9f\xdb\x2d\x6a\x57\x44\x76\x1e\x4e\xa3\x51\x68\x7a\x46\xa5\xa9\x55\x94\x9d\x28\xd9\xd1\x8b\x77\xab\x34\xbd\x5a\xd2\xda\x0f\xd0\x6d\x30\x09\xab\x41\xb5\x73\xd1\x94\x4b\x92\x01\xbc\x1b\x28\x07\x56\x9b\xde\x16\x8e\xf7\x68\xe4\xf0\xe1\xc6\x03\x28\x2c\x8a\xb4\x06\x12\xa9\xe3\xb4\x6e\x9c\x55\x38\x58\xed\x2c\xcd\x72\xb2\x34\x3e\x9e\x4e\x7c\xf5\x31\x75\xc2\x8c\xbc\x08\x36\x47\x19\xe0\xc3\xec\x1e\x36\x5b\x15\x01\x9b\xc9\xe4\x5a\x5a\x75\x5c\xf0\x9f\x26\xf2\x10\xad\xcd\x5f\x4b\xf3\xd7\x85\x31\xa4\x07\x64\x99\xd0\x8e\x5e\x28\x09\xc9\x26\x40\xc4\xb4\x8e\xbf\xbd\x08\x17\x1d\x12\xd3\x1f\x42\xa4\x50\x8c\x8b\x48\x64\x7f\x6c\x56\xce\xb5\xff\xe2\x0a\xfb\xba\xd2\x73\xfc\xb8\x2c\xd3\x6b\xc1\xa0\x82\xa0\x86\x42\x28\x21\x20\x44\xd7\x38\x67\xe0\xbc\xeb\x96\x40\x2f\x31\xc8\x70\x72\xdd\x12\x34\x28\x37\xf7\xdd\xe0\x74\x30\x98\x5c\x5a\xa5\x6b\x67\x6a\x24\x21\x32\x52\x19\x27\xa8\x37\xe7\x90\x9f\xc0\x63\xa3\x61\x39\x32\x7f\xfd\x82\x87\x93\x5f\xf6\xc1\x24\xbf\x68\x4d\xca\x87\x2e\xf9\x7f\xf6\xcb\x1c\x9d\xe0\x0f\x82\xa9\x38\x89\xe3\x13\x9f\x50\xc7\x31\x38\x94\xd2\xd2\x07\x88\x1e\x8b\x0d\xff\x00\xd1\x49\xe2\xca\x44\xd3\x26\x21\xfe\x20\x0f\xd2\x47\xe2\xad\x94\x59\xed\xc2\x63\x93\xf6\x70\x7c\xa4\x46\x92\x71\xda\x1f\xcd\xc6\xff\x4b\x1e\x93\x73\xaa\x8f\x21\x9c\xfc\xab\xf3\x28\x9e\x8b\xa3\xf8\x78\xfb\xa3\x40\x4a\xfd\xef\xe0\x93\xee\x43\xbf\xd4\x22\x6f\xe7\x08\x0b\x67\x84\xee\x99\x7f\xbc\x75\x7f\x87\xe1\xd0\x9a\xb0\xbb\x8e\x03\x6c\xaf\x38\xb0\xbd\xe4\xff\xfb\xd4\xad\xad\xff\xf4\x08\x0f\x27\x9f\x0e\x0e\x60\x48\xe9\xfe\x69\x9e\x84\x0d\xf5\x6d\x31\x3f\x26\x8a\x48\x1a\xad\x53\x1b\xea\xcd\x89\xd9\x2b\x23\xa6\xd3\x1d\x7c\x88\x49\x20\xa2\x38\x63\xa1\x75\xb2\x7a\x30\xcd\xa4\x0b\x06\xcd\x89\x4b\x55\x75\xf6\xfa\xab\xcd\xa6\x4f\xdb\xac\x0b\x2b\x94\x42\x74\xa1\xce\x22\x85\xe8\x4a\x1d\x73\x2a\xb2\x07\x25\x0d\x01\x5c\x24\xa7\xbc\x42\x17\xa8\x12\x14\xf9\x5c\x15\x78\x8a\x63\xfd\x97\x9e\xf4\x4b\xb9\xbc\x73\xe5\xb8\x91\x9d\x81\xca\xb8\x6e\x85\xbc\x8f\xd5\xbb\x1f\x41\x8a\xce\x13\x9b\x83\x4b\x96\x7e\xec\x8a\xf5\xfd\x49\x7c\xa1\xd3\x73\xf1\xf6\x62\x23\x32\x93\x63\x56\xc8\x35\x21\x77\xa0\xff\xa5\xf9\x9c\x3b\xf5\x7d\x3a\x25\xbe\xb6\xc4\x9a\x22\x47\x50\xa9\xea\xd7\xcb\xd1\x74\x87\xa6\xda\xdd\x4d\x66\xcf\x6c\x7c\xae\xdd\xa2\x98\xc9\x8b\x96\x6e\x21\x3a\x4f\x6a\xd9\xcb\xba\xa6\x23\x82\xea\xd1\x6c\x0e\xad\xd1\x10\x9d\xef\x4c\x91\xd4\xe6\x75\xed\x65\x6b\x50\x96\x8f\xb5\xc6\x07\xe5\x66\xb3\x56\xf8\xac\xd4\x74\x01\x86\x72\x4c\x3b\x19\x98\x0c\x72\xdd\xca\x79\xed\x0a\xf7\xef\x70\x07\x5f\x3a\xf3\x58\x7e\xfe\x3c\xf8\x4c\xf8\x32\x5f\x7a\xcb\xfc\x9d\xb3\xe1\x2f\x83\x5d\xfc\xae\x32\x0d\xfc\xc3\x61\x83\x5c\x67\x19\x19\x02\xa3\x18\x28\xc9\x5c\x8d\x05\x83\x84\x88\xbe\x7b\x1d\x33\xd3\xbd\x1f\x78\x69\x11\xc5\xf7\x02\xb7\xbe\xba\xa5\x2b\x88\xeb\x2c\xfe\xbb\xc4\x35\xcf\x0c\x21\x7b\x61\x92\x3a\x84\xb9\x4f\x8d\x19\x35\x3a\x2c\x85\xe6\x98\xc1\x38\x06\x2f\xd4\x8e\x8b\x9d\x3e\x39\x15\x6a\x48\x43\x8b\x9f\x08\x75\x9e\xc6\xa8\xae\xdc\x2e\xea\xec\x1a\x88\x47\xcf\xa0\x2c\xd9\xbf\xcf\xe0\x54\xc6\x81\xab\x24\xf8\x4a\xa6\x00\x42\x19\x4c\x6a\x43\x78\xf9\xb5\xd6\x79\x1e\xc6\xfb\x67\xe0\x19\x62\xf6\xaa\x10\x88\x7c\xb5\x92\xe4\xe6\xde\xe3\xc3\x86\x6b\xb9\xdd\xf1\x0b\x7e\x3c\x6b\xb4\xe4\xcb\x78\x63\x76\x33\x65\xe0\x8d\xab\x18\x40\x47\x68\x29\x93\x30\x84\x59\x52\xdd\x49\x1c\xbf\x37\xb6\x02\x39\xfa\x5b\xd3\x67\x1b\xd1\x4f\x19\x78\x8b\x34\xdd\x40\x0a\xfc\xf9\x62\xd6\x28\x4d\x3e\x08\x23\xdf\xfb\x8e\xfd\x7d\xa3\x9d\x58\x29\x7e\xab\x95\x5c\x6f\x54\x9c\xd2\x8e\x14\x73\xfc\xe8\xa1\x9e\xe8\x6b\x4e\xb6\x9f\xf2\xff\xfd\x81\x6f\xb6\xfb\xc1\x93\x20\xb5\x8a\xea\x16\xd8\x83\x0c\xe9\x48\x29\xa1\x4d\xe8\x93\x2e\xf4\x0f\x53\x70\xb0\x1b\xb9\x33\x54\x78\xc8\x3d\x35\xa2\x01\xee\x0f\x51\x9a\x14\x57\xa4\x2c\xb3\x25\x79\xaf\xb3\x3c\x82\x22\x31\x19\x1f\x7d\x5a\x90\xea\x0c\xbe\x7f\xf0\x59\xbd\x10\xea\x91\x47\x23\xeb\x2a\xb0\xc6\x0c\x2d\x39\xbe\x58\xe3\xb5\xe7\x86\xa9\x02\x42\x5e\x88\x7d\x5d\x0b\x2c\xb3\x82\x37\x0b\xbc\x52\xc6\xfd\xa5\x4e\x72\xb1\x5d\x76\xdd\xea\x17\xea\x38\x16\x1c\x28\x79\x97\x67\x86\xe2\x5b\x57\xd4\xd4\xbb\x02\x05\x7a\x86\x72\xf4\x16\xbd\x91\x2e\xe0\xbc\x83\x77\x24\xcd\x55\x12\x85\x33\x88\x16\x18\xe3\x3f\xe0\x6b\xb3\x40\xe3\xb5\x79\x85\x69\x58\x5b\xbb\x80\x93\xab\x38\xbe\xb2\xba\x0e\x5d\x17\x51\x76\x8a\x2b\x70\x05\x4d\x3a\xf0\x54\x2b\x1e\x7e\x14\x07\xe1\xd0\x65\x74\xdb\x83\x7b\xaa\x7b\x44\x17\x06\xfb\xd8\x51\xf8\xfb\x76\x48\xcb\xeb\xd9\x4c\xb2\x33\x20\x34\xb8\x2e\xaa\xa7\xb8\x92\xdc\xad\xbf\x49\x54\x39\x2a\x86\xb5\xd3\xee\xd2\xa7\x24\xa9\xae\xe9\x42\xfe\x78\x76\xc5\x29\x34\xf0\x5b\x40\x5f\x61\x6d\x18\xde\x7f\xe2\xe1\xe4\x9f\x0f\x0f\xb5\xa8\xf4\x4f\x2d\x2a\x3d\xc1\x87\xb3\x7f\xce\xd1\xcf\xf8\x89\xe6\x25\x17\x0c\x3c\x41\xcf\x21\xea\xff\xbc\xd9\xf4\x7f\xf6\x04\x1f\xf9\xc9\x9f\x4a\xa1\xb7\x50\x55\xae\xf8\xb3\x5f\x55\x3a\x97\x27\x70\xf2\x6b\x1c\xff\x6a\x8e\xee\x4f\xb7\x94\xdd\x9f\xe8\x0a\xfc\x0a\xed\x9c\x7e\x0b\xd8\x15\x9e\x48\xbb\x02\xfa\x0a\x0f\x27\x5f\x3d\xfc\x4d\xcf\xf7\x2b\x3d\xdf\x7f\xab\x81\x7e\x9b\x7d\x35\x87\x93\x7f\xc7\xf1\xbf\xdb\xc7\xfa\x37\x84\x32\x8b\xea\x7f\xf0\x9f\xed\x88\xb5\x4f\xac\xdf\xeb\x16\x4e\xfe\xa3\x35\x2c\x6b\xa9\xb6\x43\x4f\xd0\x7f\x94\x91\xb0\x21\x54\x3c\xb1\xe6\xf6\x43\xab\x2f\x7a\xdd\x26\x93\xb8\x91\x69\x82\x04\x34\xf5\x37\xce\xe1\x19\xbf\x8b\x7a\x74\x9d\x70\x81\x0d\xc4\xd5\x49\x01\x4e\xe4\x26\xd9\x42\xf4\xfa\x76\x7e\x96\x96\xfb\xe9\x8f\x50\xa9\xac\xf0\x9a\x85\x89\xe3\xb2\x21\x25\x53\xe9\x66\x19\x34\xb9\x18\xd2\x1d\x6a\x54\xb3\x76\x84\xda\xd6\x95\x16\xa1\x36\x01\x03\x62\x60\xa1\x22\x2a\xdb\xfa\xfd\x58\xf7\x93\xf6\x00\x2c\xa3\xe8\xab\x9b\xd2\xdb\x7c\x57\xda\xbb\xf2\x34\x7e\xf5\xee\x02\x2c\x46\x97\x2d\xf3\x4a\x25\x84\x77\x52\x4f\xe4\x7b\xd9\x91\xf8\x61\xa5\x38\x97\xbe\x5b\xae\xbe\xb1\x23\xec\xd2\x54\x7a\xe8\x67\x9b\x4d\x86\xf1\x8f\xa4\x85\xcc\x6a\xe3\xd9\x66\xd3\xaf\x6a\xc1\xb7\x7d\x5c\x6e\x36\xa9\x65\x32\xf4\x55\x01\x74\xb3\x29\xa1\x98\x54\xda\x71\x2b\x85\xb5\xa7\x8f\x3d\x7e\x6b\xb3\xe1\xa0\xd8\xc7\xde\x38\x22\x3a\x35\x75\x0c\xc4\x01\x06\xb1\xd3\xc1\x0b\xd9\x38\x27\xcf\xdd\x3d\x90\x18\x7a\x2a\x4d\x1e\x63\x82\x8a\xee\x06\xcc\x63\x0c\x2b\xfc\x0a\x30\x47\x24\x13\x5a\x77\x49\xe8\x1b\xf6\x96\x52\x5a\x9a\xcd\x4c\x2a\x4c\xfa\x18\xa7\x68\x81\xcf\x00\x55\xf1\xd0\x59\x90\x3f\x25\xa8\x92\xe5\x28\xb4\x2d\xba\x5b\x07\x71\xee\xd1\x20\x38\x61\x89\xdc\x39\x45\x31\x39\xed\xf2\x1e\x00\x8f\x69\x45\x0b\xe7\x64\x05\x46\xaf\x92\x0a\xc0\x49\x1f\x94\xb8\x4a\x28\x80\x30\x59\x16\x94\x4c\xe0\x02\xc0\xed\x42\x64\x58\x5c\xc3\x9b\x2a\x21\x9c\x07\xd1\x36\x85\x2a\x39\x03\x70\xcb\x05\x6a\xe6\x09\xd4\xbe\xb1\x7f\x67\xb4\x1a\xca\x50\xee\x6a\xd2\xd1\x1a\xfb\xfb\xbf\x74\x4e\xf6\x82\x33\x8e\x2b\xa3\x5c\xbc\x32\x7f\x9d\x63\xe7\x88\xfc\x9c\x65\x4c\x5f\x07\xd3\xcd\x64\x25\xc4\x3a\x55\x71\xe1\x0c\x57\x9a\x7a\x9e\xc5\xf1\x59\x12\xf2\x98\x80\x8e\xad\x35\x4d\x7e\x7f\x0d\x9c\xe2\x10\xaa\x62\x84\xec\xec\x1c\x57\x7d\x8c\x97\xe8\x3a\x90\x79\xde\x7a\xfe\x2e\x99\x8c\x19\x62\x5b\x00\xa8\xb8\xb9\x15\xdc\x6c\x7e\x25\xb0\x91\x6d\xcd\x08\x6c\xb5\x03\xdf\x42\xd8\x71\xfd\xfa\x06\x02\xf9\xb5\xb6\x3e\xf2\xd5\x16\xa2\x4b\x9c\xa9\x11\xd1\xa9\x62\x7c\x2a\x88\x0e\x45\xae\xc2\xa2\x96\xa8\x90\x39\x89\x0a\x2f\xd1\x29\x44\x8f\x71\xe1\x27\x78\x63\xe8\x10\x5d\x4b\x7e\x29\xa9\xd6\xa7\xba\xd2\x4f\x1c\x97\x9c\x07\x94\xbb\x8c\xce\xe5\x0e\x1c\xe9\x38\x32\x2e\xc4\x54\x70\x72\x54\xe3\xa4\x1e\x73\xd6\x4d\xc0\xe5\x91\x49\x22\xf3\x78\x0b\x27\x17\x2d\x52\x59\xd1\x86\x3c\x1d\xa7\x10\x5f\x6a\x6b\x35\x75\x07\x51\x8b\xd0\x34\xf5\xb8\xb0\x91\xd2\x05\x29\xce\x44\x4d\x56\xe1\xb7\x24\x2f\xa0\x16\x39\x4a\x8f\x4d\xcc\x70\x69\x88\x3d\x15\x41\xa9\x4e\x9c\xfb\x10\x9b\x08\x74\x99\xd1\x40\xba\x0d\x69\x2e\x58\xf6\x2d\x22\x29\x1b\xfd\xa6\x2d\xfd\xa6\x8d\x7e\x95\x3f\x28\xef\x47\x6f\x63\xb9\xdd\x6b\xb7\xa4\xa2\x03\xad\x76\xaa\x9c\xff\xa9\xc5\xb9\x6b\x5c\x81\x73\xe3\x38\x7c\x1d\xe6\xd9\x3b\xfb\x5b\xe8\xfe\xd0\x4f\x60\xa9\xd0\x9f\xd1\xb4\xb5\x9c\x7c\xe9\xaa\xae\xae\x79\xcb\xeb\x5b\x65\xea\x34\x8a\x42\x6d\x0e\xf7\x8c\x02\x3a\xf3\xa6\xdd\x17\xd6\x99\x81\x93\xc2\xb1\xc1\x0b\xcd\x76\x4e\x0e\x35\x7a\xbb\x90\x14\x37\x41\x86\x0e\xe6\x70\xd2\x63\x50\xbf\xde\x72\xe9\xa5\x69\xc5\x7a\x46\xba\x04\xa1\x62\xab\xec\x75\xe3\xac\x22\xb3\x31\x36\xcb\x43\xa5\x4f\xb5\xa9\xa2\x0c\x63\x6d\x9a\x36\x5d\x6c\x46\x7e\xfc\x89\x79\x20\xfb\xe4\x22\xb4\x35\xf2\x8a\x2a\xd0\xc3\x40\x08\x86\x87\x06\x76\x24\x18\x68\x5b\x8e\xa9\x42\xaa\xd6\x4f\x02\x15\xe9\x6a\x0b\x0d\xe7\xc8\x64\x8d\x76\x33\x3a\x0f\x46\x5e\x98\x9c\x87\x04\x51\xa9\x08\x18\x22\x15\x7c\xd1\xbd\xb1\xc1\xd3\x50\x3b\xd5\xd4\x37\x10\x57\xdf\xe0\x6d\xee\xc8\x2b\x0f\xd7\xb1\x85\x35\xa7\x6a\xb9\x45\xe6\xdb\xc6\x90\xad\x3c\xb1\x3d\x46\xa7\x4a\x65\x4d\xa4\xdd\x33\x46\x5a\x85\x2e\x9a\x78\x7c\xbd\x4b\x22\xed\x77\xab\xfa\xbe\xd1\x5c\xa7\xb9\x92\xf2\x53\xbb\x2b\x93\xe3\x6e\x25\xdb\xb5\x6a\x16\x58\xd0\x65\x4c\x9e\xa5\x58\x61\x58\xfc\x3a\x0b\xc3\x58\x4d\xc7\x6e\xb6\x9c\x76\xca\x1e\x3a\xa2\xc7\xe9\x52\x0c\x0d\x64\x12\x2f\x5b\x2b\x44\x29\x4e\xd5\xba\x89\x3b\x80\xd8\xc2\xcf\x18\x41\xee\x67\x60\x08\x79\x26\xde\x18\x4f\x77\x44\x25\x76\xac\x43\x7f\x19\x58\x8a\x93\xb8\xd2\xb8\xa2\x67\xcd\xa5\x68\x39\x4d\x7d\x28\xf3\x68\x9a\x4f\x2e\xd2\x4a\x4c\x38\xe0\x73\xeb\xa7\xcc\xf2\xe7\xa8\x3a\xb3\x5f\x3b\x5d\x8a\x0c\xa2\xcd\xce\x3a\xba\x51\xf2\xbc\xe9\x40\x24\x1a\xbd\x5d\x0f\x32\x25\xa9\xe3\xd1\x51\x05\xcf\xb5\xb3\x13\x93\x9d\xb4\xe6\x01\xb9\x6b\x4b\xcd\x9d\xd9\x15\x00\xe3\xbb\xeb\x39\x78\x5f\xf7\x64\xaf\x94\xb3\x10\x72\xfb\x65\x10\x77\x11\x6e\x9e\xd4\x6e\x08\xd4\xc1\x51\xaa\x23\x37\xa3\x2a\xf1\x70\x68\x6b\x7f\x3e\x06\x55\x3e\xa7\xc3\xb1\xd7\xad\xf3\x3d\x68\xa4\xee\xd0\x18\x61\xbf\x8c\xbf\x13\xd6\xc4\x8b\x8d\x47\x62\xee\x8d\x54\xf4\xe2\x8e\x1a\xb9\x21\x8e\x47\x18\x73\x39\xbc\x58\x92\xf7\xd7\x2b\xb2\x35\xed\x32\xe6\xea\x8d\x54\xf9\x05\x4e\xc8\xf9\x0c\x26\x8e\xd1\xd2\x79\xac\x32\x88\xb2\x29\x1b\x47\x54\x60\x22\x6a\x3b\x4c\x59\x50\xe3\xd1\x69\x5f\x53\x1a\x86\x4c\x64\x22\x36\x95\x21\xb9\xa0\xd4\x92\xd8\x47\x76\x7b\xb3\x6d\xe9\x56\x2e\x26\x95\x85\x9b\xbd\xf4\xd6\x9c\x65\xcc\xe0\x04\xf4\x6b\xf9\x19\xe3\x18\x94\xc2\x05\xf5\x2b\x82\x72\x1d\x2c\x2e\xa9\x84\x4c\x18\x94\xea\x79\x15\x78\x68\x5c\x6e\x3b\xeb\xbe\xf0\x7d\x48\x67\xc5\x60\x30\xe7\xfd\xe4\x76\x87\x72\x56\x8f\xb5\x54\x79\xd2\x3b\x3d\x26\xa8\x52\xeb\xcf\x44\x77\x43\x8c\x59\xcd\x9b\x57\xe5\x82\xd5\xb2\x30\x60\x10\x65\xa6\x77\x7b\x3c\x26\xb3\x8e\xfe\x6e\xa4\x94\x94\x99\xa3\x3b\x62\xc6\x88\xae\xce\x82\xb8\x96\x0a\xfd\x0e\x8b\x5c\x73\x20\x87\xd3\x7c\x5c\xea\x3f\x47\xe3\x14\xe4\x50\x86\xf4\x68\xf1\xd6\x92\xdf\x56\x5d\x06\x9f\xd7\x64\x24\x2b\xe4\x50\x25\x56\x59\xed\x04\x92\xf5\xfa\x0a\x86\xa3\xaf\xbe\x5a\xe4\x69\x55\x91\x2a\xb2\x8b\xaa\xd4\x8e\xca\xec\x1d\xfc\xf5\xcb\xac\x62\xd0\xf9\x5b\x7a\x5d\x39\x86\x0b\x8a\xc9\xac\x60\xf3\x89\x0c\x38\x14\x7f\xe3\x1b\x3e\xd0\x8c\x89\x72\x3d\xf6\xb8\x16\xbb\x3b\x97\xba\x82\x70\xff\x46\x10\xe3\x3d\x3b\xdd\xae\x99\x16\x43\x5a\xdc\x00\xcd\xdd\x6b\xfa\x54\x72\x96\xc4\x74\xa4\xb4\x08\xc6\xbe\x44\xf1\x70\x42\x1f\xea\x82\x90\x13\xaa\xb5\xee\xa5\x28\x22\x31\x29\x5d\x51\x36\x4d\x7e\x7f\x36\x5d\x32\x93\x82\xa1\x42\x0c\x8e\x99\x4d\x96\x60\x06\xb9\x60\x7e\x3c\x25\x75\x80\xa5\x5f\xda\x34\x6a\x2a\xfe\x4b\xbf\xd5\x77\x21\x94\x8d\xc9\xb9\x2a\xd6\x87\x4a\xe7\x3c\x2c\x21\xa2\x4e\x6c\x51\x7f\x28\xce\x7f\xb5\x43\x72\xba\x6a\x2d\x6e\xf3\x19\xc5\x2f\x0c\x9a\x5d\x5c\x10\xc3\xb3\xef\x0c\x2d\x37\x1f\x6b\x6d\xe2\x33\x99\x99\x97\x5f\x44\xc6\x74\xa0\x9d\x6a\xa4\xd4\x24\x4e\x93\xbf\x48\xad\x49\xad\x9f\x9d\x13\x30\x5b\xda\x16\xa3\xde\x5e\xa0\xa3\x33\x90\xd6\x45\xe7\x44\x24\xaf\x2c\x51\x8e\x9b\x3b\x35\x4b\x65\x92\x3c\xa3\xcc\x9b\xcd\x51\xd5\x28\xed\x91\xa1\x42\xea\xa8\x5b\xf3\xe3\xbe\xdf\x91\x0b\xb7\xd4\xc9\x43\xb5\xeb\xa9\xae\x01\xd2\x55\x4c\xe1\x98\xf6\x0e\x7a\x36\x2f\x6d\x61\xfc\x51\x7b\x07\x3d\x51\x54\x21\xef\xaa\xd7\xf3\x54\x57\x77\xd9\x82\x12\x55\x0d\xc0\x81\x01\xb8\x99\xa5\x73\x9c\x6f\x5b\x8e\xb2\xb6\xef\x80\xa1\x12\xe5\x70\xcf\x70\xea\x1d\x7d\xfa\x09\x09\x3a\x23\x96\x5b\x7a\x32\x89\xe3\x91\x27\xb0\xbc\x10\x8e\x91\x3b\x02\xd8\x9a\xbd\x39\xd1\x94\x8d\xf2\x80\x0a\x52\x3b\x82\x04\x5b\x17\x6b\xa2\xf2\x44\x26\xfb\xcd\xa6\x3f\x42\x4e\x5d\x73\xa5\x8e\xd8\xe5\x59\xdc\xd2\x7b\x5b\xe0\x05\x6b\x84\xc1\x74\x97\x2d\xf8\x47\xc4\xf9\x8c\xc5\x45\x5a\x3e\x66\xc0\x66\x7f\x3a\x07\x97\x80\x42\x74\x0f\xa2\x54\xd6\xb0\xce\x71\x36\x1b\xe9\x1a\xde\x3e\x6a\x48\x54\x7d\x04\x90\x22\x86\x72\xbe\x77\x4e\xfc\x61\x63\xe2\x6e\xd6\x35\x6f\xa3\x77\xc7\xf8\xb5\xce\x37\x75\xe6\x9b\xe3\x94\xcf\xb7\xc0\x29\x9f\xaf\xa7\x52\xa8\x4d\x5b\x45\x03\xe6\xa2\xd8\x4b\x06\xfd\x2c\xaa\x8d\x79\xab\xd6\x76\x3a\x7b\x46\xb7\x7c\x76\x58\xcb\xa4\x65\x22\x62\x38\x57\x24\x58\xb5\xa4\xf2\xe8\x5e\x8f\x36\xef\xea\x2c\xd8\xa1\x1d\xd2\xe1\x57\xb7\x0a\xfe\xea\x1e\xb6\xd1\x03\x08\xc9\x07\x67\x3e\x13\xba\xce\x73\x54\x8a\x7f\xf4\x81\x4a\x77\xe5\xac\x12\xff\x0a\xcb\xad\x66\x38\xa7\x80\xe2\x73\x06\xd8\x6c\x38\x87\x88\xb9\xa5\xef\x4a\xf9\xdc\xba\xde\xce\x21\x84\x63\x26\x8c\xbe\xe7\x32\x55\x07\xdd\x6c\xca\x29\xc7\xa6\x57\xc2\x03\x18\x95\x32\xb0\x57\x90\xf7\x2b\xd6\x34\xa5\xdd\x46\x53\xaa\x13\x0a\x19\x22\x2f\xe4\x5d\x55\x24\xd5\x66\xca\x5f\xea\xb2\xa9\x6e\x29\x55\x3c\x54\xbc\x0b\x11\x2a\x84\x2c\xcd\x65\x2b\xdf\xb2\xca\xe0\x24\xdb\x6c\x5a\x9b\x48\x1f\xb7\x4c\x30\x92\xb2\x6f\xaf\x21\xce\x42\x5a\xcf\x16\x41\xde\x99\xdb\xc3\x91\x49\xe2\xed\xac\x28\x8e\x7f\xf2\xf3\xa6\x37\x17\x1d\x9a\x04\xf4\x56\x3d\xda\x57\x19\xa0\x54\x07\xee\xc7\x0f\xef\xc5\x31\x08\xcf\x21\x38\xa2\xd9\xf9\xd6\xcf\x4c\x8b\xc6\x27\x02\x34\x5b\xa7\xbe\x43\x21\xa1\x15\x18\xde\xe4\xef\xc7\x31\x68\x3d\x48\x6d\x91\x71\xe7\x08\x9b\xfb\x1b\xc7\xe0\xc7\x5d\x67\xd0\xbd\x14\x77\x4f\xc2\x5d\xed\xdc\x93\x5b\x9c\x80\xdc\xb8\xfb\x0e\x3e\x30\x42\x46\x78\x23\x04\x4f\xfa\x2b\x49\x3f\xbc\x4a\x57\x35\x04\x72\x2e\x14\x0c\x4e\x54\x0c\x47\x21\x01\xbf\xdb\xe1\xa4\xb4\xe9\x94\x4b\x2d\x8c\x64\x98\xce\xca\xf9\xe4\x9a\x81\x8c\xcb\xde\x80\x61\x26\x8a\xd0\xcc\xb2\x39\x26\xb3\x6c\x6e\x69\x85\x95\x41\xae\x1d\x95\x46\xa4\x54\x11\x11\xc6\x98\x6c\x36\xd1\x4a\x6b\x6c\x44\x0a\x30\x3e\xc2\x25\xc3\x51\x6a\xad\xce\xa7\xee\x4f\x42\x97\x11\x3a\xec\x14\x26\x74\xfd\x5f\x63\x35\x0e\x08\x15\x0d\x7c\x43\x1d\x83\xcc\x89\xb6\x00\x19\x3c\x23\xec\x40\x38\xd3\xdf\x0a\xab\x11\x4e\xb5\x27\x4c\x96\xe7\xaf\xb8\x80\x92\xab\x07\x52\x20\x7c\x4e\x71\x61\x5a\x70\x28\x76\x8c\x2b\x27\x4d\xcb\x8c\x04\x3c\x69\x61\xd1\xaa\x37\xb5\x33\xe6\x81\xa8\xe3\xf0\x9c\xe2\x90\x51\x2f\x39\xb9\x48\xe9\x32\x27\x9e\x6e\xa9\x89\xb3\x84\x7b\x56\xe0\xb6\x85\x03\x42\x84\x4b\x72\x64\x2a\xcc\x53\xeb\x13\x58\xd3\x9d\x5b\x01\x56\xc1\x0d\x71\xe1\x26\x42\xe2\x70\x35\x67\x52\xc2\x38\xa6\x83\xc1\x96\x33\x25\x0c\x47\xb6\x9e\x1f\x8a\x50\xcf\x96\x85\xe7\x34\xe7\x44\xce\x40\x58\x65\x6a\x97\xc5\x7e\xe7\x1f\x1a\x8a\x2e\x2b\xb7\x17\xe7\xc8\x50\xd4\x78\x21\x2d\x81\xfc\x93\x51\x4f\x0a\x04\x8d\x26\xfa\x7c\x03\x5f\x73\xa8\x81\x10\x7d\x60\xe1\xfb\x2f\x8f\xcb\x06\x0f\x3b\x67\xfc\x34\x65\x24\xa1\xc5\xc7\x3d\x94\xcb\x8f\xc3\xbd\x53\xe1\x82\x2e\x3e\x5a\x46\x9e\x5a\x76\x1d\x30\x00\xed\xe8\xa6\x5c\x53\x9a\xd1\xf3\x68\x6f\xdd\xac\xc4\x1c\x47\xed\x7d\xea\x7a\x8c\x06\x88\xc9\x9d\xda\x39\x9d\xd4\x3f\x8e\x9e\x12\xa1\xa0\x8f\x0e\x6a\x47\xab\xfb\xe0\xe7\x14\x41\x97\x8d\xdf\x5f\xe3\x6b\x3a\xb1\x16\x21\xff\xc2\x74\x95\x1d\x3a\xa1\xe7\xef\x49\xc5\x5e\xa5\x74\x2d\xcd\x67\x15\x4b\x2f\x57\x9b\x8d\x3d\x45\x44\xf1\x88\xdc\xbf\xe3\x94\xf7\x22\x09\xc9\xd3\x55\x45\x96\xbc\x7d\xc2\x8a\xe7\xd9\x27\xb2\x04\xf7\x21\x9c\x10\x5b\x95\x5b\x95\x49\x30\xbb\x16\xc7\xa6\xf0\x36\x3b\xa8\xc1\x0c\x1a\xc2\x47\xd8\x81\xda\x38\xa6\xe6\xb7\xda\x53\xa5\x6f\x6f\xa8\xfd\x77\x58\x0b\x34\x7e\x32\x26\x58\x8b\xb0\x86\x35\x9c\x06\x76\x43\xfb\x10\xee\x4d\xde\x2d\x1e\x34\x43\x37\x4d\x10\x86\x07\xe8\x44\x51\xd5\x2a\xcf\x18\x88\x50\xc4\x29\xd7\x2f\x32\x33\xdd\xa4\x14\x09\x86\x80\x29\x55\x50\xa2\x91\xc5\x29\xba\x7c\x28\x12\x21\xad\xed\x80\x1c\xe2\xc1\x1f\x1b\xa5\x9a\xec\xed\x6d\x9e\x5e\x0b\xa7\xaf\x08\x51\x74\xc4\x54\x4a\x5a\xd3\xfc\x88\x85\xe6\x6c\x95\xd1\xda\x2d\x84\xcf\xe5\xd1\x70\xca\xa7\xef\x2e\x88\xc1\xf1\x2f\x0c\xcc\xe8\x5c\x44\x84\xeb\x4e\x7f\xd9\xad\x3d\x14\xe9\x19\xe8\xdc\xc9\xb9\xf4\x08\x0f\xad\xd6\x59\xfe\x71\x30\xb2\x7d\x7e\x30\xeb\xa2\x53\x2d\xa5\x0b\x83\x9f\xce\xf4\x09\x4e\x19\x9f\x0e\x49\xd2\xe5\x32\xf0\xc2\xf6\x74\xc2\xea\xd9\xcc\x2f\xd9\x80\xe9\x2a\x4b\x7d\x6c\x4c\x01\xca\x42\xa1\x4a\x34\xa4\xf5\x18\x3b\x67\x1f\x26\xf9\xac\x9c\x63\x8a\x28\xce\xed\xd1\x6d\xb7\xb6\x03\xec\x18\x33\x3e\x32\x4f\xab\xa6\x1b\xf1\x49\xcc\x37\x9b\x28\x12\x9c\xc6\xbf\xf6\x62\x24\x50\xd5\x90\x57\x6a\xec\x83\x71\xb2\xd2\x2c\x84\x7f\xc1\xcb\x3a\x5f\x91\x79\x7c\x85\x65\x24\xa8\x91\x37\x34\xeb\x50\xad\xc8\xc2\x4a\x21\x55\xed\x36\x3a\xe1\xed\xca\xbc\x5b\x7b\xa6\x4c\xb1\xee\xd3\xc5\xba\x2c\x09\x65\x47\x34\x5d\x55\x17\x05\xb3\x3e\x0d\x4a\x98\x52\x0b\x94\x3c\x4e\xbe\xd9\x44\x5c\xe6\x4d\xcb\xa8\xee\x07\x92\x0d\xf4\xbc\x6d\x81\xe5\x12\x84\x8a\x87\xed\x32\x65\x3b\x73\x6f\xb8\xe9\xee\xb0\xb3\xdb\x9d\x08\x7d\xb9\xc3\xb8\xed\xed\x4f\xe3\xfb\x1d\xa8\x4b\x5a\xab\x51\x1f\x38\x9b\xf7\x08\x7f\x03\x5d\x79\x8f\x11\xfc\x8d\xd9\x5c\xbe\x3d\x8e\x03\xa7\x3a\xf2\x7c\x5d\x5d\xe8\xc5\xfb\x4f\xd5\xba\xac\xec\xe3\x42\x82\x49\x6b\xee\x3e\x6c\xf4\xee\xad\x6f\xcf\xc4\x09\x35\x98\xa9\xc7\xfa\xab\x59\xb5\x22\x74\x7b\x1e\xfb\x8f\x67\x40\xb9\x36\x96\xde\x97\x8e\xc1\x0c\xdc\xec\x3d\x9a\x73\x4b\xf6\x24\x8f\xe1\x93\xbe\x5f\x3f\xe9\xfb\xfe\x49\xd7\x24\xd7\xf0\x41\xef\x71\xa6\xa1\x7e\x0c\x68\xdc\xce\x94\xae\xa7\xf6\xc5\xd6\x73\xdd\x51\xd8\x5e\xbe\x87\xe3\x46\xcf\xdb\xca\x7b\xfb\xb9\x89\xa8\xd6\x23\xc3\x2a\x28\x65\x82\xbf\xef\x32\xfe\x04\x22\x8f\x51\xf2\x5a\x28\x8f\x8c\x9d\x6e\x21\xee\xe1\x8b\xbf\x5d\x9f\x12\xcb\x2a\x85\x0f\x56\x4c\xed\xde\xfe\xc7\xac\x94\x34\xd0\x5f\x8c\x64\xe6\xf7\x90\x11\x1a\x73\xad\x2d\x76\x0f\xf7\x13\xf1\x99\xf2\xd0\xb0\x31\x23\x7b\x38\x7c\x04\xa8\x47\x1b\xba\xf3\x28\x45\xf0\xdc\x6a\x5e\xa0\xb2\x6d\x77\x16\x2d\xb7\x1b\xa1\xf5\x38\x54\x0c\xaa\xc7\xcb\x79\x14\xb9\x46\x8f\x5d\x60\x71\xc9\x1f\x8a\xce\x8a\xf2\x63\x5a\x2e\xab\x08\x85\xcc\xbb\x81\x0c\x60\x7b\x3b\x8b\x28\xed\x21\x36\x69\x13\x2d\x6a\x1a\xd7\x30\xe3\xa4\x3b\x11\x99\x44\x6f\x26\x00\xca\x4c\xc5\x0b\x1f\xd8\x63\x0b\x55\x1d\x63\x39\xbd\x9b\xad\xc9\xef\xe3\x82\xbd\x9f\x0c\x58\xa3\xc2\x49\xd3\x53\xd3\xe1\x65\x02\x5e\x9a\x25\xbc\x89\x8a\xb3\x33\x0e\x4f\x7d\x5c\x72\x44\x2a\x38\xbb\x29\xf1\x3e\x9c\x95\xf3\xf1\xda\xf5\xe2\x15\x7e\x1d\xdb\x20\x17\xe3\xe4\x8d\x7f\xc5\x3c\x05\xc9\x35\xa0\xc8\x94\x65\x3a\x05\xd4\xe1\xe2\x45\xf2\x04\xc5\x9e\x6a\x66\x5c\x31\x7a\x14\x22\x90\x61\x59\xcc\x40\x3c\x81\x26\xc0\x09\x13\x94\x29\xb1\x2c\xa3\xe7\x8a\x33\xbb\xd9\xf2\x87\x5a\x77\x97\xfd\x25\x35\x3b\x99\x82\xcb\x0a\xbf\x07\x25\x44\x8e\x12\x99\x6a\xe6\xa8\x05\xe5\x35\xe0\xdb\xed\x7a\xb3\xe9\x3b\xb2\xa1\x99\x84\xc1\x49\xfe\x34\x86\x01\x47\xda\xaa\xed\x64\x18\xbc\x21\xf5\x7e\x67\x6c\x6e\x43\x79\x15\x1f\xcd\xe6\x5b\x88\x96\xe0\x17\x20\x92\x7d\xb0\x82\x5d\xaf\x08\x44\x6a\x35\x62\xbf\xdc\xad\xdb\x85\x6a\x9d\xd5\x76\xae\x4c\x61\xb8\xdb\xad\xc7\x5c\x57\x6f\x05\x82\x0a\x9a\xe2\xa1\x88\xe8\x3e\x66\x4c\x78\xe9\x34\x97\x26\xa7\xde\xbe\xb4\x76\x7e\x71\x8f\xd5\x85\x56\xe4\x36\x09\xaf\x4c\x7b\x7e\x35\xcf\x6b\xc2\xef\x52\xd7\x7a\x29\x97\xe1\xfc\x06\x52\xda\x73\x0a\xaa\x6e\x3d\xb5\x95\x85\x75\xa1\x2f\x6e\x6e\x90\xd9\x80\xc0\x1e\xcd\x21\xa2\x5b\x90\x26\xbf\xbf\x86\xe8\x65\x9b\xd0\xd5\xb4\x0a\x2d\x8a\x35\x65\x41\x8f\xf3\xab\x34\xcf\x96\x29\xb3\xc9\x2e\xf8\x9c\x3b\x92\x51\x7f\xf2\xb3\xf2\xba\x09\x00\xbb\x8a\xb2\xf6\x7e\xf7\xcd\xc6\xb5\x6c\x2d\x9d\x9f\x3e\x6b\x94\x16\x28\x83\x76\x7c\xc7\x57\xe1\x85\x76\x53\x70\xaa\xeb\x1b\x0f\xb8\x1d\xdf\x7e\xcc\xe8\xb2\x10\x69\x63\x0e\xe5\x47\x92\x78\x02\x02\x85\xf7\x92\x26\x0a\x9c\xaa\xea\xc4\x25\x1d\xab\x10\x2a\x00\x4c\xdb\xc2\x99\xde\xdb\xc4\x05\x25\x8e\xfe\x61\xe4\x5f\x9b\xcb\x82\xa1\xa8\x77\x73\x4c\x23\x88\x32\x1c\x45\x2d\xde\x7e\x19\x8e\x7a\x91\x42\xcd\x9e\xea\x4c\x12\x07\x38\x29\x07\x8e\x7e\x38\x33\xda\xd7\xd1\x70\x78\x87\xa1\xe8\xff\xa3\x47\x18\xf0\x7e\x90\x6f\xc0\xe8\xba\x31\xfc\x86\x54\x1f\x33\xb6\xb8\xe0\x0f\x45\xed\x7d\x45\x8e\xc6\x72\x81\xb2\x1e\xbf\xe4\x02\xf4\x33\x91\xcf\x07\xd0\x38\x06\xfe\xac\x90\xb5\x4e\x1c\xb0\xec\x32\xa3\xe7\x07\x7a\xc8\xb1\xa3\x31\xa6\x28\x9a\xc8\xf4\x69\x93\x25\x39\x4b\xd7\x39\xf3\xfa\x6d\x59\x29\x43\x51\xb0\x93\xed\x16\xa2\xfa\x34\xb6\xfc\x8d\x7a\xce\xff\x56\xc9\xb8\x97\xc5\x42\x98\xce\x55\x5a\x7e\x9d\x68\x28\x12\xb7\xde\x6a\xa1\xd2\x84\x91\x4f\x22\x7a\x57\x06\xa3\xd8\x98\x4e\x15\x4e\xb3\xdb\xbb\xa8\x61\xce\x7f\x10\x34\xe7\x3f\x70\xcd\xf9\x0f\xe6\x63\x91\x09\xae\x23\x18\xb5\xe7\xc5\x70\xfd\x8b\x6d\x45\x61\xe9\xed\xa4\x20\xc2\xa5\x34\x58\xfd\xc8\x51\xde\xd6\x58\x85\x7d\x8a\xc3\xab\x71\x0b\x5d\x16\xde\xe4\x08\xa9\x02\x51\x81\x37\xdb\x89\x75\xd6\x05\xbe\xf1\x9d\xc0\x29\x19\xcf\xc8\x3c\x3c\xcc\x2e\x80\xa5\x96\x4d\x12\x65\xc9\x35\x40\x8a\x1f\x80\xcd\xe8\x5c\x38\x06\xaa\x88\x95\x2d\x60\xb8\x92\xfe\x34\x85\xac\x20\x3e\xc4\x98\xba\x81\x8f\xaf\x18\x20\xa8\xd2\x49\x2e\xa2\x73\x42\x4f\x16\x55\x75\xf2\xe1\xec\x24\x1a\x38\x08\x77\x30\x40\x6b\x95\xd9\x2e\x80\x2d\x00\x41\x0b\xc4\xe0\xa4\xb9\xd7\x48\x7a\x23\x60\x8c\x81\x8e\x70\x2d\x0a\xe1\x39\x04\x37\x1b\x09\x07\x18\x63\x66\x83\x74\x05\x89\x30\xbe\x86\x91\xa9\x80\x1e\xf5\x31\xa7\x29\xc5\x59\xef\xe8\x22\x5d\x16\x1f\x79\x37\x71\x4c\x5d\x28\xb0\x2f\xa6\x74\x6c\x20\xfc\x82\xa4\xcb\x2d\xe4\x7b\x29\x73\x31\x1d\x5e\x64\xf9\x12\xac\x75\xb5\x61\xe5\x39\xa1\x52\x09\xfe\x4b\x6a\x28\x17\x4a\xd5\x57\xa1\xa5\xb9\x0b\x17\xe1\x00\x13\x41\xc8\x27\x80\xe0\x35\x74\x9c\x6a\x15\xe1\x94\x63\x09\x97\xd7\x0b\xcb\x8c\x7e\xda\xa1\x61\xbc\xb5\x66\x51\x25\xb8\xb6\x2e\x10\x9e\x82\x30\xfb\x1b\x14\x84\x75\x26\xb6\x6e\x12\xf0\x0c\x96\xdd\x46\x4d\xe6\x98\x33\xbd\x1c\x22\x82\x85\xe8\x56\x47\x5a\x23\x6c\x12\x92\xd3\xf8\x63\xfe\xef\x66\x33\x74\xc6\xf2\x3f\x1d\x38\xed\xc3\x85\x83\x9e\xff\x6d\x86\x91\xcf\x52\x78\xed\x19\x20\xe3\xc6\xeb\x9a\x68\x1b\x59\xc8\x4f\x3e\x95\xa1\xce\x47\xb5\x18\x91\xce\x40\x4a\x8f\x2d\x15\xb5\x91\xeb\x67\xaf\x47\xf7\x85\x09\xb7\xbe\xad\x01\x4e\x95\x92\xb3\xb8\x54\xc7\x2b\x3f\x54\xb2\xf0\xaf\xe4\xd4\x66\xaf\xf1\x05\x73\x0f\xa4\xa1\xab\x06\x37\xb9\xd5\x8c\xeb\x92\xe7\x9c\x34\x36\x21\x8e\x7a\xcc\xa6\x41\xc2\xa8\xf5\x42\xa2\xbb\x39\x7b\x3f\xdf\x6a\xeb\xb6\x76\x58\xb0\xf2\xf4\x5a\x89\xf0\x42\x43\xf2\x54\xcf\x48\xd8\x83\x80\x2e\xcb\x60\xe6\x59\xd7\xc8\x84\xb6\x69\x07\xab\x47\x4c\x84\xab\xc7\x2c\xfe\xbf\xa9\x67\xef\xd2\xbe\x85\x20\x3f\xa8\x85\xfb\x42\x4d\x70\x1d\xa3\x0d\x3f\x57\x71\xe7\x1c\xf3\x7e\x91\x63\x0d\xc5\x5d\x3b\xa0\xec\xa5\xa5\xfe\x5c\xbd\xb2\xbd\x0e\xf5\x69\x34\x8c\xc9\xdd\x7a\xc0\xe0\x1d\x68\xf7\x7a\xe9\x22\x2b\xf6\x8a\x04\x3a\x6d\x0d\x61\xd3\xad\x74\x91\x33\xb3\x90\x05\x67\x1d\xf2\xbf\x47\x17\x7a\x2b\x1d\x37\x6f\xf6\xb7\x5a\xc4\x3b\x37\xb9\x7e\x92\xff\xeb\x86\xa3\x5d\x9e\x24\x86\x31\x0c\x1d\x5f\xf8\x6a\x28\xa6\x41\x06\x32\xdf\x31\xe4\xff\x33\x4c\x19\xc1\x3e\xef\x36\x7b\x64\x36\xb4\xba\xcb\x93\x58\x50\x83\x81\xcf\x85\x7c\x86\x42\x16\x09\xa9\xa2\x81\xee\xe2\xb8\x45\xd1\xaa\xa9\x65\xb7\x0c\xd1\xc7\x54\xa8\x5a\xb9\xd8\x60\x6f\x9e\x51\xba\xea\x4e\x66\xb4\xa6\x76\x15\xb9\xff\xc2\xdc\x5a\xa3\xcc\xd5\xff\xaa\xe2\x5b\x33\xdd\xbf\xef\xaf\x61\xca\xaa\xd7\x29\xcb\xae\xc8\x8b\xcb\x55\x8e\xef\x1e\xdf\x1c\x57\x77\x8e\x67\x54\x3c\x3a\xae\x06\x8b\x62\x49\x8e\xe7\xfc\xd9\xf6\x6e\xc2\x48\xc5\xc0\x33\x06\xa0\xc8\x70\x51\x66\xf4\xdc\xda\x6b\x16\x55\xa5\xb7\xaf\x7a\xaa\xe2\x93\xc8\xc7\xde\x4b\xf6\xff\x57\x5d\xfd\x6d\xaa\x2b\x9d\xe5\xc0\x65\x94\xaa\xa3\xf5\x6a\x55\x74\xf1\x3c\xde\x01\x93\xff\x1f\xeb\x34\xea\xdf\x7e\xeb\x34\xfa\x76\x3e\x96\xfd\xc8\xa0\xab\x38\xee\x37\x27\xec\xd7\xd6\x6f\x02\x99\xcd\x74\x62\x52\x31\xa5\x3a\xd6\xf5\x46\xe3\x9f\x31\x45\x02\x2d\x8d\x4b\x74\x96\xe5\xf9\x78\x88\x71\x39\x8d\x4e\x0b\x76\x11\x8d\xad\x81\x6b\x3b\xc9\xe2\x18\x14\xda\xf1\x23\xd3\xfa\x8e\x9b\x2d\x5a\xec\xaf\x9c\xf9\xc4\xb6\xd0\xea\x65\x16\xff\x43\x7a\x99\xaa\xa1\x97\x59\x2b\xd9\x5e\x29\x40\x30\x6b\x53\x5c\xfe\xa6\xeb\xaf\xa0\x0a\x42\xb7\x00\xcf\x27\xa9\x0d\x28\xd0\x3a\xe4\xef\xc5\xaf\xbd\xee\x22\xe7\x88\x58\xbb\x9b\x1b\x05\xb8\x3e\x8a\xcd\xe6\x46\x66\x3d\x7c\xc1\x30\x05\xf7\xbf\x7f\xf0\xfd\x7d\x88\xde\x77\x85\x47\xec\x6d\xa3\x4a\x03\x36\xaa\xb4\x66\xa3\x3a\xa1\xe4\x13\x33\xd7\xe3\xc5\x12\x0f\x51\xca\xf9\x05\xba\x24\x25\x29\xf9\xae\x0b\x25\xe0\x3b\xf5\x00\x94\x22\xbe\x12\xdd\x64\xcb\x71\x34\x8c\x10\xa1\x8b\x74\x55\xad\x73\x09\x38\x59\x92\x9d\x2d\x92\xd7\x05\x25\x48\x1a\x47\x38\x58\x2f\x53\x96\x8e\x6f\x8c\xca\x73\x3c\x9b\x6f\xb7\x10\xa5\x01\xd3\xd6\x69\x38\xf7\x9b\x1f\x2e\x5f\x9b\xaf\x83\x5b\x27\xc1\x06\x83\xc1\x44\x2a\x71\x1b\x8a\x36\xc0\x97\x7a\xf5\x16\x02\x02\xc7\x26\xd2\xf9\xb5\x76\x56\xd4\x5b\x80\xa4\xea\x01\x39\x41\x7a\x33\x3a\x87\x22\x9f\xee\x1b\x91\xe7\xd8\x6b\xee\xd8\x2e\x4e\xfe\x70\x9c\xee\x8f\xd7\xc3\x7b\xdf\x3d\x38\x4b\x9d\x14\x72\xcc\x0d\x39\x04\x6c\xb3\x21\x10\x64\xc9\xcb\xe7\xff\x04\x59\xf2\xfc\xb7\x02\x22\xf9\xe3\x05\x4b\x7e\x1c\x42\xb8\x45\xba\x93\x55\x59\x5c\xe1\x2c\xf9\xed\xaf\xef\xc0\x0d\x2b\x3e\x10\x3a\x26\xe8\x2c\x5d\xb0\xa2\xbc\x1e\x3b\x03\x6d\x15\x71\x7b\xf3\x3f\x65\xde\x3c\xc9\x96\xd2\xb4\x69\xa0\xa5\x0c\x5a\x2c\x25\x04\x75\xd2\x0f\x51\xd1\x4a\xef\x7c\xb6\x44\x04\x89\x18\x81\xf6\xbd\x7d\x79\x08\xd1\xdb\xdb\xaa\xca\x32\x93\x55\x49\x2b\xcd\x68\x6d\x04\xad\x0f\x6b\xd1\x3d\x35\x54\x58\x4e\x96\x23\x63\x81\x92\xe1\x7b\x66\xd5\x65\xc8\xc3\xed\xa4\x3d\x3e\xaf\xc6\x20\xea\x99\x99\x72\x7b\xae\x3e\x24\xfa\xc7\x3f\x7c\xcf\xe7\x6c\x89\xa2\xb1\xd5\xfe\x13\xcf\xf7\x59\xcf\x2d\x74\xc3\x6c\x70\x47\x9d\x06\x21\x99\xb7\x40\xc5\x86\x3d\x1a\x4d\xd9\xc1\x68\x2c\x0a\x9e\x8c\x26\xe5\x43\x26\xfc\xf5\xe9\xac\x3c\x18\xcd\x1d\xea\x56\xce\xdb\xef\x93\xaf\xd1\x51\xb3\x26\xbe\x5e\xa2\x5b\xb7\xa0\xb6\xc2\xa4\xc6\xd9\x5f\xa1\xa1\xbf\x34\x29\x6f\x6e\xa3\x95\x30\xc3\xda\x4c\x36\xfb\xa9\xe3\x0c\x4c\x88\x56\x7f\x87\x50\xd8\xa9\x03\x31\xc3\x89\x56\xb0\xa1\xab\xd8\x4f\xc7\xe0\x74\x23\x9a\xed\x2d\x06\xdb\x0f\x75\xc3\xbd\xfd\xca\xcd\x97\xaa\xdd\xfe\x7e\xe1\xe6\x4b\xdd\x70\x5f\xf5\x83\x3b\x59\xc2\x9a\xbb\x35\xba\x9d\xc7\x9c\xe9\xce\x6b\xbd\xb7\xd3\x9c\xa0\xf4\x88\x19\x3e\x43\x78\x3e\x63\xc0\x8c\x9d\x44\x6b\xac\x0d\x5a\x20\x5e\x70\xe9\x6c\xa0\x2e\xd4\xdc\xb5\xa0\x10\x93\x07\xd5\xf7\xc0\x83\x0e\x67\xca\xa6\x6c\x3c\x0c\x30\x32\xaf\x59\xb0\x42\xa7\xef\x1c\xe0\xe2\x21\xea\x61\xa0\x12\xa2\x4c\xa6\x26\x7f\xc7\x70\xf4\x0f\x93\x36\x2e\x42\xcf\xbf\x30\x02\x74\x49\x72\x72\x9e\x32\x93\xe6\x81\xa8\xcc\x0a\xea\x00\xff\x2a\xa8\xf5\xa3\x56\x9c\xa3\xe0\x6e\xe4\x93\xcb\x6c\x51\x16\x2c\xad\x3e\xbc\x58\x1a\x87\x40\xc3\xa2\x98\x5c\x5e\x4f\xd6\x67\x67\xa4\xb4\xfa\x3e\xbd\xeb\x32\x51\x84\xae\x95\xa0\xc6\x58\xbe\x23\x8b\x75\xf9\x94\xac\x6c\x15\xb2\x95\x2c\xd2\x88\x55\xb1\xc6\xa4\x24\x55\x91\x5f\x11\x30\x84\x88\xee\x4c\xef\x20\xd2\x91\x5b\xab\x91\x28\xcb\xcb\x7c\xdb\x91\xf3\x1a\x85\xc3\xb7\x7c\xee\x6d\x8f\x72\x5b\xde\xde\xd6\x99\x3f\xde\x5c\x48\x1f\x80\xc4\xb1\x98\x1f\x67\xee\xf4\xbf\xd6\x65\xae\x56\x9a\xda\xdb\x36\x11\x5c\x5b\xda\x7c\x21\x9b\x0d\x90\xb9\x6b\x9e\x32\x10\x45\xa8\x74\x4f\x13\x86\xf6\x5d\x65\xe9\xc9\x20\x44\xd9\x56\xca\x5c\x8c\x93\x10\x91\x03\x78\x29\xf2\x55\xd4\x4e\x7d\x52\xfb\x3d\x18\xb8\x83\xd8\x44\x0a\x39\x72\x2a\xe2\xd7\x96\xd4\x10\x2f\x7a\x7c\x15\x37\x3e\x53\x59\x42\x27\xfb\x09\x83\x63\x5a\x1f\x42\xe7\x7f\x48\x51\x8e\x08\x92\xf5\x2f\x38\x87\x20\xd9\xc9\x3f\x54\x0a\xf3\xbc\xb6\x0b\x8e\x42\xe8\x3c\x0b\xa1\x8d\x26\x04\xea\x25\x9a\x93\x14\x9f\x6a\x15\xa7\xf7\xd0\x35\x2d\x54\x8b\x0b\xb2\x5c\xe7\xe4\xb0\x58\x53\xf6\x3e\xad\x9a\x6a\x99\xa6\xa7\x99\x02\xf2\x84\x5d\x10\xea\xe7\x46\x77\x6f\xd9\x60\xe0\x38\x3d\xea\x61\xb4\xe9\xa5\x5d\x09\x54\x2f\xec\x3f\x21\x22\x42\x87\x3c\x6c\x5c\xe3\xa9\xbd\xf7\x49\xb9\xa6\xc1\xea\xa6\x14\x6e\xe1\x18\x0c\x75\x00\x55\xdb\x85\x37\x51\x8b\xf5\x7b\x2b\x2b\x86\xd4\x17\x5a\xb6\x8c\xda\x31\x40\xbb\x98\x7b\x0e\x08\xba\x07\x27\x60\x88\x44\xd0\x3d\x60\xb3\x91\xf0\x2f\xeb\xe8\x0d\xcf\xe6\x4e\x0a\xca\xd6\x31\x85\x1d\x65\xc6\x10\x9d\x3b\x4e\x68\x24\xc0\x0e\x06\x9c\x09\x5d\xd0\x3a\x38\x40\x66\x07\xdd\xe7\x5a\x53\xac\xf7\xe2\xcd\x9a\x55\xd9\x92\x3c\xa6\xe7\xeb\x3c\x2d\x6b\x90\xd1\x00\x34\x91\xae\x9a\x78\x49\x19\xbc\xe3\x35\x0b\x34\xc0\x4b\xe8\xb2\x0e\xcf\x84\xba\xd9\xfb\x6e\x9b\x5f\x81\xec\x91\x54\xe1\x6f\x90\xe7\x56\x4c\xff\x95\x25\xef\x86\xa7\x5f\x20\xd9\x3d\xfd\xe2\xec\xb2\x86\x88\x52\x8f\x88\x96\xfa\xad\xe0\xa5\x64\x32\x25\x6f\xa3\x9d\x37\xd3\x80\xd2\x84\xba\x0d\x00\x81\x5b\x99\xf8\xa1\x49\x9e\x96\xa2\xb8\x41\x87\x82\xdc\x8e\x98\xb2\x74\x5f\x6e\x90\xf8\x69\x6d\xea\x8b\xf7\x97\x5e\x07\xab\x66\xe2\x42\xcf\x0d\x6a\xb7\xc8\x56\x23\x9e\xd6\x0b\x86\xd5\xbb\x3c\x2c\x2e\xdb\xea\x4e\x77\x74\xa8\xbe\x72\x95\xbc\xf2\xc5\x7b\xf2\xe9\xb6\x7d\xf1\x4f\xbc\x9a\x09\xd6\x0b\xa6\x23\x81\x8e\xe9\xc4\x75\x9a\x91\xf9\xdf\x9c\xed\xd7\x09\x84\x02\xfb\x8f\xa4\x4e\xcd\x0a\x4f\xbc\x9d\x34\x9e\x77\x93\x80\x3e\x68\xa8\x48\xef\x07\xd5\xab\xf7\x39\x03\xec\xfe\x9c\xf8\x33\x77\x87\x54\x43\xdc\x62\xf2\xa5\x2b\x5d\x18\x7e\xac\x6d\xea\x7e\xbf\xef\x54\x02\xb9\x66\xbf\xde\x0c\x5d\x79\xb8\x22\x39\x59\x08\xdf\xa8\xdb\x03\x61\xe3\xdb\x5a\x5a\x23\xc3\x40\xee\x0d\x39\x1e\x4b\x6a\x3a\xa2\xe4\x13\x3b\xca\x4e\xf3\x8c\x9e\xef\xdd\x93\xf3\x8d\xdb\x55\x45\xd8\x63\xc6\xca\xec\x74\xdd\xae\x6f\xaf\x43\xa2\xfb\x4d\x33\x1b\x92\x3c\xa4\x1d\x9d\xd6\xbb\xac\x7d\x54\x37\x57\xa4\xcb\xe5\x61\x9e\x86\x33\x42\x35\xee\x89\x6a\xeb\xef\xbd\x02\x9d\x7d\x3b\x71\x9a\xfb\xfd\x54\x84\x75\x18\x4d\x82\x7b\xa5\xcc\x25\xe1\x7d\xea\xb4\xc0\x84\xe6\xe4\xf4\xe6\x5b\x71\x5b\x6d\x55\xb2\x2f\x91\x7f\x8a\xd9\xfc\x53\x71\xcc\x30\x7e\xc7\x54\x6a\xf6\x7a\x46\x2f\x40\x50\xbf\x4f\xb5\x7b\x8c\xb3\x18\x23\x88\x36\x67\xf0\x0b\x1f\x77\x9f\xcd\xd5\x6d\xfd\x9d\xed\xca\xa2\xd5\x02\xd3\x6e\x66\xab\xcf\x4b\x4f\xa6\xa9\x57\x60\xfd\xcc\x49\x2d\xff\xc7\xed\xd4\xba\xc2\xd2\x23\x63\xa4\x03\xaa\xdd\xdc\x55\xed\xaa\xc6\x30\x51\xac\x07\x26\x28\xf7\x98\x87\x12\xe5\x01\x35\xef\x67\x1c\xf8\x34\x4a\xdc\x07\xa3\xdd\x10\x40\xb1\xd1\x6a\xd0\xcd\xc6\xc2\x83\x56\x83\xc8\x2c\x6d\x4d\xec\x4a\x90\xa8\x56\x51\xb1\x12\x8c\x20\xba\x0d\x14\x75\xc3\x80\x23\x99\xe8\x84\x6a\xac\x91\x00\x0e\xa5\x28\xf7\x0e\x4b\xb9\x92\x13\xe5\x4a\x7e\x5a\x2c\xaf\x8d\xd3\xb8\xf1\x4d\xe5\x4f\xa5\x5b\xb9\x7e\xd4\x68\x23\x5f\x4b\x6b\xa8\x79\x29\x7f\xd6\x7d\xc6\xc9\x76\x0b\x08\x14\x75\x70\xec\x3e\x54\x38\x8a\xb4\x33\xed\x3f\xa2\x3e\x2e\xdc\xbb\x08\xb2\x80\xef\x32\xb1\xa9\x07\x92\xff\x2f\x73\x5f\xc2\xdc\x36\x8e\x2c\xfc\x57\x18\x7e\x33\x2e\xa2\x16\x42\x78\x48\x94\x44\x2d\xc7\x9b\x38\x93\x8c\x73\x38\xc9\xc4\xd9\x39\xf4\xe9\xa5\x20\x11\x92\x30\xa6\x00\x06\x84\x7c\x44\xd6\x7f\x7f\x05\x80\xa7\x2d\xcb\x1e\xe7\x5d\x95\xaa\x98\x02\x9b\x8d\x06\xd0\x40\x1f\x68\x34\xaa\x50\xf0\x31\x29\x70\xaa\x85\xdc\x55\x7a\x40\x59\xe0\xc8\x7f\x78\x60\xb2\x75\xb8\xaa\xd9\xc1\xf1\xc2\xa1\xd0\x07\x60\xec\x4e\x60\xae\x73\xca\xb5\xa5\x6e\xd3\xc7\xdd\x1c\x3d\x7d\xa6\x1e\xb6\xe4\x49\xc9\x9c\xe8\x2e\x5b\x52\xd9\x0f\x4a\x69\xbc\xbe\xee\x78\x90\x99\x8b\x2e\x1e\x32\x63\xcd\x0e\xc3\x0b\x09\xe0\xab\xef\xdc\x84\x6b\x38\xcc\xea\xa9\xd6\x9c\x67\xc4\xec\xa5\x89\x46\xbe\xbc\xc6\x7c\x62\x8b\xf7\x77\xfa\xa4\xcb\x6c\x57\xda\x50\xaa\x88\xce\xe4\x63\x0d\x14\xb3\xc7\x54\x98\x25\x27\xd5\xce\x13\xf9\x0e\xe3\xe4\x9b\xc9\x28\x45\xd1\xfb\xf4\x83\x63\x57\x93\xf8\x1d\x57\x83\x75\x7a\x95\x11\x1b\xc0\xe7\x32\x1e\x6f\x14\x5e\x9a\x90\x08\xa3\x2f\x7f\xc1\x75\x6e\x24\x5c\x74\x2a\xb7\xb0\x7a\x75\x4c\xd4\x8b\x97\x45\x65\xb7\x4d\x05\x55\xd1\xa9\xde\xab\x2f\xbf\xc8\x64\x8d\xea\x55\x13\x95\x36\xc5\x76\x62\xbb\x9d\x05\xf4\x65\x99\xdc\x62\x0b\x13\x92\xe5\xd1\x58\xa0\x9c\xc0\x4c\x42\x6d\xb8\x4d\xb6\x13\xf8\xb9\xd9\x80\x93\xbd\x44\xda\x65\x89\x5a\x22\x4c\xb0\xfa\xcf\xd2\x01\x3a\x41\xde\x9f\x32\x2a\xa2\x3f\x1a\x94\x7e\xd3\x4d\xd0\x52\x29\xb2\x9f\x0b\x7e\x91\x13\xd1\x10\x20\xdb\x49\xe9\x63\x7d\x2e\x01\xfc\x7a\x8b\x10\xd3\xf6\x0f\x77\x21\x3c\xe1\x3c\xbb\x13\xdb\x6f\x0f\xf6\xcd\x36\x8c\xcc\xa6\x79\xa7\xb7\xcc\x0a\x3e\xbe\xa0\x72\x79\xc4\xd9\x9c\xde\x56\x0c\x2b\x86\xdc\xb0\x85\x61\x8c\x88\xc0\x82\x5c\x91\x47\xf2\xb6\x08\x38\xfc\x2a\xa3\xcf\x72\xfb\x68\x83\xbc\x66\xe7\x15\x4f\x62\x8a\xf8\xb3\xe7\xce\x46\x0d\x47\x44\x74\x06\x70\xf3\x8e\xb2\xbf\x62\x8a\x66\xaf\x3f\x39\x9b\x9a\x9a\xcf\x12\xd2\x55\xc6\x85\xd4\x8c\x30\xf5\x27\x25\xa7\xff\x21\x63\xe6\xf4\xba\xfe\x10\xc0\x1f\xd4\xe3\xb0\x1b\xf4\x07\x00\xbe\xd6\xc5\x03\xcf\xeb\x03\xf8\x51\x3d\x77\x7d\xdf\x0b\x00\x7c\xa3\x9e\xfd\xe1\x20\x18\x00\xf8\xbb\x1e\x36\x2c\x97\x91\x6d\x43\x41\x12\x2a\xc8\x4c\x9e\xf2\xc8\x5e\x53\x1b\xaa\xf2\x77\x58\xce\x96\x91\x3d\x5f\xa7\xa9\xad\x86\x52\x83\xaa\x97\x29\xc7\xc6\xf0\x12\x84\xed\x9a\x11\x88\x38\xbd\x81\x5f\x38\xab\x18\x9a\x52\x96\x38\x0c\x7a\x43\x55\x78\xd3\x85\xd5\xbc\x75\xea\x2d\x66\x09\x2d\x47\x63\xab\x96\x16\x48\xd8\x6d\x6e\xf8\xe2\xdc\xc1\x04\xff\xfd\x23\x52\x0d\xc2\xf8\x8d\x44\xcf\xbf\xa1\x39\x17\xca\xbc\x71\x7e\x97\x70\xb3\xce\xc9\x2f\x38\x5f\x46\x4f\xdc\x2d\x98\x40\xfd\xbe\x1a\x26\xc9\xd4\x18\x74\xbb\x61\x08\x20\xd3\xcf\x61\x7f\xe0\x03\x28\x58\xec\x30\xc7\x1b\xf8\xc3\x21\x80\xcc\x09\xba\xc3\x6e\x4f\x3d\xf4\xbb\x5e\xd8\x07\x00\x62\x05\xeb\x07\xbd\x1e\x80\xa9\xfe\xac\xe7\xbb\x01\x80\x5c\x3d\x87\x83\x61\x30\x04\x30\x57\xcf\x83\xc1\xd0\x77\x01\x9c\xa9\xe7\xbe\xab\xbe\x85\xeb\x1d\x3d\x77\x87\xc7\xe6\x96\xb7\x06\x67\xf4\x28\xa5\xfa\x64\xc7\x0e\xc7\x09\x65\x54\x3e\x17\x66\xac\xee\xde\x47\x6a\xb8\xf0\x2a\x74\x68\x41\xe4\x29\x66\xdf\xd6\x3f\x27\xc5\x36\x10\xca\x68\x46\x1c\xc7\x85\x9c\xa1\x4b\xb0\xf3\x82\x94\x9c\x54\xb5\x3d\xbf\x2a\x3f\xd4\x57\xf9\x69\x41\x3f\x13\x74\x4a\xda\x67\x82\x63\xb9\x6d\x09\xec\x19\x67\x39\x4f\x09\x4a\xf9\xc2\xb1\x3f\x33\x35\xab\x2d\xc9\x2d\x41\xa4\xa0\xe4\x9c\x58\xc4\x20\x45\x76\xf3\x70\xfc\xae\x6a\xef\x8e\x0f\x99\x31\x74\xf9\x7a\x44\x0e\x0e\x48\x1c\xab\x1f\x1f\x16\xe8\xf4\xe8\xe7\x83\x03\xa7\x55\xf7\x27\x22\x25\x65\x0b\x6b\x5a\x20\xb6\xa6\x38\x27\x89\xa5\x46\xc1\x54\x10\x59\xf6\x3f\xaa\xaf\x01\xd4\x78\x7f\xcb\x15\x1f\xa0\x3f\x11\xce\xb2\x17\x58\xe2\x4f\x44\x9c\xd3\x19\x41\x34\x7f\xc7\x13\x72\x94\xae\x73\xa9\xc3\x6a\x59\x82\x53\xed\x31\xbc\x59\xeb\x0b\x93\xaa\x3a\xaf\x40\xac\x99\xf9\xc8\x5a\xf1\x84\x40\x2b\xbf\x49\x95\xe4\x77\xd0\xe3\x94\x04\xa1\x02\x83\x92\xa5\x2f\x88\x1a\x83\x4c\x72\xa1\x5e\x4a\x6f\xf7\x3b\x28\x51\x89\x1f\xa5\xe6\xef\x07\xbc\x50\x2a\x9d\x14\xbc\xf8\xf0\x6e\x80\xa2\x07\x56\x24\xcf\x09\x5b\x68\x87\xf2\x34\xa5\xf9\xb2\x98\xad\x39\x43\x6f\xd1\xf3\x5f\x9f\x9d\xbc\x38\x3e\x79\xf5\xe5\xe8\x97\x67\x27\xaf\x7e\x7e\x01\x33\x7c\xa5\x56\xaa\x48\x6e\xbf\xdb\x89\xfa\x51\xa2\xf4\xc3\x23\x14\x92\x52\xa0\x24\xc7\x2c\xb2\x05\xe7\xd2\x2e\x57\x84\x44\x4d\xd5\xc0\x1d\x04\x3e\x80\x4b\x3d\x9d\xfb\x6e\xe0\x02\x98\xed\x9b\xb6\xf7\x2a\x7e\xe5\x5d\x72\xb7\xad\x2c\x71\x23\x80\x46\xf0\xb5\xd4\x17\x57\x09\x54\x8c\x75\xac\xc4\x00\x4a\xf8\x2c\xff\x2c\x52\xfd\xe3\x0e\xc5\xf0\xf8\xde\x2c\x00\x37\x06\xab\x9e\xa6\xbb\x07\xaa\x35\x79\x2b\x72\x24\x2a\x06\xb0\x2c\x81\xa4\xa2\xae\x86\xaa\x66\xdb\x9b\x57\x87\xf6\x52\xca\x2c\x8f\x9e\x3e\x55\x60\xe8\x7c\x75\x81\x85\xce\x69\xfd\x94\xb0\xa7\xff\x7e\xa7\x7e\x75\xf4\xea\xd3\x79\xb3\x9e\x12\xc1\x88\x24\x79\xe7\x95\xa0\xc9\x53\x6d\x57\xa0\xa5\x5c\xa5\x76\xa4\x91\x44\x4f\x9f\x4a\x05\x39\xe3\xab\xd5\x9a\x51\x79\x55\x2e\x11\x94\x6b\xe4\x76\x11\x1e\xb4\x66\x55\xdb\x1a\xee\x28\x7c\x4e\x95\x76\xff\x0b\xdf\x99\xdb\x50\x7f\x68\xba\x1f\x95\xa0\xce\x78\xc9\xd0\x47\xf4\xd6\x74\xcc\xe4\x36\xae\x53\xfe\x42\x55\x7b\x1b\x5b\x11\x8e\xca\xb3\xd2\x76\x29\xba\x08\xda\x5f\xa6\x29\x66\x67\x76\xa5\xa1\x0b\x86\x1e\xa5\xa3\xff\x11\x84\xce\x1b\x89\x5e\xb6\xe2\xc0\x66\xab\x2c\xa6\xe8\xf7\x6c\x55\xca\x4b\x68\x9c\x7d\x5c\x28\xe1\x68\xcb\xb3\x45\xe7\x8c\xce\xce\x74\x28\x43\x67\x4d\x3b\x4b\x82\x13\x22\x3a\x53\x2c\xec\xc9\x04\xce\x09\x96\x6b\x41\xf2\x68\x4c\xd1\xd7\xf7\x7f\x4d\x60\x42\x66\x69\x1e\x79\x2e\x3c\xc7\x22\x8f\x5c\xa8\xd6\x2f\x2d\x66\xed\xfa\xc3\x8e\x9e\x3f\xd0\xb6\x27\x70\xec\xc1\xe2\x85\x5d\x3e\x74\xc2\xa2\x7c\x5a\x49\xa6\x00\xda\xb3\x94\xce\xce\x8a\x17\x29\x5f\xf0\x8e\xdf\x2d\x7e\x49\x2a\x53\xd2\x42\xd5\xc1\x33\xa3\x8f\x4e\xe0\xd8\x16\x3c\x25\x36\xb4\x53\xca\xce\x6c\x68\x63\x41\x71\x27\xc5\x53\x92\xda\xb0\xb2\x88\x8b\xc3\x4f\xaa\x4a\xc9\x6c\xfd\x7f\x27\x5f\x15\x0f\x2d\x94\x4d\x52\x26\x50\x92\x55\x96\x62\x79\xd3\xff\xe2\x1d\x10\x65\xf7\xa2\xd3\xc5\x9f\x8e\x0b\xed\x84\x9e\xdb\x50\x9b\x45\xaa\xa0\xd1\x5e\xaf\x2c\xf3\x0b\x20\x5f\x15\x9c\x24\xaf\x9d\xa2\x8a\x1d\x47\xc8\x24\x6a\xf2\xa4\x0e\x45\x37\x38\x02\x68\x63\x5b\xfd\xf8\xf2\xf9\x4f\xa7\x0b\xed\x3c\xc3\x8a\xda\xf2\x75\x4f\xbd\x86\x5d\x0d\xb0\xfe\xec\x84\xd0\xb6\xf4\x04\xb2\xf4\x37\x5f\xff\x7c\xe6\xec\xfa\xab\xbe\xec\x17\xc4\xf5\xca\x82\x01\xb4\xa7\x6b\x29\x55\x67\x84\x7f\x87\x60\xc3\xf8\x05\xc9\x8a\x88\x21\xb4\xad\x17\xcd\x21\xd8\x4f\x8c\xfe\x0b\xb6\x55\x4c\xa8\x3d\xbe\xc1\x51\x93\xf1\x17\xb6\x98\x99\x93\xe4\x9d\x1f\x8f\xde\xbf\xfb\xf0\xe3\xc4\xb2\xac\x4a\x18\xed\x78\xbd\x99\xad\x45\xce\x45\x94\x71\xca\x24\x11\xdb\x87\xa2\xd4\x3c\xb7\x0b\xdf\x9c\x33\xd9\xc9\xe9\x37\x12\x79\x83\xec\x72\xa4\x7f\xce\xf1\x8a\xa6\x57\xd1\x3b\x22\x05\xcf\x78\x4a\x73\xf8\xec\x9c\x30\x2a\xac\x13\x72\x29\xe1\x2f\x24\x3d\x27\x92\xce\xb0\x75\x42\xd6\x04\x3e\x13\x14\xa7\x30\xc7\x2c\xef\xe4\x44\xd0\xf9\xc3\x49\x12\x38\x21\x2b\x2c\xce\x76\x91\x95\xe1\x44\xf5\x40\x27\x25\x73\x19\x05\xff\xb3\x84\xad\x44\x77\x17\x49\x2b\x2c\x16\x94\x75\x04\x5d\x2c\x65\xd4\xcd\x2e\x1f\x8a\x6f\x96\x8a\x0e\x9d\x71\xb6\x0b\xe7\x92\x68\x6c\x7e\x37\xbb\x1c\x5d\xd0\x44\x2e\xf5\xe3\x83\x29\x2d\xd6\x95\x7b\xa9\xf5\xdc\xbf\x47\x6e\x22\x78\x96\xf0\x0b\xd6\x59\x11\xb6\xde\x85\xfd\x5b\x47\xcb\xad\xc8\x73\x7b\xee\x83\xa9\x35\x60\x3b\x47\xbb\x88\xcd\x8a\x04\x49\x75\x50\xff\xa8\xac\xc0\x77\xdd\xff\x82\x0a\xea\x97\xe5\x4a\x7b\xd7\xcc\x93\x3b\x87\x09\xa7\x74\xc1\x3a\x39\x49\xe7\xd1\x8c\xa8\x79\x37\x6a\x75\xaf\x4f\x56\xa3\x29\x9e\x9d\x2d\x04\x5f\xb3\xa4\x33\xe3\x29\x17\xd1\xff\x1b\xba\xb3\x61\x32\x1f\x15\xbf\x5c\x37\x08\xbb\xc9\x16\xe5\x19\x65\x8c\x88\x0e\x3f\x27\x22\xc5\x57\x7b\x98\xc2\x73\xdd\x1f\x0b\xa6\xd0\x8f\xcd\x3e\x1f\x55\x3d\x86\xa7\x39\x4f\xd7\x92\x8c\x24\xcf\x22\x77\xa4\xe7\x8b\xbb\x83\x9a\x39\x56\xff\x46\x3c\xc3\x33\x2a\xaf\x22\xd4\x1b\x49\x72\x29\x3b\xba\x65\x45\xa3\x1e\x42\x9c\xea\xa4\x02\xea\x61\x03\xa9\xc8\xea\xb9\x3f\x8e\xf4\x25\x0e\x73\x2e\x56\x91\x7e\x52\x52\xe8\x0f\xa7\xd3\x73\x7f\x04\x5b\xbb\xb4\x55\x1b\x77\x37\xdc\x90\x4c\x57\xec\xd2\x71\x4b\x61\xe1\x29\x89\x66\xe6\x54\x21\x82\xd4\xe2\xec\xab\xc5\x19\x8b\x33\xb3\x26\x3f\xff\x78\xe6\x34\x33\xcb\x9e\x3f\x18\x61\xd0\x44\xf8\x56\x8d\x44\x0b\xa3\xbe\xfb\xfa\xe1\xf6\x2d\x64\xfa\xca\x91\x9b\x41\x7c\x85\x10\x29\xe3\x11\x94\x50\x56\x7d\x73\x9c\x94\x11\x09\x72\x49\x56\x24\x8f\xc7\x1b\x86\x57\x24\xb2\x53\x45\x87\x0d\x97\x82\xcc\x23\x4d\xeb\x9a\xa2\x15\x65\x68\x96\x2b\x7d\xb0\x00\x4a\xb0\x38\x6b\xc3\x74\x54\x51\x0d\x58\xc4\xf3\xa9\xc2\xe7\x3c\xb9\xd2\xae\xb2\xb8\xf8\xac\xae\x35\x6e\x10\x30\x76\x27\xd0\x71\xe1\xb1\x44\x27\x2f\x8b\xc4\xe2\x35\xad\x00\x6c\xca\x1b\xe2\x45\x9c\xf2\x19\x4e\x3f\x49\x2e\x94\xe1\xb4\x20\xf2\x58\x92\x95\xa3\xc9\xd0\x98\x6c\x30\x12\x87\x8d\x3a\x5e\x7f\x7a\x7f\x82\x74\x2a\x1b\x47\x80\xc8\x66\x5c\x5a\x38\x4d\xed\x27\x71\x5c\x68\x95\xfa\x00\xd7\x3b\x92\x50\xec\xd8\x4e\x26\xc8\x9c\x88\xdc\xf0\x72\x27\x9f\x29\x14\xc0\x06\x68\xa5\xde\x97\xf9\x25\x0d\xe2\x87\x7e\x1e\x59\xba\x4f\x35\x16\x73\x56\xec\xb0\xdd\xee\xa8\xf9\xd3\x9b\x94\xd7\xc3\x8b\x1b\x36\xbd\xbe\xcc\xa9\xb4\xe7\x95\x05\x5b\x35\xd9\x9a\x0b\xbe\xb2\x74\xbf\x58\xb9\xe9\x98\xa8\xce\xfb\x23\x40\x91\xa1\x4d\xe9\x79\xbf\x92\x79\xdc\x62\x8c\x9b\x39\x68\xb4\x32\x58\x30\x4f\xf1\x01\x12\x24\x8d\x4d\x72\x9a\x7c\x49\x48\x91\x4e\xac\x7a\xab\xd8\xa0\x31\x92\xfa\x77\x9b\xf9\x90\x3e\xae\xf6\xa9\xd0\x9d\x1d\xad\xe5\xd9\xed\x8c\x20\x4d\x8c\xa0\xc1\x22\xc8\xe4\xe0\x76\xda\xf8\xa6\x3c\xb9\x32\x57\xc6\xe9\x6c\xbe\x37\xc0\x77\xc6\x69\x9a\x1d\xa1\x53\xcd\x21\xb7\x0d\x8c\x82\xed\xcb\x33\xaf\x35\xae\x43\xe7\x0e\x76\xf5\x26\xf0\x7e\x9a\x5a\xfc\x0f\xa2\xbb\x70\xb9\xf7\xe0\xb2\x6d\x00\x5b\x5c\x9f\xdf\xe6\x7a\xa8\xf9\xdc\x6c\x11\xd1\xf9\x55\xa3\x2a\x00\xee\x1f\xaf\xef\x71\x1d\x28\xd3\xa9\xda\xde\x50\x3f\x28\x7a\x3b\xa5\xdf\x63\x47\x69\xba\x3a\x92\x2f\x16\xca\x7a\x29\x0d\xa7\xc0\xd8\x4d\xbd\xda\x6e\x52\x16\x8e\x06\x35\xe8\xb4\x05\xc2\x16\x9f\xf4\x48\xdb\xea\xb1\xd8\xfa\xaf\x2d\xa4\x6e\x0d\x70\x84\x73\x6d\x1a\xd9\xf9\x12\x67\xca\x0c\x5a\x71\xce\x5a\x05\xf9\x9a\x3d\xc6\x94\xb9\x4f\xe9\x6f\x70\x62\xa1\xf1\xff\x71\x32\x73\x3c\x38\x67\x30\x80\xae\x22\xb0\x53\x9c\x0c\xad\x2c\x21\x05\xe0\xc3\xf3\xbb\x01\x8c\x01\x00\xfd\x82\xa6\x8f\xe1\x6b\xa7\xd1\x13\xb2\x39\x39\x9c\xba\x5f\x5a\xe5\x90\xa2\xf5\xf1\x99\xd3\x36\x03\x0d\xad\x96\x5e\xce\xac\x62\x79\x85\x14\x5d\x66\xa1\xa3\xeb\x6d\x55\xa4\x7b\x14\x16\x53\xe9\x5e\x30\x2d\x0c\x14\x97\x18\x9f\x3c\x3d\x57\x86\xcb\xb1\x44\xbf\xbe\x54\x42\x60\x75\xa6\xfe\x67\x43\x98\x30\xf4\xf5\xfc\xed\xa4\x36\x6d\x50\x73\xc8\x77\x69\x06\xc5\x6d\x26\xd1\x34\xe5\xb3\xb3\x51\x6d\x75\xa0\x50\x90\x95\xf9\x7d\x61\xf4\x9e\x9e\xab\xd4\x18\x29\x89\xe8\xe4\x4a\x5b\x61\x8b\x08\xb9\xfd\x80\xac\x8c\xc6\x92\x90\x19\x2f\x0f\x6c\x72\x46\x6a\xfd\xaa\xef\xe3\xc0\x80\xd4\xba\xc6\x3a\xcb\x88\x98\xe1\x9c\x8c\x2e\x96\x54\x12\x8d\x90\x44\x8c\x5f\x08\x9c\x8d\xda\xa6\x54\xad\x52\xcd\xe9\x25\x49\x46\x53\x2e\x25\x5f\x69\xd5\xd9\x68\x55\x5a\x33\xbf\xaf\x9d\xd1\x52\xe9\x4e\x9b\x8a\xa8\x5e\xd8\xc7\xf7\x7e\x74\x8f\x91\x50\x11\xb6\x66\x39\x91\x0d\x4d\x4a\xb7\xbf\xd0\x44\x0b\x72\xfd\x9b\x34\xea\xd5\x6e\xa7\x21\x69\x48\xec\x62\x4c\x92\xe1\xc3\xbe\x69\x37\xae\xd7\x9f\x0d\x08\xae\xb5\x37\x78\xf5\x5d\xfe\xc3\xbf\x73\x04\xaf\xde\x24\x20\x90\x96\xfe\xb8\xc2\x39\x1d\x0b\x48\x51\xb9\x7d\x75\x7a\x95\x11\x73\x90\x6d\x97\x1b\xdb\x84\x3f\x54\x80\x26\xce\x19\xd2\xf6\xa6\x41\x09\xd1\xd8\x30\x60\x0c\xfd\xaa\xd6\xd8\xa6\x0b\x6e\xe7\x8e\x00\x01\x9b\x1b\xb4\x90\xea\xe7\x83\x28\xaa\xc1\x77\x3b\xe2\x73\x22\x4f\xcf\xc4\xbf\x89\xc8\x75\x75\x48\x56\x3f\xc0\x9e\x7d\x88\x97\xd5\x85\x92\xd5\x3e\x44\x59\x8d\xa5\x44\x81\x85\x59\x62\xd5\x8e\x4a\xeb\xdc\xa0\xd4\x9b\x14\x37\xbb\xe7\xa5\xf1\xa7\xbd\x4c\xf1\x22\x7f\x64\x17\xdd\xd1\xb0\x16\x66\xbd\x12\xb6\x07\x1a\x35\x37\x83\x9c\xbf\xd9\xde\xc2\x0d\x68\xcd\x15\xf6\xa2\x61\x0d\x9f\x33\xf8\x3e\x9f\x65\xca\x50\xfa\xa1\x14\xbc\x6b\xf6\x3d\x52\x17\x67\xd9\x1e\xb7\x65\x78\xcb\x6b\xa9\x6c\x99\x62\xd6\xd6\xe2\xc8\xf8\x1a\xcb\x72\x2c\x08\x7e\xb8\x08\x55\x2b\xd3\x0a\x53\xd6\x40\xd7\xb0\x9b\xf6\x79\x5b\x6f\x7a\x0b\xdd\x86\xeb\x4f\x61\x2c\xa4\x64\xe1\xff\x33\x6e\xe9\x0e\x5f\xcb\x94\xc8\x9d\x7e\x35\x05\xd8\xdb\x51\x65\x4b\x31\x69\x3a\xde\x9a\x32\x2c\x61\xe8\x23\x3f\x56\x82\xeb\xdb\xfa\x05\xcc\x18\x7c\x23\x51\x7a\x04\x17\xec\xef\x08\xb1\xdd\x22\x22\x2c\x25\x84\x76\xb3\xd4\xeb\xe1\x8a\xc5\x4a\x74\x92\x6f\xaa\xd6\x37\xe1\xb3\x09\x9c\xfe\xdf\xda\x52\xae\x37\xf9\xc7\x93\x7a\x93\x7f\x5c\xc5\x44\xac\x18\xa8\x1a\x73\x64\xb6\x8e\xfd\x20\x04\xf0\xd9\xff\x56\x33\xe0\x94\x73\x99\x4b\x81\xb3\x68\x7c\xc5\x26\xf7\xb6\x6a\xcd\xe0\x11\x43\xb4\xd9\x38\x81\xa6\x3e\x24\x0c\xfe\x21\xd1\x1b\xf8\x9b\x84\x53\x06\x3f\x4a\x74\x44\xab\xfd\xf4\x4d\xc2\x15\x73\x46\xb6\x0d\x97\x52\x66\xef\x4d\xd2\xb5\x68\x63\x18\x3b\x8f\x36\x76\x91\xfb\xb3\xa3\xa3\x79\xcc\x55\x61\x74\xa6\x35\x92\xa7\x7f\xe5\x9c\xd9\xdb\xed\x16\x40\xc9\xd0\x0a\xfe\x20\xd1\x19\x7c\x2d\xd1\xeb\xf5\xa4\xf2\x71\x38\x2e\xa4\xe8\x55\x77\x00\x1c\x00\x05\xfa\x1a\x3a\x00\x55\xad\x32\xe1\x07\xce\x33\x06\x90\xb1\x36\x77\xc4\x2a\x94\x2b\x9b\xbe\xf0\x57\x6f\x46\x6f\x61\xd8\xed\x87\xfe\xed\xb0\xc3\x75\x4e\x2c\x65\x7b\xcc\x64\xe3\x26\x71\x71\xe3\xbe\x19\x78\x3b\x77\x07\x4c\x63\xfc\xcf\xe0\x50\x46\xc5\xf1\x4b\x71\x28\xca\x5b\xef\x16\x44\xbe\xbf\x60\x65\xd0\x60\xbd\xc7\x6a\x52\x25\x0b\x1d\x0d\xc8\x35\x68\x1d\xef\xf3\x2b\x99\xab\x09\x75\x70\xb0\x23\x16\xa8\x78\x87\x0a\xad\x8e\x80\x34\xbe\x59\x54\xd1\xab\xaf\x1e\xb7\xca\x23\xdb\x3c\x26\x55\x9e\xbb\x11\xff\x29\x76\x47\xbc\xd3\x01\x0e\x8d\xc9\x98\x4f\xc0\xc1\x81\x93\xc6\x8e\x6a\x05\x75\x52\x10\xe1\x9f\xd4\x83\x42\x93\x82\x48\x3f\x00\x70\x7d\x9d\xd6\x49\x5d\x7f\x0a\x0e\x0e\xd2\x2a\x6f\x90\xc9\xaf\xd9\x4c\x03\x0d\xd3\xd6\x05\xf7\xb4\xba\x30\xfd\x51\xad\x5d\x11\x89\x13\x2c\x71\x99\xb7\xe4\x66\xb9\x89\x79\xad\x6a\xc3\xf5\x90\x35\x26\x8b\xb9\xd7\xbd\x38\xab\x05\x1a\x01\x0c\x3a\xe4\xb5\xfa\x38\xd5\xa7\x74\xc5\xd5\x26\x77\x84\x0e\x3d\x77\x08\x28\x9d\x19\x12\x6c\xb0\x23\x9b\xb7\xa0\xf3\x26\xb4\xbe\xb2\x7a\x2f\xb8\x12\xcc\x1b\x82\x12\xce\xc8\x21\x75\x08\xd2\x26\x3c\xd8\x15\x02\xdf\x4a\x7f\xc2\x0e\x89\x8e\xfc\x62\xad\xe0\x09\x69\xb8\xb9\x42\x63\xc2\x75\x52\xc8\xc1\x36\x77\x1c\x11\x97\x97\x1f\xe8\x2c\x09\xe3\x09\x00\xa6\x39\x3a\xd9\x3d\x43\x89\x23\xe1\x66\xb1\x2b\x28\x48\x6c\xe1\x45\xb8\xa3\x9c\x6e\xe1\xea\xd5\x8e\x72\xbc\x55\x73\x2a\x70\xdd\xbe\x77\x6b\x4e\x11\x44\x2e\xf5\x52\x12\x33\xa7\xdf\xf3\xbb\x3e\xd8\xc2\xde\xa0\xef\xed\x87\xf4\xdc\xc0\x0f\x14\xce\x6e\xd0\xef\xef\x85\x0c\xbd\xde\x70\x08\xb6\xd0\xf3\x06\xde\x70\x3f\x4e\x7f\xd0\x0f\xc1\x16\x0e\xba\x43\x77\x7f\xed\x3d\xdf\xed\x2a\x9c\x41\xaf\xe7\x77\xf7\x42\x0e\x82\xb0\xd7\x03\x5b\xd8\xf7\x06\xbd\xfd\x38\x07\x7d\xb7\xd7\x55\x38\xfb\xc3\xae\xbb\x1f\xd2\xf3\x3d\x0d\xd9\xeb\x06\xf7\xd0\xe9\x0e\x06\x1e\xd8\xc2\x6e\xd8\xeb\x0d\xf6\xf7\xbc\xeb\xf5\xfa\x0a\xa7\x37\xec\xef\x87\x1c\x78\xa1\xe7\xaa\x31\x1a\xee\xaf\x7b\x18\xb8\xae\xea\xcd\x61\xe0\x77\x7b\x7b\x21\x7d\x6f\x18\x0e\xc0\x16\xfa\xa1\x37\xbc\xbd\xe6\xb6\x20\x07\x41\x57\x41\xf6\x02\xd7\xdf\x3f\x96\xc3\xb0\xd7\x53\x2d\x1f\xf8\xfe\xfe\xca\x7b\xa1\x3f\x08\xf5\x82\x3f\xec\xdf\x03\xd9\xf5\x7a\x8a\xe5\xc2\x30\xf4\xf7\xb3\xdc\xd0\xed\xeb\x41\x0f\xbc\x70\x10\xde\xd3\x49\xa1\xaf\x6a\xf7\x86\xa1\x7f\x4f\x77\x86\xdd\xbe\x6a\x50\x18\x04\x83\x7b\xd8\x63\x30\xf0\x34\x73\xba\xbe\xe7\xb6\x16\x8e\x1a\xaa\xad\x9f\x3a\x46\x2a\xc9\xeb\x6b\xf9\x53\x29\x02\xf4\x25\x43\x95\x40\x00\xa3\xf6\x45\x9b\x8d\x44\x1e\x60\xc4\xfe\x29\xf5\x9d\x6f\xa2\x4c\x0b\x3d\xaa\x97\x89\xaa\x4a\xf4\xe5\x0b\xc9\x8d\x34\x8e\x9f\xb8\x8d\xf2\x22\xbc\x3c\xae\x4a\xb6\x30\xf0\x5d\xf7\xf6\x58\x18\xaf\x38\x73\xf4\x48\x81\xd1\xae\xc6\x68\xf9\xa1\x44\x38\xa8\x82\xd5\x1f\x47\x41\x18\xf6\xbd\xee\xbd\x7d\x57\x2f\xc5\x07\x07\xa4\x81\xfe\x90\x44\x9b\x32\x6a\x9e\x6c\x1f\xdb\x09\xdd\xc1\xbe\x4e\x50\x6c\x00\x20\x55\x8f\x8a\x1f\x77\xf7\x47\xfb\xb2\xee\x38\x26\x87\xea\x6f\x54\x1d\x73\x13\x07\x07\xd4\x21\xe0\xfa\x9a\x8c\xed\x7f\xfd\x8b\x4a\x22\xb0\xe4\xc2\x9e\xd4\x97\xe5\x15\x55\x16\xb7\xd1\xc1\x59\x3c\x9e\xc0\xb5\xa2\x3d\x89\x9f\x78\x23\x25\xd6\xe8\xdc\xe1\xb1\xc3\x62\x56\x26\xd5\x36\x42\x04\xea\xc4\x8a\x7a\x40\x8c\x0a\xe0\x30\xf0\xa4\xce\x0a\x3e\x5a\xc7\x4f\xbc\x6d\xa5\x7e\x8c\x9e\x38\xeb\xd8\xc1\x31\x37\x48\x18\x00\x5a\x02\xea\xe8\x37\x73\xde\x18\x17\x22\x0c\xce\x0a\x96\x7c\xa2\xd0\x2b\x34\x2e\x18\x15\xd2\x74\x09\x36\x3a\x55\x65\x1a\x2f\xb7\x3a\xb1\x60\x7a\xb5\x29\x48\x7c\xb2\x3e\x38\x28\x5a\x84\x0c\x05\x07\x07\x4e\x5e\xfd\xa8\xae\xf6\x70\x72\x45\x65\x5e\x32\x50\x85\x86\xce\x9d\x04\x68\xe9\x6d\xa5\x95\xdb\x7d\xf6\xd8\xb1\x1d\x78\xc3\xd6\xb2\xb4\x93\xbd\xc0\xc6\xd4\xa7\x63\xd2\xaf\x32\xa2\xf7\x45\x1c\xfb\x98\xe9\x34\x7e\x16\x96\xca\xda\x94\xca\x06\xd7\x27\x4d\xd7\x33\x6d\x7e\x33\xce\x3a\x7a\x20\xa7\x69\xad\x20\xa0\xff\xcf\x8e\x99\xc5\x85\x76\x47\x70\x6b\x4a\xac\x12\x04\xea\x0f\xb0\x9a\xca\x96\xd1\xbb\x72\x6b\xb5\xce\xa5\xb5\xc4\xe7\xc4\xc2\xd6\xf8\xd3\xd5\x6a\xca\x53\x54\xf2\xc6\xc4\x01\xd6\x8a\xc8\x25\x4f\x94\x89\xff\xb8\xd6\x0f\xfd\x6e\xef\x6e\xce\xd6\x93\xdf\x70\xb6\x9e\x02\x00\x62\xb5\xa8\xf9\x41\x3f\x00\x30\xd5\x02\x68\xe8\xdf\x31\xff\x1b\x87\x17\x85\xe6\x6b\xa3\x55\x5e\x5f\xe3\xe2\x6f\xea\x3c\x96\x68\x4d\xc0\x9d\x44\xeb\xf5\xdb\x10\xad\x24\x8e\xa1\x59\x2f\xc0\xf7\x4c\x4c\x35\xd3\xcc\xb2\x65\x9b\x3d\x8d\x5a\xb5\x25\xe5\x22\x66\x88\x1f\x99\x6b\x29\x85\x53\xdd\x97\x5d\x67\x80\x2b\x53\x97\xd5\x53\xd0\x4c\x23\x38\x80\x1d\x4f\x27\xda\xb0\xdf\x97\x4a\x75\x9c\xaa\xc5\x4a\x7b\x37\x14\xcf\x70\xa1\x15\xfb\x56\x49\xe1\x28\xb7\xdf\xe1\x4c\x7f\x70\x7d\x6d\x7f\x22\xe6\xdb\x92\x26\xb5\x6c\x68\xbc\xcf\x4a\x4b\xa7\x80\x7c\xfa\x1f\xce\x61\xf4\x99\x5e\x1f\x03\x26\x9d\xc3\x68\x70\xed\x85\xd7\x81\x0f\x9c\xc3\xe8\x28\xc5\xab\x8c\x24\xe0\x50\x0b\x8e\x1f\x8a\xb4\x96\x29\x68\x37\xf3\x91\x53\xaa\xed\xab\x22\x0e\x41\x79\xec\x0d\x82\xa0\x0f\xb6\x13\xa0\x8c\xc4\xff\x0c\x00\x00\xff\xff\x6c\x0a\x94\x6c\xc9\x86\x1f\x00") - -func bindataTkgWebDistTkgkickstartuiMaines5341f46d0b99a14967f1eJsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiMaines5341f46d0b99a14967f1eJs, - "tkg/web/dist/tkg-kickstart-ui/main-es5.341f46d0b99a14967f1e.js", - ) -} - -func bindataTkgWebDistTkgkickstartuiMaines5341f46d0b99a14967f1eJs() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiMaines5341f46d0b99a14967f1eJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/main-es5.341f46d0b99a14967f1e.js", - size: 2066121, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiMsazure814a53b97d8fea22860eSvg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x5c\x8f\x3f\x4f\x84\x40\x10\x47\x7b\x3e\xc5\x64\xad\x1d\x66\xf6\x0f\xbb\x6b\x58\x0a\x6d\xae\xd8\x6b\x2d\xae\x33\xb2\x02\x09\x02\x39\x90\xbd\x8f\x6f\xd0\x18\x93\xeb\x26\x2f\x79\x93\xdf\xab\xd7\xbd\x83\x3c\xb4\x5b\x1f\x84\x76\x02\xfa\x34\x74\xfd\xf6\x7b\xef\x43\xca\xcf\xf3\x2d\x08\x02\x02\xed\xe0\x60\x1f\xc3\x38\x06\x31\xcd\x53\x12\x70\xfb\x1c\xa7\x35\x88\x7e\xdb\x96\xa7\xb2\xcc\x39\x63\x56\x38\x5f\xbb\x52\x12\x51\xb9\xee\x9d\x68\x8a\x7a\x79\xdb\xfa\x1f\xeb\xf1\xfa\x35\xa6\x20\xd2\x9e\xa6\xb9\x6d\x05\xbc\x8f\xc3\x72\xcf\xda\x20\xce\x2c\x91\xc8\x31\xb0\x45\xaf\x8c\x8e\xb2\x42\x66\x5b\x41\x15\x99\xd0\x93\xd5\xa0\x3c\xb2\xad\xcc\xab\xf2\x48\xd6\xa8\x13\xc5\x3b\xe7\x72\x3e\xd6\x2a\xd4\xcc\xee\xc4\x8c\xd2\x6b\x8e\x4a\xa1\x65\xef\x0f\x5b\x1b\xe3\xa3\x94\xc8\xc6\x80\x34\x68\x8c\x77\x51\x3a\x64\xe7\x3c\x38\x74\x52\x19\x15\xff\x3f\x5c\xfe\xaa\x1f\x88\xac\x7c\xa9\x44\xd9\x14\xf5\x91\xd7\x14\xdf\x01\x00\x00\xff\xff\x0d\x5a\xfe\x05\x3e\x01\x00\x00") - -func bindataTkgWebDistTkgkickstartuiMsazure814a53b97d8fea22860eSvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiMsazure814a53b97d8fea22860eSvg, - "tkg/web/dist/tkg-kickstart-ui/ms-azure.814a53b97d8fea22860e.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiMsazure814a53b97d8fea22860eSvg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiMsazure814a53b97d8fea22860eSvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/ms-azure.814a53b97d8fea22860e.svg", - size: 318, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiPolyfillses20153e69d632a8e7bb99faa8Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\xbd\x8d\x73\xe3\xb8\x91\x38\xfa\xaf\x48\xac\x2b\x86\x28\xf5\xea\x67\xef\xe5\xd5\x7b\x11\x17\x71\x79\x6d\xcf\xee\x24\xe3\xb1\xcf\xf6\x66\x73\xc3\xf0\xe9\x60\x0a\x92\xb8\xa6\x00\x2d\x08\xc9\xe3\xb1\xf8\xbf\xff\x0a\x5f\x24\xf8\x21\xcf\x24\x77\x57\xae\xb2\x48\x10\x9f\x8d\x46\xa3\xbb\xd1\xdd\x08\x76\x25\x1d\x95\x52\xe4\x99\x0c\xe2\xa8\xa4\xc5\x72\xfa\x4c\x1f\xb7\x24\x7b\xba\x58\xef\xd8\x93\x7c\x5a\xcd\x9f\xf2\xec\xa9\x94\x44\xc8\xf9\x2e\xc7\x5f\xcd\x71\x38\x24\x29\x9a\x6e\x77\xe5\x3a\x4a\x92\x3f\x7e\xff\xa7\x14\x5e\xff\xf4\xa7\xd3\x3f\x9e\xcc\x96\x3b\x96\xc9\x9c\xb3\x88\x82\x04\x86\x5e\xf7\x44\x8c\x04\x70\x20\x58\xae\xf3\x32\x0c\xd5\xff\xe9\x7c\x5e\x6e\x05\x25\x8b\x73\x21\xc8\xcb\xe1\xd0\x2d\x93\x2f\x23\x76\x38\x7c\x8f\x31\x26\x62\xb5\xdb\x50\x26\xcb\x69\x41\xd9\x4a\xae\xd1\x92\x8b\xc8\x56\x89\x4f\x54\xa5\xf6\x43\xcc\x7f\x20\x31\x9f\x4c\x50\x24\x0e\x87\x71\xc4\x47\x39\x1b\x49\x84\xc2\x50\xbd\x47\x02\xeb\x96\xa6\x5b\xc1\x25\x97\x2f\x5b\x3a\x2d\x8b\x3c\xa3\xd3\x8c\x14\x45\x24\xe1\x04\x38\x42\x20\x12\x9e\x62\x99\xf0\x14\xc5\x82\xca\x9d\x60\x23\x3a\xcd\x38\xcb\x88\x54\x75\xbc\x55\x01\x42\x55\x2c\x70\x3d\x0a\xf4\x3a\x6e\x46\x64\x20\x20\x31\x9d\x6e\xa9\x58\x72\xb1\x21\x2c\xa3\xb1\xfb\x3e\xd2\x39\x64\x18\xca\xe9\x86\x88\x27\xf7\x1b\x51\x54\xd5\x59\x44\x44\x15\x50\x4c\x26\x4a\xca\x9d\xa0\xde\xa3\xfe\x58\xb1\x28\xf8\xc4\x19\x0d\x50\xac\x5a\xe3\x98\x4e\xe7\x73\x95\x30\x2f\x5f\x36\x8f\xbc\x98\x6f\x05\x5d\xe6\x9f\x0f\x87\x60\x3e\xff\xe2\x25\xcf\x83\xa6\x27\x44\xf5\xc4\x0e\x9c\x4f\x68\xa5\x2a\xca\xf1\xf8\x04\x63\x4c\x13\x12\x05\x4b\x2e\x32\x7a\xb9\xdb\x16\x79\x46\x24\x55\x95\x5f\xac\x69\xf6\x14\xa0\x34\xce\x97\x11\x9d\xaa\x14\x3d\x75\xf9\xe1\x10\xb8\x5a\x83\x31\x56\xd0\xe2\xcb\x91\xc9\xa0\x66\xde\x36\x8d\xe4\x5a\xf0\xe7\x11\xa3\xcf\xa3\x2b\x21\xb8\x30\x23\x18\x91\x42\x21\xc6\xcb\xa8\xe0\x64\x41\x17\xd3\xc0\x9b\x0c\xf5\x5d\x77\x2b\xf3\x61\x5d\x0f\x40\x2a\xf4\x41\xaf\x06\xc1\xb6\x44\x50\x26\x31\x05\xf3\xca\xc8\x86\x62\x79\x26\xa7\xea\xe1\x70\x08\x76\x4c\x3d\x2c\x82\x59\xf0\x83\xe0\x5c\xfe\x39\xb0\xf9\xb6\x82\x6f\xa9\x90\x39\x2d\xb1\x86\x77\xf3\x7e\x38\xbc\x56\x36\x93\x82\xe0\x25\x2d\xe8\x8a\x48\x8a\x55\xff\x77\x91\xfa\x00\x7e\xcb\x0e\xd1\xcd\x5b\xbb\x0c\x48\x54\xd9\x41\xc9\x29\x29\x4b\x2a\xa4\x1a\xda\x2d\x91\xd9\x9a\x2e\xfc\xb1\x69\xc0\xde\x0a\xbe\xc9\x4b\x3a\xc6\xf8\x37\x0d\x82\xf3\x67\x22\xa8\x4d\x1c\x06\xe2\xf4\xb7\x72\xb4\x26\xe5\x68\x41\x25\xcd\x24\x5d\x8c\xe4\x9a\xc8\x51\xb7\xec\xe8\xbf\xa2\xe7\x9c\x2d\xf8\xf3\x61\x55\xf0\x47\x52\x20\xd7\xd2\x7f\xe9\xc2\x8f\x94\xb2\x11\xdf\x53\xf1\x2c\x72\x29\x29\x9b\xfe\x83\x5d\xf3\x52\x8e\x8a\xfc\x89\x16\x2f\xa3\x8c\x28\x92\x92\x97\xa6\x6e\x32\x72\x95\x6e\x79\xf1\xb2\xcc\x8b\xa2\xa9\xc3\xcc\xe4\x88\x2c\x25\x15\x23\xd7\xbd\xe8\xd6\xe6\xcb\xd9\xaa\x2e\x4b\xb6\xb9\xaa\x91\x71\x39\x62\x34\xa3\x65\x49\xc4\xcb\xe8\x79\x4d\xd9\xe8\x8b\x2d\x96\x97\x0e\x31\x46\xef\x97\xa3\x17\xbe\x1b\x6d\x76\xaa\x4f\x9c\x2c\x46\x9c\x51\x18\x2d\xf8\xa8\xe4\xa3\x47\xba\xe4\x82\xea\x64\x55\xbf\x2d\x3d\x45\x01\xaa\xe0\xe6\xf1\x37\x9a\xc9\xe9\x82\x2e\x73\xa6\x40\xa1\xe6\xf7\x25\x92\x10\x28\x44\x08\xe0\x75\x45\xe5\xcc\x47\x2f\x4b\x70\x28\x96\xd3\x6c\x27\xd4\x6c\xc6\x74\x6a\xa6\x35\x46\x14\xd7\xcf\x0e\x4d\x2b\xa0\x6c\xb7\xa1\x82\x3c\x16\x74\x36\x3e\x85\x8c\xb3\x65\xbe\xda\xd9\xf7\x93\x0a\x1d\xef\x81\xad\xbf\xdf\x09\x5b\xf7\x97\xa9\x1a\xc9\x7f\xbf\x81\x07\x52\x3e\x1d\x6d\xe4\xfa\xeb\xf5\xcb\xe9\x7c\xae\x60\x3b\xdf\x2a\x94\x6d\x10\x96\x03\x81\x4c\x63\xed\x9e\xe7\x8b\x91\x22\x1d\x59\x18\x46\x19\x1e\x9f\x22\xf8\x6d\xba\x26\xe5\xcd\x33\xab\xfb\xc3\x91\xce\x3a\xce\xc2\x30\xb7\x78\x6c\x71\xf8\xbc\x45\x03\x46\xba\x95\xd9\x28\x98\x70\x54\xd1\x42\x61\xdd\x32\x1a\xd3\x24\xb0\x24\x6e\x91\x97\xaa\x6b\xf3\x60\xc2\x53\x43\x6d\x4b\xac\x97\xc1\x2c\x98\xf0\x98\x45\x25\x82\xdf\x14\x69\x27\x7a\x7b\xb9\x40\x20\xa2\x12\x4a\x54\x1d\x45\x85\x86\xca\x43\x60\x26\xf7\x28\xb0\xfc\x45\xfe\x2f\xcf\x8b\xdf\x9e\x22\x4b\x5f\x69\x4d\x65\xf9\x96\x39\x6a\xf6\xaa\x15\x95\xb8\xbf\x23\xe9\xda\x56\x54\xd3\x9e\x5f\x73\xb9\x8e\x28\x52\x94\x5c\xa2\x9a\x36\x79\xe4\x30\xa1\x69\xd5\xad\xd3\x15\x6c\xd5\xed\xd6\x8b\xa9\x3f\x96\xb1\x9e\xe4\x56\x5d\x5d\x44\xa0\xa8\x6e\x32\x96\x58\xd6\xf0\xb4\x89\x6c\x57\x14\xed\xb6\x97\x5c\x3c\xb5\x1a\xd5\x08\x31\x4c\x0b\xef\xb7\x34\x1b\x09\xfa\xfb\x2e\x17\x74\x31\x6e\xb6\x93\x3e\x29\xd7\xd5\x1a\x4a\x4e\x51\xbb\xc1\x67\x41\xb6\xd8\xe7\x52\x74\x93\x43\xbb\x5c\xbf\x13\x57\x9f\xb7\x34\x93\x8a\x0c\xd5\x3b\xd5\x8a\x4b\x85\xce\xd4\xec\xd6\x0c\x0f\xf4\x25\x67\x92\x8a\x8c\x6e\xa5\xed\x10\x48\x04\xc2\x80\xd4\x0e\xa0\x8f\x1e\x62\x2a\x76\xec\xa7\x1d\x11\x0b\xba\x88\x98\xde\x8e\xa0\x66\xa0\xd4\xa6\xd3\x1e\x94\xd8\x31\xdc\xe6\xbc\x40\xa0\xd7\x2f\xf8\xd5\x80\x7f\xf6\x05\x54\x8f\x66\xaa\x9a\x2a\x96\xe2\xe5\xf5\x38\xe4\x72\xb6\xe7\x4f\xb4\xee\xaa\xae\xa9\x5a\xe6\x8c\x14\xc5\xcb\xeb\x17\xfc\xc5\xd2\xc8\x7e\x07\x6c\x6f\x07\xfa\x51\x53\x10\x19\x86\x91\xc4\x0a\x09\x10\xbc\xd1\xb9\x7f\xa1\x83\x99\xa2\x2b\x11\x37\x08\xda\x2f\xb3\x26\x6c\x51\x50\x33\x8b\xba\x20\x47\x76\x76\x79\xf5\x4d\x83\x53\x64\x16\x0f\xf0\xb6\x54\x93\xf1\xb1\x9e\xcd\x3e\xbe\x9c\x8f\x24\x29\x9f\x46\x19\x61\x23\xce\x8a\x97\xd1\x23\x1d\x89\x1d\xd3\xfc\xec\x9a\xea\xad\x6c\xc4\x97\xa3\x4c\x50\xa2\xaa\x1d\x8f\xa2\x0b\xfb\xa8\x50\xca\xd6\x7d\x38\x6c\x90\x66\x75\x26\x41\x3c\xba\xfa\x4c\xb3\x9d\xcb\xa0\xc7\x69\xbe\xa0\x00\x19\xce\xad\x94\x44\x2a\xf6\xe2\xf1\x70\xa0\x53\xd5\xf9\x31\xc6\x97\x61\x58\x3f\x7f\xb2\x5c\x3c\xae\xb3\x3e\xc7\x42\x7d\x9f\x4b\x41\x58\x99\xab\xba\x1f\x78\xf4\x0c\x57\x08\xf4\xc0\x2f\xf8\x8e\xc9\xc9\xc4\xf2\xa2\xd7\xf1\x35\xa6\x6f\x4d\x9d\x69\x08\xe3\x4f\xaa\xce\x05\x91\x24\x0c\xc7\xe6\x61\x9a\x97\xb7\x54\xe4\x7c\x91\xab\x7d\x44\xb1\xdb\x2c\xa3\xc5\x3b\x86\x0d\x76\xa0\x6f\x42\x4b\x35\x0d\xde\xcc\xbb\x79\x27\xdf\x3c\xef\xc4\xcd\x3b\x69\xe6\xdd\x83\x9a\xea\xb5\x7b\xb9\xd1\xdd\x34\xc3\xb9\x54\xe0\x34\xc3\xe9\x8d\xe6\x6c\x00\x7e\x57\xf0\x8c\x66\x51\x03\x40\x7c\x62\x39\xca\xdd\x76\x41\xa4\x1e\x86\x4e\x8f\x28\x7c\x77\x8a\x60\xa0\x86\x47\x78\x86\x47\x84\xd4\x3a\x71\x58\x09\xd7\x98\x57\x1d\xd4\x2c\x15\x9b\xb9\x2b\x68\x07\x3f\x3d\xdc\x54\x55\x1b\x1c\x35\x48\x7a\x84\xa8\x2b\xd1\x40\xe7\x6b\x6f\xdf\x0a\x75\x15\x0f\x27\xa8\x6b\xc9\xa0\xb4\xe4\xa3\xc0\x49\x54\x35\x1e\x42\x30\x7a\x5e\xe7\xd9\x5a\xb1\x76\x0b\x5a\x66\x94\x2d\x08\x93\xa5\xc2\x71\x85\xef\x5c\xe4\x2b\x05\x72\x83\xf8\x01\x72\xe5\x4d\xbb\xba\x06\x84\xf4\xae\x61\x57\x61\x17\x26\x0f\xf0\xe8\xc8\x6c\x92\xc6\xb4\x3d\xd7\x25\x66\x60\x93\xec\xc8\x14\x3a\x0e\xd1\x63\x1f\x66\xf5\x1e\x61\x10\x49\x28\x99\x43\x0d\xbf\xdb\xf4\x0d\xa8\xc6\x07\x84\x86\x3e\x8a\x09\x04\xa2\xaa\x05\x9d\x4e\x1f\x31\x66\x4e\x9c\xe8\xa3\xc2\xa9\x5a\x73\x1a\xfd\x30\x7e\x18\x42\xaa\x07\x04\x74\x78\xfe\xaf\xf3\x4c\xf0\x01\x22\xa5\xc8\xaf\xbf\xa8\x5a\x63\x57\x94\x6a\x19\xdd\x3a\x2a\x0a\x76\x25\xa2\x23\x4d\x90\x63\x4d\x00\xff\x6a\x23\x9f\xa0\xc9\x7b\xa4\xfe\xab\xbd\x65\x67\xff\x95\xfa\x2f\x8f\xd7\x6f\x08\xcd\xf1\x05\xf2\x4f\x10\x6f\x53\x55\x41\x17\xff\x4b\x24\xbc\x3b\xe3\xf7\xa0\x08\x89\xd9\x13\xfb\x98\xd7\x0c\xac\x83\xc5\xf2\x38\x16\xdf\x7f\x1b\x0e\x4b\x04\x35\xcf\xf6\x16\xe1\xea\x53\xad\x7b\x7f\xdf\xc0\x27\x5d\x7c\xed\xd6\xd3\xe1\xc4\xcc\xe2\xee\xae\x9a\xf8\xbb\x53\xc3\x3b\xf4\x97\xbc\x62\x25\xe2\x5a\x91\x84\x4f\x62\xf1\x03\x73\x6a\x24\x31\x99\x20\x96\x88\x74\xa0\xf3\x9a\xac\x2b\x36\x0a\x64\x15\xa1\x38\xf3\x74\x19\x98\x68\x12\x53\x42\x81\x5f\xd5\xcc\xcc\x82\x00\x38\xfb\x99\x94\xaa\xf8\xec\xe8\xea\x52\x40\x2c\x0d\x42\x2a\x7e\x04\x38\xbb\xf7\xb0\xf4\xad\x72\x6d\x6c\xb6\x85\xdf\xd7\xdb\x5d\xaf\x28\x70\x20\x5e\x71\x6f\x63\x74\x1f\x55\x05\x17\x35\x72\xbc\xd5\xb6\x87\x42\xba\xe5\x0a\x76\x83\xfa\x18\xea\x58\x1e\x83\x0c\xd2\x41\xb2\xc4\xaf\x1b\x47\x79\x66\x27\xb0\x21\xcd\x33\x75\xcb\x79\x76\x62\x95\x2d\x9a\x34\xd3\x96\x6a\xa5\x56\xbd\x48\x9b\xac\xf8\xf6\x4f\xf7\x8a\x48\x46\x2c\x0c\xd9\x94\xb3\x77\x5c\x3c\x9d\xb1\x99\x74\xdf\x90\x97\xf3\xb2\x58\x49\x93\xd7\x65\x94\x2e\xa3\xfa\xe4\x67\xbd\xd8\x09\xa1\x64\x88\x4e\x76\xd7\x2f\x57\xcc\x65\x73\x45\x6b\xde\xdd\x75\x6a\xaa\xe6\xc6\xa6\x99\x6e\x79\x59\x7a\xa5\x5a\x1d\x6c\xca\xc9\x56\x39\xbf\xab\x75\x62\xaf\xbf\x5e\x69\xbf\xd3\xbd\x02\x4d\x4d\x0a\x2f\x5a\xdd\x56\x09\xae\xcf\xe6\x63\x3b\x73\xa7\xb7\x3a\xbb\x6c\xb2\xb7\xfb\xa9\x52\x06\x3a\x69\x0a\xb5\x7b\xe8\x67\x75\x15\x78\x24\xc7\xeb\xe3\xcf\x4d\xaa\xe9\x68\x2b\xdb\x40\xd9\x56\x97\xfd\xd2\xb2\x53\xda\xef\xbc\x97\xdc\x1b\x41\xab\x0e\x7f\x18\x03\x85\x5c\x7d\xfe\x0a\xf6\x06\xe3\x13\x00\x33\x9a\x76\xc6\xa1\xe2\xad\xf1\xb4\x2a\x90\xdd\x0a\xfc\x11\xf9\xe9\xbd\x21\xb5\xab\xf1\xc7\x34\x54\xac\x3d\xc3\x9d\x21\x35\x64\xc9\xc7\xa3\xf6\x70\x9a\xb4\x01\x7c\x6a\x86\xd2\xce\xd6\x2f\x7c\x04\xb7\xfa\x83\xe8\x17\x71\x95\x35\xd4\xcd\x1b\x42\x43\x18\xcd\x10\xfc\x4c\xfd\x82\xad\x21\x78\x45\x65\xbb\xa8\x3f\x84\x26\xb5\x37\x04\xbf\x02\x7f\x08\xfd\x22\x0d\xaa\x96\xae\xff\xbb\xa2\x68\x27\x9a\xbe\x0d\x26\xdf\x3c\x33\x2a\x06\xbe\x35\x3d\xda\x15\x45\x6c\xf6\x4c\x4b\x67\xed\x0e\x17\x47\xe2\x70\xd0\xfa\xf2\xa6\x6d\xa4\xc4\xf6\x4e\x77\xd4\xfa\x1c\xea\x8f\x3c\xd6\x19\x4f\xad\xde\xed\x0c\x85\x2e\x9a\x1e\x0e\xd1\xe0\xd2\x2a\x8e\x2d\x19\xf9\xd6\x42\xa8\x61\x8d\xa0\x8d\x48\x75\x33\x2d\x64\x2f\x86\x11\x59\x1e\x47\xd1\x4e\x03\xcd\x34\xd7\x0d\xb4\x50\xb1\x18\x46\x33\x79\x1c\x81\x9a\x06\x50\x23\x5a\x1c\x55\xa2\x29\x4e\xaa\xc5\xbc\x99\x9d\xf3\xcc\x7f\xb1\x3b\x60\xd4\xde\x4c\x9b\x8d\x5a\xab\xa9\x66\x8a\x1d\xce\x22\xc3\x29\xf9\x0d\xd6\xbb\x4e\x4f\x27\xd2\x6a\xd7\xdb\x1a\xcf\x7a\x29\xfe\x9e\x16\x0d\xec\x9b\xc7\x76\x44\x2b\xfa\xcf\x64\xb7\x4b\x6a\x5a\xbe\x2a\x3b\xd4\x5b\xdf\x59\xfb\xb5\xc6\x8b\xa8\xbb\x23\x0e\xee\x78\x9e\xb8\x31\x93\x53\xb2\xdd\x16\x2f\x96\x77\xf3\xfb\xe4\xed\x19\x83\xd3\x33\x1e\xd8\x0b\x0f\x87\x81\xc4\xf6\xc6\x14\x0d\x6e\x83\xc7\x37\x37\xe8\x4f\xe0\x11\xbd\x41\xc3\x83\xcb\xb8\xd6\xa8\x74\x76\xad\x0e\x25\x50\xd4\xa3\xcd\x95\x9b\xa3\xe4\x61\x32\x80\x20\x72\x3a\xd2\x76\xb5\x1d\x02\x30\xd0\xb4\x37\xc6\xa1\x55\xae\x07\x89\x0e\x07\x55\x3f\x8a\xdd\xd9\x82\xac\x47\xfa\x8e\x21\xff\x25\xb2\x99\x8c\x46\xdb\x68\xc7\x6e\xfb\x42\xa0\x6a\x61\x94\x97\xa3\x4d\x5e\x96\x39\x5b\x8d\x9a\x0a\xa6\x01\x8a\xe7\x51\x73\xfc\xc7\x86\xd0\xf1\x1b\x24\xf2\x16\xed\x39\xeb\x27\xb5\x08\x56\x8f\x5c\xf5\x10\xb4\x0b\x12\xdd\xe0\x4c\xea\xd3\xed\x47\x92\x3d\x1d\xc5\xd5\x41\x31\xb9\xc6\x87\x06\x1b\x5a\xfb\xa5\x9b\x4b\x3f\xb1\x45\x00\x7b\x85\xbc\x0e\xf7\xe9\x9c\x9e\xc3\x7a\x5a\xc6\xb2\x56\x12\xb6\x95\x52\x6e\x52\x18\x97\x56\x24\x27\x8f\x05\x0d\x50\xcc\x70\x53\xe4\xf8\xd4\x58\x9c\xec\x0c\xb3\x11\xb2\x3d\xd4\xee\x24\x34\xdb\x64\x1f\xbd\x87\xf7\x36\xb3\xf4\x8c\x58\xee\xc4\x27\x5f\xda\xd6\x27\xfe\xed\xee\x7d\x93\x88\xdc\x95\xc3\x40\x60\x96\xd0\x14\xb8\xfe\xc1\x62\xa2\xd7\x2f\xff\xe1\xa4\x8f\xd2\xd7\x5c\x18\x25\x5e\x39\xa2\x5a\x17\xa1\x0f\x95\x29\x1b\x3d\x53\x41\x6b\x04\xd7\xc7\xf5\x27\x63\x2c\xc2\xf0\x64\x8c\xb9\xa5\x4a\x6b\x7f\xf4\x7a\x9b\xf0\xe4\x3f\x36\xad\x9f\xff\xec\xcb\x82\x6c\x5a\x3f\xff\xd9\x97\x0b\xd9\xb4\x7e\xfe\xf3\x09\x64\x6b\xc2\x56\x74\x46\x2b\x85\x97\x55\x84\x60\x79\xc4\x32\xc0\x4a\xb9\x90\xdb\xf3\xc9\x46\x9f\xe1\x31\x3c\x3d\xc5\x6b\x5f\x6f\xe0\x68\x89\xd6\xb7\x05\x8c\x4b\x47\x7f\x16\xd6\x82\x40\xab\x7e\xcd\xd9\xcb\xb4\xe4\x3b\x91\x51\x2c\xcc\xdb\x82\x48\x82\x09\xb4\x94\x51\xef\x18\xce\x4d\x4a\xad\xd9\xce\x60\xcc\xfb\xf0\x77\x2b\xd1\x61\xb0\x39\x42\x5c\x04\x28\xb6\xa5\xcd\x67\xcc\x8d\x1e\xc2\x2a\x33\xd5\x27\xbb\xc5\x31\xac\x75\xfa\x24\x0c\xc9\x74\x57\xd2\x9f\xce\xa4\x47\x6d\x86\x8e\x1a\xbd\xcf\xc6\xca\x85\x42\xd9\x39\x52\x42\x55\x35\x90\xbb\xb7\xbb\xd3\xc3\x21\x32\xdc\x08\x82\xf7\x93\x89\xaf\xb3\xf7\x4f\x0b\xc0\xaa\x74\xed\xc1\x89\x2d\x5d\x2b\xdc\x4f\x31\x7e\x1f\x86\x4f\x11\x82\xf7\xdf\x7d\xf7\x6d\x67\xb7\xaa\xba\xaf\x9c\xa5\xfe\xb7\xce\xd3\xfd\xb6\x34\x46\x7c\xa5\x31\x9d\xe7\x9f\x3b\xb9\x35\x68\xe1\x90\xec\x8e\xfe\xbe\xa3\xa5\xf4\x71\xdc\xae\xe9\xb6\x3e\xed\xa1\xa3\xcd\x6c\x7d\x1f\x3a\x91\xf2\xfa\x37\xd6\x5a\xb3\x76\x02\xeb\x23\x64\x5b\x91\x6f\x60\x30\xfa\x43\xa3\x9f\xf7\x16\x00\x04\x7f\x98\x8d\xdc\x99\x40\xd3\x93\x91\xe4\x7e\x01\x95\x0d\x46\xb4\x3e\x2c\xd5\x6d\xb7\x6a\x84\xc0\x7b\x63\x67\xc1\x88\x8b\xd1\x1f\x82\x09\x9b\x04\x7f\x08\x66\x41\x00\x01\x8c\x9e\x49\xd9\xeb\x84\x19\x05\x04\x7f\x98\x06\xc8\x2e\x17\xbb\x7e\x29\x50\x7d\x7c\x33\x70\x08\x64\xb5\x84\x6d\x30\x4a\x7e\x2f\x45\xce\x56\xf8\xc8\x04\x9b\xb3\x1e\xa3\x10\xb7\x27\x27\xe6\xdc\xc7\x10\xef\xf7\x8b\xb3\x7e\x52\x5d\x69\x84\x66\x16\xcd\xfa\x0d\x5a\x33\x33\xb5\x82\xba\x3d\xfa\xcb\xfd\xcd\xc7\x7e\x7f\x5e\xd5\xd7\x59\x33\x35\x7a\xbc\xe6\xdd\x40\xc3\xcc\xcc\xcc\x9f\xa5\xfa\x50\xae\x39\x59\x01\xb7\x3a\x67\x2d\xfa\x58\x19\x0d\x28\x6c\x31\x89\x82\x92\xca\x87\x7c\x43\xf9\x4e\x06\x08\xd6\x2a\xc5\x5a\xf3\x04\x08\x16\xea\x55\x6d\x13\x01\x82\x3d\x4e\x52\x58\xe1\xf1\x69\x63\x71\xf6\x12\x99\x73\xf4\xf2\x70\xa0\xc9\x3a\x0d\xc3\xa8\xc4\xea\x61\x2a\x68\xc9\x8b\x3d\x8d\x4e\x10\x82\xd2\xed\x5e\x65\xb2\x48\x63\xa6\x79\xb5\x72\xaa\x2a\x55\x72\x93\x06\x8c\x3e\xdb\xd6\xcc\x1b\x4d\xb6\x69\x24\xe1\xc4\xb3\x9e\x9b\x47\x14\xbd\x9e\x60\x4d\x3d\xd4\xcf\xde\x6a\x7a\xc3\xf0\x25\x7a\x42\x40\xc3\x70\x6f\x78\x4f\xdf\xe4\xee\xc9\xd8\x5e\x8d\x57\xc6\x9e\x61\x85\xc7\x27\xb1\x2b\x18\x9b\x0e\x51\xbc\x8f\xd5\x98\xe2\xe6\x6c\xec\x24\x96\x3f\x50\x97\x4b\x4e\x26\xb5\x6a\x3a\x91\xa9\xa6\x7a\xac\x4d\xe1\x18\xe8\x2d\xc5\x60\x5a\x7d\x96\x74\x31\xe5\xec\x17\x66\xf0\x63\x61\x56\x9b\x40\x55\x55\x5d\x98\x9d\x52\x6d\xc2\x97\x82\xe4\xec\x92\x33\x1a\x21\x0d\xd2\x4a\x5b\xc5\x6d\x9c\xee\xf9\xe3\xcd\xe8\xd3\xcd\xc7\xab\xa0\x82\xc7\xee\x1e\xf5\x80\x03\xbb\xf7\xe4\x6c\x15\xc0\x55\xfd\xaa\x3e\x3e\xe3\x40\xec\x18\xd3\x5f\xee\x71\x60\x68\x8f\x7e\xbb\xc1\xc1\x8e\x3d\x31\xfe\xcc\x02\xb8\xc5\x41\xbd\x65\x07\xf0\x09\x07\xf5\x46\x1d\xc0\x25\x0e\xea\xed\x39\x80\xdf\xf0\x6b\x05\x17\xf8\xd5\x68\xc9\x67\x04\xac\xf9\x91\xe2\x71\xde\x09\xd5\xd5\x01\x13\xa7\x0a\xba\xc3\x9f\xdd\x41\x7f\xe4\xb3\x3b\xe8\x1d\x63\xcd\xe6\x50\xae\xf9\xf3\x2f\x2c\x23\xbb\xd5\x5a\x9a\xc2\xbd\x26\xc6\x59\x42\xa2\x20\x5f\x31\x2e\xe8\x05\x67\x25\xb7\x6c\x55\xab\x58\x80\xd2\x0a\xb4\xdd\x91\x3d\x61\x12\x83\x84\x3d\x71\xb9\x6e\x9c\x35\x4b\x4e\xcb\xd9\x9d\x49\xbb\xa6\x72\xcd\x17\x03\x63\xbc\xab\xe0\x31\x67\x8b\x73\xb7\x8f\xbe\x51\xef\xc3\x9a\xb2\xe1\x1a\x4c\x13\x35\xbf\x74\x3c\x8f\x1e\xc0\xad\x23\x19\xc3\x19\xf3\xf2\xfd\xd5\x8d\xb8\x5a\xac\x06\xbe\x8f\x4f\x2b\x58\x51\xf9\x93\xb6\x11\x34\x24\xaa\xd5\x63\xb7\x15\x5f\xb6\x76\xc7\xe1\x76\x4c\xce\x9f\xa8\xf4\xcc\x7f\x2e\x69\x99\x89\x7c\x2b\xdb\x73\xe5\xf2\xea\x93\x31\xda\xfe\xa2\x4d\x71\xef\x8b\x3c\x1b\xe8\x6d\x0d\xb9\x8b\x82\x94\x03\x90\x55\xbd\x78\x16\x64\xfb\x6b\x2e\xd7\x17\x0d\x3a\x0e\x67\x5c\xe6\x85\xa4\xc2\x9b\xd9\xc1\xe6\x88\x94\x24\x5b\xdf\xe8\x83\xea\x07\x6e\xad\x38\x87\x2b\x9c\x0b\xba\xf8\x06\x30\x99\x01\x58\x9e\xee\xc8\x20\x18\x91\xf9\x9e\xde\xf7\xd6\xc0\x4b\xe5\x99\x5a\x68\xfa\xa2\x09\xbb\x51\xca\x78\xf4\x06\xae\x0d\x43\xfb\x1e\x9f\x34\x14\xf9\x4e\xc1\xd7\x1a\x4e\x05\x60\x4d\x8a\xc1\x58\xde\xe2\xac\x8a\x82\x1d\x73\x9c\x67\x6d\xf2\x64\x6c\x48\xc3\xd0\xda\x92\x1e\x86\xf2\x94\xb4\x58\x86\xa1\xfa\x7f\x70\xc6\xa6\xb1\x21\xa2\x76\xcf\x5b\x1d\x41\x09\x90\x78\x90\xf9\x02\xe6\x95\xac\x91\xfb\x66\x09\xc2\xa5\xeb\xd3\x55\x0a\x7c\xd8\xf2\x1b\x72\x1c\x90\xc5\x42\xaf\x8d\x0f\x79\x29\x29\xa3\x22\x80\x0c\x07\x82\x6e\xf8\x9e\x76\xd2\x4b\xdc\xb1\x5d\x8e\x72\x04\x45\x2f\x31\x43\xb0\xc3\x81\x14\x3b\x1a\xc0\x12\x07\x4b\x52\x94\x34\x80\x6d\x2f\x5f\x10\xa0\x06\xe4\xeb\x96\xea\x4d\x67\xb5\x64\x52\x5b\x9d\x19\x3d\x5a\x9d\x7b\x31\xa0\xa2\x6a\x95\xe9\x1d\xbc\x7b\x05\xf4\x2e\xb1\xef\x76\x07\x56\xf8\xf8\xb4\xc2\x0b\x5e\x9d\x99\xc7\x99\x61\x6c\x60\x8e\x57\x61\xf8\x72\x38\x04\x5c\x03\x3a\xc0\xc7\x27\x39\xf6\x36\x54\x3d\x4a\xb7\x57\x32\xec\xf6\xc9\xef\x4e\x63\xf6\x67\x7c\x12\xb3\xef\xbe\x43\x8d\x3d\x5d\x5d\x27\x4d\x98\xe2\x0b\xd4\x0f\x5e\xeb\x1f\x90\x93\x60\x1e\x4c\x18\x6a\x0c\xc3\x1b\xf0\x6c\x1a\x1b\xf6\x31\x3d\x1c\xc6\xa7\x63\x8c\xe9\xf4\x59\xe4\x52\xb1\xd7\x61\x38\x8e\x86\xda\x50\x38\xe4\xf8\x36\x6d\xd2\x52\x52\x69\x80\xf5\x38\x08\x9a\x5f\xb9\x78\xa2\xc2\x10\xc4\xfb\x8c\x6f\xa9\x19\xf5\x28\x67\xa5\x54\x7b\xe6\x50\x16\x78\xc0\xe3\x28\x60\xcf\x41\xce\x46\x73\xe4\x71\x89\x73\x85\x9a\x19\x2d\xcb\x30\x0c\x12\x03\xd2\x91\x4d\x49\x03\x8c\xf1\x6b\xd5\x61\x03\xeb\x02\x08\xae\xf0\xf8\x21\x0c\xc7\x8f\x6a\x60\xe3\xd5\xe1\x30\x7e\x99\xfe\xfc\x70\xfd\xe1\xaa\xa0\x6a\x5f\x41\xf0\x8c\xff\x27\x9a\x79\xab\x85\x7b\xb5\xc5\xdf\xf4\x6c\x24\x30\x3d\x1c\xe6\x46\x52\x77\xd6\xa6\xf7\x89\x39\x40\x4f\x63\x79\x38\x44\xde\x3b\xde\x47\xc1\xcd\xc7\xf9\xed\xdd\xcd\xed\xd5\xdd\xc3\x7f\x06\x13\x93\x8e\xac\xd5\x8e\xb5\x7a\xd4\xa6\x69\x7a\x17\x3e\x1c\xe6\xc0\xb1\x50\x3c\x95\x45\x80\xab\x30\x14\x18\xe3\x97\x30\x0c\xa8\xde\xbc\xf5\x24\xaa\x4a\xce\xb4\xfb\x42\xc4\x30\x0f\x43\xde\x70\xd1\x40\xa7\x1b\x5a\x96\x64\x45\x81\x4e\x97\x79\x41\x35\xb3\x4b\xa7\x45\xce\x28\xe3\x40\xa7\x19\x2f\xf4\xaf\xae\x0e\xa1\x30\xa4\xd3\xad\xd0\xc3\xb9\xa4\x4b\xb2\x2b\x64\x84\x34\x6d\x1d\xd7\x75\x1b\x0d\x59\x47\x3e\x56\xa0\x63\x43\x85\x81\x55\x55\xb3\x38\x6e\x23\xbb\xa0\xd5\x80\x09\xa6\x5a\xd1\x16\x2b\xfe\x93\x84\x21\x0f\x43\x1a\x71\x10\x28\x0c\x23\x82\x5f\x7d\xe1\xf1\x64\x40\x78\xd4\x02\xbe\x9f\x6c\x6a\xcd\x15\x94\x39\x0b\x26\x62\x12\x6c\xcd\x0e\x65\xac\xff\xc6\xac\x6b\x8d\x9b\xa3\xc3\x61\xcc\x92\x3c\x45\xaf\x0b\x5a\x50\x49\x47\xa4\x5e\x41\x50\xa7\xec\x49\xb1\xa3\xb1\x71\xc6\x20\x6a\x01\x41\x89\x89\x5a\x38\x50\x60\x61\x68\x6c\xf4\xbd\xa2\x87\xf7\x49\x91\xc6\xbb\xc3\x21\x32\x8f\xbd\xd9\x2e\x10\x02\x5d\xf0\x88\x85\x72\x3c\x96\x61\xc8\x30\xc6\x73\x6d\x07\x3a\x47\x20\xc3\x70\x68\x19\xcb\x64\x97\x86\xa1\x9c\x0e\x50\xf0\xa8\x80\x1b\x04\x65\x18\x96\xce\xe3\xc7\x98\x93\xaa\x22\x98\xc2\x10\x4d\x50\x35\x75\x37\x08\x55\x0d\x8c\x4f\x11\xaa\x80\xb4\x6d\xaa\x9d\x48\xa0\x3b\xac\x8d\x91\x9b\x3e\x53\xd5\xe7\x31\x45\x9e\x35\x73\x6c\x5d\x82\x92\x5d\xda\xb6\xb8\x56\x6f\x99\xa9\x8c\xe3\xcc\x13\xfb\xb4\x62\xce\x65\xd3\xe0\xf2\xb0\x99\xa3\xc1\x21\x58\x48\x9c\x4b\x29\xf2\xc7\x9d\xd4\x46\x7d\x9d\xa4\x48\x20\xe0\x1d\x3b\x6b\x8d\x8c\x04\x81\x42\x01\x3c\x3e\xa9\xaa\x86\xbc\x7e\xf2\x55\x06\xa8\x6d\x41\x23\x7d\x0b\x9a\x5b\x25\xce\x2b\x74\x93\x89\x48\x81\x59\xf5\xac\x19\x96\x27\x32\x91\x51\xce\x46\x14\x05\xba\xdb\xc4\x62\xcd\x09\x7c\x8f\xd4\x8a\xd2\x42\x19\x69\x0c\x75\x72\x7c\x12\xe7\x3f\x70\xd7\x4c\x6e\x9b\xe1\x49\x9e\x6a\x7d\xa8\xca\x73\xa9\xd1\xdc\x9a\x0c\xbe\xb7\xe4\xd8\xdf\x6d\x7f\x73\xc8\xc5\xf0\x3c\xa1\x1a\xfa\x0c\xbd\xce\x93\x7d\x44\x51\x8a\x19\xa8\xc4\xee\xb4\x4a\xfc\x14\x35\x66\xd4\x14\xc5\xe5\x73\xae\x2d\xa6\x9c\x4f\xda\x6b\x46\x4a\x3a\x3a\xd1\x42\x72\x72\x99\x6a\x97\x20\x16\x3f\x0a\x4a\x9e\x62\xfd\xe9\xb4\xfd\x29\x92\xc9\x49\x8a\xfc\x0c\xdf\x0f\x64\x00\x99\x9c\xb6\x73\xfd\xfb\xb1\x5c\x20\x93\xef\xdb\x59\xff\xf8\x66\x56\x90\xc9\xbf\xd7\xf9\x17\x86\x28\xcd\xfa\xb6\x6c\x62\x35\x2a\xf2\x52\x8e\x24\xe7\xa3\x82\xb3\xd5\x34\x40\x55\x05\xd7\x91\x02\x92\x9a\x54\xe7\x87\x67\x9a\xf0\x59\x74\x33\x6b\x42\x4d\x2f\x47\xc1\xdf\xaf\x3f\xfc\x2c\xe5\xd6\x6a\xaf\x34\x75\x0e\xc3\x40\xd0\x72\xcb\x59\x49\x7f\x2c\xf8\xa3\x4a\x13\x9e\x1f\x20\x43\xaf\x03\x18\xcd\x13\x96\x9e\xa9\xc6\x1b\x6e\x4e\xf1\x05\xc3\xda\x98\xe4\x32\x4d\x58\xea\xd1\xe5\xe4\x32\xf5\x55\x97\x33\x19\xb5\xab\x02\x06\xaf\xa5\x2f\xe4\xc9\xc1\x4e\xc8\xb3\xa8\xa9\x1e\xaf\x23\x09\x74\x12\x4c\x15\x43\x02\xd7\xde\x17\x90\x08\xcd\xbc\x8c\x52\x0b\x51\x47\x54\x83\x26\x4f\x55\xa1\x2a\x12\x1e\xe8\x18\x0a\xea\xde\x05\x63\x8c\x45\x18\xf6\xa8\xb5\xde\x17\xd4\x40\x12\x91\x62\x96\x88\x14\x79\xeb\xf5\x22\x92\x66\x63\xa9\x17\x1c\x96\x31\x09\xc3\x31\xe9\x57\x13\x23\x82\x99\x5a\x6f\x6a\xd3\x51\xcb\x56\xef\x37\xd2\xcc\xb2\xda\x3e\x04\x82\xcc\x98\x00\xe4\xcb\x88\x84\x61\x34\x8e\x32\x4c\xd4\x3e\x71\x38\xf4\x2b\xcc\xb5\xef\xa5\xc9\x80\x89\xa2\x02\x1b\x55\x88\x46\x04\x04\x42\xc8\xf9\xe9\xf0\x28\x83\x5c\xed\x76\x2a\xcb\xc0\x4c\x96\xdd\x2d\x55\xe1\x9f\xae\x2e\xab\x4f\x6a\xb2\x66\xc0\x5f\x5a\x5e\xa7\xa6\xb7\xf5\x47\xee\x3b\x63\x2e\x88\x24\x71\xe3\x84\x27\x56\x65\x22\xa7\xd9\xe3\xfb\xc5\xe7\x56\x37\xdc\x99\xdc\xf0\xfe\x5e\x81\x70\x1f\x2c\x73\x02\xa6\x2e\x04\xb4\x12\xf8\x42\xf7\xc6\xdf\xd6\xba\xae\x1b\x52\x7b\x3a\xe8\x89\x31\x2f\x71\x4d\xe2\x75\x5f\xfe\x8c\x4f\xc2\x70\x00\x09\x45\x62\x33\xa4\x67\x8b\x88\x58\x5d\x5d\x9d\x06\x04\x38\x9a\xd5\x7d\xd6\x36\x7a\x9e\x0c\x71\x6d\x78\x71\x9a\xa8\xad\xd8\xd2\x4a\xa7\xf7\x0c\x90\x42\x55\xd5\xa3\xf7\x78\x7c\x0a\x77\x2d\x7d\xdd\x07\xa3\x15\x7b\xef\xf6\xa1\xbb\xf8\x3d\x1e\x9f\x68\xcd\x96\xd9\xfe\x5e\xa6\x8c\xec\xf3\x15\x91\x5c\x4c\x77\x25\x15\xe7\x2b\xca\x64\x1c\x7d\x67\xd8\xf0\x9c\x2d\xe8\xe7\x9b\x65\x14\x5c\xdf\xbf\xbf\x1a\x05\xe8\x70\xe8\x7e\x78\x10\xf9\x82\x32\xf9\x7f\x86\xbe\x5d\x2d\x56\xf4\xff\x04\x1a\xab\xee\xf0\xf8\xc4\x33\x5b\xad\x6a\xa1\xd8\x4a\x36\x8d\x6b\x9a\x91\x64\x7d\xa7\xc7\x00\x06\x1d\x94\xbf\x2a\x87\xf2\x61\x39\x34\xb6\x93\x37\x35\xd2\x14\xe4\x38\x49\x21\xf3\xbc\x66\x2f\xdf\xdf\x9f\xff\xf8\xe1\x6a\xfe\xeb\xdd\xf9\xed\xed\xfb\x8f\x3f\xcd\x7f\xf9\x78\x71\xfe\xcb\x4f\x3f\x3f\x28\x16\xe8\xfa\xfd\xfd\xd5\xfc\xee\xea\x2f\x57\x17\x0f\xef\x6f\x3e\x06\x28\x55\x4c\x94\xaf\x40\x2d\x1a\x05\x6a\xcc\x7a\x7a\xc1\x2e\xdb\xcd\xa6\x3d\xf5\x57\x84\x6a\x94\x37\xdb\xbf\x1a\x43\xce\x59\x2c\xcf\x32\xa3\xfb\x32\x3c\x6e\x14\xd4\x55\xd7\xde\x98\x75\xe6\x59\x00\xd2\x17\x6e\xac\xa1\x9b\xe3\xa1\x67\x12\x82\x78\x64\x1c\xee\xc0\xb3\xcb\x57\xa9\x5a\x25\xa1\x52\x25\x29\x9f\xb4\x4b\x09\x29\x9f\xea\x73\x81\x78\xf4\x37\xc5\x46\xaa\xfa\x87\x5b\x28\x25\xc9\x9e\xac\xe0\x89\x66\xed\x1e\x53\xb5\x19\xb1\x01\xa5\x28\x1e\xf4\xde\xec\xf1\x6a\xf9\xb4\x5c\xe7\x4b\x19\x21\xeb\x83\xe2\x54\xb3\xce\x81\xaa\x75\xc8\x62\x0c\xa3\xf5\xaf\x5b\x32\x67\x1e\x38\xf5\x09\x64\xad\xc1\x6d\x79\x7f\xf7\xa7\x2d\xa2\xa8\x5e\x33\x1c\x2b\x1e\x34\x1e\xda\xec\x3a\x12\x8b\x57\x7f\x55\x69\x8d\x70\x9c\xd7\x1a\x69\x1a\xa1\x4a\xa3\xe2\x4e\x21\xcc\xce\x35\x67\x67\xf2\xce\x75\xd3\x98\x83\x08\x9f\x21\x5a\x7a\x64\x49\xa3\x88\xc2\xb6\x86\x56\x6c\xfd\xcf\x95\xaf\xb4\xf0\x9c\x52\x0d\x18\xd4\x84\xa8\x2e\x68\xa5\xbf\x39\x0e\x43\xb0\x57\x2f\x5a\x56\x08\x10\xac\xd4\x8b\x3d\xcf\x0b\x10\xbc\xa8\x57\xa3\xa8\xb2\x1d\xfd\x9b\xcd\x38\xef\x7d\xb9\xb7\xf5\x3d\x19\xa5\xd5\x06\x8f\x4f\xe0\xb1\x45\x9c\x1e\x5a\x7a\x14\x9f\x93\x50\xb0\xbe\x8f\x5a\xbe\x3f\x02\xe9\x94\xf1\xa9\xa6\x8d\xba\xdb\x57\x7d\x0c\x19\x9f\xf6\x7c\xed\x06\x5a\x70\x07\x9c\xe3\x13\xa8\x8d\x7a\x54\x1f\x3d\x31\xb0\xaa\x2a\x78\x56\x63\xf2\xfc\x6f\x1f\x04\x69\xb3\xa6\xaa\x43\x8a\xf1\xb6\x3b\xe3\x55\x64\xbc\xb3\x30\xc6\xc4\x3b\x7e\x7b\x78\xd9\x5a\x2b\x80\xa0\x59\xa7\xfa\xb4\x64\x31\x7a\xce\xe5\x7a\x94\xcb\x92\x16\x4b\xeb\xda\x95\x2c\x52\x8c\xf1\x93\xa9\xb3\x30\xfb\xa1\x02\x47\xd4\x53\xde\x10\xdf\x69\xbf\x49\x55\xe4\xb6\xc0\x5a\xa8\xd4\x47\x2e\x16\x7e\x37\xde\x06\xed\x01\xc2\xc2\xf4\x06\x55\x28\x52\x5b\x60\xbe\x8c\x84\xf1\x90\x22\xfe\xea\xfe\xa2\xaa\xeb\xf0\x0b\x0b\x34\x90\xb8\x57\x89\xc9\x22\x1d\xab\x31\xdc\x46\x04\x81\x6a\x41\xa5\x00\x49\xf6\x69\x63\xb1\x63\x5b\x19\x18\x41\x81\xd4\x78\x0b\xb3\x92\x08\x94\x91\xc2\x13\x81\x90\x7d\x52\xd2\x9c\x37\xa8\xe3\xa3\xd1\xe7\x4b\xaf\x1a\xa0\xc2\xae\x34\x9a\xec\x4d\xe8\x83\x64\x9f\x62\x02\x34\x59\x29\x60\xaf\x8c\x32\x62\xa3\xb5\x56\x8b\x14\xd3\x64\x9e\x82\xce\x42\x93\x97\x14\x81\xfa\xd8\x05\x88\x9e\x50\x33\x49\xcb\xc6\xcd\xfc\x41\x93\xcc\xd6\xab\x3d\x62\xec\xa7\x4d\xe7\x73\xe7\x4e\xa2\x11\x6b\x3e\x8f\x97\x61\xc8\x23\x02\xcf\xf0\xda\xd1\x12\x74\x0e\xa0\x9d\x6c\xaf\xbe\xe8\x95\x3a\x5b\x2a\x6e\xc1\x12\xce\x2d\x3e\x89\xb7\x3f\xec\x6a\x4a\xa3\x44\xc0\x5d\xb2\x9d\x4c\xd2\xc1\x1f\x8d\x76\x27\x18\xef\xea\x53\x36\x81\xf1\x23\x32\x80\x3b\xd1\x80\x5b\x63\x62\x9d\x53\x3a\xf2\x86\xdb\xb8\x46\x51\xce\x46\x5b\x1b\xdf\x60\x36\x0a\x26\x03\x1c\x94\x21\x55\xee\x3c\x16\xe3\xa3\x47\xa7\x67\x91\x0e\xe2\x51\x4a\xb1\xcb\x24\xd7\x3e\x73\xde\xab\x0b\x07\x11\xa0\x49\xa0\x5a\xfa\xcb\xfd\xcd\xc7\x69\xa9\x0b\xe6\xcb\x97\x88\xa2\x19\x3d\xa3\xff\xc4\x11\x2d\x45\x55\x44\xd0\x24\xd2\x0b\x46\x6f\x5e\x67\xc1\x3f\x58\x30\xb1\x2f\xb3\x20\xf0\xb1\x6d\x8d\x6f\xaa\x2c\x0c\xa3\x75\x7b\x63\x51\xdc\x0d\xac\x9b\xcd\x05\x13\x58\x4f\x2d\x3c\x30\x85\xb5\xf1\x89\xa8\x71\x00\xd6\x7a\x53\x6d\xe3\x0d\xe4\x46\x7e\x5e\x23\x60\x7d\x7f\xaf\x48\x51\xa4\x9a\xaa\xab\x49\xb9\x51\xd4\x49\xb4\xf7\x89\xc5\xc0\x76\x71\x6b\x59\x0d\xc3\xdf\x2c\x52\x43\x5d\xad\x79\x51\x72\x93\xc6\x6c\x70\x15\x6a\x73\xe1\x66\x33\x7b\xf5\x36\xce\x64\x9f\x82\x1d\x9c\xb7\x8b\x72\xf4\x5a\x69\x9c\x79\xec\x38\xea\xe4\xbe\x9a\x41\x11\xc7\x3c\x11\xa9\x83\x4e\x18\xe6\xd3\x72\xab\xb5\x08\x02\x4e\x51\x5f\x73\x61\xa4\x21\x35\x08\xcb\xb8\xa9\x36\x20\xc7\xe4\x6c\x88\xc9\x3e\x13\xb3\xed\x6c\x68\x6b\x3e\xe3\xb3\x75\x2c\x07\xe0\xea\x68\xb2\x26\x96\x1e\xab\xd9\x80\x49\x68\xb2\x01\x1c\x8f\xc7\x2c\x0c\x15\xea\xb2\x64\x95\xc6\x3c\x0c\x23\x96\xbc\xa4\x58\x00\x4b\xe6\x29\x26\xc8\xea\xd6\xa4\x62\x49\xa2\xdc\xba\xd9\x01\x0f\xc3\x7c\x8c\xf1\xda\xfc\x6c\xcf\x92\x74\xa6\x64\xbe\xf8\x3e\x62\x30\x3e\x51\x42\x91\x81\x5f\xa9\xc8\x17\x53\xe4\x4b\x07\x3a\x60\xc8\xaa\x47\x5a\xe7\x68\xbf\x61\x3a\x3d\x5f\xad\x84\xe6\xfc\xf5\x22\x84\x2f\x47\x3c\x79\x5a\x36\x64\x5a\xc3\x15\x31\x9f\x82\x51\x34\x60\x33\xb6\x2b\xe5\xe8\x91\x8e\x48\x2b\xa7\x83\x90\xe2\x68\xd5\x04\x3f\x01\x53\xc4\x31\x49\xe3\x06\x44\x6a\xef\x93\x61\x28\x23\x11\x3d\x44\x0c\x36\x08\x81\x79\x7a\x6c\xa8\x35\xaf\x47\xc8\x1b\x3b\xa4\xb7\x6c\x34\x82\x06\x19\x3a\x32\x41\x84\x46\xaf\xa3\xc4\x1c\xa8\x8d\x32\xbe\xa0\xe9\xa8\x0a\x2a\xa0\xce\x0e\x01\x0f\x10\xa0\x7b\xed\x43\xa8\xa0\x11\x19\x5d\xe2\x46\x07\x0d\x70\x3c\xe1\x37\x15\x79\xb4\x45\x08\x7b\xc1\x3e\x87\xa1\xcd\x18\x07\x83\xe8\xc8\xe4\x5e\xcb\x19\xd3\x5c\x52\xa1\xc4\xac\xd4\xc9\x62\x0e\xac\x96\x17\x53\x2d\xfd\x16\x25\x29\x04\xe7\x45\xe1\x88\x69\x69\xac\xf5\x4c\x16\xba\x08\x50\xe3\x18\x0b\x6a\x75\xa9\x09\x70\xab\xcd\x46\x57\x8a\xf9\x0f\xa4\x8e\xb0\x34\x99\x20\x31\x99\x00\xb3\xf6\x12\xb5\x99\x06\x49\x78\x8a\x3c\xcc\xfb\x6f\x75\xa9\xb2\xd4\x45\xfc\x0f\x8c\x2c\x57\x32\x6c\xa6\x70\xcb\xa9\x38\xe9\xf3\x88\x46\x6d\xdb\x48\x6f\xc4\x31\x6f\x1c\x01\xb9\x76\x04\xe4\xa9\x5e\xca\x51\x6b\x7a\x0e\x87\x28\x57\xec\x1e\xd5\x91\x9f\x5a\x02\x7e\xe6\x6c\x49\xe0\x04\xe3\xef\xbe\x13\x61\x68\xb2\xba\x7e\x67\x5f\xe9\x36\xaa\x50\x65\xd0\x88\x64\xb4\xaf\x11\x57\x14\x0c\xd7\x58\xe4\x8d\x43\xa0\x57\x89\x29\x30\x2c\x2a\xd4\xd1\x78\xc8\x96\x65\x8b\x8e\xf2\xc4\x74\x52\xa3\x57\x85\x0c\xd3\x38\xff\x21\xf3\x75\xab\x96\x0d\xcd\x92\x3c\x8d\x97\x51\x89\x0e\x87\xc8\x98\x15\xd6\xd3\x5e\x2a\x2e\xca\x80\x47\x3b\x10\xba\x28\x14\x1a\xa5\x8b\x02\x0f\x30\xcd\xfa\x83\x3e\x7a\xb7\x87\xdb\x91\xb1\x31\x27\x45\x71\x4f\xa5\x2c\xfc\x48\x10\x75\x29\xbd\x67\x58\x93\xb4\x7a\xe3\x6d\x11\x1f\x6d\x57\x35\xa3\xa8\x5f\x3b\xbc\xaa\xfe\xb9\xf7\x59\x7f\x55\xbe\x2a\x49\x65\x57\x2a\x32\x5f\x2c\xf3\x42\xdb\xc1\x18\x2e\x88\x56\x15\x68\x49\xf3\x5b\x4a\xd7\x53\x08\x82\x92\x52\x0b\x84\x55\xe5\x86\xe6\x77\x09\x0f\x23\x9f\xde\x99\x06\x67\x56\xa2\x57\x86\x29\x08\x2c\x2b\x04\x04\x7f\x0f\x66\xbe\x92\x14\xca\x76\xdc\x95\x88\x22\x2d\x87\x14\xf5\x04\xb9\x33\x34\x8e\x73\x17\x67\xa1\x85\xcb\x0a\x5f\x75\xcc\xb3\x33\x39\xf5\xc1\xa4\xf9\x1e\x83\xc0\x24\x0c\x59\x94\x75\x90\x5c\x9e\x45\xa6\xdc\xb4\x05\x9f\x1a\xeb\x6d\x21\x34\xd3\x42\xba\x4f\x18\xa2\x12\x55\x64\x32\x81\x7c\x32\xa9\xa0\x30\xee\x3d\x3b\x7c\x02\x5b\x4c\xe3\xdd\x0f\x5b\x87\x7f\xbb\xc9\x04\x95\xd1\x36\xd9\x35\xa1\xd8\x4e\x30\x8e\xc8\x77\xf8\x7b\x64\xea\x06\x7e\xcc\x02\xd4\xb3\x8a\x06\x4b\x2c\xdd\x9e\xf0\x40\x56\x47\x0c\x34\x6b\x95\xcb\xbf\x6a\x0b\x3a\xd0\x6a\xb9\xa5\x59\x4e\xcb\x63\x26\xa1\xdf\x60\x08\xea\x1b\x78\xab\xf9\x69\xe6\x9b\x39\xbd\x21\x07\xa2\xa5\x3a\x8c\x71\xc4\xcd\xf2\xf4\xd8\x5b\x74\x38\xd4\xa7\xda\xfc\xcc\x3c\xce\x78\xd2\xee\x60\x1a\x47\x63\x32\xb8\xdb\x10\x73\xe6\xd8\xad\xf5\x70\xa0\x8e\xbc\x2a\x84\x25\xd1\x25\x82\xcc\x8b\x8e\xe5\x2b\xb6\x95\xfc\x69\xfc\xd6\x92\x7d\x6a\x68\x63\x06\xb9\xf1\x2f\xf8\x64\x98\x41\xf7\x0e\x79\xd7\xb7\xa0\x15\x5b\x8a\xb6\x6d\x2d\x35\x26\x6b\x39\x9b\x76\x7c\x12\xac\x82\x01\xfb\x2a\x80\xfa\xa4\xc2\x82\x4a\xbc\x09\x2a\xe1\x40\x25\x06\x40\xc5\x07\x41\xc5\x15\xa8\x38\xae\xf9\x4a\x05\x18\x1e\x5d\xa2\x98\x28\xa9\x70\x65\xc1\xf5\xcd\x30\xca\x81\x00\x03\x56\xc3\xc8\xbd\x03\x31\x76\xee\xf1\x97\x9a\x37\xa9\x9f\xc0\x29\x62\xb0\x7b\x50\x29\x6a\x1b\x31\x3f\xf0\x45\x53\x65\xfd\x5f\xf7\xe7\x1a\xd3\xa4\x4c\x71\x1d\x60\x2e\xae\x9f\xf0\x97\xd8\xa8\x80\xad\xf6\xf1\xb6\x3e\x31\xf6\x2c\x85\xfc\xc8\x86\xcd\x19\x0a\x16\x91\x04\xa7\xb2\xd4\xe7\xcb\xd6\x0c\x83\x79\x66\x18\x6c\xe0\x84\x9a\x63\x43\x84\x62\x99\x14\x29\xe6\x6f\x20\x7f\xc7\xa3\xc1\xdf\xdb\xbf\x74\x28\xa7\xd5\xa0\x31\xe3\x51\x81\x0c\xd6\x58\xc7\xa6\xe4\xbd\x39\xde\x74\xc5\xa7\xb5\xc1\x1d\xbe\x83\xeb\x30\x8c\xee\xa2\x6b\x04\x17\x11\x85\x60\x49\x65\xb6\x0e\xde\xd4\xe4\x0f\x2a\xf7\x59\x13\x38\xc7\xe9\xe2\x99\x86\x8a\x68\xa9\x43\x1c\xa7\x23\x2c\xb5\x16\x3e\x62\xba\xe1\xf1\xe4\x7d\x7a\x38\xdc\x45\x1c\x81\xa8\x2a\x4d\x58\x11\xd8\xf9\x4a\x64\xcb\xbc\x68\x67\x05\x69\xfb\x55\xb3\xe3\x65\x80\x52\x9c\xc3\x97\x0a\xc1\x80\x96\xdc\x51\xc8\xf6\x18\xcd\xf4\xbe\xb3\x29\x03\x42\x2f\x30\x3c\x78\x86\x00\x42\xa5\x37\x6a\x6c\xae\x5e\xad\x5d\x25\x90\x4e\x80\xc3\xa1\x33\xb6\x75\x5e\xba\x73\x11\xbd\x2e\x98\x56\xb4\x10\xd4\xe1\xe4\x3d\x45\xd5\x99\x3d\x10\x27\x5f\x95\xd1\x09\x72\x7e\x49\x18\x63\x17\x46\xd1\x1a\x49\xd0\x44\xe8\x96\xf2\x26\x06\x9a\x2e\x93\x6b\xb6\xd4\x96\xf1\xb4\x35\x19\xa6\x09\x4f\xcd\xa9\x7d\xbb\x44\xe6\x3b\x47\x78\xe6\xdb\x31\xd1\xa7\x81\xf0\x06\x54\x6d\x30\x89\xfc\xb8\x52\x23\x3e\xfa\xe5\x0d\xb1\xa7\x01\xd6\xad\x93\x96\x55\x97\x06\x64\xb3\xb3\xda\x42\xc8\x26\xa4\xc1\x2c\xf7\x07\x51\x19\x32\xf7\x11\x8f\x4f\xd5\xd8\x8f\x9b\x8f\x21\x27\xd3\x7d\x1e\x3e\x3e\x89\x5e\x2b\x08\xb6\xa4\x2c\xf3\xfd\x80\xf3\xc4\x47\xbd\x3e\x51\x6c\xea\xea\x9b\x63\x04\x92\x96\x32\x80\xcf\xf0\x19\x81\xcd\x33\x64\xfc\xe1\x65\xb3\xac\x88\xa2\x39\xaa\xf3\x5a\x28\x3e\x87\x77\xf0\x33\xfc\x04\x3f\xc2\xaf\xf8\x75\x57\xd2\x9f\xd4\xe6\x0b\xbf\xe3\xd7\x0a\x7e\x51\xff\xfe\xa6\x89\xf9\x1d\x5d\x5d\x7d\xde\x46\xc1\xff\x1f\x4c\xb6\x93\x20\xfa\xc7\x3f\x9e\x27\x28\x92\x62\x47\x0f\xda\xcc\x0f\xfd\x5b\x80\xe0\xef\x0a\xcd\xb7\x82\x6f\xc9\x4a\x6b\xe2\xee\x25\xdf\x6e\xdb\x64\xf3\x3f\x7d\xea\x15\xc9\x33\xa9\x79\x2d\x34\x59\x82\xf0\x5f\x77\xc0\xf1\x76\xc2\x80\xe0\xed\x44\xc4\xbf\x27\x34\x55\x3d\x51\xbf\xc9\x52\x11\x47\xfd\xb4\x4b\x31\x69\x18\xfb\xbf\x68\x0d\x87\x67\x46\x64\xcc\x92\x16\x8b\xc3\x21\x87\xd2\xbc\x89\xcd\xe1\x90\x41\x61\x5e\x0a\x0b\x9f\xf2\x70\x30\x46\xdb\x0e\x60\x65\x00\x6b\x97\xff\xbc\x28\x0e\x07\x6b\x14\x79\x5e\x14\x5e\x96\x05\xde\x47\x04\xc1\x0a\x07\xd3\x60\x42\x26\xc1\x2c\x80\x17\x1c\x6c\x05\xdd\x52\xb6\x68\x4c\x27\xe7\x43\xee\x26\x63\x3a\xcd\xcb\x3b\x5d\xe9\xa2\xd9\x9c\x69\xed\xc6\x14\xf7\xd4\xd3\xba\x3b\xd6\x07\x6e\xaf\xc3\xab\x46\x4d\xf6\x21\x26\xa1\x95\x3b\x32\x3c\x02\xef\x10\x2a\xcc\xdd\xd9\x8f\x0d\x0f\xa7\x7a\x98\xb0\xd4\xa1\x49\x8e\x5e\x05\xce\x2b\xab\x29\x9a\xf2\xad\x6a\xa3\xde\x6f\x48\x18\xf6\xb5\xe8\x61\x48\xa6\x9c\x65\x6a\x6d\x25\x65\x5a\x5b\x1b\x19\x2f\x8c\x7e\x0f\xce\xfa\x49\xb3\x66\x5c\x40\x34\xad\xf7\xad\x28\xad\x06\x4b\x6d\x21\x58\x31\x62\xbe\x8d\x1d\xc1\xec\x70\x10\xb5\x95\x1c\x85\x1c\x93\xe4\xf7\x44\x18\x33\xbb\x84\x9f\xed\x66\xcb\xd4\x92\x37\x4b\xbd\x12\xfd\x7a\x8a\x31\x76\x7a\x35\x14\x6d\xf1\x3c\xca\x93\x93\x14\xf4\x49\x7d\x18\x5a\x91\x76\x6b\xb5\xed\x4e\x62\x29\x71\x6e\x0d\x76\x10\x14\xf8\x24\x2e\x7e\x28\x6b\x9d\x6f\x34\x16\x87\xc3\xf8\x64\x8c\xb1\x48\xfe\x9e\xa2\xb8\x70\xf2\xe4\x36\xd6\xd5\x97\x49\xd1\xaf\xbe\xb2\x3d\x71\x52\xa8\x55\x28\x65\xc9\x49\x6a\xf5\xc6\xdd\xbd\x89\xe1\x2c\xa1\x69\x2c\xa7\x47\x6c\xa1\xfb\x47\x78\xac\x42\x95\x56\x28\x9a\x1e\xd7\x02\xaf\xea\xe0\x3a\x2a\xdc\x59\xd0\x66\x08\xa3\xea\x18\x72\xe3\x53\x54\xc1\xe3\xdb\x59\x4e\x90\x37\x6d\x57\xe6\x9c\x5f\xab\x75\x90\x33\xaa\xb7\x7b\xfd\xf8\x24\x16\x9e\x35\xa8\x3e\x37\xff\x49\xf3\x92\xe6\xd1\x71\xda\x22\x0c\xc5\x74\xbf\xd6\x67\xcb\x9d\x12\xd9\xfa\xe9\x72\xb7\xd5\xd6\x16\xee\xc5\x94\x9a\xeb\x13\xac\x56\x5e\xa1\x56\xce\x5c\x3f\x34\x96\x55\x4f\x58\xc6\x4f\x61\x38\x7e\xea\x9e\xbf\x10\x14\xa3\x27\xcc\xa2\x27\xc3\xca\x3d\x29\xac\x26\x69\x18\x46\x4f\x58\x22\x18\x3f\x1d\x0e\x4f\xc9\x22\x6d\x0f\xe9\x0a\x9e\x4d\x67\x35\x66\x7e\x24\x1b\xfa\xe0\xb8\x05\x6b\x2c\xfa\xa4\xd5\x7e\x09\x49\xe1\x16\x3f\x25\xfb\xa8\x44\xea\xb5\x4c\xe1\x93\x7e\x2d\xf4\x6b\x91\xc2\xa5\x7e\x5d\xeb\xd7\x75\xda\xb2\xe1\xf2\xbc\xe1\x3f\x0e\x2c\x43\x1a\x86\xf4\x6c\x3c\x56\x2b\x69\x2b\x77\x82\xce\x3e\x86\xa1\x3c\x0b\x1e\x39\x2f\x28\xf1\x4d\xe4\xce\x5e\x5d\x0e\x0a\x76\x1b\x52\xd4\x7f\x46\xcf\x86\xea\xb4\xe6\xc4\x36\xe3\x99\xdd\xd1\xd4\xdb\x8a\x45\xed\xb7\xd7\x0a\x28\x82\x57\xaf\x4e\x34\xa3\xb3\xd7\x56\x1b\x95\x06\x93\xa5\x98\x61\x18\x5d\xe9\xf1\xd6\x29\x7a\xdc\xf5\x5b\x6a\xa6\xf4\x02\xf3\xb3\xce\xa9\xff\xf8\x7e\x9a\x97\x57\x9f\xf3\x52\xe6\x6c\xe5\xb8\x90\x1b\x43\x7a\xee\x9d\x59\xca\x7d\x33\x1d\x70\xef\xc0\x72\xf6\x38\xdb\xc0\xbd\xa3\x6b\xa8\x1a\x50\x70\xbc\x59\x91\xa3\x9b\x7e\x1d\xf0\x65\xa0\x87\x3d\x72\x2f\xf1\xef\x09\x6d\x6a\x4a\xc1\x45\x74\x8c\x15\x7e\x32\x2c\x93\x7a\xee\x34\xd5\x42\x4d\xd8\x11\x67\x06\x6c\x79\x42\x81\xda\xfa\x3b\xe1\xeb\xef\xd4\xf7\x84\xa7\x18\x63\x35\x20\x77\x34\xc0\x4d\xcc\xbc\xba\x4b\x78\x7c\x02\x5a\xec\x6b\xe8\x97\x56\xdb\x78\x9f\xbd\x46\x6d\xf8\x30\x6d\x3b\x57\x55\x3a\x20\x5c\x93\xb7\xd6\x59\xda\xe3\x20\x07\x35\xda\x82\x9a\x0f\x7e\xfa\x36\xf8\xdf\xae\xc8\x82\xdf\xab\x03\xde\x9b\xc5\xb7\xc8\x97\xcb\x33\xf3\x33\x1b\x14\x9c\x2c\xa3\x1d\xf7\x99\x44\x03\xe4\x7a\x6f\xc5\x58\xfa\xb6\xfe\xe6\x6b\x6f\x27\xc5\x58\x56\x70\xa7\x5d\x0b\x92\x7d\x14\xfc\xf2\xf1\xf6\xfc\xe1\xe2\xe7\xab\xcb\xf9\xd5\xdf\xae\x3e\x3e\xdc\x07\x28\x85\x0f\x58\x7f\xba\x3d\xbf\xbf\x7f\xff\xb7\x2b\xef\xc3\x67\xec\x8b\x4c\x40\xa0\x84\x02\xb6\x35\x08\x6a\xb1\xbc\xd0\x67\xd1\xe3\x53\x04\x75\x92\xa2\x7a\x5b\x9d\xd4\x39\xbc\x5f\x3b\xa3\x71\x58\x34\x77\x08\xa8\x9d\x44\x43\x47\x3b\xa1\x2e\xa9\xb8\x72\xb0\x0c\xc3\x68\x81\x07\xd2\xa3\x85\x55\xa1\xed\xbd\x5a\x4e\x35\xe2\x8d\xf7\x0d\xc7\x3f\x68\x1c\xa6\x32\x3d\x84\x61\x2d\x8d\x5d\x7d\xce\xe8\xd6\xc1\x78\xf1\xb5\xc2\xaa\xd1\x95\xe3\xaf\xfb\xfa\x86\xbd\x59\x58\x7b\x9f\xcb\xf9\x5a\x95\x2b\xc5\x4e\xab\x52\xf9\xe1\x90\x47\x12\xf6\xb0\xf6\x8d\x14\x34\xdc\x5e\xf0\xc7\x30\x1c\x8f\x3f\x84\xa1\xb6\xbf\xfa\x50\xdb\x5f\x2d\x10\xcc\xf1\x6f\x8d\x1d\x6c\xf2\x7d\x0a\x2f\x7a\x8c\x77\xa8\xd9\x47\x4e\xe2\xa7\x1f\xee\xdc\x0a\x7c\x32\x2b\x70\x81\x31\xbe\x4b\x9e\xea\x93\x8a\x17\x27\xaa\xad\x61\x01\x7b\x98\x37\xb1\x50\x86\x60\xb0\xc1\xe3\xf1\x3c\x0c\xa3\x3e\xf1\x9e\x1f\x0e\x73\xb7\x94\x10\x3c\xe2\x71\x34\x9e\x37\x98\x5a\x43\x6a\x8e\xc2\x70\xae\x79\x32\xb8\xc2\xbe\xab\x0c\xdc\xe0\xdf\x93\x45\x1a\xdf\x1c\x0e\xd1\x7f\x46\x0b\x78\x46\x36\xc5\x34\x7c\x8b\x6f\x92\x8d\x26\x3e\xf0\x09\xaf\x93\x5b\xb5\x1f\x99\xe9\xf8\xa4\x61\x7f\x89\xf5\x79\x9b\x1a\xbb\x19\xf7\xa7\xce\xb8\xdf\x47\x9f\x92\xa7\x14\xf6\x2e\xb8\xb5\xf1\x50\x35\x75\x29\xc6\x4b\x93\x73\xf8\x82\xd7\xbd\x03\x69\xb8\xc6\xbf\x24\x5f\xd2\xf8\x3a\x0c\xa3\x0b\x7c\xad\xba\x04\x17\x87\x43\x74\x81\xbf\x4c\xd8\x24\x7a\x3e\x7b\x8e\x16\x68\xb6\x40\xa8\x21\xbc\x78\x0e\x8f\x61\x18\xd5\xef\x7a\xc0\x7a\x61\x38\xca\x8d\xd7\x0d\xe1\xc7\x1b\x9f\x8e\xe3\x05\xf8\x5b\x08\xbe\x8c\x8d\xc4\xc6\xcf\x7e\xb5\xa6\x57\xf1\xe7\x30\x8c\x3e\xeb\x63\xe6\x4b\x22\x09\xbe\x37\x20\x3a\xc7\x57\xfd\x40\x9c\xd1\x05\xec\xe1\xb3\x5a\xc5\x1a\x3b\xea\xe6\xb5\xae\xae\x53\x8f\x3d\x06\x53\x2c\x89\xed\xf0\x09\x02\xbd\xa3\xf7\x66\xfb\xdc\x8d\xec\x70\x88\xce\x9b\x51\x23\x38\x6f\xc6\x77\xee\x8d\xef\xbc\x35\xbe\x55\x18\xaa\x52\x5d\xaa\xb5\x47\xb0\x3d\xfb\x34\xdd\x31\x63\x09\x76\x8e\x66\x9f\x0c\x37\x7a\x8e\xa0\x70\xf8\xba\xae\xaa\xca\xf1\xfc\x8a\x6b\xc1\x9f\xa3\x1b\x58\xc1\x05\x7c\x81\x39\x82\x2b\xc5\x0d\x25\x2f\x2a\xf5\x0a\x82\x69\x47\xfe\x99\x0d\x2a\x8d\xae\xfe\xe9\x3d\x15\xe6\x8a\xa5\x44\xa0\xd8\xa4\xbe\x79\xba\x23\x75\xec\x1b\x49\x1d\x1b\x24\x75\xac\x3e\x2d\x68\x2d\x72\x82\xc7\x63\x3e\xb8\x00\xf9\xe1\xc0\x9b\x05\x98\xf5\x29\x64\xd6\x6c\x87\x47\x29\xa4\x21\x46\xb7\x90\x81\xec\x11\xa3\x12\x0a\xfc\xbb\xda\xe7\x0b\xed\x1a\x5e\x24\xc4\x63\x06\xd6\xb8\x34\x42\x96\xaa\xa5\xb9\x17\x66\x81\x4f\xe2\xc5\x0f\x6b\xb7\x16\x17\x4e\xf2\xd8\xe3\xb5\x5a\xec\x7a\x5d\xee\x21\xab\x23\xce\xaf\x1d\x57\xb0\x50\x5c\xc1\xbe\xcf\x15\xac\x1b\xae\x60\xdf\xe1\x0a\x54\xeb\x06\xaf\x03\x63\x33\xe2\x19\x3c\xe8\xf0\x67\xc9\x76\xd2\x76\x76\x71\xec\x03\xec\x8d\xb9\xa1\x17\x4a\x73\x8f\x60\x7e\x26\xed\x82\xab\xde\x06\x5c\x55\x81\xe2\x90\xff\x37\x31\xa1\xe1\xaa\x12\x85\x03\x7f\x8d\x24\x28\xba\xc3\xd0\x8c\x21\x30\xae\x18\xa4\x77\x5c\x68\xcc\xbd\x63\xeb\xbb\x91\xf5\xc5\xdd\x7e\xd2\x2c\xab\x59\x8d\xfa\x04\x91\xab\xe1\xad\xbf\x7d\x78\xc6\x89\xe3\x5f\x46\xf7\xdf\x2d\x2b\x59\x6b\x4e\x64\xc2\x93\x65\x9a\x42\xae\x9f\x76\xa9\x55\x3e\x3a\x90\x64\xb5\xab\x8a\x93\x7c\x5b\x72\xa4\x56\x58\xd6\xb2\xbf\x9a\x38\x06\xd1\x16\x67\x49\x91\xa2\x3e\x44\xb6\x7d\x88\x6c\x1b\x05\xc0\xb6\x26\x02\x46\x6c\x57\x5d\xc8\x7a\x82\x77\xab\x79\x2b\x67\xff\xef\xf4\xa2\xaa\xaa\xda\x93\x67\xe1\x54\x7a\x4f\xf4\xa5\x8c\xac\x38\x69\x3a\xb4\xe8\x75\x68\x8f\xff\x36\xa5\x9f\x69\x16\x2d\x54\x07\x60\x85\xf7\x61\xb8\x57\x74\x62\xa5\x3d\x41\xd4\x92\xaa\x75\x46\x63\x6d\x44\xa7\x07\xb0\xf6\x07\xb0\x42\x55\x3f\xb1\x5b\x58\xab\x11\xe6\xc8\x3b\x5f\xa9\xe0\x3a\xd2\xd2\xe6\x0d\xd2\x4f\x65\x0a\xb7\x08\x2e\xc3\x50\xbd\xac\x53\xb8\x44\xf0\xc9\xbc\x14\x29\x7c\x42\x30\x3e\xa9\x8f\xc6\x9f\x15\xf2\xdf\xe3\x93\xf8\xbe\x91\x2b\xee\x27\x13\xf4\x9c\xdc\xa7\xf8\x2a\x12\xc9\x7d\x0a\xbc\x3e\xa2\x7c\x6e\x94\x71\x7f\xad\xef\x88\x18\xd7\x2c\xb7\xe7\xf7\x24\x8c\xdf\x93\x3d\xf7\xb0\x90\x11\x08\x8c\xd2\xce\x92\x4f\xed\x62\x21\x0f\x07\xa2\x98\x6b\xd4\xd7\x50\x37\xe8\x78\x12\x67\x8d\x5d\x54\x36\x99\x20\x6b\xa1\x91\x27\x59\xda\xa8\xa1\x59\x65\xd4\x36\xbf\x27\x32\x8d\x4b\xcd\xf4\x48\x04\xe6\xdd\x2c\x85\x02\xd3\xa4\xd4\x98\xbf\xd5\x4f\x0a\xf3\x6d\xe1\xe2\x6c\x7b\x56\xb8\xb0\x2a\x5b\x34\x2b\x1c\x0a\xce\xb6\x67\xdb\xfa\x39\x49\x1b\x10\xfc\x5b\x3b\x38\xb3\x5e\x78\xb1\xb6\x03\xab\xb5\xd6\xfa\x82\xa5\x26\x52\x42\xc4\xda\x01\x75\xf8\xf6\xfd\x66\x43\x17\x39\x91\x5a\x5f\x6c\x95\xaa\x6f\x1f\xc3\x98\x78\xc3\xc9\xdf\x53\x2d\xb5\x29\x51\xa5\x39\x78\x69\x39\x41\xfc\x87\x6f\x10\x66\x96\x7d\xd7\x4d\xdb\xfa\x60\xca\x84\xa4\x0e\xfa\xea\x19\x4b\x35\x05\xb2\xe5\xaf\x42\x20\x83\xc6\xf0\x25\xd3\x5a\xad\x66\x94\x7c\xba\xe4\xe2\x8a\x64\xeb\x96\x19\x89\x99\xfc\x26\x90\x0e\x83\x60\xda\x84\xae\x11\x10\xcc\x66\x01\x9a\x48\x20\xd8\xab\x4c\xeb\x2b\x15\x72\x74\x55\x35\x1e\x86\x4c\xdf\x8e\xb2\x10\x11\x90\x28\xce\xc3\x30\x37\x4e\x9c\x67\x91\x7d\xc0\xe6\x9e\x93\x4e\x64\x04\xf7\x15\xb8\x8e\xdc\xdd\x0d\x60\x10\x79\x9d\x03\x09\x39\x42\x33\x92\x48\xed\x3c\x94\xc8\xf4\x48\x95\xea\x93\x8e\xb9\xae\x59\xe2\x7f\x22\x7f\x6d\x49\x50\x55\x08\xdc\x91\x04\x18\xe8\x6b\x63\x8b\xa1\x50\x0c\x91\x76\x42\xcc\x7d\x73\x40\x4a\x7d\x6d\x34\x3b\x1c\xd4\x4e\xef\x4c\x7f\x1a\x6f\x4c\xab\x74\x98\x9a\x38\x10\xd1\x80\x41\x8b\xf3\xfb\xc1\x18\xd3\xca\xe0\x8b\x30\xb5\x89\xc1\xda\x38\x16\xc9\x49\x3a\x35\xd1\x47\x9a\xc0\x12\x8d\x27\x52\xb7\xa9\x1a\xc7\xbf\x3b\xc5\x18\xf3\x5a\x1e\xd3\x86\x15\xf5\x78\x24\x6d\xe2\x04\xd2\x30\xfc\x14\x51\xa8\x87\xa8\xaf\x62\x71\x19\x19\xf5\x75\x3b\x43\x3e\x2f\x6a\x73\x2c\x23\x8a\x8e\xf7\x64\xa4\xef\x1b\x10\xb2\xd4\x97\x06\x05\x9c\x05\xda\x41\xda\x0c\xf7\xcf\xdf\x57\x68\xba\x21\xdb\x23\xe5\x76\x8f\x86\x53\x8a\xbe\x6f\xf5\x5f\x5f\x63\x67\x08\x66\x34\x7e\x38\x1c\x9e\x51\x18\x8e\xb5\x32\x81\x5a\xcf\x9a\x28\x68\x82\x99\x94\x01\x4a\xdd\xc9\xaa\x74\x17\xdd\x19\x90\xce\x39\xf3\x2e\x1a\x02\x6e\x35\xdc\x57\x6e\x8d\x9b\x63\xa2\x98\x63\xee\x16\x5a\x12\x5c\xf2\x4c\xf3\x12\x01\x04\xf7\x7f\xfb\xc9\xba\xb6\x07\x10\x34\x4f\x9e\xcb\xbb\x7d\xfb\x91\x2f\x5e\xda\x29\xd7\x8a\x52\xb5\x93\x74\x8c\x9b\x7b\x2a\x07\x52\xdb\x49\xef\x07\xd2\xae\x89\xf8\x7d\x47\xbd\x44\x13\x52\x20\x48\x9d\x46\x78\xc0\xb8\xf4\x98\x07\x56\xbe\xfc\x57\x7c\xb0\x9c\x5e\xf7\xa4\xe7\x6a\x35\x3e\xad\x22\x74\x96\xbc\x1a\xdc\x9f\x11\xe8\xe2\xf3\x2c\xb1\x9e\xf8\x69\x95\xce\x92\x34\x96\x34\x22\xa0\x16\xb2\xbe\xb6\x44\x38\xd8\xe7\x08\x58\x44\x10\xaa\x5a\xf3\xd1\x71\x17\x85\x4e\x82\x17\x90\x27\x80\xe0\xfd\xe5\x8f\xef\x55\xd7\xcd\x63\x53\xe6\xfd\xe5\x8f\x37\x5b\xca\x3a\x49\x4a\xea\x7c\x24\x25\x35\x6f\x0f\x8a\x29\x24\x46\xb3\xa2\x13\x2e\x76\xa2\xe4\x42\xc1\x9a\x3e\xde\xf3\xec\x89\x4a\x05\xee\xf6\x46\xcb\xfd\x8d\xd6\x1a\xc9\x29\x36\x31\x4b\xd3\x58\x7b\x98\xfb\xdb\x1b\x8d\x4a\xdf\x38\xa2\xf5\x8a\x8c\xef\x49\x63\xac\x47\x3b\xce\x8b\x2d\x23\x09\x47\x21\x32\x9b\x0b\xe7\x83\xeb\x9b\xd0\x96\x1b\x8c\xda\x01\x93\x1f\x53\xf3\x3f\x91\xde\xf6\x5c\x17\xef\x10\x83\xbc\x7c\x27\xf8\x17\xca\x22\xa6\xc3\xa2\xb6\xfa\xa0\xc5\xf3\x76\xd2\xe1\x10\x8d\x4d\x0b\xe3\x6e\x05\x14\x85\xe1\xbb\x88\xc2\x8f\xf0\xda\x77\x31\xd0\x04\xdc\x14\x8c\x6c\xdf\xb0\x96\x70\x3d\xdf\xa3\xcc\x23\x6a\x5e\xcc\xc0\x77\x6d\x57\x9e\xdc\xd2\xf0\xb6\x49\x89\x39\xee\xc9\x63\xcf\xa6\xc7\x86\x2e\x68\x67\x9c\x75\x46\x28\xe2\xe3\x2d\xd5\x8e\xf9\x46\x0d\x14\x05\x26\xc4\xcc\xc2\xd9\xbf\x05\x56\x57\x6a\x36\xa1\x7e\xfa\x82\x0e\xa7\x13\xe7\x8d\x7f\xa1\xa3\x59\xb6\xbf\x1b\xbb\x22\xad\x17\x71\x61\x21\x33\x67\x63\xe4\xbc\x79\x08\xee\xf8\x2d\x30\x6f\xa7\x24\x98\x79\x0e\x0c\x95\xf3\xa1\x2b\xf8\x2a\x0a\xce\xa5\xa4\x9b\xad\x0e\xb7\x27\xf9\xc8\x01\x82\x8e\xfe\x10\xf8\x41\xf7\x8c\x5f\xd1\xa2\x66\x20\xfc\x08\x7b\x44\x7d\x57\xc8\x6b\xec\x05\x3a\xf1\xfc\x46\x84\x2d\x46\x2b\x2e\x47\x9a\x18\xc0\x68\x95\xef\x55\x5b\xbb\xed\xcc\xbb\xc9\x27\x43\xad\x65\x50\xd2\x36\xe3\xd8\x0d\x3d\x65\xdc\xa2\xd4\x84\xe7\xe5\x47\xbe\xa0\x87\x83\x7a\xba\xce\x3f\xab\x2d\x63\x48\xd5\x7d\xb4\x0a\x55\xee\x47\xc1\x9f\x4b\x2a\x5a\x95\x7c\x95\x81\xf2\xb6\x03\x9f\x63\xe5\x2c\x2b\xf2\xec\x49\xed\x86\x43\x16\x11\x2e\x66\x4a\x6d\x12\xf4\x95\x56\xde\x6a\x41\x9f\x7c\x84\xe1\x58\xb4\xb1\xbe\x3e\x88\xd3\x07\x23\xaf\xae\x89\x76\x64\xae\xb7\x2a\x86\xb7\xe3\x8b\x0c\xbb\xb0\x1b\x23\x0d\xbb\x34\xc6\x0b\xbb\x9b\xda\x00\x4c\xb6\xb1\x28\x58\xe4\xfb\x00\x4d\x6d\x43\xcd\x9d\xae\xff\x74\x0f\x75\xc4\x0a\x7b\x26\x2f\xa7\xed\xad\xc1\xc4\x4c\x69\x9f\x47\xe6\x38\xe0\x4c\x5f\x27\xa9\x7d\x12\x4d\xc4\xd8\x00\x94\x10\xdf\x54\x5f\x7e\x7d\x3a\x32\xc8\x35\xd8\x4b\xf4\x76\xdf\x33\xc8\xff\x75\x28\x6a\xbf\x90\x68\x67\xec\x2a\x15\xb4\xba\x1d\x87\x37\x5a\xd5\x57\xd4\x22\xe0\x4e\x96\xab\x39\xa7\x25\x79\xa2\xfa\xa2\xa0\xff\xd1\x0e\x1b\xe3\xc5\x22\xad\xa0\x15\x35\x81\x9a\x98\xa4\x49\x91\x62\xea\xf0\x62\xd7\x8e\xcb\xeb\xd4\xa9\x6f\x0d\x14\x2f\x81\xe3\x9d\xaa\x05\xe3\x25\xec\x86\x72\x68\xcd\x1b\xaf\xf4\x5a\x77\xab\x6a\x30\x5c\x93\xdb\xcc\xe3\x16\x53\xda\xc4\x6d\x6c\x20\xb5\x63\x8f\x7c\xc7\x16\x01\x02\xd6\xb7\x1f\xc5\x4b\x1d\x7f\x8a\x63\x13\x48\x27\xd6\x77\x64\xf7\x8c\x92\x04\xf4\x0d\x4f\x09\xe4\x8a\x0a\x6b\x9e\x45\xb3\x13\x04\xe7\x67\x79\x4f\xef\xaf\xe3\x48\xf0\x99\x0b\xb5\xa8\x5e\xe2\x3c\x46\x79\xc2\xd5\xfe\xaa\x7e\x8c\xa4\x14\x89\x63\xa2\x5a\xc2\x53\x20\x08\xa9\xdd\x54\x3f\xab\x7f\x58\x20\xc8\x71\x6e\xef\x47\xb3\x4b\xab\xd2\x26\x0a\x60\x7c\xaa\x96\xb4\x75\xfb\x51\x24\x50\x85\x22\xaa\xed\x8f\xeb\x48\x7a\x51\x97\x2d\xd3\x9c\xdc\xb7\xd2\x5b\x50\xec\xcc\xf9\xa5\x3d\x0e\x9c\x7f\x78\x7f\xff\x70\xf5\xf1\xea\x6e\x7e\xff\x70\x07\x1c\xb3\xe9\xdd\xd5\xf5\x8d\x3b\x13\x6c\x7f\x55\x8b\xbc\x99\x40\x39\xf5\xb8\xbf\xc3\xc1\x76\xd0\x4b\x8b\x24\x50\x48\xbc\xa5\x9d\x22\xf0\x2a\xc0\x7d\xe3\xcc\x5c\x09\x8f\xbd\x7b\xc6\xff\x7c\x7a\x66\x6c\x9b\xf5\xad\x01\xf6\x11\x41\xf1\x75\x3a\x51\x2a\x5a\x65\x3d\xe3\x9b\xdb\x46\x8b\x30\x1c\x2b\x01\xae\x68\x11\xec\xb3\xa8\x11\xd7\x4d\xa0\xc3\xa8\x44\x90\xe1\x12\x12\x01\x1c\x82\x92\xb2\x45\x00\x41\x56\xf0\x92\x06\xe9\xa0\x16\x21\x57\x73\xdd\x51\x94\xaa\x39\x68\x62\x24\x5a\xab\xc7\x96\xd6\x5d\x9a\x78\x2b\xea\xa7\x56\x7f\x38\xf1\xf7\xcf\x27\x67\x2c\x39\x49\xdd\xd1\x8f\x56\x7d\x5a\xed\x6e\x2f\x90\x5d\x4b\xb9\x4d\x50\x5c\x26\x99\xc2\xbc\x2c\xad\xb5\x4e\x65\x22\x5d\x10\x96\xd2\xe8\x60\xd0\x2c\xc7\xa5\xc3\x2d\x3f\x6e\x66\x94\x43\x62\xc7\x0a\x56\x7c\x80\xc0\x41\x12\x02\xbe\xa5\x2c\x48\x21\x43\x90\x57\xb5\x3d\x75\x83\x1a\x35\x97\x3e\xca\xd9\x88\x20\xd5\x09\x4c\x54\x4f\x34\x6e\xc2\x9b\xc2\xa4\xb6\x33\x1c\x30\x8b\xdd\xc9\xbc\xf0\xf4\x4d\xfa\x6c\xba\xf6\xa5\xa6\x11\x43\x71\xd9\x1f\x06\xfe\x04\xa5\xaf\xd6\xc2\x17\x50\x4e\x5b\xf1\x3e\xf1\x53\x9d\xa3\xbe\x1e\xcf\x58\x5c\x2f\x30\x69\xc1\xf7\xc7\x0f\xe7\x17\x7f\x35\x0b\xa2\x39\x4a\x87\x7d\x27\x57\xff\xb4\x3d\x66\xc9\x3e\xd5\x2e\x85\x8b\x14\xab\x67\x04\xea\x51\x6b\x59\x16\x0a\x2e\x7b\x95\xbc\x48\x91\xeb\x48\x3b\x48\x28\xfe\xb7\x56\xba\x59\x5a\xf8\x2f\x50\x4e\x9b\x40\xa1\xf8\x03\x94\x83\x1b\x0a\x96\xf5\x87\x63\x8b\x04\xd3\x3a\x8b\x41\x7b\x2c\xa0\xf4\x50\x16\x73\xd7\xbe\xa6\x3d\xf8\x37\x28\x87\xe8\x1d\x5e\x43\x39\xed\xc6\xe8\xc4\x54\x55\x3e\xa8\x08\xc2\xd7\x50\xf6\x35\x58\x47\x02\x4c\xba\x0e\xb8\x28\x9c\xf8\x3f\xa0\xec\x51\xb6\x81\xc8\xcb\x26\xf2\xe1\xbd\x8e\x70\x51\xce\x7e\xd1\xd1\x37\x8d\x17\x41\x7d\xf6\x50\xce\x7e\x07\xda\xbc\x14\x50\xf3\xa1\xb3\x2b\xd0\x6c\xe8\xec\x19\x0c\x77\x3b\x7b\x80\x87\xbb\x5f\xae\x14\x29\x9c\xed\xe0\xdd\xf9\x87\x7b\xf3\xbc\x84\x4f\x37\x1f\xaf\xe6\xf7\xff\x79\xfd\xe3\xcd\x87\xf9\xed\xdd\xd5\xbb\xf7\x7f\x9f\x6d\x61\x98\xc4\xce\x72\x38\x4a\x60\x67\x59\xe5\x76\xe9\x82\xc2\x8e\xc2\x92\x62\x12\xb5\xff\x92\x14\x92\x80\x3c\x72\xa1\xa4\x68\xc2\xf2\x8d\x56\xc4\x9a\xb3\x2b\x3f\xc5\x50\xab\xfa\xd5\xf8\x28\x1a\xe1\x9a\xec\x3e\x5b\xfe\x2d\x30\x77\xb3\xe7\x6c\xbb\x53\xd5\x3d\x16\x3b\xb5\xcc\xeb\xca\x32\xc2\xb6\x05\x79\x69\x9e\x94\xcc\xb3\x5b\xad\x55\x82\x65\xdd\x82\x8c\x6f\xb6\xdc\x04\x11\xd7\x8a\xa8\x76\x92\xb9\x09\xa1\x9d\x66\xe9\xe8\x8e\x36\x75\xd8\xde\x38\x7a\x93\x71\x26\xe9\x67\xb9\xa1\x6c\xa7\x73\x8a\x26\xeb\xe2\xb1\x70\xb9\x17\x82\xac\xec\x8f\xa9\xd2\x3c\x49\x2a\xdc\xf3\xe7\x5c\xda\xc7\x82\x92\x3d\xb5\xcf\x7c\x6f\x73\xf0\xad\xfa\xd9\x19\xb8\xd4\x2d\x68\x21\x8c\xaa\xfa\x28\x5b\x98\x5f\x4b\xfe\x96\x3c\xdb\x95\xee\x37\x67\xee\x89\x6b\xd8\xad\xb8\xdc\x72\x73\xd5\x8d\x39\x85\x0d\x20\x70\x70\xcd\xd9\x9e\x14\xb9\xaa\xea\x89\xbe\x2c\x74\xe0\x66\xf5\xb4\x15\xb4\x2c\xcd\xe3\x4e\x75\x45\x51\x3b\xfb\xe3\x40\x69\x2e\x5d\x5f\x10\x49\xea\x97\x0d\x95\xa4\x4e\x28\xfb\x8d\x6e\xf8\xae\xa4\xb6\x11\xfd\xec\x40\xa2\x5f\x1c\x20\xf4\xcb\x86\x37\xcf\x66\x14\xe6\x71\xdf\xe4\xd7\x1d\xd3\x4f\xcf\x6b\xaa\x91\x82\x8b\x9c\x32\xd9\x86\xd9\x96\xec\xf4\xc4\x59\x6c\x51\x3f\xda\x81\x21\xa8\x7b\x67\x31\xca\xbe\xdb\xee\xd9\x37\xd7\x41\xfb\xea\xba\xe8\x5e\x79\xf6\x54\x37\xb4\xe1\x5f\x86\x92\x9f\xe9\xe3\x53\x2e\xbd\x2f\x54\x34\x7d\xf3\x53\xed\x3e\xd6\xaa\xc5\xa5\x0e\x54\x62\x3e\xd8\x24\x0b\x2d\xfd\x66\xa0\x65\x3f\x58\x78\xd9\x37\x0d\xb1\xad\xe0\x2b\x3b\xbb\xc2\x13\x74\x02\x41\x4b\xad\x29\x13\xb4\xcc\xbf\xa8\x84\x32\x13\xbc\x50\x90\x29\x29\x7d\xd2\xd8\xa6\x1e\x0c\xf0\xd4\x6c\x65\xb2\x7e\xf0\x01\x6e\x52\x1c\x96\x94\x6b\xfe\xac\x7e\x0c\x51\x28\x25\x31\xae\x93\x41\xb9\x7b\xdc\xe8\x25\x50\xee\xca\xad\x59\x23\x32\xdf\xd0\x7a\x51\xee\x79\xb1\xdb\x34\x9d\x93\x7c\x97\xad\xeb\xa9\xd2\x6f\x76\xcc\xfa\xd9\xb5\xa6\x5f\x6c\x6d\xf5\x05\x02\x4d\xb1\x3a\xc9\x64\x79\x26\xb9\x34\xc3\x31\x08\x94\x2a\x66\x17\x12\x05\xed\x55\x61\x17\xba\xa0\xa5\xe4\x42\x77\xd9\x4f\x56\xe8\xdd\x49\x72\x71\x35\xac\x42\xd3\xd6\x45\x76\x92\x2b\x02\x53\x50\x3d\x2c\xff\xb5\x9d\x51\xf2\xd5\xaa\xa0\x4d\xb9\xa5\xa4\xc2\xec\x83\xf6\x22\x95\x9a\x24\x76\x53\x2f\x6f\xae\x2f\x54\x17\x98\xfc\xa0\x57\xa1\x5a\xfc\x82\x52\x3d\x87\xcb\x5d\x51\x94\x99\xa0\x94\xf9\x78\x3a\x90\x6a\x30\x6c\x28\x7b\x39\x90\xd8\x24\x79\x78\xdb\x4f\xec\x56\x5a\x67\x2e\xfb\x69\x7d\xd1\x3b\xd8\xe7\x65\xfe\x98\x17\xb9\x7c\xf1\x91\x74\xb7\xf1\xa0\xf4\x58\xf2\x62\x27\xe9\x82\xee\xf3\x8c\x7a\xcb\x5f\x81\x5a\x41\xd0\x91\x39\xfd\xb2\x15\xb9\xd6\x90\x93\xed\x56\x3b\xb3\x58\x54\x74\x1b\x8d\x4e\xd9\x0a\xbe\xd9\xca\x3a\xd5\x15\x31\x6f\x3b\x66\xe9\xa0\x69\xaf\xc8\x57\x6b\x59\xbf\x6d\xb8\x6d\x78\xa8\x33\xbd\x34\xd7\xf3\xfa\xdb\x56\xf0\xcf\xf9\x26\x97\x8a\x48\xad\x49\xb9\xae\x87\x5c\x10\xb6\xda\x91\x55\x03\x96\x86\xd5\xdd\xf0\x2f\xb6\x9b\xc4\x74\x93\x2f\x97\x45\xae\x43\x72\x73\x66\x1f\xdc\xa7\x2d\x59\x51\xbb\x18\xd5\xe3\x3a\x5f\x18\x8a\xb1\xb5\x37\x92\x34\x51\x3d\x6c\x50\x28\xbd\x5c\xb9\x30\x2d\xd5\xa1\xa2\xea\x5c\x3a\xd1\x82\x63\x57\x2a\xe0\x36\xfd\xdf\x8b\x45\x5e\x2a\x4a\x9b\x71\xc6\xac\xbf\x73\x93\xb8\xc8\xcb\xc1\x74\xb5\xe7\x50\x26\xed\x38\xdd\x14\x9b\x01\x66\x7c\xfb\x52\x4f\x43\xb6\xf3\x26\x88\x94\x76\x13\xd7\x19\xcc\x27\x97\xa8\xb6\xd4\xd6\x76\xd5\x66\x3c\x6a\x1a\x45\x89\xc8\xd6\x2d\x02\x21\x76\xac\xf5\xee\xb2\x1a\x8c\xee\x70\x32\x9d\x44\x9f\x9f\xe9\x7c\x6a\x57\xd3\xa6\x47\x35\x4e\x67\x32\xdf\x9b\x29\xd1\x58\x5b\x93\x44\x22\x72\x22\xea\x53\x0a\x33\x7c\x2f\xb3\x49\x58\xf4\x93\xe8\x22\x97\x8e\x3f\xb0\x78\x5c\xb3\x3e\xb4\x28\x3c\x76\x89\x49\xc1\x8b\x9a\xb4\xab\x9d\x9c\xec\x49\x6e\x2e\xc0\x32\xef\x25\xb5\xf3\xb3\xf0\x12\x1a\xf2\xa6\x17\x73\x5d\xbb\x61\xb9\x3d\x44\x7e\xe1\x3b\x3f\xb7\x62\xa9\x7c\xe6\x60\xef\x7e\x0c\x58\xd5\x93\x03\x98\x3d\xab\x6b\x11\x82\xfc\x8b\xcd\x68\x9e\x5d\x56\xc1\x9f\xdd\xae\xad\x1e\x0d\xa3\xa5\xd8\x66\xa3\xd8\xb7\x2f\x39\x2b\xa9\x30\x08\x98\xf1\xcd\x86\x30\xfb\xb4\x25\x65\xc9\x28\x5d\x94\x19\x29\xf2\x47\xd1\xac\x5f\x0f\xac\x6b\x5a\x68\xd6\xa3\xcc\x0c\xd9\xfd\xc2\xf9\x46\xbf\x6f\x08\xcb\xb7\xbb\xc2\x4d\xb5\x23\x65\x7a\x30\xe5\x8a\x96\xd2\x67\x17\xeb\x94\x05\xdf\x3d\x16\x54\x92\xad\x9f\x68\x41\xe0\x5e\xd7\xbc\x68\xbd\xbb\xc1\xd6\x09\x75\xf1\x01\x5e\x6f\x53\xe6\x4c\x09\x3d\xa4\x29\x35\xcc\x9e\x95\x5d\x9e\xa8\x4e\x71\x4c\x5b\xd9\xe1\x8b\xea\x84\xb5\xe3\xcc\xca\x0e\xab\x54\x27\xb8\xf9\x75\xef\x96\xab\x2b\xdb\x9c\x4a\xfd\x6e\x78\x95\x76\xd6\x32\x97\x74\xc3\x17\xf4\xb7\xdd\x66\x5b\xe4\xa5\x54\xaf\xc6\xae\xc7\x00\x47\xae\x77\x9b\x47\x46\xf2\x9a\x0f\x2f\xa5\x66\xa4\x2d\x1d\x53\x13\x9d\x4b\xb3\xd0\xe2\xa8\xa0\x6f\xc4\xb3\x77\xb1\xec\x87\x72\x18\xc9\xed\xcc\xfc\x0c\xe6\x28\x69\xb1\x3c\x53\xff\x66\xaf\x15\x4a\xa2\x1d\xc5\x41\x41\x57\x24\x7b\xd1\x02\x66\x00\x51\x41\xdd\x71\xb4\x95\xce\xb7\x82\x2e\xf3\xcf\x87\x43\x30\xd7\xd7\x0b\xd5\x42\x7b\x80\x26\x3b\x8a\x7a\x9a\x1b\x8a\x0b\x73\xd9\x42\xdc\x55\x45\xb4\xa5\xd3\x7e\x14\x4b\x36\x20\xd8\x72\x0a\xe7\xbd\x68\xff\xef\xac\xbc\x9b\x9c\xf7\x2a\x45\xe9\x11\x59\xf8\x67\xaf\xcc\xb1\x08\x99\x5e\xe9\xa3\x41\x34\x7f\xea\x5c\xce\xf0\x23\x3e\xd7\xde\xca\x9e\x4a\xac\x0c\x8e\x84\x58\x18\xf2\x23\xb4\xa7\x9d\xc3\xe1\xf1\x2e\x08\x63\x5c\x8e\x8c\x43\xce\x48\xf2\x91\xe2\x44\xcc\xad\xfc\x8e\xea\x8c\xfe\x10\x4c\xe4\x24\xf8\xc3\x88\x2f\x47\xc1\x84\xd6\x5e\x26\x43\x27\xaf\xed\x50\xbc\xc6\x4d\xa5\x3e\x44\x45\xe0\x1d\x56\x0e\x47\xa6\xc8\x69\xd9\x71\x61\x6f\x9b\xcf\xf5\xb5\x7b\xac\xce\xd2\x0d\x36\x01\x0c\xa4\xf6\x53\x6c\x0e\xa7\x19\x3e\x81\x23\x51\x4c\x8d\xf6\x41\x9b\xe8\xb1\xc6\x8e\x8d\xb9\xe3\x6b\x8e\x45\xc2\x52\x20\x5f\x9b\xbd\x48\x02\x47\x71\x64\x42\x28\x10\x17\x22\x81\x4c\x9b\xa3\x03\x14\x86\xc7\x3a\xcc\x41\x26\x3c\x6d\xee\xa1\xad\x61\x64\x30\x61\xf0\xa2\xd3\x9e\x0b\x96\x1c\x38\x65\x96\x4d\xa3\x6f\x01\x52\x7b\xee\xe8\xe9\xaa\x41\x07\x3f\xd9\x48\x00\x5f\x19\xf7\x60\xe0\x81\x9f\xf5\x4b\x1d\x7a\x20\x0c\x2d\x2a\xea\x3b\x9b\xdb\x67\xe6\xa7\x3a\xda\xbf\x36\x9e\x6a\xad\x68\x41\x57\x79\x29\xa9\xa8\x2d\x3c\xba\x08\x3e\x78\x9a\x29\x87\x4e\x33\x8f\x1d\x65\xf6\xda\xc8\xd9\x88\x4e\xdd\x09\x5d\x6d\x7e\x57\xeb\xb8\x22\x09\xee\x23\xf8\x66\x31\xbd\xae\x26\xbd\xb3\x6f\xe8\x1f\x7b\x43\xff\xc4\x1b\x8e\x1f\x76\xa7\xa8\x32\x17\x5b\xf6\x21\xe5\x29\x21\x3f\x68\x72\xdb\x87\x55\xf4\xad\xb0\xd2\x27\x11\x8d\xf2\x4d\x9f\x3e\xb4\x54\x76\x40\xb0\xb9\xa6\xab\xab\xb4\xd3\x67\x38\x4e\x19\x07\x19\x66\xd3\x5a\x1d\x07\x25\x66\xd3\xbe\x42\x0e\x0a\x1c\x9c\x6f\xb7\x45\x9e\x69\xce\xe1\x42\xc1\x02\x74\x85\xa6\x2d\x78\x97\x17\xf4\x8e\x92\x05\x15\xf0\x5e\x09\x34\x46\x61\x7c\x61\xe4\x4e\xd0\x16\x45\x17\x86\x79\x2b\xa8\x80\x6b\x23\x1f\xdc\x72\x21\xe1\x23\x5f\x50\xb8\xa5\x62\xc9\xc5\x46\x6d\xea\xd0\x58\x2e\xb9\xb0\xf7\x70\xbf\x26\x82\x2e\x8c\xd9\x10\x3c\xd0\xcf\xf2\x41\x90\xec\xa9\x79\xba\xd8\xd1\xe6\xe5\x43\x5e\x4a\xf8\x95\x3e\xfe\x35\xd7\xa3\x5d\xbc\x2b\xf8\x33\xfc\x6a\xee\x80\xb1\x55\xf4\xef\x34\x69\x1f\x09\xc1\x51\x3b\x9d\xce\x97\x5f\xb6\x6a\x76\xa1\xb1\xd7\x81\xae\xb5\x0e\x78\xb6\x3a\xd0\xb6\xd4\x81\xda\x4e\x07\xac\xe9\x0f\x34\xd6\x3a\xda\x98\x5f\x46\x01\x04\xfa\x2a\x9e\x96\xa9\xd0\x12\x27\xda\xb0\x75\xfa\x2c\x97\xb0\xc6\xc1\x39\xcb\xd6\x5c\xc0\xb9\xa0\x04\xce\x77\x8b\x9c\xc3\x8f\x77\xf0\xa3\x6a\x50\xfd\x7b\xc7\x99\x84\x1f\xf9\xe2\x05\x7e\xdc\x49\xc9\x19\x5c\x10\xb6\x27\x25\x58\x89\x1c\x2e\x35\xc0\x2e\x73\x41\x33\xc9\xc5\x0b\x5c\xe6\x7b\xb8\xda\x3c\xd2\x05\xbc\xcb\x69\xb1\xb8\xa7\x12\x74\x15\xef\xb8\xd8\x80\x36\xef\x02\x67\x0e\x06\x3f\xdf\xc1\xcf\x94\x2c\xf4\xbf\x9c\xad\xe0\x67\xb9\x29\xc0\xd8\x80\xc1\xfb\x0d\x59\x51\x83\x0d\xf0\x57\xfa\xb2\xa2\x0c\x3e\xbc\x87\x0f\xe4\x91\x16\xf0\x81\xae\x28\x5b\xc0\x87\x9c\x3d\xc1\x35\xd9\x82\x35\x11\x33\x88\x02\xd7\x94\xed\xe0\x9a\x4a\xf5\x24\x15\xba\xf0\x05\xdc\xe8\x5e\x1a\xe4\x87\x9b\xad\xfc\x49\xf0\xdd\x56\x3d\x28\x40\xde\xec\xa4\x6a\xe5\x96\x08\xb2\x12\x64\xbb\x86\x5b\x41\xe1\xd6\x6a\x91\xe0\x3f\x76\x5c\x52\xb8\xd7\x44\x10\xee\xb5\xec\x00\x16\x6d\xef\xb7\x84\xc1\xbd\x7c\x29\x28\x3c\x28\x1a\x77\x41\x4c\x85\xe6\x85\x16\x85\x7d\xe2\xf6\xc1\xfc\xbf\xe3\xcf\xe6\xe1\xde\x08\x9a\x1a\xf7\x34\xf4\x1f\x72\xa9\x32\x69\xec\xfc\x45\xf7\xf8\x17\x73\x02\x0a\x7f\xcb\x17\x94\xfb\xb3\x1a\x6f\xcf\x96\x78\x7d\xc4\xc0\x50\xdb\xcd\x05\x13\x3a\xa9\x4d\xf7\xaa\xda\xca\xa4\x40\x33\x9a\xec\xd2\xb3\xa5\x31\x8d\xde\xa1\xd9\x12\x17\x71\xe3\x35\x52\x33\x6e\x8b\xbc\x54\x9d\x9c\xbf\xbf\x9a\x67\x6b\x9a\x3d\x1d\x0e\xe3\x53\xd8\x37\xdf\x29\xd3\x9f\x33\xc1\xcb\x72\x6e\x55\x44\x5e\xce\x15\x96\xde\x21\x49\x84\xe0\x05\xd7\xd1\x34\x5c\xcc\x8f\x5f\x05\xd9\x6e\xa9\x48\x03\x98\xe3\x26\x2a\xe1\x7c\xfe\xe3\xdd\xcd\xaf\xf7\x57\x77\x0f\x37\x37\x1f\xee\xe7\x17\x37\x1f\xef\x6f\x3e\x5c\xcd\xef\xcf\xdf\x5d\xbd\xfb\xe5\xe3\xc5\x60\x90\x42\x78\xc2\xaf\xd7\xf7\xb7\x86\x9b\x36\x17\x28\xcf\xba\x0a\xd0\xfa\xfb\x25\x7f\x66\xb3\xb6\x3a\xb4\xfe\x76\xa5\xfe\xcd\x3a\xda\xd1\xfa\xeb\xcf\x8a\x89\xaf\xbf\x5a\x91\xa0\xfe\xfa\x41\x49\x04\xb3\x8e\x2a\xb5\xfe\x7a\xcd\xbd\x8f\x46\x56\xa8\xbf\xdd\xec\xe4\xac\x25\x0b\x34\x5f\xfc\x06\x3b\xed\xfd\xb2\x9d\x79\x8a\xcf\x0a\x36\xf8\x24\xde\x34\x8c\xcd\xc6\x31\x36\x8f\xb8\x9c\x44\xd1\x0d\x16\xc9\x26\x45\x93\x0c\xc1\x83\x4a\xb8\x99\xe4\x28\x26\xc9\x8d\x8e\xa8\xa1\x7e\x93\x2c\xc5\x8f\xe6\x29\x4f\xf1\x83\x36\xfe\x37\x55\xae\xfd\x2a\x1d\xaa\x5c\xe1\x75\xb2\x49\xe1\x19\xf3\xe4\x4a\xd7\x31\xe0\x1f\xa0\x9b\xbf\x89\x9f\x13\xd5\xf8\x7d\x9a\xe2\xab\x49\xd0\xb3\x14\x98\x05\x93\x9b\xca\x78\x1a\x5a\xd7\x00\xd3\xea\xb2\x37\x90\x4f\x98\x26\xcb\x64\x93\xa6\xf1\xad\xc1\xde\x4f\x61\xf8\xc9\x33\x24\xac\x64\xff\x1c\x5c\xed\x8b\xb7\xf0\xba\x5f\xcf\xda\x5b\xa5\x0b\x44\xb0\x08\xc3\x15\xca\x97\xd1\x1e\x59\x8b\xf2\x48\x07\x60\xaa\x0d\xc5\x10\xc6\xf8\xe5\x70\xe0\x18\xcf\x1b\x83\x97\xe6\x1a\x70\x18\x9f\x5a\x13\x33\xe2\x07\xf7\x6b\x7d\x6f\xee\x7c\x89\xff\xa5\xfa\x5d\x70\x67\xd3\x45\xd9\xb2\x62\xfb\x4a\xd3\xb5\x49\x0d\xf4\x1c\x7f\x86\xbc\xac\x9f\x12\x9a\x1e\x0e\xb4\xb2\xc1\x91\x12\x39\x70\x4e\x6c\xb7\x11\x94\xe2\xf1\x58\x51\x92\x0a\x69\x76\x05\x4a\x1a\x31\xd0\xd6\xd8\x5a\x7a\xd8\x52\xbc\x8f\xf4\xcd\xc3\xfa\x0e\x4c\xff\xa2\x37\xcf\x9c\xd1\xf0\xdd\x26\x4c\xb8\xb1\xe3\x63\x13\x1b\x57\x3a\xc7\xaf\x5e\xe8\x88\xcc\x8b\xbc\xda\xba\xb3\x82\x99\x3b\x2b\x4e\x06\xaf\x3f\xf9\xca\xa5\x15\xac\xbe\x7d\x16\xbb\x8b\xab\x28\x30\x7b\x71\x85\xf4\x4c\xf1\x3c\x43\x77\xe2\x2e\x81\x96\xed\xfb\x6b\x51\xc5\xcd\x3d\x17\x13\xdc\xb6\x7c\xe9\x7a\x66\x70\x20\xc7\xc2\x3d\x91\xe4\x24\x75\xc7\xea\xaf\x79\x79\x4b\x45\xce\x17\x79\x36\x0b\xde\xab\x35\xbe\x27\x85\xbe\x1e\x06\x16\xb4\x20\x2f\xb3\xc0\xdd\x36\x6b\x4c\x18\xda\x79\xce\x48\x72\x9a\x1e\x0e\x27\xee\xae\x3a\x35\xa4\x19\xa9\x60\x87\x55\x1b\x31\xe9\xc0\xcb\xb3\xf5\xdc\x1d\x01\x96\xbb\x7e\xba\x98\x36\x1d\x3b\x1c\xa2\x80\xed\x36\x8f\x54\x78\x71\xc6\x9b\x4b\x7e\xad\xa1\x69\x9e\x34\x69\xe9\xac\x79\x0e\xc3\xa8\x79\x49\xb6\xd4\xba\x04\xa2\xca\x20\xd0\x12\x2f\x22\x09\xaa\xa7\x50\x68\xbf\x06\x6d\xd4\xb6\x74\x8b\x64\x69\xb0\x0c\x2f\xdb\xd3\xe0\x84\xd4\x6e\xb7\xb6\x67\x79\xb2\x4d\xf1\x72\xa6\x3d\xe5\x75\x6b\x4b\x04\xdb\x30\xdc\x4e\x05\x5d\xaa\x9f\x1d\xd3\x0f\x03\xd3\x62\xb3\x0c\x7e\xb1\xa5\xa2\xa5\xca\x83\x75\x4e\x6d\xe3\x10\x6d\x11\x2c\xcd\x57\x6c\x73\xb9\x74\x04\xfd\xde\x1d\x0e\xdb\xb3\xed\x6c\xd9\xc4\x60\x73\xd8\x48\x50\xa5\xc3\x5d\x5e\x68\x89\x6d\xc0\xf1\x62\x38\x14\xa2\x50\xb3\xdc\x6b\x86\x9c\x71\x9c\x27\x24\x9d\x45\x5c\x87\xb2\x57\x60\x40\x87\x83\x7a\x43\xc0\xc3\xb0\xe7\xbd\xc9\xcd\xe5\x71\xed\xbb\x73\xc7\x18\x73\x73\x7b\x72\x18\x46\xbc\xbe\xb0\x3d\x0c\xb9\x99\x0a\x1f\x3f\x74\xc0\xc5\xfa\xbe\x64\x25\x15\x0e\x74\xaa\xc6\x13\x92\xce\x88\x36\xcd\xa8\x91\x01\x78\xcf\x3f\x94\xa3\xc6\x51\x9e\xda\x2b\x5d\x06\x4c\x56\x8a\x9e\x80\x54\x87\xe9\x4b\x7a\xe6\x3b\xbe\xf2\x0a\xa5\x26\xe4\x32\x1a\x8e\x10\xf7\xfb\x8e\xee\x4c\x64\x1d\xa9\xef\xf6\xed\xeb\x9f\x7c\x4f\x2e\x0a\x6f\x14\x18\x08\x9e\xa7\xbd\xb6\xfa\x77\x58\x36\x71\xb5\xbb\xb5\x31\x45\x32\x14\x08\x86\xc3\xd9\xe5\x1b\x1d\xa3\xaa\x0f\x84\x40\x9f\x85\x32\x1c\x64\x05\x25\x22\x88\x6b\xa2\x1c\x78\x97\x58\xd7\x69\x35\x6d\x69\x25\x3a\xa7\xb4\xe0\x48\xeb\x56\x97\x7f\xee\x0e\x07\x34\x63\xdf\xee\x8c\xae\x2d\x68\x94\xfe\xb5\x62\xb6\x53\xc8\xb6\x1b\x6c\xf8\x97\xc6\x8f\x61\xc3\xbf\x5c\x7c\x25\xbf\x39\x87\x68\x8a\x98\xf7\xa3\xa5\x86\xc7\xf1\x58\xf0\xec\xa9\x13\x14\xb0\x7d\x89\x67\x12\x90\x82\x3a\x3d\xbe\x39\x5e\xd3\xba\x0f\xb1\x09\x52\x6b\x5b\xc8\x7c\xd3\x42\xbd\x9a\x13\x91\xfa\x26\x55\xfe\x4d\xa6\x75\xb2\xbe\x07\xa3\x09\x9f\x67\xf1\x42\xec\x98\x0e\xe5\x48\x74\xc8\xef\x23\xbd\x6e\xcb\x7c\x6f\xab\x09\xe4\x90\xf1\x93\xd1\x0a\xd9\xdd\xbd\x9d\x5f\x51\xe2\xaf\x33\x08\x3e\x84\xbe\x55\x05\x31\xa8\x70\x20\xbe\xc2\x21\x6f\x29\x1c\xb2\x61\x85\x43\x89\x4f\xe2\xb2\xe1\x45\x4b\xc7\x41\x16\x58\x24\x65\x0a\x3b\x9c\x4d\xa2\x62\x92\x23\x58\x9a\x27\x82\x62\x9e\x14\x9a\x8d\x55\xbf\x8a\x01\xde\x99\x27\x92\xe2\x65\x65\xb6\x1a\xea\x1b\x5d\xaa\xdd\x48\x6f\x1f\x0d\xfb\x79\x84\xfb\x4c\xda\xd9\xd4\x72\xd5\x30\x8d\x9d\xfd\xfb\x51\x75\x41\x6c\x03\x23\xd5\x7e\x34\x6c\xa8\x05\x06\x89\x68\x55\x3f\x88\x0e\xd7\x3b\x73\x2e\x7b\xf3\x58\x52\xa1\xe5\x88\x2e\x4e\xfc\x36\x90\x09\xc1\x6f\x51\x60\xb4\x21\xfd\x6f\xc3\x0d\x69\x5a\x51\x1a\xd1\xf6\xcd\xc6\x06\x33\x1e\xa9\xb4\x51\x10\x0d\x56\xe5\x7d\x3e\x52\x41\xe3\x0e\x37\xa0\x34\x13\x8e\x75\x1d\x2a\x99\xed\x4a\xc9\x37\x56\x90\x2e\xff\x37\xb4\x93\x74\xda\x6e\x23\x0c\xbb\x8d\xe6\x6c\x44\x07\xb5\x94\xdd\xa2\xd0\xeb\xae\x3d\xdb\xd0\xaa\x4a\x77\x28\xed\x6b\x26\xbd\xb3\x6a\x5f\x3b\xb9\xe0\xdb\x9e\x56\xf3\xab\xfa\xca\x01\xe8\xfd\xfd\xe7\xbb\x2e\xd9\x1c\x77\x77\xa3\x5d\x6f\x0d\xa8\xc5\xb5\x73\xf7\xc0\xec\x3c\xff\x84\x2d\x5e\xaa\xf5\xbb\xc6\xcb\xa4\x30\xb1\x35\xb6\x26\xdb\xea\xcd\x75\x94\x2f\xa3\x95\x8b\xeb\xb3\xf2\x9c\x88\xb7\xf8\xc5\x54\xf7\x92\x14\xa9\x71\xa6\x98\xe3\x01\x4b\x8d\x27\x1c\x94\x35\xff\x03\x1b\x7c\x11\x2d\xad\x1d\x2e\xf4\xa5\x8e\x21\x15\xfe\x88\x26\x22\xc5\x27\x18\xeb\x5b\x27\xa9\xa2\x2f\xfa\x12\xca\x4d\xcd\xc8\x48\xcd\xe8\x3d\x2a\xa1\x49\x47\xd9\x55\xdb\xfd\xf9\x23\x17\xda\x80\x47\x89\xec\xfe\x07\xcb\x8c\x99\x4f\x57\xa6\x3b\xc6\x46\xfa\xcd\xee\x58\x37\x5f\xc5\x94\xd5\x9b\x49\xf2\xa0\x24\xbe\xa4\xb9\x40\xe1\xaa\x91\x84\x9c\x33\x8b\xf3\x6f\xa4\xb0\x13\xc5\x4c\xf5\x1e\x3c\xe9\x64\x7c\x6a\xc4\x0b\x06\xda\x34\x92\x2e\x66\xe3\xd3\x0a\x08\x5e\x74\x4d\xe5\xa7\xa6\x8b\x37\xc0\xe1\x1e\x6e\x51\x4c\xc3\xd0\xde\x0f\x97\xa5\x61\x38\xe6\x53\x5b\xde\xde\x19\xa3\xa3\x69\x3d\xa9\x17\x1b\x95\x52\x43\xe8\xd9\x8c\xd6\x5a\x61\xbe\x39\xdc\x5a\xbe\x1c\x72\xc1\x4d\x58\x5a\x45\xd4\xdc\x27\x7b\x94\xf3\x35\xb7\xc9\xe9\x83\x9e\x86\xd1\x3d\x1c\xb8\xbd\x7e\xc8\x32\xbc\xb6\xdb\x16\x80\xf1\x10\xcb\x5a\xcb\xf0\x1d\xe0\x3f\xd6\x60\x7f\xee\xb0\xb4\xb5\xf0\x79\xef\x96\x89\xb0\xb7\x35\x42\x8e\x5d\x70\xcb\x58\xf1\xcc\x78\x7c\x0a\xda\xca\xdb\x3a\xfa\xec\xb4\xcb\x43\xbc\x3d\x1c\xa2\x2d\xce\x0d\x7e\xe7\x3a\xda\xc4\x2e\x0c\xd7\x36\x8e\x2f\xcc\x61\x87\xac\x9c\xa5\x9d\x23\xda\xb1\x88\xf3\xa9\x5e\x04\xf7\x76\x16\xf2\xe9\xe5\xcd\xc7\x2b\xa4\xbd\xba\x9b\x59\xca\x75\x0c\x44\xda\xcc\x95\xa3\x7e\x79\x27\x0e\xb3\x22\x08\xe6\x12\x78\xa4\x17\xed\xc9\x58\x55\x69\xae\x0c\x08\x43\x1d\x0b\xc1\x99\xdc\xbb\x29\x73\xe1\x7f\x62\xf7\x30\x74\x99\xdd\xdb\x2d\x01\xc1\x27\x31\x69\x18\x2f\xa2\x2f\xb2\x20\xa9\xb9\x76\x95\xb9\x78\x37\x04\x4e\x51\xec\x0f\x8b\xfa\xc8\xc7\xeb\xfb\x8c\xea\xeb\x3e\xec\x64\xd2\x06\x2d\xd5\xbb\x5f\x83\xf6\x70\x30\xd0\x89\xcc\xcc\x9c\xa0\x3a\x74\xd2\xb6\x99\x81\x25\x82\x3c\x61\xe9\xe1\x10\xa9\x1f\x4c\x11\xb8\xc5\x97\x83\xb0\x6a\x08\x33\xc3\x27\xe0\x5d\x3a\x77\x13\xa1\xd7\xe6\xed\xf6\x8d\xdb\x3c\x4d\x87\x54\xf1\xe7\x23\xf7\x73\xea\x08\xda\xf6\xf6\x93\x7d\x14\x7c\x5e\x0b\xa3\xae\x31\x91\xab\x3f\xaf\xc5\xfd\x0b\xcb\x5c\xe4\xea\xcf\x6b\xd1\xc4\x17\x01\xe2\x72\xd4\x94\x11\x41\x6e\xd3\x7e\xb9\xfb\x10\x20\xc8\xec\x9b\x3e\x88\xfe\x51\x5b\xe6\x78\x99\x87\x37\x8c\x15\xe5\x05\xcf\xba\x11\x2e\x34\x8f\x5a\x7b\x74\xab\xad\xb0\x71\xef\xf6\x4a\x78\x8e\x38\x7a\x6f\x6e\xae\x4c\x92\xfd\xe0\x62\x1e\x5d\x70\xbe\x1f\x90\x2b\x86\x32\xe1\x29\x94\x58\x26\x59\x6a\xfc\xdc\x34\xd1\xdc\x44\x34\x92\x90\x21\xe7\x0d\xae\xad\x89\x72\xb6\xa3\x41\xac\x72\xe2\x28\x1f\x50\x40\x11\x5f\x99\xe2\x5f\x9e\x2c\xb4\x8b\x53\x86\xf4\x35\xae\x39\x10\xac\x66\x1a\x55\xd5\x10\xce\xf2\x88\xa0\x2a\x3a\x32\x62\x48\x82\x15\x95\xd6\x17\xe0\xd6\x5a\x79\x6b\xd3\x4f\x99\xad\xeb\xf7\x63\x4c\x61\xf7\x5e\x44\xbd\x67\xf6\xc4\x9c\x3a\x66\xc2\xa0\xda\x01\xbd\x9a\x20\x2f\xfd\xe3\x66\xd1\x2c\xe6\xc1\x86\x5a\xb1\x86\xcc\x45\x01\x12\x5e\xdd\x1d\x58\xcc\x5d\x66\xe5\x6e\x12\x61\xcd\x4d\x60\x15\x8a\x85\x5b\x7e\x5a\x43\x52\x55\x47\xda\xd0\xd1\xa7\xf6\xdf\x72\x15\x64\x8a\x59\x34\x64\x06\x88\x40\x57\x70\xf4\x4e\x30\x5d\xae\x67\x5b\xa8\x2f\xb0\x81\x3a\xe0\xac\x0e\x63\xeb\x82\x20\x83\x04\xaa\xef\x6f\xa5\x53\xfa\x79\xcb\x85\x2c\x31\x47\x15\xfc\x3f\xff\xef\xff\xf7\xef\x7f\x9c\x75\xd9\x4b\x8d\xb6\x47\x1c\xfa\xcc\x79\xed\x83\xbe\x15\xa6\x79\x06\xfe\x86\xdd\x4f\x18\x9a\x5f\x20\x83\x99\x4a\x5a\x2c\x87\xbd\x76\x7b\x87\x9e\x61\xa8\x32\xfb\x51\xd3\x8f\x64\x51\xfb\xd5\xe1\x70\xbc\xff\xae\xef\x87\x03\x3f\x1c\x08\x64\xbe\x9d\xc1\x74\x3a\x35\xe2\x66\x66\x22\x57\x15\x44\x52\x07\x13\x86\xbd\x44\x63\x86\x40\x31\xd3\xf7\x7b\x63\x96\x9c\xa6\x55\x41\x55\xa6\x32\xa2\x2a\x8d\x4e\x05\x79\xd6\xd7\x8d\xeb\xf0\x4c\x54\xc1\xf4\x34\x16\x3f\xb4\x5d\xfe\x26\x58\x26\xe2\xbb\xd3\x74\xa2\x4a\x09\x57\x4a\x34\xd7\xaf\x30\x4f\x27\x5d\xb6\x8c\x34\x66\x81\xd9\xd9\xd7\x44\x9c\xcb\xe8\x04\x9d\xf9\x51\x3e\xfa\x8a\x03\xd3\xb9\x53\x50\xbd\x60\x4d\x2f\xd8\x64\x02\xc2\xc4\x4d\x0c\xfe\xf1\x0f\x5d\xa5\xe6\xcd\x26\x93\xfa\x8e\x47\xd3\x92\x62\x60\xea\xab\xf4\xe3\xee\x9d\x63\xff\xf5\x8b\x3e\x65\xca\x19\x91\x74\x31\xfa\x37\x45\x2d\x8a\xfc\x0b\x1d\x39\x07\x86\x91\xd6\x69\x8c\x72\x36\x0a\xfe\xed\x55\x56\xc1\xf4\xbf\x90\xf1\x0f\x9b\x9c\xa2\x19\xad\xf2\x69\x5d\x04\x67\xc0\xa2\x3f\xfd\xe9\xf4\x8f\x27\x8a\x3c\xf9\x9c\x14\x8d\xe8\xb4\xc4\x1a\x6b\x51\x95\xa2\xf8\xff\x06\x00\x00\xff\xff\x12\x48\x2c\x24\x5b\xb5\x00\x00") - -func bindataTkgWebDistTkgkickstartuiPolyfillses20153e69d632a8e7bb99faa8JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiPolyfillses20153e69d632a8e7bb99faa8Js, - "tkg/web/dist/tkg-kickstart-ui/polyfills-es2015.3e69d632a8e7bb99faa8.js", - ) -} - -func bindataTkgWebDistTkgkickstartuiPolyfillses20153e69d632a8e7bb99faa8Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiPolyfillses20153e69d632a8e7bb99faa8JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/polyfills-es2015.3e69d632a8e7bb99faa8.js", - size: 46427, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiPolyfillses54f5834b7b08801de44f4Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x09\x73\xe3\x38\x92\x28\x8e\x7f\x15\x89\xb1\xc1\x06\x42\x28\xad\xe4\xdb\x52\xa3\xfd\xaa\xab\xdc\xdd\xde\x2d\x97\xeb\x95\xdd\x33\xb3\xc3\xe1\xf3\xa3\x29\x48\x42\x99\x02\x34\x24\xe8\xa3\x4d\x7e\xf7\x7f\xe0\x22\xc1\x43\xae\x9a\x99\x9d\xdd\xff\xdb\x5f\x87\x23\x2c\x12\xc4\x99\x48\x24\x32\x13\x99\x89\xe1\x32\x67\xb1\xa0\x9c\x01\xf8\x62\x1f\x07\x02\x08\xc4\xe0\xcb\x43\x94\x0e\x52\xec\xe5\x6c\x41\x96\x94\x91\x85\x37\xc4\xe2\x79\x4b\xf8\x72\x70\xfd\xbc\xb9\xe3\x89\xef\x8b\x40\x3f\x8d\xa9\x20\x69\x24\x78\x1a\x16\x85\x08\xbc\xff\xf5\xbf\xec\xbb\x17\xce\xe9\x12\x0c\x53\xf8\x42\x97\xe0\x6d\x9a\x46\xcf\x63\x9a\xa9\x5f\x20\x60\x51\x80\x14\x57\xed\xab\x26\x65\x66\x01\x53\x22\xf2\x94\xc9\x92\x5e\x26\x52\xca\x56\x1e\xb6\x2d\xdb\x8f\x03\xa2\x0a\xcc\x75\x1f\xaf\xee\xbe\x90\x58\x8c\xb7\x29\x17\x5c\x66\x1c\x0b\x7e\xad\x0a\x8e\xe3\x28\x49\x80\x80\xe3\x2c\xa1\x31\x01\x27\xe8\xcd\x14\xce\x3d\x9d\xdd\xc3\x18\xa7\xbe\x2f\xc6\x31\x67\x99\x48\xf3\x58\xf0\xd4\xf7\x41\x8a\x1b\x29\x63\x16\x6d\x08\x54\x7d\xb9\x8c\xb6\xaa\x4c\x51\x78\xd7\x44\x17\xb7\xbd\xd1\x43\x5b\xa6\x7c\x03\x84\xce\xfc\x36\x5d\xe5\x1b\xc2\x44\x66\x8a\xfc\xeb\xff\x01\x67\xb3\x5f\x69\x71\x01\x99\x00\x67\xb3\x93\x62\x7a\x54\xec\xef\x41\x70\x36\x7b\x97\x44\x9b\x2d\x59\xc0\x33\x55\xc9\xbf\xfc\xeb\x58\x90\x4c\x80\x14\x36\x47\x5a\x02\x01\x61\x51\x30\xdf\x17\xbe\xef\xb1\x7c\x73\x47\x52\x07\x2c\xe3\x84\xb0\x95\x58\xc3\x17\x39\x04\x81\x53\x0d\x19\x8e\x27\x88\x62\x67\x8a\xcb\xb9\xae\xf4\x25\x9b\x51\xc4\x66\xce\x17\xd3\x18\xff\x01\xdb\xba\xce\x5e\x16\x9c\x91\xd9\x70\x52\xce\xcc\xd3\x14\x3d\x44\x49\x4e\x66\x22\xe0\xa3\x51\x58\x96\x88\xd4\x35\x08\xf8\x22\xd6\x29\x7f\x1c\x88\x12\x2d\x67\xb4\x2c\xf5\x1b\x23\x8f\x83\x9b\xe7\x2d\x39\x4f\x53\x9e\x02\xef\x82\x3d\x44\x09\x5d\x0c\x22\x21\xc8\x66\x2b\x06\x82\x0f\x34\xaa\x90\x01\xe3\xec\x8d\x7a\xbe\x4b\xc8\x80\xb2\x4c\x44\x2c\x26\xe3\xbf\xb0\x0b\x36\xe0\xe9\x82\xa4\x32\xef\x1d\x19\xd8\x2c\x48\x15\x88\x24\xc8\x06\x5c\xcd\x67\x36\xd8\xe4\x99\x18\xac\xa3\x07\x32\x88\x06\x1d\xcc\x04\x70\xb0\x21\x62\xcd\x17\x63\x0f\x96\x12\x38\x11\x8a\xf1\x70\x82\x72\x3c\x9c\xd6\x50\x71\x21\x82\x53\x8b\x3e\x65\x13\x56\xb2\xb4\xc0\xe9\x98\x91\x27\x01\xa0\x29\x3c\x88\xb1\x18\x4b\x38\x21\xd1\x06\x4c\x2e\xdb\x89\xb0\x82\x8c\x53\x8d\x48\x9f\x5f\xe2\xa2\x60\x79\x92\x60\x9c\x8e\x75\x35\x45\x61\x9f\x00\x2c\x97\x94\x45\x49\xf2\x2c\x97\x45\x0e\x35\x40\xa3\xb2\x2c\xcb\x6a\xa5\x4a\xdc\x20\xf0\x05\xe8\x3a\x48\x51\x90\x1f\x2a\x54\xf0\x7d\x40\xaa\xc9\x84\xf3\x25\x4f\x81\xec\x38\xc3\x13\x94\x62\x39\x2f\x7a\x1d\x12\x38\x67\xdf\x93\x39\x1b\x8d\x60\x1a\xb0\x10\x8b\x80\x85\x76\x48\x69\x09\x32\x92\x2c\xc7\x8f\xe4\x6e\x1b\xc5\xf7\xef\xd6\x39\xbb\x17\xf7\xab\xdb\x7b\x1a\xdf\x67\x22\x4a\xc5\x6d\x4e\xf1\x57\x73\x14\x45\x10\xc2\xf1\x36\xcf\xd6\x20\x08\x8e\x4e\x4f\xd0\xc1\xde\x69\x88\x5e\x8e\x0f\x4e\x4f\x27\x0e\x9c\x10\x91\x14\xc0\xcb\x33\x32\x90\xab\x3e\x16\xde\x9c\x81\x83\xe3\xd3\x29\x44\x0c\x9c\x1c\x4f\xf6\x8f\xd5\xc3\xe4\xe0\x58\x3d\x1c\x9f\xee\x4d\xf7\xe5\xc3\x74\x6f\xff\xe8\x44\x3e\x1c\x1d\x4d\x8f\x4f\xe5\xc3\xc1\xe4\x74\x72\x28\x1f\x0e\xf7\x0e\x8e\xf7\x54\xa9\x93\x3d\xfd\x70\xb0\x3f\x39\x99\xa8\x4f\xd3\x53\x9d\x79\xff\x68\x7a\xa8\x3f\xed\x9d\x1e\xaa\x0a\x0f\x27\x07\x53\x95\xe7\x78\x72\xb8\x3f\xd1\x35\xef\x1d\xab\x87\xe9\xe4\x60\x6f\xa2\x2b\xd4\x6d\x1e\x9f\x9c\x4e\x74\x0b\xfb\x07\x27\xea\x61\xff\xf0\x78\x72\xa0\x3e\xed\x9f\x1e\xea\x3c\xc7\x87\xa7\xfa\x61\x7a\x38\x55\x6d\x4e\x4f\xf6\x4e\x55\x9e\x93\xd3\x63\xf5\x7b\x7a\xba\xaf\x13\x8e\x8e\xf6\x4f\xf4\x60\x0e\x4f\x0e\x54\x7d\x47\xd3\xa9\xee\xf1\xc9\xd1\x54\x67\xde\x9f\x1c\x28\x08\x1c\x4c\x27\xa7\xfa\xe1\xe8\x54\xf7\xf7\x64\xa2\x9b\x3e\x39\x3c\x38\x50\x43\x39\x3a\xde\xdf\xd3\x4d\x1f\x1d\x9f\xe8\xde\xed\xeb\x2e\x9c\x4a\xf8\xa9\x2f\x07\xa7\x27\xba\xe9\xe3\x83\x89\xae\xe6\x78\x5f\x37\x70\x7a\xb4\x77\xa0\x3e\x4d\x0f\x8e\xf6\x8e\x14\x68\x8e\x0e\x4e\x0e\x75\x3f\x4f\xf4\x7c\x1c\x1c\x4c\x0e\x34\x1c\x0f\x4e\xf5\x54\x4d\xf7\xf7\xa7\x53\x0d\x59\x33\x55\x7b\xc7\xd3\xa3\x7d\x5d\xf3\xf4\xf8\x48\xe7\x39\xd6\x35\x1f\x1e\xed\x1d\xe9\xcc\x93\xe3\x89\xf9\xb4\xaf\xc1\xb6\x3f\x99\x4c\x74\x85\x87\xd3\x7d\xdd\xe7\x53\xf3\x70\xb4\x77\x7c\x72\xa4\x5b\xdf\x3b\x9a\xe8\xcc\x27\x1a\x06\xa7\x27\x53\xdd\xf9\xc3\xa3\x83\x63\xd5\xd5\xfd\xd3\x7d\x8d\x0d\xfb\xc7\x7b\xa6\xf3\xc7\xc7\x53\x0d\xc0\xfd\x3d\x3d\xe3\xc7\xfb\xc7\xa6\x17\xfb\x1a\x19\x4e\x26\xa7\x53\xf5\xb0\x77\x74\x7a\x68\x66\x66\xef\x48\x4f\xf0\xde\x81\x01\xc6\xe1\xbe\x9e\x90\xbd\xe9\xe1\x89\x2a\xbe\x77\x30\x35\x73\x7f\x7a\xac\xc1\x7c\x78\x74\x70\xa0\x33\x9f\x4e\xf7\xf5\xdc\x1c\xec\xeb\xa9\x38\x3d\x98\xea\x3c\x7b\xc7\xc7\x07\x1a\xc9\x4f\x4e\x4c\x5b\xfb\x07\xfb\x27\x06\x5d\xa7\x3a\xe5\x60\xa2\x71\x68\x6f\xef\x68\xa2\xfb\x7c\x70\x78\x60\x1a\x3d\xdd\xd7\x98\x72\x7c\xaa\x53\xa6\x47\xc7\x13\x58\x22\xf5\xde\x20\x44\x72\xfd\x13\xec\xa6\x34\x96\x9b\xfa\x8c\x58\x67\x3b\x95\xf4\x62\xbc\x8e\xb2\xab\x47\xf6\x29\xe5\x5b\x92\x8a\x67\xc4\xb1\x67\xeb\xa9\xb7\x21\x4d\x73\xcf\xf4\xcf\xec\xa5\x44\x14\xf3\x8a\x02\x17\x85\xcb\x18\xa0\x08\xf3\x71\x94\x3d\xb3\xf8\xc2\xfd\xde\x48\xf1\x50\x8c\x79\xb5\x97\xdf\x44\x2b\x95\xc5\x79\xf7\xe6\x15\x25\xcc\x2d\x01\x31\xa4\xcb\x8c\x41\xb3\x2e\xb6\xd7\x2a\xcf\x8b\xde\xc4\x18\x22\x2c\xdf\xe8\xcd\x64\x36\x9c\xa0\x98\xb3\x25\x5d\xe5\xd5\xfb\x63\x4a\x85\x79\x2e\x21\x12\x01\x09\x4b\x49\xb0\x73\xf0\x52\x22\xcf\x83\x65\x1c\x89\x78\x0d\x2e\x24\x75\x6f\xd3\x30\xd3\x05\x59\x06\x33\x87\x5a\x67\x3a\x03\x4a\xf5\x4c\x70\x0b\xe8\x38\x25\x91\x20\x00\x10\xdf\x27\x35\xd4\xab\x4d\x90\x2f\x07\xab\x33\x32\x5b\xc1\xfa\x1b\x44\x54\x91\xf0\x2f\x20\x55\xd4\xd5\x12\x6c\x3e\xbe\xa5\xec\x81\xdf\x93\x4e\x9f\x34\xa3\x94\xd8\x8c\xd5\x67\x8e\xa8\x62\xbb\x52\x8c\xf1\x1a\xd6\x9b\xb6\xd9\xb0\x7f\x26\x4c\xcf\xc5\x80\x66\x83\x28\x49\x49\xb4\x78\x1e\xa4\x39\x63\x92\x2b\x53\x9c\x8e\x2c\xf8\xa0\xaa\xf0\x54\x69\xc9\xef\x70\x53\x11\xb5\xcd\x5d\xca\xcd\x8c\xa7\x80\x8d\xf5\x1e\x8c\x39\x62\xe3\x28\x5d\x61\x3a\x9f\xeb\xbe\x45\x98\x8d\x17\x24\x21\xab\x48\x10\x59\x6d\xa4\x93\x63\x7c\x05\x22\xc9\xe8\xd1\x25\x88\x55\x2b\x31\xc6\x78\x01\x63\xce\x04\x65\x39\xa9\x36\xdf\xb2\x94\x3d\x90\x3b\xb2\xec\x80\x6d\x07\xb2\x71\x46\x98\xc0\x6c\x7c\x6b\x7e\xa3\x74\x35\x27\x49\x46\x06\x8d\x0e\x57\xf9\x2d\x28\x12\x33\x82\x14\x3f\xe8\x9e\xce\xd9\x78\x41\xb3\xad\x9c\xf4\xf3\xa7\x98\x6c\x15\xf0\xd4\x17\x58\xca\xfa\x3c\xdd\x11\xb7\x32\xdf\x67\xe3\xe8\x2e\xcd\xb7\x02\xd8\xaf\xba\x2e\x38\x4f\xf1\x5a\xad\xb6\x1c\x2f\xcd\x04\x29\xa6\x91\xf1\x74\x13\x25\xb2\x8e\x7c\xac\xa6\x59\x77\x87\x29\xbe\xe2\xec\x61\xb6\x45\xb9\x82\x5a\x0f\x04\x0c\x56\xab\xef\x48\xb1\x6b\xba\x54\x59\xd6\xa3\xd4\x95\x2a\x1e\x57\x8e\xca\x4c\x85\xf9\x6e\x26\x24\xd7\x43\x2a\x4b\xc9\x75\x22\x0a\x11\xaf\xf1\xd7\xf6\x55\x71\x2e\xa6\x59\x59\xe3\xcc\x76\x1c\x45\xe9\x6a\x26\x34\xd7\x24\x33\x96\x66\x95\xa4\xb0\x99\xdd\xb4\x28\x73\xa7\x65\x59\x8a\xf1\x63\x1a\x6d\x71\xa6\x40\x92\x60\x2f\xcb\xb3\x2d\x61\x0b\xb2\xb8\x96\x1c\x84\x87\xb6\x4e\xd2\x7f\x50\x92\x2c\x3c\xb4\xc6\x1e\x79\x22\x71\x2e\x24\x1e\xa2\x07\xec\xc5\x7c\xb3\x4d\x88\x20\x0b\x0f\x2d\xf0\x4b\x59\x13\x86\x95\x64\x7b\xab\xb7\xe7\xc6\xdb\x9d\x7c\x93\x8d\x6e\x64\x91\x1c\x6c\x10\x45\x5d\x9e\x58\xac\x69\x56\x6a\x86\xfa\xd6\x2e\xd9\x15\x11\x9f\xec\x62\xbc\x5a\xa2\x7b\x7c\xeb\xfb\xb7\xe0\x16\x7c\x02\x41\x08\x21\x9c\xdf\xfb\xfe\xfd\x10\x63\xe6\xfb\x86\x89\xbc\x47\x54\x72\x64\x1b\x7c\xaf\x6b\x7a\xc4\x77\xf5\x72\xc6\x2b\xe7\xb9\x49\x14\x36\xb0\x1e\xca\x93\xa4\xd8\x81\x46\x72\x64\x81\x68\x51\x2b\x1c\x2f\x79\x7a\x1e\xc5\x6b\x50\x8d\x80\xc0\x17\x4d\x16\x5d\x8a\xef\x0c\xca\x12\x0b\x40\x90\x80\xa5\xfc\xab\x9a\x3a\xd7\x8c\x65\xf5\xae\x08\x05\x8a\x50\xac\x97\xa5\xc2\xdb\x80\x87\x48\x20\xaa\x51\x57\xf7\x66\x58\x63\xae\xcc\x96\x69\x74\x42\x09\xce\xc6\x0a\x3f\xed\x72\x4d\x7c\xdf\xe3\x56\x0a\x33\x9b\x47\x52\xc1\x2a\x41\xde\xed\x6d\xf4\x18\x51\xe1\xc1\x33\x32\x4e\x49\xc6\x93\x07\x02\x92\xb1\x49\x85\x63\xb1\x26\x0c\xb8\xa3\x62\x66\xed\x23\xa1\x3a\x59\xa2\xd6\x47\x03\x2c\xf3\x15\xce\x9c\x5a\x7b\x6a\x33\xbd\xc5\x02\x45\x20\x6b\x55\x66\x46\xd0\xad\xb3\x8c\x81\x59\x3c\x8a\xb8\xcf\x5d\x08\xbb\xe4\x38\x75\xc0\x4a\x6b\x2c\x93\x44\x97\x38\x73\x87\xb8\xec\xb8\x40\x29\x92\x8f\x25\x2c\x2d\x89\xc7\xfc\x8c\xeb\x2e\x53\x44\xe1\x8c\x02\xe8\x6c\x31\x57\xae\xe8\x2e\xaa\xbd\x37\xb0\xab\x3d\xb4\x24\x5b\xd3\x96\x9a\xe6\x62\x29\x42\xa0\x1d\x14\xb1\xae\xc8\xc8\x26\xbe\x5f\x93\xf2\x26\x6d\xc3\x04\xe9\x3e\xf4\xd5\x65\x45\xda\xc5\x7c\x07\xf5\x69\x89\x8b\x37\x6b\x23\xf0\xc9\x0d\x68\xc1\x49\x36\x60\x5c\x0c\xb6\x29\x7f\xa0\x0b\x29\xe4\x7d\xa7\x0a\x7f\x67\x04\x3b\xaf\x82\xd1\x42\x4f\x01\x5e\x82\x14\xd5\x7d\xb7\xc4\xb7\xb9\x55\x69\x74\xb5\x93\xd0\xdf\x2d\xae\xb0\xb8\x0d\xac\x85\x5a\xc8\x54\x7f\xb5\x98\x4d\xcf\xa8\xa6\xd6\x80\x05\x42\x22\x59\x9e\x88\x8f\xd1\x86\x84\x98\x6a\xa4\x42\x4c\xc9\x8d\x58\xa8\x9f\x0f\x3c\xae\x56\xf0\xd0\xdd\x3a\x1c\xf8\x6a\xc4\x36\xd0\x85\xdd\x6e\xc0\x19\x9d\x81\x6f\x03\x68\x05\x4c\xdd\x31\xb9\xa9\x4b\x88\x46\xcc\xc8\xd0\x5e\x5f\xf5\x35\x76\x5d\xd7\x4c\xa4\xdc\x03\x3e\xf0\x78\x26\x82\x49\x58\xce\xa7\x03\xca\x06\x42\x4a\x9c\x63\x45\xf1\x3f\xf0\x18\x8b\x60\x1a\x42\xb4\x57\x7f\x31\xd2\xac\xfe\xb6\x17\x22\x32\x8e\x96\x82\xa4\xfa\x7d\x3f\x84\x48\xad\x18\x91\x3e\x9f\x33\x91\x52\x92\x69\x91\x91\x38\xed\xdf\xd4\xed\x8b\xb1\xa1\xf8\x94\xb3\xa2\x78\x29\xe7\x44\x4d\x24\xae\xb6\x22\x39\x0a\x41\x06\x44\x4d\x9d\x9b\x1b\x93\xba\xc2\x2f\x5a\x6f\xd1\x68\x16\x07\x76\x6c\x5e\xca\xb9\xf0\xca\x10\x89\x8a\xb6\x5e\xab\x4e\x9a\xae\xa6\x24\x23\x02\x0c\x27\x4e\x0f\x3f\xc9\x0a\xe5\x8a\xd1\xfd\x64\x58\x04\x54\xad\x39\x56\xa3\x98\x51\x2a\x28\x3c\xec\xf2\xd0\x1a\x2f\x6c\x6e\xa1\xf4\x67\x34\xfb\x18\x7d\x04\x95\x2c\x6f\xd9\xc7\x37\x53\x14\x61\x87\x44\xc3\x17\xc9\x63\xcd\x47\x23\xfe\xbd\xcd\x3b\x87\x72\xbd\x9b\x26\x11\x87\x75\x2f\x0c\x85\x93\x44\x5c\x73\x0a\x78\x38\x45\x6c\xde\xfa\x4e\xaa\x8f\x13\xc4\xac\xf6\x68\x10\x69\x14\x8e\x4a\xb3\xe0\x5e\xe4\xeb\xec\xd2\xa1\x43\x97\x15\x61\x33\x8c\x09\x41\x56\x9b\x64\x17\xe9\xb3\xb3\xe7\xdd\xa1\x1c\x3c\x22\xcf\xd1\xbb\x79\xe8\x0e\xa2\x1c\xdc\xb5\x12\x9f\x21\x7a\x56\x8c\x58\x12\x3d\xcb\x65\x85\x65\x96\x18\xd5\x7c\xea\x4f\x16\xa0\x50\xae\xfc\xac\x93\x8e\xbb\xf2\x50\xdf\x24\xb4\xf4\x82\x66\xe0\xc3\x21\x51\x5a\x15\x8c\x9f\x8b\xa2\xa7\x4d\x8c\x31\x20\x6e\xf7\x8a\x82\x68\x05\x22\x2c\x91\x18\x6f\xa2\xf4\x1e\xf7\xec\x25\x66\xc7\xcf\x1a\x3c\xc5\x59\x6f\x2a\x10\xe8\x0e\xce\x80\x18\xdf\xde\x2a\xe8\xdd\xde\x2a\xd8\x89\x1d\x30\x90\x40\xd8\xc5\x59\x3c\x42\x24\x64\xaf\x22\xc5\x7c\x75\xbb\xf5\x62\x76\xdb\x99\x28\x4b\xf4\x04\xce\x5d\xe9\x23\x77\x5f\x51\xb4\x93\x69\x42\x62\xfc\xd6\x95\xe8\xf0\xb9\x6c\x50\xa6\x60\x67\xa7\x63\x28\x45\x4a\x0e\x79\xe0\x74\x31\x98\x60\x8c\xa9\xef\x03\x8a\x3f\xa5\x7c\x43\x33\xa2\x19\xa6\x48\xd1\xb2\x73\x90\xd9\x02\x50\xb2\x1e\xb6\xb5\xbe\xa9\x06\x0c\x9e\x45\xb3\xc8\xa8\xe9\xba\xbb\x7c\x55\x56\xd1\x6b\xa1\x31\xbe\xca\x5f\x42\x39\xea\x47\xa8\x30\xd3\x85\xae\xa7\x93\x76\x73\x8a\x1a\x97\xad\x98\xea\x75\xf3\x79\x81\xa6\xb6\x83\xaa\xce\xd0\x53\xb0\xba\x27\xcf\x59\x0f\x82\x06\x61\xad\xbd\x53\xe4\x14\x12\x4d\x1b\x59\x05\x00\xc9\xcf\x3c\x90\x34\x23\x00\xa2\x2e\x45\x20\x15\x35\x30\x9c\x01\x19\x6f\xf9\x16\x68\xf9\x4d\xd7\xd8\x5a\xf7\xa9\x4b\x14\xca\xea\x63\x4d\x0a\x24\xe6\xa8\xac\x19\xfe\x84\xbe\x38\x48\xf6\xe2\x2c\x9b\xd9\x17\xa4\x68\x64\x43\x09\x21\xa9\xa3\xa4\x9e\xdb\x94\x3c\xe0\x89\xa6\xa4\x8a\x9c\x98\x67\x25\xa8\x69\xe6\x49\x3d\x12\x9d\x6c\x7b\xa3\x5f\x1a\x5b\x94\x4a\x6a\xee\x96\x2a\x49\xb3\x23\xed\x5d\xc5\x92\xf2\x1b\x88\x86\x02\x36\x01\x2b\x69\xbb\x67\x24\xc8\x78\x1d\xa5\x6f\x05\x98\xc0\x8a\x2f\x95\x9f\x11\x83\xbe\x6f\x08\xf2\x88\x99\x73\x85\x29\x94\xbc\xbd\xfc\x1c\xb0\x10\x13\x58\xa2\x4c\xf0\x6d\x43\xd7\x5b\x0f\x61\x32\xd7\xfa\xe3\x56\xbf\x82\x49\xe8\x6c\x52\x4d\x26\x45\x68\x26\xc5\x28\xd8\x5d\x76\x43\xef\x43\x0f\x51\x52\xa2\x8e\x78\xda\x0b\x75\xd9\x07\x5b\xd1\xdc\x6c\x51\x6b\x9a\xd5\x42\x06\x07\x72\x6d\x59\x8c\x8e\xcd\xae\x6a\x98\x8a\x58\xc1\x54\x58\x1e\x26\x45\xfc\x35\x4e\x65\x38\xe4\xa5\x85\x2f\x6d\x8f\xd7\xa0\xe4\x9b\xe9\x9c\xfe\x80\x27\xf3\x37\x6f\xa8\x55\x04\xb4\x01\x43\x43\x14\xe3\xa8\x0d\x1c\xb5\x37\x63\x8c\xa3\xb1\xde\xad\x2d\x06\x73\xe0\x11\xb6\xd0\xba\x09\xfb\xed\x7b\x5c\x61\x9c\x95\x5f\xcc\x94\x46\xc8\xb3\x0c\x8b\x07\x51\xe6\x24\xd7\xdc\x8a\xae\x2b\xf7\xfd\xac\x89\xbc\xdf\x47\x15\xb3\x53\x37\x5e\xa7\xa1\xe1\x44\x15\x74\xf3\xd7\x95\xba\x25\x9c\xd4\xd2\xea\x26\xf2\xbf\xb9\x2d\x55\x54\x9d\xa0\x65\x5d\x3d\x8e\x48\x9f\x07\x99\x88\x04\xd9\x10\x26\x06\x8f\x54\xac\x79\x2e\x06\xaa\xf8\x80\xa7\x03\xd3\x03\xef\xef\xe8\x70\x59\x96\x48\x6b\x39\x1a\xba\x7c\x4d\x79\x6a\x04\xeb\x9d\x79\xa6\x67\x9e\x59\x86\xa6\x3d\xf3\x4c\xb1\x4e\xbc\x3b\x8b\xd5\x92\xe4\xcd\x89\xf2\xfd\xba\xf3\xdc\xed\xe6\x8b\x61\xd5\xe7\x77\x29\x89\xee\xcb\x52\x6e\x30\x9e\x7a\x56\xeb\xab\x28\x3c\xab\x4f\x51\xef\xd0\xf7\x69\xd5\x2a\xf1\x7d\xf2\x3d\xa6\x4e\x75\x6a\x77\x92\xa4\xc7\x6e\x4d\x92\xeb\xaf\xf1\x73\xf6\xe2\x70\x4a\x6a\xfd\x08\x14\x19\x6a\x44\xcf\xc0\x2e\x72\xa5\x96\x94\xdb\x8c\x64\xed\xd5\x17\xab\xdc\x00\x11\x2c\x91\x7d\x69\x81\xfb\xdb\x08\x86\x33\x66\x95\xa5\x3d\x70\x95\x78\x56\x77\x47\x95\x9d\x39\xca\x2d\x93\x03\x54\x84\x07\x57\xa4\x56\x68\x56\xdb\x1d\x9d\x15\x0d\xeb\x0a\xf5\xe2\x9c\x39\xaa\x2e\x61\xb4\x52\xc4\x90\x50\x9d\x8f\x40\xb4\x28\xd1\x92\x32\x9a\xad\x1b\x84\xcc\xa2\x15\xd9\x8d\x56\x44\xa3\x15\xa9\x78\xf0\x16\x5a\x11\xcd\x91\xbb\x02\x89\x9c\x73\x97\xa4\x56\x10\x67\xce\xbc\x4a\xca\x66\x24\x16\x88\x6e\x00\x93\x5d\x2c\x91\x5a\x44\xff\xac\x2e\x6a\x1c\x54\xdd\x33\x5b\x37\xdb\xb9\x4b\xa4\x8e\xe6\x85\xe3\x54\xcd\xba\xec\x65\xa5\x39\x70\x0f\x65\xad\x40\x98\xc8\x8d\x34\x31\x94\xc0\x1c\xcb\x7a\xb0\x44\x76\x87\x55\xfa\x36\x17\xd5\x94\xfa\xda\x05\x55\xb5\x17\xbf\x58\xe9\x72\x26\xa5\x20\x54\xcb\xbe\x33\x86\x8c\xac\x3b\x4b\x4b\x54\x29\x69\x1d\x4c\xb1\x53\x6f\x36\x0e\x09\x56\x51\x02\x31\x26\x4f\x5b\x9e\x8a\x0c\xce\xb5\xc6\x71\x65\xf9\xa5\xcf\x39\x13\x74\x43\x30\x31\x0a\x46\x06\x5f\x3a\xfa\xa4\x55\xc2\xef\xa2\xe4\x66\x4d\xb3\xb3\xfa\x71\xdc\x57\xc9\xac\xe2\x18\xbd\x54\x29\xd4\xda\x59\x06\x78\x90\x7a\x50\x8a\xa2\x25\x3a\x3d\x9d\x1e\x7c\xe5\xd8\x52\x4d\x94\xe4\x68\xd5\x10\x0d\x4d\xba\xbd\xcd\xb6\x29\x89\x16\xea\xd4\xb5\x28\xda\x15\xc8\xd9\x2e\x8a\x3d\xb9\xa1\x59\xcb\x01\x2b\xee\x59\x74\x4a\x91\x3e\xcf\xaf\xb8\x39\xfe\x3d\x9d\xf3\xd1\x08\x82\xb4\x28\x86\x80\x4b\x0e\x86\x28\x4e\x24\x55\xa6\x15\xda\x28\xa1\x36\x8a\x50\xbc\x8a\x55\xce\x4e\xa4\x30\x88\xd2\x80\x87\x98\x04\x3c\x74\x38\xe9\x98\xb3\x38\x12\xb2\x8e\xd7\x2a\x80\xb0\x9c\xa7\xae\x69\xc1\xb0\xcb\xb7\x8a\xf1\x96\xa4\x4b\xb9\xd0\x59\x4c\xe6\x0e\x5b\x2a\xe0\x8b\x3a\xeb\x90\x02\x91\xfd\x05\xc2\x11\xa3\x53\xad\xc6\xd2\x99\x48\x94\xe5\xa9\xfb\xa8\x0d\x22\x18\xf0\xfe\xcc\x19\xf1\xac\xa9\x83\x94\x89\x64\xc2\x6d\xa6\x8e\x9f\x6e\xb7\x29\x59\xd2\xa7\xa2\xf0\x6e\x6f\x7f\x73\x92\x6f\x9d\x43\x23\xea\x88\x01\x7c\x24\xb4\x59\x00\x1e\x4a\x09\x44\x04\x14\x78\x4b\x9e\xc6\xe4\x7d\xbe\x4d\x68\x1c\x09\x22\x2b\x7f\xb7\x26\xf1\xbd\x07\xd5\xea\x14\x63\x99\xa2\xa6\x2e\x2a\x8a\x5a\x8a\x1c\xd6\xa2\xbc\xcc\x20\x67\xde\x34\xdd\xdd\x97\x65\x86\xea\x5c\x25\xe1\xd1\x82\x2c\xc6\x9e\x33\x19\xf2\x7b\xa9\x0f\x42\xfa\x2c\x75\xcc\xf9\xbf\x46\xb0\x6d\x94\x2a\xd6\x59\x53\xdb\x5b\x29\x77\x62\x72\xa6\x05\xd0\xa2\xf0\x72\x26\x1f\x16\xde\xcc\xfb\x5e\xf2\x4e\x3f\x18\xaa\x2c\xe5\xc8\x2d\x49\x05\x25\x19\xb6\x07\x50\xe6\xbd\x28\x5e\x4a\x93\x49\x42\xf0\x7d\xc5\x74\x93\xc7\x81\x66\x13\x90\xdb\xb2\x45\x74\xfd\xd6\x2c\x83\x48\x45\x86\xc8\x38\xca\x32\x92\x0a\x39\xb4\x4f\x72\xf5\x92\x85\x3b\x36\x05\x58\x23\xf9\x0d\x31\xbe\x54\x20\x78\xfb\x18\xa5\xc4\x8a\x83\xbd\x40\x1c\x7f\xc9\x06\xeb\x28\x1b\x2c\x88\x20\xb1\x20\x8b\x81\x58\x47\x62\xd0\x2e\x3b\xf8\xbf\xe0\x91\xb2\x05\x7f\x2c\x34\x49\x80\xb6\xa5\xff\xab\x0a\xdf\x11\xc2\x06\xfc\x81\xa4\x8f\x29\x15\x82\xb0\xf1\x5f\xd8\x25\xcf\xc4\x20\xa1\xf7\x24\x79\x1e\xc4\x91\x5c\xe5\x34\xd3\x75\x47\x03\x5b\xe9\x96\x27\xcf\x4b\x9a\x24\x75\x1d\x7a\x26\x07\x6a\xb7\x18\xd8\xee\x81\x4f\x26\x1f\x65\xab\xaa\x6c\xb4\xa5\x56\x0b\xc7\x48\x4c\xb2\x2c\x4a\x9f\x07\x8f\x6b\xc2\x06\xbf\x99\x62\x34\xb3\x88\x31\xb8\x58\x0e\x9e\x79\xae\xed\x5c\x64\xda\x80\x33\x82\x06\x0b\x3e\xc8\xf8\xe0\x8e\x2c\x79\x4a\x54\xb2\xac\xdf\x94\x1e\x43\x49\xcc\xfb\x0f\x43\x09\xd2\x4c\x34\x7a\x59\xb9\x22\x5a\xbd\x7f\x09\x4c\xc6\x71\x9e\xca\xd9\x9c\x8b\xb1\x9e\xd6\x39\x94\x4c\x81\x79\xb6\x68\x5a\x36\xce\x52\xa7\xed\xb3\xd4\x12\xee\xee\x81\xa9\xbf\xdb\x09\x53\xf7\xfb\xb1\x1c\xc9\x3f\xde\xc0\x4d\x94\xdd\xef\x6c\xe4\xdd\xd7\xeb\x97\xcb\x58\xc2\xf6\x56\xc9\x58\xd8\x3d\x3f\x45\xfa\x60\xb2\x52\x5e\x48\xf6\x30\xc6\xc3\x29\x44\x97\xad\x53\x73\xc0\xa1\xb6\x71\x8b\x7d\x3f\x32\x78\x6c\x70\xf8\x6d\x83\x06\x0c\x54\x2b\xb3\x81\x37\xe2\xb5\x48\x30\x14\x81\x67\x48\xdc\x82\x66\xb2\x6b\xb7\xde\x88\x87\x56\xa2\x51\xcb\x60\xe6\x8d\xf8\x9c\x81\x1c\xa2\x4b\x49\xda\xa9\xda\x5e\x2e\x20\x4a\x41\x8e\x72\xb9\x7d\xed\x80\x93\xa3\xcd\xf1\xf4\xe4\xee\x04\x96\xbb\xc8\xff\xee\x79\x71\xdb\x93\x64\xe9\x2b\xad\xc9\x2c\xdf\x32\x47\xf5\x5e\xb5\x22\xa2\x47\x93\xa2\x6a\x5b\x11\x45\x7b\xfe\x48\xc5\xda\xa8\x61\x2b\xfd\x3f\x71\xc9\x61\x20\xc2\xb2\x5d\xa7\x2d\x88\x77\xf3\x7b\x73\x32\x57\x93\xdc\xa8\xab\x8d\x08\xa2\x36\xef\x9b\x13\x4c\x2a\x78\x5a\x4d\x4b\x9e\x24\xcd\xb6\x97\xbc\xa5\x3b\xd4\xa6\x92\xbd\xb4\xf0\x7a\x4b\xe2\x41\x4a\xfe\x9a\xd3\x94\x2c\x86\xce\x76\xd2\x21\xe5\xaa\x5a\x43\xc9\x61\xb3\xc1\x96\x56\xd0\x8a\x18\x3d\xbb\x5c\xb7\x13\xe7\x4f\x5b\x12\x0b\x49\x86\xea\x63\x58\x2e\x24\x3a\x0b\xe8\x28\x1d\x5a\x7d\xa1\x4c\x90\x34\x26\x5b\x61\x3a\x84\x08\x44\xa9\x06\x69\xdb\x6a\xa1\x42\x8f\x74\x9c\xe6\xec\xe7\x3c\x4a\x17\x64\x01\x98\xda\x8e\x50\xc5\x40\x21\xc5\xb0\xb9\x83\x4a\x73\xd6\xb2\x8c\x90\xdc\xec\x7b\xfc\xa2\xc1\x3f\x7b\x8f\x64\x8f\x94\xd0\x55\xce\xeb\x53\xee\x3e\xc8\x99\xa3\x53\xdb\x55\x55\x53\x65\xb0\xf7\x1e\xbf\x37\x34\xb2\xdb\x01\xd3\xdb\x9e\x7e\x54\x14\x44\x6b\x99\x95\x80\x89\x5e\xe9\xdc\xdf\xd1\x41\xcd\x2e\xf3\x5a\xb9\xd0\x2c\xb3\x8e\xd8\x22\x31\x87\x45\xaa\x20\x87\x66\x76\x79\xf9\x4d\x83\x93\x64\xb6\x63\x7b\xa2\xb6\x74\xd9\xce\x50\xcd\x66\x17\x5f\xde\x0e\x44\x94\xdd\x0f\xe2\x88\x0d\x38\x4b\x9e\x07\x77\x64\x90\xe6\x46\x23\x47\xd4\x56\x36\xe0\xcb\x81\xd2\x5b\x53\xce\x86\x03\xf0\xce\x3c\x4a\x94\x32\x75\x17\xc5\x2d\x54\xac\xce\xc8\x9b\x0f\xce\xb5\x6d\x80\xce\xa0\x85\x4a\xf5\x05\x1a\x0d\xc7\x58\xe9\x42\x86\x18\xdf\x17\x85\x96\x3f\x87\x18\x7f\xf2\xfd\xea\xf9\x4b\x7d\x86\x6a\xb2\x9e\xcf\x95\xb1\xf0\xad\x48\x23\x96\x51\x59\xf7\x0d\x07\xe7\xe8\x09\x22\x21\x07\xfe\x8e\xe7\x4c\x8c\x46\x86\x17\x7d\x37\x7f\x87\xc5\xab\x53\xa7\xf5\x02\xf8\x8b\xac\x73\x11\x89\xc8\xf7\x87\xfa\x61\x4c\xb3\x4f\x24\xa5\x7c\x41\xe5\x3e\x22\xc6\xb1\x64\x9e\x93\x9f\x18\xd6\xd8\x01\xbf\x09\x2d\xe5\x34\x38\x33\x6f\xe7\x9d\x7e\xf3\xbc\x53\x3b\xef\xb4\x9e\x77\x07\x6a\xb2\xd7\xf6\xe5\x5a\x75\x53\x0f\xe7\x93\x04\xa7\x1e\x4e\x67\x34\x67\x3d\xf0\x7b\x42\xe7\xea\x34\xc3\x02\xd0\xea\x80\x6f\xf3\xed\x22\x12\x6a\x18\x2a\x1d\x08\xf4\x66\x0a\x51\x4f\x0d\xf7\xe8\x1c\xdd\x43\x28\xd7\x89\xc5\x4a\xf4\x0e\xf3\xb2\x85\x9a\x99\x64\x33\xf3\x84\xb4\xf0\xd3\xc1\x4d\x59\xb5\xc6\x51\x8d\xa4\x3b\x88\xba\x52\x58\xfc\x56\x2b\x51\x0d\x06\x4b\xd4\x95\x3c\x5c\x4a\x6c\x4b\x1a\xa5\x05\x1f\x78\x56\xa2\xaa\xf0\x10\x79\x83\xc7\x35\x8d\xd7\x92\xb5\x5b\x90\x2c\x26\x6c\x11\x31\x91\x49\x1c\x97\xf8\xce\x53\xba\x92\x20\xd7\x88\xef\xc1\xaa\xbc\x6a\xd7\x9c\x27\xa9\x5d\xc3\xac\xc2\x36\x4c\x1e\xd1\xbd\x25\xb3\x41\x38\x6f\x71\xe2\x19\x66\xc8\x24\xe9\x91\x29\x74\xec\xa3\xc7\x2e\xcc\xaa\x3d\xa2\x32\xe8\xb1\xba\xa5\x66\xd3\xd7\x48\x36\xde\x23\x34\x74\x51\x2c\x85\x28\x2d\x2b\x41\xa7\xd5\x47\x65\x3a\xb3\x0b\x15\xa6\x72\xcd\x29\xf4\xc3\xf8\xb1\x0f\xa9\xf4\xd1\x56\xdf\xfc\x5f\xd2\x38\xe5\x3d\x44\xaa\xad\xd4\x68\x8c\x5d\x52\xaa\x04\xdc\x58\x2a\x8a\xcc\x4a\x84\x3b\x9a\x88\x76\x35\xe1\xe8\xd5\x77\x35\xf2\x05\xd5\x79\x77\xd4\x7f\xfe\x60\xd8\xd9\xbf\xa7\xfe\x4f\xbb\xeb\xd7\x84\x66\xf7\x02\xf9\x1b\x88\xb7\xae\x2a\x21\x8b\x7f\x12\x09\x6f\xcf\xf8\x15\x92\x84\x44\x63\x72\x17\xf3\xea\x81\xb5\xb0\x98\xec\xc6\xe2\xab\x6f\xc3\x61\x02\x11\x29\x1b\xc4\xb8\x9f\x70\x75\xa9\xd6\x95\xbb\x6f\x48\xb2\xd7\x9c\x8c\x76\x3d\x2d\x4e\xcc\xf0\x50\xad\x55\x33\x7f\x33\xd5\xbc\x43\x77\xc9\x2b\x5d\x75\xa5\x48\xc2\x93\x79\xfa\x3d\xb3\x6a\xa4\x74\x34\x82\x2c\x48\xc3\x9e\xce\x2b\xb2\x2e\xd9\x28\x44\x4a\x00\xe7\xb1\xa3\xcb\xc0\x54\x5b\x30\xa2\x0c\xbf\xc8\x99\x99\x79\x1e\xe2\xec\x97\x28\x93\xc5\x67\xbb\x57\x97\xe4\x84\x35\x42\x4a\x7e\x04\x71\x76\xed\x60\xe9\x6b\xe5\x9a\xd8\x6c\x0a\x5f\x54\xdb\x5d\xa7\xa8\x3e\x52\xae\x0f\x88\xeb\x8d\xd1\x7e\x94\x15\xbc\xab\x90\xe3\xb5\xb6\x1d\x14\x52\x2d\x97\x68\xd9\xab\x8f\x11\x95\x85\xa4\x42\x06\x61\x21\x99\xe1\x97\x8d\xa5\x3c\xb3\x09\xda\x44\xf5\x33\xb1\xcb\x79\x36\x31\xca\x16\x4d\x9a\x1b\xaa\x95\x4a\xf5\x62\x8e\x33\x6f\x25\xdf\xfe\xe7\x6b\xac\x0c\xb1\x7c\x9f\x8d\x39\xfb\x89\xa7\xf7\x67\x6c\x46\xec\x37\xe8\xe4\x7c\x9f\xac\x84\xce\x6b\x33\x12\x9b\x51\x7e\x72\xb3\xbe\xcb\xd3\x54\xca\x10\xcd\xec\x55\xbf\x6c\x31\x9b\xcd\x16\xad\x78\x77\xdb\xa9\xb1\x9c\x1b\x93\xa6\xbb\xe5\x64\xe9\x94\x6a\x74\xb0\x2e\x47\x1a\xe5\xdc\xae\x56\x89\x9d\xfe\xd6\xa5\x1b\x9d\xee\x14\xa8\x6b\x92\x78\xd1\xe8\xb6\x4c\xb0\x7d\xd6\x1f\x9b\x99\x5b\xbd\x55\xd9\x49\x9d\xbd\xd9\x4f\x99\xd2\xd3\x49\x55\xa8\xd5\x43\x37\xab\xad\xc0\x21\x39\x4e\x1f\x7f\xa9\x53\x75\x47\x1b\xd9\x7a\xca\x36\xba\xec\x96\x26\xad\xd2\x6e\xe7\x9d\xe4\xce\x08\xdc\x3a\x1a\xc3\xe8\x29\x64\xeb\x73\x57\xb0\x33\x18\x97\x00\xe8\xd1\x34\x33\xf6\x15\x6f\x8c\xa7\x51\x01\x69\x57\xe0\x8e\xc8\x4d\xef\x0c\xa9\x51\x4d\x63\x4c\x7d\xc5\x9a\x33\xdc\x1a\x52\x4d\x96\x5c\x3c\x6a\x0e\xa7\x4e\xeb\xc1\xa7\x7a\x28\xcd\x6c\xdd\xc2\x3b\x70\xab\x3b\x88\x6e\x11\x5b\x59\x4d\xdd\x9c\x21\xd4\x84\x51\x0f\xc1\xcd\xd4\x2d\xd8\x18\x82\x53\x94\x34\x8b\xba\x43\xa8\x53\x3b\x43\x70\x2a\x68\x0c\xa1\x5b\xa4\x46\xd5\xcc\xf6\xbf\xb2\x08\xb1\x89\xba\x6f\xbd\xc9\x57\x8f\x8c\xa4\x3d\xdf\xea\x1e\xe5\x49\x62\x9c\x4c\x0d\x9d\x35\x3b\xdc\x1c\xa4\x45\xa1\xf4\xe5\x75\xdb\xd6\x08\xc4\xed\x8e\x5c\x9f\x59\x4f\x7f\xc8\xae\xce\x38\x6a\xf5\x76\x67\x04\x6a\xa3\x69\x51\x80\xde\xa5\x95\xed\x5a\x32\xe4\xb5\x85\x50\xc1\x1a\xa2\x26\x22\x55\xcd\x34\x90\x3d\xeb\x47\x64\xb2\x1b\x45\x5b\x0d\xd4\xd3\x5c\x35\xd0\x40\xc5\xac\x1f\xcd\xc8\x6e\x04\xaa\x1b\x80\xb5\x68\xb1\x53\x89\x26\x39\xa9\x06\xf3\xa6\x77\xce\x33\xf7\xc5\xec\x80\xa0\xb9\x99\xd6\x1b\xb5\x52\x53\xcd\x24\x3b\x1c\xab\x0a\x4b\xd7\xe2\xae\x56\x69\xed\xf4\x11\x6a\xef\x9e\x67\x9d\x14\x77\x4f\x03\x3d\xfb\xe6\xae\x1d\xd1\x88\xfe\x33\xd2\xee\x52\x8f\x7f\x50\x57\x76\xa8\xb6\xbe\xb3\xe6\x6b\x85\x17\xa0\xbd\x23\xf6\xee\x78\x8e\xb8\x31\x23\xe3\x68\xbb\x4d\x9e\x0d\xef\xe6\xf6\xc9\xd9\x33\x7a\xa7\x67\xd8\xb3\x17\x16\x45\x4f\x62\x73\x63\x02\xbd\xdb\xe0\xee\xcd\x0d\x75\x27\x70\x87\xde\xa0\xe6\xc1\x49\x65\x31\xd3\xde\xb5\x5a\x94\x40\x52\x8f\x26\x57\xae\x6d\xf8\xfa\xc9\x00\x44\xc0\xea\x48\x9b\xd5\xb6\x08\x40\x4f\xd3\xce\x18\xfb\x56\xb9\x1a\x24\x2c\x0a\xc0\x30\x81\x95\x2b\x54\x3d\xd2\x9f\x18\x74\x5f\x80\xc9\xa4\x35\xda\x5a\x3b\x76\xd3\x15\x02\x65\x0b\x03\x9a\x0d\x36\x34\xcb\x28\x5b\x0d\xea\x0a\xc6\x1e\x9c\xdf\x81\xfa\xf8\x8f\xf5\xa1\xe3\x37\x48\xe4\x0d\xda\x73\xd6\x4d\x6a\x10\xac\x0e\xb9\xea\x20\x68\x1b\x24\xaa\xc1\x99\x3e\xdd\xbe\x8b\xe2\xfb\x9d\xb8\xda\x2b\x26\x57\xf8\x50\x63\x43\x63\xbf\xb4\x73\xe9\x26\x36\x08\x60\xa7\x90\xd3\xe1\x2e\x9d\x53\x73\x58\x4d\xcb\x90\x54\x4a\xc2\xa6\x52\xca\x4e\x0a\xe3\xc2\x88\xe4\xd1\x5d\x42\x3c\x38\x67\xb8\x2e\xb2\x7b\x6a\x0c\x4e\xb6\x86\x59\x0b\xd9\x0e\x6a\xb7\x12\xea\x6d\xb2\x8b\xde\xfd\x7b\x9b\x5e\x7a\x95\x31\x87\xca\xd3\x90\xb6\x95\x37\x59\xa3\x7b\xdf\x26\x22\xb7\xe4\x30\x94\x62\x16\x88\x10\x71\xf5\x83\xd3\x91\x5a\xbf\xfc\xfb\x49\x17\xa5\x2f\x79\xaa\x95\x78\xd9\x40\xbb\x9a\xa9\x43\x65\xc2\x06\x8f\x24\x25\x15\x82\xab\xe3\xfa\xc9\x10\xa7\xbe\x3f\x19\x62\x6e\xa8\xd2\xda\x1d\xbd\xda\x26\x1c\xf9\x8f\x8d\xab\xe7\x1f\x5c\x59\x90\x8d\xab\xe7\x1f\x5c\xb9\x90\x8d\xab\xe7\x1f\x26\x28\x5e\x47\x6c\x45\x66\xa2\x84\xca\x46\x06\xa2\x64\x87\x65\x80\x91\x72\xb5\xd3\x56\x43\xed\xeb\x30\x3c\x1d\xc5\x6b\x57\x6f\x60\x69\x89\xd2\xb7\x79\x8c\x0b\x4b\x7f\x16\xc6\x82\x40\xa9\x7e\x99\x31\xde\xe5\x79\x1a\x13\x9c\x1a\x33\xdd\x48\x44\x98\xa2\x86\x32\xea\x27\x86\x23\x9d\x52\x69\xb6\x63\x34\xe4\x5d\xf8\xdb\x95\x68\x31\xd8\x46\x21\x81\x73\x53\x5a\x7f\xc6\xdc\x78\x52\x6a\x65\xa6\xfc\x64\xb6\x38\x86\x95\x4e\x9f\xfa\x3e\x1d\xe7\x19\xf9\xf9\xcc\xa5\x36\x3d\x47\x8d\xee\x67\xeb\x31\x91\xb7\x8e\x94\x60\x59\xf6\xe4\xee\xec\xee\x42\x32\x34\x5a\x5f\x86\xde\x8e\x46\x0d\x9d\xbd\x73\x5a\x80\x8c\x4a\xd7\x1c\x9c\x98\xd2\x95\xc2\x7d\x8a\xf1\x5b\xdf\xdf\x00\x88\xde\xbe\x79\xf3\x6d\x67\xb7\xb2\xba\xaf\x9c\xa5\xfe\x43\xe7\xe9\x6e\x5b\x0a\x23\xbe\xd2\x98\xca\xf3\xb7\x9d\xdc\x6a\xb4\xb0\x48\xf6\x99\xfc\x35\x27\x99\xc0\x6d\x5b\xea\xb6\x3e\xed\xb1\xa5\xcd\x6c\x7c\xef\x3d\x91\xaa\xfb\x37\x54\x5a\xb3\x66\x02\xeb\x22\x64\x53\x91\xaf\x61\x30\xf8\xce\xd1\xcf\xd7\x0b\x00\x79\xdf\xcd\x06\xf6\x4c\xa0\xee\xc9\x40\xf0\x46\x01\xe4\x7d\x87\x06\xa4\x3a\x2c\x55\x6d\xbb\x19\x64\x3d\xf5\x1b\x3b\xf3\x06\x3c\x1d\x7c\xe7\x8d\xd8\xc8\xfb\xce\x9b\x79\x1e\xf2\xd0\xe0\x31\xca\x3a\x9d\xd0\xa3\x40\xde\x77\x63\x0f\x9a\xe5\x62\xd6\xaf\x40\x42\x1d\xdf\xf4\x1c\x02\x19\x2d\x61\x13\x8c\xd6\x8b\x01\xef\x98\x60\x7d\xd6\xa3\x15\xe2\xe6\xe4\x44\x9f\xfb\x68\xe2\x7d\xb1\x38\xeb\x26\x55\x95\x02\x38\xfb\x5a\xe4\x1e\xb9\x82\xda\x3d\xfa\xb7\xeb\xab\x8f\xdd\xfe\x68\xd7\xe2\x7a\x6a\xd4\x78\xf5\xbb\x86\x86\x9e\x99\x99\x3b\x4b\xd5\xa1\x5c\x7d\xb2\x82\xec\xea\x9c\x35\xe8\x63\xa9\x35\xa0\x68\x8b\x29\xf0\x32\x22\x6e\xe8\x86\xf0\x5c\x78\x10\xad\x65\x8a\xb1\xe6\xf1\x20\x7a\x90\xaf\x72\x9b\xf0\x20\x5a\xe0\x20\x44\x2b\x3c\x9c\xce\x1d\xff\x63\x7d\x8e\x9e\x17\x85\x08\xd6\xa1\xef\x83\x1c\xcb\x87\xca\x1d\x75\x02\x21\xca\xed\xee\x95\x07\x0f\xe1\x9c\x29\x5e\x2d\x57\xfe\x2b\x52\x6e\x52\x80\xc9\xe5\x76\xa9\x98\x37\x11\x6c\x43\x40\x90\xeb\x84\x76\x07\x04\x7c\x99\x60\x45\x3d\xe4\xcf\xc2\x68\x7a\x7d\xff\x19\x6c\x20\x12\xbe\xbf\x30\xbc\xa7\x53\x68\xa3\x6d\xaf\x86\x2b\x6d\xcf\xb0\xc2\xc3\xc9\x7c\xd1\xf4\x1b\x11\x78\x31\x5f\xb8\xde\x28\x04\x4f\xe6\xa4\xf6\x35\x23\xa3\x51\xed\xf6\x46\x42\x45\xf5\x58\x93\xc2\x31\xa4\xb6\x14\x8d\x69\xd5\x59\xd2\xc5\x98\xb3\x5f\x99\xc6\x8f\x85\x5e\x6d\x29\x2c\xcb\xf2\x42\xef\x94\x72\x13\x7e\x9f\x46\x94\xbd\xe7\x8c\x00\xa8\x40\x5a\x96\xda\x1f\xdb\xe8\x9e\x3f\x5e\x0d\xfe\x7c\xf5\xf1\xdc\x2b\xd1\x7d\x7b\x8f\x7a\xc4\x9e\xd9\x7b\x94\x37\xce\x53\xf5\x2a\x3f\x9e\x63\xcf\x46\x33\x40\x57\xd8\xd3\xb4\x47\xbd\x5d\x63\x2f\x67\xf7\x8c\x3f\x32\x0f\xdd\x60\xaf\xda\xb2\x3d\xf4\x05\x7b\xd5\x46\xed\xa1\x4f\xd8\xab\xb6\x67\x0f\x5d\xe2\x97\x12\x5d\xe0\x17\xad\x25\x9f\x51\x64\xcc\x8f\x24\x8f\xf3\x53\x2a\xbb\xda\x63\xe2\x54\xa2\xf6\xf0\x67\x1f\x51\x77\xe4\xb3\x8f\xa8\x73\x8c\x35\xbb\x43\xd9\x9a\x3f\xfe\xca\xe2\x28\x5f\xad\x85\x2e\xdc\x69\x62\x18\x07\x14\x78\x74\xc5\x78\x4a\xde\x71\x96\x71\xc3\x56\x35\x8a\x79\x30\x2c\x91\xf6\x20\xd1\xe3\x49\x7b\x09\x7b\x60\x73\x5d\x59\x6b\x16\x4a\xb2\xd9\x47\x9d\x76\xa9\xac\x79\x7b\xc6\xf8\xb1\x44\x77\x94\x2d\xaa\xa8\x58\xaf\xd4\x7b\xb3\x26\x7d\x91\xa9\x3e\x9a\xcf\xd5\xf1\xda\x2b\x79\xd4\x00\x2a\xaf\xb9\xfe\x8c\x34\xbb\x38\xbf\x4a\xcf\x17\xab\x9e\xef\xc3\x69\x89\x56\x44\xfc\xac\x6c\x04\x35\x89\x6a\xf4\xd8\x6e\xc5\xef\x1b\xbb\x63\x7f\x3b\x3a\xe7\xcf\x44\x38\xe6\x3f\xef\x49\x16\xa7\x74\x2b\x9a\x73\x65\xf3\xaa\x93\x31\xd2\xfc\xa2\x4c\x71\xaf\x13\x1a\xf7\xf4\xb6\x82\xdc\xbb\x24\xca\x7a\x20\x2b\x7b\xf1\x98\x46\xdb\x3f\x52\xb1\x7e\x57\xa3\x63\x7f\xc6\x25\x4d\x04\x49\x9d\x99\xed\x6d\x2e\x12\x22\x8a\xd7\x57\xea\xa0\xfa\x86\x1b\x2b\xce\xfe\x0a\x6f\x53\xb2\xf8\x06\x30\xe9\x01\x18\x9e\x6e\xc7\x20\x58\x24\xe8\x03\xb9\xee\xac\x81\xe7\xd2\x31\xb5\x50\xf4\x45\x11\x76\xad\x94\x71\xe8\x0d\x7a\xa7\x19\xda\xb7\x78\x52\x53\xe4\x8f\x12\xbe\xc6\x70\xca\x43\xc6\xa4\x18\x69\xcb\x5b\x1c\x97\xa0\x2f\xfe\x9d\xb6\x21\xf5\x7d\x63\x4b\x5a\xf4\xe5\xc9\x48\xb2\xf4\x7d\xf9\xbf\xb0\xc6\xa6\xc6\xf1\xab\x0e\x21\xd1\x8b\x12\xa8\x72\xd4\x6c\xc2\xad\x0e\xcc\xd3\x0a\x3e\x91\x36\x1d\x3b\x11\xef\xb7\xfc\x46\x11\xf6\xa2\xc5\x42\xad\x8d\x0f\x34\x13\x84\x11\x15\x61\xc7\x4b\xc9\x86\x3f\x90\x56\x7a\x8e\x5b\xb6\xcb\x20\x82\x28\xeb\x24\xc6\x10\x2d\xb1\x27\xd2\x9c\x78\x28\xc1\xde\x32\x4a\x32\xe2\xa1\x6d\x27\x9f\xe7\x39\x71\x2c\xd6\x0d\xd5\x9b\xca\x6a\xc8\xa4\xb2\x3a\xd3\x7a\xb4\x2a\xf7\x43\x8f\x8a\xaa\x51\xa6\x73\xf0\xee\x14\x50\xbb\xc4\xa2\xdd\x1d\xb4\xea\x0d\x6b\xa8\xa7\x13\x3d\xe3\xd5\x99\x7e\x9c\x69\xc6\x06\xdd\xe1\x95\xef\x3f\x17\x45\xc7\xc7\xa0\x3b\xc9\x73\x67\x43\x6d\xbb\x41\xb5\x1c\x9f\xd8\x9b\x37\xb0\xcf\xf7\x38\x60\x92\x2f\x90\x3f\x78\xad\x7e\x10\x19\x79\xb7\xde\x88\xc1\xda\x92\xaf\x06\xcf\x6d\x6d\xc3\x3e\x14\x45\x31\x9c\x4a\x36\x6c\x6c\xa3\x17\xf9\xfe\xb0\xdf\xc9\x7c\x45\x84\xe5\xdb\x94\x49\x4b\x46\x84\x06\xd6\x7d\x2f\x68\xfe\xc8\xd3\x7b\x92\x6a\x82\x78\x1d\xf3\x2d\xd1\xa3\x76\x63\x14\x75\xb2\xa0\x47\x3c\x04\x1e\x7b\xf4\x28\x1b\xdc\x41\x87\x4b\x54\x91\x4f\x62\x92\x65\xbe\x5f\xb9\xc2\x9a\x94\xd0\xc3\x18\xbf\x94\x2d\x36\xb0\x2a\x00\xd1\x13\x1e\x3e\xfa\xfe\xf0\x5e\x0e\x6c\xb8\x2a\x8a\xe1\xf3\xf8\x97\x9b\xcb\x0f\xe7\x89\xf2\x6c\x83\xe8\x1c\xff\x67\x34\xf3\x5a\x0b\x57\x72\x8b\xbf\xee\xd8\x48\x60\x51\x14\x77\x5a\x52\xb7\xd6\xa6\x57\x81\x3e\x40\x0f\xe7\xa4\x28\x80\xf3\x8e\x17\xc0\xbb\xfa\x78\xfb\xe9\xf3\xd5\xa7\xf3\xcf\x37\xff\xe1\x8d\x8c\xbf\x96\xb1\xda\x31\x56\x8f\xca\x34\x4d\xed\xc2\x45\x71\x87\x38\x4e\x25\x4f\x65\x10\xe0\xc9\xf7\x53\x8c\xf1\xb3\xef\x7b\x44\x6d\xde\xb5\x6b\x96\x72\x5f\x00\x0c\x73\xdf\xe7\x8e\xdf\xaa\x18\x6f\x48\x96\x45\x2b\x82\xc4\x78\x49\x13\xa2\x98\x5d\x31\x4e\x28\x23\x8c\xab\x00\x09\x89\xfa\x55\xd5\x41\xe8\xfb\x42\xb9\xd1\xa9\xc3\xe7\x65\x94\x27\x02\x40\x45\x5b\x87\x55\xdd\x5a\x43\xd6\x92\x8f\x25\xe8\x58\x5f\x61\xc4\x4a\x27\x2a\xcf\x0d\x30\x0b\xda\xf8\x86\x2a\x45\x9b\x8e\x75\xe0\xfb\xdc\xf7\x05\xe0\x28\x85\xca\xcf\xee\xe5\xd5\x38\x5d\x25\x44\x4a\xc0\x77\x93\xad\x23\xe9\x02\x78\x9c\x79\xa3\x74\xe4\x6d\xf5\x0e\xa5\xad\xff\x86\xed\x60\x66\x20\x82\x45\x31\x64\x41\x14\xc2\x17\x13\x36\x82\x56\x2b\x08\x55\x29\x3a\x82\x8d\x76\xc6\xa0\x72\x01\xa1\x1c\x53\xb9\x70\x94\xdf\xa8\xf6\x04\xde\x93\xf4\xf0\x2a\xc8\xc2\xf9\xb2\x28\x80\x7e\xec\xcc\x76\x06\x21\x52\x05\x77\x58\x28\xcf\x87\xc4\xf7\x19\xc6\xf8\x4e\xd9\x81\xde\x41\x44\x7c\xbf\x6f\x19\x93\x60\x19\xfa\x3e\x19\xf7\x50\x70\x90\xa1\x6b\x88\x72\xdf\xcf\xab\x70\x4c\xca\x9c\x54\x16\xc1\x02\xf5\xc7\x3c\x20\xe3\xf6\x06\x21\xab\x41\xc3\x29\x84\x25\xa2\x4d\x9b\x6a\x2b\x12\xa8\x0e\x2b\x63\xe4\xba\xcf\x42\xf6\x79\x58\x3b\x95\xdb\x43\x34\x82\x45\xb0\x0c\x9b\x16\xd7\x26\xb2\x97\xb6\x9b\x8c\x1d\xb1\x4f\x29\xe6\x6c\x36\x05\x2e\x07\x9b\x39\xec\x1d\x82\x81\xc4\x5b\x21\x52\x7a\x97\x0b\x65\xd4\xd7\x4a\x02\x29\x44\xbc\x65\x67\xad\x90\x91\x42\x24\x51\x00\x0f\x27\x6e\x84\xcd\x2f\x8e\xca\x80\xc0\xa6\x05\x0d\x71\x2d\x68\x6e\xa4\x38\x2f\xd1\x8d\x04\x69\x88\x98\x51\xcf\xea\x61\x39\x22\x13\xd5\xee\xf6\x9e\xea\x36\x35\x58\x33\x41\x7b\x50\xae\x28\x25\x94\xd1\xda\x50\x27\xc2\x93\x79\xf4\x3d\xb7\xcd\x44\xa6\x19\x1e\x44\xa1\xd2\x87\xca\x3c\x9f\x14\x9a\x1b\x93\xc1\x0b\x43\x8e\xdd\xdd\xf6\xb2\x0e\x46\x72\x17\x08\x13\x8c\xe4\xe5\x2e\x58\x00\x01\x43\xcc\x90\x4c\x6c\x4f\x2b\xc1\x1b\x50\x9b\x51\x0b\x38\xcf\x1e\xa9\xb2\x98\xaa\xe2\xcc\xc6\x51\x46\x06\x13\x25\x24\x07\x9f\x42\xe5\x12\xc4\xb4\x73\xed\x5c\x7d\x9a\x36\x3f\x01\x12\x4c\x42\xe8\x66\xd8\xeb\xc9\x80\x48\x30\x6d\xe6\xda\xdf\x95\x0b\x91\x60\xaf\x99\xf5\xe0\xd5\xac\x88\x04\xfb\x55\xfe\x85\x26\x4a\xb3\xae\x2d\x5b\xba\x1a\x24\x34\x13\x03\xc1\xf9\x20\xe1\x6c\x35\xf6\x60\x59\xa2\x77\x40\x02\xa9\x8a\x37\x8c\xb8\x69\xc2\x65\xd1\xf5\xac\xa9\x68\x0a\x1c\x7a\x7f\xba\xfc\xf0\x8b\x10\x5b\xa3\xbd\x52\xd4\xd9\xf7\xbd\x94\x64\x5b\xce\x32\xf2\x63\xc2\xef\x4c\x5c\xe0\x65\x1d\xac\xe2\xa5\x07\xa3\x79\xc0\xc2\x33\xd9\x78\xcd\xcd\x49\xbe\xa0\x5f\x1b\x13\x7c\x0a\x03\x16\x3a\x74\x39\xf8\x14\xba\xaa\xcb\x19\x01\xcd\xaa\x10\x43\x2f\x8d\xf0\x0c\xa4\xb7\x13\xc6\xdd\x57\x57\x8f\xd7\x80\x20\x31\xf2\xc6\x92\x21\x41\xef\x9c\x2f\x88\x40\x38\x73\x32\x12\x25\x44\xed\x50\x0d\xea\x3c\x65\x09\x4b\x90\x3a\xa0\x63\xd0\xab\x7a\xe7\x0d\x55\x80\xe6\x0e\xb5\x56\xfb\x82\x1c\x48\x90\x86\x98\x05\x69\xe8\x06\xc0\xba\x00\x44\x6f\x2c\x75\xe0\x01\x32\xa7\xbe\x3f\xa4\xdd\x6a\xe6\x90\x62\x26\xd7\x9b\xdc\x74\xe4\xb2\x55\xfb\x4d\x15\x6f\x64\x21\x49\x45\xac\x4d\x00\xe8\x12\x50\xdf\x07\x43\x10\x63\x2a\xf7\x89\xa2\xe8\x56\x18\x29\xdf\x4b\x9d\x01\x53\x49\x05\x6e\x65\x21\x01\x28\x4a\x21\x84\xd6\x4f\x87\x83\x18\x45\x6a\xb7\x93\xfd\xef\x42\x27\x6f\x6f\xa9\x12\xff\x54\x75\x71\x75\x52\x13\xd7\x03\x7e\xdf\x8c\xf0\xa8\x7a\xeb\x04\x73\x70\x9c\x31\x17\x91\x88\xea\x78\x21\x51\xba\xca\x02\x32\x8e\xef\x2e\x16\x4f\x8d\x6e\x58\x53\xb9\xfe\xfd\xbd\x44\xa9\xf9\x40\x0c\x73\x82\x74\x5d\x10\x89\x32\xc5\x17\xbb\xe2\xcd\x39\xe1\x5e\x52\xbb\xeb\xeb\x97\x2a\x72\x96\xee\xcb\x0f\x78\xe2\xfb\x3d\x48\x98\x06\x26\x43\x78\xf6\x00\xa8\xd1\xd5\x55\x69\x88\x22\x0e\x67\xc2\x76\x4d\xd9\xe8\x39\x32\xc4\x3b\x73\x76\x15\xc8\xad\xd8\xd0\x4a\xab\xf7\xf4\xa0\x44\x55\xd9\xa3\xb7\x78\x38\x45\x1f\x1b\xfa\xba\xcf\x5a\x2b\xf6\xd6\xee\x43\x1f\xe7\x6f\xf1\x70\xa2\x34\x5b\x7a\xfb\x7b\x1e\xb3\xe8\x81\xae\x54\x6c\xb4\x3c\x23\xe9\xdb\x15\x61\x62\x0e\xde\x68\x36\x9c\xb2\x05\x79\xba\x5a\x02\xef\xf2\xfa\xe2\x7c\xe0\xc1\xa2\x68\x7f\xb8\x49\xe9\x82\x30\xf1\xaf\x7d\xdf\xce\x17\x2b\xf2\xaf\x9e\xc2\xaa\x8f\x78\x38\x71\xcc\x56\xcb\x4a\x28\x36\x92\x4d\xed\x9a\xa6\x25\x59\xd7\xe9\xd1\x89\x40\xd3\x40\x95\xaf\xc9\xa1\x7c\x87\x1c\x4a\x31\x1b\x6b\x49\x0a\x45\x38\x08\x55\x18\x6d\xeb\x31\xfb\xfe\xe2\xfa\xed\x8f\x1f\xce\x6f\xff\xf8\xf9\xed\xa7\x4f\x17\x1f\x7f\xbe\xfd\xf5\xe3\xbb\xb7\xbf\xfe\xfc\xcb\x8d\x64\x7f\x2e\x2f\xae\xcf\x6f\x3f\x9f\xff\xdb\xf9\xbb\x9b\x8b\xab\x8f\x1e\x0c\x25\x03\xe5\x2a\x4f\xb3\x5a\x79\x3a\x67\x1d\x9d\x60\x9b\xe5\x66\xe3\x8e\xea\x0b\xc0\x0a\xdd\xf5\xd6\x2f\xfb\x4f\x39\x9b\x93\xb3\x58\xeb\xbd\x34\x7f\x0b\xbc\xaa\xea\xca\x13\xb3\xca\x3c\xf3\x50\x23\xf8\xaa\x31\x94\xb3\xfc\xf3\x8c\x20\x6f\x3e\xd0\xce\x76\xc8\xb1\xc9\x97\xa9\x4a\x1d\x21\x53\x45\x94\x29\x27\x09\xf9\x5b\x9d\x09\xcc\x07\x7f\x50\x21\x86\x3c\x44\xfa\x5b\xc8\x44\x14\xdf\x1b\xa1\x13\xce\x9a\x3d\x16\x72\x23\x62\x3d\x0a\x51\xdc\xeb\xb9\xd9\xe1\xd3\xa2\x71\xb6\xa6\x4b\x01\x8c\x99\x74\xa5\x96\xb5\xce\x53\x8d\x03\x16\x6d\x14\xad\x7e\xed\x72\x39\x73\xc0\xa9\x4e\x1f\x2b\xed\x6d\xc3\xf3\xbb\x3b\x6d\x40\xc0\x6a\xbd\x70\x2c\xf9\xcf\x79\xdf\x46\xd7\x92\x56\x9c\xfa\xcb\x52\x69\x83\xe7\x51\xa5\x8d\x16\x00\x96\x8a\x48\x2f\x25\xc2\xe4\xb6\x39\x33\x93\x9f\x6d\x37\xb5\x29\x48\xea\x32\x43\x89\x1b\xf8\x49\x4d\xd0\x9a\xb0\x9a\x4e\x6c\xdd\xcf\xa5\xab\xb0\xa8\x92\x2f\x0d\x18\x80\x91\x97\x95\xc2\x5f\x1f\x85\x41\xb4\x90\x2f\x4a\x4e\xf0\x20\x5a\xc9\x97\x2a\xb2\x0a\x7a\x96\xaf\x5a\x49\x65\x3a\xfa\x07\x93\xf1\xae\xf3\xe5\xda\xd4\xb7\xd1\x0a\xab\xdb\x06\x4d\xba\x6f\xa8\x4f\x5c\x06\x42\x82\xf9\x1c\x34\x5c\x7e\x52\xa8\x52\x86\x53\x45\x12\x4b\x1d\x7a\xb4\x83\x1c\x55\x08\xfc\x81\xcb\x0a\x74\xbd\xee\xf4\xb9\xe6\x70\x82\x2a\x5b\x1e\xd9\x3d\x47\xfa\x2b\xcb\x12\x3d\xc9\xe1\x38\x6e\xb7\x37\x69\xd4\xe4\x48\xcf\x55\x58\x4b\x6a\x37\xc4\x47\x1d\x88\x4a\x60\x8c\x29\xec\xbd\x36\xa0\x5e\xa2\xea\x90\x64\xa1\x02\xd8\x0c\xa8\xc8\x48\xb2\x34\x1e\x5d\xc1\x43\x88\x31\xde\xd8\xb8\xa3\x6a\x1b\x94\xe0\x00\x1d\x9d\x0d\x75\x7d\xf5\xeb\x54\x49\x65\x33\xac\x64\x49\x75\xd2\x62\xe0\x77\xe5\xec\xcb\x0e\x20\x0c\x4c\xaf\x60\x09\x81\xdc\xf9\xe8\x12\xa4\x43\x8c\x6f\x7d\x9f\xba\x0b\xfb\x52\x56\xd7\x62\x13\x1e\x60\x4f\xe2\x42\x26\x06\x0f\xe1\x50\x8e\xe1\x1a\x50\x88\x64\x0b\x32\x05\xd1\x60\x11\xd6\x86\x3a\xa6\x95\x9e\x11\x64\x50\x8e\x57\x1f\x8c\x03\x8a\x72\x70\xaf\x82\x8d\x42\xf3\x24\x85\x38\x67\x50\xbb\x47\xa3\xe3\x08\x29\x80\xa6\x66\x91\x89\x40\x07\x0e\x95\xbf\x98\x22\x11\xac\x24\xb0\x57\xbe\xaf\x08\xbf\xba\x72\x42\x66\x17\xc1\x5d\x88\x54\x1e\x11\x3c\x87\x10\xa5\xb8\x0b\x11\x35\xa3\x7a\x96\x92\xda\xbd\xfc\x46\x91\xcb\xc6\xab\x39\x5a\xec\xa6\x8d\x6f\x6f\xad\x1b\x89\xc2\xac\xdb\xdb\x79\xe2\xfb\x1c\x50\xf4\x84\x5e\xda\x51\xbc\x9b\x07\xcf\x4e\x4c\x6f\x73\x95\x45\x52\xc2\x2a\x44\xd5\x16\x4f\xe6\xdb\xef\x97\x15\x95\x91\xa2\xd6\x32\xd8\x8e\x46\x61\xef\x8f\xc2\xbb\x09\xc6\xcb\xea\x74\x2d\xc5\xf8\x16\x6a\xc8\xe9\x20\x5f\x6b\x4c\x8d\x53\x4a\x4b\xce\xb0\x9b\xd6\x00\x50\x36\xd8\x9a\xb8\x06\xb3\x81\x37\xea\xe1\x9c\x34\x99\xb2\xe7\xb0\x78\xf7\x65\x27\x67\xa0\x75\x97\x49\xf7\x22\x93\xa2\xf0\x3c\x38\xf2\x64\x4b\xff\x76\x7d\xf5\x71\xac\xaf\x57\xa1\xcb\x67\x20\xe0\x4c\x9c\x89\xbf\xe5\x68\x16\x96\x80\xc2\x11\x50\x2b\x46\x6d\x5c\x67\xde\x5f\x98\x37\x32\x2f\x33\xcf\x73\xd1\x6d\x8d\xaf\xca\xd8\xf7\xc1\xba\xb9\xa9\x48\xae\x06\xad\xeb\x8d\x05\x53\xb4\x1e\x1b\x78\x60\x81\xd6\xda\x17\xa2\xc2\x01\xb4\x56\x1b\x6a\x13\x6f\x50\xa4\xe5\xe6\x35\x44\xac\xeb\xe7\x05\x24\x49\xaa\x28\xba\x9c\x94\x2b\x49\x9e\xd2\xe6\x1e\xb1\xe8\xd9\x2a\xae\x0d\x9b\xa1\x79\x9b\x87\x50\x93\x57\x63\xf5\x17\x5c\x85\x73\xd6\xbb\x0c\x95\x99\x70\xbd\x91\xbd\x38\x9b\x66\xb0\x08\x91\x19\x9c\xb3\x83\x72\xf8\x52\x2a\x9c\xb9\x6d\x39\xe8\x44\xae\x7a\x41\x52\xc7\x28\x48\x43\x0b\x1d\xdf\x8f\xc6\xd9\x56\x69\x0f\x52\x34\x75\x25\xa0\x1b\x57\x5f\x2e\x07\x61\xc2\xd4\xca\x36\x50\x84\xe9\x59\x1f\x73\x7d\x96\xce\xb6\xb3\xbe\x6d\xf9\x8c\xcf\xd6\xf3\x1e\xff\xb9\x8a\x28\x2b\x6a\xd9\x08\x72\x68\xc1\x94\x2a\xba\x81\x38\x1e\x0e\x99\xef\x4b\xd4\x65\xc1\x2a\x9c\xab\x90\x71\xc1\x73\x88\x53\xc4\x82\xbb\x10\x53\x68\x74\x6a\x8a\x1d\x01\x91\x71\xaf\x43\xdc\xf7\xa3\x21\xc6\x6b\xfd\xb3\x3d\x0b\xc2\x99\x94\xf5\xe6\xe7\x80\xa1\xe1\x44\x0a\x43\x1a\x7e\xb9\xa4\x5f\x4c\xd2\x2f\x15\xe0\x80\xe9\x6d\xf9\x4b\xe3\xda\x1b\xf4\x09\x8b\xf1\xdb\xd5\x2a\x55\x1c\xbf\x5a\x84\xe8\x72\x87\x07\x4f\xc3\x76\x4c\x69\xb6\x00\x73\x29\x98\x80\x3d\xb6\x62\x79\x26\x06\x77\x64\x10\x35\x72\x5a\x08\x49\x6e\x56\x4e\xf0\x06\x31\x49\x1c\x83\x70\x5e\x83\x48\x6e\x7e\xc4\xf7\x09\x48\xc1\xbd\x1a\x18\x84\x48\x3f\xde\xd6\xf4\x9a\x57\x43\xe4\xb5\x01\x92\x78\xc5\x38\xa3\x9a\xc9\x4e\x04\x14\x00\x07\x2f\x83\x40\x9f\xa4\x0d\x62\xbe\x20\xe1\xa0\xf4\x4a\x24\xac\x01\x42\x5f\x7c\xd2\x73\xe5\x3c\x28\xc1\x01\xb4\x12\x71\x38\x51\xe1\x02\x2c\x47\xf8\x4d\x65\x6e\x4d\x91\x88\x3d\x63\x97\xc9\x50\x06\x8c\xbd\xe1\x73\x48\xe7\x0e\x1f\x2b\x85\x59\xc0\x1a\x4e\x4c\xb6\xf4\x09\x04\x21\xf2\xde\x26\x89\x25\xa7\x99\xb6\xd3\xd3\x59\xc8\xc2\x83\xb5\x4b\x2c\x92\xeb\x4b\x4e\x81\x5d\x6f\x26\xae\xd2\x9c\x7f\x4f\xab\xd8\x4a\xa3\x11\x4c\x47\x23\xc4\x8c\xa5\x44\x65\xa0\x41\x03\x1e\x42\x07\xf7\xfe\xa1\x2e\x95\x86\xbe\xa4\xff\x09\x23\x8b\xa4\xf4\x1a\x4b\xec\xb2\xca\x4d\x39\x01\xa0\x69\x15\xe9\x8c\x78\xce\x6b\x17\x40\xae\x5c\x00\x79\xd8\x0a\x92\x4a\xe0\x4b\x54\x14\x20\x92\x1c\x9f\x50\x31\x9f\x1a\xa2\x7d\x6c\xad\x48\xd0\x04\xe3\x37\x6f\x24\x1f\xa0\xb2\x12\xd3\xef\xf8\x2b\xdd\xd6\x31\xe7\x25\x1a\x45\x31\xe9\xea\xc2\x25\x0d\xc3\x15\x16\x39\xe3\x48\xe1\x8b\x72\x86\xc0\x69\x09\x5b\xba\x0e\xd2\xb0\x69\xa1\x3a\xfa\xbb\xa8\xf7\xf8\x08\x4f\x50\x8c\xc5\x3c\xfa\x3e\x76\xb5\xaa\x86\x13\x8d\x83\x28\x9c\x27\x20\x87\x45\x01\xb4\x41\x61\x35\xed\xb9\x64\xa4\x34\x78\x94\xeb\xa0\x8d\x3f\xa1\x50\x3a\x49\x70\x0f\xdf\xac\x3e\xa8\x43\x77\x73\xac\x0d\xb4\x75\x79\x94\x24\xd7\x44\x88\xc4\x8d\x01\x51\x95\x52\xbb\x46\x15\xc6\xb0\xe7\x2a\x10\xed\xd7\x36\x13\xb0\x5b\x3b\x7a\x91\xfd\xb3\xef\xb3\xee\xaa\x7c\x91\x72\x4a\x9e\x49\x42\x9f\x2c\x69\xa2\x2c\x60\xcc\x95\x5e\x65\x89\x94\x9c\xf9\x2d\xa5\xab\x29\x44\x29\x89\x32\x25\x0e\x96\xa5\x1d\x9a\xdb\x25\xdc\x8f\x7c\x6a\x6f\xea\x9d\x59\x02\x5f\x18\x16\x28\xc5\xa4\x84\x88\xe2\x3d\xa4\xe7\x2b\x08\x51\xde\xc0\x8f\x44\x5f\x1f\x27\x70\x3d\x41\x02\xda\x40\x60\x91\x8d\xb0\xd0\x0e\xf8\x1b\xab\x68\x67\x67\x7a\xcb\xaa\xc0\x26\x39\x1f\x8d\xc0\xd4\xf7\x19\x68\x5f\x1e\x40\xce\x80\x2e\x37\x6e\xc0\xa7\xc2\x7a\x53\x08\xce\x94\x88\xee\x12\x06\x90\xc3\x92\x8e\x46\x28\x1a\x8d\x4a\x94\x69\xc7\x9e\x25\x9e\xa0\x2d\x16\xf3\xe5\xf7\x5b\x8b\x7f\xcb\xd1\x08\xe6\x60\x1b\x2c\xeb\x20\x6c\x13\x8c\x01\x7d\x83\xf7\xa0\xae\x1b\xf1\x5d\xb6\x9f\xee\x25\x3d\x86\x58\x3a\xd7\xe3\xec\x30\xcd\xac\x14\x2e\x7f\xaf\x15\x68\x4f\xab\xd9\x96\xc4\x94\x64\x3b\x8d\x41\xbf\xde\x54\x83\xd3\x5c\x13\x27\x4e\x4b\x7d\x61\x0e\xd2\x51\x37\x31\xc6\xc0\x04\x0b\x75\x18\x5c\x58\x14\xd5\x79\x36\x3f\xd3\x8f\x33\x1e\x34\x3b\x18\xce\xc1\x90\xf6\xee\x36\x54\x9f\x36\xb6\x6b\x2d\x0a\xe1\xc6\x9f\xa6\xe0\x0b\x44\xb1\x13\x17\xcb\x55\x69\x4b\x11\x74\xa3\x96\x67\xb0\x08\x35\x6d\x8c\x51\xa4\x3d\x0b\x6e\x34\x3b\x68\xdf\x51\xd4\xf6\x2a\x68\x44\x95\x6a\xdd\xd3\xa1\x30\x59\xdb\x62\xb7\xbc\x11\x8c\x7a\x01\xbb\x5a\x80\xea\x8c\xc2\x80\x2a\x7d\x15\x54\xa9\x05\x55\xda\x03\x2a\xde\x0b\x2a\x2e\x41\xc5\x71\xc5\x59\x4a\xc0\x70\xf0\x05\xce\xa9\x14\x0c\x57\x06\x5c\xdf\x0c\xa3\x08\x51\xc4\x10\xab\x60\x64\xdf\x11\xd5\x16\xee\xf3\xcb\x8a\x39\xa9\x9e\x90\x55\xc3\x60\xfb\x20\x53\xe4\x36\xa2\x7f\xd0\xa5\xa2\xca\xea\xbf\xea\xcf\x7b\x2c\x82\x3c\xc4\x55\x68\xb9\x79\xf5\x84\x2f\x55\x86\x77\x56\xf7\xf8\xa9\x3a\x2b\xae\xf6\x91\xb7\x8d\x98\x86\xf5\xe9\x09\x4e\x01\x41\x56\x61\xa9\x4e\x96\x8d\x01\x06\x73\x0c\x30\x58\xcf\xd9\x34\xc7\x1a\xc9\xe7\x24\xc8\x42\xcc\x5f\x41\xfe\x96\x2f\x83\xbb\xb7\x5f\xb6\x28\xa7\xd1\x9f\x31\xed\x4b\x61\x02\x9e\x1b\x97\xa6\xe0\x9d\x3e\xd8\xac\x22\x79\x57\xa6\x76\xf8\x2d\x7a\xef\xfb\xe0\x2d\x78\x0f\xd1\x05\x10\xc8\x5b\x12\x11\xaf\xbd\x57\x75\xf8\xbd\x6a\x7d\xe7\xda\x11\xab\x85\x67\x55\x84\xf1\x5a\x23\x62\x39\x9d\x74\x6e\xe3\x94\x76\xe3\xec\x0f\x78\xf0\x2e\x2c\x8a\xb7\x80\x43\x94\x96\xa5\x22\xac\x10\x99\xf9\x0a\x9a\x86\x45\xb9\x11\xa5\xcd\x57\xc5\x90\x67\x1e\x0c\x71\x84\x2e\x4b\x88\x7a\xf4\xe3\x3d\x91\xd9\xab\xe9\xb5\x91\x40\x7b\xc4\x5e\xc4\x70\xef\xe9\x01\x4a\x65\x7a\xad\xc4\xe6\xf2\xd5\x58\x54\x36\x6f\xdf\xdc\x71\xe1\xc3\x9a\x66\x95\x1d\x84\x0e\x21\xae\x8e\x9b\x60\x8b\x95\x77\x74\x55\x67\x26\x0a\x27\xfd\xaa\x94\x4e\xab\x88\xce\x18\x57\xf1\xf4\x6d\x9c\xed\x20\x0d\xf5\x55\x5b\xd5\xa1\x90\x0e\x7e\xad\xd8\x52\x53\xc6\xd1\xd7\xc4\xea\xb6\x08\x7d\x5e\xdf\x2c\x11\xbb\x6e\x11\x8e\xe1\xf6\x9c\xaa\x73\x40\xf4\x0a\x54\x4d\x18\x89\x68\xb7\x5a\x63\xbe\xf3\xcb\x2b\x72\x4f\x0d\xac\x4f\x56\x5e\x96\x5d\xea\x91\xce\xce\x2a\xdb\x20\x93\x10\x7a\xb3\xc8\x1d\x84\xb9\xfa\xe9\x03\x1e\x4e\x55\xbc\xdd\x9d\x86\x63\xd0\x4a\x75\x7f\xee\x3f\x38\x51\x37\xc7\x6d\xa3\x2c\xa3\x0f\x3d\x6e\x13\x1f\xd4\xfa\x84\x73\x5d\x57\xd7\x10\xc3\x13\x24\x13\x1e\xfa\x33\xfa\x33\x44\x26\x4f\x9f\xd9\x87\x93\xcd\xb0\x22\xb1\x50\x95\x4f\x95\x58\xfc\x1b\xfa\x09\xfd\x8c\xfe\x88\x7e\x41\x3f\xe2\x97\x3c\x23\x3f\xcb\xcd\x17\xfd\x8a\x5f\x4a\xf4\x57\xf9\xef\x0f\x8a\x98\x7f\x26\xab\xf3\xa7\x2d\xf0\xfe\x8f\x37\xda\x8e\x3c\xf0\x97\xbf\x3c\x8e\x20\x10\x69\x4e\x0a\x65\xe0\x07\xff\xc5\x83\xe8\x4f\x12\xcd\xb7\x29\xdf\x46\x2b\xa5\x8b\xbb\x16\x7c\xbb\x6d\x92\xcd\xff\x70\xa9\x17\x20\x67\x44\xf1\x5a\x70\x94\xa0\xd4\x7d\x5d\x22\x8e\xb7\x23\x86\x28\xde\x8e\xd2\xf9\xaf\x81\x08\x65\x4f\xe4\x6f\x90\x48\xe2\xa8\x9e\x96\x21\xa6\x35\x63\xff\x2f\x4a\xc7\xe1\x18\x10\x69\x83\xa4\xc5\xa2\x28\x22\x94\xeb\xb7\x74\x53\x14\x31\xca\xf4\x4b\x62\xe0\x93\x15\x85\x36\xd7\xb6\x00\xcb\x3c\xb4\xb6\xf9\xdf\x26\x49\x51\x18\x73\xc8\xb7\x49\xe2\x64\x79\xc0\x0b\x40\x21\x5a\x61\x6f\xec\x8d\xe8\xc8\x9b\x79\xe8\xb9\xcf\xa9\x64\x28\xc6\x34\xfb\xac\x2a\x58\xd4\x1b\xb1\xa8\x9c\x95\xe6\x1d\x6d\xb4\x6a\xda\x78\xba\x3d\xa8\x20\xaa\xa0\xce\xde\xc7\x10\x34\x72\x03\xcd\x0f\xf0\x16\x51\xc2\xdc\x9e\xf2\xd8\x20\x70\x88\xa0\x80\x85\x16\x25\x22\xf8\x92\xe2\xa8\x34\x34\x67\xcc\xd5\x75\x01\xd5\xde\x42\x7b\x2e\xe7\x52\x5a\x3e\xce\x62\xe2\xfb\x24\xc8\xc3\xca\xa6\x48\xfb\x5a\x74\x7b\x70\xd6\x4d\x9a\xd5\xe3\x42\x54\xd1\xf5\x1a\x53\xee\xac\x39\x98\xba\x9d\x4a\x32\x5d\xae\x25\x1d\xc5\xea\x5a\x5c\x6b\x0b\x27\x50\x84\x69\xf0\x6b\xa0\xe3\x5d\x87\x01\x3f\x5b\xce\x92\x30\x6c\xdc\x1a\x18\xa8\xd7\xa9\xba\x1f\xc0\x98\xac\x80\x2d\x7e\x06\x51\x30\x09\x91\x3a\x8f\xf7\x7d\x23\xbe\x6e\x8d\x72\xdd\x4a\x27\x39\x8e\x8c\x59\x0e\x44\x19\x9e\xcc\xb3\xef\xf3\x4a\xc3\x0b\x86\x69\x51\x0c\x27\x43\x8c\xd3\xe0\x4f\x21\x9c\x67\x56\x76\xdc\xce\x55\xf5\x79\x90\x75\xab\x2f\x4d\x4f\xac\xc4\x69\xd4\x47\x71\x30\x09\x8d\x96\xb8\xbd\x0f\x31\x1c\x07\x22\x9c\x93\xf1\x0e\x8b\xe7\xee\x61\x1d\x2b\x61\xa9\xd4\x87\xba\xc7\x95\x70\x2b\x3b\xb8\x06\x99\x3d\xfa\xd9\xf4\x61\xd4\x9d\x8d\x14\x37\x9c\xc2\x12\xdd\xbe\x9e\x65\x02\x4b\xf7\x24\x4a\x9d\xe6\x2b\x15\x0e\xb4\xa6\xf3\x66\x5f\x1f\x4e\xe6\xa9\x63\xf3\xa9\x4e\xc7\x7f\x56\x7c\xa3\x7e\xb4\x5c\x75\xea\xfb\xe9\xf8\x61\xad\x4e\x91\x5b\x25\xe2\xf5\xfd\xfb\x7c\xab\x6c\x2a\xec\x8b\x2e\xf5\xac\x0e\xac\x1a\x79\x53\xb9\x72\x9e\xd5\x43\x6d\x3f\x75\x87\xc9\xfc\xce\xf7\x87\x77\xed\xe3\x16\x0a\xe7\xf0\x0e\x33\x70\xa7\xd9\xb6\x3b\x89\xd5\x34\xf4\x7d\x70\xa7\xee\xad\xb8\x2b\x8a\xbb\xe0\x21\x6c\x0e\xe9\x1e\x3d\xe9\xce\x2a\xcc\xfc\x18\x6d\xc8\x8d\xe5\x0c\xce\x25\xc1\xba\xc2\xb2\x0c\xbe\x0b\x68\x88\xae\xf1\x5d\xb0\x00\x39\x94\xaf\x79\x88\x6e\xd4\x6b\xa6\x5e\xb3\x10\x7d\x51\xaf\x6b\xf5\xba\x0e\x6b\x70\x7e\x6a\xf8\xbc\x7f\xe8\x59\x86\xc2\xf7\xc5\xd9\x70\x28\x57\xd2\x56\xe4\x29\x99\x7d\xf0\x7d\x72\xe6\xdd\x71\x9e\x90\xc8\xe5\x29\xce\x5e\x6c\x0e\x81\xcc\x96\xa3\x6e\xf2\x16\x67\x7d\x75\x1a\xa3\x61\x93\xd1\xde\x3c\x24\xdf\x56\x0c\x34\xdf\x5e\x4a\x24\x20\x7a\x71\xea\x84\x33\x31\x7b\x69\xb4\x51\x2a\x30\x6d\x53\xb2\x25\x6c\xe1\xfb\xe0\x5e\x8d\xb7\x4a\x51\xe3\xae\xde\x42\x3d\xa5\x97\x98\x9f\xb5\xce\xf7\x87\xe7\x63\x9a\x9d\x3f\xd1\x4c\x50\xb6\xb2\x1c\xc7\x95\x26\x3d\xe7\xd6\xf8\xe4\xbc\x9e\x0e\x74\x6e\xc1\x72\x76\x3b\xdb\xa0\x73\x4b\xd7\x60\xd9\xa3\xcc\x78\xb5\x22\x4b\x37\xdd\x3a\xd0\x45\x4f\x0f\x3b\xe4\x9e\xe0\x5f\x03\x51\xd7\x14\x22\x1b\xb7\x71\x4e\x7c\x1f\x30\x4c\x82\x6a\xee\x14\xd5\x82\x75\x70\x11\x6b\xec\x6b\xf8\xbf\x14\x36\x75\x75\xa9\xab\xab\x93\xdf\x03\x1e\xea\x7b\x01\x52\x7b\x10\xc0\x75\x64\xbc\xaa\x4b\x78\x38\x41\x4a\xc4\xab\xe9\x97\x52\xd1\x38\x9f\x9d\x46\x4d\x90\x30\x7b\x41\xc6\xb2\x91\xd7\x82\xff\xda\x70\x46\x16\x6a\xa2\x01\x35\x17\xfc\xe2\x75\xf0\xbf\x5e\x91\x01\xbf\x53\x07\x7a\xaf\x17\xdf\x82\x2e\x97\x67\xfa\x67\xd6\x2b\x24\x19\xdd\xf1\xbc\xcb\x10\x6a\x20\x57\x7b\xab\xba\x2f\xbd\x5e\x0d\xfa\x6b\x67\x27\xc5\x98\x94\xe8\xad\x72\x20\x08\x16\xc0\xfb\xf5\xe3\xa7\xb7\x37\xef\x7e\x39\x7f\x7f\x7b\xfe\x87\xf3\x8f\x37\xd7\x1e\x0c\xd1\x47\xac\xec\x8a\x3e\xbd\xbd\xbe\xbe\xf8\xc3\xb9\xf3\xe1\x73\xf3\x92\x2b\x8a\x72\x94\xa1\x6d\x05\x82\x4a\x04\xcf\xd4\xd1\xf3\x70\x0a\x51\x95\x24\xa9\xde\x56\x25\xb5\xce\xea\xd7\xd6\x34\x1c\x3d\xd4\x37\x05\xc8\x9d\x44\x41\x47\xb9\x9a\x2e\x49\x7a\x6e\x61\xe9\xfb\xe0\x01\xf7\xa4\x83\x07\xa3\x2e\x5b\x38\xb5\x4c\x15\xe2\x0d\x17\x35\x77\xdf\x6b\x02\x26\x33\x3d\xfa\x7e\x25\x79\x55\x17\x0e\x79\xea\x2a\xe0\xaf\x14\x96\x8d\xae\x2c\x2f\xdd\xd5\x2d\xe8\x0b\x27\x87\x0b\x97\xcb\xf9\x5a\x95\x2b\xc9\x3a\xcb\x52\x51\x51\x44\x80\xa0\x05\x5a\xbb\x36\x09\x2f\x7a\xcb\xf8\xe0\xfb\xc3\xe1\x47\xdf\x57\x56\x56\x1f\x2b\x2b\xab\x07\x88\xee\xf0\xa7\xda\xda\x35\xd8\x0b\xd1\xb3\x1a\xe3\xdb\x6a\x05\x6e\xf0\x64\xbe\xf9\xfe\xad\x5d\x81\x1b\xbd\x02\x1f\x30\xc6\x6f\x83\x4d\x75\x2a\xf1\x6c\xc5\xb2\x35\x7a\x40\x0b\x74\x57\x47\x3c\xe9\x83\xc1\x2d\x1e\xca\x7d\x07\x74\x89\xb7\xdc\x7d\xec\x52\x82\xe8\x1e\x0f\x81\xdc\x90\x2c\xa6\x56\x90\xba\x83\xbe\x7f\xa7\x78\x32\x74\x85\x5d\x87\x18\x74\x8d\x7f\x0d\x1e\xc2\xf9\x75\x51\x80\xff\x00\x0f\xe8\x09\x9a\x14\xdd\xf0\x0d\xbe\x0e\x6e\x15\xf1\x41\x5f\xf0\x3a\xb8\x09\xd1\xa5\x99\x8e\x2f\x0a\xf6\x97\x58\x9d\xae\xc9\xb1\xeb\x71\x7f\x69\x8d\xfb\x3d\xf8\x12\x6c\x42\x54\x5d\xe7\xa9\xfd\x50\x75\x5d\x92\xf1\x92\x8d\x5c\xa0\x77\x78\xdd\x39\x7e\x46\x9f\xf1\x5f\x83\x77\xe1\xfc\xb3\xef\x83\x0b\xfc\x59\x76\x09\x5d\x14\x05\xb8\xc0\xef\x46\x6c\x04\x9e\xce\x9e\xc0\x03\x9c\x3d\x40\x58\x13\x5e\x7c\x87\xee\x7d\x1f\x54\xef\x6a\xc0\x6a\x61\x58\xca\x8d\xd7\x35\xe1\xc7\xb7\x2e\x1d\xc7\x0f\xc8\xdd\x42\x8c\xa2\xe7\xcf\x98\x9f\xfd\x68\x8c\xac\xe6\x7f\xf6\x7d\xf0\x67\x75\xa8\xfc\x3e\x12\x11\x3e\xd7\x20\xfa\x0d\x5f\x75\xc3\x6d\x82\x0b\xb4\x40\x7f\x96\xab\x58\x61\x47\xd5\xbc\xd2\xcb\xb5\xea\xd1\x47\x5e\xb2\xe3\x77\xa6\xc3\x13\x88\xd4\x8e\xde\x99\xed\xdf\xec\xc8\x8a\x02\xfc\x56\x8f\x1a\xa2\xdf\xea\xf1\xfd\xe6\x8c\xef\xb7\xc6\xf8\x56\xbe\x2f\x4b\xb5\xa9\xd6\x02\xa2\xed\xd9\x97\x71\xce\xb4\xcd\xd7\x6f\x70\xf6\x45\x73\xa3\xbf\x41\x94\x59\x7c\x5d\x97\x65\x75\x4f\x91\xe4\x5a\xf0\x67\x70\x85\x56\xe8\x12\x5d\xa0\x67\xdb\x79\xb3\x49\x5b\x51\x08\x7f\x06\xf7\xc8\x6b\xa7\xce\x7a\xb5\x45\xf7\x7f\xf3\x06\x8b\x9e\xf5\xf9\xa7\xe4\x99\xba\x16\xe9\x96\xee\xb1\x6f\xa4\x7b\xac\x97\xee\xb1\xfa\x98\xc0\x5d\xf1\x14\x0f\x87\xbc\x77\x35\xf2\xa2\xe0\xf5\x6a\x8c\xbb\xe4\x32\xae\xf7\xc6\x9d\xe4\x52\x53\xa6\x6b\x14\x23\xd2\xa1\x4c\x39\xca\xf0\xaf\x72\xd3\xcf\x94\x37\x78\x16\x50\x87\x33\x58\xe3\x5c\x4b\x5c\xb2\x96\xfa\x2a\x98\x07\x3c\x99\x3f\x7c\xbf\xb6\x0b\xf3\xc1\x8a\x21\x0b\xbc\x96\x2b\x5f\x2d\xd2\x05\x8a\xab\x20\xf3\x6b\xcb\x22\x3c\x48\x16\x61\xd1\x65\x11\xd6\x35\x8b\xb0\x68\xb1\x08\xb2\x75\x73\x3b\xb0\x36\x17\x71\x6c\x1d\xa0\xef\x03\x12\x6c\x47\x4d\xff\x16\xcb\x4b\xa0\x85\xb6\x32\x74\xa2\x67\x2e\x20\x7a\x3e\x23\x66\xf5\x95\xaf\x03\xae\x2c\x91\x64\x97\xff\x99\x98\x50\xb3\x58\x81\xc4\x81\x7f\x07\x04\x49\x22\xc4\xe0\x8c\x41\xa4\xbd\x2f\x68\xe7\x9c\x50\x5b\x78\xcf\x8d\xbb\x46\xdc\x95\x7d\xbb\x49\xb3\xb8\xe2\x3b\x9c\xeb\x98\x90\x64\xff\xbf\x79\x78\xda\x6f\xe3\xef\x46\xf7\x5f\xed\x6d\x6a\x56\xa6\x26\x01\x0f\x92\x30\x44\x91\x7a\x5a\x86\x46\xeb\x68\x41\x12\x57\xde\x29\x56\x0c\x6e\x08\x95\x4a\x53\x69\x15\x01\x6a\xe2\x18\x02\x5b\x1c\x07\x59\x08\xbb\x10\xd9\x76\x21\xb2\xad\xb5\x01\xdb\x8a\x08\x68\x19\x5e\x76\x21\xee\x48\xe1\x8d\xe6\x8d\xd0\xfd\xcf\xe9\x45\x59\x96\x95\xf3\xce\x83\xd5\xe5\xdd\x93\xe7\x0c\x10\xe8\x08\xd9\x0f\x9d\x0e\x2d\xf0\x1f\xc6\xe4\x89\xc4\xe0\x41\x76\x00\xad\xf0\xc2\xf7\x17\x92\x4e\xac\x94\xf3\x87\x5c\x52\x95\x87\xed\x50\x19\xd0\xa9\x01\xac\xdd\x01\xac\x60\xd9\x4d\x6c\x17\x56\x3a\x85\x67\xf7\xc6\x32\xed\xa4\x42\x43\x74\x05\xd5\x53\x1e\xa2\x6b\x88\xbe\xf8\xbe\x7c\x59\x87\xe8\x0b\x44\x37\xfa\x25\x0b\xd1\x0d\x44\xc3\x49\x75\x26\xfe\x24\x91\xff\x1c\x4f\xe6\xe7\xb5\x90\x71\x3e\x1a\xc1\xa7\xe0\x3c\xc4\xf7\x20\x0d\xce\x43\xc4\xab\xb3\xc9\xa7\x5a\x0b\xf7\xef\xd5\xb5\x10\xc3\x8a\xff\x76\x5c\x9d\xcc\xcd\xa2\xe6\xc0\xc3\x40\x26\x85\x48\x6b\xeb\x0c\xf9\x54\x5e\x15\xa4\x28\xa8\xba\x93\xbc\xab\x9a\xae\xd1\x71\x32\x8f\x6b\x93\xa8\x78\x34\x82\xc6\x34\x23\x0a\xe2\xb0\xd6\x3f\xb3\x52\xeb\x70\x7e\x0d\x48\x38\xcf\x15\x07\x44\x20\xd2\xef\x7a\x29\x64\x58\x04\xb9\xc2\xfc\xad\x7a\x92\x98\x6f\x0a\x67\x67\xdb\xb3\xcc\x46\x52\xd9\xc2\x59\x66\x51\x70\xb6\x3d\xdb\x56\xcf\x41\x58\x83\xe0\xdf\x9a\xf1\x98\xd5\xc2\x9b\x2b\x13\xb0\x4a\x5d\xad\xee\x54\xaa\x83\x23\x00\xd6\x8c\xa1\xc3\xb7\x17\x9b\x0d\x59\xd0\x48\x28\x45\xb1\xd1\xa6\xbe\x7e\xfe\xa2\xd4\x8d\x24\xf8\x53\xa8\x44\x38\x29\xb7\xd4\x27\x2e\x0d\xbf\x87\xff\xed\xda\x82\xe9\x65\xdf\xf6\xcc\x36\x6e\x97\x24\xa0\xa1\x85\xbe\x7c\xc6\x44\x4e\x01\x69\xb8\xa8\x50\x14\xa3\xda\xe2\x25\x56\x2a\xae\x7a\x94\xbc\xba\x59\xd5\xb5\x6a\xd0\x93\x5f\xc7\xce\x61\xc8\x1b\xd7\xd1\x6a\x52\xe4\xcd\x66\x1e\x1c\x11\x44\xb1\x53\x99\x52\x5e\x4a\xe4\x68\xeb\x6d\x1c\x0c\x19\xbf\x1e\x58\x01\x50\x44\xe0\x3c\xf2\xfd\x48\xfb\x6d\x9e\x81\xc8\x5e\x79\x3d\xee\x09\x86\x60\xbf\x22\xae\x82\x75\xb7\x63\x16\x00\xa7\x73\x72\x0b\x87\x70\x46\x03\xa2\xfc\x85\x02\x12\xee\xa8\x52\x7e\x52\x61\xd6\xb5\xed\xee\xb7\xe7\xaf\x4c\x08\xca\x12\xa2\xc8\xea\x5a\x35\xf4\x95\x95\x45\x5f\xf4\x05\xa0\xfc\x0e\x23\xd7\x12\x50\x08\x57\x35\xcd\x8a\x62\xa2\x2e\xb6\x35\x5a\xc8\xca\x01\xd3\x68\x20\xc6\x3a\xf4\x03\xe8\xb1\x64\xb1\xae\x3e\x18\x63\x51\x6a\x7c\x49\x75\x6d\x69\x6f\x6d\x1c\xa7\xc1\x24\x1c\xeb\x80\x23\x75\x2c\x89\xda\xf9\xa8\xdd\x54\x85\xe3\x6f\xa6\xea\x4e\x7e\x2b\x9c\x29\x8b\x8a\x6a\x3c\x44\xd4\xa1\x01\x85\xef\x7f\x01\x02\x55\x43\x54\xb7\xaf\xd8\x8c\x4a\x31\xde\xba\x5d\xbb\xe9\xe6\x22\x37\xc7\x0c\x08\xb8\xbb\x27\x03\x75\xc5\x40\x2a\x32\x75\x4f\x90\xc7\x99\xba\x5d\xd4\x0c\xf7\x87\xbd\x12\x8e\x37\xd1\x76\x47\xb9\xfc\x4e\x73\x4a\x60\xaf\xd1\xff\x54\xb4\x7c\xb5\x1a\x27\xc3\xd5\x95\xa1\x26\x17\xa6\xbd\x63\xe3\xa2\x19\xb8\xd4\xf7\x45\xf0\x4b\xa8\xff\x07\xc4\x21\x4d\x55\xf1\x16\x20\x68\xf6\x53\xca\x7f\x23\x0c\x30\x15\x05\xb2\xd1\x07\x25\xa7\x34\x93\x8a\x02\x0c\x75\x0b\xc3\x76\x05\x02\xfa\xfe\x4f\x40\xa0\x5f\xd0\x4b\xd7\xb2\x5a\x21\xaf\x2e\x08\x4c\xdf\xb0\xe2\xee\x1d\x77\x8b\xc8\x9d\xd0\x3a\x44\xda\x4f\x4d\x17\x86\xc8\xe0\x6f\xf3\x1c\x5d\xeb\xbd\xa3\xb9\x63\xc8\x60\x3c\xb5\x9b\x19\x67\xad\x11\xa6\xf3\xdd\x2d\x55\x7e\xc8\x5a\x1e\x06\x9e\x8e\xa8\xb1\xb0\x46\x3f\x9e\x51\x1a\xe9\x05\xd8\x4d\x5f\x90\xfe\xf4\xc8\x3a\x1f\xbf\x53\xc1\xfb\x9a\xdf\xb5\x31\x85\x12\x10\x6d\x14\xbc\xd8\x1a\x56\x58\x2f\x06\x8a\x5b\xe6\xda\xcc\xa1\x12\x14\x33\xc7\x6e\xbb\xb4\x6e\x43\x09\x5f\x01\xef\xad\xbe\xd1\x93\xb2\xd5\x40\xf0\x81\x05\x04\x19\x7c\xe7\xb9\x31\xc6\xb4\x3f\xc5\xa2\x22\x9e\x6e\x40\x31\x2a\xbf\x4b\xbc\xd3\x87\xa4\xad\xf0\x65\x83\x88\x2d\x06\x2b\x2e\x06\xca\x38\x0a\x0d\x56\xf4\x41\xb6\x95\x6f\x67\xce\xc5\x25\xb1\xf2\x0b\xe9\x39\x89\xcf\x05\x4d\x9c\x9d\x4e\xa9\xc8\x2a\x0f\x0e\x01\x18\x9c\xe7\xe3\x4e\xac\x21\xfc\x05\xe5\xee\x86\x8a\x2f\x50\x3e\x6e\x04\x17\xc2\x9b\x2a\x47\x75\x17\xc7\xfb\xb9\x71\xd6\x69\x18\x0f\xfc\xf8\xe1\xed\xbb\x7f\xbf\xfd\x70\x71\x7d\xe3\x68\xf4\xd0\xa2\x95\xab\xab\xf4\x9b\xb3\x60\x11\x2a\x3b\xe6\x87\x10\xcb\x67\x88\xe4\xa3\xa2\xef\x0f\x21\xa6\xc1\x42\x26\x3f\x84\xd0\x76\xa4\x19\x91\x08\xff\x5b\x23\x5d\x87\x5a\xc2\xff\x82\xf2\x71\x1d\x95\x08\x7f\x46\xf9\xb8\x2f\xcc\x10\x26\xd5\x87\x5d\x9b\x1f\x16\x55\x16\x1d\x4c\x08\xa7\x28\x1f\xd7\x31\x84\x30\xb7\xed\xab\x90\x41\xf8\x12\xe5\x7d\x3b\x12\x5e\xa3\x7c\xdc\x0e\x08\x84\x85\xac\xbc\x77\x0b\xc2\xef\x50\xde\xdd\x3b\x77\x78\x11\xda\x0e\xd8\x90\x3f\xf8\x7f\xa3\x7c\xdc\x0e\xba\xd4\x13\xe6\x4d\x87\x59\xb9\x56\x2e\x75\xd9\xec\xaf\x2a\xd4\x8f\x36\x5c\xaa\xa4\x9e\x6c\xf6\x2b\x22\xf5\x4b\x86\x68\xf6\x63\xca\x1f\x33\x92\xce\x9e\x10\xcd\x2e\xe9\xd3\xec\x1c\xd1\xec\x23\x5f\x90\xd9\x23\xba\xf9\xfc\xeb\xf9\xed\xf5\xcd\xe7\xd9\x12\xfd\xf4\xf6\xc3\xb5\x7e\x4e\xd0\x9f\xaf\x3e\x9e\xdf\x5e\xff\xc7\xe5\x8f\x57\x1f\x6e\x3f\x7d\x3e\xff\xe9\xe2\x4f\xb3\x2d\x7a\xfb\xde\xe0\x80\xc6\x99\x8f\xe7\x9f\x55\xee\x08\x7d\x3e\xbf\xbc\xb2\xba\xdf\xe6\xb7\xb8\xb4\x16\x04\xb1\x40\xb9\xc0\x14\x34\xff\x82\x10\x05\x5e\x74\xc7\x53\xe1\x21\x2f\x62\x74\xa3\xf8\x3f\x2d\x32\xbb\x29\x84\x2d\xdc\x57\x6d\x13\xad\x38\x45\x2f\xca\x9f\xe2\x84\xc6\xf7\x1e\xf2\xf4\x2d\x90\x94\x6d\x73\x59\xdd\x5d\x92\xa7\x1e\xf2\xaa\xca\xe2\x88\x6d\x93\xe8\xb9\x7e\x92\xe4\x26\x5f\xad\x65\x82\xa2\x4c\xf2\x81\x6f\xb6\x5c\x87\x2b\x54\xfb\x5f\x33\x49\xc7\x5c\x6d\xa6\xe9\x9e\xc5\x39\xa9\xeb\x30\xbd\x89\x13\x9e\xe9\xcc\x4c\x90\x27\xb1\x21\x2c\x57\x39\xd3\x3a\xeb\xe2\x2e\xb1\xb9\x17\x69\xb4\x32\x3f\xba\x4a\xfd\x24\x48\x6a\x9f\x9f\xa8\x30\x8f\x09\x89\x1e\x88\x79\xe6\x0f\x26\x07\xdf\xca\x9f\x5c\xc3\xa5\x6a\x41\xd1\x3f\x22\xeb\x23\x6c\xa1\x7f\x95\x71\x0e\xf2\x96\x3c\xce\x33\xfb\x4b\x99\x7d\xe2\x0a\x76\x2b\x2e\xb6\x5c\x07\xd5\xd6\xca\x1f\x0f\x79\x16\xae\x94\x3d\x44\x09\x95\x55\xdd\x93\xe7\x85\x0a\x11\x27\x9f\xb6\x29\xc9\x32\xfd\x98\xcb\xae\x48\x52\x67\x7e\x2c\x28\xf5\xf5\x8e\x8b\x48\x44\xd5\xcb\x86\x88\xa8\x4a\xc8\xba\x8d\x6e\x78\x9e\x11\xd3\x88\x7a\xb6\x20\x51\x2f\x16\x10\xea\x45\xca\x88\xf6\x59\x8f\x42\x3f\x3e\xd4\xf9\x55\xc7\xd4\xd3\xe3\x9a\x28\xa4\xe0\x29\x25\x4c\x34\x61\xb6\x8d\x72\x35\x71\x06\x5b\xe4\x8f\x32\x98\xf2\xaa\xde\x19\x8c\x32\xef\xa6\x7b\xe6\xcd\x76\xd0\xbc\xda\x2e\xda\x57\x1e\xdf\x57\x0d\x6d\xf8\x6f\x7d\xc9\x8f\xe4\xee\x9e\x0a\xe7\x0b\x49\xeb\xbe\xb9\xa9\x7a\x22\x9b\xb5\xd8\xd4\x9e\x4a\xf4\x07\x93\x64\xa0\xa5\xde\x34\xb4\xcc\x07\x03\x2f\xf3\xa6\x20\xb6\x4d\xf9\xca\xcc\x6e\x1a\x89\x1a\x7d\x53\x92\x11\xa1\x7f\xe9\x6f\x32\x21\x8b\x53\x9e\x48\xc8\x64\x84\xdc\x2b\x6c\x93\x0f\x1a\x78\x72\xb6\x62\x51\x3d\xb8\x00\xd7\x29\x16\x4b\xb2\x35\x7f\x94\x3f\x9a\x28\x64\x22\xd2\xa6\xda\x5e\x96\xdf\x6d\xd4\x12\xc8\xf2\x6c\xab\xd7\x88\xa0\x1b\x52\x2d\xca\x07\x9e\xe4\x9b\xba\x73\x82\xe7\xf1\xba\x9a\x2a\xf5\x66\xc6\xac\x9e\x6d\x6b\xea\xc5\xd4\x56\x85\x2a\xad\x8b\x55\x49\x3a\xcb\x63\x44\x85\x1e\x8e\x46\xa0\x10\x49\xd6\x25\x90\xd0\x5e\x25\x66\xa1\xa7\x24\x13\x3c\x55\x5d\x76\x93\x25\x7a\xb7\x92\xac\x27\x9f\x9e\x1a\x5b\x57\x94\x0b\x6e\x6f\x60\x57\xf4\xad\x7e\x6d\x66\x14\x7c\xb5\x4a\x48\x5d\x6e\x29\x48\xaa\x37\x41\x13\xb2\xb9\x22\x89\xed\xd4\xf7\x57\x97\xef\x64\x17\x98\xf8\xa0\x56\xa1\x5c\xfc\x29\x21\x6a\x0e\x97\x79\x92\x64\x71\x4a\x08\x73\xf1\xb4\x27\x55\x63\x58\x5f\xf6\xac\x27\xb1\x4e\x72\xf0\xb6\x9b\xd8\xae\xb4\xca\x9c\x75\xd3\xd4\x9d\xb1\xca\xf9\xb8\x6a\xe5\x81\x66\xf4\x8e\x26\x54\x3c\xbb\x48\x9a\x6f\x1c\x28\xdd\x65\x3c\xc9\x05\x59\x90\x07\x1a\x13\x67\xf9\x4b\x50\x4b\x08\x5a\x32\xa7\x5e\xb6\x29\x65\xea\x65\xbb\x55\xc6\x73\x06\x15\xed\x46\xa3\x52\xb6\x29\xdf\x6c\x45\x95\x6a\x8b\xe8\xb7\x9c\x19\x3a\xa8\xdb\x4b\xe8\x6a\x2d\xaa\xb7\x0d\x37\x0d\xf7\x75\xa6\x93\x66\x7b\x5e\x7d\xdb\xa6\xfc\x89\x6e\xa8\x90\x44\x6a\x1d\x65\xeb\x6a\xc8\x49\xc4\x56\x79\xb4\xaa\xc1\x62\x9c\xf7\x35\xd0\x4d\x37\x23\xdd\x4d\xbe\x5c\x26\x54\x05\xff\xe3\xcc\x3c\xd8\x4f\xdb\x68\x45\xcc\x62\x94\x8f\x6b\xba\xd0\x14\x63\x6b\x62\x1f\xd7\x7e\x84\xc6\x05\x5d\x2d\x57\x9e\xea\x96\x2a\xc7\xf4\x2a\x97\x4a\x34\xe0\xc8\x33\x09\xdc\xba\xff\x0f\xe9\x82\x66\x92\xd2\xc6\x9c\x31\xe3\x5f\x51\x27\x2e\x68\xd6\x9b\x2e\xf7\x1c\xc2\x84\x19\xa7\x9d\x62\x3d\xc0\x98\x6f\x9f\xab\x69\x88\x73\x67\x82\xa2\xcc\x6c\xe2\x2a\x83\xfe\x64\x13\xe5\x96\xda\xd8\xae\x9a\x8c\x47\x45\xa3\x48\x94\xc6\xeb\x06\x81\x48\x73\xd6\x78\xb7\x59\x35\x46\xb7\x38\x99\x56\xa2\xcb\xcf\xb4\x3e\x35\xab\x69\xd2\xa3\x0a\xa7\x63\x41\x1f\xf4\x94\x28\xac\xad\x48\x62\x94\xd2\x28\x35\x51\x78\xec\xf0\x9d\xcc\x3a\x61\xd1\x4d\x22\x0b\x2a\x2c\x7f\x60\xf0\xb8\x62\x7d\x48\x92\x38\xec\x12\x13\x29\x4f\x2a\xd2\x2e\x77\xf2\xe8\x21\xa2\x3a\xd4\xbe\x7e\xcf\x88\x99\x9f\x85\x93\x50\x93\x37\xb5\x98\xab\xda\x35\xbf\xed\x20\xf2\x33\xcf\xdd\xdc\x92\xa5\x72\x99\x83\x07\xfb\xa3\xc1\x2a\x9f\x2c\xc0\xcc\xf5\xc3\x0d\x42\x40\x7f\x33\x19\xf5\xb3\xcd\x9a\xf2\x47\xbb\x6b\xcb\x47\xcd\x68\x49\x9e\x59\xcb\xd4\xe6\x85\xb2\x8c\xa4\x1a\x01\x63\xbe\xd9\x44\xcc\x3c\x6d\xa3\x2c\x63\x84\x2c\xb2\x38\x4a\xe8\x5d\x5a\xaf\x5f\x07\xac\x6b\x92\x28\xd6\x23\x8b\x35\xd9\xfd\x8d\xf3\x8d\x7a\xdf\x44\x8c\x6e\xf3\xc4\x4e\xb5\x25\x65\x6a\x30\xd9\x8a\x64\xc2\x65\x17\xab\x94\x05\xcf\xef\x12\x22\xa2\xad\x9b\x68\x40\x60\x5f\xd7\x3c\x69\xbc\xdb\xc1\x56\x09\x55\xf1\x1e\x5e\x6f\x93\x51\x26\x25\x9e\xa8\x2e\xd5\xcf\x9e\x65\x6d\x9e\xa8\x4a\xb1\x4c\x5b\xd6\xe2\x8b\xaa\x84\xb5\xe5\xcc\xb2\x16\xab\x54\x25\xd8\xf9\xb5\xef\x86\xab\xcb\x9a\x9c\x4a\xf5\xae\x79\x95\x66\xd6\x8c\x0a\xb2\xe1\x0b\xf2\x25\xdf\x6c\x13\x9a\x09\xf9\xaa\x8f\x13\x34\x70\xc4\x3a\xdf\xdc\xb1\x88\x56\x7c\x78\x26\x14\x23\x6d\xe8\x98\x9c\x68\x2a\xf4\x42\x9b\x83\x58\xbc\x12\x39\xd3\x46\xcd\xec\xcb\xa1\xc5\xb6\x33\xfd\xd3\x9b\x23\x23\xc9\xf2\x4c\xfe\x9b\xbd\x94\x30\x00\x5e\x42\x56\x51\xfc\xac\x44\x4b\x0f\x81\x58\x8c\xcd\xdd\xe7\x46\x2e\xdf\xa6\x64\x49\x9f\x8a\xc2\xbb\x55\x51\xcc\x2b\x71\xdd\x83\xa3\x46\x51\xd8\x39\x61\x13\x38\xd6\xe1\x5d\xe7\xa2\xa5\x8f\x68\x8a\xa8\xdd\xb8\x39\xac\x47\xba\x4d\x05\xfa\xad\x13\x5f\xf4\x27\x23\xf4\x06\xbf\x75\x2a\x85\xe1\x0e\x81\xf8\x67\xa7\xcc\xae\x98\x3c\x4e\xe9\x9d\x61\x7b\xfe\xd8\x0a\x07\xfb\x0b\xfe\x4d\x79\x49\x38\x4a\xb0\xcc\xdb\xe1\xda\xd5\x67\xd3\x6c\x14\x8e\xfd\x91\x39\xde\x45\x8c\x71\x31\xd0\xc6\x81\x03\xc1\x07\x92\x23\xd1\xf7\x80\x5a\xea\x33\xf8\xce\x1b\x91\x91\xf7\xdd\x80\x2f\xeb\x0b\xc0\x77\x28\x3f\x9b\xc1\xbf\xf4\xb1\x66\xa5\xc7\x84\xc8\xd1\x17\xf6\x7b\xc4\x51\x92\xb5\x5c\x67\x9a\xa7\x77\xdd\x23\x0a\x56\x65\x69\x3b\xb9\x21\x86\x88\xb2\x99\xae\x8f\x89\x19\x9e\xa0\x1d\x71\x93\xb4\x0a\x42\x9d\x10\xb2\xfa\x18\x8d\xd9\x93\x41\x8e\xd3\x80\x85\x88\x7e\x6d\xf6\x00\x41\x1c\xce\x81\x76\xdd\xa2\xd6\x35\x8b\x8e\x6b\xef\x39\xe8\xfb\xbb\x3a\xcc\x11\x09\x78\x58\xdf\x7c\x55\xc1\x48\x63\x42\xef\xd5\x4a\x1d\x73\x50\xd2\xa3\xe8\x75\x1a\x7d\x0d\x90\x2a\x34\x9d\x9a\xae\x0a\x74\xe8\x8f\xc6\x03\xe9\x2b\xe3\xee\x75\x78\xfa\x59\xbd\x54\x2e\x4f\xbe\x6f\x50\x51\xdd\x12\xd7\x54\x5b\x4f\x55\x7c\x51\x75\x76\xd3\x58\xd1\x29\x59\xd1\x4c\x90\xd4\x44\x6f\xed\x2e\xe9\x61\x5f\xc3\xa4\xa3\x88\x02\x72\x52\xc6\x95\x1e\xa9\x28\xe4\xcb\x25\x7d\x82\xea\x60\xb7\xd9\x06\x65\x03\x31\x5e\xf0\x58\x29\x23\xab\xd3\xbf\x4a\xd1\x05\x08\xb2\x1f\x91\xf7\xde\x3c\xa9\x0d\xb9\xd5\xd5\xa0\xa3\x7e\x46\x5d\xcd\x33\xea\x2a\x9d\xd1\x6e\x7d\x73\x08\x4b\x7d\x95\x4e\x17\x52\x8e\x26\xf2\x83\x22\x9f\x5d\x58\x81\x6f\x85\x15\x92\xcb\xbb\xd6\xc0\x21\x8e\xd9\xb8\xa1\xb7\x53\x31\xc4\xfa\x34\x77\x28\xc2\x6c\x6c\x35\x72\x28\xc6\x6c\x5c\xe9\xe4\x50\x8e\xd9\xb8\xab\x95\x43\x19\xf6\xde\x6e\xb7\x09\x8d\x15\x07\xf1\x4e\xc2\x02\xa9\x0a\x75\x5b\xe8\x27\x9a\x90\xcf\x24\x5a\x90\x14\x5d\x48\xc1\x46\x6b\x8d\xdf\x69\xf9\x13\x5d\x92\x05\x8d\xde\x69\x26\x2e\x21\x29\xba\xd4\x72\xc2\x27\x9e\x0a\xf4\x91\x2f\x08\xfa\x44\xd2\x25\x4f\x37\x72\x73\x47\xd7\x7f\xf8\xd9\xcc\x8e\x0d\xb4\x89\xae\xd7\x51\x4a\x16\x3a\xf6\x31\xba\x21\x4f\xe2\x26\x8d\xe2\xfb\xfa\xe9\x5d\x4e\xea\x97\x0f\x34\x13\xe8\x8f\xe4\xee\xdf\xa9\x1a\xed\xe2\xa7\x84\x3f\xa2\x3f\xea\xa8\xd3\xa6\x8a\x6e\x14\xe5\x66\x28\xc9\xd6\xab\x33\x6b\xad\x2f\xbf\x6e\xe5\xec\xa2\x8b\xf7\x3f\xda\x92\x17\xef\x7f\xbc\xda\x12\xd6\x48\x78\x1f\x89\xe8\x2e\xca\x88\x7c\xbe\x91\x9c\x75\xa4\x26\x58\xbe\xbe\xcb\xd3\x8c\xa7\xe8\xfd\x8f\x17\x6c\x41\x9e\x64\xb7\xaf\x79\x7c\x4f\x84\xa7\x6c\x89\x04\xf0\x90\xa7\x82\x7f\x3b\x5d\xf0\x50\x82\x03\x75\xae\x3e\x7e\x14\x4b\xb4\xc6\xde\x5b\x16\xaf\x79\x8a\xde\xa6\x24\x42\x6f\xf3\x05\xe5\xe8\xc7\xcf\xe8\x47\xd9\xa0\xfc\xf7\x13\x67\x02\xfd\xc8\x17\xcf\xe8\xc7\x5c\x08\xce\xd0\xbb\x88\x3d\x44\x19\x32\x92\x39\x7a\xaf\x00\xf6\x9e\xa6\x24\x16\x3c\x7d\x46\xef\xe9\x03\x3a\xdf\xdc\x91\x05\xfa\x89\x92\x64\x71\x4d\x04\x52\x55\xfc\xc4\xd3\x0d\x52\xd7\x2b\xe8\xff\xf2\xc3\x2f\x9f\xd1\x2f\x24\x5a\xa8\x7f\x94\xad\xd0\x2f\x62\x93\xa0\x0b\x9d\xe9\x62\x13\xad\x88\xc6\x06\xf4\xef\xe4\x79\x45\x18\xfa\x70\x81\x3e\x44\x77\x24\x41\x1f\xc8\x8a\xb0\x05\xfa\x40\xd9\x3d\xba\x8c\xb6\xe8\x32\x4a\xff\x9a\x13\xa2\x11\x05\x5d\x12\x96\xa3\x4b\x22\xe4\x93\x90\xe8\xc2\x17\xe8\x4a\xf5\x52\x23\x3f\xba\xda\x8a\x9f\x53\x9e\x6f\xe5\x83\x04\xe4\x55\x2e\x64\x2b\x9f\xa2\x34\x5a\xa5\xd1\x76\x8d\x3e\xa5\x04\x7d\x32\xda\x24\xf4\xbf\x73\x2e\x08\xba\x56\x44\x10\x5d\x2b\x19\x02\x19\xb4\xbd\xde\x46\x0c\x5d\x8b\xe7\x84\xa0\x1b\x49\xe3\xde\x45\xba\x42\xfd\x42\x92\xc4\x3c\x71\xf3\xa0\xff\x7f\xe6\x8f\xfa\xe1\x5a\x0b\x9c\x0a\xf7\x14\xf4\x6f\xa8\x90\x99\x14\x76\xfe\xaa\x7a\xfc\xab\xbe\xde\x02\xfd\x81\x2e\x08\x77\x67\x75\xbe\x3d\x4b\xf0\x7a\xc7\xf9\xa6\xf7\xcb\xcd\xe5\x07\x6f\x24\x46\x9e\x25\x54\x65\x75\xd0\x93\xc1\x99\x08\x96\xe1\x59\xa2\x2d\x33\x96\x70\x96\xe0\x6c\x5e\x1b\xad\x55\x3c\xdc\x82\x66\xb2\x93\xb7\x17\xe7\xb7\xf1\x9a\xc4\xf7\x45\x31\x9c\xa2\x45\xfd\x9d\x30\xf5\x39\x4e\x79\x96\xdd\x1a\x55\x91\x93\x73\x85\x89\x73\x52\x02\x20\x7a\xc6\x95\x17\x9f\xf5\x35\xfc\x63\x1a\x6d\xb7\x24\x0d\x3d\x74\x87\xeb\x70\x28\xb7\xb7\x3f\x7e\xbe\xfa\xe3\xf5\xf9\xe7\x9b\xab\xab\x0f\xd7\xb7\xef\xae\x3e\x5e\x5f\x7d\x38\xbf\xbd\x7e\xfb\xd3\xf9\x4f\xbf\x7e\x7c\xd7\x1b\x1d\x05\x6d\xf0\xcb\xe5\xf5\x27\xcd\x55\xeb\x2b\xdb\x66\x6d\x45\x68\xf5\xfd\x3d\x7f\x64\xb3\xa6\x5a\xb4\xfa\x76\x2e\xff\xcd\x5a\x5a\xd2\xea\xeb\x2f\x92\x99\xaf\xbe\x1a\xd1\xa0\xfa\xfa\x41\x4a\x06\xb3\x96\x4a\xb5\xfa\x7a\xc9\x9d\x8f\x5a\x66\xa8\xbe\x5d\xe5\x62\xd6\x90\x09\xea\x2f\x6e\x83\xad\xf6\x7e\xdd\xce\x1c\x05\x68\x89\x6e\xf1\x64\x7e\x5b\x33\x36\xb7\x96\xb1\xb9\xc7\xf9\x08\x80\x6b\x9c\x06\xb7\x21\x1c\xc5\x10\x3d\xca\x84\xeb\x51\x04\xe7\x34\xb8\x56\x9e\x7c\xf2\x37\x88\x43\x7c\xaf\x9f\xa2\x10\x3f\x2a\xdb\x23\x5d\xe5\xda\xad\xb2\x36\x49\x5a\x07\xb7\x21\x3a\xc7\x3c\x78\x0a\xb5\x73\xcd\x64\x7e\x55\x37\x7f\x65\x9b\xbf\x9e\x9f\x07\xb2\xf1\xab\x30\xc4\x4f\x23\xaf\xe3\x36\x39\xf3\x46\xd7\xa5\xb6\x7a\x36\x96\x49\xba\xd5\xa4\x33\x90\x2f\x58\x04\x49\x70\x1b\x86\xf3\x1b\x8d\xbd\x5f\x7c\xff\x4b\x6d\xf5\x01\x4b\xd2\x39\xb1\x53\xfb\xe2\x0d\x7a\x79\x58\xf7\xdc\x1d\xae\xb8\x3e\x65\x2a\xf1\xe0\xfb\x2b\xc5\x49\x2f\xa0\xb1\x6b\x01\xca\xff\xbb\x3a\xb2\x85\x18\xe3\xe7\xa2\xe0\x18\xdf\xc1\x3a\x76\x48\x75\xff\x20\x1a\x4e\xcd\x61\xaf\x7b\x9f\x79\xf3\xbb\x0d\x0f\xf7\xb7\xd7\x6c\x4b\xea\xce\x91\xc6\x49\xf2\x57\x1a\x35\x8e\x4a\x93\x12\x75\x0c\x0f\xfb\x5c\x3e\x36\x81\x08\x8b\x42\x94\xc6\x2b\x3b\x20\x26\x8a\x28\xf0\xda\x80\x95\x62\xce\x70\x28\x49\x49\x09\x15\xbf\x82\x7a\x5d\x3d\xfa\xb8\x34\x09\x83\xa1\x64\xce\xe4\xe6\xed\xb2\x69\xbd\x8c\xde\xce\x2a\x76\xf0\x7a\xc3\xaf\x9a\x1d\x39\x57\x05\xb8\x76\x5e\x9c\x69\xe9\x1a\x2a\xbf\x89\x8e\xec\x6b\x2f\x17\xa8\x3c\xe8\xbf\xd2\xca\x6b\x2d\x28\xe7\x21\xdf\x1f\xa6\x4d\x7b\x89\xca\x97\x4d\xf9\x16\xbd\x88\xde\xb3\xe5\xd7\x2a\x46\xaf\x07\xe2\xef\x8f\xf5\xac\x7d\x9a\x8d\x51\xc5\xd0\xf2\xbd\x46\x20\x31\x8d\x01\x6f\x41\x1f\x3c\x38\x36\x0d\x55\xe1\x22\xfe\xf6\x1e\xaa\xd0\xee\xc6\xad\x95\x8c\x9b\xfc\x90\xbe\x5c\xa0\xe9\xd2\x17\x61\x8f\xb3\xae\x0e\x3d\xc6\xd4\xa9\x3e\xff\xfa\x74\xc4\x28\x52\x60\xcf\xe1\xeb\x7d\x8f\x51\xf4\xf7\x43\x51\x05\x52\x03\x4b\x1d\x86\x44\x42\xab\xdd\x71\xf4\x4a\xab\x79\x51\xbc\xc8\x2a\xac\x05\x64\xb5\xf4\x96\xd1\x3d\xf1\xe0\xfc\x3f\xb9\xc3\x3a\xd6\x47\x16\x96\xa8\x11\x5e\x5c\xe8\xcb\xfb\x82\x2c\xc4\xc2\xe2\xc5\xb2\x79\x81\xa5\xf5\x48\x78\x6d\xa0\x38\x41\x1c\x2f\x65\x2d\x18\x27\x68\xd9\x97\x43\xd9\xab\xf3\x52\x6b\x2e\xcc\xaa\xea\xbd\xd7\xc4\x72\xb5\xf3\x06\xab\x53\x5f\x70\x56\x43\x2a\x67\x77\x3c\x67\x0b\x0f\x22\xd6\x0d\xb7\x82\x73\x75\x51\x0b\xc7\xfa\xc6\x89\x79\x46\x92\x65\xd7\x87\x3f\x45\xdd\x38\x2d\x54\x89\x3c\xda\xbe\x4e\x6d\x50\x14\x47\x67\x51\xc7\x75\x46\x05\x5c\xe7\x33\x7b\x27\x99\x7c\x99\x47\x73\x18\x05\x3c\xf4\xfd\xa1\xfc\xd1\xf6\x85\x20\xdd\x65\xe0\x18\xf0\x10\x51\x08\x03\x12\x62\xf5\x2c\xff\xe1\x14\xa2\x08\x47\x63\x1d\x7c\xd6\x2c\xad\x52\x79\xf9\x22\x1d\x84\x30\x17\x6e\x14\x42\x06\x52\x28\x49\xb2\x0a\xd7\x53\xd9\x8f\x80\x76\xb8\x7b\x88\x52\xdf\xff\x56\x7a\xab\x84\xc5\x7e\xc3\x0a\x25\x38\xee\x34\xad\x40\x72\x91\xd7\x13\x48\xc6\xce\x0e\x52\x14\xa2\xbb\x5d\x13\x24\x50\xe0\x2c\xed\x10\x22\xa7\x02\xdc\x8d\x65\x12\xa1\x18\xe5\xb5\x15\xbe\x35\xfe\x9b\x9e\xe9\x50\x40\xea\x7a\x6d\xf3\x08\x51\xf6\x75\x3a\x91\x4b\x5a\x65\x4f\xa2\x2a\xc5\x46\xe6\xfb\xc3\x29\xc6\x38\x6b\x10\xec\x33\x50\x1b\xb9\x6a\x23\x1e\x90\x43\x14\xe3\x1c\x05\x29\xe2\xc8\xcb\x8c\xd9\x85\x32\xb1\x08\x7b\x6d\x6f\x23\x39\xd7\x2d\xe5\xa7\x9c\x83\xda\x10\xc8\x04\xfc\x68\xf8\xaa\x10\x7d\x31\x81\xfc\xa9\x8c\x86\xad\xd1\xe8\x0f\x93\x33\x16\x4c\x42\xeb\x3d\xa5\x1c\x06\x8c\x4f\x44\xe7\xc6\xa7\x86\x4b\x08\x85\xf3\x5c\xf2\x80\x51\x10\x87\x95\xad\x76\x1e\x10\x7b\x5b\x41\xae\x2d\x97\xe1\x2c\xc2\xb9\xc5\x2d\xd7\xe8\x0b\x44\x28\xa8\xcc\x49\xaa\x13\xd1\xea\x4c\x8f\x6f\x09\xf3\x42\x14\x43\x14\x95\x55\xf8\xa1\x1a\x35\x2a\x23\xf2\x01\x65\x03\x0a\x65\x27\x30\x95\x3d\x51\xb8\xa9\xb9\x11\xd1\xc3\x8d\xa8\x38\x32\x92\xf8\x02\x86\x94\x29\xaa\x26\x9f\x02\x2f\x80\xba\x69\x55\xdd\xf9\xe7\x04\xbc\x58\x8a\x16\xff\xa7\xe9\x90\x31\xe4\x63\x23\x13\x50\x37\xc2\x2f\x8e\x13\x7d\x0c\x1c\x5d\x8a\x1b\xa3\x9f\xe9\x18\xfd\x93\xbe\x4b\x02\xc8\x57\x82\xf4\xb3\xea\xb6\x4d\x5c\x5d\xd4\x83\x98\x09\xd4\x4f\x6a\x0b\xcc\xdc\xb1\xf2\xa5\xf6\xd2\x5b\xd2\xbc\xaf\x13\x96\x5c\xc7\xf5\x1f\xe1\x26\x01\x6b\x9b\xa5\x73\x44\x77\x05\xb9\xa1\xc1\x24\xb4\x96\x7d\x2f\x34\xfb\x44\x52\xca\x17\x34\x9e\x79\xea\x6a\xfb\x87\x28\x51\xd7\x61\xa0\x05\x49\xa2\xe7\x99\x67\x6f\xd7\xd4\x98\xd8\xcc\x73\x46\x83\x69\x58\x14\x13\x7b\x37\x97\x1c\xd2\x8c\x96\x68\x89\xa9\xf2\x92\x69\xc1\xcb\x31\xf6\x5c\xee\x00\x96\xbd\x6e\x37\x1b\xd7\x1d\x2b\x0a\xe0\xb1\x7c\x73\x47\x52\x27\xc0\x72\x7d\xa9\xa9\xb1\x34\x8d\x82\x3a\x2d\x9c\xd5\xcf\xbe\x0f\xea\x97\x20\x13\xc6\x1f\x0a\x96\x1a\x81\x12\xfc\x00\x08\x92\x3d\x45\x99\x32\xea\x56\xbc\x49\x62\x99\x07\x1d\xb0\x6a\x8b\x93\xe6\x34\x58\x15\x79\xbb\x5b\xdb\xb3\x28\xd8\x86\x38\x99\x29\x9f\x61\xd5\x5a\x02\xd1\xd6\xf7\xb7\xe3\x94\x2c\xe5\x4f\xce\xd4\x43\xcf\xb4\x98\x2c\xbd\x5f\x4c\x29\x90\xc8\x3c\x58\xe5\x54\x66\x96\x60\x0b\x51\xa2\xbf\x62\x93\xcb\xa6\x43\xd4\xed\x5d\x51\x6c\xcf\xb6\xb3\xa4\x8e\x3c\x65\xb1\x91\xca\x05\x8f\xa8\x42\x2d\x86\x7a\xac\xce\xfb\x03\xc0\xa5\x72\x96\x3b\xcd\xd0\x33\x8e\xa3\x80\x86\x33\xc0\x55\x0c\x6f\x09\x06\x58\x14\xf2\x0d\x22\xee\xfb\x1d\xd7\x35\xae\x2f\xcb\x6a\xde\x15\x3a\xc4\x98\xeb\xdb\x62\x7d\x1f\xf0\xea\x82\x6a\xdf\xe7\x7a\x2a\x5c\xfc\x50\x61\xe6\xaa\xfb\x61\xa1\xef\x77\x11\x86\xd6\x78\x42\xc3\x19\x55\xd6\xa1\x15\x32\x20\xde\x71\x8e\xe3\xd0\x71\x19\x36\x57\x58\xf4\x58\xcd\x26\x1d\xf5\x6c\xe5\x39\x16\x74\xa8\x70\xf3\x28\x4c\x87\x9a\x85\xfd\x71\xb1\xfe\x9a\x93\x5c\xc7\x18\x11\xea\x2e\xd3\xee\xe9\x97\xeb\xc6\x22\xd0\x2b\x05\x7a\x42\x86\x29\x97\x95\xee\x9d\x7d\x75\x3c\xe1\x76\x6d\x72\xa3\x51\x20\xe8\x0f\xe2\x45\x37\x2a\x32\x4f\x17\x08\x9e\xb2\xc8\x62\xd8\x8b\x13\x12\xa5\xde\xbc\x22\xca\x5e\x7d\x69\x6f\x9d\x56\xd1\x96\x46\xa2\xf5\xc8\xf1\x76\xb4\x6e\x2c\x0a\xde\x5a\x13\x05\xa5\x56\x6c\x76\x46\xd5\xe6\xd5\xa6\x07\xd5\xf1\x70\xab\x90\x69\xd7\xdb\xf0\xdf\x3e\x57\x99\x37\xfc\xb7\x77\x5f\xc9\xaf\xad\x21\xea\x22\xfa\x7d\x67\xa9\xfe\x71\xdc\x25\x3c\xbe\x6f\x85\x42\x6b\x5e\x5a\x18\x78\x51\x42\xac\x35\x81\x36\xf2\x51\x5c\x4a\xba\xf1\x42\xc3\x22\x32\x97\x43\x54\xab\x39\x48\x43\xd7\xaa\xdb\xbd\xb9\xb1\x4a\x56\x17\x00\xd4\x41\xc3\x0c\x5e\xa4\x39\x53\x01\xec\xa8\x8a\x74\xbc\xa3\xd7\x0d\x8d\xf3\x57\x0e\x29\x48\x9f\xfd\xb5\x3e\x93\xea\x55\x2d\x48\x4a\xfc\x75\xed\x84\x0b\xa1\x6f\x3d\x00\xe9\x3d\xee\xa0\xee\x71\x47\xd4\x38\xee\x88\xfb\x8f\x3b\x72\x3c\x99\xe7\xb5\x26\x2c\xb7\xfa\xab\x0c\xa7\x41\x1e\xa2\x25\x8e\x47\x20\x1b\x45\x10\x25\xfa\x89\xc2\x39\x97\xa2\xd2\x4b\x89\xe4\x6f\x10\x85\x78\xa9\x9f\x68\x88\x93\x52\x6f\x35\xc2\xe5\x9d\xe7\x6a\xef\xe8\xfa\xaf\xb5\x35\x5f\x41\x33\x9f\x5c\xac\x0a\xa2\x73\xab\xc4\xd8\x79\x54\x31\x37\x01\x62\xaa\x16\x58\x5f\x0b\x0c\x05\x69\xa3\xfa\x5e\x64\xb8\xcc\xb5\x6d\xd8\xd5\x5d\x46\x52\xa5\xc3\x6c\x63\xc4\x65\x4f\x26\x88\x2e\x81\xa7\x4f\x62\xba\xdf\xfa\x1b\x52\x94\x22\xd3\x6a\xf5\x57\x1b\xeb\xcd\xb8\xa3\xd2\xfa\x70\xaa\xb7\x2a\xe7\xf3\x8e\x0a\x38\xbb\xdd\xf6\xdb\x2b\xa4\x9d\xc3\x4d\xa5\x1b\x7b\x2c\x8a\x73\xe8\xfb\xc3\x57\x99\x5e\x2b\xd5\x12\xab\x90\xd7\xae\x5c\xb7\x75\x6b\x54\x61\xb5\x0e\xb3\xf5\x64\xc5\x04\x6d\xff\x31\xe7\x98\xdb\x13\x81\xc0\x3d\xe1\xac\x8f\xcf\x3c\xe4\xd5\x4f\x8e\xca\xcc\xbc\xfd\xc8\x17\xcf\xcd\x14\x75\xfa\xd2\x4c\xb2\x27\x3d\x3d\xa9\xcd\xa4\x8b\x9e\x34\x73\xaa\x53\x27\xea\x73\x37\x2f\xb4\x61\xa9\x5a\x2c\xe4\xc3\x2b\x97\x3d\xd1\xe5\xdf\x73\xdd\x13\xac\x54\x3b\xed\x5b\x9d\x86\xd3\x12\xc0\xb3\xe0\x45\xeb\x04\x66\x14\xb5\xfd\xe8\x66\x81\x11\x81\xc2\x32\x9c\x05\xe1\x9c\x08\x40\x11\x13\x80\x2a\xb9\x3b\xb5\xb0\x8f\x20\x62\x80\x42\xc9\xbe\x3b\xf3\xd1\x12\xd5\x91\xb7\x73\x95\x7a\xc8\xbb\x30\xa7\x7f\xfa\xb1\x2e\xd3\x3e\x4a\xd4\x49\xf6\x30\x51\xbf\x39\xc7\x89\x3a\x41\x1f\x28\x4a\x58\x57\x47\x89\x61\x6d\x5b\xa1\x1d\x7c\xb9\xeb\xe0\x6b\xa2\x72\x93\x80\x07\x71\x18\xce\xd5\x65\x96\x2e\x59\x12\x20\x77\xa3\xb1\x36\x5e\xa1\xbe\xef\x06\xa4\x4a\x70\xeb\x5b\x39\x71\x9e\x09\xbe\x31\x18\x90\xfd\x33\x2c\x03\xc4\xb8\xd9\x86\xef\xb7\x1b\xa5\x6c\xd0\x6f\x21\xd0\x2e\x8a\x3a\xdd\x35\x76\x45\xca\x4c\xc0\x1a\x86\xba\x56\x01\x8e\xbd\xa8\x6b\x19\xb0\xe0\xdb\x8e\x45\xc1\x57\x6d\x05\x7a\xa0\xf7\xa7\x5f\x3e\xb7\x99\x86\x61\x9b\x17\x5b\x76\xf6\x00\xb9\x56\x96\xf6\xf6\x97\xa5\x33\x79\x5b\x9c\xc8\xdd\x6b\x8d\x93\x20\xd3\x61\x35\xb6\x3a\xdb\xea\xd5\x7d\x84\x2e\xc1\xca\xc6\xf7\x59\x39\xfe\xc3\x5b\xfc\xac\xab\x7b\x0e\xb2\x50\x6b\x84\xef\x70\x8f\xb5\xf4\x06\x7b\x59\xc5\xfd\xa3\x5b\x7c\x01\x12\xa3\x4c\x40\x5d\x99\xbb\xcf\x7c\x66\x20\x82\x34\xc4\x13\x8c\xd5\x1d\x93\x42\xee\xae\xea\xca\xc9\xdb\x8a\x8d\x27\x4a\xcc\xb9\xc7\x0b\xa0\x23\xeb\x4a\x66\xf7\xed\x1d\x4f\x95\x11\x3d\x44\x8f\x8d\x0f\x46\x14\xd1\x9f\x9e\x74\x77\xb4\xa2\xe7\xd5\xee\x18\x0f\x5f\x29\x92\x54\xac\x54\xf0\x18\x16\x85\xec\x9d\x15\x2b\x9f\x6a\x3d\x80\xd5\xc8\x5b\x12\x23\x50\x9e\x26\x33\xd9\x7b\xe4\xc8\xe6\xc3\xa9\x16\xae\x19\x52\xee\x49\x64\x31\x1b\x4e\x4b\x44\xf1\x43\x5b\xdf\x37\xd6\x5d\xbc\x46\x1c\x5d\xa1\x1b\x38\x17\xe6\x62\x20\x11\xc4\xa1\xef\x0f\xf9\xd8\x94\x37\x37\xc5\xa8\xa8\x5a\x1b\xf9\x62\xa2\x53\x2a\x08\x9d\xeb\xd1\x1a\x4f\xa8\x57\x87\x5b\x69\x57\xfa\xbc\x6f\x03\x16\x96\x40\xe8\xdb\x63\x77\xca\x7d\xfa\xfe\x38\x65\x64\x55\x8b\x79\x45\xc1\xcd\xa5\x43\x46\xdc\x33\xdd\x36\x00\x9c\xf7\x09\x6c\xd5\xf1\x59\x0b\xf8\xf7\x15\xd8\xcf\x5b\x02\x5d\xa5\x7a\xb9\x02\xce\x79\x8f\x6c\x0f\x45\xd8\x06\xb9\x9c\x4b\x89\x11\xcb\x09\x08\x62\xf9\x6b\xee\x61\x8a\x02\x1e\xce\xb7\x45\x01\xb6\x38\xd2\xf8\x1d\xa9\x40\x13\x4b\xdf\x5f\x1b\x55\x1e\xba\x43\x4b\x68\xb4\x0c\x4a\xc3\xdb\x8c\x3f\x1c\x8d\xd5\x22\xb8\x36\xb3\x10\x8d\xdf\x5f\x7d\x3c\x87\xca\xa1\xbb\x9e\xa5\x48\xc5\x42\x14\xf5\x5c\x59\xea\x17\xb5\x62\x2f\x4b\x82\xa0\xaf\x7c\x87\x6a\xd1\x4e\x86\xb2\x4a\x7d\x4d\x80\xef\xab\x30\x08\x56\x6f\x68\xa7\xcc\x46\xfe\x99\xdb\x87\xbe\xeb\xeb\x5e\x6f\x09\x51\x3c\x99\xd3\x5a\xec\xa0\xea\xf2\x0a\x1a\xea\x4b\x56\x99\x0d\x75\x43\xd1\x14\xce\xdd\x61\x09\x17\xf9\x78\x75\x8b\x51\x75\xc5\x87\x99\x4c\x51\xa3\xa5\x7c\x77\x6b\x50\x6a\x5a\x0d\x1d\xa0\x67\x66\x02\xab\x10\x4a\xdb\x7a\x06\x12\x88\xa2\x80\x85\x45\x01\xe4\x0f\x16\x10\xd9\xc5\x17\xa1\xd4\x28\xe1\xf4\x0c\x4f\x90\x73\xcd\xdc\x35\x80\x2f\x8d\x7b\x7c\x76\xde\xdd\xa9\x3b\x24\x8b\x9f\xef\xb8\x8d\x53\x45\xcd\x36\x37\x9e\x2c\x80\xf7\xb4\x4e\xb5\xb2\x52\x47\xab\x7e\x5a\xa7\xd7\xcf\x2c\xb6\xd1\xaa\x9f\xd6\x69\x1d\x5a\x04\x51\x9b\xa3\xa2\x8c\x10\x45\x26\xed\xd7\xcf\x1f\x3c\x88\x62\xf3\xa6\x8c\x40\x7f\x54\xd6\xf1\x4e\xe6\xfe\x0d\x63\x45\x78\xc2\xe3\x76\x70\x0b\x25\xa1\x55\x4c\x95\xdc\x0a\x6b\x0e\xcb\x29\xe1\x9c\x26\xa8\xbd\xb9\xbe\x28\x89\x74\x83\x8c\x39\x74\xc1\x2a\xb0\x51\x24\xc5\xa9\x80\x87\x48\xb2\x13\x71\xa8\x0f\xeb\x14\xd1\xbc\x05\x02\x10\x14\x43\xcb\x90\x29\x8b\x7e\xca\x72\xe2\xcd\x65\x4e\x0c\xa2\x1e\xf5\x2b\x75\x55\x89\xee\x55\xc9\xa9\x3a\xa7\x89\xa1\xba\xb4\x35\x42\x14\xe7\x50\xc5\x64\xe8\xc3\x59\x0e\x28\x2c\xc1\x8e\x11\xa3\xc0\x5b\x11\x61\x0e\x70\x3e\x19\x4f\x4b\xe5\x7e\x25\xe2\x75\xf5\xbe\x4b\x28\x6a\xdf\x84\xa8\xf6\xcc\x8e\x90\x5f\x85\x4b\xe8\x55\xba\xc1\x17\x1d\xdf\xa5\x7b\xb4\x90\xd6\x8b\xb9\xb7\xa1\x46\x98\x21\x7d\x39\x00\x41\x2f\xf6\xe6\x2b\x66\xaf\xb0\xb2\xb7\x87\xb0\xfa\xfe\xaf\x12\xce\x53\xbb\xfc\x94\x7e\xb0\x2c\x77\xb4\xa1\x02\x4f\x2d\xbe\xe5\xf2\xc7\x10\x33\xd0\xe7\x8a\x03\x91\xaa\x60\xe7\x4d\x60\xaa\x5c\xc7\xbf\x47\x5d\x5a\x83\xaa\xc0\xb3\x2a\x9c\xad\x0d\x86\x8c\x08\x12\xea\xb6\x56\x31\x26\x4f\x5b\x9e\x8a\x0c\x73\x58\xa2\xe9\xd1\xf1\xc4\x3d\x22\xf5\xf2\x8c\x0c\xe4\xbe\x14\x0b\x4f\x5f\x8b\xae\x23\xb4\x20\x5a\x1f\x0a\x44\xdf\x12\x29\x22\x33\x81\x22\xf2\xbe\x38\x11\x71\x37\x4c\x84\xa2\xea\x01\x6d\x86\x89\xc8\xad\xb0\xb8\x23\x4a\x44\x0a\x8b\x02\xa4\xdd\x28\x11\x69\x4f\x94\x08\xba\x2b\x4a\x84\xc4\x38\xfa\x4a\x94\x08\xaa\xa3\x44\xd0\x3a\x4a\x44\x5a\xf7\x30\xab\x83\x7d\x3b\xda\x7c\x2b\xe4\xd6\xa1\x1b\xf4\x2e\xd6\x13\x24\x22\x9e\x3b\x17\x83\x18\x95\x6c\x33\xe3\xac\x35\x40\x3e\xdf\xdd\x52\x6e\x31\xfb\xbf\x3a\x48\x04\xd5\x41\x22\xec\x1d\x99\xb9\xbd\x96\xc4\x06\x89\x88\xda\x41\x22\xaa\x2e\x67\xf0\x45\xf1\x16\xff\xb4\x20\x11\xd1\x3f\x1e\x24\x22\x87\x36\x48\xf5\x12\x25\xf8\x77\x97\xf8\xdf\x5d\xe2\x7f\x77\x89\xff\xdd\x25\xfe\xff\x49\x97\x78\xf4\x9f\xe2\x0c\x8f\xbe\xee\x06\x8f\xac\x03\x3c\xfa\xdd\xf5\xfd\x55\xd7\x77\xf4\xbb\xd3\xfb\xff\x5c\xa7\x77\xf4\xff\x1d\x77\x77\xf4\xbb\xa3\xfb\xef\x8e\xee\xbf\x3b\xba\xff\x53\x1d\xdd\xe7\x60\xf9\x5f\xe5\xe3\xbe\xfc\x3b\x7d\xda\x3b\x56\x9d\x5b\xbc\xd4\x1e\xed\xdb\x6f\xf5\x68\x5f\xa2\x04\x6d\xe1\xcb\xb6\xc7\xa3\x3d\x42\xa4\xe3\xd0\xce\xac\x73\x3a\xf9\x76\x87\xf6\xd4\x29\xf3\x8f\x38\xb4\xf3\x96\x43\x3b\xc5\xe4\x1f\x72\x68\x8f\xff\x7b\xfd\xd9\xf3\xca\x9d\x3d\xfb\x5b\xbc\xd9\x55\xef\x5d\x27\x6c\xd6\xa3\x99\x13\xbb\xbc\xd9\x09\x12\x88\x05\x42\x79\xb3\x3f\xd8\x6b\xc9\xc0\xab\x9e\xec\x0c\xc2\xea\x92\x6c\x3e\xce\x00\x9c\x0f\x41\x8a\xf9\x98\x01\x08\xc7\x0b\x89\x6c\x56\x11\x92\x9a\xd8\xb9\xd1\x57\xbd\xdb\x19\xa2\x95\x77\x7b\x64\xbd\xdb\xa3\x6f\xf1\x6e\x27\x88\x22\x16\xd0\x10\x96\xb5\xc2\x87\x8f\x09\x88\x6b\xfb\x4d\x3e\x5e\x82\xca\xf9\x9d\xfc\xb7\x38\xbf\xe7\x0d\xdf\x77\xfe\x0f\xf8\xbe\xa7\x6d\xdf\xf7\xf8\x6b\xae\xef\xed\xa5\xff\x9f\xe7\xfa\xae\xac\x99\xaa\x13\x6e\x65\xcc\xa4\x8e\xb8\xe7\x20\x2d\x0a\xfe\xff\xae\x0b\x7c\x1b\x62\xbf\xbb\xc0\xff\xee\x02\xff\xbb\x0b\xfc\xef\x2e\xf0\xbf\xbb\xc0\xff\xee\x02\xff\x37\xb9\xc0\xa7\xc1\x6d\xa8\x1d\xdf\xef\x47\x31\x44\x4f\xfa\x49\xb9\xc0\xdf\x1b\x17\xf8\x7b\xe5\x02\xff\xa8\x9f\xa2\x10\x3f\x55\xd7\x6f\xe8\x9b\x37\xd6\xee\xcd\x1b\xf6\xd3\x15\x5e\x07\xe7\x21\xba\xc6\x3c\xb8\x52\xf5\xdc\xe0\xc9\xfc\xa6\xee\xc2\x4d\xed\xbc\x9e\x06\x37\xe1\xfc\x3a\xf8\x12\xe2\xab\x7e\x37\xf8\x2f\x55\x83\x9f\x24\x81\xba\xc4\x93\xf9\x65\xed\x06\x7f\x69\x6b\xba\x50\x6e\xf0\x97\x61\x38\xff\xa4\x31\xf8\xc2\xf7\x2f\xbe\xc1\x0d\xfe\xd3\x0e\x37\xf8\xca\x01\xbe\x72\x31\x7f\xb0\xf7\x9f\x57\xa7\x51\xea\xbc\xf8\x5b\x7d\xe0\x1f\x5f\xf5\x81\xb7\x77\xdb\xb4\x6a\xa7\xba\x76\xfa\x8f\xf8\xc1\xef\x6e\xf8\xff\x0f\xfd\xe0\x0d\xcb\xa6\xb6\xef\x9a\x5f\x53\x06\xc0\x86\x67\xfb\x66\x7f\xf8\x9d\xdc\x9f\xac\xcd\x56\xf6\x5f\xe1\x17\x4f\xff\x71\xbf\x78\xea\xfb\x43\xba\xdb\x2f\x9e\xfe\x37\xf8\xc5\x47\xff\x05\x7e\xf1\x14\xa2\x48\x9f\xad\xc6\xfd\x7e\xf1\x71\xd3\x2f\x3e\xef\xf7\x8b\xcf\xdc\x3b\x5a\xd0\xf2\xeb\xd3\x91\x19\xdf\xb6\xe5\x4e\xb8\x66\x28\xff\x07\xe1\x97\xe0\xe1\x10\x48\x29\x3e\xee\x73\x15\xff\x0a\xd0\x64\xf3\x4b\xed\x1a\x5f\xbb\x42\x7c\x9b\x6b\xfc\xdf\xdb\x73\xed\x1a\xbf\xdd\xe5\x1a\xbf\x75\x5c\xe3\xd7\xca\x78\x26\x46\x0f\x4d\x07\xf9\x75\x9f\xc3\xfb\x83\xb9\xcd\x73\x2d\x6b\xc0\xf8\x61\x5e\xdd\xfc\xb6\xcb\x3b\x7e\xe1\x7a\xc7\xd3\x7f\xae\x77\x7c\xf2\x3f\xd3\x39\x3e\xf9\xbb\x7c\xe3\xe9\xef\xbe\xf1\xbf\xfb\xc6\xff\xcf\xf3\x8d\x2f\xd1\xe1\xf1\xc9\xfe\xc1\xac\xad\x32\xe9\x98\xbb\xf5\x47\xe2\xd0\xca\x91\x9b\x35\xcd\x7c\xbf\x7e\x96\x44\x63\xa7\x2e\xde\xf7\xf5\x2f\xea\xa7\x5e\x92\xcc\xf4\xb3\x15\x1d\x0d\x83\xef\xcb\xcc\x03\x6a\x54\x1a\xbb\xb3\xb4\x2c\xf4\x2a\x89\x70\xe6\x69\xf3\xef\x75\x94\xbe\x15\x60\x02\xcf\xdc\x5b\xa0\x76\xf9\x56\x4e\x51\x8a\xa7\x73\xf6\xbd\x70\xc2\x85\xa2\x54\x5f\xb2\xeb\xfd\xe5\x2f\xaa\x4a\x65\xc0\x3f\x1a\xcd\x2d\x7b\xaa\x5b\x12\x01\xab\x0c\xcc\xd9\xbc\xd6\x64\x6b\x2d\xf6\x77\xbf\x2a\x19\x88\xb2\x48\x90\xc5\xe0\x5f\x12\x1e\x47\x09\xfd\x8d\x0c\xac\x59\xcd\x40\xb9\x7d\xca\xf9\xf6\xbe\xab\x2d\xbc\xbe\xf3\xc6\xdf\x41\xa8\xa7\x7d\x34\x85\x33\x51\x4a\xee\x6e\xf7\x54\xd9\x69\x2a\x0a\x5e\x14\x14\x8e\xab\x76\xaa\x65\x35\x10\xa0\x31\xde\x36\xb1\x90\xd4\x8d\x3c\x0e\xd4\x92\x03\x4c\x92\x8e\x37\xd3\xd9\x04\x22\x8e\xa7\x73\xfe\x3d\x53\x37\x9d\xa7\x01\x7f\x33\x0d\x9d\x9b\x30\xb9\x32\xde\x15\xfa\xae\xcb\x24\x12\xa4\x66\x0e\xab\x24\x40\x50\x0a\xe7\x44\x45\x04\x40\x29\xa6\xc1\x34\x2c\x6b\x3f\xa3\x08\x10\x99\x4e\xc6\x69\xf4\x18\x4c\x42\x88\x72\x3c\x9d\xe7\xdf\x13\xd7\xa5\x32\x1e\xe1\x34\xc8\xdf\x4c\xc3\x91\xcc\x9d\xdb\xdc\x79\x58\x51\xa6\xb8\x44\x0c\x9c\x9e\x4e\x0f\xe4\x76\x70\x78\x3a\xed\xc1\x7c\x06\x0e\xf6\x4e\x26\x07\x10\x31\xb0\x77\x70\xb4\x7f\x24\x1f\x4e\x0e\x8f\x4f\xe5\xef\xe9\xc9\xc1\xc1\x54\x3e\x1c\x1f\x1f\x9e\x1c\xea\x2f\xa7\x27\x7b\xf2\xe1\x68\xef\x50\x7d\xd9\xdb\x9f\x1c\xef\x57\xc7\x0b\xe0\xe4\xe8\xf4\x70\x22\xd9\x11\x6b\x5b\x9a\x8e\xdf\x47\x82\x94\xe8\xf0\xe8\xe0\xe0\xa8\xb7\xf1\xbd\xc9\xbe\xac\x48\x66\x98\xc8\x87\x83\xd3\xbd\x03\xd5\x9d\xe3\xfd\xe9\x9e\xea\xc6\xc1\xf4\x48\xb5\x35\x9d\xec\x9d\x9e\xa8\x84\xc3\x93\xe9\xb1\x7c\xd8\x3f\x38\xdc\x53\xa5\x0f\xf6\xf6\xf7\x54\x07\x4f\xf7\x27\x07\xaa\x83\x27\x27\xa7\xfb\x2a\xcf\x74\x6f\xa2\x6b\x39\x9c\xee\xef\xeb\x6a\xa6\x53\xd5\xd2\xc9\x64\xa2\x07\x71\x7c\x38\x3d\x51\x79\x8e\x26\x47\x47\x2a\xcf\xd1\xfe\xc9\xd1\xde\xab\xc3\xba\x8c\xc4\xba\x44\xc7\xa7\xc7\xd3\xd3\x9e\x61\xed\x1f\x1d\x1c\xaa\xfe\xec\x1d\x9b\x3e\x1f\x1f\x4f\xf7\x0f\x75\x1b\xc7\x13\xd5\xb1\x83\xc9\xe9\xbe\xfa\x74\x7a\x7c\xb8\xaf\x3b\xb4\x77\xb8\xa7\x3e\x9d\x4e\xf6\x8e\x55\xca\xe9\xe9\x74\xa2\xe1\x7c\x78\xa2\xe1\x74\xb4\x77\x78\xa2\x1f\x0e\x0f\x0e\x5e\xed\xe1\x47\xe5\xe9\x5f\xa2\x83\xe3\xd3\x69\x4f\x17\x4f\x4e\x8f\x15\x98\xf7\x0f\x8f\xf5\xf4\x1f\x1d\x1e\x4d\x15\x14\xf6\x4e\x8f\x8e\x14\x1e\xec\x4d\x27\x93\x43\x03\xde\xe3\x3d\x03\xa9\x3d\xf5\xe9\x70\x72\xa8\x3f\xed\x4f\x4e\xf4\x28\xf6\x27\xa7\x06\x76\xc7\x47\x7b\x07\x7a\xde\x0e\x0f\xf4\x7c\x1d\x4f\x54\xe9\xd3\xe9\xd1\xa9\x9e\xb6\xe3\x43\x3d\x27\x47\x53\x3d\x5b\xa7\x87\xc7\x07\x1a\x5e\x07\xa7\xfb\x7b\x8d\xa9\xd8\x3b\x98\x7e\x65\xa0\x5a\x39\x5d\xa2\xd3\xe3\xa3\xbd\xc3\x26\xb7\x5a\xe5\x72\x53\xfb\x2f\x75\x17\xe6\xb0\xad\x3e\x68\x33\xb2\xb5\x80\x23\x6f\x40\xb3\x81\x3a\x73\xab\x6c\xcf\xeb\xed\x5f\x94\x25\x3a\x3d\x9c\x1e\xec\x77\x80\x6c\xfb\x7c\x34\x39\xde\x3b\x72\xfb\xdc\xea\xcd\x30\xd5\x06\xc8\x79\x92\x0c\x31\xee\x76\xc4\x7b\x17\xb1\xef\xc4\x20\x23\x62\xe0\x8d\xdc\x5e\x45\xd9\x20\x1a\xd4\xc7\x77\x8d\x2e\xed\x1d\x4c\x4e\xbb\xcb\xbd\x02\xe3\xc1\xa1\x04\x2f\xc7\x0c\xec\x9f\x1c\xcb\xf9\xa2\x98\x81\xc3\xbd\xd3\xe3\x43\xc9\x50\xa6\x92\x59\xce\x62\xbe\xb5\x07\x97\x31\x56\x14\xd0\x71\x5f\xd3\x07\x64\x71\x10\x85\xbe\x4f\xc7\x4b\x1d\x86\xab\x2d\x5d\x68\x03\x6a\xae\x4e\xd3\x74\x40\xdf\x3e\x10\xc8\x4a\x02\xa1\x77\x6a\xb4\x77\x7c\x74\x7c\xf2\x2d\x1b\x34\x03\x47\x07\x07\x27\xc7\xd0\x6c\x68\xbd\xe0\x6d\xdc\x2d\x48\x46\x80\x9d\xe9\x33\x2b\x43\x46\x67\x53\xc9\x12\x9c\x1c\x4d\x8e\xf6\xbf\x8a\x37\xf5\x25\x95\x40\xb8\x9b\x70\x75\x4a\xeb\xcc\xd7\x05\x8b\x79\x9a\x92\x58\xce\x17\x60\x67\x6c\xe4\x0d\xbc\x99\xe7\xc1\x91\x47\xd9\x83\x75\x30\x69\xce\xd6\x74\x72\xda\x25\x24\x7f\x13\x02\x7d\x13\xfe\x5a\xf3\xe7\x36\xae\x1c\x4e\xbf\x89\x29\x62\x60\x7a\x34\x95\x74\x43\x22\xce\xde\x64\x6f\x6f\x4f\x23\xce\xf4\xf0\x54\x2e\xf1\x08\x4b\xb2\x38\xde\x50\xe6\xf4\x35\x08\xc7\x31\xdf\x3e\x4b\x71\x86\xb2\xa2\xd8\x71\x90\xb8\xa6\x99\xc4\x32\x0a\xaa\xbb\x3f\x51\x8e\x39\x10\x92\x27\xcc\x30\x57\xee\x2f\x68\xd9\xe5\xe5\xf7\xce\xdc\x3b\xd2\x6d\xc0\x9d\x04\x47\x00\x54\x06\xf5\xcb\xb3\x78\xc6\xc1\x12\xc5\x10\xbe\xc9\x50\xfc\x26\x87\x68\x8b\xa7\xfa\x96\xe4\xef\x73\xdf\xcf\xbf\xcf\x46\x89\xef\x83\x2d\x7e\x33\x45\xd9\x08\x27\x6f\xa6\x28\x57\x3f\x70\x9e\xbc\x79\x33\xf8\x61\x32\x87\x99\x64\x45\xd8\x19\x53\x17\x8d\x07\x59\x38\xb3\x17\x39\xca\x8d\x37\x1f\xe1\xad\x2c\xb8\xad\xce\x42\x25\x50\x0f\xf7\xbf\x15\x91\x5f\x03\xea\x8e\x59\xaf\xe5\x5b\x0b\x3c\x86\x29\x20\x15\xf0\xa2\x2e\x27\x13\x63\x0e\xa2\x1f\xa6\x67\xee\xed\xf0\x16\x60\x4c\x82\x3b\xda\x01\xcd\x0c\x57\xa0\xcc\xcf\xd8\x8c\x2b\x6e\x7f\x9e\xfd\x10\xcf\x21\x09\xe2\xd1\x28\xc4\xa2\xf2\xfb\x2a\x4b\x34\x3d\x3e\x38\xda\xfb\xb6\x81\x9f\x1e\x4c\xa7\x87\xd5\x59\xb5\x02\xc0\xc1\xb1\xdc\x95\x81\x67\xd2\x3c\x17\x00\xfc\x2c\xa8\x24\xa5\x3e\xad\xa5\x06\x05\x12\xa8\x47\xe4\xeb\x19\xb5\x5c\xfc\xc7\x07\xfb\xdf\xda\xd9\xbd\xd3\x63\xb9\x3d\xf3\x7a\xc2\x14\xcd\x3c\x3e\x92\x5c\x44\x24\x89\xea\xf4\xe8\x60\x5f\x62\x71\xb5\x20\x72\x39\xa0\xc3\xfd\x83\x63\x89\xc4\x92\xad\x98\x1c\xef\x5c\xc7\xd6\xcb\x46\x59\xbd\xa0\x35\x7a\x90\xe8\x0f\xd1\x02\xf7\x44\x3e\x92\xc3\x3c\x93\xff\x66\x8a\x2c\xa3\x55\x77\xb6\x9f\xf1\x6a\xc7\x5c\xdf\xe1\xca\x35\xe8\x19\x6d\x70\x06\x1e\xa0\x3a\x37\xa0\x4b\x70\xe7\xfb\xe0\x19\xa7\xe0\x19\xad\x76\xe0\xc2\x1e\x84\x48\x93\xfe\x4d\x51\x2c\xb0\xde\x16\x7c\x3f\x02\x1b\xa8\x8e\x04\x98\x62\x97\x17\x80\xe0\x18\xd8\xcb\xc7\x21\x9c\x93\x1f\x6e\xd5\x61\xc4\x1a\xdf\x9d\x3d\x83\x87\xe0\x36\x44\xb7\x70\xa6\x7e\x73\xc0\xd0\x2d\x5a\x43\x2d\x3e\xc8\x3a\xb6\x18\x24\x78\xa3\x65\xdb\x07\x08\xc7\x8c\x3c\x09\x64\x2a\x9e\x0f\xc1\x12\x1b\x37\xc6\xc4\x1a\x79\xd8\x9a\x29\x48\xd0\x33\x0a\x96\xc6\xd6\xe3\x56\x5d\x08\x32\xb3\xaf\x55\x43\x55\x98\x27\xdd\x3d\x7c\x8b\xe4\x7a\x3d\x9e\x1c\x1c\x76\x31\xa1\xe6\x3b\x0e\xcc\x7e\x69\xa6\x96\xd6\x8b\x35\xea\x73\xf2\x75\xb5\x11\x28\x32\x52\x36\xca\x71\xaa\x75\x0d\x1c\xe4\xd5\x5a\x5d\x62\x0a\x22\xa4\xa5\x77\xe1\xfb\x6c\x88\x8d\xfb\xe0\x3c\xfb\x61\x39\x97\x92\x16\x88\x71\x1e\x2c\x47\xa3\x10\x0e\x71\x5c\x47\x65\xa8\x20\xa6\x32\x2e\xb5\x54\x06\x44\x51\x48\x31\x71\x90\x43\xdf\xcf\x83\x65\x88\x31\x66\xd5\x89\x42\x51\x2c\x8b\x62\x62\x40\x30\x14\xbe\xff\x66\x5a\x96\x0e\x46\xbe\x50\x16\x27\xf9\x82\x64\xb3\x08\x0c\x27\x10\x99\xa8\x10\xf2\x4d\x6d\x96\x6a\xc5\xee\x84\x92\xb3\x44\x0e\x8f\x14\xb7\x47\xeb\xd5\x12\xd5\xc0\x93\x4b\xe4\x68\xef\x44\x72\xdd\xb9\xdc\x20\xb6\x79\xb6\x46\x3d\xcb\x01\x4f\x31\x96\x53\xbf\x27\x7f\x32\xbc\x2f\x7f\x96\xf8\x40\xfe\x24\xf8\x48\xfe\x6c\xf1\xb1\xfc\x59\xe3\x43\x8c\x45\x51\x24\xf3\x36\xf8\x1f\xd0\x02\xad\xd0\x73\x4d\x31\xef\xd0\x06\xdd\x62\x2a\xb1\xfe\x1e\x73\x70\x0b\xd1\x23\x4e\x81\xcc\xb4\x0f\xd1\x13\x8e\xc0\x7d\x35\x31\xe7\x78\x82\xae\xf0\x73\x51\xc4\xe8\x1a\x93\xb3\x2b\xf0\x80\x9e\xe0\x8c\x15\xc5\x56\x3d\x4f\xa0\x55\xa4\x3c\xfd\x70\xae\x0e\xc5\x24\xf8\xd7\x45\x71\x2e\xc1\x7f\x0f\x7d\x1f\x6c\xf0\x23\xb8\xc3\xf7\xc1\x79\x88\xce\xd1\x2d\x44\x02\xca\x3c\x04\x5e\x07\xe7\x21\xde\x54\x12\xf3\x06\x66\x8f\x54\xc4\x6b\xc5\x0d\x45\x19\x19\xec\xcf\xec\x24\xcf\xd5\xfb\xa1\x79\x1f\xdc\xe9\xf7\x23\xfb\x7e\xae\xdf\xf7\x66\xb9\x5e\x13\xd7\xe8\xce\xf8\x08\xb7\x6a\x3c\x98\x55\xea\x73\xf5\x7e\xdc\x28\x61\xc3\xba\x9d\xbd\x99\xce\xb2\xa2\x58\x9e\x2d\x67\xd7\x4d\xbc\xb0\x64\x37\x03\x13\x88\x36\xd1\x76\x96\x81\x29\x44\xda\x40\x76\x96\x81\x3d\x88\x32\xbe\x21\xb3\x0c\xec\x43\x44\x1e\x48\xfa\x3c\xcb\xc0\x81\xcc\xc0\x16\xb3\x0c\x1c\xea\x27\x65\xa3\x30\xcb\xc0\x91\x2d\xa9\x5d\x21\x67\x19\x38\x56\xca\x99\xe9\xde\x71\x17\xb9\x7a\x89\x71\xbd\x1e\x0f\x4f\x0f\x24\x2b\xdb\x60\x43\xec\x36\x82\xe2\x8a\x23\xd1\x88\x96\x44\x99\xb8\xd0\x28\x8d\x32\x3c\x1c\xe6\xbe\x3f\xfd\xd7\x60\xda\xf8\x00\xa6\xe8\xcd\x04\x7e\x3f\x91\xec\x06\xf0\x9c\x0f\x8d\xbd\x28\x2b\x8a\xe1\xf2\xac\xc5\x88\x65\x76\x9d\xe5\xfd\x71\xfc\xe4\xd2\x7b\x7d\xd7\x66\x6f\x34\x63\xd2\xdd\xc1\x7c\x1f\x44\x38\x06\x11\xe2\xc0\xa5\xea\x10\x42\x14\x7d\x3f\x51\x5f\xd9\x28\x82\xf3\xe8\x07\x3c\x99\x47\x6f\xde\x48\x44\x8b\x24\x22\x12\xdf\x27\x41\xa4\x5c\xcf\x6d\xf7\xa2\x9a\x06\xbc\x99\x96\xb3\xbc\x44\xfb\xc7\xfb\xaf\x89\x0b\x87\xa7\x66\x59\x1b\xc1\x41\x41\xfb\x58\x89\xcd\x11\xe6\xc0\xcb\xb6\x24\xa6\x52\x52\xd8\xb1\xb9\x59\x9f\xe4\x1f\xf0\xe1\xb4\x28\x86\xce\x65\xe6\x76\xa5\x07\xa1\x8d\xaa\xdb\x70\x97\xc6\x2f\x25\x54\xf1\xa0\xda\x67\x14\x2f\x4b\xce\x67\x53\xc9\x6e\x0c\x31\x26\x81\x08\xc1\x8f\x9c\x27\x24\x52\x26\x87\x5c\xe9\xfa\x14\x0e\x7c\x23\x3a\xc9\x01\xee\x10\x21\x2c\x97\x1a\x48\x21\xc5\x52\xce\x21\xf3\xfd\xc6\x28\x98\x5e\x4d\xea\xd8\x82\x38\x6c\x2e\x7c\xd1\x7c\xf9\xb4\x44\x53\xad\x82\x9c\x1e\x1c\x4f\xbb\xba\x90\x8a\x25\x92\x52\x6c\x97\xcb\xd0\xd4\xb4\x41\x42\xbf\xb6\xe9\xc4\x28\x87\x2f\x29\x30\x91\x34\x14\x13\xad\xf7\x9a\x0c\x2a\x06\x39\xab\xd0\x6e\x8b\xc5\x59\xf2\xe6\xff\x47\xdb\x97\x68\x37\x6e\x63\x69\xbf\x8a\xc9\xe9\x61\x03\x45\x48\x26\xa9\x9d\x32\xac\x49\x27\xae\x74\x4d\xa7\x96\x29\x57\x92\xe9\x51\xa9\xfd\xd3\x14\x24\x31\x96\x48\x35\x17\x2f\x11\x39\xcf\xfe\x1f\x5c\x80\x9b\x44\xc9\xaa\xee\x9e\xe4\x9c\x32\xc5\x05\x04\x40\x2c\x77\xf9\xee\x77\x4d\xdb\x20\x2b\x1a\xf3\x25\x00\x3c\x8d\xee\x95\x05\x5b\xfa\x78\x0c\x63\x7b\xcb\xc7\xd2\x02\xef\x12\xba\x98\x6e\x67\x64\xab\xd3\xd5\xf8\x3e\x64\xce\x43\xc6\x2f\xea\x74\x45\xe2\xc9\xf6\xca\xb0\xd7\x57\x74\x7b\xa8\x12\x7d\x66\xf3\xc4\x65\x17\x5c\x61\xda\x6c\xe3\x97\x0b\x87\xcb\x0d\x22\x5c\xd3\x0f\x2e\x3c\xdf\x8b\x3d\x67\x7d\x01\x1b\xb5\x8a\xc1\x10\x36\x8e\x27\xdb\x6b\x6a\xd8\xeb\xeb\xed\x98\x17\x8f\x45\x05\x34\x0d\x71\xa9\x2a\x21\xa2\x16\x24\xc2\xc5\x86\x9e\xd4\x57\xac\x35\x5b\xc4\xb6\xcb\xf7\x2d\x12\x7a\xcb\x15\x1c\x83\xcc\x37\x1a\x8c\x8c\xbe\x7d\xb8\xd9\xc0\x52\xb1\x58\x07\x41\x58\x75\x10\xd5\x0d\xa2\x04\x50\xa9\xb9\x90\xe5\x51\x73\xec\x5d\x05\x63\x71\x43\x48\x3d\xe2\xd3\x78\xea\xcd\xc6\xa1\xa6\x31\x14\x4f\xc3\x96\x39\x23\x3e\xe6\x0a\x04\x90\xb0\xc4\xd3\x56\x2b\x9c\x8d\x43\x85\x52\x4f\xd7\x21\x9e\x38\x9c\x51\xbf\x9a\x0e\x29\x3c\xd0\x39\x4b\x22\x81\xe2\xbd\x01\x65\x65\x15\x0c\xe2\x50\x83\xb8\x40\x74\x75\x15\xa6\xa9\xc3\x2b\xe4\x0a\x64\x84\x77\x15\x6a\x9a\x73\x15\x4c\x7c\x08\x5d\x26\x7c\x21\xc0\x57\xd4\x98\xc4\x53\x4f\xd7\x67\x36\x9b\x3a\xfc\x8f\x77\x15\xd6\xcf\x54\x4c\x88\x0d\xb3\xe2\x22\x16\x3c\xaa\xc2\x52\x1f\x94\x0a\x06\x43\xce\xa5\x55\x3c\xeb\x5c\x0d\x27\x82\x71\xd5\x0e\x51\x8c\x82\x76\x04\xa4\x17\x06\x57\xe5\x3c\x4c\xca\x33\xe2\xb7\x07\xf2\xb8\xd9\x1d\x0d\x5e\x51\x84\xa5\x9e\x30\x1c\xca\x85\x48\xac\x49\xaf\x2f\x42\xf0\x95\xf3\xca\x05\x48\x10\x62\x1e\x58\x82\x10\xa3\x71\x75\x05\xc2\x69\xca\x94\x42\xd0\x55\x02\xc4\x2a\x50\x93\x49\x08\xd8\x5b\x21\x11\x53\xc4\x28\x9b\x7a\x33\x5e\x2e\x93\x42\x36\xb6\x8b\x23\x52\x68\x51\x6c\x02\xa5\xd9\x5c\x5b\x02\x31\xe8\x68\x83\xa1\x3b\x8e\x2f\x4c\xb9\x24\xcb\x9e\x10\x98\x00\x90\x28\xdd\xb0\x99\xf0\x75\xf4\x1b\xd6\xbf\x42\x56\x33\x8d\xd1\x48\x2e\xea\xd0\x97\x47\x2d\x28\xfc\x53\x57\x62\xcd\xbd\x09\x43\x7c\x59\x99\x1a\x33\xe2\xf3\x1d\xc8\x66\x65\xae\x7f\x27\x5f\xef\x40\x79\x71\x32\x5e\x8d\xbe\x75\xe2\x93\xe6\x1f\x4f\x44\x1b\x05\x21\xf0\x7d\x28\xe6\x38\x87\xe1\x88\xf1\xbd\xe3\x3a\xc0\xa1\xa3\x7a\xc7\xc5\x7f\x5b\x51\x3c\x5d\xcf\x32\x22\xce\x55\xef\x0a\xc0\xa6\x34\x76\xf8\x2c\x6b\xf6\x72\x67\x44\x18\xb6\x16\x61\xb0\x41\x0e\x39\x58\xb6\xad\xac\x12\xbd\x9f\x1d\xfb\x0e\xde\x02\x29\x8c\x0f\x8e\x3a\x46\xc1\xaf\x37\x64\x97\x8d\xbd\xc6\x9a\x9c\x6c\x9d\x0f\x6d\xc8\x32\x12\x23\xaf\xd2\xcb\x59\xc5\xd4\x30\xea\xf7\xbb\xdd\x86\x05\x6d\x97\x15\x10\xa1\xd3\xfb\x32\xcb\x99\x66\xe4\x84\x1c\x92\x96\x90\xf6\x47\x5d\xcb\x38\x3e\x38\xad\x91\x61\x88\x11\x04\x35\xa8\xcf\xc6\xfc\xcd\x5f\x9c\x25\x90\xb3\xa8\xdf\xe5\x52\x8b\x4a\x69\x80\x0e\x3f\x47\x21\xd5\x64\x08\xd7\x2c\xbc\x93\xe0\xb0\x6d\xc4\x27\x61\x3e\x95\x8b\x79\x15\x4f\xd4\x9f\x0b\x57\x90\x2d\x27\x65\x3c\x51\x3f\x24\xeb\xb5\x6a\xef\xf3\x2c\xa1\xfd\x45\xbe\x32\xc6\xe3\x29\x9b\xc9\xbe\xf6\xf1\x2e\xcb\x10\x93\x71\x03\x7c\x54\x7b\x18\x4f\x7c\xdb\x99\xf0\x0d\xd5\x56\x3f\xe6\xf8\x7c\x14\xc2\x16\x8b\x1b\xb9\x8a\x45\x0f\x33\x36\xa9\x74\x83\x1d\xc2\xec\x18\x9d\x69\x7f\x10\xd6\xd9\xf6\x62\xdf\x6a\x3b\x18\x0e\xcc\x9e\x90\x0d\xa4\xfe\xe5\x82\x80\x6c\x70\x41\x8d\xef\x95\xbd\x8e\x35\xec\x4a\x0b\x44\xdf\xe8\x0c\xb9\x14\xe0\xa3\xce\xa0\xc3\xa5\x8b\xb5\x10\x96\x4d\x8b\x8b\x01\x3e\xea\x77\xad\xce\x10\xb7\x17\x4e\x14\xff\x85\xbd\x90\x15\xbc\xb7\x3b\xea\x60\xf2\x48\x57\xed\x88\xc5\x64\x4e\x57\xed\x25\x8b\x63\x16\xbe\x0d\xc2\xea\x7e\xbb\x64\xf1\xf7\xe5\xb2\xb9\x8f\xb3\x8b\x0a\xbe\x35\x54\xa7\xc9\x72\x51\x4c\x16\x84\x61\xf2\x88\x62\xb2\xe3\xdd\x65\x33\xa1\x76\xe6\x86\x63\xb2\xf0\xc2\x28\x2e\x6c\x7b\x4e\x79\x1c\x79\xbf\x33\xdb\xc8\x30\x59\xa7\x29\x8a\xdb\xfc\x27\x35\x84\x81\x42\xa1\xa1\xa6\x25\x28\x24\xf1\x34\x9a\x91\x5d\xbc\x72\x62\x3b\x26\xdf\xdd\xde\xdd\x7c\xf8\xf2\xf9\xdd\xcd\xad\xed\x03\x75\xeb\x8a\xce\xb9\x58\xb4\x3c\xd8\x75\x65\x04\x0a\xf1\xe8\x0a\x56\x32\xfa\x52\x8b\x76\x70\x26\x8e\x30\x2b\x50\xdf\x46\x1e\xa8\x0f\xd4\xe1\xda\x33\xd4\x9b\x6e\x11\x83\xac\xbf\x0f\xec\xc5\x66\xd2\x0c\xee\x93\x6d\xc8\x1e\xbd\x20\x89\xec\x90\x8a\x47\x08\x4c\x7c\xd9\x18\x19\x07\x26\x18\xcc\xda\xd0\xe6\x34\x45\xf2\x88\x3a\x40\x9c\x88\x42\xb0\x86\xf0\x5f\xeb\x89\x07\x0d\xd6\x75\x3b\x96\x07\x44\x7d\x0b\xfc\xd0\x9a\x86\x3c\xc1\xe7\x38\x0d\x66\xd4\xc1\x98\xc4\x19\x79\x69\x12\x6a\x49\x28\x9a\x07\x35\x06\x03\x84\x2c\x22\xd7\x14\xc2\xa2\x9c\xb1\x30\xef\x84\xa2\x3e\x63\x7f\xec\x53\x1f\x2a\xc3\x15\x0d\xbf\xfd\xc0\x5e\x28\x65\x85\xc3\xb7\xa0\x9c\xf2\x50\x95\x43\x6f\x07\x84\xc7\x76\x03\x9f\x56\xcc\x2b\x02\x2a\x11\xcb\xc9\x28\xb9\x30\x55\xbc\x0d\xfb\x6d\xd9\x41\x54\x31\x88\xdf\xce\xfb\x12\xa2\x4d\xf2\x1f\xb4\x3c\x14\xfd\x94\x6f\xbd\xd2\x5a\xcb\xa6\xbe\x28\x7a\x46\xf2\xda\x8f\xe5\x2b\xb8\x70\xc5\x3f\x62\x3e\xca\x26\xf9\x70\xb2\x79\xad\xe4\x71\x26\x0b\x6a\x58\x6b\x41\xd3\xf3\xe9\x8a\x8f\xa6\x90\x42\x34\x13\x96\x79\x6c\x04\x9a\x54\x7c\x39\xe2\xd1\xb0\xa8\xe3\x38\x37\x22\xcb\x4e\x0e\xf3\xca\x85\xd5\xb6\x02\x29\xb7\x68\x4e\x00\x44\xe1\x28\x28\x1b\xec\x61\xe2\xcb\x06\xf0\x01\x8f\xf2\x1f\x01\x3f\x0f\x0d\x92\xa7\xe1\xd8\xe3\xc3\xc6\x87\xc6\xb4\x5a\x36\x93\x07\x39\x38\x54\x09\x33\xd2\x64\x5d\x2d\x6c\xcd\xd0\x3e\xf1\x91\x42\xea\xa0\x73\xed\xac\xa4\x83\xc7\x8c\xb2\x09\x83\x46\xd8\xb2\x8a\x63\x50\x2e\x42\xc4\xa4\x79\x8e\xf1\x21\x44\xa0\x74\xa0\x00\xcf\xbb\x60\x8c\x19\x65\x45\x83\x33\xb2\x72\xa2\x06\xdb\xaf\xa2\x48\x65\x3b\x16\x94\xed\xb5\x51\xe7\x4f\x76\xcb\x3d\x20\x9b\xf8\x68\xc5\x33\x85\xfd\x9a\xbf\x18\xea\xb3\x8f\x7d\xab\x88\x5b\x4b\xf1\x94\xd8\x71\x0c\x5b\xf0\x27\xda\x3b\x67\x3e\x6f\x32\x4a\xcb\xbb\x63\x5a\xde\x2f\xea\xb8\x06\x0d\xb2\x0a\x86\x14\x64\x14\xbb\x66\x4c\x9e\xec\x79\xf8\x66\xfc\xf1\x05\xd4\xf0\x36\x0e\x03\x7f\x79\x64\x8b\x66\xba\x7a\xf1\x2e\x97\xab\x80\x46\x8d\x09\xea\xb4\x10\x8f\x45\x60\xdf\xde\x92\x20\xaa\x2a\x16\xe1\x90\x14\xcc\x8b\x80\xcb\xb3\x41\xa2\x7b\xf0\xfc\xb9\xcd\xaa\x8b\x70\x86\x33\xd2\x38\x9f\xbd\xca\x7c\xe6\x8f\xc1\x74\xe6\x0f\x8e\x81\x75\xaf\xf8\xbc\x7e\x65\xd6\x96\x58\x48\xf1\x72\x20\xaa\x82\xa1\xeb\x53\x7f\x22\x66\xac\x2d\x49\xf2\xc4\x30\xc2\x13\xf5\x81\xbd\x70\x99\x82\x4d\x76\x72\xa1\x85\x91\x24\x44\x43\x33\xb3\x55\x38\xbb\x77\x87\x18\x73\xc5\x3d\xf2\xfc\x54\x3c\x2a\x2f\xcf\xca\xeb\x28\xaf\x50\xbe\x3e\xc8\x07\xe4\x2f\x71\x1f\x74\x85\x3f\x51\x99\x1f\x87\x5c\x0f\x29\xde\x4c\x14\x1f\x76\x83\x05\xe2\x23\x85\xcb\x6b\xdd\x06\x9f\x7c\xe3\xa6\x2f\x37\xf7\xa0\xdc\x9a\x97\x2c\xfe\x95\x39\x0f\x3f\x38\xb1\x23\x8c\xd0\x42\x8e\x77\x4a\xf5\xe8\xf8\xf6\x2f\xfc\x2d\xb0\xfd\xf7\x07\x83\x91\x29\xb6\x7f\xb9\xc1\x6f\xe9\x1a\x36\xf8\x15\x5d\x97\x1b\x3c\x79\xa4\x51\x7b\xc1\xbf\xde\x5c\x1e\x88\x38\xa3\x25\x35\x6a\x3b\x4a\x05\x78\xbe\x80\x98\x44\xd8\x90\xc5\x21\x58\xee\xef\x71\x46\xee\x6b\x94\xc5\x7c\x59\x95\x5d\x45\xa7\xb3\x8c\x6c\x9a\x95\x9b\x47\x14\xe7\xb7\x35\xb1\xf7\xc7\x53\x63\xc6\x95\x9e\x0c\x67\xe3\xfb\x72\x32\xd1\x23\x33\x7e\x53\xcc\x78\xb0\xc3\xe6\xd3\x7e\x6a\xce\x8e\xaf\x2c\xc5\x33\x4d\x6b\x82\x90\xf3\xcb\x62\xfd\x09\xd7\x89\x28\xb3\xab\xed\x13\xca\xf8\x34\x26\x6c\x86\x4f\xec\x21\x73\x54\x7d\xa8\x29\xdf\x04\x13\xad\x8d\xb3\x7c\xc5\xfa\x5f\xa6\x69\xb5\x37\x49\x66\x49\x46\x4c\x4c\x14\xe5\x7f\xb9\x8a\xf9\xad\x32\xda\xba\x51\x46\x5b\x73\x19\x6d\x5b\x95\xd1\xe6\xf6\x52\xd7\x89\xf8\xc6\xc5\x62\xf0\x2d\xc2\xd7\xa3\xd8\x2e\xe7\xcd\xc2\x17\x7d\x14\x82\x57\x80\x00\x9f\xa9\x18\x79\x9b\x81\xc7\xd4\x99\xbc\xa0\x10\xf3\x01\x2b\x70\x9c\x0e\xdf\x3d\xe7\x33\xea\x93\xb8\x90\x3d\x42\xb4\xae\xca\x1e\x47\xfb\x5d\xac\x7b\x22\xc5\x89\xc3\xf5\xe8\x3d\x2d\x8e\xaf\x7c\xd5\x77\xfb\x93\x17\xc4\x70\x5b\x94\x87\x62\x6c\xfb\x9a\xb6\x40\x3e\x61\x6d\x6f\x8e\x35\xad\x70\x0d\xf3\xdf\x0d\xe3\xea\x9f\x7a\xe9\xca\x89\xf6\xdf\xc8\x77\x83\x7a\x53\x8f\x6e\x78\x95\x97\xc2\x3b\x77\x27\xdf\x05\x81\x33\xd8\xe6\x43\x1a\x9a\x92\x7f\xe4\x13\x7b\xe3\x3c\x77\xc1\x9e\xdc\x13\x8b\xbb\xc0\x20\x87\xc9\x9a\xaf\x8a\x5d\xb3\x6f\x1c\x82\x68\x9a\x55\x21\xd3\x2c\xe0\x2b\xe6\xb0\x9f\x6b\x9e\x03\x2b\x57\x84\x86\x83\x41\x5f\xba\x62\xc5\xb2\xb9\xbf\x12\xca\xf5\x71\x51\xae\x9a\xeb\xc2\xce\xbd\x05\x83\xab\xc5\x0f\x41\xff\x19\x5a\x5d\x8b\x0f\x56\xae\x75\x59\xfd\xa3\xe6\x98\x7c\xe0\xce\xe9\x01\xd5\xba\xb3\x55\xb9\x8e\xb1\x7f\x9e\xaf\xe3\x2a\x26\x2f\x74\x3e\x81\x8c\x20\xb6\xea\xcc\xe7\x2a\xb9\xa7\xc1\x34\x9e\x91\x0d\xbd\xd7\xb4\xca\x92\x46\xee\xe8\x3d\x79\xa0\xbb\x8c\x3c\x35\x78\xca\x36\xd3\x78\x36\x76\xd0\x86\xc4\x04\x4a\xe1\xb2\xc6\x09\x4d\xbf\x26\xc0\x60\x10\xbb\x32\x5b\x95\x04\x23\xcd\xcf\x2a\x68\xa9\x69\xca\x02\x01\x7f\x64\x73\x39\x99\xad\x2e\x59\x7c\xec\xdd\xf9\xe3\x79\x50\xfd\xd1\x32\x56\x4e\xf4\xcf\xd4\xa1\xf2\x51\xfc\xd3\x0d\x27\xbe\x6c\x3a\xce\x00\x0c\x8d\x62\xd2\x00\x0d\xbb\x4f\x53\x05\x2d\xd3\x74\x93\x63\x0f\x34\x4d\x59\x57\x0d\x18\x48\x6c\x70\xf9\x1a\x8c\x84\xcb\x1a\xe1\x0c\x63\x8c\xef\xa8\xdf\xae\x2f\xbb\x00\x64\x9f\x93\x17\x4c\xdc\xb6\x08\xa1\x44\xb8\x70\x05\xf2\x3a\x28\x86\x9c\x99\xcf\xb0\x75\xde\x91\x1b\xfa\x3c\x7d\x99\xa1\xe5\x64\x97\xd9\x2d\x83\x98\x58\xa1\xcf\xe4\x23\xad\x55\xe2\x19\x96\x06\x93\xaf\xab\xb7\xb4\x1e\x12\x0a\xd5\x43\x40\x32\xff\x85\x2a\x4b\x4d\xab\x3d\x58\x4a\x6c\x70\x1f\x61\xb4\x37\x66\xad\xd6\x18\xc7\xfc\x9d\xac\x54\x7a\x95\x18\x5e\xd1\x32\x70\x86\xc7\xb7\x69\x8a\xd0\x1d\x65\xa8\x0e\xbb\x8f\x10\x23\x77\xa4\x60\x9c\x78\x44\xb2\x4c\x72\x57\xfa\xdd\x61\x83\xf0\xf9\x06\xe1\x93\x70\xfa\x92\x6f\x10\x61\x75\x83\x98\xf3\x35\x2d\xc3\xb8\xb2\xa3\x6f\xc8\xa6\xe6\x19\xba\xc3\x04\x7d\x4c\xd3\x2f\x58\xd3\xd0\x13\xca\xc7\x2e\x26\x4f\x08\x06\x10\x26\x73\x4d\x7b\x02\x5a\x0f\x15\x63\x82\xbe\x88\xa4\x12\x4f\xe8\x05\x93\xa5\xa6\x6d\xda\xa0\x8a\x16\xab\xb5\xfc\x9d\x9b\xd5\x1e\xa6\xf1\x8c\xde\x91\x10\xed\x24\x55\x8a\x62\x70\xdd\xc8\x65\x73\xfb\x4e\xa1\xf7\x19\x79\xc0\x64\x85\x78\x4b\xc9\x32\x4d\xfd\x76\x21\x8a\xf3\x73\x64\x8e\xc9\x5d\x96\x91\x8e\x61\x18\x27\x50\x5d\x42\x02\x03\xf3\xd9\xa8\x33\xe8\x8b\x45\x6c\xd4\x29\xc4\x39\x61\xf0\x39\x6a\xfc\x2d\x41\xcb\xe0\xd9\x71\xa9\xd3\x5e\x90\x84\x7a\xed\x05\x89\xa8\x31\x8e\x4a\x26\xdf\x28\x8f\x9c\x5c\x00\x76\x69\x1c\xa2\x98\x2c\x70\x9a\x0a\xd3\x4b\x82\x18\x59\x00\xb3\x25\xe9\xf4\x8f\xa3\x18\x73\xbb\xde\x46\xe4\x69\x3a\x65\x63\xa7\x97\xed\x4b\xb0\x7b\xaa\x97\xed\x4b\x75\x1a\xcf\xb8\xdc\x5b\x58\xd3\x2a\x66\x36\x36\x0d\x81\x42\xfc\xf0\xbe\x00\xef\xb2\x32\xd7\x44\x46\x7a\x66\xa7\x73\x1c\x77\xb0\xef\xbe\xab\x3b\x18\x2b\x6e\x8b\xd2\x6e\x5a\x89\x42\xab\x8d\x2a\x70\xe0\x95\x6c\x18\x45\x3e\x9e\x8f\x0b\x18\xca\x31\x86\x25\xbc\x78\x96\x8b\xfc\x96\x35\xe8\x1f\xff\xcc\xa3\x9e\x91\x3b\xf4\x06\x9d\x9e\x70\xe8\x5d\xaa\x97\xcd\x16\x59\x52\x45\x8b\xd0\x40\x58\xf5\x49\x42\xd5\x2b\x55\x2f\x08\x5b\x54\x85\xf2\xe9\x83\x12\x9d\xaa\x17\xaa\xee\xeb\x7f\xa4\xea\x1f\xf5\x00\x39\xb8\x1d\xb2\xed\xda\x01\x62\x71\x55\xfb\x7b\x12\xc4\x63\x15\xeb\x7f\x54\xff\x88\x49\xa2\xab\xd7\xaa\xee\xea\xea\xd5\x25\x50\xc3\x5c\xab\x02\xa9\xd5\x3b\x73\xc7\x1d\x59\x46\xaf\x83\xdb\xb9\x36\x59\x74\xcb\x01\x84\xb4\x03\x80\x6e\xa7\xdc\x37\x5d\xb0\x14\x77\x3a\x80\xf5\x38\x62\x84\x7f\x65\x47\x8d\xea\x9a\xec\xf8\xf0\x13\xf2\xae\x22\xc2\x8c\xee\x21\x53\x50\x67\x38\x28\x26\x11\x51\x4c\x50\xbd\xdc\x69\x34\xa3\x09\x89\xb3\x8c\x0c\x4f\x00\x58\xa4\x25\x34\x28\xc1\xb0\x65\xa3\x6a\x26\xe9\x23\x18\xd3\xa0\xbd\x80\x33\xa2\x12\xf5\xbd\xa8\x7a\x5f\x3c\x65\x42\x54\xcd\x08\x14\x7e\x06\xfc\xb4\xf0\x0a\x54\x03\xfa\x90\xa9\xc5\x78\x2f\xa8\x0f\x59\xfc\x5c\xc9\x63\x8c\xba\xfc\xb7\xd0\x57\x19\x08\x5a\xbd\x4e\xf7\xd0\x21\x73\x04\x99\xd8\x1b\x9e\xd1\x1f\x4d\xdd\xe9\x00\xd4\x69\x0c\x10\x84\x78\x22\x3a\xc6\x21\x1e\x32\x78\xc7\x40\x22\x07\xea\x83\xfd\xdb\x6c\x00\x1e\x1c\x77\xd2\x0b\xcf\x78\xd7\xec\x77\x71\x1b\xd8\xc0\x88\x27\x1c\xb7\xce\x7d\x44\x1c\xfa\x83\x13\x57\xfc\x73\xb0\x28\x2e\x59\xfc\xc5\xdb\x30\x92\x50\xa7\x1d\x07\xef\x6e\x3f\x1e\x78\x44\xc2\x43\x6f\x84\x6a\x74\x86\xbd\x96\x31\x68\x59\xbd\x2f\xc6\xc0\x36\xfa\x76\x67\xd4\x1e\x8d\x46\xff\xa3\x2a\x54\x02\x67\xf8\x72\xc0\x5f\x87\x5a\x3d\xa3\xf2\x9f\x89\x71\x86\xf7\x31\x0e\xfb\x8f\x7c\x70\x3e\xf0\xdb\x26\x95\x5b\x20\xf7\x73\xf4\xd6\xf3\xbd\x98\x21\xb7\x94\x56\x70\x8e\xec\xfd\xec\xf8\xcb\x12\x61\x0c\x54\xb6\x17\xb1\xb7\x61\xb9\xd7\x7c\x2c\x36\x71\x90\x70\x98\x08\xd5\xfb\xf9\xcb\xf7\x6f\x93\xf5\xfa\xaf\xcc\x09\x11\x26\x7e\x71\xf2\xbd\xb7\x5e\x7b\x11\x73\x03\x7f\x2e\x22\xf8\xd8\x95\x31\x51\x5b\xaa\xcd\xae\x47\xa3\xd1\x68\xa2\xea\xaa\xad\x16\xf3\x2c\xd4\xa5\x0a\x16\x4e\xfa\x76\x97\x18\x58\x57\x5b\xaa\x1e\xa0\xa2\xb4\xc0\x8f\x57\x08\xeb\x26\xb1\x0e\x2f\x42\x73\xb1\xbc\xf2\xa5\x7a\xe5\xcf\x41\x12\x46\xc5\x25\xbb\x56\xa2\xe7\x27\x31\x3b\x72\xf1\xb6\xa8\xb7\xb8\xd8\xe6\x17\x7d\xd2\x81\x1f\xff\xa3\x02\x9c\xc5\xec\x5a\xbd\x43\x8c\x45\x33\xac\xb3\xf4\x83\x76\x87\xd6\x31\x6f\x2b\x7c\x9f\x1c\xb4\x53\x7a\x92\x68\x0c\x6c\xd9\x0b\x27\x59\x43\x2a\xd0\x18\xc7\x34\xbf\x5a\xc6\x43\xc9\xa4\x8b\xcd\xe0\xfe\x12\x2c\xbe\xf2\xfc\x0a\x30\x3b\x28\xed\x99\x04\xdc\x36\xdf\xac\x1a\xc1\xf2\x2e\x66\x6c\x07\x82\x33\xf8\xaa\x3c\x32\xbb\x5c\x5f\x72\xcb\x05\x3a\x01\xe8\x6a\x4f\xea\x45\x42\x71\x5a\x94\x50\x9f\x35\x80\x52\x7a\xfc\x86\x6d\xb9\x94\xaf\x8a\x3d\x01\x1c\x43\x87\xfb\xc2\x9c\xae\xda\x7f\xfa\xf9\xc7\x1f\xff\x7a\x77\xfb\xdd\xdb\xef\x3e\xbf\xbb\x7b\xf7\xe5\xe6\xf3\x77\x5f\x3e\x7e\xbe\x25\x4b\xba\xa8\xf9\x7b\x5f\xa8\x30\xe1\x91\x7b\x5a\x58\xcc\x36\xb4\x30\xa3\x91\xbb\x6f\xde\x36\xc8\x82\xac\xc8\x03\x79\xc2\x3b\x3e\x32\x58\x9e\x6e\xe4\x99\xdc\x90\x8f\xe4\x76\xff\xb3\xc6\x94\xd2\x95\xa6\xbd\xcb\xad\x41\xef\x40\x27\x9f\x6b\x5a\xcc\xd7\xae\x4f\xf9\xe9\x4f\x5c\xc3\xda\x43\xd5\xbd\xd8\xf0\xe7\x5e\xfc\xd9\xd8\xfb\x38\x9c\xaa\x8b\xfe\xc2\x2f\xbf\xe8\x19\xf7\xf1\xef\xfe\x65\xcf\x84\xfb\x1b\x17\x96\x3e\x55\xe5\x0f\xf2\x9e\x7e\x9a\x2e\x67\x69\xfa\x69\xaa\xfe\xc7\x7f\x14\x9d\x3a\x4b\xd3\x95\xa6\x7d\x9a\xae\x66\xe4\x1d\xe5\x4d\x79\x9f\xa6\xb7\x68\x85\xc9\x0f\x54\x05\x87\xb7\x0a\x54\x6f\x9f\x72\x95\x25\x4d\xdf\xf3\x46\xff\xa0\x69\xe8\x99\x7a\xe8\x87\x72\xb9\xe2\xf2\xc7\xa3\x42\x73\xda\xb4\x4a\x6e\xab\x67\xd0\x72\x34\x0d\x29\x6b\x4d\xf3\xd0\x33\x97\x8c\x1e\x35\x0d\x39\x13\x07\x3d\x93\x47\x6c\x37\xa8\x52\xcf\xd3\xe5\x8c\x0b\xfe\xcf\x64\x49\xee\x30\x26\x2e\x7a\x26\x5f\x88\x62\xc0\x1e\x0d\x18\xfc\xe9\x97\x19\xbd\xc3\x98\x8f\x30\xae\xff\xbe\xd7\xb4\xf7\x10\x3f\xad\xc0\x4f\xf4\x1b\x55\x0c\xf2\xae\x61\x40\xbc\xaf\xac\x98\x19\x26\x48\x59\xa7\xe9\x13\xe6\x7d\xb0\x9c\x29\x94\xbe\xe3\x6f\xfd\x44\x96\xe4\x1d\x26\x5b\xbe\xf9\xbe\x23\x2b\xec\x2d\xd0\x0d\x15\x96\xdc\xc8\xbe\x45\xf7\xe0\xaf\x8b\xec\x87\xc9\x3b\xfb\x96\xab\x09\xb2\x73\xec\x5b\xb4\xc1\x19\x79\x02\x87\xc5\x47\x3e\x26\x6e\x30\x9a\xa7\xe9\x6f\x5c\x2f\xfc\x28\xc6\x08\xd6\xb4\x08\x7d\x22\x1f\xc9\xcd\xf4\xe3\x4c\x6a\x73\x21\xca\x93\x17\x31\x02\xfd\x56\x51\x22\xf8\xe3\x19\xb9\x29\x66\xfb\x0d\x20\x90\x8d\x13\x38\x09\x08\x7c\x12\x86\x60\xa1\x38\x88\x9d\xb8\x37\xac\x69\x0b\xed\xc5\x49\xc1\x3c\x8f\x96\x82\x7c\x09\xe2\x90\xee\x32\x3c\x0e\xc0\x5f\x95\xa6\x0e\xe8\xa6\xd2\xb8\xed\xf1\x3d\x1b\xe7\x50\x3a\xf3\x04\x38\xfa\xa4\xf8\x2d\x5b\x38\x50\x9a\x39\x18\xd1\x2e\x23\xe6\x31\xa7\xc7\x20\xcb\xf0\xd4\x9c\x71\x29\x7b\xd8\x3b\x25\xb8\x49\x33\x50\x50\xda\x73\x3c\x1a\x16\xf4\x6e\xc2\x8a\x88\x35\x2d\x40\x5e\x9d\xc0\xe2\x15\xc0\xa2\x33\xd9\xbb\x1f\xc5\xd8\xde\x71\x21\xca\xea\x0f\x07\x83\x23\x62\xdb\xee\xfb\xdb\xdb\xcf\xc9\x9a\xfd\xe4\x45\xb1\x6d\x90\xef\x6f\x6f\x81\x21\xea\x07\xe6\xae\x1d\x41\xc8\x2a\xce\xfe\xc2\xbb\x39\xbf\x69\xed\x31\x3f\xfe\xcc\xdc\x58\x9e\xf8\xe1\xe3\xfb\xfa\x2f\x21\xb6\x94\xbf\xbf\x04\x0f\xcc\x87\x9f\x26\xf9\xc1\x89\x9d\x2f\x92\xd8\xe5\x5d\xcc\x36\xf2\xae\xb7\x5e\x51\x89\x3f\x7f\x79\xff\xd3\x77\xeb\xf5\xf7\xc1\x5a\x92\x98\xcb\x73\x07\x27\xde\x06\x61\x9e\xc2\x4d\x9e\x11\x8c\x57\xe5\x39\xe0\xd8\x92\xc5\xbe\xf7\x36\x8c\x6f\x66\x02\xd0\x64\x10\x20\x4c\xfb\x10\xcc\xd9\x7b\x67\xcb\x7f\x06\x73\x26\xab\xf8\xc9\xf1\xfc\x3c\x17\xac\x7c\xf8\xd3\x3a\x59\x7a\x7e\x71\x90\x97\x71\xfb\xcb\x8f\x3f\x81\xe2\x2a\x6f\xbb\xfd\xe5\x47\x11\xcc\x58\xfe\xfe\xe4\xc4\xab\x5b\xb6\xac\x9c\x08\x3c\x3f\x2e\x7f\xd6\xfa\xea\xf6\x97\x1f\x45\xdf\x04\x61\xde\x31\x82\xbd\xeb\x4f\xc9\x62\x51\x96\xca\x3f\xd1\xed\x8a\xb1\xbc\x98\x2a\x39\xdc\xfe\xa9\xfc\x77\x90\xb8\xb2\x96\x7c\xfe\xf6\x7b\xc6\x71\x0c\xed\xa0\x33\x18\x59\xb8\x0d\xea\x33\xba\x5c\x78\x21\x5b\x04\xcf\x5f\x2f\xd1\xd7\xb9\x8e\x2f\xbd\xda\xf4\x51\x42\x4d\xd3\x43\xf0\x49\x8c\xac\x61\xb7\x7f\x64\x98\x1d\x50\x43\x8a\x50\xf3\x8c\x98\x56\xaf\x21\xd4\xb7\x5e\x91\xca\xfb\x2e\xdf\xdf\xbe\xbb\x49\xf3\xb4\x8f\xed\x98\x45\x31\x0a\x71\x46\xba\x46\x6f\x78\x1c\xa8\x7a\x58\x0c\x9a\xd8\xde\x76\x15\xf8\x2c\xf5\xb6\xc1\x3c\xf5\xb6\xce\x1c\xb7\xdf\x38\xdb\xed\x9a\x09\xa2\xe8\x4b\xaf\x2c\xbc\x63\x19\xc6\xf1\x15\x45\xe2\x89\x4a\x03\x6f\xe5\x3d\xea\x36\x0c\x5c\x16\x45\x2a\xa5\x21\xb8\xc2\xe1\x17\x2f\xb2\xdf\x3f\xb1\x80\x1e\xd6\xf7\x89\xdd\x1b\x11\x9a\x28\xed\x37\xee\x2a\x0c\x36\x0c\x57\xeb\x07\xb7\x9f\x28\xac\x5f\x8f\xc8\x0b\x91\x5a\xe4\x48\x92\x1c\xe2\x90\x79\x53\xc5\x69\xaa\xaa\x5c\xd5\x36\x8f\xc1\xfc\x00\x64\x52\xac\x60\x4e\x51\x55\xe2\x52\x2f\x6f\x1d\xd8\x75\x7e\x60\x7e\x40\x22\xea\x6a\x9a\xdb\x7e\x64\x61\xe4\x05\x7e\x94\xa6\x90\x72\x52\xfe\x24\x0b\x1a\x69\x5a\xd4\x7e\x1c\x8e\x17\x93\x80\xa2\x90\x2e\x72\xc2\xb8\xb6\x8a\xf1\xd4\x98\x5d\x75\x27\xa6\x1d\x4e\x8d\x19\x8c\x2f\xdb\xe1\xdb\x37\x0a\xa9\x93\x8f\xcb\x9b\xf9\x92\xe5\x83\x12\xe3\x34\xe5\x77\x5d\xd3\x41\x17\x6b\x5a\xf5\xb6\xef\xa1\xc3\xca\x1b\x35\x0d\x05\x94\xdf\x5b\x8d\xf1\x0c\x34\x4d\x0f\x32\x32\xec\x58\xa3\xe3\x0b\x77\x7d\x5a\x7c\xc7\x07\x8b\xa0\x5e\x94\x85\x7f\x6d\x5f\x1e\x9b\x1b\x03\xd3\x30\xcc\x23\x73\x03\x32\x4e\xe6\x46\x1d\x41\x42\x5f\xe1\xf4\x50\x89\xea\x45\x15\xd3\x4e\x85\x9f\xfb\x5d\x74\x53\xe8\xd7\x90\xbc\xe0\xa7\xc0\x75\xd6\x4c\x2c\x28\x70\xa2\x38\x84\x5d\xf2\xe3\x42\x9d\x65\x04\xa4\xee\x73\x36\x27\x61\xde\x6b\x2f\x84\xc3\xa2\xc1\x5d\x61\x59\x9d\xae\x29\x84\x72\x30\x1f\xe6\x62\xb9\x65\x9e\x30\x05\x0a\x2c\x4f\x19\x39\x96\x7b\xab\x81\xac\x4f\x18\x30\xc9\x92\x0a\xbf\x39\x97\xf3\x7c\x3a\x9f\x84\xf6\x72\x12\x4e\x1f\x67\x69\xea\xa2\x47\xb2\xcb\xb0\x8d\xc4\xcf\x5d\x56\xb1\xba\x82\xcc\x03\xe1\x44\x02\xe6\xb8\xa5\x6c\xba\x98\x91\x35\x8d\xdb\x7e\x20\x78\x59\x7e\x64\xf1\x04\xad\x28\x97\xb4\x17\x7c\x24\xac\xda\xd2\xc9\xce\x6f\x54\x22\x34\x9f\x2c\xec\x47\x1d\x2d\x27\x6a\x5b\xb5\xd5\x7f\x53\xb1\xbe\x20\x71\x5b\xc8\x41\x58\xd3\x8a\x60\xb4\xb5\x10\xc6\x65\x4e\xfe\x62\x51\x5b\xe3\x3c\xdb\xd9\x38\x41\x5b\xb2\xc6\x19\x8a\xdb\xd1\xca\xd9\xa4\xe9\x5a\xd3\xd6\x70\x88\xb9\x00\xba\x25\x2a\x3f\x56\x41\x96\x74\x78\x6d\xc8\x16\x84\x6d\x2e\x3b\x8c\x8e\xed\xd5\xb5\xb3\x85\x65\x52\x51\xe2\x82\x54\x8d\x55\x09\x9d\x32\x32\xea\xf4\x5e\x31\x9e\xf8\xa8\x3f\xea\xf7\x7b\x95\xa0\x75\xf1\x79\xe5\xf7\x1f\xe6\xee\x2a\x30\x67\x38\xa5\xa6\xe5\xe6\x43\x22\xa1\x4e\x05\xcd\x4c\x22\xfa\x99\x2d\x6f\x9e\x2b\x79\xac\x4f\x28\x3e\xb9\x0b\xd7\x41\x31\x57\xd8\x14\xef\x30\xd4\x62\x57\x38\x48\xd9\x74\xdd\x04\x8c\x1d\x64\x64\xa0\x50\x35\xb7\xc8\x72\x59\x7c\xab\x69\x4d\x45\x29\x26\xf1\xe9\xa5\x73\x99\x9b\x26\x61\xb1\x51\x45\x96\x43\x84\x7c\x2e\x5b\xee\x45\x73\x10\xbf\x7a\x62\x9a\x34\xbd\xdf\xe7\x77\x2d\xd6\xce\x32\xa2\xaa\x4a\x7c\x5e\xc9\xcb\xf6\xe5\x74\x3d\xc3\xc4\x6f\xb3\x67\xe6\x36\x3c\xc3\x00\x16\x96\xac\xd7\x19\x3c\x80\x54\x15\x13\x85\x65\xc2\xbf\xba\x4d\x53\x65\x95\xa6\x72\x4a\x3e\xca\xd2\xc8\x9c\x32\xb4\x26\xd0\xce\x3d\x16\x5d\x12\x96\xf8\x76\x06\xaf\x2c\x80\x7f\x94\xd2\x20\x4d\x1d\x20\xfc\xe1\x17\x26\xd0\x35\x13\x09\x45\xce\x63\xde\x1f\xcb\x8c\x6b\x21\xce\xec\xbd\xab\xb1\xd4\xaf\x44\xce\xae\xfc\xaa\x99\x65\x78\x9c\xc7\x6d\x57\x54\xbc\x98\xcc\x81\x03\x24\x44\x11\x59\x93\x39\x5f\x65\xb3\x85\xa6\xb9\x28\xe2\x8d\x28\x07\x3d\xc4\xb2\xf7\x1a\xb6\xc0\x46\x43\x81\x04\xd0\xef\x87\x34\x02\x82\xb4\x19\xf3\x0f\xb6\x69\xe2\x92\x84\x44\x7c\xad\x29\x3d\x10\x5b\xb2\xa2\x09\x79\xa4\x06\x99\x53\x45\x59\xf0\xc9\xc8\xd7\xa2\x0e\x1e\x3f\x5e\xb9\x22\x7a\xe4\x91\x2f\x21\x8e\x5c\x42\xe6\x93\x39\x72\xa6\x8f\x33\xf2\x28\x3c\xf7\x8f\x33\x12\x5d\x1b\x9a\x16\xa2\x2d\xc6\x2b\x2a\xde\xb4\x25\x01\xda\x16\x21\x2a\x2b\x12\xb5\x4c\xdc\x32\x41\xb3\xe2\xa5\xac\xae\xe9\xc8\x30\x06\xe6\x68\x64\xf5\xba\x83\xae\x31\x1a\x99\x87\xb6\x95\x9b\x67\x97\xb1\xf9\x45\xbc\x62\x17\x8e\xeb\xb2\x2d\x58\x44\x65\xec\x89\x28\x59\xc5\x63\x36\x5d\xcd\xe8\x36\x5b\xe9\x7a\xf6\xa8\xeb\xb9\x6a\xbe\xca\x32\xd2\x19\x75\x4e\x85\x84\x9e\xa3\xf5\x14\x4c\xdd\x37\xcf\x31\xf3\x23\xef\x7e\xcd\x50\xa1\x4a\x03\xf7\xb2\xbc\x10\xf8\x11\xda\x65\x22\x75\x1f\x7c\x84\x57\x22\x84\x4e\x58\x5f\x85\xa5\xaa\x1a\x6f\x50\x84\x7f\xe6\xf6\x0b\x5f\xda\x2f\x8c\xe3\x16\x0b\x39\x46\x19\xce\x44\xc0\xa0\x79\x70\xab\x7f\x70\x2f\xf1\xf3\xbb\xad\xc3\xbb\x2b\x09\xfc\xe2\xda\xec\x18\xd7\x42\x1e\x6b\x4f\x90\xa0\xf1\x19\x12\x9c\xb2\xa1\xe4\xdc\x97\xac\x12\x79\xc7\x57\xee\x81\x35\x68\x10\x39\x9b\xdd\x1d\x65\x14\x56\xa1\x4e\x4e\x67\x02\x1d\x4f\x1c\xbe\x8c\xb9\xcd\xdc\x10\x4c\x8c\xf3\x6a\xd4\xce\x74\x46\x02\x6a\x8c\x83\x2b\x96\xb3\x05\xcd\xa8\xea\x4c\x55\x3d\xd0\xd5\x99\x3a\x06\x96\xaf\x9c\x0e\x17\xa9\xdf\x13\x07\x58\xc6\x0b\x6b\xd0\xf7\x48\xd5\xc3\xf6\x6f\x81\xe7\x03\xeb\xaf\xae\x62\xb5\x88\x17\xe2\xcf\x0a\xa6\xf0\xca\x70\xc8\xcb\x6a\xdf\x7b\xfe\xbc\x4a\xb8\x50\x18\x01\xca\xd8\xc3\x3d\x02\x31\x62\x56\xa3\x99\x2f\x42\x94\x83\x57\xfd\x9c\x83\x69\xff\x89\x32\xfa\x8a\x97\x59\x25\xc6\x08\x27\x2e\x62\xa4\x08\x0e\x0a\xb0\xcd\x8a\x34\xc3\x41\x99\x92\xb6\x1e\x4f\xa3\x69\xc8\xa9\x78\x75\xaa\x97\x88\xc3\x3f\x21\x97\xbb\x5f\x97\xb3\x0e\x35\xf9\xa6\x20\xfa\x49\x01\x61\x7c\x2d\xc0\x66\x1f\xe7\x7a\x65\x4d\x02\x14\x4e\xe3\x19\xb6\xf9\xbf\x9a\xc6\xff\x9d\xb2\x59\x96\x11\x88\xf1\x3f\x3e\x77\x47\x5d\x4b\x5a\x71\xa4\x21\xd5\x6b\x8c\x81\x39\x6e\x83\x16\xde\xf3\x22\x92\x33\x9e\x7a\x90\x43\x7b\xcf\xf8\x17\x4c\xf9\x0a\xc0\xeb\x63\xf6\xcd\x06\x82\x83\x03\xe6\x89\x4a\xec\x9b\x47\x55\x35\x77\x24\x12\x87\x5e\x7e\xfd\x03\x9a\xfe\x41\xfb\xe3\xff\x9b\xa5\x5f\xe7\x3b\x93\x58\x59\x7a\x35\xfd\xdb\xf5\xec\xcd\x35\xbe\x5c\x12\xb7\xe1\x3a\x3e\xe5\xdc\x84\xcd\x23\x17\x52\x7c\xbd\x08\x69\xdb\xd2\x3c\x20\x9e\xac\xa8\x5b\x0f\xed\x50\x28\x57\x6b\x10\xd7\xb2\x22\x2e\x8c\x38\x98\xc8\x71\xb8\x20\xab\x72\xe7\x2e\xf7\xec\x7c\x99\xf3\x4a\xb6\x33\xb1\xe0\xa9\x7f\x50\xe5\x32\xa3\xfe\x41\x85\x75\x47\xd5\xf2\x33\x17\xb1\x38\xf1\xff\x8a\x13\xac\x88\x58\xf3\xb1\xb8\xf6\xc7\x83\x6b\x6b\x79\xe5\x4a\xb5\x1d\x1a\x4d\x3d\x79\xda\x24\x2d\x13\xcf\x44\x80\xe4\x58\x3a\x08\x6c\xe1\xd5\xd5\x3d\xc8\x43\x4d\x69\x11\xca\x7f\x11\x42\xbc\xe5\xf5\x36\xf7\xd2\x07\xc8\xbd\x34\x0b\xbc\x9b\x24\x31\x09\xed\xc5\x15\xdd\x4e\x4a\x2e\x8e\xe9\xa2\x65\xce\x26\x45\x1b\x4d\x6c\x8b\x53\x7a\xf5\x54\x98\x39\x34\x99\xba\x2d\x73\x96\xed\x87\xcb\x38\x13\x55\xb5\x1d\xb0\xef\xc1\xcc\x69\xc0\x8b\x35\x01\x2e\x35\x2d\x06\xfa\x2b\x0a\x83\x46\xd3\xe2\xea\xf4\x61\xe8\xc0\x2a\xd1\xcc\x9a\x87\xd3\xb4\xe1\xde\x3a\x69\x5e\xf3\x3d\x82\x33\x8f\xff\xdb\x7c\xbd\x4e\xfd\x86\x6b\xb1\xb8\x55\xef\x01\xc2\x69\x5a\xae\xbb\x95\x2b\x2a\x46\x38\x23\x60\x65\x7d\x7d\xe2\xec\xb2\x76\x5d\xb7\xac\x74\x86\xdc\xe8\xc5\xf5\x7d\xea\x9b\xc2\x63\x0c\x03\x19\x36\x6c\x88\xda\xeb\xf4\x3a\xc7\x0c\x3e\x3b\x08\xc9\x1a\x9d\x88\x17\x3c\x30\x96\x34\x81\x55\x21\x91\x6c\x14\xac\x99\x00\x62\x03\x1d\xa3\xa6\x21\x48\x1c\xbe\xb7\xd0\x4d\xe4\x65\x80\x01\xe6\x87\x84\x61\x70\x4a\x0d\x7a\x0d\x4e\xa9\x53\x16\x92\x79\x99\x46\x23\x3f\xcc\xd9\xe9\xb9\xd4\x33\x30\x4e\x74\x78\xc5\x33\x2f\x14\x27\xa1\x42\x0d\xeb\x6a\xb1\x12\x42\x88\xe6\x37\x58\x9f\x3d\x49\x61\x4c\x54\xe7\x28\xf4\x7e\x90\x65\xb8\xcd\x27\x0a\x81\x38\xec\x33\xc2\xe4\x8b\x78\x38\x55\x32\xf6\x9f\xf6\x36\xcb\x84\x2e\x48\xfd\x5d\x05\xdd\xfb\xc0\x12\x81\x8c\x9a\xb7\xb8\xdc\xd6\x6e\x73\x4f\x64\x80\x62\x3c\x91\xab\x62\x4c\x54\x15\xdb\x45\xc0\x5a\x26\x0f\x33\x02\xf8\xc5\x73\xa2\x6b\x85\x97\xf0\x15\x0f\xbf\x47\x8a\x7c\xef\x41\x53\xd0\x1b\xf2\xea\xa9\xcf\xb9\x96\x2e\xa0\x2b\x21\x72\xa8\x57\xdb\xf6\x1d\x7e\xa1\xea\x5d\x0a\x50\x4c\x1c\x2c\x00\x1b\x83\xc1\x89\x28\xc4\xde\x68\xd4\x05\x18\x55\x21\xf7\x14\x31\x8f\x0d\x0e\xa8\xb0\xed\xf9\x5c\xb3\x96\x69\x47\x20\xa2\xaa\x76\xa6\x69\xc9\x2b\x13\xf1\x57\xcd\x5b\x7b\x0f\x66\x04\x90\xa6\xc7\xeb\x59\xc1\xac\xf6\x3a\x12\xed\x25\xbb\xdc\x29\xbd\x3a\x6e\x35\xd2\x2f\x01\xcc\x7e\xaf\x2f\x41\xab\x83\xce\x50\x06\xef\x8d\xba\xd6\xa8\x27\x7c\xb3\xa0\xa4\x80\xaa\x6f\x92\x15\x5d\x20\x75\xc3\x62\x47\xc5\x52\x1d\x6b\xd0\x3f\x1a\x16\x44\xc5\xc8\x6a\x21\x70\x02\xf1\xbd\xca\x1d\x41\x3b\xb1\xc4\xbe\xfb\xc1\x56\x3f\xaa\xfa\xa3\xae\x93\x27\x19\x81\x00\xbe\x10\x9c\x91\x17\x5a\x59\xa5\x04\xa6\xb1\x3a\x8f\x5e\x24\xce\xb1\x46\x12\xcd\xab\x6c\x48\xd0\x42\xd2\x5e\x10\x06\x12\x36\xc0\xd7\x89\x4f\x77\xd9\xd8\xe7\x8a\x99\x49\x62\xe4\xe7\x84\x6d\x9a\x86\x92\xf6\xa2\x46\xde\x5c\x89\x8e\x47\x3e\xef\x5e\x03\x3c\x3f\x12\xf9\x16\x5c\x79\x20\x74\x73\x95\x88\xcb\xdd\x94\xae\xf0\x4e\x42\x41\x43\x12\x10\x13\x4b\x0e\x83\x7c\x23\xce\x48\xe9\xb5\xcb\x43\x3b\x21\xfe\xa5\xe2\xbb\xe3\xbd\xb5\xab\x67\x4a\x82\xac\x38\x76\xd4\x5e\x70\x0d\x8e\xc8\xe8\xc9\x3d\x84\x34\x00\x3c\x4a\xa0\xb7\x2a\xf8\x6a\xeb\xf2\x28\xda\x0f\x52\xbd\x88\x27\xea\xad\x6a\xab\x9f\x54\xac\xc7\x39\x56\x9c\xac\xb0\x28\x6e\x5e\x29\xee\xad\x0a\x97\x73\x5d\x4f\xbd\x51\xc7\x4b\x3e\x64\x0b\x41\x71\x35\x6b\xe7\xdf\x31\x23\x95\x28\x92\x86\x6a\x1e\x79\x87\x62\xd4\x5e\xa1\x98\x87\x6f\xc8\x07\x46\x46\x02\xff\x2d\x64\x6c\x6d\xc2\x7f\xaf\x35\x6d\xab\x69\x73\x08\xc1\x97\x2f\xd3\xb4\x25\xf0\x52\x67\xd9\x38\xe0\xdf\x9d\x77\x32\x04\xa6\x1c\x37\x9a\x0b\xb7\xa7\xd9\xef\xf4\xc4\xb4\x91\xe2\x7f\x52\xce\xab\x28\xb7\xa8\xed\x47\xbc\x88\x35\x63\xcb\xf7\x15\xab\xdf\x33\x04\x9e\x41\x4c\xcb\x47\x2a\xbf\xfb\x85\xb3\x06\x56\xf2\x9c\x9d\xc2\xfb\x9d\xcd\xa1\x8f\x9d\x34\x5d\x8b\x10\xa4\x1c\xf0\x2d\x7f\xa6\x29\x92\x47\xd4\x67\x4f\xc8\x20\x6e\x9b\x77\xf2\x7b\x67\x8b\x31\x59\xd2\x79\x7b\xc9\x62\xf2\x42\xe7\x5c\x22\x20\xf7\x74\xde\x8e\x58\x3c\xde\xcf\xad\xe5\x2d\xd0\x8b\x18\xa0\x73\x12\x37\xa7\x80\x7b\x2c\xe3\xd5\xda\x0b\xc7\x75\xe6\x8c\xc6\xe4\xbe\x78\x88\x30\x4c\x58\xd6\xa8\x06\x5d\x2c\xcb\xa2\xd3\x94\xcb\x13\x5e\xd3\x5d\x95\x0a\x64\x65\xce\x8a\x0d\xdd\xf2\xf1\xe9\xc4\x4c\xc5\xe3\xd5\x74\xc3\x3f\x12\x69\xa8\xfe\x02\xc5\x64\xf3\x0d\x35\x8f\xf8\xfd\xa7\x2a\x2d\x0a\x9c\xc4\xd3\xcd\xcc\x3e\x5a\x67\x71\x53\x56\x89\xd1\xdf\x45\x2c\xb6\x43\xa0\xb8\x0f\x20\x08\xc3\x23\xcc\x87\x39\xdc\x34\x26\xf9\xd4\x9c\xf0\x5d\xd4\xe6\x22\xce\x8e\xaf\x6a\x45\x14\x54\xd3\xfd\x25\xee\x59\xca\x55\x30\x37\x12\xc4\x70\x9a\x22\x81\xc9\xc5\x6d\x3e\x89\x8f\xc3\x7e\x36\x5b\x27\xe6\x2b\xf2\x45\xc8\x5c\xe6\x3d\xb2\x90\x5c\x40\xca\x9e\x8b\x90\xfd\x3d\xf1\x42\x36\x2f\xd1\x40\x3e\x50\x00\x00\xc3\xdc\x39\xa4\x9e\x85\x72\x19\xd6\x90\x36\xce\x01\x8d\xe7\x49\xef\x77\xa1\x7d\xc5\x10\x74\x0a\xcf\x0a\xcc\x93\x33\xf5\x04\xa1\x10\x60\x03\x86\xc3\xe3\x95\x12\x92\x50\xe5\x3d\xa2\x06\x5e\x04\x7f\xeb\xe6\x09\xb9\x72\xe5\x00\x15\x2e\x75\xc2\xf6\x6f\x9d\x70\xfc\xe7\x32\xd7\xe5\xbf\xa5\x5f\xcb\x76\x7d\x6d\x5f\xd6\x46\x49\x29\xfc\xba\x53\x87\x6b\xc6\x45\xbf\x52\x1a\xa5\xa9\xaf\xd0\xa4\x46\x06\x52\xc6\xed\x03\xc3\x87\xad\x28\x0c\x67\x84\x0b\x2d\x7e\x10\x6e\x9c\x1a\x85\x74\xa5\xc3\x0a\xca\xcd\x02\x88\x1b\x10\xb5\xad\xe2\x76\x1c\xfc\x14\x3c\xb1\xf0\x7b\x27\x62\x5c\xb7\x70\xa9\xd7\x9e\x3b\x31\x18\x92\x12\xea\xb5\x3f\x7c\xf7\xe5\xdd\x2f\x37\x54\xfd\xa0\x92\x88\x7a\xed\x4f\x1f\x7f\xfa\xeb\xdb\x77\x3f\xfd\x44\xd5\x4f\x6a\xa5\xe7\x3c\x2e\xfd\x0f\xad\xd7\x78\x42\x6b\xda\xfc\xc9\x0f\x2c\x89\x67\x0b\xd4\x61\x0c\x08\x89\x18\x43\x84\x59\x46\xa0\xb8\x33\xdc\x26\xf2\xb3\xed\xeb\x61\xf1\x24\x67\xb4\xb5\x9b\xac\x2f\x40\xc4\xd3\x33\x8f\x31\xf6\x2a\x26\xd0\x4f\x0c\x8f\xdb\x2e\xaa\xe2\xea\x21\xfd\xc4\x19\x30\xf5\x32\x4c\x0c\xa8\x60\x8a\xd1\x8e\x18\x90\xf8\xe0\x89\xa2\x30\x5b\x15\xbe\x17\x29\x61\x63\x40\x7e\x98\x27\xdd\xe2\xfd\xbc\x56\x56\xb7\xdb\x31\xeb\xfc\x95\x0d\xdd\x76\x20\x06\x64\x0d\x7a\x78\x88\x54\x81\xd6\x29\x56\x84\xa6\xb1\x9a\x27\x81\x44\x31\xae\x32\xd4\x0a\x90\xf1\xf0\x38\x22\xa0\x4a\x05\x23\x38\x2c\xf7\xd8\xd4\x2a\xbc\x12\x82\xc3\x52\x80\x06\x85\x07\x61\x5f\xc9\x14\xf1\xf2\x71\xb0\xdd\xb2\x39\x8d\x21\xbe\xa6\x1d\xb2\x28\x59\xc7\x94\xbd\x86\xf4\x2e\x5c\x98\x82\xb5\x8f\x2a\x48\xf1\xd3\x54\xf1\xdb\x65\x68\x08\x26\xf7\xe5\xe9\x77\xb7\x05\xae\x10\x93\x4d\xe5\xfc\x87\x2f\x37\x9f\x3f\xff\xfc\xe9\xcb\xcd\x0f\x98\xdc\x51\x07\x31\x02\xba\x6e\xbc\x72\x62\x62\xea\x2f\xfa\x06\x93\x87\xc6\x5d\x44\xd3\x12\xb4\xc0\x84\x6f\x5b\x11\x52\x0c\x88\xfa\x7c\x6a\xdc\x23\x27\x42\x69\xdf\x4c\xee\x50\x3c\x35\x66\x24\x9e\x9a\x33\xf2\x80\xed\xca\x4f\x8c\x6d\xb8\x2c\x4f\x8b\x28\xa3\x7b\xbc\xa0\x71\xe1\xc7\x68\x20\x20\x5a\x53\x97\x0f\xb5\xc3\x3d\x43\xf8\x5b\x73\x32\x5f\x58\xd7\xef\xd7\x4c\xa4\x0d\x0a\xd0\x5a\x5a\x9d\xb7\xd4\x20\x2b\xea\xa1\xdc\xb4\x86\xc7\x2b\xa0\xd0\x12\xf4\x84\x8f\xf4\x09\xc5\xd3\xed\x0c\x63\x4d\x7b\xac\xda\x6b\x0b\xee\xba\x22\x2f\x8b\xec\x03\x13\x67\x0b\xba\x2e\x54\x20\xfe\x8a\x39\x5d\x08\xf2\x04\x05\x71\xb1\x46\x98\xe2\xca\x94\xab\x40\x79\x43\x9f\xd0\x52\x78\x82\x73\x47\xea\x73\x4e\xaa\x03\x3d\xfc\x9c\xf1\xd6\xef\x2f\x1a\x8f\x9a\xf6\x78\xb4\x62\xd9\x41\xc5\xf8\xee\x70\x6a\xf7\x11\x23\xfb\x24\x24\x2e\x6e\x8b\x52\x79\x27\x16\x4b\x40\xe1\x31\x09\x51\xc1\x8d\x83\x25\x31\x40\x46\x00\xf8\x7a\x86\x23\xa1\x10\x52\xc5\x26\xe5\x16\x40\xdc\x1a\xe4\x56\xca\xa5\xc7\x20\xb7\x75\xac\xec\x8a\x2a\xe6\x78\x3a\x83\x34\xaf\x7c\xc7\xe2\x5f\x41\xf5\x7c\x04\xee\x09\xc8\xfd\x8a\xf1\x04\x05\xd4\x45\x2e\xf2\x30\xc6\x8d\xc8\x4d\x14\xd2\x00\xdb\x2b\xaa\x18\xc2\x47\xfd\x48\x05\x57\x4e\x98\xa6\xce\xbe\x8f\x37\xae\xb8\x8b\xc3\xe9\x76\x96\xf7\x86\x22\xa2\x90\x1f\xa1\xb4\x5d\x8e\xb8\x7c\xe4\x02\x7d\x84\x42\xb2\xc5\x22\x00\x78\x4b\x8e\x58\xdf\xaa\x9a\xf4\xee\x00\x3e\x6c\x87\xa4\x19\x3c\x6c\xaf\xc0\x91\xd3\xe9\x8c\x4e\xd8\xc8\x2c\x6b\x64\x36\x59\x33\x61\x5b\x64\xcf\xdb\x8d\x49\xfc\xe2\x47\xd5\x7a\xc4\xd2\x94\x21\xd3\xc0\xd7\x96\x65\x58\xbd\x76\xb7\xdf\x1b\x8c\xba\x43\xa3\x3f\x30\x87\xf2\xca\x55\xd3\x95\x96\xc5\x5a\xe6\x40\xa1\x0c\x89\xa3\x26\x4b\xcd\x85\x41\x29\x8a\xa9\x1e\xe3\x49\x6c\xc7\xd7\x2d\x93\xb5\xfa\x9a\x16\x5f\xf1\xbf\x93\x58\x8f\xdf\xc4\x97\x96\xcd\xef\x6f\x99\x99\xcd\x32\x32\xea\x59\x27\xec\xf6\x23\xab\x37\xea\x15\x3b\xbd\x73\x1f\xe5\x51\x10\xdb\xe0\x89\x8b\x29\xc8\x22\xad\x9e\x80\x10\xf1\x43\x0b\xc6\x1c\x3f\x34\xad\x01\x7e\x83\xac\x16\xd0\x6a\xc3\x35\xb3\x6e\xa6\x13\xa2\x43\x18\x24\x8d\xbe\x23\xe2\x13\x4f\xf0\x12\x2f\x40\x3c\x2b\x58\x5e\xae\xa2\xc9\xe2\x0d\xf2\x2e\xa3\x4b\x57\x37\x2f\x9d\x96\x79\xe9\xe0\x37\xd1\x1b\xd7\x46\x3e\xdf\x4f\x91\xa9\xbb\xfc\x8c\x87\x5b\x88\xb5\x3c\x8c\xaf\x13\x90\xba\x7c\xfe\x94\x79\x69\x60\x7b\xf1\xc6\x87\x00\xb4\xe1\xc0\x3a\xf6\xe5\xd6\xc1\x72\xbf\xa2\xeb\x60\x69\x6e\x9b\x84\x48\xd1\xd5\xd0\xcd\x43\xd9\xcd\xc3\x49\xdc\x12\xdd\xcc\x90\xa9\x83\x68\x09\xdd\x78\x64\x20\x41\xf9\x91\xb7\xf4\x9b\x8a\x2f\xbf\x66\x9a\xc6\x0a\xe5\xaa\x7b\x7c\x65\x00\x75\x22\x88\xe9\xdd\x63\x68\x20\xb1\x24\x94\x4e\xf4\x52\x6d\xdd\x56\xd1\x41\x5c\x1d\x1d\x5a\x46\xd7\x80\x08\x77\x88\x3d\x06\x34\x1e\x26\x73\xfe\x44\xbf\x6f\x0c\xb8\x46\xe9\x23\x80\xd1\x61\xf2\x42\xd7\xed\xf7\x49\x0c\xd8\xd2\x8f\xf7\x11\x0b\x1f\x59\xc8\xb5\x54\x01\xa5\xda\xbf\x42\xee\xe9\xba\xc4\xc6\x6e\xe8\xba\x80\x99\xdd\xd1\x75\xfb\x53\x18\x6c\xbc\x88\x91\x07\xba\x45\x6b\xa2\xfe\x3d\x61\x09\x7b\xef\xb9\x61\x10\x3b\xd1\x83\x8a\xc9\x13\x7d\xd0\xb4\x07\xb1\x18\x8e\x9f\xd2\x14\x85\xfb\x49\x8a\x62\xc2\x80\x2d\x68\xa9\x69\x28\xa6\x9b\xf6\x3c\xd8\x38\x9e\x8f\x35\x8d\xf7\xae\x17\x23\x3c\x0e\xc6\x78\xc7\x68\xd0\x5e\xf8\x24\xa0\x81\x24\xe2\x09\x5f\x76\x0c\x55\x03\x05\x05\x91\xdc\xc4\x41\xd8\xf6\x72\xe2\x0d\x3f\xcb\x8a\x63\x70\x45\x40\x82\x4e\x2e\x54\x3f\xa6\xe9\x32\x4d\xe7\x69\xaa\xbc\xa4\xa9\x72\x3f\xb9\xd3\xb4\x3b\x2e\x78\x04\xeb\x47\x36\x41\x28\xa2\xc5\x2f\xb9\xce\xe3\x3a\x36\xe5\x8e\x2c\x68\xd4\x8e\x57\xcc\xaf\x32\x3a\xe3\xdd\x42\x2c\x79\x11\x09\x71\x86\x6d\x87\x2e\xab\x51\x3b\x1b\xa8\xfb\x17\xcf\x7d\x40\x61\x35\xdc\x0b\xef\x56\x92\xa4\x1a\x10\x1e\xc8\xe5\xba\x72\x42\xef\x25\x9a\xf8\x0b\x7b\x8e\x3f\x04\x73\x06\x30\x15\xbe\x9d\x01\x99\x41\x20\xbe\x0f\x4a\xc8\xce\x5d\x39\xa1\xe3\xc6\x2c\x04\x0b\x8d\x62\x64\xb8\x5e\xa9\x44\xe8\x0f\x2e\x55\xdc\x0c\x57\xd7\xd2\xa7\x26\x8f\xef\x6e\xe1\xdb\x35\xb2\xa9\x6c\x5c\x61\x15\x62\x98\x04\x69\x8a\x02\xca\x88\x83\x30\x17\xfe\x98\x98\x8a\xfd\xd7\x5c\xad\xb5\x3c\x1c\x72\xdc\x64\x64\x30\x30\xba\xc7\xed\xb5\x92\x36\x36\x68\x42\x50\x28\xa7\xb2\xbd\xef\x5b\xf6\xc5\xee\x24\x2e\xa2\x22\x46\xb9\x50\xc1\x00\x9c\xdf\x20\x0e\x8b\x07\xf8\x65\x71\x04\x00\x32\x4d\x0b\x35\x2d\xbc\xea\x9a\x60\xe4\x37\xfb\x27\x62\x4d\x2b\x60\x3e\x30\x4c\x0b\xa4\xb9\xb4\xf3\x54\x61\xaa\x87\x02\xba\xa7\x69\x97\x95\xac\xb5\x12\x6a\x1b\xf0\x8d\x5a\x80\x3e\xce\x0d\xc6\xcc\xd1\x09\x0d\xeb\xf3\x18\xe4\xed\xad\xf8\x16\x10\xd1\xbd\x4f\xe6\x51\x93\x73\xd2\xb4\x38\xf6\x0f\x05\xce\x3f\x39\xf3\x0b\xf9\x59\x2f\xaa\x78\x4a\x3c\x66\xc0\xcb\x1d\x66\xb8\x90\xef\xf9\xc4\x12\xec\xe6\xf2\x0c\xef\x7a\x1a\xa2\x1a\x38\xa1\x6a\xbc\x8d\x6b\x41\x2f\x81\x50\xf6\x47\x1d\x6b\x70\x7c\xec\x80\x42\x78\x3a\x40\xab\x49\x6c\x5e\x41\x5e\xa9\x55\x30\xbf\x98\x07\x2c\xf2\xff\x18\x4b\x34\xd0\x45\xc8\x96\xc9\x9a\xf7\xdb\xf3\x36\x64\x11\x80\x70\xea\x99\x31\x86\xc7\xbd\x25\x62\x1c\xb4\x73\xe5\xb9\x52\x29\x01\x56\x2f\xae\x34\xda\x38\x64\x48\x58\xa9\xf5\x69\x9a\x34\x77\x58\xc3\xe1\x09\x55\xad\x32\xfa\x8a\x68\x62\x30\x82\xf2\xba\xc4\xa1\xb7\x11\xec\xd7\x43\xc3\x80\x20\xaf\xb0\xbd\x75\xc2\x88\xbd\x5d\x07\x4e\x4c\x12\x6a\x5e\xba\xc8\xd1\xd5\x96\xa1\x62\x85\xb6\xcc\x4b\xa3\x52\xeb\x64\x72\xb8\x6e\x78\x08\x94\x5e\xe2\x53\x17\xb1\x9a\x3b\xda\xd7\x34\xb5\xa5\xd6\xf3\x89\xb5\x0c\xdb\xcf\x6c\x37\x23\xdd\x4e\xbf\x21\xfa\xee\x9f\x6b\xc2\x3b\x9f\x37\xe0\xf2\x6f\x53\xbd\x35\x9b\x18\xd3\xff\x7e\x9e\x5d\x92\x88\x0e\x15\x4a\xa1\x49\xc6\x50\xc5\x69\x6a\x59\xc5\xef\x67\xb3\x5f\xe7\xeb\x9e\x34\x59\x83\x64\x03\x0b\xb6\x5b\xe4\x13\x76\x7d\x7d\x6d\xa4\x29\x4a\xc4\xec\xf4\xf1\xc4\xec\xdb\xa6\x81\x31\x34\xad\x67\x0e\x1a\x12\x59\x1d\x01\xd8\x35\x78\x2c\xfb\x43\xa3\x23\x95\xea\xc1\xa0\x37\x92\xa8\xcf\x5e\xdf\x30\x84\x56\x20\xfd\xca\x51\xc9\xf9\xbc\xc8\x05\x78\x27\xe2\xd2\x08\x59\x37\x3b\x32\xab\xcb\xe8\x22\x4d\x6b\x2b\x25\x9f\x19\x9a\x66\x2a\x94\x2e\xd0\xee\xde\x36\x33\xb2\x40\x6b\xb4\xcb\x84\xcf\xb3\x9e\x20\x74\xcf\x03\x2a\x19\x33\xd4\x7b\x35\x77\x06\x75\x48\xf5\x01\xbe\x60\x66\x98\xec\xee\x6d\x2b\xc3\xb8\x7d\x5f\x7a\x0a\x72\xe5\x81\x30\x40\x7d\x16\x0b\x35\x09\xa8\xea\xdc\xbb\x73\xb6\x58\xae\xbc\xdf\x1e\xd6\x1b\x3f\xd8\xfe\x3d\x8c\xe2\x32\xac\x7b\xea\xcf\xe8\x80\x04\x39\x72\x5d\xc5\x87\xd9\x11\x63\xbc\x63\xd3\x78\xc6\x55\x10\x32\x50\x78\xb3\x32\x12\xe3\xa9\x3f\x4b\x53\x0f\xc1\x2f\x86\xb1\x04\x4d\xf1\xb1\x1e\xd4\xbc\xa7\x75\xf6\x84\x44\x10\x20\x1e\x64\xd0\x58\x50\x93\xac\x81\x54\x61\x4b\xdd\xf6\x62\x1c\x5c\x2f\xc6\x45\xda\xeb\x15\x79\xa4\x51\x85\x88\x1d\x92\x33\x90\x39\x5d\x4f\x3c\xf4\x58\x64\x5a\x87\xfc\x15\x36\xe4\x1a\xe0\x7a\x72\x91\x9a\xc3\x18\x2f\xaf\x5f\xc6\x78\x45\xe7\xd3\x17\x5d\x9f\x11\xc8\x78\x2c\xb3\x5a\x3c\x92\x15\xe0\xe9\xc1\xfb\xf5\x38\x5d\xcd\x2a\x36\x60\x7b\x91\x11\x08\xb6\x3f\x26\x5c\x96\xc6\x1c\xb0\xe0\x18\xa3\xe1\x50\x0e\x36\xd3\x30\xa4\x77\x51\xb8\x39\xc0\x4b\x32\xe8\x75\x86\xd2\x4b\xd2\x2b\xfc\x24\xd2\x23\xb2\x86\x40\x0b\x99\x5a\x8a\x6c\xa9\x2a\xd2\x60\xaa\xc2\xc9\xf8\xee\xe6\xee\xd3\xe7\x8f\x5f\x3e\x82\xa3\xb1\xe6\xd5\x9b\x37\xd9\x06\xaf\x54\x7d\x0b\x0c\x04\xb1\x60\x20\x80\x1f\xfb\x3e\xc7\xb8\xfd\x14\x7a\x31\x43\x73\xfe\xcd\xb8\x4c\x03\x09\x23\x11\x1e\xe7\x8a\xba\xc8\x72\xfa\x2b\x60\x43\x64\x6a\xcd\x62\xd0\x08\xe2\x06\x56\xe3\xb9\x94\x88\x6e\x91\xc1\xcf\xe5\xfb\xee\x7f\xe7\x8e\xf6\x55\xbc\x59\x2f\xbc\x35\x53\x2b\x28\xef\xec\x85\x16\x59\x8e\x85\xc8\xaa\x69\xe1\x64\x89\x42\x6c\x1f\x0a\xb8\x34\x42\xaa\xb7\x08\x9d\x8d\xb4\xbf\xb0\x76\x14\xbf\xac\x4b\x46\x31\xf1\xb3\x3d\xf7\xa2\xed\xda\x79\xa1\xaa\x1f\xf8\x4c\x25\x90\x17\x80\xf9\xf3\xef\x57\xde\x1a\xd8\xf8\x58\x3b\x0a\x5d\x2a\x85\x16\xf5\x37\xe7\xd1\x11\xdd\x6c\xab\x98\xa0\x58\xf8\xcf\xe3\xb2\xd1\x79\xfd\x70\x3b\xd8\x32\x1f\xf1\x4e\x2a\xfa\xac\xa8\xfb\x5b\xb9\x42\xd4\x3a\x91\xc4\xed\xb7\x00\x79\xe1\xed\x19\x97\x9c\x2f\x4e\xee\x2a\x8d\x5b\xad\x31\x96\x64\x28\x2f\xd3\xf5\x6c\xea\x4c\xe3\x59\x61\x27\x7f\x41\x38\x1b\xbb\xc2\x31\x47\x0e\x10\x2e\x42\xa8\x6d\x4c\xee\x54\x67\x7d\xa1\xf1\x04\x3d\x4e\xd7\x33\xa1\x43\x0a\x66\xb8\x47\x02\x67\xe0\xfb\xc1\xa0\x8f\xb1\xed\xd3\x17\x54\x23\xcc\xf6\x6d\x8f\xaf\xcd\xc0\x9f\xcf\x47\xf5\x37\x32\x38\x54\x49\xf2\x60\x05\xae\x91\x39\x34\x2d\xa8\x1e\x8b\xf6\x1d\xa3\x5c\xdf\xad\x10\xc1\x53\x47\xd0\xae\xe4\xce\x66\x92\x50\x63\xec\x5e\x27\x63\x2c\xc8\x0e\x7c\x1a\x4e\x13\x3e\xbb\xd9\xd4\x9f\xd5\xa4\x0a\xa8\xd8\x39\x2d\x00\x48\xcc\x41\x0b\x24\x29\x83\x7b\x64\x23\x60\xed\x05\x0d\x27\xee\x41\xf9\x82\x5c\x08\x13\x26\x2a\xee\x81\xbb\x1c\x57\xd8\x58\x5c\x79\xa7\x9c\x11\x21\xde\x81\x89\x6e\xc9\x62\xd5\xf3\x2f\xfc\x34\x05\x92\x2a\x7e\x78\x28\x63\x7d\xe7\x72\xfd\x31\x08\x85\x69\x32\x4a\xb6\xbc\x6f\x2b\x0e\x2c\x11\x2c\x03\x0f\x03\xed\x3d\x9b\x51\xc9\xb2\x28\x30\x1e\xa0\xf9\x9e\xf5\x51\x61\xab\xdc\xa3\x1a\x19\x96\x89\x97\x44\xdf\x24\xa5\x5d\x2d\x2a\xfb\xb1\xd8\x4a\x97\x47\x32\xfc\xca\xbe\x5b\x1c\xba\xc4\x63\x11\x50\xc1\x40\x10\x22\x51\xb5\xdb\x80\xf1\xa3\xa2\xb6\xf2\x4e\x4b\x04\x4a\xaa\x70\x2d\x2a\x41\x7b\x91\x63\x73\x78\x8b\xa7\x6c\x06\x6c\xf7\x9d\x13\x23\xb9\x4c\x71\x22\x20\x20\x10\x34\x54\xa1\xf4\x26\xce\xb1\x08\xc0\x1c\x3f\x97\xfb\x03\xda\x0d\x60\x85\xc9\xf1\x4b\x48\xa2\xef\xec\xe9\xec\x35\xc9\xdd\xd1\x34\x75\x2a\x2a\x71\x21\x96\xa8\x99\x4a\x73\x58\x71\x5c\xd9\x73\xeb\xf4\xda\x41\x49\xf4\x53\x29\x4b\x42\x27\x71\x96\xa1\x18\xdb\x92\xfc\x06\x72\x0e\xf5\xfa\x27\xc2\x19\x07\x90\x4d\x32\x28\x36\xb9\x7c\xf3\x55\x25\xc2\x9f\xa8\xd5\x14\x89\xfc\x0b\x1f\x6f\x7a\xa3\xad\x27\x14\x88\x65\xae\xd8\xf6\xf6\xf0\x08\x78\x77\xb4\x3c\xa9\xb5\x66\xa4\x33\x3a\x11\x1a\x56\x21\x81\xaa\xa4\xfb\x90\x5b\xb0\xc0\x37\x74\x04\xbe\xc1\xab\x6d\xba\xc9\x81\x59\xb7\xb2\xa2\x39\x93\x46\x02\xa3\x26\x2f\x76\x2c\x56\xe2\x10\x32\xed\x4d\xe2\xa9\x3b\x6b\x74\xd6\x55\x0d\x25\x82\x17\xa1\xd0\xa7\x6b\xd7\x26\xb5\x5f\x65\xe5\xec\xda\x23\xa2\x76\x93\x04\x28\xda\xa1\x5f\x07\xbd\xb3\x78\xb2\x86\x85\x73\x0a\xb2\x75\xe1\x9c\x4a\x0f\x7a\x0a\xe4\x9a\x57\x42\xe4\x5c\xd1\xdc\x84\x1a\x24\xa2\x53\xc9\x69\x7d\xe1\xf9\x17\x2e\x56\x42\xe4\x10\x1f\x73\x3d\xcc\x85\xbf\x92\xb5\xd3\x17\x8b\xfe\x38\xcf\xb8\xc1\x17\x78\xb8\x85\x32\x58\xde\xb9\xac\xf6\xbf\x1e\x8a\x88\x8f\xd3\xb4\x78\xa6\xcc\x0e\x9e\x65\x04\xb6\x9c\xf3\x07\xf0\x21\x82\xf4\x81\xbd\xbc\x32\x34\xf9\xb2\xb8\x37\x32\x0f\x94\x12\x9f\xaf\x1e\x4d\xe8\x42\x12\xbe\xb6\x30\x92\x80\x86\x9a\xa6\xc8\x24\x37\x3b\xd3\xb6\x32\x62\x8a\xc9\x14\x34\xe8\x8d\xe1\x1e\xaf\xb2\xa2\x00\xb1\x72\xa9\x38\x64\xb6\x9f\x11\x00\x19\x9e\xe3\x94\x84\xf4\xaa\x0d\xdd\x12\xd5\x86\x77\x9a\x22\xf5\xee\x0e\x86\xdc\xdd\x9d\xea\xf9\xbb\x6c\xd2\x20\xb6\x41\xc4\xda\x2e\x03\x6b\x23\x8a\x5f\x6b\x37\xda\x9f\x65\xa4\xf2\x0a\xb0\xcd\xe2\x3c\x94\x6b\x3a\xe3\xdb\x83\x5f\x1d\xe7\x00\x64\x90\xeb\x9c\x57\x52\x8f\x95\xf0\x35\xe2\x55\xbe\x24\xdf\x8e\x91\x87\x09\x9b\x14\xe1\x61\x1e\xb6\xfd\x76\xf1\x42\xea\x11\x3f\xcb\x10\x2e\xd2\x17\x92\x4e\x67\x38\x38\x0b\x32\x2b\xd5\x4e\xaf\x98\x43\x4e\xbe\x95\xb6\x17\xaf\xa5\x12\xaa\x66\xbf\xe1\xcb\x10\x13\xa9\x39\xc1\x83\x90\x94\xca\x92\x41\xd6\x7c\x46\x41\xca\x3a\x5f\xa6\xab\x13\x8a\x8d\x23\x9a\xc3\x67\x15\xd6\xb4\xb5\x98\x22\xf1\x64\xea\x13\x77\xea\xcf\x66\xb6\x5b\x95\x8f\xd6\xf5\x24\x3e\x39\x05\x07\xe4\xee\x21\x92\xaa\xc3\xcd\x7d\x7f\x1d\xb3\x21\xfd\x72\x33\x8f\x72\x25\x57\x05\xc4\x60\xd4\x04\xc0\xca\xae\x7a\x08\xff\x2d\x36\x38\x20\x21\x5a\x79\x11\xd6\xd5\x99\x9a\x65\x04\xe8\x82\x5e\x81\x27\xbc\xb2\x1e\x05\x40\xb9\x5f\xd2\x09\xb1\x46\x1c\xad\x4f\xe3\xa2\x7e\x58\xd3\x94\x10\x41\x44\x8e\x74\x4b\xa6\xe9\x91\x47\x64\x7c\x72\xe3\x13\xf2\x95\xca\x3f\xf6\xca\x5c\xb0\x09\xc6\x47\x72\x15\xbb\x81\xff\xc8\xc2\x58\x66\x9b\xbd\x88\x83\x8b\x6d\xe8\x6d\x3c\x30\x7d\xe6\x49\x9e\x32\x02\xb4\x87\xe7\x20\x29\x24\x06\xd6\x2b\xad\x26\x4e\x93\x73\x17\xf2\x4c\x2d\xd6\x80\xd9\x54\x83\x27\xff\x2f\xec\x25\x52\x71\x93\x41\x9c\x4b\xe8\x8e\x34\x6d\x79\xed\x45\xa1\xa4\x4c\x58\x2e\x3d\xf0\x9b\x31\x64\xe8\x01\xe6\x95\x6f\x30\x84\x67\xa4\x6b\x9a\xaf\x33\xba\x55\x05\xa2\x1d\x20\xeb\x6d\xc5\xcc\xe3\x43\xb9\x10\xb4\x17\x7d\x9c\xdf\x63\x54\xa8\xdc\x32\xd2\xb7\x1a\x8c\xc6\x0d\x4b\x68\x11\xc5\x26\xc0\x1c\x47\xd9\xdb\xca\xe8\xc1\x00\x32\x1b\xd5\xc9\x11\x2b\x29\xe4\x98\xdc\x52\x04\x49\x4c\x9e\xbb\xcd\x20\x7e\x6e\x0b\xc6\x7c\xa1\xf0\x73\x4b\x34\xdf\xe5\x87\x83\x53\x38\x2e\x88\x91\x3e\x01\x0f\xc9\x17\xa1\x40\x04\xa3\xc3\xce\x47\xd8\x34\x98\x11\x7f\xcf\x64\x3b\x38\x2f\x14\x1f\x0c\x1e\x5e\x29\x60\x38\x65\xf4\xbd\x5b\x1a\xf7\x93\x92\x20\x9d\x2f\x77\x4b\x16\x93\x05\x4d\xda\x12\x48\x48\xd6\xb9\xee\x2e\xa7\x4a\x6e\xb4\x92\xb8\x7c\x3c\x46\x47\x23\xa1\x5c\x51\xab\x04\x12\x11\xba\x9a\xa6\x28\x6e\x3b\xf1\x23\x67\xc1\xc8\xb6\x3c\x53\xee\x99\x64\x55\x9e\xad\xc4\xde\x8f\x1b\xe4\x35\xae\x63\x1d\x20\x89\x19\x84\x70\xfb\x44\xf5\xc1\x68\xa1\x69\x41\xf1\x83\xeb\x24\x28\xa1\x0b\x2e\xb8\xb4\x23\x80\xb3\x83\x05\x54\x1c\xd2\xb5\xb4\xa4\x1d\x94\x38\x61\xb6\xaa\x62\x8c\x49\xac\x50\x1a\x4e\x50\x34\x51\x56\x9a\xc6\xb5\x1b\x48\xa7\xac\x18\x38\xcf\x93\xcc\xcf\x91\xed\x44\x28\x7e\x76\x20\x3f\x0b\xb6\x8b\x53\x8e\x88\x1e\xc5\xa8\x80\xf1\x57\xf6\xdc\x92\x74\xe1\x70\x75\x6e\x90\x56\x21\xd4\x28\xca\xf3\x25\xc8\xe6\xb8\x39\x37\x54\x46\x7a\x9d\xc1\x31\x5c\x71\x9d\x7b\x44\x44\xeb\xbf\x12\x4e\x13\x8b\xf8\xf0\x1a\x96\xa7\xfc\x12\x32\x54\xa2\x58\x3c\x89\x4c\xb3\x22\x35\xb7\x22\x30\xc1\x6b\xca\x99\xb7\xbc\x79\xde\x5e\xf0\xd2\x73\xff\x85\x68\x33\x9b\x5f\x44\x01\x3f\xe3\xf9\xcb\x8b\x20\x5e\xb1\xf0\x22\x5e\x39\xfe\x85\x93\xc7\x1b\x5f\x04\x21\x18\x5c\x4a\x67\x86\x07\xaa\xbc\xc4\xb2\x29\x02\x5b\x79\xec\x8d\xff\x06\x6f\x84\x7c\x45\xf3\x8b\x80\x4b\x34\x0d\x50\xd5\x0a\x51\x5d\xd9\x32\xa1\xc8\x37\xb8\x2f\x9a\xb1\x31\xa5\x07\x00\x2c\xfe\xe6\x30\x0f\x80\xb0\x46\xc3\x51\x4f\xcc\xbd\xc1\x60\x60\x4a\x12\x0c\x49\x33\xba\x28\x66\x24\xcc\x46\x70\xa1\x0f\x4d\xbe\xba\x6d\x61\x82\x03\x29\xdd\xea\x80\x33\x01\xbe\x12\x79\xa4\x09\x52\x85\x0f\xae\x25\x86\x73\x4b\x42\x35\x55\xb2\x1f\x78\x9f\x83\x38\x31\x99\xd3\x15\x59\x52\x14\xd0\xcb\xfb\x37\x97\x4b\x22\x5d\xbb\x21\xbd\x74\x2e\x89\xea\xa8\x38\x3f\x13\x88\x5f\x06\xef\xe0\x32\xa5\x68\x9a\xf2\x13\x41\x79\x02\x93\x17\xea\xb6\x7f\xfe\x70\xfb\xf3\xa7\x4f\x1f\x3f\x7f\xb9\xf9\xe1\xee\xaf\x69\xea\xb6\xff\xf4\xf9\xe3\x5f\x6e\x3e\xdc\x7d\xff\xdd\xe7\x9b\x2f\xd5\x2c\xcd\x97\x08\x4f\x26\x97\x50\x7f\xa4\xaa\x78\x6a\xce\xc6\x68\x99\xa6\xf7\x69\xfa\x92\xa6\xeb\x34\xdd\x72\x15\x64\xde\x98\x4c\x9a\x77\xb3\x4b\x12\xb2\x26\x5b\x41\x0c\xb9\xa1\x0b\xb4\xc5\x90\x00\x37\xc6\xe4\x81\x6e\xda\xa1\xf3\xc4\x07\xe4\x43\xbe\xb0\x3f\x94\xf5\xa4\xdb\xf2\x98\xb0\x1c\xe8\xf5\x40\xee\x30\xa9\x5c\xa1\x0f\xd5\xbb\xe0\xeb\x3e\xd1\x4d\x7b\x19\x06\xc9\x36\x22\xcf\xf4\x45\xd3\xb6\xed\x28\xf6\xdc\x87\x17\x72\x43\xa5\x30\xb8\xc5\xe4\x23\xdd\xca\xc9\x49\x6e\xa9\x41\xbe\xd0\x3b\x5e\x8f\x67\x4d\x43\x2d\x93\x52\x8a\x6e\xe8\x4d\x01\xa3\x55\x5f\x54\xc2\x57\x9a\x92\x3b\x7d\xc9\x57\x30\x74\xa3\x53\x7e\xc4\x1f\x96\xd6\x83\x6d\xb5\x9b\x2b\x3f\xae\x0d\x4d\x43\xca\xb6\xbd\x49\xd6\xb1\xb7\xf6\x7c\x96\xa6\x95\x1f\x9a\xa6\x7e\xf5\xf9\xbc\xb8\xcb\xfd\x59\x95\x47\x5b\x26\x18\xe4\x3f\x52\x15\x4d\xec\x0b\x55\xff\xa8\xab\x58\x25\x5f\x80\x7c\xf7\x0b\xb9\xd5\xf5\xdc\x92\x29\x86\x1c\x52\xff\x86\x26\x76\x7e\xdb\x0d\xc6\xe4\x5e\xd3\xd0\xde\x1d\x70\xf9\x0f\x68\xa2\x7c\xfd\x1a\xc9\xbb\x96\x00\xa5\xaa\xd5\x3f\xa0\x72\x60\x3d\x4f\x7c\x7b\x4b\xbe\x60\xf2\x3c\x09\x26\x28\x68\x7b\xfe\x36\x89\xa9\xfc\x2b\x5b\x7e\x8b\x49\x30\x35\x66\x94\xff\x53\x39\x25\xba\xac\xf6\x29\x2b\xc7\xba\xb8\x5d\x22\x05\xed\xea\x67\x35\xec\xa5\xa6\x05\x7c\x21\xaf\x8d\x08\x11\x56\x39\x91\xe5\xea\x95\xc7\xed\x10\x9a\x1a\x68\x5a\x50\xc9\x5a\x2b\x99\x30\x02\x48\x17\xb8\x9f\x29\xc6\xa5\xe6\xd8\xbd\xda\x77\xbd\xb4\xac\xb1\xab\xeb\xb8\x0c\x54\x2d\xdc\x2c\x2e\xdf\x58\x82\xa9\x3b\xcb\x33\x3b\x65\x90\x11\x49\x50\xf3\x05\x72\xcc\xd1\x84\x46\x32\x73\x98\x4b\x8d\xb1\x7b\xf5\x94\xdb\xb8\x79\xa9\xc9\x14\xad\xe9\xd3\xd4\x9d\xe1\xa9\x31\xe3\xbd\xb5\x9e\x9a\xa5\x9d\x3b\xa8\x01\xd3\xe6\x5c\x96\x1b\x9e\x9b\xab\xe5\x38\xd8\x30\x07\x2b\x84\x45\x4a\x1c\xb5\xc2\x62\x9c\x07\xac\x22\x26\x47\x73\xdc\xf6\x96\x7e\x10\xb2\xef\x9d\x88\xc9\xd3\x1e\x9c\xae\x8c\x57\x38\xbb\x81\xb3\xf3\x20\xfe\x6e\x9d\x3f\x1f\xc1\xa9\xc4\xf7\xdc\x60\x9e\xdf\x96\xc0\x39\x31\x05\xe5\xa9\x17\x15\x13\x2e\x94\xc1\x4a\xfb\x2a\xb8\xbe\xbe\xed\xc9\x8a\xcb\xb1\x0c\xeb\xfe\x98\xd5\x97\x33\x7a\x90\xe1\x37\xa6\x01\x52\x1d\x95\xf0\x37\x97\x4d\x2f\x07\x96\x25\x13\x87\xc4\x72\x9d\x73\xee\xdd\xb9\xca\x3f\x2f\xab\xad\x8b\x47\x0a\xfe\x5b\xa8\x12\x75\x79\x66\xd1\x51\x1c\xaa\x20\x07\xc0\xb6\x71\x36\xbf\x47\xc3\x9b\xf3\xe9\xdc\x56\x0b\x4e\xd8\x4a\xc4\x79\x6e\xfc\x40\xe5\x27\xca\xab\xf0\xd5\xe7\xcb\x97\x1a\x01\x55\x8e\xa0\xba\x11\x35\x32\x9b\x90\xa5\xff\x40\x8d\xd0\xe4\xca\xb9\xbe\xc7\x87\xf5\xea\x15\xf5\x52\xef\x81\x91\x56\xd6\xe8\x5e\xc5\x72\xfa\xb4\x9d\x34\x55\xef\x5d\x7e\x51\xbd\x2f\x98\x00\x50\x4c\xd4\x3f\x5c\x39\xd7\xae\xe8\x3a\x60\x35\x3f\x43\xc7\x91\x8c\x05\x8d\x21\x30\x52\x55\x74\xd6\xeb\x5c\xbc\x09\xfc\x0b\x55\x8f\xf7\x7c\x25\x83\xc1\xf0\xc8\x8b\x8a\xe0\xc6\x23\xb1\xd5\xb1\xc8\x86\xaa\x40\xc8\x8a\x79\x19\x53\x6a\x5e\x32\x3b\x56\x68\xac\x69\x4c\x01\x94\x13\x08\xfc\xff\x68\x38\x35\x57\xe0\x9a\xa3\x8a\xc3\x92\x45\x93\xed\xd1\x73\x1b\x15\x6a\x6e\x23\xab\xf8\x0d\xc2\x69\x3c\xa3\x2c\x37\x12\x01\x04\x6b\xd0\x19\x9c\xc9\x8d\x5d\x51\x96\x2b\x6e\x2f\x89\x27\x76\x4a\x63\x10\xd8\x91\xcf\x4a\x94\x2b\xf0\x9d\x8e\xa6\x71\xbd\x81\x89\x95\xd7\x20\x41\x7b\x81\x11\x23\x2e\xd9\xed\xb7\xaa\x39\x74\x1a\xb0\xbe\x40\x31\x00\x6c\xc3\xc7\xa3\x63\xab\xc9\x2d\x2b\x04\xa7\x8d\xd9\x44\x4f\x68\x89\x31\xa0\xc4\x62\xea\x4f\x62\xbb\x6a\xb6\xf3\xc0\xb0\x1b\x13\xef\xb0\xe2\xb9\x3a\x0d\xb1\x4c\x56\xff\x84\xae\x2f\x65\xd1\xa0\x0c\xc0\x85\x00\x2b\x20\x2f\x7e\x2d\xf3\xf9\x34\x9e\xa5\x29\xe2\x7f\x8a\x40\x12\x88\x42\x3c\x47\x53\x95\x5a\xa9\x47\xd5\xbb\x3b\x37\x08\x59\xeb\xb7\xe8\x2e\x5a\x39\x21\x9b\xdf\xdd\xa9\xc4\xa1\x21\x90\x80\x04\xc8\x23\xbb\xac\x5a\x0f\x07\x4c\xeb\x0d\x26\xb2\x12\x48\xd6\xcb\xb3\x8b\x89\x90\xc8\x63\xea\x6a\x19\x0a\x2d\xda\xc1\xff\x94\x02\x2a\xd7\x03\x77\x19\x57\xde\xd4\x9c\x97\x50\x25\xd3\x19\x16\x96\xbe\x9d\x3c\x67\xab\x9d\xb6\xd9\x6f\x1b\x2a\xd9\x04\x73\x66\x87\x13\x75\x9b\x84\x4c\xb5\x55\xb1\xff\xa9\xc4\x0d\xb6\x2f\x22\x53\xb7\xfa\xf5\xd9\x19\x5d\x58\x86\x65\x5e\xfc\xc0\x7c\x2f\xba\xf8\x94\x44\xab\x07\x27\x64\x8f\x17\xe8\xf7\x75\xe0\x85\x81\xfb\xd0\x0e\x13\xac\xf2\xa5\xa8\x3b\xb0\xcc\xb3\xd2\x1c\x4b\xd8\xdc\xf9\x29\xa3\x4b\x3b\x9d\x03\xb3\xa1\x6a\x0b\x39\x48\x3e\xeb\xa4\xa9\x58\xe9\x90\x4f\x43\xe4\x60\x88\x20\x62\x76\x80\x7c\xf8\xd6\x56\xf7\x35\xe2\x80\xd3\x03\xa8\x21\x65\xbe\x20\x68\xfb\xa3\xfa\xc7\x32\xa8\x92\x7f\x8c\x7a\xb0\x59\x9a\x32\x69\x93\xe0\x37\xe6\x72\x59\x07\x46\x7b\xbf\xdb\x3d\x01\x70\xeb\x8d\xba\x45\x38\x61\x89\xd3\x92\xe9\x2c\x9c\xd7\xd2\xcf\x4b\x26\x16\xae\x7d\xc8\x0c\x5e\x5c\x89\x03\x2b\xf7\xa2\x30\x1b\x17\x4e\x92\x2b\x23\x4d\xa3\x6b\xba\x98\xc4\x13\x55\x95\xf6\x6d\x1b\x39\x34\x81\x6d\xeb\xfb\x60\xce\xbe\x8b\x51\x84\xf1\x55\xaf\x67\x8d\xfa\x69\xea\x5c\xf7\xfa\x1d\x73\x94\xa6\x91\xce\x75\x85\x45\x9a\x22\x77\xef\x66\xdd\xe4\xb7\xf7\x3b\x96\x91\xa6\xee\x75\x6f\xd0\xe9\x76\x26\xf1\x24\xc9\xf7\xc1\x08\xdb\x8e\xcd\x7f\x0b\x49\x39\x22\x91\x6e\x61\xdb\x6d\xc1\x13\x3a\x72\x5a\xf0\xa6\xab\x2b\xd3\xc0\x7a\xbf\xd7\xeb\xf4\xeb\x76\x69\x17\xde\x62\x3b\x90\x5e\x5e\x14\xc9\x7f\x18\x22\xc1\xbf\x79\xc2\xaf\x21\xc3\xaa\xf6\xba\x75\xd0\xe9\x0c\xa5\xc7\x4f\xf6\xb0\x2b\x10\xe8\x2e\xf3\xd6\xd5\xc4\x19\x47\x92\xfd\x27\x32\x53\x06\x60\xca\x03\xe4\x40\x7f\x6f\xe9\xba\xe4\xd4\x29\x79\x63\x26\xea\x85\x6a\x07\x28\xc1\xe4\x11\x3e\x48\x31\x94\xaf\xe8\x36\x4d\x55\x95\xd2\xd5\x64\x6d\x23\xb4\xc8\x1d\xb9\x2b\xe2\x22\x14\xd1\xc7\xd6\x16\x5f\xae\x72\x5d\x01\x17\x83\x29\xd2\x34\xb4\xa0\x8b\x82\x2c\x27\xc2\x98\xc4\x93\xb5\xbe\xb0\x17\xfa\x1a\xd7\xfb\x0d\x52\x36\xd8\x09\x74\x1b\xf3\xe7\xfc\xc8\x10\x9e\xf0\xce\xf0\x70\xe1\x6d\x66\xb8\x3f\x31\x2e\x4f\x6e\x68\x7c\x18\x8a\x8c\x0a\xc4\xa7\xaa\x2a\x27\x35\x44\x74\xf3\xf1\xe7\x70\xf1\xc0\x68\x48\xb6\xf0\x6b\x18\xf8\xcb\x0b\x81\xd8\xbc\x08\x16\x17\x21\xdb\xb2\xd8\x8b\x25\x5a\x14\x9c\x83\xce\xb5\x31\x46\xce\xf5\xf5\x35\x35\xb1\x90\xb0\x19\xc6\xa6\xe6\x70\xc5\x8f\x1f\x57\xc2\x78\x49\xaf\xdf\x39\x41\xf3\x5d\x50\x88\x08\x00\xe4\x37\x2c\x0a\xb9\xab\x8d\xaf\xcd\x7c\xde\xab\x5f\x13\xcb\x30\xee\xbf\x3e\x0f\x7b\x5f\x13\x73\x68\x30\x55\xa1\x87\xe7\xe4\xcd\xfc\xa1\x9c\x67\x3d\x16\xfb\xb5\xd9\x3f\x31\x8a\x9b\xb2\xda\xa8\x53\x55\xcf\xeb\xad\xab\x33\xde\xc1\x15\x7d\xd7\xd3\x3d\x5d\x7d\xa3\xf2\x81\x2d\xcf\x8a\x33\x7f\x50\xf1\x6b\xe3\x3b\xb7\xb4\x05\x28\xe4\xe3\x3a\xef\x4c\x53\x8b\x85\x62\x5d\xc8\xa8\x0e\x18\x09\x88\x75\x70\xc1\x15\x17\xfc\xe6\xc1\x58\x8c\x45\x0b\x93\x38\xf4\x36\x76\x82\x3a\xe0\x5f\xb2\x8e\x02\xd9\xf3\x38\x8e\x3a\xed\x80\xf8\x7a\x51\x19\x31\xb9\x28\x51\x76\xeb\x12\x65\xb7\x2d\xc3\x39\x56\x65\x0c\xc7\x23\x75\xdb\x11\x8b\xdf\x6d\x36\x6c\xee\x39\x31\x23\x73\xea\x8a\xa4\x54\xe5\xa9\x25\x75\x8b\x58\x8d\x17\xea\xb6\xdf\xb3\x28\x72\x96\xec\xfb\x95\xe3\xfb\x6c\x4d\xee\xa9\xdb\xfe\xc1\x8b\xb6\x5c\xa4\x24\x1b\x6a\x90\x3b\xba\xcb\xc8\x03\x55\x03\x1f\xa8\x0c\x20\x78\xdf\x5d\xf1\xb1\xad\x8e\x05\x36\xce\x6d\xaf\x03\x17\xa2\x43\xa4\x24\x7a\x8b\x77\x99\xb0\xe1\xec\xc9\xf1\x77\x7b\x44\x47\x45\xfe\x40\x46\xef\xa6\xf1\x2c\x4f\x66\xcc\x8f\x09\xa0\x38\xc8\xf3\xc9\xcf\x8a\x77\x4f\x02\xf1\x7c\x53\xbb\xed\x89\xab\x4b\x4e\xec\xe0\x8c\x7c\xac\x53\x92\xb4\xb7\x41\x14\xcb\x16\xa3\x02\xe7\x4f\x24\xcc\xc0\x0d\xd6\xba\x7a\x79\xa9\xea\x61\x7b\x15\x44\x31\xce\xc6\x48\x79\x4c\x53\x65\x0e\xb1\xbd\xb5\x92\x8a\x84\xc6\x74\x3a\x23\xfe\x21\xf2\x33\xa4\xe6\xd8\xbf\x0e\xc7\x98\x09\x09\xa6\xb4\x3f\x84\xba\x5e\xba\x2a\xef\xa6\xba\xbe\xa9\xf1\x97\x36\x59\x80\xe3\x49\x6c\xbf\x2d\x5f\x8e\x25\x09\x9e\x0c\x61\x61\x38\x23\x01\xda\x60\xb2\xd9\x47\x4e\x56\xba\x33\x23\xab\x49\x1d\xec\xbf\x2c\xc3\x4e\x9e\x41\x9a\xb4\x21\x57\xa0\x1f\x3c\xed\xdd\x08\xe7\xf2\x7b\x5e\x34\x4d\xd9\x4e\x90\x43\x91\x07\xd6\xa8\x17\xdc\xe6\x33\xc1\x22\x1e\xfc\x35\xdb\x81\xbf\x11\xdd\x4b\x6f\x48\x40\x23\xe4\x54\xbb\x9c\x38\xc4\xc4\xd8\x76\xdb\xce\x7c\x7e\xf3\xc8\x04\xdd\x3a\xf3\x59\xd8\x98\xf0\xbe\xf2\xa0\xa6\x29\x6e\xdb\xdb\xf0\x57\xdc\x82\x5f\x3d\x82\x70\x0b\x75\xe1\xad\x99\x0d\xc6\xe8\xe2\x0b\x6a\x9a\x92\xa0\x8f\x10\xc1\xf8\x91\x1c\xbe\x09\xa9\xb2\x7e\x2a\xb9\x21\x0a\xaf\x4d\x40\x1f\x2e\x3c\xff\x62\x8d\x72\x78\x6a\x3d\xf6\x6e\x51\xc3\x5b\x56\xee\xc2\xd3\x87\x59\x3d\xc8\x47\xe4\x23\x16\x37\x0a\x2b\x8d\x18\x9e\x35\xdd\x33\x12\xb9\x84\x82\x24\x86\x3e\x25\x46\x9d\x12\x08\x18\x27\x1e\x89\x48\x72\x3e\x07\x9f\xd7\xe8\x18\x58\xb7\x89\x1b\x61\x6f\xc6\x95\x89\x63\xca\x28\x01\xf5\x43\x7e\xae\xd9\x84\x5f\xa6\x93\xf1\xfc\x47\x39\xb3\x0b\xb3\x88\xce\x35\x6a\xcb\xb0\xac\x13\x8a\x58\xbe\xbb\x82\xf4\xb1\x71\x9e\xf3\xc8\xc2\x8d\xe7\xbf\xc6\x2b\x56\x09\x08\xf4\xaf\x8c\x49\x80\x7c\x9d\x11\x03\x97\xd0\xcd\xe1\x29\xfa\x0a\x89\x77\x0f\x5e\xdb\xcc\x8b\xbd\xaf\xd4\xa3\xea\xe1\x76\xb5\xa0\x41\x90\x9f\xfc\x73\x19\x11\x2e\xbc\xe8\x83\xf3\x41\xc6\x69\x1a\x36\x8a\xaf\x8d\x89\x6f\x33\x2c\x16\x2a\x10\xdd\xce\xed\xb9\x23\xdd\x55\x6a\xc6\xd7\xbc\x87\xc0\xd5\x7a\x40\x64\x0b\xe9\x04\x00\x0f\xf6\xca\x06\x7c\xfa\x15\x12\xec\x9c\xe3\xe8\xac\x61\xf7\x84\xad\xaf\x42\xa7\x00\x0c\x07\x12\x89\x06\x29\x91\x2a\x2c\xd5\x5c\x15\xff\x94\xfb\xf2\x4f\xe8\x4d\xde\x02\x01\xbd\x04\xd7\x4b\x0b\x02\xa1\x8b\x78\x9c\xe3\x48\xe2\xa9\x33\xab\x85\x5c\xbb\x95\xc8\x24\x81\x84\x40\x8c\x16\xb9\x95\x20\x06\xa5\x82\xa0\x54\xb8\xe0\xca\xcb\xf6\x8b\xb2\xfd\x7f\x06\x8c\xb0\xaf\xcd\xc9\xd7\xcb\x09\x88\x89\x97\xfb\xb7\x00\x60\x7a\x5c\xdb\xe4\x5d\x5c\xed\xc4\xd7\x2c\x2c\x85\x7d\xae\x92\xf7\x89\x71\xbd\x51\xee\x6f\xf0\x4e\x00\xaf\x1c\x79\xe7\x2e\x1b\x87\xd3\x23\x76\x92\x19\x55\x7f\x57\x2b\xcb\x53\x81\x64\xf9\x7d\xa6\x52\x9a\x7b\xae\x45\xb6\x83\xde\x89\xb1\x76\xb2\x29\x47\xc3\xae\xbe\x77\x7c\x3f\x28\x7b\xdf\x91\x91\x77\xa2\xcb\xf9\x57\x70\x2e\xf6\xdb\x5e\x6c\xea\x80\xfa\xb4\xf6\x62\x73\x45\xa7\x19\xf9\x6c\x0e\x1d\x7f\x1e\x6c\xd0\xe9\x39\x20\x69\x33\x90\xaa\xcb\xb2\x8b\x2f\x0c\x9a\x66\x8c\x75\x15\xdf\xa9\x3a\xd2\x75\xa6\xfb\xb8\x80\xbc\xa0\x4e\x1f\x66\x4c\xb7\xdb\x39\x6e\x5a\x80\x38\xc7\x9a\x3d\x56\xd3\xea\x41\x85\x07\xe4\x1e\xf2\x6a\x1e\xd0\x9f\x11\x48\xe0\xf3\x0a\xa3\x8f\x40\x25\x67\x04\x7e\x9d\x15\x56\x25\xec\x54\x7b\xd8\x06\x69\xb2\x72\x8b\x9a\x83\xc8\x2a\x48\x4a\x48\x44\x03\xa4\x3e\x3d\x44\x2a\x44\x76\xcb\xd4\x40\x64\x4d\x93\xc9\xc2\x5e\x68\xda\xa2\xfd\xe4\xc5\xab\x20\x89\x6f\x81\x12\x29\x4d\x9d\x93\xbd\x8e\x14\x0f\x45\x44\xc4\x60\xba\x25\xda\xa8\xa4\xf0\x9c\xc6\x40\x40\x81\xf8\x01\x75\x05\x61\x78\x8c\x27\x8b\x69\x3c\xb3\xd7\x39\xd7\x49\x5b\xd5\x63\x8c\x09\xbf\x07\xd0\x56\x86\xd1\x3d\x62\x08\x56\xbf\xc6\x5f\xfd\xaf\x8f\x5f\x17\x5f\xc3\x8b\xaf\xcf\x8e\xf1\x35\x31\xfb\x43\x03\x74\x1d\xf1\xaf\x09\xff\x5a\xf0\x6f\x07\xfe\xed\xc2\xbf\x3d\xf8\xb7\x0f\xff\x0e\xe0\xdf\x21\xfc\x3b\x82\x7f\x1d\xfe\xaf\xb5\xe0\xff\xf6\x16\x5f\x93\x8e\x2c\xcd\x82\x7b\xac\xd1\xd7\x64\xc1\x16\x0b\x35\x23\xc3\xd1\xb9\x66\xda\x0a\x09\x60\x19\x13\x26\x99\xd8\xf7\x32\xf8\x4b\x38\x70\x52\x9a\x0c\xb8\x5e\x01\xb9\x1b\xa5\x5e\x61\x0d\x87\x23\xc9\x01\x38\xe8\x8c\x64\x08\xb9\x34\xf9\xae\xca\x48\xdb\x47\xba\x45\xaa\x17\x7d\x0f\xb8\xa6\xdb\x2d\x57\x04\x04\x6d\x08\x99\x1f\x50\xa8\x93\x25\x55\xdf\x3b\xcf\xde\x26\xd9\x5c\x38\xeb\x75\xf0\xc4\xe6\x17\xe0\xe7\xbb\x60\x40\xa5\xce\xe6\x2a\x79\xa1\xab\x6b\xda\x33\xd3\xb4\x29\x1c\x77\x3a\x2b\xc3\xb8\x1e\x21\xb7\x6b\x9c\x23\xaa\xf0\xd4\x98\x09\xed\x92\xdc\xd3\x35\x52\xc5\x69\x15\xd7\x12\xff\x17\xfc\x73\x7b\xf9\xd0\x19\xe5\xe5\x1d\xd0\x02\x33\xe0\xe8\xf1\x80\x5a\xa5\x42\xdc\x27\x18\xa4\x0e\x92\x6e\x89\xc0\xf0\x0c\x4c\xc0\xae\xd3\x90\x1f\x5d\x7a\xcc\x3d\xe2\x50\x09\x17\x21\x6b\xba\x40\x0e\x31\x78\xe7\x1a\xa0\xeb\x33\xda\x32\x49\x78\xa0\x34\x8c\xd9\x55\x38\x66\x82\x64\x65\x83\x3c\x0a\x3e\x6c\x36\x71\xec\x52\x79\x60\x33\x41\xa9\xb7\xd5\x51\x40\x13\xe4\x15\x96\x94\xeb\xf9\xc1\xea\xb9\x14\x86\x05\x9f\x1a\x63\xff\x2a\x18\xfb\xba\x4e\xb6\xba\x8e\x01\xab\xec\x69\x5a\x84\xd6\x64\x4b\xbc\xa9\x3f\xc3\x59\xce\x24\xb3\xbd\xa6\x8d\xe5\xc0\xbd\xba\x4e\xbc\x62\x97\xcb\xad\x42\x74\x4b\xd6\x40\xdf\x38\x18\x34\x65\x04\x6d\x18\xb4\x56\xb7\x67\x4a\x83\x8b\xd5\x35\x46\x5d\x7c\xa2\xd7\xa1\x9f\xb7\x2f\xbf\x7a\xf1\xca\xf3\xed\x20\xe3\x9b\xa8\x5a\x9e\x51\xf9\x7b\xfb\x83\x6f\x4f\x6b\x38\xea\x9a\x66\x0f\xb7\xd9\x23\x0b\x5f\xce\xf9\xe8\xe0\xfb\xe8\x99\x18\xa9\xf0\x08\x7f\xef\x0e\x8e\x9a\xf0\xf0\x79\xd6\x45\xb2\xff\x7d\xaf\xcd\x49\xf9\x25\xcd\x59\x81\xc1\x05\x67\x58\xdf\xea\x1e\xdf\x3d\xab\xdd\xd7\xeb\x0c\x86\xe7\x77\xdf\xc2\x5b\xaf\xf3\x8e\xe3\xc7\x2a\xa4\x41\xeb\x36\xc8\xd0\x67\xf6\xd9\xc2\x5b\xc7\x2c\x3c\xaf\xd3\xc4\x9a\x02\x2f\x8e\xb9\x08\x24\xea\x13\xb3\x46\x32\xbc\x7f\xa8\xdb\x7a\xfd\xee\xf0\x50\x1e\x3d\xbb\x29\xfe\x5c\xa0\x19\xca\xde\x24\x0e\x55\x8b\xf3\x2a\x71\xa9\x62\x40\xfe\xd9\xe9\x4c\xd3\xa0\xa1\xc8\xc4\x53\x67\x56\x5d\xb5\x5c\xaa\x98\x19\x26\xaf\xf7\x88\x0b\xed\x97\x65\xff\x8b\xba\x80\x78\xc8\xc1\x19\x31\xbb\x4d\xa4\xf6\xdf\xd0\x0f\x0d\x5d\xf0\x7f\xd4\xfa\x7f\x71\xc3\x3b\x9d\x06\xcf\xcd\xab\x1b\x67\xbf\x67\xc8\x9d\x53\xee\x91\x4e\xb9\x47\xba\xa5\x9f\x27\x29\xf6\xc8\x57\x66\xd9\xda\x89\xdf\x3b\xdb\xa6\xdd\x80\x4a\x83\x31\x04\xfb\xf9\x05\x9f\x56\x19\x2f\x87\x09\x62\x34\x41\x3e\x31\x0a\x73\x38\x0d\xc0\x20\xcf\x77\x12\x83\x98\xe7\x77\x0b\x61\x30\x29\x3a\xdd\xd1\xb9\x78\x93\x6f\xe9\x13\xa9\x9c\x7e\x4b\x9f\x1c\x04\xbd\x1e\xb2\x83\x97\xed\x30\xf2\x76\x10\x56\x74\x9a\x4f\x1d\xc4\x8a\x0c\x2e\x21\x4d\x10\x23\x25\xa9\x7d\x58\xf6\x57\x48\x18\x20\x62\x0d\x52\x91\xce\x4d\x1b\x58\xd0\x48\x08\xdd\xd2\xed\x8f\xce\x75\x0f\xd4\x12\xe0\xf6\xad\x53\x2d\xcd\x87\xf7\x74\x96\x87\x98\x2b\x34\xe0\xcd\x17\x3f\xf8\xda\x9b\x91\x7e\xff\x54\x94\x5e\xe5\x75\x83\x6e\xa7\xf9\x75\xfb\xfc\xc1\x3e\xea\xf5\xb9\x5a\x5d\x8b\x67\x17\xbc\x98\x8b\x30\xd8\x88\xa4\x9b\x64\xc7\x8f\x45\x15\xba\x5d\xa3\x7b\x66\xa0\x43\xb5\x3e\x79\x8c\x94\xbb\x4e\xe6\x2c\x3a\x7b\xdb\xc9\x1f\xf8\xd7\x4d\x76\x35\x2f\x12\x36\xfd\xee\xe8\x2c\x84\xe8\x91\xc6\x88\x80\x2f\x21\x37\xf3\x6d\x9d\x38\x74\x3a\x2b\xce\xbb\x54\x51\x1c\x4d\x33\x2f\xa7\x66\x71\x12\x99\xa4\x65\xe0\x2b\x03\x28\xb0\x54\x79\x52\x3d\x67\x5c\xb8\x69\xaa\x24\xd0\x23\xf0\x4c\x53\x87\xb8\x13\x27\x4f\x6b\xc2\x3b\xa6\x4c\x8c\x92\xa6\x86\xfd\x8f\x49\x13\xa3\x4e\x43\x46\xf4\xbc\x33\x8e\x0d\x2e\x5e\x4b\xc1\xa9\x6a\xe7\x1a\x85\x18\xbc\xc3\x06\x6f\x53\x73\x7a\xf5\x22\xde\x54\x6e\x25\x5e\x49\x24\xeb\x94\x28\x78\x20\x81\xec\x1b\x9d\x21\x5f\x4d\x44\x25\x2a\x19\x8a\x23\xea\x00\x63\xd5\x42\x24\x5e\x17\xf4\xb9\x28\xa9\x6a\xc9\x2e\x82\x87\x48\xde\x80\xba\xdd\x48\xc0\xb6\xc9\x0e\xa2\x06\x13\x22\x1b\x0b\x66\x32\xf8\x0a\xb6\x41\x1e\xf8\x46\xc4\x78\xeb\x0e\x56\xa8\x45\x01\xb0\x2b\x52\xe0\xf9\x34\x6e\xf3\x27\x48\x48\x63\x89\x59\xd4\x73\x64\x16\x4b\xd3\xf0\x9a\xe6\x6b\xd4\x04\xe5\x0f\xe5\x04\x53\x12\xc2\x23\x7f\xc9\x1c\x5e\x19\xb6\x05\xe4\x83\x52\x7f\x22\xef\x08\x49\x9e\xc2\xcb\xce\x53\x58\x57\xae\xb2\x69\x38\x2b\x6f\x90\x27\xa7\x21\xe1\xe7\xcb\x0b\x19\xc9\x1f\xc5\xc4\x6b\x7f\x97\x0f\x0f\xea\x09\xe2\x5d\x12\xe4\x48\x13\x7e\x54\xdc\x19\xa0\x22\x51\x36\xff\xdc\xa6\x79\xb6\x1b\xb5\x9c\x5b\xd2\xf2\x5a\x8f\x0e\x93\xb3\xcb\xe5\xb3\xeb\xb7\xc0\xf3\x49\x42\x83\x3c\x89\x02\xff\xcc\x48\xe5\x67\x55\xa2\x92\xb3\xa6\x52\x92\xa6\x4a\x94\x91\x1d\x7f\xa8\x71\x1e\x09\xe3\x5e\xbe\x77\x54\xcd\x34\x44\xb5\x63\x31\x35\xfa\x83\xee\x51\x43\x58\xbd\x45\xa6\x35\xe8\x9d\x53\xad\x40\xa1\xbc\x81\x05\x58\xf0\xe3\x22\x23\xbb\xca\x2f\xb1\xfe\x0e\xf6\x6c\x0f\xdf\x24\xa1\x6d\x9c\xed\xb7\x49\xdc\x1b\x67\x0b\xe2\xf6\x66\x4f\x28\xf9\x67\x64\xed\x7e\x6f\xd8\x80\xbe\xfa\x06\x1b\x05\xd8\x1d\x5e\xdf\xdb\x6a\x26\x81\xfc\xf0\x22\x46\x45\xf4\xa3\x22\x66\x7f\x3b\xc8\xe3\xe1\xab\xdc\x5c\x72\xe3\x0b\x16\xf6\x1e\x4e\x58\xcc\x6e\x2e\x5c\x1c\x38\xeb\x00\x58\xdd\xe8\x78\x5b\x79\xd1\x84\xff\x63\xc3\x1b\x31\x62\x78\xcc\xae\xe3\x31\xf6\x90\x5f\xed\xbd\x69\x5c\x75\xea\xe5\x52\x1e\x65\xc4\x17\xcb\xf1\x60\x64\x7d\xbb\x40\x66\x76\x07\x66\x1f\xb7\x01\xce\x54\xdf\xac\x0a\xbb\x8c\x5b\xb8\x7e\xcf\x19\x1e\x1e\x52\x43\x36\x4f\x5c\xf6\x99\x17\xa9\xe2\x34\x55\x5c\x4d\x73\xae\x07\x23\x4d\x73\xae\x86\x9d\x8c\xec\x2a\xd7\xbf\x69\xdc\x7c\xd3\x40\xea\xf4\x3a\xe7\xc6\x5c\x1e\x76\xc7\x9a\x2d\xfe\xc5\xbd\x71\xa2\x23\xfe\xef\xfa\x60\xd8\xe8\x99\x79\xad\x0f\x2a\x21\x78\x15\x8b\x1f\x78\xe3\xa4\xc5\x4f\x88\xeb\x49\xb1\x0c\xef\x19\xfc\x2a\xec\xb0\xf9\x52\x01\x90\x1b\x55\xd2\xc4\x96\x19\x43\x57\x65\xb2\xba\xc7\xc2\x91\x77\x4e\xbf\xae\x33\xb2\x83\xe7\xec\x26\x14\x5c\x08\xe8\xa2\x44\x2e\xd1\x73\xea\xa2\x75\x21\xde\x2f\xa9\x83\x62\x32\xc7\xe4\x85\x3a\x15\x2f\xce\x64\x6e\x33\x32\x07\x90\x8d\x87\xd6\xb8\x46\xb2\xae\x94\xc1\xa6\xeb\x5a\x9e\x18\xa0\x06\x15\x44\xf1\x22\x66\xad\x92\x2a\x66\x12\x20\x1f\x6b\x9a\x80\xda\x51\xe4\x53\x7f\xba\x85\x18\x7c\x3f\x0f\x09\xb0\xfd\x82\x2b\x92\xca\x52\x72\x96\x3b\x4a\x69\xe9\x2f\x2a\x08\x1a\x97\xe4\x45\x58\xdb\x80\x29\xa8\xac\xbc\x3f\x91\xf2\x14\x46\x8f\xe8\xa5\xb5\xe4\x4a\x1e\x59\x50\x63\xbc\xbc\x7a\x19\x2f\x75\x9d\x2c\x74\x1d\x2f\xc1\xfd\xac\x69\x11\x82\xde\x99\x2e\x67\x87\x1a\xce\x42\x2a\x31\xfd\x41\xc7\xfa\x87\xed\x5d\x51\xb0\x61\xdf\x66\xee\xe2\x4f\xc0\x46\xc2\x0f\xfe\x65\x3b\x49\xd7\x34\x1a\xa2\x9e\x5f\x6d\x44\x89\xbd\x6c\x56\x50\x25\x8a\xa8\x8e\xa2\x19\x0d\x46\x46\x5f\xb2\x52\x89\x15\x83\x0f\x7e\xc8\xb3\x2e\xac\xdd\x90\xe9\x7c\xcf\xda\xed\x23\xc8\x38\xcd\x07\xe8\x74\x06\xbc\x5b\x51\x10\xc6\xe4\x85\x26\xd5\xbd\x49\x9c\x45\x65\x18\xc9\x7d\xe3\x75\x08\x23\xc9\xc0\x46\xcd\x3b\x34\x8c\x55\x4c\xee\xa8\x92\xec\xd1\xab\xad\x8a\x41\x75\x35\x10\x49\x52\xd0\x5a\xd3\xd6\xd7\x1d\x69\xf1\xad\x25\x50\x79\x2c\x08\xad\xaf\xfa\x46\x67\x2c\x99\x09\x84\xed\x99\xaa\x2a\x0c\xc5\x98\xf6\x7b\xe3\xf8\x6a\xd0\x1f\xc7\xba\x8e\x77\x32\x9f\x1d\x93\x3e\x3b\x50\x13\xbf\x97\x60\x47\x48\x9b\x22\xf3\x79\xf6\xfb\xb6\xf8\x3b\x12\x7f\x07\x86\xfc\x6b\xd9\x3e\xed\xc8\x74\x74\xe2\x8e\xa1\xbc\x62\xda\x3e\xed\xee\x25\xaa\xf3\xa9\x95\x89\x09\x61\x8c\xc3\xab\xee\x60\x1c\xea\x3a\x9e\x4b\x38\xef\x83\xcd\xf4\x90\x3c\xda\x7e\x26\xc9\xc0\x45\x4f\x35\xc2\x85\x59\xfb\xb1\x15\xb7\x1f\x33\xae\xfe\xf3\xa2\xe6\x05\xf0\x53\xd7\x31\xa3\xf3\x69\x38\x6b\x3f\x94\x21\x13\x24\xc8\x8f\xf3\x08\xa2\x96\x89\x45\x8c\x3a\x0a\x2a\x38\x3a\xf5\x87\x1f\xff\x74\xf3\xf6\xcf\xdf\x7d\xff\xee\x3f\xff\xa2\x2a\x94\x06\x22\x73\xee\x6b\x73\x03\xcc\xff\x69\xaa\x6c\xd2\x54\xb9\x83\x79\x11\xee\x39\x01\x2a\x09\x2f\x02\x14\xe7\xcc\x63\x52\x28\xe5\xdf\xee\x0e\xef\x7b\x8a\xe3\xc9\x32\xcf\x94\x6a\xe7\x47\x44\x3e\xca\x3f\x69\xc2\x47\xe1\xa2\x6a\x0a\x19\x97\x5d\xbb\x80\x8e\x08\x21\xa4\x59\xd3\x12\xd1\xc3\x5c\x2d\x10\x37\x25\x34\x42\x09\x79\x15\x69\xbb\x5f\x25\x7f\xd2\x32\xed\xca\x1a\x9c\xff\x00\xfe\x2d\x1d\xd2\xeb\x82\x7a\xea\x22\x86\xaf\x5d\xa0\x38\xb4\x5b\x26\xd0\xee\x60\xe2\x97\xa4\x0e\xa2\x8e\xfe\x18\xf3\x1a\xd1\x04\xd0\x4f\x02\xef\xc8\x6b\x9e\x93\x85\x31\x71\xbe\x8c\x5b\xe0\x52\x82\xd1\xe0\x4f\x78\x6d\x8d\x90\x5b\xa1\x57\x9a\xab\xf6\xd6\x88\x8a\x4b\x4c\x3a\xbf\xf6\x76\xc8\x62\x5b\xdc\xca\x7d\x71\x5d\xc2\x58\xb6\x05\x2e\x83\xac\x0e\xfd\x5e\x8f\x87\x7e\x2f\xd1\x09\xa5\xe3\xeb\x9c\xc5\x97\x6b\x0f\xe2\xe5\x47\x37\x50\x48\x6c\x40\xee\x0b\x07\xd3\x86\x3a\xe8\xbe\xd8\x46\xef\x68\x00\x79\x6c\xc8\xc3\xa1\x87\x49\x66\x8d\x7c\x98\xf8\x34\xa4\x86\x6d\xc2\x31\xf2\xa9\x41\x42\xba\x69\xdd\x61\x1b\xf9\xf4\xa1\x65\x91\x90\x6e\xd1\x1a\x20\xd7\xc4\xc0\x84\x5f\xc1\x64\xa3\xfb\xad\xf0\x7a\x75\xe0\x1f\x7a\x14\x03\x6d\x41\x13\x74\x4f\x42\xbe\x66\x1a\xe3\xf9\x55\x38\x9e\xeb\x3a\x46\x4b\x7a\xa7\xcf\xb1\xe7\x5f\xdc\xf3\xfd\x8d\x57\xfd\x1e\xf6\x37\x6f\x81\x16\xf9\xde\x16\x12\xff\x2a\x14\x42\xfa\x9c\xde\x8d\xe7\x57\x9b\x96\x78\xfa\x85\xce\x75\x9f\xa0\x25\x9d\xeb\x21\x94\x31\xb9\x9f\xbe\xcc\x28\x2f\x21\x0f\x0a\xe7\x27\xc6\xe2\xc9\xcd\x78\x7e\xbd\x69\x85\xba\x3f\x9e\xb7\x5a\xb8\xb8\x3e\x6f\x99\x33\x70\x70\x5d\x78\x0b\xe4\x5f\x87\x58\xde\xcd\xdf\x71\x7d\x07\xf7\xc2\x7b\x5a\xa6\x7c\x53\xcb\x7c\xfd\x5d\xbc\x85\x3e\xd4\xf1\x7e\x3a\xd7\xef\x66\x95\xf8\xc2\xb9\x6e\x15\x23\x39\xff\x28\x14\xea\x45\x16\x62\xf7\xb3\x86\xff\x80\x26\x08\x3b\x5a\x43\x56\x42\xd3\x02\xe2\x5d\xf6\x74\xf1\x83\x13\x33\x64\xf6\x99\x69\x42\x54\xf3\x5f\x99\x13\x22\xbe\xef\x78\x94\x5f\xa9\xc4\x24\x2f\x59\xfc\x36\x59\xaf\xf9\x0d\xd5\x01\xc9\xef\x6a\xd0\x6e\x45\xa2\x32\x7e\x73\x43\x6c\x4e\x4e\xd3\xc5\x87\x61\xcb\x1c\x19\x06\xb4\xd0\xea\xf6\x3b\x87\xde\x88\x43\xf3\x93\x78\x63\x69\x7d\xf2\x83\xa7\xc3\x77\xa0\xbc\x6d\xd0\xaa\x2f\xde\x06\x80\xa1\xe0\xc6\x1a\x7c\xbb\x16\x21\x57\x85\xa6\x3e\xe1\x45\x13\x67\xff\x42\x74\x4e\x67\xf1\x29\xbb\xdf\x47\x31\xde\x55\x7b\x67\x9c\x03\xc8\x4b\x80\x9b\x53\x5e\x26\xc6\x15\xdf\xa1\xd8\x15\x1d\x8d\x26\x4c\xe7\x3d\x69\x33\x69\xcb\x1b\x76\x1b\x42\x7c\x8e\x75\x66\xa5\x46\x71\xf0\xe3\xfb\x2f\x92\x91\x66\xaf\x51\x71\xf0\xf3\x97\xef\xc5\x25\xe1\xbb\xed\x35\x78\xd1\x9a\xad\x3c\x7b\xa6\xdf\xe6\x41\x73\xf0\xba\x77\xb7\x1f\xc5\xeb\x60\xa7\xe5\x75\x2b\xce\x08\xf3\xc8\xb0\x37\x6a\xc0\x44\x9d\x6f\x5c\xa8\x48\x84\x02\x40\x75\xc6\xc8\x6e\x98\x4d\x92\x62\xb2\x98\x4e\x1f\x9c\x0f\xb8\x1d\x07\xff\x79\xfb\xf1\x03\xc2\x69\x6a\x2a\x74\x7f\x7c\x88\x8b\x92\xd4\xaa\xda\xac\x86\xa9\xca\xbf\x27\x86\xd6\xf3\x67\x1a\x80\x49\x35\xb7\x07\x29\xa0\x63\xe3\x3a\xe3\x73\x81\xe5\xf4\xd3\xb4\x48\xbc\xe4\xe3\x49\xad\xa3\x11\x96\xd4\x68\x7c\x3e\x76\x8c\xc1\x89\x90\xd0\x3c\x7e\xcb\xec\x5a\xbd\xfe\x7e\xcc\x5c\x05\xa8\x77\x30\x39\xc6\x1e\xa4\x2a\x4f\xd3\x10\x39\xc4\x23\x01\xd7\x4f\xac\xde\x71\xb4\x93\x20\x68\x21\xc1\x5e\x31\xc4\xa3\xea\x3b\xff\xd1\x59\x7b\xf3\x0b\xf1\xa9\x1c\x5a\xe1\xeb\x70\x69\x30\x75\x66\x24\xa1\x41\x3e\x4b\xc7\xb2\x89\xb5\xcf\x84\x15\xea\x69\x5a\x88\x02\xe2\x1c\x1a\x75\x93\xea\x4c\x2c\x43\x3b\xe3\x89\x5b\xb9\x60\x7b\x30\x12\x07\x46\x83\xb9\xfb\x70\xbe\xe5\x80\xec\xda\x9c\xbb\xf7\xfc\xb9\xed\x23\x48\x13\x0f\xdf\x7a\x30\xb2\xcc\x33\x7d\xed\x15\xf4\x64\x25\xfe\x52\x64\x7b\xa9\x82\x27\x57\x4e\xf4\x4e\xda\xbb\x20\x14\xe2\x90\xed\x04\x7c\xb6\x17\x6e\x9a\x06\xed\x05\x72\x89\x93\x1b\xa1\xf7\xb1\xc1\x07\x6a\x34\x18\xbc\xd2\x14\x50\x97\x25\x78\x46\xe2\x30\x25\x29\xbc\x54\xa2\x0b\x38\x66\x8d\xc8\x6f\xe5\x45\x42\xba\x8b\x81\x1d\x62\x8c\xbd\xc5\xde\x83\x15\x02\x20\xc5\xc8\x8d\xe8\xa6\x58\xd0\x8d\xee\xe0\x38\x84\xe4\x80\x95\x15\xc8\x2c\x1b\xa8\x5e\x1c\xea\x95\x04\x97\x2e\xbd\xfc\xdb\xd7\xe8\x4d\x61\x46\x44\xd3\xbf\x5d\xa0\xd9\x1b\x7c\x49\x12\x2a\x88\x6b\xc6\xa1\xa6\x29\x28\x01\x54\x0c\x30\xda\x78\x24\x79\x35\x34\xb5\x42\x44\x59\x59\xc5\x71\x1b\x52\x86\x21\x17\x4f\xcd\xd9\x3e\x39\xa5\xaa\x66\x72\x73\x1c\x9d\x60\xf2\x93\xe1\xc2\x3e\x82\x58\x57\x8c\xc2\x36\x5f\x2a\x88\xca\xff\x55\x89\x62\xf0\x6e\x1a\x0e\x7b\x67\xca\x0f\x5d\xb3\x6f\x14\x4b\xf7\xc8\xda\x23\xba\x7a\xef\x6c\xd5\x93\x9a\x41\x09\x34\xde\xf3\x4c\x9d\x70\xde\xe2\x2c\x83\x85\xa0\x6b\x59\xc6\x09\xa0\x76\x25\x93\x6d\x7f\x38\x00\x91\x5d\xe4\xa1\x71\x83\x68\x45\x9c\x22\x35\x4b\x1e\xc3\x16\xfd\x3d\x8c\x49\x22\x8e\x7f\xfa\x60\x55\x57\x77\x7e\xee\xd0\x41\xea\xa5\xe9\xc0\x34\x94\x0a\x6a\x1b\x79\x48\xd2\xea\xbf\xff\xee\xbf\xef\x7e\xf9\xee\xa7\x9f\x6f\x30\x4e\x53\x0f\x92\xc7\x28\xd4\xbc\xe4\x13\x18\xde\xdf\x60\xe8\x10\x78\xee\x2b\x73\xf2\xc1\xf9\x60\xc7\xd7\xa3\xee\xc8\xe8\x5b\xfd\x5e\xbb\x6f\x75\xad\x9e\xd9\xeb\x4f\x1c\x14\x63\x3d\xb1\x03\x14\xb7\x4c\xdd\xe5\xff\xe2\x37\x2e\x8a\x75\x13\x17\x48\x95\x13\x19\x2d\x8a\xfe\x10\x9d\x10\x79\xfe\x2a\xef\x11\xde\x09\x4e\xd9\x09\xaf\xb7\x1c\x05\x9a\x66\x5e\x06\xc8\xc0\xd7\x7c\xb8\xec\xa0\x34\xbb\x62\x48\x67\x15\xa8\xba\xdc\x3d\x18\xd5\x19\xd6\x34\x43\xa1\x6c\xc2\xae\x8c\x49\x2b\x46\x2d\x86\x6d\x0f\x31\xdd\x41\xec\x0d\xe3\xcd\xb0\x85\x5e\xd6\x1d\x9d\x85\x54\x12\x0d\x89\x9d\x5a\x43\xce\xaf\x3c\x78\x5b\xa1\xf6\xbc\x88\x26\xcb\x53\x35\x19\x92\x87\x20\x1d\xcf\x25\x32\x5b\x31\xc6\x97\x96\x40\xa4\x75\xcc\x13\x89\x0e\xab\x86\x25\x91\x09\xc9\x2b\x33\x21\x39\x45\x26\xa4\xa3\x35\xce\xc8\xce\xbd\x0f\x8f\x59\xc9\x79\xbd\xde\x38\x82\x2c\xd9\xbc\xec\xe4\x66\xaf\xfe\xf1\xbd\xb1\xde\x71\x30\x60\x1b\x46\xc0\x4f\x1f\x7f\xb4\x6e\x4e\xd6\x69\xfd\x7b\xc7\x6a\x1c\xbf\xd7\xd7\xd7\xd4\xc0\x93\x8e\xd9\x82\x20\x46\xbd\xdd\xc3\x6f\x1c\x6c\x77\x44\x67\x99\x86\x35\x3a\x0b\xa1\x00\x89\xb1\x8a\xce\xaa\xce\x56\xde\x71\x72\xb6\x1e\xaf\x62\x75\x7e\x7a\x68\x60\x1a\x98\x52\x39\xf5\x0e\x66\x5e\x2e\x31\x3b\x90\xd2\x0a\xeb\x66\x4e\x11\xc7\x74\xf3\x12\xb1\x37\xee\x1b\x17\xe3\x37\xc8\xbd\xb4\x64\xff\xf6\x86\xe6\x79\x10\x44\x68\xc3\xab\x75\x0c\x94\x4a\xba\xaf\x8c\xec\xe0\xaf\x10\x57\x3b\xdd\x5e\x03\x69\xde\xa1\x90\xb0\xff\x79\x44\x56\x2c\xdb\x47\x90\x9b\x0b\x0b\x75\xb0\x63\x9d\x21\x7c\x43\x4d\x56\x2f\xdb\x20\x6e\x18\xa8\xe7\x2d\x0c\x4a\xc0\xb7\x37\xf3\xd2\x20\x5c\x5e\x52\xf2\x7e\x87\x42\xf7\x6c\x0d\x15\x8e\x72\xc8\x87\xed\x52\x83\x24\x87\x8e\xb3\x08\xb8\x71\x92\x31\x8e\xae\x90\x4f\xbd\x4a\x94\x9b\xab\xeb\x33\x91\x46\x2e\x78\x83\x42\x1a\x5d\xfa\xf8\x4d\xa8\x9b\x24\xa2\x3e\xb6\x03\x9d\xfa\xd7\xc6\x04\x85\xd4\xbf\x8c\xf0\x9b\xd0\x2e\x28\xde\x23\x31\x1a\x26\xe6\xa5\x61\x47\x6f\x1c\x14\x48\x1d\xa8\x63\x9c\x22\x7e\x38\x54\x08\xa0\x57\xbc\x4d\xb2\x7e\xfd\x23\x1f\x6a\x01\xad\x9e\x42\x3d\xd4\xb5\x46\xdd\x51\x7f\x60\x8d\x7a\xa4\x87\xd3\xd4\x52\x68\x8e\xb6\x05\x19\x9e\x17\xde\x64\xa0\xa1\xfd\x5e\xaf\xd3\x23\x21\xd5\x63\x12\x50\x9d\x0b\xb7\xbe\x16\x72\x01\x4e\x0b\x8a\xec\x27\xa9\xf7\xc6\xd1\x11\xf2\xb5\xf0\xfa\xfa\xda\xec\xe3\x37\x8e\xee\xbd\x41\xbe\x16\x88\x9f\x57\x57\x66\xff\xfa\xfa\x3a\x77\x15\x0d\x47\x27\xa2\x7d\xeb\x03\x84\x2f\x15\x5e\xb1\x54\x98\xc6\xc9\xb5\x62\x1d\x2c\x4d\xe3\xc8\x02\x86\xdf\x78\x62\x5d\xb0\x8c\xc3\x35\xf4\xf5\x71\x0e\x49\xd5\xec\x7c\x73\x17\x93\xd3\xec\x9c\x21\x0f\x1c\xb4\xe2\xc4\x5e\x2f\xde\xd3\xb4\xda\x41\x0b\x2e\x65\x0b\x0c\xd3\x3c\xdc\x78\x5f\x6f\x42\xe4\x2d\x7d\x3b\xdf\x1c\x84\x78\x6a\x9c\xd0\x6d\x1a\xb5\x52\xb9\x58\x1e\x2e\x90\xec\x79\x9b\x4b\x33\xaf\xaf\x95\x4d\x43\x54\xa6\x0b\x94\x19\xe6\xfc\x55\x9e\x36\x10\xc6\x66\x6d\xc3\xaf\xd2\xa3\x17\x52\x0c\xec\x4c\x2d\x0f\x89\xed\xd2\x46\x42\x60\x69\xb9\xa8\xc5\xff\xe2\x37\x28\xc9\x17\xd5\x41\xcf\x3c\x11\x5d\x72\x74\x63\x60\xcf\xdb\x53\xdf\xed\x60\x53\x2f\xac\x23\xbc\x82\xc4\xa7\x01\xaf\x5a\x61\x10\x96\x8b\x82\xed\x8b\x83\x96\x69\x23\xd6\xf2\xf1\x25\x34\x43\x17\xcd\x10\xee\x31\xa3\xdf\x10\xdf\x52\x48\xd3\xbc\x1a\x44\x56\x06\x64\xe9\x7e\x67\x78\x22\x45\x62\x7d\x54\x42\x18\xa0\x57\x0d\x03\x3c\xd5\xc0\x30\xf1\xdd\xe6\x7d\xd8\x98\x78\x76\x20\xc2\x01\xf9\x4e\xd2\xef\xf6\xce\x44\x30\x57\x34\x20\x19\xa9\x03\xaa\xfa\xc0\x32\x7b\x52\x43\x14\xfa\xb5\x5b\x06\xed\x24\x25\x19\xa5\xa0\x3f\xb4\xfa\xd2\xce\x2d\x03\xf4\xd6\x65\xc4\xd9\xb6\x18\xba\xab\x92\x29\xf1\xb1\x9a\x3b\x60\x5e\xcd\x2f\xb8\xac\x2a\x62\x2f\x7b\xe9\x97\xee\x69\x1e\x64\x4a\x36\x34\x98\xde\xcf\xc8\x1d\xdd\x54\x74\xb4\x07\x9a\xa0\x15\xba\xc3\x98\xd2\x7b\x72\x10\x26\xbe\xf8\x47\x83\xc1\x0a\x83\xc9\x5e\x28\x86\x48\x96\x48\xd7\x28\xae\x18\x55\x6a\xb4\xc9\x79\x54\x91\xa6\x15\x0e\x4c\x8b\x2b\xaf\xdd\x0e\x85\x6c\xce\x28\xa2\x2f\x28\xc2\xb8\xca\x0f\x62\x70\xf5\xa1\xdb\xa3\x94\x8a\x60\xc5\xe1\x50\xb8\x93\xa3\xea\x4d\x16\xbf\xc9\xb4\x84\xdf\x58\x8e\xe7\x0f\xce\x87\xc2\x22\xdd\x1d\x8a\xe7\xa5\x7b\xae\xf6\xac\x89\xf7\x7c\x72\xa3\xa1\x1d\x52\x8b\x04\xb4\x3b\xaa\x3a\xe2\x06\xd2\x55\x67\x9a\xa6\x1d\xd2\x21\x09\x68\xaf\xb7\xe7\x8e\x93\xc1\xbb\x11\xb8\xdb\x20\x7a\x3b\x92\x64\x1b\x56\x01\x3b\x96\x54\x77\x0e\x70\xdc\x79\x0b\x84\x12\xea\x55\xab\xe3\x62\x7c\xd5\x1d\xa6\x69\x72\x1d\x54\x5a\x92\x4f\xd2\x3c\xc5\x16\xf2\x48\x98\x87\x89\xe8\x51\x26\xdc\xf6\xf7\x44\xd9\x20\xf5\xc2\x08\x4c\x40\x5b\x6c\x90\x6a\xdc\xc3\xe1\x06\xa9\xba\xf1\x6c\xaa\x18\x97\x42\xc7\x73\x25\x9c\x5f\xa8\x2b\x62\x67\xdd\x17\x3f\xae\xcc\x89\x61\x33\x12\x02\x2d\x65\xe1\x31\xaf\xd9\x23\x34\x0d\x3d\x4c\xb6\xd5\xf5\xf3\x2e\xe7\xb4\x96\x04\x9c\x38\xc3\x76\x82\x42\xac\xd0\x7b\x3c\x89\xc0\xa4\xb4\x41\x4f\xc8\xc7\x98\x84\x24\xc6\x36\x3f\xcc\xc8\x47\x1a\x4e\x1e\xd1\x06\xdb\x6a\xa1\x3b\x92\xf7\xef\x3e\xc8\xa3\x0f\xce\x07\xf2\xe1\xe6\x47\xc8\xc0\x7e\xf7\xee\xc3\xdb\x77\x1f\xde\x7d\xf9\x2b\xf9\xf4\xf1\xf6\x5d\xfd\xcc\xcd\xa7\xdb\x77\x3f\x7d\xfc\x40\x72\xb5\x8b\x78\xd1\x3b\x3f\x66\x4b\x16\x12\x08\x1a\x26\x5e\x74\xeb\x2c\x58\x7e\x8e\xbf\xea\xf6\xbb\xb7\xbc\x80\x2f\x37\x3f\xde\x7c\x86\x37\xd6\x4e\x54\x32\xb3\x15\x19\xce\xca\x32\x17\x61\xb0\x91\x66\x90\x10\xf8\x1a\x72\x66\x61\xa2\x62\x72\x4b\x8d\xf1\xc7\x7c\xa8\xdf\x8e\x6f\x75\x1d\xbb\x68\x43\x9e\xe9\xc7\xe9\xed\x0c\x6b\x9a\xe2\xa2\x1b\xf2\x8c\x35\x6d\xc9\xff\x92\x39\xbf\x86\xf1\xf8\xa6\x62\xc9\xb9\x23\x77\x35\x6a\xe7\x1b\xe2\xa0\x80\xdc\x93\x1b\x88\x7b\x1c\x34\x29\x14\x87\xdb\x6e\xbe\x4c\x94\x4b\xa7\xec\x25\x3b\x57\xc1\x64\x22\x5a\x61\xa8\x36\x1b\xd2\x2a\x9e\x53\x68\xde\xe5\x36\x5f\x25\x05\xac\xd5\x18\x18\xe7\xd8\xf9\x9a\xca\x92\x3d\xcc\xc5\x83\xd1\xd0\x1a\x09\x01\xc7\x18\x75\xfe\xb1\x06\xc3\xb7\x6f\xda\xaf\x63\x85\xc6\x12\x40\xd6\xeb\x9c\x05\x5a\x14\xd5\xa9\x68\x08\xd5\x3d\xaa\xe9\xcd\x95\xf1\x76\x4c\x8e\xd2\x34\xbe\xcb\x5e\x1d\x38\x3c\x85\x70\x6a\xf5\xac\x7f\xac\x17\xf7\x47\xb7\x7d\x50\x3e\x6f\xb8\xd1\x94\xcb\xf1\xac\xe2\xf7\xe6\x8a\xdd\x6a\x2c\x7f\x64\x1a\x67\xc9\x74\x90\x52\x11\x9f\xe8\xcd\x5c\x58\x93\x26\xa6\x72\x66\x8a\x70\x80\xf2\xb7\x50\x20\xad\xde\xf0\x3c\xf3\x18\x24\x42\xfc\xd6\x17\xbf\xf3\xab\xaf\x7d\xe7\xcb\x97\xf6\xad\x5e\x43\xa2\xf3\xb3\x5d\x66\x3e\x02\x2e\x0a\x99\x0d\x4e\xb0\x4d\xb9\x85\xd0\x90\x50\xb3\xdd\x8e\x83\xb7\xde\x33\x9b\x93\xa8\x6a\xc6\x58\xd4\x56\x73\xbe\x2b\x57\x8d\x38\xd4\x9f\x84\xb6\xff\xef\x16\xa5\xe6\x04\x2e\xb7\x4c\x12\xbe\x61\xd8\x8e\x11\x7b\xc3\x88\x7f\x69\xf1\xfd\x84\xac\x8f\xb2\xb9\x87\xb4\x65\xf2\x8a\x8e\x75\x3d\xbc\xea\x8f\x71\x3c\x0d\x67\x14\xb0\x1e\x6f\xf8\x21\xfe\x77\x93\x0d\x80\x8a\x24\xb8\x34\xd9\x00\x67\x64\x4b\x8f\x28\xbb\xb4\x0f\x78\x85\x56\xcb\xbf\xa6\x06\x2f\xc8\x9f\xd1\x08\xa1\x50\xa7\xfc\x10\x5f\x32\x4c\x42\x1a\xfe\x3b\x7b\x63\xb2\x41\x46\x56\x47\x08\x61\xfa\x40\x0d\x35\x6e\xb5\x18\x94\xc2\xc5\x0c\x55\xa1\xd4\x4f\x53\x80\x52\x08\x2a\x67\x48\xdf\x24\xbf\x77\x1e\xb2\xce\x4f\x8d\xf9\xb3\x79\xa7\xe8\xd2\xb6\xac\x1a\x2a\x19\xb4\x72\x2c\x18\xd6\xc3\x22\x8b\x7d\xd6\x34\x30\x0e\x70\xd3\x9a\x86\x54\xa3\x6d\x18\x06\xaf\xc7\x90\xb5\x7a\xf9\x77\x42\x1d\x9c\xa6\xaa\xc9\x4f\xb7\x47\xc5\x49\x03\x4e\xb6\xad\x1e\x3f\xcf\xff\x96\xf7\x5b\x70\xc9\xa8\xff\x67\x5a\x43\x7e\x27\x32\x9e\xe7\xcc\xb8\xef\xdf\x77\x9c\x41\xbf\x6b\x18\x43\x03\x57\x8a\x04\x90\x65\x75\x23\x96\x2e\x99\x5d\xe1\x13\x83\x3b\x8f\x04\xd4\xba\x10\x78\x21\x9c\x63\x91\x48\xc0\xf3\x48\xa7\x06\x29\xfe\x9f\x91\x39\x55\x55\xb2\xa4\xaa\xa1\x72\x91\x43\xd2\xc1\x59\x4d\x64\x5c\x25\xbf\xc9\x22\x74\xc4\xb8\x9c\x7b\x4b\x2f\x8e\x84\x50\x98\x28\x34\x91\xf2\x8d\xfa\xc1\xf9\x00\xc5\x25\x57\xb4\x65\x32\xcb\xe4\xc2\x0f\xe5\x07\xb8\x4e\x37\x90\x88\x27\xaf\x0c\xa0\xd1\x56\x5b\x2a\x49\x68\x2b\xc1\x24\xb9\x36\x59\xcb\x32\xf9\x20\x60\x47\x86\x8b\x41\x7c\x1a\x8f\xfd\x6b\xda\x35\x46\xfd\x31\x66\x3a\x35\x2d\xe2\x5f\x8a\x9f\xe0\x4b\xf1\xaf\xa9\x25\x2e\xf0\xf3\x56\x09\x93\x41\xc9\x9b\x05\xb2\x48\x7f\x44\x4c\x8c\x5b\xfd\x11\xf1\x29\xbb\x32\x26\xe2\x6c\x8b\x11\x13\xdb\xc9\x25\x3f\xe6\x87\xc4\x7f\x43\xbb\x3d\xa3\xd3\x1b\x8d\xfa\xd6\xa0\x33\x30\xba\xa3\x3e\x41\x8c\xf6\xac\x16\xc3\xd7\x86\xa8\xd2\x1a\x3d\x12\x83\xf8\x7c\x9c\x47\xe3\xf0\x9a\x0e\xc6\x98\x9f\xe2\x33\xc8\xc0\x24\x6c\xd1\xc1\x38\xbf\x6d\x81\x4c\x83\x84\xbc\x60\x7e\x85\xb2\x96\xc9\x1f\xb0\x3a\x63\xbc\xe5\x4f\x5c\x5d\x59\x1d\x78\xc2\xea\x8c\xe5\x89\x10\x13\x28\x8c\x3f\xc3\x4f\x59\x98\x2c\xe9\x0a\x3d\x8a\xf8\xe3\x8b\xe2\xdd\x6b\x71\x7b\x8b\xf1\x92\xc5\x1d\xd5\x99\x50\x7a\xf0\xa2\x6b\x63\x32\xd7\x11\x72\xe9\x32\x9f\x1b\x57\x34\x9a\xa8\x46\x5b\xad\x3d\xd0\x72\xb1\xbe\xb4\x97\x05\xbb\x9c\xdb\x8a\xb0\xae\xb6\x55\x3d\x3f\xc5\x4f\x60\x7b\xae\x2f\x25\xd0\xbd\xc1\xc0\x7d\xbe\x2b\xba\x58\x24\x61\x3d\xfc\x14\x32\xd7\x8b\xbc\xc0\x3f\x67\xa6\x36\x68\xfa\x62\x76\xca\xd6\x98\xa4\x00\x1b\xee\xc7\xce\x3b\xfb\xd3\xa9\x78\x71\xd3\xbe\x5e\x81\x9e\x39\xb5\xa8\x09\x6c\xd7\x7f\x93\x38\x37\x42\xf5\xcf\x32\x0f\x43\x72\xdb\xda\x76\x25\x13\x49\xee\x6f\x57\xb5\x8c\xb4\x12\x15\x20\x7e\x88\xbd\xca\xb4\x3a\x0d\x6f\x3c\xdc\xf9\xf7\x8b\x8f\x56\xce\x46\x22\x58\x4d\x8b\xf7\x84\x48\x2c\x69\xe7\x1a\xad\x14\xd5\x8c\xb3\xf0\x0e\xa2\x90\x33\x5a\xa3\x04\xf2\xc5\xbc\x19\x07\x49\x20\xf3\x34\xaa\x22\x9a\xca\x6c\x80\xad\xfc\xdf\xbc\xfb\xc5\x2e\x55\x74\xe1\x11\x19\xf5\xce\xfa\x8a\x90\x14\x0a\xb7\x65\x54\xd0\x89\x3a\x64\xa4\x48\xaf\x74\x44\x7a\x94\x46\x0e\xb3\x77\x96\xfd\xb6\x33\xea\xf4\xf2\x24\x53\xbd\x9c\x35\xa8\xc2\x68\xd1\xef\x5a\x9d\x21\x6e\x07\xfe\xdb\x90\xb1\xdf\x59\x99\xc3\x6e\x01\xbf\xcf\xe8\x2d\xaf\xb6\x07\x21\x13\x67\xb8\xd2\x7d\xa2\x98\xa6\xb6\x24\x9a\xe6\xa0\x18\x4f\x12\x04\x31\xa5\xb6\x10\xcc\xcd\xa1\xd5\x10\x68\xd7\x34\x2f\x3a\xd6\xb0\x7b\x2c\x0e\xe6\xb0\x53\xb9\xea\x76\xd3\xd0\xb1\x62\xcb\xd8\x65\x25\xd3\x4f\x5c\x0d\x7e\xf3\xf1\xce\x43\x8c\xf0\x83\x8c\xec\xbe\xbb\xbd\xbb\xf9\xf0\xe5\xf3\xbb\x9b\x5b\x91\xfd\x5f\xf8\xef\x7a\x56\x77\xf0\x4d\xb6\xf4\x6a\x44\x57\x61\xfd\x71\x4b\x7b\x54\x42\xeb\x0b\x11\xf4\xe9\x39\xe3\xd6\x4d\xd3\x44\xf6\xbd\x2b\x50\x66\x8d\x09\xd4\xec\x46\x58\xb0\x74\xae\x49\x90\xd4\xc0\xec\x9d\xe0\x28\x3e\x98\x55\x82\xee\x73\xd4\x19\xf4\xf7\x93\x7f\x8a\x06\x82\xdd\xec\xd5\xef\x54\x19\x37\xc7\xea\x5e\xff\x7a\xc5\xa6\x4f\x44\xee\x57\x48\x1a\xed\xb6\x17\x24\xa2\x1e\x0a\x31\x59\xd0\x1d\x17\x74\x8d\x71\x61\x83\x5a\x8f\x71\x81\xbb\x45\xbe\x88\x73\xa6\xd1\x74\x0d\xde\x15\x4d\x4b\xd0\x02\x5a\x9a\x0f\x07\x01\x30\xec\x99\xa3\xf3\x96\x98\xca\x9e\xd5\x19\x0e\x71\x7b\x71\xc6\x57\x6b\xd8\xa2\x94\x13\x79\x40\x4d\xb1\x1d\x35\x5c\x92\x68\x9b\xa1\xf5\xad\xa3\xb1\x02\xf5\x12\xe0\x18\xb7\xc8\x71\xf9\xad\xf5\x77\xaa\xf3\x5f\x8e\xc1\x57\xb2\x5d\x8a\x71\x87\xa5\x6b\xa1\x6b\x9d\xa5\x96\x57\x92\xb7\x8b\xb5\xcc\x29\x89\xe7\x6f\x9e\x63\xe6\x47\xde\xfd\xfa\x9c\xd5\xab\xa1\xf6\xa0\xc6\x97\x85\x34\xd4\x59\x51\x3c\x50\xe3\x91\xe2\xa4\xa9\x53\xd4\x7e\x60\x9c\x69\x54\x38\x55\xfb\xb7\x61\xf0\x3b\xf3\xff\x89\x9a\x8b\x02\x9a\x6a\xed\x01\xf5\x1b\xc4\x62\x3b\xf9\x46\xd2\xef\x37\xd9\x03\xbe\xb1\xce\xb7\xcc\x59\xb3\xf9\x3f\x51\x67\x51\xc0\xb9\x75\x1e\x0c\x9b\x28\xff\x5e\x95\x64\xe0\x4d\xb0\x81\x0f\x06\x42\x74\xe8\x76\x8c\x86\xc8\xdc\xa6\x50\xb9\x32\x0d\xac\x4c\x55\xfd\x7a\x5b\x1b\x10\xc6\x5e\xde\xe2\x07\xf6\xd2\xb8\xbf\x7b\x39\x7f\x22\x5f\x74\x8c\x6e\x83\x9b\xed\x74\x0c\xdb\xfe\x6e\xee\x94\x12\x40\xd5\xae\x50\x24\xd0\x64\x8f\xcc\x8f\xe5\x50\x0f\xfc\x53\x72\x49\x11\x7d\x7f\x74\xb7\x77\x32\xb2\x3b\x28\xf1\xc8\xc6\x1f\x88\x8d\xdf\xab\x6c\xfc\x5d\x6b\x74\x22\xcb\xc6\xbf\xa2\xb9\x11\x73\xd6\xff\x74\x0b\x79\x21\xe7\x37\x6a\xd8\xe9\x36\x80\x70\xcf\x19\xa9\xf5\x34\xaa\xb6\x8f\x20\x31\xab\xc8\x47\xd2\x1b\x34\xc0\xdd\x1f\x0f\x93\x6a\x4a\xef\x15\x08\x1c\x1d\xd3\x1c\xe1\x71\x98\xa6\x41\x43\xfa\xd4\x12\x1a\xea\x91\x9d\x48\x77\x27\xf2\x60\x40\x76\xe5\x6f\x11\x70\x45\x08\xfc\x69\x51\x4c\x26\x0c\x3d\x25\xde\x5a\x5d\xf3\x44\x13\x1b\xad\x88\x22\x61\x41\xe5\x3b\xbe\x6a\x30\x34\x7b\xc3\xb3\x2c\x95\xa5\xc1\xb0\xf9\x1d\x47\x6c\x83\xbd\x6e\xaf\x01\x66\xde\x9c\x74\x4d\xb2\x56\xcb\x97\x26\x65\x16\x88\xa8\x74\x4d\x2e\xca\x8c\x22\x6b\x81\xf2\xeb\xcb\xf4\x6a\xf2\x3b\xaf\x40\x55\x1e\xf0\xc7\xc0\xc9\x08\x03\x06\x5c\x8c\xc2\x59\x0b\x0e\x46\x48\x5f\x82\xc1\xbd\x28\x27\xd2\x7d\x19\x09\xb8\x01\xc9\xcd\xe0\x85\xdd\x95\xd9\x16\x1f\x4a\x69\xfb\x89\xe6\x34\x29\xe4\x19\x64\x3f\xcb\x34\x31\xb9\xe1\xf7\x5a\x46\xd7\x80\xe4\xbb\xe4\x23\x40\xa0\xc1\xc4\x79\x0b\x51\x41\x56\x07\x93\x2f\x20\x1f\x8e\x86\x23\x4c\x7e\x2b\xf2\x5d\x92\x4f\x00\xa9\x34\x3b\x98\xbc\x2f\xc9\x2c\xde\x95\x3e\xd8\x1f\xca\x08\xdb\xef\x01\x57\x36\xec\xf6\x31\xf9\xae\xe4\xe7\xfe\x50\x06\x19\x7e\xa6\x3f\x54\xc3\x6d\x7f\xa2\xea\x27\x91\xe6\x52\x25\xff\x43\xdf\x43\x5a\xba\xdf\xe9\x7b\xa8\xe1\x5b\xf1\x5b\x12\x61\xfc\x84\xc9\x8f\x74\x0d\x49\x70\x8b\x29\xf1\x2b\x5d\x93\x3f\xd3\x1f\xc9\x9f\x68\xd4\x2e\x3c\xa6\xe4\x67\x1a\xb5\xe7\x81\x0b\x3e\x33\xf2\x77\x1a\x15\xb4\xdf\xbf\xd0\xdf\xda\x0b\xf2\xdf\xf4\x17\xf2\x57\xaa\x28\xe8\x67\x4d\xfb\xb9\x2d\xd4\x64\xa0\x4a\xd6\xb4\xa8\x3d\x97\x14\xe0\x70\x02\x93\x3f\xd0\x86\xe8\x78\x59\xe1\xcf\x8c\x4f\x19\x2f\xf0\xe1\x5e\xf2\x17\xaa\x26\xfe\xca\xf1\xe7\x6b\x36\x0f\xf3\x4b\x2a\xf9\x4f\xaa\x98\xe4\xbf\xe8\x3b\xf4\xd3\x21\x3a\xfb\x0e\xfd\x0a\x7c\x1b\x4a\x41\x28\xfa\x2b\xd8\xd3\x14\xa6\x69\xfd\x3e\xa5\xf4\x43\x9a\x26\x9a\xa6\xfc\xb9\xbd\xf0\x7c\x67\xbd\x7e\xa9\xc5\x42\x7e\xb8\xa6\x3d\x53\xd3\x2e\x45\x4a\xbe\x0b\x37\x98\xb3\xcb\x76\xcc\xa2\xf8\x80\x01\x50\x24\x50\xfb\xb5\xc6\x99\x13\x8b\x25\x33\xac\xa7\x55\xad\x2e\xaa\x35\x8e\x90\x0c\xe7\xba\x17\xf2\x6b\xce\xaf\x5d\x86\xa7\x9f\x67\x34\x24\x0a\xfa\x4f\xea\xb7\xe3\x15\xf3\x6b\x85\x54\x39\x0a\x42\x2e\x23\x30\x4d\xfb\x5e\xd3\x94\x3f\x64\x98\xc4\x31\xfd\xaf\x34\x55\x9e\x6a\x15\xfb\xb5\x2d\xb8\x0d\xda\x02\x47\x5c\xaf\x03\x26\x2c\x3e\x64\x83\x2d\xb2\x45\x29\x2f\x20\x87\x34\xc4\x49\x03\xab\xc9\x8a\x41\x1a\x65\x96\x11\x3f\x6e\xe0\xdc\x8d\xdb\x7e\x10\x7b\x0b\x8f\xcd\xf1\xae\x3c\xa6\x8a\x21\x3b\x31\x6e\x87\x4c\xd8\x4d\xa3\xf1\xc7\x1a\x59\x43\x61\x91\x97\x99\x83\x49\x40\x4d\x4a\xe3\x36\x90\xc6\x13\x8f\x1a\xe3\x9c\x1b\xe1\xda\x1b\x57\xd2\x7b\xf0\x85\x63\xea\xe9\xfa\x8c\x2c\x68\x30\x89\xda\xc1\x83\x1d\xb5\x17\x8e\xb7\x26\x6b\x1a\xe5\xd9\x60\xc9\x16\x8e\x81\x3c\x64\x05\x43\x7b\xe3\x78\x3e\x70\xd0\x2f\x26\x28\x48\x53\x64\x41\x2a\xac\x62\xd0\x69\x9a\x13\x43\x64\x6b\x79\x8a\x9a\x98\x28\x06\xa5\x74\x31\x71\x68\x68\xa3\x95\xa6\xad\xda\xcc\x8f\x59\x88\x20\x21\x09\xd7\xc2\x56\x9a\x86\x56\x6d\xf6\xec\xc5\x88\x2f\x6e\x8a\x81\xf9\x25\x2a\xe6\x0f\x1f\xf0\x93\x2d\xfa\x13\xca\xa7\x6b\xcb\x5d\x39\x9e\x7f\xe1\xbe\xb8\x6b\xa6\x62\x6c\x23\x97\xb2\x18\x39\x18\xe7\xa1\x05\x0e\x59\x93\x2d\xb6\xd7\xfc\x9c\xbd\x45\x61\x9e\xae\xe9\x11\xef\x56\x9a\xa6\x24\x50\x03\xf1\xb2\x2d\x7a\xc4\x59\x56\xe9\x5e\x3a\x9d\x91\xea\x17\x30\x09\xd3\x34\xa5\xd6\xc4\x20\x16\x5c\x4f\x19\x09\xe3\x03\x17\x89\x5c\xb1\xc7\x7f\x9d\x20\x14\xd2\xda\x24\x47\x2a\xfc\x51\x31\xce\x9b\x45\x19\x09\xf9\xab\xa3\xc0\xa7\x3e\x09\xdb\x9e\xef\xc5\xe2\xd6\x98\x28\x26\x51\x0c\x4c\xf6\xd6\x05\x14\x62\x6c\x87\x74\x27\x0b\xb0\x19\x11\x8f\xdb\x7e\x46\x94\x3f\x68\x1a\x0a\x68\x34\x55\x03\x5f\xd5\xe3\x19\x9e\x04\x28\xc4\x76\x4c\x29\xfd\x8b\xa6\x7d\x41\xea\xcf\xf9\x22\x71\x21\x1f\xbf\xa8\xac\x16\x3e\xce\x48\x50\x1f\xe1\x37\xa2\x3b\xa3\xfd\xe5\x83\x01\x3d\xcf\xc2\x71\x9d\x39\x60\x01\xc4\xc8\x03\xd8\x41\x2c\xd4\x1e\x46\x3f\x55\x47\xe9\x77\x93\xbf\xb7\xd9\xc6\x8b\x51\xb9\x4e\x7d\x2e\xdf\x1c\x12\x1f\xdb\x61\x8c\xfe\x02\x7e\xaa\xac\x3e\x7a\xbe\x4b\x53\x28\x74\x62\xd9\x26\x61\x6d\x48\xa7\x9c\x23\x55\x98\x78\x31\xdf\x4b\xbd\xb8\x89\x4a\xdb\x54\xf6\x46\xa7\x12\xb7\xb7\x4e\xc8\xfc\x38\x23\xce\x99\x6d\x2d\x5a\x3a\x2e\x5b\x51\x94\xf8\x67\xd1\x18\x95\x30\x68\x41\x79\x61\x55\x5c\x20\xb2\x7b\x40\x32\x73\x0f\x07\xcc\x7e\x04\x40\xc8\xd7\x42\x06\x9d\x92\x65\x24\x39\x7c\x20\x6e\xcf\x03\x9f\xa5\x29\x12\x07\x54\x31\x88\xaf\x69\x28\xa6\x3e\xce\xdf\x45\x19\x91\x2b\x00\xb5\x88\x18\x4d\x06\xc6\x19\x89\xe2\x06\xbf\x20\xac\xfa\x50\x14\xde\xb1\xa2\xc8\x10\xbe\x62\x88\x61\xb2\x7b\x0b\xc4\x64\x2f\x00\xa8\x46\x74\x7f\x39\x23\x2f\x5c\xa0\xec\xbe\xe7\x03\x0a\x16\x8e\xf9\x85\x17\x47\x6c\xbd\x90\xb8\xa0\x80\x4f\x50\x1f\x8f\x83\xc9\xc7\x7d\xf2\xd9\x90\xee\x72\x2a\x25\x78\x55\x90\x67\xd1\x77\x79\xb5\x43\xc2\x30\x3f\x4a\xc4\x21\x2e\xd3\xf2\x27\x31\x0a\x89\x27\x8c\x51\x36\x92\x23\x81\xfa\x84\xc9\x76\x9b\xbc\xdd\x0c\xd2\x0d\xd4\x1e\x2a\xde\x26\x1f\x06\xb4\xcc\x7f\x69\x1a\xfa\xb5\x36\x1c\x36\x22\xfc\xe2\x57\xf2\x13\x26\xf7\x22\x5f\xc5\x41\x60\xe1\xff\xc8\x5f\xbc\xda\x31\x72\x63\x14\xc5\x65\x75\xcb\xca\xfa\xf0\x5e\x26\xbe\x27\xaa\xef\x7a\xbf\x57\x79\xb3\x7e\xca\x49\xa5\x48\xbe\xfc\xf0\x63\x31\x5e\xf9\x51\xb1\x46\xd9\xd3\x19\x29\x46\x1a\xbf\x02\x4d\xb6\xf3\xa4\x68\xc2\x7c\xc5\xb7\xac\x0a\x72\x64\x85\xfe\x4c\x7f\xad\xc8\x2f\x3b\xbe\x25\x35\xa2\x69\xdf\x16\xec\x89\xbf\xa0\x67\xd9\x0d\xb8\x42\x8f\x11\x3c\xd0\xa6\x30\xa6\x34\x8d\x49\x08\x3b\x48\x93\xe0\xc2\x34\x8d\xaf\x75\x62\x03\xa1\x7c\x26\x89\xc3\x9c\xa5\xcb\x97\xf3\x12\x46\x73\xb9\x1a\x8b\xd0\xfa\x10\x92\xf3\xfa\xe2\xcb\x6a\x9a\x1f\x23\x9f\x7f\x58\x91\x43\x04\xf2\x94\x13\xe8\xea\x46\x40\xc7\xca\x8b\x84\x68\x20\xdf\x04\x0a\x44\x35\x3b\x66\x2e\x12\x71\x41\x25\x24\xf0\x59\xf1\x38\x8f\xa0\x82\x55\x3a\x26\xf0\x53\x8e\x6d\x5a\x7c\x69\x79\x96\x7f\x08\x9a\x7f\xf5\x8c\xfc\xd6\x5e\xd0\x5f\x1a\x73\x07\x50\x4a\x7f\x4d\x53\xfe\xc7\x9b\xf0\xb7\x71\x6d\xc6\xfe\x6f\xbe\x99\x10\xbe\x29\x35\x74\xdb\x5a\xd3\x7e\x54\x28\xdd\x57\xc8\x30\xde\x39\xf4\x47\x68\x16\xf9\xcf\x34\x45\x5b\xf4\x23\x51\xf9\xaf\x7d\x5e\x36\x29\x3d\x54\xc0\x5a\xfb\xe2\x18\xbf\xcb\xc9\xe7\x1c\x34\x00\x8b\xee\x12\x8d\xa9\x2a\x7b\x04\x5e\x03\x3d\xad\x92\x3f\x0b\x21\xa9\x76\x83\x98\x0a\x32\x74\xfb\xc7\xaa\xac\x26\xa7\xc2\x22\xc6\xbb\xec\x51\xd3\x1e\xd1\x8f\xe4\xcf\x38\x73\xab\x0a\xd3\x53\xe8\x6c\x2b\x8a\xd3\x7f\x65\x64\x27\x57\x17\xfb\xd7\x0c\x93\x39\xfa\x95\xfc\x94\x6f\x8a\x4b\x2e\x92\x7b\x74\xc1\xff\xb8\x85\x26\xf9\xd3\xbe\xa2\xfe\x5f\xc0\x2a\xc4\xbb\xae\xc1\xa2\xff\x4b\x3d\x34\x91\xc9\x0f\x29\xba\xa2\x18\x2b\x84\x95\xb9\xf0\x4f\xbe\x2b\x49\x53\xf1\x3a\x18\x23\x4d\x23\xf1\x16\x25\x9a\xc6\xdf\x09\xdf\xff\x57\x5b\xb0\xb8\xe0\x57\xca\x8d\xe3\x8c\xec\x9c\xf5\xba\xa1\x05\x50\x80\x4f\x7f\x41\x00\x92\x28\x52\xf8\x73\x95\x34\x17\xda\xbc\xfa\x3e\x2c\x86\xc3\x3d\x62\x45\xba\x7f\xe2\x71\x81\xc7\x81\x78\x03\x73\xfc\x50\xf3\x6d\xc8\x4c\xf7\xd4\xd1\x75\x12\x51\xc5\x1c\x7b\x62\x3a\xe6\xd4\xa7\xae\xae\x13\xbf\xe4\xce\xd8\x13\xc0\x63\xbc\x8b\xd2\x14\x45\x7c\x46\x7b\xd3\x64\x46\x63\xd2\x6a\xb9\x69\x1a\x22\x8f\x6f\x45\x01\xdf\xe8\x8b\x13\x59\x99\xf2\x5c\x6c\xf1\x10\x15\x28\x37\x4e\xe2\x97\xf3\x3c\x74\xf6\x28\xa2\x8e\x75\x05\x34\x3f\x38\x6c\x7e\x50\x6b\xfe\x41\x8b\x83\xfd\xf6\x94\xdd\xca\x45\x93\xac\x92\x3f\x5d\xd6\x33\x44\xc1\x61\x3d\xa5\x89\xe2\x3c\x7e\xe9\x0a\xb2\x58\xe8\xe1\x35\x4b\x42\x46\x76\x9f\xd9\x62\xcd\x07\xf1\x4e\xf0\x72\x06\x6d\x79\x82\xa8\xf2\x20\x0f\x53\xec\x76\x1a\x98\xb9\xcf\xc6\x32\x4b\xa8\xb2\x9b\x07\x28\x27\x55\xb8\x71\x54\x45\x25\x2f\x40\x57\xef\x0e\x2d\x49\xed\x23\x58\x80\xb6\x65\x3a\xf8\x55\x99\x0e\xfe\xb1\xb4\x3f\xcc\x0b\x93\xdb\xb2\xc4\x4b\xbf\x94\x89\xe1\x99\x0f\x83\x1e\x0c\x0e\xd2\x0c\xb1\x29\xf5\xfb\xbb\x32\x65\xfc\x43\x99\x32\xfe\x89\x6e\x90\x0a\x31\xa0\x2a\x26\xcf\x94\xf7\xcd\xf2\xe6\x79\x4b\x6e\xe8\x73\x65\xb7\xfb\x48\x2f\xff\xf6\x75\x72\x35\xfd\xdb\xd7\xe8\xeb\x5c\xf9\xb7\x7f\xd7\xde\xe8\x57\xf4\xfa\x3f\xfe\x36\xe3\x67\xaa\xbf\xdf\x5c\x5f\x92\x5b\x7a\xe9\x5c\x2e\xc9\x17\xf1\xe7\x37\xd8\x18\x9e\xd1\x2d\xe6\xba\x32\xf9\x44\x57\xf5\xa4\xc9\x02\x6d\x9b\x27\xe9\x07\xb9\x49\xf9\x2d\x4d\x3f\xa5\xe9\x5d\x9a\x3e\xa4\xe9\xbc\x21\xe6\xfd\xcb\xf4\x09\x58\xf6\x45\xa9\xb7\x69\xfa\x8c\xbe\x60\x4a\xbf\xa4\xa9\x7a\xe9\x5c\x7a\xaa\x42\x9f\xd1\x2d\x51\x3d\x15\x67\xb8\x0a\xd3\x7d\xbf\x27\xbe\x55\xd3\x9a\x25\x24\x22\x2b\xf2\x08\x53\xa1\x06\xc8\x25\x73\xba\xe0\xf3\xe2\xbe\x4c\x26\xe8\x93\x0d\x9f\xf6\x4f\x14\x84\x76\xe5\x51\xd3\xe6\x9a\x76\xaf\x69\xac\xa6\x5f\x97\x61\xc3\x17\x70\x1f\x9a\xa7\x29\xab\x15\x2d\x44\x7d\x96\x27\x84\x17\x19\xd3\x55\x48\x8c\xac\x7a\xfe\xc5\xd3\xe4\x49\x64\x49\xb6\xb7\x62\x5a\x3d\x61\x8c\x09\xa3\x15\x92\x1b\x55\xb5\xd7\xbc\x72\x7e\xa5\x72\xe2\xa4\xcf\xbf\x2d\x23\x77\x9a\xa6\x8a\x3c\xcc\xbc\xc4\x5b\xd0\x70\x14\xc5\xd7\x34\xbf\xcc\x2a\x1f\xa9\xf8\xba\x65\xe2\xbd\xec\x71\x97\xd1\xe5\x52\x24\x90\x0b\xa9\x4f\x3e\x69\x9a\x2a\x72\x69\xe7\xe5\x78\x07\xe5\xbc\x34\x97\xf3\x92\x97\xf3\xa0\x69\x28\x69\xc6\x14\x81\x46\x54\x12\xf0\x00\x25\x54\xbe\xb6\xee\x32\xe2\xf2\xaf\x9d\xf0\x7f\x22\x6a\x90\x05\x24\x12\xbf\xa2\x3e\xf0\x08\x41\x5c\xf8\xd7\xaf\xaa\x40\xbd\xc7\x39\x97\x52\x88\x31\x66\x7a\xf9\x5b\xd7\x43\x3c\xce\x21\xec\x2a\xa4\x82\x61\x98\x97\x5b\x9c\x54\x5c\x2c\x21\xed\x8a\x21\x50\xec\xea\x14\x6e\xb3\x81\x55\xbc\x44\xaf\xab\x48\x9c\xfe\x28\x6d\x36\x12\x92\x13\xea\x22\x65\x7e\xa8\x53\x4b\x68\xe1\x24\xd0\x29\x23\x91\xae\x8f\xdd\xc0\x8f\x3d\x3f\x61\xe2\xf9\x6b\x55\x24\xdb\x49\x6c\x80\xda\x89\x5c\x9e\x4b\xe4\x90\x45\xae\x9a\xf1\x39\x73\xfb\xe2\xc7\xce\x73\x81\x00\x13\x6c\x03\xae\xb3\x8d\x93\x90\x5d\x40\xd6\xea\x0b\x08\x07\xc7\x63\x67\xba\x98\xc1\x3e\x21\x36\x98\xe9\x82\x44\x33\x2c\xfa\x0b\xfa\x2a\x7f\x7b\x96\x4c\x16\x3a\x65\x36\xaf\x96\x04\xe4\x4d\x03\xe2\xcd\x32\x3e\x84\x18\x4d\xa6\xc6\x8c\x6c\x68\x32\x35\x67\x18\xc8\x4e\x9f\x61\x92\x90\x47\x41\x28\x79\xc3\xf7\x73\x14\xa4\xa9\x97\xa6\x9b\x1c\xbd\xa4\x69\x68\x05\x71\x06\x24\x00\x23\x84\x18\x6b\xbc\x32\xab\x76\xe8\x3c\xd1\x18\x7d\xcb\xf7\x56\xcc\xf2\xbb\xf2\x6f\xaa\x1c\x7c\xd3\x89\x97\xa6\x6a\x5b\x85\x2c\x18\x48\x7e\x9f\x89\x47\x15\xc3\x96\xdf\x54\x8c\x4c\x53\xf4\x3d\x04\xee\xa9\xd3\xaf\x5f\xa3\xaf\x5f\x6f\x67\x2a\x34\x5c\xaf\x0f\x89\x7c\x3f\x82\x3e\x08\x31\x26\x1e\xb4\xe3\xff\xf3\xf6\x35\xcc\x6d\x22\x49\xff\x5f\xc5\x9a\xf2\x9f\x9a\x39\x75\x64\x64\xc9\x52\x8c\x32\x56\xe5\x12\x67\x37\xb7\xe7\x4b\xf6\x9f\x5c\xf6\x45\xc7\xa6\x90\x04\x82\xb5\x0c\x0a\x20\xc9\x5e\xc3\xf3\xd9\x9f\x9a\x57\x06\x09\x2b\x8e\x9f\xdd\xdb\xda\x24\x08\x86\xa1\x19\xa6\x5f\xa6\xa7\xfb\xd7\x62\xae\xf3\x8f\xa8\xde\x95\x9f\x97\xc5\xf6\x6f\x18\x23\xb6\x28\xdd\x12\x66\xb2\xcd\x70\x06\x48\x30\x31\x02\xfe\x3d\xb7\x63\x84\xc7\x0e\x41\xce\x56\x2d\x63\x3e\x6a\x30\xd0\xa3\xac\x84\xb7\x75\xe7\xdd\x51\x14\x1f\x5d\x15\xc5\x1a\x5f\x41\xfe\xd8\x22\xd3\xb7\xbc\x46\x5e\x66\x5e\xf3\xc9\xfd\xad\xa8\xa7\xcd\x14\xe8\x6b\x9a\xe1\x5b\x02\xaf\xa8\x3d\x7a\xad\x7c\x58\xaf\x46\xe4\x2d\x7e\x3d\x79\xc5\xc1\x3f\x2f\x6b\xe2\xea\x0a\xae\x8c\xf5\xce\x25\x6c\x70\x02\x5a\x2c\x5f\x91\x72\xaa\x85\x34\x29\x61\x70\x3e\x18\x3c\xa1\x8a\x41\xcf\xde\x09\x49\x56\xfd\xef\x86\x95\x9d\x74\x4e\x78\x89\x76\x19\x66\xc5\x0e\xe5\xa6\xc2\x70\x78\xa0\x7c\xf4\x1e\xe2\x82\x08\x5f\x11\x4a\xd5\xd3\x35\x87\x53\xcb\xf2\x1a\xe2\xd6\xb2\x3b\x54\x2d\x16\x1e\x8a\x8f\xc0\x82\x64\x73\x77\x47\x08\x6c\x0e\xf6\x23\x43\xda\x04\x17\xf0\x80\x0b\x3e\x8f\xc4\x66\x0f\xb1\xac\xa4\x13\x3c\xd8\x41\xf3\x87\xe7\x31\x07\xe7\xfd\xee\x63\xf1\x47\x35\x62\x89\xae\x02\x1d\x55\x26\x86\x1e\x02\x11\x0d\x23\xc6\x65\x6d\x42\x97\x64\x74\x8f\xbc\x80\x66\x93\xb5\x3b\xc2\x4d\x43\x76\xe2\x9d\x4c\x51\x8b\xca\xd4\x94\x7b\xc1\x03\x0e\xf2\x10\x08\xc5\x85\xa6\xa8\xe4\xa1\x7f\x81\xac\xb3\xba\xe6\x25\xc9\xf7\x9e\xb1\xde\x77\xb1\x27\x1a\xd5\x3a\x62\x22\x96\xf7\x4c\x84\xe7\x8c\x75\xad\x10\x66\x4e\x50\xdb\x6f\xb3\xbf\x23\x03\xc3\xd2\xb2\x6a\x20\x1f\xe2\x71\x96\xd5\xc2\x95\x72\xcd\xb4\xbb\x33\x27\x4e\xbc\xb3\x54\xe3\x3b\xd7\xdd\x3f\x05\xb2\xe2\x83\x9f\xff\x75\x90\x15\xe7\xe7\xdd\xde\xb7\x23\x4a\x9d\x9e\x0e\x07\xf5\x5a\x08\xea\xeb\xef\xb2\x21\x37\x2d\x07\xe7\x04\x23\x2f\x9e\x85\x89\x28\x88\x22\x0e\x0f\x40\x6b\xb2\xcf\x2f\x90\x4a\x54\x2c\xe6\xe0\x74\xf8\xfc\xdb\x8b\x7d\x3c\x85\xce\x69\xb4\xe0\x44\x4e\xa3\x26\x3c\x23\x45\x20\x6b\x05\x88\xfd\x2f\xf3\xf0\xfb\xa7\x83\x6f\x47\x10\x7f\x12\x7d\xcb\x28\xbe\x16\x14\xb2\xa3\x43\x34\xf2\x96\x26\x95\x3d\xfb\xf9\x13\xea\x41\x3c\x89\xca\x64\x39\x17\x44\x26\xcb\xf9\x21\x1a\x6b\xf4\x9d\x0d\x4e\x1b\xe0\x22\xbe\x8a\x10\xdc\xef\x3f\x1f\x92\x8e\xa8\x2d\x7e\x88\x4c\x0e\xb8\x30\xf7\xdf\x27\x51\x9c\xbf\x3c\x08\xf6\xac\x86\x6b\x68\x3f\x66\xd2\xc9\x28\xe0\xae\xda\xca\xd7\x11\x83\x0f\x83\xb5\x9e\xf7\x4e\x87\xb6\x44\x6b\x15\x35\xa1\x39\x10\xa3\x02\x2a\x96\x7b\xcb\x2b\x8a\x50\xc7\x8f\xe7\xd9\x4f\x11\x2f\x46\xae\xa1\x18\x37\x34\xc0\x48\x5d\x40\x64\x94\x7c\xfd\xdb\xb4\x70\x6b\x69\x59\x6c\xa9\x81\x53\x1a\xc9\x42\xc0\xa6\x0e\xa9\xba\x63\x6b\xa8\x56\xda\xd9\xa6\x51\xce\x14\x09\x29\x8a\x0d\xaf\xfe\x24\x1b\x34\x2c\xff\x67\x38\x93\xb1\xd4\xa3\xb5\x02\x00\xdd\x4f\x5e\x6c\xc6\xc7\xe5\x61\x81\x55\xc1\x93\xc4\x5c\x88\xa4\x4e\x88\x3d\xb6\x12\x49\xd9\xc8\xce\x0c\x20\xb9\xd5\x78\xa5\x3c\x05\x11\x24\xc4\xf1\xa5\x0d\x9d\x3c\x53\x90\x05\x90\x10\x4a\x69\x24\x01\xe5\xba\x4f\x41\xd6\x7c\xc2\xc4\x0f\xa2\x5b\x7f\x2e\xcb\x3e\xd5\x72\x3b\xf6\xa6\x7e\x9e\xef\xcc\xfd\xfe\xf0\xdb\x0d\xa2\x27\x91\x98\xc4\xf9\x2c\x59\x4a\x61\xac\x7f\x1d\x92\xc7\xac\x11\x02\x24\xee\xd2\xec\x71\xde\x6b\x08\x29\xff\xab\x28\xce\xa2\x3f\x7c\x4d\x30\xfb\xf1\x08\x7a\xf9\x3d\x50\x65\x9d\x1f\x80\xda\x6a\x02\x54\x6d\x40\x0d\x06\xaf\x76\x56\x49\x93\xa6\xd7\xd9\x83\x22\xf1\x2c\xab\xdb\xa2\x9e\x42\xd4\x10\x11\xcf\xba\x8b\x87\xa2\x66\xd9\x12\x76\xbf\x6e\x1e\x78\xd4\x1e\xa5\x17\xde\x88\xaf\x5e\x7d\xda\xae\x18\xcb\x6b\xb7\x5d\x48\xb0\x0f\xdd\x6e\xb7\xdf\xed\x0a\x24\xe0\xfd\x94\x20\xbf\x8d\x8e\xa2\xec\x28\x4e\xf2\x23\xef\x48\x2e\x0d\x93\xb9\x7f\xb4\x62\xc4\x20\x32\x8a\x25\xaa\xee\x8b\xc1\xd9\x59\x6f\x30\x8e\x30\xc7\x46\x3a\x3b\x3b\x3d\x1f\xb4\x31\xf6\x9f\x71\xd0\x8f\x01\xb9\xb8\xe8\xda\x04\xfc\xff\xd7\xb5\x4f\xfb\xed\xb3\x41\xef\xd4\x26\xba\x60\x5e\xcc\x2b\x60\x60\x35\xc3\xbb\xbd\x5e\x43\x28\xfe\xd7\x4d\x7e\x2e\x29\xa3\x4a\x52\x7a\x5a\x94\x3e\x66\x16\xb5\x84\x58\xad\x17\xd3\x39\x54\xac\xa7\xd5\xfa\x1f\x4f\xa7\x86\x68\xdf\x84\x27\xe2\xfe\xbe\x0d\xf4\x7f\x78\xfa\x84\x4a\x6d\x4f\x61\x90\x28\xf7\x96\xd1\x4c\xbe\x9a\x38\x3e\x20\x79\xa2\x9a\xe0\xe9\xf6\x86\x8f\xcd\xfd\x51\x9a\x96\xaf\x7e\x45\x7d\x21\xa1\xd2\xa2\x2a\x36\xc8\xab\x0a\xdd\xcc\xa8\x24\xdd\xa8\x74\xb3\xa6\x11\x0f\xf0\xc9\x68\x64\x04\xf8\xcc\xc8\xc8\x93\x2a\x09\xf4\xeb\x9a\x9f\x66\x6d\xee\xd3\xcd\x20\x93\x30\x9a\x46\x7d\x9b\xa6\xc2\x36\xe0\xd3\x4c\xc3\x4b\xfa\x1d\x71\x17\x24\xd4\x17\x9f\x55\x2f\xdd\x2f\xa8\x8a\xd1\x18\x37\xd7\xae\x71\x70\x4e\x53\x1c\x43\x42\x40\xde\xdb\xae\xdc\x0f\xf2\x96\x5c\x97\xa4\x11\x49\x2f\xc3\xe1\xb7\x9b\x32\x4f\xf9\xf6\xda\x1e\xac\x9b\x83\xcd\x46\x75\x98\xfa\x81\x96\x88\xa7\x83\xf3\xc7\xa2\xea\x9d\xf7\xce\x86\x7b\x6b\x42\x69\xda\x54\xfc\x28\xd2\x09\x04\x97\xf2\x2a\xb9\xc3\xc1\xf0\xb9\xb0\x72\xce\x7a\xc3\xf3\x1e\x7b\x33\xe9\x2b\x86\xe6\x6d\xf8\x89\xe9\x8a\x10\x56\xc4\x4c\x6f\x87\x8a\xea\x05\xfe\x58\x7c\x1c\xc7\x9f\xe4\xfb\xa5\x4d\xd3\x71\xaa\xec\x82\x98\x38\xb1\xbf\x95\x6b\x37\xec\x93\x49\xee\x72\x63\xc2\x9c\x28\xb9\xd2\x00\x6a\xb1\x38\x13\x39\x0a\xcc\x1a\xf3\x21\x85\x99\x84\x6d\xe6\xbb\xf3\x6a\xe1\x55\x85\x5b\xb4\xd2\x8e\xd8\x27\x50\xd7\x32\xcc\xef\x61\x7d\x2e\x69\xda\x59\xc7\x11\x13\xaa\xa3\xb4\x2a\x95\x23\xeb\xa1\xb2\x16\x2b\x5e\x71\x02\x36\xd4\x1e\x49\x10\x56\xbc\xa2\xa2\x07\x22\x43\x85\xe6\xd4\xc3\xab\x89\xed\x92\x51\x38\xd9\xb8\x74\x2e\x9c\x43\x73\x66\xc4\x19\x5d\xae\xf1\x0c\x22\xf3\x0c\x81\x25\x21\xb0\x69\xb7\x4b\x23\xe9\x78\x33\x66\x4f\x71\xc2\xd2\x15\x7e\x90\xee\x81\xb2\xc8\xb5\x22\x79\xfd\xde\x03\xdf\xfb\x80\xda\x2b\xe1\x3e\xf5\xb6\xcd\x4a\x8d\x0d\x76\x27\xf5\xb6\x84\x97\x0a\x34\x6b\xdd\xed\xa9\xb9\x19\x1b\xa0\x35\x1b\xa0\x8b\xf5\x88\xcc\x84\x4e\xf2\xb0\x3f\x59\xf3\x74\x10\x58\xbf\x48\x2d\x4b\x9f\xae\x24\xf1\xda\xad\x76\xcc\x67\x75\x35\xd4\xb3\xed\x86\xfc\xf7\xfd\x88\xdf\x86\xd5\x43\xea\xaf\x7c\x2f\x77\x54\x26\xb8\x8c\xce\x6f\x40\xd3\xf9\x0a\x0f\x19\x68\x49\x82\x9b\xbc\x2a\xe7\x7c\xa7\xa4\x89\x64\xac\x9d\x85\x82\x64\xac\xa5\x08\x7c\x1f\x9c\x8a\xbd\x1f\xc1\x63\x7c\xef\x47\x01\xa7\x4a\x1f\x3a\x22\x46\x45\x13\x98\x57\x0b\x89\x45\xd3\x3e\xb9\x91\x29\x99\x3b\x55\x71\x71\xb8\xa3\xe8\xd8\x66\xf3\x0f\x79\xa8\xf2\xce\x77\x4e\x80\x9d\x26\x30\xa5\xad\xd6\x49\xe7\x64\x12\xba\x96\xc5\xa7\xa9\xf8\x81\xb9\xe0\x61\x2d\x18\xf7\x2b\x82\xf6\xf8\x5f\x8c\xd2\x74\x8c\x8e\x91\xc3\x5a\x8f\x76\x05\x42\x5e\xb5\x52\x42\x3d\x91\x22\x21\x57\x22\x21\x9f\x84\xfb\x22\x21\x19\x27\xaa\x04\x3e\x8f\x74\xf2\xc5\xaf\x35\x4e\x89\x4c\x1b\x33\x9e\x91\x88\x67\x64\x3a\xf5\x3a\xa4\x7c\x45\xd3\x84\x9c\x93\x58\x16\xaf\x57\x9c\x68\x2b\x21\x25\x7b\xa7\xd0\xf1\x0b\x44\x44\xa7\x77\x5c\xa8\x64\xc0\x96\x26\xac\xc3\xbb\x9a\x58\xb9\x93\xc1\x54\xac\xe5\xb4\x29\x84\x23\x19\x4d\x8b\x82\xd7\x40\x4e\x88\x10\x31\x37\x34\x93\xf2\x87\x75\x77\x23\x9e\xf2\x99\x66\x5a\xee\x64\xa6\xdc\x29\x15\x03\x5e\xd3\x89\x3b\x92\x02\x66\x4b\x57\x38\x83\x90\xd3\x23\xab\xc3\x6c\x8b\x02\x5f\x0b\x96\xda\x12\x68\xdd\x10\x22\x76\x2e\xf8\x37\x5d\xe3\x2d\x13\x47\x96\x85\xcd\xbe\x03\x1c\xc2\xcc\x3c\x43\xe0\x33\x21\xfa\x81\xb7\x14\x21\xb8\xa4\x36\xbc\xa3\xf6\xe8\xdd\x8b\x6b\x05\xcd\xff\xae\xdd\xae\xc4\xc2\x07\xba\xc6\x78\x4b\xaf\x27\xef\x5c\xc2\x1e\x01\x1f\xe9\x06\xcf\xb1\x87\xb7\x62\x2c\x09\x84\x5a\x52\xd8\x04\x7e\x67\x92\xe1\x3d\xed\x8e\xde\xbf\xd8\xaa\xfe\xde\xb7\xdb\xe4\x77\x41\xf9\x02\x6f\x27\xef\x5d\x39\x4e\x57\x74\x2b\xfd\xee\xec\x35\xa7\xe2\xcd\xdf\xd2\xc9\x07\x57\x55\xd9\xfe\x1d\x3e\xb2\x41\xd0\x73\xe6\xca\xb2\xde\x8a\x8e\xae\x44\x17\xaf\xd9\xb0\xcb\x92\x85\xd2\x38\x78\x4b\x64\x16\xf7\x6b\xba\xc4\x1f\x20\x84\x8f\xf0\x3b\x5c\xb1\x6f\xfb\xf1\x82\x5e\x5a\x16\xbe\x6d\xd3\x50\x2e\x4b\x2f\xe1\x23\x69\xbf\x86\x4b\xfa\xb1\xfd\x41\xbd\x85\x92\xcd\xb7\x6d\xdd\x8a\x94\x6e\x09\xad\xa6\x0a\xe1\x27\x9d\x13\x0d\xe2\xcc\x1d\xdb\xfb\xf1\x33\x46\x11\x71\xb5\xcb\x70\xef\x39\x68\x88\x4a\xc8\x4b\x40\x43\xd4\xa2\x14\x55\x8c\x9b\x03\x3a\x7e\xe1\x5d\x20\x91\x58\x7d\x57\x14\x53\x26\x1c\x4f\xfb\x8f\x2d\xaa\xdb\x68\x12\x18\x26\xba\x48\xe2\xd9\x75\x7c\x54\x76\x40\xe6\x7b\xe9\x37\x19\x02\xd1\x9f\x69\x08\xcc\xbe\x66\x08\x08\x77\x03\x17\xbc\xcc\x10\x88\x38\x87\x64\x35\x8e\xcd\xa4\x21\xc0\x6e\x0c\xa8\xa1\x7e\x47\x1e\x0e\xc0\x26\x45\x51\xd3\xd2\xb6\xb2\x0b\xd6\x98\xf7\xa7\xb3\xeb\x8c\x46\x10\xec\xde\x15\x10\x90\x7c\xb9\x1c\x3f\xeb\x3a\x4b\xc1\x0c\x42\x87\xf7\xbb\xbd\x06\x48\xce\xbf\xc2\xc8\xcc\x6e\x3c\x51\x48\xfb\x9e\x1f\x1d\x58\x5c\x88\x96\x35\xcf\xc6\x59\xef\xb1\x75\xbf\xaa\x39\x25\xa3\x1b\x76\x74\xa4\x9c\x5e\xb3\x2a\xb3\x61\xc7\xcc\x94\x9a\x33\xa8\x26\xdd\xb2\x52\x8c\x2b\xbd\x83\xb4\x17\x1f\xc1\x15\xf2\x7c\x37\xb4\x00\x16\x74\xe2\x72\x31\x00\x77\x95\xce\x9c\x52\x03\x27\xf3\x86\xb6\x36\x0d\xdc\x8a\xc7\x0e\x39\xe1\xf5\x34\x19\xaf\x8e\xf6\x59\x56\x47\x3d\x35\x56\x41\x2d\xa5\x07\x0d\x79\x53\x85\x60\x55\xb9\xbe\x4e\x5b\x54\xaf\x57\x8a\x02\x79\x1c\x69\x65\x62\xbb\x45\x81\xa6\xe2\xb8\xeb\x96\x82\xc5\xd8\x9d\x0f\xa8\x5a\x1d\x4f\x48\xd1\x0c\x31\x95\x3e\x9d\xce\xd4\xb3\x4e\xf0\x94\xfc\xed\x84\x4c\xba\x6e\x51\xf4\x5b\x14\xe5\x7e\x96\x57\xd7\xf8\xab\x3d\xeb\x12\x4d\xc2\x69\xcb\x24\x94\x35\xf0\xf8\xfd\xba\x01\xeb\xa3\x53\x5d\xef\x8c\x09\xfb\x63\x34\x30\xaf\x12\x5c\x5d\xb9\xe8\x16\x05\xd2\x97\x3a\x63\x7d\x61\xdc\x64\x16\xb0\x55\xba\x58\xb6\x43\x64\x7a\x11\xa7\x4e\x7c\x71\x71\x61\xab\x4a\x30\x91\xe4\xdf\x89\xcb\xcb\x4a\x69\x63\x47\x9d\x4e\xf9\xf9\x56\x52\xe5\x52\x1c\x49\x93\x21\x85\x9c\x31\xae\xd2\x58\x3c\x8a\x1f\x96\x4c\x11\x85\xd4\x66\x13\xa9\x92\x32\x6a\xc3\x09\x70\xde\x89\x16\x71\x92\xfa\xaf\xbc\xcc\x1f\xa3\x08\x39\x08\x91\x36\xce\x3b\x37\xeb\x65\x1e\x2d\xa3\xd8\x1f\xa3\x1b\x7d\x52\x2a\xee\x31\x5a\xeb\x53\x62\x03\x70\x8c\xee\xc4\x19\xb4\x40\x64\x84\x67\x54\xba\x3f\x37\x90\x12\x62\x59\x2d\x8c\xd7\x74\x63\xe8\xdf\x8b\xd0\xb2\xf0\x52\x86\x6f\x4a\xf5\x12\xc2\x4c\xaa\x52\x02\x33\x3d\xc2\xcc\x7e\xe6\x67\x5f\xa4\x7a\x9f\x7a\x21\xa7\xe5\x12\x66\xf2\xde\x2e\x61\x0c\x36\x9b\xd8\xae\x32\xcd\x43\xba\x06\x55\xc8\xee\x82\x46\x6c\xc9\x62\x10\x40\x29\x95\xdd\x5a\x96\x71\x5a\x17\x91\x3d\x0a\x29\xa5\xa9\x2e\x21\x9b\x15\x45\x6b\x23\xa2\x21\x10\x62\x2f\x24\x49\x47\x88\x38\xbb\x6f\x41\x48\xf5\xdc\x68\xbc\xd4\x10\x27\x11\x71\x96\xa5\x83\x6c\x35\x5f\xa4\x9a\xb6\x1f\x98\x33\x7b\xc6\xae\x65\x89\xe9\x32\x71\x95\x89\x28\xeb\xbc\xc5\xa4\x74\x7c\x30\x34\x92\x9a\x72\x09\xf5\xb4\xb6\x78\x8c\x4e\x8a\xc6\x91\xd2\x49\x09\x8f\xb9\x17\xbf\x02\x9c\x10\xce\x99\x4d\x96\xa8\xa7\xf5\xde\x8a\x06\x4c\x23\x31\xd1\x95\x82\x07\x2b\x48\x20\xe5\xbe\x3d\x36\x5d\xc3\x9a\x66\x0a\x0d\xcd\xb4\xa1\x33\xec\x81\x98\x96\xbc\xe0\xa0\x9a\x64\x70\xc3\x27\xec\x06\xcf\xc7\xe8\x37\x3c\x76\x50\xdb\x93\x93\xb6\x8d\x08\x72\x3c\xc0\x5e\xe3\xd4\xf5\x9a\xa6\xae\xb7\x3f\x75\xe7\x63\xb4\x40\x0e\xba\x43\x84\xc0\xe7\x8a\x1f\x93\xf1\xd4\x49\x4c\x7e\xfc\x5c\xe3\x47\x76\x66\xa5\x4c\x24\xa3\x44\x09\x53\x80\xf8\x06\x56\x64\x3c\x59\xb9\xce\xc4\x1d\x55\xd6\xac\x0d\x5b\x6a\xc3\x2d\x33\x80\xb6\x2f\xd4\xbd\x23\x72\x7f\x63\x4c\xc7\xf9\xd8\x76\xb6\x7c\x3c\x2e\xe1\x1d\xef\x69\x3e\x5e\xc9\xa9\xb3\x25\xce\xca\x34\x80\xdf\x15\x05\xbe\xa4\x77\x38\xc3\x46\x0f\xec\x7d\xb6\x8e\x4d\x08\x68\xea\x08\xa5\xf4\x9a\x6c\xe9\x1a\xaf\x60\x0b\x0b\x11\x1d\x74\x1f\x05\xf8\x56\xcc\x58\xd5\xff\x35\x6c\x09\x81\x5b\x55\x18\xa9\x7a\xe3\xa3\xdb\x51\x65\xfd\x76\x47\x1f\x5e\xd0\x77\xba\x80\x1b\x87\x27\xac\xfa\xe2\x10\x85\x0f\xf4\xb1\xa5\xd7\xf4\xb2\xd4\xe6\xe4\xce\xc3\xd9\xa3\xb9\x59\x79\x03\x73\x52\x42\xf7\xec\x71\x3b\xbe\x7f\xed\xa6\x56\x96\x7b\x69\xde\xbc\xad\x55\x5d\xfa\x93\x36\xb6\xcc\x0e\x1f\xd8\xda\xaa\x9a\x3c\x7e\x73\x0b\x87\xf8\x91\x1b\x5c\xda\xc3\xc1\x6c\xd7\x07\x36\xb1\xe4\xca\x54\x7c\xb3\x18\xe2\xb6\x86\x3e\x63\x72\x52\xd8\x51\xc3\xde\x7f\xc9\xa5\xc8\xba\xbb\x96\x45\x30\xf9\xe1\x21\x7b\x4f\xb4\xad\x6f\x33\xf7\x1a\xa0\x6f\xfe\x12\x42\xd7\x53\x41\xe5\x7a\x7a\x88\xc4\x75\x7d\x9b\xf9\xb9\x7d\xde\xfd\x6f\xd1\xb7\x92\xf4\xad\x0e\xd2\xb7\xaa\xd1\x37\x1c\x76\x87\xdf\x1e\xec\x60\x60\x11\x3f\x92\xc8\x41\x6f\x48\x30\x62\x37\x70\x22\xd9\xc1\x83\x54\x4a\x8f\xf1\xf9\x60\xd0\x54\xe5\x6c\x68\xdb\xac\x2b\x2f\xbb\x8b\x67\xda\xd7\xcf\x33\xb8\xed\x27\x6c\x11\x1a\x80\x35\x32\x50\xda\xab\xc2\x95\x67\x55\x5e\xf4\x5e\x7c\x74\xcf\xb6\xed\x73\x26\x75\xa2\x8e\x00\x4a\x66\x42\x3d\x69\x4c\xec\x08\x2c\x0b\xb7\x30\x9a\xcb\xb0\x2c\x76\x2d\x8a\x8f\x02\x23\xc5\x43\x55\xbf\x6d\x51\x1a\x60\xd2\x31\x5a\x4a\x77\xce\x92\xde\x9b\xc0\x8a\xbc\x5c\xb7\x90\x18\xfb\xa8\xbd\x46\x29\x5d\x33\x1a\x47\x59\x0b\xd2\xc9\x66\x5e\xe2\x91\x4a\xbb\xa1\xc4\x3c\x6b\x25\xc0\x3e\x31\xeb\x54\x06\x98\x38\xec\x9c\x0a\x68\x52\x51\x8c\xcb\x49\xec\xf2\xf8\xc3\xb8\x1c\x65\x78\x05\x81\x10\x5d\x21\x35\xe2\xa6\xa8\xf1\xc6\xa3\xb0\x16\xce\xb7\x92\xd6\x43\x58\x55\x16\x9a\x53\x24\xc6\x15\x33\x4b\x8d\x20\x9d\xbb\x1c\x60\xb1\x46\x20\xcc\xc0\x38\xf9\x4d\x34\xfa\x0f\xc6\x9d\xbf\x91\xff\x90\xc9\x6f\xc4\x6d\x1f\x9f\x8c\xd6\x38\x84\xda\x80\x7f\x35\x50\x51\x2c\xa6\xe4\x06\x00\x8f\x21\x55\x48\xc6\x98\x88\xf4\x0d\x9f\x6e\x54\x0c\x16\xfb\xd6\x1e\x5e\x82\xb6\xda\x11\x92\xa2\x7a\x3e\x56\x82\x75\xc8\xd6\x2d\x8e\xaf\x7d\x20\x0b\x40\xc7\x5d\x54\x1b\xb9\x58\x7d\x93\xb8\x2c\x09\x34\x41\x0a\x70\x57\xb0\x78\x45\x67\xc5\xd3\x50\xfb\xa7\xbd\x06\x44\x1f\xcd\x16\xb5\xea\x55\x1c\x5e\xbe\xc1\xc7\xa2\x5b\x47\xd9\x2b\xee\x93\xfa\xb0\x4a\x7d\x6f\xce\x46\x06\x71\xac\x91\xb3\x06\x4e\xaa\x6e\x32\x98\x6e\x70\x36\x78\x42\xad\x71\x23\x25\x41\x62\x18\x78\x95\xce\xae\x41\x5f\xc5\x78\x38\xb4\xfb\x52\xd1\x8b\x95\x73\x50\xf1\xe7\xb2\x2a\xd4\xbd\xaa\x58\x35\xac\xe0\xd7\x37\xd5\x92\x7e\x5e\x01\xb7\x2c\xf4\x4e\xc3\x1d\x3f\x79\xc6\x56\xff\xd3\xca\xbe\xb8\x11\x10\x07\xb6\xce\x43\xe0\x50\xed\xd7\x1a\xee\x85\x03\x1f\x88\xfc\x08\x0e\x7c\xc0\xd1\x9d\x38\xee\xc1\x70\x78\xc6\x16\xff\xef\x2a\xa4\xab\x0f\x55\x74\xe7\x47\x1e\x73\x67\xdb\x02\xf3\x80\x67\x5d\xbc\xaf\x62\x20\xaf\xf8\xed\xc3\xee\xb9\x80\x3c\xe8\x9f\x0e\xce\x6c\x01\x79\xd0\x3b\xeb\x0d\x24\xe2\x41\x9f\x57\x4d\x7e\x59\xe5\x49\xfc\x8b\x93\x7a\x26\x10\x0f\xe4\x17\x82\x7f\x56\x20\x0f\xbf\x56\x9b\xa5\x7f\x54\x85\xaa\x83\x24\xbd\xf4\x66\x21\xbc\xa1\x6f\x31\x0a\xa3\xf9\xdc\x8f\x11\x81\xef\x14\xc7\x21\xf8\x89\x22\xcd\xaa\x08\xbe\xa7\x2f\x77\x4b\xd5\xfd\x9d\xfe\xca\xb7\x56\xff\x4d\x7f\x35\xb6\x56\xbf\x23\xf0\x45\x86\xa4\x4e\x7e\x72\xe1\x13\x4d\xa4\x6c\x84\x9f\x69\x84\x65\x91\x2d\xe9\xda\x8e\x82\x3b\x44\xe0\x17\xfa\xae\x13\xc0\x31\xfd\xd0\x09\xe0\x07\x7a\xdb\x09\xe0\x1f\xf4\x63\x27\x80\x1f\xe9\x15\x46\x19\xbf\x37\x43\x3c\x83\xff\x0a\xa3\x64\xf5\xac\x3a\xe5\xf3\x53\xa2\xaf\x67\x79\x22\xaf\x3c\x4b\xfd\x45\x94\xe5\x29\xeb\x3b\xce\xab\x4e\x78\x0b\xd1\xd6\x68\x91\xf2\x16\xdb\x6b\xd6\x5f\x92\xd3\xa4\xf3\xa3\x20\x1e\xa2\x9c\xb6\x92\xbc\x28\x5a\x09\x7b\x11\xf5\x6f\x27\x88\xe2\xf9\xab\x30\x5a\xce\xc1\xcb\xe9\x8c\x57\x5c\xdd\x53\x61\xc3\x16\xfd\x8c\x8f\xf1\x7d\xc9\x37\x41\xef\x9b\xc3\xa1\x8f\xab\x6d\x52\xb9\xa3\x3b\x2c\x49\xc7\x2b\x4b\xc2\xfe\x26\xe3\xe6\x0d\x8b\x5f\xf0\x17\xf0\x79\x40\xb0\x4c\xbb\xfb\x32\xf1\x5d\x38\x96\x8d\x98\xb9\x99\xb7\x28\xfd\x62\x59\xc7\xac\x21\xa4\xa4\x74\x8e\x77\xb3\x90\x95\x83\xf3\xc7\x49\xee\xd2\xcf\xf8\xd3\xe4\xa7\xaa\x1a\xfa\xdf\x71\x2c\x77\xbd\xbf\x83\xdc\x5b\x38\x39\x18\x12\xd4\xf1\x4b\x02\xb3\xa2\xc0\xb1\xa9\x9e\xa8\xcf\x44\xbe\x99\xb9\x5c\xe5\x1a\xfb\x94\x13\x93\xe3\x3c\xe7\x27\x60\xc3\x14\x87\x58\xcb\xde\xe1\x0a\x55\x6d\xc3\xb1\xd9\xf0\x8f\x90\x90\x31\x4e\x3b\x7e\xbc\xbe\xf1\xb9\x94\x1e\xe3\x00\xfb\xf0\x86\x58\x96\x3f\x79\xe3\x4e\x12\xd7\xb2\xb0\x3c\xe2\x41\xf3\x29\xfd\x8c\x53\xb8\xaf\x6e\x70\x6e\xb0\x0d\xad\x2e\x29\x09\x71\xe4\xbd\x45\x71\xcc\xfe\x85\x1b\xdc\x85\xfb\x92\x10\xd0\x1d\xd8\x04\xbc\x9c\xaf\x8e\x53\x42\x9c\x63\x79\x54\xcb\x9b\x96\x03\x56\x19\xe2\x0b\x91\x73\x76\x8d\x63\xa2\xbc\xf9\x61\x8e\xe3\x6a\xff\xef\x0f\x9c\x82\xe9\x4d\xc6\xad\x59\x51\x04\xb9\xca\xb9\xf4\x39\xaa\x5c\x2e\xbe\xd8\xc4\x77\x79\x02\x7c\x09\x41\x03\xd8\x04\xbd\xc3\xbc\x52\xc7\x3f\x0c\xf7\x80\xd6\xbb\x2d\x2c\x73\x0b\xbf\x58\x16\x1b\x39\x9f\x58\x56\x2b\x60\x03\xcd\x9f\x80\x5b\x38\x2e\x8a\x56\xa0\xee\xe2\xc7\x3f\xf2\x03\x79\x8e\x0d\x2a\x3b\x60\x83\xe1\xbb\xa4\x28\x62\x52\xc2\xb2\x79\xaa\x2c\x78\x4a\x34\xbd\xc3\x62\xf5\x1f\xb3\x39\x26\x7b\x4c\x45\x8f\x39\x1b\x42\xe9\xa5\xf8\x05\xb3\x6f\xad\xc3\x1d\x04\x7d\x29\x77\x1b\x05\x38\xe6\x0f\x8e\xd9\x53\x53\xbe\xb1\x93\x18\x9f\x5b\x24\xa1\x94\x25\xac\x9a\x86\xe3\x07\xbc\x90\xc5\xaf\xab\xbd\x87\x3f\xb0\x5f\xf3\xaa\x73\x9a\x72\x31\x16\xaf\xf9\x81\x8c\x2c\xca\xd9\x40\xc7\x25\x84\x4d\x3d\xe7\x6c\x1c\x21\xa6\x3f\x60\x7f\x9c\xe7\x8e\x78\x4c\x5a\x7b\x4c\x5c\x7b\x8c\x7a\x0a\x6e\xf9\xec\xf5\xbf\x30\x33\xc0\xb2\x52\xf1\x28\xc6\x58\x1c\xf1\xa4\x1c\xad\x8b\x02\x7f\x32\x1d\xb1\xb2\x5a\xa3\x69\x66\x7d\xda\x2f\xc4\x21\xeb\x6e\xe8\x80\x29\xc3\x50\x92\x29\xf6\xf9\x9e\xd5\x67\x59\xda\x80\xac\xd9\x7c\xd3\xba\x9d\xa7\x57\x89\xf4\x95\x98\x5d\x06\xd7\xc6\xe4\xbe\x9a\x54\x72\xc6\x32\xce\x65\xbc\xa9\xe7\x8c\x38\x9c\xbc\x71\xf9\x94\xc3\xd5\x14\xe2\x0c\xe9\xc9\xa8\x70\x9f\xb3\x5b\x4c\x34\x98\xcb\xd1\xcc\xb2\xa2\x9c\x03\x86\x30\xc9\xb4\x67\x8b\x65\x7e\xee\xc4\x25\x4f\xa7\xf7\x21\x27\x25\xbc\xe7\x92\xc9\xc4\xa2\xda\x17\xa2\xff\x96\x45\x21\x73\x6f\x51\x12\x76\x07\xa0\x6d\x94\x87\xc9\x3a\xff\xc0\x35\x52\x63\x24\xfb\x2c\xc7\xaf\x44\x39\xfe\x92\xc0\xc7\x4e\x40\x83\x1c\x3e\x74\x02\xba\xce\xe1\x5d\x27\xa0\xcb\x1c\xb6\x9d\x80\x29\x22\xba\xca\xe1\xb2\x13\xd0\x30\x87\x7f\x75\x82\xa6\xad\xeb\x59\x8e\x5f\xca\xae\x60\x66\x59\xf8\x58\xd2\xfc\x4d\x66\xe7\xce\xbb\x18\xf7\x32\x93\xd0\x2b\x8a\xf7\xf8\x0b\x30\x65\xcc\x33\x3b\xde\x66\x97\x9a\x5d\x10\x04\x79\x3d\x23\x7b\xc7\x84\xdc\x49\xb2\x6e\x29\x30\xd0\x75\x65\x52\x7e\x2a\x09\xfc\x81\xaf\x71\x9a\x93\xda\x60\xfd\x7f\xc1\x31\xd5\xd2\xee\xbb\xbd\x10\xc3\x35\x0f\x8f\x4c\x1b\x7c\x18\x53\x69\x20\x07\xd8\xe7\xf2\x48\xf9\xb5\xf3\x89\xef\x4a\x39\xfa\xa9\x5a\x42\x88\xf3\x34\x86\x98\xe3\xc1\xfb\x8c\x4d\xaf\xfd\xbb\x37\x3b\x5d\x47\x01\x6e\x85\x4d\x75\x6b\x72\x33\xb6\x50\x28\x7b\x24\x1f\x1f\xe7\x95\x81\x7e\x14\xe7\x3c\x05\x69\x9d\xf9\x62\x76\x98\x1f\x81\xa9\x7b\x5b\x5c\x8b\x6e\x56\x4b\x7f\xf7\x5a\xb7\xac\x0d\xc6\x83\x88\xab\x26\xdc\xaa\xc4\x45\xae\x0b\xd4\x5d\x3f\xb0\x3f\xfe\x8c\x73\xe2\x64\x39\xfe\x2c\xd1\x56\x61\x07\x61\x78\x9d\xc3\x1e\xde\x71\x96\xc3\x83\x60\xae\xcb\xfc\x91\xa4\x3e\x80\x1a\xba\xda\xed\x5b\xcc\x94\xcc\x09\x1f\xd7\x71\xcd\x24\xba\xec\x04\xcd\x08\xa5\xaa\xd3\x06\xae\x62\xf7\xcc\x25\xec\x21\xfc\x6c\x59\xc6\x23\x85\xfd\xb8\xf7\x26\x45\x91\xed\xef\x8a\x7d\xc2\x7a\xa5\x35\x89\xd7\xcb\xa5\x8b\x5a\xf4\x67\xcc\x64\x73\x51\xa0\xfb\x92\xff\xba\xf7\x9c\xbc\x34\x7e\x8b\x57\xe2\xcf\x56\xee\x28\x6e\xa7\xee\xad\x6f\x34\x10\x13\x24\x74\x92\xbb\x10\xd1\xee\x68\xcf\x3f\x17\x8d\x48\x22\x83\x85\xb4\x08\x8e\x78\x2a\x5b\x14\xe0\x94\xfa\x80\x57\xb8\xb6\xf2\xe7\x8a\x2b\x34\x76\x82\x96\xfc\x7a\x0d\xd9\x5e\x62\x48\x35\x38\x19\x24\x86\x4b\x6d\x33\xc1\x27\x04\x5a\x21\x36\x78\xb0\x24\x90\x4c\xba\x8c\xcd\x7e\x96\xdb\x2e\x6c\x70\x80\xd7\x01\x04\x26\xbe\x26\xdf\xbb\x45\xf1\xbb\x90\x64\xdf\xf3\x33\x6a\x19\x4c\xe0\x9f\xf8\x13\x7c\x47\xe0\xf5\xe4\x8d\xcb\xf9\xa5\x67\x9f\x37\x56\x03\x93\xeb\x44\x1e\x7c\xf7\x52\x6c\xe5\xf6\xec\xe7\x8d\xd5\x5b\xcc\xa6\x7c\x3d\x39\x1c\x9c\xee\xef\xdf\xea\x76\x3a\xc4\xa8\x84\x7e\xf7\xac\x7f\xa0\x47\xb9\xe3\xcf\x1a\x0e\x1b\xe1\x41\x55\x3b\x05\x11\x57\xc2\x79\x77\xd0\x54\x8b\x4f\x37\x5c\x46\x39\x7f\x95\xfe\xf0\xec\x40\xbb\xda\x3a\xa9\x84\xfe\xa0\xdb\x50\x5a\xd1\x68\x2d\xf4\xdb\x47\x8f\x67\x02\x9d\x9f\x0d\xfb\x07\x56\xde\xeb\x38\x9b\x25\x2b\x26\xfc\x39\xc1\x83\x5e\xbf\x61\x50\x1f\x70\xaf\x9b\x6b\x6e\x01\x0b\xe8\x69\xcc\x4c\x99\x60\xc7\x33\xc3\x44\x49\xb3\x3e\x5b\x5e\x67\xd5\x9a\x3a\xd8\x4f\xdc\x5f\x0a\x3f\x60\x8f\xbb\xd9\x5b\x49\xe7\xe5\x8c\xbd\xf3\xcf\x82\x89\x2c\x0b\xd5\x7e\xa3\x28\x3e\x4a\x20\x6c\x82\xe5\x85\x4d\x93\x72\xfd\x3f\x67\x9c\xcd\x69\x95\xd9\x36\xc3\xe8\x27\xdf\xbb\xe6\x05\x99\x37\x20\x8a\x49\x2c\x2d\x6b\x45\xee\x53\xba\x66\xeb\xd7\x57\x95\x89\x85\x37\x50\x35\xe6\x8b\x84\x8e\x1f\xb3\x21\xc7\xc2\xf6\x5a\xd0\xb9\xe1\xf0\xbf\xa3\x8b\x8e\x58\x8c\xc1\x94\x2e\x3a\xa1\x97\xc1\x0d\x5d\x70\x78\xc1\xcf\x74\xc1\x96\xc8\xa3\x08\x2f\x40\xe2\xa4\xec\x6a\xb4\x0c\x57\x3c\x2f\x95\x67\xb0\x8b\x54\x12\x70\x00\x5f\x26\x06\xe4\xa1\xc0\xae\x21\x70\x67\xb2\x3a\x29\x0a\x75\x5d\xd2\xc3\x34\xb8\x8e\xf6\x32\x5b\x96\x10\x7a\xd9\x9f\x4a\xc9\xf4\x21\x4a\x42\x2f\x33\xc8\x98\xee\x90\x51\xb3\x84\xfe\x74\x32\xc6\x37\xb5\x9f\x8e\x26\x6a\xe1\xe7\x06\x51\x37\x3b\x44\xd5\x52\x94\x95\xb8\xdd\x23\x2b\xd6\x64\xc5\x15\x3d\xf1\x61\x7a\x3e\xef\x88\x66\x47\xb5\x67\xb3\x44\x20\xf0\xf0\x08\xaf\xdd\x76\x23\x03\xdc\xa8\xe4\x2e\xc0\x41\xdf\x3e\x00\xc3\x2a\x19\x9d\x6f\x23\x0c\x9e\x0f\x15\xaa\xf7\xb0\x3f\x90\xf1\xb4\xcf\xbb\x67\x46\x5c\xc1\x11\xe3\x4c\x85\xfe\x92\x4e\x66\x2e\x64\x74\x6d\x59\x6b\xc3\x57\xcb\x46\xc0\xb2\x32\xe5\x36\x6a\x51\x1a\xf1\x4c\x72\x0f\xf3\xf4\x17\x7e\x12\x41\xa4\x92\xc7\x03\x72\xaf\xdb\xd2\xa8\x2c\x4b\x38\x3d\x1d\x1c\xa8\xc6\xd4\x4c\xf0\x60\xf0\xbc\x37\xac\x08\x16\x48\x25\xc2\xe9\xb5\x66\x0c\x5d\x79\x21\x81\x33\x78\x4d\x92\x72\xb7\xbc\x44\x9f\x55\x6f\xba\x34\xde\x74\x45\xd3\xc9\xd2\x85\x90\xae\x2c\x6b\x55\x7f\xd3\x90\x7f\xf1\x70\xb2\x76\x5b\x94\x06\xf2\x3d\x43\x58\x43\xa0\xde\x6f\x4e\xee\xd9\x65\x1a\x94\xbc\x61\xe6\x16\x05\x6b\x91\xc1\x92\x29\xd7\xa5\x4b\xd4\x13\x37\xa2\xe8\x3d\x6f\xb5\x61\xdd\x45\x93\x8d\xab\x7b\xdc\x00\xff\x69\x76\xba\x71\x79\x93\x92\xfd\xb7\x17\x2e\x66\x98\x01\xbe\x29\x14\x3b\x19\xf5\x49\x39\xf2\xf1\xb0\x7f\x7e\x6e\x13\xf0\xf1\xd9\xf0\x79\xaf\x4f\x4a\x97\x94\x98\x8c\xfe\x37\x00\x00\xff\xff\x95\x56\x42\x09\x9c\x43\x02\x00") - -func bindataTkgWebDistTkgkickstartuiPolyfillses54f5834b7b08801de44f4JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiPolyfillses54f5834b7b08801de44f4Js, - "tkg/web/dist/tkg-kickstart-ui/polyfills-es5.4f5834b7b08801de44f4.js", - ) -} - -func bindataTkgWebDistTkgkickstartuiPolyfillses54f5834b7b08801de44f4Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiPolyfillses54f5834b7b08801de44f4JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/polyfills-es5.4f5834b7b08801de44f4.js", - size: 148380, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiRuntimees2015969771d6bf2c3ab9fc99Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x57\xeb\x8e\xdb\xba\x11\x7e\x15\x9b\x05\x04\x12\xa6\x59\xc9\x77\x4b\x61\x82\x36\x48\x7f\x9d\x9e\x0d\x9a\xf4\x97\x2a\x04\x34\x39\xf2\x2a\x2b\x93\x2e\x45\x26\x5d\xc8\x7a\xf7\x82\x92\x6f\xbb\x67\x83\x03\x2c\xb4\xbc\xcc\x0c\xe7\xfa\xcd\x78\x5c\x7a\x2d\x5d\x65\x34\x26\x2d\xf2\x0d\x8c\x1a\x67\x2b\xe9\x50\xf6\x43\xd8\x11\x50\xc7\xdb\x8e\x5a\xde\x76\xd9\x85\x6e\xa4\x31\x90\x36\xdc\x1a\x6e\x73\x28\xb2\xaa\xc4\x3f\x4c\xa5\x46\xf1\x98\x73\x43\x2c\x38\x6f\xf5\xc8\x30\xf8\xdf\xd1\x58\xd7\xf4\x72\x7c\x4f\xc9\xdb\x4a\xa5\x40\x6b\x23\x14\xa8\x74\x9c\xd0\x33\x49\xda\x76\x5d\x76\xe6\x73\x39\x14\x4c\x8a\xba\xc6\xfe\x22\x81\x7a\x7a\x5b\x6b\x42\x3d\x1b\x24\xf0\x71\x7c\xbb\xe8\x34\x3b\x70\x47\x81\xe7\x05\xd5\xec\x81\x5f\xad\x72\xd4\x52\x43\x3d\x69\xab\x12\x8f\xed\xa0\x78\xc5\x93\xbf\xc6\x59\x69\x2c\x56\x3c\xce\xd4\x3b\x60\x35\xe8\xbd\x7b\xcc\xd4\x64\x42\x5a\xcb\x21\x57\x45\x1e\x17\xd4\x0c\xab\xa4\xa0\x7e\x58\xcd\x8a\x9e\x2b\xc8\x10\xe1\x79\xc9\xe3\x4c\xbe\xb3\x17\x76\x39\x99\x10\x3c\x4e\x22\x7f\x3a\x55\xef\xb9\x27\x51\xf4\xb0\xfb\x0e\xd2\xb1\x27\x78\x6e\xb0\x66\x0f\x84\xc1\x0f\xb0\xcf\xf8\xaa\x1d\x90\xf6\x6c\xb8\x66\x0f\x39\x14\xd8\xe6\xb2\x20\x1d\xf9\x60\x59\x73\xac\x2b\x09\x58\x4e\xa7\x34\x21\x29\x16\x7c\x9c\x50\xff\xae\x8a\x22\x5c\x71\x4f\x48\x70\xbb\x20\x2d\x5c\xe8\x54\x4f\xd7\x7b\xbb\xe4\x06\x93\xec\x1a\x93\x32\x8a\xb0\xe3\x25\xe9\xba\x8b\x8f\x3b\xcf\xfd\xe9\x14\x5f\x6d\x51\xfc\xe6\x81\xf7\x71\x14\x41\xae\xa6\x49\xb0\xf6\xbd\xcf\xd4\x74\x4a\x82\xed\x7c\x38\xcc\xfa\x75\xde\xfb\xb4\xe8\xa8\x66\x9a\xdf\x1b\x13\xa4\x39\x0e\x51\x04\xec\xdb\x37\x68\xfe\x69\x94\xaf\xe1\xc3\x5d\x8a\x9d\x55\x00\xa6\xa0\x14\xbe\x76\x5d\xfa\xc6\xe5\x35\x1b\x34\x53\xd8\xd1\x56\xa4\xae\x23\xd4\x85\xe7\xd4\xdd\x73\xd4\x91\xf6\x62\x82\x1d\x55\x7a\xe4\x88\x66\x26\x44\x9c\x44\xd1\x38\x2c\xa1\x5f\x9e\x83\xa0\xa0\xac\x34\x7c\xb6\xe6\x08\xd6\x3d\x87\x3b\xda\x82\xf6\x07\xb0\x62\x57\x43\x3a\x8e\xe9\x1e\x5c\xea\x72\x5b\x74\x24\x3c\x55\x86\xd4\xd7\x0c\xf8\x1b\xd1\xfa\x6c\xcd\xa1\x6a\x80\x85\x44\x7d\x19\xe3\x92\x30\x0b\xca\x4b\xc0\xf7\x29\x78\x17\xe6\x32\xb7\x45\xaf\x7b\x30\x28\x2f\x48\xff\x96\x7f\xeb\x11\x98\xa0\x29\x34\xb3\x38\x59\x32\x34\x69\xe7\xdb\x14\xc5\x09\xcc\xd7\x6a\xbb\xda\xc6\xdb\xb9\x98\x2d\x24\x88\x72\x83\x68\xb2\x5e\xa6\x48\x2d\x56\x62\xb9\xde\x94\x65\xb2\x5b\x49\xa1\x96\x6a\xb1\x14\x88\x2e\x37\xb3\x14\xcd\x96\xa0\x96\xdb\xd9\x6a\xb6\x5a\x29\xa5\xe6\xeb\x64\x3d\x9b\x23\xba\x5a\x2c\x52\xb4\x4b\x56\xa5\x2c\xd5\x6e\xb1\x8d\x37\x9b\xf5\x62\x03\x9b\x32\x41\x74\xb5\x4c\x52\x94\x24\xdb\x44\xcc\xe5\x7c\x31\x2f\x97\xbb\x55\xb9\x90\xf3\x9d\x42\x74\xbd\x98\xa5\xa8\x04\xb5\x59\x96\x9b\xed\x2c\x11\x72\x19\xaf\x17\x30\x5b\xcc\x11\xdd\x26\xeb\x14\x6d\x92\x44\x6d\xe3\x5d\xb2\x15\x9b\xe5\x4c\xc9\x9d\x5c\xcc\xd6\xa8\xcb\xa1\x98\x20\xf6\xbd\x41\xc1\xd6\x43\xa5\xab\x8f\x4d\xf3\x8f\x37\x4c\x46\x8d\x7b\xae\xa1\x61\x22\x16\xc9\x6a\x9d\x6c\x92\xc5\x16\xe6\x65\x1c\x0b\x95\xc4\x4c\x36\x03\xbf\x79\x95\x02\x67\x6f\x9d\xc3\x70\xb4\xc6\x19\xf7\x7c\x04\xf6\x28\x9a\x87\x9f\xfa\x12\xef\x01\x54\x02\x43\x47\xef\x52\xae\x47\xb9\x10\x68\xc7\x91\x7b\xda\x4f\x9f\x2a\xf9\xd4\x38\x61\xdd\xd4\x57\x29\xca\x34\xab\x6f\xaf\xf5\x49\x4f\xab\x1e\x4a\x20\xb7\x05\x09\x1f\x76\xf4\xcd\x23\x36\x24\x83\xba\x81\x5e\x9c\xa0\xf2\x05\x26\x7a\x72\x49\xd2\x92\x2b\x23\xfd\x01\xb4\x63\x7b\x70\x9f\x6a\x08\xcb\xe6\xef\xcf\x5f\xc5\xfe\x77\x71\x00\x8c\x1a\x69\xab\xa3\x43\x84\x0e\xb8\x54\xbe\xc0\xa5\x20\xa1\xe6\x65\xae\x7a\xc8\xad\x83\x88\xbf\x39\x67\xab\x9d\x77\x81\xd5\x4a\x44\x38\xb7\xa7\xd3\xeb\x1b\x25\x9c\x98\xfe\x84\xdd\x51\xc8\xa7\x40\xe2\x26\x9e\xb4\x82\xd7\xd9\xce\x82\x78\xea\x3a\x71\x3a\x61\x19\xd0\x0c\x8b\x9b\x7e\xd2\x82\x70\x70\x56\xf1\xa6\x18\x61\xf2\x51\xd8\x06\x1c\x47\xde\x95\xd3\x0d\xa2\x82\xb9\xea\x00\xc6\x3b\x9e\xcc\xe2\x80\x07\x32\x8a\x04\x6b\x5e\x68\xa0\x8d\x96\x80\xfa\x4b\x42\x5f\x5f\xbe\x50\x8f\x06\xe5\x02\x89\x95\x5c\x33\xe7\xb1\x25\x84\x06\x37\xf3\xdc\x14\x3d\xb8\x35\xf7\xd0\xae\x49\x2b\x98\xd1\x60\xad\xb1\x3c\xac\x42\x67\xe0\xda\xd7\x35\x95\x35\x08\xfb\x75\x50\x0d\x1f\x07\x60\x0c\x78\x6e\x7b\xef\x29\xa8\xc1\xc1\x28\x6c\xa9\x60\x47\x61\x41\xbb\xdf\x8d\x82\xa0\xfb\x6d\xc7\x2c\x1c\xcc\x0f\xf8\xf8\x58\xd5\x0a\x0b\x42\x4d\x14\x19\x56\x1a\xfb\x49\xc8\xc7\xb7\x30\x1c\xb0\x26\x01\xa8\x2e\x4d\xd0\x85\x3d\x3d\xf2\x06\xdc\x45\x93\x86\xed\x2a\xad\x70\xaf\xe2\x90\x21\xb4\x0d\xd9\x9a\xa2\xb3\x1b\x11\x75\xc2\x06\x20\x12\x1d\xa1\xc9\x0c\x16\x24\xbb\x99\x78\xcf\x7d\x3d\x25\xf4\x6a\xf9\xeb\xfb\x70\x48\xa8\x8c\xa2\x6b\x5c\x1f\x41\x28\x26\x8e\x47\xd0\xea\x62\x56\xd7\x75\x98\x50\xcd\xec\x8b\x82\x44\x5e\x0f\x80\xa9\xd0\x98\x07\x0d\x4d\x39\xfa\xf2\x7c\xd8\x99\x3a\x8a\x86\xff\xcc\x99\x2f\xce\x56\x7a\xff\x55\xec\x7f\x0d\xb2\x7f\xa4\xa5\xed\x0f\x51\x7b\x48\xd1\xd0\x1d\x50\x47\xe8\xaf\x98\xd1\xad\x89\xa0\x0b\xdb\x38\x1e\xe0\x59\x1f\xd4\x9b\xa0\xc9\x8e\xc2\x3d\x36\x61\x0e\x00\x26\x83\x89\x16\xf4\xe9\x84\x6f\x1b\x9e\x17\x84\xc2\x1f\x51\x20\x0b\x09\x77\x97\x5d\x57\x91\x43\x9c\x38\x0f\x7d\x0d\x03\x6f\x87\xda\xf8\xd2\x97\xc4\xbf\xff\xf5\x5b\xfa\x96\x16\x5d\x47\xdf\xf2\xa0\xb3\xbe\x71\xa0\xbe\x3e\x1f\xa1\x89\xa2\xfb\xdd\xb9\xe2\x3e\x9b\xba\x92\xcf\xfd\x3b\xbf\xbc\xc5\x48\xe8\xbd\xaf\x85\xfd\xcb\xce\x6b\x55\x83\x45\x14\x48\xa8\x13\xf6\x4a\x33\xec\xc8\x39\xb6\x47\x8e\xd0\x1b\xb0\xb7\x5a\xad\xd2\xb8\xcb\x34\x2b\xd9\x77\xfe\xb2\x5f\x0d\xf5\x32\x34\x51\x47\x3e\x40\xee\x8a\x74\x70\x44\xa8\x9f\x61\xd6\xab\x4a\x6c\x88\x3d\x23\x60\x3e\x2b\x06\x10\x1c\x55\x25\x5e\xad\x56\x63\xee\x06\x29\x9e\x6b\xf8\x79\xe9\x98\xf8\x0e\x4d\x35\x69\x43\x45\xba\x7e\x9e\xd0\x45\x47\xb2\x3b\x59\xdc\x0f\x35\x5b\x71\xcd\x8e\x13\xcd\x3c\x76\x84\x8a\x5e\xd4\xa7\x90\xf5\x01\x9a\x71\x75\xb3\xc9\xf6\xb0\x7c\xd1\x37\x8a\x7a\x15\xf1\x20\x3f\x6c\xfb\x77\x06\x03\x08\x35\xe4\xa2\x9a\x8d\x22\x8c\x42\x99\x20\xce\xb9\x65\x21\x4c\x1f\xd0\xa1\x6a\x9a\x4a\xef\x51\x3a\x1c\x10\x5a\x05\x3a\xcb\x86\xca\xbc\xad\x02\x4c\x65\x82\x1d\xa0\x69\xc4\x1e\x38\xfa\xcd\x08\x55\xe9\xfd\x48\x3e\x7a\xfd\x34\x42\x13\x37\x41\xa3\x52\x54\x35\x28\xf6\x1f\x8d\xd1\xc4\x4f\x50\x3a\x42\x93\x6a\x82\x48\x00\x4e\x2d\x0e\xc0\xd1\xc7\x40\x1c\x38\x7b\xb3\x7a\x40\x7d\x3e\x02\xf7\x54\x30\x0b\xff\xf5\xd0\x38\x5e\x51\x93\x27\x45\x5f\xaa\x14\xf5\xc2\xa7\x68\xe2\x42\x2b\xeb\xfd\xdd\x9b\x16\x87\x9a\x78\x78\x11\xc6\x6b\x36\xf6\xb9\x9b\xbb\xa2\xcb\x86\xf9\xec\x8d\x48\x87\xc6\xc6\x6d\x18\x7a\x05\xb7\x61\xe2\x95\xdc\xe6\xb3\x82\x96\x7c\x18\x13\x4d\x98\xaf\x44\x3f\x5f\x09\x6a\x82\x43\x35\x3b\xe4\xa6\xe0\x22\x37\x45\x3f\x8c\x4a\x32\x8c\x92\x12\x6b\xd2\xb3\xb8\x28\x72\xd8\x92\xac\x7c\x57\x5d\xfa\x58\x39\x99\x90\x21\x44\x9e\x57\x79\x19\x02\x03\xb9\x2f\x86\x6f\x1e\x17\x38\x80\x7d\xb8\x28\x78\x7c\x9b\x01\x1f\xb0\x22\xe1\x47\x48\x03\x75\xc9\xce\x9d\xa2\xf7\x9a\x7b\xda\x7f\xbb\x36\xec\x6f\xbe\xfa\x73\x8a\xd3\x29\x2f\x32\x7b\xc5\x70\x77\x87\x97\x31\x21\x74\xc8\x3f\x7e\x7f\x3c\x1c\x0d\x07\x96\x90\x0e\x87\xbf\xec\xff\x01\x00\x00\xff\xff\xee\x37\xb3\x67\x36\x0d\x00\x00") - -func bindataTkgWebDistTkgkickstartuiRuntimees2015969771d6bf2c3ab9fc99JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiRuntimees2015969771d6bf2c3ab9fc99Js, - "tkg/web/dist/tkg-kickstart-ui/runtime-es2015.969771d6bf2c3ab9fc99.js", - ) -} - -func bindataTkgWebDistTkgkickstartuiRuntimees2015969771d6bf2c3ab9fc99Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiRuntimees2015969771d6bf2c3ab9fc99JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/runtime-es2015.969771d6bf2c3ab9fc99.js", - size: 3382, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiRuntimees5969771d6bf2c3ab9fc99Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x57\xeb\x8e\xdb\xba\x11\x7e\x15\x9b\x05\x04\x12\xa6\x59\xc9\x77\x4b\x61\x82\x36\x48\x7f\x9d\x9e\x0d\x9a\xf4\x97\x2a\x04\x34\x39\xf2\x2a\x2b\x93\x2e\x45\x26\x5d\xc8\x7a\xf7\x82\x92\x6f\xbb\x67\x83\x03\x2c\xb4\xbc\xcc\x0c\xe7\xfa\xcd\x78\x5c\x7a\x2d\x5d\x65\x34\x26\x2d\xf2\x0d\x8c\x1a\x67\x2b\xe9\x50\xf6\x43\xd8\x11\x50\xc7\xdb\x8e\x5a\xde\x76\xd9\x85\x6e\xa4\x31\x90\x36\xdc\x1a\x6e\x73\x28\xb2\xaa\xc4\x3f\x4c\xa5\x46\xf1\x98\x73\x43\x2c\x38\x6f\xf5\xc8\x30\xf8\xdf\xd1\x58\xd7\xf4\x72\x7c\x4f\xc9\xdb\x4a\xa5\x40\x6b\x23\x14\xa8\x74\x9c\xd0\x33\x49\xda\x76\x5d\x76\xe6\x73\x39\x14\x4c\x8a\xba\xc6\xfe\x22\x81\x7a\x7a\x5b\x6b\x42\x3d\x1b\x24\xf0\x71\x7c\xbb\xe8\x34\x3b\x70\x47\x81\xe7\x05\xd5\xec\x81\x5f\xad\x72\xd4\x52\x43\x3d\x69\xab\x12\x8f\xed\xa0\x78\xc5\x93\xbf\xc6\x59\x69\x2c\x56\x3c\xce\xd4\x3b\x60\x35\xe8\xbd\x7b\xcc\xd4\x64\x42\x5a\xcb\x21\x57\x45\x1e\x17\xd4\x0c\xab\xa4\xa0\x7e\x58\xcd\x8a\x9e\x2b\xc8\x10\xe1\x79\xc9\xe3\x4c\xbe\xb3\x17\x76\x39\x99\x10\x3c\x4e\x22\x7f\x3a\x55\xef\xb9\x27\x51\xf4\xb0\xfb\x0e\xd2\xb1\x27\x78\x6e\xb0\x66\x0f\x84\xc1\x0f\xb0\xcf\xf8\xaa\x1d\x90\xf6\x6c\xb8\x66\x0f\x39\x14\xd8\xe6\xb2\x20\x1d\xf9\x60\x59\x73\xac\x2b\x09\x58\x4e\xa7\x34\x21\x29\x16\x7c\x9c\x50\xff\xae\x8a\x22\x5c\x71\x4f\x48\x70\xbb\x20\x2d\x5c\xe8\x54\x4f\xd7\x7b\xbb\xe4\x06\x93\xec\x1a\x93\x32\x8a\xb0\xe3\x25\xe9\xba\x8b\x8f\x3b\xcf\xfd\xe9\x14\x5f\x6d\x51\xfc\xe6\x81\xf7\x71\x14\x41\xae\xa6\x49\xb0\xf6\xbd\xcf\xd4\x74\x4a\x82\xed\x7c\x38\xcc\xfa\x75\xde\xfb\xb4\xe8\xa8\x66\x9a\xdf\x1b\x13\xa4\x39\x0e\x51\x04\xec\xdb\x37\x68\xfe\x69\x94\xaf\xe1\xc3\x5d\x8a\x9d\x55\x00\xa6\xa0\x14\xbe\x76\x5d\xfa\xc6\xe5\x35\x1b\x34\x53\xd8\xd1\x56\xa4\xae\x23\xd4\x85\xe7\xd4\xdd\x73\xd4\x91\xf6\x62\x82\x1d\x55\x7a\xe4\x88\x66\x26\x44\x9c\x44\xd1\x38\x2c\xa1\x5f\x9e\x83\xa0\xa0\xac\x34\x7c\xb6\xe6\x08\xd6\x3d\x87\x3b\xda\x82\xf6\x07\xb0\x62\x57\x43\x3a\x8e\xe9\x1e\x5c\xea\x72\x5b\x74\x24\x3c\x55\x86\xd4\xd7\x0c\xf8\x1b\xd1\xfa\x6c\xcd\xa1\x6a\x80\x85\x44\x7d\x19\xe3\x92\x30\x0b\xca\x4b\xc0\xf7\x29\x78\x17\xe6\x32\xb7\x45\xaf\x7b\x30\x28\x2f\x48\xff\x96\x7f\xeb\x11\x98\xa0\x29\x34\x4b\x86\x26\xed\x7c\x9b\xa2\x38\x81\xf9\x5a\x6d\x57\xdb\x78\x3b\x17\xb3\x85\x04\x51\x6e\x10\x4d\xd6\xcb\x14\xa9\xc5\x4a\x2c\xd7\x9b\xb2\x4c\x76\x2b\x29\xd4\x52\x2d\x96\x02\xd1\xe5\x66\x96\xa2\xd9\x12\xd4\x72\x3b\x5b\xcd\x56\x2b\xa5\xd4\x7c\x9d\xac\x67\x73\x44\x57\x8b\x45\x8a\x76\xc9\xaa\x94\xa5\xda\x2d\xb6\xf1\x66\xb3\x5e\x6c\x60\x53\x26\x88\xae\x96\x49\x8a\x92\x64\x9b\x88\xb9\x9c\x2f\xe6\xe5\x72\xb7\x2a\x17\x72\xbe\x53\x88\xae\x17\xb3\x14\x95\xa0\x36\xcb\x72\xb3\x9d\x25\x42\x2e\xe3\xf5\x02\x66\x8b\x39\xa2\xdb\x64\x9d\xa2\x4d\x92\xa8\x6d\xbc\x4b\xb6\x62\xb3\x9c\x29\xb9\x93\x8b\xd9\x1a\x75\x39\x14\x13\xc4\xbe\x37\x28\x18\x7a\xa8\x74\xf5\xb1\x69\xfe\xf1\x86\xbd\xa8\x71\xcf\x35\x34\x4c\xc4\x22\x59\xad\x93\x4d\xb2\xd8\xc2\xbc\x8c\x63\xa1\x92\x98\xc9\x66\xe0\x37\xaf\xe2\x7f\x76\xd5\x39\x06\x47\x6b\x9c\x71\xcf\x47\x60\x8f\xa2\x79\xf8\xa9\x2f\xc1\x1e\x10\x25\x30\x74\xf4\x2e\xdf\x7a\x88\x0b\x51\x76\x1c\xb9\xa7\xfd\xf4\xa9\x92\x4f\x8d\x13\xd6\x4d\x7d\x95\xa2\x4c\xb3\xfa\xf6\x5a\x9f\xf1\xb4\xea\x71\x04\x72\x5b\x90\xf0\x61\x47\xdf\x3c\x62\x43\x32\xa8\x1b\xe8\xc5\x09\x2a\x5f\x00\xa2\x27\x97\x0c\x2d\xb9\x32\xd2\x1f\x40\x3b\xb6\x07\xf7\xa9\x86\xb0\x6c\xfe\xfe\xfc\x55\xec\x7f\x17\x07\xc0\xa8\x91\xb6\x3a\x3a\x44\xe8\x00\x4a\xe5\x0b\x50\x0a\x12\x6a\x5e\xe6\xaa\xc7\xdb\x3a\x88\xf8\x9b\x73\xb6\xda\x79\x17\x58\xad\x44\x84\x73\x7b\x3a\xbd\xbe\x51\xc2\x89\xe9\x4f\xd8\x1d\x85\x7c\x0a\x24\x6e\xe2\x49\x2b\x78\x9d\xed\x2c\x88\xa7\xae\x13\xa7\x13\x96\x01\xca\xb0\xb8\xe9\x27\x2d\x08\x07\x67\x15\x6f\x8a\x11\x26\x1f\x85\x6d\xc0\x71\xe4\x5d\x39\xdd\x20\x2a\x98\xab\x0e\x60\xbc\xe3\xc9\x2c\x0e\x60\x20\xa3\x48\xb0\xe6\x85\x06\xda\x68\x09\xa8\xbf\x24\xf4\xf5\xe5\x0b\xf5\x68\x50\x2e\x90\x58\xc9\x35\x73\x1e\x5b\x42\x68\x70\x33\xcf\x4d\xd1\x23\x5b\x73\x8f\xeb\x9a\xb4\x82\x19\x0d\xd6\x1a\xcb\xc3\x2a\xb4\x05\xae\x7d\x5d\x53\x59\x83\xb0\x5f\x07\xd5\xf0\x71\x40\xc5\x00\xe6\xb6\xf7\x9e\x82\x1a\x1c\x8c\xc2\x96\x0a\x76\x14\x16\xb4\xfb\xdd\x28\x08\xba\xdf\x76\xcc\xc2\xc1\xfc\x80\x8f\x8f\x55\xad\xb0\x20\xd4\x44\x91\x61\xa5\xb1\x9f\x84\x7c\x7c\x0b\xc0\x01\x6b\x12\x50\xea\xd2\x01\x5d\xd8\xd3\x23\x6f\xc0\x5d\x34\x69\xd8\xae\xd2\x0a\xf7\x2a\x0e\x19\x42\xdb\x90\xad\x29\x3a\xbb\x11\x51\x27\x6c\x40\x21\xd1\x11\x9a\xcc\x60\x41\xb2\x9b\x89\xf7\xdc\xd7\x53\x42\xaf\x96\xbf\xbe\x0f\x87\x84\xca\x28\xba\xc6\xf5\x11\x84\x62\xe2\x78\x04\xad\x2e\x66\x75\x5d\x87\x09\xd5\xcc\xbe\x28\x48\xe4\xf5\x80\x96\x0a\x8d\x79\xd0\xd0\x94\xa3\x2f\xcf\x87\x9d\xa9\xa3\x68\xf8\xcf\x9c\xf9\xe2\x6c\xa5\xf7\x5f\xc5\xfe\xd7\x08\xfb\x47\x5a\xda\xfe\x10\xb5\x87\x14\x0d\xad\x01\x75\x84\xfe\x8a\x19\xdd\x3a\x08\xba\xb0\x8d\xe3\x01\x9b\xf5\x41\xbd\x89\x98\xec\x28\xdc\x63\x13\x86\x00\x60\x32\x98\x68\x41\x9f\x4e\xf8\xb6\xe1\x79\x41\x28\xfc\x11\x05\xb2\x90\x70\x77\xd9\x75\x15\x39\xc4\x89\xf3\xd0\xd4\x30\xf0\x76\xa8\x8d\x2f\x7d\x49\xfc\xfb\x5f\xbf\xa5\x6f\x69\xd1\x75\xf4\x2d\x0f\x3a\xeb\x1b\x07\xea\xeb\xf3\x11\x9a\x28\xba\xdf\x9d\x2b\xee\xb3\xa9\x2b\xf9\xdc\xbf\xf3\xcb\x5b\x8c\x84\xde\xfb\x5a\xd8\xbf\xec\xbc\x56\x35\x58\x44\x81\x84\x3a\x61\xaf\x34\xc3\x8e\x9c\x63\x7b\xe4\x08\xbd\x01\x7b\xab\xd5\x2a\x8d\xbb\x4c\xb3\x92\x7d\xe7\x2f\x9b\xd5\x50\x2f\x43\x07\x75\xe4\x03\xe4\xae\x48\x07\x47\x84\xfa\x19\x06\xbd\xaa\xc4\x86\xd8\x33\x02\xe6\xb3\x62\x00\xc1\x51\x55\xe2\xd5\x6a\x35\xe6\x6e\x90\xe2\xb9\x86\x9f\x97\x76\x89\xef\xd0\x54\x93\x36\x54\xa4\xeb\x87\x09\x5d\x74\x24\xbb\x93\xc5\xfd\x50\xb3\x15\xd7\xec\x38\xd1\xcc\x63\x47\xa8\xe8\x45\x7d\x0a\x59\x1f\xa0\x19\x57\x37\x9b\x6c\x0f\xcb\x17\x7d\xa3\xa8\x57\x11\x0f\xf2\xc3\xb6\x7f\x67\x30\x80\x50\x43\x2e\xaa\xd9\x28\xc2\x28\x94\x09\xe2\x9c\x5b\x16\xc2\xf4\x01\x1d\xaa\xa6\xa9\xf4\x1e\xa5\xc3\x01\xa1\x55\xa0\xb3\x6c\xa8\xcc\xdb\x2a\xc0\x54\x26\xd8\x01\x9a\x46\xec\x81\xa3\xdf\x8c\x50\x95\xde\x8f\xe4\xa3\xd7\x4f\x23\x34\x71\x13\x34\x2a\x45\x55\x83\x62\xff\xd1\x18\x4d\xfc\x04\xa5\x23\x34\xa9\x26\x88\x04\xe0\xd4\xe2\x00\x1c\x7d\x0c\xc4\x81\xb3\x37\xab\x07\xd4\xe7\x23\x70\x4f\x05\xb3\xf0\x5f\x0f\x8d\xe3\x15\x35\x79\x52\xf4\xa5\x4a\x51\x2f\x7c\x8a\x26\x2e\xb4\xb2\xde\xdf\xbd\x69\x71\xa8\x89\x87\x17\x61\xbc\x66\x63\x9f\xbb\xb9\x2b\xba\x6c\x18\xce\xde\x88\x74\x68\x6c\xdc\x86\x89\x57\x70\x1b\xc6\x5d\xc9\x6d\x3e\x2b\x68\xc9\x87\x19\xd1\x84\xe1\x4a\xf4\xc3\x95\xa0\x26\x38\x54\xb3\x43\x6e\x0a\x2e\x72\x53\xf4\x93\xa8\x24\xc3\x1c\x29\xb1\x26\x3d\x8b\x8b\x22\x87\x2d\xc9\xca\x77\xd5\xa5\x8f\x95\x93\x09\x19\x42\xe4\x79\x95\x97\x21\x30\x90\xfb\x62\xf8\xe6\x71\x81\x03\xd8\x87\x8b\x82\xc7\xb7\x01\xf0\x01\x2b\x12\x7e\x81\x34\x50\x97\xec\xdc\x29\x7a\xaf\xb9\xa7\xfd\xb7\x6b\xc3\xfe\xe6\xab\x3f\xa7\x38\x9d\xf2\x22\xb3\x57\x0c\x77\x77\x78\x19\x13\x42\x87\xfc\xe3\xf7\xc7\xc3\xd1\x70\x60\x09\xe9\x70\xf8\xcb\xfe\x1f\x00\x00\xff\xff\xc6\xb7\xb4\x95\x33\x0d\x00\x00") - -func bindataTkgWebDistTkgkickstartuiRuntimees5969771d6bf2c3ab9fc99JsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiRuntimees5969771d6bf2c3ab9fc99Js, - "tkg/web/dist/tkg-kickstart-ui/runtime-es5.969771d6bf2c3ab9fc99.js", - ) -} - -func bindataTkgWebDistTkgkickstartuiRuntimees5969771d6bf2c3ab9fc99Js() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiRuntimees5969771d6bf2c3ab9fc99JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/runtime-es5.969771d6bf2c3ab9fc99.js", - size: 3379, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiScripts2cc3b57c8646210a196cJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xfd\x77\xdb\xb6\xb6\x20\xfa\xfb\xf9\x2b\x28\x4e\x1f\x0b\x5c\xc1\xac\xdc\xf3\xd6\xac\x79\xa2\x71\x74\x5d\xc7\x69\xdc\x93\x38\x69\xec\x24\x6d\x58\x8d\x07\xa6\x60\x0b\x0d\x4c\xaa\x24\x14\xc7\xb5\x38\x7f\xfb\x5b\xf8\x22\x01\x92\x92\x9d\x34\xe7\xde\xbb\x66\xcd\x5a\x59\xb1\x88\xcf\x0d\x60\x63\x63\x63\x63\x7f\x7c\xf7\x6f\xff\xf6\xb7\x7f\xe7\x2c\xa3\x79\x45\x83\x7f\xcf\x8b\xac\xb8\x59\x31\x4e\xff\x76\x54\xac\xee\x4a\x76\xbd\x14\x01\xc8\x60\xf0\xfd\x64\xff\x7f\x04\xe7\x4b\x1a\xbc\x2a\xf8\xdd\x0d\x2d\x83\x57\x65\xf1\x3b\xcd\x44\x70\xb8\x16\xcb\xa2\xac\xe2\xe0\x90\xf3\x40\x95\xaf\x82\x92\x56\xb4\xfc\x48\x17\xf1\xdf\xce\x97\xac\x0a\xb2\x62\x41\x83\x1b\x72\x17\x14\x39\xbf\x0b\x2e\x69\xb0\xae\xe8\x22\x58\xe7\x0b\x5a\x06\x62\x49\x83\x1f\xce\x9e\x04\x95\xb8\xe3\x34\xb0\x60\x5c\x15\xeb\x7c\x11\x10\x11\x2c\x85\x58\x4d\xbf\xfb\x6e\xa5\x3b\x8d\xaf\x99\x58\xae\x2f\x63\x56\x7c\xf7\xfc\xe4\xe8\xf8\xf4\xec\x38\x16\x9f\xc4\xdf\x24\x58\x12\x6a\x4e\x05\x0d\x2a\x2a\x82\xe2\x2a\x20\x1a\x2c\xd5\xed\xe5\x63\x1a\x3c\x7c\x73\xfe\xec\xe5\xeb\xb3\xad\x0d\x66\x45\x2e\x4a\x76\xb9\x16\x9f\xd5\xea\xd1\xcb\xd3\xf3\xd7\x27\x3f\xbc\x39\xb7\x4d\x1f\xc9\xb9\x58\xb0\x4a\xb7\x45\x17\xc1\xe5\x5d\xf0\x63\x51\x5c\x73\x1a\x90\x2a\x58\x91\x52\x75\x26\x67\xc5\x34\x16\xac\xcc\x44\xb3\x2a\x20\xbc\x2a\xfe\x56\xad\x2f\xd5\xb7\x28\x02\x92\x07\x64\xb1\x60\x82\x15\x39\xe1\xc1\xc9\x2b\x3b\xff\xd7\x25\xc9\xc5\x23\xa0\x7b\x75\x78\x7e\x7c\x7a\xae\x01\xfb\xb7\xef\xfe\x36\xba\x5a\xe7\x99\x6c\x0c\xc0\xfb\x70\x5d\xd1\x40\x42\x99\x89\x30\x71\x33\xd8\x15\xf8\x58\xb0\x45\x30\xc1\x18\xdf\xb2\x7c\x51\xdc\xc6\xaf\xe9\x15\xa7\x99\xd8\x6c\xba\x19\xd9\xba\x12\xc5\xcd\x31\xa7\x37\x34\x17\xd5\x66\x33\x98\x1c\x4b\xb8\xae\x18\xe7\xef\x4a\xb2\x7a\xca\xd7\xd5\xf2\x88\x70\x7e\x49\xb2\x0f\xb0\xa4\x62\x5d\xe6\x49\x56\xe4\x95\x08\x38\x7e\x76\xfe\xe2\xb9\xa9\x95\x98\xa6\x9c\x24\x7c\xef\x7c\x4c\x1d\x88\x75\x2b\x81\x81\x32\x56\xad\x95\xeb\x4c\x00\x8e\xd2\x39\x12\x4b\x56\xb5\x69\x45\x09\xeb\xda\x6d\x15\x39\xbf\xe3\x55\x59\x88\x42\xdc\xad\x28\xe6\xed\xef\xe1\x12\x6e\x93\x2e\xe0\xe8\xa5\x5a\xbd\xb8\xa2\xe2\x95\x2d\xfb\xf2\x0a\xb8\x25\x38\xac\x81\xfc\x87\xfe\xf6\x7f\xb7\xe6\xff\xdd\x9a\x7a\x6b\x6e\xdb\x99\x1f\x49\x19\xf0\xc4\xe6\x06\x04\x70\x78\x2f\xd3\x08\x9e\x24\x06\xef\xfb\x3b\x81\x1c\xf0\x98\xd3\xfc\x5a\x2c\x67\xf7\x8b\x22\xa7\xd3\xd1\x3e\xfa\x48\xf8\x9a\x4e\x79\x4a\xc6\xe3\x79\x3d\x35\xc9\x93\xba\xae\x65\x6b\x02\x87\xb6\x95\x10\x63\x89\xb2\xc5\x55\x60\x10\x79\x41\xaf\x58\x4e\x5f\x95\xc5\x8a\x96\x82\xd1\x6a\x36\x94\x7e\xd7\xee\x47\x8e\x08\x12\x0d\x28\x1c\xe3\xc3\xb2\x24\x77\xed\xc6\xd9\x6c\x38\xc6\xa6\x0d\x27\x11\xf0\x94\xcc\xb1\x88\x15\x9c\x10\xf1\x5a\x0d\x9d\x22\x86\xdb\x96\xe1\x3d\xc7\x69\x58\xa8\xba\x2d\x9c\xd7\xbc\xb8\x24\x5c\x62\x7b\x14\xb5\xbf\x11\x47\xbd\x92\x9a\xa6\x44\x91\xfe\xdb\xcf\xaf\x28\xbf\x8a\x22\xf9\x7f\x3f\x4f\xb7\x6c\x7b\x98\x27\x57\x45\x09\xec\x42\xb4\xf3\x9d\x8c\xc7\x44\x2f\x90\xc0\x72\x40\x09\xbb\x02\x22\x8a\x44\xfc\x82\x88\x25\xc6\xf2\x7f\x43\xf4\x02\x51\x8b\x65\x59\xdc\x06\xc7\x65\x59\x94\x20\x3c\x22\x79\x5e\x88\xe0\x8a\xe5\x0b\xd3\x57\x60\x40\x80\x35\x90\x34\x0c\xb6\x58\x50\xca\x49\x56\x94\x9a\x40\x3e\x55\xdd\x51\xcc\x12\x8e\x79\x5c\xad\x38\x13\x20\x8c\x43\xd8\x40\x58\x4a\x54\x69\x20\xdc\xdb\x4f\xca\xf1\x58\xc3\x98\x61\x9e\x96\x0a\xc6\x11\xc8\x02\x96\x07\x14\xc2\xcb\x92\x92\x0f\x01\x4f\x28\xa6\x69\x36\xaf\x01\xc1\x04\x94\x98\xa6\x1c\xf3\xb4\x6d\x63\x3e\x87\x70\x84\xcb\x28\xca\xd7\x9c\x8f\x30\x89\x22\x01\x28\xe2\xe8\x3e\x2b\xf2\x2b\x76\xbd\x2e\xc9\x25\x97\xf8\x85\x6e\x4b\x26\xec\x6f\x8d\x82\xa4\x86\x75\xdd\x0c\x25\x93\xab\xaa\x67\x04\x70\x7c\x9f\xd3\x4f\x62\xca\x6b\x98\x9e\xdd\xdd\x5c\x16\x3c\x66\x82\x96\x44\x14\xe5\x1c\xf7\xb1\x5c\x4e\x4a\x8d\x78\xdb\x56\x6e\x37\x87\xc0\xa1\xa4\x70\x12\x3f\x17\xe1\xc8\xae\xa0\x6e\x32\x8a\x3a\x4d\x47\x11\xef\xf5\x66\xb7\x96\x98\x89\x38\x23\x9c\x03\x0e\xa7\x1a\x36\xb9\x01\x1d\xf0\x0b\xd9\xa5\x9a\x3f\x1e\xb0\xbc\x12\x24\xcf\x64\x57\x0a\xe5\xa1\x44\x57\x09\x53\x8b\x2b\x48\xe0\x74\x9e\x8c\x00\xc1\x3c\x96\xcd\x01\x08\x63\xb9\x13\x13\x28\xe2\xd5\xba\x5a\x02\x62\xf0\x3f\xe1\x58\xd4\x76\x0b\xd5\xec\x0a\x94\x20\xd4\x40\x86\xc8\xdd\x0f\x2e\x61\x90\x28\xa1\x0e\xbb\x6b\xcc\x91\x50\x38\x83\xc2\x05\xad\xb2\x92\xad\xd4\xce\x7e\xec\xea\xb0\x2b\xc0\x2d\x96\xf2\x84\x38\x67\x9e\x28\xce\x44\xc9\xf2\xeb\x2d\xab\x11\x5f\x9b\x5d\xdb\x27\x4e\x01\x07\x42\xcd\x94\x2c\xe7\x4e\x15\x87\x7a\x1b\xe4\xf4\x36\x38\xbf\x5b\x51\xb3\x1d\xf4\x60\x25\xe1\x95\xbb\x82\x04\xce\x69\x1b\x42\xdb\xb8\xac\x43\x40\xf8\x7b\x25\x0f\x8c\x8b\x4a\x55\xb9\x08\xc7\x40\x6c\x36\x61\x08\xc7\xe1\x45\x38\xa6\xe3\x31\x12\xb0\xae\x21\x6a\x1a\x6d\x96\xd9\x9f\x4a\x7f\xd4\x1c\xeb\xc2\xfd\x4a\xed\x72\x52\x1c\xaa\x85\x0e\x4e\x72\xf1\x3f\xf4\xaf\x37\xcc\xff\x79\xc4\xc9\xcd\x8a\x2e\x9a\x62\xfb\xff\xbd\xcd\xb4\xbf\x4f\x72\xf1\xf7\xef\xdb\x64\xfb\xfb\x29\x2f\x88\xff\xf1\xdf\xff\x5f\xf5\x11\xda\x4d\x1e\x84\x10\xe9\xcd\x4d\x2d\xf9\x69\xb6\x76\x8e\x59\x4a\xd3\x72\x3e\x4f\x06\x28\x7b\x1e\x45\x6d\x6a\xb3\x3f\xf2\x76\xa1\x53\x3e\x97\x3b\xda\x49\x79\xdc\xde\xee\xa3\x45\x06\x88\xa6\x5e\x72\x0d\x5a\x8c\x86\x68\xfb\x81\xe3\x73\x4e\x90\xe2\xc1\xf4\x84\xf2\x8a\xaa\xa1\x56\x89\xa1\x81\x4b\x7c\x5f\x27\xa2\xbc\xbb\x5f\xc6\x17\x17\x0a\xf2\x8b\x0b\x7c\x4f\xe4\x31\x87\x2a\xbc\x8c\x49\x62\x88\x5b\x9d\x11\x91\x2d\xc1\x31\xbc\xaf\x2b\x3c\xda\xaf\x29\xae\x66\xee\xf9\xa5\x91\xc1\x69\x84\x20\xe7\x6b\x84\x31\x19\x44\x5a\x3e\x0e\x2d\xc2\xd2\x4f\x82\xe6\x15\xbb\xe4\xb4\xc5\x56\x5e\x4f\x25\xb5\x54\x07\xee\x02\xd3\x96\x9c\xaf\x80\xd9\xb8\x6b\x3c\xda\xd7\xfc\xea\x12\xcb\xa2\xfa\xf7\x4b\x82\x35\xdf\x8d\xcc\xee\x36\x65\x28\xc1\x26\x89\xa9\xd2\x2d\x55\x5a\x5b\x7c\x8e\xd7\xc3\xbb\xeb\x47\x9a\x6b\x6c\xd6\x9c\x4d\x49\xc9\xe2\x2e\x28\xd7\x79\xce\xf2\xeb\x10\x26\x5c\x42\x32\x69\xdb\x7b\xa6\x27\x85\xc7\x0c\xdf\x93\xcb\x29\x41\x57\x97\x6a\x52\xb9\x24\x35\x31\x25\x6d\xc9\xb7\xba\xa4\x1d\x71\x7c\x8d\xff\x8e\xee\x2d\x65\x69\x8b\x5d\x4b\x00\xcd\x68\x24\x68\x2b\x3b\x6a\x67\x10\x87\x9a\x93\x40\x14\xde\xcb\x35\x95\xb3\xc6\x30\x31\xe4\x38\xbe\x8e\x97\x48\x40\x7d\x74\x31\x97\x9e\x68\x64\x81\xc3\xe3\x3e\x31\x9b\x58\x72\xc9\x6b\x2e\x82\x70\xcc\xda\x35\x23\x79\x73\xe2\xaa\x76\x99\x22\xcd\xb0\x1d\x8b\x5e\x1f\x96\xe8\x43\x95\x69\x52\x6d\x70\xc9\x1b\xb4\x5d\xbe\x67\x12\x50\x44\x20\x3a\x92\xa7\x46\x3f\x9f\x36\xa3\x41\xa5\x29\xd4\x0c\xff\x48\x91\xf7\xa2\x04\x89\xac\x70\x9d\x40\x3b\x09\xf2\xec\x58\xca\x3a\x0a\x4a\xd2\x83\xcf\x4e\xb7\x06\x0f\x19\xfe\xaf\x6e\xe1\x94\x25\x5b\x9c\xb2\x30\x2a\xaa\x6f\xdb\x90\x3f\x98\x66\x30\xb0\xfa\xad\x53\x34\xd4\x24\xbe\xba\x34\xd3\x4b\x62\x72\x69\xd0\xbb\xe9\x56\x7f\xa2\x86\xc1\xf4\xb2\x4d\xa7\x4d\x66\x33\xdc\xf7\x0d\x46\xc8\x73\xb1\x3d\x5f\xda\x79\x5d\xab\x31\x2b\x40\x96\x33\x82\x25\x7a\xa8\xdf\xaa\x02\x22\xea\xe3\x25\x9c\xaa\x41\xbc\x04\x04\x22\x82\xe5\x1c\x42\x44\x6a\x8d\x5d\x0a\xe4\xcf\x6a\x59\xd5\x70\x9a\x6e\xd6\xb3\xdb\xb4\x6e\x68\xa8\x6d\x9f\xac\xe8\x9e\x12\xc3\x1f\xca\x3e\x5a\x4e\x43\x76\x1b\xea\xaf\x90\x69\xd6\x43\x7f\x4d\xdd\x53\xca\x9b\x4d\xde\x4e\xa4\x81\x52\x67\x9b\x59\x30\x6c\x95\xc1\x3f\x58\x2b\x18\x34\xc4\x8f\xe6\xaf\xda\x15\x7a\xe1\x6d\x6d\xa2\xf6\xed\x7b\x20\xff\xbf\x06\x04\x42\xb4\x88\x22\xe7\xd2\x1c\x45\x0b\x20\x41\x6a\x12\xe4\x64\xad\x1c\x56\xe2\xa5\xc7\xd7\x5b\x42\xc7\x6b\xe4\x16\xea\xce\xab\x2d\xc9\xb0\x81\x63\xca\x6b\x4b\x15\x0d\x4d\xac\x91\xbe\x6f\x5c\x95\xc5\xcd\x66\x03\xda\x0f\xdc\x9f\xc6\x74\x1e\x57\xf2\xda\x6b\x79\xbc\x1a\xda\xdb\x3b\xa9\x2a\x76\x9d\x6f\x36\xc0\xfb\xf6\x9a\xf0\x99\x3a\xb7\x21\x52\x5e\xaf\x95\xe4\x03\xed\x43\x24\x79\x21\x7a\x20\xec\x01\x4d\xc7\x63\xa8\xb6\x95\x48\xe9\x1c\xda\x36\x18\xe6\xa8\xb4\xe7\xdc\x07\x7a\x57\xc9\x45\xcb\xf0\x24\xc9\x0e\x4a\x5b\x33\x6b\x8f\xf6\x32\xcd\xe6\x09\x4b\xf3\x39\x26\x69\x3e\x77\x4e\x55\x85\x59\xcf\x71\x45\xc5\x39\xbb\xa1\xc5\x5a\xb4\x87\xcc\x47\x00\xef\xdb\xc5\xbc\x6a\xf8\xd6\x2e\x3f\x76\xb5\x85\x74\xbe\x2a\x8b\x1b\x56\xd1\x2a\xb8\x59\x57\x42\x5e\xc0\x1b\x8e\x8c\x2e\x82\x8f\x8c\xc8\xf2\x9a\x70\x0e\xb0\x16\x5b\x98\x3c\xcd\xda\x35\xc5\x61\xa2\xd6\xf0\xd4\x1e\x6b\xcf\x48\x73\x1e\x9e\x78\x47\xe0\x25\xc1\xe9\x1c\xdd\x02\x7d\x40\x3a\x44\xf3\x52\xe3\xa8\x22\x9b\x7f\xc7\x18\xf3\xf8\x34\x81\xf2\x5a\x74\x92\x4c\xf4\xe7\x8c\xc7\x97\xc4\xf0\xda\x6a\x9b\xc8\x4e\x26\xe8\x47\xe0\xe0\xbf\xde\x9e\xfb\xa6\x02\x89\x97\x97\x53\x12\xb3\x4b\x39\x36\x49\x00\x31\xc6\x02\x02\x9b\x7d\x37\x3d\x83\x40\xf1\xc8\x72\x7a\x10\x8f\x4f\xa0\x66\x4d\x2c\xbd\xa6\x58\x00\x99\x6a\x08\x70\x83\x7c\x81\x1a\xd1\x99\x5b\x17\xd6\x77\xce\x27\x95\x2c\x93\x33\xb8\x3b\xc3\xe2\x97\x77\x9a\x30\x63\xbc\x65\x5a\x0f\x03\xd3\x44\x90\xe9\x4b\xe5\x25\x95\x07\x5e\xc1\x3f\xd2\x45\x70\xcb\xc4\x32\x60\x42\x5e\x72\x63\xbd\x5e\x24\x8a\x40\xef\xba\x4b\x36\x9b\x01\x0e\x8d\x40\x3b\x3b\x24\x16\x4b\x9a\xab\xea\x3e\xf6\x34\xc7\xd1\x29\xfe\xbb\x9c\x0d\x4c\x90\x1a\xe8\x8d\xbc\x08\x79\xd8\xd1\xb4\x2a\xa0\x3b\x23\xb7\xc0\xa7\x99\x7d\x29\x07\x8f\xc9\x6a\xc5\xef\x00\x41\xcd\x4e\x83\x75\x0d\x84\xa4\xcc\x1c\xd6\xb2\xeb\x7d\xd3\xb5\xec\xb5\x3d\xf9\xce\x34\x05\x6c\xa7\xf4\xcc\x32\x36\xa7\xf8\x7b\xb7\x46\x53\x40\x7e\xdd\x7f\xaf\x97\x3a\x8a\x34\x0e\x5d\x12\xb3\x25\xa3\xc8\x43\x1b\x89\x4b\x9b\xcd\xd0\xcd\x53\x6e\x95\x82\xd3\x28\xea\xfe\x88\x6f\x49\x99\x83\xf0\x55\x51\x29\x5e\x31\x78\x93\x2f\x49\xbe\xe0\x74\x11\x98\xed\x16\xbc\xa6\x72\x5d\x58\x91\x4f\x43\x85\x5b\x35\x74\x25\x0f\x48\xb8\xf0\x24\xe4\x40\x24\x64\x3c\x86\x97\xea\x04\xbb\x24\x29\x99\x4b\x66\xee\x92\x74\xf8\xc3\x0b\x2b\xa4\xd1\x5c\xd7\xe5\x90\xf4\x87\xcf\xf8\xb4\xe5\x41\xd9\x60\x19\x32\x23\x4e\x19\x83\x74\x58\xb4\x1d\xdd\xea\xf9\xd5\x28\x33\xda\x57\xcc\x39\x07\x1e\x39\xdf\x6c\x80\x90\x3b\x50\x2e\xa7\x3c\xa4\xd0\x60\xee\x99\xc9\x75\x76\x51\x2f\xaf\xed\xf6\x93\xb3\xcb\x78\x14\xf5\x90\x9b\xcb\xa3\xca\x95\xdf\x62\x7c\x25\x87\x4b\x6f\x83\x2b\xe0\x1e\xe2\xea\xb6\x0f\xeb\x2b\x57\xec\x2b\xfb\x1f\x38\x4b\x02\xc3\x63\xd0\x5c\x11\x09\x89\x88\xc8\xad\x27\x73\xb0\x8f\xd9\x7a\x5a\x64\xaf\x5d\x19\x35\xf8\xd8\xdc\x1a\x2e\xf5\x45\x5e\x96\xb2\xcb\x06\x91\xf0\xdb\xbe\x62\x39\xe1\xfc\xce\x83\x4a\x63\x48\xb7\xe1\xa4\x07\x6c\x53\xa7\x95\xd9\x49\x1e\x4e\x51\x0b\xc0\x01\x84\x9d\x62\xed\x78\x6b\x77\xb1\x3e\xb7\xb6\x2c\x25\x17\x05\x08\x39\xc1\x50\xcb\x0d\x8e\xd1\x29\x3a\x41\xe7\xe8\x25\x7a\x85\x7e\x1c\x42\xb8\x8a\x8a\x93\x9b\x1b\xba\x60\x44\xd0\x28\x72\x87\xeb\xe6\xc8\x45\xdb\x6c\xdc\xdc\xe7\x80\xa3\x09\xac\x15\x5b\x6f\x1e\x16\xcc\x06\x83\xf7\xfe\x37\xbe\x1a\x58\xb5\x4e\x02\xba\x8a\x09\xe7\x43\x38\xd0\xc5\x20\xb9\xc7\x1a\xac\xa4\x80\xa3\xac\xa1\xdf\xd9\x10\xd5\xcd\x06\xa9\x6e\x06\xed\xc1\x9f\x35\x54\x77\xe8\x56\xef\x91\xd1\x5c\xf3\x22\x19\x72\xf1\x99\x5a\x16\x10\xd6\x2c\xe5\x73\x9c\xa1\x09\xc6\x7b\x7b\x65\x14\x11\xc0\xdc\xbd\xa5\xa4\x5c\x72\xb6\xb8\xf3\xe8\x63\xc5\x7f\x8d\x04\x13\x0c\xf3\x08\x72\x76\x02\x92\x65\x74\x25\x2a\x25\x27\x57\x52\x0b\xa8\xb9\x13\xd6\x95\x07\xfb\x2c\x98\x1c\x9b\xec\x8b\x75\xfa\x22\x20\x9d\xbb\x22\x4d\x9b\x6f\xb8\x24\xe6\x72\x49\x14\x64\x88\xa5\xd9\x1c\x2a\x0c\x8d\x4b\x92\xd1\xc7\x2e\xd6\x17\x0f\x59\x76\x32\x38\xe6\x56\x58\x34\x41\xac\x69\x2f\xa1\x07\x4c\xf1\x82\x9f\x00\x97\x8c\xa0\xde\x26\x12\x04\x03\xb3\xde\x42\xf8\x93\xfa\x2d\x91\xe4\xb1\x23\x10\x9a\x64\xa9\xb9\x7e\x82\x17\x45\xa6\x0e\xc8\x38\x2b\x29\x11\xf4\x9c\x7e\x12\xa7\xc5\x82\x82\x30\x84\xe8\x03\x4e\xe7\x89\x6c\xe2\xc5\x5a\x10\xd9\xc0\xcb\x4b\xf5\x74\x54\xba\xdb\xd5\x82\xcf\xf1\x07\x3b\xe3\x46\xe2\xad\x4e\x9a\x0f\x29\x99\x03\x98\x7c\x50\x22\xa9\x8c\x82\x89\xa4\x7b\x30\x2e\x74\x4b\xe0\x09\xba\xcf\x96\xa4\x24\x99\xa0\xe5\x13\x22\x94\x28\x06\xa2\x1f\xbd\xb1\x7c\xd0\xdc\x18\x87\xe8\x49\x2c\xe8\x27\x71\x54\xe4\x82\xe6\x02\x4f\x0e\xbc\x6f\xfb\xa0\x11\x86\xd3\x90\x84\x75\x3d\xea\x09\x6c\x46\x8a\x15\x09\x78\xc3\xa3\x78\x92\xfb\x96\xdb\x98\xe9\x1d\x3f\xd5\xe9\x48\x2f\x8c\x96\x6b\x82\x17\x44\x2c\xe3\x92\xe4\x8b\xe2\x06\x40\x88\x4a\x1c\x5e\x5c\xfc\xf6\x69\xb2\xaf\x65\x8b\xff\xfe\xef\xe1\x98\xa1\x4c\xde\xdc\xa8\x78\x79\x9b\xdb\xc7\x8f\x53\x72\x43\x2b\x94\xf7\xd2\x9f\x18\xe1\x6b\x51\xa2\x02\x73\xb3\x06\xa8\xc2\x5c\xf1\xf8\x68\x89\x79\x7c\x55\x52\xfa\x27\xdd\x6c\x38\x5a\x60\xde\x79\x53\x41\xab\x6e\x12\xa3\x15\x5a\x63\x39\xe4\x70\x00\x82\x10\xa2\x67\xde\xc3\xe5\x5b\xfc\x2c\x5e\x92\xca\x29\x87\xae\xf1\x33\x59\x40\x7d\x9c\x54\xc7\xf9\xfa\x86\x2a\x79\x1e\x3a\xc4\xcf\x1a\xf1\x2e\x3a\xc2\xdd\xe7\x9c\xb7\x66\x83\xa2\x12\x6e\x36\x0b\xf9\x17\xdd\xd3\xa6\xf6\x74\xb4\x8f\x7c\xe9\xe0\xbe\x23\x1d\xb4\x8f\x4f\xf7\x75\x0d\x11\x4f\xcb\x79\x1a\xca\x99\x24\x73\x2c\x6a\xf4\x7e\xf0\x50\x2c\x24\x29\x68\x45\x88\x30\xbe\x2a\xca\x63\x92\x2d\x3d\xde\xe1\xca\x5c\xb7\x10\x87\x51\x74\x0b\x04\xe2\x88\xa4\x5c\x6e\x7b\x79\x40\xbe\x70\xaf\xb4\x35\x7a\x3e\xb4\x81\xb8\x7a\xc3\x18\x99\xc1\x9d\xa9\x43\xfb\xe3\xf6\x82\x5e\xb9\xab\x81\xe3\xd6\x60\x51\x0b\xfb\x47\x40\xe0\xcc\x54\x53\xe7\x38\x81\x51\x34\x1a\xa9\x2b\x78\x39\x8f\x22\xf3\xc3\x4e\xc8\xf4\xda\x29\x2a\x3b\xb9\x1c\x92\x29\x2c\xc0\x33\x44\x76\x4f\xff\x04\x5d\x53\x31\x7d\x81\x2a\x2a\x3c\xf1\xc1\xb1\x81\xe2\xa1\xda\x7d\xd1\x2e\xaf\x21\x3a\xb2\xb5\x47\x13\x25\x52\x3f\x4b\xc9\x1c\x2f\x00\x97\xb7\xd5\xd0\x95\xd0\xa3\x1b\x88\x96\x40\x66\xc3\x1a\xb5\x7c\x49\x20\x4b\x7e\xed\x47\x80\x4b\xe0\xed\xd1\x69\x28\xf9\x9d\x8c\x08\x20\x99\xf1\x10\x31\x34\x1e\x53\xc9\x57\x9e\xe1\x42\x71\x66\x10\xdd\x60\x23\x3f\xb9\xab\xd1\xc5\xd0\x6a\x9f\xa5\x7c\x5e\xa3\xdb\xde\x26\xd0\x74\xdc\x2c\x32\x51\x67\xd5\x47\x40\xa1\x11\x94\x1d\x23\x11\xb7\xb3\x0a\x8d\xc4\xb2\x00\x02\x26\xcc\xc9\x50\x02\x67\x5e\xd1\x80\x61\x91\x10\xc0\x11\x45\x4c\x49\x68\x10\x45\xa3\x91\xd7\x84\x2e\xb7\x30\xdd\xb7\x72\x64\xf4\x69\x08\xea\x0c\x70\x18\x5f\x31\x2e\xa8\xe4\x1f\xe3\x1b\xb2\x02\x17\xb0\x4e\xd6\x5a\x10\x88\x6f\x91\x6c\x28\xf4\x49\x4c\x88\xd6\x10\xd9\x12\x9f\x90\xee\xca\x49\x7a\xa0\x9b\xe7\xb0\xd6\xad\x0e\x51\xa3\xe1\x76\xda\x3d\xfe\x49\x4e\xa1\x3d\x57\x2d\x79\xaf\xe4\x66\x37\x0b\x28\x06\xb6\xbd\x70\xb6\xbd\x50\xdb\x9e\x23\x81\x48\x2a\xe4\xb6\x9f\xae\x54\xfb\x88\xd7\x03\x63\x65\x5d\x90\x90\xdc\x47\xe1\x10\x31\xf4\xca\xdd\xa1\x05\x10\xa8\x79\x7d\xdb\x39\x39\x80\xe3\x2d\xc8\xd8\x49\x46\x1c\x31\x08\x59\x1e\x3c\x9b\x49\x64\x9b\x5e\xca\x53\x1b\x2d\xc0\x1d\x0a\xaf\xe4\xfe\xd9\xd2\x0b\xbb\x02\xcf\x01\x1f\x96\xd0\x38\xaf\x0f\x24\xd0\xfd\xe8\xfb\xbd\x43\xb5\x24\xcf\xe9\x03\x82\x31\x06\xea\xdd\x58\x1d\xdf\xfb\x13\x08\xcd\xcf\x09\xda\x9f\xc8\xf2\x7e\xe6\x08\x63\x06\x2d\x33\x34\x39\x70\x72\x27\xa8\x79\x1d\x6e\x78\x37\x68\x57\x95\x1b\xc1\xaf\x19\xe2\x07\x7a\xf7\x74\xeb\x28\x9d\x9b\x91\xfa\x68\x50\x24\x8a\x24\x35\x8d\x22\xe0\xee\x11\x7c\x65\x0f\x26\xa2\xef\x45\x03\xe8\xd8\x1e\xc3\x3b\xba\x34\xbd\xec\x63\x8c\x1b\xa9\x82\x01\xdf\xe1\x07\xc9\x4c\x9e\x4c\xd3\xf7\x86\x8f\x56\x9d\xe9\x63\x7d\xb8\x69\x3d\x14\x8e\x0f\x5b\xba\x6e\x07\x14\xa6\x9a\xfb\x0f\x34\x3d\x99\xcb\xa5\xe0\x72\x8c\xaa\xd0\xac\xcd\x56\x2b\x35\x0f\xa7\x0a\xab\x9f\xa1\xd0\x9e\xd2\xb2\xc7\xc4\xdc\x26\x46\x93\x11\xc6\x05\x58\x80\xfb\x1a\x75\x51\xed\xfe\x9a\x0e\xa9\x4b\x2d\xcc\x0b\x71\xb7\xb4\x26\x8d\x92\x51\x4b\x3b\x79\xf3\xba\x86\xfd\x44\x8d\x8c\xe1\xc9\xf1\xfe\xbe\x56\x57\x39\xc6\x8b\xf6\x26\x71\xbc\x85\x88\xe6\xf2\x0c\x83\xc9\x82\x2a\x3d\x9f\x67\x29\x99\x23\x4b\xe7\x90\x3e\xdf\x28\xac\xeb\xba\x36\x02\xd8\xee\x92\xea\x49\x91\x1c\xcf\xb1\x11\x9b\xa2\x53\xf3\x62\x8b\xce\xf1\x71\x97\x91\x7a\x89\x8f\x1d\xb6\xe8\x15\x7e\xd9\xb2\x3a\xa1\x15\x81\x07\x37\x12\xe6\xa0\xa4\x2b\x2e\x79\xf9\x8a\x92\x32\x5b\x06\xea\xa9\x35\x58\x92\xea\xc4\x9c\x56\x01\xab\x8e\xd4\x96\x3e\x5b\x95\x94\x2c\x24\x0e\x06\xeb\xbc\xca\x8a\x95\xfc\x59\x05\xd5\x8a\x66\x8c\x56\x81\x28\x5e\x95\xec\x86\x09\xf6\x91\x06\xb6\xb3\x73\x72\xed\x3e\xde\x0e\x32\x35\x5c\xf2\xb0\xa7\x9b\x0d\x38\x07\xa7\x88\xdb\xe5\x38\xd5\xd2\xe9\xd0\x6d\x49\xe3\x0b\x00\x27\xf8\x78\x2b\xdf\x09\x5e\x3a\xf8\x02\xe1\x36\xf4\x7c\xe5\xa0\x27\xd2\xd2\x22\xac\x64\x07\x33\xf9\xdf\x54\x71\x29\xa7\xb1\xd3\x79\xa3\x21\xa1\x8b\x92\x19\x9f\x36\x08\x1b\x8e\xc9\x38\x9c\x87\x35\x3a\xf7\x7a\x47\x27\x10\xca\x31\x74\xf1\xc1\xb9\x1f\xfb\x4f\x0f\x92\x97\xdb\x6c\x80\xfc\xd3\x85\x58\x8b\xbe\x14\xfe\x32\xa3\x34\xd2\x1b\x93\x3d\x52\x0e\x30\x69\x4e\x4e\xa3\x0e\xc5\xad\x02\x14\x37\xcc\x8d\xd0\x6a\x51\x75\x6d\x4b\xaa\xdb\x31\x45\x4c\xb2\x92\x1a\x0c\x31\x08\x86\x1e\x9b\x7a\x5f\x38\x2a\x16\xf4\x55\xc1\x72\xd1\x42\x36\x41\x65\x03\x06\xca\xb6\x01\x5a\x1e\x60\x86\x28\xe6\xf2\x6a\x43\x80\x88\x33\xdb\xd0\xa1\x00\x0c\x36\xf4\x8f\x8d\xb1\x7d\xe6\x47\x5b\x07\x42\x9d\x31\x64\x7a\x0c\x59\x0d\x6b\xd0\x79\xee\x41\x9d\x3b\x38\x32\xe3\x68\x5f\x6b\xd4\x4e\xfe\xbd\xa7\xa7\xd5\xe0\x40\xb2\x35\x67\xe0\x25\xa9\x21\x9f\x0a\xa5\x1a\x44\x79\x63\x25\xa5\xf3\x70\x6a\x05\xeb\x5e\x81\xd3\x35\x97\x84\xef\x77\x07\x3b\x6b\xe4\xbc\x92\x0c\xb1\x27\x26\x7b\x80\x21\x71\xf8\x96\x3e\x53\x0d\x08\x1e\xac\xe9\x6c\x25\x75\xc4\x44\x11\x71\x4e\x1f\x79\x59\xef\x4e\x5d\xef\x69\x2d\x8a\xba\x45\xdc\x25\xde\x6c\xc0\x83\x2d\xb8\x0c\xb4\xc1\x3c\x83\x64\x76\xad\x5f\x00\xde\x55\x66\xd9\xc7\xf2\x3e\x1a\x45\x80\xe0\x09\x44\x7f\x1f\xc9\xaf\x46\x9a\xd2\x3c\x48\xcd\x38\x7e\x2b\x59\x28\xc9\xaa\xab\x57\x43\x3c\x41\xdc\x3c\xb6\x40\xa4\x2e\xf9\xea\x99\xff\xfb\x5a\xee\xdd\x33\x2a\x76\x80\x29\x87\xb2\xb3\xc0\xe0\x38\x10\xfd\x8c\x91\xa4\x73\x44\x07\xc9\x26\xb1\x52\x04\xb9\x63\xfb\x03\x16\x07\xc4\x1f\xb0\xe2\x18\x87\x06\x2c\xbc\x01\xbf\x20\xab\xdd\x03\xde\x5d\xe0\x5f\x36\x60\x49\x38\xcd\x90\x53\x81\xcc\x9d\xf7\xab\x0d\x5b\x6d\xfe\xa7\x5d\xe1\xd1\xf1\x47\x9a\x0b\x10\xaa\x3f\x9a\xb3\x7c\x1a\xb3\x9c\x09\x93\x7e\x55\x14\x21\x1a\x4d\xe4\xdd\x10\x3d\x8d\x57\x25\x95\xc9\x4f\xe8\x15\x59\x73\x01\x20\x1a\x3d\x95\x87\xb2\xfc\x78\xa5\xb3\xe8\x42\xcf\xc8\x9f\x58\x35\xe0\xec\x0e\xbf\x6e\xb2\x3b\xdb\x25\x37\x5a\xda\x2d\x4f\x69\x2e\x77\x67\x14\x81\x3f\xdd\x83\x6d\x50\x71\xb5\xd1\x93\xf3\x61\xdb\xc6\x36\x8d\x26\x75\xf7\xb2\x5c\x43\xa8\xb5\x68\x5f\xe3\xef\xce\x4b\xb6\xa0\xb9\xf8\x2e\x16\xb4\x12\x20\x27\x1f\xd9\xb5\x44\x84\x78\x5d\xd1\xf2\xf0\x9a\xe6\x46\x65\xc5\xc8\x9c\xd5\xc8\x36\x9b\xd7\x83\xea\x58\x6e\x19\x3d\x53\x3f\x60\x37\x4d\x36\xe4\x7e\x77\xf8\x59\x82\xc9\x66\x73\x5f\x1b\x5d\x83\xdd\x4b\xd9\x5c\xc2\xda\xe5\xe4\x68\x34\x22\xf1\xe5\xfa\x52\x32\x35\xea\x77\x3b\xaf\x8a\xcf\xfe\xa1\x95\x0d\xbe\x91\x2c\xcb\x0f\xd0\x05\x26\x7d\x33\xc7\x3f\xa4\x6f\xe6\x89\x9b\xe8\xa8\xd7\xff\xd0\xfe\x56\x72\xe6\x66\x4a\x8e\xb4\xe9\xc0\x23\x26\xc6\x29\x29\x2f\x05\xfd\xd4\x2f\x98\x10\xa7\x76\x77\x5a\x9c\xac\x9d\x93\x83\x48\xbc\xa0\x82\x30\xae\x66\xa9\x0f\x95\x33\x09\xc3\x73\x03\x91\x9d\x8b\x17\xc5\xba\xa2\x8f\x99\x8a\xb6\xa0\x46\x94\x77\xb8\x97\xe1\x60\x4b\x9b\xf8\x05\x33\xd4\x56\xee\x4e\x50\x9b\xf3\xd0\xfc\x7c\x64\xf4\xd6\xda\x8a\x34\xd3\x85\x48\x5c\x65\x25\xa5\xf9\x2f\xcd\xaf\x5f\x11\x89\x33\xce\x68\x2e\x7e\x69\x7e\xa9\x34\x51\xf2\x7f\xd2\x3b\x44\x62\xc2\x85\xfe\x51\x2d\xd9\x95\xf9\x79\x43\x05\xd1\xbf\x2e\xd7\x42\x14\x39\x22\x71\x49\x39\x11\x74\x71\x4e\xca\x6b\x2a\xd4\xba\xbc\x6b\x54\x2f\xfe\x90\xc8\xfb\x0e\xf6\xe6\x26\xfd\x63\x8e\xdf\xa5\x7f\x34\x18\xdc\xe6\x38\x2b\xf8\xce\x41\x63\xd9\xd8\x37\xe8\x27\x97\x1e\x79\xd4\x9f\x8d\xc7\xb5\x66\x1a\x47\xfb\x48\xc8\xff\x28\x96\x34\x26\xc8\xc8\x4a\xac\x4b\x87\xfb\x25\x58\x52\x19\x99\x55\xe4\x99\xcb\x15\x63\xa5\xe9\xa3\xf9\xca\xee\xf2\x68\xdb\x12\x10\x2e\xd8\x47\xb9\x32\x31\x59\x2c\x14\xb4\xcf\x59\x25\x68\x4e\x4b\x10\x66\x9c\x65\x1f\x42\xc4\x91\xe1\xee\x32\xa5\xb6\xdd\x70\x8b\x51\x04\xca\x78\xc1\xaa\x95\xbc\x06\xe9\x75\xcc\xe9\x6d\x60\xd6\x5d\x57\x86\x10\x3d\xa6\x4c\x86\xf7\x31\x66\xb2\x6c\x49\x6f\x8a\x8f\x74\x3b\x20\x28\xab\x01\x44\xff\xc4\x5a\x8d\x1c\x83\x6f\xbc\x4d\x61\x16\x2c\x8a\xf4\x39\x35\xc2\xf8\x9b\xd9\x37\x53\x53\xe2\xb4\x58\x50\x45\x4c\x7f\x8a\xa2\xb0\x3b\xda\x90\xe5\xc1\x3f\x9d\x3d\xa5\xb6\xc5\x2f\x5d\x59\xca\x88\x6f\x36\xf6\x0d\x6e\xe4\x3c\x0e\x0f\x6a\xb0\x18\x8e\x7f\x34\xe2\x09\x6f\x64\x78\xea\x3b\x36\x2b\x88\xb8\xfa\x92\x8b\x66\x95\xe2\x4c\xce\x94\x20\x99\x3a\xe5\x75\x8d\x7e\xc5\x0e\x60\xbd\x65\x42\x3f\x7b\xd9\x03\xf3\x87\x38\x57\x6f\xc6\xef\x28\xf9\xf0\x82\xac\x10\xf1\x3f\x05\xdf\x72\xe3\x16\x33\xce\xa7\x84\x27\x5d\x9e\x1c\x08\x4c\x25\xd3\x0b\xb8\xe4\x6e\x69\x5c\xc9\x9f\x48\xbf\x4b\xbf\x20\x2b\x88\xda\x92\xf2\x52\x25\x4b\x2a\x3e\x58\x29\xe4\x02\x82\xbc\xee\x95\xe1\xc6\xae\xf1\x6d\x03\x4e\x32\x44\x46\xbf\x66\x84\x89\x15\x9e\x02\x81\x7f\x01\x02\x42\x3b\xc3\x89\xc0\x42\xcf\xaf\x7e\x05\x14\x56\x54\x8e\x98\x3e\x58\xcb\x78\x49\x2a\x60\xd5\x54\x32\x2c\x66\x03\x2f\xd4\x65\xac\xc5\x0e\x80\x40\xf4\xb3\x66\x10\x28\xe2\x28\x43\x6c\x50\x2d\x99\xcc\x88\x2d\x24\xe0\xb4\x5f\x00\xd8\x3b\xb0\x9e\xa8\x29\x89\xb5\x12\x87\x26\xc8\x33\xef\x13\x08\x68\x45\x61\xea\xca\x93\x94\x66\x16\x33\x88\x7e\x75\x65\xff\x48\xcf\x44\x36\xcb\xa6\x04\x31\x58\xd7\x35\x7a\x00\x2f\x7a\x33\xeb\x4e\xa7\x9e\xc7\x66\x1a\xcd\xa4\x37\x9d\x09\x88\x98\xc1\x02\x02\x93\x66\xb7\xb1\x28\x02\xb4\x3f\x59\x1e\x84\x6c\xc6\xa6\x4a\x29\xa1\xae\xeb\x87\x6e\x50\x72\xcb\x3a\x97\xce\xf0\x92\x54\xf4\xcd\xeb\x93\x10\x6e\x36\xc3\xbc\xd9\xb6\x0a\x3d\xe6\x4c\xdf\xa4\x15\x64\x71\x71\x9b\xd3\xf2\x89\x21\x8f\x9b\x8d\xe2\xfd\xe2\x3f\xd6\xb4\xbc\x3b\xa3\x9c\x2a\xf5\x0a\xd5\x50\xba\x2c\xe9\xd5\xdc\xd1\xcf\x8e\x22\x1e\xcb\xb4\xc6\x8e\x91\x17\x99\x7a\x18\x55\xa9\x3d\xbe\x0f\xb9\x4f\x28\x13\xc3\x35\x53\x8e\x18\x47\x25\xc7\x3d\x83\x41\x94\xf1\x86\xcc\x51\xfe\xe0\x6d\xb3\xe4\x28\x24\xc2\x98\xaa\x55\x21\x74\xa9\x20\xe5\x33\xca\xa7\x9f\x3b\xdb\x6e\x6b\x28\x6f\x81\x61\xdc\x08\x7c\x32\x6e\x51\x38\x53\x2f\x99\x6e\x97\x8c\xcf\x18\x1f\x90\x22\xaa\x19\x6f\x5b\xae\x51\xc1\x7b\x0f\xfc\x37\x64\x95\x94\xbc\xf3\x12\x09\xc2\x6b\x2a\x0e\x6d\x45\xf3\x7e\xb9\xd9\x80\x52\x75\xed\x67\x0c\x88\x14\x0a\xae\x71\x31\xe7\x2e\x87\x3f\xf4\x72\x17\xe7\xe4\x86\x36\xb7\x9a\x8a\xa3\xe5\xc0\xe2\x24\xcb\x3e\x7c\x4a\x1e\x68\xa0\x5a\xf2\xd8\x7c\x36\xd3\x56\x71\xbc\xe4\xf1\x2d\xbd\xfc\xc0\xc4\x0b\x9d\x67\xf1\xcb\x9d\xb8\x8a\xcf\x2a\x3e\x95\xf5\xab\x6e\x29\x05\xd0\x82\x63\x7f\xa1\x62\xb2\x5a\xd1\x7c\x71\xb4\x64\x7c\xe1\xd8\x08\x70\x39\x26\x25\x6f\x6f\x4f\xb5\x1e\xc8\xba\xea\xf6\xfd\x24\x71\x4a\x17\xe9\x5b\x73\x78\xd8\xbc\xcb\xb6\xc3\xd5\x7d\x95\xf7\x53\x81\x27\x89\x38\xe8\x0a\xcd\x93\xf1\x58\x40\x79\xdd\x6c\xc5\xe9\xa9\xd0\x66\x73\x02\x03\x82\x73\x49\xa5\x8d\x11\x54\x32\x12\xda\x0c\x4a\x60\x62\xed\xa2\x84\xb5\x05\x44\x0b\x67\x89\x51\x58\x69\x69\xa2\xf3\x9c\xbf\x4d\xc7\x41\xc0\xa9\xb2\xfc\xa9\x57\x1c\x58\x72\x00\x91\xf3\xf1\xb4\x24\xd7\x4d\xa2\x41\x09\xbd\x28\x6b\x8e\x9e\x71\xf4\xb6\xb7\x34\x2c\xaf\x68\x29\x7e\xa0\x57\x45\x49\xd1\x75\xbb\x85\x9e\xd9\x2d\x84\xc1\xfa\xe1\xad\xdd\xdd\x98\x57\xac\xac\x84\x5a\xef\x10\x42\xe7\xb1\x61\xdd\xec\xc7\x75\x6f\x3f\x3e\xe3\xb3\x67\x5b\xf7\x63\xdb\x60\xdd\x62\xd0\xe1\xa3\x30\x68\x55\xd2\x07\x51\xc8\x96\xf9\xcf\xc2\x21\x81\xaf\xdd\x5d\xef\xa8\xd8\xf4\xf0\x8a\x6a\xbc\xa2\x2d\x5e\x51\x4c\x0d\x5e\xbd\xdd\x89\x57\x74\x2b\x5e\x51\x38\xa5\xda\xa6\xac\x3e\x74\x31\xeb\x70\x08\xb3\x0e\x3b\x98\x75\xc4\xd1\x7b\x8e\x5e\xec\xda\xf4\xe8\x79\x2f\x57\x1f\xf7\x3a\xf7\x63\x8b\x76\xef\x5b\xb4\x3b\xfa\x7a\x68\x77\xd4\xa0\xdd\x51\x0f\xed\xde\xf3\xd9\xfb\xcf\x43\xbb\xab\x47\xa1\x9d\x79\x75\x51\x95\x4b\x9a\xef\x44\xbf\x6e\xd9\xff\x4c\x52\x96\xd8\xa5\x10\xf8\xa3\x8b\x93\x30\x81\xcf\x5d\xf4\x12\xf0\x4b\x28\xdf\x8b\xbf\x4a\xf9\xae\x5c\xfc\xbc\x1a\xc2\xcf\xab\x0e\x7e\x5e\x72\x74\xc7\xd1\x19\x47\x37\x1c\x5d\xec\xa6\x7f\xb7\x2d\x22\xde\xb5\x88\x78\xf9\xf9\x88\xb8\x22\x25\xcd\x15\xe4\x3e\x22\x5e\x36\x88\x78\xd9\x43\xc4\x3b\x3e\xbb\xdb\x8a\x88\x6d\x83\x35\xfa\xd4\x42\x79\xd3\x42\x79\xf6\xf9\x50\xca\xd5\x39\x63\x97\x5c\xbf\xa4\x39\x60\x9e\x35\x60\x9e\xf5\xc0\xbc\xe1\xb3\x9b\xad\x60\x3a\x2d\x3a\x1b\xe6\xf8\x71\x27\xfd\x95\xa0\xe5\xee\x83\x5e\x95\xf8\xcf\xda\x1c\xcd\xe5\x43\x6e\x8d\x5b\x6f\x6b\xc0\x96\x5e\x7f\xf2\xb8\x37\xd6\xdf\x1d\xda\x06\x2f\x61\xed\xee\x60\xd6\xf0\x0e\x5d\xd8\xca\xfd\xad\xc1\xb6\x6e\x0d\x06\xa7\x4c\x5b\x56\xd4\xc7\x1c\x1c\xb9\xca\x89\x10\x1d\x77\x36\xc3\x29\x47\x27\x1c\x9d\xef\xde\x06\x2f\x5b\x04\x3b\x69\x11\xec\xf4\xeb\x6d\x83\xd3\x06\xbf\x4e\x7b\xf8\x75\xc2\x67\x27\x8f\xd9\x06\x2d\x7a\xbd\x7a\x14\x7a\x5d\xaa\xb1\xed\xc4\x2f\x53\xe4\xbf\x04\x82\xbd\xdc\x86\x60\x9f\xc5\x10\x9c\x6f\x47\xa8\x87\xb8\x01\xf5\x34\x59\xc3\xfa\x55\x0f\xa7\x5e\x75\x70\xea\x47\x8e\x9e\x70\xf4\x61\xe7\x11\xff\x7b\x8b\x52\x4f\x5a\x94\xfa\xf1\xeb\xa1\xd4\x8f\x0d\x4a\xfd\xd8\x43\xa9\x27\x7c\xf6\xe4\xf3\x50\xea\xe9\x23\x8f\x78\x39\xc0\x07\x4e\x76\x55\xe4\x2f\xa0\x94\x95\x04\xfc\xee\x31\x88\x3c\x8a\x3e\x70\xab\x27\xd4\xac\xd5\xd3\xde\x5a\x3d\xed\xac\xd5\x9f\x1c\xbd\xe6\xe8\x87\xdd\xfb\xff\xcd\xce\xa5\x7c\xd7\x2e\xe5\xeb\x76\x29\xff\xfc\x7a\x4b\xf9\x67\xb3\x94\x7f\xf6\x96\xf2\x35\x9f\xbd\xfe\xbc\xa5\xfc\xe3\x73\xb8\xb5\x77\x4c\x2c\x1f\xc3\xa9\xa9\x72\xff\x25\xe8\xc4\x3b\x9f\x4e\xdc\x7f\x21\xa1\xf8\xe1\xaf\x11\x8a\xe4\x4d\x53\xdf\x20\x63\x0d\xeb\x3f\x7a\xd8\xf8\x47\x07\x1b\xbf\xe1\x8d\x70\xbc\x27\x5b\xfa\xa9\xc9\x1b\x74\x56\x85\xfe\xd9\xe4\x9f\xbd\xfd\xb1\x2f\xfd\x18\xfd\xd4\x17\x7f\x64\x9c\x54\xd5\x73\x56\x09\xb9\xc4\xdf\x3c\x90\xff\xcf\x07\xf2\x87\x51\xe4\x1b\x8e\x9c\x62\xe8\xa1\x2d\xf1\x93\x57\xdc\xd8\x93\xfc\xc2\xb7\x3e\x85\x28\xbf\x56\x21\x4c\x7e\xe1\x9e\x61\x41\x78\x59\x2c\xee\x82\x7b\x51\x92\xbc\x52\xfe\x9b\xa6\x41\xb1\x22\x19\x13\x77\x01\x25\x15\xdd\x63\x79\x30\x89\xbf\xaf\x92\xa0\x0e\x7e\xcb\x65\xd9\x74\x9d\x5b\xf3\xc9\x79\x70\x6f\xca\x4e\x83\x49\x12\x2c\x58\xb5\xe2\xe4\x6e\x1a\x5c\xf2\x22\xfb\x90\x04\xc5\x47\x5a\x5e\xf1\xe2\x76\x1a\x2c\xd9\x62\x41\xf3\x24\x58\x15\xb6\x0f\xf5\x08\xc5\x3e\x52\xdd\xae\x56\x95\xfb\xd5\x01\xbe\x23\xa1\x5c\x52\xb2\x08\x61\xf2\x2b\xf7\xa8\x0d\xf8\x85\xa3\x5f\xb9\x73\xd3\xd2\x93\xf0\xb3\x5d\xde\xe4\x67\x1e\xbf\xa3\x97\x47\xc5\xcd\xaa\xc8\xe5\x16\xc0\xdd\x84\xcd\xe6\xfe\x8a\x93\xeb\x6a\x7a\x5f\xeb\x97\x3e\x4e\xb6\xc1\xf0\xad\x9e\xf9\xb4\x2a\xb3\x7f\xc3\xe1\x2d\xbd\xcc\x9a\x56\xf6\x2e\xd7\xf9\x82\xd3\x70\xfe\x2d\x44\x84\xe0\xef\x6e\xb3\x3d\x10\x8f\xe1\x77\x48\x10\x7c\xaf\xed\xac\x04\x89\xf3\xe2\xe5\x4a\x54\xda\x15\x85\x15\xa5\x6a\xbd\x3a\xab\x52\x0a\xad\x3a\x5c\xb4\x45\x1d\x4e\x6d\xfa\x04\x38\xae\x8d\x70\x08\x61\x3a\x99\x2b\xed\x08\x9e\x4e\xe6\x5a\x30\x07\x88\x7a\x94\x00\x82\xa4\x24\xdd\x9f\xcf\x31\x4f\xf7\xe7\x9b\xcd\x68\x02\x6b\x88\x38\x69\x59\x02\x82\x27\x88\x59\xef\x07\x09\x23\x98\x13\x47\x7e\x99\x52\x32\x4f\x28\x19\x8f\x61\x58\x95\x59\x38\xc2\x98\x11\x25\x40\xd4\x4d\x9b\x8f\xb9\x4c\x55\xa4\x40\xf5\xa0\x1f\x23\xd4\xc0\x05\x89\x79\x71\x1d\x45\xfa\xaf\x06\xd9\xff\x02\x21\xda\x32\xd4\x52\x69\xba\x29\x0b\x19\x5d\x01\x97\xa4\xee\x2e\x5f\xac\x16\x0f\x0b\xa2\x9f\xf0\x08\x16\x24\xae\x96\x64\x71\xb7\x28\x6e\xe4\xb4\x67\x04\xde\xff\xcc\xe3\x33\x99\xf4\xe4\xe5\x0b\xec\xfc\xde\x6c\xee\x6b\xe4\x7c\x4b\x20\x32\x8a\x33\xdd\x54\xae\x9a\xca\x8b\x57\x72\x36\x13\xb7\x98\x49\xc3\xa1\x28\xd7\x34\xc4\x18\xe7\x64\xb3\xc9\x89\x7a\xcc\x2c\x54\xad\x92\x5e\xb3\x4a\xd0\x72\xb3\x11\x24\xce\x1c\xcf\x26\x15\xf1\xac\xce\x97\xc4\x13\xcc\x5e\x5c\x28\xc8\x37\x1b\xd0\xfc\x56\x6f\x49\x15\x81\xa8\x49\x69\x6b\x2f\x88\x6f\xd6\xd9\x16\x29\x88\xf5\xe9\xd5\x71\x3d\x18\x45\xe0\x67\xde\x75\x47\xa8\x86\xfd\xca\xf8\x24\xc4\x05\x71\xc4\xc6\x9d\x27\xdb\xb6\x6f\xd2\x5a\x19\xf1\x38\x93\x1b\x4f\xd2\xf4\xca\xb7\x0e\x4b\xe7\x49\x75\xcb\x94\xe2\x6b\x9c\x17\x0b\x7a\xae\x5e\x1e\x33\x52\xd1\x40\x9d\xe6\x4f\x5e\x1e\xbd\x79\x71\x7c\x7a\x7e\x71\xfa\xf2\xc9\xf1\xd4\x0c\xe4\x6d\xab\xbf\x9c\x0c\x14\x7d\xfa\xfa\xf0\xc7\x5e\x9d\x6b\xa7\x8e\x51\x5c\xb1\x59\xcf\xda\xac\xc6\xb5\x5b\x6b\x91\xdc\x1c\x53\xf2\x94\x38\xa7\x37\x2b\xde\xd2\x4b\x44\xf1\x08\x74\x48\x69\x57\x5e\x00\x60\x9c\xf1\x22\xa7\xea\x40\x83\x8e\x01\x47\x5f\xb0\xc0\xf0\x68\x3f\x79\x84\x3e\x8c\x63\xc6\xe9\xcd\x7e\xe3\x86\x27\xd8\xd5\x4d\xb3\xad\x13\x8a\x5d\xb2\x98\x40\xe1\x88\x4e\xa8\x9c\x28\xf5\x5e\x2b\xbc\x17\x2c\xe2\xd8\x54\x30\x3c\x9a\x24\x9a\xc5\xe8\xb0\x73\xcd\x88\x93\x6d\x19\x83\x16\x43\xd6\x57\x8d\xb1\xe5\x41\x5d\x9b\x97\xee\x58\xa2\xc8\x73\x39\xd4\xcd\x76\x15\x44\x78\x8d\xb6\x67\xfb\x44\xfc\x90\x7b\x6e\x35\x77\x14\x7b\x74\x93\x8f\x69\x6f\x50\xd7\x8a\xd1\xaa\x27\x81\x72\x78\x94\x7b\xbb\x67\xa6\x5b\x34\xd6\x77\xec\x8c\xbe\x52\x16\x92\x27\x0e\x3f\x25\x37\xfd\xe6\x06\x0a\xcb\xae\x07\xcb\x1a\x5d\xfd\xff\x66\x37\xc6\xde\x95\x01\x3c\xec\xb7\x52\x5b\xcf\x2e\x3b\xae\x0b\x5d\x1c\x72\xf3\x30\x37\x0f\xb3\x3b\x1e\x84\xb6\x67\x0d\x59\x8a\x91\x5d\x08\x37\x73\xa5\x8b\x44\x3d\xe7\xc2\x29\xf5\x6c\xd5\x10\xa9\xcd\x4b\xfb\x8e\x2b\x4e\xd6\xcf\x6c\x05\xb4\x5d\x80\xdd\x3c\xec\x5b\xae\x3e\x0a\x66\xe0\x03\x2d\x20\x2a\x3d\x31\x2b\x9c\x66\xdd\x02\xa2\xdd\x2d\xee\xe6\x1d\x24\x70\x7d\xd5\x78\xad\x53\xd8\xd1\xb1\xb9\x72\x5e\x8d\x1f\xb5\x67\xad\x3f\xcb\x1c\x0f\x80\xc2\x6e\x56\x45\xa9\x2e\x09\xc9\xce\xdc\x61\x8b\x15\x82\x73\x9f\xa8\x6d\x36\xa3\x7d\x88\x76\xd2\x4d\xc9\x3c\x3d\x92\xd6\x90\xba\x06\x70\x18\x09\x1a\xfa\x87\xb2\xa1\x61\x79\x93\x86\x1e\x18\x39\x2a\x76\xa1\x58\xb5\xeb\xb9\x64\xb9\x0b\xff\xd0\x02\x3f\x79\xf9\xe2\x15\x29\x2b\x5a\xba\x3a\xa4\x32\xe1\x69\x59\xdc\x18\x2b\x90\xd5\x83\xf7\xf1\x9d\xd7\xab\x90\xe5\x39\x2d\x65\x9e\xbc\xec\x6c\x21\x5f\xda\x91\x86\x2d\x58\xf7\x6c\x33\xfd\x7c\xcc\xeb\x1a\xad\x1f\x0b\x56\x57\x5a\xd0\xb2\x28\x0f\x01\xd4\x96\xac\x6b\xf4\xac\xff\x32\xde\x3f\x27\xde\x0e\xad\x64\xaf\xd4\xf5\x0e\xac\xea\x97\x3e\x74\x37\x9e\xba\x3d\xd8\xfd\xb7\xed\x72\x27\x0c\xf7\x12\x42\x44\x1e\x51\x28\x69\xfc\x4e\x64\xc6\x9e\xdc\x41\xa1\x2e\xdb\xe3\x2b\xd3\x49\x66\x74\xa8\x12\x81\x68\x62\xcd\xe7\x5a\xae\x68\x34\x81\xb0\x29\xde\xe3\x14\x37\x1b\xed\x55\xc0\x16\x68\x39\x96\x5d\x75\xa8\xda\x83\xec\x0a\x98\x59\x39\x6a\x07\xcc\x6e\x56\x1a\x58\x7d\xbb\xd2\xf0\x4b\xfc\xb1\xb3\xef\xcd\xd4\x7b\x3c\x9a\xa0\x17\x0f\x5e\x98\x5f\xf8\xf7\x65\xdb\xc0\xbd\xbd\xee\xe6\x45\x4e\x93\x3a\x34\xde\xa6\x9a\xd6\xe4\x95\x35\x79\xee\xdf\x57\x5f\xa0\xe7\x7a\x90\xa6\x13\x7d\x69\x75\x1d\x83\x59\x14\xd7\xb0\x80\xc1\x0d\xa6\x09\xd0\x47\x3c\xda\xb9\x50\x3d\x11\x84\xb3\x2b\x13\x1e\xbf\xf7\x4e\x48\x89\x64\x0d\x32\x44\x91\xbe\xd8\x55\x2b\x92\xd1\x37\xaf\x4f\x30\x6e\x47\x65\x7f\x58\xa0\xdc\x72\xf0\xbe\x69\x02\x1f\x6d\xe5\x99\x9b\x07\x6a\xa1\x9e\xf9\x5c\x2e\xb5\x32\xb6\xac\xb6\x15\xe3\xd3\xf0\x23\x74\xc9\xb3\x33\x59\x9a\x8b\x65\x57\xb2\x46\x9f\xfb\x74\x9d\x10\x7e\x24\xf6\x10\xaf\xd1\x7b\xe5\x3c\xf0\x52\x62\xec\x1d\x20\x8e\x9f\x8f\xf7\x78\xb4\x5f\xf3\xf8\xb2\x28\x44\x25\x4a\xb2\x6a\x01\x81\x46\x3a\x70\x85\xef\x0b\xe5\x3d\x76\x9a\x86\x95\xda\xb0\xe1\x1c\x09\xb9\xd2\xd3\x34\x54\x02\xbb\x70\x8e\xb2\x82\x4f\xd3\x30\x2b\xf8\x75\x59\xac\x57\x21\x6a\x32\x44\x29\x4b\x5d\x16\x8b\x3b\x37\x71\x29\x13\x4b\x99\xd2\xcd\x59\x6c\xc9\xe9\x1a\xc2\x0f\x8b\x93\x88\x4b\x87\xb7\x99\x3d\x1e\x5b\x3b\x22\x8f\xfc\x36\x36\xa7\x57\x29\xf8\xee\x00\xa4\x64\xef\xcf\x79\xfa\x3f\xbf\xfb\x6d\xf2\x8f\xdf\x3e\x7d\x3f\xf9\x4d\xfc\x56\xfe\x96\xff\x76\x35\x1f\xc3\xef\x58\x4c\x3f\xd1\x0c\x10\xb8\xd9\xa4\x61\x88\xc2\x70\x0e\xd3\xfd\x79\x2c\x8a\xe7\xc5\x2d\x2d\x8f\x48\x45\x01\xd4\x6e\x9f\x9d\x67\x88\x9e\x0b\x38\x82\xc3\x83\x70\x2c\x52\x3a\x1f\x87\xff\x50\x06\x73\x07\xdf\xb5\xdf\x0a\x61\x8e\x62\x39\x07\xce\x81\x40\x90\xbb\x52\x47\xc6\x5b\x5a\x9f\x92\x24\xb0\x68\x19\x82\x16\xb1\x86\x0b\x6b\x0f\x60\x58\x77\x86\x34\xcc\x83\xf0\x92\x98\x13\xdb\x81\x7a\xf9\x1e\x44\x64\xaf\x4b\xb7\x04\x1c\x30\x9b\x70\x5d\x03\x48\x6c\xdc\x2a\x47\x2e\xd6\x62\xf7\xaa\x86\x07\x96\x46\xfd\x23\x1c\xfb\xe7\xa8\x9c\xd9\x36\xb3\x7f\xea\xaa\xc3\xc6\x97\x87\x43\xcf\x31\xf7\x53\xc2\x38\x5d\x04\xa2\x50\xde\xe8\xc5\x92\x06\xdf\x36\xf0\x7c\x1b\x58\xf3\xf1\xa0\xc8\x83\x6f\x0d\x89\xf8\x76\x1a\x28\xdf\xfb\x54\x7f\x06\x4b\x52\x05\x79\x11\xe8\x0e\x02\x79\xd5\xb0\xee\xb9\x7b\x6b\xcc\x91\xe1\x38\x3d\x25\xc6\xed\x94\xc5\x34\x30\xb0\x12\x1c\xf5\xf2\x60\xb2\x74\x56\xa9\x1d\x2f\xb2\x8f\x22\x03\x4b\x94\x5c\x02\xcf\x89\xe3\x9d\xff\xe9\x60\x24\xf6\x6c\xf4\x2d\xea\x1b\x6d\x75\x20\x30\x01\x02\x39\x67\x91\xb5\x0d\x4f\xd8\x41\x19\x45\x80\x62\x91\xb2\x39\x4c\xd8\x78\x0c\x79\xfc\x1e\x50\x58\xa3\x86\x04\xf7\x75\xd9\x9f\xbc\x7c\x61\x8e\xa7\xe7\x05\x59\xd0\x45\xe8\xca\x70\xdc\x6d\x62\xdb\x80\x35\xdc\x7e\x0b\xb0\x01\x26\x7a\xe6\x9d\x99\xf1\x34\xa7\x29\x69\xe3\x6c\xce\x5a\x70\x37\xa3\xc1\x58\xee\x0f\x7b\xe1\x8c\x22\x39\x02\x75\x7b\x42\x8f\x60\x3e\xfb\xdd\x2e\x76\x76\x1b\x78\x04\x5b\xf5\x32\xbc\x73\x1e\xe4\x55\x3f\x9b\x46\xae\xe2\x8a\x0a\xff\x86\xe8\x02\x33\x8c\x45\x83\x7a\xb2\x67\xf8\xbb\x34\xfa\x6d\x3d\x99\x1c\x4e\xc2\xf9\x77\xd7\xe8\xa6\xfd\x3e\xf8\x87\x4c\xf0\x1d\x73\x58\xb9\x9a\x16\xa7\x85\x51\x68\xe4\x5d\x61\x44\x6e\x56\x49\xa8\x24\x67\xe1\x41\x9b\xca\x85\x4d\xfc\x47\x9b\x78\x6d\x13\xbf\x0d\xbf\x6d\x12\xff\x58\x17\x4d\xd9\xdf\x3e\x91\x49\x5b\x3c\xbf\xac\x56\x49\x58\xd7\xe8\x16\x83\x17\xc3\xae\x3f\xf1\x7d\x6d\x5e\xa3\x1a\xc7\x4e\x42\x52\xcb\x94\xa7\x62\x3e\xc7\xa3\xc6\x0d\x3a\xa9\x21\x08\x49\x49\x49\x70\x49\x2a\x1a\x5c\x96\x41\x56\xf0\x20\x2b\x6e\x6e\x48\xbe\x08\xe8\xcd\x25\x5d\x04\xcb\x32\x60\x37\xd7\x01\xcb\x57\x6b\x11\x7c\xa0\x77\xd7\x34\x0f\x38\xcb\x3f\x04\x37\x54\x10\x49\x3d\xc8\x4d\x50\x15\xeb\x32\xa3\x81\x28\x49\xf6\x21\xb8\xbd\x2c\x5d\x73\x72\x88\x3e\xe1\x17\x86\x89\x0b\xf4\x05\x21\xf8\x74\xb3\x0a\xd8\x55\x49\x6e\x68\x90\x17\xba\x9b\xbc\x50\xdf\x55\xb0\xe2\x84\xe5\x92\xd1\x0b\xf2\x42\x17\xf7\x5b\x3b\xee\xdc\x37\x3d\x74\xe7\x2e\xba\x6b\x16\xd8\x30\x0e\x2d\xb7\x83\x28\x0e\x43\xc4\x30\x99\x11\xc0\xe1\x74\x2d\x6f\x31\xd6\xcf\x17\x2a\xf1\x04\x65\x8d\x1b\xaf\xa4\x3c\xc8\xa2\x08\x08\xcc\xd2\x72\x0e\xb5\x1b\x73\xe3\xd5\x3b\xc7\x02\x15\x98\xa3\x0a\x13\x2b\x5e\xcd\x07\xc5\xab\xc7\xcf\x8f\x5b\x49\xa9\x05\x62\x89\xf3\x16\x52\xb4\x50\xc7\xee\x12\xad\x70\xee\x08\xfd\xd1\x33\x3c\x49\x0a\xbc\x4a\x9f\xcd\x93\x67\xe3\x31\x5c\x8c\x71\x18\x84\xe3\x42\xb1\x7a\xe3\x6f\x71\xf8\xed\xb8\xd0\xe2\x7e\x7b\xb5\x04\x67\xe8\x02\x8e\xbf\x0d\xbf\x4d\x64\xd9\x7f\x84\x28\xc7\xb7\xe9\x72\x3e\x5b\x4c\x17\xe3\x63\x90\xa3\x0a\xea\x03\x7d\xa9\x4e\x73\x1b\x52\xa1\x05\xf5\xfc\xf8\x17\x03\x67\x8e\xf3\x78\x41\x04\x41\x39\x2e\xa2\xe8\x53\x5a\xb4\xd0\xce\x67\xf9\x34\x6f\x7a\xbc\x41\x17\x70\xa0\xa5\xa3\x97\x2f\xda\x41\xe7\x38\xfc\xed\xd3\xdf\xb3\xd1\xde\x5e\x38\xd6\xcd\x8e\xc3\xbd\xbd\xdf\x3e\xfd\x9d\xb6\x40\x58\x79\xb1\x3e\xe3\xac\xd4\xdc\xb8\xa3\xa4\xea\xc8\xcb\x21\x72\x1c\xb4\x36\x37\x0c\xba\x08\x61\x5d\xd3\x31\xce\xad\xc7\x59\x6d\xbb\x27\x36\x9b\x43\x49\x74\x3f\x92\x41\x2f\x1e\xa5\x3d\x8f\x46\xfb\xd0\x73\x3f\xf8\x5e\xbb\x3f\x8a\xdf\x03\x01\x11\x89\x22\x60\x79\x88\x86\x81\xb0\x55\x9b\x04\x79\xb9\x42\xa7\x4e\x89\x16\xed\x20\x12\x9a\x63\x3d\x75\x0e\x22\x44\xd5\x01\xdf\xbf\x70\x46\xd1\x44\xe9\xe1\x63\x02\xe8\xd0\xa9\xd4\x7a\xe6\x45\x25\xca\xf0\x04\xe5\xbb\x8e\xb0\xec\x20\x57\x8e\xe7\x4a\x15\x33\x03\x31\x2c\xe4\x1f\xf5\x44\xf1\x5e\x1f\x06\x25\x44\xe6\xec\x65\xee\xc1\x7b\xa2\xd3\x4a\x65\x34\xcb\x60\x8d\x4e\xb6\xca\x58\x7a\x97\x17\x16\x45\x54\xcf\xe0\x4e\x09\xb9\xbe\xe8\x40\x77\xe2\x1f\xc9\x5b\xe8\xe5\x3b\x77\x58\x06\xaf\xa2\xe2\x19\x94\x27\x28\x2d\x59\xd7\x7c\x8b\xdd\x98\x18\xe3\xde\xa6\x8c\x22\x8f\x84\xa8\xf2\x0e\x15\xd1\xf5\xbd\x5b\xd8\xa3\x2e\x61\x33\xf7\xb2\x33\x2d\xbd\xe3\xa9\xa1\xbf\x51\x74\x6a\x9f\xdb\x91\xa8\xd1\xf9\x6e\x69\xd4\x00\x0a\x61\xba\xd9\x8c\xf6\x91\x3f\x82\x16\x7c\xe8\x5d\xbc\xac\x89\x1d\xf3\x64\x73\x2a\x59\xb6\x05\xef\x4f\x01\x53\xa2\x49\x4c\x00\x43\xe6\x9d\x75\x9a\x17\x02\xa4\x12\x92\x39\x44\xe6\xe9\x55\x5d\x90\x43\xc9\x0d\x30\xfd\x7e\xfa\xdd\xef\xe4\x23\x31\xd4\x7a\xee\x97\x92\xa4\xdc\xcb\xfe\xd6\x71\x98\x88\x0a\x49\xe3\x5a\xa6\xbe\x90\x14\xb6\xc4\x22\x2d\xe6\x08\x50\x6c\x84\xa6\x76\x9a\x51\x68\xda\x80\xd0\x13\x05\x94\xee\x57\xd3\x78\x85\x16\xb8\x74\xe9\xe9\x0a\x4f\x92\xd5\xc1\xc2\xf6\xb5\x1a\x8f\x61\x85\x17\xe9\x6a\x8e\x94\x79\x59\x63\xdc\x01\xf4\x7a\xa3\xca\x46\x3d\x31\x7b\xa4\x74\xf7\x08\x45\x25\xb4\x5e\xe4\x03\x56\xd7\xa2\x35\xf6\x1d\x78\xc5\xc2\x2a\xb8\x16\xaa\xfc\xa8\x25\x3f\x9d\xbd\x3c\xed\x1b\x91\xd8\x17\xf0\x15\x69\x94\x23\x9c\xa7\xd2\x64\x45\xe2\xec\x12\x8f\xc0\xa8\x2f\x13\x23\x42\x90\x6c\x29\x4b\x17\xb7\x9b\xcd\xa8\xb3\x67\xaf\xa9\x78\x5d\x14\xfa\x2a\xa1\xcd\x09\x08\x7a\xf6\xb0\x7f\x89\x5d\xfa\xd9\x12\x98\x27\x78\x34\x02\xcf\x48\x14\x3d\x53\xb7\xf4\x86\xc5\x52\x09\xca\xb0\x75\x45\xe2\x1f\x08\x5e\x11\xfd\xc4\xb9\xd9\x8c\xd4\x10\x64\xf2\x4f\x32\xd5\x3c\xe4\x2a\x3c\x5e\x91\x78\xa9\x8a\xae\x4a\x7a\x45\xcb\x57\xb4\xbc\x2a\xca\x1b\x49\x44\x64\xd6\x13\x82\xc3\x22\xdf\x5b\x50\xc9\x9e\x48\x4c\x97\x4d\xa8\xa1\xbc\x55\x95\x3c\x72\x7a\xe2\x89\xa0\xda\xc7\xdf\x6b\xd2\x72\x94\x03\xbb\xed\xa6\xb2\x2f\xb2\x92\x15\x56\xde\x30\x66\xe1\x40\x62\x38\x0d\x69\x2f\xcd\x09\x13\x41\x3c\xf7\x5b\xea\x91\xd8\xd5\x81\x72\x5f\x05\x9d\xe8\x0a\xde\x5b\xb2\x4b\x40\xf5\xa2\xca\xf5\x73\x82\x13\xf8\x7d\x38\xdd\xf0\xb8\x2c\x0a\x01\xa3\x68\xc5\x00\x87\xf5\x9a\xe0\xbd\xfd\x83\x34\xcc\x95\xa6\x47\x88\x8c\xc8\xa4\x28\x8f\xf3\x6b\x96\xd3\x70\x1e\xb3\x7c\x41\x3f\xbd\xbc\x02\x6f\x09\x9c\xbd\x25\x36\x1e\xc2\x8a\xc4\xb7\x97\x78\x4d\xe4\x8f\xd7\x04\x0f\xbc\x93\x1a\x2d\x87\xd0\x3c\xa8\x86\x1a\xb1\x5e\x90\x01\x3b\xb3\xe7\x04\xbf\x20\xd6\x5c\x69\xb3\x69\x7f\xdb\x05\xd3\x69\xc5\x9f\x2f\x86\x92\xbb\x56\x4a\x2a\xb5\x18\x4a\x1c\x34\x7d\x42\x1f\x7b\xd2\x58\xcf\xe9\xe8\x15\xc1\x13\xa4\xfc\xb7\xb7\x88\x72\xa7\xa6\xf7\xb2\x71\xe1\x81\x3e\x12\x8f\xea\x5c\x91\xf1\xb8\x7e\x8c\xa3\xd2\xa4\x75\x85\xad\x25\x5e\xc6\x30\x1c\x40\xe0\x3a\xb7\x55\x9c\xcf\x40\x1f\x88\xd7\x8e\xef\xd2\x8f\x64\xc8\x79\xa9\xbe\xbc\xb8\x63\x2c\x72\x41\x58\xde\x0d\x20\xd3\x55\x72\xb8\xd0\x28\x71\x61\x8b\x03\x02\xeb\xe9\x70\x15\x79\x99\xdc\x6c\x78\xf7\xcc\x93\xc8\xd6\x3d\x06\x77\x34\xde\x4e\xef\x0d\x71\xbc\xe2\x93\xc4\x78\x2b\xc4\x36\xd8\xd1\x68\x92\x10\x4c\x9a\xa6\x1c\xb5\x40\x93\xbf\xef\x38\x0e\x27\xfe\xf5\xc7\x09\x2a\x36\x39\xc0\x24\x21\x7b\x7b\x6e\xf4\x33\x44\xb5\xc1\x70\x4b\xf0\x43\xa6\x4c\x8b\xba\xa9\xf2\x14\x08\x61\x42\xa3\x28\xd4\x0d\x86\x23\x8c\x69\x14\xb1\xea\x94\x9c\x02\xaa\xfc\xd0\xa5\x74\x8e\x85\x13\x45\x85\x09\x7a\x33\x28\xfa\x4c\xc9\xbc\x46\xda\xec\x6f\x71\xd2\x2d\xc4\xae\x80\xd3\x05\xb1\x5d\x10\xb9\x97\x53\x32\x87\x4e\x23\xed\x45\x46\x45\xf1\x52\x83\xe9\x69\x07\x8a\x46\x2f\xfd\x0a\x00\xd0\xa8\x08\xc2\xc1\x61\xd3\xc1\x61\x43\x8c\x1b\xfe\x8c\xba\x7e\xb5\xbc\xe0\x66\xb7\x4e\xe8\xbf\x54\xc3\x26\x6f\x5d\x1d\x0c\x70\x04\x41\x3c\x19\xc8\x77\x4c\x0e\x60\xb3\xdf\xda\x4b\x6a\xd3\xdb\xa7\xdd\xbd\x6d\xef\xe6\x91\xed\x1f\x13\xc7\x4a\x59\x78\xc7\x19\x1e\x4d\x90\x0d\x03\xe8\xc6\x04\x34\x0a\x1c\xe5\xdd\x56\x39\xa1\x72\x9f\xdc\x6c\x73\xc7\x1f\xfc\x29\x69\x63\x09\x35\x8c\x7d\xc0\xf2\x40\xe0\xd6\x35\xd5\x2c\x0c\xa7\x02\x11\x48\xa3\x68\x72\x80\x69\x43\xa9\x19\xdc\x6c\x14\xb8\x62\xcc\x10\x49\xd9\xdc\x09\x0f\x70\xe2\x6c\x2d\x85\x29\xb2\x51\x02\xd5\x1f\x1e\x45\xba\x9a\xf1\x4e\xd9\x54\x3a\x77\xe6\xf6\xbe\xf1\xd6\xf5\x80\xdf\xaa\x01\x3f\x98\x4a\xd7\xf5\x61\xa7\x55\x4a\xf4\xe5\x4c\xfd\xcb\x2e\xcc\x88\x0e\xb7\xa2\x3b\x27\x10\x31\x3c\x49\x58\x1b\x63\x4c\x89\xe8\x52\x81\x69\xca\xe6\x73\x2c\xa1\x68\x1b\x7f\xb5\xf5\x5c\x95\x14\x65\xc6\xa7\xdb\xcf\x86\xb1\x1b\x77\xe1\x47\xf2\x97\xb5\x7e\xf7\xb5\x50\xce\x73\xdf\xfd\x8a\x00\x92\x4e\xe6\x30\xe9\xb9\x37\xd9\xf1\x6a\xf3\x28\xe5\x60\xff\x69\xf0\x15\x01\x96\x10\xb4\x77\xde\x76\x74\x4f\x5a\x0c\x50\xbd\x10\xec\x38\x98\xdc\x9f\x92\x64\x72\xa0\x69\xa9\xdc\x5a\x25\x5d\xac\x33\x3a\x1c\x14\x43\x5b\x5a\xb3\x4a\xfd\x05\x04\xce\xb8\xda\x73\x46\x7c\xc8\x51\x21\xa1\x9e\x72\x1b\xef\x04\xf1\x1a\xa5\x73\x47\xe9\x49\x82\xf0\x81\xa0\xdf\xfd\xf3\xf8\xa9\x02\xef\x03\xd9\x6c\xc0\x07\x15\x1d\xe5\x8e\x80\x3f\x09\x84\xe8\xf7\xd6\xcb\x56\x53\xf8\x4f\xc9\xe5\xc9\x62\xfb\x49\xeb\x2b\x7c\x34\xfa\xbd\x39\x89\xdb\x5f\xf0\x77\xe7\x3c\x6e\x81\x68\x9a\x7a\x4d\x40\x13\x15\xcc\x06\x7e\x21\x8b\x05\xd5\xaf\xa1\xd8\xc6\xf2\xd5\x8a\x01\x9d\xc4\x3f\x74\x40\xa2\x33\x2a\xea\x3f\x49\xcc\x59\x25\xf0\xef\x04\xbd\x76\xaf\x01\x57\x7c\x5d\x2d\x3b\xef\xcc\xba\x37\xa7\xd7\xc4\xd1\xfa\x10\xe4\x03\x7d\x4d\xb3\xa2\x5c\x54\x00\x26\xbc\x89\xfa\x61\x3a\xec\x6f\xca\x36\x62\x44\xed\x77\xed\xb4\x34\x04\x40\x3b\xc8\xe6\xc9\xb7\x37\x52\x8b\xc9\xe6\x59\x3c\xbd\x6f\x2b\x4d\x3b\x8d\x20\xb7\xde\xb4\xd7\x52\x3d\xf7\xc4\x30\x8f\x98\x61\x5e\x5b\x05\x47\x7d\x61\xfa\x81\x74\xa4\xb7\x6f\x48\x47\x7c\xdb\x22\xd3\x3b\xf2\x9f\x2d\xbf\x6d\x8d\x1b\xc8\x97\x0a\x6f\x95\xfa\x3d\xc1\x7f\x90\xff\x00\x21\xee\x4f\xba\x9f\xaf\x25\xc6\x6d\x57\xe2\x9f\xe4\x0b\xe5\xb8\x38\x0c\x11\xb5\x52\x5c\x57\xfd\xd5\x3c\xee\xd0\xd6\xc5\xa5\x55\xab\x56\x6f\x3a\x99\x3a\x22\xf4\x9b\x4e\x2b\xcd\xcd\xfe\x8a\x34\xd7\x48\x70\x41\xe1\x8a\x75\x61\x57\x9e\xbb\xc6\x93\x64\x89\x57\xe9\x7a\x9e\xac\x5b\x79\xee\xd2\x91\xe7\x2e\x3b\xf2\xdc\x1f\x08\x7a\x47\x3a\x12\xdd\x6f\x48\x5a\x68\x91\xee\x3f\x89\x23\xd3\x2d\x3e\x53\xa6\xfb\x13\xd9\x2e\xd4\x7d\xa3\xba\xfd\xaf\x20\xd6\x15\x8e\x58\x57\x28\x7c\xff\x45\xdd\xf4\x9f\xa0\x5f\x09\xbe\xf7\xee\xfb\x03\xf1\xe8\x34\x25\xe9\xf0\x9a\xbe\x31\x01\x87\x35\xea\x4a\x61\xbf\xa8\xa5\x43\x1d\xaa\xad\x46\x3f\x2b\xf6\xa9\x55\x19\x16\xb2\x95\x9f\x7d\x77\xb1\x8e\x9a\x5c\x1a\x76\x5a\x0d\xc7\x7c\xee\x50\x07\x22\x06\x78\x39\xc3\x39\xf6\xaa\x42\x44\x20\x57\xc1\x6b\x9a\xfa\x42\x58\x2f\x6a\xce\x61\x9e\xce\xa7\xc4\xd9\x48\x8a\x83\x71\x89\x8d\x71\x7f\x24\x19\x18\xc4\x1e\xc1\xcc\x51\x98\xb0\x28\x02\x5b\x5f\xca\x7b\x43\x54\xce\xe5\x8d\xc5\xec\xec\x57\x92\xd2\xf9\x66\x03\xd4\x5f\x6b\x47\x0b\xa7\x5c\x00\x6a\x7d\x18\xd2\x1e\x67\x74\x5e\x52\xfa\x8e\xf0\x0f\xb4\x6c\xc5\x83\x12\x47\x9f\x2a\x57\xaa\xf1\xd9\xb3\x97\xef\x2e\x0e\x9f\x3f\x57\xfa\xa3\x68\xb4\x0f\x11\xfb\xa2\x26\xcc\x7e\x6f\x9b\x29\xc5\x67\x69\x39\xb1\x9c\x96\x22\x74\xc8\x5d\x26\x3c\x6a\x9f\x90\x9d\xb7\x25\xd8\xcb\x74\xf4\x0f\xe5\x7d\x5a\x11\x2f\x81\xd3\xb0\xa7\xcd\x14\xa2\x90\x93\x5e\x52\xd6\xb8\x27\xd0\x3f\x6d\x76\xb1\xce\x45\x38\x47\x85\x6c\xca\xc3\xeb\x10\x85\x5d\x3c\x0f\x5b\x77\x2d\xad\xd3\x8d\x9e\xff\x83\xb9\x76\x6c\x23\xf0\x39\x01\xda\xa1\x5c\x43\xa0\xc1\xf0\xb6\x72\x74\xfe\x94\x9b\xb9\x76\x1e\xb6\x54\x70\x44\x68\xaa\x42\xa3\x0a\xb2\xa5\x7c\x93\xaf\x8b\xf7\x26\x60\x17\x5c\x6e\x39\xa7\x7a\x49\xbb\x9a\x8b\x5e\xad\x92\xe6\xce\x58\xdc\xb5\xd8\x35\x24\xb7\x5c\x3b\xb2\x47\xd4\xee\x16\xd3\x95\xab\x46\x76\xb8\xa5\x5a\x5b\xa0\xae\x21\x5a\xb6\x4b\xe6\x88\xa2\xb6\x54\x75\x4a\xa8\x77\x79\xaf\x8a\xd5\x1e\x1d\x28\x8c\xb9\x86\xad\x79\xf5\xdf\xd2\xbe\xaf\x98\xea\x14\xef\xb6\xed\x69\xa8\x42\xb4\x68\x07\xa1\x45\x47\x56\x27\x6f\xb8\x1b\xaf\x8c\x86\xac\x95\x38\xed\xac\xa3\xdd\x39\xc8\x0a\x8e\x90\x61\x4b\x0d\xd7\xb3\x82\xee\xa3\xa4\x1f\x59\xb1\xae\x76\x57\xeb\x94\x6a\x7b\x33\xf0\x3e\xdc\xa9\x5f\xd0\xef\xfb\x51\x8d\x0c\x17\x36\xfb\x80\x93\xaa\x92\x4c\xc4\xb6\x8d\x60\xf3\xf5\x12\xb6\xc5\xbb\x4b\xd8\xe4\xa8\x25\x74\x9c\x4c\xf9\x24\x53\x47\x53\x72\xe4\x79\x89\xe8\x46\x5f\x18\xed\xc3\xba\x5e\x09\x50\x09\x88\x56\x02\x2c\xf5\x9f\x85\x75\xa3\x24\x14\x0b\xb1\xd9\x8c\x26\xe6\x0d\x01\x3d\x13\x78\xed\x38\xe5\x83\xf7\xf5\xb4\x67\xee\x87\x95\x9d\x58\x42\xe2\x73\x79\x05\x95\x7f\xe4\x25\x54\xc9\x5a\x16\x02\xc2\x1a\xbd\xfd\x9c\x46\xce\x74\x23\x67\x6d\x23\x12\xd8\x2d\xe6\x62\x83\xc9\xf1\xca\x18\x8b\xbd\x2b\xc9\xea\xa9\xbc\x45\x1e\x11\xce\x2f\x49\xf6\x21\x8a\x46\x72\x54\x9b\x8d\x6a\x77\xa9\x80\xbb\x16\x38\xbc\xb8\x50\x6e\x84\x65\xf9\x15\x2d\xab\x70\xfc\x84\x08\x1a\xe7\xc5\x2d\x80\xe8\x70\xc0\xc8\xe0\xa1\x83\xbf\xe3\x77\x14\x85\xca\x12\xb3\x92\xac\x5b\xeb\xdb\x7e\x50\x0d\xb4\x51\xb9\x20\xd0\x84\x1f\x07\x10\x1d\x89\xad\x5e\x4a\x5d\x17\xa5\xdb\xbd\x93\xa2\xd1\x7e\xeb\x67\xde\xcc\x59\x5f\x49\x4b\xd0\x4a\x84\xda\xbb\xa0\x29\x33\xe8\x0e\xd4\x29\x46\x6a\xe0\xa0\xe3\x7b\x61\x14\xf4\x8c\xd9\xfc\xe7\x78\xeb\x6c\x9c\x75\x2a\x57\xab\x3a\x22\xab\xef\xac\x53\xb4\xce\x3a\x35\x13\xc6\xe3\x37\x36\x58\xf5\x2b\x32\xa5\xa8\xe3\xbb\x53\xa0\x53\x32\x3d\x12\x33\x3e\x25\x9a\x55\x7a\x21\xf0\xfd\x25\x5f\x97\xd3\xd1\x04\x5d\x15\xd9\xba\x6a\x7e\xb0\xbc\xf9\x59\xac\x85\xfc\xad\x5c\x9e\xca\x1f\x8b\x4b\xde\xfc\xbe\x29\xd6\x15\x5d\x14\xb7\x79\xf3\x21\xd9\xf1\xb2\xf9\xe2\x94\x7c\xa4\xcd\x97\x9c\xb9\xe6\xc3\x34\xab\x7f\x7f\x74\xea\xac\x57\xca\x98\x7e\x49\x29\x97\x3f\xb4\x93\x0e\x75\x1b\x95\x9f\xcd\x8f\x0f\xf4\xce\x76\xfc\x81\xde\xe9\x4a\x1a\xa7\x94\xb5\x72\x25\x48\x29\x3a\x69\xeb\xd5\x82\x08\xda\x49\xa4\xf9\x42\xa6\x88\x62\x9d\x2d\x9b\x4a\xea\xcb\xcd\xb1\xa0\xab\x0f\xed\x0a\x58\x7e\xae\x0a\x79\x71\x2d\x2d\xfc\xe6\xb3\x99\x03\xf3\x6d\xe1\x34\x9f\xb6\x2d\xf3\xa9\x41\x37\x1f\xfd\xa6\xf5\x68\xcd\x57\x33\x9f\xd7\x85\x68\x6a\xe8\x35\x1e\x4d\x10\x2f\xaa\x81\xd4\x45\x49\xae\x9b\x81\xc9\x0f\xfb\xb7\x01\x53\x7e\x34\x2d\xcb\x0f\x3b\x9e\x45\x59\xac\xda\xd2\x6a\x36\x9e\xbc\x7c\x71\x98\x09\xf6\xd1\x4c\xe4\x93\x97\x2f\x9e\x4a\x24\x39\xc9\xdd\xaf\x97\xcd\x12\xad\x4a\x5a\x55\xca\x3e\xed\xb9\xc0\xf7\xb2\xb2\x10\xe5\x8b\x62\xc1\xae\x18\x6d\xda\x73\x3d\x25\x1e\x2d\x49\x7e\xdd\x64\x79\xfe\x04\x3a\xd5\x0c\x6d\xeb\x57\x92\xc7\xec\x89\xd2\xe0\x1f\x4c\x3a\xc9\x45\x61\x99\x6e\x27\xfb\xb5\x96\x18\xf5\x53\x9e\x96\xc5\x4d\xa7\xfc\xd9\xfa\x52\x94\x94\x3a\x00\x39\xb7\xb8\x8f\x62\xb7\x00\xb9\x39\xc3\x9c\x47\x76\x00\xa7\x8e\x14\xf1\x4a\xb8\xda\x47\xe9\x1c\x51\xcc\xcd\x03\x86\x6a\x3c\xa1\x09\x14\x5a\x8e\x49\x21\xa2\x98\x36\x4d\xea\x20\xdf\x74\x71\xc6\x0b\x31\x1b\x4e\x9e\xd2\x9e\x86\xcb\xb0\x41\x62\x14\xd1\x78\x59\x54\xca\xd2\x6a\xb3\xa1\x23\x8c\x39\x9c\xe9\xa4\x29\x1d\xe0\x6c\x1a\x91\x5c\x2a\x9a\x37\xb5\xb9\x63\x86\x10\x45\x06\x66\x4d\x49\x21\x72\xc4\xc9\x97\xa2\xb5\x4e\x3e\x6a\x9e\x92\x78\xc2\xb1\x9a\x8b\xd1\xc4\xd3\xc9\x33\x42\x1b\xf3\xf2\xec\x88\x6c\x88\x2b\xe0\x67\x57\x00\x50\x39\x61\x02\xab\x37\x0f\x38\xc2\x58\xcb\x74\x78\xf3\x32\x42\x21\x2a\x31\x85\x68\x74\x44\x00\x85\x9b\xcd\xde\xfe\x41\x06\x3d\x19\xc2\x9d\x3d\x44\xcc\x71\xb5\x25\x24\x48\x7c\x71\x61\x4b\x44\x11\x38\x14\xb3\x4e\x22\x0e\x0d\x59\x6d\xd4\x86\x24\x9d\xdf\x6c\x42\x4b\x62\x3b\xe9\x87\x42\xab\xa2\x4e\x47\xfb\x23\x93\xc1\xaa\xf3\x72\x5d\x09\xd5\x41\xb7\xf5\x17\x22\x6d\x2a\xcf\xa1\xb6\xd4\x75\xf2\x37\x9b\xd1\x7e\x8d\xec\xd7\x2b\x22\x96\xdb\x6c\xa9\xda\x3a\xb2\xd4\x66\xd3\xed\x49\xa6\xca\x35\x31\xc9\x42\xb9\xb7\xb6\x9a\xf9\xba\x48\xbf\x7b\x59\x49\xf3\x7f\xba\x7c\xdb\xe7\xa5\x69\x29\x5b\x97\x65\xe3\x2d\xdb\x88\x8e\x2f\x1a\x4e\xf2\xc8\xcd\xf5\x3b\x93\x4d\x03\xc5\xb3\x50\x11\x78\x4e\xd2\x7b\x03\xf3\x72\x67\x60\x28\xf5\x68\x70\xec\x5b\x8b\x38\x13\xe1\x95\xd1\x4a\x7e\x5f\x3c\xb6\x1d\x3d\x42\xa8\x39\x20\x54\x89\x62\x25\xb9\x2c\x72\xad\xe4\x09\xee\x72\x76\x83\x4d\x74\x8a\xba\xee\xca\x54\x77\x6b\xed\xac\x5d\x16\x6b\xe2\x0f\x7f\x46\xd3\x43\x75\x86\xfa\x30\x43\x63\x03\xc5\xcf\x44\xb1\x5a\xd1\x85\xf6\x0d\x7f\xa6\x39\xee\x28\xfa\x6c\x8e\x52\x31\xac\xaf\x96\xa4\xa2\xae\x10\xe5\x46\xdf\x08\x5a\x37\x08\x8e\xa5\x2e\xd0\x4f\x2e\x3a\x12\x1f\x74\x37\x94\x50\x31\x2e\x1b\x34\x43\xa4\x6e\xac\xef\x1c\xab\x26\xe4\xbc\x90\x78\x61\x4b\x49\x7d\x26\xb6\x0a\xb9\xee\x84\x07\xeb\x36\x15\xf6\x3e\xf2\x34\x24\x42\xa3\xb0\x9e\x80\xc3\xf3\x8b\xf3\xc3\xd7\x3f\x1e\x9f\x4f\x87\xe4\x8e\x6d\x3f\x75\xc7\x5b\x51\xcf\x50\x62\x8b\x0a\xbe\x84\x76\x6b\xa3\x21\x3a\x13\xc6\x8b\xcd\x85\xc0\xf7\x0d\x0f\x69\x98\x4a\xe7\x54\xbc\x15\x1d\xc7\x19\x7a\x10\x4a\xbd\x49\x98\xad\xc1\xbb\xa8\xaf\x72\xbd\x14\xe7\x7d\x5f\xb8\xef\xef\x4a\xfd\x43\x7b\x29\x2f\xab\x28\x72\xbf\x52\xae\xc9\xe2\x70\x6a\x2a\xe6\xd0\x33\xf5\x48\xac\x21\x47\x14\x81\x91\x82\x5a\x02\x26\xb6\xc0\x03\x95\x7f\xf1\x26\x88\x2b\x1a\xf1\xdd\x38\xae\x9f\x12\x12\x75\xb4\x1c\x6b\x0f\xf5\x26\xf4\x00\x1d\xb0\xfe\xf3\x56\xdf\x45\xea\x53\xd1\xde\x12\x01\xc7\xc7\x62\xe6\x9b\x20\x72\x38\xe5\xb0\x43\x24\x91\x9c\xa4\x1b\xb2\x02\x03\x22\x6b\x73\xfe\xd6\x92\x9b\xe0\x4d\xd8\x8b\xc7\x88\x73\x7b\x30\x6e\x15\xec\xfa\x05\x1f\x72\xa6\x35\xbc\x27\x0a\xeb\xa1\xa0\x34\x21\x77\x8e\x0e\x5f\x9d\xbf\x79\x7d\x72\xfa\xe3\xc5\xab\x67\x87\x67\xc7\x28\x7b\x0c\xc8\x1e\xa1\xd8\x0a\xaf\xb7\x45\xbf\x04\xd8\x52\x02\x2b\xca\xbb\x46\x1c\x91\x37\xaf\xf9\x5a\xdb\x28\x4f\x72\xab\x6d\x54\x60\x92\xe6\xea\xd1\xbf\xc4\x85\xdc\xe7\x69\x3e\xef\x6d\xf0\xe1\x21\xab\x8d\x50\xa0\xd0\xb0\xfc\x21\x44\x3c\x5e\x5b\x1e\xaa\x96\x7d\xe7\x78\x92\xe4\x2d\x73\x94\x5b\xa9\x7d\x85\x81\xee\x17\x9a\x1e\x65\xff\xa0\xda\x6c\x94\xba\x52\x89\xab\x2d\x10\xfc\xf0\xe6\x87\x1f\x9e\xf7\x01\xd0\x68\x63\xfb\x87\xea\x5d\xa7\xae\x4d\x64\xff\xfb\x63\xb1\xd9\x00\x36\x7b\x2c\x7a\x30\x38\x35\x91\x15\xb9\x4f\x04\x51\xb6\xbd\x0d\x77\xc9\x32\xa7\x81\x36\x1d\x3a\xcf\x25\x27\x62\x40\xa7\x46\x29\x8a\x70\x97\x8f\xbc\xd7\xf8\xc6\x53\x36\x47\x19\x2e\x15\xd9\x40\xb9\x32\x0a\xd0\xa1\x08\xb4\x32\x1a\x2e\x15\x5f\x1d\x45\x92\x4c\x67\x51\x24\xb9\xeb\x26\x9e\x3d\x33\xc7\xc7\x9e\xa3\x89\x76\xee\x52\xc4\x3f\x09\x80\x68\xa4\x54\x5a\xfb\x1a\xf1\xa7\xaa\xdd\xd1\x19\x69\xdf\x1e\xd4\xd9\x3a\x03\x2d\x21\xdd\x6c\x9e\x08\xeb\x1a\x10\x29\xf2\x00\x07\x0f\x04\x3f\xf4\x89\xab\x06\xf1\x52\xf4\x03\x5a\x20\x86\xdf\x0b\x20\x24\x97\xcc\x1a\xb1\x43\x86\x99\x12\x3a\xa0\x1c\xb3\xf8\x15\x91\xe3\x67\x98\xc5\xa7\xc4\xde\x59\x8a\x26\xee\x84\x42\x28\x37\xde\x04\x2e\x5a\x09\x88\xfc\x52\xf1\x5c\x1b\x89\x88\xcc\xf5\x82\x4d\xb8\xa2\x91\x36\x9a\x85\x17\x9d\x42\x87\x94\x15\x29\x9f\xc3\x1d\xef\x6f\x3d\xd1\x8e\x1c\x2a\x33\x0e\xf5\x71\xae\xd9\x32\xe5\x69\x0f\x93\xf4\x5a\xcc\x55\xab\x7b\xfb\x07\x27\x02\xe4\xa8\x42\x1c\x95\x36\x66\xac\x89\x9a\x22\x0b\xa9\xe8\xf3\xad\x1c\x8a\xa9\x4a\x72\xe9\x9b\xde\x87\xa4\x45\x26\x44\x28\xf3\x97\x8e\x41\x54\x8d\x30\x36\x71\x5e\xf2\x07\xc9\x18\x7b\x2c\xe5\xed\x15\xdc\xc6\x6f\x54\x03\xc6\x93\x89\x36\x40\x7a\x04\x30\x8f\xa0\xa9\xec\x6b\xd0\xd4\xd9\x20\x11\x1c\x24\x4c\x75\x0d\x6b\x89\x9b\xdb\xb8\x6d\x89\xd2\x1e\x65\x91\x77\x4f\x50\xc1\x28\x0a\x2b\x5e\x28\x7c\x74\xac\x3b\xe4\xe5\x70\x24\xab\x78\x87\x6a\x73\x93\xac\x94\xef\xb6\x36\x5b\xdd\x25\x77\x95\x96\xf7\xd3\x5b\xb9\xee\x51\xc4\x0c\x7b\x81\x31\x66\x1d\xf6\x82\x39\xb4\x0b\x63\x3c\x34\x4c\x59\x7f\x1b\x23\x0e\x60\x63\x6e\x3f\xd8\x52\x67\x1a\x37\x1b\x66\x0f\x7f\xf9\xb3\x81\xaa\xda\x6c\x3c\x82\xf4\x4e\xdf\xe0\x15\xaa\xca\xab\xad\xbb\xbf\x6d\xa8\x99\x4a\x92\xf0\xce\x66\xf6\x03\xc9\xb0\x46\xf2\x5b\x69\x5d\x59\x90\xcf\xb6\xb0\xcc\x7d\x24\xce\x21\xca\xb1\x76\xf8\x63\xc8\x7c\x77\x35\x97\x3b\x1a\x73\xf1\x70\x09\xd1\xb2\xdb\x92\x73\x60\xa0\x45\x5d\x23\xb5\xdd\xb5\xf4\x42\xf9\x78\x9a\x56\x48\x12\xa3\x29\x6f\x44\xac\x25\x5a\x5f\x4e\xf3\xba\xb9\xfb\x5a\x3e\x13\x77\xbe\x95\x0b\xbb\x4e\x5a\xca\xe7\xdd\x62\x2a\x62\x6b\x13\x7b\x29\x9d\x23\xbd\x2c\xd3\x74\x3e\x54\x3b\x2d\x67\xcd\xf1\x3f\xb5\xe7\xb0\x81\x37\x87\xe8\x42\x07\x80\x7d\x24\x5d\xcc\x75\xb0\x9e\x56\x21\xd2\x65\xb4\x89\x3d\x1d\xd4\xb1\x90\x08\x4c\xbd\x88\x3c\x0c\x53\x73\x22\x50\x4c\xe5\x89\xf0\x20\x61\xde\x46\x21\xa9\xe5\xf3\x98\xa5\xcd\x56\xcc\xa3\xbc\x06\xaa\x05\x53\xcc\x55\xa6\x09\xb6\xa3\x35\x9b\x45\x91\x24\xdd\xa0\xc4\x27\x02\x64\xa8\x54\x82\x79\xb5\x3b\x71\xa6\xf4\x8a\x32\x0a\x4a\xb4\x0f\xd3\xc9\x3c\x5e\x5f\xa2\xac\xd1\x58\x03\x9a\xaa\x9b\x90\x92\xad\x1c\xe3\x11\x00\xb3\xcd\x46\xc2\x8c\x98\xd1\xad\x73\x2f\x23\xfd\xf5\x32\x00\x2a\xde\x7d\x60\x35\xc5\xd0\x6a\x42\x47\x9d\x57\x99\x6d\x98\x91\x10\xb4\x6f\x35\x1f\x7e\x54\x0f\x99\x77\xc2\xb9\x28\x3c\x69\x05\x6b\x9e\x56\x87\xbd\xd1\x4c\x09\x6a\x79\x08\xac\x3f\x3c\x0a\xd4\xbd\xf0\x28\xdb\x1a\x2d\xa8\xf3\x02\xce\xbe\xb2\x77\xdf\x97\x57\x92\xf7\xe8\x5d\x65\x5a\x79\xa1\xc8\x96\x74\xa1\x8a\x87\xd0\xca\x38\xfd\xdb\x0b\x81\x49\x6b\x18\xa0\x55\xcd\x54\x79\x4c\xd0\x29\x01\x02\xfd\x28\x20\x72\xd5\xfd\xdb\x16\xb1\xa8\x5d\x6f\x56\xc3\x85\xf4\x09\xae\xf4\x62\x7e\x14\x5a\x2d\xe2\x83\xc0\x37\x42\x4b\x14\x20\xfa\x5d\x7d\xb8\xc1\x19\xd1\x53\x95\xe4\x04\x29\xd4\xce\x95\xc5\x2e\xb5\xe3\xbe\x0b\x98\x5e\xec\xde\x86\xff\x0b\x35\xf1\xe4\x71\xb5\xbe\xd4\xfe\x78\xc1\x04\x7d\x2f\xef\x63\xaf\x77\xf6\x31\xec\x6a\xe6\x0b\xfa\x69\x31\xe6\x07\x87\x2d\xbd\x1f\xf6\x30\xb2\x24\x46\xb6\x43\xbd\x96\xbe\x97\xcb\x76\xbe\xd9\x00\x11\x9f\xe3\x7b\x49\x0a\xe3\x73\x85\xec\x8e\x46\xa6\xbf\x6f\xa8\x29\xd2\xd9\x69\x3d\xa2\x44\x11\xb1\xad\x61\x52\x77\x59\x03\xe3\x71\x80\x78\xb1\xe9\x03\x22\x8f\x9b\x73\xf5\x5f\xca\xe7\x03\xae\xee\x9a\x11\xbf\x11\xae\x46\xf2\xbd\xda\x66\x53\x8e\x18\x91\x74\x77\x45\xa6\xc4\x29\xfb\xce\xb9\x33\x98\xfb\x82\xb1\x03\x9f\xa0\x1c\x4f\x50\x81\x5f\x10\xb1\x8c\x6f\x58\x0e\xc8\x1e\x43\x74\xaf\x54\xf6\x92\x13\x15\x89\x6c\x82\x71\x09\xf9\x54\x5d\x36\x32\x3c\x49\xb2\x83\x42\x19\xdd\xb2\x2b\xc0\xd3\x6c\x3e\xc2\xca\xea\x16\x36\xba\x74\xb8\xa8\x8d\xa1\x4b\xa3\xb8\x4b\x71\x13\x8e\x1b\xde\xe7\x4d\x46\x6b\xc8\xd8\x46\xeb\x5e\xe2\x49\xb2\x3c\x28\xf6\xb2\x28\xfa\x43\x00\x9e\xee\xed\xe5\x73\x24\xd2\xbd\xbd\x6a\x0e\x13\xb8\x1c\x8f\x93\x1c\x2f\x65\x07\xe5\x18\x67\x88\xee\xe1\x1c\x4d\x30\x06\x64\x0f\xe7\x70\x0f\xb0\x31\xce\xa0\x02\x59\x8e\xa1\xf1\x0e\xaa\x78\x7d\x6c\x74\xcc\x08\x7e\x23\x00\x43\x13\x98\x94\x07\x34\x81\x24\x66\x46\xbb\x5a\xa4\xe5\x78\xdc\x68\x69\xa7\x64\xae\xba\x91\xdc\xad\x49\x51\xf5\xc8\x1e\x83\xda\x30\x83\x62\xba\x07\x32\x5c\xc2\xf1\x3e\xca\x31\xd9\x03\x05\x66\xf2\x37\xd1\x81\xb8\x00\x85\xa8\xc2\x93\xa4\x3a\xa0\x49\xa5\xf4\x5b\xab\xb9\xc9\xc9\x21\x92\x5f\xe9\x64\x8e\x2b\xd5\x94\x2e\x97\x9b\x72\x93\xb9\x2c\x6a\x73\xf6\x9b\x16\xe4\xf7\x12\xef\x27\xcb\x83\x3c\x59\xda\x15\x28\xc6\xe6\xc5\x42\xa4\xd9\xb8\xda\xdb\x9f\xab\x8e\xd2\xe5\x1c\x93\x54\x7e\xa6\x32\x5b\xbf\xc3\x6a\xc6\xc7\x26\xcf\xc7\xfb\x68\x85\x75\xe1\xbd\xfd\xf9\x78\x3f\xb1\x15\x17\x07\xab\xd9\x62\xba\x52\xb7\xf0\xc2\xb9\xfd\x23\x79\x6a\x4d\xe6\xed\x37\xc5\x24\x2d\xe6\xca\xe6\x5a\xde\x2a\x26\x07\xc5\x66\x33\x39\xc8\x12\x38\x91\x2c\x15\x30\xfa\xef\xdf\x43\x94\xed\xed\xc1\xe9\x04\xe3\xac\x49\xfc\x3b\x44\x85\x4c\x54\x57\x97\x42\x02\x94\xed\xed\xcf\x11\x58\x60\x50\x35\x29\x73\x78\x00\x96\xa6\x0f\x39\xb2\x59\x75\x90\xcf\xaa\x69\x3e\x5d\x1e\xe4\xb3\xe5\x34\x87\x18\xe7\x33\x90\x63\x4c\x8d\x02\x3e\x98\xa8\x20\xcb\xea\xe7\xbe\xdc\xe9\xb9\xea\x46\xf7\xbf\xc0\xb8\xea\xf4\x8f\x28\xae\xda\x1a\x1a\x50\x44\xf1\x12\xea\x97\x1b\x79\x8a\x7c\xa4\x65\x45\x01\x44\xf6\x20\x42\x05\x4e\xe5\x95\x5a\x6e\x84\x06\x91\xe5\x7e\xb0\xaa\xd6\x12\x6c\xad\x4f\x3b\x99\x92\x28\x02\x45\x63\x05\x40\x9a\xb8\xcf\x6c\x3c\x46\xe5\x78\xac\xb5\x48\xb5\xfa\xe9\xfe\x54\xe9\x4b\x58\xe4\x94\x67\xc5\x8a\x8c\xc7\xaa\xa8\x87\xa3\x73\xd8\xad\xfa\xfd\xf6\xaa\x6e\xb1\xbf\xf7\x8b\xf5\x9a\xad\x5b\x3a\xd4\xc2\x5d\x38\xaa\xdc\xa2\x6f\x33\xa7\xb5\xb4\xb5\x3a\x92\x77\x51\x9f\x9e\x0b\xd4\xa5\x8a\xd3\x97\x02\x0d\x10\xd5\xe9\x2b\x51\x43\xf4\x93\xd0\x1c\x52\xab\x3a\xed\x3c\x88\xfc\x24\x36\x1b\xf0\x93\xf0\x4c\x86\x8f\xce\xce\x1a\xdd\x11\x9b\x10\x9f\x65\xc5\x8a\xe5\xd7\x67\x4b\x76\x23\x9b\xdc\x6c\xd4\xe3\x43\xd3\xe6\x2f\x1d\x89\x81\xec\xc3\xec\xf9\x11\x18\xd1\xcd\x46\xfb\x3a\x57\x66\x6a\x5a\x50\x5a\xd1\x46\xe7\x4c\xe6\x28\xdb\x1e\x65\x80\xdf\xb4\xf9\xab\xf7\xf6\xa9\x5a\x54\x2f\x87\xeb\xbc\xca\x8a\x95\x76\x50\xa7\x44\x95\x4d\x8d\x9f\xfb\x35\xb4\xfb\xbd\xc6\x38\x50\xee\xee\x47\x3e\x7a\x6a\xc2\x26\xf0\x68\x82\x3e\xdb\x5a\x4c\x60\x11\x45\x06\x9a\xd6\x64\xa6\x11\x79\x5b\x00\x46\x03\x7e\x05\x36\x1b\x61\x6f\x2f\x72\xce\xe9\xd3\xa2\xd4\x23\x85\x0a\x2d\x5a\xfd\x16\x6a\xf4\x49\x76\x37\x67\x86\x1e\x86\xc6\x1d\xb0\xb3\x30\x3a\x16\xe8\x60\x57\xd3\xd0\x31\x4a\x26\xb4\xf5\x5f\x0c\xf5\x0e\xde\xed\x18\x81\x00\x0e\x3f\x7f\xce\x1e\x6c\xd5\xac\xb6\x5a\xdc\x26\xde\x74\x23\x06\xa3\x14\x2b\x99\x19\x62\x5b\x2c\xc0\x76\x18\xa7\xb3\xea\xa8\xc8\x73\x9a\x29\xf5\x71\x54\x52\xcc\x68\x14\x31\x65\xe0\xe8\xa8\xe0\xd2\xed\x2a\xb8\xc3\xba\xb7\x1d\xa5\xdb\xa6\xa5\x9c\xb6\x22\x7b\x65\x7b\xad\xe4\x86\x8e\x99\x37\x89\x85\x76\xf2\xbe\xa5\x0f\xe2\x19\xb9\xba\x93\x98\x2b\x96\xd9\xb1\xe9\x06\x92\xbd\xb7\x24\xb2\x05\xa1\x70\x40\xe0\x6a\x57\x58\x51\x87\x6f\x46\x61\xf7\x92\x06\x13\x28\xbc\x16\x31\x51\x7b\x98\x34\x0c\xc6\x4c\xa4\x93\xf9\x54\xb6\x39\x08\x54\x63\xe7\xea\xa0\x6f\x45\x9d\xab\x64\xc7\x0a\xfd\xda\xdc\x52\xa0\x72\x0d\xf8\xc8\xdd\xea\xf8\xa7\x43\x0c\x93\xbe\xe7\xc9\x84\x1e\x30\xe5\xfe\x8d\xbb\x26\x4a\x9a\x1c\x3b\xa5\x53\x3a\x37\x92\x92\x81\x72\x8a\x02\x71\xdf\x94\x49\xd3\x7a\x3f\x5c\x27\x8f\xaf\x95\x23\xf8\x6b\x63\x70\xe6\xf9\xf3\x52\xa6\x5b\x00\xd6\x10\xd6\x4a\xf7\x5f\x09\xd6\x68\x47\xf1\xd4\x68\x90\x1a\xb7\xa1\x1d\x86\xb6\x41\x14\xc0\xb1\x72\xcc\xe2\xb8\x7b\x9b\xf1\x41\x61\x6f\x57\xed\xd4\xd3\x92\x7e\x64\x2f\x8e\xf3\xb5\x2d\xbd\xec\x52\xad\x7e\x64\x27\x4d\x95\x6d\x7d\x74\xd4\xb1\x7d\xfd\xd9\x47\x76\xe2\x62\xe7\x96\x6e\x1e\xa1\x75\xfb\xd8\xc5\xf1\x2b\x6e\x5d\xa1\x21\x7d\x5d\x4f\xfb\x9d\x5d\x81\x43\xd3\x59\xaf\xf3\xae\x33\x7f\x89\x68\xed\x97\x35\x7b\xd6\x1b\x7e\x8b\x36\xfc\x0e\xb2\xe2\x85\x09\x30\x5b\xc1\x38\xe4\x77\xb3\x3c\xe7\x39\x5d\x73\xfe\xa6\x94\x13\x69\xdf\x33\x68\x77\xcc\x66\xd4\x35\xcd\xd3\xa8\x6e\x15\xb1\x07\x67\x7d\x60\x23\xa8\x75\xde\x71\x32\x2a\x0b\x31\x25\xec\x43\xad\x7f\x8d\x9d\xbb\xc7\x53\xf4\x76\xce\x0c\xbd\x34\x25\x8d\xa2\x92\xba\x21\x79\x5c\xae\xa3\xe3\x4f\x68\x17\x25\xb3\x9e\x0a\x5c\xeb\x4d\xcf\x59\x51\xe2\x69\x91\x9e\x11\xfb\xd8\xd3\x76\xa8\x35\xc4\x94\xb0\x8c\x47\xd1\x68\x38\xee\x00\x4c\xa0\x7b\x16\xb7\x53\xb7\xd9\x00\xe5\x52\x64\xc6\xb5\x8a\x97\x39\x3d\x2c\x3f\x37\x92\x87\xc5\x70\x8b\x46\xb5\xc7\xd3\xff\xf7\xb0\xb6\xb5\xaa\x4d\xe7\xe8\x4b\x30\x91\xf4\xd6\xd4\xb5\x2e\x53\x28\xa0\x29\xfa\x80\xf5\x80\xe3\x73\xf0\xf7\x82\xe5\x20\x0c\x9b\x93\x69\x68\xd1\x1f\x32\x52\xb0\x16\x7f\x6a\x25\xb8\x42\xa7\x30\x34\xf2\x8b\x07\x8d\x00\x1f\x8c\x8e\x21\x37\xb4\x9d\xb7\x28\xd2\xa2\xb6\xdd\xdb\x17\x90\x11\x1e\x36\x5c\xd9\x6c\x94\x08\xa4\x9d\x39\xdf\xc6\x0f\x46\x51\x46\x5d\x1d\x9d\xed\x13\x81\xb9\xde\xe3\x4d\x79\x30\x69\x2e\x6c\x46\xac\xbc\x8b\x8b\x83\x8d\x08\xd4\x9a\x5f\x38\xde\x95\xb7\x59\xd3\x73\x68\x8c\x0a\x1d\xbb\x40\xd3\xcf\x5b\xc2\xd7\x4a\xef\x1f\xb9\x2d\x75\x5c\x91\xd8\xdd\xe7\xed\xa1\x11\xc6\x42\xf9\xb6\xec\xa7\xee\x92\x51\x7b\x00\x73\xe5\x32\x52\x71\x4f\x46\x1f\x67\x9b\xb3\x55\xfa\x89\x66\x6b\x41\x83\x6f\x1d\xbb\xfa\x6f\x95\x97\x55\x39\x42\xe5\x62\x95\x06\x39\xbd\xd5\xf4\xbe\xf1\xb5\x6a\x5d\xa0\x28\x47\xad\x7a\x7f\xc6\xa1\xe6\x16\x1d\xc6\x8c\x68\x2f\xcb\xcd\xb1\x63\x98\x34\x8f\x14\x0a\xa3\x3a\xe8\xc4\x5a\x13\x5a\x0b\x66\x0b\x97\x30\x7a\xe4\x80\xdc\x09\xe9\x8f\xa8\x58\xd0\x40\x6b\x6d\x07\xb7\x4b\x96\x2d\xd5\x40\xe4\x38\x55\x0e\xab\x64\x53\x97\x34\x60\x46\x1f\x57\xa6\xe4\x85\x08\x88\x99\x87\xe2\x4a\x2d\x82\xf5\x32\x6b\x44\x60\x8d\xb3\x97\x80\x27\x15\xb5\x21\x49\x8c\xde\x7b\x3a\x47\x4c\x4e\xc1\x35\x33\x24\x67\x26\x14\x11\x6b\x59\xda\x29\xb7\xb8\x5b\x0e\x52\x3f\xa5\x79\xa1\xa7\x37\xc3\xea\x96\x85\x72\x3c\x1a\x89\xcd\x66\x74\xcd\x94\x0e\x10\xa5\x0e\xaf\x6e\xb0\x24\x2f\xb4\x52\x31\x2b\x72\xe5\xd4\x29\x29\x07\xaf\x01\x1c\xe5\xb0\x2e\x6d\x74\x96\x0a\x83\x11\xa5\xce\x9a\xf0\x81\x96\x6c\x5f\x78\x6b\x5f\x30\x8a\x46\xea\xb2\xc9\x20\x5a\x2a\x7d\xb5\xe1\x76\x74\x67\x8f\xbe\xff\xda\xa3\x75\xb9\xd9\x48\x12\x04\x2a\xa5\x31\x9b\x6d\x36\x6a\x52\x20\x52\x17\xb2\x8e\xf7\xe1\xe5\xf0\x35\x22\x8a\x68\xe3\x0f\xa9\x6a\xfc\xd1\x26\xf2\x32\x2a\x2f\x12\x51\x64\xee\xfa\x08\xe8\x1b\x2a\x94\xb8\xe9\xde\xf2\x19\x84\x75\x0d\x21\xa2\x8d\xf8\x13\x14\x4c\x72\xdd\x22\x66\xae\x97\x08\x11\x33\x54\x00\x2a\x4b\xca\x6c\x88\x5a\x12\xea\x39\x9d\x90\x17\x8f\x77\x14\x10\xf4\xbd\x45\x9c\x65\x6f\x23\x51\x87\xe1\xd5\xba\x5d\x2d\x3f\xa5\xf9\x86\x47\x4f\xe5\x57\x70\x70\xf3\x87\xbe\x30\x51\x24\xcc\xf5\xc4\x49\xa8\x0d\x07\xa0\x66\x30\x6f\x78\x23\xa8\xfc\x79\xcd\x40\x89\x47\xfb\xe8\x7d\x33\x11\x94\x81\x5c\x7b\xfa\x82\x53\xe1\xac\x97\xe8\xb8\x30\xd4\xf5\xf4\x3c\x42\x54\xce\x80\xc0\x47\xa6\x11\xad\xd3\xac\x98\x03\xdd\xef\x0c\x10\x5c\xc8\xbb\x27\xea\xf9\x71\xea\x91\x4c\x38\xed\x95\x71\xdd\x8d\x70\xe5\xe4\xa3\x47\x96\x7b\x14\xdc\x1c\x25\xbe\xff\x47\xb2\x28\x56\xf6\xd4\x40\xbc\x46\x4e\xc3\x5d\x47\xd9\xb2\xf6\x48\x32\x50\x23\xc5\xec\x0c\x52\x7d\x1f\x76\x58\x23\x67\x2f\xf7\x4f\x19\x7b\xcf\xd6\xbe\x98\x08\xda\x72\xea\x3c\xfc\x06\x6a\x27\x42\x8b\xab\xfa\x24\x6a\x90\x38\x37\x04\x57\xd3\x54\x73\x47\xdd\x45\x52\xa7\x41\x38\xe6\xb0\xa1\xa1\xca\x58\x99\x5b\x57\x99\x8a\xd6\x21\x2a\xc9\x49\x6f\xa0\x3c\xbe\x86\xf7\x95\x2c\x90\x58\xa7\x3b\x3c\xd6\x2f\x0f\xca\xd0\x9c\xb6\x1e\x47\x31\x4d\xc5\x1c\x95\x78\x92\x94\x07\xad\x7f\x5c\xab\x4b\x95\x29\x17\xb9\x72\x98\x37\x04\x10\x94\x41\x78\xcf\xdc\x77\x59\x13\x66\x86\xc7\xd7\xcd\x93\x67\xa6\x5f\x51\x0e\x70\xae\x84\x1b\xd7\xb6\x78\x8e\xf6\x2d\xf2\x67\x03\x53\x26\x49\x4a\x1e\x7f\x20\xfa\xff\xbd\x3d\x88\xca\xbd\x3d\x94\x63\x90\xa9\x1a\x10\xc6\xa4\x8d\xab\xa7\xdd\x4b\xe6\x9e\x7b\x49\xa3\x1e\x94\x16\x73\xb4\xc4\x3b\xae\xd7\xc9\x32\x8a\x96\xbb\x96\xb5\x82\x75\x16\x13\xe5\x05\x28\x8b\xad\x39\x46\xe3\x9d\x24\x57\xaa\xcf\xd6\x6f\x56\x5d\x03\x81\x38\x44\xcc\xbb\xe8\x6d\xa1\x69\xce\x9b\x1c\x87\x09\xd1\x14\x0d\x29\x69\xb2\x4f\xc9\xdc\x4f\xe3\xf3\xcb\x52\x19\x53\xbc\xe1\x1c\x55\xe9\xe6\x0b\x8b\xde\x65\x16\xf1\x7e\xa2\xa1\xa8\x5e\xcb\xf2\x1e\x02\x14\x64\x6e\x2a\xa6\x10\x51\x9d\x41\x61\xb7\x19\xcc\x25\x35\x69\x67\xb6\xdf\x91\xdf\x85\x7d\x4b\x70\xc4\x68\x2d\xc5\x56\x03\xe9\x12\xf0\xba\x51\x93\xb3\xd4\x11\xc2\x7b\xca\x00\xd3\xe4\xd1\xa8\x1d\x8c\x26\x92\xf1\xd0\x67\xd5\x88\x44\x91\x18\xba\x59\xb6\xcc\xb4\xcb\x39\x24\xbd\x33\x52\x1d\x74\x19\xac\x9b\x9b\x87\x12\x06\x22\x79\x3a\x03\x82\xb7\xd0\x62\xad\x83\x39\x9a\x40\x04\xe8\x66\x43\x34\x0d\x97\xa7\x5b\xb9\xd9\x80\x72\x2b\x55\x06\x23\x3d\x10\x47\x8b\x89\xbb\x5a\x4c\xa5\xe1\x38\xb6\x60\x32\x8c\xa2\x72\x37\x7d\x52\x24\xd6\xb5\xe0\x1f\x76\x02\xb8\x83\xa4\xaa\xd7\x5c\x37\xdb\x97\x99\xca\xf6\x1b\xa7\xc1\x5d\x02\xee\xba\x7e\xe9\xcc\xd7\x0e\x0a\xdb\x06\xb7\x31\xd4\x8b\x0c\x8b\x2b\xda\x18\x38\xfb\xd0\x08\x48\xfb\x77\xcf\xc3\xf3\xf3\xd7\x27\x3f\xbc\x39\x3f\x36\x4b\xcf\xb7\x5e\xce\xda\xa8\x29\xbb\x5e\x0d\xb8\x63\xd5\xec\xc4\xe0\x71\x54\x1c\xdc\x93\x52\x38\x82\x55\xe4\x98\x90\x0d\x9d\x74\xd6\x23\x71\x73\x2f\x6d\xec\x8a\xcd\xbd\x4f\x09\x9d\x93\x9e\x41\x53\x14\x81\x06\xbd\x80\x96\xec\x20\x59\x12\x0b\x38\x05\x02\x83\x8e\xb0\xc7\x15\x44\x8a\x41\xf3\x36\xae\x95\x51\xd1\x56\x6f\xc8\xdb\xdc\x40\x5a\x92\x67\x7a\x57\x3e\xb2\xd5\x5b\xbe\xca\x1e\xf2\xbe\x72\x43\xec\xe5\x40\xd9\xf6\xb7\x22\x56\xd7\x08\xce\x8f\x8d\xb6\xd5\x96\xcd\x0a\x98\xfa\xce\x0f\x60\x14\x31\x75\x56\x82\x56\x2a\xa5\x84\x4f\x6e\x2f\xe6\xbd\xac\x86\x68\x45\x95\xaa\xff\x0b\xb2\x6a\x9f\x16\xd6\xd4\x57\x3f\xa6\xad\x7e\x0e\xdd\x6c\x68\x42\xda\x47\x51\xa2\x9f\xa8\xc3\xdf\x7e\x53\x2c\x76\x4a\xe6\x51\xd4\x66\xef\xed\x47\x51\xf8\x5b\xae\x76\x7a\x4a\xc6\xfb\x73\x48\xc6\x63\xfd\x4e\xad\x94\x58\x25\xe3\xd0\x9c\xa4\xca\x45\xa4\xdd\x2a\x5a\x53\x2b\x8a\x56\x34\x5e\x92\xca\xe4\x19\xbd\x06\xed\x05\x58\xa7\x25\x04\x6b\x68\xc7\xfb\x28\x65\x31\xcd\x17\x73\xc4\xe2\x8a\xb4\x5e\x8d\x2d\x2c\xad\xac\xff\x19\xf5\x1f\x07\xd3\xc6\x67\xd7\xdb\x76\xe0\x88\xb6\x15\xde\x76\xe6\xe3\xb3\xdf\x92\x34\xe0\x5a\x45\x61\xf7\xbb\x92\xd5\xe9\x26\x28\xc3\x02\xe5\x98\xa2\x02\x97\xb2\x16\x4c\x0a\xc9\x2b\xa8\x5b\x0b\x83\x28\x8b\xa2\x0c\x14\x70\xc6\x70\x31\x05\x6f\x29\x50\xae\xd4\x51\x2e\x8f\x66\xfb\xb8\x22\x7b\xb3\xaa\xee\x69\x1a\x82\x10\xdd\xd3\x7c\x31\x0d\x61\x88\x2a\xe5\x6f\x75\x8e\xd2\x30\xb5\xa9\x73\x27\xf5\xdb\xf0\x5b\x9d\x2a\x7f\xc8\xd4\x7d\x55\xf6\x5b\x5b\xf6\xdb\xd0\xa6\xce\xb7\xc7\x15\x56\x7e\x3d\x13\xde\x78\xf1\x33\xe1\xbd\x49\x37\x61\xa5\xde\x5e\x8d\x91\x87\xa2\x80\xd7\x54\x1b\x36\x0e\x79\x1b\xe9\x8b\x99\xf9\x16\x7f\xc4\x76\xa9\xb6\x51\x40\xfe\x90\x40\xd6\x17\x47\xba\xbc\x43\xe3\x5d\x6f\x07\x5d\x7f\xbc\x0b\x94\x87\x86\xd4\xbe\x40\x0c\x8d\xa8\x0d\x1c\xf4\x99\x03\xea\x32\x49\x8f\x19\xd4\xb0\x67\x96\xbe\x0b\x19\xcb\x11\xce\x2e\x08\xd0\x6e\x14\x1d\x4f\x81\xda\x2f\x91\x92\x4b\x7f\xb2\xe4\x7e\x80\x5a\xee\xde\x27\xf5\x16\x23\x02\xdf\x5f\xcd\x90\x6f\x9c\x01\xea\x6a\x2b\xb5\xee\x1e\x2c\xd1\x98\x4e\xea\x1a\x1d\x2a\x4a\x0d\xae\x6d\x64\xc4\x2d\xe1\x4a\x3e\xd7\x8d\xe6\x76\x36\xe4\x47\x62\xc4\x07\xea\x0a\xa4\xfc\x4c\xea\x08\xa2\x72\x54\xb1\x71\x56\xf4\x9f\x02\xc5\x96\xcd\xa4\x01\xeb\xf8\x4e\xfa\x4a\x00\x2a\xcf\xca\x12\x04\x23\x4b\xdc\x02\x41\x02\xb7\xf2\x6d\x02\x7e\xe9\x5c\xbb\x1e\xfe\x8e\x8c\xda\x41\xeb\x93\xac\x63\xaf\xa9\x5e\x3f\xf6\xf6\xb1\x7b\xa6\x85\x53\x25\x35\x0a\xe5\x09\xfc\x9c\x58\x6b\x3c\xa3\xda\xe9\x87\x36\x76\xec\x40\x15\x97\x34\x69\x9c\xc2\x1a\xef\xd2\x61\x20\x8f\x58\x9a\xd2\xd6\x86\x3d\x81\x34\x5e\x15\x2b\x00\x13\x63\xc0\x7e\xff\x9c\x4c\x69\x5f\xc9\xd2\x61\x7e\x27\x18\x93\xff\xe7\xfb\x5a\x5e\x31\x1e\x28\xb9\x6f\x4a\xd6\xad\x98\x0b\x4f\xea\xba\x75\xb8\xa6\xcc\xff\x95\x80\xd3\xb3\x4c\xb2\x47\x98\x07\x29\xca\xf4\x39\xcd\x50\x1a\xa2\x10\x85\x41\x88\xc2\x7f\x84\x28\x1c\x87\x28\xfc\xdf\xe1\x1c\xa2\x1c\x67\x18\x63\x36\xe3\x29\x9b\x4f\x5d\xdd\x4d\x86\x32\x98\x84\x48\xc5\x46\x9f\x11\x00\xa7\x8a\x6d\x48\xcd\xe5\xaa\xdb\x50\x33\xf3\x25\x8c\x22\x3d\x63\xf9\x66\x03\xf4\xaf\x32\x8a\x74\xe5\xc1\x1a\x39\x9c\x79\x20\xe3\x7c\x4a\xad\xa2\xba\x3c\x57\xb3\x31\xd0\x20\xee\x4f\x27\x2d\xa7\x0b\x24\xdf\x67\x44\x75\xfb\xff\xa0\xbd\xa0\xe5\x5a\x6d\xe2\x09\x01\xcf\xbc\xab\x97\x9d\xe5\xd1\xa4\x86\xdb\x4c\x1f\x9f\x10\x40\xfd\xbc\x46\xc7\x9d\xc4\xcf\x09\x62\xb8\x85\xb6\x79\xc4\x04\x1c\x29\xc7\x90\xb3\x7b\xa3\x46\xcd\xd1\x82\x4c\x09\xba\x22\x53\x8e\xb4\x02\x29\xab\xa7\xe9\xbc\x86\xb0\x86\x30\x21\x71\x55\xdc\xd0\xa1\xde\x27\x07\xc6\x19\x41\x0d\x13\xa8\x46\xd0\xb7\xd1\x94\x68\xfa\x0f\xeb\xb4\xa0\x95\x82\x1b\x3d\x0e\xa3\xc8\xad\xa4\x31\x57\x12\x5c\x1e\x2f\x88\xe2\x91\x54\xf9\xbd\x7d\xab\x47\x1f\xbf\x27\x29\x9f\x2b\xeb\xad\xe7\xf2\x97\x9c\x4b\xb3\x62\x1a\xf7\x4b\x8d\x6b\x5d\xdf\x0e\x86\xb2\x27\x34\xd9\x9a\x07\x05\xa0\x28\x53\x57\x47\xbd\x41\x1a\xe5\xf2\x05\x99\x32\x39\x2b\xd4\xcc\x0a\xaf\x9b\xf7\xb8\x52\xf2\x4e\xe1\x3f\x34\x00\xcd\xc4\x6e\xed\x03\x65\xed\x6c\x0f\xb5\x3b\xd5\xda\xa9\xe1\xd8\x6d\xd0\x6f\x6e\xd0\x31\x15\x8c\x22\x0d\xfd\xa3\x5a\xff\xdf\x3b\xe7\x6b\xb0\x83\xee\xc4\x0d\x43\xf1\x65\x33\xe8\xc9\x02\xdf\xe4\x25\xcd\x8a\xeb\x9c\xfd\x49\x17\x41\x56\xdc\x5c\xb2\x9c\x88\xa2\x9c\x06\xdf\x86\xe3\x72\x1c\x7e\x1b\x87\x0a\x19\x4d\xe5\x1d\xe7\x86\x71\x43\x8c\x28\x06\x5c\x31\x98\x03\x6e\xa3\xb9\x75\x1b\xdd\x38\x8c\x47\x42\x5d\x22\x28\x54\xce\xaa\xac\x77\x12\x15\xfa\x0e\x38\x4e\xa4\x49\x3d\x80\xe2\x0d\x37\xa2\x87\x2d\xb7\x8d\x84\xe7\x3d\x7d\x20\x54\x07\x7a\xa1\xef\x77\xdb\xbd\x7b\xca\x45\x33\xb1\x2c\x30\xc6\xef\xa9\x3b\xd8\x2e\xd3\x54\x71\x96\x99\xb7\x7c\xd0\xb5\xc1\x6c\x83\x6a\x74\x04\x2e\xf0\x11\xae\x3e\xe5\x4d\xdb\x3b\x1c\x3d\xd7\x2f\xe8\x51\xee\xb9\xb5\x3b\x93\xc6\x39\xff\x60\x4b\x18\x8b\x61\x37\xfc\x72\x16\x3a\x81\x3c\xf4\x6c\x98\x42\x47\xcd\x8b\x5a\x3a\x99\xeb\x6b\x6b\xfb\x2a\xe2\x95\x7c\x66\x4a\x0e\xb8\xea\x6a\x8f\x5e\x79\xae\xf7\x97\x77\x34\xe2\xb5\xd3\xfe\x76\xdc\x55\x43\x0c\xcc\xa4\xdf\x3d\x79\xf9\x62\x17\x0a\x28\xf4\x7e\x4f\xc7\xe1\xb7\xe1\x6e\xff\xac\x56\x5e\xbf\xd9\x74\x10\xe2\x3f\x12\x11\x8c\x9c\x7d\x3b\x32\xd8\x65\xbb\x20\x4a\x62\xbb\xc5\x8e\x23\xd8\xe2\x45\x08\x63\xb5\x77\x1e\x5a\xee\x0b\x02\xda\x15\x87\x5b\x56\xfa\x42\x9d\xa6\x8f\x5a\x6c\x08\xff\x25\xab\x59\x43\xf4\xdc\x28\x78\x1a\x37\x75\xb3\x97\x04\xdc\xcb\xbb\x02\x9c\x1e\xd2\xe4\x25\x01\x87\x14\xbd\xb0\xb1\x95\x35\x29\x20\x57\x82\xfa\x24\xe0\x2f\xf9\xe0\xdf\xc2\x13\xbb\x6f\x0c\x8e\xbd\xf4\xe0\x45\x56\x3c\x9e\x27\xa6\xb0\xae\x8d\xc7\xb3\xaf\x34\x84\x87\xe1\x8f\xa2\xcf\x00\x50\xe8\xf8\x98\x9a\xf1\xef\x1a\xe1\x6c\x17\xa7\x19\x28\x3c\x61\x9a\x77\x79\xb0\xcd\xaa\xbb\xcd\x3b\xe6\x3a\x28\xfa\x2f\xb5\x82\x3d\xa0\xd1\x67\xae\x6e\x0d\xd1\x55\x4f\x8f\xb9\xbd\xff\x5c\xb6\x6a\xd7\xcd\xb3\x00\x81\xef\x09\x18\x56\xda\xd2\x8f\x02\x4a\x89\xd6\xbc\x5e\x58\x73\xdf\xe1\x07\x79\x1d\xaf\x05\xab\xa7\x4a\x40\xf4\x73\x9f\xb6\xa0\x27\xe6\x75\x8f\x58\x12\xc5\xe3\x37\x04\x51\xbc\x64\xe6\x49\x52\xbd\x3f\x5a\xe1\xa0\x72\xb8\xb2\x4c\x85\x63\x95\xc8\x61\x32\x39\xc0\x4c\x62\x93\x79\x9c\x63\xea\x71\x4e\x97\x54\x4e\x9b\xf5\x0f\x9c\xce\x21\x6c\x14\x03\xf6\x9b\x80\x6e\x4a\xca\xab\x0a\x2c\xd4\x3b\x47\x5d\x53\x09\x8e\x56\x95\xbd\x73\x54\x65\xb7\x39\x23\x7d\x48\xc4\xd3\x7d\xc5\x1a\x12\xf4\x74\xe5\x35\xff\x01\xe2\x9e\x5d\xfe\x52\x07\x3d\xb7\x3e\x34\x4e\x4f\x26\x3a\x30\xc6\xce\x03\xdd\xbf\x52\x3e\xb7\xcd\xa1\x6c\xc5\x7b\x0e\x86\xfd\xb8\x42\x0a\x7b\x75\xf8\x5e\x5d\xb8\xeb\x00\xb6\xea\x17\x47\x1c\xee\xf6\x32\xeb\x77\xa1\x6d\x53\xe0\x66\x13\x86\x0f\x79\x9b\xad\x06\x2a\xaa\xde\xdc\x8c\x0e\xab\x31\xa8\x07\x70\x45\x67\x43\xd3\xe4\xb5\x2f\x6b\x4f\x7f\x11\xe6\x78\x46\x04\xb6\x9e\xc8\x76\x57\x42\x97\xed\x99\x6e\x49\xf4\x10\x74\x9f\x07\x5b\xa7\x1d\xc0\x5d\xe0\xc2\x10\xce\xc2\xe6\xe9\xd2\x9b\x5f\xde\x55\xfb\xdb\xde\xde\xe0\xf0\xfa\xe5\xbc\xf1\xd5\x2a\xa0\xe0\x92\x6c\x36\x7f\x8a\x41\xf1\xf8\x1d\x4d\xf9\x1c\x2b\x6b\x56\x1b\xf3\xcc\x30\x08\x4e\xe4\xc3\xc1\x38\xea\xbe\x86\xc5\x8b\x75\x25\x69\x4e\xf1\x91\x2d\x68\x40\x02\xa5\x56\x16\x1a\xd5\x6b\xbf\xe4\x69\x21\x02\x9a\x17\xeb\xeb\x65\xd0\x9e\x4e\xa1\xd1\xe7\x50\x63\x7b\xb3\xba\x2e\xc9\x82\xda\x08\x3d\x9a\xa9\x79\x4d\x1a\x9b\x8c\xc1\x52\x4a\xf3\xcf\x31\x6a\x6e\x19\x50\xc7\x9a\x45\x30\xa0\x55\x4f\x10\x87\xe8\x1b\x0a\x88\xd2\x52\x54\xea\xb4\x5d\x95\xb0\x99\x3c\x91\xa6\xa4\x17\x50\xd6\x6e\x3a\x34\x54\xc9\x3e\xb3\x6b\x6d\x7d\x27\x8e\x8b\xc0\x24\xd9\xa1\x94\xc5\xb5\x52\x16\x81\x35\xd1\x1a\x79\x3b\x74\x80\x88\x89\xc3\xaa\x9d\xb2\x11\x06\x7e\xa5\x76\x48\x89\x4f\x63\x8e\x8e\x9d\xa7\x38\x63\x11\xec\xbb\x2e\x1f\xd6\xd2\xd7\xd0\x5f\x36\xef\x72\x92\x83\xbc\xa3\xe8\xcc\x70\x90\x37\xf4\x4b\xfc\xf5\xa3\x8b\xf6\x6c\x1a\x70\x51\xde\x48\xe9\xff\x49\xc0\x8e\xe0\xb1\x7a\xef\x99\xc8\x25\xfa\xb1\xf4\x13\x19\x96\xbe\xef\xf2\x73\xde\x79\x21\xef\x3e\x91\xef\x6c\x0e\x73\xfd\x68\x68\xd5\x7c\xdd\x87\x72\x47\x81\x20\x5c\xb0\x8f\xa1\x91\xb8\xe9\xe7\x65\x27\x92\xed\x40\x0c\xdc\x11\xc6\x37\xd4\x0f\x77\x7b\xd3\x09\x5b\x7f\x7a\x06\x7a\xd5\x24\x15\xec\x96\x03\x44\x45\x08\x7d\x32\xeb\xe9\xb0\x3a\x83\x98\x92\xd8\x1d\x12\x77\x74\xca\x5d\x8b\xad\x9d\x2a\x5f\x92\x4d\xbb\xd5\xcb\xaa\x5c\xd9\xf5\x18\xdd\x06\xb3\xb4\x19\x13\x77\xe2\x68\xf2\x98\x64\x12\x26\x2b\x1b\x73\x3c\xbe\xca\xb6\xc0\xf0\xa2\xea\x2c\x87\xac\xbd\x1e\x26\x6b\xb7\x3d\xb2\xf6\xc9\x90\x35\x57\xa9\xa8\x27\x02\xd9\xa2\x62\x32\xa4\x5c\x3e\x78\x1d\x25\x51\x74\x44\x54\x8c\x41\x26\x77\x33\x02\xc4\x7d\xf6\x06\xda\x52\x88\x13\x21\x68\x3e\x23\x31\x21\x53\xe2\x6b\x39\xc1\xcd\x26\x9d\xd7\x75\xdf\x88\xb5\xab\x9f\xd9\x00\x3b\xea\x02\xbb\xd9\xa8\x8c\x4c\xf9\xfa\x55\x9c\x2d\x7c\xe9\x46\xf2\xd7\x0d\x68\x14\xee\x39\xd9\x56\x6e\xdf\x71\xe3\x50\x65\x34\x12\xb5\xd5\x01\xdd\x76\x67\x91\x14\x9e\xfa\x14\xde\xde\x60\x83\x8c\xe4\x4a\xbf\x4e\x1d\x25\x81\xf2\x16\x13\x88\x42\x71\x2a\xc1\x3a\xe7\xb4\xaa\x02\x26\x82\x25\xa9\x02\x12\xfc\xaf\xb6\xcd\xff\x15\xc2\x44\xc4\x6f\xb4\x42\x05\xdd\xee\xef\xc0\x04\x02\xac\x07\xed\x7b\xff\xd2\x8c\xbd\xfa\x3f\x63\xc6\xb6\xfb\xd5\x52\x5b\xf7\xb8\xa1\xc8\x66\x13\xfe\x70\x77\xb2\x18\x50\x16\x51\xac\x0b\xd7\x07\xe2\x0e\x59\x07\x89\xd9\x02\x63\xfe\xb0\x4c\xcb\x0b\x45\x70\x4a\x3b\xd1\x78\x12\xa2\x94\xb4\x97\xa4\x32\xfe\x2a\x07\xf6\x9b\x7a\x05\xd0\xca\xeb\x7e\xec\xae\x13\x8a\xfb\xa1\x71\xae\x09\x80\xe8\xdc\x51\x71\x71\x09\x4f\x43\xab\x14\xc5\x6c\x0e\xb6\xee\x01\xec\x56\x69\x63\x1b\x7a\xc9\x9a\xd9\xd9\x6c\x46\xed\x55\x01\x3a\xd2\xc5\xc4\x7a\xaa\x3f\x72\xed\xd2\xd4\x4f\xc7\xfd\xb3\x32\x47\x69\x24\x66\x5a\x18\xd0\x7c\x6e\xd5\xff\x91\xd7\x53\xb7\x2b\x7d\xec\xa8\x7b\xab\x9c\x4e\x62\x70\x5e\xce\x9a\x4c\xc4\x9a\xcb\xf0\xf8\x05\x07\x86\x19\xd1\x6b\xcd\xa7\xc4\xd0\xc2\x19\x37\x0e\x75\x7b\x01\x9a\xfb\x92\x43\xde\xb4\x93\x9e\xd0\x79\xab\xc6\xe6\xf9\xb8\x5e\x91\x78\x5d\xd1\x53\x35\x0c\xcb\x2a\x1c\x3f\x7d\xe5\xba\xb4\x4e\xe7\xae\x80\x91\x43\x44\xf0\x80\x5e\x87\x96\xc1\xeb\x01\x2b\x19\x3a\x87\x89\xd2\x59\x96\xa4\x56\xe1\x87\xba\x99\x79\xb3\xe7\x8b\x95\x9b\x6a\xad\xe4\x5d\x2f\x8f\x13\x15\xb6\x91\xf4\x4f\x12\xda\x3e\x2e\xd2\xf1\x18\x6a\xc1\xfd\xa9\x64\x25\x79\x4a\xe7\xd0\x86\x83\x6f\xf5\x78\x86\x0f\x28\xeb\xf1\xb0\x89\xb3\x08\x11\x6b\xa6\x77\xdb\xec\x0e\x2f\xd7\xd6\xd9\x1c\xbc\xa8\x74\xbb\xd0\x17\x29\xaf\x64\x6f\x91\x55\x19\x77\xfb\xa2\x97\x7d\x23\xf3\x57\x7a\x83\xb5\xb1\xf5\x07\x50\xa3\x77\x9b\x7a\x29\xa9\xef\x96\x30\x75\x3b\x6d\x8d\x9a\x5e\xb4\x1f\x81\x01\x79\xf1\x50\x49\xa3\xaf\x48\x7a\x46\x07\x8f\x8b\x73\xeb\x77\xe0\xb7\x3c\x71\x65\x5c\x3e\xbf\xde\x7a\x39\xa8\x21\xfa\x91\x3e\xda\x6f\x45\x7c\xc9\xf2\x45\xe3\x07\x7e\xd8\x89\x85\x57\xa6\x86\xe8\x09\xc5\xf7\x75\xf2\x90\x91\xff\xa0\x43\x24\x14\x7a\x2f\x89\xa1\xe4\x58\x9e\xd0\xd8\x4b\xc4\xcb\x4e\x42\xe3\x0f\xf9\x73\xfb\xb2\xb4\xcb\x76\x63\xbf\x65\x0f\xf6\xf7\x97\x37\x6e\x43\x66\xd9\xc6\xad\x1a\xc8\x61\xfb\xfb\x8b\x1b\x6f\xd8\x66\xdb\x7a\xcb\x47\x5f\x38\x1f\x5f\x0e\xbc\x15\xb0\x34\xd0\x37\x51\x7c\xee\x9c\x0f\x8d\xf4\x1f\x28\xd6\xfe\xc6\xb5\xdf\xb1\x69\xfa\x8d\x98\xab\x90\x6b\xd3\x74\x49\x6d\x34\x16\xa7\x80\xa6\xec\xb2\xd0\x39\xfd\x24\xa6\xe9\x82\xce\xd1\x51\x71\xa3\x8e\x35\xfd\xf1\xe4\xf0\xfc\xf0\x8c\xaa\x8d\xab\x53\x5e\x95\x45\x46\xab\x8a\xe5\xd7\x27\x79\x25\xca\xb5\x93\x65\x0f\xc4\xf4\x8e\xa2\x43\x8a\x3e\x52\xb4\xa0\xca\x3f\xeb\x93\xcd\xc6\x99\x27\x96\x07\xbd\x71\xce\x2e\xa8\x3a\x53\x2c\x8c\xb2\xe0\x19\x2f\x2c\x5e\x69\x38\x3f\xd1\x39\x72\x66\x69\x9a\xde\x52\xf4\xc4\xa4\x39\x85\xa7\xa9\x2c\xd8\x8d\xec\x3b\x4d\x9f\x53\x74\xec\x64\x4c\xd3\x57\x14\xa9\x34\x74\x4e\xe7\x48\xbb\x67\x9c\xa6\x3f\xca\x51\x7b\xf1\xdf\xd3\x8f\x74\x8e\x7e\x79\xf1\xfc\x99\x10\xab\xd7\xf4\x8f\x35\xad\x64\xd7\xdb\xe7\xb2\x46\xbf\x53\xcd\x3f\xa8\x94\xd4\x19\x3a\x0a\x1d\x0b\xd1\xd0\x8d\xbd\xeb\xe8\x71\x0e\x47\x98\x6d\x6f\xe3\x24\x8a\x9c\xc8\xd6\xb5\x1b\x94\xb7\xf5\x55\x81\x84\xe5\xd1\x7e\xa7\xfa\x3c\x0c\x58\x1e\x7c\xa0\xf0\x29\x35\xf4\x41\x29\xc4\x36\x3f\x1d\x94\xfb\x40\x53\x32\x57\xfe\xff\x9c\x18\xbd\x74\xf0\x1d\x4d\x55\x3a\xa9\x5e\x69\x47\x71\x78\x34\x41\x6a\x20\x1f\xa8\x3b\x31\xb0\x49\x54\xd2\xf7\xb6\x88\xa5\x19\x36\xc1\x59\x5b\x3f\xd1\x59\x5c\x88\x78\x9d\x86\x12\x5b\x43\x14\x1a\x54\x95\xbf\x1c\x3c\x0d\x51\x38\x88\xa4\xe1\x2e\x95\x50\x33\x11\x7c\x8e\x7a\x8e\xf5\x1c\x27\x71\xce\xa3\xc6\xe0\xd0\xc5\xd0\xd0\x45\x3b\xf4\x0f\x54\xf9\x76\x33\x89\xca\x89\x9b\x1b\x2f\xb8\xbd\x1e\x78\xde\xf9\xf4\xde\xfe\x41\x23\x15\x41\x6f\xf4\x0f\x27\xd6\x6e\xfb\xfe\xf1\x03\x35\x36\x8d\x43\x40\x46\x91\x31\xe0\xf2\x1d\x08\xf6\x1c\x11\xaa\x90\xf7\x8f\xf3\x45\xe8\xbe\x83\xb9\x39\x09\xdd\x6c\xc0\x6b\x0a\x68\x67\x32\x05\x74\x0f\x46\x6f\x9c\xb4\x21\x91\x55\x07\x20\x89\xe5\x6f\x64\x83\x2a\xb6\xf7\xec\x99\xbc\xc7\x4f\xbf\xd7\x0f\x32\x6f\x95\xd7\x66\xc7\x43\x94\xb3\x91\xd4\xbc\x28\x3f\x5c\xd4\x3c\x9f\x6b\x6e\x4c\x19\xd7\xa0\x12\xd3\x99\xb2\xa6\x99\xea\x97\xfb\x9e\xc9\x0c\x9d\x95\xdd\xb4\x29\xe9\x6b\xb7\x22\x50\xca\x6b\x7d\xaf\xbe\xba\xe3\x97\x9e\xd9\x0d\x87\x4d\x61\xdf\xb4\x47\x17\x1d\xb0\xea\x61\xae\x55\x0f\x41\x74\x46\x95\x12\x9f\x67\xa4\xe4\x7e\x62\x25\x19\x76\xec\x90\x38\x72\xb3\x95\x9f\x41\xaf\xb4\x5c\x8e\x8e\xb1\x4f\x3b\x99\xdf\xd0\xbe\xb5\x94\xd6\x06\x68\xcd\x1e\x3c\xbd\xe6\x5e\x5b\x8d\x81\x93\xdb\xe9\x0e\xe3\x4e\x65\x18\xe7\x82\x3f\xa4\xe7\xab\xa7\x5d\xad\xee\xf7\x10\x09\x4c\x91\x35\x03\x48\x44\x22\x70\xef\x62\xd4\xd7\x77\x57\xd6\x1c\x30\xf1\x67\x77\xb3\xe1\xc8\x5f\x98\x5d\x2d\xa1\x01\x84\xd1\x58\x26\xb7\x8f\x84\x4e\xa0\x7d\x79\xb3\x96\x1d\xfe\x64\xc4\x4d\x0f\x09\x72\x1e\x25\x50\x40\xea\x6e\x1f\xbf\xd1\x5e\x04\x50\xff\x3e\xb8\x4d\x34\xf2\x28\xc9\xc8\xd7\x01\x61\x97\xac\xc1\x8d\x4d\x6d\x10\x4c\x9d\x67\x3f\x29\x8f\x95\xea\xe7\x79\xfb\xf3\xa2\xfd\x79\xa8\x7e\xae\x48\xfc\x53\x14\x8d\xc8\x0c\xa8\xc4\x65\x9b\x7f\x4c\x95\xcd\xac\x66\x38\x74\xee\x42\x98\xbc\xca\xfe\x50\xd1\xfa\xe4\x9a\xfc\x42\xd1\xaf\x92\x3d\x46\x3f\x2b\x7a\xba\xa0\x57\xb4\x34\x8e\x4a\x58\x91\xdb\x50\x7f\x55\x14\x85\xbc\x20\x0b\x96\x5f\x87\xce\x2d\x2b\x2e\x29\x59\xdc\x9d\x09\x22\xa8\x13\x8a\x98\xb5\xe7\x49\x3a\x4f\x16\xc5\x3d\x89\xd7\xb9\x0e\x7d\xcf\x61\x7d\xbb\x64\x9c\x6e\x7b\x93\x4e\xfa\x8e\x9f\x08\x73\x1d\x3f\x8d\x30\xfe\xd5\xca\x89\xe4\x0d\xf4\xfc\x6e\x45\x8d\xbc\xe8\x84\x73\x7a\x4d\x78\x90\x15\xe6\xb0\x2b\xca\xd0\x28\x16\x5f\xab\x5d\x88\x84\xb6\xf1\xd7\x0b\xd0\xaa\x09\x7b\x1d\xa8\x05\x54\xde\x6c\x6f\x94\x09\xa1\x24\xed\xf2\x17\x92\x54\x40\x4b\x08\x10\xd0\xf1\x15\xf5\x97\x7e\x3d\x57\x01\x5d\xf8\x25\x0e\x33\xae\x22\x13\xaa\xd7\xd4\x1b\x15\xb4\x4b\x73\x74\xa6\x0e\x84\x2e\x0d\x70\x4d\x25\x89\xb7\x0b\xbd\x0d\x48\x7a\x7b\x4c\x35\xb9\x52\xe9\x57\xb4\x7c\x45\xcb\xab\xa2\xbc\x21\x79\xa6\x0d\x69\x95\xab\xb1\x21\xd9\x88\xef\x76\x6c\xa8\x84\x6f\x4e\xa7\x55\x02\x28\xf3\x9c\xfd\xab\xcf\x7b\x1e\xff\xaa\x3c\x56\xfd\xaa\xce\x7c\xcf\x63\x95\xbd\xc6\xab\x6a\xee\xa9\xc4\x5a\xcc\xd0\x91\x0f\x78\xfc\xab\x2b\xe4\xe2\x12\xaa\x5f\xd5\x46\xe3\x10\xc9\x43\x1a\xcb\x42\x70\x87\xa4\x42\xfb\x15\x5b\x10\x60\xa4\x37\x30\x8a\x26\x07\x24\xfe\x40\x24\x70\xd6\xd2\x26\x21\x58\xd4\x40\x28\x4f\x82\x22\xbe\x28\x69\xbe\xa0\xe5\x19\xe5\x57\xc0\x01\xae\x64\xbe\xd1\x91\xb6\x86\x65\x98\xc6\x9f\x48\x22\xff\x33\x38\x24\x0f\x0f\x25\xb7\x8f\x97\x69\x7b\x0e\x56\xca\x66\x2b\xbc\xb8\x50\xbe\xa4\x09\xe7\xe1\x1c\x46\x11\x4f\x27\x73\x88\xc4\x0c\x28\x42\xeb\x8b\xb5\x1b\xc7\x8e\xd4\x33\xfc\xc2\x02\x4e\x3b\x29\xe6\xfd\x8c\x29\x17\x03\x6e\x4e\x14\x75\xbf\x95\x61\xac\x97\x06\xe3\x43\x82\x3d\x37\x89\x59\x33\x50\xdf\x05\x9a\x39\x3b\xa8\xab\x55\xc1\xb0\xd0\xfe\xcd\x8c\x15\x99\x79\x0b\x60\xdd\x77\x00\x7d\x9c\x77\x46\x98\x94\x51\x54\x36\x6d\x99\x6e\x4b\xfb\x52\x67\x7d\x5e\xd2\xb9\xeb\xe9\x8e\x99\x30\xe2\x5d\xbc\xf4\x63\x4f\x38\xb1\x6f\x1c\x29\x35\xb4\x6f\x0b\x04\xc2\xce\xbc\xe8\x76\xfd\x89\x71\x9c\xdb\x19\x8c\x66\x98\xc7\x6c\xb3\x49\xe7\x88\xc7\xd7\x58\xf9\x64\x53\xbf\x97\x72\xb1\x37\x9b\x7b\xc7\x99\xaf\x32\x66\xd7\x04\x83\x45\x11\x8f\x99\x67\x0a\xd0\xdc\x3d\x62\x66\xe4\x63\xc2\x95\x8f\x99\xd3\x57\x8e\x3d\xf9\x86\x02\xd6\xf8\x2b\x1f\x92\x8c\x7f\x43\x41\x69\x19\xa6\x12\xc2\xf8\x03\xc1\xa0\x54\x08\x3e\x81\xe3\x7d\x54\xe2\x25\x03\x0c\x4a\x28\xd3\x72\x3e\x03\x80\xc8\x23\xfc\xbe\x86\x69\x39\x57\xae\x28\x55\xba\x35\x4b\x83\x53\xfd\x8d\x53\xa6\x06\x69\xd3\xeb\x46\x00\xa4\x8c\x91\xe5\x25\x89\x48\x0a\x91\x66\x4a\xa5\x46\xff\x82\x89\x9c\xa2\xd4\x0d\x1b\xbf\x74\x68\x3d\x57\x6f\x70\x9b\x0d\xef\x28\x4b\x28\xbd\x21\xe8\x6f\x8e\xd6\xb1\xd2\x1b\xe2\x3a\xa9\x5c\x30\xef\x82\x55\x15\xa5\xe8\xd8\x3e\x70\xac\xce\x17\x47\x10\xc9\xd5\xab\xd2\x80\x18\xf2\x9e\x60\x2e\xa7\xd8\x99\x6d\x39\xcc\x11\xc6\x0c\x36\x46\x9a\x9f\x08\x20\x83\x8a\x5d\x8d\x76\x12\x81\x7b\xdc\x71\xa0\x5e\xbb\x57\xcd\x95\x0b\xaf\xc2\x09\x34\x02\x23\x85\x39\xf2\x7f\x8b\x14\x6a\x7a\x99\x7b\xc5\x69\x69\x50\x3f\x1e\xee\xcf\xea\x39\xe4\x67\x2a\x97\x4f\x1d\x5f\xbf\xaa\x88\xb4\xea\x20\x53\x8a\x56\xbe\x28\x96\x18\xb5\x36\x5d\x60\x20\xbe\xbe\xdc\x11\x46\xcb\x22\x15\x73\x4d\xd3\xfc\x8d\xca\xae\x00\xed\xbb\x16\xa0\xc6\xeb\x00\x8d\x7f\x22\x98\x41\x6d\x68\x2a\x67\x99\xf5\x90\x59\xef\x7f\x45\x2a\x4a\x49\x2a\x4b\x6f\xab\x21\xff\xd3\xe8\x90\x75\x12\xb5\x4d\x4f\xad\x7d\xa8\xf6\x59\x29\xe7\xe8\xea\x70\xb7\x0e\x5b\x5b\x9a\x03\x5e\xe8\xd9\xd9\x3a\x2f\xea\x91\x81\x75\x27\xa6\x4b\xa0\xcd\xe2\xe9\x71\x0f\xbe\x04\xfb\xea\xf9\x43\x90\x48\x5e\x2c\xd1\xfa\xd7\x40\xaf\xc4\x16\x5f\x13\xd4\xbe\x01\x83\x15\x53\x8a\xf0\x34\xfe\x55\x25\x7b\xc7\x15\xca\x4c\xbb\x2c\x26\x44\xfe\xe7\x3d\x94\x22\x8a\x59\xfc\x13\xb1\x26\x06\x93\xa4\x6c\x4c\x94\x94\x0b\x8d\x05\x01\x34\x2d\xe7\xd0\x1e\x66\x89\x2c\xad\x8f\x35\x5b\xee\x1f\x6c\x70\x12\x54\x7c\x12\x73\x90\xc8\x1f\xcd\xf7\x3e\xca\x2d\x53\x25\x4f\xfa\xf6\x65\xff\x1a\x89\xd6\xf4\xc8\x0b\xae\xa9\x49\x19\x55\x91\x35\xb7\x4c\x46\xa9\x26\x63\xb3\x19\x81\xc9\x3f\x84\x13\x71\x13\x6e\x36\x4d\xf0\x52\xf3\x9e\x33\x49\x48\x4b\x5c\x89\x5c\x5c\x99\xce\x30\x28\xb1\x48\x89\x0e\x4f\xb5\x64\x95\xa3\x70\x5d\x6a\xa3\xa8\x12\x97\x43\x4b\x5a\x26\x6e\x86\xbb\xa4\xce\xf9\x57\x3a\xe7\x5f\x43\x34\x35\x81\x96\xeb\xa2\x83\x66\x65\x6e\xd0\x2c\x63\xa8\x94\xa5\xb9\xf5\x16\x6a\x52\x4a\x98\x94\xf8\x96\x28\x93\x61\xfc\x4e\x00\xda\x2c\x05\x2a\x91\x3d\x3d\xdb\xcd\x5e\xe0\x1c\x4f\x50\x65\x0f\xeb\xb6\x97\x28\x02\x15\xd6\xcd\xe7\x76\x16\x94\xa3\x50\x3c\x41\x0b\x5b\x7c\x79\x50\xc5\x8c\xb4\x35\x16\x58\x7e\xa7\xcb\x39\x54\xae\xcc\x17\xdb\x7d\x3b\x60\xe5\x85\x9e\xed\x62\x17\x17\x10\x95\x56\x7f\xb3\xd2\x8b\x36\x2e\xd0\x3e\x4c\x8a\x3d\x5c\xc5\x2b\x62\x3c\x99\x3b\xd0\x17\x5d\xe8\x8b\x39\x54\xce\x53\x74\xe4\xb1\x32\x35\xcd\x68\x0f\x2a\xea\xa7\x1e\x82\x6a\x5b\xb6\xa9\xc1\xc6\x34\x5d\xce\x51\x0f\x38\xdf\x59\x1c\xca\x1d\xf8\x96\x68\x82\x16\xb0\x96\x74\x79\x34\xc4\x46\x47\x91\x52\xe7\x8a\x4f\xf4\xa1\xf8\xc5\x04\x49\xab\x3a\x0c\x38\x39\xea\xf9\xe6\x51\x8d\x9b\x57\x77\xf5\x1c\xef\xea\xde\x92\x8e\x6f\x80\xad\x8f\x9f\x43\x56\x95\x27\x2a\x66\xf9\xcf\x14\x73\xf4\x0b\x8d\xa2\x5f\x28\xe8\x98\x58\xb8\x61\x2f\xba\xf2\x62\x47\x20\xaa\x6e\xa9\x8d\x00\x2c\x84\x2a\x61\x38\xf4\x23\xa3\x15\xe0\xe8\xde\xbe\xf8\x4e\xef\x95\x22\xff\x74\x87\xc7\xab\x5e\x8c\x05\x24\x2b\x2b\xf7\x6b\xa6\x72\xf8\xdf\xec\xad\x73\xef\xca\x00\x17\x0e\xd7\x52\x4e\xfe\x6c\x35\x45\xdd\x7a\x01\x1c\x20\x4a\xc3\x66\x7e\x43\x14\xba\xda\x43\x21\x0a\x25\x3e\xb0\x4f\x43\x92\x52\x02\xef\xb7\x85\x90\x23\xc8\x74\x69\x83\x0b\x77\x23\x62\xa9\x5e\xbd\xc7\xbe\x10\x85\x97\xa4\x32\x9d\xba\x4e\xa5\x3f\xbb\xe7\x1d\x71\x40\x25\x9e\xa4\x64\x20\x8c\x05\xac\x61\xed\xb1\x25\x4d\xa4\xfa\x4c\x07\x30\x31\x4f\x9e\x8d\x73\x77\x3f\xd9\xc0\xa1\x5e\x5a\x7f\x30\x56\x16\xfd\xfb\xa8\x62\x0f\xd6\xac\xf1\x61\xf1\x0b\xed\x33\x3c\xe9\x3c\x59\xb3\x81\x11\xcb\x3b\x8a\xf1\xcf\x99\x0a\x44\xe6\x72\x06\xd7\x2c\xce\x38\x25\x25\x70\x18\x20\x75\x08\x78\x1e\x2f\x8c\xac\x8e\xa7\x64\x9e\x4e\xe6\x89\xfa\xbb\x3f\x6f\x3d\x8c\x2c\x8a\x9b\x8b\xcc\xce\xb6\x15\x72\x00\xc7\xd1\x98\x2c\xb0\x60\xd5\x40\x99\xba\x46\x3f\xd3\x28\x6a\xd5\x1d\x7a\x91\xff\x95\x50\xa4\x12\x44\x50\x73\x31\x71\xad\x4a\x25\x5b\xb7\x8f\xf4\x26\xbc\x57\xa1\xf5\x9b\x60\x69\xcf\x18\xde\x35\xd1\xe8\x2d\xc3\x43\xee\x9b\x5c\xd1\x79\x0f\x5e\x44\xbd\xfc\xa1\x21\x25\xcf\x98\x56\x27\x18\xec\x1c\xb9\xee\x88\xdc\xfb\xb1\xbc\x32\x86\x17\x17\x2e\xd6\x8e\xe9\x78\x6c\xdd\x9f\x90\xcd\x46\x68\x77\xe2\x3b\xa0\x73\x03\xdf\xee\x5c\x1a\xec\xcd\xe0\x6c\xcd\x94\x4b\x0a\xc5\x77\x8c\x26\xfa\xa5\x3e\x65\x73\xa3\xed\x9c\x32\x75\xf3\x51\x2e\x4c\x1d\xef\xba\x35\xe2\x0f\xcc\xc4\x36\x70\x06\xcb\xfa\x10\xa9\x9d\xe6\xcc\xc5\x66\xe3\xc1\xb8\xdf\xc0\x68\x22\x70\x2b\x18\xf7\x91\x12\x2f\xb9\x30\x42\xc4\x6b\xa0\x05\xf7\xfe\xa3\x48\x1f\x00\x81\x1e\x5a\x59\x4c\xeb\x64\x17\x46\xe1\xb7\x6c\x4b\xe4\x5e\x53\xeb\xc8\xad\xf5\x9a\x5e\xb3\x4a\x94\x77\xee\xb3\xac\xae\x16\x5a\xca\xf7\x96\x0d\x10\x99\xe6\xb2\x74\x6d\xef\xcc\x47\xbe\x4d\x8a\x2f\xd0\x69\xd4\x5d\xda\x8a\x87\xac\xd1\x3c\x97\xf4\x1d\x3b\x59\x47\x2a\x6b\x78\x10\x87\x0e\x69\x43\x7c\x27\x8d\x94\xcd\xa6\xed\xd9\x36\xe6\x73\xa5\x20\xeb\x05\x30\xda\x52\x10\x93\x21\xca\x0a\x38\x76\xbb\x87\x3d\x32\x81\xbb\xbb\xaa\x0b\xce\xc3\x72\x6c\x3e\x14\x18\xe9\xf1\xed\xee\x10\x4e\x23\x1e\x3b\xda\x1a\x83\x1e\xb7\xfb\x60\x7a\x2e\x19\x65\x13\x2e\xff\x85\xb7\x3b\xfa\xf2\x5a\xe9\x79\xfb\x6a\x87\xf9\x19\xb0\xf8\x5e\xc7\x74\x13\xad\xeb\x8b\xc7\xc2\xe2\xd6\x69\x60\x69\xfc\x6c\x3d\x0e\x12\xd7\x7b\x98\xac\xee\xe0\xfa\xe3\x1a\xf0\x5d\x61\x29\x08\xac\x52\xc8\xe3\x00\x68\xd5\xe1\x64\x65\x4f\x8e\xf6\xb8\x16\x7a\x61\x5f\x11\x8f\x5d\x03\x12\x3c\x60\xbc\xe2\x35\xd0\xb3\x36\x31\x13\x31\xd4\xc2\x0e\x38\x0c\x8b\xdb\xb1\x14\x91\x6d\x2d\x49\xf5\x65\x6d\xb9\x15\x1b\x44\xf1\x6c\x47\x70\xcf\xf6\x65\x00\xd1\xba\x6d\xb8\x66\x22\x8f\xdc\x3c\x4e\x0d\xd3\x88\x0a\x88\xee\x9e\x32\x5b\x47\xa1\x4a\x02\x55\xe9\x92\xaf\xcb\xdd\x75\x8c\xb2\xb8\xdc\x9e\x8d\xaa\x16\x1e\xf6\x7f\xad\xea\x6d\x75\x58\xeb\xb8\x9e\x1f\xda\xc7\xbe\x2e\x9a\x59\x71\x47\xa5\x16\x0f\xf8\x9c\xfb\x4b\x3d\xfa\xcd\x9b\x49\xec\x69\xed\x3d\x76\xef\x0f\xab\xfb\x39\x4d\x7e\x69\x8b\xfd\x06\x3d\x63\x9a\xc7\xa1\x8b\x57\xc5\x0c\xb5\x6b\x93\xf3\x58\xb8\xfa\xa6\xe6\x06\x2e\x5f\x1e\xb8\xd3\x2a\x40\x35\x38\xac\xa3\xe8\xa3\xb9\xdb\xa4\xdd\x2c\x5f\xd3\x65\xd3\x03\xa7\x93\xb5\x2f\xb2\xd9\xda\xb8\x56\x33\x86\x5f\xd3\x67\xd3\x56\x30\x4c\x37\xdb\xe1\x50\x26\xe8\xff\xf2\xc9\x90\x9d\x6c\x87\xe1\xb2\x7b\x62\xff\x4b\x80\xd0\xbd\x6c\x87\x42\x93\x56\xbc\x83\x61\xeb\x50\x61\xe0\x1e\xf4\xef\x98\x58\xfe\xab\x47\xe0\x74\xb5\x6d\x18\x2c\xde\x26\x1e\xf1\x98\xd3\x7b\x5f\x95\xfe\xf3\xc2\x5b\x6b\x86\xba\xe9\x1a\x3a\x61\x15\xbe\x94\x96\x7a\xe0\xd4\x35\xba\xf8\x2b\xf0\xb9\xbd\x74\x1b\x56\x02\xd9\xbf\x36\xdc\xfe\x28\x64\xa3\x75\x8d\x5a\x11\xdb\x5f\x00\xd8\xdf\xbd\x6d\x4c\xa4\x1a\xb5\xf2\xbf\xaf\xd5\xbc\x13\x0c\xa9\x46\x8d\x62\xc0\xd7\x6a\xbd\x0d\x83\x54\x23\x47\x44\xf9\xb5\x9a\x77\xc3\x1f\xd5\xa8\xab\x30\xf6\xb5\x16\xa0\x13\xf2\xa8\x46\xad\xa2\xd5\xd7\xea\xc3\x89\x4e\x64\x71\xe8\xaf\xe3\xfd\x00\x1a\xb5\x9b\xa0\xe7\x89\xf2\xab\x22\x94\xe7\x0e\x52\xe3\xd5\xbf\xa2\xaf\x9e\xe7\x49\x8d\x65\xbe\x05\xff\xd7\x44\xb6\x8e\x6f\x80\x16\xe7\xfe\x35\x5d\x6e\x71\xb5\x60\x30\xb0\xa4\xf9\x57\xc5\xbf\x92\xe6\xb6\x69\xd7\x3b\xe6\x57\xed\xc3\x6d\xb8\xae\x51\x6b\x03\xfd\xb5\x7a\x69\x5b\xac\x6b\xe4\x3e\x60\x7c\xad\x0e\xdc\x36\xeb\x1a\x39\xe2\xb7\xaf\xd5\x83\xd3\xa4\x8a\x19\x64\x34\xd8\xbf\x5a\xf3\x9e\x39\x76\xdf\xcf\xc2\x70\x61\x15\xbf\xc8\xd1\xa0\xff\x5a\xd0\x74\xe3\x57\x3d\x00\x8f\x1f\xe5\xa9\x46\xd5\x57\x5c\x59\xd9\xd6\x63\x60\x90\xe5\x54\xe7\x8d\x05\xc8\x57\xdb\x22\xb6\xc1\xc7\x80\xd1\x1a\xa3\x70\x65\x44\xba\xc5\xaf\x84\xf5\x98\xa6\x15\xe3\xd0\x16\x33\x6d\xbf\x94\x7a\x19\x78\xaf\xdf\x4f\xde\x51\xf2\xc1\xf3\x03\xfe\xc2\x95\xa8\xc2\xcd\xc6\x0b\xb2\x76\xc8\xba\x0e\x1f\xdf\x33\xed\x97\xbb\x55\xb3\x54\xa1\x88\x65\xd3\x4a\xc4\x8a\xde\xb3\xc6\xd5\x33\x44\xa4\x66\x57\x40\xbd\xed\x68\x91\xff\x73\xa6\xcd\x39\x86\x5c\x8a\xd5\x43\xee\xd4\x95\x52\x3a\x52\x7a\xea\x88\xd7\xe8\x23\xc3\xf7\x2c\x7f\x53\xd1\xa9\x6a\x14\x29\xa1\xd2\xf4\x39\x43\xac\x52\xa6\xbe\x8a\xf4\x1c\x11\x44\xf3\x3f\xd6\x74\x4d\xa7\x4f\x09\x52\x91\x2f\xa7\x7f\x9a\x1f\x27\x39\x13\x8c\x70\xaf\xab\x11\x8f\x4f\x48\x14\x29\xb5\x41\xad\x70\x28\x97\x4b\xb0\xfc\xba\x9a\xae\x08\xd2\x5e\xd0\x5e\xac\xb5\x2b\x86\x6a\x3a\xfc\x7e\x32\x68\xb6\xce\x7b\x9e\x06\x8d\xc1\xbb\x32\xc8\xd3\xce\x06\x3b\x35\x75\x54\x56\x37\x0c\xa8\x09\xf3\xd2\x31\xdb\x74\x0b\xec\x70\xd4\xa6\x7b\xf2\xba\xa8\x21\x22\xbe\x07\xd3\x80\x77\x6c\x0b\xb6\x3c\xc9\xde\x01\x8e\xc2\xb6\xdf\x46\x64\x4f\xfa\xc2\x6b\x64\x62\xb6\x29\x9d\xb0\x66\x85\x77\x41\xca\x6b\x58\xa3\xe2\xb2\xa2\xe5\xc7\xc6\xbb\xf0\xe0\x5c\x6b\xe5\x79\x11\x5f\x13\xa5\x83\x7f\xad\x91\xef\xb5\x0a\x03\x74\x4d\xe2\x3f\xb4\xdd\x29\x69\xac\xc5\xe3\x6b\x1b\x62\xe0\xfe\x2d\x99\x12\xf4\xcb\x94\xa2\x77\x64\xca\x91\x20\x1f\xe8\x6b\x9a\x15\xe5\xa2\x1a\xd8\xce\x34\x76\xf2\x01\xac\xeb\x1a\xad\xf3\xed\xf0\x35\x1a\x6c\x72\xf1\x7e\x49\x94\x83\x2b\x09\xcb\x82\x72\x2a\x67\x34\x7e\x4b\xe4\xbc\xff\x41\xe2\x8a\xfd\x49\x37\x1b\x15\x97\x24\x7e\x47\xa0\x1a\xc0\x9a\x2b\xa7\x39\xdb\x34\xa7\xa7\x3b\xb4\xaa\x51\xef\xbd\x74\x3a\xf4\x88\x8a\x96\x24\x5f\x70\x5a\x3d\xb9\xcb\xc9\x0d\xcb\x4c\x68\x6d\x49\xcd\x6e\x4b\xb2\x9a\x2a\xef\x76\x2f\x98\xdc\x4a\xf2\xfb\xe4\xea\x94\xd2\x05\x5d\x4c\x47\x13\x8c\xb1\xcd\x1c\x5c\x35\xf4\xae\x24\xab\x15\x2d\xa7\x87\x0c\x65\xc5\xcd\xaa\xa8\xe8\xe2\x15\xe9\x78\x50\x73\xcc\x9d\xdc\x32\x4a\xfb\xd7\x4f\xc2\x57\x02\x34\x4e\x65\x47\x13\x08\x51\xb7\x44\x8d\xf2\x42\x99\xe1\x28\xa0\x35\x09\x78\x99\x3f\xa1\x37\x24\x5f\x4c\xb5\x5d\x8f\x16\x6a\xbe\xa0\x62\x59\x2c\xaa\xe9\xaf\x36\xe1\xbc\xa4\x74\xfa\xb3\xa1\x1a\x86\x75\x51\xe6\x31\xd3\xd7\x14\xed\xf2\x0a\xb8\xdb\x0b\x68\xf3\x40\x66\xbd\x0d\xe0\x8f\x0c\xf5\x1f\xa8\x43\x4f\x08\x1e\xaa\x9d\xe4\xbd\x9c\x84\x28\x1c\x78\x4f\x09\xe7\xc9\x80\x85\x1c\x10\x02\xf4\x93\xdd\xb7\x2a\x1b\x61\x14\x63\xfb\x22\xdc\x35\xbd\xef\x74\x1f\x45\x42\x00\x6d\xbb\xe7\xb5\x03\xa7\xb2\xb3\x4e\xf8\x6a\x0e\xd1\x70\x69\x99\xec\x5b\xf8\xf9\x8d\xa1\x5f\xc8\xac\xdf\x5c\xd8\x5e\x8b\x9d\x28\xc1\x6d\x28\xdf\x6e\x20\x5c\x37\x02\xaf\x13\xaf\xd6\x8f\xdb\xea\xc6\xce\x0c\x95\xd6\x8e\x00\x61\x10\x42\x38\x25\x3d\x00\xee\xdd\x9b\xfe\xf0\xf9\x4e\x9b\x18\xe9\x3a\x30\x90\x52\xcd\x73\x63\x05\xa9\x77\x7d\xf7\x4a\xff\x59\xed\xb8\xc1\x91\xfd\xbb\xfb\x67\x35\xe3\x44\x3f\x1e\xba\x43\x7f\xde\xd0\xba\xd1\x87\xbb\xd7\xfe\xcf\x6a\xcd\x0b\x9a\xdc\xb9\x76\x77\x1a\x6a\x54\x3a\x06\x9a\x72\x54\x36\x3a\xb3\x96\x90\x04\xf2\x46\x25\x5e\x65\x7b\x7d\xb6\x2e\xe3\x7a\x97\xf2\xe1\x81\xb0\x81\x81\xb0\xde\x8a\x7b\x5c\x74\xa7\x21\x13\xae\xb5\xe1\xf6\xfe\x5a\x78\xd6\x26\x90\x2d\x22\xb8\x1b\xb8\xb4\xa4\xf4\x1d\xe1\x1f\x68\xa9\xb5\x05\x64\x33\x4f\x75\x10\x86\xb3\x67\x2f\xdf\x5d\x9c\x1f\xff\x72\xae\x83\xad\x8d\xf6\x21\x12\x38\x0c\x9b\xa8\x1d\x86\xf1\x80\x62\x6c\xc2\x96\x28\xdd\xa7\x46\x64\xd9\x04\x40\xed\xb2\xb9\xaa\x58\xdd\x67\x6d\xff\xb5\x21\x6a\x33\xf1\x55\x82\xc0\x0e\xaa\xf7\x6d\x8d\x05\x8b\xac\x11\xc8\x43\x21\x61\x25\xe3\x3e\x40\xdd\x9c\x77\xed\xc0\xed\x32\x70\x1e\x99\x03\xf7\xa9\x38\x68\xde\x7c\x9b\x78\xac\x1e\x05\x93\x9d\x0c\x5b\xb9\xa7\x1d\x67\x03\x8e\x43\x80\x39\x44\x1c\xdf\x0f\x48\x8a\x3e\x0b\xfb\x07\xe8\xd4\x5f\x68\xcd\x27\x57\xad\x1c\x64\x1b\x41\x18\x68\xc6\x21\x08\x6c\x37\x41\x60\x5b\x08\xc2\x05\x51\x4e\xb7\x86\x64\x25\x3b\xae\x7a\x16\xd8\x99\xf7\xe5\xc4\x14\xa9\xe5\x59\x27\xcf\xce\xfe\x2a\xe5\x42\x2d\xe1\xe0\xf2\x0d\x0a\x89\x42\x14\xf6\x05\x56\x21\xf2\x0c\xe2\x5b\xff\x06\xf3\x9d\x08\xd2\x38\x71\xd8\x5e\x1d\x4e\x01\x19\x02\x8f\x43\x34\x98\x7e\xbf\x4d\x70\xf6\x79\x84\x75\xcb\x79\xf3\x97\x1a\xed\x1e\x3b\x8e\x00\x66\xb8\x9d\x7f\x9a\x08\x5e\xb7\x04\xf6\x89\x9b\xc6\xb3\xcf\x72\xa4\x97\x64\x02\xf8\x9e\x54\x06\xbd\xd9\x59\x05\xe1\x87\xdd\xd9\x95\xc2\x77\x67\x57\x8a\x47\xb8\xb3\x13\x70\xda\x2d\x07\x84\xb2\x50\x69\x24\x42\x88\xef\x1e\x58\x3b\xaa\x44\xec\x34\x3d\x86\x03\xfe\xf1\x1c\x3a\x2b\x2c\x39\xf5\x65\x2e\x3b\xb6\xda\x6e\xcf\xa9\x7d\xc1\xca\x36\x87\xa9\x2a\x9c\xef\xe0\xbe\x0b\xdd\x2a\x81\xdb\x5f\xe0\x2a\x78\x04\x1d\x65\x8d\x40\xe9\x4d\x04\x97\x7c\x5d\xf6\xe8\x73\xbf\x93\x42\xec\xdc\x97\xaa\xad\x10\x85\xaa\xb5\x39\x74\x1d\x78\x9c\x9b\x65\x31\xd5\x14\xab\xbe\x3d\xdb\x6b\xb5\xdd\xe2\x73\xcb\x7c\xef\x50\xd0\xce\x85\xe2\x8e\x77\x94\xd0\x2c\xfe\x8e\x02\x72\x94\x86\xf0\x35\x21\x72\x7b\x94\x6f\x20\x27\x0d\xbd\x97\x3d\x45\x85\xc8\x60\x49\xbe\xbd\x89\x56\x67\x24\x44\xa1\xaf\xce\x11\xa2\xb0\xab\x3f\x11\xa2\x6b\x02\xe0\x7c\x5b\x73\x85\x80\x35\x80\xe8\x4f\x0a\x5c\x95\xf5\x61\xc9\x48\xe3\xae\x29\xf4\x1f\x3a\x43\x74\x4e\x3b\x1e\x19\xd1\x29\xe9\xdf\x9c\x7e\xa4\x9e\x5e\xbc\xba\x72\xab\xcb\xac\x72\x51\xd2\x5f\xd8\x33\x0a\xa7\xe0\x4f\x0a\x20\xf2\xdf\x35\x47\x87\x22\x8a\x1e\x72\x90\xa3\xee\x7d\x9e\xeb\x9d\xea\xbc\x5c\x57\x82\x2e\x42\x68\x0f\xdb\xde\xe9\xab\xb4\xaf\x8b\x75\x45\x8d\xd5\x64\xc6\x59\xf6\x21\x44\xf7\x97\xeb\xcb\x4b\x4e\xab\xe9\x68\x82\x32\x92\x67\x94\x5b\x31\xa9\xbd\xb4\x6b\xed\x64\x8f\xfd\xea\xe9\x83\x25\xbd\x11\xc6\xaa\xfd\xd9\x96\x74\xcc\xa7\x83\xdb\x48\xe7\x46\xd1\xf0\x26\xb3\x75\x61\x5d\x03\xe8\xcd\x5c\xc3\x5a\x07\x2c\x0f\x2e\x04\x7c\xdc\x95\xb9\x13\x67\x55\xd2\x44\x2d\xb9\xd8\x6c\xc0\x13\x25\xb3\x3c\xd5\x4e\x35\xd0\x68\xa2\x50\xc9\xbd\xb2\xe3\x0f\x02\xf9\x3a\xb2\x2a\xf5\xf7\x26\xb5\x9d\x6c\xfc\xb4\x49\x3c\x73\x1c\xcf\x32\x65\x7d\x7f\xd5\xa8\x7c\xf7\x51\xd8\x27\xf8\xe8\xf2\xd1\x45\x4f\xcf\xd0\xdd\xae\xc2\xed\x3e\x43\x67\xbb\xca\x19\x65\x15\x74\xb3\xab\x90\x66\x8f\xd1\x45\xaf\x4c\x9f\xba\x34\x0d\xde\x3e\xa6\xb0\x69\xf8\x53\x53\xd6\x67\xcc\x5b\x45\x4c\x74\xbc\xad\x88\xc3\xba\xa3\xd3\x6d\x85\xdc\xe3\x0d\x9d\x6c\x2b\xe5\x30\xfb\xe8\x7c\x7b\xa1\xf6\x16\x80\x5e\x32\xfc\xd0\x56\x1e\x6c\xc5\x77\x8e\x04\xd1\xab\xa6\xb7\xfe\x96\x70\xd5\x06\xd1\x8f\x8f\xee\x70\xb7\xff\x2e\xf4\x64\x47\x8f\xee\xe9\x8a\x3e\xec\x28\xe8\x9e\xc9\xe8\xf7\x1d\x05\x3b\xa7\x32\x7a\xfa\xc8\xde\x4f\xcf\xd0\x9f\x8f\xec\xff\xf4\x0c\xbd\x7e\x3c\x04\xa7\x67\xe8\x87\x1d\xa5\x35\xbe\x1c\x2e\x7e\x27\x99\x13\x61\xea\xcd\xa3\x6b\xc8\x49\x46\xef\x76\x14\xb7\xbb\xe4\x8f\x5d\x0b\xaf\x37\xc7\x37\x3b\x8a\x68\xfd\x2a\xf4\xd3\xae\x56\xae\x04\x2d\xd1\x3f\x77\x4e\x4d\xa3\xe2\x84\x7e\x79\x70\x0a\xd1\xaf\x4d\x11\x87\x84\xa3\x9f\x1f\x8d\x98\x0f\x3b\x97\x43\xbc\x1c\xe8\xe2\xc1\xe5\x21\x9f\x55\x4b\x2d\x91\x28\x5b\x47\x9a\x8d\xeb\x8b\xd2\x79\x07\x2a\x75\xe0\xdb\x56\x34\x85\xbf\xfb\x9f\x29\xd9\xfb\x73\x9e\xc6\x93\xbd\xff\xef\x42\xfe\xfa\xb7\xbd\x74\xaf\xfd\xf8\xe6\xbb\x58\xd0\x4a\x1d\x2d\x23\x12\x45\xbc\x0e\x95\x63\x5b\x25\x87\xde\xfb\x74\xc3\x83\xac\xe0\x45\xb9\xb7\x2a\x8b\xff\x9f\xbd\x37\xef\x8f\xda\x48\x1e\x87\xff\xff\xbe\x0a\x8d\x36\x3b\xa8\x99\x76\x5b\xc7\xdc\x83\x76\x16\x1c\xc0\x59\x4c\x20\x40\x48\x96\xf1\x84\x9f\x2c\xcb\xb6\x82\x2c\x79\x25\x99\x23\x9e\x79\x5e\xfb\xf3\xe9\xaa\x6e\xa9\xa5\xd1\xf8\xe0\x26\x38\xcb\x7a\x74\xb4\xfa\xac\xae\xae\xbb\x0e\xc2\x88\x93\xa7\x71\xbe\x71\xe0\xf9\xca\xd5\x46\x96\xfa\xca\xdd\x69\x1a\x2a\x77\xa0\x2d\xc8\x95\x07\x9c\x87\xd0\x8e\x43\x08\x00\xb6\x71\x18\xbd\x3b\x39\x52\xe9\xdc\xf3\x74\x8f\x79\x2a\xe2\x7f\x0a\xfd\x63\x98\x2a\x32\x2b\x21\x92\x98\xae\x3c\xc1\xb0\x8b\xf2\x31\x19\xaf\xcd\xd8\xdc\xfc\x41\xbd\x98\x12\x20\x27\x4d\xd5\x30\x03\x8a\x52\xbe\xcc\x3f\xd4\x72\x5d\xaf\x92\x9b\x38\xe4\xdf\x88\x27\x2d\x13\xb3\x54\x46\xed\x76\x0b\xb4\x16\x5b\x77\x5f\x86\xd9\x4f\x70\x0e\xfe\x58\x04\x99\xad\x68\x4f\xe5\x63\x82\xb1\x52\x4b\xb9\xe1\x62\x61\xac\x1c\xe7\xed\x76\xb4\x26\xcf\x13\x46\x59\x19\x4b\x19\x94\xe8\x0e\x86\xc4\xbd\x6a\x4f\xd4\x18\x1e\x95\x09\x29\xd2\xa3\xaa\x1a\xbb\x73\x12\x53\x79\xd2\x79\x7a\x36\xa7\x51\x25\x27\xaf\x08\xf4\xa9\xba\xb0\x9e\x9f\xe6\xb5\xdd\xf6\x64\xb4\xd6\x86\xd8\x3d\x71\x5a\xc6\x31\x96\x31\x77\xf9\x1a\x54\xc2\xdb\x4c\x88\x57\x09\x7e\xa3\xc4\x0d\x87\xf2\xd3\x4a\xe9\x71\x35\x36\x57\x92\xae\x06\x33\x89\x26\xc1\x04\xe8\xe9\x55\xfb\xc7\xd5\x4c\xce\xa1\x1b\x4c\x3c\x35\x04\x47\xc1\x34\x43\xd2\xbe\x28\x8c\x5f\x89\xcc\x94\x82\x3f\xe1\x77\x61\x8d\xab\x4d\x83\x48\xc7\x5c\x38\x81\x1b\x0a\xfa\x8a\x56\x72\xa2\x17\xf1\x72\x09\x0d\xd4\xc5\xe5\xbd\x6a\xb7\x5b\x32\xff\x1d\x7a\x1b\x8b\xbc\x77\x90\x20\x70\x25\xda\x80\xba\x36\x49\x6a\x04\x22\x10\xb7\x0b\x73\x1d\x92\x09\xdf\x5c\x61\x7c\x1a\x2c\xeb\xf1\xfc\x53\x72\xd6\x5c\x2a\x84\xc0\x23\x95\xc4\x08\x04\x9d\xe8\x43\xb5\xf9\x70\xc2\x1f\xd4\x9a\x0f\xd1\x61\xa8\xda\xd3\xa9\x7a\x33\x86\x26\x03\xa2\x06\x4f\x49\x0b\xc6\xa4\x25\x64\xcd\x6f\xd3\xc5\xa2\xf5\x36\x65\x71\x22\xc1\x7d\x2b\x29\x63\x16\x3e\x42\xd5\x6d\x4a\xa8\xb7\xf2\x05\x10\xf9\x3f\x26\xc7\xf7\xbc\x2c\xff\xcd\x8b\x5e\x09\x6e\xc5\x47\x43\x5f\x8c\xfe\x24\xaf\x7e\x2b\x02\x69\xd4\xbf\x72\x3d\xf1\x7c\xcf\x6d\x29\xe0\x75\x94\x96\x71\xf4\x10\x5a\x6a\xea\x42\x25\x43\x87\x52\x5b\xbb\x0d\xce\xf2\x60\xed\x20\x52\x24\x9d\xbf\x89\x20\x3d\xc1\x6a\x5e\x0d\x11\x92\x37\x64\x15\xa5\xe8\x4a\x31\x99\x4e\x4d\xbf\xa9\xf3\x19\x5a\xf1\x86\x15\xa9\xd8\x51\xab\xcf\x37\x3e\x86\xcc\x2c\xa3\xae\x88\x6d\x1a\xb1\xdf\xda\x6d\x31\x64\xd5\xf3\x4d\x6c\xc8\x93\x54\x24\x01\x57\xe2\x9f\xa4\x4a\x1c\xe3\xdf\x60\x67\x03\x24\x89\x90\x86\x18\xc8\xa7\xbc\x77\x05\x22\x46\x79\x9a\x39\xc9\x6f\xf1\xbe\xab\xa1\x39\xf8\xfd\x2c\x9f\x4b\x14\x25\x0b\x1d\x56\xcb\x1c\x62\x11\x05\xa4\x4e\x53\xd5\xcc\x40\xa4\x75\xad\x0f\x45\x39\xe0\x94\x10\xd3\x4d\x31\x24\x84\xf9\xc1\xcc\x9b\x4f\x2c\xd7\x85\x18\x1f\x7c\x7f\xe4\x5e\x1e\x4c\xa3\x55\x5f\x4c\x23\x20\xe3\xc3\x15\x30\xdf\xfe\x6c\x7d\x6a\xb7\xa3\x46\x07\x50\xa3\xd2\x9f\xe7\x69\xd5\x83\xd7\x90\xa1\xa5\x38\x8e\x9a\x9e\x2d\xc7\x39\x61\xf9\x1e\x0d\xdd\x9c\x9d\x62\x1e\x99\xc5\xa2\x01\x0c\x0e\x05\x18\xd0\x74\xdd\x98\x14\x80\x10\x00\x42\x0b\x44\xea\x55\x72\x8a\x95\x28\xd5\x6b\x46\xa9\xd2\x44\x07\x0b\x4e\xf2\x55\xdc\x69\xe4\xcd\xa7\x28\x44\xcf\xc1\x57\xa9\xf0\x5c\x75\x95\x48\xf6\xca\x63\x42\xf3\x76\x5b\xf7\x93\xe3\x93\x28\x10\xd2\x53\x25\xb0\xdd\x54\x94\x96\xdf\xee\x24\xde\xfe\x36\xd8\x63\x70\x70\x1e\x7b\x0d\x0e\xe0\x51\xe2\xed\xeb\x75\x2b\x02\x65\x14\x90\x2d\x68\x6d\xad\xe4\xec\xdc\x16\xc5\x41\x25\x69\x53\x3e\x03\xc1\x79\xb4\x5c\x49\xca\xd1\x54\x5a\xb4\xe4\x84\x50\x80\x86\x9c\x9e\xe5\x7b\xe3\x94\x8a\xf5\x1e\x87\x4b\x88\x6f\x04\x88\x22\x95\xda\x97\x25\x0d\x24\x44\xa6\x2a\x44\x86\x46\x0a\x68\xa5\x74\xf0\x15\x00\x9f\xa7\xef\x8a\x21\x57\xe2\x1d\x40\x48\xd5\xca\xdc\xd3\xd0\xc5\x35\x14\x7a\xb9\xe7\x61\xf0\x66\xb1\x58\xb3\xa4\x64\xfa\x14\x0e\x3c\xc5\xd5\x48\x50\x56\x40\xf0\xc9\x4c\x66\x00\x4d\xe5\xe6\x20\x67\x21\xf3\x95\xc3\xe4\x69\xee\xf9\xaf\xe4\xd8\x26\xbc\xaf\xfc\xff\xe1\x01\x44\x15\x53\x8a\x26\xe9\x3d\x31\x30\xa0\x2d\x2b\xb9\x29\x9e\x1d\x05\x1a\xba\x54\x6b\x42\x2e\xa9\x86\x1d\xd4\xf6\xc3\x7d\x2d\x4e\x20\xf7\xd3\xfe\xa9\x1f\x68\xf9\x51\x50\x94\xdb\x0b\xc2\xf8\x50\x13\x13\xbe\xcf\x74\xb2\x3c\x08\x63\x2f\x8a\xde\x35\x77\x33\x39\x31\xc8\x72\x09\x81\xb3\x50\x44\xce\x7b\xa1\x0e\xcf\xb5\x29\x24\x69\xad\x3c\xb3\xa8\xb8\x05\x49\x67\xc8\xeb\x73\x43\x1a\x32\x4f\x6e\xb0\x2d\x88\x4c\x50\x20\x0a\x4e\xc6\xa9\xb2\xf2\xcc\x20\x32\xb0\x53\xc8\x84\xe1\xd4\x7e\xf9\x76\x82\xe4\x81\x39\x09\x4b\x88\x08\x25\x8e\xf2\xdd\x74\x16\xce\x69\x5c\xdf\xd2\x3e\x91\xb9\x1c\x63\x30\x92\x5b\xd3\x15\xc3\xa3\x3e\x6a\xbb\x63\x91\xe7\x7d\x99\xa6\x90\x3e\xa6\x09\xf1\x7a\xea\xe4\x6c\x81\x2f\x9c\xe2\x37\xbe\x72\x7a\x7b\x55\xe8\x13\x60\x23\x28\x0a\x37\x58\x2c\xf4\xa3\x3c\x3f\x19\x6f\x6e\xbe\x79\xf3\x86\xbd\x71\x58\x92\x1e\x6e\x5a\xa3\xd1\x68\xf3\xed\x51\x7e\x1c\x41\x7a\x77\x02\x61\xf1\x9e\x72\xd2\x27\x27\x84\x48\x58\xc7\x1d\xd9\x08\x3e\x95\x24\xa9\xa9\xb2\x4c\x4a\x00\xd9\xb4\xbe\x5c\x55\x78\xbb\xe7\x85\x51\xb0\xaf\xe5\x49\x09\x66\xda\x0d\xbd\x93\x77\xf4\x1b\x63\x8d\x03\x23\x6e\xf6\x22\x65\xea\x1b\x2f\x03\x00\x2c\x4a\x07\xfb\xda\x9b\x30\x3f\x02\x48\x54\x58\x60\x15\x6a\x45\xbe\xb1\xf3\x67\xa0\xc5\xbb\xaa\x2a\xa7\xae\xd8\x4f\xb5\x43\x62\x47\xdc\xc8\xb4\xa2\x42\xed\xf8\x34\xe3\x5b\xa4\xe8\x67\xf9\x4a\x74\x2f\x5d\x81\xd3\x0f\xee\x00\x36\xca\xa7\xeb\xc8\x7b\x1d\x68\x5e\xfc\x4e\x2b\x80\x53\x66\x61\x13\x90\x9b\xaa\x71\x7e\x3f\x45\xc3\x85\x2a\xba\xd6\xac\x12\x1f\xeb\xa3\x37\x2b\x2c\xaf\x34\x30\x69\x96\xb3\x5c\x4f\x4a\xe1\x7d\x94\x85\x86\x5a\x35\x79\xb0\x69\x90\x1e\xd9\x4f\xd2\x34\xf0\xf3\xa2\xe5\x02\xb9\x43\xd6\xd0\x8f\xd1\x2a\xd4\x08\x90\xb4\xd2\xa2\x3c\x24\x05\x12\x09\x4b\xf3\xeb\xd4\x08\xf9\xa9\x27\x51\xc3\xf4\x20\x94\x64\x76\x4e\xc6\x7b\xc5\x4d\x40\xf3\x75\x11\xbb\x3d\x08\xc9\xff\x6b\xfc\x2a\x4e\xde\xc4\x2b\x32\x27\x42\x6b\x58\x7c\x15\x63\x8b\x40\x42\x92\x86\xf2\x96\x15\x42\xfc\x52\x5d\xe3\x5f\x95\xc1\x32\x14\xa9\x81\xae\x83\x25\x11\xc5\x40\x2e\xe6\xa4\x22\x72\x80\xe9\x9e\x42\x80\xd6\xe3\x20\xcb\xbc\xc3\x00\x82\x59\x66\xc9\x69\xca\x37\xfd\xce\x62\x11\xb1\x83\x30\x0a\x84\x1e\x9c\xd7\x12\xb1\x28\x8c\x21\xfa\x23\xff\xfd\xf9\xf4\x78\x2f\x48\x17\x0b\x5e\x37\x47\xdb\xd1\xe9\x71\xcc\xdf\xe1\x55\xf1\x96\x8c\x3d\x57\xff\x35\xf6\xbd\xd3\xc3\xa3\x5c\xd3\x3b\x4f\xf3\x34\x8c\x0f\x8d\x48\x72\xe3\xe2\x70\x2f\xb0\x24\xf4\xab\xa6\x00\x63\x7c\xb6\xca\x17\x53\x44\xc4\xe5\x03\x43\x0f\xf8\xb5\x4e\xcf\xaa\x1a\x2e\x31\xb0\x31\x18\x89\x07\x1c\x38\xc6\x39\xe5\x7d\x8f\x93\x71\x40\xfd\x24\x8a\x93\x71\x48\xe1\xdb\x71\xb4\x24\x63\xc3\x48\xeb\x86\x5b\xa2\xfe\xb2\x2d\x1d\x94\xf2\x6a\x77\x8a\xd6\x5b\x16\x6d\x99\xe2\x30\xa2\x18\xe4\x3c\x88\xf3\x1f\x91\xea\x51\x15\x76\xcd\x2a\x4a\xb0\x6a\xd0\x05\x91\xf4\x18\x3f\x0e\xf6\xf9\xa0\x6a\xde\x0e\x8d\x9a\x78\x08\x79\xb5\x54\xac\x4a\x53\x06\xdd\x2a\xb4\x8d\xb5\xd6\x52\x5a\x4e\xda\x7b\x78\x53\x40\x36\x1c\x99\x0a\xa7\xa2\x2d\x4c\x91\x08\xad\x8e\x62\xb1\xe0\xdb\x36\x89\x02\xec\x54\x25\xd8\xf0\x8b\xb4\x92\x20\x5a\x44\x34\x93\x3b\x03\xee\x1e\xa0\x11\xf9\xe3\x34\x39\x0e\xb3\xa0\x12\x30\x2b\x62\x87\xae\xa7\xf2\xab\x0f\x95\x1d\x50\x64\x50\x86\x5a\x7e\xaf\xd4\xf9\xd4\x8d\xa4\xec\xc0\xe3\x94\x32\x3e\x94\x31\x38\xa9\x1a\x0b\x1b\x9f\x29\x0c\x83\x88\xf0\xc3\x7e\x47\xad\xab\xf0\x3d\x90\x22\x0c\x7c\x77\x84\xa2\x4f\x0c\xfa\x83\xd5\xfe\x2e\xe9\x2c\x2c\x71\x48\xcf\xe0\x2c\xe0\x5c\x05\x9f\xe9\xec\x74\x2f\x4f\x03\x34\xd0\x57\x06\xb4\x93\xa2\xf2\xf2\x77\x30\x5d\x57\x98\x40\x35\xb4\xf1\xeb\xb4\xb0\xae\x38\xf6\x64\x24\x2e\x61\xd4\x57\xbb\xbf\x57\xbb\x7f\xe3\x15\x22\x93\xbf\x6a\xaf\x22\xaf\x29\x58\x41\x64\x90\x25\xbe\x7f\x5e\x7c\x99\x94\xb2\x98\x62\x62\xef\x43\xce\xd2\xbd\x29\x54\xc9\xfb\x27\x28\xf9\xb2\xd7\x07\xa5\x6c\xa1\x15\x70\x0a\x50\x09\xfb\xfd\xf4\x5d\x9c\x7b\x6f\x15\x62\x5c\x1e\x6d\x80\xe4\x6f\xe8\x1d\xaf\xa3\xdf\xe0\xc8\x9e\x9f\x72\xaf\xbd\x28\xdc\x17\xc7\xcb\x53\xac\xb4\x7a\xac\xdc\xae\xd3\xf2\x40\x2a\x55\xaa\x82\xec\x72\x11\x2c\xb2\xb6\x17\x04\xb1\x86\x3b\x66\xbf\x48\xd2\xfa\xc6\xbb\xa0\xce\x50\xad\x80\xb3\x00\x65\x0d\xe5\x98\xf7\xaa\x2c\xfa\x24\x82\x05\x30\x27\x92\xca\xe4\xbc\x79\x81\xf9\x30\x57\x5a\xa8\x22\x6e\xdc\xce\xa4\x39\x40\xfa\xf9\x4c\xcb\x8d\x4c\x2b\x6a\x96\x33\xe7\xc5\x1a\xc6\xc1\xe7\xc3\x44\x94\xbc\x6a\x50\x15\xce\xa2\x79\x55\x0e\xdf\x6e\xb7\x20\xd1\x4a\xd1\x2d\x49\x09\x93\x55\x2e\xea\x86\xde\x89\xf8\x04\xfb\x82\xa2\x2f\x28\x40\x4f\x93\x4d\x29\xe7\xb4\xb7\xa4\xbe\x9b\x1a\xfa\x0a\x23\xa0\x13\x1a\xf3\x17\x4d\x52\x10\x9d\xd0\x84\xbf\xf3\xf6\x93\x93\xea\xe3\xcc\x35\x02\x78\xb3\x86\x17\xd1\x09\x44\x0c\x5f\x65\x80\x20\x25\x65\x8d\x29\x8b\x0a\x46\x0e\x57\xcd\x2a\xb2\x5b\xbb\x67\x05\x4d\x83\xfe\x36\x75\x0e\x61\x9c\xd3\x95\x5e\x8f\x7d\xda\x34\x98\x71\x4c\x6b\xe3\x18\x27\x74\x5d\xff\xc7\x01\x5d\xed\xfb\x38\xa3\x2b\x7c\xe6\x78\x36\x5f\xd2\x88\xc5\x1e\xf8\x7f\x71\x00\xa4\x11\xbb\x87\x77\x79\x13\x4f\xc3\x4b\xe4\x25\xdc\xbe\x4b\x65\x16\x64\x0b\x22\xdf\x3f\xe7\x38\x89\x23\x80\x49\x2d\xee\x42\xc4\x12\x8f\x06\x05\x22\x41\x1e\x32\x57\x79\xc8\x00\x1b\xe5\x2c\xe4\x6c\x8e\x52\xc0\xe7\xa9\x11\xb1\xa7\xb4\x30\xd3\x39\x93\xe2\x8a\x02\x18\x31\x78\xbf\x92\x8e\x43\x65\xff\xe5\xc6\x29\x16\x81\xa6\x2e\xe8\x92\x8d\x90\x4c\xd2\xa9\x90\x73\xe4\x64\x0c\x13\x70\xe4\x65\x46\x48\x0a\xbd\x86\x48\x0b\xd9\x10\xc7\xf6\x10\x7b\xe5\xcd\x42\xd1\xcd\x86\xc1\x14\x5a\x89\xd4\x85\x11\xf9\xa2\xe1\x94\x34\x05\x89\x15\x35\x62\x14\x57\x23\x75\x23\xf6\x97\x27\x8a\x63\x50\xdc\x20\x4b\xa2\xd7\x81\x21\x4d\xf0\x64\x53\xae\xa9\x30\xbd\x4f\x2b\x52\x47\x18\x12\xaf\x02\xc3\x10\xe7\x45\xb4\x04\xb8\xe3\xf4\x9d\x7c\xcd\x57\xec\xb8\xf0\x79\x12\x92\x11\x51\x5a\xa2\x25\x83\x90\x15\x6e\xbb\x6c\xf9\xb8\xd4\xc5\x14\x0a\x53\x45\x6e\xa8\x2e\x56\xa9\xac\x29\x63\x04\xaf\x46\xe3\x08\x49\x30\x0b\xd5\x68\x1c\xe1\x7c\x12\x4a\xa1\x23\xce\xea\x8c\xcf\xa9\x39\xf1\xcb\x40\xc7\xbe\x94\x43\xc4\x6e\x30\xf3\x01\x33\xc5\x15\xda\x56\x9a\xe1\xa5\xa9\x11\xc3\xb4\xc2\x3a\xc7\x84\xc6\x4d\x5a\x37\x69\x99\x22\x62\xd2\xc6\xaa\x46\x24\x9e\xf0\x07\x95\x18\xc1\xb2\x32\x8c\xf1\x5b\xdc\x2e\x45\x2e\xc6\x22\x4a\x08\x0d\x64\xc8\xf2\x54\x0d\xa6\x0d\x22\xe3\x14\xe2\x68\x73\x5e\x28\x15\x14\xc2\x9a\xd0\xdb\x46\xea\x42\xcc\xed\xa6\xd1\x81\x40\x3c\x25\xcb\x65\x81\x96\x73\x69\x59\x00\xee\x6d\x32\xe0\x4d\x60\x14\xcf\x89\x24\x10\xa1\x30\x9a\x18\x40\x59\x11\xa2\x87\x17\xc5\x4b\x95\x02\x79\x09\x5b\xbf\xb8\xf5\x30\x6c\x67\x33\x5d\xe9\x55\xac\x96\xcf\x14\x5a\x32\x67\xe5\x4d\xdd\x23\x11\xa8\x4c\x30\x1e\x58\x89\xc9\x57\x26\x95\x2d\x13\x18\x28\x13\x07\xa2\x9a\xd9\x9c\x82\x80\x3a\xaf\xa4\x68\xe5\x54\x53\xcb\x75\x83\x76\x5b\x49\x37\x49\x28\x30\x71\x4a\x9e\x5b\x8f\xd0\x90\x94\xe0\x66\x4e\xd2\x72\x09\xd2\x52\xe2\x15\xce\x52\x94\xca\xfb\x97\x91\xca\xfb\x64\xa9\x5a\xc8\x56\x58\xed\xaa\x80\x6a\xfa\x5c\xf6\x9c\x8c\xf7\x8b\x4b\xea\x55\x82\xd0\x23\xc2\x3e\xf3\x9a\x6d\x1f\xca\x13\xdb\x2b\xe5\x60\x69\x6a\x28\xc9\x56\xdc\xca\x88\x39\x68\x86\xed\xf6\x36\xea\x33\xa8\x10\xbe\x9d\x8a\x5b\x4f\xd9\xf0\x81\xb1\xb2\xdb\x69\x6d\x73\x4f\x20\xcd\xea\xc4\xab\x66\x34\x91\xe1\xb0\x2b\x5a\x9e\x40\xd5\xf1\xc0\xb8\x83\x59\x3e\x27\xcb\xfa\xb8\xc0\xe0\xb9\xea\x5c\x1a\x1e\x18\x3a\xda\xbb\xec\x05\x87\x61\xcc\xc9\x72\x88\x30\x99\x27\x3b\xc9\x9b\x20\xdd\xf2\x32\x88\x2c\x29\x4f\x02\x3e\xe9\x35\x7b\xf5\x49\x2d\xb9\x31\xa1\x81\x11\x0a\xdf\x94\x52\xf6\xa2\x6c\x7e\x5c\x89\xc2\x51\x56\x07\x5b\x9a\xa2\xf5\x88\x88\x66\xd4\x0f\x56\x5b\xa8\x17\x09\x25\xde\x28\xc6\x13\xc4\xfb\x95\xfa\xca\xc4\x4f\xe7\x74\x58\xa9\x11\x24\xa8\x98\xa6\xb9\xe8\x25\xaf\x93\x9f\xd2\xe7\xd1\xd3\x28\x46\x3c\x49\x93\xd7\xe1\x7e\xb0\xaf\x19\x0a\x6f\xde\xd1\x89\xa4\x0f\x93\x38\xd0\x92\x03\xed\x86\x32\xf7\x37\xa8\x76\xa3\x9c\x0b\x7e\x57\x0c\xe4\x06\xd5\x92\x54\xbc\xe5\xb7\x40\x3b\x0b\xc3\x79\x25\xa3\xd4\xba\x79\xaa\x64\x9d\xe2\x07\xcf\xe3\xb0\xdd\x5e\xb5\xae\x5d\x13\x7d\xcf\x13\xae\xd8\x8f\xc3\xea\xee\xfe\xd8\x6a\xcb\x65\x35\x41\x6b\x45\xab\xce\x79\x51\x7a\x3f\x6c\xb7\xef\x83\x01\xc1\xb4\xc9\x36\xf8\x7e\x48\xc6\xbf\x84\xed\xf6\x2f\xb2\x48\xb3\x4d\xd4\x2f\x21\xa9\x39\x58\x47\xec\x37\xcc\xf7\x71\x58\xe8\x6d\x6a\x26\xae\x9e\x11\x55\x70\x6e\x6b\x25\x46\xf5\x1a\x7e\xfe\xad\x3a\x67\x2d\x53\x71\x3c\x78\x0f\x27\x0b\x9a\xbb\xde\xaa\xa3\x05\x0d\x5c\x29\xb8\x2a\xc8\xbc\x06\x47\x88\x4a\x4d\x88\x3c\x82\x4a\xca\x7e\xf3\x96\x9a\x7c\x4d\x2e\x11\xf9\x49\x8e\xa0\x92\xe7\x6d\x66\x0a\xca\x2d\x72\xbd\x69\x50\xf4\x27\x98\x98\xb7\xa2\xa6\x5a\xee\x16\xb5\x44\xb5\x5a\x50\xbc\x72\xbe\x15\xa2\x8a\x88\x91\x5e\xb5\x64\xec\x77\x85\x5a\x15\x53\xfe\xaa\x02\xa6\x34\x97\x1e\xf1\x3f\x56\xc1\x77\xb2\x52\x8e\xe6\xf5\x32\xf4\x1c\x5d\x8b\xc4\xf8\x34\x17\xba\x96\x0b\xc6\xf0\xf3\xd3\xca\x28\x68\x70\xd1\x38\xfe\xaa\xf5\x8f\x06\x32\x19\xf4\xbd\x95\x11\x36\x94\xa5\xc1\x6a\xb9\x0b\xc7\x93\xd3\x10\xf2\x6e\x34\x0d\x66\x6d\x78\x4f\xef\xa2\x91\xfc\x59\x9b\x79\x44\x06\xf5\xf5\xa8\x95\xa2\x42\x80\x9f\x9f\xab\xf1\x2a\x06\x8c\x6a\xaf\x75\x0b\xb1\x62\xa7\x7a\x25\x88\x7a\xb2\x06\xa2\x56\xd7\xa1\xb9\x64\xd3\x8a\x05\x2d\x48\x0b\x71\xf1\x82\x04\x34\xc4\xa8\x92\xe9\x74\x9d\x0f\x4d\x94\x92\xf1\x9d\xb0\xdd\x6e\x72\xbe\xb9\x13\x12\xea\xa5\xd3\x60\xcd\xa7\x5e\x4a\xc6\xbf\x86\xed\x76\xd0\xf0\xe9\xaf\x21\xa1\xc0\x98\x34\x3b\xbe\x71\x6a\x76\xfc\x5b\x48\x91\xae\x1d\xff\x2f\x5c\x92\x0a\xce\x54\xe9\xda\x6b\x4e\xe6\x0b\x73\x32\xb0\xe3\x56\xd6\x71\x52\x30\x2d\x3f\x84\x60\x4a\x20\xe2\x57\x7a\xc6\x0f\xa1\xca\xd2\xfc\x07\xdf\x62\x84\x4d\xcf\xf8\x4f\xe5\xe5\x03\x7c\xd9\x18\x3d\xd2\x53\x72\xd4\x41\x3e\x24\xe8\x7f\xc3\x2a\x07\x24\x9f\x05\xea\x2a\x07\xf3\x49\xa0\xae\x72\x88\x89\x67\x38\x17\x91\x37\x70\x11\x39\xe7\x22\xc2\x03\xc3\x5f\xb7\xca\x3e\x29\xd8\x15\x9f\x50\xff\xc2\x55\xf6\x5d\x5f\x5d\x65\x7f\xc2\x1f\x34\xd0\xe1\x7e\x35\x27\x8d\x8f\xab\x9c\xba\x72\xd9\xe8\x83\x50\x5d\x71\x38\x65\x38\x19\x14\xaa\x34\x10\xac\x78\xc8\x49\x76\x58\x71\xe8\xc0\x76\xc9\xb3\x34\x10\xf9\x46\xe8\x02\x89\xbf\x76\xd5\xc3\x52\x69\xd1\x72\xdd\xdf\xe5\x1a\xd5\x03\x83\x22\xcd\x21\x3b\x3b\xf9\x5d\xc1\x53\x84\x7a\x82\x95\x41\x7a\x9d\x13\x45\x64\x99\xa5\xe7\x46\xd6\x6f\x88\x0c\x53\xd7\xcd\x81\xa9\xed\xea\xa7\x60\x0e\xd0\xf0\x5c\x04\xfe\x59\x95\x9e\xd0\x4a\x57\xce\x4f\x34\x70\x51\x6f\x9a\xbe\x16\x1d\x6a\x7a\x75\xc9\x3e\xad\x43\xed\xb5\x40\xf3\x1c\xc5\x4b\x93\x91\xc6\xfe\xa5\xe7\x18\x9f\x6c\x58\xb7\xd2\x06\x29\xab\x92\x82\x0d\xc6\xb1\xbe\x0a\x31\x96\xa2\x23\xab\x63\x7a\x91\x56\x4e\x52\x10\xa4\x35\xc6\xa0\xae\x59\x34\xdc\x16\x32\x7b\xf1\x09\x08\xfc\x85\x12\x4a\xaa\x88\x20\xea\xd4\x43\xb5\xfe\xa3\x86\x45\x5b\xd1\x13\x01\x56\xd0\xc3\x38\x0f\x52\xf4\x31\xd4\x51\x76\x5e\x5a\xa2\xf1\xfb\xc5\x62\x47\x6e\xc2\x06\xcb\x4e\x25\x0b\xde\xcc\x9b\x2b\x71\xa5\x9a\xd2\x0e\x2a\x7a\x2c\xc8\xba\x48\x8d\xc8\x7d\x9d\xaa\x49\x0a\xfe\xdc\x6b\xcc\x30\x02\x9a\x37\x50\x36\x9c\x2b\xd5\xaf\xa9\x1b\xb6\xd6\xdb\x47\x1d\x06\x79\x1e\xa4\x59\x21\xeb\x97\x8d\x82\xb5\xc5\x81\x08\x83\x11\x09\xc5\xd8\xb1\x57\x04\x25\x93\xea\x24\x29\xb1\x11\x8a\x26\x91\xf7\x83\x3d\x2f\x32\xe6\x45\x4d\x09\x49\xdf\xa5\x46\x0e\x09\x49\x69\x24\x13\x60\x7c\x8e\xd1\x5e\x3c\xcc\xbd\x54\xe1\x76\x3f\xda\x10\x85\x90\xbc\x02\x8a\x25\x08\x14\xe9\x08\xea\x9b\x20\x72\x9f\x16\x3d\x2b\xa2\x7f\x35\xa9\x00\xf8\xf7\x6f\x8e\x82\xf8\x47\xd4\x63\xd5\xeb\x69\x05\x8a\x03\x86\xd4\xce\xb2\x34\xf8\x33\xf0\x31\x81\x67\x45\xe6\x20\xd5\x40\x52\xf1\x84\x4a\xbb\xba\xba\x8a\x33\x83\x4c\x27\x64\xa2\x6c\x29\x21\x22\x17\x39\xb9\x0b\x17\x10\xf6\xc0\x9b\xa0\xc2\xf2\x45\x2a\xf5\x97\x05\x1c\xa9\x0e\xfd\x42\xe4\x1f\xc9\xb8\xc9\xc7\xde\x8a\x5f\xcf\x86\x25\xb9\xd8\xc4\x2b\x70\x52\x04\x66\xa3\x51\xbb\xed\xd5\xe5\xf2\x94\x37\x0e\x41\xc5\x93\xe8\xdd\x41\x18\x45\xbf\xa5\xde\xc9\xbd\xe8\x34\x3b\x6a\xc4\xe9\x42\x1d\xda\x6e\x8b\x8d\xce\xee\x7b\x95\x01\x46\xde\x64\x45\xdf\x9a\x2b\xfa\xd6\x55\x28\xf0\x00\x08\x96\x4b\xfa\xba\x72\xb8\x20\xc8\x37\x3c\xab\x96\x93\x70\xd3\xf4\xb0\x5a\x92\x43\x4f\xfd\x41\xb5\x84\x0a\x1f\xeb\x5e\x54\xbf\x90\x73\x86\x2f\x77\xbc\xbf\xde\x55\x3f\xfc\x73\xaf\xb9\xfc\xea\x1c\x5f\xae\x18\xcc\xf4\x9b\xd4\x3d\x5b\xc2\xd5\xdb\xb4\x39\x07\x53\xe9\x8b\x74\x37\xad\x78\x55\x67\xe9\xa4\xb5\x86\x61\xa8\x60\x7e\x65\x03\xd1\x7c\x8d\x21\x32\xbb\xa7\xea\x6a\x5a\x97\x30\x7e\xf2\x6a\x3b\xa4\x66\x05\x95\xa4\x85\x25\x20\xb6\x11\xa4\xd2\x10\xf0\xff\x55\xc7\xf7\xff\xa4\x86\x37\x70\xf3\x55\x33\x54\xde\x1d\x13\x6c\xce\xab\xb1\x07\x03\xf7\x60\x45\x68\xa3\xc8\x67\xd6\xd8\x45\x05\x6a\xe2\x22\x42\x83\xaa\xe1\x6a\xb0\x62\x06\x95\xa3\x05\x14\x2f\x2a\x38\x51\xd9\x8f\x0d\x8b\xa6\x6e\x00\xcc\xd4\x81\x91\xba\xae\xfb\x26\xbd\x9c\xc1\x58\xd9\x49\x61\x3a\x16\x66\xa5\xf2\x5f\x51\xf5\x2b\xf6\x64\x8a\x16\x1a\x78\xb9\x37\xe9\x9a\xe1\xa5\xd5\xe1\x9d\x20\xfb\x42\xd3\xa5\xf2\xd8\xfd\xaf\x1a\xfe\xbd\x59\x59\xb2\xc6\x19\x52\x4d\x6f\x4e\xcf\xde\xa4\x61\xbe\x4e\x98\xa7\x8a\xfa\x2c\x2a\xc2\x3d\x2e\x2b\xb1\x29\xa4\x8e\xc0\xe3\x64\x71\x85\xf1\xbd\xc8\xc9\xdc\x6d\xf0\x0c\xb8\x5d\xa8\x59\x3c\x29\xc5\x38\xd7\xfd\xbc\x26\xbf\x28\xd4\x11\xef\xaa\x82\x86\x56\x2b\x17\xc7\x60\x83\x6e\xc4\x13\x8a\x11\xb0\x8f\x6b\x6a\xae\xe6\x1a\xdf\xdc\x66\xd9\xf3\x1c\xe4\x14\x20\x31\x68\x88\x2a\x51\x88\x0c\x9e\x16\x22\x83\xe3\x10\x99\x8a\xea\x37\x0d\xb1\x35\x8a\x6f\x5f\x16\xdf\xbe\x39\x4f\xdc\x70\xae\x1a\x4d\xf5\x11\xff\x18\x8a\x34\x35\x03\x8b\xea\xa6\xf4\xec\xee\xef\xc2\x5b\x6e\x55\x33\x86\x6a\x05\x44\x1a\xa5\xee\xad\xa6\x81\xa8\x28\x5d\x4a\xa1\x29\x05\x57\x3b\xa1\x28\x3f\x30\xcc\x5b\x29\x30\xb8\x28\x24\x38\x0b\x5c\xf0\x5e\x34\xd2\x32\xc9\x1f\xca\x46\x52\x10\x8a\x04\x33\x7f\xee\x86\x33\x7f\x0e\x09\x3c\x1b\x54\x76\x98\x95\x15\xe9\xe5\x40\xa5\x97\x51\xa9\x05\x5e\x0b\xcb\x25\x59\x9e\x13\x0a\x60\x55\xb6\xe6\x9d\xcb\x6e\x8b\x79\xf0\x53\x81\xbd\x3d\xf7\xe7\x15\xc1\x65\x45\x0a\xd2\xc0\x0f\x9f\x16\x4a\xaf\xd2\xde\xa5\xc0\xb4\xde\x3a\xa1\x00\xa7\x19\x1b\x1a\x0b\x04\xdf\xeb\x95\xed\x0a\xae\x9a\x7f\xb0\xa4\xeb\x63\x25\xac\x28\x4d\x2e\x1e\x78\xae\x0e\xfc\x6e\x4d\x06\x5a\x19\xb6\x48\x1e\x58\xe7\x4d\xa0\x63\x98\x6b\xbe\x3e\xf4\xfc\xdc\xa1\x07\x2b\xcd\xe5\xe7\x0d\x3c\x58\x19\x78\x43\x42\x2f\x4f\xc1\x45\x55\xdd\x47\xab\x20\xd0\x2f\xd2\xd9\x56\xf1\xd2\xfa\x68\x12\x6e\x5d\x9d\x7d\xd1\x70\x7f\xaa\x49\x9c\xe5\x2c\x95\xa3\x5e\x1d\x63\x73\xf6\xb3\xf7\x05\xec\x67\xe7\x03\x36\x4a\x5b\x1a\x05\x3e\x4d\x00\x7e\x2e\x64\x8b\xf3\xbe\xa1\xc5\x52\xdc\x23\x4d\xb8\xa5\x9c\xa7\x0a\xfa\xe5\xd2\x87\x4b\xfa\x28\x6c\xb7\x1f\x49\xc5\x5a\x2d\xec\xc6\xa3\xf5\x1a\x35\xdf\xfb\x78\x2a\xb5\x22\x58\x8d\x3b\x9b\x53\xaf\xae\x24\x9e\x78\x2b\xaa\xf2\xd2\x75\xb4\x25\x70\xf2\xd6\xa3\x87\x8a\xeb\xa8\x0c\x92\xc7\x94\x23\x41\x09\x62\xfd\x67\x12\xc6\x86\xae\x37\x84\x43\x03\xa7\xec\x7a\xfb\xa4\x02\x5e\x75\x5c\x2e\x1c\x78\xa2\x76\x5b\xd7\xd1\x95\xbb\xb2\xf9\xd6\x07\x61\x44\x05\x19\x1c\x93\x60\x2f\x42\xcf\x4b\x30\xe9\xbe\x4e\x29\x12\xd7\x60\xb8\x4a\x9b\x89\x65\x37\x3a\x37\x77\x25\xd5\xab\x04\xee\x85\xa6\xcc\x48\x1f\x45\xaa\x61\xc5\xcf\xa9\x4c\xa1\x16\xc4\xfb\xb8\x54\x59\xee\xa5\xb9\x2b\x58\xf0\xf4\x34\x0a\x32\x57\xb1\x11\xa8\x9a\x16\x60\x66\x75\x3c\xf8\xb2\x8c\xcf\x46\x51\x36\x0b\xf6\xb7\xc4\x23\x5d\xc7\x22\x5e\xfe\xe4\x34\x0a\x0a\x9b\x59\xa0\x12\x45\x3b\xf8\x41\x91\x22\x0c\x3b\x52\xb9\x7b\x15\xbc\x3b\x48\xbd\xe3\x00\x83\xd0\xeb\x7a\x39\x86\x9f\xd4\x48\x01\x6e\x91\x1f\xc9\xf8\x2b\xa5\xba\x4e\x8a\xdb\x27\x70\x4b\xd1\x4d\xfd\xe7\x74\x92\x97\x23\x85\xc1\x17\xda\xee\x12\x87\xe7\x34\x74\x4d\x9a\x96\xaf\xc2\x5b\x29\x18\xbd\x85\x07\x86\x7e\x06\x3e\x9d\xb3\x70\x4e\xce\x02\x9c\xa7\xc5\xc2\x10\x57\xee\x6c\x8e\x1b\xdb\x77\x03\x1a\xbb\x3e\x3e\x9d\x89\xdf\x82\xb4\x9f\x2f\x16\x90\xa4\xde\x08\x44\xa7\x88\xe8\x53\xd8\xe1\x5c\x82\x98\x71\x9f\x06\xca\x84\x53\x59\x89\x48\x12\x0f\xf6\x19\xfa\x52\x76\x06\x7c\x25\xf9\x70\xa0\x0a\x57\x56\xb2\x58\x94\x3b\xe6\x59\x6a\xe4\x54\xb5\x40\x7f\x96\x56\x83\xc5\x67\xa7\x7b\x99\x30\x85\xc0\xfe\xd0\x88\x57\xb9\x61\x09\x43\xe0\xea\xea\x46\xe5\xd2\xb3\x3c\x0d\x8f\x0d\x42\x65\x30\x09\x88\x0a\xd0\x64\x41\x5d\x2c\xca\xe6\xee\xae\x31\x33\x37\x46\xde\xc6\xc1\xfc\xcc\xa2\xfd\x25\xd9\xcd\x36\x0f\x43\x5a\x45\x53\x48\xea\xf4\x37\x8c\xc8\xf5\x48\x41\xec\x6c\x6c\x4c\x48\xe4\xea\xa6\xde\x89\xc4\xd0\xf4\xdd\x5d\xbd\xc3\xe1\xdb\xa8\x0f\x43\xce\xdf\xb4\xbc\xe4\x43\x1a\xcb\x9e\x16\xe3\x84\xdf\x0d\x8b\x70\x40\x31\x72\xb7\xd0\x97\x18\xff\x49\x29\xc4\xce\x53\xaa\xc5\xf8\xa0\x3f\x09\x69\x89\x3e\xd1\x49\x07\xa2\xd7\x46\x75\x70\x8e\x14\x58\x2e\xe7\x48\x6c\x07\xb4\xe6\x94\x32\x17\xfd\xdf\x7a\xf9\x6e\x5a\x7f\x77\x1c\xec\x87\x9e\x4e\xa6\x11\x6e\x9e\x3f\xd3\x71\xce\x8e\x41\x0e\xfc\x43\x8a\xa9\x88\xe1\xf9\xab\x94\x46\xb5\x0d\x53\x76\x41\x04\x48\xf9\x4f\x4a\xd0\xf5\x92\x8c\xc5\x57\xb5\xc6\x36\x36\x74\x32\xbd\x97\x8e\x7f\x4c\x71\x4c\x00\x75\x2a\x81\x03\x6e\xd4\x32\x91\xbf\x24\x8f\x83\x5b\x61\xbb\x6d\xa4\x2e\x12\x3a\x9c\xee\x79\x96\x72\x7e\x51\x09\x6f\x5c\xc0\xdd\xa3\xc2\x9a\xb2\xe2\xa6\xad\xeb\xe3\x5c\x30\xea\xba\x8e\x10\x27\x20\x6c\xb1\x90\xdd\x40\x92\x9b\xa6\xb2\x5f\xbc\x98\x11\xba\x29\xda\xc3\xb5\xe0\x7a\x66\xce\x41\x99\x24\x07\xde\x6e\x9b\x10\xd8\xa2\x98\x88\xca\x50\x09\xa1\x21\x39\x0b\x5d\x53\xa1\xc7\xa5\xba\x8f\xc6\x05\xf5\x7f\xcb\x6f\xb7\x21\x71\x7f\x38\x27\x68\xcc\xeb\x3e\x4a\x8d\x18\x6c\xca\xd0\x54\xca\x9b\x7a\xe5\x9e\x18\x7b\xae\x01\xff\x8a\x27\x25\x42\xba\x53\xc5\x4f\xbf\xc2\x6d\x79\xff\x5b\xf5\xf5\xff\x10\x7d\x19\x81\xeb\x09\x10\xe2\x63\x0d\x5c\x5d\xd3\xf4\x4e\xd0\xd1\x77\x63\xbd\xb0\xcc\x09\x00\x14\xca\x71\x1b\x10\x3c\x59\xde\x77\x74\xed\x8c\x97\xa6\x79\xc7\x0d\x68\xbd\x9c\xbe\xdc\x8d\xf9\x5b\x4e\x41\xbf\x4d\xdb\xed\xd6\xdb\x94\x1d\x24\xa9\x1f\x3c\x16\xf2\xa5\x76\x5b\x97\x2b\xa8\xbb\x2e\x87\x9c\xe4\x40\x7b\x9b\x16\xb9\xd2\x9b\xdf\x42\xd4\xb9\xbb\x69\x19\x64\x0e\xdd\x9f\x39\x55\x14\x45\xb2\x6a\xf7\x6e\x0a\x0b\xff\x38\xa5\xf7\x53\xfa\x63\xea\x5a\xf4\x55\xea\x0e\xe8\x9f\xa9\xdb\xa5\xf7\x52\xd7\x0a\x1c\xfa\x57\xea\x6e\xee\x6e\xee\xde\x9c\xfd\x71\x73\x7e\x73\xf7\x66\xc7\x98\xfd\xb1\x79\x73\x2e\xef\xc8\xcd\xdd\xcd\xcd\xc3\xf0\x98\x3e\x49\xdd\xcd\x7f\x23\x1f\x3e\xfb\x63\x32\xbf\x39\x81\xa7\x77\x52\x77\xd3\x98\x8e\xff\x98\xfd\x31\xd9\xdd\xd8\xcd\x96\xf3\x0e\x99\x6e\x6c\xcc\xfe\x98\x9c\x2d\xe7\x37\xa7\xe3\xd9\x1f\x67\xcb\xc9\xfc\xe6\xd4\x98\x8e\x67\x93\xdd\x78\xbe\xf8\x81\xc0\x67\xbf\x5e\xee\xb3\xb3\xd9\x1f\xfc\x7e\xa9\x7c\x3e\x85\xef\x7f\xe3\x9d\x01\xed\xe2\x6e\x76\x73\xd7\x98\xce\xfe\x20\x93\xf9\xcd\x5d\x32\xdd\xcd\x6e\xae\x14\xfe\x5f\xea\x6e\xce\xfe\x98\x8c\xb1\x66\x5e\xef\x6b\x2f\xdd\x35\xe0\x72\x97\xac\x14\xff\x21\x75\x37\xff\xf8\xf7\xec\x8f\xdd\x6c\x7e\xb3\xd8\xf2\x9b\xf4\x3f\x7c\x9a\xb2\xce\xe6\x21\x7d\x90\xba\x2d\xa3\x16\xd3\xa3\xc8\x77\x2f\x1f\x88\x40\x1e\xa5\x0c\xf0\x77\x38\x54\x1f\xa7\x2e\x06\xf2\x89\x58\x76\x14\x1e\xfb\x59\x76\x52\xe4\xf7\xe3\xe0\xf7\x20\x5d\x2c\x5a\x46\xec\xbd\x0e\x0f\x3d\xbe\xa3\x4e\xb3\x20\xbd\x7d\xc8\xf1\x29\x62\xa5\xcd\xdb\x27\x27\x51\xf0\x5b\xb0\xf7\x20\xcc\x77\x37\xfb\xa6\xb5\xb8\xbb\x7f\x18\xec\x6e\x5a\xbd\x4d\xb2\x58\xb4\x24\x89\xf4\xf4\xe9\x62\xd1\xda\x7a\xfa\x94\x65\xa7\x27\x7c\xc5\xb2\xda\xad\xa1\xef\x25\x6f\x37\xd0\xca\x4c\xa7\xba\xa9\xf1\xff\xbd\xf6\x52\x63\x63\xe3\x20\x49\x08\xdf\xbc\x4b\x75\x40\x5b\x4f\x9f\x4a\x4f\xf9\x96\xeb\xd6\xde\xf0\x8d\x78\xe7\x34\x8c\xf6\xdb\x6d\xe3\x7e\xba\xf6\x2d\x9e\xdf\xff\xe5\x93\xd7\xaa\x95\x29\x7b\x5e\x7c\xb5\x1f\x66\x9c\xca\x7a\x72\x1a\xe7\xe1\x71\x40\x26\x97\xef\x0d\xc6\x3d\xd9\xca\xb2\xe9\xe3\xd5\xce\x14\x2f\xc7\xb5\x37\x53\xe3\xf7\xd4\xa8\x3d\x23\xb4\xf6\x40\x20\x2d\x32\x2e\xcb\xfe\x16\xec\x6d\x25\xc7\x27\x49\xcc\x09\xc6\x02\x0a\x2a\x4f\xd9\x41\xe4\x1d\x66\x38\xfc\x5f\x52\xf7\x71\x4a\x23\x1f\xc1\x7f\x31\x9b\xec\x66\x67\xf3\xdd\xec\x26\x31\x36\x36\x66\xbb\x6f\x36\xe6\x37\xa7\x64\x37\xbb\x39\x46\x38\x36\x8c\xe9\xf8\x86\x31\x1d\xef\xee\xde\x58\x30\x72\x73\x7a\x63\xa1\xc3\x9d\x0e\x77\xfa\x82\x03\x31\x99\xdf\x9c\xee\x92\xc5\xec\x8f\xe5\xe4\x6c\x4e\x3a\x64\xb1\x7b\x66\xc0\xb6\x21\xbb\x7c\xdf\x18\x53\x97\x37\xb2\x9c\x93\xc5\x0f\x84\x6f\x3e\xea\xc9\xc6\x77\x7f\xeb\x10\x75\x13\xf1\xca\xf8\x4e\xb8\x49\x76\x61\x2b\xd0\x9c\x97\x14\xfd\xea\xf0\x6e\x19\xb3\x31\x9d\x10\xb1\x8b\x69\xc0\x5f\x7b\x71\x78\x0c\xce\x6a\xbc\xd7\x64\x51\xde\x43\x28\x31\x78\xb8\x49\x43\xdf\xdd\xc4\xa3\x76\x37\x33\xd8\x4d\xb2\x49\x53\xdf\xdd\xdc\xc5\xed\xbd\xbb\xdc\x3c\xa4\xbe\xbf\x1a\x39\x2d\xf6\x2b\x69\x68\xa3\xa9\xa1\x23\x9d\x50\xe2\x41\x0c\x37\x0f\xf4\x2a\x68\xed\x8f\xf0\x13\x0a\x07\xe1\x2f\x29\x21\x63\x95\xae\x4d\xfc\x92\x64\x6a\x41\x9a\x91\x2c\xe3\x54\x41\xc6\x39\x22\x85\x15\x02\x64\x5f\xbe\x85\xfa\x2b\xac\x92\x48\x52\x22\xde\x23\xcd\xa9\x84\x2a\x52\x9b\x69\x95\xa4\x5b\x41\x1a\xe5\x28\x2c\x7b\x95\x2a\x41\x83\xfc\x32\xec\x00\x3f\xa0\xa5\x08\xac\x65\xc1\x91\x2c\x5d\xb7\x82\x76\x3b\x75\x5d\xf7\xcf\x54\x9a\x7f\x28\x54\x08\x22\x88\xd0\x27\x13\x7e\xa2\x0a\x40\x84\x87\x0f\xf9\xcc\x1b\xfe\xcc\x9a\x13\x7c\x00\x94\x75\xe8\xb6\x4c\x42\x96\x42\x0a\xfe\x63\x3a\xf5\x8c\x88\x8c\x73\x6c\xe1\x55\x3a\xcd\xf9\x2d\xbf\xbe\x97\x22\x0d\x60\x12\x0a\x16\xd2\x48\x30\xb4\xdb\xad\x50\x84\x7c\x32\xa1\x8f\xe2\x64\xf7\xcb\x93\x9d\x7f\xe7\xbb\x51\x71\xb2\x1f\xf9\x86\x2f\x06\xa9\x58\x84\xef\xfb\xf5\x88\x0b\x75\x97\x59\x11\xbe\x5a\xcf\xf2\x77\x51\xa0\x38\x76\x21\x2d\xa2\x46\x80\xc9\xfc\xe4\x24\xd0\x81\x73\x67\x95\x5c\x63\x74\xdb\x37\x42\x34\x0f\xc4\x28\xaa\x27\x3e\xb0\x5a\x25\xb4\x9d\xc2\xaa\x45\xf5\xc6\xb7\x92\x63\x6c\x1c\x22\xb4\xbd\xd3\x7e\x7c\xf4\x50\x83\x7e\x64\xda\x41\x92\x6a\xa0\x82\xd4\x74\xa9\x7c\x2b\x3e\x3e\x0a\xbc\xfd\xa2\x9f\xac\x96\xa1\xde\x38\xf1\xa7\x27\xfe\x4a\x84\x32\xb2\x58\x78\x2a\xe7\x4c\x4f\x7c\x57\x01\xab\x6d\x5f\x12\x77\x86\xe7\x7a\x8b\x45\xa5\x2d\x52\x6f\x23\x6f\xb7\x2b\xb1\xd0\x57\xeb\x86\xa0\x44\xc7\x1c\x24\xa5\xfc\xe6\x71\x92\x81\xf6\xc4\x38\xf1\xc9\x4a\xf6\xd7\xc7\x8f\x9e\xfe\xf4\xec\xa7\x47\x3f\xbf\x7c\xfc\xe4\xee\xd6\xdd\x1f\x7f\xfa\xf9\x7e\xbb\x6d\xf0\x1e\x92\x71\xb5\x9f\xcf\xfd\x92\xc7\x10\xd6\xcf\xe8\xeb\x2d\xb8\x8c\x5b\x01\x46\x82\x39\x30\x74\x03\xec\xd4\x67\xde\x9c\xe4\x9d\x4e\x69\xc6\x4e\xe4\x63\x20\x30\x37\x36\xf2\x32\x48\x1f\x5e\x6c\x58\x4a\x00\x19\xbf\xea\xbb\x54\xd0\xa0\xfc\x38\x43\x4f\x4b\xd4\xc5\x16\x95\x18\x11\xd5\x75\xfc\x27\xf5\x57\xd0\xe7\xbc\xe3\x10\xf0\x3d\x57\x18\x92\x4e\x97\x96\x4e\x0f\x79\xe5\x9d\x09\x76\xa5\x2e\x6f\x5f\x79\x1a\x70\x8e\xc5\x23\x14\xda\xc4\xd0\x6e\xb2\x43\x54\x27\x64\xea\x19\x39\x87\x4d\x64\x59\x74\x9d\x46\x64\x8c\x8f\xd4\x8a\x03\x22\x4b\x84\xb5\xaa\x0b\x66\x47\xe1\x36\x6f\x8b\x19\x78\x90\x4e\xa3\xe6\x50\xe8\x1e\x19\xd7\xc9\x93\x6a\x74\x30\xf5\x2b\x69\x17\x53\x7e\x0c\x1b\x66\xcb\xaf\xc7\x31\x5b\xa5\x79\xde\xa4\xde\x89\x12\xff\x49\x4d\x1b\x55\x6e\xb4\x17\xbe\x6a\x95\xa4\xda\x78\xeb\x7a\xb1\x65\xa6\x1b\xd6\x2d\x4f\xe1\x27\x74\xb2\x58\x70\x1e\x94\x7a\x98\xde\xac\xe8\x2d\x47\xab\xd5\x28\x50\xa1\x88\x15\x4f\xc6\x06\x46\x7e\x04\x66\x2b\x78\x9b\x07\xf1\x7e\x46\xe8\x59\x98\x8d\x3d\xfa\xa7\x37\xce\x15\x1c\xf4\xd0\x6f\xc8\xf7\x8c\x91\x0e\x26\xe6\x2d\x37\x68\xb7\x83\xd2\x88\x26\xa8\x42\x6f\x30\x97\x78\x0b\xa0\x28\x20\x13\x64\x0e\xa2\xd0\x0f\x8c\x80\x86\x1c\x20\x02\x37\x44\xb1\x02\x95\xdf\x4c\x8d\xc2\x59\x10\x9a\x22\x63\xfe\xd5\x2c\x98\x2b\xc2\xd9\xb2\x84\x12\x90\x61\xc7\x17\xc6\x12\x05\x01\x74\x3f\x95\xa0\x7d\x3f\xad\xc4\x8d\x11\x87\x14\x52\x5f\xc5\x8c\xd7\x82\xeb\x67\xd9\xc6\x1e\x2f\xa0\x0b\x63\x08\xf5\x23\xd7\x2b\xdd\x40\xf4\x96\x2b\x38\xaf\x8a\xa1\xbe\xb2\x82\x18\xe5\x8c\xe3\x5b\x35\x94\x9f\x1a\x2a\x52\xb5\xda\x13\x88\xb5\xdd\x56\xba\xe0\x42\x13\x15\xb1\xa4\x00\x78\x19\x84\x74\xac\x13\x32\x33\xe7\x53\x6f\x66\xcd\xc7\x7a\x19\xed\xeb\xfd\xfb\x34\x51\x13\xfc\xa8\x52\x76\x23\x27\xcb\xea\x64\x2c\x97\x6a\x5e\x33\xf1\x18\xd2\x12\x94\x6e\xf3\xea\xd9\x6f\xe8\xc2\xab\xa8\x5c\x11\xce\x8b\x73\x44\xdf\xfa\x25\x45\x72\x7f\xaa\x0b\x2a\x9c\xbf\x1d\xc3\xcd\x3b\xf4\xde\x51\xbc\xda\x7d\x83\x9c\x29\x0e\xdf\x7e\xd5\xe1\xfb\xb2\xb1\x02\x83\xea\x2c\x29\x21\xb1\xa6\x68\x97\x98\x83\x5c\xcb\x63\x2f\xcb\x6b\xa2\xe8\xdf\xc6\x5e\x11\x35\x94\x97\x2a\x5f\xac\xd3\x9c\x41\x47\x83\x99\x37\xa7\xb9\x32\x9a\x77\x45\xf7\x01\xde\x50\x1c\xc1\x51\xcd\x4e\x98\xe5\x24\x9f\xaa\xb7\x62\x3d\xc4\xd1\xbf\x81\xc7\x3b\xa7\xbe\x56\x4a\x78\x84\x8c\x2b\x5f\x7a\xfb\xfb\xe7\x7d\x86\x39\x03\x4b\xdf\xa9\xea\xbe\x90\x1a\x8c\x95\xdd\x82\xa9\x28\x26\xf9\x34\x68\xb7\x11\xef\xba\x85\xaa\xa4\xda\x5c\x45\xd6\xe0\x81\x24\x62\x0c\x5f\x18\xc1\x34\xe0\x34\x03\x07\xdf\x8e\xfa\x89\xa6\x77\x2a\xf1\x09\x9f\x16\x13\xb5\xe7\x1b\x7f\xf9\xb4\xaa\x46\x10\xd3\xc8\xa9\x32\xb8\xcc\x2b\x41\x16\x8f\xc5\x99\xb0\xfe\x4b\x88\xc1\xd2\x32\x2b\x5f\xbd\xf4\x57\x0d\x33\xff\xf2\xa5\x2c\x10\x80\x39\x2c\x81\x39\xe4\xc0\x1c\x4a\xae\xb5\x04\xdd\x12\x01\x05\xbc\x44\x40\xa6\xa1\x1b\xfb\x18\x69\x26\x3c\xc7\x04\xf4\x8d\x6f\xe4\x95\xd3\x36\x9f\xea\x4c\xef\xe4\x63\x5d\xa7\xf0\xbd\xaa\xf6\xf2\x58\xb8\x58\x18\x5e\x29\x07\xf4\xd8\x7d\xf7\x2d\xf6\x3f\x62\x47\x34\xa7\x29\xa1\x1e\x43\xb2\x35\x6c\xb7\x43\xf0\x3d\x49\x41\xa3\x90\x52\x8f\x53\xb2\x70\x10\x11\x7e\x40\x44\xec\x4f\xde\xbb\x8e\x8e\x92\x9a\xe2\x80\x2e\x67\xe6\x4d\x95\x17\xf1\xa6\xfa\x2c\xcc\x5c\xa0\xfe\xe6\xfa\x58\xa1\x7e\xde\x36\x4c\xe1\x43\x5f\xe9\x28\xda\xe9\x64\x3e\xb8\x4f\x7b\x17\x48\xc7\xbc\x42\x3a\xe6\xcd\x09\xec\x29\x7e\x25\x7d\x2f\x23\x1a\xa3\xe5\x6a\x11\xb6\x6f\x6d\xba\xcd\x56\x2b\x5a\x12\xa1\xd8\xa1\x6a\xf4\x88\xbb\x7e\xa3\x18\xf9\x99\x4f\xab\x0b\x25\xcb\x6c\x58\xb7\x14\x91\x66\x47\x27\x53\x55\xa6\xbb\xb9\xdb\xd9\x3c\xa4\xfa\xcb\x97\x2f\x75\x32\xae\x16\x85\x67\x20\xbf\x56\x8a\xbf\x7c\xf9\x92\x97\xef\xe8\x84\x50\x7d\x0c\x71\x33\x0c\x88\xcd\x44\xf4\x8a\x52\x45\xcc\x3e\xe7\x3e\xf0\x20\xd8\x34\x76\x67\xac\x33\xdd\x9d\x93\x4d\x32\x69\xb0\xb4\xaf\x1f\xd6\x96\xeb\x06\xff\xb4\x89\x8c\x97\x89\xb2\x54\x69\x8a\x10\xe2\xc1\x0b\x00\x1e\xb6\xdb\x01\x1e\x21\x42\xa5\xb0\x58\x18\x10\xd5\xb6\x7a\x00\x75\x5c\x8f\x8a\xca\x42\x31\xad\x63\x90\x9a\x14\x81\x39\x0b\x25\x5a\xa9\x56\x81\xa9\xd6\xc7\x69\x92\xe4\x78\x4c\x29\x82\x42\x45\xa2\xad\x43\xd4\x34\xb2\x3c\xf0\xd7\x98\x07\xab\x01\x39\x5b\x16\x44\x5f\x46\x78\x95\xaa\x4f\x5f\x06\x0d\x9f\x84\xc0\x20\xf3\x45\x76\x2f\xb1\xb8\xca\x12\x28\x4b\x9a\xf1\x25\xe2\xb8\x8a\x2f\x0a\x91\x41\x3d\xee\x29\x8d\x1c\x18\x05\x43\x5a\xd7\x16\x02\xd5\x41\x21\x94\x29\x84\x86\x02\x26\xf5\x9e\x4f\x26\x72\x00\x82\xca\xa3\x25\xf9\x24\x29\xf6\xb0\x62\x97\xc5\xcb\x9d\x9c\xe6\x1d\x5d\x93\x13\x25\xe3\x94\x6b\x37\xc8\x0d\x9d\x40\xf5\x15\xa2\x4b\x1d\xb2\x47\xf5\xdd\xd3\xc0\x34\x4d\x9d\xc8\x75\x2b\xfc\x2e\xcf\xee\x7a\xe3\x88\x0a\xc6\x98\x93\x85\x7c\x4c\x91\xeb\xb3\xbb\x1e\xf5\x5d\x5f\xb2\xcc\xc5\xe1\xef\x56\x26\xf3\xbe\x4f\xf5\xf1\x51\x92\xe5\xda\x0f\x96\x2a\x6d\x7e\x54\x99\xe4\x90\xa6\x65\xbe\xc4\xc5\xc2\x88\x56\xf0\xa0\x24\x22\x15\x0e\x66\x3c\xce\xa2\x24\x87\x2c\x2d\x68\xf0\x52\x79\xc9\xdb\xd4\xc9\x34\x6a\x34\x48\x96\x33\xfd\xa3\x2f\xf1\x29\xdf\x78\xed\x76\x3e\xb3\xe7\x02\x58\x80\x46\x9e\xe6\x33\x73\x2e\xca\x3e\xf6\xc9\xb4\x1c\xd7\x8f\x95\xfe\x43\x07\x25\xf2\xeb\x04\x4b\x32\xce\xc5\x8e\x78\xec\xf3\xfd\xc0\xe9\x89\x69\xce\xe9\x97\xe4\x34\xda\x7f\x19\x27\xf9\x4b\xa8\x54\x1f\x97\x35\x8a\x2e\x53\x54\x89\x07\x64\x6c\xa2\x2b\x98\x11\xb9\xf9\xf4\x67\x3c\xc3\xc6\x11\x27\x87\x5b\x16\x35\x6f\xc1\x2b\x11\x74\x8c\x23\xf1\x5c\xa2\xd3\x96\x39\x01\x11\x8d\xb2\x08\xaf\xfc\x9a\x82\x4b\xc0\xb3\xf6\x2f\x7e\xa8\x2e\x8b\x7d\x29\x12\x18\x47\xf4\xbf\xde\xd8\xa3\x59\x9e\x9c\x8c\xd3\x25\x3f\x10\x42\x61\x00\xe3\x42\x38\x32\xfe\x02\x38\xc1\xff\x7a\x20\xda\x80\xaf\x08\x0d\x3b\xe9\x12\xcc\x03\x8c\x75\x93\x2e\x90\x84\x04\xb5\x52\x02\x90\x06\xfb\xa7\xbe\x12\x68\x2a\x02\xfd\x46\x81\x77\x3b\x5e\x27\x9f\x05\x1d\x6b\xbe\xa4\x39\xf8\x86\x1a\x11\xf5\x09\x1c\x5c\x62\xfb\x82\xcc\x49\x0e\xf7\xcf\xfa\x06\x2e\xeb\xba\x31\xdb\x0f\x53\x57\xbf\xd1\xc9\x3b\x37\xf4\xb9\x76\xa3\xe3\x75\x82\x8e\x4e\xf9\x34\x74\xaa\xef\x6e\xf0\x65\x5c\xd2\x0a\x96\x09\x9b\x95\x8b\x08\x1f\x05\xc8\x71\x1a\xb6\x78\x56\xc2\x28\x7a\xe8\x1e\x71\xd6\x71\x1c\x27\xb9\xc1\x14\xda\x86\xe8\x64\xcc\x97\xb8\xe0\x7c\x9b\x4a\x2c\x69\xc8\x9a\xf4\xf3\x61\x90\x19\x6a\x37\xe9\xd9\xe1\x7b\xa5\x6c\xaf\xd0\x67\xcb\xa5\x48\x54\xf0\xcc\x77\x37\xc7\x46\x9c\x1f\xcd\x36\x76\xdf\xcc\x3b\x64\xd7\x00\xa9\x6a\x87\xec\x92\x4d\xfa\xc8\x77\x37\x8d\x3f\x16\xb3\xdd\xec\x5f\x9d\xff\x6f\xde\x21\x86\x31\x1d\x8b\x93\x67\x31\xfb\x03\x9e\xba\xb3\x39\xe9\x90\xcd\x43\xfa\xd8\x77\x37\x67\x33\x36\xfe\xc7\xcd\xf9\x26\xbd\xef\xbb\x9b\x7f\x18\xc5\xec\x90\x4d\xfa\x23\xaf\x0a\xa6\x90\xf0\x4a\x0c\xa8\x8a\x37\x65\xcc\x6f\x82\x00\x97\x5f\x90\xce\x94\xec\x12\xb2\x49\x5f\xa1\x94\xb6\xac\xe0\x12\xdf\xfc\xc9\xbf\x61\x37\xc9\x78\x3f\x4c\x77\x79\x51\x23\xca\xd3\x45\x9a\x47\x84\xec\x12\x94\xbb\xde\x83\xc1\x4e\xc7\x52\x0c\xe8\xc5\xef\x16\x1b\xc6\x74\xfc\x26\xd8\x7b\x15\xe6\x8b\xe3\xe4\x2f\xb2\xe1\xc5\xef\xc8\x26\xfd\x0b\x25\xb2\x07\x7e\xc9\xb9\x3f\xa9\xd0\x36\xb0\xda\x0f\xdd\x08\xc5\x9f\x68\x75\x70\xe4\x7a\xea\xed\x96\xe7\xe6\x8b\x85\x8c\xe3\xf5\xa0\x6a\xdc\x80\x4c\x55\x08\x74\x28\x3c\xfb\xd3\x73\x83\xf2\xee\x10\xad\x14\x76\xf0\xe7\x89\x5b\x95\xb1\xde\xa9\x90\x2d\x53\xc8\x4e\xc7\x17\xf7\xa7\xf8\x20\xa9\x85\xfb\xff\xb5\x26\x46\x56\x8b\xba\x0a\x63\xfd\x9b\x5f\x73\xbc\x29\x44\xa5\xea\x9d\x54\x41\xcb\xa7\xc9\x5f\x0f\x9b\x5f\x64\xcd\xcf\x93\xe6\xc7\x38\xff\xb5\x77\x6a\x56\x03\x35\xc0\x01\x59\x3e\x59\xb3\x69\xab\x69\xf4\x1e\x2e\x69\xa5\xe0\xcb\xc3\x20\x7f\xca\x87\x8e\x62\xed\x6a\x25\xb0\x17\xfe\xc7\xc1\x83\x83\xe8\x6e\x76\xf3\x5f\xbb\xd9\xcd\x4d\xfa\x83\xef\xae\xd7\x46\xe9\xcf\xd2\x70\x1f\x62\x18\x96\x40\xf2\x9f\x2a\xb3\xfa\x40\x8a\x2b\x5a\x11\xbb\x27\xa7\xf7\x6c\x49\x73\xf7\x6c\x39\xf9\x1d\x91\x3e\x04\x8c\x79\xec\xe6\x54\xc8\x96\x31\x3f\x3a\xf5\x0a\x3b\x88\x9a\x85\x44\x81\x07\x53\xbf\xc2\x65\x45\x70\x4b\x23\x76\xcf\x55\x43\x8e\xfc\x5e\x93\x10\xde\x13\x96\xf2\x67\x2b\x15\x97\x96\x2a\x9c\xa8\xf2\x59\xf0\x36\xf0\x8d\x9c\x4c\x88\x1e\xc6\x47\x41\x1a\x02\xd9\x66\x04\xae\x11\xcd\xec\xf9\x62\x11\xcd\x9c\x39\x29\x75\xc7\xfa\x69\x9c\x05\x50\x84\x9f\xf0\xde\x2c\x9a\x59\xf2\xac\x9d\xbb\xe0\xf1\xda\x32\x0b\x73\x70\xb4\x42\x7d\x2c\x25\x37\x02\xed\x79\x59\x16\x1e\x82\x95\x1d\x7b\x4c\x68\x4b\x89\x6c\xf7\x5f\xbf\x4a\xaa\x69\x90\x71\xde\x35\x6f\xb9\x8a\x98\x6c\xa2\x93\xe9\x2f\xb2\xe0\xf8\xb0\xca\x33\x81\x43\xb5\x42\x85\x4c\x0d\x23\x70\xa1\xda\x7c\x16\x70\x16\x9d\x0f\x01\xec\xe7\x3d\x88\xd9\x1b\x4c\x75\x50\x0e\x6d\x64\x47\xe1\xf1\x86\x32\x01\x01\xaa\xc9\xe5\x13\x32\x2e\xaa\x09\xe7\x8b\x45\x48\x73\xc2\xff\x7a\x1d\x03\x76\x33\xe9\xa4\x64\xec\xf1\x93\x13\x34\x34\x9e\x42\x7d\x94\xa3\x2b\x3a\x7d\xe6\xb9\x9e\x3c\x45\x27\x7a\x49\xda\x43\xdf\xc1\x09\xd6\x53\x9d\x60\x21\x7b\x86\x37\x4b\xe7\x28\x4c\xf0\x4b\xfb\x11\xb0\xa6\xf0\xc4\x12\x06\x84\x94\x7d\x9c\x59\xf3\x39\x38\xa2\x0b\xce\x7f\xc3\x6a\x01\x5f\x1b\x28\xb4\x95\x2e\x23\xbf\xf8\x6e\xa0\x48\x60\x43\x32\xf1\xb1\x1e\x4e\x17\x8a\xa3\x8c\x0f\xd7\x07\xcb\x20\x55\x84\x1b\x92\x8e\xbf\xe4\x3d\x03\xe1\xe1\x8a\x5d\x8b\xe2\x18\xb1\x61\x4d\x45\xa6\x15\xc3\xa4\x1b\x16\x19\xc3\xb4\x2d\x0b\xd2\x01\x19\x89\x89\xca\x49\x44\x35\x26\xe0\x6c\x49\x43\xbe\x9f\xc4\x37\x47\x75\x66\xb9\xb5\x4a\x2d\x80\xd0\xe8\xde\x62\xf1\xc0\xc7\x34\x12\xf7\xd8\x63\x49\x81\x02\x5f\x3c\x89\xdc\x90\x41\x88\xa4\x90\x33\xc7\xa1\x1b\x4d\x81\x07\x0e\xc9\x18\xf9\x13\xc1\x06\x78\x35\xd3\x1c\xea\xbb\xad\x96\x54\x46\xfd\xcf\x27\x10\x1e\x1b\xc3\x60\x87\xc2\x69\xb3\x98\x66\xe4\x73\x68\xec\x62\x78\xd1\x3a\x69\xdb\x6e\xb7\xfc\x49\x29\x56\xc8\x81\x13\x6e\x19\xbe\x9b\xf2\xca\x3a\x9c\xb8\xbb\xc9\xf4\x4e\xb8\x58\xc0\x12\xae\x54\x4c\xd0\x3e\xa5\x7c\x1e\x12\x42\x0d\x7f\xb1\x88\x91\x0f\x0d\x69\x0c\x98\xe7\x3e\x08\x12\x40\x7a\xf0\x97\x4f\x3d\xfa\x97\xcf\x8e\x68\x04\xb2\x87\x68\xac\xeb\x34\x04\xdb\x25\x28\x17\x12\xea\xb7\xdb\xea\x88\x0c\xf1\xc6\x63\x8f\x08\x0d\x0c\xce\x4b\xe4\xf4\x70\x6f\x1c\xd3\xd7\x7b\x63\x9f\x53\x9e\x4b\x31\xe9\xaa\x23\xd6\x6f\xbe\xe0\xe0\xd9\x4b\xe1\x42\xb2\x58\x44\x34\x67\x77\x3d\xe8\x1a\x3b\xdc\x9b\xfe\xee\x43\xf0\xa5\x31\xfc\x86\x84\x70\x5a\x0d\x13\x7a\x9b\x84\x9e\x1d\xef\x8d\x43\x1a\xec\x8d\x03\x05\xcf\x79\x2b\xbc\xc4\x0b\x58\x5c\x90\xac\xe0\x62\xb2\x3f\x3d\x42\xf1\x60\x7f\x12\x1c\xde\x7d\x7b\x62\xe8\xa8\x87\xfe\x83\xfd\x63\x36\x9e\x13\xbd\x63\x78\x52\x54\x3e\x05\xe3\xaf\x54\x05\xcd\x8e\xbe\xbb\x3b\xd7\xc7\x29\xe9\xe8\xc6\x0f\x8b\x19\x1b\xcf\x76\x91\x30\x22\xb0\x8c\x77\x7c\xb0\xf7\x75\x63\xf6\x90\xc6\x6e\x5c\x1c\xf2\x00\x2a\x49\x8d\x64\xe6\xe4\xfb\x91\x70\xaa\x3b\x5b\x02\x4a\x7e\x90\xb6\xdb\x51\xcd\x20\x0a\x38\x73\x85\x9f\xe7\x4f\x3a\x1d\x29\x73\x4f\xdd\x90\xfa\xae\x37\x49\xd9\x69\x65\x50\xbb\xbb\x7b\xbc\xeb\x15\x8b\xad\x8e\x6e\x4c\x5b\xbb\xbb\x77\x16\x1b\x44\xa7\xfa\xa1\x4e\x68\xca\x0e\xdd\x95\x42\x1b\x7a\xc7\xa7\x29\xbb\xef\xa6\x7c\x59\xd3\x82\x2d\xa7\xe5\x25\x7f\x55\x9e\x41\xd5\x0a\x78\xa5\x84\xa3\x99\xea\xe3\xb9\x9b\xc7\x46\x29\xa9\xc9\x97\x46\xa8\x88\xba\x5e\xc2\x1a\xd3\xba\x59\x77\x28\xcc\xb5\x6a\x1b\x55\x9c\x8a\xa0\x94\x45\xc4\x59\x3e\xc4\xf0\xcd\xc5\xc1\x19\x52\x98\x54\x14\x37\x01\x15\x21\x6c\xa6\x44\x8c\x88\xd0\x2d\x1e\xc9\xd0\xe1\xae\xeb\xb1\x87\x70\xb8\xb0\x87\x9e\x1b\x08\x2e\x3f\x84\x6a\x1f\x82\xb8\x56\x96\x4a\xbd\x62\xad\x32\x2d\x04\x2e\x07\x34\x27\x09\x09\x39\x46\x8d\xf9\xbf\x64\x96\xcd\x09\xff\x1a\x7a\x1b\x53\x5e\x06\xd9\xef\x4c\x08\x5f\x41\x4a\x90\xb9\xe6\x24\xbb\x05\x2f\x8b\xc8\x08\x19\x09\xb1\x06\xfe\x78\x96\xcd\xa1\x9e\x49\xec\x86\xcb\x72\x7c\xbc\xc2\xfb\x72\x03\x16\x2b\x15\xba\x7c\xef\x06\x10\x2e\x51\xf6\xf0\xc8\x35\x32\x14\xc4\xdd\x27\xd2\xe2\x91\xee\x4b\x39\x5b\x7c\xeb\xa8\xdd\x36\xf6\xdd\x0c\xc2\x28\xc6\x9d\x0e\xe1\x57\xee\xbe\xc0\x63\x3e\x99\xee\x97\x0b\xce\x71\x20\x47\x3f\x7a\x67\x7f\xa2\x08\x20\x33\x45\xbc\xb6\xa4\xb1\x1a\x6c\x4d\xe5\xa6\x9a\x3c\x06\x4a\x0a\x86\x9d\xd2\x88\x1d\xaa\x52\xe0\xa0\xc2\x62\xa6\x31\x0d\xdc\x04\x11\x74\x45\xc3\x1d\xfb\x46\x40\xeb\x1e\xe4\x81\x62\x4b\x5a\x27\x75\x22\x76\xaf\xdd\x8e\x2a\xe0\x14\x28\xb2\xec\x46\x5b\x3a\x5a\x56\xf7\x0b\x08\x6b\xa9\x07\x88\x69\x3d\xdb\xf6\x9f\x8f\xc1\xb6\xbd\xad\xb3\x6c\x69\x0c\xbb\xfd\x3f\x3e\xf5\x63\x7e\xf8\xc5\xf1\x1a\x0f\x4c\x0e\xad\x71\xbb\x8d\x9b\xe0\xbf\x42\x48\x95\xc4\x6e\x1c\x8b\xae\x4e\x8a\xab\x15\xf9\x9a\x1f\xcf\xa2\xf9\x62\x61\xc0\xaf\x7b\x8a\x3c\x78\x12\x23\xe2\x8e\x63\x8a\xc5\xd4\x14\x55\xb1\x34\xfd\xf6\x3d\xff\x88\x9f\xca\x8a\x7d\x07\x7f\xb7\xcc\x62\x35\x46\x52\x5e\x71\x19\xaa\xa1\xee\xb2\x1e\xe8\xc5\x6c\x3e\x11\x41\x3c\xce\x1e\x83\xe4\xe2\x5d\x24\xed\x22\xc6\x39\xdd\x19\x07\x4b\x42\x2d\xd3\x2c\xa2\x6b\x80\x69\xc4\x51\x78\x90\x1b\xc2\xf9\x44\x56\xe5\x86\xe8\xb4\xba\x1f\xab\x08\xf3\x2f\x9f\x1d\x72\xe4\x9e\xdd\x34\x66\x7f\xec\xee\x66\xf3\x9b\x44\xa5\xe9\x4f\x14\x00\x36\x22\x57\xd5\xb3\x40\x8a\x8d\x42\xab\x02\x82\x92\xe9\xca\x93\xf1\x1a\x3d\x0a\xd0\x87\x62\x8f\xed\xc7\x84\x4c\x23\x54\xeb\x29\x39\x9a\x94\x68\x08\x5b\x7c\x09\x78\x45\x4f\x92\x04\x9d\x04\x94\x70\x84\x2e\x67\x44\xe1\xa7\xea\x67\x33\xd5\xf5\xb1\x11\xb9\x1e\xe4\xd4\x23\x53\xa0\x6d\x58\x98\x55\x1a\xd9\xae\x4a\x2b\x57\x43\x26\x9c\x95\xf1\x12\xc0\x5d\x8d\x61\xd6\xdf\x96\xeb\xae\x4b\x44\xd8\x6e\x37\x15\x02\x4b\x8d\xba\x47\x53\x19\x80\x41\x95\x59\x17\x11\x68\xcb\xd7\xfc\x24\x0c\x0f\x8c\xf0\x12\x19\xea\x52\x4c\x37\x57\x4e\x14\xf5\xdd\x13\x7e\x00\x41\xa8\x18\x34\xf1\x09\xab\x13\xd5\x6e\x4b\x03\x9b\x96\xab\xa6\xb4\x6b\xb7\x4b\xad\x61\xf5\x0d\x5f\x3d\xd7\x75\x77\x7c\x8e\xdf\xc9\xb1\x6f\x84\xd4\x2f\xc9\xea\xb4\x39\xbb\x21\x0c\xdf\x48\xdd\x53\xde\x1b\xd2\x72\x5d\xbf\xdd\x7e\x0a\x9f\xd2\x94\xd0\x95\x5c\x69\x97\xca\x62\x16\x4a\x71\x92\xde\x41\x40\xe6\xe4\x08\x3a\xff\x85\x0d\x81\x91\x4e\x63\x08\x1d\xe4\x73\x4c\xdf\x6e\xbf\xf3\x8d\x94\x63\x6b\xfe\x1f\x44\x70\x78\x90\x2e\x16\x17\x5a\x3a\x1c\x41\x6e\xa5\xec\xc7\x77\xb1\x77\x1c\xfa\x4f\xfd\xe4\x24\x8c\x0f\x05\xcf\xf0\x3c\x6e\x8e\xe2\xbe\x1d\x13\x7a\x18\x57\x63\x2b\xc4\x45\x04\xf7\xe8\x9c\xe0\xed\x40\x1e\x35\x62\xb8\x76\xbb\xd5\xf8\x7c\xbd\xf3\x3a\x39\x8c\xcb\x7c\x9b\xa5\x0e\xe4\x76\xac\x4a\x11\x94\x32\x6c\x2f\xd9\x7f\x47\x96\x13\xc5\x03\x18\x33\x2c\x65\xd3\xd5\x47\xe0\xa3\xff\x24\xf0\xf6\xdf\x19\xb7\x63\x32\x4e\x83\xff\x9d\x06\x59\x7e\x5b\xda\x04\xde\xe3\xf4\x90\x1a\x7c\x00\xd2\x25\x96\x71\xf1\x8b\x36\xcb\x88\x27\x0d\xe9\xc9\x6f\xc7\x86\xe2\xe0\x83\xfa\xdf\x5a\x36\x2d\xf8\x1e\xbc\xc3\x7d\x08\xfa\xa2\xd3\x88\x2c\x27\xc5\x37\xab\xe9\xb7\x1a\x3f\x00\x50\xe6\xad\x2d\xc9\xf2\xa8\x32\x3f\xdb\xb1\xf1\x3c\x66\xb9\xf7\x2a\x78\x12\xf8\x49\xba\x9f\x19\x44\x04\x9b\xda\x82\x03\xe9\x45\xec\x96\xd1\x2b\x30\xd0\x83\x82\x4e\x1f\xc2\xda\x1b\x91\xbb\xc5\x8f\x16\x74\x33\x78\x09\xbc\xf6\xd3\xa3\xf0\x78\xeb\x34\x4d\x83\x38\x7f\x1e\xa4\x59\x98\xc4\xee\xfa\x57\x8b\x85\x49\xd5\xb7\xcf\xbd\x28\xdc\xf7\xf2\x30\x3e\x6c\xfa\x76\xe5\x6d\xfd\xf3\x9f\x83\xb7\x45\xa3\xc6\x9a\x17\x8b\x85\x49\x3a\x96\x9a\x4b\xa0\x2a\x28\x5e\x3b\x0a\xd7\x5d\x53\x23\x4c\xda\x6b\x98\xb4\x03\xdc\x37\x59\x5c\xce\xd4\x5e\x71\xa4\x06\x28\x35\xe2\x97\xe1\x5a\xac\x3b\x29\x63\x2c\xfc\x9c\x4e\xa2\xc2\x75\x08\xbf\x3b\x75\x7f\xf5\xd1\xd5\x38\xa4\x70\xf6\xe1\x91\x0e\x4f\x1e\x15\x4e\x54\x42\xee\x78\x54\x13\x38\xbe\x53\x0e\x22\x38\x44\x80\x25\x0c\x33\xf0\xbd\xfb\xd3\x13\x76\x64\x7e\x3c\xcb\x85\x0f\x12\x0d\xf9\xf2\xe6\x88\xb2\xa5\x98\x07\x65\x91\xae\x68\x3d\x77\x43\x86\xb2\xc8\xdb\x19\x08\x55\xd9\x21\xe5\xac\xb6\xc0\xa8\xaa\xd5\xcf\xd3\xb8\x14\xa3\x1d\x55\xd1\x11\x58\x43\xd7\xed\x9c\x6f\xcb\xa9\x26\x67\x11\x3b\x5a\x31\x83\x2e\x5e\xd3\x88\x1d\xb1\x30\x86\xc8\x29\x45\x14\x8c\x87\xb1\x30\x67\x6c\x99\xc2\x03\xc3\x6d\x59\x93\x3a\xfd\x1a\x91\xb3\x56\xc4\x0e\x2f\xd1\x19\xf4\xd8\x7b\x8a\x42\xd7\x3c\x48\x0f\x3c\x1f\x1d\x2a\x0e\x57\x3a\xd6\x54\x14\xe2\x93\xe6\xa9\x17\x67\x07\x49\x7a\xbc\x1a\x0f\x05\xdc\x2e\x7f\xf1\x20\xeb\x1c\x2f\xfa\x1a\x21\x3d\x58\x2d\xc9\x21\xf5\x02\x8c\xc4\x7b\xc5\x82\xf8\x7f\xa7\xc1\x69\xb0\xbf\x58\x44\xec\x11\x64\x11\x3b\x00\x14\x5a\x76\x2e\x03\xa4\x80\xde\x89\xca\x32\x1d\xd7\x04\x33\xc0\x80\x33\x8c\x0d\x94\xb3\x07\xa5\x97\x4d\xce\x1e\x60\xfc\x77\xce\x38\xa5\x44\xa4\xe5\x09\xa7\x1e\xaa\x44\x04\x56\x2b\xfc\x13\x43\x32\x96\x6f\x30\x72\x84\x78\x4c\xc1\x6d\x66\xd9\x32\x52\x0e\x6c\x01\xc7\x25\x90\xff\x96\x85\x8b\x45\x2a\x3c\x2e\x77\x7c\x23\x25\x8b\x45\x2b\xe5\xff\x17\xf0\xb6\x58\xec\xc4\xf0\xd4\x30\xc4\x45\x7a\x1e\xaa\x00\xe9\x4a\xe3\xf6\xe5\xc8\x0b\x60\x93\x02\x5c\x72\x68\x2a\x56\x0a\xa4\xcc\x46\xaa\x82\x38\xe7\xb9\xf1\xb6\xc2\xbc\x00\xff\x9b\xb3\x87\xd5\xc0\x06\x97\xc7\x6d\x4a\x87\x38\x4a\x7b\x5d\x14\x5e\x2c\x8c\xca\xbd\xdb\x32\xe9\x8b\x98\xe5\x47\x41\xac\x2e\xfa\x25\xd1\xef\xda\x66\xdc\x96\xb5\x24\x64\x69\xa4\x84\xd0\x07\xa8\x1f\xf4\x98\x92\x19\x57\x68\x2b\x2b\xd4\x4b\x61\xce\x2c\xdc\xcc\x9a\xa6\x83\xf0\xbf\xae\x32\x83\xaa\xad\x4e\x45\xd3\x69\x00\x79\xec\xd5\xc8\x63\x41\xf4\x82\x5c\x66\xb1\x78\xc7\xb7\xca\xd4\x1b\x8b\x2f\xc7\x11\x0b\x15\x03\x97\x1a\xe4\x8a\x42\x34\x74\xef\xf8\x06\x5f\x37\x37\x64\x4f\x4a\x5b\x15\x0e\xb6\x68\x27\xc1\x21\x6d\xb1\x30\xe0\xfb\x80\x86\xa2\x24\xa1\x91\x4c\xe0\x8e\x76\xd4\x46\x8a\x68\x91\xd0\xc0\x8d\x50\xc2\xfd\x90\xe6\xa5\x73\x08\xf5\x1a\x55\xaa\x67\x4b\x0a\xd1\x10\x4b\xc9\x66\x54\x83\x11\x14\x8d\x44\xd2\xf6\x21\x62\xf7\xf9\xae\xad\x0a\x25\x27\x1e\xb2\xba\x8f\x21\xc9\xae\x14\xbe\x79\x14\x8c\x97\x84\x12\x02\xcc\x05\xa4\x29\x02\x7c\xfe\x53\x9c\x1b\xd1\xa6\x63\x53\xcb\x24\x14\xe2\xb7\x18\x01\x88\xb8\x4d\xb2\xb0\x6e\xdd\x8a\xfe\xe9\xd8\x15\x99\xdc\xe3\x71\x4e\x5f\x05\xef\xc6\xc1\x72\x69\x84\xec\x21\xf5\x08\x7b\x4c\xab\x82\xfd\x88\x06\x2c\xd8\xa3\x1e\x0d\xd8\xf1\x1e\x1f\x33\x47\x0a\x86\x11\xba\x1e\x27\x47\x17\x0b\x30\xab\x02\x80\x80\x70\x15\x28\xff\xf6\x39\xd7\xef\x35\xe7\xc3\xe7\x74\x78\xc6\xb7\x5f\x43\xb2\x89\x68\x16\x80\x07\xeb\xdc\xfd\xaf\x6f\xf8\x34\x9a\x05\x73\x1a\x91\x49\xce\x9e\xb8\xd1\xd2\x88\xdc\xbd\x58\x8d\xe3\x06\x18\x4e\x45\x95\x9c\x65\xe5\x08\x75\x6f\xaf\x49\x29\x0c\x32\x08\xfe\xfa\x7f\x8d\xaf\x63\xf9\xfa\x24\x0d\x4e\xbc\x34\x78\x26\x58\x88\x15\x2e\x5b\x7a\x3f\xab\x85\x7e\x4c\x8e\x95\xd0\x6d\xb5\x97\x02\xfd\x0a\xee\x7b\xb5\x05\x7c\xbf\xd2\x0e\x1e\x9d\x2f\x45\xe1\x7d\x21\x0e\xe0\xb4\xbe\x1f\xcf\x3c\xc1\xe7\x7b\xc0\xe7\x7b\xe8\xdf\x21\x8b\xa2\x3f\x7f\xec\x1d\x07\xae\x47\x0b\x43\x62\x37\xa7\x5b\xf0\x41\x24\x8e\x7e\xb0\xcb\xa5\xa1\xfb\x9a\x6f\x97\x49\xee\xa2\x9d\xb1\x28\x3d\xce\x97\xf5\xb0\xad\xa5\x61\x6a\x9d\xa9\x29\x30\x43\x53\xbe\x0f\x94\x60\xb8\xfe\x2c\x06\xca\x22\xa9\xa4\x36\x34\x50\x5a\xbe\x71\x1a\x83\xc0\x64\x5f\x24\x18\x6f\x3d\x10\x92\x8f\xcc\x4d\x54\x44\x03\x42\x57\xdf\x87\xd8\x65\x19\x21\x67\xbe\x0f\x66\x91\xc2\x55\xe9\xe8\x42\x3f\x8c\xa3\xba\xf7\x45\xb5\x71\x90\x18\x1d\x55\x30\x9b\xe2\xef\xcf\x79\x61\x35\x82\x88\x71\x44\x96\xc9\x3a\x53\xdc\x84\x2c\x2b\x09\x66\x2b\xc3\x20\xf4\xbc\xef\x52\x37\x2d\x6c\xb1\x84\xca\xa6\x63\xbc\xc6\x35\xe7\x1d\x7c\x1a\x8b\x50\x89\x21\x3f\x0d\x7d\xb7\x05\xd9\x3a\x7d\xd7\x13\x92\x4f\x7e\x38\x46\xc5\x35\xad\xe9\x98\xa2\xca\x2d\x5f\xb1\x9f\x52\x5e\xcc\x6f\xb7\x7f\x49\xdb\x6d\x24\x25\xe5\x6f\xfd\x68\x8c\x31\xd2\x76\x81\xdd\xdd\x98\xb3\xad\xb3\x39\xfd\x85\x63\x54\xbf\x21\x20\x24\x28\x4e\x85\x91\x5b\x11\x20\x96\xe3\xe2\x15\xc4\x08\x38\x91\x0a\x8c\xe6\x06\x9d\x0e\xe0\xb7\x42\xda\x57\xda\xcc\x4d\x72\x37\x17\x6a\xb2\x48\x5a\x65\x85\x6e\x3e\xb3\xe6\x13\x7d\xcc\xe9\x87\x7c\x66\xcf\xdb\x6d\x83\x63\x12\xb7\x65\x92\xe5\xb2\xd2\x8e\x9a\x81\x9a\x53\x9a\x39\xc5\x28\x15\x44\xc4\x98\x08\x15\x3f\x65\x43\x19\x2b\x21\xd4\x2f\x64\x55\x2d\x18\x70\xec\x82\x07\x83\x0c\xa9\x0e\x88\xd5\x73\xc5\xf6\x84\xbb\xc0\x35\x02\x7e\x3a\xe6\xea\xac\x21\x06\x0e\x68\x38\x4d\xc1\x22\x5c\xd4\x3a\xdd\xf7\x8d\x80\xe6\x2c\xcc\x28\x9f\x67\xac\x4e\x7e\xe6\x06\xbc\xb7\x87\xae\xbf\xe4\x18\xe4\xd5\x4a\x08\x4b\xdc\xd9\x02\x6e\x34\xbd\x09\xcf\xfc\x98\x1c\xaf\x66\x94\x28\x64\x8c\x39\xe2\x83\x49\xd5\x32\x16\xfc\xad\x5f\xee\x27\xc7\x8f\x05\x6e\x41\xfa\x44\x79\xc0\x91\x4d\xb5\xd6\xf3\x2d\x78\x91\x06\x95\x73\x06\xe2\x58\xde\xd7\x15\x72\xd5\xad\x32\xdd\x45\x3f\x23\x57\xc2\x7f\x11\x87\xe9\xb0\x16\x7d\xf4\x24\x4d\xfc\x20\xcb\x24\xd9\x0b\x8e\xe1\x91\x30\x5b\x28\x49\x65\xd2\x6e\xb7\x5e\x0b\xf6\xea\xb4\x3c\xd6\xa1\xb5\x5f\x52\x6c\xb4\xfe\x12\xc3\xe8\x9b\x93\xa8\x3c\xb7\xa2\x52\xda\x26\x1a\x90\x36\x0b\xf7\x92\x54\x19\x90\xe1\x71\xce\x19\xfa\xac\xee\x34\x49\xbd\x24\xa0\xb6\x2f\xb6\x76\xf3\xf6\x0b\x38\x79\x55\x97\xa1\x93\x25\x62\x1a\x10\x07\x56\x57\x82\x73\x7a\xc7\xde\x89\xd1\x20\xc1\x8f\xce\xe9\x28\x59\x92\x0b\xec\x72\xa9\xc7\xb2\x24\xcd\x8d\x26\x13\x36\x20\x25\xd7\xf9\x69\x45\x84\xb4\xd7\x78\x69\xdd\x7b\xb4\xb3\xf3\xe8\xb7\x9f\x7e\xbe\x3f\xb5\xc6\xd1\xba\x42\x85\x2b\xd7\x74\xc3\x1a\x9b\xb0\x83\x4f\xd9\x43\xc1\x36\xd7\x06\x5b\x3f\xfa\xc9\xb2\x88\x9e\xf4\x26\x56\x42\xbf\x84\x82\xd9\xe6\x04\xd5\xca\xd2\x1a\x97\x5a\x56\xd2\x6e\x07\xb1\x21\x92\x39\x9c\xb2\x27\x22\x7a\xee\x23\xb1\xca\xb0\x83\xe5\x5c\x18\x64\x59\x83\x44\x4e\x8c\x2f\x61\x17\xa8\x52\xf2\xd5\xbd\xfa\xdf\x54\x78\x20\x9c\x81\x31\xd1\x62\x01\xcc\xb9\x60\xcd\x81\x54\x95\x31\x3f\xe1\xfd\x24\x67\x0f\x38\xb9\xb6\x58\x9c\x2d\x6b\x54\x5d\xce\x1e\xf0\x69\x38\x8e\x65\x48\xd6\x5c\x1e\x57\x90\x30\x4b\x54\x0f\x12\x04\x70\x77\x90\x01\xf7\x43\x99\xf6\xf1\x11\x18\x38\x7a\xa0\xfa\x3d\xbf\x11\x42\x7f\x49\x89\xda\x50\x21\x6f\xc5\xb8\x3b\x7c\xdf\x1b\xe5\x8a\x60\x50\x25\xb6\xe5\xb5\xdb\xfc\xaf\x0c\xc5\x28\x1c\x47\x84\x24\x83\xf3\xa7\xd1\xf8\x0c\x6c\x29\x0e\x62\xa1\x29\xf0\xe6\xa4\x8c\x40\x5e\x9a\x2a\x4c\xcc\x5b\x6e\x38\x09\x37\x36\xa4\x9c\x19\x22\x29\x7a\xe3\xb3\xd2\x8a\x9d\x37\x74\x09\xca\x25\x65\x8f\x67\xc9\x1c\xd2\x46\x3d\x99\x25\x73\x72\xe6\xbb\x2d\x6b\xb2\x97\x06\xde\x2b\xcd\x5b\x2e\x7d\xb7\x65\x2e\xc3\x03\xc3\x27\x67\x81\x9b\x8a\xe7\xd1\x72\x29\xc3\xc6\x2d\x7d\x37\x98\x06\x95\x25\x1e\x0b\xb1\x4b\xce\x76\xa8\x91\xa2\xdd\xc5\x0e\xe7\x71\x53\xd7\x03\xbd\xae\x21\x22\xdf\x04\x1e\x47\xef\x46\x79\x2d\xc4\x5a\x7c\xaa\x76\xdc\x14\xd8\xf3\x1d\x1a\x73\xb2\x3b\x76\xfd\xa9\xaf\x22\x09\x8e\x74\xc7\x5e\x6c\xc4\x7c\x6e\xd9\x13\x9a\x22\x90\x64\xae\x91\xe0\x42\x13\x76\x38\xc9\x84\xca\x29\x43\xf9\xb6\x91\xb1\x97\xa7\x59\xb0\x95\x9c\xc6\xf9\xc6\x06\x35\xff\xe5\x2a\x0f\xda\x6d\x35\x5b\x50\xf5\xae\x42\xcb\x64\xc0\x5c\x4e\x13\x76\x38\x35\x12\x76\x58\xc5\x5c\xd4\x77\x13\x76\x48\xc6\x31\xd0\x2e\xfb\xbe\x11\xd3\x94\xef\x80\x82\x07\xa5\x09\x3b\x22\x64\xcc\x47\x53\xd6\xbf\x58\x18\x3f\xf8\x60\x95\x11\xaf\xc6\x44\xe1\x35\x55\x1b\x21\x74\x9b\x33\x12\x30\xcd\x58\x5d\xa5\xb9\xf2\x39\x27\x7f\x0c\xbf\x1c\xa3\xab\x5c\x2f\x16\x26\x4d\xd8\x61\x8b\x4f\x8c\xf2\xb8\xd3\xe1\x4f\x5d\x9f\xf3\x8f\x3e\x7d\x80\x04\x10\x5f\x86\xc4\x8d\xd7\xb9\xe1\x80\xb1\x20\xdf\x44\x89\x1b\x17\x9a\xca\xaa\x19\x40\x76\x53\x28\x0f\xf9\xa5\xde\x09\x51\xc9\x25\xf4\xff\x10\x7e\x86\xc6\x2d\xd7\x35\x92\x8e\x6b\x24\xd3\xc2\x2b\xe7\x6d\xe1\x91\xe3\x13\xe1\xe8\x93\x10\x42\x83\xc5\xe2\x20\x46\xc5\x1d\x70\xb0\x4f\x68\xca\x41\x86\x94\xd8\x46\xa2\xa5\xd5\x68\xbd\xf0\xfa\x29\x0a\xf5\xa5\x14\x12\x59\x24\xf5\x4d\x23\x13\x0c\x8a\x2f\x1a\xb8\xb9\xba\x9e\xa1\x1b\xc9\x08\xc3\x21\x9c\xc9\xc1\x62\xc1\x59\xc7\xb2\x31\x49\xaf\x03\x2b\x15\xb9\xe1\x34\x1f\x07\xe2\xcc\x85\x50\x89\xec\x20\xe5\x8c\x56\x03\xff\x71\x93\x93\x51\x6b\xcf\x2c\x0d\x15\x71\x65\x5f\x96\x8d\x71\xc6\x57\x47\x0d\x9e\xbe\x7c\xc4\xbf\x78\x6b\x82\x9d\x53\x49\x37\x71\x84\x26\xd1\xe4\xa9\x1a\x60\xa2\xf6\xc4\xcd\x09\x05\xba\x83\x28\x47\x7f\x44\x26\x47\x75\x75\x78\x78\x60\x3c\x48\x09\xb8\x60\xa8\x31\x28\xff\xf2\x27\x8a\xe7\x45\x5d\x6e\x40\x7f\x12\x54\xb4\x52\x02\xec\x84\x02\xca\x39\xf9\x50\xe4\x19\xa0\x32\xb9\xe2\x2f\x20\x73\x13\xb6\x4a\x4f\x63\x34\xd8\x38\x6a\xb7\xbd\x3a\xf1\x01\xe1\xcd\x38\x2e\x9f\xae\x6a\xf1\xc9\x58\x8c\xf1\x61\x2d\x2e\x95\x08\xbe\xbd\x95\x1c\x9f\x9c\xe6\xc1\x3e\x1c\x98\xcf\xbd\xe8\xb4\x11\x68\x24\xd5\x0d\x94\x75\xee\x1a\xe2\x10\xba\xe3\x1b\x2f\xe3\x22\x54\x37\x61\x4f\xf8\x92\x50\x7e\x2c\x17\x4a\xaf\x7a\x13\x42\xe9\x2a\x25\x0e\xd0\x22\xe7\x91\xa7\xd2\x37\x73\xac\xeb\x40\x1f\x37\x07\x82\x6f\xd2\xda\x42\x48\x40\xaf\x21\x9e\x83\x37\xf5\xc6\x22\x69\x98\x47\xa4\xd3\xe7\xe6\x6e\xb6\x49\xc6\xb3\x39\x6d\x81\xf3\xd0\x51\x92\x81\x7a\x95\xff\x2a\x81\x83\x2f\x72\xd9\xe3\xc7\x1b\x3f\x4b\x02\xb5\x56\x25\xcb\x86\x39\x09\x4b\xef\x45\x11\x92\x0c\x84\x3e\xae\xfb\x97\xcf\x89\xe2\x9c\x9f\x75\x1d\x6b\x8e\x67\xd1\x72\xb9\x2c\x3d\x74\x79\x01\x7e\xd2\x8a\xc9\xc6\x73\x80\xf7\x71\xa7\x28\x92\xc6\xbc\x08\xdb\x21\x14\xdd\x06\x4b\xde\x02\x76\xc4\xef\x8d\x89\x91\xef\x48\x29\x4a\x52\x9f\x5b\xe4\x00\xe0\x5d\xda\xfc\x0e\x7c\xfb\x68\xc4\xe2\x46\xf9\x0c\xe8\xd5\xf9\xeb\x1f\x1a\x1b\x3e\xc1\xd7\xaa\x84\x48\x08\x88\x56\x1f\x55\x4b\xd5\xe5\x3d\xe7\xbd\xac\x7e\x59\xa1\xd6\xd6\xbe\x69\xf8\xa6\xc0\xb9\xeb\x5f\x35\x7c\x25\x11\xee\xda\x37\xd5\x6f\x9a\x37\xde\xc5\x45\x6a\x2d\x07\x52\x55\xb5\xc5\xc1\xb2\x36\x3b\x7b\xd5\xc2\xa5\x99\xfa\xbd\x24\x85\x68\xa3\x95\xd7\xbf\x7b\xd5\xe2\xa5\x86\xa4\xa4\xa7\xef\x25\x69\xf3\xec\xfc\xe2\xad\x0c\xef\xa9\x94\x42\x54\x5e\xec\xed\x35\xcc\xdd\xed\x2c\x7f\x96\xe0\x3e\xad\x96\xfe\xdf\x5e\x03\xcc\x54\xf8\xd0\xf3\x5f\xd7\xda\xe2\x67\xf0\xea\xc0\x93\x5a\x23\x42\xe0\xb4\x5a\x30\xad\xf7\x9d\x17\x6b\x9c\xcb\xb8\x56\xd2\x47\x25\xc0\xd3\xb5\x1f\xfc\xe0\x35\x82\xfd\x6d\x91\x66\x59\x18\x49\x55\x8a\xbc\xda\x6b\x0c\x3e\x19\x06\x99\xa1\x96\xa3\x67\x68\xf2\x80\x26\x13\xe3\xb3\xe6\xf4\x7a\x0f\xd2\xe5\x92\x96\xc1\x8c\xd6\x94\xfa\x25\x2d\x4c\xa6\xde\xc6\xf4\x6e\x4c\x7f\x46\x15\xeb\x5e\xbc\x1a\x4f\xc9\x78\x1b\x9f\xa3\x26\xbc\xbb\xfa\xb2\x49\x55\xb7\x1a\x31\xe9\x4c\xd8\x46\xf0\x5a\xc6\x3f\xc7\xb4\x86\x02\xc6\x75\x39\xed\xcf\x71\x93\xae\x8d\xfe\x1c\xd7\x91\x47\x21\x01\x5e\x95\xcb\xd4\x62\xb2\xae\x7e\x2b\x05\xcc\x2b\x1f\x63\x7b\xef\xdf\xa9\x9a\x70\x5a\x45\x27\xab\x9d\x5a\x53\x65\x95\x64\x82\x5e\x56\xb8\x1c\x15\x5d\x5f\x50\x4b\x41\x01\xca\x3a\x24\x32\xb8\x4a\x25\x05\xa7\xcd\x6b\x59\x29\xa8\x42\x5d\x73\x45\x4b\xda\x88\x18\xc7\x4d\xd2\x0e\xed\xe7\xb8\x19\x8d\x8a\x89\x28\x21\xfe\x97\x94\x56\xf6\xc9\x83\x94\x4a\x9a\x70\x7c\x3f\xa5\xd5\xf0\x61\xe3\xff\xa6\x4b\xfa\x36\x2e\xc3\x22\xad\x42\xb8\xfb\x36\x26\xf4\x6e\x53\x91\x26\x38\x77\xef\xc6\x6b\x83\xb0\x17\xa7\x28\xa7\x04\xa3\x76\xdb\x48\xd5\xd4\x52\xe8\x1c\x04\xfc\x7e\x2d\xd7\xac\x9a\x9c\x57\x09\x90\xe2\x1f\x79\xe9\x56\xb2\x1f\xdc\xce\x0d\xb3\x90\xa5\x3a\xf6\x2d\xaf\xdd\xb6\xec\xc1\xbf\x3c\xce\xbe\xb9\xee\xcc\xe9\x52\xa7\x47\xfb\x26\xed\xdb\xb4\xef\xd0\x51\x7f\xae\x64\x42\x9a\x46\xe3\x20\xf6\x93\xfd\xe0\xd7\x27\x3f\x15\x71\xc9\x0c\x35\xc4\x44\xf0\x81\x4d\x5e\xb5\xbd\x10\x7c\x62\x7d\x65\xe2\x60\x1a\x6f\x17\xd2\x64\x14\x16\x84\x8b\x85\x9e\xf9\x47\xc1\x71\xa0\x41\x1c\x51\x9d\x9e\xba\x26\xdd\x76\x75\x9d\x3e\x77\x5b\x16\x3d\xe4\x7f\x6e\xbb\xb3\xf9\x24\x1a\x43\x6c\x62\x43\x44\x1b\x9e\x9d\x42\x30\x58\xd3\x75\x4f\x49\xbb\x8d\x92\xc7\x63\x21\xdd\xde\xe2\xaf\xe7\x93\xec\x4d\x98\xfb\x47\x46\x42\xce\x7c\x2f\x0b\xaa\xcd\x8c\xc3\x03\xa3\xb5\xb5\x58\xb4\xf6\x51\xf0\xbf\x85\x82\xcc\x90\x9c\xc5\x86\xfe\x13\x9a\x4b\x68\xf8\x05\xd3\x49\x21\x9d\x80\x8e\x25\xae\x1e\x27\xe2\xa5\x3e\xf1\x93\x38\x0f\xe3\xd3\x60\xb9\xdd\x71\xb7\xaa\x0b\xce\x4b\xca\x62\x50\xc3\x44\xe9\x08\x74\x61\xab\xdd\x3e\x29\x3a\xb0\x5a\x41\x19\x9c\x65\xac\xb7\xdc\xad\xa2\x8b\x30\x05\x5b\xed\x76\x6c\xe8\x7c\x19\xb5\x93\x24\x8c\x73\xcc\x91\x13\x45\xc9\x9b\x60\x5f\x0b\x63\xd1\xc1\xb1\xa6\x77\xb6\x6a\x03\xe0\x53\xbc\x66\x10\x52\xce\x14\xb9\xdb\xb8\x0a\x21\x11\x9f\x96\x19\xf5\xb2\x19\x16\x99\x4b\x6e\x6d\x1b\xa0\x3d\x71\xf5\x83\x30\x0a\x74\x99\xdb\x75\xaa\xa7\x41\x04\x3b\x58\x47\x86\x67\xbb\xdd\x06\x91\x40\xb4\x5a\x42\x4b\x52\xcd\x3b\xcd\x8f\x92\x34\xcc\xdf\xc9\xe2\x53\xbd\x78\xa4\x41\x38\x17\x2d\x8b\xbc\xec\x48\x1f\xcb\xa5\xdc\xf7\x72\x4f\x5f\xae\xcc\x2c\x3e\x1f\xeb\x53\xdd\x75\xb7\xa6\xd8\xc5\xdb\xae\x3e\x85\x95\x03\x5e\x58\x27\x63\xfd\x1f\xca\xdb\x2d\x57\xff\x07\xbc\x3d\x10\x01\xce\x75\x54\x27\xc0\x24\xeb\xbb\xb9\x2e\x2e\x62\x79\x91\xe2\x05\x7e\xfd\xce\xeb\xb8\xb0\x80\xea\x22\x97\x93\x3b\x46\x8b\x4c\x65\xfa\x7c\x16\xcd\xc9\x59\xe2\x96\x13\x54\x2e\x40\x6c\xe8\x0f\x85\xd7\x7b\x01\x7e\xb4\x19\xc1\xa8\xcd\xad\x99\x48\x0e\x3a\x9b\xbc\xaf\x8b\x05\xfc\x46\xb3\xd3\x8e\x35\x07\x20\xbf\xfb\xf6\x04\x32\xbf\x69\x9b\x54\x3b\x4c\x72\x84\x13\xda\xdc\xa9\xc4\x55\x96\x22\x3c\x8c\x93\x34\xc0\xb5\x08\x32\xbd\xa9\x17\xd0\x70\x01\x1a\x14\xe1\xa2\x25\x56\x5d\x4e\x5b\xe4\xfa\x2c\xc2\x64\xa8\x2e\x87\x6d\xf4\x9e\x74\x7d\x96\xe0\x10\x5f\xbb\x3e\x7b\x8d\x97\x99\xeb\xb3\x4c\xf8\xa9\x88\x09\xb8\xed\xfa\xec\x36\x5e\xde\x71\x7d\x76\x47\x78\x98\xba\x3e\xfb\xb3\x00\x76\x1c\xbd\x0b\xa3\xdf\xdd\xe5\x17\x44\xfc\xc2\xd6\xd9\xdd\xd5\xc2\x4c\xf3\x62\x4d\x98\x47\x69\x7e\xb1\x97\xf8\xa4\x2b\x53\x21\x00\xaf\x0c\x60\x06\xa0\x45\xae\xda\x63\x0e\x82\x8d\x3d\x2e\x01\xb3\xdc\xf1\xff\xc0\x1d\x9f\x88\x35\x03\x1a\xef\x05\xdc\xd8\xf3\x89\x51\x9d\x52\x15\x8f\x2d\x16\x80\x2c\x92\x76\x5b\x5f\xf0\x5f\xd4\xac\xb5\xdc\x17\xed\x36\x80\x00\xff\xdd\xdd\x15\x17\x53\xf1\xcb\x1b\x7b\x41\xe4\xca\x34\x0f\x69\xa5\xd3\xeb\x06\x9a\x89\x28\xc9\x95\x19\x3c\xf1\xf2\x23\x05\xa2\xde\x7b\xb1\x71\xab\xae\x9d\xc5\x62\x03\x2f\x9b\x36\x87\xc0\x1f\xc5\xae\x90\x53\xb1\x45\xce\x9a\x61\xf4\x72\x33\x71\xee\x48\xaf\x06\x71\x35\x0c\xca\x6f\x35\x70\x96\x1b\x5f\x6e\x07\xae\xc1\x98\xc5\x88\xab\x5b\xff\xc6\xe6\x8d\xda\xe6\x5f\xdf\x48\x33\x32\xc8\x02\x3f\x89\xf7\xe5\xfe\x68\xec\x48\xa5\x08\xef\xc9\x79\xcd\xd0\x8b\xbb\x59\xf6\xa4\xb1\xb9\x5a\x85\x8d\x8b\xad\xf6\xa0\x8a\x7b\x8b\x36\x8b\xf7\x6a\xcb\x4d\x0d\x62\x0b\xff\x06\x84\x00\x4a\x92\xe7\xed\xb6\x11\x1b\xfa\xbf\x8b\x7c\x51\x59\x10\xc4\x7c\x79\xb7\x3b\xae\xfe\xcf\xae\xa9\x13\x0a\x09\xfb\xb6\x5c\x73\xb2\x75\x6b\x5b\x4a\xa4\xb6\x3a\x1d\xc2\x8f\x1a\xd7\x35\x5e\xb8\xdb\xb3\xad\x39\xdf\xc9\xbb\xb1\xee\xba\x2f\xf8\x45\xca\x2f\xa6\x0a\x71\xf2\xe6\x28\xcc\x31\x09\x3a\xb8\x66\xc9\xee\x30\x7e\xb6\x8d\x79\xe1\x76\x5b\x18\x1d\x22\xa0\x4e\x05\xbc\xea\xfa\xd8\x78\xe1\xe6\xc6\x8b\x32\x0f\xb5\xfa\xbe\xe3\xbe\xc0\xe3\xf7\x4e\xc7\x7d\x41\x26\x9c\x06\x58\x4a\x9c\x24\x50\x35\x9c\x25\x2a\x56\x5d\x2c\x10\x21\x2e\x16\x78\xaa\x92\xb3\xd3\x0d\x57\x0e\x8c\x4a\x9a\x09\xc0\xb8\x4a\x2e\xa9\x2b\xa8\x80\xfa\x95\x9a\xb2\x5b\x45\x53\x25\x1a\xdc\x9e\x99\x73\x89\x09\xb7\x67\xd6\x5c\x20\x43\x7e\x39\x35\xcc\xf2\x8b\x72\x9f\xab\xfe\xf7\xdb\x04\x3a\xbd\xba\xad\x05\xf1\x48\xc6\xe7\xee\xf7\x5c\xf6\x38\x96\x17\x29\xd0\x1a\x6b\x17\xaf\x18\x3a\x5f\x3c\x3e\x2f\x2a\xa0\xe1\x94\x14\x97\xb1\x27\x48\x0a\x24\x09\x17\x8b\x43\x72\xb5\xa5\x91\x27\x73\xe3\x90\xd7\x8d\x58\x21\x03\x2b\x03\x6d\xa4\x8b\xa6\x86\x3e\x83\x01\x1f\xba\x2d\x73\xac\xcf\x11\xfd\x19\x9c\x94\x87\x4d\xb0\x45\xc6\xca\x54\x94\x28\x10\xcc\x5c\x92\x2c\xdf\x94\xe3\xc4\x5d\xb7\xac\x28\x40\xd7\x76\xfb\x24\xe1\xfd\x2c\xe7\xc8\x75\xcb\x3e\x2b\xd3\x09\xc5\xf8\xfc\x6d\xce\xcc\x8d\xd1\x7c\xb3\x42\x7d\x4f\xae\x0a\xe9\x8b\x45\x48\x64\xf0\xc4\xed\x76\xdb\x30\xb6\x4b\xcb\xc2\x6d\x6a\x99\x84\xb4\x56\xc9\xe5\xd7\xee\x76\x87\x43\x17\xc2\x58\xd9\xcb\x35\x73\x7f\x45\xd0\xaa\xce\x27\x1f\x2e\x4e\xe3\x78\x1d\x9b\xda\x78\x52\x2a\xed\x03\xb0\x29\x87\xd8\x8d\xdd\xdd\x1b\x75\x5e\x83\x17\xaf\xd3\x4c\xb0\x2f\x68\x1d\xf7\xca\xc1\x34\x12\xaf\xf0\x89\x42\x79\x57\xbf\x6d\xb7\x8d\x10\x16\x00\x1f\x22\x81\x34\x3d\x8f\x3c\xdf\x16\x84\xf9\xd8\xa8\x9d\xc2\xb5\xee\x57\x3a\xc0\xc7\x61\xbc\x70\x8f\x66\xdb\x55\x66\x0c\xfc\x38\xb6\xdd\x17\x84\xea\x8c\xe9\xae\xbb\x2d\x98\x07\x41\xee\xd4\x47\x2a\x15\x75\xc8\xf0\x42\x74\x40\x1d\x3e\x5b\x19\xd7\xb4\x56\x90\x97\x43\x70\xaa\x92\x03\xe0\xed\x2e\xca\x4a\xf4\x65\xbb\x0a\x2e\x53\x91\x1f\x60\x3c\x57\x20\x3f\x63\xdb\xe5\x0f\x3b\xfa\x58\x2f\x69\x34\xde\xda\x36\x11\x1b\xe8\x32\xcc\x92\x84\xdf\x06\x6e\xa9\x72\x34\xe2\x57\xe3\x10\x36\x09\x1f\xdf\xe5\x59\xa9\xdb\x1d\x37\xc0\x05\x5b\xd7\x92\xda\x50\xf1\xf4\x0a\xcc\xda\x16\xc7\x3f\xcb\xd3\x4e\x47\xf1\xdd\x2c\x32\xfa\xdc\x71\x05\x43\x27\x66\xbc\xc8\xc3\xf3\xa7\x12\xd9\xe6\xb5\xc8\xfa\x5a\xbc\x2c\x1d\x50\xb6\x5c\x39\x7f\xe2\xd5\xb6\x2b\xf7\x99\x12\xd0\x58\x46\x2b\x91\x41\x14\xbd\xc5\xa2\x92\xed\xca\x5f\x2c\x0c\x74\x21\xf1\x8d\x52\x57\x46\xa4\xf7\x4a\x54\x65\x07\x57\x52\x33\x1d\x96\x91\xdd\xfe\x98\x69\xbb\xf9\x6e\xba\x1b\xef\x1e\xcc\x3b\x0b\xf5\xe6\x07\x0c\xf9\x86\x2a\x7d\x11\x00\x38\x76\x5b\xd6\x24\x4f\xdf\x09\x3b\x0e\xde\x81\x5f\x9f\xec\x18\xfa\x1e\x47\xab\x79\x7e\x32\xde\xdc\xf4\x74\x32\x49\x18\xdf\x25\x60\x2e\xab\xfb\xff\xb4\xcd\x7d\x9d\xc6\x6e\x51\x60\x13\x1f\xb9\xae\x9b\xb0\xa3\x34\x38\x28\x93\x6e\x83\xf3\x5d\x2c\xed\x54\xab\xb6\xe3\x60\x8d\x33\xc9\xd8\x41\x7e\xe2\xda\x16\xcd\x18\x07\x7c\xd7\xa4\x19\x3b\x4c\x4e\x8e\x82\xd4\x1d\xf0\x6b\xde\x86\x3b\x94\x57\x99\xdb\xed\x3a\x34\x63\x6f\x32\x7c\xf6\x26\x83\x27\xc2\xb4\xb5\xa9\xfe\xa3\x99\xfe\x4f\x3b\xd0\xe7\xae\xce\x74\x7a\x34\xd3\x99\xbc\xc3\xdb\x7f\xda\x01\xab\xde\x96\xef\xd1\xa5\xd6\xdd\x9c\x79\x1b\x7f\xdd\xde\x78\x31\xdf\xa4\x27\xc5\x8d\xb9\x31\xea\xec\x6e\xb0\xf9\xe6\x44\xf1\x85\x76\xcf\x72\xa1\x40\x69\x10\xdb\xa3\xb9\x1a\x9f\x1d\x7a\x18\xe4\x1a\xbf\x32\xca\x93\xf9\x98\xa8\xc5\x0e\x85\xcf\x53\x11\x3b\x59\x97\x08\xe1\x8e\xa4\xf0\x10\x44\x21\xe8\x9c\x20\xdd\x84\x94\x4c\x50\x76\xfa\x58\xef\xe0\x25\x1a\x3f\xfc\x5b\x2f\x2c\xaf\x93\x3c\xf1\x93\xa8\x63\x48\x89\xcb\xe6\xa6\xde\x89\xb0\x30\x3f\x49\xa1\x3c\x16\x15\x6b\xde\x11\xfb\x14\xe1\x1d\x12\x88\x61\xff\x23\x72\xb6\x16\x2e\x23\x94\x11\x6b\xb2\xbd\xda\x4c\x44\x1c\x31\x61\x55\x45\x09\x69\x55\x71\xbc\x58\x54\x6a\xe2\x45\x69\x55\x96\x27\x2a\xe7\xfd\xad\x55\x7c\x0c\x99\x71\x60\xd3\x22\x92\x4d\x3a\xc5\x5c\xbc\xc6\x17\x89\x18\x42\x02\x91\x0e\xcf\x84\x20\x51\x20\xef\xed\x76\xbb\xd2\x38\x92\x17\x6a\x83\x7c\x4a\x6a\x8d\x2a\x35\xc2\xdb\x4b\xd6\x0a\x44\x8b\x9c\xa7\x24\xad\x0f\xe5\xb5\x98\x1f\xfe\xe6\x12\x35\x02\x99\x23\x6b\x13\x4b\xb7\x76\x72\xf8\xba\x8b\x59\x91\x31\x0e\x36\x75\x61\xa5\xf0\xce\x13\x0d\xcb\x4a\x9a\x1a\x37\x4a\x3c\x58\xeb\x47\x23\xf9\x2c\xfa\x95\x05\x5e\xea\x1f\xd5\x7b\xb5\x58\x60\xf5\xb7\x05\xad\x85\x37\x45\x5f\x6f\x63\x77\xc4\xb7\xeb\x3b\x83\x67\x18\xd4\x10\xcd\xcc\xb9\x70\xd0\x41\xa9\x82\x45\x48\xbd\x9f\xe2\xa4\x93\x2b\xeb\x65\x6b\xfb\x25\x69\x3f\xbc\x29\xfa\x25\xb7\x82\x07\xd2\xed\x02\x76\x8d\xa8\x22\x62\x84\x2f\x2f\xd3\x1f\xe5\x68\x1d\xcb\xef\xe5\x7a\x26\x69\x78\x18\xc6\x32\xe1\x74\x61\xd6\x5b\xf4\x30\x22\x12\x51\x48\x11\xb8\x78\x8c\x72\x70\x94\x8e\x16\x3c\x97\xb8\xfc\xd3\x7b\xed\x65\x7e\x1a\x9e\x48\x66\xe3\xd8\x0b\xa3\x3c\xd1\xc7\xa2\x2e\x8e\x50\x64\xcc\x22\x89\x67\xd0\xf9\xa8\xd8\xc2\x80\x3b\xc6\xba\xbe\xc4\x00\x04\xa7\x6e\xc4\x7e\x7d\xb2\x33\x39\x05\x53\x31\x44\xc4\x88\x95\x7f\x7d\xb2\xd3\x68\xb2\x50\x2f\xc4\xc0\x31\xcb\x38\xa5\x5e\x7a\x08\x1a\xaa\x8c\x2c\xa9\xcf\xd2\xe0\x75\xf2\x6a\x4d\x55\xa7\xf5\xb7\xd2\x70\x9d\x17\xf4\x97\x4b\xa1\xfc\x41\x95\xe9\x4f\x6b\xa2\x4a\xd0\x67\xfc\x28\xa4\x8f\xe2\x5a\x06\x89\xc7\x7c\xd2\x15\x9f\x68\xa9\x14\x94\x09\x99\xf7\x92\x24\xcf\xf2\xd4\x3b\x29\x3c\x24\xcf\x2d\x25\x15\x51\x85\xb3\x36\x7d\x14\xb7\xdb\x8f\x62\x83\x40\x07\x4c\xda\x98\x6b\x06\x64\x0a\xfc\x6d\xe9\x23\x1b\x66\x27\xfc\x90\x05\x8f\x67\x30\x8f\x13\x19\x14\xe1\x5e\xaf\x7c\x0e\xae\xdb\x3a\x3d\xdb\x3b\xdd\xdb\x8b\x82\x0c\x9c\xcf\xc9\xf2\xa7\x78\xbd\x3b\x79\xbb\x7d\xde\xdb\x8a\xf5\xd8\xa3\xd8\x8d\xe8\xb3\xb8\xdd\x8e\x0c\x3e\xe9\xba\x9f\x1c\x9f\x44\x01\x86\x15\x68\xf0\xfc\x9e\xca\x09\x58\xf5\xd6\x8e\x12\x6f\x5f\xa7\x8f\xe3\x42\xdd\xbc\x5a\xe4\xc7\x47\x0f\x85\x51\xd5\x4e\xe2\xed\x07\xfb\x3a\x55\xce\x59\xf1\x55\xa3\xeb\x78\x59\xf7\x63\xf0\xfc\x26\x63\xf8\x55\xcf\xae\x15\x53\x62\x3d\x01\x78\x2a\xed\x98\x82\xb7\xe0\x0e\xdf\x6e\xaf\xbc\x39\x4e\xf6\x4f\xa3\x80\xe0\x0f\x13\xe5\x5c\xcf\x28\x0d\x79\x1b\xd2\x7d\xc9\x4c\x60\xf8\xcb\xbc\xe3\x7d\x82\x97\x06\xb8\x5a\x94\x06\x6d\x39\x0d\xa0\x2e\x48\x16\x0c\x3e\x7a\x64\x6d\xe7\xa6\xe2\x77\x1c\x91\x59\x3e\x77\x83\x59\x3e\x5f\x0a\x9b\xee\x55\x92\xc4\x73\xcf\x74\xb6\x79\x92\x26\xbc\xaa\x6c\x33\xf4\x93\x38\xdb\xcc\x52\x7f\xd3\x8f\xd2\x0d\xb8\xdb\xf0\x4e\x42\x96\x67\xfa\xf8\xff\x36\x6f\xb6\x6e\x5e\xe5\xbf\xd6\xcd\xdd\xff\xd3\x34\xfe\x8d\x76\xa9\x26\x34\xfe\xcd\xff\x69\xda\xee\x95\x5a\xd9\xe4\xfd\xd2\xe2\x84\x9f\x32\x79\xe8\xcb\x59\xd0\x0e\x92\xd3\x78\x5f\xbb\xb9\x59\xd7\xf9\xeb\xa7\x19\xa7\x20\xd2\xd0\xcf\xf5\xc9\xda\x9c\xda\x2f\x5f\x06\xd9\x43\x58\x4b\x9d\x8a\xe0\xb2\x7c\xcf\x50\x8f\x6d\x45\x5e\x1a\xe6\xef\x7e\xe2\x1d\xbf\x7d\x22\xc3\xa6\xcb\x7c\xf9\x06\xef\x0c\xdb\x3c\xcd\xc3\x28\xdb\xcc\x8e\xbc\x93\x60\x43\x46\xd9\xd8\x10\x11\x21\x52\xed\xe6\x66\xf3\x9c\x9f\xfb\x15\x5f\x03\x82\xe1\xe0\x9a\x7b\x9d\x52\x5d\x72\x13\x3a\x5d\x63\x38\x92\xb2\x2c\x8c\x0f\xa3\xe0\x27\x51\xd0\xad\x3f\x98\xd6\x1f\x8c\x39\x62\x49\x97\xb5\x04\xf2\xb5\x68\x3f\x4b\x42\x53\xc5\x22\x46\x3a\x6a\x43\x3e\xc5\x9a\xb1\xa6\xa9\x04\xe1\x16\x71\xa0\x79\x0b\x22\x47\xff\x53\x3e\x76\x8d\x13\x1c\xa0\xd1\x8a\x42\x2f\xd3\x8e\x4f\xb3\x5c\xdb\x0b\x34\x4f\x8b\x93\x78\x23\x38\x3e\xc9\xdf\x69\x68\x5f\xd8\x42\xf3\xbf\xcd\xdd\x6c\x53\xc6\xac\xbe\x42\x95\x71\x92\x6b\x7e\x12\xe7\x5e\x18\x6b\x5e\xfc\x4e\x15\xce\xf9\x47\x5e\xea\xf9\x79\x90\x66\xad\x22\xd8\x6f\xcb\x5c\x56\x06\x19\x27\xe9\xb1\x17\x85\x7f\x05\xd0\xc0\xca\x50\x0b\x07\x92\xaa\x2d\x40\xa5\x8a\x2c\xc8\x39\x18\x35\xfa\x50\xa2\x5b\x8a\x0c\x45\x08\xa4\xa0\x32\xab\x46\x84\xbe\xc7\xf0\x62\xb5\x27\xe0\xb1\x38\x8b\xe6\x1c\xb3\x70\x4c\xac\xf1\x1b\x78\xe2\x7a\x34\x60\x50\x4e\xb6\x2a\xc3\x98\x30\x09\x3c\x2c\x38\x0e\xf3\x2d\x88\x96\x01\x16\x2f\xa4\xb9\xd7\xb7\xf9\x4c\x36\x38\x64\xd6\xf2\x5e\x4e\x82\x32\x56\x4b\x11\xff\x26\x75\xc3\x59\x30\x9f\xac\x0e\x2b\x25\xed\x76\x33\x74\x47\x34\x5d\x07\xd4\xd1\xcc\x9b\x2f\xe9\xb9\x99\x97\x97\x64\x59\x1d\x84\xb7\xbf\x5f\x87\x4c\x89\x4f\x5b\x45\x12\xb2\x15\x60\xba\xf1\xec\x28\xd0\x24\x55\x52\x02\x66\xac\xe1\xa7\x5a\x14\xe6\x41\xea\x45\xda\x89\x97\x65\x28\x62\xca\x8f\x02\xed\x20\x89\xa2\xe4\x4d\x18\x1f\x72\x6a\x38\x0f\xd2\x78\xbc\x1b\x6b\xb5\xff\xce\x34\x1d\xf7\x3d\x0a\x7a\xe5\x5d\x11\xa1\x47\x5b\xde\x28\x8d\x5a\x3d\x5e\x73\x44\x22\x76\xe4\x65\x8a\xcf\x30\x84\x82\x43\x92\xbc\x0a\x58\x86\x47\x85\x89\xb6\x3a\x05\x47\x5e\xd6\x00\xb1\xad\x56\x38\x5b\x0f\x55\xf3\x6a\x15\x87\x41\x5e\x9f\xc5\x96\x24\x43\x35\xb0\x5e\x97\x96\xc0\x8d\x93\xfa\xec\xdd\x49\x20\x76\xe9\xa3\x38\x92\xbb\xba\x9c\xe0\x30\x53\xa5\x75\xbc\x57\xda\x31\x04\x0c\x62\x65\x08\xee\x2b\xf4\x16\xf6\xfe\x57\xbd\xea\x33\x1d\xfa\x88\xb7\x54\x63\x8c\xcd\x9b\x16\x1e\xd2\x9a\xac\xac\x3d\x4e\x7f\xd8\xf0\x62\x65\x40\xb7\x63\x8d\x9f\x3a\x9a\x7e\xa3\xe3\x75\xf4\x5d\x5d\x7b\x97\x9c\x6a\x5e\x1a\x68\x79\xfa\x8e\xf7\x38\x4f\x34\xce\xd5\x78\xb8\xc5\xf9\xed\x7e\x12\x64\xf1\x8d\x5c\x0b\xde\x86\x59\x2e\x87\x28\x8e\x42\x0d\xce\x42\xfe\x05\xa0\x4b\x15\x02\x05\x92\x30\x42\x2a\x41\x70\x49\x73\x37\x9d\x54\x64\x70\xcb\xd5\x43\x35\x5f\xd2\x8b\xc8\x12\x11\x5f\xf3\xfd\x48\x93\xab\x91\x27\x65\x53\xef\x47\xa2\x7c\x61\x32\x45\xda\x5e\x37\x52\x2a\x15\x22\x6c\x2d\x65\xb2\x42\x0d\x72\x4a\xe4\x93\x13\x3b\xa9\x6b\x52\x7f\xbd\xb7\xfa\x89\x17\xeb\x64\xe2\x63\x50\x3a\x4c\x76\x1e\x66\x1b\xc9\xc1\xc1\x46\xe6\xa7\x41\x10\xa3\xf4\x2e\x6e\x88\xa2\xcd\xf9\x33\xc9\x97\x21\xb3\x09\xe4\xb1\xc2\x6f\x96\x10\x9a\x48\x8e\xdb\x8d\x9b\xcb\x96\xf9\xf5\xfd\x28\xe5\xf3\xfd\x6b\x1c\xfe\xef\xa7\x7d\x57\x7f\xe9\x47\xe9\x4b\x3e\xe0\x97\x7a\x27\xa5\x69\xa7\x43\xa3\xe5\x0a\xd1\xfe\x24\x38\x88\x02\x1f\x63\xe0\xae\x76\x54\xbc\x65\x7c\xd6\xf2\xf4\xd4\xcf\x0d\xa5\xeb\x65\x1f\x44\x28\x40\x59\x28\x49\x39\x1f\x66\x34\x02\x41\x42\x64\x64\xb2\xfd\xc2\x99\x22\x73\x67\x88\x87\x74\xaa\x67\xe1\x5f\xfc\x27\x0f\xf3\x28\xd0\xe7\xd4\x30\x12\x45\xb8\x59\x95\xae\xaa\xb3\xa8\x98\x39\x2b\xdd\x58\x0d\x0b\xf9\x26\x0d\xf3\x6a\x96\xfd\x64\xb9\x24\x44\xed\x3b\xef\xa2\x62\x2c\x2f\x42\x09\x00\x6b\xfb\x8c\xf7\x4a\x9d\x26\x5c\x18\x0e\x02\x49\x0c\x86\xe2\x46\xcb\x22\x93\x88\x85\x22\x45\x7f\x65\x45\x68\xd5\x27\x07\x0b\xa0\x41\x38\x54\xcc\xe7\xe3\xb9\x27\xc4\xfd\x6a\x04\x83\x88\x2c\x69\x52\x31\xe0\x47\xec\xf6\x34\xfc\xab\x4a\xf4\xb5\x7e\x3e\x3d\xde\x0b\x52\xf0\xc8\x29\x2e\x6f\x99\x52\x63\x04\xf1\x71\xde\x84\xfb\xf9\x91\xa2\x57\xc0\xa7\x47\x41\x78\x78\x94\x63\x80\xf4\xf1\x6a\xf1\xa8\xa3\x9f\xbc\xd5\x1b\x3e\xc0\x17\xf5\xfe\x55\x4f\xc3\x66\xba\x54\xf1\x96\x99\x99\xf3\x3a\x99\xaa\x56\xe7\x27\x71\x0c\xd6\x11\x4d\x81\x97\x60\x05\x28\x6a\x4e\x4a\x57\xf3\x8a\xa7\x4e\x9a\x44\x81\x4e\x84\x67\x79\xb6\xfa\x8a\xea\x71\x12\x07\x52\x38\x5d\x8b\x7b\xc1\xc1\x51\xa1\x75\xab\x35\xe3\x5b\xaa\xae\x24\x5f\x13\xb1\x90\x2d\x34\xd3\x5d\xf3\xd6\x15\xf3\xaf\x2e\x26\x67\x20\x9a\xbb\x01\xbb\x83\x54\x5c\xd8\x6b\xb3\xdc\x34\x72\xf9\x59\x31\x31\x2f\x33\x95\xf4\x7e\x7a\xba\x87\xb2\xb7\x30\x89\xdd\xf0\x22\xb2\x3c\xc3\xd2\x7b\xc1\xb3\xc4\xc8\x2b\x46\xca\x1e\x7b\x19\xc6\x7c\x67\x96\x36\xf4\x1c\x01\x54\x06\xce\xeb\x96\x23\xcf\x69\x2b\xa8\x1f\xb9\x65\x3b\x47\x5e\x66\xac\xfb\x94\x48\xe2\x0e\xce\x12\x1c\x12\x36\x0d\x94\x45\xd1\x3e\x46\x13\xc8\xdd\x73\x9a\x39\x0c\xf2\x73\x9a\x91\xf6\x2b\xea\x4b\x59\xbb\xe8\xc3\x64\x6d\x01\x37\x5f\x36\xac\x21\xa2\x34\x91\xaa\x6a\x75\xad\xc4\x6b\xba\x0e\x2d\xb4\xd0\xfb\x6f\xdd\x6b\x70\x58\x5c\x3b\x1e\x01\xfc\xf5\x65\xaa\x6d\x34\x4f\xf6\x06\xb9\xaf\x86\xfd\xa6\x84\x72\x4a\x8b\x2d\x87\xdb\xc0\x05\x68\x5f\x05\xe9\x9c\x50\x01\x87\x90\x7d\xb0\x50\x37\x35\x02\x46\x23\x5c\x13\x7a\x01\xec\xca\x69\x59\x5f\xc2\xb8\xb0\x8e\x2b\xc2\xff\x9a\x11\x54\xb6\x45\xda\xb8\x2d\xc8\x67\x00\xfe\xf5\x90\xf9\xbe\x1b\x62\x29\xe0\xd3\x5d\xc5\x69\x55\x28\xfc\x60\x20\xdc\x0f\xb3\x73\x11\xfe\x85\xb0\x70\x21\x28\xac\x1e\xa6\xb7\xd3\xd0\xdb\xf1\xf6\x82\x28\x0a\xf6\xef\xbc\x5b\x3d\xe0\x1b\xb6\xab\x97\x86\xde\x46\x24\xbe\xd9\x7b\xa7\x13\x0a\x39\x4c\xa1\x64\x3d\x1e\xdb\xeb\x43\x9d\x88\xd1\x4f\xa2\x69\xd4\x6e\x97\xe9\xb6\x56\xa9\x04\x72\xcb\x6c\xb7\xbd\xda\x39\x55\x6f\x8d\x42\x76\xe8\x4e\xc3\xd7\xe3\x0b\x3f\x6d\xf8\xa8\x36\x23\xd5\x05\xaa\x1c\xdf\xbc\xf3\xad\x73\x70\x63\xfd\xbc\xab\x00\x5f\x24\x76\x61\x18\xc7\x41\xca\xa9\xb7\xf5\xf5\xac\x45\x83\xe5\x5e\xaf\x2f\x5b\xb1\xc7\x57\x28\x36\x83\x34\x8f\xb0\xb2\x6d\x56\x60\xec\x7d\xf6\x8f\x1e\xf0\x2a\x25\x16\x5f\x85\xf4\x8b\xd9\xca\xec\xe0\xed\xa7\x96\x76\x63\x13\xdf\x9e\xb4\xbb\x99\x81\x84\x9d\xb4\x96\xcb\x83\xb7\xc0\xcd\xad\x6f\x5d\x6d\x43\xa7\x67\x97\x88\x1c\xaf\x55\xc1\x60\xc9\x89\x9d\xa2\x43\x80\x79\xb2\x4d\x2f\x8a\x36\xf0\x72\x6d\xe7\x56\x4a\x22\xdb\x59\xad\x1c\x42\xa7\xe5\xec\x76\x14\x01\x24\x66\x64\x1d\x0c\x15\x43\xbd\x3c\xec\x5c\x04\x33\xb2\xca\xab\xc1\xca\xd7\x07\x23\x1f\x41\xc8\xb0\x22\x8d\xb9\x44\x35\x8a\x88\x88\x4c\x56\x00\xc4\x4f\xd2\xe0\x92\x10\xa2\x14\x15\x20\x72\x0e\x22\x9a\x18\xb5\x29\x09\x88\x80\xa1\xad\x24\x0d\x04\x10\x51\xfd\x34\xc6\x39\xde\x2f\x45\x8f\xa8\xbe\x2c\x5d\x15\x6b\x92\xbc\xea\x46\x21\x8b\x85\x2c\x57\x6b\x8d\xd6\x42\x86\x03\x62\x94\xb3\xc2\xbf\xab\xbd\x17\x2a\xc7\xb2\x08\x0d\x1b\x24\x07\x64\x2d\xe0\x37\x6e\xa3\x4f\x23\x93\x6b\x6a\xea\xdb\x91\xc9\x15\x38\x64\xcd\x2e\x39\xf2\xd2\xfc\xb2\x10\xa9\x94\x5d\xd9\x2a\xc9\xf1\x71\x90\xfa\x97\x07\xee\x4a\x71\x29\x7a\x2b\x6b\x7b\xff\x6d\xe2\x17\xb5\x04\x59\x16\xc4\x79\xe8\x5d\x16\x27\xd7\xcb\x63\x7d\x71\x51\x1f\xc4\x32\xba\x64\x5d\x6a\x59\xac\x27\x29\x71\x41\xe2\x5f\xbe\x53\x95\xc2\x58\x53\x56\xd4\x94\x07\xfe\x51\x9c\x44\xc9\xe1\xbb\x4b\xd6\xb6\xf2\x01\xd6\x78\xa4\xd4\xf8\x36\xdf\x08\xf6\xc3\xcb\xc2\x44\xbd\x3c\xd6\xb7\xef\x1a\x25\xea\xcb\x53\xef\x75\x70\xd9\xe1\x56\x0a\xcb\xce\xcd\x52\x05\x8d\x71\x44\x21\xa0\x47\x3c\xf0\xd9\x5d\xb9\x72\xe2\x49\xcc\x1e\xf2\xf9\x17\x77\x09\x7b\x0a\x93\x28\x6e\x33\xf6\xac\x98\x05\xf1\x28\x67\xcf\xa0\x5d\x71\x1b\xb0\x2d\x0e\xea\xe2\xee\x88\x3d\x0b\xde\xe6\x77\xf7\x43\xf1\x60\x4e\xcf\x96\x64\xa2\xee\xac\xfd\x42\x59\x72\xe2\x9a\xf4\xd4\x3d\x9a\x9c\xdc\x3a\x95\x0a\xc8\x13\xa9\x80\xdc\xa6\xcf\xdd\xd3\xd9\xc9\x1c\x0a\x6f\x6b\x61\xac\x3d\x27\xcf\xeb\xf8\x76\x9b\xb4\xdb\xc6\xfe\x6c\x7b\xee\x3e\x9f\x6d\xcf\xc9\xf2\x3c\x94\x7d\x29\x8c\x5d\x14\x5b\xa1\x2f\xf6\x2f\x42\xae\xf5\xfd\xfe\x7e\xe8\xf5\xd2\x08\xb6\xd6\xdc\xfb\xa3\xd8\x2f\x40\x8d\x94\xe0\xe2\xf2\x83\x38\x85\xeb\x3b\x41\x14\x6d\x9d\xa6\xaf\x03\xe5\xd9\xb3\xd0\x7f\x05\xa5\x95\x67\x4f\x7d\x50\xd6\x3d\x8e\x12\xf5\xe9\xe3\x30\xa8\x17\xdc\x09\xe3\x95\x67\xdb\x81\x97\x3f\xf4\x4e\x94\x27\xf7\xd3\x70\xbf\x5e\x0a\xba\xb1\xf2\x30\x4a\x4e\x57\x4a\xde\x01\x6b\xad\x95\xa7\xc9\xdb\x5a\xf7\xee\x78\x69\xbd\xd0\xed\xb7\x61\x86\xcf\x9a\x8e\x1a\xa9\xb3\xd9\x0f\x90\x2d\x4f\xd2\x0d\x14\xd4\x5f\xa0\xad\x59\x29\x5f\x23\xad\x0a\x5d\xd0\xeb\xc3\x8d\xdc\x3b\xdc\x38\x0c\xe2\x20\xf5\xf2\xe4\x42\x2d\x50\xbd\x3c\xd6\xdb\x34\x9c\x5c\xb2\xce\x4f\x9f\xdf\x37\x6e\xec\xc6\x9a\x76\x0b\x6c\x4c\x41\x09\xe4\x22\x0d\xb3\x91\x9c\xe6\x51\x18\x07\x5a\xe5\x6e\x83\x97\xdb\xb0\x74\x6d\xdf\xd5\x1f\x6a\x8e\xad\xf5\xb4\x1d\xad\xab\xf5\xb4\x2d\xcd\x66\xc3\x51\x4f\xeb\x69\xb6\xd6\x83\x2b\x5b\x1b\x68\x3b\x9a\xad\xd9\x23\xfe\x52\x73\x4c\x66\x99\x3d\x51\xca\xb1\xb4\x2e\xff\xb3\xc3\xab\x70\x2c\x6d\x4b\x73\x1c\x78\xed\x58\x9a\xd3\x95\x65\x9d\x2e\xff\x78\x87\xff\x0e\x78\x91\xae\xa8\x59\x94\xed\x61\xfb\x2f\xb4\x87\x9a\x28\xd8\x85\x26\x1d\x5b\xfe\xd8\x23\xed\x85\xbe\xf9\xaf\xab\x0f\xd0\x16\x03\xec\x33\xd3\x1c\x68\x76\x9f\x0d\xa0\xb3\xf6\x80\x0d\x1c\xbc\xe5\x63\x1a\xb2\xee\x88\xdf\xf5\x07\xfc\x7a\x64\x69\x76\x8f\x0d\xe1\xf1\x80\x5f\x5a\x03\x2c\xe4\x68\x76\x97\x8d\x6c\x7e\x69\xc2\xf5\xa0\x2f\x6b\xea\xb2\x41\x57\xdb\xd1\x86\xcc\x34\x2d\xb8\x73\xfa\x78\x6b\x69\x96\xc5\xff\x6e\x89\x1b\x93\xd9\x8e\x36\xe0\x55\x8e\xd8\xa0\xa7\xf5\x59\x8f\x3f\xb3\xba\xda\x96\xd6\x67\xd6\x88\xdf\x38\x96\xd6\xe7\xbf\xfd\x1e\xff\x85\xaf\x77\xaa\x03\x38\x67\x2e\xb2\x04\xfc\x9f\xca\xeb\xda\x42\x8b\x99\xed\xe2\x6a\x2a\x4b\x54\x2e\x9b\x8d\x0b\xda\xc5\xf5\xe4\xeb\xdc\xe7\x97\xe5\xca\xe3\x1a\xd9\xb0\x96\x08\x24\x7d\x51\xac\x07\x20\xb4\x83\xeb\xb9\xa5\xac\x6f\x57\x14\x83\xf6\xf9\x42\x7f\xe3\x0b\x72\x31\x34\x6e\x6c\xec\x79\xfb\x87\xc1\x7e\xe3\xb6\x93\x2f\xcb\xed\x67\x39\xcc\xb6\x0b\x60\xdf\xa9\x6e\x04\xdb\x66\xbd\x01\x4e\xb7\xcd\x7a\x76\x57\xeb\xb3\x7e\x7f\x08\x37\xa6\xa5\xf5\x99\xc3\xd7\xd3\x66\xbc\x7b\x5b\xf2\x69\x8f\xf5\xfb\x3d\x59\xbe\xc7\x1c\xbe\x82\x50\xcd\xd5\x36\x7a\xf7\xfc\x8d\xde\x55\x37\x7a\x57\xdd\xe8\x96\xcd\x9c\x2e\x16\x73\x86\xfc\x6e\xe0\x68\x8e\xcd\x06\x66\x9f\x8f\xd5\xb4\xfb\xe5\xa8\x3f\x6c\x32\xed\xda\x64\x7e\xe3\x90\xb5\x6e\xab\xfb\x61\xea\x47\xc1\x95\x67\xc7\xa9\xbd\x84\x1b\x5d\xf3\xdf\xba\xba\x63\xea\x9a\xff\xce\xd5\xfb\xba\x96\xba\x7a\xef\x02\x9c\x52\xab\x47\xc5\x2d\x75\x68\x96\x8b\xff\xe9\xf1\x8c\x84\xe8\x2d\xcd\xb6\xd8\xa8\x3f\xd2\x46\xcc\x76\x1c\xbe\x90\x66\x8f\x03\x97\xa5\xd9\x23\x3e\xc9\x96\xc3\xba\x7c\x95\x1c\x93\x21\xd4\x75\x87\xbc\x57\x16\xeb\xdb\x00\x8e\x5d\x7b\xc4\x81\x93\x03\x3a\x07\x4e\xa7\x5f\x0e\xe2\xef\x84\xac\x9a\x60\xe8\x82\xc5\xb5\x3f\x02\xfc\x14\x60\xea\x45\x41\x9a\xaf\x45\x89\xe2\x6d\x09\x45\x57\x01\x9d\xde\x45\xa0\xd3\x2b\xd0\x9d\x00\x1d\x8b\x8d\x7a\x43\xbc\x34\xd9\x60\xd8\x07\xe4\xd7\x15\x7f\x11\x8b\xd9\xc5\xaf\xd5\x63\x4e\x4f\x9c\x9c\xe2\xfa\x32\x58\xeb\x9c\x01\xdb\xf5\x01\x7f\xe3\x40\x76\x79\x12\xe5\x32\xb3\xe3\xd4\xdf\xc2\x9d\x98\x29\xbb\xcf\x86\xbd\xae\x66\x31\xab\xdb\xc5\x95\xb4\xf8\xb2\x58\xcc\x34\x79\x27\x6d\x93\xf5\x06\x23\x7e\x3f\xb4\x86\xf0\xd6\x82\xcd\x3c\xb2\xe1\xc8\x34\x47\x03\xd8\xe4\x30\x62\xdb\x66\x56\xd7\xc6\x7b\x38\x2d\xad\xe1\x10\xef\xfa\xfc\xce\xe6\xf5\x3a\x50\xef\x0e\x87\xbf\xfe\xb0\xb8\xe7\x90\xc9\xfa\xfd\x51\x81\x30\x7a\xcc\xb1\xa0\xd5\xd1\x88\x1f\x89\x6c\xd8\xeb\xf1\x3b\xcb\xb6\xb1\xec\x50\xf4\x71\x88\x6f\x71\xd6\xbb\x36\xbf\x19\x0c\x8b\xee\xef\x70\x8c\x65\xf6\xe5\xe8\x60\x51\x7b\x03\xcd\x64\xf6\x68\xc4\x57\xd2\xe9\x0e\xe5\x8d\x3a\x0b\x17\x51\x84\xf5\xe9\xac\xa2\xef\x0f\xda\x79\x57\x47\xda\xe5\xce\xb3\x06\xac\x6f\xf7\x00\xd3\x8e\x38\x16\xb7\xfa\x6c\x80\x38\xb8\xcf\x21\x71\xc0\x7a\x23\xd8\x6f\x76\xb7\xa7\x59\x62\x5e\xf8\xee\xe3\x6d\x5b\x23\x5c\x76\xdc\x8d\xd6\x88\xd9\xfc\x13\x7e\x37\x82\xbb\x41\xe3\xa6\xfd\x1b\x61\xf3\xab\x2f\xb5\x7d\xbd\xab\xae\xbc\xab\x6e\xa0\x52\xa7\x26\x5b\xf8\x48\x8c\xb7\x63\xd3\xde\x76\xf7\xb6\x4d\x6d\x6a\xc2\xff\x6c\x3a\x78\x6e\x8f\x3c\xf5\x81\xbd\xed\xd8\xea\x83\x0d\xfb\xf9\x40\xf9\x82\x57\xf1\xe2\x61\x97\xda\xa3\xe7\x83\x6d\xc7\x7e\x6e\x8f\x5e\xe8\xff\xba\xb5\xc9\x5b\x51\xc0\x04\x56\x78\xa0\x59\x26\xdf\x74\x4e\xf1\x6b\x73\xc8\xb4\x2c\xd6\x55\xae\x2c\x8b\x21\xbc\xf6\xd5\x4b\x78\xcf\x77\x8d\xf6\x42\xbf\x02\xf7\xbd\xa6\x27\x16\xdf\xce\x00\x64\xc5\x2f\x76\x60\x54\x74\x05\xae\x4c\x68\xdf\xea\xf3\x0e\xa8\xd7\x70\xd5\xbb\x62\x6f\x9c\x75\xbd\xb1\x1d\xcd\xea\x03\x8c\x14\xbf\xd0\x82\x3d\x90\xbd\x81\x2b\x8e\xac\xf8\x75\x97\xcf\x8c\x72\x8d\x25\x9c\x2b\xf6\xa6\xdb\xd0\x9b\x4f\xcf\xc9\x5f\x99\x4c\x5a\xc3\xc9\xf7\x4a\x4e\x7e\x20\x96\xc3\x29\x7e\x01\xba\x00\xd8\xf8\x7b\x5c\xa7\x72\x8d\xe5\x9a\x23\x0c\xf0\x12\xb6\xf8\xb4\x98\x77\xb9\x0e\xb0\x2e\x4d\xe0\xfc\xfd\x32\xdc\xbd\x8f\xc3\x70\x7f\x09\x0c\x71\x39\x26\xfe\x4b\x61\x8c\x4b\x31\xd1\x5f\x0c\x83\x9c\xd7\xbb\x6e\x73\xef\xde\x53\x60\xd0\xbb\x3c\xc3\xf7\xaf\x5b\x9b\xd8\xc8\x17\x17\x1c\x5c\x9d\xfb\xfb\x70\xc1\x41\xef\x12\x82\x83\xcf\x8c\x1b\x3f\x2d\x7f\x7f\xe1\x72\xff\x5d\xf9\xfc\x2f\x83\x2c\x2f\x27\x3b\xf8\x72\xe8\xf2\x52\xdc\xfb\x17\x44\x98\xe7\xf4\xaf\x7b\x5e\xff\xae\x5c\x5b\xef\x9a\xab\xba\x22\x57\x75\x19\xca\xf7\x13\x4a\x2c\x3e\x04\x87\x7c\x11\x89\xc5\x17\x27\xb1\xaf\x05\x0b\x9f\x6a\x0b\x54\xc5\x0b\xc2\x98\xe1\x5b\x95\x2e\xd8\xb0\x41\x8a\xdf\xf2\x90\xdb\xc1\xb7\x1c\x12\xe1\xf4\xeb\xb2\x2e\x80\x27\x47\xf6\xca\xb5\x35\x64\x43\x79\x56\x96\x97\x50\x02\xc1\x9c\xc1\x7a\x16\xe7\xa9\x72\x39\x60\x76\x51\x8b\x7a\xcd\x8b\x7c\x14\x89\xc5\x48\xb3\xbb\x62\x03\x89\x5f\x3c\xf5\xcb\x5f\x1b\x7b\x09\xe7\xa8\x38\xea\xf1\x10\x53\xaf\xb1\x6f\x58\x46\xbd\xe6\x65\xe0\x6b\x38\x00\x6d\x98\x13\x78\xa3\x5e\x8b\x49\xc1\x9a\x94\x6b\x28\xf3\x81\x92\x90\x6f\x5a\xf6\x50\xfe\x02\xec\x15\xc0\x36\x52\xf1\x20\x52\x34\x7c\x32\x8b\xb5\xe2\x2f\x06\xf0\x40\xfe\x74\x45\x71\xf1\xfe\xdc\x55\x87\xf5\xb2\xb0\x49\x7b\x50\xfe\x0e\x04\x0a\x1e\x88\x15\xd5\x40\xd0\xc0\x91\xb3\xad\x92\x64\x03\x40\xce\xd7\xd2\x8d\xcf\x29\xdd\xf8\xb6\x30\xd4\x87\x49\x4c\x04\xac\xda\x0e\x1b\xd8\x43\x7e\xbd\xc5\x3b\xca\x27\xd9\x32\x59\x6f\x04\xdd\xee\xf5\x01\x3f\x59\x4e\x0f\x78\xdf\x51\x81\xac\x54\x24\xa6\x22\x2b\x15\x89\xc1\xb5\xcd\x46\x43\x00\xa5\x01\x1b\x99\x70\xbc\x5a\x03\x50\x9d\x74\xbb\x40\x16\x39\x9c\x6a\x81\xe7\xce\x70\xa0\x6c\x25\x05\x61\xaa\xe8\x4c\x45\x73\x2a\xfa\xbb\x08\xcd\xbd\x87\xf8\xe6\x3d\x05\x24\xdd\xef\x4d\x40\x62\x33\xc7\xb2\xb5\x3e\x1b\xf2\x0d\xc3\x37\x9e\xad\x0d\x59\xaf\xdf\xe7\x90\xd5\x77\x9c\xa6\x73\xb0\x8a\x31\x1d\xd6\xb5\xa1\xa5\x11\xb3\x4c\x07\xee\x79\xef\x99\x8d\x9b\xb7\xdb\xfb\xc8\xd2\x96\x4f\x75\x1a\x14\xb8\xbe\xc7\xba\x03\x9b\x5f\x6f\xf1\xeb\x11\xf6\xa1\x67\x73\x1a\xaf\xdb\xe3\x2f\x18\xc7\x95\xbc\x5d\x36\x1c\xf6\x3e\xfc\x54\xb8\x96\xeb\x7c\x66\xb9\xce\xb7\x76\x4c\x7c\x90\xac\xa8\x8a\x91\x71\x2b\xf7\x98\xd3\xed\x21\xcb\x6a\xda\xc8\xa4\x76\x87\x02\x3b\xf7\x98\xd3\x57\x2f\x2f\x3a\x21\x64\xa1\x51\xb9\x0a\xf6\x7b\x22\x7f\x95\xf6\xfd\xe8\x82\xa9\x0f\x10\x23\x5d\x73\xbd\x7f\x7f\xc1\x0f\xdf\x09\xc3\x95\xc3\xce\x32\x99\xd9\x1d\x36\x0b\x86\x86\x26\x2c\x62\x6f\xe8\x80\x60\x68\x00\xfb\xc8\x1a\x0d\x94\x1d\xd6\x7c\x60\x9e\x2f\x05\xfa\x64\xc7\x5b\xe5\x90\xc2\xdf\x62\xc3\x0e\xd4\x9e\x7c\x20\x4b\x73\x2d\x4d\xfa\x3c\xd2\x24\xc5\x61\xe6\xbb\x72\x14\x59\x7f\xce\x59\x43\x20\x43\xf9\x66\xee\xf7\x06\x7c\x4a\xe1\x07\xc4\xa6\xb6\x85\x0c\x92\xd3\x75\xe0\x89\x53\x94\x72\xc4\x77\x0e\xdf\xd4\xf0\x1a\x4b\xa1\xd8\xd5\xea\x21\xf7\xc3\x8b\xf2\x27\xa3\xa2\x14\xb4\x07\xfb\xa5\x8f\x6a\x15\x20\x17\x6d\xbe\x4b\xfa\x48\x0e\xe0\xa9\xc9\xb7\x13\x5c\x0f\xb1\x07\x70\x08\x0e\x06\x4e\x51\x5a\x28\x6d\xe0\x77\x0b\x4c\xd5\x06\x8e\x78\x2a\x8e\x43\x28\x8d\xd7\xd8\x9b\x6e\x51\xb3\x28\x2d\xd4\x3a\xf0\x7b\x25\x81\x98\x96\x72\x9a\xf1\x3c\x45\x13\xef\x14\xff\xed\x33\x1b\x39\x40\xf8\x19\x6a\x96\x85\xdd\x19\xb2\xc1\x08\x2e\x07\xb2\xcc\x00\x3f\x1a\x70\xc0\xe7\xef\x44\x09\x13\x3e\xe1\x8c\xaa\xac\xc4\x84\x8a\xb1\x90\x22\x96\xb1\x90\x37\xdd\xd2\x46\xac\x3f\xe8\xe1\x0d\x50\x4f\x36\xdc\xc3\x65\x17\x5a\x46\x22\xc5\xee\xc9\x92\x7d\x10\xc8\xe1\xef\x16\x60\x6b\x5b\x3e\x75\x04\xb1\x22\x78\x0d\x31\x2e\x07\x99\x5c\xf8\x58\x94\xb6\x80\x37\x16\x32\xbb\xab\x48\xdd\xce\x9f\x4a\x04\xba\x2d\xf8\xed\x22\x38\x09\x00\x04\xd0\xb0\xfb\x78\xaa\x00\x68\xf5\x11\xbd\x17\x40\xe7\xe0\x12\xd8\x16\x02\xa6\x28\x65\xc2\x77\x26\xd2\x71\x50\x93\x09\xb5\x5b\x0a\x90\xc3\x7c\x02\xa6\x84\xfa\x05\xd0\xc0\x10\xfb\x48\x82\x95\x00\xeb\x60\x0f\x80\xf3\x03\xa0\x2a\x80\x17\x00\x0f\x7e\xb7\x0a\x70\x84\xa7\x00\xa4\x8e\x02\xb0\x0e\xf6\xa6\x5b\xd4\x2c\x4a\x5b\xb8\x01\xec\x2b\x4e\x6a\x77\xfd\xa4\x7e\x93\x7e\x51\x72\x03\x14\x3b\xa2\xd8\x23\xe5\x9e\xc1\x3d\x54\xec\x2a\xb9\xcd\x94\x8d\x57\x6e\x46\x65\x7b\x8a\x5d\x54\xee\x2c\xab\x10\x62\x4a\x2c\x56\xe2\xb5\x12\x88\x14\xec\x27\x80\xa8\xc4\x91\x12\x6b\x96\x78\xb4\xc4\xad\x0a\xb6\x15\x35\x95\x38\x12\xda\x93\x90\x67\x2a\x70\x6d\xaa\x50\xac\xc0\xb5\x80\xf4\x12\xfa\xe5\x7e\x28\x76\x48\xb9\x6b\xd4\x7d\x24\x6a\x2a\xa0\x1f\xdb\xbb\x16\xba\x7e\x02\x1f\xae\xeb\x53\xf7\xfd\x4e\xdd\x4b\xfa\xb6\x5d\x9f\xc2\x57\x3f\x85\x2f\x27\x14\xbe\x3e\x95\x3f\xe8\x54\xbe\x9c\x69\x62\xd3\x24\x7f\x4f\x16\x8a\x5f\xab\x6b\xe3\x35\xbd\xf1\xf9\xe9\x8d\x6b\x71\xfe\xe7\x14\xe7\x5f\x13\x20\x17\x12\x20\x97\x74\x53\xbd\x26\x41\xde\x87\x04\xb9\x9c\x3a\xe2\x9a\x08\xf9\x40\x22\xe4\x72\xe6\xbe\x97\x13\x16\x5c\x5b\xfd\xfe\x0d\x95\x3f\xdf\x80\x9f\xb2\xdd\x45\xb8\xc0\xfb\x2d\x34\xb0\x80\xfb\x61\xdf\x11\x07\xd1\xb0\x76\x34\xbd\x3f\x8d\x04\x35\x0d\x99\xd3\xb7\x8a\x16\x06\xac\xab\x6a\x7d\xaa\xfa\xa7\x2f\x42\x2a\x7e\x15\x04\xdb\xb5\x0a\xeb\x0b\xa9\xb0\x94\x40\x70\xdf\xa4\x4d\xb4\x6d\xb2\xd1\x00\x66\xca\xee\x3a\xb8\xa1\x1d\xab\x8b\x4a\x61\x58\x20\xa7\x0f\x74\x9c\xe3\xf4\xc0\xa8\xa1\x3b\xe2\xeb\xcd\x7f\xb6\x60\xe7\x71\x14\xd7\xc3\x42\x26\x7e\xd2\x87\x0a\x86\x50\x9f\xed\xb0\x11\x47\x13\x1c\x79\xc1\x87\x7d\x7b\xa0\xf5\xe1\x73\xbe\xbd\x07\x43\x88\x20\xd0\x87\xf6\xf8\x0f\xec\xc3\xe1\x80\xb3\x92\x50\x66\xc8\xfa\xf6\x50\x1b\xb2\x51\xad\x9f\xb8\xd9\x59\xdf\xe1\xc4\x13\xeb\x3b\x03\xd8\xf4\x43\x1b\x88\xcb\x6e\x77\xa4\x0d\xd8\x70\x00\xbb\xd0\xec\x0d\xb5\x11\xeb\x59\x00\x7a\xfd\x11\x6c\x75\x8b\x59\x3d\xd8\x90\x8e\x33\xe4\xdf\x0f\xfa\x70\xcc\x3b\xc3\x11\x6a\xc1\xfb\x08\xe0\x03\x84\x74\x87\xc3\xeb\x80\x0d\xfa\xb8\xab\xf1\x13\xab\x07\x54\x6f\x7f\x04\x26\x54\x3d\xab\x8f\xa4\x83\xc9\x77\xb8\xc9\x86\x03\xe8\x57\xb7\x3b\x84\x3d\x22\x08\xb1\xb2\xb3\x1f\xc3\xdc\x1b\xb6\x1a\x40\x2f\x20\x61\xc0\x20\xf8\xd3\x13\xff\x70\x31\xf9\x2a\xf0\xc1\x17\xa5\x6c\xf1\x9d\x0d\x83\xc3\x45\x42\x0c\xc3\x0b\x5a\x23\x24\xe4\x91\x82\x83\xda\x45\x29\x68\x0f\x98\x86\x1e\xda\xbe\x00\x4b\x00\x24\x94\x89\x54\x15\xc7\x60\xf8\x00\xae\x6d\x71\x3e\x80\x49\x1e\xd2\x54\xe2\x65\x17\xea\x70\x90\x69\xe8\xe1\x4b\x78\xda\x47\xd2\x6a\x80\xe1\x2e\xba\xa2\x0e\xb8\x12\x35\x8b\xd2\xd0\xa2\xe8\xc7\xd5\x14\x5c\x6f\x5d\x7d\xf0\x77\x31\x2e\xaf\x6f\x9e\xca\xce\xaa\xec\xb9\xea\x76\xac\x6e\xd5\xda\x36\xae\x6d\xf2\x2a\x0a\xa8\xa1\x87\x1a\xf2\x50\xf6\x6b\x75\x1f\x57\xfa\x29\x60\x08\x21\xad\x84\xbd\x12\x1e\x15\x08\x15\x30\x5b\xc2\xb1\x84\xec\x12\xd6\x4b\xf8\x57\x76\x84\xa8\xa9\x84\xe3\xde\xb5\x29\xfb\xe7\x35\x65\xbf\x3e\x58\xbe\x9e\x83\xe5\x83\xac\xf4\xbf\x9a\x83\xa6\x5f\x3f\x68\xfa\xe7\x1d\x34\xfd\x0f\x39\x68\xfa\x57\x39\x68\x2e\xa9\xc3\x59\x3d\x78\xae\xcd\xfb\xbf\x7c\xfc\x83\xeb\x23\xf4\x83\x8e\xd0\x6b\x45\xc1\xe7\x54\x14\x7c\xa6\x73\xd2\x44\x78\xeb\x0f\xa0\x50\xb7\xe7\x68\x23\xd6\x1d\xd9\xbc\xf9\x51\x0f\x82\xbd\x59\x68\x86\x3f\x64\xa6\x09\x27\xd1\xa0\x6b\xa1\x04\x04\x24\x2a\xac\x67\x01\x8b\xdf\x1f\x81\x40\xaa\x37\x18\x7e\x9e\x33\xd5\x1a\x31\xdb\x1e\x42\x37\x11\x65\xdb\x0e\x08\x5c\x46\x23\x00\xe7\x6e\xaf\xaf\x08\xb2\x6c\x4e\xbd\x94\x72\x2c\x1b\x04\x12\xbc\x43\x03\x60\x68\x86\xbc\xb5\x11\x1b\xf6\xad\xda\xac\x7f\x22\x0f\x87\xeb\x43\xf6\xa2\x43\xf6\x92\x5a\x8a\xcb\xf0\x77\xd7\xae\x13\x7f\x43\xe9\xf9\x07\xb9\x4e\x54\x30\xdb\x56\x0d\xed\x55\x31\xe2\xe7\x20\x18\x2a\xf8\xa7\x86\x9b\x54\xc4\x55\x17\x80\x7f\x15\x34\xc1\xb5\x2c\xfa\x4b\xc9\xa2\xcb\x4c\x25\xd7\xde\x14\x0f\x51\xf9\x33\x84\x2d\xda\xeb\x21\xc3\xac\xf5\x99\x0d\x41\xaf\xba\xb6\xb8\x84\xd7\x36\xec\xce\xde\x50\x96\x34\x99\x0d\xa1\x6b\xd0\xb9\xd1\xc1\x2b\x20\xb7\xba\x66\x17\xef\xac\x3e\x73\xfa\x50\xe9\xc8\x1c\x80\xf6\xad\x07\xca\xaf\xee\x60\x88\x9a\x68\x20\x7e\xfa\x40\xcc\x73\x26\xbf\xdb\x45\x7f\x2b\xd0\x3b\x0f\x9d\x1e\xff\xb1\x60\xe2\x2c\xe1\x96\x3e\x60\x0e\x47\x36\x03\x36\xea\x03\x65\xd4\x1b\x02\x29\x63\x5a\xf0\x0e\xab\x1d\x31\x87\x0f\xda\x66\xce\x00\x8e\xcb\x1e\xc7\x1a\x5d\x66\x43\xf4\x9c\x2e\x7a\x34\x8a\x27\xe0\xcc\xcc\xc7\x89\xef\x47\x0c\x54\xdc\x7c\x78\x78\xdd\xc3\x12\x43\xf0\x15\xee\xda\x45\x69\x88\x25\x3c\xc2\x5f\x8c\x60\xd5\x63\xa2\xed\x1e\xfa\xe0\xc3\x80\x46\x43\x0b\x4e\xf9\x3e\xd2\x88\x43\x20\x93\x00\xf8\xf9\xad\x0d\x32\x1d\x13\xed\x15\x9c\x3e\x8c\x60\x88\x46\x1e\xf6\x08\xc6\xde\x13\x06\x01\x36\xce\x08\x6c\xbd\x3e\xb3\x7a\x30\x74\x13\x4a\x5a\x16\xcc\xe8\x08\x16\xc9\xea\x31\xb3\x0b\x9e\xd9\x10\x1e\xa0\xcb\x1c\xb3\x87\x4b\xca\x4b\x59\xd0\x59\xb1\xe0\x1f\x28\x5d\xff\x36\x8d\xf2\x1d\x74\xf6\xb6\xba\xe0\x04\x6f\xc1\x09\xd1\x1f\xa0\xa9\xc8\x08\xe6\xdf\x74\x40\xee\x65\x0f\x7a\x08\x74\x43\x0b\x28\xaf\xd1\x10\xce\x1f\xdb\x84\x83\xc6\xb2\x00\xe8\x86\x43\x38\x24\x1c\x73\x84\x2b\x3f\x04\xc9\xbb\xe9\x00\x82\xb5\x4d\x30\x2f\xaa\x06\x6c\x02\x60\xea\x81\x87\xb9\xe6\x98\xbc\x34\xbf\x81\x2b\xde\x73\x13\x2c\x2a\xba\xc3\xa2\x54\xb7\x74\x27\xe4\xa0\x8b\x6c\xbe\x35\x84\x6b\x7e\xcc\xd8\x7d\x29\x0c\xe5\x67\x73\x1f\x36\xc6\x00\xea\xb2\x86\x88\xb6\x7b\xcc\xb4\xe0\x54\x1c\x8c\x90\x57\x1e\x42\x21\x18\x01\xe7\x1e\x24\x47\x02\xdb\x17\x6a\xe8\xa2\x4a\xdc\xac\x86\xa7\xe2\x08\x00\x04\x6a\x26\x06\xb2\xe6\xd7\x7d\x81\x19\x80\x99\xe9\xd9\xb2\x84\x2d\x5c\x19\xaf\xc5\xc8\x9f\xcd\x38\xff\x1a\x89\x5f\x23\xf1\x0f\x93\x64\x7f\xfa\xb4\x34\x5f\x8f\x94\xf5\xab\xb5\xe1\xbe\x3e\x9e\xbe\xd8\xf1\x74\x2d\xa2\xfd\xcc\xa1\x59\xae\xcf\xab\xeb\xf3\xea\xc3\xc5\xc2\xd7\x09\x89\xfe\xee\x02\xcb\x8f\x6a\xee\x3b\x60\xdd\x01\x3a\x15\x58\xb0\x9f\x1d\xbe\x9c\x36\x1b\x76\x01\xd2\x1d\x00\x62\x13\xb5\x24\x03\x66\xf7\x21\x04\xd8\xa8\x0b\xbb\xca\x1a\xc1\xdd\x67\x3b\x9f\x76\xbe\x33\x72\xa0\x0f\x58\xa6\x37\x82\xbe\x3a\xc3\x1e\x1f\x2c\xa0\xe6\x21\xb3\xba\x03\x44\x32\xc2\xf5\xa0\x6b\xc2\xbd\x6d\x01\x2a\x1b\x58\x68\x79\x8d\x1e\x36\x1f\x21\x50\xf3\xb5\x9c\xf6\xab\x90\xd3\x96\x59\xa6\x3f\x92\x98\xd6\xea\x51\x6b\xb0\xdd\x2d\x2c\x82\xad\x0d\x7b\xc3\x7e\x3e\x2c\x2c\x82\x2d\xda\xa5\xfd\x6d\xab\x57\x16\xa0\x36\xb5\x5f\x0f\x94\x02\x50\xc5\x8b\x87\x5d\x3a\x7c\x3d\xd8\xb6\x7a\xcf\x87\x1f\x94\xcd\xd8\xb1\x79\x87\x6c\xab\xde\x23\xb5\x03\x1b\x15\x23\xe6\xd5\x1e\x41\x1d\x2f\x1e\xda\x16\x74\xc9\xb1\xdf\xb7\x4b\x4e\x31\x47\x8e\xb9\x32\x47\x6a\x17\xa1\x4b\x17\x4d\x92\x63\x82\x61\xb5\x85\xb3\x64\x5b\xef\xd7\xa7\x6e\x31\x4d\x8e\xb9\x3a\x4d\x2b\x9d\xba\x68\x9e\x78\xa7\x6c\x0b\x7b\xe5\xd8\xe7\xf7\xea\x02\x89\xa6\x0c\xc1\xc5\x49\xa2\x82\xba\xb6\x06\x1a\x10\x9f\x78\x4e\x59\x70\x16\x69\xe0\xa6\xa1\xf5\x15\xea\xba\xaf\x75\x35\x91\x96\x41\x10\x5a\xfc\x03\xce\x04\x89\x62\xd6\x40\x1b\x8a\xb8\x60\x88\xd6\x65\x19\xf9\x33\x10\xed\x5f\xbd\xff\xb6\x22\x47\x2b\x43\x84\xe1\x71\x80\x2d\x5b\xa3\xa2\x99\x11\x8e\xc1\x1a\x69\x48\x64\xca\xee\x8d\xc4\x30\x6c\x0b\xc6\xe1\xd8\x30\x0e\x71\x88\x03\x4b\xdb\x97\x06\xb8\x43\x89\x59\xf1\xbc\x17\x35\x8b\xa2\xd6\x40\xf4\xe3\xea\xe3\x70\xca\x75\x70\x4c\xa4\x17\xcc\x92\xcb\x31\x81\x4c\x90\xf4\xc2\x10\x45\x75\x80\x31\x65\xe7\xc5\x82\x8d\xf8\x02\x96\xb1\xd6\xb6\xd4\xa1\x0f\x94\x49\xb1\x2d\x11\xaf\x0d\x19\x08\x59\xb9\x1c\x8e\x29\xfa\x71\xf5\x71\x74\xcb\xf5\x80\x71\xd8\x16\x0e\x44\x34\xcd\x6b\x1e\x15\xad\x8d\x70\x2c\xfc\x17\x0f\xb7\xa2\x87\xf2\xa7\x08\xe0\xc6\xe7\x75\x54\x2e\x8a\x35\x82\xd9\x1f\xc9\x65\x81\xf1\xf0\xdf\x21\xae\x8b\x68\x41\xd2\x61\xa6\xe8\xcf\x25\x72\x7f\x9e\xcb\xae\x56\xe8\xbe\x2f\x83\x7d\xcf\x67\x2c\x6a\x84\x69\x6d\x53\xd8\x26\x33\xad\xae\x80\x04\x0b\x79\x46\x7b\x08\x77\x9c\x33\xc2\x50\x9a\x18\x5a\xb3\x2b\x42\x6b\xc2\x92\x98\x3d\x7c\xfb\x61\x89\x23\x1c\x36\xea\x0f\x4b\xd3\x1b\xc7\xe1\xfc\x14\xe7\xd1\x6c\xcd\xb1\xd9\x08\x62\x11\xca\xfd\x83\x11\xce\xcf\xdd\xa5\xb6\xc5\x9c\x81\x8d\x88\xa7\x88\x76\xf8\x61\xf3\xe7\xac\x2c\xf0\x97\x39\x3a\xce\xb7\x4f\xa9\xf4\xf1\x4b\x1c\x25\xd7\x4e\xa8\x5f\x77\x9a\xdc\x6f\xe3\x2c\xbf\x14\xbf\x71\x8d\xc8\xae\x3e\x7b\x4e\x03\x3c\x7c\x43\x34\xc5\x39\x23\xeb\x36\xc0\xc5\xb7\x45\x65\x5c\x34\xc2\x6b\xb4\xf9\xd1\xd0\xe6\xd5\x95\xf1\x5f\x88\xa0\xbb\x5c\x94\xb5\x8f\xce\xe5\xd8\x36\xeb\x8d\x0a\xb3\x01\x5e\xca\x04\xbb\x41\x71\xed\x0c\xca\xeb\x9e\x5a\x6a\x60\x43\xa9\xfe\x50\x1b\x30\x67\x08\xf2\xb8\x61\x77\x08\x87\x82\x6d\xc9\x1f\xab\x27\x55\x28\xe2\xd7\x61\x16\x88\xf4\x1c\x1b\xc5\x5b\x36\x1b\x0d\x6c\xb4\x10\x00\x81\x65\xbf\xdf\x15\xaa\x43\xbb\x3f\xfa\x50\x1e\xeb\x6a\x0e\x3a\x5f\x96\xd4\xbb\x5c\x8c\xb2\xcf\x43\xea\x7d\xfa\xb0\x67\x17\x21\xc6\xcb\xaa\xca\xbf\x15\x12\xe7\x42\x4d\xeb\x57\xb3\xb1\x21\xbf\xbf\x05\x59\x43\x4c\xd4\xfb\xf7\x80\x3e\x18\x0d\xfb\xf2\x0e\x14\xff\xdd\x7e\x71\xef\xf0\x9d\x8f\x07\x83\x35\xfc\x78\xbb\xf7\x82\xa9\x73\x56\x41\xe1\x9b\xa2\x6e\xd6\x8d\xab\xbb\x0a\x12\x5f\x33\x6d\xf3\x1e\xe6\x05\x57\xc2\x13\x15\xc9\xf9\x76\xe0\xe5\x0f\xbd\x93\x6b\xf3\x66\xfd\xa1\x26\x32\x3d\xd8\xe5\x2f\x28\xb8\xe0\x07\x92\x2d\x40\x24\x37\x0e\x14\x5d\x66\x29\x57\x22\x7d\xc9\x48\x66\x32\x01\xd6\x04\x5e\x60\x32\xad\x51\x99\x57\x6b\xa4\xa4\x7b\x81\x12\xfc\x5a\xc4\x8d\x43\x6d\x58\x99\x0d\xc5\x62\xa3\xca\xb5\xcc\x9e\x52\x26\xe9\x82\x12\xea\xb5\x48\xc1\xd2\x2f\xeb\xb5\x7a\x6c\x20\xcb\xe0\x75\x91\x81\xd0\xa9\x5e\xcb\x6c\x84\x50\xca\xee\xca\xe7\xe5\x95\xe8\x0b\xd6\x72\x4e\x36\x96\xf7\x32\x0b\xbe\x36\xf0\xfc\x68\x06\x9e\xc3\x0f\xc9\x01\x77\x01\x48\xe1\x95\x0d\x22\x01\x74\x6e\xb1\x2c\x8c\x90\x07\xbc\x84\x3d\x14\xd9\xe1\xc0\x1f\x8e\x93\xa6\x43\xfb\xeb\xdd\x49\x5f\x60\x6f\x7c\x3e\x6b\x4b\xfb\xda\xe4\xec\xbd\x4d\xce\x8a\x94\x3f\x4a\xfa\x9f\x21\x33\x47\x56\x15\x5a\x2e\x03\x39\x85\x77\x2c\xc0\x60\xf5\xae\x69\x6b\x15\x25\x86\x95\xeb\xaf\x76\xfb\x7c\xd8\x66\xf8\x6c\xa6\x5c\xf6\xb5\xa1\xc5\xa7\xb0\xe5\xfa\x06\xfc\x78\xc4\xde\xb1\xcb\x5f\xd8\xcf\xc3\x22\xd8\xa0\x29\x98\x94\x6e\xf1\x8b\x1b\xca\x2c\x08\x2e\x5b\xc0\xb6\x2d\x32\x5e\xf5\x8b\xdf\x22\xfd\xb3\x78\x62\x8a\x6f\xfb\xc5\xaf\xcc\xc5\xde\x17\x5c\xa8\x5d\xfe\x16\xa7\x69\x51\x07\xa2\x0d\x2c\x61\xf5\xcb\x5f\x41\xca\x75\x85\xad\x57\x57\xbc\x31\xcb\xdf\x4b\xb8\xd0\x7c\x13\x26\xf3\x97\xca\x3b\x5a\x2c\xe1\xca\xca\x3a\xcc\x76\xd0\xb3\x16\x83\x5a\x3a\x90\x70\xcd\x1e\xb2\x61\x4f\xe4\x24\xb5\x3f\x92\xf9\xfd\x97\x85\x9a\x1e\xeb\x01\xa5\x25\xe2\x03\x58\x20\xe8\x03\x11\xc3\xb0\x07\x64\xa3\x35\xea\x2b\x94\xda\x27\x80\xaf\xf7\xb1\x81\xff\x98\x14\xc9\x57\x6d\x4a\xaa\xd0\x0d\xeb\x61\x75\x4d\xc0\xd5\x2f\x06\x58\x05\xb5\xd1\xaf\xf8\xbf\x37\x82\x0b\x98\xcb\x0e\x7b\xe5\xf5\x67\x89\x94\x6b\x56\x26\xea\xa3\x60\xc3\xf5\x8a\xd2\x6b\x82\xe1\xa3\x58\x66\xee\x84\xf1\xb5\x03\x7d\x12\xbd\x3b\x4c\x62\xed\x24\x09\xe3\x3c\x73\x75\xab\xc7\xfa\xb0\xe1\x6c\xdb\xe6\x84\xb8\x09\xc6\xd6\xa3\xfe\x50\xeb\xb1\x5e\x0f\x03\xd9\x81\xb4\xc2\x82\xed\x31\xec\x6b\x23\xe6\x98\x00\x48\xbd\x01\x5a\x76\x8b\xc3\x08\xc0\x89\x17\xb6\x71\xef\xd9\x7c\x37\x01\xf8\x74\x07\x7c\x40\x5d\x0e\x77\x5d\xd6\x75\x30\x3e\xa0\x09\x6e\x22\x56\xb7\x77\x55\xc1\x0d\x0e\xe0\x7d\x49\xc1\xfa\x82\xf5\x8b\x05\xeb\x9f\xb3\x60\xfd\x0f\x5a\xb0\x7e\xc3\x82\x71\x3a\xa3\x2f\xb2\x77\x63\x8a\xe5\x32\x9d\xf1\x88\x59\xe0\x63\xd3\xe7\xaf\xba\x7c\x7d\x6c\x13\x6f\xd0\x54\xbc\x07\xb9\x9a\x21\x14\x7e\x57\xf9\xda\xe2\x35\x02\x05\x83\x62\x23\x1b\x33\x1d\xf3\x3b\xcb\xe1\x9d\xb2\xc0\x24\xa2\xcb\xec\xe1\xb5\x93\xf3\xa7\x97\x81\x7d\x23\x1b\xed\xf2\x52\x20\x75\xe3\x7d\x83\x6e\xb7\x0a\x71\x8d\x7b\x61\x28\xf6\xc2\xce\xe7\xdc\x8c\x05\xb9\xbf\x55\x71\xc3\xad\xb8\xe7\x36\x00\xf8\x27\x43\x53\x05\x80\x57\xf9\x8b\x2a\xef\xa1\x4c\xdd\xb5\xfb\xe9\x97\x8c\x10\xa8\xe2\x90\x9d\x2a\x16\xd9\xa9\xe0\x91\x9d\x0a\x26\xd9\xa9\xe2\x92\x9d\x2a\x36\xd9\xa9\xe1\x13\x48\x72\x2f\xbd\x93\x60\xb7\xd8\x23\x36\xb0\xbb\xca\xbd\x8a\x56\xbe\x02\x89\xda\xb5\x73\xe4\xf7\xec\x1c\xf9\x89\x38\xbc\x01\x58\x3f\xa8\x21\x25\xf1\xe4\x35\xfb\x72\x03\x21\xd3\x37\xe2\x67\x88\x6d\xe1\x49\xd2\x67\x03\x6c\xb5\x0b\x1b\xb2\x0b\xa7\x45\xcf\xc1\xcd\x0a\x81\x2e\x6d\x21\x8e\xc6\xac\x27\xf2\x90\xb0\x61\x37\xf5\x70\x41\x47\xbd\xe6\x1c\xfc\xd7\x0e\x7e\x5f\x05\x1b\xf9\x38\xbc\xe6\x22\xcb\x23\x69\xa0\xd9\x03\x4c\x60\xd6\x1b\xda\xfc\x7a\x04\x4e\xfc\xd6\x50\x1b\xa1\x25\xca\x88\x93\x59\xfc\x9d\x28\x62\x81\xf1\x93\x25\x0c\x6d\x50\x38\x24\x03\x1b\xf6\xe4\xb7\x9c\x9a\xe2\x3f\x03\xd1\x00\xb0\x4c\x0e\xb3\xbb\x10\xbe\x55\xd2\x59\x95\x6b\xcb\x66\x43\xd3\xc6\xae\x60\x08\xc7\x1e\xba\x37\x03\x5a\xe8\x83\xf5\x12\xbf\x13\xf6\x3f\x26\x06\x3b\xed\x39\x18\x47\xba\x0f\xca\x67\x90\xdf\xc0\x2f\x5a\x9f\xf7\x20\x88\x63\x17\xfd\x91\xfb\x26\x44\x4d\xb4\xfb\x56\xa5\x2b\x1f\x23\xdd\x87\x35\xd2\x44\x60\x47\x9c\x38\x7b\xa0\x4c\x28\x8a\x92\x46\xd2\xd0\x9c\x9f\xba\xa3\x21\x8e\x19\xf3\xf6\xa1\xe1\x65\x0f\x6d\x34\x61\xb7\x38\x43\x0c\xb7\x6a\x99\x6c\x68\x5a\x48\x88\xf4\xf1\x93\x2b\xe5\xd3\xf8\x4c\x7a\x97\x2d\xf1\xfb\x71\xb5\x2d\x08\x55\x25\x94\x21\xd4\x6d\x29\x70\x58\x80\x66\x01\xaa\x62\x05\x2a\x93\x0f\xf0\x5d\x02\xa4\x02\xa4\x3d\x29\xc3\xc4\xd5\xd9\x11\x1f\x6c\xa9\xeb\xa7\xec\x85\xeb\x14\x15\x9f\xd3\xf4\xe4\x1a\x33\x7d\x8a\x7c\x11\x5f\x1e\x53\x5d\xce\xde\xfb\xbb\x4d\xc5\xf0\xb5\x06\x09\xfb\xfa\xb1\xf1\xb5\x2c\xe3\xb3\xca\x32\xae\xd1\xf3\xa7\xc9\x35\x50\x41\xc3\xf8\xdb\x03\xd3\x03\xf4\x94\x14\xf9\x35\xbb\x43\x64\x53\x1d\xd5\x6f\xf2\x7d\x59\xe5\x3e\x1b\x3a\x96\x92\x6e\xa1\xcf\x46\x5d\x80\x86\xe1\x10\x16\xc1\xea\xb3\xae\x33\x10\x5d\xfb\xc0\x14\x00\xd7\xc1\xff\xaf\xc5\x45\x1f\x28\x2e\x1a\x9a\xb0\x48\x3d\x70\xe1\x65\xbd\x01\x80\xae\x35\x1a\x28\x7b\x65\xa7\xf1\x10\x11\x60\x5c\x05\xef\x0a\xf0\x37\x87\xec\xff\xf4\xa7\xde\xb5\x68\xe8\xab\x10\x0d\x3d\xf5\xbd\x3c\x0f\xd2\xc7\x51\xf2\x9d\x49\x87\x3e\x20\x9a\x94\x36\x62\x16\x1e\x2d\x43\xc8\xa3\xdf\xc5\x18\x8d\x16\xdf\x1b\x6c\x24\x1c\xe3\x20\x21\x33\xb3\x1d\x51\x6e\x07\x58\x87\x91\x05\x29\x87\xe0\x20\xb7\x59\xaf\x57\x54\xc2\x81\x0f\xe3\xb2\xd9\x3d\xa0\x4d\x07\xe8\xdd\x67\x8e\x00\x9c\x46\x26\x44\x69\xeb\x99\x03\x8c\x52\x67\x9a\xa8\x54\x31\x01\x14\x47\xa8\x3e\x1d\x0e\x81\xe4\xed\x0f\xb1\x91\x81\x68\x04\x09\xe1\x1e\xb4\xe9\x40\x20\x3d\x54\xa2\x40\x45\x10\xf0\x8d\x13\xd1\xd0\xe8\x68\x08\x00\x69\x63\x3a\x30\x67\x04\xc0\x6a\x62\xdc\x38\x4e\x56\x5b\x26\x1b\xd9\x60\x2d\x37\x18\x40\x08\x51\x13\x5d\x66\x7b\x7d\xcc\x18\xd6\xc3\x61\x72\x22\xc2\xb2\x59\x17\xe8\x1e\x31\x07\x16\xc6\xc5\x1c\x61\x80\x3d\x93\x0d\xfa\x8e\xc6\xc1\xb8\x87\x95\xf6\xb5\x21\x1b\x0e\xa0\x2f\x3d\x30\xcc\x1b\x32\xcc\xd2\x34\xb4\x2c\xfe\xaa\x8f\x76\x79\xce\x48\xce\xbd\xcd\x9c\x9e\xa8\xbe\x5f\x0e\x50\xbc\x84\xd1\x63\x1d\x80\xac\x46\x43\x5b\xde\xf4\x58\x77\x38\x50\x17\xf0\x83\x82\x78\x01\x1a\x1e\x80\x22\xb6\xe7\xf4\x45\x74\xd4\x21\x48\xc6\x87\x18\x4a\x6f\x34\xea\x16\x77\x7d\xe6\x98\x45\x59\xc0\xf3\xdd\x3e\xf8\x93\x38\x83\x3e\x1a\xc9\xf7\x6d\xb5\xae\x11\x44\x1d\xb4\x79\x25\xe0\x1d\x38\x18\x61\x68\x52\xc8\xbe\x3d\x82\x56\x44\x2e\x4b\x13\x62\x29\xda\x5d\x36\xea\x76\xf1\x25\x04\x40\xed\xa3\xa7\xe0\xa0\x07\xad\x74\x4d\xd9\x8a\x09\x16\xa1\x36\xb6\x3a\x62\x83\x7e\x1f\xa3\x17\xf6\xb1\x2e\xdb\xb6\x39\x52\x1c\x98\xa0\x0b\x30\x31\x29\x1c\x28\x09\xba\x03\x20\x44\x07\x7d\x49\x6f\x61\x04\xd6\x7e\x5f\xe4\xcc\x04\x3a\x71\xd0\x03\x23\xf6\xbe\x83\x1f\x0e\xe5\x58\x07\xd8\x0a\xb0\x64\x72\x2e\x4c\xc8\x73\x03\xf3\x36\x1c\x41\x73\x10\x6f\xb1\xc7\xac\x2e\x56\x0c\x71\x1e\x47\x3d\xe8\x90\xdd\x15\x50\xcb\x11\xa7\x6d\xb1\x1e\x9f\x54\x3e\x66\x07\x52\xd5\x0c\x7a\xc5\x72\xd8\xcc\x1c\xca\x66\x1c\x75\xb0\xe2\x3d\x4e\x06\xd6\xd5\xef\xf2\xfb\x81\x35\x2c\xee\x7a\xcc\xb6\x9d\xda\xd2\x7e\x50\x5c\x35\xde\xa1\x91\x55\x64\xbe\x01\x61\x84\x8d\xa1\x1a\xfb\x3d\x48\x1f\x26\xb2\x4e\xf5\xa0\x2f\x66\xb7\x28\x0a\xd6\xaa\xb6\x69\xa3\x5e\xd4\x41\xd2\xd5\xe9\xab\x55\xf5\xd9\x00\x57\x61\x80\xf8\xbf\x87\x89\x71\xfa\x40\xbe\xb2\x81\xd5\x47\xf2\x1e\x08\x02\x08\x5b\x09\x10\x61\xc1\x4b\x1b\x57\x95\x77\x65\x80\xb9\x85\x46\xcc\xb6\x64\x33\x5d\x48\xb1\x66\x62\xb3\x03\xd6\x33\xc1\x8b\x79\x84\x99\xe0\x07\x40\xaf\x58\x7d\xd6\x33\xa1\xd9\xc1\x08\x84\x20\x83\x1e\x34\x6b\x0b\x5d\xd1\x50\x10\xd7\x16\xdc\x77\x07\x36\xbf\x03\x32\x06\x34\x49\xbc\x15\x34\x15\x19\x8c\xe4\x60\x2d\x6c\x05\x54\x50\x62\x32\xf8\xfb\xbe\x98\xb7\xbe\xb0\xfe\xc4\xe3\x17\x12\x90\xf6\x20\x02\x2f\xf8\xfe\x43\x8f\xcc\x5e\x4f\xba\x0f\x03\x3b\xe4\xf4\x40\x5e\x28\xf2\xc7\xf5\x87\xb6\x5c\x0f\x4e\x59\x8d\x64\x3b\x03\x75\xb4\xe2\x3d\xce\x06\xd4\x05\xb6\x13\x3d\x1b\x53\xc1\xc1\x94\x3a\xb5\x65\x7d\xff\x20\x77\x5f\x8d\xb9\xff\xf5\xc1\xf6\x37\x3a\xd8\xb4\xeb\xe3\xe9\xfb\x39\x9e\xb4\xeb\x43\xe6\x7b\x3f\x64\xae\x35\x71\x57\xd7\xc4\x7d\xcc\x20\x48\xd7\x87\xe7\xdf\xe8\xf0\xfc\x98\x41\x9c\xae\x8f\xe1\xef\xe6\x18\xfe\x98\x71\xb5\xae\x0f\xf4\xef\xea\x40\xff\x76\x82\x9c\xfd\xfd\x54\xfd\xd7\x47\xf7\xdf\xe8\xe8\xbe\xe6\x7b\xbf\xa3\x03\xf7\x9a\xef\xbd\x3e\x26\x3f\xa2\xcd\xd3\x07\xc5\x96\xff\x16\x6d\x9d\x3e\x68\xc0\x2b\xf1\xd0\xaf\xcf\xd1\xbf\xd1\x39\xfa\x61\xb0\xd1\x10\xed\xfd\xfa\x4c\xfe\x3e\xce\xe4\x0f\x03\x9c\x95\x60\xfa\xd7\xe7\xfb\xf7\x74\xbe\xbf\x1f\xd0\x5c\xe7\x27\xf8\x72\x69\x5d\xfe\x7e\x9e\xb4\x55\x8b\xc8\x6b\xa2\xe6\x6f\x44\xd4\x5c\x0b\x07\xbe\x23\x42\xe4\x5a\x38\xf0\xdd\x13\x0f\xd7\x66\xe4\x9f\x88\x70\x48\x03\x3f\xd7\xde\x84\xfb\xf9\x91\xab\x3b\x7d\x5d\x3b\x0a\xc2\xc3\xa3\x1c\xaf\x0f\xc2\x28\xda\x48\x4e\x3c\x3f\xcc\xdf\xb9\xba\x59\xcf\x9a\xf0\x2c\xf4\x5f\x7d\x87\xf1\x08\x3e\xc4\xe2\x9c\xe3\x34\x0c\x84\x29\x7e\x6c\x0c\xd6\x58\xfc\xc2\xf1\xe8\x94\xbf\x18\x33\xa7\xfc\x85\xe7\xc3\xf2\x57\x04\x33\x2d\x7e\x81\xd0\x72\xca\x5f\x0c\x94\x5a\xfe\xca\x20\x3b\x58\x06\xa0\xc5\xb4\x51\x11\x63\xf3\x1b\x7b\x04\x37\xbc\xea\x21\xeb\xf6\xe1\x06\xb1\xe4\x90\x8d\xf8\x86\xed\xc3\xa1\x34\x64\xdd\x21\xdc\xf0\xe2\xa2\xba\x3e\x1b\x8d\x20\x38\x15\x5c\x59\x7f\x07\x3b\xca\x62\x2c\x3b\xd5\x51\x6e\xd5\x66\xa0\x3e\x37\xd5\x79\xab\xcc\xa9\x32\xdb\xc5\x32\x28\x4b\x23\x97\xca\x29\x7f\x7b\xea\xd2\x4a\x50\x19\x96\xbf\x3d\x15\x34\x24\xa8\x38\xe5\x6f\x4f\x05\x2d\xf1\xfd\xb0\xf8\xe9\xe1\x92\xf5\xae\x2d\x92\xbe\x5e\x8b\xa4\xef\x12\x6b\x7c\xfa\x40\x7f\xd7\x7a\xf4\x75\x7a\xf4\xef\x12\xef\x5d\x6b\xa4\xbe\x62\x8d\xd4\x77\x89\x02\xaf\x63\x12\x5e\xcb\x50\xbf\x2e\x19\xea\x77\x79\x30\x5c\x4b\x23\x3e\xc7\x16\xac\x88\x16\xee\x04\x51\xb4\x75\x9a\xbe\x0e\x6a\xa2\x85\x32\xdc\x88\xe3\x50\x7b\xb4\xed\xdc\xb6\xa8\x85\xd9\x71\xa9\x43\xed\xc1\xb6\x53\x79\xc2\xcb\x5c\x21\xec\x9c\xa5\x6b\x9b\xff\xaa\x36\xd1\x3b\xda\x60\x7d\xdb\x1b\x32\xcb\xa2\xf0\x07\x13\xe3\x0e\x37\xfa\xac\x3f\xd8\x02\x69\x1a\xb5\xba\xac\xdb\xa5\xb6\xc5\x86\x23\x3a\x60\xa3\x2e\xb5\x86\xf0\x9b\x6d\xf4\x58\x7f\x44\xfb\xac\x67\x6d\xf4\x99\x33\xa4\x96\xc9\x9c\xd1\x6a\x5d\xb4\xcf\xfa\xbd\x6d\xc7\x2b\x3b\x6e\x6e\xd8\x47\xac\x7f\xbb\xcf\x0b\xf5\x65\x49\x93\x8e\x58\x9f\x5a\x43\xdf\x62\x5d\x6b\x63\xc0\x86\x43\xda\x65\xce\x86\x65\xd3\x21\x73\x7a\x1b\x96\x9d\xf1\xbd\x47\xbb\xcc\xea\xf3\x27\x0e\xb5\x6c\xaf\x5e\x43\x9f\xf6\xb6\x1d\xd9\x92\x09\x7f\xed\x2b\x85\x11\xd4\xe4\x42\x1d\x79\x69\x0e\x4b\x95\xb9\x67\xba\xf7\x36\xcc\x36\x7c\xfe\x48\x1f\x97\x8b\x78\xfb\x6d\x98\x41\x39\xaa\xef\x79\xe9\xea\xfb\x3b\x5e\x2a\x5f\x9f\xee\xed\x45\x41\x43\x09\x78\x2e\x0a\xf9\x51\x72\xba\xbf\x5a\x66\x8b\x3f\x96\x45\x38\xc8\x34\x14\xe1\x8f\x45\x91\xc3\x34\x6c\xa8\xe4\x7e\x1a\xca\x3a\x60\xb4\x2b\x05\x8a\x0c\x0e\x54\x3f\x09\x1b\xde\xcb\xd0\x9c\x54\xcf\x43\xff\xd5\xea\xfb\x42\x56\x46\xf5\x0c\x43\x35\x6c\x9c\x44\x49\xa5\x88\x12\xc2\x81\xea\x7b\xc9\xdb\x95\x02\x77\x92\xb7\xf8\xf2\x28\xf0\xf2\x8d\x63\xef\x44\x7d\x29\x52\x98\x52\x7d\xef\xff\x67\xef\xff\x7f\xdc\x38\x8e\xfc\x61\xfc\xf7\xfc\x15\xcc\xbe\x81\x43\x6c\x74\x97\xa6\xaa\xbf\x2b\x1f\x7d\x00\x7a\x2f\x39\x1e\x1e\xea\x89\xf1\x76\x8e\xc1\xed\xe5\x10\x8c\xb9\x94\xc8\xcb\xec\x52\x20\xb9\x6b\x2b\x41\xfe\xf7\x07\x55\x3d\x33\x9c\x19\x72\x57\xdc\x15\x25\xcb\x39\x3b\x71\x7b\x39\xd3\xd3\x5f\xaa\xab\xab\xab\xbb\xab\x5e\xb5\xa8\x2a\x2d\x84\xe8\x7d\xdb\x4c\xa8\x7f\xa8\x3f\x7c\xff\x3f\x8b\xf9\x0e\xae\x17\x6f\x56\xb7\x8b\x6f\x37\xeb\x77\x8b\xcd\xee\xfd\x6f\x7a\x43\xaa\x2e\xca\xdb\xb2\x7a\xbf\x5b\xcd\xb7\x17\x6a\x01\xd7\x8b\xed\x7c\xb3\x7a\xb7\x5b\x6f\x2e\xd7\xb7\x6f\x56\x6f\xfb\x99\xff\xab\x4b\xb2\xff\xfe\xea\x2b\x75\x71\x77\x9b\x0b\xbf\xbe\xf8\xf5\xab\xdd\xfb\x77\x8b\xf5\x9b\xd1\x0f\xab\xdb\xeb\xf5\x0f\xff\xf2\x2f\xf9\xbf\xb0\x2c\xb7\x7f\xf8\xe1\xb6\xad\xfc\xe2\xb2\x2a\x37\xab\xdd\x7b\x9e\xe7\xdb\x8b\xaf\xda\x6c\xdd\xc7\x50\x5e\x5f\xf7\x2b\xfe\xea\x1f\xea\x02\x5e\xbc\xdb\xac\xb9\x3f\xdb\x17\x2b\xce\xf5\x62\xbb\x99\xbf\xd8\xca\xeb\x17\xf3\xf5\xcd\xcd\x62\x33\x5f\xe8\xfc\x1b\x76\xdb\x8b\x97\xbf\x7a\xf1\xf5\xaf\xbf\x7e\xd6\x3f\xbf\xfe\xfa\xcf\xbf\x1a\x8d\xf8\xe3\xd1\xd3\x2a\x1d\xf1\xc7\xbf\x1a\x8d\xfe\xfc\xbc\x7a\x5f\x70\x93\x47\xb7\xeb\xd1\x76\x57\xee\x56\xf3\xd1\xe2\xc7\x77\xeb\xcd\x6e\x3b\x7a\xb3\xbe\xbb\xbd\x1e\x7d\xfd\xe2\xcd\xdd\xed\x7c\xb7\x5a\xdf\xfe\xa6\x52\xa5\xda\x7d\xf5\xf7\x8b\xbb\xed\x62\xb4\xdd\x6d\x56\xf3\xdd\xc5\x6f\x1f\x18\x6b\x75\xf1\x97\xbf\x2c\xb6\xaf\xd7\xd7\x77\xd5\xe2\x42\xfd\xfd\xbe\xac\xee\x16\x2f\x7f\x5d\xfc\x43\x66\x76\xdd\x81\x7a\x72\xef\x59\xe8\xf7\xe5\x7c\xb7\xde\xbc\xef\x3c\xf9\xdd\xcd\xbb\x6a\xfd\x7e\xb1\x38\xf2\xe8\xdf\x36\xeb\xbb\x77\x9d\xe7\xff\xf7\xee\xfb\xaa\x9b\xef\xdb\xc5\x76\xdd\xf9\x79\xb9\x5e\xdd\x7e\x53\xbe\xed\x3c\xf9\x66\xb5\x9b\xaf\x57\xb7\x9d\x27\xff\xb9\xe8\xfe\xfa\xd3\xfa\xb6\x57\xfc\xbb\x5e\x33\xbe\x65\xe2\x74\x9b\x75\xb9\x5c\xcc\xff\xda\x79\xf0\xaf\xeb\xaa\x2a\x37\xdf\xac\xaa\xaa\x5b\x67\x79\xdb\xcd\x73\xb9\x59\x5c\xaf\x76\x97\xe5\xe6\xfa\xe0\xc3\x6e\xd1\x77\x9b\x6e\x4f\xbe\xdb\xad\x37\xdd\x96\xfc\xa9\xac\xaa\xc5\xae\x9b\x61\xb9\x7e\xf7\x6e\x75\xfb\xf6\xb2\xdc\x74\x1f\x7f\xbb\x7a\xfb\xf6\xfd\xa0\x01\x4d\xd6\x3e\x65\x2e\xcb\x6a\x7e\x57\x95\xbb\xf5\xe6\xd5\xfd\x7a\x75\x3d\x2a\x7e\x7b\x5f\x6e\x46\x8b\x57\xbb\xdf\x30\xa3\x00\xbc\xb8\xdb\xad\xaa\xed\x8b\xfd\xa4\xd5\x73\x99\xb5\xa3\xaf\x5f\x1c\x9f\x2e\x0f\xe4\xe7\xf9\xf2\xd5\x6f\x77\xc3\x72\xb7\xf7\x6f\xf5\xae\x7c\xab\xdf\x2e\x6e\x17\x1b\x6e\xc5\x07\xca\x3d\xc8\x9f\xcb\x3d\xda\x9f\x63\x8b\xfd\x13\xef\x10\x28\x2a\x9a\xc4\x36\x22\x3d\x2f\x79\x76\xd6\x09\x59\x5f\x28\x52\x34\xa1\xd8\x7d\xa0\x69\x66\x3b\x5f\x70\x11\x57\xaf\xa3\x32\x34\xb3\x13\x8a\x33\x43\x8d\x2a\xb8\xff\xe7\x59\xc7\xff\xbc\x54\x4f\xc8\x81\x0f\x33\x3f\x41\x6c\x97\xe1\x42\xa3\xc2\x7b\x0b\x3e\x2c\x8f\x56\x55\x07\xf4\x78\x02\xa8\x49\x1b\xfb\x83\x24\x56\x55\xd1\xa4\x51\x22\x45\xe5\x54\x42\x47\xd5\xa9\xff\xf8\x5a\xed\xbe\x56\xb2\x12\x6d\x8b\x9a\x34\xe6\x38\x9a\x92\x4a\x24\xaf\x3a\x3d\x43\xad\xae\xd3\xd7\x28\xbd\x6c\xff\x1f\x25\x56\x56\x4e\x6d\xa7\xeb\x67\xa8\xd5\xf7\x28\xcc\x5d\x2c\x9a\xd4\x76\xba\x28\x41\xb8\xea\x94\x3e\xbe\xd6\xd0\xa3\x30\x51\xe7\xff\xb6\x0e\x7c\xc6\xa9\x34\xa2\x4e\xcf\x50\x6b\xec\x51\x78\x3f\xa8\xbe\x53\x4d\xd1\x21\x75\x3c\x4b\xad\xa9\x4f\x61\x09\x20\x97\x53\x23\xc3\x99\xd3\x1c\x38\xb2\x4e\xe3\xc7\xd7\x8a\x45\x9f\xc4\xd2\xdf\x9c\x9a\x82\xeb\xc9\xe9\x9e\xd6\xf6\x3c\xd5\x62\x9f\xc6\xc2\xc8\x39\x35\x42\xda\x9c\xee\x27\x51\x3c\x5e\xed\x13\xef\xd9\xce\x26\x2a\x91\x14\xc5\x09\x16\x33\xf2\x4b\xba\xba\x29\xb4\x97\x1f\x45\xe7\x07\x5a\xfe\x11\x14\xd2\x04\x43\x37\x5f\xe8\xe6\x0b\xdd\x7c\x64\x3b\xf9\xf8\x47\xd1\xf9\x91\xf3\x15\x3a\x70\xe1\x6e\x42\xfe\x60\x0b\xd9\x5d\x3c\xcf\xb1\xae\x38\x85\x34\x4b\x50\xb8\x32\xa8\x90\xf7\x4e\x1a\xad\x2a\xee\xc3\x5e\x8e\x33\x5d\xb8\x69\x71\xc6\xfd\x34\x39\xbb\x53\xae\xde\xd6\x61\xc1\xaf\x7d\xbb\xd1\x6b\xf3\xbb\x99\xa1\x89\x9f\xa1\x9d\x24\xfe\x92\x47\x01\x8a\x34\x46\x48\xa8\x24\xc9\xa5\x3b\xfe\xd3\xd8\x89\x29\x8e\xbd\x35\xa4\xe4\xb3\x19\x9e\xb6\x5e\x3d\xce\x1c\x68\x54\x02\xa2\x83\xd6\xd3\x92\xa9\x40\x34\xa0\x82\xbc\xf8\x98\x6a\xa9\x43\xe6\x7b\x03\xb8\xdf\x0d\x6b\x21\x12\xd3\xb3\xf3\xbc\xd8\x3f\x3f\xc2\xb3\xa6\x18\xf0\x6c\x26\xc9\x20\x98\x42\xa3\x70\x9d\x81\x3b\x30\x41\x20\xde\xdf\xdb\x50\x22\x82\x77\x2a\xa7\x79\x75\xf7\x60\x10\x1c\x8d\x21\x42\xac\x07\x1e\xad\x42\x02\x2b\x67\x02\x88\x75\x9a\xb7\xe4\x98\xc0\xf2\xdb\xb2\x93\x1d\x28\x6a\x04\x17\x8e\x50\xf8\x91\x7b\xb2\x07\x54\x91\xf9\x8f\xaf\x2e\xc8\x81\x89\xf9\x86\x02\x3d\x04\x94\x5b\x0a\x04\x73\x6c\x71\x7c\x06\xa0\x9a\x71\xe0\x50\x89\x25\x5a\x47\xcb\x81\x68\x35\xf7\xcd\x80\xa5\x9c\xd4\x03\x09\x45\xd2\x08\x48\x0a\x03\x18\x57\xa7\xcd\x3b\x6f\xb4\x81\x10\x2b\x82\x18\xb5\x05\x37\x96\x83\x16\x49\x6a\xc6\x37\x2a\x94\x08\x21\x28\x49\x6a\x8d\x0a\x8c\xd1\x99\xb0\x54\xa7\xf9\x85\x03\x93\x20\x30\x9b\xc9\x90\x49\x9a\xdf\xe4\x07\xe0\x8d\x42\x2f\xc7\x38\x92\x36\x5f\xa1\xe7\x32\xd3\x25\x22\x18\x54\x1e\x8c\xb2\x10\x0d\x17\x9d\x94\x55\x18\x26\xb6\x24\x70\x5e\x49\x92\xdb\x8e\x60\x64\xd8\x0c\xb7\x16\x73\x92\xc7\x18\xd0\x6a\x04\xab\x10\x30\xe5\xa4\x7e\x6e\x8d\x06\xcb\xf9\x8b\x98\x93\xa6\x37\x48\x1a\x21\xba\xb1\xe1\xda\x25\xc9\x9d\x17\x21\x60\x4a\xab\x9a\x96\x82\x31\xca\x40\x11\xc7\x16\x82\x57\x92\xd4\x64\xe2\xf1\x48\xae\x82\x44\x60\x7d\x89\x01\x5c\x54\x39\xcd\x19\x10\x22\xa9\x50\x01\x93\x3f\x8e\xc9\x28\x32\xed\xc1\x13\x29\x83\x10\x63\x47\xd4\x41\x70\x60\xec\xd2\x82\xa3\xee\xd3\x44\xd2\xed\x29\x3a\x45\x09\x92\xad\x10\x30\x02\x9a\x92\x0a\x6e\x59\x4e\x73\x5e\xab\x8a\x39\x98\x00\x3e\x0f\x1d\xd3\x9e\x98\x4a\x21\x75\x0b\x8c\x60\x71\x69\xc1\xd8\xc3\x5a\xd2\x5c\x03\x06\x0d\x56\x83\xb1\x1a\x22\xd3\x2e\x68\x04\xd2\x80\x51\x83\x33\x1a\x0c\x69\x64\x8a\x32\xb5\xdd\x18\x0d\x60\x54\x39\xad\x85\x43\x92\x31\xf3\x25\x12\x08\x4f\xb8\x96\x5a\xf5\x51\x5c\xdd\xd9\xa8\xc1\x53\x45\x40\x5e\x3b\x88\x38\xde\xbf\xeb\xf0\xfa\xd5\x8d\xb0\xaa\x72\x60\x2d\xcb\x01\x13\x54\x4e\x1b\x5e\x36\x4e\x03\xe2\xb2\x28\x23\x90\xe2\x7f\x9b\x17\xdc\xd6\x18\x54\x67\xae\x24\x93\xd9\x19\x51\xd8\x12\x5b\x3e\x65\x32\x25\x1e\x35\xfe\x5f\xc3\x68\xcc\x2d\xe8\x2b\x8d\x50\x78\xb0\x71\x0b\x36\x29\x02\x4c\x3c\xa4\x06\xd0\x4f\x88\x20\x30\xbd\x28\x13\x8b\xc9\xc1\xed\xf1\xfb\xbf\x2a\x0d\x3e\x40\x91\x4a\x8c\xc2\xb2\x92\xe6\xf2\x2d\x90\x03\xa4\xb9\x06\xef\x35\x14\xfc\x51\xf0\x1a\x88\x67\x27\x69\x30\x8e\x2b\x76\x4e\x03\x85\x2d\xcf\x1f\x02\x6b\x78\x8e\x11\x04\x7b\x5f\x4c\x58\x2e\xd2\x58\x0e\xb6\x55\x4e\x33\xb7\x07\x66\x4e\xe2\x8a\x79\xb8\x4c\x1a\xa3\xad\xcf\x53\x7d\x4d\x19\xe5\x99\x43\x6d\x9c\x83\xb3\x3c\x07\x93\xf2\x3c\x13\x92\xc8\x4c\xee\x9f\x8e\xe0\x6c\x29\x96\x91\x2a\xa7\xf9\x3b\x97\x27\x90\x8d\x15\x78\x12\x7a\x31\x6f\x8c\xb1\x00\x4a\x2a\xa7\x39\x23\x05\x25\x45\x44\x20\xa7\x24\xc9\xcf\xad\x06\xef\x2a\x6d\xc0\xf0\x70\x52\x62\x0a\xb8\x65\x51\x12\xd3\x59\xe5\xb4\x1e\x7f\x9e\x8c\x16\xa2\x55\x9e\xa9\x2e\x49\xcd\x5c\xc0\x62\x1e\x4c\x3a\xc3\x7a\xcc\x62\x31\x42\x0c\x63\xc7\x52\x47\x92\xdc\x50\x63\x98\x44\x1e\xb9\x65\x4c\x7a\x49\xf3\xb0\x19\xa0\xa4\xb9\x65\x95\x01\x93\x34\x77\xa3\x84\x04\xa9\x61\x31\x67\x65\xae\xaa\x04\x3e\xe4\xa4\x15\x76\x26\x0b\x47\xd5\x8a\x4d\x03\x68\x14\x8d\x59\x36\x04\x95\xd3\x9a\x1b\x23\x78\x15\x00\x1d\x4b\xc6\xa8\x3c\x38\x62\x82\x85\x5a\x32\x82\x63\xe1\xc8\x43\x6c\x35\x14\x61\x4c\x32\xe6\x8d\x54\x42\x45\x90\x78\xe0\x28\xb5\x2b\x36\x4b\x47\x27\xfc\xc4\xb4\xa3\x9c\x34\xe2\x91\x67\x7b\xec\x89\x47\xec\x8a\x47\x5e\x55\xea\xa4\x11\x9c\xc4\xf3\x88\xdc\x58\xce\xc5\xed\x7e\xd8\x78\xc0\xd0\x41\xaa\x35\x9c\x3c\x5e\x2e\x28\x53\xa1\x12\x9e\x8a\xc2\x8b\xb1\xe1\x45\xd6\x2c\x02\x88\x50\x6c\xe5\x22\xaf\x01\x21\xa9\x9e\xb4\x32\x71\x69\x78\x38\xc0\x11\x93\xa2\x7e\x6e\x35\x04\x37\x45\xab\x4c\x01\x26\x96\xcc\xbe\x8d\x1a\x23\x0b\x15\x60\x9c\x43\xca\xbc\x05\x45\x64\x96\x22\x88\x2c\x88\x4b\xb1\x30\x57\x39\x6d\x38\x8e\x87\x65\x2e\x0b\x99\xd4\x2f\xa7\xfd\x80\x4c\xb0\xe8\x4a\x48\x86\xa5\x47\x23\xb9\x02\x0b\x50\x03\x88\x25\x78\xd7\x2a\x25\x0a\x3c\x6a\x88\x8e\x45\x82\xd1\x10\xac\xc8\x4b\x84\xe0\x34\x04\x11\x55\x81\xa7\x95\x0c\x4e\xbb\xd0\xf2\x5b\x9e\xfa\x73\x5e\x0d\x81\x45\x1b\x69\x20\x16\x38\x3c\x7d\x4b\xe6\x9a\xa0\x72\xda\x08\x36\x4b\x1a\x55\xad\xc9\xc8\x10\x06\x11\x3e\x22\xd1\xbc\xad\xd3\xb6\x5b\x22\xc6\xb8\x04\xd3\xa4\xcd\xc8\xf8\x28\x0b\x79\x67\x09\x60\x61\x54\x21\x04\xa3\x2d\x58\xdb\x13\xc8\x79\xaa\x5c\xbd\xe6\xa6\x24\xae\xc3\xa5\x12\xa2\x87\xe8\x5b\x9a\x43\xe1\x20\xf2\xff\xdb\x27\x3a\x37\x88\xc0\x62\x9d\xd6\x22\x08\x7c\xd2\xe0\xf6\xd9\x51\xb2\xb3\xa6\x20\x02\x85\x75\x09\x49\xeb\xf9\xb0\xaf\xf3\xea\x06\x85\x07\x58\x66\x95\x28\x5a\x1d\x27\xb5\x3a\x0d\x56\x28\x61\xc7\xdd\x37\x32\x25\xbc\xb0\x7d\x80\x70\xa8\xb5\xf6\x4e\x0f\x07\x8a\x6b\xa3\x09\xfe\xf8\xea\x82\x69\x67\xb2\x7a\x47\xac\xed\x88\x7a\x47\x40\x4f\x88\x79\x2c\x97\x61\x0f\xe8\x9a\xac\x40\x86\x8f\x2b\x9e\x8e\x14\xdf\xb9\x79\xe3\xb9\xed\xc0\x84\xee\xb0\x12\xf3\x83\x9b\x20\x82\x4d\x15\x33\x32\x4d\x0c\x4e\x29\xdf\x75\xa5\xa5\x46\x37\x8d\x59\xe7\x71\x3d\xad\x93\xd7\x2c\xef\xa6\x96\xb9\x88\xf6\x9b\x2f\x0d\x8e\xa7\x4e\xa2\x69\x50\x0e\xbc\xad\xac\x3c\xb0\xe0\xa6\x09\x92\x63\x49\x6a\x23\x0b\x2e\x16\x7d\x63\x02\xcf\x53\xd3\xfb\x56\x25\x0a\x56\x91\x2c\x71\x75\x52\x0f\x3f\x29\xf2\x13\x8a\xe0\xbb\x5a\x4c\xa1\x89\xdb\x1d\x6d\xc9\x6b\xac\x6f\xa6\x07\x38\xaf\xb1\x62\x5e\xd3\x34\x91\x68\xba\x9d\x6f\x50\xb3\xd6\x6b\x58\xc3\xc1\x1e\x7b\xb7\xc4\x79\x52\x44\xad\x47\x47\xf3\x89\xfc\x72\xb2\xb1\xd2\xb9\x38\xe8\x64\x63\xa1\x07\xcf\x62\xda\x63\x9d\x02\x02\x8e\x42\xf6\x5a\x19\xc9\x1d\xb7\x4d\x23\xb1\xa3\x40\x3b\xca\x4e\x34\x38\x0a\x1f\x17\x2a\xe2\x11\xd6\xe6\x51\x76\xa2\xaa\xa8\x7f\x72\xce\x45\xde\xd5\x59\x88\x0f\x5d\x30\x9f\xec\x3d\xfc\x08\x31\x3d\x4b\x64\x64\x35\x4b\xcc\x28\x14\xe2\x18\x81\x78\x15\xa1\x56\xc3\x27\x51\x01\xcc\x44\x0c\x20\x0e\x5e\x8b\xfd\x82\x42\x9c\x8a\xe1\x82\x94\x75\x58\x44\x5b\xcd\xd5\xc5\xe8\x7c\x4e\xad\x67\x9d\x90\x27\x99\x66\x9f\x6f\x3a\x9e\x64\xbc\xfc\xc8\xc0\x89\xaa\x15\xca\xc0\xcb\x63\x68\xf4\x24\x64\x0d\x51\xa3\x1a\x3c\x55\xf2\xb4\x2b\xf7\x3f\x2a\x40\xd7\x63\xeb\x8e\x2c\xdf\xae\xd2\x72\x36\xf1\xcf\xbe\xb4\x20\xb8\xa0\x3d\x24\x1c\x07\xde\xc1\x4a\x52\xef\x29\x32\x1d\x9e\x41\x66\x7b\x1a\xb3\x0d\xad\x63\x1f\x9a\x55\x4f\xc6\x4b\xfb\xc0\x9c\x72\x2d\x8f\x37\x2c\x3e\xe4\xf0\x87\x77\x61\x8f\x4e\x1e\xff\xfc\xa2\x3f\xa4\x09\xc9\x61\x53\x3a\x50\x84\xfc\x24\x01\x61\xcb\x96\xe1\x21\xb6\xf4\x0f\xb2\x65\x64\xb6\x8c\x62\xbe\x14\xf6\x7c\x99\x3e\x33\x5f\xd2\x80\x2f\x7d\x65\x80\x34\x9a\xbe\xc6\x93\x89\x30\x64\xc8\x07\x28\xfa\x61\x65\xe7\xc4\xc1\x3a\xd1\xf4\xf3\x3c\x9c\x71\x92\x3d\xe1\x07\x84\x2a\xaf\x74\x0e\xec\x98\x97\x3a\x25\x49\x51\x9f\x29\xab\x04\x31\x4d\x09\x81\xd2\x3f\x31\xeb\x20\x60\x3e\xf1\x38\xca\x29\x8f\x50\xf8\x44\xe5\xed\x27\xd7\x37\x3e\xd4\x8f\x87\x22\x8c\x9d\x6b\x3e\x9c\xe0\x13\x73\xae\xd9\xf0\x41\xa7\x8b\x13\x56\x72\x5e\xd9\x78\x61\x6b\x76\xd6\x04\xee\x9f\x9a\xfb\x03\xea\x30\x0e\x60\x93\x0a\xcd\x31\xe4\x83\xab\xf9\x07\xc8\xfc\x98\xc2\x74\xfa\x4a\xfe\x81\x4a\x1e\x08\x74\x3a\x38\xf4\xa8\x6d\xa8\xce\x70\x4f\x67\x48\xa1\x9b\x18\x9c\xa5\xae\xf1\x8d\xc6\x89\xef\xdc\x2b\xa2\x86\x48\x33\x0f\x91\xc6\x7b\x43\x59\xaf\xfc\x44\x8e\xdd\x07\x23\xe5\xc7\x46\xed\x8f\x03\x43\x29\x9b\x73\xd3\xde\xdc\xa8\x42\x81\xf1\x33\x0a\x90\xcc\xd8\x02\x2a\xfe\x37\x3f\x0f\x2c\x40\x8c\x5c\x56\x76\x07\x12\x67\xe4\x96\x38\x78\x84\xbe\xb7\xfe\x2b\x74\x57\xaf\x29\x29\x53\x4c\x42\x66\x38\x44\x45\xfb\x2b\x44\xa7\xa4\xc2\x59\x82\x18\xc7\x86\x9f\x9b\xae\x0d\x30\x16\x13\x4a\xf7\x6e\xd2\x5e\xef\xd6\x15\x15\xcb\x70\x75\x43\x3a\xf0\x8b\xa6\x57\xcc\xfd\x7e\x62\xf0\x7c\x37\x8f\x06\x0a\xac\x65\x40\x51\x5f\x3b\xba\x33\x9c\x8f\x93\x5c\xd9\xd9\xa3\x83\xdb\x19\x47\xa7\xc2\xc4\xcd\xc2\xe1\xc8\x76\xaf\xe5\xf3\xc0\x4a\x89\xd4\xde\x01\x2a\xa3\x3c\xc4\x78\x4f\xc8\x03\x29\x86\xd6\x66\x3f\x94\xee\xf8\x50\xfa\x25\x42\xb2\xfd\x23\x59\xd4\x90\xf0\x5e\x63\x31\x1e\x5c\xf3\xa9\xa6\x13\x57\xcc\xa8\x64\x2b\x1d\xe5\x76\xae\x34\x10\x83\x92\xa4\xa8\x0f\xf6\x83\xd1\x56\x0d\x1e\xab\xfc\x78\xca\xfc\xe1\x4f\x1c\xaf\x87\x75\x52\x19\x2b\x0b\x85\xad\x6f\x89\x13\x24\xea\x0c\x57\xff\x54\x52\x8c\x1e\xcf\x63\xbd\x67\x8a\x09\xfa\x19\xd1\x04\xed\x7d\x9c\x44\xfe\xcb\xdf\xc7\x0f\x19\xa5\x10\x3f\x3b\x93\x99\x9e\xc9\x27\xb8\x06\x28\x28\xde\x0d\xa3\x72\x80\xd8\xb5\x7a\x09\x90\x48\xd9\x49\x84\xa2\x67\x3e\xc3\xba\x15\x67\x9d\x92\x5c\x64\x72\x01\xfb\x66\x6a\x20\x84\x74\xcf\xa2\xa1\xd3\x76\xb0\x5e\x56\xfe\xb1\x65\x49\x6f\xdb\x3b\x18\xe5\x15\x15\xbc\x69\xb3\x10\x48\xd9\xfd\xe5\x9f\xd1\x08\x05\xe7\x0c\x26\x27\x4d\xf6\xe2\x29\xcf\x7a\x45\x7a\xb9\x7d\x74\xd4\xe9\x8a\xb1\x0a\x03\x90\x9f\xa1\x05\x0c\xdd\x17\x7b\xda\x5c\xc9\x22\x1b\xeb\x05\x2f\xca\x19\x7d\xb3\xce\x06\x88\xa4\x30\x4c\x49\x6e\xe5\x62\x64\x95\x06\x93\xc2\x50\x12\xd3\x53\x92\xa2\xbe\x5a\x34\x81\xb7\xda\xd8\x64\x2c\x1e\xcf\x98\x0f\xcf\xa2\xac\xbe\x8f\x66\x4c\x75\xbe\x28\xb7\x0a\xe1\xa0\x8d\x5e\xd5\xf7\xd2\xe0\x65\xb9\xaf\x4f\xdf\x35\x69\x88\x31\xf7\x7b\xca\x03\xcc\xd2\x81\xc7\x5b\xa6\x95\x05\xf4\xf7\xe0\x43\x55\x28\xe2\x4d\x19\xf1\x80\x51\xbb\x48\xab\x86\x22\x67\xb8\xf0\xfb\x0c\x53\xe1\x71\x53\x9c\x5f\xa6\xc1\x89\xd3\x80\x59\xd2\x82\xbd\x47\x70\x34\xe5\x9c\xf1\xc3\x6c\xc9\x25\xda\xa9\xdc\x12\x29\x3f\x41\x7f\x75\x83\x24\xf7\xd5\xd3\x53\x67\x4a\x25\xe6\x58\x5c\x0a\x15\xca\x2f\x2d\x58\x27\xd3\xcd\x82\x3d\xb8\x35\x12\x1b\xf5\x73\xa8\x4f\xdc\x42\x45\x11\x6c\x6f\x89\x05\x13\x35\x18\x1a\xef\xef\x8b\xf3\x0d\x9a\x53\xcc\x8b\x3c\x67\x0e\xd5\xdb\x64\x4a\x94\xeb\x4e\x6c\xaf\xd2\x59\xd5\xb0\xc7\xf3\x93\x58\x6f\x74\x8a\x37\x05\xef\x9e\x02\x74\xd5\x31\xac\x2d\x13\xc6\xc8\x6b\x68\xab\xd4\x80\xc9\x7a\x81\x5c\xea\xee\x97\x78\x45\x93\x04\x09\xcb\x4e\x66\x2d\xd7\xaf\xaa\xfb\xb9\x3c\x39\xf2\xed\xd2\x73\xd5\x9d\x8c\x54\x40\x34\xdc\xa0\xde\x95\xd5\x9e\x5e\xe7\x30\xc9\x8b\x8a\xc6\x4c\x31\x5f\xb7\xc3\x88\xab\x59\xf3\x44\x7a\x1b\x15\x5d\xdd\x04\xb0\xa4\xc8\x01\x6b\x8d\x85\xc8\x4a\x49\x33\xe5\x12\x6f\x4f\x09\x27\x8e\x77\x18\x1d\x47\x30\x4d\x4b\x33\x2f\xb4\x98\xa8\x14\xf9\x12\x98\xff\xcb\xd3\x6c\xcb\x3b\x23\x93\x8d\x52\x96\xda\xf4\xbf\x9a\x24\xc0\x24\xf5\x78\x95\xd3\x7a\x0d\x70\x60\x58\xfa\xf2\xde\x06\xc8\xc9\x25\x7c\xa3\x17\x01\xab\x37\x80\x34\x8e\x60\xc4\x59\xad\x6d\xbf\xd8\x20\xa1\x5b\x26\x30\xbe\xef\xa6\xc6\x4c\x63\x4c\x19\x78\xc2\x86\xfd\xac\xe5\xb1\x48\x10\xe9\x30\x73\x0c\xe5\x41\xf1\x04\x44\xca\xaa\x6e\x83\xf2\x5d\xac\x31\xd2\xa0\x83\x99\x53\xbb\x7b\x9c\x43\xb5\xc9\x56\x23\xae\xf4\x90\x50\xf9\xd6\x6e\x93\xe7\x75\xd4\x86\xe7\x0f\x67\x69\x9b\xca\x32\x00\x30\xcd\x22\xd3\x09\x0b\x28\xe4\x9a\xb9\x68\xb7\xb2\x26\x13\xbc\xc7\xff\x62\x49\xe0\xc6\x88\x72\x29\x8d\x9d\x9d\xa6\x18\xce\xcc\xba\x67\xd7\xa4\x8a\x99\x9f\x6b\x0b\x16\x50\x7b\x66\x5e\x02\x4a\x3a\x80\x63\xb1\x8a\x71\xec\xc0\x79\xe5\x1a\x6b\x36\x19\x1b\xef\x15\xca\x05\x3f\xe5\xa4\x7e\x11\xe4\xbe\xdd\xce\x28\x96\x48\x60\x94\x24\x79\xa8\x03\xa0\xd5\x04\xc1\x8e\xf7\xd3\x27\x8a\x71\x92\x07\x11\x56\x45\xaa\xd3\xb6\x2c\x53\xdc\x9b\x81\x49\xad\x29\xe6\x04\x91\x74\x36\x00\x2a\x02\x73\x25\x6f\x71\x8d\xb6\x10\xfc\xd8\xf1\xf0\xb9\xbd\x61\x59\x43\xea\xab\xd7\x48\x22\xa7\x1d\x18\x2a\x8d\x58\x77\xb4\xd6\x47\x9a\xb7\xec\x4c\x7c\x31\xe9\xb3\x62\x2a\xe8\xa5\xed\xce\xa8\x6c\x6c\x10\x54\xbc\x8f\x10\xe5\x92\x5f\xee\xf8\xf7\xb2\xad\x29\xf5\xea\x35\x59\xb0\x8a\x2c\x38\x3f\xd7\xcc\x96\x94\x7b\x6c\xc4\xee\x2a\x68\x07\x62\xef\x38\x43\x9e\x77\x73\xf0\xb6\xb6\x09\x02\xa3\x48\x81\xc3\x76\x07\x26\x7b\xb4\xc4\x6a\x05\x8d\x0d\xcb\x2c\x49\xea\xc1\x6e\xeb\xf8\x38\x31\xd2\xff\x92\xff\x79\xa2\x5c\xf1\x72\xd4\xe1\xd2\x5c\xa3\x32\xda\x80\xe7\x56\x47\xab\x1d\x24\x65\xef\xe9\x60\xa6\x8b\x3d\x1d\xef\x7e\x5d\x62\xae\xb4\x62\xce\xd6\x1a\x69\xf1\xa6\xd5\x95\x87\x93\x31\x88\x45\x9b\x51\x62\xe6\x95\xf6\x3b\x57\x9b\x6d\x82\x92\x9d\x31\xbf\x99\x32\xf1\x80\xa5\xae\xbd\x53\x10\x43\x3f\x31\xc7\x92\x7f\x9b\x91\x4e\xa8\x59\xde\xcd\xc1\x25\x9e\x21\xbc\xae\x5a\xd2\x86\x45\xa1\x03\x6f\xb5\x01\x87\x33\x0f\x83\xd6\x64\xfb\x24\xee\x41\x04\xc4\xb2\x6f\x26\xc5\x95\x24\x26\xdc\xf0\x03\xc3\x7d\x4c\xae\x64\xd6\x57\x92\xe4\x09\x67\x80\xc4\xde\x0a\xef\x3d\x20\xb3\x82\x1c\x20\x02\x59\x31\x96\x82\xc4\x6b\x45\x29\x26\x26\x7b\xb3\x14\x65\xc0\x33\x4f\x44\x62\xcd\xc8\x2a\xdb\xea\xa9\x2c\x5f\x79\x34\x0c\xb8\x8f\x5a\x5b\x1a\xbb\xeb\x82\x75\x39\x4c\xe0\xed\x5c\x0c\x2a\x91\x34\x84\xa4\x81\x48\xa3\x18\x59\x9a\x7b\x07\xc1\xcf\x49\x03\x73\x76\x11\x34\x24\x9e\x4d\x86\x79\xbd\x24\xde\x00\x4b\xd2\x2c\xa4\x62\xc1\x15\xc7\x86\xe7\xba\xe9\x98\xc4\xed\xeb\xf9\x98\x56\x9b\xc6\x48\x5d\xf6\xcb\xc4\x94\xa3\x6c\x33\xd5\x9a\x0c\x65\x03\x2a\xd1\xea\x72\x52\x37\x00\x78\x93\x4d\x33\x2c\xc0\xb9\x4b\x74\xa2\x82\x14\xd0\xee\x27\x50\xec\xc2\xf6\xe5\x1e\xac\x08\x1d\xaf\xc0\x07\x7d\xd3\x49\xf9\x49\xcf\x4d\x42\xc5\x19\x0d\x15\xf7\xbe\xd5\xba\xa6\x59\x57\x89\xe6\x22\xae\x6e\x44\xfa\x29\xa4\x89\x9d\x5a\x15\xaf\x5e\x5b\x45\x71\x46\x76\x62\xe8\xfe\xe0\x84\xfb\x89\xa6\x3c\x82\xfb\xf7\xe3\xab\x8b\x70\x31\x7a\xff\xea\xc2\x5c\x34\x18\x80\x44\x1d\x0c\xc0\xe2\x62\xb4\xf9\xf1\xd5\x45\x01\xc9\x5f\x8c\x36\xef\x9b\xbf\x76\x9b\xf2\x76\xfb\x66\xbd\xb9\x79\x75\x21\x7f\x56\xe5\x6e\xf1\x1b\xe3\xbf\x1a\x6d\xd6\x3b\xfe\x33\x15\x5f\x65\xf0\xc0\x57\x17\xb7\xeb\xdb\xc5\xc5\x68\xbb\xdb\xac\xff\xba\x78\x75\xf1\x7f\x8a\xa2\x68\x7e\x69\x6e\xdf\xff\xac\x57\xb7\xaf\x2e\x36\xeb\xbb\xdb\xeb\xf6\x79\xd3\x90\xe7\x5f\xcc\x7d\x8a\x81\xc0\x38\xb1\x33\x2a\x26\xe6\xe0\xf2\xf9\xb1\x6b\xbd\x3e\xa8\xc1\x43\xce\x06\xd2\x54\x70\x72\x4a\xcb\xdb\x52\xe5\x80\x4c\x85\x16\x9c\x38\xf2\xf7\xcf\x94\x20\x98\x29\x8b\x63\x9e\x47\x62\xb3\xcc\xa2\xb2\xa3\x9c\x8a\x00\x35\x4f\xe2\x8e\x87\x09\x68\xc5\x34\x7a\x5f\xbd\xc2\x89\xc1\x81\x72\x4e\x71\x86\x01\xbc\x99\x90\x9f\x91\x9b\x60\xaa\x7f\x62\x90\x9f\x45\xfd\x33\xf2\x2f\xd7\x51\x8e\xb9\xec\x27\x61\x0f\x3c\xc8\xc3\x0e\x0a\x12\x36\x46\xbb\xe7\xe3\x0e\x96\xe5\x90\x95\x1e\xb5\x93\x7a\xec\x2e\x56\x20\x27\xba\xdd\x67\xee\x31\x7d\x7a\x3c\xa1\x4b\xf6\x91\xca\x48\xa4\x29\x6f\x10\xe3\xd2\x00\xe1\x14\x23\xcb\x7b\xd6\x7c\xcb\xd6\x9c\xb2\xd0\xfc\x47\xa5\x3d\x2b\x1e\xac\x10\x4a\xd6\xca\x40\xd2\x04\xf4\x14\x11\xf1\xd0\x09\xec\x4f\xc8\x04\xa7\xd9\xb4\x9c\x9b\x29\x4e\x33\x6d\xf9\x44\x4c\x72\x9a\x01\xcb\x4f\xc2\x34\x67\x68\x9a\x53\x7e\x9e\xf7\xd8\xbc\xcd\x24\x4e\x6d\x3c\x41\x96\x4d\x6b\x89\xa8\x88\x20\x04\x15\x0f\x2e\xb8\x72\xd9\x1f\x65\xad\xf2\xc8\x80\xa2\xe8\x02\xac\xbd\x55\xe0\x3c\xef\x24\xba\x5b\x2e\x31\xe2\xc5\xc4\x6d\x62\x42\xdb\x56\x71\xdb\x7f\xf6\x8c\x86\xb9\x87\x1b\xf6\xd8\xdd\xdb\x53\xab\xf1\x47\xaf\xdf\xbe\x40\x49\x70\x9a\xb9\xe9\x27\x9b\x95\xa7\x19\x9f\x7e\x80\xf9\xd1\x8d\x79\x9b\xa1\xcc\xde\xce\x8a\x0a\x85\x76\xe2\xee\x69\x62\x70\x86\x0f\xdb\x5b\x9d\x66\x75\xfa\x70\xfd\x98\xc0\x7a\xb9\x86\xae\xc0\xc7\xac\xd0\xcb\xf6\x57\xdc\x05\x4e\x14\x0c\x0a\x01\xc1\x9b\x4b\x4c\x60\xb2\x39\x89\xb8\x2a\x12\xff\x99\xbd\x16\x73\x15\x1f\x69\xee\xf9\x28\x15\x0b\xde\x1c\xf1\x7e\xeb\x09\x42\x03\xf9\xab\x87\x6c\xa5\x4f\x34\xdc\x7c\xac\x55\x3f\x81\x4d\xc8\x93\x7b\xe2\x8f\x9b\x85\x3c\x32\x61\x5a\x75\x54\xbc\xe2\x7c\x9c\xa1\x17\x26\x25\x08\x58\xf1\x56\x95\x59\xe7\x39\x8a\xe9\x6b\x0c\xdc\x93\x20\x0e\x29\x1d\xbf\x90\xa8\x8a\x29\xb9\xec\x32\x37\x91\x85\xac\xd2\x0d\xeb\x4d\xd1\x8a\x5f\xa8\x18\x81\x1e\x52\xe0\xc1\xad\xc1\x63\x3b\x03\x6e\x04\x05\xde\x4a\xf1\x2c\x18\xd7\xee\x33\xd8\xfa\xff\x15\x92\xc1\x75\xe4\x99\x65\x91\x45\x8d\x00\xc3\x2c\xde\xa8\x27\xcf\x00\x0f\x4b\xb2\x72\xf9\xe5\x66\x5c\xd9\xb1\xf7\xa4\x28\xf2\x7b\x83\x13\x63\x67\xf2\xf7\x61\x6b\xea\xe6\x9e\xbc\xf7\xf8\xdf\xd1\xf3\x53\xec\x91\x4e\xb1\x11\xb2\x41\x85\xfd\xb1\x14\x59\x16\x70\x1f\xe4\xc2\x8a\xe5\xa4\x66\x39\x39\xe4\xe3\xca\xc9\xd9\xc3\x81\x4e\xf0\x31\x3a\xd0\x60\x1a\x1a\xb0\x34\x0e\xe0\x8c\x0a\xad\x9b\xe6\x33\x0d\x7d\x4e\xd2\x6a\xcf\xae\x04\x9d\x6c\x7d\xf4\xb9\x8d\x8f\xfe\xb7\xcc\x9c\x53\x2c\x5b\x3f\xa8\xd1\x94\x03\x8d\x46\x1b\xed\x80\x7c\x25\xde\x9e\xf9\xb8\xd3\x69\x08\xf1\xf4\xa9\x93\xaf\x2e\x14\x82\x77\x9a\x20\xfa\x67\xcc\x8d\x87\x26\xc0\x29\xe6\xb5\x5f\xf0\x3a\x7f\xba\x09\xeb\x60\x8d\x3f\x72\xa1\x25\xc0\x67\xe7\xb1\xa7\x8b\x13\xdb\xb9\xdd\x27\x45\x33\xf2\x1f\x3a\x60\xc3\xa2\x7f\xc2\x16\xaf\x6e\x0a\xe5\x4b\xcb\xaa\x9d\xdd\xdf\x1e\xb0\xe0\xb5\x13\x43\x72\xfe\x06\x9e\xee\x2d\x44\x33\x76\x10\x83\x72\x8d\xd5\x93\x50\x4c\xee\x93\x96\x1a\xc3\xc1\x4b\xab\xa8\x00\x6b\x67\xe8\xc0\x1f\xbc\x4c\xe2\xb8\x5f\x2c\x8f\x7c\x27\x36\x76\xe0\xaf\x5e\x07\x48\x0a\x8b\xf1\xa0\x69\xca\x2a\xb4\x33\x2c\xe4\x48\x96\xa0\xf0\x07\x19\xf8\x3b\xf2\x13\x7b\xf5\x9a\x67\xa7\xa2\xc3\x1c\x86\xf2\xa7\x33\x3a\xed\x56\xe7\x04\x7c\xb1\x7c\xd3\xeb\xe6\xda\xc8\x6a\xa6\x3d\x18\xc5\x3a\xbc\xfc\x11\x00\xdd\x96\xf2\x2d\x35\x3a\xd5\x3c\xe2\x3f\x34\x67\x92\x3f\xf8\xc9\x77\x94\x6f\x6a\x44\x9a\x35\x65\xca\x18\x10\xf8\x34\xd7\x04\x2e\xc9\xbd\x65\xd0\x94\xef\xd0\x82\x76\xe0\xb8\x70\x44\xf9\x4b\x35\x8f\xf8\x0f\xc5\x99\xe4\x0f\x7e\xf2\x1d\x15\xfc\x39\x19\xb9\xcb\x89\xf9\x8f\x73\xf8\xc7\x9f\x8b\x13\x65\x93\x3b\x93\xfb\xc3\xb1\x03\xd9\x45\x60\x23\xa1\x22\x04\x1e\x55\xce\x23\xa1\xb0\x66\x58\x4c\xf8\xd9\x41\xc6\xfa\xfd\x95\xdc\xad\xb1\x84\xef\x0e\x89\x6e\x86\x44\xb7\x43\xa2\xdb\x91\x68\xc7\xa6\x19\x12\xd5\x19\x12\x29\x4a\x35\x65\x66\x2b\x41\x31\x4f\xa2\xc3\xb6\xf2\x3b\xb9\x04\xbd\x29\x34\x1e\xed\x8d\x7c\xa7\x30\x9f\x69\x1f\x0c\xc0\xa2\xaa\x56\xef\xb6\x4f\x32\x17\xc4\x06\x51\x26\xe6\x7b\x03\x9b\x2f\x0d\x2c\x04\x3a\xb0\x48\xc9\x80\x8c\x03\x11\x24\x67\x77\x4f\x10\x41\x5c\xa7\xcf\x87\x7c\xbe\x3d\xe4\x43\xd7\x3d\xe4\x3b\x7e\x3e\xf8\x84\x89\xf5\x63\xb6\x53\x7d\xff\xea\x82\x70\x5f\x07\x3e\x5a\xc7\xb3\x20\x73\xac\x8a\x13\x24\x48\xa6\x8c\xbc\x56\xc6\x16\x03\x47\x09\xd7\x4d\x8c\x99\x91\x9f\x98\x19\x26\x48\x65\xa8\xad\x4d\x9a\xab\x4f\xc1\x43\xb1\x33\x0a\xc3\xe3\x19\x3b\xb0\x48\xed\x39\x12\x59\xf5\xd1\x36\x93\x36\xb7\xde\x83\x13\x2b\x00\x1f\x4b\x0f\x18\x94\x24\xb5\x08\x16\x10\x96\x6c\x41\x2f\x18\x2f\xf5\x73\x30\x5e\xcb\x65\xdb\x01\xd6\x4d\x46\x03\xc2\x2e\x1a\x4a\xc0\x2c\x3d\x0d\xe5\xa4\xee\xb5\x7c\xaf\x0c\x93\xca\xec\x31\x83\x0c\x58\xaf\xcd\x92\x35\xe3\xb1\x38\xbc\x60\x83\xf7\x51\x64\x4c\x0b\x5e\x7d\x1d\xf8\x98\x93\xfc\xc2\x03\x49\xb3\xad\xf2\xaa\xc5\x88\xc8\x97\x80\xf7\xc5\x78\xff\x6c\xdf\xd3\xab\xd7\x3e\x83\x86\x98\x34\x17\xbb\x95\x22\x5f\x39\x22\x6f\x1f\x4c\x86\x5d\x31\x80\xe6\xd2\xd4\x20\x1b\x02\x87\x21\x06\x29\x49\xb5\x9f\x9e\x43\xf6\x35\xac\x83\x65\x04\xcf\x62\xca\x37\x27\x4c\x4c\x6e\xd9\xce\xec\xc1\x62\x02\x2b\x21\x11\x28\x1c\xb8\xfd\x09\x8a\x8d\xc5\xe7\x70\xd1\x6b\x83\x8a\x0c\x6b\xba\x84\x13\x83\x2c\x74\x1c\xab\xbb\xf8\x80\xed\xf8\x53\xef\xa7\xf7\x54\x6f\x87\x02\x9b\xe1\xe9\x8e\x0f\x76\xc6\xb1\x3f\xc2\xd8\x0e\x7d\xd9\xe7\x09\xb1\x47\x12\x94\x11\xd1\xb5\xcb\x3e\x37\x15\x8a\xb9\x49\x90\x3e\xba\xbc\x27\x43\x6d\xf5\x9e\x47\x79\x96\xa2\xce\xb6\x00\x5d\x7e\xe6\x21\x28\x04\xe3\x09\x7b\xfc\x8f\x1a\x8c\x87\x68\xc7\xfd\xe9\x82\x3d\xfe\x4a\x20\xc6\x04\xce\xcd\x05\x22\x07\x21\x08\xbc\x11\xaf\x20\xe8\x75\xfe\xcf\x56\x37\x4c\xa7\x05\x17\x84\x9f\x1d\x82\x9d\x09\x1e\xee\x39\xac\x98\x58\xaf\x31\xc5\x84\x37\xa0\xe3\xc8\x3b\xbd\xd8\x82\xad\x28\x74\xbc\x77\xf6\x6e\x46\x82\xd8\x34\x3c\x19\x46\x37\x13\xf0\xac\xb1\x03\xe2\xd1\xa1\xd6\x94\xa1\x90\xb5\x4e\x09\xc0\x8f\xdb\xa3\x61\x91\x55\x01\x82\xe9\x6f\x35\xa3\x6c\x2a\xc6\x81\xb3\x85\x26\x2f\x6f\x7c\x05\x6a\x09\x67\x98\x78\x49\xa6\x81\xa9\x9f\x80\xc7\x79\x77\x89\x46\x51\xaa\xb1\xd8\x99\x58\x85\x42\xde\xb7\x75\xb1\xa5\x30\x28\x12\x93\xdf\xbe\x43\xc0\xe7\x34\xe0\xf3\xc0\xdb\x48\x48\x62\xc7\x16\xec\x81\x59\x0d\x10\xb1\xea\x15\xe7\x79\xb7\x87\xbc\x9b\x62\x25\x0b\xf3\xb6\xca\xd9\x19\xa6\x25\xeb\x69\x03\x03\x3f\x02\x19\x82\x78\x68\x67\xe2\xf8\x4b\x11\x8a\x26\x27\xb5\x1e\x93\x11\xb9\x92\x1d\x0f\xad\x74\x88\x27\x4d\xca\xbb\xbf\xbe\xc7\x0b\x26\xe6\x09\x1a\xce\x23\xd6\x7a\x04\xf5\xcd\xcf\x30\x2c\x07\x18\xf4\x4b\x6d\xee\x09\xd2\x38\xe4\xeb\x2a\xdf\x34\x0b\x85\x0e\x56\xac\x48\x0f\x6d\x73\x04\xb1\xe7\x80\xd7\x33\x16\xf4\x79\x9c\x11\xa2\x98\xa3\xda\x71\xdf\x23\x5d\x36\x7a\xe2\x36\x32\xf4\x06\xea\xd9\xe3\x71\xbf\x02\x38\x57\x72\x0f\x94\x6b\xf1\xee\x98\xaa\xea\x30\x6f\x86\xe8\x1a\x3b\x70\x3c\x39\x5c\x3b\x39\xb2\x08\xe0\x21\xb2\x31\x27\x35\x6d\x82\xa8\xd0\x21\x6f\xa9\xbb\x5e\x6c\xbc\x83\x06\xef\xa7\xb2\xbd\x50\xa6\x3b\x17\x10\x9c\x98\x5f\x4e\x51\x46\x06\xd3\x92\x87\xb8\xec\xaf\x04\x85\x98\xd6\xa5\x83\xee\x7d\xce\x29\x20\xb6\xfb\x69\x42\x43\x2b\x50\xb2\x40\x7e\x5e\x28\xee\x19\x4f\x56\x92\x34\x95\x9e\xa5\xac\x6f\x0c\x09\x51\x7b\x5e\x08\x96\x9a\x2a\xcf\x2b\x73\xac\xc5\xfe\xc0\x0c\x55\x00\x34\x3d\x4d\x79\x63\x93\xe1\xf1\x0e\xe6\x5a\x86\x27\xf4\x4b\x0b\x01\x4b\xc3\x5a\x8c\x24\xed\xd2\x10\xb5\xe1\x4d\x51\xa1\x05\x9e\x49\x8b\x4f\x90\xe6\x9a\xd3\x60\xee\xc5\x6c\x83\x68\x79\xc2\xd8\xd6\x08\x13\x82\x20\x04\xf2\xea\x1d\x8e\x30\x38\xcf\xe1\x23\x34\x20\x59\x07\x81\x8c\x92\xa4\x68\x2d\x42\xa3\x42\x3c\x98\x10\x7f\x5a\xdf\x9e\x65\xaf\xcf\x14\x9a\x50\x84\xe0\x2a\x70\xfa\xf0\xfa\x6c\x42\x72\xc3\x44\x80\x41\x47\x08\x3d\x97\x35\x31\xb7\xf7\x53\x0a\xbc\x1c\xa3\x9d\xb0\xf8\xc0\x29\xca\xbe\xd0\xf7\x6c\xc9\x93\x55\xc5\x14\x33\xae\x96\x9d\xb0\x24\x99\xfa\xec\x6e\x75\x90\x11\x6c\x9c\x7a\x30\x5e\xcc\xbb\x07\x93\xc9\x43\xe4\x66\xb2\xde\x3c\x78\x13\x20\x72\x23\x33\x48\x13\xf5\x34\x9b\xba\x72\xc7\x65\x52\xb1\x74\x60\xe2\xa3\x39\x49\x00\xe3\xa8\x38\xbc\x49\xbc\xd1\x0e\x22\x69\xd2\xd2\x04\x22\x30\x95\x66\xa2\xc9\x8e\x30\x89\xd1\x59\x92\xc1\xb6\x2c\xa7\xed\xd5\xeb\x28\xcc\xe8\x73\x9d\xf9\xab\x04\x16\xaf\x5e\x23\x82\x97\x53\x21\xab\x12\xe7\x21\x59\x7c\xcd\xd5\x6b\x74\x79\x7f\x2e\x83\xb1\x34\x60\x92\xf4\xf7\xea\x26\x82\xb7\x2a\x42\xb4\x2c\x00\x22\x77\xc4\x3c\xa0\x67\x1e\xc3\x29\x7e\x78\xfe\xb6\x10\xc5\x01\x82\x20\x7c\x63\x80\x0c\xef\x8d\x11\xa2\xab\xff\x30\x54\xbf\x0a\x4f\x40\xf8\x7e\x58\xf9\x6b\x2b\x65\x92\x67\x14\x6f\xf0\x46\xfe\x70\x50\x23\x7d\x23\x58\xac\xff\x90\x3c\x1f\x57\x69\x17\x3e\xdd\x00\xa5\x11\x49\x14\x75\x0b\x98\xb1\xbc\x41\x42\x6d\x8f\xf6\xef\x3e\xae\xba\x2e\x6e\x3a\x82\x95\x3e\xf2\xa2\x63\xea\x3f\xbc\xf4\x91\x0a\x90\x50\xcc\xa3\x26\xcf\xc7\x55\xda\x81\x4d\xe7\x55\x27\xe6\x3e\x92\x81\x8c\x1f\x8e\x90\x42\x0e\xad\xd4\xbc\xfb\x08\xc9\xef\x9f\x26\xf9\x5f\x53\x62\x1e\x17\x37\x98\x29\x65\x94\xa4\x63\x86\xc5\x82\xd0\x82\xa2\xcb\xf1\x94\xf0\xe0\x53\xa5\x09\x44\xfb\x78\xf8\x83\x94\x7d\xcc\x26\xe1\xc0\x89\xc1\xb8\x4a\x20\xf0\xe8\xe0\x5d\xe4\xc9\xcb\xbb\x4a\x1f\x8f\x98\x07\x5b\xd2\xe0\xed\xb4\x76\xb4\xb0\x4b\x0b\xb1\xe2\x05\x59\xdb\x23\xcd\x50\x75\x33\xa8\x10\x1d\xf4\x94\xdc\xe0\x6d\xa5\xc5\x10\x38\x4e\x28\x0d\x57\x82\x00\x64\xa5\xdd\xfc\x23\x0d\x03\xfb\x0c\x16\x82\xff\x5c\x9c\x65\x21\x60\x05\xda\x8a\x31\x76\xc7\x43\x1e\xc1\xf3\xde\x04\xa7\x3c\xa6\x91\x57\xa5\x98\x91\x68\xad\xeb\x49\x6d\xcf\x5b\x15\x9c\xa2\x20\x1a\x1a\x37\x23\x02\x9a\x60\xd7\x3c\x49\xc4\xab\x5f\xba\x7b\x02\x7b\xfc\xcd\xac\x77\xfd\x44\xd9\xc2\x3c\x2e\x5d\x2f\x2b\xd7\x35\xc1\x34\xe3\x65\xf1\xa1\x57\xdc\x82\xcf\xa9\xd4\x44\x56\x12\x02\x24\x5e\xf9\x04\x13\xa0\x98\xd0\x81\xe7\x0a\xaf\x0b\xf7\xf4\xe0\x8b\x23\x7a\x42\x63\x66\xef\x27\x68\x07\x51\xa4\x38\x7b\xf6\x20\x3c\x78\x41\x7e\x9a\x20\x19\x95\xbd\xa0\x86\xea\x7d\x46\xd4\x34\xa6\x1e\xcf\x22\x56\x0e\x92\xd3\x49\x5c\xbf\x8e\x64\x16\xef\x93\xc3\x38\x5e\x75\x14\x97\x87\xac\x5e\x59\xd0\xf1\xb2\x07\x31\x8e\x1d\xef\x60\x5c\xc7\x54\x1c\x55\x98\xd9\x81\xc7\x4a\x98\xa0\x3f\xf6\x70\x10\x4c\x63\xd6\x53\x5d\x51\xe1\xd2\x1c\x38\x95\x50\x3a\xfe\x10\x0a\xd6\xad\x8a\x20\x9e\x26\xcd\xab\xc0\x2a\x7f\xc4\x7b\x0d\x9e\xc6\x72\x76\xe3\x1b\xf2\x17\xaa\xd3\x0b\x01\xc3\x4f\x4b\x71\x7b\xea\x6b\x8b\xa2\xf7\x19\x45\x60\xfc\x11\x3b\x20\x51\x32\xfc\x04\x59\xfe\xb9\x5c\xd7\xd8\xf2\x9e\xca\xee\x0f\x12\x08\x59\xe9\xa5\x20\x17\x88\x71\x99\xf2\xb5\xc3\x20\x8f\x7c\x8c\x4f\x8e\x7a\xf6\xe0\xad\x17\x42\x66\x00\x1b\x26\x68\xc1\xdd\xfb\xa5\x67\x39\x48\x72\xae\xdf\x92\x07\xbc\x61\x5d\x36\xdc\x6b\xb0\x71\xdc\xf7\x5c\x2c\x54\xa7\x90\x93\x4d\x37\x1e\x6b\x93\x11\x90\x4d\x57\x8a\x55\x12\x35\xe7\x08\xac\x2c\x13\x37\x83\x9c\x34\x75\x86\xdc\x56\x33\x16\x9f\x2f\x49\xea\xd6\xd4\x9f\x3f\xc5\x8e\xfb\x41\xc3\xaa\xd3\x67\xbe\x11\x1b\xa9\x60\xc6\x8e\x9b\xe2\x9a\xf6\x60\x4d\x1d\x0a\x13\xc2\x7b\x84\x34\x00\xb8\xe7\xe1\x0e\x0f\x3c\x37\x40\xee\xc0\xff\x04\xc5\xf5\x2f\xb8\x19\x6b\x67\x66\x59\xdc\xeb\x70\x98\x87\xbf\x54\x69\x82\x6e\x16\xa0\xe8\xae\x77\x5c\x74\x5a\xd2\xd1\xc7\x03\x27\x5c\xe6\x60\x52\x82\x44\x89\x39\x69\x16\x2d\x94\x2d\xee\xa9\x66\x3a\xe6\xc0\x50\xbe\x89\x06\xf5\xa0\xd4\x10\x95\x78\x80\xf2\xb0\xd4\x7e\xb0\xf7\xee\x6e\x40\xea\x4f\x9e\x1f\x0c\x90\x88\xb7\xe4\x64\x8f\x54\xf3\x6c\xfb\x6f\x1a\x56\xa1\x0c\x4d\xf0\x7c\xe5\x9b\x41\x3c\x43\x9e\xb0\x86\x96\x3a\x0c\x0f\x29\x3e\xc2\x82\x7d\x10\x31\x91\xc5\x42\x3c\x67\x0d\xee\xb0\x06\xb1\x42\xa5\xa8\x9a\x3b\x73\x2d\xbe\x81\x72\xa0\x37\xa6\x42\x64\x42\xd1\x0a\x05\x39\x91\x54\x11\x02\x4e\x29\x48\xd0\x81\xee\x49\x49\x11\x74\x17\xca\x9d\x64\xa7\xc9\xda\x60\xec\xe6\x92\x63\x02\x4b\x95\xb8\x34\x33\xa7\x1f\x82\xd9\x6b\x0f\x14\xe5\xaa\x6e\xae\xc5\x08\xdb\x4a\xab\x78\x1b\x96\xb4\x78\x15\x52\x2c\x0d\x78\xd6\xe3\xda\x55\x89\x45\xe4\x58\x3c\xc9\x25\xc9\x8f\x1d\xc4\x6c\x37\xc3\x62\xde\x14\x13\x27\x87\x99\xb2\x6d\x6e\x8f\xb2\x35\x02\xa1\x06\x27\xe1\x0a\xea\x24\xbf\x00\xeb\xe4\x84\x78\x9e\xbd\x10\x3d\x82\x17\x9f\xce\x28\x98\xdb\x1a\x33\x0c\x3e\x0b\xe3\xbd\x28\x28\xa2\x5c\x82\x97\xa6\x80\x28\x9e\xd5\x71\xaf\xae\xc5\x50\x5b\x5f\xf0\x4e\xa0\x4e\x9b\x77\x36\x88\x8f\x62\x85\x60\x02\x24\x2a\x99\xf0\xcd\xa9\x95\x58\x97\x1a\xb0\x61\x4c\x09\x50\x49\x52\xbf\xf1\xd9\x95\x75\x29\x88\xe5\x36\x63\x27\xb9\xfd\x67\x82\x5e\x93\x27\x1b\xed\x4f\xc1\xb2\x3f\x65\xf4\x15\x82\x13\x03\x56\x2c\x79\xd5\x95\x03\xe7\xbd\xd7\x99\x21\x6d\xc6\x64\x99\xf0\x39\x6d\x44\x30\x04\xcf\x55\x42\x88\x15\x24\xd4\x24\xb2\x13\xa7\x88\xbc\xd3\x17\x9f\x73\x17\x2a\x51\xa3\x1c\xd8\x50\x36\x7a\x91\x69\x9b\x45\x82\xeb\x2f\x20\xff\x75\x5a\xd4\xe7\xa6\xd1\xcb\x91\xfd\x98\xbc\xdc\x6b\xfb\xce\x7a\x8f\x10\xcc\xd3\x9c\x5c\xfc\x7e\xb1\xe9\x29\x49\x51\x0c\x1c\x02\x44\x9f\x31\xf8\x99\x9f\xb5\x05\x8b\x9a\xf7\xa5\xa4\x93\xf8\xe9\x05\x30\x34\x65\xe1\xcf\xb4\x4a\x7d\x0e\xe6\xf1\x92\x93\xc2\x43\xc6\xae\x10\x78\x81\xf4\x13\x42\x70\x58\x69\x48\xac\x6d\xca\x09\x0e\x89\x8f\xa3\x85\xf6\x44\x5e\x2c\xcc\x30\x31\xf1\xad\xbc\x69\x8d\xf0\x65\x84\x24\x0e\x80\x80\x78\x63\x39\x1c\xc4\x7a\x7c\x20\xfa\x31\xa1\xcc\x62\x49\xeb\x21\x12\x18\xfe\xa5\xc6\x92\xa2\xac\xd7\xb1\x5d\xb0\xe5\xa4\x5b\x89\x64\x31\x72\x00\x62\xf6\xbe\xd3\x58\xbb\x17\x4a\xe4\x03\x13\xb8\x47\xe5\x90\x55\xa5\x8f\x41\x33\xab\x8e\x87\x2c\x8e\xe2\x7c\xec\xb8\xee\x09\x12\x98\x0a\x8a\x08\x18\x2e\x83\x4c\x0a\xca\xae\x8e\x02\x27\x6e\xf3\x5f\x72\xfc\x35\xce\x11\x5e\xf6\x58\xea\x56\x1c\x61\x0b\x70\xcb\x78\x00\x09\x82\x72\x86\xce\x12\xab\xff\x42\x73\x7b\x91\x77\x52\x5d\x5d\x4a\x84\x02\xab\x52\x4b\x5f\x1e\x3c\xe7\x7f\xc7\x94\x03\x2c\xb4\x1c\xd8\x70\xc7\x53\x34\xab\xe1\x52\x1a\xc1\x3d\x7d\x31\x8d\x0f\x58\x1a\x3e\xa0\x42\x1d\x2c\xa5\x86\xc7\xfb\x89\x8b\xdd\x63\x2a\x44\x7f\x21\x95\x43\xd5\xf3\x94\x3e\x5c\xe4\x64\x19\x45\x6e\xfd\x13\x97\xb9\x87\x0f\x63\x0e\x17\xd1\x70\xbe\xf2\xfd\x81\x82\x25\xd1\x37\x1f\xf4\x44\xcc\xfa\xe1\x84\xf7\xd4\x69\xec\x79\xaa\xf8\x76\x49\xe0\x45\x17\xa9\xac\x4d\xb8\xe3\xde\xdf\x57\x0c\x40\x97\x62\xbe\x70\xb0\xd5\xa6\x00\xd6\x8f\x23\x58\xab\x62\x03\x73\x5f\xb0\x36\xec\x82\xb2\x87\x7b\xb7\x04\x34\x09\x87\xdb\x7e\x23\x07\x02\xc7\x5e\xcc\x7a\x57\x8d\xa2\x1d\x17\xcb\x00\x2e\x94\xc3\x1b\x4a\xee\x92\x76\x40\x13\x83\x07\xcd\x94\xad\x9b\xcf\xdf\x79\xde\x9b\xf9\xfd\x06\xcd\x65\x3c\x4d\xe2\x0d\xda\x0d\xcf\x77\x89\xe3\x18\x43\xe9\x40\x2e\xcd\xea\x6c\xbc\x13\xb2\xb2\x89\xcb\x9d\xc3\x28\x7b\xb5\x3a\x3b\xb9\xf1\xb0\xdc\x26\xdb\xf3\xf5\xd2\x1a\x6f\xc6\x40\xe4\xfd\x4e\x02\xeb\x4a\x07\xc4\x8d\x6a\xa1\x24\xa0\x88\x9a\x65\xc4\x00\xf0\x46\x83\xec\xf0\xf1\x79\x82\xa3\xae\x37\x41\x58\x3a\x5e\x10\x2c\xeb\x3f\xb6\x63\xeb\x28\x17\x4d\x69\x22\xf9\x9e\x27\x27\x30\x89\x37\x40\x01\x0e\x73\x31\x33\x94\x6b\x94\x30\x16\x91\x2a\x49\xcb\x4a\x4d\xce\xe7\x49\x0c\x14\xa0\x45\x2a\xbb\x5b\x39\xf9\x7b\xdc\xdb\xca\xe5\x5c\x57\x37\x5c\x93\xa0\xf0\xf0\xb0\x32\xb7\x88\xa3\x79\x0b\xcf\xe6\x59\x2d\xb4\xcc\x09\xdc\xea\x7b\x2f\xe8\x31\xfd\x33\x93\xfa\xc8\x06\x03\xc4\x09\xaf\xb4\x4d\x5c\x16\xac\x0f\xd3\xe2\x32\x7b\xa9\x9b\xc7\xdf\x27\x20\x7f\x64\x07\xc8\x9a\x4b\x5c\x7a\xb0\xb6\xf4\x39\x30\x4d\x6c\x14\x29\x2f\xca\xe9\x92\xc0\xbb\x7d\x2c\x98\x7c\x33\x18\x27\xe4\xa1\x48\x03\x80\x12\x54\xf5\xe9\x0e\x97\x22\xff\xd6\xcb\x57\xe1\x21\x2d\xe9\xa0\x90\xa7\x08\xd5\xc1\xbd\xed\xf7\xd5\xc3\xf1\xde\x9b\xe8\x41\xe3\xfa\x6c\xb1\x8d\xc1\x42\x89\x05\xd2\xe0\xa9\x8e\x60\x8d\xe6\xd9\x37\x90\x2d\x18\x27\x69\x20\x54\xe9\x9e\x8e\x3c\x1b\x46\xf5\x23\xbb\x3c\x00\xe9\x34\x33\x2a\xae\x5e\xa3\xa9\xa5\xc6\xd8\xf3\xae\xc3\x77\xec\x1a\x42\x8e\xc1\xde\xbb\xa7\xd3\x1e\xac\x51\x7e\x82\x4f\xf3\xd1\xee\x2f\x70\x12\x6f\x24\xc9\x49\x87\xbb\x8f\x10\x71\xe9\x20\xf0\x24\xf4\x5e\xd9\x3d\xf0\xa8\x85\xe8\x59\x4d\x1c\x5b\xd6\x55\xec\x5e\x61\xd9\x17\xf0\xcc\xd9\x7f\xea\xb9\x87\xa0\x9d\x62\x04\xe7\x27\xe8\x66\xc4\xf3\xf7\xe0\x10\x1b\xdd\xfd\x83\x47\x9a\xa2\xb3\xd2\xd0\x8e\x81\xb7\x3f\x33\xe6\x08\xdf\xbc\x3e\x76\x71\x9a\xb3\x1d\x9e\xd9\xf3\x9f\xbc\x49\x72\xcb\x30\x00\xe9\x40\x15\x78\x43\xe0\xc5\x12\x01\x5d\xb6\x8f\x2d\xda\x23\x3a\x27\xd1\xab\x4e\xd5\xb4\x0e\x01\x00\xfa\xc1\xb1\x1f\xe2\x74\x56\x36\x89\xb7\x49\x06\x4b\x27\x56\xb3\xa1\x9e\xf8\x8e\xb7\x70\x0e\xc2\xd8\xb1\xe2\xec\x1a\xed\x39\x9b\x6d\xd5\x9f\x5c\xdd\x14\x3a\x81\x2d\x59\x89\x30\xf5\x97\x12\xb9\x87\xb7\x9e\x61\x2c\xdb\x67\xd3\xd1\xbb\xe5\x4b\x9e\xec\xcf\x40\x0c\xf8\x39\xb5\x99\x0e\xda\x4c\xf9\xfe\x3f\xb0\x24\xa4\x02\x04\x69\xce\x37\xa2\x42\x62\x5d\xf5\x43\x0a\xaa\xc8\x8a\x2f\xb9\x7b\x03\xce\x0f\xa5\x03\x4a\x54\xa7\x28\xe0\x26\x92\x36\xa2\x98\x35\x8b\xa7\x2c\xef\xe6\xa0\x9d\xc6\x08\x8c\x9a\x07\x23\x2c\x4f\x83\xc3\x6f\xa2\x09\x86\x81\x94\xeb\x63\x46\x28\x9c\x0c\x41\x24\x66\xd4\xc7\x57\x57\x44\x62\x4d\x6c\x78\xe3\xc7\xb2\xce\x83\xb9\x07\x7b\xa0\x56\xd9\x23\xf8\x17\x27\x00\x1c\xb4\x4e\xf9\x84\x10\x31\x1b\xd3\x06\xb0\xd4\xda\xd3\x3a\xc1\x15\x69\x2c\x6a\x11\xec\xd3\x91\x0b\x3a\xcc\x58\x88\x59\x28\xc9\x95\x7d\x7b\xd4\x51\xe8\x20\x48\xcd\xe3\xfa\x0e\xaa\x85\x18\x14\x4b\xff\x80\xbd\xe0\xa2\xd2\xdd\x7b\x4d\xbc\x8b\x6e\x65\x9a\x58\xc8\x44\xb9\xc3\x1a\x87\x7c\xdc\x43\xed\x16\x73\x5f\xe7\x93\xb6\xfb\x87\x83\x2d\x57\x09\x16\xc8\x94\xac\x1c\x28\x49\x9a\xf6\x23\x69\x52\xac\x4c\xe7\xa4\x5e\x88\x83\x30\xab\x13\x87\x5c\xd7\x84\xc5\xc4\xda\x85\x21\xe1\x3d\xf5\x4c\xd9\xa4\x63\x06\xf0\x80\x0e\x9d\xaa\x9f\xd0\x85\x70\x8c\xfc\x5e\x30\x75\x3c\xce\x59\xc9\x14\x83\x18\xd6\xc0\x35\x78\xc1\x47\x0e\x82\x1f\xd4\x28\x17\xce\x6a\x5f\x23\x14\xbb\x9c\xd4\x02\x17\x88\xfb\x12\x01\x7d\x4e\x1a\xe1\x2d\xe8\x5f\x62\xc8\x6e\x72\x92\xa9\x93\x94\x20\x55\x3a\x10\x9c\xca\x76\x01\x0c\x4a\x1c\xfc\x84\x6c\xb4\x1f\xac\xa6\x85\x4f\xe8\x69\x3c\x94\x20\x36\x4b\x88\x68\x4a\x07\x28\x75\x37\x21\xf4\x04\xb7\x49\x62\xd8\x05\xd6\x0b\xc3\x1e\xa4\x17\x21\x65\xac\x2f\x9b\x93\xfc\xd4\xb2\xca\x26\xc1\xc2\x0c\x14\x29\x27\xf5\x5c\x15\xeb\x6f\xae\x68\xb8\x56\x89\x06\x26\x56\xe0\x31\x27\x35\x3f\x64\x43\xd3\x3e\x21\x0c\x44\xa3\x2d\x88\xa7\x82\xbc\x6b\x6f\x43\xda\x3e\x3c\x81\x14\xa9\x26\x85\x90\xa3\x75\x14\xe8\x7a\x00\x20\x50\xe3\x04\x00\xc1\xb7\x7e\x00\x4f\x73\xdc\xed\xf1\x94\x78\x4e\x41\x70\xf3\xcc\x0b\xd9\x10\xb7\xb6\x86\xd3\xc2\x36\x5a\xa6\xa3\x06\x6b\x4a\x0f\xac\x90\x77\x70\x91\x9d\x16\xc5\x88\x54\x1d\x5b\x52\xb0\x26\xb3\x87\x85\x3d\x7d\x41\x3f\xc6\x00\x82\x60\x49\x71\x5e\xa8\xcc\xbb\x59\x26\x80\x35\x07\xed\x1c\x0b\x6a\xbc\xcd\x01\x57\x31\xdf\x70\x3a\x89\xc7\xd0\x6b\x6d\xa7\xd0\x93\x37\x33\x07\x0d\x23\x31\x71\xf6\xbc\x1d\x3c\x3c\x65\x75\x72\x3f\xa7\x06\x00\xa3\x0a\x7c\x04\x67\x26\x46\xbc\xa5\x9c\x2f\x21\x74\x82\xe3\x0a\xc6\xa7\xcf\x5a\x5e\xdc\x2b\xd9\x9a\xa0\x70\x95\x16\x95\x73\xec\xf9\x3f\xbe\x51\x3f\xc5\xdf\xb5\x69\xc5\xc9\xbb\x82\x61\x4f\x04\xba\x4b\x50\xc3\x0e\x42\x47\xd6\x57\x8a\x0f\x74\x50\x93\x1a\xb4\x47\x13\x50\xd0\x06\x5c\xd3\xe0\x72\xd0\x19\xc5\x9d\x19\xf6\x1a\xbc\x15\xe0\x5d\x70\x07\x33\xe4\xc1\xf3\x9c\xc3\x55\xcf\x66\x37\x15\xf2\xe0\xd3\xc9\xab\xde\x83\xe7\x39\x07\xab\x06\x41\x94\x8b\x44\xf2\xbc\x23\x4d\xf6\x5e\x63\x5f\x4d\xb8\xc7\x09\xd1\x8c\xe9\x65\xc6\x54\x40\x36\xbf\xc0\x7d\x0c\x4f\x85\xb1\xc4\x24\x48\x74\x92\xd6\x32\x55\x2e\x9c\x81\x98\xe8\x6d\x20\x61\x0d\x96\x75\x9a\x7b\x07\x1e\x97\x01\x10\xef\x65\xd7\x38\x50\x38\xb8\x45\x43\x9d\x83\x64\xb7\xba\x57\x3b\xf6\xad\xbe\xba\xc9\xb1\x9a\x8d\x9f\xb0\x42\x66\x67\x64\x80\x7c\xd6\x42\xd2\xc1\xb2\x0c\x89\xf7\x3b\xf1\xd4\xcb\xe4\x70\xe0\x7c\x54\xeb\xe1\x0f\xab\xe0\xb2\x47\x13\x9b\xa2\x36\xce\x39\xaa\xa0\xc3\x38\xff\xaa\xef\x31\x9a\x3c\xb5\x8b\x55\xda\x47\x4b\x2f\x94\x53\x6e\xbc\x07\xd7\xcf\x99\x59\xd4\x7e\x94\x9a\x4d\x12\x16\x32\x8d\xc9\x81\x15\x04\xc0\xc6\x90\x54\x65\x48\xec\x04\x2e\x94\x96\x07\xcd\x66\xfb\xd8\x7c\x7c\x6e\xb2\xf9\xd0\x8c\x12\x50\x5f\x13\x10\x3a\xbb\x4e\xe8\x55\xcc\x71\xae\xa3\xe7\xc9\x9b\xb0\x4e\xf3\xbb\x24\x27\xd3\x28\x27\xf0\x2e\xd6\x69\x33\xe1\x5c\x00\xff\x1c\x38\xaf\xfd\x24\x21\x40\xdb\xaa\x86\x7b\x57\x2b\x2f\x8f\x9f\xa5\x1a\x1e\xd3\xa5\x85\xf5\x11\x6c\x98\x50\xbc\xa7\xa5\x05\x0c\xf7\x11\x4c\x10\xbd\xd7\x80\x0d\xb5\xea\x7b\x60\x61\x54\x0c\x27\x94\x98\x44\x1c\x68\xde\xd4\x85\xd5\x6d\x94\x6f\xc0\x70\x38\x17\x6c\x18\x84\x38\xaa\x1b\xf6\x0c\xfd\x5a\x3a\xd9\x8d\xe8\xe2\x21\xfa\xbc\x12\x27\x08\x46\xbc\xe3\xbd\xc8\xa0\x27\x2d\xbf\x7b\xf9\x95\xc7\x25\xb6\x83\x12\x9e\x21\xb6\x0e\x97\x4f\x56\xf8\xfa\x60\xaf\x0f\xec\x55\xfa\x97\x13\x82\x2c\x54\xf4\x23\xb1\xd5\x3b\xa1\x5a\xc6\xd1\xd8\x88\x4d\x52\x4e\xdb\x29\x18\x3d\x8b\xb9\x0e\xca\xae\x96\xb0\x19\x46\x54\xc7\x98\x93\xfa\x39\x4f\x27\x33\x33\xc5\xd5\x8d\xb8\x83\x60\xe0\x4d\x51\x38\xc6\x17\x76\x79\xaa\xfe\x60\x86\x72\xe8\xf7\xe5\x7c\xb7\xde\xbc\x7f\xf8\x24\xde\x64\x64\x0a\xd3\xe7\x32\x28\xfc\xb4\x36\x62\x09\xb3\x08\xd4\x37\x8b\xf6\x56\x43\x08\x53\x34\x12\x28\xd9\x4e\xb0\x98\xd9\x7d\x70\xba\xec\x1f\x10\x35\x56\xda\xea\xfe\x1d\x61\x74\x40\x3d\x3c\x26\x03\xc1\xcc\xfa\xa6\xd5\x99\xc7\xf1\x43\x23\x16\x07\x82\xbe\xed\xc7\xd5\x6b\xaf\x5c\x45\x4a\x5c\xb2\xed\xc4\xe7\x4d\x67\x31\xb1\xf9\xf0\x3a\x76\x0b\x92\x9e\x90\x11\xc0\xf3\x02\x4c\xb8\x77\xd0\xb7\xea\x02\xe7\x21\x1a\xc1\xe5\x2f\x1e\xc6\xc5\x79\x54\xb2\x36\x1c\x5e\x3b\x91\x06\x48\xfb\xd5\x39\x3e\x0b\x40\xf0\x40\xae\xd5\x0b\x3f\x7e\x7c\xd1\xe6\x81\xa2\xdd\xc7\x17\x7d\xb0\x51\xc7\x94\x29\x12\xbb\x65\x77\xa1\x41\x9f\xb1\x41\x1f\x94\x4d\xf6\xe3\xcb\xf6\x07\xa2\xca\x9c\xad\xdd\xe1\x81\xb2\xcf\xd1\xee\x78\x50\x76\x38\x5b\xbb\xd3\x03\x65\x9f\xa3\xdd\x58\x74\x57\x9c\xae\xfe\x99\xef\xd9\xac\x22\x39\x75\x30\xb3\x04\x0e\xfb\x72\xc9\x34\x40\x20\x45\x68\xe5\x52\xe1\x25\xd6\x56\x40\x96\x06\x74\x82\x64\x61\xe5\xb4\xaf\x42\xd6\x15\x5f\xbd\x46\xab\x28\x4d\xfc\x8c\xc2\x32\xb2\x46\x66\xf9\x6f\xb3\xff\x1b\x13\xff\x2d\x3e\x5d\xc5\x8c\xfc\x92\xf8\x85\x97\x1f\x05\xff\xb0\xca\x0b\x5e\xcb\xfe\x8d\xed\xbe\x89\xdd\x37\x31\xbf\x39\x7d\x3d\xcd\x72\x7f\x7d\x73\xb3\xd8\xcc\x17\x22\xfc\xb7\xaf\xfe\x3e\x2f\xab\xf9\x5d\x55\xee\xd6\x9b\x97\x1d\xe3\xb7\xf6\xa1\xba\x78\xb7\x7a\xfb\xf6\xbd\xfe\xbe\xbc\xfd\xeb\x45\x27\xc7\xb7\xfc\xf4\x9b\xf2\xf6\xaf\xea\x62\x5b\x87\x03\xd7\xdf\x97\x6f\xbb\x59\x9a\x30\xe1\xdf\x94\x6f\x3b\x99\xe6\xe5\x66\x77\x2c\xd7\x65\xb9\xd9\xa9\x1f\x24\xc8\xd6\xcb\x61\xd4\x2d\xb5\xdd\xad\x37\x8b\x97\x83\x58\x3f\x6a\x71\xb7\x59\xbf\xec\x07\x98\x50\xd7\x02\x2d\xf2\x72\x88\x35\xa2\xde\x2d\xb6\xdd\xbc\xdf\x2e\xb6\x6b\x75\x31\x17\x18\x65\x6e\xd2\x75\xb7\x49\x7b\x74\x65\xc5\xdd\x7e\xd9\x47\xcf\x55\x17\xb9\x0e\xfd\xfd\xaa\xaa\x2e\x0e\x6a\xfa\x66\x55\x55\xea\x62\xa1\xe7\xcb\xc5\xbc\x47\xb1\x8c\x36\xa0\xde\xad\xef\x6e\xaf\x5f\x0e\xbc\x62\xd5\xe6\xee\xdd\xa2\xdb\x41\xf1\x1f\x54\x3f\xac\x6f\x5f\xf6\x5c\xa8\xd4\xfb\x45\xf7\xc9\x7f\x2e\x6e\xd5\xf7\xd9\xba\xf9\xe5\x81\xbd\xb3\xda\xdc\x7d\x5f\xf5\xcb\xfc\xbe\x5a\xa8\x0b\x7e\x37\x1c\xaa\xda\xd8\x51\x5d\x2c\xea\x5d\x89\x7e\xbb\x59\xdf\xbd\xeb\x35\xbf\x7b\x6f\xa0\x9a\x7c\x47\x32\xa8\x37\x59\xa3\x78\x79\xa0\x63\xfc\x43\xfd\xe1\xfb\xff\x59\xcc\x77\x70\xbd\x78\xb3\xba\x5d\x7c\xbb\x59\xbf\x5b\x6c\x76\xef\x7f\x33\x64\x4a\x75\xb1\x2d\xef\x57\xb7\x6f\xb7\x17\x6a\x01\xd7\x8b\xed\x7c\xb3\x7a\xb7\x5b\x6f\x2e\xd7\xb7\x6f\x56\x6f\x0f\x72\xff\x57\x97\x43\xff\xfb\xab\xaf\xd4\xc5\xdd\x6d\xae\xe0\xfa\xe2\xd7\xaf\x76\xef\xdf\x2d\xd6\x6f\x46\x3f\xac\x6e\xaf\xd7\x3f\xfc\xcb\xbf\xe4\xff\xc2\xb2\xdc\xfe\xe1\x87\xdb\xb6\x01\x17\x97\x55\xb9\x59\xed\xde\xb3\xfa\xb3\xbd\xf8\xaa\xcd\xd6\x7d\x0c\xe5\xf5\xf5\x41\xdd\x5f\xfd\x43\x5d\xc0\x8b\x77\x9b\x35\x77\x6b\xfb\x62\xc5\x19\x5f\x6c\x37\xf3\x17\x5b\x79\xfd\x62\xbe\xde\x2c\x74\xfe\x1b\x76\xdb\x8b\x97\xbf\x7a\xf1\xf5\xaf\xbf\x7e\xf2\x3f\xbf\xfe\xfa\xcf\xbf\x1a\x8d\xf8\xc3\xd1\xe9\x95\x8d\xf8\xc3\x5f\x8d\x46\x7f\x7e\x7a\x7d\x2f\xb8\x99\xa3\xdb\xf5\x68\xbb\x2b\x77\xab\xf9\x68\xf1\xe3\xbb\xf5\x66\xb7\x1d\xbd\x61\x56\x1d\x7d\xfd\xe2\xcd\xdd\xed\x7c\xb7\x5a\xdf\xfe\xa6\x52\xa5\xda\x7d\xf5\xf7\x8b\xbb\xed\x62\xb4\xdd\x6d\x56\xf3\xdd\xc5\x6f\x1f\x18\x62\x75\xf1\x97\xbf\x2c\xb6\xaf\xd7\xd7\x77\xd5\xe2\x42\xfd\xfd\xbe\xac\xee\x16\x2f\x7f\x5d\xfc\x23\x8b\xa4\x4d\x23\x8e\xf6\x3c\x33\xde\x6c\xd6\x3f\xbc\xea\x4e\xf9\xc5\xbb\xdf\xaf\x37\x3f\x94\x9b\x6b\xea\x3c\xfe\xdd\xfb\xc5\x64\x75\xbd\xe8\x3f\xe9\xfe\xba\x5f\xdc\xee\x5e\xf5\x24\xdb\xe2\xf6\xba\xdc\x74\x6b\xba\x7d\x5b\x2d\xfe\x75\x2d\x37\xbf\xfb\xa7\xb3\xd5\xe2\x87\xcb\x75\x75\x77\x73\xdb\x6d\xd5\x77\x8b\x72\x33\x5f\x76\xb3\xdd\x7c\x73\xf7\xb6\xf3\xfb\xf7\xab\x6a\xb7\xd8\xfc\xdb\x66\x75\x7d\x29\x5b\xa1\xa3\xaf\xba\xed\x93\x83\xcb\xd5\x76\xb6\xd8\xec\x56\xf3\xb2\x3a\xf2\x6a\xb2\xde\xac\xfe\xb6\xbe\xdd\xf5\x5e\x5e\x56\xeb\xbb\x6e\x39\xff\x7e\x53\xbe\xed\x56\xf6\xcd\xa2\xea\x66\xff\xfd\xba\xba\x5e\x6c\xfe\xf0\x6e\x71\x7b\xf0\x70\x48\x89\xce\xef\xff\xd8\xf6\x5e\x7f\x53\x6e\xba\xb4\x98\x2c\xaa\x77\xff\x7e\xfb\x66\xfd\xaa\x2b\xae\x37\xb7\xab\xdb\xb7\xdf\xed\x4a\xa6\x71\xaf\x9f\x9b\xcd\x7a\x73\xe4\xf9\x77\x77\xf3\xf9\x62\xbb\x3d\xf2\x86\x8b\x7e\xe0\xf1\x01\x69\x45\xb4\x1e\x3c\xfd\xdd\x8f\xf3\xaa\xbc\x29\x99\x55\x1f\x7b\xf7\xc7\xcd\xaa\x1c\x74\xfc\x8f\xab\x9b\x1e\x33\x66\xa0\x98\xae\xbc\xec\x8e\xf9\x64\x7d\xd3\xa3\xda\xed\x5f\x6f\xd7\x3f\xdc\x7e\xb7\x2b\x77\x77\xdb\x57\xf7\xeb\xd5\xf5\xa8\xf8\xed\x7d\xb9\x19\x2d\x5e\xed\x7e\xc3\x33\x0b\xe0\xc5\xdd\x6e\x55\x6d\x5f\xec\x65\x9b\x9e\x8b\x70\x1b\x7d\xfd\xe2\xb8\x3c\x79\x20\x3f\x0b\x95\xaf\x7e\xbb\x1b\x96\xbb\xbd\x7f\xab\x77\xe5\x5b\xfd\x76\x71\xbb\xd8\xf0\x2a\xfe\x81\x72\x0f\xf2\xe7\x72\x1f\xea\xd2\x60\xab\xf8\xc4\x10\x8c\x58\xe3\xf4\x04\x70\xf5\x41\x3d\x79\x20\x53\x87\xf5\x3b\x84\x23\x7f\xc0\x1b\xea\xc3\x48\x54\x64\x21\x28\x94\x6b\x91\x0e\xe4\x50\xa1\x49\x70\x2b\xc0\x79\x15\x80\xea\x24\xbf\x71\x39\xea\x47\x21\x71\x42\x8c\x55\x39\xad\x15\x3f\xd9\xe1\x59\xab\x3a\x7e\xec\x86\x3f\x45\x2a\x13\x18\x52\xa9\x85\x84\x51\x06\x92\xd5\x08\x81\xf2\xd1\xba\x6b\x51\x3e\x94\x05\xf4\xf9\x26\x99\x30\x27\xcd\x91\x97\x91\xd8\x15\x69\x9e\xa3\x00\xf9\xa4\x25\x12\x8b\xdc\x1a\xb8\x8c\xfa\x81\xb6\xd2\x10\x09\xd0\xdd\xdb\x6e\x64\xa2\x7c\x06\x80\x09\x30\x5c\x92\x58\x81\x62\x90\xfb\x1a\x5b\x87\xa8\xb3\xf9\x3c\x5f\xe1\xa1\x6f\x94\xb0\xee\x59\xfc\xb2\x21\x48\xbd\x94\x2a\x8d\x4e\x63\xdf\xe1\xce\xa2\x2a\xf8\xb9\x42\xd7\x07\xd2\xc8\xd6\xd6\x53\x8c\x4a\x9a\x69\xf2\x61\x7d\x84\x80\x83\x7c\x52\xc8\xa1\x9b\xdc\xf3\x99\x23\x8a\x17\x42\xf6\x4b\x33\x33\x43\x93\x38\xc3\x38\xf5\x8a\x8a\x59\x1f\xa0\x4b\xd1\x52\x0e\x5e\xfc\xcc\xd8\x65\x18\x42\x77\x25\x08\xbe\xd2\x74\x0c\x97\xe0\x59\x6e\x7c\x12\xeb\xbf\xe3\x66\x93\x01\x5d\xd2\x9e\x42\x42\xe7\x1e\x81\x32\x6d\x24\xa9\xfa\xa4\xaf\x6d\xd9\x8b\x4a\x28\xdf\x09\x37\x2a\xb5\x7c\x6c\x8b\xf7\x80\x6f\xc2\x6e\xe2\x4d\x1e\xcd\x93\xa9\x77\x18\xdc\x64\x7d\xdc\xeb\xe6\x89\x2c\x89\x11\x50\x21\xce\xb5\x81\xa4\x0a\x1d\x94\x01\xd4\x41\x85\xad\x01\x54\x81\xff\x37\x97\x37\x2a\x68\x79\xa2\xc3\x77\xbc\x6f\x14\xea\xf2\x87\x7f\x1b\xe5\x22\xc8\xcc\x35\x41\x64\xf1\xa0\x09\x48\x3b\xed\xb6\xf2\x5f\xe5\xb4\x9b\xcb\x1b\xc5\x73\x97\x94\x53\x82\x2c\x97\xc4\xbb\x2b\x7f\xfa\xb7\xf3\x71\xac\xa1\x1c\x20\x26\x4c\x33\xc4\x6a\xac\x74\x01\x5e\x23\xb8\x0a\xe5\x0e\xcc\xcf\x0b\x30\x5a\xec\x47\xc4\xaa\xd2\x6a\xfe\x8d\x20\x2e\xc9\x9c\xc1\xce\x75\x01\x4e\xfe\xc5\x9c\x93\xdf\x72\x2e\xce\xe1\xc5\x0c\x9f\xcb\xe3\x37\x5c\x78\xe2\x7e\x5f\x52\x8e\x3f\x44\x05\x58\x25\x51\x73\x82\x40\xa5\xe4\xd2\x42\x0e\xbd\xa7\x72\x99\x12\xd4\x6c\x8a\x56\xf9\x79\xdd\x0e\x31\xc9\x55\xb9\x1d\xfc\xdb\x4f\x13\x08\x26\xf6\x65\x12\x50\x28\x81\x69\x51\x4e\x90\x0a\x1d\xb8\xa9\x93\x50\xd9\xe9\x52\xf6\xd3\xf2\x3e\xc9\x35\xb2\x00\x7c\x57\x5c\x13\x81\xe3\xc2\x49\xe5\xae\x08\x22\xb8\x54\x86\xdc\x68\x19\x0e\x48\x97\x19\x19\x34\x9b\x55\x48\x38\x3d\x0f\xe6\x9e\xdb\x5c\x28\x69\x34\xbf\x16\xc0\x25\x52\x08\x6e\x2a\x37\x0d\x58\xe5\x62\x5c\x25\x5d\x61\x82\x32\x6d\xb8\xd5\x52\x21\x3f\x2c\xe4\xa3\x54\x91\x64\xb0\x73\x2e\xa8\x29\x2c\x7f\x9d\x38\x4f\x45\x42\x5b\x5b\xa1\xbc\xf7\x95\x70\x05\xa4\x79\x6e\x38\x53\x42\x1c\x14\xb8\x36\xfe\xef\x52\x9a\x96\xad\x8e\x64\x64\x5c\x0d\x92\xc2\x6d\xe2\x61\x48\x55\x33\x2e\xf5\x40\xcd\x73\x29\xa6\x6e\x15\xb7\x2e\x8f\x64\x33\xd4\xf5\x48\xab\x3c\xca\x46\xb5\xbc\x50\x33\x4b\xd5\x30\x0f\xc9\x87\xdc\xb4\xa6\x9b\x4c\x4f\x69\x1e\xbf\xbf\xe7\xa1\xbe\xe4\xc5\x90\x29\x69\x04\x93\x9b\xc7\xa5\x65\xc7\xbf\x8d\x24\xa2\x75\x62\xe6\x31\xd2\x38\x9c\x52\xe4\x91\xc2\x86\x7e\xa1\x1e\x20\xe6\x48\xa6\x03\x56\xf5\x0b\x66\xdd\xa8\x8c\x30\xa0\x22\xfe\x9e\x1b\x29\x9c\xcd\x2d\x37\x35\x8b\x81\xd5\xb9\x9b\x72\xf7\xc3\x03\xdc\xe4\x10\x27\x66\x2b\xa2\x9c\xf8\x3b\x6e\xb4\x01\x3f\x45\xf1\x92\xc8\xdf\xd7\xd3\xc0\x0a\xc3\x93\xf4\x2e\x7f\x9f\x39\xdf\x08\x11\xa3\x08\x71\x6e\x8e\x96\xe6\xe4\xa9\x24\xac\x66\xeb\x42\x42\x5d\x08\x8f\x87\xf4\x80\x4b\x72\x53\x2b\x7d\xbf\x97\xfa\x0d\xb7\xb4\xe2\xe9\xc7\xdf\xe6\xff\xc6\x7a\x72\x70\x73\x05\xc3\xb9\xaa\xcb\x9e\x06\x90\xc8\x62\x15\x57\x2c\xe1\xec\x20\x56\x75\xb3\xe6\xb9\x4a\x5b\x13\x2d\xb0\x7c\x91\x76\xe7\xf7\x34\x45\x0f\x5e\x4c\x68\xc5\x75\x5f\x19\x70\x53\x42\x16\xc4\x99\x8d\x5a\x76\x15\xad\x42\xd5\x5f\x0a\x6b\x36\x34\x16\x82\x37\xe4\xaf\x87\x63\x5e\x64\x32\xcb\xbf\xb9\x80\x3c\x5e\x85\x14\xe2\xaa\x7a\x80\x59\x72\xdb\xa7\xca\xb6\xd3\x62\xa9\x64\xd9\x2d\x73\x23\xce\x0b\x56\xa5\xd4\x83\x02\x7b\xab\x45\xa6\xf3\xff\x2e\xd1\x42\x96\xde\xf2\xa9\x85\xe6\xaf\xf8\xb7\xd1\x6b\x32\x4d\x71\x04\x51\x8b\xa8\x66\xf1\xfd\x88\x5c\xbf\x14\x39\x8e\x46\xe5\x4f\x59\x00\xd5\x85\x9c\xb3\xd7\xd4\xef\xf5\x51\x09\x8f\xba\x9e\x07\x31\x9f\x60\xf2\xe8\x8b\x3c\x2f\x64\x92\x9b\x5a\x9c\xf8\x5a\x04\x45\x11\x4f\x83\xe1\xba\x97\xb9\xf1\xcb\xe4\xfc\x92\x26\xa7\xa9\xd7\x0d\x5e\x2f\xe2\xbc\xee\x52\xd4\x99\x9c\x5e\xfe\x4b\xbc\x14\xe5\x2e\xd2\x2f\xeb\xf1\x2f\xeb\xf1\x89\xeb\xf1\x71\x01\xf5\xc8\x2e\xfd\xa4\xb0\x4a\x3d\x7c\xfa\xa3\xc0\xf7\x4f\x95\x8b\xa7\xc5\xd3\xd9\xbb\xa3\xa1\x03\xbb\xe4\xcd\xf0\x7d\x01\xf8\x8b\x68\xfb\x42\x44\x9b\xad\x77\x1f\x26\x6f\x47\x28\xcb\x27\xfb\x8b\x7c\xfa\x5f\x2f\x9f\x44\x3a\x89\x39\x78\x50\xed\x04\x7e\xba\xfa\x74\x5a\xdc\xab\xfd\x96\xff\xf1\xfd\x7a\x91\xa1\x6f\x41\x8c\xe2\x64\x64\x45\x5a\x90\xce\xdd\x31\xf5\xce\x98\x34\x2d\xf3\x3c\x1c\x9c\x1e\x7c\x48\x25\x9d\x17\x32\x53\xf3\x0e\x3c\xca\x6c\x27\xf0\x2c\x25\xa8\x1e\xfc\x58\x2b\xd7\x5e\xe5\xf9\xe5\x2e\x45\xb3\xa4\x42\x60\xf2\x3e\xea\xf4\xe0\xc4\x20\x5d\xbd\xd0\x0c\x4d\x5c\x89\x94\x05\x28\xd6\x87\x26\x79\x23\x30\x64\xe4\x58\x33\x24\x65\x0a\xca\x7f\xb9\x3f\xb4\x44\x14\xc1\xd3\xe7\x48\xa6\x26\x09\x45\x4c\x23\xb6\x6a\x5a\xc7\x4a\x3b\x08\x3a\x41\x6a\x24\x9d\xd7\x35\x23\x35\x74\xbb\xa4\x20\xa2\x20\x8a\x0b\x9b\x6a\x9a\x78\x32\x4d\x3e\x04\xd5\x2f\x4e\xaf\x0e\x42\x16\xff\x4e\x63\x89\xd9\xa5\x7e\xef\x53\xaf\x21\xf1\xf0\x19\x53\x61\x0e\xd0\x5c\x84\x52\xe0\x2c\x5a\x7b\x25\x44\x0d\x81\xa6\x62\x2d\xa8\x3c\xd0\xe0\x75\x20\xce\x32\x25\x03\xde\xe6\x08\x88\x98\xc1\x32\x5a\xb4\x0c\x31\x8d\xf4\x1a\x33\xb8\x9b\xc1\x71\xb7\x00\x89\x51\x9c\x94\x99\x64\xa7\xa6\x7e\xd9\x2e\x82\x35\x19\x95\xcd\x48\xb1\x82\xd1\xea\xcd\xbe\xd8\xa8\xb0\xd2\x22\x49\x0f\xdb\xc5\xcd\xf2\x40\x2a\x82\x4b\x07\x7d\x62\xa2\x48\x0b\x8f\x15\x2c\xd6\x6a\x41\x88\x86\x6a\xd8\x28\x6b\xc0\xc5\x7b\x03\x26\xf6\x5e\xa8\xfc\x82\xf7\x9e\x46\xe1\x21\x11\xc4\xd5\xc2\x98\xa9\x60\xa7\x8a\x7d\xf2\xe0\x73\x69\xd3\x34\x0a\xba\x45\x82\x61\xe1\xd2\x9d\xca\x64\xcc\x76\xef\x0e\x07\x92\x4b\x87\x64\x2b\x21\x56\x18\x7c\x2d\x84\x5c\x1e\x69\xb3\x8b\xdc\xa1\x4a\x06\x26\x1e\x52\x82\xd7\xc6\xa8\xb9\xd8\xec\xb4\x02\xde\x1f\xb4\x8b\xa9\x59\x11\x18\x96\xc9\xe6\xb0\x53\x5a\xd8\x8f\xbf\xd4\xe2\xf9\x73\x50\x45\x66\x40\x4a\x4c\xb9\xa0\xf1\x80\xa8\xcc\x06\x33\xe1\x8e\x3e\xe3\x74\xd8\x3b\xc7\x7f\x30\xe0\xc6\x4e\xa0\x45\x5a\xc0\x34\x51\x1d\xa3\xda\x3f\xcd\x1e\x71\xf2\xe2\x69\x67\xc3\xa7\x84\xc0\x7a\x78\xd6\x65\xe4\xb6\xbd\x95\xa4\x06\x2b\xa0\x14\xa4\x06\x31\x36\xb5\x07\x14\x47\x1d\xf1\x4c\x88\x54\xa7\xcd\x25\x83\x31\x1a\x6c\xfc\x65\x22\xfd\x32\x91\xbe\xfc\x89\x74\x6c\x37\x76\x6a\x88\xb4\xb3\xed\xc4\x9e\x10\x84\x6b\x38\x7b\x05\x7b\x44\x14\xba\x09\x11\xc4\x21\x49\x50\x80\x6b\x5c\xe9\xc0\x19\xe5\xf6\xc1\xe1\x84\x8f\xc6\x26\x03\x59\xec\x63\x22\xe4\x48\x9e\x15\x31\xdf\x19\xf0\xa4\x21\xf2\x8e\x29\x9a\x5f\x26\xf1\x2f\x93\xf8\xcc\x93\xf8\x5c\x93\x83\x1e\x57\xa7\x3f\x77\x98\xb6\xe1\x1d\xea\xb1\xc8\x46\xcf\xba\x45\x35\x3c\xdb\x29\xc8\xcc\x93\xcb\xf9\x00\x14\x06\x37\xcc\xf9\xee\x39\xa9\x34\x35\x12\xd1\x24\xf4\xf1\x15\xda\x7b\xfe\x83\x66\x66\x3b\x9b\x73\x34\x33\x49\x1d\xb1\x8a\x40\x49\xf7\xf0\x1d\x8a\xfd\xf5\xb8\xe0\xc8\x0a\x38\x5a\x82\x80\x8a\xb3\x75\xec\x78\xf9\xa7\xbc\x98\xe6\x3c\x18\xf3\x23\xf2\xfb\xe2\x70\x68\xb6\x20\x15\x4b\xad\xaa\x5f\x6b\xdf\x6a\xa1\xef\xfa\x75\xc4\xf6\xe8\x2c\x17\xde\x12\x10\x83\xca\x3a\x94\x4c\xdb\x0e\xd9\xd4\xce\xd0\x76\x5e\x64\x74\x0a\xaf\x8a\x7b\x3f\x1e\x64\xaf\x4b\x79\xc2\xc2\xf5\xf8\xdd\x75\x6d\xec\x93\x5c\x6d\xec\x63\x81\x42\x6d\xec\xf3\xd4\x33\xc3\xc7\x22\x57\x65\x30\x44\x89\x59\x91\xa3\xbb\x05\xf0\xa5\x51\x8d\x9c\x76\xe2\x50\x38\x75\x02\xe0\xc2\xb9\xc6\xed\x3b\x1e\x38\x54\xa6\x98\x08\x97\xef\xbf\x51\xc4\x9b\x3e\x0b\xd6\x5c\xdd\x68\x94\xe9\x28\xb1\x19\xf6\xb6\x19\xd1\x83\x4d\x13\xfe\xbc\xf7\x94\xb7\xb0\x36\x4e\x31\x40\x21\x88\x72\x7d\x83\x8c\xe0\x55\x51\x09\xf2\x32\x53\xc5\x76\xac\x32\x88\xf3\xf2\x5c\xb3\x47\x22\x62\x3d\x6f\x97\xfb\x49\xa9\x22\x2e\x8a\x9e\x57\x7a\x09\x0f\x23\xb1\x5f\x5a\x28\x3e\xc3\xbc\x05\x31\xf5\x5e\xa0\x42\x6d\x54\x91\x35\x29\x9f\x41\x53\x02\x49\xc8\x98\x46\x73\xe0\x65\x82\x93\x71\xf7\x4d\xa3\x50\x79\x01\x8b\x79\x78\x3a\xd5\x66\x7e\xe7\x99\x4c\x7e\x2c\xfb\x92\x06\x09\x24\x7b\xa8\xd6\x4f\xea\x99\xe2\xaf\x6e\x58\x92\x8f\x51\x42\xf8\xd4\xea\x60\xcc\xf1\x0a\xf3\x93\xa6\xe5\xa7\x8f\xe8\x49\x21\x16\xa9\x10\x6c\xdc\xce\xcc\x95\x08\x52\xfc\xef\xbd\xf6\xbd\x89\xce\xca\xc4\xe1\x44\xcf\xad\xe2\x52\xce\x33\xd1\xcd\xe1\x44\x37\x50\xd0\x53\x27\xfa\x07\x31\xce\x4f\x1b\x94\x8c\xc9\xe8\x9f\xc1\x94\x0e\x9e\xca\x93\xee\x48\xf8\x9f\xae\x3d\xea\x3f\x3b\x33\x7a\x81\x8f\x34\x10\x6c\xa5\x9d\x1e\x1a\x9f\x65\xd5\x60\x8f\x42\xee\x21\x44\xcd\xc9\x43\xfa\xc1\x59\xa4\x9e\xc2\xd8\xa1\x97\x74\xda\x77\xc8\x95\xa3\x54\xc7\xab\x1b\x6d\x21\xc8\xdd\x8e\xb0\x4a\x3e\xe8\xcc\xfb\x05\x4d\x15\x37\x53\x30\x11\xc2\x94\x55\xb8\x70\x24\x97\xa2\xca\x65\x3c\x5e\x7b\xc8\x04\x1d\x4b\xe5\x8f\xb6\x98\x6d\x27\x97\x69\xb1\x2d\xd2\x79\x2d\x66\x6b\x38\x22\x45\x66\x82\x69\x86\x47\x80\x2b\xf1\xde\x4f\xd0\x75\x03\x92\x1d\x43\xb3\x3c\xcb\x8a\xfe\x13\x73\xfd\xb9\xa4\x90\x80\x9c\x34\x9e\xed\xd2\x30\x45\xe3\x8e\x9f\xbb\x03\x89\xea\x83\xee\xea\x35\x19\x45\x5d\xdd\x02\x15\x76\x89\x5d\xc7\x4b\x98\x61\xe8\x8e\x4b\x7e\x6a\xef\xe3\x92\xba\x6a\x04\x17\x75\x94\x1b\x5b\x73\xfa\x73\x59\x70\xa7\x50\xb3\x63\x01\xd6\x7d\x02\x0b\x6e\x54\xe4\x84\x1d\x2d\xe0\x11\x86\x94\x40\xe6\xee\x43\xf8\xaa\x67\xd3\x31\x31\x2a\x63\x3b\x88\x73\x78\x80\x38\x27\x8c\x66\xac\x2c\x25\x76\x8c\x56\x09\x4e\x0e\xd6\xb1\x9c\xa3\x6a\x9e\xd4\x3c\x62\xcf\xc7\x91\xc4\x1b\xe6\xc7\x81\x23\x25\xd3\xd5\x8d\x16\x4c\x1e\x8a\x7b\xb6\xd4\x03\xb6\x0c\xc0\x7a\xa2\x89\x57\x37\x06\x7c\xc6\x1b\x13\x18\xd8\x56\xf6\xd5\xfc\x28\x00\x90\x78\xaf\x13\x90\x0c\xc3\x91\xf7\x16\xec\x3d\xd2\x52\x5a\xd7\x7f\xad\x08\xe2\x01\x93\x0e\xbd\x41\xce\xb4\x2b\x3a\x09\x25\x90\xe7\x71\x67\xc8\xf0\x60\xc8\xf2\xe0\x9e\x85\xa1\xf6\x46\xe8\x48\x80\x07\xa6\xf2\x53\x94\x10\x24\x64\x00\x5d\xa5\xbd\xee\xfa\xb1\x0b\xe0\x8c\x33\x4d\x16\x2f\xc2\xce\x80\xeb\xba\xcd\xd7\xe5\x9e\x91\xbb\x4e\x0b\x9a\x24\x20\xb7\x75\x1c\x3b\x09\xc6\x40\x8e\xb7\x3b\x39\x46\x60\xec\x2d\x9e\xa8\x78\x89\x75\xbc\xab\xe2\x64\x4a\xbe\x0e\xf7\xed\x87\x8c\x44\x47\x82\x08\xf5\xbd\x89\xce\x23\xcd\xf6\xce\x28\x85\xaf\x45\x99\x31\xe7\x55\xda\x09\x7c\xcf\x6c\x5f\xe3\xbd\x46\xea\x08\x79\xc1\xf4\xe8\xca\xf2\xe6\xab\x5f\xa4\x58\x5f\x8a\xbd\x16\x3b\x94\x08\x07\x4c\x05\x51\x48\xd8\x7f\x9c\xed\x01\xb2\x82\x1f\x81\xb5\x38\xde\xcb\xc7\x56\xbd\x97\x3b\xe7\xf1\xfe\x69\xab\x31\xc0\xa1\x77\xc2\xd0\xc5\xed\x17\xe6\x7b\x12\xf3\x39\x28\x3c\x15\x21\x4a\xc0\x88\x88\x98\xfc\xe8\x12\x1d\x78\x4a\x31\x62\x52\x05\x78\x9b\xc8\x7b\xe3\xdc\x08\x3d\x04\x2c\x52\x91\x50\x15\x50\x60\x41\x84\xc9\x24\x09\xeb\x17\xa3\xeb\x3f\xbb\xc4\x04\x85\x4b\x9c\xbb\xff\x82\x0a\x40\x5b\x20\x46\xec\x95\x4d\x05\x84\x22\x7a\x6b\x8c\xb4\x83\x1c\x21\xa5\xd1\xd4\x58\x70\x29\x7a\x6b\x25\x2e\xbd\x25\x47\xe4\x46\x97\xc6\x71\x19\x21\x58\x01\x9c\x27\x5b\xa0\x49\x61\xc4\x4f\x31\x58\x63\x9d\xa2\x04\xd6\x26\x67\x82\x19\x71\x09\x26\x10\x66\x2c\x7e\x4b\xce\x26\x6b\x46\x97\xc6\x40\x72\x3e\xa5\x20\xa8\xed\xb6\x40\xeb\xd0\x8e\x0c\x41\x2a\x9c\x0f\x12\xa6\x21\xa5\xe4\x53\xb4\x23\x23\x68\x9f\x86\x46\x53\x0b\x05\x91\x49\x86\x4c\xfd\x3e\xd8\x44\xa3\x4b\x82\x18\x6c\x91\x8a\x42\x8c\xfe\x0a\x72\xd6\xa7\x34\x42\x08\x29\x15\x14\xad\x64\xb6\x26\xb8\xe0\xcc\x08\x81\x0a\x2c\xbc\x31\x4e\x9a\xe3\x7c\x42\xf2\xa3\xcb\x02\x7c\x61\x8a\x14\xc9\xe7\xc6\x07\x4f\x36\xa5\x51\x01\x2e\x50\x08\x21\xa6\x24\x3d\x75\x68\x30\x70\xd1\x48\x3c\x66\x12\x21\x08\xc8\xca\xa8\x4d\x8f\x0d\xe5\xd5\xe8\x35\xb7\x2e\xba\x22\xf8\xc0\x45\x60\x0a\x81\xa2\x34\xda\x87\xc2\x17\xc9\x67\xd0\xfe\x58\x14\x26\xf8\x11\x31\xed\x8b\x14\xa4\x15\x85\xb5\x68\xc9\x8c\x98\x28\xd1\x3b\x17\xa4\x69\xe8\x7c\x0a\x61\x74\x69\x00\x8d\x23\x34\x72\xe5\x11\x62\x20\x67\x68\x64\xc0\x59\x72\xc6\x59\xee\x5d\x51\xa4\x94\x5c\x1a\xf1\x8f\xd1\x94\xc9\xe8\x53\x30\x56\x7e\x5e\x1a\x02\x4c\x29\x61\x92\x38\x20\x29\xa5\x18\x5d\xe4\x01\x70\x29\x92\x0d\x51\x4a\x0d\x86\xa8\x90\xa7\x11\x63\x11\x49\xf2\xda\xc2\x58\xcb\x5d\x30\x06\x0a\x13\x12\x7a\x2b\xad\x35\xc6\x07\x17\x46\xfc\xd4\xfa\xe0\x92\x58\xfe\xb9\xe0\xac\xf3\x41\x8a\xb0\x68\x5c\x4b\x05\x1b\x62\x18\x4d\x31\x42\x72\x26\x06\xee\x05\x78\x4b\x45\xc4\xe4\x46\x97\x18\x21\x98\x64\xc9\x08\xd0\x99\x23\x63\xad\xf1\x39\x8e\x65\x8a\x16\x39\x73\xcd\xd2\xb6\xe1\xfe\xce\x93\x4b\x0c\x60\x6d\xe1\x63\x1c\x66\x2c\x0c\x3a\x67\xa2\x14\x8a\xc1\xfb\x44\x3c\xa9\x22\xfa\x98\x98\x97\xc1\xf3\x57\xcc\x26\xd3\xe3\xa3\x76\xae\xfd\xb8\x95\xb8\x47\x12\x82\xa2\x80\x20\x40\x60\xae\xac\x43\x31\xb7\x11\x36\x9c\xc0\xe1\x4d\x51\x30\xa8\x38\xf3\x78\x90\x43\x59\x65\xec\x44\xa6\xc7\xf0\x63\x96\xfb\x86\x37\xf3\xae\x5e\x19\xb0\x78\xf2\xc2\x90\x20\xba\x93\x57\x06\xce\x7c\xe8\x4c\xd9\x38\x44\x3f\x88\x1f\xee\x80\x47\xde\x0d\xe3\x11\x9a\x08\x94\xe6\x59\xf9\x13\xef\x54\xab\x2c\x44\xc1\x70\x17\x1c\xc1\xad\xb6\x80\x04\x2e\x68\x2b\x20\xea\x73\x0d\x06\x35\x90\x04\x3b\x24\x8d\x1a\xac\xd1\x06\x6c\x02\xeb\xe5\xfe\x4c\x19\x30\xa4\x13\xd8\xa8\xac\x46\x94\x70\xae\x04\x18\x81\xe2\x5c\x67\x54\xd0\xe8\xb5\xc9\xb7\x16\xd1\x6a\x93\x63\xd3\xc8\x1d\x9f\x67\x7e\xb1\x49\xe7\xf8\x8a\x26\x87\x8e\x77\xe0\xfc\xd8\x81\x93\xbf\xda\x70\xe7\x4e\x19\x5b\x26\x70\x12\x84\xbb\x39\x1f\x36\x60\x9d\x86\x30\x27\x08\x49\xd7\x1f\x07\x92\x1e\x88\xaf\xad\xf6\x7d\xd4\xb1\x0e\x51\xce\x15\x30\x0e\x73\xcc\xfa\xd2\x82\x53\xb6\xbe\x94\x2e\xb4\x05\xc7\xff\x8e\xf7\x4f\x8b\x7c\xa9\xcc\x79\xaf\x6e\x0a\x1d\x4a\x31\xac\x87\x2e\x3c\x3e\x81\x1b\xef\x9f\xe6\xdb\x6a\x30\xea\x29\x40\x4f\x8f\x07\x6f\x43\x88\xa8\xd0\xcd\x33\x56\x9e\xe7\x41\x85\x48\x12\x73\x5e\xcb\x85\x79\xc6\x52\xcd\x2a\x18\xf0\x8e\x60\x0b\xc4\x8c\x29\x10\x36\xe0\x65\x40\xb1\x19\x50\x1e\x5a\xe4\x5e\x26\x81\xe6\xc2\x32\xaa\x36\x24\x3a\x10\x0f\x6a\xe4\xad\x1d\xe5\xa4\x79\x81\x4e\x83\xe7\x25\x94\x05\x4b\x0e\xde\xe7\x6a\x1b\x44\x89\x15\x83\x1e\x1c\x6d\xf3\xbd\x6d\x88\x5a\xa2\xfc\xfb\x52\xc0\x45\x4d\x83\x8a\x5b\x68\x93\x63\x3c\x18\x61\x64\x6e\xa8\x0e\x60\x03\x24\xab\xb9\x33\xaa\xeb\xd1\x0b\xbc\x6f\x79\x6a\x10\xb1\x01\x09\x3b\x50\x73\x82\x8b\xde\x35\x81\x38\x11\x0d\xee\xf1\x08\x7f\x32\xd7\xc4\x37\xbd\xbf\x41\xab\xf1\x44\x7d\x4e\xb2\x1c\xa9\x83\x29\x86\xc0\x53\xd3\x64\x6c\x77\xe7\x99\xe6\x9a\x24\x8c\x8f\x06\xe3\xb3\xb9\x20\x13\x3b\x92\x66\x62\xf1\xec\xad\xc0\x19\xce\x1c\xe6\x40\x12\xc5\x55\x59\x28\x9c\x46\x52\x56\xec\xa0\x0c\x88\x45\x04\x42\x02\xe3\x78\xa2\x06\x89\x45\xa4\x65\x86\x43\x08\x5c\x4e\xcc\xf1\x8e\x8a\xa4\x63\x3e\xa0\xee\xd1\x1a\x8d\xa2\xad\xd1\x19\x62\x4e\x8c\xa4\xa8\x84\x18\x5b\xb0\x5e\x05\xd1\x09\x6a\x12\xef\xc0\x24\xa9\x2f\xb2\x84\xc1\x02\xce\xb5\xb8\xb9\x6b\x2b\xf1\x2d\x88\x85\x04\x4f\x1f\xcc\xa8\x8d\x12\xe7\xa8\x8d\xc8\xa5\x24\x8e\xa0\x51\x7b\xd4\x49\xe6\x0a\x88\x66\x59\x94\xbc\x6d\x55\xb1\x2b\x28\x8a\xa4\xc1\xd3\x5c\xc4\x0d\x0b\xba\x6c\xfe\xe1\x05\x0f\x57\x3b\x09\x72\xb4\x17\x13\xfb\xe1\x78\x36\xf6\xbd\x00\x58\x9c\xc3\xdb\x9d\x14\xa5\x89\x1d\x84\xe8\x35\x74\x18\xfa\xf6\x6c\xbe\xbf\x0a\x3f\x4f\x85\xa6\xad\x30\x4d\xba\x77\x93\x56\x85\xa3\xf5\xf5\xe8\x2b\x78\x21\x0f\x87\x14\x50\x18\x5a\x24\xd3\x42\x77\x91\x4c\xf3\x01\x6a\x90\x85\xd8\xb5\x00\xa6\xa8\xbb\x00\xa6\xb2\xf0\x9e\x6d\x89\x60\x6d\x38\x30\x53\x99\x50\xca\xd1\x7e\x3e\xe0\x6f\x4e\x0d\x05\x0a\xbb\x18\xef\xdd\xd5\x9d\x9c\x65\xd8\x99\xc1\xbe\x77\xfb\x84\xd2\xc0\xa9\x5d\xf2\x75\xbe\xec\xd4\x24\x71\xa5\x0d\x4e\x82\x64\x32\x25\x0a\x58\x37\xb6\x90\xdd\x2c\x6f\x55\xb1\x2c\xce\xb5\xb8\xfc\x1c\x3b\x79\xb2\x5f\xd0\xa3\x01\x51\x5b\x4e\x13\xbd\x31\x07\x24\xf4\x4b\x0d\x44\x07\xd6\x67\x54\x28\xb4\xe0\xf7\x5c\xc7\x52\xdb\xea\x08\x96\x2a\x41\x3e\xf7\xe3\x96\x69\x6b\x36\x7d\x46\xcb\xe9\xa4\x96\xff\x04\x86\x43\xa3\xf3\x79\x12\xfc\xb3\x31\xe2\x49\xee\xca\xa7\xb3\x21\x13\x5d\xbb\x8c\x3b\x63\xe5\xdf\x66\x0f\x42\x56\x7b\xf0\xe9\x80\xcf\x9e\x2d\x0e\x4f\x74\x3a\x7e\x4c\xa7\x1a\xda\x94\x3e\xc4\x27\x4f\x76\x1d\x7c\x94\x4b\xbc\x40\xd5\x38\x3a\xc6\x25\x75\xb8\x62\x64\x55\x0b\x9b\xf0\x65\x85\xe8\x35\x28\xd6\x0d\xe2\x04\xd5\x12\xdb\x29\x63\x96\x64\x06\xcf\x8d\x9c\xb5\xb8\x7b\x2d\x1f\x74\x0b\x52\x9d\xea\x3f\x22\x42\x74\x17\x01\xb9\x09\x44\x50\x08\x0d\x4f\x0c\x3c\xf0\x21\x89\xfe\x25\x93\xe8\x44\x63\xe2\x73\x89\xee\xc6\x70\x98\x37\x21\xda\xf1\xb6\xf2\x03\x92\xfa\x74\xa3\xce\x2f\x5b\x4a\x7f\xa8\x1f\xcf\x92\xd0\x5f\x36\x63\x9d\xe0\x61\xf2\x29\x45\xf1\xd3\x1a\x75\x1e\x19\xfb\x81\x4a\x1e\x94\xaf\x3d\x9d\x7c\x7c\x2e\xf3\x52\x4a\xe0\x24\x06\xb3\xcb\x97\x40\x05\xc8\x46\x2d\xe6\x47\x25\x8a\x53\xe3\x3e\x18\xbf\x75\x8a\xc0\x78\xb1\x91\x75\x60\x53\x95\x78\x1f\x9c\xc0\xa4\x23\x59\xc5\x09\xee\x60\x3b\x51\xe3\x13\x9e\x63\xc3\x56\xa8\x34\x41\x0f\x96\xa6\x68\x01\x25\x64\x32\x75\xb4\x06\xe4\x2d\xa8\x72\x13\xdf\x79\x66\x55\x98\xf5\xd5\x0d\x45\x13\x53\x0c\x21\xac\xb0\xa7\x7c\xa8\x24\xe6\x28\xc5\xc4\xcf\xd0\x2c\x03\xf4\x15\x18\x4d\x13\x3f\x0b\x4b\xcf\xe4\x20\x09\xd7\x0b\xae\x6b\x32\x0c\x11\xc1\xe2\xc4\x14\x4f\xdd\xc9\x3d\x01\x5a\x25\x43\x8b\xb8\x99\xc0\x14\x3f\xbb\x8d\xcb\x08\x0e\xcb\x20\xde\xd7\x4d\xb4\x3c\x39\x60\xa2\x4f\x44\x66\xc3\xf2\x7f\xe0\x0f\xa6\xea\xbe\x3c\xdd\x82\xf1\x24\xfd\xe8\xa7\x45\x3c\x28\x64\xda\x7c\xec\x30\x11\x04\x33\x36\xf9\x44\xb8\x0d\x89\x53\x2f\x9b\x53\x4c\x2c\x01\x3f\xd5\xc4\x70\x70\xfa\xc5\xf0\xd3\x76\x50\x5f\x88\xc3\xc5\x79\x2c\x15\x3f\x9b\x5c\x7a\xed\x15\xe2\x9e\x65\x02\x3d\xf5\xe2\xfe\x09\x9e\x62\x35\xad\x1d\xd8\x87\x74\xb6\xcf\xc0\x7c\x9f\xb2\xc3\x3f\x63\x66\x3c\xdd\x59\x37\x4b\xd7\x71\x4f\xca\x8b\x51\x92\xf9\x64\xe3\xf6\xa8\x98\x3f\x7d\x40\x3f\xb5\x7b\xe5\x11\x35\x45\xb0\x95\xcf\xa1\xaa\x08\xda\x2b\x1a\x08\x3c\xe4\x41\xac\xcf\x5b\x2d\xd9\x40\x0c\xcc\x35\x88\x80\x72\x5b\x95\x14\xb5\xf7\x71\xac\xbd\x8a\xba\x4d\xaa\x6b\x11\x09\x68\xa7\x5e\x91\x3b\x45\xf1\xe8\x40\x77\x6a\x7a\xee\x5a\xce\xea\x33\xca\x5d\x01\x27\xf9\x8d\x44\x89\x32\xac\xda\x80\xe9\x85\x26\x12\x9f\x3f\x0b\x98\x34\xba\x1c\x0f\xd2\x2a\x49\xea\x1e\xef\xa9\x71\x25\x1a\xa8\x93\xf8\x0a\xc0\x7b\xbe\x18\x35\x1a\x88\x58\x82\xef\xc4\x7b\x93\x18\x71\x64\x79\x62\xd9\xd3\x21\x4e\x9f\xa1\x47\xfd\x74\xe3\xc4\xca\x17\x95\x43\xe7\xf8\x8f\x51\xbf\xbe\xfc\x21\xfb\x79\x2b\x73\xb2\xfe\x65\xfc\x2a\x30\xd3\xa7\x10\x65\x99\x24\x92\x14\xf8\xa0\x4c\x13\x26\x55\x16\x51\x94\x08\xc0\x06\xbc\x51\xa6\xf1\x90\x45\x0d\xe4\x75\x1d\x91\xfa\x53\x30\xde\xa7\x53\x27\x3f\x82\x03\x4b\x14\xea\x36\x2a\x46\xa1\xa0\x08\x1a\xcc\x21\xd5\xf6\xc3\xf0\x8b\x62\xfa\x21\xc5\xf4\x97\x55\xe8\x01\x91\xf6\xc9\xc0\x15\x5a\xe6\x9c\x08\x43\x8c\x4d\x76\xb9\xf6\xe9\x97\x39\xff\x79\xe7\xfc\x2f\xba\xff\x17\xa9\xdd\x18\xfc\x79\x88\x82\xcf\xba\xf7\x90\x30\x2f\x67\xb1\x68\x01\x87\x8a\x02\x44\x33\x46\x0b\x56\xc2\x46\x34\x53\x48\x8c\x6f\x52\x59\x3b\x76\xd0\x5e\xf2\x20\x18\xa7\x2d\x44\xe4\x0d\x37\xba\x31\x16\x62\xcc\x26\x69\x4d\x4e\xb1\xfa\xb4\x60\x67\x06\x90\x67\xad\x18\x5c\x9b\x0e\x04\x41\x50\xc5\xcc\xb2\x8e\x73\xf8\x71\xe0\x6f\xa5\xe4\x7b\x2b\x9e\xf2\xc3\x06\x30\x0b\xf8\xba\x71\xfd\x46\xeb\xda\x98\x29\x19\xd5\x89\x2e\xc9\x53\xcb\xdd\x63\x3f\x78\x06\x2a\x5c\x72\xc7\x87\x01\x3f\x23\xb8\xd8\x8f\xf2\xd6\x50\xe8\xea\xb5\x84\x7c\xa7\x28\x70\x00\x5e\x6e\x95\xfd\x3e\x90\x31\x81\xb5\xda\x48\x10\x7b\x5b\xa7\x75\xb1\xe0\x9d\x76\x10\x5d\x26\x57\x19\x21\x58\x25\x49\x6d\x77\x10\xc4\xf8\x4a\x3a\x5b\x1e\xff\x9c\x7b\xec\xd4\xf1\x3a\x95\x39\xaf\x8f\xb9\xb1\x40\x71\x2c\x43\x44\xfb\x08\xfd\x54\x80\x8b\xca\xd0\x04\x79\x26\x1c\xbc\x6e\xbe\xfb\x84\x3b\xaf\x2f\xa9\x69\x87\x08\xde\x1f\x3f\x8d\x4a\x2c\x20\x49\xb4\x99\xd4\x22\xa2\x49\x40\xe4\x20\x12\xd1\xe6\xa4\xd8\x5f\x58\x41\x64\x36\x8a\x29\x27\xf5\xf6\x41\x00\x49\xed\xf3\x79\x69\xc2\x3c\xfe\x11\xdc\x3d\x8e\x10\xb9\x41\xcd\x1c\x8b\x4a\x50\x9b\x22\xcb\xfd\xd8\x40\xf3\xb0\x68\x08\x82\x4f\x6a\x0f\x4e\x7d\x88\xc0\x29\x3f\x2f\xb4\x44\xc9\xd1\x60\x89\x53\x6f\x4a\xb1\x53\xce\xd6\xca\x35\x79\xc4\x16\x12\xff\xa9\x44\xcc\x59\x77\xc1\xf8\x69\xa0\xc3\x1e\x03\xd7\x8c\xe2\x0e\x81\xa6\x62\x92\x68\x90\xe9\xc0\x2b\xb0\x6d\x96\xe0\x9f\xfb\xba\x22\x1d\x03\x73\x4f\x10\x49\x22\xcd\x3f\x11\x33\xf1\xe1\x78\x3a\xa2\x61\xf0\x26\x88\xe7\x28\xed\x51\xbb\x1c\x2b\x56\xa7\x5f\x0d\x3e\x4d\xe1\xfb\x6c\x42\xf5\xf4\x9b\xf3\x4f\xc0\x49\x8f\x88\xd6\xe1\x31\xf7\x63\xd2\x47\x1c\x55\x5d\xf8\x32\xa4\xcf\xc9\x8c\xf8\x0c\xc5\xf4\x49\xe8\xef\x7d\xb8\x01\x89\x47\xf8\x60\x50\x71\x52\x76\xd2\x35\xdb\x23\xe5\x67\xfd\xdb\x00\x45\x93\x7e\x24\x29\x4d\xb3\xae\x6a\xcf\x45\x5c\xbd\xb6\xca\x14\x33\x3f\x31\x34\x33\x4f\xb1\x9a\xc5\x03\x0a\xed\xdb\x16\x85\x43\x6c\x8d\x78\xc4\x83\x68\xb4\xe9\xe1\x22\xc9\x7b\x89\xe8\x0b\x9e\x37\x08\x19\xcc\x59\x56\x81\x20\xe3\x2f\xf0\x77\xf5\x53\x7e\x2e\x9f\x24\x01\x38\x79\x72\x0c\xef\x63\x4d\x24\x31\xb8\xe7\x09\x19\x2a\xed\xc0\xf2\x6e\x46\x5b\x6d\x0f\x1d\xc9\x1d\xd7\x4c\x04\x89\xd9\xc3\x54\x1e\x42\xd2\x9c\x4c\x31\x43\x98\x0b\x76\x7e\x70\x12\x67\x6e\x82\xae\x8a\x60\x9d\xe6\x64\x2a\x73\x6a\xc6\x9b\x58\xc1\x6a\x8e\x28\x49\xd7\x20\x7f\xdf\x88\x27\x79\x72\x3c\xea\x0b\x93\xc4\x6f\xa7\x43\x7a\xd5\x25\x7d\x93\x41\x80\x5b\xbc\x2a\xca\x3e\xf1\xeb\x5f\xe3\x3e\xf1\xeb\x21\xf9\x28\x2b\xcf\x47\xda\x1c\xc0\x08\x90\x52\x08\xd5\xe7\x19\x82\x83\x1a\x3e\xca\x06\xf4\x11\x8b\x30\xd9\xe6\x12\xcf\xac\x89\x9d\xf9\x09\x4b\xc4\xe1\xb6\x5c\x01\x45\x4d\xcf\x98\xc9\x48\x60\x44\xe5\x63\x99\x6b\x1b\xa1\xdb\x54\xf9\x8c\x1e\x99\x87\x7b\xf4\x98\xc1\xd5\x53\xab\xb1\x47\x05\xe2\xa3\x44\x3c\x8f\xa0\x13\x11\x12\xdb\x99\x81\xbd\x99\x51\x4b\x98\x78\xf5\xda\x2b\x0a\x33\x66\xb6\xca\x6b\x0f\xc5\x01\xca\x52\xc1\x5c\x87\x09\x8c\x53\x91\xd5\x0c\x0a\x57\x37\xac\xc1\xcb\x59\x8e\xab\x3c\x90\xd1\x9c\x88\x44\x71\x60\x0f\xbf\x67\xa6\x64\x8e\x7c\x42\xdc\xf1\x87\x6d\x0e\x9b\x0b\x66\x1b\x95\x24\xed\xda\x1b\xe2\xb3\xe8\xd6\xb2\x95\x18\xf6\xf9\xbd\x7a\x90\xef\x8f\x7f\x1e\x44\x3c\x45\x67\x7b\x3e\x93\x3f\xeb\x28\x6a\x08\x6f\x26\xc1\x87\xcf\x61\x53\x18\x00\xad\x32\x66\x82\x05\x78\xba\x74\x72\x78\x6b\x32\x14\x22\xa6\xda\xda\xa0\xec\x02\x39\x45\x9d\x58\x58\x62\x21\xef\x25\xad\x99\xa6\xc8\xaa\x57\xe1\x59\xd1\x2a\x44\x45\x2b\x5a\x43\xff\xec\xb1\xe7\xcb\x16\xa8\xb3\x7e\xe1\x55\xbc\x34\xe2\x7d\x2e\xb6\xa9\xc6\x70\xf5\x4d\xab\xae\x5e\x63\x82\x22\x29\x71\x01\x8c\xbc\xd3\x8d\xed\x76\x57\x4b\x03\x63\x55\x28\x88\x41\x90\x20\x71\x1c\x20\xf1\xe6\x3c\xb5\x67\x85\xd2\xfc\xb9\x38\x2e\x43\x08\x2a\xe3\xea\x78\xe2\x3f\x26\x52\xc9\xa5\x29\x04\x65\x51\x22\x72\x52\x94\xd4\x82\x77\xa5\x78\xfe\x4a\x92\x6b\xe3\x55\x96\x79\xca\x4b\xa8\x99\xa8\x01\x23\x98\xc4\x7f\x9b\x71\x04\x41\x2a\xc5\xb8\xdf\x1b\xd5\x8d\xfe\x84\x87\x30\x2d\x45\x87\xc4\x2e\x14\x90\xa0\xf4\x5a\x56\x9e\x59\x11\xd6\xb2\x85\xd1\x58\x0e\xc4\xbd\xc4\xc4\x01\x67\x55\xe3\xa3\x8a\x1a\x8c\x44\xc8\xad\xb2\x61\xb1\x9c\x9f\x73\x4f\x31\x0e\x08\xc2\x8a\xb1\x09\xdc\x47\x7f\x69\x08\xc4\xf7\x5e\x99\x42\x1c\x52\x65\x07\x5d\x88\xe7\x87\x68\xe9\x73\x6d\xc4\x69\x5a\x33\xe9\xb5\x81\x84\xf9\xaf\x00\xa9\xec\x8f\x98\x04\xf0\x80\x98\x2a\x88\x5e\x83\xa8\xfd\x31\x0c\x06\x9e\xa5\x04\x26\x1d\x99\xea\x46\x49\xb2\xdf\x30\x44\x15\xca\x00\xce\xa8\xd0\x42\x5e\x67\x3f\x4f\x7e\x50\x27\xf5\xba\x29\xe0\xcc\x28\x9b\x02\xee\x65\xd1\x14\xc4\xc3\xa7\xac\x5c\x10\x14\xe2\x76\x59\xb4\xe1\x89\x59\x3e\x21\x4b\x32\xe3\x3b\x53\xa2\xd0\x51\xf1\x94\x98\x17\xe2\x40\xa9\x2c\xcf\xa1\x24\x81\x70\x3c\x2b\x9d\xc2\x69\x45\x9a\xdb\x3c\x55\x42\xf6\x13\x4e\xf9\x8f\x08\xc6\x8d\xfb\x73\xa2\x68\x27\xcb\x3f\xe3\x4d\x7c\x97\x6d\xd1\xaa\x9c\x36\x6c\xcb\xbb\xc5\xa5\x26\x1e\x71\x81\xfe\xdd\x73\xa5\xd8\x2b\xd3\x97\xc4\x96\xcc\x7f\x5e\x45\x68\x21\x7b\x88\xdb\x61\x83\xb8\xac\xc5\xf1\x50\x3e\x7e\x29\xcc\xf3\xcb\x0d\xfb\xde\x9c\xfe\x83\x02\xf4\xd1\x51\xec\xc0\x1b\x36\x66\x79\x97\xcd\xba\xe9\x04\xad\xde\xd4\xa7\x14\xc6\xe4\x51\xbc\x34\xd2\x1f\x5e\xe3\x9a\x15\xcf\xe5\xe5\xe6\xe3\x47\xf1\x69\x87\x4d\xcf\x5c\x3c\x7a\x27\xdf\x1e\xbc\xce\xe7\xa7\xcf\x92\xa0\x3f\x25\xf9\x7e\x96\xc1\x1f\x7a\x92\x33\x2b\x60\xae\x2b\x39\xc9\x2f\x75\x78\xd8\x43\x4b\x3b\x20\xfc\xf9\x31\xf4\xcf\xc7\x08\xa0\x8f\x8f\x57\x55\xab\x77\xdb\xd5\x76\xb2\xde\xac\xfe\xb6\xbe\xdd\x95\x07\x97\xc4\xdd\xfd\x02\x02\xd6\x8e\x8a\x51\x78\x88\x20\x7d\x9c\x97\xfd\x31\x1f\xc8\x67\x14\x7d\xcc\x13\xb2\x53\xb4\x95\xb2\x9e\x59\xf6\x07\x10\x45\x4e\xa7\xc9\x73\xdd\x84\x9f\x41\xa3\x33\x78\xf5\x9e\x4c\xb3\xd3\xce\x5a\x3e\xb1\x07\xf1\xf1\xd3\x96\xa1\x87\x5b\xc3\xec\xb3\xc5\x66\xb7\x9a\x3f\xca\xea\x0d\xa5\x6d\x8d\x9e\xfc\x33\xe1\xf4\xa6\xe8\xcc\x95\x67\x66\xf5\x93\x69\xf2\xf3\xe2\xf4\xd3\x69\xf6\x33\x62\xf5\xdf\xaf\xaa\xdd\x62\xf3\x6f\x9b\xd5\x79\xa0\x71\x05\x66\x21\xfa\x8a\x14\xce\xa8\xe8\xc6\x75\x29\xb4\xa0\x45\x85\x29\x6b\x4f\xb2\x4e\x91\x83\x90\x2a\x01\xef\x52\x1e\xdc\x20\x2b\xe7\x4c\x8a\x62\x53\x94\x8f\x53\x0a\x72\x4d\xcf\xeb\x96\x95\x2b\xfe\x46\x09\x13\xc0\xda\x19\x52\xf7\x20\x5b\xe3\xa4\x17\xb1\x45\xe1\xbd\x20\x06\xf7\x3e\x04\x4b\x0a\x25\xc4\x2e\x57\x70\x26\x3d\x9c\x57\xd9\x7b\xde\x8a\x97\xe0\x5a\x4f\x65\x40\x07\xc6\x55\x81\x17\xdb\xc0\x5b\x26\xd8\x07\xf6\xca\xef\x72\x18\x81\xee\x27\x82\x7e\x5b\x19\xde\xf5\x21\x58\xec\xbd\x0b\xa4\xf9\x65\xc1\x7b\x26\xfe\xca\x82\xb3\x6d\x71\x51\xe7\xba\x90\x37\x7f\xe4\x06\xed\xe0\x97\x33\x3c\x0c\x22\xb3\x67\x85\x33\xc6\x19\xf8\xdf\xc1\x10\xa7\xe1\xa5\xfe\x34\xa0\xd1\xe7\x81\x62\xfe\x6c\xed\xa2\x9f\xf7\x24\x9a\xdd\x7c\x73\xf7\x76\x38\x73\x36\x8b\xf9\x6e\xf4\xc3\xea\x7a\xb7\x7c\x75\x61\xfc\xc5\x68\xb9\x58\xbd\x5d\xee\xf2\xdf\x1b\x16\xf6\x17\xa3\x37\xab\xaa\x7a\x75\xf1\x7f\xde\xc8\x3f\x17\xa3\xf5\xbb\x72\xbe\xda\xbd\x7f\x75\xc1\x9b\xa2\x8b\xd1\x76\xf7\xbe\x5a\xbc\xba\x58\x6d\xd7\x95\x44\xa5\x79\x99\xff\x5a\x5c\xbc\xf8\xff\x77\x2e\x3f\x20\x24\x85\x16\xa2\x29\x05\x24\x51\x92\x9a\xd9\xc1\x06\x9d\xe1\xe3\xfa\x2f\xb8\xc3\x98\xad\x67\x6d\x50\x0e\xec\x1c\x4c\x82\xe8\x04\x9e\x92\xb7\x38\x62\x9a\x00\x94\xbe\x0b\x8a\x04\xe3\x2f\xc9\x0e\xc4\x57\x04\x18\x24\xd8\x45\x09\xc6\x64\xf3\x84\xec\x64\x82\x1a\x08\x0c\x0f\x46\xfb\x48\x46\xc6\x0a\x5a\xb0\xec\xf4\xf6\x1b\x3d\xd9\xd2\xe4\x28\x32\x18\x72\xd2\xbe\x08\x39\xc8\x54\x90\xe0\x70\xbd\xef\x04\x50\x49\xb6\x88\xed\xd9\x59\x1b\x83\x06\x50\x9a\x7e\x6f\xb8\x69\xdd\x52\x33\x42\xbc\x21\x55\x7c\x74\x99\xb2\x7d\xf2\xfb\x32\x91\xcb\xf4\x10\x7d\x49\xe0\x05\x88\x75\x6f\xba\x1c\xa2\xa6\x6c\x77\xcf\xfb\xcc\xbd\x8d\x87\x10\x1c\xa1\x70\x8a\x20\xd4\x49\xf3\xc6\x44\xcd\x6f\xc6\x06\x92\x51\x92\xd4\x44\x91\x68\xe2\x44\x25\x41\x24\x45\xfb\x50\xa5\x94\xb1\xff\x0a\x41\x96\x14\x68\xc9\x86\xc0\x01\x24\xae\x7f\x4c\x53\x27\xf1\x4d\x13\x78\x53\x69\xd2\x16\xe2\x90\xe9\x7a\xbc\x24\xf6\x78\xc8\xdb\x48\x19\xa0\xf6\x4c\xd3\xa0\x04\xe0\x96\x4b\x03\xee\x54\xc8\xce\x47\x5c\x47\xe1\xca\x9a\x52\xcd\xc5\x81\xce\x40\x90\x31\x2c\xb5\x18\xd8\x93\x84\x3b\xdf\xbf\x82\x18\xf6\x05\x61\xbe\x87\x10\x8c\xc9\x01\x9b\xf0\x1b\xd4\x62\x23\x2e\xd0\x87\x9c\xb4\x2f\xb8\xd0\x1a\xb8\xb2\x67\xbe\x8f\xe0\x6c\x45\xca\x01\x0f\x19\x09\x17\xef\x99\x4b\x02\x40\xa3\x18\x1c\x76\xed\x0d\x49\x43\x32\x15\xff\xd7\x64\x2b\x6d\x52\xfc\x07\x17\xc0\xed\xa1\x3d\xdb\x92\x87\x64\xc6\xc3\x82\x0d\xf1\xec\x70\x53\x23\x44\x0f\x3c\x11\x83\x9c\xf4\xb6\x87\x51\x45\xd4\x60\x99\xac\xd2\xe4\xf6\x90\xaa\xa1\xf7\xd5\xe1\xa0\xf4\xc3\x19\x2c\xca\xcd\x7c\x79\x96\x95\xd9\xf3\xa4\xe5\x51\x1b\x63\x21\xd2\x51\xd2\x2c\xdb\x05\x40\x55\x82\xe2\xf2\xff\xeb\x59\xd0\x7e\x70\x23\x0c\xe7\x4a\x9e\x25\xb5\x59\x85\xca\x7f\x37\x4f\x64\x68\x8c\xc6\x73\xda\x0f\x1b\xa7\x8c\x01\x4a\x95\x0e\x60\x82\x0e\x60\x79\xb6\x5a\xca\x37\xa0\xfc\x8c\x99\xbd\x41\x1b\x97\xa5\xac\xfe\xe2\x50\x48\xaf\x16\x3f\x5c\xae\xab\xbb\x9b\xdb\xf3\x80\x37\xa2\x72\x13\xd7\xbd\x60\x3f\xea\x9a\x3c\x40\x5b\x98\x85\xee\x17\xa8\xdc\xd5\x6b\x34\x8a\xd2\xc4\xcd\xc2\x32\x5e\xdd\x60\xa1\x8a\x09\xe6\x1f\xc3\x0e\x08\x04\xcb\xbf\xae\xef\xbe\x3f\x17\x10\x4b\x8e\x3a\xd8\x8d\x39\x17\x58\x8e\xa7\xa9\x5c\x04\x46\xa3\x82\xb8\x6c\x24\xe8\xe8\x54\xd8\x0f\x83\x28\x80\xcc\x41\x6c\xce\x03\x76\x83\xc7\xd4\x85\x9f\x33\xca\x45\x12\x54\xb6\x07\xda\x8b\xa9\x6d\xb0\x29\x1e\x69\x70\x46\x85\x0e\x72\x22\x38\x6c\xb1\x14\x7f\x18\x84\xab\xac\x16\xb7\xd7\xe5\x79\x00\x64\xc4\xab\xc5\x4f\x28\xcd\xe2\xd2\x64\x93\x98\x38\x09\x33\x3f\x31\x02\x53\x9a\xa3\x03\xb6\x28\xa8\xbc\xf6\x46\x9c\x71\x87\xd2\xc1\xcb\x6c\xed\x43\x4b\x8a\x70\xf8\xa5\x11\x28\x73\x4c\xb3\x20\xd6\x56\xc3\xb7\xb9\x19\x0f\x0c\x8e\x28\x2e\x4f\x18\x9c\x1f\x5f\x5d\xc4\x8b\x11\x6f\xc7\xed\x45\xa3\xf0\xd0\x5e\xdf\x39\xb4\x40\x7b\x7a\x2d\x46\x6a\xe1\xf2\x3f\x69\x35\x56\xaa\xa1\xe2\x13\x57\xe3\x72\x35\xfe\x13\x57\xe3\xbb\x43\x93\x3e\x55\x2d\xa1\x37\x34\x9f\xac\x9a\xd8\x1b\x9a\x4f\x56\x4d\xea\x0d\xcd\x27\xab\x06\x8b\xce\xd8\xd0\x27\xe3\x00\xc4\xee\xe0\x7c\xc2\x7a\xa8\x3b\x3a\x9f\xb0\x1e\xd3\x1d\x9e\x27\xd5\xf3\x34\x69\x6d\x6b\x75\xa9\x90\x08\x00\x3d\x6f\x0b\xd3\xb1\x5d\x4d\xca\xcc\xba\xa1\x7f\x25\xff\x39\x96\x3c\xde\xfe\xe5\x2b\xa0\x23\x0d\xe8\x9c\x67\xf0\xbe\xa6\xdb\x00\xc9\x7f\x0e\xb1\x8e\x59\x78\x30\xc1\xf3\x79\x64\x4d\x68\x66\xdc\xe7\x52\xfa\x29\xa8\x18\x3d\xa3\xd1\x4f\xbb\x42\x7e\xc8\x86\xf4\x69\xc4\x3c\xf1\xc8\xf9\xcc\x6b\xe6\x89\x67\xcf\xe7\x5e\x43\x4f\x3a\x89\x3e\xff\x9a\xfa\x58\xb5\xae\x5f\xed\x39\xd7\xd8\xc7\xaa\xf5\xc7\x86\xf6\x2c\xcb\xc7\x63\xb5\x86\xa3\x43\xfb\xc9\xab\x8d\x47\x87\xf6\x93\x57\x9b\x8e\x0e\xed\x27\xaf\x16\x8b\x23\x63\x7b\x9e\x35\xee\xd1\x6a\xf1\xd8\xe0\x7e\x86\x7a\xe9\xd8\xe8\x7e\x86\x7a\xcd\xb1\xe1\x3d\xcf\x1a\xff\x68\xbd\x76\xe0\xc1\xf6\x39\xd6\xfc\x47\x1b\xe4\x06\x56\x4e\xe2\x42\x36\x41\x33\x8b\xcb\x04\x21\x3e\xe0\xe1\x7a\x66\x57\x4f\xff\x45\xd8\x59\x76\xd0\x4c\xcc\xe7\x51\x06\x1c\x98\x87\x6e\x80\x1e\x61\xeb\x13\x11\xfb\xcf\xbe\xea\x9f\x84\xae\xff\x29\xd6\xfd\x47\x2a\xb6\x47\x3b\x7c\x26\x31\xfd\x48\xbd\xee\x78\x87\x3f\x7d\xc5\xbe\x5f\xf1\x99\xd7\xc3\x47\x2a\x0e\x83\x8a\xcf\xbb\x22\x3e\x52\x71\x3c\x36\xc4\xe7\x5a\x22\x1e\xa9\x37\x1d\x1d\xe2\xcf\x50\x31\xeb\x00\x47\xc6\xf8\x73\xd4\x8c\x47\x07\xf9\x5c\xeb\xe2\x63\x35\xd3\x40\x18\x3f\x7b\x65\xfc\xff\xbd\x5b\x57\xef\xdf\xae\x6f\x47\xef\xd6\xab\xdb\xdd\xf6\xd5\x05\x21\x50\x1a\xf9\x11\x9a\x9c\xc4\x1c\x5f\x93\xff\x9b\xdf\x9c\xb5\x1f\x0f\xa1\xd8\xff\x9c\xcd\xbe\xeb\x13\xdc\xa5\xb6\xb3\x54\x12\x90\x22\x68\xa2\x70\x8b\x6f\xf7\xcc\x4f\x90\x80\x66\x69\xbc\x7f\x99\xbd\x58\xa3\x4a\x33\xfe\xee\xb3\x1f\x36\x33\xff\x90\x9f\xc4\x19\xd9\x25\x5d\xdd\x14\xda\x4d\xe2\x0c\x53\xe7\x6f\x79\xee\x15\x16\x13\xb4\x9d\x5c\x68\x3b\xd9\xf8\xc7\x3e\x1f\x15\x9d\x7c\x54\x74\xf2\xf1\x8f\x4e\x3e\xdf\xcd\xe7\xbb\xf9\x7c\xce\x77\x26\xd0\x85\x4f\xaa\x3c\x3e\x50\xb7\x39\xff\x59\xd1\xc7\x5a\xe6\x7f\x06\x3a\x9c\x8e\xfd\x70\x1c\x7f\xb8\xd6\xaa\x3f\xff\x24\x79\xe0\xbc\xa9\x71\x2e\xfd\x19\xce\x92\x4f\x8d\x08\xf1\xd9\x80\x12\x8f\x22\x8c\xcb\x92\xf4\x13\xb1\x8a\xec\x46\x3e\x1f\x4b\x78\xe5\x8e\x33\xc1\xf9\xdd\x1d\x3e\xa3\x9c\x78\x72\x78\x9b\x2f\xc4\xf9\xe2\x7e\x71\xbb\x3b\x93\xd1\x07\x86\x6c\x91\x59\xc3\xc6\x50\x01\x6e\xe0\x4d\x5e\x5f\x90\xe7\xac\xa6\x8a\xe0\xad\x8e\x62\x05\xd3\x77\x3a\xc7\xf3\x5e\xea\xff\x2c\x2e\xc4\x9f\xd4\x31\xf3\x13\x5f\x1d\xd9\x9f\xf8\xe6\xc8\xfd\xa4\x17\x47\x7b\xfe\xae\x1c\x18\xaf\x38\x99\x92\x07\x12\x23\xba\x03\xd4\x93\x01\xd7\x6b\x03\xc9\x4a\x32\x44\x47\x79\x0e\xdb\x3f\x01\xf0\xef\x27\x3f\x74\x34\x3f\xb3\xfb\xb7\x67\x75\xd2\x7e\x01\x07\xab\xee\x8b\x38\x57\xfd\x4c\xfc\x76\xe2\xb1\xe8\xd3\x26\xae\x02\x32\x1a\x2c\x4e\xc8\x40\xfc\xd8\xb9\x5b\x1f\x4c\x7c\xd4\xe9\xea\x4f\x72\xaa\x61\xbf\xe4\x93\xf2\xe7\x75\xc9\x7d\x69\xea\xd8\x39\x3c\x2d\x7e\x8a\x03\x01\xfa\x6c\x07\x02\x0f\x1e\x46\x3c\x70\x3e\x55\x7c\xc9\xe7\x53\xe4\x20\x59\x85\x1e\x5c\xac\x74\xca\x10\x16\x3e\x4c\x51\xc4\x52\xe2\x06\x19\x66\x1b\xd3\x82\xd7\x13\x24\x85\xa9\x32\x60\x78\xe3\x68\xe2\x34\x43\xd9\x7a\x5f\x76\xb3\x66\x48\xb9\x64\x24\xf9\x64\xb8\xff\x3f\xed\x4e\x6a\x28\xcd\xbb\x9b\x6b\x0f\x86\xe9\x21\x1e\x1f\x0d\xea\x42\x26\x0f\x3e\x93\xce\x2a\xe8\xb0\xd4\xf8\xe5\xee\xd8\xff\x69\x37\xa8\xbf\x1c\x15\x7e\x41\x47\x85\x37\xda\xf2\xb0\x19\x28\xe2\x67\x16\x57\x9f\x15\x02\xf6\x77\xef\x1f\x01\x80\x35\xe0\x49\x61\x00\x67\xe6\xda\xd4\xe0\x66\x46\x27\xa0\xa8\xb1\xd0\xac\x39\x92\xc6\xe2\x3b\x27\xf2\x07\xc1\xa8\x3a\xf7\x14\x21\x90\xc2\x58\x01\x79\xb0\x71\x6e\x6a\xc0\x25\xa3\x92\x4c\x00\x09\x9b\x19\x49\x61\xb1\x45\x02\xeb\xb5\x91\xfc\x75\x79\x95\xc4\x4a\xb1\xf1\xea\x35\x32\x03\x70\x11\xe6\x12\x49\x34\x51\xfe\x5b\xb1\x46\xca\x32\xc8\x2a\x8c\x73\x01\x2d\x49\x2a\x02\x06\x1d\xf9\x2d\x1a\x88\xf2\xd7\x77\x3c\xfc\x96\x47\x26\x90\xc4\x34\x4e\x0a\xe3\x65\x7e\x98\x0b\x20\x03\x96\xea\x42\xf7\x75\x9d\x09\xa2\x16\xa3\x38\x06\x22\x60\x18\x7b\x88\x5e\x49\x52\x3b\xb8\xb9\x8c\xb5\xbe\x7f\x2a\x5c\xb4\xff\xe2\xea\x46\x80\x54\x03\x8d\x2d\xbf\xb7\xcd\xa7\xa8\x58\xe4\x44\x7e\x10\x72\x52\xb3\x9f\x7c\x4a\x04\x31\x9d\x09\xbe\xf6\x97\xc1\x7f\x5c\x01\x7d\x1c\xd6\x00\x8a\x16\xc2\x03\x0a\x23\x53\x8f\x07\xfa\xd4\xe0\xf2\x87\x93\x74\xb2\xba\x7e\x78\xa2\x92\x03\x4c\x2c\x98\xec\xd8\xb3\xa0\xf3\x1d\x39\x29\xa8\x3c\x02\x82\xd6\x63\x36\xcd\x7f\xea\xfa\x61\x48\x39\xa9\x35\x57\x30\x01\xac\x11\x7f\x1e\x03\x64\x4a\x59\xc8\x6c\x53\x26\x2a\x08\x56\x43\xe1\xc7\x43\x26\x24\x53\xd7\x65\xb9\x30\xdb\x94\x88\x9c\x59\x42\xb1\x9c\x65\x5e\x19\x2b\x5e\xb4\x1f\x62\xcc\x12\xbd\x70\x99\xdf\xbb\x74\x3a\x20\x0b\xd1\x4d\xd1\x42\xb4\xb2\x2e\xe6\x25\xba\xd3\x35\x03\x9e\xb7\xbf\x61\xee\x32\xbc\x37\x16\x19\xf5\x17\xad\xb0\x96\x62\xd6\x2a\x31\x08\xba\x65\x68\xfc\x4b\x59\xeb\x36\x41\x39\xc0\xaa\xf1\x9e\xa3\x12\x93\x88\xf9\xb4\x77\x35\x75\xda\xb7\xdc\x7d\x9e\x39\x2a\xb4\x77\x10\x62\x65\xc1\xb2\x94\xb0\x9e\xeb\x75\xe2\x94\xea\xa8\x1d\x69\x9f\x54\x00\x4a\x53\xe2\xc5\xe9\x94\x99\xc9\xc4\xe3\xd6\xfb\x7d\xeb\xc5\x43\x10\xc1\xa7\xca\x29\x56\x59\x82\xd3\x08\x4e\x93\xd7\xe4\xaf\x6e\x04\xef\x53\x12\x0f\x3e\x27\xa5\x85\x88\xca\x36\x40\xea\xa8\x09\x5c\x2d\xd0\xfa\xa2\xcb\xf0\xca\x19\xd5\x20\xbb\x2c\x9e\x22\x17\x9c\xb9\xba\xd1\x08\xd6\x49\x52\x8a\xca\x24\x49\xad\xc2\x80\x73\x92\x54\x35\xa4\x34\x0f\x6b\x92\xef\x53\x53\x75\x3e\x9d\x07\x9a\xeb\x3c\xae\x5a\xc6\x55\xf3\xb8\xea\x56\x64\xf0\xb8\x66\xce\xda\x23\x8f\x02\x92\xf6\xf0\x94\x25\xe1\x51\xec\xec\x28\x28\x85\xf5\x92\xd0\x9b\x75\xd9\x35\x14\x7c\x55\x47\xe4\x38\x36\x91\xb3\xe8\x3f\xb2\x6a\x34\x85\x9e\x03\xee\xf7\x9f\x70\x76\x3d\x22\x66\xbf\xfc\x99\x15\xc1\xa8\x08\xe6\x8b\x60\xfb\x07\x4f\x25\x86\x2e\xd5\xbb\xc5\xbb\xdf\xaf\x37\x3f\x94\x9b\x6b\x7a\x70\xd1\x0a\x50\x30\x33\x3b\x3a\x08\x13\x27\xf1\x6b\xa6\xe8\xc1\x09\x00\x46\x00\x24\xc1\xe5\x8c\x25\x82\xb8\x7e\xb7\xb9\x8c\x97\x50\x37\xcb\x82\x77\xa5\x82\xb2\x91\xc0\x46\xc1\xd8\x1c\x33\x45\x15\xb6\xb8\x01\xaa\xad\xef\x49\xeb\xd0\xa8\xeb\xc2\xcf\x83\x9b\x94\xeb\x37\x43\xd7\xbf\x66\x94\x64\x2f\xde\x6d\xa1\xc9\xa7\x31\xc0\xad\xe9\xb5\x3c\x17\xf4\xa4\x65\x60\x08\x33\x34\xde\x6c\xd6\x3f\x3c\xac\x12\x04\xf0\x9e\xb9\xce\xe7\xb0\x3e\xcc\x43\x36\xff\xee\xb8\x73\x67\x98\xe6\x30\x45\xde\xde\x44\x09\x76\xd3\x9e\xf0\x8a\x9e\xaa\x8a\x19\xbf\x90\xb3\x62\xce\xd9\xdd\x4a\xd6\x37\x3c\x4f\xa3\x67\xd3\x89\xf5\x66\x21\xbd\xd8\xbe\xfa\xfb\xc5\xdd\xed\x5f\x6f\xd7\x3f\xdc\xea\xed\xae\xdc\xdd\x6d\x2f\x5e\xee\xfb\xf8\x1f\xf9\xcd\x77\xf2\x42\x2d\xd7\x37\x8b\xce\xcb\xc9\xfa\x66\xa1\xe6\xeb\xb7\x9d\x47\x97\xeb\xb7\x6a\xbe\x5c\xcc\xff\xda\x7d\xc6\xbf\xd5\x6e\x75\xb3\xd8\x76\x9e\xfe\x91\x7f\xab\x8b\xc5\x8f\xf3\xaa\xbc\x11\x00\x10\xbd\xdb\xac\xca\xdb\xb7\xd5\xa2\xdb\x80\xdf\xed\xdf\xff\xb1\x7e\xdd\xff\x28\x6b\x7d\x0f\x7c\x92\x41\x7f\xd4\x85\x34\xe9\x48\x56\x69\x5a\x93\x69\x75\xfb\x66\x7d\x24\xcf\xbf\xdf\xbe\x59\xf7\xb2\x6c\x77\xe5\xed\x75\xb9\xb9\x1e\x66\xfa\xae\x7e\xae\x2e\xb6\x77\xf3\xf9\x62\xbb\x3d\x9a\xf3\xbb\xfc\x6e\x9f\x79\xb1\xd9\xac\x37\x47\xb3\xfe\x8e\xdf\xec\x33\xfe\x50\x6e\x6e\x57\xb7\x6f\x8f\x66\xfd\x53\x7e\xb7\xcf\xbc\x5c\x54\xef\x34\x37\xb7\x9b\x6b\xb2\xa8\xde\x71\x4b\xd5\xf7\xe5\xa6\x3b\x16\xdf\x94\x9b\xad\xba\xdb\x2e\x36\xdd\x91\xdf\x2e\x36\x4a\xe8\xfd\x72\xe0\xa3\xaf\xde\x48\x28\xef\x97\xc3\xd8\xde\xea\x22\xbf\xd0\xeb\x77\x8b\xdb\x8b\x83\xd7\x7f\x78\xb7\xb8\x55\xdf\x2f\xaa\xea\x65\x3f\x30\x9f\x5a\xdd\x94\x6f\xbb\x95\x48\x50\x14\x35\xaf\xd6\x77\xd7\x2f\x07\x68\xea\xea\x62\x51\xc3\xd8\xe9\x65\x0b\xda\xd8\x23\xd9\x01\xa4\x63\xe7\x93\xfb\x1a\xfa\xee\xd8\x07\x0d\x2c\x9e\xba\x78\x23\x90\x51\xfa\xed\x66\xd5\xa3\xf0\x1e\x49\xaa\x97\xe5\x08\xc3\x0c\x31\xa7\xd4\xc5\xfd\x8d\xfe\xfe\xee\x6d\x37\x8f\x40\xea\xa8\xad\x20\x5f\xbc\x1c\x42\x61\xa8\x8b\xfb\xd5\xe2\x07\x3d\xcf\x68\x0e\xbd\xcf\xf6\x20\x0f\xea\x42\x06\x47\x5f\x0b\x62\xc2\xc5\x70\x90\x32\x90\x82\x9a\xd7\xde\xfd\x2f\x0f\x1d\xfe\xd5\xe2\x7e\x71\xbb\x7b\x39\xb0\xc8\x50\x8b\xf7\xdd\xb1\xf8\xdd\x7b\x9e\x6e\xef\x17\x7a\xb9\xba\xee\x4f\xb2\xbc\x23\x52\x17\xdb\xdd\xe2\x9d\x7e\x93\xd7\x1a\x4d\x3d\x4e\xef\x2c\x42\xaa\x64\x61\xf9\x72\x20\x3c\xff\xa1\xfe\xf0\xfd\xff\x2c\xe6\x3b\xb8\x5e\xbc\x59\xdd\x2e\xbe\xdd\xac\xdf\x2d\x36\xbb\xf7\xbf\xe9\x8a\x27\x75\xb1\x5c\xdf\x6d\x17\x17\x6a\x01\xd7\x8b\xed\x7c\xb3\x7a\xb7\x5b\x6f\x2e\xd7\xb7\x6f\x56\x6f\x7b\xf9\x80\x85\xd3\x57\x5f\x9d\x54\xe2\x76\xb1\xdb\xad\x6e\xdf\x6e\x3f\x5c\xe8\x7c\xfd\xf6\xd4\x32\xf3\xbc\x3e\xa1\x48\x96\x39\x27\x16\x3a\xaf\xd6\xa7\x74\x5d\x64\xeb\x89\x45\xd6\x52\xe4\x83\x85\xfe\xd7\x71\xd1\xfc\xdf\x27\x56\x23\x52\xed\x89\x95\xd4\x53\xe9\xd4\x2a\x44\xba\x7d\xb8\x86\xae\x58\x3f\xb5\xe8\x9b\xc5\xed\xdd\x87\xc9\xce\x52\xf4\xc4\x02\xcb\xfb\x72\x57\x7e\x98\x1e\xc0\x42\xf8\x54\xde\x28\x37\x8b\xdd\x87\x4b\x94\x61\x3b\xb1\xc8\xeb\xd5\x66\x31\xdf\xad\x37\xef\x3f\x5c\x6c\x16\xf5\x27\x96\x7b\xbb\xde\xad\xde\xac\xe6\x32\xca\x27\x90\x75\x51\x55\xa7\xd2\x60\x5d\x55\xe5\xbb\x13\xa6\xc8\x7f\xf5\xa5\xe5\x7f\x7f\xf5\xd5\x3f\xd4\x05\xbc\x78\xb7\x59\x73\x25\xdb\x17\xab\xf9\xfa\x76\xfb\x62\xbb\x99\xbf\xd8\x4a\xfe\x17\x8b\xed\x76\x71\xbb\x5b\x95\x95\xde\xd6\x73\x6c\x7b\xf1\xf2\x57\x2f\xbe\xfe\xf5\xd7\xcf\xfb\xe7\xd7\x5f\xff\xf9\x57\xa3\x11\x7f\x3d\x7a\x62\xb5\x23\xfe\xfa\x57\xa3\xd1\x9f\x9f\x59\xf3\x0b\x6e\xf5\xe8\x76\x3d\x62\xed\x6e\x35\x1f\x2d\x7e\x7c\xb7\xde\xec\xb6\xa3\x37\xeb\xbb\xdb\xeb\xd1\xd7\x2f\xde\xdc\xdd\xce\x79\x60\x7e\x53\xa9\x52\xed\xbe\xfa\xfb\xc5\xdd\x76\x31\xda\xee\x36\xab\xf9\xee\xe2\xb7\x0f\x0c\x82\xba\xf8\xcb\x5f\x16\xdb\xd7\xeb\xeb\xbb\x6a\x71\xa1\xfe\x7e\x5f\x56\x77\x8b\x97\xbf\x2e\xfe\xd1\x55\x8f\xa7\xeb\xb7\xeb\xbb\xdd\xab\xde\x83\xd5\xed\xab\xbe\x36\xf2\xaa\xab\x3a\xbe\x7b\xdf\xfd\xb9\x5c\x55\xd7\x59\xc5\xee\x3c\x94\x69\x3c\x7c\x3a\xae\xca\xcd\xcd\x65\xb5\x9e\xff\xf5\x55\x4f\x5f\xe8\xfd\x9e\xac\xb6\xcc\xd9\x9d\x27\x7f\x2c\xdf\x6e\xfb\x3f\xbb\xbf\x36\xe5\x76\xf9\x6a\xa0\xae\xd6\x18\x92\x5d\xc5\xa9\xdb\xa1\x6f\xab\xbb\xc3\x2c\xaf\x57\xb7\x0f\x3d\x1d\x7c\xfa\xaa\xa7\x42\x74\x73\x7f\xdb\xa3\x5b\xd6\x2f\xba\xaf\xd7\xef\xfe\xd0\xa3\x34\xeb\x6e\xdd\xe2\xfe\xe3\x76\x40\x8c\x69\xff\xe7\x7f\xbc\xab\xd6\xe5\x75\xe7\xc1\xbf\xae\x7f\xb8\x1d\x3c\x9a\xae\xde\x2e\x77\xdf\xdf\x55\xdf\xbf\x1a\xa8\x23\xe5\xe6\x7a\x3b\x78\x36\x5d\x6d\xbb\xcd\xf9\xee\xfd\xed\xbc\xf3\xf3\xff\x2e\xde\x6c\x16\x3d\xe2\xfe\xbf\xeb\x5d\xaf\xbb\x8b\xdb\xf9\xaa\xea\x12\x7f\xb9\xd8\xdc\xac\x6f\x16\xfd\x6e\x7f\x73\xd7\x1d\xb0\xef\xe6\xab\xed\x76\xdd\xeb\xf6\x78\xbb\x5b\x6c\x56\xdb\x6e\x4f\xbf\x59\xaf\xbb\x3f\x33\x7b\x6f\x7b\x8d\xdb\xae\xfe\xd6\x6d\xcc\xe5\xdd\x66\xbb\xde\x4c\xca\xdb\xeb\xcb\x6a\xd5\xe7\xb0\xf6\xcd\xc1\xc3\x21\x87\xb2\x32\xc8\x84\xe9\xb5\xfe\xfb\xef\xab\xee\x5e\xa5\x4b\x8f\xc5\x01\x7b\xff\xe1\xcd\x9b\x3e\x43\x7c\xbf\x2e\x37\xdd\x8a\xc7\xd7\xd7\x7f\x5c\xfc\xb8\x7b\x75\xbf\x5e\x5d\x8f\x8a\x7e\x18\xa2\xdb\xc3\x0e\xbd\x5e\xdf\x77\x1f\xfe\xa9\xdf\x8b\xef\xee\xba\xcd\x79\xbd\x5e\x1f\xf2\x1f\x75\xd9\x65\x53\xbe\x65\x3a\xf4\x98\x96\xe7\xf3\x1f\xd7\x97\xd5\xea\xdd\xb0\xa9\x97\xeb\x6a\xbd\xf9\x76\x35\xff\x6b\x7f\x38\x37\xab\xc5\x9b\x79\xb9\xed\x96\xf1\xbb\x1f\xdf\x31\xe1\x0f\x3e\x17\xa1\x3f\x78\xfc\xdd\x7a\xb3\xfb\xa6\x3b\xbf\xc7\xa2\x90\xad\xbe\x5f\x55\xab\xdd\x7b\x7a\xe8\x05\x76\x8b\x58\x6e\x56\xb7\xdd\x21\xfe\xb6\x7c\xb7\xd8\xcc\xab\xd5\xbb\xc1\xdc\xfc\xb7\xcd\xfa\xee\x5d\x8f\x6b\xde\x2d\xca\x2e\xcb\xff\xfb\xf5\x37\xe5\xf5\xdb\xbe\xa8\xa8\xca\xdb\x79\xf7\xc9\x1f\x36\x6f\xcb\xdb\xd5\xdf\x0e\x06\x7f\x9d\xdb\xd7\x95\x5d\xeb\xbb\xcd\x5b\xd9\xe1\x77\x9a\x51\x95\x37\x8b\x9e\xf8\xda\xbc\x5d\xec\x7a\x0c\x56\x55\xdb\xc5\xfb\xde\x28\x6f\x16\xb7\xf3\x65\x6f\x3a\x54\x3d\x09\xbd\xfa\x7e\x53\xf6\x64\xe4\xff\xb3\xe8\xfe\xba\x5a\xaf\x6f\xfa\x92\x86\x9f\xfc\x7b\xb7\xf5\x7f\x5a\xdd\x5e\xaf\x7f\xf8\xbf\x0b\x16\xb6\x8b\x83\xe7\xaf\x57\x87\x79\x5f\x97\x3f\x1e\x3c\xbb\x64\xbd\xb7\xdb\xb9\xf5\xba\xea\x76\xfe\xbb\x1f\x56\xbb\x5e\x47\xfe\xf8\xc3\xfa\x4f\xe5\x7b\x99\x76\x43\x39\xfa\x5d\xad\xec\xf7\x64\xc5\x66\x5d\x55\x3d\x01\x79\xbd\xee\x0d\x67\xef\xe7\x40\x9c\xfd\x7e\xb5\x59\xfc\x50\xf6\xbe\x3f\xc6\xe5\xdf\x55\xab\xeb\x1e\x83\xff\x69\xbd\xa9\xba\x19\xbe\xdd\xac\x6e\x59\xa2\xb5\x33\xf6\x77\xcd\xe2\x9f\x75\x96\x83\x19\x53\x56\x8b\x5d\x4f\x50\xfe\x7e\xb5\xd9\xee\xc6\xab\x6e\xa1\xdf\x2c\x76\x65\x4f\x90\xef\x0e\xd6\x9e\xc3\x07\x9b\xf5\x76\xbb\x2c\x57\x3d\xe1\x39\xe3\x6d\x66\x9f\xc1\xbe\xef\x7d\xf5\xdd\xed\xfa\x87\x37\x55\xf9\xd7\x5e\x83\xee\x16\x5d\xb2\xfc\x7e\xbd\xb9\xe9\x35\xb7\xbf\xa4\x6e\x16\x8b\x1e\xd1\xe7\xef\xfb\xed\xca\x82\xa6\x2f\xf9\x78\x44\xaf\x7a\xf3\x71\x2f\x86\xff\xf0\x6e\x71\x7b\xf4\xc5\xbf\x6d\xca\xef\x07\x15\x0f\xa4\xf1\xb7\xeb\xcd\x6e\x53\xae\x76\xbd\xb9\xbf\xed\x11\x7b\x5a\xde\x5e\x6f\xe7\xe5\xbb\x9e\x7c\xda\x94\xdb\xde\x18\xef\x25\xe1\xe5\x7a\x73\xdb\x7f\xb5\xd8\x95\xab\x6a\x5b\x0f\xf7\x6f\xef\xcb\xcd\x68\xf1\x6a\xf7\x1b\x56\xce\x00\x5e\xdc\xed\x56\xd5\xf6\xc5\x5e\x87\xd5\x73\x51\x62\x47\x5f\xbf\x38\xae\xa6\x3e\x90\x9f\xd5\xd4\xaf\xd4\x6a\x58\xee\xf6\xfe\xad\xde\x95\x6f\xf5\xdb\xc5\xed\x62\x53\xee\xd6\x9b\x0f\x94\x7b\x90\x5f\xca\xfd\xed\xae\x29\xf7\xc5\x7c\xbd\x59\xd4\x2a\xea\x83\x45\xd5\x2a\x6d\x27\x6b\x2e\xe5\x70\xcd\x5a\x9d\x05\xaf\x92\x70\x82\x1d\x03\x40\x55\x64\x80\xca\xce\x03\x7d\xc4\xde\xfa\x79\xc8\xd7\xa4\x70\x10\xba\xfc\xa0\xaa\x09\x76\xed\x7c\xe4\x8b\x8f\xad\xbd\x71\x85\x0c\x8a\xc2\x61\x5f\xbb\x38\xe4\xe7\xe8\xab\x6d\x23\x6d\xc7\xa4\xd2\x00\x76\x1c\x8b\x99\x01\xc2\x81\xbd\x65\x9c\x10\xc4\x34\x68\x57\xbc\x77\xbd\x9c\x72\xa8\x8d\xc5\xd2\x42\xec\x59\x3e\xe5\x7a\x0e\x1c\x85\x5a\x5d\xe7\x1c\x5c\x52\x28\x53\x28\x9f\x13\x3f\x21\x9a\xd9\x49\x37\x8a\xa8\x3d\x1a\x3f\xb3\x18\xc6\xcf\xb4\x13\x73\xc4\x46\xeb\x79\x1e\x42\x02\x9f\x9c\xc0\x98\x4a\x07\x1d\x8e\x19\x77\x57\x41\x85\xce\x95\x40\xeb\xd8\x71\x2e\x6e\x22\x40\xb9\xbd\x4c\x15\x04\x70\x53\xf2\x60\xbd\x8a\x8a\x9c\xf2\xe0\x24\xfa\xae\x43\x95\x00\xcd\x5c\x93\x86\x18\xb4\x05\xe3\x00\xad\x96\x98\xbd\x08\x3e\x56\x1a\x02\x09\x36\x29\x38\x2b\x89\x36\x12\xa4\x92\x93\xb6\x1f\xf2\x53\x5e\x4c\x49\x6e\x14\xa9\xa8\x04\xe2\x34\xd0\x1c\xf9\x1b\x01\xe6\x26\x70\x4e\x9b\xa6\x64\xae\xc3\x54\xc4\x6f\x09\x5c\x98\x52\x80\x18\x99\x5c\x51\x91\x95\xb8\xe0\x06\xb0\x02\x9b\xc0\xa7\x39\x04\x2f\xc1\x76\x9d\x22\x30\x41\xe7\x2a\x8d\x99\x62\x14\xc4\x62\x04\x7f\x89\x29\xdf\x8d\x4a\xc0\x70\xac\x43\x34\x39\xb5\xa7\xc1\x49\x44\xfd\x80\xf3\xfa\x67\x66\xb2\xc7\xcd\xa4\x4f\x61\x30\x94\xcb\x53\x30\x51\x5b\x65\x3f\xeb\x28\x63\x3b\xca\x54\x59\x2d\x46\xb4\xb9\x25\x0f\x31\x7c\xff\x06\xae\xd9\x19\x9d\x65\x01\x01\xcb\x7d\x89\xb6\x74\x10\xa2\xdc\x3d\xd7\x84\x92\xfb\x61\x89\x39\xef\x05\xaa\xdb\x37\x58\xdd\xa8\x22\x90\x0a\xe0\xdd\xd8\x41\x30\x4a\x92\xfa\xe2\xb1\x2d\xee\x4c\x82\x82\x1c\x18\x23\x48\xdc\xb6\x84\x04\x2d\xd8\xbd\xd0\x86\x2a\x6d\x24\xbe\x98\xf3\x4c\xf5\x98\x14\xd1\x18\x62\xe2\xbf\x5a\xeb\x85\xe6\xf3\x33\xc9\x0d\x41\x51\xf6\xbd\xb6\x24\x48\xf7\x16\x7c\x85\x02\xb5\x1f\x71\x96\xc0\x8d\xf7\x19\x54\xfe\xe4\x5c\xeb\x92\x18\x23\x18\xb0\xa6\x74\xc0\xe3\x15\x5b\x3b\x88\x88\x1a\x22\x4e\x23\xf0\x90\x98\x7d\x2c\x08\x59\xa8\xdb\xcf\x3e\xb6\x1d\xae\xa5\x83\x2d\xd1\xd4\x11\xda\x52\x33\xbb\xb8\x72\x82\xe0\x5a\x9b\x09\x33\x66\x1d\xa0\xb1\xac\x65\x41\x46\x2c\xc3\x52\x37\x43\x1b\x78\x42\x68\xf5\xd1\x23\xe5\xeb\x16\xb2\x18\x17\x69\x49\x99\x4b\x4d\x64\x1e\x67\x76\xad\x2b\xe3\x19\xec\x01\xc7\xe8\xea\x68\xf5\xad\xc5\x88\x93\xc5\x00\x90\xa6\x3e\x4b\x5e\xe7\xc6\xdc\x4d\x31\x18\x69\x63\xf8\x46\xc0\xdc\xa5\x38\x75\x5c\x99\x29\xa4\x3b\xff\x1f\x7b\xff\xd6\xeb\x46\x92\xe3\x8b\xe2\x5f\xc5\xa8\xa7\xff\x06\x22\x88\x24\x19\xd7\x87\x7e\xd0\x18\x98\x7f\x6e\x1c\x79\xcf\x60\x7a\x4e\x0e\xb0\xde\x34\xab\xeb\xb4\x8c\x93\x2e\xf7\xd8\xd5\xea\xae\xfe\xf4\x07\x64\x64\xa6\xf2\x22\x69\xe9\x92\xcb\x97\x6a\x17\x50\xe9\xa5\xbc\xc4\x95\xc1\x20\x19\xe4\x8f\xc3\x12\x8e\xb2\x1e\x92\x6b\x09\x42\xb0\xa4\x3e\xb9\x2c\xb4\x59\xae\xbd\xff\x8d\xcc\x60\xeb\x00\x9d\x71\x80\x7e\xcb\x54\x90\xf9\x65\x1c\xd3\xd3\x3b\x61\xeb\x11\x22\x6d\x10\xf5\x53\xec\x3f\x2d\x49\x3a\x8a\x88\xd5\x0f\x6f\x30\x98\x76\xcb\x17\x09\x28\xdb\xb8\x06\x8f\xff\xaa\xdc\xe2\x05\x94\x8e\xf3\x0b\x23\x46\x0b\x89\x64\x61\x28\x19\x3c\xb2\x30\x5e\x40\xeb\x70\x9a\xcf\x1f\x21\xbb\xd6\x01\xcb\x8c\x72\x98\xd0\x77\xe7\xab\x16\x79\x8b\xd1\xa0\x6b\x64\x07\x1f\x45\x63\xab\x8c\x18\x5a\x52\xae\x05\xec\xb6\xa4\xf9\x6b\x46\xf0\xe8\xa6\x24\x9b\x60\x1e\xa3\x9c\x1f\xab\x7d\xa4\x13\x3d\x87\x81\x80\xd3\x75\xa3\xb3\x3d\x99\xb9\x6e\xe5\x78\x59\x3a\x49\x97\x4e\x1a\x2d\x1d\xcd\x38\xbd\x0d\xc2\x15\x32\x78\x7a\xc5\x95\xc3\x65\xe9\xc8\x3a\xc7\x38\x5b\x3a\xf3\x6d\xf3\xff\xfc\xfc\xb7\x55\x76\x4c\x07\x3e\x6b\x6c\xa2\x83\x2a\x59\x6f\x9c\x75\x90\x77\xa8\x7e\x56\x83\x5b\x9a\xc6\x33\x62\xf1\xd8\xef\xdc\xee\x7b\xa2\x27\x1d\x8c\x6a\x6f\x19\xe5\xa1\x3a\xe6\x1f\x15\x07\x59\xb7\xa9\x21\x07\xa2\x47\xcd\x9e\x4a\x79\x86\x42\xcd\x5c\x32\x74\x4c\x0b\x46\xa1\x73\x84\x2a\x6f\xe6\x6d\xe9\x9b\xfc\xf4\x4e\x78\x6f\x83\x54\x33\x41\x4c\xd2\x83\xe4\x8c\xc8\x9a\x5b\x26\x48\xde\xd0\x49\xfa\xe9\xc2\x29\x6f\xd9\xba\xfb\xe8\xc9\x0c\x9c\xdf\x68\x36\xfc\x37\x01\x90\xdf\xa0\x7f\xe3\xcb\x45\x53\xdc\x97\x9b\xa3\x3f\x65\x4e\xdd\x1b\xfd\xaa\xdc\x15\x39\x15\x27\x7f\xa3\x2f\xcf\x87\x7f\xa5\xf4\x15\x5a\xcd\xc7\x56\x23\x49\x75\x5d\xa5\xda\xa2\xc9\xdf\x15\x60\x78\x83\x0c\x8c\x93\xbf\x31\x81\xf7\xf2\x8e\x9f\xfc\x19\xc1\x53\xff\xc6\xf8\xef\x00\x55\xdf\xdf\xc9\xdf\xfe\x4d\xa9\x7e\xf8\x43\xeb\x5e\xa1\x83\x6e\x14\xd4\xea\xb4\x21\x19\x1c\xbf\x21\x86\x2a\x48\x6d\x84\x5d\xfd\x54\x01\xc7\xee\x29\x66\xa8\x74\xc6\x50\x76\x6e\xfd\x23\x43\xec\x07\x87\x2a\x48\xfd\x4c\x11\x81\x2b\x7d\xce\x6f\xa8\x1f\x31\xf2\xc7\x09\x56\x57\x3a\x2d\xdf\x43\xd2\x32\x47\xcd\x58\x61\x6f\x72\xca\x53\x1c\xb8\xac\x61\xc3\x64\x83\x26\x86\x85\x94\x6c\x00\xf6\x23\x9d\x9b\x59\x23\x90\xab\x9a\x8e\xda\x87\x25\x43\x0d\xb9\xb9\x7e\xc2\x40\x93\x2f\x8f\x95\x3c\x7d\xb0\xc4\x10\xac\xcc\x66\x2d\x94\xb8\x0d\x1a\xb0\x25\xb3\x78\x10\x2d\xa2\xf6\x0d\xfa\x5a\x6e\xb6\x0c\x14\x65\x2f\x90\x3b\x7b\x04\xa4\xa7\x77\xfa\x9e\xc1\x50\x2b\x39\x1c\x10\x5c\xde\x33\xd0\x01\xf7\x56\xff\x81\x80\x7b\x06\xcf\x07\xac\x95\x0c\xe4\x4b\x07\xc1\x3f\x7d\xd0\xcc\xb5\x1e\x30\xd4\xe4\x5a\x11\x7e\xbd\x95\xf5\xbd\xa5\x0a\x4a\x46\xa7\x54\xeb\x1c\xb5\x56\x86\x40\x7f\x89\xaa\x43\xc6\x81\xe3\xad\xce\xb2\xd1\x66\x10\xb5\xd8\x79\x99\xf2\x56\x27\xa5\xbb\xcf\x0b\xde\xb9\x3c\xb6\x59\x81\x93\x62\x12\x85\xe8\xd9\x26\xe5\x54\x16\x83\x09\xea\xee\x1b\x0c\xba\xcf\x11\xba\x94\x64\xf2\x6b\x27\x7f\xf7\x6e\x9a\x4e\x66\x54\x14\x33\x0f\x9e\x45\x21\xa3\x89\x77\xa0\x77\x56\x76\x8e\xca\x06\xcd\xda\x73\x4c\x63\x63\x9c\xcd\x40\xf1\x2d\x3b\x93\x44\x6e\xa1\x50\x52\x2f\x69\x4c\x0c\x81\x7f\x7a\x47\x3a\xb4\x54\xd2\x5b\x1d\x13\xd6\x09\xb3\xe4\xb6\xd2\x9d\x50\xf4\xc3\x64\x09\xe2\xd8\x32\x04\x89\x2d\x20\x4e\xe5\x8a\x64\x28\x49\xef\x44\x78\x93\xde\x89\x4a\xc9\x49\xfe\x45\xfa\x5c\x3a\x4a\x46\x7f\x49\x37\xbd\x6a\x80\xce\xa0\x0a\x7a\x22\x40\xe1\x51\x80\x1a\xb5\x6b\x2d\x4b\x5e\xd2\xb4\x78\x3c\x0b\xd1\x4b\xe0\x46\x2a\xa8\xda\xb6\x30\x1f\x5d\x37\x3b\x01\x5d\xbf\x3c\xd1\x90\x0b\xe0\x09\x67\x18\xee\x38\x17\x27\x39\xa8\x9c\x46\xac\x88\x74\xf3\x38\x3f\xf8\xe6\xa8\xab\xf8\x5e\x67\x40\xde\x1d\xcd\x06\x5d\x70\x95\x86\x1f\x34\x98\x54\x90\x98\x3c\xb3\xe5\xd9\xd3\x87\x72\x3f\x02\xcb\xce\xaf\xf9\xb3\x52\x1c\x22\xfb\x92\xec\xfc\x29\x6e\xc6\x4f\xba\xf8\x2c\x76\xea\xf6\x1b\x17\x6b\x7a\x38\x9d\x5d\x63\x29\x3b\xb3\xb0\xf6\x1c\xd2\x94\x99\xee\xd3\xcc\xd6\x33\x7e\x5f\x0a\x78\x7a\x27\xb3\xd1\x84\x7d\x3a\x9c\x88\xb6\xbd\xcf\xce\x58\x19\x57\xd3\x8c\xcd\xdf\xd4\x30\x29\xe1\xe9\x9d\x6c\x17\x2b\xb5\x8c\x87\x11\xa3\xaa\x0e\x37\xb6\x8c\x68\x3a\x66\x54\xc9\xa0\x71\xd5\x10\xad\xd1\x36\x37\x8c\x1a\x55\xb7\x0f\xdb\xa4\x71\x5a\x86\x0e\xdc\xa5\xd6\x2d\x41\x88\xce\x2f\xea\xbf\xff\xe1\xa7\x02\x0d\x7b\x44\x49\xc5\x11\x4c\xaa\xfc\xfd\xe9\xef\x8a\x9c\xfa\xe9\xb7\x53\x70\x44\xd7\x57\x36\x49\x7c\xf2\xea\xb5\xf1\xa8\x6b\x52\xe7\xeb\xd6\x36\xc9\x86\x74\x7d\x75\xd3\xe4\x59\x23\x6f\x8f\x55\x98\x07\xf8\x24\x7a\x11\x4f\xd2\x80\x65\x67\x21\xf8\xad\xec\x8d\xc1\x8f\xb4\x5d\x0f\xe4\x45\x98\x8a\x2d\x05\x93\x21\xa4\xf1\x47\x95\x17\xf6\x97\x5b\x9b\x4a\x90\x86\x8f\xa6\x8f\x64\x39\x96\x50\x8c\xab\x6a\x3c\x0c\x46\x2e\xd3\xec\x63\x40\x79\x5f\x2d\x13\x92\x69\x99\x5c\x2e\x04\xc1\x24\x70\x7e\xd2\x5e\x86\x88\x4f\x1f\x18\xaa\x6c\xc7\xa9\xca\x4c\x29\xb2\x4d\x10\xb3\xec\x0d\x79\x2b\x9b\x79\x04\x8f\x52\x62\x0c\x7a\x99\x28\xf8\x68\x11\x42\x68\x23\xa0\xd4\x44\xdb\x00\xc1\xc4\x36\xaa\x81\x13\x81\xb6\x18\x34\xd7\x19\x4e\xeb\xb0\x27\xd3\xdc\xde\xbc\x6f\x52\x36\xa8\x11\x2e\x22\x39\x9b\xf1\x61\x1e\x89\x16\xe9\x80\xd2\x16\xc9\x50\x06\xe7\x26\x5b\x63\xca\x32\xfc\xa2\xb2\x67\xe9\x92\x97\xad\x8e\x8c\x6e\x69\x93\xe0\x0d\x53\xb5\x04\xec\x2d\xe9\x56\x36\x3a\xba\x2b\x93\x92\x65\xfc\x12\xa4\x20\xc3\x84\x6e\x2a\x7f\xf7\x8d\x5b\xe6\x73\x3b\x7a\x25\xad\x72\x60\x06\x51\xa3\x56\x30\xef\x90\x35\xa2\x45\xaf\xa5\x9d\x41\xb6\x5b\x86\xc4\x1b\x0a\x86\x46\xb9\x75\x45\x41\x4d\x8d\x07\x4a\x1b\x06\x57\xa2\x70\x3a\x4e\x0d\xde\xa8\x95\x69\x7c\x53\x49\x39\x1d\xb0\xda\x66\x50\xf3\x48\xdc\x31\xc4\x68\x78\x48\x32\x69\xbd\x62\x36\x6c\x8e\x07\x0e\x1d\x73\x2d\x29\x1c\x77\x0c\x32\x4d\x43\x0b\x64\x86\x42\xeb\xa4\xa5\x5e\x05\x17\x14\x19\xa6\x5c\x87\xf1\x67\xa3\x27\x41\x22\x76\xea\x75\xe0\xe7\xe0\xdd\x01\x21\xd3\x6e\x9e\xd1\x12\x35\x4d\xa7\x1e\xb4\xce\x9f\x58\x79\x72\x10\x79\x78\x87\x2a\xa8\x94\x6b\xd7\x4a\x5d\x84\x07\x1b\xc6\x0a\xd4\x71\x64\x9f\x84\xd4\x44\x1d\x09\x3b\xac\x34\x16\x5b\xaf\x55\x17\xb4\x19\x4c\x94\xe5\x89\xa2\x70\xe9\xa5\x93\xb5\x1d\x44\x6a\x98\x6a\x74\x80\xae\xe1\x6a\x22\xa1\x59\x70\x22\xa0\x71\xf9\x56\x2f\x7d\x3b\x13\x59\x2a\x91\x71\xe8\xca\xa5\x7f\x42\x96\x35\xc2\xee\x58\x08\xb1\x15\x8d\x4a\x45\x40\x8d\x49\x9c\xc4\x57\x61\xc9\xf9\x4a\x72\x23\x94\x4b\x3f\xfc\x2e\x9a\xaa\x65\xc3\x07\x06\x74\x2d\x59\x2c\xd4\x30\x04\x10\xf6\xe3\x29\xf4\xe0\xcc\xe2\x76\xe8\x28\x02\x21\xb5\x64\xc0\x71\x83\xb2\xe8\x76\xe4\x44\x81\x2c\xd7\x61\xa6\x51\xb5\xc2\xd4\x22\x04\xd5\x2c\xf9\x19\x9c\x4c\x07\x24\x2e\xb9\x72\x49\x04\xde\x1d\x3a\xb5\xd0\xb9\xa3\x85\x4e\xe8\x01\x5c\x3e\x78\x40\x3f\x7c\xed\xc0\xab\xe6\xa1\xe1\xa0\xd5\xd0\xa3\x2c\x94\x46\x0f\xd9\x46\x7b\xbe\x92\x34\x30\xce\x01\xf3\xc1\x41\xd2\xd4\xb5\xda\x43\x06\x72\x3b\x0c\x80\x5a\x17\x8e\xc2\xc1\x59\x64\xed\x83\x87\x44\xc3\xcb\xf4\x6c\x11\xd0\x02\x8a\x12\xa6\x89\x9d\xad\x42\x65\x08\xa1\x79\x65\xa9\xdd\x8b\x08\x2e\xed\xab\xc6\x01\xbb\x1d\xc9\x3c\xd2\xb0\x0a\x84\xb8\x64\x02\xbb\x7b\xd3\x07\x32\x89\x9a\xaa\x98\xe2\xbe\x3a\xc8\xe8\xb7\x96\x0c\x36\xe8\x21\x6c\x4b\x88\xa8\x7a\x00\x90\x50\x99\x5e\xca\xa7\x4e\x19\x64\xe6\x72\xa9\x06\x6d\xa2\xca\xad\x10\x22\x0a\x8d\x6b\x24\xe6\xd1\x2c\x87\xc0\xca\x4f\x85\x49\xba\xee\xd2\x73\xda\xce\xfa\x2a\x0d\x08\x35\x45\x88\x59\x48\x3d\x90\x2c\xb3\x82\x2f\xe0\xdd\x68\x99\x79\x5d\x65\x8a\xa3\xd2\x95\x70\x1c\xed\x0b\xbc\xb2\xf8\x76\xae\xc3\x30\x9d\xac\x94\x20\xd3\x93\x2c\x42\xb6\x4e\xd7\x15\x89\xa2\x64\x19\x62\x99\xb7\x0a\x74\x47\xb3\x15\x78\xcb\xc0\xb6\x82\xf0\x4c\x90\xe4\x6f\x43\xa0\x0c\xc3\xa2\x45\x04\xfc\xac\x7f\xcb\x3d\xf9\x65\xf0\xb3\xfc\xad\x7b\x79\x39\xb2\x5e\x02\x98\xc8\x7f\xcf\x95\x70\x43\xf0\x25\x3b\x31\x64\x53\xce\xe4\xf0\x40\x40\xad\xec\xaa\x16\x45\x27\x44\x70\xfa\x3f\x43\xd4\x7f\xbd\xbc\xad\xb7\x4d\x79\xe4\x85\xad\xda\x0a\xd0\x78\xe1\xa7\x9a\x4e\xbb\xd2\xa4\xc7\xce\x54\x10\x65\x6e\xf4\x6f\x86\x7c\xb6\x21\xbe\x6b\x00\x75\x8d\xc8\x42\x69\xc2\x61\x9f\x2b\x53\x9a\xe9\x8a\xf6\xb6\x97\xcd\xa5\x7c\x60\x64\x88\xbc\x70\x25\x61\xaa\xe1\x59\x06\x92\x74\x6c\xb2\x36\x52\xfe\x4d\x80\x07\xeb\x21\x9d\xae\xf8\xad\x70\x58\x99\x0a\xcd\x7c\x1a\x34\xa0\xd9\x0c\xd3\xf3\x8f\x37\xef\x12\x88\x86\x4a\xcf\x55\x37\xe8\xd1\x7a\xc8\x26\x48\x89\xcf\x72\xa7\x32\x5e\x9b\x1a\xf5\x08\x25\x3c\xeb\xd6\x6e\x2b\x48\xb2\x75\xc9\xe4\x19\x07\xbe\x89\x67\x3b\x2e\xa3\xd6\x11\x41\x50\x02\x60\x1d\x68\x2a\x94\x21\x0f\xb9\x1b\xe6\xb2\x1d\xd2\xc1\x03\xbd\xd5\xc4\xd3\x04\x68\x12\xa8\x73\x82\x2e\x07\x69\xe7\xb6\xfb\xf7\x1f\x6f\x84\x83\x08\x13\x7c\x96\x69\x21\x9d\x9e\x64\x3c\x68\x80\xbf\xac\xb0\xf3\xed\x11\x52\x10\x9a\x93\xb9\x73\xdd\xbf\xf1\x40\x80\xb2\x89\xd0\x41\xe6\xfd\xb9\x52\xda\x2c\xef\x49\xd1\xf2\x5e\x92\x8f\xa3\xde\x40\x21\x44\xfd\x5f\x18\x0f\x3d\x97\x9b\x16\x95\x9a\xcb\x16\xe2\xce\x51\x42\x57\x2a\x76\xa5\x6a\x0d\x6a\x7b\xb7\x5e\xd6\x45\xa9\x97\x75\x4d\x94\xea\xbc\x94\xa8\xdf\xb9\xae\xe5\xd9\x0c\x77\x4b\x83\x64\xdb\xd1\x7f\x49\xde\x69\x49\xa7\x2c\x1f\xb8\x15\x8a\xc1\x0b\xd3\x53\xda\x11\x65\x04\x6c\xc9\xd6\x3e\x94\x5b\xe4\x83\x6e\xf9\x68\xca\x6c\xd9\x89\x7c\x2b\xc3\xe7\x0e\xd6\x29\x91\xa2\xae\x8a\xae\x47\xa6\x1b\xb3\xc9\xd7\x32\x39\xfa\xc6\xa1\xc4\xce\x0b\xa5\xb3\x50\x2c\x9d\x6e\x52\x5b\xd6\x2a\x77\x4b\x46\xb7\xe1\xd2\x30\x69\xca\xc1\x1f\x8b\x28\x2d\xc8\x65\xe5\x08\x95\x6b\xef\x11\xe2\xb6\x23\x8d\x7f\xcc\x59\x5d\xe7\xd7\xbe\x86\x92\x92\x8d\x9b\x7a\x78\xed\xb3\x6e\x0e\x59\xd4\x11\xb9\xcc\x7c\x37\xf4\xb2\x65\xcd\xdb\x8e\xcd\x24\x84\x99\x4c\xd5\xac\xe5\x20\xe1\x0c\xce\x0e\x10\x0f\xda\x2e\x69\x91\x9d\x34\x6b\x84\xf5\xbc\x8d\xea\xb2\x52\xd5\xa3\x66\x69\xdc\x75\xbd\x44\xac\xee\x83\x05\xd6\x18\xc3\x72\x34\xac\xc7\x65\x95\xb6\xa5\x2a\x76\xae\xaa\x37\x62\x41\xc4\xd6\x3a\xc5\x0b\x88\x23\xeb\x83\x02\x6b\x55\x5b\x52\x34\x8a\x89\x75\x46\x0f\x3e\xd3\x3e\x68\xfc\xf8\xb0\xff\xa1\x05\x4f\x96\x6a\x79\xbc\x45\x12\x79\xc6\x01\xae\xe5\x06\xc9\x64\xf2\xd2\x3a\x42\x90\xfc\xb3\x08\x98\x95\x01\x17\xf4\x8c\x34\x9b\x6a\xa3\x87\x56\xa6\x5c\xbb\x29\x52\x10\xdc\xdc\x20\xd6\x4c\x0d\x61\x2d\x7c\xda\xeb\x88\xa8\x7c\x30\x88\x83\xe0\xbc\xa1\x9a\x69\xee\x22\x85\xe3\x01\x20\x73\x9d\xf3\xd6\x15\x1e\x71\x95\x8a\x0c\x8a\xcb\x2a\x5c\x38\x95\x0d\x49\x4f\x6b\xf5\xd7\x26\x49\x27\x52\xdf\x93\xca\x8c\xbe\x50\xe0\x28\xbf\x0b\xa0\xee\x73\x1d\xbd\x05\xf0\x36\x80\xdf\x28\xa2\x42\x18\x8d\x80\x7e\xc7\x95\x7c\xb7\x82\xa1\x57\x86\x4f\xcf\x64\xdc\x2e\x17\xa7\xbd\xa1\xa6\x08\x55\xb0\x19\x30\x6e\x91\x0d\x4f\xbc\xc0\x52\x14\x8a\x12\x5d\x86\x02\xf8\x89\x8e\x22\xda\x79\xa6\x7d\x02\xa6\x8d\xa8\xb9\x46\x2f\x1d\x99\x1e\x6b\x5b\xc3\x4d\xad\x1c\x43\x55\xe3\x96\x19\x3c\x48\x47\x9c\xa8\x2a\x8e\x47\xd5\xb2\xc9\x42\x0d\x53\x93\x3d\x8e\x8d\xf3\x5a\xdc\x95\x96\xf9\xf3\xd6\xa8\x67\x35\x10\x01\xfa\xc1\x30\xef\x8a\x61\x3e\xc2\x02\xc7\x4d\x23\x8b\x66\xac\xe1\xb6\x9c\xb4\x05\x59\xbc\xd8\xa3\x3c\xd0\xd1\x20\x95\x46\x06\x29\xf0\xa7\x8e\x78\xef\xcb\x37\x9f\xea\x0c\x29\x6c\x8a\x97\xcc\xd1\x49\x46\xd3\xde\x9b\x7e\xed\x65\x85\x3f\xab\x29\xcf\xbc\x9b\xf5\x53\x67\x7a\xd9\x3b\x98\xb0\xeb\x5d\x77\xdc\xb0\x35\x80\xcb\x66\xbc\x55\x00\x89\xa2\xba\x3b\x7e\xc6\x27\x4a\x97\xc9\x14\x7e\xfd\xb9\xb2\xaa\x7f\x59\xa8\xb2\x19\xfd\xbd\x99\x2b\xdf\xd2\x95\xa7\x77\x94\x0c\x77\xcd\x3a\xb6\x3e\x19\xae\x1a\x75\x5a\x62\x21\x1b\x2e\xb0\x37\x95\xfa\x9f\xa4\x92\x2a\x62\x05\x6b\xec\x4a\x93\xf6\x02\xde\xed\x9d\x13\x86\xdf\xe8\x84\x2d\x9c\x39\xfb\x68\xbd\x15\xf6\x57\x4a\x6a\x22\xac\x20\x63\x6b\xbd\x25\xc8\x8a\x6c\x15\x2d\x41\x0a\x3b\x06\x44\xc3\x83\x25\x45\xe1\x3f\xd5\x7e\x63\xd8\x0c\x5a\x2c\x54\xa2\xb9\xa1\xdf\x92\xda\x72\x62\x68\xe2\xee\xf8\x38\x98\xea\xe0\x21\x86\x2d\x0a\x7b\x30\x19\x32\x76\x4f\x51\x76\x69\x91\xc6\x53\xeb\x45\x12\x15\x11\x83\xa4\x29\xcb\x8a\xad\xc2\x9b\x4e\x2b\x56\x45\x59\xe7\x64\x8b\x5e\x81\xf2\x9c\x82\xc2\x1c\xeb\x56\x0b\x55\x76\x9b\xd1\x0d\x34\x94\x1b\x7d\xb7\x75\xea\xbd\x02\xc9\x1f\x9b\x63\xd8\x4a\x73\xca\xa9\xae\x33\x34\x4a\x7a\x21\x82\x6f\x04\x0e\x5b\xcc\x06\x33\x44\xdf\x8c\x26\x16\xfb\x63\xcf\xe8\xb7\x19\x90\x85\xd7\xf3\xd8\x42\x2c\x9f\x47\xda\x62\x30\x98\x5a\x1b\x55\xd5\x0d\x6e\x2c\x66\x75\x2f\x44\xb5\x9d\xf8\x26\x2e\xe4\x33\xf2\x6d\x2c\xce\xc6\x61\x6c\x28\x16\x21\x28\xd2\x96\x2a\x29\x59\x34\x38\x29\x78\xec\xe7\xd5\xf5\x64\x1d\x6b\xcc\x0f\x52\x99\x93\xca\x02\x4f\xaa\x0f\xae\x7d\x6c\x6d\x4e\xa7\xaa\xf3\x13\xac\x84\x7c\x64\x0c\x32\x04\xb4\x49\xe4\xdd\x91\x01\xb2\xca\xea\xd8\xd1\x8a\x7a\x29\x23\x2f\x23\xe3\xa3\xd1\x4b\x3f\xfc\xa4\xfe\xa9\x83\x03\x1e\x97\xf3\x0c\xd1\x86\x69\xe7\x45\x76\xf4\x05\x5d\x16\x8b\x50\x01\x31\xb6\x04\x81\x0c\x6d\x51\x44\xb7\x9d\x3a\xea\xe9\xa5\x57\x5a\xbc\x9a\x2b\xb2\x68\x53\x6c\xa2\x8a\xd4\x52\x21\xf6\xb5\xaa\x90\x9e\xd4\xca\x8f\x40\x0c\x29\x6d\x49\x8d\x33\x09\x30\xb7\x58\x01\x0b\x1f\x96\xf6\xea\xc3\xf9\xd7\x76\xf8\xda\x66\x48\x68\xa3\xc2\xb6\x45\x75\x5c\x64\xf9\xbc\x0a\x26\xcd\x3b\x6a\x1c\x50\x06\xa4\x76\x18\x89\x51\xce\x80\x6e\x98\x9e\xde\x29\x90\x2e\x3a\xf0\x6e\xc7\x22\x7d\x73\x11\xc1\x51\xc1\xdf\x9c\x17\xed\x3c\x6c\xc6\x4f\x8a\x70\xd8\x7f\xa4\xd2\x2b\x43\xa4\xcd\xfc\x6b\x54\xa7\x1a\x57\xac\x1f\xcb\xaf\x65\x45\x5e\xe7\xd9\xfd\x82\xf3\x12\x43\x12\xd1\x5a\xa4\x54\x94\xdd\x3a\xa8\x27\x46\x89\x41\xc8\x83\x9a\xa1\x60\xbe\x3a\x7d\xa2\xd3\xec\xd4\x4b\xd9\xf7\x8d\x15\xba\x47\x48\xd8\x32\x64\xcb\x42\x1b\x94\x81\xd4\x93\x52\xc1\xce\x26\x65\x15\x10\xb3\xaa\x55\x23\x2a\x42\x70\xea\x3e\x24\xca\x64\x37\x98\x24\x0c\x70\x47\x1a\x31\x32\x42\x81\x85\x14\x94\x45\x6c\x48\x04\x68\x3a\x7a\x1a\x1c\x3f\x5a\xc3\x97\xd7\x01\x0b\x4d\x93\x53\xf7\x66\x2e\xae\xdb\x93\xce\xda\xd2\x59\xd1\xee\x84\x13\xc7\xa7\x0f\x36\x40\xf2\x96\x2e\xb7\x79\x78\x72\x24\x00\x3e\xed\xf0\xf4\xe7\xf9\xaa\xbf\xd1\xbd\x05\x3b\x41\x9a\xc1\x87\x0e\x93\x35\x42\xec\x3d\x5c\xf2\x09\xd1\xe8\xc6\x0a\xa8\xab\x80\xc0\x51\x27\xa9\x0b\x2f\xe8\x2a\xf0\x27\x5c\x06\xef\x74\xd0\xa1\x82\x20\xbb\x7e\x0f\x5c\x57\x01\x43\xce\xd7\xf5\xe0\x9e\x48\x05\xd1\x33\x59\x1d\x1a\xf2\x0e\xb3\x62\x0e\xe6\x1e\x73\x50\x77\x18\xb5\xc3\xb1\xfa\xc2\xd9\x99\x63\x57\xf6\xb2\x97\x87\xd6\xb2\x41\xdd\x8b\xa3\x68\x7f\xe5\xda\xed\xc9\x51\xb6\xae\x48\x6f\x35\x3c\x51\xf6\xa3\x24\x2b\x4e\x31\x33\xcb\x9f\x81\x1a\xf4\x35\x46\xa0\x46\x7f\xbd\x45\x02\x52\x4f\x65\x42\x93\xe5\xa3\x5c\x8a\x50\x08\x4a\xb5\xd3\xc6\x41\xdb\x84\xc8\x36\x02\xbb\x6d\x84\x58\x90\x99\xa7\xcd\xd3\xe3\xa7\x16\xc1\x43\xda\xa0\x06\x88\x95\x6b\x59\xe4\x51\xd5\xdb\xaa\xf6\x30\xb1\x3f\x55\x86\x6a\x3d\x92\x28\x50\xa7\x7a\xed\x37\xfa\x10\x4c\x10\x7d\x39\xe8\xfa\xce\xe0\xf2\xc8\x2d\x5b\xfb\x83\xd4\x22\x24\xe5\xf2\x79\x23\x4c\x5f\x0f\x3e\x87\x3a\x31\x19\x66\xf5\xd8\x5e\x3c\x4a\x22\x46\xb0\xe2\xfa\x75\x25\x4d\x6c\x66\xe8\x95\x13\xb5\xb2\x4f\xa8\xc5\x75\x23\x4d\x2b\x88\xac\x83\xc9\x21\xa9\x0f\x34\xed\x71\x16\x71\xf9\x78\xe0\x67\x18\xe2\x08\x3c\x6a\xa6\x9a\x1d\x96\x10\xaf\xe1\xd8\x55\x64\x79\x0b\x1e\x37\x2c\x53\xa7\x97\x6e\x9a\x18\xa2\x68\x16\x18\xb4\xcb\x61\xe8\xb2\x25\xb5\x16\xa8\xac\x65\x46\x83\xac\x42\x4e\xae\x89\x81\xc7\x4e\x33\xe4\x35\x20\x6f\x64\x59\x02\x14\x91\x0c\x37\x52\xa6\xa6\xb1\xe0\x5e\x25\xa1\x92\xe1\x62\xb7\x68\x8b\x7c\x82\xea\x8e\x38\xc2\xb7\xd4\xed\x41\x34\x41\x75\x44\x8d\xdd\x65\x90\x8e\xfc\xce\xcb\x06\xe4\x87\xc3\x5b\x91\x08\xd9\xea\x1d\x2e\x97\x72\x9b\x0d\x6e\xe6\xdf\x63\x29\x77\x37\xab\xcf\xa2\xa8\x55\x04\x55\x7e\x7a\xa7\xf8\xb1\x55\x7c\xc6\x22\x92\xb0\x1e\xac\xca\x1e\xef\x45\x66\x70\xfb\xaa\xb5\xa8\x67\x22\x6f\xd1\x95\x7c\x4d\x25\x92\xc4\x07\xfd\xce\x74\xdf\xaf\x12\xa6\xb8\x12\x37\xa0\x54\x63\x05\x31\x7d\xc3\x2b\x53\x3a\x57\x0d\x9d\x33\x18\x75\x65\x36\xe8\xf7\xd4\xc8\x5f\xbb\xe5\x3b\x11\x50\x91\xd1\xfd\xeb\x2c\xd1\x77\x22\x4f\x61\x61\x71\x22\x92\xc8\x28\x65\x3f\x28\x3f\xdd\xef\xcd\xf8\x49\x67\xfd\xea\xbf\x7a\x52\xcf\xb9\xa8\xc0\xb8\xe0\x85\xde\x7c\x1a\xbe\xf7\x22\xcb\xf8\xb4\x19\x3f\x29\xe7\xed\xe5\x93\xa7\x0f\x8a\xd6\x5e\x6d\xe6\x9f\x8a\x5a\x55\x04\xe9\xd9\x97\xba\xbb\xf6\x1f\x23\xa0\x70\x63\x11\xd5\x4f\x34\xdd\x9e\x6c\xba\xee\xff\x32\xf5\xe1\xa1\x20\xdb\x63\x90\x13\xc9\x7a\xa4\x25\x73\x52\xd7\x54\x26\x3d\xbd\xf3\xd0\x1b\x49\x20\x65\xe9\x4c\x04\xe7\xca\xa5\xbb\x9d\xbd\xc6\xa6\x24\x11\xff\xcb\xb5\xa3\x91\x0a\x62\x36\x19\xe2\xb3\x05\x07\x3e\x6a\x66\x00\x51\x35\x0a\xa2\x6f\xaa\xd5\x1a\xf8\x5c\x16\x3f\x2a\xf0\x71\xec\x68\x81\xd2\x0e\x53\xc1\x23\x1e\xf3\xbf\x94\x44\x2f\x91\x26\xf4\x97\xbe\x09\x68\xbb\xa6\x4e\x9a\x6b\xcb\x0c\x1c\x41\x74\x85\x95\x80\xd7\x93\x5b\x34\xd3\x6c\x6e\xb2\x60\x59\x0f\xe1\x35\xd7\x49\xee\x1d\x17\x74\x21\x67\x4d\x46\xb3\x51\xbf\x76\x7f\x04\x30\x56\xc8\x6f\xde\x79\xa1\x28\x7f\x0c\x5c\xec\x7c\x26\x34\xdb\x0c\xe9\xff\x7d\x41\xa4\x07\x7c\xa7\xab\x56\x5f\x93\x25\xdf\x53\x97\x95\xb4\x94\x2a\xc7\x88\x4e\xeb\x9c\x49\x91\xb4\x5b\xbd\x1d\x42\x8d\x51\x55\xdc\x91\x5e\x4b\x66\xad\x80\x7d\x0a\x06\xfd\xcc\x16\x4a\x0c\x99\x1a\xc4\x9a\xc2\xc9\x27\x69\x17\xcc\x30\x1f\x64\xaa\x46\x74\x7c\xdc\x25\x33\x68\x9c\x64\x81\x1a\xd9\x07\x4f\x17\x80\xfe\xe9\x9d\xac\xcc\xd0\x15\xa4\xa6\x95\x0a\x38\x58\x27\xbc\x0e\x28\x5a\xa0\xdc\xa4\xc1\x50\x87\x52\x74\x43\x08\xce\xb5\xc0\xc2\x05\xfb\x16\x94\x25\xbe\xf4\x1b\xeb\x40\xb7\xd6\x70\x81\x60\xe1\xcb\x49\x96\x20\x25\x23\x6c\x63\x57\x4e\x17\x06\x03\xa0\xec\xa9\x64\xaa\x6d\x71\xe6\xe1\xe2\x91\x90\x4d\x02\x7d\x53\x34\x93\x9e\x7c\x8b\x3b\x96\x21\xcd\x03\x74\x34\x54\x2a\xef\xda\x22\xcb\xa2\x64\x32\xa5\x46\x61\x09\x6e\x33\xab\xca\x1c\x5b\xf3\xf4\x0e\x49\x3f\xa8\xf4\xe8\xbe\xc4\xc8\x25\xd9\xe0\x62\xb4\x11\x02\x89\x0e\x1f\x82\x49\x10\xdb\xa0\x19\xb3\x34\xcc\x8e\x7c\x6b\x83\x55\x8d\x37\xa9\xfa\xac\xab\xf4\xfa\x64\xaa\x97\x77\x61\xf5\x7a\x79\x64\x08\x8c\x0e\x73\x09\xa1\xd1\xb2\xf4\x9c\x75\xa5\x1c\x6b\x32\x78\xa4\x83\xd7\x5a\xaf\x9e\x17\xf9\xdc\x5c\x92\x66\x1d\xf1\x10\xdb\x24\xac\x40\x2f\xc2\xee\x94\xe7\x9d\x9c\x95\x52\xf0\x32\x3a\xf1\xe3\xaf\xa7\xcf\xa9\x8b\xb5\xce\x70\x55\x87\x46\x23\x7b\x88\x5a\xb2\x34\xf3\xb6\x4f\x4b\x6c\x05\x9a\xfb\x67\xa3\x6f\x2d\x99\x9b\x71\xc8\x2f\x64\x6a\xf1\x2a\x1b\x96\xc4\x46\xea\x8a\xa0\x42\x20\x16\x09\xb7\x1f\x27\xe1\xf8\x5b\x74\xd0\xd9\x43\x43\x5b\x18\xa4\x2b\x69\xdb\x26\x6f\xab\x1c\xc1\x9a\x6b\x66\x86\xa2\xae\xa6\x3e\xb5\xdd\x59\x91\xc2\xb7\xa5\xf2\x04\x48\x8b\x32\x8e\xed\x12\xb9\xb3\x4b\x40\x59\xa5\xd6\x8a\x56\xa2\x26\x03\xf5\x8a\x51\xdf\x4d\x59\x0e\x22\x4f\xb5\x54\xa2\x35\x12\x3d\x89\x84\x48\xb2\x74\x7c\xd0\x7d\x5f\x36\x8f\xe8\x0c\xa9\xcd\x31\x94\xb8\x54\xb3\x48\x79\xf0\x12\x84\xfa\xf9\x41\x34\x01\xa4\xf4\xe2\x8b\xb3\x43\x88\xaa\xf5\x1d\x87\x4f\x4d\x3e\xc4\x9a\xde\xe2\x9e\x49\x57\x31\x94\x2d\x6f\xe6\x02\x43\xa9\xba\x8c\x11\x6b\x94\xb1\xc6\xb4\x76\x29\x0e\xd4\xb4\xab\x81\xef\x36\x17\x8b\x5c\x51\x1f\x58\x18\x04\xf8\x72\x36\x49\x41\x86\x2a\x80\xca\x9d\x32\x33\xc9\x8f\x5e\xbc\x36\x2b\xc4\x1c\x61\xbe\x47\x4a\x5c\xe3\x44\x44\x1d\x44\x50\xcf\xd7\x8b\x28\x53\xe5\xa3\x32\x57\x7e\xd7\xec\xd4\xe5\x4f\xf3\x91\x8e\x5e\x2a\x6e\x9e\x98\x4d\xd5\x24\xc8\x5e\x94\x3b\x87\xa6\x5c\x07\x37\x8f\xa8\xc7\xdf\xea\xa6\x4a\xe5\xd2\xcf\x5b\xe5\x45\xbc\x11\xba\x4f\xdd\xb5\xdb\xc0\xe4\x09\x32\x70\x90\x5d\x4e\x04\xc6\x69\xbb\x8e\x4d\x5e\xda\xa3\x7f\xfb\xe5\x79\x95\xad\x8a\x4a\x0c\xe0\x51\x67\x29\x06\x35\x55\x1b\x58\xe1\x61\xf4\x5a\x36\x4e\x56\xc9\x5b\x03\xb8\xfb\x68\x27\x34\xea\x6f\x13\xf7\x7e\x7c\x34\xa2\xfd\xde\xdb\x7c\xc8\x33\x28\x7f\x4a\x40\x1b\x29\xb5\x97\xc1\x46\x0d\x58\x33\xed\xb8\x5a\x90\x85\xa9\x68\x14\x40\xd5\xd7\x46\xd9\x50\x13\x21\xa9\xb2\x92\x35\x3d\xda\x10\x88\xce\xa5\x6f\x3b\xf4\x6a\x46\xd4\x6b\xb7\xd3\x08\x3f\x10\xe9\x78\x04\x77\x05\xc9\xed\x61\x02\x81\xa5\x69\x49\x34\x10\x9e\x4b\x56\xbe\xe2\x01\xa2\x71\x0a\x7d\xd1\xa3\x61\x43\xb6\xc8\x1b\x54\xbb\x29\x8e\xac\xa7\xa4\xb2\x79\xae\x8b\x5d\x77\x0e\xe6\xd5\xd0\xd4\x83\x5a\x7a\xb9\x20\x8e\x01\x81\xf4\xf1\xd3\x78\xd2\x73\xdd\x34\x9c\xea\xd2\xfd\x59\xbe\x2f\x4c\x57\x34\x58\x2d\xe1\xc3\x66\xda\xf0\x1a\xc9\xcb\x79\xd4\x29\x74\xaf\xd5\x2b\x37\x20\xb2\xa1\x9b\xf7\xe2\x0a\x40\xb6\xdb\xbb\xe5\x47\xdd\x1a\x05\xf2\xac\xdc\xad\x70\x04\x9a\xab\xbe\x48\xb7\xe2\xb8\x5b\xe1\xb5\xba\x95\x8e\xdd\x0a\x57\x75\x6b\xb1\xd6\x0a\x02\xf0\x1a\x5a\x9c\x30\x8a\xfa\x18\x79\x8e\x56\xf6\xed\x34\x72\xe7\x70\x26\xd4\xe8\x8f\x2f\xc8\x4e\x7f\x88\xa3\x17\xb4\x88\xa7\x77\xce\xa4\x43\xac\xd1\x37\x37\xa7\x70\xbe\xec\xed\x86\xb1\x26\x9c\xb7\x6f\xdc\x1c\x3b\x71\x53\x5b\xb6\x4f\xcb\x78\x7a\x47\xa8\x0d\x64\x5a\xa7\x81\x3c\x8c\x1f\x57\x8b\xf1\x1b\x37\x58\x1b\xf8\xd2\x00\x72\x25\x03\x48\x58\x46\x90\xce\x26\x17\xbf\x87\x27\x90\xb4\x70\x31\x84\x8b\x26\xbe\x34\x86\xd2\x44\xc2\xd2\x46\x75\x1d\x5c\x10\xe6\x11\xae\xfa\x9c\x2a\xa1\xd1\xc8\xe4\x77\x88\xe6\x78\xca\xae\x7f\x63\xa5\x76\x8c\xea\x98\x10\x49\x84\xf4\x62\x87\xe5\xd0\x5d\x7b\xd9\x49\xa5\x9d\x98\x8c\x08\xf5\xc3\x26\x26\xca\x62\x34\xf3\x50\x0e\x34\x1a\x37\xb6\xa7\x0d\x26\x55\x02\xf4\xda\x15\xc4\x2a\xef\xb8\x1d\x26\x51\x31\xcb\x75\x50\x1c\xa8\x43\xc4\xf3\x10\x73\x77\xad\x06\x17\x0c\xef\x36\x09\x82\x33\x7a\x29\xf5\xe4\x2e\x71\x60\x36\x47\x88\x24\x55\xbe\x16\x6f\x8a\xe0\x8a\x9a\x57\x68\x59\xb6\x46\x79\x6f\x16\x0d\x12\xad\x64\x68\xeb\xb4\x1b\x56\xe4\x75\x07\x11\xf7\xb4\x08\x64\xd1\xde\x5b\x37\x1d\x28\x51\xa8\xa3\xda\xf4\x55\xa0\xe4\xa3\xe9\x54\x53\x42\xaa\x61\x76\x3e\x17\x56\xe6\x62\x33\x9a\x36\xd3\x4d\xe5\x7a\x79\x43\x83\x1e\xba\x7a\xdc\x41\x1a\xd0\x93\x34\x0b\x71\xd5\x5a\x2e\xa8\x3a\xc1\x30\x20\x1f\x3c\x78\x57\x63\x6e\x08\x3b\x17\x05\xd2\xa3\x54\x48\x59\x94\x80\xbc\x39\x16\x60\x46\xe5\xae\x94\x7e\x90\xd4\x1b\x8b\x32\xa0\x57\x6c\x8c\xa1\xbd\xdd\x11\x08\xa8\x64\x9d\xc2\xa8\x1b\xda\x91\xb0\x52\x3a\x3d\x22\x11\x60\xa5\x72\x77\xa2\x66\x9a\xdc\xbb\xb1\x5a\x77\x69\x82\x22\x70\x09\x20\xca\x32\xe8\x51\x15\x46\x1e\x77\xb2\x64\x8c\x06\x54\xec\x47\x99\x8f\x71\x5b\x74\x26\xf5\x72\x43\x7b\xce\x39\xf0\xf5\xd6\xc7\x08\xca\x2b\x4f\x12\xc1\x9c\x8a\xf4\x72\x8a\x90\xce\xb4\x67\x96\x5b\x78\x4a\xc8\x43\x8a\xe7\x2f\x47\x26\x97\xda\x43\xd7\xb4\x67\x1d\xb2\xb9\xd4\x0c\xbe\xa2\x19\xaa\x75\x69\x7a\x44\x6f\x2e\x92\xc9\x4b\x44\x76\x47\xfb\xdc\x35\xc3\x54\x34\xa3\xf4\x5c\x99\xa2\x4e\x77\x3e\xf5\xec\xbf\x4b\x2e\xce\x9d\xeb\xf6\x91\x8b\x3b\x5e\x24\xff\xee\xfb\x7c\xc7\x90\xfa\x6b\xa6\x9c\x35\x5e\x3c\xaa\x9e\xfa\x65\xf6\x60\x73\xdc\x83\x89\x8a\x3d\xce\xc5\xdd\xbc\xdf\xe0\xd8\x92\x99\x88\x22\xc1\x64\x48\xaf\x2d\x8b\xdc\x31\xce\xe1\xfc\x38\x8f\x32\x30\xcf\xb3\x9e\xdf\x5c\x4d\x3c\x99\x51\xfd\x0b\x30\xb9\x3b\x72\xb6\x3e\xca\xd0\xee\xc8\x8f\xfa\xf5\xa4\x57\x0f\x41\xc4\x1d\x08\xba\xd9\xa5\x60\x59\x9d\xf5\xec\x88\x37\xe2\x91\x37\xea\x01\x79\xf1\x56\xdf\xca\x3e\x89\x87\x00\xa2\x45\x39\xe0\xaf\x21\x21\xbe\xeb\x19\xfd\x09\x9e\x5e\x6c\x92\x3d\xcf\x97\x27\xfa\xce\xe6\xf8\x78\xd8\x26\x6e\xc8\xcb\xfa\x65\xe8\x75\xb6\x58\xc6\x74\xfb\x05\x36\xe4\x17\x9a\x70\x9d\x4c\x00\xde\x04\xd9\x0f\xa2\xd1\x4b\x37\xfd\x2c\xc4\xe8\x76\x5f\x9e\x33\x7e\x93\x74\x7e\x66\x0f\x95\xad\xc4\x8f\x36\x19\x13\x9e\x3e\x58\x67\xc2\xfa\x34\x7e\x7e\x92\x2f\x48\x5c\x57\x6f\x0b\x2f\x54\xe1\xce\x6c\x09\x13\xc5\x7f\x48\x5d\xb5\x4e\x52\x09\xc6\xda\xdf\x67\xeb\xbb\xc7\xc4\x24\x6c\x4a\x13\x28\x53\x2a\x79\x83\x21\xcd\x11\xdb\xf5\xa2\x24\xe6\x21\xf8\xc6\xcf\x32\x30\xe8\xdd\xad\x1e\xf6\x61\xf1\x0d\x1a\x8e\x35\x86\xa0\xd7\x5b\x1b\x7c\x9d\xfe\xf1\x8a\x23\x76\x9d\xc2\xf1\xf5\x47\xf0\x82\xd7\xef\x55\xca\xca\x84\xae\x4f\xae\x97\x5b\xc7\x6d\xd7\xfe\xfc\xe9\xd7\xb3\x33\xd7\x3d\x7d\xdd\xa9\xbb\xd0\x04\x9a\x35\xe1\x5b\x25\xff\x0b\x5d\xe0\xf9\x53\xfd\xd5\xbb\x0a\x29\x92\xa8\x3a\x6e\x94\x8d\x02\x37\xa8\xe9\xe8\x7b\xe7\xaf\xe2\xbc\xca\x06\xb9\x66\x86\x90\x16\x8f\xb9\xa4\xf0\xc7\x2d\xa9\x4b\x97\x94\xb5\x2c\x62\xa8\x66\x61\x05\xed\x12\xfb\x7d\x57\xac\xb0\xab\xb0\xcc\xa1\x97\x1d\x32\x40\xe2\x86\xe2\x11\x92\xb3\xea\x8e\x53\xe5\xc1\x56\xb4\xb9\x3c\xf5\xc9\x1a\x11\x4a\x32\x6c\x22\xb0\x2a\x63\x93\xcc\xeb\x5d\xf9\xab\x12\xc3\x99\x25\xa5\x18\x19\x1a\x7b\x54\x81\x13\x85\xfc\xf3\x11\xf1\x84\x42\x41\x6a\x51\xbc\x13\x27\xbb\xf3\x1f\x19\x21\x18\xfd\xd4\x30\xfe\xe3\x35\xdb\x27\x9b\x3e\x6a\xe4\x51\x80\x74\xa0\x0a\xc2\x1c\x91\xe5\xf3\xd0\x2c\x19\xec\x2d\x55\x80\x26\xb5\x1a\xc0\xa4\x63\xbb\x8d\x05\xb0\x2b\xbc\x8d\x06\x9d\x09\xe5\xa0\x5f\x01\xa7\x0c\xfa\xcf\x38\x60\x68\x54\x80\x6f\x13\xa8\x93\x00\x9a\x52\xef\xf0\xc7\x2b\xf5\xf1\xe4\x82\x54\x5f\xc8\x2e\x58\x0b\x9f\x3b\x60\x91\x60\x8f\x90\x36\x22\xce\xa5\xe7\x0e\x2a\xc5\x14\x24\x0e\xf9\x37\xc9\xbf\x7b\x44\xf0\x03\xc6\x07\x17\x88\x1a\x05\x43\xa1\x01\x37\x05\x3b\xfc\x12\xb2\x15\xa4\xd6\x7a\x88\x36\x43\x7e\xee\x30\x4f\x42\x87\xfe\x93\x3a\x10\x18\xff\x56\xe8\x57\xcb\xa7\x58\x2c\x39\xda\xc4\xdb\xc7\xe4\x1b\xde\xa3\x67\x0d\xf8\xba\x4b\xfb\xce\x4d\x1a\x6f\xd9\xa4\xa7\x47\x51\x1f\xd7\x81\x96\xc2\x04\x95\x06\xc8\xf8\xbc\x21\xd9\xcc\xa8\xc7\x0c\x51\x8f\x76\xf2\x80\xae\xa1\xb4\x27\xd9\x05\x89\x77\xb3\x77\x2c\x64\x55\x8c\xaf\xf7\x0d\xbc\xd2\x19\xb6\x51\xb8\xba\x5d\x52\xa8\xa2\xde\xed\x27\x15\xdc\xc9\xd9\x4d\x23\x37\x1b\xf4\x75\x6c\xa6\x68\x1e\x25\x7d\xd9\xdc\x4b\xef\xe9\x1d\x76\x60\x78\xbb\x00\x64\x02\x0c\xe9\x3d\xac\x6a\x77\xb3\x9b\x26\x74\xa5\x23\x3d\xbd\xcb\x86\xa9\x11\x0d\x4c\xaa\x5a\xc9\x59\xf3\xf5\xbb\xab\x72\x0d\x71\x43\x49\x9d\x98\x65\x4a\x65\x1e\x0b\xb8\x51\x71\xd0\x37\x1a\x47\x42\xce\x68\x47\x9b\x1b\x87\x67\x29\x22\x94\xdc\xc0\x6b\xd0\x27\x9d\xa4\x41\xf5\x1e\xa2\xde\xb5\xca\x4a\xeb\x57\x25\xc0\xc5\x54\x0c\xa3\x4e\x27\x46\x7d\x81\x21\xe3\x6b\xaa\x1a\xf5\xa5\xde\x4c\xc7\x8b\x82\x71\xf3\x71\xd5\x21\x3c\x08\x6f\x5a\xa4\xb3\x93\x02\x26\x0d\x91\x02\xa8\x00\x26\xcb\xf4\xd7\xae\xc1\x13\x61\x3b\xf7\xd2\xe1\x37\xde\x6b\x74\x23\x42\xa6\x0b\x84\xbc\x20\x47\x4d\x5d\xbd\x06\x35\x46\xd9\x48\x23\xf0\x33\xe9\x76\xed\x0a\x5e\x99\xfe\xeb\x20\x3f\x57\x96\x20\x2a\x68\x59\x77\x47\xfe\x7d\xb6\xfa\xb2\xfc\x69\xba\x47\xf2\xc1\x5b\xe4\x22\xaf\xa0\x17\x39\x21\x42\x71\x96\xd3\xbf\xfe\xf1\x46\xaa\x4a\x26\x43\x78\xab\x37\x73\xc1\x9a\x1b\xfe\xd0\x47\xcf\x0a\xdd\x65\x48\x37\x77\x45\xb1\x93\xff\x3f\xdb\xf2\x43\x5a\x26\x37\xd2\xb3\xd5\xf7\x2c\xa9\x7c\xc0\xb6\x3c\x4a\x6f\x4b\x9e\x3a\xb5\x21\xf1\xa4\xdc\x5b\xc5\x84\x8b\xee\x2d\xa0\xc6\x30\x05\x28\xcc\x16\x21\x5a\xa7\x38\x77\xc1\xca\x38\xa9\x14\xcb\xa6\x52\x99\xa7\x52\xc8\xb9\xaa\x87\x94\x4b\x9d\x20\xe4\x15\xa0\x8d\x00\x9f\xab\x0e\x34\x10\x3b\x98\xb4\x02\xd2\x86\x0a\xe3\x27\xbf\x59\xe5\x29\x6f\xbc\xca\x5b\xa1\x21\xbf\xa7\x83\x4d\xdb\xa1\x11\x6b\x74\xac\x87\x73\x62\x70\x26\xaa\x50\xa7\x08\x6f\xa6\x74\x2f\x99\x92\x32\x8d\x9f\xb1\x13\xf4\x7a\x74\x42\x99\x14\x2e\xd0\x76\x22\x11\xe6\x01\x1e\x8e\xf4\x63\xdf\x75\x7b\x18\x89\xd2\xb5\x82\x02\x77\x04\x6e\x53\x65\x53\xe5\x69\x5d\x1a\x05\xed\x56\x71\xdb\x86\xdf\xfa\x85\x48\xdb\xf8\x4c\x6a\xc0\x73\x52\x89\x5e\x9d\x22\xf1\x91\xfc\xb6\xdd\x6f\xf9\xb7\x27\x10\xd6\x51\xe7\x42\xa6\x6f\x8b\xcd\x4f\x7e\x28\xde\xab\xe9\x7b\xbc\xc6\x20\xba\x51\xc6\x53\x70\x47\x31\xb6\x83\xcd\x93\x19\xb7\x32\xe3\xa7\xa8\xa3\x60\x13\xa2\xf5\x45\xc2\xb5\x51\x96\xff\x56\x16\xcf\x21\xc9\x7c\x47\xa0\xe7\x02\x45\xa9\xe8\x04\x42\x73\x42\x11\x56\x33\x35\x76\xf4\x4e\x0a\xdb\x5b\x28\xbf\x6b\xc4\x1a\xdd\xf2\x03\x64\x96\xfa\xaa\xe2\xf3\x6c\x9a\xca\x94\x0e\x13\xed\xf4\x1a\x9e\xfb\x0e\xea\x04\x2b\x5c\x62\xb7\x04\x0a\x5c\xe5\x11\x53\x10\x9f\x95\x6a\x14\x1f\x57\x45\x7e\xd2\xb5\x24\x93\x5a\xa8\x49\xef\x98\xfe\x6e\x71\xa2\xce\xa6\x00\x19\x2a\xb5\x3d\x97\x91\xf6\xfd\x19\x6e\xa9\xad\x70\x05\xb4\x4e\x79\x43\xd0\x46\x78\x19\x69\x34\x1d\xc3\x30\x05\xb6\x33\x00\xbe\x55\x46\x55\xd0\x42\xa3\xf6\xd2\x0c\xfd\x5d\x63\x0c\xc3\xa0\x55\xa9\xd9\x39\xb6\x9d\xd6\xa3\x89\x42\x7b\xce\xca\xe0\x6d\xd4\x7f\xdd\xb3\xe5\x8e\x1c\x34\x94\xce\x2a\x34\x27\xb8\x0e\xc6\x21\x1e\x62\xa7\x7f\x66\x45\x16\xc5\xe3\xff\xcf\xd5\xa0\xa8\x54\x7b\x24\x5d\xca\xea\x98\xae\x4b\x2f\xe9\xbf\xb3\xd7\x1a\x29\xf1\x1f\x6f\xde\x91\x83\x82\xef\x47\x07\x1b\x0a\x1f\xd6\x25\xc4\xca\x59\x45\x63\xd5\x89\x78\xa6\x0e\xc7\xd1\xe9\xba\x54\x44\x25\x70\x0d\x57\xaf\xaa\x7f\x63\x71\x79\x77\xe0\xe3\xb3\x2c\x11\xa3\x34\xa8\xb6\xff\x5d\x00\xa7\x61\x09\xbd\xc3\x34\x54\xd9\x92\x06\x11\x97\x4b\x1f\x6e\xe9\xa2\x95\xf7\x7c\x2a\x97\xfe\x58\xc2\x0b\xbd\x30\xf6\x18\x31\x83\x1f\x3f\x8b\x2c\x16\x3a\x30\xdc\xd7\x33\xe4\x69\xd0\x3f\x8a\x24\xe1\xb5\x75\x5d\x2f\x34\x38\xd2\x2a\x04\xad\x1e\x63\xec\x12\x84\x68\xd2\x10\x8a\x61\x43\x07\x46\x2c\x2f\x90\x03\x4a\x87\xb8\xa7\x06\x33\x78\xdc\x45\xd3\x1f\x96\x38\x08\x32\xe1\x22\x7a\x54\xd9\xa4\x3e\x64\x00\x4d\x5f\xef\x2b\x99\xf8\x86\xdc\x7f\x5c\x3c\x46\x68\x93\xc0\x4b\x03\xfc\x31\xcd\xa6\xc8\x08\x19\x9f\x35\x02\xb5\xb2\xca\xac\x21\x43\x15\x4e\x0c\x05\x7b\x3d\x94\xdc\xc8\x3a\x88\x43\xe4\x27\x15\x77\x79\xdc\x05\xc8\x6a\x51\x71\xc7\x5e\x3b\x8d\xc8\x3d\x04\x20\x1d\x96\x04\xd7\x4b\x94\xd7\xf4\xd4\x2d\xec\xb1\xc2\x32\x32\x44\xde\x64\x08\x2a\xd1\x0c\x41\x23\x25\x22\x38\xca\x3c\x29\x54\x77\x04\xe6\x19\xce\x4d\x17\xe0\x8f\xe0\x9d\x9e\x65\x9e\x7e\xae\xde\x13\xba\x5c\x59\x0b\xb3\x40\x69\xa3\xb1\xba\xb9\x27\x68\xf5\x9d\xeb\x5a\xf2\xf4\x41\x33\x99\x66\x48\x22\x59\x42\xe4\x86\x18\xbc\xdf\x25\xa8\x44\x06\xae\x8e\xd9\xf7\x58\x53\xc1\x90\x29\x61\x96\xdd\x3d\x35\xef\xac\x3a\x68\x7e\x36\x68\x54\xa9\x7d\xd6\x81\x68\x78\xe0\x94\x91\xf4\x31\x9b\xa2\x09\xd9\x02\x82\x00\xce\x95\x4b\x47\xb9\x06\xc8\x99\x29\xbc\x7d\xef\x16\xe2\x44\x87\x77\x47\x45\x1e\xc1\x25\x0b\x14\x37\x0e\x5c\x34\xae\x9c\x96\x62\x31\x26\xa3\x53\x17\x5e\x85\x95\xec\x67\x4b\xe3\xbe\xfa\x36\xad\xda\xf7\x70\xc9\xd8\x16\x01\x53\x67\x01\xa3\x02\x7b\x35\xb7\x5c\xab\x15\x0e\x32\xd6\xec\x4e\x3d\x13\x39\x54\x2d\xdf\x9c\x61\x69\x1a\xef\xca\x7f\x45\x3b\xd5\xf7\xc5\x9e\xaf\x3f\x22\xfb\xee\x98\xf3\x35\x7e\x7e\xbf\x07\xd6\x7c\x8d\xbf\x60\xaf\xdc\x26\x75\x50\xe3\xdd\x8c\x07\x88\xa2\xa0\x8a\xdb\x94\x3b\x14\x1b\x61\xff\xd1\xd3\x07\x99\xcc\xac\xe6\x99\xd8\x25\x6b\xe8\xf9\x53\xf9\xbd\x19\x3f\xd1\x67\xe5\x63\x04\x5e\xb5\x5f\x7e\x7e\x7a\xfb\x63\xc3\xb9\xde\xff\xae\x97\xbe\x39\x1a\xa4\x71\x48\x05\x54\xb9\xf0\x91\x09\x59\x1b\x8d\x67\x04\x56\x56\x94\xcb\xa5\xea\x76\x0e\x08\xc9\x1c\x41\x3e\x15\xee\x22\x08\x5f\x4a\xe5\x52\x6e\xb3\xaa\x66\x71\xe9\xb4\xd9\x35\x61\xcd\x5e\xc6\x59\x2f\x09\xb2\xe8\x34\x59\x08\xbe\x64\xb9\x3d\x02\x5c\x68\x1e\x60\xe7\x36\xf3\x6e\x69\x8e\x93\x28\xbb\x70\x87\xc4\x3e\xf8\xde\x40\x52\xd7\xd3\x09\x12\xc8\xb1\x8a\x75\x0f\x0e\xd2\xa5\x83\x03\x60\x2e\x67\x07\x1e\x42\xbc\xed\x8c\xff\x05\x2c\x68\x55\x95\xd1\xfd\x8f\xd5\x3d\xca\x6a\x84\xe5\x15\x1c\x3d\x01\xa5\x3a\x81\x57\x98\xfb\xd8\xca\x46\x05\x81\xca\x2a\xc9\x23\x37\xac\xe2\x20\x5c\xd0\xe4\xe6\xe3\xde\xd7\xbd\x16\x08\x01\x2a\xe2\x53\x82\xc0\x27\x3b\xa0\x40\x8f\x8a\x17\x1e\xbb\x6b\x4f\x18\x95\x1e\x9a\xcf\x9a\xa7\xdb\xb4\xf3\x3d\x94\x4e\xd5\x23\x9f\xa0\xf1\x86\xdb\xc2\x5c\xc0\x3b\x08\x74\x50\x1f\x68\x86\xec\x34\x21\xe1\xf5\x8e\x03\x97\x73\x63\x97\x34\x1e\x0e\x30\x3f\x17\x7c\xcf\xa9\x58\x21\x34\x38\x2c\x2d\x06\x44\x1b\x80\xf2\x0a\x92\xc2\xe5\x64\xd7\xe4\x84\x16\x50\xbd\xed\x02\x78\xd9\xde\xbc\x1b\xf1\x87\x69\x0b\x0a\x97\x48\x50\xf9\x3d\x60\xde\xcc\x1a\x67\x48\x17\x65\x5a\x70\xa0\x51\x25\x37\x2c\xb2\x33\x0d\xf7\x1d\x68\x5e\x84\x14\x3b\x54\x3e\x06\xe7\x75\x15\xc9\xb6\xf7\xe0\xb8\x84\xe3\x96\xa4\x02\xf4\xe9\x2d\x89\x87\xfd\x28\x9c\xd9\x8f\x8e\xdb\xd1\x1c\x45\x54\x1f\x77\xbb\x11\x83\x66\x9e\x25\x43\x7c\x72\x2f\x2a\x4d\xb8\x6d\xae\xe7\xc2\xf9\xd4\x2b\x74\xaa\xe9\x7d\x77\xec\xe2\x42\xe7\xe6\xd6\x88\xef\x94\x81\x5c\xe8\xe1\xdc\x24\xf1\x55\x59\xca\x85\x76\x9e\x32\x28\xfc\xfe\x16\xd3\xdc\x02\xa0\x1c\x49\x35\x05\x12\xf1\x5c\xf3\x4a\xf7\xae\xc8\x4e\x88\xcd\x6d\xe6\x8a\xbe\xa2\x6d\xa5\xdc\x02\xcb\x02\x42\x91\xdd\x55\xef\xa7\x91\xec\x1e\x4d\x9e\x4b\xfb\xea\xec\x70\x56\x60\xb9\xbd\x27\x17\xf5\xf9\xaf\xe1\xcd\x76\x4b\xaf\x5e\xf6\x80\xff\x1a\xac\x6e\xaa\xf8\xdf\xc9\xea\x5e\xf6\xac\xff\xbe\x19\xdd\xcb\x4e\xe5\x5f\x90\xcd\x9d\x15\x41\xae\xf0\x4c\x5f\x53\x24\x39\x5f\xdd\x09\xad\xf9\xbb\xe5\xaa\xe7\xfa\x38\x57\x73\x1f\x10\x4f\x77\x0e\x2a\x6f\xdc\x08\x07\x07\x3c\x59\x34\x93\xc0\x09\xeb\x01\x9d\x0d\xc0\xb4\x71\xc2\xdd\xf4\xd2\xbd\xbe\xbe\x34\x7b\xbe\xdf\xa7\xe3\xde\xae\xf1\x33\xfb\xf7\x8f\x7f\xf9\xb7\xbf\x2e\x50\x6f\xee\xf1\x9d\xa0\x68\x98\x6b\x3f\x43\x69\xc8\x23\x0c\x06\x6f\x14\x1c\x22\xd7\xbe\x61\xac\x29\x36\x84\x7b\x6a\x18\x47\xaf\x68\x21\xeb\xc6\x46\xf0\xcc\x67\x91\x32\xf8\xbc\x45\x85\x25\xc3\x04\xe9\x4c\xe6\x31\x14\xbe\x80\x0d\xce\x7d\x0c\x97\xb0\x94\xff\xfa\xbe\x5d\x09\x91\x92\xd9\xb8\x7a\x92\x33\xd8\xf8\x26\x40\x50\x60\xb3\x6c\xb0\x0f\x1f\x15\x3a\x55\x10\xdd\xb8\x45\x67\x50\x96\xd4\x01\x2b\xa0\x96\x0c\xc4\xd0\xe0\x04\x76\x97\xb2\x85\x88\x5b\x25\xfe\xdc\x84\x9a\xe9\x00\x01\xb7\xb2\xec\xd4\xb6\x4a\x79\x5c\x61\x65\x30\xb7\x55\xc9\xd2\xb9\x25\x32\xcc\x6a\xab\xdd\xb2\x86\x3d\xc9\xee\x9c\x14\x9d\x73\xc0\x53\x92\x72\x63\x33\xce\x32\x2c\xbd\x58\xcb\x67\xe9\xfa\x06\x8c\x5d\xfe\x2d\x3e\x32\x8a\x97\xda\xde\x21\xf7\xb9\x64\xdc\xde\x32\x6e\xc0\xeb\xee\xd8\xd7\xe3\xc0\x53\x13\x34\x23\x6b\x31\xe2\x71\xcf\x0e\x80\x33\x64\xdf\xca\x5e\x4e\x07\xac\xda\x08\xa4\x27\x2e\x28\xbd\xc3\xd8\x22\x59\x05\xe3\x63\xb5\xb6\xf9\x71\xe7\x28\x34\x52\xee\xb4\xae\xae\x11\x77\xa3\xc4\xfd\xfb\xfb\x5f\x56\xa2\x58\x14\xba\x5a\xe6\xfb\xde\x62\x06\x4d\xc6\x3c\xce\xb3\x7d\x74\xc4\x65\x0d\xaa\x46\x07\x29\x8f\x52\xb4\xf4\xc5\xad\xe9\xec\x97\x54\x7c\xf1\xe0\x15\x3a\xb1\xab\xdf\x46\x20\x13\x61\x02\x3a\x4d\x5e\x03\xb0\x87\x08\xed\x02\x91\x58\x69\x22\xe3\x12\x4f\x17\x47\xd8\x28\xa9\x4b\x9f\xc1\x63\x88\x33\x5b\x72\xd3\x90\x14\x2f\x2b\xac\x18\x0b\x53\x6b\x83\x10\x9d\x5c\x36\x58\x12\x45\x54\x23\x10\x35\x65\x3a\x11\x70\xe2\x4c\xad\x99\x8d\x5b\xd9\x7c\x55\xec\xd8\x92\x48\x25\x4c\x30\x49\xd1\x34\xf0\xab\x36\x82\x73\x56\x0d\x93\xc3\x27\x63\x9c\xb5\x79\x5a\xf6\xaa\xa4\x3c\xe7\x71\xf4\xb8\x21\x45\xbf\xae\xe0\x54\x8a\x9c\xbb\x96\x6f\x99\xce\x88\xe7\xa9\x23\xd1\x25\xea\xf0\x0b\xd2\x88\x0f\xdb\xd3\x68\x38\x70\xd5\xc9\xf1\xf9\xba\xc9\x21\x5a\x4c\xce\x36\x6b\xa0\xa4\x1e\xfa\xe8\xd4\x38\xfc\x02\x53\xd3\x4a\x43\xb5\xc9\xa7\x36\xa2\x55\x92\x75\x92\x46\xa5\xba\xba\x80\xfe\x15\x5c\xef\xd4\x0b\x6d\x8a\x64\x8b\x0d\x57\x25\x47\xd7\xf4\x61\x54\x00\x57\xaa\x29\x01\xc6\xc5\x53\x2e\xf0\x7b\xb9\x41\x84\x4c\x4f\x1f\xac\xfa\x31\xba\x5c\xca\xdc\xdb\xf0\xf4\x4e\x53\xaf\x85\x9a\xaa\x43\xda\xa7\x86\x4f\xe0\x2f\x5f\x66\x04\x37\x1c\xd4\x52\xc9\xd8\x43\xc0\xb9\x09\xe0\x72\x5b\x12\x8e\xed\xa2\xa8\x06\xb1\x8f\xa5\x2d\x30\x96\x49\x61\x7e\x5f\x79\x50\x18\xfc\x1c\xe2\xc1\x32\x64\x8d\xbd\xc5\xa7\x0e\xc5\x36\x0d\xa3\xb3\xee\x81\x03\x7d\x13\xe1\x84\xa4\x21\x3e\xae\x19\x3a\xda\x24\xe1\xa8\xaa\x30\x33\xe4\x2f\x30\x09\xfe\x06\x18\xe4\xdb\x9c\x9c\xbe\x3b\xe3\xc8\x79\xa9\xec\xcb\xf0\x87\x77\x84\x06\xb9\xf1\x90\x5c\xc9\xa9\x85\xab\xe9\x89\x73\x56\xa0\xd2\x18\x72\x4d\xa8\xd5\xb5\x58\x8e\xe6\xc3\x4e\x1f\xe8\xe5\xc8\x0c\xa2\xfb\x32\xcc\x60\x89\x6b\xd0\x35\x73\x3d\xbd\x71\xfd\x55\x7f\xeb\x19\x02\xa9\x7b\xb4\x07\xf7\x6c\xa9\xa4\x2a\xee\x32\x9f\x47\xcb\x9d\xeb\x6c\xd4\x7c\xd9\xea\x18\xab\x0e\xad\xb9\x65\x20\xeb\xc1\xcb\x34\x74\xb3\xf0\x36\x40\x32\xce\x04\xe3\xa0\xdb\x4e\x0e\xe4\x80\x9e\x75\xce\x06\x0f\x6d\xfd\x77\x2f\x9a\x4f\xe7\x3b\x9b\x6c\x97\xe5\x5e\x8a\xd5\xc5\x5f\x4b\x83\xae\xf6\xdf\xbc\xfe\x50\xe1\xbb\x8f\x2b\x9c\x6a\x0f\xed\x5f\x57\x89\xb7\xe0\xca\x60\xac\x31\x37\x61\x82\xa4\x5c\x35\x18\xeb\x30\xcd\xea\x6b\x20\xe3\x90\x6f\x42\x7f\xba\x1a\x63\xc3\xd5\x0c\x2d\x19\x73\xcd\xd5\x34\xcf\xe8\x04\xfe\xd7\x94\x80\x9a\x49\x77\xde\xbd\xff\xe5\x4c\x7f\xfa\x00\xae\x58\x63\x35\xb7\x23\x84\x79\xec\xe3\x6d\xc0\xf0\xcb\x16\xbc\xd5\x05\x7c\x11\x7b\x72\x83\xc1\x60\x9f\xb0\x4e\xcd\xb6\xa6\xbf\xa3\x9d\x4d\x86\x9e\x3e\x48\x37\x37\xa2\xd2\xf6\x51\x33\x4c\xfa\x62\x77\x47\xef\x25\xc3\xab\x41\xd9\x93\xd3\x01\xa2\xf9\x00\xb9\xbb\x07\xe8\x22\xe8\xfb\xd5\xe3\xa0\x11\x2f\x5e\x1b\x56\x22\x4d\x06\x26\xce\xda\xb8\xe9\x4d\x73\x3f\xe4\xba\x2c\x87\x17\x26\x8f\x82\x02\x87\x29\xb1\xe7\x49\x50\x54\x4f\xef\xd3\xbb\x3a\x82\x18\x0f\x11\x16\xb9\xef\x31\xef\x67\x77\x6f\xa5\xbe\x15\xc6\xf6\x15\x68\xec\x12\x72\x95\x36\x63\xd4\x30\x2d\x9d\x46\xed\xc2\xd2\xd2\xa7\x0f\x36\x15\x2d\xd2\xd7\x98\x41\xe3\x2e\x45\x2d\x1b\x4d\xb5\xc6\xc1\x34\x18\xe4\x8d\xe5\x43\xe9\x72\x2d\x0f\x0f\x01\xaa\x3c\x7b\xc6\x25\xb5\xad\xdf\x9f\x78\x56\xd9\xeb\xe9\x67\x9e\x2d\x71\xb7\x8a\x2d\xe6\xda\xb9\x7b\x57\xc6\x92\x35\x51\x81\x5e\xcb\x00\x46\x70\x9a\x82\xc3\x6b\x08\xb5\x66\xe7\xf4\x71\x33\x9e\xd1\x32\xc2\xe4\xc0\x47\x93\x01\x15\x33\x43\xd5\x15\x9e\xbc\xa6\x1f\x16\xc0\xbc\x65\x0e\x9f\xf7\x1f\x7e\xbe\xb4\x56\x6e\xed\x73\x2e\x98\x1f\xad\x83\x14\xac\x53\xc8\xa3\x53\xd0\x1f\x09\xf4\x10\xcd\xbb\x56\x5e\xd2\xb0\xbd\x3c\x7b\xb3\xd8\x7d\x31\xa8\x40\x9d\x0c\x92\xc6\x97\xd0\x49\x95\xde\x41\x8c\xb6\x4f\xe4\xe6\xf4\x72\x2a\xdc\x7c\x65\x43\xb6\x9b\x2c\x80\xf9\xec\x96\x05\xa7\x19\x29\x8c\x1b\x2d\xcd\x6a\xb1\x34\x4b\x16\xa7\x95\x94\x81\xab\x39\x46\x52\x4f\xf3\x9d\x08\x36\x08\x1d\xa9\x58\x32\xa4\x89\x72\xb6\x32\xdc\x41\xf3\xa5\x0d\xcf\xb1\x1c\x21\x94\x54\xd1\x50\x25\x93\x35\x5d\x14\xea\x24\x8f\xdf\x32\xfa\x96\x66\x0e\xc4\x56\xf8\xac\x0d\xca\x1f\xa7\xef\x98\x2e\x35\x34\x54\xcb\x54\xc5\xff\xf9\x69\xb7\x52\xc6\x8c\x28\xda\x1c\xbb\x3a\x95\x8c\xa9\x59\xc3\x36\xfb\x15\x16\x0c\x63\xa3\x49\xc8\xea\xd4\x30\xee\x20\x0f\xcb\xaf\x32\xea\x2a\x5b\x6b\x01\x9b\xc9\x03\x4d\x25\x57\x3e\xeb\x8e\x4b\x66\xc5\xf6\x95\xae\x9b\x0c\x22\x26\x93\xeb\xb1\x05\xce\x9b\x58\xeb\xfd\x91\xc9\x6e\xdd\x1c\x03\x58\x92\x0c\xf0\x29\xd8\x7a\x3c\xa3\x82\xdc\x54\x8f\x2b\x99\xf7\xf9\x8e\x7a\x6e\x1a\x45\xdf\x07\x91\x1a\x0f\x29\xd4\x22\xe1\x37\xae\x46\x07\xb9\xd1\x1b\xc8\xcd\x08\x71\x5d\x63\x4b\x69\x1f\x80\xc6\x27\x61\xeb\x9d\xa2\x04\x93\x85\xda\xa6\x64\x53\x75\x30\xc2\x42\x71\x55\xde\xcc\x1f\x8a\x26\x8a\x4d\x7e\xfa\x90\x0d\x55\xd2\x5e\x74\x7b\x5d\xc4\x95\x28\xc9\xfa\x63\x25\x47\xcd\x0a\x22\x1b\x5f\x13\x37\x6e\x9c\xcb\x13\x0d\xed\xed\x78\x48\x14\x6a\xd5\x35\x7e\xa0\x49\xf9\xbf\xa7\x49\x7e\x21\xe5\xc0\x7f\xee\xce\x26\x24\x16\x82\xa8\xc0\x77\x49\x80\xbb\x3f\x35\x85\xae\xe3\x75\x84\x2a\x46\xdd\x6a\x73\x17\x06\xce\xc6\xc1\x38\x13\x11\x7a\xc8\x64\xdc\x36\x18\x37\xc9\x4f\x14\xda\xca\x64\xc8\xe3\x30\xfc\x92\x63\xdc\x61\xab\x78\x39\x72\x19\xc7\xe8\x6b\x9e\xd1\x36\x43\x16\x1d\x6f\x54\xd4\xb1\xfe\xa7\x77\x54\x41\x20\xc3\xd2\x4b\x13\x4a\x6c\x43\x13\xf6\x52\xcd\xb1\xcc\x07\x85\xb6\xfb\x07\xf6\x5a\x5b\xe1\x35\x43\xdd\x5a\x2e\xc1\xce\x35\x79\x60\x6c\x3d\x10\x19\xb9\xc8\xe0\xc8\xb8\x6e\x67\xdd\x57\x4b\x7f\x31\xf7\x5b\x84\x98\x2c\x5b\xfe\x4a\xb3\x74\xc7\xe8\xd0\x35\xa3\xf3\x15\x0c\x8e\xab\x81\xa3\xad\x4a\x66\x8f\x41\xa3\xff\x5e\xd6\xf3\x9d\x90\xec\x6b\x02\x36\x9f\x46\x31\xfc\x3e\x86\x3e\x6b\x32\x73\x04\x16\xa1\x36\x84\x92\x63\xb8\x0f\xe1\x0b\x1a\x31\x1e\x36\xe3\x27\xf2\xec\xf8\xd1\x1a\x10\xd2\x05\x72\xdc\x43\x64\xb5\x5b\xf2\x46\xd6\xac\xe1\x1e\xdd\x56\x5d\x44\xb1\x02\xa2\x16\x8b\x27\x9f\x8b\xdb\x2f\x37\x6e\xa3\x07\x7a\x88\xc6\xaf\x33\x66\xd7\x59\x9b\x5f\xe6\x8a\x2e\x5e\x17\x76\x2a\xc3\x7b\x31\xf2\x54\xf9\xa2\x8b\x67\xf9\xa2\x5b\xe4\x3f\xbc\xd3\x8e\xfc\xcf\xbb\x4e\xee\x82\xae\x3e\xc5\xb8\x34\x96\xea\x76\x54\xe1\xd3\x07\x27\x4b\xa1\xf3\xbc\x55\x99\x59\x53\xe6\x65\xdd\x86\xd5\x29\xd2\x83\xd7\x04\xd8\x8a\x35\x33\xcc\x54\x02\x42\xe3\x6b\xd1\x6d\x69\xcb\x08\xd1\x1b\xaa\xc0\x79\xd9\xc1\x49\xb3\xd1\x56\x9a\x50\x9b\x0d\x8e\x45\xfb\x58\xe6\x85\xd0\xca\x65\xf1\x82\x9e\x63\xdd\x92\xca\xe4\x04\x1b\x1a\x0d\x67\x84\x84\xdd\xfe\x2b\xdb\x7e\xb7\xff\xf2\x0d\xf2\xf3\xc5\x8c\x35\x51\x65\x8e\xac\x16\x54\x07\x22\xc6\x69\x96\xf2\xd9\x48\x29\x31\xfa\xba\xe0\xfa\xcd\xfa\xab\xf9\xa5\x03\x64\x3e\x64\x75\xe5\x98\x7d\x5b\xdc\x57\x39\x6c\xb1\x24\x64\x45\x58\x0e\xd9\x7c\x4c\x17\x75\x8c\x9a\xf9\xf4\xae\x4b\x91\x9a\x87\x98\x7a\x99\x40\xdf\xc4\x7d\x06\xdc\x96\xd8\x47\x99\xc6\x73\x39\x2b\x4e\x2b\xc9\xeb\x4d\xc1\xc3\xd9\x61\xfe\xf9\xa6\xe4\xd1\x04\x36\xdf\xf0\x82\xbf\x33\x29\xce\x9a\x82\xe0\x39\x98\xf6\xf5\x08\xfe\x51\xd5\x72\x4c\xf2\x0a\xa4\xd8\x1d\x16\xab\xd0\xa5\xbe\x9c\x43\x68\xb3\x62\xbe\x61\x6e\x35\x92\xdb\x03\xc9\xee\x88\xb2\xa7\x11\x6e\xe7\x94\xd7\xea\x69\xb5\xdb\xcd\x25\x37\x85\x18\x0a\x79\xfb\x9d\xac\xae\x57\x53\x59\x2b\xe9\x64\x80\x74\xfd\x9a\xc1\x0c\x31\x9b\x74\x21\x05\xd4\x75\xb8\x3d\xd7\x2d\x65\xd2\x54\xce\x85\x1a\x02\x04\xdf\x7a\x40\xa3\xae\x09\xaf\xb6\x58\xaf\x03\xe3\xf9\xce\xcd\x00\xfe\x66\x91\xf7\x1b\xe4\xaf\xf7\xe8\x74\xdf\xe1\xce\x1a\x34\x37\x3a\x42\xa4\x0d\xca\x87\x7a\x29\x12\x7e\x02\x67\xb0\x32\xe3\xdb\x7a\x12\x32\x7c\xf1\x63\xc8\xd6\x19\xb2\xc7\x92\xf9\x7c\xb3\x8b\xe7\xae\x04\x41\x6b\xe5\x8e\xb9\xd5\x3a\xb5\xe6\x66\xb5\x8a\x69\xe3\xeb\x6c\x54\x37\x84\xda\xdf\x21\x6e\xed\x66\x61\xd0\x96\x81\x83\xf5\x80\xfe\x7b\x91\x95\x5e\x63\xf1\x5f\x13\xf5\xff\x0d\x4b\x04\xd7\x63\x02\xcc\xa4\x81\x89\xc1\xa5\x7e\xff\xf9\xd7\x8f\x9f\x7e\xbb\xe4\x41\x37\xf3\xbd\x42\x83\x87\x04\x91\x5a\x0f\xd9\xb8\x71\xcc\x98\x8e\x44\x4a\xad\xf5\x42\x60\xb9\xc1\x4a\x7d\x7d\xcd\x28\x39\x9c\x94\xb5\xae\xdf\x95\x42\xc7\x85\x63\x38\xaa\xc6\xa2\x50\x68\xfc\x24\x52\x49\x9d\xc0\xdc\x3e\x41\x9a\x65\xff\xf7\xc0\x7e\xe2\x94\x95\x84\x0b\x51\x02\x9e\x84\xc7\x95\x20\x33\x97\x26\x6e\x1b\xea\xa4\x71\x9b\xbd\x66\x32\xf6\x6f\xcf\x22\xc2\x7f\x6d\xbf\xb2\x17\xd2\x36\xcb\x62\x4f\xe0\x14\x13\x7f\x96\x19\x68\x44\x1a\x13\x37\x20\x44\x35\x5a\xae\xe4\xdb\xa6\xb1\x65\xd9\x6d\x32\x64\x67\xf2\x11\x1f\x8e\xf4\x30\x32\x83\xcf\x2d\x24\x85\xfe\x0b\x3b\x44\xf0\x6a\x17\xf5\xbe\x73\x65\x4c\xe0\xd9\x10\x6e\x31\x28\x8f\xd9\x08\xf3\xe8\x06\xd4\x74\x25\xaf\x94\xb8\xb9\x1b\xab\x9b\x87\xa9\x5f\x42\xaf\x94\xa8\x58\xf6\x38\x52\x06\x8f\xbb\x19\x3c\x97\x5a\xe4\x35\x78\x4f\xe3\xb8\xb1\x8b\xe6\x46\x83\x36\x41\x90\xff\xcd\x1c\xd0\x0b\xbc\xfa\x82\x6b\x3a\xbd\x2a\x74\xd7\xd2\xa1\x2c\xdc\x3c\x2b\x72\xc6\xab\x18\x88\x50\x36\x21\x4e\x3a\xc7\x8a\x9a\xe7\x47\x89\x64\xa3\xf0\xdf\x94\xfb\x69\xde\xf5\xd3\x8c\xea\xb8\xc7\xd9\x62\x02\xdc\x57\x8b\x00\x22\x88\x8a\xce\xc8\x1b\x44\x45\x65\xc0\xfe\x91\x2e\x38\xa9\xef\xbb\xb7\x09\xbd\x3e\x81\x3e\xec\x95\xc0\x10\x35\x8b\x11\xe7\xbd\xa5\x09\x7b\x23\x2a\x08\x04\x01\x35\x41\x52\x0c\x2f\x70\xc9\x51\x51\xaf\x66\x73\xc1\x64\xd2\x2e\x43\x12\xe6\x93\x7a\x4f\x2f\x32\x40\xdc\x31\x22\x77\x8a\x11\x79\x28\xa9\x90\x3d\x9d\xe4\x45\x52\xe8\xab\x19\x64\xbe\xba\xfc\x72\x9b\x6d\xe6\x4a\x8b\xc6\xf5\x8e\xee\x40\xda\xef\x91\x67\x9e\x6c\x17\x19\x48\x63\x3e\xb2\x9d\xef\x6e\x58\x1c\xc9\x13\xb8\xd6\x1b\x21\xfd\x91\x9b\x1f\xb9\x92\x0c\x00\xd3\x93\xe6\x9b\xf5\x26\x89\xd4\x8d\xa8\x59\x93\xf4\x3a\xec\x3c\xce\xa8\xca\xb3\x45\x6f\xb8\x82\xc0\x3b\x19\xfa\x5e\x94\xcd\x10\x2d\x09\xb9\xae\xa0\xe2\x8f\x98\xfc\x26\x82\x4b\x1a\x56\xdd\x37\x98\x44\x7e\x8f\x9a\xe8\x14\x41\x74\x05\xbd\x8e\x98\x5c\x98\xb5\xbe\xf0\xd4\x90\x0b\x38\xe8\xd0\xfa\x4d\xdf\xfa\x8e\x5e\xfd\x4e\x2b\x2c\xd5\x76\xb7\x1d\x78\x85\xeb\x8c\xe0\x42\xb9\x74\xfb\x46\xd0\x7c\x1c\xee\xe2\xbe\xf1\xee\x38\xb6\x2b\xcf\xd4\xab\x9e\x91\xae\x79\x40\x7a\x05\x8b\x3c\x5a\xd5\x27\x70\xd4\xa8\x39\xbb\x7c\x78\xae\x2c\x54\xb9\xfc\x8f\xc9\x02\xb2\x05\x8a\xe3\x21\x9a\x8c\x2d\x96\x53\xe6\x73\xa3\x2b\x7b\xbd\x05\x87\x0b\x23\x7e\x07\xae\xb5\xa5\x0a\xa2\x33\x51\xf6\x4f\x54\x0a\xc2\xbc\x1a\x69\x29\x65\x75\x37\x19\x7c\x04\x8f\x2d\x82\x67\x29\xe1\x81\x8d\x60\x55\xaf\x88\x6f\x56\x25\x3c\x93\xb3\x6f\xa6\x96\x6c\xda\xdd\xa7\x0f\x97\x75\x13\x56\xa4\x1e\xc5\x31\xf2\xd2\x60\xbd\x94\x99\x8c\xc0\xd1\x76\xe9\xa1\xab\xd4\x5d\x3b\xd9\x5a\x01\x24\x82\xdf\x78\xf5\x5f\xed\x55\x75\x75\x7d\xe8\x8a\x5b\x4b\x47\x41\x70\x9a\x76\x9a\xa5\x7d\xd1\xe8\xa5\x6f\x5f\x50\x88\x77\x75\x5b\xd1\x4b\xb9\x0f\xac\x0c\xd1\x6d\x96\xed\x3e\x96\xb6\x92\xfa\x82\x01\x9c\x42\x28\x6d\xc6\x11\x06\x05\xda\x29\x42\x4a\x5b\x2f\x82\x2c\x57\x1a\x25\x32\x08\x5f\x51\xc6\x29\xb9\x56\x28\x5d\xc9\x7d\x87\x0c\xba\xc2\x87\xe5\x15\x20\x25\x0b\x55\x6a\x49\x56\x20\x9d\x89\xb1\xd8\x52\x2a\xc6\x95\x49\xf5\x43\xa3\x9e\xde\x15\x53\x1c\x65\xc8\x1b\xdd\x42\x7a\xc1\x2b\xab\xb0\x98\x55\xd6\xee\xee\x97\x75\xdf\xbf\xbe\x92\xda\x44\x4e\x2a\xa2\x0a\xd8\xb5\x56\xb6\x05\xcb\x4d\x06\xbf\x83\xdc\x77\x55\xf3\x0a\x55\x87\xbc\x25\x07\x1a\x76\xd2\x3f\x53\x94\xaa\x98\x45\x48\xbd\x45\xe1\x75\xdf\x0e\x31\x3d\x2e\x3b\x63\x82\x14\xcc\x1d\x03\xd6\x0f\xf6\xeb\x1d\x4d\x0e\x84\xc7\x1a\xc6\xcd\xa3\x38\x6e\xec\x98\xb3\xdb\x5b\x12\x56\x5f\x45\x53\xae\x83\xf6\x19\x6d\x2e\x29\x51\x77\x23\xba\xb5\xc2\x6d\x19\x28\xbe\xf2\xa2\xf9\x21\x88\xdf\x26\x88\x7f\xa1\x45\xb3\xce\xc6\x7d\x0d\x59\xbe\x20\x63\x6d\xcb\x1f\xee\xc0\x10\xd3\x96\xf4\x90\xe7\x08\x6e\x83\x0a\x7f\xa9\xd9\x7c\xa3\xda\xce\x5c\x93\x21\xe4\xb9\xcc\x5a\x6d\x7b\x80\x52\xb6\x1e\xe8\x9b\x20\xf4\x75\x8e\x26\xbe\x36\x91\x5f\x6f\xf3\xff\x36\x09\xfc\x91\x93\xca\x9e\xbc\x85\x22\x92\x92\x44\xea\x69\x82\x81\xd0\xa2\x13\x25\x69\xae\x9e\x95\x64\x77\xbb\x08\x5e\xa4\x36\xdf\x6f\xf6\xc5\x02\x44\xf8\x75\x44\x97\xa7\x0f\x8a\xad\x6a\xc3\xd8\x3e\xaf\xfa\x20\x17\x47\xed\xb3\x8b\xeb\x10\xc1\xf7\xcb\x72\xac\x10\x7a\x70\x59\x91\x27\x7f\x07\x87\xa9\x5f\x5c\x52\x79\xcc\x0c\xfd\x7a\x72\xca\x63\x56\xe5\xab\xd6\x8b\x19\x32\xf1\x58\x02\x44\xa8\xfc\x54\x56\x26\x59\x07\x41\xd3\xda\x78\x57\x2e\xdf\xf2\xba\xfa\xdd\x58\xb4\xbf\x98\x6a\x7a\x87\x49\xee\x8b\xee\x19\xa7\xc2\x47\x2f\x1a\x4e\xdd\x37\xa5\x8d\x26\xe3\x9e\x3e\x28\x92\x13\x46\x19\xb0\x2f\xc1\xec\x4f\x70\xe0\xc5\x99\xad\x92\xf6\xe6\xd3\xa7\x8f\x7f\xfb\x1e\x4f\x6e\x35\x95\x12\x85\x56\xe8\x0d\x85\xb0\x4e\xe2\x2f\xea\xd0\x12\x60\x3a\xa0\x9f\x23\xa9\x50\x2b\x82\xa9\x29\xd2\xe9\xe4\xd3\x4b\x8c\xe4\x66\x0b\xc9\xf5\x10\x09\xe8\xc1\x2b\x72\x01\x1b\x1c\xf2\xc4\x59\x32\x22\x4b\x83\x33\xc8\x8d\x06\xfb\xcf\x51\x14\x74\x9b\xb1\xa8\xe8\x16\x8e\x8d\x53\x1a\x9b\xbe\xa2\x10\x09\x32\x64\x11\xa2\xd1\x9c\xf4\xe0\xf3\x66\xf2\x92\xde\x8e\xe0\x6f\x31\xd8\x4f\xe9\x69\xff\xbe\xfd\xd3\x65\x72\x22\x07\x49\x01\xbf\xd2\x1c\x7e\xa3\x32\x33\x80\x4d\xdc\x92\xe6\x25\xc6\x3a\x37\x7c\x84\x1d\xe8\x21\xa2\x08\x17\xc9\xf1\x01\x7d\x6b\x59\xd6\x27\x4f\xce\x00\x07\x72\x18\x41\x6c\x02\x65\x33\x83\xdc\xa4\xbc\x65\xd9\xd2\x1e\x42\x72\x7a\xfb\xf1\x2f\xe7\x1d\x50\x28\x83\x37\x71\x6f\x51\x46\x7e\x8c\x1e\xa3\x49\xe7\x0e\xe4\x66\xb7\xb1\x02\x6f\xd8\xed\x17\xef\xb3\x2c\x2f\xf0\x4d\x02\x3f\x7b\x52\xaa\x78\x7a\xa7\x90\xa4\x35\x62\x93\x6b\xba\xc5\x94\x75\xd1\xd1\x32\x18\x5e\x56\xe8\xc0\x1b\xaa\xfd\xe2\x81\xcc\xc2\x89\x3e\x79\x79\x3d\xd7\xa1\x71\x35\xad\xe5\x42\x41\xb2\xab\xf9\xb0\x29\x27\xe7\xc3\xc1\xb9\xf2\x48\x2e\x8d\x8b\x8b\x87\xda\xbe\xd0\x90\xb0\xdd\xc5\x43\xf9\xc2\x70\xb5\x07\x4f\x8d\x83\x2a\xd6\xf4\xc0\x31\x96\x62\x54\xfc\xfd\x0f\x3f\x25\xc5\x9d\x08\x47\xd8\x09\x3e\xe2\x4e\x50\xfa\xe9\xcd\xa7\xbf\xff\xe1\x27\x04\xff\xd3\x9b\x4f\xbf\x75\x7f\x5c\xbb\x13\x4e\xdd\xa0\x7e\x6e\xff\xf2\x3d\xf2\x73\x92\x55\x90\x69\x17\x8b\x9c\xc0\xbd\xa8\xa3\x12\x04\xa9\x1b\xde\xc0\x32\x80\x09\x22\x42\xa6\x91\x9f\x5e\xf6\xc5\x73\x4f\x44\x8b\x63\x02\xba\x6e\x69\x8b\x1c\xa2\xff\x57\xdd\x39\x1e\xb3\xa5\x67\x02\x0e\x2a\x09\x27\x4d\x9f\x4d\xe5\x2f\x06\x87\x07\xa8\xfc\x73\x65\x48\x65\x64\x88\x42\xf9\x4e\xb3\xa9\x6b\xc2\x55\xbf\x83\x04\x7d\xfb\x20\x06\xc8\xf4\x59\x5e\x66\x2a\xce\x80\x63\xe6\x83\x06\xf2\x7e\x8a\xee\x0c\xd9\x2a\xf0\xb7\xf3\xcf\x6c\x45\xf0\xf1\x25\x69\xab\xfe\xa3\x59\x17\x2c\x54\xfe\xad\xa8\x0d\x49\xcf\x9c\xf4\x7c\x37\x39\xd3\xbb\x2b\x75\x43\xb5\x1e\x50\x83\xc8\x2c\x45\xb8\xa5\x00\x7d\x00\x3d\x9d\x11\x71\xef\x30\x81\x2b\xe5\x00\x46\xed\xd8\x73\x65\xd9\x12\xb0\x93\xbe\x5a\x2f\x92\x95\x87\x7f\xae\x79\x7f\x4b\xea\x3c\x8d\xd9\x74\x83\xa3\x3e\x3b\xa3\x81\x5a\x57\x4d\xbd\x7b\xaa\xd7\x88\x7a\x1b\x79\x67\x71\x41\x19\xab\xbe\x2d\xef\xac\x6f\x55\xfb\x9b\x8e\x9d\x68\xdf\xae\x47\xa7\x97\x9e\xea\xe5\xe2\x50\x7c\xb0\xe8\x35\xbb\x8f\xdf\xa1\x06\x54\x97\xf3\xed\x2e\xf4\xda\x5b\xb9\x6c\xc6\x4f\xaa\x92\xb5\x35\xaa\x16\x93\xfc\xd3\x07\x14\x35\x33\x41\x15\x0e\xa8\x60\x68\x9a\xb4\x53\x2e\x83\xfa\xa2\xbe\xd1\x7b\xab\x84\xae\x75\xc9\x65\x78\x9a\xe5\xf2\x5c\x59\x9d\x43\x4b\xb2\xa0\xca\x3f\xbb\x72\x9e\xde\x1f\xa7\x4b\x83\x50\x51\x5e\xf1\x19\xc1\x47\x2b\x5d\x77\x7a\xc0\x1f\xcb\xbf\xac\x28\xbc\x16\x21\x71\x41\x76\x63\xa8\xa2\x15\x8d\x51\xff\xda\x79\x60\xcd\x9d\xda\x73\x0a\x67\x3a\x47\x6e\x0e\xe5\xd2\xcb\xca\xec\xad\xc2\x9a\x4e\x64\x6c\xcd\x9a\x2d\x4a\x44\x8c\xe5\x52\xee\xaa\x36\x98\x9f\x59\xf9\x47\x10\x5d\x81\x80\xcb\x1f\x1e\x82\x30\xe8\x92\x1a\x00\x83\xba\xa1\x60\x17\x72\x9f\x35\x6b\x6a\x56\x90\xf6\xef\xdd\x33\xe3\x6a\x81\xc1\x02\x91\x48\x5c\xe9\x07\xb1\x7d\x4b\xc4\x76\x85\xde\xb6\xfd\xf8\xe7\x33\xe9\x40\x3a\x0b\xa2\xab\x47\xb9\x82\x45\xfd\xa2\x9a\x52\xc3\x55\x8d\xd4\x50\x05\x54\x63\xd5\x70\x35\xd7\xc7\xd2\xf8\x86\xa5\x66\x8c\x40\x41\x27\x92\x97\xbc\xa4\x67\x9d\xa5\x50\xaf\x7c\x32\xa9\x5f\xe2\x09\xb4\x46\x0f\x31\x8b\x30\x91\xb7\x0a\x01\x69\xd2\x31\x89\xc6\x0c\xfc\x31\x81\xc2\x80\xbb\x19\xf4\xf0\x78\x4f\xc7\x5a\xde\x5a\x0b\xcb\xf6\xe4\xd8\x1e\xe2\x3e\x81\xdf\x96\x6e\xe5\x33\x19\x54\xb4\x57\x66\xe8\x9a\xfe\x35\xb1\x2b\x8d\xb0\x2f\xbd\x41\xbf\xce\x14\x5d\x82\xc4\x3d\x3b\x3d\xd5\x8b\x63\xba\x3f\x1d\xfe\x74\x12\x34\x6e\x49\xbb\x1f\xcf\x24\xb0\x92\xca\xa3\x09\x35\xf1\x21\x43\xda\x53\x13\xc6\xe3\x6c\xa9\x8e\xa3\xde\x7a\x13\x4e\x8c\x0f\x4f\xc7\xa7\x3e\x27\x96\xdd\xac\x49\x27\x0d\xcc\x8a\x47\xc3\xd3\x94\x12\xb9\x2a\xde\xb4\x35\x7a\x75\xab\xbc\x30\x74\xe8\x40\xad\x1e\x9c\x44\x54\x3d\xb9\x02\xb6\xac\xa7\xad\xd5\x2d\xad\xbf\xa8\x6e\xb3\x71\xb7\x0f\x5e\x43\x6e\xd6\x1d\xb4\x68\x8f\xdd\x51\xe0\xb5\x9a\xfc\x94\x08\xf9\x06\x22\x5c\x61\xbc\xc9\x1f\x68\xef\x01\xf9\xde\x21\xbd\x56\x49\xff\xf7\x4f\xef\x7f\x39\x97\x36\xac\x98\x8a\x4c\xae\x29\x36\xbe\xce\x4d\xae\xe3\x6e\x48\xb4\x6e\x9d\x71\x32\x94\xa2\x7b\x34\xea\x3e\x5e\xfb\x06\x79\x04\x27\x29\x84\x4a\x79\x7c\xc3\xd0\x21\xd7\x94\xa1\x4a\xf2\x25\x73\x83\xbc\x39\x66\x6e\x97\xaa\x9e\xde\x91\x37\xb9\x46\x6c\x62\x4d\xb7\xb0\xb7\xcb\xa3\x6e\x30\xd5\x69\x86\x6a\x9d\x1b\x26\xcd\xfe\x56\xed\x71\x06\xdb\x28\x8d\x90\x5d\x05\x1b\xaa\x6e\x6b\xc6\x09\x72\xed\xad\x2e\x14\x3b\xb8\x4f\xa8\xdc\x29\xc4\x4f\x5a\x49\xc9\x7d\x9d\xce\xde\xef\x41\xf5\xb1\xfd\xed\xcf\x1f\x7f\x79\xf3\x97\x8f\xef\x7f\xf9\xf5\xf3\x1f\x7e\x62\x7c\x83\x1e\xdc\x1b\xc6\x37\x4a\x35\x6f\x94\x1e\xa6\x7f\xbb\x37\xcc\xdd\xb5\x7f\x57\xfe\x7d\x2d\x0f\x2a\xd9\x6c\x67\x74\x8b\x09\x82\x3b\xeb\x8c\x8b\x59\xf6\xef\x42\xa6\x7b\xd9\x19\x5b\x04\x64\x4b\xd7\xac\x91\x1f\x3e\x4f\x37\xb9\x84\xbc\x1a\x39\xdf\x65\xbf\x78\x70\x2d\x3f\x6e\xc5\x50\x35\x3c\x2d\xc2\xab\xc8\x80\xf7\x87\x04\x21\xcc\xd8\xeb\x5b\x56\x87\xef\xf2\x61\xee\xff\x48\x2b\x47\x5b\x5d\x5a\x49\xe4\xc0\xd1\x6e\x9a\xae\x14\x81\xa2\xa5\x8e\xcb\x13\xf8\x38\x3f\xb9\xb7\xa2\xe6\xe0\xe2\x98\x5f\xef\x3e\xb4\xc8\xae\xb0\x8a\xbc\xae\xf1\xc5\xdf\x1a\xcb\xff\xd2\xfe\x9b\x0f\x49\x57\x82\xdb\x87\x33\xdb\x29\xb9\x43\x90\xb1\xc6\x2c\xeb\x61\xba\xc1\x7e\x70\x22\x98\xc6\x06\x79\xbf\x0a\x04\x46\xe1\x2f\x1e\xdc\x29\x08\xc8\xbb\x78\xe7\xa4\x7f\x1e\xdc\x89\x2e\xfd\x53\xc6\x1d\xdc\x8e\xc5\x78\x64\x1e\x6c\xe4\xff\xb2\xd2\x9c\xb0\x8e\x06\x7d\x47\x05\xc0\xb4\x58\x8c\x6a\x8a\x70\x2b\x2f\xd7\x29\xdd\x9e\xe5\x53\xd7\xce\xf6\x37\x68\xc9\x9a\xc8\xd9\xff\xf5\xf1\x53\xfb\xa7\x4b\x69\x59\xbc\x33\x98\x76\x98\x45\xda\x2f\xd7\xce\xba\xef\xd8\xba\x3d\x43\xd8\x21\x81\x8e\x0a\xf7\x4f\x82\x26\xa9\xaa\xc9\x43\xc8\x1b\xcc\x10\xd5\x0a\x13\xe9\x48\x9e\x25\xef\xf3\xe2\x4b\xd2\x04\xf0\x51\x35\x91\xc4\xdd\xb5\xcc\x99\xfa\x65\x05\xf0\x59\x44\xa0\xe8\x1b\x0f\xe1\xd9\x16\x2b\x14\x78\xd4\xd3\x86\x68\xaa\xcf\x56\x4d\xc0\x56\x7d\x7a\x0e\x01\x62\xac\xbb\x84\x08\x27\x0a\xcc\x36\x40\x90\xea\x29\x75\xd7\xa1\x15\xae\x1c\x3e\xcc\x5a\x6e\x09\x32\x1a\x0f\xc9\x0b\x53\x77\x9b\x59\xf3\x35\x17\xad\x41\x57\x67\xcd\x9e\x71\x6a\xc4\x8c\x26\xd2\x0d\xb1\xbb\x96\xcf\xc0\x1b\x07\x1c\xeb\x00\x8e\xb4\x4c\x67\xca\xb5\x3c\x2e\x06\x2d\x19\x6a\x62\x2d\x55\xdb\xc4\x47\x8c\xd1\x90\x8d\x57\xc3\xda\xbc\x27\xf2\x0c\x35\x6f\x67\xd4\x43\x81\x78\x4c\x36\x8f\x24\x45\x7a\xa0\x70\x08\xc0\xee\xb9\x44\x04\x16\xfb\xb9\x0e\xde\x67\x1d\x55\xa3\xa3\x2a\xcb\x82\x9c\x8c\x61\xd6\x42\xba\xc5\xc5\x10\x4d\x50\xe3\xda\xa9\x8a\xc9\x42\xc2\xcd\x89\xf6\x7a\x08\xd8\xf5\x67\xb7\xec\x2d\x44\x57\x88\x27\x6c\x96\x23\xd5\x93\xe3\xd3\x07\x9b\x4b\x16\x7a\xd6\x09\xf6\x28\x8d\x0b\xda\xba\xde\x59\x5b\x23\xe0\x12\x48\x27\x13\x3f\x7d\x88\xda\xc3\x8e\x78\xb0\xdc\xdd\x14\xac\x99\x72\xed\x24\x03\xaf\xc6\xdb\xd4\x59\xcc\x86\xb0\x17\x91\x16\x34\x68\x8d\xd7\x32\x71\x7c\xb3\xa9\x84\x1e\xc5\x0b\x18\x9f\x61\xbd\xd6\x89\xd4\x55\x9e\xd0\x95\xb0\x07\x0f\x31\x9e\x5c\xfd\x3f\xd8\xc9\x3f\x17\x3b\xd9\x9d\x1a\x29\xeb\xf4\x0c\xe5\xfc\xe6\xf6\x6c\xa1\x0a\x16\x50\xcf\x40\x2c\x30\x5b\xc0\x2c\x54\x71\x22\x15\xad\x8b\x1a\x4f\xbb\xb7\xc0\x1a\x85\x8b\xc2\x83\x92\x05\xc2\xf2\xb7\x4a\x30\x93\xd8\x6c\xcb\x52\xba\x87\xa0\x13\xe5\x34\x94\xda\x0d\x1e\x78\x03\xfd\x3e\x7d\xb0\x5d\xe2\xef\xeb\x98\xdd\x3b\xe5\x62\xbb\x05\x17\xb3\xe0\x3b\xda\xb8\x8a\x0d\xfe\x7e\x60\xf1\xb1\x52\x7e\x95\x76\x54\x81\x0b\xa6\x5c\x3b\x1a\x08\x64\x1c\x64\xde\x07\x70\xa9\x41\x06\xa7\x79\xcf\x7c\xda\x50\x25\xc3\x55\xae\x1d\x3f\xee\x8a\x59\xc3\x3b\x58\x53\x83\x69\x75\x87\x0c\x2e\x69\xf5\x9b\x65\xf3\x84\x03\x68\xb3\xa7\x4d\xb1\xe0\xc9\x3a\xf0\xa7\xa5\xce\x9b\xbd\x81\xaf\xcb\x8b\xc6\x95\x9e\x60\x3a\x88\xa8\x10\x69\x3b\x42\x48\xea\x78\xd3\x53\xb3\x09\xea\x40\xdf\x5f\xfb\xbb\x5d\x80\x27\x61\x77\x2d\x85\xaa\xf4\x1e\x34\x4f\x65\x82\x14\x0e\x11\xd0\x3f\xab\x4b\x8a\x74\x2f\xca\x55\xca\xf8\xac\x54\x2b\x3f\x58\x59\x87\xd4\x8e\x08\x44\xbb\xd3\x45\x9a\x00\xd9\x9f\x68\x06\x41\x76\x16\xb2\x59\x34\xda\x06\xa8\x7c\xed\xbb\x18\x80\xec\x4c\xb9\x76\x2b\x46\x0f\x38\x13\xee\xdd\x46\x53\xb1\xea\xa5\xea\xdc\xc8\x85\x75\x24\x1d\x85\x52\xe2\x80\x4d\xeb\x92\x4e\x4e\xed\xf4\x6c\x75\x16\x67\x86\x06\x62\xd0\x42\xeb\x0c\xcc\x5a\xae\x9e\x58\xd2\x90\xa8\x4c\x4f\x2f\xfd\x6e\xd1\x09\x43\x90\xa2\x85\xa4\xb8\x12\xc8\xdd\xb5\x53\x5f\x40\xb7\xea\x92\x7c\xaf\x11\x16\x9c\x94\xc5\x79\xcd\x9d\x55\x58\x70\xea\xf2\x68\x55\x87\x08\xc1\x95\x34\x7d\xa7\x4a\xe2\xac\x09\xd9\x37\xf3\x98\x88\x02\xba\xc4\xc6\xef\x96\x8d\x66\xa0\xa8\x3b\xea\x9e\x75\xcb\x5d\x7c\xaa\x72\xbd\xf4\x9a\x22\x60\xdc\x2c\x87\x8d\xa2\x82\xdc\xa7\xdd\x6c\xa4\x95\x1a\x74\x8d\x6a\x8b\xa6\x33\x64\x46\x54\x79\x83\x9f\xf7\xd7\xe4\x14\x8f\x05\x78\x15\xce\x41\x42\xce\xf7\x32\x0d\x5d\x70\xb7\x2a\xac\x77\x78\x33\xcd\x65\x47\xf0\xe9\x50\xd5\x8c\x3b\x91\xa4\x4c\x18\x4e\xf6\x6d\x09\xfd\xdd\xcb\xa2\xb8\x8f\x2e\x4e\xaf\xdc\x8e\xdc\x7e\xb0\xaa\xdf\x07\xab\x6a\x45\xa6\xe2\xdd\x2c\xed\xb7\x25\xe0\x60\xa5\xf9\x0a\x22\x10\xbb\x6b\x27\x61\xab\x49\x41\x51\x6f\xb9\xbb\xf6\xad\xab\x02\xf8\x53\x1e\x74\x22\xc4\xa5\x70\x8b\xbe\x72\x6d\x60\xdf\xeb\x59\x7a\xce\x79\xce\x4d\x2c\x3d\x7f\x6c\xdf\xff\xe9\xc2\x81\x6a\x59\xb8\x1c\x47\x96\xda\x6c\x92\xb0\x3a\x3f\x89\x04\xf2\x8d\xdc\x3c\xda\xcd\x54\xa5\x88\x9a\xaf\xf1\xf8\x1a\x95\x14\xb2\x14\x46\xa5\xf5\x15\x3c\x7d\xb0\xce\xf4\x2e\x1d\x5d\x7a\xca\x51\x62\x3f\xd5\x2e\xd7\xc2\x06\xe1\x12\x4b\xc1\x23\x33\x1f\x5b\xd9\x93\x1a\x3f\x0d\x97\x38\xc8\xea\xbe\xa6\x53\xa2\xbe\x8d\x3a\xd5\x57\xf0\x42\xa7\x48\x1d\x93\xd2\x6a\x0e\x06\xba\xe1\xf9\x17\x7b\xd5\x50\x05\x01\xaf\xe8\x16\x25\xe0\x3c\xb6\xd1\x97\x0a\x5e\xe8\x95\x88\x85\x01\xfc\x2d\x48\x29\x97\xf6\xde\x6c\x32\x50\x5e\x90\x5b\x06\xde\xb1\x82\xf0\xca\xa5\x1a\x94\x63\xc4\x13\xd3\xe3\xc1\xf1\x66\xfe\x76\x29\x78\x0d\xa9\xbd\x04\x94\xf9\xe5\x38\x23\xb8\x78\x75\x2b\x65\x43\x5b\xbe\x6c\xc3\x39\x6b\xfb\x6d\xf2\x3c\x65\x59\x67\x71\xd1\xc8\x43\x14\x16\x7f\xf5\x48\x26\x48\xf9\xb1\x46\x2e\xe3\xe9\xda\xf7\x7f\xf9\xef\x8f\xbb\x4f\x17\xec\xcd\x6a\xd6\x53\x9b\x7f\xdc\x53\xc3\x54\xc7\x26\xd6\xb9\xf1\x75\xdc\x14\x87\x70\xb9\x94\xb6\x78\x13\x20\xe4\x86\x09\x18\xe5\xa1\x3c\x1b\xba\x14\xd1\xb0\xab\xb5\xb8\xd9\xb3\x12\x1a\xc4\xd8\x04\xb5\x4e\x4f\x9e\x75\xd5\xaf\x96\xf8\x5d\xf6\x17\xd9\x36\x81\x9d\x19\x19\x25\x48\xd1\x99\x7d\x2d\x1b\xf1\xf8\x04\x22\x6a\xe7\x6a\xe1\x92\xcb\x8f\xb0\xd2\xc2\x1a\x14\x89\xe6\xe9\x1d\xe9\x59\x15\x35\x5a\x01\x30\x03\xf3\x71\x4b\x66\x36\xb1\xc6\x30\x72\xe8\x42\xa9\xa4\x89\x7b\xa9\x79\x37\x79\xbd\xfc\x78\xd0\x61\xaf\x3f\x7f\xc6\x2e\x45\xed\xf1\xf0\x59\xfe\xbc\xcb\x93\xe4\xe5\x4a\xd2\xa3\x95\xb8\x97\x2b\x21\x7a\xb4\x12\x7f\x45\x25\xe1\xd1\x4a\xc2\xda\x73\x72\x9d\xf1\x75\xe5\x39\xba\xce\xb2\xb4\xf2\x9c\x5d\xe7\x5a\xb0\xf2\x1c\x5e\x77\xe0\x7f\x89\xb5\xb0\x88\xd3\xf7\x70\x80\xcb\xe7\xa4\x53\x98\x02\xb9\xbb\xb7\x70\x17\x8f\x72\xe0\x68\x33\x71\xaf\x30\x5d\xa3\xef\xb0\x2b\xfa\x6b\xc6\x84\x2b\x45\xe7\x59\x74\x4e\xbb\xf7\xba\x7b\x09\xb2\xc8\x1d\xf3\xf1\xeb\x1a\x74\x47\x7f\xc3\x85\xfe\x5e\x52\x1a\x6e\xae\x28\x9e\xd4\x1c\x2e\x11\x5e\xbf\x43\x13\x60\xdc\x39\x70\xde\xb8\x01\x33\xd9\x3a\x40\xb4\xbc\x71\xe0\x82\x71\x47\x83\x04\x3a\xf3\x85\x77\xf0\x0f\x16\x93\xe1\xdd\xc4\x77\x76\xcf\xe0\x5c\x13\x40\x73\x7d\xb3\xe8\x80\xdc\x87\x55\x3b\x08\xdc\xed\x8f\xce\x8d\xbf\x32\x78\xa0\xba\xe4\x59\xd4\x13\xff\xa4\x0e\x5c\x41\x5d\x54\xaa\xe2\x7b\xa0\x5e\xb1\xc3\x2f\x4c\x93\x5f\xee\x9c\x67\xc0\x8d\x4e\xe2\x1d\x29\x6d\x66\x71\x4e\x2a\x4a\x04\x83\x55\x69\x63\x93\x6e\xef\x31\x01\xe6\xdd\xcc\x43\xe2\x05\x7e\xe0\xbe\xf2\xbc\x5f\x5e\x6d\xeb\xce\xd3\x35\xc6\xba\x47\xd6\xe8\x5d\x3e\x1c\x73\x27\xff\x7f\x7d\xff\xe9\xe7\xbf\xed\xda\xf6\x3c\x86\x27\x99\x50\x4f\xf2\xc7\x9b\xd4\x4c\xa3\x1b\x0c\xd5\x4c\x33\x8f\xf4\x34\x4e\x59\x4a\x26\x3c\xbd\x73\x26\xd5\x4c\x07\x0f\x55\xaa\x89\x21\x1d\xac\xab\x89\x0e\xae\x46\x27\x7f\xa2\xfc\xe9\x9e\x3e\x54\x26\xca\x6b\x41\x5f\x4b\x90\x49\xad\x01\xb1\xa6\x78\x70\x90\x34\x46\x64\xb8\x87\xdd\xbd\x04\xb9\xbb\xd3\xdd\x70\x05\x60\xd9\x50\x6a\xc8\xe9\xd7\x04\xd4\xc8\xd4\xba\x72\x63\x6f\x11\x82\xdc\x70\x0d\xb1\x36\x6b\x2d\xc9\x5d\x1d\xa7\x0a\x12\x9c\xf6\x36\x3c\xd2\x0d\x75\x62\xaa\xc0\xa7\x1d\x83\x4f\x86\x8b\x71\xab\xd8\x44\xd5\xbc\x96\x69\x32\x7c\x4d\x92\xd7\xd1\xb5\x08\xe8\x2d\xdd\x31\x6f\xe8\x81\xd3\x6a\xa3\x77\xad\x8b\xf5\x45\x4d\xe8\xcb\x7b\xad\x3d\xe2\x94\x3d\x71\x5d\xbb\x4a\xe4\x98\xdb\x24\x9d\xb7\xe0\x48\xd7\x48\xa3\x29\xa6\x67\xae\xa6\x10\xd8\x4a\x43\x97\xab\x47\xa6\x9f\x20\xa6\x45\x4c\x2b\x50\xba\x8f\x1a\x44\x42\xdb\xcc\xce\xab\x8f\xec\xd2\x19\xf4\xdf\xd2\x62\xbd\x57\xf5\x58\x55\x2e\x3a\xcb\x77\x2f\x58\x1a\xd7\xe1\xb0\xb2\x44\x92\x06\x0e\xba\x3d\x3d\x7d\xc0\xca\x54\x35\xf5\xbf\x92\x0d\x32\x7e\x55\x1d\x1b\x0c\x75\x3e\xb8\x7d\x6a\x30\xec\x69\xfc\x07\xcb\xae\x26\xc3\x8c\xb4\x4f\x4d\xea\x1e\x76\xff\xae\x22\x8b\x1c\x99\xe3\x39\x98\x4c\x4d\xa1\xe3\xa6\x6d\x70\xe0\xe3\x66\x96\x9c\xea\x08\x23\x8e\x22\xb7\xdd\x33\x82\x1d\xaf\x5b\x61\xd8\xee\x77\xd7\xfd\xa6\x39\xdf\x9d\x0e\xbb\x97\xfa\xa4\x79\x97\x5c\x96\xd9\x45\xf0\x28\xa2\x18\x1b\xbd\x74\x52\x69\xf7\xc2\x8a\x12\xd5\xc4\xa4\xcf\x40\xd4\xcc\xe9\x4b\xfe\xfd\x02\x6c\xb3\xab\xfe\x15\x29\xee\xe5\x13\xd8\x57\x14\x38\x4f\xbb\xd6\x2c\xa2\x4a\xdf\x7f\x5e\xc4\x94\x0e\x06\x11\xaf\x06\x91\xa3\xe5\x27\xdf\x65\xd2\x3a\xc5\x82\x66\x55\x20\x3d\x58\xc7\x45\x53\x66\x57\x47\x78\xb0\x8e\x8b\x96\xcc\x52\x07\x55\x0f\xd6\x71\xd1\x90\xd9\xd5\xe1\x1e\xac\xe3\x0a\x3b\x66\x7a\x30\x7c\xf0\x1a\x2b\x26\x3d\x58\x47\xbc\xa2\x8e\xf0\x60\x1d\xe9\x0a\x73\x61\xf5\x60\x1d\xf9\x8a\x3a\x1e\x0d\xe7\xc4\xea\x85\xd8\x7c\xaa\xc7\xf2\x4b\x30\xae\x99\x72\xd1\x53\x21\xf4\x6e\x1a\x42\xdf\x39\x38\xd7\xa9\x71\x35\xdd\x92\xee\x1f\xd7\x66\x10\x0f\x9b\xbc\xef\x60\x18\x0f\x5b\xbc\xef\x60\x20\x0f\x1b\xbc\xef\x60\x28\xf7\xda\xbb\x1f\x60\x30\xf7\x9a\x93\x1f\x61\x38\xf7\x9a\x74\x1f\x61\x40\x57\x59\x77\x57\x66\x48\x97\xea\x4c\x37\xd4\xb9\x56\x8c\x6a\xbe\x46\x70\x44\x6f\xd2\x81\xf6\x09\x42\x58\xa6\x01\x4c\xd9\x9e\x0b\xa0\xb8\xc8\x17\xaa\xab\x0e\x6b\x52\x27\xb2\x32\x15\x3e\xd7\xab\xf7\x13\xc9\x12\x92\xc8\xa9\xb7\x33\xd4\xd3\x76\xe1\xae\xca\x7b\xfa\xf4\xc5\x94\x6c\xbc\x59\xcb\x5e\x6b\xcf\x79\x87\x6c\x48\x63\xf7\x8a\xb8\xde\x9b\x88\xab\xd1\x0f\x91\xd2\x8f\x3f\x68\xf4\x23\xed\x4b\x38\xb7\x94\xe0\x35\x9a\xa1\xb7\x24\xfb\x2e\xb8\xbb\xff\x85\x61\xf2\x8b\xc6\xbf\xd2\x4a\x47\x03\xc7\x23\x00\xdf\xa4\x7d\xec\x48\x4b\x53\xb0\x0d\x86\xfb\x94\x6d\x58\x8d\xb4\xba\xfa\xbe\xea\x20\x7e\xb7\xa6\xfa\xff\xf8\xf9\x4f\x1f\x2f\xa0\xff\x1a\xa7\x29\xb6\x17\x10\x2c\xd4\x2a\x30\xb7\x07\x97\xf7\x16\x79\x83\x68\x70\x40\xb9\xa9\xa0\x8a\xaa\x98\x1e\x81\x6f\xd4\x2f\x1a\xd3\x2e\x9b\x5e\x0d\xf6\x36\x99\x0c\x55\x77\x29\x53\x99\x01\xd9\xe6\x3d\x72\x6b\x3d\x78\x27\xc5\xa7\x59\x92\xe7\xaa\x4d\x36\x42\xbe\x05\xeb\x79\x09\xfa\xfb\x7f\xff\x72\xa9\xd3\x95\xa6\x4b\x41\x40\x27\x5d\xd3\x8e\x5a\xe9\xe8\x38\x9b\x34\xe9\xc0\x6c\x35\xb8\x07\x59\xe3\x8d\xaa\x13\x00\xe3\xb4\x8d\x9d\x1f\x2a\xba\x3d\xf2\xee\x54\x87\x4d\x36\xa3\x51\x31\x93\x0e\x7b\x8d\xf1\xa5\xdd\x68\x78\xad\x87\x2a\x58\x69\xe4\x63\xc0\xc7\x7f\x7c\xfe\xf4\xf1\xd2\x09\x8d\x2b\x40\xa6\x4d\x00\x9f\x76\x4e\x83\xb8\x8e\xa7\x6b\x5e\xfe\xdf\x5b\x0c\x9b\xc9\x13\xa3\x31\x6c\xe9\x40\xbc\x23\xf0\x86\xa0\x0f\xc7\xf3\xa6\x6a\x28\xd4\x11\x30\xeb\xd2\x3a\x78\xf0\xb3\x4f\x83\x42\x27\xd7\xe4\x17\xf5\x99\xae\x3e\x59\xfe\xc8\x7b\x4b\x0d\x65\xf0\x6e\x54\x45\x31\x71\xeb\xaf\x1a\x2b\x20\x3d\x10\x8c\xc6\xf5\x06\xf0\x4a\xfd\x86\x09\xfc\xc1\x4e\x9a\x26\x8d\xf3\xa6\x3a\x38\xf0\xee\xe9\x83\xf6\x2b\x6e\xa6\x8f\x99\xb4\x4b\x4d\x06\xa4\x1a\x53\x3f\x1c\x2e\x19\xd7\x87\x4d\x29\xb2\xa8\x94\xbe\x9a\x9f\x96\x02\x7f\xa3\x07\xf7\x2a\x3d\xdd\x13\x04\x4d\xa0\x18\x8c\x5e\x26\x96\xcf\x16\x9c\x93\xfe\xbc\xd4\x57\x11\x1a\x86\x13\x21\xe5\xcb\x5f\x94\x12\xfc\x59\x97\xdc\x1f\xa7\x43\xd7\x9c\x0e\x4d\x2c\x92\x08\x99\x2c\x50\x38\x60\x00\x5e\x9b\xd8\x92\x10\xf0\x1c\xd6\x84\x95\x6a\x2e\x53\xd8\xde\x83\xa7\x79\xd8\x86\x81\x14\xbe\x02\xc1\x1d\x2c\x9e\xc3\x3e\xff\x4e\x8f\x87\x1e\x60\xef\xdf\x2c\x07\x5f\x43\x78\xfd\x9a\xac\xd7\x81\x47\x1b\x21\x9d\x27\xef\x95\x59\xe6\x8f\x23\xa5\x6f\x91\x55\x4e\x52\xa1\x59\xa9\x30\xbf\x06\x45\x9c\xe2\x69\xdf\x8f\xde\xf2\xaf\xef\xdb\x9f\xff\xf8\xf3\xaf\xbf\xbe\xff\xe5\xcf\x9f\xcf\x0b\xb1\x0a\x13\xaf\x31\xa2\x3b\x54\x44\x49\xe8\x63\x88\x2d\x44\x4d\x37\x4d\xad\x45\x08\xc9\x82\x7f\x2e\x39\xaa\xc9\x95\x3c\xd5\x2e\x59\xa0\x2c\xaf\xb5\x10\x93\x08\xf3\x6e\x59\x86\x82\xce\x73\x6c\x55\xd6\x57\xe5\x68\xf1\x8e\x82\x24\x83\x56\xe3\x3c\xc4\xb0\x8b\x90\x64\x47\x4b\x6e\xb4\xdd\x01\x53\xab\x55\xa2\x4c\x17\x2a\xea\x80\x5c\xfa\x22\x10\x2d\xc4\xa8\xc9\x49\x17\xc5\x23\x42\xd2\xaf\xa3\xc1\x42\x40\x51\x08\x28\x1e\x3b\x1a\xb5\x78\x6d\x62\x07\xae\x3c\x6f\x61\xe8\x1b\x28\x9a\xcb\xa9\x6e\x1a\x04\x4e\x5b\x8c\xc2\x1d\x09\x77\x11\x82\xd3\xd4\x50\xfd\x1b\x8c\x10\x5d\xab\xcd\x07\x17\x17\x3d\x28\xc1\x8f\x88\x07\x9a\x3f\x32\xdd\xa3\x16\xc1\x67\xf9\x74\x7a\x76\x5b\x19\x2d\x5a\xfa\x27\x0c\x42\xd1\x3d\xa7\xad\x33\x5d\xeb\x62\xab\x29\xa9\x4e\xb4\x5f\x9f\x02\x49\x15\x32\xa9\x31\x3d\x03\xb1\x0c\x9b\x8b\x40\x10\x09\x28\x6f\x89\x0c\x97\x3c\xef\x8b\x6f\x51\x83\x18\x17\x23\x6f\xca\xac\x24\x6a\x0b\xd0\x82\x97\x62\x9d\x85\x4a\x06\x40\x48\x08\x64\xda\xb3\xf4\x4b\xa1\x7e\x97\x6d\x0a\x42\x16\x3d\xe1\x9c\xea\x96\xcc\x4c\x92\x9e\x67\x9d\x9b\xff\x01\x14\x4a\x71\x4a\x96\x21\x6f\x99\x35\xdc\xe9\xd4\x88\x2a\x59\x3c\x7d\x10\xd2\x36\x08\x81\x4b\x9a\xb8\x40\x16\x90\xc0\xd1\x2e\x98\x81\xbd\xe8\xa7\xb9\x95\x49\x56\xd4\x89\x92\x62\x1d\x35\x07\x11\x5a\x1d\xb9\x5d\x90\x31\x0e\x03\x1c\x83\x45\x20\x70\xf2\x8d\x23\x85\xa1\x08\x6c\x14\x4f\x4e\x56\x9a\x4c\x95\x56\x58\xc9\x22\xd2\x1a\xe5\x7b\x05\xc6\x3e\x66\x12\x20\xb4\xa5\x04\x5d\x1c\xc2\x56\x5d\x0f\x2f\xab\x3f\x2c\x10\x59\xe0\xb4\x19\x5a\xaa\xc0\x11\xd1\x50\xd8\x62\x52\x94\x0d\x36\x18\x0c\xf9\x86\x58\x06\x43\x6e\x32\x54\xa9\xd5\x04\xf3\x0e\x77\x5e\x8a\xf4\xc7\xb8\x6c\xf0\x32\x2a\xc4\x5b\x4c\x1a\xca\xda\x5a\x4d\xe7\xeb\x95\xc5\x3a\x83\x1a\x1e\x6e\x80\x15\x20\x63\xde\x62\xd9\x87\x82\x05\x2f\x93\x8d\x3a\x88\xd2\xc5\xbd\xce\x0f\x04\x32\x64\xc0\x09\x33\xd9\xcc\x46\xca\x50\x04\xd9\xdf\x5b\xe0\x82\x69\x21\xdc\x1c\x8b\x33\xac\x56\x59\x46\x7d\xa7\x99\xd5\x46\xe9\xd5\x74\x56\x08\xdb\x32\x5d\x25\x3a\x34\xdc\x6c\xf3\xb8\x94\xdf\xa3\xa4\xb8\xee\x43\xf6\x50\xb7\x85\x2a\x19\xb7\x71\xb2\x01\xbb\x12\x66\xaa\xdb\xee\xf1\xe5\xa7\x0f\xb2\xaf\xb8\xb0\x23\x4d\xd3\x53\x50\x75\x34\x0c\x4f\x16\x96\xfc\xde\x90\xc6\x7e\x8f\x12\x79\x96\xaf\xc3\x6d\xd6\x8a\x8b\x18\xdc\xa8\xd0\x47\x8c\x75\x68\x7c\x4d\xe1\x10\xbb\xc0\x30\xc3\x70\x04\xd0\x15\x9e\xd1\xf8\x19\x7e\xf4\x18\xa8\xd8\x19\xdf\xf0\x3c\x25\x15\xca\x8c\x0b\x17\x13\xd2\xa8\xd2\x46\xb8\x84\xd1\x4b\x47\x05\x5d\xd5\x37\x05\x18\x7e\x2f\x13\xb1\x82\xe2\xfc\x63\xbf\xfd\xb1\xdf\xfe\xd8\x6f\x7f\xec\xb7\xbf\xef\xfd\xf6\x5a\x20\xed\xab\xf7\x30\x84\x14\xb7\xc4\x86\x5f\x7d\x87\xba\x16\x3d\xfb\x9b\xd6\xf6\xaf\xe9\xcb\x19\xfc\xec\x1f\x7b\xd7\x8f\xbd\xeb\xc7\xde\xf5\x63\xef\xfa\x27\xde\xbb\xee\x3b\xad\xf8\x56\x55\x96\xfb\xdc\x15\xcf\xec\xc3\x42\x13\xbb\x20\x33\x1c\x46\xb4\x10\xbe\x80\xe6\x78\xaf\x0f\xe4\xc4\xa5\xcb\x6b\xa8\x3b\x41\xc4\x5d\x34\x43\xe4\x97\xc5\x03\x42\x92\x16\x4d\x34\xe4\xee\xfd\x87\x12\x00\xbc\xf2\xa1\xd6\xe9\x14\x00\x97\x13\x8b\x79\x3f\xb2\x0c\x24\x88\x69\x47\x8a\xc1\x35\x64\xa5\x53\xdb\x80\x8f\x77\xd8\x06\x22\x60\x50\x46\xb0\x21\x61\x7e\xd4\xa3\xb3\xa2\xe9\xeb\x5d\x29\x98\xc9\x6b\xaa\x22\x17\x5b\x2b\xec\x52\x36\xd0\x4a\x36\xe9\x6a\xd8\x62\x15\xc3\xd8\x61\xab\x4c\x29\xec\x84\xef\x0e\x08\x63\x50\x45\x0b\xce\x6d\xb9\x52\x4f\x9d\x08\x71\xf6\xdc\xc9\xbe\xa3\x52\x88\xf0\xb3\x4d\x4f\x29\x2a\x71\x85\x6c\x50\x36\x91\x80\x96\x66\x9f\xe9\x0e\xe4\xf7\xcb\xfb\x5e\x53\xba\x2b\xe8\xed\x40\x76\xea\x27\xe4\x20\xa0\x56\x43\x16\x17\x6d\xe8\x9a\xa0\x72\x88\x73\x8b\x2e\x80\x73\xad\x32\xbd\x71\x99\x9a\x42\x4f\x9e\x58\x32\x32\x2e\xd3\x8f\x28\x00\xfb\xc3\xb4\x79\xa6\xdc\x6d\xcb\xfb\xc7\xae\x76\x25\x49\xf3\x84\xcd\xce\xbe\xd1\xea\xb7\x98\x0d\xcf\x4b\x2b\xed\x16\x71\xdd\x2e\xa6\x45\x76\xe9\x0c\x3e\xb6\x65\x28\xa6\x1f\xea\x28\xed\x97\x77\xa5\xd9\x6d\x19\xee\x63\xeb\x50\x37\x16\xaf\x15\x65\x83\x8b\x36\xd8\xd2\x08\xe7\x75\xa7\x5f\x34\xde\xea\x10\x29\x6d\xa4\x45\x23\x0b\xed\x70\x6e\x0b\x69\xcd\x07\x4b\xe6\x53\x36\xc9\xc4\x9b\xc9\xa3\x11\x55\x3e\xc9\x16\x10\x0d\x25\xc0\xbc\x51\x90\x8f\x0e\xe9\x03\x0b\x5b\x21\x07\x29\x98\xf1\x83\x8e\x97\x77\xdf\xdc\x92\x39\xee\xc7\x22\xf9\xb1\x48\x7e\x2c\x92\xd5\x0e\xea\xa7\xfb\xe3\x2d\x56\x87\x3b\xf7\xbe\xab\x8e\xe4\xbf\x6d\x63\xc3\x4b\xfd\xe0\x6b\x0d\x0d\xab\x9d\x8f\xe3\xcd\xbe\x3e\x3f\xb8\xe5\x0f\x6e\xf9\x4f\xc8\x2d\xef\x89\x5b\x3e\xc3\x2b\x1f\xd1\x0c\xef\xe6\x9d\x2f\x03\xf8\xbe\xac\x10\x86\x93\x0a\x21\x6d\x16\x5a\x51\xf7\xfa\x8d\x4d\x99\xe8\x82\x13\xff\x9c\xff\xfc\xdb\xc7\xff\xda\xfd\xb6\xf9\xf4\xe9\xe3\xdf\xce\xfb\xe7\x14\xf4\x76\x0c\x9a\xf4\xe1\xe8\xf5\xae\x49\x22\xc8\x6d\xc9\x43\x24\x43\x54\x47\x48\x3c\xcb\x6c\xa8\xcf\xb6\x44\x86\x84\x1f\x4d\x32\xbe\x52\xc9\xf8\x4a\x19\x3c\x1b\xba\x05\x4a\xf2\x72\x5e\x64\x06\x72\x9a\xb6\xda\x8f\xda\x52\x4c\xc3\x11\xb7\xea\xf5\x25\xdb\x90\x90\x24\x4d\x93\x2d\x16\x97\xb0\x96\xe5\x65\x86\xc8\xd3\x80\x8a\x62\x0c\xde\x06\x6d\x39\xb5\x01\x10\x4d\xd0\x6d\xea\x18\x4f\x70\xac\xfb\xd6\x63\xf4\xa9\xd3\xff\xdf\xde\xff\xfa\xbc\x3f\x3b\x1f\x1e\x22\x1a\x74\x35\x55\x8a\xb0\x42\xb5\xdc\xd8\x66\x69\x58\x02\x8a\x23\x20\xdc\x64\x02\xa4\xb0\x2d\xec\x84\x8d\x66\x2b\x41\x37\x9b\x07\xe9\xd7\x83\xa3\x3f\x24\x92\xe4\x79\xf4\x23\xaf\x1e\x61\x4f\x69\x9d\x90\xee\xcb\x47\xfe\x51\x13\xcf\x47\xcd\xda\x33\xa1\x82\x21\xb3\x31\xa1\x21\xae\xd1\x1f\xa8\xd6\x5f\x5b\x0a\xe0\x85\xd3\xc5\xf9\x00\xcb\x45\x33\x1b\xdf\x32\xcc\x17\x83\xf3\xab\x12\x08\xc9\x0f\x0e\xf3\xa5\xe0\xfc\x30\xaf\xe2\x81\xe0\xfc\x29\xcb\xf9\xf8\xb1\xbd\xc0\x6b\x2a\xa1\x6c\x0c\xd3\xe4\xdc\x87\xb0\x9b\xa6\xe7\x76\xe3\xdf\x16\x1b\xf4\x63\xce\x24\x65\x3c\x7d\xb0\x20\xfb\x40\xa8\x31\x80\x53\xbf\xda\x3d\xc3\xcd\xc1\x38\x17\xa4\xb5\x58\x20\x33\x93\xa1\x0c\x41\x97\xde\x38\xf6\x48\x21\x91\x4c\xda\x5b\xdf\x04\xa8\xfc\x38\x94\x90\x8c\xab\x91\x21\x89\x84\x2b\x54\x26\x97\xae\x2b\x64\xe4\xe5\x26\xd5\x51\xb6\xb2\xe3\x18\x40\x44\x3d\xd3\x80\x02\xd3\xcc\x93\x67\x94\x21\xe2\x35\xd0\x24\xb2\x3f\x8e\x9a\x38\xea\x83\xe2\x92\x84\x7d\x6a\x52\x8d\xee\x49\xd1\x52\x62\x4d\x74\x40\xc8\x5c\x33\x15\x00\x26\x4c\xf2\x0b\x5d\x83\x51\x7e\x31\xf8\x6d\x04\x6f\xb0\xda\x13\x6e\x0b\xc2\xc9\xa3\x29\xfc\x07\x0a\x0f\xe0\xca\x32\xd7\x44\xc9\x3d\x95\xc3\x88\x08\x3d\xcc\xc9\xf0\x2e\x4f\x72\x34\x84\xe3\xd4\xe9\x06\xc7\xd4\xa7\x07\x18\x9a\xa9\xf1\x90\x5f\x1c\xde\x5c\xd3\xb5\xc6\xc5\x97\xec\x26\xdf\x18\x6d\x61\xd4\x18\x4a\x3f\xc3\x89\x5c\x62\x5e\xb2\xbb\x4c\x65\x44\x46\xb1\xbd\xc2\xd5\x98\x52\xbc\x60\x20\xff\xf5\xfe\x97\x3f\x7d\xfc\xdb\xdb\xf6\xe3\xe7\x9f\xcf\xa7\x25\xc8\xaa\x04\xa5\x36\x02\x65\x2b\x97\x59\x74\x64\xd9\xcc\x35\x61\x11\xf8\x6c\xb0\x92\x46\xe6\xe5\x7b\x85\xdd\x77\x2f\x25\x7d\xc3\x90\x3f\xbe\x37\x4d\x5f\x8f\xba\xc3\x3a\xd4\x6a\xcd\xb4\xda\x21\xda\xf0\xb1\xa0\xc8\xd2\xfb\x77\xbb\xbf\x9f\x67\xa1\x51\xb6\xfb\xbc\xb7\x54\x8d\xad\xe7\x86\x1a\xf2\x53\x1a\xde\x8f\xdf\x28\x34\x8c\x63\x62\x2a\x05\x3d\x7d\xb0\xc2\x51\x43\x83\xb8\xa7\xaa\xb9\x31\x8f\xfd\x99\xf6\xbf\xff\xe5\x42\xfb\x0d\xc5\x3a\x8f\x68\x4b\x64\x33\x8a\xe3\x1b\xe6\xb1\xa8\xca\xd2\x88\xff\xf8\xf9\xf3\xaf\x1f\x3f\x9d\x27\x22\x4a\x4a\xac\xd3\x41\x3c\xd0\x9e\x1a\xac\x6a\x4a\x1a\x6f\x1c\xe4\xf7\x7c\x10\xab\x69\xe0\xf8\x4d\xf8\x24\x17\x99\x15\xc9\xe6\x98\xe6\xb3\x1a\xe6\x01\xd9\x8b\x06\x85\x29\x8b\x10\x16\x9f\x0c\x05\x8d\x91\x96\x02\x1e\x92\x56\x9f\x3e\x7e\xfc\xf0\xbf\xcf\x4f\x27\x06\xe3\x36\x9a\xc5\xa3\x9f\xba\x92\x25\xac\xbb\xa3\x13\x1a\x8c\xa2\x7f\x12\x42\xc6\x0d\x2a\x22\x74\xa7\x56\x6a\x3a\xb1\xfe\x8e\xde\x0b\x1a\x6f\xbb\x9a\x97\x2d\x8b\x5a\xa0\x6c\x36\xb7\xd6\x03\x46\xbd\x6c\xb0\xa0\xd5\x8d\x32\x3e\x93\x07\xf4\x86\x42\xab\xff\xca\xe5\xc1\xb5\x7d\x71\x0f\x20\xd1\x3b\x6b\x8c\x0d\x8e\x32\xc2\x6b\x3e\x06\x57\x23\x4e\xb5\xac\xbd\x3b\x8c\xe5\x21\xcd\xc3\x10\x27\x22\x52\x75\x16\xa6\xe2\xac\x64\xbc\x98\xe2\x7f\xfb\xeb\x02\xbb\xeb\xc7\x1c\x3f\x36\xc7\x95\xce\x31\xcd\x66\x33\xad\x38\x71\xff\xd7\xcf\xbf\x9d\x03\x5c\x0b\xc0\x9d\xb6\x26\x7b\xdf\x11\x95\x47\x7f\x0c\x92\x3e\xf8\xf8\xd3\x9b\x4f\x22\x91\xfd\xf4\xe6\xd3\x6f\xfa\xcf\xaf\x9f\x76\xbf\x7c\xfe\x7f\x3e\x7e\xfa\xf0\x87\x9f\xf4\xcf\x76\xf7\xeb\xcf\xff\x3f\xeb\x81\xf0\x0d\x22\x38\xfe\x5f\x6f\x3e\x7d\xfc\x55\xef\x39\xff\xbf\xd6\xe2\x7c\xac\xd8\x90\x01\x52\x0b\x81\x2d\x04\xde\x78\xd3\x7b\xc7\x90\x33\x19\x64\xf3\x55\x14\x68\x48\x6e\x37\x3c\xb3\x51\x73\x84\x6d\x19\xaa\x22\xdc\xe4\xe3\x33\x4d\x6b\x53\xc5\xd6\x03\x05\x23\x97\xd1\xa3\xf2\x59\x0b\xce\x82\xdb\x96\x84\x35\x2e\x29\x2e\xf6\x81\xf7\x0c\x21\x1f\x10\x02\x6f\x29\x19\x76\xfb\xd0\x50\x14\x95\x5f\xc4\x66\xa6\x9a\x12\xa4\xd0\x5a\x84\x18\x15\xaa\xf7\x60\x09\x14\xf6\xd8\xe1\xc1\xb2\xe6\x02\x6b\x2d\x5b\xde\xa2\x1a\xd6\x18\x77\x6c\x86\xf4\xe5\x9a\x02\x75\xeb\x40\xb3\xc9\x0d\xf7\x35\xdc\x93\x5c\x9b\xc0\x07\x2b\x97\xd1\xa3\xf2\xc9\xa8\x17\xa3\xaf\xf4\x61\x2b\xbb\x84\xc8\xe7\x94\xe0\x26\xac\xac\x4b\x02\xfa\xd7\xa4\x9e\x35\x62\xc7\x17\xf4\x34\x9a\x7c\xbd\x13\x0b\x16\x2d\xb7\x25\x61\xdb\x96\x2a\xf0\xa4\x5f\x98\x7e\x28\x9b\xaf\x35\xd9\xd2\x18\x34\x09\xaa\xa0\x27\x01\x31\x7f\x7d\xda\x7f\x35\x1f\xdc\xaf\x7f\xb6\x74\x9b\x53\xee\x0b\xe7\x4b\xdf\xc6\xfa\x79\xd4\xbb\xec\x07\x37\x7e\x5d\x6e\x7c\xaf\xc7\xdc\xaa\x8e\x5d\x67\x31\x5d\x2f\x91\x85\x2a\xd4\x31\xb6\x10\x2c\x84\x2f\x44\x15\xde\x82\xf3\x86\x00\x0d\x01\xbd\x44\x16\x1f\x74\xc6\xac\x28\xf4\xdb\xac\x09\x2e\x3d\x04\x37\x36\xf8\x68\x2e\xed\xd6\x2a\xb5\x4d\x94\xd0\xa2\xe2\xb3\x49\xc0\x61\x6c\xf9\x28\x1f\x80\x83\xe3\x59\x80\xba\x12\x26\x32\x58\x01\xa6\x9b\x48\x11\xc1\x93\x45\x08\xb8\x2d\x07\x2c\x78\xdc\x6f\x56\x82\xfd\x9a\xce\xd1\xb9\x7d\x6f\xa3\x62\xf1\x48\x36\xee\xe1\x0f\x08\xaa\x6c\x19\x02\xfd\x98\xcc\xd5\x27\xf3\x07\xc8\xc3\x0f\xb6\xf2\xad\x50\xe2\x77\x80\x2e\xb1\x7d\xff\xdf\x9f\x76\x9f\x16\x1a\xee\xd8\x90\xee\x8a\x09\x5d\xe3\x2a\xa2\xa2\xe9\x24\x1a\xdb\xcf\x8a\x5b\x04\x86\x2d\xa1\x3e\xf4\x4d\x82\x4c\x4b\xe3\xb9\xa2\xc1\xc5\x1a\x5d\xe3\x4e\x3e\x27\x79\xce\xf5\xd8\x16\xcf\xc6\x37\x4c\xd3\x83\xab\x7a\x8a\x3f\xa7\x67\x0b\x40\xb1\xd5\x7c\xce\x84\x13\x6b\x03\x65\xf0\xa9\xf5\xea\x24\x72\x3c\xb5\xad\x06\x5f\x0e\xca\x4f\xef\x90\x4c\x82\xc4\x0d\x63\xed\x1b\xbf\x8f\x4f\xef\x50\x1d\xe5\xd1\x35\x79\xef\x9f\x3e\x24\xf0\x68\x81\xfc\xb6\xe3\x06\x0c\x99\x5a\x86\xe8\xca\x59\x66\x00\xce\xe5\x60\x7f\xb5\xe3\x77\x82\xe8\x65\x20\x80\xfc\x66\x1e\xc6\xe2\x8c\x6b\x58\x4f\x90\xdc\xe2\x59\xf7\xe1\x4a\xce\xd9\x31\x1a\x46\xa8\x72\xab\xf9\xb7\x2d\x26\x98\x9e\xe6\x53\xb6\xe0\x93\xae\x05\x06\x9f\x9b\x89\xd9\xdf\x62\x8d\xa1\x61\xde\x87\x06\x1d\x84\xbc\xa5\xa4\x00\x7f\xd7\x36\x6e\x69\x22\xfd\x97\x8f\xed\x05\xe3\x99\x6a\x96\xec\xf6\x76\x94\x79\xcc\x42\x2a\x11\x6a\x5b\xd4\x5c\xd4\x84\x75\x98\x3c\xf5\xb2\xa4\x5d\x8b\x15\x84\x64\x31\x8e\x59\x44\x80\xe0\x8c\x9e\x4a\x57\x63\xa3\xb9\x0c\x0a\x6a\x77\x50\x39\xbc\xdb\xfb\xf1\x61\x8f\xbc\xc0\xf2\x82\xf0\x92\xa0\xc1\x38\x69\x5c\x6a\xd7\xca\xa7\x77\xb9\x30\x8f\x3d\x64\xdc\x16\x9f\x1f\x0c\x35\x66\xf0\x79\xdc\x40\x65\x46\x52\x59\x84\x94\x8c\x53\x07\x9b\xbc\x8d\xda\x88\x5c\xa3\x03\x1a\xd7\x9c\x34\x12\xec\x51\x37\x84\x11\x2e\x10\x24\xe1\xda\x79\x03\x2e\xf7\xb0\x40\x95\xe1\x4a\xf4\x16\x0d\x03\x71\xb4\x03\x3f\x60\x69\x81\x2b\xaa\x7e\x39\x06\xc2\x38\xfd\xcc\x43\x34\x54\xed\x23\x84\xb8\x0d\x10\x0c\x33\x90\xdf\x81\xa7\x3e\x8b\x58\x65\xc0\x05\x88\x7e\xcf\xa3\x42\x8d\x06\x42\x09\x67\xd1\xdc\xd4\xc9\x4f\x2a\x94\x67\x49\x13\x3c\xa5\xbc\xe5\x4a\x3d\x68\x20\xd1\xa2\xbd\xa5\x1b\xb7\xac\x8a\xe9\x41\xc7\xa7\x9f\x7f\xb9\xe0\x49\xa2\x01\x72\xc2\x1a\x11\x4b\xfc\x8f\xb2\xa1\xb4\xc9\xb2\xd5\xe7\xe3\x7e\xaf\x39\xde\x08\x62\x96\x8d\x84\x1d\xf8\x6c\x84\x76\xf4\xb2\x4d\x10\x83\xf0\x4e\x9f\x8d\xee\xd4\x1a\x2b\x25\x2f\xeb\x67\x52\x56\x34\x7a\xe9\x16\xba\xd4\x50\x6a\xdb\x96\x9a\x4b\x98\xde\xe8\x84\x42\xb3\xb9\xb7\xa2\x2d\xa9\xa2\x35\xe6\xa9\xc7\x06\x3f\x7d\xb0\x1e\x82\x6c\xdf\x21\x6c\xbb\x14\xf4\x49\xa3\x3f\xc1\x47\xc0\xb0\x8b\x52\x67\xec\x2b\x46\x9b\x81\xd1\xea\x1d\xfd\xbf\xa3\x3c\x54\x67\xba\xd4\x3a\x08\x9a\xde\x0e\xb5\x40\x2d\x7a\x9b\x21\xc9\x3d\xf4\xf3\xb2\x4c\x02\x27\x9d\xc2\xd0\xca\x14\x83\x8f\x5b\x96\xfd\xd7\x50\xbc\x2d\xb1\xf5\x29\x2a\x1e\x6d\xa2\x14\x01\xb9\xec\xa3\x14\xa1\xca\xba\x97\x22\xf0\x39\x33\x00\x22\x10\xbe\x91\xaf\xe8\x4e\x2b\xec\x8b\x07\xd3\xac\xae\x5c\x24\x3b\x62\x88\x6a\x3c\x0f\xbb\x24\x93\xad\x97\x8e\x83\x92\xac\x24\x5f\x84\x1a\xdf\x5d\x90\x0d\x03\x06\x23\xcb\x68\xfe\x85\x72\x17\x83\xb4\x2d\x65\x73\xf1\xbe\x12\x41\x4c\x2f\xfd\x8e\xe8\x95\x2a\xbc\x28\xe6\x5e\xe4\xda\xe9\xf3\x51\xeb\x9e\xde\x51\x36\x94\x77\x25\xfe\xb1\xb8\xf2\x61\x39\x48\xdc\x8c\xef\xa9\xcd\x5f\xde\xbc\x7b\x81\xfd\xcb\x5f\xdb\xf6\xf3\xcf\xbf\x5d\x38\x89\x4e\x86\x76\xe8\x55\x5e\xf0\x83\xc0\x20\x74\xed\xc1\xe7\xb6\x30\xe5\x14\x76\xe8\xb4\x3b\xae\xf4\x47\xcf\xd7\x65\x58\xd4\x8f\x36\x58\x88\x69\x83\x7a\x4e\xd2\x1d\x39\xa7\xdb\x4f\x40\xcf\xcd\xaa\x82\x89\xa3\x87\xb8\xc3\x4a\x08\xbe\x5c\x3b\x07\x32\x60\x9b\x80\xc2\x16\x83\x08\xb5\x59\x56\xb3\x88\xdc\xe4\xba\x11\x55\xf1\x81\xd7\x43\x8d\x49\xa2\x9e\x54\x79\x57\x42\x15\x87\xf0\x49\xeb\x44\xe5\x54\x39\x56\x0d\x4e\xe9\xb9\x32\x22\xd7\x57\x46\xf8\x41\x65\x80\xe2\xc6\x43\x10\xb6\xa4\xf9\xa4\xba\x31\x12\xb1\x1f\xf7\x16\xc8\x89\x8a\xe0\xd8\xa0\x46\x3f\x46\xe3\x7a\xb2\x29\xe9\xe8\xa5\xca\xb5\xd0\x62\x12\xa8\x50\xc1\x6e\xba\x17\x78\xd0\xb3\x1e\xa0\xd6\xcb\x48\xca\x65\xec\x39\x98\x0d\x16\xe7\x63\xd6\xb5\x42\x8d\x48\x6e\x93\x1d\x03\xbd\x15\x96\x19\x65\xd1\x68\x36\xde\xf1\xc3\xe4\x81\xfd\xc1\xd5\x3c\xdd\x64\x3c\xa4\x5b\x4e\xeb\x4f\xf9\x9c\x8d\x5c\x2a\x84\xbf\x26\x7f\x42\xa7\x61\xcb\x9b\x21\xd7\xaf\x0a\x99\x3a\xac\x4e\x66\xc8\x95\x69\xea\x27\x44\x9e\x8d\xf2\x02\x93\x01\xef\x5b\x36\x3c\x96\x34\xba\x8a\xd6\x10\x05\x5f\x58\x7d\x28\xbb\x39\xa4\xbc\xc1\xe2\x22\xa9\xd7\x42\xd8\x41\xb6\x61\xf4\xc0\x5b\x52\xa7\xf1\xa2\x2b\xbf\xb0\x04\xef\xf1\xf6\x51\x97\xde\xec\x36\xa2\xd3\x45\x53\xae\x5d\x0d\xc1\x24\x69\xa2\x0c\xa2\x26\x6a\x35\xd5\xc6\xcb\x3e\xa7\x97\xce\xe9\x86\x00\x45\xa1\x7b\x16\x0a\x21\xf5\xd8\xe1\x32\xf5\xb7\xf8\xd7\xdc\x4d\xcb\xa4\x02\x15\xb0\xdf\x8c\x27\xbb\x3b\xc3\x45\x07\x2e\x7c\x01\x8a\x3e\xd3\x33\xb7\x74\x3d\xdc\x7d\xfa\xf3\xcf\x17\x04\xf1\x64\x68\x32\xc5\xec\x94\x66\xbb\x3b\x55\x3f\xe9\x9a\x7a\x66\x83\xce\x60\xcf\x05\x99\xf4\xc5\xee\x4e\xc7\x55\x6e\xe2\x8a\x2f\x51\x71\x04\x12\x0a\x49\xca\x9d\x87\x43\x76\xf9\x9d\xcc\x94\x6d\x77\xcd\x8c\xa0\x0d\xa5\x4a\x58\xb6\x70\xec\xfe\xb4\x5d\x64\x9f\xe2\xc9\x84\xe5\x72\x64\x83\xf1\x26\xff\xc8\x97\x18\xb9\x32\xdf\x05\x57\xd6\xd8\x7e\xa9\x6d\xfc\xa0\x1a\xb1\x6b\x69\x75\x86\x18\x37\x53\xf6\x81\x85\x4b\xcf\xf9\xca\x8a\x1c\x7c\x24\x77\x61\x2a\x42\x97\xfc\xfb\xe9\x0f\x3f\x39\x15\xbd\xd6\x60\x46\x51\x7d\xe8\x17\x2b\x9d\x14\x08\xa1\x4c\xe5\x70\x1d\x4d\x65\x62\x19\x15\x0c\x8b\xe5\x4f\x9d\xdc\x6b\xc6\x0f\xfa\x31\x91\x67\x6b\x70\xa8\x1b\xd6\x05\x95\x0e\xa2\x42\x80\xe8\xb5\x6b\x67\xd6\x3b\xa9\xd8\x58\xba\xeb\xb1\xa5\xf9\x84\x05\xe2\x6a\x7f\xc0\x7f\x6d\x77\x1f\xce\xcb\x5f\x8c\xa0\xb1\x0b\x21\x3c\x5b\x04\xcc\x56\xed\xd7\x51\xad\x02\x22\xda\x8f\xfe\x9c\x58\x08\xa2\x08\x9b\x36\xc8\x5c\x04\x67\xd9\x7a\xa0\xb4\x78\xe1\x8f\x1e\x9c\x86\x5a\x29\x32\xb6\x0a\xc5\x7e\x93\x81\x8d\xfc\xdf\x5b\x81\x48\xb4\x8a\xb7\x2c\xbd\x8c\x24\x73\x14\x4c\xc1\x75\x0e\x51\xb1\x5f\x09\x5c\x7a\xab\x96\x38\xb9\xcf\xf2\xa2\x5e\x49\x85\xbe\xce\x8a\x2b\xd7\xae\xc0\xa1\x43\x4f\xef\xf4\x5b\xc3\x9a\x6b\x3c\xc6\xb7\x49\xde\x62\x32\xea\x86\x2e\xaa\x51\xa9\x7b\x17\x45\xf4\x89\x05\xcc\xa1\x98\x16\x31\x58\x07\xc8\xcf\x10\x15\x42\x43\x97\x93\x0c\x05\xa9\xfa\xe3\xad\x26\x87\x68\xd9\x4c\x7b\x6d\x20\x45\xf0\xb8\xaf\xa6\xb7\x2c\x78\xdc\x4a\x53\xb2\xf1\xcf\x38\x04\x01\x05\xb5\xf0\x60\x31\xa8\x22\x41\x98\x08\x8f\x8a\xda\x8f\xa5\x97\x6f\x59\xf9\x52\x52\xfd\xa9\xb3\x4c\x76\x3d\x5b\xcd\x75\xce\xcb\x84\x11\x42\xe4\x67\xab\x3d\x2c\x63\xc0\xc9\x46\x48\x78\xfc\x6b\x07\x09\xd2\x30\xc9\x4e\x88\xc0\xa9\xc6\x58\xa0\x7c\x84\x7e\x5c\x9e\xbe\xc4\xde\x54\xc5\xe8\x4b\x4e\x01\x37\xe4\x8e\x5e\xfa\xbd\x4c\x94\x7b\x4d\x71\x9e\xcb\xa5\x37\xe3\x19\x99\xb9\xd1\x81\x23\x24\xb6\xf2\x6e\x4c\xe5\xd2\xe9\xa8\x3e\x08\xbd\x71\x4b\x90\xb4\xa1\x6a\xa5\x91\x22\x47\xed\x28\xee\x49\x22\x03\x44\xa9\x4f\x2f\xdd\xe7\xce\x42\xda\x52\xa5\xfa\x5a\x68\x95\xff\x8a\xca\xba\x73\xb2\x26\x5d\x59\xa4\xbd\x81\x88\x20\xe2\x60\x5f\x57\xfe\xe2\x82\xa1\xbc\x27\x40\xde\x05\x08\xa2\xde\x87\x63\x95\x28\x72\x79\x74\x22\x2d\xf9\x72\xe9\x6d\x68\x8f\xfb\x82\x2f\x96\x30\xd3\x2b\x2e\x61\xc7\xc3\x12\xc6\x93\x6b\x98\xc2\x73\x65\x7c\x01\x0c\x49\xb2\x7f\x06\x6f\x92\x8c\x69\x86\x78\x72\x15\x27\x08\xd4\x2d\x64\xe7\x2e\x2c\x64\x16\x75\x15\xfb\x85\xec\xc0\x8b\x8e\x12\x84\xa3\x1c\xcf\xde\x94\xb3\x3a\xdc\xa9\x68\xad\x97\x7e\xca\xbc\x25\x60\xd7\x32\xb0\x57\x2f\x80\xa3\xb8\x84\x46\x11\xa9\x5a\xec\xc8\x29\x6a\x84\x65\x7a\xee\x72\x48\xeb\x59\x35\xdb\x58\x60\xfd\xbb\xbf\xa6\x5f\x47\x53\x7d\x66\x08\x26\x08\xcd\xc9\x3b\xba\x0c\x64\x13\x12\xce\x30\xd0\x0d\x45\x23\xcb\x2b\xbc\xa5\xd8\x2d\x5d\x95\x88\xfa\x3e\xdd\xad\x5b\xd7\x1f\xff\xfa\xe9\xcf\xfa\xe5\x59\x0f\xdd\xac\x07\x20\xa1\x21\x27\x7a\x45\x90\xe9\x08\x7d\x9a\xe0\xca\x12\x84\x6c\x3d\xb0\x42\xbe\x50\xb2\xb8\x09\xc0\xda\x9d\x01\xfa\x46\xf6\x9f\x7d\xb5\x0b\x9a\x47\x58\x3d\x7d\xfa\xa5\x18\xa8\x1d\x3e\x9a\x14\xab\x0e\x8b\x08\x55\x6e\xdc\x9e\x67\x11\x64\x63\x9d\x2e\x1a\xb7\xe7\x43\x14\x6d\x76\x51\x42\x91\x7d\x98\xdb\x72\xb2\xb6\x68\x97\x70\xce\xae\x5d\xf2\x21\x0d\xd1\xb5\x46\xda\x65\x87\xaf\xa6\xc5\xa2\x62\xf9\x64\x6c\x98\xea\x38\x8f\xc4\xcb\x33\xb7\xc2\x77\x48\xe5\xed\x9d\x13\x6e\xe2\x46\x40\xf7\x90\x92\x2c\xeb\x7e\x00\x4e\xbc\x80\x49\x21\xa2\x46\xdb\x40\xf0\x16\xb2\x6b\x30\x02\x8f\x4d\xed\xdd\x7d\xf9\x3a\x96\x4b\xaf\x3a\x62\x96\x22\x86\x99\x59\xd4\x41\xfd\x20\xd7\xe4\xca\x28\xce\x5e\xd1\x38\x57\xa3\xed\xec\x06\x64\x5f\x9d\x78\x07\xd3\xa4\xa5\xd2\x22\xc8\xee\x80\xa2\xd5\x4c\xda\x7f\xa2\x99\x0a\xa4\x25\xad\xec\x06\x7c\xde\x48\x72\xc7\x01\xc7\xf5\xf6\xaa\x2f\x41\xd5\x3b\x3d\x25\x08\x03\xe0\x9b\x91\xc1\xb6\x58\x0e\xff\x77\x2c\xf7\xb9\x7f\x88\x16\x62\xb2\x7a\x9c\x02\x81\xc0\x85\xaf\x3c\xd0\xcd\x77\x42\xb7\x04\xce\x6f\x45\xe1\x31\xdf\x15\x67\xf8\x91\xb1\xe7\x56\x0f\x85\x2f\xb5\x60\x27\xd2\x17\x81\x8f\x22\xc5\x87\xb3\x89\xd4\x0f\x22\xfc\x7f\xeb\x5c\xf3\xfb\x59\xcc\x27\xb3\x6f\xe6\xef\x6b\xd7\xff\x3d\x65\x47\xd2\x31\x70\x7b\x9a\x85\xf1\xef\xed\x70\xa7\xdc\xbd\x49\x02\xbd\x90\x72\x48\xf4\xf5\x71\xe9\xdd\x20\xef\xa7\xd5\x2d\x07\xf9\x1e\x9b\x0b\xe9\xa9\x3f\x7a\x08\x71\x13\x44\x81\x0e\xc7\x83\x2e\xf2\x7d\x56\xa8\x5a\xf4\xf4\x70\xf0\x05\x91\x73\xf6\x96\x50\xa9\xd3\x52\x54\x10\x2f\xd7\xfe\x59\x46\x05\xdf\x3f\x88\x1a\xbc\x5b\xbc\x60\x87\x17\xcc\xac\x58\x3b\x14\xab\xb5\xd6\xe4\x65\xfd\xa6\x45\xf5\xfa\x9e\x3d\x5d\xbd\x96\x6e\x15\xfb\x5f\x56\xaa\x5a\xdf\xe7\x0d\x3c\x76\x7f\x0d\x3b\xf6\xa3\x93\xf7\xb0\x5f\x5e\x21\xd5\xa9\x44\x20\xf7\xae\xa0\xd3\x87\xd1\x99\x90\xc0\xeb\xf1\x3e\xc5\x93\xb3\xb4\xf2\x6c\x2e\xa9\xc9\x0c\x6f\xb4\xc0\x16\x28\xee\x65\x5b\x3b\xe7\x60\xba\x25\x35\x48\xad\x44\xdb\x27\x68\x6b\x34\x1e\xb7\x0e\xf8\xf7\x82\xbd\xfd\x52\x3f\x6e\xc7\xdd\x7e\x7c\x05\xdd\xe3\x4f\x78\x62\xfd\x9c\xdb\x84\xf7\x16\xaf\x5b\x4d\x0f\xe1\x0d\x15\xbe\x54\xd6\xd2\x43\x2b\x61\x13\x80\xbc\xd1\xcb\x98\xa9\x7b\xed\x58\x2c\x97\x4e\x5a\x22\xf0\x6b\xad\x86\x35\x38\xfd\x72\x3b\x3a\x8e\xc9\x8a\x10\x49\xab\xb9\x92\xba\xab\x5c\x49\xff\xcf\xc7\xcd\xf3\xf3\xcf\x17\x4c\x4d\xdf\xec\xe1\x20\x45\xb5\xb3\xfb\x3a\x41\xf2\x9b\x72\xbc\xd2\x9f\xae\x88\x38\x8a\xc2\x26\x0e\xea\x0c\x37\x7f\x28\x5f\x18\xc2\x5a\x8b\x58\x3c\xa5\x5c\x8c\xa1\x8d\x96\xb0\x7c\xdc\xd5\xfb\xf4\x41\x88\x58\x8d\xaf\x40\xbe\x27\x68\xf5\x3a\x05\x2a\xad\x5a\x3c\x90\xff\x4b\xb1\x93\x47\xa6\x7b\x54\x1a\xb4\x78\x04\x37\x41\x0f\xac\x72\xa4\xf5\x8e\xb2\x46\x04\x57\xb5\x8e\x01\x24\x7f\x3c\xb8\x0a\x93\xe1\x99\x3e\xd2\xb1\x0a\xb5\x7e\xbd\x9b\x3c\x2a\x3f\xca\x7c\x4c\x1e\xf4\x35\xdd\x6d\x2e\xfd\xb7\x4f\x7f\xde\xfd\xf2\xfe\x1f\xbb\x5f\xdf\x7f\x5c\x46\xe3\x7f\x6c\x7f\xfb\xf3\xc7\x5f\xde\xfc\xe5\xe3\xfb\x5f\x7e\xfd\xfc\x87\x9f\x32\xa4\x37\x98\x20\xbd\xa1\x00\x34\xfa\x8b\x44\xed\x7a\x43\x51\x7e\x1f\xff\xc4\xd8\xbf\x34\xfa\xcb\x75\x3f\xfa\x7f\xe5\x92\xc6\x7f\x94\x02\xf2\x50\x54\x5f\xe7\x5a\x87\xe2\xce\x10\xd7\x73\x74\x86\x39\x16\xc2\x18\xbe\x41\xb1\x10\x68\xec\xa2\xad\x65\x3c\xbd\x73\x86\xb1\x21\x5f\xa3\x3b\xdc\x0c\x85\x70\xf6\xd0\x82\xa4\x79\x44\x2f\xb4\x6f\x81\x22\x33\x69\x9f\x16\xa2\xa8\x29\xa5\x81\x4c\x37\x35\xf0\xa2\x4c\xac\xee\xe0\x35\xf1\xac\xfe\x39\xe2\x36\xf2\xbc\x07\xe3\xf1\x93\x32\x9e\x3e\x54\x36\xd5\xc4\x87\x50\xe3\x2d\xbe\x8f\x27\xbd\x8d\xbe\x5d\x3a\xbd\x41\x69\x1c\xa0\xca\xe6\x18\x5a\xe8\x8e\xc1\x9d\x58\x95\xd0\x4e\x2a\xa1\x9d\x57\x82\x19\x5d\x44\x46\x5b\xc0\x82\x3d\x5e\xdf\x29\x12\x1a\x40\x9a\x50\xeb\x5b\xb3\xba\xa5\xcf\xce\xbf\xec\xda\xdd\x2f\xcf\x17\x40\x5a\x9c\x61\x1e\x83\x28\x74\x70\x31\xee\x31\xb8\x98\x73\x5d\x8e\xda\xe5\x7c\x12\x15\x8d\xc0\xaf\x85\x0c\x91\x4c\xac\xc7\xde\xf7\xc9\xf8\x9a\xd2\xdd\x5d\xba\xac\x1c\x07\xc8\x7a\xc2\x19\xf3\x2e\x96\x43\xbe\x21\xad\x87\x87\x84\x96\x20\xa9\xe5\xdf\x82\xe8\x1f\x3e\x6b\xb2\x0f\x08\x90\x76\x5e\xb4\x11\x7f\x54\x49\x12\x38\x32\x55\x7b\x7c\xd5\x94\xbc\x20\x01\xd2\x66\x56\xb4\x19\x55\xbb\x96\x8b\x22\x57\xa2\xd9\x61\x56\xf7\xfc\xfe\x64\x1c\x2d\x44\xb6\xe0\xd2\xb6\xd4\xa8\x7e\x6b\xd2\x27\x5f\x4e\xc1\x47\x2f\xa2\xe6\x79\x09\x4e\xde\x24\x51\x46\xe5\x29\x1f\x0f\x3a\x15\xb6\xb6\x6a\x19\x7c\x32\x09\x28\xcc\x2a\x11\x5d\xec\x96\x59\x39\x05\xbf\x37\xf4\x25\x8b\x62\xac\xa3\xb3\x18\x39\x3d\x7f\x26\x84\x7e\x52\xb6\x25\x08\x23\x43\x6e\x1f\x9e\x95\x63\xb5\x37\x74\x24\xbc\x04\xc8\x19\xce\x4f\x8a\x56\x28\x73\x22\x42\x93\x82\x67\xc6\xd3\x73\x92\x20\xfb\xb3\x73\xb2\x45\xfd\x14\xf9\xc1\x29\x89\x0b\xfe\xf3\xbf\xff\xf4\x2f\xa2\x30\x5c\xd4\x0b\x68\xa7\x87\xe3\xae\x0c\x63\x17\x1f\xce\x7a\xd9\x8c\x9f\xf4\x62\xa5\x68\x09\x36\x40\x0a\x3b\x2a\x89\x76\x42\xe7\x27\x65\x87\xdf\x9b\xf1\x93\x4e\x67\x40\x5f\x74\xfd\xb5\xb0\xa4\xdc\x7c\xab\x0f\xb3\xad\x3e\xee\xd3\xd3\x3b\xaa\x4c\xae\x31\x34\x6e\x7f\x4b\xdd\x97\xd9\x5b\x30\x5c\x35\x05\x12\x56\xdd\x57\xa1\x87\x09\xb2\x0a\x45\x1c\x79\x93\x21\x1b\xf9\xff\x38\x68\xea\xb7\x32\xbb\x5d\x09\x69\x91\x96\xa2\x53\xcd\xc7\x52\x20\x72\xc3\xd5\x1e\x41\x23\x34\x53\xdc\x24\x60\x8d\xb1\x1c\x0d\x68\x01\x72\x9b\x3f\x08\xe0\x0c\x81\xcf\x0d\x2f\x64\xf1\xbb\x59\x6c\x32\xa1\x26\xd7\xa4\xbd\x6b\x98\xea\xa4\x7f\x84\x3a\x8d\x44\xa9\x60\x52\x33\x15\x06\x0d\xd5\x53\x4c\x47\x4b\x4d\x9a\x22\x8b\xdd\x22\x0c\x5e\x76\xee\xfe\x36\xa8\x78\x85\x33\xc6\x57\xa7\x09\x3d\xe7\x5b\x8d\x74\x5f\x31\x79\x61\x31\xa7\xaa\x4f\x62\x18\x96\x70\x93\x80\x5c\x4b\x96\xc1\x85\xe6\x0a\x06\xe0\x20\xb8\x0d\x43\x08\x86\x47\xc7\x62\xa5\xe8\x57\xcc\x5e\xa8\x64\xf2\xe0\x5a\x91\x12\xee\x69\xa2\xfb\x4e\x8c\xbc\xd7\xf4\xc5\xdf\x6c\xe8\xfd\x66\x38\xc1\xa3\x18\x35\xeb\xed\x6f\x8f\xe7\x2f\xfb\x9d\xf0\xa4\x15\xb2\x9f\x31\x10\x3d\xb8\xac\x19\xfc\x26\x82\xcb\x26\xf6\xae\xb4\x05\x18\x5f\x8a\xfe\x3d\x24\x4a\x3b\x15\x87\x10\x21\xc6\x2e\x14\x41\xd4\xfb\x35\x60\x8f\x17\xab\x23\xce\x0d\x3d\xfb\xd3\x79\x06\x6e\x8d\x1e\x78\x91\xf8\x5f\x97\x7a\xef\x3b\x2f\x16\x79\x8d\x9b\xb4\xf7\x3d\xb1\xfa\x57\x91\xd7\x2e\x99\x41\x5e\xda\xd8\x35\x2d\xa5\x5f\x6e\xe2\xcb\x79\x5c\x30\xb6\x87\x0e\xb5\xef\xa2\xcf\xc7\x4f\xb1\xbf\x05\x32\x7a\xfc\x68\x78\x2a\xd8\xdc\x47\x54\xa7\x04\x9b\xeb\x4f\x7c\xbf\x6d\xa1\xe6\xa5\x7e\x5c\x2d\xd0\xdc\x49\xa5\x0f\x9d\x52\x3f\xc2\x55\x1f\x4d\x84\xf3\x6d\x2c\x8f\x87\x93\xe1\x8c\xe5\x83\x3b\x57\xc7\x2d\xf2\xc1\x2d\x89\x73\x5e\xeb\x80\xfa\xac\x5c\x30\xb1\x43\xfd\xc7\xcf\x7f\xf9\x79\x77\x3a\x76\xf5\x06\x7b\x90\xfa\x52\x18\x0d\x95\xd9\x30\x60\x34\x5c\x82\x10\x8b\xe9\x0f\xa3\x41\xac\x29\x81\xd3\xa0\xa7\x64\x1c\xf8\x59\x32\x93\xa0\xa9\xb7\xb7\x5c\x62\x31\x2b\x11\x4d\x7d\x32\x0c\xd5\x08\x10\xdf\x1e\xdf\x93\xb2\x4c\xae\xa5\xe8\x8d\x97\xf2\x7d\x5f\x5f\x65\x5c\x69\xc7\x21\x00\xb6\x64\x49\x0d\x75\xa7\x89\xe3\x06\xa3\x53\x31\x03\x0b\xf7\x4a\xcb\x1e\x0a\xdf\x61\x43\xbe\x8e\x10\x5a\xe9\xa0\x9d\x76\x50\x1b\x6e\x4b\x07\x21\xcb\xfb\x6d\x00\x2f\xdb\x6c\xc6\xd9\x30\x94\xb7\x22\xc8\x5a\xa8\xb5\xdc\x45\xff\x4a\x08\x4c\xf2\x07\x2b\x3d\xd4\xb8\xae\xd2\xc5\x69\xf4\xe2\xfb\xf6\xe7\xff\xff\xa7\x8f\x7f\xfd\xcb\x1a\x53\xcb\x68\xd8\xd5\xc8\xf3\xfc\x15\x38\x4d\xdc\x50\x33\x4e\x33\x37\x34\x3c\x0e\xc0\xd7\x52\x34\x23\x08\x53\xcd\x55\x83\x54\x0b\xa7\x3e\x7d\x28\x72\xc3\xdc\x68\x5e\x8f\x02\x7a\x1a\x8e\x67\x46\x93\xbc\x32\x8f\xd5\xc1\xe3\x3a\xa8\x7a\x95\x3a\xdc\xa4\x0e\x77\x6d\x1d\x37\xcd\xa6\xef\x17\x2a\x39\x0d\x7f\x69\x78\x06\x4f\x35\xce\x76\xe3\x0c\x37\xe4\x67\x30\x63\xe1\xd1\xa5\x14\x7e\xea\xb6\x15\x43\xa9\x49\x35\xa5\x26\xce\xda\x30\x4e\x48\x92\x4c\x6c\xa6\xb9\x2e\x0c\xee\xf1\xaa\x36\x9c\xd7\x5e\x3a\x82\xc6\x6a\x4c\xd0\x9a\x0e\xa8\x19\x7b\x77\x6b\x7f\x19\xe7\xb0\x6a\x38\x4e\x41\x22\xa5\x3c\xc9\xfe\x42\x41\x54\x7d\x72\x35\xa5\xa7\x0f\x95\x75\xfa\xab\x1a\xff\xc2\x20\xbf\x1e\x68\x39\x7d\xa1\xc9\x3b\xaf\xd7\xac\x32\x71\x13\x26\xf5\xef\xbb\xbf\xfc\xfc\xe9\xb9\x7d\xbf\x0a\x93\xd2\xe3\x28\x26\x08\x9b\x00\x6c\x02\x0c\xd0\xb9\x86\x2b\x85\x98\xd2\x7c\xff\xc8\x9b\xa0\x87\x42\x43\x2e\x74\x61\xdf\x24\x77\x62\x2c\x97\xfe\x33\x42\x70\x5b\xcc\xe0\xd5\x2b\x6d\xa7\x9e\x8a\x69\x14\x8d\x40\x1d\xd2\xc4\x26\x99\xde\xd7\xb4\x04\x60\x3b\xb7\xcb\xa6\x13\x11\x2c\x41\x54\x5f\xfc\x2d\x6a\xfa\x43\x46\x08\x43\x26\x35\x85\xb3\xe0\x0a\x30\x89\x58\x9b\x0a\xe8\x4d\x1a\xa5\xd0\x64\xea\xca\x0b\xa6\x4f\xd6\x89\x10\x35\xc0\xd8\xcc\xc3\x41\x32\xb0\x03\xf6\x5b\xaf\xf0\x92\x8a\xfa\xe5\x4a\x04\x79\x4c\x03\x59\x68\x5f\x77\x0e\x48\xc3\x34\x47\xa0\x80\xce\x70\x0b\xc8\x80\xbc\x73\x10\x34\xa6\xa1\x8f\xe0\x0a\xe0\xad\x26\x22\xf3\x32\x4e\x05\x55\x44\x7a\x25\xff\xf7\x82\xb7\x41\xb7\x1b\x40\x3b\x7a\x01\x30\x64\x8b\x7a\xee\xa7\x19\x2c\xe5\x52\x1e\x30\x84\x00\xc8\xad\x2d\x10\x12\x78\x74\xf4\xc4\x21\x89\x0e\x6d\xa9\x52\xf1\x5e\x23\x34\xc8\xe8\x65\x30\x50\x25\x9d\x48\x07\xcc\xc6\x8d\x72\x42\x26\x69\xc6\x2c\xc8\xb5\xa0\xc9\x30\xb0\x82\xe0\x50\x92\xf1\xf6\x69\x23\x7b\xaf\x6e\xc0\xdd\xb7\x03\xf5\x2c\x88\xf4\x8f\xfb\x4f\xef\x7f\xf9\x7f\x57\xd9\x46\x65\xf4\xd4\x59\x1b\xdb\x0c\xe4\xad\x1e\x5e\x9e\x4a\x20\x44\xd8\x01\x08\xba\x69\x96\x8e\x06\x63\xcd\x34\x8f\xbd\x58\x45\xba\x71\x06\xf3\xcc\x03\x37\x83\xcf\x5b\x1d\x5f\xae\x8e\x2d\xed\x44\x95\x3e\x35\x91\xd2\x9a\xc3\x29\x24\xa5\x36\x35\x2f\x86\xb2\xf8\x42\xbe\xff\xef\xf7\xed\xfb\x5f\x7f\xc3\xf3\x67\x9f\x0e\x9c\x93\x95\x92\xdd\x2e\x02\xa3\xd1\x4b\xd5\x79\x0e\x44\x8b\x08\x29\x6d\x23\xa8\x07\x24\x04\xb7\x9b\x86\x55\x0b\x15\xeb\x05\x35\xe7\x6a\x05\xcc\x9b\x21\x71\x52\xbf\x78\x8f\x55\xac\x08\x05\xc0\x22\x9e\x86\xb8\x73\xa2\x05\x39\x18\xd2\x96\xb8\x12\x16\x8d\xb8\x19\x3f\xd1\x81\x1a\x3e\x7a\xfa\x20\x2b\x8d\x78\xa7\xc8\x3b\xd4\x7f\x2c\x0b\x07\x15\xa9\x93\x36\xe3\x27\x55\x49\x2b\xc2\xc1\x44\xb8\xe5\x4c\xfd\x85\x03\x54\xf0\xa1\xc0\xb8\xee\xad\x9f\xe4\xeb\x72\x50\xf9\x96\x0b\x46\xb3\xf7\x3b\xc5\xd2\xa3\xfe\xb8\xbc\xac\x75\xa7\xa1\x68\x22\xfc\x4e\x93\x1b\x2a\x88\xe9\x56\x91\x3a\xb2\x2c\xbd\x23\x99\x64\x08\xc1\x4c\xd2\xce\x40\xcc\x0a\x44\x30\x8a\xbd\x42\x61\x3e\x22\x56\x47\x2b\xab\x58\x04\x6f\xf5\x2c\x8e\xd6\x43\x95\x8c\x87\x98\xf6\xd5\x6e\x06\x2d\x28\x12\xb8\xe8\xab\x89\x5b\x54\x80\x2e\x70\x42\x04\x2c\xa4\xd4\x8f\x5e\x25\x4b\x9e\x12\x24\x6c\xfb\x74\x8a\xbc\x9b\xc3\x0a\x2a\xe0\x64\x05\x55\xd8\x0b\x47\x6d\x6d\xd9\x25\xfc\xa4\xcd\x8a\x32\x89\xb8\x9f\x66\xfe\x54\xac\xcd\x16\xb2\x8d\x10\x68\x32\x96\xbe\xe0\xae\x1d\x57\xcb\x71\xd8\x9f\x3e\xd8\x00\x1c\x6d\x94\x3b\x0a\x04\x29\x5a\xc1\x4e\x86\x25\xf6\xb4\x0b\x0e\x7c\x86\x84\x3d\x2e\x8f\x0c\x10\x84\x2c\x5b\x55\xf4\x06\xe3\x46\x35\xae\x7c\xd4\x18\x30\xa8\x75\xe8\x16\x2f\xd7\xcb\x2e\x7e\xae\x03\x42\x7d\x61\x7d\x06\xff\xc2\xfa\x6c\x87\x04\xa8\x74\x6a\x85\xf6\x95\xac\x12\x67\x15\xa4\x39\x04\xb8\x63\x59\x40\x7c\x5c\x9c\x5c\xb0\x17\x90\x36\xe3\x27\xdd\xbc\x94\x6f\x56\x89\xbc\x0a\x8a\xa6\x24\x93\x5c\x8b\x64\x11\xff\xc7\x02\xa3\x05\x66\x0b\x21\x68\xb8\xa0\x82\x85\xb8\x72\xde\x85\xce\xe8\xa5\xa3\x19\xcf\x96\x81\xa2\x6c\x8a\x3a\x4a\xdc\x56\xa6\x12\x91\xa2\xf2\xc6\x8f\xf1\x58\x75\xc1\xa1\x2c\x38\x54\x14\xdc\x04\xd3\x5c\x71\x24\x6b\xc1\xa7\xd1\x7a\x22\x48\x0a\xe0\xca\xb2\x3f\x2a\xa5\x70\x96\x19\xd3\x29\xe3\x61\x39\x39\xa7\xe9\xb3\x8f\x4b\x65\xb9\x9c\xa2\x3f\x2e\xa7\x6e\xc9\xcd\x97\x13\xb1\xbc\x88\x69\x4f\x10\xdd\x99\xd5\x14\x1f\x5e\x4d\xfd\x40\xdf\x8d\xfd\x33\xd9\xa8\xe8\x3c\x08\x50\xa5\xb6\x48\xdc\x5b\x72\xd3\x20\x91\x1a\xdd\x21\x43\xf0\x9f\xbb\xdd\xb4\xb5\xac\x8b\xb3\x9a\xc2\x2d\x2b\x1c\xb3\x99\xd9\xd6\x0c\x70\xd0\x72\x8f\x6f\x66\x21\x12\xbf\x45\x2f\x52\x10\xb9\xbd\x83\x18\x5a\x16\xf6\x90\x81\x27\x09\x89\x33\xeb\xb2\x5b\x96\x68\x67\x45\x76\x58\xcf\x9a\x44\x99\x20\xa4\xbe\xa5\x0d\xf2\x3e\xfd\x7f\xec\xbd\x6b\x6f\x23\xc9\x91\x2e\xfc\xfd\xfc\x8a\x5e\x7d\x38\x58\x2f\x32\x63\x2a\x23\xaf\x35\x8b\xf9\x40\xcb\xf6\x72\xf1\x52\x6b\xe3\xcc\x98\x0b\xe8\xec\x8b\x83\x6a\x36\xbb\xa9\x77\x4a\xa2\x20\xaa\x39\x1e\x2f\xf6\xbf\xbf\x88\x27\xab\x8a\x75\xa1\xd4\xa2\xc4\x1e\x8f\x0f\xd6\xe3\x2e\x49\x75\xc9\x6b\x64\x64\x64\x66\xc4\xf3\x50\x11\x46\xc1\x37\x57\x5c\x28\x66\xac\x64\xec\x49\x1e\x3b\x5f\x82\xae\x32\x45\x83\xdb\x87\xf3\x60\xed\xfa\x88\x7f\xf2\x14\x67\xc0\xcd\x5e\x1c\x8e\x7e\x15\x77\x7b\x77\x19\x0e\xf0\x8d\xb3\x5f\x7f\x47\x37\x52\x19\xf2\x9e\x9b\xc7\x9e\xdb\x39\xce\xc4\x6c\x21\x6b\xcd\x30\x66\xe3\xda\x27\xb2\xa1\x6d\xf4\x85\x29\x5a\xc4\xda\x38\x88\x83\x16\xdb\x80\xa5\x3f\x7d\x73\x69\x1e\x70\x8b\x5e\xd6\x8d\x8e\x68\x6a\x4b\x5c\xca\x64\x95\x32\x04\xf3\x02\x3e\xac\x14\x87\xeb\x40\x20\x11\x7f\x21\x39\x51\x48\x06\xf0\xde\x8c\x69\xf2\x20\x1b\x5f\xa4\x11\x7b\x31\x76\xf5\xf7\xdb\x87\xc7\xdf\x3e\x8d\xb1\xce\x89\x3c\x08\xb5\xa3\xcc\x7f\x23\x27\xdc\x74\xd8\x5e\x3b\x8f\x1f\x6e\x6f\xab\x1d\xbb\x95\xe5\xd1\x6c\x4d\xbf\x77\x4e\xcd\xf6\xf9\xc3\x4c\xa0\x1d\x61\x07\x71\x9c\xed\x26\xd0\x5b\x3d\x74\x07\xed\x7e\xb9\xad\xeb\xea\x7e\xb7\xbe\xac\x1e\x3e\x3c\x03\xe0\xac\xd8\xcc\x47\xdb\x23\x63\xb6\xe4\xf9\x70\xbb\x44\x9b\x25\xf3\x80\xa0\x55\xb1\xb9\xbe\xd5\x46\x85\xb9\x5b\xb2\x9d\x23\x36\xe9\x84\x6e\x7a\xde\x99\xa4\x20\xe6\x1a\xa0\x62\x72\xa9\x7a\xf6\x50\x33\x09\xba\x01\x98\x96\xa8\x42\xf0\xa8\xa6\x5a\x6c\x43\xc6\xa5\x9a\xbc\xa2\x86\xe9\x3c\xeb\x21\x73\xbc\x97\x9f\x57\x76\xee\x95\xa5\x06\x5e\xa6\x4b\x40\x5b\x3b\x7f\xa9\xed\x13\x9b\x97\x87\x58\x83\x1e\xf3\x7a\x6f\x43\x32\x8d\x59\xa4\xce\x02\xac\x5a\x50\xac\xc5\x8e\x2c\x71\x99\x70\x5a\xa8\xde\x16\x33\x80\x62\xd1\x40\x91\x52\x6c\x0d\x28\x1b\x27\x7c\x17\xaa\x3f\x80\x8e\x91\x2d\xbe\x12\xc0\xd0\x80\xc4\x89\x89\x8d\x4a\x14\xcd\xb8\xb0\x7c\xbc\xb0\xb2\xde\xeb\x0a\x9b\xbe\x58\xd8\x97\x2a\xd9\xe9\x60\xff\xfd\x5f\xee\xab\xbb\x0f\x5f\x1a\xea\x61\x6e\xfb\xf6\xd3\x91\xbd\xbb\xe9\x50\x8f\xc3\x91\x1e\xc0\x1a\x02\x3a\xef\x34\x3f\x31\x08\xf1\x59\xb5\xe8\x70\xb2\x9d\x42\x03\xf2\x68\x5d\x2d\x03\x57\xe5\xd1\x1b\x63\xbb\x5f\x27\x06\x4d\x90\x55\x6a\x7f\x20\x90\x8f\xf9\x3c\x05\xb8\xa4\x45\xaa\x31\xe8\x54\x33\xf2\x3a\xbc\xd3\xce\x58\x3a\x49\x9b\x7f\xa9\xd4\x6c\xda\x52\xc7\xd7\x97\xda\xf8\xf3\x16\xfb\xc8\x40\x3f\xbf\x20\xb0\x05\xf2\xae\xc8\xf2\x04\xd4\x39\x8f\xd5\x3a\xc3\x0d\x0e\x85\x5f\x4f\x85\x3f\x6f\x04\x36\x7a\x53\x35\xe9\x16\xbd\x23\xa5\x5e\x56\xd9\x57\x90\x8f\xe7\x58\x50\xb2\x27\x67\x9a\x6a\xd1\x3f\x4a\x2e\x93\x2c\x8d\xa7\x17\x93\xb2\x1f\x41\x77\x7f\xb8\x59\x7f\x5c\x55\xcf\x10\x8d\x63\x30\x55\x9d\x3e\x97\xab\x4c\xa2\x86\x2c\x57\x91\x64\xc5\xdd\x56\x00\xcb\x67\xfb\x12\x9a\xfe\x92\x52\x59\x85\x0c\xab\x18\x5b\x04\x2e\x3e\xaa\x60\xbe\x6c\x3e\xf5\xf7\xbd\xb0\x03\x38\x3e\x28\xf1\x54\xe2\x98\xc2\x24\x59\x0b\xf1\x9c\xdd\xde\xf4\x28\x87\x10\x99\x2e\xdf\x9d\x6e\x42\x8d\x44\x96\xdd\x52\xfa\x74\xc6\xd8\xce\x41\x4c\x4a\x4e\x1f\x06\x2e\x6f\x74\x24\x33\x79\x88\x5d\x38\x9b\x96\x13\x89\xdf\xa7\x1e\x67\x93\x57\x7e\x63\xa5\xd8\xe3\xad\x4d\x54\xce\x14\x52\xb9\xd8\xc3\xd9\xb4\xda\x42\xfd\xed\x07\x37\x95\x9d\x73\xda\xf3\xc6\xf4\x53\xd6\xfe\xd8\xc8\x61\x15\x32\x17\x90\xb3\x33\x72\xfe\x80\x45\x60\x1c\xa2\xe6\x37\x91\x8c\xa9\xc8\xd9\x03\xe8\x2a\x39\x77\x5a\x07\xda\x49\x2b\xca\x4a\x6b\xe6\x64\x7d\x88\x4b\x53\x22\xa7\x8c\x5b\x36\xcd\xeb\xac\xb4\xa0\x53\xb8\x1c\x6f\xde\xc1\x43\x34\xaf\xb3\xf2\xf9\x7e\x9a\x74\xa0\x02\x88\x44\x0e\x0d\xc9\x1b\xde\x83\x25\xa0\x3b\x03\x90\x26\x66\x59\x5a\xcf\x65\x1d\x3c\xc3\x62\x38\xb4\x9f\x1b\x85\x5d\x5f\x57\xee\x4b\x72\xfe\x8b\x42\x2f\x6f\x76\xa7\x27\x46\xbb\xec\x3c\xe4\xe3\x9c\xd3\xd2\x24\x9c\x46\x3f\xdb\xda\xd5\xe0\x01\xfe\x90\x6a\x19\x77\x7d\xc5\x41\x1a\x21\xf0\xd1\x92\x1b\x48\x3e\x77\x55\x7c\xb5\xae\xb8\xdc\xd6\xdb\x87\x3f\xdd\xac\x7e\x5c\x3f\x3c\x37\x87\x9b\x82\x0a\x5f\x79\x2a\x22\xf6\x83\xda\xb9\xc4\x48\xf7\xc4\x99\x97\x6a\xfb\x43\x0f\x70\x50\x76\x21\x86\x56\x52\x89\x8c\xaf\x58\xe6\x12\x6e\xf7\x0b\x44\x66\x8b\x5a\x53\x88\xf2\x6f\x61\x3c\x45\x56\x89\x4a\x56\x1c\xa9\xc8\xb6\x77\xaa\xbb\xad\xbb\xf6\xc5\x71\x2a\xaa\xd0\x56\x5a\x09\x5b\x47\x96\x52\x35\xa4\x48\x10\x45\x5b\x24\xb0\x5d\xd5\xd8\xca\xc5\x65\xc4\xa3\x90\xfd\xc2\x54\x49\x1e\xe4\xd9\x01\x0c\xdb\x15\xb8\xd7\xec\x01\xa9\xdb\x91\xf5\x9a\x8c\x1a\xdd\x97\x5b\xee\x08\x64\xfd\x29\xda\x2d\x92\x55\xd6\x90\x37\xfd\x2d\x08\xe0\xe9\x52\xb2\x0b\x93\xb0\x89\xe3\xc8\xc7\xc3\x5e\xa6\x59\x58\x11\x70\x8e\xc4\xb1\xc7\x49\x90\x8f\xa5\xd2\x82\x52\x29\xcb\x72\xdf\x3f\xaf\xc5\xbd\x11\x29\x38\x03\x63\xd5\x59\xd0\x35\x55\x16\x54\x51\x72\x69\x9a\x85\x8a\x92\x9a\x51\xd5\x1b\x5a\x9c\xf9\x9d\x78\x81\x03\x40\x10\x1e\x98\x3c\x3f\x02\x8c\xf6\x6d\xca\x16\x3c\x28\x84\x13\xb9\x3e\x52\x7a\x21\x76\x7a\x20\x60\x35\x27\x6c\x06\xa7\xca\x52\xe6\x65\x39\x50\x9e\xe6\xf3\x98\x28\x1f\x25\x38\xc1\x44\x04\xe5\x95\x07\x39\x9a\x81\x84\xc7\xb6\x18\xe5\x46\x71\x82\xc3\x8f\xad\x0f\xdc\xea\x43\xfe\x8e\x8e\x9c\x85\xcc\x49\x93\xf1\x60\xfa\x62\x40\xa3\x87\x4c\x2c\xe4\xc2\xb1\xde\xe6\xa6\xb7\x4b\x50\x19\xb9\xba\x77\x52\x67\x89\xf9\xc9\xae\x36\xd2\x31\xe8\xeb\xc1\xee\xcf\x60\x15\x53\xb4\x8c\x7c\xd2\xcd\xaf\xec\x6b\xec\xdb\xa6\x97\x5b\x24\xd3\xdd\x98\xcb\xed\xfd\xcf\x3f\x6c\x2f\xeb\x9b\xfb\xf7\xdb\xe7\x56\x0b\x0c\xc0\xe9\x39\x94\x7f\x65\x21\xb6\x99\xdb\x22\x33\x23\x5a\xa3\x8a\xb9\xd8\xbf\x32\x23\x18\xc5\xd9\xb8\x42\x25\x71\x6e\xbb\x34\xc5\x9c\xfd\x32\x1c\x79\x21\xa7\x2c\xd6\xa3\x4a\x73\x63\x97\x81\xd8\xcf\x06\x50\x1d\xc6\x02\xdb\x66\xc3\x14\xca\x9a\x0c\x63\xa7\x7b\x86\xb3\x6b\x73\x00\xff\x36\x01\x8c\x4b\xd5\x61\x8f\xd0\x36\x94\x70\xa9\x96\x76\x4c\x6e\xc3\x54\xbe\x11\x04\x64\x22\x45\xe0\xee\x92\x3e\x28\x82\x34\x8e\x05\xa8\xb6\x83\xd8\x0c\xfd\xc0\xb8\x31\x2f\xa3\xac\x1b\x4b\x2a\x44\xad\xb1\x18\xf7\x03\x77\x0d\x8a\x79\x63\xb8\x7f\x43\x1b\x59\x17\xb7\xc9\xba\x79\xa6\x0b\x7b\x09\x0c\xdf\x8b\x86\xb7\x64\x17\x36\xbc\x0c\xd9\xfb\x16\x3b\x8f\xa1\x13\x35\x48\x3e\x00\x54\x8a\xb4\x8c\xf3\x29\xb3\xd1\x29\x06\x07\x83\x4b\x30\x2e\xe3\xbc\x5c\xfa\x79\xa0\xe0\x26\x19\x7a\x78\x36\x2c\xad\x18\xbc\x93\x87\x38\x96\xb1\x76\x2e\xa5\x0a\x93\xa7\xd6\x00\x02\xdb\x2e\x99\xd1\x1b\x27\x87\x81\x0f\x06\xc6\xef\x1e\xaa\x4f\xf3\xea\xee\x43\x3d\xb1\xd5\xfb\xfb\xc6\xbe\xf1\x04\xe6\x86\x49\xeb\x84\x80\x7d\x88\xd2\xb1\xc4\xd8\x9d\x9e\x18\x8f\x13\x63\xf3\xfa\x92\xd9\xa7\x12\x7b\x4d\xc9\xdc\x93\x25\x4b\xa7\x27\xe6\x9f\x6a\xb3\xd7\x24\x16\xa6\xcc\x0f\x37\xf5\xe3\xfa\xe1\x99\x63\x1f\xab\xcc\x60\x77\x14\x27\x3e\xd6\xbe\x7a\x30\x4e\x27\x25\x59\x25\xcf\xd3\x18\x75\xf3\x0b\x7b\xef\x27\x0d\x77\xab\xd8\x0e\x3c\xe0\x72\x16\xaf\xaf\xc4\x74\xf7\xe9\x6a\x7b\x04\x31\xe8\x80\xbe\x0f\xa8\xa7\x21\x43\x26\xf9\xb0\xd2\x38\xc4\x97\x5f\x33\x5f\x8f\x2a\x66\xc6\xc8\xfc\xd1\x18\x05\x4e\x0c\x51\x4f\x61\x70\x68\x18\x8c\x36\x03\x58\xd9\xa8\x01\x40\xe6\x28\xe6\x4b\x63\xa8\x68\x1c\x2f\x7a\xb8\xaa\xfb\xc3\x49\x2f\x38\x11\x19\x9e\xc3\xa0\xb0\x3c\xb8\x4c\x19\xb1\x5d\xd2\xc8\xeb\x0f\x05\xbf\xbe\xc2\x8a\x5a\x94\x8d\xe1\xca\xe0\xdc\xd8\xd8\x83\x77\x46\xa1\x39\x20\x4d\xec\xed\x98\xc3\x71\xbd\x62\x45\x26\x64\x90\x9b\x56\xdd\x81\xa8\xd1\x92\xb7\xb3\x4c\x58\x9a\xaf\xcd\x8c\x76\xc8\xe6\x4d\x32\x55\x12\x7c\xdd\x22\x4b\x1e\x99\x3b\xa3\xe8\xa1\xc1\x81\x43\xc2\x65\x46\xaa\xe6\xda\x34\x01\xa8\x23\x5d\x75\x80\x1a\x2b\x72\xd8\x91\x18\xf5\xdc\x5c\x9b\x57\x0b\x02\x24\x31\x78\x09\x22\x6a\x1d\xbb\x5a\x77\xf9\xbf\x7a\x2d\xf4\xfd\xe7\xa7\xe5\xc9\x24\x15\x68\xea\xaf\x79\x70\xb1\x6e\x5c\xa8\xf6\x76\xb0\x0b\xd1\x7c\xf6\x96\x86\xcd\x4c\x33\xa1\x1c\x9d\x96\xd8\xf1\xb6\xc1\x5e\x4f\xb2\xc6\x77\x6f\x19\xc6\x89\x2c\x83\x29\xa2\xef\x55\x33\x3a\x66\x8e\x46\x0f\x8d\x89\x66\x8b\x2b\x92\xb5\xca\x83\x76\xb8\x7b\x04\x32\x33\x79\x70\xea\xc0\x1f\x00\xc7\x05\x70\x69\x72\x18\x99\x3e\x58\xd5\xd4\xad\xe1\x37\x32\x77\x06\x80\xcb\x51\x0f\xfe\xce\x1b\xff\xa7\xce\xe3\x7d\x98\x47\x6b\x94\x49\x23\x87\xd5\xa1\x6c\xe0\x54\x76\xd8\x41\xcd\x67\xa7\x42\xaf\xf4\x74\x1c\xd6\x48\x26\x6e\xf4\x41\x18\xcc\x21\xab\x57\xab\xda\x30\xcc\x06\x42\x80\x06\x17\xfb\x10\x1b\x31\x43\x9f\x2a\x95\x07\xe3\x50\x24\x2c\x7a\x42\x33\xb9\x63\x16\xea\xa9\xe0\x26\xfd\xfe\x3f\x2a\x7f\x92\x9b\x1e\x95\x6c\x74\xa0\x53\x74\xcc\x7f\x47\x64\x24\xaf\x89\xfb\x9b\x75\x92\xcf\x09\xc5\x4c\xc3\x62\x02\xd6\x45\x45\x1c\x8f\x17\xd8\x4a\x2f\xf2\x72\x15\x4d\x51\xe4\x3f\x67\xa6\xc0\x1e\x45\x71\x58\x71\x1e\xbe\x03\x77\x56\x12\x23\x1c\xb7\x52\xfb\xb9\x51\x49\x27\x32\x3c\x4b\xf2\x55\xea\xc8\x26\x9b\x4f\xf9\x14\x74\x8d\x72\x5c\x68\x05\x8e\xe1\x2f\x29\xb9\xa5\x1f\xb6\x55\xf3\xdd\x29\x8a\x77\xac\xdf\x7c\x9a\xe8\xb7\x81\xdf\x8e\xe4\x9a\x5d\x6b\xc7\x1a\xce\x9f\xc4\x16\xd6\x17\x6b\xa7\xca\xe1\xdc\x0b\xe6\xdc\x44\xee\x34\xdd\xf5\xdc\x71\xd9\x50\x6f\x81\x02\xb8\x1c\xb9\xe4\x62\x81\x5e\x83\x38\x4a\x2e\xc3\x5d\x1a\x73\x54\x35\x3d\x17\x7f\xdb\x57\x4b\xa2\x13\xbf\xac\x96\xe6\xa3\xde\x6c\xbe\x7b\x61\xa6\x4f\xe8\xa4\x39\x3a\x6b\xa2\xff\xbc\x79\x95\x7f\xc7\x44\x23\xb9\xdc\x94\xb9\x53\x80\xf2\x3b\x6a\xb7\xec\x3e\x8c\x0e\x95\x96\xef\x07\x0f\xb4\x1f\xbf\x30\xef\x89\xfe\xa1\x00\x41\x41\x97\xe9\x61\x97\xf5\x7d\xac\x51\xbe\x34\x3c\x93\x68\xbf\x7d\x61\xd6\x69\xb2\x10\x19\x32\xfc\x99\xe2\x65\xe9\x94\x13\x53\xe7\xdf\xab\xbb\xe3\xbb\x30\xa7\xfa\x9c\x3b\x42\x08\x44\x9e\x01\x28\x54\x99\x43\xef\xe0\xb9\x6b\xe0\x85\xe8\xdd\xa6\xa8\x18\xdb\x96\x72\xe9\xda\xca\x53\xe0\x85\xa1\x18\x60\xbe\xd9\x3e\x46\x23\x60\xb6\x31\x9d\xcb\xb0\xb0\xb3\x51\xc2\xca\x93\x2d\x95\xf5\xd3\x74\xa5\xe7\xbd\x96\x84\x2d\x8e\xa2\xca\x3e\x32\x25\x8a\x7b\x7d\xe5\x1b\x77\xfc\xb2\x61\x77\xb6\x05\x05\xbf\x29\x16\x0c\x57\xea\x92\x9c\xcc\x5e\x2c\xa9\x72\xba\xbe\xb2\x9c\x09\xb6\x6d\x59\x6b\x58\xf5\x1e\x21\x15\x5e\xcc\xef\x24\x73\x8f\x27\x03\x9e\x2e\x75\xf8\xe8\x4c\x31\x81\x4c\x1e\x2e\x8d\x2e\xd6\xa0\x0f\x03\xcb\xf0\xc8\x41\x03\x97\x1a\x8f\x54\xf7\xd2\xd1\x37\x71\x9e\x5b\x0f\x5f\x54\xa3\x17\xd5\xf0\xc5\xc3\x3b\x47\x5f\xd4\xf9\x84\xf8\x6d\x95\x6d\x83\x7f\xb0\x2e\x82\xbf\xe6\xb8\x38\xf0\x45\x75\xca\xd7\x06\xfc\xb6\xe4\xca\x59\xef\x15\x2e\x32\xa5\xbb\x81\x53\x17\x76\x0c\x19\xf8\xd2\x47\x5b\x2a\x27\xc5\xa0\x7f\xf7\x19\x46\x9a\xe3\xac\x7f\xf2\xed\x32\xf5\x98\x3b\xe4\xb6\xc8\xf7\x24\x97\x7e\xc6\x87\x12\xbf\xb5\x09\x5c\x1b\x64\x24\x8b\x7f\x3f\x00\xe9\x6b\x9b\xa0\x06\xf7\x9f\xc1\xda\xae\xbd\x8c\x0f\xec\x9b\x0a\x62\x44\x19\x7b\xf8\xa2\xf7\x5e\x5f\x64\xba\x74\x16\x25\xb6\xc2\x0b\x0a\x69\xfc\x2a\xd2\x5d\x60\x8d\x66\x1a\x20\x17\xe3\xc4\x76\xe9\x15\xf0\x50\xec\x49\x4c\xc6\xe5\xe7\x87\xdd\xf6\xe1\x6a\xbb\x7f\x06\x0b\x13\x80\xce\x86\x29\x8d\xa6\x46\x1e\x78\x0d\x66\xbd\xbe\xb0\x05\xc9\x4a\x31\xce\x4d\xb9\xf4\x94\x42\x0d\x7e\x12\xa6\xc9\x04\x50\x4c\x97\x24\x62\x30\xe4\x8c\x54\x1c\xd2\xee\x11\x97\x43\x1b\x56\x14\x1a\xc5\x05\x62\x63\x53\x58\x9a\x38\x6f\x32\x8b\x20\xc6\xf9\x82\x95\xc9\xaa\x58\xc8\x1c\x2a\x9a\xc1\x81\x7e\xef\xf9\xdd\x57\x2d\xd9\x2d\xb2\x23\x4a\x39\x37\x71\x89\x5a\xd6\x99\x83\x67\x50\x37\x9d\x0b\xd6\xff\x1a\x45\x97\xba\x59\x27\xf9\x19\xd1\x51\x6e\x5c\x40\x9e\x98\xc1\x4d\xf4\x8a\x71\x4b\x53\xce\xbb\xfc\xa2\x1a\x55\xef\x09\xf3\x9e\xcb\x05\xc0\xa7\x4f\x5d\xd9\x0e\x85\xa3\xde\xde\x3d\x2d\x17\x41\x85\x39\xf3\xde\x6d\x78\x19\x46\xf8\x04\x7d\x34\x5f\xa7\xc2\x92\x47\xf1\xf5\x1b\xb7\x64\x9e\x9f\x62\x09\x8f\x8c\x52\x5b\x28\x33\x84\x61\xd6\xac\x78\x69\x8b\xf1\x89\x70\x31\x3e\x11\x76\xfd\xe9\x46\x52\xc9\x76\x3c\x4e\x6c\xdd\xfc\x24\x70\xbe\xc6\x60\x1d\x81\x0b\xb3\x79\xc7\xe9\x1d\xdb\xf6\x6a\x7b\x7f\x1a\xfc\x82\xab\x09\xf2\x4b\xbe\x76\xbf\xc8\xd5\xf6\x5e\x3b\x01\xd5\x7a\x6c\xce\x3a\x65\x8a\xd7\xf4\x8b\xe1\xde\xd9\x09\xbf\xd8\x02\xfc\x8a\xfd\x83\x08\x5b\x3b\x67\xbb\xf7\x73\x36\x4b\xb6\x08\xaf\x35\x1b\xbf\x34\x61\xc3\x7b\xbf\x79\x29\x75\xf7\xf4\xdc\xeb\x77\xeb\xc7\xea\xa6\x7e\x1a\x9e\xdf\xb2\x0a\xf3\x7e\x89\x58\xa5\x17\xf8\xda\xa4\x21\xd8\x76\x00\x87\x31\xbf\xc6\x39\x6e\xd0\xa8\xa5\x32\x6e\xce\x71\x68\xa1\xcf\x47\x61\x7b\xa7\xcb\x6f\x2f\xf9\x74\xce\xe4\xed\x38\x79\xe6\xb9\x29\xcf\x96\xfc\x68\x35\x75\xae\xae\xba\x32\x28\x68\x39\xf2\xfe\x36\xe5\xc8\x09\xfb\x36\x69\x37\x79\x8b\xc7\x0e\xe2\x88\xff\xfe\xe2\x5b\xaf\xdd\x10\x3d\x9c\x4e\x5d\x6e\x1f\xee\xa6\x1e\x22\xfd\x95\x09\xbf\xfe\xf0\x66\x7a\x46\x95\xce\x78\x46\x35\x5e\x33\xbd\xed\x8c\xca\xbd\xfe\xc0\x6b\x7a\x46\xe5\x5e\x5f\xcd\xc9\x19\x55\x57\xb2\xb3\x9c\x51\xfd\xfe\xa1\xda\x3d\xe7\x11\x84\x48\x21\x51\xe5\x99\x25\x3a\x75\xa8\x3c\xc9\x69\x5e\x30\x30\x6c\x98\x82\xaf\x98\xe4\x97\xf6\x08\xdf\x89\x5d\x84\xd8\x4e\x4b\x32\x76\x28\x21\x40\xec\xb0\xed\xef\x16\x20\x04\xb4\x3c\x39\xff\x1a\x9f\x4e\xcd\x4d\xa0\xe8\x6a\x93\xb4\x49\xb3\x51\x31\x54\x5b\xbe\xeb\x2b\x93\xb9\x87\x79\x6e\x0a\xb2\x61\xe1\xb0\x40\xf3\x62\x6a\x52\x72\x6d\xce\x8d\xad\x2b\x0b\x39\x2f\xe6\x93\x67\x59\xb8\x63\xf5\x2e\xcb\x3f\x4b\x16\xc7\x19\xde\x29\x83\x98\x52\x0e\xc4\xbe\xd6\xf2\x58\xa7\x6c\x19\x8b\x0d\x67\x29\x56\x94\x82\x58\x71\x45\xe3\x6f\x6d\x4a\x55\xd4\x39\x92\x8d\xcb\xe1\x43\x62\x4f\x61\x46\x89\x0f\x9c\xd7\xbd\x9c\x5e\xaf\xc5\x39\x33\x32\x7b\xb2\x56\x4c\x3c\x4e\x64\x63\xad\x4b\x2a\xe5\xdf\xc2\x4a\x2d\xd8\x8d\xd7\xe9\xf0\xf7\x08\x8b\xf2\x25\x2d\xff\xca\x19\xdb\x35\x5b\x9d\xc1\xd7\x3a\x92\x95\x7f\x93\xdd\x02\xa6\x90\xa3\x95\x5c\x54\x26\x52\x11\xea\x06\xc7\x69\xd1\x7c\x6e\x89\xa7\x9c\x2e\xbd\xa4\x5f\x3d\x53\x2f\xaa\xbb\x0f\xbb\x55\x75\xff\xac\xcf\xec\xaf\x6a\xae\x66\xae\x7a\xc2\x53\x28\xf2\xc0\x51\xe8\x2d\xcb\xf2\x02\x6e\x11\xd1\xc8\x89\xd2\x9c\x13\x19\x78\x92\x45\x96\xf6\x1b\x2c\x32\xf3\x02\x72\x36\x48\x92\x23\x72\x89\xe9\x70\x60\x49\x3e\x69\xe2\xb0\xb0\x06\xfb\x7c\xa9\xd6\x96\x5c\x04\x9d\x7a\x3f\x8c\xb8\x17\x3a\x32\xca\xa1\xee\x72\x9f\xc7\x1c\x3f\x1d\x59\x4f\x0a\x83\xcf\x8f\xa4\xb7\x70\x58\xb1\xa7\x5a\x72\x55\x92\xeb\x6c\x50\x3c\x69\x96\xd7\x5b\x28\x67\x9b\xe3\x19\x3e\xf8\x20\xe6\xe8\x39\x83\x53\xb4\x00\x15\x38\xdc\x08\xd2\x98\xb1\x7f\xa7\x08\xcd\xf6\x61\xc4\xa2\xab\x9c\x27\x59\x6a\x95\xb2\x2e\x2b\xc8\xf7\xfd\xcf\xb3\xab\xa9\x33\x3d\xe7\xf1\x12\xee\x8c\xc3\x1c\x35\x59\x5e\x00\x6e\x03\xad\xe6\x4b\x6d\x29\xf5\x49\x1a\x24\x6d\xe3\xc9\xa5\x45\xc2\xb2\x34\xce\x91\xf7\x82\x03\xd9\xfc\x60\x18\x41\x82\xf0\x01\x08\x80\x0d\x2f\xdf\x26\x9e\x1a\x17\x7f\xaa\x76\x8f\xcf\x8c\x36\x18\xf8\x1c\xf6\xbc\x71\x7b\xde\x1c\x35\xdc\x4f\x1d\x3c\x6d\xd0\x91\xcd\x8c\x23\x32\x53\x4e\xf9\x30\xc2\xeb\xa5\x47\xca\x95\x7d\xb1\x27\xf4\x38\xe1\xb4\x95\xdf\x74\xb1\xc5\xa7\x2f\x82\xe7\xcc\x7d\x51\x96\x34\xae\x9b\x45\xf5\xa9\xab\x63\x37\x68\xbf\x86\xb1\xc5\x1e\xa0\xaa\x42\x1f\x45\xea\xb5\xc7\x99\xc6\x01\xe8\x88\xf7\x6e\xb2\x68\xb4\xc5\xfc\x24\x0e\x81\x70\x6c\xb5\x78\x92\x30\x3d\x3b\xa9\xbd\x4a\x90\x5e\x76\x2a\x75\xaa\x10\x3d\x7b\xf8\xd4\x96\xd3\xa1\x98\x07\xd4\x2f\xe9\xc0\xae\xbf\x5e\xcf\x78\xf3\x3a\x81\x78\xd9\x39\xd2\xa9\xc2\xf0\xdc\xc1\xd1\x50\xed\x6c\x1f\x1e\x1f\xaa\x9b\xe3\x98\x84\xc8\xd9\x03\xb6\x20\x90\xf3\xc7\x42\x21\x7b\x73\x52\x33\xa3\x61\xeb\x4d\xa6\xc3\x5a\xe6\x23\xcc\x87\x83\xa9\x50\x51\xe1\xf3\x7c\x76\x24\xf6\x92\x92\xc2\xac\xbc\x6c\x26\xc3\x14\x40\x6b\x38\xdc\xd8\x2d\x92\x7c\x80\x90\x2d\xd7\xf8\x1d\x71\x50\x89\x6c\xaa\x8e\x94\xe7\xe8\xe6\x39\x2b\xc9\x60\x89\xbc\xde\x64\x5b\xf2\x08\xdc\xd2\xbd\x00\xdc\xd2\x0d\xf1\x84\x1b\xba\xc1\x79\x5a\x02\xd1\xec\xd5\x0a\xf7\x5c\xa5\xb9\xc2\xd4\x2a\x5d\x6e\x07\x53\x1d\xa0\x73\x5c\x6c\xfa\xd7\x86\x1a\x53\xa7\x96\x49\x74\xf4\x9e\xce\xef\x45\x85\xa9\x73\x89\x39\x1b\x53\xa7\xcc\xae\x83\x70\xb0\xee\x5d\x80\x48\xb9\xda\x66\x5e\xf3\x41\x8a\x88\x5f\x19\x84\xa2\x3e\x65\x3a\x84\x05\xce\x18\xb9\x04\x46\xea\xeb\x23\xc6\x7e\x78\x58\xaf\x97\x37\xeb\x9f\x9e\x19\x14\x58\x54\x0c\x22\xee\xb4\x59\x0e\x76\x1a\x8c\x36\x9b\x7e\xdc\xbc\x51\x66\xef\x7a\x86\x06\xd2\xb8\xbe\xd5\x56\x8b\x0a\xe6\x34\x7f\xc5\x14\xde\x2f\x90\x09\xfd\x02\x65\xaf\x01\x43\x3c\xf7\x94\x96\x66\x48\x2a\x3e\x8e\x24\x8c\xd3\x58\xc4\xbd\x1b\x85\x22\x3a\xe2\x25\x97\x94\x36\x81\xec\xc4\x38\x0d\x39\x97\x92\xd2\xdc\x14\x4b\x36\xc3\x6f\x37\x93\x70\xb5\x7e\xe6\x28\xfa\xf5\x95\x53\x69\x1e\xf6\x3c\xcf\x98\x95\x5c\xcc\x0d\x2f\x4d\x9a\x86\xf2\x9c\x60\x80\x38\x55\x8e\x4f\xfb\x8b\x3d\xcf\x6d\xbf\xaa\xf2\xd2\xeb\x2d\x11\x6b\xb1\x97\x9d\xf6\x6f\x72\x48\x1d\x6f\xad\x59\xc5\x6f\x4f\xd4\x0f\xa6\x24\xd3\xb0\xca\x85\x63\x53\x52\x78\x75\x60\xf9\xdf\x42\x00\x25\x93\xde\x74\x70\x1e\xf1\x7b\x9d\x71\x82\xe0\x89\xe2\x05\xfd\xf4\x32\x9f\x98\x13\xa4\xe9\x65\x2e\x2f\x27\x48\xd2\x73\x66\xc8\x91\x13\xcc\x79\x75\xf7\xe1\x5f\x1e\xaa\xf7\xcf\x9d\x62\x16\x25\x7c\x25\x7b\x91\x3a\x86\x4c\x20\x53\xae\x34\x19\xf0\xcf\x39\x6d\x64\x99\xce\x64\x12\x00\x97\xf0\x5b\x0f\x92\x86\x11\xde\x26\x13\x82\x8d\xf9\xd2\xf4\x59\xa9\x64\x72\xb2\xe4\xbc\xb2\x6d\xbc\x60\xa1\x1b\x6c\x25\xcb\x0a\xb0\x3c\xb8\xb4\x19\xa7\x52\x93\x37\x33\xc4\x8a\xd9\x9e\x73\x84\x01\x0c\xff\x9e\x4a\xb3\xd2\x86\x8a\x40\x4e\xbb\x0c\x79\x96\x34\x8c\x0b\x47\xc9\xed\xc4\x04\x02\xb2\x62\x09\x27\xdb\x54\xb1\x27\x06\x24\x1c\xf7\xfc\xa1\x54\x20\x67\xe8\x00\xb3\x4d\xde\x92\xac\x1f\x3d\x79\x5f\x51\xc9\x54\x0e\x36\x27\x0c\x36\xca\xe0\x98\x7c\xc0\x0e\xb2\x14\xbd\x0e\x64\xec\x8c\x3d\x81\x34\xa4\x0b\xbe\xca\x73\x60\xda\x6b\x4f\x5e\x2a\x02\xc4\xe6\xee\xd0\xbf\x6b\x6f\xd0\xdd\x06\x78\x60\xca\x22\xc7\x75\x73\xad\x03\x4c\x99\x9f\x19\xc6\xe9\x36\xae\x79\x88\x48\x3d\x94\x65\xc2\x3e\x99\x8b\x15\x03\x3e\x29\x5f\xf3\xd7\x9e\x58\x7b\x8a\xbc\xd2\x4c\x36\xca\xc4\x1f\xb4\xd5\x89\xd8\xc2\xe5\x47\x9b\x82\x6c\x39\xf3\x14\x95\xa7\x0e\xb2\x13\xa8\x9d\x31\xec\x23\x62\xe9\x7b\xf0\xe3\x52\xa7\xa5\xb4\xfb\xaa\xd0\xe4\x22\xd8\x08\x1b\x40\xe6\x9d\x21\x57\x36\x48\x6c\xa5\x32\x7b\xc9\x74\x63\x28\x2d\x13\x25\x23\xaf\x73\xc2\x9e\x4b\x6c\x3e\xa0\x28\x9f\xf8\x0c\x5d\x20\x3f\xa3\xdf\x07\x4a\x25\xbe\x31\x45\x4d\x26\x6a\xc2\xce\x2c\xb0\xfd\x3a\x23\xc5\x24\x4d\x96\x57\x39\xec\xcb\x90\xcf\x88\x5b\x9e\x42\xaa\x81\xc1\x39\xe7\xb8\x34\x86\x52\xac\x4c\x76\x8a\x28\x7b\xdf\xb2\x26\x6b\x57\x79\xef\xd2\x90\x07\x15\x3d\x7e\x9e\x8e\x6f\xf8\xc4\xd8\xfa\xe3\xfd\xfa\x39\x67\x7e\xe9\xba\x44\x3e\xce\x5a\x38\xb5\x9e\x9b\xa6\xa7\xe8\x2b\x2b\xd2\x85\x4b\x1e\x00\x8e\x42\xd0\x4c\xc1\x29\x4b\x5c\xe6\x4b\x7e\x12\x10\x53\x1a\x83\xdc\xb3\xf9\xd2\xcd\xea\x41\x93\x0b\x33\x19\x99\xca\x1e\x50\xc5\x8c\x81\xc7\xcf\xd2\x44\x4a\x4e\x46\x0d\x8b\x3d\x2e\xc9\x03\x37\xcd\x24\xcd\x14\x41\x4e\x05\xf0\xee\x7e\x39\x94\x07\xf6\x1e\x53\x59\x8d\xc6\xb4\x6e\x76\xb0\x5c\xba\xcc\x21\x82\x49\xae\x1e\xdb\xcb\x8e\x3c\x86\x5f\x5a\x61\xbb\x16\x8e\x46\x41\x06\x53\x50\x11\x34\xe6\x35\xa2\x18\x31\xd0\xca\x93\x07\xda\xca\x68\x04\xb1\x8a\xf4\xe8\x98\x81\x0c\x7d\xd2\xc6\x92\x0f\xd7\xa2\xc7\x4c\x42\x08\x02\x57\x93\x81\xa3\xa5\xc7\x95\xa7\x22\xe5\x0d\xe6\x95\x06\xcf\xa1\x91\x55\x4f\x11\x45\xdd\x69\x4f\x29\xca\xe8\xf1\xdf\x5b\x79\x57\x96\x1e\x31\xfb\xe4\x98\x40\x5c\x56\x86\x80\x0d\xd5\x9a\xba\xce\xb7\x5e\x26\x18\x02\x9e\x0f\x42\xe7\x74\x06\x64\x6f\xc0\xde\x0e\xe6\x36\x53\x34\x2b\xe2\x52\x6e\xb2\x58\xe9\xd2\x8d\x3e\x2a\x47\xde\x2e\x0c\x13\x1a\xd3\x2e\xa5\xcf\xaa\xcc\x1c\x9f\x89\xe3\x0d\xe0\x2e\x4b\xaf\x8a\xa5\x09\x64\x31\xcc\xf6\xda\x58\x29\x13\xe4\xb9\x95\x78\x9b\xdf\x70\x1e\x83\x2a\x54\xfd\x32\xe4\x44\x12\x12\x89\xe4\x9c\x8c\x9b\x0c\x18\x05\x27\x98\x1e\x5c\x2c\xb4\xf1\x5e\x74\xe1\xa5\x28\x28\x86\x53\x52\x09\xe8\x3d\x80\xe3\xf6\x5a\xfa\x4d\x83\xe8\x0f\x37\xf5\xfa\xfa\x09\x90\xe3\x6e\x4b\x81\x78\x69\xb8\xd6\x09\x21\xdb\xe5\x3c\x52\xba\x0c\x24\x6b\x10\x23\xab\x26\x51\xe5\x2a\xac\xda\x55\x64\xa1\x8a\xbd\x94\x71\x05\x8b\x03\x1e\x20\xd2\x88\xf8\x99\x5f\xca\x8a\x45\xae\x1b\x2e\xc8\xfe\xc7\xdd\x7f\x3c\xfe\xc7\xe3\x2a\xaf\x56\x93\x6e\x3e\xd1\x86\xe2\x65\xce\xdd\xaa\xa6\x14\xed\xcf\xbf\xbe\x03\x1c\x01\x85\xda\x53\x50\x9e\xdc\x9c\x11\x1c\x28\xf7\x93\x2c\x0e\x23\x95\x8b\xa4\xc2\xc6\xf0\x3e\x6d\xd2\xd2\x16\x7f\x7d\xfd\x5a\x81\x15\xbb\x55\xd1\xd4\xc0\x2a\xfc\xb7\xb3\x1a\xbf\x6b\xbb\xd7\x6e\xa3\xc3\x92\xdd\x5f\xdf\x01\x5c\x45\xb1\xdb\x8b\xea\xd8\x58\x31\xc0\xdc\x0a\xd5\xa4\x52\x17\x84\xb5\xb9\xce\x12\x1c\x57\xba\x10\x05\x4f\x88\x9c\x94\x87\xba\x79\x98\x1b\xe3\xb2\x49\x8a\x32\xb6\x92\xfc\x66\xda\xdf\x4e\xa8\x0a\x4f\xdc\xca\x59\xc9\x2c\x22\xf9\x15\xe4\xb4\xc9\x66\xbe\xdf\xf3\x86\x89\x2f\x45\x45\xc1\xbd\x1c\xef\x35\x71\xbb\xaa\x3c\x21\x43\x3b\x6e\x3b\x69\xb4\x62\x85\xda\x8b\x89\x8b\x4c\x95\xd9\x15\xe4\xf2\x1a\x4f\x32\xd7\x3c\x97\x17\x4f\xc8\x66\x64\xb8\x61\x87\xc2\x48\x5b\x63\x8a\xd1\x48\x5d\x9b\xdd\xa8\x8e\x73\x79\xef\x84\x5c\xc6\x9b\x4a\x90\x00\x2f\x22\x2c\xf9\x0c\x6b\xb0\x91\x99\xfe\x12\x9c\xae\x06\x61\x55\x08\xed\x6a\x7f\xf3\x27\xe4\x1a\x8e\xd5\x2d\x9d\xbb\x6e\x71\xb2\x1e\x61\x4f\x61\x05\xa1\x54\x06\xe2\x01\xe0\x4d\x99\xaa\xb2\x3c\xeb\x2c\xd0\x9d\x64\x96\xf0\xe4\xc3\x67\xaa\xf9\x7c\x9c\xff\xcb\xd6\x42\x6c\xa8\x54\xee\xa0\x54\x3a\x95\xe2\xa9\xec\x2b\x12\xc0\x31\x34\xca\xa4\x84\xe2\xe8\xa9\x8c\xb2\x51\x19\xa5\x98\x21\xe5\x22\xa7\x29\x43\x32\x75\xa3\xb7\x1d\xb1\xaa\x51\x38\x3b\x8d\x41\xac\x9b\x41\xdc\x8e\x61\xb4\x37\xb7\xed\xdd\xf6\xf3\xae\x6d\x78\x75\x18\x2f\x5f\x78\x27\x0b\x05\x77\xc2\xdf\xf6\x58\x93\x7b\x33\x14\xf4\xb3\xef\x0e\xde\x5a\xa6\x17\xe4\xda\x48\xc2\xbb\xdc\xac\x46\xd4\xa2\xaf\xb3\xa5\xe9\xe7\x72\xef\x85\x9d\x34\x3d\xe4\xcc\x91\xa7\x7f\xfc\xf8\xf1\xe9\xb9\x42\x0c\x0d\x77\x69\x65\x92\x07\xb6\x80\x55\x5e\x0c\x65\xaf\x3c\x4e\xd0\xeb\x7c\x00\xb6\x2f\x28\xd4\xba\x84\x37\x7b\xa8\x8d\x94\x9e\xdc\xc2\x8a\x5c\x95\x97\xd6\x52\x52\x49\x3e\x77\x2a\x11\x50\xeb\x23\x05\xa9\xc5\x25\x92\xf7\x2a\xe7\xd2\xfc\xf8\xeb\x45\x6e\xce\x57\xef\x49\x52\x54\x28\xd7\x46\x9b\xcb\x1c\x67\x58\xc2\xf2\xf5\xe4\x95\x4c\x31\x76\x6f\xc8\x60\xcc\x7b\x25\x33\x90\x51\x59\x93\xbb\x05\xf6\x5d\x88\xf7\xa8\x99\x81\x36\xc7\xaa\xda\x2d\xa4\xc8\x7e\x19\x37\x4c\x71\x21\xd3\x76\x21\xa9\x30\x95\x35\xcb\x3b\xcd\x74\xd7\x4d\x96\xba\x20\xb3\x64\x96\x44\x64\xb2\x90\x8b\x34\x8a\x2c\x41\x16\x50\xfb\x14\x16\x28\xe6\xeb\x15\x3f\x5b\x91\x85\x44\x61\x21\x85\x15\x7b\x74\xc3\xa2\xf0\xdb\x2e\x6a\x3a\x0c\x2d\xda\x9f\xc7\xc9\x1c\x6a\xaf\x51\x7b\xdd\xd6\xbe\x4b\xf2\x75\x83\xde\x5a\xe9\x49\xd3\xab\x60\x90\x7e\xc8\xcb\x8e\xb9\x25\x7f\x29\x55\x96\x2e\x90\x92\xf1\x73\x05\x3b\xda\x2d\x7e\x8f\x76\x94\x45\x9f\x93\xc6\x75\xd2\xea\x87\x06\x5e\x34\xf9\xbf\x7a\x30\xfc\xaf\xf5\xea\xe7\xd5\x34\xee\xfe\xbe\x17\x3e\x03\x50\x93\x95\x14\x2e\xdb\x00\xb6\xf9\x29\x05\x36\xf9\x3e\xe6\xc3\xe6\xae\xfc\xac\xa3\x2c\xa7\x57\x05\x59\x9d\xbf\x93\xbb\xbe\xf9\x99\x27\x6e\x79\x9f\x45\x3b\xeb\xe6\xee\xc2\x60\xa0\x17\x59\xac\xa4\xfa\x01\x4a\xc2\x65\x15\x0e\xad\x97\xb5\x5f\x5c\x01\x96\x42\x2c\x5d\x9d\xc5\x00\x26\xc9\x2a\x17\x4d\xb2\x29\xdb\x56\x94\xe2\xae\x7a\xad\xad\x8a\x26\x45\xdb\x16\x46\xde\x90\xb4\x1b\x69\xce\x26\x8c\xce\x72\x5b\xea\x26\x9e\x6e\x05\x15\x1b\x74\x68\x6c\x9c\x44\x62\x73\xbb\x45\x1e\xfb\xe5\xaa\x97\x20\x8c\x76\xb4\x92\x21\x57\x8b\x35\xcf\xb5\x46\xf4\xc6\x32\x49\x7d\x86\x36\x4b\x63\x25\x49\x2b\x47\xb2\x58\xd9\x44\x85\x43\x8d\x7d\x22\x7b\x19\x64\xb9\x50\x82\x48\x03\xfa\xbc\xed\x8d\xd7\x5b\x81\x16\xa2\x69\x6a\x6d\x49\xd6\x41\xd0\xd4\xa6\xe9\x0a\xd7\xfc\x93\xf2\x79\xd4\xa9\x79\xe8\x31\xb8\x93\x34\x60\xad\x61\x1a\x90\x5d\x1a\x53\x8b\x6e\xb1\xd2\xc0\x07\x43\x18\xff\x20\x29\xad\x7a\x68\x05\x9b\xf2\x24\x67\x91\x78\xce\xd0\xe7\xcd\x21\x48\x80\x21\x5b\x6b\x11\x1b\x6e\x73\x6e\xa5\x83\xc5\xde\xba\x64\x4b\x46\x16\xbf\x8a\xad\xc2\x79\x91\x55\x25\xb1\xb4\x12\x46\x8f\x6b\xb2\x4e\x79\x3a\xe9\x32\xb7\x4d\x71\x62\x3b\xba\x6a\xa6\x12\x28\x1f\x22\x37\x52\xf4\x6c\x0d\x17\xf0\xf9\x4e\x99\x47\x60\xd5\x68\x07\x11\x33\x99\x90\x4b\xb1\x19\x30\x5b\x43\x7c\xbb\x92\x73\xb6\x03\xe5\x59\x97\xa1\x69\xac\x2a\xe0\x40\xcb\x93\x8d\x7c\x92\xf7\x20\x1c\xc4\xd6\xcb\xfa\x51\x54\x16\x37\x3b\x30\xf8\x4d\x74\x76\xd3\x39\x6f\xd0\x8f\x08\x14\x4a\x22\x72\x4f\x37\x65\x2b\xad\xe8\xf2\x46\x6a\xe5\x67\xb9\xb7\x64\xe7\x25\x61\x4b\x0c\xa2\x2c\x05\x95\x1a\x6b\x8b\x75\x7e\x6f\x8c\x24\x8c\x10\xf9\x29\x85\xc7\x46\x43\x33\xda\x7d\xb3\x18\x68\xa6\x7e\x19\x3b\x39\x0b\xdb\xdc\xc4\xe0\x92\x86\xc3\x1e\x82\xa8\xc9\x66\x30\x07\x74\x61\xa0\x70\x89\xb9\x4b\x3a\x39\xca\x42\xa9\xc4\x7a\x69\x6e\x7c\xd7\xc6\x03\x0b\x52\xac\x3a\x57\x63\x84\x01\xc4\x11\x12\xd9\xab\xa2\xef\xa9\x9f\xb2\x33\x7a\x7d\x36\x7a\x3b\xf5\x65\x7b\xea\x8b\xa1\xbe\xb8\xcb\x8e\x9b\x67\xad\x32\xc3\x38\xc9\x02\xc9\x65\xee\x39\x70\xa5\x75\xad\xff\xfa\x85\x06\x8b\x04\x5b\xe9\x82\xb1\xc2\x69\x2a\x28\xa3\xcf\x52\xaa\x01\x49\x68\x2e\x65\x5d\x93\xf0\x5f\xa4\x52\xa5\xcb\x48\x4e\x7e\x47\x78\x9f\x5c\xcb\x7d\x84\xdd\x79\xd0\xda\xa1\x19\x2c\x69\x20\xb1\x7d\xbd\xee\x06\x7a\xdd\x1e\xb4\x7b\x1d\xc4\xca\xec\x7a\xba\x6b\x8a\xe6\x67\x82\x72\x6b\xc5\x2d\x34\xca\x24\x2d\x0c\xab\x6c\x34\x11\x6b\xdb\xcb\xf7\xad\x8a\x5d\xe6\x24\xdf\x74\x74\x68\x54\x39\x24\xee\x32\xc3\x1c\x89\xae\x30\x68\xce\xa0\xda\x76\x7d\xe5\x24\x2f\xad\xce\x46\xb4\x9f\xd5\x1e\x55\xc1\x9c\x71\x5a\x43\xd4\xa2\x6f\xd1\x7e\x8d\x5a\x35\x3d\x15\x8b\x06\x3e\x8c\xaf\xac\x71\xcb\x26\xc1\x12\xa3\xb3\xdf\x93\xdc\xef\xc9\x2f\xf7\x61\x23\xc0\xb9\x17\x19\x7a\xcd\x66\x05\xd8\xf5\x46\x54\xa6\x51\x94\x8d\x1a\x5c\x35\x4b\xa7\xa7\x95\xe0\x60\x29\x3c\x5e\x4e\x1e\x51\x7b\x4d\x66\x9d\xea\xb3\x8d\xea\xb3\xaa\x6b\xe0\x53\xec\x98\xc1\xca\x2b\xaa\x4c\x7d\xf8\xa5\x26\x7e\xaa\x71\x99\xc2\xbc\x14\xc5\x81\x5d\xb9\x46\xf1\xa5\x46\xf1\x99\xe3\x8a\x2f\x93\xab\xfb\xd7\x2a\x3e\x5c\x1d\x36\x01\x03\xf9\x95\x81\xe9\x80\x6d\x53\xfc\xf3\x04\x1a\x96\x8d\xa3\x24\xa5\x3b\x58\xdb\x27\x09\x80\x39\x75\x10\x37\x7d\xc4\x98\x8a\x30\xd1\x9a\xac\xdf\x30\x9a\x72\x33\xbf\xb0\x97\xa6\x60\x35\x3f\x3c\xac\x9f\x73\x76\x93\xa1\x6d\x28\x5e\x02\xc5\x04\xe7\x20\x2e\x6f\x57\xa5\xbc\xd5\x14\x31\xd7\x18\x11\xdc\xa4\xb1\xb1\xbb\x92\xb6\x43\x48\x22\x36\x68\x81\xe1\xcd\x54\xee\x27\xbb\x1b\xbb\xde\x7c\x21\xcb\xd4\x25\x43\xbf\x0f\x57\x2f\x7b\x69\x98\xda\x91\xa8\xff\xb8\xea\x37\x4c\x03\xdb\xb0\xea\xac\xa4\xae\x97\x73\x08\x99\xf1\x14\xf6\xda\x8a\x59\x25\xad\x6b\x8f\xbe\x88\x0c\x7b\x6d\xed\x1a\xc7\x16\x57\x37\x4c\x5f\xfb\x20\x33\xb7\x85\x70\xa5\xa3\x49\x1c\xff\xdc\xa3\xb9\x78\x6f\x65\xc6\xf7\xd9\x7e\xd3\xa6\xc0\xf1\x8d\x29\xb4\x29\xa8\xcc\x95\xd5\x01\xda\xb5\xd4\x00\xfb\xd1\xc6\xec\xc0\x99\x54\xe2\xd0\x46\x86\xb0\xc3\x30\x87\x69\xa5\xb3\x33\xf1\x9e\xc9\x5c\x32\x8e\xa4\xa2\x8c\x53\x38\xd1\x46\xd5\x75\xd6\x1b\x36\x24\x93\xe2\x4b\x53\x34\x9b\xaa\x4e\xa6\x7b\xb2\x18\x10\xc6\x91\xbf\x74\x59\x25\x44\x55\x12\xf6\x87\xa3\x32\x22\x7d\x7b\xa9\x55\xdd\x9c\x4c\xf1\xaa\x67\xb6\x1e\x7a\xa9\x6b\x9f\x7c\xed\xda\xbe\xb7\xf0\xaa\x2d\x26\x84\xb4\xd7\x68\xf3\x1c\xd1\x18\x5f\x9c\xdc\x28\x29\x2b\x46\xc7\xde\xd6\x6d\xef\xbf\xa0\x00\xab\xa6\x23\x55\xaf\x23\x21\x49\x89\xd2\x92\xd3\x2a\x62\xf2\x80\x58\x27\x1d\xf2\x2f\x1e\xc7\x13\xdf\xc3\x6a\x6c\xc6\xc5\xc4\xd6\x78\x39\xdc\x44\x6a\xac\xa4\x83\x26\xff\xc2\xb0\xb9\x44\xcf\x73\x3e\x58\xc8\x3f\x15\xa7\x37\xec\xc3\xec\x36\xcf\xc5\xd2\x18\x72\x65\x47\xfe\xec\x5f\x1b\x50\xd3\x5f\xa9\xc3\x13\x89\x87\x18\x42\xc5\x4a\xe3\x38\x4a\xc4\xa9\x14\xad\x9b\x8c\x0e\xe0\xff\x71\x7e\xc1\x0e\x4e\xf6\x69\x87\x83\xca\xc0\xcd\x8f\x95\xce\xd1\xfa\xe4\x4a\xed\x61\xb3\x5a\x31\xd1\x62\x99\x7f\x73\x38\xf3\x90\x1b\x38\x6a\xf2\xba\xa4\xe4\x74\xc4\x41\x10\x15\x58\x7d\x94\x38\x4b\xcb\xf7\x0e\x4f\x71\xce\x55\x64\x82\x44\x4b\x3e\x29\x20\x9f\x06\x2a\x62\x4d\x9c\x34\xb9\xb4\x03\xc9\x8c\x37\x54\x5a\x90\x87\x88\x9e\x8e\xe0\x2f\x0c\x08\xcb\x30\xc0\x42\xc1\x46\xa6\xfc\x5c\xe9\x40\xbe\x94\x7a\x1a\x0a\x32\x92\x8a\x86\x38\x4a\x95\xe4\xc2\x02\x31\xc0\x26\xd5\xc4\x91\x5c\x5a\x11\x1b\xb2\x52\x32\x2e\x55\x0e\x85\xee\x5e\x6d\x71\x6d\x4b\x62\x06\xf6\x94\xa8\x8f\x74\xc9\x01\xc7\x39\x31\x1f\xdd\x75\xbf\x6c\x8a\x5a\x72\x42\xc0\x6f\x2e\x4e\x3a\x20\x0b\x4b\x9a\x32\xd6\x3a\xda\x9e\x8a\x0b\xb2\xe0\x36\x6a\x09\xae\xc4\x04\x09\xda\x2e\xd9\x52\x4a\xf2\xb8\x44\xf8\x7f\xd9\x21\xe7\x52\x30\xda\xd5\x9a\x4c\x20\x0e\x9b\xa2\x46\xbf\xf8\x52\x72\x8b\x4e\xe5\x6b\x7b\xf2\x08\x16\xc6\xd2\x0f\x68\x79\x10\x3c\x3d\xa6\xef\xf1\x1a\x77\x7a\xaf\x69\x4a\x71\x69\x0a\x32\x61\x80\x22\xdd\xca\xd1\xa9\x3e\x4a\x43\xe9\xdf\x3e\xdc\x3e\xed\x46\x61\xd4\xc0\x75\x26\xfb\x99\xc5\x9e\x1b\x59\x54\x61\xce\xe6\x19\x3f\x33\x24\x71\x7d\x25\x4a\x7c\xce\xc5\x52\xe4\x6b\x7e\x72\x9c\xf2\xb0\x44\x8e\x8a\x34\x8f\x43\x57\x9f\xa5\x19\x83\xd7\x8b\x72\x08\x0b\x66\xf0\x6c\x2e\x01\xae\xdf\x77\xf1\x69\xd2\x01\xd7\x91\x49\xf3\x04\xd2\xd6\x57\xc4\x03\xf7\x4e\x33\x8a\x06\x4f\x76\xaf\xa9\x08\x35\x59\x98\xb7\xe5\xdc\x2d\xdd\x86\x8b\xa5\x71\x20\xd9\xc1\x09\xae\x0d\x13\x46\xd7\xa1\xff\x91\x5d\xda\xb1\x1b\x51\x9a\x59\xd0\x18\xb6\xc0\xdb\x00\x5c\x6b\xb3\x7c\x83\x37\x3b\x63\xbc\xc6\x5a\x23\x74\xa3\x4f\xec\xda\x3e\x7a\x03\x16\x97\xe2\x40\xa5\x1b\x3b\x44\x51\x72\x75\x5e\xb9\x80\xa6\xd5\x8b\x96\xa2\xc2\xcf\xd3\x92\xdd\x26\x90\x75\x35\x6b\x1e\xf7\xf0\x1b\x90\xb9\x2c\x9c\x39\x40\x9f\x6a\x8b\x06\xba\xcf\x56\x06\x6e\x2a\x07\xa6\x52\x06\x16\xe1\xa6\x58\x00\x51\x01\xf0\xd7\x40\x59\xb0\x86\xca\xf1\xcb\xb2\x1e\x09\xcd\xf9\xc9\x88\x5e\xc9\x36\xf0\x0f\x3e\x5f\xda\xbb\x51\x15\xb5\x68\x71\x6d\xa8\x88\x8b\xa6\x48\x48\x57\x92\xed\xac\x3f\x26\x8e\xd7\x57\xa2\x39\x50\xd6\x12\x3b\x64\x21\x50\x32\x0b\x13\x1a\x37\x1b\x0e\x20\x4b\x8d\x14\xeb\x2e\xd4\xee\x5a\xcc\x56\xb6\xd2\x61\xb6\xac\x3b\x1c\x63\x5e\xb0\x18\x85\x75\x17\xdb\x77\xaa\xdb\xfe\x50\x57\x7c\x5e\xd7\x4f\xeb\x0a\xb4\xac\x75\x73\x4f\xe5\x0c\xe0\xd0\x7c\x40\x41\x44\x2b\x9a\x72\xe9\x28\x85\x59\x3f\x0a\xd1\x28\x99\xbf\x8a\x38\x07\xc7\xcf\x0c\xb3\x08\x2e\x8d\xf6\x10\x43\x2c\x85\x25\xbe\x1e\x05\x16\x42\x55\x23\xcb\xeb\x2b\x4f\xa5\x72\x33\x4a\x91\x52\xeb\x27\xe2\x7b\x5f\x56\x83\x27\xf9\x8f\x39\xbe\xae\xa8\x74\x32\xe5\x35\x4f\xca\xac\x6b\x51\xcc\xc1\x93\x9c\xd5\x5b\x02\x01\x4b\x84\x52\xba\x19\x36\xca\x3b\x97\x0b\x06\xdc\x8d\x5f\xb2\x1d\xc5\x93\x30\x93\x8f\xe3\x50\xe2\x83\x37\x9b\x51\x4e\x39\x60\x70\x0d\x7c\x38\x8a\xec\x2d\x11\x09\x4b\x00\x63\x75\x9c\xb1\x4c\xa3\xdc\x79\xdc\x64\x9f\xae\x72\xa3\x29\x1e\xd0\x8a\x33\xf9\x94\xdc\x71\x30\x7d\x5b\xaf\x09\xe0\x52\x33\x79\x5f\x5b\x99\xbf\x22\x99\x30\xf0\x8c\x2e\x41\x06\x5b\xc0\x21\x6c\x50\xab\xa6\xb2\x6f\x50\xa7\x49\x95\xf3\xd4\x23\x4f\x4e\x2a\xce\xcd\x1b\xb9\xb1\x86\x6c\x3e\x76\x94\xbe\x91\x39\xa3\x4f\xd7\x2c\xef\xbc\x5e\xf7\x31\x50\x54\x8a\x34\x9c\x3c\xf7\xba\xdf\x82\xac\x8a\x7d\xe8\x4f\x96\xcd\x37\xa7\xea\xba\x21\x70\xe6\xdd\xf6\xa7\x8f\x75\xf5\xe3\xd3\x2b\x5c\x31\x83\xbc\x18\x10\x61\xec\x42\x6e\x0f\x7c\x4a\x68\x82\xec\x9f\x63\x99\x42\x9f\xdc\xbf\xf7\xfd\x1b\x7c\xc6\xb3\x45\x56\x00\x9d\x14\x8c\x39\x61\xc4\xf4\x76\x9c\x01\xaa\x6e\x99\x07\x32\x3d\x2e\xd8\x72\x4f\xa7\x80\x3a\x61\x2f\xbb\x10\xdb\xdb\x0e\xf9\xe0\x34\x45\xa0\xae\x60\xe5\xd1\x82\x17\xc9\x48\x4e\x2f\xe4\x9b\x61\x4f\xa5\xac\xd3\x00\x91\xe4\x6d\x35\x2a\x2f\xf7\x85\xe2\x50\x80\x37\xb8\x8a\x17\xc0\x66\x0b\xe4\xfb\x95\x80\xa9\x59\x6b\x0e\xda\xf8\x5e\x8e\x60\x64\xe8\xe1\x3a\xc2\xcf\x2b\x6a\xb2\xa1\x96\x59\x6f\x98\x84\x18\xd2\x6f\x32\x11\x8c\x1f\x90\x78\x69\xe2\xa0\x19\xc7\x23\x14\xd3\x22\xca\xcc\x55\x0e\x95\x15\x96\x1d\xe4\x79\x21\x16\x90\x48\x8f\xca\xe0\xbb\x9e\xac\x1d\xc6\x70\x37\xa9\xbf\xde\x76\xe0\xd8\xd0\x3b\xf4\x45\x53\x4b\xff\xe7\x55\x99\x62\x96\x69\x1d\xa6\x5e\xaf\x84\xd9\x7f\xae\x04\x10\x58\xd9\xc4\xc4\x72\x8f\x9d\xd5\x34\x2e\xa4\xcc\x33\x8a\xfe\x00\xff\xdb\xcb\xee\xf5\x01\x76\x98\xb6\xa6\x5d\x2d\xfd\x54\xa3\xab\x47\xf1\x32\x08\xad\x39\xbc\x89\x40\x1b\x1b\x45\x2c\xd4\x48\x2c\x9a\x74\x5f\x8f\x17\x9a\x1a\x08\x40\xef\xaa\x7e\xbd\xa5\xcf\xfb\x03\x45\x67\x08\x7c\xe6\x9a\x62\xc2\x26\x68\x23\x0e\xbd\xd2\x60\x1f\x70\x44\xa8\xc6\x56\x03\x7d\x09\x62\xc1\x5c\x63\x4f\x5f\xba\xa7\xf7\xdd\xa1\x08\xaf\xc7\x13\xe5\x12\x3c\xd0\x10\xdc\xbe\xbc\xe5\x7a\x64\xc1\x30\xae\x36\xc4\xa5\x76\x94\x6c\x6f\x56\x01\x73\x75\xb4\x30\xb7\x15\x16\xbe\x59\x42\x86\x03\xe0\xa4\xb9\x6d\x0a\x28\xf8\x43\xf5\xfe\x99\xb3\xf4\xa4\xac\x1b\x87\x0e\x51\xc9\xc3\x79\x69\x69\xfb\x1a\x3f\x9d\x36\x99\x8f\x55\x7d\x94\xc9\xa2\xe4\x51\xa6\x25\x99\xde\x90\xe1\x3c\xd1\x94\xfd\xbe\x6a\x3f\x7c\x83\xf6\x0e\xd3\xca\x96\xcf\xd5\x14\x1f\xbc\x25\x24\x07\xee\xfb\x69\xa3\x7b\x1c\xfa\xd9\xbc\x1a\xde\x78\x13\xfa\x0d\x8e\xfc\x02\x96\xd2\x64\xfa\x46\x0c\x1c\xc8\xc6\x39\x99\xd3\x5a\x70\xb2\x7a\x02\x1d\xd0\xbc\x2f\xc4\x56\xc5\x43\x48\x47\x97\xc9\xdb\x16\x17\xcb\x6d\xfd\xf9\xf6\x19\x5c\x3a\x8f\xd8\x3c\x9e\x1b\x3e\x18\xc1\xda\x69\xb7\x34\x26\xef\x21\x59\xa3\x3c\xc5\xe1\x4c\x22\x7a\xb9\xe8\x33\xba\x59\x90\xaa\xcc\x39\x51\x0a\xc3\x5d\x8b\x25\x1f\x62\x3f\xe0\x86\x87\xec\x80\x4e\x69\x55\xa8\x9d\xac\xb9\x1c\xd9\xa1\xe2\x52\xc4\x86\x82\xdd\x1b\xb1\xb3\xfb\x84\x48\xa0\xc5\xb2\x70\x0a\x4f\x69\xd6\x77\xff\xcf\x61\x8e\x69\xf9\x16\x3c\x34\xab\xfa\x86\x38\x84\xba\xad\x53\xcf\xff\x1c\xf3\x54\xd9\x37\xa0\xf4\x80\xd3\x2f\x57\x7b\xa0\xe2\x91\xf2\x1b\x46\x9b\xcb\x56\xf4\x50\xf2\xe7\x3d\xc2\xec\x37\xda\xed\x98\xe5\x0f\x1b\x4e\x67\xc8\x60\x6c\xb5\x3b\x60\xfe\x9d\xb1\x06\x63\x83\xc2\x29\x8e\x67\xcd\x20\x4c\x33\xb0\x73\xee\xab\x05\x96\xff\xcf\xd9\xf5\x6f\xc9\x5b\xa7\xce\xe3\xc3\x68\x91\x87\xed\x6e\xb7\xa9\x6e\x1e\x9e\x06\x54\x03\x24\x74\x47\xe8\x80\x6c\xcb\xcc\xed\x79\xa0\x78\xc0\x3b\xd7\x58\xef\x55\xa5\x2a\x1b\x13\xb8\x54\xe5\x2c\xff\x85\xb7\xd2\x49\x51\x92\x47\xce\x18\x6c\x43\xc7\x27\x65\xf0\xda\xcf\x5a\x72\xbe\x9c\xbf\xbd\xbe\x2d\x74\x6a\x68\xfc\x0c\x16\xd1\x76\xd6\x92\xfa\x65\x6a\xf2\x53\x6c\x9e\x23\x4b\xd9\xc9\x74\x9b\x46\x73\x50\x1a\x2c\xaf\xde\x12\x14\x6a\x8e\x4d\xef\xa3\xec\xf6\x7e\x98\xdd\x49\x33\xde\x68\xc4\x24\x19\x30\x76\xc4\x96\xad\x79\xfe\xfa\xb5\xfa\x74\xfb\x0e\xd8\x2b\x43\x66\x6c\xcd\x1b\x4f\xe6\xd5\x79\x4c\xe7\x9f\x4b\x1c\xf9\x3c\x27\xcb\xd6\xcd\x4c\x50\xa6\xb5\x54\x81\xb8\xa9\xda\x3b\x87\x96\x94\x57\xdd\xac\x25\xd0\x30\x19\x86\x06\xbc\xa6\x07\x4a\x8d\x13\xa9\xec\xa7\x12\xfd\xc2\xb2\xbc\x1a\x6b\x6e\xfb\xf8\xe5\xf6\x30\xa6\x8a\x2a\x36\x33\x8b\xfc\x96\xff\xc2\xb1\x80\x28\x8c\xaf\x5e\xbb\xaf\xd0\xd2\xd3\x03\x92\xdf\xae\x1f\xab\x27\x5b\x21\x52\x73\x90\x10\x37\xe3\x0d\x65\x9c\x30\xe1\x3c\x48\x16\xf4\x2e\x5f\x1a\xbb\x24\xc9\x9f\x52\x2b\x0a\x31\x5f\xda\x2f\xf0\x01\xfc\x90\x7c\xbe\xe4\x2f\x64\x35\x19\xec\x5c\xb2\xbb\xbe\x65\x59\x3b\x32\x39\x5e\xe5\x48\x2a\x59\x7e\x92\xcc\xfe\x60\x67\xdc\x69\xb2\x4e\x53\xf0\x3a\xdf\xf0\x73\x10\x68\x1a\xb2\x7c\x7d\x0b\x47\x37\x97\x0e\x36\x8c\x51\x0d\x06\x6d\xc4\x6b\xcb\x29\x10\xfb\xb3\x1d\x97\x71\x96\xfb\x40\x21\xd8\x0e\xf7\xc4\x76\x6f\x88\x41\xa8\x6a\xc2\x46\x5b\xe4\xbf\xb1\x64\xf3\x9d\xb9\xb1\xc4\x61\xaf\xc3\xc6\x51\x60\xdc\x7a\x05\x21\xf3\x60\x93\xc6\x99\x9c\xef\x1c\xc0\xd3\xcb\xdc\x29\x3e\xe7\xc6\x86\xe2\xde\x51\x72\x73\xbc\xf8\x0a\x12\xe5\x01\xce\x85\x29\xc9\xb0\x98\x76\x96\x6b\x4d\x36\x51\xe9\xe7\x6c\xc9\xd7\x4c\xce\xe9\xb0\x91\xae\x96\xdf\xbd\x82\x55\x66\x13\x30\xa8\xa4\x61\x52\xad\x29\xc9\x6a\xd6\x94\x0b\x16\x6b\xf5\x34\xd0\x5e\x37\x29\x0d\x36\xd1\x6c\x31\xc0\xcf\x93\x22\xe9\xfe\x71\x97\x51\x51\x5e\xe3\x72\xc9\x7e\xa3\xc7\x93\xc3\x70\xa3\x47\x9b\x8d\x2d\xc6\x96\xf1\xe0\x13\x65\xc0\xfa\x97\x16\x38\xa4\x00\xde\xf1\x60\x79\x8d\x02\x5d\xdf\x6a\xa7\xe3\x04\x81\x82\xc9\x97\xad\x77\x42\x7f\x27\x19\xbb\x69\x1b\x53\x2e\x8d\xd9\xe8\x93\x50\x48\x3c\x9a\x24\x37\xca\x18\x9b\xd7\x23\xf8\xf0\x1d\x83\x7f\x2f\xbd\xe3\x90\xc1\xb5\xc6\x38\xbb\x4f\x6a\x45\xa4\xfc\xd8\x93\xee\x22\xfb\x3d\xc3\x29\xd9\xc0\x63\x81\x71\xb5\xaa\x98\x27\xf2\x4b\x53\xd6\x38\xcc\x59\xf5\x1c\x81\x1b\xe7\x26\x44\xac\x5d\x1a\x8c\xf0\x4c\x52\x2d\x29\x61\x03\x34\xa7\xf9\x62\xff\x85\x23\xa5\xca\xd5\xea\xfc\xd9\x6d\xe3\x66\x8b\xd8\x3f\x29\x98\x8c\x3e\x91\xca\xcb\x9c\x5b\x90\xf6\xc0\x57\xf0\xe8\x6e\xbf\x7f\xb1\x3b\xd5\xb8\x04\x98\xa1\xcb\x8d\xb6\xd3\xc8\xb4\xbd\x71\x13\x8f\x3c\xb7\x77\x9d\xaf\x34\x37\xbe\xd2\xf2\xbc\xbc\x8c\x94\x94\x2d\xe0\x43\x6a\x8b\x1c\xae\x52\xac\x5a\xb7\x31\xdf\x78\x0f\x4a\xcd\x1a\x17\xbe\xd6\x47\x6a\x63\x4a\x78\x92\x0d\x1c\x72\x97\xa6\xb8\x04\xc5\x40\x49\x0e\x9b\xd5\x0a\x5c\xac\x46\x95\x7f\x7d\x97\xbb\x92\x1b\x47\xbc\xdc\x95\x5d\x87\x8a\x9a\x15\xd5\x64\x57\xb9\xdb\x0c\x9c\x5c\x8a\xbc\xd5\x29\x7a\x7c\x18\x71\xd2\x3a\x9d\xe7\x7a\x66\x67\x19\x38\xda\xc9\xbb\x36\x97\xaa\x75\x3c\xc7\x3d\xe8\xf8\x26\xb6\xad\xcc\x31\x6d\xb9\x2c\xaa\x2b\x55\x0e\x9c\xca\xd4\xe3\x1b\x19\x2c\x9d\x36\xe5\x46\x99\xe6\x32\x6c\xda\x47\xda\x51\xab\x4e\x97\xf2\x51\x0e\x58\x02\x4e\x9d\xd9\x68\x43\x76\xaf\x1d\x25\xf9\xad\xdc\x6b\xf9\xc0\xe7\xcf\x0c\xa5\x65\x93\x61\xf6\x1d\x86\x6f\x3d\x3a\x6f\xa3\x99\x62\x9d\x5b\x53\x5e\x84\x4a\xcb\xda\xad\x66\xf2\xaa\x71\x05\x9c\x9f\xe0\x89\x97\xf5\xd7\xc8\xfb\xe6\x61\xf7\x38\xbb\x19\xf3\x5f\x0c\xb5\x1c\xa0\x00\xd9\x52\x69\x96\x8e\xfc\x4c\x72\xe7\xee\xc4\x2b\x33\xde\xf2\x46\xc7\x6a\xf0\x40\x37\x7f\x2d\xcf\x84\x14\x6c\x33\x1e\x83\xaf\xc8\x1f\x22\xa6\xbd\x26\xbf\x89\xc3\x5b\x92\xe5\x46\xa7\xeb\x2b\x27\xeb\xfc\x34\xb7\xbc\x3c\x49\xa5\x4d\xa7\x55\xe9\x15\x84\x04\x36\x40\xab\x55\xf6\x55\xb6\xdd\x39\x03\x0e\xd3\x97\x8c\x2e\x05\x42\xfd\xd1\xe7\x06\x7b\xc2\xfd\x47\xaa\x79\xb4\x61\x8a\x4b\xc3\x4f\x3e\xb6\xe0\x72\x1a\x3d\x92\xc5\x1c\xd9\x3d\x13\x22\xb3\x9e\x7c\x0e\xf2\xab\x51\x79\xf2\x23\x99\x97\x9d\x93\x04\x66\xc3\x6f\x0f\xf5\xbd\xbe\x32\x51\xb1\xa5\xb0\x61\x4a\x66\xaf\xdd\xc6\x49\x35\xd2\x46\xbb\xbd\x76\x73\x13\xf7\x6e\x6e\xa4\x0c\x69\xe3\xae\x6f\x23\x19\xa3\x03\x9d\x86\x62\x75\x98\x3f\xfe\xce\xc5\x8d\x5d\xe3\x7d\x55\xf6\x5e\xd0\xf2\xab\xa8\x10\xbf\xb7\x83\xc4\xba\x07\x6e\x78\x53\x93\x17\x8d\xe0\xf0\xcd\xf4\x11\x64\x68\x52\x24\x2b\x4f\xf8\xf8\x13\x37\x29\xae\x09\x1b\x3b\x7e\x77\x7a\xaa\xf0\xec\xb4\xfc\xee\xdd\x11\xe2\xf4\xaa\x5e\x3f\x3e\x83\x62\xc9\x06\x70\xbb\x96\x0a\x5f\x81\xca\x19\x97\x5c\x39\x11\xf3\x18\x47\x00\x2d\x38\xe9\xf4\xca\x94\x95\xa5\xe8\x00\x70\xda\x09\x77\xe9\x35\x53\x11\x66\x16\xee\xd1\x87\x6d\x43\x38\x25\x56\xed\xe6\x81\x51\xe0\x50\x6f\x40\x61\xca\x7c\x69\x4d\x7a\xa6\x42\x72\x4c\x92\x63\xea\x4e\x80\x0e\x85\xbc\xbe\x25\xef\x00\x03\x53\x8d\x08\x94\x35\x36\x1e\x37\xc5\x64\xd3\x91\xc1\xe0\xe8\x31\x16\x11\x50\xd4\xfa\x3c\x00\xb8\xae\x6c\x97\x24\xa9\xdb\x8a\x04\xeb\x0f\x92\xe8\x6d\x50\x9a\x86\x70\x19\x2b\x97\xec\x36\xda\xe6\x4b\x66\x66\xc8\xc3\xed\xa5\x73\x28\x60\x00\xfe\x26\x32\xee\xfa\x16\x63\x5b\x93\xe7\xcd\x29\xbe\x54\x47\x16\x12\x20\x6c\xb2\x96\x52\x9c\x19\x0b\xdf\x42\x7b\x70\x0b\x41\xbc\x6a\x01\x36\xca\xd0\x5c\xdb\xbd\x0d\x2e\x56\x85\x76\x32\x93\xe9\x24\x16\xb1\xa7\x90\x74\xd6\x6c\x09\x91\xdf\xd4\x81\x5a\x58\x00\x64\xd8\xb8\x21\xc3\x2b\x9b\xb1\x22\x42\x46\x33\x76\xa5\x8a\xc4\x4e\x39\x8a\xf0\x7c\x10\xe1\xd0\x52\x65\x9b\x21\x57\xb9\x54\x5e\x67\xcf\x1f\x03\xa4\x0d\x69\x3e\x5b\xea\xec\xbe\x92\xcc\xce\xa8\x7c\x40\x5d\x94\x9a\xb8\x0a\xc4\x51\x85\x16\xc3\xc4\x28\x0b\x0b\x3d\x63\x65\x1c\x16\x8b\xd2\x61\x3e\xac\xb2\x7f\x66\x02\x22\x89\x03\xb9\x29\x5b\x9c\x8d\x6f\x8a\x99\x89\x64\x61\x38\xda\x8e\x37\x1d\x4e\xf1\x11\xe3\xde\xd9\xe6\xda\x24\x79\x68\x43\xa0\xea\x45\x20\x4c\x84\x99\x58\x7d\x70\x8b\xe3\x56\xe5\x94\x40\xef\xb9\xf4\x14\x4b\x25\x76\x89\x55\xb0\x12\x4d\x50\x62\x11\xcc\x8c\xa1\x12\xce\x9d\x1d\xb0\x49\xcc\x48\x89\x61\xe5\xa5\x24\x60\xb5\x36\xb2\x92\x53\x16\x8d\x52\x52\x42\x78\xb8\xad\x0c\xf0\xbb\xf3\xb5\x51\x6f\x14\xb5\x2c\x3e\x37\xc5\x0a\xc1\x36\x70\x3b\xb5\x54\xca\x20\x11\x61\xe7\x3e\x11\x4c\x30\x68\x65\x27\x3d\xec\xda\x6e\x86\x97\x54\x49\xd6\xaf\x40\x68\x25\xed\x6e\x95\x2c\xab\x5c\xc6\xc6\x41\x10\x1f\x98\x0d\x35\xb9\xa0\x2d\xc9\x4a\x2d\x6a\x5f\x45\x2a\xad\x8a\x07\xae\x75\xe9\x37\xc9\x7a\xa5\x89\x9d\x86\xc3\x14\x62\xcd\xbc\xf6\xc4\x41\x9f\xb2\x3f\x7a\x64\x49\x2a\xed\xae\x38\x50\xc0\x0c\x52\x2a\x1e\x0c\x19\x2b\xf3\xdb\x82\x19\xa1\xff\x75\x03\xae\xe2\xc1\x7f\xd5\x5f\x7e\x51\xa0\x60\x56\x24\x4b\x05\x9d\x89\xd4\x2c\xe6\x4f\xbc\xed\x77\x20\xa0\xd1\x19\xed\x25\x25\x4d\x21\xd4\x5a\x14\x08\x39\x0b\x2e\xae\x24\x43\x3b\x1d\xb8\xe5\xb1\xf1\x50\xc2\x79\xa8\x6d\x03\x4d\xc6\xf5\x36\x3b\x7b\xc5\x7e\xd3\x32\xd9\x78\x9c\xc1\x7a\xf2\x25\x4a\x02\xe6\xfe\x78\x80\x16\x07\xfa\x56\x72\x75\x86\x5c\x06\x3b\x1d\x3c\xf3\x0e\x9c\xba\xb2\x2c\x44\xcd\x7d\xd9\x56\xbd\xab\xb9\x9b\x65\x91\xec\x8e\x3a\x94\xc9\x87\xba\x03\xbc\xe5\x20\x02\xb4\x2b\xb4\x48\x77\xa1\x1b\x92\x25\x9f\xc8\xf4\xc0\x7b\x15\x50\xb7\xcc\xa4\x8b\x4c\x01\x6f\x6c\x20\x05\x21\x96\x2f\x74\x42\x63\x8d\xc8\xbb\x25\x40\x5e\x3f\xd1\x8c\xbd\xea\xbf\x69\x7d\x6f\x30\x6c\xe1\x86\x59\x8d\x8a\x28\x75\x11\x29\x0f\x62\x76\x94\x26\x5f\x9a\x71\xe3\x35\x99\x50\xeb\x3c\x09\xf8\x50\x99\xac\xc4\xb8\x13\x2b\xf6\x50\xda\x03\x39\xfb\xb2\x98\x85\x4e\xcc\x86\xe8\xf9\x85\x86\xd7\xa1\x64\xa5\xc9\xba\xaa\xe1\x89\xeb\xcd\x3d\x26\xcc\xc6\xd2\x18\x73\xa8\x62\xb2\xd5\xd3\xd2\xd8\xab\xfe\xc9\x7b\x02\x83\x66\x04\x4e\x9b\x2c\xb4\x9e\x69\x45\xd1\xe5\xf9\xd2\xb4\x22\xc3\x91\x57\x37\x60\x48\xa6\x22\x9b\x0e\x8a\x97\x86\xae\x3d\xcf\x36\x60\xc5\xd8\x7f\xe9\x9c\xcf\x33\x6a\x15\x90\x45\x47\xd2\x4a\xc9\x1f\x6c\x01\x69\x56\xce\x32\xab\xc9\x94\x15\x23\xdc\xdb\xf6\x04\xb7\x74\x22\xb8\x92\xb4\x6f\xe5\x33\x61\xeb\xd0\x51\x1a\x63\x5c\x35\x92\x1b\x9e\x19\xfc\x87\x66\x3a\x69\x2b\x7d\xa2\xfa\x64\x86\x8e\xa9\x1a\x15\xed\xd0\xd4\x22\x99\x9a\xcc\x02\x81\x1c\x81\x7c\xa8\xe1\x2a\xfb\xbc\xde\x3b\x0c\xfe\xa9\x3c\xf6\x00\xde\xc4\xe4\x0a\x9a\x7c\x5a\x48\x23\x94\x2a\x90\x34\x9c\x8b\x0a\x97\xa6\x67\x4d\xde\x50\x55\x63\xce\x8b\x83\x86\x44\xdc\x03\x2e\x87\xa6\xf2\x7d\x3d\x99\xeb\x78\xd2\x11\xda\xb1\x95\x06\x9c\x76\xa5\xa0\x2b\xcd\x04\x52\x74\x99\x04\xc1\xc3\xa0\x03\x59\x87\x7a\xc3\x1b\x06\xbe\xaf\x2c\x93\x27\x36\x88\x53\xd0\x89\x4a\x60\xc1\xc9\x92\x0f\x48\xb8\x46\x3b\x2a\xe4\xbb\x20\xa9\x98\x59\x36\x5f\x53\xb7\x76\x89\x62\x28\x88\x42\x5d\xc9\x3b\x80\xff\x28\x75\x82\x0f\x95\x34\xa5\x28\x3c\x50\x9f\x06\xd1\x14\x08\xfa\x0f\xb2\x06\x61\x2b\xf7\x83\x4c\x32\xae\x32\x51\xd4\x78\xbe\xe6\x54\x1d\x31\x6b\x31\x50\x2e\xa5\xb8\xb0\x44\xd8\x2a\x9b\x19\xc6\xbd\xd8\x52\xbd\x6a\x5e\x5f\x61\xcb\xa3\x20\x2f\x0a\x4d\x52\x6e\x31\xdf\xe0\x30\x1c\xb3\x96\x62\xb1\x4d\xf8\x60\x9e\x9b\xec\x4f\xec\xed\x6c\xf4\x04\xb5\x81\x29\xa7\xc6\xa9\x75\xf9\x5c\x5f\x65\x65\x5c\x50\xe2\x6a\xfc\xbd\xc9\x9e\xd2\x47\x52\x2e\x31\x90\x4a\xac\xea\x86\x29\x23\x48\x26\xbf\xec\xf2\x25\xdf\x3f\x64\x73\x7d\x1b\xc1\xc3\x37\xce\x0e\x20\x91\x22\xc8\x32\xe1\x0c\x13\x35\x70\x3a\x70\xe6\xe9\x56\x99\x94\x50\x2c\xcc\x92\x8c\xbf\xbe\x42\x9c\x0d\x87\xc9\xb7\x26\x5b\x34\xde\x4e\xca\xfa\x6c\x5b\x73\xd7\xd6\x78\xdc\xed\xe0\xe6\x5c\xae\x6f\x3d\x5e\xe1\xac\x93\x9e\xa8\xe0\xa4\xd5\x5e\x50\x96\x49\x0d\xb3\xd5\x6a\x0b\x72\xfe\xfa\xd6\x6b\x53\x90\x0b\xb2\x76\x53\x96\x0e\xc5\x0d\xb2\x1c\x01\x84\xa0\xb7\xf9\xd2\x3e\x71\x50\x98\x70\xb4\x6a\x48\x29\x50\x82\x80\xe8\x5a\xce\xb4\x38\xae\x5d\x90\x89\x15\x95\x13\xb6\x87\x35\x02\x85\x32\x07\x59\x1d\x2c\x75\x51\x10\x3c\x03\x01\x0d\xe7\x40\xa9\xc6\x61\x24\x96\x6a\x1a\x41\xf2\xcc\x2a\x16\x2b\xd8\xdf\xef\x76\xeb\xbb\xc7\x9b\xaa\xc6\x3a\x76\xf7\xdd\x7f\x5e\x54\x1f\x3e\xe8\xc7\xf5\x5f\x1e\x2f\xbe\x3d\xac\x6f\x67\x1f\x3e\xfc\xb0\xfe\xcb\xa3\xba\xa8\xea\xea\xe1\x56\x6f\x3f\x7e\x1c\x3c\x95\x9b\x7f\xfc\xf8\x51\xdd\xdf\xdc\xbd\xdf\x56\x0f\x1f\x7a\xcf\xfe\xd4\xdc\x52\x77\xeb\x9f\x7a\xb7\xff\x6d\xfd\x93\xba\x78\xff\xf9\xfd\xfb\x7a\xad\xd7\x7f\x59\xd5\xd5\x6d\xf5\x78\xb3\xbd\xeb\xa7\xfa\x5b\x3c\xfd\xfd\xe1\xa1\xba\xf8\xf4\x70\xf3\x41\xef\x6f\xd6\x3f\xf5\xdf\xfb\x97\x87\x9b\x0f\xcb\x1b\x49\x6f\x05\x00\x49\x5d\x3d\x3c\x6c\x07\x6f\x64\x60\xc9\x99\xdc\xee\x5e\xda\x54\x77\x1f\xa6\xef\xcc\xab\xbb\x0f\x83\x57\xf4\xaa\xbe\x59\xfd\x78\xfc\xc5\x4b\x79\x34\x7c\xfb\xd3\x43\xf5\xfe\xf8\xcb\xff\xf2\x50\xbd\x1f\xbe\xbb\xbd\x5f\xdf\x1d\x7f\xf7\x8f\xf7\xeb\xbb\xee\xdd\xdb\xed\x7e\x3d\x7d\xed\x6a\xbb\x5f\xab\x8b\x8f\x37\x0f\xbb\x47\x5d\xdd\x0c\x6a\xd2\xee\x68\xaa\x87\xf5\xee\xe6\xaf\xeb\x6f\xfb\x20\x37\x72\x43\x6d\xdf\xff\x7f\xeb\xd5\xe3\xae\xf7\xe0\x8f\xf9\x8e\x7a\xbf\xdd\xfe\xd8\xef\x81\xed\xf6\x47\x55\xed\x1e\xd7\x0f\x37\xbb\xfe\xfd\x59\x73\x4b\xbd\xff\xfc\x69\xd0\x61\x9f\xd4\x6e\x75\xb3\xdb\x6d\x1f\xfa\x89\x7f\xdf\xdc\x52\x8f\x9b\xf5\xc3\xed\xf6\x76\xfd\xb8\x7e\xe8\x3d\xfe\xe1\x70\x57\xdd\xaf\xef\x56\x37\x75\x5f\x7a\x70\x43\xdd\x6d\x1f\xfb\xf5\xf8\xb7\xed\xe3\x5a\x3d\xac\x3f\x3e\xac\x77\x9b\x41\xf5\x70\x47\xed\x7e\xbe\x5b\xf5\xf3\xff\xf9\x6e\xa5\x2e\x44\x6a\x74\x7d\xb3\x1b\x88\xb5\x88\xcd\xe2\x66\xf7\xd8\x3c\x5e\x55\x0f\x1f\x76\xe3\xe7\x97\x72\x53\x5d\x3c\x3e\xac\xd7\x13\xd1\x6b\x91\xd2\x55\x7d\xf3\x69\xf3\xf8\xfe\x73\xfd\xbe\xf7\x70\xd1\xde\x53\x1f\xb6\x3f\xdd\xd5\xdb\xaa\x3f\x2c\x7e\xd7\xdc\x52\x9f\xef\x47\x4f\xfe\x8c\x1b\xaa\xde\xae\xfa\x4d\xbe\xd8\xae\x7e\x54\x9f\xef\x46\x77\xff\x8c\x1b\xea\xf3\x6e\x3d\x68\xf1\x3f\xcb\xdf\xea\xe2\x7e\x7b\x2f\x16\x40\xbf\xc0\x7f\xda\xde\xff\xf1\xf3\xa3\xfa\x08\xe8\xaf\x6f\xc7\x58\x60\x32\x7e\x87\x43\x57\xde\x5c\x0f\xdf\x5b\xab\xfb\xfa\x73\x3f\xb7\x3f\xd5\x9f\x77\xea\xf6\xe6\x6e\x70\xf3\x4a\xfe\x56\x17\xb8\xad\x73\x34\xeb\xc5\xf8\x71\x3e\xe1\x57\x17\x92\xde\x91\x77\x24\xdd\xe6\x95\xf7\x55\xbf\x5c\xbf\xad\xee\xd4\xc5\xe3\xcd\xed\xfa\xd8\x57\x3f\xc8\xfd\xe6\xb3\xc7\x87\x6a\x20\x20\x3f\xc8\xdf\x2a\x7f\xf3\xed\xd8\xf3\x42\x3d\x56\x7d\x61\xfe\xa1\xfa\x24\x77\x76\xc3\x5b\x3b\xb5\xb9\xd9\x3d\x6e\x1f\x7e\xee\xdd\x9e\xe7\x3b\x6a\x35\xea\x9c\x4b\xf4\x4d\xa3\x31\xf1\x70\xa2\x33\xf3\x2b\xd0\x57\xdf\x3e\x1e\x1e\x35\x8a\x0a\xc5\x3a\xa2\xcd\x70\xbf\x7d\x69\x73\x53\x7f\x38\xf2\x8e\xdc\xce\xaf\xac\xb6\xf7\xfd\xd2\x5e\x6e\xef\x7f\x56\x9b\x75\x7d\xdf\xaf\xc1\xba\xbe\x57\xf5\xf6\xd3\xa0\xf7\x17\xf2\xb7\xdc\xdd\x7e\x7e\x1c\xde\xde\x7e\x7e\x54\xf7\x0f\x37\x77\x43\x11\xfa\x53\xbe\xa3\x7e\xda\x3e\xd4\x7d\x79\xfe\x77\xf9\x5b\xed\xea\x9b\x0f\x83\xd7\xbf\xc7\x0d\xb5\xaa\x6f\xee\xc7\x53\xc6\x65\x7b\x4f\x7d\xbc\x79\x58\xff\x54\xd5\xf5\x50\xbb\xe1\x96\x92\xb1\x3c\x18\x6d\xbb\x47\xf5\xb0\xfe\xb0\x1d\x28\x84\x0f\x5b\xf5\xf9\x6e\x70\xef\xcf\x77\x1f\xb6\x6a\xb7\x7a\xd8\x0e\x52\xfd\x1e\x37\x44\xa1\xd6\x6b\xbd\x5b\x3f\x3e\xde\xdc\x7d\xda\x5d\x8c\x04\xff\xfb\xe6\xbe\xba\x78\xfc\x69\xab\x7f\xaa\x7e\xce\xed\x3e\x78\xef\x87\x9f\xb6\xff\x5e\xfd\x8c\x96\xdf\xa9\xdd\x4f\x37\x8f\xab\xbe\x00\x7e\x8f\x1b\xea\x71\xbb\xad\x07\x82\x25\x7f\xab\x8b\x9f\x6e\xee\x3e\x6c\x7f\x12\x51\xd9\x0d\x44\xfa\xdf\x71\xff\x52\x6e\x77\x2f\xdd\x56\x7f\x99\xbe\x72\x55\xfd\xe5\xf0\xc2\xcd\xdd\x91\x17\x6e\xee\xba\x17\x1e\xd6\x22\xb6\x47\x32\xfa\x5f\xf9\x81\xba\xf8\xeb\x76\x7b\xab\x87\xc9\x5c\x6f\xb7\xb7\xff\x7a\xd7\x3c\x1a\xe9\x16\x79\x26\xca\xe5\xc7\x75\x5f\xde\xfe\x9f\xf5\xcf\xaa\xbe\x79\xff\x50\x0d\xc6\xcc\x22\xdf\x51\xef\xb7\xf5\xe3\x60\xc2\xa9\x1f\xd5\x4f\x0f\xeb\xbb\x41\xab\xfd\x3b\x6e\xa8\xf7\x9f\xeb\x7a\xb7\xfe\x79\x3d\x98\x71\xf2\x2d\xf5\x58\x3d\x7c\x5a\x3f\x0e\xc6\xaa\xdc\x50\x1f\xeb\xea\x76\xa0\xbf\xe4\x6f\xb5\xd9\x7e\x7e\xf8\x24\x46\x52\x7f\x0c\xb4\xf7\xd4\xc5\xdd\x56\x57\xab\xd5\x7a\x37\xe8\xd8\x7f\xdb\xce\x70\x4f\x6d\x1f\x3e\x55\x77\x37\x7f\x85\x45\xd2\x9f\x42\x7b\xb7\xd5\xfb\xaa\xae\xee\x56\x83\x92\xe6\x3b\xea\xe2\xe6\x83\x7e\x5f\x7d\xf8\x34\x68\xf7\x7f\xfd\xf0\x5b\xb9\xa5\x1e\xd6\xf7\xeb\xea\x71\x20\xc0\x72\xa3\x11\xcb\x4f\x0f\xdb\xcf\xf7\x63\x99\xfc\x17\xb9\xa9\xee\xab\xfb\xf5\x83\x0c\xa5\xfe\x78\x6c\xef\xa9\xdd\xe6\xe1\xe6\xae\xaf\x99\xbe\xc7\x0d\x75\x91\x6b\x79\xf3\xfe\xa6\xbe\x79\xfc\x59\x9b\x81\x7a\xea\x3f\x32\xe3\x57\xf9\xc9\x57\x59\x5d\xec\xb6\x0f\x8f\xfa\xfd\xcf\xfd\x57\xbe\xdf\x3e\x3c\xfe\xf6\x67\x75\xb1\xda\xd6\x75\x75\xbf\x5b\x63\xa6\x1d\xe8\xab\xe6\x81\x4c\xb6\xea\x62\xfd\x97\x7b\x98\x5e\xa3\x97\x7e\x8f\xdb\x78\xe5\xfd\xc3\xcd\xfa\xe3\xaa\xda\x0d\x9a\xb8\xbd\x87\x7c\xb6\x0f\xfa\xfe\x66\xf5\xe3\xfa\x61\x94\xcd\xf6\xe1\x4f\xb8\x2d\x2f\xdd\xff\xac\x1f\xb7\xba\x53\x41\x17\x23\x35\xf9\xc3\xf6\xa0\x89\x2e\xf2\x94\x39\xac\x79\x9e\x35\x59\x5d\x7c\x78\xa8\x3e\xc1\xa8\x1b\xce\x45\x07\xc6\x54\x75\xbb\x1d\x48\xcb\xd5\x76\x7b\xa7\x76\x9f\xfb\xb7\xbe\xff\x7c\xa7\x7e\xaa\xee\x06\xaa\x53\xac\xd1\x55\xbd\xbd\x5b\x0f\xa7\x95\xbb\xb5\xfa\x90\xb9\x84\xfb\x99\xe5\x3b\x83\xc2\xe8\x15\x98\x5a\x8f\x97\x29\xb3\xb8\xaa\x35\xc8\x3d\xfb\xcd\x8c\x1b\xaa\x6e\x39\x10\xfb\xc3\xb6\xbd\xa7\xee\xc5\x2c\x1c\x48\xdb\xee\x71\xad\xee\x1b\x3a\xa5\x81\xc5\x91\x6f\x35\x42\xfc\xd7\x9b\x89\x08\x5f\xdf\xdc\x77\xcd\x3b\x5a\x58\x74\x10\xa5\xea\x21\xe3\x33\x7e\x3b\x41\x6c\x54\x62\x98\x8d\x4c\x32\xf5\xf1\x66\x30\xef\xff\xe1\x66\xb7\x51\x1f\xb7\x0f\xb7\xdf\x0e\x71\x07\xd4\xc7\xcf\xeb\xc1\xdc\xf2\x79\x5d\xab\x5d\x1b\xbe\xf8\xed\x91\x90\x46\xf5\x58\xbd\x1f\x94\x02\x91\x2e\xea\xe2\xc3\xf6\xf1\x88\x2d\xd2\x79\x31\xaa\x3d\x82\x0b\xbe\x1d\x47\x1b\xa8\x55\xe7\xc4\xfc\xed\x31\xcf\x66\xf5\x7e\xfd\x58\x7d\x3b\xf4\x05\xec\xa4\x3b\x9f\x36\x4e\xc5\x3b\xdf\xff\x2f\x95\x8d\x7a\xfa\xb0\xfe\x78\x73\xb7\xfe\xd3\xc3\xf6\x7e\xfd\xf0\xf8\xf3\x3f\x4e\x56\x7c\xea\x62\xfd\xe1\xe6\xf1\x42\xad\xe9\xc3\x7a\xb7\x7a\xb8\xb9\x7f\xdc\x3e\x5c\x6e\xef\x3e\xde\x7c\x9a\xbe\x4b\xd9\x40\xff\xcd\x6f\x5e\x9e\xb8\x98\xee\xfa\x84\x1c\xe4\xfd\x53\xd2\xcf\x5a\xf1\x65\x69\xc3\x4e\x3e\x25\xf1\x0f\xdb\xd5\xe7\xdb\xf5\xdd\x4b\xcb\x2e\x12\x7e\x4a\xf2\xd5\x87\x0f\x2f\x6d\xf7\xfa\xf3\x49\x05\x5f\xc9\x64\x53\xbf\x30\xf1\xf7\xd5\xdd\x29\x69\x3f\xac\xb1\x24\x7d\x51\xda\xff\x7b\x68\xa7\xff\xbf\xa7\xe4\xb3\xbb\xf9\x74\x27\xe6\xc7\xcb\x2a\x01\xf3\xf5\xe4\xe4\xc5\x84\x79\x71\xfa\xdb\xcf\x8f\xa7\x64\x80\x35\xe1\xdd\xcd\xdd\xa7\x97\x76\xc3\xb6\x3e\x29\xfd\x8f\xb5\x18\x8b\x9b\xea\xe1\xa5\x55\xe8\x5b\x2e\x27\x89\x69\xbd\x7e\x69\x1e\xff\xfb\xd8\x9e\xce\x49\xbd\x7e\x7f\x73\x77\xb7\x7e\xf1\xb0\x68\x36\x97\x4e\xaa\xcd\xe3\x63\xb5\xda\x9c\x30\xaa\x3b\xe3\xea\xd7\x97\x4b\xde\xe1\xd1\x1f\xb6\x3f\xbd\x74\x98\x64\x5b\xf0\x15\x79\xbc\x58\xc9\xe6\xf7\x7f\xf3\x1b\x75\xf1\xf9\x2e\xa7\xfe\xe1\xe2\x1f\xbe\x7b\xfc\xf9\x7e\xbd\xfd\xf8\x2e\xaf\x3d\xfe\xe7\xff\xcc\x3f\x69\x53\xed\xfe\xf8\xd3\x5d\x97\xfb\xc5\x65\x5d\x3d\xdc\x3c\xfe\xfc\xaf\xab\xed\xdd\xee\xe2\x37\xdd\x6b\xfd\xdb\x54\x7d\xf8\x30\xcd\xf5\x37\xff\xa5\x2e\xe8\x9b\xfb\x87\x2d\xf6\xb1\xbe\xb9\x91\x37\xbf\xd9\x3d\xac\xbe\xd9\xe1\xf1\x37\xb7\xeb\x0f\x37\x95\xce\x7f\xd0\xe3\xee\xe2\xdb\xff\xf1\xcd\x3f\xfd\xc3\x3f\x9d\xfe\xbf\x7f\xf8\xa7\xff\xf8\x1f\xef\xde\xc9\x97\xef\x4e\xc8\xee\x9d\x7c\xf9\x3f\xde\xbd\xfb\x8f\x57\xe4\xf8\x8d\x94\xf4\xdd\xdd\xf6\xdd\xee\xb1\x7a\xbc\x59\xbd\x5b\xff\x45\x8c\xac\xdd\xbb\x8f\xdb\xcf\x77\x1f\xde\xfd\xd3\x37\x1f\x3f\xdf\xad\x64\x94\xfd\x63\xad\x2a\xf5\xf8\x9b\xff\xbc\xf8\xbc\x5b\xbf\xdb\x3d\x3e\xdc\xac\x1e\x2f\xfe\xf9\x89\x4e\x56\x17\xff\xe7\xff\xac\x77\x57\xdb\x0f\x9f\xeb\xf5\x85\xfa\xcf\x7d\x55\x7f\x5e\x7f\xfb\x0f\xc5\x7f\xfd\x46\x55\x74\x25\x45\xcf\x8d\xfa\x5d\x7f\xbf\x66\xf5\xb0\xbd\xdf\x6c\xef\xd6\x57\x9f\x1f\xd7\x47\x1f\x7c\xd7\xdf\x36\xfb\xb0\xde\xfe\x4b\x55\xd7\xeb\x87\x9f\xbf\x1b\xac\x66\xea\xea\xe7\x3f\x0e\x5e\xcd\xf7\x66\x75\xdd\xbb\xf7\xaf\xb7\xd5\xa7\xf5\xf4\xf3\xab\xcf\xbb\x9b\xd5\xbf\x6d\x07\xd9\xff\xe1\xa6\xbe\xfd\xfe\xf1\xe1\xe6\xfe\xbb\xfe\x6e\x46\xf5\x01\x25\xea\x57\x20\xdb\x5b\xa3\xc2\xe7\x9b\x7f\xbe\x9f\xdc\xfa\xdd\xf6\xa7\xbb\xef\xfa\xeb\xa5\xcf\x1f\x3f\xd6\x93\x1a\x5e\x56\xb7\xeb\x87\xaa\x77\x77\x72\xe3\x0f\xd5\xee\xf1\x0f\xdb\x87\x9f\xaa\x87\x0f\x83\x3a\x8b\x5c\x7f\xd7\xb7\x91\x7f\x5a\x3f\xf4\xf3\x7b\xdc\xde\x0f\xfe\x5c\xdf\x4f\x53\xf9\x53\xf5\x79\xd7\x2f\xd2\x9f\xea\xea\xe7\xef\xf6\xdb\x9b\x0f\xef\x0a\xf5\xf8\xdd\xe3\x3f\x8a\xd8\x10\x7d\xf3\xf9\xf1\xa6\xde\x7d\xb3\xdb\x7f\xd2\x8f\xd5\x27\xfd\x69\x7d\xb7\x7e\xa8\x1e\xb7\x0f\xef\xfe\xe9\x9b\xe3\x03\xe6\x89\xf7\x65\xd0\x0c\x88\x53\x25\xb7\xc7\x23\x8e\x6e\x27\x04\xdd\x34\xf1\x03\x51\x59\x43\x61\xc6\x38\xbc\x92\x4b\xe3\x63\x95\x51\x5c\x96\x81\x2c\x4f\x1e\x96\xca\x91\x8b\x0b\x8b\xc3\x21\x13\xa8\x48\xd5\xf8\x15\x78\xfa\x2c\x4a\x90\x75\xa6\xd9\xe8\x00\x5c\x75\xf9\x5e\xdf\x16\x9a\x3d\x59\xb7\x48\x4a\xb2\x5a\x22\xd7\x9a\x0c\x15\x99\xd6\x1a\x54\x62\x54\x84\xf6\x5b\x9c\xdf\x16\xe1\xba\x39\x75\x1e\xfe\xef\x48\x1b\x3c\x1d\xf3\xd4\xe2\x90\x87\x5c\x03\x95\xa8\x74\xa8\xd7\xa8\xba\x85\x0a\xbd\xa2\x8d\xce\xf2\x0b\x85\xc3\x58\xbf\x68\x52\x2a\x29\xc6\x6a\xfc\x7d\xa1\x2d\xc5\xeb\x8b\x09\xe7\xb6\x48\xd0\x19\x3a\xd1\x30\x95\x56\x59\x9e\x07\x2a\xc6\x85\x37\xca\x49\x47\x96\xd2\x91\x47\x1e\xca\x4d\xe5\x36\x81\xd2\xf4\x99\xf1\x78\xbc\xc4\xe7\xd3\xa7\x4d\xa6\xd7\x57\xc6\xaa\x30\x0f\x4b\x5b\x6c\xe2\x8b\x7b\xe5\xf9\x10\xac\x06\x63\x21\x57\x8a\xed\xb1\x82\xb3\x79\xae\x5a\xf8\xe6\xa9\x7a\x59\x7e\xae\x5e\x6d\xbe\xd7\x57\xb6\x80\x1b\xf0\x73\x15\x03\xc1\xe5\x0b\xc5\xed\x2f\xdf\x5d\x58\x2a\xfd\x88\xfd\xd9\x98\x1e\x39\x73\x6a\xd8\x9f\xa9\x88\x0d\x01\xb4\xfc\xf6\xb6\x9c\xf9\x22\x93\x42\xbf\x32\xeb\x21\xb4\x50\x4f\x13\x9e\x41\x6e\x7d\x76\x0c\xe8\x9c\xb1\x8c\x66\xcd\x4b\x4f\x31\x76\xee\xd0\x22\xa1\x26\x2a\x47\x06\x14\x19\x6c\x01\xe7\x77\xf0\xa7\xce\x7a\x86\xfd\xa6\x58\xe0\x45\x6b\x80\x30\xd6\x3d\x6d\xb2\xb8\xbe\xf2\x00\x07\x58\x02\x25\x6d\xc1\xe8\x6f\x93\xce\x28\xae\xd6\x40\x56\xd3\xa8\x32\xa1\x57\x52\xd6\xbc\xb1\xfd\xbf\x15\x2f\x6d\xd1\x2b\x2c\xd2\xb8\xbe\xe2\xa4\x30\x9a\xec\xf2\x5c\x5a\xce\x67\x10\xbb\x71\x3b\x3b\x37\x6c\x67\x40\xba\x1b\x69\x67\x84\x5b\x3e\xd1\xc8\x0c\xc8\x41\x1e\x36\xb2\xa1\xf2\xad\x43\xa4\x11\x54\xdf\x0a\xaa\xa5\x10\x3b\x59\x8d\x47\x44\xb5\xe5\x48\x9f\x08\xe9\xf6\xfe\x1c\xd2\x69\x0b\xa8\xd4\x71\x87\xf6\x9b\x4c\xb9\xb9\x2d\x9e\xed\xd1\x02\x3d\x1a\xd0\xa1\x73\x5b\x3c\xd9\xa3\xa7\x2b\x92\x30\xa6\x91\x8f\x54\x96\x2f\x6f\xa5\x6c\xf3\x9c\x63\xf2\x49\x8a\xc7\x30\x62\x6e\x14\xdd\xce\xc5\x30\xde\x9c\xcd\x19\x47\x1e\x62\x81\xc9\xf8\xca\x78\x65\xda\x60\x85\x48\x9e\x35\xf7\x3d\x1c\xe1\xc4\x6d\x15\xe0\xba\x1b\x99\x36\xb6\x73\xe1\x33\x39\xf6\x11\x6f\x8c\x92\x51\x7c\xb2\x9e\xd0\x1a\x6b\xf6\xf5\x87\xa3\xed\xd6\x3d\x3d\xd6\x80\x99\x23\xb8\x07\x99\xa9\x47\x0d\x58\xbc\xae\x01\x9f\x2d\x12\x8f\x8a\x64\x33\xa7\xa8\x27\x91\x6f\x72\xae\x3a\xb4\x9a\xd1\xa6\xd4\x91\x7a\x38\xb6\x3a\xb7\xdb\xac\x6d\x37\x68\x0b\x78\xa2\x1b\x38\x22\x96\xf9\xd2\x18\x4b\x5d\xca\x67\xad\x80\x1d\x3f\xcd\x7b\x26\x0d\x04\x50\xf6\xe9\x37\x0e\xd0\xfe\x56\x19\x33\x33\x40\xd0\x04\xe0\x67\xf6\xe6\xcb\x0e\x6a\x76\x6e\x2d\x85\x34\x79\x6c\x1d\xdc\x50\xcd\x82\x4b\x80\xd6\x91\x71\xd3\x24\xba\x6c\x4e\xaf\x19\x4e\xa4\x9e\x12\x96\xfc\xf0\x97\x1c\x6c\xcf\x15\x88\x87\x05\xca\x51\x18\x70\xe8\x34\xaa\x98\xf5\xe4\x04\x6e\xa4\xe0\x03\xa9\xc6\xa2\xa2\xfa\xa2\xc2\xb0\xf1\x23\x99\x59\xcc\x61\x17\xad\x43\x56\x13\xe1\xe1\x9f\x28\x7d\x0b\xd1\x7d\x62\xf9\xed\xe8\x61\x3e\x0c\x04\xd2\xb7\x2d\x32\xcc\x77\x00\xc6\xb7\x3f\xcf\xd4\x2b\x1d\xd0\x03\x33\x28\x26\x60\x06\x79\x3c\x5f\xdf\x42\xb0\x22\x85\x54\x0d\x25\x2b\x87\xcb\xc1\x63\x78\x99\x28\xf8\xaa\x89\x9e\xe3\xb2\xf3\x9e\xf3\x49\x15\x4b\x93\x68\x2c\x94\xa6\x01\xbc\x36\x25\x85\x04\xb4\x04\x8e\x14\xcb\x59\x99\xe1\xb4\x53\x3a\x98\xf2\x06\xf8\xf6\x92\xf8\x21\xe0\x07\x61\x4e\x0e\x2b\xb0\x41\x34\x91\xd1\xf9\x5e\xc9\x0a\x40\xdb\xb8\x34\x1a\x15\xbc\xac\x1e\x18\xfa\x45\xcc\x97\x66\x01\xa4\x3d\xc5\x30\x1b\xa5\x04\x8c\xe1\x82\xf8\x48\xbe\x9a\xf8\x48\x49\x9b\x2a\x9c\x66\x17\x8d\x95\x43\xbf\x97\xc6\x9a\x4f\xc6\x3f\xf4\xd3\x46\x87\x59\x09\xd8\xff\xae\xac\x88\xbc\x49\x65\x65\x0a\x65\x8a\x56\x1b\x7a\x4a\x56\x27\x75\xce\x86\x6b\x2e\xcd\x5a\xd7\x79\xcd\xe4\xca\x39\x74\xd4\x6c\x14\x46\x06\xc0\x5f\x51\xb3\x7b\x87\x30\xcb\x81\x68\xe8\x46\x34\x9e\x11\x9b\x3d\x45\x53\x5b\x8a\x41\x07\xf2\x66\x2a\xa8\x55\x4f\x50\x75\xe6\xdb\x0e\x2f\xd7\x27\x5f\x6a\x7d\xfe\xbb\x54\xdb\x4d\xad\x06\x6a\x64\x28\x52\x47\x34\x64\x15\xc9\xc9\x80\x70\xad\x28\x58\xf2\x51\x13\x44\xdc\xaa\xb2\x0d\x8b\xf8\x05\xa5\xec\xb4\xe1\x69\x11\xcd\xde\x8d\x43\x31\xaf\x1a\x75\xed\xf3\xa5\xcd\x5a\x07\xa9\x8b\xc1\x7e\x8d\x69\x76\x6d\x00\xe9\x24\xcb\x6a\xac\xb8\x23\xb9\xa0\xe2\x81\xff\xbd\xd5\xf3\x57\x06\x8c\x03\x5f\x52\x72\x4f\x48\xf9\x09\xd3\xc4\x17\x3a\x90\x4f\x99\x22\x46\x2c\x86\xd8\x59\x3c\x87\x55\x0d\xf4\x71\x59\x68\xa5\x5a\x7a\xdf\xb2\x36\xdc\x5f\x90\x69\x4b\xc6\xd7\xdd\x13\x93\x63\x06\xca\x83\xd3\x78\x11\x34\x31\xcf\x0c\x40\x46\xe4\xd2\x7a\x54\xab\xb0\x0f\x14\x17\xb6\x90\x7e\x72\xe4\x9e\xf9\xb8\xb7\x90\x71\x58\xc2\xf4\x16\x43\x08\x7a\x04\x85\x84\xc9\x11\x8b\xa5\xeb\xfa\x23\x7f\x0e\xae\x4e\x4b\xd6\xc8\x87\xa3\x72\xe8\x3c\xea\x9e\xf9\xfa\xfa\xca\xb2\xb2\x45\x2d\x7f\xb2\x5b\x60\xce\xa4\xb4\x0c\x0b\xab\x32\xcb\x83\x2d\x96\xa6\x24\x9e\xf6\xfb\xe9\x73\x34\xe8\xdc\xd1\xd8\x00\x63\x37\x25\xa2\x13\x9e\x6a\xec\xd9\xb8\xbd\x4c\xa9\xc0\x2c\x0d\x1a\x0b\xb9\x4c\x9b\x3a\x84\x97\x37\xb5\x95\x8e\x79\x6b\x6b\x0f\x8a\xa2\xbf\xf0\xed\x64\x6b\xb2\xbf\x71\x7e\x1e\x69\x8e\xd8\x9b\x29\x7b\x32\xac\x29\x49\xe6\xb3\x61\x4c\xb2\x91\xe9\x06\x7b\x70\x7b\x2d\x6d\x07\xba\x7d\xe9\x9a\xea\x58\xe1\x11\x2e\x30\x68\x24\xb0\x9a\xec\x35\xf7\xb7\x36\xb0\x9f\xe1\xe8\x89\x61\x22\x6d\x67\x40\xcb\x10\xcc\xd2\x53\x69\xaa\x71\x89\xa8\xcc\xc9\x1e\xef\x78\xeb\xb2\x64\xa8\xe1\x00\x95\x5c\xfd\xc2\xe4\x41\xdc\x2b\x4c\xaf\x2d\xae\x6f\x0b\x6d\x98\x52\xde\x89\x94\x54\x38\x68\xc3\xdd\x78\x57\x0d\x42\x76\x32\x0b\xa7\xa4\x64\x7b\x3e\x32\x4b\x9d\x2e\xee\x91\xa2\x51\xf6\x68\x57\x0c\x95\x85\x09\xca\x16\x6d\x3f\xe4\xdd\x35\x04\x6a\x1e\xed\x88\x59\x7f\x1f\xc4\x16\x83\x9d\x12\xa0\xa2\x3a\xfa\x62\x07\x94\xe0\xf7\x1f\x16\x22\x93\x26\x64\xe9\x3d\xf6\xed\xd3\xad\xdf\x68\x4e\x65\x78\xd4\xfe\xd8\x67\x1b\xcb\x7c\x73\x7a\x74\x4c\xdc\x1b\x50\x88\x34\x67\x47\x71\xc1\x96\x82\xf4\x07\xf7\x51\x1b\xd8\x20\xbe\x7a\x6e\x1c\x71\x0f\xdd\x41\x37\x71\xdd\x9c\x16\xc6\x90\x55\x69\xee\xfa\x40\xff\xd8\x2f\xfa\x12\x38\x84\x29\x86\xe8\x10\xe9\xfa\x56\x4c\x9f\xb9\x5b\x9a\x62\x93\x28\xc4\xda\x90\xf7\xda\x6d\x22\xf9\x80\xdf\x95\x9b\xdb\x53\xd0\xf0\xcc\x13\x42\x25\xf5\x06\x4d\x45\x0f\x99\x51\xf7\x91\x19\xe5\xe1\xf5\xad\x09\x62\x92\xc8\xbc\x8e\xa0\xce\xa2\x83\xcf\x17\x65\x1a\xc9\x99\x7c\x29\xda\x40\x19\xa7\x4e\x82\x19\xe3\xe7\x4a\x07\x83\x05\x51\xa4\x94\xa8\xb3\x99\x93\xa6\x34\x0f\x64\x62\xef\xae\x02\x11\xfb\x86\xc9\xcd\x7a\x37\x0f\x09\xbc\x22\xdc\xf9\x58\x89\x0c\xe7\x18\xb8\xca\x93\x07\x4b\x78\x7b\x08\x64\x45\x93\xf9\x3a\x8b\xb3\x8d\x4d\xd4\xab\x01\xb0\x36\x60\x4b\x82\xa9\x65\x1c\xe2\xbc\xcc\x93\x0f\xca\x1f\xa2\x3a\xdb\x54\x5f\x11\x4c\x7c\xac\x90\xbf\x26\x61\xbe\xc2\xc6\xbd\xb1\x14\x7a\x7d\x98\xb1\xf2\xd1\x5b\x83\x9b\xd2\x85\x79\x25\x9b\x3a\xa1\x34\x03\xa1\xcc\x8b\xc4\x49\x60\xe6\x17\xd0\x44\x8e\xf6\x64\x9e\x74\x65\xed\x50\x8d\xec\x65\x74\x99\x0a\xe4\x4c\xdd\x52\x69\xb9\x3e\xc4\x28\x31\xeb\x44\xb6\xec\x9e\x22\x85\x90\x71\xd8\x9a\xb6\x34\xe4\xc1\xae\xf8\xd2\xa2\x4e\xb6\x70\xfb\x87\xe0\xe7\xd8\xef\x46\xb8\x24\xa2\xb7\x01\x67\x61\xba\x4d\x1b\x42\x74\x68\xa9\x7a\x7d\x4d\x06\xd3\x1b\x83\x9c\x2b\x2c\xd3\x88\xbd\x24\x1c\x62\xba\xb5\x53\x6e\xc9\xbd\x1b\xca\x29\x37\x67\x37\x92\x0b\x76\xe4\x6a\x00\xd8\xd8\xc9\xf1\x29\x13\x23\xe2\x6e\x50\x2c\x31\x49\xd9\x53\x08\xd7\x57\x16\x93\x02\xf0\xf4\x56\x1a\x2d\xac\xf1\x9a\x26\x53\xca\xdf\x0b\x06\xb0\x55\x8c\x4b\x4e\x93\x0d\x7d\x53\x0c\x76\xf4\x65\x58\xec\x23\xb1\xad\x23\x25\xed\x2b\xca\x52\xd0\x4c\x45\xd8\xdc\x1a\xde\x2a\x22\x19\xb3\x44\x49\x66\x83\x27\xbd\x52\x9d\x61\xd2\x06\xe5\x21\xd6\xfa\x99\x42\xaa\x3c\x47\x9b\x5b\x2a\x52\x1d\x40\x1b\xe8\xfd\xcc\xb4\xa4\xe1\xbd\xe6\x8d\x20\x1e\xe3\xf1\xb3\xb6\x30\x93\x49\xb4\x75\xd5\x38\x83\x3c\x72\xc6\xd3\x34\x32\xc5\x81\x8e\x12\xec\x86\x1d\x4c\x72\xe6\xf5\x00\x59\xc6\x22\x8b\x6e\x91\x6a\x10\x07\x50\x34\x9b\x62\xc1\x49\x34\xa6\x23\x37\x60\xda\x3a\x7c\x52\x48\x4f\x95\x7d\xf2\x32\x99\x37\x02\xf9\x85\x89\x99\xfb\xb1\x90\xe1\x6b\x80\xc5\xff\x82\xee\x7b\xc1\x41\x85\x69\x30\x21\x8a\x38\xef\x15\x4a\x3a\x63\x93\x17\xbd\xdd\x2d\xd8\x63\x7e\x61\xbc\x58\xae\xb2\x08\x77\x08\x2d\x7d\x5b\x31\x6c\xd3\xae\x68\x18\x2e\xfa\x90\xbd\xbd\x96\xa9\x1b\x2a\x9f\x39\xda\x7f\x61\xb0\x61\x5f\xf6\x39\x4a\x8a\x6c\x2e\xfa\x79\xbf\x33\x72\x25\x8a\x58\x97\x84\xfd\x7d\x3f\xaa\x8e\x24\x58\x52\x59\x6b\xab\xfa\x75\x3f\x64\xeb\xa8\xf4\xda\x51\xe9\x36\x45\xdd\xf4\xe2\x44\xba\x7a\xde\x41\xe7\x10\x30\x0b\x54\x25\x0f\x7e\xc0\x03\x0e\x83\x07\x32\x89\x6f\x82\xe0\xdb\xe8\xe7\xac\x4c\x4c\x01\xa0\x88\xd1\x91\xd1\x2c\xc9\x5b\xe9\x10\x28\xcd\x16\x11\xe2\x3d\x78\x07\xd5\xcb\xec\x5c\xe2\x94\x86\x36\xbc\xb4\xa2\x26\x5f\x2e\x4a\xec\x99\xb9\xde\xe4\xdc\x68\x3a\x37\x3c\x8c\x9e\x97\x62\x3d\x47\xb2\x56\x47\x40\xa0\x1c\x1e\x16\xd3\xf5\x27\x38\x70\xd3\x60\x25\x93\x01\xf2\x9d\x32\x6e\x9f\xe6\x25\x70\x46\x7a\x90\x9e\xd9\x4e\xc0\x3a\x3d\xd4\x3a\x4a\xc3\xe5\xed\xed\x43\x53\x47\x43\x16\xb3\xf9\x91\x63\xd1\x93\x35\xe4\xaf\xba\x3b\x9f\x3e\xf3\x6e\xb8\x90\xac\x53\x40\xde\x29\x95\xe1\xb9\x1d\x91\x1b\xb2\x1d\x91\x1b\x26\x4a\xb6\x2e\x65\x64\x26\x1a\x30\x07\x16\x58\xa3\xf9\xa5\xa3\xc0\x83\x23\xc3\x36\x83\x27\xc6\xd4\x9f\xcf\x72\x64\xde\xb5\x0a\xfb\xb7\x75\x81\x1a\x77\x01\xc4\xcf\x51\x31\x60\xcb\x3a\xe4\x76\xa6\x21\x25\xb3\x38\x36\x82\xcc\x40\x4c\x1d\xc8\x73\xca\x99\x61\x40\x5a\x70\x8b\xe4\x5c\x88\x4c\x04\xec\xd5\x76\xe5\xcf\xf0\x07\x49\x0a\xeb\x5c\x73\x3d\x54\x81\x87\x6c\x5f\x5d\x6e\x67\x52\xed\x18\x91\x62\xae\x9e\x4b\x2b\xd8\x72\xa4\x15\xf6\xec\x5e\xa2\x15\xa8\x08\xcf\x29\x06\x9b\xf5\x02\x15\x61\x19\x16\x62\x74\x7a\xc0\xbb\x7d\x7d\xd5\xf0\xab\x94\xcb\xe7\x75\xc3\xaf\x5b\x26\x9f\xa6\x5c\x6f\xf5\x9a\x55\x0e\x84\xbf\xca\xf0\xa6\x47\x7e\x07\xc5\xb6\x2f\x07\x78\x6f\xad\x6a\x4b\x35\xb8\x7e\x13\xb1\x9b\xe8\x36\x67\x97\x8e\xe2\x58\xb7\x59\xe5\x9e\x50\x6c\x70\x39\x3e\xc7\xea\x48\x8c\x51\x59\xf0\xa9\x92\x0c\x94\xf4\x68\xed\xbb\x1f\x83\x7c\xca\x80\xab\xdb\xdd\x8f\xd8\x5b\xf5\x0e\x27\xee\x42\x51\x0c\x00\x17\xea\x7d\x5e\xc8\xac\xc9\x4c\x31\xd6\x9e\x52\xa9\x3c\x00\x82\x48\xe6\x1b\xaf\xc9\x95\x00\x59\x8c\x1e\x3b\xca\x07\x2b\xab\x6c\x76\x79\x1d\xe5\x5e\xee\x6c\x2c\x0b\xc2\xb2\x1a\x0c\xa7\x72\x59\x58\x38\x9b\x79\xe5\x31\xc4\x6c\x21\xf3\x73\x94\x01\x1f\x63\xaf\x65\x4b\xe0\x37\x61\xa3\xc9\xcd\x4b\x0a\x7d\x22\x57\x98\x68\xb6\x26\x0e\x9a\x38\x80\xd2\xae\xa0\x74\x2e\xdb\x86\x1b\xe8\xa6\x90\x05\x1c\x6c\xfa\xae\xd3\x43\xa0\x40\x95\x95\xb7\x3c\x00\x59\x9e\xc3\xaf\xae\x7d\x07\x2c\x97\x11\x90\x81\x07\xa2\x15\x31\x5b\xa3\x68\xab\x73\xd9\xd1\x0c\xe4\x19\x96\x99\x76\x0c\xf0\xd8\x40\x8f\x57\xd8\xda\x08\x2d\xa4\x58\xa3\x30\x2d\x45\x23\x2b\x67\xb6\x64\xc4\xd8\x00\xac\x4e\x47\x15\xcb\x31\x7f\x9a\xa4\xb3\x52\x77\x50\xa9\x1d\x19\x1d\xb1\x21\xd1\xd5\x27\xbb\x34\xbd\xb5\x3a\xae\x9b\x3b\xc2\xbe\x24\xe3\x6b\x56\x7d\xbf\xc5\x42\x5b\x99\x42\xc4\x50\x5f\x18\x56\xe0\x0a\x6e\xad\xf6\x37\xd9\x3e\xe6\xd0\xd5\xf1\xc9\xae\x06\x9a\x19\x07\xb2\xa3\xde\x06\x9a\x94\xb3\xbd\xde\x76\xfd\xde\x2e\x4e\xec\xed\x2f\xa8\xe0\x48\xe0\x03\x0e\x71\x53\xc8\x42\x14\x80\x95\xc9\x69\x9c\xe0\xfa\xb8\x29\x16\x8e\x82\x55\xb2\x6c\xe2\x46\x49\x24\xe9\xc4\x73\x18\x72\x6c\x89\x6b\x4f\x5e\x74\x80\x17\x1d\x60\x22\xc9\xc8\x73\xc4\x20\x60\xef\xd3\xc8\xb7\x1a\x60\x05\xb6\x46\x53\x52\x64\x8d\x03\xe3\x22\x69\x59\x43\x33\x4c\x00\x32\x0e\x27\x52\xa2\x02\x6a\xa0\x63\xe2\x72\x06\x75\xff\xba\x11\xe1\x58\x59\x2a\xf9\xd0\xc1\x55\x92\x55\x37\x2e\xed\x5e\x05\xa8\xde\xcf\x3b\x22\x9e\x84\x28\x6f\x10\xb7\x95\x98\xd0\x83\x05\x72\x08\xd0\xa2\x3a\x48\x41\x3d\x85\x05\x17\x40\xee\x9f\x4e\x3d\xbd\x10\x98\xf3\x78\x58\x5a\x11\x7a\x06\x51\x2a\x77\x5b\x90\xc8\x7c\x69\x8d\x58\x6c\x33\x96\x11\xc0\x07\xc2\x79\xc3\x32\x78\x2c\x40\xc1\x43\x9c\x3c\x2e\x01\x3e\x3f\x0f\x4b\x49\x43\x06\x1e\x63\x17\xbc\xeb\x2e\x93\x94\x57\xd3\xdb\x36\xd7\x78\x69\xca\x39\x07\x4a\x93\x64\x19\xce\x1a\x21\xee\xc3\xb1\x4c\xe5\x13\x65\xcd\xdc\x72\x93\xed\xa4\x4e\x52\xd5\xeb\x2b\x29\x1c\x9b\x11\xd1\x5a\x6a\x93\x1d\x31\x47\xca\xfd\x79\x58\xb2\xb9\xbe\xe2\xd0\xaf\xf3\xf8\x7b\x2d\x2f\xda\x62\x9f\x72\xd1\x87\xbc\x9b\xcd\x97\xe7\x38\x5d\xfb\x52\x6f\xa5\x7c\xd0\x26\xe3\xf2\xd0\x5b\x85\xe2\x12\x25\x67\x69\xb8\xf1\xe3\x84\x06\x79\x75\x6f\xb1\x99\xcb\xac\x32\x49\x56\x6a\xcd\x5d\x6f\x4d\x9e\xc6\x17\xf5\xd6\xe4\xe8\xb8\x0b\x09\x3b\x8f\x0f\xb6\x9b\x87\x9e\x65\x34\x72\x43\x68\x0e\x19\x8a\xd1\xc6\x66\xff\x0b\x49\x02\x07\x66\x61\x1e\x96\x61\x6e\xdf\xbc\x8d\xd6\xae\xd9\x1d\x85\x1c\x67\x32\x72\x48\x01\x39\x3c\x76\x0f\x93\xd8\x54\x43\xf0\xfb\xbc\x79\x6e\x31\x91\xe4\xc7\xb3\xe1\x63\x93\x57\x4d\xb3\x49\x9a\x5d\x76\xd7\xb7\x46\x27\xd1\x3e\x36\x07\x47\x29\xe3\xe5\x91\x21\x7f\x6c\x3a\x9e\x3a\x96\x3f\x6f\xd9\xfc\xe5\xbb\x8b\x04\xcf\xf2\x83\xef\x3d\x1f\xbc\xca\x8f\x1c\x7c\x9d\x94\x81\x43\x06\xc6\x7d\xbd\x1c\x7c\x13\xee\xf2\xf5\x72\x08\x39\x87\xf0\xf5\x72\x88\xbd\x6e\x90\x7c\xce\x9f\x43\xea\xf7\xc3\xd7\xc9\xa2\xec\x77\xc4\xd7\xc9\xc2\x14\xfd\xae\x78\x71\x1e\x27\x1f\xbd\x9c\x49\x09\x89\x51\x11\x37\xbc\xb7\x73\x2e\xae\xaf\x8c\x6b\xfe\x30\xee\xfa\x0a\xfa\x7f\x9e\x96\x1c\x36\xd9\x2b\x44\xfe\x88\xf2\x7b\x00\x1f\xa5\x6b\x9e\x04\x55\xcc\xb9\x68\xfe\xb0\x38\x97\x2b\xc8\x84\x85\xf1\x64\x4b\x51\x0f\x03\xf6\x5c\xe0\x2b\x73\x5a\x1a\x4b\x3e\x8e\x38\xd2\x35\x95\x66\x21\xeb\xc9\xa0\x4c\x1c\x6e\x00\xc8\xad\x44\xc9\x21\x12\x89\x65\xa6\xef\x97\x8b\x03\x0a\x36\x56\xfb\x87\xe8\xe0\xb7\xa9\xfd\xa9\x0b\x5f\x8e\xae\xa2\x90\xc4\x6c\x0c\x2b\x6d\xa8\x64\x6d\xc9\x62\x8b\x46\x3b\x1c\xa4\x26\x2d\x0a\x77\x61\x4a\xc5\x32\x85\x5a\x57\x75\xcb\xe6\x6e\x35\x20\xf6\x72\x00\x2a\x6b\xbe\xe4\xfb\x81\xbc\xd5\xe4\xcc\x65\x24\x0f\xf8\xdb\xa8\x5c\x4b\x95\xae\x3c\xb0\x43\x4b\x4a\x92\x9e\xb5\xca\x77\xdf\x29\xa6\x00\x58\x70\x96\xd5\x7d\xca\x97\xa6\xaf\x01\xe3\x9c\x66\x25\x79\xa7\xca\x16\x21\xb4\x50\x06\x94\xf9\x3e\xae\x6c\x86\xd2\x35\xa8\x50\xd4\x4e\x12\x0d\x54\x04\x1d\xc9\x86\x65\x89\x23\xd8\xbc\x5b\x87\x6b\xee\x97\x90\xd9\x06\x64\xe1\xd3\x9d\xb9\x88\x7d\x6f\x28\xc5\x99\x85\xcb\xa6\xed\xf1\x3d\xb0\x51\x51\xec\x09\x47\x26\x82\xdb\x80\x6c\x50\x8d\x0b\x67\x82\xb7\x9b\x12\xb3\xdb\x19\x99\x8d\xac\xbc\x1b\x30\x2f\x49\x45\x06\xc7\x33\xd6\x82\x0e\xe1\x92\x73\x38\x07\xd0\xa9\xad\x23\xaf\x0c\x4e\x38\x9b\x5e\x11\x71\x26\x8b\x38\xb0\x10\xab\x00\xca\xdc\x8e\x88\x40\x7b\x50\x5a\x63\xba\xc2\xa5\xb5\xfc\x43\xa9\x99\x8a\xb8\xd2\x14\x72\x31\x0c\x39\xaf\x3d\x15\x5e\x39\xe9\xd3\x90\x4f\xde\xbd\xb4\xb1\xef\x96\x84\x64\x81\x6b\x0e\x4a\x01\xdf\xbf\x1f\xf2\xde\xd5\x30\x1b\x40\xb8\xe2\x30\xf9\xd2\xa0\x33\x18\xe8\xbd\x06\x71\x06\xd9\x31\xaf\x57\xf4\xb7\xd9\x7f\x67\x91\x5d\x2e\x2b\x70\x0f\xfb\xd6\xeb\x5d\x64\x37\xd3\x20\x3c\x25\xbb\x2b\x30\x1f\xa0\xb3\x34\x5c\x68\x3d\x19\xab\x3d\x95\xb2\xaa\x74\xf1\x7c\xb2\xcb\x2b\x0b\xce\x06\x53\xca\xd2\x4e\x24\x37\xb6\x92\xdb\xed\xbc\xe0\xbf\x65\x22\x57\xae\x5a\x12\x0c\x2b\xa2\xa8\x2c\x25\xc6\x1e\x52\xc6\x59\xef\x80\xd6\x0d\x28\x99\xa5\xef\x83\x7c\x11\x42\xf6\x35\x16\x73\x58\xb1\xbc\x0d\x47\xa2\x43\x30\x44\x08\x8a\xd5\x2b\x44\x74\xac\xb1\x06\x30\x07\x4f\x7b\x7d\xa1\x65\x8b\xb9\x95\x66\x31\xa0\x7d\xef\x3a\x46\x81\x14\x23\xa5\xa5\x2d\x08\x6e\xa1\xc3\xa7\xb6\x61\xac\x46\x1a\xd3\xa7\x4e\xe1\xb3\x25\x92\x98\x3e\x6e\x32\x6e\xdc\x60\xe7\x6e\x69\xf8\x54\xa7\xae\x11\xf5\xbe\x87\x67\xab\xf3\x07\xa2\x5b\x6d\x75\x9f\xe8\xf6\xf0\x8a\xe8\x7a\x47\x61\x06\x6f\x58\x6a\x79\x38\x41\x18\xe7\xbc\x3a\xdc\x2d\x10\xca\xef\x31\x86\xd2\x1b\x38\x72\x23\x95\x8a\x53\x1d\x74\xc8\xce\x9a\x72\x59\xc8\x52\x43\xd6\x65\x1b\xae\x23\x39\x08\x59\x58\x58\x2c\x23\x63\xdc\x6b\x5e\x30\xbc\x6e\xcb\x8a\xa2\xa1\x78\xd8\x66\x29\x6a\x8d\x49\xcc\x63\x66\x84\x90\x72\x41\x7e\xf2\xda\xc2\x43\xd1\x9f\x82\xe1\x3e\x66\x7b\x2f\x44\x41\xdb\x4d\x31\x0c\x71\xda\x68\xe6\xe1\xc6\xcf\xa6\x58\xba\x0d\xbf\x81\x65\x37\x8b\x43\x5c\xc6\x49\x4e\x61\x92\x53\xda\x9c\xc8\xa0\x78\xd6\x3a\x3d\xc7\x31\x7b\xbe\xfa\x3c\xbd\x61\x37\xcd\xe5\x6f\x3a\x7a\xf3\xe8\xb0\xfd\x61\x67\x74\x9f\x5f\xba\x1d\x40\xf2\x0a\x30\x07\x38\x6d\x34\xbb\x4e\xe4\x63\x5f\x6e\xd1\x34\x35\x62\x94\xe4\x82\x90\x78\x33\x1a\x02\x78\x07\xe3\xc4\x21\x52\xea\xa5\x3b\x78\x93\x58\x86\x16\x19\xe6\x29\xdd\x68\x10\xc3\xc1\x81\x78\x18\xbf\x95\xcf\xa7\xf2\xae\xa5\xf6\x99\x7e\xc4\xd9\x6c\xbc\xe4\xe7\xd8\x50\x86\xc6\xcf\x97\x66\x9a\x93\xbb\x32\x76\x9f\xf8\x4c\xe7\xa3\xae\x25\xea\x55\x75\x7b\xd0\x6d\x9a\xe8\x01\x2b\x5d\xe5\x1d\x68\x22\xda\xc2\x1c\x8a\x79\x7d\x0b\x93\x99\x1b\xed\x50\x42\x45\xe8\xf6\xb7\x53\x28\x46\x26\x9c\xc5\x32\x85\xf9\x8d\x4c\xbf\x35\xcb\x24\x2f\x53\x5d\xff\x90\x8a\xa9\x74\x94\xd2\x22\xca\xb4\x9b\x3d\xb8\x9c\x32\xfd\xb8\x5f\x0a\x11\x04\x17\xbd\x23\x16\xa7\x31\xb9\x1d\xb6\xb4\x41\xf4\xe3\x78\x61\xd0\x6c\x71\x13\x44\x47\x9b\x1c\xe5\x94\x21\xee\xa1\xa7\x41\x10\xec\xd0\x40\x5d\x6a\x41\x4c\x7b\x0b\x41\x93\xd7\x6d\xfb\x7a\xd1\x04\x09\x9e\xac\xbd\x8f\x48\xcb\x1f\xef\x8e\x9b\xff\x68\xa2\x52\x4c\x2f\x8e\xa3\x48\x67\xe3\x86\x1a\x60\x0e\xb6\x35\x11\xef\xd6\xfa\x31\x64\x88\x6d\xad\x59\x51\xe0\x8a\x4a\xee\x68\xa8\x34\x45\x06\x0f\x4d\x3a\x8c\x3c\xfc\x11\xc6\xb2\xa5\xc8\x59\x4d\x05\xfc\x51\x40\xcd\xb3\x37\x86\x06\x87\x88\x4d\xe9\xfe\x5b\x04\x5e\x2d\x02\x03\xd4\xa9\xff\xfb\xed\xa9\xaf\x38\xf7\x1f\x9d\xc5\xbe\xca\xdc\x3f\xb2\x67\x0c\x83\xd8\x23\x64\xfd\x3a\xdc\x0e\xa6\xd2\xe6\xd0\xc9\xd0\x5c\x5a\x91\x2d\x35\x19\x5f\x97\x14\xb1\x94\x15\xad\x0d\x42\x8e\xd0\xee\x5c\x22\x7a\x6a\x61\x5a\x3a\x18\x23\x29\x67\x46\xdd\x46\xa9\x5b\xd0\x09\xfa\x7d\xc2\xb9\x7e\xff\xa1\xea\x15\xe8\xfa\x96\x02\xd6\x4d\xc6\x55\xc4\xe5\x21\x34\x90\x8c\xc3\xc9\xb8\xed\xe8\x43\xf3\xc9\x11\x61\x40\x77\xb7\x58\x15\x28\xa4\x92\xd5\xde\x38\x85\x44\xdc\xfc\xbf\x9d\xbf\xe4\x56\xac\x75\xfb\x45\xa8\x86\x8f\xf1\x1b\x65\x7c\xaa\xf6\x0b\x14\xe3\xad\x26\xde\xdf\x74\x68\xb0\x83\xbf\xa9\xa1\x64\x7b\x55\xef\x6f\x29\xc1\xa1\x99\x13\x68\x40\xc3\xd1\x2d\xa5\x9c\x44\x1f\x83\xa0\x97\xea\x2b\x8d\xc5\xaf\x63\x92\x9e\x79\x98\xbd\xd8\xb2\xea\x61\xf6\x3d\x39\x59\x26\xc5\x6e\x65\x01\x9b\x11\x65\xfc\xa8\xa8\xe3\xb2\x5c\xc9\x58\x2a\xe5\x6f\x1d\xe5\xbf\x9d\x8e\x0a\x7f\xa8\xb8\x4f\x97\x06\x7c\x39\xf0\xff\x90\x46\x47\x1c\x84\xfb\xeb\xbb\x2b\x63\x95\x7c\xc9\x04\xe7\x0f\xed\x95\xd7\x7e\x07\x56\x23\xe5\x95\xdf\xa7\x8e\xce\x9a\x29\x69\xdc\x95\x77\x76\xda\x6b\xbc\xae\xfd\xb2\x1c\xf3\x3b\x9f\xa2\x26\x95\x89\x1b\xcd\xab\x42\x79\xf2\x1a\xcb\xf2\x42\x23\xb6\xf9\xfb\xa4\x98\xc9\xab\xa4\x4c\x9c\x87\x55\xa1\x02\x59\xe5\xf2\x72\x5f\x26\x46\x30\x4e\x2e\x2d\x6f\xb4\x9d\xf0\x8a\xef\x0e\x74\xe2\x69\x4c\xfc\x9d\xeb\xb3\xcb\x2c\xd6\xb9\x0b\xed\x5e\x1a\xed\x52\x64\x57\x81\xe7\xda\xe6\x60\xc9\x7c\x44\x76\x42\xed\x78\x3c\xe9\x9f\xad\x9f\x5e\x39\x32\xfe\xfe\x5a\xf7\xb9\xd1\xf8\xc4\x38\x79\xd2\x89\x6b\xd4\x06\x06\x94\xf7\x70\x5f\x17\x23\x49\xf9\xda\x80\xb5\xdd\x5f\x72\x49\x16\x67\x64\x88\x2d\x05\x6a\xc2\xc9\x7d\x3f\x31\xf8\x94\x5b\x31\xcc\xd4\xde\x60\xca\xcc\xf6\xba\x4f\xfe\x6f\x88\xeb\x66\xcb\x64\x95\x9f\x95\x60\x8a\x37\x99\xf9\x5e\x06\x66\x4f\x64\x58\x04\x86\x8c\x0e\x54\x36\x03\x53\xb3\x7c\xa0\x3d\x92\x28\x75\x20\xaf\x1c\xc5\x85\xc1\x5e\xe0\xa5\xb1\xd8\xa8\x2e\xf3\x31\x20\x76\x44\x92\x9a\x88\xd3\xcb\x45\x3a\xf7\x62\xa0\x50\x07\x02\x7b\x5e\x6d\xa4\xa7\xc9\x2d\x9c\x62\x0a\x0b\x96\x5c\x6a\xe9\xe5\x44\x6e\x69\xe2\x4a\x66\x9f\x52\x41\xf6\xe5\xbf\x55\x3e\xcb\x64\xf0\xf5\x5b\x59\xa6\x6a\x53\x4b\xf3\x30\xf1\x25\x83\x68\x38\xb4\x7c\xf7\x1c\x33\xa2\x47\x5b\x51\x2f\x2b\x48\x62\x5d\x52\x82\x77\x87\x29\x74\x49\x6e\xd5\xf0\xf2\x43\x02\xe5\x1a\x44\x9e\x09\x2e\x9b\x43\x89\xe6\xbd\x3d\x93\x38\x5f\xb2\xc9\xc2\x9c\xe0\xce\xa9\x38\xa9\xae\x61\xa0\x52\x09\xb4\x94\x51\x9a\xdf\x8a\xf9\x5c\x02\x59\x2a\xe1\x1a\xf7\x62\xfb\xd7\x91\x80\x6b\x73\x09\x26\x7f\x8c\x45\x83\x24\xb0\xa3\xd9\x26\x70\x42\x47\x4d\x36\x9f\xce\x29\xf7\x2f\xd3\x37\xec\x95\x89\xc7\x85\xf5\x09\x31\xad\x01\x09\x74\xc9\xe8\x27\x69\x26\x24\xd1\xfe\x3c\x45\x37\xfc\xb7\x88\x9e\x20\xa2\xa7\xda\x26\x7d\xd8\xe1\xff\x94\xa5\xfc\xb7\x43\xac\x59\x75\x5f\x7d\xde\x0d\x09\x27\x3e\xef\xd6\xea\x62\xf7\xb8\xbe\xd7\x1f\x33\x52\xc0\x80\x71\xe4\x80\x14\xa9\x76\x8f\xdb\xfb\x6f\x87\xf8\x7c\xea\x7e\xfb\xd3\x90\xbd\x48\xfe\x56\x0f\xc0\xcf\xf8\x76\x0c\xa8\xa1\x2e\x3e\x56\xbb\xc7\x63\xd9\xf4\x70\x0a\xd4\x0a\x91\x90\xdf\x8e\x03\xba\xd5\xc5\x5e\x16\xa6\x3a\x3f\x1e\xb2\x8b\x75\xf1\x93\x6a\x97\xe3\xd6\xbe\x9d\x44\xb2\xa9\x8b\xcc\x1d\xa1\x87\xdc\x2f\x6d\xd4\x44\xf7\x18\x18\xe0\x93\x17\x7e\xb7\xfd\xe9\xae\x7b\xe5\xf6\xf3\x90\x2e\xe2\xe0\xa0\xac\x36\x9d\xc3\xd8\xb7\xc7\xbc\xc8\xc0\xcf\x71\xab\x77\x8f\x0f\x13\xfa\x8e\xec\x6b\xa3\x2e\x6e\x3f\xef\x6e\x56\xfa\x6e\x3b\xcc\xa2\x3b\x95\x55\x17\x37\xb7\xd5\xa7\xb5\xfe\x94\xd7\xe7\x03\xf6\x9b\xde\x39\x88\xba\x78\xc0\x46\x8e\xae\xea\xfa\xe2\xdb\x23\x9b\x81\xdd\x0b\xdb\xbb\xf5\xf4\x85\x3f\xde\xad\xdb\xe6\x3e\x92\x51\x7f\x83\x40\xdd\x76\x93\xfb\xb7\xc7\x66\x7c\x75\x71\x78\x61\xd2\x70\x43\xc3\xe0\xbf\xbe\x2e\xd2\x79\x6f\x64\x7c\x09\xe5\x7c\xb7\x5d\xdd\x54\xf5\x19\x60\xce\x5f\x8a\x73\x3e\xce\xf0\x2d\x40\xe7\xbf\x38\xd2\xf9\xf7\x28\xfc\x04\xea\x7c\x5e\xed\x36\x8f\xd5\xa7\xef\x06\x7c\x2c\x03\x38\xf0\x1f\x36\x9f\x6f\xdf\xef\x7e\x77\xec\xe6\x00\x4b\xfc\xfb\xea\xc3\x1f\xaa\x55\x1f\xa3\xfb\xdf\xd6\x9f\x1f\x1f\xaa\x7a\x74\x77\x5e\xdd\xdf\xff\x3c\xba\xf7\xa7\x9b\xd5\xe3\xe7\x87\xfe\x9d\xcb\x4d\xf5\x98\x29\x31\xfb\xb9\x56\xf5\x8f\xf9\xe6\x6e\x88\x80\xfe\xf0\xf8\xdb\x87\xed\x8f\xeb\xbb\xf1\xdd\x3e\xcc\xfa\xdd\xfb\xed\x5f\xbe\x1b\x70\x63\x7d\x1a\x24\xbd\xfb\xb1\x9f\xe8\xef\xef\xf6\xeb\x7a\x7b\xdf\xcf\xfd\xb7\xdb\xed\x8f\xb7\xd5\xc3\x8f\x83\xba\xd4\x1f\xbf\x7f\xac\x86\x68\xe6\xc3\x3f\x37\xd5\xc3\xba\x01\x2a\xff\xe7\x7d\xf5\xf0\x6e\x3d\x06\x2b\x3f\x90\x0c\xe8\x15\x58\x06\xbe\x00\x56\x3e\x79\x3f\x83\x95\xdf\x7c\x1d\x10\xf4\x7f\xee\xc0\xd5\xbf\x59\x6d\x1f\xd6\x8d\xf0\x3f\x99\x54\x33\x52\x7a\xaf\xe6\x54\xc6\x0d\x72\x73\x86\xe8\xb7\x08\x72\xdb\x16\x08\x20\xef\x7c\x65\x02\xf0\x85\xc9\xdb\x69\x38\x7e\x75\xe4\x22\x70\xc6\xbb\x0d\x32\xa6\x54\x1b\x26\x16\x43\x8a\x4d\xe5\xc9\xb0\xf2\x99\x09\x3f\x03\x21\x60\xd3\x37\x2e\x4c\xd1\xc4\x77\xa4\xb2\x43\x1b\xc0\xc6\x2e\x59\x2b\x09\x14\x01\xc8\xd6\x33\x30\x48\xbb\x16\x29\x05\x38\x69\xde\x29\xee\x7f\xe4\x35\x0e\x79\xb9\x78\xf2\x58\x2a\x57\xc7\x5d\x5f\x45\xc5\xe6\xf0\x96\xea\x9f\x19\x8b\x41\x05\xcf\x5b\xbc\x6b\xf9\xc9\xd7\xda\x17\xce\x04\x68\xfc\x77\xd7\xd4\x53\x90\xe2\xea\xe1\x4c\x32\x67\x4a\x05\xd0\x86\x31\x8b\x33\x3b\x4d\x36\xd5\x38\x36\xd7\xbe\x22\xee\x9e\x16\x9a\xd8\xab\x22\x3f\x52\xfe\x08\xa7\x36\x20\x97\x58\x8c\x62\xe7\x75\xa2\xe0\x2a\xca\xe8\xdb\xed\x21\x44\xd2\xc4\x6e\xc1\x14\x01\xff\x0f\xae\xf7\x31\xaf\x36\x97\xda\xd5\xa5\x26\x3b\xfc\x58\x11\x63\xc3\xd8\x92\xd1\x89\xdc\x84\x22\x5b\x39\x38\x86\xc8\x73\x85\xe7\xa3\x8f\xb1\xd9\xac\x68\x5a\xe5\xec\x2d\xeb\x16\x0c\x37\x2e\x6b\x47\x35\x2e\x12\xb1\x43\x85\x94\x54\x68\xc2\xbf\xdd\xb6\xe4\xf5\xad\x4e\x94\x18\x2e\x2d\x53\x06\xec\x92\x82\xe2\x58\xe7\x86\x1b\xe4\x20\x45\x92\x76\xad\xf5\xa1\xd1\xc6\x9f\x53\x8c\x9a\xc9\xfa\x3a\x52\x11\x34\x82\xe4\x87\x85\x34\x56\x93\xab\x75\x6e\xb5\x09\xb5\xb6\x2c\x71\x42\xad\xbb\x96\x1b\x7e\xeb\x58\x15\x0b\xe3\xe1\x4b\x73\x84\x78\x5c\xe5\x8f\x73\xd3\x8d\x73\x25\xb7\xc8\xbb\x52\x31\x4c\x9a\x95\x62\x54\x52\xe8\x05\x3c\x72\xac\xa1\x28\xa5\x36\x5d\xb8\xa4\xca\x4d\x4b\x4c\x5d\x4b\x70\x50\x45\x3e\xc0\x9e\x0a\x97\x49\x64\x71\x1c\x1b\xce\xa5\x0c\xac\x3b\x2a\x83\x85\x6e\x64\x50\x4f\x84\xd0\xe8\x2c\x84\x0b\x96\x25\x96\x95\x31\x3e\xfe\xb6\x91\x42\x7d\x4c\x0c\xe5\x73\xc0\x4b\x1d\x93\xc3\x9c\xad\x72\xe8\x63\xd5\xf4\xf1\xe1\xd3\xa6\xb5\x16\xb1\xf1\x39\x63\x33\xfe\x5e\x59\xb2\x49\x89\x10\xd5\xd3\xa1\x6b\x54\x1e\xba\x8d\x00\x36\x8b\xd6\x56\xf7\x90\xf7\x19\x2e\xa5\x77\x93\x92\x15\x89\xec\x8b\xe5\x30\xbd\x3c\x96\xa7\x31\x2c\xad\x25\x71\x06\x2d\xf5\x77\xd0\x43\xc3\x16\x19\xf6\xd0\x48\x57\x14\xaa\x84\xf3\xe0\x24\x5d\xd5\x29\xdd\x97\x74\xdc\xa4\xcf\xd1\x43\xc3\x7e\x1a\xca\x0d\xfa\xa9\x09\xaa\xc5\x00\xda\x14\x23\x15\x83\xaa\x39\xb2\x69\x51\xc2\x17\x92\x07\x45\xd0\xad\x8a\xea\xb2\x18\x29\xb8\x42\xb5\x5a\x60\x61\xf3\x8e\x22\x9b\x51\x25\xb2\x86\x42\x7f\xcd\x26\xd5\xf7\xca\xd8\xba\xa7\x9e\xe8\x50\x77\x23\xbd\xb9\x79\x0a\xa5\xf3\xbf\x87\xfc\xdf\x62\xc8\x5f\xb1\x23\x78\x8d\x1b\xd3\x9b\x18\x07\xaf\x72\x54\x96\x3b\x1b\xe2\x98\xb0\x89\xbc\x6f\x8a\xa5\x23\xe7\x36\xc5\xa8\xcf\xd1\xde\x46\x24\x71\x32\x23\xe1\x44\x53\x66\xa4\xc9\x84\x04\x21\x93\xd2\x77\xad\x39\x91\xd2\x43\xb9\x27\x6a\xab\x5b\x13\x9d\xc3\xb8\x0a\x18\xe4\x7d\x2c\x05\xa3\xc9\xc3\x8b\x84\x03\x25\xae\x75\x10\x6b\x2f\x0c\xe9\x30\x52\x86\x7e\x5a\x8e\x81\x15\x38\x8c\xa9\x22\xfa\xf0\x2d\xac\xe0\x61\xcf\xd2\x96\x73\x53\x2c\x91\x06\x72\x3a\x11\x99\xf8\x69\xa3\x39\x28\x9e\x0f\xf0\xd7\x92\x72\x39\x9f\x5e\xe8\x82\x6d\xc2\x30\x4d\x2d\x75\x93\x0a\xb2\x0a\x14\xac\x5c\xfa\x21\xea\x49\x59\x5e\xba\xfe\x9d\x06\x29\x69\xd0\x1d\xdd\xaa\xf5\x1c\xb3\x08\xab\x30\x1f\xe4\xa8\xd2\x92\xc7\x61\xf7\x13\xc4\xb9\x34\x04\x9c\x0b\xd7\x57\xb6\x80\x47\x58\x9a\x7b\x0a\xa1\x8e\x3a\x8a\x18\x1b\x72\x72\xb1\xe5\xc2\xa1\x73\xdd\xb2\x24\xcf\x0b\x03\x3f\x76\x36\x50\x18\x87\x74\x29\x89\xb5\x65\x59\x95\xc4\x66\x6f\x22\xf9\x1a\xee\xfb\xf9\x72\x88\x8f\xbe\xf2\x64\x8d\x4a\x73\x5b\x88\x52\x36\x91\x12\xf6\x95\xdd\xc9\x4c\x49\x27\x90\x04\x58\x19\x6e\x54\xa4\x25\x07\x8a\xe6\x68\xb9\x16\xe7\x6a\x82\x3a\x01\x98\x5a\x54\x71\x24\x07\xfc\xc7\x0e\x16\x54\x53\xf2\xb5\x4e\x62\x0d\x26\x62\xb3\x68\x9a\x82\x99\x92\xa9\x46\x60\xff\x9a\xac\xd1\xfc\x8a\xde\x95\xb5\xdc\x6c\x84\x42\xad\xda\x16\x38\x2f\x75\xc0\x0b\x70\xa1\x3d\xa5\x13\xd9\x03\x5e\xc3\x18\xd2\x81\xd4\x73\x98\x5b\xfe\x45\xba\x39\x50\x08\x5a\xd4\xc0\x3c\x83\xc6\x69\xe0\xf2\xfa\x7e\xb7\x16\x54\x84\x5a\x54\xfe\xeb\xfa\xd1\xd3\x09\x8a\xee\x34\x52\x93\x27\xc1\xe5\xa5\x1a\x51\xc6\x30\x40\x7f\x87\xc0\xf0\x19\xf1\xae\x34\x19\x5b\xfe\xd8\x63\x6d\xe0\xf0\x92\xb1\xe5\x9f\x02\x96\x3f\x1f\x4f\x9d\xb5\xaa\x8f\xca\x00\xcf\xd7\x8d\xee\xb7\xac\x26\x6f\xe1\xe4\xf8\x0a\x35\xf3\x3c\x02\x82\xb5\x94\x10\x51\x84\x23\x44\xf6\x23\x31\x31\xba\x51\x88\x88\xd4\xe9\x17\xa8\x40\xfc\xf1\xa8\xf7\x37\xc3\x1b\x63\x1d\xdd\xe5\x05\xed\x29\xd2\x6b\xa9\x34\x22\xe6\x5e\x56\xde\x0c\x31\x36\xea\xa0\x64\x6f\xc5\x18\x36\xaa\x10\x2d\xeb\x31\x12\xb8\x94\x8b\xcd\x6e\x49\x26\x63\xb0\x70\x94\xcb\xc9\xe4\x05\x2f\x84\xf9\xcf\xa8\x8c\xd6\x4d\x58\x4c\x70\xf0\x1b\xa4\x0a\x7c\xc6\x9e\x7a\x01\x7a\xfd\x84\x7e\x60\xa0\x6f\x59\x13\x97\x88\x41\x16\x63\x37\xa4\xf3\xf5\xa5\x34\x43\x39\x55\xc9\x2d\xc8\xff\x2f\xd7\xa5\xaf\x80\xfe\xff\x4a\xec\x30\xaf\x22\x20\x99\x03\x7e\xb3\x6e\x2d\x30\x77\xc6\xe1\x66\x3c\xd9\xf4\xab\x18\x5d\x2f\xa0\x06\xe9\xb0\x45\x4a\xd7\x10\xb3\x50\x9c\x75\x21\x10\x8d\x78\x99\x52\x95\x94\x4a\x59\x6d\x70\xf9\x35\x86\xdb\x93\x05\xfd\xd5\x51\x4f\x0d\xec\xef\x7c\x8a\x74\x8e\xb5\x10\xfc\x65\xad\x9b\x8b\xb1\x31\xf0\xd2\x6d\x48\x16\xad\x59\x66\x10\x1f\x8a\x60\x76\x68\x07\x7e\x54\x7e\x5e\x2e\xe3\x3c\x2e\x2d\xcf\x59\x7e\xe3\xb8\xf4\x1b\x26\xf6\xa3\x64\xac\x01\x0c\xd0\x12\x89\x8d\x9e\xb5\xd9\x9f\x93\x37\x2e\x20\x94\x10\x40\x51\x80\xb3\x16\xb9\xe8\xfb\xba\xb2\xd8\x06\xa6\xac\x81\xfe\x88\x8b\xac\x8f\xf3\x7a\x7a\xe8\xf9\xfa\x04\x16\xd2\xe9\x45\xb3\x87\xc9\xc4\xc8\x22\x30\x92\xb5\x33\x40\x7f\xe3\xd2\x15\xcc\x5a\xe5\x37\x86\x62\xd9\x41\xfc\xc2\xe5\xdf\xab\x02\x77\x27\x9f\x70\x40\x38\xf0\xf5\x95\x61\x55\xce\xd9\xe5\x84\x11\x16\xdc\x1d\x5c\x58\x0a\x51\xc5\x39\x17\x03\xf0\x27\xa7\x8a\x65\x9c\x9b\xbc\xa1\xde\x7b\x5f\xe7\x3f\xbe\x2e\x33\x5e\x1e\xd4\xe0\xe3\x08\xaa\x9c\x1b\x9e\x94\xbb\x6d\x8d\x38\x37\x61\x40\xb6\x89\x72\x6f\xc4\x30\x06\x7c\x35\xf7\xc0\x91\x23\x9c\xda\x73\x9d\x46\x2d\x05\x24\x16\x04\x4e\x67\xdc\x61\x27\x8a\xc6\x2b\x5c\x06\x8a\xe6\xab\xd2\xef\xb1\x03\xc4\x9c\xcf\x9b\x20\xde\x8a\x96\xb7\x8b\x56\x1e\xfb\x21\x25\xad\xd8\xd6\x88\xeb\x90\xcb\x02\xab\x01\xf9\x38\x0e\x22\x4b\x58\x56\x58\x5f\x89\x73\xaf\xd5\x10\x28\xb2\x0c\xf3\xb8\x8c\xf3\x72\xe9\xe7\x71\xa4\x0d\x0a\xe5\x9f\x1a\xe2\x85\x42\xb9\xad\x9b\x63\xa8\x8f\x9e\x81\x19\x55\x54\xcc\xd9\x99\x03\xdd\xaf\x4d\x7d\x7f\x2d\xe6\xc0\x37\x48\x8f\xee\x26\xfa\x1a\xda\x0f\x7a\xf0\x2b\x92\x0a\x02\x18\xef\x55\xe3\x9d\xc9\xc7\x31\x62\x40\x0e\x99\x52\x63\x1c\x01\xdc\x15\x5b\x62\xa8\x19\xfc\x0b\x34\xc3\x9c\x1d\x39\x9e\x45\x12\x0b\xb7\x83\x90\xca\x85\x3e\x67\xb3\xd8\xa7\x4c\xf9\x61\xfd\x50\xc3\xaf\x3c\xec\x2c\x39\x3b\x1b\x37\xe1\x57\x21\x68\x74\xbf\x30\x41\x63\xb6\x2c\x1c\x95\x7e\x23\x56\x6d\x05\x46\x35\xd7\xc6\xf5\x14\x3a\xe1\x54\xe0\xa9\x36\x15\x75\x47\x1c\xaa\x51\xd8\x12\x06\x11\x85\xf2\x99\x56\xe5\x20\xf6\x92\x1b\x3d\x3b\x94\xe6\xfa\x56\x9b\xd4\xc3\x4a\x07\x04\xed\xc6\x92\x73\xa0\xe4\xaf\xa4\x5f\x14\x1f\x70\x2e\x00\x41\x28\x63\xc0\x82\xb0\xf5\xf0\x95\x32\xcb\x92\xd2\xdc\x18\x62\x7f\x7d\x6b\x9c\xf4\x5f\x49\x6c\x75\x49\x19\xcf\x91\xb1\x99\x83\xcb\x88\x87\x91\x35\xd7\x36\x63\x77\xc0\x82\x30\x4e\xcb\xa5\xf7\x96\xc9\x5b\xd9\x5f\x8d\x8f\x91\x01\x83\x21\x5a\x7f\xcc\x41\xa7\x33\x23\x56\x32\xf5\xe9\x15\xd1\xf1\xc0\xa6\x78\x6c\x19\x51\xcb\x52\xaa\xcc\x4d\xb6\x4c\xa7\x77\x01\x39\x5e\x30\x2b\x47\x31\x88\x3c\x89\x38\x75\xd2\x54\x94\x64\xca\xaf\x22\x4e\x27\xcd\x8d\xff\x4d\xcd\xf8\xf4\xde\x48\x20\x17\xb4\xa5\xf8\x7a\x01\x40\x27\x76\xa6\xdb\x78\x1e\xea\xdf\xc5\x61\x9c\xa1\xc2\x6f\x34\xf9\x5f\x52\xf9\x3c\xaf\xd2\x6f\xb5\x93\xfe\xb3\x14\xcd\x2f\xa0\x27\x7e\x51\x92\x46\xf8\x59\x9e\x61\x45\x8c\xc3\xc1\x03\x22\xb7\xd1\x66\x69\x7b\xcb\xc7\xa8\xec\xd2\xf6\x6f\x84\xf3\x2e\x5f\x6d\x41\xde\x03\x54\x67\x10\x9d\x58\x8c\x28\xb7\x45\x9a\x65\x84\x02\xd5\x0b\x34\x6c\xf9\x9a\x9f\x79\x32\x22\x7d\x0e\xa8\xad\x32\x20\x39\xc7\x84\x4b\x5a\x08\x25\xf1\x33\x53\x20\x9e\x1e\xd7\x2c\x42\xa5\x62\x4a\x7e\xe9\xa9\x48\xb3\x44\x49\x1d\xe8\x99\x8c\x25\xf6\x0a\x10\x3f\x8c\x80\xd5\x9e\x53\x17\xe7\xa1\x6d\x1c\x25\xd7\x5c\x1b\x03\x44\x84\x35\xcc\x0c\xa0\x7e\xf3\xb5\x9d\x0b\x55\x40\xd4\x6a\xa2\xd2\x57\x26\xa0\x0a\xa1\x85\x85\x95\xc2\xfb\x04\x4a\xb8\x73\x55\xcb\x44\x8a\xe5\x92\x8b\x6a\x58\x2b\x47\x2c\x1f\x15\x49\xbd\xa2\x5e\xf0\x53\x28\x9b\x6b\x7e\x10\x75\xa6\x59\x3d\x2c\xce\xbc\xd7\x94\xca\xa5\x03\x0c\x67\x77\xfb\xd0\xc3\x67\x3a\x44\xc8\x78\x37\x23\x48\x62\xdb\x87\x24\x66\x55\x2c\xfb\x30\xc4\xf9\x8b\x73\x1d\x22\xe4\x10\xa5\xf3\x08\xec\x6c\xd2\xb3\x90\x3e\xc5\xea\x49\x81\xfd\x55\x75\x6c\xd7\xaf\x43\x4c\x2a\xf8\x84\x1f\x53\x4e\xcd\x1a\x0e\x73\x2a\x15\xe5\x80\x3e\x28\x63\x73\x03\x81\xdd\xd6\x9e\x62\xa9\x3d\x22\xf8\xa7\xeb\xb7\x85\x41\x89\x5d\x5c\x0e\x11\xf4\x95\x19\x01\xf3\x8b\x99\x08\xce\xa5\x84\xcb\x10\xc6\xa2\x2d\xc4\x99\x18\x06\xb9\x24\xaf\xfc\x9c\x79\x19\x37\x11\x60\xb5\x96\x82\xa9\x35\xe1\x8c\xc9\x67\xb4\x65\xd7\xad\x76\x0a\x50\x43\xca\x63\x69\x5b\x59\xf4\x6c\xe2\xd2\xcf\x03\xf9\x59\x13\xf5\xd6\x9b\x23\xfd\x9e\xc7\xb7\x83\x34\xbe\xdd\xb0\x1d\xdd\x07\x26\x3e\xf9\xe5\x34\xa1\x5c\xc0\xeb\x2b\x2e\x95\x35\xf3\xb8\x64\xbb\xb1\x54\xe2\x0c\x1b\x10\x6a\x9d\xff\x53\x66\x56\x98\xf3\xb9\xd8\x0d\xff\x4e\x3a\xfc\x65\xdb\x10\xcf\xb0\x11\x3e\xbb\xb0\xfd\x9b\x0b\xc4\xf3\x96\xd2\xdb\xa5\xe2\x65\x3b\x23\x93\xe6\x6b\x8d\xa6\x23\x16\xcf\xeb\x77\x1a\x06\xd6\xd4\x14\xd5\xfc\xe1\xf1\x69\xe5\x04\xde\x97\x1e\xdb\x9a\xd1\x14\x8c\x26\x36\x97\xc6\x50\x02\x80\x7e\xa9\x52\x83\x06\x01\x5e\x56\x2e\xc8\xe3\x90\x1d\xa0\x7d\xa2\x6f\x0d\x94\xb0\x2b\x95\x98\xc8\xc1\xad\x0c\x59\xa7\x59\x4c\x02\x4f\xa6\xd4\x5e\x95\x14\x4a\x6d\x29\x80\x37\x3d\x2a\x5c\x1a\xdb\x23\xa9\x48\x91\xab\xf1\x7d\x4f\xd6\x88\x31\x1f\x57\x8e\x5c\x99\x3d\xf5\x12\x59\x4f\xa5\x43\x6a\x99\x4c\x1f\x70\x18\xb6\x59\x6f\xa8\x24\xb3\x0c\x67\xea\x58\x4a\xf1\x92\xdb\x62\x33\x7c\x04\x51\x13\x93\x00\xa1\xcf\x20\xd9\x3e\xac\x0f\x9a\x56\xb8\xbe\x32\x85\x4c\x63\x62\xa3\xcc\x3c\x95\x88\xd0\xce\xf2\xe0\x30\x07\x79\xb3\xd2\x26\xcf\xef\x26\xe9\xcc\x42\x13\x19\xe8\xfc\x99\xf2\x77\xe6\x23\x12\x88\x99\x74\xb0\x19\xb6\xb6\x00\x76\xd5\xe4\x51\xb3\x8c\x2a\xc9\xda\x95\xd5\x8e\x0c\xaa\xa5\xa5\x11\x91\xa6\x46\x9a\xda\x68\xd6\x4e\x5b\xf2\xf2\x08\x4d\x1b\x7c\x95\xd4\x01\x51\xbf\x74\x79\xe6\x3b\x98\xb5\x52\xb4\x42\x45\x31\xb4\x62\x17\xe6\x80\x37\x65\x89\x30\x8b\xb2\x58\x89\xdd\x8a\x45\x1d\xaa\x7d\xa6\xd9\xc1\x36\xa2\xa0\x3b\x59\x90\x15\x88\xf6\xfa\x29\x51\x28\x9e\x10\x85\x42\x77\xa2\x70\x99\xc8\x94\x19\x06\xd3\x65\x96\xc0\xd4\x89\x9c\xee\x44\x41\xb7\xa2\xa0\x7a\xa2\xd0\x4a\x42\x4f\xa6\x0d\xfc\x22\x20\x09\x03\xe8\x54\xb6\xaa\x58\x79\x50\xf3\x4a\xfb\x94\x64\x4b\x0d\x8b\x45\xd6\x81\xb2\x4a\xbb\xb4\x2e\x93\xe5\x25\x96\x05\x71\x4a\xad\xf0\xe7\xa2\x9c\x40\x61\x3a\x1d\xa7\x4d\xf8\xd9\x53\xa3\xf5\x68\xab\x16\x65\xbf\x59\x27\xcd\x07\x3e\x15\xd7\x04\xbb\xa7\x56\x9e\x35\xa6\x07\x4f\x56\x66\x22\xf0\xcb\x58\x91\x0c\xb4\x6c\x54\x56\xea\x83\x5a\x92\x67\x9d\x99\x9f\x10\x20\x63\x6a\x4f\xb2\x96\x34\x16\x7c\x8b\x49\x19\x3b\x33\x01\x33\x4d\x38\x78\xce\x9a\x52\xc6\x7e\xa2\xb2\x8a\x14\x12\xf8\xe3\x3a\xfb\xcc\x18\x6d\x57\x16\x2e\xcd\xe0\x8a\xb1\x0e\x6c\xc3\xd8\xb4\x0d\xd0\xe3\x79\x70\xb5\x63\x4b\x8f\xc6\x56\x1e\x46\xa1\x37\x70\x8b\xc3\xcd\xfe\xa3\x80\x93\x67\x0c\x2d\x8d\xb1\xa5\xbb\xb1\xa5\x0f\x63\xab\xea\x8f\x72\xa8\x1d\xab\x39\x8f\x9a\xfe\x08\x91\x65\xb0\xa8\xa0\x48\x11\xff\x9a\xc9\x04\xfe\xbf\x35\xd8\x7d\x6c\x65\x32\x2c\x2d\xae\x45\xbb\xed\x90\xa9\x87\x82\xcb\x97\xdc\xf4\x56\x46\xa1\xc8\xdd\x25\x18\x02\xfe\xce\xe4\xf9\xeb\x29\x04\x83\xce\xcf\xd7\x56\x25\xc8\x88\x8f\x84\x75\x64\x82\x4d\x94\x0e\x02\xec\x92\x72\xe4\xc3\x82\x33\x85\x82\x87\x55\x2f\xd3\x13\x07\x20\xc3\xd9\x5a\x74\x75\x54\xc8\xd1\x52\x10\xcd\x87\xed\x3d\x91\x74\x2f\xab\x12\x27\x25\x71\xa6\x32\x08\x0d\xc8\xd7\xa6\xbb\xc9\xca\x4a\x55\xcc\x80\x18\x9b\x6b\xd3\xa9\x54\x04\x49\xd7\xd5\xe0\xac\xad\x4a\xe9\xbf\xb2\xed\x74\xe9\xdd\x54\x8a\x80\xa5\xff\xbb\xd5\x55\x3f\x86\xf6\x29\x75\xc5\x56\xf5\x50\x98\x8c\x06\x75\xce\x4a\x63\xb9\xa6\xc9\x59\x62\x31\x36\xc8\xda\x85\x53\xb6\xe8\x83\x0a\x62\xec\xcc\x13\xa5\xb0\x34\x66\xde\x82\x70\xa2\x79\x95\x5d\xda\x01\x7f\x96\xcf\xa2\xd1\xc3\x27\x24\xb3\x80\x87\x14\x97\x73\x66\x70\x74\xe5\x68\xa8\xd8\xed\xd7\x83\x9d\xc8\xd8\x25\xfb\x39\x9f\x42\x21\xfe\xac\x84\x1b\x70\x6f\x8f\xca\x6a\xca\xc3\x0d\x65\x95\x9d\x73\x24\xef\x6b\x6c\xa4\xda\xe1\x69\xaf\x51\x07\x5a\x9c\x5c\xb3\xa8\xa9\x5c\xc6\x1e\xd6\xaf\xe4\x01\x2c\xbc\xec\x58\xc3\x89\x3c\x04\x7e\x40\x87\x9b\xed\xb7\xb9\x19\xef\x73\xc5\x51\xf3\xe2\x50\xe9\x40\x10\x0c\x07\xdc\x48\x45\x38\xd3\x32\xe8\xef\xbb\xf7\xdf\xbc\x3a\x82\x33\x33\xf3\xbe\xa4\xc8\x8b\xb7\x75\x14\xf3\x74\xbb\x5b\x11\x27\xcd\x5f\x43\xde\x0c\x93\x8d\x4f\x38\x67\xf3\x53\xd0\x8b\xbf\xe2\xd5\xd0\x53\x3d\x94\x94\x29\xbf\xba\x7c\x19\x37\x0b\xaa\xc3\xdc\x56\xe6\xa5\xc8\xbe\xbf\x0a\x45\xf3\x72\x86\xfb\xbf\x83\x36\x7e\xc9\xf9\xd2\x17\x37\x3b\x66\x43\xe8\x7d\xf8\x09\xc7\xf4\x75\xba\xe3\x89\x71\xd8\x9e\xde\xbf\xd2\xbd\xf8\xf5\x43\xf0\x55\x4e\xb8\x23\xab\xa1\x07\xc7\xf1\xcc\x8e\x04\x93\x5f\x21\x9c\x5b\x15\xda\x04\x15\x44\xd5\x99\xa0\x8c\xdb\x45\x58\x45\x4e\xe1\xaf\x4a\x7e\x6f\xb7\x91\xc5\xb2\xd1\x14\x52\xed\x01\x59\x40\x7e\x68\x26\x79\x59\x6f\xb8\xba\xd0\x81\xa2\xad\x80\x6e\xd5\x7e\xa8\x4b\xe2\x78\x09\xa6\xba\xd8\x44\x88\x29\xc0\x7e\xa1\x20\xd7\x57\x9c\xc4\xf2\x67\x47\x61\xa0\xbc\x2d\x53\xb4\x75\x21\x4b\x06\xb1\x27\x11\x08\x3a\xd8\xcd\xa3\x64\x35\x19\x33\xc3\xf9\xc7\x61\xbd\x22\x53\xc1\x4a\xcb\x4a\x57\x6a\x27\x8b\x29\x9b\xe4\xa7\xe1\x5d\xae\x28\x2b\xfc\x25\xd5\xf4\x38\x3c\x77\xca\xb0\x18\xc7\x79\xc7\xbb\xe8\x44\xef\x50\xae\x53\xf1\x70\x9f\x9c\xb2\x01\x76\xe6\xe7\x03\x78\xe3\x42\xf1\x9c\xfb\xbc\xf0\x85\x3e\x05\x80\x97\x9f\xcd\x10\x87\xa3\x5c\x10\xdc\x38\xfc\x88\x5e\x7f\x74\xe7\xa4\x6c\xed\x73\xd9\x9a\x7c\x46\xc0\xe4\xe7\xec\x28\xf2\x30\x17\x1c\x20\xa7\x61\x59\x4e\x05\x88\x7d\x7a\x19\x84\x2e\x65\x59\xa9\x47\x72\x62\x83\x77\x84\x2b\x86\x52\x89\x33\xb5\x4c\xad\x8c\xeb\x61\xf2\x0d\xd2\x18\x63\x21\xd0\x36\x47\x02\xf4\xf5\xc7\xd7\x17\xcd\xaa\xff\x9d\x23\xef\xa5\xd4\xa3\x40\x32\x85\x73\x68\x59\xac\x1c\x06\xa9\xf6\x9a\x22\xff\xd2\x43\x7b\x66\xda\x95\x95\xed\x05\xab\xb4\xbd\xf0\x26\xf3\xef\x59\x11\xc3\x50\x7a\xdd\x38\x7a\xa1\xd7\xdd\x33\xb9\x3b\x84\xfb\x14\xaf\x1e\x52\x2f\x74\x70\x7b\xa6\x04\x05\x86\x98\x19\xe4\x27\x4b\x80\xf1\x80\x83\x2c\x3a\x99\xe8\x86\x1e\x16\x8c\x5d\x1f\x9f\x07\x63\xff\x60\xa3\x4b\xf8\x15\x45\x77\xcf\x14\xfd\xb9\x89\xf0\xe4\x8c\xfc\x71\x47\x87\x67\xda\xeb\x57\x36\xed\xdd\x26\x35\x5c\x97\x28\xd3\x9f\x16\x0c\x14\x25\xfb\x3e\x60\x34\x0e\x57\xfd\xf5\x2d\x88\x69\x95\x1f\x7e\x3c\xd4\xef\xf8\x7c\x03\x7e\xca\xc3\xf7\x38\x31\x60\x83\x24\x0c\x93\x8b\xda\x14\xe3\x95\xd0\x40\x78\x0c\xc6\xd4\x50\x40\xcc\x33\x02\xf2\x1c\x5a\xe6\xf3\x86\x1f\x63\xfd\x15\x54\x6c\xb9\x09\x8c\xe8\xd5\x0c\xdb\xd9\x3b\x39\x29\x2d\x05\x3f\x9a\x3e\x9a\x96\xca\xbb\xee\x83\x24\x1a\x15\x39\xd1\x90\xbf\xb4\x10\xe4\x10\xb8\xe6\xda\x4c\x10\x21\x69\x37\x29\x6f\xdb\x16\xd7\xed\xbc\xcd\xe3\x79\xbb\xeb\xd7\x61\x1f\x5d\xdf\x82\xb0\xd8\x1f\x93\xa0\xd1\x9b\xaf\x35\xdd\x5f\x34\x9e\x3d\x45\x7f\x7c\x48\xbf\xce\x6f\x69\x64\xdd\xb6\xf0\x73\x4f\x6e\xdf\xb3\x72\xa3\x20\xdb\x63\x94\x84\xe3\x20\xdb\x30\x0c\x85\x77\xd7\x57\xd8\x30\x41\x14\xb1\x2d\xce\xb4\x7b\x05\x7a\xb9\x6e\x15\x73\x8c\x65\x0a\xcf\x9f\xa0\x98\x02\xdb\x85\x99\x50\x4c\x95\xac\x4a\xc4\xd8\x9c\x67\x43\x29\xfb\x8e\x78\xb2\xb1\x06\xa2\xab\x27\xa7\x9d\x76\xa3\x13\xf4\x8e\x22\x8a\xa9\xdc\x33\x25\x5b\x07\x8a\xa5\x08\x7f\xb9\x30\xe0\xce\x35\xa9\x16\xc3\xc9\xcb\x42\xcc\xcf\x8d\xaf\x53\x46\xdc\x70\x3e\x13\xf0\x2c\xd9\xe0\x1d\x4f\xc9\xe0\xd2\xa7\xf8\x3e\x14\xe2\x24\x6b\xf4\x59\x63\xb4\x94\xd6\xeb\x37\xbd\xea\x37\x7d\xfb\x02\xdc\xfb\x82\x2a\xaa\x61\xe3\x37\x7f\xcd\x86\x8d\xdf\x74\xc9\x57\xda\xdd\x32\x11\x47\x1f\x05\x42\x1d\x7f\x91\x2e\x98\xe4\x70\xde\x8d\xa8\xc9\xbe\xdd\x12\x6c\x23\xe1\xb9\xbd\xb7\xd3\x47\x72\x17\x6b\x7c\xae\xad\x35\xfb\xcb\x6c\xad\x1d\xf7\xee\x7f\xb6\x11\xcf\xa3\xe8\xa0\x42\xd2\x33\x1c\x5c\xf2\xf8\xfa\x2a\x28\x8e\x4b\x11\xb6\x3a\xe8\x40\x45\x1a\x07\xfa\x15\x22\x75\xa6\x94\x05\x55\x82\x0b\x43\xbc\xbe\x65\x44\x93\x19\x32\xbe\x0e\xc4\x56\x87\x7c\x20\x2a\xab\x9e\x49\xa0\x60\x26\xe6\x12\x89\x3c\xc7\xf6\xdd\x17\xb6\x92\xde\x20\x56\x47\x66\x6b\xff\xf7\xd2\x88\xaf\xda\x9f\x3b\xd7\xe6\xd5\xf1\xf9\x7d\x82\xad\xd6\x22\xce\x3e\xb7\x77\xd5\x2d\xaa\x4d\xe6\x70\x11\x43\xad\x5b\x2e\xc3\xcb\x81\xaf\x6f\x0b\x65\x8b\x19\x48\xc3\x1b\x25\x6e\x41\x00\xd0\xde\xe9\x7c\x52\xde\x36\xb9\xf7\x5a\xc7\x14\x94\xca\xdc\x40\xc6\xe2\xd7\x07\x10\x2e\xbf\x61\x5e\xee\xa5\xce\x9e\x0a\xff\x86\xd4\x9f\x9d\x1e\x13\x19\x8b\xcd\x2e\x53\x25\x0a\x51\xe1\xd2\x1a\x25\x1c\x74\x98\x97\x94\xe2\x6c\xfc\xac\xf7\xdd\x49\x9b\x37\xcf\x2f\xd1\x5e\xd2\xbb\x57\x09\xdb\xd9\xf6\x80\xb5\xd1\xf8\xd1\xf7\xd1\xa6\xba\x57\xae\x6f\x4b\x62\xb8\xaa\x5a\x1e\x55\xd0\xe8\xa6\x82\x1c\xc8\xa6\x51\x0d\xcd\xa0\x86\xb7\x81\x4a\xab\xb1\xc7\xd1\xcf\x53\xf7\xf3\x44\x2f\xe1\x24\xf8\x94\x53\x88\xc1\x10\xe8\x43\x31\x3f\x79\xea\xeb\x24\x1b\x66\x2a\xc2\x06\x9b\x45\x83\x0d\x08\xc3\xaf\xde\xd2\x7b\x4e\xa9\xfe\x2d\x47\xde\x17\xc7\x86\x09\xcd\xd8\x70\xc4\x09\x63\xc3\x50\x7a\xd3\xe8\xe8\x8f\x6c\xf3\xd6\xf4\xcf\x21\xf3\xb7\x11\x9d\x6e\xa8\x08\xe3\x75\xbf\xe1\xd1\xf2\xd0\xf0\x90\xb9\x5c\x3e\xb4\x54\x84\xeb\x2b\x86\xab\x85\x2c\x9e\x09\x5c\x57\x9d\x17\x4d\x92\x7f\xb3\xc3\xdd\x22\x83\xdc\xe1\xe5\xeb\x5b\x2d\x32\x2d\x4f\x86\xdf\xa9\xe3\xdf\x19\xd3\x84\x24\x14\xa7\xcc\xe6\x43\x1c\xe0\x06\xa3\xfc\xef\x6f\x1e\x78\xbb\x34\x3e\x2f\xed\x46\xa6\xfa\x73\x4b\xfb\x60\x2e\x08\x8a\x8b\xaa\x54\xad\x1b\x50\x43\x52\x2d\x6b\x32\xb4\x34\xfe\x51\x68\x42\x11\xa2\x8a\x87\x5e\xb7\x46\x23\x46\xa1\xb7\x35\x12\xb4\x21\x9e\x75\xa9\xa9\x36\x83\x5f\x78\xc6\xb8\x45\xc8\xcb\xab\xe4\x1e\xfc\xf2\x2f\x16\x7c\x67\x1a\xc1\xbf\x35\x0e\x9b\xad\xfd\xc1\x8a\xf5\x23\x77\x6d\x56\x68\xb4\xd9\xa1\xc9\x72\x91\x82\xd5\x68\xda\xb6\xd1\x8c\x94\xc6\x3b\x7d\x84\x89\xf5\xc5\xbe\x44\x2d\x0b\xc0\xd3\x53\x8a\xe2\x00\xaa\x1a\x96\xfa\xb0\xf4\x3a\x36\xaf\x6c\x54\x6e\xa3\x43\x65\x02\xf0\x77\x42\xe7\x69\xa8\xad\x74\xb7\x54\x75\x96\x83\xe3\xf3\x35\x17\xd8\x29\x13\x36\xe5\x32\x54\x0c\xdd\x23\x97\xd6\x4e\xe5\x00\x86\xfb\x15\x8e\x9b\x15\x53\x60\x15\xc8\x47\x85\xb8\xba\x4c\x75\x68\x80\xa7\x85\x6b\x33\xa9\x01\xd6\xb4\x34\x4b\xe3\x28\xa6\xaa\x44\x44\x79\xeb\xe4\x2b\x25\x29\x8d\xb6\xd9\xe5\x4b\x33\x79\xa3\x1d\x71\xa9\x4b\x32\xd8\x44\x44\xa4\x5e\x3f\xce\x44\x9a\xb3\x54\x7c\x99\xc3\xb2\x18\x27\x15\x70\x0c\x96\x1f\x61\x9f\xe6\x76\x18\x04\xa0\xb8\x54\xdc\x09\x30\xc1\xd5\x90\x57\x46\x0c\x0c\x4f\x0e\x6e\x9c\x91\x4c\xf6\x10\x8e\x43\xf7\x31\x0a\x86\xd8\x6c\x02\x39\x5e\x71\x3e\x88\x0a\xe4\xbd\x66\x25\x4d\xab\x2d\x85\xd3\x9c\xa3\x9e\xdb\x47\x75\xca\x9a\x79\x8f\x48\x36\xbb\xba\x8c\xbd\x7e\x36\xf1\xfa\x56\x07\xcd\x1b\xb7\x34\x7e\x7e\x12\x2b\xe6\xb3\x07\x8d\xff\x3f\x7b\xff\xfa\xdc\x38\x92\x23\x8a\xe2\xff\x8a\xa3\xbe\xfc\x62\x23\x32\x11\x04\xf2\xdd\xbf\x3b\x1f\xb4\x35\xbb\xcb\x13\xc7\xde\x33\x77\x7a\x86\x7b\xc2\xdf\xd4\x2e\x4f\xcb\x31\x74\xb9\xc6\x76\x69\xb6\xcf\x8d\xfb\xbf\xdf\x00\x92\x94\x48\xea\x61\x4a\xa2\xca\xae\x6a\xef\xf6\x64\xc9\x7c\x65\x26\x12\x40\x02\x48\x3c\x30\x09\x4f\x20\x40\xfa\x88\x01\x1c\xaa\xd4\x86\x09\x45\x45\xed\xbf\x3f\x4b\xe1\xfb\xc8\x0f\x2a\x07\xe4\x64\x0c\x40\x66\x4e\x49\x32\xf2\xa5\x75\x69\x5a\x04\xcb\x90\x0e\xf6\xa3\x13\x8f\xf2\x22\xe7\x52\x8a\xd9\x89\x8a\xff\x59\x78\x88\xfe\x23\x63\x06\x5f\x23\x79\xa6\xf0\x8c\x2d\x14\x9b\xa4\x18\x0e\x25\xa2\x2d\xfb\xb7\xae\x18\xfe\x7a\xa8\x53\x18\xb0\x99\x5d\x98\x61\xf4\x58\xd1\x3f\x94\x59\x84\x0a\xc7\x56\x79\xdc\xac\xf8\xd6\xa9\xec\xb1\x3b\x06\x4a\x61\x71\x23\xf5\x75\x99\x7e\x55\x00\xa3\x6d\x46\x32\xbb\xd8\x42\xbe\x8a\xc9\x57\xed\x20\x5f\x89\x41\x28\xc9\x88\x66\xdc\xa7\x60\x66\xe7\x62\x05\x4b\x37\x5a\xd2\xb6\x6b\x26\x61\xcd\x24\x2c\xa1\xb1\x7a\x07\x09\xf3\xf8\x12\x14\x69\x49\x80\x66\x48\xc1\x8a\x29\x58\x99\x1b\xf1\xd9\x64\x02\x66\x52\x4a\xfc\x40\x13\xf5\xcb\x04\xdc\xb3\xb8\xcb\x12\x7e\xcc\x07\x1a\xc6\x30\x13\x21\xc9\xb6\x64\xe5\xdf\xa2\x22\x5a\xc4\x7e\x45\xe5\x2e\x11\x6b\x04\xe6\x6d\x9e\x84\x67\x24\x2d\x66\x4e\x40\x09\xce\xe5\x59\xe8\xd0\x8d\x5e\x28\x14\x05\x08\x49\xd9\x92\x10\x4c\xf8\x88\x51\xc2\x01\x04\xa5\x8d\x14\x2c\x56\x61\x42\x3a\x26\xe5\xca\x34\x48\x54\xd0\xe1\x29\xf9\xa0\x88\x75\x20\x15\x4a\x5b\x11\x96\xd3\x91\xb0\x67\x76\x4f\x06\xa2\xbd\x91\xa2\x9f\xc4\x34\x63\x25\x11\x54\x01\x45\xe8\xfc\xfc\x99\x2c\xc3\x9d\xb5\x23\x29\xa2\x1a\xb0\x22\x5c\x24\x08\x61\x93\x92\x73\x62\x4d\xa1\x64\x53\x30\x46\x38\xc6\x42\xd6\xaa\x94\x6d\xfe\x11\xc8\xba\x8f\x98\x40\xf6\x8e\xa6\x70\x9f\xc0\xd5\x2d\x91\x78\xa3\xdd\xa4\xe2\xf5\x68\xa7\xa0\xe2\xa4\xc8\x0c\x6a\x70\xfb\x0e\x0a\x24\xe5\x4a\xaa\x36\x9d\x19\x47\xd3\x70\xae\xd6\xd3\x27\x5f\x1e\xcb\x7a\x04\x96\xd5\x55\x63\x66\x99\x76\x32\xe9\xc8\x91\x0d\x6f\x4c\x56\xd2\xd4\x74\xee\xf0\xff\x37\x6f\x1c\x21\xbb\x76\x7d\xdd\x20\x66\xef\x65\x3b\x27\xf1\x88\xa0\x95\x5f\x44\xa1\xad\x84\x20\x48\x02\x54\x82\x90\x9b\x7c\xc7\x80\x65\x5a\xc5\x19\x06\x09\x14\x0a\x6d\x65\x63\x54\x94\x9d\x29\xc2\xdc\xf2\xfa\xa9\xdc\x66\xa0\x12\x44\x9d\x9f\x5f\xb3\x4b\x2d\x75\x49\x3a\xec\x93\xff\xb6\xc2\x8e\xec\x9a\x29\x49\x9d\xd6\xa6\x2b\xfe\xaf\xe5\x46\xc1\x2b\xa9\xe0\xba\x65\x78\x5a\x4a\xd6\x49\xb8\x00\x15\x6b\xff\x71\x9e\x93\xce\x35\xf4\xbb\x9d\x9a\xd4\x2b\x27\xce\x80\x2e\xdc\xcc\xe5\xb8\x9d\x62\xcd\xab\x82\xf8\x79\xe3\x80\x23\x29\x88\xe2\x81\xe6\x7b\x27\x83\x9a\x39\x04\xbf\xec\x9a\xb6\x11\x8f\x44\x0a\x32\x3d\x9f\x3c\xee\x52\x12\x1e\x74\x03\x62\xd7\x6b\x73\x7d\x25\xd5\x9e\x95\x29\xca\x04\xde\xce\xc5\x25\x44\xe5\x76\x35\xe3\xec\x8f\x2e\x69\x8a\x5c\xd3\x36\x2b\x02\x45\x92\x43\xe8\x82\xff\x6b\x79\x6e\x74\x92\x5b\xbd\x27\xaf\x9b\x94\xe7\x9e\x37\xef\xd4\xc9\x3a\x01\x3e\x68\xab\xac\x61\xba\xce\x6d\x6b\x1f\x15\xbf\x7b\x2b\xe5\x65\x6c\xa7\x32\x36\x65\x87\x7c\x4c\x22\x54\xa6\x55\x79\xfa\xc6\x63\xbf\xd7\xad\x6d\x3b\xc5\xa6\x5d\x8f\x51\xe7\x31\x6e\x84\x09\xf0\x9c\x34\x84\x38\x73\x8e\x79\x53\x6e\x9b\x0e\x1a\x50\x1d\x61\x62\xf8\xbf\x6e\xeb\xfa\xee\xcb\x53\x63\xf1\x34\x10\xcd\xca\xea\x66\xcc\x87\x8b\x47\xd6\xc0\xc0\xa4\x0f\x17\x8f\xbf\xb5\xbf\x0e\xd5\xbb\x7a\xda\x16\xb1\xf8\x6b\xd2\x06\xd1\xa3\x67\x4e\xe7\x36\x48\x7e\xfd\xca\x11\x1a\x54\xbf\x67\x29\x96\x60\xec\x1c\x73\xc6\x18\x5c\x2b\x77\xf2\x67\xcf\x75\x3d\x77\xdc\xbc\x71\x40\xcf\x6e\xb3\x67\x62\x96\x72\x50\xcf\xeb\x37\xae\x3f\xf4\xea\x5d\x0a\x05\x1d\xf2\xa9\xce\x1b\x07\x4c\xc2\xcb\x24\xfa\xd3\x10\xa6\x8c\x90\x98\x5d\xaf\x93\x79\xac\x58\xb2\xea\x26\x02\x69\x58\x38\x3f\x7d\xe0\xe9\xc6\xa9\xd8\xf8\x82\x43\xf1\x99\x30\x71\x67\x55\xcd\x2d\x7b\x8f\x97\xc0\x36\x9c\xe5\xb0\xd1\xdc\x36\x30\x8b\x12\x92\x63\xe7\x24\x31\x46\xb9\x6d\x38\x38\xf3\xad\xcc\x2f\x72\xd3\xee\x10\xe4\x75\x8e\xac\x93\x23\x97\xdc\xb6\xf7\x9c\x48\xa9\x71\xb0\xf3\x60\xbf\x7a\xba\x92\x5d\x27\x82\xa5\xa6\x5d\xbf\xad\xf2\xdb\x51\xb6\xa0\xb8\xda\xed\xa4\x57\x95\x77\x43\x62\x76\x9d\xdb\x66\xa0\x12\x44\xc5\x93\x8b\x52\x0d\x37\xae\xfc\x42\x40\x62\xad\xfa\xd1\xe6\x82\x37\xeb\xfd\x40\xb2\x3d\x64\xce\x96\x72\xb3\x52\xae\x0d\xf4\xb8\x36\x6f\x3e\x0b\x4c\x9b\x3b\xcf\xf0\x4d\xdd\x7f\x53\x0a\x2b\x71\x1f\xfd\x3d\xa7\x59\x93\xeb\xab\xec\x07\x49\x11\x9c\x1b\x10\x18\x36\x89\xbe\x25\xc3\xd1\xfa\x46\x63\x04\x69\x5f\xba\xbe\x0f\xb2\xe9\xcd\x87\xcf\x48\x74\x64\x73\xa5\x7b\x59\x8a\x59\xc8\x5b\x7e\xf0\xd6\xde\x2e\xc9\x31\x5a\xe6\x2e\xc7\xe1\x62\xcb\x11\x07\xc7\x4f\xb9\xc4\xe2\x3e\x21\x4d\xfc\x1c\x4b\xee\xd0\xd6\xc8\x9a\x7c\x80\xd0\x3d\x9c\x27\x0d\x26\x5d\x4a\x95\x6f\xa4\x12\x1d\x20\xee\x79\x0e\x0d\x2f\x30\x52\xe9\x07\x46\x7c\x0f\x3e\xd4\x62\x30\x8a\xa5\xdd\xbc\xe7\x2f\x45\x37\x32\xd8\xfb\xa8\x92\xc4\x1b\xc0\xa2\x58\x6c\x15\xbd\x42\x41\x7b\x56\xb1\xc6\x0c\xc9\x99\xa9\xc8\x2e\x22\x60\xaa\x73\xbc\x75\xd8\xf5\x29\x31\xd1\x34\x17\x31\x6d\x7e\x8b\x24\x9a\x93\x6c\xd9\xd3\x79\xc5\xf5\xc8\x48\x51\x38\xf0\xa8\x63\x69\x86\xc7\x12\x57\x39\x27\x31\x51\x89\x06\xb0\x7d\x8c\xbf\x76\xb0\x3c\xbb\x29\xd1\x06\x85\x85\x1c\xea\x50\x8d\x2c\x9f\x74\x93\xb7\xf0\x65\xa7\xec\x42\xd3\x80\xf2\x65\x2e\x4c\x83\xc5\x82\x55\xc2\xcd\x37\x31\x28\x5b\xa2\xdb\x78\x8d\x29\xb5\x28\x43\xff\x7a\xac\x25\x17\x3d\xf5\x0d\x01\x40\x0b\x27\xd5\xf8\x0a\x70\x8a\x48\x4c\x6b\x63\xde\x62\xa9\x2f\xd6\x9a\x65\xc7\x68\x06\x37\x31\x2c\x7a\x36\xa7\xe4\x74\x1e\x15\xf8\xa0\xc8\x2f\x24\x61\x6a\x7e\xb3\x3b\x99\xa4\x0c\x2d\x06\xe2\x2a\xc3\xc0\x88\xc6\xef\x17\x7e\xc0\x4f\x6a\xb0\x7d\x90\x69\x1e\x17\x6f\xa9\xa1\x16\xab\x65\xdc\xf6\x0a\x6a\x1a\x48\xb4\xbc\x36\xe2\x80\xa8\x90\x1a\x40\x4b\xfe\xe0\x85\xe4\x69\x3b\x68\x7f\xfc\xff\x6d\x14\x4c\xfd\x7f\x6e\x58\xcf\xfa\x69\xa0\x77\xa9\xa7\xc5\xfc\xb1\x5f\xc5\x78\xfe\x78\xab\x9e\x9e\xe7\x8f\x3f\xf5\x8b\x0f\xaa\x0f\x8b\x79\xfd\x37\xcd\x77\xba\xa5\x75\xdb\xaa\x5f\xea\x97\xa6\x8e\xce\x4f\x9b\xa5\x75\xd4\x6d\x53\xd4\xe5\xa7\xcd\x3a\x2f\xea\x66\x5e\xdf\x7e\xfe\x34\x7f\xfc\xe9\xb9\x53\x87\x39\x5f\x52\xb7\xcb\xdb\xcf\xcf\x9d\x1b\xff\xc6\x7f\xab\xe7\xf9\xd3\xdf\xbb\x65\x8f\x25\x65\xb5\xfa\x5b\x3d\xff\xf5\xa7\x7e\xd2\x2e\x75\xf7\xf9\x97\x87\xff\xfe\x69\x90\x2d\x47\x2d\x32\x37\xfb\x69\x83\xbf\xa9\xc5\xed\xfc\xf1\xf9\xa7\x41\x60\xbc\xfa\x20\x97\xf5\x2f\x12\x20\xff\x61\x78\x3b\xc7\xcd\xab\x0f\xcf\xf3\xfa\xef\xfa\x97\x1c\x96\xfa\xe1\xa7\xad\xd1\xaa\xea\xc3\xcd\x62\xfe\xdc\x3c\xd4\x7d\x66\x1d\x9b\xa2\xbe\x64\x47\xbe\x9f\x36\x5c\xfb\x18\xfe\x5f\xbe\xfc\xa6\xff\x36\xbf\xb9\xed\x2f\x40\xe3\x1a\xa0\x3e\x7c\xce\x47\xa4\x1b\x8f\x74\x8e\x4e\xd5\x87\xa7\xf9\xa7\x8d\x07\x9a\x43\x25\xf5\xe1\x59\xec\x69\x83\xd2\xd5\xad\x8d\x7c\x75\x7b\x58\xba\x7a\x6d\x85\xfb\x7f\xd5\x8e\xba\xbe\x3d\x5c\x54\x1f\xfe\x36\x5f\x3e\x3c\xde\x3d\xdf\x7e\x50\xb7\xb0\xae\x06\xfb\x51\x8a\xc1\x0e\x1e\x06\xc6\xb8\x7f\xf9\x97\x91\x1f\xbe\xbd\x9f\xdf\xd5\x63\xbe\xda\xa2\xe4\xe8\x2f\x7f\x9a\x8f\x1b\x6e\x8b\xcf\xff\xf2\x2f\xe7\x2d\x33\xdd\xed\xf4\xa5\x3a\xd3\xcf\xb7\x37\x8b\xcf\x0f\xf5\xc3\xaf\xbf\x4d\x51\x6b\xfa\x80\x7a\xd3\xdb\x3a\x3e\xa9\xe6\xf4\x6b\xd4\x9d\x5e\x95\x23\xbf\xfa\xaf\xd9\x97\x6e\xbd\xe8\xea\xaa\xf3\xc7\x9f\x1f\xbe\x3e\xdf\x3e\xf6\x6a\x47\x3f\xff\xf3\xe1\xf1\xef\x3f\xff\xf3\xee\xf9\x66\xb1\xe5\xfa\xed\xf3\xf3\xdd\xe7\x5f\x9f\x36\xef\xfc\x47\xfd\xf0\x4b\xbf\x66\xf4\x2f\xf5\x6d\xb7\x10\xf4\xd5\xc3\x2f\x77\xbd\xaa\xd2\xff\x3a\x7f\x7e\xbe\x7d\xfc\xad\x73\x65\xf6\xe5\x4b\x7d\x77\x33\x67\x30\x74\x4b\x52\x3f\x7c\xea\x7d\xf8\xf6\xf1\xfe\xee\xf3\xbc\xee\x5c\xfa\xe3\xdd\xd3\x97\x7a\xfe\x5b\xef\x9d\xfb\x2f\x83\x99\xfd\x7b\xfd\xf0\xe5\x4b\xf7\x99\x3f\xd5\x5f\x7f\xbd\xeb\x76\xc4\xbc\xa0\x7e\x98\x7f\xfa\x58\x3f\x7c\xfd\xd4\xb9\xfe\xd7\x2f\xdb\xae\xfe\x9b\x2c\x60\xb7\xd2\xf5\xfd\xe0\xc2\xcf\x8b\xbb\xdb\xfa\xd3\xff\xde\xb8\xb2\x71\xe1\xe3\xe2\xf6\xa6\x5b\xde\xfa\xcf\xb7\x4f\x0f\x5f\x1f\x6f\x6e\xff\xf4\xf0\xd0\x9b\xe6\xfc\x79\xfe\xb1\xfe\xfa\xd4\x9f\xd7\xd5\xed\xfd\x43\x0f\x8a\x1f\xff\xf4\xd7\x2e\x94\xbf\xde\xd5\x9f\xee\x3e\xff\xba\x1d\xcc\xdd\x85\xdc\xfc\xf4\xcf\xcf\x0f\x8f\xf3\x5f\x7b\x45\xc4\x1f\x9e\x9e\x7b\x23\x7a\x5a\xfc\xf2\x30\x7f\xfc\xd4\x5b\xe7\xaf\x4f\xdd\x57\xfe\xe7\xed\x6f\xc3\x47\xfe\x78\xbb\xbc\xbb\xe9\xd5\x12\xff\xd7\xf9\xcd\xdf\xbf\x7e\xd9\xb8\xf0\xe7\xdb\xa7\xe7\x87\xc7\x7e\x15\xf3\xc7\x4f\x7f\xbc\x7b\xea\x41\x6b\x7e\xf3\xf7\x9f\x6f\x1f\x97\xbd\xa1\xff\xd7\xdd\xdf\xee\x7a\x50\xf8\xfc\xa9\x8f\x7c\xf5\xc3\xcd\xdf\x9f\xfe\xe3\xf1\xa1\xdf\x2b\x5f\xed\xfc\x7d\x39\xff\xed\xf6\xb1\x3b\xce\xbf\x7e\xbe\xfb\xfc\xf4\x3c\xaf\xeb\x5e\x85\xf3\xe1\x95\xff\x7c\x18\x74\xff\xa7\xc5\xc3\xe7\xdb\x72\xfe\xf9\xd3\x53\x8f\x24\xfe\xfc\xb5\xbe\x7d\xfc\xd3\xed\xe7\x9b\xbb\xba\x29\x55\xae\xe6\xf0\x97\x15\xf7\xd9\x28\x1a\xff\xef\x77\x75\x16\x75\xa8\xbb\x6c\x77\x1f\xbb\xb0\x9d\x7d\xbe\xbb\x1f\x52\xd0\x5f\x18\xe6\x8f\x77\xcb\xdb\x1e\xda\x7c\xba\x9b\x7f\x5c\xcc\x3f\xff\xda\xc2\xed\xe3\xc3\xe7\xe7\xc7\x87\xfa\xf2\x6b\xf7\xd5\x3f\x3d\x7c\xea\x4d\xac\x47\x8a\xff\x39\xbf\xbf\x7d\xfa\x32\x28\x3e\xff\xf0\xa9\x37\x66\xfe\x7b\x08\xe6\x06\xaf\x66\x9f\xe6\x5f\xfa\x08\xc7\xe8\xb5\xf1\xf0\x3f\xbe\xde\x75\xc7\xf0\x71\xfe\x65\x7e\x73\xf7\xfc\xf0\xd8\x27\x98\xbb\xa7\xfe\xa5\xff\xf1\xf9\xd3\xd7\x9b\xc1\x53\xf3\x4f\xbd\x1a\xf1\x7f\x7d\xfa\xa5\xf3\xd7\xff\xfd\x38\x60\x34\x2b\x68\xf7\xf8\xca\xe7\xe7\xf9\xdd\xe7\xdb\xc7\xea\xa1\xfe\x7a\xbf\xf5\x4e\xf7\xda\xa7\x3f\x2e\x3f\xf5\x90\x7a\xd8\xc7\xec\xf9\xe1\xbe\xfb\xe7\xd3\xd3\xdd\xaf\x9f\xff\xfa\xd4\xfb\xca\x9f\x1e\x1f\x6e\x6e\x9f\x9e\xfe\xd7\xe7\x1e\xe7\xfe\xd7\xfa\xeb\xed\xf3\xc3\xc3\xf3\xe2\x7f\xfd\xed\x6f\xdb\x2e\x77\x21\xf8\xf3\x1f\xbb\x0b\x52\x5d\x6d\x10\x14\xe3\x06\x53\xd5\xd3\xb6\x1b\xdd\xf1\x7d\xba\xbf\xfb\x7c\xf7\xf4\x2c\x75\xea\xfb\x45\xfd\x7b\x24\x59\xde\xd6\x77\xff\xdd\x23\xf8\x2f\xf5\x43\x8f\x47\x31\x33\xfd\xcb\xe3\xfc\x6f\x7f\xbb\xbb\x19\x5e\xfe\x99\x85\x91\xe1\xc5\x66\x97\xe9\x91\x62\x7d\xf7\xb9\x47\xac\xfd\x3f\xff\x78\xf7\x74\xf3\xf0\xf9\xf3\xed\xcd\x73\x7f\x95\x06\x57\xfe\xfa\x79\xfe\x78\xb3\x18\x4c\x73\xe3\xca\xc7\xdb\xc7\xe7\xbb\xbf\x31\xd3\xbc\x6d\x28\xf5\xff\xbf\x9c\x3f\x5e\xdc\x0e\x8b\xff\xaf\xe5\x2c\x7d\x23\x82\xd6\x0b\xc5\xff\x37\x9e\x1f\x14\xff\x6f\xbf\xfb\xb4\xfc\x55\x3f\xcf\x7f\xd5\xbf\xde\x7e\xbe\x15\xe0\xbf\xf0\xdd\x8d\xe7\xf3\x77\xb7\xb3\x9e\xe7\xc1\x21\xf4\x43\xfd\xdb\xaf\x0f\x9f\x0f\x39\xfe\xfc\xf2\x70\xf7\xf9\xf9\xe9\x0f\x1f\xd2\x05\x06\xb0\x78\x91\x2e\x28\x5c\x60\x04\x97\x7f\x78\xf9\xe1\x2e\x10\x9b\x16\x53\x7e\x4a\x9e\xde\xe1\x0f\x74\x68\xa2\x60\xcb\xaa\xa8\x21\x29\xa0\x43\x8a\x12\x98\x58\x19\x2a\x6d\x45\x01\xa2\x2b\xfd\x52\x23\xf8\xd2\x56\x98\xc0\x97\xbe\xc2\xc8\xbf\x31\xff\x2e\x4a\x5b\xd9\x9c\x47\x52\xd2\xc4\x14\x92\x3a\x3a\x80\xb5\x97\x26\xe7\x99\xa6\x6e\x49\x09\xa9\x6a\x3a\x50\xdb\x4b\x63\x01\x7d\xcf\xe4\x22\xe7\x59\x5b\xaa\x91\x1c\x57\x2c\xc7\x2a\x53\x2c\xec\xb0\xa2\x1c\x84\x4b\x0a\x90\xab\xff\x77\xea\xd9\x20\x04\xaf\x71\x51\x0c\x2e\x29\x84\x22\x5e\x12\x89\x67\x4e\x45\xdd\x7a\x74\xf2\xfd\x6b\xee\x26\x01\xd5\x08\xc9\x4a\x0e\xb9\x4b\x8a\x52\xfc\xb3\x22\x5b\x92\xbd\xbe\x17\x03\xb2\x35\x0b\xbb\x24\xb0\x72\x69\xcc\xf4\x5e\x2a\x73\xdc\x2e\x9d\x38\xe1\x53\x00\x13\x78\x66\xae\x9d\x9a\xeb\x16\xb9\x32\xe0\xac\x2a\x9a\x49\xf8\x4a\x50\x69\xb5\x4a\xbd\xc8\x23\x85\x90\x48\x16\x17\x30\x2c\x79\xa9\x49\x96\x7d\xf5\xd7\xd2\x83\x77\xdd\xbf\x1d\x14\x61\xec\xb2\x5e\x61\xa1\x18\x4b\x3c\x24\xcb\x78\x53\x04\x45\xfe\xfa\x5e\xc2\x41\xa5\x78\x46\x45\x0e\x7c\x5c\xe4\x10\x30\xfe\x3b\x01\xb9\x0d\xc8\xfa\x0c\xc0\x7e\x5c\x5c\x57\x5c\x18\x52\xe7\x31\x55\xad\x02\x04\xa3\x8c\x03\x6b\xe7\x72\xf2\x2c\x4d\xd1\x38\x15\x89\xe9\x31\xbb\x6c\x48\xdb\x5c\xf7\xe0\x49\x4b\x9e\x6a\x43\x52\x3c\x83\xd6\x87\xb7\x89\x6f\x93\x9b\xc9\x79\xb2\x34\xed\x21\x9e\xf5\xca\x43\xe1\x6a\x9e\x63\x74\xbd\x72\xc1\x08\xbe\x5b\xca\x04\xc1\x3a\x88\xa1\x76\x52\x04\x71\xde\x8b\xc6\x6a\xaa\x1e\xa4\x5a\xfc\xbf\x94\x99\x67\x27\x8d\xdc\xb6\x26\x77\x0c\xca\x41\x4c\x8b\x62\x8e\x29\xa7\x30\x93\x8a\xfc\xf2\xff\x3e\xfb\x37\x14\xa9\x36\x80\xa8\x89\xa9\x03\xc1\x5b\x85\x6d\x5a\x39\x71\xfa\xf3\x1a\x90\xea\x00\xce\x49\x4c\x68\x67\xb8\xc6\x89\x8b\x52\xad\x0d\x24\x65\x20\xfa\x99\x95\x03\xd1\xf6\x3c\x14\x55\x07\xa8\xd7\x57\x52\x71\xcd\x80\xb7\xb5\x96\xb2\xdb\x6e\x4e\x92\xff\x4f\x70\x35\xdb\xe6\x83\x1c\xcf\x8a\x77\x45\x6e\xf2\x48\xa3\xf8\x18\x3a\x39\x75\x40\xee\x0b\x57\x29\x34\xd1\xe5\x2a\x34\x52\x95\x5d\x5e\x5f\x27\x0d\x07\xa7\x21\xd8\xda\x40\x62\x40\xfb\x5c\xae\xce\x32\x72\x9a\x26\x37\x60\xd7\xaf\x18\x12\x49\x46\xcf\xec\x50\x25\x6d\xbe\x21\x85\x54\x2d\x04\x97\xa1\xd8\x4f\xea\xa6\x99\x2e\xf9\xcb\xbd\x60\x61\x85\xb6\x26\x08\xda\x00\x6d\xa9\x8b\x75\x30\xf1\xf3\xd4\x25\x47\xaa\xcf\x0e\x0b\x32\x4a\xd3\x42\x27\x88\x43\x5e\xe0\x65\x0c\x41\x9b\x39\xf8\xb0\xf6\xe7\x67\x86\x56\xd4\xc2\x20\xb0\x83\x58\xd9\xc1\x35\x07\xcc\x51\x54\x06\xc8\xae\xeb\x87\x89\x8f\x5e\x3e\x88\x31\x0e\x8a\xd4\xb4\x0d\xce\x07\x40\xa7\xd3\xcc\x18\x39\x70\x36\x6d\xce\x6b\xb1\xca\x4a\xdd\xf0\xb9\x69\xf2\xd1\xc4\xf5\x0d\xe6\x48\xae\x36\x60\xa5\xbf\xce\x40\x0c\x48\x7c\xc1\xa5\x64\xd6\x55\x69\x0e\x5e\x3a\x6f\x0f\x47\x20\x48\x2a\x62\x1e\x89\x64\xf3\x93\x24\x90\xb9\x5d\xad\x7f\x0b\x9a\x2d\x4c\xa2\x51\x32\x26\x60\x0f\x39\xe3\xab\x6d\x8b\x87\xe5\x73\x4f\x3b\x5b\x15\x0c\x52\xed\x03\xcc\xfe\xfd\xce\x70\x89\x9c\x5b\xd2\x6e\xc9\xa3\x7e\xd4\x86\x4e\x5e\xca\xa1\x23\x13\x53\xe7\x88\x8b\x4c\x0e\x22\x37\xe0\x7c\xd3\xe6\x3b\x4e\x52\x74\xd6\x46\xf6\x12\x88\xa1\x7f\x44\xd0\x7e\x6a\xa2\xdd\x18\xa3\x84\x86\x14\x10\x88\xb1\x36\x4a\x6c\x67\x5c\x27\x98\x95\x4d\xb2\x16\xef\x89\x7c\xa8\xc3\x84\xb5\x66\x92\xa4\xc5\x85\x35\xca\x96\x2c\x6d\x73\x4b\xea\x4e\xf5\xf6\x1b\x04\x24\x96\x5c\xdc\x8c\x8a\x26\xf7\x4b\xe8\xa4\x7b\x6c\x47\x71\xea\xbc\xec\xaa\x2e\xa7\x63\x44\xa7\x19\x49\x92\x94\xdc\xb6\x9c\x0a\x31\x97\xcf\x92\x84\xc2\x1e\x92\x99\x91\x57\xb4\x8a\x9f\x13\xcf\x8e\x04\x71\xe0\xdb\xc7\xa3\xdf\x52\x88\xf2\xb0\xf1\xb9\x06\xee\x8d\x0b\x1b\xf3\x6b\xf1\x1f\xc5\x78\xa3\xc1\x4b\x36\x56\x04\x32\x10\xb4\xa4\x80\x14\x5f\x81\x95\x7f\xbb\x60\x09\x4b\x76\x1f\x2d\xf3\xd9\x04\x36\x28\xa7\x92\x72\xbc\x3e\x11\xbc\xeb\x60\x0d\x15\xe2\x4d\x2c\x6d\xbb\x97\x90\x91\xf4\xd6\x9d\xa3\x32\xe6\x9b\xb2\x4e\x92\x79\x20\xb7\x2d\xd1\x87\xa0\xa9\x66\x14\xe0\x3d\xca\xcf\x18\x47\x25\xbb\xbf\x5b\xc1\xa4\x90\xef\xbb\x3e\x98\x64\x83\x44\x49\xea\x29\xe9\xa1\x57\x29\xb8\x85\x71\xd7\x58\x40\x54\xb9\x69\xb3\x9e\x6b\xf2\xba\x95\x1f\x7a\x90\xdd\x59\x68\x64\x2b\x17\x96\x30\x84\x98\x3d\x11\x28\x81\xb3\x12\x83\xb0\x2b\xac\xe0\x80\x4a\x08\x94\x64\x56\x01\x02\xd6\xbc\x0b\x8b\x8f\x55\xce\x85\xed\x56\xf4\x6c\x83\x26\x40\x01\xbb\xb0\x7e\xd7\x49\x6f\x2c\x19\xbd\x6e\xb4\xd0\xb8\xce\x07\xc4\x42\x0a\x50\x84\xda\x88\xb4\x28\x09\x02\x83\x6c\xa1\xd2\x16\x8d\x4f\x97\xe7\x1d\x92\x66\xb9\x38\x46\xbb\xa1\x49\xfe\xe8\x76\x44\xa7\x6c\x5d\x66\x55\xad\x3a\x30\x36\x99\x38\x93\x94\xa3\xd2\xb4\x4b\xcc\x1d\x79\xa0\x70\x89\xe2\x40\x10\x21\xcd\xc8\x8a\xa7\xa4\xed\x78\xed\x8a\x3f\x0b\x01\xd2\x7c\x63\xa8\x1a\xac\x6f\xc1\x36\x1b\x80\x4d\xad\xbb\x3e\x65\x1e\x2d\xd1\x0b\x45\xb1\xa4\xc4\x5b\x16\xcf\x85\xa2\xca\x6d\xd3\x1b\x4f\x26\xf1\x0e\xb1\xb9\x7c\x59\xdc\xe5\x81\xe6\xe5\x1d\xcc\x42\x89\xf7\xa8\x65\x86\x91\xdb\x96\x4a\x3c\x53\xaa\x88\x67\x2c\x30\xa1\x6c\xfe\x5e\x0a\xf5\xf9\x75\xf6\x6d\x67\xc4\x2f\x4c\x6d\x76\xcb\x0b\xbc\xbf\xd7\x19\x4a\x6c\x2f\x76\x22\x7c\x73\x96\x1f\xf4\xb5\x01\xcf\x43\x98\xa3\x11\x2f\x18\xb3\x72\x83\xd1\xb9\xda\x85\xe4\x0f\xe8\x66\xc9\x6f\x7a\x2c\x52\x0d\x28\xfa\x80\x10\x69\x4b\xa3\x2c\x8f\x15\x1e\xac\x78\xb4\x52\x6e\x72\x8f\x49\xb3\x82\x96\x44\xe0\x63\xd9\x7f\x0b\xe5\x0e\x2a\x63\x64\x5b\xe2\x04\xbb\xba\x29\x24\x4e\xb9\x24\xdf\x67\x35\x85\xa2\xd2\x60\x65\x8a\xd2\xb1\x6e\xc4\x38\x34\x38\xe8\x97\x92\x37\x9d\xc8\x72\x85\xc5\x20\xa8\x5a\x5c\x42\x4a\xe9\xa1\x57\xd2\x5c\xf2\x92\x16\xdd\x4b\x79\x10\x13\x89\x04\x58\x40\xf6\xbb\x09\x75\x50\x1e\x62\xcf\x45\x06\x2c\x0b\x83\xba\x7f\x59\x5c\xc3\x11\xac\xb9\xc4\xa4\x88\xc0\xbb\xaa\xe7\xb6\xa1\x8a\x4a\xae\xd6\xda\x49\x02\x63\x1a\xe4\x4d\x10\x67\xd9\x43\x46\x7f\x48\xad\xca\xd7\x9b\x4d\x2f\x37\xa6\x88\xa7\x67\xc4\x07\xe2\x6d\x75\x23\x87\x43\xd3\xef\xc8\xdd\xeb\x90\x64\x15\x87\x57\x54\x9c\xaa\x90\xef\xf7\x80\x9e\x07\x14\xe8\x35\xd8\x94\xba\x3d\x1b\x6a\x6c\x2d\xe5\x77\x72\xa1\xde\x37\x53\xca\xaf\xc7\xda\xd7\x47\x47\x53\xa8\x6c\xd9\xd9\xca\xf7\x53\xc3\xb5\x69\x27\x22\xcf\xd2\xa6\xda\x81\x51\x0e\xa8\xe7\x2d\x65\x21\x88\x83\x1d\xa3\x14\x45\xc1\x29\xb5\xfa\x35\x48\x1a\xc3\x0d\x5d\x62\x76\x93\x8c\x2b\x24\x34\xc3\xdc\x32\xfc\x58\x2e\x8b\xc0\x1f\xb9\xcc\x15\x77\x1d\x98\x7e\x15\xde\x76\xc0\x13\x6d\x06\xdf\xeb\xfe\x76\xc8\x0e\xf1\x3b\x59\xe5\x03\x8a\x26\xff\x38\xfb\xd5\xf6\xfc\xbf\xdf\x74\xbf\x9a\x14\xbd\x58\x87\xd0\x56\x0a\x72\x4a\x08\xe8\xa0\xa4\xbc\x86\x28\x69\xaa\x5f\x17\xcf\xde\x77\xbf\x57\xda\xfd\x1a\x4f\x8a\x89\xac\x95\x05\x74\xf3\x20\x6a\xb0\x46\x03\xd6\x1a\x9d\x0e\xdd\x22\x72\xd9\x5e\x10\xb1\xde\xbc\x21\xf5\x9e\x6a\x64\x1a\xef\xbf\xd0\x14\x5b\x6e\xee\xf4\x6b\x5e\x49\xbf\xd7\x57\xae\xc9\xfe\x88\xbe\x46\x09\x7e\xf2\x92\x1a\xd7\x6b\x7f\x29\x4a\x3f\x4e\xa6\xef\x48\x9c\x0c\xfa\x8d\xa9\x5e\x92\xd4\x69\x69\x07\x8e\x79\x42\x32\xd7\xcb\x6c\xac\x2d\x7c\x8d\x16\x5c\x16\x38\x67\xeb\xc7\x8c\xd8\xa2\xc5\x4d\x7c\xeb\x0c\xb9\xbb\xc9\x6c\xa4\xca\x50\xf7\x40\x6d\xdf\x42\x75\x87\x6f\x8a\xce\xd8\xfb\x53\x54\xcd\x33\x3c\x09\xb3\x59\x91\xac\x18\x67\x67\x7c\xe1\x44\xe2\xb5\x11\xec\x74\xcb\xdb\x5b\x46\x9c\xfd\x36\xb5\x57\x44\x9a\x1e\xbf\xca\x9e\x60\xdb\xd8\x55\x13\x93\x60\x49\x25\x28\x18\x1c\xa6\xe7\xf4\x2f\x11\xcd\x7c\x55\x75\xe3\x8d\x2d\x6f\x0d\xd4\x35\x8c\x4b\x55\x5f\xac\xf9\xb9\x5e\x72\x67\x7e\x9b\x3f\xd9\xf5\xb2\x27\x45\x81\xe5\xce\x9e\xe3\x7d\x33\x80\xeb\x2b\xa9\x33\x98\xcf\x0e\xf2\xf9\x5c\xcc\x65\x66\xa5\x00\x12\x16\xd7\x57\x12\xac\xe6\x7c\x2d\xe6\xfb\x22\x2e\xd1\x42\xbc\xf4\x12\x38\xe1\xaf\xaf\x50\xce\x1c\xad\xad\xd0\x83\xb7\x35\xa2\x5e\x3d\x34\x59\x2e\x0b\x39\xcb\x72\xa6\x92\x2e\x2f\x07\x3d\x32\x4a\x6a\x04\x4c\x73\x89\x70\x30\xeb\x6c\x5e\x04\x28\x51\x09\x59\x3a\xed\xcc\x49\xe5\x39\xd7\x46\xd2\xbb\x33\x28\xe4\x50\xde\xca\x22\x93\xea\x57\x12\x3d\xe3\x92\xf0\xa4\xae\xaf\x30\xe4\xf9\xa8\x06\xa6\x55\x0f\xdc\x3b\xb3\x54\x8e\x94\xd4\xf6\xa4\x16\xf0\x12\x7d\x01\xe4\x59\x98\x0a\x8c\x0f\x09\xe7\xc3\x6d\x39\x87\x4c\x26\xe2\x9d\x3d\x6c\xbb\xab\xf9\xae\x6c\xec\x72\xc7\x6f\xdd\xd8\x73\x3f\xc7\xcc\x65\x57\x89\xfd\x17\x13\x3e\x6e\xc7\x96\x08\x45\xd4\x06\x82\x99\x07\x66\x65\xa1\x3d\x30\x40\x4d\x8c\x2a\x61\x17\xaa\x58\xa6\x0e\x02\x34\xb3\x00\x92\x8a\x00\x57\x69\xde\x08\x9c\xf2\xab\xfa\x90\xa8\xa4\x14\xd8\xb7\x46\x25\x03\x24\x65\x26\x79\x4a\x66\x55\x30\xaf\x4d\x49\x79\x24\x8a\x1d\x97\x93\x7f\xca\x4c\xa8\x3b\x13\x41\xf7\xfb\xdc\x5d\xba\xe7\x6d\x31\xda\x2d\x98\xb5\x62\xbc\xd7\x8c\xb8\xb2\x3a\x6a\x3b\x4f\x9d\x2a\xbd\xba\x03\x13\x97\x88\x9b\x7c\x34\xe4\xc2\xaf\xcc\x47\xa3\x32\xeb\xdc\x4e\x94\x2b\x80\xa3\xdf\xc9\x47\x9b\x70\x60\x66\xa2\xee\xdb\x33\x51\xb3\x2b\xc3\x69\x9f\x71\xf4\x53\x9c\x8e\x64\x90\x2e\xd7\xdb\x6d\x15\x1f\x66\x80\xc2\xcb\x42\x9f\x3d\xe2\x5a\xf1\xe9\xdd\xde\x54\x7c\x68\xb7\xe2\xb3\x2b\x1b\xfb\xce\x69\xbc\xf3\xc6\xd3\x79\xe3\x59\x13\xe0\x4f\x98\x1c\x77\x98\x41\xa6\x1b\x81\xb0\x53\xce\x34\xe0\x4c\xe3\x21\x42\x1e\xbc\x88\x51\xa1\xf2\x60\xfb\x11\xb0\x8a\x05\x91\x5a\x07\x70\xda\x80\x75\x9b\x8b\x12\xa4\x14\x7f\xff\x8e\x2c\xc3\x32\x01\xda\x4b\x92\x74\x52\xdc\xcd\xb6\x07\x42\xec\x46\xd5\xb7\xeb\xb7\xf9\xc9\x66\x0d\x43\xc6\x42\xf2\xac\x26\x88\xff\xd5\xe6\x3a\x6f\x8e\x94\x3f\xab\x21\xe1\xa2\x10\x0f\xdd\x5e\x0c\xfb\x1a\x0a\xd7\xf7\x9a\x20\x32\xbd\x5e\x92\xe4\x11\xcb\x0e\x52\xe2\x37\xe5\x43\xed\xb2\xb3\x9f\xe1\x1d\x33\x02\x2a\x0b\x45\x94\x8b\x8a\x2f\x5e\xca\x35\x29\xdf\xc1\xc8\xd7\xd6\xaf\x96\x33\x62\x83\xdd\xe7\xf8\x22\x49\xf9\xf5\x94\xbf\x7c\x7d\xef\xc1\xe5\x42\xa0\x5a\x0a\xa9\x73\xab\x4d\x45\x08\x64\x2e\xf3\x69\x3f\xd9\x9e\x85\x4a\x91\xad\x3d\x83\x82\x20\x4a\xec\x7d\xb3\x7a\x8b\xa2\x8a\x72\x43\x11\xc4\x21\x60\x2e\xc9\x82\x57\x71\x19\xc0\xc5\x45\x51\xe7\xbe\xae\xaf\x0c\x35\xce\x38\xac\x39\xae\xfa\xc7\x66\x00\xc4\xb0\xc0\xd4\x1f\x00\xf9\xde\x00\x0e\x96\xe4\x5f\x42\xc2\x85\xa6\x65\x51\xf7\x80\xb1\x7b\x5a\x35\x90\xd5\x80\x38\x17\xaf\x4d\x69\x1a\x76\x42\x49\x83\x77\x35\xe6\x3a\xc2\x46\xf6\xaa\xa8\xf0\xb2\x59\x20\x5e\x14\x59\x50\x46\xb5\x90\x53\xf7\xf3\x26\x95\x0b\x2c\x8b\x7d\xed\x50\x64\xe7\x31\x27\x71\x69\xd8\x8e\xeb\xdf\x0c\xd3\xf7\xe2\xf9\x78\xc4\xcc\xa5\xf7\xd3\x61\x08\x29\x2e\x4c\xfe\xfa\x1e\x9d\xe6\xb7\x65\x1b\x68\xfa\xd8\x42\x57\xbd\x4e\x0e\xc0\xba\xdc\xcb\xee\x9a\x0a\x07\x68\x40\x5b\x36\x75\xdb\xd1\x7a\x36\xf6\xed\xbe\x3d\x73\xdb\xae\xaf\x33\x17\x19\x67\xcf\x9c\x56\xed\x79\x91\xc1\x23\x41\x98\x4b\xbd\xf0\xb0\x72\xae\x96\x3d\xdc\xe1\xd2\x82\x49\x63\xe9\xee\xb2\x49\xc2\x39\x97\x6c\xc3\x61\x9d\xf6\x4f\xdc\xae\x6a\x6d\x99\xa8\x68\x93\xd8\x2c\xab\x1a\xf4\x54\x68\xf1\x14\xd6\xbc\xcf\x87\x9c\x55\xc2\xb9\x15\xe5\x36\x5f\x30\xbd\x2c\x02\xef\x24\xf8\x7d\x91\xe0\x68\x0d\xb1\x2f\x1d\x41\xd1\xa4\x2e\xf2\xf2\x6b\x72\xdd\xf0\x5d\x04\xda\x83\x97\x7b\x25\x9f\x35\x1a\x5d\xdf\x6b\xd4\x1e\xac\x95\x46\x99\x0a\x8b\xbe\x6f\x2e\x18\xa7\x25\x1e\x68\x2d\x73\x9c\x5d\x6e\x5a\x14\x15\x59\x40\x5c\x14\xbb\x85\xa5\x7b\x74\xe2\x89\x67\xbd\x32\xf9\xe9\xd1\x72\xcd\x7e\x95\xfa\x25\xac\x5a\x16\x2b\xa9\xc6\x9a\x35\xc0\xc4\xc9\xba\xe5\x9d\x2b\xb0\xd5\x80\x96\xf9\xe3\xcc\x40\xae\x4b\xd6\x7a\xf6\x23\xab\x56\x35\x4a\xcd\x1b\x20\xd2\x04\x68\xb7\x4b\x34\x92\x81\xcb\xb5\x22\x8d\xb6\xe2\xbb\xfc\x63\x32\xd3\x7b\x4d\x51\x41\x42\xd5\x22\xaa\x57\x1b\x78\xd3\x60\x95\x41\x88\xed\xb2\x67\x9b\x64\x11\xf7\x72\xd0\x04\x49\x23\x49\x62\xc7\x4d\x2a\x58\x31\xd3\x4c\x37\xb6\xfb\x79\x88\x09\x62\xda\xc3\x37\x4f\x35\x4b\xf4\xa5\x96\x34\x4a\x6a\x09\x8d\xd4\x12\x68\xaf\xd4\x82\xbb\x85\x96\xb4\x55\x68\x39\xc5\x16\x31\x46\x60\x91\x02\xad\x9e\x51\xc7\xfb\x8e\xc4\x62\x03\x4b\x2c\x76\x1c\x4d\x35\xf2\x8a\x99\x4b\x8e\xd1\x4e\xa2\x51\x49\xff\x29\xf2\x0a\x6d\x97\x57\x4c\x54\x54\xf9\xed\x52\xca\x8f\xae\x2b\xfc\x50\xb4\x35\xd2\x70\xd3\xab\xd1\x90\x20\xc5\xf3\xdb\x6b\x72\x0a\x89\x29\x3c\xb3\x25\x75\x7c\x04\xe3\xb2\x51\xbb\xef\x92\x05\x31\x88\x19\x8d\xf1\x98\x6c\x0f\xef\x02\xa4\x8a\x09\xbc\x1b\x7a\x0c\x1e\x12\x89\x31\x0d\x7a\x29\x03\xf3\x67\xe4\xcc\x94\x7a\x99\xe0\x72\xb1\xf4\x04\xd4\x4b\x4d\xbb\x1a\x92\x1c\x08\x5a\x40\xa7\x18\xac\x46\x72\x8e\x33\xcb\x92\xb4\xe1\xd6\x5e\xa2\x05\x42\x26\x3f\x2f\xa7\x12\x39\x46\x51\xd2\x48\x5b\x16\x05\x12\x2f\xb0\xbb\x24\x49\x91\x49\x90\xf0\xfa\xca\xa9\x8c\x40\x98\x9d\xf1\x2b\x83\x60\xfd\xa5\xd4\xa3\x27\x31\xaa\xf3\x05\x57\xb1\x30\xe1\xeb\x0c\x8f\xb4\x44\x0b\x27\x85\x68\xfc\x2e\x41\x7d\x9f\xb3\x0b\xef\x04\x65\x0f\x9f\xa7\x8a\x1e\x5c\x85\x8c\xcd\x29\xe6\xd3\x90\x16\x8a\x06\x41\xb2\x47\x6e\x8b\xc4\x9a\x93\x17\x2e\xe2\x3b\x69\x1f\x23\xc4\xa4\x25\x83\xe2\x5a\x32\x9c\x28\x7c\x8c\x36\xc2\xf6\x24\x9c\x4e\x42\xfd\x57\x19\x8e\xf7\x04\x7a\x89\x5b\xb7\x6b\xda\xe2\x95\x63\xf5\xfa\x31\x88\x01\xd2\x7c\x23\xc6\x4c\x47\x45\x32\xbc\xee\xd8\x72\x84\x59\x76\x06\x68\xda\x46\x62\x35\xe0\x49\xf7\x57\x8a\x24\x50\xd8\xe6\x18\x4b\x6a\xda\xde\x54\x02\xa4\x89\xa2\x0e\xcf\x1f\x80\xfa\x46\x22\xe2\xd6\x61\x5b\x73\x0a\xcc\x36\x72\x9b\x97\x8c\x7b\x0a\xb2\x52\xc7\xc6\x58\xf5\x83\xcb\x98\xbf\xfa\xec\xd0\xf9\xcd\x23\xcb\xda\xa4\x15\x39\x3c\x52\x12\x0f\x6c\x04\x56\x6a\x42\xd8\x3e\xdf\x97\x83\xbb\x64\x27\xc9\x4d\xbb\xf6\x4c\xa8\x87\x4e\xb6\x33\xbe\x09\xe2\xe8\x28\x17\x45\xe1\xde\x99\x22\x6d\x76\x19\x6e\xa7\x85\x26\x07\x89\x1e\x1d\x57\x16\x9a\xb6\x99\x70\x91\xf3\x19\x6f\x7b\x43\x83\x75\x35\xf0\x94\xfd\x66\x08\xe4\x7a\x90\x5b\x36\x85\x4e\x2e\xad\xc1\xd6\xf0\x78\x7b\xf3\x7c\x9a\x19\x57\xaa\x2a\x7e\xb8\xf8\xed\x0f\x1f\x30\x7c\xb8\xf8\xe7\xdd\xa7\xe7\xc5\x1f\x3e\xa0\xfd\x70\xb1\xb8\xbd\xfb\x75\xf1\xfc\x87\x0f\x5b\x2a\x65\x1d\xd7\x2b\xf5\x7b\xf5\xd2\x29\xb9\x55\xa7\x74\x86\x3e\xcd\xd6\x99\x76\x3a\x7d\x61\xa6\xc7\xb9\xfd\xda\xa1\x4b\x77\xde\x94\x70\x36\xf0\xbe\x56\x98\x14\xcb\xe3\x97\x98\x64\x07\x2e\xb1\x58\x4e\xe7\x3a\xed\x86\xae\xd3\xe2\x7b\xc0\x64\x55\x1a\xaa\x08\xcb\x5c\x9c\xa8\x00\x17\x67\x03\x1f\x2f\xb1\x96\xb0\x54\x30\x97\xdc\x08\xeb\x04\x09\x1a\xc8\x6b\x70\xbe\xb4\x55\xe0\x57\x03\xd6\x08\xe8\x36\xca\x08\x87\x8a\xd2\x8b\xf5\x5e\xc5\xc5\xe0\xca\x2a\x4a\x15\x99\xd2\xd0\xf2\x20\x1f\xd7\xbd\x73\xf7\x6f\xcf\xf1\x7a\x2c\x36\x8f\xb2\xfd\xae\xe8\x27\x9d\x4e\x3e\xa3\xa2\x3c\x56\x1d\x76\xb8\xc4\x19\x7a\x34\xbd\x1e\xa7\x64\x4c\x23\xca\x42\x4f\xcc\x96\x76\xf7\xe8\xb6\xcd\x72\x12\xa6\xb4\xbb\x4f\x3f\x0c\x73\x55\x92\x0e\x69\xa9\xc1\xe1\x66\x11\x67\xa9\x3a\xc4\xfc\x68\xaa\x80\xa1\x30\x08\x18\xca\x6e\x22\xf3\x00\x36\x28\x69\x1a\xdb\x14\xf8\xa8\xc1\x65\xf6\x42\xe0\xe4\xbc\x8d\x54\x58\xe5\x5d\xd0\xe2\xea\xa2\x06\x57\xb3\x03\xcc\x31\x3c\x68\x7f\xcd\x69\xab\xd0\x09\x63\x2a\xed\x8b\x8c\xea\xc8\x80\xa3\x78\x42\xc0\xd1\x4e\xe4\xdb\xa1\x18\x4e\xc7\x35\x76\x68\x73\x6b\x6c\x4e\x27\x93\xec\x0e\x1d\x6b\x42\x46\xb4\x43\xf7\x39\x86\xf1\x1c\x93\x35\xc5\x90\x72\x47\xa0\x6c\xe8\x97\x97\x17\x2c\x0d\x2d\x92\xde\x17\x2a\x8e\x45\xd8\x83\xe0\xe2\x27\x65\x8e\x5b\x39\xc4\x54\xcc\xf0\x90\xe3\x80\x5c\x0b\xee\xe5\xda\xf4\x64\x4b\xba\xbe\x8f\xda\x30\xcb\xa4\x32\xfb\xef\x53\x28\xe3\x92\xca\x03\x02\x2c\x46\x19\xfa\x1b\x06\x9d\x45\x43\xb5\x16\x0d\x3b\x12\x57\x30\xda\x0c\x2b\xec\x2f\x7d\x89\x11\x5c\xd8\x26\xcb\xf1\x97\xae\xaf\xa2\x4a\xa5\xaf\x42\x79\x80\x0e\xb9\x67\xc0\x66\xb7\x78\x29\xd2\x13\x8f\x23\x49\x12\xad\xd5\x38\xc0\x38\x85\xb6\xa4\x65\x2c\x8d\x6d\xe5\xbf\xa8\x90\x87\x85\x3c\xae\x7b\xf4\xaa\xe0\xa9\x62\x38\x28\x89\xe1\x9e\x61\xda\x37\x2e\x09\xee\x9c\xd1\x08\x93\x7b\xc6\x5e\xb4\x0d\x3c\xed\xf5\xbd\x57\xee\x74\x58\xbe\x68\x91\x7f\x05\xba\xd9\x35\x26\x33\x18\xd3\x4a\x70\x79\x51\x80\xb0\x29\x37\x8d\x00\x41\x71\x43\x89\x61\x92\x22\x97\xe5\xa3\xbe\xb8\xd1\x74\xb3\x9f\xa4\x76\x5a\xb7\x76\xcf\xc6\x4e\x1a\x7d\xbc\xdf\x08\x4f\x8a\x28\xa3\x4d\x5e\x22\xd7\x5d\x22\x3c\x78\x89\xf6\x58\xd7\x94\xdd\x02\x58\x63\x2b\xdf\xdf\xc9\x6c\x17\x9c\x92\xf2\xb4\x59\xc6\x93\xac\x40\x66\x52\x64\x1d\x94\x32\x6a\xb2\x9e\x9f\xc3\x28\xd3\x6c\xb5\xc5\x7a\xab\xfd\x06\x36\x19\x6a\x7a\xb5\xab\x5e\xcf\x61\x1e\xd9\xd8\x39\x84\xfd\x16\xb1\x96\xc4\x2b\x0e\x7c\x2c\x4d\x01\x8e\x37\x3a\x9b\x94\xaf\x28\x49\x0d\x56\xb0\xf6\x32\x30\x93\x4d\x0b\x24\x70\xad\xe1\x81\x2f\x75\x10\xc9\x31\x65\x46\xb0\xe1\x92\xf2\x57\x7b\x49\x28\x80\xec\x08\x11\x8b\x10\x4c\xd7\xbb\xa5\x1d\xe0\x64\xe6\x89\xb7\xbe\x29\x4d\x66\x9e\x98\x04\x7f\xc7\x1a\x28\x26\xc4\xde\x51\x16\x8a\x2e\xee\x32\x03\x43\x49\x7c\x37\xd8\x59\x34\x29\xa0\x54\xf3\xf6\x91\xec\x26\x2a\x97\xb2\x95\xcc\x07\x89\x2d\xb4\x94\x2f\x7f\x65\xd4\x3e\x52\xa1\x9d\x76\x0f\x1b\x71\xd2\xb9\x5a\x81\x02\xa2\x67\xf8\x98\xee\x66\x23\xc9\x89\xc3\x37\x05\x65\xa3\x78\xf5\x56\x39\x42\x32\x97\x52\x40\x1d\x2c\x7f\xfc\x54\x7d\x8c\xa6\x25\xb2\xdd\xca\xf6\xe9\x44\x75\xb8\x3e\x46\xb4\x0c\x2f\x42\x9f\xae\xef\x29\x2a\x57\x92\xaf\xc8\x2d\xa6\x51\x16\x36\xb2\x8d\x48\x55\xd4\xbe\x4e\xd3\x8d\xe1\x5b\x19\xf0\x45\x31\xdb\x8b\x66\x92\x1a\xa5\x10\x17\xb2\x03\x5c\x28\x46\xe9\x5f\x6f\x73\x0f\x39\x5d\xb1\x39\x37\x1a\x8c\x1c\x48\xcb\xd9\x67\x03\x63\xa5\x84\xe1\x85\x53\x16\xfd\x08\x0d\x01\xbf\xa1\x86\x70\x24\x43\x3d\x0e\xd3\x77\xe7\xab\x3d\x01\x0f\xfa\xae\x62\xbd\xe2\x45\x67\x94\xd9\xe9\x55\x64\x76\xff\x4d\x65\x76\x56\x7f\xa5\xe4\x78\x50\xbe\xea\x64\x2e\xe1\xe5\x29\x2a\xcf\xa2\x7b\x50\x28\x3e\x01\x1a\x21\xa4\xcb\x5c\x81\x41\x3c\x5c\x3c\xaa\x08\x5d\xe7\xab\xe6\x63\x67\x10\xaf\xdb\xa4\x51\x6b\x36\x9e\xc0\xfa\x1b\x54\x94\x0b\xb3\x1b\x54\x5e\xb2\xdb\x83\xb3\xe2\x02\x5a\x99\x82\x25\x34\x02\x1b\x3f\x5a\xc9\xb8\x8b\xd9\xe9\xb5\x70\x0a\x6d\xfb\x6f\x89\xae\x42\x91\xcf\xc2\x1c\x05\x0c\xab\xc2\xeb\x1a\x41\x2a\x38\xd3\x47\x92\x60\x00\xe6\x12\x98\xff\x31\xa6\x1a\xa1\x84\xf2\x73\x1f\x59\x96\x20\x40\x12\xa1\x42\x2a\xe1\x37\x13\x38\xc3\xe9\xf0\xdb\xdc\x3e\xa6\x53\x41\xa6\x20\xc7\x43\x55\x90\x09\x88\x71\xb4\x0a\xf2\x12\x29\x5a\x65\x20\xf5\xbc\x97\x03\xb2\x4a\x22\x3e\x7e\xf3\xc1\xd9\x97\x46\x20\xa7\x0d\x38\x9a\x9e\x62\x47\x1d\xc1\xb6\x1b\x4f\x10\x37\x1d\x37\xf4\x1d\xd7\x10\x99\x06\x37\x8e\xec\xc4\x4e\x27\x55\xa3\x71\x49\x8b\x00\xc9\x7d\x34\x52\x15\x27\x89\xff\x73\xa0\x86\x90\x8d\x50\xa2\x7d\x63\x74\xde\x92\xf9\x7a\xde\xd3\xe9\x63\xee\x35\x0e\x18\x27\x20\xba\xdd\x5a\xcf\x64\x44\xb6\xcf\x8d\x73\x14\x51\x75\x3d\x33\x25\xda\x21\x82\x9b\x9a\x6e\xf6\x78\x68\x32\xbe\x48\xd1\x0d\x13\x66\x28\xa5\x78\xd6\x95\x78\x44\xe3\xfc\x11\x08\xa2\x99\xe0\x24\x3a\xd3\x16\x55\xd3\x2e\xfd\xcb\x76\xe1\x8e\x6c\x19\xce\xa4\x6a\xf6\x11\x2e\x7e\x3b\x81\xea\xe0\x73\x3e\xdc\xd4\x89\x49\x99\xb6\x80\x3d\x2a\x12\x7f\x77\x94\x59\x18\x65\xb2\x9e\xac\xbd\x2a\x46\x60\x0e\x2b\x1c\x98\xc4\x67\x16\x48\xa4\x0f\x2b\xc5\x06\x82\x1c\x56\x18\x48\xe6\x63\x2e\x00\x24\xae\x92\xca\x48\x2d\x21\x2a\xa4\x5c\xcf\x61\x32\xd2\xfb\xb9\xe1\xb9\x51\x7f\xe4\x31\xe2\x4b\x88\xff\xda\xe2\xcb\x61\x07\x90\x27\x8a\x2e\xfe\x5c\x14\x13\x9a\x3b\xc6\x00\xe6\x7a\x56\x47\x48\x1b\x6f\xeb\xf4\xf2\xac\xe8\xbb\xfb\x38\x73\xe4\x9e\xfb\x4d\x56\xd2\xca\x0b\xe9\xb8\x7d\x72\x77\xb6\xcf\x51\x14\x79\x9a\xec\xb3\xc5\x32\xf3\x6e\x92\x39\xd1\x24\x13\x19\x1b\xa2\xad\x2d\xd8\xa0\x2d\x58\xbb\xd0\x4d\xca\xef\x7e\xfe\x4e\x0d\x5e\xd2\xd4\xa1\x5f\xd5\xb5\xc0\xa6\xae\x05\xfa\x5a\x5b\xdd\x67\xb8\xeb\xfc\xdf\xdf\x91\x81\x26\x81\x6b\xa5\x8f\x5c\xb9\xd2\xea\x77\x7b\xcd\xbb\xbd\xe6\x4d\xd8\x6b\x5a\x3a\xf5\x60\xa2\xf6\x60\x7a\xac\x94\xf7\x0f\x28\xe2\x37\xa0\xcf\x09\xcd\x31\x6a\x28\x86\x19\x49\x1d\x10\x55\x87\x02\x89\xb7\x4a\xb3\x60\x42\x9e\x44\x13\x7d\x1d\x0a\xff\x3d\x59\x6a\xf2\x47\xcf\x6d\x70\xa1\x0f\xfd\xb7\xf9\xff\xc6\x0b\x5a\x52\x66\xa6\x87\x05\x8a\x7e\x20\x1c\x3b\x44\xa8\x1b\x13\x9b\xfc\xaa\x9c\xe7\x50\xeb\x0c\x7a\xde\x45\x09\xa5\x8c\xb4\x94\xf0\xb3\x90\x70\xb6\x5a\x0f\x95\x24\x08\xf3\x34\xc1\x1a\x03\x98\x03\x2a\x26\x1f\x60\xd1\x39\x48\x45\xb1\xa2\xa2\xf8\x89\x8c\x4b\x9b\xa2\x21\x78\xbf\x52\x23\x6e\x34\xa0\xd3\xe0\x50\x83\x77\x0c\x27\x49\xf2\xe8\xb4\x07\xf1\x77\x95\xfa\x31\x31\x29\x07\x71\x1a\xd7\xf6\xcd\x70\xc8\x9d\x82\x6a\x2e\xd7\xfd\x6d\x04\xd5\x97\x86\xfd\xd6\x25\xae\x53\x2d\x40\x6f\x83\x1b\x8c\xb5\x12\xbd\x49\x5e\x30\xd6\x2b\xfd\xec\x9c\xe0\x45\x93\xcc\x2e\x3e\x10\xb4\xe4\x43\x09\x89\x59\x80\x36\x50\x78\x1d\x79\x4b\x3d\x5e\xce\x8b\x9e\x41\x2b\x19\x71\x4d\x64\xe5\x6d\x22\xeb\xd2\x29\xd2\xd1\xa1\xd6\xa5\xb7\x40\x1a\x3b\x2d\x50\x98\xf8\x63\x94\x2b\x4c\x40\xb0\x10\xec\x8e\xf5\xe4\xf5\x29\x92\x8e\xe0\xcd\x01\x22\x54\xe0\x05\x3c\xc4\x38\xba\xdb\x90\xf4\x06\x89\x76\x77\x9e\x88\x13\x88\xb4\x67\xcd\xfa\xe3\xed\xf2\xee\xe6\x76\x92\xaa\x5a\xe2\x7a\x56\x92\x5d\x0f\x42\x93\xa2\x0d\x79\x72\x11\x37\x42\xeb\xfb\xa1\x15\x68\xae\xef\x0b\x45\x15\xf9\x92\x6c\x85\x4e\xc2\x2b\x4c\x51\x51\x00\xbf\x60\x61\x78\xa2\x4c\x3e\xc4\xbb\x5e\x69\x2b\x5f\x52\x5c\xba\x05\x55\xbe\x3b\xf2\xcd\x00\x9b\x8a\x68\x00\x70\x3a\x79\x28\x66\x3d\x14\x5f\xa6\x41\x09\xca\x91\x9f\x7f\x29\x7d\xd5\xc4\xab\x12\x9b\x55\x99\xc0\x59\x2e\x6e\x06\xdb\x6c\x00\x79\x11\x97\x54\x26\x30\x52\x33\x81\xc5\x8d\xe6\x56\x54\x24\xa5\x68\x3a\x97\x98\xfe\x14\x96\x98\x20\xd1\x52\x83\x09\x25\x15\xd5\x60\x89\x7b\xce\x81\x6a\x1b\x45\xfc\xcf\xdb\xdf\x7e\x79\x98\x3f\x7e\x9a\x88\x24\x62\x39\x04\x3d\xbd\x48\xb7\xfd\xfa\xa0\xa4\xa2\xa4\xee\x8d\xa5\xad\xb0\x28\xcd\x36\x66\x77\x84\x63\x42\xc8\x51\xc3\xe6\x1c\xe1\xb1\xd9\x1b\x1b\xf1\x8c\x5d\x34\xb1\xcf\xee\x8c\x5d\xb8\xdc\x45\x3a\x63\x17\x39\x52\x99\xcc\x19\xbb\xc8\xa1\xca\x74\xce\xe5\x8e\x5d\x84\x3a\x4b\xa4\x7b\xea\x21\xd4\x59\xba\xc0\xa2\x87\x51\xe7\xe9\x03\x7b\x28\x75\x9e\x3e\xa8\x87\x53\xe7\xe9\xc3\xf4\x90\xea\x3c\x7d\xd8\x6e\x1f\x1d\xcb\x1f\xcb\x85\x13\x76\xe3\x3a\xc8\xdb\xb5\x2f\x4e\xd8\x85\x6f\xb0\x17\xd0\x6c\x4c\xc6\x40\x70\xc7\xc4\xa8\xec\xdb\xf0\xa7\xd9\x73\xae\x24\xaf\xd2\x82\x96\x54\x62\xe2\x1d\xc8\xae\x7e\x6b\xab\x9b\x3f\x5c\xe7\x86\xeb\xde\xc0\xeb\xab\xa4\xc8\x96\x81\x77\x60\x7e\x5d\xbb\x32\x54\x18\xf2\x6f\xbe\x8e\x86\x7f\xf3\x16\xdf\xbc\x70\x8f\x06\x62\x54\xa1\x14\x48\xf1\x7b\x92\x69\xec\xfa\x8a\x9c\xc2\x54\x92\xa9\x30\x2c\x28\xbf\xce\x7f\x18\xfe\xc3\xb0\x96\x90\x4a\xe2\x7e\x16\x8c\x1a\xd7\x57\x94\xe4\xf1\xd0\x7d\x3c\xe4\xc7\x37\xb7\xfb\xab\x87\xaf\x4f\x93\xa4\x64\xc5\xa8\x8c\x9d\x61\xa1\xb0\x91\x46\x58\x44\xb1\x15\xd2\xbc\x7b\x8d\x0a\x55\x54\xd4\x7f\x4e\xde\x94\x34\xa6\x76\x55\x26\xa9\xd0\x51\xc5\x8a\x3a\x17\x14\xe6\x93\xf9\x59\xe7\xca\x4a\x82\x79\x01\x63\x5e\x16\x86\x59\x89\xec\x96\x2b\x45\x8d\x15\x16\x9d\x42\x99\xa4\x8a\xa5\xed\x17\xbe\x3c\x4d\x08\xec\x94\x4a\xed\x40\x83\x05\x3b\x64\xcd\x65\xde\xbd\x26\x50\xc3\xfe\x73\xfc\xe2\xf5\x3d\x82\x91\xdc\xf0\x76\x2e\xbf\xa0\x55\x0c\x09\x04\x5a\x45\xff\xb2\x92\xcb\xdb\xd4\xa0\xf9\xd3\x62\x32\xa9\x8f\x9c\x24\xca\x24\x30\x54\x6b\x97\xb3\x2a\x47\x5c\xb9\x58\x34\xf5\xb1\x9b\x1a\xd5\x89\x34\xdf\xdd\x84\xe4\x29\x4b\x69\x25\x5f\xac\x97\xbc\x7d\x7e\x9d\xb8\xcf\x81\x1c\x30\xd8\x1a\x0c\x18\x57\x9a\x02\x4c\x0d\x46\x8b\xc5\x60\xe3\xe1\xe6\x33\xd7\xf7\x88\x60\xac\x38\xfe\x94\x1e\xbc\x9f\xa3\x95\x32\xae\xd2\xb6\x86\x15\x44\x1d\x20\xda\x32\x2c\x35\x95\x06\x9c\x9b\xf1\x7d\x54\xb9\xcd\xb0\x0f\xb9\xe6\x76\x4d\x60\x25\x3b\xad\x53\x6d\xe9\x78\xbc\x94\xc2\xaa\x09\x62\xd8\xf2\x1e\x06\x25\x49\x68\x0d\x88\x04\x0f\x46\x46\x10\x54\x6e\x8b\x36\xfd\xa8\x9c\x3e\x78\x94\xe8\x45\x5a\xd2\xc2\x80\x33\xb3\x8d\xb1\x2a\x4a\x32\x9b\x04\x61\x0b\xf6\xee\x87\xf9\x21\x65\xf7\x5d\x93\xeb\xd5\xa7\xce\xba\x5b\x88\x06\xa2\x5b\xaf\xfa\xaa\x78\x3e\xae\xf1\x64\x65\x71\x90\x32\x7d\xed\x57\xa6\x1c\xeb\xb0\x1e\x7e\x8e\x1b\xdc\x8c\xeb\x5d\x65\x8e\x94\x7c\xb6\x76\x9d\x28\x13\x52\xce\x9e\xde\x83\xf5\x0e\xbc\x50\x82\x17\x6f\x03\x71\xb6\x3c\x43\x32\xf9\x6d\x89\x37\xe2\xd6\xcc\x5d\x49\xa3\x14\x2e\x3e\x80\xb6\xe6\xfc\x98\x53\xb9\x6d\x37\x5c\x49\x36\xba\x63\x51\x8f\x3c\x91\x35\xc7\xdb\x1c\x8f\xe5\xdc\x93\xf2\x99\x08\x5e\x25\xb0\x91\x49\x81\xfa\x2c\x73\x4d\x28\xc2\x32\x31\xb3\xcc\x7b\x4d\x92\x48\x3b\x94\x61\x29\xc8\xe3\x6f\x0a\x0d\x26\x69\x28\x9c\x86\x10\xe4\x5f\x04\x0c\x3f\x4b\xa6\x7b\x92\x72\x3a\x92\x6a\x1a\x13\xa4\xeb\x7b\x16\x2e\x34\x16\x8c\x52\x5e\x9a\xcb\x24\x7c\xc5\x40\xb0\x2d\xd2\xcd\xa4\x22\xb4\xca\x6d\xb3\xad\xb7\x28\x77\x9d\xf3\x1e\x85\x54\x62\xa8\x18\xd3\x6e\xc0\x90\x24\xf9\x6e\x08\xfe\x29\x27\xa7\x55\x50\x38\x29\xc0\x66\x53\x4e\x16\x7d\x53\x28\x30\x49\xbc\x43\x65\xb0\x8a\x07\xd9\x10\x93\xce\xd4\xf4\x91\x1f\x0f\xed\x98\xdb\x57\xad\x57\x9d\xcf\x8c\xe6\x09\x87\x86\x90\xae\xf9\x41\xdf\x5d\xb5\xd0\x51\x8a\x57\x4e\x83\xfc\x57\x0d\x7d\xee\x81\x1a\x93\x6e\x89\xe1\xfa\x4a\xfc\x08\x13\xee\x5b\xe4\xa7\x42\x4b\x3a\x6a\x0d\xd1\x94\xe1\xfa\x9e\xc0\x21\x8f\xd7\x5f\x8e\x58\xca\x7a\x85\x03\xd7\xf7\x58\x80\x27\x95\xa4\x9a\xf4\x0a\xff\x20\x92\xb6\x10\x71\x8d\x7e\xab\x5d\x1c\xd7\x08\xdb\xb1\x16\x53\x01\x45\x62\xf6\x92\xcc\xf5\x3d\xca\x91\x25\xf6\x97\x98\xb1\x40\x0e\xcf\xf2\xc1\x05\x44\xf3\x73\xb3\xe8\x92\x8b\x97\x7f\xdb\x3c\xed\x03\xf8\xc4\x71\x75\x0a\x76\xf1\x88\x7e\x06\x99\x87\xa7\xe7\x89\x04\x65\xb2\x60\xe6\x94\xb3\x52\x4b\x1e\x47\x39\xaa\x68\xfe\x0e\xb3\xee\x9d\x62\x95\xbb\x5b\x0c\x90\x06\xfc\x3c\x9f\x61\x72\x93\x53\x78\xf3\x4f\xdd\x94\x55\x5d\xdf\x69\xab\xca\x37\x39\xc6\x57\xfe\x21\x68\xc0\x35\x99\x08\x60\xad\xb8\xa6\xb5\x0e\xc6\xd2\xe4\x74\xd2\x18\xb9\x26\x8d\x6e\x89\x85\x30\x40\xc9\x2b\xc6\x4d\x9e\x5b\x52\x16\x92\xab\x78\xb5\x59\x4b\xb1\xe2\xac\x3a\x78\x66\xf5\x8d\xeb\x7b\x2d\x7b\x60\xe0\x8f\xc5\x4a\x5c\x10\x1d\x6c\x31\x08\x5e\x1c\x6b\xb2\x23\xc8\xee\x33\x01\x3a\x3a\x6a\x01\x71\x0c\x78\x8e\xb1\xdf\xb5\xfd\xe5\x3e\x0e\xec\xf0\x38\xe7\xc4\x0d\xcf\x0d\x07\x24\x59\xd4\x6f\xda\xcc\xda\xa4\x08\x62\xfb\xbf\x27\x82\xa8\x9b\x6b\x9a\x20\xfe\x8c\x09\x9c\x62\x95\x34\x2a\x72\x3f\xe7\xb7\x3d\x48\x0e\xf0\xfc\x9d\xff\x73\x71\x85\x69\xfd\xcd\x02\x82\x96\x52\x57\x20\x25\x74\xf9\xdf\x27\xfe\xc1\x17\x75\x73\xf1\xa9\xf9\xdd\x3e\xf4\x73\xfb\x01\xc9\x44\xd7\x7c\xf6\x40\xa8\x1f\xe2\x04\xdc\x1a\x26\xb0\xb3\x06\xdd\x15\xf0\x3b\x16\xe0\xa1\xfe\xed\xd7\x87\xcf\xa7\xb9\x03\x7f\x79\xb8\xfb\xfc\xfc\xc4\x9d\x83\x51\xfe\x02\x29\x37\x01\xfc\x05\x6f\x79\xfc\x63\xca\xe5\xdf\x70\xf0\x20\x71\x00\x5f\x78\xe0\x9d\x85\x17\xaa\x90\x35\x40\x55\x80\xd5\x7c\x47\x87\x8a\x9f\xd8\x01\xff\x53\x3d\x64\x5b\x1f\x0d\xf1\xc0\xad\x0c\x95\x58\x54\x76\x95\x34\x4a\x53\x99\xc0\x7d\x8c\x10\x14\x29\xc6\xc7\xa0\x44\x86\xa9\x8c\x5d\x50\x51\x65\x2f\xe4\x69\x87\xf6\x42\x3a\x6a\x29\x0d\x75\x49\x52\xf4\x1a\x6f\x34\xaf\x10\x23\xaf\x9c\x98\xca\x6f\xe6\xc0\xf1\x86\xff\xce\xff\x73\xcd\xbf\x91\xff\x5d\x20\x82\xbb\x29\x9a\xac\xfd\x46\x4b\xf9\x39\x60\xf6\x4d\x02\x7d\xbe\x82\x7c\x95\x3f\xa8\x0b\x88\x52\xeb\x4a\x27\x48\xd2\x55\x43\x33\xfc\x04\x13\x65\xe4\x27\x3f\x0a\x99\xf0\xf7\x29\xe4\x9a\x05\x32\xc4\xc3\x61\x72\x88\x76\xf7\x83\x72\x8c\xb1\xae\xc8\xc7\xf2\x8b\x09\x3c\x92\x49\x4a\x19\xb8\x9b\x06\x51\xa8\xf9\x9f\x69\xfe\xe7\x4a\xa4\x25\x53\x2d\x52\xc5\xcf\x4d\x89\x06\x43\x07\x15\x52\x3e\x77\x55\x40\xb8\xe9\x21\x2e\x36\x63\x43\xde\xf7\x69\xca\x31\xb8\x01\x34\xa4\x70\x8f\xe9\xf2\x0d\xa1\x3d\x2d\x24\x06\x2c\x1a\x33\x4d\xa6\x97\xf8\x88\x01\x62\x3a\x32\x0a\x4d\x53\x94\x8d\x1f\x69\xbe\xbe\x63\xfc\x47\xea\xa9\xfe\x1b\xeb\xa9\xe4\x99\xfa\x16\x1a\xc3\xce\xe9\x1b\xe6\x22\xf9\xb2\x00\x41\xe8\xd3\x29\x62\xba\x94\x5c\x5d\xee\x46\x4b\xc1\x0d\xdd\x90\xb6\x5e\x91\xb6\xef\x90\x36\x13\x7e\x97\x19\x64\xc2\x37\xc2\xe3\xf2\x67\xfe\xcf\xc5\x15\x19\xd6\x0a\x7c\x89\xa6\x22\x5c\x60\x51\xf1\x5f\x7c\xdd\xca\x3e\x54\x0a\xde\x0a\xf6\x62\x7b\x3d\xe4\xcb\x82\xd3\x61\xe7\x46\x74\x40\x81\x1a\x1a\x14\xa8\x09\x2c\x6f\x3d\x32\xe1\x6e\x1e\x40\xec\x83\xf9\x21\xd1\xcb\x94\x19\x9e\xb9\xd1\xa4\x0a\x6d\x20\x30\x71\xc8\xbf\x06\x42\x33\x6b\x0f\x49\x76\x01\x66\xe7\x42\x40\xed\xbf\x75\x86\x39\x65\x30\x24\xa0\x9a\xc0\x68\xbb\xd0\x68\xf7\xed\x8d\x46\xa2\x7e\xbf\xdd\x2a\x1e\xac\xa7\x8d\xf2\xcf\x3d\xf7\x52\xbd\x90\x9c\x2b\x29\x94\x4d\x58\x35\x9b\xb0\x69\xf6\x7b\x6c\xf6\x7b\xde\xff\x42\xb3\xdf\x8b\xd0\xd4\xec\xf7\xbe\xdd\xef\x6d\x6f\xbf\xf7\xcd\x7e\x6f\x64\xa5\xa9\x61\x9b\xb6\xf9\xed\x9b\xc2\x94\x2f\xee\xf6\x4c\xa9\x79\xd3\x97\x11\x8e\x66\xb1\x07\x06\x1e\xcb\x66\x63\x96\x98\x51\x8f\x09\x93\x85\x9b\x86\xcf\x87\x66\x60\x4e\xa3\x66\xfd\x2d\xd3\x28\xe3\x59\x3e\xc2\x11\x78\x70\x7b\x53\x34\x7c\xd8\x6a\xc6\x52\x9e\x92\x81\xf4\x12\x47\xc6\x8f\xe4\xc1\x32\x07\xf6\x82\x9c\xc8\x8f\xe6\x01\x4d\x8f\xd2\x53\x61\xf4\x08\x17\xd9\xc3\xf0\xf9\x88\xbe\x46\x58\x42\x1d\xa4\x5d\x76\x8e\x9f\x9f\x1f\x1e\xe7\xbf\x4e\x53\xa6\xd1\x28\x0f\x3e\x2d\x8a\x1b\x0d\x18\xb5\x01\x8b\x3a\x65\x3f\x72\x63\x34\x3a\xf9\xf7\x67\x29\xfd\x9b\x14\x3f\x1b\x62\x45\x09\x4c\xb8\x29\x94\x01\x9b\x54\x02\x6b\x54\x36\x9b\x4b\x49\x75\xf3\x84\x4e\x8b\x2f\x24\xbf\x6b\x4d\xc5\xaf\x3c\x35\x47\x62\x3f\x4b\x77\x41\x35\xbd\x5e\xdf\x6b\x31\x5e\xfb\x1b\x0d\xc6\x40\xf4\xda\x41\x21\x46\x2e\xa7\x79\x97\x07\xeb\x66\x46\xcc\xfd\x66\x6d\xf4\x57\x52\x24\xd0\xd8\x25\x41\x11\x67\xd6\x80\x21\x95\xdb\x95\x29\x06\x23\x84\x1b\xab\x0a\xe6\x07\x46\x4a\x8b\xa1\xd1\xb4\x74\x80\xe1\xc0\x9e\x88\x20\x51\x45\x6e\xbe\xa5\x1f\x14\xd7\xf2\xed\xfd\x70\x37\xae\xe9\x26\xf6\xba\xf9\xd9\x81\x61\x7c\x26\x25\x15\x11\x4d\xa8\x3c\x44\xfa\xc8\x57\xbd\xc2\x42\x59\xa9\xc5\x17\xe5\xdf\x9b\x00\x41\xd8\x92\xd8\xfe\x50\x8a\xa1\xf2\x57\x4c\xd0\xe0\x08\x62\xd0\x0e\x48\xaa\x94\xa6\xfc\x79\x93\x78\x16\x5e\x49\xd3\xce\x21\x40\xf0\x55\x82\x28\x93\x70\x46\xe5\xb6\x3b\x89\x2d\xc0\x3a\xfc\x34\xe7\x10\x7b\x46\x02\x87\x2a\x41\x91\x78\xa6\x09\x10\x8f\x1b\xf6\x02\xbc\x14\x81\xf2\xca\xac\xea\xf1\xae\xf2\xf3\x4f\x39\x81\x8d\x58\x94\x08\xd1\x88\x3a\x3c\x33\x11\x4c\x50\xb9\x5d\x9f\x3b\x0b\x92\xbf\x8c\xb9\x32\x2b\x63\xce\x8e\xb9\x83\x7e\xbe\x01\xe6\xe6\xe2\x6f\x04\x51\xa2\x31\x2c\x48\x0a\x93\xba\xa9\xed\xcc\x3b\x42\xf4\x0d\xc3\x09\x52\x04\xcb\x01\xb9\xe6\x87\x0b\xaa\xd0\xe8\x14\x8f\xac\xe1\x29\x87\xb1\x9c\xa5\xde\x16\xe0\x71\xc2\xf2\xbf\xf1\xdc\xa0\x2f\xcd\x6c\xb4\xd5\x60\x14\xd1\x29\x67\x21\x52\xd3\xe6\x3b\x1e\x48\xf3\xe2\x07\x90\x20\x87\xf6\x30\x26\x1b\xbd\x63\x14\x01\x00\xd0\x69\x03\x04\x64\x19\xb3\x02\x90\xdd\x41\xf3\xe7\x3c\x47\xce\xc7\xf0\x66\x09\x91\x4e\xdb\x72\x7e\x64\xc2\x0d\x52\xc2\x96\xe4\x33\x16\xbc\x05\x9a\x07\xb0\xac\xe3\xd9\xf6\x7c\x1d\x3c\xeb\x46\xc9\x0a\x21\xc7\x96\x90\x5b\x02\x36\x38\x15\x25\x57\xc8\xbb\xdc\x6c\x70\xec\xaf\xda\x75\xfc\xce\x4f\xa7\x03\x24\xa9\xe9\x49\xf1\x26\xe6\x12\xe5\x68\xc1\xb3\x3e\x11\x2c\x23\x5c\x91\x58\x06\xb7\x55\x04\x97\x6e\x74\x0e\xd2\x20\x1d\x14\x5f\xd4\x72\x5f\x7e\xce\x4c\x02\xab\xa4\xc9\xe0\xf1\x20\xb2\x78\x95\xe6\xfd\x3b\x85\xa8\xef\x22\x48\xb0\xe0\x2e\x46\x2a\xa3\x0c\x81\x23\x15\x21\xa4\x46\x2c\xc3\x45\xf1\xd1\xb0\x18\x6e\x58\x1c\x97\x92\xb8\x24\xdc\x48\xe2\x45\x62\x16\x06\x31\x0b\x83\xc8\xeb\x49\x69\xf4\x7a\x92\x85\x22\xf1\xd7\x5d\x10\x03\x63\x94\x12\xbc\x51\x65\x58\x50\xdc\x3e\x17\xf2\xe0\x68\xa9\x69\xb6\x31\x9f\xfc\x9a\xe7\xd9\x90\x9c\x3c\xf3\x77\x25\x02\xd9\x88\xb2\x50\xa4\x0a\x3d\x18\x7b\x38\xf8\x22\x84\xb0\xbb\x4b\x59\xb5\x43\x4f\xb7\xc7\x47\xea\xe6\x69\x15\xb0\x0b\x20\xed\xe8\xf6\x2c\xf0\x0d\x2b\x9d\x22\x3a\x32\xa9\x52\x3e\x55\x46\x9d\xed\x0d\x9b\x59\x4c\x8c\xa4\xc8\x87\xe0\x16\x1a\x42\x38\x0a\xa5\x16\x10\x69\x36\x08\x3a\xcd\xd2\x58\x70\xb5\x05\x0c\x3a\x00\x91\xb0\x0c\xd7\xb0\x0c\x1f\x35\xef\xfb\x2c\xc5\x36\x3f\x76\xb0\x8c\xef\x00\xc5\x9a\x2e\x31\x8a\x27\x87\xcf\xcb\xa7\x3a\x4b\x39\x19\xba\xd0\xcb\xe2\x88\x98\x43\x88\x37\x09\x9c\x0f\x45\x09\x39\x17\x11\x57\x05\x5e\x80\x6d\xb7\x99\xb7\xaf\xa4\x91\x5d\xa2\xc8\x99\x7c\x3b\xc6\x72\xc5\xa5\x46\xf0\x1b\x05\x0f\x03\x98\xa8\x21\x2a\x1b\xc1\xe4\xa6\xbd\x1e\x10\x5c\x3a\x0a\xaf\x55\xfe\xaf\x11\x75\x34\x18\xbb\x11\xb7\x09\x2e\xe9\x00\x5e\x4c\x1d\x31\xb4\xfb\xa1\x69\x25\xdb\xb8\x7f\x3f\xfc\x0e\x90\xfb\x5b\xf2\xcf\xf3\x38\x8d\xb0\x68\xb4\xcb\x9e\xf2\xb1\xfe\xfa\xf4\xbc\x59\x0d\x5a\x50\xb9\xc9\xa7\x64\xbc\x8a\x25\x05\x70\x4b\x2a\x0d\x56\xa6\x58\xfd\x61\xaa\x04\x3e\xcc\x24\xe1\x05\xb6\xb5\x88\x0b\xd5\xbc\x73\xfd\xe1\x00\x8b\xcc\x76\x57\x65\x1e\x81\x53\x58\x94\x11\x5c\x15\x4b\x16\xc9\x36\x7b\x53\x3c\x88\xca\x90\x3c\x64\x8a\xd2\x1d\xd0\xb1\x24\x27\xb9\xad\xeb\xbb\x2f\x4f\xb7\x8d\xe9\x0b\x0a\x6c\xac\x5f\x0e\x52\xfa\x70\xf1\xc8\x57\xc5\x0e\xf6\x1b\xff\x08\x69\xfc\xd7\x77\x55\x94\x6f\x8a\x89\x4b\x3d\x2b\x26\x36\xd6\x8b\xbc\x54\xef\x5f\x71\xa2\x42\x39\xf0\x91\x67\x45\xbe\x72\xdb\x1e\x69\x3e\xd0\x04\x60\x8a\x79\x53\x0a\x5c\x1d\xe0\xe4\xb1\x3d\x72\xa2\xeb\x86\x93\xa0\x73\x8a\x98\xfa\x87\x88\x07\x84\x6a\x7d\x83\xd5\x1d\x6b\x85\x99\x6a\xbd\xc7\x1a\x4d\x76\x4f\xbd\xb1\xd6\xd4\xe2\x2f\xe7\x63\xc9\x40\x97\x13\x4b\xd6\x9c\x76\x15\xf8\x3e\x66\xf6\x66\xcc\x68\xd6\x58\xb4\x60\xb6\xdc\xd6\xc4\x1a\x83\x9e\xd9\xcf\x61\x17\xea\x8d\xf5\xf7\xd8\x1c\x5a\xe3\xbf\xd2\xba\xa0\x18\xbc\xe0\x9e\x2e\x0c\x5e\x98\xe2\x82\x79\xd0\xfa\x5f\xba\x30\xa6\x69\xdb\x67\xf8\xdf\x23\x46\xe4\x46\x01\xeb\xdb\x5b\x3e\x26\x73\x15\xf9\x26\xb4\x38\xc6\xee\x32\x1d\x25\x8e\xb1\x82\x9c\x81\xd7\x8d\xf3\x8b\xd8\x4b\x72\x58\x80\x4d\xd5\x8a\x7d\x53\x2e\x64\xbd\xa5\x9e\xe4\x28\x3a\x6c\x4a\x50\x3b\xa3\x42\x6b\xbb\x42\xd5\xf6\x72\xc4\x5a\xd9\x11\x93\x68\x0d\x12\x7d\xb9\xe0\x25\xe3\xc5\x09\x9e\x15\x3b\x33\x80\x6c\x31\x56\x4c\xe4\xfe\xb0\x6f\xf6\x6b\xf1\x88\x57\xe1\x40\x91\x68\xa7\x95\x64\x4f\x8f\x3d\x22\xdc\x4b\xa9\x23\x7b\xdb\x15\xd6\x38\xad\x94\x92\xbd\x7d\x43\x9a\x31\x21\x2b\x69\x1a\x07\xe1\x04\x11\xc5\x99\x45\x8e\x41\x63\xcf\x3b\x38\xa4\xeb\x2b\xe6\xa2\x45\x3e\xfb\x4c\x25\x6d\x20\xcf\xce\xc4\x21\xe7\x83\xe1\x38\x7b\xc6\x4e\x8e\xc3\xc8\x92\xfd\x6a\x65\x8b\x6a\x38\x8e\x83\x4e\xa8\x29\xfa\x0d\xa6\x73\x80\x53\xc2\x5e\x99\x83\xf9\x9d\x9f\x0f\xca\x8f\x69\x49\xf1\x22\x20\x5e\x78\x70\xbe\x26\x88\x49\xbb\x03\xb6\xff\x1d\x85\x9a\x73\x77\x27\x2c\xff\x81\x50\x18\x27\xeb\xbc\xf6\xf6\x7d\x64\xca\xf8\x73\x62\xf4\xcb\x36\x8a\x3d\xf0\x24\x70\xca\x4f\xb0\x73\xf5\xdf\xcf\x9f\x3d\x37\xeb\x18\xe3\x15\xb1\x07\xf0\x85\x60\xf8\x86\x35\x86\xc0\x69\xb0\xb6\xd9\x13\x56\xdb\x61\xaf\xea\x5b\xf3\xee\x81\xa3\xda\x23\x59\x8c\xde\x09\x8f\x4a\xbf\xde\xed\xae\x67\x43\x98\x7d\xf9\x52\xdf\xdd\xcc\x9f\xef\x1e\x3e\x6f\xe6\x2a\x1a\x08\xf1\xf1\x22\x5e\x58\xf9\x1f\x16\xeb\xff\x6c\x73\x35\x9e\x66\x32\x18\xf4\x85\xe9\x22\x5e\xa0\xcb\x0d\x16\x17\x84\x4d\x6b\x2f\x30\xe5\xe6\x80\x0e\xb7\x6d\x93\x43\x0d\x85\x67\x62\x8a\x8b\x78\x41\x3e\x37\x58\xb0\x56\x92\x5b\xb9\xb5\x43\x25\x19\x6b\x3d\xd8\x80\x66\x3b\x11\xbb\x9e\x1d\x83\xd4\xad\x66\x7e\x80\xb9\x62\x8b\x41\x60\x0b\x48\xf9\x3f\xd7\xb4\x84\xeb\xff\x56\x17\xe5\x99\xd3\xac\x03\x9b\x70\xc5\x24\xe0\x94\x96\x90\xc1\x99\x5b\x14\x25\xb0\x69\x0f\xe8\x75\xd3\x07\x7a\x0b\x70\xdb\xf5\xb4\xeb\x45\x64\x10\xfb\x76\x81\x85\xc8\x46\x67\x7a\x19\x03\xdc\xf5\x5c\xdc\x7a\x8e\x0c\x5f\xbf\x86\xc0\x21\xbd\xc6\x51\xc0\x35\x32\xa9\xa6\xa5\xf5\x7f\xeb\x8b\xc5\x41\xbd\xa6\x31\xc0\x3d\x82\x0f\x8c\xd5\x2b\xcf\xc6\x17\x8e\x54\x35\xa7\x23\xdb\x63\x55\xce\x69\xc9\xf8\x58\x9d\x71\x5a\xb2\x3e\x52\x5d\x9c\x8e\xcc\x47\x29\x92\x67\x27\xfb\x7d\xa3\x08\x07\x2d\xc6\x29\x6c\x60\xdf\x28\xe2\xb7\xd1\xdd\xd3\x48\xdd\x7d\x1a\x4e\x34\xd6\xda\x7c\x46\x56\x70\xac\x01\x7a\x6a\x66\x70\xac\xe9\x79\x0b\x3b\x68\x08\x7e\x3f\x53\x38\xb3\x9d\xf9\x14\x86\x70\xac\x61\x79\x6a\x96\x30\xca\x2c\xfc\x0d\x98\xc2\x9e\x71\x84\x91\xf6\x8a\x58\xa2\x5b\xd2\xc2\x5e\x36\x27\x20\x8a\x50\x79\x70\x95\x2d\xf1\xa8\xd3\x90\xf8\x5d\x58\x08\xc6\xcc\x24\x8d\xb4\x12\xb4\x76\x27\x2b\x46\xa7\xb5\xc5\xc9\xaf\xed\x4d\x5b\x8d\x4d\xa3\x0c\x93\xfd\x8f\x33\x71\x1e\xfd\xf5\x5d\xa9\xdc\x56\x5f\xef\x94\x8d\x38\xfc\xeb\x5b\xd4\xa9\xd5\x11\x80\x3b\x19\x32\xfb\x0e\x53\xdd\xe9\xa0\xd9\x55\xa7\x63\xfd\xf9\x93\x60\xb3\x45\x1b\x1a\x54\xec\x38\x05\x36\x5b\x54\x9f\xc1\xd7\x4f\x82\xcd\x16\x1d\x67\x77\xb9\x91\xc3\x3f\xbf\x45\x99\x39\x96\xa0\x4e\xb4\x1b\x1f\x4c\x62\x47\x5a\x8b\x8f\x26\xba\x23\xed\xb2\xc7\x13\xca\xb8\x52\x11\x13\x92\xce\xa8\x22\x0f\x53\xa2\xfb\x9e\x0e\xf7\x6d\xe4\xc7\x13\xc0\x9e\x0e\xc7\xed\xd8\x4e\x61\xb1\x75\xb7\xde\x65\xe8\xdc\xd9\xdf\xf7\xb1\x53\xbf\x34\x8b\x73\xef\xd2\x47\x99\xee\x4f\x60\x29\x47\x58\xcb\x4f\x60\x28\x47\x58\xc1\x8f\xde\xd5\xc7\x14\xbf\x98\x94\x79\xbd\x58\xa0\x62\x5a\xd6\xb5\xab\xbb\x3d\xb6\x8a\x53\x18\xd7\xae\xee\xf6\x18\x25\x4e\x61\x5b\xbb\xba\x9b\xc2\xfa\xf0\x42\x17\x2f\x5b\x1e\xfa\x45\x4a\xbf\xde\xd5\x9f\xee\x3e\xff\xba\xd3\xe9\x12\x13\xc4\xa8\x4c\xe9\x01\x69\x26\xc5\x20\xa5\xc9\x9c\xc8\x2a\x07\x48\x95\x31\x25\x51\xe5\xb6\x3d\xd1\xbc\x7e\x7d\x45\x85\x32\x58\x62\xa8\x28\x96\x69\x69\x4a\x9f\x9f\x07\x5c\x3d\xcc\xcc\x19\x49\xb9\x52\xde\x99\xf7\xee\xe4\x3f\x4e\x74\xf1\xd9\xb1\xc0\x51\xd6\x37\x6e\x4f\xe8\x7c\x16\x2f\x1f\x9a\xb4\xc7\x31\xec\xc7\x4f\xda\xe3\x08\x16\x14\xf7\x66\x91\x9f\xd2\x86\x3a\x80\xea\x64\x5d\x8e\xe0\x44\x0d\x58\x27\xeb\x72\x04\x37\x6a\xe0\x3a\xd5\x4a\xee\x61\x48\x43\xb8\x4e\xd5\x65\x1a\x0f\xd7\xa9\xba\xc4\x62\x2c\x60\x69\xaa\xa5\xc4\x11\x8c\xa7\x81\xec\x74\x7d\x8e\xe1\x3d\x7e\xe2\x3e\x47\x70\x9f\x17\xaa\x56\x1c\xde\xe7\x08\xfe\xf3\x42\x19\x8b\xc3\xfb\x1c\xc1\x81\xda\x79\x4e\x86\xb6\x63\x84\xa1\x30\x71\x9f\x63\x24\x22\x33\x31\x0e\x8d\xe0\x42\x6d\x75\x87\xc9\xfa\xdc\xc3\x86\xb6\xf8\x93\x62\x49\xe6\x4c\xde\xa4\xb4\x87\x39\x4d\x79\x24\x45\x38\xee\x4c\xea\x14\xb1\xe8\xc8\x83\xa8\x93\x04\xa3\x23\x4f\x9e\x4e\x12\x8d\x8e\x3c\x65\x3a\x49\x38\x3a\xf2\x44\xe9\x34\xf1\xe8\xc8\x33\xa4\xd3\x04\xa4\x23\x0f\x8c\x4e\x12\x91\x8e\x3c\x1c\x3a\x4d\x48\x3a\xf2\x64\xe8\x34\x31\x69\xd4\x21\xce\xc4\x72\xd2\x3e\xbe\x50\x8c\x07\xef\x84\xbd\x8e\x62\x47\x47\xc9\x4a\xfb\x7a\x1d\xc3\x90\x8e\x93\x22\xf6\xf5\x3a\x86\x25\x1d\x27\x47\xec\xeb\x75\x0c\x53\x3a\x4e\x92\xd8\xd7\xeb\x28\xcb\xf7\x51\xb2\xc4\xbe\x5e\xf7\x9e\x63\xaf\xac\xc3\x13\x58\x40\xaa\x08\x64\x6b\x92\x04\x61\xbb\x6c\x2d\x23\x4c\x35\xe8\xc0\xc4\x0d\xbf\x7b\xd2\x52\x2b\xe0\x88\xf9\xef\xb5\xc6\xef\x09\x9d\xc3\x0b\x32\x6d\xdb\xf9\xef\xc4\xb0\x39\xfc\x3e\x8c\xf5\xa3\xa6\x32\xd6\x62\xdf\x95\x59\x23\x2f\xb1\x31\x22\xad\xf6\x8a\x75\xa1\x8a\xd7\x57\xe4\x15\xb9\x92\x6c\x45\x26\x17\xbd\x92\x3f\x30\x76\xff\x90\x3b\x56\x61\x51\x52\xec\x3e\x17\xbb\xcf\xc5\xa6\x52\xd6\xc9\x61\x44\x18\x46\xe1\x6d\xaa\x4c\xb1\xf0\x4b\xb3\x70\x3b\x4c\x8d\xa1\x31\x35\x26\x9e\x60\xa8\xc8\x74\xca\x89\xc5\xce\xef\xce\x75\xb9\x6c\x15\xba\x12\xb1\x33\x51\xc4\xce\x44\xf9\x8f\xee\x9d\xd8\x00\xc7\x95\xe8\xba\xef\xb8\xee\x3b\xae\xfb\x8e\x93\x77\x4e\x8f\x80\x3a\x1c\x50\x68\xc1\xdb\x8d\x2c\x23\xa8\x2d\x04\x5f\xa3\x46\xf0\x3f\x10\x30\x8f\x3c\xd2\xee\x86\x8e\x50\x4e\x27\x57\x6b\xfe\x55\xb4\x44\xe4\xc0\xee\xa7\x1b\xab\xdc\x76\x4a\x39\x47\xdc\xd4\xab\x33\xae\x23\xd3\xc4\xbe\x33\x80\xc9\x83\x9d\x9a\xa8\x9d\x0a\x1b\x76\x0c\x44\xb3\x5e\xf6\x37\x46\x84\x10\x7b\x3b\xc2\xde\xf0\x9f\x29\x76\x87\xc9\x8e\x6a\xa7\x3a\x12\xdb\x9e\x51\xec\xa5\x2d\xd4\x2c\x69\x11\x7b\x96\x9f\x8d\xbd\xf4\xb4\x08\xa1\xef\xe8\x84\x6d\x64\x0c\xd2\xf1\xa6\xa3\x91\x31\x47\x27\x18\x8a\x46\x06\x19\x9d\x60\x16\x1a\x19\x50\x74\x82\x11\x68\x64\xf0\xd0\x29\x26\x9f\x91\xe1\x42\xa7\x18\x78\x46\xc6\x06\x9d\x60\xce\x19\x19\x07\x74\x8a\xf1\x66\xbb\x29\x63\x5a\x5b\xcd\x76\xc3\xc5\xa4\xa6\x99\xed\x56\x8a\x69\x0d\x31\xdb\x6d\x12\xd3\x9a\x5d\xb6\x5b\x20\xa6\x3d\x92\xda\x6e\x6f\x98\xf6\x08\x6a\xbb\x75\x61\x5a\x63\xd1\x76\x0d\x7e\x5a\xd3\xd0\x76\xb5\x7c\x5a\x43\xd0\x76\x7d\x79\x5a\xb3\xcf\xf6\x03\x9b\xdd\xee\x34\x1f\xff\xf4\xd7\x9d\x9e\x34\x64\x24\x23\xac\x81\x22\x30\x1d\x2f\x11\x5c\x49\x06\xa2\x99\x43\x70\x10\xda\xc8\x78\x49\xe0\x1a\x5c\x85\x08\xc6\x2c\x34\x6e\x06\x65\x1f\x29\x67\x18\x29\xac\x11\x01\xdd\x1c\x22\xb4\xc5\xf4\x0a\x29\x3d\x63\x8a\xa5\x76\x60\x17\x04\xb4\xed\x66\x15\x41\xcc\x4d\x2c\x77\xb4\xea\x41\x80\xa4\x7c\x49\x1e\x8c\xab\x0c\xc4\xce\x6b\xfc\x92\x2a\x2a\xbf\xd0\x52\xa8\xea\xe0\x7b\xe5\x66\x6f\x5e\x45\xc0\x2a\x81\x73\x65\xff\x1d\xc9\x94\xe8\x4b\xbf\x74\x60\x0f\xbf\x55\xf1\x2c\x06\x5d\x45\x60\x71\x78\x41\xe0\xdd\x72\x00\x8e\x3c\x3e\x53\x2c\x1c\xd8\x63\xee\x95\x5b\xba\x33\x19\x94\x15\x39\x40\xb7\x0b\xfe\xb2\x38\xd7\x57\x94\xab\x14\xce\x01\xa1\x2d\xbf\xcd\x3f\x19\x5e\xfd\x6b\x1a\x50\x96\x6c\x7d\x51\xa6\x25\xb9\x61\xba\xaf\x2b\xfe\x79\x9a\xcc\xb7\x16\x63\x49\xf2\x2a\x5b\x70\x61\x1c\x5a\x57\x2b\x52\x98\xd6\xaf\xab\x8f\xf0\x64\x04\x69\x5e\xc0\xef\x36\x6f\x42\x37\xe7\x83\x26\x0d\xac\xe0\x9c\x08\x71\x56\xc0\x36\x3e\xdd\xa4\xa3\x48\xc7\x11\xcf\x3b\x81\xf4\x16\xf0\x98\x43\xf7\x6f\x73\xe6\x7e\xb0\xe6\x79\x00\xc6\x4a\xa6\x9b\x53\xd1\x73\x81\xb4\xca\xae\xf7\x8e\x8c\x67\x45\xc6\x63\x83\x74\x0f\xe5\xaf\x8c\x34\xcc\x5e\x97\x01\xfc\x7e\xee\x3a\xb2\xd2\xc6\x1b\xb6\x44\x1e\xe6\x90\x31\xf6\x04\xe5\x50\x22\x74\xcb\x08\x96\x67\x8e\x3c\x6c\x6c\x53\xff\x90\x55\xe4\xa4\x4a\x92\x29\xc9\x34\x0b\x23\x59\xbd\xfb\xe7\x6e\x6d\x3a\xcd\x4b\x42\x20\x96\xa9\xde\x29\xf1\x2c\x94\x38\xcd\x19\xc1\x6b\xa3\xfc\xe4\xc6\xf7\x23\xa4\xa4\x5e\xd2\x6d\xa7\x51\x2a\x65\x18\x88\x2f\xd3\x00\x2e\x10\x2c\xcd\x06\xdf\x68\xb2\x6b\xbd\x23\xfe\x59\x11\xff\x88\x83\x86\xa9\x2c\xf0\xdb\x13\x83\xbf\xab\xaa\x3f\x1a\xe6\x75\x54\x55\xa7\xc6\x72\x84\xe3\x5c\x08\x7a\x66\x97\xab\xdb\xfb\x87\xc7\xdf\x86\x96\x97\x81\x05\x79\x5d\xa7\xde\xae\xed\x3e\xa7\x65\x79\x1b\x5a\x77\x4f\xed\x62\x8f\xe5\x95\xec\x34\x5d\xec\xcb\x45\x8a\x4e\x51\x28\x6d\x85\xa1\xa4\x8a\xc2\x7c\x7d\xdc\x45\x8a\x4a\xf4\xe0\x91\x17\xdf\xc9\xe2\xfb\x8a\xb6\x05\xd2\x1e\x76\xdc\xd2\xa1\x78\x15\x4a\x3b\xeb\xf6\x98\x96\xb6\xb4\x55\x2a\x0d\x2d\xed\x82\xaa\xd4\x3d\x7d\x23\xb5\x91\x3b\xf2\xb0\x53\x98\x6e\xc7\x14\x4a\x4c\x4b\x2a\x0d\x75\x67\xac\x89\xe1\x60\x0e\x39\x12\xdb\x63\xa8\x3d\x02\x07\x27\x50\x19\xa6\x5b\xcf\xd3\x53\xcc\x1b\x52\x18\xaa\x3d\xb0\x3e\x5b\x3a\xf9\x36\xf3\xeb\x66\x8d\xc2\x28\xa5\x62\x18\x14\xcb\xb8\xb0\xd9\x5b\x66\x36\xf0\x96\x59\x27\x8e\x3d\x93\x67\x76\x4b\xd9\xdd\x04\xbc\x1d\xec\xb0\xbb\x53\x7e\x9f\x9a\x3a\xde\xaa\xc4\x32\x97\xf3\xad\x0d\x60\x0b\x01\x9e\x96\xed\xfd\x2d\x4b\xd2\x87\xf9\x7e\x8f\x0b\x98\x3f\x8a\xcc\x4f\x8a\x5e\x3d\x66\xeb\x39\x36\x75\xe0\x59\xf8\xca\x69\x79\xeb\x8f\xe7\x2a\xa7\xa5\x9a\x67\x24\x6b\xdc\x6d\x06\xaa\x8c\x03\x87\xcc\x53\xc8\x32\x4f\x99\x36\xbd\x7c\x8f\x72\xc9\x00\x9a\xf9\x20\x12\x49\x4b\x01\xb1\x83\x08\xf9\xa8\x10\xd8\x29\xad\xa4\xe1\x50\xed\xc0\x2a\x34\x55\x5a\x2f\xb5\xa6\xed\x53\x5e\xda\x17\xf0\xb3\xc4\x54\x51\xda\xb1\xf1\x57\x68\xae\xaf\x90\x14\x15\x65\xac\x90\x16\xf6\xfa\x3e\xaa\xa2\x44\xdf\xf9\x83\x6c\xfe\xe3\x74\x27\xd8\x8c\xc8\xe8\xa0\x08\x62\xd6\xcd\xdf\xce\x7f\xb6\xf9\xcc\x7b\x56\x23\x92\x8a\x5c\x06\xf9\xd1\x3c\x26\x6a\xea\xf0\x6e\x1a\x97\x9c\xbb\xa4\x02\xdc\x0e\x19\xeb\x04\x30\x0d\x00\x74\x36\x8b\x0b\xc4\xc9\x4a\xa9\xc1\xe6\x3e\xd2\x74\x71\xbc\xb7\xe6\x68\x53\x8b\xac\x31\xf3\x8d\x79\x00\x63\x54\x68\x8b\x8a\xa2\xb6\xaa\x68\x17\x9d\x16\x08\x0e\x99\xb2\xa3\x92\xa6\x39\x8e\x82\x64\xb5\x3b\xef\x02\xf6\x30\xfc\x3b\x34\x23\xf4\xb4\xc2\x3f\xce\x9f\xe7\x2f\xd5\x14\x23\x0f\x4e\x59\x28\xe2\x47\x22\x08\x41\x7e\x32\xcd\x38\xb0\xfc\x4f\x80\x24\xba\xfc\x1c\x23\x84\x5c\x4e\x6d\xe5\x59\xa9\x80\x2a\xbe\x7f\x53\x68\xf0\x4e\x11\x14\x49\x23\x44\xab\x1c\x38\xf9\xf1\x33\xab\x29\x40\x41\xd4\x15\xfe\x10\x46\x20\x7b\x53\x28\x70\x56\x63\xae\x25\x6e\xad\x36\x20\x89\xe4\xcd\x92\x6e\x98\xa3\x6b\x30\xa4\x1c\x24\x31\x31\xf0\xbf\x06\x82\x93\x8e\x3e\x1a\x2b\xe3\x32\x05\x4b\x45\x32\xd2\xd5\xf0\x27\xf2\x11\xb0\x52\x12\xce\xbe\x30\x2f\x74\x79\x5e\xf2\xaf\x00\x28\x6c\x03\x90\x5e\x03\x88\xc0\x11\x4f\x24\x68\x03\xd1\xea\x00\x4e\x7e\xfc\x4c\x32\xa1\x2e\x78\x3e\x32\x3a\x82\x55\x96\x57\x83\x90\xc5\xf0\x00\x49\x11\x55\x54\x7c\x74\x02\xb4\xc4\xdc\x4d\x46\x1a\x9a\x7f\x0f\xaa\x35\xb6\xf7\x10\x3b\x2a\x2c\x20\xba\x1b\x6d\x21\x19\x55\xe8\x98\xeb\x16\xc4\x98\x7f\x59\x30\x72\xe4\xe6\x78\x19\x09\x9c\x32\xcc\x94\xf8\xaa\x5a\xdd\x7f\xe2\x5f\x52\x91\x57\xae\x69\x79\x07\x1d\x90\xf9\x48\x5e\x3e\x47\x10\xa4\xac\x5f\x32\xb9\x37\xd5\x76\x7b\x7d\x2f\x0f\x04\xf0\xe1\x46\xcb\x0d\x6d\xc0\x92\x22\x2d\xd7\x69\x86\x16\x6c\x52\xb9\x6d\xf8\xbb\x55\x54\x2c\x19\x9b\xe6\xe8\x99\x9d\xe4\x36\xd3\xb8\x55\x60\x83\xf4\xe7\x9b\xb6\xb1\x51\xe5\x11\x3a\xbf\x34\x80\xb4\xb5\xab\xf9\x46\x57\xda\x6a\x70\xe6\xf8\xae\x28\x57\x58\x84\xe4\x34\x65\xc4\x32\xb1\xe9\x8c\xa1\xa6\x9b\x27\xad\xc9\xbf\x68\x05\x36\x46\xc4\xc4\x4f\x35\x57\xd5\xea\xfe\x53\x86\x27\x58\xa9\x98\x9b\x3f\x74\x00\x26\xec\xb3\x85\xfc\x68\x94\x70\xba\x35\x81\xac\x00\x3b\x82\xdb\x8e\x31\xef\xc8\xd9\x47\xce\x5a\x10\x60\x3e\xa8\x43\xa3\xa1\x88\x9a\x6a\x2d\x56\x88\x73\xb0\x19\xbb\xd0\xbb\x13\x25\x9d\x6a\xc4\x21\x1e\x85\x54\x92\x0f\x0e\xbc\xd1\x46\xea\xa8\x68\xa3\x78\xa9\x78\xa3\xac\x81\x9c\x2a\xce\x66\xca\x11\x01\x4f\x42\x74\x4a\x43\x4b\x82\x78\xe4\x76\x2a\x01\x90\x93\x17\x09\xfc\xae\x4c\x1b\xee\x50\xe9\xf5\xc7\xe3\x88\xa7\xb9\x97\xbd\xcb\x0a\xdf\x15\x3b\x3e\x40\x56\x38\xd5\x3e\x46\xa8\x5a\x22\x31\x52\xd1\x5d\x4a\x42\x09\x97\xc2\xa8\x0a\x0d\x64\xb9\xb5\xf2\x3b\x98\x79\x10\xd5\x9c\x9b\xa2\xf1\xca\x14\x86\x86\x1f\x59\x69\x77\xca\x01\x26\x56\x46\x3c\x98\x11\x3a\xc9\x19\x0d\x6d\xac\xb8\x2e\xdd\x51\x1c\x77\xa9\x1d\xa4\xcd\xb4\x39\xcd\x47\xa7\x35\xd2\x4d\x69\x9b\x72\x07\xda\xa6\xc6\xe9\x93\x36\xde\x38\x30\x40\x5e\x25\x46\x55\xc5\xf7\x83\x5f\x7a\x08\x35\x14\x0e\x0a\x3f\xa1\x26\x78\x54\x40\xb6\xe2\x31\x4e\xc8\xa0\x2f\x23\xff\x99\xcc\x52\x7b\x08\x1f\x23\x53\x3d\xc3\x05\x81\x7b\x0a\x56\x35\x3d\x4e\x11\x23\x7d\x2e\xae\x4c\x2c\x32\xcc\xd0\x80\x13\xd3\xaf\xeb\x56\x78\x8b\xcc\xe4\x42\x50\xb9\xcd\x1c\xd0\x6b\x31\xbe\x50\x60\xee\xe8\x94\x34\xad\x87\x00\x02\x86\x1b\x0b\x84\xaa\x60\x06\xce\x7d\x91\xe1\xbe\x8c\x36\x40\xa6\x62\x20\x86\x8f\x64\x21\x2a\x22\x86\x5c\x20\xc5\xd2\x42\x54\x64\x76\x75\xc5\xa8\x30\xae\x2b\xc4\xb6\x2b\xc4\xb1\x9b\xcd\xb8\x85\xd9\x7b\xb8\xfc\xa6\x90\xea\x54\xab\xe4\x9e\xe2\x95\x49\x13\x84\x73\x09\xf8\x3f\x2e\x16\xbe\x58\xb7\xf3\x2c\xb1\xf4\x2f\xe8\x33\x36\xd6\x2c\xcc\x6e\x28\x34\x93\x94\xfe\xec\x28\x33\x14\x97\x1e\x9c\x79\x99\xfb\x6f\x55\x5c\x4e\xc9\x3f\xff\x76\x94\x96\xf1\x49\xed\x47\xa7\x15\x78\x5b\x1c\xe7\x94\x48\xff\xf7\x6d\xed\x9b\x6d\x6b\x47\xe5\x2a\xf8\xb2\x51\x7f\x76\xab\x48\xbf\x57\xa2\xb7\x71\xce\xe4\x2d\x29\x48\xda\x73\x21\xe5\x14\xee\x70\x97\x9d\xae\x56\xeb\x97\x7e\x3e\x09\x9b\x36\xf2\x43\x50\x00\xe3\x14\x9a\xb9\x55\xb6\x9d\x51\x50\xcc\x0d\xc6\x09\xad\x48\x60\xcc\xc6\x3c\xda\xee\x0e\x9c\xc9\x61\xa2\x7f\x53\xbf\xff\xe0\xc3\xa6\x97\x25\xff\xde\x61\xd3\x9f\x6f\x9f\x1e\xbe\x3e\xde\xdc\xfe\xe9\xe1\xa1\xde\x79\xda\xd4\x35\x5f\xb1\xc6\x34\x47\xcb\x4a\x79\x03\x50\x22\x71\xf5\xc4\x00\x36\x5d\x46\x30\x8a\x22\x14\x61\xd6\x7d\x86\x08\x8a\xa4\x2c\x78\x92\xec\x3d\xc1\xcf\xd0\x2b\xf4\x8d\x0f\xa6\xb1\x0a\x99\x66\xf3\x95\x42\x34\x4d\xc3\x0a\x34\x4a\xe1\x62\x43\x73\x34\x90\x24\x55\x69\x6a\x63\x83\x22\xa0\x17\x1d\xfb\x12\x23\xeb\xc6\x98\x78\x68\xc9\xf5\xba\x95\x97\xcf\x67\x58\x7e\xed\x9d\xe7\x30\xf3\xe8\xd8\xdd\x27\x2a\xda\x5c\x1d\xd5\x59\x1d\x61\x7c\xd7\x57\x79\xd1\xba\x8b\x1c\x20\x39\x8d\x7b\x11\x81\x5f\x3a\xe3\xa2\x1e\x1c\x5b\x8c\x20\xaa\xbc\xdd\x1c\x8c\x82\xc0\xbb\xd1\x8b\x78\xed\x91\x45\xb1\x79\xe0\xf1\x4a\xd3\xbc\xed\xa2\x04\x18\xf0\xce\xc0\x2b\x2b\x6d\x06\x68\x62\x86\xce\xcd\x6c\xf8\xd2\x6a\x38\x67\xc5\xfb\xa3\xcc\x87\x93\xa6\xf4\x3d\xd0\x38\x21\xee\x8e\xa6\x80\x34\xeb\x62\xa1\x31\x90\x1c\xcf\x5f\x00\x31\x85\x2b\x4b\xfe\x60\xe8\x61\x7f\x50\x94\xc0\x5f\x0a\x12\xa8\x4d\xb7\xac\x23\x34\xfd\xa3\x67\x73\x62\xce\xa5\x66\x76\xbc\x57\x33\x4e\xb9\x16\xa7\x0a\xcd\x62\xa5\x05\x8c\x6a\x18\xee\x9b\x20\x11\x37\xb6\x37\xd4\x31\x20\xf9\xae\x12\x27\x9d\xb0\x22\xa7\x69\xe3\xeb\x35\xe9\xee\x7d\xc8\x9c\xc3\xe3\x0e\xff\xa9\x26\xea\xae\xb6\x50\x78\x1d\x8e\x58\x98\xf7\x2c\x6e\x3d\x01\xe8\xe7\xc5\xdd\x6d\xfd\xe9\xe3\xe2\xf6\xe6\xef\xbb\xe5\x1f\x04\x12\x03\xf0\xdc\x1a\x08\x49\xe5\xb6\x91\xf6\xc1\x93\x26\x16\x33\xad\xfc\xd7\x5e\x2d\x22\x2b\x0f\x78\x29\x61\x24\xae\xd6\xe0\x2c\x18\x37\x1f\x3e\xa4\xf8\xa1\xd9\xc6\x67\x59\x87\x93\x1e\x2f\x2d\x8b\xe3\x69\x19\xc1\xb0\x8a\x84\x06\x4c\x36\x2c\xb0\xfe\x01\x96\x7f\x7a\x2f\x3f\x5d\x0d\xc6\x02\x4b\xac\x56\x03\xd2\x0d\xc8\x76\x20\xf7\xb5\x83\xc2\x35\x3f\xe5\xd1\x8a\xbf\x79\x2d\x72\xb3\x83\x64\xf8\xc3\xa8\x51\xfe\xf2\xa8\x51\x76\x2d\x6b\x34\x69\x88\xa4\x91\xb4\x03\x6b\xf9\x5f\xb9\x5c\x25\x40\x3b\xb7\xac\xb4\xa9\xdc\xb6\xc7\x20\x18\x35\x31\xa4\x6c\x14\xfb\xae\xb4\xf9\x9e\xe3\x0f\x99\x1d\x37\x94\x99\x6d\x7e\xcd\xf0\x46\xb9\x53\xe6\x39\x38\x59\x59\xc1\xea\x23\x7a\x88\x61\x8e\xaa\x65\x7c\x08\x16\x15\x37\xb5\x57\xfe\x92\x7c\x86\x67\x08\xb3\xd5\x23\x8a\x44\x0f\x33\xa6\xd6\x89\xd5\x8a\x04\x3b\x2b\xa6\x1e\xea\xb3\xf3\x83\x22\xd5\xbd\xb6\xcc\x4e\xbd\x88\x28\xe2\x54\x4c\x16\x92\x00\x2e\x07\x2e\xcc\x91\x7b\x80\x95\x08\xa5\x49\x9e\x63\x7e\xc2\x8f\x06\xa3\x90\x3a\xcf\xa0\x9c\x0f\x4d\x10\x6c\x95\x09\xfd\x9d\xc6\x7f\x58\x1a\xcf\x33\xb5\x4b\x70\xdf\x6c\xb2\x37\xa8\xc0\x5b\x25\x61\x9f\xe2\x31\x29\x22\x39\x6f\xcf\xa2\xe6\xda\xb9\x45\x40\x65\xd7\x29\x2d\x0c\xc4\xa4\x09\x30\xbe\x51\x9c\x91\x9c\xb1\xef\x0a\xf3\x41\xde\xd1\x39\x07\xe9\x92\xc0\x7e\x43\x22\xf3\xcc\x4f\x73\x9b\x6f\x58\x61\xb5\x60\xe9\x86\x45\x48\x91\x23\x93\x58\x52\xd2\x30\x8b\x8f\x02\x32\x1a\x21\x1a\x46\x4c\x8f\x4d\x9b\x51\xcf\x02\x32\x7e\x1a\xf3\x56\xf1\xb3\x0d\x5e\xe9\x4d\xa8\x4d\x03\xfb\xc3\x68\xbc\x3f\xe8\x66\x74\xba\x8e\xbe\xce\x75\xbd\x3b\x1d\x09\x13\xa2\xfa\x31\x58\xef\xef\x23\xf7\xc7\xb1\x2c\x77\x3e\x30\xf7\xeb\x00\x14\x74\x02\xf3\xc3\x73\xb6\xef\x2e\xa6\x25\x0b\xdf\xff\xfb\x5d\xfa\xfe\x61\xa5\x6f\x22\x88\xa8\xb0\x60\x00\x63\xcc\xf3\xac\xb5\x85\x88\xd2\x6c\xd3\xba\x2f\xd1\x83\x4b\x0a\x43\x7e\x4e\x75\x9e\xcb\x39\x3d\x56\xcf\x45\x81\xbf\xa9\x87\x8f\x15\xcd\x63\x3a\x3f\x96\xe4\x8d\x50\xef\xea\x55\x9a\x77\xf5\x7d\x2f\xc6\x52\x16\x24\x11\x9c\xeb\x6b\xea\x9a\x14\xc9\xc8\x13\x2f\x97\x33\x2c\x71\x9a\x39\x66\x8d\xa7\x3d\xc2\xd0\x94\x57\xa4\xa3\xe0\x17\xac\xe0\xfb\x66\x95\x9d\xd1\xed\x6b\x5d\xfd\x5e\xe7\x2f\xbb\x7a\xdb\x13\xd9\x43\x94\x2e\xa9\x18\x6f\x80\xdf\x63\x07\xf8\x1f\xf7\x5f\x1e\x1e\x9f\x77\x47\xd6\x45\x65\x4b\xb4\x10\xc3\x65\x3e\x6d\xf7\x15\xba\x05\x31\x7f\xf6\xb8\x08\xe0\xb1\xf2\x25\xc5\xca\x14\x65\x1c\x44\x2e\x52\x1c\xc4\x29\xfa\x6e\xcc\x63\x54\xf6\xfa\x8a\x01\x41\x25\x16\x4b\x0d\x46\xec\x1e\x41\xf9\x12\x77\xe5\x68\x38\xd8\xca\x85\x90\x2c\x6f\xc4\x14\xb7\xd3\x51\x52\x44\xb5\x76\xe0\xa3\x34\xdb\x89\xd2\x01\x29\xc2\xd2\x74\x3e\x51\x28\x2a\xc5\x35\x61\xaa\x78\xb5\xd7\x1a\xe8\x04\x4a\x6c\x3e\x08\x1f\xb5\xfe\xc7\x6a\xd3\xa3\x2c\xf1\x98\x09\xb9\xc5\xc9\x05\x0b\x6e\xab\xa4\x98\x1b\xf8\x7b\x7d\x5f\xc8\x79\xe4\x1a\xe7\x96\xbe\xc4\xf3\x45\xbc\xbc\xba\xd0\x79\x58\x54\xcc\xd8\xc3\xf1\xd7\xc3\xdb\xd3\x82\x3e\xda\xbc\x0f\xe3\xd0\xd6\x80\xdb\x90\x44\xdb\x2f\x9c\x29\xf6\x60\x80\xcd\x25\xd1\x66\x66\x63\xd5\xa4\x1f\x3e\x19\xb9\x8f\x0a\x29\x98\xd2\x1e\x60\x0f\xb5\x07\x28\xc2\x01\xb6\xc4\x8a\x36\x44\x99\x63\x14\xea\xcd\xed\x8e\x50\x50\xb1\x66\x59\xc5\x49\xb3\x42\x63\xec\x49\x5b\x2b\x5c\x57\x3d\x5c\x47\xdd\x79\x88\x71\x5a\x91\x29\xe3\x72\x18\xe7\x7f\xcc\x6e\xe9\xd3\xd6\xed\xf2\x88\x53\xf8\x43\x20\x3a\x5d\x81\xae\xbd\x46\x0b\xf7\x66\x56\x22\x57\x0e\x3b\x08\xfa\xef\xe7\xca\xa7\x61\xd8\x29\xae\x1d\x2b\xdf\xcd\x97\xb9\xe5\xab\x61\x54\xde\x52\x06\x25\xbe\x9c\xf2\x07\xa3\xd9\x9b\xf6\x2b\xe9\x29\x1a\xff\xf6\xdf\x7b\x15\x0d\x3f\xd8\xf0\x2c\xeb\x73\x71\x41\x95\x1f\x64\x08\xe2\x95\x0b\x97\x56\x56\x30\x54\xa6\x18\xc2\xda\xf6\x61\x5d\xfa\xf5\x76\x88\x0d\x30\x69\xe9\xcb\xa9\x94\x0c\x8a\x60\xc4\x7c\x61\xdc\x56\xf1\xc6\x14\x80\x9e\xe5\x1b\xec\x88\x3f\x82\xfe\x7c\x27\x09\xea\x89\x8a\xbb\x5d\x84\x32\x56\xed\x14\x32\x0e\x55\x33\x5e\x71\xa8\xa7\x2b\x1a\x7d\xfc\xe0\x7f\xd6\xe2\xfd\x79\x31\x62\x82\x78\xfb\xd7\xe6\xe6\x67\xc9\xb0\xfe\xaa\xe8\x74\xa2\xfc\x2f\x11\xcb\xc6\xce\x03\x38\xa3\xa4\x69\xec\x35\x1a\x21\xba\xa5\x81\x98\x36\x33\xda\x4e\x24\xdb\x0f\x39\xdd\x1e\xd1\xfe\xdc\x88\xfd\xdd\x49\xfe\x18\x14\x51\x77\x8f\xd6\xb8\x88\x7b\xb7\x08\xff\x32\xdc\x2a\x32\x25\xc6\x59\xe7\xab\xdc\x8b\xe4\xd4\x42\x2a\x7d\xb3\x13\xaf\x20\x3a\x85\x9a\x91\x5e\x20\x1d\x6c\x48\x87\xfc\x92\x16\x6e\x0c\xb5\xb8\x2d\xd4\x72\x84\x22\xf0\x2d\x47\x76\x72\xf4\xe6\x56\x64\xe8\x07\x21\xee\x57\x2f\xbe\x3d\x9e\xbc\x2b\x06\xaf\x8b\x71\x27\x45\xef\x6d\xc7\x37\xde\x48\xb6\x05\x77\x85\xf8\x5a\x28\xf6\xfd\x28\x05\x7f\xfd\x52\x3f\xcc\x3f\x7d\xac\x1f\xbe\xee\x71\x45\x2c\xc0\xa0\x42\xb3\xf2\xe4\x21\x69\x0d\xcd\xb1\x00\xde\xc9\xa5\x6d\xd0\xa6\x00\xeb\xe4\x60\xb1\x90\xe4\x24\x45\x7b\x1a\x5e\xe8\x04\x5e\x79\xc0\x99\x84\x78\x4a\x93\xa1\x8e\x90\x0f\x87\x54\x02\x4f\xb9\x69\x6e\xc8\x91\x16\x45\xa9\x0f\xed\x4b\xf9\x73\x16\x9a\x6c\x2d\xad\xda\x86\xf9\x90\xcf\xd6\x39\xd3\x34\x90\xd1\xe0\xcd\x5c\x82\x51\xe2\x3a\x94\x25\x6a\x07\x56\x45\x1e\x68\x6c\x47\x8b\xfc\x80\x53\x51\x85\x7c\x90\xb5\xca\xff\x51\x28\x88\xb5\x86\x22\x42\x20\xf0\x0e\xcc\xcc\xab\x15\x5e\x79\x30\x51\x91\x2f\x09\x85\x1a\x4c\x9c\x47\xb5\xa2\x6c\x48\x46\x1f\x94\xcc\xfd\x25\xe7\x12\x89\x94\x8d\xae\xeb\x01\x6c\x14\x15\x80\xb6\xd6\x8e\xff\x5f\xb9\xc1\xd9\x63\x63\xd4\x0d\x0a\x53\x25\x87\x82\x1d\x12\x25\x55\x54\x98\x6a\x02\x17\x14\x37\xdd\xcf\xae\x3b\x9b\x4a\xdb\x79\x5b\xc3\x3f\x5d\x03\x32\x19\x51\x4d\x9c\x05\x08\xa8\xa4\x39\x0a\x09\x23\xe6\xa6\xc1\x28\x05\xe4\xc4\x41\x33\x32\x41\x65\xd3\x48\x43\x33\x06\x8a\xa0\x19\x49\xcf\x48\x4e\xcc\x36\x57\xb9\xdc\x57\x73\x3c\x63\x02\x7b\x48\x4d\xec\x66\x01\x84\x7b\x49\x6b\xd6\x21\xad\xf6\xb5\xf7\x23\xa2\xc3\x76\xf7\xb7\x46\x85\x27\x16\xa3\x2c\x24\x88\xd1\x80\x65\xdd\x11\x59\x77\xc4\x95\xee\x08\xde\x68\x40\xc9\x65\x57\x30\xb8\x01\x5d\xa6\xc6\xa3\x98\xb9\x95\xf4\x4c\x76\x5f\xc9\x82\xd3\xf4\xd0\xc9\xf8\x49\x48\xb9\x69\x26\x05\x3e\x82\x25\x35\xcc\x12\x25\xa9\xe5\x92\x6d\x7d\x62\x8a\xf6\x0d\xe6\x32\x18\x25\x8f\xd6\xdb\xe1\x32\xdf\x81\x62\xdc\x4f\x92\xfc\xf0\xcf\xcf\xaf\x20\x49\x79\xa7\x52\x2b\x0b\xc9\x93\x31\x29\x8a\x73\xa3\x5a\x14\x29\x34\xbd\x21\x91\xc9\x41\x91\xba\x83\x53\xb4\x60\xce\x78\x6e\x09\xca\x43\xd1\x0d\xb3\x82\x80\x40\x49\x0e\x15\x22\x24\x5b\xa1\x5f\x1f\x29\x08\xc4\x54\x51\xc9\x9d\x5a\x33\x7f\xd3\x03\x26\x87\x46\x51\x80\x10\x6b\xa7\x9c\x72\xda\xf5\xbf\xac\x11\xc2\x54\x3e\x5d\x6f\x6c\xf8\x13\x54\xd2\x49\x10\x83\xb2\xe0\xd3\x7c\x72\x29\x68\x42\x52\x98\x0d\x49\x61\x3d\xee\x57\x15\x8b\x76\x90\xcf\xbb\x94\x34\x95\x94\xf4\x76\x28\xed\xc4\x9c\xaa\x5d\x3a\xfb\x26\xd2\xc1\x2b\x53\xdf\x89\x82\xd8\x99\x84\xca\x97\xb7\xbb\x56\xc6\xf4\xc7\x60\xc2\xdb\x94\x84\xfe\x54\x7f\xfd\xf5\xee\xf3\x6e\x7f\xd6\x24\x7e\xd9\xbe\xa4\x54\x45\x88\x66\x70\x72\x40\x38\x73\xcc\x5b\x1c\xe0\x4a\xd4\xf4\xe2\x01\xcc\x34\xb4\x92\x31\x95\x87\x68\x4a\xdb\x7d\x59\x49\xbd\x19\x0b\x11\x67\x86\x97\xcf\xac\xd6\x50\x45\x49\x68\x9c\xd4\x7a\x29\x02\x10\x29\xa2\xce\x15\xa7\xc8\x94\xb4\xec\x0f\x29\x9b\x08\xc3\xd0\x44\xe8\x17\x38\x5f\x8f\xc6\x69\x07\x4e\x86\x2d\x19\xa9\xda\xcb\xed\x44\xaf\xef\x89\x15\xaa\x30\x5b\xf7\x65\x0a\x45\xb6\xa4\xb0\x0c\x32\x8b\x8a\x5c\xe9\x5e\xfe\xa0\x38\x9b\xa3\x2b\xad\xc0\x6d\x91\xaa\xd0\xc1\x2d\x46\x54\xa2\x4e\x1f\xe8\x59\xd4\xb4\x6a\x08\x0b\xc9\x93\x85\x19\xf6\x8b\x58\x61\x5c\xd0\x36\x90\x19\x51\x10\x7b\x30\x33\x24\x40\x3b\xc4\xe7\xf6\x85\x23\x98\x16\x11\x96\x1a\x7c\x49\xe1\x98\xc1\xa8\x37\x08\x55\xf0\xfe\x92\x18\x45\x5d\xe2\xee\x48\x49\xf3\x63\x20\xf3\x7b\x2c\xee\x81\x47\x2b\x2b\x66\xc7\xdb\xcb\x66\x9d\x31\xd2\xe0\xdc\x8f\x82\xf8\x16\x0a\x71\xfb\xb2\x4a\x9a\x3c\x43\x70\xf8\x63\xf2\xf5\x1f\x26\xba\xf7\xf7\xb7\x25\x4f\xe2\x40\xd0\xdf\xbd\xf6\x9f\x77\xff\x3e\x76\x83\xf7\xf0\xe0\xd1\xbb\x40\xc7\xf3\x54\x7b\xb0\x4e\x33\x7e\xfc\x5e\x48\xed\x7b\x8a\x14\xfe\xf7\xfa\xe1\xcb\x97\x8d\x9a\xe8\xeb\xb5\x0d\x60\xbc\xb2\x65\x37\x58\xc0\xaa\x2d\x8e\x06\xfd\x0b\x9a\xaa\x08\x21\x4a\x81\x77\x53\x94\x88\x15\x51\x49\xee\xfa\xde\xa9\x82\x25\x61\xa2\xa1\x47\x15\xf6\x57\x7b\x19\x4b\x5f\xf9\x85\x5d\xfa\x97\x7c\xd2\x90\x2a\x29\xda\xef\xf0\x52\x22\x6c\x37\xf3\x1e\xec\x15\xe0\x2f\x5e\x0c\x7b\x5f\x34\x85\xee\xa7\x1b\x34\x82\x8f\xb5\x06\x6b\x34\x98\x66\xfc\xbb\x7d\xf4\x0e\x87\xfc\xfe\xd0\xf6\xe1\x92\xfc\x30\xdb\x7c\x93\x8f\xe8\xd4\xc5\x5a\x04\x30\x6e\x6e\xc0\xb1\x30\xe8\x56\x52\x5e\x08\x0d\xae\x2d\x12\x50\x6a\x3d\x83\x8f\x58\x1c\x89\xf5\x18\xb9\x06\xef\x5a\xc7\xd6\x59\x9d\xca\x93\xbc\x00\xbf\xa8\x08\xc1\xcd\x10\x78\xe8\x6b\x93\x1d\x38\x45\xc5\x02\xcd\xe0\x06\x79\x09\xd2\xbe\xbe\x22\xab\xd0\x96\xb8\x46\x2f\x56\x72\x18\x2f\x68\xc9\x7c\x68\x35\x26\x54\xf2\xe4\x14\x89\x52\xd7\xe9\x37\xba\x2e\x60\x3a\x17\x0a\x1a\x76\xb8\x73\x68\x0e\x9c\xdd\xd4\xcf\x20\x78\x1d\xcf\xc0\x64\x4e\x81\xf1\x77\xb8\xa7\x5e\xec\x89\x40\x1b\xd4\xa9\x90\x14\xe9\xbb\x96\x69\xe1\xc1\x45\x7e\x29\x28\x93\xad\xc6\xdb\xfc\x4a\x8f\x66\x3b\xd3\xaf\xca\x0f\x2e\x0c\xe3\x81\xe9\x4d\x3f\x3e\xdc\x7f\xf9\xba\xad\x92\xf0\x43\xfd\xdb\xaf\x0f\x9f\x2f\xbe\x3c\xdc\x7d\x7e\x7e\xfa\xc3\x87\x04\xfe\x82\x08\x62\xbc\xe0\x5f\x58\xf0\x9f\x16\x6c\xf3\xcb\x41\x8a\x17\xe9\x22\xff\x6f\xfd\x98\xfc\x9a\xc6\x3a\xe9\x55\x28\x4d\x51\x91\x59\x50\xe5\x07\xb8\x50\x28\x53\x80\x53\xae\x74\x1b\x37\x2c\xeb\x79\x15\x99\x83\xa2\x9b\xf6\x66\x26\x50\xe4\x96\x06\xec\x8c\xc0\x4b\x8d\xab\x66\x00\xe0\x95\xc1\xd2\x48\x0c\x45\xff\x16\x81\x24\xe4\xae\x58\x9a\x34\xa4\x0c\xd8\x39\x78\x68\x79\x22\xff\x2c\xa5\xe2\x4e\xef\xa2\xe6\x17\x3c\x38\xb3\x48\x90\xdc\x1c\xc1\x5b\x25\x4d\xa3\x72\xf0\x24\x17\x01\xd0\x6c\xbb\xa5\xb1\x34\x87\x58\x85\xf7\x96\x37\xfa\xce\xe7\x7b\xba\x4c\x92\x78\x76\x8c\xc8\x15\xe3\xfa\x22\x31\xbd\x1a\xee\xdf\xb4\x83\x58\xf3\x3b\x4c\xe0\xbc\x4a\x65\xac\xe4\x8d\xb3\x1d\x4e\x33\x35\x50\x01\x01\x5b\xb9\xee\x08\xcc\x3f\xfa\xe8\xf9\xf1\xf6\xe6\xf9\xa2\xd9\xa1\x7e\xfb\xc3\x07\xe6\xd4\x1f\x2e\xfe\x79\xf7\xe9\x79\xf1\x87\x0f\xf4\xe1\x62\x71\x7b\xf7\xeb\xe2\xf9\x0f\x1f\x02\xf8\x93\x4e\x8a\xdf\x32\x17\x1e\x33\x93\xc3\xeb\xfa\x7c\xf7\xa4\x76\x62\x0c\xda\x8e\x12\x33\x45\xd0\xb8\x17\xc1\xab\x20\xfa\x68\x98\x0d\x5f\xdd\x5e\x50\x66\xb2\x43\x6a\x11\x1d\xf3\x96\x34\x75\xde\xc9\x31\x55\x6d\x48\x6c\x4a\x2b\x66\x53\x26\xf0\xc2\xa2\x4a\xb2\x50\xc4\xcd\x04\x1d\xf9\xf1\x1f\xa8\x26\xa5\x81\xc8\xd2\xde\x8d\x06\xe3\x20\x69\xf1\x96\x10\xb7\x09\x8f\xfc\xa3\x44\x03\xc1\xde\x68\x31\xff\x6a\x04\x62\xd4\x97\xbb\x5a\xee\x2e\x11\x82\x9b\x89\x84\x4a\xad\x82\xd1\x90\x5b\xc1\xe4\x66\x37\xef\x39\x71\x20\x71\x15\x4d\x61\xb2\x0e\x0a\x8b\x92\x52\x45\x76\x61\xaa\x20\xae\x2a\xac\xbf\x63\x37\x03\x1b\xe3\x6f\x8b\xfb\xbd\x5b\x92\xe2\x2b\x54\x64\xcb\x29\x6a\x4e\xbc\x3d\x50\x1e\x29\xa8\xb7\x7b\x13\xa5\xcd\xbd\xc9\xac\xf7\xa6\xb8\xb1\x37\x4d\x12\x8b\x26\x2b\x8a\xe2\xa0\x94\xc4\xe1\x06\x81\xd2\x91\x0b\x78\x6a\x15\xbe\x57\xdf\x23\xc7\x57\xef\x1b\x6b\x46\x79\x83\x48\x7a\x4a\xf4\x5c\xa6\x7f\x03\xde\xef\xa8\x84\x76\x24\xde\x9c\x52\xe6\xad\xad\x5c\x3c\x0f\x8c\x38\xa1\x3d\xf6\x40\x6d\x14\x90\x70\xaa\xe9\xca\xb3\x4d\x65\xec\x38\xd4\x33\xfc\xee\xe9\x4b\x3d\xdf\x7d\x82\x60\xa4\xcc\x20\x0b\x4e\x03\x81\x83\x94\x05\xb7\x24\x1c\xea\x9e\xc0\x58\xb2\xa0\x34\xbc\x6e\x15\x39\x70\x95\xdd\xd4\x56\xa5\x87\x6b\x06\x36\xb9\xd2\x56\xae\x3c\xb9\x60\xd5\x40\x5b\x0f\x10\x2e\x22\x04\x7f\x41\x11\xd0\x34\x3f\x13\x24\x7b\x11\x00\xfd\x85\x07\x5c\xff\x20\x73\xc1\x8f\x37\xff\xf0\xa3\x13\x39\x4b\x7b\x65\x88\x65\x11\x92\x6a\xb2\x12\x64\xb0\x4e\x12\xe3\xa4\x6e\x65\x25\xe3\x2b\x99\x4f\xda\x8a\x12\xb8\x99\x05\x06\x33\xad\x19\x14\x06\xfe\x0c\x1a\x88\x66\xde\xbf\x09\xc9\x74\x3f\xc2\x78\xdb\x7c\x64\xd0\x9d\x54\xb2\xb4\xfc\x19\x06\xc1\x20\xe7\x0e\x79\x28\xfc\x1c\x12\x41\x5a\x9d\x02\x6b\xec\xc6\xd0\xf8\xc3\xea\x89\xed\xd3\xa6\x7f\x0f\x30\x99\x20\xae\xaf\x53\x4e\x90\xaa\x86\x44\x08\x21\x86\x4b\x32\x53\x92\xe6\xd6\xaa\xb3\x27\x2b\xe9\x5b\x68\xb1\x43\x5c\x17\x98\x56\xc4\x59\x80\xa7\x7d\x14\xf9\xee\x33\x7e\x90\x7c\xf0\xbb\x20\xae\xd3\x74\x6c\x0f\xac\x08\x96\x01\x42\xc5\x28\x58\x92\xd9\xf4\x0f\xb3\x86\x85\xa6\xd2\xc3\x31\x3e\xd0\x87\x08\x19\x2b\xd2\x66\xe5\x7d\x78\xd2\xa3\xc0\x39\x4d\x13\xd2\x7a\x9b\x95\xa0\xd7\x49\x3b\x94\xef\xd9\xdb\xfb\x68\x2a\xf8\xa6\x08\x7c\xcc\x39\xe2\xb7\x93\xc4\x24\xa3\x75\x34\xa5\xab\x42\x69\xc6\xe6\xcd\x9c\x48\xfa\xf9\xf6\xcb\x30\x41\x5d\xc2\x75\xbd\xdf\xa5\x07\x9b\x01\x27\x16\xe9\x6f\xb1\x45\xbf\x27\x8e\xf9\x1e\x71\xee\xa4\xea\xa4\x52\xe5\xd6\x9a\x65\x04\x8b\x19\xd9\x9a\x4d\x83\x92\x92\x66\xbd\x69\xd8\x33\x6c\x1a\xdd\x1d\x52\xb5\x83\xf9\xee\x93\xcd\xfc\xe5\xf6\xf1\xfe\xee\xf3\x7c\x4f\x61\x6f\x52\xae\xb4\xdd\xbc\xbb\x2a\x54\x94\x86\x87\xf7\x34\x38\xbc\x0f\x9d\x37\xf8\x13\xd7\x57\x56\x05\x96\xe5\x13\x50\x69\xf9\x2f\x4a\x15\x16\x10\x45\xbe\x3f\xd5\xff\xad\xb5\xf9\x61\x10\x9b\x1f\x8b\xcd\x8d\xc5\xcf\xaf\x2d\x7e\x74\x88\x52\xbb\xc5\xc7\x6e\x28\xd4\x5f\xa0\x03\x1f\x2f\xd0\x40\x48\x17\x18\x21\x5e\x84\x0b\x42\x48\xc8\xff\x5a\x40\xbc\x40\x0f\x8d\xb0\x9f\x7f\x05\x88\xe9\x22\xf0\x1b\x96\x1f\x96\xf7\x0f\xd1\x2a\xa7\x9d\xf8\x58\x2d\x6d\x0c\x28\xc6\xcf\x77\x0f\xbc\x4e\xd3\xc2\xf6\x79\x45\xf6\xb5\xc9\x54\xda\x8c\x7a\x18\x99\xa5\x4b\x29\x0c\xb3\xce\x84\xd0\x96\xcf\x05\xab\xc1\xf3\xb3\x83\x83\xd6\xc3\x89\xe1\x68\x25\xd3\x8c\x9a\xde\x6b\x6c\x63\x93\x29\x73\x53\xe3\xf4\x18\xe5\xe8\xd5\x31\x7a\x8c\xf2\xb4\x0f\x9f\x57\xda\xd3\x0a\x95\x79\xcb\x97\xd4\x9d\xa8\xa4\x69\xf6\x65\x51\xe3\x6c\x67\xaf\xec\x9d\x8e\x6a\x39\x58\x55\xdb\x8f\x5b\x8f\x40\xf3\xf3\xe9\x57\x9b\xc0\xd8\xb7\x5f\x4e\xa4\x61\xed\x5f\x81\x69\x76\x45\x0f\xc2\x98\x22\x56\x68\x00\x43\x8d\x12\x80\x9c\x96\x04\x45\xac\x75\xf3\x57\x45\x08\x21\xd6\x1e\x1c\x6a\x73\x7d\x45\x06\x44\x38\xb1\x25\x86\x8a\xcc\xc2\x83\x6c\xa8\x09\xa8\x6a\xb7\xd8\xd1\xaa\xd7\x38\xae\xb9\xbf\xce\xf8\xd4\x8c\xf2\x0a\x05\x2a\x09\xa2\xd9\x0e\x02\x9d\xff\xe9\x83\xec\xfa\xde\x83\x57\x0e\x5c\xe8\x80\xe5\x78\xd5\xe7\x4d\xf3\xdb\x23\xe3\x61\x5e\x0e\x1c\x18\x3a\xf4\x6b\x0f\x21\x6a\x0b\xe6\xdb\x33\x91\xde\x69\xd8\xca\x49\xf7\xdc\xa8\xf1\xb2\x86\x72\x0a\x2b\x3a\xca\x67\xf7\x62\x8f\xe7\xe6\xa7\xdb\x9d\x82\x3b\xef\x4a\xa8\x90\xc0\xa5\x5e\x0e\x51\x93\x34\x90\xbf\x74\x92\x53\x82\x97\xb7\x97\x88\x1a\xc1\x3b\x06\xa5\x51\x16\xac\xeb\xa5\x12\x45\x31\x0a\xba\xcb\x28\x28\x1f\xe4\xc8\xd5\x48\x0a\x18\xdb\xcb\xb0\xb1\xea\x76\xba\xa0\x16\x20\xcc\x63\xad\x79\x7d\x8d\xe6\xb1\xcd\x3a\xe9\xcf\x08\x1c\x0f\xa3\x76\x20\x3e\x50\xde\xe8\xd5\xaf\x5e\x16\x35\x1e\x78\x3b\x41\xdd\x99\x60\x0b\x1b\x7f\x58\xa2\xc5\x3d\x63\x46\x56\x9d\x99\x3d\x9a\x39\x24\x48\xab\x1e\x8a\x04\xde\x5f\x32\x53\x95\x52\xe6\x94\x3a\xb7\x95\xd4\x64\x83\x22\xd5\x40\xa4\x8a\xde\x9d\x18\x34\xf8\x58\x1b\xa9\x01\x68\x20\xe2\xac\x73\x77\xdd\xd9\x41\x87\x54\xfb\x86\xff\x56\x91\xe7\x04\xa5\x65\x35\xb7\x08\xce\x2b\x44\xf0\xa4\x8e\x5d\x88\x4b\x96\x09\x8d\x42\x0b\x76\x6e\xc0\x25\x25\x4d\x6b\x67\x41\xaf\x09\xc2\xa9\x89\x89\xc6\x52\x04\xf1\xba\x88\x04\xe8\x6d\x6d\x80\xa4\xd8\x38\x4e\x4d\x01\xef\x7a\xca\xf7\x48\x2c\x47\x6a\x43\x6f\x88\xf3\x9e\xac\x2c\xbd\x2d\x4e\xfc\xbd\xa8\x3b\x3d\x39\x63\xf6\xe5\x4b\x7d\x77\x33\x7f\xbe\x7b\xd8\x48\x22\xd4\x2a\xeb\x4e\x74\xf5\xb0\xcd\x0b\xfc\x00\xbb\xdb\x3e\xdb\x5e\x9a\xa4\x87\x6d\x9b\xf6\xca\xe0\x60\x26\xe9\x62\xef\xc6\x6a\x48\xd9\x81\x54\xbc\x2d\x16\x6a\x28\x15\xfb\xbe\xe2\x28\xfa\x9e\x2f\x0d\x2d\x6d\x6b\x4e\x35\x45\x85\x98\xcd\xa9\x66\x57\x59\xbb\xad\xb8\xf0\x2d\x46\x7b\x5f\x28\xcf\x03\xad\xfc\x16\x3f\xa7\x03\x74\xd3\x23\xb0\x6d\xe7\xc1\xdd\x24\x98\xb6\xe3\xeb\x7b\x4d\xb5\x07\x60\xd9\x8e\xcf\xdb\x3d\xb4\xfa\xaf\xf3\xe7\xe7\xdb\xc7\xdd\xbe\x6d\x2c\xfd\x24\x39\xe1\x09\xbd\xcd\x8a\xa5\x99\x9a\xc0\x29\x0b\xc6\x6a\x9f\x95\x3a\x07\x24\x89\xe7\xba\x1b\x9b\x42\x08\x49\xb3\xde\xaf\x0d\x33\xf3\x00\x45\x54\x92\x5f\x0d\xa1\x38\xac\x82\xd4\x3e\x59\x41\x52\x72\xd8\x92\x4c\x65\xc0\xb1\x20\xe0\xa4\x22\xf2\x6a\x93\x47\xb0\x8c\x7b\x68\xb7\xdd\x95\x6c\x0b\x2e\x56\xb9\xd6\x00\xdf\x8f\x7c\x3f\xb6\xf7\x93\x72\x10\x63\x65\x08\x90\x36\x6e\xca\x2b\xca\xd8\x52\xc6\xb0\x71\x9b\x82\x92\xf7\x2a\xb7\xed\xcb\xcd\xb8\x73\xb8\x34\x95\x88\x95\x5f\xd8\xca\x2e\x24\x6e\x7b\x32\xe5\xe2\x55\xd6\x70\x02\xd1\xfb\xfb\x90\x00\x0f\xb7\x9e\x90\x6b\xe2\xf8\x07\x2b\x0e\x14\x6b\x04\x6f\x35\x49\xae\x6f\x70\x41\x49\xf3\x66\x70\x78\x82\xbc\xa4\x67\x96\x55\xf0\x50\xd3\xec\x6b\x11\xc7\x89\x62\x2a\xa3\x10\xaf\xfe\x10\x87\xc4\xe8\x36\x0b\x60\x83\x0a\x6d\x96\x4f\x94\x64\x63\x79\x44\x6f\x0f\xa5\x08\x62\x18\x16\x72\x6c\x26\x37\xb1\x50\xbc\x06\x1e\x29\x5b\x11\x78\x9a\xad\xe2\xdc\x06\xb0\x58\x07\xc0\x15\x1a\x5c\x04\x4f\x02\x85\x19\x0b\xf9\x22\xe9\x77\x40\x50\x84\x25\xc5\xae\xa2\x55\xc8\xb4\x7d\x17\x45\x34\x24\xbb\xd4\xfc\xd8\xe0\x03\xe4\x85\xfb\x4b\xd6\x70\x72\x60\xed\x1c\x81\x98\x39\x35\xef\x11\x20\xb3\xa6\x22\x5c\x22\x81\x17\xbe\xe1\x7c\xed\x73\x7a\xb7\xa4\xbb\x8f\x4b\xdd\x7b\x28\xa2\x46\xa0\xda\x42\x34\x2a\x82\x09\x97\xe8\x21\x29\x8c\x30\xbe\xd0\xfd\x9b\xe6\xc8\x47\x86\xb3\xef\xc5\x86\x6e\x2a\x83\xde\xd9\x2e\x15\xa2\xaf\xba\x9a\x20\x78\x65\x21\xa4\x35\x38\x6b\x03\xc6\x2b\x0f\xc1\x4c\xb4\x64\xac\x62\xa2\xdb\x75\xbe\xbc\xca\x8c\x40\xf4\xed\x51\x77\x2b\xe3\x3f\xc0\xa7\xea\x8c\x46\xf0\x83\x19\xfe\xde\xda\xb6\xaf\x03\xdc\x6d\x2c\xb0\xa9\x65\xfb\x7a\x9c\x61\x8c\x5b\xd2\x6e\xbd\xe2\xea\xe1\x97\xbb\x7a\xf7\x69\x03\x49\xed\x38\xec\x28\x7e\x69\x9b\xaa\x48\x6e\x5f\x45\x6f\x27\x15\xbd\x51\xf9\x92\x5c\x45\xfc\x3d\xd6\x1c\xc9\x56\x92\xb9\x79\x79\x88\xfc\x3c\xc6\x4b\xe8\x1c\xb6\x84\x73\x00\x24\x49\x06\x94\x50\x51\x5c\xd0\xf5\xbd\x8e\x9a\xf5\x68\x3a\x28\x04\x75\xf7\xba\xfe\x65\xfe\x4b\x7d\xbb\x51\x82\x78\x08\xaa\x74\x06\xc3\x4e\xf7\xec\x71\x98\x96\x8a\x45\xe9\x97\xf2\xc3\x74\xed\x12\xfc\x09\xc1\x95\x4a\x52\x7d\x97\xbe\xb2\xd7\x57\x5e\x19\xaa\x28\x96\xa6\x38\x08\x75\xf6\x2e\xeb\x54\x63\x95\x55\x25\x5e\x55\x53\x2c\x88\xc7\x4a\x2c\x97\x99\xa2\xa2\xed\xbe\xae\x87\xad\xea\x7f\xde\x3e\xff\xf3\xe1\xf1\xef\xff\x51\x3f\xfc\xb2\x87\x66\x3d\x8b\x86\x86\x16\x1a\x63\xdf\xcb\x73\xd1\x2f\x4f\xab\x0f\x8b\x4d\xdb\x27\x9c\x4b\x7d\x12\x9a\xa3\x55\x6d\x3a\x45\x2d\xbf\x6f\x0a\x95\x5d\x46\x20\x26\x28\x58\xa6\x35\xa6\x2e\x54\xb1\x28\x66\xed\xb3\x32\xbe\xfc\xbe\x2c\xf5\x5c\x0a\x00\x36\xec\x35\x82\xb5\xca\x80\x8d\xfc\x21\x63\x1a\x13\x6e\xa1\x70\xc6\xfa\x00\xaa\xdc\x36\x4c\xda\xaa\x08\xce\xcc\x89\x1f\xa4\xfc\x74\xd6\x11\xd0\x6a\xf0\x58\x6b\x20\xa7\x8a\x1b\x0d\x48\x1a\x2c\x69\xc9\x82\x1f\xad\x06\x43\xcc\x71\xc3\x93\x96\x27\x23\x6a\xc0\xc4\x57\x68\x86\x28\xf9\xea\xb1\xf5\x8a\xc5\x66\xa8\xf6\xfa\x5e\x1b\x16\xab\xc3\x0c\x83\xc2\x95\xfc\xee\xe4\xf1\x62\x9e\x59\xb6\x87\xf6\xf0\xc8\x00\xa2\x0a\x2a\xd7\x3e\x58\xc9\x4f\x9a\x78\x6f\x72\x41\xe2\x5e\x35\x90\x86\xa0\xc1\x6a\x94\x22\x31\xe8\x15\xae\xf2\x6b\x41\x32\x3a\x17\x5d\x97\x9a\x3f\x32\x11\xf9\x7f\xb0\x81\x95\xa0\x70\x7d\xaf\xad\x36\xe0\x19\x4e\xc4\x0a\x0d\x58\x03\xac\xa3\xb2\xb4\x62\x2d\x48\x90\x15\xc3\x04\x81\x21\xd4\x1f\x06\x02\xca\x37\x19\xa8\x86\x54\x6e\xf3\xf7\x1d\xcf\xc3\x02\xc9\x9a\xac\x96\x05\x0b\x96\xb3\x3c\x50\xe0\x25\x43\x07\x01\x67\x04\xc6\x2a\x69\x1a\xbe\x08\xa4\xc8\x40\xb0\xb5\x96\x44\x13\x02\x4b\xab\x72\x9b\x3f\xe3\x20\x0a\x90\xa8\x06\x14\xa0\x0f\xe1\x26\xa9\x93\xb5\x95\x88\x6b\x30\x98\x9b\x86\xfc\x80\x22\x78\x39\x47\x71\x6d\xdb\x0e\xd9\x38\xe5\xc0\xbb\x1b\xb0\xbc\xac\x10\x0d\x38\xd9\x62\x1d\x04\xcf\xe3\x24\x45\xeb\x19\x62\x62\x39\x97\xf2\x9a\x59\x95\xdb\xa2\xf1\x92\x20\xc5\x2b\xb7\x31\xb7\x3c\x7f\xa2\xeb\xfb\xa0\xfc\x7c\x03\x49\xb4\xe3\x61\x23\x38\xac\x59\x5c\x81\xc2\xcf\x37\xbe\x00\x4e\x16\x4e\x36\x76\x6b\x9a\x36\xdf\x0b\x5a\xbc\x97\x59\x87\xa5\xd6\x01\xba\x50\x46\xcb\xc9\x66\x90\x9a\x61\xd2\x36\x9c\x0a\x0c\xb1\x44\x21\x00\x98\xf5\x56\x29\x53\x55\xbc\xbe\x17\xef\x89\x08\x69\x83\x36\xc0\x18\x5e\xfd\x3c\x8a\xdc\x34\xbd\x81\x49\x3a\x80\x09\xff\x80\x20\x00\x45\xb0\x51\xce\xba\x3a\x1d\xb0\xc0\x15\x81\x66\x1d\x54\x95\x33\x97\xc0\x40\xc5\xc3\x6a\xf3\xec\x57\x66\x4e\x64\x68\x13\xd8\xb8\x4c\x36\x35\x38\xb0\x0b\x4d\x42\x65\x42\x7d\xc2\x91\xb0\x0b\x15\xcd\x0b\x91\x31\xae\x43\xc1\x4e\xcb\x81\xd4\x1e\xf0\xc7\xd0\xb4\x2d\x82\x78\x12\xbf\xfe\x92\x24\x60\x0d\xc5\x17\x1e\xd7\x1e\xf1\x1a\x73\xf0\xf8\xf9\x78\xca\x0c\xc5\x46\x92\xdb\x56\xc9\x91\x34\x48\x35\xc4\x20\xf8\x3d\x6f\xcc\x32\xb1\x3d\x27\x2f\xb4\x07\x93\xd4\xe6\x54\x4f\xe4\xc2\x91\x55\xd1\xd6\x2c\xc1\x62\x77\xd6\xf2\xc8\x28\x33\xeb\xec\x3a\xca\x30\xca\xa3\x1f\xb1\xef\xc8\xd3\xc8\x74\x8c\xfe\x63\xf3\x83\x19\x92\x91\x28\x09\x74\x92\x9c\xa7\x5d\xf3\xeb\x7b\x4d\xa8\x13\xa0\x79\x67\xb0\xef\x0c\x76\x83\xc1\x9e\xcd\x23\xe4\xf5\xed\x38\x87\x99\x8d\x47\xdb\x72\x26\x60\xe9\xa7\x3a\x41\x48\x60\x90\x01\xe3\xe6\x81\xf9\x68\x58\xa7\xd8\x45\x70\x80\xae\xd6\x22\x5b\x0a\xf6\x49\xf0\x54\x6a\xfd\xaf\x99\x83\xf9\x03\xd9\x7b\x9f\x4b\x2a\x82\x10\xb5\x03\x8c\x6a\xe8\x9a\x89\x60\x50\x43\x64\x4c\x5c\x09\x96\x9a\xc0\x4b\xea\xf0\xb3\xf1\xfa\x6e\x6f\x22\x46\x0b\x31\x04\xa6\x99\xb0\xaa\x0f\xa5\xc1\x79\x06\x4e\x9a\x35\xce\x56\xd2\x7e\x4b\xe9\x5b\x5c\x55\x95\xdb\x12\x52\x6c\x34\x1d\xb6\x11\xcc\xbb\x0a\x08\x05\xf0\x51\xb3\x56\xbe\x62\xbc\xef\x8c\xfe\x9d\xd1\x8f\x66\xf4\xc7\x9d\x12\x4d\x7a\xa2\xb6\x3d\x42\xf0\x3c\x3c\xf8\x98\x23\x09\xb4\x10\x48\x25\x88\x61\xde\x67\x42\xa8\xa5\xd8\x9d\x30\xa1\x15\xcf\xe2\xd5\x48\xac\x61\x93\xb9\x01\x63\x81\x0c\xf8\x24\xcb\xab\x98\xb9\xf5\xe9\x8e\xd1\xd9\x45\x2d\x87\x66\x3d\xb4\x2f\x04\xe9\x74\x57\x49\x67\x4e\xd5\x0e\x64\x74\x34\xf8\x37\x30\x7d\x5c\x51\x04\x89\x55\x2f\xd2\x7c\x88\x9a\x4c\xb8\x86\x98\xfb\x0e\x70\x59\xb2\x37\x79\xda\xc0\x7c\xd4\x21\x47\xc0\xf6\x68\x45\x08\x49\x20\x9d\x98\x1b\xb3\x38\x20\x14\x67\x54\x6e\x9b\x2f\xb2\xe6\x47\x10\x6b\xb1\xb4\x0c\xf8\x39\xf3\x11\x13\xb4\x9c\x42\x0e\x88\xbc\x43\xff\x7d\xc6\xc0\xfc\x28\x32\x67\xe4\x7d\x4a\x18\xbf\xcd\x8c\xdf\x0a\x9b\x77\x9a\x79\xc9\x90\xf9\xa0\x62\x61\x87\xc0\x32\xb6\x74\xf9\x95\x98\xcd\x23\xef\x70\xcc\xb4\xf9\x4e\x58\xb1\x32\xed\x58\x2b\xb0\x37\x85\x66\xed\x4c\xb3\x22\x52\x30\x56\xf4\x95\x56\xb4\xcd\xb1\x71\x94\x2d\x22\xae\x4b\xeb\x5a\x20\x6d\x20\xaa\x21\x76\x21\x48\xaf\xae\xdd\xbc\x4c\x33\x07\xdf\xec\xf0\x86\xbb\xe1\x15\x65\xa8\x6a\xe1\xc0\xde\xf6\x3a\x45\x81\x5a\x0c\x37\xc0\xdb\x27\xa0\x85\x24\x2e\x98\x40\xf8\x04\x04\x51\xbc\x2b\x99\xc5\xd6\x42\x15\xb3\x21\xd4\xdb\xdd\x75\x68\xf5\x12\x47\x51\x94\x60\x8d\x1b\x29\x6f\xcc\x63\xf0\x8e\x71\x90\x77\xb8\xce\x08\x88\xf1\xc4\x40\x74\x8b\xe2\x1f\x1a\x82\x69\xb2\x81\xd8\xa8\x45\xab\xef\xa9\xff\x19\x09\x14\xab\xff\x6a\x38\x92\xbc\xf3\x61\x52\xb9\xb0\x49\xb3\x51\x08\xaa\x6f\xa8\x69\xba\xc9\xdf\xb6\x3d\x9e\x7a\x9c\x7f\xd5\x64\xec\xea\xe4\xf8\xa0\xb5\x36\x28\x19\xec\xfd\x7c\xa8\xb4\x4b\x58\x1e\x23\xbe\xa3\x69\xc0\x56\x32\x4f\x78\xe7\x06\xef\xdc\x60\x0f\x37\xe8\xaa\x15\xa8\x3c\x2f\x17\x7e\x3b\xb3\xc8\x94\x47\xcd\x5d\x49\x81\x72\x24\x87\x9d\x4f\x20\x11\x0c\x0c\x67\x0d\xe6\xdb\x05\x53\xeb\xce\x3a\x62\x8d\xa1\x6b\x3e\x34\x81\x15\x2c\x43\x5b\x26\xd5\x5d\x42\xcc\x09\x39\x3f\xdf\xb4\x21\xe0\xc8\xac\x9f\x67\xe5\xe8\xa7\x25\x1e\x79\x41\xff\x57\xc3\x2a\x27\x46\x58\x4d\xf0\x1b\xea\xbc\x14\x2f\x89\x4a\xd4\xf9\x77\xc6\xff\xce\xf8\xbf\x09\xe3\xef\x9a\x5f\x50\x45\xf0\x8e\xbf\xbc\x59\x6d\xdc\x32\xda\xb8\x34\x81\x71\x64\xfa\xa4\xb4\xdf\x48\x27\xec\x28\x7f\x04\x1e\xb5\x1b\x86\x35\x6b\xca\xc1\x7d\xfe\x20\x4d\xf1\x7b\xca\x8d\xdb\x78\x0e\xfc\x7c\xfb\xfc\x7c\xf7\xf9\xd7\xa7\xdd\x71\x04\x05\x6f\x00\x14\xc0\xda\xf9\xd0\x6e\xc2\x12\x80\x54\x8c\xbb\x01\x67\x05\xd3\x11\x0a\xaf\x33\xce\xba\xa4\xc1\xe1\x92\x49\x79\x4e\xbc\x6e\xd2\x34\x38\xc8\x4f\xb9\xcc\xca\x6c\xd3\xb6\x9c\x28\x52\x96\x99\xfb\x76\x34\x9b\x6d\x52\xb5\x16\xfc\x5c\x14\x5b\x18\x14\x41\x8c\x3a\xc8\x61\x63\x10\xeb\x4f\x58\x97\xde\x77\x5a\x56\x8e\x1a\x8b\xa7\x59\x2d\x3e\xa5\x96\x70\xa8\x69\x5b\xc4\xb2\x41\xec\xab\xc1\xe6\xa6\x19\x38\x21\xd3\x78\x0d\xc9\x69\x48\xb8\x71\xac\x6f\xc1\x48\x57\x02\xa6\x90\x9b\xfc\x41\xbe\x81\x40\xcc\x83\x8a\xd0\xe1\x0b\xc4\x2c\xce\xcb\x68\x57\x85\x98\xc4\x8d\x56\xb8\xbd\x5c\xef\x58\x82\xd1\x29\x03\xc6\xd6\xbc\x7f\x14\x0b\x14\xa5\x23\xb1\x8c\xd2\x74\x92\x64\xe7\xa1\x1b\x31\x51\x26\x16\x4c\xac\x70\x13\x2f\x8c\x67\xc3\x4a\xc8\xac\xad\x48\x4c\xe1\xb3\xe1\x12\x99\x42\xa1\xe7\x85\x63\x80\x85\xd5\xe6\xe5\x23\x60\xdf\x5c\xe1\x59\x12\x32\xc8\x8f\x32\x80\x43\xcb\xda\x0a\x9d\xed\xb5\xbd\x45\x52\x1d\x74\x92\x20\xff\xe0\x95\x1b\x38\x78\xe4\x1c\x65\xd9\x71\x41\x78\x91\xc3\x5c\xee\x9f\xe7\x2a\xdc\x51\xda\x8c\x17\x48\x60\x5c\xb6\x23\xf6\x10\xa6\xc9\x6d\xc6\xf2\xda\xda\x68\xce\xa4\x4e\xe0\xcc\x36\x2f\x8e\x3c\x94\xeb\xab\xc4\xdb\x5b\x00\x23\xda\x5c\x10\xa4\x08\xab\xac\xa0\xbc\x1e\xfc\xce\xa6\x95\x57\x98\x65\x32\x4f\x85\x02\x1e\x1a\xa0\x9b\x61\x92\x3d\x3d\xad\x93\x8c\x3b\x61\x20\xa9\x67\xef\x5d\xf5\x37\x5d\x44\x8d\x08\x84\x69\x66\x20\x5a\x25\x4d\xc3\xb5\xa3\x48\xa9\x8c\x41\x31\xe4\xa6\xa1\x82\xe6\x8d\x1c\xbe\x55\x44\x86\xa5\x1c\x23\xdb\x06\x49\x28\xc8\x7c\x85\x1d\xfb\xdc\xac\x10\x95\xef\x6d\x70\xc3\xa3\xbd\xae\x2c\x60\x50\x64\x01\xed\x1c\x33\x3f\x59\xd9\xd0\x20\x30\xfe\xd7\x2c\xab\x78\x0d\xd6\xff\x23\x6f\xa8\x2c\xff\x48\xfa\x77\x53\x43\x90\x10\x69\xb3\xf9\x2a\xc9\x29\x8a\xad\xa5\xe5\x86\x36\x9e\x91\x3b\x40\xf9\x11\x08\x38\x97\x39\x87\xf5\x1a\x83\x0f\x1a\x28\x5e\x92\xd8\x14\x03\x6e\xf9\x42\x21\xd2\x60\x49\x9b\x83\xe7\x7b\x20\x85\x35\xf9\xb2\x94\xa1\x35\xbc\xdf\xb4\xa6\x72\xcd\x84\x45\x51\x7a\x27\x0d\x61\xdb\xf0\x98\xa2\xe5\x01\xd9\x97\x37\xfb\xcf\x82\x83\x71\x35\x04\x91\xe0\x19\x40\x3e\xc3\x87\x85\x81\x4b\x14\xe9\x9a\x04\x3c\x26\x87\xea\x36\x2f\x46\x14\x17\xd8\x25\x8a\xfb\x52\xff\xb3\x52\x05\x37\x29\x0a\x35\x82\x65\xb2\xfd\x07\x30\xcd\xe5\x33\x02\x5b\x6b\xa1\x11\x96\x99\x87\xef\x41\xbe\x5e\x33\x3c\xd5\x36\x90\x2b\x81\x34\xd5\x59\x06\x0a\xf4\x0f\x30\x7c\x13\xbc\x01\xf2\x75\x03\xa9\x0d\x48\xc8\x48\x21\x2e\x10\xd2\xc6\x50\x29\x28\x63\xc0\x60\x2d\x31\xbb\x60\xc3\x8d\xf0\xeb\x22\x88\x78\x89\x1e\x3c\x03\x43\x86\x14\xb3\xfb\xf7\xc6\x80\x58\x84\xab\x77\x62\x89\x6a\x30\xc9\xd5\x62\x31\xe3\xe7\xfe\x21\x87\x54\x46\xe4\x55\x5f\x23\x38\x5e\xe3\xd9\x00\xc4\xaa\x41\x6c\x7f\x7d\xcf\xfb\xa5\xd4\x32\x20\x25\xe2\x08\xcb\xb2\x34\x73\xe0\x9c\x92\x66\xc5\x7d\x29\x40\xe0\xfd\x8e\x50\x02\x40\xda\x68\x15\xcf\x22\x32\xef\x92\x9a\x91\x3f\x00\xcd\x5d\x56\x35\x42\x5c\xef\x12\x04\xd6\x33\xb2\x91\xc8\xa5\xbc\x7c\x25\x59\x30\x8c\x80\x8e\x85\x6b\xde\xbd\x04\x24\xdc\x73\xf4\x4a\x9a\xa2\x3d\x50\x23\xab\x4c\x51\x6b\x59\x16\xa6\x28\x46\x8f\x2c\xd5\xb2\x2a\x98\x3b\x07\x22\x0d\x26\xce\x9d\x24\x5c\x59\x95\x1c\x12\xd1\x1d\x79\xd8\x68\x34\x4b\x9a\xb9\x2f\x17\x2b\xb2\x60\x19\xb2\xc9\x8a\xff\xb5\xc8\xcb\x38\x77\x2c\xd7\xbb\xb5\x70\xdf\x7c\xc0\xd6\xf9\xfb\x49\x32\x5b\x05\x23\xc1\xd8\xd1\x8a\xfc\x07\x89\x67\xc2\x70\x99\x3b\x88\x72\xd0\xb5\x92\xc6\x03\x8f\xa0\xe6\x7e\x41\xe2\xe5\xb9\x7b\x5c\x20\x90\xa9\x73\x88\x4c\x02\xcb\xe0\x99\x4b\xac\xbe\x5b\xcb\x07\xc8\xd8\x61\x63\xcd\x88\x21\x64\x14\x35\x24\x27\xd0\x76\xe2\x57\x13\x42\x5e\x88\x2d\x23\x0e\xb2\xd0\x75\x5e\x49\xd9\x05\xc0\x1d\xc2\x11\xf7\xc7\x11\x5b\xc5\x52\xad\x51\xac\x39\x31\xdb\x28\x78\xb7\x28\x3a\xae\xec\x8c\xe8\x58\xcb\xb2\xf8\x39\x63\x84\x09\xed\xcd\x82\xe1\x61\x2f\x4d\x01\x22\x47\x6c\xdc\xb7\x96\x9f\x61\x9e\xc2\x0b\x3b\x0f\x2a\xac\xb8\x0d\xeb\x32\x72\x46\xcb\x5b\xe6\xe0\x35\xe3\x99\x8a\x16\x9b\xd7\x1d\x13\xae\xe8\xac\xd4\xff\x98\x05\x8f\x97\x24\x67\x1b\x71\x63\x0c\xe2\x09\x2f\xc9\x7e\x0c\x6e\x4c\x00\xac\xad\x65\x3d\x68\xb6\xfa\xa2\x9c\xa2\x3a\x45\xa6\x66\x22\xf2\xc3\x97\xc8\x83\x71\xcb\xfe\xe0\x54\xbe\x5a\xcb\xf3\xdd\x2f\x25\xde\x16\x0d\xc3\x80\x57\x6e\xf0\x4e\xd3\xbd\x6c\xe3\x60\xdd\xe0\xae\x8c\xbc\x46\xf1\x7c\x1a\x2e\x0c\xb3\x92\x04\x2e\xd4\x19\x18\xfd\x17\x05\x4e\x8b\xcd\xab\x5a\xf8\x9e\x00\xbc\x33\x42\x41\x76\x27\x1d\x25\x85\x1b\x63\xd0\x79\x10\x96\xa5\xcb\x8d\x21\x66\x04\xa8\x85\x8a\x62\xec\xcc\xdb\x30\x5d\x32\x53\x27\x3d\x04\xa0\x92\xed\xd4\xb8\x8a\xec\xac\x77\xbd\x45\xc5\xeb\x7b\x1d\x21\x1a\x56\xa9\x69\x66\x58\x17\x35\x59\x21\x15\x51\x81\xd5\xd1\x2c\x64\xac\x6f\x34\x9e\xb0\x0d\xb0\xc7\xd7\x9d\xdd\x67\x12\x1c\xa3\x96\x88\xe5\x01\x9b\xb6\xbd\x17\x93\x94\x45\x33\x90\xd6\x2e\xf9\xac\x91\xb0\xba\xe2\x44\xdc\xa6\xa6\x5d\x69\x82\x41\xec\x17\xaf\xae\x91\x78\xde\x22\x24\x5c\x85\xfb\x59\xcb\xd4\xe2\x38\x61\xa8\x96\xa9\xc5\xc0\x4a\x49\x14\xad\x24\xae\xd5\x12\x9b\xda\xb3\xfe\xf3\xa9\x25\x4c\x25\x52\xa8\x67\xa5\x5f\x88\xe7\x4a\xe1\x16\x82\x9a\x98\xad\x8c\x69\x4d\x24\x90\x58\x5b\xd9\xad\xac\x0c\x54\x07\x06\x81\xa9\x91\x35\xc7\xee\xca\x25\x71\x1d\x59\xb0\xe0\x3a\x50\x4c\xac\x55\x22\x27\x0d\x06\x85\xbc\xa9\x59\x9f\x1d\x08\x9c\x59\xf0\xd4\x67\x1b\x4e\x3d\xef\xaa\xca\x68\x55\x65\xdc\x31\xf9\x56\xf3\xc3\x3f\xef\x9e\x6f\x16\xbb\x93\x12\x1b\x59\x94\xc8\x9b\xac\x29\x98\x0a\x23\xd8\x6e\xac\x0d\xc9\x59\x5b\x28\x03\xa0\xe9\x5c\x76\x40\x24\x8f\x5e\x92\x10\x4c\x04\x1b\x3b\x25\xd6\x59\x82\x74\xa9\xa2\xf0\x62\x92\x3a\x46\xd6\x6e\x48\xc7\x7a\x3c\xb9\xa6\x4f\x28\x6d\x7e\xe8\x32\xe4\x0a\x7d\x32\xa0\x4b\x43\x19\xcf\x27\x0a\x64\x0a\x80\x94\xe3\x73\x68\x15\x9f\x83\x10\xd7\x11\x3a\x3b\xca\x87\x1c\x9c\x18\x85\x26\xec\x68\x7f\x1a\x63\x49\x9a\x3a\x4d\x47\xdb\x32\x9b\xac\x8a\xc3\x11\x4c\xd6\x8f\xdb\xd7\x4f\x98\xae\x1f\xbf\xa7\x1f\x0f\x94\xd3\x8a\x60\x5c\x47\x6a\x19\xf0\x69\xdd\x13\x82\x1d\xdf\x57\x38\x03\xd6\x1d\xef\x5b\x7f\x32\x1e\x1e\xef\x60\x7b\x32\x66\x1e\x9f\x46\xe1\x54\x5c\x1d\x5b\x64\x77\x7a\xec\x1d\x59\x14\xf7\x4c\xf8\xbc\xb7\x77\x3f\x36\x61\xf8\x7a\x7f\x69\x5c\x39\x4c\x01\xd1\xaf\x38\x78\xb5\xc9\xe2\xe5\x24\xb8\xcd\x7d\xfb\x0a\x1b\xcf\x11\xd0\x08\xdf\xc9\x91\xf2\x98\xb9\xc4\x43\xf3\x8b\x1f\xcf\xc7\x8e\x73\x28\x9f\x80\x8b\x1d\xe7\x3d\x3a\x01\x0f\x3b\x2e\x3f\xc7\xe9\x1c\x6c\x4c\x45\xe2\x73\xf0\xaf\x11\x25\x8a\xcf\xc6\xbd\x76\xf7\xed\x47\x85\x2b\xac\x59\x42\x2d\x89\x15\x25\x23\xe3\x46\x62\x67\x52\x60\xcc\x1e\x76\xb6\x40\x3f\x74\x9e\xd7\xb9\x1e\xd7\x1b\x62\x6d\xbb\x41\x15\xbe\x95\x37\x75\x3c\x38\x75\xfc\x5b\xd6\x5d\xa2\xa8\x86\x8e\xfb\xa6\x8a\x68\x81\x10\xaf\xef\x9d\x2a\x16\x1a\x21\xee\xbd\x50\x32\x91\xf7\x2f\x84\xf5\x05\xa9\xde\x93\xc0\x96\xae\xc2\x38\xbe\xbc\xd6\x0b\xf9\xe9\x47\x24\xa7\xbf\x94\x8c\xf4\x67\x86\x66\xff\x45\x0d\x2e\xbd\x32\x24\xdf\x53\xdc\x6f\xc3\x17\x39\xa0\x44\x03\xe8\x36\x2b\xe3\x4b\xb8\xd0\xef\x0e\x4b\xbe\xab\x6c\xf7\x7f\x7e\xf8\xfa\x7c\xfb\xb8\x27\xb1\xa5\x42\x0b\x31\xd4\x0e\x10\xb5\x93\xa3\xe2\xd6\x55\x50\x23\x58\x31\xee\xe1\x25\x26\x85\x58\x19\x39\x0e\x5e\x65\x87\x23\x55\x54\x88\x97\x68\xc1\xa0\x8a\x72\xc0\xd7\x7b\x55\xf1\xab\x93\xe5\xc0\x88\x99\xa6\x6a\x1e\x24\xaa\xce\x48\xb3\x21\xba\xe9\xee\x12\x83\x22\xb7\x0c\xe0\xbb\xb9\xe9\x78\xa4\xe4\x6a\x02\x9f\x14\xc9\x69\x73\xef\x4d\x7d\xe0\x40\xf7\x87\xd3\x47\xa1\x4e\x82\xd8\xcf\x6b\x2d\xd6\x58\x4b\x97\xa6\x90\x8c\x45\x52\x17\xc2\xfa\x81\x63\x26\x8f\xbb\xd6\x3c\x44\x45\xfd\x29\x74\x3e\x60\x15\xee\x0a\x95\x3a\xf8\x44\xcc\xc9\x60\xd3\x62\x00\xb0\x42\x53\xc9\xb7\x6a\x1e\x8a\xee\x0c\xa5\x59\x5b\x94\x05\xbe\x24\x85\x91\x31\xc7\xf2\x7a\x60\x2f\x1b\x77\xf3\xc8\x54\x39\x75\x5f\x6b\xf9\x27\x48\x6d\xf0\x4a\x20\x9e\x22\x61\x7e\x3e\x2c\x17\x71\x21\x82\xb3\xe7\xc5\xdd\x09\x72\xe5\xaf\xb8\x99\xd8\x13\xa4\xa4\x00\xa0\x6e\xd2\xc9\x0d\x05\x1d\x2c\xa6\x64\x68\xc7\xdb\x8d\xde\x90\xf8\x70\x98\x25\x6a\x74\xa6\xff\x57\xda\x63\x4e\x8e\x61\x7f\x3d\xa6\x73\x6a\x5a\xd4\xd7\xdc\x83\x4e\xce\x4b\xfa\x6a\x0c\xf3\x38\xbb\xc9\xa4\x8a\xb1\x3b\x3c\x71\xaf\x42\xf0\x61\x15\xc9\x93\x0f\x6b\x15\xfa\x59\xd7\xb3\xbb\x79\xea\xfa\x0a\x0d\x44\xaf\x12\x24\x9a\x43\xec\x3a\xfb\x18\x55\xd4\x04\xc4\x6b\x8e\xa9\x72\x90\x4c\xff\x01\xaf\x8a\xa5\x07\x8c\x97\x84\xbd\xd7\xb1\x7d\x9d\x19\x8a\x78\x9e\xe4\xe4\x0e\x16\xd0\x72\x33\xeb\x7e\x65\xd5\xb9\x64\x02\x30\xc4\xe4\x15\x6c\xa7\x23\x9d\x47\x72\x29\xae\x03\x3e\xd4\x16\x30\x69\x0b\x45\x1a\x74\x47\xd2\x1d\x63\x29\xf1\x80\xed\xc2\x03\x85\xee\x80\x25\xc3\x4f\x19\x01\xb1\x6e\x9e\x71\xbd\x91\xac\x7b\xbf\xbe\x47\x84\x28\xc5\x37\xc2\x96\x91\x20\x5f\x21\x03\x64\x2a\x4a\x30\x18\xab\x67\x1a\xe7\x7b\x97\xe8\x24\x3b\x65\x17\x2c\xba\x29\x49\x92\xc1\x42\x05\x60\xe4\xf9\x58\x35\x80\x0a\xab\x24\xb9\x32\x1d\x5e\xdf\x5b\xf0\x41\x1b\xf0\x7e\xf0\x21\xca\x8e\x5c\x04\x24\x19\x2f\x4b\x42\xf0\xbd\x15\x92\x72\x20\x02\x06\x81\x0a\x3f\x65\x87\x40\xcb\x83\x31\x98\x81\x3b\x51\xb5\xbb\x28\xf5\x80\x8c\x1c\xd6\xfa\xb8\xfa\xba\x60\x40\x52\x83\xb5\x3b\x78\x2a\x08\xe2\x8a\x13\xb2\xbd\x62\x3e\xd8\xc6\xb5\x91\xe4\x05\x7b\xd0\x4e\xa6\xee\x04\xe7\x5e\x44\x6f\x0b\x36\xb1\xa0\xe0\x94\x34\x3d\x8b\x48\x6d\x81\x48\x07\x30\x38\xeb\x52\x9a\xb1\x79\xb6\xbd\x30\x8a\x0e\x50\xae\xef\x35\x19\x70\xca\x83\x71\xef\x68\xbe\x42\xf3\x77\xeb\xcb\x58\xeb\x8b\xc9\x19\x4d\x20\xf8\x4d\xeb\x8b\xc9\x01\x60\xbe\xc7\xfb\x13\x48\x6a\x76\x7c\xe7\xf5\x6f\x9d\x08\x5e\x9d\xd7\x7f\x67\x96\xac\xea\x6a\xb7\x15\x0b\x95\x2b\xc9\x55\x71\x41\x55\x27\x35\xb0\x26\x4d\xc3\x6c\xc2\x6e\xc9\xf4\xbb\x98\x2c\x37\xab\x29\x14\x16\x25\x86\x25\x2d\xe2\xd2\x2f\xa8\x42\x5a\x18\x49\xbd\x4c\x15\x86\xc1\x58\xba\xd6\x4c\x52\x54\x19\x1c\x26\x36\x1e\xa6\xc0\xa5\xb8\x88\x1b\xb5\x3e\xfb\x69\x71\xb1\x90\xa4\xbd\x58\xb1\x3c\x5f\x2c\x53\x89\xbe\xa2\xa2\x44\xbb\xf4\xfd\xaf\x2f\xec\xf2\x90\x52\x87\xfb\xf3\xb2\x08\xc4\x11\x62\x90\x68\xf8\x03\xa1\x7c\xba\x53\x0b\x39\x28\xf2\x29\x25\x3a\xb0\x9d\x73\xca\xd4\x39\x2e\x24\xf0\x67\x2c\x26\x98\x8b\x97\x9c\x75\xa5\x1d\xd8\xd3\xd7\x76\x0a\xbb\x4a\x50\x58\x2c\x69\x81\xe0\x02\x4b\x48\x41\x38\x68\xd7\x94\xf2\x6e\x15\x39\xd8\x2a\x22\x14\xd4\xd4\x06\x1e\xa6\x5b\x73\x07\x33\xae\x09\xaa\x16\x4a\xb1\xe0\x45\x71\x5e\x94\x66\x81\x66\x43\x94\x59\x15\x2a\x3e\x1d\xd7\x4f\xad\x7b\x18\x14\xae\x39\x79\x53\x90\xa0\x57\xa2\x99\xa4\x28\x85\xf0\xfc\xef\xbc\x5a\xe1\xc5\xb0\x1e\xa7\x4b\x0a\x89\x75\x2c\x26\xef\x76\x69\xc0\xb3\x8c\x52\x52\x78\x79\x67\x8d\x60\x17\x76\x4b\x61\xcd\xa3\x34\xcb\x66\x5f\x05\x4c\x7d\xbc\x5b\x22\xd8\x92\x8a\x59\x7f\x98\xbc\x2a\x0a\xc3\x32\x4e\x85\xba\x09\x7c\xd3\x7b\xaf\x23\xdd\xc0\xa3\xa2\x62\x81\xe0\x87\xa8\xb9\x99\xc3\x7e\xcb\x6e\x3d\x45\x5a\xb4\xbd\x8b\xb5\x20\x08\xb4\x63\x5f\xde\xbb\x46\x27\xeb\x60\x02\x31\x85\xc5\x96\x25\x93\x18\xda\x2d\x46\xf8\xf3\x24\xb9\x61\x49\x1d\xdb\x6a\x36\x8e\x35\xfa\x55\x34\xe0\xdb\x45\x95\x23\x52\xfe\xfc\x7e\xd3\xdb\xbc\xc4\xaf\x08\xd2\x6c\xb8\xb1\x92\xe1\xc9\x1f\x4e\x15\xc7\xe8\x49\xc3\x8d\x75\x9b\xfe\xde\x6e\x24\xdf\x3d\x93\xdb\xbb\xab\x4f\x52\x56\xe7\xc0\x1d\x72\x6c\x06\x91\xd1\xba\xe7\x7f\xcd\xbe\x7c\xd9\xd0\x3f\x1f\xea\xdf\x7e\x7d\xf8\x7c\xf1\xe5\xe1\xee\xf3\xf3\xd3\x1f\x3e\x50\xbc\x20\xba\x30\x45\xd3\xae\x7e\x10\x5d\xf0\xad\xa2\x69\x0d\xad\xff\x5b\x5d\x94\x77\x4f\xd4\x49\x07\xc3\x41\xcb\x9d\xfb\xdc\x10\x5d\xc4\xa6\x29\x2e\x6c\x6e\x0c\x5d\xa0\x6f\x5a\x8a\x17\x68\x9b\x56\x60\x7b\x8a\x96\x38\x18\x88\x7c\xd4\xe7\xc6\xaf\x7e\x47\xee\x56\x1a\xdb\xfc\x7f\xfb\x37\x3f\x7f\xa2\x7f\xc3\x70\x65\x9a\x39\xc7\x15\x1c\xfc\x0a\x36\xab\x69\x53\x5c\x83\xc3\x50\x03\xa4\x69\x22\x67\x1a\x0f\x62\xfe\xa7\xd1\x54\xfd\x5a\x4d\xdd\xa1\xa4\x1e\x1a\x35\x83\x69\x9a\x3e\xf6\x45\xcc\xb4\xf3\x48\x27\xf6\xb1\x2f\x52\xa6\x9d\xc7\xa9\x7d\xc4\x31\x78\x71\x1e\x8a\x3d\xc1\x6b\xe4\xdc\x34\x7c\x82\xe9\xe3\x6c\x54\x7d\x7a\xb4\xcf\x31\xf4\x75\x7a\xa4\xcf\x31\xd4\x70\x7a\x94\xcf\x31\xf4\x31\x41\x74\x4f\x53\xad\x77\xed\x38\x9c\x94\x59\x47\x33\xb3\x28\x6f\xc0\xf9\xba\xd0\xc0\x1a\xfc\xe2\xa8\x7a\xc8\xfb\x23\x6b\x86\xb4\x4b\x60\x5d\x4b\x06\x99\xb7\x17\x20\x18\xd8\xdc\x39\x62\x00\x71\x94\xed\x31\x6e\x1a\x1e\xed\x7a\x09\x8a\xa3\xac\x8e\xe9\x3b\x11\xe4\x47\x71\xb8\x62\xb4\x34\xff\xad\xf8\xf1\x91\xc6\xb1\xf3\x73\xe3\x23\xed\x55\x67\xe4\xc5\xa7\x45\x2d\xfd\x7f\xec\xbd\x6b\x73\x23\xc9\x91\x20\xf8\x7d\x7f\x05\x87\x1f\xd6\x46\x63\x11\xae\x74\x8f\x77\x9f\xe9\x03\xc4\xde\xd9\x9c\x3b\x50\xd2\x4c\x49\xd8\x33\xae\xce\xd6\xb2\x41\x56\x81\xd7\x49\xa2\x86\x60\x41\x6a\x8d\xcd\x7f\x3f\x73\x8f\x7c\xe3\x51\x04\xc0\xee\xe9\x9b\x6d\xb5\x2a\x98\x88\xc8\x8c\xa7\x87\x87\xbb\x87\x3f\xce\xc3\xc4\x97\x59\x2c\x9d\x87\x87\x2f\xb3\x56\x3a\x0f\x0b\x5f\x68\xa5\x44\xa4\xfc\x0a\xdc\xa1\xa8\xad\xc5\x22\x9e\x25\x1f\x3e\x66\xf6\x33\x65\x63\x17\x68\x4b\x8a\x5b\x5a\xd9\xd3\xb8\xbe\x53\x8c\x82\xde\x12\xf1\xbb\x12\x27\xa6\xbd\x27\x53\x9d\xdd\x51\xc6\x12\xd3\xd6\x1f\x39\x7d\x0e\x37\x9f\x7e\x2a\xd1\x2c\xa3\xc7\x93\xb8\xcf\x9b\x87\x97\xd7\xc7\x8f\x8f\xcb\xea\xf5\x70\x58\x4a\x43\xca\x97\xc3\x80\x99\xa4\xe2\x82\xe2\x84\x73\xc7\x54\x83\x0b\x1a\x02\xa4\xe6\xba\x9a\x0a\x09\xad\x13\x4b\xbb\x88\xa5\xa1\xba\x50\x11\x9c\xaf\x22\xe7\xc6\xce\x35\xae\x22\x85\x10\x71\x11\x87\xc2\x4c\x52\xef\xe6\x92\x21\xef\xa5\x81\xbd\x61\x18\x1a\xfd\x9d\x40\xf4\x1f\x73\xc8\xd0\xb4\xe2\xfb\x56\xf0\xcc\x56\x8e\x79\x63\x68\x62\xbf\x9a\xbe\x95\xe2\xcc\x56\x8e\x2a\xc4\x93\x78\x4e\xc6\x00\x64\x2a\x9f\x43\x70\x9b\xd6\x8f\x95\x05\xab\x50\x9c\xfb\x25\x71\x4c\x1c\x40\x68\xb5\xec\x5e\x85\x4b\x7d\xe5\x81\x24\x2e\x4e\xa7\xb3\x24\xf2\xd1\x5a\x44\x52\xfc\x02\x24\xcd\x5f\x48\x15\x9a\xab\xd8\xd7\x88\xce\xa1\x86\xb1\x00\x1f\x2b\xd1\xd0\xb5\xd9\x4b\x30\xb6\x2e\x8c\xf9\xf7\xcc\x82\x71\x4a\x92\x06\x96\xa4\xeb\x14\x20\x9d\x62\x74\x71\x8c\xf5\x3d\x6f\x65\x2f\xbf\x85\x3e\x6f\xad\xdf\x23\x70\xd9\x7f\xe6\xd5\x7f\x8f\x0b\xeb\x86\x1d\xd9\x0d\x23\x1f\xc5\x65\x31\x95\x61\x8b\xe0\x4b\x4c\x50\x9c\xe5\x03\xe0\x6d\x77\xd7\x42\x81\x37\x8e\x10\x68\x8b\x80\x87\x10\xeb\x56\x9f\x75\x7b\x7f\x94\x5f\xec\x7a\x61\x15\xc5\x45\x2c\x85\x3b\x6a\x3d\x2d\x5c\x70\x52\x9c\xd3\xd1\x37\xb2\x98\xff\xbf\xe0\x6e\xc2\xc9\x2e\x13\xce\x3a\xdd\x2e\x75\x98\x70\x2e\x4e\xbc\xcc\x5b\xc2\xb9\x18\xf1\x42\x93\x81\xff\xe4\xf8\xf0\x3c\xf6\x68\x48\x1b\x0a\xad\xbe\x35\x60\xec\x41\x0c\xe4\x77\xae\xcb\xda\xef\xce\xe8\xd7\x31\x16\x6a\x07\x31\x11\x84\xb8\xe3\x6a\x21\xf3\x34\x3f\x06\x9e\x3a\x8f\x09\x7b\x57\x16\x20\x9c\xac\x9d\x91\x94\x29\x4a\xdb\x7b\xea\xd3\xa4\x69\x40\x8e\xa3\xb2\xca\x0f\x4d\xa8\x79\x5d\x69\x81\x91\x81\x35\x82\xb1\x2a\x76\x31\xfd\x34\x1a\x9e\xe6\x94\x23\x54\xa4\xac\xce\x7b\x77\xcb\xc7\xa2\x1c\x8a\x64\x17\x28\xc1\xe2\x1d\x9f\x90\x71\x81\xbe\x94\xf0\x89\xa1\xc4\xb0\x20\x53\xbe\x9b\xe5\x80\x51\x64\xc0\x25\xde\x4c\x41\xf9\xec\x1b\x53\xb4\x5b\x0b\x08\x41\x59\x70\xe9\x7d\x77\xed\xcc\xf3\x1c\xf8\x3e\xb8\xe1\xa0\x13\x77\x4f\xd2\xac\x55\x05\xef\xdd\x20\x1b\x76\xb0\x77\xd5\xfe\xbd\x6b\x00\x9b\xcf\xdf\x41\xa9\xe3\x7f\x87\x29\xb9\x3c\x4c\x58\x4f\x52\x51\x02\x72\x0c\xdc\x5e\xc5\x16\x13\x73\xd7\x82\x53\x66\x0f\x41\xf5\x4e\xd1\x93\x72\x28\x0f\x03\xbe\x0c\x0b\xa4\x52\x08\xca\x7d\x3a\x91\xd9\x8f\x06\x02\xa5\xb3\x18\xf3\xd9\x78\xd3\x8a\xcb\x57\xef\x8f\xfb\xee\x68\x7b\x76\x77\x9b\xfd\xbe\x73\x17\xc9\x94\x18\xee\x9e\x50\x07\xee\x2f\xef\xe7\x5f\x54\x4c\xde\xaa\x62\xf2\x9f\x93\xaa\x78\x5f\x9d\x16\x09\xf6\xd2\x36\x4a\xe0\xde\x07\xd8\xc5\xbe\x14\x4c\x68\xa8\x92\x61\x9c\xa8\x5e\x59\xf4\x28\x90\x3f\x79\x6d\xf3\x0e\xa5\xf3\x43\xeb\xfc\x8c\x34\x50\x66\x2f\xcb\xd5\xe3\xf6\xb0\xfc\x8f\x92\x32\xc4\x53\x41\xa5\x5b\x8c\x5d\xa9\x28\x2a\x29\x4d\x55\x7f\x38\xef\xdd\x7c\x73\x58\x45\x23\xcb\x68\x85\x2b\x3f\xb1\xdc\x45\x37\x1b\xbc\xc0\x1f\xbc\x9b\x29\x02\xc3\x4a\xe9\x17\x68\x57\xb6\x32\xaa\x93\x07\xfb\xa8\x11\x62\xd8\x88\xe3\x18\x71\xc6\x6c\x4a\x07\x6e\x26\x81\xc9\xa0\x75\xcd\x6b\xb3\x54\x9b\x8a\x12\x4f\x91\x66\x1e\x77\x33\x5f\x70\x13\x54\x92\x07\xef\x37\x85\x92\xf6\x15\xa0\x99\x75\xdd\x53\xe4\x15\x77\x78\xcb\xd8\xbc\xd6\xd9\xff\xcd\x42\xf6\xd4\xb8\x7f\x4d\x5d\xef\xe8\x47\x03\x13\x60\xac\x3d\x98\xa8\x3d\x98\x76\x59\x24\xa6\x89\xb8\x88\xb6\x58\x6b\xab\x0c\x24\xb7\x30\x03\x0b\x6b\x52\xc5\x16\x09\x6c\xad\xad\x16\x77\xdf\x7b\x0c\xcb\x2f\x14\xe7\x0d\x0f\x59\x26\xe1\x0b\xf0\x0a\xa3\x22\x89\x23\x92\x8d\xb7\xe7\xe8\x15\x15\x6f\x03\xf1\xa2\xa4\xe2\xee\x96\x68\x08\x9c\xa8\x51\x61\x89\x7d\xef\x65\x68\x2b\x3f\xeb\x7f\xcb\x07\xef\xa3\xc2\x7c\x00\x0c\x86\x50\x2a\xa1\x0e\x91\xe6\x44\x0c\xc5\x27\xc1\xc0\x59\x8a\xc3\x05\x90\xc4\x49\x77\xe3\x4e\x68\xee\xc4\xdb\xb6\x0a\xc6\x12\xdf\x3a\x3f\x47\xb7\xc9\x4f\x0b\x8b\x07\x7a\x68\x8f\xe0\xdc\x3f\x3d\x57\xbf\x60\xdd\x43\xad\xbb\x0e\xeb\x26\x3e\x65\x8f\x62\x56\x07\x21\x0e\x70\x9f\x7c\xfb\xee\xc8\x16\xb7\xb4\x4a\x8c\x4f\x71\x08\xda\x21\xfe\x64\xa8\xd5\xa8\x94\x83\x1e\x30\xe3\xbc\x18\x05\xdd\x24\x55\x2c\x1c\xf8\x3a\xc3\xf2\x3e\xa7\x14\x62\x4e\x9b\xe9\x5f\xa6\x22\x23\x9f\x16\x83\xa5\xcb\x75\xbf\x1b\x7e\x8d\x6a\x34\x4b\x04\x44\x1a\xdf\x8e\x55\x81\x70\xb8\x9c\x5c\xdb\xdd\x93\x55\xe6\x3f\x04\xcd\xa2\x2c\xff\x51\x74\xb5\x5f\x07\xf9\x54\xf6\xbc\x07\x34\xff\x2e\x88\xfa\x38\x72\xfc\xe9\xa1\xe9\x0c\x0c\x79\xb3\x7e\x7e\x7e\x58\xbe\x1e\xbe\x95\xb6\xe2\x65\x26\x32\xbf\xea\x81\x9c\xf2\x6d\x08\x4a\xe6\x06\x79\x36\xd1\x02\xba\x6a\x52\xa6\x3d\x90\x98\xc7\x6d\xa9\x64\x26\x81\xcb\x49\x49\x92\xbf\x95\x47\x57\x12\xed\x2d\xd1\xae\x34\x96\xf9\x03\x28\x98\x7a\x68\xda\x90\xa0\x51\x92\x64\x08\x65\xbe\x49\x5b\x35\xc9\x56\x39\x7b\x45\x90\x6c\x26\x1e\x98\x5f\x61\x34\x67\xa6\x35\x64\x4e\xcc\xce\xa6\xd9\xf2\xd1\xbb\x61\xf9\x70\xf1\x2c\xed\x1a\xaa\x9d\xb3\xcd\x64\x11\x15\x86\x43\xeb\x98\x16\xc4\x73\x74\x70\x3d\x16\x6f\xee\xc6\xb1\x48\x17\xdf\x3e\x6e\x96\x5f\x81\x39\x24\x5e\x0a\x3f\x93\xd9\xf1\x5d\xc4\x10\xe5\x15\x62\x49\x80\x66\x4b\xa5\x30\xe7\x46\xf9\x3e\x54\x4c\x33\x97\x18\x16\xfe\xee\x16\x1d\xa0\x62\x3e\x92\xab\xaa\x2c\x90\xe2\x7f\x6f\x00\x1b\x3e\xea\xde\xcd\xe5\xa1\x31\xe2\xe7\xd2\x94\xa6\x00\xb4\x7b\x57\x5f\xbb\x12\xd3\x96\xe1\x63\xe2\xc4\xc9\x6d\x6d\x39\xf4\x56\xa5\x31\x7b\x06\x18\xd0\x0a\x6e\x4b\x2b\x0b\xc9\xee\x9b\x0a\xd2\x6e\x65\x20\x48\x84\xb5\x42\x2c\xbd\x17\x54\xc8\x9e\x78\xf3\x26\x30\x22\x18\x39\xe5\x98\x3f\x4e\x6f\x90\x92\x45\x1b\x2e\xe9\x70\x03\x38\x88\x82\x62\x46\x23\x41\x21\xaa\x65\x4d\xdf\x47\x64\x1d\xd2\x89\xeb\x71\x68\xea\xdf\x61\x75\xfc\x5b\x4f\xcf\x63\xfb\x69\xfe\xf8\xfc\xfd\xe1\x9d\x14\xc0\x2b\xb2\x60\x98\x43\x15\x79\x12\x58\x5b\x59\xd5\x86\x97\x75\xe0\x49\xe4\x5a\x89\x72\xd2\x9e\xf4\x0e\x9c\xab\x2d\xf8\xa4\x2d\x78\xd7\x7f\xa1\xba\x2f\xa2\xcf\x49\xd1\xb9\xac\x08\x23\x6f\xce\xc8\x1b\x30\xd6\x08\x24\xe1\xab\x63\xe5\x20\x26\xe5\xda\x20\x4c\x85\x6e\x3c\xfc\x79\x52\x5e\xb5\xe2\xb2\x28\x91\x6f\xe7\x11\x72\x94\xaa\x54\x39\x48\xdc\x66\xea\x48\x62\x15\xc1\xa4\xfe\x0b\x95\xbf\xa8\x0d\x78\xa7\x0d\x78\x5a\x6a\x81\x60\x2d\x91\xb6\x34\x9f\xeb\xb3\xa8\x3a\x01\x6b\x37\x1d\xef\x16\x5d\x54\x82\x1e\x05\x88\x54\x4d\x47\x51\xeb\xd6\x13\x11\x2d\xf3\xae\xca\xd1\xbf\xe4\x82\x6c\x55\x54\x7d\xb7\x08\x78\x82\x6a\x5e\x20\x3d\x5e\x20\x75\x68\x81\x24\x38\x62\xcd\x8b\x93\xd4\x78\x85\xf4\xfe\x15\xca\x91\x03\xe5\x4e\xa9\xe9\x25\xc8\x79\xc0\x8c\x39\x25\xb5\x6f\x85\x94\x04\xb2\x1a\xaf\x50\x3b\xdf\x3d\x68\x38\xee\x95\x6b\xbb\x96\x87\x6f\x4e\x61\x91\x8e\x01\xf7\x9f\x9e\xeb\x63\xe0\xed\x94\xd8\x85\x26\xe5\x99\xcf\x4c\x2a\x9d\x0e\x39\x73\x12\x4c\x17\x62\x1d\xc1\x1b\xc5\xc9\xdc\xa0\x32\x98\xcf\x10\xa3\xc8\x43\xf0\x6f\xdd\x32\x73\x94\x50\xef\x21\xd5\x0e\x5c\xe4\x45\x3a\x05\x7d\x1e\x87\x34\x04\xc7\x54\x1f\xd1\x29\xe0\x11\x18\x3c\x82\x9f\xcb\x10\x15\x61\xcd\x59\x9c\xef\x0f\x2c\xdc\xce\x66\x94\x5a\xbc\x04\x8c\x9f\xf3\xd0\xa2\xda\x95\x1d\x9c\xb9\xba\x37\xf5\xfa\xcb\x7d\x13\xf9\xea\x30\x01\x2a\x8e\xcc\x79\x2d\xe2\x56\xe3\x0c\xf3\x7d\xc2\xe0\x42\x41\xe2\x8f\x28\x82\x68\x56\x5a\xfc\x05\x4e\xdf\xd0\xc8\xf4\x73\x32\x2a\x80\x0d\x39\x69\x41\x02\x19\x41\x97\x94\x00\x4d\x35\x8e\xfc\xc9\xd0\xef\xa2\x46\x04\x47\x77\xb7\xf2\x06\x63\x8e\x50\x46\xb0\x3c\x77\x96\xa9\x7a\xdb\xde\xa6\xc9\xf5\x5e\xb2\x2b\x04\x9f\x6a\x89\xc3\x1b\x43\x95\x80\x82\x4a\x6d\x6c\xb9\xec\x6b\x9e\xf7\x93\xd9\x72\xdf\x96\xbd\x38\x29\x4a\x94\xc1\x50\xeb\x1c\x8b\x0c\x1d\x24\xcb\x23\x99\x6e\x61\xb0\x3c\x86\xf0\x6e\xe4\x09\x25\x06\x52\x83\xc0\x47\x6c\x84\xe8\xb6\x8c\x7e\x56\x9a\xb6\x04\xb6\xf4\x50\xc4\xa1\x30\x42\xd1\x8a\x0c\xb8\xb1\x7c\xe2\x3d\x21\xe1\xc3\xb2\xaa\x0f\x0b\x6a\xbc\x84\x51\x47\x40\x2c\x03\x44\x3b\x8f\x0a\x0b\x20\x3b\x13\x7b\x75\x49\x5a\xd1\x04\xcf\xa2\x5d\x41\x11\xaa\xc0\x08\x4c\x92\x96\xd2\x09\x12\x3c\x53\x24\x53\x98\x93\xa2\x31\x3a\x2e\x12\x78\x3b\x4b\xbc\x1a\x29\x2f\x89\x94\x38\x40\xaf\x68\xa5\xa1\x48\xb3\x04\xc4\xeb\xd9\x1d\xe3\xc2\x85\x21\xd3\x33\xe8\x72\xd2\x4c\x14\x23\x7a\x4c\x90\x9c\x8a\xbc\xc6\x31\x2f\xb4\xb4\x23\x41\x0f\x91\x69\x30\x26\x49\xdb\x58\x72\x1a\x22\x0a\xea\x67\x2a\x8c\x37\x1b\xb6\x07\x6b\x3f\xec\x77\xe3\x47\x0a\x10\x24\x25\x91\x60\x1d\xcd\x99\xc4\xf2\xd5\x74\x1a\x03\x20\x31\x41\xe4\xda\x89\xe4\x9d\xd3\xd1\x86\x0e\x82\xa2\x26\x10\x5f\xe1\x9a\xb4\x3d\xcc\x82\x84\x4d\x1f\x4d\x16\xe3\x12\xc6\x9c\x49\x26\xb2\x9a\x96\x25\x2b\xed\x4d\x27\x92\x0f\x50\xab\x64\xf7\xb6\x49\x6e\x83\x71\x98\x4c\x9f\xcd\x49\x33\xb7\xfa\xfd\x02\x6f\x4b\xec\x5a\xb2\x60\xc3\x56\x83\xa7\x6a\x02\x17\x1a\x99\x21\xd7\x04\xc8\x5c\x0a\x7a\xe5\xa1\xf7\xd4\x69\xc1\x46\x65\x6c\x69\x78\x99\x63\x54\x92\xb4\x38\xc5\x7a\x9d\xc0\x19\xf1\x54\x6f\x84\x2d\xb4\xb1\x1a\x2e\x7a\x46\x27\x11\xb8\xd0\x77\xb8\xe4\x6b\xcb\x43\x9c\x45\x38\x28\xe5\xdf\x6e\x8b\x82\x66\x42\x96\x5a\x0b\x9a\xe9\xb0\x0c\x66\x2c\x33\xa3\x2c\xc1\x8e\x2d\x35\x22\x1d\x3b\x5f\xb6\xb7\xbb\xaf\xff\xf8\x52\x7d\xfc\xf8\xb8\x3c\x2c\x82\xf5\xe0\xac\xa2\x82\x89\x28\x88\xb1\x9b\x2d\x91\x6a\x43\x14\xbd\xc7\xe0\x6a\x04\xf1\xad\x36\x1b\xbe\xd2\xdc\x30\x04\xf0\x4c\x6d\x11\xef\x63\xa2\xb9\x64\x92\xed\x2b\xcb\x92\x15\x92\xd0\x9e\xa2\x5e\x14\xbc\xb8\x93\x63\xfa\x7c\x52\x5f\xdf\x97\x77\xc4\xb2\x14\xa4\xb9\x71\x87\x98\x02\x0e\x7e\xa5\xc1\xc5\x49\x01\xd3\xd2\xa7\x5c\x65\x7d\x0d\x94\x99\xc4\x29\x78\xe7\xf9\x0a\xa2\xf8\xe6\x6d\xe7\xd7\x71\xc3\x09\x7b\x2a\x89\x7f\x48\x5f\xa6\xfd\x7c\x37\x61\x2f\x89\xd3\x07\x1c\xaf\x34\x2f\x0e\xaf\x90\x68\xb7\x32\x70\x96\x14\xc0\x99\x7d\xf3\xc2\x6b\xc6\x44\xab\x04\x7e\x15\x57\x83\x71\xb8\xbf\xda\x7a\x18\x1a\xf4\x11\xd5\xb7\xd3\xd5\xf5\x2d\xb8\x7c\xb8\xfc\x58\xcb\x78\x54\xe0\x4b\x08\x49\xae\x7d\xc2\xce\x1a\xe6\x3d\x82\xfb\x5a\x9f\x8d\x16\xb7\xaf\xe3\x84\x5e\xed\x33\x26\x1f\x12\x67\xc6\x8b\x57\x0b\xb7\xec\x51\x8c\x17\x5e\x27\x55\x86\xcf\x01\x49\xf2\x21\xc7\xac\x10\xd3\x33\xa9\x0c\x99\xdd\x30\x4c\x80\x1a\xea\x28\x6b\x34\xda\x81\x8d\xb3\x49\x09\xa3\xb2\xa8\x90\x69\xaf\x84\x73\x09\xe5\x8b\x54\x49\x0c\x91\xd8\x13\xbd\x11\x3c\xe9\xb8\x62\xaa\x25\x32\x8f\x15\x7b\x8b\x26\xcf\x14\xa2\x01\x4a\x2b\x51\xd2\xc0\x42\xe4\xb2\x45\xeb\x51\x46\x8e\x20\x6e\x9f\x9c\x90\x90\x33\x2c\xc4\xff\xab\xa4\x79\xea\x82\x78\xf1\x74\x95\xf4\x24\xf4\xa4\xa5\xd0\x93\x4c\x95\x51\xc8\x49\xfb\x7a\x11\xa5\xa4\x64\xf6\x21\xcc\x1c\x04\x1e\x50\xe8\x2d\x6f\x24\x62\xb7\x9d\x4c\x51\x0e\x1b\x7e\x0a\xf3\x14\x8e\x49\xda\x1e\x3e\xd7\xeb\x1f\xf6\xa2\xdd\x13\x10\x5b\x13\x72\x88\x24\xf0\xca\x84\x1e\x8c\xe0\x4c\xad\x23\x4f\x53\x1a\x0b\xb1\x0d\x27\x73\x59\x45\xeb\x17\x68\x60\xea\x58\x7d\x28\xcd\xe6\xea\xef\xae\xf7\x43\xd9\x09\x38\x30\xfb\x64\x63\xfc\x8d\x05\x04\x53\x6b\x66\x66\x31\x0c\x84\x34\xe0\x20\x86\x2d\x0e\x87\x21\x59\xb5\xbc\xe9\x46\x57\x71\x45\x9d\xf4\x24\x13\x78\xab\x85\xad\x1e\x56\xa0\x73\x66\xad\xe5\xed\x30\x94\xd1\xf7\x5d\xb9\xbb\x45\x3e\x57\xa1\x88\xb5\x0e\xda\x2e\x98\x13\xb0\x75\x50\xf6\xee\x16\x49\x11\x13\xa6\x51\x02\x19\xc7\x90\x23\x0c\x33\x3f\x2a\xe7\x39\x93\x88\x77\x4f\x51\x79\x28\x92\x0e\xca\x2e\x88\xe4\x53\x6d\xdf\x34\x61\x87\x85\x64\x3f\xa7\x65\x3d\x2c\xf5\x6a\xa4\xc1\xd6\xe7\x79\x1c\xc9\xdb\x0a\xee\xa2\x8f\xca\xcd\x65\x0e\xeb\x04\xc8\x6b\x40\xfe\x92\x36\x4d\x6e\x93\x14\x85\x51\x7b\x19\x4e\xe6\xbc\x8c\x06\xac\x67\x18\x98\x4b\x5c\x74\x8a\x97\x34\x67\xaf\xdb\xab\x22\xa9\xb6\x8e\xe0\xb4\x85\xe8\x77\x80\x6e\xc1\x4d\xa5\x06\xa4\xdd\xb8\xc9\xd1\xa6\x2f\x1f\xea\xc7\xbf\xbe\xc7\x9e\x97\xb3\x04\x8d\x9c\x77\x09\x3a\x9d\x6e\x9b\x34\x82\xe7\x9e\x26\x46\xd6\xc1\xb4\xa5\x8d\x00\x94\x39\x8a\x04\x86\xe1\x18\x12\xcd\xfa\x4f\x55\x5f\xe1\x7b\xed\x75\x03\xd9\xa5\x01\x53\x13\xbb\x5d\x94\x1b\xb4\x82\x8f\x83\xdd\x1e\xa2\x81\x60\x15\xba\x61\xff\x06\xd5\x5d\xda\xc1\x06\x8a\x30\x31\xc6\x37\x05\x90\x79\xdb\x1c\x16\x7d\x0f\xa9\x00\xf9\xb4\x48\xa3\x3e\xf6\x35\x5e\xda\xc7\x16\xf4\x9a\x50\x5c\x90\xec\xde\x3e\xf2\xa1\xa8\x0d\x9f\x9a\xd3\x59\xc4\x39\x26\x10\x57\xc8\x71\x06\x31\x75\xd1\xf5\xd5\xa0\xca\x4b\x3b\xe9\xae\x3b\xd9\x97\x57\xcc\x3f\x56\x22\xee\x93\xa4\x61\x05\x25\xd6\xbe\x33\xe2\xfa\xd9\x28\x74\x2b\x02\x09\xda\x61\x0d\xef\xa4\x50\x39\xf0\x22\x27\x6b\x11\x87\xd3\x11\xd0\x96\xbc\xda\xbe\xd6\xa8\x68\xe5\x81\x68\xd6\x6a\x7e\x76\x97\xdb\x5d\x93\x97\x8e\xa1\x45\xb6\xc4\x84\x18\xf3\x1e\x4c\xdf\x38\xa3\x5c\x6b\xf9\x5c\x30\xb2\xf1\xcc\xc6\x94\x09\x0c\xf2\x10\xad\x92\xa4\x25\x9b\x9c\x38\xf3\x0a\x6a\xda\xc9\x1c\x85\xc4\xd9\xda\x02\x79\xe6\xb1\xc7\x01\x35\x42\xd2\x90\xe6\xa2\xe7\x5a\x40\xb4\x33\xc7\x75\xb8\x56\xc7\x59\xee\xd7\x25\xd2\xdb\xb4\x3b\x49\xc8\x2d\x09\xdf\xc1\x6c\x95\xb5\xca\x37\x33\x69\x95\x24\x9d\x80\x4c\x79\xde\xe4\x0e\x4c\x54\x92\x34\x05\x62\x9b\x62\xec\x8a\x81\xa7\x46\x2d\x3a\xd6\xd6\xf0\xc0\xa2\x92\xa4\x1d\x18\x11\x63\x6c\x81\x24\x64\xe8\xe6\xa3\x87\x89\x22\xcb\x74\xa2\xed\xec\x20\x00\x1d\x04\x1e\xb9\x0b\x39\x69\xb7\x8a\x05\x6b\xc4\x7b\x39\x53\x82\x44\xa3\xc3\x2a\x24\x48\xb5\x85\x82\x27\x06\x77\xc6\x3e\x58\x8e\xf7\x38\x49\x89\x99\x77\x4c\xe0\x0d\x2f\xae\x13\xf9\x6b\xbf\xb8\x96\x8f\x8a\x92\x91\x91\xaf\x2c\x53\xcc\xb6\xd3\x76\x97\x85\x15\x61\x46\x11\x72\xd2\x6c\x40\x71\xa5\x8e\xa6\x66\xa2\x59\x87\x36\x56\x8d\x37\x9a\x18\x75\x39\x30\x8c\x50\x45\xa8\xe2\xab\x01\x95\xdf\x6c\x4e\x33\x0f\x10\x45\x7f\xc2\xc4\x8a\x44\x78\x99\xa9\x73\x39\x52\x98\x97\x21\x45\xbc\xcc\x34\x10\xa4\x82\x77\x0a\x79\x23\x21\xaa\x04\x6e\x4f\xb5\x8c\x39\x5b\xa1\x69\x01\x72\x65\x81\xbc\xcd\x88\x81\x83\xa7\x77\xb8\xc9\xa8\x1c\xc6\xae\x81\x04\xce\xcf\x8d\x1c\x02\x05\xc4\x34\xfe\x42\x39\xc5\x5f\x30\xc8\x39\x81\x39\xd3\xc1\xdc\xee\x4b\x0c\x9f\xc3\x13\x32\x19\xcd\x9f\x89\x13\xfb\x08\xc4\x80\xde\x08\xdf\xfb\xc5\x6e\x97\x47\x94\x0a\x82\xf8\x7f\x77\x61\x36\x1e\x61\x94\xbb\x21\xac\x79\xb7\xc5\xd8\x17\xa2\x28\xef\x8b\x16\xa3\xc8\x63\xe3\x68\x66\x98\x79\xf5\x9a\x99\xaa\x5b\x4a\x52\x83\xcd\xe7\x74\x18\xbc\x87\xcd\x0d\x8c\x33\x42\x56\x4e\x8a\x9a\x35\x3b\x72\xac\xff\x63\x5d\x6d\x8e\xc8\xc8\x85\x34\x23\xe1\x4b\x48\x16\x28\xda\x85\x5d\xe1\x54\x97\x8c\x26\x84\x1e\x2e\xe4\xd5\xb9\x05\x27\x0a\xe7\xc6\xcf\x2c\x50\x52\x92\xb4\x53\x6e\x08\x22\x03\x6c\x93\xe4\xec\x28\x78\xd7\x96\x14\x2b\x0b\x64\x95\x24\xcd\x64\x33\x56\xf2\x10\xb2\xd8\x3c\x3a\x65\xb0\x22\xe6\xfc\x28\x5f\x56\xe4\x28\xbc\x58\x32\x5c\x0a\x10\xb6\x79\xbc\x55\x45\xf9\x8f\x98\xac\xa3\xde\x2e\x02\x28\x69\x02\x0c\x35\xa3\x74\x6b\x15\x5a\x41\x6f\x46\x30\x4b\x01\x2e\xcc\x31\xbb\x36\xf2\x0b\xbb\xf2\xe2\x85\x93\x0f\xd7\x0c\xff\x85\x9b\x89\xd1\x02\xb5\x17\xb0\xa8\xda\x6e\xbd\xdb\x35\x3f\x32\xab\xc9\xfb\xbc\x99\xfd\xb4\x7f\xf6\x77\x04\xea\x25\x9a\x85\xbc\xce\x2b\x10\x65\x05\x70\x64\x22\x20\x1b\x27\x44\x65\x78\x5d\x8c\xb2\xfd\x25\xb2\x48\x18\x29\x40\xe4\x25\x1b\x62\x94\x22\x0b\xf0\x64\xcd\xc6\x9f\xf4\xdd\xbc\xbb\x6d\x26\x2c\x75\x13\x96\xe6\x24\x82\x57\x32\x25\xcf\xce\x79\xb7\xed\x63\x7d\xf7\xfb\xa7\xc7\xe7\xc7\xcd\xeb\x4b\xf5\xba\x3e\x12\xbe\xd2\x8a\x35\x10\x33\x40\x95\x87\xe0\x95\x24\x79\x57\xf0\x23\x43\x92\x9b\x31\x13\xad\x7c\x27\x49\x50\x83\xaf\xee\x9e\x0a\xb9\xa5\xe1\x89\xcb\xf7\x54\x6d\x20\x8d\xee\xf7\x6c\x58\x52\x64\x11\xad\x58\xde\x9c\xe2\x4c\xff\xb8\x4c\xdd\xcb\x91\x85\xe0\xe3\x2c\x07\x88\xe8\xc5\xd2\xe8\x20\x8a\xe9\xdf\x82\xac\x9c\x51\x99\xd9\x93\xb4\x79\x03\x99\xbb\xe3\x3e\xd5\x22\x22\x18\x6f\x0c\xc5\x07\x00\x42\x74\x35\x20\x69\x40\x5c\x6a\xb9\x78\xd2\xa8\x9b\x1d\xe3\xf9\x61\xc6\x7d\x08\x2a\xa7\x0d\x7c\x71\x35\x4c\xe7\x0c\xd1\x30\x81\x5f\x8c\xdd\x7f\x32\x1c\x7a\x78\x37\xd9\x39\x65\x36\xd6\x03\xa5\x0a\x4c\xc8\x26\x67\x2d\xa9\x56\x30\xcd\xd2\x9e\xec\x85\x96\xac\x43\x36\xdc\xa7\xcb\x16\xc5\x96\x4a\xa2\xaa\xd4\x9a\x34\x78\x9c\x48\xc6\x0b\xf1\x31\x23\x4a\xc9\x8c\x8c\xa3\x9f\x81\x89\x3d\x52\x93\xa8\xe0\xa2\xa9\x2e\x21\x8b\x5c\x05\x66\x60\xca\x03\xd6\x6a\x28\x24\xa2\x11\x63\x96\xc9\xe5\x92\xe8\x2d\xf3\x39\x84\x35\x27\x9a\x26\x1f\x1b\x3e\x22\x6c\x49\x46\xa4\xdc\xe3\x22\x27\xa4\x28\x93\x75\x54\x05\x15\xfa\xfa\x2c\x13\x60\x08\x91\x34\x56\xfc\x9a\xe9\xa4\x7e\x96\xf9\xa8\x39\x06\xf0\x49\x21\xcf\x73\x3f\x0c\x06\x06\xb0\xb6\x96\x9b\x2e\x9a\x6c\x9d\x22\xab\xe3\xe7\x00\x71\x0a\xfc\xa4\x2b\xe4\xc1\xb8\x2d\x31\xd2\x1c\xb6\xa7\xd0\x2b\xf2\x35\x7f\x80\x7d\x0f\x15\x78\x95\x15\xbc\xb9\xa9\x84\xa3\xba\x94\xf4\xc2\xd4\x98\xef\x3c\x65\x32\x07\x53\xcd\x63\x2b\x42\x8d\x10\x83\xe6\xa9\x2c\x92\x0a\xed\x2d\x99\x48\x1a\xc0\x85\x1a\xbc\xa2\xc9\x67\x32\x57\x2b\xee\xe0\x10\xb6\xa4\x80\x7b\x5f\xcb\xd4\x73\x29\x13\xa6\x42\x9d\x76\x55\x9a\xa8\xb9\x52\x64\x46\x65\xda\x57\x5e\xb9\x22\xcc\x8d\xf0\x56\x76\x3c\x76\xc9\xac\xe5\xf4\x8e\x71\x38\x7a\x01\x25\x93\xea\x0c\x69\xe3\x0a\x99\x22\x30\x6e\x41\x4c\xdd\xcd\x46\x45\x03\x20\xbd\xbb\x25\xcb\x27\x11\xc5\xca\x80\x61\x9a\x5f\xcc\xa7\x50\xee\x23\x8d\x61\xb6\xcb\xcc\x86\x25\x72\x78\x35\x9f\x5c\x28\xd7\x1e\x98\x41\x31\x36\x0c\xd9\x12\x2a\x82\x11\x5b\xa8\xa9\x95\xff\x59\x5a\xbd\x0c\x85\x8c\x13\x23\x31\x05\xea\x84\x8c\x6f\xa9\x5b\x13\x35\x81\x73\x35\x38\x23\x33\x5b\x24\xcd\x83\xdd\xc1\x9d\x99\xbf\xb4\x3c\x91\x21\x55\x42\xc6\x51\x7f\x39\xca\x44\x13\x2f\x37\xaf\x6a\xae\x41\x83\xe3\xcd\x22\x0a\x84\xd4\xdf\x57\x32\x78\x10\xd3\xbc\x99\x37\xc5\x4e\x6c\x5c\x68\x02\xc3\x58\xd5\xcf\x50\x08\x46\x1c\x90\x8d\x82\x3d\x8b\xb0\x65\x82\x71\xac\xa6\x5f\xca\xe0\xde\xc9\x64\x38\x70\x33\xd6\x67\x94\xc5\x87\x20\xd3\xbe\xc1\x8c\x31\x16\x35\x18\x6b\x82\x07\x8a\xa0\x85\x05\x6a\x71\x96\x9f\xa0\x82\x0c\xd8\x82\x44\x9c\xe0\xac\x60\x95\x24\x23\x9c\xd5\xa3\xac\xe1\xb7\x82\xb2\x9c\xa0\x2c\x3b\x2d\x6a\x51\x96\xa2\x4a\xec\x39\x7d\x7f\x23\xc1\x5d\x11\x34\x88\x10\x51\x10\xd7\xa8\x43\xcc\x91\x49\x7f\x85\xa7\xb1\xa3\x6d\xcc\x7d\x1d\xa0\xae\xc0\x44\x65\xe8\x29\xcb\x8c\xba\xa2\xc9\xa8\x0b\x0f\xe2\xae\x9d\xbd\x08\xc6\xb5\xc8\x8b\x29\xdb\xd0\x93\xb7\x63\x14\x36\xc1\x29\xd2\x19\xe1\x4d\xbd\x32\x53\x4c\x94\x07\xf2\x75\x04\x96\xfb\x33\xc2\x61\x7e\x80\xc3\xc6\xc8\xad\xc1\x61\x2d\x0a\xf3\x51\xf9\x96\x0c\xde\x87\xc2\xc6\xfd\x61\xc4\xdf\xa0\x30\x37\xad\xba\xf0\x3c\xf5\x1d\x16\x9b\x62\x47\x70\x81\x71\x59\xec\x70\x59\x02\xd3\x4d\x11\x85\x16\x97\x45\x9a\x81\x85\x81\xa1\x79\x03\xba\x77\x4f\x5a\xa4\x2f\x16\x02\x1d\x44\x65\x76\x2f\x2a\x0b\x8a\x22\x1c\x30\x69\xfe\xaa\xc2\xfd\x58\xf2\x59\xbd\xdc\x7f\xfb\x72\xcc\xd6\xc7\x58\x15\x27\x2e\xd7\xbf\x6a\xe9\x3a\x8d\x69\x7f\x77\x6b\xa8\x77\xb6\xb6\x38\x09\x0f\xef\x43\x97\x03\x3c\xec\x81\x30\xa3\x61\x2c\x80\x9c\x20\x62\x94\x87\x4b\xe8\xb2\x41\x03\xcc\xf7\x5c\xd8\xc2\x3e\xfa\x6b\xef\x10\x24\xbe\xda\x19\x0d\x7c\xe5\xac\x1a\x0c\xe1\xdc\x16\x8e\xdb\xd5\xa0\x08\x28\x22\xb3\x6a\x43\x51\x23\x66\xeb\xef\xa4\x9b\xcc\x68\x73\xd2\xe0\x9e\x84\x80\x12\x56\x0e\x3d\xa0\xaf\x48\xcc\x16\x38\x69\x8e\x1f\x27\x4a\x17\x19\x90\x50\xf8\x5f\x11\xe6\xd8\x9c\x34\x2f\x15\xbc\xbb\x45\x1d\x27\xf0\x79\x64\xc0\x19\x11\x6d\xb6\xdb\xbf\xef\xda\x7b\x5d\xdf\xa2\xa8\xb0\x91\x88\xa0\x45\x04\x19\x3a\x3f\x5b\x3a\x80\x77\x92\xa8\x00\xae\x49\x5a\x76\x3c\x68\x9a\x8b\xa2\x04\x3a\x10\x3d\x37\xab\xd2\x00\x4d\x07\x61\x3e\x93\x04\x47\xf2\x7e\x16\x78\x8c\xa1\x1f\xe8\xa0\xd5\xf3\x6f\x3a\xaf\x76\x4c\x1b\x64\xde\xe2\x20\xcc\x5e\xa1\x21\x6a\x88\x25\x59\xf0\x9e\x7b\xe9\x55\xea\x6c\xf9\xb5\x5c\x17\x45\x51\x44\x32\x3e\x27\x1d\x41\x10\x99\x83\xc8\x02\x37\x67\x2b\x66\xb2\x55\xe8\x75\x9d\x89\xb1\xf4\x6c\x32\x5f\xc2\xf9\x87\x92\x8a\x51\xb0\xc6\x8c\xb6\xfd\xca\xc3\x20\xa0\x61\xa1\x06\xdd\x3d\x61\x06\xf6\xba\x43\x3f\xcd\x7b\xe4\x14\x9b\xed\xba\x83\xbc\x6d\xe1\xaf\xe6\xb1\x83\xa5\x6a\x0c\xa7\x7c\x46\x47\x70\x1d\x2c\x4b\x35\x6a\x0c\xf0\x72\xd1\xca\x54\x47\x36\x66\x12\x89\xee\x70\xc3\xa0\x82\x84\x5a\x02\x79\x8c\xb6\x18\xea\xee\xf7\x04\xfa\x51\xb5\xdd\xba\xbb\x75\x12\x48\x7c\xd6\xaa\x7a\xb8\x4e\x14\x5c\xc8\xfa\x3a\x35\x2c\xc9\xca\x6a\xfc\xc1\xdd\x93\x68\x0b\x15\xbe\x9a\x7e\xd9\x6a\x06\xb9\xd9\xde\x2f\x29\x42\xe1\xef\x9e\xb0\x90\x60\xf4\xc1\xcc\x12\x2f\x5e\x6a\x0d\x64\x44\xbb\x20\xef\x04\x9e\x32\x07\x96\xc9\x81\xe1\x8e\x61\xda\x84\x37\xff\x78\x1f\x14\x59\x4c\xa7\x08\x5c\x58\x89\xe0\x40\x3a\x9f\xfa\xd6\x9b\x7d\x12\xc0\x98\xbb\x27\x24\x1d\x21\xac\xb4\x07\xb7\x13\x48\xb2\xa4\xe9\xf6\x2d\x74\xe0\x23\xdd\x43\x03\xb8\x1d\xf4\x16\x4c\x3a\x09\xe9\xd6\x5c\x1d\x54\x63\xf0\x47\x45\x42\x65\x18\x9a\x8d\x37\x8c\x9c\xd6\x72\x49\xb1\x22\x08\x7e\x27\x7a\xe7\xdd\x93\x61\x92\x21\x81\x35\x27\x4c\xb0\x29\x20\x76\x33\x5c\x68\x0c\xe0\x4e\x59\x9f\xfc\x39\x16\x07\x42\x94\x9c\x26\xaf\xea\xe8\x87\x6f\x1f\x37\xdf\x6f\x8e\x68\xab\x29\x07\xc1\xce\x50\x6e\x10\x3b\x52\x9a\xa7\x87\xbc\xb2\xa5\xd9\x5b\x28\xdf\x2c\xa8\x60\xcc\x31\x2d\x94\xbb\x48\xa2\xd2\x2e\x7c\x49\x97\x3a\x64\x1d\xa8\xe6\xa8\xb4\xb7\x2b\x91\xfb\x19\xcb\xb0\xaf\xd0\xcb\x37\x22\xa8\xda\xed\xa7\xf0\x0d\xe4\xcb\xb8\xc0\xa2\x34\x87\x02\x06\x9e\xa5\xa0\xe6\xc5\x00\x0d\xf7\x75\x09\xc5\x59\x08\x77\x2a\xee\xeb\x94\x7c\xa4\x4c\x51\x4a\x35\xbb\x73\x6b\xf3\x80\x17\xb8\x77\x5d\xda\xb6\x5b\xaa\x0e\x69\x81\xb6\xbc\x44\xfd\xf1\x6a\xea\x06\x21\x59\xd1\x8f\x8a\x15\xf1\xce\xa7\xbc\xfd\xc5\x98\x16\x82\x26\xf0\xcc\xf4\x7a\x66\x56\xbb\xab\xa9\xc1\x47\xbc\x29\x0c\xc4\xc0\x7b\xc2\x8a\x62\x5b\x7b\x97\xd0\x18\x6d\x88\x7f\x1d\xe6\xa4\x7a\x2d\x73\xf9\x1a\x99\x4e\x7a\x37\xbb\xe8\x5c\xa5\x17\xdb\x03\x48\x4c\xe7\xa7\x16\x2f\xf3\x39\x2f\x6e\x6b\x98\x4f\x0c\xb8\x20\x5a\x59\x46\x81\x10\xa0\xd7\x69\x92\x58\x48\x1e\x0c\x56\x1e\x0c\x73\xb7\xa6\xe5\x6e\x3d\x98\xa0\x1d\x04\xe6\x20\x5d\xcc\x49\xf7\x4d\x04\x0c\x35\x33\xbb\x08\x26\xcc\x2c\xf3\xc4\xb6\x65\x8c\xbb\x81\xfa\xd3\x74\xfc\xbe\xe6\xb5\x82\x67\x3e\x00\x85\x4a\x24\xba\xbe\x13\x55\xca\xdd\x21\xb3\x31\x32\xd0\x64\x2a\xa7\x5a\x61\x06\x2f\x8c\x4c\x42\xc2\x9c\xe4\x6c\xd1\xe4\xe0\x8d\x8f\x3e\x27\x03\x32\x2f\xa4\x39\x1a\xf0\x46\x51\x31\x90\xf8\x89\x4e\xe3\x4c\x34\xbe\x7d\xab\xfc\xd6\x81\x43\x78\x47\xb5\xbd\x9f\x1a\x87\x9d\x19\x3e\xf0\xa7\xc5\x5f\x67\x39\xe3\x48\x72\xb1\x45\xc0\xad\x39\x31\x24\x77\xed\x99\x18\x15\x65\xe5\x78\x91\x31\xf8\x7e\x35\x9b\x2f\xde\xc3\xc6\xfc\xe7\x81\x3b\xf3\x98\x90\xe7\x97\xb9\x7f\x61\xf9\xb1\xa3\xe8\x8c\xdc\xb4\x20\x73\xff\x4e\x99\xde\xc1\xd5\xe0\x2b\xf1\x8f\xc5\x2c\x54\x15\xb2\x2d\x40\x6a\x75\x1f\xa2\x0e\xbc\x89\x98\x52\xce\x49\xb3\x89\x30\xa3\xc0\x1a\x21\x38\x30\x95\x63\xfa\xc5\x0d\x84\x41\x98\xef\x8f\x30\xe6\xa4\x81\x0e\x20\xd1\xa4\x13\x0f\x5d\x39\xa4\x7f\xbb\xb9\xc5\x3a\x72\x45\x80\x33\xa6\x45\x94\x24\xc3\x6e\x52\x84\x18\xf2\x85\x66\x12\x2f\x68\xcc\x55\x18\xcf\xbb\xc1\xda\x15\xe3\xaa\x99\x07\x4c\xca\xb7\x2a\xfa\xed\x4a\x8b\xd1\xb7\xe5\x66\xed\x00\xb3\x21\x13\xd8\x3a\xcb\xec\x42\x15\x19\x3b\xc4\xa1\x58\x33\x7a\xcd\xf4\x65\x6f\x22\x28\x4a\xa7\xb8\xe2\x29\x1f\x6a\x3c\x37\x9a\x0e\x6f\x85\xa5\x63\x8e\x00\x7e\xb7\xb8\x3d\xe2\x25\x25\x28\xe2\xa3\x71\x27\x7e\xe8\x24\xe8\xdd\x94\xdf\x20\x37\xe4\x48\xb8\x12\x51\x85\x44\x5b\x92\xdb\xc6\xf2\x62\xa3\x96\x49\x2c\x07\xbf\x2f\x9a\xcb\x09\x31\xd9\x8e\xf9\x9e\xef\xe3\x55\xfb\x61\xb0\xea\x70\x56\x43\x47\x37\xb5\x83\xa8\x62\x29\xda\xa0\x0b\xbf\xd2\x88\xf3\x00\x81\x39\xea\xf1\xf5\xb1\xce\x2a\x21\x63\xbf\x39\xc5\x9c\x54\xe3\x76\x12\x11\x46\xce\x65\xb2\xbf\xd8\x49\x05\xef\x46\x23\x50\x92\xfb\x2b\xcb\x94\xce\xb4\x4f\xc3\x46\x45\x91\x65\x6e\x0a\x90\x90\x05\x62\x6a\x6d\x0a\xc8\x0e\xb4\xaa\xc9\x7b\x43\x8b\x6a\x10\xa1\xed\xf0\x37\x6a\xa0\x34\x67\x24\x95\xa0\xb8\xd4\xb1\x4a\x07\x48\x26\xbb\x3f\x8e\x17\x42\xd2\xb1\x10\x6c\x69\xda\xc4\xd9\x60\x74\x4c\xfb\xfb\xc3\x87\x6f\x2f\x0c\x35\xf1\x75\x61\x01\xb3\xd4\xd4\x88\x42\x7f\x91\x83\xfe\xa7\x92\x83\x8a\x16\x9f\xa7\x25\x82\x21\x3e\xcd\x11\x52\xd6\x67\x67\x02\x17\x81\x68\xa3\xc1\x19\x31\xc1\xd1\x0d\xe9\x53\xa4\x81\x99\x34\xf1\x06\x45\x40\xac\x35\x44\x26\x80\x0a\xdf\x91\xcc\x22\x4a\x25\xa6\xea\xed\x32\x9b\x2f\xa3\x46\x49\x09\x1c\x6d\xb2\x67\x00\x82\x82\x93\x18\xc4\x2e\x72\x99\xf5\x7d\xc0\x68\x84\x44\x1a\x9c\xcd\x0f\x08\x84\x3b\x62\x01\xee\xbc\xab\xa6\xde\x55\x49\x90\x62\x2d\x97\x52\x80\x33\xd1\xb8\xb1\xfd\x65\x5f\xa6\x95\x7c\xe2\x96\x98\xc6\xd1\x32\x38\xa7\x8d\x22\xb0\xe9\x83\x50\x9d\x98\xe5\x76\xcd\xdc\xbc\x9b\x14\x56\x08\x1b\x2a\x98\xab\x78\x8f\x09\xfc\x80\x89\xb9\x24\x14\xe1\x2d\x46\xd1\x52\xf7\xa7\x4d\x60\x60\x6a\xe5\xab\x73\x58\x59\x70\x5e\x49\x92\xd1\xbd\x01\x24\x59\x3d\x99\x44\x33\x9d\xc4\x0d\x32\x75\x44\x8a\x84\x88\xe2\x55\x3d\x08\x5d\x1f\xc4\x1e\x39\x4f\x8a\x1a\x4c\xd0\xbb\x09\x8c\x13\x24\x85\x71\xc9\x6c\xb8\x08\x29\x13\x89\x1a\xa9\xb6\xe0\xad\x3c\xad\x34\x41\xda\x46\x20\xf1\x24\x74\x43\x72\xf7\x58\x44\x25\x5f\x52\xc1\x13\xd1\x54\x72\xf7\xa4\x3d\x2f\x97\x5f\x21\x38\x5f\x89\xf5\x2b\x65\x85\x0b\x6c\x8d\xf1\x8d\x5c\xa3\x9e\x22\xdc\xf9\x69\xa4\xbd\x0e\x68\xaf\x30\xf5\x90\x24\x95\x3a\x49\xea\x49\x62\x54\x12\x77\xee\x4f\x0e\x0a\x9f\xb5\x1f\x7b\xee\xd9\xc8\x8d\x3d\x18\x5b\x33\xd5\x2b\x60\xde\x6e\x82\x82\xa7\x51\xcc\x01\x71\x99\x29\x5d\xe7\x74\x76\xd7\xe5\x44\x67\x80\x71\x50\xd2\x90\x64\x01\x85\x23\x20\x81\x3c\x0d\x96\x51\x47\xd2\xfc\x8f\x72\x62\xed\x86\xcb\xf9\x29\x29\x23\x7f\xaa\x31\x0e\x90\x1d\x44\x62\x80\xcf\x7b\x4e\x1a\x9e\xf8\x68\x2e\x1a\xdc\x32\x1e\xa1\x28\x23\x8a\x39\xa2\x58\xf5\xfb\x00\xbe\x01\xe4\xc4\xd5\x91\x38\x47\x21\x7e\x85\xf1\x59\x76\x37\x1c\x83\xec\x80\x0f\x48\x40\x56\x38\x0a\x31\x38\x13\x1a\x19\x88\xee\x9e\x02\x38\x54\xc5\x7f\xd8\x44\x99\xe9\x44\x0d\x36\xfa\xbe\x89\x9a\xa0\x0a\xb9\x46\x09\x1a\xd5\x3b\xce\x54\x12\xbd\x5d\x6a\xae\x4e\x42\x6c\x67\xca\x4a\xe0\x30\x94\x70\x66\x51\x76\xeb\x92\xb2\xa9\x9d\xcd\x57\x17\x01\xf3\x13\x6f\xeb\x0f\xfd\x46\x76\x8c\xd2\xe5\xf9\xee\xd6\x14\xe0\x93\xa2\x78\x9a\xf0\x59\x3e\x69\x05\xd7\x27\x7f\x7a\xbe\xdc\x7a\x82\xcb\xc4\x45\x04\x3a\xa0\xd3\x11\xd0\x19\x0e\x87\x7e\x5b\x7f\x79\x78\x5d\xaf\x5f\x57\xc7\x0c\xba\xbd\x28\xee\x50\x90\xb0\xa2\x12\xe3\x0d\x93\x32\x92\x87\x2a\x81\xad\xb5\xe3\xd3\xc9\x41\x48\x73\x12\xd3\x37\x4f\xb5\x03\x1f\xb5\x13\x7d\x21\xd5\x7b\x25\x21\x08\x51\x42\x42\x88\x43\xbc\xd9\xe4\xaa\x49\xe5\x83\x62\xe0\xd8\x46\x61\x50\x66\x81\x0e\x4c\x9c\x63\x01\x85\x53\x11\x68\x68\x98\xc7\x67\xb7\x4a\x62\x21\xe4\x21\x30\x06\x57\xe2\xae\x9c\xfc\x69\x0c\x08\x69\x30\x38\xc7\x20\x46\xe8\x71\x61\x4c\x45\x72\xcb\xdb\x2a\xf1\x0b\x93\x22\xfe\x73\x06\x68\x97\xa7\x81\x41\x25\xc9\x61\x67\x07\x4c\x91\x06\x5f\x7b\xde\x78\x1e\xcc\x10\x51\x0f\x66\xf3\x4e\xa2\x48\x18\x28\x9c\x88\xe1\x52\xdd\xb8\xd3\x32\x67\xdd\x1a\x8c\x2d\xf0\xc5\xdd\x81\xa3\xbc\x30\xbc\x0a\x26\xab\x96\x22\xb8\xad\x46\x12\x0f\x32\x12\x72\x42\xfc\x1a\x29\x23\xce\x84\x04\x77\x65\x8d\x71\xd1\x60\x25\xaa\x48\x0c\xe8\x5b\xeb\x95\x4c\x15\x38\xcf\x0b\xe8\x82\x78\x34\x9c\x4d\xdf\x40\x0f\x24\xae\xd5\x65\x03\x7b\xee\x81\x13\xbb\xa8\xaa\x17\x9d\x65\x81\x79\xd6\xe2\x9e\xa3\x08\x8c\x31\xd6\x62\x7e\x8b\xa9\x1a\x8b\xd8\x44\xf1\x55\x32\x4c\x4e\xda\x39\x46\xca\xca\x88\x2e\xe6\xa4\xcb\x77\x1a\x6c\xaa\x1d\xa0\x18\x01\x87\x85\xe1\x17\x79\x24\xdc\x60\x7f\x01\x0f\x8e\xf1\x92\xc9\x5e\xb4\x72\xd2\xac\x73\x72\x42\xd9\x64\x47\x34\xae\xf7\x20\x13\x8d\x86\x10\x6a\x07\xc9\x69\x0f\xe8\x76\xc6\x3e\x98\x79\x91\xa3\x59\xb9\xd3\x32\x0b\x42\xfe\xce\x32\x26\xb4\x62\x19\xf0\x76\x34\xb1\x7f\xb3\xfe\xfe\xe3\xc7\xc3\x3a\xd8\xed\xd6\xa4\x6e\x6b\x8a\x27\x9c\x76\x67\x9a\x6e\x67\x9a\xa3\x3b\xb3\x07\xf2\xbd\x7b\x72\x8b\x08\xb6\x26\x75\x32\xab\x38\x88\x37\xc3\x58\x4d\xa4\x88\x3e\xcb\xe6\x51\xdc\x55\x49\xb0\x86\xe9\x0e\xce\x9b\x2f\x1c\xdd\xb2\xe2\x0f\x6f\x8a\x51\x9a\x5d\x6b\x76\x76\xed\xe0\x77\xb3\x5f\x1d\x13\x8f\xae\xb3\xd7\x12\x43\x34\x23\x81\x3e\xc4\x81\x54\xb3\x59\xb7\x1a\x51\x5e\x55\xee\x34\x89\x0b\x8d\x47\x8f\x89\x69\x65\x27\xba\x8d\x06\x42\xbb\x19\xe5\xca\xfc\xf0\x6e\x1c\x81\x64\xde\x8d\xb5\xf6\x0c\x8e\x3c\x74\xc7\xdf\x39\xec\x57\x34\xe8\x0c\xe6\x23\x38\xd5\x28\xaa\x6c\xc6\x6f\xb1\xa8\x5b\x47\x1b\xfb\xe3\x12\x1c\x80\xca\xe1\x1a\x66\xb7\x5d\x45\xea\x96\x10\x83\x84\x75\x43\x15\x41\x14\x43\x30\xcd\xc6\x5b\x5a\x0c\x36\x28\x30\xb9\x9d\xd1\x88\xeb\x2e\xcb\x72\xa4\x04\xdc\xb7\x7b\xc7\x58\xa6\x19\xc1\x91\xcd\xeb\x72\xd2\x6d\x5e\x6a\x36\x2f\x8a\x95\x1a\xcf\xb2\x95\x24\xce\xc5\x4d\x6c\x5e\x62\xa6\x7f\x9a\x3d\x4b\x62\x85\xa4\x4e\xd2\x0b\x1d\xed\xd6\x3f\xbc\xac\x97\x0f\x9b\xcd\xef\x9f\x17\xb7\x87\x65\x37\xd2\x0b\xf2\x23\x1b\x28\x26\x33\x34\x43\x03\x53\x6b\xe0\x43\x85\x62\xf7\x81\x03\xeb\x0f\x02\x9b\x6d\x29\xb2\x7f\x9a\x9c\x36\x45\xa2\xf4\x18\xe4\xa6\xad\xb7\xe6\x96\x90\x0d\x43\x09\x62\x76\xb9\xc1\x87\x62\xc6\xa3\xd4\xc7\x99\x12\xdf\x35\x58\x88\xa1\x36\xf1\x6c\xe6\xb4\xe1\x64\xe5\xe2\x68\x9e\x09\x2f\x67\x47\x26\x8a\x3c\xf7\xbe\x16\x43\x42\x31\x33\x14\x8a\xc9\xfb\x91\x15\x79\x37\xde\x4b\xf0\x86\x11\xae\xb6\x60\x02\xaf\xc8\xdc\x74\x3b\x2a\x9b\x3b\x3f\x10\x94\x22\x69\x88\x6e\x86\xe2\x39\x25\xa7\x0d\x5f\x1c\x99\x6e\x73\x10\xc5\x15\x9a\x84\xda\x32\x61\x38\x43\xa2\xd4\x1a\xd2\xd0\x0b\x40\xe0\xcd\xc7\x87\x8b\x68\x41\x8a\x59\x32\x18\x03\xc1\x8f\xe6\x41\x88\x62\x13\x6b\x41\x58\x10\x78\x91\xb2\x97\xf7\x76\x16\x04\xcd\x79\x21\xbb\xbb\xba\xfb\x51\x9d\x8f\x53\x48\x18\x75\xe6\x64\x4d\x25\xae\x07\x9a\x45\xb3\x10\xc5\x2a\x0c\xf9\xd4\x95\x24\xe7\xa7\xac\x57\x62\x6a\x81\xb4\x34\x32\x91\xf7\x49\x6c\x23\x6a\x6d\x99\xdb\x40\x08\xab\x62\x2e\x06\x5b\x94\xb5\x40\x05\xd0\x46\x0e\x15\x98\xfa\x02\x34\xb5\x68\x6a\x0f\x85\xd5\xcc\x56\xd4\x8c\x64\x09\x2c\x03\xb3\xc0\x72\xaf\x09\xc7\xc7\xbe\x58\x77\x25\x6c\xd2\x5c\xe2\xc0\x1b\x0d\x83\xd5\xd4\xc0\x14\xcc\x29\x1e\x35\xcc\x64\x7e\x48\xa1\xd9\x71\xf5\xb9\x8d\x13\xb7\xed\xa3\xdf\x1a\x17\x68\x07\x30\x20\x75\xdc\x3d\x69\x54\xb1\x44\xb7\x40\x77\x30\xba\xf1\x41\x49\xe0\xd8\xb2\x6a\xb3\x79\xfc\xf4\xfc\xa7\xcd\xc3\x11\xb3\xaa\xa8\x30\x54\xc3\xc0\x2b\x28\x4a\x41\xd6\x71\x32\x0d\xc9\x52\x64\x31\xd1\x1d\x7f\x66\xa1\x08\x95\xe3\x12\xd7\x7e\xc8\x78\xd5\x32\xb1\x6e\xdd\x6c\x58\xd2\x18\x4d\xda\xc3\x11\x38\xdf\xb0\x35\xbd\x98\x08\xa4\x05\x39\x08\xa1\x42\xf1\xaa\x96\xd3\xa6\x01\xd2\xa2\x56\xe9\xb1\x49\x73\x76\xcc\x27\x9e\x31\x35\x82\x61\xa4\xe1\x70\xc6\x67\x88\x51\x39\xed\x87\x15\xe5\xde\x32\xf0\xc6\xea\x75\x12\xac\x88\x24\x2c\xc4\x91\x69\x14\x82\xdf\x7a\xb0\x89\x99\x0c\x51\xdd\x6e\xa7\xc7\x2b\x63\x4b\xde\xb8\x39\x78\xd7\xe9\x7e\xef\x46\xf7\xda\x32\x60\xc5\x0f\x12\x5a\x22\x3a\xd1\x95\x57\x54\x9a\xa2\x9a\xb6\x4c\x62\xdf\xb0\x60\xfc\x27\x77\x24\x62\xf9\x7f\x2e\x30\x1b\xb1\x81\x13\xe1\xe5\xe4\x92\x46\x5c\x93\xa0\xf8\xfa\x14\x27\x3c\x7c\xe2\xb9\x11\x1e\xe3\x63\x50\x8d\x4d\xc9\x04\x91\x5a\xaa\x3d\x63\xc5\x00\x34\x37\x59\xa3\xad\x18\xa2\xef\xbe\xc9\x53\x61\x7e\x64\xa3\x12\x20\xa5\x4e\x64\x6f\x72\xc4\x1e\x9f\x65\xe0\xa7\x93\x20\x32\x12\xf0\x4c\x24\x88\xeb\xb3\xee\x14\x8b\x0c\x49\x42\xd3\x32\x74\x31\x7f\x15\xad\x0e\x4c\x0b\xa2\x6f\x5d\xb4\xe0\x08\xb6\x9c\x53\x53\x98\x15\x7e\x7b\x14\xd9\x41\xac\xee\x70\x6c\x76\x97\xc3\x4e\xad\x22\x38\x21\xe2\x0a\x51\x2e\x99\x91\xe8\xc3\x0d\x4c\x03\x9b\x9e\x9e\x42\x52\x8c\xd4\x62\x83\x98\x2e\x8c\x9b\xd5\x24\xf0\x64\xe7\x62\x04\xbd\xc7\xdb\xdb\x31\x55\x84\xb1\xe9\x4a\xd8\x07\x4d\xf4\x75\x68\xb2\x53\x68\x6a\x88\xea\x5a\xec\x1d\x04\x96\xcc\x2e\x2c\xf5\x0d\x9e\x72\xe1\x3d\xc6\x9d\xaf\xeb\xa7\xa3\x58\xd3\x42\xd1\x7a\xd3\x15\x23\x52\x65\x67\xbd\x98\xad\x7d\xe1\xee\xa9\x10\x8a\xa5\xca\x7e\x02\xb3\x96\x90\x98\x89\x37\x67\x16\xcd\x86\x25\xad\x75\x79\x01\xf6\xe4\xe0\x21\x23\x0f\x64\x39\xa6\x4a\xc0\xca\x24\x3e\x00\x73\x9a\xe7\xdd\xf2\xc1\x9c\xfd\x8d\x13\x44\xdf\xa4\x45\x23\xae\xb3\x91\xcf\x63\x5a\x66\x63\x27\x02\x4f\x82\xee\x12\x33\x44\xd5\xd4\x11\x80\x81\x88\x9a\x51\xfc\x50\x99\x23\x2b\x26\x24\x82\x68\x97\x22\xc7\x6f\x12\x12\xde\x3d\x81\xe8\xc1\x46\x21\x3f\x5d\x96\x6e\x88\x5c\xdf\x38\x45\x0a\x30\x68\xb0\x62\xdf\x12\x52\x76\x2d\x22\xe1\x0d\x2c\xf7\x58\xa2\xc1\x51\xd4\xcc\x78\x18\x1d\x45\x3a\xcc\xd4\xb6\xeb\xac\x74\xc4\x10\x4e\xec\x21\x33\x7b\x43\x7d\x09\x93\x40\xe0\xec\x52\x83\x09\xe2\x2b\x31\x58\x89\x84\x01\x28\x3e\x4b\xf8\x50\x49\x2a\xa7\xfd\x34\xf1\xb9\xe1\x66\x24\xc2\x13\x1a\xf8\x97\x47\xc3\x73\x60\x81\x96\xd2\xad\x2c\xff\x08\xe2\xbd\x9a\xfb\x15\xc0\x99\x1b\xca\xd6\x4e\xc2\x5a\x88\x47\xc8\x90\x85\x9e\x48\xe0\xd2\xce\x4c\x62\x66\xce\x7c\xe0\x89\x07\x8f\xe0\x43\x9e\xb2\x86\x0a\x8d\x34\x23\x61\x1f\x73\xda\x9c\x4d\xa2\x1e\x24\x37\x36\x36\x88\xd6\xb4\x74\x41\x05\xc5\x07\x1b\x77\xa4\x62\x3a\x47\x88\x9d\xee\x38\x13\x79\xac\x13\x6a\xc8\xd8\x26\x6d\xcb\xbc\xd3\xed\x40\x87\xc3\x15\xb9\x69\x9e\x8a\xe9\x34\x71\x0f\xac\x61\xcc\x81\x99\x3a\xb6\xbd\x7f\x4b\x23\x0b\x3c\xcb\xd2\x98\xce\xb6\x5c\x68\x7f\x43\x95\x65\x8c\x68\x7b\x36\x0a\x82\xd5\xe0\xc2\x32\x1b\x83\x09\x76\xd3\x16\x92\x69\xd6\x3a\xcc\x8c\x18\xfa\x1b\xea\x45\xec\x03\x38\xbf\xbb\xe5\x79\x0d\xd9\x11\xce\x52\x6e\x93\xd0\x65\x6a\x84\x97\x58\x33\x6a\xd4\x50\xc4\x8d\x16\x91\xb5\xf8\xca\x60\x54\xea\xc1\xdb\x8a\xb2\x20\x94\x06\x66\xe3\x10\x50\xf3\x66\x50\xb6\x60\xe8\xcd\x69\x3b\xac\x44\x22\xe2\x5e\x82\x35\xfc\xff\x18\x32\x68\x9a\x2c\xc9\xfd\x57\x48\xb2\x27\x30\x4b\xc6\x0a\xb7\x14\xd3\xbc\x2c\x94\x47\x9f\xfd\x6b\xf3\xb3\xc7\xca\x58\x65\x7a\x7f\xd1\x81\x8f\x10\x1b\x66\x13\xd8\x95\x53\x82\x91\x64\x5a\x15\x4b\x0d\x41\x2c\x14\x35\x8f\xc0\xf2\x2e\xb2\x46\x04\x0b\x95\x11\x8f\x3f\xad\xeb\xb8\xec\x5f\x55\x37\xae\x57\x6d\x4e\xda\x4d\x9e\x32\xca\xdc\xbb\xfd\x45\xb0\xae\xf6\xa3\x0d\x19\xfb\x52\x6c\xf3\xac\xd5\x22\x78\x6f\x15\x4c\x8d\xaf\x28\xdf\x4a\x14\xbd\x77\x3b\xd1\x50\x72\x4b\x70\x56\x8c\x96\x9b\x3b\x60\x11\xde\xe7\x90\x6d\x95\x11\x15\x4f\xd3\x29\x7a\xa2\x72\x5a\x42\x0b\x18\x0f\x31\x36\x69\x31\x54\x20\xcd\x65\xe4\x9b\xb4\x63\x2b\x45\xdc\x13\x94\xe9\x63\x7e\x70\xd6\xcc\x14\x02\x35\xc5\x20\x78\x66\x0f\x28\xa2\xa7\x15\x92\x98\xed\x82\x9c\xcb\xbc\x31\x79\xdb\xb7\x43\xd0\x06\xc4\x1b\x5f\xfe\x28\xa7\xb9\x7e\x11\xd8\xe5\x00\x20\x6d\x4e\x8b\x3c\x77\x67\x4f\xf5\x48\xd7\xc8\x05\x71\x4e\x7b\x80\xd2\x72\x67\x42\xd9\xc5\xea\xc0\xc7\x6a\xae\x0e\x6c\xbc\x31\xb2\x27\x4d\x52\xd9\xd2\x20\x8a\x77\x0a\xe9\xfb\x05\x3c\xdd\x2f\x07\xc5\x2f\x07\xc5\x2f\x07\xc5\x2f\x07\xc5\x2f\x07\xc5\xff\x8e\x07\xc5\x51\x1e\xf8\x00\x4f\x1d\xa1\x08\xc2\x53\x1b\x30\xd7\x57\xaf\x2f\xd5\xf3\xe6\xe3\xfa\xe5\xe9\x37\xd7\xf2\x58\x57\xaf\x0f\x7f\xaf\x19\xd7\x5c\x19\x40\xfc\xd5\xd5\xcb\xfa\x55\xb2\x12\x10\xfd\xea\x5c\x69\xf7\x6f\xab\x97\x9b\xf5\xfd\x61\xa5\x63\xa7\x86\xb7\xb6\x56\x45\x66\xa0\xc7\xee\x46\xe3\xe0\x05\xa7\x2e\x90\x42\xa5\x51\x5b\x51\xc5\xc5\x88\x39\x9d\xb6\x95\x4e\x6a\x6b\x7a\x8d\x63\x54\x18\x8b\x13\x8f\x37\xc6\xef\x9f\x2f\xf3\xc1\x70\x62\x6b\xe1\xa4\xd6\xec\x54\x9c\x7c\x5a\x6b\xfc\xfe\xa9\xaa\xbb\x83\xd6\xdc\x89\xad\x9d\x06\x23\x7e\xd2\x5a\x3a\xb1\xb5\xd3\xa0\x24\x4c\xa5\x2b\x3b\xad\x1d\x05\x7f\x73\x1a\x94\xc4\x9d\xed\x78\x73\xff\xed\xf6\xfe\x98\x68\x84\x66\x7c\xc0\xb7\xde\xb5\x24\xc0\xb7\x6a\x73\x8a\x2c\x1c\xa1\xbb\x27\x3e\xe2\x67\x98\x9d\xb4\x65\xff\x0f\x94\xc5\x26\xaa\xf7\xea\x12\x4f\x8b\x30\x30\x95\x83\xe4\xf8\x1a\xb1\xb2\x7c\xcc\xda\x5e\xbc\x6d\xf9\xb8\xe7\xdf\xb3\x61\x49\x43\xa5\xc8\x27\xe2\xfd\x2f\x8a\x24\x86\x09\x93\x28\x71\x63\x5a\x77\x63\x54\x88\xda\x64\x54\xc3\x82\x46\x1d\xb2\xf9\xe6\x82\x4d\x2f\x75\x88\x4b\x70\x8c\x0b\x07\xd1\xae\x98\xbe\xde\xb9\x64\x92\x3b\x0c\xd1\xd9\x0c\x6e\x85\xe0\x67\x58\xc8\xd1\x59\xf4\xa2\xef\xbe\xaa\x0b\x24\xc1\x05\x14\x51\x61\x2c\x89\x29\xf1\x6d\xb1\xaf\x99\x08\xe4\xf8\xa8\xf1\x66\x2b\x1d\xc9\x9a\x57\xd4\x47\x06\x94\x33\x54\x61\xfc\xd0\xd6\xa6\xda\x87\xf3\x11\x08\x83\x0a\x2e\x12\xd8\x3c\x3f\x95\x28\xeb\xc4\xd6\x73\x60\xa1\x23\x78\x15\xc1\x10\xcf\x4d\x67\x3a\x87\x2a\x64\x8f\x83\x67\x63\x92\x66\xb0\x4e\x46\x1a\x73\xc4\x4d\xdf\x5f\x85\x0a\x5d\x14\xb7\xc5\x8a\xc9\xb6\x6d\x31\xeb\x1b\x6e\x3f\x3c\x1f\xad\x60\x94\xfb\x6f\x48\x54\x0d\xf7\x97\x3c\xcf\xc6\xfb\xab\x7d\xf1\xee\x96\x24\x9e\x1c\xc6\x55\x63\xc3\xed\x51\xa5\x6e\xe9\x74\x02\xaf\x12\x38\x01\x35\xf2\x2b\xc0\x30\xe3\x03\x5e\xc5\x5e\x35\xa9\xad\xe0\xee\xd6\x8b\x91\x5a\x2c\x79\xf7\x6c\x99\x46\x9e\xa1\x50\x91\x38\xa0\x25\xe5\x96\x87\xb0\x85\x03\x94\x2b\x41\xec\x03\xda\x71\x0d\x81\x3b\xf6\x64\x25\x12\x4c\x19\xc1\xf9\x5c\xd9\xa4\x6f\x5c\x15\xaf\xdf\x22\x41\xf4\xd5\xa4\x57\x3a\x80\x44\xcb\xf1\x5c\x0f\x33\xa0\xe2\x85\x23\x38\x25\x49\xeb\x4e\xa6\xf9\x3d\x1b\x96\x34\x4e\x01\xc5\xd1\xaa\xf4\x43\xf2\x79\x08\xc8\x93\x60\x0a\x99\x84\xdd\xae\x9b\x42\x7c\xdd\xc6\xbc\xd5\x8c\x20\x00\x33\xb0\x31\x95\x29\x37\x08\xfe\x7c\x15\x9c\x9b\xf5\xf3\x6b\xf5\xf8\x7c\xe4\xb2\x4e\x7c\xf6\x94\xbd\x71\x15\xea\xb1\xb2\x2e\x2a\xab\xfc\x50\x9b\x57\x34\x6b\x16\x34\x7c\x43\xea\xb8\xbb\xb5\xa2\x07\x5c\x1a\x5a\x5c\x70\x5b\x2e\x1c\xde\xc0\x91\x06\x66\x47\x1a\x5b\x8d\xc3\xcc\xac\x9e\xb1\x45\x33\x1b\xe4\xe5\x4f\x2f\x40\x93\xb6\xf1\x1d\x7d\x5e\xf3\xfd\xe7\x17\xdc\xf8\xe2\xf9\xed\x37\xdf\x5e\x40\x3f\x85\x0b\x1a\x0f\xa7\x36\x3e\x41\x82\xef\xa6\x55\x9e\xc4\xb4\xd9\x8a\xdf\xf3\x90\x5a\x61\x81\x5c\xea\x33\x27\x3f\xcc\x53\x31\xbf\xb8\xc0\x3d\x45\x12\x85\x03\x47\x75\xa8\x5c\xc7\xdd\x93\x57\xc5\xb4\x72\x66\xe0\xa7\xed\x31\x97\x96\xeb\xde\xa9\x46\x4f\x5e\x57\xb9\x86\xbb\xa7\x2c\xfa\xf8\xf1\x6a\x47\xfa\xd1\x6a\xbf\x18\x49\x2d\xd6\xf5\x97\xa7\xc3\x3c\x99\x50\x26\x2e\x56\x39\x80\x49\x4e\xdb\x43\xa0\x11\x8c\xa0\xc9\x49\xd3\x2f\xb1\x31\x31\xc2\x70\x27\xdb\xa4\x79\x84\x41\x04\x70\x97\x68\x0e\x50\x5c\x44\xc0\xb4\x04\x63\x75\x76\xf1\x6a\x50\x93\x18\xff\xe6\xbf\x1b\x26\x68\x42\x96\x2e\x22\x2a\xda\x82\x59\xe6\xc9\x4e\x3a\xbb\xdc\x85\xc2\x69\x09\xaf\x26\x8f\x33\x23\x22\x90\x9c\xb6\xf0\xc9\xc4\xc8\x56\x7c\xd5\x19\x07\x5e\x99\xde\x1f\x75\x14\xad\x9c\x65\xe3\x2e\x39\xf2\x4e\x75\x31\x47\x6b\x13\xb7\x9d\x5b\x97\x95\x29\x8c\xf8\xeb\xce\xa3\x46\x06\xe0\x18\x4b\x53\x70\xdf\x69\x29\x56\x33\x49\xf3\x41\xa3\xad\x46\xa3\xed\x46\xa3\x51\x22\x56\x34\xca\x2e\x28\xde\xc8\xb4\x79\xa3\x52\x66\xff\xb3\xeb\x5b\x65\x68\x61\x8a\x9b\x1c\x98\x30\x81\xf7\xd9\xbc\x99\x62\x8e\xd7\x79\x7a\xdc\xde\xe1\x22\xf3\x96\x8c\x95\x41\x30\x4a\x92\x66\x89\x15\xc4\xb4\xd5\x08\xb6\x22\x09\xa8\x98\xd3\x3c\x2e\xaf\x4f\x33\xcf\x99\x12\xa4\x39\xd0\x6f\x1c\x1b\x14\xef\x86\xb3\xdf\xc1\x3e\x54\x8c\xd1\x8f\x10\xf9\xcc\x60\x2c\xa8\xe0\x73\xf0\x24\x4e\x63\x97\x9b\xcd\x71\xbb\x3a\xc5\x11\xcd\x8f\xdb\x00\x36\x0d\x3d\x5c\x88\x6c\x4d\x42\xb3\xcc\x06\xb9\xcd\xd7\x17\xb1\xb7\x24\xee\x33\x27\xed\x33\x23\xd8\x64\xe1\xb0\x75\x47\xa3\xe6\x9b\xaf\x2f\x62\x78\xbf\x3a\x7c\x3c\x3c\xfc\x74\xea\xf0\xa7\x1c\xf0\x4f\x07\x12\x6f\x53\x1b\xf9\x51\xc0\xe1\x8d\x9a\x1c\x3f\x0a\x28\xbc\x4d\xcf\xe3\x47\x01\x83\x63\x0a\x1b\x63\x6e\xd0\x97\x19\xcd\x33\xaa\xc4\xac\x87\x6e\xa2\x36\x1a\x49\x9b\x0f\x36\x2b\x8e\x5a\x09\x0c\xb0\x90\xa8\xaa\x08\xe2\x90\xc6\x28\x12\x16\xa0\x50\x66\x21\xba\xed\x15\xc9\x25\x4c\x4e\x33\xce\x8a\x22\xbd\x6e\x62\x2a\x01\x59\xc0\x19\x79\xa1\x5d\xfc\xc0\x6e\x40\x7c\xf1\x44\x06\x9e\x41\xe4\xdd\x1c\xd6\xda\x86\x19\xd7\x97\x54\x4e\x73\x91\x04\x24\x24\x31\x41\x09\x4e\xaa\x2d\x52\xc5\xd3\xd0\xca\xf3\x45\x5e\x4e\xab\x62\xd6\x57\x27\x03\xbd\xbb\x15\x25\x5a\x67\x17\x09\x8a\xf6\xcb\x99\x29\x98\x60\xc8\x69\xd3\xa3\xac\x6b\x2b\xae\x33\x8d\x69\xd2\x96\xad\x53\xfc\xed\x16\xc1\xf1\x19\xed\x8c\x32\x9d\x05\x03\x6a\x14\x27\xa2\x34\x33\xa2\xfe\x6c\x3a\x25\x68\xe9\x33\x37\xfc\xc6\x55\x72\x3b\xf4\xc3\x3f\x3e\xd6\x0f\x1f\x56\xd5\xcb\x11\xe7\x9b\x85\x4a\xe2\x36\x97\xe6\x68\xf9\xbc\x75\x72\xa9\xd5\x2b\x26\x89\xbd\x99\x2b\xfd\x20\xcf\xaa\xb0\xa0\x34\xdd\xee\xc5\x64\xbb\xe3\x30\xee\x38\x37\x93\x0d\x14\x4b\xbf\x40\xb3\x12\x97\xfa\xa3\xf7\x4b\xbf\x08\x2b\x0f\x36\xd5\x94\xc3\xa9\xb8\x61\x10\x2b\x3e\x9d\x2d\x9e\xe6\xde\x6a\x07\x4d\x48\x68\x11\x02\x1b\xa7\xea\x7c\x8d\x53\x6f\xb1\xb2\x09\x24\x12\xf5\x05\x15\xb5\x03\xef\xf9\x87\x1b\xd9\x22\x60\xe3\xb8\x95\xb2\x1d\x1c\x52\x4e\x9a\x1d\x28\x96\x6d\x36\x6e\x25\x86\xb7\x6b\x7c\x4b\xf9\x69\x05\x3a\xff\x4c\xae\x16\xbf\x43\x45\xcc\x31\x50\xf8\xd5\xad\x5c\xe8\x16\x49\x51\xf6\x5b\x2b\xbe\xfc\xf8\x2d\x82\x0b\x6c\x14\x7e\xca\x65\xbe\xf5\xaa\x5b\xc9\x40\xca\x96\xfe\x4e\x26\xdf\x66\x9b\xa9\xd1\xe8\xb2\x49\x35\xe6\x30\x13\x75\xa1\xc1\x68\xf1\xe8\xc4\x33\x21\x2e\x0d\x8b\x38\x99\xbb\xec\xaa\x49\xe6\x8e\xa7\x57\xde\xdc\x6a\xe6\x69\x76\xde\x13\x83\x22\xeb\x79\xc4\xc1\x29\x2a\xb6\x60\x43\x2d\xf7\x46\xed\x9a\x74\x66\x61\xd9\x30\x50\xae\x6b\xdf\xbc\xdd\x76\xc9\xf5\x7f\xfe\xca\xcd\x09\x78\x65\x27\x26\x14\x12\xba\x67\x81\xb4\x8a\x0b\x7b\x27\xf6\xfd\xbc\x43\xfc\xea\x94\x60\xde\x53\xad\xfa\xec\x2d\x7d\xdc\x8e\x90\xc8\x54\x32\x36\xb6\xa5\xe5\x35\x22\xbf\xb2\x5b\x5e\x9c\x0b\x14\x1a\x94\x21\x5e\xe9\x49\x5b\x8d\xbf\x76\x6e\x89\xec\xdd\x13\xe9\xdc\xd2\x49\x4e\xf4\x76\x05\xa3\x56\x71\x75\xdb\xb8\x8a\x0b\x27\x8e\x9d\x46\x4d\x4a\xf9\x1d\xc3\x39\x16\x25\x9d\x3a\x83\xcd\xf9\xb6\xae\x7f\xf8\xb4\x7e\xbe\xfa\xbc\x7e\x7c\x7e\xdd\xfc\xe6\x9a\x8a\x2b\x2c\xae\xa8\xb8\x8a\x57\xe8\x73\x82\x74\x85\xb1\x4d\xa5\x0c\x8b\x53\x09\xc9\xce\xa9\x09\x89\xc7\x11\xfe\xd3\x78\x1c\xa1\xf3\x9d\x9a\xf4\xb5\xda\x5c\xab\xbd\xd0\x55\x4a\x38\x34\x25\x3e\xcf\x08\x51\x4e\xec\x15\xda\x9c\xf4\xb3\x24\xaf\x4c\x9d\xd5\x7f\xed\xd6\xa3\x1b\xc1\xce\x00\x06\xd3\x62\xdf\x5e\x69\xda\x3b\x00\x5e\x3a\xdf\x2f\x60\x93\x4a\xe7\x25\x89\x57\x3e\x27\x54\x5c\xd9\x26\xa1\x6e\xb8\x45\xb7\xe8\x9c\x81\xd4\xa6\x52\x45\x4e\x9b\xda\x4f\x18\x3d\x43\xd0\x01\xe8\xf3\xd2\x40\x4e\xe3\x15\xd9\x36\xf5\x57\xe4\xdb\x54\x3a\xd8\xa4\xc5\xa0\x8b\x43\x48\xb5\x83\x2e\x9e\xd2\x33\xdc\x3f\x87\xf1\xca\x48\x75\x4d\x2a\xd3\xd0\xa4\xd2\x76\x4e\x49\xa6\x33\xa7\xe6\x84\x5d\x82\xb4\x7f\x3e\x64\x9e\x9b\x99\x28\xda\x54\x56\xab\x49\x63\xff\xb3\x7f\x41\x96\x2e\x7f\x48\x45\xf7\x70\x42\x6f\xcc\x08\x38\x79\x20\x3f\xf0\xe2\x5c\xb8\x69\xd1\x8e\xaa\x25\x9a\x56\xeb\xcf\xab\xd6\xed\x9d\xbb\xbc\x50\x14\xdb\x74\x08\x3f\xb1\x5f\xa8\x6e\xe9\x8c\x4c\x9c\xa1\x36\xf5\x92\x93\xd3\x13\xb6\x20\x8e\x51\x13\x35\x73\xb7\x17\xe1\x9d\x02\x96\xfb\x71\x53\x3f\xb6\x38\x18\x9b\x1f\xec\x19\xdb\x82\x46\xb7\x1f\xe2\x09\xad\xee\xde\xcd\xfe\x69\xf3\xdd\xb1\x08\x4a\x94\x1a\x6f\x5f\x4c\x5b\x61\x1f\xf7\x58\x14\xd2\x20\xd0\x0a\xab\xc6\xe7\x4a\xec\xf4\xb6\x84\x52\x61\xda\xc8\xa8\x96\x79\x28\xb4\x13\xca\x15\x92\xfc\x6b\x58\xee\x2c\x40\x8b\x54\xa2\x03\x17\xaa\xd6\x08\xb2\x53\xb9\x53\x12\x27\x52\x1b\x65\x21\x9a\x15\x81\xf1\x77\x4f\x4e\x88\xd6\x19\x82\xf1\xa2\x1b\xd4\x12\x3e\x51\xa5\xec\x2f\xc2\x50\x4e\x9a\x7e\x26\xe6\x60\x22\xd8\x93\xed\xd8\x47\xb6\x2d\xe2\x29\xc6\x84\x5a\x7b\x26\xf4\x8c\x44\xc6\x1b\xf2\xac\xd9\xb6\x17\x42\x67\x95\x61\x3c\x78\x5c\x60\x28\x3d\x24\xaa\x28\x33\x8d\x9d\x26\x52\xee\xa4\x04\x12\xb1\x4d\x92\xad\xa1\xf8\x51\x1c\x06\x66\x7f\x38\xd4\x87\x38\x42\x40\x07\xa6\x86\x64\x24\x2a\xf8\x4c\xac\xdf\x6c\x66\xb3\x50\xec\x58\xd1\x29\x4c\x2b\x03\x2e\xd6\xa2\xa1\x24\x66\x28\x93\x39\x55\x79\x4e\x57\x9c\x6c\x79\x0d\x87\xe2\x5f\x66\x51\x20\xa4\x95\xcd\xdc\xf7\x28\x5f\x43\x48\x5b\x6d\xc1\x8e\x0a\x5a\x37\xe8\x04\xc6\x8e\xbd\xa3\x43\xdc\x22\x20\x95\x98\x20\xc6\x2a\xab\x05\xb6\xc6\xc0\xa8\x5b\xe8\x99\xa3\x93\x7b\xde\xb4\x42\xda\x0a\x41\x0b\x3e\x81\xef\x9a\x95\x59\x14\x5f\x1e\x7d\x34\x1e\xe6\x5c\xc1\x8b\x8f\x87\xee\x2d\x0d\x58\x0f\x56\x66\x5c\x87\xd5\xe0\x67\xc3\xd5\x51\xfd\x82\xde\xdd\x92\x91\xc0\x30\xae\x24\xbf\x25\x1e\x0b\xff\xbe\x7b\x72\x60\x44\x8e\x2b\x21\xcc\x9c\xab\xc5\xae\xf7\x12\xdb\x2c\x2b\x17\x9f\x19\x88\x1c\x38\x71\x5f\x89\xd5\x08\x68\x10\x8a\xc0\x84\x74\x10\x9f\x9b\xa1\x16\xb7\x2c\x0e\xfc\x91\xcd\x97\x79\x11\x09\x6c\x67\xbb\x3b\xe5\xec\x12\xc4\x4b\x66\xcc\x49\xbb\x0b\x45\xd3\x8d\xc0\xc4\x9c\xb4\xfb\x10\x8d\x78\x7c\x62\xee\xea\xe0\x3e\x9c\x27\x31\xd0\x0d\x65\xe4\x17\xbc\x32\x9d\x76\x84\x12\xa6\x65\xc5\xac\x0c\x43\x9e\x63\xc8\xa3\x43\x90\x47\xe0\xd2\x16\x92\xf8\xf2\x95\xc0\x1f\x2b\x86\xaa\x2d\x33\x9c\x12\xf8\xf1\x18\xb0\xf8\x26\x94\xa7\x00\x8b\xc0\x2e\x84\x31\xa8\x04\xea\x23\xa1\x1f\x06\x15\xc7\x13\xdb\xcc\xff\xc8\x97\xf0\x49\xd2\xbb\x11\x1a\xfd\x97\xea\xbe\x3a\x7a\x0d\x8b\x71\x29\x7e\x62\xb5\x17\x8b\x53\x2d\x5a\x2b\x4b\x2d\xed\x6b\xb4\x9c\xad\x25\xfb\x46\x62\xaa\x8a\xbb\x59\x65\x41\x6e\xbf\x51\xd9\xad\x81\xb0\x64\xd6\x5e\x15\xe0\x74\x82\xa4\x9c\xfc\x15\xf5\x4b\xda\x38\x70\x4a\x5c\x46\xa1\x84\x1d\xb0\x7f\x7e\xfe\xf3\xeb\xd2\x81\xd1\x85\x14\x58\x5e\x78\xf9\x8b\x05\x98\x95\xa6\xa5\xe8\xe4\x6a\x03\x41\x45\x30\x3a\x4a\xcc\x4f\xb3\xe1\x07\xce\xd4\x4d\xe6\x92\x21\x86\xc4\xfd\x57\x80\xa8\x42\xce\xdd\x5a\x10\xaf\x69\x51\x15\x60\xb5\x01\x54\x24\xa9\x81\x24\xed\xe6\xf0\x70\x5c\x6e\xf9\xbf\x8d\x95\x77\xad\xb6\x22\x66\x93\xd0\x56\xda\xf0\x97\xda\x40\x5c\x10\xe0\x0d\x46\xf0\x4a\x82\x27\x19\xf9\xa3\xe8\x26\x01\x89\x93\x87\xfc\x17\xe3\x26\x70\x9d\x3e\xff\x7f\x83\x5e\xe7\xdf\x1a\x7d\x69\xe8\x6f\x57\xb7\x54\x28\x8c\x4d\xf3\x08\xa8\x0b\x3e\x6a\x34\x29\xda\x68\xe2\x1f\x9a\x34\x6d\xe4\x2f\x67\x7f\x20\x71\x0e\x92\x94\x7c\xf6\xb7\xf3\x8f\x86\xd1\xc2\x52\xb7\xb0\x1f\x72\x74\x29\x65\xb3\x27\xb0\x00\xcc\x23\x07\x8d\x06\x44\x75\x00\x35\xee\xac\x68\x6c\x56\xd4\x0c\x57\x34\xb6\x2b\x6a\x78\x68\xa3\x35\x35\xcd\x9a\x1a\x5e\x53\x3a\xb8\xa6\x1f\x18\x8e\x88\x1a\x80\x92\xde\xe4\x25\xa5\xc1\x92\x52\x5e\x52\x02\x54\x85\x54\xc1\xe8\x8e\x0f\xa2\xa4\x6c\x5e\x54\x9e\x57\x71\x73\x20\xda\xbf\xbc\xaf\xb9\x44\x65\x8f\x48\x3c\xdb\x82\x10\x34\x97\x11\x30\xe6\x4c\x4b\xcd\xd0\x81\xf2\x2f\xeb\x15\x73\x01\x41\x5a\x90\x14\xa9\x42\x17\x19\xf8\xb9\xd5\xa5\x96\xd3\x43\xa3\x57\x01\x48\xcb\x2a\xb7\xed\xaa\x28\x1d\x3d\xb0\xfc\xcb\x42\x75\xff\x31\x28\x9c\xbb\x83\xff\xe9\xf9\xfe\xcb\xf2\x58\x3c\x49\x89\xe0\x2a\xcb\x8a\xe2\xe1\xca\x31\x6a\x14\xb7\x08\xda\x68\x5f\x21\x89\xcd\x39\xf5\x17\xa7\xa2\x8c\xed\x65\x46\x5c\x93\x34\x08\x55\xde\x99\xed\x7e\x41\x39\x0e\x37\x8f\x49\x42\x33\x23\x90\x51\x5e\x1b\xe5\x37\x17\x35\xa5\xf6\x7f\xa1\x3c\x84\xaf\x37\x15\xc5\xb2\x60\xa8\x37\x8c\x4d\x53\xf9\x5f\x8b\x3c\xc5\xd7\x57\xb8\x61\x74\x95\x7d\x34\x38\x71\x45\xc5\xf0\xe8\x94\x38\x25\x26\x03\xa1\xec\x2d\x3a\xc5\xf3\x4e\x69\x80\xd2\x12\xc5\xc1\x60\x34\xca\x40\xe1\xb5\xcd\x71\x8e\xc9\xca\x53\x65\xf9\xf8\xb7\x2d\x0d\x20\x2e\xc2\x7c\xa6\xf1\x2c\xf8\x26\xe9\x4a\x9c\x16\x39\xb4\x65\xa4\x6f\x5b\xcc\x9f\xa5\xe0\x4d\x28\x4f\x6b\x24\xb8\x73\x2b\x9e\xce\xa6\x25\xfb\xda\x90\x9a\x18\xbc\x63\x36\x6f\xb0\x79\xd2\x5c\x8e\x4a\xeb\x5c\x69\xec\x70\x2c\x8a\x4a\xc3\x67\x95\x0c\x54\xf3\xe6\x86\xc0\x3b\xc2\x70\x82\x2e\xdb\x73\x30\x79\x26\x4f\xd5\xee\xf4\x49\x70\xcb\xbd\xf3\xcd\x0b\x75\x43\xe2\x26\x4a\xc2\xfb\x29\xf2\x22\xf8\x73\xa2\xac\xdd\xc3\xe5\x5d\x63\x67\x9a\x4c\x25\xb6\x0b\xd9\x82\xa1\x6d\x42\xc8\x68\xc1\xce\x4e\x02\x6e\x64\x45\x26\x65\x95\x28\x44\x51\x90\xb3\xd6\x46\x85\xda\xce\x76\x3e\x57\x6d\xcd\x77\x4f\x79\xca\xde\xbf\x85\x3c\x90\xa6\x11\x8d\x39\xa8\xef\x8f\x30\x10\x14\xb8\xb4\xa7\x5d\x2a\xef\x39\xf2\x1f\x36\x8f\x9b\xa3\x08\x23\x49\xec\x64\x0f\xc6\xae\x8a\x59\x1b\x97\xae\x85\x30\xca\x7e\xe2\x68\x4e\x56\x9c\xac\x19\x09\x64\x28\x1e\x42\xf3\xa5\xd2\x84\xea\xd3\x4d\xbc\x4b\xa4\x55\xb1\xaf\x8c\xc1\x15\x85\xa2\x0e\xd8\xd4\xc6\x53\xd8\x55\x36\x26\xaa\x24\x46\x79\x31\xf7\x62\x7b\x20\x2f\x8b\x93\x26\x3e\x81\xf7\x6d\x51\x1f\x24\xdc\x66\x63\x6c\x9d\x6d\x39\x3a\x3d\x06\xa9\x24\x31\x71\xb7\x3b\x4a\x09\xc9\x1d\x62\x9d\xdd\xfa\x89\xa4\x3a\xbb\xf2\xe4\xc7\x3d\x84\xad\xf8\x2d\xdf\x37\x44\x11\x83\xcb\xf0\x0f\xd6\x25\x0e\xb8\xda\xd9\x65\x2e\x73\xf8\xa6\xf8\x72\xe0\x31\xee\xd9\xb5\xe2\xec\x21\xcf\xef\xde\x01\x0e\x16\xf2\x22\x88\xb9\xa9\x3e\x57\xcb\xc7\xa3\x31\x8b\x1d\x33\x27\x45\xaf\xfb\x2d\xb1\xbd\x17\xbc\x40\x9d\x53\x17\x14\x05\x6d\x63\x24\x32\x6f\x37\x90\xf6\xcb\x4b\x2e\x97\xce\x6d\xbb\xfd\xf2\x22\xe5\x3c\x5e\xdd\x54\x9a\x09\xe8\x49\xc1\x78\xbd\x2e\x90\xc0\x1b\x6e\x82\xb0\x77\x15\xd4\x41\xb8\x39\xbb\x8d\x5d\x47\x00\x1f\xfe\xf5\xcb\xe3\x51\x75\xf7\xb0\x3b\xc5\x69\xd0\x3e\x4f\xf1\x68\x69\xe3\x25\xf6\x27\x18\xd5\x10\xe2\x73\x83\xc5\xb8\xb9\xad\x19\x37\x77\x12\x9c\x4f\x96\x32\x08\x9b\x28\xfe\x86\xc4\x66\x29\x8c\xbc\x11\x49\x6c\x28\x4b\x73\x26\xe3\xc0\x25\xd5\x3a\x93\x8a\x38\x79\x2d\x7b\x73\xb7\xfc\x4e\xd6\x9b\xcf\xa4\x51\xd8\xf1\xeb\x30\xf6\xdc\xbe\xdf\x95\xbb\x44\xe8\xb7\xc8\x7d\xca\x9e\x02\xc7\xde\xeb\x5b\x17\x0b\x3d\x23\x78\x12\xab\x6f\xa6\xca\x63\x4c\xf3\xf8\x5a\x98\x4d\xe3\xab\x56\x0a\xc6\x48\x09\x51\xcb\xf9\xce\x27\x52\x27\xa1\x12\xe6\x78\xf0\x0e\x1f\xfe\x75\x0e\x34\x0a\x7c\x9e\x55\xcc\x9e\xb7\x61\x6d\x48\xa2\x64\x9e\xaf\x78\x64\xc4\x64\x81\x6c\xad\x73\x0b\x7d\xf7\x74\xd3\xf4\xb0\x77\x7a\xdc\x3b\x79\x85\x47\x30\xf7\x5d\x2d\x34\xee\xa0\x3a\xb9\x83\x53\x55\x51\x3c\x00\x40\xc5\x08\x80\x4c\x91\x21\xa8\x96\x57\xf4\x60\x51\xc7\x10\x44\x31\x83\x90\xbc\x27\x26\x88\xe7\x81\x90\x29\x7e\x54\x18\xf2\x3b\x58\xa4\x5c\x6f\x5e\xff\xfb\xcb\xfa\xcb\xe7\xc3\xf4\x05\x42\xc1\x7b\x75\xa5\xd1\xce\xe4\x19\xfb\xc0\x90\x5e\x19\xb3\x40\x3e\xf8\xc7\xf9\xfc\xa8\x39\x59\xed\xf9\x88\x24\x02\x32\xd2\xc2\x98\xdd\xb2\xa6\xb5\xbb\x5b\x89\x27\x62\x44\xd5\x90\x8a\x05\x9a\x92\x33\x4e\x77\x13\xda\x5f\xf7\x15\x50\xc4\xe6\xc2\x0c\x52\x1f\x03\x23\x9e\x1f\x69\x63\xe4\x80\x54\xfc\xf8\x45\x5c\x69\x5a\xa4\x95\x46\x5a\x84\x15\x0e\xf1\x3d\xaa\x53\xb4\x12\x1a\xff\xfc\x53\x83\x17\x32\x5c\xbf\x5b\x69\xc4\x85\x59\x21\x9d\x5d\xff\xf8\x52\x05\x4d\x3b\x37\x3c\x86\xb8\xf7\xc6\x06\x4e\xb9\x0f\x6b\x7c\xf3\xb7\x03\x78\x23\xaf\xdc\x84\xf4\x64\x00\xc0\xab\x39\x36\x0f\x37\x05\x38\x34\x96\x02\x26\x31\x65\x28\x0a\x74\xce\xdb\xab\x02\x0a\x8b\xc9\x7b\x13\xbc\x93\x98\xc1\xde\x15\x18\xfd\x55\xa1\x4c\x71\x35\x2f\x54\xba\xba\x61\xa6\xde\x16\xc6\x19\xb2\xe1\xaa\x00\x1b\xf3\xa3\x0a\x90\xe8\x4a\xea\x97\xa7\x79\x6e\x54\x9e\x6f\xd0\x81\x0f\xde\xfa\xe0\x9a\xd7\x7c\x8e\x6e\xd3\xd5\x93\x33\xd2\xd5\x3c\x3f\x98\xe2\xea\x46\x64\x86\xb1\x30\xc6\x0f\x3b\xc2\x35\x59\xef\x02\xc5\x61\xb7\xbb\x01\xde\x5d\xdd\x5a\x81\x7e\x84\xe4\xaf\xe6\xf9\xd9\xc8\x33\xd2\xee\x8f\xe1\x5b\xf2\x7c\x77\x75\x1b\x04\x26\x2c\xc4\x78\x35\xcf\xcf\x01\x0a\x7b\x35\x4f\x3b\xcf\xc3\x77\xe4\xf9\x6e\x08\x60\x6f\x54\xe8\x13\x48\x97\xc8\x27\x7c\x94\x5e\xcd\x31\x4e\x9e\xfd\xd5\xdc\xf7\x7f\xec\x95\xc4\x9e\x56\xf6\xea\x06\x13\x78\x47\x14\x6d\x50\xf6\x4a\xaa\xb0\x60\x6d\x08\xe8\xc8\xe5\xdf\xee\x6a\x3e\xa8\xfa\xe4\xde\x99\xeb\x56\x7a\xc2\x23\x2c\xae\xe6\x8d\x8f\xec\xfe\xe9\x6a\x8e\x38\x7a\xe0\x22\x93\x1f\x6e\xc8\x80\x37\xb9\x7f\xc5\x55\xae\xa4\x18\x74\x30\xcf\xfa\xd5\xbc\xab\xfe\x6e\x97\x1c\x7b\x5d\xbf\x54\x9f\x1e\x66\xf7\xd5\xe7\xd7\x23\xa6\x32\x12\xbd\x69\x48\x18\x09\xa5\x14\x57\x7a\xc2\x0d\xad\xec\x82\xd2\x80\x5c\x6a\xbe\x3b\x09\xff\x4d\xbd\x24\x33\x0a\xf1\x8a\xc2\x4a\x93\x5b\xa4\x15\xb9\x01\xd1\x60\x94\x59\x90\x9d\x0d\x32\x9a\x97\xef\x9e\x34\x19\x4d\x2b\x32\x53\x0f\x81\x23\xa7\x59\x9a\x11\xdf\x69\x76\x33\x4d\xf7\xfa\x8b\x5d\x28\xfc\xfb\xdc\xed\x9a\xc3\x75\x0f\x94\x25\xce\xab\xdb\xee\x4c\x2b\x66\xd7\xbd\xb4\xd2\x71\x41\xc5\x2a\x2c\xd0\xae\x68\x1b\x86\xb4\x6e\xf3\xc6\x49\xe4\xca\x04\xbe\x7e\xb7\xbe\x7f\x38\x7e\x50\x1b\x89\x36\xcb\x7c\x47\xac\xb5\x15\x37\x69\x10\xcd\x82\x71\x7b\x1a\xba\x72\x73\x4c\x1d\x06\xde\x16\xde\xaa\x04\x38\x32\xd2\x2d\xe6\xe2\xcd\x5a\xac\x24\xc7\x1f\x41\x0c\x5b\x27\x37\xa5\xb6\xf1\x6b\x6f\x46\x2f\x70\xb9\x07\x1a\x39\x5c\x75\x10\xc5\xc7\xb0\x13\x16\x7a\xe4\x72\xb2\xa8\x2d\x24\x97\xc5\x71\xcd\x7d\x51\x34\xe3\x6f\xd1\x0e\x29\x24\x9b\x34\xa0\x95\xda\xf4\xa4\x36\x70\x1a\xa2\x17\x35\x58\x37\x76\xb7\xd6\x4e\xc8\xdd\x2d\x13\x1d\x72\x8d\x81\x54\x8b\x9d\x2d\x89\xc3\xee\xc4\xc3\xb1\xd9\xc5\xb0\x16\xaf\x10\x04\x12\x30\xce\x87\xbb\x5b\x14\xc7\x80\xa6\x00\xef\xea\xb6\xd0\xd9\x05\x99\xda\x82\x8f\x5a\x3c\x79\xd8\xec\x21\x25\x2c\x28\x36\x41\x38\x25\xe4\x49\x76\x1b\x0a\xce\xf2\x3c\x8b\xa5\xc1\x42\x1e\xb8\x6d\xcf\xd5\x84\x39\xbf\x7c\x9a\x6c\x68\x0a\x79\x12\x5c\xd7\x9a\x09\x32\xc1\x04\x63\xcc\xe1\x14\xa6\x7e\xb6\x17\xa2\x28\x3b\xc0\x36\x32\x7b\xa1\x76\x40\xa8\x47\x04\x0b\x18\xf1\xab\xdb\xd7\x0e\x26\x4a\x2e\x0f\x4f\x74\x30\xa3\x40\xc4\xa0\xfd\x0c\x27\xf3\xec\x2a\x8e\x4b\x93\x1b\x74\xa5\xe9\xef\x39\x58\xa2\x87\x72\x45\x0e\x0a\x37\x1d\x73\x00\x67\xa6\x63\xf2\xb5\x8c\xd8\x2e\xa2\xd8\x4e\x76\x85\x72\x1f\x81\x3c\x60\xa7\x27\x14\x1a\x04\x3b\x4f\x0c\x1d\x11\x82\x3b\x30\x38\x2b\x56\x95\xc8\x83\xb3\x83\x5a\x9b\x8e\x9d\x44\xe3\xed\xd9\xe3\x87\x03\xf7\xa2\xf8\x6c\x16\x65\x09\x52\x94\xc0\x24\x5e\x6a\x17\xeb\x08\x4e\x6e\x69\xa2\x28\x8e\xa7\xad\x84\x4e\xbd\xcd\xc1\x0f\x8d\xca\x9f\x91\xc2\x90\x33\x16\x54\xf0\x28\x25\x1b\x83\xb2\x62\x36\x7e\x9a\xc4\x69\xc7\xfd\xbe\xeb\x7a\x96\x15\xd4\xbf\xd2\x35\x4c\x4d\xdf\xf2\x87\xa4\xf2\xbe\xe9\xfa\x26\xd9\x28\xb1\x17\x4e\xed\xdc\x2e\xc0\xe4\x38\x96\x86\x6a\xdd\x74\x66\xe1\xc1\xe3\x5c\xdc\x32\x05\xac\x47\x3d\x7b\xd2\x1e\x9c\xe6\xb3\x56\xca\x53\xcd\x3f\x0d\x04\xb7\x08\x10\x02\xe7\x09\x0a\x61\xca\x70\xd7\x56\xed\xa4\x95\xae\x9e\x1e\x36\x9f\xab\xe5\xd1\x88\x85\x16\x70\xc4\x6d\x72\x87\x4d\x2d\x57\x60\xe2\x50\xd5\x53\xad\xf3\xaf\x21\x22\x36\x21\x6b\xac\x0c\xf9\x46\xd9\xc8\x75\xd0\x16\x0a\xb7\x88\xa7\xb9\x60\xdd\x5d\xee\xc4\x78\x4f\x62\x07\x65\x45\x65\x5a\x24\x30\x71\x2e\xd9\x1e\x46\x22\x16\x09\xa3\x34\x27\x95\x17\x97\x67\x2d\x3b\xc8\x34\x10\x7d\x35\xee\x21\xf7\x7c\xe8\xa1\xa4\x6d\xe4\xb2\xc5\x2f\x94\x28\xf2\x4e\xc3\x3a\xda\xa9\x6e\x36\x4d\x23\x43\x8e\x74\xbe\xb9\x96\xbb\xa7\xa0\x8a\xad\x93\x10\xcb\x74\xf7\xa4\x9d\x0a\x2b\x27\xbf\xb9\x84\x8f\x12\xfe\x79\xf7\xe4\x74\x28\x31\x2d\x90\x56\x17\xe3\x82\x63\xd2\x3d\x3e\x95\x3c\x63\x54\x0b\x46\x8c\x4f\xbd\xc0\xa7\x03\x63\x6b\x94\x0b\x27\x26\xe8\xc0\x98\xbb\x5b\xb9\xce\xc1\x58\xa7\xec\x7a\x3f\x69\xfe\xb3\x40\x82\x48\xfc\x89\x84\xd9\x92\x6b\xbb\x93\x6c\xad\x70\xda\xe3\x3f\xac\x0f\x8b\x23\x29\xeb\x54\x17\x95\x57\x8d\x53\x0a\xed\xb5\x5f\x0c\x33\x94\xd7\xbe\x24\x3f\xcc\x50\x7e\x41\x7e\xd6\x67\x48\x2d\xa2\xfb\x3d\x08\x1d\xa4\xad\xb2\x0b\x1a\xc6\x12\x12\xfd\xe7\x51\x86\xb6\xdc\xd4\xe0\x13\x7d\x21\xc2\xf3\xe0\xbc\x42\x57\xa2\x03\x6b\x67\x08\xd6\x28\x6c\x6f\xfb\xc4\xe2\x06\x3d\x58\xbb\x8d\xe2\x21\x63\x5a\xea\x84\x36\xe0\xc1\x82\xf3\x3b\xc5\x24\x1c\x9a\xf3\x0b\xa9\x62\xb7\xb8\x69\xfa\x8e\xe7\x94\x6c\x89\xa2\xca\x73\x92\xc6\xf8\x9e\x6d\x42\x60\x15\xa6\x12\x8b\x05\x52\x49\xc5\x16\x81\x69\x58\xbd\xdb\x79\x2a\xa4\xf9\xa2\x4c\xfb\x3a\x27\xac\xe9\xa1\x71\xa7\xec\x49\x7d\x75\x9a\x91\x65\x0f\x64\x37\xeb\xe7\xd7\x97\x75\x3d\xff\xf2\x3c\x01\xb3\xf1\x58\xf2\xf4\xa5\x4a\x0e\x11\x49\x9a\x9e\x43\x70\xe0\x52\x8d\x4c\xe7\x20\x58\xac\x48\xcc\x7c\xa9\x37\xf6\xd5\x56\x43\xbc\x0c\x37\x32\xcb\x04\x4e\x88\x2c\xb3\x24\x89\xf7\x60\x45\x43\xc2\x2a\xcc\x77\xae\xf2\x77\x93\x00\x75\x0e\x42\xa0\xf9\xf7\xd6\x01\xe2\x52\x43\x92\xa8\x0d\x4c\x9c\xa2\xd1\xd9\x60\xc6\xcc\x8c\x95\x18\x0d\xb6\xf7\xaa\x1c\x19\xbe\x78\xdb\xc7\xca\x16\x10\xbd\xca\x69\x8f\xad\x00\xfd\xb2\x51\x9d\x4a\x5c\x55\xd7\x54\xc2\xad\x01\x32\x2b\x5a\xc4\x55\xb1\x69\x8e\x8c\x22\x88\x15\xaf\x71\x3a\x42\xd4\x56\x82\x18\x58\xf9\xfb\xc1\xe6\xf0\x62\x12\xd3\xd8\x6c\x99\x8d\x5f\x32\x0a\x35\xd9\x1d\x20\x5a\xe5\xf3\x7d\x7a\xa0\x79\x14\x85\xaf\x08\x3e\xde\x64\x52\x43\x4e\x03\x71\x9a\x1f\xad\x6a\x26\x46\xee\x8e\x1d\xf8\xb8\x0c\x80\x2e\xdf\x93\x4a\x18\x46\x6b\xc5\x57\x34\xb7\x0d\xd6\x43\xcc\x1e\xfc\x73\x46\x53\xf0\x41\xae\x84\x25\x84\x81\x57\xf1\x46\x7e\x05\xf1\xaf\x28\xee\xae\xb3\xdf\x99\x5c\xfb\x65\x24\x66\xb6\xbb\x11\x85\x51\x2b\xe1\x7c\x6c\xbe\xc1\x9f\x73\x46\x52\xc6\xae\x98\x33\x98\x1a\x6d\x1a\x48\x66\x64\xb7\x99\x6b\x91\xd8\xd0\x45\xc9\x0b\x66\x73\xb4\x13\xa6\x28\x02\xf3\x59\x3c\x5f\xb6\x94\x17\xb7\xa7\x74\xd9\xec\x6e\x60\x51\x5a\xa3\xc1\x2d\x08\x9f\xff\x43\xaf\x58\xcd\x0b\x27\x89\x08\xb3\x08\xef\xa7\xd8\x5c\x5a\x7f\x57\xdd\x7f\x7a\xb8\xdf\xbb\xc9\xda\xc2\x9f\xf7\x42\x1d\x1b\x02\x1d\x1c\xc2\xa5\x0b\x77\xac\x55\x73\xb8\xd5\xec\x06\xc1\xfe\x48\xa8\x05\x0d\x10\x55\x01\x0c\xa9\xd0\x29\x49\x6b\x52\x40\x71\xcb\xef\xdd\x50\x12\x85\x5c\x9f\x79\x80\xdc\x17\xd5\x76\xea\x8c\x91\xda\x83\x23\x7d\x23\x3e\xae\x6c\x60\x72\x2a\xa7\x79\xac\x01\x8a\xa4\xc1\xf1\x10\x24\x50\x4a\x1b\x2b\x46\x42\x35\x64\x5d\xc3\x00\x36\x27\xb9\xc0\x81\x8b\x60\xe8\x26\xa3\x23\x2c\x72\xf4\xf6\x01\xca\xca\x4e\x69\xa3\xb2\xd9\x76\xd2\xf0\xbc\xc9\x9f\xdc\xaa\x01\xf4\x50\x48\x40\x47\xde\x47\x95\x44\x5e\x09\x7d\xd0\x42\xa0\xa4\xdb\xb0\x87\x28\xee\xf6\xa3\xce\xea\x4b\xf9\xaf\x03\x12\x2d\x4f\x05\x89\x53\xc6\xdf\xef\x81\xb1\x4f\x5f\x0e\x37\x5d\x8e\x81\xd3\x46\xb1\x6f\xc9\x41\xc8\x5f\x7e\x73\x7d\x20\xdc\xef\xb1\xca\xfd\xa4\x50\x7e\xfc\x38\xa8\x6a\xac\x83\xf9\xb3\xc2\x35\x55\xfd\xf0\xf2\x7a\x10\x5f\x36\xa5\x3f\x02\xb6\x39\xd2\x2e\x1d\x6e\xf7\x8d\xbb\x70\xc5\xeb\xd5\xc4\x03\x73\x9d\x63\x18\x23\xfc\x58\x3c\x67\x5b\x89\xa7\x37\x02\xe3\xa0\x70\xcc\x28\x8b\xf4\x0f\x21\x47\x11\xe5\x9d\xe4\x75\xd6\x99\xc3\xa0\x19\x1c\xac\x08\x47\x09\x7f\xea\xad\x74\x64\x56\xcd\xe1\x59\x7d\x17\x54\xed\xc0\x96\xa6\x38\x99\xf4\x3c\x67\x28\xf6\xf0\x50\x24\x8a\x0c\x77\xd8\x66\xcb\x72\x95\x20\x49\x58\x67\xf1\x22\xdd\xb9\x62\x20\x11\x68\x99\xd2\x18\x09\xd3\x3f\x29\x6e\x17\x76\x4e\x29\x3b\x9d\x96\xbb\x67\x8a\x62\xc9\xd0\xb3\x4f\x4d\x43\xe7\x8c\xc0\x4d\x4b\xe5\xd7\x1e\xe4\x73\xf6\x46\x3b\x78\x39\x7a\x80\xf6\xc1\xd2\xd0\x02\xf9\x94\x65\x70\x16\x55\x69\x51\xd5\xce\x3e\xcd\x19\x76\x0d\x98\x99\x15\x27\xd7\x39\xed\x96\x31\x09\x93\x19\x20\xc6\x99\x2d\x44\x4b\xa6\x68\x77\x5d\xd6\xc3\x4c\x4b\x21\xd0\x0d\xf0\xee\x12\xad\x73\x71\x23\xc1\xfb\x90\x96\x9a\x72\x14\x3d\xe3\xa5\x39\x31\xc2\xf0\xb9\x3d\xeb\xb9\x41\x24\x65\x3b\x7b\x7f\x69\xd0\x00\xe2\x02\xb1\xda\xd3\x9a\x2c\x9e\xed\xda\x8b\x8c\x7f\x9b\x06\xe3\x22\x40\x34\xe2\x39\x1a\x19\x4b\x52\x60\x2e\x45\x62\x5c\x37\x6c\x0a\xba\x0f\x12\x0e\x29\x07\xf9\x55\xfc\x7a\x69\x79\xbb\x06\xd1\xde\x44\x9e\x0a\x2f\x13\xa1\x02\x78\x23\x8e\xc6\x6b\xe2\x7d\x69\x14\xb8\x04\x9e\x56\x18\xaa\xde\x8c\xcc\x68\xd3\x20\xee\x41\x5e\x33\xdd\x77\x7c\xae\xf0\x29\xbd\x20\x0b\x76\xd7\xed\xba\x0c\x1f\x42\xad\x11\x48\x1c\x1c\xd8\x9b\x24\xf7\x0b\x12\x2a\x30\x07\x7d\xf2\x0c\xb2\x4d\x35\x77\xb7\x46\x22\x09\x1a\x1a\x4a\xb4\x15\xf2\x31\x93\x68\x2e\x5e\xaf\x1b\x39\xae\x13\xd7\x70\x26\x1f\x0d\xc7\x2f\xfe\x0f\x5e\xe1\xbe\x37\xa4\x4e\xce\xe2\x21\xc4\x7e\x8d\x6a\xff\xe9\x21\x77\xab\x85\x28\x65\x08\xe9\x9c\x96\xdb\x0c\xa1\x26\x89\x4b\x83\xd4\xa9\x94\xea\x24\xe7\xd2\x99\x80\xcc\x54\x61\xf0\x4d\x3a\x26\x27\x67\x13\x72\x52\xbc\x65\x37\x7e\xc9\x8f\x50\x76\x68\xf9\x3c\x32\x10\xb8\x5f\xf9\x48\x42\xf7\x0b\x94\x1f\x83\xc0\x1d\xa6\xeb\xcd\x54\xe8\x57\x2a\x36\x6f\xa4\x40\x2f\xdd\x5a\xe3\xa3\x66\xbc\xb7\x0e\x1d\xa4\x3f\xc9\xe6\xb2\x7c\x86\x8a\xb9\x87\x58\x6c\xe6\x08\x86\x12\x93\xa0\x94\x23\x7a\x12\x4b\x1d\x35\x41\x30\x62\xfb\x51\x62\x3c\x73\x4b\x35\xb4\xa1\x38\xbc\xe9\x7c\xb1\xe6\xbb\x54\x4a\xb5\x1c\x3e\xfe\x38\x45\xf7\xcb\x16\x3a\xb8\x85\x0e\x42\xda\x11\x9a\xfe\x67\x40\xb2\x7d\xad\xf7\xe6\x30\xb9\x36\x89\x09\x7f\xfb\x70\xff\x58\xdd\xac\xaa\xe7\x4f\x3b\xba\x3b\x53\x1d\x1a\x65\x27\xbe\x7f\xfc\x38\x2e\x1e\x29\x2a\x79\xf7\x6c\x11\x5c\x98\xf8\x3b\x37\xb4\x42\xbf\xbf\x60\xd7\x5f\x90\x1f\xbb\x0b\x12\x57\x34\xa6\x58\xf8\xd2\x14\x8b\xf3\x34\x81\x26\xee\x05\x70\xbf\xa2\xdf\xf5\xd0\x11\x81\x3d\xfa\xe6\x05\xda\x3e\xc7\x3c\x1c\x5c\xa4\xea\x63\xdf\xa7\xe2\x5d\x3d\x1f\x0a\x62\xbb\x52\x94\x54\x6c\x3b\x3b\xf4\xec\x37\x8e\x91\x95\xdc\xc1\xad\x1c\x78\x33\x2c\x13\x97\x6f\x27\xea\xfd\x8c\xc6\x13\x25\x46\xa4\x84\x8d\xec\x55\x56\x01\xcf\x73\x55\xe3\x0f\xd7\x6e\x2f\xaf\x3d\x1c\xae\x3d\x5e\x5e\x7b\x3c\x58\xfb\x60\xad\xcf\xae\x3d\x1d\xae\xdd\x5f\x5e\x3b\x16\x3d\x79\xf0\xc6\x4d\x78\xb9\x98\xfc\x92\x3d\x7c\x92\x30\xfb\x92\x3d\x7d\x92\xfc\xfa\x92\x3d\x7e\x92\xf8\xf8\xe2\xcd\x77\x92\x74\xf4\xe2\xcd\xf8\x26\x71\xe9\xbb\x6d\xce\x63\xad\x85\xaf\xb6\x76\xea\x66\x3d\xd6\x5a\xfc\x7a\x6b\x27\x6e\xde\x63\xad\xa5\x83\x1c\x2d\x15\x0a\x0f\x9d\x08\x25\xb9\x59\x80\xc0\x4c\x67\x68\x9d\x55\x92\x01\xef\xf3\x49\x72\xce\x7d\x58\x71\x98\xb5\x16\xa6\xd7\xad\x98\x40\x28\xfd\xc2\x33\x39\xee\x16\xbe\x6a\xe3\xe3\x87\xee\x26\x21\x6a\xfa\x89\xc8\x18\xb9\x0c\x9a\x4d\x7b\xd0\xf4\xf4\x9c\xe1\xef\x20\xba\xf7\xbc\x5d\x40\x3a\xce\xdc\x5d\x86\xbd\x4f\x92\xda\x5f\x86\xbf\x4f\x12\xd4\x5f\x86\xc1\x4f\x92\x5e\x5f\x86\xc3\x4f\x92\x2e\xbf\x03\x16\x7f\x93\x2c\xf8\x1d\xf1\xf8\x91\xf6\xfc\x1b\xda\x3b\x19\x93\x1f\x69\x2f\x7c\xbd\xbd\xd3\x71\xf9\x91\xf6\xe2\x1b\xda\x3b\x19\x9b\x1f\x69\x2f\x1d\x11\xa2\x64\x25\xad\x0e\x89\x32\xc3\x5a\x23\xe0\x4f\x88\x34\x1d\x9c\x75\x41\xc1\x67\xc3\xcf\x98\x61\x7f\xd3\x10\xf0\xad\x97\x2c\xff\xa1\xbc\xb8\xa8\x53\x97\x0c\x9a\x0b\xf2\x25\x86\xbb\xa7\x42\xdb\xe6\x37\x8d\x7f\x63\x9c\xfc\xb6\x93\xdf\x05\xff\xbe\x25\x52\x64\x4b\x2a\x16\x44\x2b\xca\xc5\x54\x2c\x30\xf2\x8f\xec\xd2\x75\x58\x62\x9b\x92\x42\x7b\x79\xad\x58\xed\xb0\x99\x47\xef\x92\xf6\x12\x0e\x55\x00\x9b\x54\xe8\x3d\x3e\x58\x09\xf9\xc9\x3d\xce\x6d\x30\xe1\x32\x9b\xbc\xc4\x20\xe3\xd4\xcf\x99\xc8\xf8\xb9\x2c\xd6\x85\x37\x28\xef\x25\xbf\xfe\x0a\x89\xf3\x79\x10\xa7\x2e\x8b\x13\xed\x8e\x40\xd7\x30\x32\x74\xe0\x70\x2e\x46\x37\x3f\xd9\x3e\x14\xbc\xf8\xf3\x5e\xce\x73\xa4\xf6\x3f\x03\xd4\xfc\x76\x49\xf0\xd7\x64\xa9\x7f\xac\x3e\x3f\x7c\xfb\xf2\xb8\x9d\xaa\xaf\x4f\x2f\x2a\xde\x29\x56\x93\x95\x28\x3a\xa5\xa1\xc5\x49\x21\x63\x76\x6f\xd4\xd1\x48\x8c\x45\x03\xc6\x55\x16\x9c\xc4\x48\xa6\x86\xa1\xb3\xe0\x8c\xfc\x9e\xb5\x4f\x9d\x36\x77\xff\xd5\xdd\x53\xc1\x68\xd1\x56\x24\x02\x78\x4e\x1a\x6f\x26\x90\x8c\xe6\xdf\xb3\x61\x89\x94\xc9\xd7\x54\x40\xb8\xcc\xce\x81\x39\x4a\x3a\xdc\x77\xda\xdf\xf7\xc1\x57\xc7\xfa\x4e\xfb\xfb\x9e\xbf\x3e\xb5\xef\xbb\xba\xab\x5e\x21\x2e\xc8\x80\x73\x65\x14\xf5\xf3\x04\xc6\xf2\xc6\x1c\x9a\x83\xf0\x4b\x97\xea\xae\x8a\x77\x8f\x00\x31\x54\xc3\x89\x68\xa7\x48\xef\x9d\xa2\xfe\xa3\xbb\xa7\x7c\x69\x3b\xcb\xf6\x7c\x39\x70\x10\x76\x6b\x88\x4e\x0d\x0b\xa4\x48\x02\x3c\xe7\x8f\xdf\x53\xed\x55\x8c\xaa\xbb\x81\xec\xac\xf5\xfe\x81\xf4\x1f\xc9\x40\x6c\x1e\xc8\x78\xa9\x33\x38\x38\xb5\xb3\xd2\x5e\xf4\x33\xcf\x1c\xc8\x61\xe5\x57\x23\xc0\x47\xbc\x73\x4b\xbb\x10\x0f\xaf\x21\x4e\xe9\x08\x9d\xe9\x88\xd3\x51\x05\x12\x18\x3b\x13\xeb\x96\xd0\xbb\x68\x6b\xdb\x7c\x57\x7d\xda\x1d\x10\xe6\xa3\xb1\x12\x65\xd2\x4e\xa3\x54\x74\x46\x9d\xa6\xb7\x82\xf5\x49\x02\xcb\xf7\x14\x81\xb8\xb7\x2a\x58\xfe\x1c\xf7\xd3\x79\x7a\x91\x41\x61\x31\x8d\x8c\xdc\xaf\x26\x46\x70\x61\x66\xc4\x21\x65\xe7\x28\x39\x29\x3c\x2c\xbc\x3b\x4f\x4b\x52\x8e\x75\x95\x35\xf2\xfa\x3d\x51\x30\x55\x80\x80\xee\xbc\x4d\xe0\xc0\x9c\xa5\x45\x7a\x44\xef\x90\xe4\x8a\x9b\x6b\x96\x1b\x79\xa7\x4c\xb7\xbd\xc4\xf3\x2a\x38\x27\x3a\xcc\x39\xc9\x10\x11\x00\x11\x9c\xe7\x9d\x81\x61\x7a\xc8\xe8\xec\x86\xe1\x17\x9d\xc2\xe3\xec\xee\x7b\x51\x4c\xa6\x60\x62\xd7\x33\x68\x9f\x10\x7c\x7f\x8f\xcd\x18\xf1\x99\x51\x39\xe5\x1a\x73\x4f\xa7\xdd\x2c\xff\x2a\xb2\x7a\x88\xbc\xc0\x44\x73\x68\x3a\x25\xde\xc7\x15\x0d\xe2\xbe\x36\xf1\xa3\xdf\xca\xbc\xee\x25\x7d\x42\x3a\xd6\x8f\xf6\x85\xe3\xfd\xc8\x6f\xbd\xb9\x1f\x66\x9f\xbe\xcf\x4f\x30\x23\xe7\x28\xdc\xfd\x14\x33\x74\x82\x1a\xd6\x54\xe8\xb0\x68\x81\xb1\x3d\x35\xc7\x22\x08\xa3\xcf\x81\xfa\xf6\xf0\x1f\x4b\x2a\x0e\xdc\x3a\xbc\x55\xdf\xeb\xbd\x19\x71\xfb\xc6\x93\x56\xbc\x10\xc7\x7e\xf9\xd4\x78\xf9\x72\xb1\xd8\x27\x0f\x17\x4f\x8f\x80\xca\x66\xc7\x9b\xef\xc8\xb4\x62\x14\x57\x67\xc3\x7e\x25\x20\x89\x48\xd5\xa9\x81\x05\x89\x77\xdd\xaa\x2b\x91\x68\x65\x05\x1c\x6e\x89\xa6\x12\x09\xb9\x70\x2e\xe8\x9d\xa3\xbe\x34\x3c\x6c\x8b\x0e\x04\xe5\xa8\x9f\x1e\x6a\x0a\xac\x04\x15\xc3\x39\x89\xdb\xb6\xb3\xe0\x71\xdf\x39\xfc\x76\xfd\xa5\x9f\xe3\xe1\xf6\xb5\xde\xdb\x37\x4b\x0c\x66\xcf\x8f\x4f\xd5\xeb\xe3\x7a\x6a\xd8\x3b\xf2\x7d\x91\xbd\xc1\x05\xf1\xad\x2c\x5e\x57\x8a\x46\x81\xd7\x5b\x8d\x33\x0b\x86\x73\x5b\xbd\xde\xec\xf1\x91\x02\x78\x7e\x5d\xbc\x4d\x75\x3a\x83\x28\x51\x13\xc5\x41\x2f\x36\x69\x43\xbb\x68\x02\xe7\x95\x07\x09\xca\xd8\x8c\xbf\x89\xec\xe1\xcd\x8c\x09\x18\xa7\x72\xda\x6c\xaa\xbe\x57\x97\x49\x1e\xa2\x04\x57\x08\xbc\x46\x81\xfb\x13\x86\xa1\xf0\xc5\x93\x1e\x89\x25\x58\xcc\x49\x4b\x6a\x51\xd0\x79\xe1\xac\x10\xc6\x92\x36\x3c\x93\xe1\x7d\x18\x9d\x4a\xfc\x7e\x6a\x3f\x2a\x94\x60\x01\x21\xb0\x53\x8e\xc8\xeb\x87\x82\x0c\x07\x44\xb3\xc6\x4b\xaa\xcd\x86\x23\xd9\x57\x67\xd7\xbf\xcb\xa4\x14\x62\xe8\x46\x1e\x08\x2b\xa4\xc6\x83\x77\x43\xf5\xf3\xc6\xd3\x06\x9c\x38\x31\xce\x21\x90\x25\x6d\x10\x40\xff\xe5\x5d\x53\x8d\x9d\xf1\xf4\xe7\x45\xe8\x14\x6a\x51\x18\x55\x0b\x88\x95\x44\x88\x6b\xe9\x1e\xa6\x3f\x25\xe2\x01\x52\x93\x36\x1f\x88\x33\xe8\x62\x4f\x55\x4d\x23\xcc\xa5\x44\xaf\x30\xae\x4e\xd1\xb8\x6b\x85\x1c\x13\x94\x03\x4e\x30\x59\xa8\x7c\x36\x1e\xb3\x38\x01\xb2\xc0\x40\xe6\x05\xc8\x7a\x86\xb5\xfd\xea\x6c\x4a\x2d\xe4\x80\xcb\xe0\x4c\x95\xc4\x43\xbf\xef\x97\xdc\x8a\x1b\xd1\x59\x0e\x75\x98\xd3\xdc\x6c\xff\xd1\xf9\x94\x99\xf8\xc2\x24\x59\x4e\x71\x29\x85\xad\xa4\x41\xc2\x3d\xa3\x6d\xbc\x47\x0f\x0a\x9b\xb5\xe6\xcf\x4e\xa1\xc3\x26\xf8\xe4\xe6\xf1\xe6\x88\x2b\x0a\xf1\x0a\x85\x09\xa2\xd0\x1a\x13\xd3\x4e\xef\x74\x63\x51\x6e\xdb\xb4\x41\x1b\x21\x9b\x44\x2d\x25\x9a\x74\xde\x9f\xc2\x9a\x56\x09\x1c\xa3\x5f\xd7\x11\xd9\x1a\x6c\xaa\x75\x8e\xa1\x13\x71\x26\x71\x65\x42\xef\xf4\x7d\xd0\x81\x4b\xb1\x86\x69\xd8\xe1\xc6\x76\xd6\x26\x1e\x91\xea\x2d\x52\x09\x48\x8b\x36\x70\xc8\xb6\xf2\xa6\xf7\xed\xe4\xac\xb6\x73\x0c\x8c\x32\xd2\x50\x25\x3d\x02\x32\x37\xbc\x1a\x39\x0d\x63\x8c\x92\x70\x8e\x0c\x3a\x6e\xe8\x6c\x86\x92\x86\x30\xf9\xde\x91\xb2\xb5\x96\xa8\x28\xc6\x0d\xbd\x74\x61\x50\x54\xa3\x7c\x83\x58\x89\x9b\xa5\xd4\xce\x7d\xa1\x09\x0a\xa7\x1c\x18\x09\xc6\x11\x73\xd2\x6c\xc5\x3c\x81\xe4\x6b\x30\x08\x26\x54\x81\xb7\x4b\xe8\x03\x1d\x49\x7c\x52\x0b\x49\x86\x98\x72\xd2\xf4\x9a\xbc\x04\x3e\xaa\x11\x22\x24\xac\x22\x04\xaf\x62\x6f\x95\x91\x9d\x89\x39\x9c\x4d\xdb\x1c\x4c\xee\xa5\xbe\x04\x44\x72\x96\x90\xcf\x09\x4c\x0a\xe3\x2c\x89\xc3\x95\x3e\x5e\x4c\x06\x08\x02\xeb\xaa\x94\x31\x73\x1b\x0e\x57\x1b\xc5\xb0\xc4\x5f\x23\xc8\xd9\x30\x82\xa4\xc4\x03\x69\x86\x3c\x3d\x1b\x24\x30\x41\xa0\x5a\x8e\xf8\xce\xdf\x97\xf8\x16\xd4\x80\xa6\xd6\x3c\x56\x0b\xc5\xd0\xc1\x2c\x4f\x6f\x88\x90\x6c\x1b\xe3\x9e\x01\x9d\x27\x65\x05\x58\x5b\x09\xc0\x6a\x47\x7e\xd7\x92\x46\x18\x1a\x34\xf4\xa3\xbd\x48\x22\x6c\x25\xec\x40\x01\xd6\xae\xa0\x88\xdc\x72\xd2\x3d\x2c\x49\x54\x58\x0c\x9a\x6a\x8d\x60\x12\x20\x55\xa2\xad\x1f\xda\xb3\x0c\xb3\xfc\x09\x33\xf1\x9f\xff\xb5\x60\xef\x4d\xb3\xbd\xb3\x67\x2c\x6a\x2d\x7e\x21\x08\x79\x6a\x96\x9a\xf7\xb7\x96\xfd\xad\x45\x40\x51\x09\xb2\x4a\x9d\x61\x38\x6f\x28\xc5\xf3\xca\x2d\x98\xa1\xf7\x3c\x48\xa4\xb3\x3f\xdb\x81\x27\xe1\x82\xe1\xae\xe6\xee\x4f\x67\x3b\x7b\xc9\x3d\x59\xa8\x3d\x25\x1c\x1a\xd7\x59\xcd\x8e\xa3\x30\xda\x71\x46\xd1\x5c\x7c\x94\x82\x61\xdc\x10\x78\x87\x74\xe4\x38\x12\x63\x01\x11\x51\xca\xbf\x06\xd1\x51\xd2\x34\x27\x46\xc3\xd6\x33\x72\x4b\x2a\x75\xd6\x18\x3a\x47\x12\x4b\x6e\x96\x20\x48\xac\x97\x66\x2c\x81\x61\xdb\x50\xad\x05\x9b\xf7\x8e\xab\xa4\x1b\x31\x71\xd6\x4a\x4e\xe5\x11\x4a\xa9\xc1\x92\x1e\x79\x83\x97\x29\x93\x20\x03\x97\x38\x4b\xec\xa2\x39\xd3\xe1\x63\xc0\x29\x5b\x06\x88\x66\x86\xb9\x7f\x5d\x64\x39\xaf\x1c\x24\x5c\x98\x02\x8a\xb4\x53\x18\xc4\xe2\x97\x4a\xca\x3e\xe5\x04\xf7\x72\xd2\xc0\xbf\xc4\x57\x2d\xd2\x22\xdd\xdd\x92\x04\xe3\x11\xa3\xe0\xac\x35\x6e\xef\x6e\x63\x56\xe0\x27\xda\xfa\x95\x3f\x53\x89\x7f\x20\x86\x93\xa0\xe8\x58\x09\x9d\xd4\x11\x4b\xfb\x62\x34\x6f\x35\x58\xfb\x86\x28\xcd\xab\xa2\x12\x37\x89\x92\x34\x0b\xfe\x1e\x71\x9a\x67\x3b\x71\x9a\x73\xdf\xcf\xf1\xec\x36\x75\x3d\xc7\xdb\xca\x1f\x5a\x49\x9e\x64\x89\x2c\x30\x29\x41\xb1\x2f\x85\x84\x47\x17\x12\x9d\x2c\x24\x29\xf2\xfb\x62\x31\xf3\x91\x15\xb7\x1a\xcc\x9c\x49\xef\xa0\x88\xf7\xf9\xa9\x91\x98\x87\xb3\x8d\x4a\x98\x19\xb0\x51\x16\x62\x54\x85\xce\x81\xb8\x93\xf0\x7b\x4c\x0b\x83\x77\xdb\xbc\xaa\x4d\x98\xe6\xd9\x18\x0e\xb0\x9d\x64\xac\x0b\x91\xb2\x8f\xfa\x2f\x85\xfe\xee\x89\x34\xfa\x85\x83\x68\x6b\x0b\xc4\x5c\xd3\xdb\x83\x93\x35\x7b\xee\x8f\x0f\xcb\xd5\xf3\xba\x5e\x7f\xfa\x41\xb6\xde\xe6\x37\xff\x76\xfd\xf2\xa5\x7e\x78\xd1\x9f\x1f\x9e\x97\x8f\xf5\xf5\x37\x83\x58\x26\x9c\xff\x07\xc9\x56\xd7\x9f\x57\xeb\xe7\x07\xbd\xaa\x9e\xef\x37\x0f\xaf\xc3\xb7\xfe\xc0\x05\x65\xce\x57\xd7\xcf\x6b\xfd\x97\xc7\x8f\x8f\xc3\x17\x7e\xb7\xfe\x1f\x8f\x1f\x1f\xd5\xe3\xf3\xe6\xb5\xaa\xeb\x6f\x86\xc1\x95\x24\x47\x7d\x79\xde\x2d\xfb\x53\x9b\xa7\xea\xea\x87\x87\x97\xcd\xa0\x68\x2e\x19\xea\xbb\x7a\xbd\xfc\x7e\x90\xfd\x5b\xfe\xad\xae\x25\x7b\xa3\x3f\xbd\xac\xbf\x7c\xbe\x9e\x16\x6f\xc4\x25\xab\xfa\xee\xcb\xf3\x7d\xfd\x30\x2c\x94\x0c\xc5\x3d\x1f\xe4\x4a\xb7\xaf\x5f\xaa\xe5\xf7\x7a\xf3\xf0\xb2\x7d\x78\x19\x4d\x4e\xb5\xfc\xfe\x83\xe4\xaa\xeb\x55\xf5\x72\xaf\xef\x1f\x37\xdf\x0f\x5f\x28\xab\x97\xfb\x6f\x1f\x37\xdc\xa5\x6a\xf9\xfd\x97\xcf\xfa\xe5\x61\xf3\xba\x7e\x79\x18\x75\x4a\x4a\xfe\x25\x17\xa8\xfc\xde\x4e\xb1\xba\x7f\xd8\x3e\x2e\x1f\x86\x53\xf0\x6d\xce\x51\xdf\x3f\xfc\xf0\xdd\xba\x7a\xb9\x1f\x14\xfd\x5f\x4d\x96\x7a\x5a\x7f\xd9\x0c\xc7\x78\xcb\xbf\xd5\x7d\xb5\x59\x4d\x3f\xf9\xb6\xcd\x53\xab\xf5\xe6\xf5\x9b\xb1\xb7\x79\xb5\xc9\x9e\x92\xbf\xd9\xf1\x9d\xac\x96\xf5\x97\xcd\xeb\xc3\xcb\xa0\xe4\x26\xe7\xa8\xea\xf3\xe7\xfa\x71\x29\x32\x82\x61\xb7\x67\x83\x6c\xf5\xdd\x97\xc7\xfa\xfe\xf1\xf9\xd3\x68\x19\x72\x96\x5a\x7e\xfe\x32\xac\xf5\x0f\x7f\x52\x4f\x0f\x4f\xeb\x97\x1f\x86\xc3\x91\x0c\x75\x7d\x5f\xbd\x56\xba\xe9\xc9\xf5\x68\x50\xaf\x55\xdb\x9d\xeb\x97\x87\xcd\xfa\xcb\xcb\xf2\x41\x7f\x5e\xaf\xc7\x20\xde\x14\xfc\x61\xbd\xae\xd5\x66\xf5\xf8\x50\x0f\x27\xe6\x83\x64\xa8\xeb\x5c\xa0\x97\xab\x87\xe5\x68\x89\x73\xf9\x0d\x67\x77\x2f\xfd\x75\xf7\x85\xff\x5b\x3d\x3e\x7d\x5e\xbf\x0c\x67\xf6\x9f\x24\x43\x3d\xfc\x75\x92\xff\xdf\x24\x43\x5d\x7f\xf9\x5c\xaf\xab\x7b\xbd\xac\xd7\x5f\xee\x87\x15\xfe\x49\xf2\x6f\x38\x5b\x5d\xdf\xaf\xff\xf2\xbc\xff\xb5\x6f\x9b\x92\xfc\xe2\xe7\xfa\xcb\xa7\xc7\xe7\xe1\x96\x95\x0c\xf5\xb1\x5e\x7f\xfe\x3c\x9c\xd3\x7f\x94\x0c\xb5\x5c\x3f\x7d\xfe\x32\x59\xd8\x26\x4b\xdd\x3f\x6e\x3e\xd7\xd5\xf0\xa3\x6f\x73\x8e\x7a\x7d\x78\x79\x7a\x7c\xae\x86\x9b\xf8\x8f\x4d\x96\x5a\xae\xef\x1f\x46\xb5\xdd\x3f\x0c\x61\x64\x3f\x88\xa8\xef\xaa\xd7\xd7\x87\xd1\xa2\xff\x36\xe7\xa8\xa7\xf5\x77\x8f\xf5\x18\xb8\x39\x43\xbd\x56\xdf\xd5\x0f\xc3\xf9\xfc\xa3\x64\xa8\xeb\xe7\x87\xd7\xbf\xac\x5f\xbe\xd7\x9f\xea\xf5\x77\xa3\x1d\xf8\xbb\x5c\xf0\xdf\x39\xbf\x7f\x6d\xf3\xf0\xfa\xfa\xf8\xfc\x69\xb3\xe7\xcd\x0f\x4d\xd1\xe0\xe5\xbf\x3c\xbe\x2e\x57\xfb\x5e\x95\x02\xf5\xb2\x9e\x4c\xe6\xbf\x48\x86\xda\x3e\x0d\xf2\x16\xb7\xea\x7a\xfb\xf4\x17\x5d\x7d\x1e\x61\xad\xc5\xed\xff\x98\x7d\xfe\xac\x96\x0f\x2f\xaf\x8f\x1f\x79\x5e\x46\xd3\xd8\xe7\xaa\xea\x65\xb9\x7a\xdc\x0e\x4b\x67\x39\x47\x7d\x79\xde\x2d\xfb\x53\x9b\xa7\x96\xeb\xe7\xe7\x87\xe5\xeb\x68\x71\x24\x87\x57\x7a\xb7\xf0\xdb\x2e\x53\xd5\x8f\xcf\x43\xf4\x3b\x7f\x7c\xfe\x5e\x7d\x79\x9e\xe4\xfe\x49\x32\xd4\xb5\x40\xa8\x6e\x66\xec\x7a\x84\x31\xd6\x5f\xee\x9b\xf9\x6a\x5f\xdb\x2c\xab\xfa\x61\xe7\xa5\x0f\x9c\xdb\xbe\xf2\xfa\x52\x7d\xfc\xf8\xb8\xdc\x79\xe9\x8f\x39\x5f\x5d\x2f\xb3\xf7\x41\x5d\x7f\x79\x6e\x5e\xea\xfd\x11\xaa\xfb\x87\xcf\xf5\x7a\x04\xc3\x92\xa1\x56\x0f\xf5\xe3\x5f\x87\xf8\x8f\x7f\xab\x8f\x75\xb5\xf9\x7e\xb4\x4b\xaa\xcd\xf7\xaa\xba\x7f\x7a\x7c\x7e\xdc\xbc\xbe\x54\xaf\xeb\xe1\xe2\xce\x86\xf9\xed\xd1\xf0\xf2\xb8\x7d\xd8\x39\x1b\x38\x73\xf8\x82\x9c\x20\x9b\xbd\xaf\xf1\x39\xb2\x51\xcf\xdb\xa7\xe1\x22\xfe\x6e\x71\xfb\xa0\x36\x9b\x11\xc2\xfa\xf0\xad\xfa\xae\xfe\xf2\xf0\xba\x5e\xbf\xae\x46\x87\x5f\x93\xc7\xe7\x63\xf3\xa8\xd7\x1f\x3f\x5e\xef\x7b\xe7\xf7\x1f\x3f\xaa\xeb\xcf\x2f\xeb\xe5\xc3\x66\xa3\xd7\xcf\x7a\xfb\x34\x3a\xee\x73\xc1\xef\x9f\x19\x62\xab\xcd\xe6\xf1\xd3\xb3\xfe\xb2\x19\xe3\xde\x99\x64\xff\x69\xc3\x27\xc1\xeb\x7a\x08\xe6\xb3\xd7\xf5\x13\x1f\x88\x2f\x9a\x51\xc2\xf8\x28\x7c\x11\xb4\x70\xbd\xbc\xd7\xf7\xdb\x11\x36\xbb\xb9\xff\x76\x7b\xcf\x90\xfa\x5a\x3d\x3e\x4f\xd0\x52\x93\x97\x17\x5c\x1e\xf5\x76\x5d\x7f\x79\x1a\xc3\x4f\x5b\xb6\x90\x22\x75\xfd\xf1\xb1\x7e\xd0\x1b\xe6\x38\x86\xaf\x75\x6c\x88\xba\xfe\xd7\xdd\x0e\xfe\x73\xee\xdf\x97\xcd\x77\xdf\x8c\x02\x65\xab\x97\xea\xbe\x1a\x6d\x6f\xfe\xad\x96\x6d\x58\xaf\x6f\xf6\x84\xfa\x52\x9b\x7f\xfd\xf2\x38\x5a\x38\xfe\xad\x1e\x9b\x68\x93\xdf\xec\x06\xa0\x54\x2f\x4d\x60\xb9\x6f\x76\x63\xcd\xa9\x6b\x3e\xb7\x77\x49\x9e\x2e\x58\x8c\xba\x6e\x0e\x71\x5d\xe5\x78\x07\xd7\xbb\xa7\x79\x13\x09\x81\x29\xb8\xfb\x87\xdd\xba\x3a\x7f\xf6\x8a\xcb\x37\x93\x92\x8d\x7a\x6e\x3d\x24\x7f\xb3\xc7\x6b\xb2\x7c\x33\xf9\x44\x7d\x5e\x0f\x27\xe0\x0f\xeb\x7b\x75\xfd\xf4\x70\xff\x58\xe9\x65\xb6\xeb\xbe\xfe\x66\xbf\xbd\xb7\xba\x7e\xad\x3e\x3f\xec\xee\xa9\x4e\x8f\x51\x55\xed\xfd\xc4\x37\x7b\xee\x2c\xd4\xf5\xf2\x51\x2f\xc7\xf0\xf5\x78\x73\x3f\x84\x09\x4d\x7b\xa1\x82\xfe\x5d\xfd\xfe\xbb\xff\xf7\x61\xf9\x0a\xf7\x0f\x1f\x1f\x9f\x79\x27\x7c\x7e\x78\x79\xfd\xe1\xef\x77\x89\x6a\x75\xdd\x10\x8c\xea\x01\xee\x1f\x36\xcb\x97\xc7\xcf\xaf\x6b\xc6\x40\x1f\x1f\x3f\xed\x79\x1d\x78\xfd\x7e\xf5\xab\x13\xaa\x5f\xae\x9f\x9e\xaa\xe7\xfb\xb7\xd6\xdf\x9e\xcd\x27\xb5\x91\x0f\x59\x2d\x84\xff\x5b\x1b\xca\xdf\x9c\xd4\x4c\xfd\xb8\x7c\x78\xde\xbc\xb9\x85\xc1\x51\x78\x52\x33\xfd\x71\xf6\xf0\xd6\x69\xfb\x9f\x1d\x37\xf3\xff\x9c\xd4\xd4\xcb\xc3\xf2\xe1\xf1\xed\xab\xff\x3f\x27\xbc\xd5\x69\x8d\xdd\x3f\x30\xae\x7d\x73\x53\x23\x5e\xef\xc4\x96\x9e\xab\x37\xc3\x33\x1f\x9c\x27\x55\xfe\x71\x5d\xdf\x3f\xbc\x34\x38\xf9\xad\x83\x19\xa0\x71\x1e\xca\xf5\x97\xe7\xdc\xd2\xfd\xf5\xdf\xfd\xe6\xf5\x87\xcf\x0f\xeb\x8f\x57\x7f\x79\x7c\xbe\x5f\xff\xe5\xbf\xfe\xd7\xfc\x17\x56\xd5\xe6\xf7\x7f\x79\xee\x7a\x72\x7d\x53\x57\x2f\x8f\xaf\x3f\xfc\xd3\x72\xfd\xbc\xb9\xfe\x55\xf7\xda\x30\x1b\xaa\xfb\xfb\x3d\xad\xff\xea\xdf\xd5\x35\xfc\xfa\xf3\xcb\x9a\x47\xb8\xf9\xf5\x23\xbf\xfa\xeb\xcd\xcb\xf2\xd7\x1b\x29\xfe\xf5\xeb\xc3\x5f\x5f\xf5\xc3\xfd\xe3\xab\xde\x34\x7b\x70\x73\xfd\xcd\x7f\xf9\xf5\x3f\xfc\xdd\x3f\x9c\xf7\xbf\xbf\xfb\x87\x3f\xff\x97\xab\x2b\xfe\xfa\xea\xc4\x66\xaf\xf8\xeb\xff\x72\x75\xf5\xe7\x33\x5b\xfe\x35\xf7\xfa\xea\x79\x7d\xb5\x79\xad\x5e\x1f\x97\x57\x99\x69\xd9\x5c\x7d\x5c\x7f\x79\xbe\xbf\xfa\x87\x5f\x7f\xfc\xf2\xbc\x64\xcc\xfa\xf7\xb5\xaa\xd4\xeb\xaf\xfe\xed\xfa\xcb\xe6\xe1\x6a\xf3\xfa\xf2\xb8\x7c\xbd\xfe\x3f\x0e\x40\x80\xba\xfe\x5f\xff\xeb\x61\x73\xbb\xbe\xff\x52\x3f\x5c\xab\x7f\xdb\x56\xf5\x97\x87\x6f\xfe\xae\xf8\xf7\x2c\xa1\xf8\xeb\xeb\x7f\xbb\x7f\x7c\x6d\xe4\x13\x83\x93\xea\xcb\xe7\x87\x97\x0c\x16\xa3\xdc\xef\x76\xf3\x5e\x5f\x1e\xbf\x7f\x78\x5d\xbd\xac\xbf\x7c\x5a\xfd\x66\x74\x9a\x3e\x3c\x0f\x5f\xfc\xfd\x97\xd7\x49\x4e\xf9\xf8\x69\x55\x3f\x7e\x5a\xbd\x3e\xbc\xfc\x66\xc8\xc9\xfc\xf5\xf5\x66\x5d\xaf\x87\x79\xf3\xea\xf9\xd3\x97\xea\xd3\xc3\x20\x6b\x56\x3f\x7e\x7a\xfe\xe3\xfa\xf3\x34\xeb\xf6\xf1\xfe\xbe\xde\x79\xf1\xb7\xeb\xd7\xd7\xf5\xd3\x6f\x86\xd4\xf2\xfd\xc3\x4b\xfd\xf8\xfc\x30\x69\x79\xfa\xe1\xbf\x70\xff\x26\x05\x22\xdf\xf8\xe7\x2f\xeb\xd7\xe1\xc7\x7f\xa8\x1e\x9f\x5f\xff\x65\x5d\xd7\xa3\xc1\xfc\xee\xcb\xd3\x77\x0f\x2f\xf3\xc7\xcd\x4e\xc5\xf3\x87\x8f\xd3\x7a\xff\xcf\x2f\x9b\xd7\xc7\x8f\x3f\x4c\x72\xff\xe9\xb5\xaa\x1f\x97\x7b\xfb\xb5\xaf\xce\x69\xde\xcd\xc3\xf3\x78\x7e\xff\x71\xfd\xfc\xfa\xe1\xf1\x6f\xc3\xbe\x0b\x5b\xfd\xdd\xfa\xaf\x93\x7e\xe6\x4f\xa7\x83\xff\x52\xd7\x0f\xaf\x93\x37\x7f\xbb\xae\xef\x7f\xb3\x5d\x3f\xde\x5f\x15\xea\xf5\x37\xaf\x7f\xcf\x50\x0c\xf0\xeb\x2f\xaf\x8f\xf5\xe6\xd7\x9b\xed\x27\xfd\x5a\x7d\xd2\x9f\x1e\x9e\x1f\x84\x54\xbf\xfa\x87\x5f\xef\xdf\xcf\x07\xde\xe7\xfd\x3c\x94\x61\x4b\x6b\x07\xa5\xd7\xe2\xb3\x49\xdc\xe5\x4e\x02\x57\x17\x8a\xc4\x87\xb7\x09\x5b\x0d\x85\x9f\x44\xa2\x2e\xe4\xce\x42\x1b\x20\x27\x1e\xc9\x72\xd2\xde\x6b\xa0\x91\x78\x0d\x2b\x1d\x66\x39\x9e\xf1\x20\x9c\x71\xa1\x92\xc4\xd8\xf1\x95\x84\xa7\x96\xa4\x95\xa5\x06\x89\x59\x6d\x57\x01\x8c\x59\xda\xac\xb9\x1d\xc4\x71\x37\xc4\x98\x9f\x1c\x18\x89\x80\x63\x6e\xc8\x83\x21\x85\x49\x24\xc9\x16\x82\x91\xbb\x36\x52\x83\x21\xdd\xdd\x62\xd6\xce\x41\xb0\x2b\x0b\xce\x2e\x29\xbb\xc7\x75\x10\x93\xca\x21\x8c\xc1\x98\x2d\x14\x5e\xe2\xf0\x7b\x89\xf6\x2f\x37\x7d\x49\x9c\xa7\xc9\x53\x29\x95\x48\xe4\x1f\x13\x14\xd1\x32\xdb\xe5\xcb\x0c\xf0\x0b\x46\x9b\x1c\xf9\xc7\x9a\xfc\xea\x02\xc5\xc5\x93\x5b\x52\xd6\x18\x33\xe0\xc5\x0b\x1c\xff\xe5\x06\x4f\x0e\x8f\x3a\xba\x93\x18\x80\xd4\x64\x55\x07\xea\x64\x0e\x08\xb3\x42\x59\x02\x0c\xa2\x53\x76\x8a\x9b\x11\x09\xea\xb7\xb7\x3a\x0c\x67\xd4\x47\x87\xeb\x13\x3d\xde\x53\xeb\x9b\x06\xca\x25\xb0\xa4\xd2\x38\x8c\x58\x89\xc5\x56\x42\x9c\x5b\x9a\x5c\x2c\x92\x3a\xc5\xce\x64\x1a\x90\x34\x47\xe0\xf4\x83\xea\x87\x01\x3a\xf5\x69\xb1\xb9\xf6\x54\x4d\xf6\x3d\xaa\xde\x0d\xd0\x39\x40\x4f\x07\x03\x7f\x15\x0c\xa5\xb1\x74\x12\x15\x0b\x78\xdf\x76\xad\x2b\x02\x2a\xe5\x85\x41\x09\x36\x17\xee\xa7\x85\xfb\x18\x07\xbc\x94\x10\x3d\x1e\x68\x5f\xb5\x2b\x2d\x57\x2e\xa3\x7c\x75\x5a\x73\x34\x8d\x27\xcb\x18\x8b\x8a\xd2\x41\x70\xfb\xc6\xb8\x22\x0b\x3b\x05\x27\x0e\x71\x02\x9e\x12\x27\x51\x91\x2f\x25\x68\xd8\xbe\xf1\x94\xf2\xca\x85\x13\xbb\x1b\xd9\x79\x74\x50\x1d\x5c\xf4\x1c\x5e\x63\x00\xd0\xe6\x6c\xa8\xc3\x5d\x80\x36\x23\x80\x3e\xbf\xea\x69\x04\x6e\x09\x06\x87\xc5\x0a\xfd\xb8\xca\x95\x3e\xa8\x3d\xff\x86\xa5\xe2\x53\x43\x19\xd9\x78\x62\x9a\xd0\x1f\x6a\x59\x5b\x6f\x1e\xe4\xfe\x4f\x82\xad\x8b\x51\x42\x80\x68\x67\xe3\x75\x23\x48\x2a\x81\xb1\xb5\x68\x3f\x38\x30\x73\xa9\xd5\xcd\xc6\x40\xd5\x35\x75\xd1\x12\x77\xe4\xc9\xe1\xa8\xbb\x2a\x41\x11\xb9\x71\xa3\x10\x70\x60\xc6\x15\xbd\x8a\xa5\x05\xbf\x0f\x24\x31\x95\x88\x0b\x0a\xd3\x79\xe0\xa2\xa0\x8a\x05\x16\x80\x69\xe5\xc1\xa7\x99\xf8\x29\xc5\xee\xa2\x57\x35\x2d\x5e\x00\x36\x05\xd3\x20\xe8\x4a\x42\xd8\xbb\xff\x31\x95\xe4\x16\xe4\x65\xa3\xee\xef\x5e\x00\x32\x2b\x23\xfa\x2a\x3b\x9b\x0a\x4f\x33\x91\x9c\x4e\xf9\x90\x4e\x3c\xbc\xa9\x18\xc7\x60\x5a\xa0\x5f\xf9\x49\xbc\xcb\x30\x3d\xa7\xd2\x62\x18\x21\x51\xc2\xa9\x97\x38\x8e\xa6\x88\xdb\x89\xc2\xc7\xca\x6f\x6d\xe9\x8e\xbf\x53\x62\xd8\xda\xa9\x2d\x74\x51\x1a\x9c\x74\x88\x46\x9a\x37\xdc\xf3\xbb\x5b\x24\x85\x62\x35\x64\xb7\x8d\xa1\x47\x2c\xfd\x82\xf6\x19\x7a\x9c\x44\xbc\xf4\x84\xf7\xa1\xa9\x73\x23\xcf\xa6\x56\xd1\xc2\x4c\x07\x31\x3c\xd0\xdd\x49\xd1\x8a\x77\x10\x14\x2f\x53\x7c\xeb\xac\x3c\x69\x54\xb1\xc4\xe2\xe4\x79\x98\x06\x79\xb6\x0a\xdd\x0e\x1c\xc4\x05\xfa\x92\xcc\xa0\x55\x79\xef\xee\x49\x93\x50\x33\x62\xd7\x78\x2a\x6a\xdb\x9d\xfc\xcc\x0a\x1d\x01\xdc\x09\xe4\x1d\x9f\x7e\x73\x5a\xb4\xe8\xc9\xfc\x5b\x45\xbb\x50\x4b\x71\xc1\xe7\xf3\x18\x08\xf0\xee\x89\xb8\xcc\x6f\x7d\x79\x5a\x88\xaa\x31\x7e\x27\x15\xf6\x35\xe8\x4b\x1c\x4e\x3c\xbf\x36\x68\xf0\xf4\x13\x65\x34\xed\x0d\x4b\x7a\x10\x43\x5b\x71\xd4\x5a\x32\x65\xbd\x17\xd9\xad\x08\xd0\xcc\xc5\xb3\xad\xc4\x9f\x70\x25\x16\x12\xab\x6f\x2f\xd6\x0e\xb0\x8f\x90\xe0\x12\x07\x0e\x6b\x2f\xcc\x99\x03\xe3\x57\x62\x24\x7b\x21\x7a\xdc\xdd\xe1\x43\xb6\xfc\x60\xf0\x62\x51\x99\x63\x8a\x20\xec\xe0\x77\xa6\x7a\x4a\x7f\x21\xd5\xb7\x4b\x88\x04\xa7\xd0\xee\xaf\xf7\x70\x3f\x2e\xa0\x33\x99\xd4\x63\xe4\xe2\xf7\x9f\xaf\x3b\x74\xe6\x39\x6d\x4e\xd9\xa0\x42\xc2\xd1\x3a\x88\x86\x9b\x3d\x44\xc1\xdb\x4b\xc9\xdb\x5d\x2a\x64\x2c\xa2\x39\x08\xe8\x99\xf6\xf6\xa5\xdf\x0a\xcd\xcb\x3f\x2f\xec\xca\x94\x99\x88\x32\xe5\xb9\xfa\x38\x21\xb8\xa4\xf0\x02\xa4\x4d\xe0\x15\x3a\xc0\x69\xb5\x08\x19\xb4\x72\xab\x08\x53\x42\xaf\xfb\xf0\x02\x0e\x22\xf1\xcc\xc5\xb6\x8d\x34\x9e\xb8\xf7\x61\x16\x06\xb2\xb7\xe9\x02\xae\xeb\x1f\x3e\xad\x9f\xaf\x3e\xaf\x1f\x9f\x5f\x37\xcc\xbc\x5b\x7f\x15\xc0\xe2\x95\x3c\x89\x3d\xee\x95\x07\xef\x86\x8f\x1e\x0a\x77\xe5\x20\xe4\x07\xcb\x49\x00\xf4\x57\x16\x1c\x5d\xc5\xab\xae\x8e\xb3\xd7\xda\x81\x0b\x0a\x2d\x44\xaa\x20\xf8\x56\x13\x1b\x15\x44\x03\xc1\x2c\x0b\x95\x7d\xdf\x23\x04\xab\xb3\x52\x1e\x85\x5a\x93\x42\x70\x61\x8b\x65\x00\x1f\x16\x18\x81\x98\xdd\x35\xa6\x46\x0d\x21\x2c\x39\x15\xa3\x25\xdd\x9a\x38\x45\xcd\xdb\x57\x94\xfc\x62\x2b\xfa\x22\x8d\xdc\x1e\x81\x37\x39\x69\x41\x57\x08\xe1\x22\xd6\xd2\x21\x33\xcb\x58\x87\x93\xdc\xb5\xbe\xcb\xe7\x83\xa1\x44\x6d\x24\x0b\x9e\x29\x5b\xc3\xc3\x31\xd4\x53\x2d\x40\x61\x59\xf0\x70\x35\x84\x98\x03\x4c\x91\xfc\xa9\x08\x3c\x2a\x6a\xcd\x81\xa4\xb3\x0a\x6b\xf0\x09\x02\x0f\x30\x48\x14\xdb\xd6\x46\x01\xc1\x68\xf0\x76\x09\xce\x8a\x76\x36\x01\x79\x4e\xbd\xdf\x68\x30\x8c\xd2\x34\x2a\xf0\x54\x5a\x08\x69\x8b\x2b\x79\x57\xbc\x52\x22\x14\x41\xac\x4e\xf9\xaf\x37\xfc\xba\x13\xb1\x9a\x02\xdf\xdb\xb6\x49\xbc\x24\xaf\x25\x1c\x36\x04\x3e\x86\xc4\xc6\x88\xb2\x3b\xf8\x06\x57\x21\x24\xb3\x14\x3b\xb9\x22\xc7\x92\xc9\xd2\x33\x91\x2d\x7a\x66\xba\x0c\x2f\x4a\xab\xe1\xae\xfa\x89\xb9\x00\x83\xfe\x22\x48\xfa\xba\x20\x69\x28\xba\x3f\x46\x46\x16\x0b\x3b\x89\x85\x3b\x76\xed\x64\xb7\x7e\x1a\x4d\x37\x0d\x4d\xcc\xb9\x8a\xbb\x5b\xaf\x6c\x49\xe9\x44\xaa\x6f\x7a\xfc\x1b\xe5\x4b\x43\x5b\x0f\x94\xe6\x18\x79\x8b\xfb\x61\xe8\xf2\x42\x76\xfd\x82\x69\x24\xbf\x30\x66\xdc\xab\xd5\x8e\x05\x66\x2a\xa9\xd8\x6a\x08\x66\x6e\x0c\x18\x85\xa3\x48\xf5\x81\x39\xbc\x51\xec\x78\xe5\xef\x6e\x89\x1f\x4a\x8c\x0b\xc2\x5d\x7f\x4f\x5f\xdd\xfc\xad\xff\xc2\xc6\xd3\x65\xef\xe8\x32\xf4\x9e\x0b\xb1\xb8\xbe\x7a\xf9\xeb\x6f\xae\xf1\xfa\xea\xe5\x07\xf9\xf3\x36\xe5\xdb\x43\x13\x65\x65\xa2\xc4\x57\x86\x1d\x59\xea\x70\x5e\x3b\x55\x76\xc2\x94\xda\x09\x0f\xd5\x4e\x55\x24\x9e\x2a\x4a\x0a\xed\x70\x6a\xac\x42\xb3\x3b\x59\x6f\xb5\x12\xdb\x91\x8b\xf7\xf7\x4c\x07\xad\x3f\x51\x6c\xf0\x3c\x38\x57\x89\xc1\x9e\x6d\x2d\x99\x04\x21\xa2\x84\xa4\x95\x88\xfb\x39\x2d\x1a\x23\x10\xe3\xb5\x58\xb5\xf6\xa7\x3a\x23\x30\x3e\x05\x96\xda\x2a\x93\xef\x25\x42\x54\x01\x42\xf3\x24\xb1\xf1\x67\x2e\xeb\xaf\x17\x9d\x31\x50\x21\xb1\xe4\xe2\xc8\xf4\x54\x94\xc8\x23\x37\x67\x81\x9a\xa4\x3d\xd4\x23\xd8\x93\x2f\x0b\x86\x16\x6a\xdd\x58\x29\x29\x9b\x51\xe9\x64\xac\x2e\x27\xdd\x48\xdd\x68\xa4\x98\x2f\x7a\xd2\x57\x87\x5a\x4d\x87\x6a\x94\x05\x2f\xe6\xb4\x41\xd9\xd6\x07\x4f\xa1\x24\x4e\x63\x75\xf1\x40\x0f\x48\x65\xfa\xeb\xc7\x83\x10\x60\xc1\x3b\x45\x63\x56\x2b\xaf\x81\xfc\x12\x1b\x6e\xcf\xbc\x52\xd8\x11\xd8\x75\x9f\x9e\xbf\x22\x1e\x12\x13\x8c\x53\x1a\x32\x8a\x81\xb5\xb4\x5d\x94\x53\xba\xb5\xfd\xe6\x02\xae\x57\xcc\x33\xdd\xb1\x31\xa3\x2d\x19\x0e\xa6\x43\x6e\x3f\x3c\xff\x48\xf5\x4c\xfe\xec\xb0\x99\x0d\x2f\xb2\x38\xcd\x6a\x69\xba\xe6\xc7\x57\x9a\x39\x59\x15\x21\x32\xa1\x64\x99\x0e\xeb\x2c\x04\x65\xef\xae\x74\x16\xc6\x5b\x86\x77\xeb\xfb\x22\x52\x38\x17\x71\xa6\x44\xc8\xae\x84\x02\xc1\x7e\xef\x00\xcf\x53\x52\x23\xc4\xa7\xb0\xb1\x56\xea\xaf\x32\x8b\xc8\x04\x65\x4d\xfc\xc0\x80\xb3\x42\x94\x1f\x4a\x62\x49\x36\xb1\x5a\xa8\xc7\x00\x48\x99\xc8\x2c\x62\x4e\x06\xf5\x34\x99\x62\x3f\xe3\x6d\xdf\x0d\x0d\x2e\xdc\xdd\x4a\xa4\x4f\x2a\x20\x60\x6d\xe5\x56\xb2\x00\x22\xde\x7c\xc2\x63\x5f\xc2\x34\x93\x74\xd2\x42\x88\x33\x0f\xc6\x29\x49\x9a\x6d\x1c\xb8\x7e\x03\x54\xa1\x5c\x98\xe6\x34\xf7\xcc\xf2\x61\x3a\x30\x5d\x03\x17\x45\x68\x3e\xb0\xf6\xb3\x90\x78\xba\xc8\xe4\xa4\xc9\x36\x49\xec\x7d\x22\x53\xeb\xb1\x35\xa1\x11\xbf\x0f\xa4\x21\xe2\x92\xc4\x4a\xcc\x66\xbf\x02\xc6\xe4\x27\x03\x89\xb6\xcc\x49\x3b\x59\x27\xd7\x2f\x94\x05\x4b\x1a\x3c\x2e\xb5\x04\xe3\x29\xb4\xcf\xf4\xb9\xc7\xfc\xc4\xa4\xe2\x16\x0a\x27\x21\x7b\x12\x53\x9f\x8c\xa9\xac\x84\xbe\xcf\x4f\x95\x17\x2f\x0d\x5d\x95\xca\x01\x26\x4d\x60\xe3\x82\xe9\xe1\x6a\x02\x03\xc3\xa3\x0f\x0a\xbf\xc0\x34\x73\x39\x9e\x74\x18\x50\x8d\xed\x9c\xde\x3d\xe9\x1c\x96\x35\xc7\x0c\x22\xf1\x0c\x11\x94\x81\x98\x74\x0e\x96\xc8\x4f\x28\x16\x94\x3c\x82\x5c\x69\x7e\x22\x88\x5e\x6e\xe5\x97\x85\x04\x90\x45\x70\x5a\xe6\x43\x1b\x99\x08\x99\x87\x0e\xa7\x33\x03\x7a\x32\xf6\x18\x6d\xb4\x5e\xfd\xe3\xe0\x6e\x13\xfb\x34\x0c\xcb\xe6\x08\x88\x60\x63\xf6\xc6\x24\x4f\x69\x11\x1b\x59\xbc\xb8\x80\x68\xbd\xc7\x10\x18\x55\x6c\xb1\x80\xb8\xe4\x85\xb5\x96\x73\xa2\xf2\x10\x64\x8d\x8c\x3c\x6d\xb4\x07\xe2\x31\xdb\x90\x9f\x3c\x44\xf7\xb5\xfa\x6e\x92\x98\xc2\x3a\xb9\x1e\x30\xb9\x6f\xaa\xed\xe4\x45\x02\x63\x53\x94\xc2\x7c\xcb\xa6\x1f\x09\x57\xb0\x34\x82\xd8\x47\x25\xf2\xc5\xe5\x27\x5b\xa3\x91\x73\x90\xde\xb6\xdc\xaf\x11\x95\xaf\xa8\x1c\xd1\x67\x17\xdd\xe4\xe1\xd8\x5c\x9b\xb9\xa2\xb1\xf7\x39\xb7\xa0\x58\xa2\xbf\xbb\x15\xbc\x59\xc6\x85\xdf\x75\x23\x7c\xca\x2d\xad\x42\x33\x69\x8f\xa6\x72\x69\x8a\xa5\x29\xee\x44\xe6\xe3\x4b\xa2\x05\xda\x93\x9a\x3c\x20\x1e\x6f\x14\xa2\x8e\x4c\x34\x06\x39\x30\xf1\x2b\xfd\xdb\x7a\x26\x91\xbf\x36\x6b\x18\x76\x56\xcd\x2f\xc6\x77\x11\x0a\x57\x71\x87\xae\x5e\x31\xf7\xf4\xf5\x97\x26\xeb\xcf\xab\x63\x8a\x66\x75\x9e\xd0\xea\x3c\x71\x74\xd2\xc4\x1d\xb8\xd4\xf9\xe3\xfa\xf3\xb1\x59\xb3\xe5\x90\x7b\x26\xe6\x33\xde\x0d\x3a\xbd\xfa\xea\x8c\xc5\xd2\xdf\xdd\x32\xad\x2a\xe6\xb2\xe5\x69\xee\x47\xc6\x44\x35\x13\xb1\x5f\x6d\x8d\x0a\x31\x89\x34\x2b\xb9\x34\xbb\xf0\xde\xa6\xd3\xe7\x3b\xac\xb8\xa1\x4c\x89\x76\xeb\x56\xb4\x70\x2b\xb4\xcb\x42\xac\xb0\x51\x15\x4c\xbf\x29\xdc\x22\x2e\x0b\x55\x80\xd7\x92\xa1\x9b\xcb\xc1\xb0\xd2\x0e\xcc\x3c\xf2\x71\x9e\x16\xe4\x4a\xb7\xd4\xf2\xa5\x46\x7e\x51\x0b\x14\x99\x65\x91\x33\x39\x83\xbf\x5d\xa1\xd9\x6a\x2a\xdd\x9f\x9f\xff\xfc\xfa\xe7\x57\x09\x36\x29\x0e\x06\x10\x8c\x36\xca\xe4\xb6\x50\xe4\x68\x46\xc9\x7f\x2b\xdc\x3a\xc0\xda\x83\xd1\x0e\xb0\xc4\xb4\xd5\x61\x85\xb8\x94\x2f\x95\xd1\xf2\xa2\x36\x0b\x7f\x23\xa7\xba\x11\x4f\x38\xfc\x61\xa1\xcc\xdf\x2e\xa0\xb5\x45\x17\x2c\xad\x08\x6c\xcd\x63\x47\xf0\x2b\x03\xc8\xcf\x4c\x06\x70\xfe\x1c\x11\x98\x2b\x2d\x13\xb8\x79\xfb\xc1\xdf\xae\x6e\xb1\x68\x84\x04\x35\x9f\xc3\xb8\xd2\x34\xef\xb2\x4e\xe8\xd1\x2e\xe8\x60\x58\x66\x32\x98\x64\x31\x8c\xb2\x9a\xe7\xc1\xaa\x42\x46\x8c\xca\x2a\xdc\x6a\x5a\x66\x24\x22\x9c\x1a\x2f\xc5\x12\x81\xc4\xd9\x10\xff\x36\x92\x3a\xf0\x8b\xb8\xe2\x59\x5b\x69\xda\xd2\x4a\x9b\x2d\xad\x1c\xa4\x76\x59\x0a\x90\x58\xd8\x5a\x3c\xef\x4a\xec\x46\x03\x5e\xd6\x57\x17\xe0\x74\x53\xa1\x04\x3a\x24\x19\x21\xe0\x52\xa0\x03\x8c\x78\xc2\x10\x89\x27\x0f\xfe\x86\x84\x78\x77\x4c\x64\x66\xaf\xae\x85\x42\xc6\x5c\x27\x4c\x44\xc3\x14\x4c\x04\xc9\x28\xe2\x05\x77\x85\xa2\x8e\xe0\xaf\x90\x9a\xbf\x4d\xfe\x9f\x5f\xcf\x93\x62\xf0\xbc\x9a\x95\x46\xbf\x75\x2b\xcb\x53\x83\xe6\x74\x30\x5d\x79\x08\x87\xe0\x34\xcf\xf1\x8d\x88\x7f\x04\x5e\x49\xa0\x95\x9f\x18\x78\x0c\x88\x2f\xfb\x54\x37\x33\xed\x19\xbc\x6a\xdd\xc0\x5d\xe9\xc1\xcd\x13\x53\x6d\x56\x40\x93\x2b\x89\x90\xe6\xdd\x67\x7f\xbb\xba\xa5\xc8\xf3\xef\xb6\x12\x75\xd3\x08\x1c\x04\xd9\x92\x86\xd7\xb2\xdf\x79\x24\x9b\x9a\x64\x7b\x26\x6d\x15\x72\x2b\xc8\xf0\x23\x5d\x66\x46\xa7\x00\xb1\xe5\x66\x60\xe3\xd5\x4f\xf2\x8f\x09\x46\x12\x1f\x9b\x06\x68\x95\x97\xde\x70\x1d\xf2\x0f\x73\x47\x99\xa6\x61\x68\xd5\x39\x8f\x09\x54\x06\x29\x89\x30\x9f\xbb\xb0\xd2\x0c\x83\x0c\x82\x0c\x81\x06\x4c\xcd\xad\x71\x65\x6d\x9b\x41\xa8\x52\xfe\xd0\x41\xb8\x61\xe6\x99\xa9\xdf\xc4\x18\x27\x08\x2c\xe5\x81\x4e\x41\xe9\xcd\x42\x9f\x5e\xfd\xf9\x20\x65\x9a\x23\xf2\x1e\xe4\x03\x4b\x8c\xfb\x0a\x98\x0b\xcc\x4e\x31\x30\x73\x81\x86\xdf\x68\x19\xa0\x83\x5c\xe0\x88\xf6\xfb\x31\xb8\x40\x6e\x74\xe0\x45\xa3\xe5\x02\xd1\x08\x1b\x26\xac\x06\x32\x0b\x63\x53\x7d\x1e\x0f\x38\x89\x99\x62\xa1\xf0\x59\xec\xe8\x7a\xb9\x63\xec\xe5\x8e\x31\x8b\x1d\x29\x8b\x1d\x4f\x8c\xe4\x38\x5a\xca\xa1\x7e\xfb\xc1\xc5\x74\x10\x49\xe2\x98\xfa\x41\xf4\x52\x66\x17\x80\xd2\x3c\x8a\xde\x50\x02\x63\x86\x85\xe2\x5a\xa8\x67\xcf\xb2\x63\x12\x08\x38\x27\xa3\x4c\x16\x5d\x39\xa7\x5c\xf6\xc6\x86\xe2\xb1\x2a\x3a\x4e\xfc\x9c\xb1\x90\x70\x11\xa1\xa7\xdb\x18\x15\x76\x9d\xb8\x7b\xd2\x4e\x8b\x17\x6c\xa7\xdc\x9c\x52\x76\xf6\x54\x71\xb5\x52\x77\x47\xdd\x88\x1b\x40\x93\x93\x36\xe7\x32\xaf\x1d\x58\x88\x7e\x72\x04\x8a\x83\xbe\x25\x71\x96\x11\xe7\x5e\xae\x82\x2d\x84\x30\x9a\x0a\xf1\x2b\x93\x6a\xe2\x27\x07\xd6\x0e\x83\xba\x82\x37\x1a\x8c\xa9\xe5\x53\x0f\xd6\x0e\x87\x2c\x67\xa3\xaf\xe5\x23\xc6\x0b\x34\xb9\x7f\x11\x9f\x67\x6d\x7f\xee\x6e\xa3\x78\xa3\x37\x10\x89\xdb\x4a\xc2\xdf\x2a\x03\x96\x71\xa8\x9d\x27\x08\x96\x4f\x13\x73\x99\xaf\xfa\xc8\xbc\xb1\x29\x56\xda\x0d\xc7\x18\xad\xe8\xea\xd5\x86\xc7\x68\x21\x8d\xc7\xe8\x9c\x06\xf4\x5c\xc8\x07\x3b\x0d\x62\xe0\xaa\xec\xb9\xd0\x30\x6e\x0e\x8a\x92\xdc\x31\x75\x85\x4d\x5b\x77\xb7\x8d\x2b\x96\x32\x82\x0d\x73\xc1\x63\xc6\xd6\x12\x70\x1b\xe1\x14\xc6\x72\x27\xde\xa8\x69\x37\x9a\xc1\x6e\xa3\x99\xa2\xdf\x68\xe6\x34\xff\x3e\xa3\xad\xd5\x1a\x93\x1c\xd1\x01\x2d\xbc\x4a\x2b\x4d\xbe\xf3\x8d\x24\xd4\xc7\x6a\x9c\xa1\xce\x42\x25\x93\x66\xd0\xae\x34\x0e\xc0\x52\xda\xc1\x70\x76\x3b\x7b\x7c\x65\xe5\x76\xd2\xfb\xb6\xb3\xeb\x5e\x2a\xb7\x43\xef\x3c\x9e\x5d\xef\x4c\x4d\x3b\xc3\xf5\x29\x2e\x5f\x1f\xb7\xd3\x4e\x92\x2b\x54\x1a\x5e\x8d\x31\x72\xd5\x60\xe6\x56\x7c\x5c\xc6\xda\x02\x39\x6d\x81\xc6\xbb\xca\xe6\x64\x2e\x98\x10\x63\x2d\xa7\x18\x27\x63\x24\xad\x4e\x74\x70\xe9\xa7\x70\xdc\x58\x49\xfd\x02\xc6\xbf\x80\xf1\x11\x30\x76\x07\xc0\x98\xa1\x6f\x9e\xdd\x51\x32\x01\x16\xb3\x56\xce\x78\xc8\x19\x96\xc7\xa0\x5d\x30\xef\xe7\x84\xae\x92\x40\xea\x44\x40\xc3\xb3\xa1\x6f\xef\x12\xd8\x1e\x5b\x06\x1e\x04\x71\x82\x28\xb1\xf5\x13\x73\x7c\xc5\x04\xcc\x4d\x31\x1c\xcc\x85\x60\x1e\x44\x03\xc6\x41\xf4\x15\x12\x73\x00\x34\x70\x7f\xc7\x24\x94\xa3\x99\x03\x9f\x94\x24\x3d\x11\x90\x14\xba\x4a\xbc\xe3\x49\x92\x0b\x28\xab\xc2\x20\xce\x6c\xbe\xe9\xec\x6e\x57\x91\x31\x06\x44\xb7\x05\x9b\x2a\x34\x42\xff\x9a\x5e\xd7\xc6\x66\x6a\xcd\x2a\x0f\x98\x72\xd2\xc8\x8b\xc0\x25\xb9\x63\xed\x5c\x40\x3b\x88\x59\xed\xda\x41\x8c\x0b\xa9\xb4\x12\xe7\x61\xae\xb3\x69\x63\x6e\x2a\x68\xab\x1c\xa0\xcf\x49\xd3\x4a\x76\xf2\x37\x70\xf5\xca\x9c\x96\xdc\xcb\xc6\xd0\x79\xf3\xd2\x82\xde\x00\xe3\x0c\xa2\x85\xd8\x52\x77\xfd\x44\x5d\xe8\xd4\x56\x51\x51\xb9\x6c\x34\x90\x3a\x47\x5e\x4e\x84\xe2\xf9\x6e\x36\x27\x1d\x2d\xc3\x4c\x41\x14\xb9\x7f\xc8\x49\x2b\xf1\x17\xfe\xc0\x32\xdf\x23\x49\xf7\x81\xb8\x26\x33\x33\x0f\x48\xca\x0f\x1c\xa5\x26\xd1\xbe\x29\x56\x54\x05\x08\x46\x49\xd2\x8c\x38\x30\x8b\xc8\x33\xaf\x7c\x37\xf1\xc8\xac\xa0\x65\x9a\x39\xd8\x9c\xb4\x53\xc6\xf4\x97\x5c\xa0\xa4\x9c\xb4\x5f\x44\xae\x71\x48\x67\x67\x4d\x77\x82\xc2\x2d\xb0\xa8\xc6\x93\x1c\x3d\xff\x2b\x69\x37\x5f\x0c\x07\xcf\xf1\x9f\x3b\x52\xa5\x63\x0a\x99\x18\x32\x78\xeb\x76\xfe\x91\x85\x7f\x82\x22\x4c\xe7\x4d\xb7\xf3\x26\xb3\x4f\x39\xc9\x25\xdd\x44\x8f\x56\x46\xb7\x2b\xe3\x66\xe2\xe5\xce\xb5\x97\x76\xe2\x91\x96\x14\x51\x89\x09\x8a\xb4\xb5\x80\x66\x36\x1c\xe2\xff\x47\xde\xfb\x30\x47\x6e\x1b\x8b\x83\x5f\x65\xc4\x73\x29\xa4\x05\x62\x09\xf0\xff\xc8\x5c\x9d\xa2\xc4\xa5\x5c\x69\xed\x5f\x65\xfd\xf4\xea\x56\x9e\xf8\x41\x14\xa5\xe1\x0b\x67\xa8\x90\x94\x76\xd7\x9a\xb9\xcf\x7e\xd5\x0d\x80\x7f\x67\xb4\xd2\xda\x49\x7e\xef\xce\x6b\x91\x1c\x10\x04\x1a\x40\x77\xa3\xbb\xd1\x68\x10\xee\x10\x1e\x2e\x29\x1f\x34\x9c\xa8\x0e\xb9\xe4\x1e\xf5\x19\x68\x2b\xd0\xc3\x6d\x20\x66\x2e\xa3\x96\xfa\x72\xe5\xca\xeb\x62\x9d\x46\x34\x04\xad\x3b\x08\xe4\x45\x2d\x47\xc8\x21\x3a\xf5\xe5\x38\x45\xed\x72\x3d\xee\xa1\xe0\xde\x78\x33\x27\x9a\xe2\x5c\xf2\x2a\x1d\x72\x47\x78\x49\x8f\x70\xfe\x48\xc3\x40\xb8\xd4\x05\xcd\x48\x87\xd7\xb6\x19\x1e\xfd\x04\xc8\xe2\xc9\x8b\x4c\xe6\xd2\x31\x8d\xb8\x20\x6d\xbb\xad\x63\x1a\x50\x42\x60\x83\x78\x0e\x4a\x33\xd7\x9a\x33\xb3\x69\xec\xa1\x89\x4b\x2b\x1b\x71\xab\xea\xd9\x34\x66\x72\x93\x8b\x47\xba\xb5\x53\x17\xd7\x15\x23\x97\x74\x9c\x46\x6a\xf7\x20\x85\x9f\xfa\x94\x01\xa2\x32\xcd\x58\x62\xdc\xe8\x19\x52\xde\x51\x01\x61\xa8\x01\xfa\xa1\x80\xb2\x09\x5e\x54\xc7\xc3\x3c\xe3\x5d\xf2\x40\x48\x84\xed\x06\x11\x90\x9a\xf9\x93\x64\x39\xb6\xaf\x9d\xf2\x86\x73\x47\xbb\xd3\xfc\x19\xbf\x07\xdf\x07\xd1\x2c\xa0\x11\x89\xa4\x73\x30\x60\x35\x6b\x0f\x47\xc2\x15\xd9\x78\xe9\xec\x7a\x03\x8c\xef\x82\x61\xac\xe1\x98\x91\x80\x06\x84\x47\xbb\xf2\x51\xcf\xdb\x53\x00\xa3\xf1\x85\x8a\x7b\x1e\x15\x76\x40\x23\x7b\x07\x10\x44\xe5\x5c\x3a\xa7\xe3\x37\x01\x28\xce\x00\xbd\xe7\x91\x08\xdd\xe1\x63\xaa\xfc\x0a\x26\x25\xec\x84\x82\xa8\x06\xfe\xb6\x48\x99\x68\x9a\x46\x7b\xb9\x17\x43\x1f\xc4\xb8\xd7\xab\x17\x0c\x32\xc2\xf0\xc3\xa7\x2e\xc0\xe9\xea\x49\x0e\xc3\x40\x72\x4f\x70\xc0\x30\xde\x33\x22\xb9\xbe\xf4\x33\xe5\x52\xab\xd6\xd9\x6d\x54\x63\x71\x23\x99\x9e\x73\x1d\x0c\xdd\x6e\x4b\x35\xda\x0d\xe4\x45\xbf\x88\x5c\xea\x93\x21\xaf\x41\x49\x26\x02\xf9\x85\x17\x58\x1c\x30\x0e\x06\x0c\xaf\x8d\xea\x88\x6e\x4d\x5c\xf9\xe7\x0c\xa6\x16\x4e\x80\xbb\x83\xba\x2e\x2f\x3a\x15\xe7\x73\x0f\x8f\x69\xec\x42\x5d\x83\x3c\x85\x6d\x62\x68\x26\x74\x68\x17\xd8\x12\x69\xd4\x0b\x0a\xdb\x95\x8f\x11\x3b\x77\x19\xf5\x2f\x5d\xf7\x9c\x4f\xa2\x81\xbf\xc6\x54\xd4\x8f\xb7\xf0\x0c\xc6\x7b\xae\xc4\xf8\x30\xfe\x3a\x94\x07\x44\xf5\x3c\x1b\xf1\x2d\xc0\x80\xb5\x5f\x87\xf5\x12\x8e\x17\x61\x3d\xba\x45\xb4\x38\xef\x33\x89\xf3\x6e\x8b\xf3\x6e\xf4\xaf\x47\x7a\x74\xcb\x85\xee\x0c\x0b\x98\x81\x6c\x17\x04\xab\x18\x10\x27\xee\x1c\xbb\x24\xee\x8f\x90\xc6\x21\x72\x9f\x7c\x84\xb6\xe4\x50\x5e\x34\xee\x07\x1a\xf7\x71\x9b\xbd\x1b\xe9\x17\xb1\x6f\x4b\xf5\x31\x0c\xe5\x65\x80\xff\x31\xa0\xbe\xba\x8c\xf0\x3f\x72\xe5\xa5\xc5\xff\x78\x8c\xff\x30\xd1\x30\xbe\x0b\xff\x03\x79\x19\xe1\x7f\x28\x2f\x7d\xfc\x9f\xc8\xaf\xae\x83\x27\x23\x08\x26\xf7\x41\xb6\x1b\x21\x7b\x04\x70\xc1\x7d\x69\xf7\x76\xd9\x32\xa0\x3c\x7a\x64\x14\x48\x00\xfa\xf5\x6b\xa8\x60\x14\x86\xe4\xe9\xba\x1c\xc4\x86\xfc\x63\x59\xdc\x10\xe3\x1a\xa3\x04\xd8\x45\x5e\x0f\x62\xa2\x76\xc1\x03\x88\x91\xaa\xed\xc1\x93\x4c\xfd\x7d\xc3\xc4\x58\xe3\xc6\x80\x49\xa6\x6e\xbf\x00\x31\x6e\xcb\x75\x63\xd7\xf9\xaf\xc3\xa0\x65\x6a\x6b\x2a\xc9\x71\xff\xd3\x7c\xbc\x21\x8a\x18\xff\x2d\xb7\x0a\xd9\x4d\xf6\x69\x50\x74\x6f\x0b\x11\x31\x52\xdc\x69\x39\xc9\xd3\x6d\x67\x27\x86\x28\xf2\xbb\xb5\x5d\x64\xb7\xcd\x24\xdb\x60\x67\x8a\xce\x59\xe5\x77\xcb\x3d\x59\x5b\x0f\x42\x62\xdc\x8b\x7c\xdd\xd8\x15\x3a\x3a\x0f\xe2\xcc\x75\xfe\xcf\x2a\xa8\xab\xfd\x8f\x87\xb2\xc9\x26\x31\x5d\xd1\x17\x95\x40\x35\xf3\xe1\x82\x05\x79\xd0\xfe\x34\xf3\x1d\x3e\x36\x1a\x4a\xd9\xf0\x09\x84\xb2\xe1\xfd\x46\xef\x6c\xef\xa0\xad\xbb\x9b\xa9\xb3\x5c\xa3\x6f\xc9\x24\x8f\x74\x39\xd1\x99\x56\xe8\x17\x31\xc9\x24\xdd\x25\x74\xa6\xa6\xbc\x9f\xe4\xf8\xa9\xbc\x27\x85\x5a\xc0\x9e\x4f\xd7\xb4\x89\x81\x81\x81\xd2\xb2\x28\x07\x6d\x6d\x17\x76\xc8\xb2\x5b\x17\x98\xef\x5c\x2d\x20\x39\x9a\x85\xe6\x63\x3b\x11\x29\xa5\xd9\x73\x3e\x31\x84\x92\xba\xaf\x6c\xcf\xf7\x28\xe1\xa4\xd6\x62\xd5\x7c\x87\xa8\x45\xea\x6e\x12\x9a\xef\x9c\x9a\xb6\xff\xec\xb8\x4f\x7d\x36\xf0\xc5\xa8\x4f\x95\x78\xcc\x8a\xdf\x23\xe4\xd3\x4b\xe3\x3d\x8d\x2a\xfc\x4d\xc1\x9e\xfe\xe5\x91\x9e\x10\xf8\x49\x9c\xa7\x1f\xd7\xe7\x65\x91\xdf\x88\xcf\xfd\x30\x48\x95\xc8\x87\x51\x8c\xbe\xcf\xaa\xaa\x9f\xe3\x4c\x54\xe2\x51\xac\x07\x29\xab\xfb\xac\x1a\xa6\xfd\xb1\x14\x83\x18\x41\x79\xfa\x39\x1d\x44\x66\x7a\x27\xee\xdf\x89\xea\xef\x83\xaa\xce\xca\xd5\x3d\xcc\x1e\x83\x5c\xc3\xaa\xfb\x11\x8e\xf2\xea\xbe\x10\xc3\x20\x4e\xd5\x43\xfa\x77\x15\x8b\xe8\xf8\x51\x54\xb3\x6c\x1c\x8f\xa8\x8b\x77\x66\xa7\x18\xf0\xec\x0b\xf1\x88\x26\xf9\x31\x1e\xd1\xf1\x3f\x29\xce\xd1\xf1\xb8\x29\xbb\xc4\xc1\x57\x38\x90\x68\xef\x33\x7e\xce\x83\xc9\x0e\xed\xc1\xde\x6c\x12\x5e\x72\x7f\xb4\x93\x58\xee\x98\xbf\x64\x31\xc5\xa3\x79\x70\x19\xad\x67\xaf\x01\xf9\x25\x95\x6a\xa5\x54\x51\x51\x8a\xb8\x64\xde\xb2\xdb\x29\x03\x72\x06\x7f\x64\xe7\x3c\x7a\xe4\x4b\xef\xd1\x3f\xe7\x31\x9e\x3d\xe5\x83\xd0\xa1\x17\x14\xed\x08\x55\xe5\x73\x94\x71\xe1\x25\xd1\x3e\xfc\x8e\xed\xe1\x91\x16\x34\x0c\x4e\x3d\x10\xaa\x3c\x29\x59\x31\xe9\xc0\x1e\x72\x74\x96\xc3\xb3\xaf\x62\xe2\xe9\x03\xed\x1c\x12\xe1\x11\x15\xe7\xae\x3b\x76\x22\x0b\x4e\x5b\xbd\x19\x4f\xbd\xe3\x1f\xde\x31\x07\x4f\x43\x89\x44\x5f\x74\x93\x26\x48\x8f\x86\x3e\x99\x24\x13\x48\xfe\xb0\x42\x6b\x2b\x71\x26\x9f\x71\xea\xa3\x1c\x76\x3a\x54\x83\x70\xb3\xb3\xe7\x12\x1e\x7d\x50\x32\x69\xf7\xdf\x8e\x71\xdd\xef\x1b\xf2\xbb\x8c\x29\x07\x79\xf2\x74\xa8\xfc\xe0\xe6\x4f\xee\xe3\x4e\xab\xdf\x32\x12\x91\xf4\x3b\x6e\x47\x82\xc1\x48\x78\xff\xfe\xbe\xe7\xd0\xf7\x78\xb8\x72\x08\x5d\x37\xc5\xd3\x0f\x63\xc5\xac\xe5\x30\xbf\x07\x19\xfa\x20\xfc\x47\x94\x05\x02\x23\x7a\xf1\x7e\xec\x31\x3c\x5a\x04\xad\xf8\xe1\xa8\xd7\x5d\x1a\xf8\x34\x8c\x2f\x42\x0c\x07\x26\xcf\x44\x60\x11\x6e\xb9\x88\x02\xc2\x7a\xa6\x97\x18\x0d\x72\x1e\x2b\x40\xd6\x8f\xdd\x94\x06\x18\x44\x8c\xa0\x8f\x85\x43\x63\xd7\xf6\x68\xc4\x0b\x1a\xbb\x24\x96\x21\x61\xd0\x44\xe8\x76\xb6\x1b\x34\x69\xa3\x96\xed\xca\x8b\x56\x7a\x3c\x2a\x8f\x46\x92\x17\x4d\x4e\x50\x17\xa7\x6e\x8c\x26\x54\xc1\xa8\x8f\xbb\x51\xb5\xe1\x08\x77\x44\x46\x2e\x28\x0b\xe8\xc0\x1d\xa7\x2e\xf5\x43\x9b\x93\x00\x54\x22\x97\x46\x11\xe8\x5b\x81\xed\x53\xee\x9f\x8e\x7a\x84\x74\x9d\xf5\x61\x05\x8a\x07\x0d\xfd\xd4\xe6\x14\xbd\x5a\xb8\x1d\x80\x1e\xc3\x6c\x3c\xe6\xc7\x07\x3d\x0e\x40\xa1\xdc\xbd\xe0\x68\xf1\xe4\x21\xe5\x51\x01\x1a\x13\x7a\x43\xe1\xd6\x2f\x9f\xb0\x10\xf7\x97\x86\xd2\x73\xfa\x8c\xe1\x61\x1b\x78\xa0\x1c\x77\x29\x0b\x48\x20\xcf\xfa\xa4\x3e\x2f\x6c\x8f\x62\x10\x34\x86\x3b\x80\xe4\x01\x91\x36\x73\xa9\x03\x43\xe7\x23\x96\x69\xab\x03\x68\xaa\x7e\xe1\xcb\xbe\xe3\x81\xa0\x5e\xcf\xc4\x40\x5d\x1f\x70\x91\x7a\xb8\xb9\x52\xe9\x57\xd0\x0b\x48\x15\x2f\x62\x03\xcf\x7b\xe3\xa9\x33\x9a\x39\xf5\xbd\xc2\xc5\x1d\x50\xb8\xa7\xc2\x66\x94\xc5\xb8\x08\xc0\x82\x0b\x5c\x04\xa0\x4e\x5c\x40\x4f\xd9\xd0\x52\x4e\x71\xcf\x69\x08\xaf\x22\xdc\xb5\xcf\x11\xfa\xd6\x8e\x03\x7d\x74\x11\xa0\xf7\x89\x43\xf9\xe4\xe8\x43\x55\xe3\xef\xc0\xc6\x02\xac\x19\x77\x9c\xe3\xf1\x7b\x2c\x28\x02\xea\xe2\x11\xd9\xb1\x1d\xe3\xde\xdb\xe0\x94\xfa\xbc\xc3\xaa\x18\xbb\xee\x02\xbd\xe9\x99\x43\x7d\x78\xcd\xf4\x70\x38\xa4\x2d\xf0\xb7\x00\xa7\x3a\xd6\xc5\xf3\xe3\x03\x0c\xa0\x87\x48\xe0\x8b\xa1\xfd\x16\x88\xd3\x09\xa1\x23\x71\xf1\x81\xa1\x57\x9c\x07\x48\x8e\xe1\xbf\x46\x9d\x8a\x36\x00\xce\x0b\x4f\x2a\xe3\xbe\x2b\xa8\xdf\xad\x1e\x10\xea\xbb\xd4\x89\x53\x3c\xbc\x10\xe6\xb1\xc0\x76\xb1\x21\xb1\x1d\x50\x27\x2c\xe4\x8e\x1c\xdc\xfa\x3c\xfc\x2c\xa6\x6e\x58\x48\xb6\xe7\x44\xfd\xad\xe3\x30\x29\x07\x88\x9d\xc0\x10\x01\x7d\x79\x9c\x7a\x40\x4c\x80\xf6\x11\xc7\x58\x88\xd8\x87\xcc\xf6\x69\x14\x9f\x4a\x73\x66\x57\x74\xd7\xfe\x09\x5f\x04\x39\x6c\xc4\x12\xd1\xef\xe3\x15\x2c\xf1\x53\x62\x30\x1f\x1d\x44\x58\xd8\x39\x88\x74\xfe\x21\x7c\x32\x80\x5f\x4d\x21\x1c\xc5\x16\x06\xf3\xd7\x29\xe7\xd2\x2b\xb1\x9d\x12\xd1\x06\x15\x0a\x0c\xbb\x18\x77\xe6\xc6\xd8\xa6\x40\xa5\x01\xfe\xe9\xf9\x2f\x82\xee\xf0\x52\x3c\xcc\x06\x69\xc9\x43\x53\x15\xee\x5a\xef\x4f\x6e\xc0\x2f\x1e\x01\x45\x87\x5b\x6f\x2f\xb9\x73\xee\x5d\xb2\xa8\x3f\xe9\xd8\x18\x2c\x2d\x74\x4f\x81\x67\x91\x50\x13\x19\x9e\xc7\xcf\x5d\xca\xc3\x4b\xee\x2d\x6d\x3e\x39\x49\x1e\x1d\x92\x26\xc7\xa9\xe2\x36\xde\xc9\x99\x6d\xbd\xf6\x7f\x78\x87\xc7\x19\x9e\x07\x30\x41\x38\x36\xc5\x75\x12\x1b\x4f\xff\xf2\x6d\x76\x1a\xc8\x11\xf7\xdb\xd3\x71\x19\x89\x96\xce\x87\x15\x27\xce\x65\x48\xfd\x48\xe0\xbe\x93\xa8\x33\xc8\xf9\x72\x0e\x61\xc1\x29\x8b\x09\x6b\xcf\xd0\x71\xd1\x0b\xf9\xc3\x3b\xee\x53\xf4\xa1\x72\x61\x82\x87\xd9\xdc\x1f\xcc\xd3\xc0\xf7\x75\xaa\x9a\xa4\x55\xf6\x29\xf9\xbe\x7e\xf4\x5d\x43\x1b\x4e\x59\x48\xb8\xb7\xbb\x0b\x97\x3e\xc5\x8e\x70\x22\x79\x7a\x1a\x1e\xde\xe7\x9f\xea\x85\x11\x86\x6b\x58\x1e\x08\x2a\xaf\x68\x87\xce\xfc\xe2\x56\x3c\xcf\x25\x79\x80\x01\x1f\x3c\xca\x23\xc0\x5f\x17\x57\xe7\xdb\x69\x9b\xe1\x89\x79\x01\x8d\xbf\x02\x87\x63\x1b\x77\x1c\xd9\x32\xc4\x81\xb7\xb4\x19\xb4\x24\x26\xbc\x75\xc9\x04\x5c\x0e\xa8\x1f\x3f\x46\xd4\x9f\xae\xf5\xd0\x28\x38\x07\x5e\x9d\xca\x45\x28\x07\xcf\x15\x04\xb4\x8a\x05\x4e\xe0\xbe\xb6\x77\xca\xf3\xd5\x6c\x1f\xd8\x91\xcd\x08\x88\x89\x7e\x40\xf0\xa2\x01\x73\x51\xba\x88\xd0\x77\x59\xb1\xcc\x00\xe4\x98\xd3\x4e\x1e\x52\xb2\x26\x7a\x2b\x2e\x7d\xea\x45\xd3\x7a\x4f\xc7\xf5\x62\x98\x14\x98\x58\x7e\x5b\xb5\xae\x83\xae\x93\xc1\x92\xd3\x80\xed\x59\xf3\x72\x81\x0b\xc4\xd4\xc5\x78\x79\x71\x47\x7c\x7a\xf0\x54\x18\xb2\x73\x04\xdb\xf5\x29\x3a\x11\x51\x16\xd8\x20\xb5\x88\x31\xed\xb9\x34\x0a\x6d\x7f\xe9\xa0\x90\x2c\xe7\x20\x37\x78\x21\xfa\xb5\xf9\x3f\xbc\x43\xba\x3c\x67\xc1\x25\x0b\x97\xee\x87\x95\x1d\xd8\xfe\x65\x48\xbd\x10\x48\x39\x40\x09\xab\x25\x65\x74\x06\xf0\x4f\x59\x8c\x48\x11\xeb\x05\x43\x86\x81\xbb\x80\x9a\x03\x74\x78\x79\x31\x1c\xbd\xfc\x93\x19\x04\xf4\xfa\xdf\x43\xa8\x76\x01\x53\x03\xca\xe2\x61\x2c\x8b\x90\x04\x17\x1c\x26\x54\x12\xe3\xae\x5f\x18\xf4\xc1\x16\x27\x74\x77\xb8\xe0\x34\xe0\x24\xa2\xc3\xad\x3c\x31\x65\xee\x25\xa8\xa9\x83\x4d\x38\xd4\x05\x9d\xf2\x82\xb9\xb8\x4e\x1a\x15\x78\xf6\x1f\xf0\xff\x7e\xb4\x04\x2f\x40\x97\xe9\x2e\xc1\x25\x4e\xc1\xd0\x93\x80\x3f\x1f\x55\x41\x37\x03\xf5\x13\x1e\xd0\xd0\x2f\x6c\x19\xfe\x97\x06\x97\x3c\xa4\x4e\xb0\x04\x99\xed\x91\x43\xb2\x07\x78\xcb\x00\xe1\x74\x32\xa3\x21\xbf\xf0\x70\x3b\x20\xbb\x8c\x69\x18\x17\x11\x75\x22\xdb\xa5\xae\x7b\x19\xd1\x88\x2d\x19\x0d\x2e\x03\x10\x95\x23\xdc\xaa\xef\x3e\x72\x2a\x13\x19\xbb\x70\xa1\x0f\xe4\x18\xed\xe0\x56\xaf\x9a\xd8\x39\x4e\xec\x1c\x64\x11\x39\xb7\xfb\xe8\x06\xaa\xa6\x77\x46\x83\x9e\x03\x28\x8d\xd8\xef\x50\xa3\x3b\xaa\x11\x54\x80\x7f\x6e\x8d\x9e\x14\x5e\xba\x36\xfe\xd3\x6b\xf4\xc7\x35\x86\x94\xb9\xfb\x6a\x0c\xfd\xdf\x67\xd6\x71\x5d\x75\x36\xae\x4f\xb8\x4f\x62\x1a\x7b\x97\xcc\x3b\xe7\xee\x25\xe8\x04\xf1\x05\xc3\xd5\xd9\xe8\x32\x3e\x67\xfc\xd2\xc7\x60\x44\xe8\x8a\xe2\x9d\x82\x24\xeb\xbb\x3d\x72\x0a\xfd\x4b\x19\xa7\x6b\xf0\x86\x86\x1e\xf5\xe2\x0b\xc6\x31\x06\x01\xbf\xe4\xee\x92\x3f\xc2\xf4\x5c\xc4\x18\x6b\xe1\x92\x47\x4b\xfe\xe8\x4a\x5c\x0e\x5c\x9b\xd3\x70\x54\x80\x1b\xda\xd4\x67\x97\x21\x8d\x82\x61\xa5\x1d\xe8\x72\x03\x27\x03\x18\x59\xb8\xe4\x1f\x56\x8e\x1d\xe0\x0f\xb6\xe4\x20\x9e\xa0\xd1\xc2\xbd\xe4\x5c\xbf\x83\xf6\x05\xcb\xa9\x25\x40\x5b\x26\x9f\x09\x06\x16\xa1\x9a\xeb\xb2\x25\x3a\xd8\x79\x01\x89\x53\x1b\x95\x60\x8e\xe7\x76\xa2\xab\x16\x4e\x1c\x5e\x11\x20\x87\x75\x50\x63\x73\xe4\xd9\xea\xcc\x17\x34\x08\x3a\xcf\x16\x1a\x79\x90\xfb\xc3\xca\x06\xb9\xd2\xc5\xfd\xd0\x3e\x1e\xca\xfc\x1a\xb7\x3c\xdc\x4a\xb4\x4b\x0f\xd2\x9b\x9c\x4f\x59\x40\x58\xa0\x27\x39\x0f\x0f\x4c\x56\x29\xc8\xf6\x22\xc2\x3f\xac\xd0\xa5\x2a\xf6\x81\x29\xfa\xee\x39\x0b\x1f\x39\x06\x0f\x82\x59\x41\xb1\x7a\x8f\x3a\x30\x65\x9c\x03\x8b\xb9\x64\xe1\x39\xfc\x1e\x64\x60\x21\xe6\x41\x1e\xb4\xe4\x97\x93\xf7\x2e\xa3\xb1\x8f\x86\x19\xa8\xe3\x91\x2f\x27\x55\xb0\x58\x66\x7a\xed\x56\xc7\xdf\xda\xfa\x77\xb8\x54\xce\x62\x6c\x13\xce\xdc\xae\x4d\x1d\xdf\xa6\x41\x80\x77\x56\x83\xc8\x10\xe2\x23\xb6\xff\xc3\x3b\xd5\xd8\x54\xee\x26\x50\x19\xf1\xa8\x4a\xbf\x96\xbe\x7b\x8c\xe8\xce\x38\x67\x18\x9a\x91\x87\x14\xd0\xc5\x95\x87\xec\x06\x58\x1a\xe4\xa9\x6d\xfc\xc0\xc6\x8f\xe5\x00\x00\xaa\x46\xb6\x0f\xe2\x38\xfa\x0c\xb6\x67\x3a\x07\x31\xea\xfb\x3e\x1a\xce\x70\xfb\x82\x3c\xd6\x3c\xe2\x29\x08\xb5\x36\xf5\x42\x19\xfb\x84\x49\x91\xc5\x2b\x40\x52\x08\x41\xc5\x73\x97\x0e\x68\xde\xa8\x53\xbb\xe1\x69\xbf\x5c\xc2\x43\x98\x90\xdc\xf0\xc3\x3b\xac\x9e\xb0\x18\x69\x89\x7a\x1c\xa3\x92\xb9\xd4\xf1\x25\xc4\x84\xd5\xd0\xda\x50\xb6\xf6\xc5\xe7\x65\xee\x18\xa3\xf1\xc6\xba\x80\x86\xe1\x0c\x54\x35\x7f\xc6\x3d\xbc\xba\x2a\x25\x9a\x31\x80\x7b\xd6\xcb\xf2\xb5\x7b\xaf\xba\x05\x89\xdf\x41\x30\x41\xe7\xda\x90\x83\x18\xec\x12\x5f\x3a\x20\x32\x74\xea\x54\xbf\x4f\xfb\x6f\x14\xb2\xc1\x17\x1f\x56\x0e\x89\xa9\x17\x08\x17\x5e\xb9\xfa\x4b\x8c\x1b\xe1\xda\x70\x39\xed\xbf\xc1\x77\x80\xb5\x18\x07\xe0\x77\x53\x99\x25\x71\x30\x1a\x62\x74\xe8\x30\xee\xcc\x2b\x68\xa7\xc1\x80\x74\x9e\x3a\xc8\x16\xa4\x07\x3f\x92\xe6\x7c\xf4\x0e\x29\x40\xb8\xf5\xb9\x88\x41\x86\x22\xf2\xaa\xbf\x67\x1e\x91\xf1\xe4\xa2\x98\x86\x80\x84\x31\x64\x8b\x38\x91\xd7\x2e\x9b\x1d\x41\x31\x36\xf5\xdd\x94\xd1\x18\x63\x44\xa0\x3c\xee\xda\x18\x82\x05\x9f\x98\x0c\x62\x36\x01\x53\xd2\x2d\x47\xa1\x8a\x7b\x05\xc6\x78\xf3\xe5\x9e\x49\x10\xa8\xfc\x08\x5d\x66\xbd\xd0\xf6\x29\x77\x41\x75\x02\x9a\x88\x6c\x26\xcf\x3e\xf0\x19\x88\x57\x1c\x5f\xda\x01\x85\x29\x4a\xc6\x1f\xc3\x02\x42\x9b\xd3\x00\x04\x30\x6e\x07\x6a\xf3\x80\x0d\x44\xc3\x44\x4c\x43\xa0\xb8\x50\xdb\xa2\x19\xee\x3f\x70\xce\x78\x88\x61\x85\x42\xb4\x2f\xa2\xc2\xcc\x19\xf5\x88\x06\xef\xb5\xa3\x66\xdb\xd7\xe2\xe6\x2e\xbb\xd9\x89\x7c\xfa\xe5\xff\x1c\x24\x7c\xae\x39\x7c\xd8\x1c\x1e\x83\x5a\x07\xe2\x3c\x9e\xe7\x1f\x93\x50\x2f\xf8\x30\x9b\x03\xef\x04\x7e\x84\x46\x08\xb9\x20\x40\x7d\x19\x60\x05\x0f\x71\xf6\xd0\xd8\x1b\xda\x1e\x1e\x36\x0f\x03\xf6\x2f\xc2\x8b\x53\x84\x3a\xee\x69\xa4\x1c\xf0\xc2\xa7\x0e\xb6\x02\xa7\x74\xad\x31\x51\x9f\xdb\x12\xa1\xd1\x8a\x19\xfa\xff\x1b\xd3\xdd\x19\x47\x5c\x67\x2e\x86\x91\xd2\x43\xe3\x87\xa4\x37\x4c\x7b\x90\x41\x9f\x9c\xf1\x4a\x74\x70\x47\x2f\xf1\x87\x81\x07\x70\xb8\x8e\x3c\x7e\x23\xc0\xa3\x37\x7e\x27\x09\xf8\xff\x03\x4c\x70\xe5\x10\x86\xa6\x85\x40\x06\x94\x94\x54\x0c\x8f\x36\x5c\x4e\xfb\x6f\x34\x15\xbf\x66\xd4\xf6\x4f\xae\x30\x2a\x2c\x52\x87\xac\x70\xea\x79\x38\x32\xd0\x6b\xaf\x1a\x9c\xd1\x90\xf7\x07\x69\x2f\x73\x38\x0d\x41\x62\x0b\x7b\xae\x6e\xb8\x56\xc9\x18\x74\x04\x30\x38\x5f\x9f\x1d\x8e\xd1\x93\x5c\xc8\xca\xe5\x45\x91\xa1\x0b\xa4\x1e\x79\xff\xff\xa4\xc4\x2f\xf4\x7b\x8f\x29\xbf\x76\x8c\xbf\xa2\xb6\x57\xd1\xfc\x30\x7e\xa2\xf2\x38\xd9\xa7\xb1\x45\x14\x3b\x2b\xf0\x4f\xd1\x31\x35\xe8\xad\xe9\xe1\x8a\xa0\x2f\x02\xea\xc6\x24\xd0\xa6\x3c\xcc\x62\x07\xd4\x05\xaa\x19\xbe\x60\xbe\xfc\x82\x8c\x4b\x6a\xeb\x00\xe5\x92\x31\x31\xb4\x29\xaa\x5f\xa7\x78\xf2\x86\xd7\x2d\x62\xe1\x6a\x65\x04\x5f\x7d\x7d\xa8\xc4\x50\xd7\x2c\x46\x30\xd9\xb2\x15\x08\x2b\xfe\xa9\x26\xb8\xc4\x99\x76\x44\xf8\x55\xf0\xe3\x67\xaf\x6d\xc0\x38\xc6\x5f\x8c\xc1\x6f\x83\xf3\x68\xb0\x19\x1a\x66\x64\xcf\x2f\x7c\x9b\x61\xb0\x8b\x88\xc6\x17\x31\x6e\xb9\xe0\x34\x74\xcf\x5f\x15\xea\xdd\x1d\xc4\x22\x65\xae\xb4\xac\x70\x1a\x44\x9d\x65\x85\xf5\x02\x92\xd2\xf8\x15\xc1\x9d\xbd\x69\x20\x6f\x68\x4d\xbf\x2d\xb1\x07\x8a\xde\x05\xc7\xed\x1d\xcc\x81\xb6\xf2\xde\x7e\x37\x1b\xc3\xda\x74\x3b\xf7\x6c\x1a\xbb\x4b\x57\x60\xb0\xb9\x76\x33\x55\xec\xd1\xa0\xf0\xfb\x21\x5b\x41\x0d\xc4\xd8\xd0\xbd\x0d\x7d\xba\xf6\xaf\x8f\xc0\xcb\x5c\x0c\x17\xb9\x23\x48\x41\xbb\x57\x9c\x0d\x46\x0a\x80\x1f\x80\xca\x6c\xb6\x74\xc5\x30\x12\x04\x23\x34\x44\xcb\x11\x27\x7c\xb0\xd1\x8f\x51\x8f\xf5\x77\xeb\xab\xda\x5f\x1b\xe6\xb7\x1f\x67\x01\x64\xee\x18\xa3\xc8\xd8\x32\x50\x8c\x8b\x01\x40\x62\xdb\xa3\x71\x81\x9e\x05\x1e\x8d\xcf\x5f\x1c\xb9\x63\x44\x6e\x21\x45\x9e\xe1\xc9\x0a\x1c\xea\xaa\x3b\x6a\xee\x85\x8b\x32\xa1\xab\x83\xd5\xc8\xfa\xe5\x3d\x82\xfb\x99\x8f\xfe\x11\xb8\x6c\x48\x23\x22\x8f\x7c\x4b\xf1\x9c\x35\xdc\x30\xd1\xa3\xd6\x9f\xd7\x3f\x37\xa9\x8b\x22\x3c\xc6\xb9\x21\x18\xdd\xe5\x3c\x3a\x0b\x69\x28\x97\xdd\x42\x8a\x91\x0a\x60\xfe\x93\x30\xbd\x26\x16\xc9\x90\xfe\x18\x8d\x97\xb6\x87\x91\x96\x70\x5e\xa2\x28\xeb\x53\x1f\x53\x7c\x8c\xc4\xc2\x54\x5c\x1e\x1f\x8f\x7d\x61\x34\x7e\x61\x6d\xe3\x80\xf0\xc8\x31\x7c\x39\x42\x2e\x51\x11\x9a\x6c\x19\xc0\x85\x15\x9c\x7a\x24\xa0\x41\x8a\x70\xe8\x9a\x31\x1e\x0b\x3a\xb0\xa4\x98\xe0\xd8\xf2\x35\x93\x45\x50\x96\x62\x74\x28\x48\x8e\xd4\x90\xc4\x30\x24\x30\xda\x1e\x4c\xa1\xd8\x97\xb6\x8b\xf0\x07\xb6\x87\x3e\xf7\xbe\xed\x92\x88\x86\x29\xa3\x01\x71\x31\xca\x8b\x64\x78\x11\x0d\x89\x9b\xba\x32\xc0\x10\xa4\xd8\xf0\xc6\xb5\x23\x1a\x9e\xb9\x18\x47\x06\xfa\xdd\x75\xd4\x40\xea\xe6\xbc\xb0\x37\xc6\xdc\xc2\x93\xa1\x99\xc2\xd4\x51\x51\x95\x18\x82\xef\x63\xb4\x1a\x87\x06\x05\xc6\xcf\x09\xa9\x77\xc6\x5d\xdc\xff\x24\x47\x9a\x44\x84\x83\x30\x13\x2f\x6d\xb7\x8d\x7c\x85\x1d\x86\xdd\x25\x87\x0d\x63\x68\xe1\xd6\x16\xb8\x62\x1f\x38\xa4\xfd\xb7\xe4\x18\xf4\x26\x24\x7c\x69\xc7\x50\x91\xa2\xee\x33\xe9\xa4\x81\x1d\x8f\x11\x95\x1c\xc2\x18\x61\xce\x79\xd4\xaf\x08\x23\x6a\xd5\x2a\x48\x17\x61\x4b\x4e\x83\x42\xed\x01\x81\x92\x7c\xe2\xca\xfa\x30\xbe\x0f\xae\x9a\x13\xd9\xaa\x88\x38\x34\x2a\x60\x18\x5c\xca\x97\xcc\xb9\x68\xbb\xe0\x85\x3d\xe8\x4f\xc3\x27\x97\xe2\x99\xa3\x1b\x62\x8a\xb3\x1b\x3b\x03\xde\x88\xf6\x2d\x1c\x35\x8f\x70\xe9\xec\x01\x2a\x9d\xc4\x31\xdc\x2a\x4c\x41\x1e\x64\xc4\x49\x31\x92\x58\x88\x61\xac\x20\xd1\x45\x4f\x1a\x96\x2a\x8a\xc6\xa8\x8e\x40\x27\x36\x06\xd2\xa6\x2a\xb2\xd1\x19\x83\xd6\x70\x0c\xd4\xed\x11\x8e\x2b\x52\x9c\xf0\xb8\xc6\xb8\x45\x90\x5d\x06\x17\x8a\x64\xf1\x18\x98\x48\xf1\x28\x0f\xee\xb5\x2a\xd6\xb3\x31\x7e\x2d\xe5\x67\xae\x2e\x8f\x03\xbf\x00\xce\xc1\xe3\x47\xae\xe2\x28\xc9\x6e\x65\x6d\x48\x2e\x17\x63\x85\xf1\x33\x8c\x79\x12\x53\xc0\x10\x06\x1f\x85\xd0\xe6\xb8\x0d\xad\xe4\x23\x81\xa3\x67\x04\x8d\x52\x19\x86\x33\x90\x81\x57\x69\x20\x25\x05\x85\x8f\xbe\xc2\xc7\x48\x05\x45\x8a\x54\xc5\x6d\x90\x26\x59\x92\x2a\x27\xde\x59\x8e\x3f\x2c\x07\x5b\x3f\xfc\x9e\x21\xf1\x43\x6a\x8c\xd1\xc4\x64\x49\x8c\x60\x90\xd5\x47\x9b\xb7\x51\xa3\xe4\x66\x1a\x19\xe1\x0d\xc3\x4a\x45\x67\x2e\x1a\x58\xf0\x44\x32\x04\x45\xb6\x58\x8d\xf9\x6f\x08\xc1\x46\x78\x17\x3e\x4e\x51\x95\xcd\xce\x5d\x5e\xd8\x2e\x9e\x7e\xc6\x96\x0e\xe5\x29\xb4\x08\x8f\xdf\x44\x2c\xe7\x92\x69\x29\x1f\x1d\x5e\xc8\x99\x01\x43\x5a\x61\xdb\x65\xc4\x2b\x26\xa7\x26\xdd\x97\x67\xae\x2b\xe3\x93\xb9\x1c\x26\x01\x5c\xd3\x64\x84\x3b\x4b\x9b\xfb\xd3\xd8\x5f\x2e\x16\xa7\xbb\x14\x3b\x13\x59\x05\xa3\xec\x92\xbf\x26\xe4\xdc\x68\x12\x88\xa8\x5c\x3c\xf6\x1f\xed\x10\x46\x42\x4d\x60\xae\xea\xef\x08\x98\xe1\x19\x53\x01\xbf\x08\xc3\xa5\x53\x54\x80\x08\x73\x0a\xa4\x18\xc5\xd2\xbd\x2e\x58\x5f\x17\xc2\xeb\x4c\x8b\x89\xc8\xc0\x30\xb8\x31\x54\x27\x3b\x40\xc7\x1d\x63\x8c\xe2\xa2\x2b\x0b\xcf\xdb\xa0\x62\x90\xf6\xfa\x60\x6d\x2d\xed\x07\x84\x01\x56\x79\x5d\x18\x40\x9c\x26\xf8\x05\x8b\x29\x6e\xae\x47\x88\xb1\xad\x28\xc8\x00\x07\x94\xfc\x00\x4f\x33\xa3\xb1\xcd\x09\xbf\x64\xf1\x32\xa2\xee\x19\xf7\x01\x72\xee\xd3\x50\x36\x05\x4b\x07\xe0\x43\x9c\xb8\x55\x68\xb5\x22\xc0\x3e\xa1\xfe\xd2\x0e\xa8\x77\x19\xd0\xe0\x15\xf0\x8f\x0f\x5a\xf0\x88\x2b\xe1\x51\x1c\x87\x61\x58\x36\x1c\x94\xd4\x56\x68\xd0\x8e\x90\xa4\x2c\x2d\x8a\x48\x22\xb7\x25\x69\xaa\xe9\x35\xc2\x43\x44\x80\x97\xc9\x59\x42\x86\x61\xc3\x49\x52\xb2\x1c\x64\x71\x72\xb2\x94\x11\xf6\x18\x56\xd6\xb2\xc4\xb6\x18\x2c\x80\x6b\x26\xd5\x15\xe4\xaa\x82\xb8\x06\x51\x87\xec\x73\x87\x20\x46\x08\x62\x28\x41\x44\x26\x16\xa9\x6a\x55\xf9\xae\x2a\x1f\xfd\x54\x2f\x91\x77\x49\x4a\x0b\x6d\xc9\xbb\x70\x92\x4f\x99\xe2\x4d\x32\xc4\xa0\x64\xa2\x2c\x95\x1b\x11\x15\x27\x25\x92\x41\xf3\x54\x4e\x4f\x92\xab\x60\x70\x61\xe2\x60\x9d\x92\x7c\x80\x6f\x85\x76\xc7\xb7\xc6\xb9\x19\xf2\xb2\xb8\xe5\x85\xb2\x3e\x39\x14\x3a\x2e\x22\x97\xf5\x49\xbe\xcd\xa5\x83\x53\x48\x80\xbe\x63\xe2\xc2\x74\x70\x81\x23\xfa\x75\x82\x27\x80\xc0\x03\x24\xff\x60\x4a\xfe\x97\x7c\x10\xed\x92\x4a\x93\x07\x5b\x72\xff\x82\x47\xc0\x21\xfd\x97\xf3\x2b\x35\x73\x87\x6a\xb8\x7d\x1d\xca\x11\x78\x16\xb4\x2b\x46\x37\x1b\x3c\x47\x44\xf2\x2b\xc2\x9d\xf3\x70\xc2\xab\x2e\x34\xc4\xed\xc3\x57\xca\xa7\x1e\x30\x8b\x88\xc6\xc0\x16\x5a\xea\x44\x19\x8f\xdb\x1c\x5b\xed\x29\x61\x30\x52\xad\xe7\x85\x87\x71\x26\x23\xd5\x59\xb1\xe6\x91\x78\x32\x34\xca\xb5\xad\x78\x14\xa1\x78\x84\x53\xe0\x25\xd4\xf2\x95\x62\xad\x47\x5d\x09\x24\x43\xef\x0b\x0c\x6f\xcd\x34\x0b\xe9\x85\x35\x74\x65\x64\x53\x60\x22\x17\x1c\xe3\xb8\x20\x90\x08\x04\x8e\x08\x12\x30\xa7\x21\xf2\x1b\x9c\xf8\x71\x42\x45\x75\x41\x57\x02\x23\x74\xd1\xfe\x7a\x8d\xe8\x39\xf2\xed\xd4\x9b\x79\xf6\x49\x4f\x31\xf5\x09\xf7\xce\xe4\x8d\x0c\x6e\x67\x21\xf0\x40\x8f\x04\xc0\x12\x03\xb8\x85\x52\x5f\xd0\xff\xce\x02\x98\x88\x3d\x02\xf9\x5c\x86\x5f\xb9\x0c\xa5\x04\xd0\x77\x30\xba\x24\xde\x5d\xaa\x02\xb2\xbe\xc7\xf9\xa4\xad\xe0\xd7\x99\xac\x3e\x3e\xc3\x5e\x88\x89\x74\x18\x24\xb8\x89\xdd\x7f\x8f\x89\x81\xcc\x1b\xd4\x92\xdf\x85\x28\xdc\x30\xea\xbf\x67\xc8\x25\x62\xf9\x7a\xd2\x43\xaf\xb0\xae\xb8\xb2\xb1\xea\x4e\x46\xf7\x14\x63\x37\x38\x8a\x51\x05\x4a\x36\x18\x74\x03\xc6\xea\xc4\xd0\x87\xc4\xed\xfe\x9e\xed\x07\xee\xcb\x7e\x50\x95\xfc\x3a\x53\x60\xc4\x1d\xeb\xf4\x51\x38\x65\xf8\xb9\x5f\xab\x67\xa2\x7f\x8f\x7b\x03\x51\x85\xc7\xaa\xc0\xd7\x74\xc7\x38\xbc\x35\xca\x2a\xec\x12\xc4\x13\x50\xd7\x00\x68\xd0\x8f\xce\x5c\x86\x46\x49\x60\x06\x8c\xe3\xd5\xa1\xee\x65\x8c\x3a\x93\x92\x42\x69\x4c\xf0\x10\x0a\x97\xf8\x4b\x3b\xa2\x7e\xd7\x77\x78\x5c\x95\xed\x01\xef\x3c\x9f\xca\x3c\xb2\x53\x1e\x59\xb8\xe4\x97\x8c\x4d\x63\xfa\x3a\x20\x2c\x00\x22\xf0\x33\x16\xa0\xcc\x1b\x83\x8e\xe6\x91\x50\xd2\x4f\xb8\x8c\xa8\x7f\xc6\x81\x80\x42\xd0\xdb\x40\x04\x71\x1d\x12\xd3\xf0\x51\x6a\xb8\xb2\xd7\x80\xf8\x70\xd3\x0b\xdc\xcf\xb9\xf7\x18\x2f\x43\x2d\xa3\x15\x52\xdf\x74\x2f\xb9\x3f\x8e\x46\x2c\x43\xd8\xf2\x71\xa4\xd5\x47\x98\x4d\x2f\x54\x77\xc1\x00\x82\x68\xf7\x68\xfb\x4b\x46\xfd\x02\xe6\x5f\xff\x9c\xbf\x46\x32\x18\x99\xb0\x62\x34\x61\xc5\xad\xf9\x2a\xea\x7b\x53\xbf\x56\xdc\x18\x2d\xc1\x73\x87\x70\x3e\xe3\x5c\x5d\x99\x3b\x63\xbe\xba\xf2\x68\xc6\x42\x75\x65\xfe\x0c\xc3\xe9\x4e\x63\xdd\xbe\xdc\xd8\x04\x9d\xb2\x0c\x1f\xed\xf0\x3c\xb8\xe4\xce\xaf\xb3\x77\x11\x61\xfe\xd2\x7d\x74\xcf\xa3\xcb\xa9\x81\xe6\xe5\x46\xa0\x67\x38\xd4\xfb\x21\x3b\xea\x13\xea\x4e\x92\x94\x39\x5a\xb3\x03\x3b\x63\x18\x56\xd3\x27\x23\x66\x65\x48\x4c\x79\xc5\xcc\xde\x3b\x54\x1e\xe8\x52\x1d\x2a\x1f\xc2\x13\x9a\xd6\x5f\xe3\xdd\x30\xd0\x77\xe5\xc1\x38\x3b\x49\x92\x03\x49\x76\x8d\xc6\x06\x01\x81\xfe\x06\xf2\x7c\x64\x3a\xa4\xee\xbf\x92\x3c\xc3\xa5\xed\xfe\x1e\x14\xda\x76\xd7\xab\xa6\xfd\xbd\x74\x18\xd2\x78\x3f\x25\x3e\x6f\x12\xda\x4d\x85\x18\x1a\x48\xdd\xc7\x94\x88\x96\x0c\x75\xdf\x4f\x8d\xcf\x99\x51\xda\x86\xc8\xf8\x9d\x3d\x4f\xc3\xa0\xdf\x90\xf0\x65\x45\xee\x38\xb9\x5f\xed\x1f\xde\x1b\xe9\x04\xe7\x23\x76\xc6\x18\x9e\xbd\x4d\xb8\x4b\x50\xc3\xf2\x6b\xae\x97\x1c\xe0\x2f\x95\x8e\xc6\x1e\x88\xa2\x78\x05\xf4\x66\x68\x02\x63\x01\x7c\xa9\xca\x91\x9a\x24\x74\x4e\xaa\x35\x3d\xc4\x1d\x66\x2b\xaf\x65\x89\x2b\xb5\x4a\xd1\xbe\xcc\xb5\xdc\x6d\x86\xbe\xcd\xf0\xf7\x5e\xc6\x79\x8e\x54\xb1\xd1\xd7\x4b\x0f\xc0\xff\x3d\xc0\x3f\x1b\x65\x23\xa5\xb2\x31\x1d\xa4\x5e\x6e\x22\xe2\xf8\x52\xea\x49\x7a\x46\xb7\x39\x5a\x72\xfc\x73\xff\x0c\xd4\x97\x80\x70\x69\xed\x25\xf1\x23\xf3\x26\xd1\xbf\xf9\x20\xaa\xfd\x38\x0e\x7e\x3c\xa5\xc9\x08\x85\x4e\x34\xd8\xa3\x12\xc6\x55\x00\x6d\xbf\x00\xb5\x08\x61\x45\xe1\x55\xff\xb9\xea\xee\xe3\x16\x15\xef\x92\xf1\xa5\x1d\x3e\x46\x50\x71\xb0\x74\x1f\x99\x23\x63\xb8\x33\xb7\x35\x0f\xe1\xfa\xb3\xa6\xc1\xf7\xae\x2b\x39\x31\xf6\xc7\xd7\x4b\x1f\x2c\x20\x8c\x9f\x87\x8f\xc1\x32\xbe\x64\x1c\x46\xdb\x23\x2c\x38\x8f\x1f\x6d\xbe\xf4\x2f\xd9\xeb\xe7\xd3\x21\x22\xba\x0e\x20\x22\xf0\x1e\x18\x7c\x8d\x88\xb6\x42\x42\xb8\xd7\xf0\xdc\xa2\x26\xa2\x20\xba\x11\xe2\xa9\x1f\x58\xc2\xd7\xe9\x76\xff\x72\x3c\xf9\xf7\x63\xc9\xeb\x70\xe4\x85\x9a\x22\xe8\x49\xe7\x21\x54\x17\x5f\xb2\x09\xdd\x3e\xc7\xd2\x07\x6c\x4b\x86\x41\xd8\x6f\x51\x06\xcc\xe8\x59\x4f\x5c\x65\xb0\x75\xb5\xe9\xbd\x95\x28\x5a\xd3\xb2\x4b\x86\x56\x14\x65\xfb\x65\xca\xf6\xab\x2c\x3a\xe3\x02\xd1\x9c\xde\x0f\x99\xdf\x2f\x8a\x13\x07\x77\xb6\x82\xae\x80\xca\xa1\x8f\x9a\x96\x34\x1a\x2a\xb3\x4e\xcf\x92\xcc\xce\xb0\x7f\x03\x6d\x49\x0e\x09\x27\x3c\x7c\xe4\x3d\x1b\xb2\x6f\x4b\x73\x09\x6a\xd0\xca\x38\x19\x48\x4b\xaa\x2b\xcf\x72\x0b\x09\x2e\x3e\x85\xad\x1d\x61\x6c\x49\xd6\x16\xe0\xf0\xcb\x96\xe4\xdd\x65\xb4\x86\xed\xd7\xdb\x92\xfd\x9e\x2d\x5a\x5b\x92\x95\x0d\x47\x9a\xab\x1e\x6d\xb5\x30\x18\xaa\x08\xfa\xd2\xbe\x89\xe7\x0a\x68\x5b\x2c\xf4\x06\x76\xa9\x8b\x7d\xe2\x13\x35\xda\x5f\x3f\x07\xe0\x2a\x91\x4b\x71\x4b\x60\x6b\x3e\x7e\x95\xf1\xd8\xef\xcc\xd0\x38\xa4\x1c\x4f\xbc\x50\x96\xcb\x50\x59\x2e\x23\x9b\x2d\x41\x46\x93\x0d\xb9\xe0\x38\xa7\xb1\x73\x36\xb5\xcb\x2c\x6d\x7e\x19\x51\x76\x1e\x3c\x06\x2d\x16\x53\x4f\x9e\x2f\x8c\x91\x2d\xa3\x47\xb4\xb9\x39\x8f\x9e\x3c\x16\x01\xa5\x44\x18\x09\x5c\x6c\xf4\xf5\x12\x94\x6e\x98\x14\xdb\x9d\x25\x7f\xf4\x40\x6c\x77\x7e\x55\x92\xf0\xbb\x80\xb0\x70\xc2\x55\xe2\x47\x65\xb3\xe9\x27\xfa\xf2\x64\x93\x73\x16\xe1\x49\x20\x51\xa1\x0e\x0c\x39\x0f\x5e\x77\x58\xc7\x58\x16\xc6\xe5\xb2\x1d\x04\xe1\x76\x56\xcb\x09\x75\x2a\x73\xa0\xed\xc9\x73\x57\x6c\x89\x7a\x6d\xde\xc1\x22\x51\x37\xe5\x2a\x8a\x56\xf4\xcc\x9f\xa1\xe7\x33\x17\xd7\x9e\xa4\x20\x3b\xa0\x43\xa6\xcc\xe5\x1c\x91\xdc\x95\xdc\xe1\x0c\x54\x17\x45\x81\x2e\x52\x20\xe1\xe1\x68\x15\xc6\xdf\xb9\x0a\xa3\x69\x30\x78\x2d\x0d\xee\xa6\xe3\x6e\x6a\x7f\xb6\xa4\x60\x50\x92\x32\x18\x13\xae\xd6\x00\x95\xc1\x18\x70\xa0\x35\x65\x04\x6a\x5d\x8c\xcb\xf5\x1c\x24\x5b\x34\x80\xa0\x66\x85\x07\x6d\xc0\x28\x7e\xdd\xcc\x8a\xdb\x4c\x5d\xa8\xd1\xa5\xee\x92\x07\x94\x29\x7b\xe8\xcb\x48\x90\xf5\xd6\x6f\x26\xb6\xd0\x54\xad\x35\xbb\x6a\xdd\xd9\xd3\x8b\x53\xfa\x88\x11\x8f\x32\x3c\x77\xc0\xc6\xe3\x8a\xa6\xaa\x13\x52\x22\xd2\x21\xef\xd1\xa1\x0c\xc0\x80\x77\x4e\xa3\x02\xa3\xf4\xe2\xe9\x24\xce\x19\x8a\x1f\x92\x08\x99\x26\xc2\x48\x13\x21\xae\x43\x30\x6f\xe9\x69\xe6\x5d\xa0\x86\x0a\x55\x87\x97\xcc\xfb\x75\xf6\x0e\x33\x20\xa1\x42\xcd\xec\xa5\xc2\xca\x8e\xb3\x4b\x54\xe4\xa0\xfd\x87\x5d\x10\x16\x43\xa3\x5c\xa4\x00\x04\x92\x06\x78\xf7\x69\x54\x73\x1a\x10\xf5\x8c\xbf\x7d\x9c\x0c\x31\x0d\xf2\xbc\x67\x72\x95\x48\x9e\xd9\x03\x77\x68\x1d\xba\x27\xf1\x54\x92\x93\xf4\xb9\x45\x9f\x0e\x10\xd0\x78\x2b\xd8\x63\x0a\x51\xa9\xb5\x27\x8f\x7d\x21\x2a\xed\x3d\x2e\xdd\x73\x55\x30\xdc\x5f\xcd\xd6\x5b\xcd\x4f\x9d\x68\xec\x75\x47\x8b\x7c\x95\x09\x66\x6a\x5f\x8b\xcf\xf9\x23\x73\x87\x82\xc4\x19\x97\xb6\x5f\x57\xda\x3c\x91\xf3\x06\x20\xe8\xf0\x73\x5c\x76\x93\x0b\xa3\x91\x5a\xa8\xc3\x33\x93\x2e\x99\xbf\xe4\xfc\x31\xc4\x82\x98\x5a\x28\xc0\xb7\xd0\x23\xe7\x1c\x25\x31\xbd\x6c\x3d\x10\x5a\xe4\x8e\x79\x17\x33\xe3\xf1\x33\xb6\x0b\xc5\xb1\xa5\xbf\x5b\x66\x8b\x41\x64\x8b\xa5\x8d\x8b\xb9\xe7\x1e\x48\xe3\x9c\x5f\xb2\xd7\xac\x46\x8e\x4f\x33\xff\x77\x74\xc3\xef\xd1\x09\x5f\xc5\xa3\x7e\x1b\xb5\x14\xd8\x31\xc8\x64\x71\x25\x7f\x17\xed\x80\xe0\x87\xea\x05\x5f\xf2\xcb\xa9\xdd\xf1\xc5\x74\xdf\x45\x11\xdb\x7f\x9a\x26\x1e\xea\x4a\x5d\x2f\xb5\x23\x74\x72\xb5\x31\xe0\x0a\x8f\xe0\xce\xbc\x3a\xc4\xb0\x33\x1e\x6e\xbe\xf2\x4e\x81\x67\x31\x22\xaf\xca\xa3\x10\x09\x34\x08\x0a\x9f\xfa\x78\xca\x0d\x1f\x6d\xcd\xb5\xf1\x94\xaf\x76\x7f\x2d\x0b\x6c\xea\x7b\x97\xdc\xc7\x4d\xbc\x2e\x7a\x37\xe2\x3f\xcf\x8e\x29\x0f\xcf\x5c\x4f\x1e\xe5\x19\x70\xe5\xfa\x81\xdb\xc0\x5b\x28\x3f\xe0\x81\x55\xb8\xc8\x32\x3c\x2c\xdc\xe5\x34\x74\x1f\x7d\x3c\x23\xc5\x83\x6a\x39\x0d\xe3\xc1\xae\x62\xd7\xc6\x1d\xc0\xed\x26\x32\x90\x09\xc2\x80\x86\x3c\xb5\x43\x1a\x62\xcb\x3d\xdb\x87\x4f\x99\x67\x33\x5e\xcb\x4e\xe0\x04\x7f\x11\xdc\x54\xe9\xca\xae\x40\x9f\x6e\x5c\xec\xee\xfc\xf8\x5a\xa0\x7e\xeb\x81\x0f\xfa\xd4\x1f\x17\x1f\xf0\x8c\x1d\x98\xbe\x5d\xea\x79\xc2\xa5\xdc\xc7\x93\xb1\x55\xa3\x30\xc4\x0f\x8d\xbc\x02\xe1\xa6\x2e\x08\x2d\x7e\x6c\xbb\x82\x46\x8c\x46\x6d\xd3\x7d\x6e\x53\x16\x9f\x83\xca\x1b\x08\x1a\x46\x5d\x94\x14\x1a\xc4\xd4\xa3\x61\xd8\x06\x3f\xc5\xdd\x9f\x71\x81\xb1\x87\x38\xf5\x3c\xe8\x23\x75\x2e\xb1\xcb\x64\x0c\x21\xe6\xe3\x56\x35\xc1\x68\x80\x8b\x28\x5d\xd8\x31\xce\xa9\xe7\x16\x32\x0c\x02\x65\xae\xa0\x8c\x75\x41\x80\x1d\x42\x9d\x30\x85\x6b\x60\x53\x27\xc6\x7d\x7a\x8c\x3a\xc1\x39\x90\x01\x2f\x6c\x19\x91\xc7\xf6\x29\x8b\x89\x8f\x9b\x19\x3d\x1a\x78\x05\x0c\xab\xed\xe3\x62\xa2\xef\x5d\x84\x54\x7a\x1c\x22\x8e\xfa\x8c\x40\x25\x11\xd5\xad\x61\x36\xe5\xa7\xfd\xa6\xa3\xf0\xcb\x5c\x1a\x17\x9c\xb8\x78\x40\x8f\x0c\xa7\xc0\xfb\xe7\x66\xd1\xc0\x5f\x06\xd4\x0f\x0b\x79\x04\xae\x47\x59\x34\x08\x8f\xeb\xe0\xb1\xae\x2e\x9e\x31\x82\x2e\xe6\x70\x71\xda\x6d\x21\x78\xba\x9f\x3b\x8a\x87\xeb\x10\x1a\x01\xe6\xc7\x85\x4f\x19\xee\x08\x64\xcb\x90\xb2\x60\xd4\x69\x28\xca\x61\xe0\xf0\x53\x46\x43\x5c\x66\x6c\xa3\x70\xb5\x98\xf0\x01\x57\x54\x31\xc4\x8c\xcb\x96\x4c\x86\x76\x72\x60\x44\xc2\xf0\x82\xc9\xc3\x91\x5f\x1b\xe3\x18\xb0\x6e\x14\x38\x1d\xe8\xcb\x7f\x09\x13\x10\x53\x26\xe0\x61\x6b\x83\xe8\x39\x26\xd0\xdf\x53\x8f\x4e\x33\xfe\x25\x1e\x77\xb5\x9b\x09\x10\x44\x52\x1e\x60\x44\x09\x74\x46\x81\x1b\xee\x73\x8c\x80\x1f\x00\xd6\xf8\x4c\xf4\xe2\x37\x01\x0f\xa0\xcc\x45\x52\xc0\xe8\xd4\x82\xba\x6d\xb0\x07\x74\x88\xa5\xcc\x05\x1a\x60\xb1\xa0\x9e\x3c\x6e\x43\xbe\xc1\xcd\xca\x51\xc1\xe5\xf6\x22\x97\x9f\x87\xd4\x0b\xfa\x45\x63\xc8\x7e\x9b\x72\x2e\xbd\xfb\xfc\xf3\x80\x72\xaf\xbf\xe3\x99\x11\xa8\x8b\x81\x1e\xe4\xa3\x02\x1c\x0b\xa4\x47\x1d\xe6\x85\xba\x2e\x65\xb8\xb7\x18\x7a\x02\xf4\x0e\x97\xfa\xfe\x92\xd3\x08\x60\xe9\x6d\x87\xa0\x30\xec\xec\x82\xc5\x34\x00\x3c\x2f\x02\x1a\xc4\x40\x19\x62\x1c\x34\x0d\x70\x9c\x06\x2e\x02\x0d\x72\xb0\x7b\x4a\x63\x8e\x91\xf5\x88\x3e\x67\x01\xba\xe9\xc5\x3b\x3d\x25\x4a\xfc\x61\x12\x91\xf2\xa9\xa9\x1e\xd2\xbf\xcf\x47\xb1\x0f\x89\x50\xd1\xd7\xe6\xd3\x80\x6c\x24\x15\xfd\xe8\xa9\x67\xa2\x22\x2b\x71\x3f\x1f\x6c\xe6\x24\xa9\xdc\xb3\x3d\x9f\xec\xe2\x26\xc6\x4a\xdc\xdb\x2b\xdc\xec\x69\xcc\x77\xec\x00\x25\xd7\x72\xf3\xc0\x7c\xb2\x9d\x80\x5c\x97\xa2\x99\x0f\xdd\x0c\x49\xaa\x97\xcc\xe7\x3b\x96\xd1\x01\x54\x31\x7e\x87\x29\xe4\x36\xab\xaa\xcf\xf3\x91\x89\x89\x34\x52\x8e\x9e\x4f\x24\x6b\x62\x94\x6b\x7b\x29\xe7\xda\x3e\xd8\xed\x04\xbc\x25\x7b\x62\x83\x0e\xba\x9b\x18\xd8\x85\x06\xc9\x68\x17\xdc\xf2\x0c\x63\x5b\x8e\x72\x52\x3d\x02\x96\xf5\xc2\x92\xc5\x43\x53\xbe\xa4\xe0\x54\x54\x96\xf5\x4f\x8e\x27\xdb\xab\x6f\x6f\x34\xd9\x67\x62\x7c\x7e\x75\x40\xd9\x17\xc4\x94\xdd\x5f\xed\x6f\x0a\x2b\xfb\x6f\x88\x2c\x3b\x1e\x68\x15\x7b\x75\xd7\x9b\xae\x6a\xeb\xa9\xca\x9a\x87\x6a\xfd\x94\xad\x1f\x56\x59\x25\xae\x0b\x28\x8f\x7c\xac\xf2\x46\x3f\xcb\x0e\x79\x68\xdf\xc9\x4a\x8b\xed\xf6\xf9\x91\xc4\xf0\xbc\x76\x93\xad\xee\x0b\xd1\x64\x76\x79\x5d\x67\xd5\x63\x56\xfd\xd6\xf1\x7c\xcd\xa8\xee\x07\xe1\xb7\x8e\xed\xbf\x67\x84\x55\xf8\x6a\xd9\x9c\x1f\x55\x6b\x12\x41\xd3\xa5\x58\xdf\x65\xe7\x62\x7d\x53\x64\xd5\x99\x28\x8a\x6b\x91\xfe\xbd\xee\xc6\x7f\xcf\xfb\xa7\xad\x8a\xcb\x6b\xee\x86\x25\x27\x46\xbe\xae\x1b\xb1\x4e\x01\x92\xbb\xac\x99\xb7\x0d\xd2\x68\x33\xcb\x69\x9d\xaf\xef\x8a\xec\x2f\x2a\x63\x32\x4e\x38\x19\x27\xcc\xd7\xd9\xc7\x59\xbe\x25\x7d\x84\x63\x63\x24\xdb\x5a\x24\xa7\xf7\x55\xd9\x94\xc0\x8b\xa8\x0a\x97\x7d\x9d\xfd\x54\x26\xfd\x4e\xb5\x9e\xa0\x01\x4d\xd2\x2c\xf3\xfa\x58\x41\x04\xcf\x34\xd5\x8d\xbc\x2a\x16\x27\x36\x4b\x92\x64\x92\x4c\xf3\xf5\x4d\xf6\xe9\xc7\x5b\x53\x58\x87\x87\xd3\xb7\xf7\x0f\xf5\xd2\x14\xd6\x7c\xf2\x26\xb9\x12\x0b\xd2\xeb\x08\x15\xda\x78\x5f\xd9\xc7\xa3\x37\xf5\x7d\x91\xa7\x99\x99\x11\x66\x11\x07\xe0\x1a\xbe\x2e\xb2\xf5\x5d\xb3\x3c\x3c\xbc\xc9\x8a\xac\xc9\x66\xc3\xb7\xdb\xed\xa0\x57\xb2\x55\xde\x9c\xe1\xd0\xd6\xa3\x5e\x99\x00\xbd\xab\x85\x2b\x71\x6f\xf6\x19\x41\x61\x0a\x6b\x6b\x6d\x49\x6e\x1d\xeb\xe4\x59\x6e\x8e\x0b\xdb\x8b\x6e\xdb\x7d\xf8\x99\x7d\x81\x4f\xec\x8a\xbe\xfc\xcf\xe7\xf8\xbb\xaa\xfd\x9f\xc6\xf1\x3b\x15\xbf\x47\xeb\x5d\x5a\x7f\x70\x01\x4b\x45\x62\x18\x8a\x4a\x6c\xf6\x5d\xd1\x22\xa9\xd1\x6e\x23\xb5\x0e\x0f\x4d\x71\x94\x18\xa9\x58\xcb\xa4\x99\x61\x91\x71\x5e\x51\x64\x55\x33\xca\x8c\x69\xd3\xcc\x3d\xc1\xb3\xcd\xbe\x14\xb5\x12\x4b\x0d\x8b\x98\xe2\xe4\x0f\xdf\xd5\x8f\x77\xb3\xc7\xac\xaa\xf3\x72\x9d\x18\x8c\x76\x7b\xfb\xfe\x70\x24\x8e\xfe\x60\xcc\x1e\xf3\xec\xe3\x1f\xcb\x4f\x89\xe1\xcc\x9c\x99\x1b\xcc\xdc\xc0\x98\xdd\x57\x19\xa2\xd7\x69\x7d\x9f\xa5\xcd\x5f\x45\x93\x97\x89\xf1\xe9\x5d\x7e\xf3\x7f\xbf\xcb\x6f\x66\xab\x2c\x6b\x0c\xb9\xeb\xf5\xd3\xaa\x58\xd7\x89\xb1\x6c\x9a\xfb\xf9\x9b\x37\x1f\x3f\x7e\xa4\x1f\x5d\x5a\x56\x77\x6f\xb8\xe3\x38\x80\x05\x86\xcc\x32\xff\x54\xe4\xeb\xbf\xef\xca\xc8\xe2\x38\x7e\x83\x6f\x8d\xd9\x6d\x99\x3e\xd4\xc0\xa3\x12\xe3\x56\x14\x75\x66\xcc\xaa\x12\x7e\xe4\xab\x3b\xe3\xed\x1f\xe6\xbb\xda\xf2\x3f\x06\x7a\xeb\xa8\x38\x32\xbe\x83\x42\xdf\x1a\x30\xb9\x37\xc9\xd3\x96\x14\x74\x95\x08\x52\xd0\x34\x69\x48\x41\x6f\x3a\x9c\x12\xa4\x21\x99\xf5\x54\xd0\x12\x1e\xad\xcd\x66\x1f\xfe\x36\x64\x24\x5b\xc0\x44\x92\x01\xa3\x29\x68\x35\xc0\xd1\x5d\x32\xe8\xfb\xcf\xab\xeb\xb2\x38\x3c\x94\x77\xda\x94\xef\x9b\x2a\x5f\xdf\xfd\x24\xee\x0e\x0f\x77\xd7\x58\x90\x69\x5e\x4d\x37\x86\xa2\xa3\xed\x3e\x21\xba\xd8\x4b\x6e\x00\x6e\x33\x68\xbe\xf5\x94\xdf\x9a\xec\xb0\x01\xbc\x4e\x80\x79\x5a\x24\x3a\x6c\x2c\x35\x0d\x89\xe3\xfc\xd6\xf4\xe0\xad\x51\x62\x55\x46\xa2\xdb\x24\x0e\x0f\xe1\x7f\xda\xd5\xd4\x7d\x24\x67\x13\x05\x5c\x5a\x65\xa2\xc9\xcc\xf5\x43\x51\x58\x50\x5c\x41\x2b\x33\xdb\x07\x7a\x46\x8c\x9b\xec\x56\x3c\x14\x8d\x31\xee\x71\xd9\x0a\xb1\xb5\x08\x47\x80\x6a\xec\x97\xae\x93\x85\x75\x5b\x56\x26\x54\x9d\xcf\xf2\xf5\x4c\x58\x05\xbd\x31\x33\x92\x93\xa9\x9c\x38\x13\x30\x0f\xd1\xeb\x7c\x7d\x83\x70\x91\xdc\xb2\xf4\xcc\x9b\x41\x1f\xad\x7b\x7d\xa4\xa7\xe7\x51\x6b\x4f\xa6\x62\x04\xc8\xa8\x08\xfb\x76\x87\x8c\x21\xb6\xba\x06\x80\xab\x21\x86\x30\x48\x63\x91\x06\xaa\x1b\xcb\x03\x2a\xa3\xea\xa2\x6e\xae\x1c\x2a\x2f\x38\x9d\xe1\x07\x50\xc6\x7d\x62\x18\xa4\x30\x0b\x5a\x27\xbb\x27\x2a\x64\x63\xf0\xcb\xae\x6f\x3f\xc9\xc3\x01\xda\x19\xb2\x30\x33\x44\x84\xe6\x2a\x5b\xe8\x61\x84\x67\xaa\x98\x3f\x8e\x68\x9e\x40\x52\xf2\x94\xcf\x33\x52\x80\xb8\xa3\x5e\xce\x9f\xb6\x6d\xdb\x04\x7c\x84\x70\xe5\xfa\x5b\x92\x93\xee\xb9\x00\x91\xa8\x48\x0e\x9c\x2e\x6d\x8b\x5c\x9d\x34\x5b\x8b\xf4\xe0\x51\x94\xd9\x9b\xc3\x53\xb2\x46\x18\x0f\x9a\xab\x74\x21\x9f\x04\x3e\xc1\xf7\x65\x62\xe8\xac\x1d\x8a\x56\xd9\x3f\x1e\xf2\x2a\x3b\x3c\x54\x0f\x80\x7d\x07\xeb\xc3\xc3\x52\x37\xb1\x34\x53\x72\xe0\x20\x56\x56\x3a\xad\x52\x69\x50\x6a\x9d\x80\x98\xf7\xe7\xaa\x2a\x2b\xd3\x38\x13\xeb\x75\xd9\xcc\x6e\xf3\xf5\xcd\x6c\x85\x28\x30\xfb\x83\x71\x94\x1e\x19\x7f\x30\xac\xe3\x66\x59\x95\x1f\x67\x35\x4d\xcb\x9b\x2c\x31\xde\xfd\xf8\xa7\xff\xb8\xf8\xf3\x2f\x3f\xfc\xf8\xd3\x2f\xdf\xff\xf8\x1f\x3f\xfc\xc9\x20\xb2\x95\xcb\x04\x60\x4f\x9e\xfa\x1d\x07\x6d\xb8\x72\x54\xa7\x2d\xdb\x8e\xda\x81\xb4\xb9\x89\x79\xd9\xe2\xaa\x58\x6c\x36\x85\xb5\x25\x4b\xd2\x7d\x80\xb3\x31\xc9\xac\x6d\x3b\x7c\x69\x3b\x7c\x5b\x4d\x19\xd5\x4b\xba\x89\xa4\x89\x73\x9c\x7e\x97\x29\x31\xee\x38\x3d\x3a\xb2\x72\x33\x83\xbe\xd6\xc3\x9c\x6f\xcd\x27\x36\xbf\x7a\x56\x14\x50\x9a\x74\x5d\x56\xcd\xff\x12\xcd\xb2\x4e\x0a\xd3\xa0\x6f\xe0\x27\x9a\x6f\x6a\xfa\xdf\xb5\x61\x6d\xc9\xd3\x24\x71\xee\x6e\x17\x84\x7f\xa1\xf4\x16\x31\x32\xfd\x3a\xbf\x35\xcd\x26\xa9\xcc\x86\x3c\x6d\x2d\x8b\x16\x99\xb8\xc9\xd7\x77\xef\xb3\x7b\x81\x92\x11\xbc\x99\x24\x92\x03\x06\x08\x09\x1d\x01\x5c\x53\xb1\x14\x62\xfc\x97\x7c\xfa\xaf\x59\x5e\xcf\x60\xd0\xc5\x4c\xbd\xb2\x48\x6e\xea\x6c\x1d\x2b\xdc\x6c\xc4\x4c\x2b\x19\xe5\xed\xec\xaf\xd9\xdd\x9f\x3f\xdd\x83\xde\xf1\x28\x40\x44\xf8\xaf\x5a\xd7\xf7\x5f\x33\xf8\xc4\x68\xeb\x6c\x88\xe6\xab\xbd\xdc\xe5\x3d\x34\xac\x9e\xe4\x9d\x42\x6f\x5c\x97\x65\x91\x89\xf5\x8e\xaf\x27\x99\xdb\xe2\x40\x5e\x2f\xd4\xd8\x2a\xa4\xbf\x32\x8c\xc5\xb1\x18\x4c\x63\xc0\xa8\xa7\x6d\xd2\x44\x52\x68\x44\x00\xfa\x90\xaf\x4c\xc3\x34\x8e\x76\x60\x6d\x41\xab\xec\xbe\x10\x69\x66\xbe\xb9\xb2\xaf\x7e\x5e\x3c\x6d\x4d\xeb\xdb\xa3\x13\x4a\x7e\xfe\xf9\x6f\xdf\x6c\xfe\x8f\x9f\xeb\xc5\x9b\x3b\x62\xfc\xfc\xf3\x37\x87\x86\xb5\x35\x0b\xeb\xc8\xb0\x0c\x62\xdc\xc1\x0f\x61\xa9\x99\xa4\x40\x85\xa3\x81\x04\x98\xad\x92\x24\xc9\x86\x0d\x98\x65\x98\x33\x4d\xae\x16\xc7\x80\xeb\xd3\xbe\x3a\x3c\x4c\xa5\x36\x94\xd1\x7a\x99\xdf\x36\xa6\x65\x1d\xeb\x42\xde\x3a\xc7\x56\xbf\xd0\x93\x49\xd6\xf9\x38\xe5\xa8\x57\x8c\x04\xc1\x30\x92\x24\x49\xaf\x9c\x05\xd4\xa4\xde\x11\x95\x98\xaa\x82\x6d\x86\x6f\xef\xcb\x7b\xd3\x22\xe9\xb6\xc7\xdc\x90\xed\x03\x7b\x2a\x2c\xc9\x4a\x3a\xc6\x23\xac\x2e\x63\x35\x98\x1f\xa4\xb8\x0c\xc3\x79\x22\xe6\xc5\x56\x68\x72\x4f\x32\x92\xd1\xcb\x3f\xff\xf5\xfd\x5f\x7e\xfc\x01\xe4\x37\x87\x32\x43\x61\x51\x32\x26\x2a\x60\xfa\x12\x8b\x8b\x83\x24\x11\x93\xda\x1b\x6b\xbb\x25\x4f\xdb\x05\x71\xbf\x40\x90\x6a\xa4\x4c\x03\x87\xca\xae\xb2\x46\xe4\x6b\x63\xa0\x85\x69\x09\x9e\x34\xc7\xa9\x29\xaa\xbb\x87\x55\xb6\x6e\x6a\x3d\x08\x09\x27\x46\x53\x96\xb3\xdb\xec\xe3\xac\x7d\x69\x58\x64\x9a\xf5\xbb\xc4\x95\x59\x57\x62\xfd\x79\x90\x97\x27\x49\x32\xce\x7d\x62\x8a\x64\x4d\x9a\x2e\xfd\x8a\x2d\xac\xb9\x29\x06\x09\x83\xf7\x7c\x01\xb5\xd6\x66\x61\x11\x23\x6f\xb2\x55\xdd\xb2\x81\xf5\x4c\x54\x95\xf8\x8c\x50\x95\xa6\x90\xef\x2b\xd1\x64\x59\xc7\x29\x5a\x06\x0b\x99\x26\xbc\xa2\x21\xc6\x4d\x5e\xb5\x68\xd9\x7d\xf6\x5e\x33\x98\x14\x11\xbc\x51\xd0\x8f\xb2\xaf\x1e\xea\x66\x76\x9d\x01\x43\x42\x7b\xc4\x2c\x5d\x8a\x4a\xa4\x4d\x56\x19\x96\x9a\xa4\x8b\x89\x4e\x2c\xd3\x85\x59\xb4\xfc\x7b\x07\x60\xb9\x6c\xeb\x0c\x60\x52\x6d\x32\x21\xc1\xea\xd5\xd9\xc2\xf8\x04\x6f\xe6\x05\x01\x9e\xfd\x53\xf9\xf7\x6c\x5d\xcf\x33\x33\x27\x80\x2c\xdd\x1c\x81\xac\xdf\x04\x14\x02\x1e\x36\x06\xaa\x65\x0f\x50\xd4\x76\x88\xe3\xed\xdb\xa1\xa4\xaa\x67\xb1\x2c\x11\xb4\xab\x99\xe4\x49\xd3\xff\x59\x25\x0e\x49\x93\x77\xa2\x59\xd2\x95\xf8\x64\x6a\xa2\x06\xb9\x43\xb2\x8c\xe3\xea\xbb\xf4\xb8\x3a\x3a\x92\x04\x67\x56\x20\x2d\x66\x96\xa5\x75\xca\xe3\x2e\x35\xd7\xa9\x33\x86\x9d\xbb\x4e\xb2\xab\x6a\x41\x9b\xf2\xa2\xfc\x98\x55\x67\xa2\xce\x4c\x8b\x94\x49\x3e\x49\x84\x32\xd6\x07\x49\x52\xca\xce\xaf\x93\xf5\xd5\xba\xe3\x01\x40\xb1\xba\x97\xea\x24\x49\xcc\xf2\xaa\x1c\xbe\xb5\x4e\xd6\xdf\x95\x27\x36\x9b\xb3\x79\x7d\xc2\xe6\x36\xdb\xea\x69\xdd\xd9\x76\x3d\x95\xbe\x94\x6d\x0c\x3a\xbc\x4b\x2e\x7b\xc9\x7f\x94\x33\x89\x59\x58\x87\x87\xc6\x95\x9c\x94\x66\xdf\xab\x9c\x0b\x60\x63\x13\x69\x54\xab\x26\x4a\x0e\xed\xd5\x57\x7f\xa9\xe0\x53\xa0\xa2\x17\x96\xda\xb1\x35\x10\x24\x7b\x6c\x0d\x14\x53\x90\x1f\x06\x0c\x67\xce\xb7\x0b\x60\x58\x04\xa8\x7c\x6c\xe1\x2a\x76\x88\xf5\xd0\x63\x05\xfd\x0b\x28\xfb\xad\xf1\x8d\xde\xe7\xf7\x59\x91\xaf\x33\x34\xfd\x17\xb4\xa9\xf2\xd5\x2a\xab\x48\x41\xeb\xa6\xbc\xff\xcf\xb2\xba\xf9\x3e\x2f\x1a\x95\x90\xc1\x2b\x8b\xa0\x7a\x80\x30\x37\x52\xae\x3f\x2e\x68\xab\x43\x3b\x34\xa6\xbe\x41\x8a\x87\x75\x95\x14\xa4\xa0\x68\xbd\x91\x9a\x29\x3e\xd2\x8f\xa2\x5a\xef\x30\x68\xcf\xfa\xf0\x16\x14\xa4\xf7\xb2\xc8\x0e\x0f\xd5\x03\x7e\x36\xfc\x05\xe3\xbe\x35\x9b\x65\x5e\x5b\x6d\xe1\xba\x4b\x77\x55\x00\xea\x0f\x4c\x20\x86\x31\xef\x94\x4d\x13\x35\x8a\x3f\x3f\x66\xeb\xe6\xcf\xab\xbc\x69\xb2\x9e\x8a\xab\x4c\x69\x19\xbc\x84\x26\x8c\x73\xf6\x86\x52\xdc\xdc\x5c\xe4\x75\x93\xad\x87\xdf\xcb\x91\x40\x14\xe8\x5b\x47\x8b\x3c\xcd\x64\x07\xb6\x9c\xd8\x22\x22\x29\xd4\x74\xd9\x24\x05\x50\x55\x27\xbf\xf6\x14\xbf\x0e\xf7\x7f\xfa\x7c\x9f\x29\x79\xbd\x10\x75\xd3\x4e\x0e\x3d\x26\xd6\xf1\xe7\xe3\x86\xde\x96\xd5\x9f\x45\xba\x1c\x70\x26\x6c\xdf\x52\xd4\xca\x36\x68\x16\xd6\x66\x63\xf6\x1a\x8d\xe6\xd3\x85\x45\x86\x49\xda\xd6\xba\xc5\xf4\x49\x07\xf6\x5a\x5a\x65\xab\xf2\x31\x9b\xf6\x8c\x26\xe6\x69\xfd\x7d\x0b\x71\xaf\xc6\x9e\x7d\xd6\x66\x07\x49\x02\x4a\xfc\x28\x8b\x32\xd4\x36\xca\x50\x3b\x7a\x3b\xb6\xd3\x0e\xde\x5a\xcf\x0d\x6d\xb6\xca\x9b\xb1\xbc\xb8\x0f\x6e\xf1\xa2\xb1\x26\x0c\xb4\xa8\x01\x78\xbb\x06\xa7\xa0\xe2\xfe\xbe\xf8\x6c\x6a\x53\x61\xdb\xdf\xcf\x00\xdb\xc1\xb4\x8b\x02\x40\xcc\xed\x37\x1d\x6d\x24\x30\x95\xe4\xbf\xf6\x3f\x50\x8c\x76\x2c\x5d\x6c\x36\x92\x82\x84\x16\xa5\x17\x80\xa5\xb2\xc1\x79\x8d\x77\x53\xb4\x03\x28\xe8\x2d\x32\x8e\x5d\x33\x21\x94\x73\x90\x14\x5b\x3c\x0b\x70\x38\x5d\x8a\xde\x74\x39\x24\x69\x53\x58\xc3\x99\x67\xab\x65\xe6\xab\x45\xc7\xce\x26\x1d\xd9\x19\x35\x94\x64\xdd\x6b\x32\xad\xb3\x7b\x69\x4c\xb6\x8e\xb3\x24\x03\xa6\x93\x8a\x06\x04\x41\xd9\xd3\x24\xdb\xb6\xf6\x8e\x8e\x61\x20\x8f\x34\x47\xc0\x3c\x5b\xf8\xa0\x9f\xb5\xe5\xe4\xbd\x7e\x9d\xbc\xb9\xfa\xb9\xfe\xd9\x5e\x1c\xbd\x21\x3b\x3f\x4f\x9e\xfb\x78\xf4\x49\xaf\xd4\x7e\x0f\xc8\x0e\x17\xbb\x6d\x5b\xbb\x81\x4e\xc4\x08\xec\x2a\xdb\x5d\x3c\x20\xea\x6b\xa1\x1e\x96\x7c\xb7\xa7\xdc\x16\x11\x76\x14\x0f\x25\xfc\x2f\x35\x75\x4d\x38\xf6\x2f\xff\x78\xc8\x1e\x00\x2f\xfa\xb9\x68\x95\xdd\x01\x23\xaa\xb2\x1b\x3d\xd9\xab\x79\x69\x92\x43\xbf\x1f\x99\x0f\x1b\x20\x9f\xe7\x0b\x3c\x3c\xec\x4f\x73\xa6\xf1\xe3\x63\x56\x7d\xac\xf2\x26\x5f\xdf\xcd\xb2\x4f\x79\x8d\x0f\xdd\x77\x2d\x87\x9e\xcf\x8c\xa3\xc6\x22\x82\x16\xe2\x3a\x2b\xd0\x76\xfb\x5c\x35\x57\xcd\x22\x11\x03\xd0\xef\xb2\xe6\xaf\x93\x7c\xc9\x0e\xb2\x12\x5f\x6e\xc4\x41\xc2\x4e\x00\x63\xe6\x5f\x00\x42\x0c\xfb\x17\x5a\xfc\x97\x5b\xfd\xfa\x87\xb2\x07\xd0\x00\x10\xd5\x48\x10\x22\xf0\xa1\x65\x4a\x3b\xea\xd8\x6c\x86\xfd\xf9\x7d\xab\x62\x49\x65\xa2\xd7\x95\x1f\xf3\x66\x39\x6b\xa5\x99\xd9\x4f\xcb\xbc\x9e\xad\xc4\xe7\x59\x2a\x40\x77\xbb\xaf\xca\xeb\x02\xf4\x9b\x8f\xcb\x6c\x3d\xab\xb3\x2a\x17\x45\x0e\x8a\xc5\xac\x59\x66\x33\x9c\x5e\xe8\xcf\x6b\x43\x59\x18\xdb\x36\x15\xa5\xb8\xd9\x2b\x49\xe9\x5c\xad\x45\x70\x2f\xf7\x01\xbd\xfe\xf9\xa1\x52\x0a\xff\x41\x36\x91\x6e\xb5\x35\x0e\x40\x99\x3d\xac\xed\x3d\xd8\x83\x2b\x97\x20\xc3\x65\xd6\x56\xd9\x5a\xdb\x1a\x07\x72\xca\x58\x3e\x79\xd9\x9c\x65\x1d\xef\x6e\xdd\xcb\xc6\x1f\xf4\xc7\x1e\x65\xee\x10\x20\x76\xc1\x7a\x3b\x90\xc6\x90\x04\x5f\x58\x5d\xa3\xa7\x86\x7e\xa5\x3d\x19\x22\xbf\x35\x71\x91\x79\x7f\x6f\xa3\xed\x53\x53\xec\xf7\x28\x41\xf5\x8a\xd2\x8b\xc2\x47\x8c\x38\xa0\x0a\xee\x6e\xc0\x75\x76\x5b\x56\xd9\xff\xde\x2d\x78\x0e\x7e\x29\xbd\xed\x58\x96\xdc\x05\x53\xa1\x24\x33\xa1\x96\xae\x87\xf5\x08\xc2\xf6\xd6\xf2\x30\x54\x07\xb4\xea\x2b\x92\xab\x05\x88\xc2\x5a\xa9\x1d\x76\x85\xd6\x74\x13\xe7\xb8\x79\x9b\x1f\xe7\xa0\xe3\x76\xa6\xdf\xe2\x2a\x5f\xa0\x6d\x37\x7b\x9b\x1e\x1e\xca\xd9\xcf\xac\xfa\x05\x5c\xa5\x0b\xb3\x22\x39\x29\x2c\x0b\xad\xbe\xc7\x32\x53\x05\x5c\x09\xb1\xb3\x6a\xcd\xcb\x62\x6f\xf7\xd4\x59\xf3\xc2\xb9\xa7\xfb\xea\x6e\xf8\x4d\xdf\x09\x42\x7e\xba\xe7\xbb\xa6\xfc\xbf\xde\xff\xf8\xc3\xf3\x9f\xee\x17\xa5\x5e\x4a\xa4\x8a\x25\xcb\xe5\x33\xd4\x14\xa7\x0d\xbc\xcd\xb3\xe2\xa6\xc6\xd1\xc1\xdf\x55\x76\x9b\x18\xf9\x8d\x21\x7f\x6a\x0e\x3c\xe2\x91\xf2\xe5\x4d\x99\x22\x3b\x79\xdf\x00\x61\xc8\x1c\x7f\xea\xa7\xc9\x6c\x88\x53\x30\x37\x77\xb2\xaa\x56\xce\xe4\x37\x7d\xe9\x57\x41\x91\xdf\xdc\x9e\x89\x74\x99\xb5\x9f\x95\x6b\xd3\x10\x37\x37\x06\x31\x24\x1e\x1b\xc4\x78\xb8\xbf\x11\x4d\x66\x90\x49\x93\x7a\x1f\xab\xb5\x32\x64\x4c\x5d\x2f\xf4\x06\xa2\x3f\xad\xbe\x4a\xc3\x1b\x38\xbc\xf4\x1b\xd5\xd7\x1e\x95\xcc\x3f\xc9\x43\x8a\xdd\xc0\xdc\xde\xee\x5e\x50\x9b\x56\x32\xd4\xc5\xda\xc5\x34\x59\xe2\x64\x9e\x13\x5a\xa3\x3f\x48\x92\x56\xbb\x1f\x4b\x37\x2a\x79\xb6\xca\xeb\x95\x68\xd2\xe5\x7c\x96\x3e\x54\x15\xe8\xa0\xc6\x51\xfb\xd1\x91\x31\xcb\x57\xf7\x65\x85\xa2\x8f\x71\xd4\x16\x2c\x19\x9c\x9c\x4b\xd1\x1f\xa8\xb5\x79\xa1\x40\xd0\xe2\x19\x28\x12\xf0\x40\x1a\x89\x6a\x82\x56\xd9\x2d\x69\x46\xb8\x34\xc2\x23\x6c\x90\x29\x86\x99\x2c\xd2\x99\x3b\x92\xd1\x24\x6f\x8a\xf6\x15\x64\x6b\x31\x50\xc8\x47\x4b\x25\x5d\x65\x8b\x04\xfa\xec\x11\x5d\x2a\xba\xbe\x33\x45\xfb\xbe\x1b\xe7\x5d\x03\x26\x6e\x6e\xbe\x87\xe6\xec\x12\xcd\xfa\xe4\xa5\xa7\xc8\x1e\x41\x5c\x89\x45\x6b\xc2\xe9\xd5\x8f\x39\x76\x55\x55\x83\x9c\x71\xbb\x4b\x0f\xec\xe8\xb6\xd8\xff\xb5\x78\xcc\x74\x97\xee\x05\xf6\x8b\xf4\xac\x5b\xb0\xa7\x2b\xfe\x54\xa6\xd3\x25\x7a\x61\x3d\x35\x49\x6b\xf0\x6f\x36\x9b\x46\x4d\x85\xe2\xaa\x05\x7c\x71\x3c\xad\x5f\x15\x68\x66\xa4\x95\x36\x54\x5f\x4e\x04\x97\x46\x5b\x8a\x07\x2c\x0b\xa6\xa2\xbe\x32\x64\x8a\xab\x66\x61\x59\x7b\xaa\xc2\x61\xbc\xc0\x69\xc8\xcc\x48\xd3\x33\xba\xca\x39\xe8\x69\xdb\x62\x74\x8a\x16\xd6\xdd\x4a\x3e\xbc\xaa\x4e\xaa\xab\x62\x71\x94\xb0\x39\xdc\x13\xa6\xd5\xcf\x4a\x82\xb9\x4e\xaa\xab\x74\x71\xbc\x96\x96\xde\xfa\x1f\x55\x63\xae\x07\x88\xd1\x2c\x00\x20\x34\x0a\x9b\x29\x79\xaa\xb2\xdb\x79\x46\x9a\xdb\xf9\x7a\x6b\x6d\x75\x59\x8d\x9a\x97\x07\x3c\x21\x5b\xe5\x8d\xe2\x92\xa2\x67\x5c\x18\x8f\x94\x64\x1d\x7f\x2a\xd3\x3f\x7e\x1e\x63\x54\x7e\x6b\x16\x87\x87\x07\x68\x93\x99\x76\x53\x5e\xff\xa9\x4c\xf1\xf1\xc6\xd4\x5e\x7b\xc3\x1c\x4b\x01\x59\x7a\x06\x94\x1d\x79\xee\xb2\x46\xe6\x39\x56\x6a\x82\x82\xc6\x14\xe4\x80\x7d\x01\xe2\xdf\x11\xbd\x14\xa8\x99\xa5\x6d\x4f\xc3\xd7\x1d\x58\xd9\x0b\xd0\xef\x25\x88\xb7\xdf\x64\xd7\x0e\xbb\xac\x54\x8e\x7c\x41\xb2\x4e\xa2\xfe\xe2\xa0\xeb\x49\x51\x8d\xfb\xee\x6e\x94\x13\xe6\xa0\x1b\x71\x92\x11\x5d\x07\x8a\xcd\x46\x8c\xc6\x05\xb1\xc4\x2c\x7a\xdd\x89\x8b\xcf\xf8\x53\xd1\x68\x81\x29\x62\x3f\x78\x7a\xaa\x2e\x3a\x15\x61\x0c\x5c\x7e\x33\x9e\xfb\xe4\x84\x62\xfc\x9f\xc6\x91\x38\x32\xde\x18\x47\x68\x46\x7d\x91\x6b\xc9\x50\x0c\x20\x4d\xbb\x1a\x32\x7c\x71\xd5\x2c\xfa\x62\xb9\x66\xcb\x0a\x43\xbf\xaf\xb2\x7f\x98\x85\x45\xf2\x84\x1d\x21\xa9\x16\xe5\xdd\x2e\x4c\x91\x7c\xe2\x0d\xa8\x0f\xd6\x50\x2a\xe8\x57\x94\xe4\x24\xdf\xd5\xec\xbb\xac\xf9\x5e\xce\x8c\xfb\x64\x41\x85\x76\x28\x84\x98\x3b\xbb\xae\xce\x44\x95\x2e\xa7\xb4\x71\xd0\xb3\xed\xc9\x76\x82\x58\xac\x64\xe3\xe6\xf0\xd0\xcc\x12\x90\x42\xa9\x5c\x51\xcb\x6f\x3f\x9b\x8d\xa5\x17\xe3\x24\xf7\x3f\xd3\x7e\xc1\x58\xae\x92\xe7\x5a\x90\x4d\xcb\x82\x1f\xa6\x45\xaa\x2f\xb1\x5e\xcb\x22\x69\x9f\x87\xae\xe5\x2a\x95\x72\x81\xc1\x8f\xb1\x9d\xef\xb1\x29\x66\x45\xd6\x24\xb7\x48\x9d\xe4\x57\xeb\x05\xbd\x2e\xcb\xba\x69\x3f\x5d\xc2\xa7\xa5\x55\x5e\x2d\x17\x09\x5c\xbe\xad\xc7\xaf\xf0\x96\x9e\xa4\x57\xcb\xc5\x11\x66\x99\xa7\x3a\x33\x7a\xb3\xdc\xe8\xd5\xf6\xf6\x9b\xd4\xba\x91\x53\x34\x72\xdb\x25\xa9\xd3\xb2\xca\xf0\xab\x6e\x59\xf0\x46\x2e\x0b\xee\x94\xcf\x04\xc5\x2f\xec\x42\xde\xb7\x16\xb9\xd9\x35\x50\xbd\x26\x4e\xd6\xb3\x15\x22\x02\xfe\x5d\x97\x65\x41\x72\xf9\x9c\x7d\xba\x17\xeb\x1b\xe8\x60\xf5\xa6\x6e\x48\x8a\xe3\x48\xd6\xd0\xa1\x7a\x75\xed\x20\x49\xaa\x13\xb3\xd8\xc9\x64\x24\x21\x5d\x15\x8b\x63\x96\x24\x39\xf0\xbb\x11\xc2\xcb\x4a\x14\xdf\xb1\x7a\x53\xde\x0e\x0b\xec\x70\xb2\x1d\xd1\x4c\x6d\x36\x16\x51\xe3\x99\xdf\xdc\x9a\x0d\x91\xca\x6d\x7a\x78\x68\x9c\xfe\xf0\x27\x03\x34\x5c\xb5\xb0\xd8\x43\x06\x35\x04\x78\x03\xf0\x6a\x18\xad\xfc\x6a\xb9\xb0\x8e\xf3\xa4\xf3\x01\xc2\xf7\x4d\x92\x14\x8a\xcf\xf4\x7a\xf3\x7d\x23\x9a\xda\x5c\xc3\xbc\x6d\x11\x85\x56\x37\x53\x08\x7f\xca\xaa\x15\x90\xf5\x43\xb6\x4e\x3f\x9b\x0d\x59\x5a\xe4\x7e\xcf\x14\xd5\x97\x07\x96\x20\x82\x3c\x24\xec\xd8\x39\x48\xee\x0f\x0f\xcd\x87\x84\xbd\xe9\x26\xef\x7b\xd5\x61\xe7\x09\x3b\x6e\x0e\x00\x3a\xf3\x3c\xa1\xcc\xff\xd6\x64\xb6\xa9\x57\xc3\xed\xd6\x71\xe5\x8d\x4e\x52\x9f\x5d\x26\x37\xdf\x96\xdf\x3e\x7c\x7b\x7e\xbc\xd4\xc2\x03\xa0\xed\xe5\x1c\xee\xc9\x65\x3b\xe3\xa7\x12\xd0\x55\x56\xdd\x65\xef\x01\xc9\x6a\x33\x25\x55\x37\x49\xe8\x0c\x69\x59\x56\x37\x3f\x94\xd5\xca\x4c\xc9\x9a\xb4\xd5\x5a\x73\xc9\xe3\x77\xa1\x65\xaf\xcc\x5d\x6e\x16\x07\xc5\xc0\xab\x52\x0d\x64\x8b\xb2\xbd\x81\x54\xfe\x8b\x78\x83\x7e\xc8\xae\xf2\x05\x6a\xef\x47\xe2\x2a\x5f\xf4\x3c\x15\x77\x7e\x70\x82\x39\x13\xc8\x3a\x87\x47\x7c\x6a\x7d\x0f\xbf\x40\x4f\x88\x01\x13\xe8\x87\x4a\x88\x95\xe9\x7a\xb2\x6e\x87\x01\xfc\x48\x94\xf1\x73\x5c\x7e\xdb\x97\xcf\x17\x5c\x58\xf9\xad\x99\xc9\xa6\x68\x9f\x05\xa8\x42\xb9\xa1\x61\x0d\x70\xf9\x36\x7f\xd3\x6c\x9f\x6b\xcf\xd4\x2a\x20\xa5\xa8\x8e\xce\x9f\x97\x44\x0a\xeb\x49\x80\xc8\xd9\x43\xfc\x62\xa1\x4a\x35\x5b\x44\x79\x52\x2a\xdb\xbc\x55\xea\x88\x2c\x70\xde\x2f\x9d\x00\x27\x6c\xe7\x7c\x32\x20\x90\xf9\x0e\x9a\xd1\xb5\x10\xac\x77\x2e\x88\x9e\x0c\xe6\xc3\xa9\xa1\x85\x66\xa7\x84\x52\xef\x32\x50\xbd\x74\x15\x4e\xd0\x87\xb5\x74\x60\xd2\xcb\xc8\x9d\xfa\xad\xf4\xe3\x81\x3a\x93\x4c\x24\xb1\x5f\x40\x4f\x4a\xd4\xd2\xf2\x66\x53\xb4\x76\x8e\xba\x35\x44\xdc\x94\xe9\x5f\xd6\xb7\x65\xfb\x5b\x0e\x72\xe2\x4c\x4a\x1f\x69\xe1\x6d\x6b\x5a\x0d\xb9\x9d\x3b\x54\x11\xad\x6d\x4c\xc8\x1a\x0b\xbc\xc9\x5f\x58\x65\xa1\x9f\x88\x50\x90\x16\xa8\xd8\x11\x31\xad\xbc\x27\x58\x75\x52\xfb\x5e\x19\x03\x4a\x79\xae\x8c\xb1\x72\xd7\x6d\x73\x69\x25\xfe\xcd\xa6\xd7\x1d\x47\x47\x5d\xcf\x01\x42\x1e\x38\x7a\x0f\x10\x56\x75\x32\xd2\x39\x64\x87\x43\x8f\xeb\x15\xad\x76\x8d\xbc\xe8\x3c\xf7\x64\xf7\x49\x67\x82\xa6\x7a\x48\x9b\xb2\x32\xad\x96\xf7\xc8\xe5\x1c\xab\x18\x6f\x94\x6c\x70\xe7\x03\x48\x60\x05\x88\xe1\x6d\xaf\x6f\x81\xf8\xa1\xe2\xe7\xda\x2d\x67\xb5\x1d\x4a\xf7\x41\xbb\xa9\xa9\xed\x00\xb9\xc8\xd2\x6f\xf6\x73\x25\xcb\xcf\x9e\x5f\xd6\x85\x62\x9e\x2b\x63\x87\x5a\x54\x8c\x87\xe5\xf0\xd0\xec\x2f\x92\x2b\xc8\xc8\x28\x0d\x90\x0a\x92\x7b\x43\x68\xdb\x53\x82\xd9\x61\xf9\x90\x53\xe4\x84\x3f\xaa\x35\xe1\xc3\x43\xe7\x20\x99\x00\x34\xaa\x55\x3b\x29\x74\x29\xc9\xd3\xd6\x22\xa3\xb4\x2b\xb1\x48\x9a\x67\x41\x92\x4a\xc6\xd7\x42\xa5\xf5\x99\xfe\xc4\x2f\x3f\xfb\x02\x82\xec\xab\x70\xe2\xa9\xe2\xcc\x87\x43\x7b\x78\x28\xfa\xbf\x55\x3b\x4f\xa6\xed\x9e\xef\x60\x2e\x5f\x36\x25\x3f\x41\x1d\x1d\x3e\x12\x55\xe4\xbc\x5f\x3e\x91\x63\x3d\xef\x8d\x3b\x01\x02\x9d\xf7\xd8\xc2\xb6\x73\x16\x9a\x9a\x4a\x9f\x50\x33\x10\xc5\xdc\x40\xfd\x4e\xff\x40\x37\x15\x92\xad\xd3\x7c\x6e\x64\xb8\x81\x51\xe0\xb3\xdc\xcc\x08\x2a\xc1\xdc\xc8\x7f\xcd\x0c\x72\x5d\xe4\x73\xe3\xba\x80\x0c\x05\x3c\x8a\x02\x3e\x6b\x0a\xfc\xae\x31\x48\x86\x4f\x06\x29\x1f\x6a\x78\x2a\x1f\x6a\xf8\x1c\x2b\x55\x25\xa8\x67\xac\x5e\x34\x65\xa5\x1f\x8b\xbc\x5e\xc9\xf2\xf2\xc7\x6c\x9d\xd5\xf5\xdc\xc8\x1f\xd1\x5a\x5c\xc8\x5f\xb7\x0f\x05\x96\x2b\x7f\x61\xc9\xa2\xc8\x9b\x5c\x7f\x84\x8f\xf8\xc9\x75\x2e\xd3\x11\xce\xa2\xbc\xcb\xe7\x46\x51\xde\x19\x5b\x22\x92\xa7\x3c\x15\x4d\x36\x37\xf2\x14\x21\x79\xcc\xe6\x06\x16\xf3\x6b\xa6\x8a\x49\x65\x31\x29\x3c\x42\xcf\xc0\xd3\xed\x43\x01\xd9\x64\xc5\xc6\x96\x34\x89\x71\x25\xb2\xbc\x7c\xf8\xbc\x30\x48\x96\x18\x57\x7f\xc3\x5f\x0b\x75\xff\xbc\xf8\xd6\x20\x52\x23\xd3\x1e\xcb\x7f\x33\xa7\x79\xac\x13\x5d\x88\xbc\x2f\xbe\xdd\x51\x0e\xa8\x6a\xbf\x47\x41\x2f\xaa\x2a\xfd\x5d\xaa\x32\xc7\x59\xac\x93\x6f\x0c\x8b\xac\x5f\x51\xb8\x01\x4a\xc9\x9b\xbf\x99\xf4\xe8\xc4\x32\xeb\x7a\x93\x5b\x59\xfd\xcd\x1b\x52\xb7\x69\x57\x7f\xab\x17\x16\x24\x2d\x75\x52\x96\xdd\x7c\xf3\x86\xdc\xb4\x39\xb2\x9b\x4d\xbe\xbe\xb3\xbe\x79\x43\xee\x93\x37\xf4\x9b\x37\xe4\x21\x79\x63\x8a\x66\x73\x5d\x6c\xf2\x5f\x21\xf9\x7c\x00\x8f\x06\xe7\x73\x51\xff\xba\xb0\x7e\xfe\x99\x01\xc8\x97\x43\x90\x8d\xa3\xec\xa8\x39\xd2\xa3\xfd\xf1\xd3\xe7\x05\x64\xba\x53\x55\xea\xf6\x58\x9f\xbf\x79\x43\x4e\x5b\x38\x14\xbd\x6d\xd4\x0d\x48\x6c\x03\xb4\xb5\x01\xa2\xda\x5c\x17\xf9\x06\x08\x69\x83\x34\xb4\xc9\x8a\x7c\x83\x94\xb3\x51\x34\xb3\xd1\xd7\xb2\xda\x20\x85\x6c\x14\x71\x6c\x14\x59\x6c\x14\x41\x6c\x90\x14\x36\x48\x05\x1b\x89\xff\x1b\xc0\x7c\x68\xe9\x59\x0b\x0c\x22\xff\x06\xf1\x7e\x83\x48\xbf\x41\x7c\xdf\x00\xaa\x43\x89\x1b\x28\x0a\x3e\xf9\xd0\xc1\x5f\x00\xb8\x19\x00\x9e\x6d\xb2\x6a\x93\xa7\x1b\x71\x5d\x64\x9b\x1c\x2e\x62\xdd\x6c\x32\xe0\x71\x1b\xbc\xc0\x5f\xf9\xb0\x01\x30\xa1\x1e\x28\xb9\x7c\xa8\x01\x64\x68\x2d\x94\xfb\xae\x1b\xd5\x4d\x63\x99\x79\xb9\x86\xd4\x8b\x76\x10\xbf\x79\x43\x1e\x93\x37\x45\xf1\xcd\x1b\x72\xfb\x82\xce\x3f\x1e\x3b\x2f\x6a\x25\x87\x5c\x93\xcf\xe4\x3d\x59\x91\x5f\xc8\x47\xd0\x81\xb4\x0e\xf7\x9d\xdb\x5a\x96\x50\x35\xfa\x6c\x24\x89\xf9\x39\x69\x70\xcb\x74\x53\x99\x0e\x61\x16\xce\x78\xc9\x67\xda\x94\xff\x71\x7f\xaf\x1d\x8c\x8e\xda\x2c\xcc\xb2\xc8\x2a\xa9\x89\xf9\x3e\x29\x2d\xda\x64\x75\x63\x36\xd6\x49\x93\x34\xed\xf6\x83\xf7\xc4\xf8\x86\x7d\xc3\x0d\x6b\xbe\xd2\xef\xa5\x0e\xdf\xe6\x58\xe9\x1c\x50\xd4\x0d\x14\xb5\x6c\x8b\x92\x2d\xf8\x94\xbc\xa7\xd9\xa7\x2c\x35\x1b\xeb\xd8\x7c\x9f\xe4\xea\xf5\xa7\x2b\xb6\x80\xc2\xde\x27\xf7\x64\x54\xa5\x61\x59\xdb\xac\xa8\xb3\x59\x7e\x6b\xae\xba\xc2\xb2\xc4\xfc\x94\xac\x74\x59\xd6\x15\x5b\x10\x73\x95\xac\x55\x79\x68\x4d\xfd\x25\x39\x27\x1f\x93\x4b\x48\x7f\xd0\x60\x24\x99\x75\xd2\x1c\x25\x46\x66\xcc\x7f\x69\x1b\xb9\xa7\xda\xf9\xc7\x7e\x33\xf1\x23\xcb\xda\x9a\xef\x93\x3b\x6b\xd0\x7e\x13\x61\x79\xdf\x87\xc5\x3a\x32\x72\x03\x5b\x78\xda\xcf\x3b\xcd\x48\xae\x93\x4f\x57\x7c\x41\x7a\x7d\x21\x2d\xc1\x49\x76\x54\x5c\x5d\x2f\x2c\x2c\xe4\xec\xeb\x0b\x11\xb2\x10\xe8\xbc\xe4\x1d\xe4\xf8\xd0\x8d\xc8\x8e\x92\xcc\xf7\x49\x35\x2a\xc2\x3a\x7e\x51\xf7\x1f\x49\x10\x56\xd3\xef\xa1\xcb\x2e\xbe\xd0\x82\x55\x92\x92\x5f\x92\x5b\x62\x0e\x00\xd8\x6c\x56\x5d\x59\x07\xbf\xe8\x67\x5d\x70\x4b\x27\xab\xa4\x02\xc8\x1f\x7b\x95\xf4\x51\x74\xf7\xf0\x12\xa4\x92\xcf\x2d\x55\xf4\xdc\xee\x86\x54\xd1\x6c\xb7\xa6\xf5\x9c\x43\x97\xd9\x0a\x26\xc4\x50\x0f\x86\x35\xf1\x75\xde\xe9\x36\x75\x78\x78\xe0\xe0\x5a\xe8\x30\x6f\xfb\xb3\xbe\x12\x8b\x13\xd1\xb3\x99\xa4\x45\x26\xaa\xf7\xfa\xed\xd0\x5f\x6e\x5f\x19\xca\xc9\x58\xdc\xdc\xec\xf8\xb0\xef\xc7\x87\x0b\x2e\x63\xd7\xcb\xc3\xc3\x7d\x3e\x3a\xcf\xc0\x9c\x1c\x38\x3d\x37\x1c\xe9\xe4\xf7\x4a\xa0\x8b\xd6\xbf\x4f\x27\x41\x51\xe3\xb4\xe4\xc9\x30\xe6\x07\x0e\x11\x78\x51\x3b\x5d\xc5\x75\xf9\xd0\xe0\x43\x5a\x95\x75\x8d\x4f\xb7\x4d\x56\xe1\x43\x51\xc8\xdb\xaa\xac\x65\x9e\xa2\x2e\xf1\xbe\x92\xd7\x72\x7d\x87\x0f\x6b\x79\xbd\x91\xb7\xcf\x78\xab\x64\xf1\xb2\x44\xfc\xfa\x3a\x93\x57\xf4\x07\x93\x8f\x19\x7e\x79\x2d\x21\xb8\xc6\x0f\x53\x59\x5a\x8a\x3e\x34\x32\x9a\xca\x43\x81\x25\xdf\x64\x02\xc1\xba\xc9\xe5\xcf\x52\x5e\x33\xac\x22\xcb\x9b\xa5\x84\x1a\x48\x10\xef\x8f\xea\xf7\x63\x56\x61\xc9\xb7\x25\xfe\xbe\xad\xca\x95\xde\x55\x0d\x37\x59\xcb\x52\xdc\xc8\x5b\x2d\x6f\x8f\x58\xc6\x52\x5d\x2b\x75\x93\x2f\xf3\x95\xbc\xc9\x5f\xe5\x47\x75\xd3\x15\xe6\x78\xb9\xc5\xeb\x5a\x5e\x1b\x84\x55\x7e\x90\x37\xf2\x8a\x3f\xfe\xfb\x41\xf6\x6c\x91\x09\xfd\x20\x6f\xf9\xdf\x33\x7d\x2f\x10\xfa\x95\x90\x37\x4c\x5e\xe5\x77\x4b\xcc\xa7\x47\x66\xa5\xca\x59\x61\xa6\x75\xd7\x1b\xeb\x52\x5e\xd5\x0f\xcc\x54\xde\xca\xab\xba\x35\x72\x14\x4a\x75\x95\xd5\xc9\x0f\x4a\x5d\x4c\xf9\x20\x6f\x1f\x31\x53\x25\x74\x7a\x2d\xe4\x60\xd4\x12\xba\x5a\x7c\xc6\x66\xd5\xb2\xe3\xea\xa5\x1e\xbb\x3a\x5f\xa7\x32\xa9\x94\x57\xd9\x8e\x66\x29\x47\xbb\x59\x4a\x14\x69\x96\x2a\x39\xcb\x2b\xf5\xb0\x52\x77\x95\x2f\xab\x74\x8e\x5a\x3f\x7c\x96\x77\xd9\xbb\x8d\xba\x95\xf2\x2a\x6f\x1f\xe5\xa8\x3e\xe0\xf5\xa3\x58\x37\xea\x41\xde\x64\xfc\x1e\x55\xf0\x47\x05\xc9\x47\x55\xe3\xc7\x65\xfb\x22\x4f\x97\xea\x41\x85\xfc\x59\x96\xea\xb6\x92\x77\x04\xe4\x63\x2e\xa9\xe6\x63\xde\xc8\xec\xba\x0b\x3e\xcb\x91\xfd\x5c\x3e\xa8\x1b\xb4\x70\x3b\xe1\x7d\xcf\x92\xf5\x17\x59\xeb\x60\xc7\x88\x31\xfc\x8d\x8c\x56\x6d\x2f\x19\x2f\x21\x2b\x85\x77\xea\xcb\x86\x0b\x42\x33\x39\x90\xe8\xf0\x79\x9d\xcd\xba\xa8\x03\xd6\xf1\x74\xe7\xe5\xdf\x7e\xfe\xcf\xa3\x37\x30\x6d\x74\x49\x3f\xff\xe7\xd1\x37\x98\xf4\xac\xb3\x6f\x6f\xf3\x8b\xa1\x1e\x10\xe4\x81\xb3\xc5\xc4\x1b\xaa\x2a\xcb\x26\x91\x8a\xf3\xd3\x96\xdc\xdc\xce\x1d\x65\xa6\x1c\x7b\x88\xbc\xc8\xae\x87\xa5\x15\x78\x93\x26\xba\x61\x39\x03\x63\x0a\x2e\xbe\x4c\x0c\x16\x0d\xae\x68\x6b\xc8\x3a\x9f\x9a\xc4\x39\xce\xbe\x6b\x0d\x86\x36\x3b\xd6\x76\xe7\xe2\x2a\x5b\x1c\xa3\x39\xbd\xd9\x6c\xcc\xe6\x2a\x5f\x8c\x9a\x63\x91\xec\x28\x61\x30\x2d\x5f\xe5\x72\x35\xac\x92\x3e\x38\xc7\x8d\x34\x0e\x55\x8b\x93\xf6\x29\x79\x6a\x6e\xe7\x82\x36\xb7\xdb\xb9\xb9\x23\x91\x34\xf4\xe6\xf6\x28\x61\xd6\x73\x6d\x5b\x8a\x7a\xdc\xb6\xe1\xaa\xc2\x01\x3b\xee\x9c\x04\xdb\xb6\x92\x26\x71\x8e\x9b\xef\x74\x13\x8f\x1b\xbd\xed\x4d\x5c\x15\x57\xcd\x62\xd1\x7d\x2c\x12\x95\xa4\x4c\xeb\x07\xce\x73\xe0\xdc\x65\xcd\x0f\xe5\x4d\xb6\x17\x1a\xb4\xd6\xfc\x06\x80\xe4\xf7\x63\x98\x66\xcf\x0e\xbf\x5a\x3b\xdb\xe7\x9a\xa9\x40\xee\xed\x82\x54\x3b\x37\x4e\x9e\xb6\x73\xd1\x5a\x09\x9f\x29\x7d\xb0\xee\xb5\x37\x84\xd3\xde\x8a\x9a\x13\x67\x2e\x4d\x55\x58\x99\xc6\x0f\xb1\xa0\xcd\xed\xfc\x4b\xbd\xad\x56\xd2\x5f\xdf\x38\x07\xda\x76\xfb\x5c\xe9\x3d\x77\x89\xe9\x66\xa4\x62\x5f\xd3\xda\xe5\xef\x5e\x93\x7a\x56\x52\xdd\x36\x44\x6e\x3b\x69\x3d\x52\x76\x83\xd0\x5b\x39\xdd\xb5\x74\xd6\xae\x24\x18\x06\x30\xc4\x76\x35\x5e\x24\x62\xb3\x91\x3b\x6e\x54\x17\x4b\xbf\xd6\x24\x31\x27\x00\x5b\xdd\xea\xdb\xc8\xa7\xee\xe6\xf6\xad\xd3\x7a\xb8\x16\x16\x69\x2c\x03\x80\x37\x0e\x92\x24\x3b\x3c\x34\x6e\x6e\xd5\x93\xf4\xca\xe8\xaf\xf1\x1e\x65\x00\x62\xdf\xbd\xed\x59\x04\xdd\x6b\x62\x04\xc2\x98\xb7\x24\x82\x3d\x35\x70\x19\x18\xf9\x24\x20\xec\xb2\xf1\x86\xd1\x6b\xbc\xde\x8b\xd4\x4c\xa7\x0c\xb9\x18\x35\x9a\x33\x20\xb7\xf6\x80\x96\xa1\xcb\x70\xb1\xba\xfa\xfc\xa4\x3c\x1a\xee\x45\x55\xb7\xde\x6a\xf4\xfa\x21\x2f\x6e\xfe\xa3\xce\x74\x08\xc6\x8c\x34\xd6\x36\x15\x4d\xba\x94\xf2\x74\xdf\x09\xf2\xa1\xce\xaa\x59\xda\x6f\xc3\x0c\x0b\x9b\xdd\x8a\xbc\xc8\x6e\xc8\x0c\xa6\xe4\xd9\x43\x9d\xcd\xd4\x74\x3a\xcc\x6c\xf4\xab\xfc\x93\xcc\xa1\x6a\x6d\xac\x69\xff\xf4\xdd\xcb\x27\x5f\x4c\xad\xfa\x28\xcf\xa3\x4e\xb4\xd7\x97\x48\x42\x83\x36\x74\x74\x16\x98\x33\x72\x5d\x96\xc5\xdc\xf8\xf1\xaf\x06\x91\x38\x30\x3f\x60\xdb\x9e\x92\xf0\x2c\x40\x5d\xaf\xed\x1a\xca\x04\x4b\xcd\x93\x03\xdc\x7b\x3c\x00\x11\x23\x3c\x18\x39\xaa\x5a\x66\x96\x08\x74\x6a\xd8\x6c\x32\x8b\x18\x12\x0a\xfd\x2e\x4f\x84\xc2\xcd\xcd\x26\xb7\x88\x1a\x70\x7c\xdb\xc6\xc5\xc1\x3d\xcd\xda\x73\xd4\x42\xfb\x8b\x76\x54\xaf\xac\xb7\x36\x93\xe0\xa4\xad\x73\xe9\x55\xb5\x20\xeb\x24\x57\xa4\x9e\xaa\xf2\x0f\x0f\xcd\x75\xfb\x43\x8d\x93\xea\xae\xaa\xed\xae\x54\xfa\x58\x6c\x36\x4e\x92\x24\xea\xc7\x89\xba\xeb\xbe\x4c\x75\x63\x74\x87\xae\xb7\xd2\x54\x32\x44\x25\x84\x65\xb6\x16\x2b\x24\xd7\x1d\x88\x85\x7e\xfd\x18\x9c\x2c\x5f\xcb\x4d\x2b\x6d\xe0\x8a\x99\xea\x06\x65\x04\xd0\x8b\x13\xa7\x45\x21\x5d\x6f\xf8\x00\x9d\x73\xb5\x4a\xb1\x6f\x28\xf7\x7c\x39\x15\x37\xf6\x3b\xb7\xa9\x8e\x6a\xc6\x78\x55\xe8\x3e\x10\x2f\xc1\xa9\x67\xdc\xe5\x65\x05\xcf\x7d\xbc\xdb\x43\xbf\xa5\xff\x2d\xee\x52\xa6\xef\x4b\xe0\x60\xef\x77\xe4\xd4\x2b\xb5\xca\x0f\xbd\x40\x4b\x63\x2d\x7d\xfb\x07\x5f\xbe\x5c\xc2\x6b\x0b\x29\xc8\x8e\x65\xdc\x49\xb9\xcf\xee\xdc\x29\x88\x64\xf0\x45\xe2\x1c\x17\xdf\x8d\xb7\x6b\x1e\x17\x47\x47\x56\x3f\xf4\x43\xb1\x20\xff\x4f\xb7\xce\x8f\xdb\x48\x94\xa8\xa8\x81\x6a\xf7\xd0\x62\xe3\xcb\x14\xfb\xf3\x7b\xdc\x61\x4f\x1c\x22\x14\xff\x54\x50\x0f\xbf\x94\x89\xcf\xc0\xdf\x94\x68\xa6\xd8\x37\x98\x1d\x08\xad\xd7\xda\xbe\x92\x56\xe2\xfe\x39\x9f\x77\x5d\xd0\x4a\xdc\x6b\x27\xf7\x7d\x25\x29\xdc\x7d\x49\x69\x1a\xcd\xbf\x50\xa2\xea\xda\x3d\x1b\x5a\x1c\xd2\xec\xec\x36\x92\x25\x8d\x2d\x48\x9e\x08\xe9\x37\x78\x5b\x94\x65\x65\x66\x6f\x78\xeb\x27\xa7\x3f\xb8\xca\x17\xc7\xd9\x5b\x90\xde\xf3\x5b\xb3\x4a\x3a\x11\x61\x96\x1f\x17\x6f\x2b\x0c\x6d\x96\x5b\xa4\x7a\x5b\xa0\xb5\x2c\xb7\x5e\x55\xb4\x96\x3d\xb1\xe0\x93\x7c\x6e\xb3\x67\x9a\xda\xc3\x8f\x7f\x7e\x73\x7f\x7b\xdb\x34\x09\x56\x6f\xa1\x65\xc5\xdb\xea\x24\x3f\x62\x9d\xb9\x6e\xff\x80\x36\x59\x55\x67\x69\xb3\xa7\x8d\xe8\xf5\x38\xf8\x18\xc4\x7e\x92\x25\x0e\x51\x0e\x6f\xaa\xcd\x55\x47\xe6\xe9\x10\x38\xb2\x4e\x8a\xf6\xc7\xf1\x81\xd9\xbc\xcd\x6d\xb6\xd9\x64\x6f\x2b\x9b\x59\xc7\x56\x7a\xd5\x2c\x0e\x92\x64\x7d\x95\x2d\x4e\xe0\xf9\x3b\x7c\x6a\x8e\x8e\xe6\xf0\xeb\x2d\xfc\x3a\x3c\xcc\x8e\x8e\xe6\xa6\xc0\xfd\x7f\x90\x6a\x91\xe6\xe8\x88\x64\x47\x47\x03\x69\x6d\x5f\x1b\xd3\xa2\x1c\x6e\xa2\x95\x2b\xb5\xd3\xa6\x75\xea\x76\xcb\xc6\xb0\x25\x8a\xb6\x51\xce\x68\x79\xda\x78\xd0\x8b\x67\x20\x78\x58\x0f\x44\xbf\x2e\x7a\x0e\xc9\xfa\x3c\xe7\x6d\xdb\x87\x27\xa6\xd4\x06\x48\x93\x14\x18\xe1\xa6\x50\xb8\x06\x48\x21\x64\x8b\x7a\xae\x1e\x79\xe2\x00\x4a\x74\x80\x1e\xe7\xdf\x55\x9a\x4f\xe6\x47\x47\x96\x0c\x7f\x51\x0d\x7d\xce\x9e\x63\x66\xcf\x6d\xc6\x6a\x6b\xd9\x92\x21\x67\xd9\x11\x91\x4c\x9a\x32\x0e\x0f\xe5\x9d\x8a\xd5\xcd\x89\x7c\x34\x85\x35\x9f\xec\xd6\x56\xe1\x41\x4e\x64\x50\xb6\x36\x5a\x88\x30\xad\x39\x74\xb8\xa8\x9b\x3c\xc5\xc8\x1b\xc2\xb4\x64\x68\x0c\xb2\x63\x3f\xf5\xd6\xda\x9a\xd6\xf1\xff\x1b\x00\x00\xff\xff\xda\x16\xda\xaf\x56\xa5\x0c\x00") - -func bindataTkgWebDistTkgkickstartuiScripts2cc3b57c8646210a196cJsBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiScripts2cc3b57c8646210a196cJs, - "tkg/web/dist/tkg-kickstart-ui/scripts.2cc3b57c8646210a196c.js", - ) -} - -func bindataTkgWebDistTkgkickstartuiScripts2cc3b57c8646210a196cJs() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiScripts2cc3b57c8646210a196cJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/scripts.2cc3b57c8646210a196c.js", - size: 828758, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiStylesA0a16718149e3f00ad10Css = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5a\x5f\xaf\xa3\xb8\x92\xff\x2a\xd9\xee\x1d\xa9\xcf\x55\x40\x40\x48\xc8\x1f\xf5\xd5\x95\xee\xf3\xbe\xef\x6a\x34\x0f\xc6\x2e\x12\x2b\xc6\x66\x8c\x39\x27\xa7\x51\xbe\xfb\xca\xe6\x3f\x98\x90\x9c\x91\x46\x57\x47\xad\x06\xbb\xea\xe7\xaa\x72\xb9\x5c\x55\x04\x33\xe9\x50\x2c\x78\x49\x68\x9e\x31\xf4\x79\xa4\x9c\x51\x0e\x4e\xcc\x04\xbe\x9e\x52\x24\xcf\x94\x1f\xbd\xd3\x05\xe8\xf9\xa2\x8e\xfe\x2e\xbb\x9d\x3e\x28\x51\x97\xea\xf1\x1d\xa4\xa2\x18\x31\x07\x31\x7a\xe6\xc7\x94\x12\xc2\xe0\x94\x50\xc6\x8e\xb8\x90\x12\xb8\xfa\xb7\x60\x42\xde\x9b\x55\x56\xae\x92\x88\xe7\x19\xd2\x53\x8e\xa6\x73\x72\x25\xc5\x15\xca\xea\x3f\x3b\x97\x4b\x73\xe7\x2c\x01\xf8\xba\x3f\x92\x17\x18\x43\x9e\x97\x66\xb5\xef\x01\xec\xb7\x9e\x37\x65\x99\x5d\xd1\x86\xb5\x28\x9e\x6d\x19\x82\xf8\x19\xe4\x00\x0e\xa4\x14\xc3\x11\x09\xa4\x16\x14\xbc\x20\xb0\x22\x3c\x27\xa9\x81\x7e\x8e\x54\x02\x59\x56\xc8\x22\xce\x07\x92\x9c\xf2\x73\x2d\x2f\x0e\xa2\xd8\x4e\xb0\x0c\x6e\xe1\x8d\x59\x31\x94\x92\xf2\x44\xd4\x4b\x79\x5e\x14\xc5\xfb\x09\xf9\x73\xda\x6a\x9c\x65\x89\x2c\x4b\x50\xfe\x0e\x32\x1f\x82\x7d\x5c\xa8\x82\x5a\xaa\x24\x49\x6c\xf4\xcf\x49\x65\x80\x96\xc5\x1a\xaf\x71\xa1\xe7\x0b\xd3\x27\x6e\xde\x32\x2d\xc9\xcb\x4a\xff\x4e\xa8\xfc\x59\x64\x7f\xac\xf2\xf7\x73\x2b\xec\xef\xf9\x05\x65\xf0\xdf\x3f\xbf\xad\x8a\xec\x9b\x99\x2a\x0d\x6c\x22\x64\x7a\x94\x42\x21\x05\x3f\x3c\x02\xe7\xb7\x21\x0c\x11\x1f\x7c\x0e\x48\xcf\xcd\x41\xf9\x7b\x0b\x98\xd4\xea\xcc\xa1\x99\xc9\x39\xb8\x83\x05\x8d\x41\x32\x0b\xa6\xe7\xe6\xb0\x82\x68\x04\x96\x30\x9a\xfd\xbc\x08\x49\x7f\x09\xae\x10\x1b\xb3\xe5\x18\x31\xf8\xe1\xf8\x6f\xab\x0a\xe0\x7f\xa7\xca\x19\x84\x26\x56\x2e\xf1\xff\xdf\x84\x7f\xe5\x9a\x27\x27\x46\xe4\x0c\xf6\x30\x32\x20\x79\xf9\xd4\xff\xf3\x1f\x65\x13\xe0\x3d\xef\xb7\x26\xc0\xeb\xc7\xe6\x56\xa8\xae\x83\x4c\x50\xae\x40\x3a\xf0\x0e\x5c\xe5\x47\x2e\x38\x74\x18\xad\x56\x54\x51\xc1\x8f\x94\x5f\x40\x52\x35\x91\x50\x14\xca\x5c\x30\x0e\x62\x20\x15\x90\x23\x17\xea\xc7\x70\xee\x6d\x3d\xcb\x64\xf4\x7b\x8e\x27\x17\x8c\x12\xfb\x68\xbb\xf8\xdc\x74\xb5\xcc\xba\xaf\xdb\x4a\x51\xc5\xa0\xbd\x26\x07\xba\xff\x8e\x19\xca\xf3\x7f\xfc\xbc\xa0\xbc\x42\xfe\x63\xe5\x62\xc4\xab\xe7\x39\xc5\xcb\x81\x6d\xbf\x84\x65\xb1\x43\x0b\xff\xb6\x2c\xaa\xd1\xb2\x86\xaf\x1d\xc7\x6a\xee\x27\x24\x5d\x82\xb2\x4a\x5a\xa1\xcf\x08\x6a\xae\x65\xbd\x1b\x2b\x57\x2f\x50\x3f\xf6\x76\x69\x46\xaa\x47\x7c\xf5\xca\xeb\x17\x68\x27\xbe\xb0\x28\x97\xd5\xb3\xcd\xcc\xdb\x2b\x20\x53\x4f\xaf\x30\x16\xac\xf5\x70\x53\x16\x16\x5b\xb2\xe8\x8b\xd8\xb3\xd6\xfe\x1a\xce\xfc\x4e\x7c\x45\xe7\x89\x61\x9f\x75\xc7\x87\xe7\x73\xc9\x25\x5e\xb1\xf0\x13\xe0\x4f\x59\xf8\x79\x9c\x69\x58\xfc\x4b\x5a\x5b\x4c\xfc\x38\x36\xb9\xed\x06\x3a\x5d\x46\x3e\xbd\xfa\xc6\x39\xf8\x02\xd7\xeb\x49\x7d\x0f\xb0\x4e\xb7\x17\xef\xdf\xc7\x3c\xaf\xa7\xe1\x3d\xb8\x2a\xb1\x9d\x4a\x30\xce\x09\x1f\xb1\xbc\x9e\x18\xb7\x1b\xdd\xe0\x98\x97\x99\x9a\xc0\x4e\xfc\x72\x7d\xb0\xd2\xee\x26\x92\xc4\xc9\xb1\x2e\xdd\xca\x4c\xd4\xb9\x44\x42\x6f\x40\xfe\x8b\xa6\x99\x90\x0a\x71\x75\x8a\x85\x24\x20\x8f\x5e\x6f\xa8\xc9\x5f\xb2\x5b\x6f\xb0\x4e\x64\x06\x63\x3a\xf5\x1b\x70\x2a\x91\x1d\x9d\x21\x8d\x78\x07\x99\x30\xf1\x71\xbc\x50\x42\x80\xf7\x66\x32\x44\x08\xe5\xe7\x01\x40\x53\x24\xaf\xbc\xd5\x10\xe7\xee\x72\xe1\x9c\x0b\xa5\x40\xe6\xa5\x85\xd3\xcc\x7f\x48\x94\x95\xa6\x4c\x70\xf2\x0c\x61\x7d\x53\xea\xa1\xbb\x7b\xa1\x04\xca\x14\xdd\x9c\x5a\x35\x6f\x2c\xd6\xe9\x9d\xe6\x34\xa6\x8c\xaa\xcf\x7a\xe4\xee\xd6\xe7\xca\xd1\xe7\x6a\x78\xc8\xdc\xaa\xb0\x1f\xd5\xf9\x77\x57\xaf\x60\xec\x54\x76\x69\xdf\xdd\x35\xf5\xbc\xa3\x6d\x55\x2a\xb8\xa9\xba\xbe\xd7\xef\xcd\x9c\xc9\xc7\xfb\x93\x66\xe0\xee\xa6\xca\x09\xbc\xb2\xb2\x89\xa3\x6d\x1b\x78\xd9\xcd\x0c\x6f\x06\xc3\x9b\x66\x38\x1c\x0c\x87\xd5\x70\xdc\x03\x89\x85\x52\x22\x6d\x70\x62\xc7\x1f\xcf\xf8\x66\x26\x63\xce\xb6\xb1\xb2\x91\xfc\xb8\x35\xc3\xb2\x37\x6c\x64\xac\xc6\x45\x92\xe4\xa0\xf4\x9a\x8e\xdf\x79\x9a\x04\x86\x14\x7d\x87\xd6\x2b\x06\x84\xc1\x1c\x61\x30\x22\x0c\xe7\x08\x43\x4d\x08\x37\xed\x00\x4e\xac\xf8\xda\xad\x9c\x41\x3f\x97\x09\x13\x48\x35\x66\x4c\x28\x03\x87\xf2\xac\x50\xc3\x6d\x8c\x05\xf9\x74\x09\x92\xd7\x95\x7b\x01\x44\x40\x96\x31\xc2\xd7\xb3\x14\x05\x27\x0e\x16\x4c\xc8\xe3\xf7\x70\xbf\x45\x3b\xd4\x23\x65\x28\x06\xe6\xaa\x0b\xa4\xe0\x68\x27\x92\xda\xb5\x6a\x62\x84\x63\x84\x37\x3d\xa7\xec\xd8\xe2\x42\x29\xc1\xcd\x91\x46\x18\x0b\x49\xa8\xe0\x4e\xb5\xaa\x53\xcd\x35\x20\xba\x7e\xed\x49\xa6\x39\x7a\x51\x30\x2f\x62\xed\x27\x2d\x71\xb4\x8b\x77\xe1\xdd\x55\x88\xff\x2a\x1c\x26\xce\xa2\xa7\xc3\xb1\x90\xec\x47\x37\xe3\x46\x3e\xf2\xc2\x08\xe2\x38\xd8\x06\x11\x3a\x40\xbc\x45\x81\x9b\xbf\x9f\xdf\x4e\x3d\xbd\x73\xfa\x0b\x8e\x58\x57\x67\x94\xf7\xc7\x25\x64\x80\xd4\x91\x8b\xfa\xa9\xbf\xe6\xda\x55\x18\xaa\xd5\xad\xad\x2f\x7b\x6b\xab\x76\xbc\xca\x8f\xba\x66\xd8\x46\x3f\xd6\xe7\x54\x3f\xdf\x3b\xf0\xb1\x6a\xf5\xb8\xbb\x89\x70\x18\xfb\x21\xda\x93\x3d\xf2\xfc\x68\x43\xbc\x60\xf7\x17\x14\x63\x88\x1b\x0f\xa7\x29\x3a\x8f\x0f\x79\xad\x91\x39\xab\x94\x13\xe0\xea\xe8\x1c\x0e\x87\x43\x76\x3b\xf5\xcf\x69\xaf\xb7\xa7\x4b\xbf\x7e\x45\x38\x52\xe2\x03\x18\x16\xa9\xf6\x4f\x25\x85\x7b\x08\x92\xd0\xdb\xfa\xd1\xc6\xf3\x77\xbb\x6d\x98\xec\xf6\xf8\x60\xd7\x44\x63\xad\x50\xa1\xc4\x43\x5d\xda\x6b\x45\x2b\x0e\x37\x55\x20\xe6\x5c\x80\x65\x25\x2e\x64\x2e\xe4\xb1\xae\x42\xef\x6e\xac\xb8\x83\x05\xe7\x80\xd5\x34\xe0\xe8\x49\x09\x89\x84\xfc\xd2\x38\x9e\xe7\x45\x01\xda\x9c\x86\x30\x27\x9b\xad\xee\x43\xa7\x1f\xc5\x1b\x6f\x34\xbd\x72\x4d\x6d\xb8\xd2\x83\x4a\x08\xa6\x68\xb6\x6a\x94\x58\x8f\x48\xcd\x51\xb4\x52\x96\x4d\x34\xcb\x6e\xa7\x49\xf4\x18\xaf\x78\x09\xfb\x1a\x4f\x04\xba\x84\xf6\x25\xa6\x51\xa9\xb7\x68\xe5\xd4\x26\x42\x4d\xd0\xfa\xe6\x7c\x02\x2e\xb0\x83\xe4\x19\xe5\x1c\xa4\x93\xa7\xa5\xd9\xa8\x29\x95\x8b\x91\x24\x4e\x22\x84\x02\x59\xd9\xaa\x4c\x04\x57\xce\x47\xe5\x8c\x3b\xcf\x3b\x99\x77\xe3\x4e\xee\x36\xf4\x77\xbb\x48\x42\x7a\x32\x5b\x57\x7b\xac\x1b\x6d\x25\xa4\x13\xe4\x2a\x81\xb1\xdd\x1c\x63\x11\x74\xc8\x02\x06\x58\x99\xcb\x39\x03\xb9\xaa\x5e\xcb\x94\x72\xa7\x3d\x21\xe6\xf4\xd4\x77\xe7\x31\xf4\x2a\x24\x24\xc9\x50\x07\x0d\x46\x90\x42\x8c\xe6\xca\xa9\x4f\x32\xc8\xe1\xe6\x69\x1a\x3d\x25\x05\xab\xc2\xa6\x2d\x6a\xe2\x28\xf0\x3d\x4f\x1f\xf4\x18\x98\x43\x68\x8e\x62\x06\xa4\x14\x19\xc2\x3a\x01\x70\xb7\xa1\xbe\xe2\xb3\x42\x59\xe6\xa2\xbb\xab\x63\x8e\xe3\xef\xca\x5e\xf3\xbe\xd7\xd3\x6f\xe7\xd7\xd5\x43\x10\x8e\xe3\xd6\x7b\xfa\x51\xc5\x2d\x2f\x4a\xc2\x03\x8a\xc2\x9d\x4f\x7c\x20\xde\xee\xe0\x45\xf1\x97\xe3\x96\xf5\xf0\xd9\x43\xef\xbd\x95\xac\x52\x21\x08\x3b\x15\x82\xb0\x55\x61\xe3\xd5\xf3\x3a\xbf\x68\x43\xb2\xd7\xa9\xe8\x79\xeb\x96\xf2\x3f\x54\x47\xdf\xf3\xca\xbe\x9b\x75\x91\x58\xab\xf1\x9e\x67\x17\x90\x60\x4e\xe0\x23\x75\x47\x74\xeb\xe1\x40\xb8\x9f\x68\x5f\x4d\xbb\xbb\x18\x45\x3b\xd8\xe0\xcd\x06\xa2\x00\xa1\x5d\x12\x1c\xe0\xef\x51\x7e\x2c\x60\x7d\xb4\xf6\x9d\x66\xfa\xf9\xee\xa2\x8f\xdc\x01\x1c\x2c\x5a\x60\x44\xb7\x1e\x0e\x4c\x2d\x50\x4f\xbb\x7e\x10\xfa\xf1\x66\x87\xf7\x70\x80\x43\x48\x70\x12\x6c\xfe\x26\x0b\x8c\x05\x9c\xb3\x40\x9a\x3b\xe8\x57\xf1\x84\x13\x8c\x09\xd7\xa3\x91\xa9\x11\x9a\x79\x77\xef\x87\x68\xbb\x89\x0f\x11\xd9\x27\x80\x82\x60\xbf\xf3\xfe\x26\x2b\x4c\x44\x9c\x33\x03\x11\xf8\x0a\x72\xd1\x08\x43\xb2\xf5\xe0\x7d\x6a\x80\x6a\xd6\xf5\xb6\xbb\xed\x06\x85\x61\x82\xa2\x28\x8a\x42\x40\x78\xf3\xf5\xfc\xec\x25\xf5\x47\xe2\xcd\x29\xff\x6f\x41\xe0\x7f\xa8\xbe\x2e\xaa\x2b\x32\x41\x29\x65\x9f\xc7\x54\x70\x61\x0a\xc9\xce\x06\xda\x20\x6d\x0a\xe4\x9d\x08\x95\x80\xcd\xb5\xcd\x94\xec\xe3\x38\x5a\xb6\xae\x52\x0d\xb3\xdb\xca\xeb\xcf\xaf\x32\x09\x63\xf2\xf5\xc2\xbc\xc3\xe8\x15\xba\xe2\x77\x15\x0e\x45\xaf\xcb\x63\xd3\x1d\x00\xd9\x07\x73\x72\x2c\x05\x63\x31\x6a\x26\x2d\x85\x8e\x2e\x3b\xa6\x60\x79\x59\xf5\x07\xea\x2c\xdd\xcf\x6e\xab\xaa\x39\xf5\x9d\x10\x72\xb2\xa0\x44\xfa\xef\x64\xab\xc1\x47\xca\xf0\x22\x8d\x41\xf6\xb4\xd9\x68\x13\xad\xb6\x3a\x15\x68\x53\x03\x9d\x7e\x9e\xc6\x75\x71\x63\xff\xc3\xe1\xb0\xb4\x50\xa5\x44\x8a\xe4\x15\x64\x97\xb9\x7a\xb3\x34\x26\x51\x60\x6d\x3d\x77\x38\x1c\x06\xa4\x55\xb6\xdb\x98\xc4\xd4\xc5\x3d\x8b\x68\x7f\x18\x58\x4b\x17\x99\x75\x15\x30\xdc\x7b\x42\xdf\x07\xbb\x03\x58\x70\x82\xe4\xe7\x43\xfc\x9c\xb2\x77\x9d\xa9\xe3\xd4\x49\x90\xaa\x65\x59\x59\xc4\xab\x56\xac\x4a\x83\x69\x73\xa7\x77\x42\xbf\x47\x10\x8d\xf1\x46\xa2\x55\xa3\x79\xf9\xcb\x14\x3b\xb7\xa3\xff\x68\x7d\xf3\x71\xe2\x58\xe5\x77\xd4\xa4\xeb\x0f\x49\xff\x99\x67\x88\xbf\x4a\x3f\x66\xea\x47\x9c\x5e\x8b\x6c\x59\x4c\x27\x15\xbf\x9c\x57\x65\xfd\x02\x93\x95\xf3\x39\xa9\x4b\x8c\x24\xa8\xfa\x68\xf5\xc9\xfe\x75\x85\xcf\x44\xa2\x14\xf2\x55\xcc\x28\xbf\x96\x5b\xef\xb7\xe9\x91\xee\x73\x18\x64\x85\xe2\x07\xd5\x2c\x01\x2c\x24\x1a\x7c\x6f\xec\x2b\x24\x0b\x66\x5a\x6f\x4d\x99\x82\xe2\x5c\xb0\x42\x41\xdd\x04\xac\x2b\x1e\xaf\x6a\xcd\x6c\xf5\xb9\x6d\x2a\xbc\x71\xaf\x6d\x0a\x3b\x77\xa2\x30\xc6\x06\xcf\xeb\xb0\x26\xeb\x1b\xcd\x72\x87\x40\x82\x0a\xa6\x56\xfa\xad\x6e\xe6\x54\x56\x88\x59\x61\xa3\xf9\xb3\x10\xaa\x3d\xe7\xde\xc1\x33\x24\x1c\xce\xa6\xf4\x6a\xc6\x49\x18\x9a\xf1\x6a\xd1\x6e\x3c\x38\x04\xf7\x6e\x21\xe3\x06\xb9\x92\x82\x9f\x07\x05\x56\xe4\x55\xa8\x90\x56\xc3\xb9\xfa\x64\x70\xa4\xba\x7e\xc1\x66\xc2\x6c\xdd\xd8\xf6\x05\x27\x20\xab\x76\x62\x05\x4b\xaf\xa0\x2e\x52\x14\xe7\xcb\x84\xd6\x6c\x61\x3d\x69\xd1\xf1\x0a\x9f\x1f\x42\x92\x46\xea\xc8\xdb\x5b\x88\x90\x12\x69\xab\x97\x7f\xb0\x50\xd4\x91\xba\xa6\xf1\x77\xa1\x85\x86\x40\xd2\xc5\xd7\xc4\x42\xf0\x8e\x24\xd5\x95\x94\x13\xb4\x74\x5b\x64\xa1\x53\x9f\x19\xac\x1f\xb0\x6f\x5a\xf6\xfd\xd6\xc2\x8e\x45\x9a\x02\x6f\x0b\x3d\xb4\xf5\x2c\x44\xda\xa8\xfc\xdc\xd2\xf8\xfe\x2c\x4d\x27\x6d\x62\x45\x4a\x41\x21\x8b\xb4\x7f\x16\x88\xd1\x84\x76\x46\xdb\x6e\x6d\xc2\xc6\x05\x65\x8a\xb6\x8d\xbf\x8d\x67\x33\x48\x2c\x11\xbe\x82\xea\xae\xa4\xc8\x66\x35\xd4\xaa\xe3\x47\x36\x41\x91\x52\x92\xc6\x45\xcf\xe5\x3d\x6c\x3b\x39\x72\x70\xf5\x4d\xe6\x8d\xc7\x8e\x10\x28\x7f\x47\x8c\x12\x7c\x41\xd2\x62\x0a\x53\x83\xd7\x2c\x12\xc8\xf0\x3a\x15\xa9\x3e\x59\xfc\xdc\x9c\xff\xae\xe3\x51\x45\x80\xfb\xf0\x36\x5a\xe9\x50\xda\x07\x48\x91\xc2\x17\xca\xcf\x23\x1b\x79\xb1\xb7\xc4\xc9\x05\x9f\x61\x46\x41\x70\xb7\xad\xa1\x4d\xdc\x8b\xda\xf2\x1c\xa3\x1f\xc1\x76\xbb\xf6\xb7\xde\xda\x5b\xbb\x9b\xb7\x01\x17\xc2\x3a\x5e\x54\x21\xb6\x65\xea\xf3\x7f\x87\x7d\x12\x0c\x53\x2e\x4b\x0b\x68\xfc\x95\xa2\x0f\x30\x4e\xd8\xaa\x1c\xaf\x6c\x59\xaa\xf7\xc9\xb7\x95\xc6\xc8\x55\x8c\x1e\xf4\x60\xab\xa1\xa6\xbf\x5f\xd3\x6d\x87\x55\xf3\x6f\xa7\xee\x57\x08\x1c\xa6\xcd\xb5\x53\x93\x29\x0c\x93\x2c\x9d\xdc\xdb\x14\x1c\xe4\x4b\x7a\xa9\x3a\xf4\x0f\x2e\xc5\xa7\x52\xdc\x4b\x9b\xe3\x3e\xcc\x7c\x07\x93\xef\xed\xac\xe5\x5e\x6b\x14\xd9\x9d\xfa\x1f\x0d\x06\xea\xdf\x67\xc0\xfa\x77\x61\x77\xfd\x39\xb7\x66\x1b\xdb\x91\xcf\x7a\x97\xee\x76\x4d\xca\xf6\xda\xab\x2f\xd9\x1e\xe3\x18\xea\x66\x83\x9a\xe4\xfd\x8d\x64\x5d\xf7\x75\xce\xb8\x65\xbd\xe4\x03\xca\x07\xd9\x40\xa5\xb9\x4e\xe4\xfb\xae\xd3\x98\x74\x63\x01\x1b\x7d\xb7\x93\x29\x62\x03\xb7\x7b\xa6\xea\x53\x22\xb3\x79\xb9\x4d\xc9\xba\x1b\xf9\x60\xdf\xc3\xfe\x69\xd3\xbb\x3d\xfd\x68\x3a\x1c\xb5\x2d\xd3\x3b\xfc\xd3\x95\x46\xa9\x4d\xbb\xb0\x0d\x08\x98\xb2\x20\xd4\xed\xf7\x3a\xe0\x3e\x46\x68\xfa\xaf\xf6\xe4\xd9\x92\x33\x3e\xc4\x98\xcd\x67\x17\x80\xaa\xb2\xb8\x96\x5b\xe7\x33\x03\x27\x19\xee\xd5\xd7\x6b\xe4\x26\xac\x20\x42\x8b\xfc\xd8\x96\x65\x75\x2d\x76\xb2\x67\xdf\xa7\x7e\xe9\x5f\xa7\xc0\xbd\x0e\x79\x33\xd2\xfe\x8e\xbb\xef\xb0\x99\x84\x93\xce\xb5\x8c\x85\x1a\xf7\xed\x37\xd2\x1b\xee\xca\x3a\xcd\x5b\xb3\x61\x81\x25\x90\xb6\x81\xdc\x7c\x9a\x66\x70\x72\x3e\x20\xbe\x52\xe5\x28\x94\x75\xbf\x58\x9d\x9a\xbb\xa5\x33\xa2\x9b\xc4\x89\x2b\x87\xd1\x33\x52\x85\x84\xfc\xd8\x7d\x09\xaa\x15\x06\x33\xe1\xe4\xa0\x14\xe5\xe7\xfc\xf8\x0d\x23\xa6\xbe\x9d\x16\xd9\x07\xfb\xaa\xf5\x5e\xda\xaf\x59\xa2\x6a\xd3\x3a\xfb\xc5\x12\xd0\xd5\xd1\xef\x63\x23\x9b\xf9\xca\xd2\x86\xa8\x36\xf5\xc4\xc5\x1e\x9e\x3b\x4b\xc5\x62\x39\x86\xde\x04\xf4\x83\x92\x33\x28\xcb\x2d\xd6\xdb\xc6\xba\x9d\xe1\x8e\x5c\xd9\x91\x8a\x69\xcd\xcb\xae\x61\x24\x15\x1b\x65\x43\x04\xca\xd9\xdb\xa5\x3a\x80\x6b\x4b\x10\x5e\xdb\x3b\x2b\x96\x5b\x70\x3d\xbd\x91\x63\x71\xd3\x4f\x5a\x64\xb3\xb1\x5c\x39\xb1\x18\x4a\x9e\x02\xca\x0b\x09\x16\x3b\x4e\x3f\x70\x3e\xf5\xbb\x8a\x69\xc7\x62\x0a\x6d\xfb\x75\xac\x45\x28\x63\xd2\x96\x3b\x57\x48\x51\x7c\x9f\x69\x61\x4c\x24\x79\x90\xbc\x0c\x2f\xa8\x44\xe0\x22\x07\x32\xd3\x1b\x59\x8f\x86\x89\x44\x67\xcb\x9a\xf5\x29\x1e\x5e\xcf\x26\x7e\xc2\x30\x31\x24\x07\xfd\x67\x15\x60\x99\x37\x22\x61\x32\x74\x5c\x2c\x45\x9e\x5f\x10\x95\x4d\xd0\x6d\x07\x26\xfe\x3d\xe8\xc5\x2c\x36\x6b\x5e\xed\xce\xd8\x84\xb3\xb7\x62\x9e\xeb\xbd\x7c\xa9\xd9\xd2\x0a\xa1\x0b\x15\x40\xd2\xa4\xf6\xd6\x6e\x28\x9a\x76\x37\xdb\x9c\x5f\xff\xf3\xd6\x6e\xf8\x56\x35\x6c\x84\xc4\xe0\x54\x57\xcc\xe8\xd7\x31\x26\x0c\xfc\x2b\x05\x42\xd1\x2a\x93\x94\xab\xf2\x41\x1b\x70\xd6\x51\xdb\xee\x8d\x89\x7e\xce\x05\xe1\xeb\x11\x25\xca\x94\x97\xe6\xcc\x1e\xbf\x7d\xbb\x8f\x2b\x9c\xc6\x3f\xcc\x77\xcf\x51\x26\x53\x57\x76\x31\x43\xf8\x1a\x0b\x24\x49\xbf\x0a\xe9\x5b\xcb\xc3\xbe\x17\xf8\x4d\xc3\x35\xd9\xeb\xbf\x09\xf3\xb4\x9d\x69\xf1\xcc\x60\xbb\x89\xa3\xdd\x94\x77\xa9\x7f\xf8\x90\xd8\xda\x41\x5c\xe6\x78\xe4\xa5\x66\x8f\x37\xd1\x7a\x7b\x58\xfb\xfe\x7e\xed\x1e\x0e\x6f\xcf\x08\x6d\x69\x0c\x3e\x23\xf9\x97\xd8\x16\x9d\xfc\x65\x1d\xda\x5e\xff\x74\xeb\x07\x05\x9a\xf7\x0c\xcc\xb0\xdb\x9e\xc4\x04\x02\xf2\x3c\x5f\xdd\x81\x5f\x36\xc5\xb0\x2b\xb5\xdf\x5b\xfc\xf2\xf9\xd6\x3d\x8a\xf4\x9f\x05\x61\xda\x45\x9b\x55\xa8\xee\xa5\x59\x24\x9f\xf4\xd0\xc8\x3e\x41\x1b\x6c\xc7\xe8\x75\xd2\xf6\x04\xed\xf0\xf4\xb0\x0e\x1a\x62\xdd\xaf\xc6\x76\xa1\x67\xdb\x1f\x9c\x3a\x22\x03\x89\x94\x58\xde\x13\x4b\x03\x0d\xf4\x9f\x9d\xb4\x6a\x91\xd9\xf5\x1d\xb7\xcf\x76\x3e\x86\x39\x8d\x53\x50\xe8\x19\xcb\xb4\x3d\x2c\xfb\x92\x75\x37\xcd\x3e\xd9\x6b\x90\x3d\xb2\xea\xa0\x73\xfc\xd0\xa6\x5d\xa7\xec\x91\x89\xfa\xfd\xb2\x47\xeb\xc2\x24\xf2\x1e\x88\x0f\xfe\x76\x29\xf2\xbe\xd6\x72\xda\xe0\xcd\x6e\xb3\x10\x83\xc7\x5d\xb1\x26\x21\xed\x0e\xcb\x59\xc2\xe7\xa9\xfb\x68\xd8\xab\x7f\xff\x3f\x00\x00\xff\xff\xea\xe2\x5f\xd1\x00\x3b\x00\x00") - -func bindataTkgWebDistTkgkickstartuiStylesA0a16718149e3f00ad10CssBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiStylesA0a16718149e3f00ad10Css, - "tkg/web/dist/tkg-kickstart-ui/styles.a0a16718149e3f00ad10.css", - ) -} - -func bindataTkgWebDistTkgkickstartuiStylesA0a16718149e3f00ad10Css() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiStylesA0a16718149e3f00ad10CssBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/styles.a0a16718149e3f00ad10.css", - size: 15104, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiTanzulogo71a047ebb2527a9eb5a2Svg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x94\xd1\x6e\x1b\x37\x13\x85\xaf\x57\x4f\x31\x3f\xff\xab\x02\xe4\x88\x33\x24\x97\xa4\xa2\x55\x60\x27\x41\x1a\x40\x01\x0a\x14\xc8\x6d\x21\x4b\x1b\x59\x08\xb3\x2b\x68\xd7\x96\x9c\xa2\xef\x5e\x90\x52\x6d\xa3\x35\x5a\x5f\x68\x77\x75\x34\xfa\xe6\xcc\x19\x51\xf3\xb7\xa7\xef\x09\xee\xdb\xc3\xb0\xeb\xbb\x46\x10\x6a\x01\x6d\xb7\xee\x37\xbb\x6e\xdb\x88\xbb\xf1\xab\x0a\xe2\xed\x62\x32\xff\x9f\x52\xf0\xb1\xed\xda\xc3\x6a\xec\x0f\x33\xb8\xda\xf4\x37\x2d\x7c\x4a\xe9\x6e\x18\x8b\x04\xcc\x48\xa8\x25\xfc\xfa\xe5\x23\x7c\x38\xed\xfb\xc3\x08\xbf\xa4\xbb\xad\xfa\xd4\x01\x16\xf1\xcb\xb9\xc7\x0c\x6a\xd4\x1a\xae\xef\x76\x69\x03\xfa\x27\x00\xa5\x16\x93\xf9\x70\xbf\x7d\x6e\x82\x04\x9c\xbe\xa7\x6e\x68\xc4\xed\x38\xee\x67\xd3\xe9\xf1\x78\xc4\xa3\xc1\xfe\xb0\x9d\xb2\xd6\x7a\x3a\xdc\x6f\x2f\x25\xb3\x53\xda\x75\xdf\x5e\x2a\xa4\x18\xe3\xb4\x7c\x2a\xe0\xd4\x08\xbd\x3f\x09\x78\x38\xdf\x27\x15\xdc\xef\xda\xe3\x75\x9f\x75\xd0\x60\x75\x79\x09\x18\xc6\x87\xd4\x36\xa2\xed\x56\x37\xa9\x55\x37\xab\xf5\xb7\xed\xa1\xbf\xeb\x36\xb3\xae\x3d\xc2\xb3\xca\x37\xa5\xfb\x6c\xd8\xaf\xd6\x6d\x23\xf6\x87\x76\x68\x0f\xf7\xad\xc8\x93\x64\x02\x8c\x0f\xfb\xb6\x11\x63\x7b\x1a\xa7\xeb\x61\x10\x8b\x49\x85\xc3\xa8\x7f\xff\xba\x4b\x69\xf6\x7f\xad\x23\xbd\xbf\x7a\xf3\x47\x11\xe9\x51\x7c\x47\xef\xdd\x45\xe4\x8b\xe8\xc3\xf5\x07\xd6\x17\xd1\x5c\x44\xba\xb2\x1c\xf2\xd7\xe7\xd3\xd2\x6c\x31\x99\x6f\x61\xb7\x69\xc4\x72\xf5\xd0\x1e\x7e\xe3\xec\x62\xba\xfd\x9b\x4a\xd9\xc3\x7c\xbb\x98\x54\xd5\x7c\xbf\x1a\x6f\x61\x9d\x56\xc3\xd0\x88\x61\xd4\x02\x36\x8d\xf8\xcc\x2e\xa2\x91\xc6\x11\xda\x9f\xc9\x44\x8c\x6b\x65\xd1\x4b\xad\x22\xb2\x62\x24\x45\xf9\xe2\x30\x24\xe5\x1d\x3a\x15\x2d\xfa\xb5\x32\xca\xa0\x57\x16\x49\x05\x0c\x8a\x31\x2a\x32\x68\x13\xe7\x77\x44\xf5\xa4\xaa\xaa\x35\x21\x29\x8b\x56\x5a\x15\x90\x64\xc8\x28\x8d\xb4\xa4\x68\xa4\xf3\x18\xd7\x16\x8d\x62\x64\x19\xd1\x95\x3b\x19\x0c\x52\x27\xd2\x41\x3a\x83\x6e\x6d\x91\x24\x23\x49\x8f\x24\x1d\x06\x19\x72\x8d\x46\x93\xd8\xa3\x95\x44\x0e\x63\xee\x21\x8b\xdd\x42\x31\x99\x61\x72\xf3\xa4\x7c\x9d\xd1\x16\xfd\x3b\xae\x03\x5a\x69\x6c\x9e\x93\x6b\x7b\x9e\x55\x3e\x9b\xfb\x07\x7c\x26\xab\x91\xa5\x31\x0e\xed\x2d\x51\xc0\x98\xbc\xc3\x98\x87\xb5\x49\xb1\x47\xa3\x72\x3f\xbb\x64\xad\xa5\x67\x34\xcb\x68\xd0\x4b\x62\x87\xf5\xb2\x76\x92\x2d\x21\xe5\xbe\xcb\x67\xa0\x1f\x62\x5a\x62\x2f\xe1\x57\xf3\x7d\x9f\x1e\xb6\x7d\xf7\xb4\x00\x12\xb0\xef\x77\xdd\x38\x34\xc2\x18\x2f\xa3\x46\x02\xe3\x34\x3a\xe9\x03\x46\x60\x9d\x47\x36\xe5\xce\x35\x32\x54\x55\x75\x26\xbe\xc0\xe2\x27\x16\x5b\x64\xc9\xce\x61\x84\x1a\x43\x99\x33\x00\xe9\x3a\x4f\x1b\x2c\xd6\x40\x94\x93\x35\x75\x40\xff\xaf\xcc\x67\xfe\x28\x72\xf6\x60\x20\x3f\x04\xb4\xe0\x08\xcd\xd9\x66\x9d\x57\x1c\xf5\x7f\xf8\x33\x4f\x2c\x67\x31\x4a\xd2\x06\x19\x6c\xa6\x44\x42\x07\x26\x6f\xc4\x5a\x64\x60\x9d\x4d\x5b\x8d\xe6\xb5\x40\xe3\xcb\x66\xad\x46\x0b\x26\xd6\x58\x5f\x48\xa6\xd6\xd9\x5a\xc1\xdb\x3a\xaf\x4b\x33\x86\xd7\xc6\x68\xbc\xcb\xa4\x92\x23\x07\x8b\xa1\x24\x16\x81\x23\x63\x5d\x92\x0c\x60\xa2\xc9\xbf\xd1\x92\xf0\x6b\x93\xe4\x80\x4e\x66\xb8\x07\x62\x8d\x5e\x9a\x48\xe8\x81\x7d\x3e\x24\x7f\x3d\xeb\xbc\xac\x52\xf3\x88\x2d\x47\xfb\x7c\xfd\xe7\x29\xb7\x2f\x9e\x7d\xf3\xa8\xe6\xff\xcd\xc5\xe4\xcf\x00\x00\x00\xff\xff\x7c\x22\xe6\xa5\xf4\x05\x00\x00") - -func bindataTkgWebDistTkgkickstartuiTanzulogo71a047ebb2527a9eb5a2SvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiTanzulogo71a047ebb2527a9eb5a2Svg, - "tkg/web/dist/tkg-kickstart-ui/tanzu-logo.71a047ebb2527a9eb5a2.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiTanzulogo71a047ebb2527a9eb5a2Svg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiTanzulogo71a047ebb2527a9eb5a2SvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/tanzu-logo.71a047ebb2527a9eb5a2.svg", - size: 1524, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiTcelogo37c4b14a8d8a0173d026Svg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x7c\x54\x5b\x6f\xdb\x36\x14\x7e\xb6\x7e\x05\xc7\x3d\x0d\x20\x8f\x78\x78\x11\x49\xc7\x72\xd1\xb8\x45\x57\xc0\x03\x06\x14\xe8\xeb\xe0\xc8\xaa\x6b\x94\x95\x0d\x51\xbe\xa4\x43\xff\xfb\x40\xca\x4e\x8c\x35\xc8\x0b\x49\x7d\xe7\x7c\x17\x9e\x30\x9e\xbd\x39\x7f\x0f\xe4\xd8\xf6\x71\xbb\xeb\x6a\x8a\x20\x28\x69\xbb\x66\xb7\xde\x76\x9b\x9a\x1e\x86\x2f\xdc\xd1\x37\xf3\x62\xf6\x1b\xe7\xe4\x43\xdb\xb5\xfd\x6a\xd8\xf5\x53\xf2\x76\xbd\x7b\x68\xc9\xc7\x10\x0e\x71\xc8\x10\x91\x06\x24\x08\x46\x3e\x7d\xfe\x40\xde\x9f\xf7\xbb\x7e\x20\x7f\x87\xc3\x86\x7f\xec\x08\x64\xf0\xf3\xe8\x31\x25\x15\x08\x41\xee\x0f\xdb\xb0\x26\xe2\x0f\x42\x38\x9f\x17\xb3\x78\xdc\xdc\x86\x40\x4a\xb6\xeb\x9a\x2e\x57\x8f\x6d\xff\x0f\x52\x72\xfe\x1e\xba\x58\xd3\xaf\xc3\xb0\x9f\x96\xe5\xe9\x74\x82\x93\x82\x5d\xbf\x29\xa5\x10\xa2\x8c\xc7\xcd\xa5\x65\x7a\x0e\xdb\xee\xdb\x4b\x8d\xe8\xbd\x2f\x73\x95\x92\x73\x4d\xc5\xfe\x4c\xc9\xe3\xb8\x17\x13\x72\xdc\xb6\xa7\xfb\x5d\xc2\x89\x20\x52\x3a\xa8\xc6\x95\x92\x38\x3c\x86\xb6\xa6\x6d\xb7\x7a\x08\x2d\x7f\x58\x35\xdf\x36\xfd\xee\xd0\xad\xa7\x5d\x7b\x22\xff\xeb\xbe\xcb\x29\xa6\x71\xbf\x6a\xda\x9a\xee\xfb\x36\xb6\xfd\xb1\xa5\xe9\x7a\x49\x85\x0c\x8f\xfb\xb6\xa6\x43\x7b\x1e\xca\x26\x46\x3a\x2f\x26\x10\x07\xf1\xef\x97\x6d\x08\xd3\xdf\xad\xbb\x7f\x2f\xc5\xdd\xcf\x0c\xe2\x05\xc4\xfb\x05\xbe\x33\x17\x50\x5e\xc1\x77\x5a\xba\xb7\x17\x50\x5d\xe9\x68\x85\xd5\x77\x3f\x8b\x59\x99\xcd\xe6\xc5\x6c\x73\x33\x43\x95\x52\x94\x9b\x84\xce\x8b\xc9\x6c\xbf\x1a\xbe\x92\x26\xac\x62\xac\x69\x1c\x04\x25\xeb\x9a\xfe\x85\x46\x83\x64\xe8\x3c\xc8\xc0\xd1\x81\xe5\xda\x81\x6d\xb8\x04\xc5\x2b\x90\x4c\x82\xe7\x28\xc1\x33\x0f\x86\x23\x82\x0f\x06\xc1\x31\x0b\xd5\xf2\x86\xfa\x83\x96\xbf\x3a\xe0\xc5\xc1\x3a\xd0\xcc\xb8\x64\xa0\x93\x92\x74\xa0\x1b\x6e\xa0\x62\x0a\x2c\x47\x05\xc8\x44\xda\x2a\x5e\x25\x55\x74\xb9\x63\xf9\xcc\x7b\x51\xfd\x92\xdf\x2b\x86\x5a\x80\x59\x5a\x0d\x2a\x85\xc9\x26\xc8\x8d\x4a\x41\x35\xb7\xa0\x17\x5e\x00\x32\x94\x16\x2a\xe6\x0d\x68\x86\x2a\x05\xbf\x32\x5f\x54\x97\xa3\xba\xf5\xe9\x86\xa8\x40\x87\x34\x17\xc5\xd0\x04\x34\xe0\x78\xa5\xc0\x07\x55\x31\xa5\x01\x17\x2e\x29\xa3\x50\x20\x99\x4b\xd7\x42\x44\xd0\xec\x99\xfb\x9a\x03\xfa\x74\x4b\x94\x0e\x5c\xb6\xf0\x1c\x4d\xc3\x2b\xd0\x1c\xc1\x73\x97\x76\x01\xc8\x15\x28\x8e\x1a\x5c\x50\x16\x24\x57\x1a\xcc\xf2\x86\xf9\xea\xf8\x51\x80\x66\x32\xcd\x05\x0c\x33\x02\x4c\xc3\x05\x54\xac\x82\x8a\xbb\x94\x50\x24\x69\x95\x11\xbd\x4c\x33\xcb\x33\x5f\x5e\x79\xaf\x69\xbb\xd4\x8d\x5e\x82\x0a\xd2\x80\xe2\x5a\x37\x29\xa8\x01\xc7\xd2\x53\x19\x0f\x06\x24\x13\xa9\x8e\x4c\xeb\x3f\x13\xe5\x45\x49\x75\x8d\x9b\xfe\x8e\x62\x61\x30\xd1\x98\x60\x97\x43\xc6\x63\xfe\x18\x5b\x6e\xd6\x98\x57\xfe\x5c\xe4\x79\xfd\x84\xd6\x82\xbe\x72\x99\xf8\x41\xb2\xba\x65\x12\x15\xd8\x62\x32\x69\xb8\x31\xf9\xf1\xf9\xf4\xb8\xb5\x86\x6a\x3c\x79\x0f\xb6\x11\xdc\x68\xf0\xec\x09\x65\xd7\x92\x89\xf9\x33\x15\xd8\x53\x61\x21\x51\xa7\x59\x54\x3e\x3d\xb5\xca\x83\x1b\x5d\xd8\x8d\x63\xbe\xf6\xf8\xff\x98\x7e\xbd\xe6\xc5\x7f\x01\x00\x00\xff\xff\x14\x9f\x78\x2d\x87\x05\x00\x00") - -func bindataTkgWebDistTkgkickstartuiTcelogo37c4b14a8d8a0173d026SvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiTcelogo37c4b14a8d8a0173d026Svg, - "tkg/web/dist/tkg-kickstart-ui/tce-logo.37c4b14a8d8a0173d026.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiTcelogo37c4b14a8d8a0173d026Svg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiTcelogo37c4b14a8d8a0173d026SvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/tce-logo.37c4b14a8d8a0173d026.svg", - size: 1415, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiVmwlogo07f49a7461d1ed06907bSvg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x54\xc1\x8e\xe2\x38\x10\xbd\xef\x57\x58\xde\xab\x5d\xb8\x5c\x76\x6c\xb7\x08\x12\x7b\xee\xbe\xec\x4a\x2b\xcd\xdc\x32\x10\x20\x9a\x34\x41\x24\x13\xe8\xbf\x1f\x95\x13\xa0\x85\x66\x4e\x03\xd2\x4b\x39\xaf\xfc\xa8\x3c\xbf\xb0\xec\xc7\xbd\x18\xeb\x73\xdf\x74\xc7\x52\x22\xa0\x14\x63\x53\x5f\xfe\xe9\xae\xa5\x34\xc2\x08\x2a\x04\x15\x52\x9c\xce\x75\x5f\x9f\xc7\x7a\xdd\x9f\xea\xcd\xf0\x6f\x35\x34\x5d\x29\xaf\x6f\xcd\xf6\xcb\x5b\xb3\x15\xef\x75\x3d\x48\x71\x7d\x6f\x8f\x7d\x29\x0f\xc3\x70\x7a\x59\x2c\x2e\x97\x0b\x5c\x08\xba\xf3\x7e\x61\x8d\x31\x8b\x7e\xdc\xcf\x2d\x2f\xd7\xb6\x39\x7e\xff\x55\x23\xa6\x94\x16\x99\x95\x62\xd7\x6d\x7e\xf4\xd5\xb7\xb6\x2e\xe5\xae\x6a\xfb\x5a\x8a\x73\xc7\x8b\xe6\x7d\x2f\x57\xcb\x73\xbd\x19\xc4\xa5\xd9\x0e\x87\x52\xf2\x7c\x87\xba\xd9\x1f\x86\xa9\x3e\x5f\x4b\x49\x52\xec\x9a\xb6\x2d\xe5\xdf\xbb\xfc\x91\xa2\x3b\x55\x9b\x66\xf8\x28\xa5\x01\xf4\x52\xf4\xc3\x47\x56\xeb\xbb\x96\x1f\xe6\xf8\x32\x55\xb5\x5c\x2d\x17\x2c\xbe\x5a\x9e\xaa\xe1\x20\xb6\xa5\x7c\x23\x08\x49\xa1\x83\x48\x15\x82\x49\x2a\x83\xe1\xaf\x46\x70\x41\x83\x2f\xd4\x33\x01\xde\x29\x04\x97\x5a\x0b\x2e\x28\x0f\x6e\x03\x94\x20\x7a\x88\x0a\xc1\x72\xab\x0f\xb9\xfa\x2f\x28\x6b\x55\x00\x4a\xca\x22\x60\xd1\x5a\xc0\xa0\x1d\x84\x50\x01\x11\x10\x65\x41\x54\x40\xa8\xc1\x02\x79\x20\x7f\xbf\xc5\x8b\xd1\x41\x81\x15\x02\x7a\x95\xc1\x4c\x2c\x20\x0f\x40\x5c\x84\x09\xee\x44\xd0\x08\xf4\x3f\x06\xa0\xf8\xb4\x0f\x79\x24\xab\x11\x2c\xdf\xa3\x09\x6e\x04\xe6\xd1\x47\xe2\xd1\x3e\xab\xa2\x32\xca\x02\x59\x65\xfe\x58\x93\x7d\xc4\xe2\xa1\x89\xac\x59\x40\x2c\x2a\x0b\x45\x52\x19\x26\x7f\x2d\x84\xa8\xf3\x9a\xd8\xc9\x0c\x37\xc6\xf1\x68\xc6\x2b\x0b\x61\x86\x1b\x43\x51\x33\xb3\x26\x48\xa4\x32\xcc\xa6\x58\x85\x1e\xac\xad\x2c\x44\xab\x32\xdc\xb6\x98\x79\x8b\x05\xcf\x62\xfe\x66\x70\x00\xc7\x7b\x62\x7a\xf5\xdc\x8e\x09\x0a\x6a\xb5\xd5\x0e\xe2\x73\xf4\x56\xcb\x05\x67\xe9\x73\xa2\x88\xf3\x84\x71\x3d\x1f\x13\xba\x59\x95\x10\x92\x42\xdf\x6a\x04\xe4\x47\x0b\xf4\x6a\x13\x78\xfe\x25\xe3\xab\xd9\x2f\x8c\xf7\xf4\xa1\xd7\x10\xc3\x41\x03\x27\x80\x0d\xb6\x9f\x28\x88\xe1\x21\x84\x5c\x45\xcd\xd5\x73\x58\x98\x41\xd6\x61\xdb\xe2\x04\x77\x82\x45\x0d\x33\x45\x9c\x60\x1a\x14\x10\xbc\x6b\xad\xf2\xc0\x07\x67\x73\x96\x1f\x11\xe3\x35\x5f\xdc\x04\xf7\xdb\x1a\x12\xb5\x7c\x25\x28\x32\xa7\xb8\x60\x01\x9e\xc7\x3e\xc2\x6b\x0b\x48\xb4\x7e\x16\x26\xcb\xef\x88\x7f\xa5\x6c\x7d\xe0\xd7\x31\x70\x43\xb8\x35\xf0\x69\x81\x63\x5b\xf3\xc8\xe6\xbe\x71\xf6\xfb\xeb\x6f\x8f\x86\xff\x9e\x56\x7f\xfd\x0c\x00\x00\xff\xff\x5f\x89\x07\x43\x0d\x05\x00\x00") - -func bindataTkgWebDistTkgkickstartuiVmwlogo07f49a7461d1ed06907bSvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiVmwlogo07f49a7461d1ed06907bSvg, - "tkg/web/dist/tkg-kickstart-ui/vmw-logo.07f49a7461d1ed06907b.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiVmwlogo07f49a7461d1ed06907bSvg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiVmwlogo07f49a7461d1ed06907bSvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/vmw-logo.07f49a7461d1ed06907b.svg", - size: 1293, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiVsphere6ba76e3c33e72aa6f29eSvg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x58\xc7\x8e\xeb\xc8\x92\xdd\xf7\x57\x5c\xd4\xdb\xbc\x01\x07\x8f\x4e\x74\x3d\x7d\x1b\x48\x5a\x89\xa2\x13\x45\xbf\xa3\x27\x25\x7a\x4f\x7e\xfd\x40\xaa\xba\x66\x80\xe9\xaa\x45\x48\x62\x66\x46\xe4\x89\x13\x27\x02\xfc\x6b\x5c\xf2\x6f\x6b\x99\x4c\xc5\xf7\x0f\x02\xfb\xf8\x56\xa4\x65\x5e\x4c\x9f\x9f\x97\x32\x5d\xd9\x76\xfb\xfe\x81\x7c\x43\xbe\x11\xd8\xb7\xd7\x6f\x59\x59\x55\xdf\x3f\x9a\xb6\x49\x3f\xbe\x6d\x75\xd5\x8c\xdf\x3f\x8a\x69\xea\xfe\x84\xe1\x75\x5d\xff\xb3\xe2\xff\x69\x87\x1c\xc6\x10\x04\x81\xc7\x25\xff\x5a\xf2\xe7\x56\x95\xcd\xf3\xff\x5b\x88\x32\x0c\x03\xbf\x9f\x7e\xfc\xfd\xc7\x5f\x43\x1a\x4f\xff\x14\xcb\xa7\xdf\x79\xa8\xfe\xfd\xaf\x2e\x9c\xa6\x74\x68\x90\xff\xfa\x80\xff\xfe\xe3\xaf\x24\xcd\xc6\xbf\xff\xf8\xeb\xeb\xc7\x6f\x65\xf2\xfd\xe3\xc7\x82\x8f\x6f\x5f\x9f\xb8\xb6\x99\xd2\x66\xb2\x9b\x72\x1a\xbf\x7f\xb4\xd1\x23\x8d\x27\xb6\x9d\x9b\xa4\x6c\x72\xb6\xdd\x3e\x7e\x38\x45\x7f\xf9\x44\x5f\x01\xcd\x63\xfa\xed\x1d\xdd\x9f\xc5\x90\x66\xdf\x3f\xfe\x55\xd6\x61\x9e\x22\x1f\xdf\xa6\x21\x6c\xc6\xac\x1d\xea\xef\x1f\x63\x1c\x56\xe9\xbf\x91\xff\x20\x08\xfe\xfe\xfb\x8c\x0a\xfe\xf2\xfc\xf7\x1f\x7f\xbd\xf7\xbc\xe3\xfa\xb1\xfb\xcb\x1b\x8e\x20\xbf\xfc\xbd\xbf\xfc\xee\x2b\x09\xa7\xf0\xcf\xf7\x0e\xb8\x6b\xf2\xff\x89\xc2\x31\x25\x4f\xff\x5d\x3a\xac\x6e\xae\xc8\x55\xca\x5b\x00\x00\xd0\xee\x76\x21\xd8\x39\x00\xe0\xbe\x02\x00\x84\x91\x03\x3e\x00\x80\x25\x32\x9f\x40\x01\x00\xfa\x49\xa8\x84\x9b\x63\x9e\xb0\x19\x4f\x3c\x7f\x8b\x09\xf4\x79\xa6\xf9\x54\x96\x6f\xe9\x95\x08\x29\xbc\x51\x74\xfd\x76\x10\xa1\x19\x9a\xbd\xb0\x6f\xd7\x13\x72\x01\x7b\xe8\xee\xcf\x8b\x00\xd4\x16\xeb\x39\x29\xd3\x6b\xcb\xde\xc1\x7c\x53\x9e\x32\x7f\xb2\x39\xe7\x40\x50\xf3\xf6\xbc\x8d\x76\x3a\x89\x97\xdb\xed\x29\xf8\xb6\xd2\x63\x99\xbe\xdd\xef\xa8\x5f\x9a\xe5\xf5\x01\xac\xc9\x71\x2e\xa2\x7c\x67\x6d\xa1\xf6\x3c\xab\x11\x20\x5a\xba\x36\x3b\x3e\xc6\x1c\xe2\xf6\x77\x4b\x1e\x28\x9a\x0c\xea\x84\xc9\xd2\xc1\xba\x9a\x5e\xe4\x52\xb0\x4e\x2f\x78\xd3\x1c\x5a\x13\x08\x82\xf9\x0f\xff\xb7\x5a\xb9\xa4\x7d\x6d\xcd\xd7\x22\xa9\xa9\x4a\xef\xc6\x73\x00\x11\x08\x42\x26\x6d\x61\x2a\x13\x4a\x65\x06\x45\x3d\xba\xe6\x74\x40\x84\x26\x36\x16\x69\x3b\xd0\x13\xde\xae\xcc\x70\x6f\xd1\xc8\x0b\x86\xa4\x60\xba\x20\xaa\x53\xb2\x71\x11\x2a\xbb\x28\xf7\x81\xba\x52\xe5\xde\x31\x2a\x1f\x11\xee\x4d\x5f\xe4\x7e\x4f\x95\x60\x40\x56\x87\x74\x32\xb5\xd3\xcf\xb0\xa1\x66\x87\x17\x38\x8e\x25\x37\xb4\x5b\x2f\xc5\x31\xe4\xb3\xe8\x0a\xe8\x30\x45\x0a\x73\x47\xd5\x3a\x63\xe8\x21\x90\x20\x9c\x56\xe3\xc5\x9c\x3c\x76\x5a\x08\x8a\x0a\xa4\xa3\x44\x57\xec\xa8\x07\x85\x34\xa7\xb3\x0a\xdb\x25\xc5\x22\xf9\xca\x4e\x35\x25\x2a\xd1\xd3\x4a\x22\x85\xc4\xad\x80\xbe\xf6\xdd\xa2\xfa\x4e\x40\xc1\x09\x80\xd0\xf4\x22\x28\x67\x0b\x0d\x57\xbb\xec\x12\x92\x8e\x19\x44\x64\xd4\x78\x4f\x27\xa5\x62\xe2\xc7\x4e\xf3\x7e\xe8\xd9\x5d\x38\xdc\xab\xcc\xd7\xe4\x43\x46\x98\xdb\x95\x0a\xd1\xe0\x9a\x25\x29\x55\x1a\x31\x6c\x64\x71\x71\x6b\x6e\x2d\x44\xcc\xab\x16\x42\xd6\xb6\x62\x8d\xdd\xa5\x4c\xb7\xb8\x9e\x09\x5d\xd2\x8b\xed\x78\x51\xde\x4e\x08\x41\xcf\xe4\xbc\x23\x27\xc7\xea\xe3\xce\x4d\x8e\x7e\x79\x06\xc8\xc3\xcc\xcd\x75\x4e\x70\x74\xc9\x40\x44\xc4\xfd\xb1\x48\xc2\x5e\x29\xd5\x32\xe1\x4d\x7e\x5a\x1e\x16\x0d\x78\x51\x6a\x04\x03\xe5\xa3\xd8\xb6\xb2\xbe\x6c\x1d\xab\xf7\xd2\x11\x26\xc8\x99\xe0\x37\xed\x81\x72\xf4\xb9\x86\x56\x0f\x5d\x74\x35\x86\xc5\xb4\xb2\x3a\xa6\x6d\x10\x02\x0b\xe5\x46\x0e\xbd\xc1\xa2\x8f\xc3\x8a\x7a\xb8\x49\x2a\x85\x3a\xdd\x0c\xd8\xef\x4b\x07\xb3\xcf\x43\x7a\x6f\xd7\xb0\xb7\xcc\x53\x0c\x9d\xab\xac\xc3\xe1\x74\xa0\xae\xe9\xd8\xb4\x47\x45\x59\xd3\x96\xcc\x6a\xdc\x6c\x6b\x3a\xa4\xa6\xd9\x1f\x59\xb9\x49\x69\x24\x9e\x7c\x81\x24\x3d\x0c\xef\xee\xe8\xe4\x71\x1a\x1a\xe8\x9b\x25\x1f\x09\x5e\x2b\x58\x0b\xe1\xca\xc2\x89\x0d\xbc\xb9\x8a\x46\x2b\x63\x84\x51\xd1\xdc\x92\x06\xb1\x14\x8f\xeb\x1e\x5b\xb4\x7b\x4b\x02\xbc\xf1\xa1\x08\xc6\x31\x23\x81\x1f\x84\x1d\xd9\x37\xd2\xc5\x52\xb2\xf0\xe8\xd4\xd3\xe1\xc4\xd7\x83\xfa\xb2\xef\x92\xa2\x43\x74\x98\x2d\x44\x73\x64\xf0\x45\x9a\x02\x48\x98\xf5\x1b\x6f\x2d\xbd\x88\xc8\xd5\x6d\x52\x74\x75\x00\xf5\x99\xdb\x07\xb9\xd0\x51\xf6\x04\x44\x85\x15\x73\x2e\x62\x85\x1c\xd8\xa3\x0f\xea\xf5\x65\x05\x17\xc8\xa3\x70\x07\xec\x7d\xcb\xb9\x88\x03\xec\x7d\x35\x5f\xcf\xcc\x0b\x10\x15\x09\xc8\xe3\xe5\x73\xdf\x9e\xde\x41\x92\x09\x96\xad\xcd\xd9\x1d\x41\x1d\x3c\x83\x11\x0f\xf8\x23\x69\x6d\x3e\x7d\xd2\x9e\xee\x71\xbe\x30\xb3\x83\x62\xa3\xb5\x64\x34\x71\xa6\x6d\x0a\xc7\x57\x61\x24\xe7\x9b\x91\xce\x9e\x7a\x04\x0b\xea\x10\x29\xcb\x86\x07\xfe\x60\x9c\x32\x6e\x16\xba\x69\xe1\xa7\x13\x05\xfd\x4a\x76\x38\x2c\xd6\x53\x04\x47\x57\x86\xd7\xa3\xdc\x0c\xd7\xdc\x70\xa1\x78\x79\x08\x87\xe1\x5f\x9c\x6c\xc6\x05\x0e\xf6\x3b\xbd\xdd\x99\x18\x4f\xcb\xa0\x8e\xf2\xbb\x9b\x80\xeb\xdc\x8e\xb9\xa6\x3b\x73\xcb\x78\xa5\x0c\x01\xe7\x71\xe7\x23\xbe\x67\x64\x53\xeb\x93\x13\x3f\x48\x34\x7b\x47\x7c\xdd\x59\x66\xdd\x66\x0f\x69\xc2\xb6\xab\x96\x76\x78\xe7\x0b\xe2\x00\x50\xc2\x7b\xe3\x20\x28\xae\xda\x29\xb7\x1a\xb0\x1c\xfa\xb8\x9a\x5e\xcc\x56\x5d\xaf\x87\x93\xd2\x60\xc5\x74\xc9\xef\x1e\xb0\x3b\xfc\xdc\xd7\x8f\x9a\x1a\x1a\xdc\x55\x72\xdd\x05\x97\x11\x4d\xaa\xc1\x99\x71\x65\x35\x82\xe7\x64\x56\x3e\xb8\x4d\x7e\xe3\x11\xb1\xe0\xbe\xce\xc9\x39\x05\x08\xee\x08\x4c\x1f\x94\x2f\x3c\x05\xe5\xb5\x07\x98\xe1\xfa\x4a\xc1\xfb\xd9\x0b\x57\x20\xb9\x40\x18\x05\x57\x05\x5c\x95\x03\xe5\xd3\xb2\x4a\xce\xd9\x9c\x22\x01\xf6\x7e\x7a\xe7\xe0\x65\xab\x95\xbd\xb0\xe2\xc0\x01\x39\x06\xdc\x97\xbd\xfb\x97\x27\xe0\xd0\xd2\xe2\xa6\x68\xbf\x48\x2b\x65\xdc\x1e\x94\x55\x42\x02\x31\x6e\x9c\xce\xa6\xf0\xd0\x57\xf8\x60\x25\x1e\x3b\x4b\x1b\x71\x1f\x68\xda\xd0\x34\x0c\xb4\x23\x48\xfc\x3a\xf7\x1c\x4c\x4d\xd6\x54\x83\xc0\x63\x74\x02\x56\x3b\xdf\x13\xef\xde\xf0\x04\x0a\x75\x2b\x42\xe4\x5c\x04\x30\xe9\xba\x2b\x32\x39\x5f\x1c\x6b\x73\x3c\x9f\x37\xe6\x7e\x16\xe1\x25\x6e\x4e\xe1\x4d\x54\x24\x16\x95\xfa\xe3\x34\xce\x21\x78\x32\x8e\xd3\x0b\xa2\x9f\x46\xb6\x3a\x9f\x84\x6a\xd5\x3a\x30\xea\x8a\x4c\x16\x4d\xee\x5d\xdd\x7e\x2d\x68\xf6\x7e\xe2\xd0\x9b\x0f\x53\x58\xa7\x16\xe5\xb6\x4c\x86\xb4\xcf\x56\x87\x74\x2b\x45\x73\x9f\xcf\x20\x6a\x2c\xf8\x19\x8c\xb8\xa3\xb8\x5f\xbc\x93\x7e\xda\x57\x6e\x00\xe8\x7c\xf0\xc3\xde\xd7\x57\xde\xb8\xd0\x50\xd8\xf4\x3a\xea\x69\x18\xd6\x27\x23\x77\xd7\x1c\xb8\xa3\x7a\x0b\x86\x7a\x0e\x0a\x69\x8a\xcf\x2f\x4c\x3f\xf1\xe2\xf6\x8b\x2f\xfc\x3c\xab\x2e\xef\x2b\x5f\xd9\x47\x82\x1e\x71\xc0\x6a\x2e\x7c\x1f\xb4\xfc\x66\x8f\xfe\x05\x29\x5c\x63\x7e\x95\xa5\xfe\xd6\xd7\xc0\x92\xf1\xa5\xe4\x8d\x80\xf7\xc8\xb8\x2e\xef\x13\xed\x33\x05\x8d\x90\xaf\xb5\x40\x1c\x36\xbd\xf2\xb0\x04\x25\x9e\xf0\x56\xc0\x97\x33\xc4\xda\x03\x00\x45\xb8\xea\x79\xe3\x66\xa9\x3b\xcb\x57\x68\x57\x68\x3f\x23\x74\xc7\x17\x4f\x40\x78\xf9\xef\x71\x2d\x3f\x3b\x88\x82\x6e\x64\x4f\xcc\xd4\xa5\x87\x6f\x01\xf7\xe6\x21\xdf\x2b\x62\x41\x55\xf4\xd5\x5d\xd4\x8a\xa4\x63\x29\x63\x4d\xee\x7d\xa7\xa3\x55\x9c\xa6\xdf\xc2\xc1\xb8\x90\x9e\xef\x1b\xe3\x85\xad\x32\xab\xd5\x9c\x9a\xde\x20\x44\x68\xae\x18\x60\x77\xb8\x43\xce\xfd\x81\x81\x66\xa2\x57\xd1\xb8\xbd\xf8\x36\x08\x70\xb3\xde\x87\x9e\x10\x16\xf0\xf3\xbb\x3b\x2c\x23\xd5\x21\xe4\x2a\x23\x2f\x0d\x20\x19\x2d\x19\x2f\x7d\xe5\x92\xf4\xd2\x2f\x26\xcb\xa0\xcf\x17\x46\x6e\x07\x6b\x39\xe3\xc3\xcb\xac\xd6\x62\x52\xbf\xce\xef\xd5\x6d\xad\x87\x3a\x9a\x1a\xc3\x1c\x8f\x81\x51\x0f\x33\x40\x62\xea\xc8\xba\x00\x5e\xb4\x47\x4b\x4b\xb3\xd7\x32\x2f\x3f\xf9\xd9\x23\xcc\x73\x09\x2d\x80\x5c\x9b\x71\x19\x28\x36\x33\x41\xb9\xe5\xc0\x9d\x8f\xd5\xeb\x8a\x9a\x85\x5a\x9c\x21\x6c\xb7\x8c\x70\xfc\x3c\x8e\xde\x25\x76\xdf\x75\x22\x8f\x92\xb3\xcc\xa6\x9a\x4e\xa7\x6b\x96\x0b\x76\xfb\xca\x3f\x3b\xe9\x55\x7e\xde\xb1\x03\x47\x24\xce\x19\x09\x46\xe2\x06\x0e\xb0\xe1\xa6\xb1\xd8\xc8\x48\x90\x76\x31\x64\xbb\x60\x9d\x07\x00\x53\xe0\xe7\x17\xdb\xfa\xac\x6b\x70\xff\xb2\x5c\x95\x23\xf2\x6f\x7c\xfa\xc9\xab\xfd\x14\x22\xc6\xf8\x6b\xdd\x8b\x2b\x2f\x2d\x04\xf1\x2c\x4d\x3c\x05\x84\xfa\x8b\x7b\x45\xf8\xce\x83\xd5\xca\x68\xaf\x50\x45\xd5\x8e\x30\xba\x99\xde\x82\x74\xc7\x7b\x2f\x8b\x08\x21\x4e\xde\x22\x6e\x94\xb0\x88\xa4\xad\x6e\x39\xc1\x31\x4c\xd4\xba\x67\x66\xd6\xed\x18\xaf\xab\x31\x6a\x27\xad\xa7\xbd\x27\xb3\xe4\xcc\x99\xae\x87\x88\xb5\xc9\x15\x5c\xdc\x91\x6f\x15\x74\x16\x2c\x95\x19\x1f\xce\x05\xa6\xc2\x03\xff\xe2\x10\xe3\xda\xae\x7d\x6e\xae\xfb\x3b\xa6\xc7\x2d\xf1\x13\xaf\xbd\x6a\xef\x38\x01\xc9\x33\x11\x63\xd1\x4c\x65\x06\x2e\xc4\x9a\x5d\xfe\xd6\xa0\x5b\x32\x18\x3e\x34\xe4\x3f\xb5\x8d\xdb\x8d\xf1\xd7\xbd\xae\xee\xaf\xfb\x0c\x00\x5a\x3f\xd7\x89\x03\x36\x82\xab\xff\xd4\xc2\x33\xf6\xd2\x1b\xb6\xca\xfc\x97\xee\x2f\x77\xe8\xa5\x4b\x92\xcc\xbb\x05\xf3\x3e\x7f\x55\x2e\xd0\x0a\xae\x2e\xef\x56\xcc\x6b\xef\x78\x7f\xc1\xf4\x79\xb6\x6b\x32\x3f\x71\x03\x5d\xe4\x3f\x35\xff\xfc\x3b\xa6\x58\xc0\xbb\x2c\xfa\x00\xcf\x27\xb1\xec\x86\x43\xc3\xb8\xb0\xbc\xdc\xfc\x8a\xf5\x37\xfc\x6f\x93\xff\xc9\x97\xb1\x5f\xbd\x01\x1d\x68\x75\xa2\xfc\x30\x9c\x5e\x78\x5d\x00\x0a\x5c\x30\xf1\xf4\x15\x43\x4e\xfa\xaa\xac\x84\x13\x63\x7e\xd1\x28\x5a\x91\x9f\x3d\x27\xdc\xd8\x57\xa3\x59\x87\x47\xd1\x88\xb4\x31\xc5\x21\x48\xcb\xc8\xeb\x25\x93\xf0\x25\xd4\xdb\x70\x78\x6c\x56\xa0\xb8\x62\xea\xa9\x65\x04\x18\x7e\x32\x1e\xb4\x63\xa2\xab\x3d\xde\x7d\x09\xcf\x49\x77\xa8\x50\x4b\x19\xd9\x17\x46\xf3\xc1\xd1\x25\x88\xeb\x4b\x68\x89\x11\x2b\xb9\x73\x66\x54\xba\xc4\x12\xc4\xbc\x8a\xce\x03\xcc\xbd\x22\xf8\xd6\x50\xb5\x25\xb4\x6a\x03\xaf\x4f\x55\xc9\x78\x6d\x9a\x3c\x61\x5e\x57\x23\x56\x82\x94\x72\x31\xcc\x7a\xd7\x45\x76\x79\xdd\x49\x42\xd9\x65\x6b\xe0\xcc\xa7\x67\x9e\xbe\x54\xb2\x2e\x3e\xd9\x7e\xd5\x0d\x12\xc3\x51\xc4\x57\x50\x7a\x32\x0a\xb0\x43\x8e\x1f\x43\x4f\x34\x79\xee\xb2\x24\x72\x60\xdf\x72\xeb\x8e\x7e\xe2\xf1\x03\x97\x1f\xd6\x9e\x3f\xf1\xb2\x67\xa0\xa5\x4e\x6e\x25\xda\xea\x16\xf4\xcf\x5e\xf1\xe6\xfd\xbb\xdf\xb0\x55\x76\x33\xfd\x57\xee\x00\x98\x7c\xad\xbc\xaf\xac\xf8\xd2\xd2\x08\x7d\xd7\x2b\xb0\xdf\xfd\x29\x12\x1e\xc3\x85\x7e\xe7\x61\xfc\x91\xd7\xd7\x5c\x10\xd8\x5a\x78\x5e\xbf\xfa\xd6\x97\x86\xbe\x6a\xe3\x5d\x3f\xf9\xe5\xff\xe4\xef\xd3\x2f\xda\xfd\xee\xef\xa7\xdf\xde\x42\x7f\xf6\x48\xe9\x87\xe5\x83\xa7\x16\x9c\x7f\xce\x25\x92\xc3\x83\xe7\xeb\x5e\x6b\x84\x2c\xed\xe5\xb3\x57\x0a\xee\x28\x6d\x97\x1f\x73\x0b\xb9\x1b\x6f\x0e\xbf\xee\x30\x96\x12\xfb\xd5\x17\xc7\xc7\x0a\xbe\xea\xfe\xac\x14\xf9\xfd\xd3\xf7\x9b\xb3\x6f\xde\x54\x78\x0c\x9b\x93\x07\xa6\xcf\xb9\xa6\x36\x10\xd4\x26\xa0\x4d\x7c\xe3\xa9\x16\x44\xae\xa5\xcd\xc2\x0f\x93\xc1\x13\x59\xf4\x59\xfb\xe5\xde\xa7\x8d\xb3\xdf\x68\xdb\xc9\xa2\xe5\x06\x51\x96\x76\x24\xae\xfd\x15\xb3\xd2\x6a\x8e\xd7\x3b\x70\x95\x64\x1d\x94\x9e\xb1\xd0\xf3\xe3\xb7\xde\xd4\xdb\x95\x2a\x27\x5c\x8e\x9d\x92\xa9\x96\x69\x77\xbb\xd3\xa0\x5d\xd1\x45\xed\xa0\x17\x6f\x40\x15\x9e\x89\x0a\x66\x16\xd8\x9b\x98\xfa\x26\x7d\x61\xfa\xb0\x05\x3a\x36\x1e\xd2\x71\x76\x3e\x6b\x74\xae\x88\x86\xde\x23\xa2\xb3\x72\x0d\xfd\xbc\x1b\xe7\xf4\xf1\x30\x30\x57\xb8\xb1\xa0\x20\xd2\xa7\xe7\xfa\x9e\x13\xb8\x0e\x26\xc7\x1e\x76\xc2\x05\x57\xea\x66\x5c\x11\xfe\x95\x8b\x2e\xa1\xa4\x6b\xb5\x4c\x0a\x7d\x40\xd9\x35\x8e\xd8\x37\x67\x16\x31\xed\xb5\xf6\x39\xd2\x49\xe8\x52\x11\xf7\xc5\xa7\xc6\x22\x82\xc9\x79\x30\x58\xa5\x90\x59\x80\x2e\x92\xf2\xd2\xd8\xbd\x5b\xea\x10\x45\xfa\x79\xcf\x89\x89\x1c\xf3\x8b\xfb\xd6\xb2\x4b\xc8\x24\xa1\xd4\x8e\x38\x1c\x4f\x60\x19\x5f\xf9\x65\x6e\x67\x57\x9f\x7b\x18\x9b\x68\x33\xd2\xa1\x03\xeb\xcc\x48\x7c\xc5\xa6\x8f\xfc\xa0\x8b\x29\x53\xba\x83\x19\xe8\xe9\xa1\x2f\x48\xb2\x13\x50\x38\x1a\x77\xf6\x80\x4e\x27\x2b\x15\xc1\xf8\xd2\x0d\xc2\xcb\x56\x2a\xe2\xc9\x32\x62\xe4\xbe\x2d\x72\x41\x71\x35\x55\x75\x0a\xf6\x53\x7b\x58\x39\x07\xf1\x42\x7e\xf2\xe9\xf2\x9e\xaf\xce\xb7\xfb\x00\x7b\x50\xdd\xf5\xfd\x0d\xac\x93\x2f\x3d\x22\xc9\x7f\x4d\x53\xb7\x5f\x6b\xbe\x72\x2f\x2a\xbf\xe9\xcc\x8f\x79\x4b\x1c\x78\x09\xf2\xc4\x2c\x3d\xe4\x67\x1c\xe8\x09\x4b\xa3\x4e\xff\x14\x4f\x48\xb6\x2a\x23\x1f\xac\xb6\x2e\x4b\xfa\x5a\x47\x3d\xea\x1b\x35\x4e\xb3\x68\xee\xeb\x7b\x3f\xf3\x31\xc7\xce\x93\xe8\xf9\x9e\x71\xee\xc2\xda\x25\x78\x96\xc6\xe1\xf5\x3a\xf2\xe6\x6e\xab\x7b\xc6\x31\xc3\xa3\x38\x3f\xa0\x43\xe0\x48\x10\x30\x28\x0a\x3f\xd7\xe0\xdc\x94\x10\xe7\x2c\xda\xb2\xb2\x43\xbe\x26\x55\x77\x5b\x33\xdd\xc1\x24\x03\xf7\xee\x6e\x95\x26\x51\x24\x92\xcb\xed\x44\x1d\x11\x0d\x42\x42\x95\x02\xef\x79\x9b\x1a\x94\x12\x8c\x48\xe4\x93\x87\x80\x30\x3e\x21\x28\x68\xb3\x44\xf5\x2e\xb0\xa4\x42\xc2\xa1\x1c\x5b\x4c\x00\xec\x85\xe7\x2f\xbd\x9f\xad\x92\x7b\x33\x5f\x33\x3e\x2f\xc0\xf2\xc4\xf3\x96\xda\xfa\xcb\x49\x74\x39\x05\x20\x0f\x36\x2f\xb3\x27\x5e\x6c\x5d\x6d\xab\x16\xcd\x51\xac\x90\x5f\x9d\x62\x65\x95\x23\x5a\x4f\xe8\x71\xe5\x2e\x90\x99\xe4\x65\x50\xf0\xfc\x4d\x77\xeb\x33\x73\xf4\x92\x20\x99\xf1\x0e\x03\x61\x11\xce\x52\xeb\x8f\xaa\x45\xd7\x88\xaa\xa9\xfb\x6b\x86\x95\xdc\x92\x6f\x6c\x55\xe2\x64\xc8\x4a\xcf\x36\x33\xaf\x78\xc9\x33\xad\x2b\xa4\x2a\x09\x5b\x34\xd5\x56\xab\x76\x5d\x9f\x96\x39\xc2\xf5\x7d\x57\x3c\x72\x19\x21\x3a\x1b\xf4\x7b\x96\x08\x33\xe8\x5c\xe1\x11\xa2\x85\x19\x9c\x20\x88\xa2\xd3\x09\x29\x75\x52\x8e\xf9\xfb\x28\x0b\xa8\x22\xc2\x3e\x1d\x49\xa5\xb5\x50\x93\x61\x52\x8b\x4e\x49\x50\xb2\x70\x1d\x01\xa2\x44\xa8\xd9\x0e\x53\xf3\x70\x6a\xe2\x2e\xd2\x6b\x87\x74\xb3\x94\x0f\x31\xda\x5a\x68\xa2\xe9\x09\xc8\xaf\x91\xc9\xbb\x6a\x11\x28\x57\x4d\xc2\x1a\xde\x1d\xac\xd9\x23\x1e\x94\x6d\xec\x10\x8f\xb8\x71\x35\xc1\x9b\xce\xc1\x02\x0c\x13\xf4\x40\xec\x8c\xe0\xf8\x9c\xa2\x09\xab\x9a\xc1\xb5\x47\x6b\xc2\xa1\x30\x6d\x7d\x79\x10\xe8\x01\x34\x01\xd6\x16\xf8\xe1\xa8\x9b\xb1\x2b\x45\x5b\xfb\xd9\x8a\x5b\x2a\x7f\x86\x89\x0a\xe6\x4d\x75\x87\x43\xb9\xbc\x40\x49\xbc\xf2\xa6\x71\x44\xf0\x09\xb5\x54\x8b\x2e\x4f\xa1\x5c\x9f\x69\x0d\x39\xc0\x06\x43\x41\xb6\x22\x96\xba\x60\xa5\x5f\x1a\x8d\xa7\x02\xc4\xa2\x31\x18\xd2\xec\x43\x80\x2f\xb3\x54\x06\x05\xcc\xfb\x33\xba\x50\xd5\xd4\x13\xae\x75\xb7\xcb\xc5\x3a\xd3\xb1\x2b\xe9\x76\x8e\xb9\x58\xca\x94\x12\x91\x7a\x63\x47\x62\xb1\xa5\xde\xac\xa4\xc3\x21\xa6\xe2\x0f\x0f\x73\x07\xa7\xc6\x04\xdd\x94\x8d\x3b\xa2\xf3\x4e\x98\x18\x2e\xff\x0c\x18\x7a\x35\x9e\x35\xe2\xc1\xfb\x60\xc5\x86\x01\xf3\xf7\x11\x87\xea\x34\x10\x4f\x49\xe7\x0e\x8c\x5e\xc1\x13\x4a\x0f\x06\x7e\xce\x17\xcf\xb5\x90\x60\xdb\xb6\x84\xab\xc6\xd2\x19\xe8\x94\x80\x1b\xb4\x8d\xd9\x1e\x19\xa0\x35\x2d\x35\x3d\xd2\x0e\x7e\x25\xc8\xdd\x7f\x20\xd1\x83\x8e\xcf\x83\x4c\xaa\x2e\xec\xe3\x7e\x3a\x56\x83\x48\x84\x1b\xb3\x7a\x4e\xc3\xdb\xbe\xe8\x1c\x06\x95\xea\xdb\xe8\x5d\xad\x22\xd1\xe8\xce\x81\x6a\x8f\xc4\x70\xe8\x38\xf5\xb2\x6b\x2b\x7d\x92\x1d\x38\xb9\x3b\x7b\x0a\x7b\xa2\xd5\x21\x13\x68\x7a\x2a\x1b\x22\x83\xb2\x8f\x96\x09\x76\x47\xc0\xe9\xa5\xd4\xeb\x9d\x4c\x6b\x2d\x14\xab\x4a\xb6\xec\x27\x4e\x3a\x3a\x2c\x4b\x58\x2a\xab\x69\x37\xb8\xc2\x8c\x7b\x05\x14\xd1\x2e\x3b\xee\xb9\xcb\xf7\x89\x59\x8d\xd9\xb0\x2c\x02\x01\xad\xb8\x17\x0d\xdd\xbe\xf7\xf3\x31\x63\x72\xe9\xf1\x61\x72\xaf\x48\xc4\x4b\x67\x6f\x7c\x84\x56\x8b\x3c\xeb\xe1\x1e\x11\x4f\x55\xf6\xc8\x61\x9a\x4e\xc7\x92\x0d\x94\x18\x5f\x90\x48\x88\x95\x26\xae\xe8\xb4\xa0\xf6\x0e\xf4\x8c\x4d\xae\xcf\x31\xd5\x35\x55\x5c\x12\xfc\xb6\xd1\x18\x9c\x41\xe9\x89\x5b\x44\x79\x59\x36\x03\xd2\x28\x74\x27\x6a\x7f\x4f\x78\xf3\x8c\xd2\x57\x34\x0d\x0c\x14\xeb\x26\x9e\x0f\xe7\x90\x99\x27\x17\x0a\xe5\xec\x06\x4d\x34\x53\x92\xa2\x92\xe1\xa2\x76\xa1\xb5\x94\xa6\x6e\x7d\x59\x4f\x4f\x0a\x84\x23\xa1\xb9\x76\x0c\x27\xb5\x93\x75\xea\x29\xf0\x2c\x1b\x75\x48\x67\xde\x1e\x85\x93\x61\xde\x73\x60\x63\x7f\x65\x08\x97\x7a\x36\xa4\x93\x65\xe7\xbb\x72\x83\x67\x04\xbd\x5a\xee\x02\x5b\x03\x63\xc0\x57\x7d\x78\x6a\x28\x9a\x37\x27\xfe\x69\x65\xc1\x03\x4e\xfd\xd2\x13\x69\x1c\x97\xba\xdd\xaa\xac\x20\x5c\x0e\x72\x0a\xe5\xab\xd1\xc5\x0b\x65\xb0\x83\x46\xe8\x36\xd3\x1a\x14\xd6\x2d\x4d\x5a\x79\x7b\xef\x15\x23\xfc\x54\x28\xfd\xc1\x40\x59\x6c\xe4\xfd\x21\x0d\x0e\xa4\xc4\x70\x85\xa6\x5d\x04\x7b\x0a\xa1\x1b\x1b\x0c\xa7\x98\x47\x90\xf9\x86\x40\x96\x95\x26\xe7\x0e\x22\x54\xec\x8a\x99\x64\x3d\xa3\xcd\x8a\x32\x98\x40\x39\xf6\x3f\xbc\x03\xe3\xfc\x09\x5e\xa7\xe9\x5a\x9c\x68\x3a\x2c\xf9\x76\x05\x00\x00\x56\x36\x6d\x42\x18\x9e\x72\x9e\xe7\xdf\xbf\x7f\xbe\x80\xfc\x7a\x2f\x0a\x8f\x4b\xfe\xf7\x1f\xff\x1b\x00\x00\xff\xff\x13\xa9\xc2\x7d\xe6\x15\x00\x00") - -func bindataTkgWebDistTkgkickstartuiVsphere6ba76e3c33e72aa6f29eSvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiVsphere6ba76e3c33e72aa6f29eSvg, - "tkg/web/dist/tkg-kickstart-ui/vsphere.6ba76e3c33e72aa6f29e.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiVsphere6ba76e3c33e72aa6f29eSvg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiVsphere6ba76e3c33e72aa6f29eSvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/vsphere.6ba76e3c33e72aa6f29e.svg", - size: 5606, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgWebDistTkgkickstartuiWelcomeintro92f405173016654f68c9Svg = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5c\x4b\xb3\xdb\xb6\x92\xfe\x2b\x2c\x65\x13\x57\x01\x6d\xf4\x03\xaf\x94\xe5\xaa\x4c\x16\xe3\x85\xa7\x66\x91\xb9\xb3\xc8\x8e\x22\x25\x1f\xcd\x95\x8f\x5c\x92\xe2\xc7\xbf\x9f\x6a\x90\x94\x28\x89\xe7\x44\x49\xae\x8f\x6e\x25\xa6\x09\x10\x8f\x0f\xdd\x1f\x1a\xdd\x10\xe0\x37\xfb\xcf\x1f\xaa\xaf\x1f\x37\x8f\xfb\xf9\xec\xe1\x70\xf8\xf4\xd3\xeb\xd7\x5f\xbe\x7c\x81\x2f\x0c\xdb\xdd\x87\xd7\xe4\x9c\x7b\xbd\xff\xfc\x61\xd6\x15\xf9\xe9\xeb\x66\xfd\xf8\xcf\xa9\x82\x98\x73\x7e\x5d\xbe\xce\xaa\x2f\xeb\xf6\xf0\x30\x9f\x05\x26\xe0\x3c\xab\x1e\x96\xeb\x0f\x0f\x87\xf9\x8c\x83\x03\xe6\x59\xf5\x79\xbd\xfc\xf2\x1f\xdb\xaf\xf3\x99\xab\x5c\xd5\x15\xaa\xfa\x6f\x6f\xdf\xb4\xcb\xd5\xfe\xed\x9b\xcd\xfa\x71\x59\xef\xfe\x73\x57\xb7\xeb\xe5\xe3\xa1\x5a\xb7\xf3\x19\x35\x98\xdc\xd2\x93\xcd\x75\x9b\xac\x2c\x70\x65\x6b\xe2\x95\x45\x5e\x2c\x62\x58\xd6\x21\xb8\x38\xab\xbe\xe2\x7c\x26\x81\x40\xfc\xac\xfa\x86\xf3\x19\x65\x06\xf2\xb3\xea\x2b\xcd\x67\xe8\x19\xd2\xac\xfa\x46\xa7\xec\x0f\x7d\x0f\xff\x78\x5c\x1f\xf6\xf3\xd9\xef\xfb\xe5\xee\xd7\x4f\x75\xb3\xfc\xef\xc7\x7f\xec\x97\xb3\xb7\x6f\xf6\x87\xed\xa7\x6a\xbb\x5a\xed\x97\x87\xf9\xcc\xcd\x2a\x4d\xdb\x66\xbb\xd9\xee\xe6\xb3\x1f\x56\xab\xd5\xec\xf5\x65\x19\x40\xbe\x28\xb6\x58\xb6\xcb\x15\x4e\x94\x64\xbc\x28\x19\xea\x85\xb4\x53\x6d\x8a\x5c\x94\x64\x9f\x73\xcb\x13\x25\xfd\x65\x9b\x84\x69\xd5\x94\x36\x5f\x9f\x0b\x75\x52\xc8\x8e\x24\xd6\x4b\x0a\x36\xf9\xd4\x5a\x69\x73\xb4\x69\xe1\x9d\xf5\x3e\xc5\x58\xd7\x1e\x9b\xb4\xec\x84\x8c\x42\x80\xb1\x13\x32\x7b\x07\x94\x7a\x21\x0f\xf9\x2a\x65\x4f\x05\xfa\x77\x90\xb2\xea\xfa\xac\x58\xbb\x5a\x85\x55\x9e\x28\x49\x97\xfa\xa8\x79\x19\x96\xed\x94\x3e\x2e\xdb\x8c\xd4\xa6\xa5\xdc\x22\x65\x59\x34\x6d\x3b\xd5\x66\xb8\xec\x9d\x5d\xe3\xdb\x38\x51\x32\x5e\xea\x18\x57\x0d\xb6\x53\xbd\xa7\xcb\x36\x31\x2f\x56\x1d\x1b\x6e\xd2\x71\x6e\x39\x84\x15\xda\x95\xf8\xc6\x8a\xb8\x85\x4d\x0b\xac\x6d\xc2\x3a\x3a\x89\xa9\x95\x45\xe8\x74\xcc\x21\x82\x0f\x9d\x8e\xb3\x07\x4f\x9d\x8a\x8f\xd9\xaa\xe2\x94\x40\xf8\x6f\xaa\x98\x68\x91\x6b\xdf\x67\x6e\x3f\xd5\xcd\xfa\xf0\x4d\x4b\x4d\x4c\xae\x70\x45\xef\x45\xae\xd3\x55\x55\x70\x53\x93\x43\x8d\xd1\x79\x6d\xb7\xa8\x17\xee\xba\x36\x4e\x4d\xd7\xe0\x2f\xc5\xde\x2e\x9a\x45\x73\x5d\x9b\xfc\x44\xed\x7c\xa5\xb4\x7a\xb1\x6c\x96\xd7\xb5\xe5\xba\xf6\x25\xdb\x7a\x7d\x5f\x55\xf5\xb7\x52\x20\x26\x17\x17\x4b\x5c\x58\x89\x4a\x81\x95\x8b\x36\xe5\x2c\xd6\x27\xe4\x66\x21\xcd\xa2\x75\x3d\x05\x44\x12\xf8\x7e\x9a\x67\x29\xf2\x57\x0a\x1c\xb3\xff\x32\x05\x00\xaf\xf8\x3e\x3d\xaa\xa9\x29\x7d\x63\x55\xed\x63\x82\x05\x97\x1c\x7a\xaa\x36\xa5\x29\x53\x7c\x6b\x6d\x9e\x9a\xe4\xfe\x56\xe4\x53\xc0\xaf\x6c\xc9\x9f\xea\xfa\xda\xbe\x3c\x35\xec\x29\x2b\x9a\xd2\xad\x22\xff\xcb\xf4\xbd\x99\xbc\x6d\x8b\x5e\xea\xd6\xae\x5a\x5a\x59\x49\x91\x6d\x4a\x75\x63\x73\x6e\x04\x57\x3e\xfb\xb8\xe4\x8e\xbc\xc9\xc5\x0c\x82\x1d\x7b\x2d\x26\x2c\xc3\x50\xfe\x9e\xbe\xd0\x7c\x66\x89\x13\xc4\x13\x81\xff\x67\x57\x3f\xee\x57\xdb\xdd\xc7\xf9\xec\xa0\xaf\x9b\xfa\xb0\xfc\x31\x89\x13\xf0\x5c\x91\x83\x88\xaf\xaa\xdd\xf6\xa0\xb9\x98\xdc\xab\xbf\x69\xfc\x12\x36\xba\x1c\xdd\x42\xfb\x4b\x41\x3e\x51\x75\xda\xf8\x5d\x5a\xaf\xa7\x2a\x4f\x99\xbe\xab\x15\xe7\xa9\xca\x74\xdd\xf3\xad\xa0\x6f\x5e\xbf\xf2\x4a\x56\x9c\x97\xd9\x62\x83\xde\x4a\x08\x68\xeb\xdc\xd6\x36\xb7\x84\x18\x23\x3b\x5a\xe4\x4e\xff\x44\x09\x58\x06\x1f\x05\x8b\xf3\xa9\xda\x3f\xe6\x17\x1f\x45\x80\xe8\xfb\xf8\x28\x97\x22\x5f\x89\xfe\x37\xb5\xac\x5d\x79\x33\x8b\xb6\x99\xf4\x27\x2e\x15\xd1\xe4\x66\xd1\x34\xb7\xb8\x8c\x8b\x65\xe3\x1a\x9a\x32\x2b\x97\x05\x17\x8b\x76\x71\xb3\xc7\x98\xda\x56\x68\xe5\x17\xd6\xe3\xa2\xb1\xd2\xc8\xc2\x26\xe7\x9c\x5d\xb6\x8d\x5f\xd5\x94\x53\xae\x9b\x7e\x29\x41\x51\xeb\xd0\xb9\xe5\x8e\xc0\xe7\x7e\x2d\x19\xf2\x8b\x36\xba\x69\x39\x31\x15\x3f\xd6\x87\xdd\xfa\xeb\x8f\x68\x2a\x57\xfe\xef\x5f\x5e\xcd\xaa\x12\x75\xfc\xf4\xb0\x5b\xae\xd4\x67\xbb\xc5\x3a\xe8\xd8\xba\x40\xe3\xb0\x3e\x6c\x96\x6f\x9b\xed\xe3\x61\xb7\xdd\x54\xbb\xed\xf6\xe3\x9b\xd7\x5d\xde\x9b\x0f\xd5\xfe\xf0\x6d\xb3\x9c\xcf\xd6\xfb\xed\xa6\x3e\xac\xb7\x8f\x3f\x75\x6f\x4a\x87\x0f\x65\xf0\x8b\xec\xc2\xca\x61\xb2\x0b\x69\x5b\x2b\x14\x17\x36\xb7\x71\x69\x29\xc7\x20\x84\x2e\x34\xca\xf4\xb6\x3e\xd4\xf6\xb1\xfe\xb8\x9c\xcf\xde\xd7\xdf\x96\xbb\x0a\x67\x6f\xdf\x7c\xda\x6e\xbe\xa9\x38\xab\x4f\xdb\xf5\xa3\x32\x8e\x5c\x86\x50\xa1\x0f\x90\x7c\xd5\x25\x12\x90\xaf\x98\x3c\x20\x9d\xbd\x23\x39\x08\x34\xab\x56\xeb\xcd\x66\x3e\x7b\xdc\x3e\x16\x37\x62\xb7\xfd\xe7\x52\xe7\x57\xd3\xae\x96\x79\xc8\xb0\xda\x47\x53\x7f\x9a\xcf\x76\xdb\xdf\x1f\xdb\xb3\xec\xff\xdb\xae\x1f\x2f\xf3\xfb\xd0\x0d\x35\x38\x79\xfd\xf6\x4d\xb3\xde\x35\x9b\x65\xd5\x7c\x55\xc7\xbe\xeb\xb4\xf9\x36\x9f\xa1\x8b\x90\x68\x56\xed\xe6\x33\x82\xfc\xd2\x40\xbc\x14\x7f\x43\x81\x64\x84\x7c\x37\x1c\x11\x01\x4f\xf2\xe0\x74\x2f\x1c\x29\x41\x8c\x1d\x90\x98\x8a\x7b\xf3\x72\x38\x0a\x85\x8f\xf1\x60\x6f\x6b\xd1\x79\xe0\x63\xd0\x4d\xc5\x5f\xd3\xd9\x9d\xb9\xac\x24\x2f\x89\xca\x47\xa0\xc1\x7d\x65\xf0\xfd\x02\x80\x21\xab\x9b\x53\x40\x29\x58\xc4\x97\x45\x95\x4e\xa8\x52\xb7\xba\x16\x54\x91\x20\x0e\xa0\x04\x72\x7c\x59\x50\x94\x8e\xbb\x26\x59\x20\xf7\x9e\x3e\x3a\xd6\x45\xa7\xa8\xaf\xcb\xbd\x13\xa6\x14\x4a\xfc\xd6\x61\x0a\x20\xfd\x4e\x4e\x9f\x7d\x27\x50\xb1\xb3\x83\x1d\x28\x57\xcc\x92\x82\xea\xb3\x5f\xd6\x0c\x04\x81\xde\x0a\x30\x95\x5d\x28\xb5\x02\x01\x72\x7a\x09\x20\x57\xcb\x99\xc2\x09\xb9\xf2\x80\xbe\xea\xdf\x0b\xac\x0a\x39\x42\xa4\xaa\xc7\xf8\xa2\x16\x8a\x21\xe4\x4e\x6f\x92\xc1\x0d\x04\xef\xe4\xa6\x6a\xbb\x03\x26\xb5\x8e\xd4\x61\xf2\xe1\xdf\x04\x13\x45\xc8\xbd\x9c\xfa\xde\x3b\x7e\xa7\xe3\xae\xcf\x7d\x41\x89\x53\xe1\x14\x4c\x18\xa0\x87\xd4\x65\xde\x0b\x51\x2e\xf6\x7c\xb0\x4d\x8e\x7a\x4c\x5d\xf6\xcb\xcc\xbe\x0f\xdb\xc7\x93\x2f\x29\x0c\x4e\x2a\x12\xf0\xb1\x22\x89\x90\x53\x85\x19\x02\x57\xe4\x09\x32\x1f\xbf\x9c\x8a\xbd\xa8\xec\x8a\x7b\x3b\x6c\xd0\x17\xb7\xa1\xec\x2b\x16\xef\x76\xd8\xa0\x2f\xd9\xf7\xc1\x84\x7e\x20\xd8\x18\x52\x97\xfb\x92\x88\xd0\x9f\x7e\xc7\x20\xf5\x35\x4b\xf0\xca\x02\xb1\xf7\x5d\xba\xdc\x97\x84\x14\x18\x1c\x5f\x41\x4a\xbe\xc4\xd6\xf7\x81\x94\x3d\x64\xbc\x84\xc4\x98\xca\x7e\xc9\x4b\x42\x7a\x62\x16\x72\x82\xe0\x87\x59\xc8\x0c\x11\x87\x59\x38\x7c\x39\x15\xbb\x17\xe3\x85\xcb\x32\x74\x49\xf9\x3e\xfb\x4e\x9c\xe7\x00\x98\xae\x49\xdf\x67\xdf\x89\xf5\x63\x50\x23\xda\xdf\x01\xd4\x88\xf7\x23\x50\x8c\x5c\x36\x9e\x5e\x14\xd4\x13\xcc\xf7\x04\x91\x07\xe6\x4b\x84\x98\x07\xe6\x0f\x5f\x4e\xc5\xee\xc5\x7c\x1f\x81\xaf\x89\xdf\xe5\xde\x89\xf7\xde\x01\x85\x6b\xde\xf7\xd9\x77\xe2\xfd\x18\x54\xa2\xa3\x8b\x73\x07\x50\x23\xde\x8f\x40\x8d\x0d\xfe\x8b\x81\x7a\x82\xf7\xd1\x43\x96\x81\xf7\x1a\xe0\x1f\x79\x3f\x7c\x39\x15\xbb\x17\xef\x23\x96\x1d\xab\x4b\xe2\xf7\xd9\x77\x62\x7e\x90\xb2\x2f\x7f\xc9\xfc\x3e\xfb\x4e\xcc\x1f\x83\x1a\x59\xfc\x3b\x80\x1a\x31\x7f\x04\x6a\xcc\xfc\x17\x03\xf5\x04\xf3\x03\x42\x3a\x46\x1c\x21\x40\x3a\xfa\x3a\xc3\x97\x53\xb1\x7b\x31\x3f\xf9\xf2\x23\xee\x25\xf3\xfb\xec\x3b\x31\x3f\x26\x10\xba\x66\x7e\x9f\x7d\x27\xe6\x8f\x41\x8d\x98\x7f\x07\x50\x23\xe6\x8f\x40\x31\x52\xd9\x67\x7e\x51\x50\x4f\x30\x3f\x0b\xe4\x23\xf3\xb3\x03\x77\x8c\xb5\x87\x2f\xa7\x62\xf7\x62\x7e\xce\xe5\x00\xc2\x25\xf3\xfb\xec\x3b\x31\x3f\x13\xf8\x6b\xe2\x77\xb9\x77\xe2\xfd\x08\xd2\x88\xf6\x2f\x0f\x69\xc4\xfa\x13\xa4\xb1\xb9\x7f\x29\x48\x4f\x70\x1e\x9d\x07\x87\xc7\x0d\x26\x97\x21\xfb\x81\xf5\xc7\x6f\xa3\x92\x77\xdb\xcf\x41\x2e\x3f\x5d\x5e\xed\xe8\xf4\xf9\x77\x62\x3e\xba\x00\x7e\x22\xc0\x1d\xf2\xef\xc4\xfe\x33\x58\x23\xfe\xdf\x03\xd6\x68\x06\x8c\x61\x8d\x83\xdc\x97\x83\xf5\xd4\x2c\x20\x06\x3c\x86\xb9\x88\x09\xf0\xe8\xef\x1f\xbf\x8d\x4a\xde\x6d\x16\x50\x1c\xb6\x35\x8f\x72\xa5\x63\xf6\xbd\xe6\x00\x39\x08\x13\xc1\xee\x90\x7f\xaf\x39\x30\x86\x35\x9e\x03\x77\x80\x35\x9e\x03\x23\x58\xe3\x75\xe0\x1e\xb0\xc6\x4a\x54\xc5\x4d\xc4\x6d\x43\xfe\x0b\x4c\xcd\xfa\xf0\x50\xb5\xf3\xd9\x7f\x91\x38\xc0\x6c\x98\x12\x78\x43\x39\x19\x66\x01\x0e\x3f\x53\x06\x1f\x4c\xf7\x74\xc6\x19\x34\x5c\x0e\xd1\x18\x96\xbc\x41\x60\x32\x08\x31\xbe\x23\x46\x70\xfe\xb7\x01\xf2\x0f\x3e\xf9\xec\x17\xda\xc3\x6e\xd9\x1c\xaa\xaf\xa7\x4b\x04\xa7\x73\xaf\x3d\x14\x76\xdd\x06\xee\x70\xdb\x21\x43\x38\x0e\xfd\xf7\xdd\xe6\xc7\x1f\x6e\xb9\xc0\xf0\xea\x6c\x30\x58\xcc\x9c\xe9\xce\x04\xed\xd1\x19\x55\x79\xb2\x08\xc1\x50\x80\x8c\x8d\x07\x12\x43\x90\xd8\x90\x46\x2f\xc6\x03\xe5\xd1\xeb\xc6\x22\x24\x6f\xc9\x43\x1c\x8d\x29\x46\x4f\x9c\x2e\x3a\x8a\x80\xd1\xa0\xf7\x40\xa1\x21\x40\x31\x88\x40\xde\x44\x6d\x0a\x03\x48\x36\x98\x21\x8a\x41\x0f\x2e\x19\x74\xe0\xbd\x45\x20\x32\x48\x40\x16\x1d\x88\xd7\x2a\x18\x2d\x11\x88\x7e\xe3\x64\x31\xd8\x0c\x21\x59\x8c\x10\xa3\xc5\x04\x01\x2d\x06\x70\xe9\x57\x44\x6f\x50\xb4\x97\x51\xc7\x53\x10\xc7\x3f\x70\x53\x86\x18\xfa\x03\x37\x92\xcb\x71\xfd\xdd\x7c\x86\xa9\x5c\xa4\x78\x66\x70\xa2\x0b\x84\xd1\xea\x79\x8f\x08\x01\x75\x2c\x3e\x58\x14\x48\xd9\x90\x83\x28\x35\x0a\x84\x6c\xba\x67\xe1\x87\x45\xc8\xac\xe3\xc7\xbd\x33\x11\x50\x2c\xb2\x92\x47\x5f\x1b\x1d\xb0\x0f\x36\x42\xf6\x9a\xcd\x64\x49\xac\x80\x8f\x96\x09\x28\xff\x82\xaa\x03\x32\xa8\x32\xd3\x56\x4f\x00\xce\x12\xa7\x01\x3b\x87\xde\x97\x73\xb7\xcb\xcd\x66\xfd\x69\xdf\x8f\x98\xa9\x9c\x86\x2b\x23\xf6\xd2\x1d\xed\xf9\x3a\x9f\x49\x39\x3b\xb7\xfb\x36\x9f\x85\xe2\x55\x1d\xa6\x0e\xac\x5a\x0a\x20\xa9\xa2\x08\x42\xc7\xf3\xaa\x0a\x3c\x86\x57\x7f\x20\x68\xc7\x65\x6a\x97\x6e\x99\xcb\x5d\x8b\xdd\x7c\x96\x46\xa7\x3f\x46\x80\x4f\x72\x0e\xac\xf4\xc3\x88\x90\x71\x8f\x11\x24\x19\x76\x90\x54\xc2\xec\x0d\x07\xf0\x6c\x04\x32\x19\x8c\x3a\xf3\x4e\xaf\xef\x31\x24\x43\x18\xc1\xc7\x8e\xec\xd1\x60\xe4\xe7\x19\x2b\x09\x92\x18\x8c\x11\x90\xf6\x96\x0b\xe1\xc5\x8a\xa8\xca\xe2\xaf\x19\x55\xfe\xe4\xa2\xc9\xb9\xbc\x61\x86\x42\x37\x31\x24\x1e\x42\x32\x88\xa4\x16\xa2\x9c\xfe\xdc\x4b\xa1\x34\x7b\x23\x1e\x9c\x1a\x08\xe5\x6b\xd0\x79\x74\x7c\x99\xd2\xd5\x09\x4d\x4a\xc5\xbc\x50\x00\x17\x36\x96\x33\x44\xb2\x92\x20\xcb\x5e\xf9\x11\xd8\x24\x50\xba\x84\x6e\xa2\xc6\x26\xea\xd8\x89\x80\x8d\x38\x48\x68\x38\x1c\x5f\x9e\xef\x68\x84\xfa\x17\x44\x35\x56\x86\x02\x41\x0c\x65\xa0\x68\x28\x91\x41\xa7\x82\x4f\x4d\x52\x0d\x90\x57\x64\x48\x80\x68\x84\x8a\xa1\x3b\xbd\x3f\xf8\x0c\xcc\x7b\x8b\xd9\x26\x0f\x11\x2d\x21\x64\x9b\x75\x14\x35\x06\x40\x32\xdd\xb3\x9b\x11\xc0\xd1\x22\xc4\xb4\xb1\x22\xaa\x40\x04\x92\x5f\x0a\x22\x85\xc4\x90\x42\x27\x55\x1d\xa4\x9c\x09\xf8\xb7\x33\x43\x78\xcb\x25\xa3\x73\x43\x48\x0e\xb5\x2d\x46\x60\xff\x2b\xb9\x64\x88\xd0\x90\xd2\x54\xff\x12\xf0\xd2\x58\xaf\x06\x06\xa3\x21\xd6\x89\xcb\xca\xa5\xd3\xeb\xc6\xaa\x5e\x89\x61\xc4\xaa\x3a\xc6\x85\xac\xce\xfb\x51\x07\x6d\x60\xcb\x83\x6b\xd0\xe9\xa0\x9c\x4a\x21\x5b\x82\x2c\x6a\x81\xbd\xa8\xe5\x10\xde\x60\xb1\x0a\x04\x48\x0d\x48\xd4\xb7\x84\x36\x41\x54\x29\x62\xb4\x9d\x91\x21\x04\x7a\x70\x35\x66\x50\xcd\x94\xa7\x4a\xd3\xe9\xe7\x54\x8c\xea\xc6\x99\x22\xc3\x5f\xca\x80\x0c\x39\x75\x37\x0c\xa9\x61\xf5\x1d\x14\x34\x67\xc0\x9e\x1f\x82\x20\x44\x83\x49\x6d\x44\xc3\x80\xc1\x72\x61\x3e\x90\x57\x7b\x25\x96\x6d\x86\x8c\x56\xf4\x41\x65\x39\x71\x20\x6c\x3d\xf8\x62\xa8\x3d\x5a\x0f\x41\x59\x9b\x52\x87\x92\xca\x62\x20\x5c\x10\xeb\xfc\x86\xe8\x2d\x24\x6f\x92\x7e\x62\x40\x43\xc5\xa8\x1e\xdf\x1e\x32\x48\xae\xbd\xb2\xac\x3c\xca\x78\x8d\xb7\x02\x94\x36\x90\xc8\x7a\x93\x81\x83\x65\x03\x98\x6d\x68\x9c\x25\x88\xd1\x20\xa0\x42\x44\x32\x01\x38\xdb\xa0\xa5\x83\x81\x88\xa7\xf1\x22\x8b\x0b\x8b\x4b\x33\x59\x84\xd3\x1f\x7d\x22\x57\x4e\xba\xab\x95\x0c\xc5\x76\xaa\x95\x94\xb2\x6e\x4c\x5a\x49\xd2\xc9\x50\x89\xb6\x10\x4e\x56\x32\x65\x48\xfe\xd5\xf3\x62\x4e\x9d\x30\x12\xb8\xb0\xb7\x65\x8e\x97\x05\x20\xaa\xfb\xa1\xa6\xae\xb1\xac\x54\xd0\x81\xa2\x2f\x53\x47\x20\xf3\xf8\x7d\x83\x09\x92\x11\xd5\x42\x36\x04\x21\x4f\x0d\xf4\x32\xe8\xf0\xc1\x81\xa7\xaa\x5c\xc7\xaa\x38\x44\x08\x58\x75\x9e\x48\x85\x51\x95\x3e\xa4\x38\x04\x48\xb9\xca\x01\x50\xaa\x71\xad\xf3\xb9\x78\xc3\x65\xb0\x57\x53\x38\xfa\x7b\x9b\xe5\x4e\x50\x25\xe2\xc0\xc5\xa1\x67\x0a\xea\xf6\x0d\x29\xf1\x2a\x0d\x2d\x18\x72\x35\xae\x75\x86\xe3\x96\x1b\x49\x05\xc7\xf1\x54\xf6\xc7\xf5\x57\xbb\xd8\x2c\x1f\x5b\xfb\x71\xdb\x2e\x7f\xfa\xf8\xfb\xe6\xb0\xfe\xb4\xf9\x36\x3b\x5b\xca\xbc\x63\x08\xa9\x5f\xca\xc8\x97\xfb\x1f\x3b\x65\xc9\x68\xff\xf9\x87\x66\xb9\x0c\xab\x78\xb1\x08\x9e\xd5\x4c\x0c\x91\xfe\x4a\x4d\x9d\x8d\xde\x3f\x5b\xf3\xf5\x87\x93\x73\x49\x51\x5d\xad\xce\xbb\xec\x4f\xc8\xf7\xde\x65\x72\x10\x47\xce\xa5\x0f\x10\xe2\xc4\x42\x31\x34\xc4\x91\x0b\xe7\xa7\x1b\xca\x7f\xa6\xa1\x0c\x09\xfb\x86\x52\xb9\x55\x30\xdc\xee\x4d\xa5\x87\xa1\x21\xb5\x79\x27\xf7\x00\x5b\xa1\x54\x8f\x1b\xa2\xd4\x15\xb8\x6e\x88\xb0\x38\x31\x43\x43\x12\x80\xe9\x99\x86\xd8\x85\x6e\x03\xe7\x6f\x37\xa4\xbe\x7e\xfa\x57\x34\x34\x92\x11\x53\x39\x64\x3c\xc4\x04\x5c\x7e\x28\x1d\xc9\x28\xe4\x67\x1a\x12\xf4\x65\x3f\xea\x4f\x36\xe4\x5c\xc6\xb6\x3e\x33\x4f\xe2\x45\x17\xcc\xa2\xfa\x07\x04\xc1\x9a\xd4\x3a\x03\xf6\xc1\x4f\x9f\xfa\xec\x09\x24\x9c\x7f\xb3\x7d\xea\x5d\x69\xa3\x76\xbd\xf9\x2e\x5f\xff\xb7\x6b\xf1\xe7\x53\xe6\xb8\xa3\x93\xf9\xea\xef\xc3\x5c\xda\x8c\x52\xb8\xc2\xec\xca\xe1\x97\x42\xd1\x63\xca\x47\x20\xa9\x34\x62\x24\x5f\x09\x47\xc8\xf9\x98\x1a\x55\x9b\x72\x8e\x2e\x7a\xd1\xa6\x62\x1a\x1a\xa6\x18\xcb\xd6\x4b\x9f\xea\xec\x60\xdf\x30\x0b\x02\xc5\x63\x6a\x5c\xef\x39\x27\x4c\x58\x97\x2f\xa3\xde\xb9\x4b\xef\x38\xe8\xd4\xdc\x58\x06\x5f\xe4\x16\xdf\x09\xa7\x0d\x06\x4d\xea\xec\x4a\x25\xb2\xd4\x60\x29\xab\xa0\xbd\x29\x8f\x4e\x7e\x10\xd5\xad\x60\x7a\x2f\x82\x20\x46\x9d\xed\x80\x3f\x53\x59\xea\x07\xbf\xcb\x99\xb3\xfe\xae\x85\x7c\x5c\x92\x82\xf4\x65\x46\x60\x1e\x8a\xe1\xb8\x84\x23\x0a\x27\x2a\x9c\x58\x4a\x0d\x70\x92\xa2\x89\x9b\x2e\x48\xb3\x1a\x94\xe1\x1f\x2a\x95\x32\x97\x8d\xde\x72\x73\xa7\x62\xc9\x90\xb8\xea\x08\x31\x68\xf5\x22\xd5\x95\x3c\xab\x77\xbe\x16\xdc\x70\x85\xe7\xdc\x3f\xec\x5a\xfe\x7b\x7c\x7f\xb0\xa5\xde\x1f\xf0\xfd\xac\xa7\xa7\x75\x81\x89\x0c\x79\x02\xde\xb0\xc6\xcb\x29\x01\xa7\x07\x8d\x8f\xc2\x26\x40\x62\x8b\x4e\x00\x51\x43\xb4\xa0\x2e\x43\xe4\x77\xea\xfc\x11\xa9\xe6\x38\x41\x4a\x3f\xab\x63\xc2\xa6\x7b\xf6\x9d\x0f\x6d\xfe\x36\x61\x42\x4e\xa2\xe0\x60\x28\x29\xcb\x37\xea\xd9\xb9\x68\x03\x04\xb2\x48\x06\x32\x59\x81\x58\xdc\x2b\x55\x7b\x10\x43\x20\x75\xf1\xe2\xca\xa3\xf7\xd3\xd4\x45\x55\x8e\xaa\x7b\x12\x92\x05\x1f\x9f\x77\x38\x0b\x4d\x0c\x69\x7c\x17\x37\xe4\xb4\x25\x41\xc3\x09\x84\xd4\xb1\xcb\x9f\x05\x42\xe3\x0c\x03\x69\x50\x4d\xea\x27\x89\x58\xaf\xc1\x49\xd4\x78\x44\x9d\x61\x0d\x11\xd5\x0b\x4e\xde\x0a\x6a\x18\x2e\x1b\x4b\xd9\xb2\x7a\x6e\x8d\x45\x54\x7f\x34\x26\xa3\xe4\xb6\xa4\xd6\x56\x5d\xf2\x14\xba\xf7\x49\x79\x5c\xb2\x94\x1d\x60\xac\x8a\x59\xc5\x6a\x48\x11\x41\x0e\x4a\xcf\xe1\x15\x73\x02\x09\x15\xb1\x00\x53\x75\x56\xe9\x39\xa1\x53\xc8\xaa\x27\x46\xdc\x68\x18\xa0\xe2\xcd\x10\xf9\x3d\x21\x76\x31\x5f\xaa\x23\x90\xd1\x3f\x9d\xf3\x1f\x80\x45\xfd\xc3\xf0\x0e\x75\xc9\xc7\x9a\x4b\xb4\xac\x8f\xae\x00\x83\xe4\x92\xfe\x9c\xd5\xb7\x7c\x40\xc7\xef\x49\xdd\x90\xa0\xbd\x9c\xc7\x53\xb7\x5c\x88\x7c\x75\xb5\x25\x12\xd0\xa0\x8f\xc0\x79\x83\x0e\x82\x3a\xa0\x1e\x8d\x46\x8a\x4a\x92\x6c\x58\x1d\xf8\x6c\xca\xa3\x9b\x27\x41\x63\x80\xde\xd4\x49\x09\x2b\x94\x45\x4e\xe3\xda\xc4\x3a\xa2\x60\x09\xc2\xf3\x1b\x4d\x1d\x3b\xd5\x2f\xac\x11\x4b\x60\x8a\xc3\x8e\x9c\xd3\x50\x29\xa2\x71\x53\x01\xf0\xc8\xbd\x92\x9c\x87\x7b\x0e\xa8\x4a\x9b\xf2\xae\xfa\xe9\xf8\x44\xad\xde\x05\xfa\x73\xb5\x88\x53\x59\x9b\x9f\xaa\x75\x75\x01\xa2\xd4\xad\x88\x44\xed\x61\x9f\xd0\x36\xb8\xf2\xea\x2a\x33\x3e\x7d\xe8\xed\x74\x41\xba\xec\x75\x7e\x5c\x1f\x96\xbb\xcd\xfa\xe3\xfa\x30\x9f\xa1\xbb\xde\x02\xf5\xf1\x19\x00\x18\x62\xdf\x7b\x37\xee\xca\xab\x55\x08\xd5\x20\x85\xef\x0f\xc0\xe5\x12\x22\x74\x89\xa2\xb1\xca\xbb\xd4\x2d\xbc\x54\x3c\xb0\x7f\x1d\x86\x0f\xd5\xd9\x8d\xe2\xd1\x7e\x35\x27\x5f\x3c\xf1\x72\x4c\x58\x27\xf4\xf0\x43\xf8\x90\x3f\xba\x0b\x3c\x89\x47\x52\x0e\x2d\xde\x88\x87\xfb\x7f\x7a\xe0\xd4\x7d\xa6\xce\x21\xbf\xec\x7e\xc8\xff\xde\xdd\xe7\x72\x11\xe8\xba\xfb\x3e\xff\xfb\x76\x2f\x4e\xc3\xe2\xeb\xee\x8f\xf9\xdf\xa5\x7b\x8d\xac\xae\x49\x89\x02\xd4\x9d\x4a\x72\xa1\x12\x5d\x60\x2b\x12\x51\x3b\x2f\xba\x1c\xa7\x4a\x43\xfb\xa8\x3e\xa8\x2e\xce\x65\xce\x46\x8d\x70\xbb\x85\x43\x04\x42\x25\xde\x95\x36\x38\x94\x5f\x66\xa6\xe9\xdb\x92\xf3\xfe\x46\xc4\x0e\x12\xfd\xa5\x60\x29\x9d\xcc\x50\x6c\x88\x26\x77\x0c\x38\x47\x48\xa9\xc2\x14\x80\x52\xc5\x31\x8c\x53\x81\x40\xfd\xec\xf2\xcb\x3d\x27\x86\x8c\xc7\xd4\xb8\xda\x0d\x2b\xac\x8a\x32\xc9\xd0\xb0\x38\x54\xbb\x37\x74\x93\x22\xa4\x30\xb4\x2c\x2e\x8d\x53\xe3\x7a\xb7\xf4\x23\x11\x8e\xf8\x55\x65\x31\x1f\x53\xea\x41\xd0\xb1\x61\xe6\x71\x6a\x54\xed\x86\x5e\x38\x97\x63\x9b\x18\x18\x10\x2b\x0e\xf9\x2c\xf5\x8c\xd0\x46\xd5\xa6\x02\xb4\xab\xc1\x94\xdf\x87\x31\x3a\x75\x90\x0b\x1b\x4f\x29\xcc\x10\xa9\xc2\x50\x9c\x67\x11\x77\x96\x1a\xd5\xbb\x85\x03\x0e\x95\xda\xbd\x9c\xd4\x3f\x1c\xa5\x42\x50\xcb\xdc\x0d\x80\x52\x84\x78\x1a\xce\xb8\xda\x2d\x52\xf3\x08\xe1\xa8\x74\xe7\xe1\xa8\x1a\x2a\x37\xb5\x8f\xed\x72\xd4\x85\x70\x48\x8d\x6a\xdd\x20\xb3\x67\xc7\x12\x19\xc2\x51\x51\x94\xa5\xac\x80\x9d\xd6\x26\xc7\xf2\x8c\x6a\x34\xea\xf4\x15\x95\xfd\xce\x8e\x5a\xe9\x18\xe5\x74\xb1\xeb\x45\xaa\x8b\x72\xba\x68\x75\x9c\x18\x1a\x39\x73\xda\x6e\xf9\x77\x13\x26\x37\xde\xc8\x07\xed\x8d\xa5\x8c\xbb\xf3\x3c\x2b\x46\x57\xb4\x17\x4b\x4c\x35\xa4\x7c\x86\x18\x2b\x96\x50\x8e\x5e\x8e\xeb\x1d\xc7\x9f\x5c\xc2\x24\xe7\xce\xac\xfa\x64\xde\x90\x86\xc3\x79\xe3\x11\xbc\x98\xcc\xe0\xe5\xc1\x7a\xc8\xf2\x9e\x9c\x3f\x6e\xec\x3f\xb8\x9f\x03\x64\x0d\x29\x32\x0d\xa1\xd6\xb8\xfa\x6f\x67\xd6\x71\x6c\xe1\x02\x97\x28\xfb\x5b\xb7\xa1\x43\xf1\xb4\xd5\x91\xcb\x4f\xd9\xc7\x0d\x2a\xa0\x6e\x3b\x97\x20\x74\xbb\xb9\xe5\xe5\x0a\xbe\x1a\xfb\xf2\x67\xff\xf9\xc3\xdb\xff\x0f\x00\x00\xff\xff\x39\xa4\xd6\x32\xd4\x4e\x00\x00") - -func bindataTkgWebDistTkgkickstartuiWelcomeintro92f405173016654f68c9SvgBytes() ([]byte, error) { - return bindataRead( - _bindataTkgWebDistTkgkickstartuiWelcomeintro92f405173016654f68c9Svg, - "tkg/web/dist/tkg-kickstart-ui/welcome-intro.92f405173016654f68c9.svg", - ) -} - -func bindataTkgWebDistTkgkickstartuiWelcomeintro92f405173016654f68c9Svg() (*asset, error) { - bytes, err := bindataTkgWebDistTkgkickstartuiWelcomeintro92f405173016654f68c9SvgBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/web/dist/tkg-kickstart-ui/welcome-intro.92f405173016654f68c9.svg", - size: 20180, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, &os.PathError{Op: "open", Path: name, Err: os.ErrNotExist} -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -// nolint: deadcode -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, &os.PathError{Op: "open", Path: name, Err: os.ErrNotExist} -} - -// AssetNames returns the names of the assets. -// nolint: deadcode -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "tkg/web/dist/tkg-kickstart-ui/175-es2015.d46a578ff1b6cad5d45a.js": bindataTkgWebDistTkgkickstartui175es2015D46a578ff1b6cad5d45aJs, - "tkg/web/dist/tkg-kickstart-ui/175-es5.d46a578ff1b6cad5d45a.js": bindataTkgWebDistTkgkickstartui175es5D46a578ff1b6cad5d45aJs, - "tkg/web/dist/tkg-kickstart-ui/39-es2015.01e37d969093a24ceaf8.js": bindataTkgWebDistTkgkickstartui39es201501e37d969093a24ceaf8Js, - "tkg/web/dist/tkg-kickstart-ui/39-es5.01e37d969093a24ceaf8.js": bindataTkgWebDistTkgkickstartui39es501e37d969093a24ceaf8Js, - "tkg/web/dist/tkg-kickstart-ui/3rdpartylicenses.txt": bindataTkgWebDistTkgkickstartui3rdpartylicensesTxt, - "tkg/web/dist/tkg-kickstart-ui/582-es2015.25ed5926266ddd371723.js": bindataTkgWebDistTkgkickstartui582es201525ed5926266ddd371723Js, - "tkg/web/dist/tkg-kickstart-ui/582-es5.25ed5926266ddd371723.js": bindataTkgWebDistTkgkickstartui582es525ed5926266ddd371723Js, - "tkg/web/dist/tkg-kickstart-ui/644-es2015.b16fcfdb49088748e8f1.js": bindataTkgWebDistTkgkickstartui644es2015B16fcfdb49088748e8f1Js, - "tkg/web/dist/tkg-kickstart-ui/644-es5.b16fcfdb49088748e8f1.js": bindataTkgWebDistTkgkickstartui644es5B16fcfdb49088748e8f1Js, - "tkg/web/dist/tkg-kickstart-ui/651-es2015.1191a3c343f5b6f4c3bd.js": bindataTkgWebDistTkgkickstartui651es20151191a3c343f5b6f4c3bdJs, - "tkg/web/dist/tkg-kickstart-ui/651-es5.1191a3c343f5b6f4c3bd.js": bindataTkgWebDistTkgkickstartui651es51191a3c343f5b6f4c3bdJs, - "tkg/web/dist/tkg-kickstart-ui/742-es2015.fed85f8921ac5074e243.js": bindataTkgWebDistTkgkickstartui742es2015Fed85f8921ac5074e243Js, - "tkg/web/dist/tkg-kickstart-ui/742-es5.fed85f8921ac5074e243.js": bindataTkgWebDistTkgkickstartui742es5Fed85f8921ac5074e243Js, - "tkg/web/dist/tkg-kickstart-ui/917-es2015.811d90b19a852dcbc427.js": bindataTkgWebDistTkgkickstartui917es2015811d90b19a852dcbc427Js, - "tkg/web/dist/tkg-kickstart-ui/917-es5.811d90b19a852dcbc427.js": bindataTkgWebDistTkgkickstartui917es5811d90b19a852dcbc427Js, - "tkg/web/dist/tkg-kickstart-ui/assets/images/aws-ec2.svg": bindataTkgWebDistTkgkickstartuiAssetsImagesAwsec2Svg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/docker.svg": bindataTkgWebDistTkgkickstartuiAssetsImagesDockerSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/ms-azure.svg": bindataTkgWebDistTkgkickstartuiAssetsImagesMsazureSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/tanzu-logo.svg": bindataTkgWebDistTkgkickstartuiAssetsImagesTanzulogoSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/tce-logo.svg": bindataTkgWebDistTkgkickstartuiAssetsImagesTcelogoSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/vmw-logo.svg": bindataTkgWebDistTkgkickstartuiAssetsImagesVmwlogoSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/vsphere.svg": bindataTkgWebDistTkgkickstartuiAssetsImagesVsphereSvg, - "tkg/web/dist/tkg-kickstart-ui/assets/images/welcome-intro.svg": bindataTkgWebDistTkgkickstartuiAssetsImagesWelcomeintroSvg, - "tkg/web/dist/tkg-kickstart-ui/aws-ec2.1241b36c8e9e94dcf23e.svg": bindataTkgWebDistTkgkickstartuiAwsec21241b36c8e9e94dcf23eSvg, - "tkg/web/dist/tkg-kickstart-ui/clr-ui-dark.min.css": bindataTkgWebDistTkgkickstartuiClruidarkMinCss, - "tkg/web/dist/tkg-kickstart-ui/clr-ui.min.css": bindataTkgWebDistTkgkickstartuiClruiMinCss, - "tkg/web/dist/tkg-kickstart-ui/docker.05653a44fa77774eac36.svg": bindataTkgWebDistTkgkickstartuiDocker05653a44fa77774eac36Svg, - "tkg/web/dist/tkg-kickstart-ui/favicon.ico": bindataTkgWebDistTkgkickstartuiFaviconIco, - "tkg/web/dist/tkg-kickstart-ui/index.html": bindataTkgWebDistTkgkickstartuiIndexHtml, - "tkg/web/dist/tkg-kickstart-ui/main-es2015.341f46d0b99a14967f1e.js": bindataTkgWebDistTkgkickstartuiMaines2015341f46d0b99a14967f1eJs, - "tkg/web/dist/tkg-kickstart-ui/main-es5.341f46d0b99a14967f1e.js": bindataTkgWebDistTkgkickstartuiMaines5341f46d0b99a14967f1eJs, - "tkg/web/dist/tkg-kickstart-ui/ms-azure.814a53b97d8fea22860e.svg": bindataTkgWebDistTkgkickstartuiMsazure814a53b97d8fea22860eSvg, - "tkg/web/dist/tkg-kickstart-ui/polyfills-es2015.3e69d632a8e7bb99faa8.js": bindataTkgWebDistTkgkickstartuiPolyfillses20153e69d632a8e7bb99faa8Js, - "tkg/web/dist/tkg-kickstart-ui/polyfills-es5.4f5834b7b08801de44f4.js": bindataTkgWebDistTkgkickstartuiPolyfillses54f5834b7b08801de44f4Js, - "tkg/web/dist/tkg-kickstart-ui/runtime-es2015.969771d6bf2c3ab9fc99.js": bindataTkgWebDistTkgkickstartuiRuntimees2015969771d6bf2c3ab9fc99Js, - "tkg/web/dist/tkg-kickstart-ui/runtime-es5.969771d6bf2c3ab9fc99.js": bindataTkgWebDistTkgkickstartuiRuntimees5969771d6bf2c3ab9fc99Js, - "tkg/web/dist/tkg-kickstart-ui/scripts.2cc3b57c8646210a196c.js": bindataTkgWebDistTkgkickstartuiScripts2cc3b57c8646210a196cJs, - "tkg/web/dist/tkg-kickstart-ui/styles.a0a16718149e3f00ad10.css": bindataTkgWebDistTkgkickstartuiStylesA0a16718149e3f00ad10Css, - "tkg/web/dist/tkg-kickstart-ui/tanzu-logo.71a047ebb2527a9eb5a2.svg": bindataTkgWebDistTkgkickstartuiTanzulogo71a047ebb2527a9eb5a2Svg, - "tkg/web/dist/tkg-kickstart-ui/tce-logo.37c4b14a8d8a0173d026.svg": bindataTkgWebDistTkgkickstartuiTcelogo37c4b14a8d8a0173d026Svg, - "tkg/web/dist/tkg-kickstart-ui/vmw-logo.07f49a7461d1ed06907b.svg": bindataTkgWebDistTkgkickstartuiVmwlogo07f49a7461d1ed06907bSvg, - "tkg/web/dist/tkg-kickstart-ui/vsphere.6ba76e3c33e72aa6f29e.svg": bindataTkgWebDistTkgkickstartuiVsphere6ba76e3c33e72aa6f29eSvg, - "tkg/web/dist/tkg-kickstart-ui/welcome-intro.92f405173016654f68c9.svg": bindataTkgWebDistTkgkickstartuiWelcomeintro92f405173016654f68c9Svg, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// -// data/ -// foo.txt -// img/ -// a.png -// b.png -// -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, &os.PathError{ - Op: "open", - Path: name, - Err: os.ErrNotExist, - } - } - } - } - if node.Func != nil { - return nil, &os.PathError{ - Op: "open", - Path: name, - Err: os.ErrNotExist, - } - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{Func: nil, Children: map[string]*bintree{ - "tkg": {Func: nil, Children: map[string]*bintree{ - "web": {Func: nil, Children: map[string]*bintree{ - "dist": {Func: nil, Children: map[string]*bintree{ - "tkg-kickstart-ui": {Func: nil, Children: map[string]*bintree{ - "175-es2015.d46a578ff1b6cad5d45a.js": {Func: bindataTkgWebDistTkgkickstartui175es2015D46a578ff1b6cad5d45aJs, Children: map[string]*bintree{}}, - "175-es5.d46a578ff1b6cad5d45a.js": {Func: bindataTkgWebDistTkgkickstartui175es5D46a578ff1b6cad5d45aJs, Children: map[string]*bintree{}}, - "39-es2015.01e37d969093a24ceaf8.js": {Func: bindataTkgWebDistTkgkickstartui39es201501e37d969093a24ceaf8Js, Children: map[string]*bintree{}}, - "39-es5.01e37d969093a24ceaf8.js": {Func: bindataTkgWebDistTkgkickstartui39es501e37d969093a24ceaf8Js, Children: map[string]*bintree{}}, - "3rdpartylicenses.txt": {Func: bindataTkgWebDistTkgkickstartui3rdpartylicensesTxt, Children: map[string]*bintree{}}, - "582-es2015.25ed5926266ddd371723.js": {Func: bindataTkgWebDistTkgkickstartui582es201525ed5926266ddd371723Js, Children: map[string]*bintree{}}, - "582-es5.25ed5926266ddd371723.js": {Func: bindataTkgWebDistTkgkickstartui582es525ed5926266ddd371723Js, Children: map[string]*bintree{}}, - "644-es2015.b16fcfdb49088748e8f1.js": {Func: bindataTkgWebDistTkgkickstartui644es2015B16fcfdb49088748e8f1Js, Children: map[string]*bintree{}}, - "644-es5.b16fcfdb49088748e8f1.js": {Func: bindataTkgWebDistTkgkickstartui644es5B16fcfdb49088748e8f1Js, Children: map[string]*bintree{}}, - "651-es2015.1191a3c343f5b6f4c3bd.js": {Func: bindataTkgWebDistTkgkickstartui651es20151191a3c343f5b6f4c3bdJs, Children: map[string]*bintree{}}, - "651-es5.1191a3c343f5b6f4c3bd.js": {Func: bindataTkgWebDistTkgkickstartui651es51191a3c343f5b6f4c3bdJs, Children: map[string]*bintree{}}, - "742-es2015.fed85f8921ac5074e243.js": {Func: bindataTkgWebDistTkgkickstartui742es2015Fed85f8921ac5074e243Js, Children: map[string]*bintree{}}, - "742-es5.fed85f8921ac5074e243.js": {Func: bindataTkgWebDistTkgkickstartui742es5Fed85f8921ac5074e243Js, Children: map[string]*bintree{}}, - "917-es2015.811d90b19a852dcbc427.js": {Func: bindataTkgWebDistTkgkickstartui917es2015811d90b19a852dcbc427Js, Children: map[string]*bintree{}}, - "917-es5.811d90b19a852dcbc427.js": {Func: bindataTkgWebDistTkgkickstartui917es5811d90b19a852dcbc427Js, Children: map[string]*bintree{}}, - "assets": {Func: nil, Children: map[string]*bintree{ - "images": {Func: nil, Children: map[string]*bintree{ - "aws-ec2.svg": {Func: bindataTkgWebDistTkgkickstartuiAssetsImagesAwsec2Svg, Children: map[string]*bintree{}}, - "docker.svg": {Func: bindataTkgWebDistTkgkickstartuiAssetsImagesDockerSvg, Children: map[string]*bintree{}}, - "ms-azure.svg": {Func: bindataTkgWebDistTkgkickstartuiAssetsImagesMsazureSvg, Children: map[string]*bintree{}}, - "tanzu-logo.svg": {Func: bindataTkgWebDistTkgkickstartuiAssetsImagesTanzulogoSvg, Children: map[string]*bintree{}}, - "tce-logo.svg": {Func: bindataTkgWebDistTkgkickstartuiAssetsImagesTcelogoSvg, Children: map[string]*bintree{}}, - "vmw-logo.svg": {Func: bindataTkgWebDistTkgkickstartuiAssetsImagesVmwlogoSvg, Children: map[string]*bintree{}}, - "vsphere.svg": {Func: bindataTkgWebDistTkgkickstartuiAssetsImagesVsphereSvg, Children: map[string]*bintree{}}, - "welcome-intro.svg": {Func: bindataTkgWebDistTkgkickstartuiAssetsImagesWelcomeintroSvg, Children: map[string]*bintree{}}, - }}, - }}, - "aws-ec2.1241b36c8e9e94dcf23e.svg": {Func: bindataTkgWebDistTkgkickstartuiAwsec21241b36c8e9e94dcf23eSvg, Children: map[string]*bintree{}}, - "clr-ui-dark.min.css": {Func: bindataTkgWebDistTkgkickstartuiClruidarkMinCss, Children: map[string]*bintree{}}, - "clr-ui.min.css": {Func: bindataTkgWebDistTkgkickstartuiClruiMinCss, Children: map[string]*bintree{}}, - "docker.05653a44fa77774eac36.svg": {Func: bindataTkgWebDistTkgkickstartuiDocker05653a44fa77774eac36Svg, Children: map[string]*bintree{}}, - "favicon.ico": {Func: bindataTkgWebDistTkgkickstartuiFaviconIco, Children: map[string]*bintree{}}, - "index.html": {Func: bindataTkgWebDistTkgkickstartuiIndexHtml, Children: map[string]*bintree{}}, - "main-es2015.341f46d0b99a14967f1e.js": {Func: bindataTkgWebDistTkgkickstartuiMaines2015341f46d0b99a14967f1eJs, Children: map[string]*bintree{}}, - "main-es5.341f46d0b99a14967f1e.js": {Func: bindataTkgWebDistTkgkickstartuiMaines5341f46d0b99a14967f1eJs, Children: map[string]*bintree{}}, - "ms-azure.814a53b97d8fea22860e.svg": {Func: bindataTkgWebDistTkgkickstartuiMsazure814a53b97d8fea22860eSvg, Children: map[string]*bintree{}}, - "polyfills-es2015.3e69d632a8e7bb99faa8.js": {Func: bindataTkgWebDistTkgkickstartuiPolyfillses20153e69d632a8e7bb99faa8Js, Children: map[string]*bintree{}}, - "polyfills-es5.4f5834b7b08801de44f4.js": {Func: bindataTkgWebDistTkgkickstartuiPolyfillses54f5834b7b08801de44f4Js, Children: map[string]*bintree{}}, - "runtime-es2015.969771d6bf2c3ab9fc99.js": {Func: bindataTkgWebDistTkgkickstartuiRuntimees2015969771d6bf2c3ab9fc99Js, Children: map[string]*bintree{}}, - "runtime-es5.969771d6bf2c3ab9fc99.js": {Func: bindataTkgWebDistTkgkickstartuiRuntimees5969771d6bf2c3ab9fc99Js, Children: map[string]*bintree{}}, - "scripts.2cc3b57c8646210a196c.js": {Func: bindataTkgWebDistTkgkickstartuiScripts2cc3b57c8646210a196cJs, Children: map[string]*bintree{}}, - "styles.a0a16718149e3f00ad10.css": {Func: bindataTkgWebDistTkgkickstartuiStylesA0a16718149e3f00ad10Css, Children: map[string]*bintree{}}, - "tanzu-logo.71a047ebb2527a9eb5a2.svg": {Func: bindataTkgWebDistTkgkickstartuiTanzulogo71a047ebb2527a9eb5a2Svg, Children: map[string]*bintree{}}, - "tce-logo.37c4b14a8d8a0173d026.svg": {Func: bindataTkgWebDistTkgkickstartuiTcelogo37c4b14a8d8a0173d026Svg, Children: map[string]*bintree{}}, - "vmw-logo.07f49a7461d1ed06907b.svg": {Func: bindataTkgWebDistTkgkickstartuiVmwlogo07f49a7461d1ed06907bSvg, Children: map[string]*bintree{}}, - "vsphere.6ba76e3c33e72aa6f29e.svg": {Func: bindataTkgWebDistTkgkickstartuiVsphere6ba76e3c33e72aa6f29eSvg, Children: map[string]*bintree{}}, - "welcome-intro.92f405173016654f68c9.svg": {Func: bindataTkgWebDistTkgkickstartuiWelcomeintro92f405173016654f68c9Svg, Children: map[string]*bintree{}}, - }}, - }}, - }}, - }}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} diff --git a/tkg/manifest/telemetry/config-aws.yaml b/tkg/manifest/telemetry/config-aws.yaml deleted file mode 100644 index 06225026ae..0000000000 --- a/tkg/manifest/telemetry/config-aws.yaml +++ /dev/null @@ -1,80 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: tkg-system-telemetry - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tkg-telemetry-sa - namespace: tkg-system-telemetry - ---- -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: tkg-telemetry-cluster-role -rules: - - apiGroups: [""] - resources: ["secrets", "namespaces", "configmaps"] - verbs: ["get", "list"] - - apiGroups: ["cluster.x-k8s.io"] - resources: ["clusters", "machinedeployments"] - verbs: ["get", "list"] - - apiGroups: ["infrastructure.cluster.x-k8s.io"] - resources: ["awsclusters", "awsmachinetemplates"] - verbs: ["get", "list"] - - apiGroups: ["controlplane.cluster.x-k8s.io"] - resources: ["kubeadmcontrolplanes"] - verbs: ["get", "list"] - ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: tkg-telemetry-cluster-role-binding -subjects: - - kind: ServiceAccount - name: tkg-telemetry-sa - namespace: tkg-system-telemetry -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tkg-telemetry-cluster-role - ---- -apiVersion: batch/v1 -kind: CronJob -metadata: - name: tkg-telemetry - namespace: tkg-system-telemetry - labels: - cluster.x-k8s.io/cluster-name: '%s' -spec: - schedule: "0 */6 * * *" - concurrencyPolicy: Replace - failedJobsHistoryLimit: 10 - jobTemplate: - spec: - template: - spec: - serviceAccount: tkg-telemetry-sa - activeDeadlineSeconds: 3600 - containers: - - name: tkg-telemetry - image: '%s' - command: - - /tkg-telemetry - - --sonobuoy-bin-path=/sonobuoy - - --datastore-url=%s - - --labels=%s - env: - - name: HTTP_PROXY - value: '%s' - - name: HTTPS_PROXY - value: '%s' - - name: NO_PROXY - value: '%s' - restartPolicy: Never diff --git a/tkg/manifest/telemetry/config-azure.yaml b/tkg/manifest/telemetry/config-azure.yaml deleted file mode 100644 index f978adfffa..0000000000 --- a/tkg/manifest/telemetry/config-azure.yaml +++ /dev/null @@ -1,83 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: tkg-system-telemetry - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tkg-telemetry-sa - namespace: tkg-system-telemetry - ---- -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: tkg-telemetry-cluster-role -rules: - - apiGroups: [""] - resources: ["secrets", "namespaces", "configmaps"] - verbs: ["get", "list"] - - apiGroups: ["cluster.x-k8s.io"] - resources: ["clusters"] - verbs: ["get", "list"] - - apiGroups: ["cluster.x-k8s.io"] - resources: ["clusters", "machinedeployments"] - verbs: ["get", "list"] - - apiGroups: ["infrastructure.cluster.x-k8s.io"] - resources: ["azuremachines", "azureclusters", "azuremachinetemplates"] - verbs: ["get", "list"] - - apiGroups: ["controlplane.cluster.x-k8s.io"] - resources: ["kubeadmcontrolplanes"] - verbs: ["get", "list"] - ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: tkg-telemetry-cluster-role-binding -subjects: - - kind: ServiceAccount - name: tkg-telemetry-sa - namespace: tkg-system-telemetry -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tkg-telemetry-cluster-role - ---- -apiVersion: batch/v1 -kind: CronJob -metadata: - name: tkg-telemetry - namespace: tkg-system-telemetry - labels: - cluster.x-k8s.io/cluster-name: '%s' -spec: - schedule: "0 */6 * * *" - concurrencyPolicy: Replace - failedJobsHistoryLimit: 10 - jobTemplate: - spec: - template: - spec: - serviceAccount: tkg-telemetry-sa - activeDeadlineSeconds: 3600 - containers: - - name: tkg-telemetry - image: '%s' - command: - - /tkg-telemetry - - --sonobuoy-bin-path=/sonobuoy - - --datastore-url=%s - - --labels=%s - env: - - name: HTTP_PROXY - value: '%s' - - name: HTTPS_PROXY - value: '%s' - - name: NO_PROXY - value: '%s' - restartPolicy: Never diff --git a/tkg/manifest/telemetry/config-docker.yaml b/tkg/manifest/telemetry/config-docker.yaml deleted file mode 100644 index 065537f5a0..0000000000 --- a/tkg/manifest/telemetry/config-docker.yaml +++ /dev/null @@ -1,83 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: tkg-system-telemetry - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tkg-telemetry-sa - namespace: tkg-system-telemetry - ---- -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: tkg-telemetry-cluster-role -rules: - - apiGroups: [""] - resources: ["secrets", "namespaces", "configmaps"] - verbs: ["get", "list"] - - apiGroups: ["cluster.x-k8s.io"] - resources: ["clusters"] - verbs: ["get", "list"] - - apiGroups: ["cluster.x-k8s.io"] - resources: ["clusters", "machinedeployments"] - verbs: ["get", "list"] - - apiGroups: ["infrastructure.cluster.x-k8s.io"] - resources: ["dockermachines", "dockerclusters", "dockermachinetemplates"] - verbs: ["get", "list"] - - apiGroups: ["controlplane.cluster.x-k8s.io"] - resources: ["kubeadmcontrolplanes"] - verbs: ["get", "list"] - ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: tkg-telemetry-cluster-role-binding -subjects: - - kind: ServiceAccount - name: tkg-telemetry-sa - namespace: tkg-system-telemetry -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tkg-telemetry-cluster-role - ---- -apiVersion: batch/v1 -kind: CronJob -metadata: - name: tkg-telemetry - namespace: tkg-system-telemetry - labels: - cluster.x-k8s.io/cluster-name: '%s' -spec: - schedule: "0 */6 * * *" - concurrencyPolicy: Replace - failedJobsHistoryLimit: 10 - jobTemplate: - spec: - template: - spec: - serviceAccount: tkg-telemetry-sa - activeDeadlineSeconds: 3600 - containers: - - name: tkg-telemetry - image: '%s' - command: - - /tkg-telemetry - - --sonobuoy-bin-path=/sonobuoy - - --datastore-url=%s - - --labels=%s - env: - - name: HTTP_PROXY - value: '%s' - - name: HTTPS_PROXY - value: '%s' - - name: NO_PROXY - value: '%s' - restartPolicy: Never diff --git a/tkg/manifest/telemetry/config-vsphere.yaml b/tkg/manifest/telemetry/config-vsphere.yaml deleted file mode 100644 index 27e75b6432..0000000000 --- a/tkg/manifest/telemetry/config-vsphere.yaml +++ /dev/null @@ -1,83 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: tkg-system-telemetry - ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: tkg-telemetry-sa - namespace: tkg-system-telemetry - ---- -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: tkg-telemetry-cluster-role -rules: - - apiGroups: [""] - resources: ["secrets", "namespaces", "configmaps"] - verbs: ["get", "list"] - - apiGroups: ["cluster.x-k8s.io"] - resources: ["clusters"] - verbs: ["get", "list"] - - apiGroups: ["cluster.x-k8s.io"] - resources: ["clusters", "machinedeployments"] - verbs: ["get", "list"] - - apiGroups: ["infrastructure.cluster.x-k8s.io"] - resources: ["vspheremachines", "vsphereclusters", "vspheremachinetemplates"] - verbs: ["get", "list"] - - apiGroups: ["controlplane.cluster.x-k8s.io"] - resources: ["kubeadmcontrolplanes"] - verbs: ["get", "list"] - ---- -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: tkg-telemetry-cluster-role-binding -subjects: - - kind: ServiceAccount - name: tkg-telemetry-sa - namespace: tkg-system-telemetry -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: tkg-telemetry-cluster-role - ---- -apiVersion: batch/v1 -kind: CronJob -metadata: - name: tkg-telemetry - namespace: tkg-system-telemetry - labels: - cluster.x-k8s.io/cluster-name: '%s' -spec: - schedule: "0 */6 * * *" - concurrencyPolicy: Replace - failedJobsHistoryLimit: 10 - jobTemplate: - spec: - template: - spec: - serviceAccount: tkg-telemetry-sa - activeDeadlineSeconds: 3600 - containers: - - name: tkg-telemetry - image: '%s' - command: - - /tkg-telemetry - - --sonobuoy-bin-path=/sonobuoy - - --datastore-url=%s - - --labels=%s - env: - - name: HTTP_PROXY - value: '%s' - - name: HTTPS_PROXY - value: '%s' - - name: NO_PROXY - value: '%s' - restartPolicy: Never diff --git a/tkg/manifest/telemetry/zz_generated.bindata.go b/tkg/manifest/telemetry/zz_generated.bindata.go deleted file mode 100644 index a29b3163fa..0000000000 --- a/tkg/manifest/telemetry/zz_generated.bindata.go +++ /dev/null @@ -1,398 +0,0 @@ -// Code generated by go-bindata. DO NOT EDIT. -// sources: -// tkg/manifest/telemetry/config-aws.yaml -// tkg/manifest/telemetry/config-azure.yaml -// tkg/manifest/telemetry/config-docker.yaml -// tkg/manifest/telemetry/config-vsphere.yaml -// tkg/manifest/telemetry/zz_generated.bindata.go - -package telemetry - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info fileInfoEx -} - -type fileInfoEx interface { - os.FileInfo - MD5Checksum() string -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time - md5checksum string -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) MD5Checksum() string { - return fi.md5checksum -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _bindataTkgManifestTelemetryConfigawsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x54\xdd\x6a\x1b\x4d\x0c\xbd\xdf\xa7\x10\x86\x10\x08\xdf\xda\x0e\x1f\x84\xb2\x90\x8b\x36\x85\x86\x50\x92\xe0\x84\xd2\x52\x4a\xd1\xce\xca\xf6\xc4\xf3\xb3\x8c\x34\x9b\xba\x4f\x5f\x66\xbd\x0e\xfe\x8d\x9d\x42\xc7\x57\x3b\x92\xce\x39\xd2\x1c\x39\xcf\xf3\x0c\x6b\xfd\x85\x02\x6b\xef\x0a\x68\xce\xb3\x99\x76\x55\x01\xb7\x68\x89\x6b\x54\x94\x59\x12\xac\x50\xb0\xc8\x00\x1c\x5a\x2a\x40\x66\x93\x9c\xe7\x2c\x64\x73\x21\x43\x96\x24\xcc\xb3\x6c\x2f\xd4\x03\x85\x46\x2b\x7a\xaf\x94\x8f\x4e\xf6\xe0\xbd\x00\xe5\x8c\x5d\xa0\xa5\x7f\x8d\x6d\x01\x7f\x65\x22\x0b\x85\x91\x37\xb4\xc6\x1f\x4a\x54\x7d\x8c\x32\xf5\x41\xff\x46\xd1\xde\xf5\x67\xef\xb8\xaf\xfd\xa0\x39\x3f\x28\x42\x2d\x40\xf3\x90\x50\x43\x34\xc4\x29\x33\x07\xac\xf5\xa7\xe0\x63\xcd\x05\x7c\xef\xf5\x7e\x64\x00\x00\x81\xd8\xc7\xa0\xa8\xbd\x63\x52\x81\x84\x7b\xff\x41\xef\xa5\x87\xf6\x4b\x79\x37\xd6\x13\x8b\x35\x77\x65\x0d\x85\xb2\x2d\x99\x90\xa4\x04\xa3\x59\xda\xd0\x06\x4b\x27\xa5\xff\x2b\x5f\xc8\xdf\xc5\xda\xe5\xb4\x44\x16\xd5\x54\x3b\xaa\xa8\x36\x7e\x6e\xc9\xc9\x5b\x09\xb5\x1b\x07\x64\x09\x51\x49\x0c\xd4\x3f\x86\x1f\x9f\x79\x55\x02\x3e\x73\xa7\x42\xc8\xd6\x06\x85\xde\xdc\xb4\x77\x12\xbc\xa9\x0d\xba\xe3\x14\xcc\x62\x49\x58\xd9\xd5\xba\x03\x9c\xbb\x2d\xf4\x41\xbb\x4a\xbb\xc9\xbf\x71\x52\x5e\x76\xe8\x1c\xcb\x27\x52\xd2\x99\x6a\xe7\x9a\x24\xe5\x7b\xd7\xe3\xf0\x82\x24\xba\x11\x8d\x13\xc1\x72\xb0\xaf\x34\x92\x01\x6c\x2f\xd3\x11\x9b\xb1\xb5\xf4\x25\x8a\x9a\x0e\x5e\x56\xff\x2a\x78\x77\xe3\xcb\x43\x43\x3a\x62\xe1\x01\x0c\x96\x64\xda\x89\x01\x6c\x3a\x62\xb0\x54\xb5\x00\x3f\x3d\xe1\xd3\x8c\x6b\x52\x29\x9b\xd5\x94\xaa\x68\xa8\x80\xde\x10\xce\x06\x17\x70\x96\x7e\xbd\x0c\x40\x79\xa7\x62\x08\xe4\xd4\xfc\xde\x1b\xad\xe6\x05\x8c\xa8\x36\xe9\x4f\x0f\x60\x8c\xda\x50\x75\xe3\x4b\xbe\xd6\x2c\x3e\xcc\x3f\x6b\xab\xa5\x80\xf3\x61\x06\xf0\xe4\xcb\xc7\xce\xd9\x0b\x41\x4b\xb2\x74\x64\x2d\xb2\x19\x6d\xbf\xd7\x9e\x7a\xcf\x0b\x2f\x0e\x2a\xd1\x0d\x7d\x24\xac\x8c\x76\xf4\x40\xca\xbb\x8a\x0b\xf8\xff\x62\x38\x5c\xc9\x4a\xb6\x47\xed\x28\xf0\x2a\x4d\xf2\xd6\xee\x69\xaf\x1e\x6d\x71\xb2\x9c\xd9\x7a\x44\x79\x6b\xd1\x55\xc5\xc6\x75\x82\x1d\xbc\x86\x98\x12\xf2\x9c\xbd\xf3\x65\xf4\xf3\x64\xfa\xbc\x46\x99\x5e\x0e\x96\x57\x3b\xf3\x93\x3f\xd2\xa0\x29\x8f\xc1\x5c\x9e\xf0\xce\xa4\x85\x09\xb6\xa3\xe4\x9a\x4d\x99\xcb\xde\xaf\x1f\x1f\xef\x7f\xde\x8f\xee\xbe\x7e\xdb\x42\x6c\xd0\xc4\xdd\xad\xaf\x16\x3f\xfc\x75\xf5\xed\xdd\x9b\x4a\x03\xb1\x60\x90\xa5\x17\x6f\xa9\xa1\x90\xfd\x09\x00\x00\xff\xff\x98\x14\x16\x27\xa2\x07\x00\x00") - -func bindataTkgManifestTelemetryConfigawsYamlBytes() ([]byte, error) { - return bindataRead( - _bindataTkgManifestTelemetryConfigawsYaml, - "tkg/manifest/telemetry/config-aws.yaml", - ) -} - -func bindataTkgManifestTelemetryConfigawsYaml() (*asset, error) { - bytes, err := bindataTkgManifestTelemetryConfigawsYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/manifest/telemetry/config-aws.yaml", - size: 1954, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgManifestTelemetryConfigazureYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x54\x5d\x6b\x1b\x3b\x10\x7d\xdf\x5f\x31\x18\x42\x20\x44\xb6\xc3\x85\x70\x59\xc8\xc3\xbd\x29\x34\x84\x92\x04\x27\x94\x96\x52\xca\xac\x76\x6c\x2b\xd6\xc7\x22\x8d\x96\x3a\xbf\xbe\x68\xbd\x0e\x6b\x7b\x1d\x3b\x85\x68\x9f\x56\x33\x73\xce\xd1\xe8\x8c\x84\x10\x19\x56\xea\x2b\xf9\xa0\x9c\xcd\xa1\xbe\xc8\x16\xca\x96\x39\xdc\xa1\xa1\x50\xa1\xa4\xcc\x10\x63\x89\x8c\x79\x06\x60\xd1\x50\x0e\xbc\x98\x89\xb0\x0c\x4c\x46\x30\x69\x32\xc4\x7e\x99\x65\x7b\xa1\x1e\xc9\xd7\x4a\xd2\x7f\x52\xba\x68\x79\x0f\xde\x2b\x90\x08\xd8\x06\x1a\xfa\xb7\xd8\x56\xf0\xd7\x3a\x06\x26\x3f\x71\x9a\x36\xf8\x7d\x81\x72\x88\x91\xe7\xce\xab\x17\x64\xe5\xec\x70\xf1\x6f\x18\x2a\x37\xaa\x2f\x0e\x8a\x90\x2b\x50\xe1\x13\xaa\x8f\x9a\x42\xca\x14\x80\x95\xfa\xec\x5d\xac\x42\x0e\x3f\x06\x83\x9f\x19\x00\x80\xa7\xe0\xa2\x97\xd4\xec\x05\x92\x9e\x38\x0c\xce\x61\xf0\x7a\x86\xe6\x4f\x3a\x3b\x55\x33\x83\x55\x68\xcb\x6a\xf2\x45\x53\x32\x23\x4e\x09\x5a\x05\x6e\x42\x5b\x2c\xad\x94\xe1\x6f\xb1\x92\xdf\xc7\xda\xe6\x7c\x28\xf4\x39\x0c\x0c\xca\xb9\xb2\x54\x52\xa5\xdd\xd2\x90\xe5\xf7\x12\x2a\x3b\xf5\x18\xd8\x47\xc9\xd1\xd3\xf0\x18\x7e\x7c\x89\x9e\x5a\xe2\x46\x44\xb3\xd1\x55\xd5\xcd\x60\x32\x95\x46\xa6\x77\x77\xc2\x59\xf6\x4e\x57\x1a\xed\x71\xb2\x16\xb1\x20\x2c\x4d\xb7\xee\x00\x67\xbf\x65\xff\x57\xb6\x54\x76\xf6\x31\xce\x15\x45\x8b\x1e\x62\xf1\x4c\x92\x5b\x13\xf7\x8e\x65\x52\xbe\x77\x1c\x0f\x0f\x64\xa2\x9b\xd0\x34\x11\xac\x1b\xfb\xc6\x41\x32\x80\xdd\xe1\x3d\x62\x12\x77\x1e\x99\x02\x59\xce\x47\xaf\x4f\xcd\xb5\x77\xf6\xd6\x15\x87\x9a\x74\xc4\x03\x03\xa0\xb1\x20\xdd\x74\x0c\x60\xdb\x11\xa3\xb5\xaa\x15\xf8\xe9\x49\x38\xcd\x42\x45\x32\x65\x07\x39\xa7\x32\x6a\xca\x61\x30\x86\xb3\xd1\x25\x9c\xa5\x6f\x90\x01\x48\x67\x65\xf4\x9e\xac\x5c\x3e\x38\xad\xe4\x32\x87\x09\x55\x3a\x3d\xb2\x00\x53\x54\x9a\xca\x5b\x57\x84\x1b\x15\xd8\xf9\xe5\x17\x65\x14\xe7\x70\x31\xce\x00\x9e\x5d\xf1\xd4\x3a\x7b\x25\x68\x4d\x96\x16\x6f\x44\xb6\xa3\xcd\xff\xc6\x55\xef\xb9\xe1\xd5\x42\xc9\xaa\xa6\x4f\x84\xa5\x56\x96\x1e\x49\x3a\x5b\x86\x1c\xfe\xb9\x1c\x8f\x3b\x59\xc9\xf6\xa8\x2c\xf9\xd0\xa5\x49\xde\xea\xef\x76\x77\x29\x83\xb3\x75\xcf\x36\x23\xd2\x19\x83\xb6\xcc\xb7\xb6\x13\xec\xe8\x2d\xc4\x94\x20\x44\x70\xd6\x15\xd1\x2d\x93\xe9\x45\x85\x3c\xbf\x1a\xad\xb7\x7a\xf3\x93\x3f\x52\xa3\x49\x44\xaf\xaf\x4e\x42\x6f\xd2\xca\x04\xbb\x51\xb2\xf5\xb6\xcc\xf5\xd9\x6f\x9e\x9e\x1e\x7e\x3d\x4c\xee\xbf\x7d\xdf\x41\xac\x51\xc7\xfe\xa3\x77\x8b\x1f\xff\xba\xfa\xee\xfe\x5d\xa5\x9e\x02\xa3\xe7\xb5\x17\xef\xa8\x26\x9f\xfd\x09\x00\x00\xff\xff\x6c\x1a\xb7\x24\x12\x08\x00\x00") - -func bindataTkgManifestTelemetryConfigazureYamlBytes() ([]byte, error) { - return bindataRead( - _bindataTkgManifestTelemetryConfigazureYaml, - "tkg/manifest/telemetry/config-azure.yaml", - ) -} - -func bindataTkgManifestTelemetryConfigazureYaml() (*asset, error) { - bytes, err := bindataTkgManifestTelemetryConfigazureYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/manifest/telemetry/config-azure.yaml", - size: 2066, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgManifestTelemetryConfigdockerYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x54\xdd\x6a\x1b\x3d\x10\xbd\xdf\xa7\x18\x0c\x21\x10\x22\xdb\xe1\x83\xf0\xb1\x90\x8b\x36\x85\x86\x50\x92\xe0\x84\xd2\x52\x4a\x99\xd5\x8e\x6d\xc5\xfa\x59\xa4\xd1\x52\xf7\xe9\x8b\x76\xd7\xc1\x3f\xeb\xd8\x29\x44\x7b\xb5\x9a\x99\x73\x8e\x46\x67\x24\x84\xc8\xb0\x52\x5f\xc9\x07\xe5\x6c\x0e\xf5\x45\xb6\x50\xb6\xcc\xe1\x0e\x0d\x85\x0a\x25\x65\x86\x18\x4b\x64\xcc\x33\x00\x8b\x86\x72\xe0\xc5\x4c\x84\x65\x60\x32\x82\x49\x93\x21\xf6\xcb\x2c\xdb\x0b\xf5\x48\xbe\x56\x92\x3e\x48\xe9\xa2\xe5\x3d\x78\x2f\x40\x22\x60\x17\x68\xe8\x5f\x63\x6b\xe1\xaf\x75\x0c\x4c\x7e\xe2\x34\x6d\xf0\xfb\x02\xe5\x10\x23\xcf\x9d\x57\x7f\x90\x95\xb3\xc3\xc5\xff\x61\xa8\xdc\xa8\xbe\x38\x28\x42\xb6\xa0\xc2\x27\x54\x1f\x35\x85\x94\x29\x00\x2b\xf5\xd9\xbb\x58\x85\x1c\x7e\x0c\x06\x3f\x33\x00\x00\x4f\xc1\x45\x2f\xa9\xd9\x0b\x24\x3d\x71\x18\x9c\xc3\xe0\xe5\x0c\xcd\x9f\x74\x76\xaa\x66\x06\xab\xd0\x95\xd5\xe4\x8b\xa6\x64\x46\x9c\x12\xb4\x0a\xdc\x84\xb6\x58\x3a\x29\xc3\xdf\xa2\x95\xdf\xc7\xda\xe5\xbc\x2b\xf4\x39\x0c\x0c\xca\xb9\xb2\x54\x52\xa5\xdd\xd2\x90\xe5\xb7\x12\x2a\x3b\xf5\x18\xd8\x47\xc9\xd1\xd3\xf0\x18\xfe\xd2\xc9\x05\xf9\x8e\xb9\x51\xd1\xee\xac\xeb\xda\xc8\x61\x32\x95\x46\xa6\x37\x37\xc3\x59\xf6\x4e\x57\x1a\xed\x71\xca\x16\xb1\x20\x2c\xcd\x7a\xdd\x01\xce\x7e\xd7\x7e\x54\xb6\x54\x76\xf6\x3e\xe6\x15\x45\x87\x1e\x62\xf1\x4c\x92\x3b\x1f\xf7\x4e\x66\x52\xbe\x77\x22\x0f\xcf\x64\xa2\x9b\xd0\x34\x11\xac\x1a\xfb\xca\x41\x32\x80\xdd\xf9\x3d\x62\x18\x77\xde\x99\x02\x59\xce\x47\x2f\xaf\xcd\xb5\x77\xf6\xd6\x15\x87\x9a\x74\xc4\x1b\x03\xa0\xb1\x20\xdd\x74\x0c\x60\xdb\x11\xa3\x95\xaa\x16\xfc\xf4\x24\x9c\x66\xa1\x22\x99\xb2\x83\x9c\x53\x19\x35\xe5\x30\x18\xc3\xd9\xe8\x12\xce\xd2\x37\xc8\x00\xa4\xb3\x32\x7a\x4f\x56\x2e\x1f\x9c\x56\x72\x99\xc3\x84\x2a\x9d\xde\x59\x80\x29\x2a\x4d\xe5\xad\x2b\xc2\x8d\x0a\xec\xfc\xf2\x8b\x32\x8a\x73\xb8\x18\x67\x00\xcf\xae\x78\xea\x9c\xdd\x0a\x5a\x91\xa5\xc5\x1b\x91\xed\x68\xf3\xbf\x71\xd5\x7b\x6e\xb8\x5d\x28\x59\xd5\xf4\x89\xb0\xd4\xca\xd2\x23\x49\x67\xcb\x90\xc3\x7f\x97\xe3\xf1\x5a\x56\xb2\x3d\x2a\x4b\x3e\xac\xd3\x24\x6f\xf5\x77\x7b\x7d\x29\x83\xb3\x55\xcf\x36\x23\xd2\x19\x83\xb6\xcc\xb7\xb6\x13\xec\xe8\x35\xc4\x94\x20\x44\x70\xd6\x15\xd1\x2d\x93\xe9\x45\x85\x3c\xbf\x1a\xad\xb6\x7a\xf3\x93\x3f\x52\xa3\x49\x44\xaf\xaf\x4e\x42\x6f\x52\x6b\x82\xdd\x28\xd9\x7a\x5b\xe6\xea\xec\x37\x4f\x4f\x0f\xbf\x1e\x26\xf7\xdf\xbe\xef\x20\xd6\xa8\x63\xff\xd1\xd7\x8b\x1f\xff\xb9\xfa\xee\xfe\x4d\xa5\x9e\x02\xa3\xe7\x95\x17\xef\xa8\x26\x9f\xfd\x0d\x00\x00\xff\xff\x34\xb1\xf5\xd5\x15\x08\x00\x00") - -func bindataTkgManifestTelemetryConfigdockerYamlBytes() ([]byte, error) { - return bindataRead( - _bindataTkgManifestTelemetryConfigdockerYaml, - "tkg/manifest/telemetry/config-docker.yaml", - ) -} - -func bindataTkgManifestTelemetryConfigdockerYaml() (*asset, error) { - bytes, err := bindataTkgManifestTelemetryConfigdockerYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/manifest/telemetry/config-docker.yaml", - size: 2069, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgManifestTelemetryConfigvsphereYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x54\xdd\x6a\x1b\x3d\x10\xbd\xdf\xa7\x18\x0c\x21\x10\x22\xdb\xe1\x83\xf0\xb1\x90\x8b\x36\x85\x86\x50\x92\xe0\x84\xd2\x52\x4a\x99\xd5\x8e\x6d\xc5\xfa\x59\xa4\xd1\x52\xf7\xe9\x8b\xd6\xbb\xc1\x3f\xeb\xd8\x29\x44\x7b\xb5\x9a\x99\x73\x8e\x46\x67\x24\x84\xc8\xb0\x52\x5f\xc9\x07\xe5\x6c\x0e\xf5\x45\xb6\x50\xb6\xcc\xe1\x0e\x0d\x85\x0a\x25\x65\x86\x18\x4b\x64\xcc\x33\x00\x8b\x86\x72\xe0\xc5\x4c\x84\x65\x60\x32\x82\x49\x93\x21\xf6\xcb\x2c\xdb\x0b\xf5\x48\xbe\x56\x92\x3e\x48\xe9\xa2\xe5\x3d\x78\x2f\x40\x22\x60\x1b\x68\xe8\x5f\x63\x5b\xc1\x5f\xeb\x18\x98\xfc\xc4\x69\xda\xe0\xf7\x05\xca\x21\x46\x9e\x3b\xaf\xfe\x20\x2b\x67\x87\x8b\xff\xc3\x50\xb9\x51\x7d\x71\x50\x84\x5c\x81\x0a\x9f\x50\x7d\xd4\x14\x52\xa6\x00\xac\xd4\x67\xef\x62\x15\x72\xf8\x31\x18\xfc\xcc\x00\x00\x3c\x05\x17\xbd\xa4\x66\x2f\x90\xf4\xc4\x61\x70\x0e\x83\x97\x33\x34\x7f\xd2\xd9\xa9\x9a\x19\xac\x42\x5b\x56\x93\x2f\x9a\x92\x19\x71\x4a\xd0\x2a\x70\x13\xda\x62\x69\xa5\x0c\x7f\x8b\x95\xfc\x3e\xd6\x36\xe7\x5d\xa1\xcf\x61\x60\x50\xce\x95\xa5\x92\x2a\xed\x96\x86\x2c\xbf\x95\x50\xd9\xa9\xc7\xc0\x3e\x4a\x8e\x9e\x86\xc7\xf0\xd7\xa1\x9a\x93\xa7\x96\xba\x91\xd1\x6e\xad\x2b\xdb\xcc\x62\x32\x95\x46\xa6\x37\xf7\xc3\x59\xf6\x4e\x57\x1a\xed\x71\xe2\x16\xb1\x20\x2c\xcd\x7a\xdd\x01\xce\x7e\xe3\x7e\x54\xb6\x54\x76\xf6\x3e\xfe\x15\x45\x8b\x1e\x62\xf1\x4c\x92\x5b\x2b\xf7\x0e\x67\x52\xbe\x77\x28\x0f\x8f\x65\xa2\x9b\xd0\x34\x11\x74\x8d\x7d\xe5\x20\x19\xc0\xee\x08\x1f\x31\x8f\x3b\x4f\x4d\x81\x2c\xe7\xa3\x97\x07\xe7\xda\x3b\x7b\xeb\x8a\x43\x4d\x3a\xe2\x99\x01\xd0\x58\x90\x6e\x3a\x06\xb0\xed\x88\x51\xa7\x6a\x05\x7e\x7a\x12\x4e\xb3\x50\x91\x4c\xd9\x41\xce\xa9\x8c\x9a\x72\x18\x8c\xe1\x6c\x74\x09\x67\xe9\x1b\x64\x00\xd2\x59\x19\xbd\x27\x2b\x97\x0f\x4e\x2b\xb9\xcc\x61\x42\x95\x4e\x4f\x2d\xc0\x14\x95\xa6\xf2\xd6\x15\xe1\x46\x05\x76\x7e\xf9\x45\x19\xc5\x39\x5c\x8c\x33\x80\x67\x57\x3c\xb5\xce\x5e\x09\xea\xc8\xd2\xe2\x8d\xc8\x76\xb4\xf9\xdf\xb8\xea\x3d\x37\xbc\x5a\x28\x59\xd5\xf4\x89\xb0\xd4\xca\xd2\x23\x49\x67\xcb\x90\xc3\x7f\x97\xe3\xf1\x5a\x56\xb2\x3d\x2a\x4b\x3e\xac\xd3\x24\x6f\xf5\x77\x7b\x7d\x29\x83\xb3\xae\x67\x9b\x11\xe9\x8c\x41\x5b\xe6\x5b\xdb\x09\x76\xf4\x1a\x62\x4a\x10\x22\x38\xeb\x8a\xe8\x96\xc9\xf4\xa2\x42\x9e\x5f\x8d\xba\xad\xde\xfc\xe4\x8f\xd4\x68\x12\xd1\xeb\xab\x93\xd0\x9b\xb4\x32\xc1\x6e\x94\x6c\xbd\x2d\xb3\x3b\xfb\xcd\xd3\xd3\xc3\xaf\x87\xc9\xfd\xb7\xef\x3b\x88\x35\xea\xd8\x7f\xf4\xf5\xe2\xc7\x7f\xae\xbe\xbb\x7f\x53\xa9\xa7\xc0\xe8\xb9\xf3\xe2\x1d\xd5\xe4\xb3\xbf\x01\x00\x00\xff\xff\xeb\x0f\x9c\x9a\x18\x08\x00\x00") - -func bindataTkgManifestTelemetryConfigvsphereYamlBytes() ([]byte, error) { - return bindataRead( - _bindataTkgManifestTelemetryConfigvsphereYaml, - "tkg/manifest/telemetry/config-vsphere.yaml", - ) -} - -func bindataTkgManifestTelemetryConfigvsphereYaml() (*asset, error) { - bytes, err := bindataTkgManifestTelemetryConfigvsphereYamlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/manifest/telemetry/config-vsphere.yaml", - size: 2072, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -var _bindataTkgManifestTelemetryZzgeneratedBindataGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x9a\x5b\x6f\x23\x47\x92\x85\x9f\xc9\x5f\x51\x2b\x60\x06\xe4\x42\x23\xd5\xfd\x22\xc0\x2f\xd3\xf6\x02\x7e\xb0\x07\xd8\xed\x7d\x58\x6c\x2e\x8c\xac\xaa\x2c\x99\x68\x49\xd4\x92\x94\x9d\x2d\xc3\xff\x7d\xf1\x45\x44\x49\x6c\xf5\x4d\xea\xe9\x19\x60\xb0\x63\x80\x6e\x91\x55\x95\x19\x19\x71\x22\xe2\x9c\xcc\x3a\x3f\x4f\x5e\x6d\xc7\x90\x5c\x86\x9b\xb0\xf3\x87\x30\x26\xfd\xdb\xe4\x72\xfb\xa7\x7e\x73\x33\xfa\x83\x3f\x4b\xbe\xfd\x4b\xf2\xe3\x5f\x5e\x27\xdf\x7d\xfb\xfd\xeb\xb3\xe5\xf9\x79\xb2\xdf\xde\xed\x86\xb0\xbf\xe0\xef\xc3\x9b\xcb\xf3\x6b\x7f\xb3\x99\xc2\xfe\x70\x7e\x08\x57\xe1\x3a\x1c\x76\x6f\xcf\x87\xed\xcd\xb4\xb9\xfc\x93\xff\x75\x7f\xf6\xd6\x5f\x5f\x3d\xe3\xce\xfb\xbb\x5d\x78\xe6\xbd\xe3\x76\x78\x13\x76\xcf\xbc\xf9\x97\xfd\xed\xcf\xe1\xf3\x43\xdf\xdf\xff\xf4\xb0\xfe\xb3\x79\xe5\x97\xdb\xe5\xf2\xd6\x0f\x6f\xfc\x65\x48\x1e\x6e\x5d\x2e\x97\x9b\xeb\xdb\xed\xee\x90\xac\x96\x8b\x93\xfe\xed\x21\xec\x4f\x96\x8b\x93\x61\x7b\x7d\xbb\x0b\xfb\xfd\xf9\xe5\xfd\xe6\x96\x1f\xa6\xeb\x03\xff\x6c\xb6\xfa\xff\xf3\xcd\xf6\xee\xb0\xb9\xe2\xcb\x56\x1e\xb8\xf5\x87\x9f\xcf\xa7\xcd\x55\xe0\x0f\x7e\xd8\x1f\x76\x9b\x9b\x4b\xb9\x76\xd8\x5c\x87\x93\xe5\x7a\xb9\x9c\xee\x6e\x86\xc4\xcc\xf9\xf7\xe0\xc7\x15\x7f\x24\xff\xfd\x3f\x4c\x7b\x9a\xdc\xf8\xeb\x90\xe8\x63\xeb\x64\x35\xff\x1a\x76\xbb\xed\x6e\x9d\xfc\xb6\x5c\x5c\xde\xcb\xb7\xe4\xe2\x9b\x04\xab\xce\x7e\x0c\xbf\x32\x48\xd8\xad\xc4\x6c\xbe\xff\xf9\x6e\x9a\xc2\x4e\x86\x5d\xaf\x97\x8b\xcd\x24\x0f\xfc\xcb\x37\xc9\xcd\xe6\x8a\x21\x16\xbb\x70\xb8\xdb\xdd\xf0\xf5\x34\x99\xae\x0f\x67\xdf\x31\xfa\xb4\x3a\x61\xa0\xe4\x0f\xff\x7b\x91\xfc\xe1\x97\x13\xb5\x44\xe6\x5a\x2f\x17\xbf\x2f\x97\x8b\x5f\xfc\x2e\xe9\xef\xa6\x44\xe7\xd1\x49\x96\x8b\x9f\xd4\x9c\x6f\x92\xcd\xf6\xec\xd5\xf6\xf6\xed\xea\x8f\xfd\xdd\x74\x9a\x5c\xde\xaf\x97\x8b\xe1\xea\xbb\xd9\xd2\xb3\x57\x57\xdb\x7d\x58\xad\x97\x5f\xcb\x1e\x86\xd1\xf1\x3f\x32\x50\xd8\xed\xd4\x6e\xfb\xb1\xbf\x9b\xce\xfe\x8c\xe9\xab\xf5\x29\x77\x2c\x7f\x5f\x2e\x97\x87\xb7\xb7\x21\xf1\xfb\x7d\x38\xe0\xf3\xbb\xe1\xc0\x30\xb2\x40\x0b\xc8\x72\xb1\xb9\x99\xb6\x49\x42\x50\xbf\xbf\x99\xb6\xdf\x45\x9e\x93\xc7\x1e\x7f\x4a\x36\x37\x87\xb0\x9b\xfc\x10\x78\x7c\xbb\x3f\xfb\x37\xbb\xb4\x5c\xfc\xf0\x6d\xf5\xea\xe7\x30\xbc\xd9\xdf\x5d\xaf\xd6\x16\xd7\x87\x11\x0c\x04\xf3\xdd\x47\x26\x08\x0a\xec\x3f\x7b\x68\xb1\xdf\xdc\x3f\xfc\xb6\xb9\x39\xd4\xe5\x72\x71\x4d\x8e\xdb\x7f\x36\xed\x0f\xdb\x31\xc8\x85\xd7\x1b\x1b\x02\xe0\x9d\xf1\x6d\xb9\xb8\x1e\xab\xc1\xac\x39\xb2\x45\x00\xb9\x9a\x36\x4f\xed\x59\x27\x3f\xfa\xeb\xf0\x60\x36\x76\x99\x2f\xa7\xcd\x19\x16\x2e\x7f\xff\xc4\xb3\xff\xb1\xb9\xe7\x59\xb1\xf4\xdd\x47\x59\xc8\x27\x1f\x65\x0d\xab\xf5\xf1\x8a\xde\x1d\x80\x65\x7f\x6e\x00\x16\xbc\x5a\x3f\x2e\xfe\xbd\x11\xc4\x23\x9f\x1c\xe4\x03\xa1\x7b\x32\xca\xa3\x3b\x3f\x39\xd2\xf7\xfb\x6f\x37\xbb\xd5\x3a\xe9\xb7\xdb\xab\xe3\x11\xfc\xd5\xfe\x33\x3e\x7c\xbb\x57\x17\x2a\xba\x7e\xfb\xfd\xe8\x69\x83\x30\x59\xf9\x93\x3d\xf8\xfa\xcd\xe5\x0f\x56\x06\x5f\xcf\xa5\xed\x95\x94\x4c\xff\xeb\xfe\xbf\xfc\xf5\x55\xf2\x8d\xc1\x7a\x75\xe2\x62\x36\xb9\xd8\xf6\x2e\xa6\xad\x8b\x69\xfa\xe1\xcf\x34\xb9\xd8\x97\x2e\x56\xa5\x8b\xe3\xe8\x62\xed\x5d\xcc\x7a\x17\xcb\xd1\xc5\x74\x70\xb1\x1f\x5d\x1c\x27\x17\x7d\xe3\x62\x96\xba\xd8\xd6\xfa\x2f\x63\xf2\xfb\xe8\x5d\x4c\x83\xcd\x55\xba\xd8\xe7\x2e\x76\xa9\xce\x5b\xd4\x2e\xb6\x95\x3e\x53\xa5\x2e\x76\xb9\x8b\x21\xd5\xfb\xc6\xdc\xc5\x2a\x77\xb1\xf4\x2e\x8e\x99\x8b\x43\x70\x71\xf0\x2e\x4e\xb5\x8b\x43\xe9\xe2\x54\xb8\xd8\x17\x2e\xb6\x83\x8b\x45\xe9\x62\xd7\xbb\xd8\x7b\x17\xcb\xc9\xc5\x6a\x72\xb1\xae\xd5\x36\xe6\x9e\x82\x8b\xed\xe8\x62\x37\xba\x58\xe6\x2e\x0e\x8d\x8b\x55\xe3\x62\xd1\xeb\x9c\x8c\x5d\x74\x3a\x67\x36\xe8\xdf\xc3\xa4\x73\xb0\xc6\xba\x77\x71\x1a\xd5\xd6\x34\xd7\xef\x61\x72\x31\xf5\x2e\xd6\xad\x3e\x8f\x2d\x5d\xe7\x62\xc3\x5a\xb8\x2f\x73\xb1\x6f\xf4\x7a\xdb\xe9\x33\xf8\xb0\xc3\x97\x9d\x8b\x59\xee\xa2\x1f\x74\xdd\x7d\xea\xe2\x60\x31\x60\xfe\xca\xbb\x98\xb3\x96\x54\xd7\xd1\x31\xf6\xe0\x62\x68\x5c\xcc\xb1\xa7\x74\xb1\x29\x5c\xcc\x33\x17\x4b\xae\xd5\x2e\xe6\xa5\x8b\xc3\xa0\x76\xd4\x83\x8b\x39\xbe\x2f\x5d\x4c\x0b\xb5\xbb\xe4\x9e\xde\xc5\xc6\xbb\xe8\x27\xb5\xa3\x9d\x5c\x2c\x83\xfa\x14\xbf\x8b\xbf\x52\x17\x43\xa5\x7e\xad\x46\x17\x7d\xea\xa2\xaf\x5c\x6c\x26\xf5\x61\x3d\xea\xda\xf8\x5e\x57\x2e\xe6\xb9\x8b\x69\xaf\x73\x74\x99\x8b\x45\xa3\x78\x19\x6a\x8d\x39\xf1\x63\xdd\xcd\x68\xb1\xca\x5d\x9c\xb0\x27\x53\x6c\x61\x17\xf1\x1d\x83\xfe\x5e\x37\xea\xdb\xbe\x55\x3b\x27\xb3\x81\x98\x14\x93\x8b\x79\xab\x31\xcc\x47\xf5\x0f\x31\x02\x4f\xf8\x11\x5f\x80\x05\xf0\x91\x73\x3f\xf1\x6b\xd4\xcf\x8c\x0d\x46\x59\x67\x5d\xb8\x38\xb0\x0e\xd6\x35\xe8\x7c\x5c\x6f\x82\xfa\x76\xc6\x7e\x8b\x5d\xad\xe2\x45\xfc\xd0\xaa\x8f\x78\x1e\x6c\x72\x1d\xac\x36\xbd\xad\x25\xd3\xb1\xf0\x57\xdb\xa8\x5f\x4b\x7c\xde\xa9\x5f\x46\x7c\x52\x18\xf6\x99\xaf\x51\x1f\xa6\x86\xad\xde\xd6\x05\x8e\x58\x93\xc7\x96\xd2\x45\x5f\x28\x66\xc8\xa5\x11\xdb\x6c\xdc\xbc\xd1\xb9\x98\x9b\xd8\x82\xfb\xc1\xf2\x6e\xa8\xf4\x7e\x62\x49\x3c\xca\xd2\xc5\x0c\x5f\x57\x1a\x0f\xb0\xef\xbd\xae\x89\x3c\x94\xb5\x93\x63\x9d\x7e\x2a\xea\x42\xe7\x62\x5f\x69\xbe\xe3\x47\xf1\x0d\xd7\xc0\x5d\xa7\xb9\x01\xc6\x88\x4b\x6b\xf1\xee\x26\x5d\x6f\x65\xb9\x52\x04\xc5\x2a\xbe\x97\xdc\x6b\xd5\x0f\xa9\xe5\x3e\x71\x1f\x07\xb5\x11\x7f\x90\x17\xfd\xe0\xa2\xef\xd4\x2f\xe4\x74\x28\x5c\xcc\x0c\xdf\x75\xae\x73\x57\x8c\xd3\xe9\x7a\xb8\x27\xb5\x1c\xe9\x7b\xf5\xe1\x54\x6a\x3c\xf8\x0e\x06\xf9\x97\x75\xf5\xd8\x97\x69\xfc\xaa\xa0\xf9\x1a\x5a\xcd\xbb\xc1\x7c\xca\x35\x6a\x01\x71\xa0\xde\x91\x77\x9d\xd7\x1c\xc3\x9f\xc4\x7b\x6c\xd4\xae\x09\x9c\xe4\x7a\x0d\x3b\xb2\x4c\xf3\x84\x38\x0f\xe4\x49\xae\xf9\x0d\x96\xa5\x4e\xe5\x9a\x3f\x0f\x39\x5a\xe8\x33\x52\xbf\x32\xf5\x37\xb6\xe7\x60\xc8\xeb\xbc\xd4\x30\x6c\xad\x6a\x8b\xb5\x77\xb1\x69\xd5\x5f\xd8\x80\xdd\x60\x5f\xf0\xef\xd5\x47\x21\xd3\x79\x88\x11\xf5\x81\xd8\x81\x07\x6a\xd1\x3c\xff\x7c\x2f\xf6\x81\x09\xe6\x06\xf7\xc4\xb3\x18\x75\x8c\xd1\x6a\xac\xd4\xaf\x5c\xf3\x0a\x5b\xf1\x3b\x35\xc4\x5b\x0d\x04\x47\x6d\xaa\xf1\xa4\xfe\x53\x13\x89\x71\xd6\xb8\xd8\xa4\x6a\x03\x18\xeb\xad\x6f\x90\xbb\xe0\x04\x5c\x60\x03\xfd\x22\x94\x8a\xa7\x69\xb0\x71\xc0\x28\x76\xd4\x9a\xab\xd8\x31\xe3\x35\x74\x5a\xeb\x53\xea\x50\xaa\xd7\x58\x1f\x75\xa0\xa9\xd4\x2f\xe4\x48\x1f\x14\x6f\xd4\x4d\xb0\x08\x86\x58\x1f\xeb\xf1\xbd\xe5\xaa\xd5\x91\x3a\x53\x9b\x89\x29\xb6\xe0\x57\x72\x9f\xb5\x80\x35\xea\x1c\x98\x92\x71\x73\x17\x9b\x52\xfd\x0a\xde\xf8\x9e\x75\x5a\x1f\xc1\x18\xf8\xe8\x82\xd6\x5b\x7a\x09\xcf\x12\x6f\x62\x99\x5b\x4f\x03\xdf\xd4\x45\xb0\x43\x8d\x62\x0d\xe0\x51\xb0\x9b\x6a\xbf\x03\xb7\xe0\x80\xe7\xa7\x56\xe3\x8f\xbf\x8a\xd6\xc5\x6a\x50\x4c\x0b\xbe\xa9\x09\xe0\x61\xd4\x1a\xc9\x1a\xa4\x87\x90\x0b\xb9\xfa\x20\x90\xe3\x9d\x62\x31\x0b\x6a\x2b\xb9\x20\x3d\x79\xd0\x35\x62\x2f\xb5\xa2\xb1\x9e\x85\x9d\xe4\x32\xf5\x84\x9a\x8e\x6f\xc1\x7b\x36\x6a\x9e\x92\xf7\x5d\xab\x79\x3b\xd9\x38\xc4\x58\xfc\x69\x58\x96\xbf\xf9\xd7\xeb\x33\xd4\x7c\x72\x0b\x4c\xe3\x0f\xb0\x31\xf7\x63\xa9\xe7\x85\xc6\x88\x1c\xa4\xee\x82\x39\x7a\x15\xf9\xc4\x9a\xf1\xeb\x64\x18\xa3\x46\x4a\x5f\xee\xd4\x07\xd4\x4a\x62\xd7\xd9\xda\x99\x87\x38\x82\x27\x59\xb7\x7d\xa8\xd3\xf4\x30\x7e\x67\x6c\x7c\x03\x56\xc0\xe8\xd8\x6b\xad\x22\x47\xa8\xb7\x83\x71\x1f\xb0\x28\x63\xd4\x6a\x1f\x38\xc5\x1f\xf4\x0e\xfc\xce\x3d\x9d\xd5\x1b\xea\x11\xf9\x0c\x36\x3b\xeb\xa1\xe4\x42\x3d\x69\x6d\xf3\x99\xfe\x4e\x7f\xc3\xf6\x63\xbe\xc5\x47\x7c\x6a\x35\x5b\xea\x7c\xae\x35\x58\xef\x3b\x79\xa2\x22\x3f\xcb\xfb\x4c\xf7\x7c\x48\x4f\xce\xea\xe8\x48\x8f\x2e\x17\x8b\x67\x33\xca\xd3\xe5\x62\x71\xf2\xbc\x0d\x83\x93\xd3\xe5\x62\x2d\xaa\xeb\x65\xc6\x63\xf7\xbf\x8a\x46\x3b\xb6\x5b\x44\xda\x83\x14\x7e\xa1\x23\x3e\x27\x42\x1f\xb4\xa3\x88\xbf\xc7\xf1\x67\x66\xce\xfd\x08\xa0\x8b\xe4\x05\x6b\x17\x01\x77\x91\x64\x5d\x55\xf2\xed\x48\x3c\x5c\x24\x27\x72\x03\xba\xe6\xe2\x58\xf6\xac\xca\x3c\x5d\xdb\x15\xf4\xca\x85\xea\x99\xff\xbc\xd9\xc4\x55\x76\x9a\xc8\x35\xcc\xf4\xd8\xf8\x47\xf1\xd1\x6f\xe2\x98\x8b\xc4\xfc\xc3\x02\x2e\xe4\xff\x47\x52\xd8\x9f\xbe\x50\x3d\xdc\xdf\xed\xc2\x5f\xad\x1f\xe0\x93\xd4\x14\xea\x3a\xb9\x4e\x9f\x68\x4c\x3f\xc0\x5d\x8a\xcc\xc5\x6c\xe6\x77\xa9\xd6\x21\x72\x7a\x30\x0e\x4b\x1f\x81\x07\xc1\x21\xf8\x8d\x3a\x23\x3c\xaf\x54\x1e\x26\xbd\xb5\xd4\x7c\xa1\x37\x49\x5d\xc9\xb5\x8e\x7a\xab\xad\xd2\x77\x7b\xad\x87\xd4\x76\xf8\xab\x68\x83\x5a\xfb\x21\xb5\x9b\x3a\x50\xb7\x8f\xfa\x01\x9b\xe9\xf9\xd4\xbc\xc2\xb8\x2e\xd7\xe1\x3a\xf4\x64\x78\x26\x1c\x47\xfa\x44\xa6\x7c\x82\x5a\x8e\x4d\xac\x91\xbe\xc0\x7d\xc1\xeb\xdc\x53\xa7\x75\x8d\x5a\x09\x0f\xa5\x16\x30\x27\xeb\x22\xdf\xb1\x57\xec\xe9\x94\x1b\x71\x9d\x0f\xbd\x4d\xfe\x36\x2e\x94\x19\x97\xa5\xa7\x4b\xef\xe8\xb4\x7f\x51\x73\x46\xbb\x1f\xfb\xa9\xb9\x9d\xe9\x10\x7a\xbd\xf4\x5f\xab\xc3\x45\xaa\x3d\x01\x5e\x4e\x9d\xa3\xfe\x09\xef\x31\x9e\xc3\x7c\x99\xf1\x42\x7a\x9a\xe8\xb1\x5c\x6b\x27\xbe\xed\xad\xff\xcb\xdc\x56\x4f\x59\x63\x37\x6b\xc0\xd6\x78\x80\xb7\xfa\xdf\xe8\x6f\x95\xf5\x59\xc6\xc4\xef\xdc\x93\x5b\x5d\xa5\x27\x51\xbf\xe9\xf3\xf4\x3c\xd1\x0e\xc6\xa5\xda\x56\x75\x46\xb0\xbe\x4c\x0f\xcf\x8c\x9b\xc2\xcd\xc2\xa0\x38\x99\x32\xad\xb5\xe0\x89\x3e\x08\xff\x86\xab\xcc\x3d\x58\xb8\x55\x6a\xbc\x39\x55\xae\x03\x67\xe3\x1e\xfa\x81\xf4\x0f\xc3\x0e\x75\x18\x8e\xd0\x55\xba\x86\x30\x6b\xa3\x41\xef\x61\x3c\xec\x16\x4e\x5b\x28\x2e\x32\xab\xe9\x3c\x37\xeb\x0e\x6a\x78\xd7\x28\xc7\x61\x0c\x38\x0d\x98\xa5\x9f\xd1\xcf\x89\x0b\x6b\x82\x87\xe0\x1b\x7a\x31\xfd\x15\xfe\x03\xd7\xc1\x4f\xe0\x8f\x7e\x0c\xe6\x98\xab\x32\x2c\xd2\xe3\xe0\xaa\xf4\xe0\x12\x8e\x5f\x68\x4c\xf3\x42\x35\x9e\xf0\x76\xaf\x73\xc2\xf3\xb1\x1b\x8e\x0f\x2f\xa2\xaf\x91\x2f\xc1\x7c\x46\xdf\xc2\x2e\xd1\x11\x8d\xe9\x88\x5a\xb5\x92\x70\x8b\x52\xb1\x89\xbd\x62\x33\x71\xed\x94\x47\x48\x9e\xe7\xda\xef\xe8\x87\xa3\xe9\x7d\x62\x33\x19\xbf\xcf\x6d\x1d\xf4\xcd\xcc\x30\x02\x77\x11\x8c\x19\xe7\x64\xfd\x5c\x03\x8f\xcc\x0b\x76\xf1\x13\x6b\x08\xb9\x62\x57\xea\x43\xf1\xc8\x51\xe0\xa4\xe4\x13\xf8\x67\xed\x9d\xe9\x5e\x5f\x2b\x57\xe6\x33\xe4\x5a\x43\x44\x9b\x05\xe5\x1d\x60\x33\x1c\x71\x21\x72\x10\x1f\x50\x83\xf0\x0f\x3c\x02\xdc\xc2\x11\x88\x29\x1a\xb5\x37\xfd\x4b\x7d\x63\x0c\xea\x94\xe8\xdc\x5a\xc7\x2e\x6c\xcf\x22\xab\x34\x1e\xd4\x49\xe1\x5c\xb9\x62\x93\xfc\xeb\x2c\x06\xe0\x0e\xdf\xb4\x41\xc7\x94\xbc\x0a\xa6\x87\x06\xcd\x2b\xe1\xb9\xa5\x61\xa8\x57\x5e\x42\xdd\x43\x3b\x80\x43\x6a\xea\xd4\x2b\x47\x83\xa3\xb2\x7e\xe1\xe3\xc6\xe3\xe1\xf3\xcc\x8d\xff\x65\x5c\xcb\xf3\xd4\xfc\x81\xad\xc4\x00\x7e\x03\xd6\xf0\x63\x6f\x1a\x95\xf5\x88\x76\x35\x5d\x4b\x6e\x34\xa6\xb3\xe1\x39\x7c\xa8\x67\xb3\xcf\x98\x93\xeb\xb2\x77\x92\x2a\x9f\x12\x3b\x0b\x1d\x93\x1c\x63\x2c\x72\x5b\x78\x7c\xa7\xf8\x1f\x6c\x7f\x06\x7f\x61\xbf\x68\xe3\x46\xb1\x46\x0e\xc9\x6f\x5e\xf1\x46\x8e\x14\xb6\xdf\x34\x63\x00\xcd\x44\x4d\x05\x7b\xe0\x58\x6a\x10\xbe\x6e\x35\x66\x33\x1f\x05\x47\xb2\xf7\x62\x9a\x80\xb9\x45\x67\x94\xe6\xb7\xc6\xf2\xa5\xb2\x9c\x33\x7e\x4f\xec\xc9\xab\xca\xf8\x25\x76\x10\x3f\xe2\x2f\xb5\xbe\xd7\x75\x81\x67\x6a\x7c\x98\x39\x5f\xa5\x35\x24\x98\x16\x9a\xb1\xc1\x78\x82\xe9\x51\x31\x21\x5a\xda\x6b\xdd\xcd\x2d\xaf\x4b\xeb\x4d\x60\x92\x35\xcd\x3d\xd1\xdb\x1e\x06\xf8\x1b\x6c\xcf\x49\xf6\x4d\x3a\xd3\x6d\x95\xd5\xaf\xce\x74\xbe\xd5\x10\xec\xc4\x3f\xd4\x5f\x19\x37\x98\xff\x6d\x2d\xa2\xe3\x07\xdd\x33\x63\x2c\xfe\xa6\x1e\x4a\xdd\xb1\xbd\x01\xf0\x80\x0e\x23\x37\x58\xe7\x68\xfc\x96\x71\xa8\xff\xf4\x39\xe1\xd7\x96\x77\xc2\xdf\x6d\xbf\x0e\xbe\x8c\x1e\xa2\xb6\x53\x9b\x46\xd3\x4d\x72\xbd\xb6\x3d\x2c\xcb\x27\xf2\x82\x3a\x49\x3f\x45\x63\x0d\xb6\x7f\x36\x73\x03\x7c\x39\xe3\x52\xe2\x3f\xaa\x76\x10\x4c\x55\xda\xa7\x8b\x41\x73\x95\x1c\xf7\x96\xc7\xd4\xd5\x63\x9d\x21\xf5\xaa\x50\xfb\x19\x97\x1c\xf0\xb6\x37\x26\x3a\xc0\xb4\x08\xf1\x86\x5f\xa0\xc9\x2a\xab\x15\xd4\xb0\xd9\x6e\xfe\x46\x43\x09\xf6\x82\x7e\x32\xd3\x14\x60\x88\x9c\x17\x9d\x31\x3d\xf2\x9e\xd2\xf2\x97\xf1\xa8\xb5\xf8\x1d\x5b\xf0\x9b\xd4\x0c\xd3\x03\xbd\xf5\xcf\x60\xfb\x99\xd2\x7f\x2a\x9d\x23\x35\xfb\xc1\x57\x6f\x98\x93\x7d\xa8\x56\x7b\x6a\x37\x7d\x5c\x67\xc0\x87\x32\xeb\xcb\xe8\xd0\x2c\x3f\xe6\x73\x2f\xd0\x19\x33\x43\xfc\x5b\x28\x8d\x79\xec\xe7\x68\x8d\x87\x23\xc7\x97\xab\x8d\x79\x9a\xaf\xa3\x37\x9e\x38\xe4\xef\xa7\x38\xde\xf1\x80\x69\x8e\x3c\xad\xeb\x7f\x30\xcd\xa1\x07\xc2\x5f\xf5\xd0\x82\x24\xcc\xd2\x27\x87\x16\x46\xbc\xf2\x4c\xaf\x21\x08\x68\x58\x14\xd1\xd6\x88\x48\x9f\xbd\xfc\xd0\xa2\xb3\xcd\xc9\xd6\x36\x5a\x06\x23\x8f\x14\x51\x08\xfc\x68\x9b\x90\x34\x7e\x0a\x16\x63\x53\x30\x21\xc4\x43\xa6\x85\x29\xf4\xda\x4c\x72\x2b\x4c\x34\x06\x12\xbc\xb3\xf1\x11\x1d\x8c\x0f\xc9\xa9\x2d\x81\xb1\x03\x21\x21\x9b\x7a\xb9\x6d\x0a\x77\xda\x48\x69\x48\x24\x7c\x6a\x9b\xed\xa5\x15\x2f\x39\x84\xb0\x22\x26\x1b\x87\xe1\x71\x53\x3a\xf5\xd6\x8c\x6c\xcd\x22\xd0\x7a\x25\x23\xb2\x99\x56\x18\xd1\xb5\xe6\xd1\x98\x3f\x58\x6f\x69\x22\x88\x67\x67\x52\xd6\xda\x06\x6e\x67\x07\x18\x72\xa0\x63\x44\x14\xbf\xa7\x46\x0c\x69\xda\xbd\x6d\x7a\x76\xb6\x91\x5c\x1a\x61\x80\x04\xb1\x16\xe2\xd9\xb4\x4a\xea\x4b\x8b\x1d\xf3\x64\x76\xf0\x42\xe3\x90\xc3\xa0\xc2\x0e\x6d\x32\x2d\xec\x34\xa1\x59\x04\x51\x9c\x21\x94\x90\x29\xe2\x44\xbc\x21\x52\xa9\xcd\x21\x98\x28\xb4\x69\x75\xa3\x36\xfb\xc6\xc8\x05\x04\x93\xa6\x86\x18\x1d\x8c\x0c\x42\x4c\x28\xbc\xa3\x6d\x56\xf6\x46\x30\xe6\x83\x0b\x69\xde\xa9\x12\x51\xd9\x6c\x2e\x15\xd3\x85\x35\xac\xce\x0e\x2f\x52\x13\x27\x73\x53\x91\xa6\xd3\xea\x3d\x99\xd9\x2d\x04\xdc\x44\xd3\x1c\x07\x3e\xa5\x6d\x96\x11\xdf\xdc\x36\x9c\xe6\x0d\x4c\x30\x52\x18\xd9\x25\x96\x22\x42\x0b\x8d\x59\x30\xbf\x40\x2c\x64\x23\xdf\x08\xad\x6c\xf2\xda\xa6\xbd\x37\xf2\xd9\x19\xe1\x86\x34\x11\x7b\x6f\x9b\xcc\xb2\xb9\x37\xd8\x46\x7e\xa9\xf8\x19\x0d\x07\x82\xb5\x56\xc9\x06\x6b\x64\x5e\xc9\x43\x23\xeb\xef\x08\x8e\x4a\x85\xab\xf8\xe0\x0b\x05\x47\xff\x05\x82\x83\xe6\x3a\x1a\x71\x42\x2c\x41\x70\x5a\x23\x43\x34\x69\x11\xf8\x46\x20\x25\x3f\xbd\xe6\x5b\x9d\xbd\x2f\x3a\x10\x9d\x7c\x86\xe2\xd3\xa2\x43\x44\xe6\x13\xd1\x41\x0c\x20\x2a\xa3\x1d\xb8\x0d\xf3\xe6\x64\xa3\xff\x56\xe5\x07\x44\x47\x50\xa1\xf6\x20\x3a\x9a\x0f\x8b\x8e\x62\x26\x16\x8d\xda\x53\xd7\xef\x8a\x0e\x39\xd4\x9b\x14\xf3\x9f\x14\x1d\xde\x44\x87\x7f\x5f\x74\xe0\xb7\x07\xd1\x61\x87\x15\xe3\x47\x44\x47\x6e\x84\xeb\xb9\xa2\x43\x0e\xa4\x5e\x20\x3a\xba\x59\x74\xd4\xba\x69\x2b\x07\x2c\xa5\xe2\x94\xb5\xfb\x4c\xd7\xdc\x19\xa6\x5a\x3b\x4c\x82\xec\x43\x4e\xc9\x4d\xa9\x37\x86\x11\xc1\x6d\x67\x07\x47\x76\x80\x0c\x66\x24\xd6\xd6\x97\xbc\x89\x53\x7c\xd2\xcc\x07\xd3\x90\x5e\x3b\x0c\x97\xf1\xad\x5e\x76\x96\x0b\xe4\x08\x58\xa5\xce\xe0\x2b\x7c\xd4\xda\x06\xf8\xbc\x99\x8f\x1d\x10\x59\xf2\x62\xb0\xcd\xab\xd4\x36\x25\x64\x6d\xb9\xf5\xa9\x5c\x37\x39\xe8\x11\x7d\xab\x76\xd7\xb6\x81\x4c\x5c\x7d\xd0\xda\x09\x59\x97\xcd\x7f\x1b\x07\x81\xdd\x65\x9a\x4f\x83\x1d\xfe\xc9\x86\xcb\xa8\x35\x55\x0e\xde\x6d\x93\x66\xb4\x4d\xa2\x3a\xe8\x1c\x95\x1d\x3e\x54\xd6\xfb\xf0\xf3\xbc\xe9\x84\xb8\x19\x6c\xf3\x28\x37\xb2\x8d\x3d\x83\x6d\x16\xb1\x7e\xa9\xab\xf3\xc1\x5a\xa6\xb6\xe0\x23\x62\x02\x96\xc4\x07\xbd\xe2\x1c\xfc\x91\xb7\xc4\xb1\x9e\x0f\x70\x1b\xb5\xa7\x19\xdf\x15\x1d\xd5\x17\x8a\x0e\xe2\xfe\x55\x44\x47\xfd\x65\xa2\xa3\xb2\x97\x0d\xe8\x99\xa3\xf9\x76\x3e\xa4\x41\xac\x05\xdb\x54\xc4\x5e\xb0\x57\x4e\x8f\x87\x62\xbd\x1d\xf2\x20\x00\xc8\xf3\xd1\x36\x36\x11\x06\xb9\xad\x81\xfe\x44\x6f\xa4\x6f\x49\x1d\x7c\x2a\x3a\xba\x77\x45\x47\xf9\x11\xd1\xd1\x7d\x4a\x74\x8c\xef\x8b\x0e\x6a\x08\x79\x3b\x59\x0f\xc1\x97\x5f\x22\x3a\x1e\x29\xe2\xdf\x40\x75\x3c\x0e\xfe\x0c\xd9\x71\xf4\xf6\xe2\x8b\x75\xc7\xe3\x44\x5f\x45\x78\xbc\xe7\x94\xbf\x9b\xf2\x78\xe2\x84\x47\xe9\xd1\xfd\x83\x49\x0f\x7b\xbd\xf4\xff\x95\xf6\xa0\x1e\xc8\x4b\x12\xff\xd4\x1e\x7f\x9d\xf6\xe8\xdf\xd7\x1e\x95\xf9\xb5\x32\xbf\x0a\xef\x6e\xb5\x5f\xd3\x5f\x6a\x7b\xb9\x07\xdb\x89\x09\xbc\x93\x5e\x29\x2f\x78\xd5\x76\x40\xd0\xdb\x0b\x51\xc1\x38\x62\xaf\x7e\x6f\xad\x66\xcb\x46\x60\x61\xfe\x34\xae\xda\x18\xbf\xac\x0c\x23\xd5\xa0\x07\x29\xf8\x55\x0e\xaf\xe6\x03\xb8\x52\x37\x28\xa5\x27\xd5\xc6\x5f\xec\xe5\x9e\xf9\x85\x2c\xe1\x71\x95\xfa\x78\x6a\x1f\x0f\xeb\x64\x0d\xc3\x23\xfe\x0b\x3b\xd8\xa0\x1f\x80\x75\xf0\x06\xc7\xca\x4d\x33\x4d\xc6\xe1\xe0\xcb\x8d\x1d\x50\x09\xdf\x6a\x34\x9e\xf4\x86\xc6\x36\xdc\xe8\x75\x68\x17\x30\x47\xbf\x9e\x0f\x5c\x64\xd3\xd5\x5e\x8c\xcb\xed\xb0\xa6\xb3\x9e\xce\x7a\x4b\x7b\x51\x4a\x5e\x94\x49\xb5\xa7\x8f\xf6\xb2\x8b\xbc\x00\x61\x3a\xa7\xb1\x7c\x96\x83\x1d\xdb\x0c\x26\x0f\xe4\x05\x93\xc6\x36\xd9\x32\xe3\xc1\x76\x98\x5f\xd9\x8b\x07\xc2\x29\xed\x00\x27\x37\x2e\xdf\xd5\x8a\xc3\xdc\xfa\x3f\xf7\x70\xff\xbc\x0e\x79\x99\x24\x35\x3c\x79\xcd\x1f\x62\xdb\xda\x61\xe4\x7c\x20\xe6\xed\x00\xac\xb3\x17\xa7\x18\xb7\x37\x5e\x46\xee\xc2\xb7\x66\x0e\x08\x6e\xe7\x17\xa3\x8e\xf4\xc7\xff\x05\x00\x00\xff\xff\x8a\xbf\x41\x88\x00\x30\x00\x00") - -func bindataTkgManifestTelemetryZzgeneratedBindataGoBytes() ([]byte, error) { - return bindataRead( - _bindataTkgManifestTelemetryZzgeneratedBindataGo, - "tkg/manifest/telemetry/zz_generated.bindata.go", - ) -} - -func bindataTkgManifestTelemetryZzgeneratedBindataGo() (*asset, error) { - bytes, err := bindataTkgManifestTelemetryZzgeneratedBindataGoBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{ - name: "tkg/manifest/telemetry/zz_generated.bindata.go", - size: 28672, - md5checksum: "", - mode: os.FileMode(420), - modTime: time.Unix(1, 0), - } - - a := &asset{bytes: bytes, info: info} - - return a, nil -} - -// -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -// -func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, &os.PathError{Op: "open", Path: name, Err: os.ErrNotExist} -} - -// -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -// nolint: deadcode -// -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or could not be loaded. -// -func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, &os.PathError{Op: "open", Path: name, Err: os.ErrNotExist} -} - -// -// AssetNames returns the names of the assets. -// nolint: deadcode -// -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// -// _bindata is a table, holding each asset generator, mapped to its name. -// -var _bindata = map[string]func() (*asset, error){ - "tkg/manifest/telemetry/config-aws.yaml": bindataTkgManifestTelemetryConfigawsYaml, - "tkg/manifest/telemetry/config-azure.yaml": bindataTkgManifestTelemetryConfigazureYaml, - "tkg/manifest/telemetry/config-docker.yaml": bindataTkgManifestTelemetryConfigdockerYaml, - "tkg/manifest/telemetry/config-vsphere.yaml": bindataTkgManifestTelemetryConfigvsphereYaml, - "tkg/manifest/telemetry/zz_generated.bindata.go": bindataTkgManifestTelemetryZzgeneratedBindataGo, -} - -// -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -// -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, &os.PathError{ - Op: "open", - Path: name, - Err: os.ErrNotExist, - } - } - } - } - if node.Func != nil { - return nil, &os.PathError{ - Op: "open", - Path: name, - Err: os.ErrNotExist, - } - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{Func: nil, Children: map[string]*bintree{ - "tkg": {Func: nil, Children: map[string]*bintree{ - "manifest": {Func: nil, Children: map[string]*bintree{ - "telemetry": {Func: nil, Children: map[string]*bintree{ - "config-aws.yaml": {Func: bindataTkgManifestTelemetryConfigawsYaml, Children: map[string]*bintree{}}, - "config-azure.yaml": {Func: bindataTkgManifestTelemetryConfigazureYaml, Children: map[string]*bintree{}}, - "config-docker.yaml": {Func: bindataTkgManifestTelemetryConfigdockerYaml, Children: map[string]*bintree{}}, - "config-vsphere.yaml": {Func: bindataTkgManifestTelemetryConfigvsphereYaml, Children: map[string]*bintree{}}, - "zz_generated.bindata.go": {Func: bindataTkgManifestTelemetryZzgeneratedBindataGo, Children: map[string]*bintree{}}, - }}, - }}, - }}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} diff --git a/tkg/oracle/client.go b/tkg/oracle/client.go deleted file mode 100644 index b4d85eb636..0000000000 --- a/tkg/oracle/client.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package oracle - -import ( - "context" - "time" - - "github.com/aunum/log" - "github.com/pkg/errors" - - oraclecore "github.com/oracle/oci-go-sdk/v49/core" - oracleidentity "github.com/oracle/oci-go-sdk/v49/identity" - oracleworkrequests "github.com/oracle/oci-go-sdk/v49/workrequests" - - oraclecommon "github.com/oracle/oci-go-sdk/v49/common" -) - -type client struct { - configProvider oraclecommon.ConfigurationProvider - identityClient oracleidentity.IdentityClient - computeClient oraclecore.ComputeClient - workRequestClient oracleworkrequests.WorkRequestClient -} - -// WaitForWorkRequest waits for an OPC work request specified by its OCID -func (c *client) WaitForWorkRequest(ctx context.Context, id *string, interval time.Duration) error { - for { - response, err := c.workRequestClient.GetWorkRequest(ctx, oracleworkrequests.GetWorkRequestRequest{ - WorkRequestId: id, - }) - if err != nil { - return err - } - log.Infof("wait for worker request %s, progress %f", *id, *response.PercentComplete) - if response.Status == oracleworkrequests.WorkRequestStatusSucceeded { - return nil - } - - if response.Status == oracleworkrequests.WorkRequestStatusCanceling || - response.Status == oracleworkrequests.WorkRequestStatusCanceled || - response.Status == oracleworkrequests.WorkRequestStatusFailed { - return errors.New("unexpected work request status %s" + string(response.Status)) - } - time.Sleep(interval) - } -} - -// ImportImageSync initiates the image import from public endpoint and waits for it finishes synchronously -func (c *client) ImportImageSync(ctx context.Context, displayName, compartment, image string) (*oraclecore.Image, error) { - request := oraclecore.CreateImageRequest{ - CreateImageDetails: oraclecore.CreateImageDetails{ - CompartmentId: &compartment, - DisplayName: &displayName, - ImageSourceDetails: oraclecore.ImageSourceViaObjectStorageUriDetails{ - SourceUri: &image, - }, - }, - } - response, err := c.computeClient.CreateImage(ctx, request) - if err != nil { - return nil, err - } - if err := c.WaitForWorkRequest(ctx, response.OpcWorkRequestId, 10*time.Second); err != nil { - return nil, err - } - return &response.Image, nil -} - -// EnsureCompartmentExists ensures the specified compartment exists on the OCI -func (c *client) EnsureCompartmentExists(ctx context.Context, compartment string) (*oracleidentity.Compartment, error) { - response, err := c.identityClient.GetCompartment(ctx, oracleidentity.GetCompartmentRequest{ - CompartmentId: &compartment, - }) - if err != nil { - return nil, err - } - log.Debugf("check compartment %s, response %v", compartment, response) - return &response.Compartment, nil -} - -// Region returns the region that the Oracle Client operates on -func (c *client) Region() (string, error) { - return c.configProvider.Region() -} - -// New creates an Oracle client -func New() (_ Client, err error) { - c := &client{} - c.configProvider = oraclecommon.DefaultConfigProvider() - if c.identityClient, err = oracleidentity.NewIdentityClientWithConfigurationProvider(c.configProvider); err != nil { - return nil, errors.Wrap(err, "unable to create identity client for Oracle Cloud Infrastructure") - } - if c.computeClient, err = oraclecore.NewComputeClientWithConfigurationProvider(c.configProvider); err != nil { - return nil, errors.Wrap(err, "unable to create compute client for Oracle Cloud Infrastructure") - } - if c.workRequestClient, err = oracleworkrequests.NewWorkRequestClientWithConfigurationProvider(c.configProvider); err != nil { - return nil, errors.Wrap(err, "unable to create work request client for Oracle Cloud Infrastructure") - } - return c, nil -} diff --git a/tkg/oracle/interface.go b/tkg/oracle/interface.go deleted file mode 100644 index 1efc6dbb92..0000000000 --- a/tkg/oracle/interface.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package oracle - -import ( - "context" - "time" - - oraclecore "github.com/oracle/oci-go-sdk/v49/core" - oracleidentity "github.com/oracle/oci-go-sdk/v49/identity" -) - -// Client defines methods to access Oracle Cloud inventory -type Client interface { - WaitForWorkRequest(ctx context.Context, id *string, interval time.Duration) error - ImportImageSync(ctx context.Context, displayName, compartment, image string) (*oraclecore.Image, error) - EnsureCompartmentExists(ctx context.Context, compartment string) (*oracleidentity.Compartment, error) - Region() (string, error) -} diff --git a/tkg/providerinterface/interface.go b/tkg/providerinterface/interface.go deleted file mode 100644 index 705889d795..0000000000 --- a/tkg/providerinterface/interface.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package providerinterface ... -package providerinterface - -// ProviderInterface implements provider interface functions -type ProviderInterface interface { - // GetProviderBundle should return provider bundle zip file bytes - GetProviderBundle() ([]byte, error) -} diff --git a/tkg/providersupgradeclient/client.go b/tkg/providersupgradeclient/client.go deleted file mode 100644 index 77dc308753..0000000000 --- a/tkg/providersupgradeclient/client.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package providersupgradeclient provides wrapper for clusterctl upgrade functionalities -package providersupgradeclient - -import ( - clusterctl "sigs.k8s.io/cluster-api/cmd/clusterctl/client" -) - -// Client provides interface which is a proxy for clusterctl client's interface ApplyUpgrade method, created to help unit tests -// TODO: This can be extended as a proxy for all operations of clusterctl client -// -//go:generate counterfeiter -o ../fakes/providersupgradeclient.go --fake-name ProvidersUpgradeClient . Client -type Client interface { - ApplyUpgrade(*clusterctl.ApplyUpgradeOptions) error -} - -// ProvidersUpgradeClient implements providers upgrade functionality -type ProvidersUpgradeClient struct { - clusterctlClient clusterctl.Client -} - -// New returns the ProviderUpgradeClient -func New(cctlClient clusterctl.Client) Client { - return &ProvidersUpgradeClient{ - clusterctlClient: cctlClient, - } -} - -// ApplyUpgrade acts as proxy for ClusterCtl ApplyUpgrade method -func (puc *ProvidersUpgradeClient) ApplyUpgrade(pUpgradeApplyOptions *clusterctl.ApplyUpgradeOptions) error { - return puc.clusterctlClient.ApplyUpgrade(*pUpgradeApplyOptions) -} diff --git a/tkg/region/factory.go b/tkg/region/factory.go deleted file mode 100644 index 51431b1a84..0000000000 --- a/tkg/region/factory.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package region - -// ManagerFactory provides interface for region manager factory -type ManagerFactory interface { - CreateManager(configPath string) (Manager, error) -} - -type managerFactory struct{} - -// NewFactory creates new manager factory -func NewFactory() ManagerFactory { - return &managerFactory{} -} - -func (mf *managerFactory) CreateManager(configPath string) (Manager, error) { - return New(configPath) -} diff --git a/tkg/region/interface.go b/tkg/region/interface.go deleted file mode 100644 index 414aebea34..0000000000 --- a/tkg/region/interface.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package region - -// DeploymentStatus holds the region deployment status -type DeploymentStatus string - -// Possible deployment statuses -const ( - Success DeploymentStatus = "Success" - Failed DeploymentStatus = "Failed" -) - -// RegionContext holds the region context -type RegionContext struct { - ClusterName string `yaml:"name" json:"name"` - ContextName string `yaml:"context" json:"context"` - SourceFilePath string `yaml:"file" json:"file"` - Status DeploymentStatus `yaml:"status" json:"status"` - IsCurrentContext bool `yaml:"isCurrentContext" json:"isCurrentContext"` -} - -//go:generate counterfeiter -o ../fakes/regionmanager.go --fake-name RegionManager . Manager - -// Manager manages tkg regions -type Manager interface { - // ListRegionContexts lists all the regions in tkg config file - ListRegionContexts() ([]RegionContext, error) - // SaveRegionContext saves a new region object into the tkg config file, - // Errors will be returned if a region with same name and context already exists - SaveRegionContext(region RegionContext) error - // UpsertRegionContext updates region context object if already exists, - // else saves the new region object into the tkg config file - UpsertRegionContext(region RegionContext) error - // DeleteRegionContext deletes all region info with the given cluster name, regardless of context - DeleteRegionContext(clusterName string) error - // SetCurrentContext sets current regional context into tkg config file - SetCurrentContext(clusterName string, contextName string) error - // GetCurrentContext gets current regional context from tkg config file - GetCurrentContext() (RegionContext, error) -} diff --git a/tkg/region/manager.go b/tkg/region/manager.go deleted file mode 100644 index 22d175d992..0000000000 --- a/tkg/region/manager.go +++ /dev/null @@ -1,451 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package region provides region context functionalities -package region - -import ( - "os" - - "github.com/pkg/errors" - yaml "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -const yamlSeqTag = "!!seq" - -type manager struct { - tkgConfigPath string -} - -// New creates regional manager -func New(tkgConfigPath string) (Manager, error) { - if _, err := os.Stat(tkgConfigPath); err != nil { - return nil, err - } - - return &manager{ - tkgConfigPath: tkgConfigPath, - }, nil -} - -// ListRegionContexts lists all the regions in tkg config file -func (m *manager) ListRegionContexts() ([]RegionContext, error) { - var regions []RegionContext - - // load tkg config - tkgConfigNode, err := m.loadTkgConfig() - if err != nil { - return regions, errors.Wrapf(err, "unable to unmarshal tkg configuration file %s", m.tkgConfigPath) - } - - regionsNode := m.findNodeUnderTkg(&tkgConfigNode, constants.KeyRegions) - if regionsNode == nil { - return regions, nil - } - - regionsByte, err := yaml.Marshal(regionsNode.Content) - if err != nil { - return regions, errors.Wrap(err, "unable to parse regions") - } - - err = yaml.Unmarshal(regionsByte, ®ions) - if err != nil { - return regions, err - } - - currentContextName, _ := m.getCurrentContextName() - for i := range regions { - if regions[i].ContextName == currentContextName { - regions[i].IsCurrentContext = true - } - - if regions[i].Status == "" { - regions[i].Status = Success - } - } - - return regions, err -} - -// SaveRegionContext saves a new region object into the tkg config file -func (m *manager) SaveRegionContext(region RegionContext) error { - if _, err := m.getRegionContext(region.ClusterName, region.ContextName); err == nil { - return errors.Errorf("management cluster %s with context %s already exists", region.ClusterName, region.ContextName) - } - - tkgConfigNode, err := m.loadTkgConfig() - if err != nil { - return errors.Wrapf(err, "unable to unmarshal tkg configuration file %s", m.tkgConfigPath) - } - - // find the regions node under tkg node, create one if not found - regionsNode := m.findNodeUnderTkg(&tkgConfigNode, constants.KeyRegions) - if regionsNode == nil { - regionsNode, err = m.createNodeUnderTkg(&tkgConfigNode, constants.KeyRegions, "", yaml.SequenceNode) - if err != nil { - return err - } - } - - regionsNode.Kind = yaml.SequenceNode - regionsNode.Tag = yamlSeqTag - - // convert region into yaml node - regionByte, err := yaml.Marshal(region) - if err != nil { - return errors.Wrap(err, "unable to marshal the new management cluster object into yaml") - } - - node := yaml.Node{} - err = yaml.Unmarshal(regionByte, &node) - if err != nil { - return errors.Wrap(err, "unable to marshal the new management cluster object into yaml") - } - // append new region in regions section - regionsNode.Content = append(regionsNode.Content, node.Content[0]) - - out, err := yaml.Marshal(&tkgConfigNode) - if err != nil { - return err - } - err = os.WriteFile(m.tkgConfigPath, out, constants.ConfigFilePermissions) - if err != nil { - return err - } - - return nil -} - -// UpsertRegionContext saves/updates a region object in the tkg config file -func (m *manager) UpsertRegionContext(region RegionContext) error { - tkgConfigNode, err := m.loadTkgConfig() - if err != nil { - return errors.Wrapf(err, "unable to unmarshal tkg configuration file %s", m.tkgConfigPath) - } - - // find the regions node under tkg node, create one if not found - regionsNode := m.findNodeUnderTkg(&tkgConfigNode, constants.KeyRegions) - if regionsNode == nil { - regionsNode, err = m.createNodeUnderTkg(&tkgConfigNode, constants.KeyRegions, "", yaml.SequenceNode) - if err != nil { - return err - } - } - - // convert region into yaml node - regionByte, err := yaml.Marshal(region) - if err != nil { - return errors.Wrap(err, "unable to marshal the management cluster objects into yaml") - } - - updatedNode := yaml.Node{} - err = yaml.Unmarshal(regionByte, &updatedNode) - if err != nil { - return errors.Wrap(err, "unable to unmarshal the management cluster object into yaml") - } - - // update the region info with given clusterName and contextName if already exists - result := []*yaml.Node{} - found := false - for _, node := range regionsNode.Content { - nameIndex := getNodeIndex(node.Content, constants.KeyRegionName) - contextIndex := getNodeIndex(node.Content, constants.KeyRegionContext) - if nameIndex != -1 && node.Content[nameIndex].Value == region.ClusterName && - contextIndex != -1 && node.Content[contextIndex].Value == region.ContextName { - result = append(result, updatedNode.Content[0]) - found = true - continue - } - result = append(result, node) - } - // add the region info if it doesn't exist - if !found { - result = append(result, updatedNode.Content[0]) - } - - regionsNode.Content = result - regionsNode.Kind = yaml.SequenceNode - regionsNode.Tag = yamlSeqTag - - out, err := yaml.Marshal(&tkgConfigNode) - if err != nil { - return err - } - err = os.WriteFile(m.tkgConfigPath, out, constants.ConfigFilePermissions) - if err != nil { - return err - } - - return nil -} - -// DeleteRegionContext deletes a management cluster data from tkg config file -func (m *manager) DeleteRegionContext(clusterName string) error { - tkgConfigNode, err := m.loadTkgConfig() - if err != nil { - return errors.Wrapf(err, "unable to unmarshal tkg configuration file %s", m.tkgConfigPath) - } - regionsNode := m.findNodeUnderTkg(&tkgConfigNode, constants.KeyRegions) - if regionsNode == nil { - return nil - } - - currentContext := "" - currentContextNode := m.findNodeUnderTkg(&tkgConfigNode, constants.KeyCurrentRegionContext) - - if currentContextNode != nil { - currentContext = currentContextNode.Value - } - - // removed the all region info with given clusterName, regardless the context - // unset current context if the current context is deleted - result := []*yaml.Node{} - for _, node := range regionsNode.Content { - if index := getNodeIndex(node.Content, constants.KeyRegionName); index != -1 && node.Content[index].Value == clusterName { - if index := getNodeIndex(node.Content, constants.KeyRegionContext); index != -1 && node.Content[index].Value == currentContext { - currentContextNode.Value = "" - } - continue - } - result = append(result, node) - } - - if len(result) == 0 { - regionsNode.Kind = yaml.ScalarNode - regionsNode.Tag = yamlSeqTag - } else { - regionsNode.Content = result - } - - out, err := yaml.Marshal(&tkgConfigNode) - if err != nil { - return err - } - err = os.WriteFile(m.tkgConfigPath, out, constants.ConfigFilePermissions) - if err != nil { - return err - } - - return nil -} - -// GetRegionContext gets a management cluster info by cluster name, contextName is an optional parameter -func (m *manager) getRegionContext(clusterName, contextName string) (RegionContext, error) { - regions, err := m.ListRegionContexts() - if err != nil { - return RegionContext{}, err - } - var result []RegionContext - - for _, r := range regions { - if r.ClusterName == clusterName { - result = append(result, r) - } - } - - if len(result) == 0 { - return RegionContext{}, errors.Errorf("cannot find management cluster %s", clusterName) - } - - if contextName != "" { - for _, r := range result { - if r.ContextName == contextName { - return r, nil - } - } - return RegionContext{}, errors.Errorf("cannot find management cluster %s with context %s", clusterName, contextName) - } - - if len(result) == 1 { - return result[0], nil - } - - return RegionContext{}, errors.Errorf("multiple contexts are found for cluster %s, please specify a context name", clusterName) -} - -// SetCurrentContext sets current management cluster context into tkg config file -func (m *manager) SetCurrentContext(clusterName, contextName string) error { - region, err := m.getRegionContext(clusterName, contextName) - if err != nil { - return errors.Wrapf(err, "unable to set current management cluster to %s", clusterName) - } - - tkgConfigNode, err := m.loadTkgConfig() - if err != nil { - return errors.Wrapf(err, "unable to unmarshal tkg configuration file %s", m.tkgConfigPath) - } - - currentContextNode := m.findNodeUnderTkg(&tkgConfigNode, constants.KeyCurrentRegionContext) - - if currentContextNode == nil { - _, err = m.createNodeUnderTkg(&tkgConfigNode, constants.KeyCurrentRegionContext, region.ContextName, yaml.ScalarNode) - if err != nil { - return errors.Wrap(err, "unable to set current context in tkg config file") - } - } else { - currentContextNode.Tag = yamlSeqTag - currentContextNode.Value = region.ContextName - } - - out, err := yaml.Marshal(&tkgConfigNode) - if err != nil { - return err - } - err = os.WriteFile(m.tkgConfigPath, out, constants.ConfigFilePermissions) - if err != nil { - return err - } - - return nil -} - -func (m *manager) getCurrentContextName() (string, error) { - tkgConfigNode, err := m.loadTkgConfig() - if err != nil { - return "", errors.Wrapf(err, "unable to unmarshal tkg configuration file %s", m.tkgConfigPath) - } - - currentContextNode := m.findNodeUnderTkg(&tkgConfigNode, constants.KeyCurrentRegionContext) - if currentContextNode == nil || currentContextNode.Value == "" { - return "", errors.New("unable to find current context node") - } - return currentContextNode.Value, nil -} - -func (m *manager) GetCurrentContext() (RegionContext, error) { - tkgConfigNode, err := m.loadTkgConfig() - if err != nil { - return RegionContext{}, errors.Wrapf(err, "unable to unmarshal tkg configuration file %s", m.tkgConfigPath) - } - - currentContextNode := m.findNodeUnderTkg(&tkgConfigNode, constants.KeyCurrentRegionContext) - - if currentContextNode != nil && currentContextNode.Value != "" { - regions, err := m.ListRegionContexts() - if err != nil { - return RegionContext{}, errors.Wrap(err, "unable to get current management cluster context info") - } - - for _, r := range regions { - if r.ContextName == currentContextNode.Value { - return r, nil - } - } - } - return RegionContext{}, errors.New("current management cluster context is not set") -} - -func (m *manager) loadTkgConfig() (yaml.Node, error) { - // load the whole tkg config into yaml Node - tkgConfigNode := yaml.Node{} - - fileData, err := os.ReadFile(m.tkgConfigPath) - if err != nil { - return tkgConfigNode, errors.Errorf("unable to read tkg configuration from: %s", m.tkgConfigPath) - } - - err = yaml.Unmarshal(fileData, &tkgConfigNode) - - return tkgConfigNode, err -} - -func (m *manager) createNodeUnderTkg(tkgConfigNode *yaml.Node, key, value string, kind yaml.Kind) (*yaml.Node, error) { - tkgNodeIndex := getNodeIndex(tkgConfigNode.Content[0].Content, constants.KeyTkg) - // create tkg section if it does not exist - if tkgNodeIndex == -1 { - tkgConfigNode.Content[0].Content = append(tkgConfigNode.Content[0].Content, m.createMappingNode(constants.KeyTkg)...) - } - - tkgNodeIndex = getNodeIndex(tkgConfigNode.Content[0].Content, constants.KeyTkg) - - // if tkg node presents, but nothing under it - if len(tkgConfigNode.Content[0].Content[tkgNodeIndex].Content) == 0 { - tkgConfigNode.Content[0].Content[tkgNodeIndex] = &yaml.Node{ - Kind: yaml.MappingNode, - } - } - - tkgNode := tkgConfigNode.Content[0].Content[tkgNodeIndex] - - switch kind { - case yaml.SequenceNode: - tkgNode.Content = append(tkgNode.Content, m.createSequenceNode(key)...) - case yaml.MappingNode: - tkgNode.Content = append(tkgNode.Content, m.createMappingNode(key)...) - case yaml.ScalarNode: - tkgNode.Content = append(tkgNode.Content, m.createScalarNode(key, value)...) - default: - return nil, errors.New("node kind is not supported under tkg node") - } - - index := getNodeIndex(tkgNode.Content, key) - return tkgNode.Content[index], nil -} - -func (m *manager) createSequenceNode(key string) []*yaml.Node { - keyNode := &yaml.Node{ - Kind: yaml.ScalarNode, - Value: key, - } - valueNode := &yaml.Node{ - Kind: yaml.SequenceNode, - } - - return []*yaml.Node{keyNode, valueNode} -} - -func (m *manager) createScalarNode(key, value string) []*yaml.Node { - keyNode := &yaml.Node{ - Kind: yaml.ScalarNode, - Value: key, - } - valueNode := &yaml.Node{ - Kind: yaml.ScalarNode, - Value: value, - } - - return []*yaml.Node{keyNode, valueNode} -} - -func (m *manager) createMappingNode(key string) []*yaml.Node { - keyNode := &yaml.Node{ - Kind: yaml.ScalarNode, - Value: key, - } - valueNode := &yaml.Node{ - Kind: yaml.MappingNode, - } - - return []*yaml.Node{keyNode, valueNode} -} - -// find direct children under tkg node -func (m *manager) findNodeUnderTkg(tkgConfigNode *yaml.Node, key string) *yaml.Node { - // find the tkg node - tkgNodeIndex := getNodeIndex(tkgConfigNode.Content[0].Content, constants.KeyTkg) - if tkgNodeIndex == -1 { - return nil - } - tkgNode := tkgConfigNode.Content[0].Content[tkgNodeIndex] - - // find the tkg region node - targetNodeIndex := getNodeIndex(tkgNode.Content, key) - if targetNodeIndex == -1 { - return nil - } - - return tkgNode.Content[targetNodeIndex] -} - -func getNodeIndex(node []*yaml.Node, key string) int { - appIdx := -1 - for i, k := range node { - if i%2 == 0 && k.Value == key { - appIdx = i + 1 - break - } - } - return appIdx -} diff --git a/tkg/region/region_test.go b/tkg/region/region_test.go deleted file mode 100644 index fe7f14a7e1..0000000000 --- a/tkg/region/region_test.go +++ /dev/null @@ -1,346 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package region_test - -import ( - "os" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - . "github.com/vmware-tanzu/tanzu-framework/tkg/region" -) - -func TestClusterClient(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Region manager Suite") -} - -var _ = Describe("Region manager", func() { - var ( - manager Manager - err error - tkgConfigPath string - ) - const ( - fakeConfigYAMLFilePath = "../fakes/config/config.yaml" - fakeConfig2YAMLFilePath = "../fakes/config/config2.yaml" - RegionalCluster2 = "regional-cluster-2" - User1RegionalCluster2Context = "user1@regional-cluster-2-context" - ) - - Describe("ListRegions", func() { - var regions []RegionContext - JustBeforeEach(func() { - manager, err = New(tkgConfigPath) - Expect(err).ToNot(HaveOccurred()) - regions, err = manager.ListRegionContexts() - }) - - Context("When regions node is not present in tkg config file", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfigYAMLFilePath - }) - - It("should return no regions", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(len(regions)).To(Equal(0)) - }) - }) - - Context("When regions are set in tkg config file", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfig2YAMLFilePath - }) - - It("should return egions", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(len(regions)).To(Equal(3)) - }) - }) - }) - - Describe("DeleteRegion", func() { - var ( - clusterName string - originalFile []byte - ) - JustBeforeEach(func() { - originalFile, err = os.ReadFile(tkgConfigPath) - Expect(err).ToNot(HaveOccurred()) - manager, err = New(tkgConfigPath) - Expect(err).ToNot(HaveOccurred()) - err = manager.DeleteRegionContext(clusterName) - }) - - Context("When cluster does not exist in tkg config file", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfig2YAMLFilePath - clusterName = "regional-cluster-3" - }) - It("should not have any impact on tkg config file", func() { - Expect(err).ToNot(HaveOccurred()) - - regions, err := manager.ListRegionContexts() - Expect(err).ToNot(HaveOccurred()) - Expect(len(regions)).To(Equal(3)) - }) - }) - - Context("When given cluster exists in tkg config file", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfig2YAMLFilePath - clusterName = RegionalCluster2 - }) - It("the cluster info should be deleted from tkg config file ", func() { - Expect(err).ToNot(HaveOccurred()) - - regions, err := manager.ListRegionContexts() - Expect(err).ToNot(HaveOccurred()) - Expect(len(regions)).To(Equal(1)) - - _, err = manager.GetCurrentContext() - Expect(err).To(HaveOccurred()) - }) - }) - - AfterEach(func() { - err = os.WriteFile(tkgConfigPath, originalFile, constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Describe("SaveRegion", func() { - var ( - region RegionContext - originalFile []byte - ) - JustBeforeEach(func() { - originalFile, err = os.ReadFile(tkgConfigPath) - Expect(err).ToNot(HaveOccurred()) - manager, err = New(tkgConfigPath) - Expect(err).ToNot(HaveOccurred()) - err = manager.SaveRegionContext(region) - }) - - Context("when regions node is not present in tkg config file", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfigYAMLFilePath - region = RegionContext{ - ClusterName: "regional-cluster-3", - ContextName: "user2@regional-cluster-3-context", - SourceFilePath: "path/to/kubeconfig", - } - }) - - It("should create the regions node and save the cluster info into tkg config", func() { - Expect(err).ToNot(HaveOccurred()) - - regions, err := manager.ListRegionContexts() - Expect(err).ToNot(HaveOccurred()) - Expect(len(regions)).To(Equal(1)) - }) - }) - - Context("when a region with the same cluster name and context name already exists", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfig2YAMLFilePath - region = RegionContext{ - ClusterName: "regional-cluster-1", - ContextName: "user1@regional-cluster-1-context", - SourceFilePath: "path/to/kubeconfig", - } - }) - - It("return a duplicate error", func() { - Expect(err).To(HaveOccurred()) - - regions, err := manager.ListRegionContexts() - Expect(err).ToNot(HaveOccurred()) - Expect(len(regions)).To(Equal(3)) - }) - }) - - AfterEach(func() { - err = os.WriteFile(tkgConfigPath, originalFile, constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) - }) - }) - Describe("UpsertRegion", func() { - var ( - region RegionContext - originalFile []byte - ) - JustBeforeEach(func() { - originalFile, err = os.ReadFile(tkgConfigPath) - Expect(err).ToNot(HaveOccurred()) - manager, err = New(tkgConfigPath) - Expect(err).ToNot(HaveOccurred()) - err = manager.UpsertRegionContext(region) - }) - - Context("when regions node is not present in tkg config file", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfigYAMLFilePath - region = RegionContext{ - ClusterName: "regional-cluster-3", - ContextName: "user2@regional-cluster-3-context", - SourceFilePath: "path/to/kubeconfig", - } - }) - - It("should create the regions node and save the cluster info into tkg config", func() { - Expect(err).ToNot(HaveOccurred()) - - regions, err := manager.ListRegionContexts() - Expect(err).ToNot(HaveOccurred()) - Expect(len(regions)).To(Equal(1)) - }) - }) - - Context("when a region with the same cluster name and context name already exists", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfig2YAMLFilePath - region = RegionContext{ - ClusterName: "regional-cluster-1", - ContextName: "user1@regional-cluster-1-context", - SourceFilePath: "newpath/to/kubeconfig", - Status: Success, - } - }) - - It("should not return error, but update the existing region context", func() { - Expect(err).ToNot(HaveOccurred()) - - regions, err := manager.ListRegionContexts() - Expect(err).ToNot(HaveOccurred()) - Expect(len(regions)).To(Equal(3)) - Expect(regions[0]).To(Equal(region)) - }) - }) - - AfterEach(func() { - err = os.WriteFile(tkgConfigPath, originalFile, constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) - }) - }) - Describe("SetCurrentContext", func() { - var ( - contextName string - clusterName string - originalFile []byte - ) - - JustBeforeEach(func() { - originalFile, err = os.ReadFile(tkgConfigPath) - Expect(err).ToNot(HaveOccurred()) - manager, err = New(tkgConfigPath) - Expect(err).ToNot(HaveOccurred()) - err = manager.SetCurrentContext(clusterName, contextName) - }) - - Context("When context does not exist in tkg config file", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfigYAMLFilePath - clusterName = RegionalCluster2 - contextName = "user2@regional-cluster-2-context" - }) - - It("it should return an context not found error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When multiple region with same cluster name is set", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfig2YAMLFilePath - clusterName = RegionalCluster2 - contextName = "" - }) - It("should return an error, indicating context name should be specified", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When current-region-context key has no value", func() { - BeforeEach(func() { - tkgConfigPath = "../fakes/config/config3.yaml" - clusterName = RegionalCluster2 - contextName = User1RegionalCluster2Context - }) - - It("should create value node and set the context as current context", func() { - Expect(err).ToNot(HaveOccurred()) - context, err := manager.GetCurrentContext() - Expect(err).ToNot(HaveOccurred()) - Expect(context.ContextName).To(Equal(contextName)) - }) - }) - - Context("When current-region-context key does not exist", func() { - BeforeEach(func() { - tkgConfigPath = "../fakes/config/config8.yaml" - clusterName = "regional-cluster-2" - contextName = "user1@regional-cluster-2-context" - }) - - It("should create node and set the context as current context", func() { - Expect(err).ToNot(HaveOccurred()) - context, err := manager.GetCurrentContext() - Expect(err).ToNot(HaveOccurred()) - Expect(context.ContextName).To(Equal(contextName)) - }) - }) - - Context("When context is present in tkg config file", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfig2YAMLFilePath - clusterName = RegionalCluster2 - contextName = User1RegionalCluster2Context - }) - - It("should set the context as current context", func() { - Expect(err).ToNot(HaveOccurred()) - context, err := manager.GetCurrentContext() - Expect(err).ToNot(HaveOccurred()) - Expect(context.ContextName).To(Equal(contextName)) - }) - }) - - AfterEach(func() { - err = os.WriteFile(tkgConfigPath, originalFile, constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Describe("GetCurrentContext", func() { - var regionContext RegionContext - JustBeforeEach(func() { - manager, err = New(tkgConfigPath) - Expect(err).ToNot(HaveOccurred()) - regionContext, err = manager.GetCurrentContext() - }) - Context("When current context is not set in tkg config file", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfigYAMLFilePath - }) - - It("should return current context not set error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When current context is set in tkg config file", func() { - BeforeEach(func() { - tkgConfigPath = fakeConfig2YAMLFilePath - }) - It("should return the current context", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(regionContext.ContextName).To(Equal("user2@regional-cluster-2-context")) - }) - }) - }) -}) diff --git a/tkg/registry/client.go b/tkg/registry/client.go deleted file mode 100644 index 1ea27de388..0000000000 --- a/tkg/registry/client.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package registry - -import ( - "archive/tar" - "bytes" - "io" - - "github.com/cppforlife/go-cli-ui/ui" - regname "github.com/google/go-containerregistry/pkg/name" - regv1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/k14s/imgpkg/pkg/imgpkg/cmd" - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - "github.com/pkg/errors" -) - -type registry struct { - opts *ctlimg.Opts - registry ctlimg.Registry -} - -// New instantiates a new Registry -func New(opts *ctlimg.Opts) (Registry, error) { - reg, err := ctlimg.NewRegistry(*opts) - if err != nil { - return nil, errors.Wrap(err, "failed to initialze registry client") - } - - return ®istry{ - opts: opts, - registry: reg, - }, nil -} - -// ListImageTags lists all tags of the given image. -func (r *registry) ListImageTags(imageName string) ([]string, error) { - ref, err := regname.ParseReference(imageName, regname.WeakValidation) - if err != nil { - return []string{}, err - } - - return r.registry.ListTags(ref.Context()) -} - -// GetFile gets the file content bundled in the given image:tag. -// If filename is empty, it will get the first file. -func (r *registry) GetFile(imageWithTag, filename string) ([]byte, error) { - ref, err := regname.ParseReference(imageWithTag, regname.WeakValidation) - if err != nil { - return nil, err - } - d, err := r.registry.Get(ref) - if err != nil { - return nil, errors.Wrap(err, "Collecting images") - } - - img, err := d.Image() - if err != nil { - return nil, err - } - - return getFileContentFromImage(img, filename) -} - -func getFileContentFromImage(image regv1.Image, filename string) ([]byte, error) { - layers, err := image.Layers() - - if err != nil { - return nil, err - } - - for _, imgLayer := range layers { - layerStream, err := imgLayer.Uncompressed() - if err != nil { - return nil, err - } - - defer layerStream.Close() - - files := make(map[string][]byte) - err = getFileFromLayer(layerStream, files) - if err != nil { - return nil, err - } - - for k, v := range files { - if filename == "" || k == filename { - return v, nil - } - } - } - return nil, errors.New("cannot find file from the image") -} - -func getFileFromLayer(stream io.Reader, files map[string][]byte) error { - tarReader := tar.NewReader(stream) - - for { - hdr, err := tarReader.Next() - if err != nil { - if err == io.EOF { - break - } - return err - } - - if hdr.Typeflag == tar.TypeReg || hdr.Typeflag == tar.TypeRegA { - buf, err := io.ReadAll(tarReader) - if err != nil { - return err - } - files[hdr.Name] = buf - } - } - return nil -} - -// GetFiles get all the files content bundled in the given image:tag. -func (r *registry) GetFiles(imageWithTag string) (map[string][]byte, error) { - ref, err := regname.ParseReference(imageWithTag, regname.WeakValidation) - if err != nil { - return nil, err - } - d, err := r.registry.Get(ref) - if err != nil { - return nil, errors.Wrap(err, "Collecting images") - } - img, err := d.Image() - if err != nil { - return nil, err - } - - return getAllFilesContentFromImage(img) -} - -func getAllFilesContentFromImage(image regv1.Image) (map[string][]byte, error) { - layers, err := image.Layers() - - if err != nil { - return nil, err - } - - files := make(map[string][]byte) - - for _, imgLayer := range layers { - layerStream, err := imgLayer.Uncompressed() - if err != nil { - return nil, err - } - - defer layerStream.Close() - - err = getFileFromLayer(layerStream, files) - if err != nil { - return nil, err - } - } - - if len(files) != 0 { - return files, nil - } - - return nil, errors.New("cannot find file from the image") -} - -// DownloadBundle downloads OCI bundle similar to `imgpkg pull -b` command -// It is recommended to use this function when downloading imgpkg bundle because -// - During the air-gapped script, these plugin discovery packages are copied to a -// private registry with the `imgpkg copy` command -// - Downloading files directly from OCI image similar to `GetFiles` doesn't work -// because it doesn't update the `ImageLock` file when we download the package from -// different registry. And returns original ImageLock file. and as ImageLock file -// is pointing to original registry instead of private registry, image references -// does not point to the correct location - -func (r *registry) DownloadBundle(imageName, outputDir string) error { - // Creating a dummy writer to capture the logs - // currently this logs are not displayed or used directly - var outputBuf, errorBuf bytes.Buffer - writerUI := ui.NewWriterUI(&outputBuf, &errorBuf, nil) - - pullOptions := cmd.NewPullOptions(writerUI) - pullOptions.OutputPath = outputDir - pullOptions.BundleFlags = cmd.BundleFlags{Bundle: imageName} - - if r.opts != nil { - pullOptions.RegistryFlags = cmd.RegistryFlags{ - CACertPaths: r.opts.CACertPaths, - VerifyCerts: r.opts.VerifyCerts, - Insecure: r.opts.Insecure, - Anon: r.opts.Anon, - } - } - - return pullOptions.Run() -} diff --git a/tkg/registry/client_integ_test.go b/tkg/registry/client_integ_test.go deleted file mode 100644 index 7410028b5b..0000000000 --- a/tkg/registry/client_integ_test.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package registry - -import ( - "fmt" - "os" - "strconv" - "testing" - - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" -) - -func TestRegistryPullBOM(t *testing.T) { - if integTest := os.Getenv("TKR_INTEG_TEST"); integTest != "true" { - return - } - bomRegistry := os.Getenv("TEST_BOM_IMAGE_PATH") - if bomRegistry == "" { - t.Fatal("TEST_BOM_IMAGE_PATH must be set") - } - - numTags, err := strconv.Atoi(os.Getenv("TEST_BOM_IMAGE_NUM")) - if err != nil { - t.Fatalf("wrong TEST_BOM_IMAGE_NUM, %s", err.Error()) - } - - ro := ctlimg.Opts{} - - reg, err := New(&ro) - if err != nil { - t.Fatalf("error creating registry client") - } - - tags, err := reg.ListImageTags(bomRegistry) - if err != nil { - t.Fatalf("error listing tags should not occurs %s", err.Error()) - } - - if numTags != len(tags) { - t.Fatal("number of tags does not match") - } - - t.Log(tags[0]) - - content, err := reg.GetFile(fmt.Sprintf("%s:%s", bomRegistry, tags[0]), "") - if err != nil { - t.Fatalf("error getting image content should not occurs %s", err.Error()) - } - - bom, err := NewBom(content) - if err != nil { - t.Fatalf("error parsing bom content should not occurs %s", err.Error()) - } - - t.Log(bom.GetComponent("kubernetes")) -} diff --git a/tkg/registry/doc.go b/tkg/registry/doc.go deleted file mode 100644 index 1a99da4992..0000000000 --- a/tkg/registry/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package registry defines a Registry interface and client for working for imkpkg images. -// Copied over from github.com/vmware-tanzu/tanzu-framework/pkg/v1/tkr/pkg/registry -package registry diff --git a/tkg/registry/interface.go b/tkg/registry/interface.go deleted file mode 100644 index 44a0434072..0000000000 --- a/tkg/registry/interface.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package registry - -//go:generate counterfeiter -o ../fakes/registy.go --fake-name Registry . Registry - -// Registry defines the Registry interface -type Registry interface { - // ListImageTags lists all tags of the given image. - ListImageTags(imageName string) ([]string, error) - // GetFile gets the file content bundled in the given image:tag. - // If filename is empty, it will get the first file. - GetFile(imageWithTag string, filename string) ([]byte, error) - // GetFiles get all the files content bundled in the given image:tag. - GetFiles(imageWithTag string) (map[string][]byte, error) - // DownloadBundle downloads OCI bundle similar to `imgpkg pull -b` command - // It is recommended to use this function when downloading imgpkg bundle - DownloadBundle(imageName, outputDir string) error -} diff --git a/tkg/registry/util_test.go b/tkg/registry/util_test.go deleted file mode 100644 index a0ed3b6c9e..0000000000 --- a/tkg/registry/util_test.go +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package registry - -import ( - "fmt" - - "github.com/pkg/errors" - "gopkg.in/yaml.v2" -) - -// Release contains the release name. -type Release struct { - Version string `yaml:"version"` -} - -// ImageConfig contains the path of the image registry -type ImageConfig struct { - ImageRepository string `yaml:"imageRepository"` -} - -// ComponentInfo contains component information -type ComponentInfo struct { - Version string `yaml:"version"` - // Each component can optionally have container images associated with it - Images map[string]ImageInfo `yaml:"images,omitempty"` - // Metadata section can be anything for the component - Metadata map[string]string `yaml:"metadata,omitempty"` -} - -// ImageInfo contains the image information -type ImageInfo struct { - ImagePath string `yaml:"imagePath"` - Tag string `yaml:"tag"` -} - -// OSInfo contains the OS information -type OSInfo struct { - Name string `yaml:"name"` - Version string `yaml:"version"` - Arch string `yaml:"arch"` -} - -// String gets a string representation of the BOM -func (os OSInfo) String() string { - return fmt.Sprintf("%s-%s-%s", os.Name, os.Version, os.Arch) -} - -// OVAInfo gets the Open Virtual Appliance (OVA) information -type OVAInfo struct { - Name string `yaml:"name"` - OSInfo - Version string `yaml:"version"` - Metadata map[string]interface{} `yaml:"metadata,omitempty"` -} - -// AMIInfo defines information about an AMI shipped -type AMIInfo struct { - ID string `yaml:"id"` - OSInfo - Metadata map[string]interface{} `yaml:"metadata,omitempty"` -} - -// AzureInfo defines information about an Azure Image shipped -type AzureInfo struct { - Sku string `yaml:"sku"` - Publisher string `yaml:"publisher"` - Offer string `yaml:"offer"` - Version string `yaml:"version"` - ThirdPartyImage bool `yaml:"thirdPartyImage,omitempty"` - Metadata map[string]interface{} `yaml:"metadata,omitempty"` - OSInfo -} - -// AzureInfos is an array of AzureInfo -type AzureInfos []AzureInfo - -// AMIInfos is a lookup of AMIInfo -type AMIInfos map[string][]AMIInfo - -// OVAInfos is an array of OVAInfo -type OVAInfos []OVAInfo - -// Addons represents map of Addons -type Addons map[string]Addon - -// ComponentReference references the images in a component -type ComponentReference struct { - ComponentRef string `yaml:"componentRef"` - ImageRefs []string `yaml:"imageRefs"` -} - -// Addon contains addon info -type Addon struct { - Category string `yaml:"category,omitempty"` - ClusterTypes []string `yaml:"clusterTypes,omitempty"` - Version string `yaml:"version,omitempty"` - TemplatesImagePath string `yaml:"templatesImagePath,omitempty"` - TemplatesImageTag string `yaml:"templatesImageTag,omitempty"` - AddonTemplatesImage []ComponentReference `yaml:"addonTemplatesImage,omitempty"` - AddonContainerImages []ComponentReference `yaml:"addonContainerImages,omitempty"` - PackageName string `yaml:"packageName,omitempty"` -} - -// BomContent contains the content of a BOM file -type BomContent struct { - Release Release `yaml:"release"` - Components map[string][]ComponentInfo `yaml:"components"` - ImageConfig ImageConfig `yaml:"imageConfig"` - OVA OVAInfos `yaml:"ova"` - AMI AMIInfos `yaml:"ami,omitempty"` - Azure AzureInfos `yaml:"azure,omitempty"` - Addons Addons `yaml:"addons,omitempty"` -} - -// Bom represents a BOM file -type Bom struct { - bom BomContent - initialzed bool -} - -// NewBom creates a new Bom from raw data -func NewBom(content []byte) (Bom, error) { - var bc BomContent - err := yaml.Unmarshal(content, &bc) - if err != nil { - return Bom{}, errors.Wrap(err, "error parsing the BOM file content") - } - - if bc.Release.Version == "" { - return Bom{}, errors.New("bom does not contain proper release information") - } - if len(bc.Components) == 0 { - return Bom{}, errors.New("bom does not contain release component information") - } - - if bc.ImageConfig.ImageRepository == "" { - return Bom{}, errors.New("bom does not contain image repository information") - } - - return Bom{ - bom: bc, - initialzed: true, - }, nil -} - -// GetReleaseVersion gets the Tanzu release version -func (b *Bom) GetReleaseVersion() (string, error) { - if !b.initialzed { - return "", errors.New("the BOM is not initialized") - } - return b.bom.Release.Version, nil -} - -// GetComponent gets a release component -func (b *Bom) GetComponent(name string) ([]ComponentInfo, error) { - if !b.initialzed { - return []ComponentInfo{}, errors.New("the BOM is not initialized") - } - if component, ok := b.bom.Components[name]; ok { - return component, nil - } - return []ComponentInfo{}, errors.Errorf("unable to find the component %s", name) -} - -// GetImageInfo gets a image in a component of specific version. -// If version is "" or not found, get the image of the first version in the component array -func (b *Bom) GetImageInfo(componentName, componentVersion, imageName string) (ImageInfo, error) { - if !b.initialzed { - return ImageInfo{}, errors.New("the BOM is not initialized") - } - components, ok := b.bom.Components[componentName] - if !ok { - return ImageInfo{}, errors.Errorf("unable to find the component %s", componentName) - } - if len(components) < 1 { - return ImageInfo{}, errors.Errorf("Empty component list in BOM for %s", componentName) - } - - versionIndex := 0 - if componentVersion != "" { - for idx, component := range components { - if component.Version == componentVersion { - versionIndex = idx - break - } - } - } - if image, ok := components[versionIndex].Images[imageName]; ok { - return image, nil - } - return ImageInfo{}, errors.Errorf("unable to find image %s in component %s", imageName, componentName) -} - -// Components gets all release components in the BOM file -func (b *Bom) Components() (map[string][]ComponentInfo, error) { - if !b.initialzed { - return nil, errors.New("the BOM is not initialized") - } - return b.bom.Components, nil -} - -// GetImageRepository gets the image repository -func (b *Bom) GetImageRepository() (string, error) { - if !b.initialzed { - return "", errors.New("the BOM is not initialized") - } - return b.bom.ImageConfig.ImageRepository, nil -} - -// Addons gets all the addons in the BOM -func (b *Bom) Addons() (Addons, error) { - if !b.initialzed { - return nil, errors.New("the BOM is not initialized") - } - return b.bom.Addons, nil -} - -// GetAddon gets an addon info from BOM -func (b *Bom) GetAddon(name string) (Addon, error) { - if !b.initialzed { - return Addon{}, errors.New("the BOM is not initialized") - } - - if addon, ok := b.bom.Addons[name]; ok { - return addon, nil - } - - return Addon{}, errors.Errorf("unable to find the Addon %s", name) -} - -// GetAzureInfo gets azure os image info -func (b *Bom) GetAzureInfo() ([]AzureInfo, error) { - if !b.initialzed { - return nil, errors.New("the BOM is not initialized") - } - return b.bom.Azure, nil -} - -// GetAMIInfo gets ami info -func (b *Bom) GetAMIInfo() (map[string][]AMIInfo, error) { - if !b.initialzed { - return nil, errors.New("the BOM is not initialized") - } - return b.bom.AMI, nil -} - -// GetOVAInfo gets vsphere ova info -func (b *Bom) GetOVAInfo() ([]OVAInfo, error) { - if !b.initialzed { - return nil, errors.New("the BOM is not initialized") - } - return b.bom.OVA, nil -} diff --git a/tkg/test/README.md b/tkg/test/README.md deleted file mode 100644 index 115b910b85..0000000000 --- a/tkg/test/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# TKG Integration tests - -## What are these tests? - -TKG integration tests validates the tkg client library used by the cluster, management-cluster plugins. -Some of these tests leverages CAPD provider to be able to run without needing access to any external cloud infrastructure. - -## How to run these tests locally? - -They are developed using the [Ginkgo testing framework](https://github.com/onsi/ginkgo). Here are the steps to run them locally: - -```sh -make tools -E2E_CONFIG=tkg/test/config/docker.yaml -hack/tools/bin/ginkgo -v -trace tkg/test/tkgctl/docker -``` - -If you want to run a single test - -```sh -E2E_CONFIG=tkg/test/config/docker.yaml -hack/tools/bin/ginkgo -v -trace --focus="" tkg/test/tkgctl/docker -``` - -In case of TKGS test cases, make sure sshuttle is running to connect tkgs cluster, also set HTTP_PROXY and HTTPS_PROXY values. Generate kube config file using the `kubectl vsphere log`, the token in tkgs kube config expires every 24hours, so need to regenerate kube config file. For the tkgs E2E_CONFIG config file, refer existing tkgs config from tkg/test/config/tkgs.yaml and do required changes. -example: - -```sh -sshuttle -r root@10.199.56.233 192.163.0.0/8 #let it keep running while running test cases -E2E_CONFIG=tkg/test/config/tkgs.yaml -HTTP_PROXY=192.163.1.163:3128 -HTTPS_PROXY=192.163.1.163:3128 -hack/tools/bin/ginkgo -v -trace tkg/test/tkgctl/tkgs -``` - -To run clusterclass based tests use `hack/tools/bin/ginkgo -v -trace tkg/test/tkgctl/tkgs_cc` in place of the final line. - -## Troubleshooting - -If you are running the CAPD based integration tests on an Apple system, it is recommended that Docker Desktop is allocated the following resources at -minimum: - -- Memory: 6GB+ -- Swap: 2GB+ -- Disk image size: 100GB+ diff --git a/tkg/test/cc_setup.md b/tkg/test/cc_setup.md deleted file mode 100644 index e9164cbda3..0000000000 --- a/tkg/test/cc_setup.md +++ /dev/null @@ -1,31 +0,0 @@ -# Deploy management and workload cluster on AWS using the ClusterClass mechanism - -- Build the CLI - - make build-install-cli-local - -- Export below environment variables: (This is needed until TKR source controller is able to deploy TKR related resources on the cluster.) - -```bash -export _MANAGEMENT_PACKAGE_REPO_IMAGE=gcr.io/eminent-nation-87317/tanzu_framework/github-actions/main/management:v0.21.0 -export _MANAGEMENT_PACKAGE_VERSION=0.21.0 -``` - -- Make sure to enable the feature-flag for `package-based-cc` - -```bash -tanzu config set features.management-cluster.package-based-cc true -``` - -By default, it's true. You can check it use `tanzu config get` - -- Create aws management-cluster using existing VPC. - -```bash -tanzu management-cluster create --ui -``` - -- Created management-cluster will have all the ClusterClass and latest components deployed on the management-cluster. So, you can use this management-cluster to create ClusterClass based workload cluster - -```bash -tanzu cluster create --file -``` diff --git a/tkg/test/cmp/strings/doc.go b/tkg/test/cmp/strings/doc.go deleted file mode 100644 index 67f5c53418..0000000000 --- a/tkg/test/cmp/strings/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package strings provides string related utilities for testing purposes. -package strings diff --git a/tkg/test/cmp/strings/slices.go b/tkg/test/cmp/strings/slices.go deleted file mode 100644 index 133e27c5ab..0000000000 --- a/tkg/test/cmp/strings/slices.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package strings - -import ( - "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/cmpopts" -) - -// SliceDiffIgnoreOrder returns a human-readable diff of two string slices. -// Two slices are considered equal when they have the same length and same elements. The order of the elements is -// ignored while comparing. Nil and empty slices are considered equal. -// -// This function is intended to be used in tests for comparing expected and actual values, and printing the diff for -// users to debug: -// -// if diff := SliceDiffIgnoreOrder(got, want); diff != "" { -// t.Errorf("got: %v, want: %v, diff: %s", got, want, diff) -// } -func SliceDiffIgnoreOrder(a, b []string) string { - return cmp.Diff(a, b, cmpopts.EquateEmpty(), cmpopts.SortSlices(func(x, y string) bool { return x < y })) -} diff --git a/tkg/test/cmp/strings/slices_test.go b/tkg/test/cmp/strings/slices_test.go deleted file mode 100644 index 6fd9e774a3..0000000000 --- a/tkg/test/cmp/strings/slices_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2. - -package strings - -import "testing" - -func TestSliceDiffIgnoreOrder(t *testing.T) { - testCases := []struct { - description string - a []string - b []string - diffEmpty bool - }{ - { - "Non empty diff - elements different", - []string{"abc", "def"}, - []string{"abc", "ghi"}, - false, - }, - { - "Empty diff - same elements", - []string{"abc", "def"}, - []string{"abc", "def"}, - true, - }, - { - "Empty diff - same elements unordered", - []string{"abc", "def", "ghi"}, - []string{"def", "ghi", "abc"}, - true, - }, - { - "Empty diff - nil slices", - nil, - nil, - true, - }, - { - "Empty diff - non nil empty slices", - []string{}, - []string{}, - true, - }, - { - "Empty diff - nil and non-nil slices", - nil, - []string{}, - true, - }, - } - for _, tc := range testCases { - t.Run(tc.description, func(t *testing.T) { - diff := SliceDiffIgnoreOrder(tc.a, tc.b) - if (len(diff) == 0) != tc.diffEmpty { - t.Errorf("expected diffEmpty to be %t, got diff: %s", tc.diffEmpty, diff) - } - }) - } -} diff --git a/tkg/test/config/aws.yaml b/tkg/test/config/aws.yaml deleted file mode 100644 index bfbdf65ba5..0000000000 --- a/tkg/test/config/aws.yaml +++ /dev/null @@ -1,22 +0,0 @@ ---- -infrastructure_name: aws -default_timeout: 45m -cluster_prefix: "tkg-cc-" -tkg_config_variables: - AWS_REGION: "us-west-2" - AWS_SSH_KEY_NAME: tanzu-ci - AWS_ACCESS_KEY_ID: "" - AWS_SECRET_ACCESS_KEY: "" - AWS_SESSION_TOKEN: "" - AWS_VPC_ID: vpc-03cc2405cb3296eff - AWS_NODE_AZ: us-west-2a - AWS_NODE_AZ_1: us-west-2b - AWS_NODE_AZ_2: us-west-2c - AWS_PUBLIC_SUBNET_ID: subnet-098e24fab92d5f00b - AWS_PUBLIC_SUBNET_ID_1: subnet-0d26c7629c4cb8d43 - AWS_PUBLIC_SUBNET_ID_2: subnet-0270847904387f6ff - AWS_PRIVATE_SUBNET_ID: subnet-0d5632de63848dc6f - AWS_PRIVATE_SUBNET_ID_1: subnet-0acd6c6ce440f3e37 - AWS_PRIVATE_SUBNET_ID_2: subnet-0bf9da4d47e246d46 -management_cluster_options: - plan: dev diff --git a/tkg/test/config/azure.yaml b/tkg/test/config/azure.yaml deleted file mode 100644 index 3581ed8bfe..0000000000 --- a/tkg/test/config/azure.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -infrastructure_name: azure -cluster_prefix: "" -tkg_config_variables: - ENABLE_CEIP_PARTICIPATION: "false" - AZURE_SUBSCRIPTION_ID: "" - AZURE_TENANT_ID: "" - AZURE_CLIENT_ID: "" - AZURE_CLIENT_SECRET: "" - AZURE_LOCATION: eastus2 - AZURE_SSH_PUBLIC_KEY_B64: >- - c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFDeGJUQVNQdDFXemNtdGl0VGVlTVpPWDRRdG1ROURvSUFydGNwSXJVTkgzL1dJTjhna3RDSURGSklQQzA2RGNMekh5QzlKeUxRcmEyODdqWktFZUp0OUhVZ215UDBwVEI0R3dsUjQxSnNaMm1uRU05bHI0YVQyQy96eDlkWE94d0tyMWlONnpjUlhjOHJlYk9xZlJKdG8xSEd1WkF6SVdOWXJ0ZDZKWSsxL2MxWXJFaVhmeUhOWVdJK3drdzdQaWJBOUlMSnh1SW00L01xNHJVUlNUL2FSclVsSVRZQStvK1FqRjZPNDQyMkFTaXl0UUxQRVVrb2VmMHQrRnNLSms3YXBnaHFLT2tIaVRPTTkzTkd6MVZpU2V6ZlNrR21oc0xIOXVxQ0ovaDQwektFWGJNbEh1NjBML3VOOHhUcEhhMWY2MWh1cU90WDZzelN2M0RkcWdpVFogc2FpYkBzYWliLWEwMS52bXdhcmUuY29t - ENABLE_MHC: "true" - MHC_UNKNOWN_STATUS_TIMEOUT: "20m" - MHC_FALSE_STATUS_TIMEOUT: "120m" - NODE_STARTUP_TIMEOUT: "200m" -management_cluster_options: - plan: dev diff --git a/tkg/test/config/cc/aws/aws_cc_package_config.yaml b/tkg/test/config/cc/aws/aws_cc_package_config.yaml deleted file mode 100644 index 3832d6ec84..0000000000 --- a/tkg/test/config/cc/aws/aws_cc_package_config.yaml +++ /dev/null @@ -1,20 +0,0 @@ ---- -AWS_SSH_KEY_NAME: "" -AWS_REGION: "us-west-2" -BASTION_HOST_ENABLED: true -AWS_VPC_CIDR: "10.0.0.0/16" -AWS_VPC_ID: "" -AWS_NODE_AZ: "" -AWS_PRIVATE_NODE_CIDR: "" -AWS_PRIVATE_SUBNET_ID: "" -CONTROL_PLANE_MACHINE_TYPE: t3.large -NODE_MACHINE_TYPE: m5.large -AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB: 100 -AWS_NODE_OS_DISK_SIZE_GIB: 100 -NAMESPACE: default -ENABLE_MHC: true -ENABLE_MHC_WORKER_NODE: true -ENABLE_MHC_CONTROL_PLANE: true -MHC_UNKNOWN_STATUS_TIMEOUT: 5m -MHC_FALSE_STATUS_TIMEOUT: 12m -NODE_STARTUP_TIMEOUT: 20m diff --git a/tkg/test/config/cc/aws/aws_cc_wc_config.yaml b/tkg/test/config/cc/aws/aws_cc_wc_config.yaml deleted file mode 100644 index 838631f470..0000000000 --- a/tkg/test/config/cc/aws/aws_cc_wc_config.yaml +++ /dev/null @@ -1,57 +0,0 @@ -AWS_AMI_ID: ami-01a5a0b7cc1c008f6 -AWS_NODE_AZ: us-west-2a -AWS_NODE_AZ_1: us-west-2b -AWS_NODE_AZ_2: us-west-2c -AWS_PRIVATE_NODE_CIDR: 10.0.16.0/20 -AWS_PRIVATE_NODE_CIDR_1: "" -AWS_PRIVATE_NODE_CIDR_2: "" -AWS_PRIVATE_SUBNET_ID: subnet-0d5632de63848dc6f -AWS_PRIVATE_SUBNET_ID_1: subnet-0acd6c6ce440f3e37 -AWS_PRIVATE_SUBNET_ID_2: subnet-0bf9da4d47e246d46 -AWS_PROFILE: default -AWS_PUBLIC_NODE_CIDR: 10.0.0.0/20 -AWS_PUBLIC_NODE_CIDR_1: "" -AWS_PUBLIC_NODE_CIDR_2: "" -AWS_PUBLIC_SUBNET_ID: subnet-098e24fab92d5f00b -AWS_PUBLIC_SUBNET_ID_1: subnet-0d26c7629c4cb8d43 -AWS_PUBLIC_SUBNET_ID_2: subnet-0270847904387f6ff -AWS_REGION: us-west-2 -AWS_SSH_KEY_NAME: default -AWS_VPC_CIDR: 10.0.0.0/16 -AWS_VPC_ID: vpc-03cc2405cb3296eff -BASTION_HOST_ENABLED: "true" -CLUSTER_ANNOTATIONS: description:,location:, -CLUSTER_CIDR: 100.96.0.0/11 -CLUSTER_NAME: workload -CLUSTER_PLAN: devcc -CONTROL_PLANE_MACHINE_TYPE: t3.large -ENABLE_CEIP_PARTICIPATION: "false" -ENABLE_MHC: "false" -IDENTITY_MANAGEMENT_TYPE: none -INFRASTRUCTURE_PROVIDER: aws -LDAP_BIND_DN: "" -LDAP_BIND_PASSWORD: "" -LDAP_GROUP_SEARCH_BASE_DN: "" -LDAP_GROUP_SEARCH_FILTER: "" -LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE: "" -LDAP_GROUP_SEARCH_NAME_ATTRIBUTE: cn -LDAP_GROUP_SEARCH_USER_ATTRIBUTE: DN -LDAP_HOST: "" -LDAP_ROOT_CA_DATA_B64: "" -LDAP_USER_SEARCH_BASE_DN: "" -LDAP_USER_SEARCH_FILTER: "" -LDAP_USER_SEARCH_NAME_ATTRIBUTE: "" -LDAP_USER_SEARCH_USERNAME: userPrincipalName -NODE_MACHINE_TYPE: t3.large -OIDC_IDENTITY_PROVIDER_CLIENT_ID: "" -OIDC_IDENTITY_PROVIDER_CLIENT_SECRET: "" -OIDC_IDENTITY_PROVIDER_GROUPS_CLAIM: "" -OIDC_IDENTITY_PROVIDER_ISSUER_URL: "" -OIDC_IDENTITY_PROVIDER_NAME: "" -OIDC_IDENTITY_PROVIDER_SCOPES: "" -OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM: "" -OS_ARCH: amd64 -OS_NAME: ubuntu -OS_VERSION: "20.04" -SERVICE_CIDR: 100.64.0.0/13 -TKG_HTTP_PROXY_ENABLED: "false" diff --git a/tkg/test/config/cc/docker/docker.yaml b/tkg/test/config/cc/docker/docker.yaml deleted file mode 100644 index bc5c4481c9..0000000000 --- a/tkg/test/config/cc/docker/docker.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -infrastructure_name: docker -management_cluster_name: tkg-mc-2 -tkg_config_variables: - ENABLE_CEIP_PARTICIPATION: "false" -management_cluster_options: - plan: devcc diff --git a/tkg/test/config/docker.yaml b/tkg/test/config/docker.yaml deleted file mode 100644 index b05476190d..0000000000 --- a/tkg/test/config/docker.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -infrastructure_name: docker -management_cluster_name: tkg-mc -tkg_config_variables: - ENABLE_CEIP_PARTICIPATION: "false" -management_cluster_options: - plan: dev diff --git a/tkg/test/config/oracle.yaml b/tkg/test/config/oracle.yaml deleted file mode 100644 index 2f9f6990c4..0000000000 --- a/tkg/test/config/oracle.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- -infrastructure_name: oci -management_cluster_name: tkg-mc -tkg_config_variables: - ENABLE_CEIP_PARTICIPATION: "false" - PROVIDER_TYPE: oci -management_cluster_options: - plan: dev diff --git a/tkg/test/config/packages/core-management-plugins/kbld-config_test.yaml b/tkg/test/config/packages/core-management-plugins/kbld-config_test.yaml deleted file mode 100644 index c8c27862ff..0000000000 --- a/tkg/test/config/packages/core-management-plugins/kbld-config_test.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: kbld.k14s.io/v1alpha1 -kind: Config -overrides: - - image: tanzu-cli-plugins/cluster-linux-amd64:latest - newImage: gcr.io/eminent-nation-87317/tkg/test12/tanzu-cli-plugins/cluster-linux-amd64:latest - - image: tanzu-cli-plugins/kubernetes-release-linux-amd64:latest - newImage: gcr.io/eminent-nation-87317/tkg/test12/tanzu-cli-plugins/kubernetes-release-linux-amd64:latest - - image: tanzu-cli-plugins/feature-linux-amd64:latest - newImage: gcr.io/eminent-nation-87317/tkg/test12/tanzu-cli-plugins/feature-linux-amd64:latest - - - image: tanzu-cli-plugins/cluster-darwin-amd64:latest - newImage: gcr.io/eminent-nation-87317/tkg/test12/tanzu-cli-plugins/cluster-darwin-amd64:latest - - image: tanzu-cli-plugins/kubernetes-release-darwin-amd64:latest - newImage: gcr.io/eminent-nation-87317/tkg/test12/tanzu-cli-plugins/kubernetes-release-darwin-amd64:latest - - image: tanzu-cli-plugins/feature-darwin-amd64:latest - newImage: gcr.io/eminent-nation-87317/tkg/test12/tanzu-cli-plugins/feature-darwin-amd64:latest - - - image: tanzu-cli-plugins/cluster-windows-amd64:latest - newImage: gcr.io/eminent-nation-87317/tkg/test12/tanzu-cli-plugins/cluster-windows-amd64:latest - - image: tanzu-cli-plugins/kubernetes-release-windows-amd64:latest - newImage: gcr.io/eminent-nation-87317/tkg/test12/tanzu-cli-plugins/kubernetes-release-windows-amd64:latest - - image: tanzu-cli-plugins/feature-windows-amd64:latest - newImage: gcr.io/eminent-nation-87317/tkg/test12/tanzu-cli-plugins/feature-windows-amd64:latest diff --git a/tkg/test/config/template.yaml b/tkg/test/config/template.yaml deleted file mode 100644 index 87f98823f2..0000000000 --- a/tkg/test/config/template.yaml +++ /dev/null @@ -1,53 +0,0 @@ -# infrastructure name [aws, azure, docker, vsphere] -infrastructure_name: "" - -# infrastructure version -infrastructure_version: "" - -# cluster api version -capi_version: "" - -# kubernetes version -kubernetes_version: "" - -# tkg cli path -tkg_cli_path: "" - -# default timeout used in tkg cli commands -default_timeout: "" - -# path to the tkg config file -tkg_config_path: - -# config variables to be present in the tkg config file -tkg_config_variables: {} - -# management cluster name -management_cluster_name: "" - -# tkg cluster prefix used to cleanup resources -cluster_prefix: "" - -# log level -tkg_cli_log_level: "" - -# management cluster options -management_cluster_options: - plan: dev - -# Upgrade -# -------- -# infrastructure version -infrastructure_version_old: "" - -# cluster api version -capi_version_old: "" - -# kubernetes version -kubernetes_version_old: "" - -# tkg cli path -tkg_cli_path_old: "" - -# upgrade management cluster [true/false] -upgrade_management_cluster: "" diff --git a/tkg/test/config/tkgs.yaml b/tkg/test/config/tkgs.yaml deleted file mode 100644 index 230a2aead8..0000000000 --- a/tkg/test/config/tkgs.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -infrastructure_name: tkgs -kubernetes_version: v1.22.8---vmware.1-tkg.2-zshippable -tkgs_kubeconfig_path: /Users/kubeconfig.conf -tkgs_kubeconfig_context: 192.168.124.1 -workload_cluster_options: - NAMESPACE: ns01 - CLUSTER_CIDR: 100.96.0.0/11 - CLUSTER_NAME: tkc-prod-01 - CLUSTER_PLAN: dev - INFRASTRUCTURE_PROVIDER: tkg-service-vsphere - OS_ARCH: amd64 - OS_NAME: ubuntu - OS_VERSION: "20.04" - SERVICE_CIDR: 100.64.0.0/13 - SERVICE_DOMAIN: "cluster.local" - CONTROL_PLANE_STORAGE_CLASS: "wcpglobal-storage-profile" - WORKER_STORAGE_CLASS: "wcpglobal-storage-profile" - CONTROL_PLANE_VM_CLASS: "best-effort-small" - WORKER_VM_CLASS: "best-effort-small" - NODE_POOL_0_NAME: "workers-name-overwrite" - CLUSTER_CLASS_FILE_PATH: /Users/clusterClass.yaml - CLUSTER_CLASS_CB_FILE_PATH: ../test/data/testdata/customClusterBootstrapAntrea.yaml diff --git a/tkg/test/config/vsphere.yaml b/tkg/test/config/vsphere.yaml deleted file mode 100644 index 6e6487126f..0000000000 --- a/tkg/test/config/vsphere.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -infrastructure_name: vsphere -infrastructure_version: v0.7.6 -capi_version: v0.3.10 -kubernetes_version: v1.20.4+vmware.1 -management_cluster_options: - plan: dev diff --git a/tkg/test/data/cert-manager-resources.yaml b/tkg/test/data/cert-manager-resources.yaml deleted file mode 100644 index a2b67bd168..0000000000 --- a/tkg/test/data/cert-manager-resources.yaml +++ /dev/null @@ -1,25 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: tkg-cert-manager-test ---- -apiVersion: cert-manager.io/v1 -kind: Issuer -metadata: - name: test-selfsigned - namespace: tkg-cert-manager-test -spec: - selfSigned: {} ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: selfsigned-cert - namespace: tkg-cert-manager-test -spec: - dnsNames: - - example.com - secretName: selfsigned-cert-tls - issuerRef: - name: test-selfsigned diff --git a/tkg/test/data/nginx_autoscaler.yaml b/tkg/test/data/nginx_autoscaler.yaml deleted file mode 100644 index 24a3375c4d..0000000000 --- a/tkg/test/data/nginx_autoscaler.yaml +++ /dev/null @@ -1,25 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nginx-deployment - labels: - app: nginx -spec: - replicas: 2 - selector: - matchLabels: - app: nginx - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx:1.14.2 - ports: - - containerPort: 80 - resources: - requests: - cpu: "1.1" diff --git a/tkg/test/data/testdata/customClusterBootstrapAntrea.yaml b/tkg/test/data/testdata/customClusterBootstrapAntrea.yaml deleted file mode 100644 index 58b92c74ca..0000000000 --- a/tkg/test/data/testdata/customClusterBootstrapAntrea.yaml +++ /dev/null @@ -1,78 +0,0 @@ -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: cc-cb - namespace: customcb-ns -spec: - antrea: - config: - disableUdpTunnelOffload: false - featureGates: - AntreaPolicy: true - AntreaProxy: true - AntreaTraceflow: false - Egress: true - EndpointSlice: true - FlowExporter: false - NodePortLocal: true - noSNAT: false - trafficEncapMode: encap ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - annotations: - tkg.tanzu.vmware.com/add-missing-fields-from-tkr: v1.23.5---vmware.1-tkg.1-zshippable - name: cc-cb - namespace: customcb-ns -spec: - additionalPackages: - - refName: metrics-server* - - refName: secretgen-controller* - - refName: pinniped* - cni: - refName: antrea* - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: cc-cb - kapp: - refName: kapp-controller* ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: cc-cb - namespace: customcb-ns -spec: - clusterNetwork: - pods: - cidrBlocks: - - 192.0.2.0/16 - serviceDomain: cluster.local - services: - cidrBlocks: - - 198.51.100.0/12 - topology: - class: tanzukubernetescluster - controlPlane: - metadata: {} - replicas: 1 - variables: - - name: storageClasses - value: - - wcpglobalstorageprofile - - name: ntp - value: time1.vmware.com - - name: vmClass - value: best-effort-small - - name: storageClass - value: wcpglobalstorageprofile - version: v1.23.5+vmware.1-tkg.1-zshippable - workers: - machineDeployments: - - class: node-pool - metadata: {} - name: np-2 - replicas: 1 diff --git a/tkg/test/data/testdata/customClusterBootstrapInline.yaml b/tkg/test/data/testdata/customClusterBootstrapInline.yaml deleted file mode 100644 index 4c9b0e2864..0000000000 --- a/tkg/test/data/testdata/customClusterBootstrapInline.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - annotations: - tkg.tanzu.vmware.com/add-missing-fields-from-tkr: v1.23.5---vmware.1-tkg.1-zshippable - name: cc-inline - namespace: customcb-ns -spec: - additionalPackages: - - refName: secretgen-controller.tanzu.vmware.com.0.9.1+vmware.1-tkg.1-zshippable - - refName: pinniped.tanzu.vmware.com.0.12.1+vmware.1-tkg.1-zshippable - - refName: guest-cluster-auth-service.tanzu.vmware.com.1.0.0+tkg.1-zshippable - - refName: capabilities.tanzu.vmware.com.0.25.0-dev-12-g9305a725+vmware.1 - - refName: metrics-server.tanzu.vmware.com.0.6.1+vmware.1-tkg.1-zshippable - valuesFrom: - inline: - metricsServer: - config: - probe: - periodSeconds: 15 - cni: - refName: antrea.tanzu.vmware.com.1.5.2+vmware.3-tkg.1-advanced-zshippable - kapp: - refName: kapp-controller.tanzu.vmware.com.0.38.4+vmware.1-tkg.1-zshippable ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: cc-inline - namespace: customcb-ns -spec: - clusterNetwork: - pods: - cidrBlocks: - - 192.0.2.0/16 - serviceDomain: cluster.local - services: - cidrBlocks: - - 198.51.100.0/12 - topology: - class: tanzukubernetescluster - controlPlane: - metadata: {} - replicas: 1 - variables: - - name: storageClasses - value: - - wcpglobalstorageprofile - - name: ntp - value: time1.vmware.com - - name: vmClass - value: best-effort-small - - name: storageClass - value: wcpglobalstorageprofile - version: v1.23.5+vmware.1-tkg.1-zshippable - workers: - machineDeployments: - - class: node-pool - metadata: {} - name: np-2 - replicas: 1 diff --git a/tkg/test/data/testdata/customClusterBootstrapInlineUpdate.yaml b/tkg/test/data/testdata/customClusterBootstrapInlineUpdate.yaml deleted file mode 100644 index d2ef166540..0000000000 --- a/tkg/test/data/testdata/customClusterBootstrapInlineUpdate.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - annotations: - tkg.tanzu.vmware.com/add-missing-fields-from-tkr: v1.23.5---vmware.1-tkg.1-zshippable - name: cc-inline - namespace: customcb-ns -spec: - additionalPackages: - - refName: secretgen-controller.tanzu.vmware.com.0.9.1+vmware.1-tkg.1-zshippable - - refName: pinniped.tanzu.vmware.com.0.12.1+vmware.1-tkg.1-zshippable - - refName: guest-cluster-auth-service.tanzu.vmware.com.1.0.0+tkg.1-zshippable - - refName: capabilities.tanzu.vmware.com.0.25.0-dev-12-g9305a725+vmware.1 - - refName: metrics-server.tanzu.vmware.com.0.6.1+vmware.1-tkg.1-zshippable - valuesFrom: - inline: - metricsServer: - config: - probe: - periodSeconds: 20 - cni: - refName: antrea.tanzu.vmware.com.1.5.2+vmware.3-tkg.1-advanced-zshippable - kapp: - refName: kapp-controller.tanzu.vmware.com.0.38.4+vmware.1-tkg.1-zshippable ---- -apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: cc-inline - namespace: customcb-ns -spec: - clusterNetwork: - pods: - cidrBlocks: - - 192.0.2.0/16 - serviceDomain: cluster.local - services: - cidrBlocks: - - 198.51.100.0/12 - topology: - class: tanzukubernetescluster - controlPlane: - metadata: {} - replicas: 1 - variables: - - name: storageClasses - value: - - wcpglobalstorageprofile - - name: ntp - value: time1.vmware.com - - name: vmClass - value: best-effort-small - - name: storageClass - value: wcpglobalstorageprofile - version: v1.23.5+vmware.1-tkg.1-zshippable - workers: - machineDeployments: - - class: node-pool - metadata: {} - name: np-2 - replicas: 1 diff --git a/tkg/test/framework/cluster_proxy.go b/tkg/test/framework/cluster_proxy.go deleted file mode 100644 index 8224694f68..0000000000 --- a/tkg/test/framework/cluster_proxy.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package framework implements the test framework. -package framework - -import ( - "context" - - . "github.com/onsi/gomega" // nolint:stylecheck - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" - "k8s.io/client-go/tools/clientcmd" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - "sigs.k8s.io/controller-runtime/pkg/client" - - kappcontrollerv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// ClusterProxy hold information to connect to a cluster -type ClusterProxy struct { - name string - kubeconfigPath string - contextName string - scheme *runtime.Scheme -} - -// NewClusterProxy returns clusterProxy -func NewClusterProxy(name, kubeconfigPath, contextName string) *ClusterProxy { - if kubeconfigPath == "" { - kubeconfigPath = clientcmd.NewDefaultClientConfigLoadingRules().GetDefaultFilename() - } - - proxy := &ClusterProxy{ - name: name, - kubeconfigPath: kubeconfigPath, - contextName: contextName, - scheme: initScheme(), - } - - return proxy -} - -// GetRestConfig returns the RestConfig of a cluster -func (p *ClusterProxy) GetRestConfig() *rest.Config { - config, err := clientcmd.LoadFromFile(p.kubeconfigPath) - Expect(err).ToNot(HaveOccurred(), "Failed to load Kubeconfig file from %q", p.kubeconfigPath) - - configOverrides := &clientcmd.ConfigOverrides{} - if p.contextName != "" { - configOverrides.CurrentContext = p.contextName - } - - restConfig, err := clientcmd.NewDefaultClientConfig(*config, configOverrides).ClientConfig() - Expect(err).ToNot(HaveOccurred(), "Failed to get ClientConfig for context %q from %q", p.contextName, p.kubeconfigPath) - - restConfig.UserAgent = "tkg-cli-e2e" - return restConfig -} - -// GetClient gets the Client of a cluster -func (p *ClusterProxy) GetClient() client.Client { - config := p.GetRestConfig() - - c, err := client.New(config, client.Options{Scheme: p.scheme}) - Expect(err).ToNot(HaveOccurred(), "Failed to get controller-runtime client") - - return c -} - -// GetClientSet gets the ClientSet of a cluster -func (p *ClusterProxy) GetClientSet() *kubernetes.Clientset { - restConfig := p.GetRestConfig() - - cs, err := kubernetes.NewForConfig(restConfig) - Expect(err).ToNot(HaveOccurred(), "Failed to get client-go client") - - return cs -} - -// GetScheme returns scheme -func (p *ClusterProxy) GetScheme() *runtime.Scheme { - return p.scheme -} - -// GetClusterNodes gets the cluster Nodes -func (p *ClusterProxy) GetClusterNodes() []corev1.Node { - clientSet := p.GetClientSet() - nodeList, err := clientSet.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{}) - Expect(err).ToNot(HaveOccurred()) - return nodeList.Items -} - -// GetKubernetesVersion gets the k8s version -func (p *ClusterProxy) GetKubernetesVersion() string { - clientSet := p.GetClientSet() - version, err := clientSet.ServerVersion() - Expect(err).ToNot(HaveOccurred()) - return version.String() -} - -// GetProviderVersions gets the TKG provider versions -func (p *ClusterProxy) GetProviderVersions(ctx context.Context) map[string]string { - c := p.GetClient() - var providers clusterctlv1.ProviderList - err := c.List(ctx, &providers) - Expect(err).ToNot(HaveOccurred()) - - providersMap := map[string]string{} - for i := range providers.Items { - providersMap[providers.Items[i].ProviderName] = providers.Items[i].Version - } - - return providersMap -} - -// GetPackages gets the package objects in a namespace -func (p *ClusterProxy) GetPackages(ctx context.Context, namespace string) []*kappcontrollerv1alpha1.Package { - c := p.GetClient() - packagesList := &kappcontrollerv1alpha1.PackageList{} - listOptions := &client.ListOptions{ - Namespace: namespace, - } - err := c.List(ctx, packagesList, listOptions) - Expect(err).ToNot(HaveOccurred()) - packages := make([]*kappcontrollerv1alpha1.Package, len(packagesList.Items)) - for i := range packagesList.Items { - packages[i] = &packagesList.Items[i] - } - return packages -} - -// GetTKRs gets the TKRs available in management cluster -func (p *ClusterProxy) GetTKRs(ctx context.Context) []*runv1.TanzuKubernetesRelease { - c := p.GetClient() - var tkrList runv1.TanzuKubernetesReleaseList - err := c.List(ctx, &tkrList) - Expect(err).ToNot(HaveOccurred()) - - var tkrs []*runv1.TanzuKubernetesRelease - for i := range tkrList.Items { - tkrs = append(tkrs, &tkrList.Items[i]) - } - return tkrs -} - -// GetOSImages gets the OSImages available in management cluster -func (p *ClusterProxy) GetOSImages(ctx context.Context) []*runv1.OSImage { - c := p.GetClient() - var osImageList runv1.OSImageList - err := c.List(ctx, &osImageList) - Expect(err).ToNot(HaveOccurred()) - - var osImages = make([]*runv1.OSImage, len(osImageList.Items)) - for i := range osImageList.Items { - osImages[i] = &osImageList.Items[i] - } - return osImages -} - -// GetCluster gets the v1beta1 cluster object -func (p *ClusterProxy) GetCluster(ctx context.Context, clusterName, namespace string) *clusterv1.Cluster { - c := p.GetClient() - cluster := &clusterv1.Cluster{} - objKey := client.ObjectKey{ - Name: clusterName, - Namespace: namespace, - } - err := c.Get(ctx, objKey, cluster) - Expect(err).ToNot(HaveOccurred()) - return cluster -} - -// GetClusterClass gets the v1beta1 clusterclass object -func (p *ClusterProxy) GetClusterClass(ctx context.Context, clusterClassName, namespace string) *clusterv1.ClusterClass { - c := p.GetClient() - cc := &clusterv1.ClusterClass{} - objKey := client.ObjectKey{ - Name: clusterClassName, - Namespace: namespace, - } - err := c.Get(ctx, objKey, cc) - Expect(err).ToNot(HaveOccurred()) - return cc -} -func initScheme() *runtime.Scheme { - sc := runtime.NewScheme() - AddDefaultSchemes(sc) - return sc -} diff --git a/tkg/test/framework/e2e_config.go b/tkg/test/framework/e2e_config.go deleted file mode 100644 index 73558e7ade..0000000000 --- a/tkg/test/framework/e2e_config.go +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package framework - -import ( - "context" - "fmt" - "os" - "path/filepath" - "time" - - . "github.com/onsi/gomega" // nolint:stylecheck - "github.com/pkg/errors" - "sigs.k8s.io/yaml" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigupdater" -) - -const ( - // TkgDefaultClusterPrefix is TKG cluster prefix - TkgDefaultClusterPrefix = "tkg-cli-" - - // TkgDefaultTimeout is the default timeout - TkgDefaultTimeout = "30m" - - // TkgDefaultLogLevel is the default log level - TkgDefaultLogLevel = 6 -) - -// E2EConfigInput is the input to E2E test suite -type E2EConfigInput struct { - ConfigPath string -} - -// ManagementClusterOptions represents all options to create a management cluster -type ManagementClusterOptions struct { - Endpoint string `yaml:"endpoint,omitempty"` - Plan string `yaml:"plan,omitempty"` - Size string `yaml:"size,omitempty"` - DeployTKGonVsphere7 bool `yaml:"deploy_tkg_on_vSphere7,omitempty"` - EnableTKGSOnVsphere7 bool `yaml:"enable_tkgs_on_vSphere7,omitempty"` -} - -// WorkloadClusterOptions represents options to create workload cluster -type WorkloadClusterOptions struct { - ClusterName string `json:"CLUSTER_NAME,omitempty"` - Namespace string `json:"NAMESPACE,omitempty"` - ClusterPlan string `json:"CLUSTER_PLAN,omitempty"` - ClusterCIDR string `json:"CLUSTER_CIDR,omitempty"` - ServiceCIDR string `json:"SERVICE_CIDR,omitempty"` - InfrastructureProvider string `json:"INFRASTRUCTURE_PROVIDER,omitempty"` - OSArch string `json:"OS_ARCH,omitempty"` - OSName string `json:"OS_NAME,omitempty"` - OSVersion string `json:"OS_VERSION,omitempty"` - ServiceDomain string `json:"SERVICE_DOMAIN,omitempty"` - ControlPlaneStorageClass string `json:"CONTROL_PLANE_STORAGE_CLASS,omitempty"` - WorkerStorageClass string `json:"WORKER_STORAGE_CLASS,omitempty"` - ControlPlaneVMClass string `json:"CONTROL_PLANE_VM_CLASS,omitempty"` - WorkerVMClass string `json:"WORKER_VM_CLASS,omitempty"` - NodePoolName string `json:"NODE_POOL_0_NAME,omitempty"` - ClusterClassFilePath string `json:"CLUSTER_CLASS_FILE_PATH,omitempty"` - ClusterClassCBFilePath string `json:"CLUSTER_CLASS_CB_FILE_PATH,omitempty"` -} - -// E2EConfig represents the configuration for the e2e tests -type E2EConfig struct { - UseExistingCluster bool `json:"use_existing_cluster,omitempty"` - UpgradeManagementCluster bool `json:"upgrade_management_cluster,omitempty"` - TkgCliLogLevel int32 `json:"tkg_cli_log_level,omitempty"` - InfrastructureName string `json:"infrastructure_name,omitempty"` - InfrastructureVersion string `json:"infrastructure_version,omitempty"` - ClusterAPIVersion string `json:"capi_version,omitempty"` - TkrVersion string `json:"kubernetes_version,omitempty"` - TkgCliPath string `json:"tkg_cli_path,omitempty"` - InfrastructureVersionOld string `json:"infrastructure_version_old,omitempty"` - ClusterAPIVersionOld string `json:"capi_version_old,omitempty"` - KubernetesVersionOld string `json:"kubernetes_version_old,omitempty"` - TKGSKubeconfigPath string `json:"tkgs_kubeconfig_path,omitempty"` - TKGSKubeconfigContext string `json:"tkgs_kubeconfig_context,omitempty"` - TkgCliPathOld string `json:"tkg_cli_path_old,omitempty"` - DefaultTimeout string `json:"default_timeout,omitempty"` - TkgConfigDir string `json:"tkg_config_dir,omitempty"` - TkgClusterConfigPath string `json:"tkg_config_path,omitempty"` - ManagementClusterName string `json:"management_cluster_name,omitempty"` - ClusterPrefix string `json:"cluster_prefix,omitempty"` - TkgConfigVariables map[string]string `json:"tkg_config_variables,omitempty"` - ManagementClusterOptions ManagementClusterOptions `json:"management_cluster_options,omitempty"` - WorkloadClusterOptions WorkloadClusterOptions `json:"workload_cluster_options,omitempty"` -} - -// LoadE2EConfig loads the configuration for the e2e test environment -func LoadE2EConfig(ctx context.Context, input E2EConfigInput) *E2EConfig { - e2eConfigData, err := os.ReadFile(input.ConfigPath) - Expect(err).ToNot(HaveOccurred(), "Failed to read the e2e test config file") - Expect(e2eConfigData).ToNot(BeEmpty(), "The e2e test config file should not be empty") - - fmt.Printf("E2E Config Data: %s", string(e2eConfigData)) - e2econfig := &E2EConfig{} - Expect(yaml.Unmarshal(e2eConfigData, e2econfig)).To(Succeed(), "Failed to convert the e2e test config file to yaml") - - e2eConfigString, err := yaml.Marshal(e2econfig) - if err == nil { - fmt.Printf("E2E CONFIG: %s", string(e2eConfigString)) - } - - e2econfig.Defaults() - Expect(e2econfig.Validate()).To(Succeed(), "e2e test configuration is not valid") - return e2econfig -} - -// Defaults assign default values to the config if not present -func (c *E2EConfig) Defaults() { - if c.ClusterPrefix == "" { - c.ClusterPrefix = TkgDefaultClusterPrefix - } - - if c.ManagementClusterName == "" { - c.ManagementClusterName = fmt.Sprintf(c.ClusterPrefix + "mc") - } - - if c.DefaultTimeout == "" { - c.DefaultTimeout = TkgDefaultTimeout - } - - if c.TkgConfigDir == "" { - home, err := os.UserHomeDir() - Expect(err).To(BeNil()) - c.TkgConfigDir = filepath.Join(home, ".config", "tanzu", "tkg") - - err = os.MkdirAll(c.TkgConfigDir, os.ModePerm) - Expect(err).To(BeNil()) - } - - if c.TkgClusterConfigPath == "" { - c.TkgClusterConfigPath = filepath.Join(c.TkgConfigDir, "cluster-config.yaml") - } - - if c.TkgCliPath == "" { - if cliPath, ok := os.LookupEnv("TKG_CLI_PATH"); ok { - c.TkgCliPath = cliPath - } else { - c.TkgCliPath = "../../../../bin/tkg-darwin-amd64" - } - } - - if c.TkgCliLogLevel == 0 { - c.TkgCliLogLevel = TkgDefaultLogLevel - } - - if c.ManagementClusterOptions.Plan == "" { - c.ManagementClusterOptions.Plan = "dev" - } - - if c.WorkloadClusterOptions.ClusterPlan == "" { - c.WorkloadClusterOptions.ClusterPlan = "dev" - } -} - -// Validate validates the configuration in the e2e config file -func (c *E2EConfig) Validate() error { - if c.InfrastructureName == "" || !constants.InfrastructureProviders[c.InfrastructureName] { - return errors.Errorf("config variable '%s' not set", "infrastructure_name") - } - - return nil -} - -// SaveTkgConfigVariables saves the config variables from e2e config to the TKG config file -func (c *E2EConfig) SaveTkgConfigVariables() error { - err := tkgconfigupdater.SetConfig(c.TkgConfigVariables, c.TkgClusterConfigPath) - if err != nil { - return err - } - - fileData, err := os.ReadFile(c.TkgClusterConfigPath) - if err != nil { - return err - } - - tkgConfigMap := make(map[string]interface{}) - err = yaml.Unmarshal(fileData, &tkgConfigMap) - - awsVariables := []string{"AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN"} - for _, v := range awsVariables { - if val, ok := c.TkgConfigVariables[v]; ok { - tkgConfigMap[v] = val - } - } - - outBytes, err := yaml.Marshal(&tkgConfigMap) - if err != nil { - return errors.Wrapf(err, "error marshaling configuration file") - } - err = os.WriteFile(c.TkgClusterConfigPath, outBytes, constants.ConfigFilePermissions) - if err != nil { - return errors.Wrapf(err, "error writing configuration file") - } - - return nil -} - -// SaveWorkloadClusterOptions saves the config variables from E2EConfig.WorkloadClusterOptions config to the given input file path -func (c *E2EConfig) SaveWorkloadClusterOptions(clusterConfigFile string) error { - workloadOptionsStr, err := yaml.Marshal(c.WorkloadClusterOptions) - if err != nil { - return err - } - workloadOptionsMap := make(map[string]interface{}) - err = yaml.Unmarshal(workloadOptionsStr, &workloadOptionsMap) - if err != nil { - return err - } - fileData, err := os.ReadFile(clusterConfigFile) - if err != nil { - return err - } - - tkgConfigMap := make(map[string]interface{}) - err = yaml.Unmarshal(fileData, &tkgConfigMap) - if err != nil { - return err - } - - for key, value := range workloadOptionsMap { - tkgConfigMap[key] = value - } - - outBytes, err := yaml.Marshal(&tkgConfigMap) - if err != nil { - return errors.Wrapf(err, "error marshaling configuration file") - } - err = os.WriteFile(clusterConfigFile, outBytes, constants.ConfigFilePermissions) - if err != nil { - return errors.Wrapf(err, "error writing configuration file") - } - - return nil -} - -// isTKGSCluster validates given kube config is tkgs cluster or not -func (c *E2EConfig) isTKGSCluster() bool { - clusterclient := GetClusterclient(c.TKGSKubeconfigPath, c.TKGSKubeconfigContext) - isTKGS, err := clusterclient.IsPacificRegionalCluster() - Expect(err).To(BeNil(), "error while checking cluster type with give kubeconfig: %s and context: %s", c.TKGSKubeconfigPath, c.TKGSKubeconfigContext) - return isTKGS -} - -// GetClusterclient creates and returns clusterclient for given kube config file -func GetClusterclient(kubeconfigPath, context string) clusterclient.Client { - clusterclientOptions := clusterclient.Options{ - GetClientInterval: 1 * time.Second, - GetClientTimeout: 3 * time.Second, - OperationTimeout: constants.DefaultLongRunningOperationTimeout, - } - clusterClient, err := clusterclient.NewClient(kubeconfigPath, context, clusterclientOptions) - Expect(err).To(BeNil(), "failed to create clusterclient with give kubeconfig: %s and context: %s", kubeconfigPath, context) - return clusterClient -} diff --git a/tkg/test/framework/exec/command.go b/tkg/test/framework/exec/command.go deleted file mode 100644 index f53a932e77..0000000000 --- a/tkg/test/framework/exec/command.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package exec implements command execution functionality. -package exec - -import ( - "context" - "io" - "os" - "os/exec" - - "github.com/pkg/errors" -) - -// Command wraps exec.Command -type Command struct { - Cmd string - Args []string - Stdin io.Reader - Stdout io.Writer - Env []string -} - -// Option is a functional option type that modifies a Command. -type Option func(*Command) - -// NewCommand returns a Command. -func NewCommand(opts ...Option) *Command { - cmd := &Command{ - Stdin: nil, - } - for _, option := range opts { - option(cmd) - } - return cmd -} - -// WithCommand defines the command -func WithCommand(command string) Option { - return func(cmd *Command) { - cmd.Cmd = command - } -} - -// WithArgs sets the arguments for the command -func WithArgs(args ...string) Option { - return func(cmd *Command) { - cmd.Args = args - } -} - -// WithStdin sets up the command to read from this io.Reader. -func WithStdin(stdin io.Reader) Option { - return func(cmd *Command) { - cmd.Stdin = stdin - } -} - -// WithStdout sets up the command to write to io.Writer. -func WithStdout(stdout io.Writer) Option { - return func(cmd *Command) { - cmd.Stdout = stdout - } -} - -// WithEnv sets env variables -func WithEnv(args ...string) Option { - return func(cmd *Command) { - cmd.Args = args - } -} - -// Run executes the command and returns stdout, stderr and the error if there is any. -func (c *Command) Run(ctx context.Context) ([]byte, []byte, error) { - cmd := exec.CommandContext(ctx, c.Cmd, c.Args...) // nolint:gosec - if len(c.Env) != 0 { - cmd.Env = os.Environ() - cmd.Env = append(cmd.Env, c.Env...) - } - - if c.Stdin != nil { - cmd.Stdin = c.Stdin - } - stdout, err := cmd.StdoutPipe() - if err != nil { - return nil, nil, errors.WithStack(err) - } - stderr, err := cmd.StderrPipe() - if err != nil { - return nil, nil, errors.WithStack(err) - } - if err := cmd.Start(); err != nil { - return nil, nil, errors.WithStack(err) - } - output, err := io.ReadAll(stdout) - if err != nil { - return nil, nil, errors.WithStack(err) - } - errout, err := io.ReadAll(stderr) - if err != nil { - return nil, nil, errors.WithStack(err) - } - if err := cmd.Wait(); err != nil { - return output, errout, errors.WithStack(err) - } - return output, errout, nil -} - -// RunAndRedirectOutput executes command and redirects output -func (c *Command) RunAndRedirectOutput(ctx context.Context) error { - cmd := exec.CommandContext(ctx, c.Cmd, c.Args...) // nolint:gosec - - if len(c.Env) != 0 { - cmd.Env = os.Environ() - cmd.Env = append(cmd.Env, c.Env...) - } - - if c.Stdin != nil { - cmd.Stdin = c.Stdin - } - - cmd.Stdout = c.Stdout - cmd.Stderr = c.Stdout - - err := cmd.Run() - if err != nil { - return errors.WithStack(err) - } - - return nil -} diff --git a/tkg/test/framework/exec/kubectl.go b/tkg/test/framework/exec/kubectl.go deleted file mode 100644 index a19d285c00..0000000000 --- a/tkg/test/framework/exec/kubectl.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package exec - -import ( - "bytes" - "context" - - . "github.com/onsi/ginkgo" // nolint:stylecheck -) - -// KubectlApplyWithArgs applies config with args -func KubectlApplyWithArgs(ctx context.Context, kubeconfigPath string, resources []byte, args ...string) error { - aargs := append([]string{"apply", "--kubeconfig", kubeconfigPath, "-f", "-"}, args...) - rbytes := bytes.NewReader(resources) - applyCmd := NewCommand( - WithCommand("kubectl"), - WithArgs(aargs...), - WithStdin(rbytes), - WithStdout(GinkgoWriter), - ) - err := applyCmd.RunAndRedirectOutput(ctx) - return err -} - -// KubectlWithArgs runs kubectl command with args -func KubectlWithArgs(ctx context.Context, kubeconfigPath string, args ...string) error { - aargs := append([]string{"--kubeconfig", kubeconfigPath}, args...) - applyCmd := NewCommand( - WithCommand("kubectl"), - WithArgs(aargs...), - WithStdout(GinkgoWriter), - ) - err := applyCmd.RunAndRedirectOutput(ctx) - return err -} diff --git a/tkg/test/framework/schemes.go b/tkg/test/framework/schemes.go deleted file mode 100644 index 4c81e19d2a..0000000000 --- a/tkg/test/framework/schemes.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package framework - -import ( - appsv1 "k8s.io/api/apps/v1" - batchv1 "k8s.io/api/batch/v1" - corev1 "k8s.io/api/core/v1" - rbacv1 "k8s.io/api/rbac/v1" - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - apiextensionsv1beta "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - "k8s.io/apimachinery/pkg/runtime" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1" - - kappcontrollerv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -// AddDefaultSchemes adds the default schemes -func AddDefaultSchemes(scheme *runtime.Scheme) { - // Add the core schemes. - _ = corev1.AddToScheme(scheme) - - // Add the apps schemes. - _ = appsv1.AddToScheme(scheme) - - // Add the core CAPI scheme. - _ = clusterv1.AddToScheme(scheme) - - // Add the experiments CAPI scheme. - _ = expv1.AddToScheme(scheme) - - // Add the kubeadm bootstrapper scheme. - _ = bootstrapv1.AddToScheme(scheme) - - // Add the kubeadm controlplane scheme. - _ = controlplanev1.AddToScheme(scheme) - - // Add the api extensions (CRD) to the scheme. - _ = apiextensionsv1beta.AddToScheme(scheme) - _ = apiextensionsv1.AddToScheme(scheme) - - // Add rbac to the scheme. - _ = rbacv1.AddToScheme(scheme) - - // Add the clusterctl CAPI scheme - _ = clusterctlv1.AddToScheme(scheme) - - // Add the v1beta1 scheme - _ = batchv1.AddToScheme(scheme) - - // Add the run v1alpha3 scheme - _ = runv1.AddToScheme(scheme) - - // Add the kapp controller v1alpha1 scheme - _ = kappcontrollerv1alpha1.AddToScheme(scheme) -} diff --git a/tkg/test/framework/utils.go b/tkg/test/framework/utils.go deleted file mode 100644 index 677ac1accd..0000000000 --- a/tkg/test/framework/utils.go +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package framework - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strconv" - "strings" - "time" - - "gopkg.in/yaml.v2" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util" - "sigs.k8s.io/controller-runtime/pkg/client" - - . "github.com/onsi/ginkgo" // nolint:stylecheck - "github.com/pkg/errors" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" -) - -// CreateClusterOptions represent options to create a TKG cluster -type CreateClusterOptions struct { - GenerateOnly bool - SkipPrompt bool - ControlPlaneMachineCount int - WorkerMachineCount int - ClusterName string - Plan string - InfrastructureProvider string - Namespace string - KubernetesVersion string - Size string - ControlPlaneSize string - WorkerSize string - CniType string - EnableClusterOptions string - VsphereControlPlaneEndpoint string - Timeout time.Duration - - OtherConfigs map[string]string -} - -// WaitForNodes waits for desiredCount number of nodes to be ready -func WaitForNodes(proxy *ClusterProxy, desiredCount int) { - const timeout = 10 * time.Minute - - start := time.Now() - for time.Since(start) < timeout { - count := len(proxy.GetClusterNodes()) - _, _ = GinkgoWriter.Write([]byte(fmt.Sprintf("Node count for cluster %q: %d\n", proxy.name, count))) - if count == desiredCount { - return - } - - time.Sleep(30 * time.Second) // nolint:gomnd - } - - Fail(fmt.Sprintf("Timed out waiting for nodes count to reach %q", desiredCount)) -} - -// WaitForNodesDuringScaleUp waits for desiredCount number of nodes to be ready -func WaitForNodesDuringScaleUp(proxy *ClusterProxy, desiredCount int) { - const timeout = 10 * time.Minute - - start := time.Now() - for time.Since(start) < timeout { - count := len(proxy.GetClusterNodes()) - _, _ = GinkgoWriter.Write([]byte(fmt.Sprintf("Node count for cluster %q: %d\n", proxy.name, count))) - if count >= desiredCount { - return - } - - time.Sleep(30 * time.Second) // nolint:gomnd - } - - Fail(fmt.Sprintf("Timed out waiting for nodes count to reach %q", desiredCount)) -} - -// GetClusterClass returns ClusterClass used by the Cluster -func GetClusterClass(proxy *ClusterProxy, clusterName string, namespace string) (string, error) { - var err error - c := proxy.GetClient() - cluster := &clusterv1.Cluster{} - - err = c.Get(context.Background(), client.ObjectKey{Namespace: namespace, Name: clusterName}, cluster) - if err != nil { - return "", err - } - - if cluster.Spec.Topology == nil { - return "", nil - } - - return cluster.Spec.Topology.Class, nil -} - -// GetTempClusterConfigFile gets temporary config file -func GetTempClusterConfigFile(clusterConfigFile string, options *CreateClusterOptions) (string, error) { // nolint:gocyclo - clusterOptions := map[string]string{} - - _, err := os.Stat(clusterConfigFile) - if err == nil { - yamlFile, err := os.ReadFile(clusterConfigFile) - if err != nil { - return "", err - } - - err = yaml.Unmarshal(yamlFile, clusterOptions) - if err != nil { - return "", err - } - } - - if options.ClusterName != "" { - clusterOptions["CLUSTER_NAME"] = options.ClusterName - } - - if options.InfrastructureProvider != "" { - clusterOptions["INFRASTRUCTURE_PROVIDER"] = options.InfrastructureProvider - } - - if options.KubernetesVersion != "" { - clusterOptions["KUBERNETES_VERSION"] = options.KubernetesVersion - } - - if options.Size != "" { - clusterOptions["SIZE"] = options.Size - } - - if options.ControlPlaneSize != "" { - clusterOptions["CONTROLPLANE_SIZE"] = options.ControlPlaneSize - } - - if options.WorkerSize != "" { - clusterOptions["WORKER_SIZE"] = options.WorkerSize - } - - if options.CniType != "" { - clusterOptions["CNI"] = options.CniType - } - - if options.Plan != "" { - clusterOptions["CLUSTER_PLAN"] = options.Plan - } - - if options.Namespace != "" { - clusterOptions["NAMESPACE"] = options.Namespace - } - - if options.EnableClusterOptions != "" { - clusterOptions["ENABLE_CLUSTER_OPTIONS"] = options.EnableClusterOptions - } - - if options.ControlPlaneMachineCount != 0 { - clusterOptions["CONTROL_PLANE_MACHINE_COUNT"] = strconv.Itoa(options.ControlPlaneMachineCount) - } - - if options.WorkerMachineCount != 0 { - clusterOptions["WORKER_MACHINE_COUNT"] = strconv.Itoa(options.WorkerMachineCount) - } - - if options.VsphereControlPlaneEndpoint != "" { - clusterOptions["VSPHERE_CONTROL_PLANE_ENDPOINT"] = options.VsphereControlPlaneEndpoint - } - - if options.OtherConfigs != nil { - for k, v := range options.OtherConfigs { - clusterOptions[k] = v - } - } - - out, err := yaml.Marshal(clusterOptions) - if err != nil { - return "", err - } - - f, err := os.CreateTemp("", "temp_cluster_config_"+util.RandomString(4)+".yaml") // nolint:gomnd - if err != nil { - return "", err - } - - if _, err := f.Write(out); err != nil { - return "", err - } - - configFilePath, err := filepath.Abs(f.Name()) - if err != nil { - return "", err - } - - return configFilePath, nil -} - -// SetCliConfigFlag sets cli flag -func SetCliConfigFlag(flagName string, value string) error { - // Acquire tanzu config lock - config.AcquireTanzuConfigLock() - defer config.ReleaseTanzuConfigLock() - - cfg, err := config.GetClientConfigNoLock() - if err != nil { - return err - } - paramArray := strings.Split(flagName, ".") - err = SetFeatures(cfg, paramArray, value) - if err != nil { - return err - } - return config.StoreClientConfig(cfg) -} - -// SetFeatures sets flags in given ClientConfig -func SetFeatures(cfg *configapi.ClientConfig, paramArray []string, value string) error { - if len(paramArray) != 3 { - return errors.New("unable to parse config path parameter into three parts [" + strings.Join(paramArray, ".") + "] (was expecting 'features..'") - } - plugin := paramArray[1] - featureName := paramArray[2] - - if cfg.ClientOptions == nil { - cfg.ClientOptions = &configapi.ClientOptions{} - } - if cfg.ClientOptions.Features == nil { - cfg.ClientOptions.Features = make(map[string]configapi.FeatureMap) - } - if cfg.ClientOptions.Features[plugin] == nil { - cfg.ClientOptions.Features[plugin] = configapi.FeatureMap{} - } - cfg.ClientOptions.Features[plugin][featureName] = value - return nil -} diff --git a/tkg/test/scripts/aws_cleanup.sh b/tkg/test/scripts/aws_cleanup.sh deleted file mode 100755 index 9054fcfe5b..0000000000 --- a/tkg/test/scripts/aws_cleanup.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -x - -AWS_ACCESS_KEY_ID=$1 -AWS_SECRET_ACCESS_KEY=$2 -AWS_SESSION_TOKEN=$3 -AWS_REGION=$4 -FILTER=$5 - -if [ -z "$AWS_ACCESS_KEY_ID" ]; then - exit 0 -fi - -# This step makes sure that the filter applied is never empty -if [ -z "$FILTER" ]; then - echo "filter for leftovers is not set" - exit 1 -fi - -wget -nv https://github.com/genevieve/leftovers/releases/download/v0.62.0/leftovers-v0.62.0-linux-amd64 -mv leftovers-v0.62.0-linux-amd64 /usr/local/bin/leftovers -chmod +x /usr/local/bin/leftovers - -wget -nv https://github.com/kubernetes-sigs/kind/releases/download/v0.11.0/kind-linux-amd64 -mv kind-linux-amd64 /usr/local/bin/kind -chmod +x /usr/local/bin/kind - -# Delete any kind cluster that are left behind -echo "Deleting any kind clusters that are left behind" -kind get clusters | xargs -n 1 kind delete cluster --name - -# Run dry-run to see all resources -leftovers -d -i aws --aws-access-key-id="${AWS_ACCESS_KEY_ID}" --aws-secret-access-key="${AWS_SECRET_ACCESS_KEY}" --aws-session-token="${AWS_SESSION_TOKEN}" --filter="${FILTER}" --aws-region="${AWS_REGION}" -n - -leftovers -i aws --aws-access-key-id="${AWS_ACCESS_KEY_ID}" --aws-secret-access-key="${AWS_SECRET_ACCESS_KEY}" --aws-session-token="${AWS_SESSION_TOKEN}" --filter="${FILTER}" --aws-region="${AWS_REGION}" -n || true - -# Run dry-run to see any leftover resources -leftovers -d -i aws --aws-access-key-id="${AWS_ACCESS_KEY_ID}" --aws-secret-access-key="${AWS_SECRET_ACCESS_KEY}" --aws-session-token="${AWS_SESSION_TOKEN}" --filter="${FILTER}" --aws-region="${AWS_REGION}" -n - -# Retry the deletion incase the previous attempt failed -leftovers -i aws --aws-access-key-id="${AWS_ACCESS_KEY_ID}" --aws-secret-access-key="${AWS_SECRET_ACCESS_KEY}" --aws-session-token="${AWS_SESSION_TOKEN}" --filter="${FILTER}" --aws-region="${AWS_REGION}" -n diff --git a/tkg/test/scripts/aws_setup.sh b/tkg/test/scripts/aws_setup.sh deleted file mode 100755 index 976d9db619..0000000000 --- a/tkg/test/scripts/aws_setup.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Turn off debugging (to prevent printing out AWS credentials) -set +x - -CG_TOKEN=$(curl -s --location --request POST 'https://api.console.cloudgate.vmware.com/authn/token' \ - --user "$USER_PASS" \ - --header 'Content-Type: application/json' \ - --data-raw '{"grant_type": "client_credentials"}' | jq -r '.access_token') - -aws_creds=$(curl -s --location --request POST 'https://api.console.cloudgate.vmware.com/access/access' \ - --header "Authorization: Bearer ${CG_TOKEN}" \ - --header 'Content-Type: application/json' \ - --data-raw '{"ouId":"ou-kw69-lqh1erao","orgAccountId":"942999320260","masterAccountId":"116462199383","role":"PowerUser"}') - -echo "AWS_ACCESS_KEY_ID="$(echo $aws_creds | jq -r '.credentials.accessKeyId') >> $GITHUB_ENV -echo "AWS_SECRET_ACCESS_KEY="$(echo $aws_creds | jq -r '.credentials.secretAccessKey') >> $GITHUB_ENV -echo "AWS_SESSION_TOKEN="$(echo $aws_creds | jq -r '.credentials.sessionToken') >> $GITHUB_ENV -echo "AWS_REGION=us-west-2" >> $GITHUB_ENV diff --git a/tkg/test/scripts/cc_hack.sh b/tkg/test/scripts/cc_hack.sh deleted file mode 100755 index 63905e4531..0000000000 --- a/tkg/test/scripts/cc_hack.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -tanzu config set features.cluster.auto-apply-generated-clusterclass-based-configuration true -tanzu config get diff --git a/tkg/test/scripts/hack_bom.sh b/tkg/test/scripts/hack_bom.sh deleted file mode 100755 index 8e1b4834cc..0000000000 --- a/tkg/test/scripts/hack_bom.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -set -x - -wget https://github.com/mikefarah/yq/releases/download/v4.24.5/yq_linux_amd64 -mv yq_linux_amd64 /usr/local/bin/yq -chmod +x /usr/local/bin/yq - -yq -i e '.components.tanzu-framework-management-packages[0].version |= "v0.18.0-dev-13-g233a6405"' $HOME/.config/tanzu/tkg/bom/tkg-bom-v1.6.0-zshippable.yaml -yq -i e '.components.tanzu-framework-management-packages[0].images.tanzuFrameworkManagementPackageRepositoryImage.imagePath |= "management"' $HOME/.config/tanzu/tkg/bom/tkg-bom-v1.6.0-zshippable.yaml -yq -i e '.components.tanzu-framework-management-packages[0].images.tanzuFrameworkManagementPackageRepositoryImage.imageRepository |= "gcr.io/eminent-nation-87317/tkg/test16"' $HOME/.config/tanzu/tkg/bom/tkg-bom-v1.6.0-zshippable.yaml -yq -i e '.components.tanzu-framework-management-packages[0].images.tanzuFrameworkManagementPackageRepositoryImage.tag |= "v0.21.0"' $HOME/.config/tanzu/tkg/bom/tkg-bom-v1.6.0-zshippable.yaml diff --git a/tkg/test/scripts/legacy_hack.sh b/tkg/test/scripts/legacy_hack.sh deleted file mode 100755 index c680817cf4..0000000000 --- a/tkg/test/scripts/legacy_hack.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# Copyright 2023 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Use clusterclass based management cluster until we need legacy mc again -#tanzu config set features.management-cluster.package-based-cc false -tanzu config set features.cluster.allow-legacy-cluster true -tanzu config get diff --git a/tkg/test/tkgctl/aws/aws_addons_test.go b/tkg/test/tkgctl/aws/aws_addons_test.go deleted file mode 100644 index 59609d2de9..0000000000 --- a/tkg/test/tkgctl/aws/aws_addons_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Addon tests for aws clusters", func() { - E2EAddonSpec(context.TODO(), func() E2EAddonSpecInput { - return E2EAddonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/aws/aws_antrea_test.go b/tkg/test/tkgctl/aws/aws_antrea_test.go deleted file mode 100644 index 6103324ad1..0000000000 --- a/tkg/test/tkgctl/aws/aws_antrea_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for aws - Antrea", func() { - E2ECommonSpec(context.TODO(), func() E2ECommonSpecInput { - return E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/aws/aws_autoscaler_test.go b/tkg/test/tkgctl/aws/aws_autoscaler_test.go deleted file mode 100644 index d8e9f768c1..0000000000 --- a/tkg/test/tkgctl/aws/aws_autoscaler_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Autoscaler tests for aws clusters", func() { - E2EAutoscalerSpec(context.TODO(), func() E2EAutoscalerSpecInput { - return E2EAutoscalerSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/aws/aws_calico_test.go b/tkg/test/tkgctl/aws/aws_calico_test.go deleted file mode 100644 index f89ad362dd..0000000000 --- a/tkg/test/tkgctl/aws/aws_calico_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for aws - Calico", func() { - E2ECommonSpec(context.TODO(), func() E2ECommonSpecInput { - return E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - } - }) -}) diff --git a/tkg/test/tkgctl/aws/aws_ceip_test.go b/tkg/test/tkgctl/aws/aws_ceip_test.go deleted file mode 100644 index 075b527157..0000000000 --- a/tkg/test/tkgctl/aws/aws_ceip_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Tests for aws - telemetry", func() { - E2ECEIPSpec(context.TODO(), func() E2ECEIPSpecInput { - return E2ECEIPSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - } - }) -}) diff --git a/tkg/test/tkgctl/aws/aws_mhc_test.go b/tkg/test/tkgctl/aws/aws_mhc_test.go deleted file mode 100644 index b4388f7d6d..0000000000 --- a/tkg/test/tkgctl/aws/aws_mhc_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("MHC tests for aws clusters", func() { - E2EMhcSpec(context.TODO(), func() E2EMhcSpecInput { - return E2EMhcSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - } - }) -}) diff --git a/tkg/test/tkgctl/aws/aws_scale_test.go b/tkg/test/tkgctl/aws/aws_scale_test.go deleted file mode 100644 index bfdd244487..0000000000 --- a/tkg/test/tkgctl/aws/aws_scale_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Scale tests for aws clusters", func() { - E2EScaleSpec(context.TODO(), func() E2EScaleSpecInput { - return E2EScaleSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - } - }) -}) diff --git a/tkg/test/tkgctl/aws/aws_suite_test.go b/tkg/test/tkgctl/aws/aws_suite_test.go deleted file mode 100644 index f1688d4f7a..0000000000 --- a/tkg/test/tkgctl/aws/aws_suite_test.go +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" -) - -const clusterName = "tkg-cli-wc" - -var ( - // path to the e2e config file - e2eConfigPath string - - // path to store test artifacts - artifactsFolder string - - // config read from e2eConfigPath to be used in the tests - e2eConfig *framework.E2EConfig -) - -func TestE2E(t *testing.T) { - if folder, ok := os.LookupEnv("E2E_ARTIFACTS"); ok { - artifactsFolder = folder - } - - if artifactsFolder == "" { - artifactsFolder = filepath.Join(os.TempDir(), "artifacts") - } - - if configPath, ok := os.LookupEnv("E2E_CONFIG"); ok { - e2eConfigPath = configPath - } - - RegisterFailHandler(Fail) - junitPath := filepath.Join(artifactsFolder, "junit", fmt.Sprintf("junit.e2e_suite.%d.xml", config.GinkgoConfig.ParallelNode)) - junitReporter := reporters.NewJUnitReporter(junitPath) - RunSpecsWithDefaultAndCustomReporters(t, "tkgctl-aws-e2e", []Reporter{junitReporter}) -} - -var _ = SynchronizedBeforeSuite(func() []byte { - // Before all parallel nodes - - Expect(e2eConfigPath).To(BeAnExistingFile(), "e2e config file is either not set or invalid") - Expect(os.MkdirAll(artifactsFolder, 0o700)).To(Succeed(), "Can't create artifacts directory %q", artifactsFolder) - - logsDir := filepath.Join(artifactsFolder, "logs") - Expect(os.MkdirAll(logsDir, 0o700)).To(Succeed(), "Can't create logs directory %q", logsDir) - - By(fmt.Sprintf("Loading the e2e test configuration from %q", e2eConfigPath)) - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) - - logLocation := filepath.Join(artifactsFolder, "logs") - - // save config variables from e2e config to the tkg config file - err := e2eConfig.SaveTkgConfigVariables() - Expect(err).To(BeNil()) - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - if e2eConfig.InfrastructureName == "vsphere" { - if mcEndPointIP, ok := os.LookupEnv("MANAGEMENT_CLUSTER_ENDPOINT_1"); ok { - e2eConfig.ManagementClusterOptions.Endpoint = mcEndPointIP - } - } - - hackCmd := exec.NewCommand( - exec.WithCommand("../../scripts/legacy_hack.sh"), - exec.WithStdout(GinkgoWriter), - ) - - fmt.Println("Executing the legacy hack script") - out, cmdErr, err := hackCmd.Run(context.Background()) - fmt.Println(string(out)) - fmt.Println(string(cmdErr)) - Expect(err).To(BeNil()) - - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "before_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - // create management cluster - if !e2eConfig.UseExistingCluster { - err := cli.Init(tkgctl.InitRegionOptions{ - ClusterConfigFile: e2eConfig.TkgClusterConfigPath, - - Plan: e2eConfig.ManagementClusterOptions.Plan, - ClusterName: e2eConfig.ManagementClusterName, - InfrastructureProvider: e2eConfig.InfrastructureName, - Timeout: timeout, - Size: e2eConfig.ManagementClusterOptions.Size, - DeployTKGonVsphere7: e2eConfig.ManagementClusterOptions.DeployTKGonVsphere7, - EnableTKGSOnVsphere7: e2eConfig.ManagementClusterOptions.EnableTKGSOnVsphere7, - VsphereControlPlaneEndpoint: e2eConfig.ManagementClusterOptions.Endpoint, - Edition: "tkg", - }) - - Expect(err).To(BeNil()) - } - - // Create initial workload cluster - clusterEndPointIP, _ := os.LookupEnv("CLUSTER_ENDPOINT_1") - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: "default", - Plan: "dev", - VsphereControlPlaneEndpoint: clusterEndPointIP, - } - clusterConfigFile, err := framework.GetTempClusterConfigFile(e2eConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - - defer os.Remove(clusterConfigFile) - - tkgCtlClient, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - err = tkgCtlClient.ConfigCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Creating initial workload cluster %q", clusterName)) - - defer os.Remove(clusterConfigFile) - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - Expect(err).To(BeNil()) - - return []byte( - strings.Join([]string{ - artifactsFolder, - e2eConfigPath, - }, ","), - ) -}, func(data []byte) { - // Before each parallel node - - parts := strings.Split(string(data), ",") - Expect(parts).To(HaveLen(2)) - - artifactsFolder = parts[0] - e2eConfigPath = parts[1] - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) -}) - -var _ = SynchronizedAfterSuite(func() { -}, func() { - // After all parallel nodes - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - logsDir := filepath.Join(artifactsFolder, "logs") - clusterName := "tkg-cli-wc" - logLocation := filepath.Join(artifactsFolder, "logs") - tkgCtlClient, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: "default", - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "after_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - err = cli.DeleteRegion(tkgctl.DeleteRegionOptions{ - ClusterName: e2eConfig.ManagementClusterName, - Force: true, - SkipPrompt: true, - Timeout: timeout, - }) - - Expect(err).To(BeNil()) -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_antrea_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_antrea_test.go deleted file mode 100644 index b1bb5046cd..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_antrea_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for aws (clusterclass) - Antrea", func() { - E2ECommonCCSpec(context.TODO(), func() E2ECommonCCSpecInput { - return E2ECommonCCSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - Plan: "dev", - Namespace: "tkg-system", - CheckAdmissionWebhook: true, - } - }) -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_calico_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_calico_test.go deleted file mode 100644 index 0a018c7cb4..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_calico_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for aws (clusterclass) - Calico", func() { - E2ECommonCCSpec(context.TODO(), func() E2ECommonCCSpecInput { - return E2ECommonCCSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - Plan: "dev", - Namespace: "tkg-system", - } - }) -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_custom_cb_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_custom_cb_test.go deleted file mode 100644 index 9445dd66e0..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_custom_cb_test.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests to create & upgrade AWS cluster with custom ClusterBootstrap", func() { - E2ECommonCCSpec(context.TODO(), func() E2ECommonCCSpecInput { - return E2ECommonCCSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - Plan: "dev", - Namespace: "tkg-system", - IsCustomCB: true, - DoUpgrade: true, - } - }) -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_legacy_fallback_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_legacy_fallback_test.go deleted file mode 100644 index d9ff9d2441..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_legacy_fallback_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for fallback legacy creation handling", func() { - E2ELegacyFallbackSpec(context.TODO(), func() E2ELegacyFallbackSpecInput { - return E2ELegacyFallbackSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - Plan: "dev", - Namespace: "tkg-system", - } - }) -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_mhc_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_mhc_test.go deleted file mode 100644 index 4fdd7c3390..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_mhc_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("MHC tests for capa classy clusters", func() { - E2EMhcCCSpec(context.TODO(), func() E2ECommonSpecInput { - return E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - Plan: "devcc", - Namespace: "tkg-system", - } - }) -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_misc_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_misc_test.go deleted file mode 100644 index 5613d8a168..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_misc_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Miscellaneous tests for aws clusterclass", func() { - E2ECCMiscSpec(context.TODO(), func() E2ECommonSpecInput { - return E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - Plan: "devcc", - Namespace: "default", - } - }) -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_node_pool_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_node_pool_test.go deleted file mode 100644 index cd4efe7f7d..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_node_pool_test.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package aws_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for node pools on AWS", func() { - E2ENodePoolSpec(context.TODO(), func() E2ENodePoolSpecInput { - return E2ENodePoolSpecInput{ - E2ECommonSpecInput: E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - Plan: "prodcc", - Namespace: "default", - }, - NodePool: client.NodePool{ - Name: "np-1", - WorkerClass: "tkg-worker", - TKRResolver: "ami-region=us-west-2,os-name=ubuntu", - AZ: "us-west-2b", - Replicas: func(i int32) *int32 { return &i }(1), - Labels: &map[string]string{ - "provider": "aws", - }, - }, - } - }) -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_scale_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_scale_test.go deleted file mode 100644 index 8f4b2ede0f..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_scale_test.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package aws_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Scale tests for aws clusters", func() { - E2EScaleSpec(context.TODO(), func() E2EScaleSpecInput { - return E2EScaleSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_suite_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_suite_test.go deleted file mode 100644 index c5988f6614..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_suite_test.go +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws_cc - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/managementcomponents" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" -) - -const clusterName = "tkg-cli-wc" - -var ( - // path to the e2e config file - e2eConfigPath string - - // path to store test artifacts - artifactsFolder string - - // config read from e2eConfigPath to be used in the tests - e2eConfig *framework.E2EConfig -) - -func TestE2E(t *testing.T) { - if folder, ok := os.LookupEnv("E2E_ARTIFACTS"); ok { - artifactsFolder = folder - } - - if artifactsFolder == "" { - artifactsFolder = filepath.Join(os.TempDir(), "artifacts") - } - - if configPath, ok := os.LookupEnv("E2E_CONFIG"); ok { - e2eConfigPath = configPath - } - - RegisterFailHandler(Fail) - junitPath := filepath.Join(artifactsFolder, "junit", fmt.Sprintf("junit.e2e_suite.%d.xml", config.GinkgoConfig.ParallelNode)) - junitReporter := reporters.NewJUnitReporter(junitPath) - RunSpecsWithDefaultAndCustomReporters(t, "tkgctl-aws-cc-e2e", []Reporter{junitReporter}) -} - -var _ = SynchronizedBeforeSuite(func() []byte { - // Before all parallel nodes - - var mcClusterClient clusterclient.Client - - Expect(e2eConfigPath).To(BeAnExistingFile(), "e2e config file is either not set or invalid") - Expect(os.MkdirAll(artifactsFolder, 0o700)).To(Succeed(), "Can't create artifacts directory %q", artifactsFolder) - - logsDir := filepath.Join(artifactsFolder, "logs") - Expect(os.MkdirAll(logsDir, 0o700)).To(Succeed(), "Can't create logs directory %q", logsDir) - - By(fmt.Sprintf("Loading the e2e test configuration from %q", e2eConfigPath)) - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfig).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) - - logLocation := filepath.Join(artifactsFolder, "logs") - - // save config variables from e2e config to the tkg config file - err := e2eConfig.SaveTkgConfigVariables() - Expect(err).To(BeNil()) - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - if e2eConfig.InfrastructureName == "vsphere" { - if mcEndPointIP, ok := os.LookupEnv("MANAGEMENT_CLUSTER_ENDPOINT_1"); ok { - e2eConfig.ManagementClusterOptions.Endpoint = mcEndPointIP - } - } - - hackCmd := exec.NewCommand( - exec.WithCommand("../../scripts/cc_hack.sh"), - exec.WithStdout(GinkgoWriter), - ) - - fmt.Println("Executing the hack script") - out, cmdErr, err := hackCmd.Run(context.Background()) - fmt.Println(string(out)) - fmt.Println(string(cmdErr)) - Expect(err).To(BeNil()) - - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "before_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - // create management cluster - if !e2eConfig.UseExistingCluster { - err := cli.Init(tkgctl.InitRegionOptions{ - ClusterConfigFile: e2eConfig.TkgClusterConfigPath, - - Plan: e2eConfig.ManagementClusterOptions.Plan, - ClusterName: e2eConfig.ManagementClusterName, - InfrastructureProvider: e2eConfig.InfrastructureName, - Timeout: timeout, - Size: e2eConfig.ManagementClusterOptions.Size, - DeployTKGonVsphere7: e2eConfig.ManagementClusterOptions.DeployTKGonVsphere7, - EnableTKGSOnVsphere7: e2eConfig.ManagementClusterOptions.EnableTKGSOnVsphere7, - VsphereControlPlaneEndpoint: e2eConfig.ManagementClusterOptions.Endpoint, - Edition: "tkg", - }) - - Expect(err).To(BeNil()) - - kubeConfigFileName := e2eConfig.ManagementClusterName + ".kubeconfig" - mcKubeconfigFile := filepath.Join(os.TempDir(), kubeConfigFileName) - mcKubecontext := e2eConfig.ManagementClusterName + "-admin@" + e2eConfig.ManagementClusterName - defer os.Remove(mcKubeconfigFile) - err = cli.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: e2eConfig.ManagementClusterName, - Namespace: "tkg-system", - ExportFile: mcKubeconfigFile, - }) - Expect(err).To(BeNil()) - - // Create management-cluster client - mcClusterClient, err = clusterclient.NewClient(mcKubeconfigFile, mcKubecontext, clusterclient.Options{}) - Expect(err).To(BeNil()) - - // Should verify management cluster is created using default ClusterClass - clusterInfo := mcClusterClient.GetClusterStatusInfo(e2eConfig.ManagementClusterName, "tkg-system", nil) - Expect(clusterInfo.ClusterObject).NotTo(BeNil()) - Expect(clusterInfo.ClusterObject.Spec.Topology).NotTo(BeNil()) - Expect(clusterInfo.ClusterObject.Spec.Topology.Class).To(Equal("tkg-" + e2eConfig.InfrastructureName + "-default-" + constants.DefaultClusterClassVersion)) - - // Should verify all management packages are deployed and reconciled successfully - err = managementcomponents.WaitForManagementPackages(mcClusterClient, 2*time.Minute) - Expect(err).To(BeNil()) - } - - return []byte( - strings.Join([]string{ - artifactsFolder, - e2eConfigPath, - }, ","), - ) -}, func(data []byte) { - // Before each parallel node - - parts := strings.Split(string(data), ",") - Expect(parts).To(HaveLen(2)) - - artifactsFolder = parts[0] - e2eConfigPath = parts[1] - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) -}) - -var _ = SynchronizedAfterSuite(func() { -}, func() { - // After all parallel nodes - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - logLocation := filepath.Join(artifactsFolder, "logs") - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "after_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - if !e2eConfig.UseExistingCluster { - err = cli.DeleteRegion(tkgctl.DeleteRegionOptions{ - ClusterName: e2eConfig.ManagementClusterName, - Force: true, - SkipPrompt: true, - Timeout: timeout, - }) - - Expect(err).To(BeNil()) - } -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_tkr_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_tkr_test.go deleted file mode 100644 index 9427290819..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_tkr_test.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package aws_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for aws - TKR Compatibility tests", func() { - TKRCompatibilityValidationSpec(context.TODO(), func() TKRCompatibilityValidationSpecInput { - return TKRCompatibilityValidationSpecInput{ - E2EConfig: e2eConfig, - } - }) -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_tkrresolver_and_upgrade_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_tkrresolver_and_upgrade_test.go deleted file mode 100644 index 734cc4f887..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_tkrresolver_and_upgrade_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for aws - TKRResolver and cluster upgrade with CNI Antrea", func() { - E2ETKRResolverValidationForClusterCRUDSpec(context.TODO(), func() E2ETKRResolverValidationForClusterCRUDSpecInput { - return E2ETKRResolverValidationForClusterCRUDSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - Plan: "devcc", - Namespace: "tkg-system", - } - }) -}) diff --git a/tkg/test/tkgctl/aws_cc/aws_cc_upgrade_calico_test.go b/tkg/test/tkgctl/aws_cc/aws_cc_upgrade_calico_test.go deleted file mode 100644 index 85146a8785..0000000000 --- a/tkg/test/tkgctl/aws_cc/aws_cc_upgrade_calico_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package aws_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for aws - cluster upgrade with CNI Calico", func() { - E2ECommonCCSpec(context.TODO(), func() E2ECommonCCSpecInput { - return E2ECommonCCSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - Plan: "devcc", - Namespace: "tkg-system", - DoUpgrade: true, - } - }) -}) diff --git a/tkg/test/tkgctl/azure/azure_addons_test.go b/tkg/test/tkgctl/azure/azure_addons_test.go deleted file mode 100644 index 838e508418..0000000000 --- a/tkg/test/tkgctl/azure/azure_addons_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package azure - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Addon tests for Azure clusters", func() { - E2EAddonSpec(context.TODO(), func() E2EAddonSpecInput { - return E2EAddonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/azure/azure_antrea_test.go b/tkg/test/tkgctl/azure/azure_antrea_test.go deleted file mode 100644 index e2a7625805..0000000000 --- a/tkg/test/tkgctl/azure/azure_antrea_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package azure - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for Azure - Antrea", func() { - E2ECommonSpec(context.TODO(), func() E2ECommonSpecInput { - return E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/azure/azure_autoscaler_test.go b/tkg/test/tkgctl/azure/azure_autoscaler_test.go deleted file mode 100644 index f396467fad..0000000000 --- a/tkg/test/tkgctl/azure/azure_autoscaler_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package azure - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Autoscaler tests for Azure clusters", func() { - E2EAutoscalerSpec(context.TODO(), func() E2EAutoscalerSpecInput { - return E2EAutoscalerSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/azure/azure_calico_test.go b/tkg/test/tkgctl/azure/azure_calico_test.go deleted file mode 100644 index 2c333e107c..0000000000 --- a/tkg/test/tkgctl/azure/azure_calico_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package azure - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for Azure - Calico", func() { - E2ECommonSpec(context.TODO(), func() E2ECommonSpecInput { - return E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - } - }) -}) diff --git a/tkg/test/tkgctl/azure/azure_ceip_test.go b/tkg/test/tkgctl/azure/azure_ceip_test.go deleted file mode 100644 index 66c6b2f146..0000000000 --- a/tkg/test/tkgctl/azure/azure_ceip_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package azure - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for Azure - Calico", func() { - E2ECEIPSpec(context.TODO(), func() E2ECEIPSpecInput { - return E2ECEIPSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - } - }) -}) diff --git a/tkg/test/tkgctl/azure/azure_mhc_test.go b/tkg/test/tkgctl/azure/azure_mhc_test.go deleted file mode 100644 index 9680c42858..0000000000 --- a/tkg/test/tkgctl/azure/azure_mhc_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package azure - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("MHC tests for Azure clusters", func() { - E2EMhcSpec(context.TODO(), func() E2EMhcSpecInput { - return E2EMhcSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/azure/azure_scale_test.go b/tkg/test/tkgctl/azure/azure_scale_test.go deleted file mode 100644 index d687a59bd4..0000000000 --- a/tkg/test/tkgctl/azure/azure_scale_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package azure - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Scale tests for Azure clusters", func() { - E2EScaleSpec(context.TODO(), func() E2EScaleSpecInput { - return E2EScaleSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/azure/azure_suite_test.go b/tkg/test/tkgctl/azure/azure_suite_test.go deleted file mode 100644 index e6bfb0027f..0000000000 --- a/tkg/test/tkgctl/azure/azure_suite_test.go +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package azure - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -var ( - // path to the e2e config file - e2eConfigPath string - - // path to store test artifacts - artifactsFolder string - - // config read from e2eConfigPath to be used in the tests - e2eConfig *framework.E2EConfig - - clusterName string -) - -func TestE2E(t *testing.T) { - if folder, ok := os.LookupEnv("E2E_ARTIFACTS"); ok { - artifactsFolder = folder - } - - if artifactsFolder == "" { - artifactsFolder = filepath.Join(os.TempDir(), "artifacts") - } - - if configPath, ok := os.LookupEnv("E2E_CONFIG"); ok { - e2eConfigPath = configPath - } - - RegisterFailHandler(Fail) - junitPath := filepath.Join(artifactsFolder, "junit", fmt.Sprintf("junit.e2e_suite.%d.xml", config.GinkgoConfig.ParallelNode)) - junitReporter := reporters.NewJUnitReporter(junitPath) - RunSpecsWithDefaultAndCustomReporters(t, "tkgctl-azure-e2e", []Reporter{junitReporter}) -} - -var _ = SynchronizedBeforeSuite(func() []byte { - // Before all parallel nodes - - Expect(e2eConfigPath).To(BeAnExistingFile(), "e2e config file is either not set or invalid") - Expect(os.MkdirAll(artifactsFolder, 0o700)).To(Succeed(), "Can't create artifacts directory %q", artifactsFolder) - - logsDir := filepath.Join(artifactsFolder, "logs") - Expect(os.MkdirAll(logsDir, 0o700)).To(Succeed(), "Can't create logs directory %q", logsDir) - - By(fmt.Sprintf("Loading the e2e test configuration from %q", e2eConfigPath)) - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) - - logLocation := filepath.Join(artifactsFolder, "logs") - - // save config variables from e2e config to the tkg config file - err := e2eConfig.SaveTkgConfigVariables() - Expect(err).To(BeNil()) - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - hackCmd := exec.NewCommand( - exec.WithCommand("../../scripts/legacy_hack.sh"), - exec.WithStdout(GinkgoWriter), - ) - - fmt.Println("Executing the legacy hack script") - out, cmdErr, err := hackCmd.Run(context.Background()) - fmt.Println(string(out)) - fmt.Println(string(cmdErr)) - Expect(err).To(BeNil()) - - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "before_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - // create management cluster - if !e2eConfig.UseExistingCluster { - err := cli.Init(tkgctl.InitRegionOptions{ - ClusterConfigFile: e2eConfig.TkgClusterConfigPath, - - Plan: e2eConfig.ManagementClusterOptions.Plan, - ClusterName: e2eConfig.ManagementClusterName, - InfrastructureProvider: e2eConfig.InfrastructureName, - Timeout: timeout, - Size: e2eConfig.ManagementClusterOptions.Size, - DeployTKGonVsphere7: e2eConfig.ManagementClusterOptions.DeployTKGonVsphere7, - EnableTKGSOnVsphere7: e2eConfig.ManagementClusterOptions.EnableTKGSOnVsphere7, - VsphereControlPlaneEndpoint: e2eConfig.ManagementClusterOptions.Endpoint, - Edition: "tkg", - }) - - Expect(err).To(BeNil()) - } - - // Create initial workload cluster - clusterName = e2eConfig.ClusterPrefix + "wc" - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: constants.DefaultNamespace, - Plan: "dev", - } - clusterConfigFile, err := framework.GetTempClusterConfigFile(e2eConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - - defer os.Remove(clusterConfigFile) - - tkgCtlClient, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).ToNot(HaveOccurred()) - - optOutStatus, err := tkgCtlClient.GetCEIP() - Expect(err).ToNot(HaveOccurred()) - Expect(optOutStatus.CeipStatus).To(Equal("Opt-out")) - - err = tkgCtlClient.ConfigCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Creating initial workload cluster %q", clusterName)) - - defer os.Remove(clusterConfigFile) - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - return []byte( - strings.Join([]string{ - artifactsFolder, - e2eConfigPath, - }, ","), - ) -}, func(data []byte) { - // Before each parallel node - - parts := strings.Split(string(data), ",") - Expect(parts).To(HaveLen(2)) - - artifactsFolder = parts[0] - e2eConfigPath = parts[1] - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) -}) - -var _ = SynchronizedAfterSuite(func() { -}, func() { - // After all parallel nodes - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Deleting workload cluster %q", clusterName)) - - logsDir := filepath.Join(artifactsFolder, "logs") - tkgCtlClient, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).ToNot(HaveOccurred()) - - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: constants.DefaultNamespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - logLocation := filepath.Join(artifactsFolder, "logs") - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "after_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - err = cli.DeleteRegion(tkgctl.DeleteRegionOptions{ - ClusterName: e2eConfig.ManagementClusterName, - Force: true, - SkipPrompt: true, - Timeout: timeout, - }) - - Expect(err).To(BeNil()) -}) diff --git a/tkg/test/tkgctl/azure/azure_upgrade_test.go b/tkg/test/tkgctl/azure/azure_upgrade_test.go deleted file mode 100644 index 1f03193438..0000000000 --- a/tkg/test/tkgctl/azure/azure_upgrade_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package azure - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Upgrade tests for Azure clusters - Antrea", func() { - E2EUpgradeSpec(context.TODO(), func() E2EUpgradeSpecInput { - return E2EUpgradeSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/azure_cc/azure_cc_antrea_test.go b/tkg/test/tkgctl/azure_cc/azure_cc_antrea_test.go deleted file mode 100644 index 5e6c283598..0000000000 --- a/tkg/test/tkgctl/azure_cc/azure_cc_antrea_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package azure_cc - -import ( - "context" - "time" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for azure (clusterclass) - Antrea", func() { - E2ECommonCCSpec(context.TODO(), func() E2ECommonCCSpecInput { - return E2ECommonCCSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - Plan: "dev", - Namespace: "tkg-system", - CheckAdmissionWebhook: true, - Timeout: time.Minute * 120, - OtherConfig: map[string]string{ - "ENABLE_MHC": "true", - "MHC_UNKNOWN_STATUS_TIMEOUT": "30m", - "MHC_FALSE_STATUS_TIMEOUT": "60m", - "NODE_STARTUP_TIMEOUT": "120m", - }, - } - }) -}) diff --git a/tkg/test/tkgctl/azure_cc/azure_cc_suite_test.go b/tkg/test/tkgctl/azure_cc/azure_cc_suite_test.go deleted file mode 100644 index 55601963de..0000000000 --- a/tkg/test/tkgctl/azure_cc/azure_cc_suite_test.go +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package azure_cc - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/managementcomponents" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" -) - -const clusterName = "tkg-cli-wc" - -var ( - // path to the e2e config file - e2eConfigPath string - - // path to store test artifacts - artifactsFolder string - - // config read from e2eConfigPath to be used in the tests - e2eConfig *framework.E2EConfig -) - -func TestE2E(t *testing.T) { - if folder, ok := os.LookupEnv("E2E_ARTIFACTS"); ok { - artifactsFolder = folder - } - - if artifactsFolder == "" { - artifactsFolder = filepath.Join(os.TempDir(), "artifacts") - } - - if configPath, ok := os.LookupEnv("E2E_CONFIG"); ok { - e2eConfigPath = configPath - } - - RegisterFailHandler(Fail) - junitPath := filepath.Join(artifactsFolder, "junit", fmt.Sprintf("junit.e2e_suite.%d.xml", config.GinkgoConfig.ParallelNode)) - junitReporter := reporters.NewJUnitReporter(junitPath) - RunSpecsWithDefaultAndCustomReporters(t, "tkgctl-azure-cc-e2e", []Reporter{junitReporter}) -} - -var _ = SynchronizedBeforeSuite(func() []byte { - // Before all parallel nodes - - var mcClusterClient clusterclient.Client - - Expect(e2eConfigPath).To(BeAnExistingFile(), "e2e config file is either not set or invalid") - Expect(os.MkdirAll(artifactsFolder, 0o700)).To(Succeed(), "Can't create artifacts directory %q", artifactsFolder) - - logsDir := filepath.Join(artifactsFolder, "logs") - Expect(os.MkdirAll(logsDir, 0o700)).To(Succeed(), "Can't create logs directory %q", logsDir) - - By(fmt.Sprintf("Loading the e2e test configuration from %q", e2eConfigPath)) - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfig).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) - - logLocation := filepath.Join(artifactsFolder, "logs") - - // save config variables from e2e config to the tkg config file - err := e2eConfig.SaveTkgConfigVariables() - Expect(err).To(BeNil()) - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - if e2eConfig.InfrastructureName == "vsphere" { - if mcEndPointIP, ok := os.LookupEnv("MANAGEMENT_CLUSTER_ENDPOINT_1"); ok { - e2eConfig.ManagementClusterOptions.Endpoint = mcEndPointIP - } - } - - hackCmd := exec.NewCommand( - exec.WithCommand("../../scripts/cc_hack.sh"), - exec.WithStdout(GinkgoWriter), - ) - - fmt.Println("Executing the hack script") - out, cmdErr, err := hackCmd.Run(context.Background()) - fmt.Println(string(out)) - fmt.Println(string(cmdErr)) - Expect(err).To(BeNil()) - - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "before_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - // create management cluster - if !e2eConfig.UseExistingCluster { - err := cli.Init(tkgctl.InitRegionOptions{ - ClusterConfigFile: e2eConfig.TkgClusterConfigPath, - - Plan: e2eConfig.ManagementClusterOptions.Plan, - ClusterName: e2eConfig.ManagementClusterName, - InfrastructureProvider: e2eConfig.InfrastructureName, - Timeout: timeout, - Size: e2eConfig.ManagementClusterOptions.Size, - DeployTKGonVsphere7: e2eConfig.ManagementClusterOptions.DeployTKGonVsphere7, - EnableTKGSOnVsphere7: e2eConfig.ManagementClusterOptions.EnableTKGSOnVsphere7, - VsphereControlPlaneEndpoint: e2eConfig.ManagementClusterOptions.Endpoint, - Edition: "tkg", - }) - - Expect(err).To(BeNil()) - - kubeConfigFileName := e2eConfig.ManagementClusterName + ".kubeconfig" - mcKubeconfigFile := filepath.Join(os.TempDir(), kubeConfigFileName) - mcKubecontext := e2eConfig.ManagementClusterName + "-admin@" + e2eConfig.ManagementClusterName - defer os.Remove(mcKubeconfigFile) - err = cli.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: e2eConfig.ManagementClusterName, - Namespace: "tkg-system", - ExportFile: mcKubeconfigFile, - }) - Expect(err).To(BeNil()) - - // Create management-cluster client - mcClusterClient, err = clusterclient.NewClient(mcKubeconfigFile, mcKubecontext, clusterclient.Options{}) - Expect(err).To(BeNil()) - - // Should verify management cluster is created using default ClusterClass - clusterInfo := mcClusterClient.GetClusterStatusInfo(e2eConfig.ManagementClusterName, "tkg-system", nil) - Expect(clusterInfo.ClusterObject).NotTo(BeNil()) - Expect(clusterInfo.ClusterObject.Spec.Topology).NotTo(BeNil()) - Expect(clusterInfo.ClusterObject.Spec.Topology.Class).To(Equal("tkg-" + e2eConfig.InfrastructureName + "-default-" + constants.DefaultClusterClassVersion)) - - // Should verify all management packages are deployed and reconciled successfully - err = managementcomponents.WaitForManagementPackages(mcClusterClient, 2*time.Minute) - Expect(err).To(BeNil()) - } - - return []byte( - strings.Join([]string{ - artifactsFolder, - e2eConfigPath, - }, ","), - ) -}, func(data []byte) { - // Before each parallel node - - parts := strings.Split(string(data), ",") - Expect(parts).To(HaveLen(2)) - - artifactsFolder = parts[0] - e2eConfigPath = parts[1] - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) -}) - -var _ = SynchronizedAfterSuite(func() { -}, func() { - // After all parallel nodes - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - logLocation := filepath.Join(artifactsFolder, "logs") - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "after_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - if !e2eConfig.UseExistingCluster { - err = cli.DeleteRegion(tkgctl.DeleteRegionOptions{ - ClusterName: e2eConfig.ManagementClusterName, - Force: true, - SkipPrompt: true, - Timeout: timeout, - }) - - Expect(err).To(BeNil()) - } -}) diff --git a/tkg/test/tkgctl/docker/docker_addons_test.go b/tkg/test/tkgctl/docker/docker_addons_test.go deleted file mode 100644 index 41de6cb673..0000000000 --- a/tkg/test/tkgctl/docker/docker_addons_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package docker - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Addon tests for capd clusters", func() { - E2EAddonSpec(context.TODO(), func() E2EAddonSpecInput { - return E2EAddonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/docker/docker_antrea_test.go b/tkg/test/tkgctl/docker/docker_antrea_test.go deleted file mode 100644 index d01a32b595..0000000000 --- a/tkg/test/tkgctl/docker/docker_antrea_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package docker - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for docker - antrea", func() { - E2ECommonSpec(context.TODO(), func() E2ECommonSpecInput { - return E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/docker/docker_autoscaler_test.go b/tkg/test/tkgctl/docker/docker_autoscaler_test.go deleted file mode 100644 index 31f7ac0e57..0000000000 --- a/tkg/test/tkgctl/docker/docker_autoscaler_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package docker - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Autoscaler tests for capd clusters", func() { - E2EAutoscalerSpec(context.TODO(), func() E2EAutoscalerSpecInput { - return E2EAutoscalerSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/docker/docker_calico_test.go b/tkg/test/tkgctl/docker/docker_calico_test.go deleted file mode 100644 index d0c5ce3015..0000000000 --- a/tkg/test/tkgctl/docker/docker_calico_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package docker - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for docker - calico", func() { - E2ECommonSpec(context.TODO(), func() E2ECommonSpecInput { - return E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - } - }) -}) diff --git a/tkg/test/tkgctl/docker/docker_ceip_test.go b/tkg/test/tkgctl/docker/docker_ceip_test.go deleted file mode 100644 index 5307aa8d9f..0000000000 --- a/tkg/test/tkgctl/docker/docker_ceip_test.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package docker - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("CEIP tests for capd clusters", func() { - E2ECEIPSpec(context.TODO(), func() E2ECEIPSpecInput { - return E2ECEIPSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/docker/docker_mhc_test.go b/tkg/test/tkgctl/docker/docker_mhc_test.go deleted file mode 100644 index 7b13047132..0000000000 --- a/tkg/test/tkgctl/docker/docker_mhc_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package docker - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("MHC tests for capd clusters", func() { - E2EMhcSpec(context.TODO(), func() E2EMhcSpecInput { - return E2EMhcSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/docker/docker_node_pool_test.go b/tkg/test/tkgctl/docker/docker_node_pool_test.go deleted file mode 100644 index 0979c06034..0000000000 --- a/tkg/test/tkgctl/docker/docker_node_pool_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package docker - -import ( - "context" - - . "github.com/onsi/ginkgo" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Node pool tests for capd clusters", func() { - E2ENodePoolSpec(context.TODO(), func() E2ENodePoolSpecInput { - replicas := int32(1) - return E2ENodePoolSpecInput{ - E2ECommonSpecInput: E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - Plan: "dev", - Namespace: "default", - }, - NodePool: client.NodePool{ - Name: "np-1", - Replicas: &replicas, - Labels: &map[string]string{ - "provider": "docker", - }, - }, - } - }) -}) diff --git a/tkg/test/tkgctl/docker/docker_scale_test.go b/tkg/test/tkgctl/docker/docker_scale_test.go deleted file mode 100644 index d7448e94f9..0000000000 --- a/tkg/test/tkgctl/docker/docker_scale_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package docker - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Scale tests for capd clusters", func() { - E2EScaleSpec(context.TODO(), func() E2EScaleSpecInput { - return E2EScaleSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/docker/docker_suite_test.go b/tkg/test/tkgctl/docker/docker_suite_test.go deleted file mode 100644 index 3148b18394..0000000000 --- a/tkg/test/tkgctl/docker/docker_suite_test.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package docker - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -var ( - // path to the e2e config file - e2eConfigPath string - - // path to store test artifacts - artifactsFolder string - - // config read from e2eConfigPath to be used in the tests - e2eConfig *framework.E2EConfig - - clusterName string -) - -func TestE2E(t *testing.T) { - if folder, ok := os.LookupEnv("E2E_ARTIFACTS"); ok { - artifactsFolder = folder - } - - if artifactsFolder == "" { - artifactsFolder = filepath.Join(os.TempDir(), "artifacts") - } - - if configPath, ok := os.LookupEnv("E2E_CONFIG"); ok { - e2eConfigPath = configPath - } - - RegisterFailHandler(Fail) - junitPath := filepath.Join(artifactsFolder, "junit", fmt.Sprintf("junit.e2e_suite.%d.xml", config.GinkgoConfig.ParallelNode)) - junitReporter := reporters.NewJUnitReporter(junitPath) - RunSpecsWithDefaultAndCustomReporters(t, "tkgctl-docker-e2e", []Reporter{junitReporter}) -} - -var _ = SynchronizedBeforeSuite(func() []byte { - // Before all parallel nodes - - Expect(e2eConfigPath).To(BeAnExistingFile(), "e2e config file is either not set or invalid") - Expect(os.MkdirAll(artifactsFolder, 0o700)).To(Succeed(), "Can't create artifacts directory %q", artifactsFolder) - - logsDir := filepath.Join(artifactsFolder, "logs") - Expect(os.MkdirAll(logsDir, 0o700)).To(Succeed(), "Can't create logs directory %q", logsDir) - - By(fmt.Sprintf("Loading the e2e test configuration from %q", e2eConfigPath)) - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) - - hackCmd := exec.NewCommand( - exec.WithCommand("../../scripts/legacy_hack.sh"), - exec.WithStdout(GinkgoWriter), - ) - - fmt.Println("Executing the legacy hack script") - out, cmdErr, err := hackCmd.Run(context.Background()) - fmt.Println(string(out)) - fmt.Println(string(cmdErr)) - Expect(err).To(BeNil()) - - logLocation := filepath.Join(artifactsFolder, "logs") - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "before_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - // save config variables from e2e config to the tkg config file - err = e2eConfig.SaveTkgConfigVariables() - Expect(err).To(BeNil()) - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - // create management cluster - if !e2eConfig.UseExistingCluster { - os.Setenv("_ALLOW_CALICO_ON_MANAGEMENT_CLUSTER", "true") - err := cli.Init(tkgctl.InitRegionOptions{ - Plan: e2eConfig.ManagementClusterOptions.Plan, - ClusterName: e2eConfig.ManagementClusterName, - InfrastructureProvider: e2eConfig.InfrastructureName, - Timeout: timeout, - Size: e2eConfig.ManagementClusterOptions.Size, - DeployTKGonVsphere7: e2eConfig.ManagementClusterOptions.DeployTKGonVsphere7, - EnableTKGSOnVsphere7: e2eConfig.ManagementClusterOptions.EnableTKGSOnVsphere7, - VsphereControlPlaneEndpoint: e2eConfig.ManagementClusterOptions.Endpoint, - CniType: "calico", - Edition: "tkg", - }) - - Expect(err).To(BeNil()) - } - os.Unsetenv("_ALLOW_CALICO_ON_MANAGEMENT_CLUSTER") - - // Create initial workload cluster - clusterName = e2eConfig.ClusterPrefix + "wc" - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: constants.DefaultNamespace, - Plan: "dev", - } - clusterConfigFile, err := framework.GetTempClusterConfigFile(e2eConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - - defer os.Remove(clusterConfigFile) - - tkgCtlClient, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).ToNot(HaveOccurred()) - - optOutStatus, err := tkgCtlClient.GetCEIP() - Expect(err).ToNot(HaveOccurred()) - Expect(optOutStatus.CeipStatus).To(Equal("Opt-out")) - - By(fmt.Sprintf("Creating initial workload cluster %q", clusterName)) - - defer os.Remove(clusterConfigFile) - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - return []byte( - strings.Join([]string{ - artifactsFolder, - e2eConfigPath, - }, ","), - ) -}, func(data []byte) { - // Before each parallel node - - parts := strings.Split(string(data), ",") - Expect(parts).To(HaveLen(2)) - - artifactsFolder = parts[0] - e2eConfigPath = parts[1] - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) -}) - -var _ = SynchronizedAfterSuite(func() { -}, func() { - // After all parallel nodes - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Deleting workload cluster %q", clusterName)) - - logsDir := filepath.Join(artifactsFolder, "logs") - tkgCtlClient, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).ToNot(HaveOccurred()) - - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: constants.DefaultNamespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - logLocation := filepath.Join(artifactsFolder, "logs") - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "after_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - err = cli.DeleteRegion(tkgctl.DeleteRegionOptions{ - ClusterName: e2eConfig.ManagementClusterName, - Force: true, - SkipPrompt: true, - Timeout: timeout, - }) - - Expect(err).To(BeNil()) -}) diff --git a/tkg/test/tkgctl/docker/docker_upgrade_antrea_test.go b/tkg/test/tkgctl/docker/docker_upgrade_antrea_test.go deleted file mode 100644 index e5351d0d68..0000000000 --- a/tkg/test/tkgctl/docker/docker_upgrade_antrea_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package docker - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Upgrade tests for capd clusters - antrea", func() { - E2EUpgradeSpec(context.TODO(), func() E2EUpgradeSpecInput { - return E2EUpgradeSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/docker_cc/docker_antrea_test.go b/tkg/test/tkgctl/docker_cc/docker_antrea_test.go deleted file mode 100644 index acd444bb7a..0000000000 --- a/tkg/test/tkgctl/docker_cc/docker_antrea_test.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package docker - -import ( - . "github.com/onsi/ginkgo" -) - -var _ = Describe("Functional tests for docker - antrea", func() { - //no-op -}) diff --git a/tkg/test/tkgctl/docker_cc/docker_suite_test.go b/tkg/test/tkgctl/docker_cc/docker_suite_test.go deleted file mode 100644 index 2b39311abe..0000000000 --- a/tkg/test/tkgctl/docker_cc/docker_suite_test.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package docker - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -var ( - // path to the e2e config file - e2eConfigPath string - - // path to store test artifacts - artifactsFolder string - - // config read from e2eConfigPath to be used in the tests - e2eConfig *framework.E2EConfig - - clusterName string -) - -func TestE2E(t *testing.T) { - if folder, ok := os.LookupEnv("E2E_ARTIFACTS"); ok { - artifactsFolder = folder - } - - if artifactsFolder == "" { - artifactsFolder = filepath.Join(os.TempDir(), "artifacts") - } - - if configPath, ok := os.LookupEnv("E2E_CONFIG"); ok { - e2eConfigPath = configPath - } - - RegisterFailHandler(Fail) - junitPath := filepath.Join(artifactsFolder, "junit", fmt.Sprintf("junit.e2e_suite.%d.xml", config.GinkgoConfig.ParallelNode)) - junitReporter := reporters.NewJUnitReporter(junitPath) - RunSpecsWithDefaultAndCustomReporters(t, "tkgctl-docker-e2e", []Reporter{junitReporter}) -} - -var _ = SynchronizedBeforeSuite(func() []byte { - // Before all parallel nodes - - Expect(e2eConfigPath).To(BeAnExistingFile(), "e2e config file is either not set or invalid") - Expect(os.MkdirAll(artifactsFolder, 0o700)).To(Succeed(), "Can't create artifacts directory %q", artifactsFolder) - - logsDir := filepath.Join(artifactsFolder, "logs") - Expect(os.MkdirAll(logsDir, 0o700)).To(Succeed(), "Can't create logs directory %q", logsDir) - - By(fmt.Sprintf("Loading the e2e test configuration from %q", e2eConfigPath)) - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) - - logLocation := filepath.Join(artifactsFolder, "logs") - hackCmd := exec.NewCommand( - exec.WithCommand("../../scripts/cc_hack.sh"), - exec.WithStdout(GinkgoWriter), - ) - - fmt.Println("Executing the hack script") - out, cmdErr, err := hackCmd.Run(context.Background()) - fmt.Println(string(out)) - fmt.Println(string(cmdErr)) - Expect(err).To(BeNil()) - - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "before_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - // save config variables from e2e config to the tkg config file - err = e2eConfig.SaveTkgConfigVariables() - Expect(err).To(BeNil()) - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - // create management cluster - if !e2eConfig.UseExistingCluster { - err := cli.Init(tkgctl.InitRegionOptions{ - Plan: e2eConfig.ManagementClusterOptions.Plan, - ClusterName: e2eConfig.ManagementClusterName, - InfrastructureProvider: e2eConfig.InfrastructureName, - Timeout: timeout, - Size: e2eConfig.ManagementClusterOptions.Size, - DeployTKGonVsphere7: e2eConfig.ManagementClusterOptions.DeployTKGonVsphere7, - EnableTKGSOnVsphere7: e2eConfig.ManagementClusterOptions.EnableTKGSOnVsphere7, - VsphereControlPlaneEndpoint: e2eConfig.ManagementClusterOptions.Endpoint, - CniType: "antrea", - Edition: "tkg", - }) - - Expect(err).To(BeNil()) - } - - return []byte( - strings.Join([]string{ - artifactsFolder, - e2eConfigPath, - }, ","), - ) -}, func(data []byte) { - // Before each parallel node - - parts := strings.Split(string(data), ",") - Expect(parts).To(HaveLen(2)) - - artifactsFolder = parts[0] - e2eConfigPath = parts[1] - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) -}) - -var _ = SynchronizedAfterSuite(func() { -}, func() { - // After all parallel nodes - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - logLocation := filepath.Join(artifactsFolder, "logs") - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "after_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - err = cli.DeleteRegion(tkgctl.DeleteRegionOptions{ - ClusterName: e2eConfig.ManagementClusterName, - Force: true, - SkipPrompt: true, - Timeout: timeout, - }) - - Expect(err).To(BeNil()) -}) diff --git a/tkg/test/tkgctl/oracle_cc/oracle_cc_antrea_test.go b/tkg/test/tkgctl/oracle_cc/oracle_cc_antrea_test.go deleted file mode 100644 index 67fdc8ef47..0000000000 --- a/tkg/test/tkgctl/oracle_cc/oracle_cc_antrea_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package oracle_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for Oracle - Antrea", func() { - E2ECommonSpec(context.TODO(), func() E2ECommonSpecInput { - return E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - Plan: "devcc", - Namespace: "tkg-system", - } - }) -}) diff --git a/tkg/test/tkgctl/oracle_cc/oracle_cc_suite_test.go b/tkg/test/tkgctl/oracle_cc/oracle_cc_suite_test.go deleted file mode 100644 index fba9c63896..0000000000 --- a/tkg/test/tkgctl/oracle_cc/oracle_cc_suite_test.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint - -package oracle_cc - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" -) - -var ( - // path to the e2e config file - e2eConfigPath string - - // path to store test artifacts - artifactsFolder string - - // config read from e2eConfigPath to be used in the tests - e2eConfig *framework.E2EConfig -) - -func TestE2E(t *testing.T) { - if folder, ok := os.LookupEnv("E2E_ARTIFACTS"); ok { - artifactsFolder = folder - } - - if artifactsFolder == "" { - artifactsFolder = filepath.Join(os.TempDir(), "artifacts") - } - - if configPath, ok := os.LookupEnv("E2E_CONFIG"); ok { - e2eConfigPath = configPath - } - - RegisterFailHandler(Fail) - junitPath := filepath.Join(artifactsFolder, "junit", fmt.Sprintf("junit.e2e_suite.%d.xml", config.GinkgoConfig.ParallelNode)) - junitReporter := reporters.NewJUnitReporter(junitPath) - RunSpecsWithDefaultAndCustomReporters(t, "tkgctl-oracle-e2e", []Reporter{junitReporter}) -} - -var _ = SynchronizedBeforeSuite(func() []byte { - // Before all parallel nodes - - Expect(e2eConfigPath).To(BeAnExistingFile(), "e2e config file is either not set or invalid") - Expect(os.MkdirAll(artifactsFolder, 0o700)).To(Succeed(), "Can't create artifacts directory %q", artifactsFolder) - - logsDir := filepath.Join(artifactsFolder, "logs") - Expect(os.MkdirAll(logsDir, 0o700)).To(Succeed(), "Can't create logs directory %q", logsDir) - - By(fmt.Sprintf("Loading the e2e test configuration from %q", e2eConfigPath)) - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) - - logLocation := filepath.Join(artifactsFolder, "logs") - - // save config variables from e2e config to the tkg config file - err := e2eConfig.SaveTkgConfigVariables() - Expect(err).To(BeNil()) - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - // turn on the `auto-apply-generated-clusterclass-based-configuration` and `package-based-cc` feature gate - hackCmd := exec.NewCommand( - exec.WithCommand("../../scripts/cc_hack.sh"), - exec.WithStdout(GinkgoWriter), - ) - - fmt.Println("Executing the hack script") - out, cmdErr, err := hackCmd.Run(context.Background()) - fmt.Println(string(out)) - fmt.Println(string(cmdErr)) - Expect(err).To(BeNil()) - - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "before_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - // create management cluster - if !e2eConfig.UseExistingCluster { - err := cli.Init(tkgctl.InitRegionOptions{ - ClusterConfigFile: e2eConfig.TkgClusterConfigPath, - - Plan: e2eConfig.ManagementClusterOptions.Plan, - ClusterName: e2eConfig.ManagementClusterName, - InfrastructureProvider: e2eConfig.InfrastructureName, - Timeout: timeout, - Size: e2eConfig.ManagementClusterOptions.Size, - DeployTKGonVsphere7: e2eConfig.ManagementClusterOptions.DeployTKGonVsphere7, - EnableTKGSOnVsphere7: e2eConfig.ManagementClusterOptions.EnableTKGSOnVsphere7, - VsphereControlPlaneEndpoint: e2eConfig.ManagementClusterOptions.Endpoint, - Edition: "tkg", - }) - - Expect(err).To(BeNil()) - - kubeConfigFileName := e2eConfig.ManagementClusterName + ".kubeconfig" - defer os.Remove(kubeConfigFileName) - tempFilePath := filepath.Join(os.TempDir(), kubeConfigFileName) - err = cli.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: e2eConfig.ManagementClusterName, - Namespace: "tkg-system", - ExportFile: tempFilePath, - }) - Expect(err).To(BeNil()) - } - - return []byte( - strings.Join([]string{ - artifactsFolder, - e2eConfigPath, - }, ","), - ) -}, func(data []byte) { - // Before each parallel node - - parts := strings.Split(string(data), ",") - Expect(parts).To(HaveLen(2)) - - artifactsFolder = parts[0] - e2eConfigPath = parts[1] - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) -}) - -var _ = SynchronizedAfterSuite(func() { -}, func() { - // After all parallel nodes - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - logLocation := filepath.Join(artifactsFolder, "logs") - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "after_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - if !e2eConfig.UseExistingCluster { - err = cli.DeleteRegion(tkgctl.DeleteRegionOptions{ - ClusterName: e2eConfig.ManagementClusterName, - Force: true, - SkipPrompt: true, - Timeout: timeout, - }) - - Expect(err).To(BeNil()) - } -}) diff --git a/tkg/test/tkgctl/shared/addons.go b/tkg/test/tkgctl/shared/addons.go deleted file mode 100644 index 3ad1e34394..0000000000 --- a/tkg/test/tkgctl/shared/addons.go +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "gopkg.in/yaml.v3" - v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/kubernetes" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" -) - -type E2EAddonSpecInput struct { - E2EConfig *framework.E2EConfig - ArtifactsFolder string - Cni string -} - -func E2EAddonSpec(context context.Context, inputGetter func() E2EAddonSpecInput) { - var input E2EAddonSpecInput - - BeforeEach(func() { - input = inputGetter() - }) - - It("should verify cluster metadata", func() { - Skip("Skipping cluster metadata tests") - - By("Verifying management cluster metadata") - verifyClusterMetadata(VerifyClusterMetadataInput{ - ClusterName: input.E2EConfig.ManagementClusterName, - ClusterType: "management", - Namespace: "tkg-system-public", - Plan: input.E2EConfig.ManagementClusterOptions.Plan, - InfraProvider: input.E2EConfig.InfrastructureName, - TkgConfigDir: input.E2EConfig.TkgConfigDir, - TkgClusterConfigPath: input.E2EConfig.TkgClusterConfigPath, - TkrVersion: input.E2EConfig.TkrVersion, - }) - }) - - It("should verify cert-manager", func() { - By("Verifying if cert-manager pods are running") - verifyCertManagerPodsRunning(input.E2EConfig.ManagementClusterName, "cert-manager") - - By("Create a certificate") - contextName := input.E2EConfig.ManagementClusterName + "-admin@" + input.E2EConfig.ManagementClusterName - command := exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("apply", "-f", "../../data/cert-manager-resources.yaml", "--context", contextName), - exec.WithStdout(GinkgoWriter), - ) - err := command.RunAndRedirectOutput(context) - Expect(err).ToNot(HaveOccurred()) - - By("Waiting for the certificate to be ready") - waitForCertificateToBeReady(context, input.E2EConfig.ManagementClusterName, "selfsigned-cert", "tkg-cert-manager-test") - }) -} - -type VerifyClusterMetadataInput struct { - ClusterName string - ClusterType string - Namespace string - Plan string - InfraProvider string - TkrVersion string - TkgConfigDir string - TkgClusterConfigPath string -} - -type Infrastructure struct { - Provider string `json:"provider" yaml:"provider"` -} - -type Cluster struct { - Name string `json:"name" yaml:"name"` - Type string `json:"type" yaml:"type"` - Plan string `json:"plan" yaml:"plan"` - KubernetesProvider string `json:"kubernetesProvider" yaml:"kubernetesProvider"` - TkgVersion string `json:"tkgVersion" yaml:"tkgVersion"` - Infrastructure Infrastructure `json:"infrastructure" yaml:"infrastructure"` -} - -type ClusterMetadata struct { - Cluster Cluster `json:"cluster" yaml:"cluster"` -} - -func waitForCertificateToBeReady(ctx context.Context, clusterName string, certName string, namespace string) { - context := clusterName + "-admin@" + clusterName - proxy := framework.NewClusterProxy(clusterName, "", context) - crClient := proxy.GetClient() - - Eventually(func() bool { - _, _ = GinkgoWriter.Write([]byte("Waiting for the certificate '" + certName + "' to be ready\n")) - u := &unstructured.Unstructured{} - u.SetGroupVersionKind(schema.GroupVersionKind{ - Group: "cert-manager.io", - Kind: "Certificate", - Version: "v1", - }) - err := crClient.Get(ctx, crtclient.ObjectKey{ - Namespace: namespace, - Name: certName, - }, u) - Expect(err).ToNot(HaveOccurred()) - - status, ok := u.Object["status"].(map[string]interface{}) - if !ok { - return false - } - - if status["conditions"] == nil { - return false - } - conditions := status["conditions"].([]interface{}) - for _, c := range conditions { - condition, ok := c.(map[string]interface{}) - if !ok { - return false - } - - if condition["reason"] == "Ready" && condition["status"] == "True" { - return true - } - } - return false - }, "10m", "30s").Should(BeTrue()) -} - -func verifyCertManagerPodsRunning(clusterName string, namespace string) { - ctx := clusterName + "-admin@" + clusterName - proxy := framework.NewClusterProxy(clusterName, "", ctx) - clientSet := proxy.GetClientSet() - podList, err := clientSet.CoreV1().Pods(namespace).List(context.Background(), metav1.ListOptions{}) - Expect(err).ToNot(HaveOccurred()) - - for _, pod := range podList.Items { - Expect(pod.Status.Phase).To(Equal(v1.PodRunning)) - } -} - -func verifyClusterMetadata(input VerifyClusterMetadataInput) { //nolint:unused - context := input.ClusterName + "-admin@" + input.ClusterName - proxy := framework.NewClusterProxy(input.ClusterName, "", context) - clientSet := proxy.GetClientSet() - - // verifying cluster metadata - data := getConfigMapData(clientSet, "tkg-metadata", input.Namespace, "metadata.yaml") - metadata := &ClusterMetadata{} - err := yaml.Unmarshal(data, metadata) - Expect(err).ToNot(HaveOccurred()) - Expect(metadata.Cluster.Infrastructure.Provider).To(Equal(input.InfraProvider)) - Expect(metadata.Cluster.Type).To(Equal(input.ClusterType)) - Expect(metadata.Cluster.Name).To(Equal(input.ClusterName)) - Expect(metadata.Cluster.Plan).To(Equal(input.Plan)) - Expect(metadata.Cluster.KubernetesProvider).To(Equal("VMware Tanzu Kubernetes Grid")) - - // verifying tkg bom - data = getConfigMapData(clientSet, "tkg-bom", input.Namespace, "bom.yaml") - bom := &tkgconfigbom.BOMConfiguration{} - err = yaml.Unmarshal(data, bom) - Expect(err).ToNot(HaveOccurred()) -} - -func getConfigMapData(clientSet *kubernetes.Clientset, name string, namespace string, keyName string) []byte { //nolint:unused - configMap, err := clientSet.CoreV1().ConfigMaps(namespace).Get(context.Background(), name, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) - - val, ok := configMap.Data[keyName] - Expect(ok).To(BeTrue()) - return []byte(val) -} diff --git a/tkg/test/tkgctl/shared/autoscaler.go b/tkg/test/tkgctl/shared/autoscaler.go deleted file mode 100644 index 1992188cea..0000000000 --- a/tkg/test/tkgctl/shared/autoscaler.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - "fmt" - "math/rand" - "os" - "path/filepath" - "runtime" - "strconv" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "sigs.k8s.io/cluster-api/util" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type E2EAutoscalerSpecInput struct { - E2EConfig *framework.E2EConfig - ArtifactsFolder string - Cni string -} - -func E2EAutoscalerSpec(context context.Context, inputGetter func() E2EAutoscalerSpecInput) { - var ( - err error - input E2EAutoscalerSpecInput - tkgCtlClient tkgctl.TKGClient - logsDir string - clusterName string - namespace string - ) - - BeforeEach(func() { - namespace = constants.DefaultNamespace - input = inputGetter() - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - - rand.Seed(time.Now().UnixNano()) - clusterName = input.E2EConfig.ClusterPrefix + "wc-" + util.RandomString(4) // nolint:gomnd - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - }) - - It("autoscaler should scale up/down the workers", func() { - By(fmt.Sprintf("Creating a workload cluster %q", clusterName)) - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - Plan: "dev", - CniType: input.Cni, - EnableClusterOptions: "autoscaler", - OtherConfigs: map[string]string{ - "AUTOSCALER_MAX_SIZE_0": "3", - "AUTOSCALER_SCALE_DOWN_DELAY_AFTER_ADD": "10s", - "AUTOSCALER_SCALE_DOWN_UNNEEDED_TIME": "10s", - }, - } - if input.E2EConfig.InfrastructureName == "vsphere" { - if clusterIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_AUTOSCALER"); ok { - options.VsphereControlPlaneEndpoint = clusterIP - } - } - clusterConfigFile, err := framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - - defer os.Remove(clusterConfigFile) - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", clusterName)) - err = tkgCtlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - }) - Expect(err).To(BeNil()) - - contextName := clusterName + "-admin@" + clusterName - clusterProxy := framework.NewClusterProxy(clusterName, "", contextName) - - By(fmt.Sprintf("Waiting for workload cluster %q nodes to be up and running", clusterName)) - framework.WaitForNodes(clusterProxy, 2) - - By("Deploying workload which should trigger a scale up") - kubectlCmd := exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("apply", "-f", "../../data/nginx_autoscaler.yaml", "--context", contextName), - ) - _, _, err = kubectlCmd.Run(context) - Expect(err).To(BeNil()) - - if input.E2EConfig.InfrastructureName == "docker" { - cpuCount := runtime.NumCPU() - By(fmt.Sprintf("Scaling the deployment to %v", cpuCount)) - kubectlCmd = exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("scale", "--replicas="+strconv.Itoa(cpuCount), "deployment/nginx-deployment", "--context", contextName), - ) - _, _, err = kubectlCmd.Run(context) - Expect(err).To(BeNil()) - } - - By("Scaling up workload cluster") - framework.WaitForNodesDuringScaleUp(framework.NewClusterProxy(clusterName, "", contextName), 3) - - By("Deleting workload which should trigger a scale down") - kubectlCmd = exec.NewCommand( - exec.WithCommand("kubectl"), - exec.WithArgs("delete", "-f", "../../data/nginx_autoscaler.yaml", "--context", contextName), - ) - _, _, err = kubectlCmd.Run(context) - Expect(err).To(BeNil()) - - By("Scaling down workload cluster") - framework.WaitForNodes(framework.NewClusterProxy(clusterName, "", contextName), 2) - }) - - AfterEach(func() { - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: namespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - }) -} diff --git a/tkg/test/tkgctl/shared/cc_misc.go b/tkg/test/tkgctl/shared/cc_misc.go deleted file mode 100644 index 052e060763..0000000000 --- a/tkg/test/tkgctl/shared/cc_misc.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package shared - -import ( - "bytes" - "context" - "fmt" - "io" - "math/rand" - "os" - "path/filepath" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "gopkg.in/yaml.v2" - "sigs.k8s.io/cluster-api/util" - - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -func E2ECCMiscSpec(context context.Context, inputGetter func() E2ECommonSpecInput) { - var ( - err error - input E2ECommonSpecInput - tkgCtlClient tkgctl.TKGClient - logsDir string - clusterName string - namespace string - ) - - BeforeEach(func() { - input = inputGetter() - namespace = input.Namespace - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - - rand.Seed(time.Now().UnixNano()) - clusterName = input.E2EConfig.ClusterPrefix + "wc-" + util.RandomString(4) // nolint:gomnd - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - Expect(err).To(BeNil()) - }) - - It("should test misc clusterclass operations", func() { - By("Running cluster create dry-run ") - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - Plan: "devcc", - CniType: input.Cni, - GenerateOnly: true, - } - - if input.E2EConfig.InfrastructureName == "vsphere" { - if endpointIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_2"); ok { - options.VsphereControlPlaneEndpoint = endpointIP - } - } - - clusterConfigFile, err := framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - defer os.Remove(clusterConfigFile) - - old := os.Stdout - r, w, _ := os.Pipe() - os.Stdout = w - - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - GenerateOnly: true, - }) - Expect(err).To(BeNil()) - - outChan := make(chan string) - go func() { - var buf bytes.Buffer - io.Copy(&buf, r) - outChan <- buf.String() - }() - - w.Close() - os.Stdout = old - - out := <-outChan - - var obj map[string]interface{} - err = yaml.NewDecoder(bytes.NewBufferString(out)).Decode(&obj) - Expect(err).ToNot(HaveOccurred()) - - if obj["kind"] == "ClusterClass" { - if metadata, ok := obj["metadata"].(map[string]interface{}); ok { - Expect(metadata["name"]).To(Equal(fmt.Sprintf("tkg-%s-default", input.E2EConfig.InfrastructureName))) - } - } else if obj["kind"] == "Cluster" { - if spec, ok := obj["spec"].(map[string]interface{}); ok { - if topology, ok := spec["topology"].(map[string]interface{}); ok { - Expect(topology["class"]).To(Equal(fmt.Sprintf("tkg-%s-default", input.E2EConfig.InfrastructureName))) - } - } - } - - By("running cluster create dry-run with a cc config file") - ccConfig, err := os.CreateTemp("", "cc_config") - Expect(err).ToNot(HaveOccurred()) - defer ccConfig.Close() - - io.Copy(ccConfig, bytes.NewBufferString(out)) - - old = os.Stdout - r, w, _ = os.Pipe() - os.Stdout = w - - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: ccConfig.Name(), - Edition: "tkg", - GenerateOnly: true, - }) - Expect(err).To(BeNil()) - - outChan = make(chan string) - go func() { - var buf bytes.Buffer - io.Copy(&buf, r) - outChan <- buf.String() - }() - - w.Close() - os.Stdout = old - - outAgain := <-outChan - - Expect(out).To(Equal(outAgain)) - }) -} diff --git a/tkg/test/tkgctl/shared/ceip.go b/tkg/test/tkgctl/shared/ceip.go deleted file mode 100644 index 80e8c08473..0000000000 --- a/tkg/test/tkgctl/shared/ceip.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - "fmt" - "math/rand" - "path/filepath" - "strings" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/pkg/errors" - batchv1 "k8s.io/api/batch/v1" - v1 "k8s.io/api/core/v1" - k8serr "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -const ( - telemetryNamespace = "tkg-system-telemetry" - telemetryName = "tkg-telemetry" - phaseSucceeded = "Succeeded" - phaseRunning = "Running" -) - -type E2ECEIPSpecInput struct { - E2EConfig *framework.E2EConfig - ArtifactsFolder string - Cni string -} - -func E2ECEIPSpec(context context.Context, inputGetter func() E2ECEIPSpecInput) { - var ( - err error - input E2ECEIPSpecInput - tkgCtlClient tkgctl.TKGClient - mcProxy *framework.ClusterProxy - logsDir string - mcContextName string - ) - - BeforeEach(func() { - input = inputGetter() - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - - rand.Seed(time.Now().UnixNano()) - mcClusterName := input.E2EConfig.ManagementClusterName - mcContextName = mcClusterName + "-admin@" + mcClusterName - mcProxy = framework.NewClusterProxy(mcClusterName, "", mcContextName) - - rand.Seed(time.Now().UnixNano()) - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, mcClusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - Expect(err).To(BeNil()) - }) - - It("should verify CEIP opt-in and opt-out and verify telemetry job and pod are running", func() { - Skip("Skip CEIP tests until opt-in and opt-out mechanisms are fixed") - By("should verify ceip opted out") - err := tkgCtlClient.SetCeip("false", "", "") - Expect(err).ToNot(HaveOccurred()) - - duration := 5 * time.Second - time.Sleep(duration) - - optOutStatus, err := tkgCtlClient.GetCEIP() - Expect(err).ToNot(HaveOccurred()) - Expect(optOutStatus.CeipStatus).To(Equal("Opt-out")) - - By("should verify ceip opted in and prod telemetry url") - err = tkgCtlClient.SetCeip("true", "true", "") - Expect(err).ToNot(HaveOccurred()) - - cStatus, err := tkgCtlClient.GetCEIP() - Expect(err).ToNot(HaveOccurred()) - Expect(cStatus.CeipStatus).To(Equal("Opt-in")) - - err = verifyTelemetryJobURL(context, "https://scapi.vmware.com", mcProxy) - Expect(err).ToNot(HaveOccurred()) - - By("should verify ceip opted in and stage telemetry url") - err = tkgCtlClient.SetCeip("true", "false", "") - Expect(err).ToNot(HaveOccurred()) - - cStatus, err = tkgCtlClient.GetCEIP() - Expect(err).ToNot(HaveOccurred()) - Expect(cStatus.CeipStatus).To(Equal("Opt-in")) - - err = verifyTelemetryJobURL(context, "https://scapi-stg.vmware.com", mcProxy) - Expect(err).ToNot(HaveOccurred()) - - By("should verify telemetry job and pod are running") - err = verifyTelemetryJobRunning(context, mcProxy) - Expect(err).ToNot(HaveOccurred()) - }) -} - -func verifyTelemetryJobURL(context context.Context, url string, mcProxy *framework.ClusterProxy) error { - client := mcProxy.GetClient() - cronJob := &batchv1.CronJob{} - - _, _ = GinkgoWriter.Write([]byte(fmt.Sprintf("Context : %s \n", context))) - err := client.Get(context, types.NamespacedName{Name: telemetryName, Namespace: telemetryNamespace}, cronJob) - if err != nil { - return err - } - - container := cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers[0] - commands := container.Command - - for _, command := range commands { - if strings.Contains(command, url) { - return nil - } - } - - return errors.New("URL not found in the telemetry cron job") -} - -func verifyTelemetryJobRunning(context context.Context, mcProxy *framework.ClusterProxy) error { - var ( - err error - selectors = []crtclient.ListOption{crtclient.InNamespace(telemetryNamespace)} - client = mcProxy.GetClient() - pollInterval = 30 * time.Second - pollTimeout = 90 * time.Second - ) - - scheme := mcProxy.GetScheme() - batchv1.AddToScheme(scheme) - - cronJob := &batchv1.CronJob{} - if err = client.Get(context, types.NamespacedName{Name: telemetryName, Namespace: telemetryNamespace}, cronJob); err != nil { - return err - } - - // updating the telemetry cron job schedule to "* * * * *" so that the cronjob can be scheduled to run within the next 59 seconds - cronJobToUpdate := cronJob.DeepCopy() - cronJobToUpdate.Spec.Schedule = "* * * * *" - if err = client.Update(context, cronJobToUpdate); err != nil { - return err - } - - // check to see if any telemetry job gets created within pollTimeout time interval - jobs := &batchv1.JobList{} - if err = wait.Poll(pollInterval, pollTimeout, func() (done bool, err error) { - if err = client.List(context, jobs, selectors...); err != nil { - if k8serr.IsNotFound(err) { - return false, nil - } - return false, err - } - if len(jobs.Items) == 0 { - return false, nil - } - return true, nil - }); err != nil { - return errors.Wrap(err, "unable to find telemetry cronjob") - } - - // check to see if any telemetry pod gets created within pollTimeout time interval - pods := &v1.PodList{} - if err = wait.Poll(pollInterval, pollTimeout, func() (done bool, err error) { - pods = &v1.PodList{} - if err = client.List(context, pods, selectors...); err != nil { - if k8serr.IsNotFound(err) { - return false, nil - } - return false, err - } - if len(pods.Items) == 0 { - return false, nil - } - return true, nil - }); err != nil { - return errors.Wrap(err, "error while waiting for telemetry pods to be available") - } - - // check to make sure that the telemetry pods are in either of "Running" or "Succeeded" phases - if err = wait.Poll(pollInterval, pollTimeout, func() (done bool, err error) { - for i := range pods.Items { - po := &v1.Pod{} - if err = client.Get(context, types.NamespacedName{Name: pods.Items[i].Name, Namespace: telemetryNamespace}, po); err != nil { - if k8serr.IsNotFound(err) { // corner case: A pod in running state which has been kicked off by an older job, might have been terminated and not exist anymore - continue - } - return false, err - } - if po.Status.Phase != phaseSucceeded && po.Status.Phase != phaseRunning { - return false, nil - } - } - return true, nil - }); err != nil { - return errors.Wrap(err, "telemetry job is not running") - } - - // returning the telemetry cron job schedule back to "0 */6 * * *" - cronJob = &batchv1.CronJob{} - if err = client.Get(context, types.NamespacedName{Name: telemetryName, Namespace: telemetryNamespace}, cronJob); err != nil { - return err - } - cronJobToUpdate = cronJob.DeepCopy() - cronJobToUpdate.Spec.Schedule = "0 */6 * * *" - if err = client.Update(context, cronJobToUpdate); err != nil { - return errors.Wrap(err, "error while resetting the schedule interval for cronjob") - } - - log.Info("successfully verified that telemetry job and pods are running") - return nil -} diff --git a/tkg/test/tkgctl/shared/constants.go b/tkg/test/tkgctl/shared/constants.go deleted file mode 100644 index 50d4ff2954..0000000000 --- a/tkg/test/tkgctl/shared/constants.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package shared - -// customAntreaConfigAndCBResource declares resources required to deploy a custom ClusterBootstrap and AntreaConfig objects; name and namespace values need to be substituted prior to usage -const customAntreaConfigAndCBResource = ` -apiVersion: csi.tanzu.vmware.com/v1alpha1 -kind: AwsEbsCSIConfig -metadata: - name: %s - namespace: %s -spec: - awsEBSCSIDriver: - namespace: %s - deploymentReplicas: 1 ---- -apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: AntreaConfig -metadata: - name: %s - namespace: %s -spec: - antrea: - config: - disableUdpTunnelOffload: false - featureGates: - AntreaPolicy: true - AntreaProxy: true - AntreaTraceflow: false - Egress: true - EndpointSlice: true - FlowExporter: false - NodePortLocal: true - noSNAT: false - trafficEncapMode: encap ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - annotations: - tkg.tanzu.vmware.com/add-missing-fields-from-tkr: %s - name: %s - namespace: %s -spec: - additionalPackages: - - refName: metrics-server* - - refName: secretgen-controller* - - refName: pinniped* - cni: - refName: antrea* - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: AntreaConfig - name: %s - csi: - refName: aws-ebs-csi* - valuesFrom: - providerRef: - apiGroup: csi.tanzu.vmware.com - kind: AwsEbsCSIConfig - name: %s - kapp: - refName: kapp-controller* ---- -` diff --git a/tkg/test/tkgctl/shared/e2e_common.go b/tkg/test/tkgctl/shared/e2e_common.go deleted file mode 100644 index bfaa7fa2f8..0000000000 --- a/tkg/test/tkgctl/shared/e2e_common.go +++ /dev/null @@ -1,342 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - "fmt" - "math/rand" - "os" - "path/filepath" - "strings" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "sigs.k8s.io/cluster-api/util" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -type E2ECommonSpecInput struct { - E2EConfig *framework.E2EConfig - ArtifactsFolder string - Cni string - Plan string - Namespace string - OtherConfigs map[string]string -} - -func E2ECommonSpec(ctx context.Context, inputGetter func() E2ECommonSpecInput) { //nolint:funlen - var ( - err error - input E2ECommonSpecInput - tkgCtlClient tkgctl.TKGClient - logsDir string - clusterName string - namespace string - mngKubeConfigFileName string - mngKubeConfigFile string - ) - - BeforeEach(func() { //nolint:dupl - namespace = constants.DefaultNamespace - input = inputGetter() - if input.Namespace != "" { - namespace = input.Namespace - } - - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - - rand.Seed(time.Now().UnixNano()) - clusterName = input.E2EConfig.ClusterPrefix + "wc-" + util.RandomString(4) // nolint:gomnd - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - Expect(err).To(BeNil()) - - mngKubeConfigFileName = input.E2EConfig.ManagementClusterName + ".kubeconfig" - mngKubeConfigFile = filepath.Join(os.TempDir(), mngKubeConfigFileName) - - err = tkgCtlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: input.E2EConfig.ManagementClusterName, - Namespace: "tkg-system", - ExportFile: mngKubeConfigFile, - }) - Expect(err).To(BeNil()) - }) - - It("Should verify basic cluster lifecycle operations", func() { - By(fmt.Sprintf("Generating workload cluster configuration for cluster %q", clusterName)) - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - Plan: "dev", - CniType: input.Cni, - OtherConfigs: input.OtherConfigs, - } - - if input.Plan != "" { - options.Plan = input.Plan - } - - if input.E2EConfig.InfrastructureName == "vsphere" { - if input.Cni == "antrea" { - if clusterIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_ANTREA"); ok { - options.VsphereControlPlaneEndpoint = clusterIP - } - } - if input.Cni == "calico" { - if clusterIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_CALICO"); ok { - options.VsphereControlPlaneEndpoint = clusterIP - } - } - } - clusterConfigFile, err := framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - - defer os.Remove(clusterConfigFile) - err = tkgCtlClient.ConfigCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - Namespace: namespace, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Creating a workload cluster %q", clusterName)) - - options = framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - Plan: "dev", - CniType: input.Cni, - OtherConfigs: input.OtherConfigs, - } - if input.Plan != "" { - options.Plan = input.Plan - } - - if input.E2EConfig.InfrastructureName == "vsphere" { - if input.Cni == "antrea" { - if clusterIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_ANTREA"); ok { - options.VsphereControlPlaneEndpoint = clusterIP - } - } - if input.Cni == "calico" { - if clusterIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_CALICO"); ok { - options.VsphereControlPlaneEndpoint = clusterIP - } - } - } - - clusterConfigFile, err = framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - defer os.Remove(clusterConfigFile) - - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - Namespace: namespace, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", clusterName)) - kubeConfigFileName := clusterName + ".kubeconfig" - tempFilePath := filepath.Join(os.TempDir(), kubeConfigFileName) - err = tkgCtlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - ExportFile: tempFilePath, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Waiting for workload cluster %q nodes to be up and running", clusterName)) - framework.WaitForNodes(framework.NewClusterProxy(clusterName, tempFilePath, ""), 2) - - var ( - mngClient client.Client - clusterResources []ClusterResource - ) - - // verify addons are deployed successfully in clusterclass mode - if input.OtherConfigs != nil { - if isClusterClass, ok := input.OtherConfigs["clusterclass"]; ok && isClusterClass == "true" { - var infrastructureName string - pacificCluster, err := tkgCtlClient.IsPacificRegionalCluster() - Expect(err).NotTo(HaveOccurred()) - if pacificCluster { - infrastructureName = "TKGS" - } else { - infrastructureName = input.E2EConfig.InfrastructureName - } - - By(fmt.Sprintf("Get k8s client for management cluster %q", input.E2EConfig.ManagementClusterName)) - mngclient, mngDynamicClient, mngAggregatedAPIResourcesClient, mngDiscoveryClient, _, err := GetClients(ctx, mngKubeConfigFile) - Expect(err).NotTo(HaveOccurred()) - mngClient = mngclient - - By(fmt.Sprintf("Get k8s client for workload cluster %q", clusterName)) - wlcClient, _, _, _, _, err := GetClients(ctx, tempFilePath) - Expect(err).NotTo(HaveOccurred()) - - By(fmt.Sprintf("Verify addon packages on management cluster %q matches clusterBootstrap info on management cluster %q", input.E2EConfig.ManagementClusterName, input.E2EConfig.ManagementClusterName)) - err = CheckClusterCB(ctx, mngclient, wlcClient, input.E2EConfig.ManagementClusterName, constants.TkgNamespace, "", "", infrastructureName, true, false) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Verify addon packages on workload cluster %q matches clusterBootstrap info on management cluster %q", clusterName, input.E2EConfig.ManagementClusterName)) - err = CheckClusterCB(ctx, mngclient, wlcClient, input.E2EConfig.ManagementClusterName, constants.TkgNamespace, clusterName, namespace, infrastructureName, false, false) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Get management cluster resources created by addons-manager for workload cluster %q on management cluster %q", clusterName, input.E2EConfig.ManagementClusterName)) - clusterResources, err = GetManagementClusterResources(ctx, mngclient, mngDynamicClient, mngAggregatedAPIResourcesClient, mngDiscoveryClient, namespace, clusterName, infrastructureName) - Expect(err).NotTo(HaveOccurred()) - } - } - - By(fmt.Sprintf("Deleting workload cluster %q", clusterName)) - - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: namespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - // verify addon resources are deleted successfully in clusterclass mode - if input.OtherConfigs != nil { - if isClusterClass, ok := input.OtherConfigs["clusterclass"]; ok && isClusterClass == "true" { - By(fmt.Sprintf("Verify workload cluster %q resources have been deleted", clusterName)) - Eventually(func() bool { - return clusterResourcesDeleted(ctx, mngClient, clusterResources) - }, resourceDeletionWaitTimeout, pollingInterval).Should(BeTrue()) - } - } - - os.Remove(mngKubeConfigFile) - - By("Test successful !") - }) -} - -func getNextAvailableTkrVersion(tkgctlClient tkgctl.TKGClient, currentTkrVersion string) (string, error) { - var foundVersion string - - tkrs, err := tkgctlClient.GetTanzuKubernetesReleases("") - if err != nil { - return "", err - } - - for i := range tkrs { - if !isCompatible(tkrs[i]) { - continue - } - - if _, exists := tkrs[i].Labels[runv1alpha3.LabelDeactivated]; exists { - continue - } - - specVersionIsNewer, err := isNewerVMwareVersion(tkrs[i].Spec.Version, currentTkrVersion) - if err != nil { - return "", err - } - if specVersionIsNewer { - // if we don't already have a foundVersion we take spec.version - foundVersion, err = pickOlderVMwareVersion(foundVersion, tkrs[i].Spec.Version) - if err != nil { - return "", err - } - } - } - - if foundVersion == "" { - return "", fmt.Errorf("no TKR version available for upgrade") - } - - return foundVersion, nil -} - -func isCompatible(tkr v1alpha1.TanzuKubernetesRelease) bool { - var compatible string - for _, condition := range tkr.Status.Conditions { - if condition.Type == runv1alpha3.ConditionCompatible { - compatible = string(condition.Status) - break - } - } - if !strings.EqualFold(compatible, "true") { - return false - } - return true -} - -func isNewerVMwareVersion(versionA, versionB string) (bool, error) { - compareResult, err := utils.CompareVMwareVersionStrings(versionB, versionA) - if err != nil { - return false, err - } - if compareResult < 0 { - return true, nil - } - return false, nil -} - -func pickOlderVMwareVersion(tkrVersionA, tkrVersionB string) (string, error) { - var returnValue string - if tkrVersionA == "" { - returnValue = tkrVersionB - } else { - compareResult, err := utils.CompareVMwareVersionStrings(tkrVersionA, tkrVersionB) - if err != nil { - return "", err - } - if compareResult > 0 { - returnValue = tkrVersionB - } else { - returnValue = tkrVersionA - } - } - return returnValue, nil -} - -func getTkrVersion(tkgctlClient tkgctl.TKGClient, clusterName, clusterNamespace string) (string, error) { - cluster, err := tkgctlClient.GetClusters(tkgctl.ListTKGClustersOptions{Namespace: clusterNamespace, - ClusterName: clusterName}) - if err != nil { - return "", err - } - if len(cluster) < 1 { - return "", nil - } - return cluster[0].K8sVersion, nil -} - -// TestClusterUpgrade tests upgrading a workload cluster to next available tkr -func TestClusterUpgrade(tkgctlClient tkgctl.TKGClient, clusterName, namespace string) { - By(fmt.Sprintf("Upgrade workload cluster %q in namespace %q", clusterName, namespace)) - currentTkrVersion, err := getTkrVersion(tkgctlClient, clusterName, namespace) - Expect(err).ToNot(HaveOccurred()) - nextAvailableTkrVersion, err := getNextAvailableTkrVersion(tkgctlClient, currentTkrVersion) - Expect(err).ToNot(HaveOccurred()) - err = tkgctlClient.UpgradeCluster(tkgctl.UpgradeClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - TkrVersion: nextAvailableTkrVersion, - SkipPrompt: true, - }) - Expect(err).ToNot(HaveOccurred()) - -} diff --git a/tkg/test/tkgctl/shared/e2e_common_cc.go b/tkg/test/tkgctl/shared/e2e_common_cc.go deleted file mode 100644 index 14344aed46..0000000000 --- a/tkg/test/tkgctl/shared/e2e_common_cc.go +++ /dev/null @@ -1,314 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - "fmt" - "math/rand" - "os" - "path/filepath" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/selection" - "k8s.io/client-go/discovery" - "k8s.io/client-go/dynamic" - admissionregistrationv1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1" - "sigs.k8s.io/cluster-api/util" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/sets" - runv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type E2ECommonCCSpecInput struct { - E2EConfig *framework.E2EConfig - ArtifactsFolder string - Cni string - Plan string - Namespace string - IsCustomCB bool - DoUpgrade bool - CheckAdmissionWebhook bool - Timeout time.Duration - OtherConfig map[string]string -} - -func E2ECommonCCSpec(ctx context.Context, inputGetter func() E2ECommonCCSpecInput) { //nolint:funlen - var ( - err error - input E2ECommonCCSpecInput - tkgCtlClient tkgctl.TKGClient - logsDir string - clusterName string - namespace string - mngKubeConfigFileName string - mngKubeConfigFile string - mngProxy *framework.ClusterProxy - mngContextName string - options framework.CreateClusterOptions - clusterConfigFile string - tkrVersionsSet sets.StringSet - oldTKR *runv1alpha3.TanzuKubernetesRelease - defaultTKR *runv1alpha3.TanzuKubernetesRelease - mngClient client.Client - clusterResources []ClusterResource - mngDynamicClient dynamic.Interface - mngAggregatedAPIResourcesClient client.Client - mngDiscoveryClient discovery.DiscoveryInterface - admissionRegistrationClient admissionregistrationv1.AdmissionregistrationV1Interface - infrastructureName string - wlcClient client.Client - ) - - BeforeEach(func() { //nolint:dupl - namespace = constants.DefaultNamespace - input = inputGetter() - if input.Namespace != "" { - namespace = input.Namespace - } - - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - - rand.Seed(time.Now().UnixNano()) - clusterName = input.E2EConfig.ClusterPrefix + "wc-" + util.RandomString(4) // nolint:gomnd - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - mngContextName = input.E2EConfig.ManagementClusterName + "-admin@" + input.E2EConfig.ManagementClusterName - mngProxy = framework.NewClusterProxy(input.E2EConfig.ManagementClusterName, "", mngContextName) - mngKubeConfigFileName = input.E2EConfig.ManagementClusterName + ".kubeconfig" - mngKubeConfigFile = filepath.Join(os.TempDir(), mngKubeConfigFileName) - - err = tkgCtlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: input.E2EConfig.ManagementClusterName, - Namespace: "tkg-system", - ExportFile: mngKubeConfigFile, - }) - Expect(err).To(BeNil()) - - options = framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - Plan: "dev", - CniType: input.Cni, - OtherConfigs: input.OtherConfig, - } - - if input.Plan != "" { - options.Plan = input.Plan - } - if input.Timeout != time.Duration(0) { - options.Timeout = input.Timeout - } - - if input.E2EConfig.InfrastructureName == "vsphere" { - if input.Cni == "antrea" { - if clusterIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_ANTREA"); ok { - options.VsphereControlPlaneEndpoint = clusterIP - } - } - if input.Cni == "calico" { - if clusterIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_CALICO"); ok { - options.VsphereControlPlaneEndpoint = clusterIP - } - } - } - clusterConfigFile, err = framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - - pacificCluster, err := tkgCtlClient.IsPacificRegionalCluster() - Expect(err).NotTo(HaveOccurred()) - if pacificCluster { - infrastructureName = "TKGS" - } else { - infrastructureName = input.E2EConfig.InfrastructureName - } - - By(fmt.Sprintf("Get k8s client for management cluster %q", input.E2EConfig.ManagementClusterName)) - mngClient, mngDynamicClient, mngAggregatedAPIResourcesClient, mngDiscoveryClient, admissionRegistrationClient, err = GetClients(ctx, mngKubeConfigFile) - Expect(err).NotTo(HaveOccurred()) - }) - - AfterEach(func() { - By(fmt.Sprintf("Deleting workload cluster %q", clusterName)) - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: namespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - // verify addon resources are deleted successfully - By(fmt.Sprintf("Verify workload cluster %q resources have been deleted", clusterName)) - Eventually(func() bool { - return clusterResourcesDeleted(ctx, mngClient, clusterResources) - }, resourceDeletionWaitTimeout, pollingInterval).Should(BeTrue()) - - os.Remove(clusterConfigFile) - os.Remove(mngKubeConfigFile) - - By("Test successful !") - }) - - It("Should verify basic cluster lifecycle operations", func() { - By(fmt.Sprintf("Generating workload cluster configuration for cluster %q", clusterName)) - - err = tkgCtlClient.ConfigCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - Namespace: namespace, - }) - Expect(err).To(BeNil()) - - tkrVersionsSet, oldTKR, defaultTKR = getAvailableTKRs(ctx, mngProxy, input.E2EConfig.TkgConfigDir) - - if input.IsCustomCB { - clusterConfigFile, err = framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - err = exec.KubectlApplyWithArgs(ctx, mngKubeConfigFile, getCustomCBResourceFile(clusterName, namespace, defaultTKR.Name)) - Expect(err).To(BeNil()) - } - - By(fmt.Sprintf("Creating a workload cluster %q with TKR %q", clusterName, oldTKR.Spec.Version)) - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - Namespace: namespace, - TkrVersion: oldTKR.Spec.Version, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", clusterName)) - wlcKubeConfigFileName := clusterName + ".kubeconfig" - wlcKubeConfigFile := filepath.Join(os.TempDir(), wlcKubeConfigFileName) - err = tkgCtlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - ExportFile: wlcKubeConfigFile, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Waiting for workload cluster %q nodes to be up and running", clusterName)) - framework.WaitForNodes(framework.NewClusterProxy(clusterName, wlcKubeConfigFile, ""), 2) - - By(fmt.Sprintf("Get k8s client for workload cluster %q", clusterName)) - wlcClient, _, _, _, _, err = GetClients(ctx, wlcKubeConfigFile) - Expect(err).NotTo(HaveOccurred()) - - // verify addons are deployed successfully - By(fmt.Sprintf("Verify addon packages on management cluster %q matches clusterBootstrap info on management cluster %q", input.E2EConfig.ManagementClusterName, input.E2EConfig.ManagementClusterName)) - err = CheckClusterCB(ctx, mngClient, wlcClient, input.E2EConfig.ManagementClusterName, constants.TkgNamespace, "", "", infrastructureName, true, input.IsCustomCB) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Verify addon packages on workload cluster %q match clusterBootstrap info on management cluster %q", clusterName, input.E2EConfig.ManagementClusterName)) - err = CheckClusterCB(ctx, mngClient, wlcClient, input.E2EConfig.ManagementClusterName, constants.TkgNamespace, clusterName, namespace, infrastructureName, false, input.IsCustomCB) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Get management cluster resources created by addons-manager for workload cluster %q on management cluster %q", clusterName, input.E2EConfig.ManagementClusterName)) - clusterResources, err = GetManagementClusterResources(ctx, mngClient, mngDynamicClient, mngAggregatedAPIResourcesClient, mngDiscoveryClient, namespace, clusterName, infrastructureName) - Expect(err).NotTo(HaveOccurred()) - - By(fmt.Sprintf("Validating the kubernetes version after cluster %q is created", clusterName)) - validateKubernetesVersion(clusterName, oldTKR.Spec.Kubernetes.Version, wlcKubeConfigFile) - - By(fmt.Sprintf("Validating the TKR data after cluster %q is created", clusterName)) - verifyTKRData(ctx, mngProxy, options.ClusterName, options.Namespace) - - if input.DoUpgrade { - By(fmt.Sprintf("Validating the 'updatesAvailable' condition is true and lists upgradable TKR version")) - validateUpdatesAvailableCondition(ctx, mngProxy, options.ClusterName, options.Namespace, tkrVersionsSet) - - By(fmt.Sprintf("Upgrading workload cluster %q with TKR %q", clusterName, defaultTKR.Spec.Version)) - err = tkgCtlClient.UpgradeCluster(tkgctl.UpgradeClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - TkrVersion: defaultTKR.Spec.Version, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Validating the kubernetes version after cluster %q is upgraded", clusterName)) - validateKubernetesVersion(clusterName, defaultTKR.Spec.Kubernetes.Version, wlcKubeConfigFile) - - By(fmt.Sprintf("Validating the TKR data after cluster %q is upgraded", clusterName)) - verifyTKRData(ctx, mngProxy, options.ClusterName, options.Namespace) - - // verify addons are deployed successfully after cluster upgrade - By(fmt.Sprintf("Verify addon packages on workload cluster %q match clusterBootstrap info on management cluster %q after cluster upgrade", clusterName, input.E2EConfig.ManagementClusterName)) - err = CheckClusterCB(ctx, mngClient, wlcClient, input.E2EConfig.ManagementClusterName, constants.TkgNamespace, clusterName, namespace, infrastructureName, false, input.IsCustomCB) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Get management cluster resources created by addons-manager for workload cluster %q on management cluster %q", clusterName, input.E2EConfig.ManagementClusterName)) - clusterResources, err = GetManagementClusterResources(ctx, mngClient, mngDynamicClient, mngAggregatedAPIResourcesClient, mngDiscoveryClient, namespace, clusterName, infrastructureName) - Expect(err).NotTo(HaveOccurred()) - } - - By(fmt.Sprintf("Validating the management cluster %q versioned tkg-bom", input.E2EConfig.ManagementClusterName)) - verifyCCClusterVersionedTKGBOM(ctx, mngClient, getDefaultBomTKGVersion(input.E2EConfig.TkgConfigDir)) - - if input.CheckAdmissionWebhook { - checkAdmissionWebhooks(ctx, mngClient, admissionRegistrationClient) - } - }) -} - -// getCustomCBResourceFile return a manifest containing custom ClusterBootstrap and AntreaConfig -func getCustomCBResourceFile(clusterName, namespace string, tkrName string) []byte { - return []byte(fmt.Sprintf(customAntreaConfigAndCBResource, clusterName, namespace, "kube-system", clusterName, namespace, tkrName, clusterName, namespace, clusterName, clusterName)) -} - -func getAvailableTKRs(ctx context.Context, mcProxy *framework.ClusterProxy, tkgConfigDir string) (sets.StringSet, *runv1alpha3.TanzuKubernetesRelease, *runv1alpha3.TanzuKubernetesRelease) { - var ( - tkrs []*runv1alpha3.TanzuKubernetesRelease - defaultTKR, oldTKR *runv1alpha3.TanzuKubernetesRelease - ) - - tkgBOMConfigClient := tkgconfigbom.New(tkgConfigDir, nil) - defaultTKRVersion, err := tkgBOMConfigClient.GetDefaultTKRVersion() - Expect(err).ToNot(HaveOccurred(), "failed to get the default TKR version") - - Eventually(func() bool { - tkrs = mcProxy.GetTKRs(ctx) - defaultTKR, oldTKR = getTKRsForUpgrade(defaultTKRVersion, tkrs) - return defaultTKR != nil && oldTKR != nil - }, waitTimeout, pollingInterval).Should(BeTrue(), "failed to get at least 2 TKRs(upgradable) to perform upgrade tests") - tkrVersions := getTKRVersions(tkrs) - - return tkrVersions, oldTKR, defaultTKR -} - -func getDefaultBomTKGVersion(tkgConfigDir string) string { - tkgBOMConfigClient := tkgconfigbom.New(tkgConfigDir, nil) - return tkgBOMConfigClient.GetCurrentTKGVersion() -} - -func checkAdmissionWebhooks(ctx context.Context, mngClient client.Client, admissionRegistrationClient admissionregistrationv1.AdmissionregistrationV1Interface) { - caCert, err := getWebhookCACert(ctx, mngClient, webhookScrtName, systemNamespace) - Expect(err).NotTo(HaveOccurred()) - Expect(caCert).NotTo(BeEmpty()) - - labelMatch, err := labels.NewRequirement(webhookLabelKey, selection.Equals, []string{webhookLabelValue}) - Expect(err).ToNot(HaveOccurred()) - webhookSelectorString := labels.NewSelector().Add(*labelMatch).String() - - caCertExists, err := verifyCABundleInLabeledWebhooks(ctx, admissionRegistrationClient, webhookSelectorString, caCert) - Expect(err).ToNot(HaveOccurred()) - Expect(caCertExists).To(BeTrue()) -} diff --git a/tkg/test/tkgctl/shared/legacy_fallback.go b/tkg/test/tkgctl/shared/legacy_fallback.go deleted file mode 100644 index b6e8b0efab..0000000000 --- a/tkg/test/tkgctl/shared/legacy_fallback.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - "fmt" - "math/rand" - "os" - "path/filepath" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "sigs.k8s.io/cluster-api/util" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type E2ELegacyFallbackSpecInput struct { - E2EConfig *framework.E2EConfig - ArtifactsFolder string - Cni string - Plan string - Namespace string - OtherConfigs map[string]string -} - -func E2ELegacyFallbackSpec(context context.Context, inputGetter func() E2ELegacyFallbackSpecInput) { //nolint:funlen - var ( - err error - input E2ELegacyFallbackSpecInput - tkgCtlClient tkgctl.TKGClient - logsDir string - clusterName string - namespace string - suppressUpdate string - ) - const ( - SuppressUpdateEnvVar = "SUPPRESS_PROVIDER_UPDATE" - ) - - Context("When there are modifications in the provider overlays", func() { - BeforeEach(func() { //nolint:dupl - if os.Getenv("RUN_FULL_INTEG_TEST") != "1" { - Skip("Skip legacy fallback creation tests") - } - - namespace = constants.DefaultNamespace - input = inputGetter() - if input.Namespace != "" { - namespace = input.Namespace - } - - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - - rand.Seed(time.Now().UnixNano()) - clusterName = input.E2EConfig.ClusterPrefix + "wc-" + util.RandomString(4) // nolint:gomnd - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - Expect(err).To(BeNil()) - - suppressUpdate = os.Getenv(SuppressUpdateEnvVar) - os.Setenv(SuppressUpdateEnvVar, "1") - }) - - It("Should create legacy (non-clusterclassed-based) workload cluster", func() { - fileContent := `#@data/values -#! dummy values ---- -` - // simulate modifications in provider overlays - dummyDataValueFilePath := filepath.Join(input.E2EConfig.TkgConfigDir, "providers", "ytt", "dummy.yaml") - defer os.Remove(dummyDataValueFilePath) - err = os.WriteFile(dummyDataValueFilePath, []byte(fileContent), 0644) - Expect(err).To(BeNil()) - By(fmt.Sprintf("Injected dummy DV file %q to simulate client-side customization", dummyDataValueFilePath)) - - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - Plan: "dev", - CniType: input.Cni, - OtherConfigs: input.OtherConfigs, - } - - if input.Plan != "" { - options.Plan = input.Plan - } - - if input.E2EConfig.InfrastructureName == "vsphere" { - if clusterIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_LEGACY"); ok { - options.VsphereControlPlaneEndpoint = clusterIP - } - } - - clusterConfigFile, err := framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - defer os.Remove(clusterConfigFile) - - By(fmt.Sprintf("Generating workload cluster configuration for cluster %q", clusterName)) - err = tkgCtlClient.ConfigCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - Namespace: namespace, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Creating a workload cluster %q", clusterName)) - - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - Namespace: namespace, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", clusterName)) - kubeConfigFileName := clusterName + ".kubeconfig" - tempFilePath := filepath.Join(os.TempDir(), kubeConfigFileName) - err = tkgCtlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - ExportFile: tempFilePath, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Waiting for workload cluster %q nodes to be up and running", clusterName)) - framework.WaitForNodes(framework.NewClusterProxy(clusterName, tempFilePath, ""), 2) - - mcClusterName := input.E2EConfig.ManagementClusterName - mcContextName := mcClusterName + "-admin@" + mcClusterName - mcProxy := framework.NewClusterProxy(mcClusterName, "", mcContextName) - - clusterClass, errGetCC := framework.GetClusterClass(mcProxy, clusterName, namespace) - - By(fmt.Sprintf("Deleting workload cluster %q", clusterName)) - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: namespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - Expect(errGetCC).To(BeNil()) - Expect(clusterClass).To(Equal("")) - - By("Test successful !") - }) - - AfterEach(func() { - os.Setenv(SuppressUpdateEnvVar, suppressUpdate) - }) - }) -} diff --git a/tkg/test/tkgctl/shared/mhc.go b/tkg/test/tkgctl/shared/mhc.go deleted file mode 100644 index d534f3ee56..0000000000 --- a/tkg/test/tkgctl/shared/mhc.go +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - "errors" - "fmt" - "math/rand" - "path/filepath" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/patch" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type E2EMhcSpecInput struct { - E2EConfig *framework.E2EConfig - ArtifactsFolder string - Cni string -} - -func E2EMhcSpec(context context.Context, inputGetter func() E2EMhcSpecInput) { //nolint:funlen - var ( - input E2EMhcSpecInput - tkgCtlClient tkgctl.TKGClient - logsDir string - clusterName string - namespace string - - mcProxy *framework.ClusterProxy - wcProxy *framework.ClusterProxy - ) - - BeforeEach(func() { - var err error - namespace = constants.DefaultNamespace - input = inputGetter() - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - - mcClusterName := input.E2EConfig.ManagementClusterName - mcContextName := mcClusterName + "-admin@" + mcClusterName - mcProxy = framework.NewClusterProxy(mcClusterName, "", mcContextName) - - rand.Seed(time.Now().UnixNano()) - clusterName = input.E2EConfig.ClusterPrefix + "wc" - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", clusterName)) - err = tkgCtlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - }) - Expect(err).To(BeNil()) - - wcContextName := clusterName + "-admin@" + clusterName - wcProxy = framework.NewClusterProxy(clusterName, "", wcContextName) - }) - - It("mhc should remediate unhealthy machine", func() { - // Validate MHC - By(fmt.Sprintf("Getting MHC for cluster %q", clusterName)) - mhcList, err := tkgCtlClient.GetMachineHealthCheck(tkgctl.GetMachineHealthCheckOptions{ - ClusterName: clusterName, - MachineHealthCheckName: clusterName, - Namespace: namespace, - }) - Expect(err).ToNot(HaveOccurred()) - - Expect(len(mhcList)).To(Equal(1)) - mhc := mhcList[0] - Expect(mhc.Spec.ClusterName).To(Equal(clusterName)) - Expect(mhc.Name).To(Equal(clusterName)) - Expect(len(mhc.Spec.UnhealthyConditions)).To(Equal(2)) // nolint:gomnd - - // Delete MHC and verify if MHC is deleted - By(fmt.Sprintf("Deleting MHC for cluster %q", clusterName)) - if tkgCtlClient == nil { - _, _ = GinkgoWriter.Write([]byte("tkgCtlClient is nil")) - } - err = tkgCtlClient.DeleteMachineHealthCheck(tkgctl.DeleteMachineHealthCheckOptions{ - ClusterName: clusterName, - MachinehealthCheckName: clusterName, - Namespace: namespace, - SkipPrompt: true, - }) - Expect(err).ToNot(HaveOccurred()) - - mhcList, err = tkgCtlClient.GetMachineHealthCheck(tkgctl.GetMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: namespace, - MachineHealthCheckName: clusterName, - }) - Expect(err).ToNot(HaveOccurred()) - Expect(len(mhcList)).To(Equal(0)) - - // Set MHC and verify if it is set - By(fmt.Sprintf("Updating MHC for cluster %q", clusterName)) - err = tkgCtlClient.SetMachineHealthCheck(tkgctl.SetMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: namespace, - MachineHealthCheckName: clusterName, - UnhealthyConditions: fmt.Sprintf("%s:%s:%s", string(corev1.NodeReady), string(corev1.ConditionFalse), "5m"), - }) - Expect(err).ToNot(HaveOccurred()) - - // Wait for Target in MHC status to get the machine name - waitForMhcTarget(tkgCtlClient, clusterName, namespace) - mhcList, err = tkgCtlClient.GetMachineHealthCheck(tkgctl.GetMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: namespace, - MachineHealthCheckName: clusterName, - }) - Expect(err).ToNot(HaveOccurred()) - Expect(len(mhcList)).To(Equal(1)) - - mhc = mhcList[0] - Expect(mhc.Spec.ClusterName).To(Equal(clusterName)) - Expect(mhc.Name).To(Equal(clusterName)) - Expect(len(mhc.Spec.UnhealthyConditions)).To(Equal(1)) - - // Set machine to unhealthy and see if that machine is remediated - Expect(len(mhc.Status.Targets)).To(Equal(1)) - machine := mhc.Status.Targets[0] - By(fmt.Sprintf("Patching Node to make it fail the MHC %q", machine)) - _, _ = GinkgoWriter.Write([]byte(fmt.Sprintf("Context : %s \n", context))) - patchNodeUnhealthy(context, wcProxy, machine, "", mcProxy) - - By("Waiting for the Node to be remediated") - WaitForNodeRemediation(context, clusterName, "", mcProxy, wcProxy) - }) -} - -func getMhcListForCluster(context context.Context, p *framework.ClusterProxy, clusterName string, namespace string) *clusterv1.MachineHealthCheckList { - mhcList := &clusterv1.MachineHealthCheckList{} - client := p.GetClient() - err := client.List(context, mhcList, []crtclient.ListOption{ - crtclient.InNamespace(namespace), - crtclient.MatchingLabels{ - clusterv1.ClusterLabelName: clusterName, - }, - }...) - Expect(err).To(BeNil(), "error fetching mhc for cluster "+clusterName) - return mhcList -} - -func patchNodeUnhealthy(context context.Context, p *framework.ClusterProxy, nodeName string, namespace string, m *framework.ClusterProxy) { - client := p.GetClient() - node, err := getNode(context, nodeName, namespace, p, m) - Expect(err).ToNot(HaveOccurred()) - - patchHelper, err := patch.NewHelper(node, client) - Expect(err).ToNot(HaveOccurred()) - - for i := range node.Status.Conditions { - if node.Status.Conditions[i].Type == corev1.NodeReady { - node.Status.Conditions[i] = corev1.NodeCondition{ - Type: corev1.NodeReady, - Status: corev1.ConditionFalse, - LastTransitionTime: metav1.Time{Time: time.Now()}, - LastHeartbeatTime: metav1.Time{Time: time.Now()}, - } - } - } - - Expect(patchHelper.Patch(context, node)).To(Succeed()) -} - -func getNode(ctx context.Context, machineName string, namespace string, p *framework.ClusterProxy, m *framework.ClusterProxy) (*corev1.Node, error) { - client := p.GetClient() - mcClient := m.GetClient() - node := &corev1.Node{} - machine := &clusterv1.Machine{} - - _, _ = GinkgoWriter.Write([]byte(fmt.Sprintf("Searching for machine with name %s\n", machineName))) - err := mcClient.Get(ctx, types.NamespacedName{Name: machineName, Namespace: constants.DefaultNamespace}, machine) - if err != nil { - return node, err - } - - _, _ = GinkgoWriter.Write([]byte(fmt.Sprintf("Found machine with name %s\n", machineName))) - _, _ = GinkgoWriter.Write([]byte("Details: \n")) - - nodeName := machine.Status.NodeRef.Name - _, _ = GinkgoWriter.Write([]byte(fmt.Sprintf("Name of node : %s\n", nodeName))) - if nodeName == "" { - return node, errors.New("no node name present in machine status") - } - - if nodeName != "" { - err = client.Get(ctx, types.NamespacedName{Name: nodeName, Namespace: namespace}, node) - } - - return node, err -} - -func waitForMhcTarget(tkgctlClient tkgctl.TKGClient, clusterName string, namespace string) { - Eventually(func() bool { - _, _ = GinkgoWriter.Write([]byte("Waiting for target in MHC status\n")) - mhcList, err := tkgctlClient.GetMachineHealthCheck(tkgctl.GetMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: namespace, - MachineHealthCheckName: clusterName, - }) - - Expect(err).ToNot(HaveOccurred()) - Expect(len(mhcList)).To(Equal(1)) - - mhc := mhcList[0] - Expect(mhc.Spec.ClusterName).To(Equal(clusterName)) - Expect(mhc.Name).To(Equal(clusterName)) - Expect(len(mhc.Spec.UnhealthyConditions)).To(Equal(1)) - - return len(mhc.Status.Targets) == 1 - }, "10m", "30s").Should(BeTrue()) -} - -func WaitForNodeRemediation(ctx context.Context, clusterName string, namespace string, mcProxy *framework.ClusterProxy, wcProxy *framework.ClusterProxy) { - Eventually(func() bool { - _, _ = GinkgoWriter.Write([]byte("Waiting until the unhealthy node is remediated\n")) - mhcList := getMhcListForCluster(ctx, mcProxy, clusterName, namespace) - Expect(len(mhcList.Items)).To(Equal(2)) - mhc := mhcList.Items[0] - - for _, nodeName := range mhc.Status.Targets { - node, err := getNode(ctx, nodeName, namespace, wcProxy, mcProxy) - if err != nil && apierrors.IsNotFound(err) { - continue - } - - if err != nil { - Fail(err.Error()) - } - - for _, condition := range node.Status.Conditions { - if condition.Type == corev1.NodeReady && condition.Status == corev1.ConditionFalse { - _, _ = GinkgoWriter.Write([]byte(fmt.Sprintf("Node %s - %s:%s\n", node.Name, string(condition.Type), string(condition.Status)))) - return false - } - } - } - - return true - }, "10m", "30s").Should(BeTrue()) -} diff --git a/tkg/test/tkgctl/shared/mhc_cc.go b/tkg/test/tkgctl/shared/mhc_cc.go deleted file mode 100644 index 85569f9d8c..0000000000 --- a/tkg/test/tkgctl/shared/mhc_cc.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - "fmt" - "math/rand" - "os" - "path/filepath" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -func E2EMhcCCSpec(context context.Context, inputGetter func() E2ECommonSpecInput) { //nolint:funlen - var ( - input E2ECommonSpecInput - tkgCtlClient tkgctl.TKGClient - tkgCtlClient2 tkgctl.TKGClient - logsDir string - clusterName string - namespace string - - mcProxy *framework.ClusterProxy - wcProxy *framework.ClusterProxy - ) - - BeforeEach(func() { - var err error - namespace = input.Namespace - input = inputGetter() - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - - mcClusterName := input.E2EConfig.ManagementClusterName - mcContextName := mcClusterName + "-admin@" + mcClusterName - mcProxy = framework.NewClusterProxy(mcClusterName, "", mcContextName) - - rand.Seed(time.Now().UnixNano()) - clusterName = input.E2EConfig.ClusterPrefix + "wc" - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Creating a workload cluster %q", clusterName)) - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - Plan: input.Plan, - CniType: input.Cni, - } - - if input.E2EConfig.InfrastructureName == "vsphere" { - if endpointIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_2"); ok { - options.VsphereControlPlaneEndpoint = endpointIP - } - } - - clusterConfigFile, err := framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - - defer os.Remove(clusterConfigFile) - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - // Create a new client to prevent it from reusing in memory configs of the old client - tkgCtlClient2, _ = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", clusterName)) - err = tkgCtlClient2.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - ExportFile: "", - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Waiting for workload cluster %q nodes to be up and running", clusterName)) - contextName := clusterName + "-admin@" + clusterName - framework.WaitForNodes(framework.NewClusterProxy(clusterName, "", contextName), 2) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", clusterName)) - err = tkgCtlClient2.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - }) - Expect(err).To(BeNil()) - - wcContextName := clusterName + "-admin@" + clusterName - wcProxy = framework.NewClusterProxy(clusterName, "", wcContextName) - }) - - It("mhc should remediate unhealthy machine", func() { - // Validate MHC - By(fmt.Sprintf("Getting MHC for cluster %q", clusterName)) - mhcList, err := tkgCtlClient2.GetMachineHealthCheck(tkgctl.GetMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: namespace, - }) - Expect(err).ToNot(HaveOccurred()) - - Expect(len(mhcList)).To(Equal(2)) - mhc := mhcList[0] - Expect(mhc.Spec.ClusterName).To(Equal(clusterName)) - Expect(len(mhc.Spec.UnhealthyConditions)).To(Equal(2)) // nolint:gomnd - - // Delete MHC and verify if MHC is deleted - By(fmt.Sprintf("Deleting MHC for cluster %q", clusterName)) - if tkgCtlClient2 == nil { - _, _ = GinkgoWriter.Write([]byte("tkgCtlClient is nil")) - } - err = tkgCtlClient2.DeleteMachineHealthCheck(tkgctl.DeleteMachineHealthCheckOptions{ - ClusterName: clusterName, - MachinehealthCheckName: mhc.Name, - Namespace: namespace, - SkipPrompt: true, - }) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("deleting machine health checks on clusterclass based clusters is not supported")) - - // Set MHC and verify if it is set - By(fmt.Sprintf("Updating MHC for cluster %q", clusterName)) - err = tkgCtlClient2.SetMachineHealthCheck(tkgctl.SetMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: namespace, - MachineHealthCheckName: mhc.Name, - UnhealthyConditions: fmt.Sprintf("%s:%s:%s", string(corev1.NodeReady), string(corev1.ConditionFalse), "5m"), - }) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("setting machine health checks on clusterclass based clusters is not supported")) - - mhcList, err = tkgCtlClient2.GetMachineHealthCheck(tkgctl.GetMachineHealthCheckOptions{ - ClusterName: clusterName, - Namespace: namespace, - }) - Expect(err).ToNot(HaveOccurred()) - Expect(len(mhcList)).To(Equal(2)) - - mhc = mhcList[0] - Expect(mhc.Spec.ClusterName).To(Equal(clusterName)) - Expect(len(mhc.Spec.UnhealthyConditions)).To(Equal(2)) - - // Set machine to unhealthy and see if that machine is remediated - Expect(len(mhc.Status.Targets)).To(Equal(1)) - machine := mhc.Status.Targets[0] - By(fmt.Sprintf("Patching Node to make it fail the MHC %q", machine)) - _, _ = GinkgoWriter.Write([]byte(fmt.Sprintf("Context : %s \n", context))) - patchNodeUnhealthy(context, wcProxy, machine, "", mcProxy) - - By("Waiting for the Node to be remediated") - WaitForNodeRemediation(context, clusterName, "", mcProxy, wcProxy) - }) - - AfterEach(func() { - err := tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: namespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - }) -} diff --git a/tkg/test/tkgctl/shared/node_pools.go b/tkg/test/tkgctl/shared/node_pools.go deleted file mode 100644 index 99b44a4541..0000000000 --- a/tkg/test/tkgctl/shared/node_pools.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package shared - -import ( - "context" - "fmt" - "math/rand" - "os" - "path/filepath" - "strings" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "sigs.k8s.io/cluster-api/util" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type E2ENodePoolSpecInput struct { - E2ECommonSpecInput - NodePool client.NodePool -} - -func E2ENodePoolSpec(context context.Context, inputGetter func() E2ENodePoolSpecInput) { - var ( - err error - input E2ENodePoolSpecInput - tkgCtlClient tkgctl.TKGClient - logsDir string - clusterName string - namespace string - expectedNodes int - ) - - BeforeEach(func() { //nolint:dupl - input = inputGetter() - namespace = input.Namespace - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - - rand.Seed(time.Now().UnixNano()) - clusterName = input.E2EConfig.ClusterPrefix + "wc-" + util.RandomString(4) // nolint:gomnd - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - KubeConfig: input.E2EConfig.TKGSKubeconfigPath, - KubeContext: input.E2EConfig.TKGSKubeconfigContext, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - Expect(err).To(BeNil()) - }) - - It("exercise node-pool functionality", func() { - By(fmt.Sprintf("Creating a workload cluster %q", clusterName)) - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - Plan: input.Plan, - CniType: input.Cni, - } - - if input.E2EConfig.InfrastructureName == "vsphere" { - if endpointIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_2"); ok { - options.VsphereControlPlaneEndpoint = endpointIP - } - } - - var clusterConfigFile string - if input.E2EConfig.WorkloadClusterOptions.InfrastructureProvider == "tkg-service-vsphere" { - clusterConfigFile = input.E2EConfig.WorkloadClusterOptions.ClusterClassFilePath - } else { - clusterConfigFile, err = framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - defer os.Remove(clusterConfigFile) - } - - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - // Create a new client to prevent it from reusing in memory configs of the old client - tkgCtlClient2, _ := tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", clusterName)) - err = tkgCtlClient2.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - ExportFile: "", - }) - Expect(err).To(BeNil()) - - if strings.Contains(input.Plan, "prod") { - expectedNodes = 6 - } else { - expectedNodes = 2 - } - - By(fmt.Sprintf("Waiting for workload cluster %q nodes to be up and running", clusterName)) - contextName := clusterName + "-admin@" + clusterName - framework.WaitForNodes(framework.NewClusterProxy(clusterName, "", contextName), expectedNodes) - - if input.NodePool.Replicas == nil { - input.NodePool.Replicas = func(i int32) *int32 { return &i }(1) - } - By(fmt.Sprintf("Creating new node pool %q on cluster %q", input.NodePool.Name, clusterName)) - err = tkgCtlClient2.SetMachineDeployment(&client.SetMachineDeploymentOptions{ - ClusterName: clusterName, - Namespace: namespace, - NodePool: input.NodePool, - }) - Expect(err).To(BeNil()) - - if input.NodePool.Replicas != nil { - expectedNodes += int(*input.NodePool.Replicas) - } - framework.WaitForNodes(framework.NewClusterProxy(clusterName, "", contextName), expectedNodes) - - By(fmt.Sprintf("Updating node pool %q on cluster %q", input.NodePool.Name, clusterName)) - - input.NodePool.Replicas = func(i int32) *int32 { return &i }(*input.NodePool.Replicas + int32(1)) - input.NodePool.BaseMachineDeployment = "" - err = tkgCtlClient2.SetMachineDeployment(&client.SetMachineDeploymentOptions{ - ClusterName: clusterName, - Namespace: namespace, - NodePool: input.NodePool, - }) - Expect(err).To(BeNil()) - expectedNodes += 1 - framework.WaitForNodes(framework.NewClusterProxy(clusterName, "", contextName), expectedNodes) - - By(fmt.Sprintf("Deleting node pool %q on cluster %q", input.NodePool.Name, clusterName)) - err = tkgCtlClient2.DeleteMachineDeployment(client.DeleteMachineDeploymentOptions{ - ClusterName: clusterName, - Namespace: namespace, - Name: input.NodePool.Name, - }) - Expect(err).To(BeNil()) - - expectedNodes -= int(*input.NodePool.Replicas) - framework.WaitForNodes(framework.NewClusterProxy(clusterName, "", contextName), expectedNodes) - }) - - AfterEach(func() { - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: namespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - }) -} diff --git a/tkg/test/tkgctl/shared/package.go b/tkg/test/tkgctl/shared/package.go deleted file mode 100644 index 7b21d07964..0000000000 --- a/tkg/test/tkgctl/shared/package.go +++ /dev/null @@ -1,722 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package shared - -import ( - "context" - "encoding/json" - "fmt" - "os" - "path/filepath" - "reflect" - "strings" - "time" - - "golang.org/x/text/cases" - "golang.org/x/text/language" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/discovery" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - admissionregistrationv1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1" - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - capvvmwarev1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/vmware/v1beta1" - controlplanev1beta1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" - controllerruntimescheme "sigs.k8s.io/controller-runtime/pkg/scheme" - - kapppkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - runtanzuv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/kubernetes" - restclient "k8s.io/client-go/rest" - clusterapiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/tools/clientcmd" - "sigs.k8s.io/controller-runtime/pkg/client" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - kappctrl "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/kappctrl/v1alpha1" - kapppkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kapppkgiv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1" - kappdatapkg "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - - runtanzuv1alpha3 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -const ( - getResourceTimeout = time.Minute * 1 - waitForReadyTimeout = time.Minute * 10 - waitTimeout = time.Minute * 10 - resourceDeletionWaitTimeout = time.Minute * 20 - pollingInterval = time.Second * 30 - - AddonFinalizer = "tkg.tanzu.vmware.com/addon" - PreTerminateAddonsAnnotationPrefix = clusterapiv1beta1.PreTerminateDeleteHookAnnotationPrefix + "/tkg.tanzu.vmware.com" - PreTerminateAddonsAnnotationValue = "tkg.tanzu.vmware.com/addons" -) - -func getRestConfig(exportFile string, scheme *runtime.Scheme) (*restclient.Config, error) { - config, err := clientcmd.LoadFromFile(exportFile) - Expect(err).ToNot(HaveOccurred(), "Failed to load cluster Kubeconfig file from %q", exportFile) - - rawConfig, err := clientcmd.Write(*config) - Expect(err).ToNot(HaveOccurred(), "Failed to create raw config ") - - restConfig, err := clientcmd.RESTConfigFromKubeConfig(rawConfig) - Expect(err).ToNot(HaveOccurred(), "Failed to create rest config ") - - return restConfig, nil -} - -// create cluster client from kubeconfig -func createClientFromKubeconfig(exportFile string, scheme *runtime.Scheme) (client.Client, error) { - restConfig, err := getRestConfig(exportFile, scheme) - Expect(err).NotTo(HaveOccurred(), "Failed to get rest config") - - client, err := client.New(restConfig, client.Options{Scheme: scheme}) - Expect(err).ToNot(HaveOccurred(), "Failed to create a cluster client") - - return client, nil -} - -// GetClients gets the various kubernetes clients -func GetClients(ctx context.Context, exportFile string) (k8sClient client.Client, dynamicClient dynamic.Interface, aggregatedAPIResourcesClient client.Client, discoveryClient discovery.DiscoveryInterface, admissionRegistrationClient admissionregistrationv1.AdmissionregistrationV1Interface, err error) { - scheme := runtime.NewScheme() - - _ = clientgoscheme.AddToScheme(scheme) - _ = kappctrl.AddToScheme(scheme) - _ = kapppkg.AddToScheme(scheme) - _ = kappdatapkg.AddToScheme(scheme) - _ = runtanzuv1alpha1.AddToScheme(scheme) - _ = clusterapiv1beta1.AddToScheme(scheme) - _ = controlplanev1beta1.AddToScheme(scheme) - _ = runtanzuv1alpha3.AddToScheme(scheme) - // The below schemes are added directly to avoid referring to apis/cni, apis/cpi in tanzu-framework that introduces some build issues - _ = (&controllerruntimescheme.Builder{GroupVersion: schema.GroupVersion{Group: "cni.tanzu.vmware.com", Version: "v1alpha1"}}).AddToScheme(scheme) - _ = (&controllerruntimescheme.Builder{GroupVersion: schema.GroupVersion{Group: "cpi.tanzu.vmware.com", Version: "v1alpha1"}}).AddToScheme(scheme) - _ = (&controllerruntimescheme.Builder{GroupVersion: schema.GroupVersion{Group: "csi.tanzu.vmware.com", Version: "v1alpha1"}}).AddToScheme(scheme) - _ = capvv1beta1.AddToScheme(scheme) - _ = capvvmwarev1beta1.AddToScheme(scheme) - - k8sClient, err = createClientFromKubeconfig(exportFile, scheme) - Expect(err).ToNot(HaveOccurred(), "Failed to create management cluster client") - - restConfig, err := getRestConfig(exportFile, scheme) - Expect(err).NotTo(HaveOccurred()) - - dynamicClient, err = dynamic.NewForConfig(restConfig) - Expect(err).NotTo(HaveOccurred()) - - clientset := kubernetes.NewForConfigOrDie(restConfig) - discoveryClient = clientset.DiscoveryClient - admissionRegistrationClient = clientset.AdmissionregistrationV1() - - aggregatedAPIResourcesClient, err = client.New(restConfig, client.Options{Scheme: scheme}) - Expect(err).NotTo(HaveOccurred()) - - return -} - -// getPackagesFromCB gets the list of packages from CB that are supposed to be installed on a cluster -func getPackagesFromCB(ctx context.Context, clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, mccl, wccl client.Client, mcClusterName, mcClusterNamespace, wcClusterName, wcClusterNamespace, infrastructureName string, isManagementCluster bool) ([]kapppkgv1alpha1.Package, error) { - var packages []kapppkgv1alpha1.Package - - systemNamespace := constants.TkgNamespace - if infrastructureName == "tkgs" { - systemNamespace = constants.TKGSClusterClassNamespace - } - - // verify cni package is installed on the workload cluster - cniPkgShortName, cniPkgName, cniPkgVersion := getPackageDetailsFromCBS(clusterBootstrap.Spec.CNI.RefName) - packages = append(packages, kapppkgv1alpha1.Package{ObjectMeta: metav1.ObjectMeta{Name: cniPkgShortName, Namespace: systemNamespace}, - Spec: kapppkgv1alpha1.PackageSpec{RefName: cniPkgName, Version: cniPkgVersion}}) - - if !isManagementCluster { - kappPkgShortName, kappPkgName, kappPkgVersion := getPackageDetailsFromCBS(clusterBootstrap.Spec.Kapp.RefName) - packages = append(packages, kapppkgv1alpha1.Package{ObjectMeta: metav1.ObjectMeta{Name: kappPkgShortName, Namespace: wcClusterNamespace}, - Spec: kapppkgv1alpha1.PackageSpec{RefName: kappPkgName, Version: kappPkgVersion}}) - } - - if infrastructureName == "vsphere" || infrastructureName == "tkgs" { - csiPkgShortName, csiPkgName, csiPkgVersion := getPackageDetailsFromCBS(clusterBootstrap.Spec.CSI.RefName) - packages = append(packages, kapppkgv1alpha1.Package{ObjectMeta: metav1.ObjectMeta{Name: csiPkgShortName, Namespace: systemNamespace}, - Spec: kapppkgv1alpha1.PackageSpec{RefName: csiPkgName, Version: csiPkgVersion}}) - - cpiPkgShortName, cpiPkgName, cpiPkgVersion := getPackageDetailsFromCBS(clusterBootstrap.Spec.CPI.RefName) - packages = append(packages, kapppkgv1alpha1.Package{ObjectMeta: metav1.ObjectMeta{Name: cpiPkgShortName, Namespace: systemNamespace}, - Spec: kapppkgv1alpha1.PackageSpec{RefName: cpiPkgName, Version: cpiPkgVersion}}) - } - - if clusterBootstrap.Spec.AdditionalPackages != nil { - // validate additional packages - for _, additionalPkg := range clusterBootstrap.Spec.AdditionalPackages { - pkgShortName, pkgName, pkgVersion := getPackageDetailsFromCBS(additionalPkg.RefName) - - // TODO: temporarily skip verifying azurediskcsi-driver due to install failure issue. - // this should be removed once the issue is resolved. - if strings.Contains(pkgShortName, "azurefile-csi-driver") { - continue - } - packages = append(packages, kapppkgv1alpha1.Package{ObjectMeta: metav1.ObjectMeta{Name: pkgShortName, Namespace: systemNamespace}, - Spec: kapppkgv1alpha1.PackageSpec{RefName: pkgName, Version: pkgVersion}}) - } - } - - return packages, nil -} - -// CheckClusterCB checks if clusterbootstrap resource is created correctly and packages are reconciled successfully on cluster -func CheckClusterCB(ctx context.Context, mccl, wccl client.Client, mcClusterName, mcClusterNamespace, wcClusterName, wcClusterNamespace, infrastructureName string, isManagementCluster, isCustomCB bool) error { - log.Infof("Verify addons on workload cluster %s with management cluster %s", wcClusterName, mcClusterName) - - var clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap - - systemNamespace := constants.TkgNamespace - if infrastructureName == "tkgs" { - systemNamespace = constants.TKGSClusterClassNamespace - } - - if isManagementCluster { - clusterBootstrap = getClusterBootstrap(ctx, mccl, mcClusterNamespace, mcClusterName) - } else { - clusterBootstrap = getClusterBootstrap(ctx, mccl, wcClusterNamespace, wcClusterName) - } - - By(fmt.Sprintf("Verify clusterbootstrap matches clusterbootstraptemplate")) - verifyClusterBootstrap(ctx, mccl, clusterBootstrap, clusterBootstrap.Status.ResolvedTKR, systemNamespace, isManagementCluster, isCustomCB) - - packages, err := getPackagesFromCB(ctx, clusterBootstrap, mccl, wccl, mcClusterName, mcClusterNamespace, wcClusterName, wcClusterNamespace, infrastructureName, isManagementCluster) - Expect(err).NotTo(HaveOccurred()) - - var ( - client client.Client - clusterName, clusterType string - ) - - if isManagementCluster { - client = mccl - clusterName = mcClusterName - clusterType = "management" - } else { - client = wccl - clusterName = wcClusterName - clusterType = "workload" - } - - for _, pkg := range packages { - if strings.Contains(pkg.Name, "kapp-controller") { - verifyPackageInstall(ctx, mccl, pkg.Namespace, GeneratePackageInstallName(clusterName, pkg.Name), pkg.Spec.RefName, pkg.Spec.Version) - } else { - // TODO: Verify the capabilities package install when it is fixed to reconcile - if infrastructureName != "tkgs" || pkg.Name != "capabilities" { - verifyPackageInstall(ctx, client, pkg.Namespace, GeneratePackageInstallName(clusterName, pkg.Name), pkg.Spec.RefName, pkg.Spec.Version) - } - } - } - - By(fmt.Sprintf("Verify addon packages on %q cluster %q status is reflected correctly in clusterBootstrap status", clusterType, clusterName)) - verifyPackageInstallStatusinClusterBootstrapStatus(ctx, mccl, mcClusterName, mcClusterNamespace, wcClusterName, wcClusterNamespace, infrastructureName, isManagementCluster, packages) - - // For Management cluster we dont expect the finalizers and hooks to be present. So check only for workload cluster - if !isManagementCluster { - By(fmt.Sprintf("Verify addon finalizers and machine termination hooks for %q cluster %q is set correctly", clusterType, clusterName)) - verifyFinalizersAndMachineHooks(ctx, mccl, wcClusterName, wcClusterNamespace) - } - - return nil -} - -// verifyClusterBootstrap checks if cluster bootstrap is created as expected i.e. it is cloned correctly from ClusterBootstrapTemplate -func verifyClusterBootstrap(ctx context.Context, c client.Client, clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap, tkrName string, systemNamespace string, isManagementCluster, isCustomCB bool) { - resolvedTKr := clusterBootstrap.Status.ResolvedTKR - Expect(resolvedTKr).NotTo(BeEmpty()) - - clusterBootstrapTemplate := getClusterBootstrapTemplate(ctx, c, resolvedTKr, systemNamespace) - - expectedClusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - expectedClusterBootstrap.Spec = clusterBootstrapTemplate.Spec.DeepCopy() - - var packages []*runtanzuv1alpha3.ClusterBootstrapPackage - packages = append(packages, expectedClusterBootstrap.Spec.Kapp, expectedClusterBootstrap.Spec.CNI) - - if expectedClusterBootstrap.Spec.CPI != nil { - packages = append(packages, expectedClusterBootstrap.Spec.CPI) - } - - if expectedClusterBootstrap.Spec.CSI != nil { - packages = append(packages, expectedClusterBootstrap.Spec.CSI) - } - - packages = append(packages, expectedClusterBootstrap.Spec.AdditionalPackages...) - - for _, pkg := range packages { - pkgShortName, _, _ := getPackageDetailsFromCBS(pkg.RefName) - if pkg.ValuesFrom != nil { - if pkg.ValuesFrom.SecretRef != "" { - pkg.ValuesFrom.SecretRef = GeneratePackageSecretName(clusterBootstrap.Name, pkgShortName) - } else if pkg.ValuesFrom.ProviderRef != nil { - pkg.ValuesFrom.ProviderRef.Name = GeneratePackageSecretName(clusterBootstrap.Name, pkgShortName) - } - } - - // guest-cluster-auth-service needs to be handled explicitly as they are different for CBT and custom CB - if strings.Contains(pkg.RefName, "guest-cluster-auth-service") { - if pkg.ValuesFrom == nil { - pkg.ValuesFrom = &runtanzuv1alpha3.ValuesFrom{ - SecretRef: GenerateDataValueSecretName(clusterBootstrap.Name, pkgShortName), - } - } - } - - // custom CB needs to have package names the same as the cluster name, so this will not match the expected providerRef name - // any package specified in the custom CB manifest will have to be special-cased - // so, handling this currently for antrea for the custom CB test case - if !isManagementCluster && isCustomCB && (strings.Contains(pkg.RefName, "antrea") || strings.Contains(pkg.RefName, "aws-ebs-csi-driver")) { - pkg.ValuesFrom.ProviderRef.Name = clusterBootstrap.Name - } - - // storageclass needs special handling - if strings.Contains(pkg.RefName, "tkg-storageclass") { - for _, bootstrapPkg := range clusterBootstrap.Spec.AdditionalPackages { - if strings.Contains(bootstrapPkg.RefName, "tkg-storageclass") { - pkg.ValuesFrom = bootstrapPkg.ValuesFrom - } - } - } - } - - // Calico needs special handling - if strings.Contains(clusterBootstrap.Spec.CNI.RefName, "calico") { - tkr := getTKr(ctx, c, tkrName) - expectedClusterBootstrap.Spec.CNI.RefName = "" - for _, bootstrapPkg := range tkr.Spec.BootstrapPackages { - if strings.Contains(bootstrapPkg.Name, "calico") { - expectedClusterBootstrap.Spec.CNI.RefName = bootstrapPkg.Name - break - } - } - Expect(expectedClusterBootstrap.Spec.CNI.RefName).NotTo(BeEmpty()) - apiGroup := "cni.tanzu.vmware.com" - expectedClusterBootstrap.Spec.CNI.ValuesFrom.ProviderRef = &corev1.TypedLocalObjectReference{ - APIGroup: &apiGroup, - Kind: "CalicoConfig", - Name: clusterBootstrap.Name, - } - } - - clusterBootstrapSpecJson, _ := json.MarshalIndent(clusterBootstrap.Spec, "", "\t") - expectedClusterBootstrapSpecJson, _ := json.MarshalIndent(expectedClusterBootstrap.Spec, "", "\t") - log.Infof("Cluster bootstrap: %v", string(clusterBootstrapSpecJson)) - log.Infof("Expected cluster bootstrap: %v", string(expectedClusterBootstrapSpecJson)) - - Expect(clusterBootstrap.Spec).To(BeEquivalentTo(expectedClusterBootstrap.Spec), "Clusterbootstrap should match clusterbootstraptemplate") -} - -// verifyPackageInstall verifies if package is reconciled successfully on the cluster -func verifyPackageInstall(ctx context.Context, c client.Client, namespace, pkgInstallName, pkgName, pkgVersion string) { - log.Infof("Check PackageInstall %s for package %s of version %s", pkgInstallName, pkgName, pkgVersion) - - // verify the package is successfully deployed and its name and version match with the clusterBootstrap CR - pkgInstall := &kapppkgiv1alpha1.PackageInstall{} - objKey := client.ObjectKey{Namespace: namespace, Name: pkgInstallName} - Eventually(func() bool { - if err := c.Get(ctx, objKey, pkgInstall); err != nil { - return false - } - if len(pkgInstall.Status.GenericStatus.Conditions) == 0 { - return false - } - if pkgInstall.Status.GenericStatus.Conditions[0].Type != kappctrl.ReconcileSucceeded { - return false - } - if pkgInstall.Status.GenericStatus.Conditions[0].Status != corev1.ConditionTrue { - return false - } - if pkgInstall.Spec.PackageRef.RefName != pkgName { - return false - } - if pkgInstall.Spec.PackageRef.VersionSelection.Constraints != pkgVersion { - return false - } - return true - }, waitForReadyTimeout, pollingInterval).Should(BeTrue(), "Package %s is not deployed successfully", pkgName) -} - -// verifyPackageInstallStatusinClusterBootstrapStatus verifies if package install status is synced correctly to ClusterBootstrap status -func verifyPackageInstallStatusinClusterBootstrapStatus(ctx context.Context, mccl client.Client, mcClusterName, mcClusterNamespace, wcClusterName, wcClusterNamespace string, infrastructureName string, isManagementCluster bool, packages []kapppkgv1alpha1.Package) { - Eventually(func() bool { - var ( - clusterBootstrap *runtanzuv1alpha3.ClusterBootstrap - pkgConditionSuccess int - ) - if isManagementCluster { - clusterBootstrap = getClusterBootstrap(ctx, mccl, mcClusterNamespace, mcClusterName) - } else { - clusterBootstrap = getClusterBootstrap(ctx, mccl, wcClusterNamespace, wcClusterName) - } - - for _, pkg := range packages { - log.Infof("Check Package %q status in clusterbootstrap status", pkg.Name) - // TODO: temporarily skip verifying storageclass due to install failure issue. - // this should be removed once the issue is resolved. - if strings.Contains(pkg.Name, "storageclass") { - pkgConditionSuccess = pkgConditionSuccess + 1 - continue - } - // TODO: Temporarily skip verifying capabilities package install for tkgs cluster - // this needs to removed once the issue is resolved - if infrastructureName == "tkgs" && pkg.Name == "capabilities" { - pkgConditionSuccess = pkgConditionSuccess + 1 - continue - } - - var conditionFound bool - for _, condition := range clusterBootstrap.GetConditions() { - if strings.Contains(string(condition.Type), cases.Title(language.Und).String(pkg.Name)) { - if string(condition.Type) == fmt.Sprintf("%s-%s", cases.Title(language.Und).String(pkg.Name), kappctrl.ReconcileSucceeded) && - condition.Status == corev1.ConditionTrue { - pkgConditionSuccess = pkgConditionSuccess + 1 - } else { - log.Infof("Package %q condition failed. condition type: %q, status: %q, message: %q, reason: %q", pkg.Name, condition.Type, condition.Status, condition.Message, condition.Reason) - } - conditionFound = true - break - } - } - if !conditionFound { - log.Infof("Package %q is not found in clusterbootstrap condition", pkg.Name) - } - } - - if len(packages) == pkgConditionSuccess { - return true - } - - return false - }, waitForReadyTimeout, pollingInterval).Should(BeTrue(), "Packages install status failed in clusterbootstrap status") -} - -// verifyFinalizersAndMachineHooks verifies if package install status is synced correctly to ClusterBootstrap status -func verifyFinalizersAndMachineHooks(ctx context.Context, mccl client.Client, wcClusterName, wcClusterNamespace string) { - clusterName := wcClusterName - clusterNamespace := wcClusterNamespace - - cb := getClusterBootstrap(ctx, mccl, clusterNamespace, clusterName) - Expect(cb.Finalizers).To(ContainElement(AddonFinalizer)) - - cluster := getCluster(ctx, mccl, clusterNamespace, clusterName) - Expect(cluster.Finalizers).To(ContainElement(AddonFinalizer)) - - clusterKubeconfig := getClusterKubeconfig(ctx, mccl, clusterNamespace, clusterName) - Expect(clusterKubeconfig.Finalizers).To(ContainElement(AddonFinalizer)) - - machines := getClusterMachines(ctx, mccl, clusterNamespace, clusterName) - for _, machine := range machines.Items { - Expect(machine.Annotations).Should(HaveKeyWithValue(PreTerminateAddonsAnnotationPrefix, PreTerminateAddonsAnnotationValue)) - } -} - -func getPackageDetailsFromCBS(CBSRefName string) (pkgShortName, pkgName, pkgVersion string) { - pkgShortName = strings.Split(CBSRefName, ".")[0] - pkgName = strings.Join(strings.Split(CBSRefName, ".")[0:4], ".") - pkgVersion = strings.Join(strings.Split(CBSRefName, ".")[4:], ".") - return -} - -func getClusterBootstrapTemplate(ctx context.Context, k8sClient client.Client, tkrName string, systemNamespace string) *runtanzuv1alpha3.ClusterBootstrapTemplate { - var objKey client.ObjectKey - - clusterBootstrapTemplate := &runtanzuv1alpha3.ClusterBootstrapTemplate{} - objKey = client.ObjectKey{Name: tkrName, Namespace: systemNamespace} - - Eventually(func() error { - return k8sClient.Get(ctx, objKey, clusterBootstrapTemplate) - }, getResourceTimeout, pollingInterval).Should(Succeed()) - - Expect(clusterBootstrapTemplate).NotTo(BeNil()) - return clusterBootstrapTemplate -} - -func getClusterBootstrap(ctx context.Context, k8sClient client.Client, namespace, clusterName string) *runtanzuv1alpha3.ClusterBootstrap { - clusterBootstrap := &runtanzuv1alpha3.ClusterBootstrap{} - objKey := client.ObjectKey{Namespace: namespace, Name: clusterName} - - Eventually(func() error { - return k8sClient.Get(ctx, objKey, clusterBootstrap) - }, getResourceTimeout, pollingInterval).Should(Succeed()) - - Expect(clusterBootstrap).ShouldNot(BeNil()) - return clusterBootstrap -} - -func getCluster(ctx context.Context, k8sClient client.Client, namespace, clusterName string) *clusterapiv1beta1.Cluster { - cluster := &clusterapiv1beta1.Cluster{} - objKey := client.ObjectKey{Namespace: namespace, Name: clusterName} - - Eventually(func() error { - return k8sClient.Get(ctx, objKey, cluster) - }, getResourceTimeout, pollingInterval).Should(Succeed()) - - Expect(cluster).ShouldNot(BeNil()) - return cluster -} - -func getClusterKubeconfig(ctx context.Context, k8sClient client.Client, namespace, clusterName string) *corev1.Secret { - secret := &corev1.Secret{} - clusterKubeconfigName := fmt.Sprintf("%s-kubeconfig", clusterName) - objKey := client.ObjectKey{Namespace: namespace, Name: clusterKubeconfigName} - - Eventually(func() error { - return k8sClient.Get(ctx, objKey, secret) - }, getResourceTimeout, pollingInterval).Should(Succeed()) - - Expect(secret).ShouldNot(BeNil()) - return secret -} - -func getClusterMachines(ctx context.Context, k8sClient client.Client, namespace, clusterName string) clusterapiv1beta1.MachineList { - var machines clusterapiv1beta1.MachineList - listOptions := []client.ListOption{ - client.InNamespace(namespace), - client.MatchingLabels(map[string]string{clusterapiv1beta1.ClusterLabelName: clusterName}), - } - - Eventually(func() error { - return k8sClient.List(ctx, &machines, listOptions...) - }, getResourceTimeout, pollingInterval).Should(Succeed()) - - Expect(len(machines.Items)).To(BeNumerically(">", 0)) - return machines -} - -func getTKr(ctx context.Context, k8sClient client.Client, tkrName string) *runtanzuv1alpha3.TanzuKubernetesRelease { - tkr := &runtanzuv1alpha3.TanzuKubernetesRelease{} - objKey := client.ObjectKey{Namespace: constants.TkgNamespace, Name: tkrName} - - Eventually(func() error { - return k8sClient.Get(ctx, objKey, tkr) - }, getResourceTimeout, pollingInterval).Should(Succeed()) - - Expect(tkr).NotTo(BeNil()) - return tkr -} - -func objectExists(ctx context.Context, k8sClient client.Client, namespace, name string, obj client.Object) bool { - err := k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: name}, obj) - if apierrors.IsNotFound(err) { - return false - } - - if err != nil { - log.Infof("Error getting object name:%q namespace: %q error: %q", name, namespace, err) - } - return true -} - -type ClusterResource struct { - name string - namespace string - obj client.Object -} - -// clusterResourcesDeleted checks if all the cluster resources are deleted or not -func clusterResourcesDeleted(ctx context.Context, k8sClient client.Client, clusterResources []ClusterResource) bool { - for _, r := range clusterResources { - log.Infof("Check if cluster resource of type %q kind %q name %q is deleted from namespace %q", reflect.TypeOf(r.obj), r.obj.GetObjectKind().GroupVersionKind().Kind, r.name, r.namespace) - if objectExists(ctx, k8sClient, r.namespace, r.name, r.obj) { - return false - } - } - return true -} - -/* GetManagementClusterResources gets all the resources thats created by addons-manager plus - * all the resources on which finalizer is added by addons-manager during a cluster creation. - */ -func GetManagementClusterResources(ctx context.Context, mccl client.Client, dynamicClient dynamic.Interface, aggregatedAPIResourcesClient client.Client, discoveryClient discovery.DiscoveryInterface, clusterNamespace, clusterName, infrastructureName string) ([]ClusterResource, error) { - // get ClusterBootstrap and return error if not found - clusterResources := []ClusterResource{ - {namespace: clusterNamespace, name: clusterName, obj: &clusterapiv1beta1.Cluster{}}, - {namespace: clusterNamespace, name: clusterName, obj: &runtanzuv1alpha3.ClusterBootstrap{}}, - {namespace: clusterNamespace, name: clusterName + "-kubeconfig", obj: &corev1.Secret{}}, - {namespace: clusterNamespace, name: clusterName + "-kapp-controller", obj: &kapppkgiv1alpha1.PackageInstall{}}, - {namespace: clusterNamespace, name: clusterName + "-kapp-controller-data-values", obj: &corev1.Secret{}}, - } - - clusterBootstrap := getClusterBootstrap(ctx, mccl, clusterNamespace, clusterName) - - var packages []*runtanzuv1alpha3.ClusterBootstrapPackage - packages = append(packages, clusterBootstrap.Spec.Kapp, clusterBootstrap.Spec.CNI) - - if clusterBootstrap.Spec.CPI != nil { - packages = append(packages, clusterBootstrap.Spec.CPI) - } - - if clusterBootstrap.Spec.CSI != nil { - packages = append(packages, clusterBootstrap.Spec.CSI) - } - - packages = append(packages, clusterBootstrap.Spec.AdditionalPackages...) - - for _, pkg := range packages { - if pkg.ValuesFrom != nil { - if pkg.ValuesFrom.Inline != nil { - packageRefName, _, err := GetPackageMetadata(ctx, aggregatedAPIResourcesClient, pkg.RefName, clusterNamespace) - if err != nil { - return nil, err - } - packageSecretName := GeneratePackageSecretName(clusterName, packageRefName) - clusterResources = append(clusterResources, ClusterResource{name: packageSecretName, namespace: clusterNamespace, obj: &corev1.Secret{}}) - } - if pkg.ValuesFrom.SecretRef != "" { - clusterResources = append(clusterResources, ClusterResource{name: pkg.ValuesFrom.SecretRef, namespace: clusterNamespace, obj: &corev1.Secret{}}) - } - if pkg.ValuesFrom.ProviderRef != nil { - gvr, err := gvrForGroupKind(discoveryClient, schema.GroupKind{Group: *pkg.ValuesFrom.ProviderRef.APIGroup, Kind: pkg.ValuesFrom.ProviderRef.Kind}) - if err != nil { - return nil, err - } - provider, err := dynamicClient.Resource(*gvr).Namespace(clusterNamespace).Get(ctx, pkg.ValuesFrom.ProviderRef.Name, metav1.GetOptions{}, "status") - if err != nil { - return nil, err - } - secretName, found, err := unstructured.NestedString(provider.UnstructuredContent(), "status", "secretRef") - if err != nil { - return nil, err - } - if !found || secretName == "" { - // We expect the secretRef to be present under status subresource and its value gets updated by - // the corresponding controller after cluster is created. If it is not exist, throw an error. - return nil, fmt.Errorf("the secret is not found for the provider %s/%s", provider.GroupVersionKind().Kind, provider.GetName()) - } - clusterResources = append(clusterResources, ClusterResource{name: provider.GetName(), namespace: clusterNamespace, obj: provider}) - clusterResources = append(clusterResources, ClusterResource{name: secretName, namespace: clusterNamespace, obj: &corev1.Secret{}}) - } - } else { - // In tkgs case a secret could be created to add nodeSelector, deployment/daemonset updateStrategies. Hence need to add that secret - if infrastructureName == "tkgs" { - packageRefName, _, err := GetPackageMetadata(ctx, aggregatedAPIResourcesClient, pkg.RefName, clusterNamespace) - if err != nil { - return nil, err - } - packageSecretName := GeneratePackageSecretName(clusterName, packageRefName) - clusterResources = append(clusterResources, ClusterResource{name: packageSecretName, namespace: clusterNamespace, obj: &corev1.Secret{}}) - } - } - } - - for _, r := range clusterResources { - log.Infof("Cluster resource of type %q kind %q name %q exists in namespace %q", reflect.TypeOf(r.obj), r.obj.GetObjectKind().GroupVersionKind().Kind, r.name, r.namespace) - } - - return clusterResources, nil -} - -func gvrForGroupKind(discoveryClient discovery.DiscoveryInterface, gk schema.GroupKind) (*schema.GroupVersionResource, error) { - apiResourceList, err := discoveryClient.ServerPreferredResources() - if err != nil { - return nil, err - } - for _, apiResource := range apiResourceList { - gv, err := schema.ParseGroupVersion(apiResource.GroupVersion) - if err != nil { - return nil, err - } - if gv.Group == gk.Group { - for i := 0; i < len(apiResource.APIResources); i++ { - if apiResource.APIResources[i].Kind == gk.Kind { - return &schema.GroupVersionResource{Group: gv.Group, Resource: apiResource.APIResources[i].Name, Version: gv.Version}, nil - } - } - } - } - return nil, fmt.Errorf("unable to find server preferred resource %s/%s", gk.Group, gk.Kind) -} - -/* - * The below functions are duplicated from addons/pkg/util in order to avoid circular dependency between tanzu-framework and addons modules. - */ -func GetPackageMetadata(ctx context.Context, c client.Client, carvelPkgName, carvelPkgNamespace string) (string, string, error) { - pkg := &kapppkgv1alpha1.Package{} - if err := c.Get(ctx, client.ObjectKey{Name: carvelPkgName, Namespace: carvelPkgNamespace}, pkg); err != nil { - return "", "", err - } - return pkg.Spec.RefName, pkg.Spec.Version, nil -} - -func packageShortName(pkgRefName string) string { - nameTokens := strings.Split(pkgRefName, ".") - if len(nameTokens) >= 1 { - return nameTokens[0] - } - return pkgRefName -} - -// GeneratePackageSecretName generates secret name for a package from the cluster and the package name -func GeneratePackageSecretName(clusterName, carvelPkgRefName string) string { - return fmt.Sprintf("%s-%s-package", clusterName, packageShortName(carvelPkgRefName)) -} - -// GenerateDataValueSecretName generates data value secret name from the cluster and the package name -func GenerateDataValueSecretName(clusterName, carvelPkgRefName string) string { - return fmt.Sprintf("%s-%s-data-values", clusterName, packageShortName(carvelPkgRefName)) -} - -// GeneratePackageInstallName is the util function to generate the PackageInstall CR name in a consistent manner. -// clusterName is the name of cluster within which all resources associated with this PackageInstall CR is installed. -// It does not necessarily -// mean the PackageInstall CR will be installed in that cluster. I.e., the kapp-controller PackageInstall CR is installed -// in the management cluster but is named after "-kapp-controller". It indicates that this kapp-controller -// PackageInstall is for reconciling resources in a cluster named "". -// addonName is the short name of a Tanzu addon with which the PackageInstall CR is associated. -func GeneratePackageInstallName(clusterName, addonName string) string { - return fmt.Sprintf("%s-%s", clusterName, strings.Split(addonName, ".")[0]) -} - -func CheckTKGSAddons(ctx context.Context, tkgctlClient tkgctl.TKGClient, svClusterName, clusterName, namespace, KubeconfigPath, InfrastructureName string, isCustomeCB bool) error { - By(fmt.Sprintf("Get k8s client for supervisor cluster %q", svClusterName)) - mngclient, _, _, _, _, err := GetClients(ctx, KubeconfigPath) - Expect(err).NotTo(HaveOccurred()) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", clusterName)) - kubeConfigFileName := clusterName + ".kubeconfig" - tempFilePath := filepath.Join(os.TempDir(), kubeConfigFileName) - err = tkgctlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - ExportFile: tempFilePath, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Get k8s client for workload cluster %q", clusterName)) - wlcClient, _, _, _, _, err := GetClients(ctx, tempFilePath) - Expect(err).NotTo(HaveOccurred()) - - By(fmt.Sprintf("Verify addon packages on workload cluster %q matches clusterBootstrap info on supervisor cluster %q", clusterName, svClusterName)) - err = CheckClusterCB(ctx, mngclient, wlcClient, svClusterName, namespace, clusterName, namespace, InfrastructureName, false, isCustomeCB) - Expect(err).To(BeNil()) - - return nil -} - -func ValidateClusterClassConfigFile(clusterclassConfigFilePath string) (string, string) { - By(fmt.Sprintf("validating input cluster class based config file:%v", clusterclassConfigFilePath)) - cclusterFile, err := os.ReadFile(clusterclassConfigFilePath) - Expect(err).ToNot(HaveOccurred(), fmt.Sprintf("failed to read the input cluster class based config file from: %v", clusterclassConfigFilePath)) - Expect(cclusterFile).ToNot(BeEmpty(), fmt.Sprintf("the input cluster class based config file should not be empty, file path: %v", clusterclassConfigFilePath)) - isCC, ccObject, err := tkgctl.CheckIfInputFileIsClusterClassBased(clusterclassConfigFilePath) - Expect(err).ShouldNot(HaveOccurred(), fmt.Sprintf("failed to process cluster class input config file, reason: %v", err)) - Expect(isCC).To(Equal(true), fmt.Sprintf("input cluster class based config file is not cluster class based, does not have Cluster object.")) - return ccObject.GetName(), ccObject.GetNamespace() -} diff --git a/tkg/test/tkgctl/shared/scale.go b/tkg/test/tkgctl/shared/scale.go deleted file mode 100644 index 475eb6aa2d..0000000000 --- a/tkg/test/tkgctl/shared/scale.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - "fmt" - "math/rand" - "os" - "path/filepath" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "sigs.k8s.io/cluster-api/util" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type E2EScaleSpecInput struct { - E2EConfig *framework.E2EConfig - ArtifactsFolder string - Cni string -} - -func E2EScaleSpec(context context.Context, inputGetter func() E2EScaleSpecInput) { - var ( - err error - input E2EScaleSpecInput - tkgCtlClient tkgctl.TKGClient - logsDir string - clusterName string - namespace string - ) - - BeforeEach(func() { //nolint:dupl - namespace = constants.DefaultNamespace - input = inputGetter() - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - - rand.Seed(time.Now().UnixNano()) - clusterName = input.E2EConfig.ClusterPrefix + "wc-" + util.RandomString(4) // nolint:gomnd - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - Expect(err).To(BeNil()) - }) - - It("should scale the cluster", func() { - By(fmt.Sprintf("Creating a workload cluster %q", clusterName)) - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - Plan: "dev", - CniType: input.Cni, - } - - if input.E2EConfig.InfrastructureName == "vsphere" { - if endpointIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_2"); ok { - options.VsphereControlPlaneEndpoint = endpointIP - } - } - - clusterConfigFile, err := framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - - defer os.Remove(clusterConfigFile) - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Scaling up cluster %q to %q nodes", clusterName, 3)) - // Create a new client to prevent it from reusing in memory configs of the old client - tkgCtlClient2, _ := tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", clusterName)) - err = tkgCtlClient2.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - ExportFile: "", - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Waiting for workload cluster %q nodes to be up and running", clusterName)) - contextName := clusterName + "-admin@" + clusterName - framework.WaitForNodes(framework.NewClusterProxy(clusterName, "", contextName), 2) - - err = tkgCtlClient2.ScaleCluster(tkgctl.ScaleClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - WorkerCount: 3, - }) - Expect(err).To(BeNil()) - - framework.WaitForNodes(framework.NewClusterProxy(clusterName, "", contextName), 4) - }) - - AfterEach(func() { - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: namespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - }) -} diff --git a/tkg/test/tkgctl/shared/tkr_cc_misc.go b/tkg/test/tkgctl/shared/tkr_cc_misc.go deleted file mode 100644 index 0bdda54a33..0000000000 --- a/tkg/test/tkgctl/shared/tkr_cc_misc.go +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - "fmt" - "strings" - "time" - - "github.com/go-logr/logr" - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - v1 "k8s.io/api/core/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util/conditions" - "sigs.k8s.io/controller-runtime/pkg/client" - - kappcontrollerv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apiserver/apis/datapackaging/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/sets" - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/version" - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/registry" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkr/controller/tkr-source/compatibility" - tkrconstants "github.com/vmware-tanzu/tanzu-framework/tkr/controller/tkr-source/constants" -) - -type TKRCompatibilityValidationSpecInput struct { - E2EConfig *framework.E2EConfig - OtherConfigs map[string]string -} - -const ( - tkrSourceControllerValuesSecretName = "tkr-source-controller-values" - tkrSourceControllerValuesSecretNamespace = "tkg-system" -) - -func TKRCompatibilityValidationSpec(ctx context.Context, inputGetter func() TKRCompatibilityValidationSpecInput) { //nolint:funlen - var ( - err error - input TKRCompatibilityValidationSpecInput - mcProxy *framework.ClusterProxy - mcContextName string - tkrs []*runv1.TanzuKubernetesRelease - tkrRegistry registry.Registry - ) - const ( - waitTimeout = time.Minute * 15 - pollingInterval = time.Second * 10 - ) - BeforeEach(func() { //nolint:dupl - input = inputGetter() - mcClusterName := input.E2EConfig.ManagementClusterName - mcContextName = mcClusterName + "-admin@" + mcClusterName - mcProxy = framework.NewClusterProxy(mcClusterName, "", mcContextName) - registryOps := &ctlimg.Opts{ - Anon: true, - } - tkrRegistry, err = registry.New(registryOps) - Expect(err).To(BeNil(), "failed to initialize the TKR image registry") - }) - - It("Should validate the compatible TKRs and it's related resources(OSImages, ClusterBootStrapTemplate) are downloaded and available on management cluster ", func() { - tkrCompatibility := &compatibility.Compatibility{ - Client: mcProxy.GetClient(), - Config: compatibility.Config{ - TKRNamespace: "tkg-system", - }, - Log: logr.Discard(), - } - - compatibleSet, err := tkrCompatibility.CompatibleVersions(context.Background()) - fmt.Printf("CompatibleSet is :%+v \n", compatibleSet) - Expect(err).ToNot(HaveOccurred()) - tkrRepoImagePath, resNamespace, err := GetTKRRepoImagePathAndNamespaceFromSecret(ctx, mcProxy.GetClient()) - Expect(err).To(BeNil(), "failed to TKR repository Image path from secret") - Expect(tkrRepoImagePath).ToNot(BeEmpty(), "TKR repo Image path cannot be empty") - tkrImageTags, err := tkrRegistry.ListImageTags(tkrRepoImagePath) - Expect(err).To(BeNil(), fmt.Sprintf("failed to list TKR image tags for the repository url %s", tkrRepoImagePath)) - tkrNames := TKRNamesFromTags(tkrImageTags) - expectedTKRs := filterTKRNames(tkrNames, func(tkr string) bool { - if compatibleSet.Has(version.FromLabel(tkr)) { - return true - } - return false - }) - - By("Validating the TKRs are available on management cluster") - Eventually(func() bool { - tkrs = mcProxy.GetTKRs(ctx) - err = VerifyTKRsAreAvailable(expectedTKRs, tkrs) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue(), fmt.Sprintf("TKRs availability validation failed: %v", err)) - - ValidateTKRsRelatedObjectsAvailability(ctx, mcProxy, expectedTKRs, resNamespace) - - By("Test successful !") - }) - - It("Should validate the compatible status is correctly calculated for all TKRs", func() { - tkrCompatibility := &compatibility.Compatibility{ - Client: mcProxy.GetClient(), - Config: compatibility.Config{ - TKRNamespace: "tkg-system", - }, - Log: logr.Discard(), - } - compatibleSet, err := tkrCompatibility.CompatibleVersions(context.Background()) - fmt.Printf("CompatibleSet is :%+v \n", compatibleSet) - Expect(err).ToNot(HaveOccurred()) - By("Waiting for the compatible TKRs to be available on management cluster") - compatibleTKRNamesSet := compatibleSet.Map(func(s string) string { - return strings.ReplaceAll(s, "+", "---") - }) - Eventually(func() bool { - tkrs = mcProxy.GetTKRs(ctx) - err = VerifyTKRsAreAvailable(compatibleTKRNamesSet.Slice(), tkrs) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue(), fmt.Sprintf("failed validating the Compatible TKRs availability on management cluster: %v", err)) - - By("Validating all TKRs compatibility status condition is updated correctly") - for i := range tkrs { - fmt.Printf("Validating the compatibility status condition for TKR '%s'\n", tkrs[i].Name) - if compatibleSet.Has(tkrs[i].Spec.Version) { - Expect(conditions.IsTrue(tkrs[i], runv1.ConditionCompatible)).To(BeTrue(), - fmt.Sprintf("TKR '%s' is expected to have Compatible condition to be true", tkrs[i].Name)) - } else { - Expect(conditions.IsFalse(tkrs[i], runv1.ConditionCompatible)).To(BeTrue(), - fmt.Sprintf("TKR '%s' is expected to have Compatible condition to be false", tkrs[i].Name)) - Expect(*conditions.GetSeverity(tkrs[i], runv1.ConditionCompatible)).To(Equal(clusterv1.ConditionSeverityWarning), - fmt.Sprintf("TKR '%s' Compatible condition's severity is expected to be 'Warning' if condition status is False", tkrs[i].Name)) - } - } - By("Test successful !") - }) -} -func ValidateTKRsRelatedObjectsAvailability(ctx context.Context, mcProxy *framework.ClusterProxy, expectedTKRs []string, resourceNS string) { - crClient := mcProxy.GetClient() - for i := range expectedTKRs { - fmt.Printf("Validating the availability of objectes related to TKR: %s \n", expectedTKRs[i]) - tkr := &runv1.TanzuKubernetesRelease{} - err := crClient.Get(ctx, client.ObjectKey{Name: expectedTKRs[i]}, tkr) - Expect(err).To(BeNil(), fmt.Sprintf("failed to get TKR :%s", expectedTKRs[i])) - cbt := getClusterBootstrapTemplate(ctx, crClient, tkr.Name, tkrconstants.TKGNamespace) - Expect(cbt).ToNot(BeNil(), fmt.Sprintf("failed to get CBT :%s", expectedTKRs[i])) - ValidateOSImagesOfTKR(ctx, mcProxy, tkr) - ValidatePackagesOfTKR(ctx, mcProxy, tkr, resourceNS) - } -} - -func ValidatePackagesOfTKR(ctx context.Context, mcProxy *framework.ClusterProxy, tkr *runv1.TanzuKubernetesRelease, namespace string) { - var err error - expectedPackages := tkr.Spec.BootstrapPackages - Eventually(func() bool { - packages := mcProxy.GetPackages(ctx, namespace) - err = VerifyPackagesAreAvailable(expectedPackages, packages) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue(), fmt.Sprintf("OSImages availability validation failed: %v", err)) -} - -func ValidateOSImagesOfTKR(ctx context.Context, mcProxy *framework.ClusterProxy, tkr *runv1.TanzuKubernetesRelease) { - var err error - expectedOSImages := tkr.Spec.OSImages - Eventually(func() bool { - osImages := mcProxy.GetOSImages(ctx) - err = VerifyOSImagesAreAvailable(expectedOSImages, osImages) - return err == nil - }, waitTimeout, pollingInterval).Should(BeTrue(), fmt.Sprintf("OSImages availability validation failed: %v", err)) -} - -func GetTKRRepoImagePathAndNamespaceFromSecret(ctx context.Context, crClient client.Client) (string, string, error) { - s := &v1.Secret{} - if err := crClient.Get(ctx, client.ObjectKey{ - Namespace: tkrSourceControllerValuesSecretNamespace, - Name: tkrSourceControllerValuesSecretName, - }, s); err != nil { - return "", "", err - } - - valuesMap := make(map[string]interface{}) - if err := yaml.Unmarshal(s.Data["values.yaml"], valuesMap); err != nil { - return "", "", err - } - - tkrRepoImagePath := valuesMap["tkrRepoImagePath"].(string) - resourcesNamespace := valuesMap["namespace"].(string) - return tkrRepoImagePath, resourcesNamespace, nil -} - -func filterTKRNames(tkrNames []string, f func(string) bool) []string { - var res []string - for i := range tkrNames { - if f(tkrNames[i]) { - res = append(res, tkrNames[i]) - } - } - return res -} - -func VerifyTKRsAreAvailable(expectedTKRs []string, tkrs []*runv1.TanzuKubernetesRelease) error { - var missingTKRs []string - tkrNames := getTKRNames(tkrs) - for i := range expectedTKRs { - if !tkrNames.Has(expectedTKRs[i]) { - missingTKRs = append(missingTKRs, expectedTKRs[i]) - } - } - if len(missingTKRs) != 0 { - return errors.Errorf("TKRs %v are not available on management cluster", missingTKRs) - } - return nil -} - -func VerifyOSImagesAreAvailable(expectedOSImages []v1.LocalObjectReference, osImages []*runv1.OSImage) error { - var missingOSImages []string - osImageNames := getOSImagesNames(osImages) - for i := range expectedOSImages { - if !osImageNames.Has(expectedOSImages[i].Name) { - missingOSImages = append(missingOSImages, expectedOSImages[i].Name) - } - } - if len(missingOSImages) != 0 { - return errors.Errorf("OSImages %v are not available on management cluster", missingOSImages) - } - return nil -} - -func VerifyPackagesAreAvailable(expectedPackages []v1.LocalObjectReference, packages []*kappcontrollerv1alpha1.Package) error { - var missingPackages []string - osImageNames := getPackagesNames(packages) - for i := range expectedPackages { - if !osImageNames.Has(expectedPackages[i].Name) { - missingPackages = append(missingPackages, expectedPackages[i].Name) - } - } - if len(missingPackages) != 0 { - return errors.Errorf("OSImages %v are not available on management cluster", missingPackages) - } - return nil -} - -func TKRNamesFromTags(tkrImageTags []string) []string { - var res []string - for i := range tkrImageTags { - tkrName := strings.ReplaceAll(tkrImageTags[i], "_", "---") - res = append(res, tkrName) - } - return res -} - -func getTKRNames(tkrs []*runv1.TanzuKubernetesRelease) sets.StringSet { - tkrNames := sets.StringSet{} - for i := range tkrs { - tkrNames.Add(tkrs[i].Name) - } - return tkrNames -} - -func getOSImagesNames(osImages []*runv1.OSImage) sets.StringSet { - osImagesNames := sets.StringSet{} - for i := range osImages { - osImagesNames.Add(osImages[i].Name) - } - return osImagesNames -} -func getPackagesNames(packages []*kappcontrollerv1alpha1.Package) sets.StringSet { - packagesNames := sets.StringSet{} - for i := range packages { - packagesNames.Add(packages[i].Name) - } - return packagesNames -} diff --git a/tkg/test/tkgctl/shared/tkrresolver_cc.go b/tkg/test/tkgctl/shared/tkrresolver_cc.go deleted file mode 100644 index c17440922d..0000000000 --- a/tkg/test/tkgctl/shared/tkrresolver_cc.go +++ /dev/null @@ -1,409 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - "fmt" - "math/rand" - "os" - "path/filepath" - "sort" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "k8s.io/client-go/discovery" - "k8s.io/client-go/dynamic" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/cluster-api/util" - "sigs.k8s.io/cluster-api/util/conditions" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/clusters" - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/sets" - "github.com/vmware-tanzu/tanzu-framework/apis/run/util/version" - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - "github.com/vmware-tanzu/tanzu-framework/tkr/resolver" - "github.com/vmware-tanzu/tanzu-framework/tkr/resolver/data" - "github.com/vmware-tanzu/tanzu-framework/tkr/util/resolution" - clusterdata "github.com/vmware-tanzu/tanzu-framework/tkr/webhook/cluster/tkr-resolver/cluster" - "github.com/vmware-tanzu/tanzu-framework/util/topology" -) - -type E2ETKRResolverValidationForClusterCRUDSpecInput struct { - E2EConfig *framework.E2EConfig - ArtifactsFolder string - Cni string - Plan string - Namespace string -} - -func E2ETKRResolverValidationForClusterCRUDSpec(context context.Context, inputGetter func() E2ETKRResolverValidationForClusterCRUDSpecInput) { //nolint:funlen - var ( - err error - input E2ETKRResolverValidationForClusterCRUDSpecInput - tkgCtlClient tkgctl.TKGClient - logsDir string - clusterName string - namespace string - mcProxy *framework.ClusterProxy - mcContextName string - options framework.CreateClusterOptions - clusterConfigFile string - tkrVersionsSet sets.StringSet - oldTKR *runv1.TanzuKubernetesRelease - defaultTKR *runv1.TanzuKubernetesRelease - mngClient client.Client - clusterResources []ClusterResource - infrastructureName string - mngDynamicClient dynamic.Interface - mngAggregatedAPIResourcesClient client.Client - mngDiscoveryClient discovery.DiscoveryInterface - wlcClient client.Client - ) - const ( - waitTimeout = time.Minute * 15 - pollingInterval = time.Second * 10 - ) - - BeforeEach(func() { //nolint:dupl - namespace = constants.DefaultNamespace - input = inputGetter() - if input.Namespace != "" { - namespace = input.Namespace - } - - mcClusterName := input.E2EConfig.ManagementClusterName - mcContextName = mcClusterName + "-admin@" + mcClusterName - mcProxy = framework.NewClusterProxy(mcClusterName, "", mcContextName) - - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - - rand.Seed(time.Now().UnixNano()) - clusterName = input.E2EConfig.ClusterPrefix + "wc-" + util.RandomString(4) // nolint:gomnd - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - - Expect(err).To(BeNil()) - - options = framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - Plan: "dev", - CniType: input.Cni, - } - if input.Plan != "" { - options.Plan = input.Plan - } - - if input.E2EConfig.InfrastructureName == "vsphere" { - if input.Cni == "antrea" { - if clusterIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_ANTREA"); ok { - options.VsphereControlPlaneEndpoint = clusterIP - } - } - if input.Cni == "calico" { - if clusterIP, ok := os.LookupEnv("CLUSTER_ENDPOINT_CALICO"); ok { - options.VsphereControlPlaneEndpoint = clusterIP - } - } - } - - clusterConfigFile, err = framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - - pacificCluster, err := tkgCtlClient.IsPacificRegionalCluster() - Expect(err).NotTo(HaveOccurred()) - if pacificCluster { - infrastructureName = "TKGS" - } else { - infrastructureName = input.E2EConfig.InfrastructureName - } - - By(fmt.Sprintf("Get k8s client for management cluster %q", input.E2EConfig.ManagementClusterName)) - mngkubeConfigFileName := input.E2EConfig.ManagementClusterName + ".kubeconfig" - mngtempFilePath := filepath.Join(os.TempDir(), mngkubeConfigFileName) - err = tkgCtlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: input.E2EConfig.ManagementClusterName, - Namespace: "tkg-system", - ExportFile: mngtempFilePath, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Get k8s client for management cluster %q", clusterName)) - mngClient, mngDynamicClient, mngAggregatedAPIResourcesClient, mngDiscoveryClient, _, err = GetClients(context, mngtempFilePath) - Expect(err).NotTo(HaveOccurred()) - - }) - AfterEach(func() { - os.Remove(clusterConfigFile) - By(fmt.Sprintf("Deleting workload cluster %q", clusterName)) - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: namespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - // verify addon resources are deleted successfully - By(fmt.Sprintf("Verify workload cluster %q resources have been deleted", clusterName)) - Eventually(func() bool { - return clusterResourcesDeleted(context, mngClient, clusterResources) - }, resourceDeletionWaitTimeout, pollingInterval).Should(BeTrue()) - }) - - It("Should create workload cluster with default kubernetes version and verify infra machine images are resolved correctly", func() { - By(fmt.Sprintf("Creating a workload cluster %q", clusterName)) - - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - Namespace: namespace, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Validating the TKR data after cluster %q is created", clusterName)) - verifyTKRData(context, mcProxy, options.ClusterName, options.Namespace) - - By("Test successful !") - }) - - It("Should upgrade the cluster and verify infra machine images are resolved correctly", func() { - By(fmt.Sprintf("Creating a workload cluster %q", clusterName)) - - tkrVersionsSet, oldTKR, defaultTKR = getAvailableTKRs(context, mcProxy, input.E2EConfig.TkgConfigDir) - - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - Namespace: namespace, - TkrVersion: oldTKR.Spec.Version, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", clusterName)) - kubeConfigFileName := clusterName + ".kubeconfig" - tempKubeConfigFilePath := filepath.Join(os.TempDir(), kubeConfigFileName) - err = tkgCtlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - ExportFile: tempKubeConfigFilePath, - }) - Expect(err).To(BeNil()) - - // validate k8s version of workload cluster - By(fmt.Sprintf("Validating the kubernetes version after cluster %q is created", clusterName)) - validateKubernetesVersion(clusterName, oldTKR.Spec.Kubernetes.Version, tempKubeConfigFilePath) - - By(fmt.Sprintf("Validating the TKR data after cluster %q is created", clusterName)) - verifyTKRData(context, mcProxy, options.ClusterName, options.Namespace) - - By(fmt.Sprintf("Validating the 'updatesAvailable' condition is true and lists upgradable TKR version")) - validateUpdatesAvailableCondition(context, mcProxy, options.ClusterName, options.Namespace, tkrVersionsSet) - - By(fmt.Sprintf("Waiting for workload cluster %q nodes to be up and running", clusterName)) - framework.WaitForNodes(framework.NewClusterProxy(clusterName, tempKubeConfigFilePath, ""), 2) - - By(fmt.Sprintf("Get k8s client for workload cluster %q", clusterName)) - wlcClient, _, _, _, _, err = GetClients(context, tempKubeConfigFilePath) - Expect(err).NotTo(HaveOccurred()) - - // verify addons are deployed successfully - By(fmt.Sprintf("Verify addon packages on management cluster %q matches clusterBootstrap info on management cluster %q", input.E2EConfig.ManagementClusterName, input.E2EConfig.ManagementClusterName)) - err = CheckClusterCB(context, mngClient, wlcClient, input.E2EConfig.ManagementClusterName, constants.TkgNamespace, "", "", infrastructureName, true, false) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Verify addon packages on workload cluster %q matches clusterBootstrap info on management cluster %q", clusterName, input.E2EConfig.ManagementClusterName)) - err = CheckClusterCB(context, mngClient, wlcClient, input.E2EConfig.ManagementClusterName, constants.TkgNamespace, clusterName, namespace, infrastructureName, false, false) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Get management cluster resources created by addons-manager for workload cluster %q on management cluster %q", clusterName, input.E2EConfig.ManagementClusterName)) - clusterResources, err = GetManagementClusterResources(context, mngClient, mngDynamicClient, mngAggregatedAPIResourcesClient, mngDiscoveryClient, namespace, clusterName, infrastructureName) - Expect(err).NotTo(HaveOccurred()) - - input.E2EConfig.TkrVersion = defaultTKR.Spec.Version - Expect(input.E2EConfig.TkrVersion).ToNot(BeEmpty(), "config variable 'kubernetes_version' not set") - By(fmt.Sprintf("Upgrading workload cluster %q to k8s version %q", clusterName, input.E2EConfig.TkrVersion)) - err = tkgCtlClient.UpgradeCluster(tkgctl.UpgradeClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - TkrVersion: input.E2EConfig.TkrVersion, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Validating the kubernetes version after cluster %q is upgraded", clusterName)) - validateKubernetesVersion(clusterName, defaultTKR.Spec.Kubernetes.Version, tempKubeConfigFilePath) - - By(fmt.Sprintf("Validating the TKR data after cluster %q is upgraded", clusterName)) - verifyTKRData(context, mcProxy, options.ClusterName, options.Namespace) - - // verify addons are deployed successfully after cluster upgrade - By(fmt.Sprintf("Verify addon packages on workload cluster %q match clusterBootstrap info on management cluster %q after cluster upgrade", clusterName, input.E2EConfig.ManagementClusterName)) - err = CheckClusterCB(context, mngClient, wlcClient, input.E2EConfig.ManagementClusterName, constants.TkgNamespace, clusterName, namespace, infrastructureName, false, false) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Get management cluster resources created by addons-manager for workload cluster %q on management cluster %q", clusterName, input.E2EConfig.ManagementClusterName)) - clusterResources, err = GetManagementClusterResources(context, mngClient, mngDynamicClient, mngAggregatedAPIResourcesClient, mngDiscoveryClient, namespace, clusterName, infrastructureName) - Expect(err).NotTo(HaveOccurred()) - - By("Test successful !") - }) -} - -func validateUpdatesAvailableCondition(ctx context.Context, mcProxy *framework.ClusterProxy, clusterName, namespace string, tkrVersions sets.StringSet) { - cluster := mcProxy.GetCluster(ctx, clusterName, namespace) - Expect(cluster).ToNot(BeNil(), fmt.Sprintf("failed to get cluster '%s' in namespace: '%s'", clusterName, namespace)) - Expect(conditions.IsTrue(cluster, runv1.ConditionUpdatesAvailable)).To(BeTrue()) - - updatesSet := clusters.AvailableUpgrades(cluster) - Expect(len(updatesSet)).ToNot(BeZero(), "Cluster 'updatesAvailable condition should list at least one TKR version ") - - updates := updatesSet.Slice() - for i := range updates { - Expect(tkrVersions.Has(updates[i])).To(BeTrue(), fmt.Sprintf("cluster's available update version '%s' doesn't match with available TKR versions :%v", updates[i], tkrVersions)) - } - -} - -func verifyTKRData(ctx context.Context, mcProxy *framework.ClusterProxy, clusterName, namespace string) { - By("Initializing the TKR resolver") - tkrResolver := initializeTKRResolver(ctx, mcProxy) - cluster := mcProxy.GetCluster(ctx, clusterName, namespace) - Expect(cluster).ToNot(BeNil(), fmt.Sprintf("failed to get cluster '%s' in namespace: '%s'", clusterName, namespace)) - clusterClass := mcProxy.GetClusterClass(ctx, cluster.Spec.Topology.Class, namespace) - Expect(clusterClass).ToNot(BeNil(), fmt.Sprintf("failed to get clusterclass '%s' in namespace: '%s'", cluster.Spec.Topology.Class, namespace)) - query, err := resolution.ConstructQuery(cluster.Spec.Topology.Version, cluster, clusterClass) - Expect(err).ToNot(HaveOccurred()) - result := tkrResolver.Resolve(*query) - Expect(cluster.Labels[runv1.LabelTKR]).To(Equal(result.ControlPlane.TKRName), - fmt.Sprintf("cluster's TKR label:'%s' doesn't match with resolved TKR label '%s'", cluster.Labels[runv1.LabelTKR], result.ControlPlane.TKRName)) - validateControlPlanceTKRDataFields(cluster, result) - - for i := range cluster.Spec.Topology.Workers.MachineDeployments { - validateMDTKRDataFields(cluster, i, result) - } - -} - -func initializeTKRResolver(context context.Context, mcProxy *framework.ClusterProxy) resolver.CachingResolver { - tkrResolver := resolver.New() - tkrs := mcProxy.GetTKRs(context) - Expect(len(tkrs)).ToNot(Equal(0), "TKRs are not available in the management cluster") - for i := range tkrs { - tkrResolver.Add(tkrs[i]) - } - - osImages := mcProxy.GetOSImages(context) - Expect(len(osImages)).ToNot(Equal(0), "OSImage resources are not available in the management cluster") - for i := range osImages { - tkrResolver.Add(osImages[i]) - } - return tkrResolver -} - -func validateControlPlanceTKRDataFields(cluster *clusterv1.Cluster, result data.Result) { - var tkrData clusterdata.TKRData - err := topology.GetVariable(cluster, "TKR_DATA", &tkrData) - Expect(err).To(BeNil(), "failed to get the TKR_DATA variable for cluster") - - osImageResolved := tkrData[cluster.Spec.Topology.Version].Labels[runv1.LabelOSImage] - Expect(osImageResolved).ToNot(BeEmpty(), fmt.Sprintf("cluster TKR_DATA[%s] is missing label:'%s' ", cluster.Spec.Topology.Version, runv1.LabelOSImage)) - k8sVersionResolved := cluster.Spec.Topology.Version - tkrNameResolved := tkrData[cluster.Spec.Topology.Version].Labels[runv1.LabelTKR] - Expect(tkrNameResolved).ToNot(BeEmpty(), fmt.Sprintf("cluster's TKR_DATA[%s] is missing label: '%s'", cluster.Spec.Topology.Version, runv1.LabelTKR)) - osImageRefFromTKRDATA := tkrData[k8sVersionResolved].OSImageRef - osImageRefFromResolvedResult := result.ControlPlane.OSImagesByTKR[tkrNameResolved][osImageResolved].Spec.Image.Ref - Expect(osImageRefFromTKRDATA).To(BeEquivalentTo(osImageRefFromResolvedResult), - fmt.Sprintf("cluster's TKR_DATA[%s]'s osImgeRef doesn't match with osImageRef of the OSImage CR : '%s'", cluster.Spec.Topology.Version, tkrNameResolved)) -} - -func validateMDTKRDataFields(cluster *clusterv1.Cluster, mdIndex int, result data.Result) { - var tkrData clusterdata.TKRData - err := topology.GetMDVariable(cluster, mdIndex, "TKR_DATA", &tkrData) - Expect(err).To(BeNil(), fmt.Sprintf("failed to get the TKR_DATA variable for MD[%v]", mdIndex)) - - osImageResolved := tkrData[cluster.Spec.Topology.Version].Labels[runv1.LabelOSImage] - Expect(osImageResolved).ToNot(BeEmpty(), fmt.Sprintf("MD[%d]'s TKR_DATA[%s] is missing label:'%s' ", mdIndex, cluster.Spec.Topology.Version, runv1.LabelOSImage)) - - k8sVersionResolved := cluster.Spec.Topology.Version - tkrNameResolved := tkrData[cluster.Spec.Topology.Version].Labels[runv1.LabelTKR] - Expect(tkrNameResolved).ToNot(BeEmpty(), fmt.Sprintf("MD[%d]'s TKR_DATA[%s] is missing label: '%s'", mdIndex, cluster.Spec.Topology.Version, runv1.LabelTKR)) - - osImageRefFromTKRDATA := tkrData[k8sVersionResolved].OSImageRef - osImageRefFromResolvedResult := result.MachineDeployments[mdIndex].OSImagesByTKR[tkrNameResolved][osImageResolved].Spec.Image.Ref - Expect(osImageRefFromTKRDATA).To(BeEquivalentTo(osImageRefFromResolvedResult), - fmt.Sprintf("MD[%d]'s TKR_DATA[%s]'s osImgeRef doesn't match with osImageRef of the OSImage CR : '%s'", mdIndex, cluster.Spec.Topology.Version, tkrNameResolved)) -} -func getTKRsForUpgrade(defaultTKRVersion string, tkrs []*runv1.TanzuKubernetesRelease) (newTKR, oldTKR *runv1.TanzuKubernetesRelease) { - var defaultTKR *runv1.TanzuKubernetesRelease - for i := range tkrs { - if tkrs[i].Spec.Version == defaultTKRVersion { - defaultTKR = tkrs[i] - } - } - - defaultTKRVersionSemantic, _ := version.ParseSemantic(defaultTKR.Spec.Version) - sortedCompatibleTKRs := getSortedCompatibleTKRs(tkrs) - for i := range sortedCompatibleTKRs { - tkrVersionSemantic, _ := version.ParseSemantic(sortedCompatibleTKRs[i].Spec.Version) - if tkrVersionSemantic.LessThan(defaultTKRVersionSemantic) && differByOneMinorVersion(defaultTKRVersionSemantic, tkrVersionSemantic) { - return defaultTKR, sortedCompatibleTKRs[i] - } - } - return defaultTKR, nil -} - -func getTKRVersions(tkrs []*runv1.TanzuKubernetesRelease) sets.StringSet { - tkrVersions := sets.StringSet{} - for i := range tkrs { - tkrVersions.Add(tkrs[i].Spec.Version) - } - return tkrVersions -} - -func differByOneMinorVersion(v1, v2 *version.Version) bool { - return (v1.Major() == v2.Major()) && (v1.Minor()-v2.Minor() == 1) -} - -func getSortedCompatibleTKRs(tkrs []*runv1.TanzuKubernetesRelease) []*runv1.TanzuKubernetesRelease { - compatibleTKRs := filterCompatibleTKRs(tkrs) - sort.Sort(byTKRVersion(compatibleTKRs)) - return compatibleTKRs -} - -func filterCompatibleTKRs(tkrs []*runv1.TanzuKubernetesRelease) []*runv1.TanzuKubernetesRelease { - var compatibleTKRs []*runv1.TanzuKubernetesRelease - for i := range tkrs { - if _, exists := tkrs[i].Labels[runv1.LabelIncompatible]; !exists { - compatibleTKRs = append(compatibleTKRs, tkrs[i]) - } - } - return compatibleTKRs -} - -type byTKRVersion []*runv1.TanzuKubernetesRelease - -func (s byTKRVersion) Len() int { - return len(s) -} -func (s byTKRVersion) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} -func (s byTKRVersion) Less(i, j int) bool { - v1, _ := version.ParseSemantic(s[i].Spec.Version) // TKRs are expected to be following semantic version - v2, _ := version.ParseSemantic(s[j].Spec.Version) - return v1.LessThan(v2) -} diff --git a/tkg/test/tkgctl/shared/upgrade.go b/tkg/test/tkgctl/shared/upgrade.go deleted file mode 100644 index 3bb229ec9d..0000000000 --- a/tkg/test/tkgctl/shared/upgrade.go +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - "fmt" - "math/rand" - "os" - "path/filepath" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "sigs.k8s.io/cluster-api/util" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -type E2EUpgradeSpecInput struct { - E2EConfig *framework.E2EConfig - ArtifactsFolder string - Cni string -} - -func E2EUpgradeSpec(context context.Context, inputGetter func() E2EUpgradeSpecInput) { //nolint:funlen - var ( - err error - input E2EUpgradeSpecInput - tkgCtlClient tkgctl.TKGClient - logsDir string - managementClusterName string - clusterName string - namespace string - timeout time.Duration - ) - - BeforeEach(func() { - namespace = constants.DefaultNamespace - input = inputGetter() - logsDir = filepath.Join(input.ArtifactsFolder, "logs") - timeout, err = time.ParseDuration(input.E2EConfig.DefaultTimeout) - Expect(err).To(BeNil()) - rand.Seed(time.Now().UnixNano()) - clusterName = input.E2EConfig.ClusterPrefix + "wc-" + util.RandomString(4) // nolint: gomnd - - tkgCtlClient, err = tkgctl.New(tkgctl.Options{ - ConfigDir: input.E2EConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: input.E2EConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - }) - - It("Should upgrade management cluster and workload cluster", func() { - Skip("Skipping upgrade tests") - Expect(input.E2EConfig.KubernetesVersionOld).ToNot(BeEmpty(), "config variable 'kubernetes_version_old' not set") - - if input.E2EConfig.UpgradeManagementCluster { - By(fmt.Sprintf("Creating management cluster %q", managementClusterName)) - - Expect(input.E2EConfig.KubernetesVersionOld).ToNot(BeEmpty(), "config variable 'kubernetes_version_old' not set") - validateKubernetesVersion(managementClusterName, input.E2EConfig.KubernetesVersionOld, "") - - Expect(input.E2EConfig.ClusterAPIVersionOld).ToNot(BeEmpty(), "config variable 'capi_version_old' not set") - Expect(input.E2EConfig.InfrastructureVersionOld).ToNot(BeEmpty(), "config variable 'infrastructure_version_old' not set") - validateProviderVersions(context, managementClusterName, "infrastructure-"+input.E2EConfig.InfrastructureName, input.E2EConfig.ClusterAPIVersionOld, input.E2EConfig.InfrastructureVersionOld) - - By(fmt.Sprintf("Creating a workload cluster %q with k8s version %q", clusterName, input.E2EConfig.KubernetesVersionOld)) - } else { - By(fmt.Sprintf("Creating a workload cluster %q with k8s version %q", clusterName, input.E2EConfig.KubernetesVersionOld)) - // Creating workload cluster with new cli - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - Plan: "dev", - CniType: input.Cni, - KubernetesVersion: input.E2EConfig.KubernetesVersionOld, - } - clusterConfigFile, err := framework.GetTempClusterConfigFile(input.E2EConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - - defer os.Remove(clusterConfigFile) - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - err = tkgCtlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - }) - Expect(err).To(BeNil()) - } - - // validate k8s version of workload cluster - validateKubernetesVersion(clusterName, input.E2EConfig.KubernetesVersionOld, "") - - // upgrade management cluster - if input.E2EConfig.UpgradeManagementCluster { - By(fmt.Sprintf("Upgrading management cluster %q", managementClusterName)) - err = tkgCtlClient.UpgradeRegion(tkgctl.UpgradeRegionOptions{ - ClusterName: managementClusterName, - SkipPrompt: true, - Timeout: timeout, - }) - Expect(err).To(BeNil()) - - Expect(input.E2EConfig.TkrVersion).ToNot(BeEmpty(), "config variable 'kubernetes_version' not set") - validateKubernetesVersion(managementClusterName, input.E2EConfig.TkrVersion, "") - - Expect(input.E2EConfig.ClusterAPIVersion).ToNot(BeEmpty(), "config variable 'capi_version' not set") - Expect(input.E2EConfig.InfrastructureVersion).ToNot(BeEmpty(), "config variable 'infrastructure_version' not set") - validateProviderVersions(context, managementClusterName, "infrastructure-"+input.E2EConfig.InfrastructureName, input.E2EConfig.ClusterAPIVersion, input.E2EConfig.InfrastructureVersion) - - By(fmt.Sprintf("Upgrading management cluster %q which is already upgraded", managementClusterName)) - err = tkgCtlClient.UpgradeRegion(tkgctl.UpgradeRegionOptions{ - ClusterName: managementClusterName, - SkipPrompt: true, - Timeout: timeout, - }) - Expect(err).To(BeNil()) - } - - Expect(input.E2EConfig.TkrVersion).ToNot(BeEmpty(), "config variable 'kubernetes_version' not set") - By(fmt.Sprintf("Upgrading workload cluster %q to k8s version %q", clusterName, input.E2EConfig.TkrVersion)) - err = tkgCtlClient.UpgradeCluster(tkgctl.UpgradeClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - TkrVersion: input.E2EConfig.TkrVersion, - SkipPrompt: true, - Timeout: timeout, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Upgrading workload cluster %q which is already upgraded to k8s version %q", clusterName, input.E2EConfig.TkrVersion)) - err = tkgCtlClient.UpgradeCluster(tkgctl.UpgradeClusterOptions{ - ClusterName: clusterName, - Namespace: namespace, - TkrVersion: input.E2EConfig.TkrVersion, - SkipPrompt: true, - Timeout: timeout, - }) - Expect(err).To(BeNil()) - - By("Test successful !") - }) - - AfterEach(func() { - // TODO - Set TKG context to the management cluster created in BeforeSuite. - By(fmt.Sprintf("Deleting workload cluster %q", clusterName)) - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: namespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - if input.E2EConfig.UpgradeManagementCluster { - By(fmt.Sprintf("Deleting management cluster %q", managementClusterName)) - err = tkgCtlClient.DeleteRegion(tkgctl.DeleteRegionOptions{ - ClusterName: managementClusterName, - Force: true, - SkipPrompt: true, - Timeout: timeout, - }) - Expect(err).To(BeNil()) - } - }) -} - -func validateKubernetesVersion(clusterName, expectedK8sVersion, kubeconfigPath string) { // nolint:unused - By(fmt.Sprintf("Validating k8s version for cluster %q", clusterName)) - - kubeContext := clusterName + "-admin@" + clusterName - mcProxy := framework.NewClusterProxy(clusterName, kubeconfigPath, kubeContext) - - actualK8sVersion := mcProxy.GetKubernetesVersion() - Expect(actualK8sVersion).To(Equal(expectedK8sVersion), fmt.Sprintf("k8s version validation failed. Expected %q, found %q", expectedK8sVersion, actualK8sVersion)) -} - -func validateProviderVersions(ctx context.Context, clusterName string, infraProvider string, expectedCapiVersion string, expectedInfraVersion string) { // nolint:unused - By(fmt.Sprintf("Validating provider versions for cluster %q", clusterName)) - - kubeContext := clusterName + "-admin@" + clusterName - mcProxy := framework.NewClusterProxy(clusterName, "", kubeContext) - - providersMap := mcProxy.GetProviderVersions(ctx) - Expect(providersMap["cluster-api"]).To(Equal(expectedCapiVersion), fmt.Sprintf("capi provider version validation failed. Expected %q, actual %q", expectedCapiVersion, providersMap["cluster-api"])) - Expect(providersMap["control-plane-kubeadm"]).To(Equal(expectedCapiVersion), fmt.Sprintf("control-plane-kubeadm provider version validation failed. Expected %q, actual %q", expectedCapiVersion, providersMap["control-plane-kubeadm"])) - Expect(providersMap["bootstrap-kubeadm"]).To(Equal(expectedCapiVersion), fmt.Sprintf("bootstrap-kubeadm provider version validation failed. Expected %q, actual %q", expectedCapiVersion, providersMap["bootstrap-kubeadm"])) - - Expect(providersMap[infraProvider]).To(Equal(expectedInfraVersion), fmt.Sprintf("infra provider version validation failed. Expected %q, actual %q", expectedInfraVersion, providersMap[infraProvider])) -} diff --git a/tkg/test/tkgctl/shared/utils.go b/tkg/test/tkgctl/shared/utils.go deleted file mode 100644 index a6f8e5f63b..0000000000 --- a/tkg/test/tkgctl/shared/utils.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package shared - -import ( - "context" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - admissionregistrationv1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -const ( - webhookScrtName = "webhook-tls" - systemNamespace = "tkg-system" - webhookLabelKey = "tkg.tanzu.vmware.com/addon-webhooks" - webhookLabelValue = "addon-webhooks" -) - -// getWebhookCACert returns the value of CA certificate "ca-cert.pem" for the "webhook-tls" secret -func getWebhookCACert(ctx context.Context, k8sClient client.Client, secretName, secretNamespace string) (string, error) { - secret := corev1.Secret{} - if err := k8sClient.Get(ctx, types.NamespacedName{Name: secretName, Namespace: secretNamespace}, &secret); err != nil { - return "", err - } - if value, exists := secret.Data["ca-cert.pem"]; exists { - return string(value), nil - } - return "", errors.New("\"ca-cert.pem\" should exist and have non empty value") -} - -// verifyCABundleInLabeledWebhooks verifies all validating/mutating webhooks which match the provided label selector have a caBundle field matching the value of the provided CA certificate -func verifyCABundleInLabeledWebhooks(ctx context.Context, admissionRegistrationClient admissionregistrationv1.AdmissionregistrationV1Interface, labelSelector, caCert string) (bool, error) { - validatingWhConfigs, err := admissionRegistrationClient.ValidatingWebhookConfigurations().List(ctx, metav1.ListOptions{LabelSelector: labelSelector}) - if err != nil { - return false, err - } - for idx := range validatingWhConfigs.Items { - configName := validatingWhConfigs.Items[idx].Name - validatingWhConfig, err := admissionRegistrationClient.ValidatingWebhookConfigurations().Get(ctx, configName, metav1.GetOptions{}) - if err != nil { - return false, err - } - - for idx := range validatingWhConfig.Webhooks { - if string(validatingWhConfig.Webhooks[idx].ClientConfig.CABundle) != caCert { - return false, nil - } - } - } - - mutatingWhConfigs, err := admissionRegistrationClient.MutatingWebhookConfigurations().List(ctx, metav1.ListOptions{LabelSelector: labelSelector}) - if err != nil { - return false, err - } - for idx := range mutatingWhConfigs.Items { - configName := mutatingWhConfigs.Items[idx].Name - mutatingWhConfig, err := admissionRegistrationClient.MutatingWebhookConfigurations().Get(ctx, configName, metav1.GetOptions{}) - if err != nil { - return false, err - } - - for idx := range mutatingWhConfig.Webhooks { - if string(mutatingWhConfig.Webhooks[idx].ClientConfig.CABundle) != caCert { - return false, nil - } - } - } - - return true, nil -} diff --git a/tkg/test/tkgctl/shared/versioned_tkg_bom_cc.go b/tkg/test/tkgctl/shared/versioned_tkg_bom_cc.go deleted file mode 100644 index c9362d3f5b..0000000000 --- a/tkg/test/tkgctl/shared/versioned_tkg_bom_cc.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,goconst,gocritic,stylecheck,nolintlint -package shared - -import ( - "context" - - . "github.com/onsi/gomega" - "gopkg.in/yaml.v3" - corev1 "k8s.io/api/core/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" -) - -// verifyCCClusterVersionedTKGBOM verify the versioned tkg bom configmap -func verifyCCClusterVersionedTKGBOM(ctx context.Context, c client.Client, tkgBomVersion string) { - // verifying tkg bom - bomConfigMap := &corev1.ConfigMap{} - - Eventually(func() error { - return c.Get(ctx, client.ObjectKey{Namespace: "tkg-system-public", Name: "tkg-bom" + "-" + tkgBomVersion}, bomConfigMap) - }, getResourceTimeout, pollingInterval).Should(Succeed()) - bomYaml := bomConfigMap.Data["bom.yaml"] - Expect(bomYaml).ToNot(Equal("")) - bom := &tkgconfigbom.BOMConfiguration{} - err := yaml.Unmarshal([]byte(bomYaml), bom) - Expect(err).ToNot(HaveOccurred()) -} diff --git a/tkg/test/tkgctl/tkgs/tkgs_suite_test.go b/tkg/test/tkgctl/tkgs/tkgs_suite_test.go deleted file mode 100644 index 6863216f1d..0000000000 --- a/tkg/test/tkgctl/tkgs/tkgs_suite_test.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package tkgs - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -var ( - // path to the e2e config file - e2eConfigPath string - // path to store test artifacts - artifactsFolder string - // config read from e2eConfigPath to be used in the tests - e2eConfig *framework.E2EConfig - logsDir string - err error - deleteClusterOptions tkgctl.DeleteClustersOptions - clusterOptions tkgctl.CreateClusterOptions - tkgctlOptions tkgctl.Options - tkgctlClient tkgctl.TKGClient - isClusterClassFeatureActivated bool - isTKCAPIFeatureActivated bool -) - -func TestE2E(t *testing.T) { - if folder, ok := os.LookupEnv("E2E_ARTIFACTS"); ok { - artifactsFolder = folder - } - if artifactsFolder == "" { - artifactsFolder = filepath.Join(os.TempDir(), "artifacts") - } - if configPath, ok := os.LookupEnv("E2E_CONFIG"); ok { - e2eConfigPath = configPath - } - - RegisterFailHandler(Fail) - junitPath := filepath.Join(artifactsFolder, "junit", fmt.Sprintf("junit.e2e_suite.%d.xml", config.GinkgoConfig.ParallelNode)) - junitReporter := reporters.NewJUnitReporter(junitPath) - RunSpecsWithDefaultAndCustomReporters(t, "tkgctl-tkgs-e2e", []Reporter{junitReporter}) -} - -var _ = SynchronizedBeforeSuite(func() []byte { - // Before all parallel nodes - - Expect(e2eConfigPath).To(BeAnExistingFile(), "e2e config file is either not set or invalid") - Expect(os.MkdirAll(artifactsFolder, 0o700)).To(Succeed(), "can't create artifacts directory %q", artifactsFolder) - - logsDir := filepath.Join(artifactsFolder, "logs") - Expect(os.MkdirAll(logsDir, 0o700)).To(Succeed(), "can't create logs directory %q", logsDir) - - By(fmt.Sprintf("loading the e2e test configuration from %q", e2eConfigPath)) - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "failed to load e2e config from %s", e2eConfigPath) - - Expect(ValidateTKGSConf(e2eConfig)).To(Succeed(), "e2e test configuration is not valid") - - logsDir = filepath.Join(artifactsFolder, "logs") - tkgctlOptions = tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - KubeConfig: e2eConfig.TKGSKubeconfigPath, - KubeContext: e2eConfig.TKGSKubeconfigContext, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, "tkgs-create-wc.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - } - clusterOptions = tkgctl.CreateClusterOptions{ - Edition: "tkg", - SkipPrompt: true, - Plan: "dev", - } - tkgctlClient, err = tkgctl.New(tkgctlOptions) - Expect(err).ShouldNot(HaveOccurred(), fmt.Sprintf("failed to connect cluster with given input kube config file:%v and context:%v, reason: %v", e2eConfig.TKGSKubeconfigPath, e2eConfig.TKGSKubeconfigContext, err)) - isTKGS, err := tkgctlClient.IsPacificRegionalCluster() - Expect(err).ShouldNot(HaveOccurred()) - Expect(isTKGS).To(Equal(true), fmt.Sprintf("the input kube config file:%v with given context:%v is not TKGS cluster", e2eConfig.TKGSKubeconfigPath, e2eConfig.TKGSKubeconfigContext)) - - featureGateHelper := tkgctlClient.FeatureGateHelper() - isClusterClassFeatureActivated, _ = featureGateHelper.FeatureActivatedInNamespace(context.Background(), constants.ClusterClassFeature, constants.TKGSClusterClassNamespace) - isTKCAPIFeatureActivated, _ = featureGateHelper.FeatureActivatedInNamespace(context.Background(), constants.TKCAPIFeature, constants.TKGSTKCAPINamespace) - By(fmt.Sprintf("in the tkgs cluster the %v feature is %v, and the %v feature is %v", constants.ClusterClassFeature, isClusterClassFeatureActivated, constants.TKCAPIFeature, isTKCAPIFeatureActivated)) - - return []byte( - strings.Join([]string{ - artifactsFolder, - e2eConfigPath, - }, ","), - ) -}, func(data []byte) { - // Before each parallel node - parts := strings.Split(string(data), ",") - Expect(parts).To(HaveLen(2)) - artifactsFolder = parts[0] - e2eConfigPath = parts[1] - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "failed to load e2e config from %s", e2eConfigPath) -}) - -var _ = SynchronizedAfterSuite(func() { -}, func() {}) - -// ValidateTKGSConf validate the configuration in the e2e config file -func ValidateTKGSConf(c *framework.E2EConfig) error { - if c.InfrastructureName == "" || c.InfrastructureName != constants.InfrastructureProviderTkgs { - return errors.Errorf("config variable '%v' value is '%v', it should be 'tkgs' for tkgs test suite", "infrastructure_name", c.InfrastructureName) - } - return nil -} - -func getDeleteClustersOptions(e2eConfig *framework.E2EConfig) tkgctl.DeleteClustersOptions { - return tkgctl.DeleteClustersOptions{ - ClusterName: e2eConfig.WorkloadClusterOptions.ClusterName, - Namespace: e2eConfig.WorkloadClusterOptions.Namespace, - SkipPrompt: true, - } -} - -// createClusterConfigFile return temporary cluster config file -// it creates the temporary cluster config file by taking user inputs from the input config file -func createClusterConfigFile(e2eConfig *framework.E2EConfig) string { - options := framework.CreateClusterOptions{} - clusterConfigFile, err := framework.GetTempClusterConfigFile(e2eConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - err = e2eConfig.SaveWorkloadClusterOptions(clusterConfigFile) - Expect(err).To(BeNil()) - return clusterConfigFile -} diff --git a/tkg/test/tkgctl/tkgs/tkgs_workload_cluster_test.go b/tkg/test/tkgctl/tkgs/tkgs_workload_cluster_test.go deleted file mode 100644 index 3e88cdcf00..0000000000 --- a/tkg/test/tkgctl/tkgs/tkgs_workload_cluster_test.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package tkgs - -import ( - "bytes" - "context" - "fmt" - "io" - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "sigs.k8s.io/cluster-api/util" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - tkgutils "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -const ( - TKC_KIND = "kind: TanzuKubernetesCluster" - cniAntrea = "antrea" - cniCalico = "calico" -) - -var _ = Describe("TKGS - Create TKC based workload cluster tests", func() { - var ( - stdoutOld *os.File - r *os.File - w *os.File - ctx context.Context - svClusterName string - ) - JustBeforeEach(func() { - err = tkgctlClient.CreateCluster(clusterOptions) - }) - - BeforeEach(func() { - ctx = context.TODO() - tkgctlClient, err = tkgctl.New(tkgctlOptions) - Expect(err).To(BeNil()) - svClusterName, err = tkgutils.GetClusterNameFromKubeconfigAndContext(e2eConfig.TKGSKubeconfigPath, "") - Expect(err).To(BeNil()) - deleteClusterOptions = getDeleteClustersOptions(e2eConfig) - }) - - Context("when input file is legacy config file (TKC cluster)", func() { - BeforeEach(func() { - Expect(e2eConfig.TkrVersion).ToNot(BeEmpty(), fmt.Sprintf("the kubernetes_version should not be empty to create legacy TKGS cluster")) - clusterOptions.TkrVersion = e2eConfig.TkrVersion - e2eConfig.WorkloadClusterOptions.ClusterName = "tkc-e2e-" + util.RandomString(4) - deleteClusterOptions.ClusterName = e2eConfig.WorkloadClusterOptions.ClusterName - clusterOptions.ClusterConfigFile = createClusterConfigFile(e2eConfig) - }) - AfterEach(func() { - defer os.Remove(clusterOptions.ClusterConfigFile) - }) - - Context("when cluster Plan is dev", func() { - BeforeEach(func() { - e2eConfig.WorkloadClusterOptions.ClusterPlan = "dev" - }) - - When("create cluster is invoked with CNI Antrea", func() { - BeforeEach(func() { - clusterOptions.CniType = cniAntrea - }) - AfterEach(func() { - err = tkgctlClient.DeleteCluster(deleteClusterOptions) - }) - It("should create TKC Workload Cluster, verify successful addons reconciliation and delete it", func() { - shared.CheckTKGSAddons(ctx, tkgctlClient, svClusterName, e2eConfig.WorkloadClusterOptions.ClusterName, e2eConfig.WorkloadClusterOptions.Namespace, e2eConfig.TKGSKubeconfigPath, constants.InfrastructureProviderTkgs, false) - Expect(err).To(BeNil()) - }) - }) - - When("create cluster is invoked with CNI Calico", func() { - BeforeEach(func() { - clusterOptions.CniType = cniCalico - }) - AfterEach(func() { - err = tkgctlClient.DeleteCluster(deleteClusterOptions) - clusterOptions.CniType = cniAntrea - }) - It("should create TKC Workload Cluster, verify successful addons reconciliation and delete it", func() { - shared.CheckTKGSAddons(ctx, tkgctlClient, svClusterName, e2eConfig.WorkloadClusterOptions.ClusterName, e2eConfig.WorkloadClusterOptions.Namespace, e2eConfig.TKGSKubeconfigPath, constants.InfrastructureProviderTkgs, false) - Expect(err).To(BeNil()) - }) - }) - - When("create cluster dry-run is invoked", func() { - BeforeEach(func() { - // set dry-run mode - clusterOptions.GenerateOnly = true - - stdoutOld = os.Stdout - r, w, _ = os.Pipe() - os.Stdout = w - }) - It("should give TKC configuration as output", func() { - Expect(err).ToNot(HaveOccurred()) - - w.Close() - os.Stdout = stdoutOld - var buf bytes.Buffer - io.Copy(&buf, r) - r.Close() - str := buf.String() - Expect(str).To(ContainSubstring(TKC_KIND)) - Expect(str).To(ContainSubstring("name: " + clusterOptions.ClusterName)) - }) - }) - }) - - Context("when cluster Plan is prod", func() { - BeforeEach(func() { - clusterOptions.Plan = "prod" - clusterOptions.GenerateOnly = false - }) - - When("create cluster is invoked with CNI Antrea", func() { - BeforeEach(func() { - clusterOptions.CniType = cniAntrea - }) - AfterEach(func() { - err = tkgctlClient.DeleteCluster(deleteClusterOptions) - }) - It("should create TKC Workload Cluster, verify successful addons reconciliation and delete it", func() { - shared.CheckTKGSAddons(ctx, tkgctlClient, svClusterName, e2eConfig.WorkloadClusterOptions.ClusterName, e2eConfig.WorkloadClusterOptions.Namespace, e2eConfig.TKGSKubeconfigPath, constants.InfrastructureProviderTkgs, false) - Expect(err).To(BeNil()) - }) - }) - - When("create cluster is invoked with CNI Calico", func() { - BeforeEach(func() { - clusterOptions.CniType = cniCalico - }) - AfterEach(func() { - err = tkgctlClient.DeleteCluster(deleteClusterOptions) - clusterOptions.CniType = cniAntrea - }) - It("should create TKC Workload Cluster, verify successful addons reconciliation and delete it", func() { - shared.CheckTKGSAddons(ctx, tkgctlClient, svClusterName, e2eConfig.WorkloadClusterOptions.ClusterName, e2eConfig.WorkloadClusterOptions.Namespace, e2eConfig.TKGSKubeconfigPath, constants.InfrastructureProviderTkgs, false) - Expect(err).To(BeNil()) - }) - }) - }) - }) -}) diff --git a/tkg/test/tkgctl/tkgs_cc/tkgs_cc_node_pool_test.go b/tkg/test/tkgctl/tkgs_cc/tkgs_cc_node_pool_test.go deleted file mode 100644 index 44941c31f5..0000000000 --- a/tkg/test/tkgctl/tkgs_cc/tkgs_cc_node_pool_test.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgs_cc - -import ( - "context" - - . "github.com/onsi/ginkgo" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Node pool tests for tkgs - ClusterClass", func() { - E2ENodePoolSpec(context.TODO(), func() E2ENodePoolSpecInput { - return E2ENodePoolSpecInput{ - E2ECommonSpecInput: E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - Plan: "devcc", - }, - NodePool: client.NodePool{ - Name: "np-1", - WorkerClass: "node-pool", - TKRResolver: "os-arch=amd64", - Replicas: func(i int32) *int32 { return &i }(1), - Labels: &map[string]string{ - "provider": "tkg-service-vsphere", - }, - }, - } - }) -}) diff --git a/tkg/test/tkgctl/tkgs_cc/tkgs_cc_suite_test.go b/tkg/test/tkgctl/tkgs_cc/tkgs_cc_suite_test.go deleted file mode 100644 index 39ef2b764e..0000000000 --- a/tkg/test/tkgctl/tkgs_cc/tkgs_cc_suite_test.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package tkgs_cc - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - "sigs.k8s.io/cluster-api/util" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" -) - -var ( - // path to the e2e config file - e2eConfigPath string - // path to store test artifacts - artifactsFolder string - // config read from e2eConfigPath to be used in the tests - e2eConfig *framework.E2EConfig - logsDir string - err error - deleteClusterOptions tkgctl.DeleteClustersOptions - clusterOptions tkgctl.CreateClusterOptions - tkgctlOptions tkgctl.Options - tkgctlClient tkgctl.TKGClient - isClusterClassFeatureActivated bool - isTKCAPIFeatureActivated bool -) - -func TestE2E(t *testing.T) { - if folder, ok := os.LookupEnv("E2E_ARTIFACTS"); ok { - artifactsFolder = folder - } - if artifactsFolder == "" { - artifactsFolder = filepath.Join(os.TempDir(), "artifacts") - } - if configPath, ok := os.LookupEnv("E2E_CONFIG"); ok { - e2eConfigPath = configPath - } - - RegisterFailHandler(Fail) - junitPath := filepath.Join(artifactsFolder, "junit", fmt.Sprintf("junit.e2e_suite.%d.xml", config.GinkgoConfig.ParallelNode)) - junitReporter := reporters.NewJUnitReporter(junitPath) - RunSpecsWithDefaultAndCustomReporters(t, "tkgctl-tkgs-e2e", []Reporter{junitReporter}) -} - -var _ = SynchronizedBeforeSuite(func() []byte { - // Before all parallel nodes - - Expect(e2eConfigPath).To(BeAnExistingFile(), "e2e config file is either not set or invalid") - Expect(os.MkdirAll(artifactsFolder, 0o700)).To(Succeed(), "can't create artifacts directory %q", artifactsFolder) - - logsDir := filepath.Join(artifactsFolder, "logs") - Expect(os.MkdirAll(logsDir, 0o700)).To(Succeed(), "can't create logs directory %q", logsDir) - - By(fmt.Sprintf("loading the e2e test configuration from %q", e2eConfigPath)) - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "failed to load e2e config from %s", e2eConfigPath) - - Expect(ValidateTKGSConf(e2eConfig)).To(Succeed(), "e2e test configuration is not valid") - - logsDir = filepath.Join(artifactsFolder, "logs") - tkgctlOptions = tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - KubeConfig: e2eConfig.TKGSKubeconfigPath, - KubeContext: e2eConfig.TKGSKubeconfigContext, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, "tkgs-create-wc.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - } - clusterOptions = tkgctl.CreateClusterOptions{ - Edition: "tkg", - SkipPrompt: true, - Plan: "dev", - } - tkgctlClient, err = tkgctl.New(tkgctlOptions) - Expect(err).ShouldNot(HaveOccurred(), fmt.Sprintf("failed to connect cluster with given input kube config file:%v and context:%v, reason: %v", e2eConfig.TKGSKubeconfigPath, e2eConfig.TKGSKubeconfigContext, err)) - isTKGS, err := tkgctlClient.IsPacificRegionalCluster() - Expect(err).ShouldNot(HaveOccurred()) - Expect(isTKGS).To(Equal(true), fmt.Sprintf("the input kube config file:%v with given context:%v is not TKGS cluster", e2eConfig.TKGSKubeconfigPath, e2eConfig.TKGSKubeconfigContext)) - - featureGateHelper := tkgctlClient.FeatureGateHelper() - isClusterClassFeatureActivated, _ = featureGateHelper.FeatureActivatedInNamespace(context.Background(), constants.ClusterClassFeature, constants.TKGSClusterClassNamespace) - isTKCAPIFeatureActivated, _ = featureGateHelper.FeatureActivatedInNamespace(context.Background(), constants.TKCAPIFeature, constants.TKGSTKCAPINamespace) - By(fmt.Sprintf("in the tkgs cluster the %v feature is %v, and the %v feature is %v", constants.ClusterClassFeature, isClusterClassFeatureActivated, constants.TKCAPIFeature, isTKCAPIFeatureActivated)) - - return []byte( - strings.Join([]string{ - artifactsFolder, - e2eConfigPath, - }, ","), - ) -}, func(data []byte) { - // Before each parallel node - parts := strings.Split(string(data), ",") - Expect(parts).To(HaveLen(2)) - artifactsFolder = parts[0] - e2eConfigPath = parts[1] - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "failed to load e2e config from %s", e2eConfigPath) -}) - -var _ = SynchronizedAfterSuite(func() { -}, func() {}) - -// ValidateTKGSConf validate the configuration in the e2e config file -func ValidateTKGSConf(c *framework.E2EConfig) error { - if c.InfrastructureName == "" || c.InfrastructureName != constants.InfrastructureProviderTkgs { - return errors.Errorf("config variable '%v' value is '%v', it should be 'tkgs' for tkgs test suite", "infrastructure_name", c.InfrastructureName) - } - return nil -} - -func getDeleteClustersOptions(e2eConfig *framework.E2EConfig) tkgctl.DeleteClustersOptions { - return tkgctl.DeleteClustersOptions{ - ClusterName: e2eConfig.WorkloadClusterOptions.ClusterName, - Namespace: e2eConfig.WorkloadClusterOptions.Namespace, - SkipPrompt: true, - } -} - -// createClusterConfigFile return temporary cluster config file -// it creates the temporary cluster config file by taking user inputs from the input config file -func createClusterConfigFile(e2eConfig *framework.E2EConfig) string { - options := framework.CreateClusterOptions{} - clusterConfigFile, err := framework.GetTempClusterConfigFile(e2eConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - err = e2eConfig.SaveWorkloadClusterOptions(clusterConfigFile) - Expect(err).To(BeNil()) - return clusterConfigFile -} - -// getCalicoCNIClusterClassFile return temporary Cluster Class config file with Calico CNI -func getCalicoCNIClusterClassFile(e2eConfig *framework.E2EConfig) string { - clusterConfigFile := e2eConfig.WorkloadClusterOptions.ClusterClassFilePath - - _, err := os.Stat(clusterConfigFile) - Expect(err).To(BeNil()) - - yamlFile, err := os.ReadFile(clusterConfigFile) - Expect(err).To(BeNil()) - - f, err := os.CreateTemp("", "temp_calico_cni_cluster_config_"+util.RandomString(4)+".yaml") // nolint:gomnd - Expect(err).To(BeNil()) - - _, err = f.Write([]byte(fmt.Sprintf(cniCalicoCBResource, e2eConfig.WorkloadClusterOptions.ClusterName, - e2eConfig.WorkloadClusterOptions.Namespace, e2eConfig.TkrVersion, e2eConfig.WorkloadClusterOptions.ClusterName, - e2eConfig.WorkloadClusterOptions.Namespace, e2eConfig.WorkloadClusterOptions.ClusterName) + string(yamlFile))) - Expect(err).To(BeNil()) - - calicoCNIClusterConfigFile, err := filepath.Abs(f.Name()) - Expect(err).To(BeNil()) - - return calicoCNIClusterConfigFile -} diff --git a/tkg/test/tkgctl/tkgs_cc/tkgs_cc_workload_cluster_test.go b/tkg/test/tkgctl/tkgs_cc/tkgs_cc_workload_cluster_test.go deleted file mode 100644 index deb0e47a8e..0000000000 --- a/tkg/test/tkgctl/tkgs_cc/tkgs_cc_workload_cluster_test.go +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgs_cc - -import ( - "bytes" - "context" - "fmt" - "io" - "os" - "path/filepath" - "strings" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - tkgutils "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -const ( - TKC_KIND = "kind: TanzuKubernetesCluster" - cniAntrea = "antrea" - cniCalico = "calico" - pollingInterval = time.Second * 2 - waitTimeout = time.Second * 90 -) - -var _ = Describe("TKGS ClusterClass based workload cluster tests", func() { - var ( - clusterName string - namespace string - svClusterName string - err error - ctx context.Context - ) - - BeforeEach(func() { - ctx = context.TODO() - tkgctlClient, err = tkgctl.New(tkgctlOptions) - Expect(err).To(BeNil()) - svClusterName, err = tkgutils.GetClusterNameFromKubeconfigAndContext(e2eConfig.TKGSKubeconfigPath, "") - Expect(err).To(BeNil()) - }) - - JustBeforeEach(func() { - err = tkgctlClient.CreateCluster(clusterOptions) - }) - - Context("when input file is cluster class based with CNI Antrea", func() { - BeforeEach(func() { - clusterName, namespace = shared.ValidateClusterClassConfigFile(e2eConfig.WorkloadClusterOptions.ClusterClassFilePath) - e2eConfig.WorkloadClusterOptions.Namespace = namespace - e2eConfig.WorkloadClusterOptions.ClusterName = clusterName - deleteClusterOptions = getDeleteClustersOptions(e2eConfig) - clusterOptions.ClusterConfigFile = e2eConfig.WorkloadClusterOptions.ClusterClassFilePath - clusterOptions.ClusterName = e2eConfig.WorkloadClusterOptions.ClusterName - clusterOptions.Namespace = e2eConfig.WorkloadClusterOptions.Namespace - clusterOptions.CniType = cniAntrea - }) - - AfterEach(func() { - err = tkgctlClient.DeleteCluster(deleteClusterOptions) - }) - - It("should successfully create a cluster and verify successful addons reconciliation", func() { - Expect(err).ToNot(HaveOccurred()) - shared.CheckTKGSAddons(ctx, tkgctlClient, svClusterName, clusterName, namespace, e2eConfig.TKGSKubeconfigPath, constants.InfrastructureProviderTkgs, false) - }) - - It("should successfully upgrade a cluster", func() { - Expect(err).ToNot(HaveOccurred()) - shared.TestClusterUpgrade(tkgctlClient, clusterName, namespace) - shared.CheckTKGSAddons(ctx, tkgctlClient, svClusterName, clusterName, namespace, e2eConfig.TKGSKubeconfigPath, constants.InfrastructureProviderTkgs, false) - }) - }) - - Context("when input file is cluster class based with CNI Calico", func() { - BeforeEach(func() { - clusterName, namespace = shared.ValidateClusterClassConfigFile(e2eConfig.WorkloadClusterOptions.ClusterClassFilePath) - e2eConfig.WorkloadClusterOptions.Namespace = namespace - e2eConfig.WorkloadClusterOptions.ClusterName = clusterName - deleteClusterOptions = getDeleteClustersOptions(e2eConfig) - clusterOptions.ClusterName = e2eConfig.WorkloadClusterOptions.ClusterName - clusterOptions.Namespace = e2eConfig.WorkloadClusterOptions.Namespace - clusterOptions.CniType = cniCalico - // use a temporary cluster class config file with CalicoConfig and ClusterBoostrap resources to - // customize the CNI option as Calico - clusterOptions.ClusterConfigFile = getCalicoCNIClusterClassFile(e2eConfig) - }) - - AfterEach(func() { - err = tkgctlClient.DeleteCluster(deleteClusterOptions) - clusterOptions.CniType = cniAntrea - // remove the temporary cluster config file - os.Remove(clusterOptions.ClusterConfigFile) - clusterOptions.ClusterConfigFile = e2eConfig.WorkloadClusterOptions.ClusterClassFilePath - }) - - It("should successfully create a cluster and verify successful addons reconciliation", func() { - Expect(err).ToNot(HaveOccurred()) - shared.CheckTKGSAddons(ctx, tkgctlClient, svClusterName, clusterName, namespace, e2eConfig.TKGSKubeconfigPath, constants.InfrastructureProviderTkgs, false) - }) - It("should successfully upgrade a cluster", func() { - Expect(err).ToNot(HaveOccurred()) - shared.TestClusterUpgrade(tkgctlClient, clusterName, namespace) - shared.CheckTKGSAddons(ctx, tkgctlClient, svClusterName, clusterName, namespace, e2eConfig.TKGSKubeconfigPath, constants.InfrastructureProviderTkgs, false) - }) - }) - - Context("when input file is cluster class based with custom Cluster Bootstrap", func() { - BeforeEach(func() { - clusterName, namespace = shared.ValidateClusterClassConfigFile(e2eConfig.WorkloadClusterOptions.ClusterClassCBFilePath) - e2eConfig.WorkloadClusterOptions.Namespace = namespace - e2eConfig.WorkloadClusterOptions.ClusterName = clusterName - deleteClusterOptions = getDeleteClustersOptions(e2eConfig) - clusterOptions.ClusterName = e2eConfig.WorkloadClusterOptions.ClusterName - clusterOptions.Namespace = e2eConfig.WorkloadClusterOptions.Namespace - - // use a custom cluster class config file with custom ClusterBootstrap and Antrea resources to - // verify addons are successfully installed - clusterOptions.ClusterConfigFile = e2eConfig.WorkloadClusterOptions.ClusterClassCBFilePath - }) - - AfterEach(func() { - err = tkgctlClient.DeleteCluster(deleteClusterOptions) - clusterOptions.ClusterConfigFile = e2eConfig.WorkloadClusterOptions.ClusterClassFilePath - }) - - It("should successfully create a cluster with custom CB and verify addons", func() { - Expect(err).ToNot(HaveOccurred()) - - clusterClient := framework.GetClusterclient(e2eConfig.TKGSKubeconfigPath, e2eConfig.TKGSKubeconfigContext) - secret := &corev1.Secret{} - err := clusterClient.GetResource(secret, fmt.Sprintf("%s-antrea-data-values", clusterName), namespace, nil, nil) - Expect(err).To(BeNil()) - secretData := secret.Data["values.yaml"] - secretDataString := string(secretData) - Expect(strings.Contains(secretDataString, "AntreaTraceflow: false")).Should(BeTrue()) - - By(fmt.Sprintf("Get k8s client for management cluster")) - mngClient, _, _, _, _, err := shared.GetClients(context.Background(), e2eConfig.TKGSKubeconfigPath) - Expect(err).NotTo(HaveOccurred()) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", e2eConfig.WorkloadClusterOptions.ClusterName)) - wlcKubeConfigFileName := e2eConfig.WorkloadClusterOptions.ClusterName + ".kubeconfig" - wlcTempFilePath := filepath.Join(os.TempDir(), wlcKubeConfigFileName) - err = tkgctlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - ExportFile: wlcTempFilePath, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Get k8s client for workload cluster %q", clusterName)) - wlcClient, _, _, _, _, err := shared.GetClients(context.Background(), wlcTempFilePath) - Expect(err).NotTo(HaveOccurred()) - - By(fmt.Sprintf("Verify addon packages on workload cluster %q matches clusterBootstrap info on management cluster %q", e2eConfig.WorkloadClusterOptions.ClusterName, clusterName)) - err = shared.CheckClusterCB(context.Background(), mngClient, wlcClient, clusterName, namespace, clusterName, namespace, e2eConfig.InfrastructureName, false, true) - Expect(err).To(BeNil()) - }) - - It("should successfully upgrade a cluster with custom CB and verify addons", func() { - Expect(err).ToNot(HaveOccurred()) - shared.CheckTKGSAddons(context.TODO(), tkgctlClient, svClusterName, clusterName, namespace, e2eConfig.TKGSKubeconfigPath, e2eConfig.InfrastructureName, true) - shared.TestClusterUpgrade(tkgctlClient, clusterName, namespace) - shared.CheckTKGSAddons(context.TODO(), tkgctlClient, svClusterName, clusterName, namespace, e2eConfig.TKGSKubeconfigPath, e2eConfig.InfrastructureName, true) - }) - - It("should create the data value secret in supervisor and guest cluster for a package with inline config", func() { - Expect(err).ToNot(HaveOccurred()) - - clusterClient := framework.GetClusterclient(e2eConfig.TKGSKubeconfigPath, e2eConfig.TKGSKubeconfigContext) - secret := &corev1.Secret{} - err := clusterClient.GetResource(secret, fmt.Sprintf("%s-metrics-server-package", clusterName), namespace, nil, nil) - Expect(err).To(BeNil()) - // check data value secret contents in supervisor cluster - secretData := secret.Data["values.yaml"] - secretDataString := string(secretData) - Expect(strings.Contains(secretDataString, "periodSeconds: 15")).Should(BeTrue()) - - By(fmt.Sprintf("Generating credentials for workload cluster %q", e2eConfig.WorkloadClusterOptions.ClusterName)) - wlcKubeConfigFileName := e2eConfig.WorkloadClusterOptions.ClusterName + ".kubeconfig" - wlcTempFilePath := filepath.Join(os.TempDir(), wlcKubeConfigFileName) - err = tkgctlClient.GetCredentials(tkgctl.GetWorkloadClusterCredentialsOptions{ - ClusterName: clusterName, - Namespace: namespace, - ExportFile: wlcTempFilePath, - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Get k8s client for workload cluster %q", clusterName)) - wlcClient, _, _, _, _, err := shared.GetClients(context.Background(), wlcTempFilePath) - Expect(err).NotTo(HaveOccurred()) - - secretKey := client.ObjectKey{ - Namespace: "vmware-system-tkg", - Name: clusterName + "-metrics-server-data-values", - } - wc_secret := &corev1.Secret{} - err = wlcClient.Get(ctx, secretKey, wc_secret) - Expect(err).To(BeNil()) - // check data value secret contents in workload cluster - wc_secretData := wc_secret.Data["values.yaml"] - wc_secretDataString := string(wc_secretData) - Expect(strings.Contains(wc_secretDataString, "periodSeconds: 15")).Should(BeTrue()) - - // Update inline config for metrics server package - By(fmt.Sprintf("Update inline config for attribute periodSeconds for metrics server package for %q", clusterName)) - err = clusterClient.ApplyFile("../../data/testdata/customClusterBootstrapInlineUpdate.yaml") - Expect(err).To(BeNil()) - - Eventually(func() bool { - err1 := clusterClient.GetResource(secret, fmt.Sprintf("%s-metrics-server-package", clusterName), namespace, nil, nil) - Expect(err1).To(BeNil()) - - // check updated data value secret contents in supervisor cluster - updatedSecretData := secret.Data["values.yaml"] - updatedSecretDataString := string(updatedSecretData) - return strings.Contains(updatedSecretDataString, "periodSeconds: 20") - }, waitTimeout, pollingInterval).Should(BeTrue()) - }) - }) - - Context("when input file is legacy cluster based", func() { - When("cluster create is invoked", func() { - AfterEach(func() { - err = tkgctlClient.DeleteCluster(deleteClusterOptions) - }) - - It("should successfully create a TKC workload cluster", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - When("Cluster create dry-run is invoked", func() { - var ( - stdoutOld *os.File - r *os.File - w *os.File - ) - BeforeEach(func() { - stdoutOld = os.Stdout - r, w, _ = os.Pipe() - os.Stdout = w - - clusterOptions.GenerateOnly = true - }) - - It("should give Cluster resource configuration as output", func() { - Expect(err).ToNot(HaveOccurred()) - - w.Close() - os.Stdout = stdoutOld - var buf bytes.Buffer - io.Copy(&buf, r) - r.Close() - str := buf.String() - Expect(str).To(ContainSubstring(TKC_KIND)) - Expect(str).To(ContainSubstring("name: " + clusterName)) - }) - }) - }) -}) diff --git a/tkg/test/tkgctl/tkgs_cc/utils.go b/tkg/test/tkgctl/tkgs_cc/utils.go deleted file mode 100644 index 45b4be5ca8..0000000000 --- a/tkg/test/tkgctl/tkgs_cc/utils.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgs_cc - -// cniCalicoCBResource declares resources required along with the classy cluster -// to deploy a workload cluster with CNI Calico -const cniCalicoCBResource = `apiVersion: cni.tanzu.vmware.com/v1alpha1 -kind: CalicoConfig -metadata: - name: %s - namespace: %s -spec: - calico: - config: - vethMTU: 0 ---- -apiVersion: run.tanzu.vmware.com/v1alpha3 -kind: ClusterBootstrap -metadata: - annotations: - tkg.tanzu.vmware.com/add-missing-fields-from-tkr: %s - name: %s - namespace: %s -spec: - additionalPackages: - - refName: metrics-server* - - refName: secretgen-controller* - - refName: pinniped* - cni: - refName: calico* - valuesFrom: - providerRef: - apiGroup: cni.tanzu.vmware.com - kind: CalicoConfig - name: %s ---- -` diff --git a/tkg/test/tkgctl/vsphere67/vsphere_addons_test.go b/tkg/test/tkgctl/vsphere67/vsphere_addons_test.go deleted file mode 100644 index df4bd6e4b4..0000000000 --- a/tkg/test/tkgctl/vsphere67/vsphere_addons_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package vsphere67 - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Addon tests for vSphere clusters", func() { - E2EAddonSpec(context.TODO(), func() E2EAddonSpecInput { - return E2EAddonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/vsphere67/vsphere_antrea_test.go b/tkg/test/tkgctl/vsphere67/vsphere_antrea_test.go deleted file mode 100644 index 724aa5bc69..0000000000 --- a/tkg/test/tkgctl/vsphere67/vsphere_antrea_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package vsphere67 - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for vSphere67 - Antrea", func() { - E2ECommonSpec(context.TODO(), func() E2ECommonSpecInput { - return E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/vsphere67/vsphere_autoscaler_test.go b/tkg/test/tkgctl/vsphere67/vsphere_autoscaler_test.go deleted file mode 100644 index 2c9c5987dd..0000000000 --- a/tkg/test/tkgctl/vsphere67/vsphere_autoscaler_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package vsphere67 - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Autoscaler tests for Azure clusters", func() { - E2EAutoscalerSpec(context.TODO(), func() E2EAutoscalerSpecInput { - return E2EAutoscalerSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "antrea", - } - }) -}) diff --git a/tkg/test/tkgctl/vsphere67/vsphere_calico_test.go b/tkg/test/tkgctl/vsphere67/vsphere_calico_test.go deleted file mode 100644 index d6d544a9b7..0000000000 --- a/tkg/test/tkgctl/vsphere67/vsphere_calico_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package vsphere67 - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Functional tests for vSphere - Calico", func() { - E2ECommonSpec(context.TODO(), func() E2ECommonSpecInput { - return E2ECommonSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - } - }) -}) diff --git a/tkg/test/tkgctl/vsphere67/vsphere_ceip_test.go b/tkg/test/tkgctl/vsphere67/vsphere_ceip_test.go deleted file mode 100644 index 6bb26a6e1b..0000000000 --- a/tkg/test/tkgctl/vsphere67/vsphere_ceip_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package vsphere67 - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Tests for vSphere - telemetry", func() { - E2ECEIPSpec(context.TODO(), func() E2ECEIPSpecInput { - return E2ECEIPSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - } - }) -}) diff --git a/tkg/test/tkgctl/vsphere67/vsphere_mhc_test.go b/tkg/test/tkgctl/vsphere67/vsphere_mhc_test.go deleted file mode 100644 index cf59ac2e9f..0000000000 --- a/tkg/test/tkgctl/vsphere67/vsphere_mhc_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package vsphere67 - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("MHC tests for vSphere clusters", func() { - E2EMhcSpec(context.TODO(), func() E2EMhcSpecInput { - return E2EMhcSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - } - }) -}) diff --git a/tkg/test/tkgctl/vsphere67/vsphere_scale_test.go b/tkg/test/tkgctl/vsphere67/vsphere_scale_test.go deleted file mode 100644 index 64d17b150d..0000000000 --- a/tkg/test/tkgctl/vsphere67/vsphere_scale_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package vsphere67 - -import ( - "context" - - . "github.com/onsi/ginkgo" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/test/tkgctl/shared" -) - -var _ = Describe("Scale tests for Azure clusters", func() { - E2EScaleSpec(context.TODO(), func() E2EScaleSpecInput { - return E2EScaleSpecInput{ - E2EConfig: e2eConfig, - ArtifactsFolder: artifactsFolder, - Cni: "calico", - } - }) -}) diff --git a/tkg/test/tkgctl/vsphere67/vsphere_suite_test.go b/tkg/test/tkgctl/vsphere67/vsphere_suite_test.go deleted file mode 100644 index 057cbd5e0d..0000000000 --- a/tkg/test/tkgctl/vsphere67/vsphere_suite_test.go +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// nolint:typecheck,nolintlint -package vsphere67 - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strings" - "testing" - "time" - - . "github.com/onsi/ginkgo" - "github.com/onsi/ginkgo/config" - "github.com/onsi/ginkgo/reporters" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl" - - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework" - "github.com/vmware-tanzu/tanzu-framework/tkg/test/framework/exec" -) - -const clusterName = "tkg-cli-wc" - -var ( - // path to the e2e config file - e2eConfigPath string - - // path to store test artifacts - artifactsFolder string - - // config read from e2eConfigPath to be used in the tests - e2eConfig *framework.E2EConfig -) - -func TestE2E(t *testing.T) { - if folder, ok := os.LookupEnv("E2E_ARTIFACTS"); ok { - artifactsFolder = folder - } - - if artifactsFolder == "" { - artifactsFolder = filepath.Join(os.TempDir(), "artifacts") - } - - if configPath, ok := os.LookupEnv("E2E_CONFIG"); ok { - e2eConfigPath = configPath - } - - RegisterFailHandler(Fail) - junitPath := filepath.Join(artifactsFolder, "junit", fmt.Sprintf("junit.e2e_suite.%d.xml", config.GinkgoConfig.ParallelNode)) - junitReporter := reporters.NewJUnitReporter(junitPath) - RunSpecsWithDefaultAndCustomReporters(t, "tkgctl-vsphere-e2e", []Reporter{junitReporter}) -} - -var _ = SynchronizedBeforeSuite(func() []byte { - // Before all parallel nodes - - Expect(e2eConfigPath).To(BeAnExistingFile(), "e2e config file is either not set or invalid") - Expect(os.MkdirAll(artifactsFolder, 0o700)).To(Succeed(), "Can't create artifacts directory %q", artifactsFolder) - - logsDir := filepath.Join(artifactsFolder, "logs") - Expect(os.MkdirAll(logsDir, 0o700)).To(Succeed(), "Can't create logs directory %q", logsDir) - - By(fmt.Sprintf("Loading the e2e test configuration from %q", e2eConfigPath)) - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) - - logLocation := filepath.Join(artifactsFolder, "logs") - - // save config variables from e2e config to the tkg config file - err := e2eConfig.SaveTkgConfigVariables() - Expect(err).To(BeNil()) - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - if e2eConfig.InfrastructureName == "vsphere" { - if mcEndPointIP, ok := os.LookupEnv("MANAGEMENT_CLUSTER_ENDPOINT_1"); ok { - e2eConfig.ManagementClusterOptions.Endpoint = mcEndPointIP - } - } - - hackCmd := exec.NewCommand( - exec.WithCommand("../../scripts/legacy_hack.sh"), - exec.WithStdout(GinkgoWriter), - ) - - fmt.Println("Executing the legacy hack script") - out, cmdErr, err := hackCmd.Run(context.Background()) - fmt.Println(string(out)) - fmt.Println(string(cmdErr)) - Expect(err).To(BeNil()) - - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "before_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - // create management cluster - if !e2eConfig.UseExistingCluster { - err := cli.Init(tkgctl.InitRegionOptions{ - ClusterConfigFile: e2eConfig.TkgClusterConfigPath, - - Plan: e2eConfig.ManagementClusterOptions.Plan, - ClusterName: e2eConfig.ManagementClusterName, - InfrastructureProvider: e2eConfig.InfrastructureName, - Timeout: timeout, - Size: e2eConfig.ManagementClusterOptions.Size, - DeployTKGonVsphere7: e2eConfig.ManagementClusterOptions.DeployTKGonVsphere7, - EnableTKGSOnVsphere7: e2eConfig.ManagementClusterOptions.EnableTKGSOnVsphere7, - VsphereControlPlaneEndpoint: e2eConfig.ManagementClusterOptions.Endpoint, - Edition: "tkg", - }) - - Expect(err).To(BeNil()) - } - - // Create initial workload cluster - clusterEndPointIP, _ := os.LookupEnv("CLUSTER_ENDPOINT_1") - options := framework.CreateClusterOptions{ - ClusterName: clusterName, - Namespace: constants.DefaultNamespace, - Plan: "dev", - VsphereControlPlaneEndpoint: clusterEndPointIP, - } - clusterConfigFile, err := framework.GetTempClusterConfigFile(e2eConfig.TkgClusterConfigPath, &options) - Expect(err).To(BeNil()) - - defer os.Remove(clusterConfigFile) - - tkgCtlClient, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - err = tkgCtlClient.ConfigCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - By(fmt.Sprintf("Creating initial workload cluster %q", clusterName)) - - defer os.Remove(clusterConfigFile) - err = tkgCtlClient.CreateCluster(tkgctl.CreateClusterOptions{ - ClusterConfigFile: clusterConfigFile, - Edition: "tkg", - }) - Expect(err).To(BeNil()) - - Expect(err).To(BeNil()) - - return []byte( - strings.Join([]string{ - artifactsFolder, - e2eConfigPath, - }, ","), - ) -}, func(data []byte) { - // Before each parallel node - - parts := strings.Split(string(data), ",") - Expect(parts).To(HaveLen(2)) - - artifactsFolder = parts[0] - e2eConfigPath = parts[1] - e2eConfig = framework.LoadE2EConfig(context.TODO(), framework.E2EConfigInput{ConfigPath: e2eConfigPath}) - Expect(e2eConfigPath).ToNot(BeNil(), "Failed to load e2e config from %s", e2eConfigPath) -}) - -var _ = SynchronizedAfterSuite(func() { -}, func() { - // After all parallel nodes - - timeout, err := time.ParseDuration(e2eConfig.DefaultTimeout) - Expect(err).To(BeNil()) - - logsDir := filepath.Join(artifactsFolder, "logs") - clusterName := "tkg-cli-wc" - logLocation := filepath.Join(artifactsFolder, "logs") - tkgCtlClient, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logsDir, clusterName+".log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - err = tkgCtlClient.DeleteCluster(tkgctl.DeleteClustersOptions{ - ClusterName: clusterName, - Namespace: constants.DefaultNamespace, - SkipPrompt: true, - }) - Expect(err).To(BeNil()) - - cli, err := tkgctl.New(tkgctl.Options{ - ConfigDir: e2eConfig.TkgConfigDir, - LogOptions: tkgctl.LoggingOptions{ - File: filepath.Join(logLocation, "after_suite.log"), - Verbosity: e2eConfig.TkgCliLogLevel, - }, - }) - Expect(err).To(BeNil()) - - err = cli.DeleteRegion(tkgctl.DeleteRegionOptions{ - ClusterName: e2eConfig.ManagementClusterName, - Force: true, - SkipPrompt: true, - Timeout: timeout, - }) - - Expect(err).To(BeNil()) -}) diff --git a/tkg/test/ui/data/aws/aws-test-1-input.json b/tkg/test/ui/data/aws/aws-test-1-input.json deleted file mode 100644 index 75516e6706..0000000000 --- a/tkg/test/ui/data/aws/aws-test-1-input.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "awsAccountParams": { - "profileName": "profile1", - "sessionToken": "", - "region": "us-west-2", - "accessKeyID": "", - "secretAccessKey": "" - }, - "loadbalancerSchemeInternal": false, - "sshKeyName": "myKeyPair", - "createCloudFormationStack": true, - "clusterName": "my-aws-name", - "controlPlaneFlavor": "dev", - "controlPlaneNodeType": "c6gn.medium", - "bastionHostEnabled": true, - "machineHealthCheckEnabled": false, - "vpc": { - "cidr": "100.64.0.0/13", - "vpcID": "vpc-1", - "azs": [ - { - "name": "us-west-a", - "workerNodeType": "c6gn.medium", - "publicNodeCidr": "", - "privateNodeCidr": "", - "publicSubnetID": "sn1", - "privateSubnetID": "sn4" - } - ] - }, - "enableAuditLogging": false, - "networking": { - "networkName": "", - "clusterDNSName": "", - "clusterNodeCIDR": "", - "clusterServiceCIDR": "100.64.0.0/13", - "clusterPodCIDR": "100.96.0.0/11", - "cniType": "antrea" - }, - "ceipOptIn": true, - "labels": {}, - "os": { - "name": "amazon-2-amd64 (ami-0e6bac92abe2cbcf1)", - "osInfo": { - "arch": "amd64", - "name": "amazon", - "version": "2" - } - }, - "annotations": { - "description": "", - "location": "" - }, - "identityManagement": { - "idm_type": "none" - }, - "aviConfig": { - "controller": "", - "username": "", - "password": "", - "cloud": "", - "service_engine": "", - "ca_cert": "", - "network": { - "name": "", - "cidr": "" - }, - "controlPlaneNetwork": { - "name": "", - "cidr": "" - }, - "labels": {} - } -} diff --git a/tkg/test/ui/data/aws/aws-test-1-output-config.yaml b/tkg/test/ui/data/aws/aws-test-1-output-config.yaml deleted file mode 100644 index f51aa658c2..0000000000 --- a/tkg/test/ui/data/aws/aws-test-1-output-config.yaml +++ /dev/null @@ -1 +0,0 @@ -"AWS_AMI_ID: ami-012886bac01b37bae\nAWS_NODE_AZ: us-west-a\nAWS_NODE_AZ_1: \"\"\nAWS_NODE_AZ_2: \"\"\nAWS_PRIVATE_NODE_CIDR: \"\"\nAWS_PRIVATE_NODE_CIDR_1: \"\"\nAWS_PRIVATE_NODE_CIDR_2: \"\"\nAWS_PRIVATE_SUBNET_ID: sn4\nAWS_PRIVATE_SUBNET_ID_1: \"\"\nAWS_PRIVATE_SUBNET_ID_2: \"\"\nAWS_PROFILE: profile1\nAWS_PUBLIC_NODE_CIDR: \"\"\nAWS_PUBLIC_NODE_CIDR_1: \"\"\nAWS_PUBLIC_NODE_CIDR_2: \"\"\nAWS_PUBLIC_SUBNET_ID: sn1\nAWS_PUBLIC_SUBNET_ID_1: \"\"\nAWS_PUBLIC_SUBNET_ID_2: \"\"\nAWS_REGION: us-west-2\nAWS_SSH_KEY_NAME: myKeyPair\nAWS_VPC_CIDR: \"\"\nAWS_VPC_ID: vpc-1\nBASTION_HOST_ENABLED: \"true\"\nCLUSTER_ANNOTATIONS: 'description:,location:'\nCLUSTER_CIDR: 100.96.0.0/11\nCLUSTER_NAME: my-aws-name\nCLUSTER_PLAN: dev\nCONTROL_PLANE_MACHINE_TYPE: c6gn.medium\nENABLE_AUDIT_LOGGING: \"\"\nENABLE_CEIP_PARTICIPATION: \"true\"\nENABLE_MHC: \"false\"\nIDENTITY_MANAGEMENT_TYPE: none\nINFRASTRUCTURE_PROVIDER: aws\nLDAP_BIND_DN: \"\"\nLDAP_BIND_PASSWORD: \"\"\nLDAP_GROUP_SEARCH_BASE_DN: \"\"\nLDAP_GROUP_SEARCH_FILTER: \"\"\nLDAP_GROUP_SEARCH_GROUP_ATTRIBUTE: \"\"\nLDAP_GROUP_SEARCH_NAME_ATTRIBUTE: cn\nLDAP_GROUP_SEARCH_USER_ATTRIBUTE: DN\nLDAP_HOST: \"\"\nLDAP_ROOT_CA_DATA_B64: \"\"\nLDAP_USER_SEARCH_BASE_DN: \"\"\nLDAP_USER_SEARCH_FILTER: \"\"\nLDAP_USER_SEARCH_NAME_ATTRIBUTE: \"\"\nLDAP_USER_SEARCH_USERNAME: userPrincipalName\nNODE_MACHINE_TYPE: c6gn.medium\nOIDC_IDENTITY_PROVIDER_CLIENT_ID: \"\"\nOIDC_IDENTITY_PROVIDER_CLIENT_SECRET: \"\"\nOIDC_IDENTITY_PROVIDER_GROUPS_CLAIM: \"\"\nOIDC_IDENTITY_PROVIDER_ISSUER_URL: \"\"\nOIDC_IDENTITY_PROVIDER_NAME: \"\"\nOIDC_IDENTITY_PROVIDER_SCOPES: \"\"\nOIDC_IDENTITY_PROVIDER_USERNAME_CLAIM: \"\"\nOS_ARCH: amd64\nOS_NAME: amazon\nOS_VERSION: \"2\"\nSERVICE_CIDR: 100.64.0.0/13\nTKG_HTTP_PROXY_ENABLED: \"false\"\n" diff --git a/tkg/test/ui/data/azure/azure-test-1-input.json b/tkg/test/ui/data/azure/azure-test-1-input.json deleted file mode 100644 index c3b920c467..0000000000 --- a/tkg/test/ui/data/azure/azure-test-1-input.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "azureAccountParams": { - "tenantId": "tentantid-1", - "clientId": "clientId-1", - "clientSecret": "clientSecret-1", - "subscriptionId": "subID-1", - "azureCloud": "AzurePublicCloud" - }, - "location": "westus", - "sshPublicKey": "publicKey-1", - "controlPlaneFlavor": "dev", - "controlPlaneMachineType": "Standard_B1ls", - "workerMachineType": "Standard_B1ls", - "machineHealthCheckEnabled": false, - "resourceGroup": "resource-group1", - "clusterName": "", - "vnetResourceGroup": "resource-group1", - "vnetName": "vnet1", - "vnetCidr": "", - "controlPlaneSubnet": "subnet1", - "controlPlaneSubnetCidr": "10.0.0.0/16", - "workerNodeSubnet": "subnet2", - "enableAuditLogging": false, - "networking": { - "networkName": "", - "clusterDNSName": "", - "clusterNodeCIDR": "", - "clusterServiceCIDR": "100.64.0.0/13", - "clusterPodCIDR": "100.96.0.0/11", - "cniType": "antrea" - }, - "ceipOptIn": true, - "labels": {}, - "os": { - "name": "ubuntu-18.04-amd64 (2021.04.13)", - "osInfo": { - "arch": "amd64", - "name": "ubuntu", - "version": "18.04" - } - }, - "annotations": { - "description": "", - "location": "" - }, - "identityManagement": { - "idm_type": "none" - }, - "aviConfig": { - "controller": "", - "username": "", - "password": "", - "cloud": "", - "service_engine": "", - "ca_cert": "", - "network": { - "name": "", - "cidr": "" - }, - "controlPlaneNetwork": { - "name": "", - "cidr": "" - }, - "labels": {} - }, - "isPrivateCluster": false, - "frontendPrivateIp": "" -} diff --git a/tkg/test/ui/data/azure/azure-test-1-output-config.yaml b/tkg/test/ui/data/azure/azure-test-1-output-config.yaml deleted file mode 100644 index 09f6a5438a..0000000000 --- a/tkg/test/ui/data/azure/azure-test-1-output-config.yaml +++ /dev/null @@ -1 +0,0 @@ -"AZURE_CLIENT_ID: \nAZURE_CLIENT_SECRET: \nAZURE_CONTROL_PLANE_MACHINE_TYPE: Standard_B1ls\nAZURE_CONTROL_PLANE_SUBNET_NAME: subnet1\nAZURE_ENABLE_PRIVATE_CLUSTER: \"\"\nAZURE_ENVIRONMENT: AzurePublicCloud\nAZURE_FRONTEND_PRIVATE_IP: \"\"\nAZURE_LOCATION: westus\nAZURE_NODE_MACHINE_TYPE: Standard_B1ls\nAZURE_NODE_SUBNET_NAME: subnet2\nAZURE_RESOURCE_GROUP: resource-group1\nAZURE_SSH_PUBLIC_KEY_B64: cHVibGljS2V5LTE=\nAZURE_SUBSCRIPTION_ID: subID-1\nAZURE_TENANT_ID: tentantid-1\nAZURE_VNET_NAME: vnet1\nAZURE_VNET_RESOURCE_GROUP: resource-group1\nCLUSTER_ANNOTATIONS: 'description:,location:'\nCLUSTER_CIDR: 100.96.0.0/11\nCLUSTER_PLAN: dev\nENABLE_AUDIT_LOGGING: \"\"\nENABLE_CEIP_PARTICIPATION: \"true\"\nENABLE_MHC: \"false\"\nIDENTITY_MANAGEMENT_TYPE: none\nINFRASTRUCTURE_PROVIDER: azure\nLDAP_BIND_DN: \"\"\nLDAP_BIND_PASSWORD: \"\"\nLDAP_GROUP_SEARCH_BASE_DN: \"\"\nLDAP_GROUP_SEARCH_FILTER: \"\"\nLDAP_GROUP_SEARCH_GROUP_ATTRIBUTE: \"\"\nLDAP_GROUP_SEARCH_NAME_ATTRIBUTE: cn\nLDAP_GROUP_SEARCH_USER_ATTRIBUTE: DN\nLDAP_HOST: \"\"\nLDAP_ROOT_CA_DATA_B64: \"\"\nLDAP_USER_SEARCH_BASE_DN: \"\"\nLDAP_USER_SEARCH_FILTER: \"\"\nLDAP_USER_SEARCH_NAME_ATTRIBUTE: \"\"\nLDAP_USER_SEARCH_USERNAME: userPrincipalName\nOIDC_IDENTITY_PROVIDER_CLIENT_ID: \"\"\nOIDC_IDENTITY_PROVIDER_CLIENT_SECRET: \"\"\nOIDC_IDENTITY_PROVIDER_GROUPS_CLAIM: \"\"\nOIDC_IDENTITY_PROVIDER_ISSUER_URL: \"\"\nOIDC_IDENTITY_PROVIDER_NAME: \"\"\nOIDC_IDENTITY_PROVIDER_SCOPES: \"\"\nOIDC_IDENTITY_PROVIDER_USERNAME_CLAIM: \"\"\nOS_ARCH: amd64\nOS_NAME: ubuntu\nOS_VERSION: \"18.04\"\nSERVICE_CIDR: 100.64.0.0/13\nTKG_HTTP_PROXY_ENABLED: \"false\"\n" diff --git a/tkg/test/ui/data/vsphere/vsphere-test-1-input.json b/tkg/test/ui/data/vsphere/vsphere-test-1-input.json deleted file mode 100644 index 357eb1ef81..0000000000 --- a/tkg/test/ui/data/vsphere/vsphere-test-1-input.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "networking": { - "networkName": "Network 1", - "clusterDNSName": "", - "clusterNodeCIDR": "", - "clusterServiceCIDR": "100.64.0.0/13", - "clusterPodCIDR": "100.96.0.0/11", - "cniType": "antrea" - }, - "ceipOptIn": true, - "labels": { - "test-label-key": "test-label-val" - }, - "os": { - "name": "Ubuntu Custom", - "moid": "vm-3", - "isTemplate": true, - "osInfo": { - "arch": "amd64", - "name": "ubuntu", - "version": "20.04" - } - }, - "annotations": { - "description": "test-description", - "location": "test-location" - }, - "identityManagement": { - "idm_type": "none" - }, - "aviConfig": { - "controller": "", - "username": "admin", - "password": "password", - "cloud": "Cloud-2", - "service_engine": "Group-2", - "ca_cert": "", - "network": { - "name": "faraway-network", - "cidr": "192.168.1.0/24" - }, - "controlPlaneNetwork": { - "name": "faraway-network", - "cidr": "192.168.1.0/24" - }, - "labels": {}, - "controlPlaneHaProvider": false, - "management_cluster_service_engine": "Group-2", - "managementClusterControlPlaneVipNetworkName": "faraway-network", - "managementClusterControlPlaneVipNetworkCIDR": "192.168.1.0/24", - "managementClusterVipNetworkName": "", - "managementClusterVipNetworkCidr": "" - }, - "ipFamily": "ipv4", - "datacenter": "/SDDC-Datacenter/dc-1", - "ssh_key": "some ssh public key", - "clusterName": "adfa", - "controlPlaneEndpoint": "1.1.1.1", - "datastore": "Datastore 1", - "folder": "Folder 3", - "resourcePool": "cluster1-path/Resources", - "controlPlaneFlavor": "prod", - "controlPlaneNodeType": "small", - "workerNodeType": "small", - "machineHealthCheckEnabled": true, - "vsphereCredentials": { - "host": "vsphere.local", - "password": "password", - "username": "admin", - "thumbprint": "DF:36:82:55:6A:27:4B:0C:35:3E:D8:EC:3A:DB:46:01:8E:6E:97:97", - "insecure": false - }, - "enableAuditLogging": true -} diff --git a/tkg/test/ui/data/vsphere/vsphere-test-1-output-config.yaml b/tkg/test/ui/data/vsphere/vsphere-test-1-output-config.yaml deleted file mode 100644 index 675d96cc06..0000000000 --- a/tkg/test/ui/data/vsphere/vsphere-test-1-output-config.yaml +++ /dev/null @@ -1 +0,0 @@ -"AVI_CA_DATA_B64: \"\"\nAVI_CLOUD_NAME: Cloud-2\nAVI_CONTROL_PLANE_HA_PROVIDER: \"false\"\nAVI_CONTROL_PLANE_NETWORK: faraway-network\nAVI_CONTROL_PLANE_NETWORK_CIDR: 192.168.1.0/24\nAVI_CONTROLLER: \"\"\nAVI_DATA_NETWORK: faraway-network\nAVI_DATA_NETWORK_CIDR: 192.168.1.0/24\nAVI_ENABLE: \"true\"\nAVI_LABELS: \"\"\nAVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR: 192.168.1.0/24\nAVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME: faraway-network\nAVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP: Group-2\nAVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR: \"\"\nAVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME: \"\"\nAVI_PASSWORD: \nAVI_SERVICE_ENGINE_GROUP: Group-2\nAVI_USERNAME: admin\nCLUSTER_ANNOTATIONS: description:test-description,location:test-location\nCLUSTER_CIDR: 100.96.0.0/11\nCLUSTER_LABELS: test-label-key:test-label-val\nCLUSTER_NAME: adfa\nCLUSTER_PLAN: prod\nENABLE_AUDIT_LOGGING: \"true\"\nENABLE_CEIP_PARTICIPATION: \"true\"\nENABLE_MHC: \"true\"\nIDENTITY_MANAGEMENT_TYPE: none\nINFRASTRUCTURE_PROVIDER: vsphere\nLDAP_BIND_DN: \"\"\nLDAP_BIND_PASSWORD: \"\"\nLDAP_GROUP_SEARCH_BASE_DN: \"\"\nLDAP_GROUP_SEARCH_FILTER: \"\"\nLDAP_GROUP_SEARCH_GROUP_ATTRIBUTE: \"\"\nLDAP_GROUP_SEARCH_NAME_ATTRIBUTE: cn\nLDAP_GROUP_SEARCH_USER_ATTRIBUTE: DN\nLDAP_HOST: \"\"\nLDAP_ROOT_CA_DATA_B64: \"\"\nLDAP_USER_SEARCH_BASE_DN: \"\"\nLDAP_USER_SEARCH_FILTER: \"\"\nLDAP_USER_SEARCH_NAME_ATTRIBUTE: \"\"\nLDAP_USER_SEARCH_USERNAME: userPrincipalName\nOIDC_IDENTITY_PROVIDER_CLIENT_ID: \"\"\nOIDC_IDENTITY_PROVIDER_CLIENT_SECRET: \"\"\nOIDC_IDENTITY_PROVIDER_GROUPS_CLAIM: \"\"\nOIDC_IDENTITY_PROVIDER_ISSUER_URL: \"\"\nOIDC_IDENTITY_PROVIDER_NAME: \"\"\nOIDC_IDENTITY_PROVIDER_SCOPES: \"\"\nOIDC_IDENTITY_PROVIDER_USERNAME_CLAIM: \"\"\nOS_ARCH: amd64\nOS_NAME: ubuntu\nOS_VERSION: \"20.04\"\nSERVICE_CIDR: 100.64.0.0/13\nTKG_HTTP_PROXY_ENABLED: \"false\"\nTKG_IP_FAMILY: ipv4\nVSPHERE_CONTROL_PLANE_DISK_GIB: \"20\"\nVSPHERE_CONTROL_PLANE_ENDPOINT: 1.1.1.1\nVSPHERE_CONTROL_PLANE_MEM_MIB: \"4096\"\nVSPHERE_CONTROL_PLANE_NUM_CPUS: \"2\"\nVSPHERE_DATACENTER: /SDDC-Datacenter/dc-1\nVSPHERE_DATASTORE: Datastore 1\nVSPHERE_FOLDER: Folder 3\nVSPHERE_INSECURE: \"false\"\nVSPHERE_NETWORK: Network 1\nVSPHERE_PASSWORD: \nVSPHERE_RESOURCE_POOL: cluster1-path/Resources\nVSPHERE_SERVER: vsphere.local\nVSPHERE_SSH_AUTHORIZED_KEY: some ssh public key\nVSPHERE_TLS_THUMBPRINT: DF:36:82:55:6A:27:4B:0C:35:3E:D8:EC:3A:DB:46:01:8E:6E:97:97\nVSPHERE_USERNAME: admin\nVSPHERE_WORKER_DISK_GIB: \"20\"\nVSPHERE_WORKER_MEM_MIB: \"4096\"\nVSPHERE_WORKER_NUM_CPUS: \"2\"\nWORKER_ROLLOUT_STRATEGY: \"\"\n" diff --git a/tkg/tkgconfigbom/bom.go b/tkg/tkgconfigbom/bom.go deleted file mode 100644 index 15726ab174..0000000000 --- a/tkg/tkgconfigbom/bom.go +++ /dev/null @@ -1,727 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigbom - -import ( - "fmt" - "os" - "path/filepath" - "runtime" - "sort" - "strconv" - "strings" - - "k8s.io/apimachinery/pkg/util/version" - - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/cli/clientconfighelpers" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/registry" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" -) - -// BomNotPresent is an error type to return when BOM is not present locally -type BomNotPresent struct { - message string -} - -// NewBomNotPresent returns a struct of type BomNotPresent -func NewBomNotPresent(message string) BomNotPresent { - return BomNotPresent{ - message: message, - } -} - -func (e BomNotPresent) Error() string { - return e.message -} - -func (c *client) GetBOMConfigurationFromTkrVersion(tkrVersion string) (*BOMConfiguration, error) { - bomFiles, err := c.getListOfBOMFiles() - if err != nil || len(bomFiles) == 0 { - return nil, errors.Wrap(err, "unable to read BOM files") - } - - for _, f := range bomFiles { - bomConfig, err := c.loadBOMConfiguration(f) - if err != nil || bomConfig.Release.Version != tkrVersion { - continue - } - return bomConfig, nil - } - - return nil, NewBomNotPresent(fmt.Sprintf("No BOM file found with TKr version %s", tkrVersion)) -} - -// GetDefaultBOMConfiguration reads BOM file from ~/.tkg/bom/${TKGDefaultBOMFileName} location -func (c *client) GetDefaultTkgBOMConfiguration() (*BOMConfiguration, error) { - bomFilePath, err := c.GetDefaultBoMFilePath() - if err != nil { - return nil, errors.Wrap(err, "unable to find default TKG BOM file") - } - return c.loadBOMConfiguration(bomFilePath) -} - -// GetDefaultBoMFileName returns name of default BoM file -func (c *client) GetDefaultBoMFileName() (string, error) { - defaultBOMFileName, err := c.getDefaultTKGBOMFileNameFromCompatabilityFile() - if err != nil { - return "", errors.Wrap(err, "unable to get the default BOM file name") - } - return defaultBOMFileName, nil -} - -// GetDefaultBoMFilePath returns path of default BoM file -func (c *client) GetDefaultBoMFilePath() (string, error) { - bomDir, err := tkgconfigpaths.New(c.configDir).GetTKGBoMDirectory() - if err != nil { - return "", err - } - defaultBOMFileName, err := c.GetDefaultBoMFileName() - if err != nil { - return "", err - } - return filepath.Join(bomDir, defaultBOMFileName), nil -} - -func (c *client) getdefaultTKGBoMFileNameFromTag(tag string) string { - return "tkg-bom-" + tag + ".yaml" -} - -func (c *client) GetDefaultTkrBOMConfiguration() (*BOMConfiguration, error) { - bomConfiguration, err := c.GetDefaultTkgBOMConfiguration() - if err != nil { - return nil, err - } - - return c.GetBOMConfigurationFromTkrVersion(bomConfiguration.Default.TKRVersion) -} - -func (c *client) GetDefaultK8sVersion() (string, error) { - tkrBoMConfig, err := c.GetDefaultTkrBOMConfiguration() - if err != nil { - return "", err - } - return GetK8sVersionFromTkrBoM(tkrBoMConfig) -} - -// GetK8sVersionFromTkrVersion returns k8s version from TKr version -func (c *client) GetK8sVersionFromTkrVersion(tkrVersion string) (string, error) { - tkrBoMConfig, err := c.GetBOMConfigurationFromTkrVersion(tkrVersion) - if err != nil { - return "", err - } - return GetK8sVersionFromTkrBoM(tkrBoMConfig) -} - -// GetDefaultClusterAPIProviders return default cluster api providers from BOM file -// return sequence: coreProvider, bootstrapProvider, controlPlaneProvider, error -func (c *client) GetDefaultClusterAPIProviders() (string, string, string, error) { - bomConfig, err := c.GetDefaultTkgBOMConfiguration() - if err != nil { - return "", "", "", errors.Wrap(err, "unable to read default bom file") - } - - clusterAPIFullVersion := bomConfig.Components["cluster_api"][0].Version - clusterAPISemVersion, err := version.ParseSemantic(clusterAPIFullVersion) - if err != nil { - return "", "", "", errors.Wrapf(err, "unable to parse cluster api provider version %s", clusterAPIFullVersion) - } - - clusterAPIVersion := fmt.Sprintf("v%v.%v.%v", clusterAPISemVersion.Major(), clusterAPISemVersion.Minor(), clusterAPISemVersion.Patch()) - coreProvider := "cluster-api:" + clusterAPIVersion - bootstrapProvider := "kubeadm:" + clusterAPIVersion - controlPlaneProvider := "kubeadm:" + clusterAPIVersion - return coreProvider, bootstrapProvider, controlPlaneProvider, nil -} - -// GetDefaultTKGReleaseVersion return default tkg release version from BOM file -func (c *client) GetDefaultTKGReleaseVersion() (string, error) { - bomConfig, err := c.GetDefaultTkgBOMConfiguration() - if err != nil { - return "", errors.Wrap(err, "unable to read default bom file") - } - if bomConfig.Release == nil { - return "", errors.New("no release information present in default BoM file") - } - return bomConfig.Release.Version, nil -} - -// GetDefaultTKRVersion return default TKr version from default TKG BOM file -func (c *client) GetDefaultTKRVersion() (string, error) { - bomConfig, err := c.GetDefaultTkgBOMConfiguration() - if err != nil { - return "", errors.Wrap(err, "unable to read default bom file") - } - if bomConfig.Default == nil || bomConfig.Default.TKRVersion == "" { - return "", errors.New("no TKr version information present in default BoM file") - } - return bomConfig.Default.TKRVersion, nil -} - -// loadBOMConfiguration returns bom configuration based on given bom file path -func (c *client) loadBOMConfiguration(bomFilePath string) (*BOMConfiguration, error) { - data, err := os.ReadFile(bomFilePath) - if err != nil { - return nil, errors.Wrapf(err, "unable to read BOM file %s", bomFilePath) - } - return c.loadBOMConfigurationFromFiledata(data) -} - -func (c *client) loadBOMConfigurationFromFiledata(data []byte) (*BOMConfiguration, error) { - bomConfiguration := &BOMConfiguration{} - if err := yaml.Unmarshal(data, bomConfiguration); err != nil { - return nil, errors.Wrap(err, "unable to unmarshal bom file data to BOMConfiguration struct") - } - - getSimpleVersion := func(version string) string { - arr := strings.Split(version, "+") - if len(arr) > 0 { - return arr[0] - } - return "" - } - - devRepository, errDevRepository := c.getDevRepository() - customRepository, errCustomRepository := c.GetCustomRepository() - - bomConfiguration.ProvidersVersionMap = map[string]string{} - // TKG BOM - if bomConfiguration.Default != nil { - bomConfiguration.ProvidersVersionMap["cluster-api"] = getSimpleVersion(bomConfiguration.Components["cluster_api"][0].Version) - bomConfiguration.ProvidersVersionMap["bootstrap-kubeadm"] = getSimpleVersion(bomConfiguration.Components["cluster_api"][0].Version) - bomConfiguration.ProvidersVersionMap["control-plane-kubeadm"] = getSimpleVersion(bomConfiguration.Components["cluster_api"][0].Version) - bomConfiguration.ProvidersVersionMap["infrastructure-docker"] = getSimpleVersion(bomConfiguration.Components["cluster_api"][0].Version) - bomConfiguration.ProvidersVersionMap["infrastructure-aws"] = getSimpleVersion(bomConfiguration.Components["cluster_api_aws"][0].Version) - bomConfiguration.ProvidersVersionMap["infrastructure-vsphere"] = getSimpleVersion(bomConfiguration.Components["cluster_api_vsphere"][0].Version) - bomConfiguration.ProvidersVersionMap["infrastructure-azure"] = getSimpleVersion(bomConfiguration.Components["cluster-api-provider-azure"][0].Version) - bomConfiguration.ProvidersVersionMap["infrastructure-tkg-service-vsphere"] = "v1.0.0" - } else { // TKr BOM - if errDevRepository == nil && bomConfiguration.ImageConfig.ImageRepository == devRepository { - bomConfiguration.KubeadmConfigSpec.ImageRepository = bomConfiguration.ImageConfig.ImageRepository - bomConfiguration.KubeadmConfigSpec.DNS.ImageRepository = bomConfiguration.ImageConfig.ImageRepository - if bomConfiguration.KubeadmConfigSpec.Etcd.Local != nil { - bomConfiguration.KubeadmConfigSpec.Etcd.Local.ImageRepository = bomConfiguration.ImageConfig.ImageRepository - } - } - if errCustomRepository == nil && customRepository != "" { - bomConfiguration.KubeadmConfigSpec.ImageRepository = customRepository - bomConfiguration.KubeadmConfigSpec.DNS.ImageRepository = customRepository - if bomConfiguration.KubeadmConfigSpec.Etcd.Local != nil { - bomConfiguration.KubeadmConfigSpec.Etcd.Local.ImageRepository = customRepository - } - } - } - - // If custom image repository is set, update bomConfiguration.ImageConfig.ImageRepository - // so, any code using BoM to determine the imageRepo takes custom image repo into account - if errCustomRepository == nil && customRepository != "" { - bomConfiguration.ImageConfig.ImageRepository = customRepository - } - - return bomConfiguration, nil -} - -func (c *client) GetAutoscalerImageForK8sVersion(k8sVersion string) (string, error) { - semanticVersion, err := version.ParseSemantic(k8sVersion) - if err != nil { - return "", err - } - - k8sVersionPrefix := fmt.Sprintf("v%d.%d", semanticVersion.Major(), semanticVersion.Minor()) - - bomConfiguration, err := c.GetDefaultTkgBOMConfiguration() - if err != nil { - return "", err - } - - var autoscalerImage *ImageInfo - imageCount := 0 - for _, autoscaler := range bomConfiguration.Components["kubernetes_autoscaler"] { - if strings.HasPrefix(autoscaler.Version, k8sVersionPrefix) { - imageCount++ - autoscalerImage = autoscaler.Images["kubernetesAutoscalerImage"] - } - } - - if autoscalerImage == nil { - return "", fmt.Errorf("autoscaler image not available for kubernetes minor version %s", k8sVersionPrefix) - } - - if imageCount > 1 { - return "", errors.Errorf("expected one autoscaler image for kubernetes minor version %q but found %d", k8sVersionPrefix, imageCount) - } - - autoscalerImageRepo := bomConfiguration.ImageConfig.ImageRepository - - return fmt.Sprintf("%s/%s:%s", autoscalerImageRepo, autoscalerImage.ImagePath, autoscalerImage.Tag), nil -} - -func (c *client) getListOfBOMFiles() ([]string, error) { - bomDir, err := c.tkgConfigPathsClient.GetTKGBoMDirectory() - if err != nil { - return nil, err - } - if _, err := os.Stat(bomDir); err != nil { - return nil, errors.Wrapf(err, "unable to find %s directory", bomDir) - } - - var files []string - err = filepath.Walk(bomDir, func(path string, info os.FileInfo, err error) error { - // Skip directories & non-yaml files - if info.IsDir() || filepath.Ext(path) != ".yaml" { - return nil - } - files = append(files, path) - return nil - }) - if err != nil { - return nil, err - } - return files, nil -} - -// GetAvailableK8sVersionsFromBOMFiles returns list of supported K8s versions parsing BOM files -func (c *client) GetAvailableK8sVersionsFromBOMFiles() ([]string, error) { - bomFiles, err := c.getListOfBOMFiles() - if err != nil || len(bomFiles) == 0 { - return nil, errors.Wrap(err, "unable to read BOM files") - } - availableK8sVersionsMap := make(map[string]bool) - for _, f := range bomFiles { - bomConfig, err := c.loadBOMConfiguration(f) - if err != nil { - continue - } - k8sVersion, err := GetK8sVersionFromTkrBoM(bomConfig) - if err != nil { - continue - } - if _, exists := availableK8sVersionsMap[k8sVersion]; !exists { - availableK8sVersionsMap[k8sVersion] = true - } - } - availableK8sVersions := make([]string, 0) - for k8sVersion := range availableK8sVersionsMap { - availableK8sVersions = append(availableK8sVersions, k8sVersion) - } - return availableK8sVersions, nil -} - -// GetFullImagePath return full image path with repository -func GetFullImagePath(image *ImageInfo, baseImageRepository string) string { - if image.ImageRepository != "" { - return image.ImageRepository + "/" + image.ImagePath - } - return baseImageRepository + "/" + image.ImagePath -} - -// GetCurrentTKGVersion returns current TKG CLI version -func (c *client) GetCurrentTKGVersion() string { - bomConfiguration, err := c.GetDefaultTkgBOMConfiguration() - if err != nil { - return "" - } - return bomConfiguration.Release.Version -} - -func (c *client) IsCustomRepositorySkipTLSVerify() bool { - value, err := c.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepositorySkipTLSVerify) - if err == nil { - return strings.EqualFold(value, "true") - } - return false -} - -// getDevRepository does not rely on configured tkgConfigReaderWriter as the value of the tkgConfigReaderWriter can be nil -func (c *client) getDevRepository() (string, error) { - if c.TKGConfigReaderWriter() == nil { - return "", errors.New("tkg config readerwriter is not configured") - } - return c.TKGConfigReaderWriter().Get(constants.ConfigVariableDevImageRepository) -} - -func (c *client) GetCustomRepository() (string, error) { - if c.TKGConfigReaderWriter() == nil { - return "", errors.New("tkg config readerwriter is not configured") - } - return c.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepository) -} - -// GetK8sVersionFromTkrBoM returns k8s version from TKr BoM file -func GetK8sVersionFromTkrBoM(bomConfig *BOMConfiguration) (string, error) { - if bomConfig == nil { - return "", errors.New("invalid BoM configuration") - } - - k8sCompoments := bomConfig.Components["kubernetes"] - if len(k8sCompoments) != 0 && k8sCompoments[0] != nil { - return k8sCompoments[0].Version, nil - } - - return "", errors.New("no kubernetes component found in TKr BOM") -} - -// GetTKRBOMImageTagNameFromTKRVersion returns TKr BOM InageTag Name from TKr Version -func GetTKRBOMImageTagNameFromTKRVersion(tkrVersion string) string { - return strings.ReplaceAll(tkrVersion, "+", "_") -} - -var errorDownloadingDefaultBOMFiles = `failed to download the BOM file from image name '%s':%v -If this is an internet-restricted environment please refer to the documentation to set TKG_CUSTOM_IMAGE_REPOSITORY and related configuration variables in %s -` - -// DownloadDefaultBOMFilesFromRegistry retrieves the bill of materials (BOM) -// from the target registry. It receives a bomRepo which specifies where to -// retrieve the bom comes from. -func (c *client) DownloadDefaultBOMFilesFromRegistry(bomRepo string, bomRegistry registry.Registry) error { //nolint:gocyclo - // if a custom repo was set (e.g. via environment variable) override the bomRepo passed to this function. - customRepository, err := c.tkgConfigReaderWriter.Get(constants.ConfigVariableCustomImageRepository) - if err == nil && customRepository != "" { - bomRepo = customRepository - } - - bomImagePath, tkgBOMImageTag, err := c.getDefaultBOMFileImagePathAndTagFromCompatabilityFile() - if err != nil { - return errors.Wrap(err, "unable to get the default BOM file ImagePath and Image Tag from the TKG Compatibility file") - } - tkgBOMImagePath := bomRepo + "/" + bomImagePath - - tkgconfigpath, err := c.tkgConfigPathsClient.GetTKGConfigPath() - if err != nil { - return err - } - - log.Infof("Downloading the TKG Bill of Materials (BOM) file from '%s'", fmt.Sprintf("%s:%s", tkgBOMImagePath, tkgBOMImageTag)) - tkgBOMContent, err := bomRegistry.GetFile(fmt.Sprintf("%s:%s", tkgBOMImagePath, tkgBOMImageTag), "") - if err != nil { - return errors.Errorf(errorDownloadingDefaultBOMFiles, fmt.Sprintf("%s:%s", tkgBOMImagePath, tkgBOMImageTag), err, tkgconfigpath) - } - - err = c.saveEmbeddedBomToUserDefaultBOMDirectory(c.getdefaultTKGBoMFileNameFromTag(tkgBOMImageTag), tkgBOMContent) - if err != nil { - return errors.Wrap(err, "failed to save the BOM file downloaded from image registry") - } - - bomConfiguration, err := c.loadBOMConfigurationFromFiledata(tkgBOMContent) - if err != nil { - return errors.Wrap(err, "failed to get BOM configuration from the BOM content downloaded from the registry") - } - - // get the TKr BOM Image tag name from the downloaded TKG BOM file - if bomConfiguration.Default == nil || bomConfiguration.Default.TKRVersion == "" { - return errors.New("failed to read kubernetes version from the BOM file downloaded from the registry") - } - - tkrBOMTagName := GetTKRBOMImageTagNameFromTKRVersion(bomConfiguration.Default.TKRVersion) - - if bomConfiguration.ImageConfig == nil || bomConfiguration.ImageConfig.ImageRepository == "" { - return errors.New("failed to read ImageConfig from the BOM file downloaded from the registry") - } - - tkrBOMImageRepo := bomConfiguration.ImageConfig.ImageRepository - if customRepository != "" { - tkrBOMImageRepo = customRepository - } - - if bomConfiguration.TKRBOM == nil || bomConfiguration.TKRBOM.ImagePath == "" { - return errors.New("failed to read TKr BOM ImagePath for from the BOM file downloaded from the registry") - } - defaultTKRImagePath := tkrBOMImageRepo + "/" + bomConfiguration.TKRBOM.ImagePath - - log.Infof("Downloading the TKr Bill of Materials (BOM) file from '%s'", fmt.Sprintf("%s:%s", defaultTKRImagePath, tkrBOMTagName)) - tkrBOMContent, err := bomRegistry.GetFile(fmt.Sprintf("%s:%s", defaultTKRImagePath, tkrBOMTagName), "") - if err != nil { - return errors.Errorf(errorDownloadingDefaultBOMFiles, fmt.Sprintf("%s:%s", defaultTKRImagePath, tkrBOMTagName), err, tkgconfigpath) - } - - tkrBOMFileName := fmt.Sprintf("tkr-bom-%s.yaml", bomConfiguration.Default.TKRVersion) - err = c.saveEmbeddedBomToUserDefaultBOMDirectory(tkrBOMFileName, tkrBOMContent) - if err != nil { - return errors.Wrap(err, "failed to save the TKr BOM file downloaded from image registry") - } - - return nil -} - -var errorDownloadingTKGCompatibilityFile = `failed to download the TKG Compatibility file from image name '%s':%v -If this is an internet-restricted environment please refer to the documentation to set TKG_CUSTOM_IMAGE_REPOSITORY and related configuration variables in %s -` - -// DownloadTKGCompatibilityFileFromRegistry resolves the compatibility file -// from an OCI registry. The compatibility files correlates a plugin (e.g. -// management-cluster) version to a compatibility file. Compatibility files -// contain references to the corresponding Bill of Materials (BOM) that is used -// when creating clusters. -func (c *client) DownloadTKGCompatibilityFileFromRegistry(repo, resource string, bomClient registry.Registry) error { - // if a custom repository or image path is set (e.g. via environment variable, override what was passed into this method - customRepository, err := c.tkgConfigReaderWriter.Get(constants.ConfigVariableCustomImageRepository) - if err == nil && customRepository != "" { - repo = customRepository - } - customTKGCompatibilityImagePath, err := c.tkgConfigReaderWriter.Get(constants.ConfigVariableCompatibilityCustomImagePath) - if err == nil && customTKGCompatibilityImagePath != "" { - resource = customTKGCompatibilityImagePath - } - - // begin download of compatibility file - tkgCompatibilityImagePath := fmt.Sprintf("%s/%s", repo, resource) - log.Infof("Downloading TKG compatibility file from '%s'", tkgCompatibilityImagePath) - tags, err := bomClient.ListImageTags(tkgCompatibilityImagePath) - if err != nil || len(tags) == 0 { - return errors.Wrap(err, "failed to list TKG compatibility image tags") - } - - tagNum := []int{} - for _, tag := range tags { - ver, err := strconv.Atoi(tag[1:]) - if err == nil { - tagNum = append(tagNum, ver) - } - } - - sort.Ints(tagNum) - if len(tagNum) == 0 { - return errors.New("failed to get valid image tags for TKG compatibility image") - } - - // get the latest tag version - tagName := fmt.Sprintf("v%d", tagNum[len(tagNum)-1]) - tkgconfigpath, err := c.tkgConfigPathsClient.GetTKGConfigPath() - if err != nil { - return err - } - - tkgCompatibilityContent, err := bomClient.GetFile(fmt.Sprintf("%s:%s", tkgCompatibilityImagePath, tagName), "") - if err != nil { - return errors.Errorf(errorDownloadingTKGCompatibilityFile, fmt.Sprintf("%s:%s", tkgCompatibilityImagePath, tagName), err, tkgconfigpath) - } - - err = c.saveTKGCompatibilityFileToUserDefaultCompatibilityDirectory(tkgCompatibilityContent) - if err != nil { - return errors.Wrap(err, "failed to save the BOM file downloaded from image registry") - } - - return nil -} - -func (c *client) InitBOMRegistry() (registry.Registry, error) { - verifyCerts := true - skipVerifyCerts, err := c.tkgConfigReaderWriter.Get(constants.ConfigVariableCustomImageRepositorySkipTLSVerify) - if err == nil && strings.EqualFold(skipVerifyCerts, "true") { - verifyCerts = false - } - - registryOpts := &ctlimg.Opts{ - VerifyCerts: verifyCerts, - Anon: true, - } - - if runtime.GOOS == "windows" { - err := clientconfighelpers.AddRegistryTrustedRootCertsFileForWindows(registryOpts) - if err != nil { - return nil, err - } - } - - caCertBytes, err := clientconfighelpers.GetCustomRepositoryCaCertificateForClient(c.TKGConfigReaderWriter()) - if err == nil && len(caCertBytes) != 0 { - filePath, err := tkgconfigpaths.GetRegistryCertFile() - if err != nil { - return nil, err - } - err = os.WriteFile(filePath, caCertBytes, 0o644) - if err != nil { - return nil, errors.Wrapf(err, "failed to write the custom image registry CA cert to file '%s'", filePath) - } - registryOpts.CACertPaths = append(registryOpts.CACertPaths, filePath) - } - - return registry.New(registryOpts) -} - -// saveEmbeddedBomToUserDefaultBOMDirectory writes file's content to user's default BOM directory if -// BOM file with same name does not exist -func (c *client) saveEmbeddedBomToUserDefaultBOMDirectory(bomFileName string, bomFileBytes []byte) error { - bomDir, err := c.tkgConfigPathsClient.GetTKGBoMDirectory() - if err != nil { - return err - } - - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - if err = os.MkdirAll(bomDir, constants.DefaultDirectoryPermissions); err != nil { - return errors.Wrap(err, "cannot create TKG BOM directory") - } - } - - bomFilePath := filepath.Join(bomDir, bomFileName) - - // Write BOM file only if user's BOM file with same version does not exist. - // This will ensure that TKG CLI does not override user's customized BOM file. - // TODO: Should we consider user local customized BOM files anymore? or should we ask user to upload the customized BOM files to private registry? - if _, err := os.Stat(bomFilePath); os.IsNotExist(err) { - err = os.WriteFile(bomFilePath, bomFileBytes, constants.ConfigFilePermissions) - if err != nil { - return errors.Wrap(err, "cannot create TKG BOM file") - } - } else if err == nil { - log.V(4).Infof("BOM file %q already exist, so skipped saving the downloaded BOM file ", bomFilePath) - } - return nil -} - -// saveEmbeddedBomToUserDefaultBOMDirectory writes file's content to user's default BOM directory if -// BOM file with same name does not exist -func (c *client) saveTKGCompatibilityFileToUserDefaultCompatibilityDirectory(tkgCompatibilityFileBytes []byte) error { - compatibilityDir, err := c.tkgConfigPathsClient.GetTKGCompatibilityDirectory() - if err != nil { - return err - } - - if _, err := os.Stat(compatibilityDir); os.IsNotExist(err) { - if err = os.MkdirAll(compatibilityDir, constants.DefaultDirectoryPermissions); err != nil { - return errors.Wrap(err, "cannot create TKG Compatibility directory") - } - } - - compatibilityFilePath := filepath.Join(compatibilityDir, constants.TKGCompatibilityFileName) - err = os.WriteFile(compatibilityFilePath, tkgCompatibilityFileBytes, constants.ConfigFilePermissions) - if err != nil { - return errors.Wrap(err, "cannot create TKG Compatibility file") - } - - return nil -} -func (c *client) getDefaultTKGBOMFileNameFromCompatabilityFile() (string, error) { - compatibilityFile, err := c.tkgConfigPathsClient.GetTKGCompatibilityConfigPath() - if err != nil { - return "", errors.Wrap(err, "failed to read TKG Compatibility file") - } - - if _, err := os.Stat(compatibilityFile); os.IsNotExist(err) { - return "", errors.Wrap(err, "failed to read TKG Compatibility file") - } - - metadataContent, err := os.ReadFile(compatibilityFile) - if err != nil { - return "", errors.Wrapf(err, "unable to read TKG Compatibility file %s", compatibilityFile) - } - var metadata TKGCompatibilityMetadata - err = yaml.Unmarshal(metadataContent, &metadata) - if err != nil { - return "", errors.Wrapf(err, "failed to unmarshal TKG compatibility file %s", compatibilityFile) - } - - for idx := range metadata.ManagementClusterPluginVersions { - if strings.HasPrefix(metadata.ManagementClusterPluginVersions[idx].Version, tkgconfigpaths.TKGManagementClusterPluginVersion) { - return c.getdefaultTKGBoMFileNameFromTag(metadata.ManagementClusterPluginVersions[idx].SupportedTKGBOMVersions[0].ImageTag), nil - } - } - - return "", errors.Errorf("unable to find the supported TKG BOM version for the management plugin version %q in the TKG Compatibility file %q", tkgconfigpaths.TKGManagementClusterPluginVersion, compatibilityFile) -} -func (c *client) getDefaultBOMFileImagePathAndTagFromCompatabilityFile() (string, string, error) { - compatibilityFile, err := c.tkgConfigPathsClient.GetTKGCompatibilityConfigPath() - if err != nil { - return "", "", errors.Wrap(err, "failed to read TKG Compatibility file") - } - - if _, err := os.Stat(compatibilityFile); os.IsNotExist(err) { - return "", "", errors.Wrap(err, "failed to read TKG Compatibility file") - } - - metadataContent, err := os.ReadFile(compatibilityFile) - if err != nil { - return "", "", errors.Wrapf(err, "unable to read TKG Compatibility file %s", compatibilityFile) - } - var metadata TKGCompatibilityMetadata - err = yaml.Unmarshal(metadataContent, &metadata) - if err != nil { - return "", "", errors.Wrapf(err, "failed to unmarshal TKG compatibility file %s", compatibilityFile) - } - - for idx := range metadata.ManagementClusterPluginVersions { - if strings.HasPrefix(metadata.ManagementClusterPluginVersions[idx].Version, tkgconfigpaths.TKGManagementClusterPluginVersion) { - return metadata.ManagementClusterPluginVersions[idx].SupportedTKGBOMVersions[0].ImagePath, metadata.ManagementClusterPluginVersions[idx].SupportedTKGBOMVersions[0].ImageTag, nil - } - } - return "", "", errors.Errorf("unable to find the supported TKG BOM version for the management plugin version %q in the TKG Compatibility file %q", tkgconfigpaths.TKGManagementClusterPluginVersion, compatibilityFile) -} - -// GetManagementPackageRepositoryImage returns management package repository image -func (c *client) GetManagementPackageRepositoryImage() (string, error) { - bomConfiguration, err := c.GetDefaultTkgBOMConfiguration() - if err != nil { - return "", err - } - - tfmpComponent, ok := bomConfiguration.Components["tanzu-framework-management-packages"] - if !ok || len(tfmpComponent) == 0 { - return "", errors.New("unable to find 'tanzu-framework-management-packages' component in BoM file") - } - - tfmprImage, ok := tfmpComponent[0].Images["tanzuFrameworkManagementPackageRepositoryImageUTKG"] - if !ok || tfmprImage == nil { - return "", errors.New("unable to find 'tanzuFrameworkManagementPackageRepositoryImageUTKG' image in BoM file") - } - - repository := bomConfiguration.ImageConfig.ImageRepository - if tfmprImage.ImageRepository != "" { - repository = tfmprImage.ImageRepository - } - managementPackageRepositoryImage := fmt.Sprintf("%s/%s:%s", repository, tfmprImage.ImagePath, tfmprImage.Tag) - return managementPackageRepositoryImage, nil -} - -// GetManagementPackagesVersion returns version of management packages -func (c *client) GetManagementPackagesVersion() (string, error) { - bomConfiguration, err := c.GetDefaultTkgBOMConfiguration() - if err != nil { - return "", err - } - - tfmpComponent, ok := bomConfiguration.Components["tanzu-framework-management-packages"] - if !ok || len(tfmpComponent) == 0 { - return "", errors.New("unable to find 'tanzu-framework-management-packages' component in BoM file") - } - - return tfmpComponent[0].Version, nil -} - -// GetKappControllerPackageImage returns kapp-controller package image -func (c *client) GetKappControllerPackageImage() (string, error) { - tkrBomConfig, err := c.GetDefaultTkrBOMConfiguration() - if err != nil { - return "", err - } - - if tkrBomConfig == nil { - return "", errors.New("invalid BoM configuration") - } - - tkgCorePackagesComponent := tkrBomConfig.Components[TKGCorePackages] - if len(tkgCorePackagesComponent) == 0 && tkgCorePackagesComponent[0] == nil || tkgCorePackagesComponent[0].Images == nil { - return "", errors.Errorf("missing or invalid '%s' component as part of TKR BoM", TKGCorePackages) - } - - // Determining the kapp-controller package based on the prefix match because we can have different domain for community edition - var kappControllerImageInfo *ImageInfo - for imageName, imageInfo := range tkgCorePackagesComponent[0].Images { - if strings.HasPrefix(imageName, KappControllerPackageImagePrefix) { - kappControllerImageInfo = imageInfo - break - } - } - - if kappControllerImageInfo == nil { - return "", errors.Errorf("missing 'kapp-controller' package in the '%s' component", TKGCorePackages) - } - - kappControllerImage := fmt.Sprintf("%s/%s:%s", tkrBomConfig.ImageConfig.ImageRepository, kappControllerImageInfo.ImagePath, kappControllerImageInfo.Tag) - return kappControllerImage, nil -} diff --git a/tkg/tkgconfigbom/bom_test.go b/tkg/tkgconfigbom/bom_test.go deleted file mode 100644 index 5650d0a815..0000000000 --- a/tkg/tkgconfigbom/bom_test.go +++ /dev/null @@ -1,525 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigbom_test - -import ( - "errors" - "fmt" - "os" - "path/filepath" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/cli/clientconfighelpers" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/registry" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -var ( - testingDir string - _ = Describe("Unit tests for BOM client", func() { - var ( - bomClient tkgconfigbom.Client - fakeRegistry *fakes.Registry - tkgConfigDir string - clusterConfigFile string - kubeconfig7Path = "../fakes/config/config7.yaml" - defaultTKGBoMFileForTesting = "../fakes/config/bom/tkg-bom-v1.3.1.yaml" - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - ) - - JustBeforeEach(func() { - var err error - setupTestingFiles(clusterConfigFile, tkgConfigDir, defaultTKGBoMFileForTesting) - tkgConfigReaderWriter, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile(clusterConfigFile, filepath.Join(tkgConfigDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - - bomClient = tkgconfigbom.New(tkgConfigDir, tkgConfigReaderWriter) - }) - - Describe("When upgrading cluster with autoscaler enabled", func() { - BeforeEach(func() { - createTempDirectory() - tkgConfigDir = testingDir - clusterConfigFile = "../fakes/config/config.yaml" - }) - AfterEach(func() { - deleteTempDirectory() - }) - Context("when multiple autoscaler image tags are present for a k8s minor version", func() { - It("returns an error", func() { - _, err := bomClient.GetAutoscalerImageForK8sVersion("v1.18.0+vmware.1") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("expected one autoscaler image for kubernetes minor version \"v1.18\" but found 2")) - }) - }) - - Context("For k8s version v1.19.0+vmware.1", func() { - It("returns a valid autoscaler image", func() { - image, err := bomClient.GetAutoscalerImageForK8sVersion("v1.19.0+vmware.1") - Expect(err).NotTo(HaveOccurred()) - Expect(image).To(Equal("projects-stg.registry.vmware.com/tkg/cluster-autoscaler:v1.19.1_vmware.1")) - }) - }) - - Context("For unsupported k8s version", func() { - It("returns an error", func() { - _, err := bomClient.GetAutoscalerImageForK8sVersion("v1.16.0+vmware.1") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("autoscaler image not available for kubernetes minor version")) - }) - }) - }) - - Describe("When downloading the default BOM files from registry", func() { - BeforeEach(func() { - createTempDirectory() - tkgConfigDir = testingDir - f, _ := os.CreateTemp(testingDir, "config.yaml") - err := utils.CopyFile("../fakes/config/config.yaml", f.Name()) - Expect(err).ToNot(HaveOccurred()) - err = utils.CopyFile("../fakes/config/config.yaml", filepath.Join(tkgConfigDir, "config.yaml")) - Expect(err).ToNot(HaveOccurred()) - - clusterConfigFile = f.Name() - fakeRegistry = &fakes.Registry{} - }) - AfterEach(func() { - deleteTempDirectory() - }) - Context("when downloading the TKG BOM file fails", func() { - BeforeEach(func() { - fakeRegistry.GetFileReturns(nil, errors.New("fake GetFile error for TKG BOM file")) - }) - It("returns an error", func() { - err := bomClient.DownloadDefaultBOMFilesFromRegistry("", fakeRegistry) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to download the BOM file from image name")) - Expect(err.Error()).To(ContainSubstring("fake GetFile error for TKG BOM file")) - }) - }) - - Context("when downloading the TKG BOM file is success but fails to download TKr BOM file", func() { - BeforeEach(func() { - data, err := os.ReadFile("../fakes/config/bom/tkg-bom-v1.3.1.yaml") - Expect(err).ToNot(HaveOccurred()) - fakeRegistry.GetFileReturnsOnCall(0, data, nil) - fakeRegistry.GetFileReturnsOnCall(1, nil, errors.New("fake GetFile error for TKr BOM file")) - }) - It("should return an error", func() { - err := bomClient.DownloadDefaultBOMFilesFromRegistry("", fakeRegistry) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to download the BOM file from image name")) - Expect(err.Error()).To(ContainSubstring("fake GetFile error for TKr BOM file")) - }) - }) - Context("when downloading the TKG BOM file and TKr BOM file is success ", func() { - BeforeEach(func() { - tkgdata, err := os.ReadFile("../fakes/config/bom/tkg-bom-v1.3.1.yaml") - Expect(err).ToNot(HaveOccurred()) - tkrdata, err := os.ReadFile("../fakes/config/bom/tkg-bom-v1.3.1.yaml") - Expect(err).ToNot(HaveOccurred()) - fakeRegistry.GetFileReturnsOnCall(0, tkgdata, nil) - fakeRegistry.GetFileReturnsOnCall(1, tkrdata, nil) - }) - It("should return success", func() { - err := bomClient.DownloadDefaultBOMFilesFromRegistry("", fakeRegistry) - Expect(err).ToNot(HaveOccurred()) - }) - }) - }) - Describe("Downloading the TKG Compatibility file from registry", func() { - BeforeEach(func() { - createTempDirectory() - tkgConfigDir = testingDir - f, _ := os.CreateTemp(testingDir, "config.yaml") - err := utils.CopyFile("../fakes/config/config.yaml", f.Name()) - Expect(err).ToNot(HaveOccurred()) - err = utils.CopyFile("../fakes/config/config.yaml", filepath.Join(tkgConfigDir, "config.yaml")) - Expect(err).ToNot(HaveOccurred()) - - clusterConfigFile = f.Name() - fakeRegistry = &fakes.Registry{} - }) - AfterEach(func() { - deleteTempDirectory() - }) - Context("when listing Image tags from registry fails", func() { - BeforeEach(func() { - fakeRegistry.ListImageTagsReturns(nil, errors.New("fake ListImageTags error for TKG Compatibility Image")) - }) - It("returns an error", func() { - err := bomClient.DownloadTKGCompatibilityFileFromRegistry("", "", fakeRegistry) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to list TKG compatibility image tags")) - Expect(err.Error()).To(ContainSubstring("fake ListImageTags error for TKG Compatibility Image")) - }) - }) - - Context("when all the Image tags returned are in invalid format ", func() { - BeforeEach(func() { - fakeRegistry.ListImageTagsReturns([]string{"fake1", "fake2", "fake3"}, nil) - // fakeRegistry.GetFileCalls(func(ImagePath string, ImageTag string, filename string) ([]byte, error) { - // receivedImageTag = ImageTag - // return nil, errors.New("fake GetFile error for TKG Compatibility file") - // }) - }) - It("should return an error", func() { - err := bomClient.DownloadTKGCompatibilityFileFromRegistry("", "", fakeRegistry) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to get valid image tags for TKG compatibility image")) - - }) - }) - Context("when multiple Image tags are returned from registry but fails to download TKG Compatibility file", func() { - var receivedImageTag string - BeforeEach(func() { - fakeRegistry.ListImageTagsReturns([]string{"v3", "v1", "v2"}, nil) - fakeRegistry.GetFileCalls(func(ImageWithTag string, filename string) ([]byte, error) { - receivedImageTag = strings.Split(ImageWithTag, ":")[1] - return nil, errors.New("fake GetFile error for TKG Compatibility file") - }) - }) - It("should return an error", func() { - err := bomClient.DownloadTKGCompatibilityFileFromRegistry("", "", fakeRegistry) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to download the TKG Compatibility file from image name")) - Expect(err.Error()).To(ContainSubstring("fake GetFile error for TKG Compatibility file")) - Expect(receivedImageTag).To(Equal("v3")) - }) - }) - Context("when downloading the TKG Compatibility file is success ", func() { - BeforeEach(func() { - fakeRegistry.ListImageTagsReturns([]string{"v3", "v1", "v2"}, nil) - testTKGCompatabilityFileContent := fmt.Sprintf(testTKGCompatibilityFileFmt, tkgconfigpaths.TKGManagementClusterPluginVersion, "v1.0.0-fakeVersion") - fakeRegistry.GetFileReturns([]byte(testTKGCompatabilityFileContent), nil) - }) - It("should return success", func() { - err := bomClient.DownloadTKGCompatibilityFileFromRegistry("", "", fakeRegistry) - Expect(err).ToNot(HaveOccurred()) - }) - }) - }) - Context("When getting BOMConfiguration from TKr version", func() { - var ( - tkrVersion string - bomConfiguration *tkgconfigbom.BOMConfiguration - err error - ) - JustBeforeEach(func() { - bomConfiguration, err = bomClient.GetBOMConfigurationFromTkrVersion(tkrVersion) - }) - Context("When tkr version is missing", func() { - BeforeEach(func() { - createTempDirectory() - tkgConfigDir = testingDir - tkrVersion = "" - }) - AfterEach(func() { - deleteTempDirectory() - }) - It("Should return the bomConfiguration", func() { - Expect(err).To(HaveOccurred()) - Expect(err).To(MatchError("No BOM file found with TKr version ")) - }) - }) - Context("When tkr version(v1.18.0+vmware.1-tkg.2) is found", func() { - BeforeEach(func() { - createTempDirectory() - tkgConfigDir = testingDir - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", tkgConfigDir) - setupBomFile("../fakes/config/bom/tkr-bom-v1.19.3+vmware.1-tkg.1.yaml", tkgConfigDir) - tkrVersion = "v1.18.0+vmware.1-tkg.2" - }) - AfterEach(func() { - deleteTempDirectory() - }) - It("Should return the BOMConfiguration", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(bomConfiguration).ToNot(BeNil()) - }) - It("Should return the correct etcd configuration", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(bomConfiguration.KubeadmConfigSpec.Etcd.Local.DataDir).To(Equal("/var/lib/etcd")) - Expect(bomConfiguration.KubeadmConfigSpec.Etcd.Local.ImageRepository).To(Equal("registry.tkg.vmware.run")) - Expect(bomConfiguration.KubeadmConfigSpec.Etcd.Local.ImageTag).To(Equal("v3.4.13_vmware.4")) - Expect(len(bomConfiguration.KubeadmConfigSpec.Etcd.Local.ExtraArgs)).To(Equal(1)) - Expect(bomConfiguration.KubeadmConfigSpec.Etcd.Local.ExtraArgs["fake-arg"]).To(Equal("fake-arg-value")) - }) - }) - Context("When tkr version(v1.19.3+vmware.1-tkg.1) is found", func() { - BeforeEach(func() { - createTempDirectory() - tkgConfigDir = testingDir - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", tkgConfigDir) - setupBomFile("../fakes/config/bom/tkr-bom-v1.19.3+vmware.1-tkg.1.yaml", tkgConfigDir) - tkrVersion = "v1.19.3+vmware.1-tkg.1" - }) - AfterEach(func() { - deleteTempDirectory() - }) - It("Should return the BOMConfiguration with valid etcd data when extraArgs not defined in KubeadmConfigSpec.Etcd.Local", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(bomConfiguration).ToNot(BeNil()) - Expect(bomConfiguration.KubeadmConfigSpec.Etcd.Local.DataDir).To(Equal("/var/lib/etcd")) - Expect(bomConfiguration.KubeadmConfigSpec.Etcd.Local.ImageRepository).To(Equal("registry.tkg.vmware.run")) - Expect(bomConfiguration.KubeadmConfigSpec.Etcd.Local.ImageTag).To(Equal("v3.4.13_vmware.4")) - Expect(len(bomConfiguration.KubeadmConfigSpec.Etcd.Local.ExtraArgs)).To(Equal(0)) - }) - }) - }) - When("getting the default k8s version", func() { - var ( - actual string - err error - ) - JustBeforeEach(func() { - actual, err = bomClient.GetDefaultK8sVersion() - }) - When("the version is found", func() { - It("should return the version", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(actual).To(Equal("v1.18.0+vmware.1")) - }) - }) - }) - Context("GetDefaultClusterAPIProviders", func() { - var ( - coreProvider string - bootstrapProvider string - controlPlaneProvider string - err error - ) - JustBeforeEach(func() { - coreProvider, bootstrapProvider, controlPlaneProvider, err = bomClient.GetDefaultClusterAPIProviders() - }) - When("BoM file is present", func() { - It("Should return the provider information", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(coreProvider).To(Equal("cluster-api:v0.3.11")) - Expect(bootstrapProvider).To(Equal("kubeadm:v0.3.11")) - Expect(controlPlaneProvider).To(Equal("kubeadm:v0.3.11")) - }) - }) - }) - Context("GetAvailableK8sVersionsFromBOMFiles", func() { - var ( - actual []string - err error - ) - JustBeforeEach(func() { - actual, err = bomClient.GetAvailableK8sVersionsFromBOMFiles() - }) - When("BOM file is present", func() { - It("Should return the k8s versions", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(actual).To(ContainElements("v1.18.0+vmware.1", "v1.19.3+vmware.1")) - }) - }) - }) - Context("GetCustomRepositoryCaCertificateForClient", func() { - var ( - actual []byte - err error - ) - JustBeforeEach(func() { - actual, err = clientconfighelpers.GetCustomRepositoryCaCertificateForClient(tkgConfigReaderWriter) - }) - When("BOM file is present without a Custom Image Repository", func() { - It("should return the custom registry", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(actual).To(Equal([]byte{})) - }) - }) - When("BOM file is present without a Custom Image Repository", func() { - BeforeEach(func() { - clusterConfigFile = kubeconfig7Path - }) - It("should return the custom registry", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(actual).To(HaveLen(3626)) - }) - }) - }) - Context("InitBOMRegistry", func() { - var ( - actual registry.Registry - err error - ) - JustBeforeEach(func() { - actual, err = bomClient.InitBOMRegistry() - }) - When("Custom Registry is set", func() { - BeforeEach(func() { - clusterConfigFile = kubeconfig7Path - }) - It("Should return a registry", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(actual).ToNot(BeNil()) - }) - }) - }) - Context("IsCustomRepositorySkipTLSVerify", func() { - var actual bool - JustBeforeEach(func() { - actual = bomClient.IsCustomRepositorySkipTLSVerify() - }) - When("SkipTLSVerify is in the config file", func() { - BeforeEach(func() { - clusterConfigFile = "../fakes/config/config7.yaml" - }) - It("Should return the value of SkipTLSVerify", func() { - Expect(actual).To(BeTrue()) - }) - }) - }) - Context("GetDefaultTKRVersion", func() { - var ( - actual string - err error - ) - JustBeforeEach(func() { - actual, err = bomClient.GetDefaultTKRVersion() - }) - When("BOM file is present", func() { - It("Should return the default TKR version", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(actual).To(Equal("v1.18.0+vmware.1-tkg.2")) - }) - }) - }) - Context("GetDefaultTkgBOMConfiguration", func() { - It("Should be populated with CAPI version and the supported provider versions", func() { - bomConfiguration, err := bomClient.GetDefaultTkgBOMConfiguration() - Expect(err).ToNot(HaveOccurred()) - Expect(bomConfiguration.ProvidersVersionMap["cluster-api"]).To(Equal("v0.3.11-13-ga74685ee9")) - Expect(bomConfiguration.ProvidersVersionMap["bootstrap-kubeadm"]).To(Equal("v0.3.11-13-ga74685ee9")) - Expect(bomConfiguration.ProvidersVersionMap["control-plane-kubeadm"]).To(Equal("v0.3.11-13-ga74685ee9")) - Expect(bomConfiguration.ProvidersVersionMap["infrastructure-docker"]).To(Equal("v0.3.11-13-ga74685ee9")) - Expect(bomConfiguration.ProvidersVersionMap["infrastructure-azure"]).To(Equal("v0.4.8-47-gfbb2d55b")) - Expect(bomConfiguration.ProvidersVersionMap["infrastructure-aws"]).To(Equal("v0.6.3")) - Expect(bomConfiguration.ProvidersVersionMap["infrastructure-vsphere"]).To(Equal("v0.7.1")) - }) - }) - Context("GetFullImagePath", func() { - var ( - image *tkgconfigbom.ImageInfo - baseImageRepository string - actual string - vmwareBaseImageRepo = "vmware" - ) - JustBeforeEach(func() { - actual = tkgconfigbom.GetFullImagePath(image, baseImageRepository) - }) - When("ImageRepository is empty", func() { - BeforeEach(func() { - image = &tkgconfigbom.ImageInfo{ - ImageRepository: "", - ImagePath: "cluster-api", - } - baseImageRepository = vmwareBaseImageRepo - }) - It("Should use the baseImageRepository path", func() { - Expect(actual).To(Equal("vmware/cluster-api")) - }) - }) - When("ImageRepository is not empty", func() { - BeforeEach(func() { - image = &tkgconfigbom.ImageInfo{ - ImageRepository: "azure", - ImagePath: "cluster-api", - } - baseImageRepository = vmwareBaseImageRepo - }) - It("Should use the ImageRepository path", func() { - Expect(actual).To(Equal("azure/cluster-api")) - }) - }) - }) - }) -) - -func createTempDirectory() { - testingDir, _ = os.MkdirTemp("", "bom_test") -} - -func deleteTempDirectory() { - os.Remove(testingDir) -} - -var _ = Describe("GetK8sVersionFromTkrBoM", func() { - var ( - bomConfiguration *tkgconfigbom.BOMConfiguration - err error - ) - JustBeforeEach(func() { - _, err = tkgconfigbom.GetK8sVersionFromTkrBoM(bomConfiguration) - }) - Context("When BOMConfiguration is nil", func() { - BeforeEach(func() { - bomConfiguration = nil - }) - It("Should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err).To(MatchError("invalid BoM configuration")) - }) - }) -}) - -var testTKGCompatibilityFileFmt = ` -version: v1 -managementClusterPluginVersions: -- version: %s - supportedTKGBomVersions: - - imagePath: tkg-bom - tag: %s -` - -func setupTestingFiles(clusterConfigFile string, configDir string, defaultBomFile string) { - testClusterConfigFile := filepath.Join(configDir, "config.yaml") - err := utils.CopyFile(clusterConfigFile, testClusterConfigFile) - Expect(err).ToNot(HaveOccurred()) - - bomDir, err := tkgconfigpaths.New(configDir).GetTKGBoMDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - err = os.MkdirAll(bomDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - err = utils.CopyFile(defaultBomFile, filepath.Join(bomDir, filepath.Base(defaultBomFile))) - Expect(err).ToNot(HaveOccurred()) - - compatibilityDir, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(compatibilityDir); os.IsNotExist(err) { - err = os.MkdirAll(compatibilityDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - defaultBomFileTag := utils.GetTKGBoMTagFromFileName(filepath.Base(defaultBomFile)) - testTKGCompatabilityFileContent := fmt.Sprintf(testTKGCompatibilityFileFmt, tkgconfigpaths.TKGManagementClusterPluginVersion, defaultBomFileTag) - - compatibilityConfigFile, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityConfigPath() - Expect(err).ToNot(HaveOccurred()) - err = os.WriteFile(compatibilityConfigFile, []byte(testTKGCompatabilityFileContent), constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) -} - -func setupBomFile(defaultBomFile string, configDir string) { - bomDir, err := tkgconfigpaths.New(configDir).GetTKGBoMDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - err = os.MkdirAll(bomDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - err = utils.CopyFile(defaultBomFile, filepath.Join(bomDir, filepath.Base(defaultBomFile))) - Expect(err).ToNot(HaveOccurred()) -} diff --git a/tkg/tkgconfigbom/bom_types.go b/tkg/tkgconfigbom/bom_types.go deleted file mode 100644 index c1b130e730..0000000000 --- a/tkg/tkgconfigbom/bom_types.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigbom - -// ComponentInfo represents a BOM components information -type ComponentInfo struct { - Version string `yaml:"version"` - Images map[string]*ImageInfo `yaml:"images,omitempty"` - Metadata map[string]interface{} `yaml:"metadata,omitempty"` -} - -// OSInfo defines the struct for OS information -type OSInfo struct { - Name string `yaml:"name"` - Version string `yaml:"version"` - Arch string `yaml:"arch"` -} - -type ovaInfo struct { - Name string `yaml:"name"` - OSInfo OSInfo `yaml:"osinfo"` - Version string `yaml:"version"` - Metadata map[string]interface{} `yaml:"metadata,omitempty"` -} - -// AWSVMImages defines the collection of AMI imformation -type AWSVMImages map[string][]AMIInfo - -// AMIInfo defines the struct for AWS AMI information -type AMIInfo struct { - ID string `yaml:"id"` - OSInfo OSInfo `yaml:"osinfo"` - Metadata map[string]interface{} `yaml:"metadata,omitempty"` -} - -// AzureInfo defines the struct for Azure VM Image information -type AzureInfo struct { - // Using Image ID - ID string `json:"id" yaml:"id"` - - // Marketplace image - Publisher string `json:"publisher" yaml:"publisher"` - Offer string `json:"offer" yaml:"offer"` - Sku string `json:"sku" yaml:"sku"` - ThirdPartyImage bool `json:"thirdPartyImage" yaml:"thirdPartyImage,omitempty"` - - // Shared Gallery image - ResourceGroup string `json:"resourceGroup" yaml:"resourceGroup"` - Name string `json:"name" yaml:"name"` - SubscriptionID string `json:"subscriptionID" yaml:"subscriptionID"` - Gallery string `json:"gallery" yaml:"gallery"` - - // Applies to both Shared Gallery and Marketplace images - Version string `json:"version" yaml:"version"` - - // Os Info of the vm image mentioned - OSInfo OSInfo `json:"osinfo" yaml:"osinfo"` - - Metadata map[string]interface{} `yaml:"metadata,omitempty"` -} - -// ImageInfo defines the struct for the container images in BOM -type ImageInfo struct { - ImagePath string `yaml:"imagePath"` - Tag string `yaml:"tag"` - ImageRepository string `yaml:"imageRepository"` -} - -type imageConfig struct { - ImageRepository string `yaml:"imageRepository"` -} - -type kubeadmConfig struct { - APIVersion string `yaml:"apiVersion"` - Kind string `yaml:"kind"` - ImageRepository string `yaml:"imageRepository"` - KubernetesVersion string `yaml:"kubernetesVersion"` - Etcd etcd `yaml:"etcd"` - DNS dns `yaml:"dns"` -} - -type etcd struct { - Local *localEtcd `yaml:"local"` -} - -type localEtcd struct { - DataDir string `yaml:"dataDir"` - ImageRepository string `yaml:"imageRepository"` - ImageTag string `yaml:"imageTag"` - ExtraArgs map[string]string `yaml:"extraArgs,omitempty"` -} - -type dns struct { - Type string `yaml:"type"` - ImageRepository string `yaml:"imageRepository"` - ImageTag string `yaml:"imageTag"` -} - -type extensionInfo struct { - ClusterTypes []string `yaml:"clusterTypes"` - ManagedBy string `yaml:"managedBy"` -} - -// ReleaseInfo represents the release version information -type ReleaseInfo struct { - Version string `yaml:"version"` -} - -type defaultInfo struct { - TKRVersion string `yaml:"k8sVersion"` -} - -type tkrBOMInfo struct { - ImagePath string `yaml:"imagePath"` -} - -type tkrCompatibilityInfo struct { - ImagePath string `yaml:"imagePath"` -} - -type tkrPackageRepo struct { - AWS string `yaml:"aws"` - Azure string `yaml:"azure"` - Oracle string `yaml:"oracle"` - VSphereNonparavirt string `yaml:"vsphere-nonparavirt"` -} - -type tkrPackage struct { - AWS string `yaml:"aws"` - Azure string `yaml:"azure"` - Oracle string `yaml:"oracle"` - VSphereNonparavirt string `yaml:"vsphere-nonparavirt"` -} - -// BOMConfiguration defines the struct to represent BOM information -type BOMConfiguration struct { - Default *defaultInfo `yaml:"default"` - Release *ReleaseInfo `yaml:"release"` - Components map[string][]*ComponentInfo `yaml:"components"` - KindKubeadmConfigSpec []string `yaml:"kindKubeadmConfigSpec"` - KubeadmConfigSpec *kubeadmConfig `yaml:"kubeadmConfigSpec"` - OVA []*ovaInfo `yaml:"ova"` - AMI map[string][]AMIInfo `yaml:"ami,omitempty"` - Azure []AzureInfo `yaml:"azure,omitempty"` - ImageConfig *imageConfig `yaml:"imageConfig"` - Extensions map[string]*extensionInfo `yaml:"extensions,omitempty"` - TKRBOM *tkrBOMInfo `yaml:"tkr-bom"` - TKRCompatibility *tkrCompatibilityInfo `yaml:"tkr-compatibility"` - TKRPackageRepo *tkrPackageRepo `yaml:"tkr-package-repo"` - TKRPackage *tkrPackage `yaml:"tkr-package"` - - ProvidersVersionMap map[string]string -} - -// GetOVAVersions returns the list of OVA versions from TKR BOM -func (b *BOMConfiguration) GetOVAVersions() []string { - versions := []string{} - for _, ova := range b.OVA { - if ova != nil { - versions = append(versions, ova.Version) - } - } - return versions -} - -// DNSAddOnType defines string identifying DNS add-on types -type DNSAddOnType string diff --git a/tkg/tkgconfigbom/client.go b/tkg/tkgconfigbom/client.go deleted file mode 100644 index 0d9409089e..0000000000 --- a/tkg/tkgconfigbom/client.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tkgconfigbom provides utilities to read and manipulate BOM files -package tkgconfigbom - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/registry" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" -) - -type client struct { - configDir string - tkgConfigPathsClient tkgconfigpaths.Client - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter -} - -// New creates new tkg configuration bom client -func New(configDir string, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) Client { - tkgconfigclient := &client{ - configDir: configDir, - tkgConfigPathsClient: tkgconfigpaths.New(configDir), - tkgConfigReaderWriter: tkgConfigReaderWriter, - } - - return tkgconfigclient -} - -//go:generate counterfeiter -o ../fakes/tkgconfigbomclient.go --fake-name TKGConfigBomClient . Client - -// Client implements TKG configuration updater functions -type Client interface { - // GetBOMConfigurationFromTkrVersion gets BoM configuration based on TKr version - GetBOMConfigurationFromTkrVersion(tkrVersion string) (*BOMConfiguration, error) - // GetDefaultBOMConfiguration reads BOM file from ~/.tkg/bom/${TKGDefaultBOMFileName} location - GetDefaultTkgBOMConfiguration() (*BOMConfiguration, error) - GetDefaultTkrBOMConfiguration() (*BOMConfiguration, error) - // GetDefaultClusterAPIProviders return default cluster api providers from BOM file - // return sequence: coreProvider, bootstrapProvider, controlPlaneProvider, error - GetDefaultClusterAPIProviders() (string, string, string, error) - // GetDefaultK8sVersion return default k8s version from BOM file - GetDefaultK8sVersion() (string, error) - // GetK8sVersionFromTkrVersion returns k8s version from TKr version - GetK8sVersionFromTkrVersion(tkrVersion string) (string, error) - // GetDefaultTKGReleaseVersion return default tkg release version from BOM file - GetDefaultTKGReleaseVersion() (string, error) - // GetAvailableK8sVersionsFromBOMFiles returns list of supported K8s versions parsing BOM files - GetAvailableK8sVersionsFromBOMFiles() ([]string, error) - // GetCurrentTKGVersion returns current TKG CLI version - GetCurrentTKGVersion() string - GetCustomRepository() (string, error) - IsCustomRepositorySkipTLSVerify() bool - GetAutoscalerImageForK8sVersion(k8sVersion string) (string, error) - // Downloads the default BOM files from the registry - DownloadDefaultBOMFilesFromRegistry(bomRepo string, bomRegistry registry.Registry) error - // Downloads the TKG Compatibility file from the registry - DownloadTKGCompatibilityFileFromRegistry(repo string, resource string, bomRegistry registry.Registry) error - // Initializes the registry for downloading the bom files - InitBOMRegistry() (registry.Registry, error) - // GetDefaultTKRVersion return default TKr version from default TKG BOM file - GetDefaultTKRVersion() (string, error) - // GetDefaultBoMFilePath returns path of default BoM file - GetDefaultBoMFilePath() (string, error) - // GetDefaultBoMFileName returns name of default BoM file - GetDefaultBoMFileName() (string, error) - // GetManagementPackageRepositoryImage returns management package repository image - GetManagementPackageRepositoryImage() (string, error) - // GetManagementPackagesVersion returns version of management packages - GetManagementPackagesVersion() (string, error) - // GetKappControllerPackageImage returns kapp-controller package image - GetKappControllerPackageImage() (string, error) -} - -func (c *client) TKGConfigReaderWriter() tkgconfigreaderwriter.TKGConfigReaderWriter { - return c.tkgConfigReaderWriter -} diff --git a/tkg/tkgconfigbom/constants.go b/tkg/tkgconfigbom/constants.go deleted file mode 100644 index 86bccfd912..0000000000 --- a/tkg/tkgconfigbom/constants.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tkgconfigbom provides utilities to read and manipulate BOM files -package tkgconfigbom - -const ( - TKGCorePackages = "tkg-core-packages" - KappControllerPackageImagePrefix = "kapp-controller" -) diff --git a/tkg/tkgconfigbom/tkgcompatibility_types.go b/tkg/tkgconfigbom/tkgcompatibility_types.go deleted file mode 100644 index 755939de69..0000000000 --- a/tkg/tkgconfigbom/tkgcompatibility_types.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigbom - -// TKGSupportedBOMVersions contains ImagePath and Tag name of supported BOM. -type TKGSupportedBOMVersions struct { - ImagePath string `yaml:"imagePath"` - ImageTag string `yaml:"tag"` -} - -// ManagementClusterPluginVersion contains management cluster plugin version and the supported TKG BOM versions. -type ManagementClusterPluginVersion struct { - Version string `yaml:"version"` - SupportedTKGBOMVersions []TKGSupportedBOMVersions `yaml:"supportedTKGBomVersions"` -} - -// TKGCompatibilityMetadata contains Tanzu CLI supported TKG BOM version matrix -type TKGCompatibilityMetadata struct { - Version string `yaml:"version"` - ManagementClusterPluginVersions []ManagementClusterPluginVersion `yaml:"managementClusterPluginVersions"` -} diff --git a/tkg/tkgconfigbom/tkgconfigbom_suite_test.go b/tkg/tkgconfigbom/tkgconfigbom_suite_test.go deleted file mode 100644 index 81c54bf419..0000000000 --- a/tkg/tkgconfigbom/tkgconfigbom_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigbom_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestTkgconfigbom(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Tkgconfigbom Suite") -} diff --git a/tkg/tkgconfighelper/helper.go b/tkg/tkgconfighelper/helper.go deleted file mode 100644 index 57312255ec..0000000000 --- a/tkg/tkgconfighelper/helper.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfighelper - -import ( - "os" - "strconv" - "strings" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" -) - -// IsCustomRepository is custom image repository -func IsCustomRepository(imageRepo string) bool { - return !strings.Contains(imageRepo, constants.TKGRegistryContains) -} - -// SkipImageReferenceUpdateOnUpgrade returns true if environment variable is set -func SkipImageReferenceUpdateOnUpgrade() bool { - return os.Getenv("TKG_SKIP_IMAGE_REFERENCE_UPDATE_ON_UPGRADE") != "" -} - -// GetIntegerVariableFromConfig returns integer variable from config file -func GetIntegerVariableFromConfig(variable string, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) (int, error) { - varValue, err := tkgConfigReaderWriter.Get(variable) - if err != nil { - return 0, errors.Errorf("%s variable is not set", variable) - } - - intValue, err := strconv.Atoi(varValue) - if err != nil { - return 0, errors.Errorf("invalid %s", variable) - } - if intValue == 0 { - return 0, errors.Errorf("%s cannot be 0", variable) - } - return intValue, nil -} diff --git a/tkg/tkgconfighelper/helpers_osinfo.go b/tkg/tkgconfighelper/helpers_osinfo.go deleted file mode 100644 index ac88a633bc..0000000000 --- a/tkg/tkgconfighelper/helpers_osinfo.go +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfighelper - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" -) - -const ( - osName = "name" - osVersion = "version" - osArch = "arch" -) - -// GetDefaultOsOptions returns default OS option based on providerType -func GetDefaultOsOptions(providerType string) tkgconfigbom.OSInfo { - switch providerType { - case constants.InfrastructureProviderVSphere: - return tkgconfigbom.OSInfo{Name: "ubuntu", Version: "20.04", Arch: "amd64"} - - case constants.InfrastructureProviderAWS: - return tkgconfigbom.OSInfo{Name: "ubuntu", Version: "20.04", Arch: "amd64"} - - case constants.InfrastructureProviderAzure: - return tkgconfigbom.OSInfo{Name: "ubuntu", Version: "20.04", Arch: "amd64"} - } - return tkgconfigbom.OSInfo{} -} - -// GetOSOptionsForProviders returns OS options for the providers -// If user has configured any options, it will have higher precedence -// user provided settings gets merged with default OS options for the given provider -func GetOSOptionsForProviders(providerType string, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) tkgconfigbom.OSInfo { - osInfo := GetDefaultOsOptions(providerType) - - osName, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableOSName) - osVersion, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableOSVersion) - osArch, _ := tkgConfigReaderWriter.Get(constants.ConfigVariableOSArch) - - if osName != "" { - osInfo.Name = osName - } - if osVersion != "" { - osInfo.Version = osVersion - } - if osArch != "" { - osInfo.Arch = osArch - } - return osInfo -} - -// GetUserProvidedOsOptions returns user provided os options -func GetUserProvidedOsOptions(tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) tkgconfigbom.OSInfo { - osInfo := tkgconfigbom.OSInfo{} - - osInfo.Name, _ = tkgConfigReaderWriter.Get(constants.ConfigVariableOSName) - osInfo.Version, _ = tkgConfigReaderWriter.Get(constants.ConfigVariableOSVersion) - osInfo.Arch, _ = tkgConfigReaderWriter.Get(constants.ConfigVariableOSArch) - - return osInfo -} - -// ############################### vSphere specific helper functions ############################### - -// SelectTemplateForVsphereProviderBasedonOSOptions selects template among all for vsphere provider -func SelectTemplateForVsphereProviderBasedonOSOptions(vms []*types.VSphereVirtualMachine, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) *types.VSphereVirtualMachine { - if len(vms) == 0 { // no vms provided skipping selection - return nil - } - - userProvidedOSOptions := GetUserProvidedOsOptions(tkgConfigReaderWriter) - - if userProvidedOSOptions.Name != "" { - vms = filterVMTemplatesByOSOption(vms, osName, userProvidedOSOptions.Name) - if userProvidedOSOptions.Version != "" { - vms = filterVMTemplatesByOSOption(vms, osVersion, userProvidedOSOptions.Version) - if userProvidedOSOptions.Arch != "" { - vms = filterVMTemplatesByOSOption(vms, osArch, userProvidedOSOptions.Arch) - } - } - if len(vms) == 0 { - return nil - } - if len(vms) == 1 { - return vms[0] - } - if len(vms) > 1 { - log.V(6).Infof("multiple vm template found for given kubernetes version and OS option: %v, selecting %v", userProvidedOSOptions, vms[0].Name) - return vms[0] - } - } - - log.V(6).Info("no os options provided, selecting based on default os options") - - if len(vms) == 1 { // only one vm found, return that vm - return vms[0] - } - - vm := filterVMTemplatesByAllOsOptions(vms, GetDefaultOsOptions(constants.InfrastructureProviderVSphere)) - if vm != nil { - return vm - } - - // TODO: remove this and return nil - // currently added this line because we do not have v1.19.3 vm templates with OS information present under vAppConfig - log.Infof("No vm template found matching user provided os configuration or default os configuration, selecting '%v'", vms[0].Name) - return vms[0] -} - -func filterVMTemplatesByOSOption(vms []*types.VSphereVirtualMachine, osOption, osOptionValue string) []*types.VSphereVirtualMachine { - filteredVms := []*types.VSphereVirtualMachine{} - for _, vm := range vms { - switch osOption { - case osName: - if vm.DistroName == osOptionValue { - filteredVms = append(filteredVms, vm) - } - case osVersion: - if vm.DistroVersion == osOptionValue { - filteredVms = append(filteredVms, vm) - } - case osArch: - if vm.DistroArch == osOptionValue { - filteredVms = append(filteredVms, vm) - } - } - } - return filteredVms -} - -func filterVMTemplatesByAllOsOptions(vms []*types.VSphereVirtualMachine, osOption tkgconfigbom.OSInfo) *types.VSphereVirtualMachine { - for _, vm := range vms { - if vm.DistroName == osOption.Name && vm.DistroVersion == osOption.Version && vm.DistroArch == osOption.Arch { - return vm - } - } - return nil -} - -// ############################### Azure specific helper functions ############################### - -// SelectAzureImageBasedonOSOptions selects template among all for azure images -func SelectAzureImageBasedonOSOptions(azureImages []tkgconfigbom.AzureInfo, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) *tkgconfigbom.AzureInfo { // nolint:dupl - if len(azureImages) == 0 { // no image provided skipping selection - return nil - } - - userProvidedOSOptions := GetUserProvidedOsOptions(tkgConfigReaderWriter) - - if userProvidedOSOptions.Name != "" { - azureImages = filterAzureImagesByOSOption(azureImages, osName, userProvidedOSOptions.Name) - if userProvidedOSOptions.Version != "" { - azureImages = filterAzureImagesByOSOption(azureImages, osVersion, userProvidedOSOptions.Version) - if userProvidedOSOptions.Arch != "" { - azureImages = filterAzureImagesByOSOption(azureImages, osArch, userProvidedOSOptions.Arch) - } - } - if len(azureImages) == 0 { - return nil - } - if len(azureImages) == 1 { - return &azureImages[0] - } - if len(azureImages) > 1 { - log.V(9).Infof("multiple azure images found for given kubernetes version and OS option: %v, selecting %v", userProvidedOSOptions, azureImages[0]) - return &azureImages[0] - } - } - - log.V(6).Info("no os options provided, selecting based on default os options") - - if len(azureImages) == 1 { // only one image found, return that vm - return &azureImages[0] - } - - azureImage := filterAzureImagesByAllOsOptions(azureImages, GetDefaultOsOptions(constants.InfrastructureProviderAzure)) - if azureImage != nil { - return azureImage - } - - return nil -} - -func filterAzureImagesByOSOption(azureImages []tkgconfigbom.AzureInfo, osOption, osOptionValue string) []tkgconfigbom.AzureInfo { - filteredAzureImages := []tkgconfigbom.AzureInfo{} - for i := range azureImages { - switch osOption { - case osName: - if azureImages[i].OSInfo.Name == osOptionValue { - filteredAzureImages = append(filteredAzureImages, azureImages[i]) - } - case osVersion: - if azureImages[i].OSInfo.Version == osOptionValue { - filteredAzureImages = append(filteredAzureImages, azureImages[i]) - } - case osArch: - if azureImages[i].OSInfo.Arch == osOptionValue { - filteredAzureImages = append(filteredAzureImages, azureImages[i]) - } - } - } - return filteredAzureImages -} - -func filterAzureImagesByAllOsOptions(azureImages []tkgconfigbom.AzureInfo, osOption tkgconfigbom.OSInfo) *tkgconfigbom.AzureInfo { - for i := range azureImages { - if azureImages[i].OSInfo.Name == osOption.Name && azureImages[i].OSInfo.Version == osOption.Version && azureImages[i].OSInfo.Arch == osOption.Arch { - return &azureImages[i] - } - } - return nil -} - -// ############################### AWS specific helper functions ############################### - -// SelectAWSImageBasedonOSOptions selects template among all for azure images -func SelectAWSImageBasedonOSOptions(amis []tkgconfigbom.AMIInfo, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) *tkgconfigbom.AMIInfo { //nolint:dupl - if len(amis) == 0 { // no image provided skipping selection - return nil - } - - userProvidedOSOptions := GetUserProvidedOsOptions(tkgConfigReaderWriter) - - if userProvidedOSOptions.Name != "" { - amis = filterAMIsByOSOption(amis, osName, userProvidedOSOptions.Name) - if userProvidedOSOptions.Version != "" { - amis = filterAMIsByOSOption(amis, osVersion, userProvidedOSOptions.Version) - if userProvidedOSOptions.Arch != "" { - amis = filterAMIsByOSOption(amis, osArch, userProvidedOSOptions.Arch) - } - } - if len(amis) == 0 { - return nil - } - if len(amis) == 1 { - return &amis[0] - } - if len(amis) > 1 { - log.V(6).Infof("multiple aws images found for given kubernetes version and OS option: %v, selecting %v", userProvidedOSOptions, amis[0]) - return &amis[0] - } - } - - log.V(6).Info("no os options provided, selecting based on default os options") - - if len(amis) == 1 { // only one image found, return that vm - return &amis[0] - } - - ami := filterAMIsByAllOsOptions(amis, GetDefaultOsOptions(constants.InfrastructureProviderAWS)) - if ami != nil { - return ami - } - - return nil -} - -func filterAMIsByOSOption(amis []tkgconfigbom.AMIInfo, osOption, osOptionValue string) []tkgconfigbom.AMIInfo { - filteredAMIs := []tkgconfigbom.AMIInfo{} - for _, ami := range amis { - switch osOption { - case osName: - if ami.OSInfo.Name == osOptionValue { - filteredAMIs = append(filteredAMIs, ami) - } - case osVersion: - if ami.OSInfo.Version == osOptionValue { - filteredAMIs = append(filteredAMIs, ami) - } - case osArch: - if ami.OSInfo.Arch == osOptionValue { - filteredAMIs = append(filteredAMIs, ami) - } - } - } - return filteredAMIs -} - -func filterAMIsByAllOsOptions(amis []tkgconfigbom.AMIInfo, osOption tkgconfigbom.OSInfo) *tkgconfigbom.AMIInfo { - for _, ami := range amis { - if ami.OSInfo.Name == osOption.Name && ami.OSInfo.Version == osOption.Version && ami.OSInfo.Arch == osOption.Arch { - return &ami - } - } - return nil -} - -// GetDefaultOsOptionsForTKG12 returns default OS option based on providerType -func GetDefaultOsOptionsForTKG12(providerType string) tkgconfigbom.OSInfo { - switch providerType { - case constants.InfrastructureProviderVSphere: - return tkgconfigbom.OSInfo{Name: "photon", Version: "3", Arch: "amd64"} - - case constants.InfrastructureProviderAWS: - return tkgconfigbom.OSInfo{Name: "amazon", Version: "2", Arch: "amd64"} - - case constants.InfrastructureProviderAzure: - return tkgconfigbom.OSInfo{Name: "ubuntu", Version: "18.04", Arch: "amd64"} - } - return tkgconfigbom.OSInfo{} -} diff --git a/tkg/tkgconfighelper/tkgconfighelper_test.go b/tkg/tkgconfighelper/tkgconfighelper_test.go deleted file mode 100644 index 0e839210fe..0000000000 --- a/tkg/tkgconfighelper/tkgconfighelper_test.go +++ /dev/null @@ -1,693 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfighelper_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - . "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfighelper" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" -) - -const ( - k8sVersion1dot18dot16vmware4 = "v1.18.16+vmware.4" - k8sVersion1dot18dot1vmware1 = "v1.18.1+vmware.1" - k8sVersion1dot19dot1vmware1 = "v1.19.1+vmware.1" - k8sVersion2dot16dot1vmware1 = "v2.16.1+vmware.1" - k8sVersion1dot25dot6vmware1 = "v1.25.6+vmware.1" - tkgVersion1dot0dot0 = "v1.0.0" - tkgVersion1dot1dot0 = "v1.1.0" - tkgVersion1dot1dot0rc1 = "v1.1.0-rc.1" -) - -func TestTKGConfig(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Tkg config helper Suite") -} - -var _ = Describe("ValidateK8sVersionSupport", func() { - var ( - err error - mgmtClusterVersion string - kubernetesVersion string - ) - - JustBeforeEach(func() { - err = ValidateK8sVersionSupport(mgmtClusterVersion, kubernetesVersion) - }) - - Context("when k8s version is not supported by management cluster", func() { - Context("mgmtClusterVersion= v1.0.0, kubernetesVersion=v1.18.1+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = tkgVersion1dot0dot0 - kubernetesVersion = k8sVersion1dot18dot1vmware1 - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("kubernetes version v1.18.1+vmware.1 is not supported on current v1.0.0 management cluster. Please upgrade management cluster if you are trying to deploy latest version of kubernetes")) - }) - }) - Context("mgmtClusterVersion= v1.0.0, kubernetesVersion=v1.18.2", func() { - BeforeEach(func() { - mgmtClusterVersion = tkgVersion1dot0dot0 - kubernetesVersion = "v1.18.2" - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("kubernetes version v1.18.2 is not supported on current v1.0.0 management cluster. Please upgrade management cluster if you are trying to deploy latest version of kubernetes")) - }) - }) - Context("mgmtClusterVersion= v1.0.0, kubernetesVersion=v1.16.1+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = tkgVersion1dot0dot0 - kubernetesVersion = "v1.16.1+vmware.1" - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("kubernetes version v1.16.1+vmware.1 is not supported on current v1.0.0 management cluster.")) - }) - }) - Context("mgmtClusterVersion= v1.0.0, kubernetesVersion=v2.18.1+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = tkgVersion1dot0dot0 - kubernetesVersion = k8sVersion2dot16dot1vmware1 - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("kubernetes version v2.16.1+vmware.1 is not supported on current v1.0.0 management cluster.")) - }) - }) - - Context("mgmtClusterVersion= v1.1.0-rc.1, kubernetesVersion=v2.18.1+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = "v1.1.0-rc.1" - kubernetesVersion = k8sVersion2dot16dot1vmware1 - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("kubernetes version v2.16.1+vmware.1 is not supported on current v1.1.0-rc.1 management cluster.")) - }) - }) - Context("mgmtClusterVersion= v1.1.0, kubernetesVersion=v2.18.1+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = tkgVersion1dot1dot0 - kubernetesVersion = k8sVersion2dot16dot1vmware1 - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("kubernetes version v2.16.1+vmware.1 is not supported on current v1.1.0 management cluster.")) - }) - }) - Context("mgmtClusterVersion= v1.1.1, kubernetesVersion=v1.19.1+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = "v1.1.1" - kubernetesVersion = k8sVersion1dot19dot1vmware1 - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("kubernetes version v1.19.1+vmware.1 is not supported on current v1.1.1 management cluster.")) - }) - }) - Context("mgmtClusterVersion= v1.2.1, kubernetesVersion=v1.20.1+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = "v1.2.1" - kubernetesVersion = "v1.20.1+vmware.1" - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("kubernetes version v1.20.1+vmware.1 is not supported on current v1.2.1 management cluster.")) - }) - }) - Context("mgmtClusterVersion= v3.6.0, kubernetesVersion=v1.21.1+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = "v3.6.0" - kubernetesVersion = "v1.21.1+vmware.1" - }) - It("should return error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("only [v1.0 v1.1 v1.2 v1.3 v1.4 v1.5 v1.6 v1.7 v2.1 v2.2] management cluster versions are supported with current version of TKG CLI. Please upgrade TKG CLI to latest version if you are using it on latest version of management cluster.")) - }) - }) - }) - - Context("when k8s version is supported by management cluster", func() { - Context("mgmtClusterVersion= v1.0.0, kubernetesVersion=v1.17.3+vmware.2", func() { - BeforeEach(func() { - mgmtClusterVersion = tkgVersion1dot0dot0 - kubernetesVersion = "v1.17.3+vmware.2" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("mgmtClusterVersion= v1.0.1, kubernetesVersion=v1.17.3+vmware.5", func() { - BeforeEach(func() { - mgmtClusterVersion = "v1.0.1" - kubernetesVersion = "v1.17.3+vmware.5" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("mgmtClusterVersion= v1.0.0, kubernetesVersion=v1.17.5+vmware.2", func() { - BeforeEach(func() { - mgmtClusterVersion = tkgVersion1dot0dot0 - kubernetesVersion = "v1.17.5+vmware.2" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("mgmtClusterVersion= v1.0.0, kubernetesVersion=v1.17.12+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = tkgVersion1dot0dot0 - kubernetesVersion = "v1.17.12+vmware.1" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - Context("mgmtClusterVersion= v1.1.0-rc.1, kubernetesVersion=v1.18.1+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = tkgVersion1dot1dot0rc1 - kubernetesVersion = k8sVersion1dot18dot1vmware1 - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("mgmtClusterVersion= v1.1.0, kubernetesVersion=v1.17.9+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = tkgVersion1dot1dot0 - kubernetesVersion = "v1.17.9+vmware.1" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("mgmtClusterVersion= v1.1.4, kubernetesVersion=v1.17.19+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = "v1.1.4" - kubernetesVersion = "v1.17.19+vmware.1" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("mgmtClusterVersion= v1.1.0, kubernetesVersion=v1.18.2+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = tkgVersion1dot1dot0 - kubernetesVersion = "v1.18.2+vmware.1" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("mgmtClusterVersion= v1.1.10, kubernetesVersion=v1.18.16+vmware.4", func() { - BeforeEach(func() { - mgmtClusterVersion = "v1.1.10" - kubernetesVersion = k8sVersion1dot18dot16vmware4 - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("mgmtClusterVersion= v1.2.0, kubernetesVersion=v1.17.19+vmware.4", func() { - BeforeEach(func() { - mgmtClusterVersion = "v1.2.0" - kubernetesVersion = "v1.17.19+vmware.4" - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("mgmtClusterVersion= v1.2.4, kubernetesVersion=v1.18.16+vmware.4", func() { - BeforeEach(func() { - mgmtClusterVersion = "v1.2.4" - kubernetesVersion = k8sVersion1dot18dot16vmware4 - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("mgmtClusterVersion= v1.2.10, kubernetesVersion=v1.19.1+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = "v1.2.10" - kubernetesVersion = k8sVersion1dot19dot1vmware1 - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - Context("mgmtClusterVersion= v2.2.0, kubernetesVersion=v1.25.6+vmware.1", func() { - BeforeEach(func() { - mgmtClusterVersion = "v2.2.0" - kubernetesVersion = k8sVersion1dot25dot6vmware1 - }) - It("should not return error", func() { - Expect(err).NotTo(HaveOccurred()) - }) - }) - - }) -}) - -var _ = Describe("GetDefaultOsOptions", func() { - var providerType string - var actual tkgconfigbom.OSInfo - - JustBeforeEach(func() { - actual = GetDefaultOsOptions(providerType) - }) - Context("When provider type is vsphere", func() { - BeforeEach(func() { - providerType = constants.InfrastructureProviderVSphere - }) - It("should return the correct OSInfo", func() { - Expect(actual).To(Equal(tkgconfigbom.OSInfo{ - Name: "ubuntu", - Version: "20.04", - Arch: "amd64", - })) - }) - }) - Context("When provider type is aws", func() { - BeforeEach(func() { - providerType = constants.InfrastructureProviderAWS - }) - It("should return the correct OSInfo", func() { - Expect(actual).To(Equal(tkgconfigbom.OSInfo{ - Name: "ubuntu", - Version: "20.04", - Arch: "amd64", - })) - }) - }) - Context("When provider type is azure", func() { - BeforeEach(func() { - providerType = constants.InfrastructureProviderAzure - }) - It("should return the correct OSInfo", func() { - Expect(actual).To(Equal(tkgconfigbom.OSInfo{ - Name: "ubuntu", - Version: "20.04", - Arch: "amd64", - })) - }) - }) - Context("When provider type is empty", func() { - BeforeEach(func() { - providerType = "" - }) - It("should return empty OSInfo", func() { - Expect(actual).To(Equal(tkgconfigbom.OSInfo{ - Name: "", - Version: "", - Arch: "", - })) - }) - }) -}) - -var _ = Describe("GetOSOptionsForProviders", func() { - var ( - providerType string - tkgConfigReaderWriter *fakes.TKGConfigReaderWriter - actual tkgconfigbom.OSInfo - ) - JustBeforeEach(func() { - actual = GetOSOptionsForProviders(providerType, tkgConfigReaderWriter) - }) - Context("When providerType is empty", func() { - BeforeEach(func() { - providerType = "" - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - tkgConfigReaderWriter.GetReturnsOnCall(0, "ubuntu", nil) - tkgConfigReaderWriter.GetReturnsOnCall(1, "20.04", nil) - tkgConfigReaderWriter.GetReturnsOnCall(2, "amd64", nil) - }) - It("Should populate OSInfo from the TKG Config", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.Arch).To(Equal("amd64")) - Expect(actual.Name).To(Equal("ubuntu")) - Expect(actual.Version).To(Equal("20.04")) - }) - }) -}) - -var _ = Describe("GetUserProvidedOsOptions", func() { - var ( - tkgConfigReaderWriter *fakes.TKGConfigReaderWriter - actual tkgconfigbom.OSInfo - ) - JustBeforeEach(func() { - actual = GetUserProvidedOsOptions(tkgConfigReaderWriter) - }) - Context("When tkgConfigReaderWriter is present", func() { - BeforeEach(func() { - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - tkgConfigReaderWriter.GetReturnsOnCall(0, "ubuntu", nil) - tkgConfigReaderWriter.GetReturnsOnCall(1, "20.04", nil) - tkgConfigReaderWriter.GetReturnsOnCall(2, "amd64", nil) - }) - It("Should populate the OSInfo from the config", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.Arch).To(Equal("amd64")) - Expect(actual.Name).To(Equal("ubuntu")) - Expect(actual.Version).To(Equal("20.04")) - }) - }) -}) - -var _ = Describe("SelectTemplateForVsphereProviderBasedonOSOptions", func() { - var ( - vms []*types.VSphereVirtualMachine - tkgConfigReaderWriter *fakes.TKGConfigReaderWriter - actual *types.VSphereVirtualMachine - ) - JustBeforeEach(func() { - actual = SelectTemplateForVsphereProviderBasedonOSOptions(vms, tkgConfigReaderWriter) - }) - Context("When vms is empty", func() { - BeforeEach(func() { - vms = []*types.VSphereVirtualMachine{} - }) - It("should return nil", func() { - Expect(actual).To(BeNil()) - }) - }) - Context("When no user OS option is present and there is only one vm", func() { - BeforeEach(func() { - vms = []*types.VSphereVirtualMachine{ - { - Name: "photon-3-kube-v1.20.5+vmware.1", - }, - } - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - tkgConfigReaderWriter.GetReturnsOnCall(0, "", nil) - tkgConfigReaderWriter.GetReturnsOnCall(1, "", nil) - tkgConfigReaderWriter.GetReturnsOnCall(2, "", nil) - }) - It("should return just that VM", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.Name).To(Equal("photon-3-kube-v1.20.5+vmware.1")) - }) - }) - Context("When user options present and there are many vms", func() { - BeforeEach(func() { - vms = []*types.VSphereVirtualMachine{ - { - DistroName: "ubuntu", - DistroVersion: "20.04", - DistroArch: "amd64", - }, - { - DistroName: "photon", - DistroVersion: "3.0", - DistroArch: "amd64", - }, - } - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - tkgConfigReaderWriter.GetReturnsOnCall(0, "ubuntu", nil) - tkgConfigReaderWriter.GetReturnsOnCall(1, "20.04", nil) - tkgConfigReaderWriter.GetReturnsOnCall(2, "amd64", nil) - }) - It("Should return a single vm", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.DistroArch).To(Equal("amd64")) - Expect(actual.DistroName).To(Equal("ubuntu")) - Expect(actual.DistroVersion).To(Equal("20.04")) - }) - }) - Context("When user options present and there are many vms with the same distro", func() { - BeforeEach(func() { - vms = []*types.VSphereVirtualMachine{ - { - DistroName: "ubuntu", - DistroVersion: "20.04", - DistroArch: "amd64", - }, - { - DistroName: "ubuntu", - DistroVersion: "21.01", - DistroArch: "arm7", - }, - } - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - tkgConfigReaderWriter.GetReturnsOnCall(0, "ubuntu", nil) - tkgConfigReaderWriter.GetReturnsOnCall(1, "", nil) - tkgConfigReaderWriter.GetReturnsOnCall(2, "", nil) - }) - It("Should return the first one vm", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.DistroArch).To(Equal("amd64")) - Expect(actual.DistroName).To(Equal("ubuntu")) - Expect(actual.DistroVersion).To(Equal("20.04")) - }) - }) -}) - -var _ = Describe("SelectAzureImageBasedonOSOptions", func() { - var ( - azureImages []tkgconfigbom.AzureInfo - tkgConfigReaderWriter *fakes.TKGConfigReaderWriter - actual *tkgconfigbom.AzureInfo - ) - JustBeforeEach(func() { - actual = SelectAzureImageBasedonOSOptions(azureImages, tkgConfigReaderWriter) - }) - Context("When azureImages is empty", func() { - BeforeEach(func() { - azureImages = []tkgconfigbom.AzureInfo{} - }) - It("should return nil", func() { - Expect(actual).To(BeNil()) - }) - }) - Context("When no user OS option is present and there is only one vm", func() { - BeforeEach(func() { - azureImages = []tkgconfigbom.AzureInfo{ - { - Name: "photon-3-kube-v1.20.5+vmware.1", - }, - } - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - tkgConfigReaderWriter.GetReturnsOnCall(0, "", nil) - tkgConfigReaderWriter.GetReturnsOnCall(1, "", nil) - tkgConfigReaderWriter.GetReturnsOnCall(2, "", nil) - }) - It("should return just that VM", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.Name).To(Equal("photon-3-kube-v1.20.5+vmware.1")) - }) - }) - Context("When user options present and there are many vms", func() { - BeforeEach(func() { - azureImages = []tkgconfigbom.AzureInfo{ - { - OSInfo: tkgconfigbom.OSInfo{ - Name: "ubuntu", - Version: "20.04", - Arch: "amd64", - }, - }, - { - OSInfo: tkgconfigbom.OSInfo{ - Name: "photon", - Version: "3.0", - Arch: "amd64", - }, - }, - } - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - tkgConfigReaderWriter.GetReturnsOnCall(0, "ubuntu", nil) - tkgConfigReaderWriter.GetReturnsOnCall(1, "20.04", nil) - tkgConfigReaderWriter.GetReturnsOnCall(2, "amd64", nil) - }) - It("Should return a single vm", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.OSInfo.Arch).To(Equal("amd64")) - Expect(actual.OSInfo.Name).To(Equal("ubuntu")) - Expect(actual.OSInfo.Version).To(Equal("20.04")) - }) - }) - Context("When user options present and there are many vms with the same distro", func() { - BeforeEach(func() { - azureImages = []tkgconfigbom.AzureInfo{ - { - OSInfo: tkgconfigbom.OSInfo{ - Name: "ubuntu", - Version: "20.04", - Arch: "amd64", - }, - }, - { - OSInfo: tkgconfigbom.OSInfo{ - Name: "ubuntu", - Version: "21.01", - Arch: "arm7", - }, - }, - } - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - tkgConfigReaderWriter.GetReturnsOnCall(0, "ubuntu", nil) - tkgConfigReaderWriter.GetReturnsOnCall(1, "", nil) - tkgConfigReaderWriter.GetReturnsOnCall(2, "", nil) - }) - It("Should return the first one vm", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.OSInfo.Arch).To(Equal("amd64")) - Expect(actual.OSInfo.Name).To(Equal("ubuntu")) - Expect(actual.OSInfo.Version).To(Equal("20.04")) - }) - }) -}) - -var _ = Describe("SelectAWSImageBasedonOSOptions", func() { - var ( - amis []tkgconfigbom.AMIInfo - tkgConfigReaderWriter *fakes.TKGConfigReaderWriter - actual *tkgconfigbom.AMIInfo - ) - JustBeforeEach(func() { - actual = SelectAWSImageBasedonOSOptions(amis, tkgConfigReaderWriter) - }) - Context("When amis is empty", func() { - BeforeEach(func() { - amis = []tkgconfigbom.AMIInfo{} - }) - It("should return nil", func() { - Expect(actual).To(BeNil()) - }) - }) - Context("When no user OS option is present and there is only one vm", func() { - BeforeEach(func() { - amis = []tkgconfigbom.AMIInfo{ - { - OSInfo: tkgconfigbom.OSInfo{ - Name: "photon-3-kube-v1.20.5+vmware.1", - }, - }, - } - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - tkgConfigReaderWriter.GetReturnsOnCall(0, "", nil) - tkgConfigReaderWriter.GetReturnsOnCall(1, "", nil) - tkgConfigReaderWriter.GetReturnsOnCall(2, "", nil) - }) - It("should return just that VM", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.OSInfo.Name).To(Equal("photon-3-kube-v1.20.5+vmware.1")) - }) - }) - Context("When user options present and there are many vms", func() { - BeforeEach(func() { - amis = []tkgconfigbom.AMIInfo{ - { - OSInfo: tkgconfigbom.OSInfo{ - Name: "ubuntu", - Version: "20.04", - Arch: "amd64", - }, - }, - { - OSInfo: tkgconfigbom.OSInfo{ - Name: "photon", - Version: "3.0", - Arch: "amd64", - }, - }, - } - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - tkgConfigReaderWriter.GetReturnsOnCall(0, "ubuntu", nil) - tkgConfigReaderWriter.GetReturnsOnCall(1, "20.04", nil) - tkgConfigReaderWriter.GetReturnsOnCall(2, "amd64", nil) - }) - It("Should return a single vm", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.OSInfo.Arch).To(Equal("amd64")) - Expect(actual.OSInfo.Name).To(Equal("ubuntu")) - Expect(actual.OSInfo.Version).To(Equal("20.04")) - }) - }) - Context("When user options present and there are many vms with the same distro", func() { - BeforeEach(func() { - amis = []tkgconfigbom.AMIInfo{ - { - OSInfo: tkgconfigbom.OSInfo{ - Name: "ubuntu", - Version: "20.04", - Arch: "amd64", - }, - }, - { - OSInfo: tkgconfigbom.OSInfo{ - Name: "ubuntu", - Version: "21.01", - Arch: "arm7", - }, - }, - } - tkgConfigReaderWriter = &fakes.TKGConfigReaderWriter{} - tkgConfigReaderWriter.GetReturnsOnCall(0, "ubuntu", nil) - tkgConfigReaderWriter.GetReturnsOnCall(1, "", nil) - tkgConfigReaderWriter.GetReturnsOnCall(2, "", nil) - }) - It("Should return the first one vm", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.OSInfo.Arch).To(Equal("amd64")) - Expect(actual.OSInfo.Name).To(Equal("ubuntu")) - Expect(actual.OSInfo.Version).To(Equal("20.04")) - }) - }) -}) - -var _ = Describe("GetDefaultOsOptionsForTKG12", func() { - var ( - providerType string - actual tkgconfigbom.OSInfo - ) - JustBeforeEach(func() { - actual = GetDefaultOsOptionsForTKG12(providerType) - }) - Context("When providerType is vpshere", func() { - BeforeEach(func() { - providerType = constants.InfrastructureProviderVSphere - }) - It("should return the correct OSInfo", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.Arch).To(Equal("amd64")) - Expect(actual.Name).To(Equal("photon")) - Expect(actual.Version).To(Equal("3")) - }) - }) - Context("When providerType is aws", func() { - BeforeEach(func() { - providerType = constants.InfrastructureProviderAWS - }) - It("should return the correct OSInfo", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.Arch).To(Equal("amd64")) - Expect(actual.Name).To(Equal("amazon")) - Expect(actual.Version).To(Equal("2")) - }) - }) - Context("When providerType is azure", func() { - BeforeEach(func() { - providerType = constants.InfrastructureProviderAzure - }) - It("should return the correct OSInfo", func() { - Expect(actual).ToNot(BeNil()) - Expect(actual.Arch).To(Equal("amd64")) - Expect(actual.Name).To(Equal("ubuntu")) - Expect(actual.Version).To(Equal("18.04")) - }) - }) -}) diff --git a/tkg/tkgconfighelper/validate.go b/tkg/tkgconfighelper/validate.go deleted file mode 100644 index fc5a2bd877..0000000000 --- a/tkg/tkgconfighelper/validate.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tkgconfighelper provides various helpers and utilities -package tkgconfighelper - -import ( - "fmt" - "sort" - - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/util/version" -) - -// ManagementClusterVersionToK8sVersionSupportMatrix defines the support matrix of which k8s version -// are supported based on management cluster version -var ManagementClusterVersionToK8sVersionSupportMatrix = map[string][]string{ - "v1.0": {"v1.17"}, - "v1.1": {"v1.17", "v1.18"}, - "v1.2": {"v1.17", "v1.18", "v1.19"}, - "v1.3": {"v1.17", "v1.18", "v1.19", "v1.20"}, - "v1.4": {"v1.17", "v1.18", "v1.19", "v1.20", "v1.21"}, - "v1.5": {"v1.19", "v1.20", "v1.21", "v1.22"}, - "v1.6": {"v1.20", "v1.21", "v1.22", "v1.23"}, - "v1.7": {"v1.21", "v1.22", "v1.23", "v1.24"}, - "v2.1": {"v1.21", "v1.22", "v1.23", "v1.24"}, - "v2.2": {"v1.21", "v1.22", "v1.23", "v1.24", "v1.25"}, -} - -// ValidateK8sVersionSupport validates the k8s version is supported on management cluster or not -func ValidateK8sVersionSupport(mgmtClusterTkgVersion, kubernetesVersion string) error { - mgmtClusterSemVersion, err := version.ParseSemantic(mgmtClusterTkgVersion) - if err != nil { - return errors.Wrapf(err, "unable to parse management cluster version %s", mgmtClusterTkgVersion) - } - - k8sSemVersion, err := version.ParseSemantic(kubernetesVersion) - if err != nil { - return errors.Wrapf(err, "unable to parse kubernetes version %s", kubernetesVersion) - } - - mgmtClusterMajorMinorVersion := fmt.Sprintf("v%v.%v", mgmtClusterSemVersion.Major(), mgmtClusterSemVersion.Minor()) - k8sMajorMinorVersion := fmt.Sprintf("v%v.%v", k8sSemVersion.Major(), k8sSemVersion.Minor()) - - supportedK8sVersions, exists := ManagementClusterVersionToK8sVersionSupportMatrix[mgmtClusterMajorMinorVersion] - if !exists { - supportedManagementClusterVersions := []string{} - for mcVersion := range ManagementClusterVersionToK8sVersionSupportMatrix { - supportedManagementClusterVersions = append(supportedManagementClusterVersions, mcVersion) - } - sort.Strings(supportedManagementClusterVersions) - return errors.Errorf("only %v management cluster versions are supported with current version of TKG CLI. Please upgrade TKG CLI to latest version if you are using it on latest version of management cluster.", supportedManagementClusterVersions) - } - - for _, supportedK8sVersion := range supportedK8sVersions { - if supportedK8sVersion == k8sMajorMinorVersion { - // if k8sMajorMinorVersion matches with the supported supportedK8sVersion then return nil and - // specified k8s version is compatible with the current management cluster - return nil - } - } - - errMsg := fmt.Sprintf("kubernetes version %s is not supported on current %v management cluster. ", kubernetesVersion, mgmtClusterTkgVersion) - - // if current CLI version supports specified k8s version after upgrading management cluster show the below error message as well. - if mgmtClusterMajorMinorVersion != "v1.1" && ValidateK8sVersionSupport("v1.1.0", kubernetesVersion) == nil { - errMsg += "Please upgrade management cluster if you are trying to deploy latest version of kubernetes." - } - - return errors.New(errMsg) -} diff --git a/tkg/tkgconfigpaths/client.go b/tkg/tkgconfigpaths/client.go deleted file mode 100644 index 2948ffbf09..0000000000 --- a/tkg/tkgconfigpaths/client.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tkgconfigpaths provides utilities to get info related to TKG configuration paths. -package tkgconfigpaths - -type client struct { - configDir string -} - -// New creates new tkg configuration paths client -func New(configDir string) Client { - tkgconfigpaths := &client{ - configDir: configDir, - } - return tkgconfigpaths -} - -// Client implements TKG configuration paths functions -type Client interface { - // GetTKGDirectory returns path to tkg config directory "$HOME/.tkg" - GetTKGDirectory() (string, error) - - // GetTKGProvidersDirectory returns path to tkg config directory "$HOME/.tkg/providers" - GetTKGProvidersDirectory() (string, error) - - // GetTKGProvidersCheckSumPath returns path to the providers checksum file - GetTKGProvidersCheckSumPath() (string, error) - - // GetTKGCompatibilityDirectory returns path to tkg compatibility directory "/compatibility" - GetTKGCompatibilityDirectory() (string, error) - - // GetTKGBoMDirectory returns path to tkg config directory "$HOME/.tkg/bom" - GetTKGBoMDirectory() (string, error) - - // GetTKGConfigDirectories returns tkg config directories in below order - // (tkgDir, bomDir, providersDir, error) - GetTKGConfigDirectories() (string, string, string, error) - - // GetProvidersConfigFilePath returns config file path from providers dir - // "$HOME/.tkg/providers/config.yaml" - GetProvidersConfigFilePath() (string, error) - - // GetTKGConfigPath returns tkg configfile path - GetTKGConfigPath() (string, error) - - // GetDefaultClusterConfigPath returns default cluster config file path - GetDefaultClusterConfigPath() (string, error) - - // GetTKGCompatibilityConfigPath returns TKG compatibility file path - GetTKGCompatibilityConfigPath() (string, error) - - // GetConfigDefaultsFilePath returns config_default.yaml file path under TKG directory - GetConfigDefaultsFilePath() (string, error) - - // GetLogDirectory returns the directory path where log files should be stored by default. - GetLogDirectory() (string, error) - - // GetClusterConfigurationDirectory returns the directory path where cluster configuration files will be stored - GetClusterConfigurationDirectory() (string, error) -} diff --git a/tkg/tkgconfigpaths/filepaths.go b/tkg/tkgconfigpaths/filepaths.go deleted file mode 100644 index 79e2e18c2f..0000000000 --- a/tkg/tkgconfigpaths/filepaths.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigpaths - -import ( - "os" - "path" - "path/filepath" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -// GetTKGDirectory returns path to tkg config directory "$HOME/.tkg" -func (c *client) GetTKGDirectory() (string, error) { - if c.configDir == "" { - return "", errors.New("tkg config directory is empty") - } - return c.configDir, nil -} - -// GetTKGProvidersDirectory returns path to tkg config directory "$HOME/.tkg/providers" -func (c *client) GetTKGProvidersDirectory() (string, error) { - tkgDir, err := c.GetTKGDirectory() - if err != nil { - return "", err - } - return filepath.Join(tkgDir, constants.LocalProvidersFolderName), nil -} - -// GetTKGProvidersCheckSumPath returns path to the providers checksum file -func (c *client) GetTKGProvidersCheckSumPath() (string, error) { - tkgDir, err := c.GetTKGDirectory() - if err != nil { - return "", err - } - return filepath.Join(tkgDir, constants.LocalProvidersFolderName, constants.LocalProvidersChecksumFileName), nil -} - -// GetTKGBoMDirectory returns path to tkg config directory "$HOME/.tkg/bom" -func (c *client) GetTKGBoMDirectory() (string, error) { - tkgDir, err := c.GetTKGDirectory() - if err != nil { - return "", err - } - return filepath.Join(tkgDir, constants.LocalBOMsFolderName), nil -} - -// GetTKGCompatibilityDirectory returns path to tkg compatibility directory "/compatibility" -func (c *client) GetTKGCompatibilityDirectory() (string, error) { - tkgDir, err := c.GetTKGDirectory() - if err != nil { - return "", err - } - return filepath.Join(tkgDir, constants.LocalCompatibilityFolderName), nil -} - -// GetTKGConfigDirectories returns tkg config directories in below order -// (tkgDir, bomDir, providersDir, error) -func (c *client) GetTKGConfigDirectories() (string, string, string, error) { - tkgDir, err := c.GetTKGDirectory() - if err != nil { - return "", "", "", err - } - bomDir := filepath.Join(tkgDir, constants.LocalBOMsFolderName) - providerDir := filepath.Join(tkgDir, constants.LocalProvidersFolderName) - return tkgDir, bomDir, providerDir, nil -} - -// GetProvidersConfigFilePath returns config file path from providers dir -// "$HOME/.tkg/providers/config.yaml" -func (c *client) GetProvidersConfigFilePath() (string, error) { - providersDir, err := c.GetTKGProvidersDirectory() - if err != nil { - return "", err - } - - return filepath.Join(providersDir, constants.LocalProvidersConfigFileName), nil -} - -// GetTKGCompatibilityConfigPath returns TKG compatibility file path -func (c *client) GetTKGCompatibilityConfigPath() (string, error) { - compatibilityDir, err := c.GetTKGCompatibilityDirectory() - if err != nil { - return "", err - } - return filepath.Join(compatibilityDir, constants.TKGCompatibilityFileName), nil -} - -// GetTKGConfigPath returns tkg configfile path -func (c *client) GetTKGConfigPath() (string, error) { - tkgDir, err := c.GetTKGDirectory() - if err != nil { - return "", err - } - return filepath.Join(tkgDir, constants.TKGConfigFileName), nil -} - -// GetDefaultClusterConfigPath returns default cluster config file path -func (c *client) GetDefaultClusterConfigPath() (string, error) { - tkgDir, err := c.GetTKGDirectory() - if err != nil { - return "", err - } - return filepath.Join(tkgDir, constants.TKGDefaultClusterConfigFileName), nil -} - -// GetOverridesDirectory returns path of overrides directory -func GetOverridesDirectory() string { - homeDir, err := os.UserHomeDir() - if err != nil { - return constants.OverrideFolder - } - return filepath.Join(homeDir, constants.OverrideFolder) -} - -// GetRegistryCertFile returns the registry cert file path -func GetRegistryCertFile() (string, error) { - home, err := os.UserHomeDir() - if err != nil { - return "", errors.Wrap(err, "could not locate user home dir") - } - return path.Join(home, constants.TKGRegistryCertFile), nil -} - -// GetRegistryTrustedCACertFileForWindows returns the registry trusted root ca cert filepath for windows -func GetRegistryTrustedCACertFileForWindows() (string, error) { - home, err := os.UserHomeDir() - if err != nil { - return "", errors.Wrap(err, "could not locate user home dir") - } - return path.Join(home, constants.TKGRegistryTrustedRootCAFileForWindows), nil -} - -// GetConfigDefaultsFilePath returns config_default.yaml file path under TKG directory -func (c *client) GetConfigDefaultsFilePath() (string, error) { - tkgDir, err := c.GetTKGProvidersDirectory() - if err != nil { - return "", err - } - return filepath.Join(tkgDir, constants.TKGConfigDefaultFileName), nil -} - -// GetLogDirectory returns the directory path where log files should be stored by default. -func (c *client) GetLogDirectory() (string, error) { - tkgDir, err := c.GetTKGDirectory() - if err != nil { - return "", err - } - return filepath.Join(tkgDir, constants.LogFolderName), nil -} - -// GetClusterConfigurationDirectory returns the directory path where cluster configuration files will be stored -func (c *client) GetClusterConfigurationDirectory() (string, error) { - tkgDir, err := c.GetTKGDirectory() - if err != nil { - return "", err - } - return filepath.Join(tkgDir, constants.TKGClusterConfigFileDirForUI), nil -} diff --git a/tkg/tkgconfigpaths/zz_bundled_default_bom_files_configdata.go b/tkg/tkgconfigpaths/zz_bundled_default_bom_files_configdata.go deleted file mode 100644 index 954ca7c141..0000000000 --- a/tkg/tkgconfigpaths/zz_bundled_default_bom_files_configdata.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigpaths - -// IMPORTANT: Please !!DO NOT!!! change the content of this file manually -// This file is auto-generated based on the default BoM file and Image repository details -// Provided during build time and the values mentioned here are used when used as library - -// All the variables are set during build time -// Note: Please !!DO NOT!!! change the name or remove this variable -var ( - TKGDefaultImageRepo string = "projects-stg.registry.vmware.com/tkg" - TKGDefaultCompatibilityImagePath string = "framework-zshippable/tkg-compatibility" - TKGManagementClusterPluginVersion string = "v0.29.0-dev" -) diff --git a/tkg/tkgconfigproviders/aws.go b/tkg/tkgconfigproviders/aws.go deleted file mode 100644 index 84383c7d92..0000000000 --- a/tkg/tkgconfigproviders/aws.go +++ /dev/null @@ -1,442 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -import ( - "encoding/base64" - "strconv" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - utils "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -const ( - trueConst = "true" - falseConst = "false" - azCount = 3 -) - -// AWSConfig is the tkg config for aws -type AWSConfig struct { - AccessKeyID string `yaml:"AWS_ACCESS_KEY_ID,omitempty"` - AMIID string `yaml:"AWS_AMI_ID,omitempty"` - AWSPrivateSubnetID string `yaml:"AWS_PRIVATE_SUBNET_ID"` - AWSPrivateSubnetID2 string `yaml:"AWS_PRIVATE_SUBNET_ID_1"` - AWSPrivateSubnetID3 string `yaml:"AWS_PRIVATE_SUBNET_ID_2"` - AWSPublicSubnetID string `yaml:"AWS_PUBLIC_SUBNET_ID"` - AWSPublicSubnetID2 string `yaml:"AWS_PUBLIC_SUBNET_ID_1"` - AWSPublicSubnetID3 string `yaml:"AWS_PUBLIC_SUBNET_ID_2"` - AWSVPCID string `yaml:"AWS_VPC_ID"` - B64EncodedCredentials string `yaml:"AWS_B64ENCODED_CREDENTIALS,omitempty"` - BastionHostEnabled string `yaml:"BASTION_HOST_ENABLED"` - CeipParticipation string `yaml:"ENABLE_CEIP_PARTICIPATION,omitempty"` - ClusterAnnotations string `yaml:"CLUSTER_ANNOTATIONS,omitempty"` - ClusterCidr string `yaml:"CLUSTER_CIDR"` - ClusterHTTPProxy string `yaml:"TKG_HTTP_PROXY,omitempty"` - ClusterHTTPSProxy string `yaml:"TKG_HTTPS_PROXY,omitempty"` - ClusterLabels string `yaml:"CLUSTER_LABELS,omitempty"` - ClusterName string `yaml:"CLUSTER_NAME,omitempty"` - ClusterNoProxy string `yaml:"TKG_NO_PROXY,omitempty"` - ClusterPlan string `yaml:"CLUSTER_PLAN,omitempty"` - ControlPlaneNodeType string `yaml:"CONTROL_PLANE_MACHINE_TYPE,omitempty"` - // ControlPlaneOSDiskSizeGiB is the size of the root volume of the control plane instances of a cluster - ControlPlaneOSDiskSizeGiB string `yaml:"AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB,omitempty"` - CredentialProfile string `yaml:"AWS_PROFILE,omitempty"` - EnableAuditLogging string `yaml:"ENABLE_AUDIT_LOGGING"` - HTTPProxyEnabled string `yaml:"TKG_HTTP_PROXY_ENABLED"` - InfrastructureProvider string `yaml:"INFRASTRUCTURE_PROVIDER,omitempty"` - LoadBalancerSchemeInternal string `yaml:"AWS_LOAD_BALANCER_SCHEME_INTERNAL,omitempty"` - MachineHealthCheckEnabled string `yaml:"ENABLE_MHC"` - Node2Az string `yaml:"AWS_NODE_AZ_1"` - Node3Az string `yaml:"AWS_NODE_AZ_2"` - NodeAz string `yaml:"AWS_NODE_AZ"` - NodeMachineType string `yaml:"NODE_MACHINE_TYPE,omitempty"` - NodeMachineType1 string `yaml:"NODE_MACHINE_TYPE_1,omitempty"` - NodeMachineType2 string `yaml:"NODE_MACHINE_TYPE_2,omitempty"` - // NodeOSDiskSizeGiB is the size of the root volume of the node instances of a cluster - NodeOSDiskSizeGiB string `yaml:"AWS_NODE_OS_DISK_SIZE_GIB,omitempty"` - PrivateNode2Cidr string `yaml:"AWS_PRIVATE_NODE_CIDR_1"` - PrivateNode3Cidr string `yaml:"AWS_PRIVATE_NODE_CIDR_2"` - PrivateNodeCidr string `yaml:"AWS_PRIVATE_NODE_CIDR"` - PublicNode2Cidr string `yaml:"AWS_PUBLIC_NODE_CIDR_1"` - PublicNode3Cidr string `yaml:"AWS_PUBLIC_NODE_CIDR_2"` - PublicNodeCidr string `yaml:"AWS_PUBLIC_NODE_CIDR"` - Region string `yaml:"AWS_REGION,omitempty"` - SecretAcessKey string `yaml:"AWS_SECRET_ACCESS_KEY,omitempty"` - ServiceCidr string `yaml:"SERVICE_CIDR"` - SessionToken string `yaml:"AWS_SESSION_TOKEN,omitempty"` - SSHKeyName string `yaml:"AWS_SSH_KEY_NAME"` - VPCCidr string `yaml:"AWS_VPC_CIDR"` - IdentityReference AWSIdentityReference `yaml:",inline"` - SecurityGroupOverrides AWSSecurityGroupOverrides `yaml:",inline"` - IDPConfig `yaml:",inline"` - OsInfo `yaml:",inline"` -} - -// AWSIdentityReference defines an optional reference to a AWS Identity Reference resource. -type AWSIdentityReference struct { - // Kind is an optional kind of a Kubernetes resource containing an identity to be used for a cluster. - // Defaults to AWSClusterRoleIdentity if Name is set - Kind string `yaml:"AWS_IDENTITY_REF_KIND,omitempty"` - // Name is an optional name of a Kubernetes resource containing an identity to be used for a cluster. - Name string `yaml:"AWS_IDENTITY_REF_NAME,omitempty"` -} - -// AWSSecurityGroupOverrides can be used in conjunction with Bring Your Own Infrastructure to define specific security group -// IDs to use for the cluster -type AWSSecurityGroupOverrides struct { - // APIServerLoadBalancer is an optional security group ID of a pre-created security group that will be used for Kubernetes - // API Server ELB, and will control inbound access to the the control plane endpoint - APIServerLoadBalancer string `yaml:"AWS_SECURITY_GROUP_APISERVER_LB,omitempty"` - // Bastion is an optional security group ID of a pre-created security group that will be used to control in-bound access - // to the bastion - Bastion string `yaml:"AWS_SECURITY_GROUP_BASTION,omitempty"` - // ControlPlane is an optional security group ID of a pre-created security group that will be used to control in-bound - // access to the control plane nodes - ControlPlane string `yaml:"AWS_SECURITY_GROUP_CONTROLPLANE,omitempty"` - // CloudProviderLoadBalancer is an optional security group ID for use by the Kubernetes AWS Cloud Provider for setting rules - // for ELBs - CloudProviderLoadBalancer string `yaml:"AWS_SECURITY_GROUP_LB,omitempty"` - // Node is an optional security group ID that will be used to to control in-bound acceess to all nodes - Node string `yaml:"AWS_SECURITY_GROUP_NODE,omitempty"` -} - -type newSubnetPair struct { - Az string - PrivateSubnetCidr string - PublicSubnetCidr string -} - -// K8sVersionAMIMap represents map of k8s version to aws AMI ID to use for that k8s version -type K8sVersionAMIMap map[string]string - -// NewAWSConfig generates TKG config for aws -func (c *client) NewAWSConfig(params *models.AWSRegionalClusterParams, encodedCredentials string) (*AWSConfig, error) { //nolint:funlen,gocyclo - bomConfiguration, err := c.tkgBomClient.GetDefaultTkrBOMConfiguration() - if err != nil { - return nil, errors.Wrap(err, "unable to get default TKr BoM configuration") - } - amiID := getAMIId(bomConfiguration, params) - if amiID == "" { - return nil, errors.Errorf("No AMI found in region %s for TKr version %s", params.AwsAccountParams.Region, bomConfiguration.Release.Version) - } - - nodeMachineType1 := "" - nodeMachineType2 := "" - - if len(params.Vpc.Azs) == 0 { - return nil, errors.New("AWS node availability zone cannot be empty") - } - - if params.ControlPlaneFlavor == constants.PlanProd && len(params.Vpc.Azs) < 3 { - return nil, errors.Errorf("number of Availability Zones less than 3 for production cluster, actual %d", len(params.Vpc.Azs)) - } - - if params.ControlPlaneFlavor == constants.PlanProd { - nodeMachineType1 = params.Vpc.Azs[1].WorkerNodeType - nodeMachineType2 = params.Vpc.Azs[2].WorkerNodeType - } - - res := &AWSConfig{ - ClusterName: params.ClusterName, - ClusterLabels: mapToConfigString(params.Labels), - ClusterAnnotations: mapToConfigString(params.Annotations), - InfrastructureProvider: constants.InfrastructureProviderAWS, - ClusterPlan: params.ControlPlaneFlavor, - Region: params.AwsAccountParams.Region, - B64EncodedCredentials: encodedCredentials, - ControlPlaneNodeType: params.ControlPlaneNodeType, - NodeMachineType: params.Vpc.Azs[0].WorkerNodeType, - NodeMachineType1: nodeMachineType1, - NodeMachineType2: nodeMachineType2, - AMIID: amiID, - SSHKeyName: params.SSHKeyName, - ClusterCidr: params.Networking.ClusterPodCIDR, - ServiceCidr: params.Networking.ClusterServiceCIDR, - HTTPProxyEnabled: falseConst, - } - - if params.LoadbalancerSchemeInternal { - res.LoadBalancerSchemeInternal = strconv.FormatBool(params.LoadbalancerSchemeInternal) - } - - if params.CeipOptIn != nil { - res.CeipParticipation = strconv.FormatBool(*params.CeipOptIn) - } - - if params.Os != nil && params.Os.OsInfo != nil { - res.OsInfo.Name = params.Os.OsInfo.Name - res.OsInfo.Version = params.Os.OsInfo.Version - res.OsInfo.Arch = params.Os.OsInfo.Arch - } - - if params.EnableAuditLogging { - res.EnableAuditLogging = trueConst - } - - if params.AwsAccountParams.AccessKeyID != "" && params.AwsAccountParams.SecretAccessKey != "" { - res.AccessKeyID = params.AwsAccountParams.AccessKeyID - res.SecretAcessKey = params.AwsAccountParams.SecretAccessKey - res.SessionToken = params.AwsAccountParams.SessionToken - } else if params.AwsAccountParams.ProfileName != "" { - res.CredentialProfile = params.AwsAccountParams.ProfileName - } - - if params.IdentityManagement != nil { //nolint:dupl - res.IdentityManagementType = *params.IdentityManagement.IdmType - res.OIDCProviderName = params.IdentityManagement.OidcProviderName - res.OIDCIssuerURL = params.IdentityManagement.OidcProviderURL.String() - res.OIDCClientID = params.IdentityManagement.OidcClientID - res.OIDCClientSecret = params.IdentityManagement.OidcClientSecret - res.OIDCScopes = params.IdentityManagement.OidcScope - res.OIDCGroupsClaim = params.IdentityManagement.OidcClaimMappings["groups"] - res.OIDCUsernameClaim = params.IdentityManagement.OidcClaimMappings["username"] - res.LDAPBindDN = params.IdentityManagement.LdapBindDn - res.LDAPBindPassword = params.IdentityManagement.LdapBindPassword - res.LDAPHost = params.IdentityManagement.LdapURL - res.LDAPUserSearchBaseDN = params.IdentityManagement.LdapUserSearchBaseDn - res.LDAPUserSearchFilter = params.IdentityManagement.LdapUserSearchFilter - res.LDAPUserSearchUsername = params.IdentityManagement.LdapUserSearchUsername - res.LDAPUserSearchNameAttr = params.IdentityManagement.LdapUserSearchNameAttr - res.LDAPGroupSearchBaseDN = params.IdentityManagement.LdapGroupSearchBaseDn - res.LDAPGroupSearchFilter = params.IdentityManagement.LdapGroupSearchFilter - res.LDAPGroupSearchUserAttr = params.IdentityManagement.LdapGroupSearchUserAttr - res.LDAPGroupSearchGroupAttr = params.IdentityManagement.LdapGroupSearchGroupAttr - res.LDAPGroupSearchNameAttr = params.IdentityManagement.LdapGroupSearchNameAttr - res.LDAPRootCAData = base64.StdEncoding.EncodeToString([]byte(params.IdentityManagement.LdapRootCa)) - } - - if len(params.Vpc.Azs) == 0 { - return res, errors.New("AWS node availability zone cannot be empty") - } - - if params.ControlPlaneFlavor == constants.PlanProd && len(params.Vpc.Azs) < 3 { - return nil, errors.Errorf("number of Availability Zones less than 3 for production cluster, actual %d", len(params.Vpc.Azs)) - } - - if params.Networking != nil && params.Networking.HTTPProxyConfiguration != nil && params.Networking.HTTPProxyConfiguration.Enabled { - res.HTTPProxyEnabled = trueConst - conf := params.Networking.HTTPProxyConfiguration - res.ClusterHTTPProxy, err = CheckAndGetProxyURL(conf.HTTPProxyUsername, conf.HTTPProxyPassword, conf.HTTPProxyURL) - if err != nil { - return res, err - } - res.ClusterHTTPSProxy, err = CheckAndGetProxyURL(conf.HTTPSProxyUsername, conf.HTTPSProxyPassword, conf.HTTPSProxyURL) - if err != nil { - return res, err - } - res.ClusterNoProxy = params.Networking.HTTPProxyConfiguration.NoProxy - } - - if params.Vpc.VpcID == "" { - // Create new VPC - res.VPCCidr = params.Vpc.Cidr - - newSubnets, err := appendSubnets(params.Vpc, params.ControlPlaneFlavor == constants.PlanProd) - if err != nil { - return nil, errors.Wrap(err, "unable to divide cidrs for new VPC's subnets") - } - res.NodeAz = newSubnets[0].Az - res.PrivateNodeCidr = newSubnets[0].PrivateSubnetCidr - res.PublicNodeCidr = newSubnets[0].PublicSubnetCidr - - if params.ControlPlaneFlavor == constants.PlanProd { - res.Node2Az = newSubnets[1].Az - res.PrivateNode2Cidr = newSubnets[1].PrivateSubnetCidr - res.PublicNode2Cidr = newSubnets[1].PublicSubnetCidr - - res.Node3Az = newSubnets[2].Az - res.PrivateNode3Cidr = newSubnets[2].PrivateSubnetCidr - res.PublicNode3Cidr = newSubnets[2].PublicSubnetCidr - } - } else { - // Use existing VPC - res.AWSVPCID = params.Vpc.VpcID - - res.NodeAz = params.Vpc.Azs[0].Name - res.AWSPublicSubnetID = params.Vpc.Azs[0].PublicSubnetID - res.AWSPrivateSubnetID = params.Vpc.Azs[0].PrivateSubnetID - - if params.ControlPlaneFlavor == constants.PlanProd { - res.Node2Az = params.Vpc.Azs[1].Name - res.AWSPublicSubnetID2 = params.Vpc.Azs[1].PublicSubnetID - res.AWSPrivateSubnetID2 = params.Vpc.Azs[1].PrivateSubnetID - - res.Node3Az = params.Vpc.Azs[2].Name - res.AWSPublicSubnetID3 = params.Vpc.Azs[2].PublicSubnetID - res.AWSPrivateSubnetID3 = params.Vpc.Azs[2].PrivateSubnetID - } - } - - if params.BastionHostEnabled { - res.BastionHostEnabled = trueConst - } else { - res.BastionHostEnabled = falseConst - } - - if params.MachineHealthCheckEnabled { - res.MachineHealthCheckEnabled = trueConst - } else { - res.MachineHealthCheckEnabled = falseConst - } - - return res, nil -} - -func getAMIId(bomConfiguration *tkgconfigbom.BOMConfiguration, params *models.AWSRegionalClusterParams) string { - amiID := "" - if amis, ok := bomConfiguration.AMI[params.AwsAccountParams.Region]; ok { - if params.Os != nil && params.Os.OsInfo != nil { - for _, ami := range amis { - if ami.OSInfo.Name == params.Os.OsInfo.Name { - amiID = ami.ID - break - } - } - } else { - amiID = amis[0].ID - } - } - - return amiID -} - -// AppendSubnets append subnet information in providerConfig to paramsVpc -func appendSubnets(paramsVpc *models.AWSVpc, highAvailability bool) ([]*newSubnetPair, error) { - ProdSubnetCount := 6 - ExtendedBits := 4 - NumberOfSubnetsForDivProd := 8 - NumberOfSubnetsForDivDev := 2 - - azNames := make([]string, 0) - for i := range paramsVpc.Azs { - azNames = append(azNames, paramsVpc.Azs[i].Name) - } - - newSubnets := make([]*newSubnetPair, 0) - - if highAvailability { - if len(azNames) < azCount { - return nil, errors.Errorf("number of Availability Zones less than 3 for production cluster, actual %d", len(azNames)) - } - subnetCidrs, err := utils.DivideVPCCidr(paramsVpc.Cidr, ExtendedBits, NumberOfSubnetsForDivProd) - if err != nil { - return nil, err - } - for i := 1; i < ProdSubnetCount; i += 2 { - newSubnets = append(newSubnets, &newSubnetPair{ - PublicSubnetCidr: subnetCidrs[i-1], - PrivateSubnetCidr: subnetCidrs[i], - Az: azNames[i/2], - }) - } - } else { - if len(azNames) != 1 { - return nil, errors.Errorf("number of Availability Zones not 1 for developer cluster, actual %d", len(azNames)) - } - subnetCidrs, err := utils.DivideVPCCidr(paramsVpc.Cidr, ExtendedBits, NumberOfSubnetsForDivDev) - if err != nil { - return nil, err - } - newSubnets = append(newSubnets, &newSubnetPair{ - PublicSubnetCidr: subnetCidrs[0], - PrivateSubnetCidr: subnetCidrs[1], - Az: azNames[0], - }) - } - - return newSubnets, nil -} - -// CreateAWSParams generates a Params object from an AWSConfig, used for importing configuration files -func (c *client) CreateAWSParams(res *AWSConfig) (params *models.AWSRegionalClusterParams, err error) { - ceipOptIn := res.CeipParticipation == trueConst - bomConfiguration, err := c.tkgBomClient.GetDefaultTkrBOMConfiguration() - - if err != nil { - return nil, err - } - - params = &models.AWSRegionalClusterParams{ - Annotations: configStringToMap(res.ClusterAnnotations), - AwsAccountParams: &models.AWSAccountParams{ - AccessKeyID: res.AccessKeyID, - ProfileName: res.CredentialProfile, - Region: res.Region, - SecretAccessKey: res.SecretAcessKey, - SessionToken: res.SessionToken, - }, - BastionHostEnabled: res.BastionHostEnabled == trueConst, - CeipOptIn: &ceipOptIn, - ClusterName: res.ClusterName, - ControlPlaneFlavor: res.ClusterPlan, - ControlPlaneNodeType: res.ControlPlaneNodeType, - //CreateCloudFormationStack: false, - EnableAuditLogging: res.EnableAuditLogging == trueConst, - IdentityManagement: createIdentityManagementConfig(res), - //KubernetesVersion: "", - Labels: configStringToMap(res.ClusterLabels), - MachineHealthCheckEnabled: res.MachineHealthCheckEnabled == trueConst, - Networking: createNetworkingConfig(res), - NumOfWorkerNode: 0, - Os: &models.AWSVirtualMachine{ - Name: getOsName(bomConfiguration, res), - OsInfo: &models.OSInfo{ - Arch: res.OsInfo.Arch, - Name: res.OsInfo.Name, - Version: res.OsInfo.Version, - }, - }, - SSHKeyName: res.SSHKeyName, - Vpc: createVpc(res), - WorkerNodeType: "", - } - - if params.CeipOptIn != nil { - res.CeipParticipation = strconv.FormatBool(*params.CeipOptIn) - } - - return params, nil -} - -func createAwsNodeAz(workerNodeType, privateSubnetID, publicSubnetID string) *models.AWSNodeAz { - if workerNodeType == "" { - return nil - } - return &models.AWSNodeAz{ - PrivateSubnetID: privateSubnetID, - PublicSubnetID: publicSubnetID, - WorkerNodeType: workerNodeType, - } -} - -func createVpc(awsConfig *AWSConfig) *models.AWSVpc { - azs := []*models.AWSNodeAz{ - createAwsNodeAz(awsConfig.NodeMachineType, awsConfig.AWSPrivateSubnetID, awsConfig.AWSPublicSubnetID), - createAwsNodeAz(awsConfig.NodeMachineType1, awsConfig.AWSPrivateSubnetID2, awsConfig.AWSPublicSubnetID2), - createAwsNodeAz(awsConfig.NodeMachineType2, awsConfig.AWSPrivateSubnetID3, awsConfig.AWSPublicSubnetID3), - } - - return &models.AWSVpc{ - Azs: azs, - Cidr: "", - VpcID: "", - } -} - -func getOsName(bomConfiguration *tkgconfigbom.BOMConfiguration, awsConfig *AWSConfig) string { - if amis, ok := bomConfiguration.AMI[awsConfig.Region]; ok { - for _, ami := range amis { - if ami.ID == awsConfig.AMIID { - return ami.OSInfo.Name - } - } - } - return "" -} diff --git a/tkg/tkgconfigproviders/aws_image.go b/tkg/tkgconfigproviders/aws_image.go deleted file mode 100644 index a8768acc54..0000000000 --- a/tkg/tkgconfigproviders/aws_image.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -import ( - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfighelper" -) - -func (c *client) GetAWSAMIInfo(tkrBoMConfiguration *tkgconfigbom.BOMConfiguration, awsRegion string) (*tkgconfigbom.AMIInfo, error) { - userConfiguredAMIInfo := c.getUserConfiguredAMIBasedonOSOptions(tkrBoMConfiguration, awsRegion) - if userConfiguredAMIInfo != nil { - log.V(3).Infof("using AMI '%v' based on the user settings, aws-region '%v', amiInfo: %v", userConfiguredAMIInfo.ID, awsRegion, userConfiguredAMIInfo.ID) - return userConfiguredAMIInfo, nil - } - - // use new BoM file format to configure AMI ID and OS options based on BOM and OS Options - var mappedAMIs []tkgconfigbom.AMIInfo - var exists bool - // check if the AMI exists for given aws region - if mappedAMIs, exists = tkrBoMConfiguration.AMI[awsRegion]; !exists { - return nil, errors.Errorf("no AMI found in region %s for TKr version %s", awsRegion, tkrBoMConfiguration.Release.Version) - } - - ami := tkgconfighelper.SelectAWSImageBasedonOSOptions(mappedAMIs, c.TKGConfigReaderWriter()) - if ami == nil { - osInfo := tkgconfighelper.GetUserProvidedOsOptions(c.TKGConfigReaderWriter()) - return nil, errors.Errorf("no AMI found in region %s for TKr version: '%s' and os options: '(%v,%v,%v)'", awsRegion, tkrBoMConfiguration.Release.Version, osInfo.Name, osInfo.Version, osInfo.Arch) - } - - return ami, nil -} - -func (c *client) getUserConfiguredAMIBasedonOSOptions(tkrBoMConfiguration *tkgconfigbom.BOMConfiguration, awsRegion string) *tkgconfigbom.AMIInfo { - var amiMapFromUserConfig map[string]tkgconfigbom.AWSVMImages - err := c.TKGConfigReaderWriter().UnmarshalKey("aws-image", &amiMapFromUserConfig) - if err != nil { - return nil - } - - mapRegionToAMIInfo, exists := amiMapFromUserConfig[tkrBoMConfiguration.Release.Version] - if !exists { - return nil - } - - listAMIInfo, exists := mapRegionToAMIInfo[awsRegion] - if !exists { - return nil - } - - // find match based on specified configVariable osName, osVersion and osArch - // if no match found, return nil - return tkgconfighelper.SelectAWSImageBasedonOSOptions(listAMIInfo, c.TKGConfigReaderWriter()) -} diff --git a/tkg/tkgconfigproviders/azure.go b/tkg/tkgconfigproviders/azure.go deleted file mode 100644 index 013f0bf0de..0000000000 --- a/tkg/tkgconfigproviders/azure.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -import ( - "encoding/base64" - "strconv" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// AzureConfig is the tkg config for Azure -type AzureConfig struct { - ClusterName string `yaml:"CLUSTER_NAME,omitempty"` - ClusterLabels string `yaml:"CLUSTER_LABELS,omitempty"` - ClusterAnnotations string `yaml:"CLUSTER_ANNOTATIONS,omitempty"` - InfrastructureProvider string `yaml:"INFRASTRUCTURE_PROVIDER,omitempty"` - ClusterPlan string `yaml:"CLUSTER_PLAN,omitempty"` - CeipParticipation string `yaml:"ENABLE_CEIP_PARTICIPATION,omitempty"` - Region string `yaml:"AZURE_LOCATION,omitempty"` - SubscriptionID string `yaml:"AZURE_SUBSCRIPTION_ID,omitempty"` - Environment string `yaml:"AZURE_ENVIRONMENT,omitempty"` - TenantID string `yaml:"AZURE_TENANT_ID,omitempty"` - ClientID string `yaml:"AZURE_CLIENT_ID,omitempty"` - ClientSecret string `yaml:"AZURE_CLIENT_SECRET,omitempty"` - SSHKeyB64 string `yaml:"AZURE_SSH_PUBLIC_KEY_B64,omitempty"` - ControlPlaneMachineType string `yaml:"AZURE_CONTROL_PLANE_MACHINE_TYPE,omitempty"` - NodeMachineType string `yaml:"AZURE_NODE_MACHINE_TYPE,omitempty"` - ResourceGroup string `yaml:"AZURE_RESOURCE_GROUP,omitempty"` - VNetResourceGroup string `yaml:"AZURE_VNET_RESOURCE_GROUP,omitempty"` - VNetName string `yaml:"AZURE_VNET_NAME,omitempty"` - ControlPlaneSubnet string `yaml:"AZURE_CONTROL_PLANE_SUBNET_NAME,omitempty"` - WorkerNodeSubnet string `yaml:"AZURE_NODE_SUBNET_NAME,omitempty"` - VNetCIDR string `yaml:"AZURE_VNET_CIDR,omitempty"` - ControlPlaneSubnetCIDR string `yaml:"AZURE_CONTROL_PLANE_SUBNET_CIDR,omitempty"` - ControlPlaneSubnetSG string `yaml:"AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP,omitempty"` - WorkerNodeSubnetCIDR string `yaml:"AZURE_NODE_SUBNET_CIDR,omitempty"` - WorkerNodeSubnetSG string `yaml:"AZURE_NODE_SUBNET_SECURITY_GROUP,omitempty"` - MachineHealthCheckEnabled string `yaml:"ENABLE_MHC,omitempty"` - EnableAuditLogging string `yaml:"ENABLE_AUDIT_LOGGING"` - ServiceCIDR string `yaml:"SERVICE_CIDR,omitempty"` - ClusterCIDR string `yaml:"CLUSTER_CIDR,omitempty"` - ClusterHTTPProxy string `yaml:"TKG_HTTP_PROXY,omitempty"` - ClusterHTTPSProxy string `yaml:"TKG_HTTPS_PROXY,omitempty"` - ClusterNoProxy string `yaml:"TKG_NO_PROXY,omitempty"` - HTTPProxyEnabled string `yaml:"TKG_HTTP_PROXY_ENABLED"` - EnablePrivateCluster string `yaml:"AZURE_ENABLE_PRIVATE_CLUSTER"` - FrontendPrivateIP string `yaml:"AZURE_FRONTEND_PRIVATE_IP"` - IDPConfig `yaml:",inline"` - OsInfo `yaml:",inline"` -} - -// NewAzureConfig generates TKG config for Azure -func (c *client) NewAzureConfig(params *models.AzureRegionalClusterParams) (*AzureConfig, error) { // nolint:funlen - var err error - res := &AzureConfig{ - ClusterName: params.ClusterName, - ClusterLabels: mapToConfigString(params.Labels), - ClusterAnnotations: mapToConfigString(params.Annotations), - InfrastructureProvider: constants.InfrastructureProviderAzure, - ClusterPlan: params.ControlPlaneFlavor, - Region: params.Location, - Environment: params.AzureAccountParams.AzureCloud, - SubscriptionID: params.AzureAccountParams.SubscriptionID, - TenantID: params.AzureAccountParams.TenantID, - ClientID: params.AzureAccountParams.ClientID, - ClientSecret: params.AzureAccountParams.ClientSecret, - SSHKeyB64: base64.StdEncoding.EncodeToString([]byte(params.SSHPublicKey)), - ControlPlaneMachineType: params.ControlPlaneMachineType, - NodeMachineType: params.WorkerMachineType, - ClusterCIDR: params.Networking.ClusterPodCIDR, - ServiceCIDR: params.Networking.ClusterServiceCIDR, - HTTPProxyEnabled: falseConst, - } - - if params.CeipOptIn != nil { - res.CeipParticipation = strconv.FormatBool(*params.CeipOptIn) - } - - if params.Os != nil && params.Os.OsInfo != nil { - res.OsInfo.Name = params.Os.OsInfo.Name - res.OsInfo.Version = params.Os.OsInfo.Version - res.OsInfo.Arch = params.Os.OsInfo.Arch - } - - if params.EnableAuditLogging { - res.EnableAuditLogging = trueConst - } - - if params.IdentityManagement != nil { //nolint:dupl - res.IdentityManagementType = *params.IdentityManagement.IdmType - res.OIDCProviderName = params.IdentityManagement.OidcProviderName - res.OIDCIssuerURL = params.IdentityManagement.OidcProviderURL.String() - res.OIDCClientID = params.IdentityManagement.OidcClientID - res.OIDCClientSecret = params.IdentityManagement.OidcClientSecret - res.OIDCScopes = params.IdentityManagement.OidcScope - res.OIDCGroupsClaim = params.IdentityManagement.OidcClaimMappings["groups"] - res.OIDCUsernameClaim = params.IdentityManagement.OidcClaimMappings["username"] - res.LDAPBindDN = params.IdentityManagement.LdapBindDn - res.LDAPBindPassword = params.IdentityManagement.LdapBindPassword - res.LDAPHost = params.IdentityManagement.LdapURL - res.LDAPUserSearchBaseDN = params.IdentityManagement.LdapUserSearchBaseDn - res.LDAPUserSearchFilter = params.IdentityManagement.LdapUserSearchFilter - res.LDAPUserSearchUsername = params.IdentityManagement.LdapUserSearchUsername - res.LDAPUserSearchNameAttr = params.IdentityManagement.LdapUserSearchNameAttr - res.LDAPGroupSearchBaseDN = params.IdentityManagement.LdapGroupSearchBaseDn - res.LDAPGroupSearchFilter = params.IdentityManagement.LdapGroupSearchFilter - res.LDAPGroupSearchUserAttr = params.IdentityManagement.LdapGroupSearchUserAttr - res.LDAPGroupSearchGroupAttr = params.IdentityManagement.LdapGroupSearchGroupAttr - res.LDAPGroupSearchNameAttr = params.IdentityManagement.LdapGroupSearchNameAttr - res.LDAPRootCAData = base64.StdEncoding.EncodeToString([]byte(params.IdentityManagement.LdapRootCa)) - } - - res.ResourceGroup = params.ResourceGroup - res.VNetResourceGroup = params.VnetResourceGroup - res.VNetName = params.VnetName - res.ControlPlaneSubnet = params.ControlPlaneSubnet - res.WorkerNodeSubnet = params.WorkerNodeSubnet - - if params.VnetCidr != "" { // create new vnet - res.VNetCIDR = params.VnetCidr - res.ControlPlaneSubnetCIDR = params.ControlPlaneSubnetCidr - res.WorkerNodeSubnetCIDR = params.WorkerNodeSubnetCidr - } - - if params.Networking != nil && params.Networking.HTTPProxyConfiguration != nil && params.Networking.HTTPProxyConfiguration.Enabled { - res.HTTPProxyEnabled = trueConst - conf := params.Networking.HTTPProxyConfiguration - res.ClusterHTTPProxy, err = CheckAndGetProxyURL(conf.HTTPProxyUsername, conf.HTTPProxyPassword, conf.HTTPProxyURL) - if err != nil { - return res, err - } - res.ClusterHTTPSProxy, err = CheckAndGetProxyURL(conf.HTTPSProxyUsername, conf.HTTPSProxyPassword, conf.HTTPSProxyURL) - if err != nil { - return res, err - } - res.ClusterNoProxy = params.Networking.HTTPProxyConfiguration.NoProxy - } - - if params.MachineHealthCheckEnabled { - res.MachineHealthCheckEnabled = trueConst - } else { - res.MachineHealthCheckEnabled = falseConst - } - - if params.IsPrivateCluster { - res.EnablePrivateCluster = trueConst - res.FrontendPrivateIP = params.FrontendPrivateIP - } - - return res, nil -} - -// CreateAzureParams generates a Params object from an AzureConfig, used for importing configuration files -func (c *client) CreateAzureParams(azureConfig *AzureConfig) (params *models.AzureRegionalClusterParams, err error) { - ceipOptIn := azureConfig.CeipParticipation == trueConst - sshKey, err := base64.StdEncoding.DecodeString(azureConfig.SSHKeyB64) - if err != nil { - return nil, err - } - - return &models.AzureRegionalClusterParams{ - Annotations: configStringToMap(azureConfig.ClusterAnnotations), - AzureAccountParams: &models.AzureAccountParams{ - AzureCloud: "", - ClientID: azureConfig.ClientID, - ClientSecret: azureConfig.ClientSecret, - SubscriptionID: azureConfig.SubscriptionID, - TenantID: azureConfig.TenantID, - }, - CeipOptIn: &ceipOptIn, - ClusterName: azureConfig.ClusterName, - ControlPlaneFlavor: azureConfig.ClusterPlan, - ControlPlaneMachineType: azureConfig.ControlPlaneMachineType, - ControlPlaneSubnet: azureConfig.ControlPlaneSubnet, - ControlPlaneSubnetCidr: azureConfig.ControlPlaneSubnetCIDR, - EnableAuditLogging: azureConfig.EnableAuditLogging == trueConst, - FrontendPrivateIP: azureConfig.FrontendPrivateIP, - IdentityManagement: createIdentityManagementConfig(azureConfig), - IsPrivateCluster: azureConfig.EnablePrivateCluster == trueConst, - //KubernetesVersion: "", - Labels: configStringToMap(azureConfig.ClusterLabels), - Location: azureConfig.Region, - MachineHealthCheckEnabled: azureConfig.MachineHealthCheckEnabled == trueConst, - Networking: createNetworkingConfig(azureConfig), - NumOfWorkerNodes: "", - Os: createOsInfo(azureConfig), - ResourceGroup: azureConfig.ResourceGroup, - SSHPublicKey: string(sshKey), - VnetCidr: azureConfig.VNetCIDR, - VnetName: azureConfig.VNetName, - VnetResourceGroup: azureConfig.VNetResourceGroup, - WorkerMachineType: azureConfig.NodeMachineType, - WorkerNodeSubnet: azureConfig.WorkerNodeSubnet, - WorkerNodeSubnetCidr: azureConfig.WorkerNodeSubnetCIDR, - }, nil -} - -func createOsInfo(azureConfig *AzureConfig) *models.AzureVirtualMachine { - return &models.AzureVirtualMachine{ - Name: "", - OsInfo: &models.OSInfo{ - Arch: azureConfig.OsInfo.Arch, - Name: azureConfig.OsInfo.Name, - Version: azureConfig.OsInfo.Version, - }, - } -} diff --git a/tkg/tkgconfigproviders/azure_image.go b/tkg/tkgconfigproviders/azure_image.go deleted file mode 100644 index d7075ff5a6..0000000000 --- a/tkg/tkgconfigproviders/azure_image.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -import ( - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfighelper" -) - -func (c *client) GetAzureVMImageInfo(tkrVersion string) (*tkgconfigbom.AzureInfo, error) { - imageInfo, err := c.getAzureVMImageInfoFromUserConfiguration(tkrVersion) - if err == nil && imageInfo != nil { - return imageInfo, nil - } - log.V(9).Infof("unable to find azure-image config in user configuration file, using it from BoM files") - - bomConfiguration, err := c.tkgBomClient.GetBOMConfigurationFromTkrVersion(tkrVersion) - if err != nil { - return nil, errors.Wrapf(err, "unable to get bom configuration for TKr version %s", tkrVersion) - } - - imageInfo = tkgconfighelper.SelectAzureImageBasedonOSOptions(bomConfiguration.Azure, c.TKGConfigReaderWriter()) - if imageInfo == nil { - osInfo := tkgconfighelper.GetUserProvidedOsOptions(c.TKGConfigReaderWriter()) - return nil, errors.Errorf("unable to find azure-image for TKr version: %v, os options: %v in BoM files", tkrVersion, osInfo) - } - - return imageInfo, nil -} - -func (c *client) getAzureVMImageInfoFromUserConfiguration(tkrVersion string) (*tkgconfigbom.AzureInfo, error) { - var azureImageMap map[string][]tkgconfigbom.AzureInfo - err := c.TKGConfigReaderWriter().UnmarshalKey("azure-image", &azureImageMap) - if err != nil { - return nil, errors.New("unable to read azure-image config from user configuration file") - } - - azureImages, exists := azureImageMap[tkrVersion] - if exists && len(azureImages) != 0 { - userConfiguredAzureImageInfo := tkgconfighelper.SelectAzureImageBasedonOSOptions(azureImages, c.TKGConfigReaderWriter()) - if userConfiguredAzureImageInfo != nil { - log.V(3).Infof("using Azure Image based on the user settings, TKr version: '%v', azureImageInfo: '%v'", tkrVersion, userConfiguredAzureImageInfo) - return userConfiguredAzureImageInfo, nil - } - return nil, errors.Errorf("unable to configure azure image information from user configuration file") - } - return nil, errors.New("no azure images found for kubernetes version: %v in user configure configuration file") -} diff --git a/tkg/tkgconfigproviders/client.go b/tkg/tkgconfigproviders/client.go deleted file mode 100644 index 7eddfcca83..0000000000 --- a/tkg/tkgconfigproviders/client.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tkgconfigproviders helps setup and modify configs for TKG supported providers -package tkgconfigproviders - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -type client struct { - configDir string - tkgBomClient tkgconfigbom.Client - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter -} - -// New creates new tkgconfig providers client -func New(configDir string, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) Client { - tkgConfigProvidersClient := &client{ - configDir: configDir, - tkgBomClient: tkgconfigbom.New(configDir, tkgConfigReaderWriter), - tkgConfigReaderWriter: tkgConfigReaderWriter, - } - return tkgConfigProvidersClient -} - -// Client implements TKG provider configuration related functions -type Client interface { - NewAWSConfig(params *models.AWSRegionalClusterParams, encodedCredentials string) (*AWSConfig, error) - GetAzureVMImageInfo(tkrVersion string) (*tkgconfigbom.AzureInfo, error) - GetAWSAMIInfo(bomConfiguration *tkgconfigbom.BOMConfiguration, awsRegion string) (*tkgconfigbom.AMIInfo, error) - NewAzureConfig(params *models.AzureRegionalClusterParams) (*AzureConfig, error) - NewVSphereConfig(params *models.VsphereRegionalClusterParams) (*VSphereConfig, error) - NewDockerConfig(params *models.DockerRegionalClusterParams) (*DockerConfig, error) - CreateAWSParams(res *AWSConfig) (params *models.AWSRegionalClusterParams, err error) - CreateAzureParams(res *AzureConfig) (params *models.AzureRegionalClusterParams, err error) - CreateDockerParams(res *DockerConfig) (params *models.DockerRegionalClusterParams, err error) - CreateVSphereParams(res *VSphereConfig) (params *models.VsphereRegionalClusterParams, err error) -} - -// TKGConfigReaderWriter returns tkgConfigReaderWriter client -func (c *client) TKGConfigReaderWriter() tkgconfigreaderwriter.TKGConfigReaderWriter { - return c.tkgConfigReaderWriter -} diff --git a/tkg/tkgconfigproviders/docker.go b/tkg/tkgconfigproviders/docker.go deleted file mode 100644 index c7e8994ba6..0000000000 --- a/tkg/tkgconfigproviders/docker.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -import ( - "encoding/base64" - "strconv" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// DockerConfig is the tkg config file for docker provider -type DockerConfig struct { - ClusterName string `yaml:"CLUSTER_NAME,omitempty"` - ClusterLabels string `yaml:"CLUSTER_LABELS,omitempty"` - ClusterAnnotations string `yaml:"CLUSTER_ANNOTATIONS,omitempty"` - InfrastructureProvider string `yaml:"INFRASTRUCTURE_PROVIDER,omitempty"` - ClusterPlan string `yaml:"CLUSTER_PLAN,omitempty"` - CeipParticipation string `yaml:"ENABLE_CEIP_PARTICIPATION,omitempty"` - MachineHealthCheckEnabled string `yaml:"ENABLE_MHC,omitempty"` - ServiceCIDR string `yaml:"SERVICE_CIDR,omitempty"` - ClusterCIDR string `yaml:"CLUSTER_CIDR,omitempty"` - ClusterHTTPProxy string `yaml:"TKG_HTTP_PROXY,omitempty"` - ClusterHTTPSProxy string `yaml:"TKG_HTTPS_PROXY,omitempty"` - ClusterNoProxy string `yaml:"TKG_NO_PROXY,omitempty"` - HTTPProxyEnabled string `yaml:"TKG_HTTP_PROXY_ENABLED"` - IDPConfig `yaml:",inline"` - OsInfo `yaml:",inline"` -} - -func (c *client) NewDockerConfig(params *models.DockerRegionalClusterParams) (*DockerConfig, error) { - var err error - res := &DockerConfig{ - ClusterName: params.ClusterName, - ClusterLabels: mapToConfigString(params.Labels), - ClusterAnnotations: mapToConfigString(params.Annotations), - InfrastructureProvider: constants.InfrastructureProviderDocker, - ClusterPlan: constants.PlanDev, - ClusterCIDR: params.Networking.ClusterPodCIDR, - ServiceCIDR: params.Networking.ClusterServiceCIDR, - HTTPProxyEnabled: falseConst, - } - - if params.CeipOptIn != nil { - res.CeipParticipation = strconv.FormatBool(*params.CeipOptIn) - } - - if params.IdentityManagement != nil { //nolint:dupl - res.IdentityManagementType = *params.IdentityManagement.IdmType - res.OIDCProviderName = params.IdentityManagement.OidcProviderName - res.OIDCIssuerURL = params.IdentityManagement.OidcProviderURL.String() - res.OIDCClientID = params.IdentityManagement.OidcClientID - res.OIDCClientSecret = params.IdentityManagement.OidcClientSecret - res.OIDCScopes = params.IdentityManagement.OidcScope - res.OIDCGroupsClaim = params.IdentityManagement.OidcClaimMappings["groups"] - res.OIDCUsernameClaim = params.IdentityManagement.OidcClaimMappings["username"] - res.LDAPBindDN = params.IdentityManagement.LdapBindDn - res.LDAPBindPassword = params.IdentityManagement.LdapBindPassword - res.LDAPHost = params.IdentityManagement.LdapURL - res.LDAPUserSearchBaseDN = params.IdentityManagement.LdapUserSearchBaseDn - res.LDAPUserSearchFilter = params.IdentityManagement.LdapUserSearchFilter - res.LDAPUserSearchUsername = params.IdentityManagement.LdapUserSearchUsername - res.LDAPUserSearchNameAttr = params.IdentityManagement.LdapUserSearchNameAttr - res.LDAPGroupSearchBaseDN = params.IdentityManagement.LdapGroupSearchBaseDn - res.LDAPGroupSearchFilter = params.IdentityManagement.LdapGroupSearchFilter - res.LDAPGroupSearchUserAttr = params.IdentityManagement.LdapGroupSearchUserAttr - res.LDAPGroupSearchGroupAttr = params.IdentityManagement.LdapGroupSearchGroupAttr - res.LDAPGroupSearchNameAttr = params.IdentityManagement.LdapGroupSearchNameAttr - res.LDAPRootCAData = base64.StdEncoding.EncodeToString([]byte(params.IdentityManagement.LdapRootCa)) - } - - if params.Networking != nil && params.Networking.HTTPProxyConfiguration != nil && params.Networking.HTTPProxyConfiguration.Enabled { - res.HTTPProxyEnabled = trueConst - conf := params.Networking.HTTPProxyConfiguration - res.ClusterHTTPProxy, err = CheckAndGetProxyURL(conf.HTTPProxyUsername, conf.HTTPProxyPassword, conf.HTTPProxyURL) - if err != nil { - return res, err - } - res.ClusterHTTPSProxy, err = CheckAndGetProxyURL(conf.HTTPSProxyUsername, conf.HTTPSProxyPassword, conf.HTTPSProxyURL) - if err != nil { - return res, err - } - res.ClusterNoProxy = params.Networking.HTTPProxyConfiguration.NoProxy - } - - if params.MachineHealthCheckEnabled { - res.MachineHealthCheckEnabled = trueConst - } else { - res.MachineHealthCheckEnabled = falseConst - } - - return res, nil -} - -// CreateDockerParams generates a Params object from a DockerConfig, used for importing configuration files -func (c *client) CreateDockerParams(dockerConfig *DockerConfig) (params *models.DockerRegionalClusterParams, err error) { - ceipOptIn := dockerConfig.CeipParticipation == trueConst - - params = &models.DockerRegionalClusterParams{ - Annotations: configStringToMap(dockerConfig.ClusterAnnotations), - ClusterName: dockerConfig.ClusterName, - Networking: createDockerNetworkingConfig(dockerConfig), - CeipOptIn: &ceipOptIn, - ControlPlaneFlavor: "", - IdentityManagement: createIdentityManagementConfig(dockerConfig), - KubernetesVersion: "", - Labels: configStringToMap(dockerConfig.ClusterLabels), - MachineHealthCheckEnabled: dockerConfig.MachineHealthCheckEnabled == trueConst, - NumOfWorkerNodes: "", - } - - return params, nil -} - -// createDockerNetworkingConfig() creates a TKGNetwork from a docker config. Note that we need a special method here, -// because the other providers have a Networking object that they use within their xxxConfig object, -// but Docker just has the fields at the DockerConfig level -func createDockerNetworkingConfig(conf *DockerConfig) *models.TKGNetwork { - return &models.TKGNetwork{ - ClusterDNSName: "", - ClusterNodeCIDR: "", - ClusterPodCIDR: conf.ClusterCIDR, - ClusterServiceCIDR: conf.ServiceCIDR, - CniType: "", - HTTPProxyConfiguration: createHTTPProxyConfig(conf), - NetworkName: "", - } -} diff --git a/tkg/tkgconfigproviders/helper.go b/tkg/tkgconfigproviders/helper.go deleted file mode 100644 index cd381b7c9e..0000000000 --- a/tkg/tkgconfigproviders/helper.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -import "strings" - -// mapToConfigString returns a string with key:value pairs separated by , -// For example: "key1:value1,key2:value2" -// An empty map returns an empty string -// An empty key is ignored -func mapToConfigString(data map[string]string) string { - result := "" - for key, value := range data { - if len(key) > 0 { - result += key + ":" + value + "," - } - } - result = strings.TrimSuffix(result, ",") - return result -} - -// configStringToMap parses a data string into a map -// The expected format is: "key1:value1,key2:value2" -// Blank values are ignored; any key-value with no colon (or multiple colons) is ignored; -// An empty data string is allowed; an empty map will be returned -// A string ending with a comma is allowed ("key1:value1,key2:value2,") -func configStringToMap(data string) map[string]string { - result := make(map[string]string) - - entryArray := strings.Split(data, ",") - for _, entry := range entryArray { - keyValue := strings.Split(entry, ":") - if len(keyValue) == 2 { - result[keyValue[0]] = keyValue[1] - } - } - return result -} diff --git a/tkg/tkgconfigproviders/helper_test.go b/tkg/tkgconfigproviders/helper_test.go deleted file mode 100644 index 99478dff71..0000000000 --- a/tkg/tkgconfigproviders/helper_test.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -import ( - "strings" - "testing" -) - -func shouldContain(t *testing.T, result, expected string) { - if !strings.Contains(result, expected) { - t.Fatalf("Result \"%s\" was expected to contain \"%s\" (but doesn't)", result, expected) - } -} - -func shouldBeBlank(t *testing.T, result, description string) { - if result != "" { - t.Fatalf("Test \"%s\" expected a blank result, but got \"%s\"", description, result) - } -} - -func TestMapToConfigString(t *testing.T) { - target := map[string]string{"key1": "value1", "key2": "value2"} - result := mapToConfigString(target) - shouldContain(t, result, "key1:value1") - shouldContain(t, result, "key2:value2") - if strings.LastIndex(result, ",") == len(result)-1 { - t.Fatalf("Test with two keys detected ending comma: \"%s\"", result) - } - - result = mapToConfigString(nil) - shouldBeBlank(t, result, "sending nil") - - result = mapToConfigString(map[string]string{}) - shouldBeBlank(t, result, "sending empty map") - - result = mapToConfigString(map[string]string{"": "blank", "foo": "bar"}) - if result != "foo:bar" { - t.Fatalf("Test with blank key expected to be ignored, but got \"%s\"", result) - } -} - -func shouldBeEmpty(t *testing.T, target string, result map[string]string) { - if len(result) > 0 { - t.Fatalf("Test sending string \"%s\" expected an empty map to result, but got \"%v\"", target, result) - } -} - -func shouldHaveOneEntry(t *testing.T, target string, result map[string]string, key, value string) { - if len(result) != 1 { - t.Fatalf("Test sending string \"%s\" expected a single-entry map to result, but got \"%v\"", target, result) - } else if result[key] != value { - t.Fatalf("Test sending string \"%s\" expected a result of map[%s:%s], but got \"%v\"", target, key, value, result) - } -} - -func shouldHaveTwoEntries(t *testing.T, target string, result map[string]string, key1 string, value1 string, key2 string, value2 string) { - if len(result) != 2 { - t.Fatalf("Test sending string \"%s\" expected a double-entry map to result, but got \"%v\"", target, result) - } else if result[key1] != value1 || result[key2] != value2 { - t.Fatalf("Test sending string \"%s\" expected a result of map[%s:%s %s:%s], but got \"%v\"", target, key1, value1, key2, value2, result) - } -} - -func TestConfigStringToMap(t *testing.T) { - target := "" - result := configStringToMap(target) - shouldBeEmpty(t, "", result) - - target = "malformedKeyValue" - result = configStringToMap(target) - shouldBeEmpty(t, target, result) - - target = "too:many:colons" - result = configStringToMap(target) - shouldBeEmpty(t, target, result) - - target = "key1:value1" - result = configStringToMap(target) - shouldHaveOneEntry(t, target, result, "key1", "value1") - - target = "key:value," - result = configStringToMap(target) - shouldHaveOneEntry(t, target, result, "key", "value") - - target = "key1:value1,malformedKeyValuePair" - result = configStringToMap(target) - shouldHaveOneEntry(t, target, result, "key1", "value1") - - target = "malformedKeyValuePair,key1:value1," - result = configStringToMap(target) - shouldHaveOneEntry(t, target, result, "key1", "value1") - - target = "key1:value1,,,," - result = configStringToMap(target) - shouldHaveOneEntry(t, target, result, "key1", "value1") - - target = "key1:value1,key2:value2," - result = configStringToMap(target) - shouldHaveTwoEntries(t, target, result, "key1", "value1", "key2", "value2") - - target = "key1:value1,key2:value2" - result = configStringToMap(target) - shouldHaveTwoEntries(t, target, result, "key1", "value1", "key2", "value2") -} - -type testStruct struct { - Foo string -} - -func TestGetFieldFromConfig(t *testing.T) { - fieldValue := "bar" - target := testStruct{Foo: fieldValue} - fieldName := "Foo" - result := getFieldFromConfig(target, fieldName) - if result != fieldValue { - t.Fatalf("getFieldFromConfig(%v, '%s') expected return of '%s' but got '%s'", target, fieldName, fieldValue, result) - } - - unknownField := "foogle" - result = getFieldFromConfig(target, unknownField) - if result != "" { - t.Fatalf("getFieldFromConfig(%v, %s) expected return of '' but got '%s'", target, fieldName, result) - } -} diff --git a/tkg/tkgconfigproviders/helpers.go b/tkg/tkgconfigproviders/helpers.go deleted file mode 100644 index db4d99ce15..0000000000 --- a/tkg/tkgconfigproviders/helpers.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -import ( - "encoding/base64" - "fmt" - "net/url" - "reflect" - - "github.com/go-openapi/strfmt" - - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -func createIdentityManagementConfig(config interface{}) *models.IdentityManagementConfig { - if getFieldFromConfig(config, "IdentityManagementType") == "" { - return nil - } - - idmType := getFieldFromConfig(config, "IdentityManagementType") - ldapRootCa, _ := base64.StdEncoding.DecodeString(getFieldFromConfig(config, "LDAPRootCAData")) - - return &models.IdentityManagementConfig{ - IdmType: &idmType, - LdapBindDn: getFieldFromConfig(config, "LDAPBindDN"), - LdapBindPassword: getFieldFromConfig(config, "LDAPBindPassword"), - LdapGroupSearchBaseDn: getFieldFromConfig(config, "LDAPGroupSearchBaseDN"), - LdapGroupSearchFilter: getFieldFromConfig(config, "LDAPGroupSearchFilter"), - LdapGroupSearchGroupAttr: getFieldFromConfig(config, "LDAPGroupSearchGroupAttr"), - LdapGroupSearchNameAttr: getFieldFromConfig(config, "LDAPGroupSearchNameAttr"), - LdapGroupSearchUserAttr: getFieldFromConfig(config, "LDAPGroupSearchUserAttr"), - LdapRootCa: string(ldapRootCa), - LdapURL: getFieldFromConfig(config, "LDAPHost"), - LdapUserSearchBaseDn: getFieldFromConfig(config, "LDAPUserSearchBaseDN"), - LdapUserSearchEmailAttr: "", - LdapUserSearchFilter: getFieldFromConfig(config, "LDAPUserSearchFilter"), - LdapUserSearchIDAttr: "", - LdapUserSearchNameAttr: getFieldFromConfig(config, "LDAPUserSearchNameAttr"), - LdapUserSearchUsername: getFieldFromConfig(config, "LDAPUserSearchUsername"), - OidcClaimMappings: map[string]string{ - "groups": getFieldFromConfig(config, "OIDCGroupsClaim"), - "username": getFieldFromConfig(config, "OIDCUsernameClaim"), - }, - OidcClientID: getFieldFromConfig(config, "OIDCClientID"), - OidcClientSecret: getFieldFromConfig(config, "OIDCClientSecret"), - OidcProviderName: getFieldFromConfig(config, "OIDCProviderName"), - OidcProviderURL: strfmt.URI(getFieldFromConfig(config, "OIDCIssuerURL")), - OidcScope: getFieldFromConfig(config, "OIDCScopes"), - OidcSkipVerifyCert: false, - } -} - -func createNetworkingConfig(config interface{}) *models.TKGNetwork { - if getFieldFromConfig(config, "Network") == "" { - return nil - } - - return &models.TKGNetwork{ - ClusterDNSName: "", - ClusterNodeCIDR: "", - ClusterPodCIDR: getFieldFromConfig(config, "ClusterCIDR"), - ClusterServiceCIDR: getFieldFromConfig(config, "ServiceCIDR"), - CniType: "", - HTTPProxyConfiguration: createHTTPProxyConfig(config), - NetworkName: "", - } -} - -func createHTTPProxyConfig(config interface{}) *models.HTTPProxyConfiguration { - var httpProxyConfig *models.HTTPProxyConfiguration - if getFieldFromConfig(config, "HTTPProxyEnabled") == trueConst { - httpURL, _ := url.Parse(getFieldFromConfig(config, "ClusterHTTPProxy")) - httpPassword, _ := httpURL.User.Password() - httpsURL, _ := url.Parse(getFieldFromConfig(config, "ClusterHTTPSProxy")) - httpsPassword, _ := httpsURL.User.Password() - - httpProxyConfig = &models.HTTPProxyConfiguration{ - HTTPProxyPassword: httpPassword, - HTTPProxyURL: httpURL.Scheme + "://" + httpURL.Hostname() + httpURL.RequestURI(), - HTTPProxyUsername: httpURL.User.Username(), - HTTPSProxyPassword: httpsPassword, - HTTPSProxyURL: httpsURL.Scheme + "://" + httpsURL.Hostname() + httpsURL.RequestURI(), - HTTPSProxyUsername: httpsURL.User.Username(), - Enabled: true, - NoProxy: getFieldFromConfig(config, "ClusterNoProxy"), - } - } - return httpProxyConfig -} - -func getFieldFromConfig(config interface{}, fieldName string) string { - field := reflect.ValueOf(config).FieldByName(fieldName) - if !field.IsValid() { - fmt.Printf("getFieldFromConfig() is unable to find field %s in object %v\n", fieldName, config) - return "" - } - return field.String() -} diff --git a/tkg/tkgconfigproviders/idp.go b/tkg/tkgconfigproviders/idp.go deleted file mode 100644 index e41d05186c..0000000000 --- a/tkg/tkgconfigproviders/idp.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -// IDPConfig struct defining properties for identity provider configuration -type IDPConfig struct { - IdentityManagementType string `yaml:"IDENTITY_MANAGEMENT_TYPE"` - OIDCConfig `yaml:",inline"` - LDAPConfig `yaml:",inline"` -} - -// OIDCConfig struct defining properties for OIDC configuration -type OIDCConfig struct { - OIDCProviderName string `yaml:"OIDC_IDENTITY_PROVIDER_NAME"` - OIDCIssuerURL string `yaml:"OIDC_IDENTITY_PROVIDER_ISSUER_URL"` - OIDCClientID string `yaml:"OIDC_IDENTITY_PROVIDER_CLIENT_ID"` - OIDCClientSecret string `yaml:"OIDC_IDENTITY_PROVIDER_CLIENT_SECRET"` - OIDCScopes string `yaml:"OIDC_IDENTITY_PROVIDER_SCOPES"` - OIDCGroupsClaim string `yaml:"OIDC_IDENTITY_PROVIDER_GROUPS_CLAIM"` - OIDCUsernameClaim string `yaml:"OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM"` -} - -// LDAPConfig struct defining properties for OIDC configuration -type LDAPConfig struct { - LDAPBindDN string `yaml:"LDAP_BIND_DN"` - LDAPBindPassword string `yaml:"LDAP_BIND_PASSWORD"` - LDAPHost string `yaml:"LDAP_HOST"` - LDAPUserSearchBaseDN string `yaml:"LDAP_USER_SEARCH_BASE_DN"` - LDAPUserSearchFilter string `yaml:"LDAP_USER_SEARCH_FILTER"` - LDAPUserSearchUsername string `yaml:"LDAP_USER_SEARCH_USERNAME"` - LDAPUserSearchNameAttr string `yaml:"LDAP_USER_SEARCH_NAME_ATTRIBUTE"` - LDAPGroupSearchBaseDN string `yaml:"LDAP_GROUP_SEARCH_BASE_DN"` - LDAPGroupSearchFilter string `yaml:"LDAP_GROUP_SEARCH_FILTER"` - LDAPGroupSearchUserAttr string `yaml:"LDAP_GROUP_SEARCH_USER_ATTRIBUTE"` - LDAPGroupSearchGroupAttr string `yaml:"LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE"` - LDAPGroupSearchNameAttr string `yaml:"LDAP_GROUP_SEARCH_NAME_ATTRIBUTE"` - LDAPRootCAData string `yaml:"LDAP_ROOT_CA_DATA_B64"` -} diff --git a/tkg/tkgconfigproviders/osinfo.go b/tkg/tkgconfigproviders/osinfo.go deleted file mode 100644 index 5e462fe28c..0000000000 --- a/tkg/tkgconfigproviders/osinfo.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -// OsInfo struct defining os name, version and arch properties of VM image -type OsInfo struct { - Name string `yaml:"OS_NAME"` - Version string `yaml:"OS_VERSION"` - Arch string `yaml:"OS_ARCH"` -} diff --git a/tkg/tkgconfigproviders/tkgconfig_test.go b/tkg/tkgconfigproviders/tkgconfig_test.go deleted file mode 100644 index 353084d17a..0000000000 --- a/tkg/tkgconfigproviders/tkgconfig_test.go +++ /dev/null @@ -1,959 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -import ( - "fmt" - "os" - "path/filepath" - "testing" - - "github.com/go-openapi/swag" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/otiai10/copy" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -const ( - proxyUsernameConst = "user" - proxyURL = "http://myproxy.com:3128" - tkgFlavorDev = "dev" - tkgFlavorProd = "prod" - fakeRegion = "us-east-2" -) - -var ( - testingDir string - err error - defaultBoMFilepath = "../fakes/config/bom/tkg-bom-v1.3.1.yaml" - defaultBoMFileName = "tkg-bom-v1.3.1.yaml" -) - -func setupBomFile(defaultBomFile string, configDir string) { // nolint - bomDir, err := tkgconfigpaths.New(configDir).GetTKGBoMDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - err = os.MkdirAll(bomDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - err = utils.CopyFile(defaultBomFile, filepath.Join(bomDir, defaultBoMFileName)) - Expect(err).ToNot(HaveOccurred()) -} - -func init() { - testingDir = fakehelper.CreateTempTestingDirectory() -} - -func TestTKGConfig(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Tkg config Suite") -} - -var _ = Describe("Azure VM Images", func() { - var ( - tkgConfigPath string - curHome string - curUserProfile string - err error - azureVMImage *tkgconfigbom.AzureInfo - ) - - BeforeEach(func() { - createTempDirectory("template_test") - curHome = os.Getenv("HOME") - curUserProfile = os.Getenv("USERPROFILE") - _ = os.Setenv("HOME", testingDir) - _ = os.Setenv("USERPROFILE", testingDir) - }) - - // Context("when Azure image config is not present in tkg config", func() { - // tkgConfigPath = "../fakes/config/config.yaml" - // azureVMImage, err = newForTesting(tkgConfigPath, testingDir, defaultBoMFilepath).GetAzureVMImageInfo("v1.18.0+vmware.1") - // Expect(err).ToNot(HaveOccurred()) - // Expect(azureVMImage).To(BeNil()) - // }) - - // TODO: Shared gallery image Azure - //Context("when Azure shared gallery image config is present in tkg config", func() { - // tkgConfigPath = "../fakes/config/config4.yaml" - // azureVMImage, err = newForTesting(tkgConfigPath, testingDir, defaultBoMFilepath).GetAzureVMImageInfo("v1.18.0+vmware.1") - // Expect(err).ToNot(HaveOccurred()) - // Expect(azureVMImage).NotTo(BeNil()) - // Expect(azureVMImage.ResourceGroup).To(Equal("capi-images")) - // Expect(azureVMImage.Name).To(Equal("capi-ubuntu-1804")) - // Expect(azureVMImage.SubscriptionID).To(Equal("d8d5fc65-407a-48c6-bf8b-cc072730cb2e")) - // Expect(azureVMImage.Gallery).To(Equal("ClusterAPI")) - // Expect(azureVMImage.Version).To(Equal("0.18.1600991471")) - //}) - - Context("when Azure marketplace image config is present in tkg config", func() { - tkgConfigPath = "../fakes/config/config3.yaml" - azureVMImage, err = newForTesting(tkgConfigPath, testingDir, defaultBoMFilepath).GetAzureVMImageInfo("v1.18.0+vmware.1-tkg.2") - Expect(err).ToNot(HaveOccurred()) - Expect(azureVMImage).NotTo(BeNil()) - Expect(azureVMImage.Publisher).To(Equal("vmware-inc")) - Expect(azureVMImage.Offer).To(Equal("tkg-capi")) - Expect(azureVMImage.Sku).To(Equal("k8s-1dot18dot8-ubuntu-1804")) - Expect(azureVMImage.Version).To(Equal("2020.09.09")) - Expect(azureVMImage.ThirdPartyImage).To(Equal(true)) - }) - - AfterEach(func() { - deleteTempDirectory() - _ = os.Setenv("HOME", curHome) - _ = os.Setenv("USERPROFILE", curUserProfile) - }) -}) - -var _ = Describe("Test AWS AMIID", func() { - var ( - vpcConfig *models.AWSVpc - params *models.AWSRegionalClusterParams - flavor string - bomConfiguration *tkgconfigbom.BOMConfiguration - ) - - JustBeforeEach(func() { - params = &models.AWSRegionalClusterParams{ - Vpc: vpcConfig, - AwsAccountParams: &models.AWSAccountParams{ - Region: fakeRegion, - }, - ControlPlaneFlavor: flavor, - Networking: &models.TKGNetwork{ - ClusterPodCIDR: "10.0.0.4/15", - }, - KubernetesVersion: "v1.18.0+vmware.1", - IdentityManagement: &models.IdentityManagementConfig{ - IdmType: swag.String("oidc"), - OidcClaimMappings: map[string]string{"groups": "group", "username": "usr"}, - OidcClientID: "client-id", - OidcClientSecret: "clientsecret", - OidcProviderName: "my-provider", - OidcProviderURL: "http:0.0.0.0", - OidcScope: "email", - OidcSkipVerifyCert: true, - }, - } - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - - bomConfiguration = &tkgconfigbom.BOMConfiguration{ - Release: &tkgconfigbom.ReleaseInfo{ - Version: "v1.18.0+vmware.1-tkg.2", - }, - AMI: map[string][]tkgconfigbom.AMIInfo{ - fakeRegion: { - { - ID: "ami-123456", - OSInfo: tkgconfigbom.OSInfo{ - Name: "amazon", - Version: "2", - Arch: "amd64", - }, - }, - { - ID: "ami-567890", - OSInfo: tkgconfigbom.OSInfo{ - Name: "ubuntu", - Version: "2", - Arch: "amd64", - }, - }, - }, - }, - } - - }) - - It("When OS is specified in the parameters", func() { - os := &models.AWSVirtualMachine{ - Name: "ubuntu", - OsInfo: &models.OSInfo{ - Arch: "amd64", - Name: "ubuntu", - Version: "2", - }, - } - - params.Os = os - amiID := getAMIId(bomConfiguration, params) - Expect(amiID).To(Equal("ami-567890")) - }) - - It("When OS is not specified in the parameters", func() { - amiID := getAMIId(bomConfiguration, params) - Expect(amiID).To(Equal("ami-123456")) - }) -}) - -var _ = Describe("EnsureNewVPCAWSConfig", func() { - var ( - err error - vpcConfig *models.AWSVpc - config *AWSConfig - params *models.AWSRegionalClusterParams - flavor string - client Client - labels map[string]string - annotations map[string]string - ) - - JustBeforeEach(func() { - params = &models.AWSRegionalClusterParams{ - Vpc: vpcConfig, - AwsAccountParams: &models.AWSAccountParams{ - Region: "us-west-2", - }, - ControlPlaneFlavor: flavor, - Labels: labels, - Annotations: annotations, - Networking: &models.TKGNetwork{ - ClusterPodCIDR: "10.0.0.4/15", - }, - KubernetesVersion: "v1.18.0+vmware.1", - IdentityManagement: &models.IdentityManagementConfig{ - IdmType: swag.String("oidc"), - OidcClaimMappings: map[string]string{"groups": "group", "username": "usr"}, - OidcClientID: "client-id", - OidcClientSecret: "clientsecret", - OidcProviderName: "my-provider", - OidcProviderURL: "http:0.0.0.0", - OidcScope: "email", - OidcSkipVerifyCert: true, - }, - } - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - - client = newForTesting("../fakes/config/config.yaml", testingDir, defaultBoMFilepath) - config, err = client.NewAWSConfig(params, "abc") - }) - - Context("when dev config is used", func() { - BeforeEach(func() { - vpcConfig = &models.AWSVpc{ - Cidr: "10.0.0.0/16", - Azs: []*models.AWSNodeAz{ - { - Name: "us-west-2a", - }, - }, - } - flavor = tkgFlavorDev - }) - - It("should create vpc with 2 subnets", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(config).ToNot(BeNil(), "config should be created") - Expect(config.VPCCidr).To(Equal("10.0.0.0/16")) - Expect(config.NodeAz).To(Equal("us-west-2a")) - Expect(config.PublicNodeCidr).To(Equal("10.0.0.0/20")) - Expect(config.PrivateNodeCidr).To(Equal("10.0.16.0/20")) - Expect(config.Node2Az).To(Equal("")) - Expect(config.PublicNode2Cidr).To(Equal("")) - Expect(config.PrivateNode2Cidr).To(Equal("")) - Expect(config.Node3Az).To(Equal("")) - Expect(config.PublicNode3Cidr).To(Equal("")) - Expect(config.PrivateNode3Cidr).To(Equal("")) - }) - }) - - Context("when dev config is used with non-default VPC CIDR", func() { - BeforeEach(func() { - vpcConfig = &models.AWSVpc{ - Cidr: "10.4.0.0/20", - Azs: []*models.AWSNodeAz{ - { - Name: "us-west-2a", - }, - }, - } - flavor = tkgFlavorDev - }) - - It("should create vpc with 2 subnets", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(config.VPCCidr).To(Equal("10.4.0.0/20")) - Expect(config.NodeAz).To(Equal("us-west-2a")) - Expect(config.PublicNodeCidr).To(Equal("10.4.0.0/24")) - Expect(config.PrivateNodeCidr).To(Equal("10.4.1.0/24")) - Expect(config.Node2Az).To(Equal("")) - Expect(config.PublicNode2Cidr).To(Equal("")) - Expect(config.PrivateNode2Cidr).To(Equal("")) - Expect(config.Node3Az).To(Equal("")) - Expect(config.PublicNode3Cidr).To(Equal("")) - Expect(config.PrivateNode3Cidr).To(Equal("")) - }) - }) - - Context("when prod config is used", func() { - BeforeEach(func() { - vpcConfig = &models.AWSVpc{ - Cidr: "10.0.0.0/16", - Azs: []*models.AWSNodeAz{ - { - Name: "us-west-2a", - }, - { - Name: "us-west-2b", - }, - { - Name: "us-west-2c", - }, - }, - } - flavor = tkgFlavorProd - }) - - It("should create vpc with 6 subnets", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(config.VPCCidr).To(Equal("10.0.0.0/16")) - Expect(config.NodeAz).To(Equal("us-west-2a")) - Expect(config.PublicNodeCidr).To(Equal("10.0.0.0/20")) - Expect(config.PrivateNodeCidr).To(Equal("10.0.16.0/20")) - Expect(config.Node2Az).To(Equal("us-west-2b")) - Expect(config.PublicNode2Cidr).To(Equal("10.0.32.0/20")) - Expect(config.PrivateNode2Cidr).To(Equal("10.0.48.0/20")) - Expect(config.Node3Az).To(Equal("us-west-2c")) - Expect(config.PublicNode3Cidr).To(Equal("10.0.64.0/20")) - Expect(config.PrivateNode3Cidr).To(Equal("10.0.80.0/20")) - }) - }) - - Context("when prod config is used with a non-default VPC CIDR", func() { - BeforeEach(func() { - vpcConfig = &models.AWSVpc{ - Cidr: "10.4.0.0/20", - Azs: []*models.AWSNodeAz{ - { - Name: "us-west-2a", - }, - { - Name: "us-west-2b", - }, - { - Name: "us-west-2c", - }, - }, - } - flavor = tkgFlavorProd - }) - - It("should create vpc with 6 subnets", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(config.VPCCidr).To(Equal("10.4.0.0/20")) - Expect(config.NodeAz).To(Equal("us-west-2a")) - Expect(config.PublicNodeCidr).To(Equal("10.4.0.0/24")) - Expect(config.PrivateNodeCidr).To(Equal("10.4.1.0/24")) - Expect(config.Node2Az).To(Equal("us-west-2b")) - Expect(config.PublicNode2Cidr).To(Equal("10.4.2.0/24")) - Expect(config.PrivateNode2Cidr).To(Equal("10.4.3.0/24")) - Expect(config.Node3Az).To(Equal("us-west-2c")) - Expect(config.PublicNode3Cidr).To(Equal("10.4.4.0/24")) - Expect(config.PrivateNode3Cidr).To(Equal("10.4.5.0/24")) - }) - }) - - Context("when dev config is used with wrong number of AZs", func() { - BeforeEach(func() { - vpcConfig = &models.AWSVpc{ - Cidr: "10.0.0.0/16", - Azs: []*models.AWSNodeAz{ - { - Name: "us-west-2a", - }, - { - Name: "us-west-2b", - }, - }, - } - flavor = tkgFlavorDev - }) - - It("should err when creating subnets", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("number of Availability Zones not 1 for developer cluster, actual 2")) - }) - }) - - Context("when prod config is used with wrong number of AZs", func() { - BeforeEach(func() { - vpcConfig = &models.AWSVpc{ - Cidr: "10.0.0.0/16", - Azs: []*models.AWSNodeAz{ - { - Name: "us-west-2a", - }, - }, - } - flavor = tkgFlavorProd - }) - - It("should err when creating subnets", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("number of Availability Zones less than 3 for production cluster, actual 1")) - }) - }) - - Context("when no AZs are provided", func() { - BeforeEach(func() { - vpcConfig = &models.AWSVpc{ - Cidr: "10.0.0.0/16", - Azs: []*models.AWSNodeAz{}, - } - flavor = tkgFlavorProd - }) - - It("should err when creating subnets", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("AWS node availability zone cannot be empty")) - }) - }) - - Context("when labels and annotations are provided", func() { - BeforeEach(func() { - labels = map[string]string{"foo-key1": "foo-value1", "foo-key2": "foo-value2"} - annotations = map[string]string{"location": "foo-location", "description": "foo-description"} - vpcConfig = &models.AWSVpc{ - Cidr: "10.4.0.0/20", - Azs: []*models.AWSNodeAz{ - { - Name: "us-west-2a", - }, - }, - } - flavor = tkgFlavorDev - }) - - It("should populate config fields", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(config).ToNot(BeNil(), "config should be created") - Expect(config.ClusterLabels).ToNot(BeNil(), "cluster labels should be created") - Expect(config.ClusterLabels).To(ContainSubstring("foo-key1:foo-value1")) - Expect(config.ClusterLabels).To(ContainSubstring("foo-key2:foo-value2")) - Expect(config.ClusterAnnotations).ToNot(BeNil(), "cluster annotations should be created") - Expect(config.ClusterAnnotations).To(ContainSubstring("location:foo-location")) - Expect(config.ClusterAnnotations).To(ContainSubstring("description:foo-description")) - }) - }) -}) - -var _ = Describe("EnsureExistingVPCAWSConfig", func() { - var ( - err error - vpcConfig *models.AWSVpc - config *AWSConfig - params *models.AWSRegionalClusterParams - flavor string - ) - - JustBeforeEach(func() { - params = &models.AWSRegionalClusterParams{ - Vpc: vpcConfig, - AwsAccountParams: &models.AWSAccountParams{ - Region: "us-west-2", - }, - ControlPlaneFlavor: flavor, - Networking: &models.TKGNetwork{ - ClusterPodCIDR: "10.0.0.4/15", - }, - KubernetesVersion: "v1.18.0+vmware.1", - } - - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - config, err = newForTesting("../fakes/config/config.yaml", testingDir, defaultBoMFilepath).NewAWSConfig(params, "abc") - }) - - Context("when dev config is used", func() { - BeforeEach(func() { - vpcConfig = &models.AWSVpc{ - VpcID: "vpc-id-1", - Azs: []*models.AWSNodeAz{ - { - Name: "us-west-2a", - PrivateSubnetID: "subnet-id-private-1", - PublicSubnetID: "subnet-id-public-1", - }, - }, - } - flavor = tkgFlavorDev - }) - - It("should create vpc with 2 subnets", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(config.AWSVPCID).To(Equal("vpc-id-1")) - Expect(config.NodeAz).To(Equal("us-west-2a")) - Expect(config.AWSPublicSubnetID).To(Equal("subnet-id-public-1")) - Expect(config.AWSPrivateSubnetID).To(Equal("subnet-id-private-1")) - Expect(config.Node2Az).To(Equal("")) - Expect(config.AWSPublicSubnetID2).To(Equal("")) - Expect(config.AWSPrivateSubnetID2).To(Equal("")) - Expect(config.Node3Az).To(Equal("")) - Expect(config.AWSPublicSubnetID3).To(Equal("")) - Expect(config.AWSPrivateSubnetID3).To(Equal("")) - }) - }) - - Context("when prod config is used", func() { - BeforeEach(func() { - vpcConfig = &models.AWSVpc{ - VpcID: "vpc-id-1", - Azs: []*models.AWSNodeAz{ - { - Name: "us-west-2a", - PrivateSubnetID: "subnet-id-private-1", - PublicSubnetID: "subnet-id-public-1", - }, - { - Name: "us-west-2b", - PrivateSubnetID: "subnet-id-private-2", - PublicSubnetID: "subnet-id-public-2", - }, - { - Name: "us-west-2c", - PrivateSubnetID: "subnet-id-private-3", - PublicSubnetID: "subnet-id-public-3", - }, - }, - } - flavor = tkgFlavorProd - }) - - It("should create vpc with 6 subnets", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(config.AWSVPCID).To(Equal("vpc-id-1")) - Expect(config.NodeAz).To(Equal("us-west-2a")) - Expect(config.AWSPublicSubnetID).To(Equal("subnet-id-public-1")) - Expect(config.AWSPrivateSubnetID).To(Equal("subnet-id-private-1")) - Expect(config.Node2Az).To(Equal("us-west-2b")) - Expect(config.AWSPublicSubnetID2).To(Equal("subnet-id-public-2")) - Expect(config.AWSPrivateSubnetID2).To(Equal("subnet-id-private-2")) - Expect(config.Node3Az).To(Equal("us-west-2c")) - Expect(config.AWSPublicSubnetID3).To(Equal("subnet-id-public-3")) - Expect(config.AWSPrivateSubnetID3).To(Equal("subnet-id-private-3")) - }) - }) - - Context("when VPC ID and CIDR are provided", func() { - BeforeEach(func() { - vpcConfig = &models.AWSVpc{ - VpcID: "vpc-id-1", - Cidr: "10.6.0.0/20", - Azs: []*models.AWSNodeAz{ - { - Name: "us-west-2a", - PrivateSubnetID: "subnet-id-private-1", - PublicSubnetID: "subnet-id-public-1", - }, - { - Name: "us-west-2b", - PrivateSubnetID: "subnet-id-private-2", - PublicSubnetID: "subnet-id-public-2", - }, - { - Name: "us-west-2c", - PrivateSubnetID: "subnet-id-private-3", - PublicSubnetID: "subnet-id-public-3", - }, - }, - } - flavor = tkgFlavorProd - }) - - It("should not create a new VPC", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(config.AWSVPCID).To(Equal("vpc-id-1")) - Expect(config.VPCCidr).To(Not(Equal("10.6.0.0/20"))) - }) - }) -}) - -var _ = Describe("CheckAndGetProxyURL", func() { - var ( - url string - username string - password string - err error - proxy string - ) - - JustBeforeEach(func() { - proxy, err = CheckAndGetProxyURL(username, password, url) - }) - - Context("when scheme is missing", func() { - BeforeEach(func() { - url = "myproxy.com" - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("scheme is missing from the proxy URL")) - }) - }) - - Context("when username and password is not provided", func() { - BeforeEach(func() { - url = proxyURL - }) - It("should return the url", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(proxy).To(Equal("http://myproxy.com:3128")) - }) - }) - Context("when only username is provided", func() { - BeforeEach(func() { - url = proxyURL - username = proxyUsernameConst - }) - It("should return the proxy url with username", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(proxy).To(Equal("http://user@myproxy.com:3128")) - }) - }) - - Context("when username and password is provided", func() { - BeforeEach(func() { - url = proxyURL - username = proxyUsernameConst - password = "pword" - }) - It("should return the proxy url with username and password", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(proxy).To(Equal("http://user:pword@myproxy.com:3128")) - }) - }) - - Context("When full http proxy url is given", func() { - BeforeEach(func() { - url = "http://user:pword@myproxy.com:1234" - }) - It("should return the proxy url with username and password and given port number", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(proxy).To(Equal(url)) - }) - }) -}) - -var _ = Describe("GetAWSAMIInfo", func() { - var ( - err error - bomConfiguration = &tkgconfigbom.BOMConfiguration{ - Release: &tkgconfigbom.ReleaseInfo{ - Version: "v1.18.0+vmware.1-tkg.2", - }, - AMI: map[string][]tkgconfigbom.AMIInfo{ - fakeRegion: { - { - ID: "ami-123456", - OSInfo: tkgconfigbom.OSInfo{ - Name: "amazon", - Version: "2", - Arch: "amd64", - }, - }, - }, - }, - } - client Client - amiInfo *tkgconfigbom.AMIInfo - region string - ) - JustBeforeEach(func() { - amiInfo, err = client.GetAWSAMIInfo(bomConfiguration, region) - }) - - Context("When ami not found for region", func() { - BeforeEach(func() { - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - os.Setenv("OS_NAME", "ubuntu") - client = newForTesting("../fakes/config/config.yaml", testingDir, defaultBoMFilepath) - region = "us-middle-2" - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When ami not found for provided OS Options", func() { - BeforeEach(func() { - region = fakeRegion - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - os.Setenv("OS_NAME", "ubuntu") - client = newForTesting("../fakes/config/config.yaml", testingDir, defaultBoMFilepath) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When ami can be found", func() { - BeforeEach(func() { - region = fakeRegion - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - os.Setenv("OS_NAME", "amazon") - client = newForTesting("../fakes/config/config.yaml", testingDir, defaultBoMFilepath) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(amiInfo.OSInfo.Name).To(Equal("amazon")) - }) - }) -}) - -var _ = Describe("NewAzureConfig", func() { - var ( - err error - flavor = "dev" - client Client - params = &models.AzureRegionalClusterParams{ - ClusterName: "my-cluster", - ControlPlaneFlavor: flavor, - Location: "US WEST 2", - Networking: &models.TKGNetwork{ - ClusterPodCIDR: "10.0.0.4/15", - HTTPProxyConfiguration: &models.HTTPProxyConfiguration{ - HTTPProxyPassword: "pw", - HTTPProxyURL: "http://0.0.0.0", - HTTPProxyUsername: "user", - HTTPSProxyPassword: "pw", - HTTPSProxyURL: "http://0.0.0.0", - HTTPSProxyUsername: "user", - Enabled: true, - NoProxy: "127.0.0.1", - }, - }, - KubernetesVersion: "v1.18.0+vmware.1", - IdentityManagement: &models.IdentityManagementConfig{ - IdmType: swag.String("oidc"), - OidcClaimMappings: map[string]string{"groups": "group", "username": "usr"}, - OidcClientID: "client-id", - OidcClientSecret: "clientsecret", - OidcProviderName: "my-provider", - OidcProviderURL: "http:0.0.0.0", - OidcScope: "email", - OidcSkipVerifyCert: true, - }, - AzureAccountParams: &models.AzureAccountParams{}, - Os: &models.AzureVirtualMachine{ - Name: "ubuntu", - }, - MachineHealthCheckEnabled: true, - IsPrivateCluster: true, - VnetCidr: "10.0.0.0/16", - } - ) - - Context("When generating azure cluster config", func() { - It("should not return an error", func() { - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - - client = newForTesting("../fakes/config/config.yaml", testingDir, defaultBoMFilepath) - _, err = client.NewAzureConfig(params) - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) - -var _ = Describe("NewVsphereConfig", func() { - var ( - err error - flavor = "dev" - client Client - params = &models.VsphereRegionalClusterParams{ - ClusterName: "my-cluster", - ControlPlaneFlavor: flavor, - Networking: &models.TKGNetwork{ - ClusterPodCIDR: "10.0.0.4/15", - HTTPProxyConfiguration: &models.HTTPProxyConfiguration{ - HTTPProxyPassword: "pw", - HTTPProxyURL: "http://0.0.0.0", - HTTPProxyUsername: "user", - HTTPSProxyPassword: "pw", - HTTPSProxyURL: "http://0.0.0.0", - HTTPSProxyUsername: "user", - Enabled: true, - NoProxy: "127.0.0.1", - }, - }, - KubernetesVersion: "v1.18.0+vmware.1", - IdentityManagement: &models.IdentityManagementConfig{ - IdmType: swag.String("oidc"), - OidcClaimMappings: map[string]string{"groups": "group", "username": "usr"}, - OidcClientID: "client-id", - OidcClientSecret: "clientsecret", - OidcProviderName: "my-provider", - OidcProviderURL: "http:0.0.0.0", - OidcScope: "email", - OidcSkipVerifyCert: true, - }, - Os: &models.VSphereVirtualMachine{ - Name: "ubuntu", - }, - EnableAuditLogging: true, - VsphereCredentials: &models.VSphereCredentials{}, - WorkerNodeType: "large", - ControlPlaneNodeType: "medium", - MachineHealthCheckEnabled: true, - AviConfig: &models.AviConfig{ - Cloud: "cloud-name", - ServiceEngine: "service-engine", - ControlPlaneHaProvider: true, - Network: &models.AviNetworkParams{ - Cidr: "10.0.0.0/16", - Name: "avi-network-name", - }, - ControlPlaneNetwork: &models.AviNetworkParams{ - Cidr: "10.0.0.1/16", - Name: "avi-cp-network-name", - }, - ManagementClusterServiceEngine: "mc-service-engine", - ManagementClusterControlPlaneVipNetworkCidr: "10.0.0.2/16", - ManagementClusterControlPlaneVipNetworkName: "avi-mc-cp-network-name", - ManagementClusterVipNetworkCidr: "10.0.0.3/16", - ManagementClusterVipNetworkName: "avi-mc-dp-network-name", - }, - } - ) - - Context("When generating vsphere cluster config", func() { - It("should not return an error", func() { - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - - client = newForTesting("../fakes/config/config.yaml", testingDir, defaultBoMFilepath) - _, err = client.NewVSphereConfig(params) - Expect(err).ToNot(HaveOccurred()) - }) - It("should have correct values", func() { - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - - client = newForTesting("../fakes/config/config.yaml", testingDir, defaultBoMFilepath) - config, _ := client.NewVSphereConfig(params) - Expect(config.AviServiceEngine).To(Equal("service-engine")) - Expect(config.AviDataNetwork).To(Equal("avi-network-name")) - Expect(config.AviDataNetworkCIDR).To(Equal("10.0.0.0/16")) - Expect(config.AviControlPlaneNetwork).To(Equal("avi-cp-network-name")) - Expect(config.AviControlPlaneNetworkCIDR).To(Equal("10.0.0.1/16")) - Expect(config.AviManagementClusterServiceEngine).To(Equal("mc-service-engine")) - Expect(config.AviManagementClusterVipNetworkName).To(Equal("avi-mc-dp-network-name")) - Expect(config.AviManagementClusterVipNetworkCidr).To(Equal("10.0.0.3/16")) - Expect(config.AviManagementClusterControlPlaneVipNetworkName).To(Equal("avi-mc-cp-network-name")) - Expect(config.AviManagementClusterControlPlaneVipNetworkCIDR).To(Equal("10.0.0.2/16")) - }) - }) -}) - -var _ = Describe("NewDockerConfig", func() { - var ( - err error - flavor = "dev" - client Client - params = &models.DockerRegionalClusterParams{ - ClusterName: "my-cluster", - ControlPlaneFlavor: flavor, - Networking: &models.TKGNetwork{ - ClusterPodCIDR: "10.0.0.4/15", - HTTPProxyConfiguration: &models.HTTPProxyConfiguration{ - HTTPProxyPassword: "pw", - HTTPProxyURL: "http://0.0.0.0", - HTTPProxyUsername: "user", - HTTPSProxyPassword: "pw", - HTTPSProxyURL: "http://0.0.0.0", - HTTPSProxyUsername: "user", - Enabled: true, - NoProxy: "127.0.0.1", - }, - }, - KubernetesVersion: "v1.18.0+vmware.1", - IdentityManagement: &models.IdentityManagementConfig{ - IdmType: swag.String("oidc"), - OidcClaimMappings: map[string]string{"groups": "group", "username": "usr"}, - OidcClientID: "client-id", - OidcClientSecret: "clientsecret", - OidcProviderName: "my-provider", - OidcProviderURL: "http:0.0.0.0", - OidcScope: "email", - OidcSkipVerifyCert: true, - }, - MachineHealthCheckEnabled: true, - } - ) - - Context("When generating docker cluster config", func() { - It("should not return an error", func() { - setupBomFile("../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml", testingDir) - - client = newForTesting("../fakes/config/config.yaml", testingDir, defaultBoMFilepath) - _, err = client.NewDockerConfig(params) - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) - -func createTempDirectory(prefix string) { - testingDir, err = os.MkdirTemp("", prefix) - if err != nil { - fmt.Println("Error TempDir: ", err.Error()) - } -} - -func deleteTempDirectory() { - os.Remove(testingDir) -} - -func newForTesting(clusterConfigFile string, testingDir string, defaultBomFile string) Client { - testClusterConfigFile := setupPrerequsiteForTesting(clusterConfigFile, testingDir, defaultBomFile) - tkgConfigReaderWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(testClusterConfigFile, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - return New(testingDir, tkgConfigReaderWriter) -} - -var testTKGCompatibilityFileFmt = ` -version: v1 -managementClusterPluginVersions: -- version: %s - supportedTKGBomVersions: - - imagePath: tkg-bom - tag: %s -` - -func setupPrerequsiteForTesting(clusterConfigFile string, testingDir string, defaultBomFile string) string { - testClusterConfigFile := filepath.Join(testingDir, "config.yaml") - err := utils.CopyFile(clusterConfigFile, testClusterConfigFile) - Expect(err).ToNot(HaveOccurred()) - - bomDir, err := tkgconfigpaths.New(testingDir).GetTKGBoMDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - err = os.MkdirAll(bomDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - err = copy.Copy(filepath.Dir(defaultBomFile), bomDir) - Expect(err).ToNot(HaveOccurred()) - - compatibilityDir, err := tkgconfigpaths.New(testingDir).GetTKGCompatibilityDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(compatibilityDir); os.IsNotExist(err) { - err = os.MkdirAll(compatibilityDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - defaultBomFileTag := utils.GetTKGBoMTagFromFileName(filepath.Base(defaultBomFile)) - testTKGCompatabilityFileContent := fmt.Sprintf(testTKGCompatibilityFileFmt, tkgconfigpaths.TKGManagementClusterPluginVersion, defaultBomFileTag) - - compatibilityConfigFile, err := tkgconfigpaths.New(testingDir).GetTKGCompatibilityConfigPath() - Expect(err).ToNot(HaveOccurred()) - err = os.WriteFile(compatibilityConfigFile, []byte(testTKGCompatabilityFileContent), constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) - return testClusterConfigFile -} diff --git a/tkg/tkgconfigproviders/vsphere.go b/tkg/tkgconfigproviders/vsphere.go deleted file mode 100644 index 96265998fe..0000000000 --- a/tkg/tkgconfigproviders/vsphere.go +++ /dev/null @@ -1,404 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigproviders - -import ( - "encoding/base64" - "fmt" - "net/url" - "sort" - "strconv" - "strings" - - "github.com/pkg/errors" - "github.com/sanathkr/go-yaml" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -type nodeType struct { - Cpus string - Memory string - Disk string -} - -// NodeTypes defines a struct of clusterPlan map -var NodeTypes map[string]nodeType - -func init() { - NodeTypes = make(map[string]nodeType) - NodeTypes["small"] = nodeType{Cpus: "2", Memory: "4096", Disk: "20"} - NodeTypes["medium"] = nodeType{Cpus: "2", Memory: "8192", Disk: "40"} - NodeTypes["large"] = nodeType{Cpus: "4", Memory: "16384", Disk: "40"} - NodeTypes["extra-large"] = nodeType{Cpus: "8", Memory: "32768", Disk: "80"} -} - -// VSphereConfig is the tkg config file for vsphere -type VSphereConfig struct { - ClusterName string `yaml:"CLUSTER_NAME,omitempty"` - ClusterLabels string `yaml:"CLUSTER_LABELS,omitempty"` - ClusterAnnotations string `yaml:"CLUSTER_ANNOTATIONS,omitempty"` - InfrastructureProvider string `yaml:"INFRASTRUCTURE_PROVIDER,omitempty"` - ClusterPlan string `yaml:"CLUSTER_PLAN,omitempty"` - CeipParticipation string `yaml:"ENABLE_CEIP_PARTICIPATION,omitempty"` - - K8sVersion string `yaml:"KUBERNETES_VERSION,omitempty"` - IPFamily string `yaml:"TKG_IP_FAMILY,omitempty"` - Server string `yaml:"VSPHERE_SERVER,omitempty"` - Username string `yaml:"VSPHERE_USERNAME,omitempty"` - Password string `yaml:"VSPHERE_PASSWORD,omitempty"` - VSphereInsecure string `yaml:"VSPHERE_INSECURE,omitempty"` - Datacenter string `yaml:"VSPHERE_DATACENTER,omitempty"` - Datastore string `yaml:"VSPHERE_DATASTORE,omitempty"` - Network string `yaml:"VSPHERE_NETWORK,omitempty"` - ResourcePool string `yaml:"VSPHERE_RESOURCE_POOL,omitempty"` - Folder string `yaml:"VSPHERE_FOLDER,omitempty"` - ControlPlaneDiskGIB string `yaml:"VSPHERE_CONTROL_PLANE_DISK_GIB,omitempty"` - ControlPlaneCPUs string `yaml:"VSPHERE_CONTROL_PLANE_NUM_CPUS,omitempty"` - ControlPlaneMemory string `yaml:"VSPHERE_CONTROL_PLANE_MEM_MIB,omitempty"` - WorkerDiskGIB string `yaml:"VSPHERE_WORKER_DISK_GIB,omitempty"` - WorkerCPUs string `yaml:"VSPHERE_WORKER_NUM_CPUS,omitempty"` - WorkerMemory string `yaml:"VSPHERE_WORKER_MEM_MIB,omitempty"` - SSHKey string `yaml:"VSPHERE_SSH_AUTHORIZED_KEY,omitempty"` - ServiceCIDR string `yaml:"SERVICE_CIDR,omitempty"` - ClusterCIDR string `yaml:"CLUSTER_CIDR,omitempty"` - ServiceDomain string `yaml:"SERVICE_DOMAIN,omitempty"` - MachineHealthCheckEnabled string `yaml:"ENABLE_MHC"` - ControlPlaneEndpoint string `yaml:"VSPHERE_CONTROL_PLANE_ENDPOINT"` - VSphereTLSThumbprint string `yaml:"VSPHERE_TLS_THUMBPRINT"` - ClusterHTTPProxy string `yaml:"TKG_HTTP_PROXY,omitempty"` - ClusterHTTPSProxy string `yaml:"TKG_HTTPS_PROXY,omitempty"` - ClusterNoProxy string `yaml:"TKG_NO_PROXY,omitempty"` - HTTPProxyEnabled string `yaml:"TKG_HTTP_PROXY_ENABLED"` - AviController string `yaml:"AVI_CONTROLLER"` - AviUsername string `yaml:"AVI_USERNAME"` - AviPassword string `yaml:"AVI_PASSWORD"` - AviCloudName string `yaml:"AVI_CLOUD_NAME"` - AviServiceEngine string `yaml:"AVI_SERVICE_ENGINE_GROUP"` - AviDataNetwork string `yaml:"AVI_DATA_NETWORK"` - AviDataNetworkCIDR string `yaml:"AVI_DATA_NETWORK_CIDR"` - AviControlPlaneNetwork string `yaml:"AVI_CONTROL_PLANE_NETWORK"` - AviControlPlaneNetworkCIDR string `yaml:"AVI_CONTROL_PLANE_NETWORK_CIDR"` - AviCAData string `yaml:"AVI_CA_DATA_B64"` - AviLabels string `yaml:"AVI_LABELS"` - AviEnable string `yaml:"AVI_ENABLE"` - EnableAuditLogging string `yaml:"ENABLE_AUDIT_LOGGING"` - AviControlPlaneEndpointProvider string `yaml:"AVI_CONTROL_PLANE_HA_PROVIDER,omitempty"` - AviManagementClusterServiceEngine string `yaml:"AVI_MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP"` - AviManagementClusterVipNetworkName string `yaml:"AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_NAME"` - AviManagementClusterVipNetworkCidr string `yaml:"AVI_MANAGEMENT_CLUSTER_VIP_NETWORK_CIDR"` - AviManagementClusterControlPlaneVipNetworkName string `yaml:"AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME"` - AviManagementClusterControlPlaneVipNetworkCIDR string `yaml:"AVI_MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR"` - VSphereWorkerPCIDevices string `yaml:"VSPHERE_WORKER_PCI_DEVICES,omitempty"` - VSphereControlPlanePCIDevices string `yaml:"VSPHERE_CONTROL_PLANE_PCI_DEVICES,omitempty"` - WorkerRolloutStrategy string `yaml:"WORKER_ROLLOUT_STRATEGY"` - VSphereControlPlaneCustomVMXKeys string `yaml:"VSPHERE_CONTROL_PLANE_CUSTOM_VMX_KEYS,omitempty"` - VSphereWorkerCustomVMXKeys string `yaml:"VSPHERE_WORKER_CUSTOM_VMX_KEYS,omitempty"` - VSphereIgnorePCIDevicesAllowList string `yaml:"VSPHERE_IGNORE_PCI_DEVICES_ALLOW_LIST,omitempty"` - VSphereControlPlaneHardwareVersion string `yaml:"VSPHERE_CONTROL_PLANE_HARDWARE_VERSION,omitempty"` - VSphereWorkerHardwareVersion string `yaml:"VSPHERE_WORKER_HARDWARE_VERSION,omitempty"` - IDPConfig `yaml:",inline"` - OsInfo `yaml:",inline"` -} - -// NewVSphereConfig generates TKG config for vsphere -func (c *client) NewVSphereConfig(params *models.VsphereRegionalClusterParams) (*VSphereConfig, error) { //nolint:funlen,gocyclo - var err error - res := &VSphereConfig{ - ClusterName: params.ClusterName, - InfrastructureProvider: constants.InfrastructureProviderVSphere, - ClusterPlan: params.ControlPlaneFlavor, - ClusterLabels: mapToConfigString(params.Labels), - ClusterAnnotations: mapToConfigString(params.Annotations), - - Datacenter: params.Datacenter, - Datastore: params.Datastore, - Folder: params.Folder, - SSHKey: params.SSHKey, - ControlPlaneEndpoint: params.ControlPlaneEndpoint, - IPFamily: params.IPFamily, - HTTPProxyEnabled: falseConst, - - AviControlPlaneEndpointProvider: falseConst, - } - if params.Os != nil { - if params.Os.OsInfo != nil { - res.OsInfo.Name = params.Os.OsInfo.Name - res.OsInfo.Version = params.Os.OsInfo.Version - res.OsInfo.Arch = params.Os.OsInfo.Arch - } - c.tkgConfigReaderWriter.Set(constants.ConfigVariableVsphereTemplate, params.Os.Name) - } - - if params.CeipOptIn != nil { - res.CeipParticipation = strconv.FormatBool(*params.CeipOptIn) - } - - res.EnableAuditLogging = falseConst - if params.EnableAuditLogging { - res.EnableAuditLogging = trueConst - } - - if params.IdentityManagement != nil { //nolint:dupl - res.IdentityManagementType = *params.IdentityManagement.IdmType - res.OIDCProviderName = params.IdentityManagement.OidcProviderName - res.OIDCIssuerURL = params.IdentityManagement.OidcProviderURL.String() - res.OIDCClientID = params.IdentityManagement.OidcClientID - res.OIDCClientSecret = params.IdentityManagement.OidcClientSecret - res.OIDCScopes = params.IdentityManagement.OidcScope - res.OIDCGroupsClaim = params.IdentityManagement.OidcClaimMappings["groups"] - res.OIDCUsernameClaim = params.IdentityManagement.OidcClaimMappings["username"] - - res.LDAPBindDN = params.IdentityManagement.LdapBindDn - res.LDAPBindPassword = params.IdentityManagement.LdapBindPassword - res.LDAPHost = params.IdentityManagement.LdapURL - res.LDAPUserSearchBaseDN = params.IdentityManagement.LdapUserSearchBaseDn - res.LDAPUserSearchFilter = params.IdentityManagement.LdapUserSearchFilter - res.LDAPUserSearchUsername = params.IdentityManagement.LdapUserSearchUsername - res.LDAPUserSearchNameAttr = params.IdentityManagement.LdapUserSearchNameAttr - res.LDAPGroupSearchBaseDN = params.IdentityManagement.LdapGroupSearchBaseDn - res.LDAPGroupSearchFilter = params.IdentityManagement.LdapGroupSearchFilter - res.LDAPGroupSearchUserAttr = params.IdentityManagement.LdapGroupSearchUserAttr - res.LDAPGroupSearchGroupAttr = params.IdentityManagement.LdapGroupSearchGroupAttr - res.LDAPGroupSearchNameAttr = params.IdentityManagement.LdapGroupSearchNameAttr - res.LDAPRootCAData = base64.StdEncoding.EncodeToString([]byte(params.IdentityManagement.LdapRootCa)) - } - - res.ResourcePool = params.ResourcePool - - if params.VsphereCredentials != nil { - res.Server = params.VsphereCredentials.Host - res.Username = params.VsphereCredentials.Username - res.Password = params.VsphereCredentials.Password - res.VSphereTLSThumbprint = params.VsphereCredentials.Thumbprint - res.VSphereInsecure = falseConst - if params.VsphereCredentials.Insecure != nil && *params.VsphereCredentials.Insecure { - res.VSphereInsecure = trueConst - } - } - - if params.Networking != nil { - res.ServiceCIDR = params.Networking.ClusterServiceCIDR - res.ClusterCIDR = params.Networking.ClusterPodCIDR - res.Network = params.Networking.NetworkName - - if params.Networking.HTTPProxyConfiguration != nil && params.Networking.HTTPProxyConfiguration.Enabled { - res.HTTPProxyEnabled = trueConst - conf := params.Networking.HTTPProxyConfiguration - res.ClusterHTTPProxy, err = CheckAndGetProxyURL(conf.HTTPProxyUsername, conf.HTTPProxyPassword, conf.HTTPProxyURL) - if err != nil { - return res, err - } - res.ClusterHTTPSProxy, err = CheckAndGetProxyURL(conf.HTTPSProxyUsername, conf.HTTPSProxyPassword, conf.HTTPSProxyURL) - if err != nil { - return res, err - } - res.ClusterNoProxy = params.Networking.HTTPProxyConfiguration.NoProxy - } - } - - cpNodeSize, ok := NodeTypes[params.ControlPlaneNodeType] - if !ok { - return res, errors.Errorf("control plane node size %s not defined", params.ControlPlaneNodeType) - } - res.ControlPlaneCPUs = cpNodeSize.Cpus - res.ControlPlaneMemory = cpNodeSize.Memory - res.ControlPlaneDiskGIB = cpNodeSize.Disk - - workerNodeSize, ok := NodeTypes[params.WorkerNodeType] - if !ok { - return res, errors.Errorf("worker node size %s not defined", params.WorkerNodeType) - } - res.WorkerCPUs = workerNodeSize.Cpus - res.WorkerMemory = workerNodeSize.Memory - res.WorkerDiskGIB = workerNodeSize.Disk - - if params.MachineHealthCheckEnabled { - res.MachineHealthCheckEnabled = trueConst - } else { - res.MachineHealthCheckEnabled = falseConst - } - - res.AviEnable = falseConst - if isAviEnabled(params) { - res.AviController = params.AviConfig.Controller - res.AviUsername = params.AviConfig.Username - res.AviPassword = params.AviConfig.Password - res.AviCAData = base64.StdEncoding.EncodeToString([]byte(params.AviConfig.CaCert)) - res.AviServiceEngine = params.AviConfig.ServiceEngine - res.AviManagementClusterServiceEngine = params.AviConfig.ManagementClusterServiceEngine - res.AviCloudName = params.AviConfig.Cloud - if params.AviConfig.Network != nil { - res.AviDataNetwork = params.AviConfig.Network.Name - res.AviDataNetworkCIDR = params.AviConfig.Network.Cidr - } - if params.AviConfig.ControlPlaneNetwork != nil { - res.AviControlPlaneNetwork = params.AviConfig.ControlPlaneNetwork.Name - res.AviControlPlaneNetworkCIDR = params.AviConfig.ControlPlaneNetwork.Cidr - } - res.AviLabels = mapToYamlStr(params.AviConfig.Labels) - res.AviEnable = trueConst - - if params.AviConfig.ControlPlaneHaProvider { - res.AviControlPlaneEndpointProvider = trueConst - } - res.AviManagementClusterVipNetworkName = params.AviConfig.ManagementClusterVipNetworkName - res.AviManagementClusterVipNetworkCidr = params.AviConfig.ManagementClusterVipNetworkCidr - res.AviManagementClusterControlPlaneVipNetworkName = params.AviConfig.ManagementClusterControlPlaneVipNetworkName - res.AviManagementClusterControlPlaneVipNetworkCIDR = params.AviConfig.ManagementClusterControlPlaneVipNetworkCidr - } - - return res, nil -} - -// CreateVSphereParams generates a Params object from a VSphereConfig, used for importing configuration files -func (c *client) CreateVSphereParams(vConfig *VSphereConfig) (params *models.VsphereRegionalClusterParams, err error) { - boolCeiptOptIn, _ := strconv.ParseBool(vConfig.CeipParticipation) - - params = &models.VsphereRegionalClusterParams{ - Annotations: configStringToMap(vConfig.ClusterAnnotations), - AviConfig: nil, - CeipOptIn: &boolCeiptOptIn, - ClusterName: vConfig.ClusterName, - ControlPlaneEndpoint: vConfig.ControlPlaneEndpoint, - ControlPlaneFlavor: vConfig.ClusterPlan, - ControlPlaneNodeType: "", - Datacenter: vConfig.Datacenter, - Datastore: vConfig.Datastore, - EnableAuditLogging: vConfig.EnableAuditLogging == trueConst, - Folder: vConfig.Folder, - IdentityManagement: createIdentityManagementConfig(vConfig), - IPFamily: vConfig.IPFamily, - KubernetesVersion: "", - Labels: configStringToMap(vConfig.ClusterLabels), - MachineHealthCheckEnabled: vConfig.MachineHealthCheckEnabled == trueConst, - Networking: createNetworkingConfig(vConfig), - NumOfWorkerNode: 0, - Os: nil, - ResourcePool: vConfig.ResourcePool, - SSHKey: vConfig.SSHKey, - VsphereCredentials: nil, - WorkerNodeType: "", - } - - if vConfig.OsInfo.Name != "" { - params.Os = &models.VSphereVirtualMachine{ - // TODO: how to invert this? It appears to be written to the reader-writer but not available in the config for the inverse operation - // c.tkgConfigReaderWriter.Set(constants.ConfigVariableVsphereTemplate, params.Os.Name) - Name: "", - OsInfo: &models.OSInfo{ - Name: vConfig.OsInfo.Name, - Version: vConfig.OsInfo.Version, - Arch: vConfig.OsInfo.Arch, - }, - } - } - - params.VsphereCredentials = &models.VSphereCredentials{ - Host: vConfig.Server, - Username: vConfig.Username, - Password: vConfig.Password, - Thumbprint: vConfig.VSphereTLSThumbprint, - } - params.ControlPlaneNodeType, _ = findVsphereNodeType(vConfig.ControlPlaneCPUs, vConfig.ControlPlaneMemory, vConfig.ControlPlaneDiskGIB) - - if vConfig.AviEnable == trueConst { - cacert, _ := base64.StdEncoding.DecodeString(vConfig.AviCAData) - params.AviConfig = &models.AviConfig{ - CaCert: string(cacert), - Cloud: vConfig.AviCloudName, - ControlPlaneHaProvider: vConfig.AviControlPlaneEndpointProvider == trueConst, - Controller: vConfig.AviController, - Labels: yamlStringToMap(vConfig.AviLabels), - ManagementClusterVipNetworkCidr: vConfig.AviManagementClusterVipNetworkCidr, - ManagementClusterVipNetworkName: vConfig.AviManagementClusterVipNetworkName, - ManagementClusterControlPlaneVipNetworkName: vConfig.AviManagementClusterControlPlaneVipNetworkName, - ManagementClusterControlPlaneVipNetworkCidr: vConfig.AviManagementClusterControlPlaneVipNetworkCIDR, - Network: &models.AviNetworkParams{ - Cidr: vConfig.AviDataNetworkCIDR, - Name: vConfig.AviDataNetwork, - }, - ControlPlaneNetwork: &models.AviNetworkParams{ - Cidr: vConfig.AviControlPlaneNetworkCIDR, - Name: vConfig.AviControlPlaneNetwork, - }, - Password: vConfig.AviPassword, - ServiceEngine: vConfig.AviServiceEngine, - ManagementClusterServiceEngine: vConfig.AviManagementClusterServiceEngine, - Username: vConfig.AviUsername, - } - } - return params, nil -} - -// GetVsphereNodeSizeOptions returns the list of vSphere node size options -func GetVsphereNodeSizeOptions() string { - nodeTypes := []string{} - - for k := range NodeTypes { - nodeTypes = append(nodeTypes, k) - } - sort.Strings(nodeTypes) - return strings.Join(nodeTypes, ",") -} - -// CheckAndGetProxyURL validates and returns the proxy URL -func CheckAndGetProxyURL(username, password, proxyURL string) (string, error) { - httpURL, err := url.Parse(proxyURL) - if err != nil { - return "", err - } - - if httpURL.Scheme == "" { - return "", errors.New("scheme is missing from the proxy URL") - } - - if httpURL.Host == "" { - return "", errors.New("hostname is missing from the proxy URL") - } - - if username != "" && password != "" { - httpURL.User = url.UserPassword(username, password) - } else if username != "" { - httpURL.User = url.User(username) - } - - return httpURL.String(), nil -} - -func mapToYamlStr(m map[string]string) string { - if len(m) == 0 { - return "" - } - - metadataStr := "" - for key, value := range m { - metadataStr += fmt.Sprintf("'%s': '%s'\n", key, value) - } - return metadataStr -} - -func yamlStringToMap(yamlString string) map[string]string { - result := make(map[string]string) - if len(yamlString) > 0 { - _ = yaml.Unmarshal([]byte(yamlString), result) - } - return result -} - -func findVsphereNodeType(cpus, memory, disk string) (string, error) { - for label, nodeType := range NodeTypes { - if nodeType.Cpus == cpus && nodeType.Memory == memory && nodeType.Disk == disk { - return label, nil - } - } - errMsg := "unable to find node type for cpus=" + cpus + " memory=" + memory + " disk=" + disk - fmt.Println("ERROR: " + errMsg) - return "", errors.New(errMsg) -} - -func isAviEnabled(params *models.VsphereRegionalClusterParams) bool { - return params.AviConfig != nil && params.AviConfig.Cloud != "" && params.AviConfig.ServiceEngine != "" -} diff --git a/tkg/tkgconfigreaderwriter/client.go b/tkg/tkgconfigreaderwriter/client.go deleted file mode 100644 index 310534f471..0000000000 --- a/tkg/tkgconfigreaderwriter/client.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tkgconfigreaderwriter provides utilities to read/write configs -package tkgconfigreaderwriter - -import ( - "github.com/pkg/errors" - "sigs.k8s.io/cluster-api/cmd/clusterctl/client/config" -) - -//go:generate counterfeiter -o ../fakes/tkgconfigreaderwriterclient.go --fake-name TKGConfigReaderWriterClient . Client - -// Client implements tkg config client interface -type Client interface { - // ClusterConfigClient returns clusterctl config client - ClusterConfigClient() config.Client - - // TKGConfigReaderWriter returns reader writer interface to read/write values from/to config - TKGConfigReaderWriter() TKGConfigReaderWriter -} - -type client struct { - tkgConfigReaderWriter TKGConfigReaderWriter - clusterCtlConfigClient config.Client -} - -// ensure tkgConfigClient implements Client. -var _ Client = &client{} - -// New creates new tkgConfigClient from tkg config file -func New(tkgConfigPath string) (Client, error) { - readerWriter := newTKGConfigReaderWriter() - err := readerWriter.Init(tkgConfigPath) - if err != nil { - return nil, errors.Wrap(err, "unable to initialize reader writer") - } - return NewWithReaderWriter(readerWriter) -} - -// NewWithReaderWriter creates new tkgConfigClient with readerWriter client -func NewWithReaderWriter(readerWriter TKGConfigReaderWriter) (Client, error) { - readerOption := config.InjectReader(readerWriter) - ccConfigClient, err := config.New("", readerOption) - if err != nil { - return nil, errors.Wrap(err, "unable to create clusterctl config Client") - } - return &client{ - tkgConfigReaderWriter: readerWriter, - clusterCtlConfigClient: ccConfigClient, - }, nil -} - -func (c *client) ClusterConfigClient() config.Client { - return c.clusterCtlConfigClient -} - -func (c *client) TKGConfigReaderWriter() TKGConfigReaderWriter { - return c.tkgConfigReaderWriter -} - -// NewReaderWriterFromConfigFile returns new reader writer from config file -// NOTE: This function should only be used for testing purpose and/or for read only operations -// for config values which cannot be updated by tkgcli internally -// Please use this function causiously as it might not be required for your usecase as -// most of the clients has readerwrite client -func NewReaderWriterFromConfigFile(clusterConfigPath, tkgConfigPath string) (TKGConfigReaderWriter, error) { - rw := newTKGConfigReaderWriter() - if err := rw.Init(tkgConfigPath); err != nil { - return nil, errors.Wrap(err, "error initializing tkg config") - } - if err := rw.MergeInConfig(clusterConfigPath); err != nil { - return nil, errors.Wrap(err, "error initializing cluster config") - } - return rw, nil -} diff --git a/tkg/tkgconfigreaderwriter/client_test.go b/tkg/tkgconfigreaderwriter/client_test.go deleted file mode 100644 index 6dd4d3cf4e..0000000000 --- a/tkg/tkgconfigreaderwriter/client_test.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package tkgconfigreaderwriter_test - -import ( - "testing" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" -) - -func Test_New_Success(t *testing.T) { - client, err := tkgconfigreaderwriter.New("../fakes/config/config.yaml") - if err != nil { - t.Errorf("Expected success instead got error:%s", err.Error()) - } - - if client == nil { - t.Error("Expected new client, got nil") - } -} - -func Test_NewReaderWriterFromConfigFile_Success(t *testing.T) { - readerWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile("../fakes/config/kubeconfig/config1.yaml", "../fakes/config/config.yaml") - if err != nil { - t.Errorf("Expected success, got error: %s", err.Error()) - } - - if readerWriter == nil { - t.Error("readerWriter was nil, was expecting a valid readerWriter") - } -} diff --git a/tkg/tkgconfigreaderwriter/readerwriter.go b/tkg/tkgconfigreaderwriter/readerwriter.go deleted file mode 100644 index d030f04e47..0000000000 --- a/tkg/tkgconfigreaderwriter/readerwriter.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigreaderwriter - -import ( - "strings" - - "github.com/pkg/errors" - "github.com/spf13/viper" - "sigs.k8s.io/cluster-api/cmd/clusterctl/client/config" -) - -// tkgConfigReaderWriter is a customized implementation of viperReader in clusterctl repo to make it compatible with -// tkg configuration file with some additional functionality to update configuration file -type tkgConfigReaderWriter struct { - viperStore *viper.Viper -} - -//go:generate counterfeiter -o ../fakes/readerwriter.go --fake-name TKGConfigReaderWriter . TKGConfigReaderWriter - -// TKGConfigReaderWriter defines methods of reader which is implemented using viper for reading from environment variables -// and from a tkg config file. Also defines methods of writer to set/update the variables and config file -type TKGConfigReaderWriter interface { - config.Reader - - MergeInConfig(configFilePath string) error - SetMap(data map[string]string) -} - -// newTKGConfigReaderWriter returns a viper and config reader writer -func newTKGConfigReaderWriter() TKGConfigReaderWriter { - return &tkgConfigReaderWriter{} -} - -// Init initialize the readerWriter -func (v *tkgConfigReaderWriter) Init(tkgConfigFile string) error { - v.viperStore = viper.New() - - // Configure for reading environment variables as well, and more specifically: - // AutomaticEnv force viper to check for an environment variable any time a v.viperStore.Get request is made. - // It will check for a environment variable with a name matching the key uppercased; in case name use the - delimiter, - // the SetEnvKeyReplacer forces matching to name use the _ delimiter instead (- is not allowed in linux env variable names). - replacer := strings.NewReplacer("-", "_") - v.viperStore.SetEnvKeyReplacer(replacer) - // Allow user to use empty env variable value, it will allow empty variable value, - // which would be necessary for Optional template variable - v.viperStore.AllowEmptyEnv(true) - v.viperStore.AutomaticEnv() - - // Use path file from the flag. - v.viperStore.SetConfigFile(tkgConfigFile) - v.viperStore.SetConfigType("yaml") - // If a path file is found, read it in. - if err := v.viperStore.ReadInConfig(); err != nil { - return errors.Wrapf(err, "Error reading configuration file %q", v.viperStore.ConfigFileUsed()) - } - - return nil -} - -func (v *tkgConfigReaderWriter) MergeInConfig(configFilePath string) error { - // Use path file from the flag. - v.viperStore.SetConfigFile(configFilePath) - v.viperStore.SetConfigType("yaml") - // If a path file is found, read it in. - if err := v.viperStore.MergeInConfig(); err != nil { - return errors.Wrapf(err, "Error reading configuration file %q", v.viperStore.ConfigFileUsed()) - } - return nil -} - -func (v *tkgConfigReaderWriter) Get(key string) (string, error) { - if v.viperStore.Get(key) == nil { - return "", errors.Errorf("Failed to get value for variable %q. Please set the variable value using os env variables or using the config file", key) - } - return v.viperStore.GetString(key), nil -} - -func (v *tkgConfigReaderWriter) Set(key, value string) { - v.viperStore.Set(key, value) -} - -func (v *tkgConfigReaderWriter) SetMap(data map[string]string) { - for key, val := range data { - v.Set(key, val) - } -} - -func (v *tkgConfigReaderWriter) UnmarshalKey(key string, rawval interface{}) error { - return v.viperStore.UnmarshalKey(key, rawval) -} diff --git a/tkg/tkgconfigreaderwriter/readerwriter_test.go b/tkg/tkgconfigreaderwriter/readerwriter_test.go deleted file mode 100644 index b9cb46df82..0000000000 --- a/tkg/tkgconfigreaderwriter/readerwriter_test.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigreaderwriter - -import ( - "os" - "path/filepath" - "testing" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -func Test_viperReader_Get(t *testing.T) { - os.Setenv("FOO", "foo") - - tkgConfigFile := "../fakes/config/config.yaml" - - type args struct { - key string - } - tests := []struct { - name string - args args - want string - wantErr bool - }{ - { - name: "Read from env", - args: args{ - key: "FOO", - }, - want: "foo", - wantErr: false, - }, - { - name: "Read from file", - args: args{ - key: "BAR", - }, - want: "bar", - wantErr: false, - }, - { - name: "Read from file", - args: args{ - key: "AWS_B64ENCODED_CREDENTIALS", - }, - want: "XXXXXXXX", - wantErr: false, - }, - { - name: "Fails if missing", - args: args{ - key: "BAZ", - }, - want: "", - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - v := &tkgConfigReaderWriter{} - - err := v.Init(tkgConfigFile) - if err != nil { - t.Fatalf("Init() error = %v", err) - } - - got, err := v.Get(tt.args.key) - if (err != nil) != tt.wantErr { - t.Errorf("Get() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("Get() got = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_viperReader_Set(t *testing.T) { - dir, err := os.MkdirTemp("", "tkg") - if err != nil { - t.Fatalf("os.MkdirTemp() error = %v", err) - } - defer os.RemoveAll(dir) - - os.Setenv("FOO", "foo") - - tkgConfigFile := filepath.Join(dir, "config.yaml") - - if err := os.WriteFile(tkgConfigFile, []byte("bar: bar"), constants.ConfigFilePermissions); err != nil { - t.Fatalf("os.WriteFile() error = %v", err) - } - - type args struct { - key string - value string - } - tests := []struct { - name string - args args - want string - }{ - { - name: "", - args: args{ - key: "FOO", - value: "bar", - }, - want: "bar", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - v := &tkgConfigReaderWriter{} - - err := v.Init(tkgConfigFile) - if err != nil { - t.Fatalf("Init() error = %v", err) - } - - v.Set(tt.args.key, tt.args.value) - - got, err := v.Get(tt.args.key) - if err != nil { - t.Errorf("Get() error = %v", err) - return - } - if got != tt.want { - t.Errorf("Get() got = %v, want %v (Set() did not worked)", got, tt.want) - } - }) - } -} - -func Test_MergeInConfig_Success(t *testing.T) { - configReaderWriter := newTKGConfigReaderWriter() - err := configReaderWriter.Init("../fakes/config/config.yaml") - if err != nil { - t.Errorf("Expected init success, instead got error: %s", err.Error()) - } - err = configReaderWriter.MergeInConfig("../fakes/config/config2.yaml") - - if err != nil { - t.Errorf("Failed merging in config with error %s", err.Error()) - } -} - -func Test_MergeInConfig_MissingFile(t *testing.T) { - configReaderWriter := newTKGConfigReaderWriter() - err := configReaderWriter.Init("../fakes/config/config.yaml") - if err != nil { - t.Errorf("Expected init success, instead got error: %s", err.Error()) - } - err = configReaderWriter.MergeInConfig("../fakes/config/config1.yaml") - - if err == nil { - t.Error("Expected error retrieving fakes/config/config1.yaml") - } -} diff --git a/tkg/tkgconfigupdater/client.go b/tkg/tkgconfigupdater/client.go deleted file mode 100644 index 515bd72a0d..0000000000 --- a/tkg/tkgconfigupdater/client.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tkgconfigupdater provides utilities to update tkg configs -package tkgconfigupdater - -import ( - "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/providerinterface" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" -) - -type client struct { - configDir string - tkgConfigPathsClient tkgconfigpaths.Client - tkgBomClient tkgconfigbom.Client - providerGetter providerinterface.ProviderInterface - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter -} - -// New creates new tkgconfig updater client -func New(configDir string, providerGetter providerinterface.ProviderInterface, - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) Client { - - tkgconfigupdaterclient := &client{ - configDir: configDir, - tkgConfigPathsClient: tkgconfigpaths.New(configDir), - tkgBomClient: tkgconfigbom.New(configDir, tkgConfigReaderWriter), - providerGetter: providerGetter, - tkgConfigReaderWriter: tkgConfigReaderWriter, - } - return tkgconfigupdaterclient -} - -//go:generate counterfeiter -o ../fakes/tkgconfigupdaterclient.go --fake-name TKGConfigUpdaterClient . Client - -// Client implements TKG configuration updater functions -type Client interface { - // EnsureTKGConfigFile ensures creating settings file - EnsureTKGConfigFile() (string, error) - // EnsureConfigImages ensures that `images:`` config exists and is up-to-date in tkg settings file - // images: - // all: - // repository: projects-stg.registry.vmware.com/tkg/cluster-api - // cert-manager: - // repository: projects-stg.registry.vmware.com/tkg - // tag: v0.16.1_vmware.1 - EnsureConfigImages() error - - // DecodeCredentialsInViper decode the credentials stored in viper - DecodeCredentialsInViper() error - - CheckInfrastructureVersion(providerName string) (string, error) - - GetDefaultInfrastructureVersion(providerName string) (string, error) - - EnsureProviderTemplates() error - - SetDefaultConfiguration() - - // CheckProviderTemplatesNeedUpdate checks if .tkg/providers is up-to-date. - CheckProviderTemplatesNeedUpdate() (bool, error) - // CheckBOMsNeedUpdate checks if bom files are up-to-date. - // returns true if $HOME/.tkg/bom directory exists, not empty and doesn't contain the defaultBoM file - CheckBOMsNeedUpdate() (bool, error) - // EnsureBOMFiles ensures the local BOM files. If forceUpdate option is set, TKG compatibility file would fetched - // from the registry and would update BOM files if the latest TKG compatibility file version points to new BOM files - EnsureBOMFiles(forceUpdate bool) error - // EnsureTKGCompatibilityFile ensures the TKG compatibility file. If forceUpdate option is set,TKG compatibility would fetched - // TKG compatibility file would fetched from the registry though local copy exists - EnsureTKGCompatibilityFile(forceUpdate bool) error - - // EnsureCredEncoding ensures the credentials encoding - EnsureCredEncoding(tkgConfigNode *yaml.Node) - EnsureImages(needUpdate bool, tkgConfigNode *yaml.Node) error - // EnsureProvidersInConfig ensures the providers section in tkgconfig exisits and it is synchronized with the latest providers - EnsureProvidersInConfig(needUpdate bool, tkgConfigNode *yaml.Node) error - // EnsureTemplateFiles ensures that $HOME/.tkg/providers exists and it is up-to-date - EnsureTemplateFiles() (bool, error) - // GetProvidersChecksum calculates and returns the checksum calculated from all the template yaml files in the providers directory - GetProvidersChecksum() (string, error) - // GetPopulatedProvidersChecksumFromFile reads and returns the checksum from providers.sha256sum file in the providers directory - GetPopulatedProvidersChecksumFromFile() (string, error) -} - -func (c *client) TKGConfigReaderWriter() tkgconfigreaderwriter.TKGConfigReaderWriter { - return c.tkgConfigReaderWriter -} diff --git a/tkg/tkgconfigupdater/ensure.go b/tkg/tkgconfigupdater/ensure.go deleted file mode 100644 index af6845c696..0000000000 --- a/tkg/tkgconfigupdater/ensure.go +++ /dev/null @@ -1,421 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigupdater - -import ( - "encoding/base64" - "fmt" - "os" - "path/filepath" - "strings" - "time" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -const encodePrefix = ", -// and then use the AWS_PROFILE variable. Temporary static credentials last at most 12 hours, and AWS -// red-flags partner products that save static credentials, so we do not save them. -// This is different than vSphere and Azure where static credentials are the norm. -var KeysToNeverPersist = []string{ - constants.ConfigVariableAWSAccessKeyID, - constants.ConfigVariableAWSSecretAccessKey, - constants.ConfigVariableAWSSessionToken, - constants.ConfigVariableAWSB64Credentials, -} - -// DefaultConfigMap default configuration map -var DefaultConfigMap = map[string]string{ - constants.KeyCertManagerTimeout: constants.DefaultCertmanagerDeploymentTimeout.String(), -} - -func (c *client) SetDefaultConfiguration() { - for k, v := range DefaultConfigMap { - c.TKGConfigReaderWriter().Set(k, v) - } -} - -// EnsureCredEncoding ensures the credentials encoding -func (c *client) EnsureCredEncoding(tkgConfigNode *yaml.Node) { - for _, key := range KeysToEncode { - credentialIndex := GetNodeIndex(tkgConfigNode.Content[0].Content, key) - if credentialIndex < 0 { - continue - } - - password := strings.TrimSpace(tkgConfigNode.Content[0].Content[credentialIndex].Value) - if password == "" || strings.HasPrefix(password, encodePrefix) { - continue - } - base64EncodedPassword, err := encodeValueIfRequired(strings.TrimSpace(tkgConfigNode.Content[0].Content[credentialIndex].Value)) - if err != nil { - continue - } - - tkgConfigNode.Content[0].Content[credentialIndex].Value = base64EncodedPassword - } -} - -// DecodeCredentialsInViper decode the credentials stored in viper -func (c *client) DecodeCredentialsInViper() error { - if c.TKGConfigReaderWriter() == nil { - return nil - } - - for _, key := range KeysToEncode { - value, err := c.TKGConfigReaderWriter().Get(key) - if err != nil { - continue - } - value = strings.TrimSpace(value) - if value == "" || !strings.HasPrefix(value, encodePrefix) { - continue - } - base64Password := value[len(encodePrefix) : len(value)-1] - password, err := base64.StdEncoding.DecodeString(base64Password) - if err != nil { - return errors.Wrapf(err, "unable to decode %s:%s", key, value) - } - c.TKGConfigReaderWriter().Set(key, string(password)) - } - return nil -} - -// EnsureTKGCompatibilityFile ensures the TKG compatibility file. If forceUpdate option is set, -// the TKG compatibility file is fetched. -// TKG compatibility file would fetched from the registry though local copy exists -func (c *client) EnsureTKGCompatibilityFile(forceUpdate bool) error { - compatibilityDir, err := c.tkgConfigPathsClient.GetTKGCompatibilityDirectory() - if err != nil { - return err - } - - if _, err := os.Stat(compatibilityDir); os.IsNotExist(err) { - if err = os.MkdirAll(compatibilityDir, constants.DefaultDirectoryPermissions); err != nil { - return errors.Wrap(err, "cannot create compatibility directory") - } - } - - compatabilityFilePath, err := c.tkgConfigPathsClient.GetTKGCompatibilityConfigPath() - if err != nil { - return errors.Wrap(err, "failed to get the TKG Compatibility file path") - } - compatibilityFileExists := true - if _, err := os.Stat(compatabilityFilePath); os.IsNotExist(err) { - compatibilityFileExists = false - } - - if compatibilityFileExists && !forceUpdate { - log.V(4).Infof("compatibility file (%s) already exists, skipping download", compatabilityFilePath) - return nil - } - - bomRegistry, err := c.tkgBomClient.InitBOMRegistry() - if err != nil { - return errors.Wrap(err, "failed to initialize the BOM registry to download default TKG compatibility file ") - } - - err = c.tkgBomClient.DownloadTKGCompatibilityFileFromRegistry(tkgconfigpaths.TKGDefaultImageRepo, tkgconfigpaths.TKGDefaultCompatibilityImagePath, bomRegistry) - if err != nil { - return errors.Wrap(err, "failed to download TKG compatibility file from the registry") - } - return nil -} - -// EnsureBOMFiles ensures BOM files for all supported TKG versions do exist -func (c *client) EnsureBOMFiles(forceUpdate bool) error { - err := c.EnsureTKGCompatibilityFile(forceUpdate) - if err != nil { - return err - } - tkgDir, bomDir, _, err := c.tkgConfigPathsClient.GetTKGConfigDirectories() - if err != nil { - return err - } - - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - if err = os.MkdirAll(bomDir, constants.DefaultDirectoryPermissions); err != nil { - return errors.Wrap(err, "cannot create bom directory") - } - } - - isBOMDirectoryEmpty, err := isDirectoryEmpty(bomDir) - if err != nil { - return errors.Wrap(err, "failed to check if bom directory is empty") - } - - bomsNeedUpdate, err := c.CheckBOMsNeedUpdate() - if err != nil { - return err - } - - // If there are existing BOM files and doesn't need update then do nothing - if !isBOMDirectoryEmpty && !bomsNeedUpdate && !forceUpdate { - log.V(4).Infof("BOM files inside %s already exists, skipping download", bomDir) - return nil - } - - // backup BOM directory if boms need update - if bomsNeedUpdate { - t := time.Now() - originalPath := bomDir - backupFilePath := filepath.Join(tkgDir, fmt.Sprintf("%s-%s-%s", "bom", t.Format("20060102150405"), utils.GenerateRandomID(8, true))) - err = os.Rename(originalPath, backupFilePath) - if err != nil { - return errors.Wrap(err, "failed to back up the original BOM folder") - } - log.V(4).Infof("The old bom folder %s is backed up to %s", originalPath, backupFilePath) - } - - bomRegistry, err := c.tkgBomClient.InitBOMRegistry() - if err != nil { - return errors.Wrap(err, "failed to initialize the BOM registry to download default bom files ") - } - - err = c.tkgBomClient.DownloadDefaultBOMFilesFromRegistry(tkgconfigpaths.TKGDefaultImageRepo, bomRegistry) - if err != nil { - return errors.Wrap(err, "failed to download default bom files from the registry") - } - - return nil -} - -// EnsureTKGConfigFile ensures a config file exists, if not, create a config file with default value -func (c *client) EnsureTKGConfigFile() (string, error) { - tkgConfigPath, err := c.tkgConfigPathsClient.GetTKGConfigPath() - if err != nil { - return "", err - } - - dir := filepath.Dir(tkgConfigPath) - if _, err := os.Stat(dir); os.IsNotExist(err) { - if err = os.MkdirAll(dir, constants.DefaultDirectoryPermissions); err != nil { - return "", errors.Wrap(err, "cannot create TKG config directory") - } - } - - if fileInfo, err := os.Stat(tkgConfigPath); os.IsNotExist(err) || fileInfo.Size() == 0 { - // create new config file with release key set - // Setting this value because at least one value is required to be - // set in TKG config file to parse the config file with yaml.v1 Node - releaseData := constants.ReleaseKey + ": " - err = os.WriteFile(tkgConfigPath, []byte(releaseData), constants.ConfigFilePermissions) - if err != nil { - return "", errors.Wrap(err, "cannot initialize tkg config file") - } - } - - return tkgConfigPath, nil -} - -// EnsureTemplateFiles ensures that $HOME/.tkg/providers exists and it is up-to-date -func (c *client) EnsureTemplateFiles() (bool, error) { - tkgDir, _, providersDir, err := c.tkgConfigPathsClient.GetTKGConfigDirectories() - if err != nil { - return false, err - } - - if _, err := os.Stat(providersDir); os.IsNotExist(err) { - if err = os.MkdirAll(providersDir, constants.DefaultDirectoryPermissions); err != nil { - return false, errors.Wrap(err, "cannot create tkg providers directory") - } - } - - isProvidersDirectoryEmpty, err := isDirectoryEmpty(providersDir) - if err != nil { - return false, errors.Wrap(err, "failed to check if provider's directory is empty") - } - - providersNeedUpdate, err := c.CheckProviderTemplatesNeedUpdate() - if err != nil { - return false, err - } - - // If there are existing BOM files and doesn't need update then do nothing - if !isProvidersDirectoryEmpty && !providersNeedUpdate { - return false, nil - } - - providerDirPath := filepath.Join(tkgDir, constants.LocalProvidersFolderName) - - if c.isProviderTemplatesEmbedded() { - return true, c.saveEmbeddedProviderTemplates(providerDirPath) - } - - if providersNeedUpdate { - if !isProvidersDirectoryEmpty { - t := time.Now() - backupFilePath := filepath.Join(tkgDir, fmt.Sprintf("%s-%s-%s", constants.LocalProvidersFolderName, t.Format("20060102150405"), utils.GenerateRandomID(8, true))) - err := os.Rename(providerDirPath, backupFilePath) - if err == nil { - log.Warningf("the old providers folder %s is backed up to %s", providerDirPath, backupFilePath) - } - } - return true, c.saveProvidersFromRemoteRepo(providerDirPath) - } - return false, nil -} - -func (c *client) saveProvidersFromRemoteRepo(providerDirPath string) error { - tkgBomConfig, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return errors.Wrap(err, "error reading TKG BoM configuration") - } - - bomRegistry, err := c.tkgBomClient.InitBOMRegistry() - if err != nil { - return errors.Wrap(err, "failed to initialize the providers registry to download providers") - } - - providerTemplateImage, err := getProviderTemplateImageFromBoM(tkgBomConfig) - if err != nil { - return err - } - - fullImagePath := tkgconfigbom.GetFullImagePath(providerTemplateImage, tkgBomConfig.ImageConfig.ImageRepository) - imageTag := providerTemplateImage.Tag - filesMap, err := bomRegistry.GetFiles(fmt.Sprintf("%s:%s", fullImagePath, imageTag)) - if err != nil { - return errors.Wrap(err, "failed to get providers files from repository") - } - - for k, v := range filesMap { - filePath := filepath.Join(providerDirPath, k) - err := utils.SaveFile(filePath, v) - if err != nil { - return errors.Wrapf(err, "error while saving provider template file '%s'", k) - } - } - - providerTagFileName := filepath.Join(providerDirPath, imageTag) - err = utils.SaveFile(providerTagFileName, []byte{}) - if err != nil { - return errors.Wrapf(err, "error while saving provider tag file '%s'", providerTagFileName) - } - - if err := c.saveProvidersChecksumToFile(); err != nil { - return errors.Wrap(err, "error while saving providers checksum to file") - } - return nil -} - -func (c *client) EnsureProviderTemplates() error { - // ensure the latest $HOME/providers - templatesUpdated, err := c.EnsureTemplateFiles() - if err != nil { - return errors.Wrap(err, "unable to ensure provider template files") - } - - // ensure that tkg config file exists with default value - tkgConfigPath, err := c.EnsureTKGConfigFile() - if err != nil { - return errors.Wrap(err, "unable to ensure tkg config file") - } - - tkgConfigNode, err := c.getTkgConfigNode(tkgConfigPath) - if err != nil { - return errors.Wrapf(err, "unable to get tkg configuration from: %s", tkgConfigPath) - } - - // ensure credential encoding - c.EnsureCredEncoding(&tkgConfigNode) - - // ensure the providers section in the tkgconfig is correct and up-to-date - err = c.EnsureProvidersInConfig(templatesUpdated, &tkgConfigNode) - if err != nil { - return errors.Wrap(err, "unable to ensure default providers") - } - - // update the cli version in the config file - err = updateVersion(&tkgConfigNode) - if err != nil { - return errors.Wrap(err, "unable to update version information in tkg config file") - } - - out, err := yaml.Marshal(&tkgConfigNode) - if err != nil { - return errors.Wrap(err, "unable to set default providers in tkg config file") - } - - return os.WriteFile(tkgConfigPath, out, constants.ConfigFilePermissions) -} - -func (c *client) getTkgConfigNode(tkgConfigPath string) (yaml.Node, error) { - tkgConfigNode := yaml.Node{} - fileData, err := os.ReadFile(tkgConfigPath) - if err != nil { - return tkgConfigNode, errors.Wrapf(err, "unable to read tkg configuration from: %s", tkgConfigPath) - } - - // verify if the yaml file is in proper key-value format - var tmpMap map[string]interface{} - if err = yaml.Unmarshal(fileData, &tmpMap); err != nil { - return tkgConfigNode, errors.Wrapf(err, "%s is not a valid tkg config file, please check the syntax or delete the file to start over", tkgConfigPath) - } - - err = yaml.Unmarshal(fileData, &tkgConfigNode) - if err != nil { - return tkgConfigNode, errors.Wrapf(err, "unable to read tkg configuration from: %s, please check the syntax or delete the file to start over", tkgConfigPath) - } - - if len(tkgConfigNode.Content) == 0 { - return tkgConfigNode, errors.Errorf("%s is not a valid tkg config file", tkgConfigPath) - } - return tkgConfigNode, nil -} - -func (c *client) EnsureConfigImages() error { - // ensure that tkg config file exists with default value - tkgConfigPath, err := c.EnsureTKGConfigFile() - if err != nil { - return errors.Wrap(err, "unable to ensure tkg config file") - } - - tkgConfigNode, err := c.getTkgConfigNode(tkgConfigPath) - if err != nil { - return errors.Wrapf(err, "unable to get tkg configuration from: %s", tkgConfigPath) - } - - // ensure the images section in the tkgconfig is correct and up-to-date - err = c.EnsureImages(true, &tkgConfigNode) - if err != nil { - return errors.Wrap(err, "unable to ensure default images") - } - - out, err := yaml.Marshal(&tkgConfigNode) - if err != nil { - return errors.Wrap(err, "unable to set default providers in tkg config file") - } - - err = os.WriteFile(tkgConfigPath, out, constants.ConfigFilePermissions) - if err != nil { - return errors.Wrap(err, "unable update tkg config file") - } - - return c.TKGConfigReaderWriter().MergeInConfig(tkgConfigPath) -} diff --git a/tkg/tkgconfigupdater/helper.go b/tkg/tkgconfigupdater/helper.go deleted file mode 100644 index 27d57df9a1..0000000000 --- a/tkg/tkgconfigupdater/helper.go +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigupdater - -import ( - "archive/zip" - "crypto/sha256" - "encoding/base64" - "encoding/hex" - "hash" - "io" - "os" - "path/filepath" - "strings" - - "github.com/pkg/errors" - - "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/buildinfo" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -func encodeValueIfRequired(value string) (string, error) { - if value == "" || strings.HasPrefix(value, encodePrefix) { - return "", errors.New("no encoding required") - } - - base64EncodedValue := base64.StdEncoding.EncodeToString([]byte(value)) - return encodePrefix + base64EncodedValue + ">", nil -} - -func isDirectoryEmpty(directoryPath string) (bool, error) { - if _, err := os.Stat(directoryPath); os.IsNotExist(err) { - return false, err - } - - items, err := os.ReadDir(directoryPath) - if err != nil { - return false, errors.Wrapf(err, "unable to read %s directory", directoryPath) - } - return len(items) == 0, nil -} - -func unzip(srcfilepath, destdir string) error { - var err error - - r, err := zip.OpenReader(srcfilepath) - if err != nil { - return err - } - defer r.Close() - - for _, f := range r.File { - if strings.Contains(f.Name, "..") { - return errors.New("filepath contains directory(parent) \"..\" which could lead to zip file being extracted outside the current directory") - } - fpath := filepath.Join(destdir, f.Name) // #nosec - if f.FileInfo().IsDir() { - if err = os.MkdirAll(fpath, os.ModePerm); err != nil { - return errors.Wrap(err, "failed to make directory during unzip") - } - continue - } - if err := os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil { - return err - } - outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) - if err != nil { - return err - } - rc, err := f.Open() - if err != nil { - return err - } - _, err = io.Copy(outFile, rc) // #nosec - if err != nil { - return errors.Wrap(err, "failed to copy file during unzip") - } - // Close the file without defer to close before next iteration of loop - if err = outFile.Close(); err != nil { - return errors.Wrap(err, "failed to close file during unzip") - } - if err = rc.Close(); err != nil { - return errors.Wrap(err, "failed to close file during unzip") - } - } - return nil -} - -/* -GetProvidersChecksum returns the checksum of all file contents of type '.yaml' and '.star' in the tkg providers directory. -Addition or modification or deletion of files of type '.yaml' and '.star' in the tkg providers directory would result in a checksum change. -*/ -func (c *client) GetProvidersChecksum() (string, error) { - var err error - var providersDirPath string - - if providersDirPath, err = c.tkgConfigPathsClient.GetTKGProvidersDirectory(); err != nil { - return "", err - } - - files, err := getFilesForChecksum(providersDirPath) - if err != nil { - return "", err - } - - sha256Hash := sha256.New() - for _, file := range files { - err = hashFileContents(file, sha256Hash) - if err != nil { - return "", err - } - } - - return hex.EncodeToString(sha256Hash.Sum(nil)), nil -} - -// SaveProvidersChecksumToFile saves providers checksum to file -func (c *client) saveProvidersChecksumToFile() error { - var checksumFilePath, checksum string - var err error - - if checksumFilePath, err = c.tkgConfigPathsClient.GetTKGProvidersCheckSumPath(); err != nil { - return err - } - - if checksum, err = c.GetProvidersChecksum(); err != nil { - return err - } - - log.V(6).Infof("writing checksum %q to file %q", checksum, checksumFilePath) - if err := os.WriteFile(checksumFilePath, []byte(checksum), 0777); err != nil { - return err - } - - return nil -} - -func (c *client) GetPopulatedProvidersChecksumFromFile() (string, error) { - var checksumFilePath string - var checkSumBytes []byte - var err error - - if checksumFilePath, err = c.tkgConfigPathsClient.GetTKGProvidersCheckSumPath(); err != nil { - return "", err - } - - if checkSumBytes, err = os.ReadFile(checksumFilePath); err != nil { - return "", err - } - - return string(checkSumBytes), nil -} - -func (c *client) isProviderTemplatesEmbedded() bool { - providersZipBytes, err := c.providerGetter.GetProviderBundle() - if err != nil || len(providersZipBytes) == 0 { - return false - } - return true -} - -func (c *client) saveEmbeddedProviderTemplates(providerPath string) error { - providersZipBytes, err := c.providerGetter.GetProviderBundle() - if err != nil { - return errors.Wrap(err, "cannot find the provider bundle") - } - - // Remove existing provider files under directory - err = os.RemoveAll(providerPath) - if err != nil { - return errors.Wrap(err, "error while deleting providers directory") - } - - providerZipPath := filepath.Join(providerPath, "..", constants.LocalProvidersZipFileName) - if err := os.WriteFile(providerZipPath, providersZipBytes, 0o644); err != nil { - return errors.Wrap(err, "error while writing provider zip file") - } - - defer os.Remove(providerZipPath) - - if err := unzip(providerZipPath, providerPath); err != nil { - return errors.Wrap(err, "error while unzipping providers") - } - - if err := c.saveProvidersChecksumToFile(); err != nil { - return errors.Wrap(err, "error while saving providers checksum to file") - } - return nil -} - -func hashFileContents(filePath string, h hash.Hash) error { - f, err := os.Open(filePath) - if err != nil { - return err - } - defer f.Close() - log.V(10).Infof("calculating hash for file %q", filePath) - if _, err := io.Copy(h, f); err != nil { - return err - } - return nil -} - -func getFilesForChecksum(dirPath string) ([]string, error) { - var files []string - err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - if !info.IsDir() && includePathForChecksum(path) { - files = append(files, path) - } - - return nil - }) - - if err != nil { - return nil, err - } - return files, nil -} - -func includePathForChecksum(path string) bool { - extension := filepath.Ext(path) - switch extension { - case ".star": - return true - case ".yaml": - if !strings.Contains(path, "clusterclass-") { - return true - } - } - return false -} - -// updateVersion updates the CLI version to the config file -func updateVersion(tkgConfigNode *yaml.Node) error { - releaseIndex := GetNodeIndex(tkgConfigNode.Content[0].Content, constants.ReleaseKey) - - if releaseIndex == -1 { - tkgConfigNode.Content[0].Content = append(tkgConfigNode.Content[0].Content, createMappingNode(constants.ReleaseKey)...) - releaseIndex = GetNodeIndex(tkgConfigNode.Content[0].Content, constants.ReleaseKey) - } - - releaseMap := map[string]string{"version": buildinfo.Version} - - releaseBytes, err := yaml.Marshal(releaseMap) - if err != nil { - return errors.Wrap(err, "unable to marshal version information") - } - - releaseNode := yaml.Node{} - err = yaml.Unmarshal(releaseBytes, &releaseNode) - if err != nil { - return errors.Wrap(err, "unable to unmarshal version information") - } - - tkgConfigNode.Content[0].Content[releaseIndex] = releaseNode.Content[0] - - return nil -} - -func createMappingNode(key string) []*yaml.Node { - keyNode := &yaml.Node{ - Kind: yaml.ScalarNode, - Value: key, - } - valueNode := &yaml.Node{ - Kind: yaml.MappingNode, - } - - return []*yaml.Node{keyNode, valueNode} -} - -// TODO(rui): there are multiple places in this repo using this method, should expose in a util pkg -func createSequenceNode(key string) []*yaml.Node { - keyNode := &yaml.Node{ - Kind: yaml.ScalarNode, - Value: key, - } - valueNode := &yaml.Node{ - Kind: yaml.SequenceNode, - } - - return []*yaml.Node{keyNode, valueNode} -} diff --git a/tkg/tkgconfigupdater/helper_test.go b/tkg/tkgconfigupdater/helper_test.go deleted file mode 100644 index 06f4a45c5e..0000000000 --- a/tkg/tkgconfigupdater/helper_test.go +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigupdater - -import ( - "archive/zip" - "io" - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var ( - sampleFilePath string - sampleFilePath2 string - destDir string - baseDir string - incorrectFileName string -) - -var _ = Describe("Tests while unzipping a file", func() { - BeforeEach(func() { - sampleFilePath = "/tmp/baz.zip" - sampleFilePath2 = "/tmp/foobar.zip" - contentFileName := "foo.txt" - incorrectFileName = "../foobar.txt" - baseDir, err = os.MkdirTemp("/tmp", "test-zip") - if err != nil { - return - } - - err = setupSampleZipFile(sampleFilePath, contentFileName) - if err != nil { - return - } - }) - Context("Validating destDir path", func() { - AfterEach(func() { - os.RemoveAll(baseDir) - os.Remove(sampleFilePath) - os.Remove(sampleFilePath2) - os.Remove("/tmp/foobar.txt") - }) - It("when content file path is valid", func() { - destDir = "/tmp/foo" - err := unzip(sampleFilePath, destDir) - Expect(err).To(BeNil()) - - os.RemoveAll(destDir) - }) - It("when content file path is invalid", func() { - err := setupSampleZipFile(sampleFilePath2, incorrectFileName) - Expect(err).To(BeNil()) - destDir = "/tmp/bar" - err = unzip(sampleFilePath2, destDir) - Expect(err).To(Not(BeNil())) - Expect(err.Error()).To(ContainSubstring("filepath contains directory(parent)")) - }) - }) -}) - -func setupSampleZipFile(zipFileName, contentFileName string) error { - nestedDir, err := os.Create(baseDir + "/" + contentFileName) - if err != nil { - return err - } - - zipFile, err := os.Create(zipFileName) - if err != nil { - return err - } - defer zipFile.Close() - - zipWriter := zip.NewWriter(zipFile) - defer zipWriter.Close() - - fileToZip, err := os.Open(nestedDir.Name()) - if err != nil { - return err - } - - info, err := fileToZip.Stat() - if err != nil { - return err - } - - header, err := zip.FileInfoHeader(info) - if err != nil { - return err - } - - // Using FileInfoHeader() above only uses the basename of the file. If we want - // to preserve the folder structure we can overwrite this with the full path. - header.Name = fileToZip.Name() - - // Change to deflate to gain better compression - // see http://golang.org/pkg/archive/zip/#pkg-constants - header.Method = zip.Deflate - - writer, err := zipWriter.CreateHeader(header) - if err != nil { - return err - } - _, err = io.Copy(writer, fileToZip) - return err -} diff --git a/tkg/tkgconfigupdater/images.go b/tkg/tkgconfigupdater/images.go deleted file mode 100644 index 24d2af7031..0000000000 --- a/tkg/tkgconfigupdater/images.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigupdater - -import ( - "strings" - - "github.com/pkg/errors" - "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" -) - -type imageForConfigFile struct { - Repository string `yaml:"repository"` - Tag string `yaml:"tag,omitempty"` -} - -func (c *client) EnsureImages(needUpdate bool, tkgConfigNode *yaml.Node) error { - imageIndex := GetNodeIndex(tkgConfigNode.Content[0].Content, constants.ImagesConfigKey) - - // Always update the image section to handle users using different BOM files. //-x clean up? - // if imageIndex != -1 && !needUpdate { - // return nil - // } - - if imageIndex == -1 { - tkgConfigNode.Content[0].Content = append(tkgConfigNode.Content[0].Content, createMappingNode(constants.ImagesConfigKey)...) - imageIndex = GetNodeIndex(tkgConfigNode.Content[0].Content, constants.ImagesConfigKey) - } - - images, err := c.getImageMapForConfigFile() - if err != nil { - return errors.Wrap(err, "unable to get image map for config file") - } - - defaultImagesBytes, err := yaml.Marshal(images) - if err != nil { - return errors.Wrap(err, "unable to get a list of default images") - } - - imageListNode := yaml.Node{} - err = yaml.Unmarshal(defaultImagesBytes, &imageListNode) - if err != nil { - return errors.Wrap(err, "unable to get a list of default images") - } - - tkgConfigNode.Content[0].Content[imageIndex] = imageListNode.Content[0] - return nil -} - -func (c *client) getImageMapForConfigFile() (map[string]imageForConfigFile, error) { - bomConfig, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return nil, errors.Wrap(err, "unable to get default BOM file") - } - - baseImageRepository := bomConfig.ImageConfig.ImageRepository - - type component struct { - ComponentName string - ImageName string - } - configKeyTObomImageKeyMap := map[string]component{ - "cert-manager": { - "jetstack_cert-manager", - "certMgrControllerImage", - }, - "cluster-api": { - "cluster_api", - "capiControllerImage", - }, - "bootstrap-kubeadm": { - "cluster_api", - "cabpkControllerImage", - }, - "control-plane-kubeadm": { - "cluster_api", - "kcpControllerImage", - }, - "infrastructure-aws": { - "cluster_api_aws", - "capaControllerImage", - }, - "infrastructure-vsphere": { - "cluster_api_vsphere", - "capvControllerImage", - }, - "infrastructure-docker": { - "cluster_api", - "capdManagerImage", - }, - "infrastructure-azure": { - "cluster-api-provider-azure", - "capzControllerImage", - }, - "infrastructure-ipam-in-cluster": { - "cluster-api-ipam-provider-in-cluster", - "capiIPAMProviderInClusterControllerImage", - }, - } - - defaultBaseRepositoryForClusterAPI := baseImageRepository + "/cluster-api" - - images := map[string]imageForConfigFile{} - images["all"] = imageForConfigFile{Repository: defaultBaseRepositoryForClusterAPI} - - for configKey, bomImageComponent := range configKeyTObomImageKeyMap { - imageInfoFromBOM, exists := bomConfig.Components[bomImageComponent.ComponentName][0].Images[bomImageComponent.ImageName] - if !exists { - log.V(7).Infof("unable to find component %s, image %s in BOM file", bomImageComponent.ComponentName, bomImageComponent.ImageName) - continue - } - - repository, err := getRepositoryFromImagePathWithBaseRepositoryPatch(imageInfoFromBOM, baseImageRepository) - if err != nil { - log.V(7).Infof("unable to construct repository information for component %s, image %s in BOM file", bomImageComponent.ComponentName, bomImageComponent.ImageName) - continue - } - - if repository == defaultBaseRepositoryForClusterAPI { - continue - } - - image := imageForConfigFile{} - image.Repository = repository - if configKey == "cert-manager" { - image.Tag = imageInfoFromBOM.Tag - } - images[configKey] = image - } - - return images, nil -} - -// getRepositoryFromImagePathWithBaseRepositoryPatch return repository string from imagePath -// example: imagePath=cert-manager/cert-manager-controller, imageRepo: custom-repository, baseImageRepository: registry.tkg.vmware.run -// returns: custom-repository/cert-manager -// -// example: imagePath=cert-manager/cert-manager-controller, imageRepo: "", baseImageRepository: registry.tkg.vmware.run -// returns: registry.tkg.vmware.run/cert-manager -func getRepositoryFromImagePathWithBaseRepositoryPatch(image *tkgconfigbom.ImageInfo, baseImageRepository string) (string, error) { - imagePath := tkgconfigbom.GetFullImagePath(image, baseImageRepository) - arr := strings.Split(imagePath, "/") - if len(arr) < 1 { - return "", errors.New("invalid image patch, path does not contain repository") - } - return strings.Join(arr[:len(arr)-1], "/"), nil -} diff --git a/tkg/tkgconfigupdater/provider.go b/tkg/tkgconfigupdater/provider.go deleted file mode 100644 index c0a1d826f7..0000000000 --- a/tkg/tkgconfigupdater/provider.go +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigupdater - -import ( - "os" - "path/filepath" - "regexp" - "strings" - - ctlimg "github.com/k14s/imgpkg/pkg/imgpkg/registry" - "github.com/pkg/errors" - yaml "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/cli/clientconfighelpers" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/registry" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" -) - -type provider struct { - Name string `yaml:"name"` - URL string `yaml:"url"` - ProviderType string `yaml:"type"` -} - -type certManager struct { - URL string `yaml:"url"` - Version string `yaml:"version"` - Timeout string `yaml:"timeout"` -} - -type providers struct { - Providers []provider `yaml:"providers"` - CertManager certManager `yaml:"cert-manager"` -} - -func (c *client) defaultProviders() (providers, error) { - tkgDir, _, providersDir, err := c.tkgConfigPathsClient.GetTKGConfigDirectories() - if err != nil { - return providers{}, err - } - - providerConfigBytes, err := os.ReadFile(filepath.Join(providersDir, constants.LocalProvidersConfigFileName)) - if err != nil { - return providers{}, errors.Wrap(err, "cannot get provider config") - } - - providersConfig := providers{} - err = yaml.Unmarshal(providerConfigBytes, &providersConfig) - if err != nil { - return providers{}, errors.Wrapf(err, "Unable to unmarshall provider config") - } - for i := range providersConfig.Providers { - providersConfig.Providers[i].URL = getFilePath(tkgDir, providersConfig.Providers[i].URL) - } - providersConfig.CertManager.URL = getFilePath(tkgDir, providersConfig.CertManager.URL) - providersConfig.CertManager.Timeout = "30m" // TODO: Make this configurable and increase the default timeout value (https://github.com/vmware-tanzu/tanzu-framework/issues/2360) - - return providersConfig, nil -} - -func getFilePath(tkgDir, url string) string { - path := filepath.Join(tkgDir, url) - if strings.Contains(path, "\\") { - // convert windows backslash style paths 'c:\foo\....' to file:// urls - path = "file:///" + filepath.ToSlash(path) - } - return path -} - -func ensureCertManagerInConfig(defaultProviders providers, tkgConfigNode *yaml.Node) error { - certManagerIndex := GetNodeIndex(tkgConfigNode.Content[0].Content, constants.CertManagerConfigKey) - if certManagerIndex == -1 { - tkgConfigNode.Content[0].Content = append(tkgConfigNode.Content[0].Content, createSequenceNode(constants.CertManagerConfigKey)...) - certManagerIndex = GetNodeIndex(tkgConfigNode.Content[0].Content, constants.CertManagerConfigKey) - } - - certManagerNode := yaml.Node{} - if err := copyData(defaultProviders.CertManager, &certManagerNode); err != nil { - return errors.Wrap(err, "unable to get cert-manager") - } - - tkgConfigNode.Content[0].Content[certManagerIndex] = certManagerNode.Content[0] - return nil -} - -func copyData(from, to interface{}) error { - bytes, err := yaml.Marshal(from) - if err != nil { - return err - } - - if err := yaml.Unmarshal(bytes, to); err != nil { - return err - } - return nil -} - -func ensureProvidersWhenKeyAbsent(defaultProviders providers, tkgConfigNode *yaml.Node) error { - tkgConfigNode.Content[0].Content = append(tkgConfigNode.Content[0].Content, createSequenceNode(constants.ProvidersConfigKey)...) - providerIndex := GetNodeIndex(tkgConfigNode.Content[0].Content, constants.ProvidersConfigKey) - - providerListNode := yaml.Node{} - if err := copyData(defaultProviders.Providers, &providerListNode); err != nil { - return errors.Wrap(err, "unable to get a list of default providers") - } - tkgConfigNode.Content[0].Content[providerIndex] = providerListNode.Content[0] - return nil -} - -// EnsureProvidersInConfig ensures the providers section in tkgconfig exists and it is synchronized with the latest providers -func (c *client) EnsureProvidersInConfig(needUpdate bool, tkgConfigNode *yaml.Node) error { - providerIndex := GetNodeIndex(tkgConfigNode.Content[0].Content, constants.ProvidersConfigKey) - if providerIndex != -1 && !needUpdate { - return nil - } - defaultProviders, err := c.defaultProviders() - if err != nil { - return errors.Wrap(err, "unable to get a list of default providers") - } - - err = ensureCertManagerInConfig(defaultProviders, tkgConfigNode) - if err != nil { - return err - } - - if providerIndex == -1 { - return ensureProvidersWhenKeyAbsent(defaultProviders, tkgConfigNode) - } - - userProviders := providers{} - if err := copyData(tkgConfigNode, &userProviders); err != nil { - return errors.Wrap(err, "unable to get a list of default providers") - } - - for _, dp := range defaultProviders.Providers { - found := false - for i, p := range userProviders.Providers { - if p.Name == dp.Name && p.ProviderType == dp.ProviderType { - userProviders.Providers[i].URL = dp.URL - found = true - break - } - } - if !found { - userProviders.Providers = append(userProviders.Providers, provider{Name: dp.Name, ProviderType: dp.ProviderType, URL: dp.URL}) - } - } - - updatedproviderListNode := yaml.Node{} - if err := copyData(userProviders.Providers, &updatedproviderListNode); err != nil { - return errors.Wrap(err, "unable to get a list of default providers") - } - tkgConfigNode.Content[0].Content[providerIndex] = updatedproviderListNode.Content[0] - - return nil -} - -func (c *client) CheckInfrastructureVersion(providerName string) (string, error) { - strs := strings.Split(providerName, ":") - if len(strs) > 2 || len(strs) == 0 { - return "", errors.New("not a valid infrastructure provider name") - } - - if len(strs) == 1 { - version, err := c.GetDefaultInfrastructureVersion(providerName) - if err != nil { - return "", errors.Wrapf(err, "not able to set default infrastructure provider version for %s", providerName) - } - - return providerName + ":" + version, nil - } - - match, err := regexp.MatchString("v([0-9]+).([0-9]+).([0-9]+)", strs[len(strs)-1]) - if err != nil || !match { - return "", errors.Errorf("%s is not a valid provider version", strs[len(strs)-1]) - } - - return providerName, nil -} - -func (c *client) GetDefaultInfrastructureVersion(providerName string) (string, error) { - tkgConfigPath, err := c.tkgConfigPathsClient.GetTKGConfigPath() - if err != nil { - return "", err - } - - fileData, err := os.ReadFile(tkgConfigPath) - if err != nil { - return "", errors.Wrapf(err, "unable to read tkg configuration from: %s", tkgConfigPath) - } - - var providerMap providers - - count := 0 - version := "" - - if err = yaml.Unmarshal(fileData, &providerMap); err != nil { - return "", errors.Wrapf(err, "%s does not contains valid providers info", tkgConfigPath) - } - - for _, p := range providerMap.Providers { - if p.Name == providerName && p.ProviderType == constants.InfrastructureProviderType { - count++ - version, err = extractVersionFromPath(p.URL) - if err != nil { - return "", err - } - } - } - - if count != 1 { - return "", errors.Errorf("cannot get default infrastructure provider version for %s from config file %s, 0 or multiple versions found", providerName, tkgConfigPath) - } - return version, nil -} - -func extractVersionFromPath(path string) (string, error) { - // according to clusterctl provider contract, a local repository need to follow the pattern ~/local-repository/infrastructure-aws/v0.5.2/xxx.yaml - strs := strings.Split(path, "/") - - const maxStrLen = 2 - if len(strs) < maxStrLen { - return "", errors.Errorf("%s is not a valid local provider repository path", path) - } - - match, err := regexp.MatchString("v([0-9]+).([0-9]+).([0-9]+)", strs[len(strs)-2]) - if err != nil || !match { - return "", errors.Errorf("%s is not a valid local provider repository path", path) - } - return strs[len(strs)-2], nil -} - -func (c *client) InitProvidersRegistry() (registry.Registry, error) { - verifyCerts := true - skipVerifyCerts, err := c.tkgConfigReaderWriter.Get(constants.ConfigVariableCustomImageRepositorySkipTLSVerify) - if err == nil && strings.EqualFold(skipVerifyCerts, "true") { - verifyCerts = false - } - - registryOpts := ctlimg.Opts{ - VerifyCerts: verifyCerts, - Anon: true, - } - - caCertBytes, err := clientconfighelpers.GetCustomRepositoryCaCertificateForClient(c.tkgConfigReaderWriter) - if err == nil && len(caCertBytes) != 0 { - filePath, err := tkgconfigpaths.GetRegistryCertFile() - if err != nil { - return nil, err - } - err = os.WriteFile(filePath, caCertBytes, 0644) - if err != nil { - return nil, errors.Wrapf(err, "failed to write the custom image registry CA cert to file '%s'", filePath) - } - registryOpts.CACertPaths = []string{filePath} - } - - return registry.New(®istryOpts) -} diff --git a/tkg/tkgconfigupdater/save.go b/tkg/tkgconfigupdater/save.go deleted file mode 100644 index d9476407c1..0000000000 --- a/tkg/tkgconfigupdater/save.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigupdater - -import ( - "os" - "path/filepath" - - "github.com/pkg/errors" - yaml "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -func encodeMap(data map[string]string) { - for key, value := range data { - if shouldEncode(key) { - encodedValue, err := encodeValueIfRequired(value) - if err == nil { - data[key] = encodedValue - } - } - } -} - -func shouldEncode(key string) bool { - return utils.ContainsString(KeysToEncode, key) -} - -// SaveConfig saves configuration to ReaderWriter and/or to File -// allows clusterConfigPath to be empty, in which case no file is written -// allows TKGConfigReaderWriter to be empty, in which case no update is made to that writer -// (allows both to be empty, in which case the method does nothing) -func SaveConfig(clusterConfigPath string, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter, configObj interface{}) error { - configMap, err := CreateConfigMap(configObj) - if err != nil { - return err - } - - if tkgConfigReaderWriter != nil { - tkgConfigReaderWriter.SetMap(configMap) - } - if len(clusterConfigPath) > 0 { - err = SetConfig(configMap, clusterConfigPath) - } - - return err -} - -// CreateConfigMap transforms a configuration object into a map -func CreateConfigMap(configObj interface{}) (map[string]string, error) { - // turn the object into a YAML byte array - configByte, err := yaml.Marshal(configObj) - if err != nil { - return nil, errors.Wrap(err, "unable to marshal config object") - } - - // turn the byte array into a map - configMap := make(map[string]string) - - err = yaml.Unmarshal(configByte, &configMap) - if err != nil { - return nil, errors.Wrap(err, "error unmarshalling file") - } - - // certain values (like passwords) need encoding - encodeMap(configMap) - - return configMap, nil -} - -// SetConfig saves map of key-value pairs to config file (creating if nec) -func SetConfig(data map[string]string, clusterConfigPath string) error { - // Ensure the directory exists - clusterConfigDir := filepath.Dir(clusterConfigPath) - if _, err := os.Stat(clusterConfigDir); os.IsNotExist(err) { - if err = os.MkdirAll(clusterConfigDir, constants.DefaultDirectoryPermissions); err != nil { - return errors.Wrapf(err, "cannot create cluster config directory '%s'", clusterConfigDir) - } - } - - // unmarshal the config into map - tkgConfigMap := make(map[string]interface{}) - // read tkg config file (if it exists) - fileData, err := os.ReadFile(clusterConfigPath) - if err != nil { - if !os.IsNotExist(err) { - return errors.Errorf("unable to read tkg configuration from: %s", clusterConfigPath) - } - // if the file doesn't exist, just continue - } else { - // unmarshal the existing config into map - err = yaml.Unmarshal(fileData, &tkgConfigMap) - if err != nil { - return errors.Wrapf(err, "unable to unmarshal tkg configuration file %s", clusterConfigPath) - } - } - - mergeParamDataWithConfigFile(data, tkgConfigMap) - - outBytes, err := yaml.Marshal(&tkgConfigMap) - if err != nil { - return errors.Wrapf(err, "error marshaling configuration file") - } - err = os.WriteFile(clusterConfigPath, outBytes, constants.ConfigFilePermissions) - if err != nil { - return errors.Wrapf(err, "error writing configuration file") - } - - return nil -} - -func mergeParamDataWithConfigFile(data map[string]string, tkgConfigMap map[string]interface{}) { - // copy the parameter data over top any existing configuration data - for key, value := range data { - if !shouldExcludeFromFile(key) { - tkgConfigMap[key] = value - } - } -} - -func shouldExcludeFromFile(key string) bool { - return utils.ContainsString(KeysToNeverPersist, key) -} - -// GetNodeIndex returns index of the node -func GetNodeIndex(node []*yaml.Node, key string) int { - appIdx := -1 - for i, k := range node { - if i%2 == 0 && k.Value == key { - appIdx = i + 1 - break - } - } - return appIdx -} diff --git a/tkg/tkgconfigupdater/tkgconfigupdater_test.go b/tkg/tkgconfigupdater/tkgconfigupdater_test.go deleted file mode 100644 index c0ebe4e25c..0000000000 --- a/tkg/tkgconfigupdater/tkgconfigupdater_test.go +++ /dev/null @@ -1,871 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigupdater - -import ( - "bytes" - "errors" - "fmt" - "os" - "path/filepath" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/providerinterface" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -const ( - constConfigPath = "../fakes/config/config.yaml" - constConfig2Path = "../fakes/config/config2.yaml" - constConfig3Path = "../fakes/config/config3.yaml" - constKeyFOO = "FOO" - constKeyBAR = "BAR" - constValueFoo = "foo" -) - -var ( - testingDir string - err error - defaultBomFile = "../fakes/config/bom/tkg-bom-v1.3.0.yaml" -) - -func TestTKGConfig(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Tkg config updater Suite") -} - -var _ = Describe("SaveConfig", func() { - BeforeSuite((func() { - testingDir = fakehelper.CreateTempTestingDirectory() - })) - - AfterSuite((func() { - fakehelper.DeleteTempTestingDirectory(testingDir) - })) - - var ( - vars map[string]string - err error - clusterConfigPath string - originalFile []byte - key string - value string - ) - JustBeforeEach(func() { - setupPrerequsiteForTesting(clusterConfigPath, testingDir, defaultBomFile) - originalFile, err = os.ReadFile(clusterConfigPath) - Expect(err).ToNot(HaveOccurred()) - var tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - tkgConfigReaderWriter, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile(clusterConfigPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - err = SaveConfig(clusterConfigPath, tkgConfigReaderWriter, vars) - }) - - Context("When the tkgconfig file contains the key", func() { - BeforeEach(func() { - clusterConfigPath = constConfigPath - key = constKeyBAR - value = constValueFoo - vars = make(map[string]string) - vars[key] = value - }) - - It("should override the key with the new value", func() { - Expect(err).ToNot(HaveOccurred()) - res, err := getValue(clusterConfigPath, key) - Expect(err).ToNot(HaveOccurred()) - Expect(res).To(Equal(value)) - }) - }) - - Context("When the tkgconfig file does not contains the key", func() { - BeforeEach(func() { - clusterConfigPath = constConfigPath - key = constKeyFOO - value = constValueFoo - vars = make(map[string]string) - vars[key] = value - }) - - It("should append the key-value pair to the tkgconfig vile", func() { - Expect(err).ToNot(HaveOccurred()) - res, err := getValue(clusterConfigPath, key) - Expect(err).ToNot(HaveOccurred()) - Expect(res).To(Equal(value)) - }) - }) - - AfterEach(func() { - err = os.WriteFile(clusterConfigPath, originalFile, constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) - - _ = os.Unsetenv("FOO") - _ = os.Unsetenv(constKeyBAR) - }) -}) - -var _ = Describe("Credential Encoding/Decoding", func() { - var ( - clusterConfigPath string - client Client - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - err error - ) - - BeforeEach(func() { - createTempDirectory("reader_test") - }) - - JustBeforeEach(func() { - tkgConfigReaderWriter, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile(clusterConfigPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - client = New(testingDir, NewProviderTest(), tkgConfigReaderWriter) - tkgConfigNode := loadTKGNode(clusterConfigPath) - - client.EnsureCredEncoding(tkgConfigNode) - writeYaml(clusterConfigPath, tkgConfigNode) - - _, err = tkgconfigreaderwriter.New(clusterConfigPath) - Expect(err).ToNot(HaveOccurred()) - err = client.DecodeCredentialsInViper() - Expect(err).ToNot(HaveOccurred()) - }) - - Context("When the credential is in clear text format", func() { - BeforeEach(func() { - clusterConfigPath = getConfigFilePath("config4.yaml") - }) - - It("should have encoded value in config file and clear text value in viper", func() { - configByte, err := os.ReadFile(clusterConfigPath) - Expect(err).ToNot(HaveOccurred()) - - configMap := make(map[string]interface{}) - err = yaml.Unmarshal(configByte, &configMap) - Expect(err).ToNot(HaveOccurred()) - value, ok := configMap[constants.ConfigVariableVspherePassword] - Expect(ok).To(Equal(true)) - Expect(value).To(Equal("")) // base64encoded value of Admin!23 - - viperValue, err := tkgConfigReaderWriter.Get(constants.ConfigVariableVspherePassword) - Expect(err).NotTo(HaveOccurred()) - Expect(viperValue).To(Equal("Admin!23")) - }) - }) - - Context("When the credential is already base64 encoded", func() { - BeforeEach(func() { - clusterConfigPath = getConfigFilePath("config4.yaml") - }) - - It("should have encoded value in config file and clear text value in viper", func() { - configByte, err := os.ReadFile(clusterConfigPath) - Expect(err).ToNot(HaveOccurred()) - - configMap := make(map[string]interface{}) - err = yaml.Unmarshal(configByte, &configMap) - Expect(err).ToNot(HaveOccurred()) - value, ok := configMap[constants.ConfigVariableAWSAccessKeyID] - Expect(ok).To(Equal(true)) - Expect(value).To(Equal("")) // base64encoded value of QWRETYUIOPLKJHGFDSAZ - - viperValue, err := tkgConfigReaderWriter.Get(constants.ConfigVariableAWSAccessKeyID) - Expect(err).NotTo(HaveOccurred()) - Expect(viperValue).To(Equal("QWRETYUIOPLKJHGFDSAZ")) - }) - }) - - Context("When the credential is in clear text and it has $ char in it", func() { - BeforeEach(func() { - clusterConfigPath = getConfigFilePath("config4.yaml") - }) - - It("should have encoded value in config file and clear text value in viper", func() { - configByte, err := os.ReadFile(clusterConfigPath) - Expect(err).ToNot(HaveOccurred()) - - configMap := make(map[string]interface{}) - err = yaml.Unmarshal(configByte, &configMap) - Expect(err).ToNot(HaveOccurred()) - value, ok := configMap[constants.ConfigVariableAWSSecretAccessKey] - Expect(ok).To(Equal(true)) - Expect(value).To(Equal("")) // base64encoded value of uNncCatIvWu1e$rqwerkg35qU7dswfEa4rdXJk/E - - viperValue, err := tkgConfigReaderWriter.Get(constants.ConfigVariableAWSSecretAccessKey) - Expect(err).NotTo(HaveOccurred()) - Expect(viperValue).To(Equal("uNncCatIvWu1e$rqwerkg35qU7dswfEa4rdXJk/E")) - }) - }) - - Context("When the credential is in clear text format and passed through UI", func() { - BeforeEach(func() { - clusterConfigPath = getConfigFilePath("config4.yaml") - res := map[string]string{ - constants.ConfigVariableVspherePassword: "Admin$123", - } - tkgConfigReaderWriter, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile(clusterConfigPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - err = SaveConfig(clusterConfigPath, tkgConfigReaderWriter, res) - Expect(err).ToNot(HaveOccurred()) - }) - - It("should have encoded value in config file and clear text value in viper", func() { - configByte, err := os.ReadFile(clusterConfigPath) - Expect(err).ToNot(HaveOccurred()) - - configMap := make(map[string]interface{}) - err = yaml.Unmarshal(configByte, &configMap) - Expect(err).ToNot(HaveOccurred()) - value, ok := configMap[constants.ConfigVariableVspherePassword] - Expect(ok).To(Equal(true)) - Expect(value).To(Equal("")) // base64encoded value of Admin$23 - - viperValue, err := tkgConfigReaderWriter.Get(constants.ConfigVariableVspherePassword) - Expect(err).NotTo(HaveOccurred()) - Expect(viperValue).To(Equal("Admin$123")) - }) - }) - - Context("When using sensitive AWS information", func() { - BeforeEach(func() { - clusterConfigPath = getConfigFilePath("config_never_persist.yaml") - standardVal := "standardVal" - res := map[string]string{ - constants.ConfigVariableAWSAccessKeyID: standardVal, - constants.ConfigVariableAWSSecretAccessKey: standardVal, - constants.ConfigVariableAWSSessionToken: standardVal, - constants.ConfigVariableAWSB64Credentials: standardVal, - constants.ConfigVariableAWSProfile: standardVal, - } - tkgConfigReaderWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(clusterConfigPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - err = SaveConfig(clusterConfigPath, tkgConfigReaderWriter, res) - Expect(err).ToNot(HaveOccurred()) - }) - - It("should never have saved the information", func() { - configBytes, err := os.ReadFile(clusterConfigPath) - Expect(err).ToNot(HaveOccurred()) - fmt.Println(string(configBytes)) - configMap := make(map[string]interface{}) - err = yaml.Unmarshal(configBytes, &configMap) - Expect(err).ToNot(HaveOccurred()) - _, ok := configMap[constants.ConfigVariableAWSAccessKeyID] - Expect(ok).To(Equal(false)) - _, ok = configMap[constants.ConfigVariableAWSSecretAccessKey] - Expect(ok).To(Equal(false)) - _, ok = configMap[constants.ConfigVariableAWSSessionToken] - Expect(ok).To(Equal(false)) - _, ok = configMap[constants.ConfigVariableAWSB64Credentials] - Expect(ok).To(Equal(false)) - val, ok := configMap[constants.ConfigVariableAWSProfile] - Expect(ok).To(Equal(true)) - Expect(val).To(Equal("standardVal")) - }) - }) - - Context("When the ssh key is longer than 80 chars", func() { - var longSSHString string - BeforeEach(func() { - clusterConfigPath = getConfigFilePath("config4.yaml") - longSSHString = "ssh 123456789012345678901234567890123456789012345678901234567890XXXXXX yy" - res := map[string]string{ - constants.ConfigVariableVsphereSSHAuthorizedKey: longSSHString, - } - tkgConfigReaderWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(clusterConfigPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - err = SaveConfig(clusterConfigPath, tkgConfigReaderWriter, res) - Expect(err).ToNot(HaveOccurred()) - }) - - It("should have saved the long string in a single line", func() { - configBytes, err := os.ReadFile(clusterConfigPath) - Expect(err).ToNot(HaveOccurred()) - - configMap := make(map[string]interface{}) - err = yaml.Unmarshal(configBytes, &configMap) - Expect(err).ToNot(HaveOccurred()) - value, ok := configMap[constants.ConfigVariableVsphereSSHAuthorizedKey] - Expect(ok).To(Equal(true)) - Expect(value).To(Equal(longSSHString)) - - expectedLineValue := fmt.Sprintf("%s: %s", constants.ConfigVariableVsphereSSHAuthorizedKey, longSSHString) - contains := bytes.Contains(configBytes, []byte(expectedLineValue)) - Expect(contains).To(Equal(true)) - }) - }) - - AfterEach(func() { - deleteTempDirectory() - }) -}) - -var _ = Describe("GetPopulatedProvidersChecksumFromFile", func() { - var ( - err error - client Client - checksum string - ) - - BeforeEach(func() { - createTempDirectory("template_test") - configPath := constConfigPath - setupPrerequsiteForTesting(configPath, testingDir, defaultBomFile) - tkgConfigReaderWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - client = New(testingDir, NewProviderTest(), tkgConfigReaderWriter) - _, err = client.EnsureTemplateFiles() - Expect(err).NotTo(HaveOccurred()) - }) - - JustBeforeEach(func() { - checksum, err = client.GetPopulatedProvidersChecksumFromFile() - }) - - Context("When the providers folder exists", func() { - It("should return the populated checksum from the providers directory", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(checksum).To(Equal("cb3805b1f66ea62bc52a712085c48b1d3c3e90807da332bf15d478cf558269d1")) - }) - }) - - AfterEach(func() { - deleteTempDirectory() - }) -}) - -var _ = Describe("GetProvidersChecksum", func() { - var ( - err error - client Client - checksum string - ) - - BeforeEach(func() { - createTempDirectory("template_test") - configPath := constConfigPath - setupPrerequsiteForTesting(configPath, testingDir, defaultBomFile) - tkgConfigReaderWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - client = New(testingDir, NewProviderTest(), tkgConfigReaderWriter) - _, err = client.EnsureTemplateFiles() - Expect(err).NotTo(HaveOccurred()) - }) - - JustBeforeEach(func() { - checksum, err = client.GetProvidersChecksum() - }) - - Context("When the providers folder exist", func() { - It("should return the checksum of files in the providers directory", func() { - Expect(err).ToNot(HaveOccurred()) - providerConfigPath := filepath.Join(testingDir, constants.LocalProvidersFolderName, constants.LocalProvidersConfigFileName) - _, err = os.Stat(providerConfigPath) - Expect(err).ToNot(HaveOccurred()) - Expect(checksum).To(Equal("cb3805b1f66ea62bc52a712085c48b1d3c3e90807da332bf15d478cf558269d1")) - }) - }) - - Context("When new text file is added to the providers directory", func() { - BeforeEach(func() { - providersTempFile := filepath.Join(testingDir, constants.LocalProvidersFolderName, "temp.txt") - err = os.WriteFile(providersTempFile, []byte("hello world"), 0644) - Expect(err).ToNot(HaveOccurred()) - }) - - It("checksum is not modified", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(checksum).To(Equal("cb3805b1f66ea62bc52a712085c48b1d3c3e90807da332bf15d478cf558269d1")) - }) - }) - - Context("When new yaml file is added to the providers directory", func() { - BeforeEach(func() { - providersTempFile := filepath.Join(testingDir, constants.LocalProvidersFolderName, "overlay.yaml") - err = os.WriteFile(providersTempFile, []byte("---"), 0644) - Expect(err).ToNot(HaveOccurred()) - }) - - It("checksum is modified", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(checksum).To(Equal("e9bf762305c9972a10b9cd3a2996b6cc001620ecd3876acacf90eda01e948fab")) - }) - }) - - Context("When new cluster class yaml file clusterclass-xxx.yaml is added to the providers directory", func() { - BeforeEach(func() { - providersTempFile := filepath.Join(testingDir, constants.LocalProvidersFolderName, "clusterclass-foo.yaml") - err = os.WriteFile(providersTempFile, []byte("---"), 0644) - Expect(err).ToNot(HaveOccurred()) - }) - - It("checksum is not modified", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(checksum).To(Equal("cb3805b1f66ea62bc52a712085c48b1d3c3e90807da332bf15d478cf558269d1")) - }) - }) - - AfterEach(func() { - deleteTempDirectory() - }) -}) - -var _ = Describe("EnsureTemplateFiles", func() { - var ( - err error - needUpdate bool - client Client - ) - - BeforeEach(func() { - createTempDirectory("template_test") - configPath := constConfigPath - setupPrerequsiteForTesting(configPath, testingDir, defaultBomFile) - tkgConfigReaderWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - client = New(testingDir, NewProviderTest(), tkgConfigReaderWriter) - }) - - JustBeforeEach(func() { - needUpdate, err = client.EnsureTemplateFiles() - }) - - Context("When the providers folder does not exsit", func() { - BeforeEach(func() { - needUpdate = false - }) - - It("should explode the providers fold under $HOME/.tkg", func() { - Expect(err).ToNot(HaveOccurred()) - providerConfigPath := filepath.Join(testingDir, constants.LocalProvidersFolderName, constants.LocalProvidersConfigFileName) - _, err = os.Stat(providerConfigPath) - Expect(err).ToNot(HaveOccurred()) - Expect(needUpdate).To(BeTrue()) - }) - }) - - AfterEach(func() { - deleteTempDirectory() - }) -}) - -var _ = Describe("CheckProviderTemplatesNeedUpdate", func() { - var ( - err error - needUpdate bool - client Client - ) - - BeforeEach(func() { - createTempDirectory("template_test") - configPath := constConfigPath - setupPrerequsiteForTesting(configPath, testingDir, defaultBomFile) - tkgConfigReaderWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - client = New(testingDir, NewProviderTest(), tkgConfigReaderWriter) - _, err = client.EnsureTemplateFiles() - Expect(err).NotTo(HaveOccurred()) - }) - JustBeforeEach(func() { - needUpdate, err = client.CheckProviderTemplatesNeedUpdate() - }) - - Context("When providers are embedded", func() { - It("should return true for needUpdate flag ", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(needUpdate).To(Equal(true)) - }) - }) - - Context("When SUPPRESS_PROVIDERS_UPDATE environment variable is specified", func() { - BeforeEach(func() { - os.Setenv(constants.SuppressProvidersUpdate, "1") - }) - AfterEach(func() { - os.Unsetenv(constants.SuppressProvidersUpdate) - }) - It("should return false for needUpdate flag ", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(needUpdate).To(Equal(false)) - }) - }) - - AfterEach(func() { - deleteTempDirectory() - }) -}) - -var _ = Describe("EnsureProviders", func() { - var ( - err error - needUpdate bool - clusterConfigPath string - tkgConfigNode *yaml.Node - client Client - ) - - BeforeEach(func() { - createTempDirectory("template_test") - client = New(testingDir, NewProviderTest(), nil) - err = os.MkdirAll(testingDir, os.ModePerm) - Expect(err).ToNot(HaveOccurred()) - }) - - JustBeforeEach(func() { - setupPrerequsiteForTesting(clusterConfigPath, testingDir, defaultBomFile) - tkgConfigNode = loadTKGNode(clusterConfigPath) - var tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - tkgConfigReaderWriter, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile(clusterConfigPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - client = New(testingDir, NewProviderTest(), tkgConfigReaderWriter) - _, err = client.EnsureTemplateFiles() - Expect(err).NotTo(HaveOccurred()) - err = client.EnsureProvidersInConfig(needUpdate, tkgConfigNode) - }) - - Context("When providers section is absent from the tkg config", func() { - BeforeEach(func() { - needUpdate = false - clusterConfigPath = constConfig2Path - }) - - It("should append the providers section to the tkg config file", func() { - Expect(err).ToNot(HaveOccurred()) - index := getNodeIndex(tkgConfigNode.Content[0].Content, constants.ProvidersConfigKey) - Expect(index).ToNot(Equal(-1)) - - index = getNodeIndex(tkgConfigNode.Content[0].Content, constants.CertManagerConfigKey) - Expect(index).ToNot(Equal(-1)) - }) - }) - - Context("When there is no need for update provider, and provider section exists", func() { - BeforeEach(func() { - needUpdate = false - clusterConfigPath = constConfig3Path - }) - It("should append the providers section to the tkg config file", func() { - Expect(err).ToNot(HaveOccurred()) - index := getNodeIndex(tkgConfigNode.Content[0].Content, constants.ProvidersConfigKey) - Expect(index).ToNot(Equal(-1)) - Expect(tkgConfigNode.Content[0].Content[index].Content).To(HaveLen(2)) - }) - }) - - Context("When the provider section needs to be updated", func() { - BeforeEach(func() { - needUpdate = true - clusterConfigPath = constConfig3Path - }) - It("should append the providers section to the tkg config file ", func() { - Expect(err).ToNot(HaveOccurred()) - index := getNodeIndex(tkgConfigNode.Content[0].Content, constants.ProvidersConfigKey) - Expect(index).ToNot(Equal(-1)) - - numOfProviders, err := countProviders() - Expect(err).ToNot(HaveOccurred()) - // numOfProviders(6) + 1 customized provider - Expect(tkgConfigNode.Content[0].Content[index].Content).To(HaveLen(numOfProviders + 1)) - - index = getNodeIndex(tkgConfigNode.Content[0].Content, constants.CertManagerConfigKey) - Expect(index).ToNot(Equal(-1)) - - userProviders := providers{} - err = copyData(tkgConfigNode, &userProviders) - Expect(err).ToNot(HaveOccurred()) - - Expect(userProviders.CertManager.URL).To(ContainSubstring("providers/cert-manager/v1.5.3/cert-manager.yaml")) - Expect(userProviders.CertManager.Version).To(Equal("v1.5.3")) - }) - }) - - AfterEach(func() { - deleteTempDirectory() - }) -}) - -var _ = Describe("EnsureImages", func() { - var ( - err error - needUpdate bool - clusterConfigPath string - tkgConfigNode *yaml.Node - client Client - ) - - BeforeEach(func() { - createTempDirectory("template_test") - }) - - JustBeforeEach(func() { - setupPrerequsiteForTesting(clusterConfigPath, testingDir, defaultBomFile) - tkgConfigNode = loadTKGNode(clusterConfigPath) - var tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - tkgConfigReaderWriter, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile(clusterConfigPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - client = New(testingDir, NewProviderTest(), tkgConfigReaderWriter) - _, err = client.EnsureTemplateFiles() - Expect(err).NotTo(HaveOccurred()) - err = client.EnsureImages(needUpdate, tkgConfigNode) - }) - - Context("when the images section is absent from the tkg config", func() { - BeforeEach(func() { - needUpdate = false - clusterConfigPath = constConfigPath - }) - - It("should append the images section to the tkg config file", func() { - Expect(err).ToNot(HaveOccurred()) - index := getNodeIndex(tkgConfigNode.Content[0].Content, constants.ImagesConfigKey) - Expect(index).ToNot(Equal(-1)) - }) - }) - - Context("when there is no need to update tkg config file", func() { - BeforeEach(func() { - needUpdate = false - clusterConfigPath = constConfig2Path - }) - - It("should append the images section to the tkg config file", func() { - Expect(err).ToNot(HaveOccurred()) - index := getNodeIndex(tkgConfigNode.Content[0].Content, constants.ImagesConfigKey) - Expect(index).ToNot(Equal(-1)) - // 2 * (1 key node + 1 value node) - Expect(tkgConfigNode.Content[0].Content[index].Content).To(HaveLen(4)) - }) - }) - - Context("when the images section needs to be updated", func() { - BeforeEach(func() { - needUpdate = true - clusterConfigPath = constConfig2Path - }) - - It("should append the images section to the tkg config file", func() { - Expect(err).ToNot(HaveOccurred()) - index := getNodeIndex(tkgConfigNode.Content[0].Content, constants.ImagesConfigKey) - Expect(index).ToNot(Equal(-1)) - // 2 * (1 key node + 1 value node) - Expect(tkgConfigNode.Content[0].Content[index].Content).To(HaveLen(4)) - }) - }) - - AfterEach(func() { - deleteTempDirectory() - }) -}) - -var _ = Describe("Ensuring TKG compatibility file", func() { - var ( - clusterConfigPath string - client Client - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - err error - ) - - BeforeEach(func() { - createTempDirectory("reader_test") - }) - - JustBeforeEach(func() { - tkgConfigReaderWriter, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile(clusterConfigPath, filepath.Join(testingDir, "config.yaml")) - Expect(err).NotTo(HaveOccurred()) - client = New(testingDir, NewProviderTest(), tkgConfigReaderWriter) - tkgConfigNode := loadTKGNode(clusterConfigPath) - - client.EnsureCredEncoding(tkgConfigNode) - writeYaml(clusterConfigPath, tkgConfigNode) - - _, err = tkgconfigreaderwriter.New(clusterConfigPath) - Expect(err).ToNot(HaveOccurred()) - err = client.DecodeCredentialsInViper() - Expect(err).ToNot(HaveOccurred()) - }) - - Context("When the tkg-compatibility.yaml pre-exists", func() { - BeforeEach(func() { - clusterConfigPath = getConfigFilePath("config4.yaml") - }) - - It("should not re-download the file", func() { - compatibilityConfigFile, err := tkgconfigpaths.New(testingDir).GetTKGCompatibilityConfigPath() - Expect(err).ToNot(HaveOccurred()) - - // capture modified time of existing compatibility file - f1, err := os.Stat(compatibilityConfigFile) - Expect(err).ToNot(HaveOccurred()) - f1ModTime := f1.ModTime() - - // EnsureTKGCompatabilityFile will go out to a registry to retrieve a file if the - // compatibility is not present. Causing the test to fail and it to return a slow test - // warning. - err = client.EnsureTKGCompatibilityFile(false) - Expect(err).ToNot(HaveOccurred()) - - // capture modified time of final compatibility file - f2, err := os.Stat(compatibilityConfigFile) - Expect(err).ToNot(HaveOccurred()) - f2ModTime := f2.ModTime() - - // true when the modified times are the same - modTimesAreSame := f1ModTime.Equal(f2ModTime) - Expect(modTimesAreSame).To(Equal(true)) - }) - }) -}) - -func getNodeIndex(node []*yaml.Node, key string) int { - appIdx := -1 - for i, k := range node { - if i%2 == 0 && k.Value == key { - appIdx = i + 1 - break - } - } - return appIdx -} - -func getValue(filepath, key string) (string, error) { - fileData, err := os.ReadFile(filepath) - if err != nil { - return "", err - } - - tkgConfigNode := yaml.Node{} - err = yaml.Unmarshal(fileData, &tkgConfigNode) - if err != nil { - return "", err - } - - indexKey := getNodeIndex(tkgConfigNode.Content[0].Content, key) - if indexKey == -1 { - return "", errors.New("cannot find the key") - } - - return tkgConfigNode.Content[0].Content[indexKey].Value, nil -} - -func createTempDirectory(prefix string) { - testingDir, err = os.MkdirTemp("", prefix) - if err != nil { - fmt.Println("Error TempDir: ", err.Error()) - } -} - -func deleteTempDirectory() { - os.Remove(testingDir) -} - -func getConfigFilePath(filename string) string { - filePath := "../fakes/config/" + filename - return setupPrerequsiteForTesting(filePath, testingDir, defaultBomFile) -} - -func writeYaml(path string, tkgConfigNode *yaml.Node) { - out, err := yaml.Marshal(tkgConfigNode) - if err != nil { - fmt.Println("Error marshaling tkg config to yaml", err.Error()) - } - err = os.WriteFile(path, out, constants.ConfigFilePermissions) - if err != nil { - fmt.Println("Error WriteFile", err.Error()) - } -} - -func loadTKGNode(path string) *yaml.Node { - tkgConfigNode := yaml.Node{} - fileData, err := os.ReadFile(path) - if err != nil { - fmt.Println("Error ReadFile") - } - err = yaml.Unmarshal(fileData, &tkgConfigNode) - if err != nil { - fmt.Println("Error unmashaling tkg config") - } - - return &tkgConfigNode -} - -func countProviders() (int, error) { - path := filepath.Join(testingDir) - - providerConfigBytes, err := os.ReadFile(filepath.Join(path, constants.LocalProvidersFolderName, constants.LocalProvidersConfigFileName)) - if err != nil { - return 0, err - } - - providersConfig := providers{} - err = yaml.Unmarshal(providerConfigBytes, &providersConfig) - if err != nil { - return 0, err - } - - return len(providersConfig.Providers), nil -} - -var testTKGCompatibilityFileFmt = ` -version: v1 -managementClusterPluginVersions: -- version: %s - supportedTKGBomVersions: - - imagePath: tkg-bom - tag: %s -` - -func setupPrerequsiteForTesting(clusterConfigFile string, testingDir string, defaultBomFile string) string { - bomDir, err := tkgconfigpaths.New(testingDir).GetTKGBoMDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - err = os.MkdirAll(bomDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - testClusterConfigFile := filepath.Join(testingDir, "config.yaml") - os.Remove(testClusterConfigFile) - log.Infof("utils.CopyFile( %s, %s)", clusterConfigFile, testClusterConfigFile) - err = utils.CopyFile(clusterConfigFile, testClusterConfigFile) - Expect(err).ToNot(HaveOccurred()) - - err = utils.CopyFile(defaultBomFile, filepath.Join(bomDir, filepath.Base(defaultBomFile))) - Expect(err).ToNot(HaveOccurred()) - - compatibilityDir, err := tkgconfigpaths.New(testingDir).GetTKGCompatibilityDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(compatibilityDir); os.IsNotExist(err) { - err = os.MkdirAll(compatibilityDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - defaultBomFileTag := utils.GetTKGBoMTagFromFileName(filepath.Base(defaultBomFile)) - testTKGCompatabilityFileContent := fmt.Sprintf(testTKGCompatibilityFileFmt, tkgconfigpaths.TKGManagementClusterPluginVersion, defaultBomFileTag) - - compatibilityConfigFile, err := tkgconfigpaths.New(testingDir).GetTKGCompatibilityConfigPath() - Expect(err).ToNot(HaveOccurred()) - err = os.WriteFile(compatibilityConfigFile, []byte(testTKGCompatabilityFileContent), constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) - - return testClusterConfigFile -} - -type providertest struct{} - -// New returns provider client which implements provider interface -func NewProviderTest() providerinterface.ProviderInterface { - return &providertest{} -} - -func (p *providertest) GetProviderBundle() ([]byte, error) { - return os.ReadFile("../fakes/providers/providers.zip") -} diff --git a/tkg/tkgconfigupdater/update_checker.go b/tkg/tkgconfigupdater/update_checker.go deleted file mode 100644 index d032b5ac17..0000000000 --- a/tkg/tkgconfigupdater/update_checker.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgconfigupdater - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" -) - -// CheckProviderTemplatesNeedUpdate checks if .tkg/providers/config.yaml is up-to-date. -func (c *client) CheckProviderTemplatesNeedUpdate() (bool, error) { - // Do not update provider templates if `SUPPRESS_PROVIDERS_UPDATE` env variable is set - if isSuppressProviderUpdateEnvSet() { - return false, nil - } - - // If local develeopment and providers are embedded then always update providers based - if c.isProviderTemplatesEmbedded() { - return true, nil - } - - providerDir, err := c.tkgConfigPathsClient.GetTKGProvidersDirectory() - if err != nil { - return true, err - } - - // check the version info with BoM file's tag - // if it matches no need to update anything - // if not providers need to be updated - - tkgBomConfig, err := c.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return true, errors.Wrap(err, "error reading TKG BoM configuration") - } - - providerTemplateImage, err := getProviderTemplateImageFromBoM(tkgBomConfig) - if err != nil { - return true, err - } - - imageTag := providerTemplateImage.Tag - if _, err := os.Stat(filepath.Join(providerDir, imageTag)); os.IsNotExist(err) { - return true, nil - } - - return false, nil -} - -// CheckBOMsNeedUpdate checks if bom files are up-to-date. -// returns true if $HOME/.tkg/bom directory exists, not empty and doesn't contain the defaultBoM file -func (c *client) CheckBOMsNeedUpdate() (bool, error) { - var err error - - compatibilityFileExists, err := c.checkTKGCompatibilityFileExists() - if err != nil { - return false, err - } - // tkg-compatibility file contents determines default BOM files, if compatibility file doesn't exists it should trigger BOM file updates - if !compatibilityFileExists { - return true, nil - } - - bomsDir, err := c.tkgConfigPathsClient.GetTKGBoMDirectory() - if err != nil { - return false, err - } - if _, err = os.Stat(bomsDir); os.IsNotExist(err) { - return false, nil - } - - isBOMDirectoryEmpty, err := isDirectoryEmpty(bomsDir) - if err != nil { - return false, errors.Wrap(err, "failed to check BOM directory is empty") - } - - // if directory is empty we don't need update - if isBOMDirectoryEmpty { - return false, nil - } - - // if defaultBOMfile doesn't exist we need to to update BOMs - defaultBOMFile, _ := c.tkgBomClient.GetDefaultBoMFilePath() - if _, err = os.Stat(defaultBOMFile); os.IsNotExist(err) { - return true, nil - } - - defaultTKRVersion, err := c.tkgBomClient.GetDefaultTKRVersion() - if err != nil { - return false, errors.Wrap(err, "failed to get default TKr version") - } - defaultTKRBOMFileName := fmt.Sprintf("tkr-bom-%s.yaml", defaultTKRVersion) - defaultTKRBOMFilePath := filepath.Join(bomsDir, defaultTKRBOMFileName) - if _, err = os.Stat(defaultTKRBOMFilePath); os.IsNotExist(err) { - return true, nil - } - - // for any other error return error - if err != nil { - return false, errors.Wrap(err, "failed to check BOMs need update") - } - return false, nil -} - -func getProviderTemplateImageFromBoM(tkgBomConfig *tkgconfigbom.BOMConfiguration) (*tkgconfigbom.ImageInfo, error) { - if _, exists := tkgBomConfig.Components["tanzu-framework"]; !exists { - return nil, errors.New("unable to find tanzu-framework component in TKG BoM file") - } - - if _, exists := tkgBomConfig.Components["tanzu-framework"][0].Images["providerTemplateImage"]; !exists { - return nil, errors.New("unable to find providerTemplateImage in TKG BoM file") - } - - return tkgBomConfig.Components["tanzu-framework"][0].Images["providerTemplateImage"], nil -} - -func isSuppressProviderUpdateEnvSet() bool { - return os.Getenv(constants.SuppressProvidersUpdate) != "" -} - -// checkTKGCompatibilityFileExists checks if TKG compatibility file exists. -// returns true if /compatibility directory exists and contains the TKG Compatibility file -func (c *client) checkTKGCompatibilityFileExists() (bool, error) { - var err error - compatibilityConfigFile, err := c.tkgConfigPathsClient.GetTKGCompatibilityConfigPath() - if err != nil { - return false, errors.Wrap(err, "unable to get TKG compatibility file path") - } - _, err = os.Stat(compatibilityConfigFile) - if err != nil { - if os.IsNotExist(err) { - return false, nil - } - // for any other error return error - return false, errors.Wrap(err, "failed to check TKG compatibility file exists") - } - return true, nil -} diff --git a/tkg/tkgctl/activate_deactivate_tkr.go b/tkg/tkgctl/activate_deactivate_tkr.go deleted file mode 100644 index 470f6a05b5..0000000000 --- a/tkg/tkgctl/activate_deactivate_tkr.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -// ActivateTanzuKubernetesReleases activates the given TKR -func (t *tkgctl) ActivateTanzuKubernetesReleases(tkrName string) error { //nolint:stylecheck - err := t.tkgClient.ActivateTanzuKubernetesReleases(tkrName) - if err != nil { - return err - } - - return nil -} - -// DeactivateTanzuKubernetesReleases deactivates the given TKr -func (t *tkgctl) DeactivateTanzuKubernetesReleases(tkrName string) error { - err := t.tkgClient.DeactivateTanzuKubernetesReleases(tkrName) - if err != nil { - return err - } - - return nil -} diff --git a/tkg/tkgctl/add_region.go b/tkg/tkgctl/add_region.go deleted file mode 100644 index 0970895843..0000000000 --- a/tkg/tkgctl/add_region.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "path/filepath" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -// AddRegionOptions add region options -type AddRegionOptions struct { - Overwrite bool - UseDirectReference bool -} - -// AddRegion adds region -func (t *tkgctl) AddRegion(options AddRegionOptions) error { - lock, err := utils.GetFileLockWithTimeOut(filepath.Join(t.configDir, constants.LocalTanzuFileLock), utils.DefaultLockTimeout) - if err != nil { - return errors.Wrap(err, "cannot acquire lock for adding management cluster context") - } - - defer func() { - if err := lock.Unlock(); err != nil { - log.Warningf("cannot release lock for adding management cluster context: %v", err) - } - }() - - r, err := t.tkgClient.VerifyRegion(t.kubeconfig) - if err != nil { - return err - } - err = t.tkgClient.AddRegionContext(r, options.Overwrite, options.UseDirectReference) - if err != nil { - return err - } - - if options.Overwrite { - log.Infof("Management cluster context has been added to config file") - } else { - log.Infof("New management cluster context has been added to config file") - } - - return nil -} diff --git a/tkg/tkgctl/api_sig_enforce_test.go b/tkg/tkgctl/api_sig_enforce_test.go deleted file mode 100644 index 4d497b560e..0000000000 --- a/tkg/tkgctl/api_sig_enforce_test.go +++ /dev/null @@ -1,519 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package tkgctl - -import ( - "reflect" - "testing" - - capi "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" -) - -func Test_AddRegion_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "AddRegion", - ParamTypes: []reflect.Type{ - reflect.TypeOf(AddRegionOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_ConfigCluster_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "ConfigCluster", - ParamTypes: []reflect.Type{ - reflect.TypeOf(CreateClusterOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_CreateAWSCloudFormationStack_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "CreateAWSCloudFormationStack", - ParamTypes: []reflect.Type{ - reflect.TypeOf(""), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_CreateCluster_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "CreateCluster", - ParamTypes: []reflect.Type{ - reflect.TypeOf(CreateClusterOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_DeleteCluster_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "DeleteCluster", - ParamTypes: []reflect.Type{ - reflect.TypeOf(DeleteClustersOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_DeleteMachineHealthCheck_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "DeleteMachineHealthCheck", - ParamTypes: []reflect.Type{ - reflect.TypeOf(DeleteMachineHealthCheckOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_DeleteRegion_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "DeleteRegion", - ParamTypes: []reflect.Type{ - reflect.TypeOf(DeleteRegionOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_GetCEIP_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "GetCEIP", - ParamTypes: []reflect.Type{}, - ReturnTypes: []reflect.Type{ - reflect.TypeOf(client.ClusterCeipInfo{}), - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_GetClusters_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "GetClusters", - ParamTypes: []reflect.Type{ - reflect.TypeOf(ListTKGClustersOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf([]client.ClusterInfo{}), - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_DescribeCluster_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "DescribeCluster", - ParamTypes: []reflect.Type{ - reflect.TypeOf(DescribeTKGClustersOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf(DescribeClusterResult{}), - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_DescribeProviders_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "DescribeProviders", - ParamTypes: []reflect.Type{}, - ReturnTypes: []reflect.Type{ - reflect.TypeOf(&clusterctlv1.ProviderList{}), - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_GetCredentials_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "GetCredentials", - ParamTypes: []reflect.Type{ - reflect.TypeOf(GetWorkloadClusterCredentialsOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_GetKubernetesVersions_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "GetKubernetesVersions", - ParamTypes: []reflect.Type{}, - ReturnTypes: []reflect.Type{ - reflect.TypeOf(&client.KubernetesVersionsInfo{}), - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_GetMachineHealthCheck_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "GetMachineHealthCheck", - ParamTypes: []reflect.Type{ - reflect.TypeOf(GetMachineHealthCheckOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf([]client.MachineHealthCheck{}), - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_GetRegions_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "GetRegions", - ParamTypes: []reflect.Type{ - reflect.TypeOf(""), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf([]region.RegionContext{}), - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_Init_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "Init", - ParamTypes: []reflect.Type{ - reflect.TypeOf(InitRegionOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_ScaleCluster_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "ScaleCluster", - ParamTypes: []reflect.Type{ - reflect.TypeOf(ScaleClusterOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_SetCeip_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "SetCeip", - ParamTypes: []reflect.Type{ - reflect.TypeOf(""), - reflect.TypeOf(""), - reflect.TypeOf(""), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_SetMachineHealthCheck_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "SetMachineHealthCheck", - ParamTypes: []reflect.Type{ - reflect.TypeOf(SetMachineHealthCheckOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_GetMachineDeployments_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "GetMachineDeployments", - ParamTypes: []reflect.Type{ - reflect.TypeOf(client.GetMachineDeploymentOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf([]capi.MachineDeployment{}), - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_SetMachineDeployment_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "SetMachineDeployment", - ParamTypes: []reflect.Type{ - reflect.TypeOf(&client.SetMachineDeploymentOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_DeleteMachineDeployment_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "DeleteMachineDeployment", - ParamTypes: []reflect.Type{ - reflect.TypeOf(client.DeleteMachineDeploymentOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_SetRegion_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "SetRegion", - ParamTypes: []reflect.Type{ - reflect.TypeOf(SetRegionOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_UpgradeCluster_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "UpgradeCluster", - ParamTypes: []reflect.Type{ - reflect.TypeOf(UpgradeClusterOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_UpgradeRegion_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "UpgradeRegion", - ParamTypes: []reflect.Type{ - reflect.TypeOf(UpgradeRegionOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_UpdateCredentialsRegion_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "UpdateCredentialsRegion", - ParamTypes: []reflect.Type{ - reflect.TypeOf(UpdateCredentialsRegionOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_UpdateCredentialsCluster_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "UpdateCredentialsCluster", - ParamTypes: []reflect.Type{ - reflect.TypeOf(UpdateCredentialsClusterOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_GetClusterPinnipedInfo_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "GetClusterPinnipedInfo", - ParamTypes: []reflect.Type{ - reflect.TypeOf(GetClusterPinnipedInfoOptions{}), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf(&client.ClusterPinnipedInfo{}), - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_GetTanzuKubernetesReleases_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "GetTanzuKubernetesReleases", - ParamTypes: []reflect.Type{ - reflect.TypeOf(""), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf([]runv1alpha1.TanzuKubernetesRelease{}), - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} -func Test_ActivateTanzuKubernetesReleases_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "ActivateTanzuKubernetesReleases", - ParamTypes: []reflect.Type{ - reflect.TypeOf(""), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -func Test_DeactivateTanzuKubernetesReleases_Signature(t *testing.T) { - tkgClientVal := reflect.ValueOf(&tkgctl{}) - enforce := EnforceMethodParams{ - Target: tkgClientVal, - MethodName: "DeactivateTanzuKubernetesReleases", - ParamTypes: []reflect.Type{ - reflect.TypeOf(""), - }, - ReturnTypes: []reflect.Type{ - reflect.TypeOf((*error)(nil)).Elem(), - }, - } - enforceMethodSignature(&enforce, t) -} - -type EnforceMethodParams struct { - Target reflect.Value - MethodName string - ParamTypes []reflect.Type - ReturnTypes []reflect.Type -} - -func enforceMethodSignature(en *EnforceMethodParams, t *testing.T) { - methodVal := en.Target.MethodByName(en.MethodName) - if methodVal.IsZero() { - t.Fatalf("target value does not contain method %s", en.MethodName) - } - - if numParams := methodVal.Type().NumIn(); numParams != len(en.ParamTypes) { - t.Fatalf("Expected %d parameters on method %s, got %d", len(en.ParamTypes), en.MethodName, numParams) - } - - for i, paramType := range en.ParamTypes { - if !methodVal.Type().In(i).AssignableTo(paramType) { - t.Errorf("param at index %d is not of type %s", i, paramType.String()) - } - } - - if numReturns := methodVal.Type().NumOut(); numReturns != len(en.ReturnTypes) { - t.Fatalf("Expected %d parameters on method %s, got %d", len(en.ReturnTypes), en.MethodName, numReturns) - } - - for i, returnType := range en.ReturnTypes { - if !methodVal.Type().Out(i).AssignableTo(returnType) { - t.Errorf("return value at index %d is not of type %s", i, returnType.String()) - } - } -} diff --git a/tkg/tkgctl/ceip_test.go b/tkg/tkgctl/ceip_test.go deleted file mode 100644 index b348125f9e..0000000000 --- a/tkg/tkgctl/ceip_test.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit tests for ceip", func() { - var tkgClient *fakes.Client - - Context("Set CEIP", func() { - It("Set CEIP participation for prod environment", func() { - kubeConfigPath := getConfigFilePath() - - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - tkgClient: tkgClient, - kubeconfig: kubeConfigPath, - } - - err := tkgctlClient.SetCeip("true", "true", "") - Expect(err).NotTo(HaveOccurred()) - }) - Context("Set CEIP to true on staging environment", func() { - It("Set CEIP to true on staging environment without labels", func() { - kubeConfigPath := getConfigFilePath() - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - kubeconfig: kubeConfigPath, - tkgClient: tkgClient, - } - - err := tkgctlClient.SetCeip("true", "false", "") - Expect(err).NotTo(HaveOccurred()) - }) - It("Set CEIP to true on staging environment with valid labels", func() { - kubeConfigPath := getConfigFilePath() - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - kubeconfig: kubeConfigPath, - tkgClient: tkgClient, - } - - err := tkgctlClient.SetCeip("true", "false", "entitlement-account-number=foo,env-type=production") - Expect(err).NotTo(HaveOccurred()) - }) - It("Invalid labels should return error", func() { - kubeConfigPath := getConfigFilePath() - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - kubeconfig: kubeConfigPath, - tkgClient: tkgClient, - } - - err := tkgctlClient.SetCeip("true", "false", "entitlement-account-number=foo,env-type=prod") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("Invalid error type prod, environment type can be production, development, or test")) - }) - It("Incorrect number of labels should return error", func() { - kubeConfigPath := getConfigFilePath() - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - kubeconfig: kubeConfigPath, - tkgClient: tkgClient, - } - - err := tkgctlClient.SetCeip("true", "false", "entitlement-account-number=foo,env-type=prod,extra-label=bar") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("There are more labels provided than are currently supported. The supported labels are entitlement-account-number,and env-type")) - }) - It("Incorrect entitlement-account-number should return error", func() { - kubeConfigPath := getConfigFilePath() - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - kubeconfig: kubeConfigPath, - tkgClient: tkgClient, - } - - err := tkgctlClient.SetCeip("true", "false", "entitlement-account-number=!foo-bar_Baz,env-type=production") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("entitlement-account-number: !foo-bar_Baz cannot contain special characters")) - }) - It("entitlement-account-number should only contain alphanumeric characters", func() { - kubeConfigPath := getConfigFilePath() - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - kubeconfig: kubeConfigPath, - tkgClient: tkgClient, - } - - err := tkgctlClient.SetCeip("true", "false", "entitlement-account-number=Foo123baR,env-type=production") - Expect(err).ToNot(HaveOccurred()) - }) - }) - }) - - Context("get ceip", func() { - It("is able to get the ceip", func() { - kubeConfigPath := getConfigFilePath() - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - kubeconfig: kubeConfigPath, - tkgClient: tkgClient, - } - tkgClient.GetCEIPParticipationReturns(client.ClusterCeipInfo{}, nil) - _, err := tkgctlClient.GetCEIP() - Expect(err).ToNot(HaveOccurred()) - }) - It("is not able to get the ceip", func() { - kubeConfigPath := getConfigFilePath() - tkgClient = &fakes.Client{} - tkgClient.GetCEIPParticipationReturns(client.ClusterCeipInfo{}, errors.New("failed to get ceip status")) - tkgctlClient := &tkgctl{ - kubeconfig: kubeConfigPath, - tkgClient: tkgClient, - } - - _, err := tkgctlClient.GetCEIP() - Expect(err).To(HaveOccurred()) - }) - }) -}) diff --git a/tkg/tkgctl/client.go b/tkg/tkgctl/client.go deleted file mode 100644 index 3de6daf525..0000000000 --- a/tkg/tkgctl/client.go +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "path/filepath" - "time" - - "github.com/pkg/errors" - clusterctllogger "sigs.k8s.io/cluster-api/cmd/clusterctl/log" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clientcreator" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/providerinterface" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigproviders" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigupdater" - providergetterclient "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -type tkgctl struct { - kubeconfig string - kubecontext string - configDir string - appConfig types.AppConfig - tkgClient client.Client - tkgConfigProvidersClient tkgconfigproviders.Client - tkgBomClient tkgconfigbom.Client - tkgConfigUpdaterClient tkgconfigupdater.Client - tkgConfigPathsClient tkgconfigpaths.Client - providerGetter providerinterface.ProviderInterface - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - featureGateHelper FeatureGateHelper -} - -// LoggingOptions options to configure logging with tkgctl client -type LoggingOptions struct { - // File log file name where you want logs to be written - File string - // Quietly if set logs will not be written to stdout/stderr - Quietly bool - // Verbosity number for the log level verbosity - Verbosity int32 - // LogChannel if channel is set, writer will forward log messages to this log channel - // The result of this will be in the format of 'LogData' struct mentioned in `pkg/log/type.go` - LogChannel chan<- []byte -} - -// Options options to create tkgctl client -type Options struct { - // Management cluster kubeconfig - KubeConfig string - // Management cluster kubecontext - KubeContext string - // ConfigDir specifies the directory where tkg will store metadata - ConfigDir string - // LoggingOptions options to configure logging with tkgctl client - LogOptions LoggingOptions - // ProviderGetter provide provider getter interface if you want to use custom providers with tkg - // if not set, default providers bundled with tkg library will be used - ProviderGetter providerinterface.ProviderInterface - // CustomizerOptions allows consumers to provider customizers for underlying client definitions - CustomizerOptions types.CustomizerOptions - // SettingsFile should only be provided if user want to override default TKG settings file path - // by default `ConfigDir/config.yaml` file will be used to store tkg settings - SettingsFile string - // ForceUpdateTKGCompatibilityImage should only be provided if user want to explicitly force update - // TKG compatibility image which would also update the tkg-bom and tkr-bom files - ForceUpdateTKGCompatibilityImage bool -} - -// New creates new tkgctl client -func New(options Options) (TKGClient, error) { //nolint:gocritic - var err error - - // configure log options for tkg library - configureLogging(options.LogOptions) - - if options.ConfigDir == "" { - return nil, errors.New("config directory cannot be empty. Please provide config directory when creating tkgctl client") - } - - if options.ProviderGetter == nil { - options.ProviderGetter = getDefaultProviderGetter() - } - - if options.CustomizerOptions.RegionManagerFactory == nil { - options.CustomizerOptions = types.CustomizerOptions{ - RegionManagerFactory: region.NewFactory(), - } - } - appConfig := types.AppConfig{ - TKGConfigDir: options.ConfigDir, - ProviderGetter: options.ProviderGetter, - CustomizerOptions: options.CustomizerOptions, - TKGSettingsFile: options.SettingsFile, - } - - err = ensureTKGConfigFile(options.ConfigDir, options.ProviderGetter) - if err != nil { - return nil, err - } - - allClients, err := clientcreator.CreateAllClients(appConfig, nil) - if err != nil { - return nil, err - } - - var clusterKubeConfig *types.ClusterKubeConfig - if options.KubeConfig != "" { - clusterKubeConfig = &types.ClusterKubeConfig{ - File: options.KubeConfig, - Context: options.KubeContext, - } - } - - tkgClient, err := client.New(client.Options{ - ClusterCtlClient: allClients.ClusterCtlClient, - ReaderWriterConfigClient: allClients.ConfigClient, - RegionManager: allClients.RegionManager, - TKGConfigDir: options.ConfigDir, - Timeout: constants.DefaultOperationTimeout, - FeaturesClient: allClients.FeaturesClient, - TKGConfigProvidersClient: allClients.TKGConfigProvidersClient, - TKGBomClient: allClients.TKGBomClient, - TKGConfigUpdater: allClients.TKGConfigUpdaterClient, - TKGPathsClient: allClients.TKGConfigPathsClient, - ClusterKubeConfig: clusterKubeConfig, - ClusterClientFactory: clusterclient.NewClusterClientFactory(), - VcClientFactory: vc.NewVcClientFactory(), - FeatureFlagClient: allClients.FeatureFlagClient, - }) - if err != nil { - return nil, err - } - - // ensure BoM and Providers prerequisite files are extracted if missing - err = ensureBoMandProvidersPrerequisite(options.ConfigDir, allClients.TKGConfigUpdaterClient, options.ForceUpdateTKGCompatibilityImage) - if err != nil { - return nil, errors.Wrap(err, "unable to ensure prerequisites") - } - tkgConfigFile, err := allClients.TKGConfigPathsClient.GetTKGConfigPath() - if err != nil { - return nil, errors.Wrap(err, "unable to get TKG config file path") - } - // re-initialize the TKG config reader writer after the providers are updated - // as the TKG config file would be updated too. - err = tkgClient.TKGConfigReaderWriter().Init(tkgConfigFile) - if err != nil { - return nil, errors.Wrap(err, "unable to initialize the TKG config reader writer") - } - - // Set default BOM name to the config variables to use during template generation - defaultBoMFileName, err := allClients.TKGBomClient.GetDefaultBoMFileName() - if err != nil { - return nil, errors.Wrap(err, "unable to get default BOM file name") - } - allClients.ConfigClient.TKGConfigReaderWriter().Set(constants.ConfigVariableDefaultBomFile, defaultBoMFileName) - clusterClientOptions := clusterclient.Options{GetClientInterval: 2 * time.Second, GetClientTimeout: 5 * time.Second} - return &tkgctl{ - configDir: options.ConfigDir, - kubeconfig: options.KubeConfig, - kubecontext: options.KubeContext, - appConfig: appConfig, - tkgBomClient: allClients.TKGBomClient, - tkgConfigUpdaterClient: allClients.TKGConfigUpdaterClient, - tkgConfigProvidersClient: allClients.TKGConfigProvidersClient, - tkgConfigPathsClient: allClients.TKGConfigPathsClient, - tkgClient: tkgClient, - providerGetter: options.ProviderGetter, - tkgConfigReaderWriter: allClients.ConfigClient.TKGConfigReaderWriter(), - featureGateHelper: NewFeatureGateHelper(&clusterClientOptions, options.KubeContext, options.KubeConfig), - }, nil -} - -func ensureTKGConfigFile(configDir string, providerGetter providerinterface.ProviderInterface) error { - var err error - - lock, err := utils.GetFileLockWithTimeOut(filepath.Join(configDir, constants.LocalTanzuFileLock), utils.DefaultLockTimeout) - if err != nil { - return errors.Wrap(err, "cannot acquire lock for ensuring local files") - } - - defer func() { - if err := lock.Unlock(); err != nil { - log.Warningf("cannot release lock for ensuring local files, reason: %v", err) - } - }() - - _, err = tkgconfigupdater.New(configDir, providerGetter, nil).EnsureTKGConfigFile() - return err -} - -func ensureBoMandProvidersPrerequisite(configDir string, tkgConfigUpdaterClient tkgconfigupdater.Client, forceUpdateBoMFiles bool) error { - var err error - - lock, err := utils.GetFileLockWithTimeOut(filepath.Join(configDir, constants.LocalTanzuFileLock), utils.DefaultLockTimeout) - if err != nil { - return errors.Wrap(err, "cannot acquire lock for ensuring local files") - } - - defer func() { - if err := lock.Unlock(); err != nil { - log.Warningf("cannot release lock for ensuring local files, reason: %v", err) - } - }() - // ensure BOM files are extracted if missing - err = tkgConfigUpdaterClient.EnsureBOMFiles(forceUpdateBoMFiles) - if err != nil { - return errors.Wrap(err, "unable to ensure tkg BOM file") - } - // ensure that `images` configuration gets updated correctly in tkg settings file - err = tkgConfigUpdaterClient.EnsureConfigImages() - if err != nil { - return err - } - - // ensure that providers templates are extracted and placed under ConfigDir/providers - err = tkgConfigUpdaterClient.EnsureProviderTemplates() - if err != nil { - return err - } - - return nil -} - -func configureLogging(logOptions LoggingOptions) { - // Set logfile to the tkg logger - if logOptions.File != "" { - log.SetFile(logOptions.File) - } - if logOptions.LogChannel != nil { - log.SetChannel(logOptions.LogChannel) - } - log.QuietMode(logOptions.Quietly) - log.SetVerbosity(logOptions.Verbosity) - - clusterctllogger.SetLogger(log.GetLogr()) -} - -func getDefaultProviderGetter() providerinterface.ProviderInterface { - return providergetterclient.New() -} - -// restoreAfterSettingTimeout Sets the timeout value to tkgClient and returns a function -// to restore it back to defaultOperationTimeout value. This function should most likely be -// used with defer call which sets the config timeout and resets it back to default value -// after the operation is complete. -// This is done because we want to be consistent with the timeout value we use when single -// instance of tkgctl client is used to invoke multiple functions. -func (t *tkgctl) restoreAfterSettingTimeout(currentTimeout time.Duration) func() { - t.tkgClient.ConfigureTimeout(currentTimeout) - return func() { - t.tkgClient.ConfigureTimeout(constants.DefaultOperationTimeout) - } -} - -func (t *tkgctl) TKGConfigReaderWriter() tkgconfigreaderwriter.TKGConfigReaderWriter { - return t.tkgConfigReaderWriter -} - -// FeatureGateHelper returns feature gate helper to query feature gate -func (t *tkgctl) FeatureGateHelper() FeatureGateHelper { - return t.featureGateHelper -} - -func ensureConfigImages(configDir string, tkgConfigUpdater tkgconfigupdater.Client) error { - var err error - - lock, err := utils.GetFileLockWithTimeOut(filepath.Join(configDir, constants.LocalTanzuFileLock), utils.DefaultLockTimeout) - if err != nil { - return errors.Wrap(err, "cannot acquire lock for ensuring local files") - } - - defer func() { - if err := lock.Unlock(); err != nil { - log.Warningf("cannot release lock for ensuring local files, reason: %v", err) - } - }() - - return tkgConfigUpdater.EnsureConfigImages() -} diff --git a/tkg/tkgctl/client/client.go b/tkg/tkgctl/client/client.go deleted file mode 100644 index a14585ad51..0000000000 --- a/tkg/tkgctl/client/client.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package client provides access to the providers template data -// Copied over from github.com/vmware-tanzu/tanzu-framework/providers/client -package client - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/providerinterface" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgctl/client/manifest" -) - -type provider struct { -} - -// New returns provider client which implements provider interface -func New() providerinterface.ProviderInterface { - return &provider{} -} - -func (p *provider) GetProviderBundle() ([]byte, error) { - return manifest.ProviderZipBundle, nil -} diff --git a/tkg/tkgctl/client/manifest/providers_embeded.go b/tkg/tkgctl/client/manifest/providers_embeded.go deleted file mode 100644 index cea7becb16..0000000000 --- a/tkg/tkgctl/client/manifest/providers_embeded.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//go:build embedproviders -// +build embedproviders - -// Package manifest... -package manifest - -import _ "embed" - -//go:embed providers.zip -var ProviderZipBundle []byte diff --git a/tkg/tkgctl/client/manifest/providers_skipped.go b/tkg/tkgctl/client/manifest/providers_skipped.go deleted file mode 100644 index 9ca45d8949..0000000000 --- a/tkg/tkgctl/client/manifest/providers_skipped.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//go:build !embedproviders -// +build !embedproviders - -// Package manifest ... -package manifest - -// ProviderZipBundle variable defined when embedproviders tag is not passed during build -// Meaning provider will be downloaded based on TKG BoM file -var ProviderZipBundle []byte diff --git a/tkg/tkgctl/client_test.go b/tkg/tkgctl/client_test.go deleted file mode 100644 index 626ba45258..0000000000 --- a/tkg/tkgctl/client_test.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "os" - "sync" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - fakeproviders "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/providers" - "github.com/vmware-tanzu/tanzu-framework/tkg/providerinterface" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigupdater" -) - -type configProvider struct { - Name string `json:"name,omitempty"` - URL string `json:"url,omitempty"` - Type string `json:"type,omitempty"` -} - -var _ = Describe("ensureBoMandProvidersPrerequisite", func() { - var ( - err error - providerGetter providerinterface.ProviderInterface - tkgConfigUpdaterClient tkgconfigupdater.Client - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - ) - - BeforeEach(func() { - testingDir, err = os.MkdirTemp("", "test") - err = os.MkdirAll(testingDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - prepareConfiDir(testingDir) - providerGetter = fakeproviders.FakeProviderGetter() - tkgConfigReaderWriter, err = tkgconfigreaderwriter.NewReaderWriterFromConfigFile("../fakes/config/config.yaml", "../fakes/config/config.yaml") - Expect(err).ToNot(HaveOccurred()) - tkgConfigUpdaterClient = tkgconfigupdater.New(testingDir, providerGetter, tkgConfigReaderWriter) - }) - - Context("When two goroutines try to modify the file under configDir", func() { - It("should not return errors", func() { - errs := make(chan error, 2) - defer close(errs) - var wg sync.WaitGroup - wg.Add(2) - go func() { - defer wg.Done() - err := ensureBoMandProvidersPrerequisite(testingDir, tkgConfigUpdaterClient, true) - errs <- err - }() - - go func() { - defer wg.Done() - err := ensureBoMandProvidersPrerequisite(testingDir, tkgConfigUpdaterClient, true) - errs <- err - }() - wg.Wait() - var err1, err2 error - err1 = <-errs - err2 = <-errs - - Expect(err1).ToNot(HaveOccurred()) - Expect(err2).ToNot(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Unit test for New", func() { - var ( - err error - options Options - configDir string - tkgClient TKGClient - ) - JustBeforeEach(func() { - configDir, _ = os.MkdirTemp("", "cluster_client_test") - prepareConfiDir(configDir) - options = Options{ - ConfigDir: configDir, - ProviderGetter: fakeproviders.FakeProviderGetter(), - } - tkgClient, err = New(options) - }) - - Context("Create tkgctl client with all clients", func() { - It("should create the tkg client", func() { - Expect(err).ToNot(HaveOccurred()) - }) - It("should initialize the tkgConfigReaderWriter with providers", func() { - Expect(err).ToNot(HaveOccurred()) - tkgctl, ok := tkgClient.(*tkgctl) - Expect(ok).To(BeTrue()) - Expect(tkgctl.configDir).To(Equal(configDir)) - var userDefinedProviders []configProvider - err = tkgctl.tkgConfigReaderWriter.UnmarshalKey("providers", &userDefinedProviders) - Expect(err).To(BeNil()) - Expect(len(userDefinedProviders)).To(Equal(8)) - Expect(userDefinedProviders[0].Name).To(Equal("cluster-api")) - Expect(userDefinedProviders[0].Type).To(Equal("CoreProvider")) - Expect(userDefinedProviders[0].URL).To(ContainSubstring("providers/cluster-api/v1.0.0/core-components.yaml")) - - }) - }) - - AfterEach(func() { - os.Remove(configDir) - }) -}) diff --git a/tkg/tkgctl/compatibility.go b/tkg/tkgctl/compatibility.go deleted file mode 100644 index b35d697fe5..0000000000 --- a/tkg/tkgctl/compatibility.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" -) - -const ( - // DefaultTCEBomRepo is OCI repository containing the BOM for TCE - DefaultTCEBomRepo = "projects.registry.vmware.com/tce" - // DefaultCompatibilityPath the path (project) of the compatibility file - DefaultCompatibilityPath = "tkg-compatibility" -) - -// SetCompatibilityFileBasedOnEdition changes the compatibility file for the edition. -// -//nolint:staticcheck -func SetCompatibilityFileBasedOnEdition() error { - // Acquire tanzu config lock - config.AcquireTanzuConfigLock() - defer config.ReleaseTanzuConfigLock() - - clientConfig, err := config.GetClientConfigNoLock() - if err != nil { - return err - } - - if clientConfig.ClientOptions == nil || clientConfig.ClientOptions.CLI == nil { - return nil - } - - switch clientConfig.ClientOptions.CLI.Edition { - case configapi.EditionCommunity: - clientConfig.ClientOptions.CLI.BOMRepo = DefaultTCEBomRepo - clientConfig.ClientOptions.CLI.CompatibilityFilePath = DefaultCompatibilityPath - case configapi.EditionStandard: - clientConfig.ClientOptions.CLI.BOMRepo = tkgconfigpaths.TKGDefaultImageRepo - clientConfig.ClientOptions.CLI.CompatibilityFilePath = tkgconfigpaths.TKGDefaultCompatibilityImagePath - } - return config.StoreClientConfig(clientConfig) -} diff --git a/tkg/tkgctl/config_cluster.go b/tkg/tkgctl/config_cluster.go deleted file mode 100644 index 2f9b53b42d..0000000000 --- a/tkg/tkgctl/config_cluster.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "os" - "strings" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" -) - -// ConfigCluster prints cluster template to stdout -// -//nolint:gocritic -func (t *tkgctl) ConfigCluster(configClusterOption CreateClusterOptions) error { - var err error - - configClusterOption.ClusterConfigFile, err = t.ensureClusterConfigFile(configClusterOption.ClusterConfigFile) - if err != nil { - return err - } - - // configures missing create cluster options from config file variables - err = t.configureCreateClusterOptionsFromConfigFile(&configClusterOption) - if err != nil { - return err - } - - isInputFileClusterClassBased := false - // TODO (chandrareddyp) need to support Cluster.YAML file with Cluster Object for the dry-run use case, then based on input file type, pass the isInputFileClusterClassBased flag here (https://github.com/vmware-tanzu/tanzu-framework/issues/2516) - options, err := t.getCreateClusterOptions(configClusterOption.ClusterName, &configClusterOption, isInputFileClusterClassBased) - if err != nil { - return err - } - - isPacific, err := t.tkgClient.IsPacificManagementCluster() - if err != nil && strings.Contains(configClusterOption.InfrastructureProvider, client.PacificProviderName) { - isPacific = true - } - - if isPacific { - // For TKGS kubernetesVersion will be same as TkrVersion - options.KubernetesVersion = configClusterOption.TkrVersion - options.TKRVersion = configClusterOption.TkrVersion - } else { - options.TKRVersion, options.KubernetesVersion, err = t.getAndDownloadTkrIfNeeded(configClusterOption.TkrVersion) - if err != nil { - return errors.Wrapf(err, "unable to determine the TKr version and kubernetes version based on '%v'", configClusterOption.TkrVersion) - } - } - - // Don't skip validation while creating cluster template - options.SkipValidation = false - - yaml, err := t.tkgClient.GetClusterConfiguration(&options) - if err != nil { - return err - } - yaml = append(yaml, '\n') - - if _, err := os.Stdout.Write(yaml); err != nil { - return errors.Wrap(err, "failed to write yaml to Stdout") - } - - return nil -} diff --git a/tkg/tkgctl/config_cluster_test.go b/tkg/tkgctl/config_cluster_test.go deleted file mode 100644 index ed23bbee22..0000000000 --- a/tkg/tkgctl/config_cluster_test.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "fmt" - "os" - "path/filepath" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakeproviders "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/providers" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -const ( - defaultTKGBomFileForTesting = "../fakes/config/bom/tkg-bom-v1.3.1.yaml" - defaultTKRBomFileForTesting = "../fakes/config/bom/tkr-bom-v1.18.0+vmware.1-tkg.2.yaml" -) - -var _ = Describe("Unit tests for config cluster", func() { - var ( - ctl *tkgctl - tkgClient = &fakes.Client{} - updaterClient = &fakes.TKGConfigUpdaterClient{} - bomClient = &fakes.TKGConfigBomClient{} - configDir string - err error - ccOps CreateClusterOptions - ) - - JustBeforeEach(func() { - configDir, err = os.MkdirTemp("", "test") - err = os.MkdirAll(testingDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - prepareConfiDir(configDir) - options := Options{ - ConfigDir: configDir, - ProviderGetter: fakeproviders.FakeProviderGetter(), - } - c, createErr := New(options) - Expect(createErr).ToNot(HaveOccurred()) - ctl, _ = c.(*tkgctl) - ctl.tkgClient = tkgClient - ctl.tkgBomClient = bomClient - ctl.tkgConfigUpdaterClient = updaterClient - - err = ctl.ConfigCluster(ccOps) - }) - Context("when cluster name is not provided", func() { - BeforeEach(func() { - ccOps = CreateClusterOptions{} - updaterClient.DecodeCredentialsInViperReturns(nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("When plan is not provided", func() { - BeforeEach(func() { - ccOps = CreateClusterOptions{ - ClusterName: "my-cluster", - } - updaterClient.DecodeCredentialsInViperReturns(nil) - }) - - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When creating a Pacific workload cluster", func() { - BeforeEach(func() { - ccOps = CreateClusterOptions{ - ClusterName: "my-cluster", - Plan: "dev", - InfrastructureProvider: "tkg-service-vsphere", - TkrVersion: "1.19.0+vmware.1.tkg.1", - } - updaterClient.DecodeCredentialsInViperReturns(nil) - tkgClient.IsPacificManagementClusterReturns(true, errors.New("unknown")) - tkgClient.GetClusterConfigurationReturns(nil, nil) - }) - - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("When creating a tkgm workload cluster", func() { - BeforeEach(func() { - ccOps = CreateClusterOptions{ - ClusterName: "my-cluster", - Plan: "dev", - TkrVersion: "1.19.0+vmware.1.tkg.1", - } - updaterClient.DecodeCredentialsInViperReturns(nil) - tkgClient.IsPacificManagementClusterReturns(false, nil) - bomClient.GetBOMConfigurationFromTkrVersionReturns(nil, nil) - bomClient.GetK8sVersionFromTkrVersionReturns("1.19.0", nil) - tkgClient.GetClusterConfigurationReturns(nil, nil) - }) - - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - AfterEach(func() { - os.Remove(configDir) - }) -}) - -var testTKGCompatibilityFileFmt = ` -version: v1 -managementClusterPluginVersions: -- version: %s - supportedTKGBomVersions: - - imagePath: tkg-bom - tag: %s -` - -func prepareConfiDir(configDir string) { - bomDir, err := tkgconfigpaths.New(configDir).GetTKGBoMDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(bomDir); os.IsNotExist(err) { - err = os.MkdirAll(bomDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - err = utils.CopyFile(defaultTKGBomFileForTesting, filepath.Join(bomDir, filepath.Base(defaultTKGBomFileForTesting))) - Expect(err).ToNot(HaveOccurred()) - - err = utils.CopyFile(defaultTKRBomFileForTesting, filepath.Join(bomDir, filepath.Base(defaultTKRBomFileForTesting))) - Expect(err).ToNot(HaveOccurred()) - - compatibilityDir, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityDirectory() - Expect(err).ToNot(HaveOccurred()) - if _, err := os.Stat(compatibilityDir); os.IsNotExist(err) { - err = os.MkdirAll(compatibilityDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - } - - defaultBomFileTag := utils.GetTKGBoMTagFromFileName(filepath.Base(defaultTKGBomFileForTesting)) - testTKGCompatabilityFileContent := fmt.Sprintf(testTKGCompatibilityFileFmt, tkgconfigpaths.TKGManagementClusterPluginVersion, defaultBomFileTag) - - compatibilityConfigFile, err := tkgconfigpaths.New(configDir).GetTKGCompatibilityConfigPath() - Expect(err).ToNot(HaveOccurred()) - err = os.WriteFile(compatibilityConfigFile, []byte(testTKGCompatabilityFileContent), constants.ConfigFilePermissions) - Expect(err).ToNot(HaveOccurred()) -} diff --git a/tkg/tkgctl/config_permission_aws.go b/tkg/tkgctl/config_permission_aws.go deleted file mode 100644 index 5128296325..0000000000 --- a/tkg/tkgctl/config_permission_aws.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -// CreateAWSCloudFormationStack create aws cloud formation stack -func (t *tkgctl) CreateAWSCloudFormationStack(clusterConfigFile string) error { - if _, err := t.ensureClusterConfigFile(clusterConfigFile); err != nil { - return err - } - return t.tkgClient.CreateAWSCloudFormationStack() -} - -// CreateAWSCloudFormationStack create aws cloud formation stack -func (t *tkgctl) GenerateAWSCloudFormationTemplate(clusterConfigFile string) (string, error) { - if _, err := t.ensureClusterConfigFile(clusterConfigFile); err != nil { - return "", err - } - return t.tkgClient.GenerateAWSCloudFormationTemplate() -} diff --git a/tkg/tkgctl/config_permission_aws_test.go b/tkg/tkgctl/config_permission_aws_test.go deleted file mode 100644 index fdbd1ce6b1..0000000000 --- a/tkg/tkgctl/config_permission_aws_test.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakeproviders "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/providers" -) - -var _ = Describe("Unit tests for add region", func() { - var ( - ctl *tkgctl - tkgClient = &fakes.Client{} - updaterClient = &fakes.TKGConfigUpdaterClient{} - err error - configDir string - ) - - JustBeforeEach(func() { - configDir, err = os.MkdirTemp("", "test") - err = os.MkdirAll(testingDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - prepareConfiDir(configDir) - options := Options{ - ConfigDir: configDir, - ProviderGetter: fakeproviders.FakeProviderGetter(), - } - c, createErr := New(options) - Expect(createErr).ToNot(HaveOccurred()) - ctl, _ = c.(*tkgctl) - ctl.tkgClient = tkgClient - ctl.tkgConfigUpdaterClient = updaterClient - - err = ctl.CreateAWSCloudFormationStack("") - }) - Context("when there is error on ensure configuration file", func() { - BeforeEach(func() { - updaterClient.DecodeCredentialsInViperReturns(errors.New("failed to decode")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("when there is error on creating cloudformation stack ", func() { - BeforeEach(func() { - updaterClient.DecodeCredentialsInViperReturns(nil) - tkgClient.CreateAWSCloudFormationStackReturns(errors.New("failed to create stack")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("when the stack can be created successfully", func() { - BeforeEach(func() { - updaterClient.DecodeCredentialsInViperReturns(nil) - tkgClient.CreateAWSCloudFormationStackReturns(nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - AfterEach(func() { - os.Remove(configDir) - }) -}) diff --git a/tkg/tkgctl/constants.go b/tkg/tkgctl/constants.go deleted file mode 100644 index 07e24eabdd..0000000000 --- a/tkg/tkgctl/constants.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -// Warningvsphere7WithoutPacific indicates that a vSphere7 environment has been detected without vSphere with Tanzu -var Warningvsphere7WithoutPacific = ` -vSphere 7.0 Environment Detected. - -You have connected to a vSphere 7.0 environment which does not have vSphere with Tanzu enabled. vSphere with Tanzu includes -an integrated Tanzu Kubernetes Grid Service which turns a vSphere cluster into a platform for running Kubernetes workloads in dedicated -resource pools. Configuring Tanzu Kubernetes Grid Service is done through vSphere HTML5 client. - -Tanzu Kubernetes Grid Service is the preferred way to consume Tanzu Kubernetes Grid in vSphere 7.0 environments. Alternatively you may -deploy a non-integrated Tanzu Kubernetes Grid instance on vSphere 7.0.` - -// Warningvsphere7WithPacific indicates that a vSphere7 environment has been detected with vSphere with Tanzu -var Warningvsphere7WithPacific = ` -vSphere 7.0 with Tanzu Detected. - -You have connected to a vSphere 7.0 with Tanzu environment that includes an integrated Tanzu Kubernetes Grid Service which -turns a vSphere cluster into a platform for running Kubernetes workloads in dedicated resource pools. Configuring Tanzu -Kubernetes Grid Service is done through the vSphere HTML5 Client. - -Tanzu Kubernetes Grid Service is the preferred way to consume Tanzu Kubernetes Grid in vSphere 7.0 environments. Alternatively you may -deploy a non-integrated Tanzu Kubernetes Grid instance on vSphere 7.0.` diff --git a/tkg/tkgctl/create_cluster.go b/tkg/tkgctl/create_cluster.go deleted file mode 100644 index ab9c20135b..0000000000 --- a/tkg/tkgctl/create_cluster.go +++ /dev/null @@ -1,490 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "context" - "fmt" - "os" - "path/filepath" - "strconv" - "strings" - "time" - - "github.com/go-openapi/swag" - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - clusterctl "sigs.k8s.io/cluster-api/cmd/clusterctl/client" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfighelper" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/yamlprocessor" -) - -// CreateClusterOptions options to create the cluster -type CreateClusterOptions struct { - IsWindowsWorkloadCluster bool - GenerateOnly bool - SkipPrompt bool - - ClusterConfigFile string - ClusterName string - Plan string - InfrastructureProvider string - Namespace string - TkrVersion string - Size string - ControlPlaneSize string - WorkerSize string - CniType string - EnableClusterOptions string - VsphereControlPlaneEndpoint string - ControlPlaneMachineCount int - WorkerMachineCount int - Timeout time.Duration - // Tanzu edition (either tce or tkg) - Edition string -} - -// CreateCluster create tkg cluster -// -//nolint:gocritic,gocyclo,revive -func (t *tkgctl) CreateCluster(cc CreateClusterOptions) error { - isTKGSCluster, err := t.tkgClient.IsPacificManagementCluster() - if err != nil { - return err - } - isInputFileClusterClassBased, err := t.processWorkloadClusterInputFile(&cc, isTKGSCluster) - if err != nil { - return err - } - if cc.GenerateOnly && isInputFileClusterClassBased { - if config, err := os.ReadFile(cc.ClusterConfigFile); err == nil { - _, err1 := os.Stdout.Write(config) - return err1 - } else { - return err - } - } - if cc.GenerateOnly { - return t.ConfigCluster(cc) - } - - cc.ClusterConfigFile, err = t.ensureClusterConfigFile(cc.ClusterConfigFile) - if err != nil { - return err - } - - // configures missing create cluster options from config file variables - if err := t.configureCreateClusterOptionsFromConfigFile(&cc); err != nil { - return err - } - - isClusterExists := false - isClusterExists, err = t.IsClusterExists(cc.ClusterName, cc.Namespace) - if err != nil { - return errors.Wrap(err, constants.ErrorMsgClusterListError) - } else if isClusterExists { - return fmt.Errorf(constants.ErrorMsgClusterExistsAlready, cc.ClusterName) - } - - if logPath, err := t.getAuditLogPath(cc.ClusterName); err == nil { - log.SetAuditLog(logPath) - } - - // Always do blocking cluster create - waitForCluster := true - - // create cluster requires minimum 15 minutes timeout - minTimeoutReq := 15 * time.Minute - if cc.Timeout < minTimeoutReq { - log.V(6).Infof("timeout duration of at least 15 minutes is required, using default timeout %v", constants.DefaultLongRunningOperationTimeout) - cc.Timeout = constants.DefaultLongRunningOperationTimeout - } - - defer t.restoreAfterSettingTimeout(cc.Timeout)() - - options, err := t.getCreateClusterOptions(cc.ClusterName, &cc, isInputFileClusterClassBased) - if err != nil { - return err - } - - if isTKGSCluster { - // For TKGS kubernetesVersion will be same as TkrVersion - options.KubernetesVersion = cc.TkrVersion - options.TKRVersion = cc.TkrVersion - err = confirmPacificKubernetesVersion(cc.SkipPrompt, options.KubernetesVersion) - if err != nil { - return errors.Wrap(err, "unable to determine the kubernetes version for the cluster to be created on vSphere with Tanzu") - } - } else { - options.TKRVersion, options.KubernetesVersion, err = t.getAndDownloadTkrIfNeeded(cc.TkrVersion) - if err != nil { - return errors.Wrapf(err, "unable to determine the TKr version and kubernetes version based on '%v'", cc.TkrVersion) - } - } - - attempedClusterCreation, err := t.tkgClient.CreateCluster(&options, waitForCluster) - if err != nil { - return err - } - - // if cluster creation was not attempted return - if !attempedClusterCreation { - return nil - } - - if waitForCluster { - log.Infof("\nWorkload cluster '%s' created\n\n", options.ClusterConfigOptions.ClusterName) - } else { - log.Infof("\nWorkload cluster '%s' is being created\n\n", options.ClusterConfigOptions.ClusterName) - } - - return nil -} - -func (t *tkgctl) processManagementClusterInputFile(ir *InitRegionOptions) (bool, error) { - var clusterobj unstructured.Unstructured - var err error - isInputFileClusterClassBased := false - - if t.tkgClient.IsFeatureActivated(constants.FeatureFlagPackageBasedCC) { - isInputFileClusterClassBased, clusterobj, err = CheckIfInputFileIsClusterClassBased(ir.ClusterConfigFile) - if err != nil { - return isInputFileClusterClassBased, err - } - if isInputFileClusterClassBased { - err = t.processClusterObjectForConfigurationVariables(clusterobj, ir.ClusterConfigFile) - if err != nil { - return isInputFileClusterClassBased, err - } - t.overrideManagementClusterOptionsWithLatestEnvironmentConfigurationValues(ir) - } - } - return isInputFileClusterClassBased, nil -} - -func (t *tkgctl) processWorkloadClusterInputFile(cc *CreateClusterOptions, isTKGSCluster bool) (bool, error) { - isInputFileClusterClassBased, clusterobj, err := CheckIfInputFileIsClusterClassBased(cc.ClusterConfigFile) - if err != nil { - return isInputFileClusterClassBased, err - } - if isInputFileClusterClassBased { - if !isTKGSCluster && t.tkgClient.IsFeatureActivated(constants.FeatureFlagAllowLegacyCluster) { - return isInputFileClusterClassBased, fmt.Errorf(constants.ErrorMsgCClassInputFeatureFlagEnabled, constants.FeatureFlagAllowLegacyCluster) - } - if isTKGSCluster { - t.TKGConfigReaderWriter().Set(constants.ConfigVariableClusterName, clusterobj.GetName()) - t.TKGConfigReaderWriter().Set(constants.ConfigVariableNamespace, clusterobj.GetNamespace()) - } else { - err = t.processClusterObjectForConfigurationVariables(clusterobj, cc.ClusterConfigFile) - if err != nil { - return isInputFileClusterClassBased, err - } - } - t.overrideClusterOptionsWithLatestEnvironmentConfigurationValues(cc) - } - if isTKGSCluster { - err = t.validateTKGSFeatureGateStatus(isInputFileClusterClassBased) - if err != nil { - return isInputFileClusterClassBased, err - } - } - return isInputFileClusterClassBased, nil -} - -// validateTKGSFeatureGateStatus validates the TKGS featuregate status for a specific feature -func (t *tkgctl) validateTKGSFeatureGateStatus(isInputFileClusterClassBased bool) error { - if isInputFileClusterClassBased { - isClusterClassFeatureActivated, err := t.featureGateHelper.FeatureActivatedInNamespace(context.Background(), constants.ClusterClassFeature, constants.TKGSClusterClassNamespace) - if err != nil { - return errors.Wrap(err, fmt.Sprintf(constants.ErrorMsgFeatureGateStatus, constants.ClusterClassFeature, constants.TKGSClusterClassNamespace)) - } - if !isClusterClassFeatureActivated { - return fmt.Errorf(constants.ErrorMsgFeatureGateNotActivated, constants.ClusterClassFeature, constants.TKGSClusterClassNamespace) - } - } else { - isTKCFeatureActivated, err := t.featureGateHelper.FeatureActivatedInNamespace(context.Background(), constants.TKCAPIFeature, constants.TKGSTKCAPINamespace) - if err != nil { - // ignore the error, because the supervisor could be vSphere7 based (which does not support tkc-api featuregate) - return nil - } - if !isTKCFeatureActivated { - return fmt.Errorf(constants.ErrorMsgFeatureGateNotActivated, constants.TKCAPIFeature, constants.TKGSTKCAPINamespace) - } - } - return nil -} - -func (t *tkgctl) getCreateClusterOptions(name string, cc *CreateClusterOptions, isInputFileClusterClassBased bool) (client.CreateClusterOptions, error) { - providerRepositorySource := &clusterctl.ProviderRepositorySourceOptions{ - InfrastructureProvider: cc.InfrastructureProvider, - Flavor: cc.Plan, - } - if !isInputFileClusterClassBased && cc.Plan == "" { - return client.CreateClusterOptions{}, errors.New("required config variable 'CLUSTER_PLAN' not set") - } - - definitionParser := yamlprocessor.InjectDefinitionParser(yamlprocessor.NewYttDefinitionParser(yamlprocessor.InjectTKGDir(t.configDir))) - - configOptions := client.ClusterConfigOptions{ - ClusterName: name, - ProviderRepositorySource: providerRepositorySource, - ControlPlaneMachineCount: swag.Int64(int64(cc.ControlPlaneMachineCount)), - WorkerMachineCount: swag.Int64(int64(cc.WorkerMachineCount)), - TargetNamespace: cc.Namespace, - Kubeconfig: clusterctl.Kubeconfig{Path: t.kubeconfig}, - YamlProcessor: yamlprocessor.NewYttProcessor(definitionParser), - } - - nodeSizeOptions := client.NodeSizeOptions{ - Size: cc.Size, - ControlPlaneSize: cc.ControlPlaneSize, - WorkerSize: cc.WorkerSize, - } - - clusterOptionsEnableList := []string{} - if cc.EnableClusterOptions != "" { - clusterOptionsEnableList = strings.Split(cc.EnableClusterOptions, ",") - } - - return client.CreateClusterOptions{ - ClusterConfigOptions: configOptions, - NodeSizeOptions: nodeSizeOptions, - CniType: cc.CniType, - VsphereControlPlaneEndpoint: cc.VsphereControlPlaneEndpoint, - ClusterOptionsEnableList: clusterOptionsEnableList, - Edition: cc.Edition, - IsWindowsWorkloadCluster: cc.IsWindowsWorkloadCluster, - ClusterConfigFile: cc.ClusterConfigFile, - IsInputFileClusterClassBased: isInputFileClusterClassBased, - }, nil -} - -func confirmPacificKubernetesVersion(shouldSkipPrompt bool, kubernetesVersion string) error { - if !shouldSkipPrompt { - log.Warningf("You are trying to create a cluster with kubernetes version '%s' on vSphere with Tanzu, Please make sure virtual machine image for the same is available in the cluster content library.", kubernetesVersion) - err := askForConfirmation("Do you want to continue?") - if err != nil { - return err - } - } - return nil -} - -func (t *tkgctl) configureCreateClusterOptionsFromConfigFile(cc *CreateClusterOptions) error { // nolint - // set ClusterName from config variable - if cc.ClusterName == "" { - clusterName, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterName) - if err == nil { - cc.ClusterName = clusterName - } else { - return errors.Errorf("cluster name is required, please provide cluster name") - } - } - - // set InfrastructureProvider from config variable - if cc.InfrastructureProvider == "" { - infraProvider, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableInfraProvider) - if err == nil { - cc.InfrastructureProvider = infraProvider - } - } - - // set Size variable from config File - if cc.Size == "" { - size, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableSize) - if err == nil { - cc.Size = size - } - } - - // set ControlPlaneSize variable from config File - if cc.ControlPlaneSize == "" { - controlPlaneSize, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableControlPlaneSize) - if err == nil { - cc.ControlPlaneSize = controlPlaneSize - } - } - - // set WorkerSize variable from config File - if cc.WorkerSize == "" { - workerSize, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableWorkerSize) - if err == nil { - cc.WorkerSize = workerSize - } - } - - // set CniType from config variable - if cc.CniType == "" { - cniType, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableCNI) - if err == nil { - cc.CniType = cniType - } else { - cc.CniType = constants.DefaultCNIType - } - } - - // set IsWindowsWorkloadCluster from config variable - if !cc.IsWindowsWorkloadCluster { - strIWC, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableIsWindowsWorkloadCluster) - // error on reading this parameter is a no-op, since its probably ephemeral and will be replaced w/ multitenant/multiworkload node-pools eventually - if err == nil { - isWindowsWorkloadCluster, err := strconv.ParseBool(strIWC) - if err == nil { - cc.IsWindowsWorkloadCluster = isWindowsWorkloadCluster - } else { - // if no value, set to the default, which should be false since most clusters are linux. - cc.IsWindowsWorkloadCluster = constants.DefaultIsWindowsWorkloadCluster - } - // log this since its generally a less common use case, and windows support is relatively new. - if cc.IsWindowsWorkloadCluster { - log.Infof("\n Creating a windows workload cluster %v\n\n", cc.ClusterName) - } - } - } - - // set Plan from config variable - if cc.Plan == "" { - plan, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterPlan) - if err == nil { - cc.Plan = plan - } - } - - // set vSphereControlPlaneEndpoint from config variable - if cc.VsphereControlPlaneEndpoint == "" { - vSphereControlPlaneEndpoint, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereControlPlaneEndpoint) - if err == nil { - cc.VsphereControlPlaneEndpoint = vSphereControlPlaneEndpoint - } - } - - if cc.ControlPlaneMachineCount == 0 { - cpmc, err := tkgconfighelper.GetIntegerVariableFromConfig(constants.ConfigVariableControlPlaneMachineCount, t.TKGConfigReaderWriter()) - if err == nil { - cc.ControlPlaneMachineCount = cpmc - } else { - cc.ControlPlaneMachineCount = constants.DefaultDevControlPlaneMachineCount - if client.IsProdPlan(cc.Plan) { - cc.ControlPlaneMachineCount = constants.DefaultProdControlPlaneMachineCount - } - } - } - - if cc.ControlPlaneMachineCount%2 == 0 { - return errors.Errorf("The number of control plane machines should be an odd number but provided %v", cc.ControlPlaneMachineCount) - } - - if cc.WorkerMachineCount == 0 { - wmc, err := tkgconfighelper.GetIntegerVariableFromConfig(constants.ConfigVariableWorkerMachineCount, t.TKGConfigReaderWriter()) - if err == nil { - cc.WorkerMachineCount = wmc - } else { - cc.WorkerMachineCount = constants.DefaultDevWorkerMachineCount - if client.IsProdPlan(cc.Plan) { - cc.WorkerMachineCount = constants.DefaultProdWorkerMachineCount - } - } - } - - if cc.Namespace == "" { - namespace, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableNamespace) - if err == nil { - cc.Namespace = namespace - log.V(1).Infof("Using namespace from config: %s", cc.Namespace) - } else { - cc.Namespace = constants.DefaultNamespace - t.TKGConfigReaderWriter().Set(constants.ConfigVariableNamespace, constants.DefaultNamespace) - log.V(1).Infof("Using namespace: %s", cc.Namespace) - } - } - - // set EnableClusterOptions from config variable - if cc.EnableClusterOptions == "" { - enableClusterOptions, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableEnableClusterOptions) - if err == nil { - cc.EnableClusterOptions = enableClusterOptions - } - } - - // set BuildEdition from config variable - if cc.Edition == "" { - edition, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableBuildEdition) - if err == nil { - cc.Edition = edition - } - } - - return nil -} - -func (t *tkgctl) getAndDownloadTkrIfNeeded(tkrVersion string) (string, string, error) { - var k8sVersion string - var err error - var tkrBoMConfig *tkgconfigbom.BOMConfiguration - - if tkrVersion == "" { - tkrBoMConfig, err = t.tkgBomClient.GetDefaultTkrBOMConfiguration() - if err != nil { - return "", "", errors.Wrap(err, "unable to get default TKr BoM configuration") - } - - tkrVersion = tkrBoMConfig.Release.Version - k8sVersion, err = t.tkgBomClient.GetDefaultK8sVersion() - if err != nil { - return "", "", errors.Wrap(err, "unable to get default kubernetes version") - } - return tkrVersion, k8sVersion, nil - } - - // BoM downloading should only be required if user are providing tkrVersion, - // otherwise we should use default config which is always present on user's machine - - // download bom if not present locally for given TKr - // Put a file lock here to prevent several processes from downloading BOM at the same time - lock, err := utils.GetFileLockWithTimeOut(filepath.Join(t.configDir, constants.LocalTanzuFileLock), utils.DefaultLockTimeout) - if err != nil { - return "", "", errors.Wrap(err, "cannot acquire lock for ensuring the TKr BOM file") - } - - defer func() { - if err := lock.Unlock(); err != nil { - log.Warningf("cannot release lock for ensuring TKr BOM file, reason: %v", err) - } - }() - - _, err = t.tkgBomClient.GetBOMConfigurationFromTkrVersion(tkrVersion) - if err != nil { - _, ok := err.(tkgconfigbom.BomNotPresent) - if ok { // bom not present locally - if err := t.tkgClient.DownloadBomFile(utils.GetTkrNameFromTkrVersion(tkrVersion)); err != nil { - return "", "", err - } - } else { - return "", "", err - } - } - - k8sVersion, err = t.tkgBomClient.GetK8sVersionFromTkrVersion(tkrVersion) - if err != nil { - return "", "", err - } - - // Set tkrName and k8sVersion to the tkg config - t.TKGConfigReaderWriter().Set(constants.ConfigVariableKubernetesVersion, k8sVersion) - t.TKGConfigReaderWriter().Set(constants.ConfigVariableTkrName, utils.GetTkrNameFromTkrVersion(tkrVersion)) - - return tkrVersion, k8sVersion, nil -} - -// # val 1 - cannot create single node cluster without feature toggle -// - if feature toggle true -> allow cp to be 1 and wokrer 0 -// - if feature toggle false -> worker cannot be 0 - fail saying min worker count is 1 -// # val 2 - control plane taint must be removed for single node cluster -// - if feature toggle true diff --git a/tkg/tkgctl/create_cluster_test.go b/tkg/tkgctl/create_cluster_test.go deleted file mode 100644 index f1a1a7342e..0000000000 --- a/tkg/tkgctl/create_cluster_test.go +++ /dev/null @@ -1,982 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "fmt" - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigupdater" -) - -const fakeTKRVersion = "1.19.0+vmware.1-tkg.1" -const configFilePath = "../fakes/config/config.yaml" - -const inputFileAws = "../fakes/config/cluster_aws.yaml" -const inputFileAwsIncorrectClass = "../fakes/config/cluster_aws_incorrectClass.yaml" -const inputFileAwsEmptyClass = "../fakes/config/cluster_aws_emptyClass.yaml" -const inputFileMultipleObjectsAws = "../fakes/config/cluster_aws_multipleObjects.yaml" -const inputFileAzure = "../fakes/config/cluster_azure.yaml" -const inputFileVsphere = "../fakes/config/cluster_vsphere.yaml" -const inputFileVsphereInsecure = "../fakes/config/cluster_vsphere_insecure.yaml" -const inputFileTKGSClusterClass = "../fakes/config/cluster_tkgs.yaml" -const inputFileTKGSTKC = "../fakes/config/cluster_tkgs_tkc.yaml" -const inputFileLegacy = "../fakes/config/cluster1_config.yaml" -const errFeatureStatus = "error while checking feature status in featuregate" - -var testingDir string - -var _ = Describe("Unit tests for create cluster", func() { - var ( - options CreateClusterOptions - tkgClient *fakes.Client - fg *fakes.FakeFeatureGateHelper - ) - - BeforeSuite(createTempDirectory) - AfterSuite(deleteTempDirectory) - - Context("Creating clusters for TKGs", func() { - BeforeEach(func() { - options = CreateClusterOptions{ - ClusterName: "test-cluster", - Plan: "dev", - InfrastructureProvider: "", - Namespace: "", - GenerateOnly: false, - TkrVersion: fakeTKRVersion, - SkipPrompt: true, - Edition: "tkg", - } - fg = &fakes.FakeFeatureGateHelper{} - }) - It("Namespace is taken from the context when no -n flag is specified", func() { - kubeConfigPath := getConfigFilePath() - regionContext := region.RegionContext{ - ContextName: "queen-anne-context", - SourceFilePath: kubeConfigPath, - } - - tkgClient = &fakes.Client{} - tkgClient.IsPacificManagementClusterReturns(true, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgConfigReaderWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configFilePath, configFilePath) - Expect(err).NotTo(HaveOccurred()) - tkgctlClient := &tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: kubeConfigPath, - tkgConfigReaderWriter: tkgConfigReaderWriter, - tkgConfigUpdaterClient: tkgconfigupdater.New(testingDir, nil, tkgConfigReaderWriter), - featureGateHelper: fg, - } - fg.FeatureActivatedInNamespaceReturns(true, nil) - - err = tkgctlClient.CreateCluster(options) - Expect(err).NotTo(HaveOccurred()) - }) - It("Namespace is taken from the flag when -n is specified", func() { - kubeConfigPath := getConfigFilePath() - regionContext := region.RegionContext{ - ContextName: "queen-anne-context", - SourceFilePath: kubeConfigPath, - } - tkgClient = &fakes.Client{} - tkgClient.IsPacificManagementClusterReturns(true, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgConfigReaderWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configFilePath, configFilePath) - Expect(err).NotTo(HaveOccurred()) - tkgctlClient := &tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: kubeConfigPath, - tkgConfigReaderWriter: tkgConfigReaderWriter, - tkgConfigUpdaterClient: tkgconfigupdater.New(testingDir, nil, tkgConfigReaderWriter), - featureGateHelper: fg, - } - fg.FeatureActivatedInNamespaceReturns(true, nil) - options.Namespace = "custom-namespace" - err = tkgctlClient.CreateCluster(options) - Expect(err).NotTo(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Unit tests for getAndDownloadTkrIfNeeded", func() { - var ( - tkrVersion string - ctl tkgctl - tkgClient = &fakes.Client{} - bomClient = &fakes.TKGConfigBomClient{} - resultTKRVersion string - resultK8SVersion string - err error - ) - JustBeforeEach(func() { - tkgConfigReaderWriter, err1 := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configFilePath, configFilePath) - Expect(err1).NotTo(HaveOccurred()) - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - tkgConfigReaderWriter: tkgConfigReaderWriter, - tkgConfigUpdaterClient: tkgconfigupdater.New(testingDir, nil, tkgConfigReaderWriter), - tkgBomClient: bomClient, - } - resultTKRVersion, resultK8SVersion, err = ctl.getAndDownloadTkrIfNeeded(tkrVersion) - }) - Context("When tkrVersion is not provided, and default tkr does not exist", func() { - BeforeEach(func() { - tkrVersion = "" - bomClient.GetDefaultTkrBOMConfigurationReturns(nil, errors.New("bom not found")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(resultTKRVersion).To(Equal("")) - Expect(resultK8SVersion).To(Equal("")) - }) - }) - - Context("When tkrVersion is not provided, and cannot get default k8s version", func() { - BeforeEach(func() { - tkrVersion = "" - bomClient.GetDefaultTkrBOMConfigurationReturns(&tkgconfigbom.BOMConfiguration{Release: &tkgconfigbom.ReleaseInfo{Version: fakeTKRVersion}}, nil) - bomClient.GetDefaultK8sVersionReturns("", errors.New("cannot get default k8s version")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(resultTKRVersion).To(Equal("")) - Expect(resultK8SVersion).To(Equal("")) - }) - }) - Context("When tkrVersion is not provided, and default tkr and k8s version can be found", func() { - BeforeEach(func() { - tkrVersion = "" - bomClient.GetDefaultTkrBOMConfigurationReturns(&tkgconfigbom.BOMConfiguration{Release: &tkgconfigbom.ReleaseInfo{Version: fakeTKRVersion}}, nil) - bomClient.GetDefaultK8sVersionReturns("1.19.0", nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(resultTKRVersion).To(Equal(fakeTKRVersion)) - Expect(resultK8SVersion).To(Equal("1.19.0")) - }) - }) - - Context("When tkrVersion is provided and bom presents locally", func() { - BeforeEach(func() { - tkrVersion = fakeTKRVersion - bomClient.GetBOMConfigurationFromTkrVersionReturns(nil, nil) - bomClient.GetK8sVersionFromTkrVersionReturns("1.19.0", nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(resultTKRVersion).To(Equal(fakeTKRVersion)) - Expect(resultK8SVersion).To(Equal("1.19.0")) - }) - }) - - Context("When tkrVersion is provided but local bom is mal-formated", func() { - BeforeEach(func() { - tkrVersion = fakeTKRVersion - bomClient.GetBOMConfigurationFromTkrVersionReturns(nil, nil) - bomClient.GetK8sVersionFromTkrVersionReturns("", errors.New("failed to get k8s version")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When valid tkrVersion is provided, but bom presents locally", func() { - BeforeEach(func() { - tkrVersion = fakeTKRVersion - bomClient.GetBOMConfigurationFromTkrVersionReturns(nil, tkgconfigbom.BomNotPresent{}) - tkgClient.DownloadBomFileReturns(nil) - bomClient.GetK8sVersionFromTkrVersionReturns("1.19.0", nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(resultTKRVersion).To(Equal(fakeTKRVersion)) - Expect(resultK8SVersion).To(Equal("1.19.0")) - }) - }) - Context("When invalid tkrVersion is provided, and bom presents locally", func() { - BeforeEach(func() { - tkrVersion = fakeTKRVersion - bomClient.GetBOMConfigurationFromTkrVersionReturns(nil, tkgconfigbom.BomNotPresent{}) - tkgClient.DownloadBomFileReturns(errors.New("configmap not found")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Unit tests for (AWS) cluster_aws.yaml as input file for 'tanzu cluster create -f cluster_aws.yaml' use case", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - bomClient = &fakes.TKGConfigBomClient{} - options CreateClusterOptions - isTKGSCluster = false - ) - JustBeforeEach(func() { - tkgConfigReaderWriter, _ := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configFilePath, configFilePath) - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - tkgConfigReaderWriter: tkgConfigReaderWriter, - tkgConfigUpdaterClient: tkgconfigupdater.New(testingDir, nil, tkgConfigReaderWriter), - tkgBomClient: bomClient, - } - tkgClient.IsFeatureActivatedReturns(false) - }) - Context("When input Cluster object file is valid, plan is devcc:", func() { - BeforeEach(func() { - options = CreateClusterOptions{ - ClusterName: "test-cluster", - Plan: "devcc", - InfrastructureProvider: "", - Namespace: "", - GenerateOnly: false, - TkrVersion: fakeTKRVersion, - SkipPrompt: true, - Edition: "tkg", - ClusterConfigFile: inputFileAws, - } - }) - It("Environment should be updated with legacy variables and CreateClusterOptions updated with Cluster attribute values:", func() { - // Process input cluster yaml file, this should process input cluster yaml file - // and update the environment with legacy name and values - // most of cluster yaml attributes are mapped to legacy variable for more look this - constants.ClusterToLegacyVariablesMapAws - IsInputFileClusterClassBased, err := ctl.processWorkloadClusterInputFile(&options, isTKGSCluster) - Expect(IsInputFileClusterClassBased).Should(BeTrue()) - Expect(err).To(BeNil()) - - // process input file and get map, which has all attribute's path and its values - inputVariablesMap := getInputAttributesMap(options.ClusterConfigFile) - - // updates lower precedence variables with higher precedence variables values. - // In AWS use case, there were few attributes repeated in cluster yaml file, we need to take always higher precedence values. - updateLowerPrecedenceVariablesWithHigherPrecedenceVariablesValues(inputVariablesMap) - - // validate input Cluster Object yaml file attributes values with corresponding legacy variable values in environment, both should be same, as we have already updated the environment with Cluster Object attribute values. - validateFileInputAttributeValuesWithEnvironmentValues(&ctl, inputVariablesMap, constants.ClusterAttributesToLegacyVariablesMapAws) - - // checking manually for some variables mapping values - mappedVal, _ := ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterName) - Expect("aws-workload-cluster1").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // checking manually for some variables mapping values - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableNamespace) - Expect("default").To(Equal(fmt.Sprintf("%v", mappedVal))) - // Check the values in environment, should be updated from the cluster class input file - Expect("aws-workload-cluster1").To(Equal(options.ClusterName)) - Expect("default").To(Equal(options.Namespace)) - Expect("aws").To(Equal(options.InfrastructureProvider)) - Expect(1).To(Equal(options.ControlPlaneMachineCount)) // mapped to CONTROL_PLANE_MACHINE_COUNT - - // check value for "spec.clusterNetwork.services.cidrBlocks" - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableServiceCIDR) - Expect("2002::1234:abcd:ffff:c0a8:101/64,100.64.0.0/18").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for TKG_IP_FAMILY which is decided based on "spec.clusterNetwork.services.cidrBlocks" and "spec.clusterNetwork.pod.cidrBlocks" - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.TKGIPFamily) - Expect(constants.DualStackPrimaryIPv6Family).To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.proxy.httpsProxy": TKGHTTPSProxy - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.TKGHTTPSProxy) - Expect("http://10.0.200.100").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.network.subnets.0.public.cidr": ConfigVariableAWSPublicNodeCIDR - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPublicNodeCIDR) - Expect("10.1.1.0/24").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.network.subnets.2.private.id": ConfigVariableAWSPrivateSubnetID2 - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSPrivateSubnetID2) - Expect("idValuePrivate2").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.network.vpc.existingID": ConfigVariableAWSVPCID - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSVPCID) - Expect("vpcID11").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.network.securityGroupOverrides.node": ConfigVariableAWSSecurityGroupNode - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSSecurityGroupNode) - Expect("securitygroupNode").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.trust.imageRepository" : ConfigVariableCustomImageRepositoryCaCertificate - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepositoryCaCertificate) - Expect("trust.imageRepository.val").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.controlPlane.rootVolume.sizeGiB": ConfigVariableAWSControlplaneOsDiskSizeGib - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableAWSControlplaneOsDiskSizeGib) - Expect("80").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for spec.topology.workers.machineDeployments.0.replicas : ConfigVariableWorkerMachineCount0 - WORKER_MACHINE_COUNT_0 - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableWorkerMachineCount0) - Expect("1").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // "spec.topology.workers.machineDeployments.2.variables.overrides.worker.instanceType": ConfigVariableNodeMachineType2, // NODE_MACHINE_TYPE_2 - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableNodeMachineType2) - Expect("worker2").To(Equal(fmt.Sprintf("%v", mappedVal))) - }) - It("When Input file is cluster type with multiple objects, Environment should be updated with legacy variables and CreateClusterOptions also updated with Cluster attribute values:", func() { - - // Process input cluster yaml file, this should process input cluster yaml file - // and update the environment with legacy name and values - // most of cluster yaml attributes are mapped to legacy variable for more look this - constants.ClusterToLegacyVariablesMapAws - options.ClusterConfigFile = inputFileMultipleObjectsAws - IsInputFileClusterClassBased, err := ctl.processWorkloadClusterInputFile(&options, isTKGSCluster) - Expect(IsInputFileClusterClassBased).Should(BeTrue()) - Expect(err).To(BeNil()) - - // process input file and get map, which has all attribute's path and its values - inputVariablesMap := getInputAttributesMap(options.ClusterConfigFile) - - // updates lower precedence variables with higher precedence variables values. - // In AWS use case, there were few attributes repeated in cluster yaml file, we need to take always higher precedence values. - updateLowerPrecedenceVariablesWithHigherPrecedenceVariablesValues(inputVariablesMap) - - // validate input Cluster Object yaml file attributes values with corresponding legacy variable values in environment, both should be same, as we have already updated the environment with Cluster Object attribute values. - validateFileInputAttributeValuesWithEnvironmentValues(&ctl, inputVariablesMap, constants.ClusterAttributesToLegacyVariablesMapAws) - - // checking manually for some variables mapping values - mappedVal, _ := ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterName) - Expect("aws-workload-cluster1").To(Equal(fmt.Sprintf("%v", mappedVal))) - }) - - It("When Input file is cluster type does not have value for spec.topology.class, return an error", func() { - - // Process input cluster.yaml file, this should process input cluster.yaml file - // and update the environment with legacy name and values - // most of cluster.yaml attributes are mapped to legacy variable for more look this - constants.clusterToLegacyVariablesMapAws - options.ClusterConfigFile = inputFileAwsEmptyClass - _, err := ctl.processWorkloadClusterInputFile(&options, isTKGSCluster) - Expect(fmt.Sprint(err)).To(Equal(constants.ClusterResourceWithoutTopologyNotSupportedErrMsg)) - }) - - It("When Input file is aws clusterclass.yaml file, but in-correct spec.topology.class name:", func() { - options.ClusterConfigFile = inputFileAwsIncorrectClass - IsInputFileClusterClassBased, err := ctl.processWorkloadClusterInputFile(&options, isTKGSCluster) - Expect(IsInputFileClusterClassBased).Should(BeTrue()) - Expect(fmt.Sprint(err)).To(Equal(constants.TopologyClassIncorrectValueErrMsg)) - }) - - It("When Input file is config.yaml file not cluster.yaml file", func() { - options.ClusterConfigFile = inputFileLegacy - IsInputFileClusterClassBased, err := ctl.processWorkloadClusterInputFile(&options, isTKGSCluster) - Expect(IsInputFileClusterClassBased).Should(BeFalse()) - Expect(err).To(BeNil()) - }) - - It("return error when Input file is not specified", func() { - options.ClusterConfigFile = "" - IsInputFileClusterClassBased, _ := ctl.processWorkloadClusterInputFile(&options, isTKGSCluster) - Expect(IsInputFileClusterClassBased).Should(BeFalse()) - }) - - It("return error when Input file not exists", func() { - options.ClusterConfigFile = "NOT-EXISTS" - _, err := ctl.processWorkloadClusterInputFile(&options, false) - Expect(err).To(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Unit tests for - (Vsphere) - cluster_vsphere.yaml as input file for 'tanzu cluster create -f cluster_vsphere.yaml' use case", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - bomClient = &fakes.TKGConfigBomClient{} - options CreateClusterOptions - isTKGSCluster = false - ) - JustBeforeEach(func() { - tkgConfigReaderWriter, _ := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configFilePath, configFilePath) - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - tkgConfigReaderWriter: tkgConfigReaderWriter, - tkgConfigUpdaterClient: tkgconfigupdater.New(testingDir, nil, tkgConfigReaderWriter), - tkgBomClient: bomClient, - } - tkgClient.IsFeatureActivatedReturns(false) - }) - Context("When input file is valid Cluster Class, plan devcc:", func() { - BeforeEach(func() { - options = CreateClusterOptions{ - ClusterName: "test-cluster", - Plan: "devcc", - InfrastructureProvider: "", - Namespace: "", - GenerateOnly: false, - TkrVersion: fakeTKRVersion, - SkipPrompt: true, - Edition: "tkg", - ClusterConfigFile: inputFileVsphere, - } - }) - It("Environment should be updated with legacy variables with input cluster attribute values:", func() { - - // Process input cluster.yaml file, this should process input cluster.yaml file - // and update the environment with legacy name and values - // most of cluster.yaml attributes are mapped to legacy variable for more look this - constants.ClusterToLegacyVariablesMapVsphere - IsInputFileClusterClassBased, err := ctl.processWorkloadClusterInputFile(&options, isTKGSCluster) - Expect(IsInputFileClusterClassBased).Should(BeTrue()) - Expect(err).To(BeNil()) - - // process input file and get map, which has all attribute's path and its values - inputVariablesMap := getInputAttributesMap(options.ClusterConfigFile) - - // validate input Cluster Object yaml file attributes values with corresponding legacy variable values in environment, both should be same, as we have already updated the environment with Cluster Object attribute values. - validateFileInputAttributeValuesWithEnvironmentValues(&ctl, inputVariablesMap, constants.ClusterAttributesToLegacyVariablesMapVsphere) - - // checking manually for some variables mapping values - mappedVal, _ := ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterName) - Expect("vsphere-workload-cluster1").To(Equal(fmt.Sprintf("%v", mappedVal))) - - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableNamespace) - Expect("namespace-test1").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.clusterNetwork.pods.cidrBlocks": ConfigVariableClusterCIDR - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterCIDR) - Expect("10.10.10.10/18").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.controlPlane.replicas": ConfigVariableControlPlaneMachineCount, - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableControlPlaneMachineCount) - Expect("5").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.proxy.httpsProxy": TKGHTTPSProxy - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.TKGHTTPSProxy) - Expect("http://10.0.200.100").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.imageRepository.tlsCertificateValidation": ConfigVariableCustomImageRepositorySkipTLSVerify - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableCustomImageRepositorySkipTLSVerify) - Expect("true").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.trust.proxy": TKGProxyCACert TKG_PROXY_CA_CERT - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.TKGProxyCACert) - Expect("LS0tLS=").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.apiServerPort": ConfigVariableClusterAPIServerPort CLUSTER_API_SERVER_PORT - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterAPIServerPort) - Expect("443").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.apiServerEndpoint": ConfigVariableVsphereControlPlaneEndpoint, VSPHERE_CONTROL_PLANE_ENDPOINT - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereControlPlaneEndpoint) - Expect("http://10.0.200.101").To(Equal(fmt.Sprintf("%v", mappedVal))) - // check that cluster options also updated - Expect("http://10.0.200.101").To(Equal(options.VsphereControlPlaneEndpoint)) - - // check value for "spec.topology.variables.controlPlane.network.nameservers" - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableControlPlaneNodeNameservers) - Expect("100.64.0.0").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.controlPlane.machine.numCPUs - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereCPNumCpus) - Expect("2").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.variables.worker.machine.memoryMiB" ConfigVariableVsphereWorkerMemMib - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereWorkerMemMib) - Expect("16384").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.workers.machineDeployments.2.failureDomain" - ConfigVariableVsphereAz2 - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereAz2) - Expect("us-east-1c").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for ".network.addressesFromPools": NODE_IPAM_IP_POOL_NAME - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableNodeIPAMIPPoolName) - Expect("inclusterpool").To(Equal(fmt.Sprintf("%v", mappedVal))) - }) - }) - - Context("When input file is valid Cluster Class, plan devcc, but no tlsThumbprint is passed:", func() { - BeforeEach(func() { - options = CreateClusterOptions{ - ClusterName: "test-cluster", - Plan: "devcc", - InfrastructureProvider: "", - Namespace: "", - GenerateOnly: false, - TkrVersion: fakeTKRVersion, - SkipPrompt: true, - Edition: "tkg", - ClusterConfigFile: inputFileVsphereInsecure, - } - }) - It("Environment should be updated with legacy variables with input cluster attribute values:", func() { - - // Process input cluster.yaml file, this should process input cluster.yaml file - // and update the environment with legacy name and values - // most of cluster.yaml attributes are mapped to legacy variable for more look this - constants.ClusterToLegacyVariablesMapVsphere - IsInputFileClusterClassBased, err := ctl.processWorkloadClusterInputFile(&options, isTKGSCluster) - Expect(IsInputFileClusterClassBased).Should(BeTrue()) - Expect(err).To(BeNil()) - - // process input file and get map, which has all attribute's path and its values - inputVariablesMap := getInputAttributesMap(options.ClusterConfigFile) - - // validate input Cluster Object yaml file attributes values with corresponding legacy variable values in environment, both should be same, as we have already updated the environment with Cluster Object attribute values. - validateFileInputAttributeValuesWithEnvironmentValues(&ctl, inputVariablesMap, constants.ClusterAttributesToLegacyVariablesMapVsphere) - - // checking manually for some variables mapping values - mappedVal, _ := ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereInsecure) - Expect("true").To(Equal(fmt.Sprintf("%v", mappedVal))) - - }) - }) -}) - -var _ = Describe("Unit tests for - (Azure) - cluster_azure.yaml as input file for 'tanzu cluster create -f cluster_azure.yaml' use case", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - bomClient = &fakes.TKGConfigBomClient{} - options CreateClusterOptions - isTKGSCluster = false - ) - JustBeforeEach(func() { - tkgConfigReaderWriter, _ := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configFilePath, configFilePath) - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - tkgConfigReaderWriter: tkgConfigReaderWriter, - tkgConfigUpdaterClient: tkgconfigupdater.New(testingDir, nil, tkgConfigReaderWriter), - tkgBomClient: bomClient, - } - tkgClient.IsFeatureActivatedReturns(false) - }) - Context("When input file is valid Cluster Class, plan devcc:", func() { - BeforeEach(func() { - options = CreateClusterOptions{ - ClusterName: "test-cluster", - Plan: "dev", - InfrastructureProvider: "", - Namespace: "", - GenerateOnly: false, - TkrVersion: fakeTKRVersion, - SkipPrompt: true, - Edition: "tkg", - ClusterConfigFile: inputFileAzure, - } - }) - It("Environment should be updated with legacy variables with input cluster attribute values:", func() { - - // Process input cluster yaml file, this should process input cluster yaml file - // and update the environment with legacy name and values - // most of cluster yaml attributes are mapped to legacy variable for more look this - constants.ClusterToLegacyVariablesMapAzure - IsInputFileClusterClassBased, err := ctl.processWorkloadClusterInputFile(&options, isTKGSCluster) - Expect(IsInputFileClusterClassBased).Should(BeTrue()) - Expect(err).To(BeNil()) - - // process input file and get map, which has all attribute's path and its values - inputVariablesMap := getInputAttributesMap(options.ClusterConfigFile) - - // validate input Cluster Object yaml file attributes values with corresponding legacy variables values in environment, both should be same, as we have already updated the environment with Cluster Object attribute values. - validateFileInputAttributeValuesWithEnvironmentValues(&ctl, inputVariablesMap, constants.ClusterAttributesToLegacyVariablesMapAzure) - - // checking manually for some variables mapping values - mappedVal, _ := ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterName) - Expect("azure-workload-cluster1").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // checking manually for some variables mapping values - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableNamespace) - Expect("namespace-test1").To(Equal(fmt.Sprintf("%v", mappedVal))) - // Check that cluster options also updated - Expect("namespace-test1").To(Equal(options.Namespace)) - Expect("azure").To(Equal(options.InfrastructureProvider)) - - // check value for "spec.clusterNetwork.services.cidrBlocks": ConfigVariableServiceCIDR, - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableServiceCIDR) - Expect("10.10.10.10/16").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // check value for "spec.topology.workers.machineDeployments.2.failureDomain" - ConfigVariableAzureAZ2 - mappedVal, _ = ctl.TKGConfigReaderWriter().Get(constants.ConfigVariableAzureAZ2) - Expect("us-east-1c").To(Equal(fmt.Sprintf("%v", mappedVal))) - }) - }) -}) - -var _ = Describe("TKGS Cluster - cluster_tkgs.yaml as input file for 'tanzu cluster create -f cluster_tkgs.yaml' use case", func() { - var ( - tkgctlClient *tkgctl - tkgClient = &fakes.Client{} - bomClient = &fakes.TKGConfigBomClient{} - options CreateClusterOptions - isTKGSCluster = true - fg *fakes.FakeFeatureGateHelper - ) - JustBeforeEach(func() { - fg = &fakes.FakeFeatureGateHelper{} - tkgConfigReaderWriter, _ := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configFilePath, configFilePath) - tkgctlClient = &tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - tkgConfigReaderWriter: tkgConfigReaderWriter, - tkgConfigUpdaterClient: tkgconfigupdater.New(testingDir, nil, tkgConfigReaderWriter), - tkgBomClient: bomClient, - featureGateHelper: fg, - } - tkgClient.IsFeatureActivatedReturns(false) - }) - Context("When input file is valid Cluster Class", func() { - BeforeEach(func() { - options = CreateClusterOptions{ - ClusterName: "test-cluster", - Plan: "dev", - InfrastructureProvider: "", - Namespace: "", - GenerateOnly: false, - TkrVersion: fakeTKRVersion, - SkipPrompt: true, - Edition: "tkg", - ClusterConfigFile: inputFileTKGSClusterClass, - } - }) - It("Environment should be updated with legacy variables with input cluster attribute values:", func() { - fg.FeatureActivatedInNamespaceReturns(true, nil) - // Process input cluster yaml file, its being tkgs cluster use case, there would be no variable mapping takes place - // only the namespace and cluster name values read from input file and set in env and options - IsInputFileClusterClassBased, err := tkgctlClient.processWorkloadClusterInputFile(&options, isTKGSCluster) - Expect(IsInputFileClusterClassBased).Should(BeTrue()) - Expect(err).To(BeNil()) - - // checking manually for some variables mapping values - mappedVal, _ := tkgctlClient.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterName) - Expect("cc01").To(Equal(fmt.Sprintf("%v", mappedVal))) - - // checking manually for some variables mapping values - mappedVal, _ = tkgctlClient.TKGConfigReaderWriter().Get(constants.ConfigVariableNamespace) - Expect("ns01").To(Equal(fmt.Sprintf("%v", mappedVal))) - // Check that cluster options also updated - Expect("ns01").To(Equal(options.Namespace)) - Expect("cc01").To(Equal(options.ClusterName)) - }) - }) -}) -var _ = Describe("Clusterclass FeatureGate specific use cases", func() { - var ( - options CreateClusterOptions - tkgClient *fakes.Client - regionContext region.RegionContext - tkgctlClient *tkgctl - fg *fakes.FakeFeatureGateHelper - ) - - Context("TKGS cluster class based cluster creation", func() { - BeforeEach(func() { - options = CreateClusterOptions{ - ClusterName: "test-cluster", - Plan: "devcc", - InfrastructureProvider: "", - Namespace: "", - GenerateOnly: false, - TkrVersion: fakeTKRVersion, - SkipPrompt: true, - Edition: "tkg", - ClusterConfigFile: inputFileTKGSClusterClass, - } - fg = &fakes.FakeFeatureGateHelper{} - kubeConfigPath := inputFileTKGSClusterClass - regionContext = region.RegionContext{ - ContextName: "queen-anne-context", - SourceFilePath: inputFileTKGSClusterClass, - } - tkgConfigReaderWriter, _ := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configFilePath, configFilePath) - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterPlan, "dev") - tkgClient = &fakes.Client{} - tkgctlClient = &tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: kubeConfigPath, - tkgConfigReaderWriter: tkgConfigReaderWriter, - tkgConfigUpdaterClient: tkgconfigupdater.New(testingDir, nil, tkgConfigReaderWriter), - featureGateHelper: fg, - } - }) - It("When feature flag (FeatureFlagAllowLegacyCluster) disabled, input Cluster file is processed:", func() { - fg.FeatureActivatedInNamespaceReturns(true, nil) - tkgClient.IsPacificManagementClusterReturnsOnCall(0, true, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgClient.IsFeatureActivatedReturns(true) - tkgClient.CreateClusterReturnsOnCall(0, false, nil) - - _ = tkgctlClient.CreateCluster(options) - // Make sure call completed till end - c := tkgClient.CreateClusterCallCount() - Expect(1).To(Equal(c)) - // Make sure its TKGs system. - pc := tkgClient.IsPacificManagementClusterCallCount() - Expect(2).To(Equal(pc)) - // Make sure its ClusterClass use case. - cname, _ := tkgctlClient.tkgConfigReaderWriter.Get("CLUSTER_NAME") - Expect(cname).To(Equal("cc01")) - ns, _ := tkgctlClient.tkgConfigReaderWriter.Get(constants.ConfigVariableNamespace) - Expect(ns).To(Equal("ns01")) - }) - It("Expect error when feature flag (FeatureFlagAllowLegacyCluster) enabled and CC feature is disabled but CClass input file and TKGS Cluster ", func() { - fg.FeatureActivatedInNamespaceReturns(false, nil) - tkgClient.IsPacificManagementClusterReturnsOnCall(0, true, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgClient.IsFeatureActivatedReturns(false) - tkgClient.CreateClusterReturnsOnCall(0, false, nil) - - err := tkgctlClient.CreateCluster(options) - Expect(err.Error()).To(ContainSubstring("vSphere with Tanzu environment detected, however, the feature 'vmware-system-tkg-clusterclass' is not activated in 'vmware-system-tkg' namespace")) - // Make sure call not completed till end - c := tkgClient.CreateClusterCallCount() - Expect(0).To(Equal(c)) - // Make sure its TKGs system. - pc := tkgClient.IsPacificManagementClusterCallCount() - Expect(1).To(Equal(pc)) - }) - It("Should be able to create cluster when feature flag (FeatureFlagAllowLegacyCluster) enabled and CC feature is enabled on supervisor cluster but CClass input file and TKGS Cluster ", func() { - fg.FeatureActivatedInNamespaceReturns(true, nil) - tkgClient.IsPacificManagementClusterReturnsOnCall(0, true, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgClient.IsFeatureActivatedReturns(false) - tkgClient.CreateClusterReturnsOnCall(0, false, nil) - - err := tkgctlClient.CreateCluster(options) - Expect(err).NotTo(HaveOccurred()) - }) - It("Return error when Feature constants.CCFeature is disabled in featuregate", func() { - fg.FeatureActivatedInNamespaceReturns(false, nil) - tkgClient.IsPacificManagementClusterReturnsOnCall(0, true, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgClient.IsFeatureActivatedReturns(true) - tkgClient.CreateClusterReturnsOnCall(0, false, nil) - - // feature flag (FeatureFlagAllowLegacyCluster) is not activated, its clusterclass input file, but "clusterclass" feature in FeatureGate is disabled, so throws error - err := tkgctlClient.CreateCluster(options) - expectedErrMsg := fmt.Sprintf(constants.ErrorMsgFeatureGateNotActivated, constants.ClusterClassFeature, constants.TKGSClusterClassNamespace) - Expect(err.Error()).To(ContainSubstring(expectedErrMsg)) - }) - - It("Return error when featuregate api throws error", func() { - errorMsg := errFeatureStatus - fg.FeatureActivatedInNamespaceReturns(true, fmt.Errorf(errorMsg)) - tkgClient.IsPacificManagementClusterReturnsOnCall(0, true, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgClient.IsFeatureActivatedReturns(true) - tkgClient.CreateClusterReturnsOnCall(0, false, nil) - - // but throws error for the FeatureGate api, so we expect error here. - err := tkgctlClient.CreateCluster(options) - errorMsg = fmt.Sprintf(constants.ErrorMsgFeatureGateStatus, constants.ClusterClassFeature, constants.TKGSClusterClassNamespace) - // as FeatureGate api throws error, we expect error. - Expect(err.Error()).To(ContainSubstring(errorMsg)) - }) - }) - Context("TKGS TKC based cluster creation", func() { - var ( - clustername = "tkc-01" - namespace = "ns01" - ) - BeforeEach(func() { - options = CreateClusterOptions{ - ClusterName: clustername, - Plan: "devcc", - InfrastructureProvider: "", - Namespace: "", - GenerateOnly: false, - TkrVersion: fakeTKRVersion, - SkipPrompt: true, - Edition: "tkg", - ClusterConfigFile: inputFileTKGSTKC, - } - fg = &fakes.FakeFeatureGateHelper{} - kubeConfigPath := inputFileTKGSTKC - regionContext = region.RegionContext{ - ContextName: "queen-anne-context", - SourceFilePath: inputFileTKGSTKC, - } - tkgConfigReaderWriter, _ := tkgconfigreaderwriter.NewReaderWriterFromConfigFile(configFilePath, configFilePath) - tkgConfigReaderWriter.Set(constants.ConfigVariableClusterPlan, "dev") - tkgClient = &fakes.Client{} - tkgctlClient = &tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: kubeConfigPath, - tkgConfigReaderWriter: tkgConfigReaderWriter, - tkgConfigUpdaterClient: tkgconfigupdater.New(testingDir, nil, tkgConfigReaderWriter), - featureGateHelper: fg, - } - }) - It("When feature flag (FeatureFlagAllowLegacyCluster) is disabled, input TKC file is processed:", func() { - fg.FeatureActivatedInNamespaceReturns(true, nil) - tkgClient.IsPacificManagementClusterReturnsOnCall(0, true, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgClient.IsFeatureActivatedReturns(true) - tkgClient.CreateClusterReturnsOnCall(0, false, nil) - - _ = tkgctlClient.CreateCluster(options) - // Make sure call completed till end - c := tkgClient.CreateClusterCallCount() - Expect(1).To(Equal(c)) - // Make sure its TKGs system. - pc := tkgClient.IsPacificManagementClusterCallCount() - Expect(2).To(Equal(pc)) - // Make sure its ClusterClass use case. - cname, _ := tkgctlClient.tkgConfigReaderWriter.Get("CLUSTER_NAME") - Expect(cname).To(Equal(clustername)) - ns, _ := tkgctlClient.tkgConfigReaderWriter.Get(constants.ConfigVariableNamespace) - Expect(ns).To(Equal(namespace)) - }) - It("Expect to complete CreateCluster call even feature flag (FeatureFlagAllowLegacyCluster) enabled, TKC input file ", func() { - fg.FeatureActivatedInNamespaceReturns(true, nil) - tkgClient.IsPacificManagementClusterReturnsOnCall(0, true, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgClient.IsFeatureActivatedReturns(false) - tkgClient.CreateClusterReturnsOnCall(0, false, nil) - - _ = tkgctlClient.CreateCluster(options) - - // Make sure call not completed till end - c := tkgClient.CreateClusterCallCount() - Expect(1).To(Equal(c)) - // Make sure its TKGs system. - pc := tkgClient.IsPacificManagementClusterCallCount() - Expect(2).To(Equal(pc)) - - cname, _ := tkgctlClient.tkgConfigReaderWriter.Get(constants.ConfigVariableClusterName) - Expect(cname).To(Equal(clustername)) - ns, _ := tkgctlClient.tkgConfigReaderWriter.Get(constants.ConfigVariableNamespace) - Expect(ns).To(Equal(namespace)) - }) - It("Return error when Feature constants.TKCAPIFeature is disabled in TKGS featuregate", func() { - fg.FeatureActivatedInNamespaceReturns(false, nil) - tkgClient.IsPacificManagementClusterReturnsOnCall(0, true, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgClient.IsFeatureActivatedReturns(true) - tkgClient.CreateClusterReturnsOnCall(0, false, nil) - - // feature flag (FeatureFlagAllowLegacyCluster) is not activated, its clusterclass input file, but "clusterclass" feature in FeatureGate is disabled, so throws error - err := tkgctlClient.CreateCluster(options) - expectedErrMsg := fmt.Sprintf(constants.ErrorMsgFeatureGateNotActivated, constants.TKCAPIFeature, constants.TKGSTKCAPINamespace) - Expect(err.Error()).To(ContainSubstring(expectedErrMsg)) - }) - - It("create cluster even when tkc-api featuregate api throws error", func() { - errorMsg := errFeatureStatus - fg.FeatureActivatedInNamespaceReturns(true, fmt.Errorf(errorMsg)) - tkgClient.IsPacificManagementClusterReturnsOnCall(0, true, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgClient.IsFeatureActivatedReturns(true) - tkgClient.CreateClusterReturnsOnCall(0, false, nil) - - // but throws error for the FeatureGate api, so we expect error here. - _ = tkgctlClient.CreateCluster(options) - // Make sure call not completed till end - c := tkgClient.CreateClusterCallCount() - Expect(1).To(Equal(c)) - // Make sure its TKGs system. - pc := tkgClient.IsPacificManagementClusterCallCount() - Expect(2).To(Equal(pc)) - - cname, _ := tkgctlClient.tkgConfigReaderWriter.Get(constants.ConfigVariableClusterName) - Expect(cname).To(Equal(clustername)) - ns, _ := tkgctlClient.tkgConfigReaderWriter.Get(constants.ConfigVariableNamespace) - Expect(ns).To(Equal(namespace)) - }) - It("return error when cluster already exists:", func() { - fg.FeatureActivatedInNamespaceReturns(true, nil) - tkgClient.IsPacificManagementClusterReturnsOnCall(0, true, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: clustername, Namespace: namespace}, {Name: "my-cluster-2", Namespace: "my-system"}}, nil) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgClient.IsFeatureActivatedReturns(true) - tkgClient.CreateClusterReturnsOnCall(0, false, nil) - - err := tkgctlClient.CreateCluster(options) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(constants.ErrorMsgClusterExistsAlready, clustername))) - }) - It("return error when list cluster returns error:", func() { - fg.FeatureActivatedInNamespaceReturns(true, nil) - tkgClient.IsPacificManagementClusterReturnsOnCall(0, true, nil) - tkgClient.ListTKGClustersReturns(nil, errors.New("failed to list clusters")) - tkgClient.GetCurrentRegionContextReturns(regionContext, nil) - tkgClient.IsFeatureActivatedReturns(true) - - err := tkgctlClient.CreateCluster(options) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(constants.ErrorMsgClusterListError)) - }) - }) -}) - -// getInputAttributesMap process input Cluster Object yaml file and returns a map which has all attributes from the input file and its values -func getInputAttributesMap(inputFile string) map[string]interface{} { - // to make sure input cluster attributes values are updated with legacy variables in environment (tkgctl.TKGConfigReaderWriter()) - // Processing the input cluster yaml file with the existing util api, and expecting Cluster YAML object, - // from the Cluster YAML object, map attributes path with values, and update Map variablesMap. - _, clusterObj, _ := CheckIfInputFileIsClusterClassBased(inputFile) - inputVariablesMap := make(map[string]interface{}) - inputVariablesMap["metadata.name"] = clusterObj.GetName() - inputVariablesMap["metadata.namespace"] = clusterObj.GetNamespace() - spec := clusterObj.Object[constants.SPEC].(map[string]interface{}) - err := processYamlObjectAndAddToMap(spec, constants.SPEC, inputVariablesMap) - Expect(err).To(BeNil()) - return inputVariablesMap -} - -// validateFileInputAttributeValuesWithEnvironmentValues takes the Cluster Object yaml file input variable map and checks its values in the environment, both should be same. -func validateFileInputAttributeValuesWithEnvironmentValues(ctl *tkgctl, inputVariablesMap map[string]interface{}, clusterAttributesToLegacyVariablesMap map[string]string) { - // take legacy variable name for every attribute in cluster input file, - // then check the value of legacy variable in environment, with value of the same from the input file - // both should match. - for key := range inputVariablesMap { - if inputValue := inputVariablesMap[key]; inputValue != nil { - legacyNameForClusterObjectInputVariable, ok := clusterAttributesToLegacyVariablesMap[key] - if ok && legacyNameForClusterObjectInputVariable != "" { - mappedVal, _ := ctl.TKGConfigReaderWriter().Get(legacyNameForClusterObjectInputVariable) - Expect(fmt.Sprintf("%v", mappedVal)).To(Equal(fmt.Sprintf("%v", inputValue))) - } - } - } -} - -// updateLowerPrecedenceVariablesWithHigherPrecedenceVariablesValues, updates lower precedence variables with higher precedence variables values. -func updateLowerPrecedenceVariablesWithHigherPrecedenceVariablesValues(inputVariablesMap map[string]interface{}) { - // below logic, takes higher precedence attribute path and its lower precedence path, - // check if lower precedence path has value if so overrides with higher precedence path value. - for higherPrecedenceKey := range constants.ClusterAttributesHigherPrecedenceToLowerMap { - _, ok1 := constants.ClusterAttributesToLegacyVariablesMapAws[higherPrecedenceKey] - value, ok2 := inputVariablesMap[higherPrecedenceKey] - if ok1 && ok2 { - lowerPrecedenceAttribute := constants.ClusterAttributesHigherPrecedenceToLowerMap[higherPrecedenceKey] - // lower precedence attribute value should be the value of higher - inputVariablesMap[lowerPrecedenceAttribute] = fmt.Sprintf("%v", value) - } - } -} - -func getConfigFilePath() string { - filename := "config1.yaml" - filePath := "../fakes/config/kubeconfig/" + filename - f, _ := os.CreateTemp(testingDir, "kube") - copyFile(filePath, f.Name()) - return f.Name() -} - -func copyFile(sourceFile, destFile string) { - input, _ := os.ReadFile(sourceFile) - _ = os.WriteFile(destFile, input, constants.ConfigFilePermissions) -} - -func createTempDirectory() { - testingDir, _ = os.MkdirTemp("", "cluster_client_test") -} - -func deleteTempDirectory() { - os.Remove(testingDir) -} diff --git a/tkg/tkgctl/delete_cluster.go b/tkg/tkgctl/delete_cluster.go deleted file mode 100644 index 5993f3502f..0000000000 --- a/tkg/tkgctl/delete_cluster.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "fmt" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// DeleteClustersOptions delete cluster options -type DeleteClustersOptions struct { - ClusterName string - Namespace string - SkipPrompt bool -} - -// DeleteCluster deletes workload cluster -func (t *tkgctl) DeleteCluster(options DeleteClustersOptions) error { - // Make sure activity is captured in the audit log in case of deletion failure. - if logPath, err := t.getAuditLogPath(options.ClusterName); err == nil { - log.SetAuditLog(logPath) - } - - // if --yes is set, kick off the delete process without waiting for confirmation - if !options.SkipPrompt { - if err := askForConfirmation(fmt.Sprintf("Deleting workload cluster '%s'. Are you sure?", options.ClusterName)); err != nil { - return err - } - } - - if options.Namespace == "" { - options.Namespace = constants.DefaultNamespace - } - - deleteWcOptions := client.DeleteWorkloadClusterOptions{ - ClusterName: options.ClusterName, - Namespace: options.Namespace, - } - - err := t.tkgClient.DeleteWorkloadCluster(deleteWcOptions) - if err != nil { - return err - } - - log.Infof("Workload cluster '%s' is being deleted \n", options.ClusterName) - - // Clean up the audit log since we were successful - t.removeAuditLog(options.ClusterName) - log.SetAuditLog("") - - return nil -} diff --git a/tkg/tkgctl/delete_cluster_test.go b/tkg/tkgctl/delete_cluster_test.go deleted file mode 100644 index 07c50da9ae..0000000000 --- a/tkg/tkgctl/delete_cluster_test.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakeproviders "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/providers" -) - -var _ = Describe("Unit tests for delete cluster", func() { - var ( - ctl *tkgctl - tkgClient = &fakes.Client{} - err error - configDir string - dcOps DeleteClustersOptions - ) - - JustBeforeEach(func() { - configDir, err = os.MkdirTemp("", "test") - err = os.MkdirAll(testingDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - prepareConfiDir(configDir) - options := Options{ - ConfigDir: configDir, - ProviderGetter: fakeproviders.FakeProviderGetter(), - } - c, createErr := New(options) - Expect(createErr).ToNot(HaveOccurred()) - ctl, _ = c.(*tkgctl) - ctl.tkgClient = tkgClient - dcOps = DeleteClustersOptions{ - SkipPrompt: true, - ClusterName: "my-cluster", - } - err = ctl.DeleteCluster(dcOps) - }) - Context("When cluster exists and can be deleted successfully", func() { - BeforeEach(func() { - tkgClient.DeleteWorkloadClusterReturns(nil) - }) - It("should start deleting the cluster", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - Context("When cluster does not exist", func() { - BeforeEach(func() { - tkgClient.DeleteWorkloadClusterReturns(errors.New("cluster does not exist")) - }) - It("should start deleting the cluster", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - AfterEach(func() { - os.Remove(configDir) - }) -}) diff --git a/tkg/tkgctl/delete_machine_health_check.go b/tkg/tkgctl/delete_machine_health_check.go deleted file mode 100644 index 0dfc2d67bb..0000000000 --- a/tkg/tkgctl/delete_machine_health_check.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "fmt" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// DeleteMachineHealthCheckOptions delete cluster options -type DeleteMachineHealthCheckOptions struct { - ClusterName string - Namespace string - MachinehealthCheckName string - SkipPrompt bool - MatchLabel string -} - -// DeleteMachineHealthCheck deletes MHC on cluster -func (t *tkgctl) DeleteMachineHealthCheck(options DeleteMachineHealthCheckOptions) error { - var err error - - if !options.SkipPrompt { - err = askForConfirmation(fmt.Sprintf("Deleting MachineHealthCheck for cluster %s. Are you sure?", options.ClusterName)) - if err != nil { - return err - } - } - - optionsMHC := client.MachineHealthCheckOptions{ - ClusterName: options.ClusterName, - Namespace: options.Namespace, - MachineHealthCheckName: options.MachinehealthCheckName, - MatchLabel: options.MatchLabel, - } - err = t.tkgClient.DeleteMachineHealthCheck(optionsMHC) - if err != nil { - return err - } - - log.Info("The MachineHealthCheck was deleted successfully") - - return nil -} diff --git a/tkg/tkgctl/delete_region.go b/tkg/tkgctl/delete_region.go deleted file mode 100644 index daf9016cae..0000000000 --- a/tkg/tkgctl/delete_region.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "fmt" - "time" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// DeleteRegionOptions delete region options -type DeleteRegionOptions struct { - ClusterName string - Force bool - UseExistingCluster bool - SkipPrompt bool - Timeout time.Duration -} - -// DeleteRegion deletes management cluster -func (t *tkgctl) DeleteRegion(options DeleteRegionOptions) error { - // Make sure activity is captured in the audit log in case of deletion failure. - if logPath, err := t.getAuditLogPath(options.ClusterName); err == nil { - log.SetAuditLog(logPath) - } - - var err error - - // delete region requires minimum 15 minutes timeout - minTimeoutReq := 15 * time.Minute - if options.Timeout < minTimeoutReq { - log.V(6).Infof("timeout duration of at least 15 minutes is required, using default timeout %v", constants.DefaultLongRunningOperationTimeout) - options.Timeout = constants.DefaultLongRunningOperationTimeout - } - - defer t.restoreAfterSettingTimeout(options.Timeout)() - - // if --yes is set, kick off the delete process without waiting for confirmation - if !options.SkipPrompt { - err = askForConfirmation(fmt.Sprintf("Deleting management cluster '%s'. Are you sure?", options.ClusterName)) - if err != nil { - return err - } - } - - log.V(1).Infof("\nDeleting management cluster...\n") - - optionsDR := client.DeleteRegionOptions{ - Force: options.Force, - Kubeconfig: t.kubeconfig, - UseExistingCluster: options.UseExistingCluster, - ClusterName: options.ClusterName, - } - - err = t.tkgClient.DeleteRegion(optionsDR) - if err != nil { - return errors.Wrap(err, "unable to delete management cluster") - } - - log.Infof("\nManagement cluster deleted!\n") - - // Clean up the audit log since we were successful - t.removeAuditLog(options.ClusterName) - log.SetAuditLog("") - - return nil -} diff --git a/tkg/tkgctl/describe_cluster.go b/tkg/tkgctl/describe_cluster.go deleted file mode 100644 index 9471755830..0000000000 --- a/tkg/tkgctl/describe_cluster.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "context" - "fmt" - "strings" - - "github.com/pkg/errors" - - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - clusterctltree "sigs.k8s.io/cluster-api/cmd/clusterctl/client/tree" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// DescribeTKGClustersOptions options that can be passed while requesting to describe a cluster -type DescribeTKGClustersOptions struct { - ClusterName string - Namespace string - ShowOtherConditions string - ShowDetails bool - ShowGroupMembers bool -} - -// DescribeClusterResult the result object for when the cluster's description is returned -type DescribeClusterResult struct { - Objs *clusterctltree.ObjectTree - Cluster *clusterv1.Cluster - InstalledProviders *clusterctlv1.ProviderList - ClusterInfo client.ClusterInfo -} - -// DescribeCluster returns list of cluster -func (t *tkgctl) DescribeCluster(options DescribeTKGClustersOptions) (DescribeClusterResult, error) { - if options.Namespace == "" { - options.Namespace = constants.DefaultNamespace - } - - DescribeTKGClustersOptions := client.DescribeTKGClustersOptions{ - ClusterName: options.ClusterName, - Namespace: options.Namespace, - ShowOtherConditions: options.ShowOtherConditions, - ShowDetails: options.ShowDetails, - ShowGroupMembers: options.ShowGroupMembers, - IsManagementCluster: false, - } - - results := DescribeClusterResult{} - - isPacific, err := t.tkgClient.IsPacificManagementCluster() - if err != nil { - return results, err - } - - var isTKGSClusterClassFeatureActivated bool - if isPacific { - isTKGSClusterClassFeatureActivated, err = t.featureGateHelper.FeatureActivatedInNamespace(context.Background(), constants.ClusterClassFeature, constants.TKGSClusterClassNamespace) - if err != nil { - return results, errors.Wrap(err, fmt.Sprintf(constants.ErrorMsgFeatureGateStatus, constants.ClusterClassFeature, constants.TKGSClusterClassNamespace)) - } - } - - listTKGClustersOptions := client.ListTKGClustersOptions{ - Namespace: options.Namespace, - IncludeMC: true, - IsTKGSClusterClassFeatureActivated: isTKGSClusterClassFeatureActivated, - } - - clusters, err := t.tkgClient.ListTKGClusters(listTKGClustersOptions) - if err != nil { - return results, err - } - - for i := 0; i < len(clusters); i++ { - if clusters[i].Name == options.ClusterName { - results.ClusterInfo = clusters[i] - - clusterRoles := "" - if len(clusters[i].Roles) != 0 { - clusterRoles = strings.Join(clusters[i].Roles, ",") - } - if clusterRoles == "management" { - DescribeTKGClustersOptions.IsManagementCluster = true - - // management cluster will point to a kind cluster if infrastructure provisioning - // or 'clusterctl move' fails. - - // setting status of the management cluster to "failed" if the mc is a kind cluster. - isFailure, err := t.tkgClient.IsManagementClusterAKindCluster(options.ClusterName) - if err != nil { - return results, err - } - - if isFailure { - results.ClusterInfo.Status = "failed" - } - } - } - } - - objs, cluster, installedProviders, err := t.tkgClient.DescribeCluster(DescribeTKGClustersOptions) - if err != nil { - // If it is pacific(TKGS), it would be the best effort to return the objectTree and cluster, so if there is an error - // fetching these objects, return empty objects without error. - if isPacific { - log.V(5).Infof("Failed to get cluster ObjectTree/cluster objects(so detailed(tree) view of cluster resources may be affected), reason: %v", err) - return results, nil - } - return results, err - } - results.Objs = objs - results.Cluster = cluster - results.InstalledProviders = installedProviders - - return results, nil -} - -func (t *tkgctl) DescribeProviders() (*clusterctlv1.ProviderList, error) { - installedProviders, err := t.tkgClient.DescribeProvider() - if err != nil { - return nil, err - } - - return installedProviders, nil -} diff --git a/tkg/tkgctl/describe_cluster_test.go b/tkg/tkgctl/describe_cluster_test.go deleted file mode 100644 index 3af1ae40df..0000000000 --- a/tkg/tkgctl/describe_cluster_test.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit test for describe cluster", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - featureGateHelper = &fakes.FakeFeatureGateHelper{} - ops = DescribeTKGClustersOptions{ - ClusterName: "my-cluster", - Namespace: "", - } - err error - result DescribeClusterResult - ) - - JustBeforeEach(func() { - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: "./kube", - featureGateHelper: featureGateHelper, - } - result, err = ctl.DescribeCluster(ops) - }) - - Context("when failed to determine the management cluster is Pacific(TKGS) supervisor cluster ", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(false, errors.New("fake-error")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("when the management cluster is not Pacific(TKGS) supervisor cluster and failed to list tkg clusters", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(false, nil) - tkgClient.ListTKGClustersReturns(nil, errors.New("failed to list clusters")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("when the management cluster is not Pacific(TKGS) supervisor cluster and it is a failed management cluster", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(false, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: "my-cluster", Roles: []string{"management"}}}, nil) - tkgClient.IsManagementClusterAKindClusterReturns(true, nil) - tkgClient.DescribeClusterReturns(nil, nil, nil, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("when the management cluster is not Pacific(TKGS) supervisor cluster and when tkgClient failed to describe the cluster", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(false, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: "my-cluster", Roles: []string{""}}}, nil) - tkgClient.DescribeClusterReturns(nil, nil, nil, errors.New("failed to describe cluster")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("when the management cluster is Pacific(TKGS) supervisor cluster with cluster class feature disabled and is able to list the clusters", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(true, nil) - featureGateHelper.FeatureActivatedInNamespaceReturns(true, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: "my-cluster", Namespace: "default"}, {Name: "my-cluster-2", Namespace: "my-system"}}, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - options := tkgClient.ListTKGClustersArgsForCall(3) - Expect(options.IsTKGSClusterClassFeatureActivated).To(BeTrue()) - - }) - }) - Context("when the management cluster is Pacific(TKGS) supervisor cluster with cluster class feature enabled and is able to list the clusters", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(true, nil) - featureGateHelper.FeatureActivatedInNamespaceReturns(true, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: "my-cluster", Namespace: "default"}, {Name: "my-cluster-2", Namespace: "my-system"}}, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - options := tkgClient.ListTKGClustersArgsForCall(3) - Expect(options.IsTKGSClusterClassFeatureActivated).To(BeTrue()) - }) - }) - Context("when the management cluster is Pacific(TKGS) supervisor cluster and when tkgClient failed to describe the cluster", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(true, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: "my-cluster", Roles: []string{""}}}, nil) - tkgClient.DescribeClusterReturns(nil, nil, nil, errors.New("failed to describe cluster")) - }) - It("should not return an error but ObjectTree and cluster objects should be nil", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(result.Objs).To(BeNil()) - Expect(result.Cluster).To(BeNil()) - }) - }) -}) diff --git a/tkg/tkgctl/featuregate_helper.go b/tkg/tkgctl/featuregate_helper.go deleted file mode 100644 index 4a69d952f4..0000000000 --- a/tkg/tkgctl/featuregate_helper.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "context" - "fmt" - - "github.com/pkg/errors" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/sets" - "sigs.k8s.io/controller-runtime/pkg/client" - - configv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/tkg/api/tmc/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -type featureGateHelper struct { - clusterClientOptions clusterclient.Options - contextName string - kubeconfig string -} - -type FeatureGateHelper interface { - FeatureActivatedInNamespace(reqContext context.Context, feature, namespace string) (bool, error) -} - -func NewFeatureGateHelper(options *clusterclient.Options, contextName, kubeconfig string) FeatureGateHelper { - return &featureGateHelper{ - clusterClientOptions: *options, - contextName: contextName, - kubeconfig: kubeconfig, - } -} - -// FeatureActivatedInNamespace gets and returns the status of the feature in namespace -func (fg *featureGateHelper) FeatureActivatedInNamespace(reqContext context.Context, feature, namespace string) (bool, error) { - clusterClient, err := clusterclient.NewClient(fg.kubeconfig, fg.contextName, fg.clusterClientOptions) - if err != nil { - return false, err - } - scheme := clusterClient.GetClientSet().Scheme() - _ = v1alpha1.AddToScheme(scheme) - - isPacific, err := clusterClient.IsPacificRegionalCluster() - if err != nil { - return false, errors.Wrap(err, "error determining Tanzu Kubernetes Cluster service for vSphere management cluster ") - } - - if isPacific { - // If requested feature is `ClusterClassFeature` or `TKCAPIFeature` it gets decided on different criteria at the moment - // This is because we are unable to query Featuregates for the devops users on the TKGS clusters because of the permission restrictions - // TODO: Fix this logic to rely on actual featuregates once permission issue for the devops user has been resolved - switch feature { - case constants.ClusterClassFeature: - return fg.isClusterClassFeatureActivated(clusterClient, feature, namespace) - case constants.TKCAPIFeature: - return fg.isTKCFeatureActivated(clusterClient, feature, namespace) - } - } - - return featureActivatedInNamespace(reqContext, clusterClient.GetClientSet(), namespace, feature) -} - -// TODO(ragasthya): Remove temp copies of featuregate helper functions. -// featureActivatedInNamespace returns true only if all of the features specified are activated in the namespace. -func featureActivatedInNamespace(ctx context.Context, c client.Client, namespace, feature string) (bool, error) { - selector := metav1.LabelSelector{ - MatchExpressions: []metav1.LabelSelectorRequirement{ - {Key: "kubernetes.io/metadata.name", Operator: metav1.LabelSelectorOpIn, Values: []string{namespace}}, - }, - } - return featuresActivatedInNamespacesMatchingSelector(ctx, c, selector, []string{feature}) -} - -// featuresActivatedInNamespacesMatchingSelector returns true only if all the features specified are activated in every namespace matched by the selector. -func featuresActivatedInNamespacesMatchingSelector(ctx context.Context, c client.Client, namespaceSelector metav1.LabelSelector, features []string) (bool, error) { - namespaces, err := namespacesMatchingSelector(ctx, c, &namespaceSelector) - if err != nil { - return false, err - } - - // If no namespaces are matched or no features specified, return false. - if len(namespaces) == 0 || len(features) == 0 { - return false, nil - } - - featureGatesList := &configv1alpha1.FeatureGateList{} - if err := c.List(ctx, featureGatesList); err != nil { - return false, err - } - - // Map of namespace to a set of features activated in that namespace. - namespaceToActivatedFeatures := make(map[string]sets.String) - for i := range featureGatesList.Items { - fg := featureGatesList.Items[i] - for _, namespace := range fg.Status.Namespaces { - namespaceToActivatedFeatures[namespace] = sets.NewString(fg.Status.ActivatedFeatures...) - } - } - - for _, ns := range namespaces { - activatedFeatures, found := namespaceToActivatedFeatures[ns] - if !found { - // Namespace has no features gated. - return false, nil - } - // Feature is not activated in this namespace. - if !activatedFeatures.HasAll(features...) { - return false, nil - } - } - return true, nil -} - -// namespacesMatchingSelector returns the list of namespaces after applying the NamespaceSelector filter. -// Note that a nil selector selects nothing, while an empty selector selects everything. -// Callers using this function in feature gates context should be sending a pointer to an empty selector instead of nil. -func namespacesMatchingSelector(ctx context.Context, c client.Client, selector *metav1.LabelSelector) ([]string, error) { - s, err := metav1.LabelSelectorAsSelector(selector) - if err != nil { - return nil, fmt.Errorf("failed to get namespaces from NamespaceSelector: %w", err) - } - - nsList := &corev1.NamespaceList{} - err = c.List(ctx, nsList, client.MatchingLabelsSelector{Selector: s}) - if err != nil { - return nil, fmt.Errorf("failed to get namespaces from NamespaceSelector: %w", err) - } - - var namespaces []string - for i := range nsList.Items { - namespaces = append(namespaces, nsList.Items[i].Name) - } - return namespaces, nil -} - -// isClusterClassFeatureActivated is decided based on the FeatureGate CRD is present or not -// Currently, we are unable to query the featuregate for devops users because of the permission -// restrictions on the clusters. Hence for TKGS cluster, we are relying on existence of Featuregate -// API to decide ClusterClass feature is supported or not. -// Assumption is only vSphere8 based TKGS clusters will have this featuregate API as well as support for -// ClusterClass feature -func (fg *featureGateHelper) isClusterClassFeatureActivated(clusterClient clusterclient.Client, feature, namespace string) (bool, error) { //nolint:unparam - isFeaturegateCRDExists, err := clusterClient.VerifyExistenceOfCRD("featuregates", configv1alpha1.GroupVersion.Group) - if err != nil { - return false, err - } - return isFeaturegateCRDExists, nil -} - -// isTKCFeatureActivated returns true always for TKGS based cluster -// Assumption is both vSphere7 and vSphere8 based TKGS will continue to support TKC based cluster creation -func (fg *featureGateHelper) isTKCFeatureActivated(clusterClient clusterclient.Client, feature, namespace string) (bool, error) { - return true, nil -} diff --git a/tkg/tkgctl/get_ceip.go b/tkg/tkgctl/get_ceip.go deleted file mode 100644 index ebc8666219..0000000000 --- a/tkg/tkgctl/get_ceip.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/client" -) - -// GetCEIP returns CEIP status set on management cluster -func (t *tkgctl) GetCEIP() (client.ClusterCeipInfo, error) { - ceipStatus, err := t.tkgClient.GetCEIPParticipation() - if err != nil { - return client.ClusterCeipInfo{}, err - } - return ceipStatus, nil -} diff --git a/tkg/tkgctl/get_cluster.go b/tkg/tkgctl/get_cluster.go deleted file mode 100644 index 18dee363e7..0000000000 --- a/tkg/tkgctl/get_cluster.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "context" - "fmt" - "sort" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -// ListTKGClustersOptions ptions passed while getting a list of TKG Clusters -type ListTKGClustersOptions struct { - ClusterName string - Namespace string - IncludeMC bool - AllNamespaces bool -} - -// GetClusters returns list of cluster -func (t *tkgctl) GetClusters(options ListTKGClustersOptions) ([]client.ClusterInfo, error) { - isPacific, err := t.tkgClient.IsPacificManagementCluster() - if err != nil { - return nil, err - } - var isTKGSClusterClassFeatureActivated bool - if isPacific { - isTKGSClusterClassFeatureActivated, err = t.featureGateHelper.FeatureActivatedInNamespace(context.Background(), constants.ClusterClassFeature, constants.TKGSClusterClassNamespace) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf(constants.ErrorMsgFeatureGateStatus, constants.ClusterClassFeature, constants.TKGSClusterClassNamespace)) - } - } - namespace := options.Namespace - allNamespaces := options.AllNamespaces - // if allNamespaces is present, namespace in current context is ignored even if specified with --namespace. - if allNamespaces { - namespace = "" - } - listTKGClustersOptions := client.ListTKGClustersOptions{ - Namespace: namespace, - IncludeMC: options.IncludeMC, - IsTKGSClusterClassFeatureActivated: isTKGSClusterClassFeatureActivated, - } - clusters, err := t.tkgClient.ListTKGClusters(listTKGClustersOptions) - if err != nil { - return nil, err - } - - sort.Slice(clusters, func(i, j int) bool { - if clusters[i].Namespace < clusters[j].Namespace { - return true - } - if clusters[i].Namespace > clusters[j].Namespace { - return false - } - return clusters[i].Name < clusters[j].Name - }) - - return clusters, nil -} - -func (t *tkgctl) IsClusterExists(clustername, namespace string) (bool, error) { - clusters, err := t.GetClusters(ListTKGClustersOptions{ - Namespace: namespace, - IncludeMC: true, - }) - if err != nil { - return false, err - } - for index := range clusters { - if clusters[index].Name == clustername && clusters[index].Namespace == namespace { - return true, nil - } - } - return false, nil -} diff --git a/tkg/tkgctl/get_cluster_pinniped_info.go b/tkg/tkgctl/get_cluster_pinniped_info.go deleted file mode 100644 index c8ff05e749..0000000000 --- a/tkg/tkgctl/get_cluster_pinniped_info.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -// GetClusterPinnipedInfoOptions options that can be passed while getting pinniped info -type GetClusterPinnipedInfoOptions struct { - ClusterName string - Namespace string - IsManagementCluster bool -} - -// GetClusterPinnipedInfo returns the cluster and pinniped information -func (t *tkgctl) GetClusterPinnipedInfo(options GetClusterPinnipedInfoOptions) (*client.ClusterPinnipedInfo, error) { - if !options.IsManagementCluster && options.Namespace == "" { - options.Namespace = constants.DefaultNamespace - } - getClustersPinnipedInfoOptions := client.GetClusterPinnipedInfoOptions{ - ClusterName: options.ClusterName, - Namespace: options.Namespace, - IsManagementCluster: options.IsManagementCluster, - } - - clusterPinnipedInfo, err := t.tkgClient.GetClusterPinnipedInfo(getClustersPinnipedInfoOptions) - if err != nil { - return nil, err - } - return clusterPinnipedInfo, nil -} diff --git a/tkg/tkgctl/get_cluster_pinniped_info_test.go b/tkg/tkgctl/get_cluster_pinniped_info_test.go deleted file mode 100644 index 6c5c07f774..0000000000 --- a/tkg/tkgctl/get_cluster_pinniped_info_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit test for get Pinniped Info", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - ops = GetClusterPinnipedInfoOptions{ - ClusterName: "my-cluster", - } - err error - ) - - JustBeforeEach(func() { - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: "./kube", - } - _, err = ctl.GetClusterPinnipedInfo(ops) - }) - - Context("when failed to get pinniped info", func() { - BeforeEach(func() { - tkgClient.GetClusterPinnipedInfoReturns(nil, errors.New("failed to get pinniped info")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("when it is able get the pinniped info ", func() { - BeforeEach(func() { - ops.IsManagementCluster = true - tkgClient.GetClusterPinnipedInfoReturns(nil, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) diff --git a/tkg/tkgctl/get_cluster_test.go b/tkg/tkgctl/get_cluster_test.go deleted file mode 100644 index 3503314cae..0000000000 --- a/tkg/tkgctl/get_cluster_test.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit test for get clusters", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - featureGateHelper = &fakes.FakeFeatureGateHelper{} - ops = ListTKGClustersOptions{ - ClusterName: "my-cluster", - } - err error - ) - - JustBeforeEach(func() { - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: "./kube", - featureGateHelper: featureGateHelper, - } - _, err = ctl.GetClusters(ops) - }) - - Context("when failed to determine the management cluster is Pacific(TKGS) supervisor cluster ", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(false, errors.New("fake-error")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-error")) - }) - }) - Context("when the management cluster is not Pacific(TKGS) supervisor cluster and is able to list clusters with option --AllNamespace false", func() { - BeforeEach(func() { - ops.AllNamespaces = false - ops.Namespace = "default" - tkgClient.IsPacificManagementClusterReturns(false, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: "my-cluster", Namespace: "default"}}, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - options := tkgClient.ListTKGClustersArgsForCall(0) - Expect(options.IsTKGSClusterClassFeatureActivated).To(BeFalse()) - }) - }) - Context("when the management cluster is not Pacific(TKGS) supervisor cluster, but failed to list clusters", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(false, nil) - tkgClient.ListTKGClustersReturns(nil, errors.New("failed to list clusters")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to list clusters")) - options := tkgClient.ListTKGClustersArgsForCall(1) - Expect(options.IsTKGSClusterClassFeatureActivated).To(BeFalse()) - }) - }) - Context("when the management cluster is Pacific(TKGS) supervisor cluster but failed to get the cluster class feature activation status", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(true, nil) - featureGateHelper.FeatureActivatedInNamespaceReturns(false, errors.New("fake-feature-gate-error")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("fake-feature-gate-error")) - }) - }) - Context("when the management cluster is Pacific(TKGS) supervisor cluster with cluster class feature disabled and is able to list the clusters", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(true, nil) - featureGateHelper.FeatureActivatedInNamespaceReturns(true, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: "my-cluster", Namespace: "default"}, {Name: "my-cluster-2", Namespace: "my-system"}}, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - options := tkgClient.ListTKGClustersArgsForCall(2) - Expect(options.IsTKGSClusterClassFeatureActivated).To(BeTrue()) - - }) - }) - Context("when the management cluster is Pacific(TKGS) supervisor cluster with cluster class feature enabled and is able to list the clusters", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(true, nil) - featureGateHelper.FeatureActivatedInNamespaceReturns(true, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: "my-cluster", Namespace: "default"}, {Name: "my-cluster-2", Namespace: "my-system"}}, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - options := tkgClient.ListTKGClustersArgsForCall(3) - Expect(options.IsTKGSClusterClassFeatureActivated).To(BeTrue()) - }) - }) - Context("when the management cluster is not Pacific(TKGS) supervisor cluster and the listCluster with --AllNamespace", func() { - BeforeEach(func() { - ops.AllNamespaces = true - tkgClient.IsPacificManagementClusterReturns(false, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: "my-cluster", Namespace: "default"}, {Name: "my-cluster-2", Namespace: "my-system"}}, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - options := tkgClient.ListTKGClustersArgsForCall(0) - Expect(options.IsTKGSClusterClassFeatureActivated).To(BeFalse()) - }) - }) -}) - -var _ = Describe("Unit test for IsClusterExists", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - featureGateHelper = &fakes.FakeFeatureGateHelper{} - clustername = "my-cluster" - namespace = "my-namespace" - isClusterExists bool - err error - ) - - JustBeforeEach(func() { - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: "./kube", - featureGateHelper: featureGateHelper, - } - isClusterExists, err = ctl.IsClusterExists(clustername, namespace) - }) - - Context("when list cluster returns error", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(false, nil) - tkgClient.ListTKGClustersReturns(nil, errors.New("failed to list clusters")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("failed to list clusters")) - }) - }) - - Context("when given cluster exists", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(false, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: clustername, Namespace: namespace}, {Name: "my-cluster-2", Namespace: "my-system"}}, nil) - }) - It("should not return an error and cluster should exists", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(isClusterExists).To(BeTrue()) - }) - }) - - Context("when given cluster not exists", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(false, nil) - tkgClient.ListTKGClustersReturns([]client.ClusterInfo{{Name: "my-cluster-2", Namespace: "my-system"}}, nil) - }) - It("should not return an error and cluster not exists", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(isClusterExists).To(BeFalse()) - }) - }) -}) diff --git a/tkg/tkgctl/get_credentials.go b/tkg/tkgctl/get_credentials.go deleted file mode 100644 index 32fa545bed..0000000000 --- a/tkg/tkgctl/get_credentials.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// GetWorkloadClusterCredentialsOptions options that can be passed while getting workload cluster credentials -type GetWorkloadClusterCredentialsOptions struct { - ClusterName string - Namespace string - ExportFile string -} - -// GetCredentials saves cluster credentials to a file -func (t *tkgctl) GetCredentials(options GetWorkloadClusterCredentialsOptions) error { - if options.Namespace == "" { - options.Namespace = constants.DefaultNamespace - } - - getWorkloadClusterCredentialsOptions := client.GetWorkloadClusterCredentialsOptions{ - ClusterName: options.ClusterName, - Namespace: options.Namespace, - ExportFile: options.ExportFile, - } - - context, path, err := t.tkgClient.GetWorkloadClusterCredentials(getWorkloadClusterCredentialsOptions) - if err != nil { - return err - } - - log.Infof("Credentials of cluster '%s' have been saved \n", options.ClusterName) - if path == "" { - log.Infof("You can now access the cluster by running 'kubectl config use-context %s'\n", context) - } else { - log.Infof("You can now access the cluster by running 'kubectl config use-context %s' under path '%s' \n", context, path) - } - - return nil -} diff --git a/tkg/tkgctl/get_credentials_test.go b/tkg/tkgctl/get_credentials_test.go deleted file mode 100644 index 2d920a3ab6..0000000000 --- a/tkg/tkgctl/get_credentials_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit test for get credentials", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - ops = GetWorkloadClusterCredentialsOptions{ - ClusterName: "my-cluster", - } - err error - ) - - JustBeforeEach(func() { - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: "./kube", - } - err = ctl.GetCredentials(ops) - }) - - Context("when failed to get credentials", func() { - BeforeEach(func() { - tkgClient.GetWorkloadClusterCredentialsReturns("", "", errors.New("failed to get credentials")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("when it is able to get the credentials ", func() { - BeforeEach(func() { - tkgClient.GetWorkloadClusterCredentialsReturns("", "", nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) diff --git a/tkg/tkgctl/get_kubernetes_versions.go b/tkg/tkgctl/get_kubernetes_versions.go deleted file mode 100644 index 2c0bc2fed3..0000000000 --- a/tkg/tkgctl/get_kubernetes_versions.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/client" -) - -func (t *tkgctl) GetKubernetesVersions() (*client.KubernetesVersionsInfo, error) { - return t.tkgClient.GetKubernetesVersions() -} diff --git a/tkg/tkgctl/get_machine_health_check.go b/tkg/tkgctl/get_machine_health_check.go deleted file mode 100644 index 352a9e5a71..0000000000 --- a/tkg/tkgctl/get_machine_health_check.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/client" -) - -// GetMachineHealthCheckOptions options that can be passed while getting the machine health check of a cluster -type GetMachineHealthCheckOptions struct { - ClusterName string - MachineHealthCheckName string - Namespace string - MatchLabel string -} - -// GetMachineHealthCheck return machinehealthcheck configuration for the cluster -func (t *tkgctl) GetMachineHealthCheck(options GetMachineHealthCheckOptions) ([]client.MachineHealthCheck, error) { - machineHealthCheckOptions := client.MachineHealthCheckOptions{ - ClusterName: options.ClusterName, - Namespace: options.Namespace, - MachineHealthCheckName: options.MachineHealthCheckName, - MatchLabel: options.MatchLabel, - } - - return t.tkgClient.GetMachineHealthChecks(machineHealthCheckOptions) -} diff --git a/tkg/tkgctl/get_region.go b/tkg/tkgctl/get_region.go deleted file mode 100644 index a7d5a7518d..0000000000 --- a/tkg/tkgctl/get_region.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/region" -) - -// GetRegions return list of management clusters -func (t *tkgctl) GetRegions(managementClusterName string) ([]region.RegionContext, error) { - return t.tkgClient.GetRegionContexts(managementClusterName) -} diff --git a/tkg/tkgctl/get_tkr_test.go b/tkg/tkgctl/get_tkr_test.go deleted file mode 100644 index 1565ae5d2f..0000000000 --- a/tkg/tkgctl/get_tkr_test.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit test for get tkr", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - err error - ) - - JustBeforeEach(func() { - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: "./kube", - } - _, err = ctl.GetTanzuKubernetesReleases("") - }) - Context("when failed to get tkrs", func() { - BeforeEach(func() { - tkgClient.GetTanzuKubernetesReleasesReturns(nil, errors.New("region not found")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("when it is able to get tkrs", func() { - BeforeEach(func() { - tkgClient.GetTanzuKubernetesReleasesReturns(nil, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) diff --git a/tkg/tkgctl/get_tkrs.go b/tkg/tkgctl/get_tkrs.go deleted file mode 100644 index 7492bf05c6..0000000000 --- a/tkg/tkgctl/get_tkrs.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - -// GetTanzuKubernetesReleases returns the available TanzuKubernetesReleases -func (t *tkgctl) GetTanzuKubernetesReleases(tkrName string) ([]runv1alpha1.TanzuKubernetesRelease, error) { - tkrs, err := t.tkgClient.GetTanzuKubernetesReleases(tkrName) - if err != nil { - return nil, err - } - - return tkrs, nil -} diff --git a/tkg/tkgctl/helper_constants.go b/tkg/tkgctl/helper_constants.go deleted file mode 100644 index debe433270..0000000000 --- a/tkg/tkgctl/helper_constants.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package tkgctl placeholder package comment -package tkgctl - -// True string constant for the value "true" -var True = "true" -var False = "false" diff --git a/tkg/tkgctl/helpers.go b/tkg/tkgctl/helpers.go deleted file mode 100644 index d670379614..0000000000 --- a/tkg/tkgctl/helpers.go +++ /dev/null @@ -1,595 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "fmt" - "net" - "os" - "path/filepath" - "reflect" - "regexp" - "strconv" - "strings" - - "github.com/pkg/errors" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - - utilyaml "sigs.k8s.io/cluster-api/util/yaml" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfighelper" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigpaths" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -var okResponsesMap = map[string]struct{}{ - "y": {}, - "Y": {}, -} -var errMessageIPv6EnabledCIDRHasNoIPv6 = "the isIPV6Primary: true, but the first value in CIDRs:\"%v\" is not ipv6" -var errMessageCIDRsIPFamiliesNotSame = `the IP Families of input CIDRs: "%v":"%v" , "%v":"%v", both are not same IP Families` - -var regExMachineDep = regexp.MustCompile(constants.RegexpMachineDeploymentsOverrides) -var regExpTopologyClassVal = regexp.MustCompile(constants.RegexpTopologyClassValue) - -func askForConfirmation(message string) error { - var response string - msg := message + " [y/N]: " - log.ForceWriteToStdErr([]byte(msg)) - _, err := fmt.Scanln(&response) - if err != nil { - return errors.New("aborted") - } - if _, exit := okResponsesMap[response]; !exit { - return errors.New("aborted") - } - return nil -} - -// verifyThumbprint verifies the vSphere thumbprint used for deploying the management cluster -func (t *tkgctl) verifyThumbprint(skipPrompt bool) error { - if insecure, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereInsecure); err == nil && insecure == True { - t.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereTLSThumbprint, "") - return nil - } - - vcHost, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereServer) - if err != nil { - return errors.Errorf("failed to get %s", constants.ConfigVariableVsphereServer) - } - - thumbprint, err := vc.GetVCThumbprint(vcHost) - if err != nil { - return errors.Wrap(err, "cannot verify the thumbprint") - } - - if configThumbprint, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereTLSThumbprint); err == nil { - if configThumbprint == thumbprint { - return nil - } - log.Warningf("The %s variable does not match the thumbprint of vSphere %s, the actual thumbprint is %s", constants.ConfigVariableVsphereTLSThumbprint, vcHost, thumbprint) - } - - if !skipPrompt { - err = askForConfirmation(fmt.Sprintf("Do you want to continue with the vSphere thumbprint %s", thumbprint)) - if err != nil { - return err - } - } - - t.TKGConfigReaderWriter().Set(constants.ConfigVariableVsphereTLSThumbprint, thumbprint) - return nil -} - -func (t *tkgctl) ensureClusterConfigFile(clusterConfigFile string) (string, error) { - var err error - if clusterConfigFile == "" { - // if clusterConfigFile is not provided use default cluster config file - clusterConfigFile, err = tkgconfigpaths.New(t.configDir).GetDefaultClusterConfigPath() - if err != nil { - return "", errors.Wrap(err, "unable to get default cluster config file path") - } - log.V(3).Infof("cluster config file not provided using default config file at '%v'", clusterConfigFile) - } - - // create empty clusterConfigFile if not present - if _, err = os.Stat(clusterConfigFile); os.IsNotExist(err) { - log.V(3).Infof("cluster config file does not exist. Creating new one at '%v'", clusterConfigFile) - err = os.WriteFile(clusterConfigFile, []byte{}, constants.ConfigFilePermissions) - if err != nil { - return "", errors.Wrap(err, "cannot initialize cluster config file") - } - } - - // read cluster config file with tkgConfigReaderWriter and merge it into existing configuration - if err := t.TKGConfigReaderWriter().MergeInConfig(clusterConfigFile); err != nil { - return "", errors.Wrap(err, "error initializing cluster config") - } - - // decode credentials in viper after reading config file - err = t.tkgConfigUpdaterClient.DecodeCredentialsInViper() - if err != nil { - return "", errors.Wrap(err, "unable to update encoded credentials") - } - return clusterConfigFile, nil -} - -// ensureLogDirectory returns the directory path where log files should be stored by default. -func (t *tkgctl) ensureLogDirectory() (string, error) { - logDir, err := tkgconfigpaths.New(t.configDir).GetLogDirectory() - if err != nil { - return "", err - } - - // We got the path it should be, make sure it exists - if _, err = os.Stat(logDir); os.IsNotExist(err) { - log.V(3).Infof("cluster log directory does not exist. Creating new one at %q", logDir) - err := os.MkdirAll(logDir, os.ModePerm) - if err != nil { - return "", errors.Wrap(err, "cannot initialize cluster log directory") - } - } - - return logDir, nil -} - -// getAuditLogPath gets the full path to where an audit log should be located -// for a give clusterName. -func (t *tkgctl) getAuditLogPath(clusterName string) (string, error) { - if clusterName == "" { - return "", errors.New("cluster name is required to determine audit log path") - } - - path, err := t.ensureLogDirectory() - if err != nil { - return "", fmt.Errorf("unable to determine audit log path: %s", err.Error()) - } - - return filepath.Join(path, fmt.Sprintf("%s.log", clusterName)), nil -} - -// removeAuditLog will remove a cluster's audit log from the local filesystem. -// This is done on a best effort basis, so if the file does not exist, or if -// there is an issue deleting the file there will be no indication. -func (t *tkgctl) removeAuditLog(clusterName string) { - path, err := t.getAuditLogPath(clusterName) - if err != nil { - // We delete on a best-effort basis, so just return - return - } - - _ = os.Remove(path) -} - -// CheckIfInputFileIsClusterClassBased checks user input file, if it has Cluster object then -// reads all non-empty variables in cluster.spec.topology.variables, and updates those variables in -// environment and also CreateClusterOptions. -// TODO (chandrareddyp) : need to make sure the legacy validation error and log messages should not have legacy variable names in case of cluster class use case, should refer Cluster Object attributes (https://github.com/vmware-tanzu/tanzu-framework/issues/2443) -func CheckIfInputFileIsClusterClassBased(clusterConfigFile string) (bool, unstructured.Unstructured, error) { - var clusterObj unstructured.Unstructured - - isInputFileClusterClassBased := false - if clusterConfigFile == "" { - return isInputFileClusterClassBased, clusterObj, nil - } - content, err := os.ReadFile(clusterConfigFile) - if err != nil { - return isInputFileClusterClassBased, clusterObj, errors.Wrap(err, fmt.Sprintf("Unable to read input file: %v ", clusterConfigFile)) - } - - yamlObjects, err := utilyaml.ToUnstructured(content) - if err != nil { - return isInputFileClusterClassBased, clusterObj, errors.Wrap(err, fmt.Sprintf("Input file content is not yaml formatted, file path: %v", clusterConfigFile)) - } - - for i := range yamlObjects { - obj := yamlObjects[i] - if obj.GetKind() == constants.KindCluster { - clusterObj = obj - class, exists, _ := unstructured.NestedString((&clusterObj).UnstructuredContent(), "spec", "topology", "class") - if exists && class != "" { - isInputFileClusterClassBased = true - } else { - return isInputFileClusterClassBased, clusterObj, errors.New(constants.ClusterResourceWithoutTopologyNotSupportedErrMsg) - } - break - } - } - return isInputFileClusterClassBased, clusterObj, nil -} - -func getFieldfromUnstructuredObject(obj unstructured.Unstructured, fields ...string) (string, error) { - path := strings.Join(fields, ".") - value, exists, err := unstructured.NestedString(obj.UnstructuredContent(), fields...) - if err != nil { - return "", errors.Wrap(err, fmt.Sprintf("Failed to parse %s in %s %s/%s", path, obj.GetKind(), obj.GetNamespace(), obj.GetName())) - } - if !exists { - return "", errors.New(fmt.Sprintf("%s not found in %s %s/%s", path, obj.GetKind(), obj.GetNamespace(), obj.GetName())) - } - return value, nil -} - -func setVSphereCredentialFromInputfile(legacyVarMap *map[string]string, clusterConfigFile, clusterName, namespace string) error { - content, err := os.ReadFile(clusterConfigFile) - if err != nil { - return errors.Wrap(err, fmt.Sprintf("Unable to read input file: %s", clusterConfigFile)) - } - yamlObjects, err := utilyaml.ToUnstructured(content) - if err != nil { - return errors.Wrap(err, fmt.Sprintf("Input file content is not yaml formatted, file path: %s", clusterConfigFile)) - } - found := false - for _, obj := range yamlObjects { - if obj.GetKind() == "Secret" && obj.GetName() == clusterName && obj.GetNamespace() == namespace { - if username, err := getFieldfromUnstructuredObject(obj, "stringData", "username"); err != nil { - return err - } else { - (*legacyVarMap)[constants.ConfigVariableVsphereUsername] = username - } - if password, err := getFieldfromUnstructuredObject(obj, "stringData", "password"); err != nil { - return err - } else { - (*legacyVarMap)[constants.ConfigVariableVspherePassword] = password - } - found = true - } - } - if !found { - return errors.New(fmt.Sprintf("Secret %s/%s not found in %s", namespace, clusterName, clusterConfigFile)) - } - return nil -} - -// processClusterObjectForConfigurationVariables takes cluster object, process it to capture all configuration variables and add them in environment. -// TODO (chandrareddyp): validate the cluster class inputs without mapping to legacy variables and deprecate legacy validation (https://github.com/vmware-tanzu/tanzu-framework/issues/2432) -func (t *tkgctl) processClusterObjectForConfigurationVariables(clusterObj unstructured.Unstructured, clusterConfigFile string) error { - inputVariablesMap := make(map[string]interface{}) - inputVariablesMap["metadata.name"] = clusterObj.GetName() - inputVariablesMap["metadata.namespace"] = clusterObj.GetNamespace() - spec := clusterObj.Object[constants.SPEC].(map[string]interface{}) - err := processYamlObjectAndAddToMap(spec, constants.SPEC, inputVariablesMap) - if err != nil { - return err - } - - // TODO (chandrareddyp): Validate the cluster class and identify the provider type by querying the cluster class object instead of depending on the cluster class name (https://github.com/vmware-tanzu/tanzu-framework/issues/2424) - providerName, err := getProviderNameFromTopologyClassName(inputVariablesMap[constants.TopologyClass]) - // TODO (chandrareddyp) : Allow user to create workload cluster by disabling validation when provider type is unknown (https://github.com/vmware-tanzu/tanzu-framework/issues/2433) - if err != nil { - return err - } - - // get infra specific variable map - clusterAttributePathToLegacyVarNameMap := constants.InfrastructureSpecificVariableMappingMap[providerName] - - // assign cluster class input values to legacy variables - legacyVarMap := make(map[string]string) - for inputVariable := range inputVariablesMap { - if legacyNameForClusterObjectInputVariable, ok := clusterAttributePathToLegacyVarNameMap[inputVariable]; ok { - legacyVarMap[legacyNameForClusterObjectInputVariable] = fmt.Sprintf("%v", inputVariablesMap[inputVariable]) - } - } - legacyVarMap[constants.ConfigVariableInfraProvider] = providerName - - // VSPHERE_USERNAME and VSPHERE_PASSWORD do not have mapping to any Cluster variables and should be retrieved from VSphereCluster's identityRef - if providerName == constants.InfrastructureProviderVSphere { - if err := setVSphereCredentialFromInputfile(&legacyVarMap, clusterConfigFile, clusterObj.GetName(), clusterObj.GetNamespace()); err != nil { - return err - } - } - - // Some properties (NODE_MACHINE_TYPE_1, NODE_MACHINE_TYPE_2, etc) - // can have two values from Cluster object attributes, key and value of constants.ClusterAttributesHigherPrecedenceToLowerMap are two attribute paths points to same legacy variable. - // eg: key - "spec.topology.workers.machineDeployments.1.variables.overrides.NODE_MACHINE_TYPE", value - "spec.topology.variables.nodes.1.machineType" - // these two key/value attribute paths mapped to NODE_MACHINE_TYPE_1 legacy variable, if these two attribute paths has values in Cluster Object - // then need to consider higher precedence attribute path value which is key of constants.ClusterAttributesHigherPrecedenceToLowerMap. - for higherPrecedenceKey := range constants.ClusterAttributesHigherPrecedenceToLowerMap { - legacyName, ok1 := clusterAttributePathToLegacyVarNameMap[higherPrecedenceKey] - value, ok2 := inputVariablesMap[higherPrecedenceKey] - if ok1 && ok2 { - legacyVarMap[legacyName] = fmt.Sprintf("%v", value) - } - } - - // Identify TKG_IP_FAMILY based on Cluster and Service CIDRs, we need to set TKG_IP_FAMILY value, because we need this value for legacy validation in cluster creation flow. Cluster CIDR and Service CIDR IP Family's should be same, either "ipv4", "ip6", or dual stack ("ipv4,ipv6" or "ipv6,ipv4") - // If Cluster Attribute isIPV6Primary is true, then the first value of cluster/service CIDR should be ipv6 otherwise throws error. - // If isIPV6Primary is true, and cluster/service CIDR is dual stack, then the IP Family value should be "ipv6,ipv4" (ipv6 should come first), if isIPV6Primary is not true and cluster/service CIDR is dual stack then IP Family value should be "ipv4,ipv6" - var isIPV6Primary bool - if legacyVarMap[constants.TKGIPV6Primary] != "" { - isIPV6Primary, _ = strconv.ParseBool(legacyVarMap[constants.TKGIPV6Primary]) - } - clusterCIDRs := stringArrayToStringWithCommaSeparatedElements(legacyVarMap[constants.ConfigVariableClusterCIDR]) - serviceCIDRs := stringArrayToStringWithCommaSeparatedElements(legacyVarMap[constants.ConfigVariableServiceCIDR]) - IPFamily, err := GetIPFamilyForGivenClusterNetworkCIDRs(clusterCIDRs, serviceCIDRs, isIPV6Primary) - if err != nil { - return err - } - legacyVarMap[constants.TKGIPFamily] = IPFamily - - // update legacyVarMap in environment - t.TKGConfigReaderWriter().SetMap(legacyVarMap) - return nil -} - -// processYamlObjectAndAddToMap process specific value of the Cluster yaml object -// value is the value for the given attribute path clusterAttributePath in Cluster object -// if input value is final child value then value is added to variablesMap with clusterAttributePath as key, -// if the input value is not final child value, then its process again for next level child. -func processYamlObjectAndAddToMap(value interface{}, clusterAttributePath string, inputVariablesMap map[string]interface{}) error { - var err error - switch value := value.(type) { - case []interface{}: - err = processYamlObjectArrayInterfaceType(value, clusterAttributePath, inputVariablesMap) - case []map[string]interface{}: - for index := range value { - err = processYamlObjectAndAddToMap(value[index], clusterAttributePath, inputVariablesMap) - if err != nil { - return err - } - } - case map[string]interface{}: - for key := range value { - nextLevelName := key - nextLevelVal := value[nextLevelName] - nextLevelFullPath := clusterAttributePath + "." + nextLevelName - // There are attributes which has value of type array, no need to process those variables values further - // convert array data into a string (with comma separated elements) and assign the value - if _, ok := constants.ClusterAttributesWithArrayTypeValue[nextLevelFullPath]; ok && nextLevelVal != nil { - inputVariablesMap[nextLevelFullPath] = stringArrayToStringWithCommaSeparatedElements(fmt.Sprintf("%v", nextLevelVal)) - } else { - err = processYamlObjectAndAddToMap(nextLevelVal, nextLevelFullPath, inputVariablesMap) - if err != nil { - return err - } - } - } - case interface{}: - if _, ok := inputVariablesMap[clusterAttributePath]; ok { - log.Warningf("duplicate variable in input cluster class config file, variable path: %v", clusterAttributePath) - } else if fmt.Sprintf("%v", value) != "" { - inputVariablesMap[clusterAttributePath] = value - // if path spec.topology.variables.proxy has any child attributes then enable TKG_HTTP_PROXY_ENABLED, spec.topology.variables.proxy mapped to TKG_HTTP_PROXY_ENABLED - if strings.HasPrefix(clusterAttributePath, "spec.topology.variables.proxy") { - inputVariablesMap["spec.topology.variables.proxy"] = true - } - } else if clusterAttributePath == "spec.topology.variables.vcenter.tlsThumbprint" { - // if tlsThumbprint is empty, then insecure is true - inputVariablesMap["spec.topology.variables.vcenter.insecure"] = true - } - default: - if value != nil { - errInfo := fmt.Errorf("unsupported input value type:%v in input cluster class file attribute at:%v", reflect.TypeOf(value), clusterAttributePath) - return errInfo - } - } - return err -} - -// processYamlObjectArrayInterfaceType process array interface type, does handles some special cases of cluster class attribute paths -func processYamlObjectArrayInterfaceType(value []interface{}, clusterAttributePath string, inputVariablesMap map[string]interface{}) error { - var err error - for index := range value { - if clusterAttributePath == constants.TopologyVariablesNetworkSubnets || clusterAttributePath == constants.TopologyVariablesNodes || clusterAttributePath == constants.TopologyWorkersMachineDeployments { - err = processYamlObjectAndAddToMap(value[index], clusterAttributePath+"."+strconv.Itoa(index), inputVariablesMap) - } else if regExMachineDep.MatchString(clusterAttributePath) || clusterAttributePath == constants.TopologyVariables { - // The attribute paths - spec.topology.workers.machineDeployments.[0-9].variables.overrides, spec.topology.variables - // has array of data, each array element is of type map, with key(as "name")/value (as "value") - // to organize better, get "name" and "value", append "name" value to attribute path and "value" value as value, process them as next level. - variables := value - for varIndex := range variables { - nameValueMap := variables[varIndex].(map[string]interface{}) - varName := nameValueMap["name"] - varValue := nameValueMap["value"] - nextLevelName := clusterAttributePath + "." + varName.(string) - // The attribute path "spec.topology.variables.trust.additionalTrustedCAs.*" has value of type array, each array element is of type map, map has keys - "name" and "data", - // need to process "spec.topology.variables.trust.additionalTrustedCAs."+ (value of "name") as attribute path and value of "data" next level value, process it again. - if varName == "trust" { - trustVal := varValue.(map[string]interface{}) - if cas, ok := trustVal["additionalTrustedCAs"]; ok { - additionalTrustedCAsVarArr := cas.([]interface{}) - nextLevelName += ".additionalTrustedCAs" - for i := range additionalTrustedCAsVarArr { - certName := additionalTrustedCAsVarArr[i].(map[string]interface{})["name"].(string) - certData := additionalTrustedCAsVarArr[i].(map[string]interface{})["data"] - err = processYamlObjectAndAddToMap(certData, nextLevelName+"."+certName, inputVariablesMap) - if err != nil { - return err - } - } - } - continue // we are done processing "trust" variable, so process next variable - } else if varName == "TKR_DATA" { // no need to process TKR_DATA, because there is no mapping as of now - continue - } - err = processYamlObjectAndAddToMap(varValue, nextLevelName, inputVariablesMap) - if err != nil { - return err - } - } - break // all variables are processed in above loop so break it. - } else { - // process specific index value, this index value could be of any type - err = processYamlObjectAndAddToMap(value[index], clusterAttributePath, inputVariablesMap) - } - if err != nil { - return err - } - } - return err -} - -// getProviderNameFromTopologyClassName takes input cluster class spec.topology.class value and validates, returns provides name. -// The Cluster spec.topology.class attribute value should be valid kubernetes object name : it should be string, -// should be splittable with "-", after split, it should have at least 3 parts, second part should be infra provider name - [aws, azure, vsphere, docker] -// eg: tkg-aws-default : infra provider is aws. -// tkg-unknown-cluster1 : this is not valid name, "unknown" is not valid infra provider name. -func getProviderNameFromTopologyClassName(topologyClassValue interface{}) (string, error) { - var provider string - if topologyClassValue == nil || !regExpTopologyClassVal.MatchString(topologyClassValue.(string)) { - return provider, errors.New(constants.TopologyClassIncorrectValueErrMsg) - } - return strings.Split(topologyClassValue.(string), "-")[1], nil -} - -// overrideClusterOptionsWithLatestEnvironmentConfigurationValues overrides CreateClusterOptions attributes with latest values -// from the environment only if environment has value, the variable values in environment could be updated from input config file or input cluster class file. -func (t *tkgctl) overrideClusterOptionsWithLatestEnvironmentConfigurationValues(cc *CreateClusterOptions) { - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterName); err == nil { - cc.ClusterName = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterPlan); err == nil { - cc.Plan = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableNamespace); err == nil { - cc.Namespace = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableInfraProvider); err == nil { - cc.InfrastructureProvider = val - } - if val, err := tkgconfighelper.GetIntegerVariableFromConfig(constants.ConfigVariableControlPlaneMachineCount, t.TKGConfigReaderWriter()); err == nil { - cc.ControlPlaneMachineCount = val - } - if val, err := tkgconfighelper.GetIntegerVariableFromConfig(constants.ConfigVariableWorkerMachineCount, t.TKGConfigReaderWriter()); err == nil { - cc.WorkerMachineCount = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableSize); err == nil { - cc.Size = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableControlPlaneSize); err == nil { - cc.ControlPlaneSize = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableWorkerSize); err == nil { - cc.WorkerSize = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableCNI); err == nil { - cc.CniType = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableEnableClusterOptions); err == nil { - cc.EnableClusterOptions = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereControlPlaneEndpoint); err == nil { - cc.VsphereControlPlaneEndpoint = val - } -} - -// overrideManagementClusterOptionsWithLatestEnvironmentConfigurationValues overrides InitRegion attributes with latest values -// from the environment only if environment has value, the variable values in environment could be updated from input config file or input cluster class file. -func (t *tkgctl) overrideManagementClusterOptionsWithLatestEnvironmentConfigurationValues(ir *InitRegionOptions) { - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterName); err == nil { - ir.ClusterName = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableNamespace); err == nil { - ir.Namespace = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterPlan); err == nil { - ir.Plan = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableInfraProvider); err == nil { - ir.InfrastructureProvider = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableSize); err == nil { - ir.Size = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableControlPlaneSize); err == nil { - ir.ControlPlaneSize = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableWorkerSize); err == nil { - ir.WorkerSize = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableCNI); err == nil { - ir.CniType = val - } - if val, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereControlPlaneEndpoint); err == nil { - ir.VsphereControlPlaneEndpoint = val - } -} - -// GetIPFamilyForGivenClusterNetworkCIDRs takes clusterNetwork's pods CIDRs and service CIDRs, and returns IP family type -// The each input cidrs string can have multiple CIDR's separated with comma (,), but it can not have more than two on each input CIDR string. -// If input CIDR has both ipv6 and ipv4, and if isIPV6Primary is true then the first CIDR should be ipv6, and returns "ipv6,ipv4", else if isIPV6Primary is false then returns "ipv4,ipv6" -// both input CIDRs should be same family -func GetIPFamilyForGivenClusterNetworkCIDRs(podsCIDRs, serviceCIDRs string, isIPV6Primary bool) (string, error) { - DefaultIPFamily := constants.IPv4Family - var podsIPFamily, serviceIPFamily string - var err error - if podsCIDRs != "" { - podsIPFamily, err = GetIPFamilyForGivenCIDRs(strings.Split(podsCIDRs, ","), isIPV6Primary) - if err != nil { - return DefaultIPFamily, err - } - } else { - podsIPFamily = DefaultIPFamily - } - if serviceCIDRs != "" { - serviceIPFamily, err = GetIPFamilyForGivenCIDRs(strings.Split(serviceCIDRs, ","), isIPV6Primary) - if err != nil { - return DefaultIPFamily, err - } - } else { - serviceIPFamily = DefaultIPFamily - } - - // If the IP Family of both CIDRs not same then return error - if serviceIPFamily != podsIPFamily { - return DefaultIPFamily, fmt.Errorf(errMessageCIDRsIPFamiliesNotSame, podsCIDRs, podsIPFamily, serviceCIDRs, serviceIPFamily) - } - return serviceIPFamily, nil -} - -// stringArrayToStringWithCommaSeparatedElements converts given string (which has array data in fmt.Println output format) to string which has array elements separated with comma (,) -// eg: Input string is "[100.96.0.0/11 100.64.0.0/18]" converts to "100.64.0.0/18,100.64.0.0/18" of string type. -func stringArrayToStringWithCommaSeparatedElements(arrayDataInStringFormat string) string { - if arrayDataInStringFormat == "" { - return "" - } - return strings.Join(strings.Split(strings.Trim(arrayDataInStringFormat, "[]"), " "), ",") -} - -// GetIPFamilyForGivenCIDRs takes cidrs array and returns ip family type (ipv4, ipv6 or dual) -// Maximum input cidrs array length is 2 only - "[100.64.0.0/18,100.64.0.0/18]" -// If input cidr's can be ipv4, ipv6 or both. -// if isIPV6Primary is true then the first cidrs value, which is cidrs[0] must be ipv6 otherwise throws error -// if input cidrs has both ipv6 and ipv4 then returns "ipv6,ipv4" only if isIPV6Primary true, otherwise returns "ipv4,ipv6" -// If all input cidr's has only ipv6 then returns "ipv6" -// If all input cidr's has only ipv4 then returns "ipv4" -func GetIPFamilyForGivenCIDRs(cidrs []string, isIPV6Primary bool) (string, error) { - DefaultIPFamily := constants.IPv4Family - if len(cidrs) > 2 { - return DefaultIPFamily, fmt.Errorf("too many CIDRs specified: %v", cidrs) - } - var foundIPv4 bool - var foundIPv6 bool - for i, cidr := range cidrs { - ip, _, err := net.ParseCIDR(cidr) - if err != nil { - return DefaultIPFamily, fmt.Errorf("could not parse CIDR %v, error: %s", cidr, err) - } - if ip.To4() != nil { - foundIPv4 = true - // if isIPV6Primary true, then the first value should be ipv6 family otherwise throw error - if isIPV6Primary && i == 0 { - return DefaultIPFamily, fmt.Errorf(errMessageIPv6EnabledCIDRHasNoIPv6, cidrs) - } - } else { - foundIPv6 = true - } - } - switch { - case foundIPv4 && foundIPv6: - if isIPV6Primary { - return constants.DualStackPrimaryIPv6Family, nil - } - // return "ipv4,ipv6" even first value is ipv6, if isIPV6Primary is false - return constants.DualStackPrimaryIPv4Family, nil - case foundIPv4: - return constants.IPv4Family, nil - case foundIPv6: - return constants.IPv6Family, nil - default: - return DefaultIPFamily, nil - } -} diff --git a/tkg/tkgctl/helpers_test.go b/tkg/tkgctl/helpers_test.go deleted file mode 100644 index bcd5cbd696..0000000000 --- a/tkg/tkgctl/helpers_test.go +++ /dev/null @@ -1,375 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "fmt" - "os" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -var _ = Describe("Cluster Class - IP Family Validation related test cases: ", func() { - var cidrsIpv6Ipv4 string - var cidrsIpv4 string - var cidrsIpv4Ipv6 string - BeforeEach(func() { - cidrsIpv6Ipv4 = "2002::1234:abcd:ffff:c0a8:101/64,100.64.0.0/18" - cidrsIpv4 = "100.96.0.0/12,100.64.0.0/16" - cidrsIpv4Ipv6 = "100.64.0.0/18,2002::1234:abcd:ffff:c0a8:101/64" - }) - Context("GetIPFamilyForGivenCIDRs related test cases", func() { - var isIPV6Primary bool - When("When isIPV6Primary is true ", func() { - BeforeEach(func() { - isIPV6Primary = true - }) - It("first cidr do not have ipv6, should get error:", func() { - _, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrsIpv4, ","), isIPV6Primary) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(errMessageIPv6EnabledCIDRHasNoIPv6, strings.Split(cidrsIpv4, ",")))) - }) - It("first cidr is ipv4 not ipv6, should get error:", func() { - _, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrsIpv4Ipv6, ","), isIPV6Primary) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(fmt.Sprintf(errMessageIPv6EnabledCIDRHasNoIPv6, strings.Split(cidrsIpv4Ipv6, ",")))) - }) - It("first cidr is ipv6, should expect ip family as DualStackPrimaryIPv6Family", func() { - family, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrsIpv6Ipv4, ","), isIPV6Primary) - Expect(err).To(BeNil()) - Expect(constants.DualStackPrimaryIPv6Family).To(Equal(family)) - }) - It("both cidr is ipv6, should expect IP Family as ipv6", func() { - cidr := "2002::1234:abcd:ffff:c0a8:101/64,2002::1234:abcd:ffff:c0a8:101/24" - family, err := GetIPFamilyForGivenCIDRs(strings.Split(cidr, ","), isIPV6Primary) - Expect(err).To(BeNil()) - Expect(constants.IPv6Family).To(Equal(family)) - }) - }) - - When("When isIPV6Primary is false", func() { - BeforeEach(func() { - isIPV6Primary = false - }) - - It("first cidr is ipv6, expect family as DualStackPrimaryIPv4Family", func() { - family, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrsIpv6Ipv4, ","), isIPV6Primary) - Expect(err).To(BeNil()) - Expect(constants.DualStackPrimaryIPv4Family).To(Equal(family)) - }) - It("second cidr is ipv6, expect family as DualStackPrimaryIPv4Family", func() { - family, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrsIpv4Ipv6, ","), isIPV6Primary) - Expect(err).To(BeNil()) - Expect(constants.DualStackPrimaryIPv4Family).To(Equal(family)) - }) - It("first ipv6 value, should return error", func() { - cidrsIpv6Incorrect := "inCorrect2002::1234:abcd:ffff:c0a8:101/64,2002::1234:abcd:ffff:c0a8:101/24" - _, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrsIpv6Incorrect, ","), isIPV6Primary) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("could not parse CIDR")) - }) - It("second ipv6 value, should return error", func() { - cidrsIpv6Incorrect := "2002::1234:abcd:ffff:c0a8:101/64,IN-CORREC-2002::1234:abcd:ffff:c0a8:101/24" - _, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrsIpv6Incorrect, ","), isIPV6Primary) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("could not parse CIDR")) - }) - It("incorrect cidr - first ipv4 value", func() { - cidrsIncorrectFirstValue := "10055.64.0.0/18,100.64.0.0/18" - _, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrsIncorrectFirstValue, ","), isIPV6Primary) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("could not parse CIDR")) - }) - It("When incorrect cidr - second ipv4 value, should return error", func() { - cidrsIncorrectSecondValue := "100.64.0.0/18,10044.64.0.0/18" - _, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrsIncorrectSecondValue, ","), isIPV6Primary) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("could not parse CIDR")) - }) - It("When correct cidr - both are ipv4, should get ipv4 as ip family", func() { - family, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrsIpv4, ","), isIPV6Primary) - Expect(err).To(BeNil()) - Expect(constants.IPv4Family).To(Equal(family)) - }) - It("When correct cidr - only one ipv4 value, ipv4 as ip family", func() { - cidrSingleValue := "100.64.0.0/18" - family, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrSingleValue, ","), isIPV6Primary) - Expect(err).To(BeNil()) - Expect(constants.IPv4Family).To(Equal(family)) - }) - It("When correct cidrs - too many values - three ipv4 values, return error:", func() { - cidrsThreeValues := "100.64.0.0/18,101.64.0.0/18,102.64.0.0/18" - _, err := GetIPFamilyForGivenCIDRs(strings.Split(cidrsThreeValues, ","), isIPV6Primary) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("too many CIDRs specified")) - }) - }) - }) - - Context("stringArrayToStringWithCommaSeparatedElements test cases ", func() { - It("When CIDR values as input, get array of CIDR values:", func() { - cidr := "[100.96.0.0/12 100.64.0.0/16]" - output := stringArrayToStringWithCommaSeparatedElements(cidr) - Expect(output).To(Equal(cidrsIpv4)) - }) - It("When string values, get array of string values:", func() { - cidr := "[str1 str2]" - output := stringArrayToStringWithCommaSeparatedElements(cidr) - Expect(output).To(Equal("str1,str2")) - }) - }) - - Context("Test GetIPFamilyForGivenClusterNetworkCIDRs for given clusterNetwork's pods CIDRs and service CIDRs", func() { - var isIPV6Primary bool - When("When isIPV6Primary is true:", func() { - BeforeEach(func() { - isIPV6Primary = true - }) - - It("all are ipv4, returns error ", func() { - podCIDR := cidrsIpv4 - serviceCIDR := cidrsIpv4 - _, err := GetIPFamilyForGivenClusterNetworkCIDRs(podCIDR, serviceCIDR, isIPV6Primary) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("the isIPV6Primary: true, but the first value in CIDRs")) - }) - It("ipv6 and ipv4, expect DualStackPrimaryIPv6Family", func() { - podCIDR := cidrsIpv6Ipv4 - serviceCIDR := cidrsIpv6Ipv4 - family, err := GetIPFamilyForGivenClusterNetworkCIDRs(podCIDR, serviceCIDR, isIPV6Primary) - Expect(err).To(BeNil()) - Expect(constants.DualStackPrimaryIPv6Family).To(Equal(family)) - }) - }) - - When("When isIPV6Primary is false:", func() { - BeforeEach(func() { - isIPV6Primary = false - }) - It("both ipv4 values, get ipv4 as IP family:", func() { - podCIDR := cidrsIpv4 - serviceCIDR := cidrsIpv4 - family, err := GetIPFamilyForGivenClusterNetworkCIDRs(podCIDR, serviceCIDR, isIPV6Primary) - Expect(err).To(BeNil()) - Expect(constants.IPv4Family).To(Equal(family)) - }) - It("both are ipv6,ipv4, should return ipv4,ipv6 ", func() { - podCIDR := cidrsIpv6Ipv4 - serviceCIDR := cidrsIpv6Ipv4 - family, err := GetIPFamilyForGivenClusterNetworkCIDRs(podCIDR, serviceCIDR, isIPV6Primary) - Expect(err).To(BeNil()) - Expect(constants.DualStackPrimaryIPv4Family).To(Equal(family)) - }) - It("different IP Families, podCIDR has ipv6 and ipv4, service cidr has only ipv4 type: so return error", func() { - podCIDR := cidrsIpv6Ipv4 - serviceCIDR := cidrsIpv4 - _, err := GetIPFamilyForGivenClusterNetworkCIDRs(podCIDR, serviceCIDR, isIPV6Primary) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("both are not same IP Families")) - }) - }) - }) - - Context("Test cases for getProviderNameFromTopologyClassName - validate value of spec.topology.class attribute ", func() { - When("When correct value is provided:", func() { - It("aws provider, return aws as provider:", func() { - cidr := "tkg-aws-default" - provider, err := getProviderNameFromTopologyClassName(cidr) - Expect(provider).To(Equal("aws")) - Expect(err).To(BeNil()) - }) - It("azure provider, return azure as provider:", func() { - cidr := "tkg-azure-default" - provider, err := getProviderNameFromTopologyClassName(cidr) - Expect(provider).To(Equal("azure")) - Expect(err).To(BeNil()) - }) - It("Vsphere provider, return Vsphere as provider:", func() { - cidr := "tkg-vsphere-default" - provider, err := getProviderNameFromTopologyClassName(cidr) - Expect(provider).To(Equal("vsphere")) - Expect(err).To(BeNil()) - }) - }) - When("When incorrect or empty value provided:", func() { - It("empty value, return error", func() { - cidr := "" - _, err := getProviderNameFromTopologyClassName(cidr) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(constants.TopologyClassIncorrectValueErrMsg)) - }) - It("incorrect value, return error", func() { - cidr := "tkg-not-default" - _, err := getProviderNameFromTopologyClassName(cidr) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(constants.TopologyClassIncorrectValueErrMsg)) - }) - }) - }) -}) - -var _ = Describe("Test cases for CheckIfInputFileIsClusterClassBased", func() { - Context("Test cases for CheckIfInputFileIsClusterClassBased", func() { - var ( - configFile string - configFileContent string - isClusterClassBased bool - err error - ) - - JustBeforeEach(func() { - configFile, err = utils.CreateTempFile("", "") - Expect(err).To(BeNil()) - err = utils.SaveFile(configFile, []byte(configFileContent)) - Expect(err).To(BeNil()) - isClusterClassBased, _, err = CheckIfInputFileIsClusterClassBased(configFile) - }) - When("File contains cluster resource with clusterclass defined", func() { - BeforeEach(func() { - configFileContent = `apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: aws-workload-cluster1 - namespace: default -spec: - topology: - class: tkg-aws-default` - }) - It("should return true and error should be nil", func() { - Expect(isClusterClassBased).To(BeTrue()) - Expect(err).NotTo(HaveOccurred()) - }) - }) - When("File contains cluster resource without clusterclass defined", func() { - BeforeEach(func() { - configFileContent = `apiVersion: cluster.x-k8s.io/v1beta1 -kind: Cluster -metadata: - name: aws-workload-cluster1 - namespace: default -spec: - clusterNetwork: - pods: - cidrBlocks: [] -` - }) - It("should return false with error", func() { - Expect(isClusterClassBased).To(BeFalse()) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(constants.ClusterResourceWithoutTopologyNotSupportedErrMsg)) - }) - }) - When("File doesn't contain cluster resource", func() { - BeforeEach(func() { - configFileContent = `` - }) - It("should return false without error", func() { - Expect(isClusterClassBased).To(Equal(false)) - Expect(err).NotTo(HaveOccurred()) - }) - }) - }) -}) - -var _ = Describe("Test cases for setVSphereCredentialFromInputfile", func() { - Context("Test cases for setVSphereCredentialFromInputfile", func() { - var ( - configFile string - configFileContext string - err error - varMap map[string]string - clusterName = "workload" - namespace = "default" - ) - JustBeforeEach(func() { - configFile, err = utils.CreateTempFile("", "cluster-*.yaml") - Expect(err).To(BeNil()) - err = utils.SaveFile(configFile, []byte(configFileContext)) - Expect(err).To(BeNil()) - varMap = make(map[string]string) - err = setVSphereCredentialFromInputfile(&varMap, configFile, clusterName, namespace) - }) - AfterEach(func() { - err = os.Remove(configFile) - Expect(err).To(BeNil()) - }) - When("File contains the same name/namespace secret and data format is correct", func() { - BeforeEach(func() { - configFileContext = ` -apiVersion: v1 -kind: Secret -metadata: - name: workload - namespace: default -stringData: - password: Admin!23 - username: administrator@vsphere.local -` - }) - It("VSPHERE_USERNAME and VSPHERE_PASSWORD should be set in the map", func() { - Expect(err).To(BeNil()) - Expect(varMap[constants.ConfigVariableVsphereUsername]).To(Equal("administrator@vsphere.local")) - Expect(varMap[constants.ConfigVariableVspherePassword]).To(Equal("Admin!23")) - }) - }) - When("File does not contain the same name/namespace secret", func() { - BeforeEach(func() { - configFileContext = ` -apiVersion: v1 -kind: Secret -metadata: - name: workload-2 - namespace: default -stringData: - password: Admin!23 - username: administrator@vsphere.local -` - }) - It("", func() { - Expect(err).NotTo(BeNil()) - Expect(err.Error()).To(ContainSubstring("Secret default/workload not found")) - }) - }) - When("Field stringData.password does not exist", func() { - BeforeEach(func() { - configFileContext = ` -apiVersion: v1 -kind: Secret -metadata: - name: workload - namespace: default -stringData: - username: administrator@vsphere.local -` - }) - It("", func() { - Expect(err).NotTo(BeNil()) - Expect(err.Error()).To(ContainSubstring("stringData.password not found")) - }) - }) - When("Field stringData.username is not string", func() { - BeforeEach(func() { - configFileContext = ` -apiVersion: v1 -kind: Secret -metadata: - name: workload - namespace: default -stringData: - password: Admin!23 - username: 234 -` - }) - It("", func() { - Expect(err).NotTo(BeNil()) - Expect(err.Error()).To(ContainSubstring("Failed to parse stringData.username")) - }) - }) - }) -}) diff --git a/tkg/tkgctl/init.go b/tkg/tkgctl/init.go deleted file mode 100644 index 5285c0f6b0..0000000000 --- a/tkg/tkgctl/init.go +++ /dev/null @@ -1,377 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "fmt" - "os" - "strconv" - "time" - - "github.com/pkg/errors" - "github.com/skratchdot/open-golang/open" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server" -) - -// InitRegionOptions init region options -type InitRegionOptions struct { - ClusterConfigFile string - Plan string - ClusterName string - CoreProvider string - BootstrapProvider string - InfrastructureProvider string - ControlPlaneProvider string - Namespace string - WatchingNamespace string - Size string - ControlPlaneSize string - WorkerSize string - CeipOptIn string - CniType string - Bind string - Browser string - VsphereControlPlaneEndpoint string - Edition string - AdditionalTKGManifests string - FeatureFlags map[string]string - Timeout time.Duration - UI bool - UseExistingCluster bool - EnableTKGSOnVsphere7 bool - DeployTKGonVsphere7 bool - SkipPrompt bool - GenerateOnly bool -} - -const ( - TCEBuildEdition = "tce" -) - -// Init initializes tkg management cluster -// -//nolint:gocritic,gocyclo,funlen -func (t *tkgctl) Init(options InitRegionOptions) error { - var err error - options.ClusterConfigFile, err = t.ensureClusterConfigFile(options.ClusterConfigFile) - if err != nil { - return err - } - - err = ensureConfigImages(t.configDir, t.tkgConfigUpdaterClient) - if err != nil { - return err - } - - err = t.configureInitManagementClusterOptionsFromConfigFile(&options) - if err != nil { - return err - } - - ceipOptIn, err := strconv.ParseBool(options.CeipOptIn) - if err != nil { - if options.Edition == TCEBuildEdition { - ceipOptIn = false - } else { - ceipOptIn = true - } - } - - if logPath, err := t.getAuditLogPath(options.ClusterName); err == nil { - log.SetAuditLog(logPath) - } - - options.CoreProvider, options.BootstrapProvider, options.ControlPlaneProvider, err = t.tkgBomClient.GetDefaultClusterAPIProviders() - if err != nil { - return err - } - - // init requires minimum 15 minutes timeout - minTimeoutReq := 15 * time.Minute - if options.Timeout < minTimeoutReq { - log.V(6).Infof("timeout duration of at least 15 minutes is required, using default timeout %v", constants.DefaultLongRunningOperationTimeout) - options.Timeout = constants.DefaultLongRunningOperationTimeout - } - defer t.restoreAfterSettingTimeout(options.Timeout)() - - // validate docker only if user is not using an existing cluster - log.Infof("\nValidating the pre-requisites...") - - isInputFileClusterClassBased, err := t.processManagementClusterInputFile(&options) - if err == nil && isInputFileClusterClassBased { - return errors.New("creating management cluster using ClusterClass based configuration file is not yet supported. Please use legacy configuration file when creating management cluster") - } - - if err := t.tkgClient.ValidatePrerequisites(!options.UseExistingCluster, true); err != nil { - return err - } - - nodeSizeOptions := client.NodeSizeOptions{ - Size: options.Size, - ControlPlaneSize: options.ControlPlaneSize, - WorkerSize: options.WorkerSize, - } - - optionsIR := t.populateClientInitRegionOptions(&options, nodeSizeOptions, ceipOptIn) - optionsIR.IsInputFileClusterClassBased = isInputFileClusterClassBased - - // Forbid calico management-cluster creation - // TODO: _ALLOW_CALICO_ON_MANAGEMENT_CLUSTER parameter is just used for internal debugging. - // After the migration from calico to antrea management-cluster is done, it will be removed. - if optionsIR.CniType == "calico" && os.Getenv("_ALLOW_CALICO_ON_MANAGEMENT_CLUSTER") != "true" { - return errors.Errorf("Calico management-cluster creation is forbidden...") - } - // take the provided hidden flags and enable the related feature flags - t.tkgClient.ParseHiddenArgsAsFeatureFlags(&optionsIR) - - // save the feature flags to the config file before launching UI - err = t.tkgClient.SaveFeatureFlags(optionsIR.FeatureFlags) - if err != nil { - log.Error(err, "Failed to save feature flag options.") - } - - if optionsIR.LaunchUI { - err := server.Serve(optionsIR, t.appConfig, t.TKGConfigReaderWriter(), options.Timeout, options.Bind, options.Browser) - if err != nil { - return errors.Wrap(err, "failed to start Kickstart UI") - } - } else { - providerName, _, err := client.ParseProviderName(optionsIR.InfrastructureProvider) - if err != nil { - return errors.Wrap(err, "unable to parse provider name") - } - if providerName == "vsphere" { - err := t.verifyThumbprint(options.SkipPrompt) - if err != nil { - return err - } - vcClient, err := t.tkgClient.GetVSphereEndpoint(nil) - if err != nil { - return errors.Wrap(err, "unable to verify vSphere credentials") - } - validateErr := client.ValidateVSphereVersion(vcClient) - if validateErr != nil { - switch validateErr.Code { - case client.PacificInVC7ErrorCode: - shouldContinueDeployment, err := t.validationActionForVSphereVersion(true, &options) - if !shouldContinueDeployment { - return err - } - case client.PacificNotInVC7ErrorCode: - shouldContinueDeployment, err := t.validationActionForVSphereVersion(false, &options) - if !shouldContinueDeployment { - return err - } - default: - return errors.Wrap(validateErr, "configuration validation failed") - } - } - } - - validateErr := t.tkgClient.ConfigureAndValidateManagementClusterConfiguration(&optionsIR, false) - if validateErr != nil { - return errors.Wrap(validateErr, "configuration validation failed") - } - - if options.GenerateOnly { - if manifest, err := t.tkgClient.InitRegionDryRun(&optionsIR); err != nil { - return errors.Wrap(err, "failed generating management cluster manifest") - } else if _, err = os.Stdout.Write(manifest); err != nil { - return errors.Wrap(err, "Failed writing management cluster manifest to stdout") - } - } else { - log.Infof("\nSetting up management cluster...\n") - err = t.tkgClient.InitRegion(&optionsIR) - if err != nil { - return errors.Wrap(err, "unable to set up management cluster") - } - logManagementCreationSuccess() - } - } - return nil -} - -// validationActionForVSphereVersion acts on vSphere version validations -func (t *tkgctl) validationActionForVSphereVersion(isVsphereWithKubernetes bool, options *InitRegionOptions) (bool, error) { - shouldContinueDeployment := false - vcHost, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereServer) - if err != nil { - return shouldContinueDeployment, errors.Errorf("failed to get %s", constants.ConfigVariableVsphereServer) - } - url := fmt.Sprintf("https://%s/ui/app/workload-platform/", vcHost) - - // display the warning message - if isVsphereWithKubernetes { - log.Warning(Warningvsphere7WithPacific) - } else { - log.Warning(Warningvsphere7WithoutPacific) - } - - // action based on command line option with out prompt - if options.EnableTKGSOnVsphere7 { - shouldContinueDeployment = false - if err = open.Run(url); err != nil { - log.Error(err, "unable to open browser") - return shouldContinueDeployment, errors.Wrap(err, "unable to open browser") - } - log.Info("Continue configuring Tanzu Kubernetes Grid Service on vSphere 7.0 using browser...") - return shouldContinueDeployment, nil - } - - if options.DeployTKGonVsphere7 { - log.Info("Deploying TKG management cluster on vSphere 7.0 ...") - shouldContinueDeployment = true - return shouldContinueDeployment, nil - } - log.Warning("Note: To skip the prompts and directly deploy a non-integrated Tanzu Kubernetes Grid instance on vSphere 7.0, you can set the 'DEPLOY_TKG_ON_VSPHERE7' configuration variable to 'true' \n\n") - // prompt user and ask for confirmation - err = askForConfirmation("Do you want to configure vSphere with Tanzu?") - if err == nil { - shouldContinueDeployment = false - if err := open.Run(url); err != nil { - log.Error(err, "unable to open browser") - return shouldContinueDeployment, errors.Wrap(err, "unable to open browser") - } - log.Info("Continue configuring Tanzu Kubernetes Grid Service on vSphere 7.0 using browser...") - return shouldContinueDeployment, nil - } - - err = askForConfirmation("Would you like to deploy a non-integrated Tanzu Kubernetes Grid management cluster on vSphere 7.0?") - if err != nil { - shouldContinueDeployment = false - return shouldContinueDeployment, nil - } - - log.Info("Deploying TKG management cluster on vSphere 7.0 ...") - shouldContinueDeployment = true - return shouldContinueDeployment, nil -} - -//nolint:gocyclo -func (t *tkgctl) configureInitManagementClusterOptionsFromConfigFile(iro *InitRegionOptions) error { - // set ClusterName from config variable - if iro.ClusterName == "" { - clusterName, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterName) - if err == nil { - iro.ClusterName = clusterName - } - } - - // set InfrastructureProvider from config variable - if iro.InfrastructureProvider == "" { - infraProvider, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableInfraProvider) - if err == nil { - iro.InfrastructureProvider = infraProvider - } - } - - // set Size variable from config File - if iro.Size == "" { - size, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableSize) - if err == nil { - iro.Size = size - } - } - - // set ControlPlaneSize variable from config File - if iro.ControlPlaneSize == "" { - controlPlaneSize, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableControlPlaneSize) - if err == nil { - iro.ControlPlaneSize = controlPlaneSize - } - } - - // set WorkerSize variable from config File - if iro.WorkerSize == "" { - workerSize, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableWorkerSize) - if err == nil { - iro.WorkerSize = workerSize - } - } - - // set Plan from config variable - if iro.Plan == "" { - plan, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableClusterPlan) - if err == nil { - iro.Plan = plan - } - } - - // set BuildEdition from config variable - if iro.Edition == "" { - edition, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableBuildEdition) - if err == nil { - iro.Edition = edition - } - } - - // set vSphereControlPlaneEndpoint from config variable - if iro.VsphereControlPlaneEndpoint == "" { - vSphereControlPlaneEndpoint, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableVsphereControlPlaneEndpoint) - if err == nil { - iro.VsphereControlPlaneEndpoint = vSphereControlPlaneEndpoint - } - } - - // set DeployTKGonVsphere7 from config variable - if !iro.DeployTKGonVsphere7 { - deployTKGonVsphere7, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableDeployTKGOnVsphere7) - if err == nil { - iro.DeployTKGonVsphere7, _ = strconv.ParseBool(deployTKGonVsphere7) - } - } - - // set EnableTKGSOnVsphere7 from config variable - if !iro.EnableTKGSOnVsphere7 { - enableTKGSOnVsphere7, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableEnableTKGSonVsphere7) - if err == nil { - iro.EnableTKGSOnVsphere7, _ = strconv.ParseBool(enableTKGSOnVsphere7) - } - } - - // set ceip participation from config variable - if iro.CeipOptIn == "" { - iro.CeipOptIn = t.setCEIPOptinBasedOnConfigAndBuildEdition(iro.Edition) - } - - log.V(5).Infof("CEIP Opt-in status: %s", iro.CeipOptIn) - - return nil -} - -func (t *tkgctl) populateClientInitRegionOptions(options *InitRegionOptions, nodeSizeOptions client.NodeSizeOptions, ceipOptIn bool) client.InitRegionOptions { - return client.InitRegionOptions{ - ClusterConfigFile: options.ClusterConfigFile, - Kubeconfig: t.kubeconfig, - Plan: options.Plan, - LaunchUI: options.UI, - ClusterName: options.ClusterName, - UseExistingCluster: options.UseExistingCluster, - InfrastructureProvider: options.InfrastructureProvider, - ControlPlaneProvider: options.ControlPlaneProvider, - BootstrapProvider: options.BootstrapProvider, - CoreProvider: options.CoreProvider, - Namespace: options.Namespace, - NodeSizeOptions: nodeSizeOptions, - CeipOptIn: ceipOptIn, - CniType: options.CniType, - FeatureFlags: options.FeatureFlags, - VsphereControlPlaneEndpoint: options.VsphereControlPlaneEndpoint, - Edition: options.Edition, - AdditionalTKGManifests: options.AdditionalTKGManifests, - GenerateOnly: options.GenerateOnly, - } -} - -func logManagementCreationSuccess() { - log.Infof("\nManagement cluster created!\n\n") - log.Info("\nYou can now create your first workload cluster by running the following:\n\n") - log.Info(" tanzu cluster create [name] -f [file]\n\n") - log.Info("\nSome addons might be getting installed! Check their status by running the following:\n\n") - log.Info(" kubectl get apps -A\n\n") -} diff --git a/tkg/tkgctl/init_test.go b/tkg/tkgctl/init_test.go deleted file mode 100644 index 7e5278fd7f..0000000000 --- a/tkg/tkgctl/init_test.go +++ /dev/null @@ -1,68 +0,0 @@ -package tkgctl - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Init", func() { - var ( - tkgClient *fakes.Client - tkgconfigreaderwriter *fakes.TKGConfigReaderWriter - initRegionOptions InitRegionOptions - err error - tkgctlClient *tkgctl - tkgConfigUpdaterClient *fakes.TKGConfigUpdaterClient - tkgBomClient *fakes.TKGConfigBomClient - ) - - BeforeEach(func() { - tkgClient = &fakes.Client{} - tkgconfigreaderwriter = &fakes.TKGConfigReaderWriter{} - tkgConfigUpdaterClient = &fakes.TKGConfigUpdaterClient{} - tkgBomClient = &fakes.TKGConfigBomClient{} - - tkgctlClient = &tkgctl{ - tkgClient: tkgClient, - tkgConfigReaderWriter: tkgconfigreaderwriter, - tkgConfigUpdaterClient: tkgConfigUpdaterClient, - tkgBomClient: tkgBomClient, - } - initRegionOptions = InitRegionOptions{ - Plan: "dev", - ClusterName: "foobar", - InfrastructureProvider: "FOOBAR", - CniType: "calico", - UseExistingCluster: true, - UI: false, - ClusterConfigFile: "../fakes/config/config.yaml", - } - - }) - - Context("When _ALLOW_CALICO_ON_MANAGEMENT_CLUSTER is not set", func() { - It("should return an error", func() { - err = tkgctlClient.Init(initRegionOptions) - Expect(err.Error()).To(Equal("Calico management-cluster creation is forbidden...")) - }) - }) - - Context("When _ALLOW_CALICO_ON_MANAGEMENT_CLUSTER is set", func() { - BeforeEach(func() { - os.Setenv("_ALLOW_CALICO_ON_MANAGEMENT_CLUSTER", "true") - }) - - It("should succeed", func() { - err = tkgctlClient.Init(initRegionOptions) - Expect(err).ToNot(HaveOccurred()) - }) - - AfterEach(func() { - os.Unsetenv("_ALLOW_CALICO_ON_MANAGEMENT_CLUSTER") - }) - }) -}) diff --git a/tkg/tkgctl/interface.go b/tkg/tkgctl/interface.go deleted file mode 100644 index 54076e9e0d..0000000000 --- a/tkg/tkgctl/interface.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - capiv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" - - runv1alpha1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha1" - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" -) - -// TKGClient implements TKG client -type TKGClient interface { - // AddRegion adds region - AddRegion(options AddRegionOptions) error - // ConfigCluster prints cluster template to stdout - ConfigCluster(configClusterOption CreateClusterOptions) error - // CreateAWSCloudFormationStack create aws cloud formation stack - CreateAWSCloudFormationStack(clusterConfigFile string) error - // CreateCluster create tkg cluster - CreateCluster(cc CreateClusterOptions) error - // DeleteCluster deletes workload cluster - DeleteCluster(options DeleteClustersOptions) error - // DeleteMachineHealthCheck deletes MHC on cluster - DeleteMachineHealthCheck(options DeleteMachineHealthCheckOptions) error - // DeleteRegion deletes management cluster - DeleteRegion(options DeleteRegionOptions) error - // GetCEIP returns CEIP status set on management cluster - GetCEIP() (client.ClusterCeipInfo, error) - // GetClusters returns list of cluster - GetClusters(options ListTKGClustersOptions) ([]client.ClusterInfo, error) - // DescribeCluster describes all the objects in the Cluster - DescribeCluster(options DescribeTKGClustersOptions) (DescribeClusterResult, error) - // DescribeProviders describes all the installed providers - DescribeProviders() (*clusterctlv1.ProviderList, error) - // GenerateAWSCloudFormationTemplate generates a YAML template for AWS CloudFormation - GenerateAWSCloudFormationTemplate(clusterConfigFile string) (string, error) - // GetCredentials saves cluster credentials to a file - GetCredentials(options GetWorkloadClusterCredentialsOptions) error - // GetKubernetesVersions returns supported k8s versions - GetKubernetesVersions() (*client.KubernetesVersionsInfo, error) - // GetMachineHealthCheck return machinehealthcheck configuration for the cluster - GetMachineHealthCheck(options GetMachineHealthCheckOptions) ([]client.MachineHealthCheck, error) - // GetRegions return list of management clusters - GetRegions(managementClusterName string) ([]region.RegionContext, error) - // Init initializes tkg management cluster - Init(options InitRegionOptions) error - // ScaleCluster scales cluster - ScaleCluster(options ScaleClusterOptions) error - // SetCeip sets CEIP to the management cluster - SetCeip(ceipOptIn, isProd, labels string) error - // SetMachineHealthCheck apply machine health check to the cluster - SetMachineHealthCheck(options SetMachineHealthCheckOptions) error - // GetMachineDeployments gets machine deployments from a cluster - GetMachineDeployments(options client.GetMachineDeploymentOptions) ([]capi.MachineDeployment, error) - // SetMachineDeployment applies a machine deployment to the cluster - SetMachineDeployment(options *client.SetMachineDeploymentOptions) error - // DeleteMachineDeployment deletes a machine deployment from the cluster - DeleteMachineDeployment(options client.DeleteMachineDeploymentOptions) error - // SetRegion sets active management cluster - SetRegion(options SetRegionOptions) error - // UpgradeCluster upgrade tkg workload cluster - UpgradeCluster(options UpgradeClusterOptions) error - // UpgradeRegion upgrades management cluster - UpgradeRegion(options UpgradeRegionOptions) error - // Updates management cluster - UpdateCredentialsRegion(options UpdateCredentialsRegionOptions) error - // Updates workload cluster - UpdateCredentialsCluster(options UpdateCredentialsClusterOptions) error - // GetClusterPinnipedInfo returns the cluster and pinniped info - GetClusterPinnipedInfo(options GetClusterPinnipedInfoOptions) (*client.ClusterPinnipedInfo, error) - // GetTanzuKubernetesReleases returns the available TanzuKubernetesReleases - // Deprecated: This would not be supported from TKR API version v1alpha3, - // user can use go client to get TKR - GetTanzuKubernetesReleases(tkrName string) ([]runv1alpha1.TanzuKubernetesRelease, error) - // ActivateTanzuKubernetesReleases activates TanzuKubernetesRelease - // Deprecated: This would not be supported from TKR API version v1alpha3, - // user can use go client to set the labels to activate/deactivate the TKR - ActivateTanzuKubernetesReleases(tkrName string) error - // DeactivateTanzuKubernetesReleases deactivates TanzuKubernetesRelease - // Deprecated: This would not be supported from TKR API version v1alpha3, - // user can use go client to set the labels to activate/deactivate the TKR - DeactivateTanzuKubernetesReleases(tkrName string) error - // IsPacificRegionalCluster checks if the cluster pointed to by kubeconfig is Pacific management cluster(supervisor) - IsPacificRegionalCluster() (bool, error) - // GetPacificClusterObject gets Pacific cluster object - GetPacificClusterObject(clusterName, namespace string) (*tkgsv1alpha2.TanzuKubernetesCluster, error) - // GetPacificMachineDeployments gets machine deployments from a Pacific cluster - // Note: This would be soon deprecated after TKGS and TKGm adopt the clusterclass - GetPacificMachineDeployments(options client.GetMachineDeploymentOptions) ([]capiv1alpha3.MachineDeployment, error) - // FeatureGateHelper returns feature gate helper to query feature gate - FeatureGateHelper() FeatureGateHelper -} diff --git a/tkg/tkgctl/machine_deployment.go b/tkg/tkgctl/machine_deployment.go deleted file mode 100644 index b35fc28593..0000000000 --- a/tkg/tkgctl/machine_deployment.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - capiv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - capi "sigs.k8s.io/cluster-api/api/v1beta1" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" -) - -func (c *tkgctl) GetMachineDeployments(options client.GetMachineDeploymentOptions) ([]capi.MachineDeployment, error) { - return c.tkgClient.GetMachineDeployments(options) -} - -// GetPacificMachineDeployments returns the MachineDeployments of Pacific(TKGS) TKC cluster -// This is defined separately for Pacific (TKGS) provider because the TKGS and TKGm CAPI versions could be different -// and this should be deprecated after clusterclass is adopted by both TKGm and TKGS -func (c *tkgctl) GetPacificMachineDeployments(options client.GetMachineDeploymentOptions) ([]capiv1alpha3.MachineDeployment, error) { - return c.tkgClient.GetPacificMachineDeployments(options) -} - -func (c *tkgctl) SetMachineDeployment(options *client.SetMachineDeploymentOptions) error { - if err := c.tkgClient.SetMachineDeployment(options); err != nil { - return err - } - return nil -} - -func (c *tkgctl) DeleteMachineDeployment(options client.DeleteMachineDeploymentOptions) error { - if err := c.tkgClient.DeleteMachineDeployment(options); err != nil { - return err - } - return nil -} diff --git a/tkg/tkgctl/machine_health_check_test.go b/tkg/tkgctl/machine_health_check_test.go deleted file mode 100644 index cf8489b861..0000000000 --- a/tkg/tkgctl/machine_health_check_test.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "os" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakeproviders "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/providers" -) - -var _ = Describe("Unit tests for delete machine health check", func() { - var ( - ctl *tkgctl - tkgClient = &fakes.Client{} - err error - configDir string - ) - - JustBeforeEach(func() { - configDir, err = os.MkdirTemp("", "test") - err = os.MkdirAll(testingDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - prepareConfiDir(configDir) - options := Options{ - ConfigDir: configDir, - ProviderGetter: fakeproviders.FakeProviderGetter(), - } - c, createErr := New(options) - Expect(createErr).ToNot(HaveOccurred()) - ctl, _ = c.(*tkgctl) - ctl.tkgClient = tkgClient - }) - Context("When deleting existing mhc", func() { - It("should not return an error", func() { - tkgClient.DeleteMachineHealthCheckReturns(nil) - ops := DeleteMachineHealthCheckOptions{ - SkipPrompt: true, - ClusterName: "my-cluster", - } - err = ctl.DeleteMachineHealthCheck(ops) - Expect(err).ToNot(HaveOccurred()) - }) - }) - Context("When deleting non-existing mhc", func() { - It("should return an error", func() { - tkgClient.DeleteMachineHealthCheckReturns(errors.New("not found")) - ops := DeleteMachineHealthCheckOptions{ - SkipPrompt: true, - ClusterName: "my-cluster", - } - err = ctl.DeleteMachineHealthCheck(ops) - Expect(err).To(HaveOccurred()) - }) - }) - Context("When getting mhc objects", func() { - It("should not return an error", func() { - tkgClient.GetMachineHealthChecksReturns(nil, nil) - ops := GetMachineHealthCheckOptions{ - ClusterName: "my-cluster", - } - _, err = ctl.GetMachineHealthCheck(ops) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("When setting mhc object", func() { - It("should not return an error", func() { - tkgClient.SetMachineHealthCheckReturns(nil) - ops := SetMachineHealthCheckOptions{ - ClusterName: "my-cluster", - MachineHealthCheckName: "my-mhc", - Namespace: "my-namespace", - MatchLabels: "label1:value1,label2:value2", - } - err = ctl.SetMachineHealthCheck(ops) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - AfterEach(func() { - os.Remove(configDir) - }) -}) diff --git a/tkg/tkgctl/pacific_cluster.go b/tkg/tkgctl/pacific_cluster.go deleted file mode 100644 index 17c9d2303b..0000000000 --- a/tkg/tkgctl/pacific_cluster.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - tkgsv1alpha2 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha2" -) - -// GetPacificClusterObject return Pacific cluster object -func (t *tkgctl) GetPacificClusterObject(clusterName, namespace string) (*tkgsv1alpha2.TanzuKubernetesCluster, error) { - return t.tkgClient.GetPacificClusterObject(clusterName, namespace) -} - -// GetPacificClusterObject checks if the cluster pointed to by kubeconfig is Pacific management cluster(supervisor) -func (t *tkgctl) IsPacificRegionalCluster() (bool, error) { - return t.tkgClient.IsPacificRegionalCluster() -} diff --git a/tkg/tkgctl/region_test.go b/tkg/tkgctl/region_test.go deleted file mode 100644 index 08105b4220..0000000000 --- a/tkg/tkgctl/region_test.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" -) - -var _ = Describe("Unit tests for add region", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - options AddRegionOptions - err error - ) - - JustBeforeEach(func() { - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - } - err = ctl.AddRegion(options) - }) - - Context("When the given cluster is not a management cluster", func() { - BeforeEach(func() { - options = AddRegionOptions{ - Overwrite: true, - UseDirectReference: true, - } - tkgClient.VerifyRegionReturns(region.RegionContext{}, errors.New("not a mgmt cluster")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("When the same mgmt cluster is already added", func() { - BeforeEach(func() { - options = AddRegionOptions{ - Overwrite: true, - UseDirectReference: true, - } - tkgClient.VerifyRegionReturns(region.RegionContext{}, nil) - tkgClient.AddRegionContextReturns(errors.New("mgmt cluster already exists")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("When mgmt context is overwritten", func() { - BeforeEach(func() { - options = AddRegionOptions{ - Overwrite: true, - UseDirectReference: true, - } - tkgClient.VerifyRegionReturns(region.RegionContext{}, nil) - tkgClient.AddRegionContextReturns(nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("When new mgmt context is added", func() { - BeforeEach(func() { - options = AddRegionOptions{ - Overwrite: false, - UseDirectReference: true, - } - tkgClient.VerifyRegionReturns(region.RegionContext{}, nil) - tkgClient.AddRegionContextReturns(nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Unit test for set region", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - options SetRegionOptions - err error - ) - - JustBeforeEach(func() { - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - } - options = SetRegionOptions{ - ClusterName: "my-cluster", - } - err = ctl.SetRegion(options) - }) - Context("when region does not exist", func() { - BeforeEach(func() { - tkgClient.SetRegionContextReturns(errors.New("region not found")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("when region exists", func() { - BeforeEach(func() { - tkgClient.SetRegionContextReturns(nil) - }) - It("should rnot eturn an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Unit test for get region", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - - err error - ) - - JustBeforeEach(func() { - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - } - _, err = ctl.GetRegions("mgmt-cluster-name") - }) - Context("when failed to list the regions", func() { - BeforeEach(func() { - tkgClient.GetRegionContextsReturns(nil, errors.New("region not found")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("when region exists", func() { - BeforeEach(func() { - tkgClient.GetRegionContextsReturns(nil, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) - -var _ = Describe("Unit test for delete region", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - ops = DeleteRegionOptions{ - ClusterName: "my-cluster", - SkipPrompt: true, - Timeout: time.Minute * 30, - } - err error - ) - - JustBeforeEach(func() { - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: "./kube", - } - err = ctl.DeleteRegion(ops) - }) - - Context("when failed to delete region", func() { - BeforeEach(func() { - tkgClient.DeleteRegionReturns(errors.New("region not found")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("when it is able to delete region", func() { - BeforeEach(func() { - tkgClient.DeleteRegionReturns(nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) diff --git a/tkg/tkgctl/scale_cluster.go b/tkg/tkgctl/scale_cluster.go deleted file mode 100644 index 031466b4d5..0000000000 --- a/tkg/tkgctl/scale_cluster.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// ScaleClusterOptions options that can be passed while scaling a cluster -type ScaleClusterOptions struct { - ClusterName string - WorkerCount int32 - ControlPlaneCount int32 - Namespace string - NodePoolName string -} - -// ScaleCluster scales cluster -func (t *tkgctl) ScaleCluster(options ScaleClusterOptions) error { - if options.Namespace == "" { - options.Namespace = constants.DefaultNamespace - } - - if options.ControlPlaneCount <= 0 && options.WorkerCount <= 0 { - return errors.New("incorrect machine counts provided. Machine count value for control-plane and workers must be greater than 0") - } - - scaleClusterOptions := client.ScaleClusterOptions{ - Kubeconfig: t.kubeconfig, - Namespace: options.Namespace, - ClusterName: options.ClusterName, - WorkerCount: options.WorkerCount, - ControlPlaneCount: options.ControlPlaneCount, - NodePoolName: options.NodePoolName, - } - - err := t.tkgClient.ScaleCluster(scaleClusterOptions) - if err != nil { - return err - } - - log.Infof("Workload cluster '%s' is being scaled\n", scaleClusterOptions.ClusterName) - return nil -} diff --git a/tkg/tkgctl/scale_cluster_test.go b/tkg/tkgctl/scale_cluster_test.go deleted file mode 100644 index 09a89e4f81..0000000000 --- a/tkg/tkgctl/scale_cluster_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit test for scale cluster", func() { - var ( - ctl tkgctl - tkgClient = &fakes.Client{} - ops = ScaleClusterOptions{ - ClusterName: "my-cluster", - } - err error - ) - - JustBeforeEach(func() { - ctl = tkgctl{ - configDir: testingDir, - tkgClient: tkgClient, - kubeconfig: "./kube", - } - err = ctl.ScaleCluster(ops) - }) - - Context("when node count is less than zero", func() { - BeforeEach(func() { - ops.ControlPlaneCount = -1 - ops.WorkerCount = -1 - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("when failed to scale the cluster", func() { - BeforeEach(func() { - ops.ControlPlaneCount = 1 - ops.WorkerCount = 1 - tkgClient.ScaleClusterReturns(errors.New("region not found")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("when it is able to scale the cluster", func() { - BeforeEach(func() { - ops.ControlPlaneCount = 1 - ops.WorkerCount = 1 - tkgClient.ScaleClusterReturns(nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) -}) diff --git a/tkg/tkgctl/set_ceip.go b/tkg/tkgctl/set_ceip.go deleted file mode 100644 index 6bb076ac4a..0000000000 --- a/tkg/tkgctl/set_ceip.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "regexp" - "strconv" - "strings" - - "github.com/pkg/errors" -) - -// SetCeip sets CEIP to the management cluster -func (t *tkgctl) SetCeip(ceipOptIn, isProd, labels string) error { - ceipOptInBool, err := strconv.ParseBool(ceipOptIn) - if err != nil { - return errors.Errorf("cannot parse provided boolean argument, '%s'. Expected 'true' or 'false'", ceipOptIn) - } - if err := isValidLabels(labels); err != nil { - return err - } - err = t.tkgClient.SetCEIPParticipation(ceipOptInBool, isProd, labels) - if err != nil { - return err - } - return nil -} - -func isValidLabels(labels string) error { - if labels == "" { - return nil - } - - re := regexp.MustCompile("^[a-zA-Z0-9]*$") - individualLabels, err := convertLabelsToMap(labels) - if err != nil { - return err - } - - if val, ok := individualLabels["entitlement-account-number"]; ok { - if !re.MatchString(val) { - return errors.Errorf("entitlement-account-number: %s cannot contain special characters", val) - } - } - - if val, ok := individualLabels["env-type"]; ok { - supportedEnvironmentTypes := getSupportedEnvironmentTypes() - if _, ok := supportedEnvironmentTypes[val]; !ok { - return errors.Errorf("Invalid error type %s, environment type can be production, development, or test", val) - } - } - - return nil -} - -func convertLabelsToMap(labels string) (map[string]string, error) { - labelArr := strings.Split(labels, ",") - permittedNumberOfLabels := 2 - if len(labelArr) > permittedNumberOfLabels { - return nil, errors.Errorf("There are more labels provided than are currently supported. The supported labels are entitlement-account-number,and env-type") - } - individualLabels := make(map[string]string) - for i := range labelArr { - keyVal := strings.Split(labelArr[i], "=") - if len(keyVal) != permittedNumberOfLabels { - return nil, errors.Errorf("The individual labels are formed incorrectly, use -h to add them correctly") - } - if keyVal[0] != "entitlement-account-number" && keyVal[0] != "env-type" { - return nil, errors.Errorf("Incorrect key provided, the currently supported keys are entitlement-account-number, and env-type") - } - individualLabels[keyVal[0]] = keyVal[1] - } - return individualLabels, nil -} - -func getSupportedEnvironmentTypes() map[string]bool { - supportedEnvironmentTypes := make(map[string]bool) - supportedEnvironmentTypes["production"] = true - supportedEnvironmentTypes["development"] = true - supportedEnvironmentTypes["test"] = true - - return supportedEnvironmentTypes -} diff --git a/tkg/tkgctl/set_machine_health_check.go b/tkg/tkgctl/set_machine_health_check.go deleted file mode 100644 index 3375d50d46..0000000000 --- a/tkg/tkgctl/set_machine_health_check.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "strings" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// SetMachineHealthCheckOptions options that can be passed while setting machine healthcheck of a cluster -type SetMachineHealthCheckOptions struct { - ClusterName string - MachineHealthCheckName string - Namespace string - MatchLabels string - UnhealthyConditions string - NodeStartupTimeout string -} - -// SetMachineHealthCheck apply machine health check to the cluster -// -//nolint:gocritic -func (t *tkgctl) SetMachineHealthCheck(options SetMachineHealthCheckOptions) error { - optionsSMHC := client.SetMachineHealthCheckOptions{ - ClusterName: options.ClusterName, - MachineHealthCheckName: options.MachineHealthCheckName, - Namespace: options.Namespace, - NodeStartupTimeout: options.NodeStartupTimeout, - } - - if options.MatchLabels != "" { - optionsSMHC.MatchLables = strings.Split(options.MatchLabels, ",") - } - - if options.UnhealthyConditions != "" { - optionsSMHC.UnhealthyConditions = strings.Split(options.UnhealthyConditions, ",") - } - - err := t.tkgClient.SetMachineHealthCheck(&optionsSMHC) - if err != nil { - return err - } - - log.Info("The MachineHealthCheck was set successfully") - - return nil -} diff --git a/tkg/tkgctl/set_region.go b/tkg/tkgctl/set_region.go deleted file mode 100644 index c00f19c25d..0000000000 --- a/tkg/tkgctl/set_region.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// SetRegionOptions options for set active management cluster -type SetRegionOptions struct { - ClusterName string - ContextName string -} - -// SetRegion sets active management cluster -func (t *tkgctl) SetRegion(options SetRegionOptions) error { - err := t.tkgClient.SetRegionContext(options.ClusterName, options.ContextName) - if err != nil { - return err - } - log.Infof("The current management cluster context is switched to '%s'", options.ClusterName) - return nil -} diff --git a/tkg/tkgctl/tkgctl_suite_test.go b/tkg/tkgctl/tkgctl_suite_test.go deleted file mode 100644 index 75a7f6eb7d..0000000000 --- a/tkg/tkgctl/tkgctl_suite_test.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -func TestTkgctl(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Tkgctl Suite") -} diff --git a/tkg/tkgctl/update_credentials.go b/tkg/tkgctl/update_credentials.go deleted file mode 100644 index 29aecfe77b..0000000000 --- a/tkg/tkgctl/update_credentials.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "time" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -// UpdateCredentialsClusterOptions options that can be passed while updating cluster credentials -type UpdateCredentialsClusterOptions struct { - ClusterName string - Namespace string - VSphereUsername string - VSpherePassword string - AzureTenantID string - AzureClientID string - AzureClientSecret string - Timeout time.Duration -} - -// UpdateCredentialsCluster updates credentials used to access a cluster -func (t *tkgctl) UpdateCredentialsCluster(options UpdateCredentialsClusterOptions) error { - defer t.restoreAfterSettingTimeout(options.Timeout)() - - if options.Namespace == "" { - options.Namespace = constants.DefaultNamespace - } - - updateCredentialsOptions := &client.UpdateCredentialsOptions{ - ClusterName: options.ClusterName, - Namespace: options.Namespace, - IsRegionalCluster: false, - VSphereUpdateClusterOptions: &client.VSphereUpdateClusterOptions{ - Username: options.VSphereUsername, - Password: options.VSpherePassword, - }, - AzureUpdateClusterOptions: &client.AzureUpdateClusterOptions{ - AzureTenantID: options.AzureTenantID, - AzureClientID: options.AzureClientID, - AzureClientSecret: options.AzureClientSecret, - }, - } - - return t.tkgClient.UpdateCredentialsCluster(updateCredentialsOptions) -} diff --git a/tkg/tkgctl/update_credentials_region.go b/tkg/tkgctl/update_credentials_region.go deleted file mode 100644 index 6333d9f667..0000000000 --- a/tkg/tkgctl/update_credentials_region.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "time" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" -) - -// UpdateCredentialsRegionOptions options that can passed while updating credentials of a management-cluster -type UpdateCredentialsRegionOptions struct { - ClusterName string - VSphereUsername string - VSpherePassword string - AzureTenantID string - AzureClientID string - AzureClientSecret string - IsCascading bool - Timeout time.Duration -} - -// UpdateCredentialsRegion updates credentials used to login to a management-cluster -func (t *tkgctl) UpdateCredentialsRegion(options UpdateCredentialsRegionOptions) error { - defer t.restoreAfterSettingTimeout(options.Timeout)() - - updateCredentialsOptions := &client.UpdateCredentialsOptions{ - ClusterName: options.ClusterName, - Namespace: "tkg-system", - IsRegionalCluster: true, - VSphereUpdateClusterOptions: &client.VSphereUpdateClusterOptions{ - Username: options.VSphereUsername, - Password: options.VSpherePassword, - }, - AzureUpdateClusterOptions: &client.AzureUpdateClusterOptions{ - AzureTenantID: options.AzureTenantID, - AzureClientID: options.AzureClientID, - AzureClientSecret: options.AzureClientSecret, - }, - IsCascading: options.IsCascading, - } - - return t.tkgClient.UpdateCredentialsRegion(updateCredentialsOptions) -} diff --git a/tkg/tkgctl/update_credentials_test.go b/tkg/tkgctl/update_credentials_test.go deleted file mode 100644 index d4d8b4f20a..0000000000 --- a/tkg/tkgctl/update_credentials_test.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" -) - -var _ = Describe("Unit tests for update credentials", func() { - var tkgClient *fakes.Client - - Context("Updating cluster credentials for TKG", func() { - It("Update credentials for workload cluster", func() { - kubeConfigPath := getConfigFilePath() - - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - tkgClient: tkgClient, - kubeconfig: kubeConfigPath, - } - - err := tkgctlClient.UpdateCredentialsCluster(UpdateCredentialsClusterOptions{ - ClusterName: "clusterName", - VSphereUsername: "username", - VSpherePassword: "password", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(tkgClient.UpdateCredentialsClusterCallCount()).To(Equal(1)) - updateCredentialOptions := tkgClient.UpdateCredentialsClusterArgsForCall(0) - Expect(updateCredentialOptions.ClusterName).To(Equal("clusterName")) - Expect(updateCredentialOptions.VSphereUpdateClusterOptions.Username).To(Equal("username")) - Expect(updateCredentialOptions.VSphereUpdateClusterOptions.Password).To(Equal("password")) - Expect(updateCredentialOptions.IsRegionalCluster).To(Equal(false)) - }) - - It("Update credentials for management cluster", func() { - kubeConfigPath := getConfigFilePath() - - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - tkgClient: tkgClient, - kubeconfig: kubeConfigPath, - } - - err := tkgctlClient.UpdateCredentialsRegion(UpdateCredentialsRegionOptions{ - ClusterName: "clusterName", - VSphereUsername: "username", - VSpherePassword: "password", - IsCascading: true, - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(tkgClient.UpdateCredentialsRegionCallCount()).To(Equal(1)) - updateCredentialOptions := tkgClient.UpdateCredentialsRegionArgsForCall(0) - Expect(updateCredentialOptions.ClusterName).To(Equal("clusterName")) - Expect(updateCredentialOptions.VSphereUpdateClusterOptions.Username).To(Equal("username")) - Expect(updateCredentialOptions.VSphereUpdateClusterOptions.Password).To(Equal("password")) - Expect(updateCredentialOptions.IsRegionalCluster).To(Equal(true)) - Expect(updateCredentialOptions.IsCascading).To(Equal(true)) - }) - - It("Update azure credentials for workload cluster", func() { - kubeConfigPath := getConfigFilePath() - - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - tkgClient: tkgClient, - kubeconfig: kubeConfigPath, - } - - err := tkgctlClient.UpdateCredentialsCluster(UpdateCredentialsClusterOptions{ - ClusterName: "clusterName", - AzureTenantID: "tenantID", - AzureClientID: "clientID", - AzureClientSecret: "clientSecret", - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(tkgClient.UpdateCredentialsClusterCallCount()).To(Equal(1)) - updateCredentialOptions := tkgClient.UpdateCredentialsClusterArgsForCall(0) - Expect(updateCredentialOptions.ClusterName).To(Equal("clusterName")) - Expect(updateCredentialOptions.AzureUpdateClusterOptions.AzureTenantID).To(Equal("tenantID")) - Expect(updateCredentialOptions.AzureUpdateClusterOptions.AzureClientID).To(Equal("clientID")) - Expect(updateCredentialOptions.AzureUpdateClusterOptions.AzureClientSecret).To(Equal("clientSecret")) - Expect(updateCredentialOptions.IsRegionalCluster).To(Equal(false)) - }) - - It("Update azure credentials for management cluster", func() { - kubeConfigPath := getConfigFilePath() - - tkgClient = &fakes.Client{} - - tkgctlClient := &tkgctl{ - tkgClient: tkgClient, - kubeconfig: kubeConfigPath, - } - - err := tkgctlClient.UpdateCredentialsRegion(UpdateCredentialsRegionOptions{ - ClusterName: "clusterName", - AzureTenantID: "tenantID", - AzureClientID: "clientID", - AzureClientSecret: "clientSecret", - IsCascading: true, - }) - Expect(err).NotTo(HaveOccurred()) - - Expect(tkgClient.UpdateCredentialsRegionCallCount()).To(Equal(1)) - updateCredentialOptions := tkgClient.UpdateCredentialsRegionArgsForCall(0) - Expect(updateCredentialOptions.ClusterName).To(Equal("clusterName")) - Expect(updateCredentialOptions.AzureUpdateClusterOptions.AzureTenantID).To(Equal("tenantID")) - Expect(updateCredentialOptions.AzureUpdateClusterOptions.AzureClientID).To(Equal("clientID")) - Expect(updateCredentialOptions.AzureUpdateClusterOptions.AzureClientSecret).To(Equal("clientSecret")) - Expect(updateCredentialOptions.IsRegionalCluster).To(Equal(true)) - Expect(updateCredentialOptions.IsCascading).To(Equal(true)) - }) - }) -}) diff --git a/tkg/tkgctl/upgrade_cluster.go b/tkg/tkgctl/upgrade_cluster.go deleted file mode 100644 index d74d1e0e3f..0000000000 --- a/tkg/tkgctl/upgrade_cluster.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "fmt" - "time" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// UpgradeClusterOptions options for upgrade cluster -type UpgradeClusterOptions struct { - ClusterName string - Namespace string - TkrVersion string - SkipPrompt bool - Timeout time.Duration - OSName string - OSVersion string - OSArch string - - // VSphereTemplateName deprecated please use - // OSName, OSVersion and OSArch config variable - // to filter vSphereTemplate - VSphereTemplateName string - // Tanzu edition (either tce or tkg) - Edition string -} - -// UpgradeCluster upgrade tkg workload cluster -// -//nolint:gocritic -func (t *tkgctl) UpgradeCluster(options UpgradeClusterOptions) error { - var err error - var k8sVersion string - - if logPath, err := t.getAuditLogPath(options.ClusterName); err == nil { - log.SetAuditLog(logPath) - } - - // upgrade requires minimum 15 minutes timeout - minTimeoutReq := 15 * time.Minute - if options.Timeout < minTimeoutReq { - log.V(6).Infof("timeout duration of at least 15 minutes is required, using default timeout %v", constants.DefaultLongRunningOperationTimeout) - options.Timeout = constants.DefaultLongRunningOperationTimeout - } - defer t.restoreAfterSettingTimeout(options.Timeout)() - - isPacific, err := t.tkgClient.IsPacificManagementCluster() - if err != nil { - return err - } - - if isPacific { - // For TKGS kubernetesVersion will be same as TkrVersion - k8sVersion = options.TkrVersion - } else { - options.TkrVersion, k8sVersion, err = t.getAndDownloadTkrIfNeeded(options.TkrVersion) - if err != nil { - return errors.Wrapf(err, "unable to determine the TKr version and kubernetes version based on '%v'", options.TkrVersion) - } - } - - // if --yes is set, kick off the upgrade process without waiting for confirmation - if !options.SkipPrompt { - if err := askForConfirmation(fmt.Sprintf("Upgrading workload cluster '%s' to kubernetes version '%s', tkr version '%s'. Are you sure?", options.ClusterName, k8sVersion, options.TkrVersion)); err != nil { - return err - } - } - - if options.Namespace == "" { - options.Namespace = constants.DefaultNamespace - } - upgradeClusterOption := client.UpgradeClusterOptions{ - ClusterName: options.ClusterName, - Namespace: options.Namespace, - KubernetesVersion: k8sVersion, - TkrVersion: options.TkrVersion, - Kubeconfig: t.kubeconfig, - IsRegionalCluster: false, - VSphereTemplateName: options.VSphereTemplateName, - OSName: options.OSName, - OSVersion: options.OSVersion, - OSArch: options.OSArch, - Edition: options.Edition, - IsTKGSCluster: isPacific, - } - err = t.tkgClient.UpgradeCluster(&upgradeClusterOption) - if err != nil { - return err - } - - log.Infof("Cluster '%s' successfully upgraded to kubernetes version '%s'\n", upgradeClusterOption.ClusterName, upgradeClusterOption.KubernetesVersion) - return nil -} diff --git a/tkg/tkgctl/upgrade_region.go b/tkg/tkgctl/upgrade_region.go deleted file mode 100644 index 5fcbffc1e1..0000000000 --- a/tkg/tkgctl/upgrade_region.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "fmt" - "time" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" -) - -// UpgradeRegionOptions upgrade management cluster options -type UpgradeRegionOptions struct { - ClusterName string - SkipPrompt bool - Timeout time.Duration - OSName string - OSVersion string - OSArch string - - // VSphereTemplateName (deprecated: please use OSName, OSVersion and OSArch - // config variables to filter vSphereTemplate) - VSphereTemplateName string - // Tanzu edition (either tce or tkg) - Edition string -} - -// UpgradeRegion upgrades management cluster -// -//nolint:gocritic -func (t *tkgctl) UpgradeRegion(options UpgradeRegionOptions) error { - var err error - - if logPath, err := t.getAuditLogPath(options.ClusterName); err == nil { - log.SetAuditLog(logPath) - } - - // upgrade requires minimum 15 minutes timeout - minTimeoutReq := 15 * time.Minute - if options.Timeout < minTimeoutReq { - log.V(6).Infof("timeout duration of at least 15 minutes is required, using default timeout %v", constants.DefaultLongRunningOperationTimeout) - options.Timeout = constants.DefaultLongRunningOperationTimeout - } - defer t.restoreAfterSettingTimeout(options.Timeout)() - - tkrBomConfig, err := t.tkgBomClient.GetDefaultTkrBOMConfiguration() - if err != nil { - return errors.Wrap(err, "unable to get default TKr BoM") - } - kubernetesVersion, err := tkgconfigbom.GetK8sVersionFromTkrBoM(tkrBomConfig) - if err != nil { - return errors.Wrap(err, "unable to get default kubernetes version") - } - - defaultBomConfig, err := t.tkgBomClient.GetDefaultTkgBOMConfiguration() - if err != nil { - return errors.Wrap(err, "unable to get default bom configuration") - } - - // if --yes is set, kick off the upgrade process without waiting for confirmation - if !options.SkipPrompt { - if err := askForConfirmation(fmt.Sprintf("Upgrading management cluster '%s' to TKG version '%s' with Kubernetes version '%s'. Are you sure?", - options.ClusterName, defaultBomConfig.Release.Version, kubernetesVersion)); err != nil { - return err - } - } - - upgradeClusterOption := client.UpgradeClusterOptions{ - KubernetesVersion: kubernetesVersion, - TkrVersion: tkrBomConfig.Release.Version, - Kubeconfig: t.kubeconfig, - ClusterName: options.ClusterName, - IsRegionalCluster: true, - VSphereTemplateName: options.VSphereTemplateName, - OSName: options.OSName, - OSVersion: options.OSVersion, - OSArch: options.OSArch, - SkipPrompt: options.SkipPrompt, - Edition: options.Edition, - } - err = t.tkgClient.UpgradeManagementCluster(&upgradeClusterOption) - if err != nil { - return err - } - - log.Infof("Management cluster '%s' successfully upgraded to TKG version '%s' with kubernetes version '%s'\n", options.ClusterName, defaultBomConfig.Release.Version, upgradeClusterOption.KubernetesVersion) - return nil -} diff --git a/tkg/tkgctl/upgrade_test.go b/tkg/tkgctl/upgrade_test.go deleted file mode 100644 index bb6983c86a..0000000000 --- a/tkg/tkgctl/upgrade_test.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - "os" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - fakeproviders "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/providers" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" -) - -var _ = Describe("Unit tests for upgrade management cluster", func() { - var ( - ctl *tkgctl - tkgClient = &fakes.Client{} - updaterClient = &fakes.TKGConfigUpdaterClient{} - bomClient = &fakes.TKGConfigBomClient{} - configDir string - err error - ops UpgradeRegionOptions - tkrBom = tkgconfigbom.BOMConfiguration{ - Release: &tkgconfigbom.ReleaseInfo{Version: "v1.21.4+vmware.1.tkg.1"}, - Components: map[string][]*tkgconfigbom.ComponentInfo{"kubernetes": {{Version: "v1.21.4"}}}, - } - ) - JustBeforeEach(func() { - configDir, err = os.MkdirTemp("", "test") - err = os.MkdirAll(configDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - prepareConfiDir(configDir) - options := Options{ - ConfigDir: configDir, - ProviderGetter: fakeproviders.FakeProviderGetter(), - } - c, createErr := New(options) - Expect(createErr).ToNot(HaveOccurred()) - ctl, _ = c.(*tkgctl) - ctl.tkgClient = tkgClient - ctl.tkgBomClient = bomClient - ctl.tkgConfigUpdaterClient = updaterClient - ops = UpgradeRegionOptions{ - ClusterName: "my-mgmt-cluster", - VSphereTemplateName: "ubuntu-ova", - OSName: "ubuntu", - OSVersion: "xxxx", - OSArch: "amd64", - SkipPrompt: true, - } - err = ctl.UpgradeRegion(ops) - }) - - Context("when cannot get default tkr bom", func() { - BeforeEach(func() { - bomClient.GetDefaultTkrBOMConfigurationReturns(nil, errors.New("unable to get default tkr bom")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When tkg bom is mal-formated", func() { - BeforeEach(func() { - bomClient.GetDefaultTkrBOMConfigurationReturns(&tkrBom, nil) - bomClient.GetDefaultTkgBOMConfigurationReturns(nil, errors.New("failed to get tkg bom")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When mgmt cluster upgrading fails", func() { - BeforeEach(func() { - bomClient.GetDefaultTkrBOMConfigurationReturns(&tkrBom, nil) - bomClient.GetDefaultTkgBOMConfigurationReturns(&tkgconfigbom.BOMConfiguration{Release: &tkgconfigbom.ReleaseInfo{Version: "v1.3.1"}}, nil) - tkgClient.UpgradeManagementClusterReturns(errors.New("failed to upgrade management cluster")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When mgmt cluster upgrading succeeds", func() { - BeforeEach(func() { - bomClient.GetDefaultTkrBOMConfigurationReturns(&tkrBom, nil) - bomClient.GetDefaultTkgBOMConfigurationReturns(&tkgconfigbom.BOMConfiguration{Release: &tkgconfigbom.ReleaseInfo{Version: "v1.3.1"}}, nil) - tkgClient.UpgradeManagementClusterReturns(nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - AfterEach(func() { - os.Remove(configDir) - }) -}) - -var _ = Describe("Unit tests for upgrade cluster", func() { - var ( - ctl *tkgctl - tkgClient = &fakes.Client{} - bomClient = &fakes.TKGConfigBomClient{} - configDir string - err error - ops UpgradeClusterOptions - ) - JustBeforeEach(func() { - configDir, err = os.MkdirTemp("", "test") - err = os.MkdirAll(configDir, 0o700) - Expect(err).ToNot(HaveOccurred()) - prepareConfiDir(configDir) - options := Options{ - ConfigDir: configDir, - ProviderGetter: fakeproviders.FakeProviderGetter(), - } - c, createErr := New(options) - Expect(createErr).ToNot(HaveOccurred()) - ctl, _ = c.(*tkgctl) - ctl.tkgClient = tkgClient - ctl.tkgBomClient = bomClient - ops = UpgradeClusterOptions{ - ClusterName: "my-mgmt-cluster", - VSphereTemplateName: "ubuntu-ova", - OSName: "ubuntu", - OSVersion: "xxxx", - OSArch: "amd64", - SkipPrompt: true, - TkrVersion: "v1.21.1+vmware.1.tkg.1", - Timeout: time.Minute * 30, - } - err = ctl.UpgradeCluster(ops) - }) - - Context("it cannot determine if this is a pacific cluster", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(true, errors.New("failed to determine if this is a pacific cluster")) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("upgrading a Pacific cluster succeeds", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(true, nil) - tkgClient.UpgradeClusterReturns(nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("upgrade a tkgm cluster succeeds", func() { - BeforeEach(func() { - tkgClient.IsPacificManagementClusterReturns(false, nil) - tkgClient.UpgradeClusterReturns(nil) - bomClient.GetBOMConfigurationFromTkrVersionReturns(nil, nil) - bomClient.GetK8sVersionFromTkrVersionReturns("1.19.0", nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - }) - }) - - AfterEach(func() { - os.Remove(configDir) - }) -}) diff --git a/tkg/tkgctl/utils.go b/tkg/tkgctl/utils.go deleted file mode 100644 index d4dd9b91eb..0000000000 --- a/tkg/tkgctl/utils.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - -func (t *tkgctl) setCEIPOptinBasedOnConfigAndBuildEdition(edition string) string { - ceipOptIn, err := t.TKGConfigReaderWriter().Get(constants.ConfigVariableEnableCEIPParticipation) - if err == nil { - return ceipOptIn - } - - if edition == TCEBuildEdition { - return False - } - - return True -} diff --git a/tkg/tkgctl/utils_test.go b/tkg/tkgctl/utils_test.go deleted file mode 100644 index b72e9d2e42..0000000000 --- a/tkg/tkgctl/utils_test.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package tkgctl - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - - "os" -) - -var _ = Describe("Unit tests for ceip", func() { - var ( - tkgctlClient *tkgctl - ) - - BeforeEach(func() { - tkgConfigReaderWriter, err := tkgconfigreaderwriter.NewReaderWriterFromConfigFile("../fakes/config/config.yaml", "../fakes/config/config.yaml") - Expect(err).ToNot(HaveOccurred()) - tkgctlClient = &tkgctl{ - tkgConfigReaderWriter: tkgConfigReaderWriter, - } - }) - - Context("CEIP value is set to true in the config file", func() { - BeforeEach(func() { - tkgctlClient.tkgConfigReaderWriter.Set(constants.ConfigVariableEnableCEIPParticipation, "true") - }) - - It("When build edition is tce", func() { - ceipOptinStatus := tkgctlClient.setCEIPOptinBasedOnConfigAndBuildEdition("tce") - Expect(ceipOptinStatus).To(Equal("true")) - }) - It("When build edition is tkg", func() { - ceipOptinStatus := tkgctlClient.setCEIPOptinBasedOnConfigAndBuildEdition("tkg") - Expect(ceipOptinStatus).To(Equal("true")) - }) - - AfterEach(func() { - err := os.Unsetenv(constants.ConfigVariableEnableCEIPParticipation) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("CEIP value is set to false in the config file", func() { - BeforeEach(func() { - tkgctlClient.tkgConfigReaderWriter.Set(constants.ConfigVariableEnableCEIPParticipation, "false") - }) - - It("When build edition is tce", func() { - ceipOptinStatus := tkgctlClient.setCEIPOptinBasedOnConfigAndBuildEdition("tce") - Expect(ceipOptinStatus).To(Equal("false")) - }) - It("When build edition is tkg", func() { - ceipOptinStatus := tkgctlClient.setCEIPOptinBasedOnConfigAndBuildEdition("tkg") - Expect(ceipOptinStatus).To(Equal("false")) - }) - - AfterEach(func() { - err := os.Unsetenv(constants.ConfigVariableEnableCEIPParticipation) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("CEIP value is not set in the config file", func() { - BeforeEach(func() { - err := os.Unsetenv(constants.ConfigVariableEnableCEIPParticipation) - Expect(err).ToNot(HaveOccurred()) - }) - - It("When build edition is tce", func() { - ceipOptinStatus := tkgctlClient.setCEIPOptinBasedOnConfigAndBuildEdition("tce") - Expect(ceipOptinStatus).To(Equal("false")) - }) - It("When build edition is tkg", func() { - ceipOptinStatus := tkgctlClient.setCEIPOptinBasedOnConfigAndBuildEdition("tkg") - Expect(ceipOptinStatus).To(Equal("true")) - }) - }) -}) diff --git a/tkg/tools/tools.go b/tkg/tools/tools.go deleted file mode 100644 index e6fa2b8f2e..0000000000 --- a/tkg/tools/tools.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build tools -// +build tools - -package tools - -import ( - _ "github.com/maxbrunsfeld/counterfeiter/v6" -) - -// This file imports packages that are used when running go generate, or used -// during the development process but not otherwise depended on by built code. diff --git a/tkg/types/app_config.go b/tkg/types/app_config.go deleted file mode 100644 index 6950222e7b..0000000000 --- a/tkg/types/app_config.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package types package to store configs -package types - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/providerinterface" - "github.com/vmware-tanzu/tanzu-framework/tkg/region" -) - -// AppConfig stores configuration related to running app -type AppConfig struct { - TKGConfigDir string - ProviderGetter providerinterface.ProviderInterface - CustomizerOptions CustomizerOptions - TKGSettingsFile string -} - -// CustomizerOptions provides overrides for CreateAllClients that allows a -// user to customize the underying clients. -type CustomizerOptions struct { - RegionManagerFactory region.ManagerFactory -} diff --git a/tkg/types/cluster_config.go b/tkg/types/cluster_config.go deleted file mode 100644 index 2360c9c0fe..0000000000 --- a/tkg/types/cluster_config.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package types - -// ClusterKubeConfig stores kubeconfig file and context -type ClusterKubeConfig struct { - File string - Context string -} diff --git a/tkg/types/vm_config.go b/tkg/types/vm_config.go deleted file mode 100644 index 84522ce630..0000000000 --- a/tkg/types/vm_config.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package types - -// VSphereVirtualMachine struct to hold vSphere VM object -type VSphereVirtualMachine struct { - Name string - Moid string - OVAVersion string - DistroName string - DistroVersion string - DistroArch string - IsTemplate bool -} diff --git a/tkg/utils/capi_conditions.go b/tkg/utils/capi_conditions.go deleted file mode 100644 index 1e6fb34fb5..0000000000 --- a/tkg/utils/capi_conditions.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - corev1 "k8s.io/api/core/v1" - clusterv1alpha3 "sigs.k8s.io/cluster-api/api/v1alpha3" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" -) - -/* - Copying some utilities from upstream CAPI conditions. This is one of the consequences - of the CLI to support both TKGm(CAPI v1beta1) and TKGS(v1alpha3). TKGS recently moved - to v1alpha2 which has support for CAPI(v1alpha3) conditions. - TODO: Remove this when TKGm and TKGS are on the same CAPI version (Unified TKG). -*/ - -// Getter interface defines methods that a Cluster API object should implement in order to -// use the conditions package for getting conditions. -type Getter interface { - crtclient.Object - GetConditions() clusterv1alpha3.Conditions -} - -// Get returns the condition with the given type, if the condition does not exist, -// it returns nil. -func Get(from Getter, t clusterv1alpha3.ConditionType) *clusterv1alpha3.Condition { - conditions := from.GetConditions() - if conditions == nil { - return nil - } - - for _, condition := range conditions { - if condition.Type == t { - return &condition - } - } - return nil -} - -// Has returns true if a condition with the given type exists. -func Has(from Getter, t clusterv1alpha3.ConditionType) bool { - return Get(from, t) != nil -} - -// IsTrue is true if the condition with the given type is True, otherwise it return false -// if the condition is not True or if the condition does not exist (is nil). -func IsTrue(from Getter, t clusterv1alpha3.ConditionType) bool { - if c := Get(from, t); c != nil { - return c.Status == corev1.ConditionTrue - } - return false -} - -// IsFalse is true if the condition with the given type is False, otherwise it return false -// if the condition is not False or if the condition does not exist (is nil). -func IsFalse(from Getter, t clusterv1alpha3.ConditionType) bool { - if c := Get(from, t); c != nil { - return c.Status == corev1.ConditionFalse - } - return false -} - -// IsUnknown is true if the condition with the given type is Unknown or if the condition -// does not exist (is nil). -func IsUnknown(from Getter, t clusterv1alpha3.ConditionType) bool { - if c := Get(from, t); c != nil { - return c.Status == corev1.ConditionUnknown - } - return true -} - -// GetReason returns a nil safe string of Reason for the condition with the given type. -func GetReason(from Getter, t clusterv1alpha3.ConditionType) string { - if c := Get(from, t); c != nil { - return c.Reason - } - return "" -} - -// GetMessage returns a nil safe string of Message. -func GetMessage(from Getter, t clusterv1alpha3.ConditionType) string { - if c := Get(from, t); c != nil { - return c.Message - } - return "" -} - -// GetSeverity returns the condition Severity or nil if the condition -// does not exist (is nil). -func GetSeverity(from Getter, t clusterv1alpha3.ConditionType) *clusterv1alpha3.ConditionSeverity { - if c := Get(from, t); c != nil { - return &c.Severity - } - return nil -} diff --git a/tkg/utils/common.go b/tkg/utils/common.go deleted file mode 100644 index 639c78d30f..0000000000 --- a/tkg/utils/common.go +++ /dev/null @@ -1,315 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package utils adding package comment to satisfy linters -package utils - -import ( - "context" - "fmt" - "math/rand" - "net" - "net/url" - "regexp" - "runtime" - "strconv" - "strings" - "time" - - "github.com/Masterminds/semver" - "github.com/apparentlymart/go-cidr/cidr" - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" - "github.com/pkg/errors" - utilversion "k8s.io/apimachinery/pkg/util/version" - "k8s.io/client-go/tools/clientcmd" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -// nolint:gosec -var seededRand = rand.New( - rand.NewSource(time.Now().UnixNano())) - -var ( - matchFirstCap = regexp.MustCompile("(.)([A-Z][a-z]+)") - matchAllCap = regexp.MustCompile("([a-z0-9])([A-Z])") -) - -var ( - numSplits = 2 - privatePort uint16 = 6443 -) - -// ContainsString checks the string contains in string array -func ContainsString(arr []string, str string) bool { - for _, a := range arr { - if a == str { - return true - } - } - return false -} - -// ReplaceSpecialChars replaces special character in string -func ReplaceSpecialChars(str string) string { - str = strings.ReplaceAll(str, ".", "-") - return strings.ReplaceAll(str, "+", "-") -} - -// ReplaceVersionInDockerImage replaces version in existing docker image with a new version. -// This simply replaces the tag in REGISTRY[:PORT]/REPO/MORE/PATH/ELEMENTS/IMAGE[:TAG] -func ReplaceVersionInDockerImage(image, newVersion string) (string, error) { - if image == "" { - return "", errors.New("cannot replace version on empty image string") - } - - splitVersion := strings.Split(image, "/") - // must have two slashes and three parts after split - if len(splitVersion) <= numSplits { - return "", errors.New("not enough slashes in docker image when replacing version") - } - - // tag is always at the end - tagSplit := strings.Split(splitVersion[len(splitVersion)-1], ":") - if len(tagSplit) > numSplits { - return "", errors.New("extra colons in docker image tag when replacing version, only two allowed") - } - - // check that, if we have a tag, it doesn't have slashes - splitTagSlashes := strings.Split(tagSplit[0], "/") - if len(splitTagSlashes) > 1 { - return "", errors.New("there cannot be slashes in the docker tag") - } - - // first join image[:tag] - splitVersion[len(splitVersion)-1] = tagSplit[0] + ":" + newVersion - - // then rejoin everything else - finalImage := strings.Join(splitVersion, "/") - - return finalImage, nil -} - -// CompareVMwareVersionStrings compares vmware aware versions -func CompareVMwareVersionStrings(v1, v2 string) (int, error) { - v1s := strings.Split(v1, "+vmware.") - v2s := strings.Split(v2, "+vmware.") - - if len(v1s) <= 1 || len(v2s) <= 1 { - return 0, errors.New("invalid version string") - } - - v1Semver, err := semver.NewVersion(v1s[0]) - if err != nil { - return 0, errors.Wrapf(err, "unable to parse %v", v1s[0]) - } - v2Semver, err := semver.NewVersion(v2s[0]) - if err != nil { - return 0, errors.Wrapf(err, "unable to parse %v", v2s[0]) - } - - compareResult := v1Semver.Compare(v2Semver) - if compareResult != 0 { - return compareResult, nil - } - - buildVersionV1 := strings.Split(v1s[1], "-") - buildVersionV2 := strings.Split(v2s[1], "-") - - v1VmwareBuildVersion, err1 := strconv.Atoi(buildVersionV1[0]) - v2VmwareBuildVersion, err2 := strconv.Atoi(buildVersionV2[0]) - if err1 != nil || err2 != nil { - return 0, errors.New("invalid version string") - } - - return v1VmwareBuildVersion - v2VmwareBuildVersion, nil -} - -// CheckKubernetesUpgradeCompatibility checks if a tkg cluster with a k8s version can be upgraded to another version. -// Updrading operations is not supported if the gap between the minor versions is larger than 1. -// For example upgrading from v1.17.9 to v1.19.1 is not supported. -// The behavior of this function may be changed in the future, if the upstream supports upgrading between versions with larger gaps. -func CheckKubernetesUpgradeCompatibility(fromVersion, toVersion string) bool { - v1Versions, err := utilversion.ParseSemantic(fromVersion) - if err != nil { - return false - } - - v2Versions, err := utilversion.ParseSemantic(toVersion) - if err != nil { - return false - } - - if v1Versions.Major() != v2Versions.Major() { - return false - } - - if minorGap := int(v2Versions.Minor()) - int(v1Versions.Minor()); minorGap > 1 || minorGap < 0 { - return false - } else if minorGap == 0 && v2Versions.Patch() < v1Versions.Patch() { - return false - } - - return true -} - -// GenerateRandomID generates random string -func GenerateRandomID(length int, excludeCapitalLetters bool) string { - b := make([]rune, length) - runes := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") - if excludeCapitalLetters { - runes = []rune("abcdefghijklmnopqrstuvwxyz0123456789") - } - for i := range b { - b[i] = runes[seededRand.Intn(len(runes))] - } - return string(b) -} - -// ToSnakeCase converts string to SnakeCase with all upper case letters -func ToSnakeCase(str string) string { - snake := matchFirstCap.ReplaceAllString(str, "${1}_${2}") - snake = matchAllCap.ReplaceAllString(snake, "${1}_${2}") - return strings.ToUpper(snake) -} - -// IsValidURL validates urls -func IsValidURL(s string) bool { - if _, err := url.ParseRequestURI(s); err != nil { - return false - } - - u, err := url.Parse(s) - if err != nil || u.Scheme == "" || u.Host == "" { - return false - } - - return true -} - -// FixKubeConfigForMacEnvironment fix api server endpoint -func FixKubeConfigForMacEnvironment(dockerContext context.Context, cli *client.Client, kubeconfigBytes []byte) ([]byte, error) { - log.V(6).Info("Mac and CAPD environment detected, fixing Kubeconfig") - config, err := clientcmd.Load(kubeconfigBytes) - if err != nil { - return nil, errors.Wrap(err, "unable load kubeconfig") - } - - containers, err := cli.ContainerList(dockerContext, types.ContainerListOptions{}) - if err != nil { - log.V(3).Error(err, "unable get list of docker containers") - return kubeconfigBytes, nil - } - - clusterPortMap := map[string]uint16{} - - for i := 0; i < len(containers); i++ { - var apiServerPublicPort uint16 - for _, portInfo := range containers[i].Ports { - if portInfo.PrivatePort == privatePort { - apiServerPublicPort = portInfo.PublicPort - } - } - for _, name := range containers[i].Names { - clusterPortMap[name] = apiServerPublicPort - } - } - - for clusterName, clusterConfig := range config.Clusters { - lbContainerName := "/" + clusterName + "-lb" - publicPort, exists := clusterPortMap[lbContainerName] - if !exists { - continue - } - clusterConfig.Server = fmt.Sprintf("https://127.0.0.1:%v", publicPort) - } - - updatedKubeconfigBytes, err := clientcmd.Write(*config) - if err != nil { - log.V(3).Error(err, "unable write kubeconfig") - return kubeconfigBytes, nil - } - - return updatedKubeconfigBytes, nil -} - -// DivideVPCCidr divide VPC cidr as per extendedBits and number of subnets needed -func DivideVPCCidr(cidrStr string, extendedBits, numSubnets int) ([]string, error) { - results := make([]string, 0) - _, baseSubnet, err := net.ParseCIDR(cidrStr) - if err != nil { - return nil, err - } - for i := 0; i < numSubnets; i++ { - subNet, err := cidr.Subnet(baseSubnet, extendedBits, i) - if err != nil { - return nil, err - } - - results = append(results, subNet.String()) - } - - return results, nil -} - -// IsOnWindows returns true if running on a Windows machine. -func IsOnWindows() bool { - return runtime.GOOS == "windows" -} - -// GetTkrNameFromTkrVersion gets TKr name from TKr version -func GetTkrNameFromTkrVersion(tkrVersion string) string { - strs := strings.Split(tkrVersion, "+") - if len(strs) != numSplits { - return tkrVersion - } - return strs[0] + "---" + strs[1] -} - -// GetTKRVersionFromTKRName gets TKr version from TKr name -func GetTKRVersionFromTKRName(tkrName string) string { - strs := strings.Split(tkrName, "---") - if len(strs) != numSplits { - return tkrName - } - return strs[0] + "+" + strs[1] -} - -// GetTKGBoMTagFromFileName gets BOM Tag from filename -func GetTKGBoMTagFromFileName(fileName string) string { - return strings.TrimSuffix(strings.TrimPrefix(fileName, "tkg-bom-"), ".yaml") -} - -// CompareMajorMinorPatchVersion returns true if major/minor/patch parts of the versions match, else false -func CompareMajorMinorPatchVersion(version1, version2 string) bool { - semVersion1, err := utilversion.ParseSemantic(version1) - if err != nil { - return false - } - semVersion2, err := utilversion.ParseSemantic(version2) - if err != nil { - return false - } - if semVersion1.Major() == semVersion2.Major() && - semVersion1.Minor() == semVersion2.Minor() && - semVersion1.Patch() == semVersion2.Patch() { - return true - } - return false -} - -// CompareVersions compares version v1 against version v2. -func CompareVersions(v1, cmpSign, v2 string) bool { - if c, err := semver.NewConstraint(cmpSign + v2); err == nil { - if currentVersion, err := semver.NewVersion(v1); err == nil && c.Check(currentVersion) { - return true - } - } - return false -} - -// IsAviFieldInputEmpty check if the input is empty or not -func IsAviInputEmpty(input interface{}) bool { - return input == nil || input.(string) == "" || input.(string) == `""` -} diff --git a/tkg/utils/common_darwin_test.go b/tkg/utils/common_darwin_test.go deleted file mode 100644 index 4f3508a932..0000000000 --- a/tkg/utils/common_darwin_test.go +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "bytes" - "context" - "encoding/json" - "io" - "net/http" - "os" - "testing" - - "github.com/docker/docker/api/types" - dockerclient "github.com/docker/docker/client" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -func TestUtils(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Common Utils Suite") -} - -var testingDir string - -var _ = Describe("Common Utils", func() { - var ( - err error - clientconfig *clientcmdapi.Config - dockerClient *dockerclient.Client - ctx context.Context - ) - - BeforeSuite(createTempDirectory) - AfterSuite(deleteTempDirectory) - - reInitialize := func() { - clientconfig = &clientcmdapi.Config{} - dockerClient = &dockerclient.Client{} - ctx = context.Background() - } - - Describe("Fix KubeConfig for Mac Environment", func() { - BeforeEach(func() { - reInitialize() - }) - Context("When there is a matching cluster in the kubeconfig", func() { - BeforeEach(func() { - kubeConfigPath := getConfigFilePath("config6.yaml") - kubeconfigBytes, _ := os.ReadFile(kubeConfigPath) - lbContainer := types.Container{ - Names: []string{"/docker-mgmt-1-lb"}, - Ports: []types.Port{ - { - IP: "127.0.0.2", - PrivatePort: 6443, - PublicPort: 12345, - }, - }, - } - containerList := []types.Container{lbContainer} - dockerClient, err = newListContainerMockDockerClient(containerList) - var output []byte - output, err = FixKubeConfigForMacEnvironment(ctx, dockerClient, kubeconfigBytes) - Expect(err).NotTo(HaveOccurred()) - clientconfig, err = clientcmd.Load(output) - }) - It("Should change the load balancer server socket", func() { - Expect(err).NotTo(HaveOccurred()) - actualServer := clientconfig.Clusters["docker-mgmt-1"].Server - Expect(actualServer).To(Equal("https://127.0.0.1:12345")) - }) - }) - }) -}) - -func getConfigFilePath(filename string) string { - filePath := "../fakes/config/kubeconfig/" + filename - f, _ := os.CreateTemp(testingDir, "kube") - copyFile(filePath, f.Name()) - return f.Name() -} - -func createTempDirectory() { - testingDir, _ = os.MkdirTemp("", "cluster_client_test") -} - -func deleteTempDirectory() { - os.Remove(testingDir) -} - -func copyFile(sourceFile, destFile string) { - input, _ := os.ReadFile(sourceFile) - _ = os.WriteFile(destFile, input, constants.ConfigFilePermissions) -} - -// the following was brought from docker, this is how ListContainer is mocked -func newListContainerDoer(containers []types.Container) func(*http.Request) (*http.Response, error) { - return func(req *http.Request) (*http.Response, error) { - b, err := json.Marshal(containers) - if err != nil { - return nil, err - } - - return &http.Response{ - StatusCode: http.StatusOK, - Body: io.NopCloser(bytes.NewReader(b)), - }, nil - } -} - -type transportFunc func(*http.Request) (*http.Response, error) - -func (tf transportFunc) RoundTrip(req *http.Request) (*http.Response, error) { - return tf(req) -} - -func newMockHTTPClient(doer func(*http.Request) (*http.Response, error)) *http.Client { - return &http.Client{ - Transport: transportFunc(doer), - } -} - -func newListContainerMockDockerClient(containers []types.Container) (*dockerclient.Client, error) { - // we don't lint here because we never explicitly read the response body, we - // create it and docker reads it. - doer := newListContainerDoer(containers) //nolint - mockHTTPClient := newMockHTTPClient(doer) - dockerOpts := dockerclient.WithHTTPClient(mockHTTPClient) - return dockerclient.NewClientWithOpts(dockerOpts) -} diff --git a/tkg/utils/common_test.go b/tkg/utils/common_test.go deleted file mode 100644 index 342d1b0fe2..0000000000 --- a/tkg/utils/common_test.go +++ /dev/null @@ -1,713 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "strings" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" -) - -var ( - k8sv1172 = "v1.17.2+vmware.2" - k8sv1174 = "v1.17.4+vmware.2" - k8sv1182 = "v1.18.2+vmware.2" - k8sv1191 = "v1.19.1+vmware.2" - k8sv11731Fips1 = "v1.17.3+vmware.1-fips.1" - k8sv11732Fips1 = "v1.17.3+vmware.2-fips.1" - vABC = "vA.B.C" - fakePathABC = "gcr.io/fakepath/tkg/kind/node:vA.B.C" - tkrNameSample = "tkr---version" - tkrVersionSample = "tkrversion" - expectedTKRVersion = "tkr+version" -) - -func Test_ReplaceVersionInDockerImage(t *testing.T) { - preimage := "registry.tkg.vmware.run/kind/node:vX.Y.Z" - newVersion := vABC - expected := "registry.tkg.vmware.run/kind/node:vA.B.C" - actual, err := ReplaceVersionInDockerImage(preimage, newVersion) - if err != nil { - t.Fatalf("Error replacing version in valid docker image: %s", err) - } - - if actual != expected { - t.Errorf("Incorrect replaced image string. Expected: %s, actual: %s", expected, actual) - } -} - -func Test_ReplaceVersionInDockerImageLongPath(t *testing.T) { - preimage := "gcr.io/fakepath/tkg/kind/node:vX.Y.Z" - newVersion := vABC - expected := fakePathABC - actual, err := ReplaceVersionInDockerImage(preimage, newVersion) - if err != nil { - t.Fatalf("Error replacing version in valid docker image: %s", err) - } - - if actual != expected { - t.Errorf("Incorrect replaced image string. Expected: %s, actual: %s", expected, actual) - } -} - -func Test_ReplaceVersionInDockerImageTwoColons(t *testing.T) { - preimage := "gcr.io:port/fakepath/tkg/kind/node:vX.Y.Z" - newVersion := vABC - expected := "gcr.io:port/fakepath/tkg/kind/node:vA.B.C" - actual, err := ReplaceVersionInDockerImage(preimage, newVersion) - if err != nil { - t.Fatalf("Error replacing version in valid docker image: %s", err) - } - - if actual != expected { - t.Errorf("Incorrect replaced image string. Expected: %s, actual: %s", expected, actual) - } -} - -func Test_ReplaceVersionInDockerImageNoTag(t *testing.T) { - preimage := "gcr.io/fakepath/tkg/kind/node" - newVersion := vABC - actual, err := ReplaceVersionInDockerImage(preimage, newVersion) - expected := fakePathABC - if err != nil { - t.Fatalf("Error replacing version in valid docker image: %s", err) - } - - if actual != expected { - t.Errorf("Incorrect replaced image string. Expected: %s, actual: %s", expected, actual) - } -} - -func Test_ReplaceVersionInDockerImageNoSlashes(t *testing.T) { - preimage := "gcr.io" - newVersion := vABC - _, err := ReplaceVersionInDockerImage(preimage, newVersion) - if err == nil { - t.Errorf("There should have been an error when getting an image with no slashes but there was none") - } -} - -func Test_ReplaceVersionInDockerImage_EmptyParam(t *testing.T) { - preimage := "" - _, err := ReplaceVersionInDockerImage(preimage, "") - if err == nil { - t.Error("Enpty image string should return an error") - } -} - -func Test_ReplaceVersionInDockerImage_TagWithExcessColons(t *testing.T) { - preimage := "registry.tkg.vmware.run/kind/node:vX.Y.Z:W" - _, err := ReplaceVersionInDockerImage(preimage, "") - - if err == nil { - t.Error("Tag with multiple colons should not be accepted") - } -} - -func Test_CheckKubernetesUpgradeCompatibilityWithSkippingMinorVersions(t *testing.T) { - fromVersion := "v1.17.1+vmware.2" - toVersion := k8sv1191 - - upgradable := CheckKubernetesUpgradeCompatibility(fromVersion, toVersion) - if upgradable { - t.Errorf("Upgrading between skipping minor versions should not be allowed") - } -} - -func Test_CheckKubernetesUpgradeCompatibilityWithDifferentMajorVersions(t *testing.T) { - fromVersion := "v0.19.1+vmware.2" - toVersion := k8sv1191 - - upgradable := CheckKubernetesUpgradeCompatibility(fromVersion, toVersion) - if upgradable { - t.Errorf("Upgrading between different major versions should not be allowed") - } -} - -func Test_CheckKubernetesUpgradeCompatibilityWithoutContinuousMinorVersions(t *testing.T) { - fromVersion := "v1.18.1+vmware.2" - toVersion := k8sv1191 - - upgradable := CheckKubernetesUpgradeCompatibility(fromVersion, toVersion) - if !upgradable { - t.Errorf("Upgrading between continuous minor versions should be allowed") - } -} - -func Test_CheckKubernetesUpgradeCompatibilityWithIncreasingPatchVersions(t *testing.T) { - fromVersion := k8sv1191 - toVersion := "v1.19.3+vmware.2" - - upgradable := CheckKubernetesUpgradeCompatibility(fromVersion, toVersion) - if !upgradable { - t.Errorf("Upgrading between the same minor versions but increasing patch version should be allowed") - } -} - -func Test_CheckKubernetesUpgradeCompatibilityWithBackwardMinorVersions(t *testing.T) { - fromVersion := k8sv1191 - toVersion := k8sv1182 - - upgradable := CheckKubernetesUpgradeCompatibility(fromVersion, toVersion) - if upgradable { - t.Errorf("Upgrading between backward minor versions should not be allowed") - } -} - -func Test_CheckKubernetesUpgradeCompatibilityWithBackwardPatchVersions(t *testing.T) { - fromVersion := "v1.19.2+vmware.2" - toVersion := k8sv1191 - - upgradable := CheckKubernetesUpgradeCompatibility(fromVersion, toVersion) - if upgradable { - t.Errorf("Upgrading between backward patch versions should not be allowed") - } -} - -func Test_ContainsString_EmptyArray(t *testing.T) { - array := []string{} - - contains := ContainsString(array, "") - if contains { - t.Error("ContainsString should return false with an empty input array") - } -} - -func Test_ContainsString_Success(t *testing.T) { - array := []string{"one fish", "two fish", "red fish", "blue fish"} - - contains := ContainsString(array, "blue fish") - if !contains { - t.Error("ContainsString should have found blue fish in the array of strings") - } -} - -func Test_ReplaceSpecialChars_Success(t *testing.T) { - principal := "this.is+a+test.string" - expected := "this-is-a-test-string" - - if actual := ReplaceSpecialChars(principal); actual != expected { - t.Errorf("ReplaceSpecialChars did not replace the special chars, output was %s", actual) - } -} - -func Test_ToSnakeCase_Success(t *testing.T) { - camelCase := "camelCase" - expected := "CAMEL_CASE" - - if actual := ToSnakeCase(camelCase); actual != expected { - t.Error("Did not successfully convert to snake case") - } -} - -func Test_IsValidURL_Success(t *testing.T) { - testURL := "https://vmware.com" - - if !IsValidURL(testURL) { - t.Errorf("Valid URL %s was marked as invalid", testURL) - } -} - -func Test_GetTkrNameFromTkrVersion_Success(t *testing.T) { - tkrVersion := expectedTKRVersion - expected := tkrNameSample - if actual := GetTkrNameFromTkrVersion(tkrVersion); actual != expected { - t.Errorf("Expected tkr name %s, got %s", expected, actual) - } -} - -func Test_GetTkrNameFromTkrVersion_NotTkrVersion(t *testing.T) { - tkrVersion := tkrVersionSample - if actual := GetTkrNameFromTkrVersion(tkrVersion); actual != tkrVersion { - t.Errorf("The actual output %s, did not match the input %s", actual, tkrVersion) - } -} - -func Test_GetTKRVersionFromTKRName_Success(t *testing.T) { - tkrName := tkrNameSample - expected := expectedTKRVersion - if actual := GetTKRVersionFromTKRName(tkrName); actual != expected { - t.Errorf("Expected version %s, got %s", expected, actual) - } -} - -func Test_GetTKRVersionFromTKRName_NotTkrName(t *testing.T) { - tkrName := tkrVersionSample - if actual := GetTKRVersionFromTKRName(tkrName); actual != tkrName { - t.Errorf("The actual output %s, did not match the input %s", actual, tkrName) - } -} - -var _ = Describe("CompareVMwareVersionStrings", func() { - var ( - fromVersion string - toVersion string - err error - compareResult int - ) - JustBeforeEach(func() { - compareResult, err = CompareVMwareVersionStrings(fromVersion, toVersion) - }) - - Context("When fromVersion is invalid", func() { - BeforeEach(func() { - fromVersion = "not a version" - toVersion = k8sv1174 - }) - It("should fail to parse", func() { - Expect(err).To(HaveOccurred()) - Expect(err).To(MatchError("invalid version string")) - }) - }) - - Context("When toVersion is invalid", func() { - BeforeEach(func() { - fromVersion = k8sv1174 - toVersion = "incorrect version" - }) - It("hould fail to parse", func() { - Expect(err).To(HaveOccurred()) - Expect(err).To(MatchError("invalid version string")) - }) - }) - - Context("When fromVersion does not contain valid Semver", func() { - BeforeEach(func() { - fromVersion = "not.a.version+vmware.2" - toVersion = k8sv1174 - }) - It("should fail to validate semver", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When toVersion does not contain valid Semver", func() { - BeforeEach(func() { - toVersion = "not.a.version+vmware.3" - fromVersion = k8sv1174 - }) - It("should fail to validate semver", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When minor version in multiple digits, From: v1.17.4+vmware.2 To: v1.17.33+vmware.2", func() { - BeforeEach(func() { - fromVersion = k8sv1174 - toVersion = "v1.17.33+vmware.2" - }) - It("expect compareResult < 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult < 0).To(Equal(true)) - }) - }) - - Context("When version are same v2=v1", func() { - BeforeEach(func() { - fromVersion = k8sv1174 - toVersion = k8sv1174 - }) - It("expect compareResult == 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult == 0).To(Equal(true)) - }) - }) - - Context("When patch version is greater, v2.patch > v1.patch", func() { - BeforeEach(func() { - fromVersion = k8sv1174 - toVersion = "v1.17.5+vmware.2" - }) - It("expect compareResult < 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult < 0).To(Equal(true)) - }) - }) - - Context("When patch version is lesser, v2.patch < v1.patch", func() { - BeforeEach(func() { - fromVersion = k8sv1174 - toVersion = "v1.17.3+vmware.2" - }) - It("expect compareResult > 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult > 0).To(Equal(true)) - }) - }) - - Context("When minor version is greater, v2.minor > v1.minor", func() { - BeforeEach(func() { - fromVersion = k8sv1172 - toVersion = k8sv1182 - }) - It("expect compareResult < 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult < 0).To(Equal(true)) - }) - }) - - Context("When minor version is lesser, v2.minor < v1.minor", func() { - BeforeEach(func() { - fromVersion = k8sv1182 - toVersion = k8sv1172 - }) - It("expect compareResult > 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult > 0).To(Equal(true)) - }) - }) - - Context("When vmware build version is greater, v2.vmwarebuild > v1.vmwarebuild", func() { - BeforeEach(func() { - fromVersion = k8sv1172 - toVersion = "v1.17.2+vmware.3" - }) - It("expect compareResult < 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult < 0).To(Equal(true)) - }) - }) - - Context("When vmware build version is lesser, v2.vmwarebuild < v1.vmwarebuild", func() { - BeforeEach(func() { - fromVersion = k8sv1172 - toVersion = "v1.17.2+vmware.1" - }) - It("expect compareResult > 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult > 0).To(Equal(true)) - }) - }) - - Context("When vmware build version is greater, v2.vmwarebuild < v1.vmwarebuild", func() { - BeforeEach(func() { - fromVersion = k8sv1172 - toVersion = "v1.17.2+vmware.11" - }) - It("expect compareResult < 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult < 0).To(Equal(true)) - }) - }) - - Context("When fromVersion vmware version is not an int", func() { - BeforeEach(func() { - toVersion = k8sv1174 - fromVersion = "v1.17.4+vmware.x" - }) - It("should fail to validate semver", func() { - Expect(err).To(HaveOccurred()) - Expect(err).To(MatchError("invalid version string")) - }) - }) - - Context("When toVersion vmware version is not an int", func() { - BeforeEach(func() { - toVersion = "v1.17.4+vmware.y" - fromVersion = k8sv1174 - }) - It("should fail to validate semver", func() { - Expect(compareResult).To(Equal(0)) - Expect(err).To(HaveOccurred()) - Expect(err).To(MatchError("invalid version string")) - }) - }) - - Context("When buildVersion includes -suffix and", func() { - BeforeEach(func() { - fromVersion = k8sv11731Fips1 - toVersion = "v1.17.4+vmware.1-fips.1" - }) - It("expect compareResult < 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult < 0).To(Equal(true)) - }) - }) - - Context("When buildVersion includes -suffix and buildVersion is different", func() { - BeforeEach(func() { - fromVersion = k8sv11731Fips1 - toVersion = k8sv11732Fips1 - }) - It("expect compareResult < 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult < 0).To(Equal(true)) - }) - }) - - Context("When buildVersion includes -suffix and buildVersion is different", func() { - BeforeEach(func() { - fromVersion = k8sv11732Fips1 - toVersion = k8sv11731Fips1 - }) - It("expect compareResult > 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult > 0).To(Equal(true)) - }) - }) - - Context("When buildVersion includes -suffix and buildVersion are same", func() { - BeforeEach(func() { - fromVersion = k8sv11731Fips1 - toVersion = k8sv11731Fips1 - }) - It("expect compareResult = 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult == 0).To(Equal(true)) - }) - }) - - Context("When buildVersion includes -suffix and version are different", func() { - BeforeEach(func() { - fromVersion = k8sv11731Fips1 - toVersion = "v1.17.3+vmware.1-fips.2" - }) - It("expect compareResult = 0", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(compareResult == 0).To(Equal(true)) - }) - }) -}) - -var _ = Describe("GenerateRandomID", func() { - var ( - length int - excludeCapitalLetters bool - actual string - ) - JustBeforeEach(func() { - actual = GenerateRandomID(length, excludeCapitalLetters) - }) - - Context("When length is zero", func() { - It("Should return an empty string", func() { - Expect(actual).To(Equal("")) - }) - }) - - Context("When excludeCapitalLetters is true", func() { - BeforeEach(func() { - length = 32 - excludeCapitalLetters = true - }) - It("result should not include capital letters", func() { - Expect(actual).To(Equal(strings.ToLower(actual))) - }) - }) -}) - -var _ = Describe("DivideVPCCidr", func() { - var ( - cidrStr string - extendedBits int - numSubsets int - actual []string - err error - ) - JustBeforeEach(func() { - actual, err = DivideVPCCidr(cidrStr, extendedBits, numSubsets) - }) - - Context("Given a valid cidr and subsets", func() { - BeforeEach(func() { - cidrStr = "192.168.1.1/24" - extendedBits = 1 - numSubsets = 2 - }) - It("should succeed", func() { - Expect(err).NotTo(HaveOccurred()) - expected := []string{"192.168.1.0/25", "192.168.1.128/25"} - Expect(actual).To(Equal(expected)) - }) - }) -}) - -var _ = Describe("CompareMajorMinorPatchVersion", func() { - var ( - v1 string - v2 string - result bool - ) - JustBeforeEach(func() { - result = CompareMajorMinorPatchVersion(v1, v2) - }) - - Context("When v1=v1.4.2 and v2=v1.4.2", func() { - BeforeEach(func() { - v1 = "v1.4.2" // nolint:goconst - v2 = "v1.4.2" - }) - It("should return true", func() { - Expect(result).To(BeTrue()) - }) - }) - Context("When v1=v1.4.2+vmware.1 and v2=v1.4.2", func() { - BeforeEach(func() { - v1 = "v1.4.2+vmware.1" - v2 = "v1.4.2" - }) - It("should return true", func() { - Expect(result).To(BeTrue()) - }) - }) - Context("When v1=v1.4.2-latest and v2=v1.4.2", func() { - BeforeEach(func() { - v1 = "v1.4.2-latest" // nolint:goconst - v2 = "v1.4.2" - }) - It("should return true", func() { - Expect(result).To(BeTrue()) - }) - }) - Context("When v1=v1.4.2-latest and v2=v1.4.2+vmware", func() { - BeforeEach(func() { - v1 = "v1.4.2-latest" - v2 = "v1.4.2+vmware" - }) - It("should return true", func() { - Expect(result).To(BeTrue()) - }) - }) - Context("When v1=v1.4.2-latest and v2=v1.4.0+vmware", func() { - BeforeEach(func() { - v1 = "v1.4.2-latest" - v2 = "v1.4.0+vmware" - }) - It("should return false", func() { - Expect(result).To(BeFalse()) - }) - }) - Context("When v1=v1.4.2-latest and v2=''", func() { - BeforeEach(func() { - v1 = "v1.4.2-latest" - v2 = "" - }) - It("should return false", func() { - Expect(result).To(BeFalse()) - }) - }) - Context("When both versions are empty", func() { - BeforeEach(func() { - v1 = "" - v2 = "" - }) - It("should return false", func() { - Expect(result).To(BeFalse()) - }) - }) -}) - -func Test_CompareVersions(t *testing.T) { - testCases := []struct { - description string - v1 string - v2 string - cmpSign string - expectResult bool - }{ - { - description: "v1 should be smaller than v2", - v1: "20.1.6", - v2: "21.1.3", - cmpSign: "<", - expectResult: true, - }, - { - description: "v1 should not be smaller than v2", - v1: "22.1.6", - v2: "21.1.3", - cmpSign: "<", - expectResult: false, - }, - { - description: "v1 should not be smaller than v2", - v1: "21.1.3", - v2: "21.1.3", - cmpSign: "<", - expectResult: false, - }, - { - description: "v1 should be equal to v2", - v1: "21.1.3", - v2: "21.1.3", - cmpSign: "=", - expectResult: true, - }, - { - description: "v1 should not be equal to v2", - v1: "22.1.3", - v2: "21.1.3", - cmpSign: "=", - expectResult: false, - }, - { - description: "v1 should be greater than v2", - v1: "22.1.3", - v2: "21.1.3", - cmpSign: ">", - expectResult: true, - }, - { - description: "v1 should not be greater than v2", - v1: "21.1.3", - v2: "21.1.3", - cmpSign: ">", - expectResult: false, - }, - { - description: "v1 should not be greater than v2", - v1: "20.1.3", - v2: "21.1.3", - cmpSign: ">", - expectResult: false, - }, - } - for _, tc := range testCases { - t.Run(tc.description, func(t *testing.T) { - result := CompareVersions(tc.v1, tc.cmpSign, tc.v2) - if result != tc.expectResult { - t.Errorf("version compare result is not expected") - } - }) - } -} - -func Test_IsAviInputEmpty(t *testing.T) { - testCases := []struct { - description string - input interface{} - expectResult bool - }{ - { - description: "nil should be considered as empty input", - input: nil, - expectResult: true, - }, - { - description: "empty string should be considered as empty input", - input: "", - expectResult: true, - }, - { - description: "\"\" should be considered as empty input", - input: `""`, - expectResult: true, - }, - { - description: "test should not be considered as empty input", - input: "test", - expectResult: false, - }, - } - for _, tc := range testCases { - t.Run(tc.description, func(t *testing.T) { - result := IsAviInputEmpty(tc.input) - if result != tc.expectResult { - t.Errorf("IsAviInputEmpty result is not expected") - } - }) - } -} diff --git a/tkg/utils/converter.go b/tkg/utils/converter.go deleted file mode 100644 index 77e6df7693..0000000000 --- a/tkg/utils/converter.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "strconv" - - "gopkg.in/yaml.v3" -) - -func Convert(in string) interface{} { - convs := []yamlScalarConvertable{ - nullConvertable, - integerConvertable, - booleanConvertable, - floatConvertable, - structuredConvertable, - } - - for _, conv := range convs { - value, convertable := conv(in) - if convertable { - return value - } - } - return in -} - -type yamlScalarConvertable func(in string) (interface{}, bool) - -func structuredConvertable(in string) (interface{}, bool) { - var result interface{} - if err := yaml.Unmarshal([]byte(in), &result); err == nil && result != nil { - return result, true - } - return result, false -} - -func nullConvertable(in string) (interface{}, bool) { - return nil, (in == "~" || in == "null") -} - -func booleanConvertable(in string) (interface{}, bool) { - if v, err := strconv.ParseBool(in); err == nil { - return v, true - } - return false, false -} - -func integerConvertable(in string) (interface{}, bool) { - if v, err := strconv.ParseUint(in, 0, 0); err == nil { - return v, true - } - return 0, false -} - -func floatConvertable(in string) (interface{}, bool) { - if v, err := strconv.ParseFloat(in, 64); err == nil { - return v, true - } - return 0, false -} diff --git a/tkg/utils/converter_test.go b/tkg/utils/converter_test.go deleted file mode 100644 index ddeaae495a..0000000000 --- a/tkg/utils/converter_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - . "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -var _ = Describe("Test Converter function Tests", func() { - Context("Test conversion with string types", func() { - It("Should return the expected output", func() { - Expect(Convert("abc")).To(Equal("abc")) - Expect(Convert("pqr")).To(Equal("pqr")) - Expect(Convert("a")).To(Equal("a")) - }) - }) - - Context("Test conversion with int types", func() { - It("Should return the expected output", func() { - Expect(Convert("1")).To(Equal(uint64(1))) - Expect(Convert("22")).To(Equal(uint64(22))) - Expect(Convert("100")).To(Equal(uint64(100))) - }) - }) - - Context("Test conversion with boolean types", func() { - It("Should return the expected output", func() { - Expect(Convert("true")).To(Equal(true)) - Expect(Convert("false")).To(Equal(false)) - Expect(Convert("True")).To(Equal(true)) - Expect(Convert("False")).To(Equal(false)) - }) - }) - - Context("Test conversion with null value", func() { - It("Should return the expected output", func() { - Expect(Convert("null")).To(BeNil()) - }) - }) - - Context("Test conversion with float value", func() { - It("Should return the expected output", func() { - Expect(Convert("1.2")).To(Equal(1.2)) - Expect(Convert("100.212")).To(Equal(100.212)) - }) - }) -}) diff --git a/tkg/utils/files.go b/tkg/utils/files.go deleted file mode 100644 index ea6110b181..0000000000 --- a/tkg/utils/files.go +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "crypto/sha256" - "encoding/hex" - "io" - "os" - "path/filepath" - - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" -) - -// CreateTempFile creates temporary file -func CreateTempFile(dir, prefix string) (string, error) { - f, err := os.CreateTemp(dir, prefix) - if err != nil { - return "", err - } - return f.Name(), nil -} - -// CopyFile copies source file to dest file -func CopyFile(sourceFile, destFile string) error { - input, err := os.ReadFile(sourceFile) - if err != nil { - return err - } - err = os.WriteFile(destFile, input, constants.ConfigFilePermissions) - return err -} - -// CopyToTempFile creates temp file and copies the sourcefile to created temp file -func CopyToTempFile(sourceFile, tempFilePrefix string) (string, error) { - path, err := CreateTempFile("", tempFilePrefix) - if err != nil { - return "", err - } - - err = CopyFile(sourceFile, path) - if err != nil { - return "", err - } - return path, nil -} - -// WriteToFile writes byte data to file -func WriteToFile(sourceFile string, data []byte) error { - return os.WriteFile(sourceFile, data, constants.ConfigFilePermissions) -} - -// DeleteFile deletes the file from given location -func DeleteFile(filePath string) error { - return os.Remove(filePath) -} - -// SHA256FromFile returns SHA256 sum of a file -func SHA256FromFile(filePath string) (string, error) { - f, err := os.Open(filePath) - if err != nil { - return "", err - } - defer f.Close() - - h := sha256.New() - if _, err := io.Copy(h, f); err != nil { - return "", err - } - b := h.Sum(nil) - - return hex.EncodeToString(b), nil -} - -// SaveFile saves the file to the provided path -// Also creates missing directories if any -func SaveFile(filePath string, data []byte) error { - dirName := filepath.Dir(filePath) - if _, serr := os.Stat(dirName); serr != nil { - merr := os.MkdirAll(dirName, os.ModePerm) - if merr != nil { - return merr - } - } - - err := os.WriteFile(filePath, data, constants.ConfigFilePermissions) - if err != nil { - return errors.Wrapf(err, "unable to save file '%s'", filePath) - } - - return nil -} - -// PathExists returns true if file/directory exists otherwise returns false -func PathExists(dir string) bool { - _, err := os.Stat(dir) - if err != nil && os.IsNotExist(err) { - return false - } - return true -} diff --git a/tkg/utils/kubeconfig.go b/tkg/utils/kubeconfig.go deleted file mode 100644 index db3584c48c..0000000000 --- a/tkg/utils/kubeconfig.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2021-2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "crypto/tls" - "crypto/x509" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strings" - "time" - - "github.com/pkg/errors" - "k8s.io/client-go/tools/clientcmd" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" - netutil "github.com/vmware-tanzu/tanzu-framework/tkg/utils/net" -) - -const ( - KubePublicNamespace = "kube-public" - PinnipedInfoConfigMapName = "pinniped-info" -) - -type clusterInfoConfig struct { - Version string `json:"apiVersion"` - Data struct { - Kubeconfig string `json:"kubeconfig"` - } - Kind string `json:"kind"` -} - -// GetClusterNameFromKubeconfigAndContext gets name of the cluster from kubeconfig file -// and kube-context -func GetClusterNameFromKubeconfigAndContext(kubeConfigPath, context string) (string, error) { - config, err := clientcmd.LoadFromFile(kubeConfigPath) - if err != nil { - return "", errors.Wrapf(err, "failed to load kubeconfig file from %q", kubeConfigPath) - } - - if context == "" { - context = config.CurrentContext - } - - for contextName, ctx := range config.Contexts { - if contextName == context { - return ctx.Cluster, nil - } - } - return "", errors.Errorf("unable to find cluster name from kubeconfig file: %q", kubeConfigPath) -} - -// GetClusterServerFromKubeconfigAndContext gets apiserver URL of the cluster from kubeconfig file -// and kube-context -func GetClusterServerFromKubeconfigAndContext(kubeConfigPath, context string) (string, error) { - config, err := clientcmd.LoadFromFile(kubeConfigPath) - if err != nil { - return "", errors.Wrapf(err, "failed to load kubeconfig file from %q", kubeConfigPath) - } - - if context == "" { - context = config.CurrentContext - } - clusterName := "" - for contextName, ctx := range config.Contexts { - if contextName == context { - clusterName = ctx.Cluster - break - } - } - if clusterName == "" { - return "", errors.Errorf("unable to find cluster apiserver url from kubeconfig file: %q", kubeConfigPath) - } - return config.Clusters[clusterName].Server, nil -} - -// GetClusterInfoFromCluster gets the cluster Info by accessing the cluster-info configMap in kube-public namespace -func GetClusterInfoFromCluster(clusterAPIServerURL, configmapName string) (*clientcmdapi.Cluster, error) { - clusterAPIServerURL = strings.TrimSpace(clusterAPIServerURL) - if !strings.HasPrefix(clusterAPIServerURL, "https://") && !strings.HasPrefix(clusterAPIServerURL, "http://") { - clusterAPIServerURL = "https://" + clusterAPIServerURL - } - _, err := url.Parse(clusterAPIServerURL) - if err != nil { - return nil, errors.Wrap(err, "failed to parse endpoint URL") - } - - clusterAPIServerURL = strings.TrimRight(clusterAPIServerURL, " /") - clusterInfoURL := clusterAPIServerURL + fmt.Sprintf("/api/v1/namespaces/%s/configmaps/%s", KubePublicNamespace, configmapName) - //nolint:noctx - req, _ := http.NewRequest("GET", clusterInfoURL, http.NoBody) - // To get the cluster ca certificate first time, we need to use skip verify the server certificate, - // all the later communications to cluster would be using CA after this call - clusterClient := &http.Client{ - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - // #nosec - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: true, - }, - }, - Timeout: time.Second * 10, - } - response, err := clusterClient.Do(req) - if err != nil { - return nil, errors.Wrap(err, "failed to get cluster-info from the end-point") - } - defer response.Body.Close() - - if response.StatusCode != http.StatusOK { - return nil, errors.New("failed to get cluster-info from the end-point") - } - - responseBody, err := io.ReadAll(response.Body) - if err != nil { - return nil, errors.Wrap(err, "failed to read the response body") - } - - var clusterIC clusterInfoConfig - err = json.Unmarshal(responseBody, &clusterIC) - if err != nil { - return nil, errors.Wrap(err, "error parsing http response body ") - } - - config, err := clientcmd.Load([]byte(clusterIC.Data.Kubeconfig)) - if err != nil { - return nil, errors.Wrap(err, "failed to load the kubeconfig") - } - - if len(config.Clusters) == 0 { - return nil, errors.New("failed to get cluster information ") - } - // since it is a map with one cluster object, get the first entry - var cluster *clientcmdapi.Cluster - for _, cluster = range config.Clusters { - break - } - - return cluster, nil -} - -// GetPinnipedInfoFromCluster gets the Pinniped Info by accessing the pinniped-info configMap in kube-public namespace -// 'discoveryPort' is used to optionally override the port used for discovery. This may be needed on setups that expose -// discovery information to unauthenticated users on a different port (for instance, to avoid the need to anonymous auth -// on the apiserver). By default, the endpoint from the cluster-info is used. -func GetPinnipedInfoFromCluster(clusterInfo *clientcmdapi.Cluster, discoveryPort *int) (*pinnipedinfo.PinnipedInfo, error) { - endpoint := strings.TrimRight(clusterInfo.Server, " /") - var err error - if discoveryPort != nil { - endpoint, err = netutil.SetPort(clusterInfo.Server, *discoveryPort) - if err != nil { - return nil, errors.Wrap(err, "failed to override discovery port") - } - } - pinnipedInfoURL := endpoint + fmt.Sprintf("/api/v1/namespaces/%s/configmaps/pinniped-info", KubePublicNamespace) - //nolint:noctx - req, _ := http.NewRequest("GET", pinnipedInfoURL, http.NoBody) - pool := x509.NewCertPool() - pool.AppendCertsFromPEM(clusterInfo.CertificateAuthorityData) - clusterClient := &http.Client{ - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - TLSClientConfig: &tls.Config{ - RootCAs: pool, - MinVersion: tls.VersionTLS12, - }, - }, - Timeout: time.Second * 10, - } - - response, err := clusterClient.Do(req) - if err != nil { - return nil, errors.Wrap(err, "failed to get pinniped-info from the cluster") - } - defer response.Body.Close() - - if response.StatusCode != http.StatusOK { - if response.StatusCode == http.StatusNotFound { - return nil, nil - } - return nil, fmt.Errorf("failed to get pinniped-info from the cluster. Status code: %+v", response.StatusCode) - } - - responseBody, err := io.ReadAll(response.Body) - if err != nil { - return nil, errors.Wrap(err, "failed to read the response body") - } - - return pinnipedinfo.ByteArrayToPinnipedInfo(responseBody) -} diff --git a/tkg/utils/kubeconfig_test.go b/tkg/utils/kubeconfig_test.go deleted file mode 100644 index 09561011ab..0000000000 --- a/tkg/utils/kubeconfig_test.go +++ /dev/null @@ -1,336 +0,0 @@ -// Copyright 2021-2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils_test - -import ( - "crypto/x509" - "encoding/pem" - "net/http" - "net/url" - "strconv" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/onsi/gomega/ghttp" - clientcmdapi "k8s.io/client-go/tools/clientcmd/api" - - "github.com/vmware-tanzu/tanzu-framework/pinniped-components/common/pkg/pinnipedinfo" - fakehelper "github.com/vmware-tanzu/tanzu-framework/tkg/fakes/helper" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" -) - -const ( - fakeIssuer = "https://fakeissuer.com" - fakeCluster = "fake-cluster" - fakeCAData = "fakeCAData" -) - -var _ = Describe("Kubeconfig Tests", func() { - var ( - err error - endpoint string - tlsserver *ghttp.Server - clustername string - issuer string - issuerCA string - servCert *x509.Certificate - ) - - const kubeconfig1Path = "../fakes/config/kubeconfig/config1.yaml" - Describe("Get cluster-info from the cluster", func() { - BeforeEach(func() { - tlsserver = ghttp.NewTLSServer() - servCert = tlsserver.HTTPTestServer.Certificate() - endpoint = tlsserver.URL() - }) - AfterEach(func() { - tlsserver.Close() - }) - Context("When the configMap 'cluster-info' is not present in kube-public namespace", func() { - BeforeEach(func() { - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - _, err = utils.GetClusterInfoFromCluster(endpoint, "cluster-info") - }) - It("should return the error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("failed to get cluster-info")) - }) - }) - Context("When the configMap 'cluster-info' is present but the returned format is incorrect ", func() { - BeforeEach(func() { - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusOK, "fake-format-value"), - ), - ) - _, err = utils.GetClusterInfoFromCluster(endpoint, "cluster-info") - }) - It("should return the error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("error parsing http response body")) - }) - }) - Context("When the configMap 'cluster-info' is present in kube-public namespace", func() { - var cluster *clientcmdapi.Cluster - BeforeEach(func() { - clusterInfo := fakehelper.GetFakeClusterInfo(endpoint, servCert) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/cluster-info"), - ghttp.RespondWith(http.StatusOK, clusterInfo), - ), - ) - cluster, err = utils.GetClusterInfoFromCluster(endpoint, "cluster-info") - }) - It("should return the cluster information", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(cluster.Server).Should(Equal(endpoint)) - }) - }) - Context("When a different ConfigMap from the kube-public namespace is used for discovery", func() { - var cluster *clientcmdapi.Cluster - BeforeEach(func() { - clusterInfo := fakehelper.GetFakeClusterInfo(endpoint, servCert) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/vip-cluster-info"), - ghttp.RespondWith(http.StatusOK, clusterInfo), - ), - ) - cluster, err = utils.GetClusterInfoFromCluster(endpoint, "vip-cluster-info") - }) - It("should return the cluster information", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(cluster.Server).Should(Equal(endpoint)) - }) - }) - }) - Describe("Get info from kubeconfig", func() { - var ( - kubeconfigPath string - context string - actual string - err error - ) - Context("When getting cluster name from kubeconfig", func() { - JustBeforeEach(func() { - actual, err = utils.GetClusterNameFromKubeconfigAndContext(kubeconfigPath, context) - }) - AfterEach(func() { - kubeconfigPath = "" - context = "" - }) - Context("When kubeconfig path is invalid", func() { - BeforeEach(func() { - kubeconfigPath = "../invalid1/config.yaml" - }) - It("Should fail to find the kubeconfig", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("When context is missing", func() { - BeforeEach(func() { - kubeconfigPath = kubeconfig1Path - }) - It("Should get the current context ", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(actual).To(Equal("horse-cluster")) - }) - }) - Context("When context isn't found in kubeconfig", func() { - BeforeEach(func() { - kubeconfigPath = kubeconfig1Path - context = "wrong" - }) - It("Should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("unable to find cluster name from kubeconfig file: \"../fakes/config/kubeconfig/config1.yaml\"")) - }) - }) - }) - Context("When getting server from kubeconfig", func() { - JustBeforeEach(func() { - actual, err = utils.GetClusterServerFromKubeconfigAndContext(kubeconfigPath, context) - }) - Context("When kubeconfig path is invalid", func() { - BeforeEach(func() { - kubeconfigPath = "../invalid/config.yaml" - }) - It("Should fail to open the kubeconfig", func() { - Expect(err).To(HaveOccurred()) - }) - }) - Context("When context is empty", func() { - BeforeEach(func() { - kubeconfigPath = kubeconfig1Path - }) - It("Should use the currennt context", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(actual).To(Equal("https://horse.org:4443")) - }) - }) - }) - }) - Describe("Get pinniped-info from the cluster", func() { - BeforeEach(func() { - tlsserver = ghttp.NewTLSServer() - servCert = tlsserver.HTTPTestServer.Certificate() - endpoint = tlsserver.URL() - }) - AfterEach(func() { - tlsserver.Close() - }) - - Context("When the configMap 'pinniped-info' is not present in kube-public namespace", func() { - var cluster clientcmdapi.Cluster - var gotPinnipedInfo *pinnipedinfo.PinnipedInfo - BeforeEach(func() { - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusNotFound, "not found"), - ), - ) - cluster.Server = endpoint - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - cluster.CertificateAuthorityData = certBytes - gotPinnipedInfo, err = utils.GetPinnipedInfoFromCluster(&cluster, nil) - }) - It("should not return an error", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotPinnipedInfo).Should(BeNil()) - }) - }) - Context("When the configMap 'pinniped-info' is present but the returned format is incorrect", func() { - var cluster clientcmdapi.Cluster - BeforeEach(func() { - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusOK, "fake-format-value"), - ), - ) - cluster.Server = endpoint - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - cluster.CertificateAuthorityData = certBytes - _, err = utils.GetPinnipedInfoFromCluster(&cluster, nil) - }) - It("should return the pinniped-info successfully", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).Should(ContainSubstring("error parsing http response body")) - }) - }) - Context("When the configMap 'pinniped-info' is present in kube-public namespace", func() { - var cluster clientcmdapi.Cluster - var gotPinnipedInfo *pinnipedinfo.PinnipedInfo - BeforeEach(func() { - clustername = fakeCluster - issuer = fakeIssuer - issuerCA = fakeCAData - pinnipedInfo := fakehelper.GetFakePinnipedInfo(pinnipedinfo.PinnipedInfo{ - ClusterName: clustername, - Issuer: issuer, - IssuerCABundleData: issuerCA, - }) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusOK, pinnipedInfo), - ), - ) - cluster.Server = endpoint - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - cluster.CertificateAuthorityData = certBytes - gotPinnipedInfo, err = utils.GetPinnipedInfoFromCluster(&cluster, nil) - }) - It("should return the pinniped-info successfully", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotPinnipedInfo.ClusterName).Should(Equal(clustername)) - Expect(gotPinnipedInfo.Issuer).Should(Equal(issuer)) - Expect(gotPinnipedInfo.IssuerCABundleData).Should(Equal(issuerCA)) - }) - }) - Context("When a different port is used for discovery of 'pinniped-info'", func() { - var cluster clientcmdapi.Cluster - var gotPinnipedInfo *pinnipedinfo.PinnipedInfo - var discoveryTLSServer *ghttp.Server - BeforeEach(func() { - // The second TLS server mimics the different endpoints for - // kube-apiserver and discovery. - discoveryTLSServer = ghttp.NewTLSServer() - discoveryEndpoint := discoveryTLSServer.URL() - // URL is valid, ports are expected to fit in 16 bits, so we're - // skipping a bunch of error handling. - u, _ := url.Parse(discoveryEndpoint) - discoveryPort64, _ := strconv.ParseInt(u.Port(), 10, 64) - discoveryPort := int(discoveryPort64) - - clustername = fakeCluster - issuer = fakeIssuer - issuerCA = fakeCAData - pinnipedInfo := fakehelper.GetFakePinnipedInfo(pinnipedinfo.PinnipedInfo{ - ClusterName: clustername, - Issuer: issuer, - IssuerCABundleData: issuerCA, - }) - discoveryTLSServer.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusOK, pinnipedInfo), - ), - ) - cluster.Server = endpoint - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - cluster.CertificateAuthorityData = certBytes - gotPinnipedInfo, err = utils.GetPinnipedInfoFromCluster(&cluster, &discoveryPort) - }) - It("should return the pinniped-info successfully", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotPinnipedInfo.ClusterName).Should(Equal(clustername)) - Expect(gotPinnipedInfo.Issuer).Should(Equal(issuer)) - Expect(gotPinnipedInfo.IssuerCABundleData).Should(Equal(issuerCA)) - }) - }) - Context("When the concierge endpoint is distinct from the cluster endpoint", func() { - var cluster clientcmdapi.Cluster - var gotPinnipedInfo *pinnipedinfo.PinnipedInfo - var conciergeEndpoint string - BeforeEach(func() { - clustername = fakeCluster - issuer = fakeIssuer - issuerCA = fakeCAData - conciergeEndpoint = "my-favourite-concierge.com" - pinnipedInfo := fakehelper.GetFakePinnipedInfo(pinnipedinfo.PinnipedInfo{ - ClusterName: clustername, - Issuer: issuer, - IssuerCABundleData: issuerCA, - ConciergeEndpoint: conciergeEndpoint, - }) - tlsserver.AppendHandlers( - ghttp.CombineHandlers( - ghttp.VerifyRequest("GET", "/api/v1/namespaces/kube-public/configmaps/pinniped-info"), - ghttp.RespondWith(http.StatusOK, pinnipedInfo), - ), - ) - cluster.Server = endpoint - certBytes := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: servCert.Raw}) - cluster.CertificateAuthorityData = certBytes - gotPinnipedInfo, err = utils.GetPinnipedInfoFromCluster(&cluster, nil) - }) - It("should return the pinniped-info successfully", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(gotPinnipedInfo.ClusterName).Should(Equal(clustername)) - Expect(gotPinnipedInfo.Issuer).Should(Equal(issuer)) - Expect(gotPinnipedInfo.IssuerCABundleData).Should(Equal(issuerCA)) - Expect(gotPinnipedInfo.ConciergeEndpoint).Should(Equal(conciergeEndpoint)) - }) - }) - }) -}) diff --git a/tkg/utils/lock.go b/tkg/utils/lock.go deleted file mode 100644 index 70ad56a2e6..0000000000 --- a/tkg/utils/lock.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package utils - -import ( - "os" - "path/filepath" - "time" - - "github.com/juju/fslock" - "github.com/pkg/errors" -) - -const ( - // DefaultLockTimeout is the default time waiting on the filelock - DefaultLockTimeout = 10 * time.Minute -) - -// GetFileLockWithTimeOut returns a file lock with timeout -func GetFileLockWithTimeOut(lockPath string, lockDuration time.Duration) (*fslock.Lock, error) { - dir := filepath.Dir(lockPath) - - if _, err := os.Stat(dir); os.IsNotExist(err) { - if err := os.MkdirAll(dir, 0o700); err != nil { - return nil, err - } - } - - lock := fslock.New(lockPath) - - if err := lock.LockWithTimeout(lockDuration); err != nil { - return &fslock.Lock{}, errors.Wrap(err, "failed to acquire a lock with timeout") - } - return lock, nil -} diff --git a/tkg/utils/net/set_port.go b/tkg/utils/net/set_port.go deleted file mode 100644 index 58c4311129..0000000000 --- a/tkg/utils/net/set_port.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package net provides helpers to work with network addresses. -package net - -import ( - "fmt" - "net/url" - "strings" -) - -// SetPort takes a URL and returns it with the HTTPS scheme and the -// given port. -// If the endpoint is missing an HTTP(S) scheme, assumes input of the form -// host[:port]. -// This is mainly meant to handle the typical case of a user entering either -// just a host, host:port, or http(s)://host:port -func SetPort(endpoint string, portOverride int) (string, error) { - prefix := "" - // Preprocess the string depending on whether it has a scheme or not. - if strings.HasPrefix(endpoint, "https:") || strings.HasPrefix(endpoint, "http:") { - u, err := url.Parse(endpoint) - if err != nil { - return "", err - } - prefix = u.Hostname() - } else { - // No scheme. Strip out a port if it exists. - prefix = strings.Split(endpoint, ":")[0] - } - - return fmt.Sprintf("https://%s:%d", prefix, portOverride), nil -} diff --git a/tkg/utils/net/set_port_test.go b/tkg/utils/net/set_port_test.go deleted file mode 100644 index 1b0978108a..0000000000 --- a/tkg/utils/net/set_port_test.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 -package net_test - -import ( - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - netutil "github.com/vmware-tanzu/tanzu-framework/tkg/utils/net" -) - -func TestNetUtil(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Net util suite") -} - -var _ = Describe("Overriding ports in an endpoint", func() { - Context("when a port is provided", func() { - It("should override the port", func() { - endpoint := "https://foo.com:1234" - result, err := netutil.SetPort(endpoint, 443) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("https://foo.com:443")) - }) - }) - Context("when no scheme is provided", func() { - It("should override the port", func() { - endpoint := "foo.com" - result, err := netutil.SetPort(endpoint, 443) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("https://foo.com:443")) - }) - }) - Context("when no scheme is provided, but a port is set", func() { - It("should override the port", func() { - endpoint := "foo.com:6443" - result, err := netutil.SetPort(endpoint, 443) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("https://foo.com:443")) - }) - }) - Context("when a port with the same value as the overridden value is in the endpoint", func() { - It("should preserve the port", func() { - endpoint := "https://foo.com:443" - result, err := netutil.SetPort(endpoint, 443) - Expect(err).NotTo(HaveOccurred()) - Expect(result).To(Equal("https://foo.com:443")) - }) - }) -}) diff --git a/tkg/vc/client.go b/tkg/vc/client.go deleted file mode 100644 index c072c2e060..0000000000 --- a/tkg/vc/client.go +++ /dev/null @@ -1,1074 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package vc ... -package vc - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strings" - - "github.com/pkg/errors" - "github.com/vmware/govmomi" - "github.com/vmware/govmomi/find" - "github.com/vmware/govmomi/object" - "github.com/vmware/govmomi/property" - "github.com/vmware/govmomi/session" - "github.com/vmware/govmomi/vapi/rest" - "github.com/vmware/govmomi/vim25" - "github.com/vmware/govmomi/vim25/mo" - "github.com/vmware/govmomi/vim25/soap" - "github.com/vmware/govmomi/vim25/types" - - tkgtypes "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VSphere resource tags for tkg resource -const ( - K8SVmPropertyID = "KUBERNETES_SEMVER" - OVAVersionPropertyID = "VERSION" - DistroNamePropertyID = "DISTRO_NAME" - DistroVersionPropertyID = "DISTRO_VERSION" - DistroArchPropertyID = "DISTRO_ARCH" - VMPropertyCategoryCAPI = "Cluster API Provider (CAPI)" - VMGuestInfoUserDataKey = "guestinfo.userdata" - VCDefaultPort = "443" -) - -// Constant representing the number of version types tracked in a semver -const numOfSemverVersionNumbers = 3 - -// DefaultClient dafaults vc client -type DefaultClient struct { - vmomiClient *govmomi.Client - restClient *rest.Client -} - -// GetAuthenticatedVCClient returns authenticated VC client -func GetAuthenticatedVCClient(vcHost, vcUsername, vcPassword, thumbprint string, insecure bool, vcClientFactory VcClientFactory) (Client, error) { - host := strings.TrimSpace(vcHost) - if !strings.HasPrefix(host, "http") { - host = "https://" + host - } - vcURL, err := url.Parse(host) - if err != nil { - return nil, errors.Wrap(err, "failed to parse vc host") - } - vcURL.Path = "/sdk" - vcClient, err := vcClientFactory.NewClient(vcURL, thumbprint, insecure) - if err != nil { - return nil, errors.Wrap(err, "failed to create vc client") - } - _, err = vcClient.Login(context.TODO(), vcUsername, vcPassword) - if err != nil { - return nil, errors.Wrap(err, "failed to login to vSphere") - } - return vcClient, nil -} - -// NewClient returns a new VC Client -func NewClient(vcURL *url.URL, thumbprint string, insecure bool) (Client, error) { - vmomiClient, err := newGovmomiClient(vcURL, thumbprint, insecure) - if err != nil { - return nil, err - } - restClient := rest.NewClient(vmomiClient.Client) - return &DefaultClient{ - vmomiClient: vmomiClient, - restClient: restClient, - }, nil -} - -func newGovmomiClient(vcURL *url.URL, thumbprint string, insecure bool) (*govmomi.Client, error) { - ctx := context.Background() - var vmomiClient *govmomi.Client - var err error - - soapClient := soap.NewClient(vcURL, insecure) - if !insecure && thumbprint != "" { - soapClient.SetThumbprint(vcURL.Host, thumbprint) - } - vimClient, err := vim25.NewClient(ctx, soapClient) - if err != nil { - return nil, err - } - vmomiClient = &govmomi.Client{ - Client: vimClient, - SessionManager: session.NewManager(vimClient), - } - - // Only login if the URL contains user information. - if vcURL.User != nil { - err = vmomiClient.Login(ctx, vcURL.User) - if err != nil { - return nil, err - } - } - return vmomiClient, err -} - -// Login authenticates with vCenter using user/password -func (c *DefaultClient) Login(ctx context.Context, user, password string) (string, error) { - var err error - var token string - - client := c.vmomiClient - if client == nil { - return "", fmt.Errorf("uninitialized vmomi client") - } - - userInfo := url.UserPassword(user, password) - if err = client.Login(ctx, userInfo); err != nil { - return "", errors.Wrap(err, "cannot login to vc") - } - - restClient := c.restClient - if restClient == nil { - return "", fmt.Errorf("uninitialized vapi rest client") - } - if err = restClient.Login(ctx, userInfo); err != nil { - return "", errors.Wrap(err, "cannot login to vc") - } - - token, err = c.AcquireTicket() - return token, err -} - -// AcquireTicket acquires a new session ticket for the user associated with -// the authenticated client. -func (c *DefaultClient) AcquireTicket() (string, error) { - var err error - var token string - ctx := context.Background() - - client := c.vmomiClient - if client == nil { - return "", fmt.Errorf("uninitialized vmomi client") - } - - if token, err = client.SessionManager.AcquireCloneTicket(ctx); err != nil { - return "", errors.Wrap(err, "could not acquire ticket session") - } - - return token, nil -} - -// CheckUserSessionActive checks if a user session is Active -func (c *DefaultClient) CheckUserSessionActive() (bool, error) { - ctx := context.Background() - - client := c.vmomiClient - if client == nil { - return false, fmt.Errorf("uninitialized vmomi client") - } - return client.SessionManager.SessionIsActive(ctx) -} - -// GetDatacenters returns a list of all datacenters in the vSphere inventory. -func (c *DefaultClient) GetDatacenters(ctx context.Context) ([]*models.VSphereDatacenter, error) { - if c.vmomiClient == nil { - return nil, fmt.Errorf("uninitialized vmomi client") - } - viewTypes := []string{TypeDatacenter} - v, err := c.createContainerView(ctx, "", viewTypes) - if err != nil { - return nil, errors.Wrap(err, "error creating datacenter view") - } - - var dcs []mo.Datacenter - err = v.Retrieve(ctx, viewTypes, []string{"name"}, &dcs) - if err != nil { - return nil, errors.Wrap(err, "error retrieving datacenters") - } - - datacenters := make([]*models.VSphereDatacenter, 0, len(dcs)) - - for i := range dcs { - path, _, err := c.GetPath(ctx, dcs[i].Reference().Value) - if err != nil { - continue - } - - dcModel := models.VSphereDatacenter{ - Moid: dcs[i].Reference().Value, - Name: path, - } - datacenters = append(datacenters, &dcModel) - } - return datacenters, nil -} - -// GetDataCenterMOID return the MOID of the data center -func (c *DefaultClient) GetDataCenterMOID(ctx context.Context, dcName string) (string, error) { - if c.vmomiClient == nil { - return "", fmt.Errorf("uninitialized vmomi client") - } - dcs, err := c.GetDatacenters(ctx) - if err != nil { - return "", errors.Wrap(err, "failed to retrieve Data centers") - } - - dcName = strings.TrimPrefix(dcName, "*") - - count := 0 - moid := "" - for _, dc := range dcs { - if strings.HasSuffix(dc.Name, dcName) { - moid = dc.Moid - count++ - } - } - - if count == 0 { - return "", errors.Errorf("unable to find the datacenter:%v", dcName) - } - - if count > 1 { - return "", errors.Errorf("multiple datacenters %s are found", dcName) - } - - return moid, nil -} - -// GetDatastores returns a list of Datastores for the given datacenter -func (c *DefaultClient) GetDatastores(ctx context.Context, datacenterMOID string) ([]*models.VSphereDatastore, error) { - if c.vmomiClient == nil { - return nil, fmt.Errorf("uninitialized vmomi client") - } - - results := []*models.VSphereDatastore{} - - var dss []mo.Datastore - - viewTypes := []string{TypeDatastore} - - dcRef := TypeDatacenter + ":" + datacenterMOID - - view, err := c.createContainerView(context.Background(), dcRef, viewTypes) - if err != nil { - return results, errors.Wrap(err, "error creating container view") - } - - err = view.Retrieve(ctx, viewTypes, []string{"name"}, &dss) - if err != nil { - return results, errors.Wrap(err, "failed to get datastores") - } - - for i := range dss { - managedObject := models.VSphereDatastore{Moid: dss[i].Self.Value} - path, _, err := c.GetPath(ctx, dss[i].Reference().Value) - - if err != nil { - managedObject.Name = dss[i].Name - } else { - managedObject.Name = path - } - results = append(results, &managedObject) - } - return results, err -} - -// GetPath takes in the MOID of a vsphere resource and returns a fully qualified path -func (c *DefaultClient) GetPath(ctx context.Context, moid string) (string, []*models.VSphereManagementObject, error) { - client := c.vmomiClient - var objects []*models.VSphereManagementObject - if moid == "" { - return "", objects, errors.New("a non-empty moid should be passed to GetPath") - } - if client == nil { - return "", []*models.VSphereManagementObject{}, fmt.Errorf("uninitialized vmomi client") - } - path := []string{} - defaultFolder := "" - for { - ref, commonProps, resourceType, err := c.populateGoVCVars(moid) - if err != nil { - break - } - - managedEntity := &mo.ManagedEntity{} - name, err := commonProps.ObjectName(ctx) - if err != nil { - return "", objects, err - } - path = append([]string{name}, path...) - err = commonProps.Properties(ctx, ref, []string{"parent"}, managedEntity) - if err != nil { - return "", objects, err - } - if managedEntity.Parent == nil { - break - } - - if isFolder(moid) && isDatacenter(managedEntity.Parent.Reference().Value) { - defaultFolder = moid - } else if !isDatacenter(moid) { - obj := &models.VSphereManagementObject{ - Name: name, - Moid: ref.Value, - ParentMoid: managedEntity.Parent.Reference().Value, - ResourceType: resourceType, - } - - objects = append(objects, obj) - } - moid = managedEntity.Parent.Reference().Value - } - - objects = c.unsetDefaultFolder(objects, defaultFolder) - - if len(path) <= 1 { - return "", objects, errors.New("not a valid path") - } - - path = path[1:] - res := "/" + strings.Join(path, "/") - - return res, objects, nil -} - -func (c *DefaultClient) populateGoVCVars(moid string) (ref types.ManagedObjectReference, commonProps object.Common, resourceType string, err error) { - switch { - case isResourcePool(moid): - ref = types.ManagedObjectReference{Type: TypeResourcePool, Value: moid} - commonProps = object.NewResourcePool(c.vmomiClient.Client, ref).Common - resourceType = models.VSphereManagementObjectResourceTypeRespool - case isClusterComputeResource(moid): - ref = types.ManagedObjectReference{Type: TypeCluster, Value: moid} - commonProps = object.NewClusterComputeResource(c.vmomiClient.Client, ref).Common - resourceType = models.VSphereManagementObjectResourceTypeCluster - case isHostComputeResource(moid): - ref = types.ManagedObjectReference{Type: TypeComputeResource, Value: moid} - commonProps = object.NewComputeResource(c.vmomiClient.Client, ref).Common - resourceType = models.VSphereManagementObjectResourceTypeHost - case isDatastore(moid): - ref = types.ManagedObjectReference{Type: TypeDatastore, Value: moid} - commonProps = object.NewDatastore(c.vmomiClient.Client, ref).Common - resourceType = models.VSphereManagementObjectResourceTypeDatastore - case isFolder(moid): - ref = types.ManagedObjectReference{Type: TypeFolder, Value: moid} - commonProps = object.NewFolder(c.vmomiClient.Client, ref).Common - resourceType = models.VSphereManagementObjectResourceTypeFolder - case isVirtualMachine(moid): - ref = types.ManagedObjectReference{Type: TypeVirtualMachine, Value: moid} - commonProps = object.NewVirtualMachine(c.vmomiClient.Client, ref).Common - resourceType = models.VSphereManagementObjectResourceTypeVM - case isDatacenter(moid): - ref = types.ManagedObjectReference{Type: TypeDatacenter, Value: moid} - commonProps = object.NewDatacenter(c.vmomiClient.Client, ref).Common - resourceType = models.VSphereManagementObjectResourceTypeDatacenter - case isNetwork(moid): - ref = types.ManagedObjectReference{Type: TypeNetwork, Value: moid} - commonProps = object.NewNetwork(c.vmomiClient.Client, ref).Common - resourceType = models.VSphereManagementObjectResourceTypeNetwork - case isDvPortGroup(moid): - ref = types.ManagedObjectReference{Type: TypeDvpg, Value: moid} - commonProps = object.NewDistributedVirtualPortgroup(c.vmomiClient.Client, ref).Common - resourceType = models.VSphereManagementObjectResourceTypeNetwork - case isDvs(moid): - ref = types.ManagedObjectReference{Type: TypeDvs, Value: moid} - commonProps = object.NewDistributedVirtualSwitch(c.vmomiClient.Client, ref).Common - resourceType = models.VSphereManagementObjectResourceTypeNetwork - default: - err = errors.New("moid value not recognized") - } - return ref, commonProps, resourceType, err -} - -func (c *DefaultClient) unsetDefaultFolder(objects []*models.VSphereManagementObject, defaultFolder string) []*models.VSphereManagementObject { - for i, obj := range objects { - if obj.ParentMoid == defaultFolder { - objects[i].ParentMoid = "" - } - } - return objects -} - -func isDuplicate(names map[string]bool, name string) bool { - _, exists := names[name] - return exists -} - -// GetDuplicateNetworks return a map of duplicate networks from the available networks. -func GetDuplicateNetworks(networks []*models.VSphereNetwork) map[string]bool { - dupNetworks := make(map[string]bool, len(networks)) - for i := range networks { - name := networks[i].Name - dupNetworks[name] = isDuplicate(dupNetworks, name) - } - - return dupNetworks -} - -/* - There could be different networks with the same name due to name relaxation introduced by NSX. We will need - to provide a way to uniquely identify duplicate networks. - - Here are a list of scenarios which could result in multiple networks. - 1. Virtual port groups created on NSX could be created with the same name as a network created on vSphere. - 2. There could be port groups with the same name in a Distributed virtual switch or across multiple Distributed virtual switches. - - Algorithm to convert the duplicate network names to something with which a network could be uniquely identified - =============================================================================================================== - 1. List all networks using the govmomi APIs - 2. Identify all the duplicate networks (networks with the same inventory path) - 3. If a duplicate network is found - i. Check if the network is of type 'PortGroup'. If it is of type port group, append the name of virtual switch to the network name. - Once the network path is modified to include the name of the virtual switch, use the 'findNetwork' API to see if duplicates exist even after including the name of the Virtual Switch. - If duplicate still exists, replace the network name with its MOID. - ii. If not 'PortGroup', replace the network name with MOID. -*/ - -// GetNetworks gets list of network for the given datacenter -func (c *DefaultClient) GetNetworks(ctx context.Context, datacenterMOID string) ([]*models.VSphereNetwork, error) { - results := []*models.VSphereNetwork{} - client := c.vmomiClient - if client == nil { - return results, errors.New("uninitialized vmomi client") - } - - var networks []mo.Network - - viewTypes := []string{TypeNetwork} - - dcRef := TypeDatacenter + ":" + datacenterMOID - - view, err := c.createContainerView(context.Background(), dcRef, viewTypes) - if err != nil { - return results, errors.Wrap(err, "error creating container view") - } - - err = view.Retrieve(ctx, viewTypes, []string{"name"}, &networks) - if err != nil { - return results, errors.Wrap(err, "failed to get networks") - } - - for i := range networks { - managedObject := models.VSphereNetwork{Moid: networks[i].Reference().Type + ":" + networks[i].Reference().Value} - path, _, err := c.GetPath(ctx, networks[i].Reference().Value) - if err != nil { - managedObject.Name = networks[i].Name - } else { - managedObject.Name = path - } - managedObject.DisplayName = managedObject.Name - results = append(results, &managedObject) - } - - // update the displayName of the vSphere network if there are duplicates with the same name. - // we also update the 'Name' field with 'Moid' for duplicate networks - duplNetworks := GetDuplicateNetworks(results) - for i := range results { - if duplNetworks[results[i].Name] { - ref, commonProps, _, err := c.populateGoVCVars(strings.Split(results[i].Moid, ":")[1]) - if err != nil { - changeNetworkNameToMoid(results[i]) - continue - } - - if ref.Type == TypeDvpg { - // get network path with the name of virtual switch included - name, err := c.getNetworkNameWithVirtualSwitch(ctx, results[i].Name, ref, commonProps) - if err != nil { - changeNetworkNameToMoid(results[i]) - continue - } - - // check if duplicate networks exist with the same path - _, err = c.FindNetwork(ctx, name, "") - if _, ok := err.(*find.MultipleFoundError); ok { - // if duplicate networks with the same path are found - changeNetworkNameToMoid(results[i]) - } else { - results[i].Name = name - results[i].DisplayName = name - } - } else { - changeNetworkNameToMoid(results[i]) - } - } - } - return results, nil -} - -func (c *DefaultClient) getNetworkNameWithVirtualSwitch(ctx context.Context, networkName string, portGroupRef types.ManagedObjectReference, portGroupCommonProps object.Common) (string, error) { - var portGroup mo.DistributedVirtualPortgroup - err := portGroupCommonProps.Properties(ctx, portGroupRef, []string{"config"}, &portGroup) - if err != nil { - return "", err - } - - dvpgName, err := portGroupCommonProps.ObjectName(ctx) - if err != nil { - return "", err - } - - dvsName, err := c.getVirtualSwitchName(ctx, &portGroup) - if err != nil { - return "", err - } - - lastIndex := strings.LastIndex(networkName, "/") - networkName = networkName[0:lastIndex] + "/" + dvsName + "/" + dvpgName - - return networkName, nil -} - -func (c *DefaultClient) getVirtualSwitchName(ctx context.Context, portGroup *mo.DistributedVirtualPortgroup) (string, error) { - _, dvsCommonProps, _, err := c.populateGoVCVars(portGroup.Config.DistributedVirtualSwitch.Value) - if err != nil { - return "", err - } - - dvsName, err := dvsCommonProps.ObjectName(ctx) - if err != nil { - return "", err - } - - return dvsName, nil -} - -func changeNetworkNameToMoid(network *models.VSphereNetwork) { - network.DisplayName = network.Name + "(" + network.Moid + ")" - network.Name = network.Moid -} - -// GetResourcePools gets resourcepools for the given datacenter -func (c *DefaultClient) GetResourcePools(ctx context.Context, datacenterMOID string) ([]*models.VSphereResourcePool, error) { - if c.vmomiClient == nil { - return nil, fmt.Errorf("uninitialized vmomi client") - } - - results := []*models.VSphereResourcePool{} - - var rps []mo.ResourcePool - - viewTypes := []string{TypeResourcePool} - - dcRef := TypeDatacenter + ":" + datacenterMOID - - view, err := c.createContainerView(context.Background(), dcRef, viewTypes) - if err != nil { - return results, errors.Wrap(err, "error creating container view") - } - - err = view.Retrieve(ctx, viewTypes, []string{}, &rps) - if err != nil { - return results, errors.Wrap(err, "failed to get resource pools") - } - - for i := range rps { - path, _, err := c.GetPath(ctx, rps[i].Self.Value) - if err != nil { - continue - } - managedObject := models.VSphereResourcePool{Name: path, Moid: rps[i].Reference().Value} - results = append(results, &managedObject) - } - return results, nil -} - -// GetVirtualMachines returns list of virtual machines in the given datacenter -func (c *DefaultClient) getVirtualMachines(ctx context.Context, datacenterMOID string) ([]mo.VirtualMachine, error) { - if c.vmomiClient == nil { - return nil, fmt.Errorf("uninitialized vmomi client") - } - - var vms []mo.VirtualMachine - - viewTypes := []string{TypeVirtualMachine} - - dcRef := TypeDatacenter + ":" + datacenterMOID - - view, err := c.createContainerView(context.Background(), dcRef, viewTypes) - if err != nil { - return vms, errors.Wrap(err, "error creating container view") - } - - err = view.Retrieve(ctx, viewTypes, []string{"name", "config"}, &vms) - if err != nil { - return vms, errors.Wrap(err, "failed to get virtual machines") - } - - return vms, nil -} - -// GetVirtualMachines gets vms under given datacenter -func (c *DefaultClient) GetVirtualMachines(ctx context.Context, datacenterMOID string) ([]*models.VSphereVirtualMachine, error) { - results := []*models.VSphereVirtualMachine{} - - vms, err := c.getVirtualMachines(ctx, datacenterMOID) - if err != nil { - return results, err - } - - for i := range vms { - path, _, err := c.GetPath(ctx, vms[i].Self.Value) - if err != nil { - continue - } - obj := &models.VSphereVirtualMachine{Name: path, Moid: vms[i].Reference().Value} - results = append(results, obj) - } - return results, nil -} - -// getImportedVirtualMachinesImages gets imported virtual machine images used for tkg -func (c *DefaultClient) getImportedVirtualMachinesImages(ctx context.Context, datacenterMOID string) ([]mo.VirtualMachine, error) { - if c.vmomiClient == nil { - return nil, fmt.Errorf("uninitialized vmomi client") - } - - var vms []mo.VirtualMachine - - viewTypes := []string{TypeVirtualMachine} - - dcRef := TypeDatacenter + ":" + datacenterMOID - - view, err := c.createContainerView(context.Background(), dcRef, viewTypes) - if err != nil { - return vms, errors.Wrap(err, "error creating container view") - } - - filter := property.Filter{} - filter["runtime.powerState"] = types.VirtualMachinePowerStatePoweredOff - - var content []types.ObjectContent - err = view.Retrieve(ctx, viewTypes, filter.Keys(), &content) - if err != nil { - return vms, err - } - - objs := filter.MatchObjectContent(content) - if len(objs) == 0 { - return vms, nil - } - pc := property.DefaultCollector(c.vmomiClient.Client) - - err = pc.Retrieve(ctx, objs, []string{"name", "config", "runtime.powerState"}, &vms) - if err != nil { - return vms, err - } - - results := []mo.VirtualMachine{} - - for i := range vms { - if vms[i].Config == nil { - continue - } - - if vms[i].Config.Template { - results = append(results, vms[i]) - continue - } - isImported := true - for _, exConfig := range vms[i].Config.ExtraConfig { - // user-imported node image should not have the the key - if exConfig.GetOptionValue().Key == VMGuestInfoUserDataKey { - isImported = false - break - } - } - if isImported { - results = append(results, vms[i]) - } - } - - return results, nil -} - -// GetVirtualMachineImages gets vm templates for kubernetes -func (c *DefaultClient) GetVirtualMachineImages(ctx context.Context, datacenterMOID string) ([]*tkgtypes.VSphereVirtualMachine, error) { - results := []*tkgtypes.VSphereVirtualMachine{} - - vms, err := c.getImportedVirtualMachinesImages(ctx, datacenterMOID) - if err != nil { - return results, err - } - - for i := range vms { - if ovaVersion, distroName, distroVersion, distroArch := c.getVMMetadata(&vms[i]); ovaVersion != "" { - path, _, err := c.GetPath(ctx, vms[i].Self.Value) - if err != nil { - if ctx.Err() != nil { - return results, err - } - continue - } - obj := &tkgtypes.VSphereVirtualMachine{ - Name: path, - Moid: vms[i].Reference().Value, - OVAVersion: ovaVersion, - DistroName: distroName, - DistroVersion: distroVersion, - DistroArch: distroArch, - IsTemplate: vms[i].Config.Template, - } - results = append(results, obj) - } - } - return results, nil -} - -func (c *DefaultClient) getVMMetadata(vm *mo.VirtualMachine) (ovaVersion, distroName, distroVersion, distroArch string) { - if vm.Config == nil { - return - } - - if vm.Config.VAppConfig == nil { - return - } - vmConfigInfo := vm.Config.VAppConfig.GetVmConfigInfo() - if vmConfigInfo == nil { - return - } - - for i := range vmConfigInfo.Property { - p := &vmConfigInfo.Property[i] - if p.Category == VMPropertyCategoryCAPI && p.Id == OVAVersionPropertyID { - ovaVersion = p.DefaultValue - } - if p.Category == VMPropertyCategoryCAPI && p.Id == DistroNamePropertyID { - distroName = p.DefaultValue - } - if p.Category == VMPropertyCategoryCAPI && p.Id == DistroVersionPropertyID { - distroVersion = p.DefaultValue - } - if p.Category == VMPropertyCategoryCAPI && p.Id == DistroArchPropertyID { - distroArch = p.DefaultValue - } - } - return -} - -// GetVSphereVersion returns the vSphere version, and the build number -func (c *DefaultClient) GetVSphereVersion() (string, string, error) { - if c.vmomiClient == nil { - return "", "", fmt.Errorf("uninitialized vmomi client") - } - - versions := strings.Split(c.vmomiClient.ServiceContent.About.Version, ".") - - for { - if len(versions) < numOfSemverVersionNumbers { - versions = append(versions, "0") - } else { - break - } - } - - return strings.Join(versions, "."), c.vmomiClient.ServiceContent.About.Build, nil -} - -// DetectPacific detects if vcenter is a Pacific cluster -func (c *DefaultClient) DetectPacific(ctx context.Context) (bool, error) { - if c.vmomiClient == nil { - return false, fmt.Errorf("uninitialized vmomi client") - } - - var resBody bytes.Buffer - request := c.newRequest(http.MethodGet, "/api/vcenter/namespace-management/software/clusters") - err := c.restClient.Do(ctx, request, &resBody) - if err != nil { - return false, err - } - - var res []interface{} - - err = json.Unmarshal(resBody.Bytes(), &res) - if err != nil { - return false, errors.Wrap(err, "cannot detect Tanzu Kubernetes Cluster service for vSphere") - } - return len(res) != 0, nil -} - -func (c *DefaultClient) newRequest(method, path string, body ...interface{}) *http.Request { - rdr := io.MultiReader() - if len(body) != 0 { - rdr = encode(body[0]) - } - - vcURL := c.vmomiClient.URL() - vcURL.Path = path - - req, err := http.NewRequestWithContext(context.TODO(), method, vcURL.String(), rdr) - if err != nil { - panic(err) - } - return req -} - -type errorReader struct { - e error -} - -func (e errorReader) Read([]byte) (int, error) { - return -1, e.e -} - -func encode(body interface{}) io.Reader { - var b bytes.Buffer - err := json.NewEncoder(&b).Encode(body) - if err != nil { - return errorReader{err} - } - return &b -} - -// GetFolders gets all folders under a datacenter -func (c *DefaultClient) GetFolders(ctx context.Context, datacenterMOID string) ([]*models.VSphereFolder, error) { - res := []*models.VSphereFolder{} - folders := []mo.Folder{} - if c.vmomiClient == nil { - return res, fmt.Errorf("uninitialized vmomi client") - } - - viewTypes := []string{TypeFolder} - - moref := TypeDatacenter + ":" + datacenterMOID - - v, err := c.createContainerView(context.Background(), moref, viewTypes) - if err != nil { - return res, errors.Wrap(err, "error creating vm folder view") - } - - err = v.Retrieve(context.Background(), viewTypes, []string{"name", "childType"}, &folders) - if err != nil { - return res, errors.Wrap(err, "unable to get folders") - } - - for i := range folders { - if !isVMFolder(&folders[i]) { - continue - } - - path, _, err := c.GetPath(ctx, folders[i].Reference().Value) - if err != nil { - continue - } - obj := &models.VSphereFolder{Name: path, Moid: folders[i].Reference().Value} - res = append(res, obj) - } - return res, nil -} - -// GetComputeResources gets resource pools and their ancestors -func (c *DefaultClient) GetComputeResources(ctx context.Context, datacenterMOID string) ([]*models.VSphereManagementObject, error) { - if c.vmomiClient == nil { - return nil, fmt.Errorf("uninitialized vmomi client") - } - - results := []*models.VSphereManagementObject{} - objectMap := make(map[string]*models.VSphereManagementObject) - - var rps []mo.ResourcePool - - viewTypes := []string{TypeResourcePool} - - dcRef := TypeDatacenter + ":" + datacenterMOID - - view, err := c.createContainerView(context.Background(), dcRef, viewTypes) - if err != nil { - return results, errors.Wrap(err, "error creating container view") - } - - err = view.Retrieve(ctx, viewTypes, []string{}, &rps) - if err != nil { - return results, errors.Wrap(err, "failed to get resource pools") - } - - for i := range rps { - path, objects, err := c.GetPath(ctx, rps[i].Self.Value) - if err != nil { - continue - } - - for _, obj := range objects { - if _, ok := objectMap[obj.Moid]; !ok || obj.Moid == rps[i].Self.Value { - objectMap[obj.Moid] = obj - } - } - objectMap[rps[i].Self.Value].Path = path - } - - rootRPToParentMoIDMap := make(map[string]string) - - for key, obj := range objectMap { - if isClusterComputeResource(obj.ParentMoid) || isHostComputeResource(obj.ParentMoid) { - rootRPToParentMoIDMap[key] = obj.ParentMoid - // assign path to cluster/host computer resource - paths := strings.Split(obj.Path, "/") - objectMap[obj.ParentMoid].Path = strings.Join(paths[:len(paths)-1], "/") - delete(objectMap, key) - } - } - - for _, obj := range objectMap { - if _, ok := rootRPToParentMoIDMap[obj.ParentMoid]; ok { - // re-assign the parent of sub resource pools that are immediate children of the root respool to the owning resource - obj.ParentMoid = rootRPToParentMoIDMap[obj.ParentMoid] - } - - results = append(results, obj) - } - - return results, nil -} - -func isVMFolder(folder *mo.Folder) bool { - for _, ct := range folder.ChildType { - if ct == TypeVirtualMachine { - return true - } - } - return false -} - -func isFolder(moID string) bool { - return strings.HasPrefix(moID, "group-") || strings.HasPrefix(moID, "folder-") -} - -func isResourcePool(moID string) bool { - return strings.HasPrefix(moID, "resgroup-") -} - -func isClusterComputeResource(moID string) bool { - return strings.HasPrefix(moID, "domain-c") || strings.HasPrefix(moID, "clustercomputeresource-") -} - -func isHostComputeResource(moID string) bool { - return strings.HasPrefix(moID, "domain-s") -} - -func isDatacenter(moID string) bool { - return strings.HasPrefix(moID, "datacenter-") -} - -func isDatastore(moID string) bool { - return strings.HasPrefix(moID, "datastore-") -} - -func isVirtualMachine(moID string) bool { - return strings.HasPrefix(moID, "vm-") -} - -func isNetwork(moID string) bool { - return strings.HasPrefix(moID, "network-") -} - -func isDvPortGroup(moID string) bool { - return strings.HasPrefix(moID, "dvportgroup-") -} - -func isDvs(moID string) bool { - return strings.HasPrefix(moID, "dvs-") -} - -// FindResourcePool find the vsphere resource pool from path, return moid -func (c *DefaultClient) FindResourcePool(ctx context.Context, path, dcPath string) (string, error) { - finder, err := c.newFinder(ctx, dcPath) - if err != nil { - return "", err - } - obj, err := finder.ResourcePool(ctx, path) - if err != nil { - return "", err - } - - return obj.Reference().Value, nil -} - -// FindFolder find the vsphere folder from path, return moid -func (c *DefaultClient) FindFolder(ctx context.Context, path, dcPath string) (string, error) { - finder, err := c.newFinder(ctx, dcPath) - if err != nil { - return "", err - } - - obj, err := finder.Folder(ctx, path) - if err != nil { - return "", err - } - - return obj.Reference().Value, nil -} - -// FindVirtualMachine find the vsphere virtual machine from path, return moid -func (c *DefaultClient) FindVirtualMachine(ctx context.Context, path, dcPath string) (string, error) { - finder, err := c.newFinder(ctx, dcPath) - if err != nil { - return "", err - } - obj, err := finder.VirtualMachine(ctx, path) - if err != nil { - return "", err - } - - return obj.Reference().Value, nil -} - -// FindDataCenter find the vsphere datacenter from path, return moid -func (c *DefaultClient) FindDataCenter(ctx context.Context, path string) (string, error) { - if c.vmomiClient == nil { - return "", fmt.Errorf("uninitialized vmomi client") - } - finder := find.NewFinder(c.vmomiClient.Client) - obj, err := finder.Datacenter(ctx, path) - if err != nil { - return "", err - } - - return obj.Reference().Value, nil -} - -// FindNetwork finds the vSphere network from path, return moid -func (c *DefaultClient) FindNetwork(ctx context.Context, path, dcPath string) (string, error) { - finder, err := c.newFinder(ctx, dcPath) - if err != nil { - return "", err - } - obj, err := finder.Network(ctx, path) - if err != nil { - return "", err - } - - return obj.Reference().Value, nil -} - -// FindDatastore find the vsphere datastore from path, return moid -func (c *DefaultClient) FindDatastore(ctx context.Context, path, dcPath string) (string, error) { - finder, err := c.newFinder(ctx, dcPath) - if err != nil { - return "", err - } - obj, err := finder.Datastore(ctx, path) - if err != nil { - return "", err - } - - return obj.Reference().Value, nil -} - -func (c *DefaultClient) newFinder(ctx context.Context, dcPath string) (*find.Finder, error) { - if c.vmomiClient == nil { - return nil, fmt.Errorf("uninitialized vmomi client") - } - finder := find.NewFinder(c.vmomiClient.Client) - - if dcPath != "" { - dc, err := finder.Datacenter(ctx, dcPath) - if err != nil { - return nil, err - } - _ = finder.SetDatacenter(dc) - } - - return finder, nil -} diff --git a/tkg/vc/client_integration_test.go b/tkg/vc/client_integration_test.go deleted file mode 100644 index 3cc672b8b2..0000000000 --- a/tkg/vc/client_integration_test.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package vc_test - -import ( - "context" - "net/url" - "os" - "strings" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -var _ = Describe("VC Client Integration Test", func() { - var ( - vcHost = os.Getenv(constants.ConfigVariableVsphereServer) - vcPassword = os.Getenv(constants.ConfigVariableVspherePassword) - vcUsername = os.Getenv(constants.ConfigVariableVsphereUsername) - ) - - BeforeEach(func() { - if os.Getenv("RUN_VC_INTEG_TEST") != "1" { - Skip("Skip integration tests for vc client ") - } - }) - - Describe("New vc Client", func() { - var ( - err error - thumbprint string - vcClient vc.Client - insecure bool - ) - - JustBeforeEach(func() { - host := strings.TrimSpace(vcHost) - if !strings.HasPrefix(host, "http") { - host = "https://" + host - } - vcURL, perr := url.Parse(host) - Expect(perr).ToNot(HaveOccurred()) - vcURL.Path = "/sdk" - vcClient, err = vc.NewClient(vcURL, thumbprint, insecure) - }) - - Context("When the user sets VSPHERE_INSECURE environment variable", func() { - BeforeEach(func() { - insecure = true - }) - It("should create the vc client and login to the vSphere successfully", func() { - Expect(err).ToNot(HaveOccurred()) - _, err = vcClient.Login(context.TODO(), vcUsername, vcPassword) - Expect(err).ToNot(HaveOccurred()) - }) - }) - - Context("When the vc connection is the secured by wrong thumbprint", func() { - BeforeEach(func() { - insecure = false - thumbprint = "wrong-thumbprint" - }) - It("should fail to login to the vSphere", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When the vc connection is the secured by correct thumbprint", func() { - BeforeEach(func() { - insecure = false - thumbprint, err = vc.GetVCThumbprint(vcHost) - Expect(err).ToNot(HaveOccurred()) - }) - It("should create the vc client and login to the vSphere successfully", func() { - Expect(err).ToNot(HaveOccurred()) - _, err = vcClient.Login(context.TODO(), vcUsername, vcPassword) - Expect(err).ToNot(HaveOccurred()) - }) - }) - }) -}) diff --git a/tkg/vc/client_test.go b/tkg/vc/client_test.go deleted file mode 100644 index 35eabcddb6..0000000000 --- a/tkg/vc/client_test.go +++ /dev/null @@ -1,776 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package vc_test - -import ( - "context" - "net/url" - "testing" - "time" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/vmware/govmomi" - - "github.com/vmware/govmomi/find" - "github.com/vmware/govmomi/simulator" - "github.com/vmware/govmomi/vim25/types" - - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - tkgtypes "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -func TestKind(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "VC client Suite") -} - -var _ = Describe("VC Client", func() { - var ( - err error - server *simulator.Server - client vc.Client - ) - const ( - dcPath0 = "/DC0" - datacenter2ID = "datacenter-2" - ) - BeforeEach(func() { - model := simulator.VPX() - model.Datastore = 5 - model.Datacenter = 3 - model.Cluster = 3 - model.Machine = 1 - model.Portgroup = 2 - model.Pool = 2 - model.Folder = 2 - - err = model.Create() - Expect(err).ToNot(HaveOccurred()) - err = nil - server = model.Service.NewServer() - client, err = vc.NewClient(server.URL, "", false) - }) - - Describe("GetDatacenters", func() { - var ( - datacenters []*models.VSphereDatacenter - desiredResult = []*models.VSphereDatacenter{ - { - Moid: datacenter2ID, - Name: dcPath0, - }, - { - Moid: "datacenter-115", - Name: "/F0/DC1", - }, - { - Moid: "datacenter-232", - Name: "/F1/DC2", - }, - } - ) - - JustBeforeEach(func() { - datacenters, err = client.GetDatacenters(context.Background()) - }) - Context("when retrieving datacenters", func() { - It("returns all datacenters", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(datacenters).To(ConsistOf(desiredResult)) - }) - }) - }) - - Describe("FindDatacenter", func() { - var datacenterMOID string - - Context("when datacenter path has exactly one match", func() { - It("should return the datacenter moid", func() { - datacenterMOID, err = client.FindDataCenter(context.Background(), dcPath0) - Expect(err).ToNot(HaveOccurred()) - Expect(datacenterMOID).To(Equal(datacenter2ID)) - }) - }) - Context("when datacenter path has more than one match", func() { - It("should return an error", func() { - datacenterMOID, err = client.FindDataCenter(context.Background(), "DC*") - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("path 'DC*' resolves to multiple datacenters")) - }) - }) - }) - - Describe("FindResourcePool", func() { - var ( - rpMOID string - rpPath string - dcPath string - ) - - const ( - dc0RsourcesPath = "DC0_C0/Resources" - ) - JustBeforeEach(func() { - rpMOID, err = client.FindResourcePool(context.Background(), rpPath, dcPath) - }) - Context("when resource pool path has exactly one match", func() { - BeforeEach(func() { - rpPath = "/DC0/host/DC0_C0/Resources/ChildPool" - err = createResourcePool(server.URL) - Expect(err).ToNot(HaveOccurred()) - }) - It("should return the moid of the resource pool", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(rpMOID).To(Equal("resgroup-441")) - }) - }) - - Context("when resource pool path has multiple matches", func() { - BeforeEach(func() { - rpPath = "*/Resources" - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("when resource pool path has no match", func() { - BeforeEach(func() { - rpPath = "/DC0/host/DC0_C0/Resources/fake-pool" - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When datacenter path is not specified and resource pool path is not the absolute path", func() { - BeforeEach(func() { - rpPath = dc0RsourcesPath - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("When datacenter path is specified and resource pool path is not the absolute path", func() { - BeforeEach(func() { - rpPath = dc0RsourcesPath - dcPath = dcPath0 - }) - It(" should return the moid of the resource pool", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(rpMOID).To(Equal("resgroup-28")) - }) - }) - }) - - Describe("FindFolder", func() { - var ( - folderMOID string - dcPath string - folderPath string - ) - - const ( - vmFolderPath = "vm" - ) - JustBeforeEach(func() { - folderMOID, err = client.FindFolder(context.Background(), folderPath, dcPath) - }) - Context("whend datacenter path is not specified, and folder path is the absolute path", func() { - BeforeEach(func() { - folderPath = "/DC0/vm" - dcPath = "" - }) - It("should return the folder moid", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(folderMOID).To(Equal("group-3")) - }) - }) - - Context("when datacenter path is not specified, and folder path is not the absolute path", func() { - BeforeEach(func() { - folderPath = vmFolderPath - dcPath = "" - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("when datacenter path is specified, and folder path is not the absolute path", func() { - BeforeEach(func() { - folderPath = vmFolderPath - dcPath = dcPath0 - }) - It("should return the vm moid", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(folderMOID).To(Equal("group-3")) - }) - }) - - Context("when folder path has multiple matches", func() { - BeforeEach(func() { - folderPath = "vm*" - dcPath = "" - }) - - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("path 'vm*' resolves to multiple folders")) - }) - }) - }) - - Describe("FindVirtualMachine", func() { - var ( - vmMOID string - dcPath string - vmPath string - ) - - const ( - vmPathID = "DC0_C1_RP1_VM0" - ) - JustBeforeEach(func() { - vmMOID, err = client.FindVirtualMachine(context.Background(), vmPath, dcPath) - }) - Context("when datacenter path is not specified, and vm path is the absolute path", func() { - BeforeEach(func() { - vmPath = "/DC0/vm/DC0_C1_RP1_VM0" - dcPath = "" - }) - It("should return the vm moid", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(vmMOID).To(Equal("vm-388")) - }) - }) - - Context("when datacenter path is not specified, and vm path is not the absolute path", func() { - BeforeEach(func() { - vmPath = vmPathID - dcPath = "" - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - }) - }) - - Context("when datacenter path is specified, and vm path is not the absolute path", func() { - BeforeEach(func() { - vmPath = vmPathID - dcPath = dcPath0 - }) - It("should return the vm moid", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(vmMOID).To(Equal("vm-388")) - }) - }) - }) - - Describe("GetResourcePool", func() { - var ( - resourcePools []*models.VSphereResourcePool - datacenterMoID string - desiredResult = []*models.VSphereResourcePool{ - { - Moid: "resgroup-28", - Name: "/DC0/host/DC0_C0/Resources", - }, - { - Moid: "resgroup-54", - Name: "/DC0/host/DC0_C0/Resources/DC0_C0_RP1", - }, - { - Moid: "resgroup-55", - Name: "/DC0/host/DC0_C0/Resources/DC0_C0_RP2", - }, - { - Moid: "resgroup-441", - Name: "/DC0/host/DC0_C0/Resources/ChildPool", - }, - { - Moid: "resgroup-57", - Name: "/DC0/host/DC0_C1/Resources", - }, - { - Moid: "resgroup-83", - Name: "/DC0/host/DC0_C1/Resources/DC0_C1_RP1", - }, - { - Moid: "resgroup-84", - Name: "/DC0/host/DC0_C1/Resources/DC0_C1_RP2", - }, - { - Moid: "resgroup-86", - Name: "/DC0/host/DC0_C2/Resources", - }, - { - Moid: "resgroup-112", - Name: "/DC0/host/DC0_C2/Resources/DC0_C2_RP1", - }, - { - Moid: "resgroup-113", - Name: "/DC0/host/DC0_C2/Resources/DC0_C2_RP2", - }, - } - ) - JustBeforeEach(func() { - resourcePools, err = client.GetResourcePools(context.Background(), datacenterMoID) - }) - - Context("when retrieving resource pool from datacenter-2", func() { - BeforeEach(func() { - datacenterMoID = datacenter2ID - err = createResourcePool(server.URL) - Expect(err).ToNot(HaveOccurred()) - }) - It("returns all resource pool under the datacenter", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(resourcePools).To(ConsistOf(desiredResult)) - }) - }) - }) - - Describe("GetNetworks", func() { - var ( - networks []*models.VSphereNetwork - datacenterMoID string - desiredResult = []*models.VSphereNetwork{ - { - DisplayName: "/DC0/network/VM Network", - Moid: "Network:network-7", - Name: "/DC0/network/VM Network", - }, - { - DisplayName: "/DC0/network/DVS0-DVUplinks-9", - Moid: "DistributedVirtualPortgroup:dvportgroup-11", - Name: "/DC0/network/DVS0-DVUplinks-9", - }, - { - DisplayName: "/DC0/network/DC0_DVPG0", - Moid: "DistributedVirtualPortgroup:dvportgroup-13", - Name: "/DC0/network/DC0_DVPG0", - }, - { - DisplayName: "/DC0/network/DC0_DVPG1", - Moid: "DistributedVirtualPortgroup:dvportgroup-15", - Name: "/DC0/network/DC0_DVPG1", - }, - } - ) - JustBeforeEach(func() { - networks, err = client.GetNetworks(context.Background(), datacenterMoID) - }) - Context("When retrieveing network from datacenter-2", func() { - BeforeEach(func() { - datacenterMoID = datacenter2ID - }) - It("returns all network under the datacenter", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(networks).To(ConsistOf(desiredResult)) - }) - }) - }) - - Describe("FindNetwork", func() { - var ( - dcPath string - networkPath string - networkMoid string - ) - - JustBeforeEach(func() { - networkMoid, err = client.FindNetwork(context.Background(), networkPath, dcPath) - }) - - Context("when a valid network path is passed", func() { - BeforeEach(func() { - networkPath = "DC0_DVPG0" - dcPath = dcPath0 - }) - It("should return the network moid", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(networkMoid).To(Equal("dvportgroup-13")) - }) - }) - - Context("when network path has multiple matches", func() { - BeforeEach(func() { - networkPath = "DC0_DVPG*" - dcPath = dcPath0 - }) - - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("path 'DC0_DVPG*' resolves to multiple networks")) - }) - }) - }) - - Describe("GetFolder", func() { - var ( - folders []*models.VSphereFolder - datacenterMoID string - desiredResult = []*models.VSphereFolder{ - {Moid: "group-3", Name: "/DC0/vm"}, - } - ) - JustBeforeEach(func() { - folders, err = client.GetFolders(context.Background(), datacenterMoID) - }) - Context("When retrieveing vm folders from datacenter-2", func() { - BeforeEach(func() { - datacenterMoID = datacenter2ID - }) - It("returns all vm folders under the datacenter", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(folders).To(ConsistOf(desiredResult)) - }) - }) - }) - - Describe("GetVirualMachines", func() { - var ( - vms []*models.VSphereVirtualMachine - datacenterMoID string - desiredResult = []*models.VSphereVirtualMachine{ - { - IsTemplate: nil, - K8sVersion: "", - Moid: "vm-379", - Name: "/DC0/vm/DC0_H0_VM0", - OsInfo: nil, - }, - { - IsTemplate: nil, - K8sVersion: "", - Moid: "vm-382", - Name: "/DC0/vm/DC0_C0_RP1_VM0", - OsInfo: nil, - }, - { - IsTemplate: nil, - K8sVersion: "", - Moid: "vm-385", - Name: "/DC0/vm/DC0_C0_RP2_VM0", - OsInfo: nil, - }, - { - IsTemplate: nil, - K8sVersion: "", - Moid: "vm-388", - Name: "/DC0/vm/DC0_C1_RP1_VM0", - OsInfo: nil, - }, - { - IsTemplate: nil, - K8sVersion: "", - Moid: "vm-391", - Name: "/DC0/vm/DC0_C1_RP2_VM0", - OsInfo: nil, - }, - { - IsTemplate: nil, - K8sVersion: "", - Moid: "vm-394", - Name: "/DC0/vm/DC0_C2_RP1_VM0", - OsInfo: nil, - }, - { - IsTemplate: nil, - K8sVersion: "", - Moid: "vm-397", - Name: "/DC0/vm/DC0_C2_RP2_VM0", - OsInfo: nil, - }, - } - ) - JustBeforeEach(func() { - vms, err = client.GetVirtualMachines(context.Background(), datacenterMoID) - }) - Context("When retrieving vm from datacenter-2", func() { - BeforeEach(func() { - datacenterMoID = datacenter2ID - }) - It("returns all vm under the datacenter", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(vms).To(ConsistOf(desiredResult)) - }) - }) - }) - - Describe("GetComputeResource", func() { - var ( - resourcePools []*models.VSphereManagementObject - datacenterMoID string - desiredResult = []*models.VSphereManagementObject{ - { - Moid: "domain-c29", - Name: "DC0_C0", - ParentMoid: "", - Path: "/DC0/host/DC0_C0", - ResourceType: "cluster", - }, - { - Moid: "resgroup-54", - Name: "DC0_C0_RP1", - ParentMoid: "domain-c29", - Path: "/DC0/host/DC0_C0/Resources/DC0_C0_RP1", - ResourceType: "respool", - }, - { - Moid: "resgroup-55", - Name: "DC0_C0_RP2", - ParentMoid: "domain-c29", - Path: "/DC0/host/DC0_C0/Resources/DC0_C0_RP2", - ResourceType: "respool", - }, - { - Moid: "domain-c58", - Name: "DC0_C1", - ParentMoid: "", - Path: "/DC0/host/DC0_C1", - ResourceType: "cluster", - }, - { - Moid: "resgroup-83", - Name: "DC0_C1_RP1", - ParentMoid: "domain-c58", - Path: "/DC0/host/DC0_C1/Resources/DC0_C1_RP1", - ResourceType: "respool", - }, - { - Moid: "resgroup-84", - Name: "DC0_C1_RP2", - ParentMoid: "domain-c58", - Path: "/DC0/host/DC0_C1/Resources/DC0_C1_RP2", - ResourceType: "respool", - }, - { - Moid: "domain-c87", - Name: "DC0_C2", - ParentMoid: "", - Path: "/DC0/host/DC0_C2", - ResourceType: "cluster", - }, - { - Moid: "resgroup-112", - Name: "DC0_C2_RP1", - ParentMoid: "domain-c87", - Path: "/DC0/host/DC0_C2/Resources/DC0_C2_RP1", - ResourceType: "respool", - }, - { - Moid: "resgroup-113", - Name: "DC0_C2_RP2", - ParentMoid: "domain-c87", - Path: "/DC0/host/DC0_C2/Resources/DC0_C2_RP2", - ResourceType: "respool", - }, - { - Moid: "resgroup-441", - Name: "ChildPool", - ParentMoid: "domain-c29", - Path: "/DC0/host/DC0_C0/Resources/ChildPool", - ResourceType: "respool", - }, - } - ) - JustBeforeEach(func() { - resourcePools, err = client.GetComputeResources(context.Background(), datacenterMoID) - }) - - Context("when retrieving resource pools with their ancestors from datacenter-2", func() { - BeforeEach(func() { - datacenterMoID = datacenter2ID - err = createResourcePool(server.URL) - Expect(err).ToNot(HaveOccurred()) - }) - It("returns all resource pool with their ancestors under the datacenter", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(resourcePools).To(ConsistOf(desiredResult)) - }) - }) - }) - - Describe("GetDatastores", func() { - var ( - datastores []*models.VSphereDatastore - datacenterMoID string - desiredResult = []string{ - "/DC0/datastore/LocalDS_0", - "/DC0/datastore/LocalDS_1", - "/DC0/datastore/LocalDS_2", - "/DC0/datastore/LocalDS_3", - "/DC0/datastore/LocalDS_4", - } - ) - JustBeforeEach(func() { - datastores, err = client.GetDatastores(context.Background(), datacenterMoID) - }) - Context("When retrieving datastore from datacenter-2", func() { - BeforeEach(func() { - datacenterMoID = datacenter2ID - }) - It("returns all datastore under the datacenter", func() { - Expect(err).ToNot(HaveOccurred()) - - names := []string{} - - for _, ds := range datastores { - names = append(names, ds.Name) - } - Expect(names).To(ConsistOf(desiredResult)) - }) - }) - }) - - Describe("FindDatastore", func() { - var ( - dcPath string - datastorePath string - ) - - JustBeforeEach(func() { - _, err = client.FindDatastore(context.Background(), datastorePath, dcPath) - }) - - Context("when datastore path has multiple matches", func() { - BeforeEach(func() { - datastorePath = "LocalDS*" - dcPath = "DC0" - }) - - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("path 'LocalDS*' resolves to multiple datastores")) - }) - }) - }) - - _ = Describe("ValidateVSphereTemplateK8sVersion", func() { - var ( - err error - vcClient = &fakes.VCClient{} - machines []*tkgtypes.VSphereVirtualMachine - machine1 = &tkgtypes.VSphereVirtualMachine{Name: "photon-3-v1.15.0+vmware.1", Moid: "vm-1", OVAVersion: "v1.15.0+vmware.1-ova-latest", IsTemplate: true} - machine2 = &tkgtypes.VSphereVirtualMachine{Name: "photon-3-v1.16.0+vmware.1", Moid: "vm-2", OVAVersion: "v1.16.0+vmware.1-ova-latest", IsTemplate: true} - machine3 = &tkgtypes.VSphereVirtualMachine{Name: "photon-3-v1.16.0+vmware.1", Moid: "vm-2", OVAVersion: "v1.16.0+vmware.1-ova-latest", IsTemplate: false} - vmTemplate string - vm *tkgtypes.VSphereVirtualMachine - ovaVersions []string - ) - const ( - vmTemplatePhoton = "photon-3-v1.16.0+vmware.1" - ) - BeforeEach(func() { - machines = []*tkgtypes.VSphereVirtualMachine{} - }) - JustBeforeEach(func() { - vm, err = vc.ValidateAndGetVirtualMachineTemplateForTKRVersion(vcClient, "", ovaVersions, vmTemplate, "dc0", machines) - }) - - Context("When k8s version does not match", func() { - BeforeEach(func() { - vmTemplate = vmTemplatePhoton - ovaVersions = []string{"v1.15.0+vmware.1-ova-latest"} - machines = append(machines, machine1, machine2, machine3) - vcClient.FindVirtualMachineReturns("vm-2", nil) - }) - It("should return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(" specified for the TanzuKubernetesRelease")) - }) - }) - - Context("When k8s version does match", func() { - BeforeEach(func() { - vmTemplate = vmTemplatePhoton - ovaVersions = []string{"v1.16.0+vmware.1-ova-latest"} - machines = append(machines, machine1, machine2, machine3) - vcClient.FindVirtualMachineReturns("vm-2", nil) - }) - It("should not return an error", func() { - Expect(err).NotTo(HaveOccurred()) - Expect(vm.Name).To(Equal(vmTemplatePhoton)) - }) - }) - - Context("When provided template does not exist", func() { - BeforeEach(func() { - vmTemplate = "fake-template" - ovaVersions = []string{"v1.16.0+vmware.1-ova-latest"} - machines = append(machines, machine1, machine2, machine3) - vcClient.FindVirtualMachineReturns("vm-3", nil) - }) - It("should not return an error", func() { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("VM Template fake-template is not associated with TanzuKubernetesRelease")) - }) - }) - }) - - Describe("getDuplicateNetworks", func() { - It("return networks with duplicate names", func() { - networkNames := []string{"/dc0/network/network11", "/dc0/network/network10", "/dc0/network/network12", "/dc0/network/network10", "/dc0/network/network11"} - networks := getNetworksFromNameList(networkNames) - duplNetworks := vc.GetDuplicateNetworks(networks) - Expect(duplNetworks).To(HaveKey("/dc0/network/network10")) - Expect(duplNetworks).To(HaveKey("/dc0/network/network11")) - }) - }) -}) - -func getNetworksFromNameList(networkNames []string) []*models.VSphereNetwork { - networks := []*models.VSphereNetwork{} - for _, networkName := range networkNames { - networks = append(networks, &models.VSphereNetwork{ - Name: networkName, - }) - } - - return networks -} - -func createResourcePool(u *url.URL) error { - c, err := govmomi.NewClient(context.Background(), u, true) - if err != nil { - return err - } - finder := find.NewFinder(c.Client, true) - parent, err := finder.ResourcePool(context.Background(), "/DC0/host/DC0_C0/Resources") - if err != nil { - return err - } - rpSpec := types.ResourceConfigSpec{ - LastModified: &time.Time{}, - CpuAllocation: types.ResourceAllocationInfo{ - Reservation: types.NewInt64(0), - ExpandableReservation: types.NewBool(true), - Limit: types.NewInt64(-1), - Shares: &types.SharesInfo{ - Level: "normal", - }, - }, - MemoryAllocation: types.ResourceAllocationInfo{ - Reservation: types.NewInt64(0), - ExpandableReservation: types.NewBool(true), - Limit: types.NewInt64(-1), - Shares: &types.SharesInfo{ - Level: "normal", - }, - }, - } - - _, err = parent.Create(context.Background(), "ChildPool", rpSpec) - if err != nil { - return err - } - - return nil -} diff --git a/tkg/vc/helpers.go b/tkg/vc/helpers.go deleted file mode 100644 index b1a8359280..0000000000 --- a/tkg/vc/helpers.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package vc ... -package vc - -import ( - "context" - "crypto/tls" - "fmt" - "net" - "strings" - "time" - - "github.com/pkg/errors" - "github.com/vmware/govmomi/view" - "github.com/vmware/govmomi/vim25/soap" - "github.com/vmware/govmomi/vim25/types" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfighelper" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - tkgtypes "github.com/vmware-tanzu/tanzu-framework/tkg/types" -) - -const ( - dialTCPTimeout = 5 * time.Second -) - -func (c *DefaultClient) createContainerView(ctx context.Context, parentID string, viewTypes []string) (*view.ContainerView, error) { - m := view.NewManager(c.vmomiClient.Client) - - container := &c.vmomiClient.Client.ServiceContent.RootFolder - - if parentID != "" { - container = &types.ManagedObjectReference{} - if !container.FromString(parentID) { - return nil, fmt.Errorf("incorrect managed object reference format for %s", parentID) - } - } - - return m.CreateContainerView(ctx, *container, viewTypes, true) -} - -// GetAndValidateVirtualMachineTemplate gets the vm template for specified k8s version if not provided -// if provided, it validates the k8s version -func (c *DefaultClient) GetAndValidateVirtualMachineTemplate( - ovaVersions []string, - tkrVersion string, - templateName, - dc string, - tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) (*tkgtypes.VSphereVirtualMachine, error) { - - dcMOID, err := c.FindDataCenter(context.TODO(), dc) - if err != nil { - return nil, errors.Wrap(err, "failed to get the datacenter MOID") - } - - vms, err := c.GetVirtualMachineImages(context.TODO(), dcMOID) - if err != nil { - return nil, errors.Wrap(err, "failed to get K8s VM templates") - } - - // if VSphereVMTemplateName is provided by user then verify the template with K8s version - if templateName != "" { - return ValidateAndGetVirtualMachineTemplateForTKRVersion(c, tkrVersion, ovaVersions, templateName, dc, vms) - } - - // If templateName is not specified by user then - // Find the matching template by scanning vsphere inventory - - matchedTemplateVMs, nonTemplateVMs := FindMatchingVirtualMachineTemplate(vms, ovaVersions) - - // filter vm templates based on user provided or default os options - vm := tkgconfighelper.SelectTemplateForVsphereProviderBasedonOSOptions(matchedTemplateVMs, tkgConfigReaderWriter) - if vm != nil { - return vm, nil - } - - if len(nonTemplateVMs) != 0 { - return nil, errors.Errorf("unable to find VM Template associated with TanzuKubernetesRelease %s, but found these VM(s) [%s] that can be used once converted to a VM Template", tkrVersion, strings.Join(nonTemplateVMs, ",")) - } - - return nil, errors.Errorf("unable to find VM Template associated with TanzuKubernetesRelease %s. Please upload at least one VM Template from versions [%v] to continue", tkrVersion, strings.Join(ovaVersions, ",")) -} - -// FindMatchingVirtualMachineTemplate finds a virtual machine template that matches the ova versions -func FindMatchingVirtualMachineTemplate( - vms []*tkgtypes.VSphereVirtualMachine, - ovaVersions []string, -) (matchedTemplateVMs []*tkgtypes.VSphereVirtualMachine, nonTemplateVMs []string) { - - for _, vm := range vms { - for _, ovaVersion := range ovaVersions { - if vm.OVAVersion == ovaVersion { - if vm.IsTemplate { - matchedTemplateVMs = append(matchedTemplateVMs, vm) - } else { - nonTemplateVMs = append(nonTemplateVMs, vm.Name) - } - break - } - } - } - - return matchedTemplateVMs, nonTemplateVMs -} - -// ValidateAndGetVirtualMachineTemplateForTKRVersion gets a virtual machine for the given TKR version and validates it -func ValidateAndGetVirtualMachineTemplateForTKRVersion(vcClient Client, tkrVersion string, ovaVersions []string, templateName, dc string, k8sVMTemplates []*tkgtypes.VSphereVirtualMachine) (*tkgtypes.VSphereVirtualMachine, error) { - templateMOID, err := vcClient.FindVirtualMachine(context.Background(), templateName, dc) - if err != nil { - return nil, errors.Wrapf(err, "invalid %s (%v)", constants.ConfigVariableVsphereTemplate, templateName) - } - - // check if VM template name and K8s version match - for _, vm := range k8sVMTemplates { - if vm.Moid == templateMOID { - if !vm.IsTemplate { - return nil, errors.Errorf("virtual machine %s is not a template, please convert it to a template and retry", templateName) - } - for _, ovaVersion := range ovaVersions { - if vm.OVAVersion == ovaVersion { - return vm, nil - } - } - - return nil, errors.Errorf("incorrect %s (%s) specified for the TanzuKubernetesRelease (%s). TKG CLI will autodetect the correct VM template to use, so %s should be removed unless required to disambiguate among multiple matching templates", - constants.ConfigVariableVsphereTemplate, templateName, tkrVersion, constants.ConfigVariableVsphereTemplate) - } - } - return nil, errors.Errorf("VM Template %s is not associated with TanzuKubernetesRelease %s. Please upload VM Template for this TanzuKubernetesRelease to continue", templateName, tkrVersion) -} - -// GetVCThumbprint gets the vc thumbprint -func GetVCThumbprint(host string) (string, error) { - insecure := true - - host, port := splitHostPort(host) - - conn, err := tls.DialWithDialer( - &net.Dialer{ - Timeout: dialTCPTimeout, - }, - "tcp", - fmt.Sprintf("%s:%s", host, port), - &tls.Config{InsecureSkipVerify: insecure}, - ) // #nosec - if err != nil { - return "", errors.Wrap(err, "failed to retrieve the vSphere thumbprint") - } - defer conn.Close() - cert := conn.ConnectionState().PeerCertificates[0] - - return soap.ThumbprintSHA1(cert), nil -} - -func splitHostPort(host string) (string, string) { - ix := strings.LastIndex(host, ":") - - if ix < 0 { - return host, VCDefaultPort - } - - name := host[:ix] - port := host[ix+1:] - - return name, port -} diff --git a/tkg/vc/interface.go b/tkg/vc/interface.go deleted file mode 100644 index 59e911f0bb..0000000000 --- a/tkg/vc/interface.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package vc ... -package vc - -import ( - "context" - "net/url" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - tkgtypes "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// vCenter Managed Object Type Names -const ( - TypeCluster = "ClusterComputeResource" - TypeComputeResource = "ComputeResource" - TypeHostGroup = "HostGroup" - TypeResourcePool = "ResourcePool" - TypeDatacenter = "Datacenter" - TypeFolder = "Folder" - TypeDatastore = "Datastore" - TypeHost = "HostSystem" - TypeNetwork = "Network" - TypeDvpg = "DistributedVirtualPortgroup" - TypeDvs = "VmwareDistributedVirtualSwitch" - TypeOpaqueNetwork = "OpaqueNetwork" - TypeVirtualMachine = "VirtualMachine" -) - -//go:generate counterfeiter -o ../fakes/vcclientfactory.go --fake-name VcClientFactory . VcClientFactory - -// VcClientFactory a factory for creating VC clients -type VcClientFactory interface { - NewClient(vcURL *url.URL, thumbprint string, insecure bool) (Client, error) -} - -type vcClientFactory struct{} - -// NewClient creates new clusterclient -func (c *vcClientFactory) NewClient(vcURL *url.URL, thumbprint string, insecure bool) (Client, error) { //nolint:gocritic - return NewClient(vcURL, thumbprint, insecure) -} - -// NewVcClientFactory creates new vcclient factory -func NewVcClientFactory() VcClientFactory { - return &vcClientFactory{} -} - -//go:generate counterfeiter -o ../fakes/vcclient.go --fake-name VCClient . Client - -// Client represents a vCenter client -type Client interface { - // Login authenticates with Virtual Center using user/password - Login(ctx context.Context, user, password string) (string, error) - - // AcquireTicket acquires a new session ticket for the user associated with - // the authenticated client. - AcquireTicket() (string, error) - - // CheckUserSessionActive check if a user session is Active - CheckUserSessionActive() (bool, error) - - // GetDatastores returns a list of datastores for the given datacenter - GetDatastores(ctx context.Context, datacenterMOID string) ([]*models.VSphereDatastore, error) - - // GetDatacenters returns a list of all datacenters in the vSphere inventory. - GetDatacenters(ctx context.Context) ([]*models.VSphereDatacenter, error) - - // GetDataCenterMOID returns the MOID of the datacenter - GetDataCenterMOID(ctx context.Context, dcName string) (string, error) - - // GetNetworks returns list of network in the given datacenter - GetNetworks(ctx context.Context, datacenterMOID string) ([]*models.VSphereNetwork, error) - - // GetResourcePools returns list of resource pools in the given datacenter - GetResourcePools(ctx context.Context, datacenterMOID string) ([]*models.VSphereResourcePool, error) - - // GetVSphereVersion returns the vSphere version, and the build number - GetVSphereVersion() (string, string, error) - - // GetVirtualMachine gets vms under given datacenter - GetVirtualMachines(ctx context.Context, datacenterMOID string) ([]*models.VSphereVirtualMachine, error) - - // GetVirtualMachineImages gets vm templates for kubernetes - GetVirtualMachineImages(ctx context.Context, datacenterMOID string) ([]*tkgtypes.VSphereVirtualMachine, error) - - // DetectPacific detects if project pacific is enabled on vSphere - DetectPacific(ctx context.Context) (bool, error) - - // GetFolders gets all folders under a datacenter - GetFolders(ctx context.Context, datacenterMOID string) ([]*models.VSphereFolder, error) - - // GetComputeResources gets resource pools and their ancestors - GetComputeResources(ctx context.Context, datacenterMOID string) ([]*models.VSphereManagementObject, error) - // FindResourcePool find the vSphere resource pool from path, return moid - FindResourcePool(ctx context.Context, path, dcPath string) (string, error) - // FindFolder find the vSphere folder from path, return moid - FindFolder(ctx context.Context, path, dcPath string) (string, error) - // FindVirtualMachine find the vSphere virtual machine from path, return moid - FindVirtualMachine(ctx context.Context, path, dcPath string) (string, error) - // FindDataCenter find the vSphere datacenter from path, return moid - FindDataCenter(ctx context.Context, path string) (string, error) - // FindDatastore find the vSphere datastore from path, return moid - FindDatastore(ctx context.Context, path, dcPath string) (string, error) - // FindNetwork finds the vSphere network from path, return moid - FindNetwork(ctx context.Context, path, dcPath string) (string, error) - // GetAndValidateVirtualMachineTemplateForK8sVersion validates and returns valid virtual machine template - GetAndValidateVirtualMachineTemplate(ovaVersions []string, tkrName string, templateName, dc string, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter) (*tkgtypes.VSphereVirtualMachine, error) - // GetPath returns the full path of a valid vSphere resource - GetPath(ctx context.Context, moid string) (string, []*models.VSphereManagementObject, error) -} diff --git a/tkg/vsphere-template-resolver/Dockerfile b/tkg/vsphere-template-resolver/Dockerfile deleted file mode 100644 index 9a2c4bd51c..0000000000 --- a/tkg/vsphere-template-resolver/Dockerfile +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 -# syntax=docker/dockerfile:1.4 - -# Build from publicly reachable source by default, but allow people to re-build images on -# top of their own trusted images. -ARG BUILDER_BASE_IMAGE=golang:1.18 -ARG DISTROLESS_BASE_IMAGE=gcr.io/distroless/static:nonroot - -# Build the manager binary -FROM $BUILDER_BASE_IMAGE as builder - -WORKDIR /workspace - -# Copy the Go Modules manifests -COPY apis/cli/ apis/cli/ -COPY apis/config/ apis/config/ -COPY capabilities/client/ capabilities/client/ -COPY cli/core/ cli/core/ -COPY cli/runtime/ cli/runtime/ -COPY packageclients/ packageclients/ - -COPY apis/run/ apis/run/ -COPY util/ util/ -COPY tkr/ tkr/ -COPY pinniped-components/common pinniped-components/common - -COPY tkg/go.mod tkg/go.mod -COPY tkg/go.sum tkg/go.sum - -WORKDIR /workspace/tkg -# Setting default GOPROXY to https://proxy.golang.org,direct and GOSUMDB to sum.golang.org which can be override by Makefile -ARG GOSUMDB -ARG GOPROXY -ENV GOSUMDB=$GOSUMDB -ENV GOPROXY=$GOPROXY -# cache deps before building and copying source so that we don't need to re-download as much -# and so that source changes don't invalidate our downloaded layer -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod go mod download - -# Copy the go source -COPY tkg/ ./ - -# Build -ARG LD_FLAGS -ENV LD_FLAGS="$LD_FLAGS "'-extldflags "-static"' -RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/root/.local/share/golang --mount=type=cache,target=/go/pkg/mod CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -a -ldflags "$LD_FLAGS" -o manager vsphere-template-resolver/main.go - -# Use distroless as minimal base image to package the manager binary -# Refer to https://github.com/GoogleContainerTools/distroless for more details -FROM $DISTROLESS_BASE_IMAGE -WORKDIR / -COPY --from=builder /workspace/tkg/manager . -USER nonroot:nonroot - -ENTRYPOINT ["/manager"] diff --git a/tkg/vsphere-template-resolver/Makefile b/tkg/vsphere-template-resolver/Makefile deleted file mode 100644 index f1c744ff2e..0000000000 --- a/tkg/vsphere-template-resolver/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -include ../../common.mk - -IMG_DEFAULT_NAME := tkr-vsphere-cluster-webhook -IMG_DEFAULT_TAG := latest -IMG_DEFAULT_NAME_TAG := $(IMG_DEFAULT_NAME):$(IMG_DEFAULT_TAG) - -IMG_VERSION_OVERRIDE ?= $(IMG_DEFAULT_TAG) - - -ifeq ($(strip $(OCI_REGISTRY)),) - IMG ?= $(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -else - IMG ?= $(OCI_REGISTRY)/$(IMG_DEFAULT_NAME):$(IMG_VERSION_OVERRIDE) -endif - -all: manager - -# Run tests -test: fmt vet - go test ./... -coverprofile cover.out - -# Build manager binary -manager: fmt vet - go build -ldflags "$(LD_FLAGS)" -o bin/manager ./main.go - -# Run go fmt against code -fmt: - go fmt ./... - -# Run go vet against code -vet: - go vet ./... - -.PHONY: docker-build -docker-build: ## Build docker image - cd ../../ && docker build -t $(IMG) -f tkg/vsphere-template-resolver/Dockerfile --build-arg LD_FLAGS="$(LD_FLAGS)" --build-arg DISTROLESS_BASE_IMAGE="$(DISTROLESS_BASE_IMAGE)" --build-arg GOPROXY="$(GOPROXY)" --build-arg GOSUMDB="$(GOSUMDB)" . - -.PHONY: docker-publish -docker-publish: ## Publish docker image - docker push $(IMG) - -.PHONY: kbld-image-replace -kbld-image-replace: ## Add newImage in kbld-config.yaml - cd ../../hack/packages/kbld-image-replace && \ - go run main.go -kbld-config ../../../packages/tkr-vsphere-resolver/kbld-config.yaml $(IMG_DEFAULT_NAME_TAG) $(IMG) - -.PHONY: docker-image-names -docker-image-names: - @echo $(IMG) - -.PHONY: docker-build-and-publish -docker-build-and-publish: docker-build docker-publish kbld-image-replace diff --git a/tkg/vsphere-template-resolver/main.go b/tkg/vsphere-template-resolver/main.go deleted file mode 100644 index 5473a94bc6..0000000000 --- a/tkg/vsphere-template-resolver/main.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "flag" - "os" - - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/client/config" - "sigs.k8s.io/controller-runtime/pkg/log/zap" - "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/manager/signals" - "sigs.k8s.io/controller-runtime/pkg/webhook" - - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/vsphere-template-resolver/template" - "github.com/vmware-tanzu/tanzu-framework/tkg/vsphere-template-resolver/templateresolver" - "github.com/vmware-tanzu/tanzu-framework/util/buildinfo" -) - -var ( - scheme = runtime.NewScheme() - setupLog = ctrl.Log.WithName("setup") -) - -func init() { - utilruntime.Must(runv1.AddToScheme(scheme)) - utilruntime.Must(corev1.AddToScheme(scheme)) - utilruntime.Must(clusterv1.AddToScheme(scheme)) - utilruntime.Must(capvv1beta1.AddToScheme(scheme)) -} - -func main() { - var webhookCertDir string - var metricsAddr string - var webhookServerPort int - flag.StringVar(&webhookCertDir, "webhook-cert-dir", "/tmp/k8s-webhook-server/serving-certs/", "Webhook cert directory.") - flag.StringVar(&metricsAddr, "metrics-bind-addr", ":8080", "The address the metric endpoint binds to.") - flag.IntVar(&webhookServerPort, "webhook-server-port", 9443, "The port that the webhook server serves at.") - - opts := zap.Options{ - Development: true, - } - opts.BindFlags(flag.CommandLine) - flag.Parse() - - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) - - setupLog.Info("Version", "version", buildinfo.Version, "buildDate", buildinfo.Date, "sha", buildinfo.SHA) - - // Set up a Manager - setupLog.Info("setting up manager") - mgr, err := manager.New(config.GetConfigOrDie(), manager.Options{ - Scheme: scheme, - MetricsBindAddress: metricsAddr, - CertDir: webhookCertDir, - Port: webhookServerPort, - }) - if err != nil { - setupLog.Error(err, "unable to set up controller manager") - os.Exit(1) - } - - // Setup webhooks - setupLog.Info("setting up webhook server") - hookServer := mgr.GetWebhookServer() - - setupLog.Info("registering webhooks to the webhook server") - resolverLog := mgr.GetLogger().WithName("webhook.vsphere-template-resolver") - hookServer.Register("/resolve-template", &webhook.Admission{ - Handler: &template.Webhook{ - Log: resolverLog, - Client: mgr.GetClient(), - Resolver: templateresolver.New(resolverLog), - }, - }) - - setupLog.Info("registering webhooks to the webhook server") - setupLog.Info("starting manager") - if err := mgr.Start(signals.SetupSignalHandler()); err != nil { - setupLog.Error(err, "unable to run manager") - os.Exit(1) - } -} diff --git a/tkg/vsphere-template-resolver/template/resolver.go b/tkg/vsphere-template-resolver/template/resolver.go deleted file mode 100644 index 03a099a670..0000000000 --- a/tkg/vsphere-template-resolver/template/resolver.go +++ /dev/null @@ -1,384 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package template provides the vSphere template Resolver mutating webhook on CAPI Cluster. -package template - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - - "github.com/go-logr/logr" - corev1 "k8s.io/api/core/v1" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" - "sigs.k8s.io/kind/pkg/errors" - - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/vsphere-template-resolver/templateresolver" - resolver_cluster "github.com/vmware-tanzu/tanzu-framework/tkr/webhook/cluster/tkr-resolver/cluster" - util_topology "github.com/vmware-tanzu/tanzu-framework/util/topology" -) - -const ( - varTKRData = "TKR_DATA" - varVCenter = "vcenter" - osImageRefVersion = "version" - osImageRefTemplate = "template" - osImageRefMOID = "moid" - varIdentityRef = "identityRef" - namespaceCAPV = "capv-system" -) - -type Webhook struct { - Log logr.Logger - Client client.Client - Resolver templateresolver.TemplateResolver - decoder *admission.Decoder -} - -func (cw *Webhook) InjectDecoder(decoder *admission.Decoder) error { - cw.decoder = decoder - return nil -} - -func (cw *Webhook) Handle(ctx context.Context, req admission.Request) admission.Response { // nolint:gocritic // suppress linter error: hugeParam: req is heavy (400 bytes); consider passing by pointer (gocritic) - // Decode the request into cluster - cluster := &clusterv1.Cluster{} - if err := cw.decoder.Decode(req, cluster); err != nil { - return admission.Errored(http.StatusBadRequest, err) - } - - skipReason, err := cw.resolve(ctx, cluster) - if err != nil { - return admission.Denied(err.Error()) - } - - if skipReason != "" { - return admission.Allowed(skipReason) - } - - return success(&req, cluster) -} - -func (cw *Webhook) resolve(ctx context.Context, cluster *clusterv1.Cluster) (string, error) { - topology := cluster.Spec.Topology - if topology == nil { - // No topology, skip. - return "skipping VM template resolution: topology not set", nil - } - - tkrName := cluster.Labels[runv1.LabelTKR] - if tkrName == "" { - // tkr resolution (tkr-resolver webhook) not yet finished, so skip template resolution. - // vsphere template resolution relies on the label set during tkr resolution, hence there is no point proceeding until that step is complete. - return "skipping VM template resolution: TKR label is not set (yet)", nil - } - - var tkrData resolver_cluster.TKRData - if err := util_topology.GetVariable(cluster, varTKRData, &tkrData); err != nil { - return "", errors.Wrapf(err, "error parsing TKR_DATA control plane variable") - } - - if tkrDataValue := tkrData[topology.Version]; tkrDataValue == nil || tkrDataValue.Labels[runv1.LabelTKR] != tkrName { - // Resolved tkr label is different from topology version. - // tkr resolution is possibly not yet complete for this topology version - return "skipping VM template resolution: TKR is not fully resolved", nil - } - - // Get TKR Data variable for control plane and populate query. - cpData, err := getCPData(tkrData, topology.Version) - if err != nil { - return "", errors.Wrapf(err, "error building VM template query for the control plane, cluster '%s'", fmt.Sprintf("%s/%s", cluster.Namespace, cluster.Name)) - } - - // Get TKR Data variable for each MD and populate query. - mdDatas, err := getMDDatas(cluster) - if err != nil { - return "", err - } - - ovaTemplateQueries := collectOVATemplateQueries(append(mdDatas, cpData)) - if len(ovaTemplateQueries) == 0 { - return "no queries to resolve, no-op", nil - } - - vSphereContext, err := cw.getVSphereContext(ctx, cluster) - if err != nil { - return "", err - } - - vc, err := cw.Resolver.GetVSphereEndpoint(vSphereContext) - if err != nil { - return "", err - } - - query := templateresolver.Query{ - OVATemplateQueries: ovaTemplateQueries, - } - - cw.Log.Info("Template resolution query", "query", query) - // Query for template resolution - result := cw.Resolver.Resolve(ctx, vSphereContext, query, vc) - if result.UsefulErrorMessage != "" { - // If there are any useful error messages, deny request. - return "", errors.New(result.UsefulErrorMessage) - } - - cw.Log.Info("Template resolution result", "result", result) - - return "", cw.processAndSetResult(result, cluster, cpData, mdDatas) -} - -func collectOVATemplateQueries(mdDataValues []*mdDataValue) map[templateresolver.TemplateQuery]struct{} { - result := make(map[templateresolver.TemplateQuery]struct{}, len(mdDataValues)) - for _, mdDataValue := range mdDataValues { - if mdDataValue != nil { - result[mdDataValue.TemplateQuery] = struct{}{} - } - } - return result -} - -func getCPData(tkrData resolver_cluster.TKRData, topologyVersion string) (*mdDataValue, error) { - tkrDataValue := tkrData[topologyVersion] - - // Build the Template query otherwise. - templateQuery, err := createTemplateQueryFromTKRData(tkrDataValue) - if err != nil { - return nil, err - } - - if templateQuery == nil { - return nil, nil - } - - return &mdDataValue{ - TKRData: tkrData, - TemplateQuery: *templateQuery, - }, nil -} - -// mdDataValue holds the TKR Data and the constructed Template Query for a single Machine Deployment. -type mdDataValue struct { - TKRData resolver_cluster.TKRData - TemplateQuery templateresolver.TemplateQuery -} - -// getMDDatas: returns a template query and a map of the index of the TKR_DATA as the key, and mdDataValue as the value. -// This works under the following assumptions: -// - Every MD contains exactly one TKR_DATA. -// - Every TKR_DATA contains exactly one TKRDataValue matching the topology's k8sVersion. -// - Thus, every TKR_DATA can only map to one query. -func getMDDatas(cluster *clusterv1.Cluster) ([]*mdDataValue, error) { - topology := cluster.Spec.Topology - if topology == nil || topology.Workers == nil { - return nil, nil - } - mds := topology.Workers.MachineDeployments - mdDatas := make([]*mdDataValue, len(mds)) - - for i, md := range mds { - var mdTKRData resolver_cluster.TKRData - err := util_topology.GetMDVariable(cluster, i, varTKRData, &mdTKRData) - if err != nil { - return nil, errors.Wrapf(err, "error parsing TKR_DATA machine deployment %v", md.Name) - } - - tkrDataValue := mdTKRData[topology.Version] - - // Build the query with OVA/OS details - templateQuery, err := createTemplateQueryFromTKRData(tkrDataValue) - if err != nil { - return nil, errors.Wrapf(err, "error building VM template query for machine deployment '%s', cluster '%s'", md.Name, fmt.Sprintf("%s/%s", cluster.Namespace, cluster.Name)) - } - - if templateQuery != nil { - mdDatas[i] = &mdDataValue{TKRData: mdTKRData, TemplateQuery: *templateQuery} - } - } - return mdDatas, nil -} - -func createTemplateQueryFromTKRData(tkrDataValue *resolver_cluster.TKRDataValue) (*templateresolver.TemplateQuery, error) { - if tkrDataValue == nil { - return nil, errors.New("trying to resolve VM template for non-existent TKRData value") - } - - ovaVersion, ok := tkrDataValue.OSImageRef[osImageRefVersion].(string) - if !ok { - return nil, errors.New("ova version is invalid or not found") - } - - templatePath, ok := tkrDataValue.OSImageRef[osImageRefTemplate].(string) - if ok && len(templatePath) > 0 { - // No resolution needed as template Path already exists. - // Users will need to explicitly remove the template related labels and re-trigger. - // This is necessary to prevent unnecessary template resolution every time there is an update to the cluster. - // Template resolution is seen as an expensive operation - return nil, nil - } - - osInfo := runv1.OSInfo{ - Name: tkrDataValue.Labels.Get("os-name"), - Version: tkrDataValue.Labels.Get("os-version"), - Arch: tkrDataValue.Labels.Get("os-arch"), - } - - return &templateresolver.TemplateQuery{ - OVAVersion: ovaVersion, - OSInfo: osInfo, - }, nil -} - -func (cw *Webhook) processAndSetResult(result templateresolver.Result, cluster *clusterv1.Cluster, cpData *mdDataValue, mdDatas []*mdDataValue) error { - topologyVersion := cluster.Spec.Topology.Version - - cpTKRData, mdTKRDatas, err := processResults(result, cpData, topologyVersion, mdDatas) - if err != nil { - return err - } - - return cw.setResult(cluster, cpTKRData, mdTKRDatas) -} - -func processResults(result templateresolver.Result, cpData *mdDataValue, topologyVersion string, mdDatas []*mdDataValue) (resolver_cluster.TKRData, []resolver_cluster.TKRData, error) { - // Process CP result - cpTKRData, err := tkrDataWithResult(result, cpData, topologyVersion) - if err != nil { - return nil, nil, errors.Wrap(err, "failed to resolve VM template for control plane") - } - - // Process MD results - mdTKRDatas := make([]resolver_cluster.TKRData, len(mdDatas)) - for i, mdData := range mdDatas { - tkrData, err := tkrDataWithResult(result, mdData, topologyVersion) - if err != nil { - return nil, nil, errors.Wrapf(err, "failed to resolve VM template for machine deployment [%v]", i) - } - mdTKRDatas[i] = tkrData - } - - return cpTKRData, mdTKRDatas, nil -} - -func tkrDataWithResult(result templateresolver.Result, mdDataValue *mdDataValue, topologyVersion string) (resolver_cluster.TKRData, error) { - if mdDataValue == nil { - return nil, nil - } - tkrData := mdDataValue.TKRData - tkrDataValue := tkrData[topologyVersion] // we know the value exists: otherwise the passed mdDataValue would be nil - res := result.OVATemplates[mdDataValue.TemplateQuery] - if res == nil { - return nil, errors.Errorf("no result found for query %v", mdDataValue.TemplateQuery) - } - populateTKRDataFromResult(tkrDataValue, res) - return tkrData, nil -} - -func (cw *Webhook) setResult(cluster *clusterv1.Cluster, cpTKRData resolver_cluster.TKRData, mdTKRDatas []resolver_cluster.TKRData) error { - if cpTKRData != nil { - if err := util_topology.SetVariable(cluster, varTKRData, cpTKRData); err != nil { - return errors.Wrapf(err, "error setting control plane TKR_DATA variable") - } - } - cw.Log.Info("template resolution result processing complete for Control Plane topology") - for i, tkrData := range mdTKRDatas { - if tkrData != nil { - if err := util_topology.SetMDVariable(cluster, i, varTKRData, tkrData); err != nil { - return errors.Wrapf(err, fmt.Sprintf("error setting machine deployment [%v]'s TKR_DATA variable", i)) - } - } - } - cw.Log.Info("template resolution result processing complete for machine deployments in topology") - return nil -} - -func populateTKRDataFromResult(tkrDataValue *resolver_cluster.TKRDataValue, templateResult *templateresolver.TemplateResult) { - if templateResult == nil { - // If the values are empty, its possible that the resolution was skipped because the details were already present. - // Do not overwrite. - return - } - tkrDataValue.OSImageRef[osImageRefTemplate] = templateResult.TemplatePath - tkrDataValue.OSImageRef[osImageRefMOID] = templateResult.TemplateMOID -} - -func (cw *Webhook) getVSphereContext(ctx context.Context, cluster *clusterv1.Cluster) (*templateresolver.VSphereContext, error) { - c := cw.Client - - // By default, a Secret with the same name and namespace will be used as the vSphere identity. However, API - // consumers like TMC are allowed to use alternative identity type, e.g. VSphereClusterIdentity through the - // Cluster variable identityRef. We need to retrieve the credential Secret according to different use cases. - secretName := cluster.Name - secretNamespace := cluster.Namespace - for _, variable := range cluster.Spec.Topology.Variables { - if variable.Name == varIdentityRef { - identityRef := &capvv1beta1.VSphereIdentityReference{} - if err := json.Unmarshal(variable.Value.Raw, identityRef); err != nil { - return nil, errors.Wrapf(err, fmt.Sprintf("could not parse variable identityRef: %v", variable)) - } - switch identityRef.Kind { - case capvv1beta1.VSphereClusterIdentityKind: - vSphereClusterIdentity := &capvv1beta1.VSphereClusterIdentity{} - if err := c.Get(ctx, client.ObjectKey{Name: identityRef.Name}, vSphereClusterIdentity); err != nil { - return nil, errors.Wrapf(err, fmt.Sprintf("could not get VSphereClusterIdentity %s", identityRef.Name)) - } - if vSphereClusterIdentity.Status.Ready { - secretName = vSphereClusterIdentity.Spec.SecretName - secretNamespace = namespaceCAPV - } else { - return nil, errors.New(fmt.Sprintf("VShereClusterIdentity %s is not ready yet", identityRef.Name)) - } - case capvv1beta1.SecretKind: - secretName = identityRef.Name - default: - return nil, errors.New(fmt.Sprintf("not supported identityRef type %s", identityRef.Kind)) - } - } - } - - secret := &corev1.Secret{} - objKey := client.ObjectKey{Name: secretName, Namespace: secretNamespace} - cw.Log.Info("Getting secret for VC Client", "key", objKey) - err := c.Get(ctx, objKey, secret) - if err != nil { - return nil, errors.Wrap(err, fmt.Sprintf("could not get secret for key: %v", objKey)) - } - username, password := secret.Data["username"], secret.Data["password"] - - var vcClusterVar VCenterClusterVar - err = util_topology.GetVariable(cluster, varVCenter, &vcClusterVar) - if err != nil { - return nil, errors.Wrapf(err, "error parsing vcenter cluster variable") - } - - insecure := true - if vcClusterVar.TLSThumbprint != "" { - insecure = false - } - - cw.Log.Info("Successfully retrieved vSphere context", "Server", vcClusterVar.Server, "datacenter", vcClusterVar.DataCenter, "tlsthumbprint", vcClusterVar.TLSThumbprint) - return &templateresolver.VSphereContext{ - Username: string(username), - Password: string(password), - Server: vcClusterVar.Server, - DataCenter: vcClusterVar.DataCenter, - TLSThumbprint: vcClusterVar.TLSThumbprint, - InsecureSkipVerify: insecure, - }, nil -} - -// success constructs PatchResponse from the mutated cluster. -func success(req *admission.Request, cluster *clusterv1.Cluster) admission.Response { - marshaledCluster, err := json.Marshal(cluster) - if err != nil { - return admission.Errored(http.StatusInternalServerError, err) - } - return admission.PatchResponseFromRaw(req.Object.Raw, marshaledCluster) -} diff --git a/tkg/vsphere-template-resolver/template/resolver_test.go b/tkg/vsphere-template-resolver/template/resolver_test.go deleted file mode 100644 index c51a20dc97..0000000000 --- a/tkg/vsphere-template-resolver/template/resolver_test.go +++ /dev/null @@ -1,1103 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package template - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "testing" - - capvv1beta1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - - "github.com/go-logr/logr" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "gomodules.xyz/jsonpatch/v2" - corev1 "k8s.io/api/core/v1" - apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/types" - "k8s.io/kubectl/pkg/scheme" - clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1" - crtclient "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" - - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/vsphere-template-resolver/templateresolver" - fakeresolver "github.com/vmware-tanzu/tanzu-framework/tkg/vsphere-template-resolver/templateresolver/fakes" - resolver_cluster "github.com/vmware-tanzu/tanzu-framework/tkr/webhook/cluster/tkr-resolver/cluster" - "github.com/vmware-tanzu/tanzu-framework/util/topology" -) - -const ( - defaultUserName = "username" - defaultPassword = "password" - defaultServer = "vsphere-server" - defaultDatacenter = "datacenter" -) - -func TestResolve(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "vsphere-template-resolver webhook test") -} - -var _ = Describe("Webhook", func() { - - const ( - tkrV1_22_3 = "v1.22.3---vmware.1-rest-does-not-matter" - tkrV1_21_8 = "v1.21.8---vmware.1-rest-does-not-matter" - ) - Context("Handle()", func() { - var ( - req admission.Request - resp admission.Response - clusterObj *unstructured.Unstructured - topology map[string]interface{} - cw Webhook - err error - ) - BeforeEach(func() { - clusterObj = nil - log := logr.Discard() - cw = Webhook{ - Log: log, - Client: nil, - Resolver: templateresolver.NewResolver(log), - } - decoder, err := admission.NewDecoder(scheme.Scheme) - Expect(err).NotTo(HaveOccurred()) - Expect(decoder).NotTo(BeNil()) - err = cw.InjectDecoder(decoder) - Expect(err).NotTo(HaveOccurred()) - }) - JustBeforeEach(func() { - if clusterObj == nil { - clusterObj = &unstructured.Unstructured{ - Object: map[string]interface{}{ - "spec": map[string]interface{}{ - "topology": topology, - }, - }, - } - } - req.Object.Raw, err = json.Marshal(clusterObj) - resp = cw.Handle(context.TODO(), req) - }) - When("cluster decode fails", func() { - BeforeEach(func() { - clusterObj = &unstructured.Unstructured{ - Object: map[string]interface{}{ - "spec": "this shouldn't be a string", - }, - } - }) - It("should return with an admission errored", func() { - Expect(len(resp.Patches)).To(Equal(0)) - Expect(resp.AdmissionResponse.Allowed).To(BeFalse()) - Expect(resp.Result.Message).To(Equal("json: cannot unmarshal string into Go struct field Cluster.spec of type v1beta1.ClusterSpec")) - }) - }) - When("no topology is set", func() { - BeforeEach(func() { - topology = nil - }) - It("should return with admission allowed", func() { - Expect(len(resp.Patches)).To(Equal(0)) - Expect(resp.AdmissionResponse.Allowed).To(BeTrue()) - Expect(string(resp.Result.Reason)).To(Equal("skipping VM template resolution: topology not set")) - Expect(resp.Result.Message).To(Equal("")) - }) - }) - When("everything is good", func() { - var ( - fakeClient *fakes.CRTClusterClient - fakeVCClient *fakes.VCClient - fakeResolver fakeresolver.TemplateResolver - expectedResult templateresolver.Result - - username string - password string - - old templateresolver.TemplateResolver - getSecretFunc func(object crtclient.Object) error - ) - BeforeEach(func() { - // Build TKR_DATA in JSON format - validTKRData := resolver_cluster.TKRData{ - "v1.22.3+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "foo"}, - Labels: labels.Set{ - runv1.LabelTKR: tkrV1_22_3, - "os-name": "fooOSName", - "os-version": "fooOSVersion", - "os-arch": "fooOSArch", - }, - }, - "v1.21.8+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "bar"}, - Labels: labels.Set{ - runv1.LabelTKR: tkrV1_21_8, - "os-name": "barOSName", - "os-version": "barOSVersion", - "os-arch": "barOSArch", - }, - }, - } - result := &apiextensionsv1.JSON{} - data, err := json.Marshal(validTKRData) - Expect(err).ToNot(HaveOccurred()) - Expect(json.Unmarshal(data, result)).To(Succeed()) - - // Build the topology - topology = map[string]interface{}{ - "controlPlane": map[string]interface{}{}, - "variables": []map[string]interface{}{ - { - "name": "TKR_DATA", - "value": result, - }, - }, - "version": "v1.22.3+vmware.1", - } - - // Build the cluster - clusterObj = &unstructured.Unstructured{ - Object: map[string]interface{}{ - "spec": map[string]interface{}{ - "topology": topology, - }, - "metadata": map[string]interface{}{ - "labels": map[string]interface{}{ - runv1.LabelTKR: tkrV1_22_3, - }, - }, - }, - } - - // Setup fakes - fakeClient = &fakes.CRTClusterClient{} - cw.Client = fakeClient - - username = defaultUserName - password = defaultPassword - - getSecretFunc = func(object crtclient.Object) error { // nolint:unparam // result is always nil: this is intentional - data := map[string][]byte{ - "username": []byte(username), - "password": []byte(password), - } - object.(*corev1.Secret).Data = data - return nil - } - - fakeClient.GetCalls(func(ctx context.Context, name types.NamespacedName, object crtclient.Object) error { - if _, ok := object.(*corev1.Secret); ok { - return getSecretFunc(object) - } - return errors.New("Get() failed") - }) - - fakeVCClient = &fakes.VCClient{} - fakeResolver.GetVSphereEndpointReturns(fakeVCClient, nil) - - query := templateresolver.TemplateQuery{ - OVAVersion: "foo", - OSInfo: runv1.OSInfo{ - Name: "fooOSName", - Version: "fooOSVersion", - Arch: "fooOSArch", - }, - } - - expectedResult = templateresolver.Result{ - OVATemplates: templateresolver.OVATemplateResult{ - query: &templateresolver.TemplateResult{ - TemplatePath: "fooTemplate", - TemplateMOID: "fooMOID", - }, - }, - } - fakeResolver.ResolveReturns(expectedResult) - - old = cw.Resolver - cw.Resolver = &fakeResolver - - }) - It("should return with admission allowed", func() { - Expect(err).ToNot(HaveOccurred()) - for i, v := range resp.Patches { - fmt.Println(i, v) - } - Expect(resp.Patches).Should(ContainElements( - jsonpatch.JsonPatchOperation{ - Operation: "add", - Path: "/spec/topology/variables/0/value/v1.22.3+vmware.1/osImageRef/template", - Value: "fooTemplate", - }, - jsonpatch.JsonPatchOperation{ - Operation: "add", - Path: "/spec/topology/variables/0/value/v1.22.3+vmware.1/osImageRef/moid", - Value: "fooMOID", - }, - )) - - }) - JustAfterEach(func() { - cw.Resolver = old - }) - }) - - }) - - Context("resolve()", func() { - var ( - cw Webhook - cluster *clusterv1.Cluster - validCPTKRData resolver_cluster.TKRData - validMDTKRData1 resolver_cluster.TKRData - validMDTKRData2 resolver_cluster.TKRData - cpQuery templateresolver.TemplateQuery - mdQuery1 templateresolver.TemplateQuery - mdQuery2 templateresolver.TemplateQuery - fakeClient *fakes.CRTClusterClient - fakeVCClient *fakes.VCClient - fakeResolver fakeresolver.TemplateResolver - fakeResolverOutput templateresolver.Result - - username string - password string - - successMsg string - err error - - // Overrides for some packages and functions. - originalResolver templateresolver.TemplateResolver - getSecretFunc func(object crtclient.Object) error - ) - BeforeEach(func() { - cw = Webhook{ - Log: logr.Discard(), - Client: nil, - } - // Setup default cluster. - cluster = &clusterv1.Cluster{ - Spec: clusterv1.ClusterSpec{ - Topology: &clusterv1.Topology{ - Variables: []clusterv1.ClusterVariable{}, - Workers: &clusterv1.WorkersTopology{ - MachineDeployments: []clusterv1.MachineDeploymentTopology{}, - }, - Version: "v1.22.3+vmware.1", - }, - }, - ObjectMeta: v1.ObjectMeta{ - Name: "cluster", - Namespace: "clusterNamespace", - Labels: map[string]string{ - runv1.LabelTKR: tkrV1_22_3, - }, - }, - } - - cpQuery = templateresolver.TemplateQuery{ - OVAVersion: "foo", - OSInfo: runv1.OSInfo{ - Name: "fooOSName", - Version: "fooOSVersion", - Arch: "fooOSArch", - }, - } - validCPTKRData = resolver_cluster.TKRData{ - "v1.22.3+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "foo"}, - Labels: labels.Set{ - runv1.LabelTKR: tkrV1_22_3, - "os-name": "fooOSName", - "os-version": "fooOSVersion", - "os-arch": "fooOSArch", - }, - }, - "v1.21.8+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "bar"}, - Labels: labels.Set{ - runv1.LabelTKR: tkrV1_21_8, - "os-name": "barOSName", - "os-version": "barOSVersion", - "os-arch": "barOSArch", - }, - }, - } - - mdQuery1 = templateresolver.TemplateQuery{ - OVAVersion: "baz", - OSInfo: runv1.OSInfo{ - Name: "bazOSName", - Version: "bazOSVersion", - Arch: "bazOSArch", - }, - } - validMDTKRData1 = resolver_cluster.TKRData{ - "v1.22.3+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "baz"}, - Labels: labels.Set{ - runv1.LabelTKR: tkrV1_22_3, - "os-name": "bazOSName", - "os-version": "bazOSVersion", - "os-arch": "bazOSArch", - }, - }, - "v1.21.8+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "bar"}, - Labels: labels.Set{ - runv1.LabelTKR: tkrV1_21_8, - "os-name": "barOSName", - "os-version": "barOSVersion", - "os-arch": "barOSArch", - }, - }, - } - - mdQuery2 = templateresolver.TemplateQuery{ - OVAVersion: "qux", - OSInfo: runv1.OSInfo{ - Name: "quxOSName", - Version: "quxOSVersion", - Arch: "quxOSArch", - }, - } - validMDTKRData2 = resolver_cluster.TKRData{ - "v1.22.3+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "qux"}, - Labels: labels.Set{ - runv1.LabelTKR: tkrV1_22_3, - "os-name": "quxOSName", - "os-version": "quxOSVersion", - "os-arch": "quxOSArch", - }, - }, - } - - fakeResolverOutput = templateresolver.Result{ - OVATemplates: templateresolver.OVATemplateResult{ - cpQuery: &templateresolver.TemplateResult{ - TemplatePath: "fooTemplate", - TemplateMOID: "fooMOID", - }, - mdQuery1: &templateresolver.TemplateResult{ - TemplatePath: "bazTemplate", - TemplateMOID: "bazMOID", - }, - mdQuery2: &templateresolver.TemplateResult{ - TemplatePath: "quxTemplate", - TemplateMOID: "quxMOID", - }, - }, - } - - // Setup fakes. - fakeClient = &fakes.CRTClusterClient{} - fakeVCClient = &fakes.VCClient{} - cw.Client = fakeClient - - username = defaultUserName - password = defaultPassword - - getSecretFunc = func(object crtclient.Object) error { // nolint:unparam // result is always nil: this is intentional - data := map[string][]byte{ - "username": []byte(username), - "password": []byte(password), - } - object.(*corev1.Secret).Data = data - return nil - } - - fakeResolver = fakeresolver.TemplateResolver{} - fakeResolver.GetVSphereEndpointReturns(fakeVCClient, nil) - fakeResolver.ResolveReturns(fakeResolverOutput) - }) - JustBeforeEach(func() { - fakeClient.GetCalls(func(ctx context.Context, name types.NamespacedName, object crtclient.Object) error { - if _, ok := object.(*corev1.Secret); ok { - return getSecretFunc(object) - } - return errors.New("Get() failed") - }) - - originalResolver = cw.Resolver - cw.Resolver = &fakeResolver - successMsg, err = cw.resolve(context.TODO(), cluster) - }) - JustAfterEach(func() { - cw.Resolver = originalResolver - }) - When("a cluster has valid ovaVersions in both control plane and machine deployment", func() { - BeforeEach(func() { - cluster.Spec.Topology.Workers.MachineDeployments = []clusterv1.MachineDeploymentTopology{ - {Name: "md1"}, - {Name: "md2"}, - } - - Expect(topology.SetVariable(cluster, varTKRData, validCPTKRData)).To(Succeed()) - Expect(topology.SetMDVariable(cluster, 0, varTKRData, validMDTKRData1)).To(Succeed()) - Expect(topology.SetMDVariable(cluster, 1, varTKRData, validMDTKRData2)).To(Succeed()) - }) - It("should update template and MOID for all CP and MD TKR_DATAs.", func() { - Expect(err).To(BeNil()) - Expect(successMsg).To(BeEmpty()) - - var outputTKRData resolver_cluster.TKRData - Expect(topology.GetVariable(cluster, varTKRData, &outputTKRData)).To(Succeed()) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefTemplate]).To(Equal("fooTemplate")) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefMOID]).To(Equal("fooMOID")) - - Expect(topology.GetMDVariable(cluster, 0, varTKRData, &outputTKRData)).To(Succeed()) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefTemplate]).To(Equal("bazTemplate")) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefMOID]).To(Equal("bazMOID")) - - Expect(topology.GetMDVariable(cluster, 1, varTKRData, &outputTKRData)).To(Succeed()) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefTemplate]).To(Equal("quxTemplate")) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefMOID]).To(Equal("quxMOID")) - - Expect(fakeClient.GetCallCount()).To(Equal(1)) - Expect(fakeResolver.GetVSphereEndpointCallCount()).To(Equal(1)) - Expect(fakeResolver.ResolveCallCount()).To(Equal(1)) - }) - }) - When("cluster TKR_DATA is used for for some machine deployments", func() { - BeforeEach(func() { - cluster.Spec.Topology.Workers.MachineDeployments = []clusterv1.MachineDeploymentTopology{ - {Name: "md1"}, - {Name: "md2"}, // There will be no TKR_DATA in this - {Name: "md3"}, - } - - Expect(topology.SetVariable(cluster, varTKRData, validCPTKRData)).To(Succeed()) - Expect(topology.SetMDVariable(cluster, 0, varTKRData, validMDTKRData1)).To(Succeed()) - Expect(topology.SetMDVariable(cluster, 2, varTKRData, validMDTKRData2)).To(Succeed()) - - fakeResolverOutput = templateresolver.Result{ - OVATemplates: templateresolver.OVATemplateResult{ - cpQuery: &templateresolver.TemplateResult{ - TemplatePath: "fooTemplate", - TemplateMOID: "fooMOID", - }, - mdQuery1: &templateresolver.TemplateResult{ - TemplatePath: "bazTemplate", - TemplateMOID: "bazMOID", - }, - mdQuery2: &templateresolver.TemplateResult{ - TemplatePath: "quxTemplate", - TemplateMOID: "quxMOID", - }, - }, - } - fakeResolver.ResolveReturns(fakeResolverOutput) - - }) - It("should resolve template and MOID for all MDs", func() { - Expect(err).To(BeNil()) - - var outputTKRData resolver_cluster.TKRData - - Expect(topology.GetMDVariable(cluster, 0, varTKRData, &outputTKRData)).To(Succeed()) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefTemplate]).To(Equal("bazTemplate")) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefMOID]).To(Equal("bazMOID")) - - Expect(topology.GetMDVariable(cluster, 1, varTKRData, &outputTKRData)).To(Succeed()) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefTemplate]).To(Equal("fooTemplate")) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefMOID]).To(Equal("fooMOID")) - - Expect(topology.GetMDVariable(cluster, 2, varTKRData, &outputTKRData)).To(Succeed()) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefTemplate]).To(Equal("quxTemplate")) - Expect(outputTKRData["v1.22.3+vmware.1"].OSImageRef[osImageRefMOID]).To(Equal("quxMOID")) - - Expect(fakeClient.GetCallCount()).To(Equal(1)) - Expect(fakeResolver.GetVSphereEndpointCallCount()).To(Equal(1)) - Expect(fakeResolver.ResolveCallCount()).To(Equal(1)) - }) - }) - When("there is no topology set in cluster", func() { - BeforeEach(func() { - cluster.Spec.Topology = nil - }) - It("should return a no-op admission allowed response because resolution was skipped.", func() { - Expect(err).To(BeNil()) - Expect(successMsg).To(ContainSubstring("skipping VM template resolution: topology not set")) - }) - }) - When("there is no tkr label set in the cluster", func() { - BeforeEach(func() { - delete(cluster.Labels, runv1.LabelTKR) - }) - It("should return a no-op admission allowed response because tkr-resolution has not yet happened.", func() { - Expect(err).To(BeNil()) - Expect(successMsg).To(ContainSubstring("skipping VM template resolution: TKR label is not set (yet)")) - }) - }) - When("the topology version does not match the version in tkr label", func() { - BeforeEach(func() { - cluster.Spec.Topology.Version = "foo" - }) - It("should return a no-op admission allowed response because tkr-resolution has not yet happened", func() { - Expect(err).To(BeNil()) - Expect(successMsg).To(ContainSubstring("skipping VM template resolution: TKR is not fully resolved")) - }) - }) - When("there are no ovas to resolve because there are no TKR_DATAs", func() { - // No further setup to be done as no TKR_DATAs are set by default - It("should return a no-op admission allowed response because there are ovas to resolve, and thus the queries are empty.", func() { - Expect(err).To(BeNil()) - Expect(successMsg).To(ContainSubstring("skipping VM template resolution: TKR is not fully resolved")) - }) - }) - When("there is an error Getting secret for VC Client", func() { - BeforeEach(func() { - Expect(topology.SetVariable(cluster, varTKRData, validCPTKRData)).To(Succeed()) - getSecretFunc = func(object crtclient.Object) error { - return errors.New("Error while getting secret") - } - }) - It("should return a an error", func() { - Expect(err).ToNot(BeNil()) - Expect(successMsg).To(BeEmpty()) - Expect(err.Error()).To(ContainSubstring("could not get secret for key: clusterNamespace/cluster: Error while getting secret")) - }) - }) - When("there is an error getting vsphere endpoint", func() { - BeforeEach(func() { - Expect(topology.SetVariable(cluster, varTKRData, validCPTKRData)).To(Succeed()) - fakeResolver.GetVSphereEndpointReturns(nil, errors.New("Error while getting vsphere endpoint")) - }) - It("should return an error", func() { - Expect(err).ToNot(BeNil()) - Expect(successMsg).To(BeEmpty()) - Expect(err.Error()).To(ContainSubstring("Error while getting vsphere endpoint")) - }) - }) - When("template resolution fails with a useful error message", func() { - BeforeEach(func() { - Expect(topology.SetVariable(cluster, varTKRData, validCPTKRData)).To(Succeed()) - fakeResolver.ResolveReturns(templateresolver.Result{UsefulErrorMessage: "This is a useful error message"}) - }) - It("should return an error", func() { - Expect(err).ToNot(BeNil()) - Expect(successMsg).To(BeEmpty()) - Expect(err.Error()).To(ContainSubstring("This is a useful error message")) - }) - }) - When("control plane query construction fails", func() { - BeforeEach(func() { - // Simulate failure by sending string in TKR_DATA instead of actual TKR_DATA type - Expect(topology.SetVariable(cluster, varTKRData, "")).To(Succeed()) - }) - It("should return an error", func() { - Expect(err).ToNot(BeNil()) - Expect(successMsg).To(BeEmpty()) - Expect(err.Error()).To(ContainSubstring("error parsing TKR_DATA control plane variable")) - }) - }) - When("machine deployment plane query construction fails", func() { - BeforeEach(func() { - cluster.Spec.Topology.Workers.MachineDeployments = []clusterv1.MachineDeploymentTopology{ - {Name: "md1"}, - {Name: "md2"}, - } - - Expect(topology.SetVariable(cluster, varTKRData, validCPTKRData)).To(Succeed()) - // Simulate failure by sending string in TKR_DATA instead of actual TKR_DATA type for MD - Expect(topology.SetMDVariable(cluster, 0, varTKRData, "")).To(Succeed()) - }) - It("should return an error", func() { - Expect(err).ToNot(BeNil()) - Expect(successMsg).To(BeEmpty()) - Expect(err.Error()).To(ContainSubstring("error parsing TKR_DATA machine deployment md1")) - }) - }) - }) - - Context("processAndSetResult()", func() { - var ( - cw Webhook - - cluster *clusterv1.Cluster - resolverResult templateresolver.Result - cpData *mdDataValue - mdDatas []*mdDataValue - - err error - clusterTopologyVersion string - ) - BeforeEach(func() { - cw = Webhook{ - Log: logr.Discard(), - Client: nil, - } - clusterTopologyVersion = "v1.22.3+vmware.1" - cluster = &clusterv1.Cluster{ - Spec: clusterv1.ClusterSpec{ - Topology: &clusterv1.Topology{ - Variables: []clusterv1.ClusterVariable{}, - Workers: &clusterv1.WorkersTopology{ - MachineDeployments: []clusterv1.MachineDeploymentTopology{}, - }, - Version: clusterTopologyVersion, - }, - }, - ObjectMeta: v1.ObjectMeta{Name: "cluster", Namespace: "clusterNamespace"}, - } - cpData = nil - }) - JustBeforeEach(func() { - err = cw.processAndSetResult(resolverResult, cluster, cpData, mdDatas) - }) - When("There are no TKR_DATA values matching cluster topology version", func() { - var tkrDataValue *resolver_cluster.TKRDataValue - BeforeEach(func() { - tkrDataValue = &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "foo", osImageRefTemplate: "irrelevantTemplate", osImageRefMOID: "irrelevantMOID"}, - } - irrelevantTKRData := resolver_cluster.TKRData{ - "does-not-match-topology": tkrDataValue, - } - - Expect(topology.SetVariable(cluster, varTKRData, irrelevantTKRData)).To(Succeed()) - - cluster.Spec.Topology.Workers.MachineDeployments = []clusterv1.MachineDeploymentTopology{ - { - Name: "md1", - }, - } - Expect(topology.SetMDVariable(cluster, 0, varTKRData, irrelevantTKRData)).To(Succeed()) - - cpData = nil - mdDatas = []*mdDataValue{ - nil, - } - - resolverResult = templateresolver.Result{ - OVATemplates: templateresolver.OVATemplateResult{}, - } - }) - It("should not update any values, and no error is returned.", func() { - Expect(err).ToNot(HaveOccurred()) - Expect(tkrDataValue.OSImageRef[osImageRefTemplate]).To(Equal("irrelevantTemplate")) - Expect(tkrDataValue.OSImageRef[osImageRefMOID]).To(Equal("irrelevantMOID")) - }) - }) - When("TKR_DATA exists in control plane but result is empty", func() { - BeforeEach(func() { - query := templateresolver.TemplateQuery{ - OVAVersion: "ovaVersionFoo", - } - tkrData := resolver_cluster.TKRData{ - "v1.22.3+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "ovaVersionFoo"}, - }, - } - - cpData = &mdDataValue{ - TKRData: tkrData, - TemplateQuery: query, - } - Expect(topology.SetVariable(cluster, varTKRData, tkrData)).To(Succeed()) - resolverResult = templateresolver.Result{ - OVATemplates: templateresolver.OVATemplateResult{}, - } - }) - It("should return an error because every query should have an associated response", func() { - Expect(err).ToNot(BeNil()) - Expect(err.Error()).To(ContainSubstring("no result found for query")) - }) - }) - }) - - Context("populateTKRDataFromResult()", func() { - var ( - tkrDataValue *resolver_cluster.TKRDataValue - templateResult *templateresolver.TemplateResult - ) - When("template result contains template path and moid", func() { - BeforeEach(func() { - tkrDataValue = &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{}, - } - templateResult = &templateresolver.TemplateResult{ - TemplatePath: "fooPath", - TemplateMOID: "fooMOID", - } - populateTKRDataFromResult(tkrDataValue, templateResult) - }) - It("should update the values in the tkr data value", func() { - Expect(tkrDataValue.OSImageRef[osImageRefTemplate]).To(Equal(templateResult.TemplatePath)) - Expect(tkrDataValue.OSImageRef[osImageRefMOID]).To(Equal(templateResult.TemplateMOID)) - }) - }) - When("template result does not contain template path and moid", func() { - BeforeEach(func() { - tkrDataValue = &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{ - osImageRefTemplate: "existing-path", - osImageRefMOID: "existing-moid", - }, - } - populateTKRDataFromResult(tkrDataValue, nil) - }) - It("should not update the existing values in the tkr data value", func() { - Expect(tkrDataValue.OSImageRef[osImageRefTemplate]).To(Equal("existing-path")) - Expect(tkrDataValue.OSImageRef[osImageRefMOID]).To(Equal("existing-moid")) - }) - }) - }) - - Context("getVSphereContext()", func() { - var ( - cw Webhook - cluster *clusterv1.Cluster - - // For fakes and mocks - username string - password string - fakeClient *fakes.CRTClusterClient - getSecretFunc func(object crtclient.Object) error - getVSphereClusterIdentityFunc func(object crtclient.Object) error - ) - BeforeEach(func() { - cluster = &clusterv1.Cluster{ - Spec: clusterv1.ClusterSpec{ - Topology: &clusterv1.Topology{ - Variables: []clusterv1.ClusterVariable{}, - Workers: &clusterv1.WorkersTopology{ - MachineDeployments: []clusterv1.MachineDeploymentTopology{}, - }, - Version: "v1.22.3+vmware.1", - }, - }, - ObjectMeta: v1.ObjectMeta{ - Name: "cluster", - Namespace: "clusterNamespace", - Labels: map[string]string{ - runv1.LabelTKR: tkrV1_22_3, - }, - }, - } - - cw = Webhook{ - Log: logr.Discard(), - Client: nil, - } - fakeClient = &fakes.CRTClusterClient{} - cw.Client = fakeClient - - username = defaultUserName - password = defaultPassword - - getSecretFunc = func(object crtclient.Object) error { // nolint:unparam // result is always nil: this is intentional - data := map[string][]byte{ - "username": []byte(username), - "password": []byte(password), - } - object.(*corev1.Secret).Data = data - return nil - } - - getVSphereClusterIdentityFunc = func(object crtclient.Object) error { - identity := object.(*capvv1beta1.VSphereClusterIdentity) - identity.Spec = capvv1beta1.VSphereClusterIdentitySpec{ - SecretName: "SecretName", - } - identity.Status.Ready = true - return nil - } - - fakeClient.GetCalls(func(ctx context.Context, name types.NamespacedName, object crtclient.Object) error { - switch object.(type) { - case *corev1.Secret: - return getSecretFunc(object) - case *capvv1beta1.VSphereClusterIdentity: - return getVSphereClusterIdentityFunc(object) - default: - return errors.New("Get() failed") - } - }) - }) - When("there is an error to parse variable identityRef", func() { - BeforeEach(func() { - vCenterClusterVar := VCenterClusterVar{ - DataCenter: defaultDatacenter, - Server: defaultServer, - } - Expect(topology.SetVariable(cluster, varVCenter, vCenterClusterVar)).To(BeNil()) - identityRef := "Not the right type" - Expect(topology.SetVariable(cluster, varIdentityRef, identityRef)).To(BeNil()) - }) - It("should return nil and error", func() { - vsphereContext, err := cw.getVSphereContext(context.TODO(), cluster) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("could not parse variable identityRef")) - Expect(vsphereContext).To(BeNil()) - }) - }) - When("variable identityRef is not a supported type", func() { - BeforeEach(func() { - vCenterClusterVar := VCenterClusterVar{ - DataCenter: defaultDatacenter, - Server: defaultServer, - } - Expect(topology.SetVariable(cluster, varVCenter, vCenterClusterVar)).To(BeNil()) - identityRef := map[string]string{ - "name": "vCenterCredential", - "kind": "unsupported", - } - Expect(topology.SetVariable(cluster, varIdentityRef, identityRef)).To(BeNil()) - }) - It("should return nil and error", func() { - vsphereContext, err := cw.getVSphereContext(context.TODO(), cluster) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("not supported identityRef type")) - Expect(vsphereContext).To(BeNil()) - }) - }) - When("IdentityRef is a VSphereClusterIdentity whose status is not ready", func() { - BeforeEach(func() { - vCenterClusterVar := VCenterClusterVar{ - DataCenter: defaultDatacenter, - Server: defaultServer, - } - Expect(topology.SetVariable(cluster, varVCenter, vCenterClusterVar)).To(BeNil()) - identityRef := map[string]string{ - "name": "vCenterCredential", - "kind": string(capvv1beta1.VSphereClusterIdentityKind), - } - Expect(topology.SetVariable(cluster, varIdentityRef, identityRef)).To(BeNil()) - fakeClient.GetCalls(func(ctx context.Context, name types.NamespacedName, object crtclient.Object) error { - identity := object.(*capvv1beta1.VSphereClusterIdentity) - identity.Status.Ready = false - return nil - }) - }) - It("should return nil and error", func() { - vsphereContext, err := cw.getVSphereContext(context.TODO(), cluster) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("is not ready yet")) - Expect(vsphereContext).To(BeNil()) - }) - }) - When("IdentityRef VSphereClusterIdentity does not exist", func() { - BeforeEach(func() { - vCenterClusterVar := VCenterClusterVar{ - DataCenter: defaultDatacenter, - Server: defaultServer, - } - Expect(topology.SetVariable(cluster, varVCenter, vCenterClusterVar)).To(BeNil()) - identityRef := map[string]string{ - "name": "vCenterCredential", - "kind": string(capvv1beta1.VSphereClusterIdentityKind), - } - Expect(topology.SetVariable(cluster, varIdentityRef, identityRef)).To(BeNil()) - fakeClient.GetCalls(func(ctx context.Context, name types.NamespacedName, object crtclient.Object) error { - return errors.New("not found") - }) - }) - It("should return error", func() { - vsphereContext, err := cw.getVSphereContext(context.TODO(), cluster) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("could not get VSphereClusterIdentity")) - Expect(vsphereContext).To(BeNil()) - }) - }) - When("IdentityRef is a VSphereClusterIdentity", func() { - BeforeEach(func() { - vCenterClusterVar := VCenterClusterVar{ - DataCenter: defaultDatacenter, - Server: defaultServer, - } - Expect(topology.SetVariable(cluster, varVCenter, vCenterClusterVar)).To(BeNil()) - identityRef := map[string]string{ - "name": "vCenterCredential", - "kind": string(capvv1beta1.VSphereClusterIdentityKind), - } - Expect(topology.SetVariable(cluster, varIdentityRef, identityRef)).To(BeNil()) - }) - It("should return VsphereContext and should contain the correct username and password", func() { - vsphereContext, err := cw.getVSphereContext(context.TODO(), cluster) - Expect(err).ToNot(HaveOccurred()) - Expect(vsphereContext.InsecureSkipVerify).To(BeTrue()) - Expect(vsphereContext.DataCenter).To(Equal(defaultDatacenter)) - Expect(vsphereContext.Server).To(Equal(defaultServer)) - Expect(vsphereContext.Username).To(Equal(defaultUserName)) - Expect(vsphereContext.Password).To(Equal(defaultPassword)) - }) - }) - When("IdentityRef is a Secret", func() { - BeforeEach(func() { - vCenterClusterVar := VCenterClusterVar{ - DataCenter: defaultDatacenter, - Server: defaultServer, - } - Expect(topology.SetVariable(cluster, varVCenter, vCenterClusterVar)).To(BeNil()) - identityRef := map[string]string{ - "name": "SecretName", - "kind": "Secret", - } - Expect(topology.SetVariable(cluster, varIdentityRef, identityRef)).To(BeNil()) - }) - It("should return VsphereContext and should contain the correct username and password", func() { - vsphereContext, err := cw.getVSphereContext(context.TODO(), cluster) - Expect(err).ToNot(HaveOccurred()) - Expect(vsphereContext.InsecureSkipVerify).To(BeTrue()) - Expect(vsphereContext.DataCenter).To(Equal(defaultDatacenter)) - Expect(vsphereContext.Server).To(Equal(defaultServer)) - Expect(vsphereContext.Username).To(Equal(defaultUserName)) - Expect(vsphereContext.Password).To(Equal(defaultPassword)) - }) - }) - When("TLSThumbprint is not empty and identityRef is empty", func() { - BeforeEach(func() { - vCenterClusterVar := VCenterClusterVar{ - TLSThumbprint: "some-tls-thumbprint", - DataCenter: defaultDatacenter, - Server: defaultServer, - } - Expect(topology.SetVariable(cluster, varVCenter, vCenterClusterVar)) - }) - It("should return VsphereContext with InsecureSkipVerify set to false and TLSThumbprint should contain the correct value", func() { - vsphereContext, err := cw.getVSphereContext(context.TODO(), cluster) - Expect(err).ToNot(HaveOccurred()) - Expect(vsphereContext.InsecureSkipVerify).To(BeFalse()) - Expect(vsphereContext.TLSThumbprint).To(Equal("some-tls-thumbprint")) - Expect(vsphereContext.DataCenter).To(Equal(defaultDatacenter)) - Expect(vsphereContext.Server).To(Equal(defaultServer)) - Expect(vsphereContext.Username).To(Equal(defaultUserName)) - Expect(vsphereContext.Password).To(Equal(defaultPassword)) - }) - }) - When("there is an error while getting the VC cluster variable", func() { - BeforeEach(func() { - vCenterClusterVar := "incorrect type" - Expect(topology.SetVariable(cluster, varVCenter, vCenterClusterVar)) - }) - It("should return VsphereContext with InsecureSkipVerify set to false and TLSThumbprint should contain the correct value", func() { - vsphereContext, err := cw.getVSphereContext(context.TODO(), cluster) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error parsing vcenter cluster variable")) - Expect(vsphereContext).To(BeNil()) - }) - }) - }) - - Context("getCPData() and getMDDatas()", func() { - var ( - cluster *clusterv1.Cluster - tkrData resolver_cluster.TKRData - ) - BeforeEach(func() { - cluster = &clusterv1.Cluster{ - Spec: clusterv1.ClusterSpec{ - Topology: &clusterv1.Topology{ - Variables: []clusterv1.ClusterVariable{}, - Workers: &clusterv1.WorkersTopology{ - MachineDeployments: []clusterv1.MachineDeploymentTopology{}, - }, - Version: "v1.22.3+vmware.1", - }, - }, - ObjectMeta: v1.ObjectMeta{ - Name: "cluster", - Namespace: "clusterNamespace", - Labels: map[string]string{ - runv1.LabelTKR: tkrV1_22_3, - }, - }, - } - }) - When("Template resolution is already complete for control plane", func() { - BeforeEach(func() { - tkrData = resolver_cluster.TKRData{ - "v1.22.3+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "foo", osImageRefTemplate: "already-resolved"}, - Labels: labels.Set{"os-name": "fooOSName", "os-version": "fooOSVersion", "os-arch": "fooOSArch"}, - }, - "v1.21.8+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "bar"}, - Labels: labels.Set{"os-name": "barOSName", "os-version": "barOSVersion", "os-arch": "barOSArch"}, - }, - } - Expect(topology.SetVariable(cluster, varTKRData, tkrData)).To(Succeed()) - }) - It("should return nil mdDataValue", func() { - cpDataValue, err := getCPData(tkrData, cluster.Spec.Topology.Version) - Expect(err).ToNot(HaveOccurred()) - Expect(cpDataValue).To(BeNil()) - }) - }) - When("Template resolution is already complete for machine deployment", func() { - BeforeEach(func() { - cluster.Spec.Topology.Workers.MachineDeployments = []clusterv1.MachineDeploymentTopology{ - {Name: "md1"}, - } - tkrData = resolver_cluster.TKRData{ - "v1.22.3+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "foo", osImageRefTemplate: "already-resolved"}, - Labels: labels.Set{"os-name": "fooOSName", "os-version": "fooOSVersion", "os-arch": "fooOSArch"}, - }, - "v1.21.8+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{osImageRefVersion: "bar"}, - Labels: labels.Set{"os-name": "barOSName", "os-version": "barOSVersion", "os-arch": "barOSArch"}, - }, - } - Expect(topology.SetMDVariable(cluster, 0, varTKRData, tkrData)).To(Succeed()) - }) - It("should return nil mdDataValue for the machine deployment", func() { - mdDatas, err := getMDDatas(cluster) - Expect(err).ToNot(HaveOccurred()) - Expect(mdDatas).To(HaveLen(len(cluster.Spec.Topology.Workers.MachineDeployments))) - for _, mdDataValue := range mdDatas { - Expect(mdDataValue).To(BeNil()) - } - }) - }) - - When("Control plane TKR_DATA is invalid because it does not contain OVAVersion in OSImageRef", func() { - BeforeEach(func() { - tkrData = resolver_cluster.TKRData{ - "v1.22.3+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{}, // No version field - }, - } - Expect(topology.SetVariable(cluster, varTKRData, tkrData)).To(Succeed()) - }) - It("should return an appropriate error", func() { - cpData, err := getCPData(tkrData, cluster.Spec.Topology.Version) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("ova version is invalid or not found")) - Expect(cpData).To(BeNil()) - }) - }) - When("machine deployment TKR_DATA is invalid because it does not contain OVAVersion in OSImageRef", func() { - BeforeEach(func() { - cluster.Spec.Topology.Workers.MachineDeployments = []clusterv1.MachineDeploymentTopology{ - {Name: "md1"}, - {Name: "md2"}, - } - tkrData = resolver_cluster.TKRData{ - "v1.22.3+vmware.1": &resolver_cluster.TKRDataValue{ - OSImageRef: map[string]interface{}{}, // No version field - }, - } - Expect(topology.SetMDVariable(cluster, 0, varTKRData, tkrData)).To(Succeed()) - }) - It("should return an appropriate error", func() { - tkrDatas, err := getMDDatas(cluster) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring("error building VM template query for machine deployment 'md1', cluster 'clusterNamespace/cluster': ova version is invalid or not found")) - Expect(tkrDatas).To(BeEmpty()) - }) - }) - }) -}) diff --git a/tkg/vsphere-template-resolver/template/vcenter.go b/tkg/vsphere-template-resolver/template/vcenter.go deleted file mode 100644 index d5d9584b49..0000000000 --- a/tkg/vsphere-template-resolver/template/vcenter.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package template - -type VCenterClusterVar struct { - DataCenter string `json:"datacenter"` - Server string `json:"server"` - Template string `json:"template"` - TLSThumbprint string `json:"tlsThumbprint"` -} diff --git a/tkg/vsphere-template-resolver/templateresolver/fakes/templateresolver.go b/tkg/vsphere-template-resolver/templateresolver/fakes/templateresolver.go deleted file mode 100644 index c6ee4be4fa..0000000000 --- a/tkg/vsphere-template-resolver/templateresolver/fakes/templateresolver.go +++ /dev/null @@ -1,198 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "context" - "sync" - - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" - "github.com/vmware-tanzu/tanzu-framework/tkg/vsphere-template-resolver/templateresolver" -) - -type TemplateResolver struct { - GetVSphereEndpointStub func(*templateresolver.VSphereContext) (vc.Client, error) - getVSphereEndpointMutex sync.RWMutex - getVSphereEndpointArgsForCall []struct { - arg1 *templateresolver.VSphereContext - } - getVSphereEndpointReturns struct { - result1 vc.Client - result2 error - } - getVSphereEndpointReturnsOnCall map[int]struct { - result1 vc.Client - result2 error - } - ResolveStub func(context.Context, *templateresolver.VSphereContext, templateresolver.Query, vc.Client) templateresolver.Result - resolveMutex sync.RWMutex - resolveArgsForCall []struct { - arg1 context.Context - arg2 *templateresolver.VSphereContext - arg3 templateresolver.Query - arg4 vc.Client - } - resolveReturns struct { - result1 templateresolver.Result - } - resolveReturnsOnCall map[int]struct { - result1 templateresolver.Result - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *TemplateResolver) GetVSphereEndpoint(arg1 *templateresolver.VSphereContext) (vc.Client, error) { - fake.getVSphereEndpointMutex.Lock() - ret, specificReturn := fake.getVSphereEndpointReturnsOnCall[len(fake.getVSphereEndpointArgsForCall)] - fake.getVSphereEndpointArgsForCall = append(fake.getVSphereEndpointArgsForCall, struct { - arg1 *templateresolver.VSphereContext - }{arg1}) - stub := fake.GetVSphereEndpointStub - fakeReturns := fake.getVSphereEndpointReturns - fake.recordInvocation("GetVSphereEndpoint", []interface{}{arg1}) - fake.getVSphereEndpointMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *TemplateResolver) GetVSphereEndpointCallCount() int { - fake.getVSphereEndpointMutex.RLock() - defer fake.getVSphereEndpointMutex.RUnlock() - return len(fake.getVSphereEndpointArgsForCall) -} - -func (fake *TemplateResolver) GetVSphereEndpointCalls(stub func(*templateresolver.VSphereContext) (vc.Client, error)) { - fake.getVSphereEndpointMutex.Lock() - defer fake.getVSphereEndpointMutex.Unlock() - fake.GetVSphereEndpointStub = stub -} - -func (fake *TemplateResolver) GetVSphereEndpointArgsForCall(i int) *templateresolver.VSphereContext { - fake.getVSphereEndpointMutex.RLock() - defer fake.getVSphereEndpointMutex.RUnlock() - argsForCall := fake.getVSphereEndpointArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *TemplateResolver) GetVSphereEndpointReturns(result1 vc.Client, result2 error) { - fake.getVSphereEndpointMutex.Lock() - defer fake.getVSphereEndpointMutex.Unlock() - fake.GetVSphereEndpointStub = nil - fake.getVSphereEndpointReturns = struct { - result1 vc.Client - result2 error - }{result1, result2} -} - -func (fake *TemplateResolver) GetVSphereEndpointReturnsOnCall(i int, result1 vc.Client, result2 error) { - fake.getVSphereEndpointMutex.Lock() - defer fake.getVSphereEndpointMutex.Unlock() - fake.GetVSphereEndpointStub = nil - if fake.getVSphereEndpointReturnsOnCall == nil { - fake.getVSphereEndpointReturnsOnCall = make(map[int]struct { - result1 vc.Client - result2 error - }) - } - fake.getVSphereEndpointReturnsOnCall[i] = struct { - result1 vc.Client - result2 error - }{result1, result2} -} - -func (fake *TemplateResolver) Resolve(arg1 context.Context, arg2 *templateresolver.VSphereContext, arg3 templateresolver.Query, arg4 vc.Client) templateresolver.Result { - fake.resolveMutex.Lock() - ret, specificReturn := fake.resolveReturnsOnCall[len(fake.resolveArgsForCall)] - fake.resolveArgsForCall = append(fake.resolveArgsForCall, struct { - arg1 context.Context - arg2 *templateresolver.VSphereContext - arg3 templateresolver.Query - arg4 vc.Client - }{arg1, arg2, arg3, arg4}) - stub := fake.ResolveStub - fakeReturns := fake.resolveReturns - fake.recordInvocation("Resolve", []interface{}{arg1, arg2, arg3, arg4}) - fake.resolveMutex.Unlock() - if stub != nil { - return stub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1 - } - return fakeReturns.result1 -} - -func (fake *TemplateResolver) ResolveCallCount() int { - fake.resolveMutex.RLock() - defer fake.resolveMutex.RUnlock() - return len(fake.resolveArgsForCall) -} - -func (fake *TemplateResolver) ResolveCalls(stub func(context.Context, *templateresolver.VSphereContext, templateresolver.Query, vc.Client) templateresolver.Result) { - fake.resolveMutex.Lock() - defer fake.resolveMutex.Unlock() - fake.ResolveStub = stub -} - -func (fake *TemplateResolver) ResolveArgsForCall(i int) (context.Context, *templateresolver.VSphereContext, templateresolver.Query, vc.Client) { - fake.resolveMutex.RLock() - defer fake.resolveMutex.RUnlock() - argsForCall := fake.resolveArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *TemplateResolver) ResolveReturns(result1 templateresolver.Result) { - fake.resolveMutex.Lock() - defer fake.resolveMutex.Unlock() - fake.ResolveStub = nil - fake.resolveReturns = struct { - result1 templateresolver.Result - }{result1} -} - -func (fake *TemplateResolver) ResolveReturnsOnCall(i int, result1 templateresolver.Result) { - fake.resolveMutex.Lock() - defer fake.resolveMutex.Unlock() - fake.ResolveStub = nil - if fake.resolveReturnsOnCall == nil { - fake.resolveReturnsOnCall = make(map[int]struct { - result1 templateresolver.Result - }) - } - fake.resolveReturnsOnCall[i] = struct { - result1 templateresolver.Result - }{result1} -} - -func (fake *TemplateResolver) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.getVSphereEndpointMutex.RLock() - defer fake.getVSphereEndpointMutex.RUnlock() - fake.resolveMutex.RLock() - defer fake.resolveMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *TemplateResolver) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ templateresolver.TemplateResolver = new(TemplateResolver) diff --git a/tkg/vsphere-template-resolver/templateresolver/interface.go b/tkg/vsphere-template-resolver/templateresolver/interface.go deleted file mode 100644 index fa2420d592..0000000000 --- a/tkg/vsphere-template-resolver/templateresolver/interface.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package templateresolver - -import ( - "context" - - "github.com/go-logr/logr" - - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -//go:generate counterfeiter -o fakes/templateresolver.go --fake-name TemplateResolver . TemplateResolver - -// TemplateResolver resolves vSphere templates -type TemplateResolver interface { - // Resolve returns VM template path and MOIDs satisfying query constraints. - Resolve(ctx context.Context, svrContext *VSphereContext, query Query, vcClient vc.Client) Result - GetVSphereEndpoint(svrContext *VSphereContext) (vc.Client, error) -} - -// New returns a newly created instance of the vSphere template resolver implementation. -func New(log logr.Logger) TemplateResolver { - return NewResolver(log) -} diff --git a/tkg/vsphere-template-resolver/templateresolver/resolver_impl.go b/tkg/vsphere-template-resolver/templateresolver/resolver_impl.go deleted file mode 100644 index b8e46e3d99..0000000000 --- a/tkg/vsphere-template-resolver/templateresolver/resolver_impl.go +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package templateresolver - -import ( - "context" - "fmt" - "net/url" - "strings" - - "github.com/go-logr/logr" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" -) - -type Resolver struct { - Log logr.Logger -} - -func NewResolver(log logr.Logger) *Resolver { - return &Resolver{Log: log} -} - -// GetVSphereEndpoint gets vsphere client based on credentials set in config variables -func (r *Resolver) GetVSphereEndpoint(svrContext *VSphereContext) (vc.Client, error) { - host := strings.TrimSpace(svrContext.Server) - if !strings.HasPrefix(host, "http") { - host = "https://" + host - } - vcURL, err := url.Parse(host) - if err != nil { - return nil, errors.Wrap(err, "failed to parse vc host") - } - vcURL.Path = "/sdk" - - r.Log.Info(fmt.Sprintf("Creating client with endpoint: %v", vcURL)) - // TODO: setup a cache to reuse vc sessions - vcClient, err := vc.NewClient(vcURL, svrContext.TLSThumbprint, svrContext.InsecureSkipVerify) - if err != nil { - return nil, errors.Wrap(err, "failed to create vc client") - } - - r.Log.Info("Logging into vSphere") - _, err = vcClient.Login(context.TODO(), svrContext.Username, svrContext.Password) // TODO(imikushin): Pass in context from handle() here. - if err != nil { - return nil, errors.Wrap(err, "failed to login to vSphere") - } - return vcClient, nil -} - -// Resolve queries VC using the vcClient for template resolution of the OVAs from the input query. -func (r *Resolver) Resolve(ctx context.Context, svrContext *VSphereContext, query Query, vcClient vc.Client) Result { - if len(query.OVATemplateQueries) == 0 { - return Result{} - } - - // Query VC to get templates for OVAs. - // Only query if there are non-empty queries to resolve. - vcVMs, err := getVirtualMachineTemplateForOVAs(ctx, svrContext.DataCenter, vcClient) - if err != nil { - r.Log.Error(err, "failed to get VSphereVirtualMachine images from VC client") - return Result{UsefulErrorMessage: err.Error()} - } - - // Find VMs with matching ova versions, and update relevant fields. - return updateTemplateDetailsInVMs(vcVMs, query) -} - -// getVirtualMachineTemplateForOVAs queries VC and retrieves all the `VSphereVirtualMachine` entries. -func getVirtualMachineTemplateForOVAs(ctx context.Context, dc string, vcClient vc.Client) ([]*types.VSphereVirtualMachine, error) { - // We need DC MOID to query VMs. - dcMOID, err := vcClient.FindDataCenter(ctx, dc) - if err != nil { - return nil, errors.Wrap(err, "failed to get the datacenter MOID") - } - - // Get all vcVMs. - vcVMs, err := vcClient.GetVirtualMachineImages(ctx, dcMOID) - if err != nil { - return nil, errors.Wrap(err, "failed to get K8s VM templates") - } - - return vcVMs, nil -} - -// updateTemplateDetailsInVMs: iterates over the list of VSphereVirtualMachine and finds the matching query associated with it. -// Returns a result containing the template path and MOID for each query. -func updateTemplateDetailsInVMs(vcVMs []*types.VSphereVirtualMachine, query Query) Result { - queries := query.OVATemplateQueries - ovaTemplates := OVATemplateResult{} - - nonTemplateVMs := map[TemplateQuery][]string{} - for _, vm := range vcVMs { - query := queryForVM(vm) - - if _, ok := queries[query]; !ok { - // No query that matches this, or query already fulfilled in previous iteration. - continue - } - - if !vm.IsTemplate { - // Although VM matches query, this is not a template VM. - // Collect information for populating a useful error message. - nonTemplateVMs[query] = append(nonTemplateVMs[query], vm.Name) - continue - } - - // Query exists, time to create a template result for it. - ovaTemplates[query] = &TemplateResult{ - TemplatePath: vm.Name, - TemplateMOID: vm.Moid, - } - - // Empty the map that collects info for useful error message since template VM is found. - // This will be a no-op unless the map was populated in a previous iteration due to a non-template VM match being found. - // Now that we have found a template VM that matches the query, there is no need to have the entry in this map. - delete(nonTemplateVMs, query) - // Empty the entry from input so the missing values can be checked. - delete(queries, query) - } - - if len(queries) != 0 { - return Result{ - UsefulErrorMessage: buildUsefulErrorMessage(queries, nonTemplateVMs), - } - } - - return Result{ - OVATemplates: ovaTemplates, - } -} - -func queryForVM(vm *types.VSphereVirtualMachine) TemplateQuery { - // Change 20.04 to 2004 so that it matches version in OSImage - distroVersion := strings.ReplaceAll(vm.DistroVersion, ".", "") - query := TemplateQuery{ - OVAVersion: vm.OVAVersion, - OSInfo: v1alpha3.OSInfo{ - Arch: vm.DistroArch, - Name: vm.DistroName, - Version: distroVersion, - }, - } - return query -} - -func buildUsefulErrorMessage(queries map[TemplateQuery]struct{}, nonTemplateVMs map[TemplateQuery][]string) string { - var noMatches []string - for unfulfilledQuery := range queries { - // No matching templates found for these queries. Time to build a useful error message for these. - var errMsg string - if len(nonTemplateVMs[unfulfilledQuery]) > 0 { - errMsg = fmt.Sprintf("unable to find VM Template associated with OVA Version %s, but found these VM(s) [%s] that can be used once converted to a VM Template", unfulfilledQuery.OVAVersion, strings.Join(nonTemplateVMs[unfulfilledQuery], ",")) - } else { - errMsg = fmt.Sprintf("unable to find VM Template associated with OVA Version %s. Please upload at least one VM Template to continue", unfulfilledQuery.OVAVersion) - } - noMatches = append(noMatches, errMsg) - } - usefulErrorMessage := strings.Join(noMatches, "; ") - return usefulErrorMessage -} diff --git a/tkg/vsphere-template-resolver/templateresolver/resolver_impl_test.go b/tkg/vsphere-template-resolver/templateresolver/resolver_impl_test.go deleted file mode 100644 index c06ad5f0c2..0000000000 --- a/tkg/vsphere-template-resolver/templateresolver/resolver_impl_test.go +++ /dev/null @@ -1,427 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package templateresolver - -import ( - "context" - "errors" - "fmt" - "testing" - - "github.com/go-logr/logr" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/vmware/govmomi/simulator" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - "github.com/vmware-tanzu/tanzu-framework/tkg/fakes" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" -) - -func TestResolve(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "vshpere template resolver test") -} - -var _ = Describe("Resolver", func() { - var ( - resolver TemplateResolver - ctx context.Context - vSphereContext *VSphereContext - vcClient *fakes.VCClient - dcMOIDMock string - dcInContext string - ) - Context("Resolve()", func() { - var ( - query Query - expectedOvaTemplateResult OVATemplateResult - ) - - BeforeEach(func() { - ctx = context.Background() - vcClient = &fakes.VCClient{} - dcMOIDMock = "foo" - vcClient.FindDataCenterReturns(dcMOIDMock, nil) - vcClient.GetVirtualMachineImagesReturns([]*types.VSphereVirtualMachine{ - { - OVAVersion: "fooOva", - Name: "fooTemplateName", - Moid: "fooTemplateMOID", - DistroName: "fooName", - DistroVersion: "fooVersion", - DistroArch: "fooArch", - IsTemplate: true, - }, - { - // This is the same OVA and OSInfo as one above, but with different MOID - // Useful to test scenario where this VM should not be used because the query has already been fulfilled with the previous VM. - OVAVersion: "fooOva", - Name: "fooTemplateName", - Moid: "fooTemplateMOID-duplicate", - DistroName: "fooName", - DistroVersion: "fooVersion", - DistroArch: "fooArch", - IsTemplate: true, - }, - { - OVAVersion: "barOva", - Name: "barTemplateName", - Moid: "barTemplateMOID", - DistroName: "barName", - DistroVersion: "barVersion", - DistroArch: "barArch", - IsTemplate: true, - }, - { - // This is a non-template VM - OVAVersion: "bazOva", - Name: "bazTemplateName", - Moid: "bazTemplateMOID", - DistroName: "bazName", - DistroVersion: "bazVersion", - DistroArch: "bazArch", - IsTemplate: false, - }, - { - // This is a non-template VM - OVAVersion: "quxOva", - Name: "quxTemplateName", - Moid: "quxTemplateMOID", - DistroName: "quxName", - DistroVersion: "quxVersion", - DistroArch: "quxArch", - IsTemplate: false, - }, - { - // Same as above quxOva, but this one is a template VM. - // Useful for testing if useful error message is collected only when there are no matching template VMs. - // In this case, although the above one is not a template VM, this one is, so no error should be produced. - OVAVersion: "quxOva", - Name: "quxTemplateName", - Moid: "quxTemplateMOID", - DistroName: "quxName", - DistroVersion: "quxVersion", - DistroArch: "quxArch", - IsTemplate: true, - }, - }, nil) - - resolver = New(logr.Discard()) - - query = Query{} - dcInContext = "vc-datacenter" - vSphereContext = &VSphereContext{ - DataCenter: dcInContext, - } - }) - When("query is empty", func() { - It("should return an empty result.", func() { - result := resolver.Resolve(ctx, vSphereContext, query, vcClient) - Expect(result.OVATemplates).To(BeNil()) - Expect(result.UsefulErrorMessage).To(BeEmpty()) - }) - }) - When("client calls are successful and", func() { - When("only control plane query has exactly one ova defined", func() { - BeforeEach(func() { - cpQuery := TemplateQuery{ - OVAVersion: "fooOva", - OSInfo: v1alpha3.OSInfo{ - Type: "", - Name: "fooName", - Version: "fooVersion", - Arch: "fooArch", - }, - } - query.OVATemplateQueries = map[TemplateQuery]struct{}{ - cpQuery: {}, - } - expectedOvaTemplateResult = OVATemplateResult{ - cpQuery: &TemplateResult{ - TemplatePath: "fooTemplateName", - TemplateMOID: "fooTemplateMOID", - }, - } - }) - It("should resolve the query and return only a filled controlPlane result.", func() { - result := resolver.Resolve(ctx, vSphereContext, query, vcClient) - Expect(result.OVATemplates).To(Not(BeNil())) - Expect(result.OVATemplates).To(Equal(expectedOvaTemplateResult)) - }) - }) - When("only MD query has exactly one ova defined", func() { - BeforeEach(func() { - templateQuery := TemplateQuery{ - OVAVersion: "fooOva", - OSInfo: v1alpha3.OSInfo{ - Type: "", - Name: "fooName", - Version: "fooVersion", - Arch: "fooArch", - }, - } - query.OVATemplateQueries = map[TemplateQuery]struct{}{ - templateQuery: {}, - } - - expectedOvaTemplateResult = OVATemplateResult{ - templateQuery: &TemplateResult{ - TemplatePath: "fooTemplateName", - TemplateMOID: "fooTemplateMOID", - }, - } - }) - It("should resolve the query and return only a filled machineDeployments result.", func() { - result := resolver.Resolve(ctx, vSphereContext, query, vcClient) - Expect(result.OVATemplates).To(Equal(expectedOvaTemplateResult)) - }) - }) - When("both CP and MD query have OVAs defined", func() { - var ( - expectedCP OVATemplateResult - ) - BeforeEach(func() { - cpQuery1 := TemplateQuery{ - OVAVersion: "fooOva", - OSInfo: v1alpha3.OSInfo{ - Type: "", - Name: "fooName", - Version: "fooVersion", - Arch: "fooArch", - }, - } - cpQuery2 := TemplateQuery{ - OVAVersion: "barOva", - OSInfo: v1alpha3.OSInfo{ - Type: "", - Name: "barName", - Version: "barVersion", - Arch: "barArch", - }, - } - query.OVATemplateQueries = map[TemplateQuery]struct{}{ - cpQuery1: {}, - cpQuery2: {}, - } - expectedCP = OVATemplateResult{ - cpQuery1: &TemplateResult{ - TemplatePath: "fooTemplateName", - TemplateMOID: "fooTemplateMOID", - }, - cpQuery2: &TemplateResult{ - TemplatePath: "barTemplateName", - TemplateMOID: "barTemplateMOID", - }, - } - }) - It("should resolve the query and add template path and return the correct CP and MD results.", func() { - result := resolver.Resolve(ctx, vSphereContext, query, vcClient) - Expect(result.OVATemplates).To(Equal(expectedCP)) - }) - }) - When("all matching vms found are regular VM, not template VM", func() { - BeforeEach(func() { - query.OVATemplateQueries = map[TemplateQuery]struct{}{ - { - - OVAVersion: "bazOva", - OSInfo: v1alpha3.OSInfo{ - Type: "", - Name: "bazName", - Version: "bazVersion", - Arch: "bazArch", - }, - }: {}, - { - OVAVersion: "quxOva", - OSInfo: v1alpha3.OSInfo{ - Type: "", - Name: "quxName", - Version: "quxVersion", - Arch: "quxArch", - }, - }: {}, - } - }) - It("should fail to resolve the query as no templates found, and return a useful error message", func() { - result := resolver.Resolve(ctx, vSphereContext, query, vcClient) - Expect(result.OVATemplates).To(BeNil()) - Expect(result.UsefulErrorMessage).ToNot(BeNil()) - Expect(result.UsefulErrorMessage).To(Equal( - "unable to find VM Template associated with OVA Version bazOva, but found these VM(s) [bazTemplateName] that can be used once converted to a VM Template", - )) - }) - }) - When("no matching VM found", func() { - BeforeEach(func() { - query.OVATemplateQueries = map[TemplateQuery]struct{}{ - { - OVAVersion: "thisOvaDoesNotExist", - OSInfo: v1alpha3.OSInfo{ - Type: "", - Name: "irrelevant", - Version: "irrelevant", - Arch: "irrelevant", - }, - }: {}, - } - }) - It("should fail to resolve the query and return a useful error message", func() { - result := resolver.Resolve(ctx, vSphereContext, query, vcClient) - Expect(result.OVATemplates).To(BeNil()) - Expect(result.UsefulErrorMessage).ToNot(BeNil()) - Expect(result.UsefulErrorMessage).To(Equal( - "unable to find VM Template associated with OVA Version thisOvaDoesNotExist. Please upload at least one VM Template to continue")) - }) - }) - When("vm with matching ova found, but osinfo is different", func() { - BeforeEach(func() { - query.OVATemplateQueries = map[TemplateQuery]struct{}{ - { - OVAVersion: "fooOva", - OSInfo: v1alpha3.OSInfo{ - Type: "", - Name: "bazName", // Name is different. - Version: "fooVersion", - Arch: "fooArch", - }, - }: {}, - } - }) - It("should fail to resolve the query and return a useful error message", func() { - result := resolver.Resolve(ctx, vSphereContext, query, vcClient) - Expect(result.OVATemplates).To(BeNil()) - Expect(result.UsefulErrorMessage).ToNot(BeNil()) - Expect(result.UsefulErrorMessage).To(Equal( - "unable to find VM Template associated with OVA Version fooOva. Please upload at least one VM Template to continue")) - }) - }) - AfterEach(func() { - // Call counts check - Expect(vcClient.FindDataCenterCallCount()).To(Equal(1)) - ctx, dc := vcClient.FindDataCenterArgsForCall(0) - Expect(ctx).NotTo(BeNil()) - Expect(dc).To(Equal(dcInContext)) - - Expect(vcClient.GetVirtualMachineImagesCallCount()).To(Equal(1)) - ctx, dcMOID := vcClient.GetVirtualMachineImagesArgsForCall(0) - Expect(ctx).NotTo(BeNil()) - Expect(dcMOID).To(Equal(dcMOIDMock)) - }) - }) - When("datacenter call returns an error", func() { - BeforeEach(func() { - vcClient.FindDataCenterReturns("", errors.New("some error")) - query.OVATemplateQueries = map[TemplateQuery]struct{}{ - { // Atleast one query is required to get to the VC client call. - OVAVersion: "fooOva", - OSInfo: v1alpha3.OSInfo{ - Type: "", - Name: "fooName", - Version: "fooVersion", - Arch: "fooArch", - }, - }: {}, - } - }) - It("should return a useful error message", func() { - result := resolver.Resolve(ctx, vSphereContext, query, vcClient) - Expect(result.UsefulErrorMessage).To(Equal("failed to get the datacenter MOID: some error")) - Expect(result.OVATemplates).To(BeNil()) - }) - }) - When("VM images call returns an error", func() { - BeforeEach(func() { - vcClient.GetVirtualMachineImagesReturns(nil, errors.New("some error")) - // Atleast one query is required to get to the VC client call. - query.OVATemplateQueries = map[TemplateQuery]struct{}{ - { - OVAVersion: "fooOva", - OSInfo: v1alpha3.OSInfo{ - Type: "", - Name: "fooName", - Version: "fooVersion", - Arch: "fooArch", - }, - }: {}, - } - }) - It("should return a useful error message", func() { - result := resolver.Resolve(ctx, vSphereContext, query, vcClient) - Expect(result.UsefulErrorMessage).To(Equal("failed to get K8s VM templates: some error")) - Expect(result.OVATemplates).To(BeNil()) - }) - }) - }) - Context("GetVsphereEndpoint()", func() { - When("Host parsing fails", func() { - BeforeEach(func() { - vSphereContext = &VSphereContext{ - Server: "%", - } - }) - It("should return an error", func() { - client, err := resolver.GetVSphereEndpoint(vSphereContext) - Expect(client).To(BeNil()) - Expect(err).ToNot(BeNil()) - Expect(err.Error()).To(Equal("failed to parse vc host: parse \"https://%\": invalid URL escape \"%\"")) - }) - }) - When("using a simulater server", func() { - var ( - err error - server *simulator.Server - ) - BeforeEach(func() { - model := simulator.VPX() - model.Datastore = 5 - model.Datacenter = 3 - model.Cluster = 3 - model.Machine = 1 - model.Portgroup = 2 - model.Pool = 2 - model.Folder = 2 - - err = model.Create() - Expect(err).ToNot(HaveOccurred()) - err = nil - server = model.Service.NewServer() - Expect(server).ToNot(BeNil()) - }) - When("NewClient() call returns an error", func() { - BeforeEach(func() { - vSphereContext = &VSphereContext{ - Server: "foo", - } - }) - It("should return an error", func() { - client, err := resolver.GetVSphereEndpoint(vSphereContext) - Expect(client).To(BeNil()) - Expect(err).ToNot(BeNil()) - Expect(err.Error()).To(ContainSubstring("failed to create vc client")) - }) - }) - When("login fails", func() { - BeforeEach(func() { - vSphereContext = &VSphereContext{ - Server: server.URL.String(), - Username: "foo", - Password: "bar", - TLSThumbprint: "", - InsecureSkipVerify: true, - } - }) - It("should return a a login error", func() { - client, err := resolver.GetVSphereEndpoint(vSphereContext) - fmt.Println(err.Error()) - Expect(client).To(BeNil()) - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(Equal("failed to login to vSphere: cannot login to vc: ServerFaultCode: Login failure")) - }) - }) - }) - - }) -}) diff --git a/tkg/vsphere-template-resolver/templateresolver/types.go b/tkg/vsphere-template-resolver/templateresolver/types.go deleted file mode 100644 index 626badb659..0000000000 --- a/tkg/vsphere-template-resolver/templateresolver/types.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package templateresolver provides vsphere template resolution. -package templateresolver - -import ( - "fmt" - - runv1 "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" -) - -type VSphereContext struct { - Server string - Username string - Password string - DataCenter string - TLSThumbprint string - InsecureSkipVerify bool -} - -// Query sets constraints for resolution of vSphere OVA templates. Its structure reflects Cluster API cluster topology. -type Query struct { - // OVATemplateQueries carries the set of OVA template queries. - OVATemplateQueries map[TemplateQuery]struct{} -} - -func (q Query) String() string { - return fmt.Sprintf("{ovaTemplateQueries: %s}", q.OVATemplateQueries) -} - -// TemplateQuery sets constraints for resolution of vSphere OVA templates for the control plane or a machine deployment of a cluster. -type TemplateQuery struct { - // OVAVersion is a version of the template - OVAVersion string - // OSInfo is the OS information the template should satisfy - OSInfo runv1.OSInfo -} - -const strNil = "nil" - -func (q *TemplateQuery) String() string { - if q == nil { - return strNil - } - return fmt.Sprintf("{OVA version: '%s', OSInfo: '%s'}", q.OVAVersion, q.OSInfo) -} - -// Result carries the results of vSphere OVA template resolution. Its structure reflects Cluster API cluster topology. -type Result struct { - // OVATemplates carries the mapping from TemplateQuery to TemplateResult. - // It is set to nil if resolving the control plane part was skipped. - // The key is the OVA version. - OVATemplates OVATemplateResult - - // UsefulErrorMessage carries the errors resulted in template resolution - UsefulErrorMessage string -} - -func (r Result) String() string { - return fmt.Sprintf("{ovaTemplates: %s, usefulErrorMessage:'%s'}", r.OVATemplates, r.UsefulErrorMessage) -} - -// // KubernetesTemplateResult carries the template resolution result for all the OVAs for that kubernetes version. -// type KubernetesTemplateResult struct { -// // OVATemplateResults carriest the tempplate query results for each OVA in a kubernetes release. -// // The key is the OVA version. -// OVATemplateResults map[string]*OVATemplateResult -// } - -// OVATemplateResult carries the results of OVA template resolution for the control plane or a machine deployment of a cluster. -type OVATemplateResult map[TemplateQuery]*TemplateResult - -func (r *OVATemplateResult) String() string { - if r == nil { - return strNil - } - - return fmt.Sprintf("{OVATemplateResult: '%v'}", *r) -} - -// TemplateResult carries the resolved template path and MOID. -type TemplateResult struct { - // TemplatePath is the path of the template. If empty, then no template satisfied the query. - TemplatePath string - // TemplateMOID is the MOID of the template. If empty, then no template satisfied the query. - TemplateMOID string -} - -func (r *TemplateResult) String() string { - if r == nil { - return strNil - } - return fmt.Sprintf("{TemplatePath: '%s', TemplateMOID: '%s'}", r.TemplatePath, r.TemplateMOID) -} diff --git a/tkg/vsphere-template-resolver/templateresolver/types_test.go b/tkg/vsphere-template-resolver/templateresolver/types_test.go deleted file mode 100644 index 40b2a0b5ea..0000000000 --- a/tkg/vsphere-template-resolver/templateresolver/types_test.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2022 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package templateresolver - -import ( - . "github.com/onsi/ginkgo" - - "github.com/vmware-tanzu/tanzu-framework/apis/run/v1alpha3" - - . "github.com/onsi/gomega" -) - -var _ = Describe("Test all types", func() { - Context("Result.String()", func() { - When("result type contains information", func() { - It("should print all data in Result", func() { - t := TemplateQuery{ - OVAVersion: "ovaVersion", - OSInfo: v1alpha3.OSInfo{ - Name: "osName", - }, - } - r := Result{ - OVATemplates: OVATemplateResult{ - t: &TemplateResult{ - TemplatePath: "path", - TemplateMOID: "moid", - }, - }, - UsefulErrorMessage: "usefulMessage", - } - Expect(r.String()).To(ContainSubstring("{ovaTemplates: map[{ovaVersion { osName }}:{TemplatePath: 'path', TemplateMOID: 'moid'}], usefulErrorMessage:'usefulMessage'}")) - }) - }) - }) - Context("Query.String()", func() { - When("query is not empty", func() { - It("should print all data in Query", func() { - q := Query{ - OVATemplateQueries: map[TemplateQuery]struct{}{ - {OVAVersion: "cpQuery"}: {}, - }, - } - Expect(q.String()).To(ContainSubstring("{ovaTemplateQueries: map[{cpQuery { }}:{}]}")) - }) - }) - }) - Context("TemplateQuery.String()", func() { - When("TemplateQuery is not empty", func() { - It("should print all data in TemplateQuery", func() { - tq := TemplateQuery{ - OVAVersion: "ovaVersion", - OSInfo: v1alpha3.OSInfo{ - Type: "type", - Name: "name", - Version: "version", - Arch: "arch", - }, - } - Expect(tq.String()).To(ContainSubstring("{OVA version: 'ovaVersion', OSInfo: '{type name version arch}'}")) - }) - }) - }) -}) diff --git a/tkg/web/.gitignore b/tkg/web/.gitignore deleted file mode 100644 index 898c6d6d10..0000000000 --- a/tkg/web/.gitignore +++ /dev/null @@ -1,54 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -/dist -/tmp -/out-tsc -# Only exists if Bazel was run -/bazel-out - -# dependencies -node_modules/ -reports/ - -# profiling files -chrome-profiler-events*.json -speed-measure-plugin*.json - -# IDEs and editors -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -.history/* - -# misc -/.sass-cache -/connect.lock -/coverage -/libpeerconnection.log -npm-debug.log -yarn-error.log -testem.log -/typings - -# System Files -.DS_Store -Thumbs.db -/src/app/swagger/ -/node-server/user_data/logs/access.log -/node-server/user_data/logs/older/ -/node-server/node_modules/ - -.whistle -.env \ No newline at end of file diff --git a/tkg/web/Dockerfile b/tkg/web/Dockerfile deleted file mode 100644 index 4908d806d7..0000000000 --- a/tkg/web/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2022 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Build from publicly reachable source by default, but allow people to re-build images on -# top of their own trusted images. -ARG BUILDER_BASE_IMAGE=node:16 - -# Build the manager binary -FROM $BUILDER_BASE_IMAGE as builder - -WORKDIR /workspace - -COPY api/spec.yaml /workspace/api/spec.yaml -COPY angular.json package.json package-lock.json tsconfig.app.json tsconfig.json tsconfig.spec.json tslint.json /workspace/ -COPY src /workspace/src/ - -RUN npm ci --legacy-peer-deps -RUN npm run build:prod diff --git a/tkg/web/README.md b/tkg/web/README.md deleted file mode 100644 index 21389a6609..0000000000 --- a/tkg/web/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# TkgKickstartUI - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.3.20. - -## Prerequisites for Building and Running UI on Local Machine - -Node version 10.x.x - -- `node --version` to check which version you have - -Node version can be set and managed by using NVM (Node Version Manager): - -- `brew install nvm` -- `nvm install 10` (or `nvm use 10` to temporarily set node version) - -To build the UI locally via Make, run `make ui-build` which will install node modules and compile UI assets into 'dist' folder. - -If an alternate NPM registry is required to obtain the node dependencies, it should be configured either - -- prior to running the make target, with `npm config set registry `, or -- providing the URL in the CUSTOM_NPM_REGISTRY environment variable. - -If running UI locally without executing Makefile script, execute `npm install` from tkg-cli/web folder prior to starting or compiling UI. - -## UI served on local Angular CLI server - -Prerequisite - node modules have been install via `make ui-build` or `npm install` in '/tkg-cli/web' directory - -Run `npm run start` from /tkg-cli/web folder. Navigate to `http://localhost:4200/` in a browser. The app will automatically reload if you change any of the source files. - -- See `Running UI Mock API server` to make mock API endpoints available when developing on local machine. - -## Running UI Mock API server - -Run `npm run start` from /tkg-cli/web/node-server folder. Node.js will serve mock API endpoints on `http://localhost:8008`. - -## Running CLI Locally and Launching UI - -See Prerequisites for Building and Running UI on Local Machine - -To serve the tkg ui, under tkg-cli repo, run: make tkg -Then run `tkg init --infrastructure= --ui`, the command just starts the UI server and it will not trigger any tkg init steps. - -The ui will be served at [http://127.0.0.1:8080](http://127.0.0.1:8080) - -## Build - -Prerequisite - node modules have been install via `make ui-build` or `npm install` in '/tkg-cli/web' directory - -Run `npm run build:prod` to build the project. The build artifacts will be stored in the '/dist' directory. - -## Running unit tests - -Run `npm run test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Pre-commit testing - -Run `make pull-ci` prior to creating a pull request to run all github CI tests (UI and Golang tests). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/tkg/web/angular.json b/tkg/web/angular.json deleted file mode 100644 index 3663c5c8be..0000000000 --- a/tkg/web/angular.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "tkg-kickstart-ui": { - "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "style": "scss" - } - }, - "root": "", - "sourceRoot": "src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "dist/tkg-kickstart-ui", - "index": "src/index.html", - "main": "src/main.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.app.json", - "aot": true, - "allowedCommonJsDependencies": [ - "@ctrl/ngx-codemirror", - "is-ip", - "sort-paths", - "xregexp" - ], - "assets": [ - "src/favicon.ico", - "src/assets", - { - "glob": "clr-ui-dark.min.css", - "input": "node_modules/@clr/ui", - "output": "" - }, - { - "glob": "clr-ui.min.css", - "input": "node_modules/@clr/ui", - "output": "" - } - ], - "styles": [ - "node_modules/@clr/icons/clr-icons.min.css", - "src/styles.scss", - "node_modules/codemirror/lib/codemirror.css", - "node_modules/codemirror/theme/blackboard.css" - ], - "scripts": [ - "node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js", - "node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js", - "node_modules/@clr/icons/clr-icons.min.js", - "node_modules/sort-paths/browser/sort-paths.js", - "node_modules/elasticlunr/elasticlunr.min.js" - ] - }, - "configurations": { - "production": { - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, - "budgets": [ - { - "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "6kb", - "maximumError": "10kb" - } - ] - }, - "development": { - "buildOptimizer": false, - "optimization": false, - "vendorChunk": true, - "extractLicenses": false, - "sourceMap": true, - "namedChunks": true - } - } - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "tkg-kickstart-ui:build", - "proxyConfig": "src/proxy.conf.json" - }, - "configurations": { - "production": { - "browserTarget": "tkg-kickstart-ui:build:production" - }, - "development": { - "browserTarget": "tkg-kickstart-ui:build:development" - } - }, - "defaultConfiguration": "development" - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "tkg-kickstart-ui:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "src/test.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.spec.json", - "karmaConfig": "karma.conf.js", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "src/styles.scss" - ], - "scripts": [ - "node_modules/sort-paths/browser/sort-paths.js", - "node_modules/elasticlunr/elasticlunr.min.js" - ], - "codeCoverageExclude": [ - "src/app/testing/**", - "src/app/swagger/**" - ] - } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "tsconfig.app.json", - "tsconfig.spec.json", - "e2e/tsconfig.json" - ], - "exclude": [ - "**/node_modules/**" - ] - } - }, - "e2e": { - "builder": "@angular-devkit/build-angular:protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "tkg-kickstart-ui:serve" - }, - "configurations": { - "production": { - "devServerTarget": "tkg-kickstart-ui:serve:production" - } - } - } - } - } - }, - "defaultProject": "tkg-kickstart-ui", - "cli": { - "analytics": false - } -} diff --git a/tkg/web/api/spec.yaml b/tkg/web/api/spec.yaml deleted file mode 100644 index 661f053472..0000000000 --- a/tkg/web/api/spec.yaml +++ /dev/null @@ -1,2438 +0,0 @@ -swagger: "2.0" -info: - title: "Tanzu Kubernetes Grid Setup API" - description: "Tanzu Kubernetes Grid Setup API." - version: 0.0.0 -basePath: / -produces: - - application/json -consumes: - - application/json -schemes: - - http - - https - -paths: - /: - get: - tags: ["ui"] - summary: "Get the kickstart UI" - operationId: getUI - responses: - 200: - description: "Successful operation" - schema: - type: file - 400: - description: "Bad request" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /{filename}: - get: - tags: ["ui"] - summary: "Get the kickstart UI static resource file" - operationId: getUIFile - parameters: - - in: path - name: filename - type: string - description: "UI file name" - required: true - responses: - 200: - description: "Successful operation" - schema: - type: file - 400: - description: "Bad request" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/features: - get: - tags: ["features"] - summary: "Retrieve list of features" - operationId: getFeatureFlags - responses: - 200: - description: Successful retrieval of feature flags - schema: - $ref: "#/definitions/Features" - 400: - description: "Bad Request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/edition: - get: - tags: ["edition"] - summary: "Retrieve Tanzu edition" - operationId: getTanzuEdition - responses: - 200: - description: Successful retrieval of tanzu edition - schema: - type: string - 400: - description: "Bad Request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/avi: - post: - tags: ["avi"] - summary: "Validate Avi controller credentials" - operationId: verifyAccount - parameters: - - name: credentials - in: body - description: "Avi controller credentials" - schema: - $ref: "#/definitions/AviControllerParams" - responses: - 201: - description: Verified AVI credentials successfully - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: "Incorrect credentials" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/ldap/connect: - post: - tags: ["ldap"] - summary: "Validate LDAP connection" - operationId: verifyLdapConnect - parameters: - - name: credentials - in: body - description: "LDAP configuration" - schema: - $ref: "#/definitions/LdapParams" - responses: - 200: - description: Verified LDAP credentials successfully - schema: - $ref: '#/definitions/LdapTestResult' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: "Incorrect credentials" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/ldap/bind: - post: - tags: ["ldap"] - summary: "Validate LDAP bind or authentication" - operationId: verifyLdapBind - responses: - 200: - description: Verified LDAP credentials successfully - schema: - $ref: '#/definitions/LdapTestResult' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: "Incorrect credentials" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - /api/ldap/users/search: - post: - tags: ["ldap"] - summary: "Validate LDAP User Search configuration" - operationId: verifyLdapUserSearch - responses: - 200: - description: Verified LDAP credentials successfully - schema: - $ref: '#/definitions/LdapTestResult' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: "Incorrect credentials" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - /api/ldap/groups/search: - post: - tags: ["ldap"] - summary: "Validate LDAP Group Search configuration" - operationId: verifyLdapGroupSearch - responses: - 200: - description: Verified LDAP credentials successfully - schema: - $ref: '#/definitions/LdapTestResult' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: "Incorrect credentials" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/ldap/disconnect: - post: - tags: ["ldap"] - summary: "Validate if the LDAP connection can be closed" - operationId: verifyLdapCloseConnection - responses: - 201: - description: Verified LDAP credentials successfully - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: "Incorrect credentials" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/avi/clouds: - get: - tags: ["avi"] - summary: "Retrieve Avi load balancer clouds" - operationId: getAviClouds - responses: - 200: - description: Successful retrieval of Avi load balancer clouds - schema: - type: array - items: - $ref: '#/definitions/AviCloud' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/avi/serviceenginegroups: - get: - tags: ["avi"] - summary: "Retrieve Avi load balancer service engine groups" - operationId: getAviServiceEngineGroups - responses: - 200: - description: Successful retrieval of Avi load balancer service engine groups - schema: - type: array - items: - $ref: '#/definitions/AviServiceEngineGroup' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/avi/vipnetworks: - get: - tags: ["avi"] - summary: "Retrieve all Avi networks" - operationId: getAviVipNetworks - responses: - 200: - description: Successful retrieval of Avi load balancer service engine groups - schema: - type: array - items: - $ref: '#/definitions/AviVipNetwork' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers: - get: - tags: ["provider"] - summary: "Get infrastructure provider given by the user via cli" - operationId: getProvider - responses: - 200: - description: "Successful operation" - schema: - $ref: "#/definitions/providerInfo" - 400: - description: "Bad request" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere/thumbprint: - get: - tags: ["vsphere"] - summary: "Get vSphere thumbprint" - operationId: getVsphereThumbprint - parameters: - - name: host - in: query - description: "vSphere host" - type: string - required: true - responses: - 200: - description: Successful retrieval of vSphere thumbprint - schema: - $ref: '#/definitions/VSphereThumbprint' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: "Incorrect credentials" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere: - post: - tags: ["vsphere"] - summary: "Validate and set vSphere credentials" - operationId: setVSphereEndpoint - parameters: - - name: credentials - in: body - description: "vSphere credentials" - schema: - $ref: "#/definitions/VSphereCredentials" - responses: - 201: - description: Connection successful - schema: - $ref: '#/definitions/vsphereInfo' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: "Incorrect credentials" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - - /api/providers/vsphere/datacenters: - get: - tags: ["vsphere"] - summary: "Retrieve vSphere datacenters" - operationId: getVSphereDatacenters - responses: - 200: - description: Successful retrieval of vSphere datacenters - schema: - type: array - items: - $ref: '#/definitions/VSphereDatacenter' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere/datastores: - get: - tags: ["vsphere"] - summary: "Retrieve vSphere datastores" - operationId: getVSphereDatastores - parameters: - - name: dc - in: query - required: true - type: string - description: "datacenter managed object Id, e.g. datacenter-2" - responses: - 200: - description: Successful retrieval of vSphere datastores - schema: - type: array - items: - $ref: '#/definitions/VSphereDatastore' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere/folders: - get: - tags: ["vsphere"] - summary: "Retrieve vSphere folders" - operationId: getVSphereFolders - parameters: - - name: dc - in: query - required: true - type: string - description: "datacenter managed object Id, e.g. datacenter-2" - responses: - 200: - description: Successful retrieval of vSphere folders - schema: - type: array - items: - $ref: '#/definitions/VSphereFolder' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere/compute: - get: - tags: ["vsphere"] - summary: "Retrieve vSphere compute resources" - operationId: getVSphereComputeResources - parameters: - - name: dc - in: query - required: true - type: string - description: "datacenter managed object Id, e.g. datacenter-2" - responses: - 200: - description: Successful retrieval of vSphere folders - schema: - type: array - items: - $ref: '#/definitions/VSphereManagementObject' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - - /api/providers/vsphere/resourcepools: - get: - tags: ["vsphere"] - summary: "Retrieve vSphere resource pools" - operationId: getVSphereResourcePools - parameters: - - name: dc - in: query - required: true - type: string - description: "datacenter managed object Id, e.g. datacenter-2" - responses: - 200: - description: Successful retrieval of vSphere resourcePools - schema: - type: array - items: - $ref: '#/definitions/VSphereResourcePool' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere/networks: - get: - tags: ["vsphere"] - summary: "Retrieve networks associated with the datacenter in vSphere" - operationId: getVSphereNetworks - parameters: - - name: dc - in: query - required: true - type: string - description: "datacenter managed object Id, e.g. datacenter-2" - responses: - 200: - description: Successful retrieval of vSphere networks - schema: - description: a list of vpshere networks - type: array - items: - $ref: '#/definitions/VSphereNetwork' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere/nodetypes: - get: - tags: ["vsphere"] - summary: "Retrieve vSphere supported kubernetes control plane node types" - operationId: getVSphereNodeTypes - responses: - 200: - description: Successful retrieval of node types supported by vSphere - schema: - type: array - items: - $ref: '#/definitions/NodeType' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere/osimages: - get: - tags: ["vsphere"] - summary: "Retrieve vSphere supported node os images" - operationId: getVSphereOSImages - parameters: - - name: dc - in: query - required: true - type: string - description: "datacenter managed object Id, e.g. datacenter-2" - responses: - 200: - description: Successful retrieval of node images supported by vSphere - schema: - type: array - items: - $ref: '#/definitions/VSphereVirtualMachine' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere/config/export: - post: - tags: ["vsphere"] - summary: "Generate TKG configuration file for vSphere" - operationId: exportTKGConfigForVsphere - parameters: - - in: body - name: params - description: params to generate tkg configuration for vsphere - required: true - schema: - $ref: '#/definitions/VsphereRegionalClusterParams' - responses: - 200: - description: Generated TKG configuration successfully - schema: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere/tkgconfig: - post: - tags: ["vsphere"] - summary: "Apply changes to TKG configuration file for vSphere" - operationId: applyTKGConfigForVsphere - parameters: - - in: body - name: params - description: params to apply changes to tkg configuration for vsphere - required: true - schema: - $ref: '#/definitions/VsphereRegionalClusterParams' - responses: - 200: - description: apply changes to TKG configuration file successfully - schema: - $ref: "#/definitions/ConfigFileInfo" - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere/config/import: - post: - tags: ["vsphere"] - summary: "Generate TKG configuration object for vSphere" - operationId: importTKGConfigForVsphere - parameters: - - in: body - name: params - description: config file from which to generate tkg configuration for vsphere - required: true - schema: - $ref: '#/definitions/ConfigFile' - responses: - 200: - description: Generated TKG configuration successfully - schema: - $ref: '#/definitions/VsphereRegionalClusterParams' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/vsphere/create: - post: - tags: ["vsphere"] - summary: "Create vSphere regional cluster" - operationId: createVSphereRegionalCluster - parameters: - - in: body - name: params - description: params to create a regional cluster - required: true - schema: - $ref: '#/definitions/VsphereRegionalClusterParams' - responses: - 200: - description: Creating regional cluster started successfully - schema: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - - /api/providers/aws: - post: - tags: ["aws"] - summary: "Validate and set aws credentials" - operationId: setAWSEndpoint - parameters: - - name: accountParams - in: body - description: "AWS account parameters" - schema: - $ref: "#/definitions/AWSAccountParams" - responses: - 201: - description: Connection successful - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: "Incorrect credentials" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/aws/vpc: - get: - tags: ["aws"] - summary: "Retrieve AWS VPCs" - operationId: getVPCs - responses: - 200: - description: Successful retrieval of AWS VPCs - schema: - type: array - items: - $ref: "#/definitions/vpc" - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/aws/nodetypes: - get: - tags: ["aws"] - summary: "Retrieve AWS supported node types" - operationId: getAWSNodeTypes - parameters: - - name: az - in: query - required: false - type: string - description: "AWS availability zone, e.g. us-west-2" - responses: - 200: - description: Successful retrieval of AWS node types - schema: - type: array - items: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/aws/regions: - get: - tags: ["aws"] - summary: "Retrieve AWS regions" - operationId: getAWSRegions - responses: - 200: - description: Successful retrieval of AWS regions - schema: - type: array - items: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/aws/osimages: - get: - tags: ["aws"] - summary: "Retrieve AWS supported os images" - operationId: getAWSOSImages - parameters: - - name: region - in: query - required: true - type: string - description: "AWS region, e.g. us-west-2" - responses: - 200: - description: Successful retrieval of AWS supported os images - schema: - type: array - items: - $ref: '#/definitions/AWSVirtualMachine' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/aws/profiles: - get: - tags: ["aws"] - summary: "Retrieve AWS credential profiles" - operationId: getAWSCredentialProfiles - responses: - 200: - description: Successful retrieval of AWS credentials profiles - schema: - type: array - items: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/aws/AvailabilityZones: - get: - tags: ["aws"] - summary: "Retrieve AWS availability zones of current region" - operationId: getAWSAvailabilityZones - responses: - 200: - description: Successful retrieval of AWS availability zones - schema: - type: array - items: - $ref: "#/definitions/AWSAvailabilityZone" - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/aws/subnets: - get: - tags: ["aws"] - summary: "Retrieve AWS Subnets info under a VPC" - operationId: getAWSSubnets - parameters: - - name: vpcId - in: query - required: true - type: string - description: "VPC Id" - responses: - 200: - description: Successful retrieval of AWS subnets - schema: - type: array - items: - $ref: "#/definitions/AWSSubnet" - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/aws/config/export: - post: - tags: ["aws"] - summary: Generate TKG configuration file for AWS" - operationId: exportTKGConfigForAWS - parameters: - - in: body - name: params - description: parameters to generate TKG configuration file for AWS - required: true - schema: - $ref: '#/definitions/AWSRegionalClusterParams' - responses: - 200: - description: Generated TKG configuration successfully - schema: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/aws/tkgconfig: - post: - tags: ["aws"] - summary: Apply the changes to TKG configuration file for AWS" - operationId: applyTKGConfigForAWS - parameters: - - in: body - name: params - description: parameters to apply changes to TKG configuration file for AWS - required: true - schema: - $ref: '#/definitions/AWSRegionalClusterParams' - responses: - 200: - description: Apply change to TKG configuration successfully - schema: - $ref: "#/definitions/ConfigFileInfo" - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/aws/create: - post: - tags: ["aws"] - summary: "Create AWS regional cluster" - operationId: createAWSRegionalCluster - parameters: - - in: body - name: params - description: parameters to create a regional cluster - required: true - schema: - $ref: '#/definitions/AWSRegionalClusterParams' - responses: - 200: - description: Creating regional cluster started successfully - schema: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/aws/config/import: - post: - tags: ["aws"] - summary: "Generate TKG configuration object for AWS" - operationId: importTKGConfigForAWS - parameters: - - in: body - name: params - description: config file from which to generate tkg configuration for aws - required: true - schema: - $ref: '#/definitions/ConfigFile' - responses: - 200: - description: Generated TKG configuration successfully - schema: - $ref: '#/definitions/AWSRegionalClusterParams' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/azure: - get: - tags: ["azure"] - summary: "Retrieve azure account params from environment variables" - operationId: getAzureEndpoint - responses: - 200: - description: Successful retrieval of Azure account parameters - schema: - $ref: "#/definitions/AzureAccountParams" - 400: - description: "Bad Request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - post: - tags: ["azure"] - summary: "Validate and set azure credentials" - operationId: setAzureEndpoint - parameters: - - name: accountParams - in: body - description: "Azure account parameters" - schema: - $ref: "#/definitions/AzureAccountParams" - responses: - 201: - description: "Connection successful" - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: "Incorrect credentials" - schema: - $ref: '#/definitions/Error' - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/azure/resourcegroups: - get: - tags: ["azure"] - summary: "Retrieve list of Azure resource groups for a subscription" - operationId: getAzureResourceGroups - parameters: - - name: location - in: query - required: true - type: string - description: "Azure region" - responses: - 200: - description: Successful retrieval of Azure resource groups - schema: - type: array - items: - $ref: "#/definitions/AzureResourceGroup" - 400: - description: "Bad Request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - post: - tags: ["azure"] - summary: "Create a new Azure resource group" - operationId: createAzureResourceGroup - parameters: - - in: body - name: params - description: parameters to create a new Azure resource group - required: true - schema: - $ref: '#/definitions/AzureResourceGroup' - responses: - 201: - description: Successfully created Azure resource group - schema: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - - /api/providers/azure/resourcegroups/{resourceGroupName}/vnets: - get: - tags: ["azure"] - summary: "Retrieve list of Azure virtual networks in a resource group" - operationId: getAzureVnets - parameters: - - name: resourceGroupName - in: path - required: true - type: string - description: "Name of the Azure resource group" - - name: location - in: query - required: true - type: string - description: "Azure region" - responses: - 200: - description: Successful retrieval of Azure virtual networks - schema: - type: array - items: - $ref: "#/definitions/AzureVirtualNetwork" - 400: - description: "Bad Request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - post: - tags: ["azure"] - summary: "Create a new Azure Virtual Network" - operationId: createAzureVirtualNetwork - parameters: - - name: resourceGroupName - in: path - required: true - type: string - description: "Name of the Azure resource group" - - in: body - name: params - description: parameters to create a new Azure Virtual network - required: true - schema: - $ref: '#/definitions/AzureVirtualNetwork' - responses: - 201: - description: Successfully created Azure Virtual network - schema: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/azure/osimages: - get: - tags: ["azure"] - summary: "Retrieve Azure supported os images" - operationId: getAzureOSImages - responses: - 200: - description: Successful retrieval of Azure supported os images - schema: - type: array - items: - $ref: '#/definitions/AzureVirtualMachine' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/azure/regions: - get: - tags: ["azure"] - summary: "Retrieve list of supported Azure regions" - operationId: getAzureRegions - responses: - 200: - description: Successful retrieval of Azure regions - schema: - type: array - items: - $ref: '#/definitions/AzureLocation' - 400: - description: "Bad Request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/azure/regions/{location}/instanceTypes: - get: - tags: ["azure"] - summary: "Retrieve list of supported Azure instance types for a region" - operationId: getAzureInstanceTypes - parameters: - - name: location - in: path - required: true - type: string - description: "Azure region name" - responses: - 200: - description: Successful retrieval of Azure instance Types - schema: - type: array - items: - $ref: '#/definitions/AzureInstanceType' - 400: - description: "Bad Request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/azure/config/export: - post: - tags: ["azure"] - summary: Generate TKG configuration file for Azure" - operationId: exportTKGConfigForAzure - parameters: - - in: body - name: params - description: parameters to generate TKG configuration file for Azure - required: true - schema: - $ref: '#/definitions/AzureRegionalClusterParams' - responses: - 200: - description: Generated TKG configuration successfully - schema: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/azure/tkgconfig: - post: - tags: ["azure"] - summary: Apply the changes to TKG configuration file for Azure" - operationId: applyTKGConfigForAzure - parameters: - - in: body - name: params - description: parameters to apply changes to TKG configuration file for Azure - required: true - schema: - $ref: '#/definitions/AzureRegionalClusterParams' - responses: - 200: - description: Apply change to TKG configuration successfully - schema: - $ref: "#/definitions/ConfigFileInfo" - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/azure/create: - post: - tags: ["azure"] - summary: "Create Azure regional cluster" - operationId: createAzureRegionalCluster - parameters: - - in: body - name: params - description: parameters to create a regional cluster - required: true - schema: - $ref: '#/definitions/AzureRegionalClusterParams' - responses: - 200: - description: Creating regional cluster started successfully - schema: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/azure/config/import: - post: - tags: ["azure"] - summary: "Generate TKG configuration object for azure" - operationId: importTKGConfigForAzure - parameters: - - in: body - name: params - description: config file from which to generate tkg configuration for azure - required: true - schema: - $ref: '#/definitions/ConfigFile' - responses: - 200: - description: Generated TKG configuration successfully - schema: - $ref: '#/definitions/AzureRegionalClusterParams' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/docker/daemon: - get: - tags: ["docker"] - summary: Check if docker deamon is available - operationId: checkIfDockerDaemonAvailable - responses: - 200: - description: Checked the docker daemon status successfully. - schema: - $ref: '#/definitions/DockerDaemonStatus' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/docker/config/export: - post: - tags: ["docker"] - summary: Generate TKG configuration file for Docker" - operationId: exportTKGConfigForDocker - parameters: - - in: body - name: params - description: parameters to generate TKG configuration file for Docker - required: true - schema: - $ref: '#/definitions/DockerRegionalClusterParams' - responses: - 200: - description: Generated TKG configuration successfully - schema: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/docker/tkgconfig: - post: - tags: ["docker"] - summary: Apply the changes to TKG configuration file for docker" - operationId: applyTKGConfigForDocker - parameters: - - in: body - name: params - description: parameters to apply changes to TKG configuration file for Docker - required: true - schema: - $ref: '#/definitions/DockerRegionalClusterParams' - responses: - 200: - description: Apply change to TKG configuration successfully - schema: - $ref: "#/definitions/ConfigFileInfo" - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/docker/create: - post: - tags: ["docker"] - summary: "Create Docker regional cluster" - operationId: createDockerRegionalCluster - parameters: - - in: body - name: params - description: parameters to create a regional cluster - required: true - schema: - $ref: '#/definitions/DockerRegionalClusterParams' - responses: - 200: - description: Creating regional cluster started successfully - schema: - type: string - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - - /api/providers/docker/config/import: - post: - tags: ["docker"] - summary: "Generate TKG configuration object for docker" - operationId: importTKGConfigForDocker - parameters: - - in: body - name: params - description: config file from which to generate tkg configuration for docker - required: true - schema: - $ref: '#/definitions/ConfigFile' - responses: - 200: - description: Generated TKG configuration successfully - schema: - $ref: '#/definitions/DockerRegionalClusterParams' - 400: - description: "Bad request" - schema: - $ref: "#/definitions/Error" - 401: - description: Incorrect credentials - schema: - $ref: "#/definitions/Error" - 500: - description: "Internal server error" - schema: - $ref: '#/definitions/Error' - -definitions: - Error: - type: object - properties: - message: - type: string - - VSphereCredentials: - type: object - properties: - username: - type: string - password: - type: string - host: - type: string - thumbprint: - type: string - insecure: - type: boolean - default: false - - VSphereThumbprint: - type: object - properties: - thumbprint: - type: string - insecure: - type: boolean - default: false - - VSphereDatacenter: - type: object - properties: - name: - type: string - moid: - type: string - - VSphereDatastore: - type: object - properties: - name: - type: string - moid: - type: string - - VSphereAvailabilityZone: - type: object - properties: - name: - type: string - moid: - type: string - - VSphereRegion: - type: object - properties: - name: - type: string - moid: - type: string - zones: - type: array - items: - $ref: '#/definitions/VSphereAvailabilityZone' - - VSphereFolder: - type: object - properties: - name: - type: string - moid: - type: string - - VSphereResourcePool: - type: object - properties: - name: - type: string - moid: - type: string - - VSphereManagementObject: - type: object - properties: - name: - type: string - moid: - type: string - parentMoid: - type: string - resourceType: - type: string - enum: [datacenter, cluster, hostgroup, folder, respool, vm, datastore, host, network] - path: - type: string - - VSphereNetwork: - type: object - properties: - name: - type: string - displayName: - type: string - moid: - type: string - - VSphereVirtualMachine: - type: object - properties: - name: - type: string - moid: - type: string - k8sVersion: - type: string - isTemplate: - type: boolean - osInfo: - $ref: '#/definitions/OSInfo' - required: - - isTemplate - - AWSVirtualMachine: - type: object - properties: - name: - type: string - osInfo: - $ref: '#/definitions/OSInfo' - - AzureVirtualMachine: - type: object - properties: - name: - type: string - osInfo: - $ref: '#/definitions/OSInfo' - - OSInfo: - type: object - properties: - name: - type: string - version: - type: string - arch: - type: string - - NodeType: - type: object - properties: - name: - type: string - cpu: - type: integer - ram: - type: integer - disk: - type: integer - - - VsphereRegionalClusterParams: - type: object - properties: - vsphereCredentials: - $ref: '#/definitions/VSphereCredentials' - clusterName: - type: string - datacenter: - type: string - resourcePool: - type: string - datastore: - type: string - folder: - type: string - controlPlaneNodeType: - type: string - controlPlaneFlavor: - type: string - workerNodeType: - type: string - numOfWorkerNode: - type: integer - kubernetesVersion: - type: string - ipFamily: - type: string - networking: - $ref: '#/definitions/TKGNetwork' - os: - $ref: '#/definitions/VSphereVirtualMachine' - ssh_key: - type: string - machineHealthCheckEnabled: - type: boolean - ceipOptIn: - type: boolean - default: true - enableAuditLogging: - type: boolean - annotations: - type: object - additionalProperties: - type: string - labels: - type: object - additionalProperties: - type: string - controlPlaneEndpoint: - type: string - identityManagement: - $ref: '#/definitions/IdentityManagementConfig' - aviConfig: - $ref: '#/definitions/AviConfig' - - AWSRegionalClusterParams: - type: object - properties: - awsAccountParams: - $ref: '#/definitions/AWSAccountParams' - clusterName: - type: string - controlPlaneNodeType: - type: string - controlPlaneFlavor: - type: string - loadbalancerSchemeInternal: - type: boolean - workerNodeType: - type: string - numOfWorkerNode: - type: integer - sshKeyName: - type: string - kubernetesVersion: - type: string - vpc: - $ref: '#/definitions/AWSVpc' - os: - $ref: '#/definitions/AWSVirtualMachine' - bastionHostEnabled: - type: boolean - annotations: - type: object - additionalProperties: - type: string - labels: - type: object - additionalProperties: - type: string - machineHealthCheckEnabled: - type: boolean - ceipOptIn: - type: boolean - default: true - enableAuditLogging: - type: boolean - createCloudFormationStack: - type: boolean - networking: - $ref: '#/definitions/TKGNetwork' - identityManagement: - $ref: '#/definitions/IdentityManagementConfig' - - TKGNetwork: - type: object - properties: - networkName: - type: string - clusterDNSName: - type: string - clusterNodeCIDR: - type: string - clusterServiceCIDR: - type: string - clusterPodCIDR: - type: string - cniType: - type: string - httpProxyConfiguration: - $ref: '#/definitions/HTTPProxyConfiguration' - - AWSAccountParams: - type: object - properties: - region: - type: string - accessKeyID: - type: string - secretAccessKey: - type: string - sessionToken: - type: string - profileName: - type: string - - vsphereInfo: - type: object - properties: - version: - type: string - hasPacific: - type: string - - providerInfo: - type: object - properties: - provider: - type: string - tkrVersion: - type: string - - AWSVpc: - type: object - properties: - cidr: - type: string - vpcID: - type: string - azs: - type: array - items: - $ref: '#/definitions/AWSNodeAz' - - AWSNodeAz: - type: object - properties: - name: - type: string - workerNodeType: - type: string - privateSubnetID: - type: string - publicSubnetID: - type: string - - vpc: - type: object - properties: - id: - type: string - cidr: - type: string - - AWSAvailabilityZone: - type: object - properties: - id: - type: string - name: - type: string - - AWSSubnet: - type: object - properties: - id: - type: string - availabilityZoneName: - type: string - availabilityZoneId: - type: string - state: - type: string - vpcId: - type: string - cidr: - type: string - isPublic: - type: boolean - required: - - isPublic - - AWSRoute: - type: object - properties: - DestinationCidrBlock: - type: string - GatewayId: - type: string - State: - type: string - - AWSRouteTable: - type: object - properties: - id: - type: string - routes: - type: array - items: - $ref: '#/definitions/AWSRoute' - vpcId: - type: string - - AzureAccountParams: - type: object - properties: - subscriptionId: - type: string - tenantId: - type: string - clientId: - type: string - clientSecret: - type: string - azureCloud: - type: string - - AzureResourceGroup: - type: object - properties: - id: - type: string - name: - type: string - location: - type: string - required: - - name - - location - - AzureVirtualNetwork: - type: object - properties: - id: - type: string - name: - type: string - location: - type: string - cidrBlock: - type: string - subnets: - type: array - items: - $ref: '#/definitions/AzureSubnet' - required: - - name - - location - - cidrBlock - - AzureInstanceType: - type: object - properties: - name: - type: string - tier: - type: string - size: - type: string - family: - type: string - zones: - type: array - items: - type: string - - AzureSubnet: - type: object - properties: - name: - type: string - cidr: - type: string - - AzureLocation: - type: object - properties: - name: - type: string - displayName: - type: string - - AzureRegionalClusterParams: - type: object - properties: - clusterName: - type: string - location: - type: string - azureAccountParams: - $ref: '#/definitions/AzureAccountParams' - sshPublicKey: - type: string - resourceGroup: - type: string - vnetName: - type: string - vnetResourceGroup: - type: string - vnetCidr: - type: string - controlPlaneSubnet: - type: string - controlPlaneSubnetCidr: - type: string - workerNodeSubnet: - type: string - workerNodeSubnetCidr: - type: string - controlPlaneMachineType: - type: string - workerMachineType: - type: string - machineHealthCheckEnabled: - type: boolean - isPrivateCluster: - type: boolean - frontendPrivateIp: - type: string - controlPlaneFlavor: - type: string - numOfWorkerNodes: - type: string - kubernetesVersion: - type: string - os: - $ref: '#/definitions/AzureVirtualMachine' - ceipOptIn: - type: boolean - default: true - enableAuditLogging: - type: boolean - annotations: - type: object - additionalProperties: - type: string - labels: - type: object - additionalProperties: - type: string - networking: - $ref: '#/definitions/TKGNetwork' - identityManagement: - $ref: '#/definitions/IdentityManagementConfig' - - DockerRegionalClusterParams: - type: object - properties: - clusterName: - type: string - machineHealthCheckEnabled: - type: boolean - controlPlaneFlavor: - type: string - numOfWorkerNodes: - type: string - kubernetesVersion: - type: string - ceipOptIn: - type: boolean - default: true - annotations: - type: object - additionalProperties: - type: string - labels: - type: object - additionalProperties: - type: string - networking: - $ref: '#/definitions/TKGNetwork' - identityManagement: - $ref: '#/definitions/IdentityManagementConfig' - - DockerDaemonStatus: - type: object - properties: - status: - type: boolean - - HTTPProxyConfiguration: - type: object - properties: - enabled: - type: boolean - HTTPProxyURL: - type: string - HTTPProxyUsername: - type: string - HTTPProxyPassword: - type: string - HTTPSProxyURL: - type: string - HTTPSProxyUsername: - type: string - HTTPSProxyPassword: - type: string - noProxy: - type: string - - AviControllerParams: - type: object - properties: - username: - type: string - password: - type: string - host: - type: string - tenant: - type: string - CAData: - type: string - - AviCloud: - type: object - properties: - uuid: - type: string - name: - type: string - location: - type: string - - AviServiceEngineGroup: - type: object - properties: - uuid: - type: string - name: - type: string - location: - type: string - - AviVipNetwork: - type: object - properties: - uuid: - type: string - name: - type: string - cloud: - type: string - configedSubnets: - type: array - items: - $ref: '#/definitions/AviSubnet' - - AviSubnet: - type: object - properties: - subnet: - type: string - family: - type: string - - AviNetworkParams: - type: object - properties: - name: - type: string - cidr: - type: string - - AviConfig: - type: object - properties: - controller: - type: string - username: - type: string - password: - type: string - cloud: - type: string - service_engine: - type: string - management_cluster_service_engine: - type: string - ca_cert: - type: string - labels: - type: object - additionalProperties: - type: string - network: - $ref: '#/definitions/AviNetworkParams' - controlPlaneNetwork: - $ref: '#/definitions/AviNetworkParams' - controlPlaneHaProvider: - type: boolean - managementClusterVipNetworkName: - type: string - managementClusterVipNetworkCidr: - type: string - managementClusterControlPlaneVipNetworkName: - type: string - managementClusterControlPlaneVipNetworkCidr: - type: string - - IdentityManagementConfig: - type: object - properties: - idm_type: - type: string - enum: [oidc,ldap,none] - oidc_provider_name: - type: string - oidc_provider_url: - type: string - format: uri - oidc_client_id: - type: string - oidc_client_secret: - type: string - oidc_scope: - type: string - oidc_claim_mappings: - type: object - additionalProperties: - type: string - oidc_skip_verify_cert: - type: boolean - # ldap://... or ldaps://... - ldap_url: - type: string - ldap_bind_dn: - type: string - ldap_bind_password: - type: string - ldap_user_search_base_dn: - type: string - ldap_user_search_filter: - type: string - ldap_user_search_username: - type: string - ldap_user_search_id_attr: - type: string - ldap_user_search_email_attr: - type: string - ldap_user_search_name_attr: - type: string - ldap_group_search_base_dn: - type: string - ldap_group_search_filter: - type: string - ldap_group_search_user_attr: - type: string - ldap_group_search_group_attr: - type: string - ldap_group_search_name_attr: - type: string - ldap_root_ca: - type: string - default: - idm_type: oidc - oidc_skip_verify_cert: false - ldap_user_search_username: userPrincipalName - ldap_user_search_id_attr: DN - ldap_user_search_email_attr: userPrincipalName - ldap_group_search_user_attr: DN - ldap_group_search_name_attr: cn - required: - - idm_type - - LdapParams: - type: object - properties: - ldap_url: - type: string - ldap_bind_dn: - type: string - ldap_bind_password: - type: string - ldap_user_search_base_dn: - type: string - ldap_user_search_filter: - type: string - ldap_user_search_username: - type: string - ldap_user_search_id_attr: - type: string - ldap_user_search_email_attr: - type: string - ldap_user_search_name_attr: - type: string - ldap_group_search_base_dn: - type: string - ldap_group_search_filter: - type: string - ldap_group_search_user_attr: - type: string - ldap_group_search_group_attr: - type: string - ldap_group_search_name_attr: - type: string - ldap_root_ca: - type: string - ldap_test_user: - type: string - ldap_test_group: - type: string - default: - ldap_user_search_username: userPrincipalName - ldap_user_search_id_attr: DN - ldap_user_search_email_attr: userPrincipalName - ldap_group_search_user_attr: DN - ldap_group_search_name_attr: cn - - ConfigFileInfo: - type: object - properties: - path: - type: string - - Features: - type: object - additionalProperties: - $ref: '#/definitions/FeatureMap' - - FeatureMap: - type: object - additionalProperties: - type: string - - LdapTestResult: - type: object - properties: - code: - type: integer - desc: - type: string - - ConfigFile: - type: object - properties: - filecontents: - type: string diff --git a/tkg/web/e2e/.env.example b/tkg/web/e2e/.env.example deleted file mode 100644 index 5ba897222c..0000000000 --- a/tkg/web/e2e/.env.example +++ /dev/null @@ -1,21 +0,0 @@ -SERVER_URL=localhost:4200 -CHROME_OPTIONS=chrome -MC_NAME=mgmt-vsphere-e2e - -AWS_SECRET_ACCESS_KEY=USE_YOUR_OWN -AWS_REGION=US-WEST -AWS_ACCESS_KEY_ID=USE_YOUR_OWN -AWS_SSH_KEY_NAME="default" -AWS_EXISTING_VPC_ID=vpc-1 - -VCIP=USE_YOUR_OWN -DEFAULT_VC_USER=USE_YOUR_OWN -DEFAULT_VC_PASSWORD=USE_YOUR_OWN -DEFAULT_SSH_KEY=123457892342134 - -AZURE_TENANT_ID=USE_YOUR_OWN -AZURE_CLIENT_ID=USE_YOUR_OWN -AZURE_CLIENT_SECRET=USE_YOUR_OWN -AZURE_SUBSCRIPTION_ID=USE_YOUR_OWN -AZURE_REGION="West US" -AZURE_SSH_PUBLIC_KEY_B64=1234567891234 diff --git a/tkg/web/e2e/.gitignore b/tkg/web/e2e/.gitignore deleted file mode 100644 index 846a9e24d5..0000000000 --- a/tkg/web/e2e/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules/ -reports/ -.env \ No newline at end of file diff --git a/tkg/web/e2e/README.md b/tkg/web/e2e/README.md deleted file mode 100644 index f1e71b6e80..0000000000 --- a/tkg/web/e2e/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# tkg-cli UI e2e - -The e2e fixture and test suites can be used in both Jenkins pipelines -and a Development environment. - -This writing serves as HOW-TOs in Development environment. - -## How to prepare for running the e2e? - -- Setup the environment -- Start up the server(s) - -## How to run the e2e? - -## How to check the testing results? - -## What happens if I have the same setting in both .env and OS environment diff --git a/tkg/web/e2e/e2e.sh b/tkg/web/e2e/e2e.sh deleted file mode 100755 index bf0d3eee2d..0000000000 --- a/tkg/web/e2e/e2e.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash - -# Copyright 2021 VMware, Inc. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -#### Setup environmental variables -#GLOBAL_ENVS="../../../globals.env"; -#if [[ -f ${GLOBAL_ENVS} ]] -#then - # shellcheck source=/dev/null -# source ${GLOBAL_ENVS} -#fi - -# Load variables for e2e tests -# Check if VTAAS_USER is defined -source ./e2e_config - -IF_VTAAS=$(echo "${E2E_SPEC}" | grep 'vtaas') -if [ "x${IF_VTAAS}" != "x" ] -then - if [ "x${VTAAS_USER}" == "x" ] - then - echo "Please export VTAAS_USER(your email) in cmdline or e2e_config" - exit 1 - else - echo "VTAAS_USER is ${VTAAS_USER}" - fi -fi - -#### Passing all OS env variables to protractor -# node ./src/utils/os-env-dumper.js - -# Load variables for e2e tests -source ./e2e_config - -# Check if VTAAS_USER is defined -IF_VTAAS=$(echo "${E2E_SPEC}" | grep 'vtaas') -if [ "x${IF_VTAAS}" != "x" ] -then - if [ "x${VTAAS_USER}" == "x" ] - then - echo "Please export VTAAS_USER(your email) in cmdline or e2e_config" - exit 1 - else - echo "VTAAS_USER is ${VTAAS_USER}" - fi -fi - -#### Clean up existing webdriver instance if any -pgrep webdriver | xargs kill > /dev/null 2<&1 - -echo "Update webdriver-manager..." -webdriver-manager update -#### Start selenium server - -echo "Start selenium server..." -(webdriver-manager start &) -while ! nc -z localhost 4444; do sleep 1; done - -##### Executing e2e testing -echo "Executing e2e testing..." -npx protractor ./protractor.conf.js - -#### Clean up testing fixtures -webdriver-manager clean > /dev/null 2<&1 -webdriver-manager shutdown > /dev/null 2<&1 - -echo "Clean up testing fixtures..." -lsof -i tcp:4444 | grep LISTEN | awk '{print $2}' | xargs kill > /dev/null 2<&1 - -#### Done -echo "e2e testing done!!" diff --git a/tkg/web/e2e/e2e_config b/tkg/web/e2e/e2e_config deleted file mode 100644 index 44820dfedb..0000000000 --- a/tkg/web/e2e/e2e_config +++ /dev/null @@ -1,57 +0,0 @@ -export SERVER_URL=localhost:4200 -#export CHROME_OPTIONS=chrome -export MC_NAME=mgmt-vsphere-e2e -export CONTROL_PLANE_TYPE=dev - -export VCIP=vsphere.local -export DEFAULT_VC_USER=administrator -export DEFAULT_VC_PASSWORD=password -export DEFAULT_SSH_KEY=123457892342134 -export DEFAULT_VC_DATACENTER=/SDDC-Datacenter/dc-1 -export DEFAULT_VC_MC_TYPE=large -export DEFAULT_VC_WC_TYPE=large -export DEFAULT_RESOURCE_POOL=respool-1 -export DEFAULT_VC_FOLDER='Folder 3' -export DEFAULT_VC_DATASTORE='Datastore 2' -export DEFAULT_VC_NETWORK='Network 1' -export VSPHERE_ENDPOINT_IP=10.10.10.10 -export DEFAULT_PROXY_HTTP_URL=http://proxy.vmware.com:3128 -export CONTROLLER_HOST=avi.local -export DEFAULT_NSX_USER=administrator -export DEFAULT_NSX_PASSWORD='VMware123!' -export DEFAULT_NSX_CLOUD=Cloud-1-S -export DEFAULT_NSX_SE=Group-1 -export DEFAULT_NSX_NETWORK_NAME=faraway-network -export DEFAULT_NSX_NETWORK_CIDR=192.168.1.0/24 -export DEFAULT_NSX_CA=123456789 - -export AWS_SECRET_ACCESS_KEY=My-AWS-Secret-Access-Key -export AWS_REGION=US-WEST -export AWS_ACCESS_KEY_ID=aws-access-key-id-12345 -export AWS_SSH_KEY_NAME=default -export AWS_PROFILE=profile1 -export AWS_EXISTING_VPC_ID=vpc-1 -export AWS_MC_TYPE=t3.large -export AWS_WC_TYPE=t3.large -export AWS_AZ1=us-west-b -export AWS_AZ2=us-west-a -export AWS_AZ3=us-west-c - -export AZURE_SUBSCRIPTION_ID=USE_YOUR_OWN -export AZURE_TENANT_ID=USE_YOUR_OWN -export AZURE_CLIENT_ID=USE_YOUR_OWN -export AZURE_CLIENT_SECRET=USE_YOUR_OWN -export AZURE_CLOUD="Public Cloud" -export AZURE_REGION="East US" -export AZURE_ENVIRONMENT="AzurePublicCloud" -export AZURE_SSH_PUBLIC_KEY_B64='23123' -export AZURE_MC_TYPE=Standard_B1ls -export AZURE_WC_TYPE=Standard_B1ls -export AZURE_RESOURCE_GROUP=resource-group1 -export AZURE_VNET=vnet1 -export AZURE_MASTER_SUBNET=subnet1 -export AZURE_WORKER_SUBNET=subnet2 -export AZURE_PRIVATE_IP=10.0.0.100 - -export LDAP_IP=myldap.com -export LDAP_PORT=31234 diff --git a/tkg/web/e2e/package-lock.json b/tkg/web/e2e/package-lock.json deleted file mode 100644 index 8096f044bc..0000000000 --- a/tkg/web/e2e/package-lock.json +++ /dev/null @@ -1,5234 +0,0 @@ -{ - "name": "tkgcli-ui-e2e", - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@angular-devkit/architect": { - "version": "0.803.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.29.tgz", - "integrity": "sha512-yHBud/fZHTelX24yjQg5lefZrfIebruoFTGeOwF0JdX8+KiHcTIxS4LOnUTYriasfHarcHRFXBAV/bRm+wv5ow==", - "dev": true, - "requires": { - "@angular-devkit/core": "8.3.29", - "rxjs": "6.4.0" - } - }, - "@angular-devkit/core": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", - "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", - "dev": true, - "requires": { - "ajv": "6.12.3", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.3", - "rxjs": "6.4.0", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.29.tgz", - "integrity": "sha512-AFJ9EK0XbcNlO5Dm9vr0OlBo1Nw6AaFXPR+DmHGBdcDDHxqEmYYLWfT+JU/8U2YFIdgrtlwvdtf6UQ3V2jdz1g==", - "dev": true, - "requires": { - "@angular-devkit/core": "8.3.29", - "rxjs": "6.4.0" - } - }, - "@angular/cli": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.29.tgz", - "integrity": "sha512-pW+iU0eKHIae+A1b9W5g8DKefMQcehZ+drGKs4Hryh8G+XGFS00BIWkmh6c1mydWTEhdsFlhdjD/rXCem7MAQQ==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.803.29", - "@angular-devkit/core": "8.3.29", - "@angular-devkit/schematics": "8.3.29", - "@schematics/angular": "8.3.29", - "@schematics/update": "0.803.29", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.1", - "debug": "^4.1.1", - "ini": "1.3.5", - "inquirer": "6.5.1", - "npm-package-arg": "6.1.0", - "npm-pick-manifest": "3.0.2", - "open": "6.4.0", - "pacote": "9.5.5", - "read-package-tree": "5.3.1", - "rimraf": "3.0.0", - "semver": "6.3.0", - "symbol-observable": "1.2.0", - "universal-analytics": "^0.4.20", - "uuid": "^3.3.2" - } - }, - "@angular/compiler": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", - "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", - "dev": true - }, - "@angular/core": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", - "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", - "dev": true - }, - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@schematics/angular": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.29.tgz", - "integrity": "sha512-If+UhCsQzCgnQymiiF8dQRoic34+RgJ6rV0n4k7Tm4N2xNYJOG7ajjzKM7PIeafsF50FKnFP8dqaNGxCMyq5Ew==", - "dev": true, - "requires": { - "@angular-devkit/core": "8.3.29", - "@angular-devkit/schematics": "8.3.29" - } - }, - "@schematics/update": { - "version": "0.803.29", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.29.tgz", - "integrity": "sha512-Syf6h6DYeu1WU9aLihMwIgVASpcHCxUYqhZyHfQABiK8NkdlZ+KAp4cOxihsZyDqIJNLWON+0/FLPAQF3BXh5Q==", - "dev": true, - "requires": { - "@angular-devkit/core": "8.3.29", - "@angular-devkit/schematics": "8.3.29", - "@yarnpkg/lockfile": "1.1.0", - "ini": "1.3.5", - "pacote": "9.5.5", - "rxjs": "6.4.0", - "semver": "6.3.0", - "semver-intersect": "1.4.0" - } - }, - "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true - }, - "@types/jasmine": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.0.3.tgz", - "integrity": "sha512-Opp1LvvEuZdk8fSSvchK2mZwhVrsNT0JgJE9Di6MjnaIpmEXM8TLCPPrVtNTYh8+5MPdY8j9bAHMu2SSfwpZJg==", - "dev": true - }, - "@types/jasminewd2": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", - "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", - "dev": true, - "requires": { - "@types/jasmine": "*" - } - }, - "@types/lodash": { - "version": "4.14.182", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", - "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", - "dev": true - }, - "@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", - "dev": true - }, - "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", - "dev": true - }, - "@types/selenium-webdriver": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", - "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", - "dev": true - }, - "@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@xmldom/xmldom": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.5.tgz", - "integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==", - "dev": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "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==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "dependencies": { - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - } - } - }, - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "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, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "api-client-generator": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/api-client-generator/-/api-client-generator-4.7.1.tgz", - "integrity": "sha512-KCiL8sv1gQKu0GZQG9AV8RSmZk0iSMSjjPIcuWg64j5PDjjRGgoYzzS3WQmceT2JZbqwj+OxfdUvgOtlE6V6sA==", - "dev": true, - "requires": { - "fs-extra": "^9.0.1", - "mustache": "^4.0.1", - "optimist": "^0.6.1", - "swagger-parser": "^6.0.5", - "which": "^2.0.2" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "blocking-proxy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", - "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserstack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", - "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", - "dev": true, - "requires": { - "https-proxy-agent": "^2.2.1" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "codelyzer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz", - "integrity": "sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g==", - "dev": true, - "requires": { - "@angular/compiler": "9.0.0", - "@angular/core": "9.0.0", - "app-root-path": "^3.0.0", - "aria-query": "^3.0.0", - "axobject-query": "2.0.2", - "css-selector-tokenizer": "^0.7.1", - "cssauron": "^1.4.0", - "damerau-levenshtein": "^1.0.4", - "rxjs": "^6.5.3", - "semver-dsl": "^1.0.1", - "source-map": "^0.5.7", - "sprintf-js": "^1.1.2", - "tslib": "^1.10.0", - "zone.js": "~0.10.3" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "requires": { - "node-fetch": "2.6.7" - } - }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", - "dev": true, - "requires": { - "through": "X.X.X" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-format": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.13.tgz", - "integrity": "sha512-bnYCwf8Emc3pTD8pXnre+wfnjGtfi5ncMDKy7+cWZXbmRAsdWkOQHrfC1yz/KiwP5thDp2kCHWYWKBX4HP1hoQ==", - "dev": true - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", - "dev": true - }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dotenv": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz", - "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "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==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", - "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", - "dev": true, - "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" - }, - "dependencies": { - "@types/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", - "dev": true - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true - }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", - "dev": true - }, - "es-abstract": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "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==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "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 - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "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==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "format-util": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", - "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "hat": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", - "integrity": "sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo=", - "dev": true - }, - "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==", - "dev": true - }, - "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 - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", - "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true - }, - "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "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==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", - "dev": true - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", - "dev": true - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", - "dev": true, - "requires": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "dependencies": { - "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", - "dev": true - } - } - }, - "jasmine-core": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.1.1.tgz", - "integrity": "sha512-lmUfT5XcK9KKvt3lLYzn93hc4MGzlUBowExFVgzbSW0ZCrdeyS574dfsyfRhxbg81Wj4gk+RxUiTnj7KBfDA1g==", - "dev": true - }, - "jasmine-fail-fast": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jasmine-fail-fast/-/jasmine-fail-fast-2.0.1.tgz", - "integrity": "sha512-En8ONwvDQOV+jyiZEZvbvUSLWSdJFj9HiWjhLdGq/V/gxs4XyST730ooe928BbRxv4bfy05OpykKuoOU4aLC5w==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "jasmine-reporters": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.5.0.tgz", - "integrity": "sha512-J69peyTR8j6SzvIPP6aO1Y00wwCqXuIvhwTYvE/di14roCf6X3wDZ4/cKGZ2fGgufjhP2FKjpgrUIKjwau4e/Q==", - "dev": true, - "requires": { - "@xmldom/xmldom": "^0.7.3", - "mkdirp": "^1.0.4" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } - } - }, - "jasmine-spec-reporter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", - "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", - "dev": true, - "requires": { - "colors": "1.4.0" - } - }, - "jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-ref-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", - "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.12.1", - "ono": "^4.0.11" - } - }, - "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==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsonschema": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", - "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==", - "dev": true - }, - "jsonschema-draft4": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jsonschema-draft4/-/jsonschema-draft4-1.0.0.tgz", - "integrity": "sha1-8K8gBQVPDwrefqIRhhS2ncUS2GU=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jszip": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", - "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "karma": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", - "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "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 - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - } - } - }, - "karma-chrome-launcher": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", - "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", - "dev": true, - "requires": { - "which": "^1.2.1" - } - }, - "karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", - "minimatch": "^3.0.4" - } - }, - "karma-jasmine": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.0.1.tgz", - "integrity": "sha512-FkL1Kk+JAKmim8VWU8RXKZBpl0lLI7J8LijM0/q7oP7emfB6QMZV1Az+JgqGKSLpF0tYaav+KUVFQroZUxQTHA==", - "dev": true, - "requires": { - "jasmine-core": "^4.1.0" - } - }, - "karma-jasmine-html-reporter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.0.0.tgz", - "integrity": "sha512-SB8HNNiazAHXM1vGEzf8/tSyEhkfxuDdhYdPBX2Mwgzt0OuF2gicApQ+uvXLID/gXyJQgvrM9+1/2SxZFUUDIA==", - "dev": true - }, - "karma-spec-reporter": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.34.tgz", - "integrity": "sha512-l5H/Nh9q4g2Ysx2CDU2m+NIPyLQpCVbk9c4V02BTZHw3NM6RO1dq3eRpKXCSSdPt4RGfhHk8jDt3XYkGp+5PWg==", - "dev": true, - "requires": { - "colors": "1.4.0" - }, - "dependencies": { - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - } - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "log4js": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.6.1.tgz", - "integrity": "sha512-J8VYFH2UQq/xucdNu71io4Fo+purYYudyErgBbswWKO0MC6QVOERRomt5su/z6d3RJSmLyTGmXl3Q/XjKCf+/A==", - "dev": true, - "requires": { - "date-format": "^4.0.13", - "debug": "^4.3.4", - "flatted": "^3.2.6", - "rfdc": "^1.3.0", - "streamroller": "^3.1.2" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "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, - "requires": { - "yallist": "^3.0.2" - } - }, - "magic-string": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", - "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "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 - }, - "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", - "dev": true, - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" - } - }, - "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==", - "dev": true - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", - "dev": true, - "requires": { - "mime-db": "1.48.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, - "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==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "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 - }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "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==", - "dev": true - }, - "npm-package-arg": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", - "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.6.0", - "osenv": "^0.1.5", - "semver": "^5.5.0", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dev": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "npm-registry-fetch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", - "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", - "dev": true, - "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - } - }, - "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==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "ono": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", - "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", - "dev": true, - "requires": { - "format-util": "^1.0.3" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "openapi-schema-validation": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/openapi-schema-validation/-/openapi-schema-validation-0.4.2.tgz", - "integrity": "sha512-K8LqLpkUf2S04p2Nphq9L+3bGFh/kJypxIG2NVGKX0ffzT4NQI9HirhiY6Iurfej9lCu7y4Ndm4tv+lm86Ck7w==", - "dev": true, - "requires": { - "jsonschema": "1.2.4", - "jsonschema-draft4": "^1.0.0", - "swagger-schema-official": "2.0.0-bab6bed" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "pacote": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", - "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", - "dev": true, - "requires": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^2.2.3", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.8", - "unique-filename": "^1.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "npm-pick-manifest": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", - "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dev": true, - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", - "dev": true, - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - } - }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, - "protractor": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", - "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", - "dev": true, - "requires": { - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "q": "1.4.1", - "saucelabs": "^1.5.0", - "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.1.7", - "yargs": "^15.3.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "webdriver-manager": { - "version": "12.1.8", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", - "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", - "dev": true, - "requires": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "protractor-fail-fast": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/protractor-fail-fast/-/protractor-fail-fast-3.1.0.tgz", - "integrity": "sha512-OjuIFmY7hm5R/Msmioyg3aBevySpmpIgtm2TGUvMEqTzviPk/Fqd1HYmMjIQ+NzFMzrK+93LJa4civDvw1+hEg==", - "dev": true, - "requires": { - "jasmine-fail-fast": "~2.0.0" - } - }, - "protractor-html-reporter-2": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/protractor-html-reporter-2/-/protractor-html-reporter-2-1.0.4.tgz", - "integrity": "sha512-IlUcRac05bPUWscsWkEYNGNnly35LhNu4rH5/umdrRFiqOkgKdofPjw6sc1cxswTOERErWxQm0tFhl2CBkV1Kw==", - "dev": true, - "requires": { - "fs": "0.0.1-security", - "fs-extra": "^1.0.0", - "jasmine-reporters": "^2.3.0", - "lodash": "^4.17.5", - "path": "^0.12.7", - "xmldoc": "^0.5.1" - }, - "dependencies": { - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - } - } - }, - "protractor-jasmine2-screenshot-reporter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/protractor-jasmine2-screenshot-reporter/-/protractor-jasmine2-screenshot-reporter-0.5.0.tgz", - "integrity": "sha512-8Vno7kwR0lq0gdki9J5oKvP8o0XNXGeeNpjBBtZifg+7fpsDffrZqpPer9DhVOcIoe/axOJWnwtMwUWCQl/d1g==", - "dev": true, - "requires": { - "hat": "0.0.3", - "lodash": "^4.17.4", - "mkdirp": "^0.5.0", - "rimraf": "^2.4.3", - "string.prototype.startswith": "^0.2.0", - "uuid": "^2.0.0" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - } - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "puppeteer": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.6.0.tgz", - "integrity": "sha512-EJXhTyY5bXNPLFXPGcY9JaF6EKJIX8ll8cGG3WUK+553Jx96oDf1cB+lkFOro9p0X16tY+9xx7zYWl+vnWgW2g==", - "dev": true, - "requires": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.981744", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.5.0" - }, - "dependencies": { - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true - } - } - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "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==", - "dev": true, - "requires": { - "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" - } - }, - "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==", - "dev": true, - "requires": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "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==", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", - "dev": true, - "requires": { - "https-proxy-agent": "^2.2.1" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "requires": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "requires": { - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "semver-intersect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", - "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", - "dev": true, - "requires": { - "semver": "^5.0.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true - }, - "socket.io": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.2.tgz", - "integrity": "sha512-6fCnk4ARMPZN448+SQcnn1u8OHUC72puJcNtSgg2xS34Cu7br1gQ09YKkO1PFfDn/wyUE9ZgMAwosJed003+NQ==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true - }, - "socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - } - }, - "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "dev": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "dev": true, - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "streamroller": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.2.tgz", - "integrity": "sha512-wZswqzbgGGsXYIrBYhOE0yP+nQ6XRk7xDcYwuQAGTYXdyAUmvgVFE0YU1g5pvQT0m7GBaQfYcSnlHbapuK0H0A==", - "dev": true, - "requires": { - "date-format": "^4.0.13", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "string.prototype.startswith": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/string.prototype.startswith/-/string.prototype.startswith-0.2.0.tgz", - "integrity": "sha1-2miYLjU6TprEpDtFCiBF0cRFrns=", - "dev": true - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "swagger-methods": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/swagger-methods/-/swagger-methods-1.0.8.tgz", - "integrity": "sha512-G6baCwuHA+C5jf4FNOrosE4XlmGsdjbOjdBK4yuiDDj/ro9uR4Srj3OR84oQMT8F3qKp00tYNv0YN730oTHPZA==", - "dev": true - }, - "swagger-parser": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-6.0.5.tgz", - "integrity": "sha512-UL47eu4+GRm5y+N7J+W6QQiqAJn2lojyqgMwS0EZgA55dXd5xmpQCsjUmH/Rf0eKDiG1kULc9VS515PxAyTDVw==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "json-schema-ref-parser": "^6.0.3", - "ono": "^4.0.11", - "openapi-schema-validation": "^0.4.2", - "swagger-methods": "^1.0.8", - "swagger-schema-official": "2.0.0-bab6bed", - "z-schema": "^3.24.2" - } - }, - "swagger-schema-official": { - "version": "2.0.0-bab6bed", - "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", - "integrity": "sha1-cAcEaNbSl3ylI3suUZyn0Gouo/0=", - "dev": true - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "ts-node": { - "version": "10.8.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz", - "integrity": "sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "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 - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universal-analytics": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", - "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "request": "^2.88.2", - "uuid": "^3.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util-promisify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", - "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "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==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true - }, - "webdriver-js-extender": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", - "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", - "dev": true, - "requires": { - "@types/selenium-webdriver": "^3.0.0", - "selenium-webdriver": "^3.0.1" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xmldoc": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-0.5.1.tgz", - "integrity": "sha1-kuQ36QDb/wRFDvrpDTyl8WVl9zg=", - "dev": true, - "requires": { - "sax": "~1.1.1" - }, - "dependencies": { - "sax": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.6.tgz", - "integrity": "sha1-XWFr6KXmB9VOEUr65Vt+ry/MMkA=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "dependencies": { - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "z-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.25.1.tgz", - "integrity": "sha512-7tDlwhrBG+oYFdXNOjILSurpfQyuVgkRe3hB2q8TEssamDHB7BbLWYkYO98nTn0FibfdFroFKDjndbgufAgS/Q==", - "dev": true, - "requires": { - "commander": "^2.7.1", - "core-js": "^2.5.7", - "lodash.get": "^4.0.0", - "lodash.isequal": "^4.0.0", - "validator": "^10.0.0" - } - }, - "zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", - "dev": true - } - } -} diff --git a/tkg/web/e2e/package.json b/tkg/web/e2e/package.json deleted file mode 100644 index a1ec432fc3..0000000000 --- a/tkg/web/e2e/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "tkgcli-ui-e2e", - "private": "true", - "scripts": { - "ng": "ng", - "e2e": "./e2e.sh", - "aws-new-vpc-e2e": "E2E_SPEC=aws-flow/wizard-new-vpc ./e2e.sh", - "aws-existing-vpc-e2e": "E2E_SPEC=aws-flow/wizard-existing-vpc ./e2e.sh", - "aws-vtaas-existing-vpc-e2e": "E2E_SPEC=aws-flow/vtaas-existing-vpc ./e2e.sh", - "aws-vtaas-new-vpc-e2e": "E2E_SPEC=aws-flow/vtaas-new-vpc ./e2e.sh", - "vsphere-no-opt-e2e": "E2E_SPEC=vsphere-flow/wizard-no-opt ./e2e.sh", - "vsphere-enable-opt-e2e": "E2E_SPEC=vsphere-flow/wizard-enable-opt ./e2e.sh", - "vsphere-vtaas-enable-opt-e2e": "E2E_SPEC=vsphere-flow/vtaas-enable-opt ./e2e.sh", - "vsphere-vtaas-no-opt-e2e": "E2E_SPEC=vsphere-flow/vtaas-no-opt ./e2e.sh", - "azure-existing-vnet-e2e": "E2E_SPEC=azure-flow/wizard-existing-vnet ./e2e.sh", - "azure-new-vnet-e2e": "E2E_SPEC=azure-flow/wizard-new-vnet ./e2e.sh", - "azure-vtaas-new-vnet-e2e": "E2E_SPEC=azure-flow/vtaas-new-vnet ./e2e.sh", - "azure-vtaas-existing-vnet-e2e": "E2E_SPEC=azure-flow/vtaas-existing-vnet ./e2e.sh", - "docker-ldap-e2e": "E2E_SPEC=docker-flow/wizard-docker-ldap ./e2e.sh", - "docker-oidc-e2e": "E2E_SPEC=docker-flow/wizard-docker-oidc ./e2e.sh", - "docker-vtaas-oidc-e2e": "E2E_SPEC=docker-flow/vtaas-oidc ./e2e.sh", - "docker-vtaas-ldap-e2e": "E2E_SPEC=docker-flow/vtaas-ldap ./e2e.sh" - }, - "dependencies": {}, - "devDependencies": { - "@angular/cli": "^8.3.29", - "@types/jasmine": "^4.0.3", - "@types/jasminewd2": "^2.0.10", - "@types/lodash": "^4.14.182", - "@types/node": "^8.10.66", - "api-client-generator": "^4.7.1", - "codelyzer": "^6.0.2", - "dotenv": "^16.0.0", - "fs-extra": "^10.1.0", - "jasmine-core": "^4.1.1", - "jasmine-reporters": "^2.5.0", - "jasmine-spec-reporter": "^7.0.0", - "karma": "^6.4.1", - "karma-chrome-launcher": "^3.1.1", - "karma-coverage-istanbul-reporter": "^3.0.3", - "karma-jasmine": "^5.0.1", - "karma-jasmine-html-reporter": "^2.0.0", - "karma-spec-reporter": "^0.0.34", - "protractor": "^7.0.0", - "protractor-fail-fast": "^3.1.0", - "protractor-html-reporter-2": "^1.0.4", - "protractor-jasmine2-screenshot-reporter": "^0.5.0", - "puppeteer": "^13.6.0", - "ts-node": "^10.8.1", - "tslint": "^6.1.3", - "typescript": "4.6.3" - } -} diff --git a/tkg/web/e2e/protractor.conf.js b/tkg/web/e2e/protractor.conf.js deleted file mode 100644 index deb24ca668..0000000000 --- a/tkg/web/e2e/protractor.conf.js +++ /dev/null @@ -1,139 +0,0 @@ -// @ts-check -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { browser } = require('protractor'); -const fs = require('fs'); - -const failFast = require('protractor-fail-fast'); -const { SpecReporter } = require('jasmine-spec-reporter'); - -const HtmlScreenshotReporter = require('protractor-jasmine2-screenshot-reporter'); -require('./src/utils/os-env').config(); - -const dashboardReporter = new HtmlScreenshotReporter({ - dest: 'reports', - filename: 'index.html', - showSummary: true, - captureOnlyFailedSpecs: false, // capture all screenshots - reportOnlyFailedSpecs: false, - showQuickLinks: false, - showConfiguration: false, - reportTitle: "tkg-cli UI e2e Report", - userJs: 'report.js', - userCss: 'report.css' -}); - -/** - * Creates marker file based on the test result so that - * other scripts can act accordingly. - */ -const whistleblower = (function () { - const whistle = '.whistle'; - return { - createWhistle: function () { - try { - fs.closeSync(fs.openSync(whistle, 'w')); - } catch (e) { - console.log(e); - } - }, - removeWhistle: function () { - try { - if (fs.existsSync(whistle)) { - fs.unlinkSync(whistle); - } - } catch (e) { - console.log(e); - } - } - } -})(); - -const chromeOptions = process.env.CHROME_OPTIONS ? - { args: ['window-size=1920,1200'] } : - { args: ["--headless", 'window-size=1920,1200'] }; - -const targetSpecs = process.env.E2E_SPEC ? `./src/${process.env.E2E_SPEC}.e2e-spec.ts` : "./src/**/*.e2e-spec.ts"; - -/** - * @type { import("protractor").Config } - */ -exports.config = { - params: { - ...process.env - }, - plugins: [ - failFast.init(), - ], - allScriptsTimeout: 11000, - specs: [ - targetSpecs - ], - capabilities: { - chromeOptions, - browserName: 'chrome', - 'shardTestFiles': true, - 'maxInstances': 5 - }, - directConnect: false, - baseUrl: `http://${process.env.SERVER_URL}/`, - seleniumAddress: 'http://localhost:4444/wd/hub', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 6000000, - print: function () { } - }, - beforeLaunch: function () { - return new Promise(function (resolve) { - dashboardReporter.beforeLaunch(resolve); - }); - }, - onPrepare() { - whistleblower.removeWhistle(); - - require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.json') - }); - - jasmine.getEnv().addReporter(dashboardReporter); - jasmine.getEnv().addReporter(new SpecReporter( - { - spec: { - displayStacktrace: false - }, - summary: { - displayErrorMessages: false, - displayStacktrace: false, - displaySuccessful: true, - displayFailed: true, - displayPending: true, - displayDuration: true - }, - colors: { - successful: 'green', - failed: 'red', - pending: 'yellow' - }, - prefixes: { - successful: '✓ ', - failed: '✗ ', - pending: '* ' - } - } - )); - }, - onComplete: function () { - }, - - afterLaunch: function (exitCode) { - if (exitCode) { - whistleblower.createWhistle(); - } - failFast.clean(); // Removes the fail file once all test runners have completed. - return new Promise(function (resolve) { - dashboardReporter.afterLaunch(resolve.bind(this, 0)); - }); - }, -}; \ No newline at end of file diff --git a/tkg/web/e2e/src/app.po.ts b/tkg/web/e2e/src/app.po.ts deleted file mode 100644 index b34f8c464b..0000000000 --- a/tkg/web/e2e/src/app.po.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { browser, by, element, protractor } from 'protractor'; - -export class AppPage { - navigateTo() { - return browser.get(browser.baseUrl) as Promise; - } - - getTitleText() { - return element(by.css('tkg-kickstart-ui-start h2')).getText() as Promise; - } - - matchTitleText() { - const EC = protractor.ExpectedConditions; - return EC.or( - EC.presenceOf(element(by.cssContainingText('tkg-kickstart-ui-start h2', - 'Welcome to the VMware Tanzu Kubernetes Grid Installer'))), - EC.presenceOf(element(by.cssContainingText('tkg-kickstart-ui-start h2', - 'Welcome to the Tanzu Community Edition Installer'))) - ); - } - - getDeployOnVsphere() { - return element(by.id("btn-deploy-vsphere")); - } - - getDeployOnAws() { - return element(by.id("btn-deploy-aws")); - } - - getDeployOnAzure() { - return element(by.id("btn-deploy-azure")); - } - - getDeployOnDocker() { - return element(by.id("btn-deploy-docker")); - } - -} diff --git a/tkg/web/e2e/src/aws-flow/aws-existing-vpc-common.ts b/tkg/web/e2e/src/aws-flow/aws-existing-vpc-common.ts deleted file mode 100644 index 4e60bac16f..0000000000 --- a/tkg/web/e2e/src/aws-flow/aws-existing-vpc-common.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { Provider } from './provider.po'; -import { NodeSettings } from './node-settings.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import WizardCommon from "./wizard-common"; -import { Vpc } from './vpc.po'; -import { browser } from 'protractor'; -import { NetworkProxy } from '../common/networkproxy.po'; -import { Identity } from '../common/identity.po' - -export class ExistingVpcCommon extends WizardCommon { - setCredentials(step: Provider) { - step.getStaticCredential().click(); - step.getAccessKeyId().clear(); - step.getAccessKeyId().sendKeys(PARAMS.AWS_ACCESS_KEY_ID); - step.getSecretAccessKey().clear(); - step.getSecretAccessKey().sendKeys(PARAMS.AWS_SECRET_ACCESS_KEY); - } - - selectSubnets(step: NodeSettings) { - step.selectOptionByIndex(step.getVpcPublicSubset(), 2); - step.selectOptionByIndex(step.getVpcPrivateSubset(), 2); - } - - setNetworkProxy(step: NetworkProxy) { - // Do nothing as it is not enabled - } - - getFlowTestingDescription() { - return "AWS flow (existing VPC)" - } - - executeProviderStep() { - describe("provider step", () => { - const provider = new Provider(); - - it('should display "Validate the AWS provider credentials for Tanzu Kubernetes Grid"', () => { - expect(provider.getTitleText()).toEqual('Validate the AWS provider credentials for Tanzu Kubernetes Grid'); - }) - - it('"CONNECT" button should be enabled', () => { - provider.getAccessKeyId().clear(); - provider.getAccessKeyId().sendKeys(PARAMS.AWS_ACCESS_KEY_ID); - provider.getSecretAccessKey().clear(); - provider.getSecretAccessKey().sendKeys(PARAMS.AWS_SECRET_ACCESS_KEY); - provider.getSshKeyName().clear(); - provider.getSshKeyName().sendKeys(PARAMS.AWS_SSH_KEY_NAME); - provider.selectOptionByText(provider.getRegion(), PARAMS.AWS_REGION); - expect(provider.getConectButton().isEnabled()).toBeTruthy(); - }) - - it('"CONNECT" button should display "CONNECTED"', () => { - provider.getConectButton().click(); - browser.waitForAngular(); - expect(provider.getConectButton().isEnabled()).toBeFalsy(); - expect(provider.getConectButton().getText()).toEqual('CONNECTED'); - }) - - it('Capture all user inputs', () => { - expect(true).toBeTruthy(); - }) - - afterAll(() => { - provider.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - - executeVpcStep() { - describe("VPC for AWS step", () => { - const vpc = new Vpc(); - - it('should have moved to VPC for AWS step', () => { - expect(vpc.hasMovedToStep()).toBeTruthy(); - }) - - it('should be able to select an existing VPC', () => { - vpc.getSelectAnExistingVpc().click(); - browser.waitForAngular(); - vpc.selectOptionByText(vpc.getVpcId(), PARAMS.AWS_EXISTING_VPC_ID); - browser.waitForAngular(); - expect(vpc.getVpcCidr().value).not.toBeNull(); - }); - - it('Capture all user inputs', () => { - expect(true).toBeTruthy(); - }); - - afterAll(() => { - vpc.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - - executeIdentityStep() { - describe("Identity step", () => { - const identity = new Identity(); - - it('should have moved to this step', () => { - expect(identity.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - identity.getIssuerURLInput().sendKeys("https://my-url.com"); - identity.getClientIdInput().sendKeys("some-client-id"); - identity.getClientSecretInput().sendKeys("some-client-secret"); - identity.getScopesInput().sendKeys("openid, offline_access"); - identity.getOidcUsernameClaim().sendKeys("some-username"); - identity.getOidcGroupsClaim().sendKeys("some-group"); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - identity.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - -} diff --git a/tkg/web/e2e/src/aws-flow/aws-new-vpc-common.ts b/tkg/web/e2e/src/aws-flow/aws-new-vpc-common.ts deleted file mode 100644 index 63968f5eec..0000000000 --- a/tkg/web/e2e/src/aws-flow/aws-new-vpc-common.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Provider } from './provider.po'; -import { NodeSettings } from './node-settings.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import WizardCommon from "./wizard-common"; -import { Vpc } from './vpc.po'; -import { browser } from 'protractor'; -import { NetworkProxy } from '../common/networkproxy.po'; -import { Identity } from '../common/identity.po' - -export class NewVpcCommon extends WizardCommon { - - setCredentials(step: Provider) { - step.getCredentialProfile().click(); - step.getProfileName().click(); - step.selectOptionByText(step.getProfileName(), PARAMS.AWS_PROFILE); - } - - selectSubnets(step: NodeSettings) { - // Do nothing as it is not applicable - } - - setNetworkProxy(step: NetworkProxy) { - step.getProxyButton().click(); - browser.waitForAngular(); - step.getHttpProxyUrl().sendKeys(PARAMS.DEFAULT_PROXY_HTTP_URL); - step.getIsSameAsHttp().click(); - } - - getFlowTestingDescription() { - return "AWS flow (new VPC)" - } - - executeVpcStep() { - describe("VPC for AWS step", () => { - const vpc = new Vpc(); - - it('should have moved to VPC for AWS step', () => { - expect(vpc.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - expect(true).toBeTruthy(); - }); - - afterAll(() => { - vpc.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - - executeIdentityStep() { - describe("Identity step", () => { - const identity = new Identity(); - - it('should have moved to this step', () => { - expect(identity.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - identity.getLDAPRadioButton().click(); - identity.getLdapIP().sendKeys(PARAMS.LDAP_IP); - identity.getLdapPort().sendKeys(PARAMS.LDAP_PORT); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - identity.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - -} diff --git a/tkg/web/e2e/src/aws-flow/network.po.ts b/tkg/web/e2e/src/aws-flow/network.po.ts deleted file mode 100644 index 6644f9e457..0000000000 --- a/tkg/web/e2e/src/aws-flow/network.po.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Network extends Step { - hasMovedToStep() { - return this.getClusterPodCidr().isPresent(); - } - - getClusterPodCidr() { - return element(by.css('input[formcontrolname="clusterPodCidr"]')); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="networkForm"] clr-step-description')).getText() as Promise; - } - -} diff --git a/tkg/web/e2e/src/aws-flow/node-settings.po.ts b/tkg/web/e2e/src/aws-flow/node-settings.po.ts deleted file mode 100644 index 6573c02cd7..0000000000 --- a/tkg/web/e2e/src/aws-flow/node-settings.po.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class NodeSettings extends Step { - hasMovedToStep() { - return this.getDevSelect().isPresent(); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="awsNodeSettingForm"] clr-step-description')).getText() as Promise; - } - - getDevSelect() { - return element(by.css('input[name="devInstanceType"]')); - } - - getMCName() { - return element(by.css('input[formcontrolname="clusterName"]')); - } - - getWorkNodeInstanceType() { - return element(by.css('select[name="workerNodeInstanceType"]')); - } - - getSshKeyName() { - return element(by.css('input[formcontrolname="sshKeyName"]')); - } - - getAvailabilityZone1() { - return element(by.css('select[name="awsNodeAz1"]')); - } - - getAvailabilityZone2() { - return element(by.css('select[name="awsNodeAz2"]')); - } - - getAvailabilityZone3() { - return element(by.css('select[name="awsNodeAz3"]')); - } - - getVpcPublicSubset() { - return element(by.css('select[name="vpcPublicSubnet1"]')); - } - - getVpcPrivateSubset() { - return element(by.css('select[name="vpcPrivateSubnet1"]')); - } -} diff --git a/tkg/web/e2e/src/aws-flow/provider.po.ts b/tkg/web/e2e/src/aws-flow/provider.po.ts deleted file mode 100644 index 2d6cf79087..0000000000 --- a/tkg/web/e2e/src/aws-flow/provider.po.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Provider extends Step { - hasMovedToStep() { - return this.getCredentialProfile().isPresent(); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="awsProviderForm"] clr-step-description')).getText() as Promise; - } - - getCredentialProfile() { - return element(by.cssContainingText("label", "Credential Profile")); - } - - getStaticCredential() { - return element(by.cssContainingText("label", "Static Credentials")); - } - - getAccessKeyId() { - return element(by.css('input[formcontrolname="accessKeyID"]')); - } - - getSecretAccessKey() { - return element(by.css('input[formcontrolname="secretAccessKey"]')); - } - - getSshKeyName() { - return element(by.css('input[formcontrolname="sshKeyName"]')); - } - - getRegion() { - return element(by.css('select[name="region"]')); - } - - getConectButton() { - return element(by.css('button.btn-connect')); - } - - getProfileName() { - return element(by.css('select[name="profileName"]')); - } - -} diff --git a/tkg/web/e2e/src/aws-flow/vpc.po.ts b/tkg/web/e2e/src/aws-flow/vpc.po.ts deleted file mode 100644 index 7fe33653aa..0000000000 --- a/tkg/web/e2e/src/aws-flow/vpc.po.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Vpc extends Step { - hasMovedToStep() { - return this.getSelectAnExistingVpc().isPresent(); - } - - getSelectAnExistingVpc() { - return element(by.cssContainingText("label", "Select an existing VPC")); - } - - getVpcId() { - return element(by.css('select[name="existingVpcId"]')); - } - - getVpcCidr() { - return element(by.css('input[formcontrolname="existingVpcCidr"]')); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="vpcForm"] clr-step-description')).getText() as Promise; - } - -} diff --git a/tkg/web/e2e/src/aws-flow/vtaas-existing-vpc.e2e-spec.ts b/tkg/web/e2e/src/aws-flow/vtaas-existing-vpc.e2e-spec.ts deleted file mode 100644 index 6d982132c4..0000000000 --- a/tkg/web/e2e/src/aws-flow/vtaas-existing-vpc.e2e-spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ExistingVpcCommon } from './aws-existing-vpc-common'; -import { VtaasCommon } from '../common/vtaas-common'; -import vtaas_list from '../common/vtaas_list'; - -const steps = vtaas_list.stepper; -const lists = vtaas_list.aws_step_list; -const testname = 'TKGm AWS(existing vpc) UI Accessibility Test'; -const wizardoidc = new ExistingVpcCommon(); -const vtaasExe = new VtaasCommon(steps, lists, testname); - -wizardoidc.getFlowTestingDescription = () => { - return "AWS vTaas flow (Existing Vpc)" -}; -wizardoidc.executeAll(true); -vtaasExe.executeVtaas(); diff --git a/tkg/web/e2e/src/aws-flow/vtaas-new-vpc.e2e-spec.ts b/tkg/web/e2e/src/aws-flow/vtaas-new-vpc.e2e-spec.ts deleted file mode 100644 index 06e14e7d7a..0000000000 --- a/tkg/web/e2e/src/aws-flow/vtaas-new-vpc.e2e-spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { NewVpcCommon } from './aws-new-vpc-common'; -import { VtaasCommon } from '../common/vtaas-common'; -import vtaas_list from '../common/vtaas_list'; - -const steps = vtaas_list.stepper; -const lists = vtaas_list.aws_step_list; -const testname = 'TKGm AWS(new vpc) UI Accessibility Test'; -const wizardldap = new NewVpcCommon(); -const vtaasExe = new VtaasCommon(steps, lists, testname); - -wizardldap.getFlowTestingDescription = () => { - return "AWS vTaas flow (New Vpc)" -}; -wizardldap.executeAll(true); -vtaasExe.executeVtaas(); diff --git a/tkg/web/e2e/src/aws-flow/wizard-common.ts b/tkg/web/e2e/src/aws-flow/wizard-common.ts deleted file mode 100644 index 787af2f5a5..0000000000 --- a/tkg/web/e2e/src/aws-flow/wizard-common.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { NodeSettings } from './node-settings.po'; -import { Provider } from './provider.po'; -import { browser } from 'protractor'; -import { Wizard } from './wizard.po'; -import { Network } from './network.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import { AppPage } from '../app.po'; -import { OsImage } from '../common/osimage.po'; -import { Metadata } from '../common/metadata.po' -import { Identity } from '../common/identity.po' -import { NetworkProxy } from '../common/networkproxy.po' -import { NodeOpt } from '../common/node-setting-opt.po'; - -const title = 'Deploying Tanzu Community Edition on AWS'; - -export default abstract class WizardCommon { - - abstract executeVpcStep(); - abstract setCredentials(step: Provider); - abstract selectSubnets(step: NodeSettings); - abstract setNetworkProxy(step: NetworkProxy); - abstract executeIdentityStep(); - abstract getFlowTestingDescription(); - - executeAll(isVtaas) { - describe(this.getFlowTestingDescription(), () => { - const page = new AppPage(); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.matchTitleText()).toBeTruthy(); - }); - - it('should navigate to AWS flow', () => { - page.getDeployOnAws().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - expect(browser.getCurrentUrl()).toEqual(`http://${PARAMS.SERVER_URL}/#/ui/aws/wizard`); - }) - - const flow = new Wizard(); - flow.navigateTo(); - - it('should display "Deploy Management Cluster on Amazon Web Services"', () => { - expect(flow.getTitleText()).toEqual('Deploy Management Cluster on Amazon Web Services'); - }); - - describe("provider step", () => { - const provider = new Provider(); - - it('should navigate to provider step', () => { - expect(provider.hasMovedToStep()).toBeTruthy(); - }) - - it('"CONNECT" button should be enabled', () => { - this.setCredentials(provider); - provider.selectOptionByText(provider.getRegion(), PARAMS.AWS_REGION); - expect(provider.getConectButton().isEnabled()).toBeTruthy(); - }) - - it('"CONNECT" button should display "CONNECTED"', () => { - provider.getConectButton().click(); - browser.waitForAngular(); - expect(provider.getConectButton().isEnabled()).toBeFalsy(); - expect(provider.getConectButton().getText()).toEqual('CONNECTED'); - }) - - it('Capture all user inputs', () => { - expect(true).toBeTruthy(); - }) - - afterAll(() => { - provider.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - this.executeVpcStep(); - - describe("Control Plane Settings step", () => { - const nodeSettings = new NodeSettings(); - const nodeOpt = new NodeOpt(); - - it('should have moved to this step', () => { - expect(nodeSettings.hasMovedToStep()).toBeTruthy(); - }) - - if (PARAMS.CONTROL_PLANE_TYPE === 'dev') { - it('should display "Development cluster selected: 1 node control plane"', () => { - nodeSettings.selectDatalistByText("devInstanceType", PARAMS.AWS_MC_TYPE); - expect(nodeSettings.getTitleText()).toEqual('Development cluster selected: 1 node control plane'); - }) - - it('should be able to select instance type and availability zone', () => { - nodeSettings.getMCName().clear(); - nodeSettings.getMCName().sendKeys(PARAMS.MC_NAME); - nodeSettings.selectDatalistByText("workerNodeInstanceType", PARAMS.AWS_WC_TYPE); - nodeSettings.getSshKeyName().clear(); - nodeSettings.getSshKeyName().sendKeys(PARAMS.AWS_SSH_KEY_NAME); - nodeSettings.selectOptionByText(nodeSettings.getAvailabilityZone1(), PARAMS.AWS_AZ1); - this.selectSubnets(nodeSettings); - expect(true).toBeTruthy(); - }) - } else { - it('should display "Production cluster selected: 3 node control plane"', () => { - nodeSettings.selectDatalistByText("prodInstanceType", PARAMS.AWS_MC_TYPE); - expect(nodeSettings.getTitleText()).toEqual('Production cluster selected: 3 node control plane'); - }) - - it('should be able to select instance type and availability zone', () => { - nodeSettings.getMCName().clear(); - nodeSettings.getMCName().sendKeys(PARAMS.MC_NAME); - nodeSettings.selectDatalistByText("workerNodeInstanceType", PARAMS.AWS_WC_TYPE); - nodeSettings.getSshKeyName().clear(); - nodeSettings.getSshKeyName().sendKeys(PARAMS.AWS_SSH_KEY_NAME); - nodeOpt.getEnableAudit().click(); - nodeSettings.selectOptionByText(nodeSettings.getAvailabilityZone1(), PARAMS.AWS_AZ1); - nodeSettings.selectOptionByText(nodeSettings.getAvailabilityZone2(), PARAMS.AWS_AZ2); - nodeSettings.selectOptionByText(nodeSettings.getAvailabilityZone3(), PARAMS.AWS_AZ3); - this.selectSubnets(nodeSettings); - expect(true).toBeTruthy(); - }) - } - - afterAll(() => { - nodeSettings.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Metadata step", () => { - const metadata = new Metadata(); - - it('should have moved to this step', () => { - expect(metadata.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - metadata.getMCDescription().sendKeys("some-description"); - metadata.getMCLocation().sendKeys("some-location"); - metadata.getMCLabelsKey().sendKeys("somekey"); - metadata.getMCLabelsValue().sendKeys("someval"); - metadata.getMCLabelsAddButton().click(); - metadata.getMCLabelsKey().sendKeys("delete-this-key"); - metadata.getMCLabelsValue().sendKeys("delete-this-value"); - metadata.getMCLabelsAddButton().click(); - metadata.getMCLabelsDeleteButton("delete-this-key").click(); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - metadata.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Kubernetes Network step", () => { - const network = new Network(); - const networkproxy = new NetworkProxy(); - - it('should have moved to "Kubernetes Network" step', () => { - expect(network.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - this.setNetworkProxy(networkproxy); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - network.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - this.executeIdentityStep(); - - describe("OS Image step", () => { - const osImage = new OsImage(); - - it('should have moved to "OS Image" step', () => { - expect(osImage.hasMovedToStep()).toBeTruthy(); - }) - - it('OS image refresh should work', () => { - osImage.getRefreshButton().click(); - browser.waitForAngular(); - expect(osImage.getOsImageCount()).toBeGreaterThan(1); - osImage.selectOptionByIndex(osImage.getOsImages(), 2); - }) - - it('captures all user inputs', () => { - expect(true).toBeTruthy(); - }); - - afterAll(() => { - osImage.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - flow.executeCommonFlow(); - if (isVtaas === false) { - flow.executeDeployFlow(title); - } - }); - } - -} diff --git a/tkg/web/e2e/src/aws-flow/wizard-existing-vpc.e2e-spec.ts b/tkg/web/e2e/src/aws-flow/wizard-existing-vpc.e2e-spec.ts deleted file mode 100644 index d2fa0c8cc7..0000000000 --- a/tkg/web/e2e/src/aws-flow/wizard-existing-vpc.e2e-spec.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ExistingVpcCommon } from "./aws-existing-vpc-common"; - -const wizardoidc = new ExistingVpcCommon(); -wizardoidc.executeAll(false); diff --git a/tkg/web/e2e/src/aws-flow/wizard-new-vpc.e2e-spec.ts b/tkg/web/e2e/src/aws-flow/wizard-new-vpc.e2e-spec.ts deleted file mode 100644 index de1293c947..0000000000 --- a/tkg/web/e2e/src/aws-flow/wizard-new-vpc.e2e-spec.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { NewVpcCommon } from './aws-new-vpc-common'; - -const wizardldap = new NewVpcCommon(); -wizardldap.executeAll(false); diff --git a/tkg/web/e2e/src/aws-flow/wizard.po.ts b/tkg/web/e2e/src/aws-flow/wizard.po.ts deleted file mode 100644 index 2a2d70a7ae..0000000000 --- a/tkg/web/e2e/src/aws-flow/wizard.po.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { WizardBase } from '../wizard-base.po'; - -export class Wizard extends WizardBase { - - navigateTo() { - browser.get(`http://${browser.params.SERVER_URL}/#/ui/aws/wizard`); - } - - getTitleText() { - return element(by.css('aws-wizard h2')).getText() as Promise; - } - -} diff --git a/tkg/web/e2e/src/azure-flow/azure-existing-vnet-common.ts b/tkg/web/e2e/src/azure-flow/azure-existing-vnet-common.ts deleted file mode 100644 index 0ef67e561c..0000000000 --- a/tkg/web/e2e/src/azure-flow/azure-existing-vnet-common.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Provider } from './provider.po'; -import { NodeSettings } from './node-settings.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import WizardCommon from "./wizard-common"; -import { Vnet } from './vnet.po'; -import { browser } from 'protractor'; -import { NetworkProxy } from '../common/networkproxy.po'; -import { Identity } from '../common/identity.po' - -export class ExistingVnetCommon extends WizardCommon { - getFlowTestingDescription() { - return "Azure flow (existing VNet)" - } - - setProvideResourceGroup(step: Provider) { - step.selectExistingResourceGroup().click(); - browser.waitForAngular(); - step.selectOptionByText(step.selectExistingResourceGroup(), PARAMS.AZURE_RESOURCE_GROUP) - } - - setNetworkProxy(step: NetworkProxy) { - // Do nothing as it is not enabled - } - - executeVnetStep() { - describe("VNet for Azure step", () => { - const vnet = new Vnet(); - - it('should have moved to VNet for Azure step', () => { - expect(vnet.hasMovedToStep()).toBeTruthy(); - }) - - it('should be able to select an existing VNet', () => { - vnet.getSelectAnExistingVnet().click(); - browser.waitForAngular(); - vnet.selectOptionByText(vnet.getResourceGroup(), PARAMS.AZURE_RESOURCE_GROUP); - vnet.selectOptionByText(vnet.getVnetNameExisting(), PARAMS.AZURE_VNET); - browser.waitForAngular(); - }); - - it('Capture all user inputs', () => { - vnet.selectOptionByText(vnet.getControlPlaneSubnet(), PARAMS.AZURE_MASTER_SUBNET); - vnet.selectOptionByText(vnet.getWorkerNodeSubnet(), PARAMS.AZURE_WORKER_SUBNET); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - vnet.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - - executeIdentityStep() { - describe("Identity step", () => { - const identity = new Identity(); - - it('should have moved to this step', () => { - expect(identity.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - identity.getIssuerURLInput().sendKeys("https://my-url.com"); - identity.getClientIdInput().sendKeys("some-client-id"); - identity.getClientSecretInput().sendKeys("some-client-secret"); - identity.getScopesInput().sendKeys("openid, offline_access"); - identity.getOidcUsernameClaim().sendKeys("some-username"); - identity.getOidcGroupsClaim().sendKeys("some-group"); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - identity.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } -} diff --git a/tkg/web/e2e/src/azure-flow/azure-new-vnet-common.ts b/tkg/web/e2e/src/azure-flow/azure-new-vnet-common.ts deleted file mode 100644 index 2ef285d620..0000000000 --- a/tkg/web/e2e/src/azure-flow/azure-new-vnet-common.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Provider } from './provider.po'; -import { NodeSettings } from './node-settings.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import WizardCommon from "./wizard-common"; -import { Vnet } from './vnet.po'; -import { NetworkProxy } from '../common/networkproxy.po'; -import { browser } from 'protractor'; -import { Identity } from '../common/identity.po' - -export class NewVnetCommon extends WizardCommon { - - getFlowTestingDescription() { - return "Azure flow (new VNet)" - } - - setProvideResourceGroup(step: Provider) { - step.getCreateNewResourceGroup().click(); - browser.waitForAngular(); - step.getCustomResourceGroup().clear(); - step.getCustomResourceGroup().sendKeys("my-resource-group") - } - - setNetworkProxy(step: NetworkProxy) { - step.getProxyButton().click(); - browser.waitForAngular(); - step.getHttpProxyUrl().sendKeys(PARAMS.DEFAULT_PROXY_HTTP_URL); - step.getIsSameAsHttp().click(); - } - - executeVnetStep() { - describe("VNet for Azure step", () => { - const vnet = new Vnet(); - - it('should have moved to VNet for Azure step', () => { - expect(vnet.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - vnet.getCreateNewVnet().click(); - vnet.selectOptionByText(vnet.getResourceGroup(), "my-resource-group"); - vnet.getVnetName().clear(); - vnet.getVnetName().sendKeys("my-vnet"); - expect(vnet.getVnetCidrText()).toEqual("10.0.0.0/16"); - vnet.getControlPlaneSubnetNew().sendKeys("control-plane-subnet"); - expect(vnet.getControlPlaneSubnetCidrNewText()).toEqual("10.0.0.0/24"); - vnet.getControlPlaneSubnetCidrNew().clear(); - vnet.getControlPlaneSubnetCidrNew().sendKeys("10.0.0.0/24"); - vnet.getWorkerNodeSubnetNew().sendKeys("worker-node-subnet"); - expect(vnet.getWorkerNodeSubnetCidrNewText()).toEqual("10.0.1.0/24"); - vnet.getWorkerNodeSubnetCidrNew().clear(); - vnet.getWorkerNodeSubnetCidrNew().sendKeys("10.0.1.0/24"); - vnet.getPrivateCluster().click(); - vnet.getPrivateIP().sendKeys(PARAMS.AZURE_PRIVATE_IP); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - vnet.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - - executeIdentityStep() { - describe("Identity step", () => { - const identity = new Identity(); - - it('should have moved to this step', () => { - expect(identity.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - identity.getLDAPRadioButton().click(); - identity.getLdapIP().sendKeys(PARAMS.LDAP_IP); - identity.getLdapPort().sendKeys(PARAMS.LDAP_PORT); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - identity.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - -} diff --git a/tkg/web/e2e/src/azure-flow/network.po.ts b/tkg/web/e2e/src/azure-flow/network.po.ts deleted file mode 100644 index 6644f9e457..0000000000 --- a/tkg/web/e2e/src/azure-flow/network.po.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Network extends Step { - hasMovedToStep() { - return this.getClusterPodCidr().isPresent(); - } - - getClusterPodCidr() { - return element(by.css('input[formcontrolname="clusterPodCidr"]')); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="networkForm"] clr-step-description')).getText() as Promise; - } - -} diff --git a/tkg/web/e2e/src/azure-flow/node-settings.po.ts b/tkg/web/e2e/src/azure-flow/node-settings.po.ts deleted file mode 100644 index 90acb49190..0000000000 --- a/tkg/web/e2e/src/azure-flow/node-settings.po.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class NodeSettings extends Step { - hasMovedToStep() { - return this.getDevSelect().isPresent(); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="azureNodeSettingForm"] clr-step-description')).getText() as Promise; - } - - getDevSelect() { - return element(by.css('select[name="devInstanceType"]')); - } - - getProdSelect() { - return element(by.css('select[name="prodInstanceType"]')); - } - - getMCName() { - return element(by.css('input[formcontrolname="managementClusterName"]')); - } - - getWorkNodeInstanceType() { - return element(by.css('select[name="workerNodeInstanceType"]')); - } -} diff --git a/tkg/web/e2e/src/azure-flow/provider.po.ts b/tkg/web/e2e/src/azure-flow/provider.po.ts deleted file mode 100644 index cb5ed384d5..0000000000 --- a/tkg/web/e2e/src/azure-flow/provider.po.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Provider extends Step { - hasMovedToStep() { - throw new Error("Method not implemented."); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="azureProviderForm"] clr-step-description')).getText() as Promise; - } - - getTenantId() { - return element(by.css('input[formcontrolname="tenantId"]')); - } - - getClientId() { - return element(by.css('input[formcontrolname="clientId"]')); - } - - getClientSecret() { - return element(by.css('input[formcontrolname="clientSecret"]')); - } - - getSubscriptionId() { - return element(by.css('input[formcontrolname="subscriptionId"]')); - } - - getSshPublicKey() { - return element(by.css('textarea[formControlName="sshPublicKey"]')); - } - - getRegion() { - return element(by.css('select[name="region"]')); - } - - getAzureCloud() { - return element(by.css('select[name="azureCloud"]')); - } - - getCreateNewResourceGroup() { - return element(by.cssContainingText("label", "Create a new resource group")); - } - - getCustomResourceGroup() { - return element(by.css('input[formControlName="resourceGroupCustom"]')); - } - - getExistingResourceGroup() { - return element(by.cssContainingText("label", "Select an existing resource group")); - } - - selectExistingResourceGroup() { - return element(by.css('select[name=\"resourceGroupExisting\"]')); - } - - getConectButton() { - return element(by.id('btn-azure-provider-connect')); - } -} diff --git a/tkg/web/e2e/src/azure-flow/vnet.po.ts b/tkg/web/e2e/src/azure-flow/vnet.po.ts deleted file mode 100644 index b16e91129a..0000000000 --- a/tkg/web/e2e/src/azure-flow/vnet.po.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Vnet extends Step { - hasMovedToStep() { - return this.getSelectAnExistingVnet().isPresent(); - } - - getSelectAnExistingVnet() { - return element(by.cssContainingText("label", "Select an existing VNet")); - } - - getCreateNewVnet() { - return element(by.cssContainingText("label", "Create a new VNet on Azure")); - } - - getResourceGroup() { - return element(by.css('select[formControlName="resourceGroup"]')) - } - - getVnetName() { - return element(by.css('input[formControlName="vnetNameCustom"]')) - } - - getVnetNameExisting() { - return element(by.css('select[formControlName="vnetNameExisting"]')) - } - - getVnetCidrText() { - return element(by.css('input[formControlName="vnetCidrBlock"]')).getAttribute('value') as Promise; - } - - getControlPlaneSubnet() { - return element(by.css('select[formControlName="controlPlaneSubnet"]')) - } - - getWorkerNodeSubnet() { - return element(by.css('select[formControlName="workerNodeSubnet"]')) - } - - getControlPlaneSubnetNew() { - return element(by.css('input[formControlName="controlPlaneSubnetNew"]')) - } - - getControlPlaneSubnetCidrNew() { - return element(by.css('input[formControlName="controlPlaneSubnetCidrNew"]')) - } - - getControlPlaneSubnetCidrNewText() { - return element(by.css('input[formControlName="controlPlaneSubnetCidrNew"]')).getAttribute('value') as Promise; - } - - getWorkerNodeSubnetNew() { - return element(by.css('input[formControlName="workerNodeSubnetNew"]')) - } - - getWorkerNodeSubnetCidrNew() { - return element(by.css('input[formControlName="workerNodeSubnetCidrNew"]')) - } - - getWorkerNodeSubnetCidrNewText() { - return element(by.css('input[formControlName="workerNodeSubnetCidrNew"]')).getAttribute('value') as Promise; - } - - getPrivateCluster() { - return element(by.cssContainingText("label", "PRIVATE AZURE CLUSTER")); - } - - getPrivateIP() { - return element(by.css('input[formControlName="privateIP"]')) - } -} diff --git a/tkg/web/e2e/src/azure-flow/vtaas-existing-vnet.e2e-spec.ts b/tkg/web/e2e/src/azure-flow/vtaas-existing-vnet.e2e-spec.ts deleted file mode 100644 index 658b2a66bc..0000000000 --- a/tkg/web/e2e/src/azure-flow/vtaas-existing-vnet.e2e-spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ExistingVnetCommon } from './azure-existing-vnet-common'; -import { VtaasCommon } from '../common/vtaas-common'; -import vtaas_list from '../common/vtaas_list'; - -const steps = vtaas_list.stepper; -const lists = vtaas_list.azure_step_list; -const testname = 'TKGm Azure(existing vnet) UI Accessibility Test'; -const wizardoidc = new ExistingVnetCommon(); -const vtaasExe = new VtaasCommon(steps, lists, testname); - -wizardoidc.getFlowTestingDescription = () => { - return "Azure vTaas flow (Existing Vnet)" -}; -wizardoidc.executeAll(true); -vtaasExe.executeVtaas(); diff --git a/tkg/web/e2e/src/azure-flow/vtaas-new-vnet.e2e-spec.ts b/tkg/web/e2e/src/azure-flow/vtaas-new-vnet.e2e-spec.ts deleted file mode 100644 index de1dedcae9..0000000000 --- a/tkg/web/e2e/src/azure-flow/vtaas-new-vnet.e2e-spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { NewVnetCommon } from './azure-new-vnet-common'; -import { VtaasCommon } from '../common/vtaas-common'; -import vtaas_list from '../common/vtaas_list'; - -const steps = vtaas_list.stepper; -const lists = vtaas_list.azure_step_list; -const testname = 'TKGm Azure(new vnet) UI Accessibility Test'; -const wizardldap = new NewVnetCommon(); -const vtaasExe = new VtaasCommon(steps, lists, testname); - -wizardldap.getFlowTestingDescription = () => { - return "Azure vTaas flow (New Vnet)" -}; -wizardldap.executeAll(true); -vtaasExe.executeVtaas(); diff --git a/tkg/web/e2e/src/azure-flow/wizard-common.ts b/tkg/web/e2e/src/azure-flow/wizard-common.ts deleted file mode 100644 index b4136c7967..0000000000 --- a/tkg/web/e2e/src/azure-flow/wizard-common.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { NodeSettings } from './node-settings.po'; -import { Provider } from './provider.po'; -import { browser, Key } from 'protractor'; -import { Wizard } from './wizard.po'; -import { NodeOpt } from '../common/node-setting-opt.po'; -import { Network } from './network.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import { AppPage } from '../app.po'; -import { OsImage } from '../common/osimage.po'; -import { Metadata } from '../common/metadata.po' -import { NetworkProxy } from '../common/networkproxy.po' -import { Identity } from '../common/identity.po'; - -const title = 'Deploying Tanzu Community Edition on Azure'; - -export default abstract class WizardCommon { - - abstract setProvideResourceGroup(step: Provider); - abstract executeVnetStep(); - abstract setNetworkProxy(step: NetworkProxy); - abstract executeIdentityStep(); - abstract getFlowTestingDescription(); - - executeAll(isVtaas) { - describe(this.getFlowTestingDescription(), () => { - const page = new AppPage(); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.matchTitleText()).toBeTruthy(); - }); - - it('should navigate to Azure flow', () => { - page.getDeployOnAzure().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - expect(browser.getCurrentUrl()).toEqual(`http://${PARAMS.SERVER_URL}/#/ui/azure/wizard`); - }) - - const flow = new Wizard(); - flow.navigateTo(); - - it('should display "Deploy Management Cluster on Azure"', () => { - expect(flow.getTitleText()).toEqual('Deploy Management Cluster on Azure'); - }); - - describe("provider step", () => { - const provider = new Provider(); - - it('should display "Validate the Azure provider credentials for Tanzu Kubernetes Grid"', () => { - provider.getTenantId().sendKeys(Key.chord(Key.CONTROL, "a")); - provider.getTenantId().sendKeys(Key.BACK_SPACE); - provider.getTenantId().clear(); - provider.getClientId().clear(); - provider.getClientSecret().clear(); - provider.getSubscriptionId().clear(); - expect(provider.getTitleText()).toEqual('Validate the Azure provider credentials for Tanzu Kubernetes Grid'); - }) - - it('"CONNECT" button should be enabled', () => { - provider.getTenantId().sendKeys(PARAMS.AZURE_TENANT_ID); - provider.getClientId().sendKeys(PARAMS.AZURE_CLIENT_ID); - provider.getClientSecret().sendKeys(PARAMS.AZURE_CLIENT_SECRET); - provider.getSubscriptionId().sendKeys(PARAMS.AZURE_SUBSCRIPTION_ID); - provider.selectOptionByText(provider.getAzureCloud(), PARAMS.AZURE_CLOUD); - expect(provider.getConectButton().isEnabled()).toBeTruthy(); - expect(provider.getTitleText()).toEqual('Azure tenant: ' + PARAMS.AZURE_TENANT_ID); - }) - - it('"CONNECT" button should display "CONNECTED"', () => { - provider.getConectButton().click(); - browser.waitForAngular(); - expect(provider.getConectButton().isEnabled()).toBeFalsy(); - expect(provider.getConectButton().getText()).toEqual('CONNECTED'); - }) - - it('Capture all user inputs', () => { - provider.selectOptionByText(provider.getRegion(), PARAMS.AZURE_REGION); - provider.getSshPublicKey().clear(); - provider.getSshPublicKey().sendKeys(PARAMS.AZURE_SSH_PUBLIC_KEY_B64); - this.setProvideResourceGroup(provider); - expect(true).toBeTruthy(); - }) - - afterAll(() => { - provider.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - this.executeVnetStep(); - - describe("Control Plane Settings step", () => { - const nodeSettings = new NodeSettings(); - const nodeOpt = new NodeOpt(); - - it('should have moved to this step', () => { - expect(nodeSettings.hasMovedToStep()).toBeTruthy(); - }) - - if (PARAMS.CONTROL_PLANE_TYPE === 'dev') { - it('should display "Control plane type: dev"', () => { - const devSelect = nodeSettings.getDevSelect(); - nodeSettings.selectOptionByText(devSelect, PARAMS.AZURE_MC_TYPE); - expect(nodeSettings.getTitleText()).toEqual('Control plane type: dev'); - }) - - it('should be able to select instance type', () => { - nodeSettings.getMCName().clear(); - nodeSettings.getMCName().sendKeys(PARAMS.MC_NAME); - nodeSettings.selectOptionByText(nodeSettings.getWorkNodeInstanceType(), PARAMS.AZURE_WC_TYPE); - nodeOpt.getEnableAudit().click(); - expect(true).toBeTruthy(); - }) - } else { - it('should display "Control plane type: prod"', () => { - const prodSelect = nodeSettings.getProdSelect(); - nodeSettings.selectOptionByText(prodSelect, PARAMS.AZURE_MC_TYPE); - expect(nodeSettings.getTitleText()).toEqual('Control plane type: prod'); - }) - - it('should be able to select instance type', () => { - nodeSettings.getMCName().clear(); - nodeSettings.getMCName().sendKeys(PARAMS.MC_NAME); - nodeSettings.selectOptionByText(nodeSettings.getWorkNodeInstanceType(), PARAMS.AZURE_WC_TYPE); - nodeOpt.getEnableAudit().click(); - expect(true).toBeTruthy(); - }) - } - afterAll(() => { - nodeSettings.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Metadata step", () => { - const metadata = new Metadata(); - - it('should have moved to this step', () => { - expect(metadata.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - metadata.getMCDescription().sendKeys("some-description"); - metadata.getMCLocation().sendKeys("some-location"); - metadata.getMCLabelsKey().sendKeys("somekey"); - metadata.getMCLabelsValue().sendKeys("someval"); - metadata.getMCLabelsAddButton().click(); - metadata.getMCLabelsKey().sendKeys("delete-this-key"); - metadata.getMCLabelsValue().sendKeys("delete-this-value"); - metadata.getMCLabelsAddButton().click(); - metadata.getMCLabelsDeleteButton("delete-this-key").click(); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - metadata.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Kubernetes Network step", () => { - const network = new Network(); - const networkproxy = new NetworkProxy(); - - it('should have moved to "Kubernetes Network" step', () => { - expect(network.hasMovedToStep()).toBeTruthy(); - }) - - it('captures all user inputs', () => { - this.setNetworkProxy(networkproxy); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - network.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - this.executeIdentityStep(); - - describe("OS Image step", () => { - const osImage = new OsImage(); - - it('should have moved to "OS Image" step', () => { - expect(osImage.hasMovedToStep()).toBeTruthy(); - }) - - it('OS image refresh should work', () => { - osImage.getRefreshButton().click(); - browser.waitForAngular(); - expect(osImage.getOsImageCount()).toBeGreaterThan(1); - osImage.selectOptionByIndex(osImage.getOsImages(), 2); - }) - - it('captures all user inputs', () => { - expect(true).toBeTruthy(); - }); - - afterAll(() => { - osImage.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - flow.executeCommonFlow(); - if (isVtaas === false) { - flow.executeDeployFlow(title); - } - }); - } - -} diff --git a/tkg/web/e2e/src/azure-flow/wizard-existing-vnet.e2e-spec.ts b/tkg/web/e2e/src/azure-flow/wizard-existing-vnet.e2e-spec.ts deleted file mode 100644 index 169c3dc669..0000000000 --- a/tkg/web/e2e/src/azure-flow/wizard-existing-vnet.e2e-spec.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ExistingVnetCommon } from './azure-existing-vnet-common'; - -const wizardoidc = new ExistingVnetCommon(); -wizardoidc.executeAll(false); diff --git a/tkg/web/e2e/src/azure-flow/wizard-new-vnet.e2e-spec.ts b/tkg/web/e2e/src/azure-flow/wizard-new-vnet.e2e-spec.ts deleted file mode 100644 index 312b1c61b7..0000000000 --- a/tkg/web/e2e/src/azure-flow/wizard-new-vnet.e2e-spec.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { NewVnetCommon } from './azure-new-vnet-common'; - -const wizardldap = new NewVnetCommon(); -wizardldap.executeAll(false); diff --git a/tkg/web/e2e/src/azure-flow/wizard.po.ts b/tkg/web/e2e/src/azure-flow/wizard.po.ts deleted file mode 100644 index 292beaa71c..0000000000 --- a/tkg/web/e2e/src/azure-flow/wizard.po.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { WizardBase } from '../wizard-base.po'; - -export class Wizard extends WizardBase { - - navigateTo() { - browser.get(`http://${browser.params.SERVER_URL}/#/ui/azure/wizard`); - } - - getTitleText() { - return element(by.id('azure-title')).getText() as Promise; - } - -} diff --git a/tkg/web/e2e/src/common/ceip.po.ts b/tkg/web/e2e/src/common/ceip.po.ts deleted file mode 100644 index 83aa3d5b74..0000000000 --- a/tkg/web/e2e/src/common/ceip.po.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Ceip extends Step { - hasMovedToStep() { - return this.getCeipCheckbox().isPresent(); - } - - getCeipCheckbox() { - return element(by.css('input[formcontrolname="ceipOptIn"]')); - } -} diff --git a/tkg/web/e2e/src/common/identity.po.ts b/tkg/web/e2e/src/common/identity.po.ts deleted file mode 100644 index dca1612362..0000000000 --- a/tkg/web/e2e/src/common/identity.po.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Identity extends Step { - hasMovedToStep() { - return this.getOIDCRadioButton().isPresent(); - } - - getOIDCRadioButton() { - return element(by.cssContainingText("label", "OIDC")); - } - - getLDAPRadioButton() { - return element(by.cssContainingText("label", "LDAP")); - } - - getPorviderNameInput() { - return element(by.css('input[formcontrolname="providerName"]')); - } - - getIssuerURLInput() { - return element(by.css('input[formcontrolname="issuerURL"]')); - } - - getClientIdInput() { - return element(by.css('input[formcontrolname="clientId"]')); - } - - getClientSecretInput() { - return element(by.css('input[formcontrolname="clientSecret"]')); - } - - getScopesInput() { - return element(by.css('input[formcontrolname="scopes"]')); - } - - getOidcUsernameClaim() { - return element(by.css('input[formcontrolname="oidcUsernameClaim"]')); - } - - getOidcGroupsClaim() { - return element(by.css('input[formcontrolname="oidcGroupsClaim"]')); - } - - getOIDCLabelsKey() { - return element(by.css('input[formcontrolname="newOidcClaimKey"]')); - } - - getOIDCLabelsValue() { - return element(by.css('input[formcontrolname="newOidcClaimValue"]')); - } - - getOIDCLabelsAddButton() { - return element(by.buttonText('ADD')); - } - - getOIDCLabelsDeleteButton(key: string) { - const id = "claim-delete-" + key; - return element(by.id(id)); - } - - getSkipVerifyCertificateCheckbox() { - return element(by.cssContainingText("label", "Skip verify certificate")); - } - - getLdapIP() { - return element(by.css('input[formcontrolname="endpointIp"]')); - } - - getLdapPort() { - return element(by.css('input[formcontrolname="endpointPort"]')); - } - - getRootCAData() { - return element(by.css('textarea[formcontrolname="rootCAData"]')); - } - -} diff --git a/tkg/web/e2e/src/common/metadata.po.ts b/tkg/web/e2e/src/common/metadata.po.ts deleted file mode 100644 index 63d09516c2..0000000000 --- a/tkg/web/e2e/src/common/metadata.po.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Metadata extends Step { - hasMovedToStep() { - return this.getMCDescription().isPresent(); - } - - getMCDescription() { - return element(by.css('textarea[formcontrolname="clusterDescription"]')); - } - - getMCLocation() { - return element(by.css('input[formcontrolname="clusterLocation"]')); - } - - getMCLabelsKey() { - return element(by.css('input[formcontrolname="newLabelKey"]')); - } - - getMCLabelsValue() { - return element(by.css('input[formcontrolname="newLabelValue"]')); - } - - getMCLabelsAddButton() { - return element(by.buttonText('ADD')); - } - - getMCLabelsDeleteButton(key: string) { - const id = "label-delete-" + key; - return element(by.id(id)); - } - -} diff --git a/tkg/web/e2e/src/common/networkproxy.po.ts b/tkg/web/e2e/src/common/networkproxy.po.ts deleted file mode 100644 index be1e8b7017..0000000000 --- a/tkg/web/e2e/src/common/networkproxy.po.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class NetworkProxy extends Step { - hasMovedToStep() { - return this.getHttpProxyUrl().isPresent(); - } - - getProxyButton() { - return element(by.cssContainingText('label', 'Enable Proxy Settings')); - } - - getHttpProxyUrl() { - return element(by.css('input[formcontrolname="httpProxyUrl"]')); - } - - getHttpProxyUsername() { - return element(by.css('input[formcontrolname="httpProxyUsername"]')); - } - - getHttpProxyPassword() { - return element(by.css('input[formcontrolname="httpProxyPassword"]')); - } - - getIsSameAsHttp() { - return element(by.cssContainingText('label', 'Use same configuration for https proxy')); - } - - getNoProxy() { - return element(by.css('input[formcontrolname="noProxy"]')); - } - -} diff --git a/tkg/web/e2e/src/common/node-setting-opt.po.ts b/tkg/web/e2e/src/common/node-setting-opt.po.ts deleted file mode 100644 index 6d57ebb621..0000000000 --- a/tkg/web/e2e/src/common/node-setting-opt.po.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class NodeOpt extends Step { - hasMovedToStep() { - return this.getEnableMHC().isPresent(); - } - - getEnableAudit() { - return element(by.css('app-audit-logging clr-checkbox-wrapper label')); - } - - getEnableMHC() { - return element(by.css('input[formcontrolname="machineHealthChecksEnabled"]')); - } - - getEnableBH() { - return element(by.css('input[formcontrolname="bastionHostEnabled"]')); - } -} diff --git a/tkg/web/e2e/src/common/osimage.po.ts b/tkg/web/e2e/src/common/osimage.po.ts deleted file mode 100644 index 762f9e0510..0000000000 --- a/tkg/web/e2e/src/common/osimage.po.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class OsImage extends Step { - hasMovedToStep() { - return this.getOsImages().isPresent(); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="osImageForm"] clr-step-description')).getText() as Promise; - } - - getOsImages() { - return element(by.css('select[formcontrolname="osImage"]')); - } - - getRefreshButton() { - return element(by.css('app-os-image-step clr-icon[shape="refresh"]')); - } - - getOsImageCount() { - return element.all(by.css('select[name="osImage"] option')).count(); - } -} diff --git a/tkg/web/e2e/src/common/step-expand.po.ts b/tkg/web/e2e/src/common/step-expand.po.ts deleted file mode 100644 index 6c579b8c26..0000000000 --- a/tkg/web/e2e/src/common/step-expand.po.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { browser, by, element, protractor } from 'protractor'; -import { Step } from '../step.po'; - -export class Stepper extends Step { - hasMovedToStep() { - return this.isClickable(element(by.buttonText("REVIEW CONFIGURATION"))); - } - - isClickable(target) { - return protractor.ExpectedConditions.elementToBeClickable(target); - } - - getProviderStep() { - return element(by.cssContainingText('clr-step-title', 'IaaS Provider')); - } - - getVpcStep() { - return element(by.cssContainingText('clr-step-title', 'VPC for AWS')); - } - - getVnetStep() { - return element(by.cssContainingText('clr-step-title', 'Azure VNet Settings')); - } - - getNodeSettingsStep() { - return element(by.cssContainingText('clr-step-title', 'Management Cluster Settings')); - } - - getNsxLbStep() { - return element(by.cssContainingText('clr-step-title', 'VMware NSX Advanced Load Balancer')); - } - - getResourceStep() { - return element(by.cssContainingText('clr-step-title', 'Resources')); - } - - getMetadataStep() { - return element(by.cssContainingText('clr-step-title', 'Metadata')); - } - - getNetworkStep() { - return element(by.cssContainingText('clr-step-title', 'Kubernetes Network')); - } - - getIdentityStep() { - return element(by.cssContainingText('clr-step-title', 'Identity Management')); - } - - getOsImageStep() { - return element(by.cssContainingText('clr-step-title', 'OS Image')); - } - - getTmcStep() { - return element(by.cssContainingText('clr-step-title', 'Register TMC')); - } - - getCeipStep() { - return element(by.cssContainingText('clr-step-title', 'CEIP Agreement')); - } - -} diff --git a/tkg/web/e2e/src/common/tmc-settings.po.ts b/tkg/web/e2e/src/common/tmc-settings.po.ts deleted file mode 100644 index 26108dde7a..0000000000 --- a/tkg/web/e2e/src/common/tmc-settings.po.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class TmcRegister extends Step { - hasMovedToStep() { - return this.getRegUrl().isPresent(); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="registerTmcForm"] clr-step-description')).getText() as Promise; - } - - getRegUrl() { - return element(by.css('input[formcontrolname="tmcRegUrl"]')); - } - - getTmcButton() { - return element(by.css('button.btn btn-sm')); - } - -} diff --git a/tkg/web/e2e/src/common/vtaas-common.ts b/tkg/web/e2e/src/common/vtaas-common.ts deleted file mode 100644 index 73bc8a7725..0000000000 --- a/tkg/web/e2e/src/common/vtaas-common.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { protractor, browser, ElementArrayFinder, ElementFinder, WebElement } from 'protractor'; -import { Stepper } from './step-expand.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; - -const accessibility = require('vtaas-accessibility').accessibilityProtractor; - -console.log(JSON.stringify(PARAMS, null, 4)); - -export class VtaasCommon { - - stepper: Stepper; - step_list: ElementFinder[]; - testname: string; - constructor(stepper, step_list, testname) { - this.stepper = stepper; - this.step_list = step_list; - this.testname = testname; - } - - executeVtaas() { - describe("Vtaas check step", () => { - beforeAll(async () => { - await accessibility.begin(browser, { - user: PARAMS.VTAAS_USER, - product: 'Tanzu Kubernetes Grid (TKG)', - testName: this.testname - }); - }); - - it('review button should be clickable', () => { - expect(this.stepper.hasMovedToStep()).toBeTruthy(); - }) - - it('expand all steps', () => { - for (let i = 0; i < this.step_list.length; i++) { - const cur_step = this.step_list[i]; - browser.wait(this.stepper.isClickable(cur_step), 5000).then(() => { - cur_step.click(); - }); - browser.sleep(200); - } - expect(true).toBeTruthy(); - accessibility.check(); - }); - - afterAll(() => { - accessibility.end((result) => { - console.log(result); - expect(result.result_summary.failed).toBe(0); - }); - }) - }); - } - -} diff --git a/tkg/web/e2e/src/common/vtaas_list.ts b/tkg/web/e2e/src/common/vtaas_list.ts deleted file mode 100644 index d5c3a57274..0000000000 --- a/tkg/web/e2e/src/common/vtaas_list.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ElementFinder } from 'protractor'; -import { Stepper } from './step-expand.po'; - -const stepper = new Stepper(); - -const aws_step_list = [ stepper.getProviderStep(), stepper.getVpcStep(), - stepper.getNodeSettingsStep(), stepper.getMetadataStep(), - stepper.getNetworkStep(), stepper.getIdentityStep(), - stepper.getTmcStep(), stepper.getCeipStep() -]; - -const azure_step_list = [ stepper.getProviderStep(), stepper.getVnetStep(), - stepper.getNodeSettingsStep(), stepper.getMetadataStep(), - stepper.getNetworkStep(), stepper.getIdentityStep(), - stepper.getTmcStep(), stepper.getCeipStep() -]; - -const vsphere_step_list = [ stepper.getProviderStep(), - stepper.getNodeSettingsStep(), stepper.getNsxLbStep(), - stepper.getMetadataStep(), stepper.getResourceStep(), - stepper.getNetworkStep(), stepper.getIdentityStep(), - stepper.getOsImageStep(), stepper.getTmcStep(), - stepper.getCeipStep() -] - -export default { - stepper, - aws_step_list, - azure_step_list, - vsphere_step_list -} diff --git a/tkg/web/e2e/src/docker-flow/docker-ldap-common.ts b/tkg/web/e2e/src/docker-flow/docker-ldap-common.ts deleted file mode 100644 index 05a4ef1f08..0000000000 --- a/tkg/web/e2e/src/docker-flow/docker-ldap-common.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Provider } from './provider.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import WizardCommon from "./wizard-common"; -import { browser } from 'protractor'; -import { NetworkProxy } from '../common/networkproxy.po'; -import { Identity } from '../common/identity.po' - -export class DockerLdapCommon extends WizardCommon { - - setNetworkProxy(step: NetworkProxy) { - step.getProxyButton().click(); - browser.waitForAngular(); - step.getHttpProxyUrl().sendKeys(PARAMS.DEFAULT_PROXY_HTTP_URL); - step.getIsSameAsHttp().click(); - } - - getFlowTestingDescription() { - return "Docker flow (Ldap)" - } - - executeIdentityStep() { - describe("Identity step", () => { - const identity = new Identity(); - - it('should have moved to this step', () => { - expect(identity.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - identity.getLDAPRadioButton().click(); - identity.getLdapIP().sendKeys(PARAMS.LDAP_IP); - identity.getLdapPort().sendKeys(PARAMS.LDAP_PORT); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - identity.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - -} diff --git a/tkg/web/e2e/src/docker-flow/docker-oidc-common.ts b/tkg/web/e2e/src/docker-flow/docker-oidc-common.ts deleted file mode 100644 index 05991e1c00..0000000000 --- a/tkg/web/e2e/src/docker-flow/docker-oidc-common.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Provider } from './provider.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import WizardCommon from "./wizard-common"; -import { browser } from 'protractor'; -import { NetworkProxy } from '../common/networkproxy.po'; -import { Identity } from '../common/identity.po' - -export class DockerOidcCommon extends WizardCommon { - - setNetworkProxy(step: NetworkProxy) { - // Do nothing as it is not enabled - } - - getFlowTestingDescription() { - return "Docker flow (Oidc)" - } - - executeIdentityStep() { - describe("Identity step", () => { - const identity = new Identity(); - - it('should have moved to this step', () => { - expect(identity.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - identity.getIssuerURLInput().sendKeys("https://my-url.com"); - identity.getClientIdInput().sendKeys("some-client-id"); - identity.getClientSecretInput().sendKeys("some-client-secret"); - identity.getScopesInput().sendKeys("openid, offline_access"); - identity.getOidcUsernameClaim().sendKeys("some-username"); - identity.getOidcGroupsClaim().sendKeys("some-group"); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - identity.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - -} diff --git a/tkg/web/e2e/src/docker-flow/network.po.ts b/tkg/web/e2e/src/docker-flow/network.po.ts deleted file mode 100644 index 6644f9e457..0000000000 --- a/tkg/web/e2e/src/docker-flow/network.po.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Network extends Step { - hasMovedToStep() { - return this.getClusterPodCidr().isPresent(); - } - - getClusterPodCidr() { - return element(by.css('input[formcontrolname="clusterPodCidr"]')); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="networkForm"] clr-step-description')).getText() as Promise; - } - -} diff --git a/tkg/web/e2e/src/docker-flow/provider.po.ts b/tkg/web/e2e/src/docker-flow/provider.po.ts deleted file mode 100644 index 75f2fecbf5..0000000000 --- a/tkg/web/e2e/src/docker-flow/provider.po.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Provider extends Step { - hasMovedToStep() { - throw new Error("Method not implemented."); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="dockerDaemonForm"] clr-step-description')).getText() as Promise; - } - -} diff --git a/tkg/web/e2e/src/docker-flow/vtaas-ldap.e2e-spec.ts b/tkg/web/e2e/src/docker-flow/vtaas-ldap.e2e-spec.ts deleted file mode 100644 index 211fbbbd67..0000000000 --- a/tkg/web/e2e/src/docker-flow/vtaas-ldap.e2e-spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { DockerLdapCommon } from './docker-ldap-common'; -import { VtaasCommon } from '../common/vtaas-common'; -import vtaas_list from '../common/vtaas_list'; - -const steps = vtaas_list.stepper; -const lists = vtaas_list.aws_step_list; -const testname = 'TKGm Docker(Ldap) UI Accessibility Test'; -const wizardldap = new DockerLdapCommon(); -const vtaasExe = new VtaasCommon(steps, lists, testname); - -wizardldap.getFlowTestingDescription = () => { - return "Docker vTaas flow (Ldap)" -}; -wizardldap.executeAll(true); -vtaasExe.executeVtaas(); diff --git a/tkg/web/e2e/src/docker-flow/vtaas-oidc.e2e-spec.ts b/tkg/web/e2e/src/docker-flow/vtaas-oidc.e2e-spec.ts deleted file mode 100644 index 5d124f4371..0000000000 --- a/tkg/web/e2e/src/docker-flow/vtaas-oidc.e2e-spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { DockerOidcCommon } from './docker-oidc-common'; -import { VtaasCommon } from '../common/vtaas-common'; -import vtaas_list from '../common/vtaas_list'; - -const steps = vtaas_list.stepper; -const lists = vtaas_list.aws_step_list; -const testname = 'TKGm Docker(Oidc) UI Accessibility Test'; -const wizardoidc = new DockerOidcCommon(); -const vtaasExe = new VtaasCommon(steps, lists, testname); - -wizardoidc.getFlowTestingDescription = () => { - return "Docker vTaas flow (Oidc)" -}; -wizardoidc.executeAll(true); -vtaasExe.executeVtaas(); diff --git a/tkg/web/e2e/src/docker-flow/wizard-common.ts b/tkg/web/e2e/src/docker-flow/wizard-common.ts deleted file mode 100644 index dd37b22456..0000000000 --- a/tkg/web/e2e/src/docker-flow/wizard-common.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Provider } from './provider.po'; -import { browser } from 'protractor'; -import { Wizard } from './wizard.po'; -import { Network } from './network.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import { AppPage } from '../app.po'; -import { Identity } from '../common/identity.po' -import { NetworkProxy } from '../common/networkproxy.po' - -const title = 'Deploying Tanzu Community Edition on Docker'; - -export default abstract class WizardCommon { - - abstract setNetworkProxy(step: NetworkProxy); - abstract executeIdentityStep(); - abstract getFlowTestingDescription(); - - executeAll(isVtaas) { - describe(this.getFlowTestingDescription(), () => { - const page = new AppPage(); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.matchTitleText()).toBeTruthy(); - }); - - it('should navigate to Docker flow', () => { - page.getDeployOnDocker().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - expect(browser.getCurrentUrl()).toEqual(`http://${PARAMS.SERVER_URL}/#/ui/docker/wizard`); - }) - - const flow = new Wizard(); - flow.navigateTo(); - - it('should display "Deploy Management Cluster on Docker"', () => { - expect(flow.getTitleText()).toEqual('Deploy Management Cluster on Docker'); - }); - - describe("provider step", () => { - const provider = new Provider(); - - it('should display "Validate the local Docker daemon"', () => { - expect(provider.getTitleText()).toEqual('Validate the local Docker daemon'); - }) - - it('Capture all user inputs', () => { - expect(true).toBeTruthy(); - }) - - afterAll(() => { - provider.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Kubernetes Network step", () => { - const network = new Network(); - const networkproxy = new NetworkProxy(); - - it('should have moved to "Kubernetes Network" step', () => { - expect(network.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - this.setNetworkProxy(networkproxy); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - network.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - // this.executeIdentityStep(); - - if (isVtaas === false) { - flow.executeDeployFlow(title); - } - }); - } - -} diff --git a/tkg/web/e2e/src/docker-flow/wizard-docker-ldap.e2e-spec.ts b/tkg/web/e2e/src/docker-flow/wizard-docker-ldap.e2e-spec.ts deleted file mode 100644 index 2e76782f32..0000000000 --- a/tkg/web/e2e/src/docker-flow/wizard-docker-ldap.e2e-spec.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { DockerLdapCommon } from './docker-ldap-common'; - -const wizardldap = new DockerLdapCommon(); -wizardldap.executeAll(false); diff --git a/tkg/web/e2e/src/docker-flow/wizard-docker-oidc.e2e-spec.ts b/tkg/web/e2e/src/docker-flow/wizard-docker-oidc.e2e-spec.ts deleted file mode 100644 index 8acbdea729..0000000000 --- a/tkg/web/e2e/src/docker-flow/wizard-docker-oidc.e2e-spec.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { DockerOidcCommon } from "./docker-oidc-common"; - -const wizardoidc = new DockerOidcCommon(); -wizardoidc.executeAll(false); diff --git a/tkg/web/e2e/src/docker-flow/wizard.po.ts b/tkg/web/e2e/src/docker-flow/wizard.po.ts deleted file mode 100644 index cb217f253a..0000000000 --- a/tkg/web/e2e/src/docker-flow/wizard.po.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { WizardBase } from '../wizard-base.po'; - -export class Wizard extends WizardBase { - - navigateTo() { - browser.get(`http://${browser.params.SERVER_URL}/#/ui/docker/wizard`); - } - - getTitleText() { - return element(by.css('app-docker-wizard h2')).getText() as Promise; - } - -} diff --git a/tkg/web/e2e/src/report.css b/tkg/web/e2e/src/report.css deleted file mode 100644 index 88a6444104..0000000000 --- a/tkg/web/e2e/src/report.css +++ /dev/null @@ -1,34 +0,0 @@ -body { - font-family: Arial; -} - -ul { - list-style-position: inside; -} - -li img { - max-width: 100%; -} - -span.passed { - padding: 0 1em; - color: green; -} - -span.failed { - padding: 0 1em; - color: red; -} - -span.pending { - padding: 0 1em; - color: orange; -} - -span.stacktrace { - white-space: pre; - border: 1px solid rgb(0, 0, 0); - font-size: 9pt; - padding: 4px; - background-color: rgb(204, 204, 204); -} \ No newline at end of file diff --git a/tkg/web/e2e/src/report.js b/tkg/web/e2e/src/report.js deleted file mode 100644 index 8137e30acb..0000000000 --- a/tkg/web/e2e/src/report.js +++ /dev/null @@ -1,39 +0,0 @@ -function showhide(id) { - var e = document.getElementById(id); - e.style.display = (e.style.display === "block") ? "none" : "block"; -} - -function buildQuickLinks() { - var failedSpecs = document.querySelectorAll("li.failed"); - var quickLinksContainer = document.getElementById("quickLinks"); - if (!quickLinksContainer) return; - if (failedSpecs.length > 0) { - document.getElementById("quickLinksHeader").textContent = "Quicklink of Failure" - } - for (var i = 0; i < failedSpecs.length; ++i) { - var li = document.createElement("li"); - var a = document.createElement("a"); - a.href = "#" + failedSpecs[i].id; - a.textContent = failedSpecs[i].dataset.name + " (" + failedSpecs[i].dataset.browser + ")"; - li.appendChild(a); - quickLinksContainer.appendChild(li); - } -} - -function updatePassCount() { - var totalPassed = document.querySelectorAll("li.passed").length; - var totalFailed = document.querySelectorAll("li.failed").length; - var totalSpecs = totalFailed + totalPassed; - console.log("passed: %s, failed: %s, total: %s", totalPassed, totalFailed, totalSpecs); - document.getElementById("summaryTotalSpecs").textContent = document.getElementById("summaryTotalSpecs").textContent + totalSpecs; - document.getElementById("summaryTotalFailed").textContent = document.getElementById("summaryTotalFailed").textContent + totalFailed; - if (totalFailed) { - document.getElementById("summary").className = "failed"; - } -} - -function start() { - updatePassCount(); - buildQuickLinks(); -} -window.onload = start; \ No newline at end of file diff --git a/tkg/web/e2e/src/ssr.js b/tkg/web/e2e/src/ssr.js deleted file mode 100644 index b9da57fd90..0000000000 --- a/tkg/web/e2e/src/ssr.js +++ /dev/null @@ -1,27 +0,0 @@ -const puppeteer = require('puppeteer'); -const fse = require('fs-extra'); - -async function run() { - const browser = await puppeteer.launch(); - const page = await browser.newPage(); - - const filePath = `${process.env.PWD}/index.html`; - - await page.goto(`file:///${process.env.PWD}/reports/index.html`, { waitUntil: 'networkidle0' }); - - const html = await page.content(); - await fse.outputFile(filePath, html); - - try { - // Overwrite the existing html with the prerendered one - fse.moveSync(filePath, `${process.env.PWD}/reports/index.html`, { overwrite: true }); - fse.copySync("./src/report.css", `${process.env.PWD}/reports/report.css`, { overwrite: true }); - fse.copySync("./src/report.js", `${process.env.PWD}/reports/report.js`, { overwrite: true }); - } catch (e) { - console.log(e); - } - - browser.close(); -} - -run(); \ No newline at end of file diff --git a/tkg/web/e2e/src/step.po.ts b/tkg/web/e2e/src/step.po.ts deleted file mode 100644 index 364a25763b..0000000000 --- a/tkg/web/e2e/src/step.po.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { element, by } from 'protractor'; - -export abstract class Step { - - getNextButton() { - return element(by.buttonText('next')); - } - - /** - * Selects an option based on containing text - * @param selectElement the 'select' element - * @param text the 'text' to be matched for - */ - selectOptionByText(selectElement, text) { - selectElement.element(by.cssContainingText('option', text)).click(); - } - - /** - * Selects an option based on its index - * @param selectElement the 'select' element - * @param optionIndex the index of the option to be selected, starting with 1. - */ - selectOptionByIndex(selectElement, optionIndex) { - selectElement.element(by.css(`option:nth-child(${optionIndex})`)).click(); - } - - /** - * Selects an option in a ng-select - * https://github.com/ng-select/ng-select/issues/1270 - * @param ngSelectName the formcontrolname of the element - * @param optionIndex the index of the item to be selected - */ - ngSelectOptionByIndex(ngSelectName, optionIndex) { - element( - by.css('[formcontrolname="' + ngSelectName + '"] span.ng-arrow-wrapper') - ).click(); - - element( - by.css( - '[formcontrolname="' + - ngSelectName + - '"] .ng-option:nth-child(' + - optionIndex + - ')' - ) - ).click(); - } - - /** - * Selects an option in a datalist - * @param selectName the formcontrolname of the element - * @param optionIndex the index of the item to be selected - */ - selectDatalistByIndex(selectName, optionIndex) { - const input = element( - by.css(`input[formcontrolname=${selectName}]`) - ); - input.click(); - - const value = element( - by.css(`datalist#${selectName} option:nth-child(${optionIndex})`) - ).getAttribute("value"); - - input.sendKeys(value); - } - - /** - * Selects an option in a datalist - * @param selectName the formcontrolname of the element - * @param optionText the text of option value to be inputed - */ - selectDatalistByText(selectName, optionText) { - const input = element( - by.css(`input[formcontrolname=${selectName}]`) - ); - input.click(); - - input.sendKeys(optionText); - } - - /** - * Determines if the flow has reached to this step - */ - abstract hasMovedToStep(); -} diff --git a/tkg/web/e2e/src/utils/os-env-dumper.js b/tkg/web/e2e/src/utils/os-env-dumper.js deleted file mode 100644 index b4e5748c57..0000000000 --- a/tkg/web/e2e/src/utils/os-env-dumper.js +++ /dev/null @@ -1,16 +0,0 @@ -// This utility will capture ALL current OS environmental variables -// and save them in .os-env-vars -const fs = require('fs'); - -const filename = '.os-env-vars'; -const vars = JSON.stringify(process.env, null, 4); - -try { - fs.writeFile(filename, vars, 'utf8', function (err) { - if (err) { - return console.log(err); - } - }); -} catch (e) { - console.log(e); -} diff --git a/tkg/web/e2e/src/utils/os-env.js b/tkg/web/e2e/src/utils/os-env.js deleted file mode 100644 index 37f3ffad52..0000000000 --- a/tkg/web/e2e/src/utils/os-env.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Initialize process.env with setting from both .os-env-vars and .env - * Settings in .env will be overwritten by the corresponding ones from - * .os-env-vars silently. - */ - -const fs = require('fs'); -const dotenv = require("dotenv"); - -const OS_ENV_VARS_FILE = ".os-env-vars"; - -exports.config = () => { - dotenv.config(); - - try { - if (fs.existsSync(OS_ENV_VARS_FILE)) { - fs.readFile(OS_ENV_VARS_FILE, 'utf8', (err, data) => { - if (err) { - console.log(err); - } else { - if (data && data.length > 0) { - const vars = JSON.parse(data); - process.env = { ...process.env, ...vars }; - } - } - }) - } - } catch (e) { - console.log(e); - } -} - diff --git a/tkg/web/e2e/src/vsphere-flow/network.po.ts b/tkg/web/e2e/src/vsphere-flow/network.po.ts deleted file mode 100644 index d3cfaf2bf5..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/network.po.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Network extends Step { - hasMovedToStep() { - return this.getNetworkName().isPresent(); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="networkForm"] clr-step-description')).getText() as Promise; - } - - getNetworkName() { - return element(by.css('input[formcontrolname="networkName"]')); - } - - getClusterServiceCidr() { - return element(by.css('input[formcontrolname="clusterServiceCidr"]')); - } - - getClusterPodCidr() { - return element(by.css('input[formcontrolname="clusterPodCidr"]')); - } - -/* - getProxyButton() { - return element(by.cssContainingText('.clr-control-label', 'Enable Proxy Settings')); - } - - getHttpProxyUrl() { - return element(by.css('input[formcontrolname="httpProxyUrl"]')); - } - - getHttpProxyUsername() { - return element(by.css('input[formcontrolname="httpProxyUsername"]')); - } - - getHttpProxyPassword() { - return element(by.css('input[formcontrolname="httpProxyPassword"]')); - } - - getIsSameAsHttp() { - return element(by.cssContainingText('.clr-control-label', 'Use same configuration for https proxy')); - } - - getNoProxy() { - return element(by.css('input[formcontrolname="noProxy"]')); - } -*/ - -} diff --git a/tkg/web/e2e/src/vsphere-flow/node-settings.po.ts b/tkg/web/e2e/src/vsphere-flow/node-settings.po.ts deleted file mode 100644 index b764431ee8..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/node-settings.po.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class NodeSettings extends Step { - hasMovedToStep() { - return this.getDevSelect().isPresent(); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="vsphereNodeSettingForm"] clr-step-description')) - .getText() as Promise; - } - - getDevSelect() { - return element(by.css('select[name="devInstanceType"]')); - } - - getProdSelect() { - return element(by.css('select[name="prodInstanceType"]')); - } - - getMCName() { - return element(by.css('input[formcontrolname="clusterName"]')); - } - - getVirtualIpAddress() { - return element(by.css('input[formcontrolname="controlPlaneEndpointIP"]')); - } - - getWorkerNodeType() { - return element(by.css('select[name="workerNodeInstanceType"]')); - } - - getEndpointProviderSelect() { - return element(by.css('select[name="controlPlaneEndpointProvider"]')); - } - - getLoadBalancerInstanceType() { - return element(by.css('select[name="haProxyInstanceType"]')); - } - - getAdvancedSettings() { - return element(by.css('clr-icon[data-e2e-id="advancedSettings"]')); - } -} diff --git a/tkg/web/e2e/src/vsphere-flow/nsx-settings.po.ts b/tkg/web/e2e/src/vsphere-flow/nsx-settings.po.ts deleted file mode 100644 index f392ab629f..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/nsx-settings.po.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class NsxSettings extends Step { - hasMovedToStep() { - return this.getControllerHost().isPresent(); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="loadBalancerForm"] clr-step-description')).getText() as Promise; - } - - getControllerHost() { - return element(by.css('input[formcontrolname="controllerHost"]')); - } - - getNsxUserName() { - return element(by.css('input[formcontrolname="username"]')); - } - - getNsxPassword() { - return element(by.css('input[formcontrolname="password"]')); - } - - getNsxVerifyButton() { - return element(by.css('button.btn-connect')); - } - - getCloudName() { - return element(by.css('select[formcontrolname="cloudName"]')); - } - - getServiceEngine() { - return element(by.css('select[formcontrolname="serviceEngineGroupName"]')); - } - - getNetworkName() { - return element(by.css('select[formcontrolname="networkName"]')); - } - - getNetworkCIDR() { - return element(by.css('select[formcontrolname="networkCIDR"]')); - } - - getControllerCert() { - return element(by.css('textarea[formcontrolname="controllerCert"]')); - } - - getNsxLabelsKey() { - return element(by.css('input[formcontrolname="newLabelKey"]')); - } - - getNsxLabelsValue() { - return element(by.css('input[formcontrolname="newLabelValue"]')); - } - - getNsxLabelsAddButton() { - return element(by.buttonText('ADD')); - } - - getNsxLabelsDeleteButton(key: string) { - const id = "label-delete-" + key; - return element(by.id(id)); - } - -} diff --git a/tkg/web/e2e/src/vsphere-flow/provider.po.ts b/tkg/web/e2e/src/vsphere-flow/provider.po.ts deleted file mode 100644 index 58dc360a25..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/provider.po.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Provider extends Step { - hasMovedToStep() { - return this.getUsername().isPresent(); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="vsphereProviderForm"] clr-step-description')).getText() as Promise; - } - - getVC() { - return element(by.css('input[formcontrolname="vcenterAddress"]')); - } - - getUsername() { - return element(by.css('input[formcontrolname="username"]')); - } - - getPassword() { - return element(by.css('input[formcontrolname="password"]')); - } - - getDC() { - return element(by.css('select[formcontrolname="datacenter"]')); - } - - getSSHKey() { - return element(by.css('textarea[formcontrolname="ssh_key"]')); - } - - getConectButton() { - return element(by.css('button.btn-connect')); - } - - getThumbprintContinueButton() { - return element(by.css('app-ssl-thumbprint-modal .continue-btn')); - } -} diff --git a/tkg/web/e2e/src/vsphere-flow/resources.po.ts b/tkg/web/e2e/src/vsphere-flow/resources.po.ts deleted file mode 100644 index 60537f88b4..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/resources.po.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { browser, by, element } from 'protractor'; -import { Step } from '../step.po'; - -export class Resources extends Step { - hasMovedToStep() { - return this.getDataStore().isPresent(); - } - - getTitleText() { - return element(by.css('clr-stepper-panel[formgroupname="resourceForm"] clr-step-description')).getText() as Promise; - } - - getResources() { - return element.all(by.css('clr-tree label.clr-control-label')); - } - - getResource(poolName) { - return element(by.cssContainingText('label.clr-control-label', poolName)); - } - - getVMfolder() { - return element(by.css('ng-select[name="vmFolder"]')); - } - - getDataStore() { - return element(by.css('datalist[id="datastore"]')); - } - - getRefreshButton() { - return element.all(by.css('app-resource-step clr-icon[shape="refresh"]')); - } - - getResourcePoolSize() { - return element.all(by.css('app-tree-select clr-checkbox-wrapper')).count(); - } -} diff --git a/tkg/web/e2e/src/vsphere-flow/vsphere-enable-opt-common.ts b/tkg/web/e2e/src/vsphere-flow/vsphere-enable-opt-common.ts deleted file mode 100644 index 45b38e6a9a..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/vsphere-enable-opt-common.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { NsxSettings } from './nsx-settings.po'; -import { NetworkProxy } from '../common/networkproxy.po'; -import { TmcRegister } from '../common/tmc-settings.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import WizardCommon from "./wizard-common"; -import { Identity } from '../common/identity.po' -import { browser } from 'protractor'; -import { NodeSettings } from './node-settings.po'; - -export class EnableOptionsCommon extends WizardCommon { - - selectEndpointProvider(nodeSettings: NodeSettings) { - nodeSettings.selectOptionByText(nodeSettings.getEndpointProviderSelect(), 'NSX Advanced Load Balancer'); - } - - getFlowTestingDescription() { - return "Vsphere flow (enable Options)" - } - - setNetworkProxy(step: NetworkProxy) { - step.getProxyButton().click(); - browser.waitForAngular(); - step.getHttpProxyUrl().sendKeys(PARAMS.DEFAULT_PROXY_HTTP_URL); - step.getIsSameAsHttp().click(); - } - - executeNsxStep() { - describe("NSX for Vsphere step", () => { - const nsxSettings = new NsxSettings(); - - it('should have moved to NSX Settings for Vsphere step', () => { - expect(nsxSettings.hasMovedToStep()).toBeTruthy(); - }) - - it('"VERIFY" button should be enabled', () => { - nsxSettings.getControllerHost().sendKeys(PARAMS.CONTROLLER_HOST); - nsxSettings.getNsxUserName().sendKeys(PARAMS.DEFAULT_NSX_USER); - nsxSettings.getNsxPassword().sendKeys(PARAMS.DEFAULT_NSX_PASSWORD + " "); - nsxSettings.getControllerCert().sendKeys(PARAMS.DEFAULT_NSX_CA); - expect(nsxSettings.getNsxVerifyButton().isEnabled()).toBeTruthy(); - }) - - it('should NOT show "VERIFIED" with wrong password', () => { - nsxSettings.getNsxVerifyButton().click(); - browser.waitForAngular(); - expect(nsxSettings.getNsxVerifyButton().isEnabled()).toBeTruthy(); - expect(nsxSettings.getNsxVerifyButton().getText()).not.toEqual('VERIFIED'); - }) - - it('"VERIFY" button should display "VERIFIED"', () => { - nsxSettings.getNsxPassword().clear(); - nsxSettings.getNsxPassword().sendKeys(PARAMS.DEFAULT_NSX_PASSWORD); - nsxSettings.getNsxVerifyButton().click(); - browser.waitForAngular(); - expect(nsxSettings.getNsxVerifyButton().isEnabled()).toBeFalsy(); - expect(nsxSettings.getNsxVerifyButton().getText()).toEqual('VERIFIED'); - }) - - it('Capture all user inputs', () => { - nsxSettings.selectOptionByText(nsxSettings.getCloudName(), PARAMS.DEFAULT_NSX_CLOUD); - nsxSettings.selectOptionByText(nsxSettings.getServiceEngine(), PARAMS.DEFAULT_NSX_SE); - nsxSettings.selectOptionByText(nsxSettings.getNetworkName(), PARAMS.DEFAULT_NSX_NETWORK_NAME); - nsxSettings.selectOptionByText(nsxSettings.getNetworkCIDR(), PARAMS.DEFAULT_NSX_NETWORK_CIDR); - nsxSettings.getNsxLabelsKey().sendKeys("somekey"); - nsxSettings.getNsxLabelsValue().sendKeys("someval"); - nsxSettings.getNsxLabelsAddButton().click(); - nsxSettings.getNsxLabelsKey().sendKeys("delete-this-key"); - nsxSettings.getNsxLabelsValue().sendKeys("delete-this-value"); - nsxSettings.getNsxLabelsAddButton().click(); - nsxSettings.getNsxLabelsDeleteButton("delete-this-key").click(); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - nsxSettings.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - - executeIdentityStep() { - describe("Identity step", () => { - const identity = new Identity(); - - it('should have moved to this step', () => { - expect(identity.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - identity.getLDAPRadioButton().click(); - identity.getLdapIP().sendKeys(PARAMS.LDAP_IP); - identity.getLdapPort().sendKeys(PARAMS.LDAP_PORT); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - identity.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - -} diff --git a/tkg/web/e2e/src/vsphere-flow/vsphere-no-opt-common.ts b/tkg/web/e2e/src/vsphere-flow/vsphere-no-opt-common.ts deleted file mode 100644 index 559bde8507..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/vsphere-no-opt-common.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { NsxSettings } from './nsx-settings.po'; -import { Network } from './network.po'; -import { TmcRegister } from '../common/tmc-settings.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import WizardCommon from "./wizard-common"; -import { Identity } from '../common/identity.po' -import { browser } from 'protractor'; -import { NetworkProxy } from '../common/networkproxy.po'; -import { NodeSettings } from './node-settings.po'; - -export class DisableOptionsCommon extends WizardCommon { - - selectEndpointProvider(nodeSettings: NodeSettings) { - // Do nothing as it is not enabled - } - - getFlowTestingDescription() { - return "Vsphere flow (disable Options)" - } - - setNetworkProxy(step: NetworkProxy) { - // Do nothing as it is not enabled - } - - executeNsxStep() { - describe("NSX for Vsphere step", () => { - const nsxSettings = new NsxSettings(); - - it('should have moved to NSX Settings for Vsphere step', () => { - expect(nsxSettings.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - expect(true).toBeTruthy(); - }); - - afterAll(() => { - nsxSettings.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - - executeIdentityStep() { - describe("Identity step", () => { - const identity = new Identity(); - - it('should have moved to this step', () => { - expect(identity.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - identity.getIssuerURLInput().sendKeys("https://my-url.com"); - identity.getClientIdInput().sendKeys("some-client-id"); - identity.getClientSecretInput().sendKeys("some-client-secret"); - identity.getScopesInput().sendKeys("openid, offline_access"); - identity.getOidcUsernameClaim().sendKeys("some-username"); - identity.getOidcGroupsClaim().sendKeys("some-group"); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - identity.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - -} diff --git a/tkg/web/e2e/src/vsphere-flow/vtaas-enable-opt.e2e-spec.ts b/tkg/web/e2e/src/vsphere-flow/vtaas-enable-opt.e2e-spec.ts deleted file mode 100644 index a44504f6be..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/vtaas-enable-opt.e2e-spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { EnableOptionsCommon } from './vsphere-enable-opt-common'; -import { VtaasCommon } from '../common/vtaas-common'; -import vtaas_list from '../common/vtaas_list'; - -const steps = vtaas_list.stepper; -const lists = vtaas_list.vsphere_step_list; -const testname = 'TKGm Vsphere(avi & ldap) UI Accessibility Test'; -const wizardldap = new EnableOptionsCommon(); -const vtaasExe = new VtaasCommon(steps, lists, testname); - -wizardldap.getFlowTestingDescription = () => { - return "Vsphere vTaas flow (LDAP)" -}; -wizardldap.executeAll(true); -vtaasExe.executeVtaas(); diff --git a/tkg/web/e2e/src/vsphere-flow/vtaas-no-opt.e2e-spec.ts b/tkg/web/e2e/src/vsphere-flow/vtaas-no-opt.e2e-spec.ts deleted file mode 100644 index bcfe38be5f..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/vtaas-no-opt.e2e-spec.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { DisableOptionsCommon } from './vsphere-no-opt-common'; -import { VtaasCommon } from '../common/vtaas-common'; -import vtaas_list from '../common/vtaas_list'; - -const steps = vtaas_list.stepper; -const lists = vtaas_list.vsphere_step_list; -const testname = 'TKGm Vsphere(oidc) UI Accessibility Test'; -const wizardoidc = new DisableOptionsCommon(); -const vtaasExe = new VtaasCommon(steps, lists, testname); - -wizardoidc.getFlowTestingDescription = () => { - return "Vsphere vTaas flow (OIDC)" -}; -wizardoidc.executeAll(true); -vtaasExe.executeVtaas(); diff --git a/tkg/web/e2e/src/vsphere-flow/wizard-common.ts b/tkg/web/e2e/src/vsphere-flow/wizard-common.ts deleted file mode 100644 index 861ef1169e..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/wizard-common.ts +++ /dev/null @@ -1,244 +0,0 @@ -import { NodeSettings } from './node-settings.po'; -import { Provider } from './provider.po'; -import { browser } from 'protractor'; -import { Wizard } from './wizard.po'; -import { OsImage } from '../common/osimage.po'; -import { Network } from './network.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import { Resources } from './resources.po'; -import { AppPage } from '../app.po'; -import { Metadata } from '../common/metadata.po' -import { NetworkProxy } from '../common/networkproxy.po' -import { Identity } from '../common/identity.po' -import { NodeOpt } from '../common/node-setting-opt.po'; - -console.log(JSON.stringify(PARAMS, null, 4)); -const title = 'Deploying Tanzu Community Edition on vSphere'; - -export default abstract class WizardCommon { - - abstract selectEndpointProvider(nodeSettings); - abstract executeNsxStep(); - abstract setNetworkProxy(step: NetworkProxy); - abstract executeIdentityStep(); - abstract getFlowTestingDescription(); - - executeAll(isVtaas) { - describe(this.getFlowTestingDescription(), () => { - - const page = new AppPage(); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.matchTitleText()).toBeTruthy(); - }); - - it('should navigate to vSphere flow', () => { - page.getDeployOnVsphere().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - expect(browser.getCurrentUrl()).toEqual(`http://${PARAMS.SERVER_URL}/#/ui/wizard`); - }) - - const flow = new Wizard(); - it('should display "Deploy Management Cluster on vSphere"', () => { - expect(flow.getTitleText()).toEqual('Deploy Management Cluster on vSphere'); - }); - - describe("provider step", () => { - const provider = new Provider(); - - it('should navigate to provider step', () => { - expect(provider.hasMovedToStep()).toBeTruthy(); - }) - - it('"CONNECT" button should be enabled', () => { - provider.getVC().sendKeys(PARAMS.VCIP); - provider.getUsername().sendKeys(PARAMS.DEFAULT_VC_USER); - provider.getPassword().sendKeys(PARAMS.DEFAULT_VC_PASSWORD + " "); - expect(provider.getConectButton().isEnabled()).toBeTruthy(); - }) - - it('should NOT show "CONNECTED" with wrong password', () => { - provider.getConectButton().click(); - provider.getThumbprintContinueButton().click(); - browser.waitForAngular(); - expect(provider.getConectButton().isEnabled()).toBeTruthy(); - expect(provider.getConectButton().getText()).not.toEqual('CONNECTED'); - }) - - it('"CONNECT" button should display "CONNECTED"', () => { - provider.getPassword().clear(); - provider.getPassword().sendKeys(PARAMS.DEFAULT_VC_PASSWORD); - provider.getConectButton().click(); - provider.getThumbprintContinueButton().click(); - browser.waitForAngular(); - expect(provider.getConectButton().isEnabled()).toBeFalsy(); - expect(provider.getConectButton().getText()).toEqual('CONNECTED'); - }) - - it('captures all user inputs', () => { - provider.selectOptionByIndex(provider.getDC(), 2); - provider.getSSHKey().click(); - provider.getSSHKey().sendKeys(PARAMS.DEFAULT_SSH_KEY); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - provider.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Management Cluster Settings step", () => { - const nodeSettings = new NodeSettings(); - const nodeOpt = new NodeOpt(); - - it('should have moved to "Control Plane Settings" step', () => { - expect(nodeSettings.hasMovedToStep()).toBeTruthy(); - }) - - if (PARAMS.CONTROL_PLANE_TYPE === 'dev') { - it('should display "Development cluster selected: 1 node control plane"', () => { - const devSelect = nodeSettings.getDevSelect(); - nodeSettings.selectOptionByText(devSelect, PARAMS.DEFAULT_VC_MC_TYPE); - expect(nodeSettings.getTitleText()).toEqual('Development cluster selected: 1 node control plane'); - }) - - it('captures all user inputs', () => { - nodeSettings.getMCName().sendKeys(PARAMS.MC_NAME); - this.selectEndpointProvider(nodeSettings); - nodeSettings.getVirtualIpAddress().sendKeys(PARAMS.VSPHERE_ENDPOINT_IP); - nodeSettings.selectOptionByText(nodeSettings.getWorkerNodeType(), PARAMS.DEFAULT_VC_WC_TYPE); - nodeOpt.getEnableAudit().click(); - expect(true).toBeTruthy(); - }); - } else { - it('should display "Production cluster selected: 3 node control plane"', () => { - const prodSelect = nodeSettings.getProdSelect(); - nodeSettings.selectOptionByText(prodSelect, PARAMS.DEFAULT_VC_MC_TYPE); - expect(nodeSettings.getTitleText()).toEqual('Production cluster selected: 3 node control plane'); - }) - - it('captures all user inputs', () => { - nodeSettings.getMCName().sendKeys(PARAMS.MC_NAME); - this.selectEndpointProvider(nodeSettings); - nodeSettings.getVirtualIpAddress().sendKeys(PARAMS.VSPHERE_ENDPOINT_IP); - nodeSettings.selectOptionByText(nodeSettings.getWorkerNodeType(), PARAMS.DEFAULT_VC_WC_TYPE); - nodeOpt.getEnableAudit().click(); - expect(true).toBeTruthy(); - }); - } - - afterAll(() => { - nodeSettings.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - this.executeNsxStep(); - - describe("Metadata step", () => { - const metadata = new Metadata(); - - it('should have moved to this step', () => { - expect(metadata.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - metadata.getMCDescription().sendKeys("some-description"); - metadata.getMCLocation().sendKeys("some-location"); - metadata.getMCLabelsKey().sendKeys("somekey"); - metadata.getMCLabelsValue().sendKeys("someval"); - metadata.getMCLabelsAddButton().click(); - metadata.getMCLabelsKey().sendKeys("delete-this-key"); - metadata.getMCLabelsValue().sendKeys("delete-this-value"); - metadata.getMCLabelsAddButton().click(); - metadata.getMCLabelsDeleteButton("delete-this-key").click(); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - metadata.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Resources step", () => { - const resources = new Resources(); - - it('should have moved to "Resources" step', () => { - expect(resources.hasMovedToStep()).toBeTruthy(); - }) - - it('"refresh" button should work', () => { - resources.getRefreshButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - expect(resources.getResourcePoolSize()).toBeGreaterThan(0); - }) - - it('captures all user inputs', () => { - resources.getResource(PARAMS.DEFAULT_RESOURCE_POOL).click(); - resources.selectDatalistByText("vmFolder", PARAMS.DEFAULT_VC_FOLDER); - resources.selectDatalistByText("datastore", PARAMS.DEFAULT_VC_DATASTORE); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - resources.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Kubernetes Network step", () => { - const network = new Network(); - const networkproxy = new NetworkProxy(); - - it('should have moved to "Kubernetes Network" step', () => { - expect(network.hasMovedToStep()).toBeTruthy(); - }) - - it('captures all user inputs', () => { - network.selectDatalistByText("networkName", PARAMS.DEFAULT_VC_NETWORK); - this.setNetworkProxy(networkproxy); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - network.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - this.executeIdentityStep(); - - describe("OS Image step", () => { - const osImage = new OsImage(); - - it('should have moved to "OS Image" step', () => { - expect(osImage.hasMovedToStep()).toBeTruthy(); - }) - - it('OS image refresh should work', () => { - osImage.getRefreshButton().click(); - browser.waitForAngular(); - expect(osImage.getOsImageCount()).toBeGreaterThan(1); - osImage.selectOptionByIndex(osImage.getOsImages(), 2); - }) - - it('captures all user inputs', () => { - expect(true).toBeTruthy(); - }); - - afterAll(() => { - osImage.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - flow.executeCommonFlow(); - if (isVtaas === false) { - flow.executeDeployFlow(title); - } - }); - } -} diff --git a/tkg/web/e2e/src/vsphere-flow/wizard-enable-opt.e2e-spec.ts b/tkg/web/e2e/src/vsphere-flow/wizard-enable-opt.e2e-spec.ts deleted file mode 100644 index 984e65372c..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/wizard-enable-opt.e2e-spec.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { EnableOptionsCommon } from './vsphere-enable-opt-common'; - -const wizardldap = new EnableOptionsCommon(); -wizardldap.executeAll(false); diff --git a/tkg/web/e2e/src/vsphere-flow/wizard-no-opt.e2e-spec.ts b/tkg/web/e2e/src/vsphere-flow/wizard-no-opt.e2e-spec.ts deleted file mode 100644 index 07f26aa16a..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/wizard-no-opt.e2e-spec.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { DisableOptionsCommon } from './vsphere-no-opt-common'; - -const wizardoidc = new DisableOptionsCommon(); -wizardoidc.executeAll(false); diff --git a/tkg/web/e2e/src/vsphere-flow/wizard.e2e-spec.ts b/tkg/web/e2e/src/vsphere-flow/wizard.e2e-spec.ts deleted file mode 100644 index b016bd73ed..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/wizard.e2e-spec.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { NodeSettings } from './node-settings.po'; -import { Provider } from './provider.po'; -import { browser } from 'protractor'; -import { Wizard } from './wizard.po'; -import { OsImage } from './osimage.po'; -import { Network } from './network.po'; -import { SLEEP_TIME_AFTER_NEXT, PARAMS } from '../wizard-base.po'; -import { Resources } from './resources.po'; -import { AppPage } from '../app.po'; -import { Metadata } from '../common/metadata.po' -import { Identity } from '../common/identity.po' - -console.log(JSON.stringify(PARAMS, null, 4)); - -describe('vSphere flow', () => { - - const page = new AppPage(); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getTitleText()).toEqual('Welcome to the VMware Tanzu Kubernetes Grid Installer'); - }); - - it('should navigate to vSphere flow', () => { - page.getDeployOnVsphere().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - expect(browser.getCurrentUrl()).toEqual(`http://${PARAMS.SERVER_URL}/#/ui/wizard`); - }) - - const flow = new Wizard(); - it('should display "Deploy Management Cluster on vSphere"', () => { - expect(flow.getTitleText()).toEqual('Deploy Management Cluster on vSphere'); - }); - - describe("provider step", () => { - const provider = new Provider(); - - it('should navigate to provider step', () => { - expect(provider.hasMovedToStep()).toBeTruthy(); - }) - - it('"CONNECT" button should be enabled', () => { - provider.getVC().sendKeys(PARAMS.VCIP); - provider.getUsername().sendKeys(PARAMS.DEFAULT_VC_USER); - provider.getPassword().sendKeys(PARAMS.DEFAULT_VC_PASSWORD + " "); - expect(provider.getConectButton().isEnabled()).toBeTruthy(); - }) - - it('should NOT show "CONNECTED" with wrong password', () => { - provider.getConectButton().click(); - provider.getThumbprintContinueButton().click(); - browser.waitForAngular(); - expect(provider.getConectButton().isEnabled()).toBeTruthy(); - expect(provider.getConectButton().getText()).not.toEqual('CONNECTED'); - }) - - it('"CONNECT" button should display "CONNECTED"', () => { - provider.getPassword().clear(); - provider.getPassword().sendKeys(PARAMS.DEFAULT_VC_PASSWORD); - provider.getConectButton().click(); - provider.getThumbprintContinueButton().click(); - browser.waitForAngular(); - expect(provider.getConectButton().isEnabled()).toBeFalsy(); - expect(provider.getConectButton().getText()).toEqual('CONNECTED'); - }) - - it('captures all user inputs', () => { - provider.selectOptionByIndex(provider.getDC(), 2); - provider.getSSHKey().sendKeys(PARAMS.DEFAULT_SSH_KEY); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - provider.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Management Cluster Settings step", () => { - const nodeSettings = new NodeSettings(); - - it('should have moved to "Control Plane Settings" step', () => { - expect(nodeSettings.hasMovedToStep()).toBeTruthy(); - }) - - it('should display "Development cluster selected: 1 node control plane"', () => { - const devSelect = nodeSettings.getDevSelect(); - nodeSettings.selectOptionByIndex(devSelect, 2); - expect(nodeSettings.getTitleText()).toEqual('Development cluster selected: 1 node control plane'); - }) - - it('captures all user inputs', () => { - nodeSettings.getMCName().sendKeys(PARAMS.MC_NAME); - nodeSettings.getVirtualIpAddress().sendKeys("10.10.10.10") - nodeSettings.selectOptionByIndex(nodeSettings.getWorkerNodeType(), 2); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - nodeSettings.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Metadata step", () => { - const metadata = new Metadata(); - - it('should have moved to this step', () => { - expect(metadata.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - metadata.getMCDescription().sendKeys("some-description"); - metadata.getMCLocation().sendKeys("some-location"); - metadata.getMCLabelsKey().sendKeys("somekey"); - metadata.getMCLabelsValue().sendKeys("someval"); - metadata.getMCLabelsAddButton().click(); - metadata.getMCLabelsKey().sendKeys("delete-this-key"); - metadata.getMCLabelsValue().sendKeys("delete-this-value"); - metadata.getMCLabelsAddButton().click(); - metadata.getMCLabelsDeleteButton("delete-this-key").click(); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - metadata.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Resources step", () => { - const resources = new Resources(); - - it('should have moved to "Resources" step', () => { - expect(resources.hasMovedToStep()).toBeTruthy(); - }) - - it('"refresh" button should work', () => { - resources.getRefreshButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - expect(resources.getResourcePoolSize()).toBeGreaterThan(0); - }) - - it('captures all user inputs', () => { - resources.getResources().get(1).click(); // Check the last option - resources.selectDatalistByIndex("vmFolder", 2); - resources.selectDatalistByIndex("datastore", 2); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - resources.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Kubenetes Network step", () => { - const network = new Network(); - - it('should have moved to "Kubenetes Network" step', () => { - expect(network.hasMovedToStep()).toBeTruthy(); - }) - - it('captures all user inputs', () => { - network.selectDatalistByIndex("networkName", 2); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - network.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("Identity step", () => { - const identity = new Identity(); - - it('should have moved to this step', () => { - expect(identity.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - identity.getPorviderNameInput().sendKeys("some-provider"); - identity.getIssuerURLInput().sendKeys("my-url.com"); - identity.getClientIdInput().sendKeys("some-client-id"); - identity.getClientSecretInput().sendKeys("some-client-secret"); - identity.getScopesInput().sendKeys("openid, offline_access"); - identity.getSkipVerifyCertificateCheckbox().click(); - expect(true).toBeTruthy(); - }); - - afterAll(() => { - identity.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("OS Image step", () => { - const osImage = new OsImage(); - - it('should have moved to "OS Image" step', () => { - expect(osImage.hasMovedToStep()).toBeTruthy(); - }) - - it('OS image refresh should work', () => { - osImage.getRefreshButton().click(); - browser.waitForAngular(); - expect(osImage.getOsImageCount()).toBeGreaterThan(1); - osImage.selectOptionByIndex(osImage.getOsImages(), 2); - }) - - it('captures all user inputs', () => { - expect(true).toBeTruthy(); - }); - - afterAll(() => { - osImage.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - flow.executeCommonFlow(); -}); diff --git a/tkg/web/e2e/src/vsphere-flow/wizard.po.ts b/tkg/web/e2e/src/vsphere-flow/wizard.po.ts deleted file mode 100644 index a47a971edd..0000000000 --- a/tkg/web/e2e/src/vsphere-flow/wizard.po.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { browser, by, element, protractor } from 'protractor'; -import { WizardBase } from '../wizard-base.po'; - -export class Wizard extends WizardBase { - - navigateTo() { - browser.get(`http://${browser.params.SERVER_URL}/#/ui/wizard`); - browser.sleep(10000); - } - - getTitleText() { - return element(by.css('app-wizard h2')).getText() as Promise; - } - -} diff --git a/tkg/web/e2e/src/wizard-base.po.ts b/tkg/web/e2e/src/wizard-base.po.ts deleted file mode 100644 index 06233b4973..0000000000 --- a/tkg/web/e2e/src/wizard-base.po.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { config } from 'process'; -import { by, element, browser, protractor } from 'protractor'; -import { Ceip } from './common/ceip.po'; -import { TmcRegister } from './common/tmc-settings.po'; - -export const SLEEP_TIME_AFTER_NEXT = 10000; // ms -export const DEPLOY_TIMEOUT = 60; // minutes -export const PARAMS = browser.params; - -export abstract class WizardBase { - - getReviewConfigurationButton() { - return element(by.buttonText("REVIEW CONFIGURATION")); - } - - getConfirmSettingsText() { - return element(by.css('tkg-kickstart-ui-confirm h2')).getText() as Promise; - } - - displayIaaSProvider() { - return element(by.cssContainingText('th', 'IaaS Provider')).isPresent(); - } - - getDeployButton() { - return element(by.buttonText("Deploy Management Cluster")); - } - - getEditButton() { - return element(by.buttonText("Edit Configuration")); - } - - displayDeploymentPage() { - return element(by.cssContainingText('h2', 'Deploying Tanzu Kubernetes Grid')).isPresent(); - } - - matchDepoymentPage(title) { - const EC = protractor.ExpectedConditions; - return EC.or( - EC.presenceOf(element(by.cssContainingText('h2', 'Deploying Tanzu Kubernetes Grid'))), - EC.presenceOf(element(by.cssContainingText('h2', title))) - ); - } - - matchConfirSettingsText() { - const EC = protractor.ExpectedConditions; - return EC.or( - EC.presenceOf(element(by.cssContainingText('h2', 'Tanzu Kubernetes Grid - Confirm Settings'))), - EC.presenceOf(element(by.cssContainingText('h2', 'Tanzu Community Edition - Confirm Settings'))) - ); - } - - untilSucceedOrFail() { - const expectedCondition = protractor.ExpectedConditions; - return expectedCondition.or( - expectedCondition.presenceOf(element(by.cssContainingText('span', 'Installation complete'))), - expectedCondition.presenceOf(element(by.cssContainingText('div', 'has failed'))) - ); - } - - isDeploymentSuccessful() { - return element(by.cssContainingText('span', 'Installation complete, you can now close the browser....')).isPresent(); - } - - executeCommonFlow() { - - describe("Register TMC step", () => { - const tmc = new TmcRegister(); - - it('should have moved to this step', () => { - expect(tmc.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - expect(true).toBeTruthy(); - }); - - afterAll(() => { - tmc.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - - describe("CEIP Agreement step", () => { - const ceip = new Ceip(); - - it('should have moved to this step', () => { - expect(ceip.hasMovedToStep()).toBeTruthy(); - }) - - it('Capture all user inputs', () => { - expect(ceip.getCeipCheckbox().getAttribute("value")).toBeTruthy() - expect(true).toBeTruthy(); - }); - - afterAll(() => { - ceip.getNextButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - }) - }); - } - - executeDeployFlow(title) { - describe("Review Configuration", () => { - - it('"Review Configuration" button should be enabled', () => { - expect(this.getReviewConfigurationButton().isEnabled).toBeTruthy(); - }) - - it('should display "Tanzu Kubernetes Grid - Confirm Settings"', () => { - this.getReviewConfigurationButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - browser.wait(this.matchConfirSettingsText(), 5000); - }) - - it('should navigate to deployment status page', () => { - this.getDeployButton().click(); - browser.sleep(SLEEP_TIME_AFTER_NEXT); - expect(this.matchDepoymentPage(title)).toBeTruthy(); - }) - - it('should finish deployment', async () => { - try { - await browser.wait(this.untilSucceedOrFail(), - DEPLOY_TIMEOUT * 60 * 1000, `Deployment timeout of ${DEPLOY_TIMEOUT} minutes has reached.`); - } catch (e) { - expect(false).toBeTruthy(); - } - }); - }); - } - -} diff --git a/tkg/web/e2e/tsconfig.json b/tkg/web/e2e/tsconfig.json deleted file mode 100644 index 39b800f789..0000000000 --- a/tkg/web/e2e/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/e2e", - "module": "commonjs", - "target": "es5", - "types": [ - "jasmine", - "jasminewd2", - "node" - ] - } -} diff --git a/tkg/web/karma.conf.js b/tkg/web/karma.conf.js deleted file mode 100644 index 876e0e3ff3..0000000000 --- a/tkg/web/karma.conf.js +++ /dev/null @@ -1,40 +0,0 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - -module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma'), - require('karma-spec-reporter') - ], - client: { - captureConsole: true, - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, './coverage/tkg-bootstrap'), - reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true - }, - reporters: ['progress', 'kjhtml', 'spec'], - port: 9876, - colors: true, - logLevel: config.LOG_LOG, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true, - customLaunchers: { - ChromeHeadlessCustom: { - base: 'ChromeHeadless', - flags: ['--no-sandbox', '--disable-gpu'] - } - } - }); -}; diff --git a/tkg/web/node-server/json/json-mock-response.json b/tkg/web/node-server/json/json-mock-response.json deleted file mode 100644 index f65f08ca35..0000000000 --- a/tkg/web/node-server/json/json-mock-response.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "id": "edee6a50-d39d-11e6-a4f7-9b1990ec4ce2", - "info": "this is a test", - "someData": "xyz" -} diff --git a/tkg/web/node-server/main.js b/tkg/web/node-server/main.js deleted file mode 100644 index 5890553f67..0000000000 --- a/tkg/web/node-server/main.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict'; -/* globals __dirname */ -/* eslint no-console: "off" */ - -const _ = require('lodash'); -const path = require('path'); -const mkdirp = require('mkdirp'); - -const paths = require('./src/conf/paths'); -const appConfig = require(paths.src.appConfig); - -const winston = require('winston'); - -const help = ` -PKS UI Server - -Available options: - - --port : Specify an alternate port (number >= ${appConfig.minPort}) or a named pipe - (string). Default is ${appConfig.port}. - --help : Print this message. -`; - -appConfig.clientPath = paths.directories.clientDistDir; - -winston.configure({ - transports: [ - new (winston.transports.Console)({ - level: appConfig.logLevel - }) - ] -}); - -if (_.includes(process.argv, '--help')) { - // make sure this goes out to stdout by not using Logger - console.info(help); - process.exit(2); -} - - -let portIdx = process.argv.indexOf('--port'); -if (portIdx >= 0) { - if (process.argv.length > portIdx + 1) { - appConfig.port = process.argv[portIdx + 1]; - } else { - console.error('missing port number or named pipe for --port option'); - process.exit(1); - } -} - -appConfig.mode = 'development'; -appConfig.logLevel = 'debug'; - -//////////////////////////////////////////////////////////////////////////////// -// Initialization - -// make sure it exists -mkdirp.sync(appConfig.userDataPath); - -// start the web server and web app -require(paths.src.www); diff --git a/tkg/web/node-server/mockLogs/deployment.txt b/tkg/web/node-server/mockLogs/deployment.txt deleted file mode 100644 index ac35e67e21..0000000000 --- a/tkg/web/node-server/mockLogs/deployment.txt +++ /dev/null @@ -1,24 +0,0 @@ --- Logs begin at Wed 2019-10-09 20:55:22 UTC, end at Wed 2019-10-09 21:21:55 UTC. -- -Oct 09 20:55:59 gear2.pks.vmware.local systemd[1]: Starting PKS mgmt server... -Oct 09 20:55:59 gear2.pks.vmware.local pks-mgmt-server[880]: d4e521deea758b05f30992e714ef2e15e6a12699828d14110b62e9eb87a2a90f -Oct 09 20:55:59 gear2.pks.vmware.local systemd[1]: Started PKS mgmt server. -Oct 09 20:56:00 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:00Z" level=info msg="Trying to read DNS info from /etc/resolv.conf.override" -Oct 09 20:56:00 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:00Z" level=info msg="Update for environment, _APPLIANCE_SERVICE_UID : 10000" -Oct 09 20:56:00 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:00Z" level=info msg="Update for environment, _FILESERVER_PORT : 443" -Oct 09 20:56:00 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:00Z" level=info msg="Update for environment, _APPLIANCE_PERMIT_ROOT_LOGIN : True" -Oct 09 20:56:00 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:00Z" level=info msg="Update for environment, _NETWORK_GATEWAY : 192.168.111.155" -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _NETWORK_DNS : 192.168.111.155" -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _LOGINSIGHT_ID : e6945782-db9d-4e7d-88fa-07a0792a7c68" -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _APPLIANCE_ID : fgZNyaF31clUCluyzw8gji7Jj0qRbTVvHOa9JKpLQbY=" -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _APPLIANCE_TLS_CERT : " -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _APPLIANCE_TLS_PRIVATE_KEY : " -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _APPLIANCE_TLS_CA_CERT : " -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _NETWORK_FQDN : gear2.pks.vmware.local" -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _NETWORK_SEARCHPATH : pks.vmwre.local" -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _LOGINSIGHT_PORT : 9000" -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _HOSTNAME : gear2.pks.vmware.local" -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _IP_ADDRESS : 192.168.111.40" -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _NETWORK_IP0 : 192.168.111.40" -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _NETWORK_NETMASK0 : 255.255.255.0" -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Update for environment, _LOGINSIGHT_HOST : " -Oct 09 20:56:01 gear2.pks.vmware.local pks-mgmt-server[934]: time="2019-10-09T20:56:01Z" level=info msg="Starting upgrade checker..." diff --git a/tkg/web/node-server/package-lock.json b/tkg/web/node-server/package-lock.json deleted file mode 100644 index 51d61f4c9d..0000000000 --- a/tkg/web/node-server/package-lock.json +++ /dev/null @@ -1,2070 +0,0 @@ -{ - "name": "TKG_UI_Server", - "version": "0.0.1", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "TKG_UI_Server", - "version": "0.0.1", - "dependencies": { - "body-parser": "^1.20.0", - "cjson": "0.5.0", - "connect-busboy": "1.0.0", - "express": "^4.18.1", - "express-http-proxy": "^1.6.3", - "express-rate-limit": "^6.4.0", - "http": "0.0.0", - "https": "1.0.0", - "lodash": "^4.17.21", - "mkdirp": "^1.0.4", - "morgan": "1.10.0", - "path": "0.12.7", - "properties-reader": "2.2.0", - "rotating-file-stream": "1.0.5", - "url": "0.11.0", - "winston": "^3.7.2", - "ws": "^8.7.0" - }, - "devDependencies": {}, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "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/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "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.10.3", - "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/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/busboy": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.5.0.tgz", - "integrity": "sha512-bTXFtUV/DkvfwzHD7yjAkRK5/F3RuF2Ab/qWvf5plbHZMSCea8mxOdqMj8tG1PoSNj/Qi0cb3IoRPEj6qXAGgw==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/cjson": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cjson/-/cjson-0.5.0.tgz", - "integrity": "sha1-oPSGAeAWFk37LG2JHjgMlsramDk=", - "dependencies": { - "json-parse-helpfulerror": "^1.0.3" - }, - "engines": { - "node": ">= 0.3.0" - } - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/connect-busboy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/connect-busboy/-/connect-busboy-1.0.0.tgz", - "integrity": "sha512-dKON178N/CpPSeJ8E+kfOekSUBx0nQo5kyIekry7YpM+qRhgHmSRVUN5D2hpLA8SQBV0ZNMF/aG7njDzE8Gl2A==", - "dependencies": { - "busboy": "^1.0.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/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": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "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/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/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.0", - "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.10.3", - "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-http-proxy": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-1.6.3.tgz", - "integrity": "sha512-/l77JHcOUrDUX8V67E287VEUQT0lbm71gdGVoodnlWBziarYKgMcpqT7xvh/HM8Jv52phw8Bd8tY+a7QjOr7Yg==", - "dependencies": { - "debug": "^3.0.1", - "es6-promise": "^4.1.1", - "raw-body": "^2.3.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/express-http-proxy/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/express-http-proxy/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/express-rate-limit": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.4.0.tgz", - "integrity": "sha512-lxQRZI4gi3qAWTf0/Uqsyugsz57h8bd7QyllXBgJvd6DJKokzW7C5DTaNvwzvAQzwHGFaItybfYGhC8gpu0V2A==", - "engines": { - "node": ">= 12.9.0" - }, - "peerDependencies": { - "express": "^4 || ^5" - } - }, - "node_modules/express/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/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fecha": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" - }, - "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/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/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "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": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-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/http": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/http/-/http-0.0.0.tgz", - "integrity": "sha1-huYybSnF0Dnen6xYSkVon5KfT3I=" - }, - "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-errors/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/https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", - "integrity": "sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q=" - }, - "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/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "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.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "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/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=" - }, - "node_modules/json-parse-helpfulerror": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", - "dependencies": { - "jju": "^1.1.0" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/logform": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz", - "integrity": "sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==", - "dependencies": { - "@colors/colors": "1.5.0", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - } - }, - "node_modules/logform/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/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/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/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/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "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/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "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": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "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": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/properties-reader": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-2.2.0.tgz", - "integrity": "sha512-CgVcr8MwGoBKK24r9TwHfZkLLaNFHQ6y4wgT9w/XzdpacOOi5ciH4hcuLechSDAwXsfrGQtI2JTutY2djOx2Ow==", - "dependencies": { - "mkdirp": "^1.0.4" - }, - "engines": { - "node": ">=10" - } - }, - "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/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, - "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/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/rotating-file-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/rotating-file-stream/-/rotating-file-stream-1.0.5.tgz", - "integrity": "sha1-dJR5xL2xomdcQD6fC2asdm+vhzc=", - "deprecated": "please use version 2.x", - "dependencies": { - "tmp": "0.0.28" - }, - "engines": { - "node": ">=0.11" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-stable-stringify": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", - "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==", - "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/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/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/send/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/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/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/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "engines": { - "node": "*" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/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_decoder/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/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "node_modules/tmp": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", - "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", - "dependencies": { - "os-tmpdir": "~1.0.1" - }, - "engines": { - "node": ">=0.4.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/triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "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/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/winston": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.7.2.tgz", - "integrity": "sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng==", - "dependencies": { - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", - "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", - "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 6.4.0" - } - }, - "node_modules/ws": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", - "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", - "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 - } - } - } - }, - "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" - }, - "@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - } - } - }, - "busboy": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.5.0.tgz", - "integrity": "sha512-bTXFtUV/DkvfwzHD7yjAkRK5/F3RuF2Ab/qWvf5plbHZMSCea8mxOdqMj8tG1PoSNj/Qi0cb3IoRPEj6qXAGgw==", - "requires": { - "streamsearch": "^1.1.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "cjson": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cjson/-/cjson-0.5.0.tgz", - "integrity": "sha1-oPSGAeAWFk37LG2JHjgMlsramDk=", - "requires": { - "json-parse-helpfulerror": "^1.0.3" - } - }, - "color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "requires": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "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==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", - "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "requires": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "connect-busboy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/connect-busboy/-/connect-busboy-1.0.0.tgz", - "integrity": "sha512-dKON178N/CpPSeJ8E+kfOekSUBx0nQo5kyIekry7YpM+qRhgHmSRVUN5D2hpLA8SQBV0ZNMF/aG7njDzE8Gl2A==", - "requires": { - "busboy": "^1.0.0" - } - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.0", - "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.10.3", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "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==" - } - } - }, - "express-http-proxy": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-1.6.3.tgz", - "integrity": "sha512-/l77JHcOUrDUX8V67E287VEUQT0lbm71gdGVoodnlWBziarYKgMcpqT7xvh/HM8Jv52phw8Bd8tY+a7QjOr7Yg==", - "requires": { - "debug": "^3.0.1", - "es6-promise": "^4.1.1", - "raw-body": "^2.3.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "express-rate-limit": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.4.0.tgz", - "integrity": "sha512-lxQRZI4gi3qAWTf0/Uqsyugsz57h8bd7QyllXBgJvd6DJKokzW7C5DTaNvwzvAQzwHGFaItybfYGhC8gpu0V2A==", - "requires": {} - }, - "fecha": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - } - } - }, - "fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "http": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/http/-/http-0.0.0.tgz", - "integrity": "sha1-huYybSnF0Dnen6xYSkVon5KfT3I=" - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } - }, - "https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", - "integrity": "sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q=" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=" - }, - "json-parse-helpfulerror": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", - "requires": { - "jju": "^1.1.0" - } - }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "logform": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz", - "integrity": "sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==", - "requires": { - "@colors/colors": "1.5.0", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "requires": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "requires": { - "fn.name": "1.x.x" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "properties-reader": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-2.2.0.tgz", - "integrity": "sha512-CgVcr8MwGoBKK24r9TwHfZkLLaNFHQ6y4wgT9w/XzdpacOOi5ciH4hcuLechSDAwXsfrGQtI2JTutY2djOx2Ow==", - "requires": { - "mkdirp": "^1.0.4" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "rotating-file-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/rotating-file-stream/-/rotating-file-stream-1.0.5.tgz", - "integrity": "sha1-dJR5xL2xomdcQD6fC2asdm+vhzc=", - "requires": { - "tmp": "0.0.28" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-stable-stringify": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", - "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "tmp": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", - "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", - "requires": { - "os-tmpdir": "~1.0.1" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "winston": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.7.2.tgz", - "integrity": "sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng==", - "requires": { - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - } - }, - "winston-transport": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", - "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", - "requires": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - } - }, - "ws": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", - "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", - "requires": {} - } - } -} diff --git a/tkg/web/node-server/package.json b/tkg/web/node-server/package.json deleted file mode 100644 index 1b5bea89e0..0000000000 --- a/tkg/web/node-server/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "TKG_UI_Server", - "version": "0.0.1", - "description": "Dev node server for TKG Kickstart UI application", - "private": true, - "main": "main.js", - "engines": { - "node": ">= 10.0.0" - }, - "scripts": { - "init": "npm install", - "eslint": "node node_modules/eslint/bin/eslint.js", - "eslint:all": "npm run eslint -- \"main.js\" \"src/**/*.js\"", - "lint": "npm run eslint:all", - "start": "node main.js --client-dist --log", - "start:tce": "node main.js --client-dist --log --tce", - "debug": "node debug main.js --client-dist --log" - }, - "dependencies": { - "body-parser": "^1.20.0", - "cjson": "0.5.0", - "connect-busboy": "1.0.0", - "express": "^4.18.1", - "express-http-proxy": "^1.6.3", - "express-rate-limit": "^6.4.0", - "http": "0.0.0", - "https": "1.0.0", - "lodash": "^4.17.21", - "mkdirp": "^1.0.4", - "morgan": "1.10.0", - "path": "0.12.7", - "properties-reader": "2.2.0", - "rotating-file-stream": "1.0.5", - "url": "0.11.0", - "winston": "^3.7.2", - "ws": "^8.7.0" - }, - "devDependencies": {} -} diff --git a/tkg/web/node-server/resources/serverInitError.html b/tkg/web/node-server/resources/serverInitError.html deleted file mode 100644 index 99c525f8e8..0000000000 --- a/tkg/web/node-server/resources/serverInitError.html +++ /dev/null @@ -1,18 +0,0 @@ - - - Deployment Toolkit Server Error - - -
-
-
-

Error: Deployment Toolkit Server Initialization Failed

-
- -
-

The Deployment Toolkit UI server is unable to start. You must restart the server manually to proceed.

-
-
-
- - diff --git a/tkg/web/node-server/src/app.js b/tkg/web/node-server/src/app.js deleted file mode 100644 index a706b2cb95..0000000000 --- a/tkg/web/node-server/src/app.js +++ /dev/null @@ -1,142 +0,0 @@ -'use strict'; - -// disable for entire file: we dynamically require modules based on `appConfig` -/* eslint-disable global-require */ - -// -// Web Application (served from the web server) -// - -const express = require('express'); -const rateLimit = require("express-rate-limit"); - -const busboy = require('connect-busboy'); -const path = require('path'); -const paths = require('./conf/paths'); -const mkdirp = require('mkdirp'); -const morgan = require('morgan'); -const makeRfs = require('rotating-file-stream'); -const appConfig = require(paths.src.appConfig); -const libUtil = require(paths.src.util); -const winston = require('winston'); - -const ENDPOINT = appConfig.apiEndpoint; -const bodyParser = require(paths.src.bodyParser); - -// -// Create and configure the app server -// -let app = express(); - -app.use( - rateLimit({ - windowMs: 1000, // 1 second duration - max: 20, - message: "You exceeded 20 requests per second; to increase the allowed requests/sec, modify rateLimit in app.js", - headers: true - }) -); - -winston.verbose('Mounting route to handle server error state'); -app.use((req, res, next) => { - winston.debug('Checking for error state', {state: appConfig.serverErrorState}); - if (appConfig.serverErrorState) { - winston.error('Server is in error state; serving up error html', { - serverErrorState: appConfig.serverErrorState - }); - res.sendFile(paths.resources.initErrorHtml); - } else { - next(); - } -}); - -winston.info('--- app server initializing ---'); - -app.use(busboy({ - highWaterMark: 2 * 1024 * 1024, // Set 2MiB buffer -})); // Insert the busboy middle-ware - -// configure request logging -(function() { - // create if doesn't exist - mkdirp.sync(appConfig.logPath); - - // rotating file stream filename generator - let generator = libUtil.makeRotatingFilenameGenerator( - path.join(appConfig.logPath, 'access.log')); - - // rotate every 5 megabytes, append if file exists - let stream = makeRfs(generator, { - size: '5M' - }); - - app.use(morgan( - ':date[iso] :remote-addr :remote-user ":method :url HTTP/:http-version" ' + - ':status :res[content-length] - :response-time ms - ":user-agent"', { - stream - })); -})(); - -let sessionConfig = { - secret: 'tkgNodeSession', - rolling: true, - resave: true, - saveUninitialized: true, - name: 'session', - cookie: { - secure: true, - httpOnly: true - } -}; - -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ - extended: false -})); - -if (appConfig.clientPath) { - winston.info('client static path: %s', appConfig.clientPath); - - // assume this path provides an index.html and provide it at the root - app.use('/', express.static(appConfig.clientPath)); -} - -// local API routes are used, and they load the mock services -winston.info('using API mock services'); -let mockServiceRoute = require(paths.src.mockServiceRoute); -app.use(mockServiceRoute); - - -// Catch all other routes and return the index file. -// Let the client application handle the http status code -// 404 situation in case of non-existent route. -app.get('*', (req, res) => { - res.sendFile(appConfig.clientPath + '/index.html'); -}); - -//// error handlers - -// Since middleware are executed in the order they are added (via `app.use(...)`), -// and since all valid routes MUST have been added by this point in app initialization, -// if this middleware executes, it essentially constitutes a 404 because no other -// middleware handled the request: generate a 404 and forward to error handlers. -app.use((req, res, next) => { - let err = new Error('Not Found'); - err.status = 404; - next(err); -}); - -// development error handler: will print stacktrace -app.use((err, req, res, next) => { - let status = err.status || 500; - res.status(status); - res.send({ - error: err, - message: err.message - }); -}); - -// -// Module definition -// -module.exports = app; diff --git a/tkg/web/node-server/src/conf/appConfig.js b/tkg/web/node-server/src/conf/appConfig.js deleted file mode 100644 index a3fb67710a..0000000000 --- a/tkg/web/node-server/src/conf/appConfig.js +++ /dev/null @@ -1,198 +0,0 @@ -'use strict'; - -// -// Web Application Configuration -// -const _ = require('lodash'); -const assert = require('assert'); -const url = require('url'); -const path = require('path'); -const paths = require('./paths'); -const libUtil = require(paths.src.util); - -// -// Module -// - -// @see #def.port -let __port; -// @see #def.userDataPath -let __userDataPath; -// @see #def.logPath -let __logPath; -// @see #def.clientPath -let __clientPath; -// @see #def.logLevel -let __logLevel; -// @see #def.apiEndpoint -let __apiEndpoint; -// @see #def.sampleJsonDirectory -let __sampleJsonDirectory; -// @see #def.__serverErrorState -let __serverErrorState; -// @see #def.__edition -let __edition; - -// [internal] -// @const {Number} Default app port. -const DEFAULT_PORT = 8008; -// @const {String} Default log level -const DEFAULT_LOG_LEVEL = 'info'; - -// {Object.} module definition -let def = { - - /** - * Full path to the user data directory where user-specific files can be stored. - * @readonly - * @type {String} - */ - get userDataPath() { - return __userDataPath; - }, - - /** - * Full path to the directory where log files should be located. - * @readonly - * @type {String} - */ - get logPath() { - return __logPath; - }, - - /** - * Root API path. Always starts with a slash, never ends with one. - * @readonly - * @type {String} - */ - get apiEndpoint() { - return __apiEndpoint; - }, - - /** - * Sub endpoint, from `apiEndpoint`, for internal APIs specific to this Node server - * (not in the public API). Always starts with a slash, never ends with one. - * @readonly - * @type {String} - */ - get apiInternalSubpoint() { - return '/_'; - }, - - /** - * Minimum web server port. - * @readonly - * @type {Number} - */ - get minPort() { - return 8000; - }, - - /** - * Web server port or named pipe. Defaults to port 8008. - * - * If a number is specified, it must be at least `minPort` (and will be adjusted as - * such if it isn't). If a string is specified, it's expected to be a named pipe. - * - * @type {Number|String} - */ - get port() { - return __port; - }, - set port(newValue) { - if (_.isString(newValue) && newValue) { - // named pipe - __port = newValue; - } else { - // assume a port - // use default if NaN or 0 - __port = parseInt(newValue, 10) || DEFAULT_PORT; - // ensure at least minimum - __port = Math.max(__port, this.minPort); - } - }, - - /** - * Web application log level. - * @type {Number.} - */ - get logLevel() { - return __logLevel; - }, - set logLevel(newValue) { - __logLevel = newValue; - }, - - /** - * Absolute path to location of client web app to serve statically. - * @type {String|undefined} - */ - get clientPath() { - return __clientPath; - }, - set clientPath(newValue) { - assert(newValue && _.isString(newValue), 'Client Path must be a string'); - - __clientPath = newValue; - }, - - /** - * Absolute path to location of folder containing sampleJson - * @type {String|undefined} - */ - get sampleJsonDirectory() { - return __sampleJsonDirectory; - }, - set sampleJsonDirectory(newValue) { - assert(newValue && _.isString(newValue), 'Json path must be a string'); - __sampleJsonDirectory = newValue; - }, - - /** - * Address of mock server (for development mode) - * @Type {Boolean} - */ - get serverErrorState() { - return __serverErrorState; - }, - set serverErrorState(newValue) { - assert(!_.isUndefined(newValue) && - _.isBoolean(newValue), 'Server error state must be a boolean'); - __serverErrorState = newValue; - }, - - /** - * Application 'edition' defaults to 'tkg'; 'tce' optional - * @Type {String} - */ - get edition() { - return __edition; - }, - set edition(newValue) { - assert(newValue && _.isString(newValue), 'edition must be a string'); - __edition = newValue; - }, - - // [override] - toString() { - return libUtil.stringify(this, { - typeName: 'server.appConfig', - excludeFunctions: true - }); - } -}; - -//// initialize -__userDataPath = `${paths.directories.serverDir}/user_data`; -__logPath = path.join(__userDataPath, 'logs'); -__port = DEFAULT_PORT; -__logLevel = DEFAULT_LOG_LEVEL; -__apiEndpoint = '/api'; -__sampleJsonDirectory = `${__dirname}/../../json`; -__serverErrorState = false; -__edition = 'tkg'; - -// set default mode -def.mode = 'development'; - -module.exports = def; diff --git a/tkg/web/node-server/src/conf/mockDataConfig.js b/tkg/web/node-server/src/conf/mockDataConfig.js deleted file mode 100644 index 01dcd8c439..0000000000 --- a/tkg/web/node-server/src/conf/mockDataConfig.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -const mockDataMappings = { -}; - -module.exports = mockDataMappings; diff --git a/tkg/web/node-server/src/conf/paths.js b/tkg/web/node-server/src/conf/paths.js deleted file mode 100644 index df3d9e2fba..0000000000 --- a/tkg/web/node-server/src/conf/paths.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -/* globals __dirname */ - -const path = require('path'); - -let serverDir = path.normalize(`${__dirname}/../..`); -let clientDistDir = path.normalize(`${serverDir}/../dist`); -let srcDir = `${serverDir}/src`; -let jsonDir = `${serverDir}/json`; -let mockLogsDir = `${serverDir}/mockLogs`; -let resourcesDir = `${serverDir}/resources`; -let supportDir = `${serverDir}/support`; - -let paths = { - // server/** directory paths - directories: { - clientDistDir, - jsonDir, - serverDir, - srcDir, - resourcesDir, - supportDir - }, - - json: { - mockJsonResults: `${jsonDir}/json-mock-response.json` - }, - - mockLogs: { - deployment: `${mockLogsDir}/deployment.txt` - }, - - resources: { - initErrorHtml: `${resourcesDir}/serverInitError.html`, - mockTemplateFolder: `${resourcesDir}` - }, - - // server/src/** files - src: { - app: `${srcDir}/app`, - appConfig: `${srcDir}/conf/appConfig`, - bodyParser: `${srcDir}/services/bodyParser`, - mockServiceRoute: `${srcDir}/routes/api/mockService`, - util: `${srcDir}/services/util`, - www: `${srcDir}/www` - } -}; - -module.exports = paths; diff --git a/tkg/web/node-server/src/routes/api/mockService.js b/tkg/web/node-server/src/routes/api/mockService.js deleted file mode 100644 index 3e74cee5fa..0000000000 --- a/tkg/web/node-server/src/routes/api/mockService.js +++ /dev/null @@ -1,1469 +0,0 @@ -'use strict'; - -const paths = require('../../conf/paths'); -const util = require(paths.src.util); -const express = require('express'); -const appConfig = require(paths.src.appConfig); -const winston = require('winston'); -const ENDPOINT = appConfig.apiEndpoint; - -// path to json file based responses -let mockJsonResultsRes = util.readJsonFileSync(paths.json.mockJsonResults, 'utf8'); -let mockvcNetworkRequestCounter = 0; -let mockResourcePoolRequestCounter = 0; -let mockOsImageRequestCounter = 0; -let mockDockerDaemonCounter = 0; - -// eslint-disable-next-line new-cap -let router = express.Router({ - // '/Foo' different from '/foo' - caseSensitive: true, - // '/foo' and '/foo/' treated the same - strict: false -}); - -/* - * Mock route, for GET JSON file specific to design type - */ -router.get(`${ENDPOINT}/test/:urlparam`, (req, res) => { - winston.info('Mock TKG UI GET API with URL param'); - res.status(200); - res.json(mockJsonResultsRes); -}); - -/* - * Mock route, for GET all JSON file - */ -router.get(`${ENDPOINT}/test`, (req, res) => { - winston.info('Mock TKG UI GET API no URL param'); - res.status(200); - res.json(mockJsonResultsRes); -}); - -/* - * Mock route, for GET specified provider - */ -router.get(`${ENDPOINT}/providers`, (req, res) => { - winston.info('Mock TKG UI GET PROVIDERS API'); - res.status(200); - res.json({ - "provider": "docker-1.3.1", - "tkrVersion": "v1.17" - }); -}); - -/* - * Mock route, for GET feature flags - */ -router.get(`${ENDPOINT}/features`, (req, res) => { - winston.info('Mock TKG UI GET FEATURES API'); - res.status(200); - res.json({ - "global": { - "dual-stack": "true", - "ceip": "true" - }, - "management-cluster": { - "encrypt-credentials": "true", - "export-from-confirm": "true", - "import": "true", - "vsphereIPv6": "true", - "standalone-cluster-mode": "false", - "cluster-class-support": "true" - }, - "cluster": { - "validateXyz": "true" - } - }); -}); - -/* - * Mock route, for GET edition - */ -router.get(`${ENDPOINT}/edition`, (req, res) => { - winston.info('Mock TKG UI GET EDITION API: ' + appConfig.edition); - res.status(200); - res.json(appConfig.edition); -}); - -/** - * Mock route for connect Avi controller - */ -router.post(`${ENDPOINT}/avi`, (req, res) => { - winston.info('Mock TKG UI CONNECT AVI CONTROLLER API'); - if ((req.body.host === 'avi.local') && - (req.body.username === 'administrator' || req.body.username === 'admin') && - (req.body.password === 'password')) { - res.status(200); - res.json({}); - } else { - res.status(403); - res.json({ message: 'incorrect username or password' }); - } -}); - -/** - * Mock route for getting Avi clouds - */ -router.get(`${ENDPOINT}/avi/clouds`, (req, res) => { - winston.info('Mock TKG UI FETCH AVI CLOUDS'); - res.status(200); - res.json([ - { - uuid: '631ad1fe-40c5-11eb-b378-0242ac130002', - name: 'Cloud-1', - location: 'west' - }, - { - uuid: '77ab78e4-40c5-11eb-b378-0242ac130002', - name: 'Cloud-1-S', - location: 'south' - }, - { - uuid: '7ca583c6-40c5-11eb-b378-0242ac130002', - name: 'Cloud-2', - location: 'east' - }, - { - uuid: '8047129c-40c5-11eb-b378-0242ac130002', - name: 'Cloud-3', - location: 'emea' - }, - ]); -}); - -/** - * Mock route for getting Avi service engine groups - */ -router.get(`${ENDPOINT}/avi/serviceenginegroups`, (req, res) => { - winston.info('Mock TKG UI FETCH AVI SERVICE ENGINE GROUPS'); - res.status(200); - res.json([ - { - uuid: 'b4454eba-40c5-11eb-b378-0242ac130002', - name: 'Group-1', - location: 'cloud-77ab78e4-40c5-11eb-b378-0242ac130002' - }, - { - uuid: 'b9f23350-40c5-11eb-b378-0242ac130002', - name: 'Group-1', - location: 'cloud-77ab78e4-40c5-11eb-b378-0242ac130002' - }, - { - uuid: 'be23eb08-40c5-11eb-b378-0242ac130002', - name: 'Group-2', - location: 'cloud-7ca583c6-40c5-11eb-b378-0242ac130002' - }, - { - uuid: 'c2b2a20e-40c5-11eb-b378-0242ac130002', - name: 'Group-3', - location: 'cloud-8047129c-40c5-11eb-b378-0242ac130002' - }, - ]); -}); - -/** - * Mock route for getting Avi service engine groups - */ -router.get(`${ENDPOINT}/avi/vipnetworks`, (req, res) => { - winston.info('Mock TKG UI FETCH AVI VIP NETWORKS'); - res.status(200); - res.json( - [ - { - "cloud":"631ad1fe-40c5-11eb-b378-0242ac130002", - "configedSubnets":[ - ], - "name":"VM Network", - "uuid":"network-40-cloud-e08f75e2-a011-4cf9-a895-94c923243a9e" - }, - { - "cloud":"77ab78e4-40c5-11eb-b378-0242ac130002", - "configedSubnets":[ - { - "family":"V4", - "subnet":"192.168.1.0/24" - }, - { - "family":"V4", - "subnet":"10.92.224.0/19" - }, - { - "family":"V4", - "subnet":"10.1.2.0/24" - } - ], - "name":"faraway-network", - "uuid":"network-28-cloud-372bac78-e960-422c-8da6-2413e4cf6b03" - } - ] - ); -}); - -/** - * Mock route for connect VC server - */ -router.post(`${ENDPOINT}/providers/vsphere`, (req, res) => { - winston.info('Mock TKG UI CONNECT VC API'); - if ((req.body.host === 'vsphere.local' || req.body.host === '1.1.1.1' - || req.body.host === '2001:0db8:85a3:0000:0000:8a2e:0370:7334') && - (req.body.username === 'admin' || req.body.username === 'administrator') && - (req.body.password === 'password')) { - res.status(200); - res.json({ - "version": "6.7.0:14367737", - "hasPacific": 'no', - "tkrVersion": "v1.17" - }); - } else { - res.status(403); - res.json({ message: 'incorrect username or password' }); - } -}); - -/** - * Mock route for getting VC datacenter network - */ -router.get(`${ENDPOINT}/providers/vsphere/networks`, (req, res) => { - winston.info('Mock TKG UI VC NETWORK API'); - - let vcNetworksResponse = [ - { - name: 'Network 1', - moid: 'network-1', - displayName: 'Network 1' - }, - { - name: 'Network 2', - moid: 'network-2', - displayName: 'Network 2' - }, - { - name: 'Network 3', - moid: 'network-3', - displayName: 'Network 3' - }, - { - name: 'Network 4', - moid: 'network-4', - displayName: 'Network 4' - }, - { - name: 'Network 5', - moid: 'network-5', - displayName: 'Network 5' - }, - { - name: 'Network 6', - moid: 'network-6', - displayName: 'Network 6' - } - ]; - - if (mockvcNetworkRequestCounter > 0) { - vcNetworksResponse.push({ - name: 'Network 7', - id: 'network-7', - displayName: 'Network 7' - }); - } - - mockvcNetworkRequestCounter++; - - res.status(200); - res.json(vcNetworksResponse); -}); - -/** - * Mock route for thumbsprint - */ - -router.get(`${ENDPOINT}/providers/vsphere/thumbprint`, (req, res) => { - winston.info('Mock TKG UI FETCH THUMBPRINT'); - res.status(200); - res.json( - { - thumbprint: 'DF:36:82:55:6A:27:4B:0C:35:3E:D8:EC:3A:DB:46:01:8E:6E:97:97', - insecure: false - } - ); -}); - -/** - * Mock route for getting VC datacenters - */ -router.get(`${ENDPOINT}/providers/vsphere/datacenters`, (req, res) => { - winston.info('Mock TKG UI FETCH DATACENTERS'); - res.status(200); - res.json([ - { - name: '/SDDC-Datacenter/test/dc-2', - moid: 'test-dc-2' - }, - { - name: '/SDDC-Datacenter/dc-2', - moid: 'dc-2' - }, - { - name: '/SDDC-Datacenter/dc-1', - moid: 'dc-1' - }, - - { - name: '/SDDC-Datacenter/test-a-really-long-one/dc-1', - moid: 'test-dc-1' - } - ]); -}); - -/** - * Mock route for getting datastores - */ -router.get(`${ENDPOINT}/providers/vsphere/datastores`, (req, res) => { - winston.info('Mock TKG UI FETCH DATASTORES'); - res.status(200); - res.json([ - { - name: 'Datastore 1', - moid: 'datastore-1' - }, - { - name: 'Datastore 2', - moid: 'datastore-2' - }, - { - name: 'Datastore 3', - moid: 'datastore-3' - }, - { - name: 'Datastore 4', - moid: 'datastore-4' - }, - { - name: 'Datastore 5', - moid: 'datastore-5' - }, - { - name: 'Datastore 6', - moid: 'datastore-6' - }, - { - name: 'Datastore 7', - moid: 'datastore-7' - }, - { - name: 'Datastore 8', - moid: 'datastore-8' - }, - { - name: 'Datastore 9', - moid: 'datastore-9' - }, - { - name: 'Datastore 10', - moid: 'datastore-10' - }, - { - name: 'Datastore 11', - moid: 'datastore-11' - }, - { - name: 'Datastore 12', - moid: 'datastore-12' - }, - { - name: 'Datastore 13', - moid: 'datastore-13' - }, - { - name: 'Datastore 14', - moid: 'datastore-14' - }, - { - name: 'Datastore 15', - moid: 'datastore-15' - }, - { - name: 'Datastore 16', - moid: 'datastore-16' - } - ]); -}); - -/** - * Mock route for getting vm folders - */ -router.get(`${ENDPOINT}/providers/vsphere/folders`, (req, res) => { - winston.info('Mock TKG UI FETCH VM FOLDERS'); - res.status(200); - if (req.body.dc === 'dc-1') { - res.json([ - { - name: 'Folder 1', - moid: 'folder-1' - }, - { - name: 'Folder 2', - moid: 'folder-2' - }, - { - name: 'Folder A1', - moid: 'folder-a1' - } - ]); - } else { - res.json([ - { - name: 'Folder 3', - moid: 'folder-3' - }, - { - name: 'Folder 4', - moid: 'folder-4' - } - ]); - } -}); - -/** - * Mock route for getting VC datacenters - */ -router.get(`${ENDPOINT}/providers/vsphere/resourcepools`, (req, res) => { - winston.info('Mock TKG UI FETCH RESOURCE POOLS'); - - let resourcePoolsResponse = [ - { - name: 'Respool 1', - moid: 'respool-1' - }, - { - name: 'Respool 2', - moid: 'respool-2' - }, - { - name: 'Respool 3', - moid: 'respool-3' - } - ]; - - if (mockResourcePoolRequestCounter > 0) { - resourcePoolsResponse.push({ - name: 'Respool 5', - moid: 'respool-5' - }); - } - - mockResourcePoolRequestCounter++; - - setTimeout(_ => { - res.status(200); - res.json(resourcePoolsResponse); - }, 5000); -}); - -/** - * Mock route for getting VC os images - */ -router.get(`${ENDPOINT}/providers/vsphere/osimages`, (req, res) => { - winston.info('Mock TKG UI FETCH DATACENTERS (#' + mockOsImageRequestCounter + ')'); - let osImageResponse = []; - if (mockOsImageRequestCounter > 0) { - osImageResponse.push({ - name: 'Ubuntu Custom', - moid: 'vm-3', - isTemplate: true, - osInfo: { - arch: 'amd64', - name: 'ubuntu', - version: '20.04' - } - }); - - osImageResponse.push({ - name: 'Ubuntu 1.18', - moid: 'vm-4', - isTemplate: false, - osInfo: { - arch: 'amd64', - name: 'photon', - version: '3' - } - }); - } - - mockOsImageRequestCounter++; - - res.status(200); - res.json(osImageResponse); -}); - -router.post(`${ENDPOINT}/providers/vsphere/config/import`, (req, res) => { - winston.info('Mock TKG UI IMPORT VC API'); - res.status(200); - res.json({ - "annotations": { - "description": "foo-description", - "location": "bar-location" - }, - "aviConfig": { - "controlPlaneHaProvider" : "NSX Advanced Load Balancer", - "network": { - "name": "bozo-network" - }, - "labels": { - "foo1": "one", - "foo2": "two" - }, - }, - "ceipOptIn": true, - "controlPlaneEndpoint": "10.92.12.54", - "controlPlaneFlavor": "dev", - "controlPlaneNodeType": "medium", - "datacenter": "/SDDC-Datacenter/test/dc-2", - "datastore": "Datastore 4", - "folder": "Folder 4", - "identityManagement": { - "oidc_provider_name": "", - "oidc_provider_url": "https://1.2.3.4", - "oidc_client_id": "client-id", - "oidc_client_secret": "client-secret", - "oidc_scope": "scopes", - "oidc_claim_mappings": { - "username": "username-claim", - "groups": "groups-claim" - }, - "idm_type": "oidc" - }, - "ipFamily": "ipv4", - "labels": { - "foo": "bar", - "foo2": "bar2" - }, - "machineHealthCheckEnabled": true, - "networking": {"clusterPodCIDR": "100.96.0.0/11", "clusterServiceCIDR": "100.64.0.0/13", "networkName": "Network 3"}, - "os": {"isTemplate": false, "name": "Ubuntu Custom", "moid": "vm-3", "osInfo": {"arch": "amd64", "name": "photon", "version": "3"}}, - "resourcePool": "/cluster1-path/Resources/respool-1-path/sub-host-1-path", - "ssh_key": "F8:DB:B3:6E:34:C6:0C:4D:15:8E:58:56:94:3D:32:4D:B6:85:BB:65", - "workerNodeType": "medium", - "vsphereCredentials": { - "host": "vsphere.local", - "password": "", - "thumbprint": "F8:DB:B3:6E:34:C6:0C:4D:15:8E:58:56:94:3D:32:4D:B6:85:BB:65", - "username": "admin" - } - }); -}); - -/** - * Mock route for getting config file - */ -router.post(`${ENDPOINT}/providers/vsphere/config/export`, (req, res) => { - winston.info('Mock TKG UI export config'); - res.status(200); res.status(200); - res.json("Pretend this is a beautiful config file"); -}); - - -/*** AWS releated APIs ***/ - -/** - * Retrieve AWS account params from ENV variables - */ -router.get(`${ENDPOINT}/providers/aws`, (req, res) => { - winston.info('Mock TKG UI FETCH AWS CREDENTIALS'); - - const credentials = Math.random() > 0.2 ? { - region: "US-WEST", - accessKeyID: "aws-access-key-id-12345", - secretAccessKey: "My-AWS-Secret-Access-Key", - sshKeyName: "SSH-Key-Name" - } : {}; - - res.status(200); - res.json(credentials); -}); - -/** - * Verify AWS account credentials - */ -router.post(`${ENDPOINT}/providers/aws`, (req, res) => { - winston.info('Mock TKG UI VERIFY AWS CREDENTIALS'); - res.status(201); - res.json({}); -}); - -/** - * Retrieve AWS vpc's - */ -router.get(`${ENDPOINT}/providers/aws/vpc`, (req, res) => { - winston.info('Mock TKG UI RETRIEVE AWS VPCS'); - res.status(200); - res.json([ - { - id: 'vpc-1', - cidr: '100.64.0.0/13' - }, - { - id: 'vpc-2', - cidr: '100.84.0.0/12' - } - ]); -}); - -/** - * Retrieve AWS availability zones - */ -router.get(`${ENDPOINT}/providers/aws/AvailabilityZones`, (req, res) => { - winston.info('Mock TKG UI RETRIEVE AWS AVAILABILITY ZONES'); - res.status(200); - res.json([ - { - id: 'us-west-a', - name: 'us-west-a' - }, - { - id: 'us-west-b', - name: 'us-west-b' - }, - { - id: 'us-west-c', - name: 'us-west-c' - } - ]); -}); - -/** - * Retrieve AWS VPC CIDRS - */ -router.get(`${ENDPOINT}/providers/aws/subnets`, (req, res) => { - winston.info('Mock TKG UI RETRIEVE AWS VPC SUBNET INFO'); - res.status(200); - res.json([ - { - availabilityZoneId: 'us-west-a', - availabilityZoneName: 'us-west-a', - cidr: '100.64.0.0/13', - isPublic: true, - id: 'sn1' - }, - { - availabilityZoneId: 'us-west-b', - availabilityZoneName: 'us-west-b', - cidr: '100.64.0.0/14', - isPublic: true, - id: 'sn2' - }, - { - availabilityZoneId: 'us-west-b', - availabilityZoneName: 'us-west-b', - cidr: '100.64.0.0/21', - isPublic: false, - id: 'sn3' - }, - { - availabilityZoneId: 'us-west-a', - availabilityZoneName: 'us-west-a', - cidr: '100.64.0.0/24', - isPublic: false, - id: 'sn4' - }, - { - availabilityZoneId: 'us-west-c', - availabilityZoneName: 'us-west-c', - cidr: '100.24.0.0/21', - isPublic: false, - id: 'sn5' - }, - { - availabilityZoneId: 'us-west-c', - availabilityZoneName: 'us-west-c', - cidr: '100.24.0.0/24', - isPublic: true, - id: 'sn6' - } - ]); -}); - -/** - * Retrieve AWS node types - */ -router.get(`${ENDPOINT}/providers/aws/nodetypes`, (req, res) => { - winston.info('Mock TKG UI RETRIEVE AWS NODE TYPES'); - res.status(200); - res.json([ - 't3.small', - 't3.medium', - 't3.large', - 't3.xlarge', - 'm5.large', - 'm5.xlarge', - 'm5a.2xlarge', - 'm5a.4xlarge', - 'c6gn.small', - 'c6gn.medium', - 'c6gn.large', - 'r4.8xlarge', - 'i3.xlarge', - 't3.small', - 't3.medium', - 't3.large', - 't3.xlarge', - 'm5.large', - 'm5.xlarge', - 'm5a.2xlarge', - 'm5a.4xlarge', - 'r4.8xlarge', - 'i3.xlarge', - 't4g.small', - 't4g.medium', - 't4g.large' - ]); -}); - -/** - * Retrieve AWS regions - */ -router.get(`${ENDPOINT}/providers/aws/regions`, (req, res) => { - winston.info('Mock TKG UI RETRIEVE AWS REGIONS'); - res.status(200); - res.json(['US-WEST', 'US-EAST', 'Singapore', 'China']); -}); - -/** - * Retrieve AWS profiles - */ -router.get(`${ENDPOINT}/providers/aws/profiles`, (req, res) => { - winston.info('Mock TKG UI RETRIEVE AWS PROFILES'); - res.status(200); - res.json(['profile1', 'profile2', 'profile3', 'profile4']); -}); - -/** - * Retrieve os image - */ -router.get(`${ENDPOINT}/providers/aws/osimages`, (req, res) => { - winston.info('Mock TKG UI RETRIEVE AWS OS IMAGES'); - res.status(200); - res.json([{ - name: 'amazon-2-amd64 (ami-0e6bac92abe2cbcf1)', - osInfo: { - arch: 'amd64', - name: 'amazon', - version: '2' - } - }, { - name: 'ubuntu-20.04-amd64 (ami-0247eab6f03299f45)', - osInfo: { - arch: 'amd64', - name: 'ubuntu', - version: '20.04' - } - }]); -}); - -/** - * Mock route for create aws cluster - */ -router.post(`${ENDPOINT}/providers/aws/create`, (req, res) => { - winston.info('Mock TKG UI CREATE AWS CLUSTER'); - res.status(200); - res.json({}); -}); - -/** - * Mock route for apply tkg config aws cluster - */ -router.post(`${ENDPOINT}/providers/aws/tkgconfig`, (req, res) => { - winston.info('Mock TKG UI APPLY TKG CONFIG'); - res.status(200); - res.json({ - path: "/path/to/config" - }); -}); - -/** - * Mock route for getting config file - */ -router.post(`${ENDPOINT}/providers/aws/config/export`, (req, res) => { - winston.info('Mock TKG UI export config'); - res.status(200); res.status(200); - res.json("Pretend this is a beautiful config file"); -}); - -router.post(`${ENDPOINT}/providers/aws/config/import`, (req, res) => { - winston.info('Mock TKG UI import config'); - res.status(200); - res.json({ - "awsAccountParams": { - "profileName": "profile1", - "sessionToken": "", - "region": "US-WEST", - "accessKeyID": "", - "secretAccessKey": "" - }, - "loadbalancerSchemeInternal": false, - "sshKeyName": "default", - "createCloudFormationStack": true, - "clusterName": "", - "controlPlaneNodeType": "i3.xlarge", - "controlPlaneFlavor": "prod", - "bastionHostEnabled": true, - "machineHealthCheckEnabled": true, - "vpc": { - "cidr": "10.0.0.0/16", - "vpcID": "", - "azs": [ - { - "name": "us-west-a", - "workerNodeType": "t3.small", - "publicNodeCidr": "", - "privateNodeCidr": "", - "publicSubnetID": "", - "privateSubnetID": "" - }, - { - "name": "us-west-b", - "workerNodeType": "t3.xlarge", - "publicNodeCidr": "", - "privateNodeCidr": "", - "publicSubnetID": "", - "privateSubnetID": "" - }, - { - "name": "us-west-c", - "workerNodeType": "m5a.2xlarge", - "publicNodeCidr": "", - "privateNodeCidr": "", - "publicSubnetID": "", - "privateSubnetID": "" - } - ] - }, - "enableAuditLogging": false, - "networking": { - "networkName": "", - "clusterDNSName": "", - "clusterNodeCIDR": "", - "clusterServiceCIDR": "100.64.0.0/13", - "clusterPodCIDR": "100.96.0.0/11", - "cniType": "antrea" - }, - "ceipOptIn": true, - "labels": {}, - "os": "1: Object", - "annotations": { - "description": "", - "location": "" - }, - "identityManagement": { - "idm_type": "none" - }, - "aviConfig": { - "controller": "", - "username": "", - "password": "", - "cloud": "", - "service_engine": "", - "ca_cert": "", - "network": { - "name": "", - "cidr": "" - }, - "labels": {} - } - }); -}); - -/*** Azure related mock services ***/ - -/** -* Retrieve Azure account params from ENV variables -*/ -router.get(`${ENDPOINT}/providers/azure`, (req, res) => { - winston.info('Mock TKG UI FETCH AZURE CREDENTIALS'); - - const credentials = { - tenantId: "", - clientId: "", - clientSecret: "", - subscriptionId: "" - }; - - res.status(200); - res.json(credentials); -}); - -/** - * Verify Azure account credentials - */ -router.post(`${ENDPOINT}/providers/azure`, (req, res) => { - winston.info('Mock TKG UI VERIFY AZURE CREDENTIALS'); - if (req.body.tenantId && req.body.clientId && req.body.clientSecret && req.body.subscriptionId) { - res.status(201); - res.json({}); - } else { - res.status(400); - res.json({ message: "Incorrect credentials" }); - } -}); - -/** -* Retrieve Azure resource groups -*/ -router.get(`${ENDPOINT}/providers/azure/resourcegroups`, (req, res) => { - winston.info('Mock TKG UI FETCH AZURE RESOURCE GROUPS'); - - const rgs = [ - { - id: 1, - location: "us-west", - name: "resource-group1" - }, - { - id: 2, - location: "us-east", - name: "resource-group2" - }, - { - id: 3, - location: "us-south", - name: "resource-group3" - } - ]; - - if (req.query.location) { - res.status(200); - res.json(rgs); - } else { - res.status(400); - res.json({ message: "Missing resource group 'region'" }); - } -}); - -/** - * Mock route for importing config file - */ -router.post(`${ENDPOINT}/providers/azure/config/import`, (req, res) => { - winston.info('Mock TKG UI import config'); - res.status(200); res.status(200); - res.json({ - 'azureAccountParams': { - 'tenantId': 'tenant-id', - 'clientId': 'client-id', - 'clientSecret': 'client-secret', - 'subscriptionId': 'subscription-id', - 'azureCloud': 'AzurePublicCloud' - }, - 'location': 'centralus', - 'sshPublicKey': 'ssh-pub-key', - 'controlPlaneMachineType': 'Standard_B2ms', - 'controlPlaneFlavor': 'dev', - 'workerMachineType': 'Standard_B2ms', - 'machineHealthCheckEnabled': true, - 'resourceGroup': 'resource-group3', - 'clusterName': 'poofta', - 'vnetResourceGroup': 'resource-group3', - 'vnetName': 'vnet2', - 'vnetCidr': '', - 'controlPlaneSubnet': 'subnet3', - 'workerNodeSubnet': '', - 'enableAuditLogging': true, - "networking":{ - "networkName":"network-name", - "clusterDNSName":"", - "clusterNodeCIDR":"", - "clusterServiceCIDR":"100.64.0.0/13", - "clusterPodCIDR":"100.96.0.0/11", - "cniType":"antrea", - "httpProxyConfiguration":{ - "enabled":true, - "HTTPProxyURL":"http://proxy-foo", - "HTTPProxyUsername":"proxy-user-bar", - "HTTPProxyPassword":"proxy-password-bar", - "noProxy":"no-proxy", - "HTTPSProxyURL":"http://proxy-foo", - "HTTPSProxyUsername":"proxy-user-bar", - "HTTPSProxyPassword":"proxy-password-bar" - } - }, - 'ceipOptIn': false, - 'labels': { - "foo":"bar", - "goo":"gar" - }, - 'os': { - 'name': 'Ubuntu-20.04-amd64 (2021.04.13)', - 'osInfo': { - 'arch': 'amd64', - 'name': 'ubuntu', - 'version': '20.04' - } - }, - 'annotations': { - 'description': 'optional-description-foo', - 'location': '' - }, - "identityManagement": { - "idm_type": "none", - "ldap_group_search_name_attr": "cn", - "ldap_group_search_user_attr": "DN", - "ldap_user_search_username": "userPrincipalName", - "oidc_claim_mappings": { - "groups": "group-claim", - "username": "username-claim" - } - }, - 'aviConfig': { - 'controller': '', - 'username': '', - 'password': '', - 'cloud': '', - 'service_engine': '', - 'ca_cert': '', - 'network': { - 'name': '', - 'cidr': '' - }, - 'labels': {} - }, - 'isPrivateCluster': true, - 'frontendPrivateIp': '10.3.0.0' - }); -}); - -/** - * Create an Azure resource group - */ -router.post(`${ENDPOINT}/providers/azure/resourcegroups`, (req, res) => { - winston.info('Mock TKG UI CREATE AZURE RESOURCE GROUP'); - if (req.body.location && req.body.name) { - res.status(201); - res.json({}); - } else { - res.status(400); - res.json({ message: "Missing either resource group 'region' or 'name'" }); - } -}); - -/** - * Retrieve Azure VNets for a particular resource group - */ -router.get(`${ENDPOINT}/providers/azure/resourcegroups/:rgn/vnets`, (req, res) => { - winston.info('Mock TKG UI RETRIEVE AZURE VNETS'); - const vnets = [ - { - id: 1, - cidrBlock: ['10.1.0.0/11', '10.2.0.0/11'], - location: 'us-west', - name: "vnet1", - subnets: [{ 'name': 'subnet1', 'cidr': '10.0.0.0/16' }, { 'name': 'subnet2', 'cidr': '16.5.0.0/24' }] - }, - { - id: 2, - cidrBlock: ['10.3.0.0/11', '10.4.0.0/11'], - location: 'us-west', - name: "vnet2", - subnets: [{ 'name': 'subnet3', 'cidr': '10.3.0.0/18' }, { 'name': 'subnet4', 'cidr': '10.4.0.0/22' }] - }, - { - id: 3, - cidrBlock: ['10.5.0.0/11', '10.6.0.0/11', '10.7.0.0/11'], - location: 'us-west', - name: "vnet3", - subnets: [{ 'name': 'subnet5', 'cidr': '10.5.0.0/16' }, { 'name': 'subnet7', 'cidr': '10.5.0.0/23' }, { 'name': 'subnet9', 'cidr': '10.5.233.0/23' }] - } - ]; - - if (req.params.rgn) { - res.status(200); - res.json(vnets); - } else { - res.status(400); - res.json({ message: "Missing either resource group name" }); - } -}); - -/** - * Retrieve Azure regions - */ -router.get(`${ENDPOINT}/providers/azure/regions`, (req, res) => { - winston.info('Mock TKG UI RETRIEVE AZURE REGIONS'); - const regions = [ - { - name: "westus", - displayName: "West US" - }, - { - name: "northcentralus", - displayName: "North central US" - }, - { - name: "southcentralus", - displayName: "South central US" - }, - { - name: "centralus", - displayName: "Central US" - }, - { - name: "eastus", - displayName: "East US" - }, - { - name: "eastus2", - displayName: "East US 2" - } - ]; - res.status(200); - res.json(regions); -}); - -router.get(`${ENDPOINT}/providers/azure/regions/:location/instanceTypes`, (req, res) => { - const output = [ - { - name: "Standard_B1ls" - }, - { - name: "Standard_B1ms" - }, - { - name: "Standard_B1s" - }, - { - name: "Standard_B2ms" - }, - { - name: "Standard_B2s" - }, - { - name: "Standard_B4ms" - }, - { - name: "Standard_B8ms" - }, - { - name: "Standard_B12ms" - }, - { - name: "Standard_B16ms" - }, - { - name: "Standard_B20ms" - }, - ]; - winston.info('Mock TKG UI RETRIEVE AZURE REGIONS'); - res.status(200); - res.json(output); -}); - -/** - * Retrieve os image - */ - router.get(`${ENDPOINT}/providers/azure/osimages`, (req, res) => { - winston.info('Mock TKG UI RETRIEVE AZURE OS IMAGES'); - res.status(200); - res.json([{ - name: 'ubuntu-18.04-amd64 (2021.04.13)', - osInfo: { - arch: 'amd64', - name: 'ubuntu', - version: '18.04' - } - }, { - name: 'Ubuntu-20.04-amd64 (2021.04.13)', - osInfo: { - arch: 'amd64', - name: 'ubuntu', - version: '20.04' - } - }]); -}); - -/** - * Mock route for create Azure cluster - */ -router.post(`${ENDPOINT}/providers/azure/create`, (req, res) => { - winston.info('Mock TKG UI CREATE AZURE CLUSTER'); - res.status(200); - res.json({}); -}); - -/** - * Mock route for apply tkg config azure cluster - */ -router.post(`${ENDPOINT}/providers/azure/tkgconfig`, (req, res) => { - winston.info('Mock TKG UI APPLY TKG CONFIG'); - res.status(200); - res.json({ - path: "/path/to/config" - }); -}); - -/** - * Mock route for getting config file - */ -router.post(`${ENDPOINT}/providers/azure/config/export`, (req, res) => { - winston.info('Mock TKG UI export config'); - res.status(200); res.status(200); - res.json("Pretend this is a beautiful config file"); -}); - -/********************************* VSPHERE **********************************/ - -/** - * Mock route for apply tkg config vsphere cluster - */ -router.post(`${ENDPOINT}/providers/vsphere/tkgconfig`, (req, res) => { - winston.info('Mock TKG UI APPLY TKG CONFIG'); - res.status(200); - res.json({ - path: "/path/to/config" - }); -}); - -/** - * Mock route for create vsphere cluster - */ -router.post(`${ENDPOINT}/providers/vsphere/create`, (req, res) => { - winston.info('Mock TKG UI CREATE VSPHERE CLUSTER'); - res.status(200); - res.json({}); -}); - -/** - * Retrieve compute resources - */ -router.get(`${ENDPOINT}/providers/vsphere/compute`, (req, res) => { - winston.info('Mock TKG UI RETRIEVE COMPUTE RESOURCES'); - res.status(200); - res.json([ - { - moid: "dc1", - name: "DC1", - parentMoid: "", - path: "", - resourceType: "datacenter" - }, - { - moid: "cluster1", - name: "Cluster 1", - parentMoid: "dc1", - path: "cluster1-path", - resourceType: "cluster" - }, - { - moid: "respool-1", - name: "respool-1", - parentMoid: "cluster1", - path: "/cluster1-path/Resources/respool-1-path", - resourceType: "respool" - }, - { - moid: "respool-1-sub", - name: "respool-1-sub", - parentMoid: "respool-1", - path: "/cluster1-path/Resources/respool-1-path/sub-host-1-path", - resourceType: "respool" - }, - { - moid: "respool-2", - name: "respool-2", - parentMoid: "cluster1", - path: "/cluster1-path/Resources/respool-2-path", - resourceType: "respool" - }, - { - moid: "host-2", - name: "Host-2", - parentMoid: "dc1", - path: "host-2-path", - resourceType: "host" - }, - { - moid: "cluster2", - name: "Cluster 2", - parentMoid: "dc1", - path: "cluster2-path", - resourceType: "cluster" - } - ]); -}); -/** - * Import config - */ -router.post(`${ENDPOINT}/providers/vsphere/config/import`, (req, res) => { - winston.info('Mock TKG UI IMPORT'); - res.status(200); - res.json( - { - "ceipOptIn": true, - "controlPlaneEndpoint": "10.92.12.54", - "controlPlaneFlavor": "dev", - "controlPlaneNodeType": "medium", - "datacenter": "/dc0", - "datastore": "/dc0/datastore/local-1", - "folder": "/dc0/vm", - "identityManagement": { - "idm_type": "none", - "ldap_group_search_name_attr": "cn", - "ldap_group_search_user_attr": "DN", - "ldap_user_search_username": "userPrincipalName", - "oidc_claim_mappings": {"groups": "", "username": ""} - }, - "ipFamily": "ipv4", - "machineHealthCheckEnabled": true, - "networking": {"clusterPodCIDR": "100.96.0.0/11", "clusterServiceCIDR": "100.64.0.0/13", "networkName": "/dc0/network/VM Network"}, - "os": {"isTemplate": null, "name": "GeeIDunno", "osInfo": {"arch": "amd64", "name": "photon", "version": "3"}}, - "resourcePool": "/dc0/host/cluster0/Resources", - "ssh_key": "F8:DB:B3:6E:34:C6:0C:4D:15:8E:58:56:94:3D:32:4D:B6:85:BB:65", - "vsphereCredentials": { - "host": "10.92.13.72", - "password": "", - "thumbprint": "F8:DB:B3:6E:34:C6:0C:4D:15:8E:58:56:94:3D:32:4D:B6:85:BB:65", - "username": "administrator@vsphere.local" - } - } - ); -}); - -/********************************* DOCKER **********************************/ - -router.get(`${ENDPOINT}/providers/docker/daemon`, (req, res) => { - winston.info('Mock TKG UI VALIDATE DOCKER DAEMON'); - mockDockerDaemonCounter++; - res.status(200); - res.json( - { - status: mockDockerDaemonCounter > 1 ? true : false - } - ); -}); - -/** - * Mock route for create docker cluster - */ - router.post(`${ENDPOINT}/providers/docker/create`, (req, res) => { - winston.info('Mock TKG UI CREATE docker CLUSTER'); - res.status(200); - res.json({}); -}); - -/** - * Mock route for apply tkg config docker cluster - */ -router.post(`${ENDPOINT}/providers/docker/tkgconfig`, (req, res) => { - winston.info('Mock TKG UI APPLY TKG CONFIG'); - res.status(200); - res.json({ - path: "/path/to/config" - }); -}); - -/** - * Mock route for getting config file - */ -router.post(`${ENDPOINT}/providers/docker/config/export`, (req, res) => { - winston.info('Mock TKG UI export config'); - res.status(200); res.status(200); - res.json("CLUSTER_CIDR: 100.96.0.0/11\n" + - "CLUSTER_NAME: foobar-cluster\n" + - "CLUSTER_PLAN: dev\n" + - "ENABLE_MHC: \"false\"\n" + - "IDENTITY_MANAGEMENT_TYPE: none\n" + - "INFRASTRUCTURE_PROVIDER: docker\n" + - "LDAP_BIND_DN: \"\"\n" + - "LDAP_BIND_PASSWORD: \"\"\n" + - "LDAP_GROUP_SEARCH_BASE_DN: \"\"\n" + - "LDAP_GROUP_SEARCH_FILTER: \"\"\n" + - "LDAP_GROUP_SEARCH_GROUP_ATTRIBUTE: \"\"\n" + - "LDAP_GROUP_SEARCH_NAME_ATTRIBUTE: cn\n" + - "LDAP_GROUP_SEARCH_USER_ATTRIBUTE: DN\n" + - "LDAP_HOST: \"\"\n" + - "LDAP_ROOT_CA_DATA_B64: \"\"\n" + - "LDAP_USER_SEARCH_BASE_DN: \"\"\n" + - "LDAP_USER_SEARCH_FILTER: \"\"\n" + - "LDAP_USER_SEARCH_NAME_ATTRIBUTE: \"\"\n" + - "LDAP_USER_SEARCH_USERNAME: userPrincipalName\n" + - "OIDC_IDENTITY_PROVIDER_CLIENT_ID: \"\"\n" + - "OIDC_IDENTITY_PROVIDER_CLIENT_SECRET: \"\"\n" + - "OIDC_IDENTITY_PROVIDER_GROUPS_CLAIM: \"\"\n" + - "OIDC_IDENTITY_PROVIDER_ISSUER_URL: \"\"\n" + - "OIDC_IDENTITY_PROVIDER_NAME: \"\"\n" + - "OIDC_IDENTITY_PROVIDER_SCOPES: \"\"\n" + - "OIDC_IDENTITY_PROVIDER_USERNAME_CLAIM: \"\"\n" + - "OS_ARCH: \"\"\n" + - "OS_NAME: \"\"\n" + - "OS_VERSION: \"\"\n" + - "SERVICE_CIDR: 100.64.0.0/13\n" + - "TKG_HTTP_PROXY: http://us3rname:passw0rd@foo/bar/path/\n" + - "TKG_HTTP_PROXY_ENABLED: \"true\"\n" + - "TKG_HTTPS_PROXY: http://namie:passwordie@foo/bar/another/path/\n" + - "TKG_NO_PROXY: not-even-a-proxy"); -}); -/** - * Import config - */ -router.post(`${ENDPOINT}/providers/docker/config/import`, (req, res) => { - winston.info('Mock TKG UI IMPORT'); - res.status(200); - res.json( - { - "ceipOptIn": false, - "clusterName": "stand-alonie", - "identityManagement": { - "idm_type": "none", - "ldap_group_search_name_attr": "cn", - "ldap_group_search_user_attr": "DN", - "ldap_user_search_username": "userPrincipalName", - "oidc_claim_mappings": { - "groups": "group-claim", - "username": "username-claim" - } - }, - "networking": { - "clusterPodCIDR": "100.96.0.0/11", - "clusterServiceCIDR": "100.64.0.0/13", - "httpProxyConfiguration": { - "HTTPProxyPassword": "foo-password", - "HTTPProxyURL": "httpproxyurl/", - "HTTPProxyUsername": "foo-username", - "HTTPSProxyPassword": "bar-password", - "HTTPSProxyURL": "httpsproxyish/path/foo", - "HTTPSProxyUsername": "bar-username", - "enabled": true, - "noProxy": "nyet-proxy" - } - } - } - ); -}); - -/** - * LDAP verification mock services - */ -router.post(`${ENDPOINT}/ldap/connect`, (req, res) => { - winston.info('Mock TKG UI VERIFY LDAP CONNECTION'); - res.status(200); -}); - -router.post(`${ENDPOINT}/ldap/bind`, (req, res) => { - winston.info('Mock TKG UI VERIFY LDAP BIND'); - res.status(200); -}); - -router.post(`${ENDPOINT}/ldap/users/search`, (req, res) => { - winston.info('Mock TKG UI VERIFY LDAP USER SEARCH'); - res.status(200); -}); - -router.post(`${ENDPOINT}/ldap/groups/search`, (req, res) => { - winston.info('Mock TKG UI VERIFY LDAP GROUP SEARCH'); - res.status(200); -}); - -router.post(`${ENDPOINT}/ldap/disconnect`, (req, res) => { - winston.info('Mock TKG UI VERIFY LDAP DISCONNECT'); - res.status(200); -}); - -module.exports = router; diff --git a/tkg/web/node-server/src/services/bodyParser.js b/tkg/web/node-server/src/services/bodyParser.js deleted file mode 100644 index ec34e870ea..0000000000 --- a/tkg/web/node-server/src/services/bodyParser.js +++ /dev/null @@ -1,63 +0,0 @@ -const bodyParser = require('body-parser'); -const clonedBodyParser = Object.assign({}, bodyParser); -const _json = bodyParser.json; -const _urlEncoded = bodyParser.urlencoded; - -const isMultipartRequest = function(req) { - let contentTypeHeader = req.headers['content-type']; - return contentTypeHeader && contentTypeHeader.indexOf('multipart') > -1; -}; - -/** - * @method Override of bodyParser.json function - * Returns a modified json middleware - * @returns {Function} Modified instance of json() middleware - */ -clonedBodyParser.json = function() { - let _jsonInstance = _json(...arguments); - - /** - * @inner - * body parser does not handle multipart bodies, due to their complex - * and typically large nature. Bypass body parsing middleware in case - * of multipart requests - * @returns {Function} Modified instance of json() middleware - * @param req - * @param res - * @param next - */ - return (req, res, next) => { - if (isMultipartRequest(req)) { - return next(); - } - return _jsonInstance(req, res, next); - }; -}; - -/** - * @method Override of bodyParser.urlencoded function - * Returns a modified json middleware - * @returns {Function} Modified instance of urlencoded() middleware - */ -clonedBodyParser.urlencoded = function() { - let _urlEncodedInstance = _urlEncoded(...arguments); - - /** - * @inner - * body parser does not handle multipart bodies, due to their complex - * and typically large nature. Bypass body parsing middleware in case - * of multipart requests - * @returns {Function} Modified instance of json() middleware - * @param req - * @param res - * @param next - */ - return (req, res, next) => { - if (isMultipartRequest(req)) { - return next(); - } - return _urlEncodedInstance(req, res, next); - }; -}; - -module.exports = clonedBodyParser; diff --git a/tkg/web/node-server/src/services/util.js b/tkg/web/node-server/src/services/util.js deleted file mode 100644 index a601481701..0000000000 --- a/tkg/web/node-server/src/services/util.js +++ /dev/null @@ -1,154 +0,0 @@ -'use strict'; - -// -// General utility library. -// NOTE: This module must NOT depend on 'yllr'; exceptionally, it should use Node.assert -// - -const _ = require('lodash'); -const assert = require('assert'); -const path = require('path'); -const fs = require('fs'); -const PropertiesReader = require('properties-reader'); - -// -// Functions -// - -/** - * Determines if a path points to a directory that exists. - * @param {String} dir Path to check. - * @returns {Boolean} `true` if `dir` is an existing directory; `false` otherwise. - */ -let isDirSync = function(dir) { - return (fs.existsSync(dir) && fs.statSync(dir).isDirectory()); -}; - -/** - * Generates a string representation of a given object (typically a type or shape). - * @param {Object} obj Object to stringify - * (can be any type of JSON-serializable value). - * @param {Object} [options] Options for stringification: - * - excludeFunctions:Boolean [false] If truthy, functions are excluded from output. - * - [typeName:String] Optional type name to add to the representation. Used - * only if `obj` is an object (not an array, not a primitive). - * @returns {String|undefined} String representation of the object; `undefined` - * if `obj === undefined`. - */ -let stringify = function(obj, options) { - options = _.defaults(options, { - excludeFunctions: false, - typeName: undefined - }); - - // make sure arrays and objects come out fully-speced - let rep = obj === undefined ? undefined : JSON.stringify(obj, (key, value) => { - if (_.isFunction(value)) { - // likely an iface custom validator - return options.excludeFunctions ? undefined : ''; - } else if (value === undefined) { - return ''; - } - - return value; - }); - - if (options.typeName && _.isObject(obj)) { - // result of `JSON.stringify()` will be an object, as '{...}', so insert - // the type name after '{', resulting in '{ ...}' - rep = rep[0] + options.typeName + ' ' + rep.substr(1); - } - - return rep; -}; - -/** - * Makes a filename generator function for use with the 'rotating-file-stream' module. - * @param {String} filepath Path to the primary log file. What follows the last - * period will be used as the extension. Archived files will be placed in - * an 'older' subdir. - * @returns {Function} A rotating-file-stream log filename generator. - */ -let makeRotatingFilenameGenerator = function(filepath) { - assert(filepath && _.isString(filepath), - 'makeRotatingFilenameGenerator(): filepath must be a non-empty string: ' + - filepath); - - const ARCHIVE_SUBPATH = 'older'; - let fileext = path.extname(filepath); - let filename = path.basename(filepath, fileext); - let dirpath = path.dirname(filepath); - - // remove leading '.' - fileext = fileext.substr(1); - - // rotating file stream filename generator - return function(time, idx) { - if (!time) { - // non-rotated filename; also the name of the current log file (i.e. latest - // log entries will always be written to this file, and older ones rotated - // out to files with timestamps below) - return path.join(dirpath, filename + '.' + fileext); - } - - // add timestamp and index to name of rotated-out file - return path.join(dirpath, ARCHIVE_SUBPATH, - filename + '-' + - time.getFullYear() + - _.padStart((time.getMonth() + 1).toString(10), 2, '0') + - _.padStart(time.getDate().toString(10), 2, '0') + '+' + - _.padStart(time.getHours().toString(10), 2, '0') + - _.padStart(time.getMinutes().toString(10), 2, '0') + '+' + - _.padStart(idx.toString(10), 2, '0') + '.' + - fileext - ); - }; -}; - -/** - * Read in a .properties file - * @param {String} filepath Absolute or relative path to the properties file to be read - * @param {Array} properties properties to read - * @returns {Object} An object corresponding to the parsed properties file, - * empty object if file does not exist - */ -let readPropertiesFileSync = function(filepath, properties) { - let propertiesRes = PropertiesReader(filepath); - return properties.map(property => propertiesRes.get(property)); -}; - -/** - * Read in a json file with specified encoding - * @param {String} filepath Absolute or relative path to the json file to be read - * @param {String} [encoding] Encoding to use when reading the file, utf8 by default - * @returns {Object} An object corresponding to the parsed json file, - * empty object if file does not exist - */ -let readJsonFileSync = function(filepath, encoding) { - assert(_.isString(filepath), 'readJsonFileSync(): filepath: expecting ' + - 'String, got ' + filepath); - if (!fs.existsSync(filepath)) { - return {}; - } - - if (typeof (encoding) === 'undefined') { - encoding = 'utf8'; - } - let file = fs.readFileSync(filepath, encoding); - try { - JSON.parse(file); - } catch (e) { - return file; - } - return JSON.parse(file); -}; - -// module definition -module.exports = { - // methods - isDirSync, - stringify, - makeRotatingFilenameGenerator, - readJsonFileSync, - readPropertiesFileSync -}; diff --git a/tkg/web/node-server/src/www.js b/tkg/web/node-server/src/www.js deleted file mode 100755 index 26e0e71a68..0000000000 --- a/tkg/web/node-server/src/www.js +++ /dev/null @@ -1,317 +0,0 @@ -'use strict'; - -// -// Web Server -// -const _ = require('lodash'); -const fs = require('fs'); -const http = require('http'); -const https = require('https'); -const paths = require('./conf/paths'); -const app = require(paths.src.app); -const appConfig = require(paths.src.appConfig); -const winston = require('winston'); - -const WebSocket = require('ws').Server; - -// NOTE: constants is a nodejs internal module and thus no need to add this -// to package.json -const constants = require('constants'); - -// -// Module -// -// {Number|String} port number or named pipe -let port; -// {Node|http} -let server; - -// Normalize a port into a number, string, or false. -// @returns {Number|String|Boolean} Normalized port as a string (named pipe), number -// (port), or `false` (invalid|unknown). -let normalizePort = function(val) { - let normPort = parseInt(val, 10); - - if (isNaN(normPort)) { - // named pipe - return val; - } - - if (normPort >= 0) { - // port number - return normPort; - } - - return false; -}; - -// Event listener for HTTP server 'error' event. -// @param {Node|http.error} error -let onError = function(error) { - let bind = _.isString(port) ? ('pipe ' + port) : ('port ' + port); - - if (error.syscall !== 'listen') { - throw error; - } - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - winston.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - - case 'EADDRINUSE': - winston.error(bind + ' is already in use'); - process.exit(1); - break; - - default: - throw error; - } -}; - -// Event listener for HTTP server 'listening' event. -let onListening = function() { - let addr = server.address(); - let bind = _.isString(addr) ? ('pipe ' + addr) : ('port ' + addr.port); - winston.info('listening on ' + bind); -}; - -// get port from environment and store in Express -port = normalizePort(appConfig.port); -app.set('port', port); - -// set app edition -if (_.includes(process.argv, '--tce') || appConfig.serverErrorState) { - winston.warn('Starting UI server in TCE mode'); - appConfig.edition = 'tce'; -} - -// create HTTP server -winston.warn('Starting UI server in insecure (http) mode'); -server = http.createServer(app); - -const logData = [ - { - type: 'status', - data: { - message: 'start deploying', - status: 'running', - currentPhase: 'Configure prerequisite', - totalPhases: ['Configure prerequisite', - 'Validate configuration', - 'Generate cluster configuration', - 'Setup bootstrap cluster', - 'Install providers on bootstrap cluster', - 'Create management cluster', - 'Install providers on management cluster', - 'Move cluster-api objects from bootstrap cluster to management cluster'], - successfulPhases: [] - } - }, - { - type: 'log', - data: { - currentPhase: 'Deploy Cluster phase msg 1', - message: 'I0227 16:23:18.924759 ms0', - logType: 'INFO' - } - }, - { - type: 'log', - data: { - currentPhase: 'Deploy Cluster phase msg 2', - message: 'I0227 16:23:18.924759 msg1', - logType: 'INFO' - } - }, - { - type: 'log', - data: { - currentPhase: 'Deploy Cluster phase msg 3', - message: 'I0227 16:23:18.924759 msg1', - logType: 'INFO' - } - }, - { - type: 'status', - data: { - message: 'start deploying', - status: 'running', - currentPhase: 'Validate configuration', - totalPhases: ['Configure prerequisite', - 'Validate configuration', - 'Generate cluster configuration', - 'Setup bootstrap cluster', - 'Install providers on bootstrap cluster', - 'Create management cluster', - 'Install providers on management cluster', - 'Move cluster-api objects from bootstrap cluster to management cluster'], - successfulPhases: [] - } - }, - { - type: 'status', - data: { - message: 'start deploying', - status: 'running', - currentPhase: 'Generate cluster configuration', - totalPhases: ['Configure prerequisite', - 'Validate configuration', - 'Generate cluster configuration', - 'Setup bootstrap cluster', - 'Install providers on bootstrap cluster', - 'Create management cluster', - 'Install providers on management cluster', - 'Move cluster-api objects from bootstrap cluster to management cluster'], - successfulPhases: [] - } - }, - { - type: 'status', - data: { - message: 'start deploying', - status: 'running', - currentPhase: 'Setup bootstrap cluster', - totalPhases: ['Configure prerequisite', - 'Validate configuration', - 'Generate cluster configuration', - 'Setup bootstrap cluster', - 'Install providers on bootstrap cluster', - 'Create management cluster', - 'Install providers on management cluster', - 'Move cluster-api objects from bootstrap cluster to management cluster'], - successfulPhases: ['Move cluster-api objects from bootstrap cluster to management cluster'] - } - }, - { - type: 'status', - data: { - message: 'start deploying', - status: 'running', - currentPhase: 'Install providers on bootstrap cluster', - totalPhases: ['Configure prerequisite', - 'Validate configuration', - 'Generate cluster configuration', - 'Setup bootstrap cluster', - 'Install providers on bootstrap cluster', - 'Create management cluster', - 'Install providers on management cluster', - 'Move cluster-api objects from bootstrap cluster to management cluster'], - successfulPhases: ['Move cluster-api objects from bootstrap cluster to management cluster'] - } - }, - { - type: 'status', - data: { - message: 'start deploying', - status: 'running', - currentPhase: 'Create management cluster', - totalPhases: ['Configure prerequisite', - 'Validate configuration', - 'Generate cluster configuration', - 'Setup bootstrap cluster', - 'Install providers on bootstrap cluster', - 'Create management cluster', - 'Install providers on management cluster', - 'Move cluster-api objects from bootstrap cluster to management cluster'], - successfulPhases: ['Move cluster-api objects from bootstrap cluster to management cluster'] - } - }, - { - type: 'status', - data: { - message: 'start deploying', - status: 'running', - currentPhase: 'Install providers on management cluster', - totalPhases: ['Configure prerequisite', - 'Validate configuration', - 'Generate cluster configuration', - 'Setup bootstrap cluster', - 'Install providers on bootstrap cluster', - 'Create management cluster', - 'Install providers on management cluster', - 'Move cluster-api objects from bootstrap cluster to management cluster'], - successfulPhases: ['Move cluster-api objects from bootstrap cluster to management cluster'] - } - }, - { - type: 'status', - data: { - message: 'start deploying', - status: 'running', - currentPhase: 'Move cluster-api objects from bootstrap cluster to management cluster', - totalPhases: ['Configure prerequisite', - 'Validate configuration', - 'Generate cluster configuration', - 'Setup bootstrap cluster', - 'Install providers on bootstrap cluster', - 'Create management cluster', - 'Install providers on management cluster', - 'Move cluster-api objects from bootstrap cluster to management cluster'], - successfulPhases: ['Move cluster-api objects from bootstrap cluster to management cluster'] - } - }, - { - type: 'status', - data: { - message: 'start deploying', - status: 'successful', - totalPhases: ['Configure prerequisite', - 'Validate configuration', - 'Generate cluster configuration', - 'Setup bootstrap cluster', - 'Install providers on bootstrap cluster', - 'Create management cluster', - 'Install providers on management cluster', - 'Move cluster-api objects from bootstrap cluster to management cluster'], - successfulPhases: ['Move cluster-api objects from bootstrap cluster to management cluster'] - } - } -]; - -// set up websocket connection piggy-backed on express router at path '/ws' -const ws = new WebSocket({ server: server, path: '/ws' }); - -// wire websocket handlers -ws.on('connection', function (ws) { - // show the connection has been established in the console - winston.info("WS Connection established:"); - - // wire the event handlers - ws.on('message', function (data) { - // show the message object in the console - var message = JSON.parse(data); - winston.info("WS Message received from client:"); - winston.info(message); - - // send response to received message - if (message.operation && message.operation === 'logs') { - let x = 0; - - // mock an interval between sending log data - setInterval(function() { - if (x < logData.length) { - ws.send(JSON.stringify(logData[x])); - } - else return; - - x++; - }, 1500); - - } else { - let response = { - source: "WebAppsNodeJs Application (server)", - message:"Client Message Received!" - }; - - ws.send(JSON.stringify(response)); - } - }); -}); - -// listen on provided port, on all network interfaces -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); diff --git a/tkg/web/package-lock.json b/tkg/web/package-lock.json deleted file mode 100644 index c76a502efc..0000000000 --- a/tkg/web/package-lock.json +++ /dev/null @@ -1,33002 +0,0 @@ -{ - "name": "tkg-kickstart-ui", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "tkg-kickstart-ui", - "dependencies": { - "@angular/animations": "^12.2.13", - "@angular/common": "^12.2.13", - "@angular/compiler": "^12.2.13", - "@angular/core": "^12.2.13", - "@angular/forms": "^12.2.13", - "@angular/localize": "^12.2.13", - "@angular/platform-browser": "^12.2.13", - "@angular/platform-browser-dynamic": "^12.2.13", - "@angular/router": "^12.2.13", - "@cds/core": "^5.6.0", - "@clr/angular": "^12.0.7", - "@clr/icons": "^12.0.7", - "@clr/ui": "^12.0.7", - "@ctrl/ngx-codemirror": "2.2.1", - "@rxweb/reactive-form-validators": "^2.1.6", - "@types/lodash": "^4.14.170", - "@webcomponents/custom-elements": "1.3.2", - "@webcomponents/webcomponentsjs": "^2.6.0", - "codemirror": "^5.61.1", - "dotenv": "^8.2.0", - "elasticlunr": "^0.9.5", - "file-saver": "^2.0.5", - "lit-html": "^2.2.5", - "lodash": "^4.17.21", - "netmask": "^2.0.2", - "ngx-log-monitor": "^1.2.0", - "rxjs": "6.6.2", - "sort-paths": "1.1.1", - "titlecase": "^1.1.3", - "tslib": "^1.10.0", - "xregexp": "^4.3.0", - "zone.js": "^0.11.5" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^12.2.16", - "@angular/cli": "^12.2.13", - "@angular/compiler-cli": "^12.2.13", - "@angular/language-service": "^12.2.13", - "@types/jasmine": "^4.0.3", - "@types/jasminewd2": "^2.0.8", - "@types/node": "^12.11.1", - "api-client-generator": "^4.7.1", - "axios": "^0.24.0", - "codelyzer": "^5.1.2", - "html-frontmatter": "^1.6.1", - "is-ip": "^3.1.0", - "jasmine-core": "^4.0.1", - "jasmine-spec-reporter": "^4.2.1", - "karma": "^6.3.14", - "karma-chrome-launcher": "^3.1.1", - "karma-coverage-istanbul-reporter": "^3.0.3", - "karma-jasmine": "^5.0.1", - "karma-jasmine-html-reporter": "^1.6.0", - "karma-spec-reporter": "^0.0.32", - "protractor": "^7.0.0", - "protractor-fail-fast": "^3.1.0", - "protractor-jasmine2-screenshot-reporter": "^0.5.0", - "puppeteer": "^2.1.1", - "remove-html-comments": "^1.0.2", - "rimraf": "^3.0.2", - "showdown": "^1.9.1", - "ts-node": "^7.0.1", - "tslint": "^6.1.3", - "typescript": "4.3.5" - } - }, - "node_modules/@ampproject/remapping": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.1.tgz", - "integrity": "sha512-Ta9bMA3EtUHDaZJXqUoT5cn/EecwOp+SXpKJqxDbDuMbLvEMu6YTyDDuvTWeStODfdmXyfMo7LymQyPkN3BicA==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "1.0.0", - "sourcemap-codec": "1.4.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@angular-devkit/architect": { - "version": "0.1202.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.18.tgz", - "integrity": "sha512-C4ASKe+xBjl91MJyHDLt3z7ICPF9FU6B0CeJ1phwrlSHK9lmFG99WGxEj/Tc82+vHyPhajqS5XJ38KyVAPBGzA==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "12.2.18", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/architect/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/build-angular": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.18.tgz", - "integrity": "sha512-Hf3s7etN7zkHc7lhZZx3Bsm6hfLozuvN3z2aI39RDSlHOA83SoYpltnD9UV4B4d3cxU4PLUzpirb96QeS+E53Q==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "1.0.1", - "@angular-devkit/architect": "0.1202.18", - "@angular-devkit/build-optimizer": "0.1202.18", - "@angular-devkit/build-webpack": "0.1202.18", - "@angular-devkit/core": "12.2.18", - "@babel/core": "7.14.8", - "@babel/generator": "7.14.8", - "@babel/helper-annotate-as-pure": "7.14.5", - "@babel/plugin-proposal-async-generator-functions": "7.14.7", - "@babel/plugin-transform-async-to-generator": "7.14.5", - "@babel/plugin-transform-runtime": "7.14.5", - "@babel/preset-env": "7.14.8", - "@babel/runtime": "7.14.8", - "@babel/template": "7.14.5", - "@discoveryjs/json-ext": "0.5.3", - "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.2.18", - "ansi-colors": "4.1.1", - "babel-loader": "8.2.2", - "browserslist": "^4.9.1", - "cacache": "15.2.0", - "caniuse-lite": "^1.0.30001032", - "circular-dependency-plugin": "5.2.2", - "copy-webpack-plugin": "9.0.1", - "core-js": "3.16.0", - "critters": "0.0.12", - "css-loader": "6.2.0", - "css-minimizer-webpack-plugin": "3.0.2", - "esbuild-wasm": "0.13.8", - "find-cache-dir": "3.3.1", - "glob": "7.1.7", - "https-proxy-agent": "5.0.0", - "inquirer": "8.1.2", - "karma-source-map-support": "1.4.0", - "less": "4.1.1", - "less-loader": "10.0.1", - "license-webpack-plugin": "2.3.20", - "loader-utils": "2.0.0", - "mini-css-extract-plugin": "2.4.2", - "minimatch": "3.0.4", - "open": "8.2.1", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.1.0", - "postcss": "8.3.6", - "postcss-import": "14.0.2", - "postcss-loader": "6.1.1", - "postcss-preset-env": "6.7.0", - "regenerator-runtime": "0.13.9", - "resolve-url-loader": "4.0.0", - "rxjs": "6.6.7", - "sass": "1.36.0", - "sass-loader": "12.1.0", - "semver": "7.3.5", - "source-map-loader": "3.0.0", - "source-map-support": "0.5.19", - "style-loader": "3.2.1", - "stylus": "0.54.8", - "stylus-loader": "6.1.0", - "terser": "5.14.2", - "terser-webpack-plugin": "5.1.4", - "text-table": "0.2.0", - "tree-kill": "1.2.2", - "tslib": "2.3.0", - "webpack": "5.50.0", - "webpack-dev-middleware": "5.0.0", - "webpack-dev-server": "3.11.3", - "webpack-merge": "5.8.0", - "webpack-subresource-integrity": "1.5.2" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "optionalDependencies": { - "esbuild": "0.13.8" - }, - "peerDependencies": { - "@angular/compiler-cli": "^12.0.0", - "@angular/localize": "^12.0.0", - "@angular/service-worker": "^12.0.0", - "karma": "^6.3.0", - "ng-packagr": "^12.0.0", - "protractor": "^7.0.0", - "tailwindcss": "^2.0.0", - "tslint": "^6.1.0", - "typescript": "~4.2.3 || ~4.3.2" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "karma": { - "optional": true - }, - "ng-packagr": { - "optional": true - }, - "protractor": { - "optional": true - }, - "tailwindcss": { - "optional": true - }, - "tslint": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "dev": true - }, - "node_modules/@angular-devkit/build-optimizer": { - "version": "0.1202.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.18.tgz", - "integrity": "sha512-8ANaqa66IuaSRqJT3zTNUoeRDyLanE56tkNWqgYDPyZUsafEsomh9/fGVIkazymP1hReDLw+RoxSVxUsaRSsTA==", - "dev": true, - "dependencies": { - "source-map": "0.7.3", - "tslib": "2.3.0", - "typescript": "4.3.5" - }, - "bin": { - "build-optimizer": "src/build-optimizer/cli.js" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-optimizer/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "dev": true - }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1202.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.18.tgz", - "integrity": "sha512-656TIHb820Sb3ILHqcqoGJOPTsx2aUdeRrK8f7e6mxR4/kvQZQAevxP9C0TY+LUqQQqekzjKFq3+aYWOfzdR4Q==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1202.18", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^3.1.4" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/core": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz", - "integrity": "sha512-GDLHGe9HEY5SRS+NrKr14C8aHsRCiBFkBFSSbeohgLgcgSXzZHFoU84nDWrl3KZNP8oqcUSv5lHu6dLcf2fnww==", - "dev": true, - "dependencies": { - "ajv": "8.6.2", - "ajv-formats": "2.1.0", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz", - "integrity": "sha512-bZ9NS5PgoVfetRC6WeQBHCY5FqPZ9y2TKHUo12sOB2YSL3tgWgh1oXyP8PtX34gasqsLjNULxEQsAQYEsiX/qQ==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "12.2.18", - "ora": "5.4.1", - "rxjs": "6.6.7" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@angular/animations": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.17.tgz", - "integrity": "sha512-WVUcvKvr6wr9Nf3I2ksu5bFJ5xHhby4UEBTvOAdLpDqic+dzqtzVwAktDRprBSdxKQk1OlTw6jD4MsVEDKnZTg==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0" - }, - "peerDependencies": { - "@angular/core": "12.2.17" - } - }, - "node_modules/@angular/animations/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@angular/cli": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.2.18.tgz", - "integrity": "sha512-AvHi6DsxavxXJgEoFrrlYDtGGgCpofPDmOwHmxpIFNAeG1xdGYtK1zJhGbfu5acn8/5cGoJoBgDY+SEI+WOjxA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@angular-devkit/architect": "0.1202.18", - "@angular-devkit/core": "12.2.18", - "@angular-devkit/schematics": "12.2.18", - "@schematics/angular": "12.2.18", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.1", - "debug": "4.3.2", - "ini": "2.0.0", - "inquirer": "8.1.2", - "jsonc-parser": "3.0.0", - "npm-package-arg": "8.1.5", - "npm-pick-manifest": "6.1.1", - "open": "8.2.1", - "ora": "5.4.1", - "pacote": "12.0.2", - "resolve": "1.20.0", - "semver": "7.3.5", - "symbol-observable": "4.0.0", - "uuid": "8.3.2" - }, - "bin": { - "ng": "bin/ng" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/common": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.17.tgz", - "integrity": "sha512-/Rc83mzlL6YZScYTzg+Ng2hiCSf3jUVHAfQ8cyLOIMj/y8863Q+DMLVWW+ttvHwCjEFY44pC8IPyBl5FmSJYHg==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0" - }, - "peerDependencies": { - "@angular/core": "12.2.17", - "rxjs": "^6.5.3 || ^7.0.0" - } - }, - "node_modules/@angular/common/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@angular/compiler": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.17.tgz", - "integrity": "sha512-dxM1CxzvEJPk6ShJngkW5j5BejBloxQNi+fJi+F8P/GN/Rj7vJUf0JxL+TUt1+Iv575V4NidJDKKikk6K485CA==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0" - } - }, - "node_modules/@angular/compiler-cli": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.17.tgz", - "integrity": "sha512-gJJlnDr8Fhs6z0hH0Y/5GC1YAgHY+sRh2BUrbDu+nIUubyyOVYSyQdL1jwEfCSIZl1GSg+4b4thU7pp7HtmX8g==", - "dev": true, - "dependencies": { - "@babel/core": "^7.8.6", - "@babel/types": "^7.8.6", - "canonical-path": "1.0.0", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.25.0", - "minimist": "^1.2.0", - "reflect-metadata": "^0.1.2", - "semver": "^7.0.0", - "source-map": "^0.6.1", - "sourcemap-codec": "^1.4.8", - "tslib": "^2.2.0", - "yargs": "^17.0.0" - }, - "bin": { - "ivy-ngcc": "ngcc/main-ivy-ngcc.js", - "ng-xi18n": "src/extract_i18n.js", - "ngc": "src/main.js", - "ngcc": "ngcc/main-ngcc.js" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0" - }, - "peerDependencies": { - "@angular/compiler": "12.2.17", - "typescript": ">=4.2.3 <4.4" - } - }, - "node_modules/@angular/compiler-cli/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/@angular/compiler-cli/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "node_modules/@angular/compiler/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@angular/core": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.17.tgz", - "integrity": "sha512-XUvTgU0D8XqNH5Y7UlTMk/XjUQaEGC0kZxhw/QSSQr65WrXtXmcD4d8Cg84TJ52uGXmf7IAruKvtbvu1Mbmvug==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0" - }, - "peerDependencies": { - "rxjs": "^6.5.3 || ^7.0.0", - "zone.js": "~0.11.4" - } - }, - "node_modules/@angular/core/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@angular/forms": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.17.tgz", - "integrity": "sha512-iOIAz5OR6yLWuNTSOSDqAffQ0FU71yw1QsOmltU/hBsO6H6smsIKVe8VlFa4SnBSAyVZXf/OhDRJ8gOqQT09mw==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0" - }, - "peerDependencies": { - "@angular/common": "12.2.17", - "@angular/core": "12.2.17", - "@angular/platform-browser": "12.2.17", - "rxjs": "^6.5.3 || ^7.0.0" - } - }, - "node_modules/@angular/forms/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@angular/language-service": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-12.2.17.tgz", - "integrity": "sha512-mloPdK9iWLR3KQDE85e2k2iuIDsEr9gyFla3QI7UOVbzrsazRADxQxc5WHeDPxNbzTMjCYrcw8Jyc7WHssAPGw==", - "dev": true, - "engines": { - "node": "^12.14.1 || >=14.0.0" - } - }, - "node_modules/@angular/localize": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-12.2.17.tgz", - "integrity": "sha512-F87zH7TRLpjSlVUA2sAMkDHkF0ikcDVXciMlwlahcjX+ShL1q+iwddT0A4MOPyYTpXqfKAXniIvEK+C0OFdoAA==", - "dependencies": { - "@babel/core": "7.8.3", - "glob": "7.1.7", - "yargs": "^17.0.0" - }, - "bin": { - "localize-extract": "src/tools/src/extract/main.js", - "localize-migrate": "src/tools/src/migrate/main.js", - "localize-translate": "src/tools/src/translate/main.js" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0" - }, - "peerDependencies": { - "@angular/compiler": "12.2.17", - "@angular/compiler-cli": "12.2.17" - } - }, - "node_modules/@angular/localize/node_modules/@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/localize/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@angular/localize/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@angular/platform-browser": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.17.tgz", - "integrity": "sha512-fxs0FDEnS9mzd36u0bHd6TbCvRC9pqK0YCWNnoLCf5ALQtyIL8CpgGNjOMnO8mCEl5l9QTFCDvKOn4V3p7E/dg==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0" - }, - "peerDependencies": { - "@angular/animations": "12.2.17", - "@angular/common": "12.2.17", - "@angular/core": "12.2.17" - }, - "peerDependenciesMeta": { - "@angular/animations": { - "optional": true - } - } - }, - "node_modules/@angular/platform-browser-dynamic": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.17.tgz", - "integrity": "sha512-2v7R5l+4ULSNLviKVTHCqn6iNFgY1M/+HtM1ZcM72V4cVVsXqXUAh7WV4sk4l4ECsExKxQoc6JlVtPUub8cCKA==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0" - }, - "peerDependencies": { - "@angular/common": "12.2.17", - "@angular/compiler": "12.2.17", - "@angular/core": "12.2.17", - "@angular/platform-browser": "12.2.17" - } - }, - "node_modules/@angular/platform-browser-dynamic/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@angular/platform-browser/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@angular/router": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.17.tgz", - "integrity": "sha512-GKvEMUpLe157izpHLiS4bCZllqOj+MWhfWbhvR0DHFpE9FtkcDjBseTsWqQmyA1gqtRblO1Zn/1E33l9uaGMqw==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0" - }, - "peerDependencies": { - "@angular/common": "12.2.17", - "@angular/core": "12.2.17", - "@angular/platform-browser": "12.2.17", - "rxjs": "^6.5.3 || ^7.0.0" - } - }, - "node_modules/@angular/router/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@assemblyscript/loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", - "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.8", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "dependencies": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz", - "integrity": "sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", - "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", - "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", - "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", - "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", - "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", - "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.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-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-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "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-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "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-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-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "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-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-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz", - "integrity": "sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", - "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", - "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz", - "integrity": "sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", - "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.8.tgz", - "integrity": "sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-async-generator-functions": "^7.14.7", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@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-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.14.5", - "@babel/plugin-transform-classes": "^7.14.5", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.14.5", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-modules-systemjs": "^7.14.5", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.14.5", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.8", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.15.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz", - "integrity": "sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==", - "dependencies": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", - "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", - "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", - "dependencies": { - "@babel/types": "^7.20.5", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", - "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cds/city": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cds/city/-/city-1.1.0.tgz", - "integrity": "sha512-S9K+Q39BGOghyLHmR0Wdcmu1i1noSUk8HcvMj+3IaohZw02WFd99aPTQDHJeseXrXZP3CNovaSlePI0R11NcFg==", - "optional": true - }, - "node_modules/@cds/core": { - "version": "5.8.4", - "resolved": "https://registry.npmjs.org/@cds/core/-/core-5.8.4.tgz", - "integrity": "sha512-tr9sINJIrc/BGOK1ywzv1pyhhKLV28FcIHXgvHwNSDsMZgBjdn3gSD9nYZX5Z/aeNs3HCc0EsM7SXSVzG8x0VA==", - "dependencies": { - "lit": "^2.1.3", - "ramda": "^0.28.0", - "tslib": "^2.3.1" - }, - "optionalDependencies": { - "@cds/city": "^1.1.0", - "@types/resize-observer-browser": "^0.1.5", - "modern-normalize": "1.1.0" - } - }, - "node_modules/@cds/core/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@clr/angular": { - "version": "12.4.3", - "resolved": "https://registry.npmjs.org/@clr/angular/-/angular-12.4.3.tgz", - "integrity": "sha512-Ha1hOU16Lml6N8bq4rAnrTfPIu8isEHwOPJBk8ptFQX3UA+mD3vVrFz95nlvt1QhhZrso5xXoNerk1gEm4ECxg==", - "dependencies": { - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@angular/common": "^12.0.0", - "@angular/core": "^12.0.0", - "@cds/core": "^5.0.0" - } - }, - "node_modules/@clr/angular/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - }, - "node_modules/@clr/icons": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/@clr/icons/-/icons-12.0.12.tgz", - "integrity": "sha512-HWiDp9MuF+6/Rsy40dKAOySkITnvnXRcgGjG7M8hMTzkE86bODE7HWC5IkFi93bRAWCxBfmuVis5wel4OitEBg==", - "peerDependencies": { - "@webcomponents/custom-elements": "^1.0.0" - } - }, - "node_modules/@clr/ui": { - "version": "12.4.3", - "resolved": "https://registry.npmjs.org/@clr/ui/-/ui-12.4.3.tgz", - "integrity": "sha512-7G9cS/GJsETGMnh6nDNdfmioHQDiXqQdOGb4y8tmWIgf4KgnL4Gv3ps5IQp+/RA9Zh7NOmoCg+pzL6mpAf1yJA==", - "peerDependencies": { - "@clr/angular": "12.4.3" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@ctrl/ngx-codemirror": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ctrl/ngx-codemirror/-/ngx-codemirror-2.2.1.tgz", - "integrity": "sha512-WjGOkNUfrNCvR1jSZiR1wy5WKV1ZGfIljfak6zs2DtWRtXcE1Ks0EoNUPhe8IMeaCQ7UppNuGmYPOKTlaVXjJg==", - "dependencies": { - "@types/codemirror": "0.0.81", - "tslib": "^1.9.0" - }, - "peerDependencies": { - "@angular/core": ">=8.0.0", - "@angular/forms": ">=8.0.0", - "codemirror": "^5.48.2" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", - "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "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/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "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": "1.0.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz", - "integrity": "sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA==", - "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==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", - "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", - "dev": true, - "dependencies": { - "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.3", - "loader-utils": "^2.0.0", - "merge-source-map": "^1.1.0", - "schema-utils": "^2.7.0" - } - }, - "node_modules/@lit/reactive-element": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.5.0.tgz", - "integrity": "sha512-fQh9FDK0LPTwDk+0HhSZEtb8K0LTN1wXerwpGrWA+a8tWulYRDLI4vQDWp4GOIsewn0572KYV/oZ3+492D7osA==" - }, - "node_modules/@ngtools/webpack": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.18.tgz", - "integrity": "sha512-6h/QSG6oZDs2BGfrozdOKqtM5daoCu05q+0gyb3owHz1u9FtMeXXKQ3sQfyFC/GNT3dTMlH6YFxsJPvMPwuy9A==", - "dev": true, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^12.0.0", - "typescript": "~4.2.3 || ~4.3.2", - "webpack": "^5.30.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/git": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", - "dev": true - }, - "node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", - "dev": true, - "dependencies": { - "infer-owner": "^1.0.4" - } - }, - "node_modules/@npmcli/run-script": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", - "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^8.2.0", - "read-package-json-fast": "^2.0.1" - } - }, - "node_modules/@rxweb/reactive-form-validators": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@rxweb/reactive-form-validators/-/reactive-form-validators-2.1.7.tgz", - "integrity": "sha512-3AA10s0H0GC4pcQMXMGJvK58qEzFXNChWv4n832ZXP+0y8mVmOXOYQ9pr79dbPtP4/K3ZnnVMwC0WDQFfICuHQ==", - "dependencies": { - "tslib": "2.2.0" - } - }, - "node_modules/@rxweb/reactive-form-validators/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "node_modules/@schematics/angular": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.18.tgz", - "integrity": "sha512-niRS9Ly9y8uI0YmTSbo8KpdqCCiZ/ATMZWeS2id5M8JZvfXbngwiqJvojdSol0SWU+n1W4iA+lJBdt4gSKlD5w==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "12.2.18", - "@angular-devkit/schematics": "12.2.18", - "jsonc-parser": "3.0.0" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/codemirror": { - "version": "0.0.81", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.81.tgz", - "integrity": "sha512-QoeIb9tn/TZp0IzNyMKlcwHR6pHxNoIW9mKqF7asAsj+AWqpFOEUsxia756L6WKBQNk2psHpu+aFuIFqo3Ac0A==", - "dependencies": { - "@types/tern": "*" - } - }, - "node_modules/@types/component-emitter": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", - "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", - "dev": true - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/jasmine": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.1.tgz", - "integrity": "sha512-Vu8l+UGcshYmV1VWwULgnV/2RDbBaO6i2Ptx7nd//oJPIZGhoI1YLST4VKagD2Pq/Bc2/7zvtvhM7F3p4SN7kQ==", - "dev": true - }, - "node_modules/@types/jasminewd2": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", - "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", - "dev": true, - "dependencies": { - "@types/jasmine": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" - }, - "node_modules/@types/mime-types": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.1.tgz", - "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==", - "dev": true - }, - "node_modules/@types/resize-observer-browser": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", - "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==", - "optional": true - }, - "node_modules/@types/selenium-webdriver": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.20.tgz", - "integrity": "sha512-6d8Q5fqS9DWOXEhMDiF6/2FjyHdmP/jSTAUyeQR7QwrFeNmYyzmvGxD5aLIHL445HjWgibs0eAig+KPnbaesXA==", - "dev": true - }, - "node_modules/@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "dev": true - }, - "node_modules/@types/tern": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", - "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" - }, - "node_modules/@types/webpack-sources": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", - "integrity": "sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.6.1" - } - }, - "node_modules/@types/webpack-sources/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/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webcomponents/custom-elements": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.3.2.tgz", - "integrity": "sha512-0HtVxwE+PLPCIFL2i8/d+vjlrj8fgafmzZvIblZMyMcww9upicXTdfQT7K0Tg7tDlSoWxjmP2xKYP09A2YMocQ==" - }, - "node_modules/@webcomponents/webcomponentsjs": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.7.0.tgz", - "integrity": "sha512-j161Z9oiy8k74vchdrQGihfSp7QulrTclCUiPo0D7JF6/RjpXAmB0ThlTAFlSElkgqg0vdFgNAXaX9ZHZy25wQ==" - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true, - "engines": { - "node": ">=0.3.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/agentkeepalive/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "peerDependencies": { - "ajv": ">=5.0.0" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", - "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "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/api-client-generator": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/api-client-generator/-/api-client-generator-4.7.1.tgz", - "integrity": "sha512-KCiL8sv1gQKu0GZQG9AV8RSmZk0iSMSjjPIcuWg64j5PDjjRGgoYzzS3WQmceT2JZbqwj+OxfdUvgOtlE6V6sA==", - "dev": true, - "dependencies": { - "fs-extra": "^9.0.1", - "mustache": "^4.0.1", - "optimist": "^0.6.1", - "swagger-parser": "^6.0.5", - "which": "^2.0.2" - }, - "bin": { - "api-client-generator": "dist/main.js" - }, - "engines": { - "node": ">=8.9.1", - "yarn": ">=1.4.0" - } - }, - "node_modules/app-root-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", - "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "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/argparse/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/aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw==", - "dev": true, - "dependencies": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "dev": true, - "dependencies": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - }, - "node_modules/autoprefixer/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/autoprefixer/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/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "node_modules/axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.4" - } - }, - "node_modules/axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", - "dev": true, - "dependencies": { - "ast-types-flow": "0.0.7" - } - }, - "node_modules/babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", - "dev": true, - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", - "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.4", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", - "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.16.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", - "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.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/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/blocking-proxy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", - "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "blocking-proxy": "built/lib/bin.js" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/browserstack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", - "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", - "dev": true, - "dependencies": { - "https-proxy-agent": "^2.2.1" - } - }, - "node_modules/browserstack/node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/browserstack/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/browserstack/node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", - "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", - "dev": true, - "dependencies": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/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/camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "dev": true, - "dependencies": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001436", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz", - "integrity": "sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/canonical-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "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==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/circular-dependency-plugin": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", - "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", - "dev": true, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "webpack": ">=4.0.1" - } - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "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/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/codelyzer": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", - "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", - "dev": true, - "dependencies": { - "app-root-path": "^2.2.1", - "aria-query": "^3.0.0", - "axobject-query": "2.0.2", - "css-selector-tokenizer": "^0.7.1", - "cssauron": "^1.4.0", - "damerau-levenshtein": "^1.0.4", - "semver-dsl": "^1.0.1", - "source-map": "^0.5.7", - "sprintf-js": "^1.1.2" - }, - "peerDependencies": { - "@angular/compiler": ">=2.3.1 <10.0.0 || >9.0.0-beta <10.0.0 || >9.1.0-beta <10.0.0 || >9.2.0-beta <10.0.0", - "@angular/core": ">=2.3.1 <10.0.0 || >9.0.0-beta <10.0.0 || >9.1.0-beta <10.0.0 || >9.2.0-beta <10.0.0", - "tslint": "^5.0.0 || ^6.0.0" - } - }, - "node_modules/codelyzer/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/codemirror": { - "version": "5.65.10", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.10.tgz", - "integrity": "sha512-IXAG5wlhbgcTJ6rZZcmi4+sjWIbJqIGfeg3tNa3yX84Jb3T4huS5qzQAo/cUisc1l3bI47WZodpyf7cYcocDKg==" - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true - }, - "node_modules/colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "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==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "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/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", - "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.5", - "glob-parent": "^6.0.0", - "globby": "^11.0.3", - "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": 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/copy-webpack-plugin/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==", - "dev": true - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/core-js": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz", - "integrity": "sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", - "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", - "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/critters": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.12.tgz", - "integrity": "sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "css-select": "^4.1.3", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", - "pretty-bytes": "^5.3.0" - } - }, - "node_modules/critters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/critters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/critters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/critters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/critters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/critters/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/critters/node_modules/postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/critters/node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/critters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "node_modules/css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "dev": true, - "dependencies": { - "postcss": "^7.0.5" - }, - "bin": { - "css-blank-pseudo": "cli.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/css-blank-pseudo/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/css-blank-pseudo/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/css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "bin": { - "css-has-pseudo": "cli.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/css-has-pseudo/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-has-pseudo/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-has-pseudo/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/css-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.2.0.tgz", - "integrity": "sha512-/rvHfYRjIpymZblf49w8jYcRo2y9gj6rV8UroHGmBxKrIyGLokpycyKzp9OkitvqT29ZSpzJ0Ic7SpnJX3sC8g==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ==", - "dev": true, - "dependencies": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "p-limit": "^3.0.2", - "postcss": "^8.3.5", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": 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/css-minimizer-webpack-plugin/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==", - "dev": true - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-minimizer-webpack-plugin/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/css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", - "dev": true, - "dependencies": { - "css": "^2.0.0" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.5" - }, - "bin": { - "css-prefers-color-scheme": "cli.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/css-prefers-color-scheme/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/css-prefers-color-scheme/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/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/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/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha512-Ht70DcFBh+/ekjVrYS2PlDMdSQEl3OFNmjK6lcn49HptBgilXf/Zwg4uFh9Xn0pX3Q8YOkSjIFOfK2osvdqpBw==", - "dev": true, - "dependencies": { - "through": "X.X.X" - } - }, - "node_modules/cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", - "dev": true - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", - "dev": true, - "dependencies": { - "cssnano-preset-default": "^5.2.13", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.3", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/dateutil": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dateutil/-/dateutil-0.1.0.tgz", - "integrity": "sha512-bI8Lm50mageQER89AvYr+bAxXn4MCAkjSg3M58QY2evrIypUk2aCQcMZ86f31tjmt2ceMrPkrHkhItYqOJsObw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "dependencies": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/default-gateway/node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", - "dev": true, - "dependencies": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true - }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-packet/node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", - "dev": true, - "dependencies": { - "buffer-indexof": "^1.0.0" - } - }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.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==", - "dev": true - }, - "node_modules/elasticlunr": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/elasticlunr/-/elasticlunr-0.9.5.tgz", - "integrity": "sha512-5YM9LFQgVYfuLNEoqMqVWIBuF2UNCA+xu/jz1TyryLN/wmBcQSb+GNAwvLKvEpGESwgGN8XA1nbLAt6rKlyHYQ==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "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/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", - "dev": true, - "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true, - "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/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", - "dev": true, - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/esbuild": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.8.tgz", - "integrity": "sha512-A4af7G7YZLfG5OnARJRMtlpEsCkq/zHZQXewgPA864l9D6VjjbH1SuFYK/OSV6BtHwDGkdwyRrX0qQFLnMfUcw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "optionalDependencies": { - "esbuild-android-arm64": "0.13.8", - "esbuild-darwin-64": "0.13.8", - "esbuild-darwin-arm64": "0.13.8", - "esbuild-freebsd-64": "0.13.8", - "esbuild-freebsd-arm64": "0.13.8", - "esbuild-linux-32": "0.13.8", - "esbuild-linux-64": "0.13.8", - "esbuild-linux-arm": "0.13.8", - "esbuild-linux-arm64": "0.13.8", - "esbuild-linux-mips64le": "0.13.8", - "esbuild-linux-ppc64le": "0.13.8", - "esbuild-netbsd-64": "0.13.8", - "esbuild-openbsd-64": "0.13.8", - "esbuild-sunos-64": "0.13.8", - "esbuild-windows-32": "0.13.8", - "esbuild-windows-64": "0.13.8", - "esbuild-windows-arm64": "0.13.8" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.8.tgz", - "integrity": "sha512-AilbChndywpk7CdKkNSZ9klxl+9MboLctXd9LwLo3b0dawmOF/i/t2U5d8LM6SbT1Xw36F8yngSUPrd8yPs2RA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/esbuild-darwin-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.8.tgz", - "integrity": "sha512-b6sdiT84zV5LVaoF+UoMVGJzR/iE2vNUfUDfFQGrm4LBwM/PWXweKpuu6RD9mcyCq18cLxkP6w/LD/w9DtX3ng==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.8.tgz", - "integrity": "sha512-R8YuPiiJayuJJRUBG4H0VwkEKo6AvhJs2m7Tl0JaIer3u1FHHXwGhMxjJDmK+kXwTFPriSysPvcobXC/UrrZCQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.8.tgz", - "integrity": "sha512-zBn6urrn8FnKC+YSgDxdof9jhPCeU8kR/qaamlV4gI8R3KUaUK162WYM7UyFVAlj9N0MyD3AtB+hltzu4cysTw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.8.tgz", - "integrity": "sha512-pWW2slN7lGlkx0MOEBoUGwRX5UgSCLq3dy2c8RIOpiHtA87xAUpDBvZK10MykbT+aMfXc0NI2lu1X+6kI34xng==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/esbuild-linux-32": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.8.tgz", - "integrity": "sha512-T0I0ueeKVO/Is0CAeSEOG9s2jeNNb8jrrMwG9QBIm3UU18MRB60ERgkS2uV3fZ1vP2F8i3Z2e3Zju4lg9dhVmw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/esbuild-linux-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.8.tgz", - "integrity": "sha512-Bm8SYmFtvfDCIu9sjKppFXzRXn2BVpuCinU1ChTuMtdKI/7aPpXIrkqBNOgPTOQO9AylJJc1Zw6EvtKORhn64w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/esbuild-linux-arm": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.8.tgz", - "integrity": "sha512-4/HfcC40LJ4GPyboHA+db0jpFarTB628D1ifU+/5bunIgY+t6mHkJWyxWxAAE8wl/ZIuRYB9RJFdYpu1AXGPdg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.8.tgz", - "integrity": "sha512-X4pWZ+SL+FJ09chWFgRNO3F+YtvAQRcWh0uxKqZSWKiWodAB20flsW/OWFYLXBKiVCTeoGMvENZS/GeVac7+tQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.8.tgz", - "integrity": "sha512-o7e0D+sqHKT31v+mwFircJFjwSKVd2nbkHEn4l9xQ1hLR+Bv8rnt3HqlblY3+sBdlrOTGSwz0ReROlKUMJyldA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.8.tgz", - "integrity": "sha512-eZSQ0ERsWkukJp2px/UWJHVNuy0lMoz/HZcRWAbB6reoaBw7S9vMzYNUnflfL3XA6WDs+dZn3ekHE4Y2uWLGig==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.8.tgz", - "integrity": "sha512-gZX4kP7gVvOrvX0ZwgHmbuHczQUwqYppxqtoyC7VNd80t5nBHOFXVhWo2Ad/Lms0E8b+wwgI/WjZFTCpUHOg9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ] - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.8.tgz", - "integrity": "sha512-afzza308X4WmcebexbTzAgfEWt9MUkdTvwIa8xOu4CM2qGbl2LanqEl8/LUs8jh6Gqw6WsicEK52GPrS9wvkcw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/esbuild-sunos-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.8.tgz", - "integrity": "sha512-mWPZibmBbuMKD+LDN23LGcOZ2EawMYBONMXXHmbuxeT0XxCNwadbCVwUQ/2p5Dp5Kvf6mhrlIffcnWOiCBpiVw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ] - }, - "node_modules/esbuild-wasm": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.13.8.tgz", - "integrity": "sha512-UbD+3nloiSpJWXTCInZQrqPe8Y+RLfDkY/5kEHiXsw/lmaEvibe69qTzQu16m5R9je/0bF7VYQ5jaEOq0z9lLA==", - "dev": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.8.tgz", - "integrity": "sha512-QsZ1HnWIcnIEApETZWw8HlOhDSWqdZX2SylU7IzGxOYyVcX7QI06ety/aDcn437mwyO7Ph4RrbhB+2ntM8kX8A==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/esbuild-windows-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.8.tgz", - "integrity": "sha512-76Fb57B9eE/JmJi1QmUW0tRLQZfGo0it+JeYoCDTSlbTn7LV44ecOHIMJSSgZADUtRMWT9z0Kz186bnaB3amSg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.8.tgz", - "integrity": "sha512-HW6Mtq5eTudllxY2YgT62MrVcn7oq2o8TAoAvDUhyiEmRmDY8tPwAhb1vxw5/cdkbukM3KdMYtksnUhF/ekWeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "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==", - "dev": true - }, - "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==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/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/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": 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==", - "dev": 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==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter-asyncresource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "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/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "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/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/extract-zip/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==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/extract-zip/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "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==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "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/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/format-util": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", - "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", - "dev": true - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "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.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "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==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": 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/har-validator/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==", - "dev": true - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hat": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", - "integrity": "sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "dev": true, - "dependencies": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - } - }, - "node_modules/hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "node_modules/html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/html-frontmatter": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/html-frontmatter/-/html-frontmatter-1.6.1.tgz", - "integrity": "sha512-IPif2EfNWESEARtaFj+zqKdxbRGTrT9/bw3vIz9T1zPpyelIs6gn07z7lOSuSVUSO0U9annpdTQRRYrS+/y/zg==", - "dev": true, - "dependencies": { - "dateutil": "^0.1.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "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==", - "dev": true, - "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-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "dependencies": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.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==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.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==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", - "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", - "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, - "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==", - "dev": 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": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/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/import-local/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", - "dev": true - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/inquirer": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz", - "integrity": "sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.3.0", - "run-async": "^2.4.0", - "rxjs": "^7.2.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/rxjs": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz", - "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "node_modules/internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "dependencies": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": 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-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ip": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", - "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", - "dev": true, - "dependencies": { - "ip-regex": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "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": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==", - "dev": true, - "dependencies": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "bin": { - "jasmine": "bin/jasmine.js" - } - }, - "node_modules/jasmine-core": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", - "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", - "dev": true - }, - "node_modules/jasmine-fail-fast": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jasmine-fail-fast/-/jasmine-fail-fast-2.0.1.tgz", - "integrity": "sha512-En8ONwvDQOV+jyiZEZvbvUSLWSdJFj9HiWjhLdGq/V/gxs4XyST730ooe928BbRxv4bfy05OpykKuoOU4aLC5w==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/jasmine-spec-reporter": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", - "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", - "dev": true, - "dependencies": { - "colors": "1.1.2" - } - }, - "node_modules/jasmine/node_modules/jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==", - "dev": true - }, - "node_modules/jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==", - "dev": true, - "engines": { - "node": ">= 6.9.x" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-ref-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", - "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", - "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "dev": true, - "dependencies": { - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.12.1", - "ono": "^4.0.11" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": 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==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsonschema": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", - "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/jsonschema-draft4": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jsonschema-draft4/-/jsonschema-draft4-1.0.0.tgz", - "integrity": "sha512-sBV3UnQPRiyCTD6uzY/Oao2Yohv6KKgQq7zjPwjFHeR6scg/QSXnzDxdugsGaLQDmFUrUlTbMYdEE+72PizhGA==", - "dev": true - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dev": true, - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/karma": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", - "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", - "dev": true, - "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/karma-chrome-launcher": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", - "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", - "dev": true, - "dependencies": { - "which": "^1.2.1" - } - }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", - "minimatch": "^3.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/mattlewis92" - } - }, - "node_modules/karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", - "dev": true, - "dependencies": { - "jasmine-core": "^4.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "karma": "^6.0.0" - } - }, - "node_modules/karma-jasmine-html-reporter": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", - "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", - "dev": true, - "peerDependencies": { - "jasmine-core": ">=3.8", - "karma": ">=0.9", - "karma-jasmine": ">=1.1" - } - }, - "node_modules/karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "dependencies": { - "source-map-support": "^0.5.5" - } - }, - "node_modules/karma-spec-reporter": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz", - "integrity": "sha512-ZXsYERZJMTNRR2F3QN11OWF5kgnT/K2dzhM+oY3CDyMrDI3TjIWqYGG7c15rR9wjmy9lvdC+CCshqn3YZqnNrA==", - "dev": true, - "dependencies": { - "colors": "^1.1.2" - }, - "peerDependencies": { - "karma": ">=0.9" - } - }, - "node_modules/karma/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/karma/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==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/karma/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/karma/node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/less": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz", - "integrity": "sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw==", - "dev": true, - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^1.10.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^2.5.2", - "source-map": "~0.6.0" - } - }, - "node_modules/less-loader": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.0.1.tgz", - "integrity": "sha512-Crln//HpW9M5CbtdfWm3IO66Cvx1WhZQvNybXgfB2dD/6Sav9ppw+IWqs/FQKPBFO4B6X0X28Z0WNznshgwUzA==", - "dev": true, - "dependencies": { - "klona": "^2.0.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "less": "^3.5.0 || ^4.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/less/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/less/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, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/license-webpack-plugin": { - "version": "2.3.20", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz", - "integrity": "sha512-AHVueg9clOKACSHkhmEI+PCC9x8+qsQVuKECZD3ETxETK5h/PCv5/MUzyG1gm8OMcip/s1tcNxqo9Qb7WhjGsg==", - "dev": true, - "dependencies": { - "@types/webpack-sources": "^0.1.5", - "webpack-sources": "^1.2.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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/lit": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.5.0.tgz", - "integrity": "sha512-DtnUP6vR3l4Q8nRPPNBD+UxbAhwJPeky+OVbi3pdgMqm0g57xFSl1Sj64D1rIB+nVNdiVVg8YxB0hqKjvdadZA==", - "dependencies": { - "@lit/reactive-element": "^1.5.0", - "lit-element": "^3.2.0", - "lit-html": "^2.5.0" - } - }, - "node_modules/lit-element": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.2.2.tgz", - "integrity": "sha512-6ZgxBR9KNroqKb6+htkyBwD90XGRiqKDHVrW/Eh0EZ+l+iC+u+v+w3/BA5NGi4nizAVHGYvQBHUDuSmLjPp7NQ==", - "dependencies": { - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.2.0" - } - }, - "node_modules/lit-html": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.5.0.tgz", - "integrity": "sha512-bLHosg1XL3JRUcKdSVI0sLCs0y1wWrj2sqqAN3cZ7bDDPNgmDHH29RV48x6Wz3ZmkxIupaE+z7uXSZ/pXWAO1g==", - "dependencies": { - "@types/trusted-types": "^2.0.2" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "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/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, - "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.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log4js": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.7.1.tgz", - "integrity": "sha512-lzbd0Eq1HRdWM2abSD7mk6YIVY0AogGJzb/z+lqzRk+8+XJP+M6L1MS5FUSc3jjGru4dbKjEMJmqlsoYYpuivQ==", - "dev": true, - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.3" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/log4js/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/loglevel": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", - "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.4" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", - "dev": true, - "dependencies": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/mem?sponsor=1" - } - }, - "node_modules/mem/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/memfs": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", - "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/memory-fs/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true - }, - "node_modules/merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/merge-source-map/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/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "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==", - "dev": true, - "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/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz", - "integrity": "sha512-ZmqShkn79D36uerdED+9qdo1ZYG8C1YsWvXu0UMJxurZnSdgz7gQKO2EGv8T55MhDqG3DYmGtizZNpM/UbTlcA==", - "dev": true, - "dependencies": { - "schema-utils": "^3.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": 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/mini-css-extract-plugin/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==", - "dev": true - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "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==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/modern-normalize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", - "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==", - "optional": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "dependencies": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", - "dev": true - }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true, - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "dev": true, - "optional": true - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/ngx-log-monitor": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ngx-log-monitor/-/ngx-log-monitor-1.2.0.tgz", - "integrity": "sha512-1wAxMG2U9NO4WwH5gBhlRSkw6WPYBaYhfX9kfBam00ypHDTBENaEwwZFR1IhZxBJ6Y6yIHr2QMIfe+2MEkow5A==", - "dependencies": { - "tslib": "^1.9.0" - }, - "peerDependencies": { - "@angular/common": "^6.0.0", - "@angular/core": "^6.0.0" - } - }, - "node_modules/nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "!win32" - ], - "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, - "node_modules/node-forge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", - "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "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/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/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", - "dev": true, - "dependencies": { - "semver": "^7.1.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==", - "dev": true - }, - "node_modules/npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-packlist": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", - "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", - "dev": true, - "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^4.0.1", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-pick-manifest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", - "dev": true, - "dependencies": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "node_modules/npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "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/ono": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", - "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", - "dev": true, - "dependencies": { - "format-util": "^1.0.3" - } - }, - "node_modules/open": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", - "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/openapi-schema-validation": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/openapi-schema-validation/-/openapi-schema-validation-0.4.2.tgz", - "integrity": "sha512-K8LqLpkUf2S04p2Nphq9L+3bGFh/kJypxIG2NVGKX0ffzT4NQI9HirhiY6Iurfej9lCu7y4Ndm4tv+lm86Ck7w==", - "dev": true, - "dependencies": { - "jsonschema": "1.2.4", - "jsonschema-draft4": "^1.0.0", - "swagger-schema-official": "2.0.0-bab6bed" - } - }, - "node_modules/opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/opn/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", - "dev": true, - "dependencies": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/ora/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "dependencies": { - "retry": "^0.12.0" - }, - "engines": { - "node": ">=6" - } - }, - "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/pacote": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.2.tgz", - "integrity": "sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg==", - "dev": true, - "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^2.0.0", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^3.0.0", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/piscina": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.1.0.tgz", - "integrity": "sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg==", - "dev": true, - "dependencies": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" - }, - "optionalDependencies": { - "nice-napi": "^1.0.2" - } - }, - "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/portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "dev": true, - "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/portfinder/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==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", - "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", - "dev": true, - "dependencies": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - } - }, - "node_modules/postcss-attribute-case-insensitive/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-attribute-case-insensitive/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/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-functional-notation/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-color-functional-notation/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/postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dev": true, - "dependencies": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-gray/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-color-gray/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/postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dev": true, - "dependencies": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-hex-alpha/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-color-hex-alpha/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/postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dev": true, - "dependencies": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-mod-function/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-color-mod-function/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/postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-color-rebeccapurple/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-color-rebeccapurple/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/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.14" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-custom-media/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-custom-media/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/postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-custom-properties/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-custom-properties/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/postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-custom-selectors/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-custom-selectors/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-custom-selectors/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/postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-dir-pseudo-class/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/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-double-position-gradients/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-double-position-gradients/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/postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-env-function/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-env-function/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/postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-focus-visible/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-focus-visible/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/postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-focus-within/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-focus-within/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/postcss-font-variant": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-font-variant/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-font-variant/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/postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-gap-properties/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-gap-properties/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/postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-image-set-function/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-image-set-function/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/postcss-import": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", - "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", - "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-initial/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-initial/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/postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "dev": true, - "dependencies": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-lab-function/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-lab-function/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/postcss-loader": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.1.tgz", - "integrity": "sha512-lBmJMvRh1D40dqpWKr9Rpygwxn8M74U9uaCSeYGNKLGInbk9mXBt1ultHf2dH9Ghk6Ue4UXlXWwGMH9QdUJ5ug==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-logical/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-logical/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/postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-media-minmax/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-media-minmax/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/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-nesting/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-nesting/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/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-overflow-shorthand/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-overflow-shorthand/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/postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-page-break/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-page-break/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/postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-place/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-place/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/postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "dependencies": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-preset-env/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-preset-env/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/postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "dependencies": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-pseudo-class-any-link/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/postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dev": true, - "dependencies": { - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-replace-overflow-wrap/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-replace-overflow-wrap/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/postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-selector-matches/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-selector-matches/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/postcss-selector-not": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } - }, - "node_modules/postcss-selector-not/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-selector-not/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/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "dependencies": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=6.14.4" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/protractor": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", - "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", - "deprecated": "We have news to share - Protractor is deprecated and will reach end-of-life by Summer 2023. To learn more and find out about other options please refer to this post on the Angular blog. Thank you for using and contributing to Protractor. https://goo.gle/state-of-e2e-in-angular", - "dev": true, - "dependencies": { - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "q": "1.4.1", - "saucelabs": "^1.5.0", - "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.1.7", - "yargs": "^15.3.1" - }, - "bin": { - "protractor": "bin/protractor", - "webdriver-manager": "bin/webdriver-manager" - }, - "engines": { - "node": ">=10.13.x" - } - }, - "node_modules/protractor-fail-fast": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/protractor-fail-fast/-/protractor-fail-fast-3.1.0.tgz", - "integrity": "sha512-OjuIFmY7hm5R/Msmioyg3aBevySpmpIgtm2TGUvMEqTzviPk/Fqd1HYmMjIQ+NzFMzrK+93LJa4civDvw1+hEg==", - "dev": true, - "dependencies": { - "jasmine-fail-fast": "~2.0.0" - }, - "peerDependencies": { - "protractor": ">= 4.0.4" - } - }, - "node_modules/protractor-jasmine2-screenshot-reporter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/protractor-jasmine2-screenshot-reporter/-/protractor-jasmine2-screenshot-reporter-0.5.0.tgz", - "integrity": "sha512-8Vno7kwR0lq0gdki9J5oKvP8o0XNXGeeNpjBBtZifg+7fpsDffrZqpPer9DhVOcIoe/axOJWnwtMwUWCQl/d1g==", - "dev": true, - "dependencies": { - "hat": "0.0.3", - "lodash": "^4.17.4", - "mkdirp": "^0.5.0", - "rimraf": "^2.4.3", - "string.prototype.startswith": "^0.2.0", - "uuid": "^2.0.0" - } - }, - "node_modules/protractor-jasmine2-screenshot-reporter/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==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/protractor-jasmine2-screenshot-reporter/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/protractor-jasmine2-screenshot-reporter/node_modules/uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true - }, - "node_modules/protractor/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/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/protractor/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/protractor/node_modules/cliui/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/cliui/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/protractor/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/protractor/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/protractor/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/protractor/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/wrap-ansi/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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/protractor/node_modules/wrap-ansi/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==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/protractor/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/puppeteer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", - "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", - "deprecated": "< 18.1.0 is no longer supported", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@types/mime-types": "^2.1.0", - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^4.0.0", - "mime": "^2.0.3", - "mime-types": "^2.1.25", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "engines": { - "node": ">=8.16.0" - } - }, - "node_modules/puppeteer/node_modules/agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/puppeteer/node_modules/https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "dependencies": { - "agent-base": "5", - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/puppeteer/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, - "engines": { - "node": ">=0.9" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "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==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ramda": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", - "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "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==", - "dev": true, - "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/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/redent/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/remove-html-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-html-comments/-/remove-html-comments-1.0.2.tgz", - "integrity": "sha512-HWl0TAyor5rRg6CTRfW37bl7ykY8Ro49K9U1WCZvHsPfg8IHSc1AJYv70XjlvjK7C8Pqbb1GaH2TebBJrekEwA==", - "dev": true, - "dependencies": { - "chalk": "^1.0.0", - "concat-stream": "^1.4.8", - "html-comment-regex": "^1.0.0", - "meow": "^3.1.0" - }, - "bin": { - "remove-html-comments": "cli.js" - } - }, - "node_modules/remove-html-comments/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-html-comments/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-html-comments/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-html-comments/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-html-comments/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "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==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", - "dev": true, - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^7.0.35", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=8.9" - }, - "peerDependencies": { - "rework": "1.0.1", - "rework-visit": "1.0.0" - }, - "peerDependenciesMeta": { - "rework": { - "optional": true - }, - "rework-visit": { - "optional": true - } - } - }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/resolve-url-loader/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/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "dependencies": { - "ret": "~0.1.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==", - "dev": true - }, - "node_modules/sass": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.36.0.tgz", - "integrity": "sha512-fQzEjipfOv5kh930nu3Imzq3ie/sGDc/4KtQMJlt7RRdrkQSfe37Bwi/Rf/gfuYHsIuE1fIlDMvpyMcEwjnPvg==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/sass-loader": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz", - "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==", - "dev": true, - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", - "sass": "^1.3.0", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", - "dev": true, - "dependencies": { - "https-proxy-agent": "^2.2.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/saucelabs/node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/saucelabs/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/saucelabs/node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": 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/schema-utils/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==", - "dev": true - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "dependencies": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/selenium-webdriver/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/selenium-webdriver/node_modules/tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/selfsigned": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", - "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", - "dev": true, - "dependencies": { - "node-forge": "^0.10.0" - } - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha512-e8BOaTo007E3dMuQQTnPdalbKTABKNS7UxoBIDnwOqRa+QwMrCPjynB8zAlPF6xlqUfdLPPLIJ13hJNmhtq8Ng==", - "dev": true, - "dependencies": { - "semver": "^5.3.0" - } - }, - "node_modules/semver-dsl/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "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==", - "dev": true, - "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-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/showdown": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", - "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", - "dev": true, - "dependencies": { - "yargs": "^14.2" - }, - "bin": { - "showdown": "bin/showdown.js" - } - }, - "node_modules/showdown/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/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/showdown/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/showdown/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/showdown/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/showdown/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/showdown/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/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/showdown/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/showdown/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/showdown/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/showdown/node_modules/yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "node_modules/showdown/node_modules/yargs-parser": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", - "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "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/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/socket.io": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", - "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.2.1", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true - }, - "node_modules/socket.io-parser": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz", - "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==", - "dev": true, - "dependencies": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sockjs-client": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", - "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "eventsource": "^2.0.2", - "faye-websocket": "^0.11.4", - "inherits": "^2.0.4", - "url-parse": "^1.5.10" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://tidelift.com/funding/github/npm/sockjs-client" - } - }, - "node_modules/sockjs-client/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/sort-paths": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sort-paths/-/sort-paths-1.1.1.tgz", - "integrity": "sha512-khy0t3pqjZPcQK5hId33EnxlzkFhB5JsxBWKj2IixGwP9SdoRl36eKJC25GgbF1vrXAzLnJsh/0+QScksUZTDg==", - "dependencies": { - "split-retain": "^1.0.1" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", - "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.2", - "source-map-js": "^0.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "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==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/split-retain": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split-retain/-/split-retain-1.0.1.tgz", - "integrity": "sha512-TAsNK+sKP2+A6FLGiSWXPj0gYUF6Ls+YKG6pm+vy/0vzmSxAPrQNpZaS8/TqeObs4YxHHgLQGxeW0azfrK9Ebg==" - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/streamroller": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.3.tgz", - "integrity": "sha512-CphIJyFx2SALGHeINanjFRKQ4l7x2c+rXYJ4BMq0gd+ZK0gi4VT8b+eHe2wi58x4UayBAKx4xtHpXT/ea1cz8w==", - "dev": true, - "dependencies": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/streamroller/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/streamroller/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/streamroller/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/streamroller/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.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==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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.startswith": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/string.prototype.startswith/-/string.prototype.startswith-0.2.0.tgz", - "integrity": "sha512-4Rj/0GFJbva6TUkI5gC/MOwJrcY19CvgIAqLlTpKhGJVoHiWtXh5UWSX9uGE3Es4eUhFSoWJ0RVCt9j3QcK7IQ==", - "dev": true - }, - "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-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-loader": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.2.1.tgz", - "integrity": "sha512-1k9ZosJCRFaRbY6hH49JFlRB0fVSbmnyq1iTPjNxUmGVjBNEmwrrHPenhlp+Lgo51BojHSf6pl2FcqYaN3PfVg==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/stylus": { - "version": "0.54.8", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", - "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", - "dev": true, - "dependencies": { - "css-parse": "~2.0.0", - "debug": "~3.1.0", - "glob": "^7.1.6", - "mkdirp": "~1.0.4", - "safer-buffer": "^2.1.2", - "sax": "~1.2.4", - "semver": "^6.3.0", - "source-map": "^0.7.3" - }, - "bin": { - "stylus": "bin/stylus" - }, - "engines": { - "node": "*" - } - }, - "node_modules/stylus-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.1.0.tgz", - "integrity": "sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.5", - "klona": "^2.0.4", - "normalize-path": "^3.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "stylus": ">=0.52.4", - "webpack": "^5.0.0" - } - }, - "node_modules/stylus/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/stylus/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/stylus/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/svgo/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/swagger-methods": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/swagger-methods/-/swagger-methods-1.0.8.tgz", - "integrity": "sha512-G6baCwuHA+C5jf4FNOrosE4XlmGsdjbOjdBK4yuiDDj/ro9uR4Srj3OR84oQMT8F3qKp00tYNv0YN730oTHPZA==", - "deprecated": "This package is no longer being maintained.", - "dev": true - }, - "node_modules/swagger-parser": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-6.0.5.tgz", - "integrity": "sha512-UL47eu4+GRm5y+N7J+W6QQiqAJn2lojyqgMwS0EZgA55dXd5xmpQCsjUmH/Rf0eKDiG1kULc9VS515PxAyTDVw==", - "dev": true, - "dependencies": { - "call-me-maybe": "^1.0.1", - "json-schema-ref-parser": "^6.0.3", - "ono": "^4.0.11", - "openapi-schema-validation": "^0.4.2", - "swagger-methods": "^1.0.8", - "swagger-schema-official": "2.0.0-bab6bed", - "z-schema": "^3.24.2" - } - }, - "node_modules/swagger-schema-official": { - "version": "2.0.0-bab6bed", - "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", - "integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==", - "dev": true - }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", - "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==", - "dev": true, - "dependencies": { - "jest-worker": "^27.0.2", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": 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/terser-webpack-plugin/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==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/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/terser/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/terser/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==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "node_modules/titlecase": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/titlecase/-/titlecase-1.1.3.tgz", - "integrity": "sha512-pQX4oiemzjBEELPqgK4WE+q0yhAqjp/yzusGtlSJsOuiDys0RQxggepYmo0BuegIDppYS3b3cpdegRwkpyN3hw==", - "bin": { - "to-title-case": "bin.js" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "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/ts-node/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==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.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/tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/tslint/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslint/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==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "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/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", - "dev": true - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-browserslist-db/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/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.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==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "dependencies": { - "builtins": "^1.0.3" - } - }, - "node_modules/validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webdriver-js-extender": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", - "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", - "dev": true, - "dependencies": { - "@types/selenium-webdriver": "^3.0.0", - "selenium-webdriver": "^3.0.1" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "node_modules/webdriver-manager": { - "version": "12.1.8", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", - "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", - "dev": true, - "dependencies": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" - }, - "bin": { - "webdriver-manager": "bin/webdriver-manager" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "node_modules/webdriver-manager/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/webdriver-manager/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/webdriver-manager/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", - "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", - "dev": true, - "dependencies": { - "colorette": "^1.2.2", - "mem": "^8.1.1", - "memfs": "^3.2.2", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": 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/webpack-dev-middleware/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==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", - "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", - "dev": true, - "dependencies": { - "ansi-html-community": "0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 6.11.5" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": 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/webpack-dev-server/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/del/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/webpack-dev-server/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/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==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/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==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/webpack-dev-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/webpack-dev-server/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/webpack-dev-server/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/webpack-dev-server/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", - "dev": true, - "dependencies": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/webpack-dev-server/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-log/node_modules/ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-log/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack-sources/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/webpack-subresource-integrity": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz", - "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==", - "dev": true, - "dependencies": { - "webpack-sources": "^1.3.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "html-webpack-plugin": ">= 2.21.0 < 5", - "webpack": ">= 1.12.11 < 6" - }, - "peerDependenciesMeta": { - "html-webpack-plugin": { - "optional": true - } - } - }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": 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/webpack/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==", - "dev": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xregexp": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.4.1.tgz", - "integrity": "sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==", - "dependencies": { - "@babel/runtime-corejs3": "^7.12.1" - } - }, - "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==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "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": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/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/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/z-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.25.1.tgz", - "integrity": "sha512-7tDlwhrBG+oYFdXNOjILSurpfQyuVgkRe3hB2q8TEssamDHB7BbLWYkYO98nTn0FibfdFroFKDjndbgufAgS/Q==", - "dev": true, - "dependencies": { - "core-js": "^2.5.7", - "lodash.get": "^4.0.0", - "lodash.isequal": "^4.0.0", - "validator": "^10.0.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "optionalDependencies": { - "commander": "^2.7.1" - } - }, - "node_modules/z-schema/node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, - "node_modules/zone.js": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", - "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", - "dependencies": { - "tslib": "^2.3.0" - } - }, - "node_modules/zone.js/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.1.tgz", - "integrity": "sha512-Ta9bMA3EtUHDaZJXqUoT5cn/EecwOp+SXpKJqxDbDuMbLvEMu6YTyDDuvTWeStODfdmXyfMo7LymQyPkN3BicA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "1.0.0", - "sourcemap-codec": "1.4.8" - } - }, - "@angular-devkit/architect": { - "version": "0.1202.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.18.tgz", - "integrity": "sha512-C4ASKe+xBjl91MJyHDLt3z7ICPF9FU6B0CeJ1phwrlSHK9lmFG99WGxEj/Tc82+vHyPhajqS5XJ38KyVAPBGzA==", - "dev": true, - "requires": { - "@angular-devkit/core": "12.2.18", - "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } - } - }, - "@angular-devkit/build-angular": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.2.18.tgz", - "integrity": "sha512-Hf3s7etN7zkHc7lhZZx3Bsm6hfLozuvN3z2aI39RDSlHOA83SoYpltnD9UV4B4d3cxU4PLUzpirb96QeS+E53Q==", - "dev": true, - "requires": { - "@ampproject/remapping": "1.0.1", - "@angular-devkit/architect": "0.1202.18", - "@angular-devkit/build-optimizer": "0.1202.18", - "@angular-devkit/build-webpack": "0.1202.18", - "@angular-devkit/core": "12.2.18", - "@babel/core": "7.14.8", - "@babel/generator": "7.14.8", - "@babel/helper-annotate-as-pure": "7.14.5", - "@babel/plugin-proposal-async-generator-functions": "7.14.7", - "@babel/plugin-transform-async-to-generator": "7.14.5", - "@babel/plugin-transform-runtime": "7.14.5", - "@babel/preset-env": "7.14.8", - "@babel/runtime": "7.14.8", - "@babel/template": "7.14.5", - "@discoveryjs/json-ext": "0.5.3", - "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.2.18", - "ansi-colors": "4.1.1", - "babel-loader": "8.2.2", - "browserslist": "^4.9.1", - "cacache": "15.2.0", - "caniuse-lite": "^1.0.30001032", - "circular-dependency-plugin": "5.2.2", - "copy-webpack-plugin": "9.0.1", - "core-js": "3.16.0", - "critters": "0.0.12", - "css-loader": "6.2.0", - "css-minimizer-webpack-plugin": "3.0.2", - "esbuild": "0.13.8", - "esbuild-wasm": "0.13.8", - "find-cache-dir": "3.3.1", - "glob": "7.1.7", - "https-proxy-agent": "5.0.0", - "inquirer": "8.1.2", - "karma-source-map-support": "1.4.0", - "less": "4.1.1", - "less-loader": "10.0.1", - "license-webpack-plugin": "2.3.20", - "loader-utils": "2.0.4", - "mini-css-extract-plugin": "2.4.2", - "minimatch": "3.0.5", - "open": "8.2.1", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.1.0", - "postcss": "8.3.6", - "postcss-import": "14.0.2", - "postcss-loader": "6.1.1", - "postcss-preset-env": "6.7.0", - "regenerator-runtime": "0.13.9", - "resolve-url-loader": "4.0.0", - "rxjs": "6.6.7", - "sass": "1.36.0", - "sass-loader": "12.1.0", - "semver": "7.3.5", - "source-map-loader": "3.0.0", - "source-map-support": "0.5.19", - "style-loader": "3.2.1", - "stylus": "0.54.8", - "stylus-loader": "6.1.0", - "terser": "5.14.2", - "terser-webpack-plugin": "5.1.4", - "text-table": "0.2.0", - "tree-kill": "1.2.2", - "tslib": "2.3.0", - "webpack": "5.76.0", - "webpack-dev-middleware": "5.0.0", - "webpack-dev-server": "3.11.3", - "webpack-merge": "5.8.0", - "webpack-subresource-integrity": "1.5.2" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "dev": true - } - } - }, - "@angular-devkit/build-optimizer": { - "version": "0.1202.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.18.tgz", - "integrity": "sha512-8ANaqa66IuaSRqJT3zTNUoeRDyLanE56tkNWqgYDPyZUsafEsomh9/fGVIkazymP1hReDLw+RoxSVxUsaRSsTA==", - "dev": true, - "requires": { - "source-map": "0.7.3", - "tslib": "2.3.0", - "typescript": "4.3.5" - }, - "dependencies": { - "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "dev": true - } - } - }, - "@angular-devkit/build-webpack": { - "version": "0.1202.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1202.18.tgz", - "integrity": "sha512-656TIHb820Sb3ILHqcqoGJOPTsx2aUdeRrK8f7e6mxR4/kvQZQAevxP9C0TY+LUqQQqekzjKFq3+aYWOfzdR4Q==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1202.18", - "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } - } - }, - "@angular-devkit/core": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.18.tgz", - "integrity": "sha512-GDLHGe9HEY5SRS+NrKr14C8aHsRCiBFkBFSSbeohgLgcgSXzZHFoU84nDWrl3KZNP8oqcUSv5lHu6dLcf2fnww==", - "dev": true, - "requires": { - "ajv": "8.6.2", - "ajv-formats": "2.1.0", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } - } - }, - "@angular-devkit/schematics": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-12.2.18.tgz", - "integrity": "sha512-bZ9NS5PgoVfetRC6WeQBHCY5FqPZ9y2TKHUo12sOB2YSL3tgWgh1oXyP8PtX34gasqsLjNULxEQsAQYEsiX/qQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "12.2.18", - "ora": "5.4.1", - "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } - } - }, - "@angular/animations": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.2.17.tgz", - "integrity": "sha512-WVUcvKvr6wr9Nf3I2ksu5bFJ5xHhby4UEBTvOAdLpDqic+dzqtzVwAktDRprBSdxKQk1OlTw6jD4MsVEDKnZTg==", - "requires": { - "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@angular/cli": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-12.2.18.tgz", - "integrity": "sha512-AvHi6DsxavxXJgEoFrrlYDtGGgCpofPDmOwHmxpIFNAeG1xdGYtK1zJhGbfu5acn8/5cGoJoBgDY+SEI+WOjxA==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.1202.18", - "@angular-devkit/core": "12.2.18", - "@angular-devkit/schematics": "12.2.18", - "@schematics/angular": "12.2.18", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.1", - "debug": "4.3.2", - "ini": "2.0.0", - "inquirer": "8.1.2", - "jsonc-parser": "3.0.0", - "npm-package-arg": "8.1.5", - "npm-pick-manifest": "6.1.1", - "open": "8.2.1", - "ora": "5.4.1", - "pacote": "12.0.2", - "resolve": "1.20.0", - "semver": "7.3.5", - "symbol-observable": "4.0.0", - "uuid": "8.3.2" - } - }, - "@angular/common": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-12.2.17.tgz", - "integrity": "sha512-/Rc83mzlL6YZScYTzg+Ng2hiCSf3jUVHAfQ8cyLOIMj/y8863Q+DMLVWW+ttvHwCjEFY44pC8IPyBl5FmSJYHg==", - "requires": { - "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@angular/compiler": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.17.tgz", - "integrity": "sha512-dxM1CxzvEJPk6ShJngkW5j5BejBloxQNi+fJi+F8P/GN/Rj7vJUf0JxL+TUt1+Iv575V4NidJDKKikk6K485CA==", - "requires": { - "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@angular/compiler-cli": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.2.17.tgz", - "integrity": "sha512-gJJlnDr8Fhs6z0hH0Y/5GC1YAgHY+sRh2BUrbDu+nIUubyyOVYSyQdL1jwEfCSIZl1GSg+4b4thU7pp7HtmX8g==", - "dev": true, - "requires": { - "@babel/core": "^7.8.6", - "@babel/types": "^7.8.6", - "canonical-path": "1.0.0", - "chokidar": "^3.0.0", - "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.25.0", - "minimist": "1.2.6", - "reflect-metadata": "^0.1.2", - "semver": "^7.0.0", - "source-map": "^0.6.1", - "sourcemap-codec": "^1.4.8", - "tslib": "^2.2.0", - "yargs": "^17.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - } - } - }, - "@angular/core": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-12.2.17.tgz", - "integrity": "sha512-XUvTgU0D8XqNH5Y7UlTMk/XjUQaEGC0kZxhw/QSSQr65WrXtXmcD4d8Cg84TJ52uGXmf7IAruKvtbvu1Mbmvug==", - "requires": { - "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@angular/forms": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-12.2.17.tgz", - "integrity": "sha512-iOIAz5OR6yLWuNTSOSDqAffQ0FU71yw1QsOmltU/hBsO6H6smsIKVe8VlFa4SnBSAyVZXf/OhDRJ8gOqQT09mw==", - "requires": { - "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@angular/language-service": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-12.2.17.tgz", - "integrity": "sha512-mloPdK9iWLR3KQDE85e2k2iuIDsEr9gyFla3QI7UOVbzrsazRADxQxc5WHeDPxNbzTMjCYrcw8Jyc7WHssAPGw==", - "dev": true - }, - "@angular/localize": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-12.2.17.tgz", - "integrity": "sha512-F87zH7TRLpjSlVUA2sAMkDHkF0ikcDVXciMlwlahcjX+ShL1q+iwddT0A4MOPyYTpXqfKAXniIvEK+C0OFdoAA==", - "requires": { - "@babel/core": "7.8.3", - "glob": "7.1.7", - "yargs": "^17.0.0" - }, - "dependencies": { - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "2.2.3", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - } - } - }, - "@angular/platform-browser": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.17.tgz", - "integrity": "sha512-fxs0FDEnS9mzd36u0bHd6TbCvRC9pqK0YCWNnoLCf5ALQtyIL8CpgGNjOMnO8mCEl5l9QTFCDvKOn4V3p7E/dg==", - "requires": { - "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@angular/platform-browser-dynamic": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.17.tgz", - "integrity": "sha512-2v7R5l+4ULSNLviKVTHCqn6iNFgY1M/+HtM1ZcM72V4cVVsXqXUAh7WV4sk4l4ECsExKxQoc6JlVtPUub8cCKA==", - "requires": { - "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@angular/router": { - "version": "12.2.17", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-12.2.17.tgz", - "integrity": "sha512-GKvEMUpLe157izpHLiS4bCZllqOj+MWhfWbhvR0DHFpE9FtkcDjBseTsWqQmyA1gqtRblO1Zn/1E33l9uaGMqw==", - "requires": { - "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@assemblyscript/loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", - "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", - "dev": true - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", - "dev": true - }, - "@babel/core": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", - "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.8", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "2.2.3", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "requires": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "dev": true, - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz", - "integrity": "sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - } - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", - "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "dependencies": { - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - } - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" - }, - "dependencies": { - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "dependencies": { - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - } - } - }, - "@babel/helpers": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", - "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "dependencies": { - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - } - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", - "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==" - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", - "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", - "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", - "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - } - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz", - "integrity": "sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", - "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", - "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz", - "integrity": "sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", - "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.8.tgz", - "integrity": "sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-async-generator-functions": "^7.14.7", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@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-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.14.5", - "@babel/plugin-transform-classes": "^7.14.5", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.14.5", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-modules-systemjs": "^7.14.5", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.14.5", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.8", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.15.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs3": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz", - "integrity": "sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==", - "requires": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - } - } - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", - "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.5", - "@babel/types": "^7.20.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/generator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", - "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", - "requires": { - "@babel/types": "^7.20.5", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - } - } - }, - "@babel/types": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", - "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@cds/city": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@cds/city/-/city-1.1.0.tgz", - "integrity": "sha512-S9K+Q39BGOghyLHmR0Wdcmu1i1noSUk8HcvMj+3IaohZw02WFd99aPTQDHJeseXrXZP3CNovaSlePI0R11NcFg==", - "optional": true - }, - "@cds/core": { - "version": "5.8.4", - "resolved": "https://registry.npmjs.org/@cds/core/-/core-5.8.4.tgz", - "integrity": "sha512-tr9sINJIrc/BGOK1ywzv1pyhhKLV28FcIHXgvHwNSDsMZgBjdn3gSD9nYZX5Z/aeNs3HCc0EsM7SXSVzG8x0VA==", - "requires": { - "@cds/city": "^1.1.0", - "@types/resize-observer-browser": "^0.1.5", - "lit": "^2.1.3", - "modern-normalize": "1.1.0", - "ramda": "^0.28.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@clr/angular": { - "version": "12.4.3", - "resolved": "https://registry.npmjs.org/@clr/angular/-/angular-12.4.3.tgz", - "integrity": "sha512-Ha1hOU16Lml6N8bq4rAnrTfPIu8isEHwOPJBk8ptFQX3UA+mD3vVrFz95nlvt1QhhZrso5xXoNerk1gEm4ECxg==", - "requires": { - "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - }, - "@clr/icons": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/@clr/icons/-/icons-12.0.12.tgz", - "integrity": "sha512-HWiDp9MuF+6/Rsy40dKAOySkITnvnXRcgGjG7M8hMTzkE86bODE7HWC5IkFi93bRAWCxBfmuVis5wel4OitEBg==" - }, - "@clr/ui": { - "version": "12.4.3", - "resolved": "https://registry.npmjs.org/@clr/ui/-/ui-12.4.3.tgz", - "integrity": "sha512-7G9cS/GJsETGMnh6nDNdfmioHQDiXqQdOGb4y8tmWIgf4KgnL4Gv3ps5IQp+/RA9Zh7NOmoCg+pzL6mpAf1yJA==" - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true - }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true - }, - "@ctrl/ngx-codemirror": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ctrl/ngx-codemirror/-/ngx-codemirror-2.2.1.tgz", - "integrity": "sha512-WjGOkNUfrNCvR1jSZiR1wy5WKV1ZGfIljfak6zs2DtWRtXcE1Ks0EoNUPhe8IMeaCQ7UppNuGmYPOKTlaVXjJg==", - "requires": { - "@types/codemirror": "0.0.81", - "tslib": "^1.9.0" - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", - "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", - "dev": true - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz", - "integrity": "sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - } - } - }, - "@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", - "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", - "dev": true, - "requires": { - "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.3", - "loader-utils": "2.0.4", - "merge-source-map": "^1.1.0", - "schema-utils": "^2.7.0" - } - }, - "@lit/reactive-element": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.5.0.tgz", - "integrity": "sha512-fQh9FDK0LPTwDk+0HhSZEtb8K0LTN1wXerwpGrWA+a8tWulYRDLI4vQDWp4GOIsewn0572KYV/oZ3+492D7osA==" - }, - "@ngtools/webpack": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.18.tgz", - "integrity": "sha512-6h/QSG6oZDs2BGfrozdOKqtM5daoCu05q+0gyb3owHz1u9FtMeXXKQ3sQfyFC/GNT3dTMlH6YFxsJPvMPwuy9A==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@npmcli/git": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/node-gyp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", - "dev": true - }, - "@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", - "dev": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, - "@npmcli/run-script": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", - "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", - "dev": true, - "requires": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^8.2.0", - "read-package-json-fast": "^2.0.1" - } - }, - "@rxweb/reactive-form-validators": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@rxweb/reactive-form-validators/-/reactive-form-validators-2.1.7.tgz", - "integrity": "sha512-3AA10s0H0GC4pcQMXMGJvK58qEzFXNChWv4n832ZXP+0y8mVmOXOYQ9pr79dbPtP4/K3ZnnVMwC0WDQFfICuHQ==", - "requires": { - "tslib": "2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - } - } - }, - "@schematics/angular": { - "version": "12.2.18", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-12.2.18.tgz", - "integrity": "sha512-niRS9Ly9y8uI0YmTSbo8KpdqCCiZ/ATMZWeS2id5M8JZvfXbngwiqJvojdSol0SWU+n1W4iA+lJBdt4gSKlD5w==", - "dev": true, - "requires": { - "@angular-devkit/core": "12.2.18", - "@angular-devkit/schematics": "12.2.18", - "jsonc-parser": "3.0.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@types/codemirror": { - "version": "0.0.81", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.81.tgz", - "integrity": "sha512-QoeIb9tn/TZp0IzNyMKlcwHR6pHxNoIW9mKqF7asAsj+AWqpFOEUsxia756L6WKBQNk2psHpu+aFuIFqo3Ac0A==", - "requires": { - "@types/tern": "*" - } - }, - "@types/component-emitter": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", - "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", - "dev": true - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/jasmine": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.1.tgz", - "integrity": "sha512-Vu8l+UGcshYmV1VWwULgnV/2RDbBaO6i2Ptx7nd//oJPIZGhoI1YLST4VKagD2Pq/Bc2/7zvtvhM7F3p4SN7kQ==", - "dev": true - }, - "@types/jasminewd2": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", - "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", - "dev": true, - "requires": { - "@types/jasmine": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" - }, - "@types/mime-types": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.1.tgz", - "integrity": "sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==", - "dev": true - }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==", - "dev": true - }, - "@types/resize-observer-browser": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.7.tgz", - "integrity": "sha512-G9eN0Sn0ii9PWQ3Vl72jDPgeJwRWhv2Qk/nQkJuWmRmOB4HX3/BhD5SE1dZs/hzPZL/WKnvF0RHdTSG54QJFyg==", - "optional": true - }, - "@types/selenium-webdriver": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.20.tgz", - "integrity": "sha512-6d8Q5fqS9DWOXEhMDiF6/2FjyHdmP/jSTAUyeQR7QwrFeNmYyzmvGxD5aLIHL445HjWgibs0eAig+KPnbaesXA==", - "dev": true - }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "dev": true - }, - "@types/tern": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", - "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", - "requires": { - "@types/estree": "*" - } - }, - "@types/trusted-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" - }, - "@types/webpack-sources": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", - "integrity": "sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.6.1" - }, - "dependencies": { - "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 - } - } - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webcomponents/custom-elements": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.3.2.tgz", - "integrity": "sha512-0HtVxwE+PLPCIFL2i8/d+vjlrj8fgafmzZvIblZMyMcww9upicXTdfQT7K0Tg7tDlSoWxjmP2xKYP09A2YMocQ==" - }, - "@webcomponents/webcomponentsjs": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.7.0.tgz", - "integrity": "sha512-j161Z9oiy8k74vchdrQGihfSp7QulrTclCUiPo0D7JF6/RjpXAmB0ThlTAFlSElkgqg0vdFgNAXaX9ZHZy25wQ==" - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true - }, - "adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "requires": { - "loader-utils": "2.0.4", - "regex-parser": "^2.2.11" - } - }, - "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - } - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-formats": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", - "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "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, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "api-client-generator": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/api-client-generator/-/api-client-generator-4.7.1.tgz", - "integrity": "sha512-KCiL8sv1gQKu0GZQG9AV8RSmZk0iSMSjjPIcuWg64j5PDjjRGgoYzzS3WQmceT2JZbqwj+OxfdUvgOtlE6V6sA==", - "dev": true, - "requires": { - "fs-extra": "^9.0.1", - "mustache": "^4.0.1", - "optimist": "^0.6.1", - "swagger-parser": "^6.0.5", - "which": "^2.0.2" - } - }, - "app-root-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", - "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", - "dev": true - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - } - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw==", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.4" - } - }, - "axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7" - } - }, - "babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "2.0.4", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", - "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.4", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", - "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.16.2" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", - "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.4" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "blocking-proxy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", - "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", - "dev": true, - "requires": { - "minimist": "1.2.6" - } - }, - "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==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.5.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "browserstack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", - "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", - "dev": true, - "requires": { - "https-proxy-agent": "^2.2.1" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - } - } - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "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 - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cacache": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", - "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", - "dev": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "dev": true, - "requires": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001436", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz", - "integrity": "sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg==", - "dev": true - }, - "canonical-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "circular-dependency-plugin": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", - "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "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==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "codelyzer": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", - "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", - "dev": true, - "requires": { - "app-root-path": "^2.2.1", - "aria-query": "^3.0.0", - "axobject-query": "2.0.2", - "css-selector-tokenizer": "^0.7.1", - "cssauron": "^1.4.0", - "damerau-levenshtein": "^1.0.4", - "semver-dsl": "^1.0.1", - "source-map": "^0.5.7", - "sprintf-js": "^1.1.2" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "codemirror": { - "version": "5.65.10", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.10.tgz", - "integrity": "sha512-IXAG5wlhbgcTJ6rZZcmi4+sjWIbJqIGfeg3tNa3yX84Jb3T4huS5qzQAo/cUisc1l3bI47WZodpyf7cYcocDKg==" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "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==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "requires": { - "is-what": "^3.14.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true - }, - "copy-webpack-plugin": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", - "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", - "dev": true, - "requires": { - "fast-glob": "^3.2.5", - "glob-parent": "5.1.2", - "globby": "^11.0.3", - "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "core-js": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.0.tgz", - "integrity": "sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g==", - "dev": true - }, - "core-js-compat": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", - "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", - "dev": true, - "requires": { - "browserslist": "^4.21.4" - } - }, - "core-js-pure": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", - "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "critters": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.12.tgz", - "integrity": "sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "css-select": "^4.1.3", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", - "pretty-bytes": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "postcss": { - "version": "8.4.19", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", - "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "dev": true - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "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 - } - } - }, - "css-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.2.0.tgz", - "integrity": "sha512-/rvHfYRjIpymZblf49w8jYcRo2y9gj6rV8UroHGmBxKrIyGLokpycyKzp9OkitvqT29ZSpzJ0Ic7SpnJX3sC8g==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "semver": "^7.3.5" - } - }, - "css-minimizer-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ==", - "dev": true, - "requires": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "p-limit": "^3.0.2", - "postcss": "^8.3.5", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "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 - } - } - }, - "css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", - "dev": true, - "requires": { - "css": "^2.0.0" - } - }, - "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "dependencies": { - "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 - } - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha512-Ht70DcFBh+/ekjVrYS2PlDMdSQEl3OFNmjK6lcn49HptBgilXf/Zwg4uFh9Xn0pX3Q8YOkSjIFOfK2osvdqpBw==", - "dev": true, - "requires": { - "through": "X.X.X" - } - }, - "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.13", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.3", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true - }, - "dateutil": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dateutil/-/dateutil-0.1.0.tgz", - "integrity": "sha512-bI8Lm50mageQER89AvYr+bAxXn4MCAkjSg3M58QY2evrIypUk2aCQcMZ86f31tjmt2ceMrPkrHkhItYqOJsObw==", - "dev": true - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - }, - "dependencies": { - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "dev": true - } - } - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - } - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "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==", - "dev": true - }, - "elasticlunr": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/elasticlunr/-/elasticlunr-0.9.5.tgz", - "integrity": "sha512-5YM9LFQgVYfuLNEoqMqVWIBuF2UNCA+xu/jz1TyryLN/wmBcQSb+GNAwvLKvEpGESwgGN8XA1nbLAt6rKlyHYQ==" - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", - "dev": true, - "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" - }, - "dependencies": { - "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "esbuild": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.8.tgz", - "integrity": "sha512-A4af7G7YZLfG5OnARJRMtlpEsCkq/zHZQXewgPA864l9D6VjjbH1SuFYK/OSV6BtHwDGkdwyRrX0qQFLnMfUcw==", - "dev": true, - "optional": true, - "requires": { - "esbuild-android-arm64": "0.13.8", - "esbuild-darwin-64": "0.13.8", - "esbuild-darwin-arm64": "0.13.8", - "esbuild-freebsd-64": "0.13.8", - "esbuild-freebsd-arm64": "0.13.8", - "esbuild-linux-32": "0.13.8", - "esbuild-linux-64": "0.13.8", - "esbuild-linux-arm": "0.13.8", - "esbuild-linux-arm64": "0.13.8", - "esbuild-linux-mips64le": "0.13.8", - "esbuild-linux-ppc64le": "0.13.8", - "esbuild-netbsd-64": "0.13.8", - "esbuild-openbsd-64": "0.13.8", - "esbuild-sunos-64": "0.13.8", - "esbuild-windows-32": "0.13.8", - "esbuild-windows-64": "0.13.8", - "esbuild-windows-arm64": "0.13.8" - } - }, - "esbuild-android-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.8.tgz", - "integrity": "sha512-AilbChndywpk7CdKkNSZ9klxl+9MboLctXd9LwLo3b0dawmOF/i/t2U5d8LM6SbT1Xw36F8yngSUPrd8yPs2RA==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.8.tgz", - "integrity": "sha512-b6sdiT84zV5LVaoF+UoMVGJzR/iE2vNUfUDfFQGrm4LBwM/PWXweKpuu6RD9mcyCq18cLxkP6w/LD/w9DtX3ng==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.8.tgz", - "integrity": "sha512-R8YuPiiJayuJJRUBG4H0VwkEKo6AvhJs2m7Tl0JaIer3u1FHHXwGhMxjJDmK+kXwTFPriSysPvcobXC/UrrZCQ==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.8.tgz", - "integrity": "sha512-zBn6urrn8FnKC+YSgDxdof9jhPCeU8kR/qaamlV4gI8R3KUaUK162WYM7UyFVAlj9N0MyD3AtB+hltzu4cysTw==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.8.tgz", - "integrity": "sha512-pWW2slN7lGlkx0MOEBoUGwRX5UgSCLq3dy2c8RIOpiHtA87xAUpDBvZK10MykbT+aMfXc0NI2lu1X+6kI34xng==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.8.tgz", - "integrity": "sha512-T0I0ueeKVO/Is0CAeSEOG9s2jeNNb8jrrMwG9QBIm3UU18MRB60ERgkS2uV3fZ1vP2F8i3Z2e3Zju4lg9dhVmw==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.8.tgz", - "integrity": "sha512-Bm8SYmFtvfDCIu9sjKppFXzRXn2BVpuCinU1ChTuMtdKI/7aPpXIrkqBNOgPTOQO9AylJJc1Zw6EvtKORhn64w==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.8.tgz", - "integrity": "sha512-4/HfcC40LJ4GPyboHA+db0jpFarTB628D1ifU+/5bunIgY+t6mHkJWyxWxAAE8wl/ZIuRYB9RJFdYpu1AXGPdg==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.8.tgz", - "integrity": "sha512-X4pWZ+SL+FJ09chWFgRNO3F+YtvAQRcWh0uxKqZSWKiWodAB20flsW/OWFYLXBKiVCTeoGMvENZS/GeVac7+tQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.8.tgz", - "integrity": "sha512-o7e0D+sqHKT31v+mwFircJFjwSKVd2nbkHEn4l9xQ1hLR+Bv8rnt3HqlblY3+sBdlrOTGSwz0ReROlKUMJyldA==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.8.tgz", - "integrity": "sha512-eZSQ0ERsWkukJp2px/UWJHVNuy0lMoz/HZcRWAbB6reoaBw7S9vMzYNUnflfL3XA6WDs+dZn3ekHE4Y2uWLGig==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.8.tgz", - "integrity": "sha512-gZX4kP7gVvOrvX0ZwgHmbuHczQUwqYppxqtoyC7VNd80t5nBHOFXVhWo2Ad/Lms0E8b+wwgI/WjZFTCpUHOg9Q==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.8.tgz", - "integrity": "sha512-afzza308X4WmcebexbTzAgfEWt9MUkdTvwIa8xOu4CM2qGbl2LanqEl8/LUs8jh6Gqw6WsicEK52GPrS9wvkcw==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.8.tgz", - "integrity": "sha512-mWPZibmBbuMKD+LDN23LGcOZ2EawMYBONMXXHmbuxeT0XxCNwadbCVwUQ/2p5Dp5Kvf6mhrlIffcnWOiCBpiVw==", - "dev": true, - "optional": true - }, - "esbuild-wasm": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.13.8.tgz", - "integrity": "sha512-UbD+3nloiSpJWXTCInZQrqPe8Y+RLfDkY/5kEHiXsw/lmaEvibe69qTzQu16m5R9je/0bF7VYQ5jaEOq0z9lLA==", - "dev": true - }, - "esbuild-windows-32": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.8.tgz", - "integrity": "sha512-QsZ1HnWIcnIEApETZWw8HlOhDSWqdZX2SylU7IzGxOYyVcX7QI06ety/aDcn437mwyO7Ph4RrbhB+2ntM8kX8A==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.8.tgz", - "integrity": "sha512-76Fb57B9eE/JmJi1QmUW0tRLQZfGo0it+JeYoCDTSlbTn7LV44ecOHIMJSSgZADUtRMWT9z0Kz186bnaB3amSg==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.8.tgz", - "integrity": "sha512-HW6Mtq5eTudllxY2YgT62MrVcn7oq2o8TAoAvDUhyiEmRmDY8tPwAhb1vxw5/cdkbukM3KdMYtksnUhF/ekWeg==", - "dev": true, - "optional": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "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==", - "dev": true - }, - "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==" - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "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 - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter-asyncresource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", - "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.5.3", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "1.2.6" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true - }, - "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==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - } - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "format-util": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", - "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "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==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "3.0.5", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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==", - "dev": true - } - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - } - } - }, - "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==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hat": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", - "integrity": "sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug==", - "dev": true - }, - "hdr-histogram-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", - "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", - "dev": true, - "requires": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" - } - }, - "hdr-histogram-percentiles-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", - "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "html-frontmatter": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/html-frontmatter/-/html-frontmatter-1.6.1.tgz", - "integrity": "sha512-IPif2EfNWESEARtaFj+zqKdxbRGTrT9/bw3vIz9T1zPpyelIs6gn07z7lOSuSVUSO0U9annpdTQRRYrS+/y/zg==", - "dev": true, - "requires": { - "dateutil": "^0.1.0" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", - "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", - "dev": true - }, - "ignore-walk": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", - "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", - "dev": true, - "requires": { - "minimatch": "3.0.5" - } - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, - "inquirer": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz", - "integrity": "sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.3.0", - "run-async": "^2.4.0", - "rxjs": "^7.2.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "rxjs": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz", - "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true - }, - "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==", - "dev": true - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-ip": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", - "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", - "dev": true, - "requires": { - "ip-regex": "^4.0.0" - } - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==", - "dev": true, - "requires": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "dependencies": { - "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==", - "dev": true - } - } - }, - "jasmine-core": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", - "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", - "dev": true - }, - "jasmine-fail-fast": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jasmine-fail-fast/-/jasmine-fail-fast-2.0.1.tgz", - "integrity": "sha512-En8ONwvDQOV+jyiZEZvbvUSLWSdJFj9HiWjhLdGq/V/gxs4XyST730ooe928BbRxv4bfy05OpykKuoOU4aLC5w==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "jasmine-spec-reporter": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", - "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", - "dev": true, - "requires": { - "colors": "1.1.2" - } - }, - "jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "json-schema-ref-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", - "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.12.1", - "ono": "^4.0.11" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true - }, - "jsonschema": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", - "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==", - "dev": true - }, - "jsonschema-draft4": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jsonschema-draft4/-/jsonschema-draft4-1.0.0.tgz", - "integrity": "sha512-sBV3UnQPRiyCTD6uzY/Oao2Yohv6KKgQq7zjPwjFHeR6scg/QSXnzDxdugsGaLQDmFUrUlTbMYdEE+72PizhGA==", - "dev": true - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "karma": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", - "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "3.0.5", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "0.7.33", - "yargs": "^16.1.1" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "1.2.6" - } - }, - "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 - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "karma-chrome-launcher": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", - "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", - "dev": true, - "requires": { - "which": "^1.2.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", - "minimatch": "3.0.5" - } - }, - "karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", - "dev": true, - "requires": { - "jasmine-core": "^4.1.0" - } - }, - "karma-jasmine-html-reporter": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", - "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", - "dev": true - }, - "karma-source-map-support": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", - "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", - "dev": true, - "requires": { - "source-map-support": "^0.5.5" - } - }, - "karma-spec-reporter": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.32.tgz", - "integrity": "sha512-ZXsYERZJMTNRR2F3QN11OWF5kgnT/K2dzhM+oY3CDyMrDI3TjIWqYGG7c15rR9wjmy9lvdC+CCshqn3YZqnNrA==", - "dev": true, - "requires": { - "colors": "^1.1.2" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true - }, - "less": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.1.tgz", - "integrity": "sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw==", - "dev": true, - "requires": { - "copy-anything": "^2.0.1", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^2.5.2", - "parse-node-version": "^1.0.1", - "source-map": "~0.6.0", - "tslib": "^1.10.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "less-loader": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.0.1.tgz", - "integrity": "sha512-Crln//HpW9M5CbtdfWm3IO66Cvx1WhZQvNybXgfB2dD/6Sav9ppw+IWqs/FQKPBFO4B6X0X28Z0WNznshgwUzA==", - "dev": true, - "requires": { - "klona": "^2.0.4" - } - }, - "license-webpack-plugin": { - "version": "2.3.20", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz", - "integrity": "sha512-AHVueg9clOKACSHkhmEI+PCC9x8+qsQVuKECZD3ETxETK5h/PCv5/MUzyG1gm8OMcip/s1tcNxqo9Qb7WhjGsg==", - "dev": true, - "requires": { - "@types/webpack-sources": "^0.1.5", - "webpack-sources": "^1.2.0" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true - }, - "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 - }, - "lit": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.5.0.tgz", - "integrity": "sha512-DtnUP6vR3l4Q8nRPPNBD+UxbAhwJPeky+OVbi3pdgMqm0g57xFSl1Sj64D1rIB+nVNdiVVg8YxB0hqKjvdadZA==", - "requires": { - "@lit/reactive-element": "^1.5.0", - "lit-element": "^3.2.0", - "lit-html": "^2.5.0" - } - }, - "lit-element": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.2.2.tgz", - "integrity": "sha512-6ZgxBR9KNroqKb6+htkyBwD90XGRiqKDHVrW/Eh0EZ+l+iC+u+v+w3/BA5NGi4nizAVHGYvQBHUDuSmLjPp7NQ==", - "requires": { - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.2.0" - } - }, - "lit-html": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.5.0.tgz", - "integrity": "sha512-bLHosg1XL3JRUcKdSVI0sLCs0y1wWrj2sqqAN3cZ7bDDPNgmDHH29RV48x6Wz3ZmkxIupaE+z7uXSZ/pXWAO1g==", - "requires": { - "@types/trusted-types": "^2.0.2" - } - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "2.2.3" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "log4js": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.7.1.tgz", - "integrity": "sha512-lzbd0Eq1HRdWM2abSD7mk6YIVY0AogGJzb/z+lqzRk+8+XJP+M6L1MS5FUSc3jjGru4dbKjEMJmqlsoYYpuivQ==", - "dev": true, - "requires": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "flatted": "^3.2.7", - "rfdc": "^1.3.0", - "streamroller": "^3.1.3" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "loglevel": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", - "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "4.1.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "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==", - "dev": true - }, - "mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" - }, - "dependencies": { - "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true - } - } - }, - "memfs": { - "version": "3.4.12", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", - "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.3" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "3.0.1", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "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 - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz", - "integrity": "sha512-ZmqShkn79D36uerdED+9qdo1ZYG8C1YsWvXu0UMJxurZnSdgz7gQKO2EGv8T55MhDqG3DYmGtizZNpM/UbTlcA==", - "dev": true, - "requires": { - "schema-utils": "^3.1.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "modern-normalize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", - "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==", - "optional": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", - "dev": true - }, - "mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "dev": true, - "optional": true - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "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==", - "dev": true - }, - "netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" - }, - "ngx-log-monitor": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ngx-log-monitor/-/ngx-log-monitor-1.2.0.tgz", - "integrity": "sha512-1wAxMG2U9NO4WwH5gBhlRSkw6WPYBaYhfX9kfBam00ypHDTBENaEwwZFR1IhZxBJ6Y6yIHr2QMIfe+2MEkow5A==", - "requires": { - "tslib": "^1.9.0" - } - }, - "nice-napi": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", - "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", - "dev": true, - "optional": true, - "requires": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2" - } - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true - }, - "node-forge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", - "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", - "dev": true - }, - "node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - } - }, - "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true, - "optional": true - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "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==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "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 - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", - "dev": true, - "requires": { - "semver": "^7.1.1" - } - }, - "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==", - "dev": true - }, - "npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-packlist": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", - "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", - "dev": true, - "requires": { - "glob": "^7.1.6", - "ignore-walk": "^4.0.1", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", - "dev": true, - "requires": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", - "dev": true, - "requires": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "ono": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", - "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", - "dev": true, - "requires": { - "format-util": "^1.0.3" - } - }, - "open": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", - "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "openapi-schema-validation": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/openapi-schema-validation/-/openapi-schema-validation-0.4.2.tgz", - "integrity": "sha512-K8LqLpkUf2S04p2Nphq9L+3bGFh/kJypxIG2NVGKX0ffzT4NQI9HirhiY6Iurfej9lCu7y4Ndm4tv+lm86Ck7w==", - "dev": true, - "requires": { - "jsonschema": "1.2.4", - "jsonschema-draft4": "^1.0.0", - "swagger-schema-official": "2.0.0-bab6bed" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true - } - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", - "dev": true, - "requires": { - "minimist": "1.2.6", - "wordwrap": "~0.0.2" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "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 - }, - "pacote": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.2.tgz", - "integrity": "sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg==", - "dev": true, - "requires": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^2.0.0", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^3.0.0", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", - "dev": true, - "requires": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - } - }, - "parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "piscina": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.1.0.tgz", - "integrity": "sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg==", - "dev": true, - "requires": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0", - "nice-napi": "^1.0.2" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "dev": true, - "requires": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "1.2.6" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true - }, - "postcss": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", - "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", - "dev": true, - "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" - } - }, - "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dev": true, - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dev": true, - "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "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 - } - } - }, - "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "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 - } - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dev": true, - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-font-variant": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-import": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", - "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-initial": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", - "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-loader": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.1.tgz", - "integrity": "sha512-lBmJMvRh1D40dqpWKr9Rpygwxn8M74U9uaCSeYGNKLGInbk9mXBt1ultHf2dH9Ghk6Ue4UXlXWwGMH9QdUJ5ug==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "semver": "^7.3.5" - } - }, - "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - } - }, - "postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "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 - } - } - }, - "postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-selector-not": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "protractor": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", - "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", - "dev": true, - "requires": { - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "q": "1.4.1", - "saucelabs": "^1.5.0", - "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.1.7", - "yargs": "^15.3.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "protractor-fail-fast": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/protractor-fail-fast/-/protractor-fail-fast-3.1.0.tgz", - "integrity": "sha512-OjuIFmY7hm5R/Msmioyg3aBevySpmpIgtm2TGUvMEqTzviPk/Fqd1HYmMjIQ+NzFMzrK+93LJa4civDvw1+hEg==", - "dev": true, - "requires": { - "jasmine-fail-fast": "~2.0.0" - } - }, - "protractor-jasmine2-screenshot-reporter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/protractor-jasmine2-screenshot-reporter/-/protractor-jasmine2-screenshot-reporter-0.5.0.tgz", - "integrity": "sha512-8Vno7kwR0lq0gdki9J5oKvP8o0XNXGeeNpjBBtZifg+7fpsDffrZqpPer9DhVOcIoe/axOJWnwtMwUWCQl/d1g==", - "dev": true, - "requires": { - "hat": "0.0.3", - "lodash": "^4.17.4", - "mkdirp": "^0.5.0", - "rimraf": "^2.4.3", - "string.prototype.startswith": "^0.2.0", - "uuid": "^2.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "1.2.6" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", - "dev": true - } - } - }, - "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==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "puppeteer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", - "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", - "dev": true, - "requires": { - "@types/mime-types": "^2.1.0", - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^4.0.0", - "mime": "^2.0.3", - "mime-types": "^2.1.25", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "dependencies": { - "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true - }, - "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "requires": { - "agent-base": "5", - "debug": "4" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "ramda": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", - "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "requires": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "requires": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - }, - "dependencies": { - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true - } - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "remove-html-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-html-comments/-/remove-html-comments-1.0.2.tgz", - "integrity": "sha512-HWl0TAyor5rRg6CTRfW37bl7ykY8Ro49K9U1WCZvHsPfg8IHSc1AJYv70XjlvjK7C8Pqbb1GaH2TebBJrekEwA==", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "concat-stream": "^1.4.8", - "html-comment-regex": "^1.0.0", - "meow": "10.1.5" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "6.5.3", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "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==" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "dev": true - }, - "resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "2.0.4", - "postcss": "^7.0.35", - "source-map": "0.6.1" - }, - "dependencies": { - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.36.0.tgz", - "integrity": "sha512-fQzEjipfOv5kh930nu3Imzq3ie/sGDc/4KtQMJlt7RRdrkQSfe37Bwi/Rf/gfuYHsIuE1fIlDMvpyMcEwjnPvg==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0" - } - }, - "sass-loader": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz", - "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==", - "dev": true, - "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - } - }, - "saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", - "dev": true, - "requires": { - "https-proxy-agent": "^2.2.1" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - } - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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==", - "dev": true - } - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "requires": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - } - } - }, - "selfsigned": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", - "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", - "dev": true, - "requires": { - "node-forge": "1.3.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha512-e8BOaTo007E3dMuQQTnPdalbKTABKNS7UxoBIDnwOqRa+QwMrCPjynB8zAlPF6xlqUfdLPPLIJ13hJNmhtq8Ng==", - "dev": true, - "requires": { - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "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==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "showdown": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", - "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", - "dev": true, - "requires": { - "yargs": "^14.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "yargs-parser": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", - "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "socket.io": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", - "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.2.1", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "4.0.5" - } - }, - "socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true - }, - "socket.io-parser": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz", - "integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==", - "dev": true, - "requires": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", - "debug": "~4.3.1" - } - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "sockjs-client": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", - "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "eventsource": "^2.0.2", - "faye-websocket": "^0.11.4", - "inherits": "^2.0.4", - "url-parse": "^1.5.10" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "sort-paths": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sort-paths/-/sort-paths-1.1.1.tgz", - "integrity": "sha512-khy0t3pqjZPcQK5hId33EnxlzkFhB5JsxBWKj2IixGwP9SdoRl36eKJC25GgbF1vrXAzLnJsh/0+QScksUZTDg==", - "requires": { - "split-retain": "^1.0.1" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", - "dev": true - }, - "source-map-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", - "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.2", - "source-map-js": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "split-retain": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split-retain/-/split-retain-1.0.1.tgz", - "integrity": "sha512-TAsNK+sKP2+A6FLGiSWXPj0gYUF6Ls+YKG6pm+vy/0vzmSxAPrQNpZaS8/TqeObs4YxHHgLQGxeW0azfrK9Ebg==" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - }, - "streamroller": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.3.tgz", - "integrity": "sha512-CphIJyFx2SALGHeINanjFRKQ4l7x2c+rXYJ4BMq0gd+ZK0gi4VT8b+eHe2wi58x4UayBAKx4xtHpXT/ea1cz8w==", - "dev": true, - "requires": { - "date-format": "^4.0.14", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.startswith": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/string.prototype.startswith/-/string.prototype.startswith-0.2.0.tgz", - "integrity": "sha512-4Rj/0GFJbva6TUkI5gC/MOwJrcY19CvgIAqLlTpKhGJVoHiWtXh5UWSX9uGE3Es4eUhFSoWJ0RVCt9j3QcK7IQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true - }, - "strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "requires": { - "min-indent": "^1.0.1" - } - }, - "style-loader": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.2.1.tgz", - "integrity": "sha512-1k9ZosJCRFaRbY6hH49JFlRB0fVSbmnyq1iTPjNxUmGVjBNEmwrrHPenhlp+Lgo51BojHSf6pl2FcqYaN3PfVg==", - "dev": true - }, - "stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - } - }, - "stylus": { - "version": "0.54.8", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", - "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", - "dev": true, - "requires": { - "css-parse": "~2.0.0", - "debug": "~3.1.0", - "glob": "^7.1.6", - "mkdirp": "~1.0.4", - "safer-buffer": "^2.1.2", - "sax": "~1.2.4", - "semver": "^6.3.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "stylus-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.1.0.tgz", - "integrity": "sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw==", - "dev": true, - "requires": { - "fast-glob": "^3.2.5", - "klona": "^2.0.4", - "normalize-path": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - } - } - }, - "swagger-methods": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/swagger-methods/-/swagger-methods-1.0.8.tgz", - "integrity": "sha512-G6baCwuHA+C5jf4FNOrosE4XlmGsdjbOjdBK4yuiDDj/ro9uR4Srj3OR84oQMT8F3qKp00tYNv0YN730oTHPZA==", - "dev": true - }, - "swagger-parser": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-6.0.5.tgz", - "integrity": "sha512-UL47eu4+GRm5y+N7J+W6QQiqAJn2lojyqgMwS0EZgA55dXd5xmpQCsjUmH/Rf0eKDiG1kULc9VS515PxAyTDVw==", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "json-schema-ref-parser": "^6.0.3", - "ono": "^4.0.11", - "openapi-schema-validation": "^0.4.2", - "swagger-methods": "^1.0.8", - "swagger-schema-official": "2.0.0-bab6bed", - "z-schema": "^3.24.2" - } - }, - "swagger-schema-official": { - "version": "2.0.0-bab6bed", - "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", - "integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==", - "dev": true - }, - "symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", - "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "terser-webpack-plugin": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==", - "dev": true, - "requires": { - "jest-worker": "^27.0.2", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "5.14.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "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 - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "titlecase": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/titlecase/-/titlecase-1.1.3.tgz", - "integrity": "sha512-pQX4oiemzjBEELPqgK4WE+q0yhAqjp/yzusGtlSJsOuiDys0RQxggepYmo0BuegIDppYS3b3cpdegRwkpyN3hw==" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "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==" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "1.2.6", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "1.2.6" - } - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "3.0.5", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "1.2.6" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "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 - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "dependencies": { - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - } - } - }, - "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==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "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==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webdriver-js-extender": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", - "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", - "dev": true, - "requires": { - "@types/selenium-webdriver": "^3.0.0", - "selenium-webdriver": "^3.0.1" - } - }, - "webdriver-manager": { - "version": "12.1.8", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", - "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", - "dev": true, - "requires": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "1.2.6", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - } - } - }, - "webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", - "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", - "dev": true, - "requires": { - "colorette": "^1.2.2", - "mem": "^8.1.1", - "memfs": "^3.2.2", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-dev-server": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", - "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", - "dev": true, - "requires": { - "ansi-html-community": "0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "5.1.2", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "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==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "1.2.6" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "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 - } - } - }, - "webpack-subresource-integrity": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz", - "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==", - "dev": true, - "requires": { - "webpack-sources": "^1.3.0" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xregexp": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.4.1.tgz", - "integrity": "sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==", - "requires": { - "@babel/runtime-corejs3": "^7.12.1" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "requires": { - "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" - }, - "dependencies": { - "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==" - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "z-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.25.1.tgz", - "integrity": "sha512-7tDlwhrBG+oYFdXNOjILSurpfQyuVgkRe3hB2q8TEssamDHB7BbLWYkYO98nTn0FibfdFroFKDjndbgufAgS/Q==", - "dev": true, - "requires": { - "commander": "^2.7.1", - "core-js": "^2.5.7", - "lodash.get": "^4.0.0", - "lodash.isequal": "^4.0.0", - "validator": "^10.0.0" - }, - "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - } - } - }, - "zone.js": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", - "integrity": "sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==", - "requires": { - "tslib": "^2.3.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" - } - } - } - } -} diff --git a/tkg/web/package.json b/tkg/web/package.json deleted file mode 100644 index 6a044bd9ab..0000000000 --- a/tkg/web/package.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "name": "tkg-kickstart-ui", - "private": "true", - "scripts": { - "ng": "ng", - "clean": "rimraf ./dist", - "lint": "ng lint", - "generate-api-client": "rimraf ./src/app/swagger/ && api-client-generator -s ./api/spec.yaml -o ./src/app/swagger/", - "start": "ng lint && npm run build-index && npm run generate-api-client && ng serve", - "build": " ng lint && npm run generate-api-client && ng build", - "build:prod": "rimraf ./dist && npm run clean && npm run generate-api-client && ng build --configuration production", - "build:ci": "npm run clean && npm run generate-api-client && ng lint && npm run test && npm run build:prod", - "test": "ng test --watch=false --browsers=ChromeHeadlessCustom --code-coverage", - "test:all": "ng lint && npm run test", - "test:watch": "ng test", - "e2e": "cd e2e && npm run e2e", - "aws-e2e": "cd e2e && npm run aws-e2e", - "vsphere-e2e": "cd e2e && npm run vsphere-e2e", - "azure-e2e": "cd e2e && npm run azure-e2e", - "build-index": "node src/app/shared/contextual-help/build-script/build.js", - "convert-md-to-html": "node src/app/shared/contextual-help/build-script/convert.js && npm run build-index" - }, - "dependencies": { - "@angular/animations": "^12.2.13", - "@angular/common": "^12.2.13", - "@angular/compiler": "^12.2.13", - "@angular/core": "^12.2.13", - "@angular/forms": "^12.2.13", - "@angular/localize": "^12.2.13", - "@angular/platform-browser": "^12.2.13", - "@angular/platform-browser-dynamic": "^12.2.13", - "@angular/router": "^12.2.13", - "@cds/core": "^5.6.0", - "@clr/angular": "^12.0.7", - "@clr/icons": "^12.0.7", - "@clr/ui": "^12.0.7", - "@ctrl/ngx-codemirror": "2.2.1", - "@rxweb/reactive-form-validators": "^2.1.6", - "@types/lodash": "^4.14.170", - "@webcomponents/custom-elements": "1.3.2", - "@webcomponents/webcomponentsjs": "^2.6.0", - "codemirror": "^5.61.1", - "dotenv": "^8.2.0", - "elasticlunr": "^0.9.5", - "file-saver": "^2.0.5", - "lit-html": "^2.2.5", - "lodash": "^4.17.21", - "netmask": "^2.0.2", - "ngx-log-monitor": "^1.2.0", - "rxjs": "6.6.2", - "sort-paths": "1.1.1", - "titlecase": "^1.1.3", - "tslib": "^1.10.0", - "xregexp": "^4.3.0", - "zone.js": "^0.11.5" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^12.2.16", - "@angular/cli": "^12.2.13", - "@angular/compiler-cli": "^12.2.13", - "@angular/language-service": "^12.2.13", - "@types/jasmine": "^4.0.3", - "@types/jasminewd2": "^2.0.8", - "@types/node": "^12.11.1", - "api-client-generator": "^4.7.1", - "axios": "^0.24.0", - "codelyzer": "^5.1.2", - "html-frontmatter": "^1.6.1", - "is-ip": "^3.1.0", - "jasmine-core": "^4.0.1", - "jasmine-spec-reporter": "^4.2.1", - "karma": "^6.3.14", - "karma-chrome-launcher": "^3.1.1", - "karma-coverage-istanbul-reporter": "^3.0.3", - "karma-jasmine": "^5.0.1", - "karma-jasmine-html-reporter": "^1.6.0", - "karma-spec-reporter": "^0.0.32", - "protractor": "^7.0.0", - "protractor-fail-fast": "^3.1.0", - "protractor-jasmine2-screenshot-reporter": "^0.5.0", - "puppeteer": "^2.1.1", - "remove-html-comments": "^1.0.2", - "rimraf": "^3.0.2", - "showdown": "^1.9.1", - "ts-node": "^7.0.1", - "tslint": "^6.1.3", - "typescript": "4.3.5" - }, - "overrides": { - "glob-parent": "5.1.2", - "http-cache-semantics": "4.1.1", - "json5": "2.2.3", - "loader-utils": "2.0.4", - "meow": "10.1.5", - "minimatch": "3.0.5", - "minimist": "1.2.6", - "node-forge": "1.3.0", - "qs": "6.5.3", - "socket.io-parser": "4.0.5", - "terser": "5.14.2", - "trim-newlines": "3.0.1", - "ua-parser-js": "0.7.33", - "webpack": "5.76.0" - } -} diff --git a/tkg/web/server/client/avi/avi_client.go b/tkg/web/server/client/avi/avi_client.go deleted file mode 100644 index 7e104417c7..0000000000 --- a/tkg/web/server/client/avi/avi_client.go +++ /dev/null @@ -1,168 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new avi API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for avi API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -GetAviClouds retrieves avi load balancer clouds -*/ -func (a *Client) GetAviClouds(params *GetAviCloudsParams) (*GetAviCloudsOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAviCloudsParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAviClouds", - Method: "GET", - PathPattern: "/api/avi/clouds", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAviCloudsReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAviCloudsOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAviClouds: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAviServiceEngineGroups retrieves avi load balancer service engine groups -*/ -func (a *Client) GetAviServiceEngineGroups(params *GetAviServiceEngineGroupsParams) (*GetAviServiceEngineGroupsOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAviServiceEngineGroupsParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAviServiceEngineGroups", - Method: "GET", - PathPattern: "/api/avi/serviceenginegroups", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAviServiceEngineGroupsReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAviServiceEngineGroupsOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAviServiceEngineGroups: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAviVipNetworks retrieves all avi networks -*/ -func (a *Client) GetAviVipNetworks(params *GetAviVipNetworksParams) (*GetAviVipNetworksOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAviVipNetworksParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAviVipNetworks", - Method: "GET", - PathPattern: "/api/avi/vipnetworks", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAviVipNetworksReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAviVipNetworksOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAviVipNetworks: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -VerifyAccount validates avi controller credentials -*/ -func (a *Client) VerifyAccount(params *VerifyAccountParams) (*VerifyAccountCreated, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewVerifyAccountParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "verifyAccount", - Method: "POST", - PathPattern: "/api/avi", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &VerifyAccountReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*VerifyAccountCreated) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for verifyAccount: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/tkg/web/server/client/avi/get_avi_clouds_parameters.go b/tkg/web/server/client/avi/get_avi_clouds_parameters.go deleted file mode 100644 index 0e98f2d2a4..0000000000 --- a/tkg/web/server/client/avi/get_avi_clouds_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAviCloudsParams creates a new GetAviCloudsParams object -// with the default values initialized. -func NewGetAviCloudsParams() *GetAviCloudsParams { - - return &GetAviCloudsParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAviCloudsParamsWithTimeout creates a new GetAviCloudsParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAviCloudsParamsWithTimeout(timeout time.Duration) *GetAviCloudsParams { - - return &GetAviCloudsParams{ - - timeout: timeout, - } -} - -// NewGetAviCloudsParamsWithContext creates a new GetAviCloudsParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAviCloudsParamsWithContext(ctx context.Context) *GetAviCloudsParams { - - return &GetAviCloudsParams{ - - Context: ctx, - } -} - -// NewGetAviCloudsParamsWithHTTPClient creates a new GetAviCloudsParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAviCloudsParamsWithHTTPClient(client *http.Client) *GetAviCloudsParams { - - return &GetAviCloudsParams{ - HTTPClient: client, - } -} - -/* -GetAviCloudsParams contains all the parameters to send to the API endpoint -for the get avi clouds operation typically these are written to a http.Request -*/ -type GetAviCloudsParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get avi clouds params -func (o *GetAviCloudsParams) WithTimeout(timeout time.Duration) *GetAviCloudsParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get avi clouds params -func (o *GetAviCloudsParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get avi clouds params -func (o *GetAviCloudsParams) WithContext(ctx context.Context) *GetAviCloudsParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get avi clouds params -func (o *GetAviCloudsParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get avi clouds params -func (o *GetAviCloudsParams) WithHTTPClient(client *http.Client) *GetAviCloudsParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get avi clouds params -func (o *GetAviCloudsParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAviCloudsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/avi/get_avi_clouds_responses.go b/tkg/web/server/client/avi/get_avi_clouds_responses.go deleted file mode 100644 index b32123f3af..0000000000 --- a/tkg/web/server/client/avi/get_avi_clouds_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAviCloudsReader is a Reader for the GetAviClouds structure. -type GetAviCloudsReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAviCloudsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAviCloudsOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAviCloudsBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAviCloudsUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAviCloudsInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAviCloudsOK creates a GetAviCloudsOK with default headers values -func NewGetAviCloudsOK() *GetAviCloudsOK { - return &GetAviCloudsOK{} -} - -/* -GetAviCloudsOK handles this case with default header values. - -Successful retrieval of Avi load balancer clouds -*/ -type GetAviCloudsOK struct { - Payload []*models.AviCloud -} - -func (o *GetAviCloudsOK) Error() string { - return fmt.Sprintf("[GET /api/avi/clouds][%d] getAviCloudsOK %+v", 200, o.Payload) -} - -func (o *GetAviCloudsOK) GetPayload() []*models.AviCloud { - return o.Payload -} - -func (o *GetAviCloudsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAviCloudsBadRequest creates a GetAviCloudsBadRequest with default headers values -func NewGetAviCloudsBadRequest() *GetAviCloudsBadRequest { - return &GetAviCloudsBadRequest{} -} - -/* -GetAviCloudsBadRequest handles this case with default header values. - -Bad request -*/ -type GetAviCloudsBadRequest struct { - Payload *models.Error -} - -func (o *GetAviCloudsBadRequest) Error() string { - return fmt.Sprintf("[GET /api/avi/clouds][%d] getAviCloudsBadRequest %+v", 400, o.Payload) -} - -func (o *GetAviCloudsBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAviCloudsBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAviCloudsUnauthorized creates a GetAviCloudsUnauthorized with default headers values -func NewGetAviCloudsUnauthorized() *GetAviCloudsUnauthorized { - return &GetAviCloudsUnauthorized{} -} - -/* -GetAviCloudsUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAviCloudsUnauthorized struct { - Payload *models.Error -} - -func (o *GetAviCloudsUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/avi/clouds][%d] getAviCloudsUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAviCloudsUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAviCloudsUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAviCloudsInternalServerError creates a GetAviCloudsInternalServerError with default headers values -func NewGetAviCloudsInternalServerError() *GetAviCloudsInternalServerError { - return &GetAviCloudsInternalServerError{} -} - -/* -GetAviCloudsInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAviCloudsInternalServerError struct { - Payload *models.Error -} - -func (o *GetAviCloudsInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/avi/clouds][%d] getAviCloudsInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAviCloudsInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAviCloudsInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/avi/get_avi_service_engine_groups_parameters.go b/tkg/web/server/client/avi/get_avi_service_engine_groups_parameters.go deleted file mode 100644 index 7adeebcfe1..0000000000 --- a/tkg/web/server/client/avi/get_avi_service_engine_groups_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAviServiceEngineGroupsParams creates a new GetAviServiceEngineGroupsParams object -// with the default values initialized. -func NewGetAviServiceEngineGroupsParams() *GetAviServiceEngineGroupsParams { - - return &GetAviServiceEngineGroupsParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAviServiceEngineGroupsParamsWithTimeout creates a new GetAviServiceEngineGroupsParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAviServiceEngineGroupsParamsWithTimeout(timeout time.Duration) *GetAviServiceEngineGroupsParams { - - return &GetAviServiceEngineGroupsParams{ - - timeout: timeout, - } -} - -// NewGetAviServiceEngineGroupsParamsWithContext creates a new GetAviServiceEngineGroupsParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAviServiceEngineGroupsParamsWithContext(ctx context.Context) *GetAviServiceEngineGroupsParams { - - return &GetAviServiceEngineGroupsParams{ - - Context: ctx, - } -} - -// NewGetAviServiceEngineGroupsParamsWithHTTPClient creates a new GetAviServiceEngineGroupsParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAviServiceEngineGroupsParamsWithHTTPClient(client *http.Client) *GetAviServiceEngineGroupsParams { - - return &GetAviServiceEngineGroupsParams{ - HTTPClient: client, - } -} - -/* -GetAviServiceEngineGroupsParams contains all the parameters to send to the API endpoint -for the get avi service engine groups operation typically these are written to a http.Request -*/ -type GetAviServiceEngineGroupsParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get avi service engine groups params -func (o *GetAviServiceEngineGroupsParams) WithTimeout(timeout time.Duration) *GetAviServiceEngineGroupsParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get avi service engine groups params -func (o *GetAviServiceEngineGroupsParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get avi service engine groups params -func (o *GetAviServiceEngineGroupsParams) WithContext(ctx context.Context) *GetAviServiceEngineGroupsParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get avi service engine groups params -func (o *GetAviServiceEngineGroupsParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get avi service engine groups params -func (o *GetAviServiceEngineGroupsParams) WithHTTPClient(client *http.Client) *GetAviServiceEngineGroupsParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get avi service engine groups params -func (o *GetAviServiceEngineGroupsParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAviServiceEngineGroupsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/avi/get_avi_service_engine_groups_responses.go b/tkg/web/server/client/avi/get_avi_service_engine_groups_responses.go deleted file mode 100644 index ee0601d9b5..0000000000 --- a/tkg/web/server/client/avi/get_avi_service_engine_groups_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAviServiceEngineGroupsReader is a Reader for the GetAviServiceEngineGroups structure. -type GetAviServiceEngineGroupsReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAviServiceEngineGroupsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAviServiceEngineGroupsOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAviServiceEngineGroupsBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAviServiceEngineGroupsUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAviServiceEngineGroupsInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAviServiceEngineGroupsOK creates a GetAviServiceEngineGroupsOK with default headers values -func NewGetAviServiceEngineGroupsOK() *GetAviServiceEngineGroupsOK { - return &GetAviServiceEngineGroupsOK{} -} - -/* -GetAviServiceEngineGroupsOK handles this case with default header values. - -Successful retrieval of Avi load balancer service engine groups -*/ -type GetAviServiceEngineGroupsOK struct { - Payload []*models.AviServiceEngineGroup -} - -func (o *GetAviServiceEngineGroupsOK) Error() string { - return fmt.Sprintf("[GET /api/avi/serviceenginegroups][%d] getAviServiceEngineGroupsOK %+v", 200, o.Payload) -} - -func (o *GetAviServiceEngineGroupsOK) GetPayload() []*models.AviServiceEngineGroup { - return o.Payload -} - -func (o *GetAviServiceEngineGroupsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAviServiceEngineGroupsBadRequest creates a GetAviServiceEngineGroupsBadRequest with default headers values -func NewGetAviServiceEngineGroupsBadRequest() *GetAviServiceEngineGroupsBadRequest { - return &GetAviServiceEngineGroupsBadRequest{} -} - -/* -GetAviServiceEngineGroupsBadRequest handles this case with default header values. - -Bad request -*/ -type GetAviServiceEngineGroupsBadRequest struct { - Payload *models.Error -} - -func (o *GetAviServiceEngineGroupsBadRequest) Error() string { - return fmt.Sprintf("[GET /api/avi/serviceenginegroups][%d] getAviServiceEngineGroupsBadRequest %+v", 400, o.Payload) -} - -func (o *GetAviServiceEngineGroupsBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAviServiceEngineGroupsBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAviServiceEngineGroupsUnauthorized creates a GetAviServiceEngineGroupsUnauthorized with default headers values -func NewGetAviServiceEngineGroupsUnauthorized() *GetAviServiceEngineGroupsUnauthorized { - return &GetAviServiceEngineGroupsUnauthorized{} -} - -/* -GetAviServiceEngineGroupsUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAviServiceEngineGroupsUnauthorized struct { - Payload *models.Error -} - -func (o *GetAviServiceEngineGroupsUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/avi/serviceenginegroups][%d] getAviServiceEngineGroupsUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAviServiceEngineGroupsUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAviServiceEngineGroupsUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAviServiceEngineGroupsInternalServerError creates a GetAviServiceEngineGroupsInternalServerError with default headers values -func NewGetAviServiceEngineGroupsInternalServerError() *GetAviServiceEngineGroupsInternalServerError { - return &GetAviServiceEngineGroupsInternalServerError{} -} - -/* -GetAviServiceEngineGroupsInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAviServiceEngineGroupsInternalServerError struct { - Payload *models.Error -} - -func (o *GetAviServiceEngineGroupsInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/avi/serviceenginegroups][%d] getAviServiceEngineGroupsInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAviServiceEngineGroupsInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAviServiceEngineGroupsInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/avi/get_avi_vip_networks_parameters.go b/tkg/web/server/client/avi/get_avi_vip_networks_parameters.go deleted file mode 100644 index a643efa35c..0000000000 --- a/tkg/web/server/client/avi/get_avi_vip_networks_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAviVipNetworksParams creates a new GetAviVipNetworksParams object -// with the default values initialized. -func NewGetAviVipNetworksParams() *GetAviVipNetworksParams { - - return &GetAviVipNetworksParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAviVipNetworksParamsWithTimeout creates a new GetAviVipNetworksParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAviVipNetworksParamsWithTimeout(timeout time.Duration) *GetAviVipNetworksParams { - - return &GetAviVipNetworksParams{ - - timeout: timeout, - } -} - -// NewGetAviVipNetworksParamsWithContext creates a new GetAviVipNetworksParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAviVipNetworksParamsWithContext(ctx context.Context) *GetAviVipNetworksParams { - - return &GetAviVipNetworksParams{ - - Context: ctx, - } -} - -// NewGetAviVipNetworksParamsWithHTTPClient creates a new GetAviVipNetworksParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAviVipNetworksParamsWithHTTPClient(client *http.Client) *GetAviVipNetworksParams { - - return &GetAviVipNetworksParams{ - HTTPClient: client, - } -} - -/* -GetAviVipNetworksParams contains all the parameters to send to the API endpoint -for the get avi vip networks operation typically these are written to a http.Request -*/ -type GetAviVipNetworksParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get avi vip networks params -func (o *GetAviVipNetworksParams) WithTimeout(timeout time.Duration) *GetAviVipNetworksParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get avi vip networks params -func (o *GetAviVipNetworksParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get avi vip networks params -func (o *GetAviVipNetworksParams) WithContext(ctx context.Context) *GetAviVipNetworksParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get avi vip networks params -func (o *GetAviVipNetworksParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get avi vip networks params -func (o *GetAviVipNetworksParams) WithHTTPClient(client *http.Client) *GetAviVipNetworksParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get avi vip networks params -func (o *GetAviVipNetworksParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAviVipNetworksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/avi/get_avi_vip_networks_responses.go b/tkg/web/server/client/avi/get_avi_vip_networks_responses.go deleted file mode 100644 index f02ebdd587..0000000000 --- a/tkg/web/server/client/avi/get_avi_vip_networks_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAviVipNetworksReader is a Reader for the GetAviVipNetworks structure. -type GetAviVipNetworksReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAviVipNetworksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAviVipNetworksOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAviVipNetworksBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAviVipNetworksUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAviVipNetworksInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAviVipNetworksOK creates a GetAviVipNetworksOK with default headers values -func NewGetAviVipNetworksOK() *GetAviVipNetworksOK { - return &GetAviVipNetworksOK{} -} - -/* -GetAviVipNetworksOK handles this case with default header values. - -Successful retrieval of Avi load balancer service engine groups -*/ -type GetAviVipNetworksOK struct { - Payload []*models.AviVipNetwork -} - -func (o *GetAviVipNetworksOK) Error() string { - return fmt.Sprintf("[GET /api/avi/vipnetworks][%d] getAviVipNetworksOK %+v", 200, o.Payload) -} - -func (o *GetAviVipNetworksOK) GetPayload() []*models.AviVipNetwork { - return o.Payload -} - -func (o *GetAviVipNetworksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAviVipNetworksBadRequest creates a GetAviVipNetworksBadRequest with default headers values -func NewGetAviVipNetworksBadRequest() *GetAviVipNetworksBadRequest { - return &GetAviVipNetworksBadRequest{} -} - -/* -GetAviVipNetworksBadRequest handles this case with default header values. - -Bad request -*/ -type GetAviVipNetworksBadRequest struct { - Payload *models.Error -} - -func (o *GetAviVipNetworksBadRequest) Error() string { - return fmt.Sprintf("[GET /api/avi/vipnetworks][%d] getAviVipNetworksBadRequest %+v", 400, o.Payload) -} - -func (o *GetAviVipNetworksBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAviVipNetworksBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAviVipNetworksUnauthorized creates a GetAviVipNetworksUnauthorized with default headers values -func NewGetAviVipNetworksUnauthorized() *GetAviVipNetworksUnauthorized { - return &GetAviVipNetworksUnauthorized{} -} - -/* -GetAviVipNetworksUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAviVipNetworksUnauthorized struct { - Payload *models.Error -} - -func (o *GetAviVipNetworksUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/avi/vipnetworks][%d] getAviVipNetworksUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAviVipNetworksUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAviVipNetworksUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAviVipNetworksInternalServerError creates a GetAviVipNetworksInternalServerError with default headers values -func NewGetAviVipNetworksInternalServerError() *GetAviVipNetworksInternalServerError { - return &GetAviVipNetworksInternalServerError{} -} - -/* -GetAviVipNetworksInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAviVipNetworksInternalServerError struct { - Payload *models.Error -} - -func (o *GetAviVipNetworksInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/avi/vipnetworks][%d] getAviVipNetworksInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAviVipNetworksInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAviVipNetworksInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/avi/verify_account_parameters.go b/tkg/web/server/client/avi/verify_account_parameters.go deleted file mode 100644 index d26718f17d..0000000000 --- a/tkg/web/server/client/avi/verify_account_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewVerifyAccountParams creates a new VerifyAccountParams object -// with the default values initialized. -func NewVerifyAccountParams() *VerifyAccountParams { - var () - return &VerifyAccountParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewVerifyAccountParamsWithTimeout creates a new VerifyAccountParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewVerifyAccountParamsWithTimeout(timeout time.Duration) *VerifyAccountParams { - var () - return &VerifyAccountParams{ - - timeout: timeout, - } -} - -// NewVerifyAccountParamsWithContext creates a new VerifyAccountParams object -// with the default values initialized, and the ability to set a context for a request -func NewVerifyAccountParamsWithContext(ctx context.Context) *VerifyAccountParams { - var () - return &VerifyAccountParams{ - - Context: ctx, - } -} - -// NewVerifyAccountParamsWithHTTPClient creates a new VerifyAccountParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewVerifyAccountParamsWithHTTPClient(client *http.Client) *VerifyAccountParams { - var () - return &VerifyAccountParams{ - HTTPClient: client, - } -} - -/* -VerifyAccountParams contains all the parameters to send to the API endpoint -for the verify account operation typically these are written to a http.Request -*/ -type VerifyAccountParams struct { - - /*Credentials - Avi controller credentials - - */ - Credentials *models.AviControllerParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the verify account params -func (o *VerifyAccountParams) WithTimeout(timeout time.Duration) *VerifyAccountParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the verify account params -func (o *VerifyAccountParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the verify account params -func (o *VerifyAccountParams) WithContext(ctx context.Context) *VerifyAccountParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the verify account params -func (o *VerifyAccountParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the verify account params -func (o *VerifyAccountParams) WithHTTPClient(client *http.Client) *VerifyAccountParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the verify account params -func (o *VerifyAccountParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithCredentials adds the credentials to the verify account params -func (o *VerifyAccountParams) WithCredentials(credentials *models.AviControllerParams) *VerifyAccountParams { - o.SetCredentials(credentials) - return o -} - -// SetCredentials adds the credentials to the verify account params -func (o *VerifyAccountParams) SetCredentials(credentials *models.AviControllerParams) { - o.Credentials = credentials -} - -// WriteToRequest writes these params to a swagger request -func (o *VerifyAccountParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Credentials != nil { - if err := r.SetBodyParam(o.Credentials); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/avi/verify_account_responses.go b/tkg/web/server/client/avi/verify_account_responses.go deleted file mode 100644 index 25f894e963..0000000000 --- a/tkg/web/server/client/avi/verify_account_responses.go +++ /dev/null @@ -1,179 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyAccountReader is a Reader for the VerifyAccount structure. -type VerifyAccountReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *VerifyAccountReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 201: - result := NewVerifyAccountCreated() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewVerifyAccountBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewVerifyAccountUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewVerifyAccountInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewVerifyAccountCreated creates a VerifyAccountCreated with default headers values -func NewVerifyAccountCreated() *VerifyAccountCreated { - return &VerifyAccountCreated{} -} - -/* -VerifyAccountCreated handles this case with default header values. - -Verified AVI credentials successfully -*/ -type VerifyAccountCreated struct { -} - -func (o *VerifyAccountCreated) Error() string { - return fmt.Sprintf("[POST /api/avi][%d] verifyAccountCreated ", 201) -} - -func (o *VerifyAccountCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - return nil -} - -// NewVerifyAccountBadRequest creates a VerifyAccountBadRequest with default headers values -func NewVerifyAccountBadRequest() *VerifyAccountBadRequest { - return &VerifyAccountBadRequest{} -} - -/* -VerifyAccountBadRequest handles this case with default header values. - -Bad request -*/ -type VerifyAccountBadRequest struct { - Payload *models.Error -} - -func (o *VerifyAccountBadRequest) Error() string { - return fmt.Sprintf("[POST /api/avi][%d] verifyAccountBadRequest %+v", 400, o.Payload) -} - -func (o *VerifyAccountBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyAccountBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyAccountUnauthorized creates a VerifyAccountUnauthorized with default headers values -func NewVerifyAccountUnauthorized() *VerifyAccountUnauthorized { - return &VerifyAccountUnauthorized{} -} - -/* -VerifyAccountUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type VerifyAccountUnauthorized struct { - Payload *models.Error -} - -func (o *VerifyAccountUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/avi][%d] verifyAccountUnauthorized %+v", 401, o.Payload) -} - -func (o *VerifyAccountUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyAccountUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyAccountInternalServerError creates a VerifyAccountInternalServerError with default headers values -func NewVerifyAccountInternalServerError() *VerifyAccountInternalServerError { - return &VerifyAccountInternalServerError{} -} - -/* -VerifyAccountInternalServerError handles this case with default header values. - -Internal server error -*/ -type VerifyAccountInternalServerError struct { - Payload *models.Error -} - -func (o *VerifyAccountInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/avi][%d] verifyAccountInternalServerError %+v", 500, o.Payload) -} - -func (o *VerifyAccountInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyAccountInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/apply_t_k_g_config_for_a_w_s_parameters.go b/tkg/web/server/client/aws/apply_t_k_g_config_for_a_w_s_parameters.go deleted file mode 100644 index 793b94b8d8..0000000000 --- a/tkg/web/server/client/aws/apply_t_k_g_config_for_a_w_s_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewApplyTKGConfigForAWSParams creates a new ApplyTKGConfigForAWSParams object -// with the default values initialized. -func NewApplyTKGConfigForAWSParams() *ApplyTKGConfigForAWSParams { - var () - return &ApplyTKGConfigForAWSParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewApplyTKGConfigForAWSParamsWithTimeout creates a new ApplyTKGConfigForAWSParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewApplyTKGConfigForAWSParamsWithTimeout(timeout time.Duration) *ApplyTKGConfigForAWSParams { - var () - return &ApplyTKGConfigForAWSParams{ - - timeout: timeout, - } -} - -// NewApplyTKGConfigForAWSParamsWithContext creates a new ApplyTKGConfigForAWSParams object -// with the default values initialized, and the ability to set a context for a request -func NewApplyTKGConfigForAWSParamsWithContext(ctx context.Context) *ApplyTKGConfigForAWSParams { - var () - return &ApplyTKGConfigForAWSParams{ - - Context: ctx, - } -} - -// NewApplyTKGConfigForAWSParamsWithHTTPClient creates a new ApplyTKGConfigForAWSParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewApplyTKGConfigForAWSParamsWithHTTPClient(client *http.Client) *ApplyTKGConfigForAWSParams { - var () - return &ApplyTKGConfigForAWSParams{ - HTTPClient: client, - } -} - -/* -ApplyTKGConfigForAWSParams contains all the parameters to send to the API endpoint -for the apply t k g config for a w s operation typically these are written to a http.Request -*/ -type ApplyTKGConfigForAWSParams struct { - - /*Params - parameters to apply changes to TKG configuration file for AWS - - */ - Params *models.AWSRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the apply t k g config for a w s params -func (o *ApplyTKGConfigForAWSParams) WithTimeout(timeout time.Duration) *ApplyTKGConfigForAWSParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the apply t k g config for a w s params -func (o *ApplyTKGConfigForAWSParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the apply t k g config for a w s params -func (o *ApplyTKGConfigForAWSParams) WithContext(ctx context.Context) *ApplyTKGConfigForAWSParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the apply t k g config for a w s params -func (o *ApplyTKGConfigForAWSParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the apply t k g config for a w s params -func (o *ApplyTKGConfigForAWSParams) WithHTTPClient(client *http.Client) *ApplyTKGConfigForAWSParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the apply t k g config for a w s params -func (o *ApplyTKGConfigForAWSParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the apply t k g config for a w s params -func (o *ApplyTKGConfigForAWSParams) WithParams(params *models.AWSRegionalClusterParams) *ApplyTKGConfigForAWSParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the apply t k g config for a w s params -func (o *ApplyTKGConfigForAWSParams) SetParams(params *models.AWSRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ApplyTKGConfigForAWSParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/apply_t_k_g_config_for_a_w_s_responses.go b/tkg/web/server/client/aws/apply_t_k_g_config_for_a_w_s_responses.go deleted file mode 100644 index f2ae035f8c..0000000000 --- a/tkg/web/server/client/aws/apply_t_k_g_config_for_a_w_s_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ApplyTKGConfigForAWSReader is a Reader for the ApplyTKGConfigForAWS structure. -type ApplyTKGConfigForAWSReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ApplyTKGConfigForAWSReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewApplyTKGConfigForAWSOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewApplyTKGConfigForAWSBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewApplyTKGConfigForAWSUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewApplyTKGConfigForAWSInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewApplyTKGConfigForAWSOK creates a ApplyTKGConfigForAWSOK with default headers values -func NewApplyTKGConfigForAWSOK() *ApplyTKGConfigForAWSOK { - return &ApplyTKGConfigForAWSOK{} -} - -/* -ApplyTKGConfigForAWSOK handles this case with default header values. - -Apply change to TKG configuration successfully -*/ -type ApplyTKGConfigForAWSOK struct { - Payload *models.ConfigFileInfo -} - -func (o *ApplyTKGConfigForAWSOK) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/tkgconfig][%d] applyTKGConfigForAWSOK %+v", 200, o.Payload) -} - -func (o *ApplyTKGConfigForAWSOK) GetPayload() *models.ConfigFileInfo { - return o.Payload -} - -func (o *ApplyTKGConfigForAWSOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.ConfigFileInfo) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewApplyTKGConfigForAWSBadRequest creates a ApplyTKGConfigForAWSBadRequest with default headers values -func NewApplyTKGConfigForAWSBadRequest() *ApplyTKGConfigForAWSBadRequest { - return &ApplyTKGConfigForAWSBadRequest{} -} - -/* -ApplyTKGConfigForAWSBadRequest handles this case with default header values. - -Bad request -*/ -type ApplyTKGConfigForAWSBadRequest struct { - Payload *models.Error -} - -func (o *ApplyTKGConfigForAWSBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/tkgconfig][%d] applyTKGConfigForAWSBadRequest %+v", 400, o.Payload) -} - -func (o *ApplyTKGConfigForAWSBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ApplyTKGConfigForAWSBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewApplyTKGConfigForAWSUnauthorized creates a ApplyTKGConfigForAWSUnauthorized with default headers values -func NewApplyTKGConfigForAWSUnauthorized() *ApplyTKGConfigForAWSUnauthorized { - return &ApplyTKGConfigForAWSUnauthorized{} -} - -/* -ApplyTKGConfigForAWSUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type ApplyTKGConfigForAWSUnauthorized struct { - Payload *models.Error -} - -func (o *ApplyTKGConfigForAWSUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/tkgconfig][%d] applyTKGConfigForAWSUnauthorized %+v", 401, o.Payload) -} - -func (o *ApplyTKGConfigForAWSUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *ApplyTKGConfigForAWSUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewApplyTKGConfigForAWSInternalServerError creates a ApplyTKGConfigForAWSInternalServerError with default headers values -func NewApplyTKGConfigForAWSInternalServerError() *ApplyTKGConfigForAWSInternalServerError { - return &ApplyTKGConfigForAWSInternalServerError{} -} - -/* -ApplyTKGConfigForAWSInternalServerError handles this case with default header values. - -Internal server error -*/ -type ApplyTKGConfigForAWSInternalServerError struct { - Payload *models.Error -} - -func (o *ApplyTKGConfigForAWSInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/tkgconfig][%d] applyTKGConfigForAWSInternalServerError %+v", 500, o.Payload) -} - -func (o *ApplyTKGConfigForAWSInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ApplyTKGConfigForAWSInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/aws_client.go b/tkg/web/server/client/aws/aws_client.go deleted file mode 100644 index 4ab4ebbe3c..0000000000 --- a/tkg/web/server/client/aws/aws_client.go +++ /dev/null @@ -1,440 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new aws API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for aws API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -ApplyTKGConfigForAWS applies the changes to t k g configuration file for a w s -*/ -func (a *Client) ApplyTKGConfigForAWS(params *ApplyTKGConfigForAWSParams) (*ApplyTKGConfigForAWSOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewApplyTKGConfigForAWSParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "applyTKGConfigForAWS", - Method: "POST", - PathPattern: "/api/providers/aws/tkgconfig", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ApplyTKGConfigForAWSReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ApplyTKGConfigForAWSOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for applyTKGConfigForAWS: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -CreateAWSRegionalCluster creates a w s regional cluster -*/ -func (a *Client) CreateAWSRegionalCluster(params *CreateAWSRegionalClusterParams) (*CreateAWSRegionalClusterOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewCreateAWSRegionalClusterParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "createAWSRegionalCluster", - Method: "POST", - PathPattern: "/api/providers/aws/create", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &CreateAWSRegionalClusterReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*CreateAWSRegionalClusterOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for createAWSRegionalCluster: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -ExportTKGConfigForAWS generates t k g configuration file for a w s -*/ -func (a *Client) ExportTKGConfigForAWS(params *ExportTKGConfigForAWSParams) (*ExportTKGConfigForAWSOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewExportTKGConfigForAWSParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "exportTKGConfigForAWS", - Method: "POST", - PathPattern: "/api/providers/aws/config/export", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ExportTKGConfigForAWSReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ExportTKGConfigForAWSOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for exportTKGConfigForAWS: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAWSAvailabilityZones retrieves a w s availability zones of current region -*/ -func (a *Client) GetAWSAvailabilityZones(params *GetAWSAvailabilityZonesParams) (*GetAWSAvailabilityZonesOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAWSAvailabilityZonesParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAWSAvailabilityZones", - Method: "GET", - PathPattern: "/api/providers/aws/AvailabilityZones", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAWSAvailabilityZonesReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAWSAvailabilityZonesOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAWSAvailabilityZones: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAWSCredentialProfiles retrieves a w s credential profiles -*/ -func (a *Client) GetAWSCredentialProfiles(params *GetAWSCredentialProfilesParams) (*GetAWSCredentialProfilesOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAWSCredentialProfilesParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAWSCredentialProfiles", - Method: "GET", - PathPattern: "/api/providers/aws/profiles", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAWSCredentialProfilesReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAWSCredentialProfilesOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAWSCredentialProfiles: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAWSNodeTypes retrieves a w s supported node types -*/ -func (a *Client) GetAWSNodeTypes(params *GetAWSNodeTypesParams) (*GetAWSNodeTypesOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAWSNodeTypesParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAWSNodeTypes", - Method: "GET", - PathPattern: "/api/providers/aws/nodetypes", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAWSNodeTypesReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAWSNodeTypesOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAWSNodeTypes: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAWSOSImages retrieves a w s supported os images -*/ -func (a *Client) GetAWSOSImages(params *GetAWSOSImagesParams) (*GetAWSOSImagesOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAWSOSImagesParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAWSOSImages", - Method: "GET", - PathPattern: "/api/providers/aws/osimages", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAWSOSImagesReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAWSOSImagesOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAWSOSImages: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAWSRegions retrieves a w s regions -*/ -func (a *Client) GetAWSRegions(params *GetAWSRegionsParams) (*GetAWSRegionsOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAWSRegionsParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAWSRegions", - Method: "GET", - PathPattern: "/api/providers/aws/regions", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAWSRegionsReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAWSRegionsOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAWSRegions: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAWSSubnets retrieves a w s subnets info under a v p c -*/ -func (a *Client) GetAWSSubnets(params *GetAWSSubnetsParams) (*GetAWSSubnetsOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAWSSubnetsParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAWSSubnets", - Method: "GET", - PathPattern: "/api/providers/aws/subnets", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAWSSubnetsReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAWSSubnetsOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAWSSubnets: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetVPCs retrieves a w s v p cs -*/ -func (a *Client) GetVPCs(params *GetVPCsParams) (*GetVPCsOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetVPCsParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getVPCs", - Method: "GET", - PathPattern: "/api/providers/aws/vpc", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetVPCsReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetVPCsOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getVPCs: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -ImportTKGConfigForAWS generates t k g configuration object for a w s -*/ -func (a *Client) ImportTKGConfigForAWS(params *ImportTKGConfigForAWSParams) (*ImportTKGConfigForAWSOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewImportTKGConfigForAWSParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "importTKGConfigForAWS", - Method: "POST", - PathPattern: "/api/providers/aws/config/import", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ImportTKGConfigForAWSReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ImportTKGConfigForAWSOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for importTKGConfigForAWS: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -SetAWSEndpoint validates and set aws credentials -*/ -func (a *Client) SetAWSEndpoint(params *SetAWSEndpointParams) (*SetAWSEndpointCreated, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewSetAWSEndpointParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "setAWSEndpoint", - Method: "POST", - PathPattern: "/api/providers/aws", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &SetAWSEndpointReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*SetAWSEndpointCreated) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for setAWSEndpoint: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/tkg/web/server/client/aws/create_a_w_s_regional_cluster_parameters.go b/tkg/web/server/client/aws/create_a_w_s_regional_cluster_parameters.go deleted file mode 100644 index 76a24f40ee..0000000000 --- a/tkg/web/server/client/aws/create_a_w_s_regional_cluster_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateAWSRegionalClusterParams creates a new CreateAWSRegionalClusterParams object -// with the default values initialized. -func NewCreateAWSRegionalClusterParams() *CreateAWSRegionalClusterParams { - var () - return &CreateAWSRegionalClusterParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewCreateAWSRegionalClusterParamsWithTimeout creates a new CreateAWSRegionalClusterParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewCreateAWSRegionalClusterParamsWithTimeout(timeout time.Duration) *CreateAWSRegionalClusterParams { - var () - return &CreateAWSRegionalClusterParams{ - - timeout: timeout, - } -} - -// NewCreateAWSRegionalClusterParamsWithContext creates a new CreateAWSRegionalClusterParams object -// with the default values initialized, and the ability to set a context for a request -func NewCreateAWSRegionalClusterParamsWithContext(ctx context.Context) *CreateAWSRegionalClusterParams { - var () - return &CreateAWSRegionalClusterParams{ - - Context: ctx, - } -} - -// NewCreateAWSRegionalClusterParamsWithHTTPClient creates a new CreateAWSRegionalClusterParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewCreateAWSRegionalClusterParamsWithHTTPClient(client *http.Client) *CreateAWSRegionalClusterParams { - var () - return &CreateAWSRegionalClusterParams{ - HTTPClient: client, - } -} - -/* -CreateAWSRegionalClusterParams contains all the parameters to send to the API endpoint -for the create a w s regional cluster operation typically these are written to a http.Request -*/ -type CreateAWSRegionalClusterParams struct { - - /*Params - parameters to create a regional cluster - - */ - Params *models.AWSRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the create a w s regional cluster params -func (o *CreateAWSRegionalClusterParams) WithTimeout(timeout time.Duration) *CreateAWSRegionalClusterParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the create a w s regional cluster params -func (o *CreateAWSRegionalClusterParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the create a w s regional cluster params -func (o *CreateAWSRegionalClusterParams) WithContext(ctx context.Context) *CreateAWSRegionalClusterParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the create a w s regional cluster params -func (o *CreateAWSRegionalClusterParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the create a w s regional cluster params -func (o *CreateAWSRegionalClusterParams) WithHTTPClient(client *http.Client) *CreateAWSRegionalClusterParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the create a w s regional cluster params -func (o *CreateAWSRegionalClusterParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the create a w s regional cluster params -func (o *CreateAWSRegionalClusterParams) WithParams(params *models.AWSRegionalClusterParams) *CreateAWSRegionalClusterParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the create a w s regional cluster params -func (o *CreateAWSRegionalClusterParams) SetParams(params *models.AWSRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *CreateAWSRegionalClusterParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/create_a_w_s_regional_cluster_responses.go b/tkg/web/server/client/aws/create_a_w_s_regional_cluster_responses.go deleted file mode 100644 index 550bcd5231..0000000000 --- a/tkg/web/server/client/aws/create_a_w_s_regional_cluster_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateAWSRegionalClusterReader is a Reader for the CreateAWSRegionalCluster structure. -type CreateAWSRegionalClusterReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *CreateAWSRegionalClusterReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewCreateAWSRegionalClusterOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewCreateAWSRegionalClusterBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewCreateAWSRegionalClusterUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewCreateAWSRegionalClusterInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewCreateAWSRegionalClusterOK creates a CreateAWSRegionalClusterOK with default headers values -func NewCreateAWSRegionalClusterOK() *CreateAWSRegionalClusterOK { - return &CreateAWSRegionalClusterOK{} -} - -/* -CreateAWSRegionalClusterOK handles this case with default header values. - -Creating regional cluster started successfully -*/ -type CreateAWSRegionalClusterOK struct { - Payload string -} - -func (o *CreateAWSRegionalClusterOK) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/create][%d] createAWSRegionalClusterOK %+v", 200, o.Payload) -} - -func (o *CreateAWSRegionalClusterOK) GetPayload() string { - return o.Payload -} - -func (o *CreateAWSRegionalClusterOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAWSRegionalClusterBadRequest creates a CreateAWSRegionalClusterBadRequest with default headers values -func NewCreateAWSRegionalClusterBadRequest() *CreateAWSRegionalClusterBadRequest { - return &CreateAWSRegionalClusterBadRequest{} -} - -/* -CreateAWSRegionalClusterBadRequest handles this case with default header values. - -Bad request -*/ -type CreateAWSRegionalClusterBadRequest struct { - Payload *models.Error -} - -func (o *CreateAWSRegionalClusterBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/create][%d] createAWSRegionalClusterBadRequest %+v", 400, o.Payload) -} - -func (o *CreateAWSRegionalClusterBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAWSRegionalClusterBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAWSRegionalClusterUnauthorized creates a CreateAWSRegionalClusterUnauthorized with default headers values -func NewCreateAWSRegionalClusterUnauthorized() *CreateAWSRegionalClusterUnauthorized { - return &CreateAWSRegionalClusterUnauthorized{} -} - -/* -CreateAWSRegionalClusterUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type CreateAWSRegionalClusterUnauthorized struct { - Payload *models.Error -} - -func (o *CreateAWSRegionalClusterUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/create][%d] createAWSRegionalClusterUnauthorized %+v", 401, o.Payload) -} - -func (o *CreateAWSRegionalClusterUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAWSRegionalClusterUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAWSRegionalClusterInternalServerError creates a CreateAWSRegionalClusterInternalServerError with default headers values -func NewCreateAWSRegionalClusterInternalServerError() *CreateAWSRegionalClusterInternalServerError { - return &CreateAWSRegionalClusterInternalServerError{} -} - -/* -CreateAWSRegionalClusterInternalServerError handles this case with default header values. - -Internal server error -*/ -type CreateAWSRegionalClusterInternalServerError struct { - Payload *models.Error -} - -func (o *CreateAWSRegionalClusterInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/create][%d] createAWSRegionalClusterInternalServerError %+v", 500, o.Payload) -} - -func (o *CreateAWSRegionalClusterInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAWSRegionalClusterInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/export_t_k_g_config_for_a_w_s_parameters.go b/tkg/web/server/client/aws/export_t_k_g_config_for_a_w_s_parameters.go deleted file mode 100644 index 0a1824c228..0000000000 --- a/tkg/web/server/client/aws/export_t_k_g_config_for_a_w_s_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewExportTKGConfigForAWSParams creates a new ExportTKGConfigForAWSParams object -// with the default values initialized. -func NewExportTKGConfigForAWSParams() *ExportTKGConfigForAWSParams { - var () - return &ExportTKGConfigForAWSParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewExportTKGConfigForAWSParamsWithTimeout creates a new ExportTKGConfigForAWSParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewExportTKGConfigForAWSParamsWithTimeout(timeout time.Duration) *ExportTKGConfigForAWSParams { - var () - return &ExportTKGConfigForAWSParams{ - - timeout: timeout, - } -} - -// NewExportTKGConfigForAWSParamsWithContext creates a new ExportTKGConfigForAWSParams object -// with the default values initialized, and the ability to set a context for a request -func NewExportTKGConfigForAWSParamsWithContext(ctx context.Context) *ExportTKGConfigForAWSParams { - var () - return &ExportTKGConfigForAWSParams{ - - Context: ctx, - } -} - -// NewExportTKGConfigForAWSParamsWithHTTPClient creates a new ExportTKGConfigForAWSParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewExportTKGConfigForAWSParamsWithHTTPClient(client *http.Client) *ExportTKGConfigForAWSParams { - var () - return &ExportTKGConfigForAWSParams{ - HTTPClient: client, - } -} - -/* -ExportTKGConfigForAWSParams contains all the parameters to send to the API endpoint -for the export t k g config for a w s operation typically these are written to a http.Request -*/ -type ExportTKGConfigForAWSParams struct { - - /*Params - parameters to generate TKG configuration file for AWS - - */ - Params *models.AWSRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the export t k g config for a w s params -func (o *ExportTKGConfigForAWSParams) WithTimeout(timeout time.Duration) *ExportTKGConfigForAWSParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the export t k g config for a w s params -func (o *ExportTKGConfigForAWSParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the export t k g config for a w s params -func (o *ExportTKGConfigForAWSParams) WithContext(ctx context.Context) *ExportTKGConfigForAWSParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the export t k g config for a w s params -func (o *ExportTKGConfigForAWSParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the export t k g config for a w s params -func (o *ExportTKGConfigForAWSParams) WithHTTPClient(client *http.Client) *ExportTKGConfigForAWSParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the export t k g config for a w s params -func (o *ExportTKGConfigForAWSParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the export t k g config for a w s params -func (o *ExportTKGConfigForAWSParams) WithParams(params *models.AWSRegionalClusterParams) *ExportTKGConfigForAWSParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the export t k g config for a w s params -func (o *ExportTKGConfigForAWSParams) SetParams(params *models.AWSRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ExportTKGConfigForAWSParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/export_t_k_g_config_for_a_w_s_responses.go b/tkg/web/server/client/aws/export_t_k_g_config_for_a_w_s_responses.go deleted file mode 100644 index 2d9a910fdf..0000000000 --- a/tkg/web/server/client/aws/export_t_k_g_config_for_a_w_s_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ExportTKGConfigForAWSReader is a Reader for the ExportTKGConfigForAWS structure. -type ExportTKGConfigForAWSReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ExportTKGConfigForAWSReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewExportTKGConfigForAWSOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewExportTKGConfigForAWSBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewExportTKGConfigForAWSUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewExportTKGConfigForAWSInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewExportTKGConfigForAWSOK creates a ExportTKGConfigForAWSOK with default headers values -func NewExportTKGConfigForAWSOK() *ExportTKGConfigForAWSOK { - return &ExportTKGConfigForAWSOK{} -} - -/* -ExportTKGConfigForAWSOK handles this case with default header values. - -Generated TKG configuration successfully -*/ -type ExportTKGConfigForAWSOK struct { - Payload string -} - -func (o *ExportTKGConfigForAWSOK) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/config/export][%d] exportTKGConfigForAWSOK %+v", 200, o.Payload) -} - -func (o *ExportTKGConfigForAWSOK) GetPayload() string { - return o.Payload -} - -func (o *ExportTKGConfigForAWSOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewExportTKGConfigForAWSBadRequest creates a ExportTKGConfigForAWSBadRequest with default headers values -func NewExportTKGConfigForAWSBadRequest() *ExportTKGConfigForAWSBadRequest { - return &ExportTKGConfigForAWSBadRequest{} -} - -/* -ExportTKGConfigForAWSBadRequest handles this case with default header values. - -Bad request -*/ -type ExportTKGConfigForAWSBadRequest struct { - Payload *models.Error -} - -func (o *ExportTKGConfigForAWSBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/config/export][%d] exportTKGConfigForAWSBadRequest %+v", 400, o.Payload) -} - -func (o *ExportTKGConfigForAWSBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ExportTKGConfigForAWSBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewExportTKGConfigForAWSUnauthorized creates a ExportTKGConfigForAWSUnauthorized with default headers values -func NewExportTKGConfigForAWSUnauthorized() *ExportTKGConfigForAWSUnauthorized { - return &ExportTKGConfigForAWSUnauthorized{} -} - -/* -ExportTKGConfigForAWSUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type ExportTKGConfigForAWSUnauthorized struct { - Payload *models.Error -} - -func (o *ExportTKGConfigForAWSUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/config/export][%d] exportTKGConfigForAWSUnauthorized %+v", 401, o.Payload) -} - -func (o *ExportTKGConfigForAWSUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *ExportTKGConfigForAWSUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewExportTKGConfigForAWSInternalServerError creates a ExportTKGConfigForAWSInternalServerError with default headers values -func NewExportTKGConfigForAWSInternalServerError() *ExportTKGConfigForAWSInternalServerError { - return &ExportTKGConfigForAWSInternalServerError{} -} - -/* -ExportTKGConfigForAWSInternalServerError handles this case with default header values. - -Internal server error -*/ -type ExportTKGConfigForAWSInternalServerError struct { - Payload *models.Error -} - -func (o *ExportTKGConfigForAWSInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/config/export][%d] exportTKGConfigForAWSInternalServerError %+v", 500, o.Payload) -} - -func (o *ExportTKGConfigForAWSInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ExportTKGConfigForAWSInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_availability_zones_parameters.go b/tkg/web/server/client/aws/get_a_w_s_availability_zones_parameters.go deleted file mode 100644 index a45352307f..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_availability_zones_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAWSAvailabilityZonesParams creates a new GetAWSAvailabilityZonesParams object -// with the default values initialized. -func NewGetAWSAvailabilityZonesParams() *GetAWSAvailabilityZonesParams { - - return &GetAWSAvailabilityZonesParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAWSAvailabilityZonesParamsWithTimeout creates a new GetAWSAvailabilityZonesParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAWSAvailabilityZonesParamsWithTimeout(timeout time.Duration) *GetAWSAvailabilityZonesParams { - - return &GetAWSAvailabilityZonesParams{ - - timeout: timeout, - } -} - -// NewGetAWSAvailabilityZonesParamsWithContext creates a new GetAWSAvailabilityZonesParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAWSAvailabilityZonesParamsWithContext(ctx context.Context) *GetAWSAvailabilityZonesParams { - - return &GetAWSAvailabilityZonesParams{ - - Context: ctx, - } -} - -// NewGetAWSAvailabilityZonesParamsWithHTTPClient creates a new GetAWSAvailabilityZonesParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAWSAvailabilityZonesParamsWithHTTPClient(client *http.Client) *GetAWSAvailabilityZonesParams { - - return &GetAWSAvailabilityZonesParams{ - HTTPClient: client, - } -} - -/* -GetAWSAvailabilityZonesParams contains all the parameters to send to the API endpoint -for the get a w s availability zones operation typically these are written to a http.Request -*/ -type GetAWSAvailabilityZonesParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get a w s availability zones params -func (o *GetAWSAvailabilityZonesParams) WithTimeout(timeout time.Duration) *GetAWSAvailabilityZonesParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get a w s availability zones params -func (o *GetAWSAvailabilityZonesParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get a w s availability zones params -func (o *GetAWSAvailabilityZonesParams) WithContext(ctx context.Context) *GetAWSAvailabilityZonesParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get a w s availability zones params -func (o *GetAWSAvailabilityZonesParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get a w s availability zones params -func (o *GetAWSAvailabilityZonesParams) WithHTTPClient(client *http.Client) *GetAWSAvailabilityZonesParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get a w s availability zones params -func (o *GetAWSAvailabilityZonesParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAWSAvailabilityZonesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_availability_zones_responses.go b/tkg/web/server/client/aws/get_a_w_s_availability_zones_responses.go deleted file mode 100644 index 7a2030aeb6..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_availability_zones_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSAvailabilityZonesReader is a Reader for the GetAWSAvailabilityZones structure. -type GetAWSAvailabilityZonesReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAWSAvailabilityZonesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAWSAvailabilityZonesOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAWSAvailabilityZonesBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAWSAvailabilityZonesUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAWSAvailabilityZonesInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAWSAvailabilityZonesOK creates a GetAWSAvailabilityZonesOK with default headers values -func NewGetAWSAvailabilityZonesOK() *GetAWSAvailabilityZonesOK { - return &GetAWSAvailabilityZonesOK{} -} - -/* -GetAWSAvailabilityZonesOK handles this case with default header values. - -Successful retrieval of AWS availability zones -*/ -type GetAWSAvailabilityZonesOK struct { - Payload []*models.AWSAvailabilityZone -} - -func (o *GetAWSAvailabilityZonesOK) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/AvailabilityZones][%d] getAWSAvailabilityZonesOK %+v", 200, o.Payload) -} - -func (o *GetAWSAvailabilityZonesOK) GetPayload() []*models.AWSAvailabilityZone { - return o.Payload -} - -func (o *GetAWSAvailabilityZonesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSAvailabilityZonesBadRequest creates a GetAWSAvailabilityZonesBadRequest with default headers values -func NewGetAWSAvailabilityZonesBadRequest() *GetAWSAvailabilityZonesBadRequest { - return &GetAWSAvailabilityZonesBadRequest{} -} - -/* -GetAWSAvailabilityZonesBadRequest handles this case with default header values. - -Bad request -*/ -type GetAWSAvailabilityZonesBadRequest struct { - Payload *models.Error -} - -func (o *GetAWSAvailabilityZonesBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/AvailabilityZones][%d] getAWSAvailabilityZonesBadRequest %+v", 400, o.Payload) -} - -func (o *GetAWSAvailabilityZonesBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSAvailabilityZonesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSAvailabilityZonesUnauthorized creates a GetAWSAvailabilityZonesUnauthorized with default headers values -func NewGetAWSAvailabilityZonesUnauthorized() *GetAWSAvailabilityZonesUnauthorized { - return &GetAWSAvailabilityZonesUnauthorized{} -} - -/* -GetAWSAvailabilityZonesUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAWSAvailabilityZonesUnauthorized struct { - Payload *models.Error -} - -func (o *GetAWSAvailabilityZonesUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/AvailabilityZones][%d] getAWSAvailabilityZonesUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAWSAvailabilityZonesUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSAvailabilityZonesUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSAvailabilityZonesInternalServerError creates a GetAWSAvailabilityZonesInternalServerError with default headers values -func NewGetAWSAvailabilityZonesInternalServerError() *GetAWSAvailabilityZonesInternalServerError { - return &GetAWSAvailabilityZonesInternalServerError{} -} - -/* -GetAWSAvailabilityZonesInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAWSAvailabilityZonesInternalServerError struct { - Payload *models.Error -} - -func (o *GetAWSAvailabilityZonesInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/AvailabilityZones][%d] getAWSAvailabilityZonesInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAWSAvailabilityZonesInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSAvailabilityZonesInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_credential_profiles_parameters.go b/tkg/web/server/client/aws/get_a_w_s_credential_profiles_parameters.go deleted file mode 100644 index 845362437d..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_credential_profiles_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAWSCredentialProfilesParams creates a new GetAWSCredentialProfilesParams object -// with the default values initialized. -func NewGetAWSCredentialProfilesParams() *GetAWSCredentialProfilesParams { - - return &GetAWSCredentialProfilesParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAWSCredentialProfilesParamsWithTimeout creates a new GetAWSCredentialProfilesParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAWSCredentialProfilesParamsWithTimeout(timeout time.Duration) *GetAWSCredentialProfilesParams { - - return &GetAWSCredentialProfilesParams{ - - timeout: timeout, - } -} - -// NewGetAWSCredentialProfilesParamsWithContext creates a new GetAWSCredentialProfilesParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAWSCredentialProfilesParamsWithContext(ctx context.Context) *GetAWSCredentialProfilesParams { - - return &GetAWSCredentialProfilesParams{ - - Context: ctx, - } -} - -// NewGetAWSCredentialProfilesParamsWithHTTPClient creates a new GetAWSCredentialProfilesParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAWSCredentialProfilesParamsWithHTTPClient(client *http.Client) *GetAWSCredentialProfilesParams { - - return &GetAWSCredentialProfilesParams{ - HTTPClient: client, - } -} - -/* -GetAWSCredentialProfilesParams contains all the parameters to send to the API endpoint -for the get a w s credential profiles operation typically these are written to a http.Request -*/ -type GetAWSCredentialProfilesParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get a w s credential profiles params -func (o *GetAWSCredentialProfilesParams) WithTimeout(timeout time.Duration) *GetAWSCredentialProfilesParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get a w s credential profiles params -func (o *GetAWSCredentialProfilesParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get a w s credential profiles params -func (o *GetAWSCredentialProfilesParams) WithContext(ctx context.Context) *GetAWSCredentialProfilesParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get a w s credential profiles params -func (o *GetAWSCredentialProfilesParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get a w s credential profiles params -func (o *GetAWSCredentialProfilesParams) WithHTTPClient(client *http.Client) *GetAWSCredentialProfilesParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get a w s credential profiles params -func (o *GetAWSCredentialProfilesParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAWSCredentialProfilesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_credential_profiles_responses.go b/tkg/web/server/client/aws/get_a_w_s_credential_profiles_responses.go deleted file mode 100644 index 0659f439b0..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_credential_profiles_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSCredentialProfilesReader is a Reader for the GetAWSCredentialProfiles structure. -type GetAWSCredentialProfilesReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAWSCredentialProfilesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAWSCredentialProfilesOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAWSCredentialProfilesBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAWSCredentialProfilesUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAWSCredentialProfilesInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAWSCredentialProfilesOK creates a GetAWSCredentialProfilesOK with default headers values -func NewGetAWSCredentialProfilesOK() *GetAWSCredentialProfilesOK { - return &GetAWSCredentialProfilesOK{} -} - -/* -GetAWSCredentialProfilesOK handles this case with default header values. - -Successful retrieval of AWS credentials profiles -*/ -type GetAWSCredentialProfilesOK struct { - Payload []string -} - -func (o *GetAWSCredentialProfilesOK) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/profiles][%d] getAWSCredentialProfilesOK %+v", 200, o.Payload) -} - -func (o *GetAWSCredentialProfilesOK) GetPayload() []string { - return o.Payload -} - -func (o *GetAWSCredentialProfilesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSCredentialProfilesBadRequest creates a GetAWSCredentialProfilesBadRequest with default headers values -func NewGetAWSCredentialProfilesBadRequest() *GetAWSCredentialProfilesBadRequest { - return &GetAWSCredentialProfilesBadRequest{} -} - -/* -GetAWSCredentialProfilesBadRequest handles this case with default header values. - -Bad request -*/ -type GetAWSCredentialProfilesBadRequest struct { - Payload *models.Error -} - -func (o *GetAWSCredentialProfilesBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/profiles][%d] getAWSCredentialProfilesBadRequest %+v", 400, o.Payload) -} - -func (o *GetAWSCredentialProfilesBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSCredentialProfilesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSCredentialProfilesUnauthorized creates a GetAWSCredentialProfilesUnauthorized with default headers values -func NewGetAWSCredentialProfilesUnauthorized() *GetAWSCredentialProfilesUnauthorized { - return &GetAWSCredentialProfilesUnauthorized{} -} - -/* -GetAWSCredentialProfilesUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAWSCredentialProfilesUnauthorized struct { - Payload *models.Error -} - -func (o *GetAWSCredentialProfilesUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/profiles][%d] getAWSCredentialProfilesUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAWSCredentialProfilesUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSCredentialProfilesUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSCredentialProfilesInternalServerError creates a GetAWSCredentialProfilesInternalServerError with default headers values -func NewGetAWSCredentialProfilesInternalServerError() *GetAWSCredentialProfilesInternalServerError { - return &GetAWSCredentialProfilesInternalServerError{} -} - -/* -GetAWSCredentialProfilesInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAWSCredentialProfilesInternalServerError struct { - Payload *models.Error -} - -func (o *GetAWSCredentialProfilesInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/profiles][%d] getAWSCredentialProfilesInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAWSCredentialProfilesInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSCredentialProfilesInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_node_types_parameters.go b/tkg/web/server/client/aws/get_a_w_s_node_types_parameters.go deleted file mode 100644 index 10469e989b..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_node_types_parameters.go +++ /dev/null @@ -1,148 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAWSNodeTypesParams creates a new GetAWSNodeTypesParams object -// with the default values initialized. -func NewGetAWSNodeTypesParams() *GetAWSNodeTypesParams { - var () - return &GetAWSNodeTypesParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAWSNodeTypesParamsWithTimeout creates a new GetAWSNodeTypesParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAWSNodeTypesParamsWithTimeout(timeout time.Duration) *GetAWSNodeTypesParams { - var () - return &GetAWSNodeTypesParams{ - - timeout: timeout, - } -} - -// NewGetAWSNodeTypesParamsWithContext creates a new GetAWSNodeTypesParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAWSNodeTypesParamsWithContext(ctx context.Context) *GetAWSNodeTypesParams { - var () - return &GetAWSNodeTypesParams{ - - Context: ctx, - } -} - -// NewGetAWSNodeTypesParamsWithHTTPClient creates a new GetAWSNodeTypesParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAWSNodeTypesParamsWithHTTPClient(client *http.Client) *GetAWSNodeTypesParams { - var () - return &GetAWSNodeTypesParams{ - HTTPClient: client, - } -} - -/* -GetAWSNodeTypesParams contains all the parameters to send to the API endpoint -for the get a w s node types operation typically these are written to a http.Request -*/ -type GetAWSNodeTypesParams struct { - - /*Az - AWS availability zone, e.g. us-west-2 - - */ - Az *string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get a w s node types params -func (o *GetAWSNodeTypesParams) WithTimeout(timeout time.Duration) *GetAWSNodeTypesParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get a w s node types params -func (o *GetAWSNodeTypesParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get a w s node types params -func (o *GetAWSNodeTypesParams) WithContext(ctx context.Context) *GetAWSNodeTypesParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get a w s node types params -func (o *GetAWSNodeTypesParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get a w s node types params -func (o *GetAWSNodeTypesParams) WithHTTPClient(client *http.Client) *GetAWSNodeTypesParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get a w s node types params -func (o *GetAWSNodeTypesParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithAz adds the az to the get a w s node types params -func (o *GetAWSNodeTypesParams) WithAz(az *string) *GetAWSNodeTypesParams { - o.SetAz(az) - return o -} - -// SetAz adds the az to the get a w s node types params -func (o *GetAWSNodeTypesParams) SetAz(az *string) { - o.Az = az -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAWSNodeTypesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Az != nil { - - // query param az - var qrAz string - if o.Az != nil { - qrAz = *o.Az - } - qAz := qrAz - if qAz != "" { - if err := r.SetQueryParam("az", qAz); err != nil { - return err - } - } - - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_node_types_responses.go b/tkg/web/server/client/aws/get_a_w_s_node_types_responses.go deleted file mode 100644 index 0c80fd60c4..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_node_types_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSNodeTypesReader is a Reader for the GetAWSNodeTypes structure. -type GetAWSNodeTypesReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAWSNodeTypesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAWSNodeTypesOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAWSNodeTypesBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAWSNodeTypesUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAWSNodeTypesInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAWSNodeTypesOK creates a GetAWSNodeTypesOK with default headers values -func NewGetAWSNodeTypesOK() *GetAWSNodeTypesOK { - return &GetAWSNodeTypesOK{} -} - -/* -GetAWSNodeTypesOK handles this case with default header values. - -Successful retrieval of AWS node types -*/ -type GetAWSNodeTypesOK struct { - Payload []string -} - -func (o *GetAWSNodeTypesOK) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/nodetypes][%d] getAWSNodeTypesOK %+v", 200, o.Payload) -} - -func (o *GetAWSNodeTypesOK) GetPayload() []string { - return o.Payload -} - -func (o *GetAWSNodeTypesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSNodeTypesBadRequest creates a GetAWSNodeTypesBadRequest with default headers values -func NewGetAWSNodeTypesBadRequest() *GetAWSNodeTypesBadRequest { - return &GetAWSNodeTypesBadRequest{} -} - -/* -GetAWSNodeTypesBadRequest handles this case with default header values. - -Bad request -*/ -type GetAWSNodeTypesBadRequest struct { - Payload *models.Error -} - -func (o *GetAWSNodeTypesBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/nodetypes][%d] getAWSNodeTypesBadRequest %+v", 400, o.Payload) -} - -func (o *GetAWSNodeTypesBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSNodeTypesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSNodeTypesUnauthorized creates a GetAWSNodeTypesUnauthorized with default headers values -func NewGetAWSNodeTypesUnauthorized() *GetAWSNodeTypesUnauthorized { - return &GetAWSNodeTypesUnauthorized{} -} - -/* -GetAWSNodeTypesUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAWSNodeTypesUnauthorized struct { - Payload *models.Error -} - -func (o *GetAWSNodeTypesUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/nodetypes][%d] getAWSNodeTypesUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAWSNodeTypesUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSNodeTypesUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSNodeTypesInternalServerError creates a GetAWSNodeTypesInternalServerError with default headers values -func NewGetAWSNodeTypesInternalServerError() *GetAWSNodeTypesInternalServerError { - return &GetAWSNodeTypesInternalServerError{} -} - -/* -GetAWSNodeTypesInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAWSNodeTypesInternalServerError struct { - Payload *models.Error -} - -func (o *GetAWSNodeTypesInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/nodetypes][%d] getAWSNodeTypesInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAWSNodeTypesInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSNodeTypesInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_o_s_images_parameters.go b/tkg/web/server/client/aws/get_a_w_s_o_s_images_parameters.go deleted file mode 100644 index 55cecea361..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_o_s_images_parameters.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAWSOSImagesParams creates a new GetAWSOSImagesParams object -// with the default values initialized. -func NewGetAWSOSImagesParams() *GetAWSOSImagesParams { - var () - return &GetAWSOSImagesParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAWSOSImagesParamsWithTimeout creates a new GetAWSOSImagesParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAWSOSImagesParamsWithTimeout(timeout time.Duration) *GetAWSOSImagesParams { - var () - return &GetAWSOSImagesParams{ - - timeout: timeout, - } -} - -// NewGetAWSOSImagesParamsWithContext creates a new GetAWSOSImagesParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAWSOSImagesParamsWithContext(ctx context.Context) *GetAWSOSImagesParams { - var () - return &GetAWSOSImagesParams{ - - Context: ctx, - } -} - -// NewGetAWSOSImagesParamsWithHTTPClient creates a new GetAWSOSImagesParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAWSOSImagesParamsWithHTTPClient(client *http.Client) *GetAWSOSImagesParams { - var () - return &GetAWSOSImagesParams{ - HTTPClient: client, - } -} - -/* -GetAWSOSImagesParams contains all the parameters to send to the API endpoint -for the get a w s o s images operation typically these are written to a http.Request -*/ -type GetAWSOSImagesParams struct { - - /*Region - AWS region, e.g. us-west-2 - - */ - Region string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get a w s o s images params -func (o *GetAWSOSImagesParams) WithTimeout(timeout time.Duration) *GetAWSOSImagesParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get a w s o s images params -func (o *GetAWSOSImagesParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get a w s o s images params -func (o *GetAWSOSImagesParams) WithContext(ctx context.Context) *GetAWSOSImagesParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get a w s o s images params -func (o *GetAWSOSImagesParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get a w s o s images params -func (o *GetAWSOSImagesParams) WithHTTPClient(client *http.Client) *GetAWSOSImagesParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get a w s o s images params -func (o *GetAWSOSImagesParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithRegion adds the region to the get a w s o s images params -func (o *GetAWSOSImagesParams) WithRegion(region string) *GetAWSOSImagesParams { - o.SetRegion(region) - return o -} - -// SetRegion adds the region to the get a w s o s images params -func (o *GetAWSOSImagesParams) SetRegion(region string) { - o.Region = region -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAWSOSImagesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // query param region - qrRegion := o.Region - qRegion := qrRegion - if qRegion != "" { - if err := r.SetQueryParam("region", qRegion); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_o_s_images_responses.go b/tkg/web/server/client/aws/get_a_w_s_o_s_images_responses.go deleted file mode 100644 index fc607f36fa..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_o_s_images_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSOSImagesReader is a Reader for the GetAWSOSImages structure. -type GetAWSOSImagesReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAWSOSImagesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAWSOSImagesOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAWSOSImagesBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAWSOSImagesUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAWSOSImagesInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAWSOSImagesOK creates a GetAWSOSImagesOK with default headers values -func NewGetAWSOSImagesOK() *GetAWSOSImagesOK { - return &GetAWSOSImagesOK{} -} - -/* -GetAWSOSImagesOK handles this case with default header values. - -Successful retrieval of AWS supported os images -*/ -type GetAWSOSImagesOK struct { - Payload []*models.AWSVirtualMachine -} - -func (o *GetAWSOSImagesOK) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/osimages][%d] getAWSOSImagesOK %+v", 200, o.Payload) -} - -func (o *GetAWSOSImagesOK) GetPayload() []*models.AWSVirtualMachine { - return o.Payload -} - -func (o *GetAWSOSImagesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSOSImagesBadRequest creates a GetAWSOSImagesBadRequest with default headers values -func NewGetAWSOSImagesBadRequest() *GetAWSOSImagesBadRequest { - return &GetAWSOSImagesBadRequest{} -} - -/* -GetAWSOSImagesBadRequest handles this case with default header values. - -Bad request -*/ -type GetAWSOSImagesBadRequest struct { - Payload *models.Error -} - -func (o *GetAWSOSImagesBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/osimages][%d] getAWSOSImagesBadRequest %+v", 400, o.Payload) -} - -func (o *GetAWSOSImagesBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSOSImagesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSOSImagesUnauthorized creates a GetAWSOSImagesUnauthorized with default headers values -func NewGetAWSOSImagesUnauthorized() *GetAWSOSImagesUnauthorized { - return &GetAWSOSImagesUnauthorized{} -} - -/* -GetAWSOSImagesUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAWSOSImagesUnauthorized struct { - Payload *models.Error -} - -func (o *GetAWSOSImagesUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/osimages][%d] getAWSOSImagesUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAWSOSImagesUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSOSImagesUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSOSImagesInternalServerError creates a GetAWSOSImagesInternalServerError with default headers values -func NewGetAWSOSImagesInternalServerError() *GetAWSOSImagesInternalServerError { - return &GetAWSOSImagesInternalServerError{} -} - -/* -GetAWSOSImagesInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAWSOSImagesInternalServerError struct { - Payload *models.Error -} - -func (o *GetAWSOSImagesInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/osimages][%d] getAWSOSImagesInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAWSOSImagesInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSOSImagesInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_regions_parameters.go b/tkg/web/server/client/aws/get_a_w_s_regions_parameters.go deleted file mode 100644 index de7dde14e8..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_regions_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAWSRegionsParams creates a new GetAWSRegionsParams object -// with the default values initialized. -func NewGetAWSRegionsParams() *GetAWSRegionsParams { - - return &GetAWSRegionsParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAWSRegionsParamsWithTimeout creates a new GetAWSRegionsParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAWSRegionsParamsWithTimeout(timeout time.Duration) *GetAWSRegionsParams { - - return &GetAWSRegionsParams{ - - timeout: timeout, - } -} - -// NewGetAWSRegionsParamsWithContext creates a new GetAWSRegionsParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAWSRegionsParamsWithContext(ctx context.Context) *GetAWSRegionsParams { - - return &GetAWSRegionsParams{ - - Context: ctx, - } -} - -// NewGetAWSRegionsParamsWithHTTPClient creates a new GetAWSRegionsParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAWSRegionsParamsWithHTTPClient(client *http.Client) *GetAWSRegionsParams { - - return &GetAWSRegionsParams{ - HTTPClient: client, - } -} - -/* -GetAWSRegionsParams contains all the parameters to send to the API endpoint -for the get a w s regions operation typically these are written to a http.Request -*/ -type GetAWSRegionsParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get a w s regions params -func (o *GetAWSRegionsParams) WithTimeout(timeout time.Duration) *GetAWSRegionsParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get a w s regions params -func (o *GetAWSRegionsParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get a w s regions params -func (o *GetAWSRegionsParams) WithContext(ctx context.Context) *GetAWSRegionsParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get a w s regions params -func (o *GetAWSRegionsParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get a w s regions params -func (o *GetAWSRegionsParams) WithHTTPClient(client *http.Client) *GetAWSRegionsParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get a w s regions params -func (o *GetAWSRegionsParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAWSRegionsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_regions_responses.go b/tkg/web/server/client/aws/get_a_w_s_regions_responses.go deleted file mode 100644 index 8057add555..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_regions_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSRegionsReader is a Reader for the GetAWSRegions structure. -type GetAWSRegionsReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAWSRegionsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAWSRegionsOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAWSRegionsBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAWSRegionsUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAWSRegionsInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAWSRegionsOK creates a GetAWSRegionsOK with default headers values -func NewGetAWSRegionsOK() *GetAWSRegionsOK { - return &GetAWSRegionsOK{} -} - -/* -GetAWSRegionsOK handles this case with default header values. - -Successful retrieval of AWS regions -*/ -type GetAWSRegionsOK struct { - Payload []string -} - -func (o *GetAWSRegionsOK) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/regions][%d] getAWSRegionsOK %+v", 200, o.Payload) -} - -func (o *GetAWSRegionsOK) GetPayload() []string { - return o.Payload -} - -func (o *GetAWSRegionsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSRegionsBadRequest creates a GetAWSRegionsBadRequest with default headers values -func NewGetAWSRegionsBadRequest() *GetAWSRegionsBadRequest { - return &GetAWSRegionsBadRequest{} -} - -/* -GetAWSRegionsBadRequest handles this case with default header values. - -Bad request -*/ -type GetAWSRegionsBadRequest struct { - Payload *models.Error -} - -func (o *GetAWSRegionsBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/regions][%d] getAWSRegionsBadRequest %+v", 400, o.Payload) -} - -func (o *GetAWSRegionsBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSRegionsBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSRegionsUnauthorized creates a GetAWSRegionsUnauthorized with default headers values -func NewGetAWSRegionsUnauthorized() *GetAWSRegionsUnauthorized { - return &GetAWSRegionsUnauthorized{} -} - -/* -GetAWSRegionsUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAWSRegionsUnauthorized struct { - Payload *models.Error -} - -func (o *GetAWSRegionsUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/regions][%d] getAWSRegionsUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAWSRegionsUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSRegionsUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSRegionsInternalServerError creates a GetAWSRegionsInternalServerError with default headers values -func NewGetAWSRegionsInternalServerError() *GetAWSRegionsInternalServerError { - return &GetAWSRegionsInternalServerError{} -} - -/* -GetAWSRegionsInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAWSRegionsInternalServerError struct { - Payload *models.Error -} - -func (o *GetAWSRegionsInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/regions][%d] getAWSRegionsInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAWSRegionsInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSRegionsInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_subnets_parameters.go b/tkg/web/server/client/aws/get_a_w_s_subnets_parameters.go deleted file mode 100644 index a653e82893..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_subnets_parameters.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAWSSubnetsParams creates a new GetAWSSubnetsParams object -// with the default values initialized. -func NewGetAWSSubnetsParams() *GetAWSSubnetsParams { - var () - return &GetAWSSubnetsParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAWSSubnetsParamsWithTimeout creates a new GetAWSSubnetsParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAWSSubnetsParamsWithTimeout(timeout time.Duration) *GetAWSSubnetsParams { - var () - return &GetAWSSubnetsParams{ - - timeout: timeout, - } -} - -// NewGetAWSSubnetsParamsWithContext creates a new GetAWSSubnetsParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAWSSubnetsParamsWithContext(ctx context.Context) *GetAWSSubnetsParams { - var () - return &GetAWSSubnetsParams{ - - Context: ctx, - } -} - -// NewGetAWSSubnetsParamsWithHTTPClient creates a new GetAWSSubnetsParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAWSSubnetsParamsWithHTTPClient(client *http.Client) *GetAWSSubnetsParams { - var () - return &GetAWSSubnetsParams{ - HTTPClient: client, - } -} - -/* -GetAWSSubnetsParams contains all the parameters to send to the API endpoint -for the get a w s subnets operation typically these are written to a http.Request -*/ -type GetAWSSubnetsParams struct { - - /*VpcID - VPC Id - - */ - VpcID string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get a w s subnets params -func (o *GetAWSSubnetsParams) WithTimeout(timeout time.Duration) *GetAWSSubnetsParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get a w s subnets params -func (o *GetAWSSubnetsParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get a w s subnets params -func (o *GetAWSSubnetsParams) WithContext(ctx context.Context) *GetAWSSubnetsParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get a w s subnets params -func (o *GetAWSSubnetsParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get a w s subnets params -func (o *GetAWSSubnetsParams) WithHTTPClient(client *http.Client) *GetAWSSubnetsParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get a w s subnets params -func (o *GetAWSSubnetsParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithVpcID adds the vpcID to the get a w s subnets params -func (o *GetAWSSubnetsParams) WithVpcID(vpcID string) *GetAWSSubnetsParams { - o.SetVpcID(vpcID) - return o -} - -// SetVpcID adds the vpcId to the get a w s subnets params -func (o *GetAWSSubnetsParams) SetVpcID(vpcID string) { - o.VpcID = vpcID -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAWSSubnetsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // query param vpcId - qrVpcID := o.VpcID - qVpcID := qrVpcID - if qVpcID != "" { - if err := r.SetQueryParam("vpcId", qVpcID); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/get_a_w_s_subnets_responses.go b/tkg/web/server/client/aws/get_a_w_s_subnets_responses.go deleted file mode 100644 index 9b97e14a4b..0000000000 --- a/tkg/web/server/client/aws/get_a_w_s_subnets_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSSubnetsReader is a Reader for the GetAWSSubnets structure. -type GetAWSSubnetsReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAWSSubnetsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAWSSubnetsOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAWSSubnetsBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAWSSubnetsUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAWSSubnetsInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAWSSubnetsOK creates a GetAWSSubnetsOK with default headers values -func NewGetAWSSubnetsOK() *GetAWSSubnetsOK { - return &GetAWSSubnetsOK{} -} - -/* -GetAWSSubnetsOK handles this case with default header values. - -Successful retrieval of AWS subnets -*/ -type GetAWSSubnetsOK struct { - Payload []*models.AWSSubnet -} - -func (o *GetAWSSubnetsOK) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/subnets][%d] getAWSSubnetsOK %+v", 200, o.Payload) -} - -func (o *GetAWSSubnetsOK) GetPayload() []*models.AWSSubnet { - return o.Payload -} - -func (o *GetAWSSubnetsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSSubnetsBadRequest creates a GetAWSSubnetsBadRequest with default headers values -func NewGetAWSSubnetsBadRequest() *GetAWSSubnetsBadRequest { - return &GetAWSSubnetsBadRequest{} -} - -/* -GetAWSSubnetsBadRequest handles this case with default header values. - -Bad request -*/ -type GetAWSSubnetsBadRequest struct { - Payload *models.Error -} - -func (o *GetAWSSubnetsBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/subnets][%d] getAWSSubnetsBadRequest %+v", 400, o.Payload) -} - -func (o *GetAWSSubnetsBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSSubnetsBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSSubnetsUnauthorized creates a GetAWSSubnetsUnauthorized with default headers values -func NewGetAWSSubnetsUnauthorized() *GetAWSSubnetsUnauthorized { - return &GetAWSSubnetsUnauthorized{} -} - -/* -GetAWSSubnetsUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAWSSubnetsUnauthorized struct { - Payload *models.Error -} - -func (o *GetAWSSubnetsUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/subnets][%d] getAWSSubnetsUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAWSSubnetsUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSSubnetsUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAWSSubnetsInternalServerError creates a GetAWSSubnetsInternalServerError with default headers values -func NewGetAWSSubnetsInternalServerError() *GetAWSSubnetsInternalServerError { - return &GetAWSSubnetsInternalServerError{} -} - -/* -GetAWSSubnetsInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAWSSubnetsInternalServerError struct { - Payload *models.Error -} - -func (o *GetAWSSubnetsInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/subnets][%d] getAWSSubnetsInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAWSSubnetsInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAWSSubnetsInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/get_v_p_cs_parameters.go b/tkg/web/server/client/aws/get_v_p_cs_parameters.go deleted file mode 100644 index 563777dba5..0000000000 --- a/tkg/web/server/client/aws/get_v_p_cs_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVPCsParams creates a new GetVPCsParams object -// with the default values initialized. -func NewGetVPCsParams() *GetVPCsParams { - - return &GetVPCsParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetVPCsParamsWithTimeout creates a new GetVPCsParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetVPCsParamsWithTimeout(timeout time.Duration) *GetVPCsParams { - - return &GetVPCsParams{ - - timeout: timeout, - } -} - -// NewGetVPCsParamsWithContext creates a new GetVPCsParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetVPCsParamsWithContext(ctx context.Context) *GetVPCsParams { - - return &GetVPCsParams{ - - Context: ctx, - } -} - -// NewGetVPCsParamsWithHTTPClient creates a new GetVPCsParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetVPCsParamsWithHTTPClient(client *http.Client) *GetVPCsParams { - - return &GetVPCsParams{ - HTTPClient: client, - } -} - -/* -GetVPCsParams contains all the parameters to send to the API endpoint -for the get v p cs operation typically these are written to a http.Request -*/ -type GetVPCsParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get v p cs params -func (o *GetVPCsParams) WithTimeout(timeout time.Duration) *GetVPCsParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get v p cs params -func (o *GetVPCsParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get v p cs params -func (o *GetVPCsParams) WithContext(ctx context.Context) *GetVPCsParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get v p cs params -func (o *GetVPCsParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get v p cs params -func (o *GetVPCsParams) WithHTTPClient(client *http.Client) *GetVPCsParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get v p cs params -func (o *GetVPCsParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetVPCsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/get_v_p_cs_responses.go b/tkg/web/server/client/aws/get_v_p_cs_responses.go deleted file mode 100644 index 53befcdae8..0000000000 --- a/tkg/web/server/client/aws/get_v_p_cs_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVPCsReader is a Reader for the GetVPCs structure. -type GetVPCsReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetVPCsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetVPCsOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetVPCsBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetVPCsUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetVPCsInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetVPCsOK creates a GetVPCsOK with default headers values -func NewGetVPCsOK() *GetVPCsOK { - return &GetVPCsOK{} -} - -/* -GetVPCsOK handles this case with default header values. - -Successful retrieval of AWS VPCs -*/ -type GetVPCsOK struct { - Payload []*models.Vpc -} - -func (o *GetVPCsOK) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/vpc][%d] getVPCsOK %+v", 200, o.Payload) -} - -func (o *GetVPCsOK) GetPayload() []*models.Vpc { - return o.Payload -} - -func (o *GetVPCsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVPCsBadRequest creates a GetVPCsBadRequest with default headers values -func NewGetVPCsBadRequest() *GetVPCsBadRequest { - return &GetVPCsBadRequest{} -} - -/* -GetVPCsBadRequest handles this case with default header values. - -Bad request -*/ -type GetVPCsBadRequest struct { - Payload *models.Error -} - -func (o *GetVPCsBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/vpc][%d] getVPCsBadRequest %+v", 400, o.Payload) -} - -func (o *GetVPCsBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVPCsBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVPCsUnauthorized creates a GetVPCsUnauthorized with default headers values -func NewGetVPCsUnauthorized() *GetVPCsUnauthorized { - return &GetVPCsUnauthorized{} -} - -/* -GetVPCsUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetVPCsUnauthorized struct { - Payload *models.Error -} - -func (o *GetVPCsUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/vpc][%d] getVPCsUnauthorized %+v", 401, o.Payload) -} - -func (o *GetVPCsUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVPCsUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVPCsInternalServerError creates a GetVPCsInternalServerError with default headers values -func NewGetVPCsInternalServerError() *GetVPCsInternalServerError { - return &GetVPCsInternalServerError{} -} - -/* -GetVPCsInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetVPCsInternalServerError struct { - Payload *models.Error -} - -func (o *GetVPCsInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/aws/vpc][%d] getVPCsInternalServerError %+v", 500, o.Payload) -} - -func (o *GetVPCsInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVPCsInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/import_t_k_g_config_for_a_w_s_parameters.go b/tkg/web/server/client/aws/import_t_k_g_config_for_a_w_s_parameters.go deleted file mode 100644 index aab5a7c4c9..0000000000 --- a/tkg/web/server/client/aws/import_t_k_g_config_for_a_w_s_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewImportTKGConfigForAWSParams creates a new ImportTKGConfigForAWSParams object -// with the default values initialized. -func NewImportTKGConfigForAWSParams() *ImportTKGConfigForAWSParams { - var () - return &ImportTKGConfigForAWSParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewImportTKGConfigForAWSParamsWithTimeout creates a new ImportTKGConfigForAWSParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewImportTKGConfigForAWSParamsWithTimeout(timeout time.Duration) *ImportTKGConfigForAWSParams { - var () - return &ImportTKGConfigForAWSParams{ - - timeout: timeout, - } -} - -// NewImportTKGConfigForAWSParamsWithContext creates a new ImportTKGConfigForAWSParams object -// with the default values initialized, and the ability to set a context for a request -func NewImportTKGConfigForAWSParamsWithContext(ctx context.Context) *ImportTKGConfigForAWSParams { - var () - return &ImportTKGConfigForAWSParams{ - - Context: ctx, - } -} - -// NewImportTKGConfigForAWSParamsWithHTTPClient creates a new ImportTKGConfigForAWSParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewImportTKGConfigForAWSParamsWithHTTPClient(client *http.Client) *ImportTKGConfigForAWSParams { - var () - return &ImportTKGConfigForAWSParams{ - HTTPClient: client, - } -} - -/* -ImportTKGConfigForAWSParams contains all the parameters to send to the API endpoint -for the import t k g config for a w s operation typically these are written to a http.Request -*/ -type ImportTKGConfigForAWSParams struct { - - /*Params - config file from which to generate tkg configuration for aws - - */ - Params *models.ConfigFile - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the import t k g config for a w s params -func (o *ImportTKGConfigForAWSParams) WithTimeout(timeout time.Duration) *ImportTKGConfigForAWSParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the import t k g config for a w s params -func (o *ImportTKGConfigForAWSParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the import t k g config for a w s params -func (o *ImportTKGConfigForAWSParams) WithContext(ctx context.Context) *ImportTKGConfigForAWSParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the import t k g config for a w s params -func (o *ImportTKGConfigForAWSParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the import t k g config for a w s params -func (o *ImportTKGConfigForAWSParams) WithHTTPClient(client *http.Client) *ImportTKGConfigForAWSParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the import t k g config for a w s params -func (o *ImportTKGConfigForAWSParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the import t k g config for a w s params -func (o *ImportTKGConfigForAWSParams) WithParams(params *models.ConfigFile) *ImportTKGConfigForAWSParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the import t k g config for a w s params -func (o *ImportTKGConfigForAWSParams) SetParams(params *models.ConfigFile) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ImportTKGConfigForAWSParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/import_t_k_g_config_for_a_w_s_responses.go b/tkg/web/server/client/aws/import_t_k_g_config_for_a_w_s_responses.go deleted file mode 100644 index 421125ac1d..0000000000 --- a/tkg/web/server/client/aws/import_t_k_g_config_for_a_w_s_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ImportTKGConfigForAWSReader is a Reader for the ImportTKGConfigForAWS structure. -type ImportTKGConfigForAWSReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ImportTKGConfigForAWSReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewImportTKGConfigForAWSOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewImportTKGConfigForAWSBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewImportTKGConfigForAWSUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewImportTKGConfigForAWSInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewImportTKGConfigForAWSOK creates a ImportTKGConfigForAWSOK with default headers values -func NewImportTKGConfigForAWSOK() *ImportTKGConfigForAWSOK { - return &ImportTKGConfigForAWSOK{} -} - -/* -ImportTKGConfigForAWSOK handles this case with default header values. - -Generated TKG configuration successfully -*/ -type ImportTKGConfigForAWSOK struct { - Payload *models.AWSRegionalClusterParams -} - -func (o *ImportTKGConfigForAWSOK) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/config/import][%d] importTKGConfigForAWSOK %+v", 200, o.Payload) -} - -func (o *ImportTKGConfigForAWSOK) GetPayload() *models.AWSRegionalClusterParams { - return o.Payload -} - -func (o *ImportTKGConfigForAWSOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.AWSRegionalClusterParams) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForAWSBadRequest creates a ImportTKGConfigForAWSBadRequest with default headers values -func NewImportTKGConfigForAWSBadRequest() *ImportTKGConfigForAWSBadRequest { - return &ImportTKGConfigForAWSBadRequest{} -} - -/* -ImportTKGConfigForAWSBadRequest handles this case with default header values. - -Bad request -*/ -type ImportTKGConfigForAWSBadRequest struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForAWSBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/config/import][%d] importTKGConfigForAWSBadRequest %+v", 400, o.Payload) -} - -func (o *ImportTKGConfigForAWSBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForAWSBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForAWSUnauthorized creates a ImportTKGConfigForAWSUnauthorized with default headers values -func NewImportTKGConfigForAWSUnauthorized() *ImportTKGConfigForAWSUnauthorized { - return &ImportTKGConfigForAWSUnauthorized{} -} - -/* -ImportTKGConfigForAWSUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type ImportTKGConfigForAWSUnauthorized struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForAWSUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/config/import][%d] importTKGConfigForAWSUnauthorized %+v", 401, o.Payload) -} - -func (o *ImportTKGConfigForAWSUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForAWSUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForAWSInternalServerError creates a ImportTKGConfigForAWSInternalServerError with default headers values -func NewImportTKGConfigForAWSInternalServerError() *ImportTKGConfigForAWSInternalServerError { - return &ImportTKGConfigForAWSInternalServerError{} -} - -/* -ImportTKGConfigForAWSInternalServerError handles this case with default header values. - -Internal server error -*/ -type ImportTKGConfigForAWSInternalServerError struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForAWSInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/aws/config/import][%d] importTKGConfigForAWSInternalServerError %+v", 500, o.Payload) -} - -func (o *ImportTKGConfigForAWSInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForAWSInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/aws/set_a_w_s_endpoint_parameters.go b/tkg/web/server/client/aws/set_a_w_s_endpoint_parameters.go deleted file mode 100644 index f5a1b0d9a5..0000000000 --- a/tkg/web/server/client/aws/set_a_w_s_endpoint_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewSetAWSEndpointParams creates a new SetAWSEndpointParams object -// with the default values initialized. -func NewSetAWSEndpointParams() *SetAWSEndpointParams { - var () - return &SetAWSEndpointParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewSetAWSEndpointParamsWithTimeout creates a new SetAWSEndpointParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewSetAWSEndpointParamsWithTimeout(timeout time.Duration) *SetAWSEndpointParams { - var () - return &SetAWSEndpointParams{ - - timeout: timeout, - } -} - -// NewSetAWSEndpointParamsWithContext creates a new SetAWSEndpointParams object -// with the default values initialized, and the ability to set a context for a request -func NewSetAWSEndpointParamsWithContext(ctx context.Context) *SetAWSEndpointParams { - var () - return &SetAWSEndpointParams{ - - Context: ctx, - } -} - -// NewSetAWSEndpointParamsWithHTTPClient creates a new SetAWSEndpointParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewSetAWSEndpointParamsWithHTTPClient(client *http.Client) *SetAWSEndpointParams { - var () - return &SetAWSEndpointParams{ - HTTPClient: client, - } -} - -/* -SetAWSEndpointParams contains all the parameters to send to the API endpoint -for the set a w s endpoint operation typically these are written to a http.Request -*/ -type SetAWSEndpointParams struct { - - /*AccountParams - AWS account parameters - - */ - AccountParams *models.AWSAccountParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the set a w s endpoint params -func (o *SetAWSEndpointParams) WithTimeout(timeout time.Duration) *SetAWSEndpointParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the set a w s endpoint params -func (o *SetAWSEndpointParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the set a w s endpoint params -func (o *SetAWSEndpointParams) WithContext(ctx context.Context) *SetAWSEndpointParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the set a w s endpoint params -func (o *SetAWSEndpointParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the set a w s endpoint params -func (o *SetAWSEndpointParams) WithHTTPClient(client *http.Client) *SetAWSEndpointParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the set a w s endpoint params -func (o *SetAWSEndpointParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithAccountParams adds the accountParams to the set a w s endpoint params -func (o *SetAWSEndpointParams) WithAccountParams(accountParams *models.AWSAccountParams) *SetAWSEndpointParams { - o.SetAccountParams(accountParams) - return o -} - -// SetAccountParams adds the accountParams to the set a w s endpoint params -func (o *SetAWSEndpointParams) SetAccountParams(accountParams *models.AWSAccountParams) { - o.AccountParams = accountParams -} - -// WriteToRequest writes these params to a swagger request -func (o *SetAWSEndpointParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.AccountParams != nil { - if err := r.SetBodyParam(o.AccountParams); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/aws/set_a_w_s_endpoint_responses.go b/tkg/web/server/client/aws/set_a_w_s_endpoint_responses.go deleted file mode 100644 index 4b6937cd79..0000000000 --- a/tkg/web/server/client/aws/set_a_w_s_endpoint_responses.go +++ /dev/null @@ -1,179 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// SetAWSEndpointReader is a Reader for the SetAWSEndpoint structure. -type SetAWSEndpointReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *SetAWSEndpointReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 201: - result := NewSetAWSEndpointCreated() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewSetAWSEndpointBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewSetAWSEndpointUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewSetAWSEndpointInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewSetAWSEndpointCreated creates a SetAWSEndpointCreated with default headers values -func NewSetAWSEndpointCreated() *SetAWSEndpointCreated { - return &SetAWSEndpointCreated{} -} - -/* -SetAWSEndpointCreated handles this case with default header values. - -Connection successful -*/ -type SetAWSEndpointCreated struct { -} - -func (o *SetAWSEndpointCreated) Error() string { - return fmt.Sprintf("[POST /api/providers/aws][%d] setAWSEndpointCreated ", 201) -} - -func (o *SetAWSEndpointCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - return nil -} - -// NewSetAWSEndpointBadRequest creates a SetAWSEndpointBadRequest with default headers values -func NewSetAWSEndpointBadRequest() *SetAWSEndpointBadRequest { - return &SetAWSEndpointBadRequest{} -} - -/* -SetAWSEndpointBadRequest handles this case with default header values. - -Bad request -*/ -type SetAWSEndpointBadRequest struct { - Payload *models.Error -} - -func (o *SetAWSEndpointBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/aws][%d] setAWSEndpointBadRequest %+v", 400, o.Payload) -} - -func (o *SetAWSEndpointBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *SetAWSEndpointBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewSetAWSEndpointUnauthorized creates a SetAWSEndpointUnauthorized with default headers values -func NewSetAWSEndpointUnauthorized() *SetAWSEndpointUnauthorized { - return &SetAWSEndpointUnauthorized{} -} - -/* -SetAWSEndpointUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type SetAWSEndpointUnauthorized struct { - Payload *models.Error -} - -func (o *SetAWSEndpointUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/aws][%d] setAWSEndpointUnauthorized %+v", 401, o.Payload) -} - -func (o *SetAWSEndpointUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *SetAWSEndpointUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewSetAWSEndpointInternalServerError creates a SetAWSEndpointInternalServerError with default headers values -func NewSetAWSEndpointInternalServerError() *SetAWSEndpointInternalServerError { - return &SetAWSEndpointInternalServerError{} -} - -/* -SetAWSEndpointInternalServerError handles this case with default header values. - -Internal server error -*/ -type SetAWSEndpointInternalServerError struct { - Payload *models.Error -} - -func (o *SetAWSEndpointInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/aws][%d] setAWSEndpointInternalServerError %+v", 500, o.Payload) -} - -func (o *SetAWSEndpointInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *SetAWSEndpointInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/apply_t_k_g_config_for_azure_parameters.go b/tkg/web/server/client/azure/apply_t_k_g_config_for_azure_parameters.go deleted file mode 100644 index 8c7719ab44..0000000000 --- a/tkg/web/server/client/azure/apply_t_k_g_config_for_azure_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewApplyTKGConfigForAzureParams creates a new ApplyTKGConfigForAzureParams object -// with the default values initialized. -func NewApplyTKGConfigForAzureParams() *ApplyTKGConfigForAzureParams { - var () - return &ApplyTKGConfigForAzureParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewApplyTKGConfigForAzureParamsWithTimeout creates a new ApplyTKGConfigForAzureParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewApplyTKGConfigForAzureParamsWithTimeout(timeout time.Duration) *ApplyTKGConfigForAzureParams { - var () - return &ApplyTKGConfigForAzureParams{ - - timeout: timeout, - } -} - -// NewApplyTKGConfigForAzureParamsWithContext creates a new ApplyTKGConfigForAzureParams object -// with the default values initialized, and the ability to set a context for a request -func NewApplyTKGConfigForAzureParamsWithContext(ctx context.Context) *ApplyTKGConfigForAzureParams { - var () - return &ApplyTKGConfigForAzureParams{ - - Context: ctx, - } -} - -// NewApplyTKGConfigForAzureParamsWithHTTPClient creates a new ApplyTKGConfigForAzureParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewApplyTKGConfigForAzureParamsWithHTTPClient(client *http.Client) *ApplyTKGConfigForAzureParams { - var () - return &ApplyTKGConfigForAzureParams{ - HTTPClient: client, - } -} - -/* -ApplyTKGConfigForAzureParams contains all the parameters to send to the API endpoint -for the apply t k g config for azure operation typically these are written to a http.Request -*/ -type ApplyTKGConfigForAzureParams struct { - - /*Params - parameters to apply changes to TKG configuration file for Azure - - */ - Params *models.AzureRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the apply t k g config for azure params -func (o *ApplyTKGConfigForAzureParams) WithTimeout(timeout time.Duration) *ApplyTKGConfigForAzureParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the apply t k g config for azure params -func (o *ApplyTKGConfigForAzureParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the apply t k g config for azure params -func (o *ApplyTKGConfigForAzureParams) WithContext(ctx context.Context) *ApplyTKGConfigForAzureParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the apply t k g config for azure params -func (o *ApplyTKGConfigForAzureParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the apply t k g config for azure params -func (o *ApplyTKGConfigForAzureParams) WithHTTPClient(client *http.Client) *ApplyTKGConfigForAzureParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the apply t k g config for azure params -func (o *ApplyTKGConfigForAzureParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the apply t k g config for azure params -func (o *ApplyTKGConfigForAzureParams) WithParams(params *models.AzureRegionalClusterParams) *ApplyTKGConfigForAzureParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the apply t k g config for azure params -func (o *ApplyTKGConfigForAzureParams) SetParams(params *models.AzureRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ApplyTKGConfigForAzureParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/apply_t_k_g_config_for_azure_responses.go b/tkg/web/server/client/azure/apply_t_k_g_config_for_azure_responses.go deleted file mode 100644 index 25c6cf5fb4..0000000000 --- a/tkg/web/server/client/azure/apply_t_k_g_config_for_azure_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ApplyTKGConfigForAzureReader is a Reader for the ApplyTKGConfigForAzure structure. -type ApplyTKGConfigForAzureReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ApplyTKGConfigForAzureReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewApplyTKGConfigForAzureOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewApplyTKGConfigForAzureBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewApplyTKGConfigForAzureUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewApplyTKGConfigForAzureInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewApplyTKGConfigForAzureOK creates a ApplyTKGConfigForAzureOK with default headers values -func NewApplyTKGConfigForAzureOK() *ApplyTKGConfigForAzureOK { - return &ApplyTKGConfigForAzureOK{} -} - -/* -ApplyTKGConfigForAzureOK handles this case with default header values. - -Apply change to TKG configuration successfully -*/ -type ApplyTKGConfigForAzureOK struct { - Payload *models.ConfigFileInfo -} - -func (o *ApplyTKGConfigForAzureOK) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/tkgconfig][%d] applyTKGConfigForAzureOK %+v", 200, o.Payload) -} - -func (o *ApplyTKGConfigForAzureOK) GetPayload() *models.ConfigFileInfo { - return o.Payload -} - -func (o *ApplyTKGConfigForAzureOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.ConfigFileInfo) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewApplyTKGConfigForAzureBadRequest creates a ApplyTKGConfigForAzureBadRequest with default headers values -func NewApplyTKGConfigForAzureBadRequest() *ApplyTKGConfigForAzureBadRequest { - return &ApplyTKGConfigForAzureBadRequest{} -} - -/* -ApplyTKGConfigForAzureBadRequest handles this case with default header values. - -Bad request -*/ -type ApplyTKGConfigForAzureBadRequest struct { - Payload *models.Error -} - -func (o *ApplyTKGConfigForAzureBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/tkgconfig][%d] applyTKGConfigForAzureBadRequest %+v", 400, o.Payload) -} - -func (o *ApplyTKGConfigForAzureBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ApplyTKGConfigForAzureBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewApplyTKGConfigForAzureUnauthorized creates a ApplyTKGConfigForAzureUnauthorized with default headers values -func NewApplyTKGConfigForAzureUnauthorized() *ApplyTKGConfigForAzureUnauthorized { - return &ApplyTKGConfigForAzureUnauthorized{} -} - -/* -ApplyTKGConfigForAzureUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type ApplyTKGConfigForAzureUnauthorized struct { - Payload *models.Error -} - -func (o *ApplyTKGConfigForAzureUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/tkgconfig][%d] applyTKGConfigForAzureUnauthorized %+v", 401, o.Payload) -} - -func (o *ApplyTKGConfigForAzureUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *ApplyTKGConfigForAzureUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewApplyTKGConfigForAzureInternalServerError creates a ApplyTKGConfigForAzureInternalServerError with default headers values -func NewApplyTKGConfigForAzureInternalServerError() *ApplyTKGConfigForAzureInternalServerError { - return &ApplyTKGConfigForAzureInternalServerError{} -} - -/* -ApplyTKGConfigForAzureInternalServerError handles this case with default header values. - -Internal server error -*/ -type ApplyTKGConfigForAzureInternalServerError struct { - Payload *models.Error -} - -func (o *ApplyTKGConfigForAzureInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/tkgconfig][%d] applyTKGConfigForAzureInternalServerError %+v", 500, o.Payload) -} - -func (o *ApplyTKGConfigForAzureInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ApplyTKGConfigForAzureInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/azure_client.go b/tkg/web/server/client/azure/azure_client.go deleted file mode 100644 index bcb02cc1d2..0000000000 --- a/tkg/web/server/client/azure/azure_client.go +++ /dev/null @@ -1,474 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new azure API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for azure API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -ApplyTKGConfigForAzure applies the changes to t k g configuration file for azure -*/ -func (a *Client) ApplyTKGConfigForAzure(params *ApplyTKGConfigForAzureParams) (*ApplyTKGConfigForAzureOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewApplyTKGConfigForAzureParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "applyTKGConfigForAzure", - Method: "POST", - PathPattern: "/api/providers/azure/tkgconfig", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ApplyTKGConfigForAzureReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ApplyTKGConfigForAzureOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for applyTKGConfigForAzure: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -CreateAzureRegionalCluster creates azure regional cluster -*/ -func (a *Client) CreateAzureRegionalCluster(params *CreateAzureRegionalClusterParams) (*CreateAzureRegionalClusterOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewCreateAzureRegionalClusterParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "createAzureRegionalCluster", - Method: "POST", - PathPattern: "/api/providers/azure/create", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &CreateAzureRegionalClusterReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*CreateAzureRegionalClusterOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for createAzureRegionalCluster: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -CreateAzureResourceGroup creates a new azure resource group -*/ -func (a *Client) CreateAzureResourceGroup(params *CreateAzureResourceGroupParams) (*CreateAzureResourceGroupCreated, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewCreateAzureResourceGroupParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "createAzureResourceGroup", - Method: "POST", - PathPattern: "/api/providers/azure/resourcegroups", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &CreateAzureResourceGroupReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*CreateAzureResourceGroupCreated) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for createAzureResourceGroup: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -CreateAzureVirtualNetwork creates a new azure virtual network -*/ -func (a *Client) CreateAzureVirtualNetwork(params *CreateAzureVirtualNetworkParams) (*CreateAzureVirtualNetworkCreated, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewCreateAzureVirtualNetworkParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "createAzureVirtualNetwork", - Method: "POST", - PathPattern: "/api/providers/azure/resourcegroups/{resourceGroupName}/vnets", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &CreateAzureVirtualNetworkReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*CreateAzureVirtualNetworkCreated) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for createAzureVirtualNetwork: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -ExportTKGConfigForAzure generates t k g configuration file for azure -*/ -func (a *Client) ExportTKGConfigForAzure(params *ExportTKGConfigForAzureParams) (*ExportTKGConfigForAzureOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewExportTKGConfigForAzureParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "exportTKGConfigForAzure", - Method: "POST", - PathPattern: "/api/providers/azure/config/export", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ExportTKGConfigForAzureReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ExportTKGConfigForAzureOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for exportTKGConfigForAzure: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAzureEndpoint retrieves azure account params from environment variables -*/ -func (a *Client) GetAzureEndpoint(params *GetAzureEndpointParams) (*GetAzureEndpointOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAzureEndpointParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAzureEndpoint", - Method: "GET", - PathPattern: "/api/providers/azure", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAzureEndpointReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAzureEndpointOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAzureEndpoint: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAzureInstanceTypes retrieves list of supported azure instance types for a region -*/ -func (a *Client) GetAzureInstanceTypes(params *GetAzureInstanceTypesParams) (*GetAzureInstanceTypesOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAzureInstanceTypesParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAzureInstanceTypes", - Method: "GET", - PathPattern: "/api/providers/azure/regions/{location}/instanceTypes", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAzureInstanceTypesReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAzureInstanceTypesOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAzureInstanceTypes: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAzureOSImages retrieves azure supported os images -*/ -func (a *Client) GetAzureOSImages(params *GetAzureOSImagesParams) (*GetAzureOSImagesOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAzureOSImagesParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAzureOSImages", - Method: "GET", - PathPattern: "/api/providers/azure/osimages", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAzureOSImagesReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAzureOSImagesOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAzureOSImages: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAzureRegions retrieves list of supported azure regions -*/ -func (a *Client) GetAzureRegions(params *GetAzureRegionsParams) (*GetAzureRegionsOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAzureRegionsParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAzureRegions", - Method: "GET", - PathPattern: "/api/providers/azure/regions", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAzureRegionsReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAzureRegionsOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAzureRegions: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAzureResourceGroups retrieves list of azure resource groups for a subscription -*/ -func (a *Client) GetAzureResourceGroups(params *GetAzureResourceGroupsParams) (*GetAzureResourceGroupsOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAzureResourceGroupsParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAzureResourceGroups", - Method: "GET", - PathPattern: "/api/providers/azure/resourcegroups", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAzureResourceGroupsReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAzureResourceGroupsOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAzureResourceGroups: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetAzureVnets retrieves list of azure virtual networks in a resource group -*/ -func (a *Client) GetAzureVnets(params *GetAzureVnetsParams) (*GetAzureVnetsOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetAzureVnetsParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getAzureVnets", - Method: "GET", - PathPattern: "/api/providers/azure/resourcegroups/{resourceGroupName}/vnets", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetAzureVnetsReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetAzureVnetsOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getAzureVnets: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -ImportTKGConfigForAzure generates t k g configuration object for azure -*/ -func (a *Client) ImportTKGConfigForAzure(params *ImportTKGConfigForAzureParams) (*ImportTKGConfigForAzureOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewImportTKGConfigForAzureParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "importTKGConfigForAzure", - Method: "POST", - PathPattern: "/api/providers/azure/config/import", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ImportTKGConfigForAzureReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ImportTKGConfigForAzureOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for importTKGConfigForAzure: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -SetAzureEndpoint validates and set azure credentials -*/ -func (a *Client) SetAzureEndpoint(params *SetAzureEndpointParams) (*SetAzureEndpointCreated, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewSetAzureEndpointParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "setAzureEndpoint", - Method: "POST", - PathPattern: "/api/providers/azure", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &SetAzureEndpointReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*SetAzureEndpointCreated) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for setAzureEndpoint: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/tkg/web/server/client/azure/create_azure_regional_cluster_parameters.go b/tkg/web/server/client/azure/create_azure_regional_cluster_parameters.go deleted file mode 100644 index d646338ed1..0000000000 --- a/tkg/web/server/client/azure/create_azure_regional_cluster_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateAzureRegionalClusterParams creates a new CreateAzureRegionalClusterParams object -// with the default values initialized. -func NewCreateAzureRegionalClusterParams() *CreateAzureRegionalClusterParams { - var () - return &CreateAzureRegionalClusterParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewCreateAzureRegionalClusterParamsWithTimeout creates a new CreateAzureRegionalClusterParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewCreateAzureRegionalClusterParamsWithTimeout(timeout time.Duration) *CreateAzureRegionalClusterParams { - var () - return &CreateAzureRegionalClusterParams{ - - timeout: timeout, - } -} - -// NewCreateAzureRegionalClusterParamsWithContext creates a new CreateAzureRegionalClusterParams object -// with the default values initialized, and the ability to set a context for a request -func NewCreateAzureRegionalClusterParamsWithContext(ctx context.Context) *CreateAzureRegionalClusterParams { - var () - return &CreateAzureRegionalClusterParams{ - - Context: ctx, - } -} - -// NewCreateAzureRegionalClusterParamsWithHTTPClient creates a new CreateAzureRegionalClusterParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewCreateAzureRegionalClusterParamsWithHTTPClient(client *http.Client) *CreateAzureRegionalClusterParams { - var () - return &CreateAzureRegionalClusterParams{ - HTTPClient: client, - } -} - -/* -CreateAzureRegionalClusterParams contains all the parameters to send to the API endpoint -for the create azure regional cluster operation typically these are written to a http.Request -*/ -type CreateAzureRegionalClusterParams struct { - - /*Params - parameters to create a regional cluster - - */ - Params *models.AzureRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the create azure regional cluster params -func (o *CreateAzureRegionalClusterParams) WithTimeout(timeout time.Duration) *CreateAzureRegionalClusterParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the create azure regional cluster params -func (o *CreateAzureRegionalClusterParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the create azure regional cluster params -func (o *CreateAzureRegionalClusterParams) WithContext(ctx context.Context) *CreateAzureRegionalClusterParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the create azure regional cluster params -func (o *CreateAzureRegionalClusterParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the create azure regional cluster params -func (o *CreateAzureRegionalClusterParams) WithHTTPClient(client *http.Client) *CreateAzureRegionalClusterParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the create azure regional cluster params -func (o *CreateAzureRegionalClusterParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the create azure regional cluster params -func (o *CreateAzureRegionalClusterParams) WithParams(params *models.AzureRegionalClusterParams) *CreateAzureRegionalClusterParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the create azure regional cluster params -func (o *CreateAzureRegionalClusterParams) SetParams(params *models.AzureRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *CreateAzureRegionalClusterParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/create_azure_regional_cluster_responses.go b/tkg/web/server/client/azure/create_azure_regional_cluster_responses.go deleted file mode 100644 index 9bf2fbe3bd..0000000000 --- a/tkg/web/server/client/azure/create_azure_regional_cluster_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateAzureRegionalClusterReader is a Reader for the CreateAzureRegionalCluster structure. -type CreateAzureRegionalClusterReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *CreateAzureRegionalClusterReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewCreateAzureRegionalClusterOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewCreateAzureRegionalClusterBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewCreateAzureRegionalClusterUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewCreateAzureRegionalClusterInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewCreateAzureRegionalClusterOK creates a CreateAzureRegionalClusterOK with default headers values -func NewCreateAzureRegionalClusterOK() *CreateAzureRegionalClusterOK { - return &CreateAzureRegionalClusterOK{} -} - -/* -CreateAzureRegionalClusterOK handles this case with default header values. - -Creating regional cluster started successfully -*/ -type CreateAzureRegionalClusterOK struct { - Payload string -} - -func (o *CreateAzureRegionalClusterOK) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/create][%d] createAzureRegionalClusterOK %+v", 200, o.Payload) -} - -func (o *CreateAzureRegionalClusterOK) GetPayload() string { - return o.Payload -} - -func (o *CreateAzureRegionalClusterOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAzureRegionalClusterBadRequest creates a CreateAzureRegionalClusterBadRequest with default headers values -func NewCreateAzureRegionalClusterBadRequest() *CreateAzureRegionalClusterBadRequest { - return &CreateAzureRegionalClusterBadRequest{} -} - -/* -CreateAzureRegionalClusterBadRequest handles this case with default header values. - -Bad request -*/ -type CreateAzureRegionalClusterBadRequest struct { - Payload *models.Error -} - -func (o *CreateAzureRegionalClusterBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/create][%d] createAzureRegionalClusterBadRequest %+v", 400, o.Payload) -} - -func (o *CreateAzureRegionalClusterBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAzureRegionalClusterBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAzureRegionalClusterUnauthorized creates a CreateAzureRegionalClusterUnauthorized with default headers values -func NewCreateAzureRegionalClusterUnauthorized() *CreateAzureRegionalClusterUnauthorized { - return &CreateAzureRegionalClusterUnauthorized{} -} - -/* -CreateAzureRegionalClusterUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type CreateAzureRegionalClusterUnauthorized struct { - Payload *models.Error -} - -func (o *CreateAzureRegionalClusterUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/create][%d] createAzureRegionalClusterUnauthorized %+v", 401, o.Payload) -} - -func (o *CreateAzureRegionalClusterUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAzureRegionalClusterUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAzureRegionalClusterInternalServerError creates a CreateAzureRegionalClusterInternalServerError with default headers values -func NewCreateAzureRegionalClusterInternalServerError() *CreateAzureRegionalClusterInternalServerError { - return &CreateAzureRegionalClusterInternalServerError{} -} - -/* -CreateAzureRegionalClusterInternalServerError handles this case with default header values. - -Internal server error -*/ -type CreateAzureRegionalClusterInternalServerError struct { - Payload *models.Error -} - -func (o *CreateAzureRegionalClusterInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/create][%d] createAzureRegionalClusterInternalServerError %+v", 500, o.Payload) -} - -func (o *CreateAzureRegionalClusterInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAzureRegionalClusterInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/create_azure_resource_group_parameters.go b/tkg/web/server/client/azure/create_azure_resource_group_parameters.go deleted file mode 100644 index 9e3dd831cc..0000000000 --- a/tkg/web/server/client/azure/create_azure_resource_group_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateAzureResourceGroupParams creates a new CreateAzureResourceGroupParams object -// with the default values initialized. -func NewCreateAzureResourceGroupParams() *CreateAzureResourceGroupParams { - var () - return &CreateAzureResourceGroupParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewCreateAzureResourceGroupParamsWithTimeout creates a new CreateAzureResourceGroupParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewCreateAzureResourceGroupParamsWithTimeout(timeout time.Duration) *CreateAzureResourceGroupParams { - var () - return &CreateAzureResourceGroupParams{ - - timeout: timeout, - } -} - -// NewCreateAzureResourceGroupParamsWithContext creates a new CreateAzureResourceGroupParams object -// with the default values initialized, and the ability to set a context for a request -func NewCreateAzureResourceGroupParamsWithContext(ctx context.Context) *CreateAzureResourceGroupParams { - var () - return &CreateAzureResourceGroupParams{ - - Context: ctx, - } -} - -// NewCreateAzureResourceGroupParamsWithHTTPClient creates a new CreateAzureResourceGroupParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewCreateAzureResourceGroupParamsWithHTTPClient(client *http.Client) *CreateAzureResourceGroupParams { - var () - return &CreateAzureResourceGroupParams{ - HTTPClient: client, - } -} - -/* -CreateAzureResourceGroupParams contains all the parameters to send to the API endpoint -for the create azure resource group operation typically these are written to a http.Request -*/ -type CreateAzureResourceGroupParams struct { - - /*Params - parameters to create a new Azure resource group - - */ - Params *models.AzureResourceGroup - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the create azure resource group params -func (o *CreateAzureResourceGroupParams) WithTimeout(timeout time.Duration) *CreateAzureResourceGroupParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the create azure resource group params -func (o *CreateAzureResourceGroupParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the create azure resource group params -func (o *CreateAzureResourceGroupParams) WithContext(ctx context.Context) *CreateAzureResourceGroupParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the create azure resource group params -func (o *CreateAzureResourceGroupParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the create azure resource group params -func (o *CreateAzureResourceGroupParams) WithHTTPClient(client *http.Client) *CreateAzureResourceGroupParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the create azure resource group params -func (o *CreateAzureResourceGroupParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the create azure resource group params -func (o *CreateAzureResourceGroupParams) WithParams(params *models.AzureResourceGroup) *CreateAzureResourceGroupParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the create azure resource group params -func (o *CreateAzureResourceGroupParams) SetParams(params *models.AzureResourceGroup) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *CreateAzureResourceGroupParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/create_azure_resource_group_responses.go b/tkg/web/server/client/azure/create_azure_resource_group_responses.go deleted file mode 100644 index bb6be59009..0000000000 --- a/tkg/web/server/client/azure/create_azure_resource_group_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateAzureResourceGroupReader is a Reader for the CreateAzureResourceGroup structure. -type CreateAzureResourceGroupReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *CreateAzureResourceGroupReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 201: - result := NewCreateAzureResourceGroupCreated() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewCreateAzureResourceGroupBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewCreateAzureResourceGroupUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewCreateAzureResourceGroupInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewCreateAzureResourceGroupCreated creates a CreateAzureResourceGroupCreated with default headers values -func NewCreateAzureResourceGroupCreated() *CreateAzureResourceGroupCreated { - return &CreateAzureResourceGroupCreated{} -} - -/* -CreateAzureResourceGroupCreated handles this case with default header values. - -Successfully created Azure resource group -*/ -type CreateAzureResourceGroupCreated struct { - Payload string -} - -func (o *CreateAzureResourceGroupCreated) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/resourcegroups][%d] createAzureResourceGroupCreated %+v", 201, o.Payload) -} - -func (o *CreateAzureResourceGroupCreated) GetPayload() string { - return o.Payload -} - -func (o *CreateAzureResourceGroupCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAzureResourceGroupBadRequest creates a CreateAzureResourceGroupBadRequest with default headers values -func NewCreateAzureResourceGroupBadRequest() *CreateAzureResourceGroupBadRequest { - return &CreateAzureResourceGroupBadRequest{} -} - -/* -CreateAzureResourceGroupBadRequest handles this case with default header values. - -Bad request -*/ -type CreateAzureResourceGroupBadRequest struct { - Payload *models.Error -} - -func (o *CreateAzureResourceGroupBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/resourcegroups][%d] createAzureResourceGroupBadRequest %+v", 400, o.Payload) -} - -func (o *CreateAzureResourceGroupBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAzureResourceGroupBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAzureResourceGroupUnauthorized creates a CreateAzureResourceGroupUnauthorized with default headers values -func NewCreateAzureResourceGroupUnauthorized() *CreateAzureResourceGroupUnauthorized { - return &CreateAzureResourceGroupUnauthorized{} -} - -/* -CreateAzureResourceGroupUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type CreateAzureResourceGroupUnauthorized struct { - Payload *models.Error -} - -func (o *CreateAzureResourceGroupUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/resourcegroups][%d] createAzureResourceGroupUnauthorized %+v", 401, o.Payload) -} - -func (o *CreateAzureResourceGroupUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAzureResourceGroupUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAzureResourceGroupInternalServerError creates a CreateAzureResourceGroupInternalServerError with default headers values -func NewCreateAzureResourceGroupInternalServerError() *CreateAzureResourceGroupInternalServerError { - return &CreateAzureResourceGroupInternalServerError{} -} - -/* -CreateAzureResourceGroupInternalServerError handles this case with default header values. - -Internal server error -*/ -type CreateAzureResourceGroupInternalServerError struct { - Payload *models.Error -} - -func (o *CreateAzureResourceGroupInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/resourcegroups][%d] createAzureResourceGroupInternalServerError %+v", 500, o.Payload) -} - -func (o *CreateAzureResourceGroupInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAzureResourceGroupInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/create_azure_virtual_network_parameters.go b/tkg/web/server/client/azure/create_azure_virtual_network_parameters.go deleted file mode 100644 index e9aea8726c..0000000000 --- a/tkg/web/server/client/azure/create_azure_virtual_network_parameters.go +++ /dev/null @@ -1,161 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateAzureVirtualNetworkParams creates a new CreateAzureVirtualNetworkParams object -// with the default values initialized. -func NewCreateAzureVirtualNetworkParams() *CreateAzureVirtualNetworkParams { - var () - return &CreateAzureVirtualNetworkParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewCreateAzureVirtualNetworkParamsWithTimeout creates a new CreateAzureVirtualNetworkParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewCreateAzureVirtualNetworkParamsWithTimeout(timeout time.Duration) *CreateAzureVirtualNetworkParams { - var () - return &CreateAzureVirtualNetworkParams{ - - timeout: timeout, - } -} - -// NewCreateAzureVirtualNetworkParamsWithContext creates a new CreateAzureVirtualNetworkParams object -// with the default values initialized, and the ability to set a context for a request -func NewCreateAzureVirtualNetworkParamsWithContext(ctx context.Context) *CreateAzureVirtualNetworkParams { - var () - return &CreateAzureVirtualNetworkParams{ - - Context: ctx, - } -} - -// NewCreateAzureVirtualNetworkParamsWithHTTPClient creates a new CreateAzureVirtualNetworkParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewCreateAzureVirtualNetworkParamsWithHTTPClient(client *http.Client) *CreateAzureVirtualNetworkParams { - var () - return &CreateAzureVirtualNetworkParams{ - HTTPClient: client, - } -} - -/* -CreateAzureVirtualNetworkParams contains all the parameters to send to the API endpoint -for the create azure virtual network operation typically these are written to a http.Request -*/ -type CreateAzureVirtualNetworkParams struct { - - /*Params - parameters to create a new Azure Virtual network - - */ - Params *models.AzureVirtualNetwork - /*ResourceGroupName - Name of the Azure resource group - - */ - ResourceGroupName string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the create azure virtual network params -func (o *CreateAzureVirtualNetworkParams) WithTimeout(timeout time.Duration) *CreateAzureVirtualNetworkParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the create azure virtual network params -func (o *CreateAzureVirtualNetworkParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the create azure virtual network params -func (o *CreateAzureVirtualNetworkParams) WithContext(ctx context.Context) *CreateAzureVirtualNetworkParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the create azure virtual network params -func (o *CreateAzureVirtualNetworkParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the create azure virtual network params -func (o *CreateAzureVirtualNetworkParams) WithHTTPClient(client *http.Client) *CreateAzureVirtualNetworkParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the create azure virtual network params -func (o *CreateAzureVirtualNetworkParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the create azure virtual network params -func (o *CreateAzureVirtualNetworkParams) WithParams(params *models.AzureVirtualNetwork) *CreateAzureVirtualNetworkParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the create azure virtual network params -func (o *CreateAzureVirtualNetworkParams) SetParams(params *models.AzureVirtualNetwork) { - o.Params = params -} - -// WithResourceGroupName adds the resourceGroupName to the create azure virtual network params -func (o *CreateAzureVirtualNetworkParams) WithResourceGroupName(resourceGroupName string) *CreateAzureVirtualNetworkParams { - o.SetResourceGroupName(resourceGroupName) - return o -} - -// SetResourceGroupName adds the resourceGroupName to the create azure virtual network params -func (o *CreateAzureVirtualNetworkParams) SetResourceGroupName(resourceGroupName string) { - o.ResourceGroupName = resourceGroupName -} - -// WriteToRequest writes these params to a swagger request -func (o *CreateAzureVirtualNetworkParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - // path param resourceGroupName - if err := r.SetPathParam("resourceGroupName", o.ResourceGroupName); err != nil { - return err - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/create_azure_virtual_network_responses.go b/tkg/web/server/client/azure/create_azure_virtual_network_responses.go deleted file mode 100644 index e092d4ce37..0000000000 --- a/tkg/web/server/client/azure/create_azure_virtual_network_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateAzureVirtualNetworkReader is a Reader for the CreateAzureVirtualNetwork structure. -type CreateAzureVirtualNetworkReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *CreateAzureVirtualNetworkReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 201: - result := NewCreateAzureVirtualNetworkCreated() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewCreateAzureVirtualNetworkBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewCreateAzureVirtualNetworkUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewCreateAzureVirtualNetworkInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewCreateAzureVirtualNetworkCreated creates a CreateAzureVirtualNetworkCreated with default headers values -func NewCreateAzureVirtualNetworkCreated() *CreateAzureVirtualNetworkCreated { - return &CreateAzureVirtualNetworkCreated{} -} - -/* -CreateAzureVirtualNetworkCreated handles this case with default header values. - -Successfully created Azure Virtual network -*/ -type CreateAzureVirtualNetworkCreated struct { - Payload string -} - -func (o *CreateAzureVirtualNetworkCreated) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/resourcegroups/{resourceGroupName}/vnets][%d] createAzureVirtualNetworkCreated %+v", 201, o.Payload) -} - -func (o *CreateAzureVirtualNetworkCreated) GetPayload() string { - return o.Payload -} - -func (o *CreateAzureVirtualNetworkCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAzureVirtualNetworkBadRequest creates a CreateAzureVirtualNetworkBadRequest with default headers values -func NewCreateAzureVirtualNetworkBadRequest() *CreateAzureVirtualNetworkBadRequest { - return &CreateAzureVirtualNetworkBadRequest{} -} - -/* -CreateAzureVirtualNetworkBadRequest handles this case with default header values. - -Bad request -*/ -type CreateAzureVirtualNetworkBadRequest struct { - Payload *models.Error -} - -func (o *CreateAzureVirtualNetworkBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/resourcegroups/{resourceGroupName}/vnets][%d] createAzureVirtualNetworkBadRequest %+v", 400, o.Payload) -} - -func (o *CreateAzureVirtualNetworkBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAzureVirtualNetworkBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAzureVirtualNetworkUnauthorized creates a CreateAzureVirtualNetworkUnauthorized with default headers values -func NewCreateAzureVirtualNetworkUnauthorized() *CreateAzureVirtualNetworkUnauthorized { - return &CreateAzureVirtualNetworkUnauthorized{} -} - -/* -CreateAzureVirtualNetworkUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type CreateAzureVirtualNetworkUnauthorized struct { - Payload *models.Error -} - -func (o *CreateAzureVirtualNetworkUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/resourcegroups/{resourceGroupName}/vnets][%d] createAzureVirtualNetworkUnauthorized %+v", 401, o.Payload) -} - -func (o *CreateAzureVirtualNetworkUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAzureVirtualNetworkUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateAzureVirtualNetworkInternalServerError creates a CreateAzureVirtualNetworkInternalServerError with default headers values -func NewCreateAzureVirtualNetworkInternalServerError() *CreateAzureVirtualNetworkInternalServerError { - return &CreateAzureVirtualNetworkInternalServerError{} -} - -/* -CreateAzureVirtualNetworkInternalServerError handles this case with default header values. - -Internal server error -*/ -type CreateAzureVirtualNetworkInternalServerError struct { - Payload *models.Error -} - -func (o *CreateAzureVirtualNetworkInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/resourcegroups/{resourceGroupName}/vnets][%d] createAzureVirtualNetworkInternalServerError %+v", 500, o.Payload) -} - -func (o *CreateAzureVirtualNetworkInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateAzureVirtualNetworkInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/export_t_k_g_config_for_azure_parameters.go b/tkg/web/server/client/azure/export_t_k_g_config_for_azure_parameters.go deleted file mode 100644 index f7c1c31075..0000000000 --- a/tkg/web/server/client/azure/export_t_k_g_config_for_azure_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewExportTKGConfigForAzureParams creates a new ExportTKGConfigForAzureParams object -// with the default values initialized. -func NewExportTKGConfigForAzureParams() *ExportTKGConfigForAzureParams { - var () - return &ExportTKGConfigForAzureParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewExportTKGConfigForAzureParamsWithTimeout creates a new ExportTKGConfigForAzureParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewExportTKGConfigForAzureParamsWithTimeout(timeout time.Duration) *ExportTKGConfigForAzureParams { - var () - return &ExportTKGConfigForAzureParams{ - - timeout: timeout, - } -} - -// NewExportTKGConfigForAzureParamsWithContext creates a new ExportTKGConfigForAzureParams object -// with the default values initialized, and the ability to set a context for a request -func NewExportTKGConfigForAzureParamsWithContext(ctx context.Context) *ExportTKGConfigForAzureParams { - var () - return &ExportTKGConfigForAzureParams{ - - Context: ctx, - } -} - -// NewExportTKGConfigForAzureParamsWithHTTPClient creates a new ExportTKGConfigForAzureParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewExportTKGConfigForAzureParamsWithHTTPClient(client *http.Client) *ExportTKGConfigForAzureParams { - var () - return &ExportTKGConfigForAzureParams{ - HTTPClient: client, - } -} - -/* -ExportTKGConfigForAzureParams contains all the parameters to send to the API endpoint -for the export t k g config for azure operation typically these are written to a http.Request -*/ -type ExportTKGConfigForAzureParams struct { - - /*Params - parameters to generate TKG configuration file for Azure - - */ - Params *models.AzureRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the export t k g config for azure params -func (o *ExportTKGConfigForAzureParams) WithTimeout(timeout time.Duration) *ExportTKGConfigForAzureParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the export t k g config for azure params -func (o *ExportTKGConfigForAzureParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the export t k g config for azure params -func (o *ExportTKGConfigForAzureParams) WithContext(ctx context.Context) *ExportTKGConfigForAzureParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the export t k g config for azure params -func (o *ExportTKGConfigForAzureParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the export t k g config for azure params -func (o *ExportTKGConfigForAzureParams) WithHTTPClient(client *http.Client) *ExportTKGConfigForAzureParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the export t k g config for azure params -func (o *ExportTKGConfigForAzureParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the export t k g config for azure params -func (o *ExportTKGConfigForAzureParams) WithParams(params *models.AzureRegionalClusterParams) *ExportTKGConfigForAzureParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the export t k g config for azure params -func (o *ExportTKGConfigForAzureParams) SetParams(params *models.AzureRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ExportTKGConfigForAzureParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/export_t_k_g_config_for_azure_responses.go b/tkg/web/server/client/azure/export_t_k_g_config_for_azure_responses.go deleted file mode 100644 index 4db01447fd..0000000000 --- a/tkg/web/server/client/azure/export_t_k_g_config_for_azure_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ExportTKGConfigForAzureReader is a Reader for the ExportTKGConfigForAzure structure. -type ExportTKGConfigForAzureReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ExportTKGConfigForAzureReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewExportTKGConfigForAzureOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewExportTKGConfigForAzureBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewExportTKGConfigForAzureUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewExportTKGConfigForAzureInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewExportTKGConfigForAzureOK creates a ExportTKGConfigForAzureOK with default headers values -func NewExportTKGConfigForAzureOK() *ExportTKGConfigForAzureOK { - return &ExportTKGConfigForAzureOK{} -} - -/* -ExportTKGConfigForAzureOK handles this case with default header values. - -Generated TKG configuration successfully -*/ -type ExportTKGConfigForAzureOK struct { - Payload string -} - -func (o *ExportTKGConfigForAzureOK) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/config/export][%d] exportTKGConfigForAzureOK %+v", 200, o.Payload) -} - -func (o *ExportTKGConfigForAzureOK) GetPayload() string { - return o.Payload -} - -func (o *ExportTKGConfigForAzureOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewExportTKGConfigForAzureBadRequest creates a ExportTKGConfigForAzureBadRequest with default headers values -func NewExportTKGConfigForAzureBadRequest() *ExportTKGConfigForAzureBadRequest { - return &ExportTKGConfigForAzureBadRequest{} -} - -/* -ExportTKGConfigForAzureBadRequest handles this case with default header values. - -Bad request -*/ -type ExportTKGConfigForAzureBadRequest struct { - Payload *models.Error -} - -func (o *ExportTKGConfigForAzureBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/config/export][%d] exportTKGConfigForAzureBadRequest %+v", 400, o.Payload) -} - -func (o *ExportTKGConfigForAzureBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ExportTKGConfigForAzureBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewExportTKGConfigForAzureUnauthorized creates a ExportTKGConfigForAzureUnauthorized with default headers values -func NewExportTKGConfigForAzureUnauthorized() *ExportTKGConfigForAzureUnauthorized { - return &ExportTKGConfigForAzureUnauthorized{} -} - -/* -ExportTKGConfigForAzureUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type ExportTKGConfigForAzureUnauthorized struct { - Payload *models.Error -} - -func (o *ExportTKGConfigForAzureUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/config/export][%d] exportTKGConfigForAzureUnauthorized %+v", 401, o.Payload) -} - -func (o *ExportTKGConfigForAzureUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *ExportTKGConfigForAzureUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewExportTKGConfigForAzureInternalServerError creates a ExportTKGConfigForAzureInternalServerError with default headers values -func NewExportTKGConfigForAzureInternalServerError() *ExportTKGConfigForAzureInternalServerError { - return &ExportTKGConfigForAzureInternalServerError{} -} - -/* -ExportTKGConfigForAzureInternalServerError handles this case with default header values. - -Internal server error -*/ -type ExportTKGConfigForAzureInternalServerError struct { - Payload *models.Error -} - -func (o *ExportTKGConfigForAzureInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/config/export][%d] exportTKGConfigForAzureInternalServerError %+v", 500, o.Payload) -} - -func (o *ExportTKGConfigForAzureInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ExportTKGConfigForAzureInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_endpoint_parameters.go b/tkg/web/server/client/azure/get_azure_endpoint_parameters.go deleted file mode 100644 index 4c313846dd..0000000000 --- a/tkg/web/server/client/azure/get_azure_endpoint_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAzureEndpointParams creates a new GetAzureEndpointParams object -// with the default values initialized. -func NewGetAzureEndpointParams() *GetAzureEndpointParams { - - return &GetAzureEndpointParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAzureEndpointParamsWithTimeout creates a new GetAzureEndpointParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAzureEndpointParamsWithTimeout(timeout time.Duration) *GetAzureEndpointParams { - - return &GetAzureEndpointParams{ - - timeout: timeout, - } -} - -// NewGetAzureEndpointParamsWithContext creates a new GetAzureEndpointParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAzureEndpointParamsWithContext(ctx context.Context) *GetAzureEndpointParams { - - return &GetAzureEndpointParams{ - - Context: ctx, - } -} - -// NewGetAzureEndpointParamsWithHTTPClient creates a new GetAzureEndpointParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAzureEndpointParamsWithHTTPClient(client *http.Client) *GetAzureEndpointParams { - - return &GetAzureEndpointParams{ - HTTPClient: client, - } -} - -/* -GetAzureEndpointParams contains all the parameters to send to the API endpoint -for the get azure endpoint operation typically these are written to a http.Request -*/ -type GetAzureEndpointParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get azure endpoint params -func (o *GetAzureEndpointParams) WithTimeout(timeout time.Duration) *GetAzureEndpointParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get azure endpoint params -func (o *GetAzureEndpointParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get azure endpoint params -func (o *GetAzureEndpointParams) WithContext(ctx context.Context) *GetAzureEndpointParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get azure endpoint params -func (o *GetAzureEndpointParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get azure endpoint params -func (o *GetAzureEndpointParams) WithHTTPClient(client *http.Client) *GetAzureEndpointParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get azure endpoint params -func (o *GetAzureEndpointParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAzureEndpointParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_endpoint_responses.go b/tkg/web/server/client/azure/get_azure_endpoint_responses.go deleted file mode 100644 index ea44f1a42b..0000000000 --- a/tkg/web/server/client/azure/get_azure_endpoint_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureEndpointReader is a Reader for the GetAzureEndpoint structure. -type GetAzureEndpointReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAzureEndpointReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAzureEndpointOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAzureEndpointBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAzureEndpointUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAzureEndpointInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAzureEndpointOK creates a GetAzureEndpointOK with default headers values -func NewGetAzureEndpointOK() *GetAzureEndpointOK { - return &GetAzureEndpointOK{} -} - -/* -GetAzureEndpointOK handles this case with default header values. - -Successful retrieval of Azure account parameters -*/ -type GetAzureEndpointOK struct { - Payload *models.AzureAccountParams -} - -func (o *GetAzureEndpointOK) Error() string { - return fmt.Sprintf("[GET /api/providers/azure][%d] getAzureEndpointOK %+v", 200, o.Payload) -} - -func (o *GetAzureEndpointOK) GetPayload() *models.AzureAccountParams { - return o.Payload -} - -func (o *GetAzureEndpointOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.AzureAccountParams) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureEndpointBadRequest creates a GetAzureEndpointBadRequest with default headers values -func NewGetAzureEndpointBadRequest() *GetAzureEndpointBadRequest { - return &GetAzureEndpointBadRequest{} -} - -/* -GetAzureEndpointBadRequest handles this case with default header values. - -Bad Request -*/ -type GetAzureEndpointBadRequest struct { - Payload *models.Error -} - -func (o *GetAzureEndpointBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/azure][%d] getAzureEndpointBadRequest %+v", 400, o.Payload) -} - -func (o *GetAzureEndpointBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureEndpointBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureEndpointUnauthorized creates a GetAzureEndpointUnauthorized with default headers values -func NewGetAzureEndpointUnauthorized() *GetAzureEndpointUnauthorized { - return &GetAzureEndpointUnauthorized{} -} - -/* -GetAzureEndpointUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAzureEndpointUnauthorized struct { - Payload *models.Error -} - -func (o *GetAzureEndpointUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/azure][%d] getAzureEndpointUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAzureEndpointUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureEndpointUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureEndpointInternalServerError creates a GetAzureEndpointInternalServerError with default headers values -func NewGetAzureEndpointInternalServerError() *GetAzureEndpointInternalServerError { - return &GetAzureEndpointInternalServerError{} -} - -/* -GetAzureEndpointInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAzureEndpointInternalServerError struct { - Payload *models.Error -} - -func (o *GetAzureEndpointInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/azure][%d] getAzureEndpointInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAzureEndpointInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureEndpointInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_instance_types_parameters.go b/tkg/web/server/client/azure/get_azure_instance_types_parameters.go deleted file mode 100644 index d1e563f654..0000000000 --- a/tkg/web/server/client/azure/get_azure_instance_types_parameters.go +++ /dev/null @@ -1,137 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAzureInstanceTypesParams creates a new GetAzureInstanceTypesParams object -// with the default values initialized. -func NewGetAzureInstanceTypesParams() *GetAzureInstanceTypesParams { - var () - return &GetAzureInstanceTypesParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAzureInstanceTypesParamsWithTimeout creates a new GetAzureInstanceTypesParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAzureInstanceTypesParamsWithTimeout(timeout time.Duration) *GetAzureInstanceTypesParams { - var () - return &GetAzureInstanceTypesParams{ - - timeout: timeout, - } -} - -// NewGetAzureInstanceTypesParamsWithContext creates a new GetAzureInstanceTypesParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAzureInstanceTypesParamsWithContext(ctx context.Context) *GetAzureInstanceTypesParams { - var () - return &GetAzureInstanceTypesParams{ - - Context: ctx, - } -} - -// NewGetAzureInstanceTypesParamsWithHTTPClient creates a new GetAzureInstanceTypesParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAzureInstanceTypesParamsWithHTTPClient(client *http.Client) *GetAzureInstanceTypesParams { - var () - return &GetAzureInstanceTypesParams{ - HTTPClient: client, - } -} - -/* -GetAzureInstanceTypesParams contains all the parameters to send to the API endpoint -for the get azure instance types operation typically these are written to a http.Request -*/ -type GetAzureInstanceTypesParams struct { - - /*Location - Azure region name - - */ - Location string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get azure instance types params -func (o *GetAzureInstanceTypesParams) WithTimeout(timeout time.Duration) *GetAzureInstanceTypesParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get azure instance types params -func (o *GetAzureInstanceTypesParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get azure instance types params -func (o *GetAzureInstanceTypesParams) WithContext(ctx context.Context) *GetAzureInstanceTypesParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get azure instance types params -func (o *GetAzureInstanceTypesParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get azure instance types params -func (o *GetAzureInstanceTypesParams) WithHTTPClient(client *http.Client) *GetAzureInstanceTypesParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get azure instance types params -func (o *GetAzureInstanceTypesParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithLocation adds the location to the get azure instance types params -func (o *GetAzureInstanceTypesParams) WithLocation(location string) *GetAzureInstanceTypesParams { - o.SetLocation(location) - return o -} - -// SetLocation adds the location to the get azure instance types params -func (o *GetAzureInstanceTypesParams) SetLocation(location string) { - o.Location = location -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAzureInstanceTypesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // path param location - if err := r.SetPathParam("location", o.Location); err != nil { - return err - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_instance_types_responses.go b/tkg/web/server/client/azure/get_azure_instance_types_responses.go deleted file mode 100644 index e07a4d5959..0000000000 --- a/tkg/web/server/client/azure/get_azure_instance_types_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureInstanceTypesReader is a Reader for the GetAzureInstanceTypes structure. -type GetAzureInstanceTypesReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAzureInstanceTypesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAzureInstanceTypesOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAzureInstanceTypesBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAzureInstanceTypesUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAzureInstanceTypesInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAzureInstanceTypesOK creates a GetAzureInstanceTypesOK with default headers values -func NewGetAzureInstanceTypesOK() *GetAzureInstanceTypesOK { - return &GetAzureInstanceTypesOK{} -} - -/* -GetAzureInstanceTypesOK handles this case with default header values. - -Successful retrieval of Azure instance Types -*/ -type GetAzureInstanceTypesOK struct { - Payload []*models.AzureInstanceType -} - -func (o *GetAzureInstanceTypesOK) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/regions/{location}/instanceTypes][%d] getAzureInstanceTypesOK %+v", 200, o.Payload) -} - -func (o *GetAzureInstanceTypesOK) GetPayload() []*models.AzureInstanceType { - return o.Payload -} - -func (o *GetAzureInstanceTypesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureInstanceTypesBadRequest creates a GetAzureInstanceTypesBadRequest with default headers values -func NewGetAzureInstanceTypesBadRequest() *GetAzureInstanceTypesBadRequest { - return &GetAzureInstanceTypesBadRequest{} -} - -/* -GetAzureInstanceTypesBadRequest handles this case with default header values. - -Bad Request -*/ -type GetAzureInstanceTypesBadRequest struct { - Payload *models.Error -} - -func (o *GetAzureInstanceTypesBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/regions/{location}/instanceTypes][%d] getAzureInstanceTypesBadRequest %+v", 400, o.Payload) -} - -func (o *GetAzureInstanceTypesBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureInstanceTypesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureInstanceTypesUnauthorized creates a GetAzureInstanceTypesUnauthorized with default headers values -func NewGetAzureInstanceTypesUnauthorized() *GetAzureInstanceTypesUnauthorized { - return &GetAzureInstanceTypesUnauthorized{} -} - -/* -GetAzureInstanceTypesUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAzureInstanceTypesUnauthorized struct { - Payload *models.Error -} - -func (o *GetAzureInstanceTypesUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/regions/{location}/instanceTypes][%d] getAzureInstanceTypesUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAzureInstanceTypesUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureInstanceTypesUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureInstanceTypesInternalServerError creates a GetAzureInstanceTypesInternalServerError with default headers values -func NewGetAzureInstanceTypesInternalServerError() *GetAzureInstanceTypesInternalServerError { - return &GetAzureInstanceTypesInternalServerError{} -} - -/* -GetAzureInstanceTypesInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAzureInstanceTypesInternalServerError struct { - Payload *models.Error -} - -func (o *GetAzureInstanceTypesInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/regions/{location}/instanceTypes][%d] getAzureInstanceTypesInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAzureInstanceTypesInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureInstanceTypesInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_o_s_images_parameters.go b/tkg/web/server/client/azure/get_azure_o_s_images_parameters.go deleted file mode 100644 index 6a0b4aa7c8..0000000000 --- a/tkg/web/server/client/azure/get_azure_o_s_images_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAzureOSImagesParams creates a new GetAzureOSImagesParams object -// with the default values initialized. -func NewGetAzureOSImagesParams() *GetAzureOSImagesParams { - - return &GetAzureOSImagesParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAzureOSImagesParamsWithTimeout creates a new GetAzureOSImagesParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAzureOSImagesParamsWithTimeout(timeout time.Duration) *GetAzureOSImagesParams { - - return &GetAzureOSImagesParams{ - - timeout: timeout, - } -} - -// NewGetAzureOSImagesParamsWithContext creates a new GetAzureOSImagesParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAzureOSImagesParamsWithContext(ctx context.Context) *GetAzureOSImagesParams { - - return &GetAzureOSImagesParams{ - - Context: ctx, - } -} - -// NewGetAzureOSImagesParamsWithHTTPClient creates a new GetAzureOSImagesParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAzureOSImagesParamsWithHTTPClient(client *http.Client) *GetAzureOSImagesParams { - - return &GetAzureOSImagesParams{ - HTTPClient: client, - } -} - -/* -GetAzureOSImagesParams contains all the parameters to send to the API endpoint -for the get azure o s images operation typically these are written to a http.Request -*/ -type GetAzureOSImagesParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get azure o s images params -func (o *GetAzureOSImagesParams) WithTimeout(timeout time.Duration) *GetAzureOSImagesParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get azure o s images params -func (o *GetAzureOSImagesParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get azure o s images params -func (o *GetAzureOSImagesParams) WithContext(ctx context.Context) *GetAzureOSImagesParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get azure o s images params -func (o *GetAzureOSImagesParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get azure o s images params -func (o *GetAzureOSImagesParams) WithHTTPClient(client *http.Client) *GetAzureOSImagesParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get azure o s images params -func (o *GetAzureOSImagesParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAzureOSImagesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_o_s_images_responses.go b/tkg/web/server/client/azure/get_azure_o_s_images_responses.go deleted file mode 100644 index 65de3367e4..0000000000 --- a/tkg/web/server/client/azure/get_azure_o_s_images_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureOSImagesReader is a Reader for the GetAzureOSImages structure. -type GetAzureOSImagesReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAzureOSImagesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAzureOSImagesOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAzureOSImagesBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAzureOSImagesUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAzureOSImagesInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAzureOSImagesOK creates a GetAzureOSImagesOK with default headers values -func NewGetAzureOSImagesOK() *GetAzureOSImagesOK { - return &GetAzureOSImagesOK{} -} - -/* -GetAzureOSImagesOK handles this case with default header values. - -Successful retrieval of Azure supported os images -*/ -type GetAzureOSImagesOK struct { - Payload []*models.AzureVirtualMachine -} - -func (o *GetAzureOSImagesOK) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/osimages][%d] getAzureOSImagesOK %+v", 200, o.Payload) -} - -func (o *GetAzureOSImagesOK) GetPayload() []*models.AzureVirtualMachine { - return o.Payload -} - -func (o *GetAzureOSImagesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureOSImagesBadRequest creates a GetAzureOSImagesBadRequest with default headers values -func NewGetAzureOSImagesBadRequest() *GetAzureOSImagesBadRequest { - return &GetAzureOSImagesBadRequest{} -} - -/* -GetAzureOSImagesBadRequest handles this case with default header values. - -Bad request -*/ -type GetAzureOSImagesBadRequest struct { - Payload *models.Error -} - -func (o *GetAzureOSImagesBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/osimages][%d] getAzureOSImagesBadRequest %+v", 400, o.Payload) -} - -func (o *GetAzureOSImagesBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureOSImagesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureOSImagesUnauthorized creates a GetAzureOSImagesUnauthorized with default headers values -func NewGetAzureOSImagesUnauthorized() *GetAzureOSImagesUnauthorized { - return &GetAzureOSImagesUnauthorized{} -} - -/* -GetAzureOSImagesUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAzureOSImagesUnauthorized struct { - Payload *models.Error -} - -func (o *GetAzureOSImagesUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/osimages][%d] getAzureOSImagesUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAzureOSImagesUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureOSImagesUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureOSImagesInternalServerError creates a GetAzureOSImagesInternalServerError with default headers values -func NewGetAzureOSImagesInternalServerError() *GetAzureOSImagesInternalServerError { - return &GetAzureOSImagesInternalServerError{} -} - -/* -GetAzureOSImagesInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAzureOSImagesInternalServerError struct { - Payload *models.Error -} - -func (o *GetAzureOSImagesInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/osimages][%d] getAzureOSImagesInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAzureOSImagesInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureOSImagesInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_regions_parameters.go b/tkg/web/server/client/azure/get_azure_regions_parameters.go deleted file mode 100644 index c4fa2ddd55..0000000000 --- a/tkg/web/server/client/azure/get_azure_regions_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAzureRegionsParams creates a new GetAzureRegionsParams object -// with the default values initialized. -func NewGetAzureRegionsParams() *GetAzureRegionsParams { - - return &GetAzureRegionsParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAzureRegionsParamsWithTimeout creates a new GetAzureRegionsParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAzureRegionsParamsWithTimeout(timeout time.Duration) *GetAzureRegionsParams { - - return &GetAzureRegionsParams{ - - timeout: timeout, - } -} - -// NewGetAzureRegionsParamsWithContext creates a new GetAzureRegionsParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAzureRegionsParamsWithContext(ctx context.Context) *GetAzureRegionsParams { - - return &GetAzureRegionsParams{ - - Context: ctx, - } -} - -// NewGetAzureRegionsParamsWithHTTPClient creates a new GetAzureRegionsParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAzureRegionsParamsWithHTTPClient(client *http.Client) *GetAzureRegionsParams { - - return &GetAzureRegionsParams{ - HTTPClient: client, - } -} - -/* -GetAzureRegionsParams contains all the parameters to send to the API endpoint -for the get azure regions operation typically these are written to a http.Request -*/ -type GetAzureRegionsParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get azure regions params -func (o *GetAzureRegionsParams) WithTimeout(timeout time.Duration) *GetAzureRegionsParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get azure regions params -func (o *GetAzureRegionsParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get azure regions params -func (o *GetAzureRegionsParams) WithContext(ctx context.Context) *GetAzureRegionsParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get azure regions params -func (o *GetAzureRegionsParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get azure regions params -func (o *GetAzureRegionsParams) WithHTTPClient(client *http.Client) *GetAzureRegionsParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get azure regions params -func (o *GetAzureRegionsParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAzureRegionsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_regions_responses.go b/tkg/web/server/client/azure/get_azure_regions_responses.go deleted file mode 100644 index 39500a69fe..0000000000 --- a/tkg/web/server/client/azure/get_azure_regions_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureRegionsReader is a Reader for the GetAzureRegions structure. -type GetAzureRegionsReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAzureRegionsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAzureRegionsOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAzureRegionsBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAzureRegionsUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAzureRegionsInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAzureRegionsOK creates a GetAzureRegionsOK with default headers values -func NewGetAzureRegionsOK() *GetAzureRegionsOK { - return &GetAzureRegionsOK{} -} - -/* -GetAzureRegionsOK handles this case with default header values. - -Successful retrieval of Azure regions -*/ -type GetAzureRegionsOK struct { - Payload []*models.AzureLocation -} - -func (o *GetAzureRegionsOK) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/regions][%d] getAzureRegionsOK %+v", 200, o.Payload) -} - -func (o *GetAzureRegionsOK) GetPayload() []*models.AzureLocation { - return o.Payload -} - -func (o *GetAzureRegionsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureRegionsBadRequest creates a GetAzureRegionsBadRequest with default headers values -func NewGetAzureRegionsBadRequest() *GetAzureRegionsBadRequest { - return &GetAzureRegionsBadRequest{} -} - -/* -GetAzureRegionsBadRequest handles this case with default header values. - -Bad Request -*/ -type GetAzureRegionsBadRequest struct { - Payload *models.Error -} - -func (o *GetAzureRegionsBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/regions][%d] getAzureRegionsBadRequest %+v", 400, o.Payload) -} - -func (o *GetAzureRegionsBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureRegionsBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureRegionsUnauthorized creates a GetAzureRegionsUnauthorized with default headers values -func NewGetAzureRegionsUnauthorized() *GetAzureRegionsUnauthorized { - return &GetAzureRegionsUnauthorized{} -} - -/* -GetAzureRegionsUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAzureRegionsUnauthorized struct { - Payload *models.Error -} - -func (o *GetAzureRegionsUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/regions][%d] getAzureRegionsUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAzureRegionsUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureRegionsUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureRegionsInternalServerError creates a GetAzureRegionsInternalServerError with default headers values -func NewGetAzureRegionsInternalServerError() *GetAzureRegionsInternalServerError { - return &GetAzureRegionsInternalServerError{} -} - -/* -GetAzureRegionsInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAzureRegionsInternalServerError struct { - Payload *models.Error -} - -func (o *GetAzureRegionsInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/regions][%d] getAzureRegionsInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAzureRegionsInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureRegionsInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_resource_groups_parameters.go b/tkg/web/server/client/azure/get_azure_resource_groups_parameters.go deleted file mode 100644 index b97a2b6893..0000000000 --- a/tkg/web/server/client/azure/get_azure_resource_groups_parameters.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAzureResourceGroupsParams creates a new GetAzureResourceGroupsParams object -// with the default values initialized. -func NewGetAzureResourceGroupsParams() *GetAzureResourceGroupsParams { - var () - return &GetAzureResourceGroupsParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAzureResourceGroupsParamsWithTimeout creates a new GetAzureResourceGroupsParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAzureResourceGroupsParamsWithTimeout(timeout time.Duration) *GetAzureResourceGroupsParams { - var () - return &GetAzureResourceGroupsParams{ - - timeout: timeout, - } -} - -// NewGetAzureResourceGroupsParamsWithContext creates a new GetAzureResourceGroupsParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAzureResourceGroupsParamsWithContext(ctx context.Context) *GetAzureResourceGroupsParams { - var () - return &GetAzureResourceGroupsParams{ - - Context: ctx, - } -} - -// NewGetAzureResourceGroupsParamsWithHTTPClient creates a new GetAzureResourceGroupsParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAzureResourceGroupsParamsWithHTTPClient(client *http.Client) *GetAzureResourceGroupsParams { - var () - return &GetAzureResourceGroupsParams{ - HTTPClient: client, - } -} - -/* -GetAzureResourceGroupsParams contains all the parameters to send to the API endpoint -for the get azure resource groups operation typically these are written to a http.Request -*/ -type GetAzureResourceGroupsParams struct { - - /*Location - Azure region - - */ - Location string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get azure resource groups params -func (o *GetAzureResourceGroupsParams) WithTimeout(timeout time.Duration) *GetAzureResourceGroupsParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get azure resource groups params -func (o *GetAzureResourceGroupsParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get azure resource groups params -func (o *GetAzureResourceGroupsParams) WithContext(ctx context.Context) *GetAzureResourceGroupsParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get azure resource groups params -func (o *GetAzureResourceGroupsParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get azure resource groups params -func (o *GetAzureResourceGroupsParams) WithHTTPClient(client *http.Client) *GetAzureResourceGroupsParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get azure resource groups params -func (o *GetAzureResourceGroupsParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithLocation adds the location to the get azure resource groups params -func (o *GetAzureResourceGroupsParams) WithLocation(location string) *GetAzureResourceGroupsParams { - o.SetLocation(location) - return o -} - -// SetLocation adds the location to the get azure resource groups params -func (o *GetAzureResourceGroupsParams) SetLocation(location string) { - o.Location = location -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAzureResourceGroupsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // query param location - qrLocation := o.Location - qLocation := qrLocation - if qLocation != "" { - if err := r.SetQueryParam("location", qLocation); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_resource_groups_responses.go b/tkg/web/server/client/azure/get_azure_resource_groups_responses.go deleted file mode 100644 index 9d414e22ea..0000000000 --- a/tkg/web/server/client/azure/get_azure_resource_groups_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureResourceGroupsReader is a Reader for the GetAzureResourceGroups structure. -type GetAzureResourceGroupsReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAzureResourceGroupsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAzureResourceGroupsOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAzureResourceGroupsBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAzureResourceGroupsUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAzureResourceGroupsInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAzureResourceGroupsOK creates a GetAzureResourceGroupsOK with default headers values -func NewGetAzureResourceGroupsOK() *GetAzureResourceGroupsOK { - return &GetAzureResourceGroupsOK{} -} - -/* -GetAzureResourceGroupsOK handles this case with default header values. - -Successful retrieval of Azure resource groups -*/ -type GetAzureResourceGroupsOK struct { - Payload []*models.AzureResourceGroup -} - -func (o *GetAzureResourceGroupsOK) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/resourcegroups][%d] getAzureResourceGroupsOK %+v", 200, o.Payload) -} - -func (o *GetAzureResourceGroupsOK) GetPayload() []*models.AzureResourceGroup { - return o.Payload -} - -func (o *GetAzureResourceGroupsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureResourceGroupsBadRequest creates a GetAzureResourceGroupsBadRequest with default headers values -func NewGetAzureResourceGroupsBadRequest() *GetAzureResourceGroupsBadRequest { - return &GetAzureResourceGroupsBadRequest{} -} - -/* -GetAzureResourceGroupsBadRequest handles this case with default header values. - -Bad Request -*/ -type GetAzureResourceGroupsBadRequest struct { - Payload *models.Error -} - -func (o *GetAzureResourceGroupsBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/resourcegroups][%d] getAzureResourceGroupsBadRequest %+v", 400, o.Payload) -} - -func (o *GetAzureResourceGroupsBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureResourceGroupsBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureResourceGroupsUnauthorized creates a GetAzureResourceGroupsUnauthorized with default headers values -func NewGetAzureResourceGroupsUnauthorized() *GetAzureResourceGroupsUnauthorized { - return &GetAzureResourceGroupsUnauthorized{} -} - -/* -GetAzureResourceGroupsUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAzureResourceGroupsUnauthorized struct { - Payload *models.Error -} - -func (o *GetAzureResourceGroupsUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/resourcegroups][%d] getAzureResourceGroupsUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAzureResourceGroupsUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureResourceGroupsUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureResourceGroupsInternalServerError creates a GetAzureResourceGroupsInternalServerError with default headers values -func NewGetAzureResourceGroupsInternalServerError() *GetAzureResourceGroupsInternalServerError { - return &GetAzureResourceGroupsInternalServerError{} -} - -/* -GetAzureResourceGroupsInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAzureResourceGroupsInternalServerError struct { - Payload *models.Error -} - -func (o *GetAzureResourceGroupsInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/resourcegroups][%d] getAzureResourceGroupsInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAzureResourceGroupsInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureResourceGroupsInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_vnets_parameters.go b/tkg/web/server/client/azure/get_azure_vnets_parameters.go deleted file mode 100644 index 3606c485d4..0000000000 --- a/tkg/web/server/client/azure/get_azure_vnets_parameters.go +++ /dev/null @@ -1,162 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAzureVnetsParams creates a new GetAzureVnetsParams object -// with the default values initialized. -func NewGetAzureVnetsParams() *GetAzureVnetsParams { - var () - return &GetAzureVnetsParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetAzureVnetsParamsWithTimeout creates a new GetAzureVnetsParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetAzureVnetsParamsWithTimeout(timeout time.Duration) *GetAzureVnetsParams { - var () - return &GetAzureVnetsParams{ - - timeout: timeout, - } -} - -// NewGetAzureVnetsParamsWithContext creates a new GetAzureVnetsParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetAzureVnetsParamsWithContext(ctx context.Context) *GetAzureVnetsParams { - var () - return &GetAzureVnetsParams{ - - Context: ctx, - } -} - -// NewGetAzureVnetsParamsWithHTTPClient creates a new GetAzureVnetsParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetAzureVnetsParamsWithHTTPClient(client *http.Client) *GetAzureVnetsParams { - var () - return &GetAzureVnetsParams{ - HTTPClient: client, - } -} - -/* -GetAzureVnetsParams contains all the parameters to send to the API endpoint -for the get azure vnets operation typically these are written to a http.Request -*/ -type GetAzureVnetsParams struct { - - /*Location - Azure region - - */ - Location string - /*ResourceGroupName - Name of the Azure resource group - - */ - ResourceGroupName string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get azure vnets params -func (o *GetAzureVnetsParams) WithTimeout(timeout time.Duration) *GetAzureVnetsParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get azure vnets params -func (o *GetAzureVnetsParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get azure vnets params -func (o *GetAzureVnetsParams) WithContext(ctx context.Context) *GetAzureVnetsParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get azure vnets params -func (o *GetAzureVnetsParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get azure vnets params -func (o *GetAzureVnetsParams) WithHTTPClient(client *http.Client) *GetAzureVnetsParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get azure vnets params -func (o *GetAzureVnetsParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithLocation adds the location to the get azure vnets params -func (o *GetAzureVnetsParams) WithLocation(location string) *GetAzureVnetsParams { - o.SetLocation(location) - return o -} - -// SetLocation adds the location to the get azure vnets params -func (o *GetAzureVnetsParams) SetLocation(location string) { - o.Location = location -} - -// WithResourceGroupName adds the resourceGroupName to the get azure vnets params -func (o *GetAzureVnetsParams) WithResourceGroupName(resourceGroupName string) *GetAzureVnetsParams { - o.SetResourceGroupName(resourceGroupName) - return o -} - -// SetResourceGroupName adds the resourceGroupName to the get azure vnets params -func (o *GetAzureVnetsParams) SetResourceGroupName(resourceGroupName string) { - o.ResourceGroupName = resourceGroupName -} - -// WriteToRequest writes these params to a swagger request -func (o *GetAzureVnetsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // query param location - qrLocation := o.Location - qLocation := qrLocation - if qLocation != "" { - if err := r.SetQueryParam("location", qLocation); err != nil { - return err - } - } - - // path param resourceGroupName - if err := r.SetPathParam("resourceGroupName", o.ResourceGroupName); err != nil { - return err - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/get_azure_vnets_responses.go b/tkg/web/server/client/azure/get_azure_vnets_responses.go deleted file mode 100644 index 21f02738e5..0000000000 --- a/tkg/web/server/client/azure/get_azure_vnets_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureVnetsReader is a Reader for the GetAzureVnets structure. -type GetAzureVnetsReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetAzureVnetsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetAzureVnetsOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetAzureVnetsBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetAzureVnetsUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetAzureVnetsInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetAzureVnetsOK creates a GetAzureVnetsOK with default headers values -func NewGetAzureVnetsOK() *GetAzureVnetsOK { - return &GetAzureVnetsOK{} -} - -/* -GetAzureVnetsOK handles this case with default header values. - -Successful retrieval of Azure virtual networks -*/ -type GetAzureVnetsOK struct { - Payload []*models.AzureVirtualNetwork -} - -func (o *GetAzureVnetsOK) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/resourcegroups/{resourceGroupName}/vnets][%d] getAzureVnetsOK %+v", 200, o.Payload) -} - -func (o *GetAzureVnetsOK) GetPayload() []*models.AzureVirtualNetwork { - return o.Payload -} - -func (o *GetAzureVnetsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureVnetsBadRequest creates a GetAzureVnetsBadRequest with default headers values -func NewGetAzureVnetsBadRequest() *GetAzureVnetsBadRequest { - return &GetAzureVnetsBadRequest{} -} - -/* -GetAzureVnetsBadRequest handles this case with default header values. - -Bad Request -*/ -type GetAzureVnetsBadRequest struct { - Payload *models.Error -} - -func (o *GetAzureVnetsBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/resourcegroups/{resourceGroupName}/vnets][%d] getAzureVnetsBadRequest %+v", 400, o.Payload) -} - -func (o *GetAzureVnetsBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureVnetsBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureVnetsUnauthorized creates a GetAzureVnetsUnauthorized with default headers values -func NewGetAzureVnetsUnauthorized() *GetAzureVnetsUnauthorized { - return &GetAzureVnetsUnauthorized{} -} - -/* -GetAzureVnetsUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetAzureVnetsUnauthorized struct { - Payload *models.Error -} - -func (o *GetAzureVnetsUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/resourcegroups/{resourceGroupName}/vnets][%d] getAzureVnetsUnauthorized %+v", 401, o.Payload) -} - -func (o *GetAzureVnetsUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureVnetsUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetAzureVnetsInternalServerError creates a GetAzureVnetsInternalServerError with default headers values -func NewGetAzureVnetsInternalServerError() *GetAzureVnetsInternalServerError { - return &GetAzureVnetsInternalServerError{} -} - -/* -GetAzureVnetsInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetAzureVnetsInternalServerError struct { - Payload *models.Error -} - -func (o *GetAzureVnetsInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/azure/resourcegroups/{resourceGroupName}/vnets][%d] getAzureVnetsInternalServerError %+v", 500, o.Payload) -} - -func (o *GetAzureVnetsInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetAzureVnetsInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/import_t_k_g_config_for_azure_parameters.go b/tkg/web/server/client/azure/import_t_k_g_config_for_azure_parameters.go deleted file mode 100644 index fa3d2fd414..0000000000 --- a/tkg/web/server/client/azure/import_t_k_g_config_for_azure_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewImportTKGConfigForAzureParams creates a new ImportTKGConfigForAzureParams object -// with the default values initialized. -func NewImportTKGConfigForAzureParams() *ImportTKGConfigForAzureParams { - var () - return &ImportTKGConfigForAzureParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewImportTKGConfigForAzureParamsWithTimeout creates a new ImportTKGConfigForAzureParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewImportTKGConfigForAzureParamsWithTimeout(timeout time.Duration) *ImportTKGConfigForAzureParams { - var () - return &ImportTKGConfigForAzureParams{ - - timeout: timeout, - } -} - -// NewImportTKGConfigForAzureParamsWithContext creates a new ImportTKGConfigForAzureParams object -// with the default values initialized, and the ability to set a context for a request -func NewImportTKGConfigForAzureParamsWithContext(ctx context.Context) *ImportTKGConfigForAzureParams { - var () - return &ImportTKGConfigForAzureParams{ - - Context: ctx, - } -} - -// NewImportTKGConfigForAzureParamsWithHTTPClient creates a new ImportTKGConfigForAzureParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewImportTKGConfigForAzureParamsWithHTTPClient(client *http.Client) *ImportTKGConfigForAzureParams { - var () - return &ImportTKGConfigForAzureParams{ - HTTPClient: client, - } -} - -/* -ImportTKGConfigForAzureParams contains all the parameters to send to the API endpoint -for the import t k g config for azure operation typically these are written to a http.Request -*/ -type ImportTKGConfigForAzureParams struct { - - /*Params - config file from which to generate tkg configuration for azure - - */ - Params *models.ConfigFile - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the import t k g config for azure params -func (o *ImportTKGConfigForAzureParams) WithTimeout(timeout time.Duration) *ImportTKGConfigForAzureParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the import t k g config for azure params -func (o *ImportTKGConfigForAzureParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the import t k g config for azure params -func (o *ImportTKGConfigForAzureParams) WithContext(ctx context.Context) *ImportTKGConfigForAzureParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the import t k g config for azure params -func (o *ImportTKGConfigForAzureParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the import t k g config for azure params -func (o *ImportTKGConfigForAzureParams) WithHTTPClient(client *http.Client) *ImportTKGConfigForAzureParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the import t k g config for azure params -func (o *ImportTKGConfigForAzureParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the import t k g config for azure params -func (o *ImportTKGConfigForAzureParams) WithParams(params *models.ConfigFile) *ImportTKGConfigForAzureParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the import t k g config for azure params -func (o *ImportTKGConfigForAzureParams) SetParams(params *models.ConfigFile) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ImportTKGConfigForAzureParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/import_t_k_g_config_for_azure_responses.go b/tkg/web/server/client/azure/import_t_k_g_config_for_azure_responses.go deleted file mode 100644 index 6ca89c9f1f..0000000000 --- a/tkg/web/server/client/azure/import_t_k_g_config_for_azure_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ImportTKGConfigForAzureReader is a Reader for the ImportTKGConfigForAzure structure. -type ImportTKGConfigForAzureReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ImportTKGConfigForAzureReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewImportTKGConfigForAzureOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewImportTKGConfigForAzureBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewImportTKGConfigForAzureUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewImportTKGConfigForAzureInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewImportTKGConfigForAzureOK creates a ImportTKGConfigForAzureOK with default headers values -func NewImportTKGConfigForAzureOK() *ImportTKGConfigForAzureOK { - return &ImportTKGConfigForAzureOK{} -} - -/* -ImportTKGConfigForAzureOK handles this case with default header values. - -Generated TKG configuration successfully -*/ -type ImportTKGConfigForAzureOK struct { - Payload *models.AzureRegionalClusterParams -} - -func (o *ImportTKGConfigForAzureOK) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/config/import][%d] importTKGConfigForAzureOK %+v", 200, o.Payload) -} - -func (o *ImportTKGConfigForAzureOK) GetPayload() *models.AzureRegionalClusterParams { - return o.Payload -} - -func (o *ImportTKGConfigForAzureOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.AzureRegionalClusterParams) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForAzureBadRequest creates a ImportTKGConfigForAzureBadRequest with default headers values -func NewImportTKGConfigForAzureBadRequest() *ImportTKGConfigForAzureBadRequest { - return &ImportTKGConfigForAzureBadRequest{} -} - -/* -ImportTKGConfigForAzureBadRequest handles this case with default header values. - -Bad request -*/ -type ImportTKGConfigForAzureBadRequest struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForAzureBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/config/import][%d] importTKGConfigForAzureBadRequest %+v", 400, o.Payload) -} - -func (o *ImportTKGConfigForAzureBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForAzureBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForAzureUnauthorized creates a ImportTKGConfigForAzureUnauthorized with default headers values -func NewImportTKGConfigForAzureUnauthorized() *ImportTKGConfigForAzureUnauthorized { - return &ImportTKGConfigForAzureUnauthorized{} -} - -/* -ImportTKGConfigForAzureUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type ImportTKGConfigForAzureUnauthorized struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForAzureUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/config/import][%d] importTKGConfigForAzureUnauthorized %+v", 401, o.Payload) -} - -func (o *ImportTKGConfigForAzureUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForAzureUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForAzureInternalServerError creates a ImportTKGConfigForAzureInternalServerError with default headers values -func NewImportTKGConfigForAzureInternalServerError() *ImportTKGConfigForAzureInternalServerError { - return &ImportTKGConfigForAzureInternalServerError{} -} - -/* -ImportTKGConfigForAzureInternalServerError handles this case with default header values. - -Internal server error -*/ -type ImportTKGConfigForAzureInternalServerError struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForAzureInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/azure/config/import][%d] importTKGConfigForAzureInternalServerError %+v", 500, o.Payload) -} - -func (o *ImportTKGConfigForAzureInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForAzureInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/azure/set_azure_endpoint_parameters.go b/tkg/web/server/client/azure/set_azure_endpoint_parameters.go deleted file mode 100644 index 3779f5d3f7..0000000000 --- a/tkg/web/server/client/azure/set_azure_endpoint_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewSetAzureEndpointParams creates a new SetAzureEndpointParams object -// with the default values initialized. -func NewSetAzureEndpointParams() *SetAzureEndpointParams { - var () - return &SetAzureEndpointParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewSetAzureEndpointParamsWithTimeout creates a new SetAzureEndpointParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewSetAzureEndpointParamsWithTimeout(timeout time.Duration) *SetAzureEndpointParams { - var () - return &SetAzureEndpointParams{ - - timeout: timeout, - } -} - -// NewSetAzureEndpointParamsWithContext creates a new SetAzureEndpointParams object -// with the default values initialized, and the ability to set a context for a request -func NewSetAzureEndpointParamsWithContext(ctx context.Context) *SetAzureEndpointParams { - var () - return &SetAzureEndpointParams{ - - Context: ctx, - } -} - -// NewSetAzureEndpointParamsWithHTTPClient creates a new SetAzureEndpointParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewSetAzureEndpointParamsWithHTTPClient(client *http.Client) *SetAzureEndpointParams { - var () - return &SetAzureEndpointParams{ - HTTPClient: client, - } -} - -/* -SetAzureEndpointParams contains all the parameters to send to the API endpoint -for the set azure endpoint operation typically these are written to a http.Request -*/ -type SetAzureEndpointParams struct { - - /*AccountParams - Azure account parameters - - */ - AccountParams *models.AzureAccountParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the set azure endpoint params -func (o *SetAzureEndpointParams) WithTimeout(timeout time.Duration) *SetAzureEndpointParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the set azure endpoint params -func (o *SetAzureEndpointParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the set azure endpoint params -func (o *SetAzureEndpointParams) WithContext(ctx context.Context) *SetAzureEndpointParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the set azure endpoint params -func (o *SetAzureEndpointParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the set azure endpoint params -func (o *SetAzureEndpointParams) WithHTTPClient(client *http.Client) *SetAzureEndpointParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the set azure endpoint params -func (o *SetAzureEndpointParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithAccountParams adds the accountParams to the set azure endpoint params -func (o *SetAzureEndpointParams) WithAccountParams(accountParams *models.AzureAccountParams) *SetAzureEndpointParams { - o.SetAccountParams(accountParams) - return o -} - -// SetAccountParams adds the accountParams to the set azure endpoint params -func (o *SetAzureEndpointParams) SetAccountParams(accountParams *models.AzureAccountParams) { - o.AccountParams = accountParams -} - -// WriteToRequest writes these params to a swagger request -func (o *SetAzureEndpointParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.AccountParams != nil { - if err := r.SetBodyParam(o.AccountParams); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/azure/set_azure_endpoint_responses.go b/tkg/web/server/client/azure/set_azure_endpoint_responses.go deleted file mode 100644 index 26ad4e1b34..0000000000 --- a/tkg/web/server/client/azure/set_azure_endpoint_responses.go +++ /dev/null @@ -1,179 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// SetAzureEndpointReader is a Reader for the SetAzureEndpoint structure. -type SetAzureEndpointReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *SetAzureEndpointReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 201: - result := NewSetAzureEndpointCreated() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewSetAzureEndpointBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewSetAzureEndpointUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewSetAzureEndpointInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewSetAzureEndpointCreated creates a SetAzureEndpointCreated with default headers values -func NewSetAzureEndpointCreated() *SetAzureEndpointCreated { - return &SetAzureEndpointCreated{} -} - -/* -SetAzureEndpointCreated handles this case with default header values. - -Connection successful -*/ -type SetAzureEndpointCreated struct { -} - -func (o *SetAzureEndpointCreated) Error() string { - return fmt.Sprintf("[POST /api/providers/azure][%d] setAzureEndpointCreated ", 201) -} - -func (o *SetAzureEndpointCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - return nil -} - -// NewSetAzureEndpointBadRequest creates a SetAzureEndpointBadRequest with default headers values -func NewSetAzureEndpointBadRequest() *SetAzureEndpointBadRequest { - return &SetAzureEndpointBadRequest{} -} - -/* -SetAzureEndpointBadRequest handles this case with default header values. - -Bad request -*/ -type SetAzureEndpointBadRequest struct { - Payload *models.Error -} - -func (o *SetAzureEndpointBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/azure][%d] setAzureEndpointBadRequest %+v", 400, o.Payload) -} - -func (o *SetAzureEndpointBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *SetAzureEndpointBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewSetAzureEndpointUnauthorized creates a SetAzureEndpointUnauthorized with default headers values -func NewSetAzureEndpointUnauthorized() *SetAzureEndpointUnauthorized { - return &SetAzureEndpointUnauthorized{} -} - -/* -SetAzureEndpointUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type SetAzureEndpointUnauthorized struct { - Payload *models.Error -} - -func (o *SetAzureEndpointUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/azure][%d] setAzureEndpointUnauthorized %+v", 401, o.Payload) -} - -func (o *SetAzureEndpointUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *SetAzureEndpointUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewSetAzureEndpointInternalServerError creates a SetAzureEndpointInternalServerError with default headers values -func NewSetAzureEndpointInternalServerError() *SetAzureEndpointInternalServerError { - return &SetAzureEndpointInternalServerError{} -} - -/* -SetAzureEndpointInternalServerError handles this case with default header values. - -Internal server error -*/ -type SetAzureEndpointInternalServerError struct { - Payload *models.Error -} - -func (o *SetAzureEndpointInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/azure][%d] setAzureEndpointInternalServerError %+v", 500, o.Payload) -} - -func (o *SetAzureEndpointInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *SetAzureEndpointInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/docker/apply_t_k_g_config_for_docker_parameters.go b/tkg/web/server/client/docker/apply_t_k_g_config_for_docker_parameters.go deleted file mode 100644 index 648aafb3b6..0000000000 --- a/tkg/web/server/client/docker/apply_t_k_g_config_for_docker_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewApplyTKGConfigForDockerParams creates a new ApplyTKGConfigForDockerParams object -// with the default values initialized. -func NewApplyTKGConfigForDockerParams() *ApplyTKGConfigForDockerParams { - var () - return &ApplyTKGConfigForDockerParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewApplyTKGConfigForDockerParamsWithTimeout creates a new ApplyTKGConfigForDockerParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewApplyTKGConfigForDockerParamsWithTimeout(timeout time.Duration) *ApplyTKGConfigForDockerParams { - var () - return &ApplyTKGConfigForDockerParams{ - - timeout: timeout, - } -} - -// NewApplyTKGConfigForDockerParamsWithContext creates a new ApplyTKGConfigForDockerParams object -// with the default values initialized, and the ability to set a context for a request -func NewApplyTKGConfigForDockerParamsWithContext(ctx context.Context) *ApplyTKGConfigForDockerParams { - var () - return &ApplyTKGConfigForDockerParams{ - - Context: ctx, - } -} - -// NewApplyTKGConfigForDockerParamsWithHTTPClient creates a new ApplyTKGConfigForDockerParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewApplyTKGConfigForDockerParamsWithHTTPClient(client *http.Client) *ApplyTKGConfigForDockerParams { - var () - return &ApplyTKGConfigForDockerParams{ - HTTPClient: client, - } -} - -/* -ApplyTKGConfigForDockerParams contains all the parameters to send to the API endpoint -for the apply t k g config for docker operation typically these are written to a http.Request -*/ -type ApplyTKGConfigForDockerParams struct { - - /*Params - parameters to apply changes to TKG configuration file for Docker - - */ - Params *models.DockerRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the apply t k g config for docker params -func (o *ApplyTKGConfigForDockerParams) WithTimeout(timeout time.Duration) *ApplyTKGConfigForDockerParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the apply t k g config for docker params -func (o *ApplyTKGConfigForDockerParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the apply t k g config for docker params -func (o *ApplyTKGConfigForDockerParams) WithContext(ctx context.Context) *ApplyTKGConfigForDockerParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the apply t k g config for docker params -func (o *ApplyTKGConfigForDockerParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the apply t k g config for docker params -func (o *ApplyTKGConfigForDockerParams) WithHTTPClient(client *http.Client) *ApplyTKGConfigForDockerParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the apply t k g config for docker params -func (o *ApplyTKGConfigForDockerParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the apply t k g config for docker params -func (o *ApplyTKGConfigForDockerParams) WithParams(params *models.DockerRegionalClusterParams) *ApplyTKGConfigForDockerParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the apply t k g config for docker params -func (o *ApplyTKGConfigForDockerParams) SetParams(params *models.DockerRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ApplyTKGConfigForDockerParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/docker/apply_t_k_g_config_for_docker_responses.go b/tkg/web/server/client/docker/apply_t_k_g_config_for_docker_responses.go deleted file mode 100644 index 454bde5983..0000000000 --- a/tkg/web/server/client/docker/apply_t_k_g_config_for_docker_responses.go +++ /dev/null @@ -1,151 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ApplyTKGConfigForDockerReader is a Reader for the ApplyTKGConfigForDocker structure. -type ApplyTKGConfigForDockerReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ApplyTKGConfigForDockerReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewApplyTKGConfigForDockerOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewApplyTKGConfigForDockerBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewApplyTKGConfigForDockerInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewApplyTKGConfigForDockerOK creates a ApplyTKGConfigForDockerOK with default headers values -func NewApplyTKGConfigForDockerOK() *ApplyTKGConfigForDockerOK { - return &ApplyTKGConfigForDockerOK{} -} - -/* -ApplyTKGConfigForDockerOK handles this case with default header values. - -Apply change to TKG configuration successfully -*/ -type ApplyTKGConfigForDockerOK struct { - Payload *models.ConfigFileInfo -} - -func (o *ApplyTKGConfigForDockerOK) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/tkgconfig][%d] applyTKGConfigForDockerOK %+v", 200, o.Payload) -} - -func (o *ApplyTKGConfigForDockerOK) GetPayload() *models.ConfigFileInfo { - return o.Payload -} - -func (o *ApplyTKGConfigForDockerOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.ConfigFileInfo) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewApplyTKGConfigForDockerBadRequest creates a ApplyTKGConfigForDockerBadRequest with default headers values -func NewApplyTKGConfigForDockerBadRequest() *ApplyTKGConfigForDockerBadRequest { - return &ApplyTKGConfigForDockerBadRequest{} -} - -/* -ApplyTKGConfigForDockerBadRequest handles this case with default header values. - -Bad request -*/ -type ApplyTKGConfigForDockerBadRequest struct { - Payload *models.Error -} - -func (o *ApplyTKGConfigForDockerBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/tkgconfig][%d] applyTKGConfigForDockerBadRequest %+v", 400, o.Payload) -} - -func (o *ApplyTKGConfigForDockerBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ApplyTKGConfigForDockerBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewApplyTKGConfigForDockerInternalServerError creates a ApplyTKGConfigForDockerInternalServerError with default headers values -func NewApplyTKGConfigForDockerInternalServerError() *ApplyTKGConfigForDockerInternalServerError { - return &ApplyTKGConfigForDockerInternalServerError{} -} - -/* -ApplyTKGConfigForDockerInternalServerError handles this case with default header values. - -Internal server error -*/ -type ApplyTKGConfigForDockerInternalServerError struct { - Payload *models.Error -} - -func (o *ApplyTKGConfigForDockerInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/tkgconfig][%d] applyTKGConfigForDockerInternalServerError %+v", 500, o.Payload) -} - -func (o *ApplyTKGConfigForDockerInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ApplyTKGConfigForDockerInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/docker/check_if_docker_daemon_available_parameters.go b/tkg/web/server/client/docker/check_if_docker_daemon_available_parameters.go deleted file mode 100644 index 5db30c0180..0000000000 --- a/tkg/web/server/client/docker/check_if_docker_daemon_available_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewCheckIfDockerDaemonAvailableParams creates a new CheckIfDockerDaemonAvailableParams object -// with the default values initialized. -func NewCheckIfDockerDaemonAvailableParams() *CheckIfDockerDaemonAvailableParams { - - return &CheckIfDockerDaemonAvailableParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewCheckIfDockerDaemonAvailableParamsWithTimeout creates a new CheckIfDockerDaemonAvailableParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewCheckIfDockerDaemonAvailableParamsWithTimeout(timeout time.Duration) *CheckIfDockerDaemonAvailableParams { - - return &CheckIfDockerDaemonAvailableParams{ - - timeout: timeout, - } -} - -// NewCheckIfDockerDaemonAvailableParamsWithContext creates a new CheckIfDockerDaemonAvailableParams object -// with the default values initialized, and the ability to set a context for a request -func NewCheckIfDockerDaemonAvailableParamsWithContext(ctx context.Context) *CheckIfDockerDaemonAvailableParams { - - return &CheckIfDockerDaemonAvailableParams{ - - Context: ctx, - } -} - -// NewCheckIfDockerDaemonAvailableParamsWithHTTPClient creates a new CheckIfDockerDaemonAvailableParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewCheckIfDockerDaemonAvailableParamsWithHTTPClient(client *http.Client) *CheckIfDockerDaemonAvailableParams { - - return &CheckIfDockerDaemonAvailableParams{ - HTTPClient: client, - } -} - -/* -CheckIfDockerDaemonAvailableParams contains all the parameters to send to the API endpoint -for the check if docker daemon available operation typically these are written to a http.Request -*/ -type CheckIfDockerDaemonAvailableParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the check if docker daemon available params -func (o *CheckIfDockerDaemonAvailableParams) WithTimeout(timeout time.Duration) *CheckIfDockerDaemonAvailableParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the check if docker daemon available params -func (o *CheckIfDockerDaemonAvailableParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the check if docker daemon available params -func (o *CheckIfDockerDaemonAvailableParams) WithContext(ctx context.Context) *CheckIfDockerDaemonAvailableParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the check if docker daemon available params -func (o *CheckIfDockerDaemonAvailableParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the check if docker daemon available params -func (o *CheckIfDockerDaemonAvailableParams) WithHTTPClient(client *http.Client) *CheckIfDockerDaemonAvailableParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the check if docker daemon available params -func (o *CheckIfDockerDaemonAvailableParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *CheckIfDockerDaemonAvailableParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/docker/check_if_docker_daemon_available_responses.go b/tkg/web/server/client/docker/check_if_docker_daemon_available_responses.go deleted file mode 100644 index f58a2b5d18..0000000000 --- a/tkg/web/server/client/docker/check_if_docker_daemon_available_responses.go +++ /dev/null @@ -1,151 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CheckIfDockerDaemonAvailableReader is a Reader for the CheckIfDockerDaemonAvailable structure. -type CheckIfDockerDaemonAvailableReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *CheckIfDockerDaemonAvailableReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewCheckIfDockerDaemonAvailableOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewCheckIfDockerDaemonAvailableBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewCheckIfDockerDaemonAvailableInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewCheckIfDockerDaemonAvailableOK creates a CheckIfDockerDaemonAvailableOK with default headers values -func NewCheckIfDockerDaemonAvailableOK() *CheckIfDockerDaemonAvailableOK { - return &CheckIfDockerDaemonAvailableOK{} -} - -/* -CheckIfDockerDaemonAvailableOK handles this case with default header values. - -Checked the docker daemon status successfully. -*/ -type CheckIfDockerDaemonAvailableOK struct { - Payload *models.DockerDaemonStatus -} - -func (o *CheckIfDockerDaemonAvailableOK) Error() string { - return fmt.Sprintf("[GET /api/providers/docker/daemon][%d] checkIfDockerDaemonAvailableOK %+v", 200, o.Payload) -} - -func (o *CheckIfDockerDaemonAvailableOK) GetPayload() *models.DockerDaemonStatus { - return o.Payload -} - -func (o *CheckIfDockerDaemonAvailableOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.DockerDaemonStatus) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCheckIfDockerDaemonAvailableBadRequest creates a CheckIfDockerDaemonAvailableBadRequest with default headers values -func NewCheckIfDockerDaemonAvailableBadRequest() *CheckIfDockerDaemonAvailableBadRequest { - return &CheckIfDockerDaemonAvailableBadRequest{} -} - -/* -CheckIfDockerDaemonAvailableBadRequest handles this case with default header values. - -Bad request -*/ -type CheckIfDockerDaemonAvailableBadRequest struct { - Payload *models.Error -} - -func (o *CheckIfDockerDaemonAvailableBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/docker/daemon][%d] checkIfDockerDaemonAvailableBadRequest %+v", 400, o.Payload) -} - -func (o *CheckIfDockerDaemonAvailableBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *CheckIfDockerDaemonAvailableBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCheckIfDockerDaemonAvailableInternalServerError creates a CheckIfDockerDaemonAvailableInternalServerError with default headers values -func NewCheckIfDockerDaemonAvailableInternalServerError() *CheckIfDockerDaemonAvailableInternalServerError { - return &CheckIfDockerDaemonAvailableInternalServerError{} -} - -/* -CheckIfDockerDaemonAvailableInternalServerError handles this case with default header values. - -Internal server error -*/ -type CheckIfDockerDaemonAvailableInternalServerError struct { - Payload *models.Error -} - -func (o *CheckIfDockerDaemonAvailableInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/docker/daemon][%d] checkIfDockerDaemonAvailableInternalServerError %+v", 500, o.Payload) -} - -func (o *CheckIfDockerDaemonAvailableInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *CheckIfDockerDaemonAvailableInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/docker/create_docker_regional_cluster_parameters.go b/tkg/web/server/client/docker/create_docker_regional_cluster_parameters.go deleted file mode 100644 index 4cea6cb0a2..0000000000 --- a/tkg/web/server/client/docker/create_docker_regional_cluster_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateDockerRegionalClusterParams creates a new CreateDockerRegionalClusterParams object -// with the default values initialized. -func NewCreateDockerRegionalClusterParams() *CreateDockerRegionalClusterParams { - var () - return &CreateDockerRegionalClusterParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewCreateDockerRegionalClusterParamsWithTimeout creates a new CreateDockerRegionalClusterParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewCreateDockerRegionalClusterParamsWithTimeout(timeout time.Duration) *CreateDockerRegionalClusterParams { - var () - return &CreateDockerRegionalClusterParams{ - - timeout: timeout, - } -} - -// NewCreateDockerRegionalClusterParamsWithContext creates a new CreateDockerRegionalClusterParams object -// with the default values initialized, and the ability to set a context for a request -func NewCreateDockerRegionalClusterParamsWithContext(ctx context.Context) *CreateDockerRegionalClusterParams { - var () - return &CreateDockerRegionalClusterParams{ - - Context: ctx, - } -} - -// NewCreateDockerRegionalClusterParamsWithHTTPClient creates a new CreateDockerRegionalClusterParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewCreateDockerRegionalClusterParamsWithHTTPClient(client *http.Client) *CreateDockerRegionalClusterParams { - var () - return &CreateDockerRegionalClusterParams{ - HTTPClient: client, - } -} - -/* -CreateDockerRegionalClusterParams contains all the parameters to send to the API endpoint -for the create docker regional cluster operation typically these are written to a http.Request -*/ -type CreateDockerRegionalClusterParams struct { - - /*Params - parameters to create a regional cluster - - */ - Params *models.DockerRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the create docker regional cluster params -func (o *CreateDockerRegionalClusterParams) WithTimeout(timeout time.Duration) *CreateDockerRegionalClusterParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the create docker regional cluster params -func (o *CreateDockerRegionalClusterParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the create docker regional cluster params -func (o *CreateDockerRegionalClusterParams) WithContext(ctx context.Context) *CreateDockerRegionalClusterParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the create docker regional cluster params -func (o *CreateDockerRegionalClusterParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the create docker regional cluster params -func (o *CreateDockerRegionalClusterParams) WithHTTPClient(client *http.Client) *CreateDockerRegionalClusterParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the create docker regional cluster params -func (o *CreateDockerRegionalClusterParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the create docker regional cluster params -func (o *CreateDockerRegionalClusterParams) WithParams(params *models.DockerRegionalClusterParams) *CreateDockerRegionalClusterParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the create docker regional cluster params -func (o *CreateDockerRegionalClusterParams) SetParams(params *models.DockerRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *CreateDockerRegionalClusterParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/docker/create_docker_regional_cluster_responses.go b/tkg/web/server/client/docker/create_docker_regional_cluster_responses.go deleted file mode 100644 index dd57a4e93d..0000000000 --- a/tkg/web/server/client/docker/create_docker_regional_cluster_responses.go +++ /dev/null @@ -1,149 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateDockerRegionalClusterReader is a Reader for the CreateDockerRegionalCluster structure. -type CreateDockerRegionalClusterReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *CreateDockerRegionalClusterReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewCreateDockerRegionalClusterOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewCreateDockerRegionalClusterBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewCreateDockerRegionalClusterInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewCreateDockerRegionalClusterOK creates a CreateDockerRegionalClusterOK with default headers values -func NewCreateDockerRegionalClusterOK() *CreateDockerRegionalClusterOK { - return &CreateDockerRegionalClusterOK{} -} - -/* -CreateDockerRegionalClusterOK handles this case with default header values. - -Creating regional cluster started successfully -*/ -type CreateDockerRegionalClusterOK struct { - Payload string -} - -func (o *CreateDockerRegionalClusterOK) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/create][%d] createDockerRegionalClusterOK %+v", 200, o.Payload) -} - -func (o *CreateDockerRegionalClusterOK) GetPayload() string { - return o.Payload -} - -func (o *CreateDockerRegionalClusterOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateDockerRegionalClusterBadRequest creates a CreateDockerRegionalClusterBadRequest with default headers values -func NewCreateDockerRegionalClusterBadRequest() *CreateDockerRegionalClusterBadRequest { - return &CreateDockerRegionalClusterBadRequest{} -} - -/* -CreateDockerRegionalClusterBadRequest handles this case with default header values. - -Bad request -*/ -type CreateDockerRegionalClusterBadRequest struct { - Payload *models.Error -} - -func (o *CreateDockerRegionalClusterBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/create][%d] createDockerRegionalClusterBadRequest %+v", 400, o.Payload) -} - -func (o *CreateDockerRegionalClusterBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateDockerRegionalClusterBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateDockerRegionalClusterInternalServerError creates a CreateDockerRegionalClusterInternalServerError with default headers values -func NewCreateDockerRegionalClusterInternalServerError() *CreateDockerRegionalClusterInternalServerError { - return &CreateDockerRegionalClusterInternalServerError{} -} - -/* -CreateDockerRegionalClusterInternalServerError handles this case with default header values. - -Internal server error -*/ -type CreateDockerRegionalClusterInternalServerError struct { - Payload *models.Error -} - -func (o *CreateDockerRegionalClusterInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/create][%d] createDockerRegionalClusterInternalServerError %+v", 500, o.Payload) -} - -func (o *CreateDockerRegionalClusterInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateDockerRegionalClusterInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/docker/docker_client.go b/tkg/web/server/client/docker/docker_client.go deleted file mode 100644 index f431172c6c..0000000000 --- a/tkg/web/server/client/docker/docker_client.go +++ /dev/null @@ -1,202 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new docker API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for docker API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -ApplyTKGConfigForDocker applies the changes to t k g configuration file for docker -*/ -func (a *Client) ApplyTKGConfigForDocker(params *ApplyTKGConfigForDockerParams) (*ApplyTKGConfigForDockerOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewApplyTKGConfigForDockerParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "applyTKGConfigForDocker", - Method: "POST", - PathPattern: "/api/providers/docker/tkgconfig", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ApplyTKGConfigForDockerReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ApplyTKGConfigForDockerOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for applyTKGConfigForDocker: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -CheckIfDockerDaemonAvailable checks if docker deamon is available -*/ -func (a *Client) CheckIfDockerDaemonAvailable(params *CheckIfDockerDaemonAvailableParams) (*CheckIfDockerDaemonAvailableOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewCheckIfDockerDaemonAvailableParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "checkIfDockerDaemonAvailable", - Method: "GET", - PathPattern: "/api/providers/docker/daemon", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &CheckIfDockerDaemonAvailableReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*CheckIfDockerDaemonAvailableOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for checkIfDockerDaemonAvailable: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -CreateDockerRegionalCluster creates docker regional cluster -*/ -func (a *Client) CreateDockerRegionalCluster(params *CreateDockerRegionalClusterParams) (*CreateDockerRegionalClusterOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewCreateDockerRegionalClusterParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "createDockerRegionalCluster", - Method: "POST", - PathPattern: "/api/providers/docker/create", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &CreateDockerRegionalClusterReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*CreateDockerRegionalClusterOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for createDockerRegionalCluster: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -ExportTKGConfigForDocker generates t k g configuration file for docker -*/ -func (a *Client) ExportTKGConfigForDocker(params *ExportTKGConfigForDockerParams) (*ExportTKGConfigForDockerOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewExportTKGConfigForDockerParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "exportTKGConfigForDocker", - Method: "POST", - PathPattern: "/api/providers/docker/config/export", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ExportTKGConfigForDockerReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ExportTKGConfigForDockerOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for exportTKGConfigForDocker: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -ImportTKGConfigForDocker generates t k g configuration object for docker -*/ -func (a *Client) ImportTKGConfigForDocker(params *ImportTKGConfigForDockerParams) (*ImportTKGConfigForDockerOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewImportTKGConfigForDockerParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "importTKGConfigForDocker", - Method: "POST", - PathPattern: "/api/providers/docker/config/import", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ImportTKGConfigForDockerReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ImportTKGConfigForDockerOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for importTKGConfigForDocker: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/tkg/web/server/client/docker/export_t_k_g_config_for_docker_parameters.go b/tkg/web/server/client/docker/export_t_k_g_config_for_docker_parameters.go deleted file mode 100644 index 419d503034..0000000000 --- a/tkg/web/server/client/docker/export_t_k_g_config_for_docker_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewExportTKGConfigForDockerParams creates a new ExportTKGConfigForDockerParams object -// with the default values initialized. -func NewExportTKGConfigForDockerParams() *ExportTKGConfigForDockerParams { - var () - return &ExportTKGConfigForDockerParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewExportTKGConfigForDockerParamsWithTimeout creates a new ExportTKGConfigForDockerParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewExportTKGConfigForDockerParamsWithTimeout(timeout time.Duration) *ExportTKGConfigForDockerParams { - var () - return &ExportTKGConfigForDockerParams{ - - timeout: timeout, - } -} - -// NewExportTKGConfigForDockerParamsWithContext creates a new ExportTKGConfigForDockerParams object -// with the default values initialized, and the ability to set a context for a request -func NewExportTKGConfigForDockerParamsWithContext(ctx context.Context) *ExportTKGConfigForDockerParams { - var () - return &ExportTKGConfigForDockerParams{ - - Context: ctx, - } -} - -// NewExportTKGConfigForDockerParamsWithHTTPClient creates a new ExportTKGConfigForDockerParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewExportTKGConfigForDockerParamsWithHTTPClient(client *http.Client) *ExportTKGConfigForDockerParams { - var () - return &ExportTKGConfigForDockerParams{ - HTTPClient: client, - } -} - -/* -ExportTKGConfigForDockerParams contains all the parameters to send to the API endpoint -for the export t k g config for docker operation typically these are written to a http.Request -*/ -type ExportTKGConfigForDockerParams struct { - - /*Params - parameters to generate TKG configuration file for Docker - - */ - Params *models.DockerRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the export t k g config for docker params -func (o *ExportTKGConfigForDockerParams) WithTimeout(timeout time.Duration) *ExportTKGConfigForDockerParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the export t k g config for docker params -func (o *ExportTKGConfigForDockerParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the export t k g config for docker params -func (o *ExportTKGConfigForDockerParams) WithContext(ctx context.Context) *ExportTKGConfigForDockerParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the export t k g config for docker params -func (o *ExportTKGConfigForDockerParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the export t k g config for docker params -func (o *ExportTKGConfigForDockerParams) WithHTTPClient(client *http.Client) *ExportTKGConfigForDockerParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the export t k g config for docker params -func (o *ExportTKGConfigForDockerParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the export t k g config for docker params -func (o *ExportTKGConfigForDockerParams) WithParams(params *models.DockerRegionalClusterParams) *ExportTKGConfigForDockerParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the export t k g config for docker params -func (o *ExportTKGConfigForDockerParams) SetParams(params *models.DockerRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ExportTKGConfigForDockerParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/docker/export_t_k_g_config_for_docker_responses.go b/tkg/web/server/client/docker/export_t_k_g_config_for_docker_responses.go deleted file mode 100644 index bf3406611d..0000000000 --- a/tkg/web/server/client/docker/export_t_k_g_config_for_docker_responses.go +++ /dev/null @@ -1,149 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ExportTKGConfigForDockerReader is a Reader for the ExportTKGConfigForDocker structure. -type ExportTKGConfigForDockerReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ExportTKGConfigForDockerReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewExportTKGConfigForDockerOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewExportTKGConfigForDockerBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewExportTKGConfigForDockerInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewExportTKGConfigForDockerOK creates a ExportTKGConfigForDockerOK with default headers values -func NewExportTKGConfigForDockerOK() *ExportTKGConfigForDockerOK { - return &ExportTKGConfigForDockerOK{} -} - -/* -ExportTKGConfigForDockerOK handles this case with default header values. - -Generated TKG configuration successfully -*/ -type ExportTKGConfigForDockerOK struct { - Payload string -} - -func (o *ExportTKGConfigForDockerOK) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/config/export][%d] exportTKGConfigForDockerOK %+v", 200, o.Payload) -} - -func (o *ExportTKGConfigForDockerOK) GetPayload() string { - return o.Payload -} - -func (o *ExportTKGConfigForDockerOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewExportTKGConfigForDockerBadRequest creates a ExportTKGConfigForDockerBadRequest with default headers values -func NewExportTKGConfigForDockerBadRequest() *ExportTKGConfigForDockerBadRequest { - return &ExportTKGConfigForDockerBadRequest{} -} - -/* -ExportTKGConfigForDockerBadRequest handles this case with default header values. - -Bad request -*/ -type ExportTKGConfigForDockerBadRequest struct { - Payload *models.Error -} - -func (o *ExportTKGConfigForDockerBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/config/export][%d] exportTKGConfigForDockerBadRequest %+v", 400, o.Payload) -} - -func (o *ExportTKGConfigForDockerBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ExportTKGConfigForDockerBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewExportTKGConfigForDockerInternalServerError creates a ExportTKGConfigForDockerInternalServerError with default headers values -func NewExportTKGConfigForDockerInternalServerError() *ExportTKGConfigForDockerInternalServerError { - return &ExportTKGConfigForDockerInternalServerError{} -} - -/* -ExportTKGConfigForDockerInternalServerError handles this case with default header values. - -Internal server error -*/ -type ExportTKGConfigForDockerInternalServerError struct { - Payload *models.Error -} - -func (o *ExportTKGConfigForDockerInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/config/export][%d] exportTKGConfigForDockerInternalServerError %+v", 500, o.Payload) -} - -func (o *ExportTKGConfigForDockerInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ExportTKGConfigForDockerInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/docker/import_t_k_g_config_for_docker_parameters.go b/tkg/web/server/client/docker/import_t_k_g_config_for_docker_parameters.go deleted file mode 100644 index 4270221f78..0000000000 --- a/tkg/web/server/client/docker/import_t_k_g_config_for_docker_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewImportTKGConfigForDockerParams creates a new ImportTKGConfigForDockerParams object -// with the default values initialized. -func NewImportTKGConfigForDockerParams() *ImportTKGConfigForDockerParams { - var () - return &ImportTKGConfigForDockerParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewImportTKGConfigForDockerParamsWithTimeout creates a new ImportTKGConfigForDockerParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewImportTKGConfigForDockerParamsWithTimeout(timeout time.Duration) *ImportTKGConfigForDockerParams { - var () - return &ImportTKGConfigForDockerParams{ - - timeout: timeout, - } -} - -// NewImportTKGConfigForDockerParamsWithContext creates a new ImportTKGConfigForDockerParams object -// with the default values initialized, and the ability to set a context for a request -func NewImportTKGConfigForDockerParamsWithContext(ctx context.Context) *ImportTKGConfigForDockerParams { - var () - return &ImportTKGConfigForDockerParams{ - - Context: ctx, - } -} - -// NewImportTKGConfigForDockerParamsWithHTTPClient creates a new ImportTKGConfigForDockerParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewImportTKGConfigForDockerParamsWithHTTPClient(client *http.Client) *ImportTKGConfigForDockerParams { - var () - return &ImportTKGConfigForDockerParams{ - HTTPClient: client, - } -} - -/* -ImportTKGConfigForDockerParams contains all the parameters to send to the API endpoint -for the import t k g config for docker operation typically these are written to a http.Request -*/ -type ImportTKGConfigForDockerParams struct { - - /*Params - config file from which to generate tkg configuration for docker - - */ - Params *models.ConfigFile - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the import t k g config for docker params -func (o *ImportTKGConfigForDockerParams) WithTimeout(timeout time.Duration) *ImportTKGConfigForDockerParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the import t k g config for docker params -func (o *ImportTKGConfigForDockerParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the import t k g config for docker params -func (o *ImportTKGConfigForDockerParams) WithContext(ctx context.Context) *ImportTKGConfigForDockerParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the import t k g config for docker params -func (o *ImportTKGConfigForDockerParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the import t k g config for docker params -func (o *ImportTKGConfigForDockerParams) WithHTTPClient(client *http.Client) *ImportTKGConfigForDockerParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the import t k g config for docker params -func (o *ImportTKGConfigForDockerParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the import t k g config for docker params -func (o *ImportTKGConfigForDockerParams) WithParams(params *models.ConfigFile) *ImportTKGConfigForDockerParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the import t k g config for docker params -func (o *ImportTKGConfigForDockerParams) SetParams(params *models.ConfigFile) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ImportTKGConfigForDockerParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/docker/import_t_k_g_config_for_docker_responses.go b/tkg/web/server/client/docker/import_t_k_g_config_for_docker_responses.go deleted file mode 100644 index 39dd410038..0000000000 --- a/tkg/web/server/client/docker/import_t_k_g_config_for_docker_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ImportTKGConfigForDockerReader is a Reader for the ImportTKGConfigForDocker structure. -type ImportTKGConfigForDockerReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ImportTKGConfigForDockerReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewImportTKGConfigForDockerOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewImportTKGConfigForDockerBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewImportTKGConfigForDockerUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewImportTKGConfigForDockerInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewImportTKGConfigForDockerOK creates a ImportTKGConfigForDockerOK with default headers values -func NewImportTKGConfigForDockerOK() *ImportTKGConfigForDockerOK { - return &ImportTKGConfigForDockerOK{} -} - -/* -ImportTKGConfigForDockerOK handles this case with default header values. - -Generated TKG configuration successfully -*/ -type ImportTKGConfigForDockerOK struct { - Payload *models.DockerRegionalClusterParams -} - -func (o *ImportTKGConfigForDockerOK) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/config/import][%d] importTKGConfigForDockerOK %+v", 200, o.Payload) -} - -func (o *ImportTKGConfigForDockerOK) GetPayload() *models.DockerRegionalClusterParams { - return o.Payload -} - -func (o *ImportTKGConfigForDockerOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.DockerRegionalClusterParams) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForDockerBadRequest creates a ImportTKGConfigForDockerBadRequest with default headers values -func NewImportTKGConfigForDockerBadRequest() *ImportTKGConfigForDockerBadRequest { - return &ImportTKGConfigForDockerBadRequest{} -} - -/* -ImportTKGConfigForDockerBadRequest handles this case with default header values. - -Bad request -*/ -type ImportTKGConfigForDockerBadRequest struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForDockerBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/config/import][%d] importTKGConfigForDockerBadRequest %+v", 400, o.Payload) -} - -func (o *ImportTKGConfigForDockerBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForDockerBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForDockerUnauthorized creates a ImportTKGConfigForDockerUnauthorized with default headers values -func NewImportTKGConfigForDockerUnauthorized() *ImportTKGConfigForDockerUnauthorized { - return &ImportTKGConfigForDockerUnauthorized{} -} - -/* -ImportTKGConfigForDockerUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type ImportTKGConfigForDockerUnauthorized struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForDockerUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/config/import][%d] importTKGConfigForDockerUnauthorized %+v", 401, o.Payload) -} - -func (o *ImportTKGConfigForDockerUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForDockerUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForDockerInternalServerError creates a ImportTKGConfigForDockerInternalServerError with default headers values -func NewImportTKGConfigForDockerInternalServerError() *ImportTKGConfigForDockerInternalServerError { - return &ImportTKGConfigForDockerInternalServerError{} -} - -/* -ImportTKGConfigForDockerInternalServerError handles this case with default header values. - -Internal server error -*/ -type ImportTKGConfigForDockerInternalServerError struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForDockerInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/docker/config/import][%d] importTKGConfigForDockerInternalServerError %+v", 500, o.Payload) -} - -func (o *ImportTKGConfigForDockerInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForDockerInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/edition/edition_client.go b/tkg/web/server/client/edition/edition_client.go deleted file mode 100644 index 13267431b0..0000000000 --- a/tkg/web/server/client/edition/edition_client.go +++ /dev/null @@ -1,66 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package edition - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new edition API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for edition API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -GetTanzuEdition retrieves tanzu edition -*/ -func (a *Client) GetTanzuEdition(params *GetTanzuEditionParams) (*GetTanzuEditionOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetTanzuEditionParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getTanzuEdition", - Method: "GET", - PathPattern: "/api/edition", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetTanzuEditionReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetTanzuEditionOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getTanzuEdition: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/tkg/web/server/client/edition/get_tanzu_edition_parameters.go b/tkg/web/server/client/edition/get_tanzu_edition_parameters.go deleted file mode 100644 index 5876de1f33..0000000000 --- a/tkg/web/server/client/edition/get_tanzu_edition_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package edition - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetTanzuEditionParams creates a new GetTanzuEditionParams object -// with the default values initialized. -func NewGetTanzuEditionParams() *GetTanzuEditionParams { - - return &GetTanzuEditionParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetTanzuEditionParamsWithTimeout creates a new GetTanzuEditionParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetTanzuEditionParamsWithTimeout(timeout time.Duration) *GetTanzuEditionParams { - - return &GetTanzuEditionParams{ - - timeout: timeout, - } -} - -// NewGetTanzuEditionParamsWithContext creates a new GetTanzuEditionParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetTanzuEditionParamsWithContext(ctx context.Context) *GetTanzuEditionParams { - - return &GetTanzuEditionParams{ - - Context: ctx, - } -} - -// NewGetTanzuEditionParamsWithHTTPClient creates a new GetTanzuEditionParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetTanzuEditionParamsWithHTTPClient(client *http.Client) *GetTanzuEditionParams { - - return &GetTanzuEditionParams{ - HTTPClient: client, - } -} - -/* -GetTanzuEditionParams contains all the parameters to send to the API endpoint -for the get tanzu edition operation typically these are written to a http.Request -*/ -type GetTanzuEditionParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get tanzu edition params -func (o *GetTanzuEditionParams) WithTimeout(timeout time.Duration) *GetTanzuEditionParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get tanzu edition params -func (o *GetTanzuEditionParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get tanzu edition params -func (o *GetTanzuEditionParams) WithContext(ctx context.Context) *GetTanzuEditionParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get tanzu edition params -func (o *GetTanzuEditionParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get tanzu edition params -func (o *GetTanzuEditionParams) WithHTTPClient(client *http.Client) *GetTanzuEditionParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get tanzu edition params -func (o *GetTanzuEditionParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetTanzuEditionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/edition/get_tanzu_edition_responses.go b/tkg/web/server/client/edition/get_tanzu_edition_responses.go deleted file mode 100644 index 0516a03313..0000000000 --- a/tkg/web/server/client/edition/get_tanzu_edition_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package edition - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetTanzuEditionReader is a Reader for the GetTanzuEdition structure. -type GetTanzuEditionReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetTanzuEditionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetTanzuEditionOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetTanzuEditionBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetTanzuEditionUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetTanzuEditionInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetTanzuEditionOK creates a GetTanzuEditionOK with default headers values -func NewGetTanzuEditionOK() *GetTanzuEditionOK { - return &GetTanzuEditionOK{} -} - -/* -GetTanzuEditionOK handles this case with default header values. - -Successful retrieval of tanzu edition -*/ -type GetTanzuEditionOK struct { - Payload string -} - -func (o *GetTanzuEditionOK) Error() string { - return fmt.Sprintf("[GET /api/edition][%d] getTanzuEditionOK %+v", 200, o.Payload) -} - -func (o *GetTanzuEditionOK) GetPayload() string { - return o.Payload -} - -func (o *GetTanzuEditionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetTanzuEditionBadRequest creates a GetTanzuEditionBadRequest with default headers values -func NewGetTanzuEditionBadRequest() *GetTanzuEditionBadRequest { - return &GetTanzuEditionBadRequest{} -} - -/* -GetTanzuEditionBadRequest handles this case with default header values. - -Bad Request -*/ -type GetTanzuEditionBadRequest struct { - Payload *models.Error -} - -func (o *GetTanzuEditionBadRequest) Error() string { - return fmt.Sprintf("[GET /api/edition][%d] getTanzuEditionBadRequest %+v", 400, o.Payload) -} - -func (o *GetTanzuEditionBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetTanzuEditionBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetTanzuEditionUnauthorized creates a GetTanzuEditionUnauthorized with default headers values -func NewGetTanzuEditionUnauthorized() *GetTanzuEditionUnauthorized { - return &GetTanzuEditionUnauthorized{} -} - -/* -GetTanzuEditionUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetTanzuEditionUnauthorized struct { - Payload *models.Error -} - -func (o *GetTanzuEditionUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/edition][%d] getTanzuEditionUnauthorized %+v", 401, o.Payload) -} - -func (o *GetTanzuEditionUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetTanzuEditionUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetTanzuEditionInternalServerError creates a GetTanzuEditionInternalServerError with default headers values -func NewGetTanzuEditionInternalServerError() *GetTanzuEditionInternalServerError { - return &GetTanzuEditionInternalServerError{} -} - -/* -GetTanzuEditionInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetTanzuEditionInternalServerError struct { - Payload *models.Error -} - -func (o *GetTanzuEditionInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/edition][%d] getTanzuEditionInternalServerError %+v", 500, o.Payload) -} - -func (o *GetTanzuEditionInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetTanzuEditionInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/features/features_client.go b/tkg/web/server/client/features/features_client.go deleted file mode 100644 index eabe8faba5..0000000000 --- a/tkg/web/server/client/features/features_client.go +++ /dev/null @@ -1,66 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package features - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new features API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for features API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -GetFeatureFlags retrieves list of features -*/ -func (a *Client) GetFeatureFlags(params *GetFeatureFlagsParams) (*GetFeatureFlagsOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetFeatureFlagsParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getFeatureFlags", - Method: "GET", - PathPattern: "/api/features", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetFeatureFlagsReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetFeatureFlagsOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getFeatureFlags: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/tkg/web/server/client/features/get_feature_flags_parameters.go b/tkg/web/server/client/features/get_feature_flags_parameters.go deleted file mode 100644 index bf152e2979..0000000000 --- a/tkg/web/server/client/features/get_feature_flags_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package features - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetFeatureFlagsParams creates a new GetFeatureFlagsParams object -// with the default values initialized. -func NewGetFeatureFlagsParams() *GetFeatureFlagsParams { - - return &GetFeatureFlagsParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetFeatureFlagsParamsWithTimeout creates a new GetFeatureFlagsParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetFeatureFlagsParamsWithTimeout(timeout time.Duration) *GetFeatureFlagsParams { - - return &GetFeatureFlagsParams{ - - timeout: timeout, - } -} - -// NewGetFeatureFlagsParamsWithContext creates a new GetFeatureFlagsParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetFeatureFlagsParamsWithContext(ctx context.Context) *GetFeatureFlagsParams { - - return &GetFeatureFlagsParams{ - - Context: ctx, - } -} - -// NewGetFeatureFlagsParamsWithHTTPClient creates a new GetFeatureFlagsParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetFeatureFlagsParamsWithHTTPClient(client *http.Client) *GetFeatureFlagsParams { - - return &GetFeatureFlagsParams{ - HTTPClient: client, - } -} - -/* -GetFeatureFlagsParams contains all the parameters to send to the API endpoint -for the get feature flags operation typically these are written to a http.Request -*/ -type GetFeatureFlagsParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get feature flags params -func (o *GetFeatureFlagsParams) WithTimeout(timeout time.Duration) *GetFeatureFlagsParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get feature flags params -func (o *GetFeatureFlagsParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get feature flags params -func (o *GetFeatureFlagsParams) WithContext(ctx context.Context) *GetFeatureFlagsParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get feature flags params -func (o *GetFeatureFlagsParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get feature flags params -func (o *GetFeatureFlagsParams) WithHTTPClient(client *http.Client) *GetFeatureFlagsParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get feature flags params -func (o *GetFeatureFlagsParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetFeatureFlagsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/features/get_feature_flags_responses.go b/tkg/web/server/client/features/get_feature_flags_responses.go deleted file mode 100644 index 244b5edbec..0000000000 --- a/tkg/web/server/client/features/get_feature_flags_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package features - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetFeatureFlagsReader is a Reader for the GetFeatureFlags structure. -type GetFeatureFlagsReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetFeatureFlagsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetFeatureFlagsOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetFeatureFlagsBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetFeatureFlagsUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetFeatureFlagsInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetFeatureFlagsOK creates a GetFeatureFlagsOK with default headers values -func NewGetFeatureFlagsOK() *GetFeatureFlagsOK { - return &GetFeatureFlagsOK{} -} - -/* -GetFeatureFlagsOK handles this case with default header values. - -Successful retrieval of feature flags -*/ -type GetFeatureFlagsOK struct { - Payload models.Features -} - -func (o *GetFeatureFlagsOK) Error() string { - return fmt.Sprintf("[GET /api/features][%d] getFeatureFlagsOK %+v", 200, o.Payload) -} - -func (o *GetFeatureFlagsOK) GetPayload() models.Features { - return o.Payload -} - -func (o *GetFeatureFlagsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetFeatureFlagsBadRequest creates a GetFeatureFlagsBadRequest with default headers values -func NewGetFeatureFlagsBadRequest() *GetFeatureFlagsBadRequest { - return &GetFeatureFlagsBadRequest{} -} - -/* -GetFeatureFlagsBadRequest handles this case with default header values. - -Bad Request -*/ -type GetFeatureFlagsBadRequest struct { - Payload *models.Error -} - -func (o *GetFeatureFlagsBadRequest) Error() string { - return fmt.Sprintf("[GET /api/features][%d] getFeatureFlagsBadRequest %+v", 400, o.Payload) -} - -func (o *GetFeatureFlagsBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetFeatureFlagsBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetFeatureFlagsUnauthorized creates a GetFeatureFlagsUnauthorized with default headers values -func NewGetFeatureFlagsUnauthorized() *GetFeatureFlagsUnauthorized { - return &GetFeatureFlagsUnauthorized{} -} - -/* -GetFeatureFlagsUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetFeatureFlagsUnauthorized struct { - Payload *models.Error -} - -func (o *GetFeatureFlagsUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/features][%d] getFeatureFlagsUnauthorized %+v", 401, o.Payload) -} - -func (o *GetFeatureFlagsUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetFeatureFlagsUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetFeatureFlagsInternalServerError creates a GetFeatureFlagsInternalServerError with default headers values -func NewGetFeatureFlagsInternalServerError() *GetFeatureFlagsInternalServerError { - return &GetFeatureFlagsInternalServerError{} -} - -/* -GetFeatureFlagsInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetFeatureFlagsInternalServerError struct { - Payload *models.Error -} - -func (o *GetFeatureFlagsInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/features][%d] getFeatureFlagsInternalServerError %+v", 500, o.Payload) -} - -func (o *GetFeatureFlagsInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetFeatureFlagsInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/kickstart_ui_client.go b/tkg/web/server/client/kickstart_ui_client.go deleted file mode 100644 index 1611c3c5a4..0000000000 --- a/tkg/web/server/client/kickstart_ui_client.go +++ /dev/null @@ -1,180 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package client - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "github.com/go-openapi/runtime" - httptransport "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/client/avi" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/client/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/client/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/client/docker" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/client/edition" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/client/features" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/client/ldap" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/client/provider" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/client/ui" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/client/vsphere" -) - -// Default kickstart UI HTTP client. -var Default = NewHTTPClient(nil) - -const ( - // DefaultHost is the default Host - // found in Meta (info) section of spec file - DefaultHost string = "localhost" - // DefaultBasePath is the default BasePath - // found in Meta (info) section of spec file - DefaultBasePath string = "/" -) - -// DefaultSchemes are the default schemes found in Meta (info) section of spec file -var DefaultSchemes = []string{"http", "https"} - -// NewHTTPClient creates a new kickstart UI HTTP client. -func NewHTTPClient(formats strfmt.Registry) *KickstartUI { - return NewHTTPClientWithConfig(formats, nil) -} - -// NewHTTPClientWithConfig creates a new kickstart UI HTTP client, -// using a customizable transport config. -func NewHTTPClientWithConfig(formats strfmt.Registry, cfg *TransportConfig) *KickstartUI { - // ensure nullable parameters have default - if cfg == nil { - cfg = DefaultTransportConfig() - } - - // create transport and client - transport := httptransport.New(cfg.Host, cfg.BasePath, cfg.Schemes) - return New(transport, formats) -} - -// New creates a new kickstart UI client -func New(transport runtime.ClientTransport, formats strfmt.Registry) *KickstartUI { - // ensure nullable parameters have default - if formats == nil { - formats = strfmt.Default - } - - cli := new(KickstartUI) - cli.Transport = transport - - cli.Avi = avi.New(transport, formats) - - cli.Aws = aws.New(transport, formats) - - cli.Azure = azure.New(transport, formats) - - cli.Docker = docker.New(transport, formats) - - cli.Edition = edition.New(transport, formats) - - cli.Features = features.New(transport, formats) - - cli.Ldap = ldap.New(transport, formats) - - cli.Provider = provider.New(transport, formats) - - cli.UI = ui.New(transport, formats) - - cli.Vsphere = vsphere.New(transport, formats) - - return cli -} - -// DefaultTransportConfig creates a TransportConfig with the -// default settings taken from the meta section of the spec file. -func DefaultTransportConfig() *TransportConfig { - return &TransportConfig{ - Host: DefaultHost, - BasePath: DefaultBasePath, - Schemes: DefaultSchemes, - } -} - -// TransportConfig contains the transport related info, -// found in the meta section of the spec file. -type TransportConfig struct { - Host string - BasePath string - Schemes []string -} - -// WithHost overrides the default host, -// provided by the meta section of the spec file. -func (cfg *TransportConfig) WithHost(host string) *TransportConfig { - cfg.Host = host - return cfg -} - -// WithBasePath overrides the default basePath, -// provided by the meta section of the spec file. -func (cfg *TransportConfig) WithBasePath(basePath string) *TransportConfig { - cfg.BasePath = basePath - return cfg -} - -// WithSchemes overrides the default schemes, -// provided by the meta section of the spec file. -func (cfg *TransportConfig) WithSchemes(schemes []string) *TransportConfig { - cfg.Schemes = schemes - return cfg -} - -// KickstartUI is a client for kickstart UI -type KickstartUI struct { - Avi *avi.Client - - Aws *aws.Client - - Azure *azure.Client - - Docker *docker.Client - - Edition *edition.Client - - Features *features.Client - - Ldap *ldap.Client - - Provider *provider.Client - - UI *ui.Client - - Vsphere *vsphere.Client - - Transport runtime.ClientTransport -} - -// SetTransport changes the transport on the client and all its subresources -func (c *KickstartUI) SetTransport(transport runtime.ClientTransport) { - c.Transport = transport - - c.Avi.SetTransport(transport) - - c.Aws.SetTransport(transport) - - c.Azure.SetTransport(transport) - - c.Docker.SetTransport(transport) - - c.Edition.SetTransport(transport) - - c.Features.SetTransport(transport) - - c.Ldap.SetTransport(transport) - - c.Provider.SetTransport(transport) - - c.UI.SetTransport(transport) - - c.Vsphere.SetTransport(transport) - -} diff --git a/tkg/web/server/client/ldap/ldap_client.go b/tkg/web/server/client/ldap/ldap_client.go deleted file mode 100644 index b9b3177b26..0000000000 --- a/tkg/web/server/client/ldap/ldap_client.go +++ /dev/null @@ -1,202 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new ldap API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for ldap API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -VerifyLdapBind validates l d a p bind or authentication -*/ -func (a *Client) VerifyLdapBind(params *VerifyLdapBindParams) (*VerifyLdapBindOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewVerifyLdapBindParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "verifyLdapBind", - Method: "POST", - PathPattern: "/api/ldap/bind", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &VerifyLdapBindReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*VerifyLdapBindOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for verifyLdapBind: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -VerifyLdapCloseConnection validates if the l d a p connection can be closed -*/ -func (a *Client) VerifyLdapCloseConnection(params *VerifyLdapCloseConnectionParams) (*VerifyLdapCloseConnectionCreated, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewVerifyLdapCloseConnectionParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "verifyLdapCloseConnection", - Method: "POST", - PathPattern: "/api/ldap/disconnect", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &VerifyLdapCloseConnectionReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*VerifyLdapCloseConnectionCreated) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for verifyLdapCloseConnection: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -VerifyLdapConnect validates l d a p connection -*/ -func (a *Client) VerifyLdapConnect(params *VerifyLdapConnectParams) (*VerifyLdapConnectOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewVerifyLdapConnectParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "verifyLdapConnect", - Method: "POST", - PathPattern: "/api/ldap/connect", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &VerifyLdapConnectReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*VerifyLdapConnectOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for verifyLdapConnect: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -VerifyLdapGroupSearch validates l d a p group search configuration -*/ -func (a *Client) VerifyLdapGroupSearch(params *VerifyLdapGroupSearchParams) (*VerifyLdapGroupSearchOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewVerifyLdapGroupSearchParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "verifyLdapGroupSearch", - Method: "POST", - PathPattern: "/api/ldap/groups/search", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &VerifyLdapGroupSearchReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*VerifyLdapGroupSearchOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for verifyLdapGroupSearch: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -VerifyLdapUserSearch validates l d a p user search configuration -*/ -func (a *Client) VerifyLdapUserSearch(params *VerifyLdapUserSearchParams) (*VerifyLdapUserSearchOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewVerifyLdapUserSearchParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "verifyLdapUserSearch", - Method: "POST", - PathPattern: "/api/ldap/users/search", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &VerifyLdapUserSearchReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*VerifyLdapUserSearchOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for verifyLdapUserSearch: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/tkg/web/server/client/ldap/verify_ldap_bind_parameters.go b/tkg/web/server/client/ldap/verify_ldap_bind_parameters.go deleted file mode 100644 index 1129189647..0000000000 --- a/tkg/web/server/client/ldap/verify_ldap_bind_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewVerifyLdapBindParams creates a new VerifyLdapBindParams object -// with the default values initialized. -func NewVerifyLdapBindParams() *VerifyLdapBindParams { - - return &VerifyLdapBindParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewVerifyLdapBindParamsWithTimeout creates a new VerifyLdapBindParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewVerifyLdapBindParamsWithTimeout(timeout time.Duration) *VerifyLdapBindParams { - - return &VerifyLdapBindParams{ - - timeout: timeout, - } -} - -// NewVerifyLdapBindParamsWithContext creates a new VerifyLdapBindParams object -// with the default values initialized, and the ability to set a context for a request -func NewVerifyLdapBindParamsWithContext(ctx context.Context) *VerifyLdapBindParams { - - return &VerifyLdapBindParams{ - - Context: ctx, - } -} - -// NewVerifyLdapBindParamsWithHTTPClient creates a new VerifyLdapBindParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewVerifyLdapBindParamsWithHTTPClient(client *http.Client) *VerifyLdapBindParams { - - return &VerifyLdapBindParams{ - HTTPClient: client, - } -} - -/* -VerifyLdapBindParams contains all the parameters to send to the API endpoint -for the verify ldap bind operation typically these are written to a http.Request -*/ -type VerifyLdapBindParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the verify ldap bind params -func (o *VerifyLdapBindParams) WithTimeout(timeout time.Duration) *VerifyLdapBindParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the verify ldap bind params -func (o *VerifyLdapBindParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the verify ldap bind params -func (o *VerifyLdapBindParams) WithContext(ctx context.Context) *VerifyLdapBindParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the verify ldap bind params -func (o *VerifyLdapBindParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the verify ldap bind params -func (o *VerifyLdapBindParams) WithHTTPClient(client *http.Client) *VerifyLdapBindParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the verify ldap bind params -func (o *VerifyLdapBindParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *VerifyLdapBindParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/ldap/verify_ldap_bind_responses.go b/tkg/web/server/client/ldap/verify_ldap_bind_responses.go deleted file mode 100644 index ff765d115d..0000000000 --- a/tkg/web/server/client/ldap/verify_ldap_bind_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyLdapBindReader is a Reader for the VerifyLdapBind structure. -type VerifyLdapBindReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *VerifyLdapBindReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewVerifyLdapBindOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewVerifyLdapBindBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewVerifyLdapBindUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewVerifyLdapBindInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewVerifyLdapBindOK creates a VerifyLdapBindOK with default headers values -func NewVerifyLdapBindOK() *VerifyLdapBindOK { - return &VerifyLdapBindOK{} -} - -/* -VerifyLdapBindOK handles this case with default header values. - -Verified LDAP credentials successfully -*/ -type VerifyLdapBindOK struct { - Payload *models.LdapTestResult -} - -func (o *VerifyLdapBindOK) Error() string { - return fmt.Sprintf("[POST /api/ldap/bind][%d] verifyLdapBindOK %+v", 200, o.Payload) -} - -func (o *VerifyLdapBindOK) GetPayload() *models.LdapTestResult { - return o.Payload -} - -func (o *VerifyLdapBindOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.LdapTestResult) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapBindBadRequest creates a VerifyLdapBindBadRequest with default headers values -func NewVerifyLdapBindBadRequest() *VerifyLdapBindBadRequest { - return &VerifyLdapBindBadRequest{} -} - -/* -VerifyLdapBindBadRequest handles this case with default header values. - -Bad request -*/ -type VerifyLdapBindBadRequest struct { - Payload *models.Error -} - -func (o *VerifyLdapBindBadRequest) Error() string { - return fmt.Sprintf("[POST /api/ldap/bind][%d] verifyLdapBindBadRequest %+v", 400, o.Payload) -} - -func (o *VerifyLdapBindBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapBindBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapBindUnauthorized creates a VerifyLdapBindUnauthorized with default headers values -func NewVerifyLdapBindUnauthorized() *VerifyLdapBindUnauthorized { - return &VerifyLdapBindUnauthorized{} -} - -/* -VerifyLdapBindUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type VerifyLdapBindUnauthorized struct { - Payload *models.Error -} - -func (o *VerifyLdapBindUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/ldap/bind][%d] verifyLdapBindUnauthorized %+v", 401, o.Payload) -} - -func (o *VerifyLdapBindUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapBindUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapBindInternalServerError creates a VerifyLdapBindInternalServerError with default headers values -func NewVerifyLdapBindInternalServerError() *VerifyLdapBindInternalServerError { - return &VerifyLdapBindInternalServerError{} -} - -/* -VerifyLdapBindInternalServerError handles this case with default header values. - -Internal server error -*/ -type VerifyLdapBindInternalServerError struct { - Payload *models.Error -} - -func (o *VerifyLdapBindInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/ldap/bind][%d] verifyLdapBindInternalServerError %+v", 500, o.Payload) -} - -func (o *VerifyLdapBindInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapBindInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/ldap/verify_ldap_close_connection_parameters.go b/tkg/web/server/client/ldap/verify_ldap_close_connection_parameters.go deleted file mode 100644 index 522e4e8c7d..0000000000 --- a/tkg/web/server/client/ldap/verify_ldap_close_connection_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewVerifyLdapCloseConnectionParams creates a new VerifyLdapCloseConnectionParams object -// with the default values initialized. -func NewVerifyLdapCloseConnectionParams() *VerifyLdapCloseConnectionParams { - - return &VerifyLdapCloseConnectionParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewVerifyLdapCloseConnectionParamsWithTimeout creates a new VerifyLdapCloseConnectionParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewVerifyLdapCloseConnectionParamsWithTimeout(timeout time.Duration) *VerifyLdapCloseConnectionParams { - - return &VerifyLdapCloseConnectionParams{ - - timeout: timeout, - } -} - -// NewVerifyLdapCloseConnectionParamsWithContext creates a new VerifyLdapCloseConnectionParams object -// with the default values initialized, and the ability to set a context for a request -func NewVerifyLdapCloseConnectionParamsWithContext(ctx context.Context) *VerifyLdapCloseConnectionParams { - - return &VerifyLdapCloseConnectionParams{ - - Context: ctx, - } -} - -// NewVerifyLdapCloseConnectionParamsWithHTTPClient creates a new VerifyLdapCloseConnectionParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewVerifyLdapCloseConnectionParamsWithHTTPClient(client *http.Client) *VerifyLdapCloseConnectionParams { - - return &VerifyLdapCloseConnectionParams{ - HTTPClient: client, - } -} - -/* -VerifyLdapCloseConnectionParams contains all the parameters to send to the API endpoint -for the verify ldap close connection operation typically these are written to a http.Request -*/ -type VerifyLdapCloseConnectionParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the verify ldap close connection params -func (o *VerifyLdapCloseConnectionParams) WithTimeout(timeout time.Duration) *VerifyLdapCloseConnectionParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the verify ldap close connection params -func (o *VerifyLdapCloseConnectionParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the verify ldap close connection params -func (o *VerifyLdapCloseConnectionParams) WithContext(ctx context.Context) *VerifyLdapCloseConnectionParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the verify ldap close connection params -func (o *VerifyLdapCloseConnectionParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the verify ldap close connection params -func (o *VerifyLdapCloseConnectionParams) WithHTTPClient(client *http.Client) *VerifyLdapCloseConnectionParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the verify ldap close connection params -func (o *VerifyLdapCloseConnectionParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *VerifyLdapCloseConnectionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/ldap/verify_ldap_close_connection_responses.go b/tkg/web/server/client/ldap/verify_ldap_close_connection_responses.go deleted file mode 100644 index 629eb216a9..0000000000 --- a/tkg/web/server/client/ldap/verify_ldap_close_connection_responses.go +++ /dev/null @@ -1,179 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyLdapCloseConnectionReader is a Reader for the VerifyLdapCloseConnection structure. -type VerifyLdapCloseConnectionReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *VerifyLdapCloseConnectionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 201: - result := NewVerifyLdapCloseConnectionCreated() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewVerifyLdapCloseConnectionBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewVerifyLdapCloseConnectionUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewVerifyLdapCloseConnectionInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewVerifyLdapCloseConnectionCreated creates a VerifyLdapCloseConnectionCreated with default headers values -func NewVerifyLdapCloseConnectionCreated() *VerifyLdapCloseConnectionCreated { - return &VerifyLdapCloseConnectionCreated{} -} - -/* -VerifyLdapCloseConnectionCreated handles this case with default header values. - -Verified LDAP credentials successfully -*/ -type VerifyLdapCloseConnectionCreated struct { -} - -func (o *VerifyLdapCloseConnectionCreated) Error() string { - return fmt.Sprintf("[POST /api/ldap/disconnect][%d] verifyLdapCloseConnectionCreated ", 201) -} - -func (o *VerifyLdapCloseConnectionCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - return nil -} - -// NewVerifyLdapCloseConnectionBadRequest creates a VerifyLdapCloseConnectionBadRequest with default headers values -func NewVerifyLdapCloseConnectionBadRequest() *VerifyLdapCloseConnectionBadRequest { - return &VerifyLdapCloseConnectionBadRequest{} -} - -/* -VerifyLdapCloseConnectionBadRequest handles this case with default header values. - -Bad request -*/ -type VerifyLdapCloseConnectionBadRequest struct { - Payload *models.Error -} - -func (o *VerifyLdapCloseConnectionBadRequest) Error() string { - return fmt.Sprintf("[POST /api/ldap/disconnect][%d] verifyLdapCloseConnectionBadRequest %+v", 400, o.Payload) -} - -func (o *VerifyLdapCloseConnectionBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapCloseConnectionBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapCloseConnectionUnauthorized creates a VerifyLdapCloseConnectionUnauthorized with default headers values -func NewVerifyLdapCloseConnectionUnauthorized() *VerifyLdapCloseConnectionUnauthorized { - return &VerifyLdapCloseConnectionUnauthorized{} -} - -/* -VerifyLdapCloseConnectionUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type VerifyLdapCloseConnectionUnauthorized struct { - Payload *models.Error -} - -func (o *VerifyLdapCloseConnectionUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/ldap/disconnect][%d] verifyLdapCloseConnectionUnauthorized %+v", 401, o.Payload) -} - -func (o *VerifyLdapCloseConnectionUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapCloseConnectionUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapCloseConnectionInternalServerError creates a VerifyLdapCloseConnectionInternalServerError with default headers values -func NewVerifyLdapCloseConnectionInternalServerError() *VerifyLdapCloseConnectionInternalServerError { - return &VerifyLdapCloseConnectionInternalServerError{} -} - -/* -VerifyLdapCloseConnectionInternalServerError handles this case with default header values. - -Internal server error -*/ -type VerifyLdapCloseConnectionInternalServerError struct { - Payload *models.Error -} - -func (o *VerifyLdapCloseConnectionInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/ldap/disconnect][%d] verifyLdapCloseConnectionInternalServerError %+v", 500, o.Payload) -} - -func (o *VerifyLdapCloseConnectionInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapCloseConnectionInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/ldap/verify_ldap_connect_parameters.go b/tkg/web/server/client/ldap/verify_ldap_connect_parameters.go deleted file mode 100644 index c058fa6891..0000000000 --- a/tkg/web/server/client/ldap/verify_ldap_connect_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewVerifyLdapConnectParams creates a new VerifyLdapConnectParams object -// with the default values initialized. -func NewVerifyLdapConnectParams() *VerifyLdapConnectParams { - var () - return &VerifyLdapConnectParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewVerifyLdapConnectParamsWithTimeout creates a new VerifyLdapConnectParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewVerifyLdapConnectParamsWithTimeout(timeout time.Duration) *VerifyLdapConnectParams { - var () - return &VerifyLdapConnectParams{ - - timeout: timeout, - } -} - -// NewVerifyLdapConnectParamsWithContext creates a new VerifyLdapConnectParams object -// with the default values initialized, and the ability to set a context for a request -func NewVerifyLdapConnectParamsWithContext(ctx context.Context) *VerifyLdapConnectParams { - var () - return &VerifyLdapConnectParams{ - - Context: ctx, - } -} - -// NewVerifyLdapConnectParamsWithHTTPClient creates a new VerifyLdapConnectParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewVerifyLdapConnectParamsWithHTTPClient(client *http.Client) *VerifyLdapConnectParams { - var () - return &VerifyLdapConnectParams{ - HTTPClient: client, - } -} - -/* -VerifyLdapConnectParams contains all the parameters to send to the API endpoint -for the verify ldap connect operation typically these are written to a http.Request -*/ -type VerifyLdapConnectParams struct { - - /*Credentials - LDAP configuration - - */ - Credentials *models.LdapParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the verify ldap connect params -func (o *VerifyLdapConnectParams) WithTimeout(timeout time.Duration) *VerifyLdapConnectParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the verify ldap connect params -func (o *VerifyLdapConnectParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the verify ldap connect params -func (o *VerifyLdapConnectParams) WithContext(ctx context.Context) *VerifyLdapConnectParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the verify ldap connect params -func (o *VerifyLdapConnectParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the verify ldap connect params -func (o *VerifyLdapConnectParams) WithHTTPClient(client *http.Client) *VerifyLdapConnectParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the verify ldap connect params -func (o *VerifyLdapConnectParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithCredentials adds the credentials to the verify ldap connect params -func (o *VerifyLdapConnectParams) WithCredentials(credentials *models.LdapParams) *VerifyLdapConnectParams { - o.SetCredentials(credentials) - return o -} - -// SetCredentials adds the credentials to the verify ldap connect params -func (o *VerifyLdapConnectParams) SetCredentials(credentials *models.LdapParams) { - o.Credentials = credentials -} - -// WriteToRequest writes these params to a swagger request -func (o *VerifyLdapConnectParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Credentials != nil { - if err := r.SetBodyParam(o.Credentials); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/ldap/verify_ldap_connect_responses.go b/tkg/web/server/client/ldap/verify_ldap_connect_responses.go deleted file mode 100644 index c88158e064..0000000000 --- a/tkg/web/server/client/ldap/verify_ldap_connect_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyLdapConnectReader is a Reader for the VerifyLdapConnect structure. -type VerifyLdapConnectReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *VerifyLdapConnectReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewVerifyLdapConnectOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewVerifyLdapConnectBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewVerifyLdapConnectUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewVerifyLdapConnectInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewVerifyLdapConnectOK creates a VerifyLdapConnectOK with default headers values -func NewVerifyLdapConnectOK() *VerifyLdapConnectOK { - return &VerifyLdapConnectOK{} -} - -/* -VerifyLdapConnectOK handles this case with default header values. - -Verified LDAP credentials successfully -*/ -type VerifyLdapConnectOK struct { - Payload *models.LdapTestResult -} - -func (o *VerifyLdapConnectOK) Error() string { - return fmt.Sprintf("[POST /api/ldap/connect][%d] verifyLdapConnectOK %+v", 200, o.Payload) -} - -func (o *VerifyLdapConnectOK) GetPayload() *models.LdapTestResult { - return o.Payload -} - -func (o *VerifyLdapConnectOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.LdapTestResult) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapConnectBadRequest creates a VerifyLdapConnectBadRequest with default headers values -func NewVerifyLdapConnectBadRequest() *VerifyLdapConnectBadRequest { - return &VerifyLdapConnectBadRequest{} -} - -/* -VerifyLdapConnectBadRequest handles this case with default header values. - -Bad request -*/ -type VerifyLdapConnectBadRequest struct { - Payload *models.Error -} - -func (o *VerifyLdapConnectBadRequest) Error() string { - return fmt.Sprintf("[POST /api/ldap/connect][%d] verifyLdapConnectBadRequest %+v", 400, o.Payload) -} - -func (o *VerifyLdapConnectBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapConnectBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapConnectUnauthorized creates a VerifyLdapConnectUnauthorized with default headers values -func NewVerifyLdapConnectUnauthorized() *VerifyLdapConnectUnauthorized { - return &VerifyLdapConnectUnauthorized{} -} - -/* -VerifyLdapConnectUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type VerifyLdapConnectUnauthorized struct { - Payload *models.Error -} - -func (o *VerifyLdapConnectUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/ldap/connect][%d] verifyLdapConnectUnauthorized %+v", 401, o.Payload) -} - -func (o *VerifyLdapConnectUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapConnectUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapConnectInternalServerError creates a VerifyLdapConnectInternalServerError with default headers values -func NewVerifyLdapConnectInternalServerError() *VerifyLdapConnectInternalServerError { - return &VerifyLdapConnectInternalServerError{} -} - -/* -VerifyLdapConnectInternalServerError handles this case with default header values. - -Internal server error -*/ -type VerifyLdapConnectInternalServerError struct { - Payload *models.Error -} - -func (o *VerifyLdapConnectInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/ldap/connect][%d] verifyLdapConnectInternalServerError %+v", 500, o.Payload) -} - -func (o *VerifyLdapConnectInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapConnectInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/ldap/verify_ldap_group_search_parameters.go b/tkg/web/server/client/ldap/verify_ldap_group_search_parameters.go deleted file mode 100644 index 1ec516c5cd..0000000000 --- a/tkg/web/server/client/ldap/verify_ldap_group_search_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewVerifyLdapGroupSearchParams creates a new VerifyLdapGroupSearchParams object -// with the default values initialized. -func NewVerifyLdapGroupSearchParams() *VerifyLdapGroupSearchParams { - - return &VerifyLdapGroupSearchParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewVerifyLdapGroupSearchParamsWithTimeout creates a new VerifyLdapGroupSearchParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewVerifyLdapGroupSearchParamsWithTimeout(timeout time.Duration) *VerifyLdapGroupSearchParams { - - return &VerifyLdapGroupSearchParams{ - - timeout: timeout, - } -} - -// NewVerifyLdapGroupSearchParamsWithContext creates a new VerifyLdapGroupSearchParams object -// with the default values initialized, and the ability to set a context for a request -func NewVerifyLdapGroupSearchParamsWithContext(ctx context.Context) *VerifyLdapGroupSearchParams { - - return &VerifyLdapGroupSearchParams{ - - Context: ctx, - } -} - -// NewVerifyLdapGroupSearchParamsWithHTTPClient creates a new VerifyLdapGroupSearchParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewVerifyLdapGroupSearchParamsWithHTTPClient(client *http.Client) *VerifyLdapGroupSearchParams { - - return &VerifyLdapGroupSearchParams{ - HTTPClient: client, - } -} - -/* -VerifyLdapGroupSearchParams contains all the parameters to send to the API endpoint -for the verify ldap group search operation typically these are written to a http.Request -*/ -type VerifyLdapGroupSearchParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the verify ldap group search params -func (o *VerifyLdapGroupSearchParams) WithTimeout(timeout time.Duration) *VerifyLdapGroupSearchParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the verify ldap group search params -func (o *VerifyLdapGroupSearchParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the verify ldap group search params -func (o *VerifyLdapGroupSearchParams) WithContext(ctx context.Context) *VerifyLdapGroupSearchParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the verify ldap group search params -func (o *VerifyLdapGroupSearchParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the verify ldap group search params -func (o *VerifyLdapGroupSearchParams) WithHTTPClient(client *http.Client) *VerifyLdapGroupSearchParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the verify ldap group search params -func (o *VerifyLdapGroupSearchParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *VerifyLdapGroupSearchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/ldap/verify_ldap_group_search_responses.go b/tkg/web/server/client/ldap/verify_ldap_group_search_responses.go deleted file mode 100644 index eae7722cc4..0000000000 --- a/tkg/web/server/client/ldap/verify_ldap_group_search_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyLdapGroupSearchReader is a Reader for the VerifyLdapGroupSearch structure. -type VerifyLdapGroupSearchReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *VerifyLdapGroupSearchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewVerifyLdapGroupSearchOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewVerifyLdapGroupSearchBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewVerifyLdapGroupSearchUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewVerifyLdapGroupSearchInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewVerifyLdapGroupSearchOK creates a VerifyLdapGroupSearchOK with default headers values -func NewVerifyLdapGroupSearchOK() *VerifyLdapGroupSearchOK { - return &VerifyLdapGroupSearchOK{} -} - -/* -VerifyLdapGroupSearchOK handles this case with default header values. - -Verified LDAP credentials successfully -*/ -type VerifyLdapGroupSearchOK struct { - Payload *models.LdapTestResult -} - -func (o *VerifyLdapGroupSearchOK) Error() string { - return fmt.Sprintf("[POST /api/ldap/groups/search][%d] verifyLdapGroupSearchOK %+v", 200, o.Payload) -} - -func (o *VerifyLdapGroupSearchOK) GetPayload() *models.LdapTestResult { - return o.Payload -} - -func (o *VerifyLdapGroupSearchOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.LdapTestResult) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapGroupSearchBadRequest creates a VerifyLdapGroupSearchBadRequest with default headers values -func NewVerifyLdapGroupSearchBadRequest() *VerifyLdapGroupSearchBadRequest { - return &VerifyLdapGroupSearchBadRequest{} -} - -/* -VerifyLdapGroupSearchBadRequest handles this case with default header values. - -Bad request -*/ -type VerifyLdapGroupSearchBadRequest struct { - Payload *models.Error -} - -func (o *VerifyLdapGroupSearchBadRequest) Error() string { - return fmt.Sprintf("[POST /api/ldap/groups/search][%d] verifyLdapGroupSearchBadRequest %+v", 400, o.Payload) -} - -func (o *VerifyLdapGroupSearchBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapGroupSearchBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapGroupSearchUnauthorized creates a VerifyLdapGroupSearchUnauthorized with default headers values -func NewVerifyLdapGroupSearchUnauthorized() *VerifyLdapGroupSearchUnauthorized { - return &VerifyLdapGroupSearchUnauthorized{} -} - -/* -VerifyLdapGroupSearchUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type VerifyLdapGroupSearchUnauthorized struct { - Payload *models.Error -} - -func (o *VerifyLdapGroupSearchUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/ldap/groups/search][%d] verifyLdapGroupSearchUnauthorized %+v", 401, o.Payload) -} - -func (o *VerifyLdapGroupSearchUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapGroupSearchUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapGroupSearchInternalServerError creates a VerifyLdapGroupSearchInternalServerError with default headers values -func NewVerifyLdapGroupSearchInternalServerError() *VerifyLdapGroupSearchInternalServerError { - return &VerifyLdapGroupSearchInternalServerError{} -} - -/* -VerifyLdapGroupSearchInternalServerError handles this case with default header values. - -Internal server error -*/ -type VerifyLdapGroupSearchInternalServerError struct { - Payload *models.Error -} - -func (o *VerifyLdapGroupSearchInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/ldap/groups/search][%d] verifyLdapGroupSearchInternalServerError %+v", 500, o.Payload) -} - -func (o *VerifyLdapGroupSearchInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapGroupSearchInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/ldap/verify_ldap_user_search_parameters.go b/tkg/web/server/client/ldap/verify_ldap_user_search_parameters.go deleted file mode 100644 index 5a1d52cbc8..0000000000 --- a/tkg/web/server/client/ldap/verify_ldap_user_search_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewVerifyLdapUserSearchParams creates a new VerifyLdapUserSearchParams object -// with the default values initialized. -func NewVerifyLdapUserSearchParams() *VerifyLdapUserSearchParams { - - return &VerifyLdapUserSearchParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewVerifyLdapUserSearchParamsWithTimeout creates a new VerifyLdapUserSearchParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewVerifyLdapUserSearchParamsWithTimeout(timeout time.Duration) *VerifyLdapUserSearchParams { - - return &VerifyLdapUserSearchParams{ - - timeout: timeout, - } -} - -// NewVerifyLdapUserSearchParamsWithContext creates a new VerifyLdapUserSearchParams object -// with the default values initialized, and the ability to set a context for a request -func NewVerifyLdapUserSearchParamsWithContext(ctx context.Context) *VerifyLdapUserSearchParams { - - return &VerifyLdapUserSearchParams{ - - Context: ctx, - } -} - -// NewVerifyLdapUserSearchParamsWithHTTPClient creates a new VerifyLdapUserSearchParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewVerifyLdapUserSearchParamsWithHTTPClient(client *http.Client) *VerifyLdapUserSearchParams { - - return &VerifyLdapUserSearchParams{ - HTTPClient: client, - } -} - -/* -VerifyLdapUserSearchParams contains all the parameters to send to the API endpoint -for the verify ldap user search operation typically these are written to a http.Request -*/ -type VerifyLdapUserSearchParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the verify ldap user search params -func (o *VerifyLdapUserSearchParams) WithTimeout(timeout time.Duration) *VerifyLdapUserSearchParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the verify ldap user search params -func (o *VerifyLdapUserSearchParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the verify ldap user search params -func (o *VerifyLdapUserSearchParams) WithContext(ctx context.Context) *VerifyLdapUserSearchParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the verify ldap user search params -func (o *VerifyLdapUserSearchParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the verify ldap user search params -func (o *VerifyLdapUserSearchParams) WithHTTPClient(client *http.Client) *VerifyLdapUserSearchParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the verify ldap user search params -func (o *VerifyLdapUserSearchParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *VerifyLdapUserSearchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/ldap/verify_ldap_user_search_responses.go b/tkg/web/server/client/ldap/verify_ldap_user_search_responses.go deleted file mode 100644 index 67641a95be..0000000000 --- a/tkg/web/server/client/ldap/verify_ldap_user_search_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyLdapUserSearchReader is a Reader for the VerifyLdapUserSearch structure. -type VerifyLdapUserSearchReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *VerifyLdapUserSearchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewVerifyLdapUserSearchOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewVerifyLdapUserSearchBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewVerifyLdapUserSearchUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewVerifyLdapUserSearchInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewVerifyLdapUserSearchOK creates a VerifyLdapUserSearchOK with default headers values -func NewVerifyLdapUserSearchOK() *VerifyLdapUserSearchOK { - return &VerifyLdapUserSearchOK{} -} - -/* -VerifyLdapUserSearchOK handles this case with default header values. - -Verified LDAP credentials successfully -*/ -type VerifyLdapUserSearchOK struct { - Payload *models.LdapTestResult -} - -func (o *VerifyLdapUserSearchOK) Error() string { - return fmt.Sprintf("[POST /api/ldap/users/search][%d] verifyLdapUserSearchOK %+v", 200, o.Payload) -} - -func (o *VerifyLdapUserSearchOK) GetPayload() *models.LdapTestResult { - return o.Payload -} - -func (o *VerifyLdapUserSearchOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.LdapTestResult) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapUserSearchBadRequest creates a VerifyLdapUserSearchBadRequest with default headers values -func NewVerifyLdapUserSearchBadRequest() *VerifyLdapUserSearchBadRequest { - return &VerifyLdapUserSearchBadRequest{} -} - -/* -VerifyLdapUserSearchBadRequest handles this case with default header values. - -Bad request -*/ -type VerifyLdapUserSearchBadRequest struct { - Payload *models.Error -} - -func (o *VerifyLdapUserSearchBadRequest) Error() string { - return fmt.Sprintf("[POST /api/ldap/users/search][%d] verifyLdapUserSearchBadRequest %+v", 400, o.Payload) -} - -func (o *VerifyLdapUserSearchBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapUserSearchBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapUserSearchUnauthorized creates a VerifyLdapUserSearchUnauthorized with default headers values -func NewVerifyLdapUserSearchUnauthorized() *VerifyLdapUserSearchUnauthorized { - return &VerifyLdapUserSearchUnauthorized{} -} - -/* -VerifyLdapUserSearchUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type VerifyLdapUserSearchUnauthorized struct { - Payload *models.Error -} - -func (o *VerifyLdapUserSearchUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/ldap/users/search][%d] verifyLdapUserSearchUnauthorized %+v", 401, o.Payload) -} - -func (o *VerifyLdapUserSearchUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapUserSearchUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewVerifyLdapUserSearchInternalServerError creates a VerifyLdapUserSearchInternalServerError with default headers values -func NewVerifyLdapUserSearchInternalServerError() *VerifyLdapUserSearchInternalServerError { - return &VerifyLdapUserSearchInternalServerError{} -} - -/* -VerifyLdapUserSearchInternalServerError handles this case with default header values. - -Internal server error -*/ -type VerifyLdapUserSearchInternalServerError struct { - Payload *models.Error -} - -func (o *VerifyLdapUserSearchInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/ldap/users/search][%d] verifyLdapUserSearchInternalServerError %+v", 500, o.Payload) -} - -func (o *VerifyLdapUserSearchInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *VerifyLdapUserSearchInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/provider/get_provider_parameters.go b/tkg/web/server/client/provider/get_provider_parameters.go deleted file mode 100644 index be9e23b084..0000000000 --- a/tkg/web/server/client/provider/get_provider_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package provider - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetProviderParams creates a new GetProviderParams object -// with the default values initialized. -func NewGetProviderParams() *GetProviderParams { - - return &GetProviderParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetProviderParamsWithTimeout creates a new GetProviderParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetProviderParamsWithTimeout(timeout time.Duration) *GetProviderParams { - - return &GetProviderParams{ - - timeout: timeout, - } -} - -// NewGetProviderParamsWithContext creates a new GetProviderParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetProviderParamsWithContext(ctx context.Context) *GetProviderParams { - - return &GetProviderParams{ - - Context: ctx, - } -} - -// NewGetProviderParamsWithHTTPClient creates a new GetProviderParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetProviderParamsWithHTTPClient(client *http.Client) *GetProviderParams { - - return &GetProviderParams{ - HTTPClient: client, - } -} - -/* -GetProviderParams contains all the parameters to send to the API endpoint -for the get provider operation typically these are written to a http.Request -*/ -type GetProviderParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get provider params -func (o *GetProviderParams) WithTimeout(timeout time.Duration) *GetProviderParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get provider params -func (o *GetProviderParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get provider params -func (o *GetProviderParams) WithContext(ctx context.Context) *GetProviderParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get provider params -func (o *GetProviderParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get provider params -func (o *GetProviderParams) WithHTTPClient(client *http.Client) *GetProviderParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get provider params -func (o *GetProviderParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetProviderParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/provider/get_provider_responses.go b/tkg/web/server/client/provider/get_provider_responses.go deleted file mode 100644 index 2c2e428b9f..0000000000 --- a/tkg/web/server/client/provider/get_provider_responses.go +++ /dev/null @@ -1,151 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package provider - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetProviderReader is a Reader for the GetProvider structure. -type GetProviderReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetProviderReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetProviderOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetProviderBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetProviderInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetProviderOK creates a GetProviderOK with default headers values -func NewGetProviderOK() *GetProviderOK { - return &GetProviderOK{} -} - -/* -GetProviderOK handles this case with default header values. - -Successful operation -*/ -type GetProviderOK struct { - Payload *models.ProviderInfo -} - -func (o *GetProviderOK) Error() string { - return fmt.Sprintf("[GET /api/providers][%d] getProviderOK %+v", 200, o.Payload) -} - -func (o *GetProviderOK) GetPayload() *models.ProviderInfo { - return o.Payload -} - -func (o *GetProviderOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.ProviderInfo) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetProviderBadRequest creates a GetProviderBadRequest with default headers values -func NewGetProviderBadRequest() *GetProviderBadRequest { - return &GetProviderBadRequest{} -} - -/* -GetProviderBadRequest handles this case with default header values. - -Bad request -*/ -type GetProviderBadRequest struct { - Payload *models.Error -} - -func (o *GetProviderBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers][%d] getProviderBadRequest %+v", 400, o.Payload) -} - -func (o *GetProviderBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetProviderBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetProviderInternalServerError creates a GetProviderInternalServerError with default headers values -func NewGetProviderInternalServerError() *GetProviderInternalServerError { - return &GetProviderInternalServerError{} -} - -/* -GetProviderInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetProviderInternalServerError struct { - Payload *models.Error -} - -func (o *GetProviderInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers][%d] getProviderInternalServerError %+v", 500, o.Payload) -} - -func (o *GetProviderInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetProviderInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/provider/provider_client.go b/tkg/web/server/client/provider/provider_client.go deleted file mode 100644 index 8cba5a850d..0000000000 --- a/tkg/web/server/client/provider/provider_client.go +++ /dev/null @@ -1,66 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package provider - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new provider API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for provider API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -GetProvider gets infrastructure provider given by the user via cli -*/ -func (a *Client) GetProvider(params *GetProviderParams) (*GetProviderOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetProviderParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getProvider", - Method: "GET", - PathPattern: "/api/providers", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetProviderReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetProviderOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getProvider: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/tkg/web/server/client/ui/get_ui_file_parameters.go b/tkg/web/server/client/ui/get_ui_file_parameters.go deleted file mode 100644 index 5787749f60..0000000000 --- a/tkg/web/server/client/ui/get_ui_file_parameters.go +++ /dev/null @@ -1,137 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetUIFileParams creates a new GetUIFileParams object -// with the default values initialized. -func NewGetUIFileParams() *GetUIFileParams { - var () - return &GetUIFileParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetUIFileParamsWithTimeout creates a new GetUIFileParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetUIFileParamsWithTimeout(timeout time.Duration) *GetUIFileParams { - var () - return &GetUIFileParams{ - - timeout: timeout, - } -} - -// NewGetUIFileParamsWithContext creates a new GetUIFileParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetUIFileParamsWithContext(ctx context.Context) *GetUIFileParams { - var () - return &GetUIFileParams{ - - Context: ctx, - } -} - -// NewGetUIFileParamsWithHTTPClient creates a new GetUIFileParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetUIFileParamsWithHTTPClient(client *http.Client) *GetUIFileParams { - var () - return &GetUIFileParams{ - HTTPClient: client, - } -} - -/* -GetUIFileParams contains all the parameters to send to the API endpoint -for the get UI file operation typically these are written to a http.Request -*/ -type GetUIFileParams struct { - - /*Filename - UI file name - - */ - Filename string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get UI file params -func (o *GetUIFileParams) WithTimeout(timeout time.Duration) *GetUIFileParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get UI file params -func (o *GetUIFileParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get UI file params -func (o *GetUIFileParams) WithContext(ctx context.Context) *GetUIFileParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get UI file params -func (o *GetUIFileParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get UI file params -func (o *GetUIFileParams) WithHTTPClient(client *http.Client) *GetUIFileParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get UI file params -func (o *GetUIFileParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithFilename adds the filename to the get UI file params -func (o *GetUIFileParams) WithFilename(filename string) *GetUIFileParams { - o.SetFilename(filename) - return o -} - -// SetFilename adds the filename to the get UI file params -func (o *GetUIFileParams) SetFilename(filename string) { - o.Filename = filename -} - -// WriteToRequest writes these params to a swagger request -func (o *GetUIFileParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // path param filename - if err := r.SetPathParam("filename", o.Filename); err != nil { - return err - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/ui/get_ui_file_responses.go b/tkg/web/server/client/ui/get_ui_file_responses.go deleted file mode 100644 index e9619db0fb..0000000000 --- a/tkg/web/server/client/ui/get_ui_file_responses.go +++ /dev/null @@ -1,152 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetUIFileReader is a Reader for the GetUIFile structure. -type GetUIFileReader struct { - formats strfmt.Registry - writer io.Writer -} - -// ReadResponse reads a server response into the received o. -func (o *GetUIFileReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetUIFileOK(o.writer) - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetUIFileBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetUIFileInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetUIFileOK creates a GetUIFileOK with default headers values -func NewGetUIFileOK(writer io.Writer) *GetUIFileOK { - return &GetUIFileOK{ - Payload: writer, - } -} - -/* -GetUIFileOK handles this case with default header values. - -Successful operation -*/ -type GetUIFileOK struct { - Payload io.Writer -} - -func (o *GetUIFileOK) Error() string { - return fmt.Sprintf("[GET /{filename}][%d] getUiFileOK %+v", 200, o.Payload) -} - -func (o *GetUIFileOK) GetPayload() io.Writer { - return o.Payload -} - -func (o *GetUIFileOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetUIFileBadRequest creates a GetUIFileBadRequest with default headers values -func NewGetUIFileBadRequest() *GetUIFileBadRequest { - return &GetUIFileBadRequest{} -} - -/* -GetUIFileBadRequest handles this case with default header values. - -Bad request -*/ -type GetUIFileBadRequest struct { - Payload *models.Error -} - -func (o *GetUIFileBadRequest) Error() string { - return fmt.Sprintf("[GET /{filename}][%d] getUiFileBadRequest %+v", 400, o.Payload) -} - -func (o *GetUIFileBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetUIFileBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetUIFileInternalServerError creates a GetUIFileInternalServerError with default headers values -func NewGetUIFileInternalServerError() *GetUIFileInternalServerError { - return &GetUIFileInternalServerError{} -} - -/* -GetUIFileInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetUIFileInternalServerError struct { - Payload *models.Error -} - -func (o *GetUIFileInternalServerError) Error() string { - return fmt.Sprintf("[GET /{filename}][%d] getUiFileInternalServerError %+v", 500, o.Payload) -} - -func (o *GetUIFileInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetUIFileInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/ui/get_ui_parameters.go b/tkg/web/server/client/ui/get_ui_parameters.go deleted file mode 100644 index 807f65c889..0000000000 --- a/tkg/web/server/client/ui/get_ui_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetUIParams creates a new GetUIParams object -// with the default values initialized. -func NewGetUIParams() *GetUIParams { - - return &GetUIParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetUIParamsWithTimeout creates a new GetUIParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetUIParamsWithTimeout(timeout time.Duration) *GetUIParams { - - return &GetUIParams{ - - timeout: timeout, - } -} - -// NewGetUIParamsWithContext creates a new GetUIParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetUIParamsWithContext(ctx context.Context) *GetUIParams { - - return &GetUIParams{ - - Context: ctx, - } -} - -// NewGetUIParamsWithHTTPClient creates a new GetUIParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetUIParamsWithHTTPClient(client *http.Client) *GetUIParams { - - return &GetUIParams{ - HTTPClient: client, - } -} - -/* -GetUIParams contains all the parameters to send to the API endpoint -for the get UI operation typically these are written to a http.Request -*/ -type GetUIParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get UI params -func (o *GetUIParams) WithTimeout(timeout time.Duration) *GetUIParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get UI params -func (o *GetUIParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get UI params -func (o *GetUIParams) WithContext(ctx context.Context) *GetUIParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get UI params -func (o *GetUIParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get UI params -func (o *GetUIParams) WithHTTPClient(client *http.Client) *GetUIParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get UI params -func (o *GetUIParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetUIParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/ui/get_ui_responses.go b/tkg/web/server/client/ui/get_ui_responses.go deleted file mode 100644 index c13b1611ad..0000000000 --- a/tkg/web/server/client/ui/get_ui_responses.go +++ /dev/null @@ -1,152 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetUIReader is a Reader for the GetUI structure. -type GetUIReader struct { - formats strfmt.Registry - writer io.Writer -} - -// ReadResponse reads a server response into the received o. -func (o *GetUIReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetUIOK(o.writer) - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetUIBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetUIInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetUIOK creates a GetUIOK with default headers values -func NewGetUIOK(writer io.Writer) *GetUIOK { - return &GetUIOK{ - Payload: writer, - } -} - -/* -GetUIOK handles this case with default header values. - -Successful operation -*/ -type GetUIOK struct { - Payload io.Writer -} - -func (o *GetUIOK) Error() string { - return fmt.Sprintf("[GET /][%d] getUiOK %+v", 200, o.Payload) -} - -func (o *GetUIOK) GetPayload() io.Writer { - return o.Payload -} - -func (o *GetUIOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetUIBadRequest creates a GetUIBadRequest with default headers values -func NewGetUIBadRequest() *GetUIBadRequest { - return &GetUIBadRequest{} -} - -/* -GetUIBadRequest handles this case with default header values. - -Bad request -*/ -type GetUIBadRequest struct { - Payload *models.Error -} - -func (o *GetUIBadRequest) Error() string { - return fmt.Sprintf("[GET /][%d] getUiBadRequest %+v", 400, o.Payload) -} - -func (o *GetUIBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetUIBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetUIInternalServerError creates a GetUIInternalServerError with default headers values -func NewGetUIInternalServerError() *GetUIInternalServerError { - return &GetUIInternalServerError{} -} - -/* -GetUIInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetUIInternalServerError struct { - Payload *models.Error -} - -func (o *GetUIInternalServerError) Error() string { - return fmt.Sprintf("[GET /][%d] getUiInternalServerError %+v", 500, o.Payload) -} - -func (o *GetUIInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetUIInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/ui/ui_client.go b/tkg/web/server/client/ui/ui_client.go deleted file mode 100644 index 59ad0380ab..0000000000 --- a/tkg/web/server/client/ui/ui_client.go +++ /dev/null @@ -1,101 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new ui API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for ui API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -GetUI gets the kickstart UI -*/ -func (a *Client) GetUI(params *GetUIParams, writer io.Writer) (*GetUIOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetUIParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getUI", - Method: "GET", - PathPattern: "/", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetUIReader{formats: a.formats, writer: writer}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetUIOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getUI: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetUIFile gets the kickstart UI static resource file -*/ -func (a *Client) GetUIFile(params *GetUIFileParams, writer io.Writer) (*GetUIFileOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetUIFileParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getUIFile", - Method: "GET", - PathPattern: "/{filename}", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetUIFileReader{formats: a.formats, writer: writer}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetUIFileOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getUIFile: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/tkg/web/server/client/vsphere/apply_t_k_g_config_for_vsphere_parameters.go b/tkg/web/server/client/vsphere/apply_t_k_g_config_for_vsphere_parameters.go deleted file mode 100644 index 2a463ea972..0000000000 --- a/tkg/web/server/client/vsphere/apply_t_k_g_config_for_vsphere_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewApplyTKGConfigForVsphereParams creates a new ApplyTKGConfigForVsphereParams object -// with the default values initialized. -func NewApplyTKGConfigForVsphereParams() *ApplyTKGConfigForVsphereParams { - var () - return &ApplyTKGConfigForVsphereParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewApplyTKGConfigForVsphereParamsWithTimeout creates a new ApplyTKGConfigForVsphereParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewApplyTKGConfigForVsphereParamsWithTimeout(timeout time.Duration) *ApplyTKGConfigForVsphereParams { - var () - return &ApplyTKGConfigForVsphereParams{ - - timeout: timeout, - } -} - -// NewApplyTKGConfigForVsphereParamsWithContext creates a new ApplyTKGConfigForVsphereParams object -// with the default values initialized, and the ability to set a context for a request -func NewApplyTKGConfigForVsphereParamsWithContext(ctx context.Context) *ApplyTKGConfigForVsphereParams { - var () - return &ApplyTKGConfigForVsphereParams{ - - Context: ctx, - } -} - -// NewApplyTKGConfigForVsphereParamsWithHTTPClient creates a new ApplyTKGConfigForVsphereParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewApplyTKGConfigForVsphereParamsWithHTTPClient(client *http.Client) *ApplyTKGConfigForVsphereParams { - var () - return &ApplyTKGConfigForVsphereParams{ - HTTPClient: client, - } -} - -/* -ApplyTKGConfigForVsphereParams contains all the parameters to send to the API endpoint -for the apply t k g config for vsphere operation typically these are written to a http.Request -*/ -type ApplyTKGConfigForVsphereParams struct { - - /*Params - params to apply changes to tkg configuration for vsphere - - */ - Params *models.VsphereRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the apply t k g config for vsphere params -func (o *ApplyTKGConfigForVsphereParams) WithTimeout(timeout time.Duration) *ApplyTKGConfigForVsphereParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the apply t k g config for vsphere params -func (o *ApplyTKGConfigForVsphereParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the apply t k g config for vsphere params -func (o *ApplyTKGConfigForVsphereParams) WithContext(ctx context.Context) *ApplyTKGConfigForVsphereParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the apply t k g config for vsphere params -func (o *ApplyTKGConfigForVsphereParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the apply t k g config for vsphere params -func (o *ApplyTKGConfigForVsphereParams) WithHTTPClient(client *http.Client) *ApplyTKGConfigForVsphereParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the apply t k g config for vsphere params -func (o *ApplyTKGConfigForVsphereParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the apply t k g config for vsphere params -func (o *ApplyTKGConfigForVsphereParams) WithParams(params *models.VsphereRegionalClusterParams) *ApplyTKGConfigForVsphereParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the apply t k g config for vsphere params -func (o *ApplyTKGConfigForVsphereParams) SetParams(params *models.VsphereRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ApplyTKGConfigForVsphereParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/apply_t_k_g_config_for_vsphere_responses.go b/tkg/web/server/client/vsphere/apply_t_k_g_config_for_vsphere_responses.go deleted file mode 100644 index 588136e824..0000000000 --- a/tkg/web/server/client/vsphere/apply_t_k_g_config_for_vsphere_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ApplyTKGConfigForVsphereReader is a Reader for the ApplyTKGConfigForVsphere structure. -type ApplyTKGConfigForVsphereReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ApplyTKGConfigForVsphereReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewApplyTKGConfigForVsphereOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewApplyTKGConfigForVsphereBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewApplyTKGConfigForVsphereUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewApplyTKGConfigForVsphereInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewApplyTKGConfigForVsphereOK creates a ApplyTKGConfigForVsphereOK with default headers values -func NewApplyTKGConfigForVsphereOK() *ApplyTKGConfigForVsphereOK { - return &ApplyTKGConfigForVsphereOK{} -} - -/* -ApplyTKGConfigForVsphereOK handles this case with default header values. - -apply changes to TKG configuration file successfully -*/ -type ApplyTKGConfigForVsphereOK struct { - Payload *models.ConfigFileInfo -} - -func (o *ApplyTKGConfigForVsphereOK) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/tkgconfig][%d] applyTKGConfigForVsphereOK %+v", 200, o.Payload) -} - -func (o *ApplyTKGConfigForVsphereOK) GetPayload() *models.ConfigFileInfo { - return o.Payload -} - -func (o *ApplyTKGConfigForVsphereOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.ConfigFileInfo) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewApplyTKGConfigForVsphereBadRequest creates a ApplyTKGConfigForVsphereBadRequest with default headers values -func NewApplyTKGConfigForVsphereBadRequest() *ApplyTKGConfigForVsphereBadRequest { - return &ApplyTKGConfigForVsphereBadRequest{} -} - -/* -ApplyTKGConfigForVsphereBadRequest handles this case with default header values. - -Bad request -*/ -type ApplyTKGConfigForVsphereBadRequest struct { - Payload *models.Error -} - -func (o *ApplyTKGConfigForVsphereBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/tkgconfig][%d] applyTKGConfigForVsphereBadRequest %+v", 400, o.Payload) -} - -func (o *ApplyTKGConfigForVsphereBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ApplyTKGConfigForVsphereBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewApplyTKGConfigForVsphereUnauthorized creates a ApplyTKGConfigForVsphereUnauthorized with default headers values -func NewApplyTKGConfigForVsphereUnauthorized() *ApplyTKGConfigForVsphereUnauthorized { - return &ApplyTKGConfigForVsphereUnauthorized{} -} - -/* -ApplyTKGConfigForVsphereUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type ApplyTKGConfigForVsphereUnauthorized struct { - Payload *models.Error -} - -func (o *ApplyTKGConfigForVsphereUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/tkgconfig][%d] applyTKGConfigForVsphereUnauthorized %+v", 401, o.Payload) -} - -func (o *ApplyTKGConfigForVsphereUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *ApplyTKGConfigForVsphereUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewApplyTKGConfigForVsphereInternalServerError creates a ApplyTKGConfigForVsphereInternalServerError with default headers values -func NewApplyTKGConfigForVsphereInternalServerError() *ApplyTKGConfigForVsphereInternalServerError { - return &ApplyTKGConfigForVsphereInternalServerError{} -} - -/* -ApplyTKGConfigForVsphereInternalServerError handles this case with default header values. - -Internal server error -*/ -type ApplyTKGConfigForVsphereInternalServerError struct { - Payload *models.Error -} - -func (o *ApplyTKGConfigForVsphereInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/tkgconfig][%d] applyTKGConfigForVsphereInternalServerError %+v", 500, o.Payload) -} - -func (o *ApplyTKGConfigForVsphereInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ApplyTKGConfigForVsphereInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/create_v_sphere_regional_cluster_parameters.go b/tkg/web/server/client/vsphere/create_v_sphere_regional_cluster_parameters.go deleted file mode 100644 index ffe274f03c..0000000000 --- a/tkg/web/server/client/vsphere/create_v_sphere_regional_cluster_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateVSphereRegionalClusterParams creates a new CreateVSphereRegionalClusterParams object -// with the default values initialized. -func NewCreateVSphereRegionalClusterParams() *CreateVSphereRegionalClusterParams { - var () - return &CreateVSphereRegionalClusterParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewCreateVSphereRegionalClusterParamsWithTimeout creates a new CreateVSphereRegionalClusterParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewCreateVSphereRegionalClusterParamsWithTimeout(timeout time.Duration) *CreateVSphereRegionalClusterParams { - var () - return &CreateVSphereRegionalClusterParams{ - - timeout: timeout, - } -} - -// NewCreateVSphereRegionalClusterParamsWithContext creates a new CreateVSphereRegionalClusterParams object -// with the default values initialized, and the ability to set a context for a request -func NewCreateVSphereRegionalClusterParamsWithContext(ctx context.Context) *CreateVSphereRegionalClusterParams { - var () - return &CreateVSphereRegionalClusterParams{ - - Context: ctx, - } -} - -// NewCreateVSphereRegionalClusterParamsWithHTTPClient creates a new CreateVSphereRegionalClusterParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewCreateVSphereRegionalClusterParamsWithHTTPClient(client *http.Client) *CreateVSphereRegionalClusterParams { - var () - return &CreateVSphereRegionalClusterParams{ - HTTPClient: client, - } -} - -/* -CreateVSphereRegionalClusterParams contains all the parameters to send to the API endpoint -for the create v sphere regional cluster operation typically these are written to a http.Request -*/ -type CreateVSphereRegionalClusterParams struct { - - /*Params - params to create a regional cluster - - */ - Params *models.VsphereRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the create v sphere regional cluster params -func (o *CreateVSphereRegionalClusterParams) WithTimeout(timeout time.Duration) *CreateVSphereRegionalClusterParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the create v sphere regional cluster params -func (o *CreateVSphereRegionalClusterParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the create v sphere regional cluster params -func (o *CreateVSphereRegionalClusterParams) WithContext(ctx context.Context) *CreateVSphereRegionalClusterParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the create v sphere regional cluster params -func (o *CreateVSphereRegionalClusterParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the create v sphere regional cluster params -func (o *CreateVSphereRegionalClusterParams) WithHTTPClient(client *http.Client) *CreateVSphereRegionalClusterParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the create v sphere regional cluster params -func (o *CreateVSphereRegionalClusterParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the create v sphere regional cluster params -func (o *CreateVSphereRegionalClusterParams) WithParams(params *models.VsphereRegionalClusterParams) *CreateVSphereRegionalClusterParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the create v sphere regional cluster params -func (o *CreateVSphereRegionalClusterParams) SetParams(params *models.VsphereRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *CreateVSphereRegionalClusterParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/create_v_sphere_regional_cluster_responses.go b/tkg/web/server/client/vsphere/create_v_sphere_regional_cluster_responses.go deleted file mode 100644 index 6a76560f61..0000000000 --- a/tkg/web/server/client/vsphere/create_v_sphere_regional_cluster_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateVSphereRegionalClusterReader is a Reader for the CreateVSphereRegionalCluster structure. -type CreateVSphereRegionalClusterReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *CreateVSphereRegionalClusterReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewCreateVSphereRegionalClusterOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewCreateVSphereRegionalClusterBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewCreateVSphereRegionalClusterUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewCreateVSphereRegionalClusterInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewCreateVSphereRegionalClusterOK creates a CreateVSphereRegionalClusterOK with default headers values -func NewCreateVSphereRegionalClusterOK() *CreateVSphereRegionalClusterOK { - return &CreateVSphereRegionalClusterOK{} -} - -/* -CreateVSphereRegionalClusterOK handles this case with default header values. - -Creating regional cluster started successfully -*/ -type CreateVSphereRegionalClusterOK struct { - Payload string -} - -func (o *CreateVSphereRegionalClusterOK) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/create][%d] createVSphereRegionalClusterOK %+v", 200, o.Payload) -} - -func (o *CreateVSphereRegionalClusterOK) GetPayload() string { - return o.Payload -} - -func (o *CreateVSphereRegionalClusterOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateVSphereRegionalClusterBadRequest creates a CreateVSphereRegionalClusterBadRequest with default headers values -func NewCreateVSphereRegionalClusterBadRequest() *CreateVSphereRegionalClusterBadRequest { - return &CreateVSphereRegionalClusterBadRequest{} -} - -/* -CreateVSphereRegionalClusterBadRequest handles this case with default header values. - -Bad request -*/ -type CreateVSphereRegionalClusterBadRequest struct { - Payload *models.Error -} - -func (o *CreateVSphereRegionalClusterBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/create][%d] createVSphereRegionalClusterBadRequest %+v", 400, o.Payload) -} - -func (o *CreateVSphereRegionalClusterBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateVSphereRegionalClusterBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateVSphereRegionalClusterUnauthorized creates a CreateVSphereRegionalClusterUnauthorized with default headers values -func NewCreateVSphereRegionalClusterUnauthorized() *CreateVSphereRegionalClusterUnauthorized { - return &CreateVSphereRegionalClusterUnauthorized{} -} - -/* -CreateVSphereRegionalClusterUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type CreateVSphereRegionalClusterUnauthorized struct { - Payload *models.Error -} - -func (o *CreateVSphereRegionalClusterUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/create][%d] createVSphereRegionalClusterUnauthorized %+v", 401, o.Payload) -} - -func (o *CreateVSphereRegionalClusterUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateVSphereRegionalClusterUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewCreateVSphereRegionalClusterInternalServerError creates a CreateVSphereRegionalClusterInternalServerError with default headers values -func NewCreateVSphereRegionalClusterInternalServerError() *CreateVSphereRegionalClusterInternalServerError { - return &CreateVSphereRegionalClusterInternalServerError{} -} - -/* -CreateVSphereRegionalClusterInternalServerError handles this case with default header values. - -Internal server error -*/ -type CreateVSphereRegionalClusterInternalServerError struct { - Payload *models.Error -} - -func (o *CreateVSphereRegionalClusterInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/create][%d] createVSphereRegionalClusterInternalServerError %+v", 500, o.Payload) -} - -func (o *CreateVSphereRegionalClusterInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *CreateVSphereRegionalClusterInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/export_t_k_g_config_for_vsphere_parameters.go b/tkg/web/server/client/vsphere/export_t_k_g_config_for_vsphere_parameters.go deleted file mode 100644 index 5db876c03a..0000000000 --- a/tkg/web/server/client/vsphere/export_t_k_g_config_for_vsphere_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewExportTKGConfigForVsphereParams creates a new ExportTKGConfigForVsphereParams object -// with the default values initialized. -func NewExportTKGConfigForVsphereParams() *ExportTKGConfigForVsphereParams { - var () - return &ExportTKGConfigForVsphereParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewExportTKGConfigForVsphereParamsWithTimeout creates a new ExportTKGConfigForVsphereParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewExportTKGConfigForVsphereParamsWithTimeout(timeout time.Duration) *ExportTKGConfigForVsphereParams { - var () - return &ExportTKGConfigForVsphereParams{ - - timeout: timeout, - } -} - -// NewExportTKGConfigForVsphereParamsWithContext creates a new ExportTKGConfigForVsphereParams object -// with the default values initialized, and the ability to set a context for a request -func NewExportTKGConfigForVsphereParamsWithContext(ctx context.Context) *ExportTKGConfigForVsphereParams { - var () - return &ExportTKGConfigForVsphereParams{ - - Context: ctx, - } -} - -// NewExportTKGConfigForVsphereParamsWithHTTPClient creates a new ExportTKGConfigForVsphereParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewExportTKGConfigForVsphereParamsWithHTTPClient(client *http.Client) *ExportTKGConfigForVsphereParams { - var () - return &ExportTKGConfigForVsphereParams{ - HTTPClient: client, - } -} - -/* -ExportTKGConfigForVsphereParams contains all the parameters to send to the API endpoint -for the export t k g config for vsphere operation typically these are written to a http.Request -*/ -type ExportTKGConfigForVsphereParams struct { - - /*Params - params to generate tkg configuration for vsphere - - */ - Params *models.VsphereRegionalClusterParams - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the export t k g config for vsphere params -func (o *ExportTKGConfigForVsphereParams) WithTimeout(timeout time.Duration) *ExportTKGConfigForVsphereParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the export t k g config for vsphere params -func (o *ExportTKGConfigForVsphereParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the export t k g config for vsphere params -func (o *ExportTKGConfigForVsphereParams) WithContext(ctx context.Context) *ExportTKGConfigForVsphereParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the export t k g config for vsphere params -func (o *ExportTKGConfigForVsphereParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the export t k g config for vsphere params -func (o *ExportTKGConfigForVsphereParams) WithHTTPClient(client *http.Client) *ExportTKGConfigForVsphereParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the export t k g config for vsphere params -func (o *ExportTKGConfigForVsphereParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the export t k g config for vsphere params -func (o *ExportTKGConfigForVsphereParams) WithParams(params *models.VsphereRegionalClusterParams) *ExportTKGConfigForVsphereParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the export t k g config for vsphere params -func (o *ExportTKGConfigForVsphereParams) SetParams(params *models.VsphereRegionalClusterParams) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ExportTKGConfigForVsphereParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/export_t_k_g_config_for_vsphere_responses.go b/tkg/web/server/client/vsphere/export_t_k_g_config_for_vsphere_responses.go deleted file mode 100644 index d63771e884..0000000000 --- a/tkg/web/server/client/vsphere/export_t_k_g_config_for_vsphere_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ExportTKGConfigForVsphereReader is a Reader for the ExportTKGConfigForVsphere structure. -type ExportTKGConfigForVsphereReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ExportTKGConfigForVsphereReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewExportTKGConfigForVsphereOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewExportTKGConfigForVsphereBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewExportTKGConfigForVsphereUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewExportTKGConfigForVsphereInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewExportTKGConfigForVsphereOK creates a ExportTKGConfigForVsphereOK with default headers values -func NewExportTKGConfigForVsphereOK() *ExportTKGConfigForVsphereOK { - return &ExportTKGConfigForVsphereOK{} -} - -/* -ExportTKGConfigForVsphereOK handles this case with default header values. - -Generated TKG configuration successfully -*/ -type ExportTKGConfigForVsphereOK struct { - Payload string -} - -func (o *ExportTKGConfigForVsphereOK) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/config/export][%d] exportTKGConfigForVsphereOK %+v", 200, o.Payload) -} - -func (o *ExportTKGConfigForVsphereOK) GetPayload() string { - return o.Payload -} - -func (o *ExportTKGConfigForVsphereOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewExportTKGConfigForVsphereBadRequest creates a ExportTKGConfigForVsphereBadRequest with default headers values -func NewExportTKGConfigForVsphereBadRequest() *ExportTKGConfigForVsphereBadRequest { - return &ExportTKGConfigForVsphereBadRequest{} -} - -/* -ExportTKGConfigForVsphereBadRequest handles this case with default header values. - -Bad request -*/ -type ExportTKGConfigForVsphereBadRequest struct { - Payload *models.Error -} - -func (o *ExportTKGConfigForVsphereBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/config/export][%d] exportTKGConfigForVsphereBadRequest %+v", 400, o.Payload) -} - -func (o *ExportTKGConfigForVsphereBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ExportTKGConfigForVsphereBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewExportTKGConfigForVsphereUnauthorized creates a ExportTKGConfigForVsphereUnauthorized with default headers values -func NewExportTKGConfigForVsphereUnauthorized() *ExportTKGConfigForVsphereUnauthorized { - return &ExportTKGConfigForVsphereUnauthorized{} -} - -/* -ExportTKGConfigForVsphereUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type ExportTKGConfigForVsphereUnauthorized struct { - Payload *models.Error -} - -func (o *ExportTKGConfigForVsphereUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/config/export][%d] exportTKGConfigForVsphereUnauthorized %+v", 401, o.Payload) -} - -func (o *ExportTKGConfigForVsphereUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *ExportTKGConfigForVsphereUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewExportTKGConfigForVsphereInternalServerError creates a ExportTKGConfigForVsphereInternalServerError with default headers values -func NewExportTKGConfigForVsphereInternalServerError() *ExportTKGConfigForVsphereInternalServerError { - return &ExportTKGConfigForVsphereInternalServerError{} -} - -/* -ExportTKGConfigForVsphereInternalServerError handles this case with default header values. - -Internal server error -*/ -type ExportTKGConfigForVsphereInternalServerError struct { - Payload *models.Error -} - -func (o *ExportTKGConfigForVsphereInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/config/export][%d] exportTKGConfigForVsphereInternalServerError %+v", 500, o.Payload) -} - -func (o *ExportTKGConfigForVsphereInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ExportTKGConfigForVsphereInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_compute_resources_parameters.go b/tkg/web/server/client/vsphere/get_v_sphere_compute_resources_parameters.go deleted file mode 100644 index 732fec63f6..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_compute_resources_parameters.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereComputeResourcesParams creates a new GetVSphereComputeResourcesParams object -// with the default values initialized. -func NewGetVSphereComputeResourcesParams() *GetVSphereComputeResourcesParams { - var () - return &GetVSphereComputeResourcesParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetVSphereComputeResourcesParamsWithTimeout creates a new GetVSphereComputeResourcesParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetVSphereComputeResourcesParamsWithTimeout(timeout time.Duration) *GetVSphereComputeResourcesParams { - var () - return &GetVSphereComputeResourcesParams{ - - timeout: timeout, - } -} - -// NewGetVSphereComputeResourcesParamsWithContext creates a new GetVSphereComputeResourcesParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetVSphereComputeResourcesParamsWithContext(ctx context.Context) *GetVSphereComputeResourcesParams { - var () - return &GetVSphereComputeResourcesParams{ - - Context: ctx, - } -} - -// NewGetVSphereComputeResourcesParamsWithHTTPClient creates a new GetVSphereComputeResourcesParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetVSphereComputeResourcesParamsWithHTTPClient(client *http.Client) *GetVSphereComputeResourcesParams { - var () - return &GetVSphereComputeResourcesParams{ - HTTPClient: client, - } -} - -/* -GetVSphereComputeResourcesParams contains all the parameters to send to the API endpoint -for the get v sphere compute resources operation typically these are written to a http.Request -*/ -type GetVSphereComputeResourcesParams struct { - - /*Dc - datacenter managed object Id, e.g. datacenter-2 - - */ - Dc string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get v sphere compute resources params -func (o *GetVSphereComputeResourcesParams) WithTimeout(timeout time.Duration) *GetVSphereComputeResourcesParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get v sphere compute resources params -func (o *GetVSphereComputeResourcesParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get v sphere compute resources params -func (o *GetVSphereComputeResourcesParams) WithContext(ctx context.Context) *GetVSphereComputeResourcesParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get v sphere compute resources params -func (o *GetVSphereComputeResourcesParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get v sphere compute resources params -func (o *GetVSphereComputeResourcesParams) WithHTTPClient(client *http.Client) *GetVSphereComputeResourcesParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get v sphere compute resources params -func (o *GetVSphereComputeResourcesParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithDc adds the dc to the get v sphere compute resources params -func (o *GetVSphereComputeResourcesParams) WithDc(dc string) *GetVSphereComputeResourcesParams { - o.SetDc(dc) - return o -} - -// SetDc adds the dc to the get v sphere compute resources params -func (o *GetVSphereComputeResourcesParams) SetDc(dc string) { - o.Dc = dc -} - -// WriteToRequest writes these params to a swagger request -func (o *GetVSphereComputeResourcesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // query param dc - qrDc := o.Dc - qDc := qrDc - if qDc != "" { - if err := r.SetQueryParam("dc", qDc); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_compute_resources_responses.go b/tkg/web/server/client/vsphere/get_v_sphere_compute_resources_responses.go deleted file mode 100644 index 4e69aed4c9..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_compute_resources_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereComputeResourcesReader is a Reader for the GetVSphereComputeResources structure. -type GetVSphereComputeResourcesReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetVSphereComputeResourcesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetVSphereComputeResourcesOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetVSphereComputeResourcesBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetVSphereComputeResourcesUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetVSphereComputeResourcesInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetVSphereComputeResourcesOK creates a GetVSphereComputeResourcesOK with default headers values -func NewGetVSphereComputeResourcesOK() *GetVSphereComputeResourcesOK { - return &GetVSphereComputeResourcesOK{} -} - -/* -GetVSphereComputeResourcesOK handles this case with default header values. - -Successful retrieval of vSphere folders -*/ -type GetVSphereComputeResourcesOK struct { - Payload []*models.VSphereManagementObject -} - -func (o *GetVSphereComputeResourcesOK) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/compute][%d] getVSphereComputeResourcesOK %+v", 200, o.Payload) -} - -func (o *GetVSphereComputeResourcesOK) GetPayload() []*models.VSphereManagementObject { - return o.Payload -} - -func (o *GetVSphereComputeResourcesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereComputeResourcesBadRequest creates a GetVSphereComputeResourcesBadRequest with default headers values -func NewGetVSphereComputeResourcesBadRequest() *GetVSphereComputeResourcesBadRequest { - return &GetVSphereComputeResourcesBadRequest{} -} - -/* -GetVSphereComputeResourcesBadRequest handles this case with default header values. - -Bad request -*/ -type GetVSphereComputeResourcesBadRequest struct { - Payload *models.Error -} - -func (o *GetVSphereComputeResourcesBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/compute][%d] getVSphereComputeResourcesBadRequest %+v", 400, o.Payload) -} - -func (o *GetVSphereComputeResourcesBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereComputeResourcesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereComputeResourcesUnauthorized creates a GetVSphereComputeResourcesUnauthorized with default headers values -func NewGetVSphereComputeResourcesUnauthorized() *GetVSphereComputeResourcesUnauthorized { - return &GetVSphereComputeResourcesUnauthorized{} -} - -/* -GetVSphereComputeResourcesUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetVSphereComputeResourcesUnauthorized struct { - Payload *models.Error -} - -func (o *GetVSphereComputeResourcesUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/compute][%d] getVSphereComputeResourcesUnauthorized %+v", 401, o.Payload) -} - -func (o *GetVSphereComputeResourcesUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereComputeResourcesUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereComputeResourcesInternalServerError creates a GetVSphereComputeResourcesInternalServerError with default headers values -func NewGetVSphereComputeResourcesInternalServerError() *GetVSphereComputeResourcesInternalServerError { - return &GetVSphereComputeResourcesInternalServerError{} -} - -/* -GetVSphereComputeResourcesInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetVSphereComputeResourcesInternalServerError struct { - Payload *models.Error -} - -func (o *GetVSphereComputeResourcesInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/compute][%d] getVSphereComputeResourcesInternalServerError %+v", 500, o.Payload) -} - -func (o *GetVSphereComputeResourcesInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereComputeResourcesInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_datacenters_parameters.go b/tkg/web/server/client/vsphere/get_v_sphere_datacenters_parameters.go deleted file mode 100644 index 0fda9db96c..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_datacenters_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereDatacentersParams creates a new GetVSphereDatacentersParams object -// with the default values initialized. -func NewGetVSphereDatacentersParams() *GetVSphereDatacentersParams { - - return &GetVSphereDatacentersParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetVSphereDatacentersParamsWithTimeout creates a new GetVSphereDatacentersParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetVSphereDatacentersParamsWithTimeout(timeout time.Duration) *GetVSphereDatacentersParams { - - return &GetVSphereDatacentersParams{ - - timeout: timeout, - } -} - -// NewGetVSphereDatacentersParamsWithContext creates a new GetVSphereDatacentersParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetVSphereDatacentersParamsWithContext(ctx context.Context) *GetVSphereDatacentersParams { - - return &GetVSphereDatacentersParams{ - - Context: ctx, - } -} - -// NewGetVSphereDatacentersParamsWithHTTPClient creates a new GetVSphereDatacentersParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetVSphereDatacentersParamsWithHTTPClient(client *http.Client) *GetVSphereDatacentersParams { - - return &GetVSphereDatacentersParams{ - HTTPClient: client, - } -} - -/* -GetVSphereDatacentersParams contains all the parameters to send to the API endpoint -for the get v sphere datacenters operation typically these are written to a http.Request -*/ -type GetVSphereDatacentersParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get v sphere datacenters params -func (o *GetVSphereDatacentersParams) WithTimeout(timeout time.Duration) *GetVSphereDatacentersParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get v sphere datacenters params -func (o *GetVSphereDatacentersParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get v sphere datacenters params -func (o *GetVSphereDatacentersParams) WithContext(ctx context.Context) *GetVSphereDatacentersParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get v sphere datacenters params -func (o *GetVSphereDatacentersParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get v sphere datacenters params -func (o *GetVSphereDatacentersParams) WithHTTPClient(client *http.Client) *GetVSphereDatacentersParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get v sphere datacenters params -func (o *GetVSphereDatacentersParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetVSphereDatacentersParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_datacenters_responses.go b/tkg/web/server/client/vsphere/get_v_sphere_datacenters_responses.go deleted file mode 100644 index 51ae9964c3..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_datacenters_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereDatacentersReader is a Reader for the GetVSphereDatacenters structure. -type GetVSphereDatacentersReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetVSphereDatacentersReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetVSphereDatacentersOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetVSphereDatacentersBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetVSphereDatacentersUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetVSphereDatacentersInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetVSphereDatacentersOK creates a GetVSphereDatacentersOK with default headers values -func NewGetVSphereDatacentersOK() *GetVSphereDatacentersOK { - return &GetVSphereDatacentersOK{} -} - -/* -GetVSphereDatacentersOK handles this case with default header values. - -Successful retrieval of vSphere datacenters -*/ -type GetVSphereDatacentersOK struct { - Payload []*models.VSphereDatacenter -} - -func (o *GetVSphereDatacentersOK) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/datacenters][%d] getVSphereDatacentersOK %+v", 200, o.Payload) -} - -func (o *GetVSphereDatacentersOK) GetPayload() []*models.VSphereDatacenter { - return o.Payload -} - -func (o *GetVSphereDatacentersOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereDatacentersBadRequest creates a GetVSphereDatacentersBadRequest with default headers values -func NewGetVSphereDatacentersBadRequest() *GetVSphereDatacentersBadRequest { - return &GetVSphereDatacentersBadRequest{} -} - -/* -GetVSphereDatacentersBadRequest handles this case with default header values. - -Bad request -*/ -type GetVSphereDatacentersBadRequest struct { - Payload *models.Error -} - -func (o *GetVSphereDatacentersBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/datacenters][%d] getVSphereDatacentersBadRequest %+v", 400, o.Payload) -} - -func (o *GetVSphereDatacentersBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereDatacentersBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereDatacentersUnauthorized creates a GetVSphereDatacentersUnauthorized with default headers values -func NewGetVSphereDatacentersUnauthorized() *GetVSphereDatacentersUnauthorized { - return &GetVSphereDatacentersUnauthorized{} -} - -/* -GetVSphereDatacentersUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetVSphereDatacentersUnauthorized struct { - Payload *models.Error -} - -func (o *GetVSphereDatacentersUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/datacenters][%d] getVSphereDatacentersUnauthorized %+v", 401, o.Payload) -} - -func (o *GetVSphereDatacentersUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereDatacentersUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereDatacentersInternalServerError creates a GetVSphereDatacentersInternalServerError with default headers values -func NewGetVSphereDatacentersInternalServerError() *GetVSphereDatacentersInternalServerError { - return &GetVSphereDatacentersInternalServerError{} -} - -/* -GetVSphereDatacentersInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetVSphereDatacentersInternalServerError struct { - Payload *models.Error -} - -func (o *GetVSphereDatacentersInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/datacenters][%d] getVSphereDatacentersInternalServerError %+v", 500, o.Payload) -} - -func (o *GetVSphereDatacentersInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereDatacentersInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_datastores_parameters.go b/tkg/web/server/client/vsphere/get_v_sphere_datastores_parameters.go deleted file mode 100644 index 4cbe4a2a85..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_datastores_parameters.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereDatastoresParams creates a new GetVSphereDatastoresParams object -// with the default values initialized. -func NewGetVSphereDatastoresParams() *GetVSphereDatastoresParams { - var () - return &GetVSphereDatastoresParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetVSphereDatastoresParamsWithTimeout creates a new GetVSphereDatastoresParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetVSphereDatastoresParamsWithTimeout(timeout time.Duration) *GetVSphereDatastoresParams { - var () - return &GetVSphereDatastoresParams{ - - timeout: timeout, - } -} - -// NewGetVSphereDatastoresParamsWithContext creates a new GetVSphereDatastoresParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetVSphereDatastoresParamsWithContext(ctx context.Context) *GetVSphereDatastoresParams { - var () - return &GetVSphereDatastoresParams{ - - Context: ctx, - } -} - -// NewGetVSphereDatastoresParamsWithHTTPClient creates a new GetVSphereDatastoresParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetVSphereDatastoresParamsWithHTTPClient(client *http.Client) *GetVSphereDatastoresParams { - var () - return &GetVSphereDatastoresParams{ - HTTPClient: client, - } -} - -/* -GetVSphereDatastoresParams contains all the parameters to send to the API endpoint -for the get v sphere datastores operation typically these are written to a http.Request -*/ -type GetVSphereDatastoresParams struct { - - /*Dc - datacenter managed object Id, e.g. datacenter-2 - - */ - Dc string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get v sphere datastores params -func (o *GetVSphereDatastoresParams) WithTimeout(timeout time.Duration) *GetVSphereDatastoresParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get v sphere datastores params -func (o *GetVSphereDatastoresParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get v sphere datastores params -func (o *GetVSphereDatastoresParams) WithContext(ctx context.Context) *GetVSphereDatastoresParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get v sphere datastores params -func (o *GetVSphereDatastoresParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get v sphere datastores params -func (o *GetVSphereDatastoresParams) WithHTTPClient(client *http.Client) *GetVSphereDatastoresParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get v sphere datastores params -func (o *GetVSphereDatastoresParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithDc adds the dc to the get v sphere datastores params -func (o *GetVSphereDatastoresParams) WithDc(dc string) *GetVSphereDatastoresParams { - o.SetDc(dc) - return o -} - -// SetDc adds the dc to the get v sphere datastores params -func (o *GetVSphereDatastoresParams) SetDc(dc string) { - o.Dc = dc -} - -// WriteToRequest writes these params to a swagger request -func (o *GetVSphereDatastoresParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // query param dc - qrDc := o.Dc - qDc := qrDc - if qDc != "" { - if err := r.SetQueryParam("dc", qDc); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_datastores_responses.go b/tkg/web/server/client/vsphere/get_v_sphere_datastores_responses.go deleted file mode 100644 index 661fbc1fac..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_datastores_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereDatastoresReader is a Reader for the GetVSphereDatastores structure. -type GetVSphereDatastoresReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetVSphereDatastoresReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetVSphereDatastoresOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetVSphereDatastoresBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetVSphereDatastoresUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetVSphereDatastoresInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetVSphereDatastoresOK creates a GetVSphereDatastoresOK with default headers values -func NewGetVSphereDatastoresOK() *GetVSphereDatastoresOK { - return &GetVSphereDatastoresOK{} -} - -/* -GetVSphereDatastoresOK handles this case with default header values. - -Successful retrieval of vSphere datastores -*/ -type GetVSphereDatastoresOK struct { - Payload []*models.VSphereDatastore -} - -func (o *GetVSphereDatastoresOK) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/datastores][%d] getVSphereDatastoresOK %+v", 200, o.Payload) -} - -func (o *GetVSphereDatastoresOK) GetPayload() []*models.VSphereDatastore { - return o.Payload -} - -func (o *GetVSphereDatastoresOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereDatastoresBadRequest creates a GetVSphereDatastoresBadRequest with default headers values -func NewGetVSphereDatastoresBadRequest() *GetVSphereDatastoresBadRequest { - return &GetVSphereDatastoresBadRequest{} -} - -/* -GetVSphereDatastoresBadRequest handles this case with default header values. - -Bad request -*/ -type GetVSphereDatastoresBadRequest struct { - Payload *models.Error -} - -func (o *GetVSphereDatastoresBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/datastores][%d] getVSphereDatastoresBadRequest %+v", 400, o.Payload) -} - -func (o *GetVSphereDatastoresBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereDatastoresBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereDatastoresUnauthorized creates a GetVSphereDatastoresUnauthorized with default headers values -func NewGetVSphereDatastoresUnauthorized() *GetVSphereDatastoresUnauthorized { - return &GetVSphereDatastoresUnauthorized{} -} - -/* -GetVSphereDatastoresUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetVSphereDatastoresUnauthorized struct { - Payload *models.Error -} - -func (o *GetVSphereDatastoresUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/datastores][%d] getVSphereDatastoresUnauthorized %+v", 401, o.Payload) -} - -func (o *GetVSphereDatastoresUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereDatastoresUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereDatastoresInternalServerError creates a GetVSphereDatastoresInternalServerError with default headers values -func NewGetVSphereDatastoresInternalServerError() *GetVSphereDatastoresInternalServerError { - return &GetVSphereDatastoresInternalServerError{} -} - -/* -GetVSphereDatastoresInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetVSphereDatastoresInternalServerError struct { - Payload *models.Error -} - -func (o *GetVSphereDatastoresInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/datastores][%d] getVSphereDatastoresInternalServerError %+v", 500, o.Payload) -} - -func (o *GetVSphereDatastoresInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereDatastoresInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_folders_parameters.go b/tkg/web/server/client/vsphere/get_v_sphere_folders_parameters.go deleted file mode 100644 index dd69ece303..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_folders_parameters.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereFoldersParams creates a new GetVSphereFoldersParams object -// with the default values initialized. -func NewGetVSphereFoldersParams() *GetVSphereFoldersParams { - var () - return &GetVSphereFoldersParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetVSphereFoldersParamsWithTimeout creates a new GetVSphereFoldersParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetVSphereFoldersParamsWithTimeout(timeout time.Duration) *GetVSphereFoldersParams { - var () - return &GetVSphereFoldersParams{ - - timeout: timeout, - } -} - -// NewGetVSphereFoldersParamsWithContext creates a new GetVSphereFoldersParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetVSphereFoldersParamsWithContext(ctx context.Context) *GetVSphereFoldersParams { - var () - return &GetVSphereFoldersParams{ - - Context: ctx, - } -} - -// NewGetVSphereFoldersParamsWithHTTPClient creates a new GetVSphereFoldersParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetVSphereFoldersParamsWithHTTPClient(client *http.Client) *GetVSphereFoldersParams { - var () - return &GetVSphereFoldersParams{ - HTTPClient: client, - } -} - -/* -GetVSphereFoldersParams contains all the parameters to send to the API endpoint -for the get v sphere folders operation typically these are written to a http.Request -*/ -type GetVSphereFoldersParams struct { - - /*Dc - datacenter managed object Id, e.g. datacenter-2 - - */ - Dc string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get v sphere folders params -func (o *GetVSphereFoldersParams) WithTimeout(timeout time.Duration) *GetVSphereFoldersParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get v sphere folders params -func (o *GetVSphereFoldersParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get v sphere folders params -func (o *GetVSphereFoldersParams) WithContext(ctx context.Context) *GetVSphereFoldersParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get v sphere folders params -func (o *GetVSphereFoldersParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get v sphere folders params -func (o *GetVSphereFoldersParams) WithHTTPClient(client *http.Client) *GetVSphereFoldersParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get v sphere folders params -func (o *GetVSphereFoldersParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithDc adds the dc to the get v sphere folders params -func (o *GetVSphereFoldersParams) WithDc(dc string) *GetVSphereFoldersParams { - o.SetDc(dc) - return o -} - -// SetDc adds the dc to the get v sphere folders params -func (o *GetVSphereFoldersParams) SetDc(dc string) { - o.Dc = dc -} - -// WriteToRequest writes these params to a swagger request -func (o *GetVSphereFoldersParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // query param dc - qrDc := o.Dc - qDc := qrDc - if qDc != "" { - if err := r.SetQueryParam("dc", qDc); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_folders_responses.go b/tkg/web/server/client/vsphere/get_v_sphere_folders_responses.go deleted file mode 100644 index 2361bc822f..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_folders_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereFoldersReader is a Reader for the GetVSphereFolders structure. -type GetVSphereFoldersReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetVSphereFoldersReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetVSphereFoldersOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetVSphereFoldersBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetVSphereFoldersUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetVSphereFoldersInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetVSphereFoldersOK creates a GetVSphereFoldersOK with default headers values -func NewGetVSphereFoldersOK() *GetVSphereFoldersOK { - return &GetVSphereFoldersOK{} -} - -/* -GetVSphereFoldersOK handles this case with default header values. - -Successful retrieval of vSphere folders -*/ -type GetVSphereFoldersOK struct { - Payload []*models.VSphereFolder -} - -func (o *GetVSphereFoldersOK) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/folders][%d] getVSphereFoldersOK %+v", 200, o.Payload) -} - -func (o *GetVSphereFoldersOK) GetPayload() []*models.VSphereFolder { - return o.Payload -} - -func (o *GetVSphereFoldersOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereFoldersBadRequest creates a GetVSphereFoldersBadRequest with default headers values -func NewGetVSphereFoldersBadRequest() *GetVSphereFoldersBadRequest { - return &GetVSphereFoldersBadRequest{} -} - -/* -GetVSphereFoldersBadRequest handles this case with default header values. - -Bad request -*/ -type GetVSphereFoldersBadRequest struct { - Payload *models.Error -} - -func (o *GetVSphereFoldersBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/folders][%d] getVSphereFoldersBadRequest %+v", 400, o.Payload) -} - -func (o *GetVSphereFoldersBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereFoldersBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereFoldersUnauthorized creates a GetVSphereFoldersUnauthorized with default headers values -func NewGetVSphereFoldersUnauthorized() *GetVSphereFoldersUnauthorized { - return &GetVSphereFoldersUnauthorized{} -} - -/* -GetVSphereFoldersUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetVSphereFoldersUnauthorized struct { - Payload *models.Error -} - -func (o *GetVSphereFoldersUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/folders][%d] getVSphereFoldersUnauthorized %+v", 401, o.Payload) -} - -func (o *GetVSphereFoldersUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereFoldersUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereFoldersInternalServerError creates a GetVSphereFoldersInternalServerError with default headers values -func NewGetVSphereFoldersInternalServerError() *GetVSphereFoldersInternalServerError { - return &GetVSphereFoldersInternalServerError{} -} - -/* -GetVSphereFoldersInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetVSphereFoldersInternalServerError struct { - Payload *models.Error -} - -func (o *GetVSphereFoldersInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/folders][%d] getVSphereFoldersInternalServerError %+v", 500, o.Payload) -} - -func (o *GetVSphereFoldersInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereFoldersInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_networks_parameters.go b/tkg/web/server/client/vsphere/get_v_sphere_networks_parameters.go deleted file mode 100644 index eceed21fa8..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_networks_parameters.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereNetworksParams creates a new GetVSphereNetworksParams object -// with the default values initialized. -func NewGetVSphereNetworksParams() *GetVSphereNetworksParams { - var () - return &GetVSphereNetworksParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetVSphereNetworksParamsWithTimeout creates a new GetVSphereNetworksParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetVSphereNetworksParamsWithTimeout(timeout time.Duration) *GetVSphereNetworksParams { - var () - return &GetVSphereNetworksParams{ - - timeout: timeout, - } -} - -// NewGetVSphereNetworksParamsWithContext creates a new GetVSphereNetworksParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetVSphereNetworksParamsWithContext(ctx context.Context) *GetVSphereNetworksParams { - var () - return &GetVSphereNetworksParams{ - - Context: ctx, - } -} - -// NewGetVSphereNetworksParamsWithHTTPClient creates a new GetVSphereNetworksParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetVSphereNetworksParamsWithHTTPClient(client *http.Client) *GetVSphereNetworksParams { - var () - return &GetVSphereNetworksParams{ - HTTPClient: client, - } -} - -/* -GetVSphereNetworksParams contains all the parameters to send to the API endpoint -for the get v sphere networks operation typically these are written to a http.Request -*/ -type GetVSphereNetworksParams struct { - - /*Dc - datacenter managed object Id, e.g. datacenter-2 - - */ - Dc string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get v sphere networks params -func (o *GetVSphereNetworksParams) WithTimeout(timeout time.Duration) *GetVSphereNetworksParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get v sphere networks params -func (o *GetVSphereNetworksParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get v sphere networks params -func (o *GetVSphereNetworksParams) WithContext(ctx context.Context) *GetVSphereNetworksParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get v sphere networks params -func (o *GetVSphereNetworksParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get v sphere networks params -func (o *GetVSphereNetworksParams) WithHTTPClient(client *http.Client) *GetVSphereNetworksParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get v sphere networks params -func (o *GetVSphereNetworksParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithDc adds the dc to the get v sphere networks params -func (o *GetVSphereNetworksParams) WithDc(dc string) *GetVSphereNetworksParams { - o.SetDc(dc) - return o -} - -// SetDc adds the dc to the get v sphere networks params -func (o *GetVSphereNetworksParams) SetDc(dc string) { - o.Dc = dc -} - -// WriteToRequest writes these params to a swagger request -func (o *GetVSphereNetworksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // query param dc - qrDc := o.Dc - qDc := qrDc - if qDc != "" { - if err := r.SetQueryParam("dc", qDc); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_networks_responses.go b/tkg/web/server/client/vsphere/get_v_sphere_networks_responses.go deleted file mode 100644 index bfe0f2f8a3..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_networks_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereNetworksReader is a Reader for the GetVSphereNetworks structure. -type GetVSphereNetworksReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetVSphereNetworksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetVSphereNetworksOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetVSphereNetworksBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetVSphereNetworksUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetVSphereNetworksInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetVSphereNetworksOK creates a GetVSphereNetworksOK with default headers values -func NewGetVSphereNetworksOK() *GetVSphereNetworksOK { - return &GetVSphereNetworksOK{} -} - -/* -GetVSphereNetworksOK handles this case with default header values. - -Successful retrieval of vSphere networks -*/ -type GetVSphereNetworksOK struct { - Payload []*models.VSphereNetwork -} - -func (o *GetVSphereNetworksOK) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/networks][%d] getVSphereNetworksOK %+v", 200, o.Payload) -} - -func (o *GetVSphereNetworksOK) GetPayload() []*models.VSphereNetwork { - return o.Payload -} - -func (o *GetVSphereNetworksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereNetworksBadRequest creates a GetVSphereNetworksBadRequest with default headers values -func NewGetVSphereNetworksBadRequest() *GetVSphereNetworksBadRequest { - return &GetVSphereNetworksBadRequest{} -} - -/* -GetVSphereNetworksBadRequest handles this case with default header values. - -Bad request -*/ -type GetVSphereNetworksBadRequest struct { - Payload *models.Error -} - -func (o *GetVSphereNetworksBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/networks][%d] getVSphereNetworksBadRequest %+v", 400, o.Payload) -} - -func (o *GetVSphereNetworksBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereNetworksBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereNetworksUnauthorized creates a GetVSphereNetworksUnauthorized with default headers values -func NewGetVSphereNetworksUnauthorized() *GetVSphereNetworksUnauthorized { - return &GetVSphereNetworksUnauthorized{} -} - -/* -GetVSphereNetworksUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetVSphereNetworksUnauthorized struct { - Payload *models.Error -} - -func (o *GetVSphereNetworksUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/networks][%d] getVSphereNetworksUnauthorized %+v", 401, o.Payload) -} - -func (o *GetVSphereNetworksUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereNetworksUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereNetworksInternalServerError creates a GetVSphereNetworksInternalServerError with default headers values -func NewGetVSphereNetworksInternalServerError() *GetVSphereNetworksInternalServerError { - return &GetVSphereNetworksInternalServerError{} -} - -/* -GetVSphereNetworksInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetVSphereNetworksInternalServerError struct { - Payload *models.Error -} - -func (o *GetVSphereNetworksInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/networks][%d] getVSphereNetworksInternalServerError %+v", 500, o.Payload) -} - -func (o *GetVSphereNetworksInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereNetworksInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_node_types_parameters.go b/tkg/web/server/client/vsphere/get_v_sphere_node_types_parameters.go deleted file mode 100644 index 5cd0726b14..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_node_types_parameters.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereNodeTypesParams creates a new GetVSphereNodeTypesParams object -// with the default values initialized. -func NewGetVSphereNodeTypesParams() *GetVSphereNodeTypesParams { - - return &GetVSphereNodeTypesParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetVSphereNodeTypesParamsWithTimeout creates a new GetVSphereNodeTypesParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetVSphereNodeTypesParamsWithTimeout(timeout time.Duration) *GetVSphereNodeTypesParams { - - return &GetVSphereNodeTypesParams{ - - timeout: timeout, - } -} - -// NewGetVSphereNodeTypesParamsWithContext creates a new GetVSphereNodeTypesParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetVSphereNodeTypesParamsWithContext(ctx context.Context) *GetVSphereNodeTypesParams { - - return &GetVSphereNodeTypesParams{ - - Context: ctx, - } -} - -// NewGetVSphereNodeTypesParamsWithHTTPClient creates a new GetVSphereNodeTypesParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetVSphereNodeTypesParamsWithHTTPClient(client *http.Client) *GetVSphereNodeTypesParams { - - return &GetVSphereNodeTypesParams{ - HTTPClient: client, - } -} - -/* -GetVSphereNodeTypesParams contains all the parameters to send to the API endpoint -for the get v sphere node types operation typically these are written to a http.Request -*/ -type GetVSphereNodeTypesParams struct { - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get v sphere node types params -func (o *GetVSphereNodeTypesParams) WithTimeout(timeout time.Duration) *GetVSphereNodeTypesParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get v sphere node types params -func (o *GetVSphereNodeTypesParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get v sphere node types params -func (o *GetVSphereNodeTypesParams) WithContext(ctx context.Context) *GetVSphereNodeTypesParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get v sphere node types params -func (o *GetVSphereNodeTypesParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get v sphere node types params -func (o *GetVSphereNodeTypesParams) WithHTTPClient(client *http.Client) *GetVSphereNodeTypesParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get v sphere node types params -func (o *GetVSphereNodeTypesParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WriteToRequest writes these params to a swagger request -func (o *GetVSphereNodeTypesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_node_types_responses.go b/tkg/web/server/client/vsphere/get_v_sphere_node_types_responses.go deleted file mode 100644 index 2cf626c438..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_node_types_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereNodeTypesReader is a Reader for the GetVSphereNodeTypes structure. -type GetVSphereNodeTypesReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetVSphereNodeTypesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetVSphereNodeTypesOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetVSphereNodeTypesBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetVSphereNodeTypesUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetVSphereNodeTypesInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetVSphereNodeTypesOK creates a GetVSphereNodeTypesOK with default headers values -func NewGetVSphereNodeTypesOK() *GetVSphereNodeTypesOK { - return &GetVSphereNodeTypesOK{} -} - -/* -GetVSphereNodeTypesOK handles this case with default header values. - -Successful retrieval of node types supported by vSphere -*/ -type GetVSphereNodeTypesOK struct { - Payload []*models.NodeType -} - -func (o *GetVSphereNodeTypesOK) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/nodetypes][%d] getVSphereNodeTypesOK %+v", 200, o.Payload) -} - -func (o *GetVSphereNodeTypesOK) GetPayload() []*models.NodeType { - return o.Payload -} - -func (o *GetVSphereNodeTypesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereNodeTypesBadRequest creates a GetVSphereNodeTypesBadRequest with default headers values -func NewGetVSphereNodeTypesBadRequest() *GetVSphereNodeTypesBadRequest { - return &GetVSphereNodeTypesBadRequest{} -} - -/* -GetVSphereNodeTypesBadRequest handles this case with default header values. - -Bad request -*/ -type GetVSphereNodeTypesBadRequest struct { - Payload *models.Error -} - -func (o *GetVSphereNodeTypesBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/nodetypes][%d] getVSphereNodeTypesBadRequest %+v", 400, o.Payload) -} - -func (o *GetVSphereNodeTypesBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereNodeTypesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereNodeTypesUnauthorized creates a GetVSphereNodeTypesUnauthorized with default headers values -func NewGetVSphereNodeTypesUnauthorized() *GetVSphereNodeTypesUnauthorized { - return &GetVSphereNodeTypesUnauthorized{} -} - -/* -GetVSphereNodeTypesUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetVSphereNodeTypesUnauthorized struct { - Payload *models.Error -} - -func (o *GetVSphereNodeTypesUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/nodetypes][%d] getVSphereNodeTypesUnauthorized %+v", 401, o.Payload) -} - -func (o *GetVSphereNodeTypesUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereNodeTypesUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereNodeTypesInternalServerError creates a GetVSphereNodeTypesInternalServerError with default headers values -func NewGetVSphereNodeTypesInternalServerError() *GetVSphereNodeTypesInternalServerError { - return &GetVSphereNodeTypesInternalServerError{} -} - -/* -GetVSphereNodeTypesInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetVSphereNodeTypesInternalServerError struct { - Payload *models.Error -} - -func (o *GetVSphereNodeTypesInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/nodetypes][%d] getVSphereNodeTypesInternalServerError %+v", 500, o.Payload) -} - -func (o *GetVSphereNodeTypesInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereNodeTypesInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_o_s_images_parameters.go b/tkg/web/server/client/vsphere/get_v_sphere_o_s_images_parameters.go deleted file mode 100644 index a10f8ac9ce..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_o_s_images_parameters.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereOSImagesParams creates a new GetVSphereOSImagesParams object -// with the default values initialized. -func NewGetVSphereOSImagesParams() *GetVSphereOSImagesParams { - var () - return &GetVSphereOSImagesParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetVSphereOSImagesParamsWithTimeout creates a new GetVSphereOSImagesParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetVSphereOSImagesParamsWithTimeout(timeout time.Duration) *GetVSphereOSImagesParams { - var () - return &GetVSphereOSImagesParams{ - - timeout: timeout, - } -} - -// NewGetVSphereOSImagesParamsWithContext creates a new GetVSphereOSImagesParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetVSphereOSImagesParamsWithContext(ctx context.Context) *GetVSphereOSImagesParams { - var () - return &GetVSphereOSImagesParams{ - - Context: ctx, - } -} - -// NewGetVSphereOSImagesParamsWithHTTPClient creates a new GetVSphereOSImagesParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetVSphereOSImagesParamsWithHTTPClient(client *http.Client) *GetVSphereOSImagesParams { - var () - return &GetVSphereOSImagesParams{ - HTTPClient: client, - } -} - -/* -GetVSphereOSImagesParams contains all the parameters to send to the API endpoint -for the get v sphere o s images operation typically these are written to a http.Request -*/ -type GetVSphereOSImagesParams struct { - - /*Dc - datacenter managed object Id, e.g. datacenter-2 - - */ - Dc string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get v sphere o s images params -func (o *GetVSphereOSImagesParams) WithTimeout(timeout time.Duration) *GetVSphereOSImagesParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get v sphere o s images params -func (o *GetVSphereOSImagesParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get v sphere o s images params -func (o *GetVSphereOSImagesParams) WithContext(ctx context.Context) *GetVSphereOSImagesParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get v sphere o s images params -func (o *GetVSphereOSImagesParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get v sphere o s images params -func (o *GetVSphereOSImagesParams) WithHTTPClient(client *http.Client) *GetVSphereOSImagesParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get v sphere o s images params -func (o *GetVSphereOSImagesParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithDc adds the dc to the get v sphere o s images params -func (o *GetVSphereOSImagesParams) WithDc(dc string) *GetVSphereOSImagesParams { - o.SetDc(dc) - return o -} - -// SetDc adds the dc to the get v sphere o s images params -func (o *GetVSphereOSImagesParams) SetDc(dc string) { - o.Dc = dc -} - -// WriteToRequest writes these params to a swagger request -func (o *GetVSphereOSImagesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // query param dc - qrDc := o.Dc - qDc := qrDc - if qDc != "" { - if err := r.SetQueryParam("dc", qDc); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_o_s_images_responses.go b/tkg/web/server/client/vsphere/get_v_sphere_o_s_images_responses.go deleted file mode 100644 index d11f2272e5..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_o_s_images_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereOSImagesReader is a Reader for the GetVSphereOSImages structure. -type GetVSphereOSImagesReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetVSphereOSImagesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetVSphereOSImagesOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetVSphereOSImagesBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetVSphereOSImagesUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetVSphereOSImagesInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetVSphereOSImagesOK creates a GetVSphereOSImagesOK with default headers values -func NewGetVSphereOSImagesOK() *GetVSphereOSImagesOK { - return &GetVSphereOSImagesOK{} -} - -/* -GetVSphereOSImagesOK handles this case with default header values. - -Successful retrieval of node images supported by vSphere -*/ -type GetVSphereOSImagesOK struct { - Payload []*models.VSphereVirtualMachine -} - -func (o *GetVSphereOSImagesOK) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/osimages][%d] getVSphereOSImagesOK %+v", 200, o.Payload) -} - -func (o *GetVSphereOSImagesOK) GetPayload() []*models.VSphereVirtualMachine { - return o.Payload -} - -func (o *GetVSphereOSImagesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereOSImagesBadRequest creates a GetVSphereOSImagesBadRequest with default headers values -func NewGetVSphereOSImagesBadRequest() *GetVSphereOSImagesBadRequest { - return &GetVSphereOSImagesBadRequest{} -} - -/* -GetVSphereOSImagesBadRequest handles this case with default header values. - -Bad request -*/ -type GetVSphereOSImagesBadRequest struct { - Payload *models.Error -} - -func (o *GetVSphereOSImagesBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/osimages][%d] getVSphereOSImagesBadRequest %+v", 400, o.Payload) -} - -func (o *GetVSphereOSImagesBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereOSImagesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereOSImagesUnauthorized creates a GetVSphereOSImagesUnauthorized with default headers values -func NewGetVSphereOSImagesUnauthorized() *GetVSphereOSImagesUnauthorized { - return &GetVSphereOSImagesUnauthorized{} -} - -/* -GetVSphereOSImagesUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetVSphereOSImagesUnauthorized struct { - Payload *models.Error -} - -func (o *GetVSphereOSImagesUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/osimages][%d] getVSphereOSImagesUnauthorized %+v", 401, o.Payload) -} - -func (o *GetVSphereOSImagesUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereOSImagesUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereOSImagesInternalServerError creates a GetVSphereOSImagesInternalServerError with default headers values -func NewGetVSphereOSImagesInternalServerError() *GetVSphereOSImagesInternalServerError { - return &GetVSphereOSImagesInternalServerError{} -} - -/* -GetVSphereOSImagesInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetVSphereOSImagesInternalServerError struct { - Payload *models.Error -} - -func (o *GetVSphereOSImagesInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/osimages][%d] getVSphereOSImagesInternalServerError %+v", 500, o.Payload) -} - -func (o *GetVSphereOSImagesInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereOSImagesInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_resource_pools_parameters.go b/tkg/web/server/client/vsphere/get_v_sphere_resource_pools_parameters.go deleted file mode 100644 index 9897b4ae42..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_resource_pools_parameters.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereResourcePoolsParams creates a new GetVSphereResourcePoolsParams object -// with the default values initialized. -func NewGetVSphereResourcePoolsParams() *GetVSphereResourcePoolsParams { - var () - return &GetVSphereResourcePoolsParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetVSphereResourcePoolsParamsWithTimeout creates a new GetVSphereResourcePoolsParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetVSphereResourcePoolsParamsWithTimeout(timeout time.Duration) *GetVSphereResourcePoolsParams { - var () - return &GetVSphereResourcePoolsParams{ - - timeout: timeout, - } -} - -// NewGetVSphereResourcePoolsParamsWithContext creates a new GetVSphereResourcePoolsParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetVSphereResourcePoolsParamsWithContext(ctx context.Context) *GetVSphereResourcePoolsParams { - var () - return &GetVSphereResourcePoolsParams{ - - Context: ctx, - } -} - -// NewGetVSphereResourcePoolsParamsWithHTTPClient creates a new GetVSphereResourcePoolsParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetVSphereResourcePoolsParamsWithHTTPClient(client *http.Client) *GetVSphereResourcePoolsParams { - var () - return &GetVSphereResourcePoolsParams{ - HTTPClient: client, - } -} - -/* -GetVSphereResourcePoolsParams contains all the parameters to send to the API endpoint -for the get v sphere resource pools operation typically these are written to a http.Request -*/ -type GetVSphereResourcePoolsParams struct { - - /*Dc - datacenter managed object Id, e.g. datacenter-2 - - */ - Dc string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get v sphere resource pools params -func (o *GetVSphereResourcePoolsParams) WithTimeout(timeout time.Duration) *GetVSphereResourcePoolsParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get v sphere resource pools params -func (o *GetVSphereResourcePoolsParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get v sphere resource pools params -func (o *GetVSphereResourcePoolsParams) WithContext(ctx context.Context) *GetVSphereResourcePoolsParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get v sphere resource pools params -func (o *GetVSphereResourcePoolsParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get v sphere resource pools params -func (o *GetVSphereResourcePoolsParams) WithHTTPClient(client *http.Client) *GetVSphereResourcePoolsParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get v sphere resource pools params -func (o *GetVSphereResourcePoolsParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithDc adds the dc to the get v sphere resource pools params -func (o *GetVSphereResourcePoolsParams) WithDc(dc string) *GetVSphereResourcePoolsParams { - o.SetDc(dc) - return o -} - -// SetDc adds the dc to the get v sphere resource pools params -func (o *GetVSphereResourcePoolsParams) SetDc(dc string) { - o.Dc = dc -} - -// WriteToRequest writes these params to a swagger request -func (o *GetVSphereResourcePoolsParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // query param dc - qrDc := o.Dc - qDc := qrDc - if qDc != "" { - if err := r.SetQueryParam("dc", qDc); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/get_v_sphere_resource_pools_responses.go b/tkg/web/server/client/vsphere/get_v_sphere_resource_pools_responses.go deleted file mode 100644 index 25d01cc614..0000000000 --- a/tkg/web/server/client/vsphere/get_v_sphere_resource_pools_responses.go +++ /dev/null @@ -1,189 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereResourcePoolsReader is a Reader for the GetVSphereResourcePools structure. -type GetVSphereResourcePoolsReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetVSphereResourcePoolsReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetVSphereResourcePoolsOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetVSphereResourcePoolsBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetVSphereResourcePoolsUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetVSphereResourcePoolsInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetVSphereResourcePoolsOK creates a GetVSphereResourcePoolsOK with default headers values -func NewGetVSphereResourcePoolsOK() *GetVSphereResourcePoolsOK { - return &GetVSphereResourcePoolsOK{} -} - -/* -GetVSphereResourcePoolsOK handles this case with default header values. - -Successful retrieval of vSphere resourcePools -*/ -type GetVSphereResourcePoolsOK struct { - Payload []*models.VSphereResourcePool -} - -func (o *GetVSphereResourcePoolsOK) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/resourcepools][%d] getVSphereResourcePoolsOK %+v", 200, o.Payload) -} - -func (o *GetVSphereResourcePoolsOK) GetPayload() []*models.VSphereResourcePool { - return o.Payload -} - -func (o *GetVSphereResourcePoolsOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - // response payload - if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereResourcePoolsBadRequest creates a GetVSphereResourcePoolsBadRequest with default headers values -func NewGetVSphereResourcePoolsBadRequest() *GetVSphereResourcePoolsBadRequest { - return &GetVSphereResourcePoolsBadRequest{} -} - -/* -GetVSphereResourcePoolsBadRequest handles this case with default header values. - -Bad request -*/ -type GetVSphereResourcePoolsBadRequest struct { - Payload *models.Error -} - -func (o *GetVSphereResourcePoolsBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/resourcepools][%d] getVSphereResourcePoolsBadRequest %+v", 400, o.Payload) -} - -func (o *GetVSphereResourcePoolsBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereResourcePoolsBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereResourcePoolsUnauthorized creates a GetVSphereResourcePoolsUnauthorized with default headers values -func NewGetVSphereResourcePoolsUnauthorized() *GetVSphereResourcePoolsUnauthorized { - return &GetVSphereResourcePoolsUnauthorized{} -} - -/* -GetVSphereResourcePoolsUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetVSphereResourcePoolsUnauthorized struct { - Payload *models.Error -} - -func (o *GetVSphereResourcePoolsUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/resourcepools][%d] getVSphereResourcePoolsUnauthorized %+v", 401, o.Payload) -} - -func (o *GetVSphereResourcePoolsUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereResourcePoolsUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVSphereResourcePoolsInternalServerError creates a GetVSphereResourcePoolsInternalServerError with default headers values -func NewGetVSphereResourcePoolsInternalServerError() *GetVSphereResourcePoolsInternalServerError { - return &GetVSphereResourcePoolsInternalServerError{} -} - -/* -GetVSphereResourcePoolsInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetVSphereResourcePoolsInternalServerError struct { - Payload *models.Error -} - -func (o *GetVSphereResourcePoolsInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/resourcepools][%d] getVSphereResourcePoolsInternalServerError %+v", 500, o.Payload) -} - -func (o *GetVSphereResourcePoolsInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVSphereResourcePoolsInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/get_vsphere_thumbprint_parameters.go b/tkg/web/server/client/vsphere/get_vsphere_thumbprint_parameters.go deleted file mode 100644 index c6154387eb..0000000000 --- a/tkg/web/server/client/vsphere/get_vsphere_thumbprint_parameters.go +++ /dev/null @@ -1,141 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVsphereThumbprintParams creates a new GetVsphereThumbprintParams object -// with the default values initialized. -func NewGetVsphereThumbprintParams() *GetVsphereThumbprintParams { - var () - return &GetVsphereThumbprintParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewGetVsphereThumbprintParamsWithTimeout creates a new GetVsphereThumbprintParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewGetVsphereThumbprintParamsWithTimeout(timeout time.Duration) *GetVsphereThumbprintParams { - var () - return &GetVsphereThumbprintParams{ - - timeout: timeout, - } -} - -// NewGetVsphereThumbprintParamsWithContext creates a new GetVsphereThumbprintParams object -// with the default values initialized, and the ability to set a context for a request -func NewGetVsphereThumbprintParamsWithContext(ctx context.Context) *GetVsphereThumbprintParams { - var () - return &GetVsphereThumbprintParams{ - - Context: ctx, - } -} - -// NewGetVsphereThumbprintParamsWithHTTPClient creates a new GetVsphereThumbprintParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewGetVsphereThumbprintParamsWithHTTPClient(client *http.Client) *GetVsphereThumbprintParams { - var () - return &GetVsphereThumbprintParams{ - HTTPClient: client, - } -} - -/* -GetVsphereThumbprintParams contains all the parameters to send to the API endpoint -for the get vsphere thumbprint operation typically these are written to a http.Request -*/ -type GetVsphereThumbprintParams struct { - - /*Host - vSphere host - - */ - Host string - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the get vsphere thumbprint params -func (o *GetVsphereThumbprintParams) WithTimeout(timeout time.Duration) *GetVsphereThumbprintParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the get vsphere thumbprint params -func (o *GetVsphereThumbprintParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the get vsphere thumbprint params -func (o *GetVsphereThumbprintParams) WithContext(ctx context.Context) *GetVsphereThumbprintParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the get vsphere thumbprint params -func (o *GetVsphereThumbprintParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the get vsphere thumbprint params -func (o *GetVsphereThumbprintParams) WithHTTPClient(client *http.Client) *GetVsphereThumbprintParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the get vsphere thumbprint params -func (o *GetVsphereThumbprintParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithHost adds the host to the get vsphere thumbprint params -func (o *GetVsphereThumbprintParams) WithHost(host string) *GetVsphereThumbprintParams { - o.SetHost(host) - return o -} - -// SetHost adds the host to the get vsphere thumbprint params -func (o *GetVsphereThumbprintParams) SetHost(host string) { - o.Host = host -} - -// WriteToRequest writes these params to a swagger request -func (o *GetVsphereThumbprintParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - // query param host - qrHost := o.Host - qHost := qrHost - if qHost != "" { - if err := r.SetQueryParam("host", qHost); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/get_vsphere_thumbprint_responses.go b/tkg/web/server/client/vsphere/get_vsphere_thumbprint_responses.go deleted file mode 100644 index 3c0b821f25..0000000000 --- a/tkg/web/server/client/vsphere/get_vsphere_thumbprint_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVsphereThumbprintReader is a Reader for the GetVsphereThumbprint structure. -type GetVsphereThumbprintReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *GetVsphereThumbprintReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewGetVsphereThumbprintOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewGetVsphereThumbprintBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewGetVsphereThumbprintUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewGetVsphereThumbprintInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewGetVsphereThumbprintOK creates a GetVsphereThumbprintOK with default headers values -func NewGetVsphereThumbprintOK() *GetVsphereThumbprintOK { - return &GetVsphereThumbprintOK{} -} - -/* -GetVsphereThumbprintOK handles this case with default header values. - -Successful retrieval of vSphere thumbprint -*/ -type GetVsphereThumbprintOK struct { - Payload *models.VSphereThumbprint -} - -func (o *GetVsphereThumbprintOK) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/thumbprint][%d] getVsphereThumbprintOK %+v", 200, o.Payload) -} - -func (o *GetVsphereThumbprintOK) GetPayload() *models.VSphereThumbprint { - return o.Payload -} - -func (o *GetVsphereThumbprintOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.VSphereThumbprint) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVsphereThumbprintBadRequest creates a GetVsphereThumbprintBadRequest with default headers values -func NewGetVsphereThumbprintBadRequest() *GetVsphereThumbprintBadRequest { - return &GetVsphereThumbprintBadRequest{} -} - -/* -GetVsphereThumbprintBadRequest handles this case with default header values. - -Bad request -*/ -type GetVsphereThumbprintBadRequest struct { - Payload *models.Error -} - -func (o *GetVsphereThumbprintBadRequest) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/thumbprint][%d] getVsphereThumbprintBadRequest %+v", 400, o.Payload) -} - -func (o *GetVsphereThumbprintBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVsphereThumbprintBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVsphereThumbprintUnauthorized creates a GetVsphereThumbprintUnauthorized with default headers values -func NewGetVsphereThumbprintUnauthorized() *GetVsphereThumbprintUnauthorized { - return &GetVsphereThumbprintUnauthorized{} -} - -/* -GetVsphereThumbprintUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type GetVsphereThumbprintUnauthorized struct { - Payload *models.Error -} - -func (o *GetVsphereThumbprintUnauthorized) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/thumbprint][%d] getVsphereThumbprintUnauthorized %+v", 401, o.Payload) -} - -func (o *GetVsphereThumbprintUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVsphereThumbprintUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewGetVsphereThumbprintInternalServerError creates a GetVsphereThumbprintInternalServerError with default headers values -func NewGetVsphereThumbprintInternalServerError() *GetVsphereThumbprintInternalServerError { - return &GetVsphereThumbprintInternalServerError{} -} - -/* -GetVsphereThumbprintInternalServerError handles this case with default header values. - -Internal server error -*/ -type GetVsphereThumbprintInternalServerError struct { - Payload *models.Error -} - -func (o *GetVsphereThumbprintInternalServerError) Error() string { - return fmt.Sprintf("[GET /api/providers/vsphere/thumbprint][%d] getVsphereThumbprintInternalServerError %+v", 500, o.Payload) -} - -func (o *GetVsphereThumbprintInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *GetVsphereThumbprintInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/import_t_k_g_config_for_vsphere_parameters.go b/tkg/web/server/client/vsphere/import_t_k_g_config_for_vsphere_parameters.go deleted file mode 100644 index 94868bc800..0000000000 --- a/tkg/web/server/client/vsphere/import_t_k_g_config_for_vsphere_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewImportTKGConfigForVsphereParams creates a new ImportTKGConfigForVsphereParams object -// with the default values initialized. -func NewImportTKGConfigForVsphereParams() *ImportTKGConfigForVsphereParams { - var () - return &ImportTKGConfigForVsphereParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewImportTKGConfigForVsphereParamsWithTimeout creates a new ImportTKGConfigForVsphereParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewImportTKGConfigForVsphereParamsWithTimeout(timeout time.Duration) *ImportTKGConfigForVsphereParams { - var () - return &ImportTKGConfigForVsphereParams{ - - timeout: timeout, - } -} - -// NewImportTKGConfigForVsphereParamsWithContext creates a new ImportTKGConfigForVsphereParams object -// with the default values initialized, and the ability to set a context for a request -func NewImportTKGConfigForVsphereParamsWithContext(ctx context.Context) *ImportTKGConfigForVsphereParams { - var () - return &ImportTKGConfigForVsphereParams{ - - Context: ctx, - } -} - -// NewImportTKGConfigForVsphereParamsWithHTTPClient creates a new ImportTKGConfigForVsphereParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewImportTKGConfigForVsphereParamsWithHTTPClient(client *http.Client) *ImportTKGConfigForVsphereParams { - var () - return &ImportTKGConfigForVsphereParams{ - HTTPClient: client, - } -} - -/* -ImportTKGConfigForVsphereParams contains all the parameters to send to the API endpoint -for the import t k g config for vsphere operation typically these are written to a http.Request -*/ -type ImportTKGConfigForVsphereParams struct { - - /*Params - config file from which to generate tkg configuration for vsphere - - */ - Params *models.ConfigFile - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the import t k g config for vsphere params -func (o *ImportTKGConfigForVsphereParams) WithTimeout(timeout time.Duration) *ImportTKGConfigForVsphereParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the import t k g config for vsphere params -func (o *ImportTKGConfigForVsphereParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the import t k g config for vsphere params -func (o *ImportTKGConfigForVsphereParams) WithContext(ctx context.Context) *ImportTKGConfigForVsphereParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the import t k g config for vsphere params -func (o *ImportTKGConfigForVsphereParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the import t k g config for vsphere params -func (o *ImportTKGConfigForVsphereParams) WithHTTPClient(client *http.Client) *ImportTKGConfigForVsphereParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the import t k g config for vsphere params -func (o *ImportTKGConfigForVsphereParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithParams adds the params to the import t k g config for vsphere params -func (o *ImportTKGConfigForVsphereParams) WithParams(params *models.ConfigFile) *ImportTKGConfigForVsphereParams { - o.SetParams(params) - return o -} - -// SetParams adds the params to the import t k g config for vsphere params -func (o *ImportTKGConfigForVsphereParams) SetParams(params *models.ConfigFile) { - o.Params = params -} - -// WriteToRequest writes these params to a swagger request -func (o *ImportTKGConfigForVsphereParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Params != nil { - if err := r.SetBodyParam(o.Params); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/import_t_k_g_config_for_vsphere_responses.go b/tkg/web/server/client/vsphere/import_t_k_g_config_for_vsphere_responses.go deleted file mode 100644 index 19f0faacbf..0000000000 --- a/tkg/web/server/client/vsphere/import_t_k_g_config_for_vsphere_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ImportTKGConfigForVsphereReader is a Reader for the ImportTKGConfigForVsphere structure. -type ImportTKGConfigForVsphereReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *ImportTKGConfigForVsphereReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 200: - result := NewImportTKGConfigForVsphereOK() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewImportTKGConfigForVsphereBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewImportTKGConfigForVsphereUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewImportTKGConfigForVsphereInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewImportTKGConfigForVsphereOK creates a ImportTKGConfigForVsphereOK with default headers values -func NewImportTKGConfigForVsphereOK() *ImportTKGConfigForVsphereOK { - return &ImportTKGConfigForVsphereOK{} -} - -/* -ImportTKGConfigForVsphereOK handles this case with default header values. - -Generated TKG configuration successfully -*/ -type ImportTKGConfigForVsphereOK struct { - Payload *models.VsphereRegionalClusterParams -} - -func (o *ImportTKGConfigForVsphereOK) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/config/import][%d] importTKGConfigForVsphereOK %+v", 200, o.Payload) -} - -func (o *ImportTKGConfigForVsphereOK) GetPayload() *models.VsphereRegionalClusterParams { - return o.Payload -} - -func (o *ImportTKGConfigForVsphereOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.VsphereRegionalClusterParams) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForVsphereBadRequest creates a ImportTKGConfigForVsphereBadRequest with default headers values -func NewImportTKGConfigForVsphereBadRequest() *ImportTKGConfigForVsphereBadRequest { - return &ImportTKGConfigForVsphereBadRequest{} -} - -/* -ImportTKGConfigForVsphereBadRequest handles this case with default header values. - -Bad request -*/ -type ImportTKGConfigForVsphereBadRequest struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForVsphereBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/config/import][%d] importTKGConfigForVsphereBadRequest %+v", 400, o.Payload) -} - -func (o *ImportTKGConfigForVsphereBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForVsphereBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForVsphereUnauthorized creates a ImportTKGConfigForVsphereUnauthorized with default headers values -func NewImportTKGConfigForVsphereUnauthorized() *ImportTKGConfigForVsphereUnauthorized { - return &ImportTKGConfigForVsphereUnauthorized{} -} - -/* -ImportTKGConfigForVsphereUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type ImportTKGConfigForVsphereUnauthorized struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForVsphereUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/config/import][%d] importTKGConfigForVsphereUnauthorized %+v", 401, o.Payload) -} - -func (o *ImportTKGConfigForVsphereUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForVsphereUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewImportTKGConfigForVsphereInternalServerError creates a ImportTKGConfigForVsphereInternalServerError with default headers values -func NewImportTKGConfigForVsphereInternalServerError() *ImportTKGConfigForVsphereInternalServerError { - return &ImportTKGConfigForVsphereInternalServerError{} -} - -/* -ImportTKGConfigForVsphereInternalServerError handles this case with default header values. - -Internal server error -*/ -type ImportTKGConfigForVsphereInternalServerError struct { - Payload *models.Error -} - -func (o *ImportTKGConfigForVsphereInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere/config/import][%d] importTKGConfigForVsphereInternalServerError %+v", 500, o.Payload) -} - -func (o *ImportTKGConfigForVsphereInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *ImportTKGConfigForVsphereInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/set_v_sphere_endpoint_parameters.go b/tkg/web/server/client/vsphere/set_v_sphere_endpoint_parameters.go deleted file mode 100644 index 2e9d4c36ef..0000000000 --- a/tkg/web/server/client/vsphere/set_v_sphere_endpoint_parameters.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "context" - "net/http" - "time" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - cr "github.com/go-openapi/runtime/client" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewSetVSphereEndpointParams creates a new SetVSphereEndpointParams object -// with the default values initialized. -func NewSetVSphereEndpointParams() *SetVSphereEndpointParams { - var () - return &SetVSphereEndpointParams{ - - timeout: cr.DefaultTimeout, - } -} - -// NewSetVSphereEndpointParamsWithTimeout creates a new SetVSphereEndpointParams object -// with the default values initialized, and the ability to set a timeout on a request -func NewSetVSphereEndpointParamsWithTimeout(timeout time.Duration) *SetVSphereEndpointParams { - var () - return &SetVSphereEndpointParams{ - - timeout: timeout, - } -} - -// NewSetVSphereEndpointParamsWithContext creates a new SetVSphereEndpointParams object -// with the default values initialized, and the ability to set a context for a request -func NewSetVSphereEndpointParamsWithContext(ctx context.Context) *SetVSphereEndpointParams { - var () - return &SetVSphereEndpointParams{ - - Context: ctx, - } -} - -// NewSetVSphereEndpointParamsWithHTTPClient creates a new SetVSphereEndpointParams object -// with the default values initialized, and the ability to set a custom HTTPClient for a request -func NewSetVSphereEndpointParamsWithHTTPClient(client *http.Client) *SetVSphereEndpointParams { - var () - return &SetVSphereEndpointParams{ - HTTPClient: client, - } -} - -/* -SetVSphereEndpointParams contains all the parameters to send to the API endpoint -for the set v sphere endpoint operation typically these are written to a http.Request -*/ -type SetVSphereEndpointParams struct { - - /*Credentials - vSphere credentials - - */ - Credentials *models.VSphereCredentials - - timeout time.Duration - Context context.Context - HTTPClient *http.Client -} - -// WithTimeout adds the timeout to the set v sphere endpoint params -func (o *SetVSphereEndpointParams) WithTimeout(timeout time.Duration) *SetVSphereEndpointParams { - o.SetTimeout(timeout) - return o -} - -// SetTimeout adds the timeout to the set v sphere endpoint params -func (o *SetVSphereEndpointParams) SetTimeout(timeout time.Duration) { - o.timeout = timeout -} - -// WithContext adds the context to the set v sphere endpoint params -func (o *SetVSphereEndpointParams) WithContext(ctx context.Context) *SetVSphereEndpointParams { - o.SetContext(ctx) - return o -} - -// SetContext adds the context to the set v sphere endpoint params -func (o *SetVSphereEndpointParams) SetContext(ctx context.Context) { - o.Context = ctx -} - -// WithHTTPClient adds the HTTPClient to the set v sphere endpoint params -func (o *SetVSphereEndpointParams) WithHTTPClient(client *http.Client) *SetVSphereEndpointParams { - o.SetHTTPClient(client) - return o -} - -// SetHTTPClient adds the HTTPClient to the set v sphere endpoint params -func (o *SetVSphereEndpointParams) SetHTTPClient(client *http.Client) { - o.HTTPClient = client -} - -// WithCredentials adds the credentials to the set v sphere endpoint params -func (o *SetVSphereEndpointParams) WithCredentials(credentials *models.VSphereCredentials) *SetVSphereEndpointParams { - o.SetCredentials(credentials) - return o -} - -// SetCredentials adds the credentials to the set v sphere endpoint params -func (o *SetVSphereEndpointParams) SetCredentials(credentials *models.VSphereCredentials) { - o.Credentials = credentials -} - -// WriteToRequest writes these params to a swagger request -func (o *SetVSphereEndpointParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { - - if err := r.SetTimeout(o.timeout); err != nil { - return err - } - var res []error - - if o.Credentials != nil { - if err := r.SetBodyParam(o.Credentials); err != nil { - return err - } - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/client/vsphere/set_v_sphere_endpoint_responses.go b/tkg/web/server/client/vsphere/set_v_sphere_endpoint_responses.go deleted file mode 100644 index 938e428f47..0000000000 --- a/tkg/web/server/client/vsphere/set_v_sphere_endpoint_responses.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "io" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// SetVSphereEndpointReader is a Reader for the SetVSphereEndpoint structure. -type SetVSphereEndpointReader struct { - formats strfmt.Registry -} - -// ReadResponse reads a server response into the received o. -func (o *SetVSphereEndpointReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { - switch response.Code() { - case 201: - result := NewSetVSphereEndpointCreated() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return result, nil - case 400: - result := NewSetVSphereEndpointBadRequest() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 401: - result := NewSetVSphereEndpointUnauthorized() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - case 500: - result := NewSetVSphereEndpointInternalServerError() - if err := result.readResponse(response, consumer, o.formats); err != nil { - return nil, err - } - return nil, result - - default: - return nil, runtime.NewAPIError("unknown error", response, response.Code()) - } -} - -// NewSetVSphereEndpointCreated creates a SetVSphereEndpointCreated with default headers values -func NewSetVSphereEndpointCreated() *SetVSphereEndpointCreated { - return &SetVSphereEndpointCreated{} -} - -/* -SetVSphereEndpointCreated handles this case with default header values. - -Connection successful -*/ -type SetVSphereEndpointCreated struct { - Payload *models.VsphereInfo -} - -func (o *SetVSphereEndpointCreated) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere][%d] setVSphereEndpointCreated %+v", 201, o.Payload) -} - -func (o *SetVSphereEndpointCreated) GetPayload() *models.VsphereInfo { - return o.Payload -} - -func (o *SetVSphereEndpointCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.VsphereInfo) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewSetVSphereEndpointBadRequest creates a SetVSphereEndpointBadRequest with default headers values -func NewSetVSphereEndpointBadRequest() *SetVSphereEndpointBadRequest { - return &SetVSphereEndpointBadRequest{} -} - -/* -SetVSphereEndpointBadRequest handles this case with default header values. - -Bad request -*/ -type SetVSphereEndpointBadRequest struct { - Payload *models.Error -} - -func (o *SetVSphereEndpointBadRequest) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere][%d] setVSphereEndpointBadRequest %+v", 400, o.Payload) -} - -func (o *SetVSphereEndpointBadRequest) GetPayload() *models.Error { - return o.Payload -} - -func (o *SetVSphereEndpointBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewSetVSphereEndpointUnauthorized creates a SetVSphereEndpointUnauthorized with default headers values -func NewSetVSphereEndpointUnauthorized() *SetVSphereEndpointUnauthorized { - return &SetVSphereEndpointUnauthorized{} -} - -/* -SetVSphereEndpointUnauthorized handles this case with default header values. - -Incorrect credentials -*/ -type SetVSphereEndpointUnauthorized struct { - Payload *models.Error -} - -func (o *SetVSphereEndpointUnauthorized) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere][%d] setVSphereEndpointUnauthorized %+v", 401, o.Payload) -} - -func (o *SetVSphereEndpointUnauthorized) GetPayload() *models.Error { - return o.Payload -} - -func (o *SetVSphereEndpointUnauthorized) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} - -// NewSetVSphereEndpointInternalServerError creates a SetVSphereEndpointInternalServerError with default headers values -func NewSetVSphereEndpointInternalServerError() *SetVSphereEndpointInternalServerError { - return &SetVSphereEndpointInternalServerError{} -} - -/* -SetVSphereEndpointInternalServerError handles this case with default header values. - -Internal server error -*/ -type SetVSphereEndpointInternalServerError struct { - Payload *models.Error -} - -func (o *SetVSphereEndpointInternalServerError) Error() string { - return fmt.Sprintf("[POST /api/providers/vsphere][%d] setVSphereEndpointInternalServerError %+v", 500, o.Payload) -} - -func (o *SetVSphereEndpointInternalServerError) GetPayload() *models.Error { - return o.Payload -} - -func (o *SetVSphereEndpointInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - - o.Payload = new(models.Error) - - // response payload - if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { - return err - } - - return nil -} diff --git a/tkg/web/server/client/vsphere/vsphere_client.go b/tkg/web/server/client/vsphere/vsphere_client.go deleted file mode 100644 index 51eb0d7505..0000000000 --- a/tkg/web/server/client/vsphere/vsphere_client.go +++ /dev/null @@ -1,508 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - - "github.com/go-openapi/runtime" - - strfmt "github.com/go-openapi/strfmt" -) - -// New creates a new vsphere API client. -func New(transport runtime.ClientTransport, formats strfmt.Registry) *Client { - return &Client{transport: transport, formats: formats} -} - -/* -Client for vsphere API -*/ -type Client struct { - transport runtime.ClientTransport - formats strfmt.Registry -} - -/* -ApplyTKGConfigForVsphere applies changes to t k g configuration file for v sphere -*/ -func (a *Client) ApplyTKGConfigForVsphere(params *ApplyTKGConfigForVsphereParams) (*ApplyTKGConfigForVsphereOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewApplyTKGConfigForVsphereParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "applyTKGConfigForVsphere", - Method: "POST", - PathPattern: "/api/providers/vsphere/tkgconfig", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ApplyTKGConfigForVsphereReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ApplyTKGConfigForVsphereOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for applyTKGConfigForVsphere: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -CreateVSphereRegionalCluster creates v sphere regional cluster -*/ -func (a *Client) CreateVSphereRegionalCluster(params *CreateVSphereRegionalClusterParams) (*CreateVSphereRegionalClusterOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewCreateVSphereRegionalClusterParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "createVSphereRegionalCluster", - Method: "POST", - PathPattern: "/api/providers/vsphere/create", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &CreateVSphereRegionalClusterReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*CreateVSphereRegionalClusterOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for createVSphereRegionalCluster: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -ExportTKGConfigForVsphere generates t k g configuration file for v sphere -*/ -func (a *Client) ExportTKGConfigForVsphere(params *ExportTKGConfigForVsphereParams) (*ExportTKGConfigForVsphereOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewExportTKGConfigForVsphereParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "exportTKGConfigForVsphere", - Method: "POST", - PathPattern: "/api/providers/vsphere/config/export", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ExportTKGConfigForVsphereReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ExportTKGConfigForVsphereOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for exportTKGConfigForVsphere: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetVSphereComputeResources retrieves v sphere compute resources -*/ -func (a *Client) GetVSphereComputeResources(params *GetVSphereComputeResourcesParams) (*GetVSphereComputeResourcesOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetVSphereComputeResourcesParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getVSphereComputeResources", - Method: "GET", - PathPattern: "/api/providers/vsphere/compute", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetVSphereComputeResourcesReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetVSphereComputeResourcesOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getVSphereComputeResources: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetVSphereDatacenters retrieves v sphere datacenters -*/ -func (a *Client) GetVSphereDatacenters(params *GetVSphereDatacentersParams) (*GetVSphereDatacentersOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetVSphereDatacentersParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getVSphereDatacenters", - Method: "GET", - PathPattern: "/api/providers/vsphere/datacenters", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetVSphereDatacentersReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetVSphereDatacentersOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getVSphereDatacenters: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetVSphereDatastores retrieves v sphere datastores -*/ -func (a *Client) GetVSphereDatastores(params *GetVSphereDatastoresParams) (*GetVSphereDatastoresOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetVSphereDatastoresParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getVSphereDatastores", - Method: "GET", - PathPattern: "/api/providers/vsphere/datastores", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetVSphereDatastoresReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetVSphereDatastoresOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getVSphereDatastores: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetVSphereFolders retrieves v sphere folders -*/ -func (a *Client) GetVSphereFolders(params *GetVSphereFoldersParams) (*GetVSphereFoldersOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetVSphereFoldersParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getVSphereFolders", - Method: "GET", - PathPattern: "/api/providers/vsphere/folders", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetVSphereFoldersReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetVSphereFoldersOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getVSphereFolders: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetVSphereNetworks retrieves networks associated with the datacenter in v sphere -*/ -func (a *Client) GetVSphereNetworks(params *GetVSphereNetworksParams) (*GetVSphereNetworksOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetVSphereNetworksParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getVSphereNetworks", - Method: "GET", - PathPattern: "/api/providers/vsphere/networks", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetVSphereNetworksReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetVSphereNetworksOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getVSphereNetworks: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetVSphereNodeTypes retrieves v sphere supported kubernetes control plane node types -*/ -func (a *Client) GetVSphereNodeTypes(params *GetVSphereNodeTypesParams) (*GetVSphereNodeTypesOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetVSphereNodeTypesParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getVSphereNodeTypes", - Method: "GET", - PathPattern: "/api/providers/vsphere/nodetypes", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetVSphereNodeTypesReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetVSphereNodeTypesOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getVSphereNodeTypes: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetVSphereOSImages retrieves v sphere supported node os images -*/ -func (a *Client) GetVSphereOSImages(params *GetVSphereOSImagesParams) (*GetVSphereOSImagesOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetVSphereOSImagesParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getVSphereOSImages", - Method: "GET", - PathPattern: "/api/providers/vsphere/osimages", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetVSphereOSImagesReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetVSphereOSImagesOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getVSphereOSImages: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetVSphereResourcePools retrieves v sphere resource pools -*/ -func (a *Client) GetVSphereResourcePools(params *GetVSphereResourcePoolsParams) (*GetVSphereResourcePoolsOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetVSphereResourcePoolsParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getVSphereResourcePools", - Method: "GET", - PathPattern: "/api/providers/vsphere/resourcepools", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetVSphereResourcePoolsReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetVSphereResourcePoolsOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getVSphereResourcePools: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -GetVsphereThumbprint gets v sphere thumbprint -*/ -func (a *Client) GetVsphereThumbprint(params *GetVsphereThumbprintParams) (*GetVsphereThumbprintOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewGetVsphereThumbprintParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "getVsphereThumbprint", - Method: "GET", - PathPattern: "/api/providers/vsphere/thumbprint", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &GetVsphereThumbprintReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*GetVsphereThumbprintOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for getVsphereThumbprint: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -ImportTKGConfigForVsphere generates t k g configuration object for v sphere -*/ -func (a *Client) ImportTKGConfigForVsphere(params *ImportTKGConfigForVsphereParams) (*ImportTKGConfigForVsphereOK, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewImportTKGConfigForVsphereParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "importTKGConfigForVsphere", - Method: "POST", - PathPattern: "/api/providers/vsphere/config/import", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &ImportTKGConfigForVsphereReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*ImportTKGConfigForVsphereOK) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for importTKGConfigForVsphere: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -/* -SetVSphereEndpoint validates and set v sphere credentials -*/ -func (a *Client) SetVSphereEndpoint(params *SetVSphereEndpointParams) (*SetVSphereEndpointCreated, error) { - // TODO: Validate the params before sending - if params == nil { - params = NewSetVSphereEndpointParams() - } - - result, err := a.transport.Submit(&runtime.ClientOperation{ - ID: "setVSphereEndpoint", - Method: "POST", - PathPattern: "/api/providers/vsphere", - ProducesMediaTypes: []string{"application/json"}, - ConsumesMediaTypes: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Params: params, - Reader: &SetVSphereEndpointReader{formats: a.formats}, - Context: params.Context, - Client: params.HTTPClient, - }) - if err != nil { - return nil, err - } - success, ok := result.(*SetVSphereEndpointCreated) - if ok { - return success, nil - } - // unexpected success response - // safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue - msg := fmt.Sprintf("unexpected success response for setVSphereEndpoint: API contract not enforced by server. Client expected to get an error, but got: %T", result) - panic(msg) -} - -// SetTransport changes the transport on the client -func (a *Client) SetTransport(transport runtime.ClientTransport) { - a.transport = transport -} diff --git a/tkg/web/server/handlers/app.go b/tkg/web/server/handlers/app.go deleted file mode 100644 index 32292a0619..0000000000 --- a/tkg/web/server/handlers/app.go +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package handlers implements api handlers -package handlers - -import ( - "path/filepath" - "time" - - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/edition" - - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/utils" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/avi" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/docker" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/features" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/ldap" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/provider" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/vsphere" - - aviClient "github.com/vmware-tanzu/tanzu-framework/tkg/avi" - awsclient "github.com/vmware-tanzu/tanzu-framework/tkg/aws" - azureclient "github.com/vmware-tanzu/tanzu-framework/tkg/azure" - ldapClient "github.com/vmware-tanzu/tanzu-framework/tkg/ldap" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/ws" -) - -// App application structs consisting init options and clients -type App struct { - InitOptions client.InitRegionOptions - AppConfig types.AppConfig - TKGTimeout time.Duration - vcClient vc.Client - awsClient awsclient.Client - azureClient azureclient.Client - aviClient aviClient.Client - ldapClient ldapClient.Client - TKGConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter - clusterConfigFile string -} - -// ConfigureHandlers configures API handlers func -func (app *App) ConfigureHandlers(api middleware.RoutableAPI) { // nolint:funlen - a, ok := api.(*operations.KickstartUIAPI) - if !ok { - panic("Cannot configure api") - } - - a.Logger = log.Infof - - a.JSONConsumer = runtime.JSONConsumer() - - a.JSONProducer = runtime.JSONProducer() - - a.ServerShutdown = func() {} - - a.ProviderGetProviderHandler = provider.GetProviderHandlerFunc(app.GetProvider) - a.VsphereSetVSphereEndpointHandler = vsphere.SetVSphereEndpointHandlerFunc(app.SetVSphereEndpoint) - a.VsphereGetVSphereDatacentersHandler = vsphere.GetVSphereDatacentersHandlerFunc(app.GetVSphereDatacenters) - a.VsphereGetVSphereDatastoresHandler = vsphere.GetVSphereDatastoresHandlerFunc(app.GetVSphereDatastores) - a.VsphereGetVSphereNetworksHandler = vsphere.GetVSphereNetworksHandlerFunc(app.GetVSphereNetworks) - a.VsphereGetVSphereResourcePoolsHandler = vsphere.GetVSphereResourcePoolsHandlerFunc(app.GetVSphereResourcePools) - a.VsphereCreateVSphereRegionalClusterHandler = vsphere.CreateVSphereRegionalClusterHandlerFunc(app.CreateVSphereRegionalCluster) - a.VsphereGetVSphereOSImagesHandler = vsphere.GetVSphereOSImagesHandlerFunc(app.GetVsphereOSImages) - a.VsphereGetVSphereFoldersHandler = vsphere.GetVSphereFoldersHandlerFunc(app.GetVSphereFolders) - a.VsphereGetVSphereComputeResourcesHandler = vsphere.GetVSphereComputeResourcesHandlerFunc(app.GetVsphereComputeResources) - a.VsphereApplyTKGConfigForVsphereHandler = vsphere.ApplyTKGConfigForVsphereHandlerFunc(app.ApplyTKGConfigForVsphere) - a.VsphereGetVsphereThumbprintHandler = vsphere.GetVsphereThumbprintHandlerFunc(app.GetVsphereThumbprint) - a.VsphereExportTKGConfigForVsphereHandler = vsphere.ExportTKGConfigForVsphereHandlerFunc(app.ExportVSphereConfig) - a.VsphereImportTKGConfigForVsphereHandler = vsphere.ImportTKGConfigForVsphereHandlerFunc(app.ImportVSphereConfig) - - a.AwsSetAWSEndpointHandler = aws.SetAWSEndpointHandlerFunc(app.SetAWSEndPoint) - a.AwsGetVPCsHandler = aws.GetVPCsHandlerFunc(app.GetVPCs) - a.AwsGetAWSAvailabilityZonesHandler = aws.GetAWSAvailabilityZonesHandlerFunc(app.GetAWSAvailabilityZones) - a.AwsGetAWSRegionsHandler = aws.GetAWSRegionsHandlerFunc(app.GetAWSRegions) - a.AwsCreateAWSRegionalClusterHandler = aws.CreateAWSRegionalClusterHandlerFunc(app.CreateAWSRegionalCluster) - a.AwsGetAWSSubnetsHandler = aws.GetAWSSubnetsHandlerFunc(app.GetAWSSubnets) - a.AwsApplyTKGConfigForAWSHandler = aws.ApplyTKGConfigForAWSHandlerFunc(app.ApplyTKGConfigForAWS) - a.AwsGetAWSNodeTypesHandler = aws.GetAWSNodeTypesHandlerFunc(app.GetAWSNodeTypes) - a.AwsGetAWSCredentialProfilesHandler = aws.GetAWSCredentialProfilesHandlerFunc(app.GetAWSCredentialProfiles) - a.AwsGetAWSOSImagesHandler = aws.GetAWSOSImagesHandlerFunc(app.GetAWSOSImages) - a.AwsExportTKGConfigForAWSHandler = aws.ExportTKGConfigForAWSHandlerFunc(app.ExportAWSConfig) - a.AwsImportTKGConfigForAWSHandler = aws.ImportTKGConfigForAWSHandlerFunc(app.ImportAwsConfig) - - a.AzureGetAzureEndpointHandler = azure.GetAzureEndpointHandlerFunc(app.GetAzureEndpoint) - a.AzureSetAzureEndpointHandler = azure.SetAzureEndpointHandlerFunc(app.SetAzureEndPoint) - a.AzureGetAzureResourceGroupsHandler = azure.GetAzureResourceGroupsHandlerFunc(app.GetAzureResourceGroups) - a.AzureCreateAzureResourceGroupHandler = azure.CreateAzureResourceGroupHandlerFunc(app.CreateAzureResourceGroup) - a.AzureGetAzureVnetsHandler = azure.GetAzureVnetsHandlerFunc(app.GetAzureVirtualNetworks) - a.AzureCreateAzureVirtualNetworkHandler = azure.CreateAzureVirtualNetworkHandlerFunc(app.CreateAzureVirtualNetwork) - a.AzureGetAzureRegionsHandler = azure.GetAzureRegionsHandlerFunc(app.GetAzureRegions) - a.AzureGetAzureInstanceTypesHandler = azure.GetAzureInstanceTypesHandlerFunc(app.GetAzureInstanceTypes) - a.AzureApplyTKGConfigForAzureHandler = azure.ApplyTKGConfigForAzureHandlerFunc(app.ApplyTKGConfigForAzure) - a.AzureCreateAzureRegionalClusterHandler = azure.CreateAzureRegionalClusterHandlerFunc(app.CreateAzureRegionalCluster) - a.AzureGetAzureOSImagesHandler = azure.GetAzureOSImagesHandlerFunc(app.GetAzureOSImages) - a.AzureExportTKGConfigForAzureHandler = azure.ExportTKGConfigForAzureHandlerFunc(app.ExportAzureConfig) - a.AzureImportTKGConfigForAzureHandler = azure.ImportTKGConfigForAzureHandlerFunc(app.ImportAzureConfig) - - a.DockerCheckIfDockerDaemonAvailableHandler = docker.CheckIfDockerDaemonAvailableHandlerFunc(app.IsDockerDaemonAvailable) - a.DockerApplyTKGConfigForDockerHandler = docker.ApplyTKGConfigForDockerHandlerFunc(app.ApplyTKGConfigForDocker) - a.DockerCreateDockerRegionalClusterHandler = docker.CreateDockerRegionalClusterHandlerFunc(app.CreateDockerRegionalCluster) - a.DockerExportTKGConfigForDockerHandler = docker.ExportTKGConfigForDockerHandlerFunc(app.ExportDockerConfig) - a.DockerImportTKGConfigForDockerHandler = docker.ImportTKGConfigForDockerHandlerFunc(app.ImportDockerConfig) - - a.FeaturesGetFeatureFlagsHandler = features.GetFeatureFlagsHandlerFunc(app.GetFeatureFlags) - a.EditionGetTanzuEditionHandler = edition.GetTanzuEditionHandlerFunc(app.GetTanzuEdition) - - a.AviVerifyAccountHandler = avi.VerifyAccountHandlerFunc(app.VerifyAccount) - a.AviGetAviCloudsHandler = avi.GetAviCloudsHandlerFunc(app.GetAviClouds) - a.AviGetAviServiceEngineGroupsHandler = avi.GetAviServiceEngineGroupsHandlerFunc(app.GetAviServiceEngineGroups) - a.AviGetAviVipNetworksHandler = avi.GetAviVipNetworksHandlerFunc(app.GetAviVipNetworks) - - a.LdapVerifyLdapConnectHandler = ldap.VerifyLdapConnectHandlerFunc(app.VerifyLdapConnect) - a.LdapVerifyLdapBindHandler = ldap.VerifyLdapBindHandlerFunc(app.VerifyLdapBind) - a.LdapVerifyLdapUserSearchHandler = ldap.VerifyLdapUserSearchHandlerFunc(app.VerifyUserSearch) - a.LdapVerifyLdapGroupSearchHandler = ldap.VerifyLdapGroupSearchHandlerFunc(app.VerifyGroupSearch) - a.LdapVerifyLdapCloseConnectionHandler = ldap.VerifyLdapCloseConnectionHandlerFunc(app.VerifyLdapCloseConnection) -} - -// StartSendingLogsToUI creates logchannel passes it to tkg logger -// retrieves the logs through logChannel and passes it to webSocket -func (app *App) StartSendingLogsToUI() { - logChannel := make(chan []byte) - log.SetChannel(logChannel) - for logMsg := range logChannel { - ws.SendLog(logMsg) - } -} - -func (app *App) getFilePathForSavingConfig() string { - if app.clusterConfigFile == "" { - randomFileName := utils.GenerateRandomID(10, true) + ".yaml" - app.clusterConfigFile = filepath.Join(app.AppConfig.TKGConfigDir, constants.TKGClusterConfigFileDirForUI, randomFileName) - } - return app.clusterConfigFile -} diff --git a/tkg/web/server/handlers/avi.go b/tkg/web/server/handlers/avi.go deleted file mode 100644 index 3d8c00b839..0000000000 --- a/tkg/web/server/handlers/avi.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "github.com/go-openapi/runtime/middleware" - "github.com/pkg/errors" - - aviclient "github.com/vmware-tanzu/tanzu-framework/tkg/avi" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/avi" -) - -// VerifyAccount validates avi credentials and sets the avi client into web app -func (app *App) VerifyAccount(params avi.VerifyAccountParams) middleware.Responder { - aviControllerParams := &models.AviControllerParams{ - Username: params.Credentials.Username, - Password: params.Credentials.Password, - Host: params.Credentials.Host, - Tenant: params.Credentials.Tenant, - CAData: params.Credentials.CAData, - } - - app.aviClient = aviclient.New() - authed, err := app.aviClient.VerifyAccount(aviControllerParams) - if err != nil { - return avi.NewVerifyAccountInternalServerError().WithPayload(Err(err)) - } - - if !authed { - return avi.NewVerifyAccountInternalServerError().WithPayload(Err(errors.Errorf("unable to authenticate due to incorrect credentials"))) - } - - return avi.NewVerifyAccountCreated() -} - -// GetAviClouds handles requests to GET avi clouds -func (app *App) GetAviClouds(params avi.GetAviCloudsParams) middleware.Responder { - if app.aviClient == nil { - return avi.NewGetAviCloudsInternalServerError().WithPayload(Err(errors.New("avi client is not initialized properly"))) - } - - aviClouds, err := app.aviClient.GetClouds() - if err != nil { - return avi.NewGetAviCloudsInternalServerError().WithPayload(Err(errors.Wrap(err, "unable to get avi clouds"))) - } - - return avi.NewGetAviCloudsOK().WithPayload(aviClouds) -} - -// GetAviServiceEngineGroups handles requests to GET avi service engine groups -func (app *App) GetAviServiceEngineGroups(params avi.GetAviServiceEngineGroupsParams) middleware.Responder { - if app.aviClient == nil { - return avi.NewGetAviServiceEngineGroupsInternalServerError().WithPayload(Err(errors.New("avi client is not initialized properly"))) - } - - aviServiceEngineGroups, err := app.aviClient.GetServiceEngineGroups() - if err != nil { - return avi.NewGetAviServiceEngineGroupsInternalServerError().WithPayload(Err(errors.Wrap(err, "unable to get avi service engine groups"))) - } - - return avi.NewGetAviServiceEngineGroupsOK().WithPayload(aviServiceEngineGroups) -} - -// GetAviVipNetworks handles requests to GET avi VIP networks -func (app *App) GetAviVipNetworks(params avi.GetAviVipNetworksParams) middleware.Responder { - if app.aviClient == nil { - return avi.NewGetAviVipNetworksInternalServerError().WithPayload(Err(errors.New("avi client is not initialized properly"))) - } - - aviVipNetworks, err := app.aviClient.GetVipNetworks() - if err != nil { - return avi.NewGetAviVipNetworksInternalServerError().WithPayload(Err(errors.Wrap(err, "unable to get avi VIP networks"))) - } - - return avi.NewGetAviVipNetworksOK().WithPayload(aviVipNetworks) -} diff --git a/tkg/web/server/handlers/aws.go b/tkg/web/server/handlers/aws.go deleted file mode 100644 index 23ab6bb8b8..0000000000 --- a/tkg/web/server/handlers/aws.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "fmt" - "os" - "sort" - - "github.com/go-openapi/runtime/middleware" - "github.com/pkg/errors" - "sigs.k8s.io/cluster-api-provider-aws/v2/cmd/clusterawsadm/credentials" - - awsclient "github.com/vmware-tanzu/tanzu-framework/tkg/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/aws" -) - -// SetAWSEndPoint verify and sets AWS account -func (app *App) SetAWSEndPoint(params aws.SetAWSEndpointParams) middleware.Responder { - var err error - var creds *credentials.AWSCredentials - - if params.AccountParams.AccessKeyID != "" && params.AccountParams.SecretAccessKey != "" { - creds = &credentials.AWSCredentials{ - Region: params.AccountParams.Region, - AccessKeyID: params.AccountParams.AccessKeyID, - SecretAccessKey: params.AccountParams.SecretAccessKey, - SessionToken: params.AccountParams.SessionToken, - } - } else { - if params.AccountParams.ProfileName != "" { - os.Setenv(constants.ConfigVariableAWSProfile, params.AccountParams.ProfileName) - } - creds, err = credentials.NewAWSCredentialFromDefaultChain(params.AccountParams.Region) - if err != nil { - return aws.NewSetAWSEndpointInternalServerError().WithPayload(Err(err)) - } - } - client, err := awsclient.New(*creds) - if err != nil { - return aws.NewSetAWSEndpointInternalServerError().WithPayload(Err(err)) - } - err = client.VerifyAccount() - if err != nil { - return aws.NewSetAWSEndpointInternalServerError().WithPayload(Err(err)) - } - app.awsClient = client - return aws.NewCreateAWSRegionalClusterOK() -} - -// GetVPCs gets all VPCs under current AWS account -func (app *App) GetVPCs(params aws.GetVPCsParams) middleware.Responder { - if app.awsClient == nil { - return aws.NewGetVPCsInternalServerError().WithPayload(Err(errors.New("aws client is not initialized properly"))) - } - - vpcs, err := app.awsClient.ListVPCs() - if err != nil { - return aws.NewGetVPCsInternalServerError().WithPayload(Err(err)) - } - - return aws.NewGetVPCsOK().WithPayload(vpcs) -} - -// GetAWSAvailabilityZones gets availability zones under user-specified region -func (app *App) GetAWSAvailabilityZones(params aws.GetAWSAvailabilityZonesParams) middleware.Responder { - if app.awsClient == nil { - return aws.NewGetAWSAvailabilityZonesInternalServerError().WithPayload(Err(errors.New("aws client is not initialized properly"))) - } - - azs, err := app.awsClient.ListAvailabilityZones() - if err != nil { - return aws.NewGetAWSAvailabilityZonesInternalServerError().WithPayload(Err(err)) - } - - return aws.NewGetAWSAvailabilityZonesOK().WithPayload(azs) -} - -// GetAWSRegions returns list of AWS regions -func (app *App) GetAWSRegions(params aws.GetAWSRegionsParams) middleware.Responder { - bomConfig, err := tkgconfigbom.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).GetDefaultTkrBOMConfiguration() - if err != nil { - return aws.NewGetAWSRegionsInternalServerError().WithPayload(Err(err)) - } - regions := []string{} - for region := range bomConfig.AMI { - regions = append(regions, region) - } - sort.Strings(regions) - return aws.NewGetAWSRegionsOK().WithPayload(regions) -} - -// GetAWSSubnets gets all subnets under given vpc ID -func (app *App) GetAWSSubnets(params aws.GetAWSSubnetsParams) middleware.Responder { - if app.awsClient == nil { - return aws.NewGetAWSSubnetsInternalServerError().WithPayload(Err(errors.New("aws client is not initialized properly"))) - } - - subnets, err := app.awsClient.ListSubnets(params.VpcID) - if err != nil { - return aws.NewGetAWSSubnetsInternalServerError().WithPayload(Err(err)) - } - - return aws.NewGetAWSSubnetsOK().WithPayload(subnets) -} - -// GetAWSNodeTypes gets aws node types -func (app *App) GetAWSNodeTypes(params aws.GetAWSNodeTypesParams) middleware.Responder { - if app.awsClient == nil { - return aws.NewGetAWSNodeTypesInternalServerError().WithPayload(Err(errors.New("aws client is not initialized properly"))) - } - - var result []string - var err error - if params.Az == nil { - result, err = app.awsClient.ListInstanceTypes("") - } else { - result, err = app.awsClient.ListInstanceTypes(*params.Az) - } - if err != nil { - return aws.NewGetAWSNodeTypesInternalServerError().WithPayload(Err(err)) - } - return aws.NewGetAWSNodeTypesOK().WithPayload(result) -} - -// GetAWSCredentialProfiles gets aws credential profile -func (app *App) GetAWSCredentialProfiles(params aws.GetAWSCredentialProfilesParams) middleware.Responder { - res, err := awsclient.ListCredentialProfiles("") - if err != nil { - return aws.NewGetAWSCredentialProfilesInternalServerError().WithPayload(Err(err)) - } - - return aws.NewGetAWSCredentialProfilesOK().WithPayload(res) -} - -// GetAWSOSImages gets os information for AWS -func (app *App) GetAWSOSImages(params aws.GetAWSOSImagesParams) middleware.Responder { - bomConfig, err := tkgconfigbom.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).GetDefaultTkrBOMConfiguration() - if err != nil { - return aws.NewGetAWSOSImagesInternalServerError().WithPayload(Err(err)) - } - - results := []*models.AWSVirtualMachine{} - - amis, exists := bomConfig.AMI[params.Region] - if !exists { - return aws.NewGetAWSOSImagesInternalServerError().WithPayload(Err(errors.Errorf("No AMI found for the provided region '%s'", params.Region))) - } - - for _, ami := range amis { - displayName := fmt.Sprintf("%s-%s-%s (%s)", ami.OSInfo.Name, ami.OSInfo.Version, ami.OSInfo.Arch, ami.ID) - results = append(results, &models.AWSVirtualMachine{ - Name: displayName, - OsInfo: &models.OSInfo{ - Name: ami.OSInfo.Name, - Version: ami.OSInfo.Version, - Arch: ami.OSInfo.Arch, - }, - }) - } - return aws.NewGetAWSOSImagesOK().WithPayload(results) -} diff --git a/tkg/web/server/handlers/azure.go b/tkg/web/server/handlers/azure.go deleted file mode 100644 index 4b3dcd7e57..0000000000 --- a/tkg/web/server/handlers/azure.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "errors" - "fmt" - "os" - - "github.com/go-openapi/runtime/middleware" - - azureclient "github.com/vmware-tanzu/tanzu-framework/tkg/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/azure" -) - -// GetAzureEndpoint gets azure account info set in environment variables -func (app *App) GetAzureEndpoint(params azure.GetAzureEndpointParams) middleware.Responder { - res := models.AzureAccountParams{ - SubscriptionID: os.Getenv(constants.ConfigVariableAzureSubscriptionID), - TenantID: os.Getenv(constants.ConfigVariableAzureTenantID), - ClientID: os.Getenv(constants.ConfigVariableAzureClientID), - ClientSecret: os.Getenv(constants.ConfigVariableAzureClientSecret), - } - - return azure.NewGetAzureEndpointOK().WithPayload(&res) -} - -// SetAzureEndPoint verify and sets Azure account -func (app *App) SetAzureEndPoint(params azure.SetAzureEndpointParams) middleware.Responder { - creds := azureclient.Credentials{ - SubscriptionID: params.AccountParams.SubscriptionID, - ClientID: params.AccountParams.ClientID, - ClientSecret: params.AccountParams.ClientSecret, - TenantID: params.AccountParams.TenantID, - AzureCloud: params.AccountParams.AzureCloud, - } - - client, err := azureclient.New(&creds) - if err != nil { - return azure.NewSetAzureEndpointInternalServerError().WithPayload(Err(err)) - } - - err = client.VerifyAccount(params.HTTPRequest.Context()) - if err != nil { - return azure.NewSetAzureEndpointInternalServerError().WithPayload(Err(err)) - } - - app.azureClient = client - return azure.NewSetAzureEndpointCreated() -} - -// GetAzureResourceGroups gets the list of all Azure resource groups -func (app *App) GetAzureResourceGroups(params azure.GetAzureResourceGroupsParams) middleware.Responder { - if app.azureClient == nil { - return azure.NewGetAzureResourceGroupsInternalServerError().WithPayload(Err(errors.New("azure client is not initialized properly"))) - } - - resourceGroups, err := app.azureClient.ListResourceGroups(params.HTTPRequest.Context(), params.Location) - if err != nil { - return azure.NewGetAzureResourceGroupsInternalServerError().WithPayload(Err(err)) - } - - return azure.NewGetAzureResourceGroupsOK().WithPayload(resourceGroups) -} - -// CreateAzureResourceGroup creates a new Azure resource group -func (app *App) CreateAzureResourceGroup(params azure.CreateAzureResourceGroupParams) middleware.Responder { - if app.azureClient == nil { - return azure.NewCreateAzureResourceGroupInternalServerError().WithPayload(Err(errors.New("azure client is not initialized properly"))) - } - - err := app.azureClient.CreateResourceGroup(params.HTTPRequest.Context(), *params.Params.Name, *params.Params.Location) - if err != nil { - return azure.NewCreateAzureResourceGroupInternalServerError().WithPayload(Err(err)) - } - - return azure.NewCreateAzureResourceGroupCreated() -} - -// GetAzureVirtualNetworks gets the list of all Azure virtual networks for a resource group -func (app *App) GetAzureVirtualNetworks(params azure.GetAzureVnetsParams) middleware.Responder { - if app.azureClient == nil { - return azure.NewGetAzureVnetsInternalServerError().WithPayload(Err(errors.New("azure client is not initialized properly"))) - } - - vnets, err := app.azureClient.ListVirtualNetworks(params.HTTPRequest.Context(), params.ResourceGroupName, params.Location) - if err != nil { - return azure.NewGetAzureVnetsInternalServerError().WithPayload(Err(err)) - } - - return azure.NewGetAzureVnetsOK().WithPayload(vnets) -} - -// CreateAzureVirtualNetwork creates a new Azure Virtual Network -func (app *App) CreateAzureVirtualNetwork(params azure.CreateAzureVirtualNetworkParams) middleware.Responder { - if app.azureClient == nil { - return azure.NewCreateAzureVirtualNetworkInternalServerError().WithPayload(Err(errors.New("azure client is not initialized properly"))) - } - - err := app.azureClient.CreateVirtualNetwork(params.HTTPRequest.Context(), params.ResourceGroupName, *params.Params.Name, *params.Params.CidrBlock, *params.Params.Location) - if err != nil { - return azure.NewCreateAzureVirtualNetworkInternalServerError().WithPayload(Err(err)) - } - - return azure.NewCreateAzureVirtualNetworkCreated() -} - -// GetAzureRegions gets a list of all available regions -func (app *App) GetAzureRegions(params azure.GetAzureRegionsParams) middleware.Responder { - if app.azureClient == nil { - return azure.NewGetAzureRegionsInternalServerError().WithPayload(Err(errors.New("azure client is not initialized properly"))) - } - - regions, err := app.azureClient.GetAzureRegions(params.HTTPRequest.Context()) - if err != nil { - return azure.NewGetAzureRegionsInternalServerError().WithPayload(Err(err)) - } - - return azure.NewGetAzureRegionsOK().WithPayload(regions) -} - -// GetAzureInstanceTypes lists the available instance types for a given region -func (app *App) GetAzureInstanceTypes(params azure.GetAzureInstanceTypesParams) middleware.Responder { - if app.azureClient == nil { - return azure.NewGetAzureInstanceTypesInternalServerError().WithPayload(Err(errors.New("azure client is not initialized properly"))) - } - - instanceTypes, err := app.azureClient.GetAzureInstanceTypesForRegion(params.HTTPRequest.Context(), params.Location) - if err != nil { - return azure.NewGetAzureInstanceTypesInternalServerError().WithPayload(Err(err)) - } - - return azure.NewGetAzureInstanceTypesOK().WithPayload(instanceTypes) -} - -// GetAzureOSImages gets os information for Azure -func (app *App) GetAzureOSImages(params azure.GetAzureOSImagesParams) middleware.Responder { - bomConfig, err := tkgconfigbom.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).GetDefaultTkrBOMConfiguration() - if err != nil { - return azure.NewGetAzureOSImagesInternalServerError().WithPayload(Err(err)) - } - - results := []*models.AzureVirtualMachine{} - for i := range bomConfig.Azure { - displayName := fmt.Sprintf("%s-%s-%s (%s)", bomConfig.Azure[i].OSInfo.Name, bomConfig.Azure[i].OSInfo.Version, bomConfig.Azure[i].OSInfo.Arch, bomConfig.Azure[i].Version) - results = append(results, &models.AzureVirtualMachine{ - Name: displayName, - OsInfo: &models.OSInfo{ - Name: bomConfig.Azure[i].OSInfo.Name, - Version: bomConfig.Azure[i].OSInfo.Version, - Arch: bomConfig.Azure[i].OSInfo.Arch, - }, - }) - } - - return azure.NewGetAzureOSImagesOK().WithPayload(results) -} diff --git a/tkg/web/server/handlers/config.go b/tkg/web/server/handlers/config.go deleted file mode 100644 index 6bf8922d1b..0000000000 --- a/tkg/web/server/handlers/config.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "github.com/go-openapi/runtime/middleware" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigproviders" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigupdater" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/docker" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/vsphere" -) - -// ApplyTKGConfigForVsphere applies TKG configuration for vSphere -func (app *App) ApplyTKGConfigForVsphere(params vsphere.ApplyTKGConfigForVsphereParams) middleware.Responder { // nolint:dupl - config, err := tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewVSphereConfig(params.Params) - if err != nil { - return vsphere.NewApplyTKGConfigForVsphereInternalServerError().WithPayload(Err(err)) - } - - err = tkgconfigupdater.SaveConfig(app.getFilePathForSavingConfig(), app.TKGConfigReaderWriter, config) - if err != nil { - return vsphere.NewApplyTKGConfigForVsphereInternalServerError().WithPayload(Err(err)) - } - return vsphere.NewApplyTKGConfigForVsphereOK().WithPayload(&models.ConfigFileInfo{Path: app.getFilePathForSavingConfig()}) -} - -// ApplyTKGConfigForAWS applies TKG configuration for AWS -func (app *App) ApplyTKGConfigForAWS(params aws.ApplyTKGConfigForAWSParams) middleware.Responder { - if app.awsClient == nil { - return aws.NewApplyTKGConfigForAWSInternalServerError().WithPayload(Err(errors.New("aws client is not initialized properly"))) - } - encodedCreds, err := app.awsClient.EncodeCredentials() - if err != nil { - return aws.NewApplyTKGConfigForAWSInternalServerError().WithPayload(Err(err)) - } - - config, err := tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewAWSConfig(params.Params, encodedCreds) - if err != nil { - return aws.NewApplyTKGConfigForAWSInternalServerError().WithPayload(Err(err)) - } - - err = tkgconfigupdater.SaveConfig(app.getFilePathForSavingConfig(), app.TKGConfigReaderWriter, config) - if err != nil { - return aws.NewApplyTKGConfigForAWSInternalServerError().WithPayload(Err(err)) - } - - return aws.NewApplyTKGConfigForAWSOK().WithPayload(&models.ConfigFileInfo{Path: app.getFilePathForSavingConfig()}) -} - -// ApplyTKGConfigForAzure applies TKG configuration for Azure -func (app *App) ApplyTKGConfigForAzure(params azure.ApplyTKGConfigForAzureParams) middleware.Responder { - if app.azureClient == nil { - return azure.NewApplyTKGConfigForAzureInternalServerError().WithPayload(Err(errors.New("azure client is not initialized properly"))) - } - - config, err := tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewAzureConfig(params.Params) - if err != nil { - return azure.NewApplyTKGConfigForAzureInternalServerError().WithPayload(Err(err)) - } - - err = tkgconfigupdater.SaveConfig(app.getFilePathForSavingConfig(), app.TKGConfigReaderWriter, config) - if err != nil { - return azure.NewApplyTKGConfigForAzureInternalServerError().WithPayload(Err(err)) - } - - return azure.NewApplyTKGConfigForAzureOK().WithPayload(&models.ConfigFileInfo{Path: app.getFilePathForSavingConfig()}) -} - -// ApplyTKGConfigForDocker applies TKG configuration for Docker -func (app *App) ApplyTKGConfigForDocker(params docker.ApplyTKGConfigForDockerParams) middleware.Responder { // nolint:dupl - config, err := tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewDockerConfig(params.Params) - if err != nil { - return docker.NewApplyTKGConfigForDockerInternalServerError().WithPayload(Err(err)) - } - - err = tkgconfigupdater.SaveConfig(app.getFilePathForSavingConfig(), app.TKGConfigReaderWriter, config) - if err != nil { - return docker.NewApplyTKGConfigForDockerInternalServerError().WithPayload(Err(err)) - } - - return docker.NewApplyTKGConfigForDockerOK().WithPayload(&models.ConfigFileInfo{Path: app.getFilePathForSavingConfig()}) -} diff --git a/tkg/web/server/handlers/docker.go b/tkg/web/server/handlers/docker.go deleted file mode 100644 index ad99bcab0f..0000000000 --- a/tkg/web/server/handlers/docker.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "github.com/go-openapi/runtime/middleware" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" - - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/clientcreator" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/docker" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" -) - -// IsDockerDaemonAvailable validates docker daemon availability -func (app *App) IsDockerDaemonAvailable(params docker.CheckIfDockerDaemonAvailableParams) middleware.Responder { - allClients, err := clientcreator.CreateAllClients(app.AppConfig, app.TKGConfigReaderWriter) - if err != nil { - return docker.NewCheckIfDockerDaemonAvailableInternalServerError().WithPayload(Err(err)) - } - - featureFlagClient, err := config.GetClientConfig() - if err != nil { - featureFlagClient = &configapi.ClientConfig{} - } - - c, err := client.New(client.Options{ - ClusterCtlClient: allClients.ClusterCtlClient, - ReaderWriterConfigClient: allClients.ConfigClient, - RegionManager: allClients.RegionManager, - TKGConfigDir: app.AppConfig.TKGConfigDir, - Timeout: app.TKGTimeout, - FeaturesClient: allClients.FeaturesClient, - TKGConfigProvidersClient: allClients.TKGConfigProvidersClient, - TKGBomClient: allClients.TKGBomClient, - TKGConfigUpdater: allClients.TKGConfigUpdaterClient, - TKGPathsClient: allClients.TKGConfigPathsClient, - ClusterClientFactory: clusterclient.NewClusterClientFactory(), - FeatureFlagClient: featureFlagClient, - }) - if err != nil { - return docker.NewCheckIfDockerDaemonAvailableInternalServerError().WithPayload(Err(err)) - } - - if err := c.ValidatePrerequisites(true, false); err != nil { - return docker.NewCheckIfDockerDaemonAvailableBadRequest().WithPayload(Err(err)) - } - - if err := c.ValidateDockerResourcePrerequisites(); err != nil { - return docker.NewCheckIfDockerDaemonAvailableBadRequest().WithPayload(Err(err)) - } - - status := models.DockerDaemonStatus{Status: true} - - return docker.NewCheckIfDockerDaemonAvailableOK().WithPayload(&status) -} diff --git a/tkg/web/server/handlers/error.go b/tkg/web/server/handlers/error.go deleted file mode 100644 index cff31ec167..0000000000 --- a/tkg/web/server/handlers/error.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// Err Define the error message -func Err(e error) *models.Error { - err := models.Error{Message: e.Error()} - return &err -} diff --git a/tkg/web/server/handlers/export.go b/tkg/web/server/handlers/export.go deleted file mode 100644 index a7a4edefb0..0000000000 --- a/tkg/web/server/handlers/export.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "github.com/go-openapi/runtime/middleware" - yaml "gopkg.in/yaml.v3" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigproviders" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigupdater" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/docker" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/vsphere" -) - -// ExportVSphereConfig creates return payload of config file string from incoming params object -func (app *App) ExportVSphereConfig(params vsphere.ExportTKGConfigForVsphereParams) middleware.Responder { - var configString string - // create the provider object with the configuration data - config, err := tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewVSphereConfig(params.Params) - if err == nil { - configString, err = transformConfigToString(config) - } - if err == nil { - return vsphere.NewExportTKGConfigForVsphereOK().WithPayload(configString) - } - return vsphere.NewExportTKGConfigForVsphereInternalServerError().WithPayload(Err(err)) -} - -// ExportDockerConfig creates return payload of config file string from incoming params object -func (app *App) ExportDockerConfig(params docker.ExportTKGConfigForDockerParams) middleware.Responder { - var configString string - // create the provider object with the configuration data - config, err := tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewDockerConfig(params.Params) - if err == nil { - configString, err = transformConfigToString(config) - } - if err == nil { - return docker.NewExportTKGConfigForDockerOK().WithPayload(configString) - } - return docker.NewExportTKGConfigForDockerInternalServerError().WithPayload(Err(err)) -} - -// ExportAzureConfig creates return payload of config file string from incoming params object -func (app *App) ExportAzureConfig(params azure.ExportTKGConfigForAzureParams) middleware.Responder { - var configString string - // create the provider object with the configuration data - config, err := tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewAzureConfig(params.Params) - if err == nil { - configString, err = transformConfigToString(config) - } - if err == nil { - return azure.NewExportTKGConfigForAzureOK().WithPayload(configString) - } - return azure.NewExportTKGConfigForAzureInternalServerError().WithPayload(Err(err)) -} - -// ExportAWSConfig creates return payload of config file string from incoming params object -func (app *App) ExportAWSConfig(params aws.ExportTKGConfigForAWSParams) middleware.Responder { - var config *tkgconfigproviders.AWSConfig - var configString string - - encodedCreds, err := app.awsClient.EncodeCredentials() - if err == nil { - // create the provider object with the configuration data - config, err = tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewAWSConfig(params.Params, encodedCreds) - } - if err == nil { - configString, err = transformConfigToString(config) - } - if err == nil { - return aws.NewExportTKGConfigForAWSOK().WithPayload(configString) - } - return aws.NewExportTKGConfigForAWSInternalServerError().WithPayload(Err(err)) -} - -func transformConfigToString(config interface{}) (out string, err error) { - var configMap map[string]string - var configByte []byte - - // turn the configuration object into a map - configMap, err = tkgconfigupdater.CreateConfigMap(config) - if err == nil { - // turn the map into a byte array - configByte, err = yaml.Marshal(&configMap) - } - if err == nil { - return string(configByte), nil - } - return "", err -} diff --git a/tkg/web/server/handlers/features.go b/tkg/web/server/handlers/features.go deleted file mode 100644 index fa9c075518..0000000000 --- a/tkg/web/server/handlers/features.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "github.com/go-openapi/runtime/middleware" - "github.com/pkg/errors" - - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/edition" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/features" -) - -// GetFeatureFlags handles requests to GET features -func (app *App) GetFeatureFlags(params features.GetFeatureFlagsParams) middleware.Responder { - cfg, err := config.GetClientConfig() - if err != nil { - return features.NewGetFeatureFlagsInternalServerError().WithPayload(Err(errors.Wrap(err, "unable to get client configuration"))) - } - payload := models.Features{} - for pluginName, featureMap := range cfg.ClientOptions.Features { - payload[pluginName] = convertFeatureMap(featureMap) - } - return features.NewGetFeatureFlagsOK().WithPayload(payload) -} - -// convertFeatureMap converts a config file configapi.FeatureMap to payload models.FeatureMap both of which are just hash maps -func convertFeatureMap(featureMap configapi.FeatureMap) models.FeatureMap { - result := models.FeatureMap{} - for key, value := range featureMap { - result[key] = value - } - return result -} - -// GetTanzuEdition returns the Tanzu edition -func (app *App) GetTanzuEdition(params edition.GetTanzuEditionParams) middleware.Responder { - result, err := config.GetEdition() - if err != nil { - return edition.NewGetTanzuEditionInternalServerError().WithPayload(Err(errors.Wrap(err, "unable to get configuration to determine edition"))) - } - return edition.NewGetTanzuEditionOK().WithPayload(result) -} diff --git a/tkg/web/server/handlers/import.go b/tkg/web/server/handlers/import.go deleted file mode 100644 index 2027ede58d..0000000000 --- a/tkg/web/server/handlers/import.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - yaml "gopkg.in/yaml.v3" - - "github.com/go-openapi/runtime/middleware" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigproviders" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/docker" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/vsphere" -) - -// ImportVSphereConfig receives a config file as a string (in ImportTKGConfigForVsphereParams) -// and returns a VsphereRegionalClusterParams object -func (app *App) ImportVSphereConfig(params vsphere.ImportTKGConfigForVsphereParams) middleware.Responder { - var fileContent = params.Params.Filecontents - configObject := &tkgconfigproviders.VSphereConfig{} - err := populateVsphereConfigFromString(fileContent, configObject) - - var configPayload *models.VsphereRegionalClusterParams - if err == nil { - configPayload, err = tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).CreateVSphereParams(configObject) - } - if err == nil { - return vsphere.NewImportTKGConfigForVsphereOK().WithPayload(configPayload) - } - return vsphere.NewImportTKGConfigForVsphereInternalServerError().WithPayload(Err(err)) -} - -// ImportAzureConfig receives a config file as a string (in ImportTKGConfigForAzureParams) -// and returns a AzureRegionalClusterParams object -func (app *App) ImportAzureConfig(params azure.ImportTKGConfigForAzureParams) middleware.Responder { - var fileContent = params.Params.Filecontents - configObject := &tkgconfigproviders.AzureConfig{} - err := populateAzureConfigFromString(fileContent, configObject) - - var configPayload *models.AzureRegionalClusterParams - if err == nil { - configPayload, err = tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).CreateAzureParams(configObject) - } - if err == nil { - return azure.NewImportTKGConfigForAzureOK().WithPayload(configPayload) - } - return azure.NewImportTKGConfigForAzureInternalServerError().WithPayload(Err(err)) -} - -// ImportAwsConfig receives a config file as a string (in ImportTKGConfigForAWSParams) -// and returns a AWSRegionalClusterParams object -func (app *App) ImportAwsConfig(params aws.ImportTKGConfigForAWSParams) middleware.Responder { - var fileContent = params.Params.Filecontents - configObject := &tkgconfigproviders.AWSConfig{} - err := populateAWSConfigFromString(fileContent, configObject) - - var configPayload *models.AWSRegionalClusterParams - if err == nil { - configPayload, err = tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).CreateAWSParams(configObject) - } - - if err == nil { - return aws.NewImportTKGConfigForAWSOK().WithPayload(configPayload) - } - return aws.NewImportTKGConfigForAWSInternalServerError().WithPayload(Err(err)) -} - -// ImportDockerConfig receives a config file as a string (in ImportTKGConfigForDockerParams) -// and returns a DockerRegionalClusterParams object -func (app *App) ImportDockerConfig(params docker.ImportTKGConfigForDockerParams) middleware.Responder { - var fileContent = params.Params.Filecontents - configObject := &tkgconfigproviders.DockerConfig{} - err := populateDockerConfigFromString(fileContent, configObject) - - var configPayload *models.DockerRegionalClusterParams - if err == nil { - configPayload, err = tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).CreateDockerParams(configObject) - } - - if err == nil { - return docker.NewImportTKGConfigForDockerOK().WithPayload(configPayload) - } - return docker.NewImportTKGConfigForDockerInternalServerError().WithPayload(Err(err)) -} - -func populateVsphereConfigFromString(input string, config *tkgconfigproviders.VSphereConfig) error { - // turn string into byte array and unmarshal the byteArray into the config object - return yaml.Unmarshal([]byte(input), &config) -} - -func populateAWSConfigFromString(input string, config *tkgconfigproviders.AWSConfig) error { - // turn string into byte array and unmarshal the byteArray into the config object - return yaml.Unmarshal([]byte(input), &config) -} - -func populateAzureConfigFromString(input string, config *tkgconfigproviders.AzureConfig) error { - // turn string into byte array and unmarshal the byteArray into the config object - return yaml.Unmarshal([]byte(input), &config) -} - -func populateDockerConfigFromString(input string, config *tkgconfigproviders.DockerConfig) error { - // turn string into byte array and unmarshal the byteArray into the config object - return yaml.Unmarshal([]byte(input), &config) -} diff --git a/tkg/web/server/handlers/init.go b/tkg/web/server/handlers/init.go deleted file mode 100644 index 8c35daa431..0000000000 --- a/tkg/web/server/handlers/init.go +++ /dev/null @@ -1,376 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "os" - "time" - - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" - - "github.com/go-openapi/runtime/middleware" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/cli/core/pkg/pluginmanager" - configapi "github.com/vmware-tanzu/tanzu-framework/cli/runtime/apis/config/v1alpha1" - "github.com/vmware-tanzu/tanzu-framework/cli/runtime/config" - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - "github.com/vmware-tanzu/tanzu-framework/tkg/clientcreator" - "github.com/vmware-tanzu/tanzu-framework/tkg/clusterclient" - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigproviders" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigupdater" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/docker" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/vsphere" -) - -// infrastructure name constants -const ( - InfrastructureProviderVSphere = "vsphere" - InfrastructureProviderAWS = "aws" - InfrastructureProviderAzure = "azure" - InfrastructureProviderDocker = "docker" -) - -const sleepTimeForLogsPropogation = 2 * time.Second - -// CreateVSphereRegionalCluster creates vSphere management cluster -func (app *App) CreateVSphereRegionalCluster(params vsphere.CreateVSphereRegionalClusterParams) middleware.Responder { - vsphereConfig, err := tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewVSphereConfig(params.Params) - if err != nil { - return vsphere.NewCreateVSphereRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - err = tkgconfigupdater.SaveConfig(app.getFilePathForSavingConfig(), app.TKGConfigReaderWriter, vsphereConfig) - if err != nil { - return vsphere.NewCreateVSphereRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - allClients, err := clientcreator.CreateAllClients(app.AppConfig, app.TKGConfigReaderWriter) - if err != nil { - return vsphere.NewCreateVSphereRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - c, err := client.New(client.Options{ - ClusterCtlClient: allClients.ClusterCtlClient, - ReaderWriterConfigClient: allClients.ConfigClient, - RegionManager: allClients.RegionManager, - TKGConfigDir: app.AppConfig.TKGConfigDir, - Timeout: app.TKGTimeout, - FeaturesClient: allClients.FeaturesClient, - TKGConfigProvidersClient: allClients.TKGConfigProvidersClient, - TKGBomClient: allClients.TKGBomClient, - TKGConfigUpdater: allClients.TKGConfigUpdaterClient, - TKGPathsClient: allClients.TKGConfigPathsClient, - ClusterClientFactory: clusterclient.NewClusterClientFactory(), - VcClientFactory: vc.NewVcClientFactory(), - FeatureFlagClient: getFeatureFlagClient(), - }) - if err != nil { - return vsphere.NewCreateVSphereRegionalClusterInternalServerError().WithPayload(Err(err)) - } - app.InitOptions.InfrastructureProvider = InfrastructureProviderVSphere - app.InitOptions.ClusterName = params.Params.ClusterName - app.InitOptions.Plan = params.Params.ControlPlaneFlavor - app.InitOptions.Annotations = params.Params.Annotations - app.InitOptions.Labels = params.Params.Labels - app.InitOptions.CeipOptIn = *params.Params.CeipOptIn - app.InitOptions.CniType = params.Params.Networking.CniType - app.InitOptions.VsphereControlPlaneEndpoint = params.Params.ControlPlaneEndpoint - app.InitOptions.ClusterConfigFile = app.getFilePathForSavingConfig() - - if err := c.ConfigureAndValidateManagementClusterConfiguration(&app.InitOptions, false); err != nil { - return vsphere.NewCreateVSphereRegionalClusterInternalServerError().WithPayload(Err(errors.New(err.Message))) - } - go app.StartSendingLogsToUI() - go func() { - err := c.InitRegion(&app.InitOptions) - if err != nil { - log.Error(err, "unable to set up management cluster, ") - } else { - log.Infof("\nManagement cluster created!\n\n") - log.Info("\nYou can now create your first workload cluster by running the following:\n\n") - log.Info(" tanzu cluster create [name] -f [file]\n\n") - err = pluginmanager.SyncPlugins() - if err != nil { - log.Warningf("unable to sync plugins after management cluster create. Please run `tanzu plugin sync` command manually to install/update plugins") - } - // wait for the logs to be dispatched to UI before exit - time.Sleep(sleepTimeForLogsPropogation) - // exit the BE server on success - os.Exit(0) - } - }() - - return vsphere.NewCreateVSphereRegionalClusterOK().WithPayload("started creating regional cluster") -} - -// CreateAWSRegionalCluster creates aws management cluster -func (app *App) CreateAWSRegionalCluster(params aws.CreateAWSRegionalClusterParams) middleware.Responder { - if app.awsClient == nil { - return aws.NewCreateAWSRegionalClusterInternalServerError().WithPayload(Err(errors.New("aws client is not initialized properly"))) - } - encodedCreds, err := app.awsClient.EncodeCredentials() - if err != nil { - return aws.NewCreateAWSRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - awsConfig, err := tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewAWSConfig(params.Params, encodedCreds) - if err != nil { - return aws.NewCreateAWSRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - err = tkgconfigupdater.SaveConfig(app.getFilePathForSavingConfig(), app.TKGConfigReaderWriter, awsConfig) - if err != nil { - return aws.NewCreateAWSRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - allClients, err := clientcreator.CreateAllClients(app.AppConfig, app.TKGConfigReaderWriter) - if err != nil { - return aws.NewCreateAWSRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - c, err := client.New(client.Options{ - ClusterCtlClient: allClients.ClusterCtlClient, - ReaderWriterConfigClient: allClients.ConfigClient, - RegionManager: allClients.RegionManager, - TKGConfigDir: app.AppConfig.TKGConfigDir, - Timeout: app.TKGTimeout, - FeaturesClient: allClients.FeaturesClient, - TKGConfigProvidersClient: allClients.TKGConfigProvidersClient, - TKGBomClient: allClients.TKGBomClient, - TKGConfigUpdater: allClients.TKGConfigUpdaterClient, - TKGPathsClient: allClients.TKGConfigPathsClient, - ClusterClientFactory: clusterclient.NewClusterClientFactory(), - FeatureFlagClient: getFeatureFlagClient(), - }) - if err != nil { - return aws.NewCreateAWSRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - app.InitOptions.InfrastructureProvider = InfrastructureProviderAWS - app.InitOptions.ClusterName = params.Params.ClusterName - app.InitOptions.Plan = params.Params.ControlPlaneFlavor - app.InitOptions.CeipOptIn = *params.Params.CeipOptIn - app.InitOptions.CniType = params.Params.Networking.CniType - app.InitOptions.Annotations = params.Params.Annotations - app.InitOptions.Labels = params.Params.Labels - app.InitOptions.ClusterConfigFile = app.getFilePathForSavingConfig() - if err := c.ConfigureAndValidateManagementClusterConfiguration(&app.InitOptions, false); err != nil { - return aws.NewCreateAWSRegionalClusterInternalServerError().WithPayload(Err(errors.New(err.Message))) - } - go app.StartSendingLogsToUI() - - go func() { - if params.Params.CreateCloudFormationStack { - err = c.CreateAWSCloudFormationStack() - if err != nil { - log.Error(err, "unable to create AWS CloudFormationStack") - return - } - } - err := c.InitRegion(&app.InitOptions) - if err != nil { - log.Error(err, "unable to set up management cluster, ") - } else { - log.Infof("\nManagement cluster created!\n\n") - log.Info("\nYou can now create your first workload cluster by running the following:\n\n") - log.Info(" tanzu cluster create [name] -f [file]\n\n") - err = pluginmanager.SyncPlugins() - if err != nil { - log.Warningf("unable to sync plugins after management cluster create. Please run `tanzu plugin sync` command manually to install/update plugins") - } - // wait for the logs to be dispatched to UI before exit - time.Sleep(sleepTimeForLogsPropogation) - // exit the BE server on success - os.Exit(0) - } - }() - - return aws.NewCreateAWSRegionalClusterOK().WithPayload("started creating regional cluster") -} - -// CreateAzureRegionalCluster creates azure management cluster -func (app *App) CreateAzureRegionalCluster(params azure.CreateAzureRegionalClusterParams) middleware.Responder { - if app.azureClient == nil { - return azure.NewCreateAzureRegionalClusterInternalServerError().WithPayload(Err(errors.New("azure client is not initialized properly"))) - } - - azureConfig, err := tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewAzureConfig(params.Params) - if err != nil { - return azure.NewCreateAzureRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - err = tkgconfigupdater.SaveConfig(app.getFilePathForSavingConfig(), app.TKGConfigReaderWriter, azureConfig) - if err != nil { - return azure.NewCreateAzureRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - allClients, err := clientcreator.CreateAllClients(app.AppConfig, app.TKGConfigReaderWriter) - if err != nil { - return azure.NewCreateAzureRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - c, err := client.New(client.Options{ - ClusterCtlClient: allClients.ClusterCtlClient, - ReaderWriterConfigClient: allClients.ConfigClient, - RegionManager: allClients.RegionManager, - TKGConfigDir: app.AppConfig.TKGConfigDir, - Timeout: app.TKGTimeout, - FeaturesClient: allClients.FeaturesClient, - TKGConfigProvidersClient: allClients.TKGConfigProvidersClient, - TKGBomClient: allClients.TKGBomClient, - TKGConfigUpdater: allClients.TKGConfigUpdaterClient, - TKGPathsClient: allClients.TKGConfigPathsClient, - ClusterClientFactory: clusterclient.NewClusterClientFactory(), - FeatureFlagClient: getFeatureFlagClient(), - }) - if err != nil { - return azure.NewCreateAzureRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - // setting the below configuration to tkgClient to be used during Azure mc creation but not saving them to tkg config - if params.Params.ResourceGroup == "" { - return azure.NewCreateAzureRegionalClusterInternalServerError().WithPayload(Err(errors.New("azure resource group name cannot be empty"))) - } - app.TKGConfigReaderWriter.Set(constants.ConfigVariableAzureResourceGroup, params.Params.ResourceGroup) - - if params.Params.VnetResourceGroup == "" { - return azure.NewCreateAzureRegionalClusterInternalServerError().WithPayload(Err(errors.New("azure vnet resource group name cannot be empty"))) - } - app.TKGConfigReaderWriter.Set(constants.ConfigVariableAzureVnetResourceGroup, params.Params.VnetResourceGroup) - - if params.Params.VnetName == "" { - return azure.NewCreateAzureRegionalClusterInternalServerError().WithPayload(Err(errors.New("azure vnet name cannot be empty"))) - } - app.TKGConfigReaderWriter.Set(constants.ConfigVariableAzureVnetName, params.Params.VnetName) - - if params.Params.ControlPlaneSubnet == "" { - return azure.NewCreateAzureRegionalClusterInternalServerError().WithPayload(Err(errors.New("azure controlplane subnet name cannot be empty"))) - } - app.TKGConfigReaderWriter.Set(constants.ConfigVariableAzureControlPlaneSubnet, params.Params.ControlPlaneSubnet) - - if params.Params.WorkerNodeSubnet == "" { - return azure.NewCreateAzureRegionalClusterInternalServerError().WithPayload(Err(errors.New("azure node subnet name cannot be empty"))) - } - app.TKGConfigReaderWriter.Set(constants.ConfigVariableAzureWorkerSubnet, params.Params.WorkerNodeSubnet) - - if params.Params.VnetCidr != "" { // create new vnet - app.TKGConfigReaderWriter.Set(constants.ConfigVariableAzureVnetCidr, params.Params.VnetCidr) - app.TKGConfigReaderWriter.Set(constants.ConfigVariableAzureControlPlaneSubnetCidr, params.Params.ControlPlaneSubnetCidr) - app.TKGConfigReaderWriter.Set(constants.ConfigVariableAzureWorkerNodeSubnetCidr, params.Params.WorkerNodeSubnetCidr) - } - - app.InitOptions.InfrastructureProvider = InfrastructureProviderAzure - app.InitOptions.ClusterName = params.Params.ClusterName - app.InitOptions.Plan = params.Params.ControlPlaneFlavor - app.InitOptions.Annotations = params.Params.Annotations - app.InitOptions.Labels = params.Params.Labels - app.InitOptions.CeipOptIn = *params.Params.CeipOptIn - app.InitOptions.ClusterConfigFile = app.getFilePathForSavingConfig() - if err := c.ConfigureAndValidateManagementClusterConfiguration(&app.InitOptions, false); err != nil { - return azure.NewCreateAzureRegionalClusterInternalServerError().WithPayload(Err(errors.New(err.Message))) - } - go app.StartSendingLogsToUI() - go func() { - err := c.InitRegion(&app.InitOptions) - if err != nil { - log.Error(err, "unable to set up management cluster, ") - } else { - log.Infof("\nManagement cluster created!\n\n") - log.Info("\nYou can now create your first workload cluster by running the following:\n\n") - log.Info(" tanzu cluster create [name] -f [file]\n\n") - err = pluginmanager.SyncPlugins() - if err != nil { - log.Warningf("unable to sync plugins after management cluster create. Please run `tanzu plugin sync` command manually to install/update plugins") - } - // wait for the logs to be dispatched to UI before exit - time.Sleep(sleepTimeForLogsPropogation) - // exit the BE server on success - os.Exit(0) - } - }() - - return azure.NewCreateAzureRegionalClusterOK().WithPayload("started creating regional cluster") -} - -// CreateDockerRegionalCluster creates docker management cluster -func (app *App) CreateDockerRegionalCluster(params docker.CreateDockerRegionalClusterParams) middleware.Responder { - dockerConfig, err := tkgconfigproviders.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).NewDockerConfig(params.Params) - if err != nil { - return docker.NewCreateDockerRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - err = tkgconfigupdater.SaveConfig(app.getFilePathForSavingConfig(), app.TKGConfigReaderWriter, dockerConfig) - if err != nil { - return docker.NewCreateDockerRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - allClients, err := clientcreator.CreateAllClients(app.AppConfig, app.TKGConfigReaderWriter) - if err != nil { - return docker.NewCreateDockerRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - c, err := client.New(client.Options{ - ClusterCtlClient: allClients.ClusterCtlClient, - ReaderWriterConfigClient: allClients.ConfigClient, - RegionManager: allClients.RegionManager, - TKGConfigDir: app.AppConfig.TKGConfigDir, - Timeout: app.TKGTimeout, - FeaturesClient: allClients.FeaturesClient, - TKGConfigProvidersClient: allClients.TKGConfigProvidersClient, - TKGBomClient: allClients.TKGBomClient, - TKGConfigUpdater: allClients.TKGConfigUpdaterClient, - TKGPathsClient: allClients.TKGConfigPathsClient, - ClusterClientFactory: clusterclient.NewClusterClientFactory(), - FeatureFlagClient: getFeatureFlagClient(), - }) - if err != nil { - return docker.NewCreateDockerRegionalClusterInternalServerError().WithPayload(Err(err)) - } - - app.InitOptions.InfrastructureProvider = InfrastructureProviderDocker - app.InitOptions.ClusterName = params.Params.ClusterName - app.InitOptions.Plan = "dev" - app.InitOptions.Annotations = params.Params.Annotations - app.InitOptions.Labels = params.Params.Labels - app.InitOptions.ClusterConfigFile = app.getFilePathForSavingConfig() - - if err := c.ConfigureAndValidateManagementClusterConfiguration(&app.InitOptions, false); err != nil { - return docker.NewCreateDockerRegionalClusterInternalServerError().WithPayload(Err(errors.New(err.Message))) - } - - go app.StartSendingLogsToUI() - go func() { - err := c.InitRegion(&app.InitOptions) - if err != nil { - log.Error(err, "unable to set up management cluster, ") - } else { - log.Infof("\nManagement cluster created!\n\n") - log.Info("\nYou can now create your first workload cluster by running the following:\n\n") - log.Info(" tanzu cluster create [name] -f [file]\n\n") - err = pluginmanager.SyncPlugins() - if err != nil { - log.Warningf("unable to sync plugins after management cluster create. Please run `tanzu plugin sync` command manually to install/update plugins") - } - // wait for the logs to be dispatched to UI before exit - time.Sleep(sleepTimeForLogsPropogation) - // exit the BE server on success - os.Exit(0) - } - }() - - return docker.NewCreateDockerRegionalClusterOK().WithPayload("started creating regional cluster") -} - -func getFeatureFlagClient() client.FeatureFlagClient { - featureFlagClient, err := config.GetClientConfig() - if err != nil { - featureFlagClient = &configapi.ClientConfig{} - } - return featureFlagClient -} diff --git a/tkg/web/server/handlers/ldap.go b/tkg/web/server/handlers/ldap.go deleted file mode 100644 index 60155bfa3b..0000000000 --- a/tkg/web/server/handlers/ldap.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "github.com/go-openapi/runtime/middleware" - "github.com/pkg/errors" - - ldapClient "github.com/vmware-tanzu/tanzu-framework/tkg/ldap" - ldap "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/ldap" -) - -// VerifyLdapConnect checks LDAP server reachability -func (app *App) VerifyLdapConnect(params ldap.VerifyLdapConnectParams) middleware.Responder { - app.ldapClient = ldapClient.New() - success, err := app.ldapClient.LdapConnect(params.Credentials) - - if err != nil { - return ldap.NewVerifyLdapConnectBadRequest().WithPayload(Err(errors.Wrap(err, "unable to connect to LDAP server as configed"))) - } - - return ldap.NewVerifyLdapConnectOK().WithPayload(success) -} - -// VerifyLdapBind verifies LDAP authentication -func (app *App) VerifyLdapBind(params ldap.VerifyLdapBindParams) middleware.Responder { - if app.ldapClient == nil { - return ldap.NewVerifyLdapBindInternalServerError().WithPayload(Err(errors.New("LDAP client is not initialized properly"))) - } - - result, err := app.ldapClient.LdapBind() - if err != nil { - return ldap.NewVerifyLdapBindBadRequest().WithPayload(Err(errors.Wrap(err, "unable to perform LDAP bind"))) - } - - return ldap.NewVerifyLdapBindOK().WithPayload(result) -} - -// VerifyUserSearch verifies LDAP user search capability -func (app *App) VerifyUserSearch(params ldap.VerifyLdapUserSearchParams) middleware.Responder { - if app.ldapClient == nil { - return ldap.NewVerifyLdapUserSearchInternalServerError().WithPayload(Err(errors.New("LDAP client is not initialized properly"))) - } - - success, err := app.ldapClient.LdapUserSearch() - if err != nil { - return ldap.NewVerifyLdapUserSearchBadRequest().WithPayload(Err(errors.Wrap(err, "unable to perform LDAP User Search"))) - } - - return ldap.NewVerifyLdapUserSearchOK().WithPayload(success) -} - -// VerifyGroupSearch verifies LDAP group search capability -func (app *App) VerifyGroupSearch(params ldap.VerifyLdapGroupSearchParams) middleware.Responder { - if app.ldapClient == nil { - return ldap.NewVerifyLdapGroupSearchInternalServerError().WithPayload(Err(errors.New("LDAP client is not initialized properly"))) - } - - success, err := app.ldapClient.LdapGroupSearch() - if err != nil { - return ldap.NewVerifyLdapGroupSearchBadRequest().WithPayload(Err(errors.Wrap(err, "unable to perform LDAP Group Search"))) - } - - return ldap.NewVerifyLdapGroupSearchOK().WithPayload(success) -} - -// VerifyLdapCloseConnection disconnect from a LDAP server -func (app *App) VerifyLdapCloseConnection(params ldap.VerifyLdapCloseConnectionParams) middleware.Responder { - if app.ldapClient == nil { - return ldap.NewVerifyLdapCloseConnectionInternalServerError().WithPayload(Err(errors.New("LDAP client is not initialized properly"))) - } - - app.ldapClient.LdapCloseConnection() - - return ldap.NewVerifyLdapCloseConnectionCreated() -} diff --git a/tkg/web/server/handlers/provider.go b/tkg/web/server/handlers/provider.go deleted file mode 100644 index a9a4d1434e..0000000000 --- a/tkg/web/server/handlers/provider.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "github.com/go-openapi/runtime/middleware" - "github.com/pkg/errors" - - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/provider" -) - -// GetProvider gets provider information -func (app *App) GetProvider(params provider.GetProviderParams) middleware.Responder { - defaultTKRBom, err := tkgconfigbom.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).GetDefaultTkrBOMConfiguration() - if err != nil { - return provider.NewGetProviderInternalServerError().WithPayload(Err(errors.Wrap(err, "unable to get the default TanzuKubernetesRelease"))) - } - - providerInfo := models.ProviderInfo{ - Provider: app.InitOptions.InfrastructureProvider, - TkrVersion: defaultTKRBom.Release.Version, - } - - if providerInfo.Provider == "" { - providerInfo.Provider = "unknown" - } - - return provider.NewGetProviderOK().WithPayload(&providerInfo) -} diff --git a/tkg/web/server/handlers/vsphere.go b/tkg/web/server/handlers/vsphere.go deleted file mode 100644 index e51bbd4677..0000000000 --- a/tkg/web/server/handlers/vsphere.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package handlers - -import ( - "fmt" - "net/url" - "strings" - - "github.com/pkg/errors" - - "github.com/go-openapi/runtime/middleware" - - "github.com/vmware-tanzu/tanzu-framework/tkg/constants" - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigbom" - "github.com/vmware-tanzu/tanzu-framework/tkg/vc" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/vsphere" -) - -const trueString = "true" - -// GetVsphereThumbprint gets the vSphere thumbprint if insecure flag not set -func (app *App) GetVsphereThumbprint(params vsphere.GetVsphereThumbprintParams) middleware.Responder { - insecure := false - thumbprint := "" - var err error - - thumbprint, err = vc.GetVCThumbprint(params.Host) - if err != nil { - return vsphere.NewGetVsphereThumbprintInternalServerError().WithPayload(Err(err)) - } - - res := models.VSphereThumbprint{Thumbprint: thumbprint, Insecure: &insecure} - - return vsphere.NewGetVsphereThumbprintOK().WithPayload(&res) -} - -// SetVSphereEndpoint validates vsphere credentials and sets the vsphere client into web app -func (app *App) SetVSphereEndpoint(params vsphere.SetVSphereEndpointParams) middleware.Responder { - host := strings.TrimSpace(params.Credentials.Host) - - if !strings.HasPrefix(host, "http") { - host = "https://" + host - } - vcURL, err := url.Parse(host) - if err != nil { - return vsphere.NewSetVSphereEndpointInternalServerError().WithPayload(Err(err)) - } - - vcURL.Path = "/sdk" - - vsphereInsecure := false - vsphereInsecureString, err := app.TKGConfigReaderWriter.Get(constants.ConfigVariableVsphereInsecure) - if err == nil { - vsphereInsecure = (vsphereInsecureString == trueString) - } - - if params.Credentials.Insecure != nil && *params.Credentials.Insecure { - vsphereInsecure = true - } - - vcClient, err := vc.NewClient(vcURL, params.Credentials.Thumbprint, vsphereInsecure) - if err != nil { - return vsphere.NewSetVSphereEndpointInternalServerError().WithPayload(Err(err)) - } - - _, err = vcClient.Login(params.HTTPRequest.Context(), params.Credentials.Username, params.Credentials.Password) - if err != nil { - return vsphere.NewSetVSphereEndpointInternalServerError().WithPayload(Err(err)) - } - - app.vcClient = vcClient - - version, build, err := vcClient.GetVSphereVersion() - if err != nil { - return vsphere.NewSetVSphereEndpointInternalServerError().WithPayload(Err(err)) - } - - res := models.VsphereInfo{ - Version: fmt.Sprintf("%s:%s", version, build), - HasPacific: "no", - } - - if hasPP, err := vcClient.DetectPacific(params.HTTPRequest.Context()); err == nil && hasPP { - res.HasPacific = "yes" - } - - return vsphere.NewSetVSphereEndpointCreated().WithPayload(&res) -} - -// GetVSphereDatacenters returns all the datacenters in vsphere -func (app *App) GetVSphereDatacenters(params vsphere.GetVSphereDatacentersParams) middleware.Responder { - if app.vcClient == nil { - return vsphere.NewGetVSphereDatacentersInternalServerError().WithPayload(Err(errors.New("vSphere client is not initialized properly"))) - } - - datacenters, err := app.vcClient.GetDatacenters(params.HTTPRequest.Context()) - if err != nil { - return vsphere.NewGetVSphereDatacentersInternalServerError().WithPayload(Err(err)) - } - - return vsphere.NewGetVSphereDatacentersOK().WithPayload(datacenters) -} - -// GetVSphereDatastores returns all the datastores in the datacenter -func (app *App) GetVSphereDatastores(params vsphere.GetVSphereDatastoresParams) middleware.Responder { - if app.vcClient == nil { - return vsphere.NewGetVSphereDatastoresInternalServerError().WithPayload(Err(errors.New("vSphere client is not initialized properly"))) - } - - datastores, err := app.vcClient.GetDatastores(params.HTTPRequest.Context(), params.Dc) - if err != nil { - return vsphere.NewGetVSphereDatastoresInternalServerError().WithPayload(Err(err)) - } - - return vsphere.NewGetVSphereDatastoresOK().WithPayload(datastores) -} - -// GetVSphereNetworks gets all the networks in the datacenter -func (app *App) GetVSphereNetworks(params vsphere.GetVSphereNetworksParams) middleware.Responder { - if app.vcClient == nil { - return vsphere.NewGetVSphereNetworksInternalServerError().WithPayload(Err(errors.New("vSphere client is not initialized properly"))) - } - - networks, err := app.vcClient.GetNetworks(params.HTTPRequest.Context(), params.Dc) - if err != nil { - return vsphere.NewGetVSphereNetworksInternalServerError().WithPayload(Err(err)) - } - - return vsphere.NewGetVSphereNetworksOK().WithPayload(networks) -} - -// GetVSphereResourcePools gets all the resource pools in the datacenter -func (app *App) GetVSphereResourcePools(params vsphere.GetVSphereResourcePoolsParams) middleware.Responder { - if app.vcClient == nil { - return vsphere.NewGetVSphereResourcePoolsInternalServerError().WithPayload(Err(errors.New("vSphere client is not initialized properly"))) - } - - rps, err := app.vcClient.GetResourcePools(params.HTTPRequest.Context(), params.Dc) - if err != nil { - return vsphere.NewGetVSphereResourcePoolsInternalServerError().WithPayload(Err(err)) - } - - return vsphere.NewGetVSphereResourcePoolsOK().WithPayload(rps) -} - -// GetVsphereOSImages gets vm templates for deploying kubernetes node -func (app *App) GetVsphereOSImages(params vsphere.GetVSphereOSImagesParams) middleware.Responder { - if app.vcClient == nil { - return vsphere.NewGetVSphereOSImagesInternalServerError().WithPayload(Err(errors.New("vSphere client is not initialized properly"))) - } - - vms, err := app.vcClient.GetVirtualMachineImages(params.HTTPRequest.Context(), params.Dc) - if err != nil { - return vsphere.NewGetVSphereOSImagesInternalServerError().WithPayload(Err(err)) - } - - defaultTKRBom, err := tkgconfigbom.New(app.AppConfig.TKGConfigDir, app.TKGConfigReaderWriter).GetDefaultTkrBOMConfiguration() - if err != nil { - return vsphere.NewGetVSphereOSImagesInternalServerError().WithPayload(Err(errors.Wrap(err, "unable to get the default TanzuKubernetesRelease"))) - } - matchedTemplates, nonTemplateVms := vc.FindMatchingVirtualMachineTemplate(vms, defaultTKRBom.GetOVAVersions()) - - if len(matchedTemplates) == 0 && len(nonTemplateVms) != 0 { - log.Infof("unable to find any VM Template associated with the TanzuKubernetesRelease %s, but found these VM(s) [%s] that can be used once converted to a VM Template", defaultTKRBom.Release.Version, strings.Join(nonTemplateVms, ",")) - } - - results := []*models.VSphereVirtualMachine{} - - for _, template := range matchedTemplates { - results = append(results, &models.VSphereVirtualMachine{ - IsTemplate: &template.IsTemplate, - Name: template.Name, - Moid: template.Moid, - OsInfo: &models.OSInfo{ - Name: template.DistroName, - Version: template.DistroVersion, - Arch: template.DistroArch, - }, - }) - } - - return vsphere.NewGetVSphereOSImagesOK().WithPayload(results) -} - -// GetVSphereFolders gets vsphere folders -func (app *App) GetVSphereFolders(params vsphere.GetVSphereFoldersParams) middleware.Responder { - if app.vcClient == nil { - return vsphere.NewGetVSphereFoldersInternalServerError().WithPayload(Err(errors.New("vSphere client is not initialized properly"))) - } - - folders, err := app.vcClient.GetFolders(params.HTTPRequest.Context(), params.Dc) - if err != nil { - return vsphere.NewGetVSphereFoldersInternalServerError().WithPayload(Err(err)) - } - - return vsphere.NewGetVSphereFoldersOK().WithPayload(folders) -} - -// GetVsphereComputeResources gets vsphere compute resources -func (app *App) GetVsphereComputeResources(params vsphere.GetVSphereComputeResourcesParams) middleware.Responder { - if app.vcClient == nil { - return vsphere.NewGetVSphereComputeResourcesInternalServerError().WithPayload(Err(errors.New("vSphere client is not initialized properly"))) - } - - results, err := app.vcClient.GetComputeResources(params.HTTPRequest.Context(), params.Dc) - if err != nil { - return vsphere.NewGetVSphereComputeResourcesInternalServerError().WithPayload(Err(err)) - } - - return vsphere.NewGetVSphereComputeResourcesOK().WithPayload(results) -} diff --git a/tkg/web/server/models/a_w_s_account_params.go b/tkg/web/server/models/a_w_s_account_params.go deleted file mode 100644 index e65d5ca7c5..0000000000 --- a/tkg/web/server/models/a_w_s_account_params.go +++ /dev/null @@ -1,55 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AWSAccountParams a w s account params -// swagger:model AWSAccountParams -type AWSAccountParams struct { - - // access key ID - AccessKeyID string `json:"accessKeyID,omitempty"` - - // profile name - ProfileName string `json:"profileName,omitempty"` - - // region - Region string `json:"region,omitempty"` - - // secret access key - SecretAccessKey string `json:"secretAccessKey,omitempty"` - - // session token - SessionToken string `json:"sessionToken,omitempty"` -} - -// Validate validates this a w s account params -func (m *AWSAccountParams) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AWSAccountParams) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AWSAccountParams) UnmarshalBinary(b []byte) error { - var res AWSAccountParams - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/a_w_s_availability_zone.go b/tkg/web/server/models/a_w_s_availability_zone.go deleted file mode 100644 index 88f3ad419c..0000000000 --- a/tkg/web/server/models/a_w_s_availability_zone.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AWSAvailabilityZone a w s availability zone -// swagger:model AWSAvailabilityZone -type AWSAvailabilityZone struct { - - // id - ID string `json:"id,omitempty"` - - // name - Name string `json:"name,omitempty"` -} - -// Validate validates this a w s availability zone -func (m *AWSAvailabilityZone) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AWSAvailabilityZone) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AWSAvailabilityZone) UnmarshalBinary(b []byte) error { - var res AWSAvailabilityZone - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/a_w_s_node_az.go b/tkg/web/server/models/a_w_s_node_az.go deleted file mode 100644 index 130e580213..0000000000 --- a/tkg/web/server/models/a_w_s_node_az.go +++ /dev/null @@ -1,52 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AWSNodeAz a w s node az -// swagger:model AWSNodeAz -type AWSNodeAz struct { - - // name - Name string `json:"name,omitempty"` - - // private subnet ID - PrivateSubnetID string `json:"privateSubnetID,omitempty"` - - // public subnet ID - PublicSubnetID string `json:"publicSubnetID,omitempty"` - - // worker node type - WorkerNodeType string `json:"workerNodeType,omitempty"` -} - -// Validate validates this a w s node az -func (m *AWSNodeAz) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AWSNodeAz) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AWSNodeAz) UnmarshalBinary(b []byte) error { - var res AWSNodeAz - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/a_w_s_regional_cluster_params.go b/tkg/web/server/models/a_w_s_regional_cluster_params.go deleted file mode 100644 index 250f23ee7e..0000000000 --- a/tkg/web/server/models/a_w_s_regional_cluster_params.go +++ /dev/null @@ -1,216 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// AWSRegionalClusterParams a w s regional cluster params -// swagger:model AWSRegionalClusterParams -type AWSRegionalClusterParams struct { - - // annotations - Annotations map[string]string `json:"annotations,omitempty"` - - // aws account params - AwsAccountParams *AWSAccountParams `json:"awsAccountParams,omitempty"` - - // bastion host enabled - BastionHostEnabled bool `json:"bastionHostEnabled,omitempty"` - - // ceip opt in - CeipOptIn *bool `json:"ceipOptIn,omitempty"` - - // cluster name - ClusterName string `json:"clusterName,omitempty"` - - // control plane flavor - ControlPlaneFlavor string `json:"controlPlaneFlavor,omitempty"` - - // control plane node type - ControlPlaneNodeType string `json:"controlPlaneNodeType,omitempty"` - - // create cloud formation stack - CreateCloudFormationStack bool `json:"createCloudFormationStack,omitempty"` - - // enable audit logging - EnableAuditLogging bool `json:"enableAuditLogging,omitempty"` - - // identity management - IdentityManagement *IdentityManagementConfig `json:"identityManagement,omitempty"` - - // kubernetes version - KubernetesVersion string `json:"kubernetesVersion,omitempty"` - - // labels - Labels map[string]string `json:"labels,omitempty"` - - // loadbalancer scheme internal - LoadbalancerSchemeInternal bool `json:"loadbalancerSchemeInternal,omitempty"` - - // machine health check enabled - MachineHealthCheckEnabled bool `json:"machineHealthCheckEnabled,omitempty"` - - // networking - Networking *TKGNetwork `json:"networking,omitempty"` - - // num of worker node - NumOfWorkerNode int64 `json:"numOfWorkerNode,omitempty"` - - // os - Os *AWSVirtualMachine `json:"os,omitempty"` - - // ssh key name - SSHKeyName string `json:"sshKeyName,omitempty"` - - // vpc - Vpc *AWSVpc `json:"vpc,omitempty"` - - // worker node type - WorkerNodeType string `json:"workerNodeType,omitempty"` -} - -// Validate validates this a w s regional cluster params -func (m *AWSRegionalClusterParams) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateAwsAccountParams(formats); err != nil { - res = append(res, err) - } - - if err := m.validateIdentityManagement(formats); err != nil { - res = append(res, err) - } - - if err := m.validateNetworking(formats); err != nil { - res = append(res, err) - } - - if err := m.validateOs(formats); err != nil { - res = append(res, err) - } - - if err := m.validateVpc(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *AWSRegionalClusterParams) validateAwsAccountParams(formats strfmt.Registry) error { - - if swag.IsZero(m.AwsAccountParams) { // not required - return nil - } - - if m.AwsAccountParams != nil { - if err := m.AwsAccountParams.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("awsAccountParams") - } - return err - } - } - - return nil -} - -func (m *AWSRegionalClusterParams) validateIdentityManagement(formats strfmt.Registry) error { - - if swag.IsZero(m.IdentityManagement) { // not required - return nil - } - - if m.IdentityManagement != nil { - if err := m.IdentityManagement.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("identityManagement") - } - return err - } - } - - return nil -} - -func (m *AWSRegionalClusterParams) validateNetworking(formats strfmt.Registry) error { - - if swag.IsZero(m.Networking) { // not required - return nil - } - - if m.Networking != nil { - if err := m.Networking.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("networking") - } - return err - } - } - - return nil -} - -func (m *AWSRegionalClusterParams) validateOs(formats strfmt.Registry) error { - - if swag.IsZero(m.Os) { // not required - return nil - } - - if m.Os != nil { - if err := m.Os.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("os") - } - return err - } - } - - return nil -} - -func (m *AWSRegionalClusterParams) validateVpc(formats strfmt.Registry) error { - - if swag.IsZero(m.Vpc) { // not required - return nil - } - - if m.Vpc != nil { - if err := m.Vpc.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("vpc") - } - return err - } - } - - return nil -} - -// MarshalBinary interface implementation -func (m *AWSRegionalClusterParams) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AWSRegionalClusterParams) UnmarshalBinary(b []byte) error { - var res AWSRegionalClusterParams - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/a_w_s_route.go b/tkg/web/server/models/a_w_s_route.go deleted file mode 100644 index dd79493feb..0000000000 --- a/tkg/web/server/models/a_w_s_route.go +++ /dev/null @@ -1,49 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AWSRoute a w s route -// swagger:model AWSRoute -type AWSRoute struct { - - // destination cidr block - DestinationCidrBlock string `json:"DestinationCidrBlock,omitempty"` - - // gateway Id - GatewayID string `json:"GatewayId,omitempty"` - - // state - State string `json:"State,omitempty"` -} - -// Validate validates this a w s route -func (m *AWSRoute) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AWSRoute) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AWSRoute) UnmarshalBinary(b []byte) error { - var res AWSRoute - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/a_w_s_route_table.go b/tkg/web/server/models/a_w_s_route_table.go deleted file mode 100644 index 397e73bb8e..0000000000 --- a/tkg/web/server/models/a_w_s_route_table.go +++ /dev/null @@ -1,86 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "strconv" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// AWSRouteTable a w s route table -// swagger:model AWSRouteTable -type AWSRouteTable struct { - - // id - ID string `json:"id,omitempty"` - - // routes - Routes []*AWSRoute `json:"routes"` - - // vpc Id - VpcID string `json:"vpcId,omitempty"` -} - -// Validate validates this a w s route table -func (m *AWSRouteTable) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateRoutes(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *AWSRouteTable) validateRoutes(formats strfmt.Registry) error { - - if swag.IsZero(m.Routes) { // not required - return nil - } - - for i := 0; i < len(m.Routes); i++ { - if swag.IsZero(m.Routes[i]) { // not required - continue - } - - if m.Routes[i] != nil { - if err := m.Routes[i].Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("routes" + "." + strconv.Itoa(i)) - } - return err - } - } - - } - - return nil -} - -// MarshalBinary interface implementation -func (m *AWSRouteTable) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AWSRouteTable) UnmarshalBinary(b []byte) error { - var res AWSRouteTable - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/a_w_s_subnet.go b/tkg/web/server/models/a_w_s_subnet.go deleted file mode 100644 index df47a94dfe..0000000000 --- a/tkg/web/server/models/a_w_s_subnet.go +++ /dev/null @@ -1,82 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" - "github.com/go-openapi/validate" -) - -// AWSSubnet a w s subnet -// swagger:model AWSSubnet -type AWSSubnet struct { - - // availability zone Id - AvailabilityZoneID string `json:"availabilityZoneId,omitempty"` - - // availability zone name - AvailabilityZoneName string `json:"availabilityZoneName,omitempty"` - - // cidr - Cidr string `json:"cidr,omitempty"` - - // id - ID string `json:"id,omitempty"` - - // is public - // Required: true - IsPublic *bool `json:"isPublic"` - - // state - State string `json:"state,omitempty"` - - // vpc Id - VpcID string `json:"vpcId,omitempty"` -} - -// Validate validates this a w s subnet -func (m *AWSSubnet) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateIsPublic(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *AWSSubnet) validateIsPublic(formats strfmt.Registry) error { - - if err := validate.Required("isPublic", "body", m.IsPublic); err != nil { - return err - } - - return nil -} - -// MarshalBinary interface implementation -func (m *AWSSubnet) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AWSSubnet) UnmarshalBinary(b []byte) error { - var res AWSSubnet - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/a_w_s_virtual_machine.go b/tkg/web/server/models/a_w_s_virtual_machine.go deleted file mode 100644 index 236bd1abf2..0000000000 --- a/tkg/web/server/models/a_w_s_virtual_machine.go +++ /dev/null @@ -1,74 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// AWSVirtualMachine a w s virtual machine -// swagger:model AWSVirtualMachine -type AWSVirtualMachine struct { - - // name - Name string `json:"name,omitempty"` - - // os info - OsInfo *OSInfo `json:"osInfo,omitempty"` -} - -// Validate validates this a w s virtual machine -func (m *AWSVirtualMachine) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateOsInfo(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *AWSVirtualMachine) validateOsInfo(formats strfmt.Registry) error { - - if swag.IsZero(m.OsInfo) { // not required - return nil - } - - if m.OsInfo != nil { - if err := m.OsInfo.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("osInfo") - } - return err - } - } - - return nil -} - -// MarshalBinary interface implementation -func (m *AWSVirtualMachine) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AWSVirtualMachine) UnmarshalBinary(b []byte) error { - var res AWSVirtualMachine - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/a_w_s_vpc.go b/tkg/web/server/models/a_w_s_vpc.go deleted file mode 100644 index 388fd74130..0000000000 --- a/tkg/web/server/models/a_w_s_vpc.go +++ /dev/null @@ -1,86 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "strconv" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// AWSVpc a w s vpc -// swagger:model AWSVpc -type AWSVpc struct { - - // azs - Azs []*AWSNodeAz `json:"azs"` - - // cidr - Cidr string `json:"cidr,omitempty"` - - // vpc ID - VpcID string `json:"vpcID,omitempty"` -} - -// Validate validates this a w s vpc -func (m *AWSVpc) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateAzs(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *AWSVpc) validateAzs(formats strfmt.Registry) error { - - if swag.IsZero(m.Azs) { // not required - return nil - } - - for i := 0; i < len(m.Azs); i++ { - if swag.IsZero(m.Azs[i]) { // not required - continue - } - - if m.Azs[i] != nil { - if err := m.Azs[i].Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("azs" + "." + strconv.Itoa(i)) - } - return err - } - } - - } - - return nil -} - -// MarshalBinary interface implementation -func (m *AWSVpc) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AWSVpc) UnmarshalBinary(b []byte) error { - var res AWSVpc - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/avi_cloud.go b/tkg/web/server/models/avi_cloud.go deleted file mode 100644 index bd00b57d88..0000000000 --- a/tkg/web/server/models/avi_cloud.go +++ /dev/null @@ -1,49 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AviCloud avi cloud -// swagger:model AviCloud -type AviCloud struct { - - // location - Location string `json:"location,omitempty"` - - // name - Name string `json:"name,omitempty"` - - // uuid - UUID string `json:"uuid,omitempty"` -} - -// Validate validates this avi cloud -func (m *AviCloud) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AviCloud) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AviCloud) UnmarshalBinary(b []byte) error { - var res AviCloud - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/avi_config.go b/tkg/web/server/models/avi_config.go deleted file mode 100644 index c137268f1c..0000000000 --- a/tkg/web/server/models/avi_config.go +++ /dev/null @@ -1,135 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// AviConfig avi config -// swagger:model AviConfig -type AviConfig struct { - - // ca cert - CaCert string `json:"ca_cert,omitempty"` - - // cloud - Cloud string `json:"cloud,omitempty"` - - // control plane ha provider - ControlPlaneHaProvider bool `json:"controlPlaneHaProvider,omitempty"` - - // control plane network - ControlPlaneNetwork *AviNetworkParams `json:"controlPlaneNetwork,omitempty"` - - // controller - Controller string `json:"controller,omitempty"` - - // labels - Labels map[string]string `json:"labels,omitempty"` - - // management cluster control plane vip network cidr - ManagementClusterControlPlaneVipNetworkCidr string `json:"managementClusterControlPlaneVipNetworkCidr,omitempty"` - - // management cluster control plane vip network name - ManagementClusterControlPlaneVipNetworkName string `json:"managementClusterControlPlaneVipNetworkName,omitempty"` - - // management cluster vip network cidr - ManagementClusterVipNetworkCidr string `json:"managementClusterVipNetworkCidr,omitempty"` - - // management cluster vip network name - ManagementClusterVipNetworkName string `json:"managementClusterVipNetworkName,omitempty"` - - // management cluster service engine - ManagementClusterServiceEngine string `json:"management_cluster_service_engine,omitempty"` - - // network - Network *AviNetworkParams `json:"network,omitempty"` - - // password - Password string `json:"password,omitempty"` - - // service engine - ServiceEngine string `json:"service_engine,omitempty"` - - // username - Username string `json:"username,omitempty"` -} - -// Validate validates this avi config -func (m *AviConfig) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateControlPlaneNetwork(formats); err != nil { - res = append(res, err) - } - - if err := m.validateNetwork(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *AviConfig) validateControlPlaneNetwork(formats strfmt.Registry) error { - - if swag.IsZero(m.ControlPlaneNetwork) { // not required - return nil - } - - if m.ControlPlaneNetwork != nil { - if err := m.ControlPlaneNetwork.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("controlPlaneNetwork") - } - return err - } - } - - return nil -} - -func (m *AviConfig) validateNetwork(formats strfmt.Registry) error { - - if swag.IsZero(m.Network) { // not required - return nil - } - - if m.Network != nil { - if err := m.Network.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("network") - } - return err - } - } - - return nil -} - -// MarshalBinary interface implementation -func (m *AviConfig) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AviConfig) UnmarshalBinary(b []byte) error { - var res AviConfig - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/avi_controller_params.go b/tkg/web/server/models/avi_controller_params.go deleted file mode 100644 index 025264666f..0000000000 --- a/tkg/web/server/models/avi_controller_params.go +++ /dev/null @@ -1,55 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AviControllerParams avi controller params -// swagger:model AviControllerParams -type AviControllerParams struct { - - // c a data - CAData string `json:"CAData,omitempty"` - - // host - Host string `json:"host,omitempty"` - - // password - Password string `json:"password,omitempty"` - - // tenant - Tenant string `json:"tenant,omitempty"` - - // username - Username string `json:"username,omitempty"` -} - -// Validate validates this avi controller params -func (m *AviControllerParams) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AviControllerParams) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AviControllerParams) UnmarshalBinary(b []byte) error { - var res AviControllerParams - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/avi_network_params.go b/tkg/web/server/models/avi_network_params.go deleted file mode 100644 index da17fdb76a..0000000000 --- a/tkg/web/server/models/avi_network_params.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AviNetworkParams avi network params -// swagger:model AviNetworkParams -type AviNetworkParams struct { - - // cidr - Cidr string `json:"cidr,omitempty"` - - // name - Name string `json:"name,omitempty"` -} - -// Validate validates this avi network params -func (m *AviNetworkParams) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AviNetworkParams) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AviNetworkParams) UnmarshalBinary(b []byte) error { - var res AviNetworkParams - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/avi_service_engine_group.go b/tkg/web/server/models/avi_service_engine_group.go deleted file mode 100644 index 47b9108947..0000000000 --- a/tkg/web/server/models/avi_service_engine_group.go +++ /dev/null @@ -1,49 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AviServiceEngineGroup avi service engine group -// swagger:model AviServiceEngineGroup -type AviServiceEngineGroup struct { - - // location - Location string `json:"location,omitempty"` - - // name - Name string `json:"name,omitempty"` - - // uuid - UUID string `json:"uuid,omitempty"` -} - -// Validate validates this avi service engine group -func (m *AviServiceEngineGroup) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AviServiceEngineGroup) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AviServiceEngineGroup) UnmarshalBinary(b []byte) error { - var res AviServiceEngineGroup - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/avi_subnet.go b/tkg/web/server/models/avi_subnet.go deleted file mode 100644 index cb04d6ed29..0000000000 --- a/tkg/web/server/models/avi_subnet.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AviSubnet avi subnet -// swagger:model AviSubnet -type AviSubnet struct { - - // family - Family string `json:"family,omitempty"` - - // subnet - Subnet string `json:"subnet,omitempty"` -} - -// Validate validates this avi subnet -func (m *AviSubnet) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AviSubnet) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AviSubnet) UnmarshalBinary(b []byte) error { - var res AviSubnet - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/avi_vip_network.go b/tkg/web/server/models/avi_vip_network.go deleted file mode 100644 index 3890079231..0000000000 --- a/tkg/web/server/models/avi_vip_network.go +++ /dev/null @@ -1,89 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "strconv" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// AviVipNetwork avi vip network -// swagger:model AviVipNetwork -type AviVipNetwork struct { - - // cloud - Cloud string `json:"cloud,omitempty"` - - // configed subnets - ConfigedSubnets []*AviSubnet `json:"configedSubnets"` - - // name - Name string `json:"name,omitempty"` - - // uuid - UUID string `json:"uuid,omitempty"` -} - -// Validate validates this avi vip network -func (m *AviVipNetwork) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateConfigedSubnets(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *AviVipNetwork) validateConfigedSubnets(formats strfmt.Registry) error { - - if swag.IsZero(m.ConfigedSubnets) { // not required - return nil - } - - for i := 0; i < len(m.ConfigedSubnets); i++ { - if swag.IsZero(m.ConfigedSubnets[i]) { // not required - continue - } - - if m.ConfigedSubnets[i] != nil { - if err := m.ConfigedSubnets[i].Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("configedSubnets" + "." + strconv.Itoa(i)) - } - return err - } - } - - } - - return nil -} - -// MarshalBinary interface implementation -func (m *AviVipNetwork) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AviVipNetwork) UnmarshalBinary(b []byte) error { - var res AviVipNetwork - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/azure_account_params.go b/tkg/web/server/models/azure_account_params.go deleted file mode 100644 index 8124a3c731..0000000000 --- a/tkg/web/server/models/azure_account_params.go +++ /dev/null @@ -1,55 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AzureAccountParams azure account params -// swagger:model AzureAccountParams -type AzureAccountParams struct { - - // azure cloud - AzureCloud string `json:"azureCloud,omitempty"` - - // client Id - ClientID string `json:"clientId,omitempty"` - - // client secret - ClientSecret string `json:"clientSecret,omitempty"` - - // subscription Id - SubscriptionID string `json:"subscriptionId,omitempty"` - - // tenant Id - TenantID string `json:"tenantId,omitempty"` -} - -// Validate validates this azure account params -func (m *AzureAccountParams) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AzureAccountParams) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AzureAccountParams) UnmarshalBinary(b []byte) error { - var res AzureAccountParams - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/azure_instance_type.go b/tkg/web/server/models/azure_instance_type.go deleted file mode 100644 index 13324bc964..0000000000 --- a/tkg/web/server/models/azure_instance_type.go +++ /dev/null @@ -1,55 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AzureInstanceType azure instance type -// swagger:model AzureInstanceType -type AzureInstanceType struct { - - // family - Family string `json:"family,omitempty"` - - // name - Name string `json:"name,omitempty"` - - // size - Size string `json:"size,omitempty"` - - // tier - Tier string `json:"tier,omitempty"` - - // zones - Zones []string `json:"zones"` -} - -// Validate validates this azure instance type -func (m *AzureInstanceType) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AzureInstanceType) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AzureInstanceType) UnmarshalBinary(b []byte) error { - var res AzureInstanceType - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/azure_location.go b/tkg/web/server/models/azure_location.go deleted file mode 100644 index d970c917a0..0000000000 --- a/tkg/web/server/models/azure_location.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AzureLocation azure location -// swagger:model AzureLocation -type AzureLocation struct { - - // display name - DisplayName string `json:"displayName,omitempty"` - - // name - Name string `json:"name,omitempty"` -} - -// Validate validates this azure location -func (m *AzureLocation) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AzureLocation) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AzureLocation) UnmarshalBinary(b []byte) error { - var res AzureLocation - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/azure_regional_cluster_params.go b/tkg/web/server/models/azure_regional_cluster_params.go deleted file mode 100644 index ffea62e0af..0000000000 --- a/tkg/web/server/models/azure_regional_cluster_params.go +++ /dev/null @@ -1,215 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// AzureRegionalClusterParams azure regional cluster params -// swagger:model AzureRegionalClusterParams -type AzureRegionalClusterParams struct { - - // annotations - Annotations map[string]string `json:"annotations,omitempty"` - - // azure account params - AzureAccountParams *AzureAccountParams `json:"azureAccountParams,omitempty"` - - // ceip opt in - CeipOptIn *bool `json:"ceipOptIn,omitempty"` - - // cluster name - ClusterName string `json:"clusterName,omitempty"` - - // control plane flavor - ControlPlaneFlavor string `json:"controlPlaneFlavor,omitempty"` - - // control plane machine type - ControlPlaneMachineType string `json:"controlPlaneMachineType,omitempty"` - - // control plane subnet - ControlPlaneSubnet string `json:"controlPlaneSubnet,omitempty"` - - // control plane subnet cidr - ControlPlaneSubnetCidr string `json:"controlPlaneSubnetCidr,omitempty"` - - // enable audit logging - EnableAuditLogging bool `json:"enableAuditLogging,omitempty"` - - // frontend private Ip - FrontendPrivateIP string `json:"frontendPrivateIp,omitempty"` - - // identity management - IdentityManagement *IdentityManagementConfig `json:"identityManagement,omitempty"` - - // is private cluster - IsPrivateCluster bool `json:"isPrivateCluster,omitempty"` - - // kubernetes version - KubernetesVersion string `json:"kubernetesVersion,omitempty"` - - // labels - Labels map[string]string `json:"labels,omitempty"` - - // location - Location string `json:"location,omitempty"` - - // machine health check enabled - MachineHealthCheckEnabled bool `json:"machineHealthCheckEnabled,omitempty"` - - // networking - Networking *TKGNetwork `json:"networking,omitempty"` - - // num of worker nodes - NumOfWorkerNodes string `json:"numOfWorkerNodes,omitempty"` - - // os - Os *AzureVirtualMachine `json:"os,omitempty"` - - // resource group - ResourceGroup string `json:"resourceGroup,omitempty"` - - // ssh public key - SSHPublicKey string `json:"sshPublicKey,omitempty"` - - // vnet cidr - VnetCidr string `json:"vnetCidr,omitempty"` - - // vnet name - VnetName string `json:"vnetName,omitempty"` - - // vnet resource group - VnetResourceGroup string `json:"vnetResourceGroup,omitempty"` - - // worker machine type - WorkerMachineType string `json:"workerMachineType,omitempty"` - - // worker node subnet - WorkerNodeSubnet string `json:"workerNodeSubnet,omitempty"` - - // worker node subnet cidr - WorkerNodeSubnetCidr string `json:"workerNodeSubnetCidr,omitempty"` -} - -// Validate validates this azure regional cluster params -func (m *AzureRegionalClusterParams) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateAzureAccountParams(formats); err != nil { - res = append(res, err) - } - - if err := m.validateIdentityManagement(formats); err != nil { - res = append(res, err) - } - - if err := m.validateNetworking(formats); err != nil { - res = append(res, err) - } - - if err := m.validateOs(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *AzureRegionalClusterParams) validateAzureAccountParams(formats strfmt.Registry) error { - - if swag.IsZero(m.AzureAccountParams) { // not required - return nil - } - - if m.AzureAccountParams != nil { - if err := m.AzureAccountParams.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("azureAccountParams") - } - return err - } - } - - return nil -} - -func (m *AzureRegionalClusterParams) validateIdentityManagement(formats strfmt.Registry) error { - - if swag.IsZero(m.IdentityManagement) { // not required - return nil - } - - if m.IdentityManagement != nil { - if err := m.IdentityManagement.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("identityManagement") - } - return err - } - } - - return nil -} - -func (m *AzureRegionalClusterParams) validateNetworking(formats strfmt.Registry) error { - - if swag.IsZero(m.Networking) { // not required - return nil - } - - if m.Networking != nil { - if err := m.Networking.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("networking") - } - return err - } - } - - return nil -} - -func (m *AzureRegionalClusterParams) validateOs(formats strfmt.Registry) error { - - if swag.IsZero(m.Os) { // not required - return nil - } - - if m.Os != nil { - if err := m.Os.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("os") - } - return err - } - } - - return nil -} - -// MarshalBinary interface implementation -func (m *AzureRegionalClusterParams) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AzureRegionalClusterParams) UnmarshalBinary(b []byte) error { - var res AzureRegionalClusterParams - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/azure_resource_group.go b/tkg/web/server/models/azure_resource_group.go deleted file mode 100644 index b9dd8eeaa0..0000000000 --- a/tkg/web/server/models/azure_resource_group.go +++ /dev/null @@ -1,84 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" - "github.com/go-openapi/validate" -) - -// AzureResourceGroup azure resource group -// swagger:model AzureResourceGroup -type AzureResourceGroup struct { - - // id - ID string `json:"id,omitempty"` - - // location - // Required: true - Location *string `json:"location"` - - // name - // Required: true - Name *string `json:"name"` -} - -// Validate validates this azure resource group -func (m *AzureResourceGroup) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateLocation(formats); err != nil { - res = append(res, err) - } - - if err := m.validateName(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *AzureResourceGroup) validateLocation(formats strfmt.Registry) error { - - if err := validate.Required("location", "body", m.Location); err != nil { - return err - } - - return nil -} - -func (m *AzureResourceGroup) validateName(formats strfmt.Registry) error { - - if err := validate.Required("name", "body", m.Name); err != nil { - return err - } - - return nil -} - -// MarshalBinary interface implementation -func (m *AzureResourceGroup) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AzureResourceGroup) UnmarshalBinary(b []byte) error { - var res AzureResourceGroup - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/azure_subnet.go b/tkg/web/server/models/azure_subnet.go deleted file mode 100644 index fd06c08cb4..0000000000 --- a/tkg/web/server/models/azure_subnet.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// AzureSubnet azure subnet -// swagger:model AzureSubnet -type AzureSubnet struct { - - // cidr - Cidr string `json:"cidr,omitempty"` - - // name - Name string `json:"name,omitempty"` -} - -// Validate validates this azure subnet -func (m *AzureSubnet) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *AzureSubnet) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AzureSubnet) UnmarshalBinary(b []byte) error { - var res AzureSubnet - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/azure_virtual_machine.go b/tkg/web/server/models/azure_virtual_machine.go deleted file mode 100644 index 5b3d9413e2..0000000000 --- a/tkg/web/server/models/azure_virtual_machine.go +++ /dev/null @@ -1,74 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// AzureVirtualMachine azure virtual machine -// swagger:model AzureVirtualMachine -type AzureVirtualMachine struct { - - // name - Name string `json:"name,omitempty"` - - // os info - OsInfo *OSInfo `json:"osInfo,omitempty"` -} - -// Validate validates this azure virtual machine -func (m *AzureVirtualMachine) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateOsInfo(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *AzureVirtualMachine) validateOsInfo(formats strfmt.Registry) error { - - if swag.IsZero(m.OsInfo) { // not required - return nil - } - - if m.OsInfo != nil { - if err := m.OsInfo.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("osInfo") - } - return err - } - } - - return nil -} - -// MarshalBinary interface implementation -func (m *AzureVirtualMachine) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AzureVirtualMachine) UnmarshalBinary(b []byte) error { - var res AzureVirtualMachine - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/azure_virtual_network.go b/tkg/web/server/models/azure_virtual_network.go deleted file mode 100644 index 77beb33c70..0000000000 --- a/tkg/web/server/models/azure_virtual_network.go +++ /dev/null @@ -1,135 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "strconv" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" - "github.com/go-openapi/validate" -) - -// AzureVirtualNetwork azure virtual network -// swagger:model AzureVirtualNetwork -type AzureVirtualNetwork struct { - - // cidr block - // Required: true - CidrBlock *string `json:"cidrBlock"` - - // id - ID string `json:"id,omitempty"` - - // location - // Required: true - Location *string `json:"location"` - - // name - // Required: true - Name *string `json:"name"` - - // subnets - Subnets []*AzureSubnet `json:"subnets"` -} - -// Validate validates this azure virtual network -func (m *AzureVirtualNetwork) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateCidrBlock(formats); err != nil { - res = append(res, err) - } - - if err := m.validateLocation(formats); err != nil { - res = append(res, err) - } - - if err := m.validateName(formats); err != nil { - res = append(res, err) - } - - if err := m.validateSubnets(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *AzureVirtualNetwork) validateCidrBlock(formats strfmt.Registry) error { - - if err := validate.Required("cidrBlock", "body", m.CidrBlock); err != nil { - return err - } - - return nil -} - -func (m *AzureVirtualNetwork) validateLocation(formats strfmt.Registry) error { - - if err := validate.Required("location", "body", m.Location); err != nil { - return err - } - - return nil -} - -func (m *AzureVirtualNetwork) validateName(formats strfmt.Registry) error { - - if err := validate.Required("name", "body", m.Name); err != nil { - return err - } - - return nil -} - -func (m *AzureVirtualNetwork) validateSubnets(formats strfmt.Registry) error { - - if swag.IsZero(m.Subnets) { // not required - return nil - } - - for i := 0; i < len(m.Subnets); i++ { - if swag.IsZero(m.Subnets[i]) { // not required - continue - } - - if m.Subnets[i] != nil { - if err := m.Subnets[i].Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("subnets" + "." + strconv.Itoa(i)) - } - return err - } - } - - } - - return nil -} - -// MarshalBinary interface implementation -func (m *AzureVirtualNetwork) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *AzureVirtualNetwork) UnmarshalBinary(b []byte) error { - var res AzureVirtualNetwork - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/config_file.go b/tkg/web/server/models/config_file.go deleted file mode 100644 index b776bd29f4..0000000000 --- a/tkg/web/server/models/config_file.go +++ /dev/null @@ -1,43 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// ConfigFile config file -// swagger:model ConfigFile -type ConfigFile struct { - - // filecontents - Filecontents string `json:"filecontents,omitempty"` -} - -// Validate validates this config file -func (m *ConfigFile) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *ConfigFile) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *ConfigFile) UnmarshalBinary(b []byte) error { - var res ConfigFile - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/config_file_info.go b/tkg/web/server/models/config_file_info.go deleted file mode 100644 index d95e453ebb..0000000000 --- a/tkg/web/server/models/config_file_info.go +++ /dev/null @@ -1,43 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// ConfigFileInfo config file info -// swagger:model ConfigFileInfo -type ConfigFileInfo struct { - - // path - Path string `json:"path,omitempty"` -} - -// Validate validates this config file info -func (m *ConfigFileInfo) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *ConfigFileInfo) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *ConfigFileInfo) UnmarshalBinary(b []byte) error { - var res ConfigFileInfo - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/docker_daemon_status.go b/tkg/web/server/models/docker_daemon_status.go deleted file mode 100644 index 32a745f044..0000000000 --- a/tkg/web/server/models/docker_daemon_status.go +++ /dev/null @@ -1,43 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// DockerDaemonStatus docker daemon status -// swagger:model DockerDaemonStatus -type DockerDaemonStatus struct { - - // status - Status bool `json:"status,omitempty"` -} - -// Validate validates this docker daemon status -func (m *DockerDaemonStatus) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *DockerDaemonStatus) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *DockerDaemonStatus) UnmarshalBinary(b []byte) error { - var res DockerDaemonStatus - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/docker_regional_cluster_params.go b/tkg/web/server/models/docker_regional_cluster_params.go deleted file mode 100644 index 0432ec45ea..0000000000 --- a/tkg/web/server/models/docker_regional_cluster_params.go +++ /dev/null @@ -1,120 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// DockerRegionalClusterParams docker regional cluster params -// swagger:model DockerRegionalClusterParams -type DockerRegionalClusterParams struct { - - // annotations - Annotations map[string]string `json:"annotations,omitempty"` - - // ceip opt in - CeipOptIn *bool `json:"ceipOptIn,omitempty"` - - // cluster name - ClusterName string `json:"clusterName,omitempty"` - - // control plane flavor - ControlPlaneFlavor string `json:"controlPlaneFlavor,omitempty"` - - // identity management - IdentityManagement *IdentityManagementConfig `json:"identityManagement,omitempty"` - - // kubernetes version - KubernetesVersion string `json:"kubernetesVersion,omitempty"` - - // labels - Labels map[string]string `json:"labels,omitempty"` - - // machine health check enabled - MachineHealthCheckEnabled bool `json:"machineHealthCheckEnabled,omitempty"` - - // networking - Networking *TKGNetwork `json:"networking,omitempty"` - - // num of worker nodes - NumOfWorkerNodes string `json:"numOfWorkerNodes,omitempty"` -} - -// Validate validates this docker regional cluster params -func (m *DockerRegionalClusterParams) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateIdentityManagement(formats); err != nil { - res = append(res, err) - } - - if err := m.validateNetworking(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *DockerRegionalClusterParams) validateIdentityManagement(formats strfmt.Registry) error { - - if swag.IsZero(m.IdentityManagement) { // not required - return nil - } - - if m.IdentityManagement != nil { - if err := m.IdentityManagement.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("identityManagement") - } - return err - } - } - - return nil -} - -func (m *DockerRegionalClusterParams) validateNetworking(formats strfmt.Registry) error { - - if swag.IsZero(m.Networking) { // not required - return nil - } - - if m.Networking != nil { - if err := m.Networking.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("networking") - } - return err - } - } - - return nil -} - -// MarshalBinary interface implementation -func (m *DockerRegionalClusterParams) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *DockerRegionalClusterParams) UnmarshalBinary(b []byte) error { - var res DockerRegionalClusterParams - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/error.go b/tkg/web/server/models/error.go deleted file mode 100644 index d9b6ad9479..0000000000 --- a/tkg/web/server/models/error.go +++ /dev/null @@ -1,43 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// Error error -// swagger:model Error -type Error struct { - - // message - Message string `json:"message,omitempty"` -} - -// Validate validates this error -func (m *Error) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *Error) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *Error) UnmarshalBinary(b []byte) error { - var res Error - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/feature_map.go b/tkg/web/server/models/feature_map.go deleted file mode 100644 index 8282970452..0000000000 --- a/tkg/web/server/models/feature_map.go +++ /dev/null @@ -1,19 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" -) - -// FeatureMap feature map -// swagger:model FeatureMap -type FeatureMap map[string]string - -// Validate validates this feature map -func (m FeatureMap) Validate(formats strfmt.Registry) error { - return nil -} diff --git a/tkg/web/server/models/features.go b/tkg/web/server/models/features.go deleted file mode 100644 index e52526bff3..0000000000 --- a/tkg/web/server/models/features.go +++ /dev/null @@ -1,36 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" -) - -// Features features -// swagger:model Features -type Features map[string]FeatureMap - -// Validate validates this features -func (m Features) Validate(formats strfmt.Registry) error { - var res []error - - for k := range m { - - if val, ok := m[k]; ok { - if err := val.Validate(formats); err != nil { - return err - } - } - - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/models/http_proxy_configuration.go b/tkg/web/server/models/http_proxy_configuration.go deleted file mode 100644 index 3b0b0a13f2..0000000000 --- a/tkg/web/server/models/http_proxy_configuration.go +++ /dev/null @@ -1,64 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// HTTPProxyConfiguration HTTP proxy configuration -// swagger:model HTTPProxyConfiguration -type HTTPProxyConfiguration struct { - - // HTTP proxy password - HTTPProxyPassword string `json:"HTTPProxyPassword,omitempty"` - - // HTTP proxy URL - HTTPProxyURL string `json:"HTTPProxyURL,omitempty"` - - // HTTP proxy username - HTTPProxyUsername string `json:"HTTPProxyUsername,omitempty"` - - // HTTPS proxy password - HTTPSProxyPassword string `json:"HTTPSProxyPassword,omitempty"` - - // HTTPS proxy URL - HTTPSProxyURL string `json:"HTTPSProxyURL,omitempty"` - - // HTTPS proxy username - HTTPSProxyUsername string `json:"HTTPSProxyUsername,omitempty"` - - // enabled - Enabled bool `json:"enabled,omitempty"` - - // no proxy - NoProxy string `json:"noProxy,omitempty"` -} - -// Validate validates this HTTP proxy configuration -func (m *HTTPProxyConfiguration) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *HTTPProxyConfiguration) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *HTTPProxyConfiguration) UnmarshalBinary(b []byte) error { - var res HTTPProxyConfiguration - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/identity_management_config.go b/tkg/web/server/models/identity_management_config.go deleted file mode 100644 index e393a734ac..0000000000 --- a/tkg/web/server/models/identity_management_config.go +++ /dev/null @@ -1,201 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "encoding/json" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" - "github.com/go-openapi/validate" -) - -// IdentityManagementConfig identity management config -// swagger:model IdentityManagementConfig -type IdentityManagementConfig struct { - - // idm type - // Required: true - // Enum: [oidc ldap none] - IdmType *string `json:"idm_type"` - - // ldap bind dn - LdapBindDn string `json:"ldap_bind_dn,omitempty"` - - // ldap bind password - LdapBindPassword string `json:"ldap_bind_password,omitempty"` - - // ldap group search base dn - LdapGroupSearchBaseDn string `json:"ldap_group_search_base_dn,omitempty"` - - // ldap group search filter - LdapGroupSearchFilter string `json:"ldap_group_search_filter,omitempty"` - - // ldap group search group attr - LdapGroupSearchGroupAttr string `json:"ldap_group_search_group_attr,omitempty"` - - // ldap group search name attr - LdapGroupSearchNameAttr string `json:"ldap_group_search_name_attr,omitempty"` - - // ldap group search user attr - LdapGroupSearchUserAttr string `json:"ldap_group_search_user_attr,omitempty"` - - // ldap root ca - LdapRootCa string `json:"ldap_root_ca,omitempty"` - - // ldap url - LdapURL string `json:"ldap_url,omitempty"` - - // ldap user search base dn - LdapUserSearchBaseDn string `json:"ldap_user_search_base_dn,omitempty"` - - // ldap user search email attr - LdapUserSearchEmailAttr string `json:"ldap_user_search_email_attr,omitempty"` - - // ldap user search filter - LdapUserSearchFilter string `json:"ldap_user_search_filter,omitempty"` - - // ldap user search id attr - LdapUserSearchIDAttr string `json:"ldap_user_search_id_attr,omitempty"` - - // ldap user search name attr - LdapUserSearchNameAttr string `json:"ldap_user_search_name_attr,omitempty"` - - // ldap user search username - LdapUserSearchUsername string `json:"ldap_user_search_username,omitempty"` - - // oidc claim mappings - OidcClaimMappings map[string]string `json:"oidc_claim_mappings,omitempty"` - - // oidc client id - OidcClientID string `json:"oidc_client_id,omitempty"` - - // oidc client secret - OidcClientSecret string `json:"oidc_client_secret,omitempty"` - - // oidc provider name - OidcProviderName string `json:"oidc_provider_name,omitempty"` - - // oidc provider url - // Format: uri - OidcProviderURL strfmt.URI `json:"oidc_provider_url,omitempty"` - - // oidc scope - OidcScope string `json:"oidc_scope,omitempty"` - - // oidc skip verify cert - OidcSkipVerifyCert bool `json:"oidc_skip_verify_cert,omitempty"` -} - -func (m *IdentityManagementConfig) UnmarshalJSON(b []byte) error { - type IdentityManagementConfigAlias IdentityManagementConfig - var t IdentityManagementConfigAlias - if err := json.Unmarshal([]byte("{\"idm_type\":\"oidc\",\"ldap_group_search_name_attr\":\"cn\",\"ldap_group_search_user_attr\":\"DN\",\"ldap_user_search_email_attr\":\"userPrincipalName\",\"ldap_user_search_id_attr\":\"DN\",\"ldap_user_search_username\":\"userPrincipalName\",\"oidc_skip_verify_cert\":false}"), &t); err != nil { - return err - } - if err := json.Unmarshal(b, &t); err != nil { - return err - } - *m = IdentityManagementConfig(t) - return nil -} - -// Validate validates this identity management config -func (m *IdentityManagementConfig) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateIdmType(formats); err != nil { - res = append(res, err) - } - - if err := m.validateOidcProviderURL(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -var identityManagementConfigTypeIdmTypePropEnum []interface{} - -func init() { - var res []string - if err := json.Unmarshal([]byte(`["oidc","ldap","none"]`), &res); err != nil { - panic(err) - } - for _, v := range res { - identityManagementConfigTypeIdmTypePropEnum = append(identityManagementConfigTypeIdmTypePropEnum, v) - } -} - -const ( - - // IdentityManagementConfigIdmTypeOidc captures enum value "oidc" - IdentityManagementConfigIdmTypeOidc string = "oidc" - - // IdentityManagementConfigIdmTypeLdap captures enum value "ldap" - IdentityManagementConfigIdmTypeLdap string = "ldap" - - // IdentityManagementConfigIdmTypeNone captures enum value "none" - IdentityManagementConfigIdmTypeNone string = "none" -) - -// prop value enum -func (m *IdentityManagementConfig) validateIdmTypeEnum(path, location string, value string) error { - if err := validate.Enum(path, location, value, identityManagementConfigTypeIdmTypePropEnum); err != nil { - return err - } - return nil -} - -func (m *IdentityManagementConfig) validateIdmType(formats strfmt.Registry) error { - - if err := validate.Required("idm_type", "body", m.IdmType); err != nil { - return err - } - - // value enum - if err := m.validateIdmTypeEnum("idm_type", "body", *m.IdmType); err != nil { - return err - } - - return nil -} - -func (m *IdentityManagementConfig) validateOidcProviderURL(formats strfmt.Registry) error { - - if swag.IsZero(m.OidcProviderURL) { // not required - return nil - } - - if err := validate.FormatOf("oidc_provider_url", "body", "uri", m.OidcProviderURL.String(), formats); err != nil { - return err - } - - return nil -} - -// MarshalBinary interface implementation -func (m *IdentityManagementConfig) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *IdentityManagementConfig) UnmarshalBinary(b []byte) error { - var res IdentityManagementConfig - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/ldap_params.go b/tkg/web/server/models/ldap_params.go deleted file mode 100644 index de19f607ae..0000000000 --- a/tkg/web/server/models/ldap_params.go +++ /dev/null @@ -1,106 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "encoding/json" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// LdapParams ldap params -// swagger:model LdapParams -type LdapParams struct { - - // ldap bind dn - LdapBindDn string `json:"ldap_bind_dn,omitempty"` - - // ldap bind password - LdapBindPassword string `json:"ldap_bind_password,omitempty"` - - // ldap group search base dn - LdapGroupSearchBaseDn string `json:"ldap_group_search_base_dn,omitempty"` - - // ldap group search filter - LdapGroupSearchFilter string `json:"ldap_group_search_filter,omitempty"` - - // ldap group search group attr - LdapGroupSearchGroupAttr string `json:"ldap_group_search_group_attr,omitempty"` - - // ldap group search name attr - LdapGroupSearchNameAttr string `json:"ldap_group_search_name_attr,omitempty"` - - // ldap group search user attr - LdapGroupSearchUserAttr string `json:"ldap_group_search_user_attr,omitempty"` - - // ldap root ca - LdapRootCa string `json:"ldap_root_ca,omitempty"` - - // ldap test group - LdapTestGroup string `json:"ldap_test_group,omitempty"` - - // ldap test user - LdapTestUser string `json:"ldap_test_user,omitempty"` - - // ldap url - LdapURL string `json:"ldap_url,omitempty"` - - // ldap user search base dn - LdapUserSearchBaseDn string `json:"ldap_user_search_base_dn,omitempty"` - - // ldap user search email attr - LdapUserSearchEmailAttr string `json:"ldap_user_search_email_attr,omitempty"` - - // ldap user search filter - LdapUserSearchFilter string `json:"ldap_user_search_filter,omitempty"` - - // ldap user search id attr - LdapUserSearchIDAttr string `json:"ldap_user_search_id_attr,omitempty"` - - // ldap user search name attr - LdapUserSearchNameAttr string `json:"ldap_user_search_name_attr,omitempty"` - - // ldap user search username - LdapUserSearchUsername string `json:"ldap_user_search_username,omitempty"` -} - -func (m *LdapParams) UnmarshalJSON(b []byte) error { - type LdapParamsAlias LdapParams - var t LdapParamsAlias - if err := json.Unmarshal([]byte("{\"ldap_group_search_name_attr\":\"cn\",\"ldap_group_search_user_attr\":\"DN\",\"ldap_user_search_email_attr\":\"userPrincipalName\",\"ldap_user_search_id_attr\":\"DN\",\"ldap_user_search_username\":\"userPrincipalName\"}"), &t); err != nil { - return err - } - if err := json.Unmarshal(b, &t); err != nil { - return err - } - *m = LdapParams(t) - return nil -} - -// Validate validates this ldap params -func (m *LdapParams) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *LdapParams) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *LdapParams) UnmarshalBinary(b []byte) error { - var res LdapParams - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/ldap_test_result.go b/tkg/web/server/models/ldap_test_result.go deleted file mode 100644 index bd7d7d11b2..0000000000 --- a/tkg/web/server/models/ldap_test_result.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// LdapTestResult ldap test result -// swagger:model LdapTestResult -type LdapTestResult struct { - - // code - Code int64 `json:"code,omitempty"` - - // desc - Desc string `json:"desc,omitempty"` -} - -// Validate validates this ldap test result -func (m *LdapTestResult) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *LdapTestResult) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *LdapTestResult) UnmarshalBinary(b []byte) error { - var res LdapTestResult - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/node_type.go b/tkg/web/server/models/node_type.go deleted file mode 100644 index 8d6f249411..0000000000 --- a/tkg/web/server/models/node_type.go +++ /dev/null @@ -1,52 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// NodeType node type -// swagger:model NodeType -type NodeType struct { - - // cpu - CPU int64 `json:"cpu,omitempty"` - - // disk - Disk int64 `json:"disk,omitempty"` - - // name - Name string `json:"name,omitempty"` - - // ram - RAM int64 `json:"ram,omitempty"` -} - -// Validate validates this node type -func (m *NodeType) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *NodeType) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *NodeType) UnmarshalBinary(b []byte) error { - var res NodeType - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/o_s_info.go b/tkg/web/server/models/o_s_info.go deleted file mode 100644 index 5f9eee1f50..0000000000 --- a/tkg/web/server/models/o_s_info.go +++ /dev/null @@ -1,49 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// OSInfo o s info -// swagger:model OSInfo -type OSInfo struct { - - // arch - Arch string `json:"arch,omitempty"` - - // name - Name string `json:"name,omitempty"` - - // version - Version string `json:"version,omitempty"` -} - -// Validate validates this o s info -func (m *OSInfo) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *OSInfo) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *OSInfo) UnmarshalBinary(b []byte) error { - var res OSInfo - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/provider_info.go b/tkg/web/server/models/provider_info.go deleted file mode 100644 index d2383cb967..0000000000 --- a/tkg/web/server/models/provider_info.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// ProviderInfo provider info -// swagger:model providerInfo -type ProviderInfo struct { - - // provider - Provider string `json:"provider,omitempty"` - - // tkr version - TkrVersion string `json:"tkrVersion,omitempty"` -} - -// Validate validates this provider info -func (m *ProviderInfo) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *ProviderInfo) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *ProviderInfo) UnmarshalBinary(b []byte) error { - var res ProviderInfo - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/t_k_g_network.go b/tkg/web/server/models/t_k_g_network.go deleted file mode 100644 index fecdfe7170..0000000000 --- a/tkg/web/server/models/t_k_g_network.go +++ /dev/null @@ -1,89 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// TKGNetwork t k g network -// swagger:model TKGNetwork -type TKGNetwork struct { - - // cluster DNS name - ClusterDNSName string `json:"clusterDNSName,omitempty"` - - // cluster node c ID r - ClusterNodeCIDR string `json:"clusterNodeCIDR,omitempty"` - - // cluster pod c ID r - ClusterPodCIDR string `json:"clusterPodCIDR,omitempty"` - - // cluster service c ID r - ClusterServiceCIDR string `json:"clusterServiceCIDR,omitempty"` - - // cni type - CniType string `json:"cniType,omitempty"` - - // http proxy configuration - HTTPProxyConfiguration *HTTPProxyConfiguration `json:"httpProxyConfiguration,omitempty"` - - // network name - NetworkName string `json:"networkName,omitempty"` -} - -// Validate validates this t k g network -func (m *TKGNetwork) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateHTTPProxyConfiguration(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *TKGNetwork) validateHTTPProxyConfiguration(formats strfmt.Registry) error { - - if swag.IsZero(m.HTTPProxyConfiguration) { // not required - return nil - } - - if m.HTTPProxyConfiguration != nil { - if err := m.HTTPProxyConfiguration.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("httpProxyConfiguration") - } - return err - } - } - - return nil -} - -// MarshalBinary interface implementation -func (m *TKGNetwork) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *TKGNetwork) UnmarshalBinary(b []byte) error { - var res TKGNetwork - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/v_sphere_availability_zone.go b/tkg/web/server/models/v_sphere_availability_zone.go deleted file mode 100644 index d6d16b67ae..0000000000 --- a/tkg/web/server/models/v_sphere_availability_zone.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// VSphereAvailabilityZone v sphere availability zone -// swagger:model VSphereAvailabilityZone -type VSphereAvailabilityZone struct { - - // moid - Moid string `json:"moid,omitempty"` - - // name - Name string `json:"name,omitempty"` -} - -// Validate validates this v sphere availability zone -func (m *VSphereAvailabilityZone) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *VSphereAvailabilityZone) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VSphereAvailabilityZone) UnmarshalBinary(b []byte) error { - var res VSphereAvailabilityZone - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/v_sphere_credentials.go b/tkg/web/server/models/v_sphere_credentials.go deleted file mode 100644 index b81c0e1e04..0000000000 --- a/tkg/web/server/models/v_sphere_credentials.go +++ /dev/null @@ -1,55 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// VSphereCredentials v sphere credentials -// swagger:model VSphereCredentials -type VSphereCredentials struct { - - // host - Host string `json:"host,omitempty"` - - // insecure - Insecure *bool `json:"insecure,omitempty"` - - // password - Password string `json:"password,omitempty"` - - // thumbprint - Thumbprint string `json:"thumbprint,omitempty"` - - // username - Username string `json:"username,omitempty"` -} - -// Validate validates this v sphere credentials -func (m *VSphereCredentials) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *VSphereCredentials) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VSphereCredentials) UnmarshalBinary(b []byte) error { - var res VSphereCredentials - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/v_sphere_datacenter.go b/tkg/web/server/models/v_sphere_datacenter.go deleted file mode 100644 index 5eda6cca0d..0000000000 --- a/tkg/web/server/models/v_sphere_datacenter.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// VSphereDatacenter v sphere datacenter -// swagger:model VSphereDatacenter -type VSphereDatacenter struct { - - // moid - Moid string `json:"moid,omitempty"` - - // name - Name string `json:"name,omitempty"` -} - -// Validate validates this v sphere datacenter -func (m *VSphereDatacenter) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *VSphereDatacenter) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VSphereDatacenter) UnmarshalBinary(b []byte) error { - var res VSphereDatacenter - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/v_sphere_datastore.go b/tkg/web/server/models/v_sphere_datastore.go deleted file mode 100644 index 686dffab6c..0000000000 --- a/tkg/web/server/models/v_sphere_datastore.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// VSphereDatastore v sphere datastore -// swagger:model VSphereDatastore -type VSphereDatastore struct { - - // moid - Moid string `json:"moid,omitempty"` - - // name - Name string `json:"name,omitempty"` -} - -// Validate validates this v sphere datastore -func (m *VSphereDatastore) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *VSphereDatastore) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VSphereDatastore) UnmarshalBinary(b []byte) error { - var res VSphereDatastore - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/v_sphere_folder.go b/tkg/web/server/models/v_sphere_folder.go deleted file mode 100644 index 71787829f2..0000000000 --- a/tkg/web/server/models/v_sphere_folder.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// VSphereFolder v sphere folder -// swagger:model VSphereFolder -type VSphereFolder struct { - - // moid - Moid string `json:"moid,omitempty"` - - // name - Name string `json:"name,omitempty"` -} - -// Validate validates this v sphere folder -func (m *VSphereFolder) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *VSphereFolder) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VSphereFolder) UnmarshalBinary(b []byte) error { - var res VSphereFolder - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/v_sphere_management_object.go b/tkg/web/server/models/v_sphere_management_object.go deleted file mode 100644 index 7f8afb7b4d..0000000000 --- a/tkg/web/server/models/v_sphere_management_object.go +++ /dev/null @@ -1,133 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "encoding/json" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" - "github.com/go-openapi/validate" -) - -// VSphereManagementObject v sphere management object -// swagger:model VSphereManagementObject -type VSphereManagementObject struct { - - // moid - Moid string `json:"moid,omitempty"` - - // name - Name string `json:"name,omitempty"` - - // parent moid - ParentMoid string `json:"parentMoid,omitempty"` - - // path - Path string `json:"path,omitempty"` - - // resource type - // Enum: [datacenter cluster hostgroup folder respool vm datastore host network] - ResourceType string `json:"resourceType,omitempty"` -} - -// Validate validates this v sphere management object -func (m *VSphereManagementObject) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateResourceType(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -var vSphereManagementObjectTypeResourceTypePropEnum []interface{} - -func init() { - var res []string - if err := json.Unmarshal([]byte(`["datacenter","cluster","hostgroup","folder","respool","vm","datastore","host","network"]`), &res); err != nil { - panic(err) - } - for _, v := range res { - vSphereManagementObjectTypeResourceTypePropEnum = append(vSphereManagementObjectTypeResourceTypePropEnum, v) - } -} - -const ( - - // VSphereManagementObjectResourceTypeDatacenter captures enum value "datacenter" - VSphereManagementObjectResourceTypeDatacenter string = "datacenter" - - // VSphereManagementObjectResourceTypeCluster captures enum value "cluster" - VSphereManagementObjectResourceTypeCluster string = "cluster" - - // VSphereManagementObjectResourceTypeHostgroup captures enum value "hostgroup" - VSphereManagementObjectResourceTypeHostgroup string = "hostgroup" - - // VSphereManagementObjectResourceTypeFolder captures enum value "folder" - VSphereManagementObjectResourceTypeFolder string = "folder" - - // VSphereManagementObjectResourceTypeRespool captures enum value "respool" - VSphereManagementObjectResourceTypeRespool string = "respool" - - // VSphereManagementObjectResourceTypeVM captures enum value "vm" - VSphereManagementObjectResourceTypeVM string = "vm" - - // VSphereManagementObjectResourceTypeDatastore captures enum value "datastore" - VSphereManagementObjectResourceTypeDatastore string = "datastore" - - // VSphereManagementObjectResourceTypeHost captures enum value "host" - VSphereManagementObjectResourceTypeHost string = "host" - - // VSphereManagementObjectResourceTypeNetwork captures enum value "network" - VSphereManagementObjectResourceTypeNetwork string = "network" -) - -// prop value enum -func (m *VSphereManagementObject) validateResourceTypeEnum(path, location string, value string) error { - if err := validate.Enum(path, location, value, vSphereManagementObjectTypeResourceTypePropEnum); err != nil { - return err - } - return nil -} - -func (m *VSphereManagementObject) validateResourceType(formats strfmt.Registry) error { - - if swag.IsZero(m.ResourceType) { // not required - return nil - } - - // value enum - if err := m.validateResourceTypeEnum("resourceType", "body", m.ResourceType); err != nil { - return err - } - - return nil -} - -// MarshalBinary interface implementation -func (m *VSphereManagementObject) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VSphereManagementObject) UnmarshalBinary(b []byte) error { - var res VSphereManagementObject - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/v_sphere_network.go b/tkg/web/server/models/v_sphere_network.go deleted file mode 100644 index ad37a4e0b5..0000000000 --- a/tkg/web/server/models/v_sphere_network.go +++ /dev/null @@ -1,49 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// VSphereNetwork v sphere network -// swagger:model VSphereNetwork -type VSphereNetwork struct { - - // display name - DisplayName string `json:"displayName,omitempty"` - - // moid - Moid string `json:"moid,omitempty"` - - // name - Name string `json:"name,omitempty"` -} - -// Validate validates this v sphere network -func (m *VSphereNetwork) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *VSphereNetwork) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VSphereNetwork) UnmarshalBinary(b []byte) error { - var res VSphereNetwork - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/v_sphere_region.go b/tkg/web/server/models/v_sphere_region.go deleted file mode 100644 index b5c3578a59..0000000000 --- a/tkg/web/server/models/v_sphere_region.go +++ /dev/null @@ -1,86 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "strconv" - - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// VSphereRegion v sphere region -// swagger:model VSphereRegion -type VSphereRegion struct { - - // moid - Moid string `json:"moid,omitempty"` - - // name - Name string `json:"name,omitempty"` - - // zones - Zones []*VSphereAvailabilityZone `json:"zones"` -} - -// Validate validates this v sphere region -func (m *VSphereRegion) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateZones(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *VSphereRegion) validateZones(formats strfmt.Registry) error { - - if swag.IsZero(m.Zones) { // not required - return nil - } - - for i := 0; i < len(m.Zones); i++ { - if swag.IsZero(m.Zones[i]) { // not required - continue - } - - if m.Zones[i] != nil { - if err := m.Zones[i].Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("zones" + "." + strconv.Itoa(i)) - } - return err - } - } - - } - - return nil -} - -// MarshalBinary interface implementation -func (m *VSphereRegion) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VSphereRegion) UnmarshalBinary(b []byte) error { - var res VSphereRegion - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/v_sphere_resource_pool.go b/tkg/web/server/models/v_sphere_resource_pool.go deleted file mode 100644 index 08038d8d54..0000000000 --- a/tkg/web/server/models/v_sphere_resource_pool.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// VSphereResourcePool v sphere resource pool -// swagger:model VSphereResourcePool -type VSphereResourcePool struct { - - // moid - Moid string `json:"moid,omitempty"` - - // name - Name string `json:"name,omitempty"` -} - -// Validate validates this v sphere resource pool -func (m *VSphereResourcePool) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *VSphereResourcePool) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VSphereResourcePool) UnmarshalBinary(b []byte) error { - var res VSphereResourcePool - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/v_sphere_thumbprint.go b/tkg/web/server/models/v_sphere_thumbprint.go deleted file mode 100644 index 6598f56288..0000000000 --- a/tkg/web/server/models/v_sphere_thumbprint.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// VSphereThumbprint v sphere thumbprint -// swagger:model VSphereThumbprint -type VSphereThumbprint struct { - - // insecure - Insecure *bool `json:"insecure,omitempty"` - - // thumbprint - Thumbprint string `json:"thumbprint,omitempty"` -} - -// Validate validates this v sphere thumbprint -func (m *VSphereThumbprint) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *VSphereThumbprint) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VSphereThumbprint) UnmarshalBinary(b []byte) error { - var res VSphereThumbprint - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/v_sphere_virtual_machine.go b/tkg/web/server/models/v_sphere_virtual_machine.go deleted file mode 100644 index ef451aa152..0000000000 --- a/tkg/web/server/models/v_sphere_virtual_machine.go +++ /dev/null @@ -1,98 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" - "github.com/go-openapi/validate" -) - -// VSphereVirtualMachine v sphere virtual machine -// swagger:model VSphereVirtualMachine -type VSphereVirtualMachine struct { - - // is template - // Required: true - IsTemplate *bool `json:"isTemplate"` - - // k8s version - K8sVersion string `json:"k8sVersion,omitempty"` - - // moid - Moid string `json:"moid,omitempty"` - - // name - Name string `json:"name,omitempty"` - - // os info - OsInfo *OSInfo `json:"osInfo,omitempty"` -} - -// Validate validates this v sphere virtual machine -func (m *VSphereVirtualMachine) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateIsTemplate(formats); err != nil { - res = append(res, err) - } - - if err := m.validateOsInfo(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *VSphereVirtualMachine) validateIsTemplate(formats strfmt.Registry) error { - - if err := validate.Required("isTemplate", "body", m.IsTemplate); err != nil { - return err - } - - return nil -} - -func (m *VSphereVirtualMachine) validateOsInfo(formats strfmt.Registry) error { - - if swag.IsZero(m.OsInfo) { // not required - return nil - } - - if m.OsInfo != nil { - if err := m.OsInfo.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("osInfo") - } - return err - } - } - - return nil -} - -// MarshalBinary interface implementation -func (m *VSphereVirtualMachine) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VSphereVirtualMachine) UnmarshalBinary(b []byte) error { - var res VSphereVirtualMachine - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/vpc.go b/tkg/web/server/models/vpc.go deleted file mode 100644 index 7a8f46f792..0000000000 --- a/tkg/web/server/models/vpc.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// Vpc vpc -// swagger:model vpc -type Vpc struct { - - // cidr - Cidr string `json:"cidr,omitempty"` - - // id - ID string `json:"id,omitempty"` -} - -// Validate validates this vpc -func (m *Vpc) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *Vpc) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *Vpc) UnmarshalBinary(b []byte) error { - var res Vpc - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/vsphere_info.go b/tkg/web/server/models/vsphere_info.go deleted file mode 100644 index 666276dde3..0000000000 --- a/tkg/web/server/models/vsphere_info.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/swag" -) - -// VsphereInfo vsphere info -// swagger:model vsphereInfo -type VsphereInfo struct { - - // has pacific - HasPacific string `json:"hasPacific,omitempty"` - - // version - Version string `json:"version,omitempty"` -} - -// Validate validates this vsphere info -func (m *VsphereInfo) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (m *VsphereInfo) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VsphereInfo) UnmarshalBinary(b []byte) error { - var res VsphereInfo - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/models/vsphere_regional_cluster_params.go b/tkg/web/server/models/vsphere_regional_cluster_params.go deleted file mode 100644 index 8ae777dda5..0000000000 --- a/tkg/web/server/models/vsphere_regional_cluster_params.go +++ /dev/null @@ -1,225 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package models - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - strfmt "github.com/go-openapi/strfmt" - - "github.com/go-openapi/errors" - "github.com/go-openapi/swag" -) - -// VsphereRegionalClusterParams vsphere regional cluster params -// swagger:model VsphereRegionalClusterParams -type VsphereRegionalClusterParams struct { - - // annotations - Annotations map[string]string `json:"annotations,omitempty"` - - // avi config - AviConfig *AviConfig `json:"aviConfig,omitempty"` - - // ceip opt in - CeipOptIn *bool `json:"ceipOptIn,omitempty"` - - // cluster name - ClusterName string `json:"clusterName,omitempty"` - - // control plane endpoint - ControlPlaneEndpoint string `json:"controlPlaneEndpoint,omitempty"` - - // control plane flavor - ControlPlaneFlavor string `json:"controlPlaneFlavor,omitempty"` - - // control plane node type - ControlPlaneNodeType string `json:"controlPlaneNodeType,omitempty"` - - // datacenter - Datacenter string `json:"datacenter,omitempty"` - - // datastore - Datastore string `json:"datastore,omitempty"` - - // enable audit logging - EnableAuditLogging bool `json:"enableAuditLogging,omitempty"` - - // folder - Folder string `json:"folder,omitempty"` - - // identity management - IdentityManagement *IdentityManagementConfig `json:"identityManagement,omitempty"` - - // ip family - IPFamily string `json:"ipFamily,omitempty"` - - // kubernetes version - KubernetesVersion string `json:"kubernetesVersion,omitempty"` - - // labels - Labels map[string]string `json:"labels,omitempty"` - - // machine health check enabled - MachineHealthCheckEnabled bool `json:"machineHealthCheckEnabled,omitempty"` - - // networking - Networking *TKGNetwork `json:"networking,omitempty"` - - // num of worker node - NumOfWorkerNode int64 `json:"numOfWorkerNode,omitempty"` - - // os - Os *VSphereVirtualMachine `json:"os,omitempty"` - - // resource pool - ResourcePool string `json:"resourcePool,omitempty"` - - // ssh key - SSHKey string `json:"ssh_key,omitempty"` - - // vsphere credentials - VsphereCredentials *VSphereCredentials `json:"vsphereCredentials,omitempty"` - - // worker node type - WorkerNodeType string `json:"workerNodeType,omitempty"` -} - -// Validate validates this vsphere regional cluster params -func (m *VsphereRegionalClusterParams) Validate(formats strfmt.Registry) error { - var res []error - - if err := m.validateAviConfig(formats); err != nil { - res = append(res, err) - } - - if err := m.validateIdentityManagement(formats); err != nil { - res = append(res, err) - } - - if err := m.validateNetworking(formats); err != nil { - res = append(res, err) - } - - if err := m.validateOs(formats); err != nil { - res = append(res, err) - } - - if err := m.validateVsphereCredentials(formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -func (m *VsphereRegionalClusterParams) validateAviConfig(formats strfmt.Registry) error { - - if swag.IsZero(m.AviConfig) { // not required - return nil - } - - if m.AviConfig != nil { - if err := m.AviConfig.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("aviConfig") - } - return err - } - } - - return nil -} - -func (m *VsphereRegionalClusterParams) validateIdentityManagement(formats strfmt.Registry) error { - - if swag.IsZero(m.IdentityManagement) { // not required - return nil - } - - if m.IdentityManagement != nil { - if err := m.IdentityManagement.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("identityManagement") - } - return err - } - } - - return nil -} - -func (m *VsphereRegionalClusterParams) validateNetworking(formats strfmt.Registry) error { - - if swag.IsZero(m.Networking) { // not required - return nil - } - - if m.Networking != nil { - if err := m.Networking.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("networking") - } - return err - } - } - - return nil -} - -func (m *VsphereRegionalClusterParams) validateOs(formats strfmt.Registry) error { - - if swag.IsZero(m.Os) { // not required - return nil - } - - if m.Os != nil { - if err := m.Os.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("os") - } - return err - } - } - - return nil -} - -func (m *VsphereRegionalClusterParams) validateVsphereCredentials(formats strfmt.Registry) error { - - if swag.IsZero(m.VsphereCredentials) { // not required - return nil - } - - if m.VsphereCredentials != nil { - if err := m.VsphereCredentials.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("vsphereCredentials") - } - return err - } - } - - return nil -} - -// MarshalBinary interface implementation -func (m *VsphereRegionalClusterParams) MarshalBinary() ([]byte, error) { - if m == nil { - return nil, nil - } - return swag.WriteJSON(m) -} - -// UnmarshalBinary interface implementation -func (m *VsphereRegionalClusterParams) UnmarshalBinary(b []byte) error { - var res VsphereRegionalClusterParams - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *m = res - return nil -} diff --git a/tkg/web/server/restapi/configure_kickstart_ui.go b/tkg/web/server/restapi/configure_kickstart_ui.go deleted file mode 100644 index afc856e28c..0000000000 --- a/tkg/web/server/restapi/configure_kickstart_ui.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// This file is safe to edit. Once it exists it will not be overwritten - -package restapi - -import ( - "crypto/tls" - "net/http" - - errors "github.com/go-openapi/errors" - runtime "github.com/go-openapi/runtime" - middleware "github.com/go-openapi/runtime/middleware" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/features" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/provider" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/ui" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/vsphere" -) - -func configureFlags(api *operations.KickstartUIAPI) { - // api.CommandLineOptionsGroups = []swag.CommandLineOptionsGroup{ ... } -} - -func configureAPI(api *operations.KickstartUIAPI) http.Handler { // nolint:funlen,gocyclo - // configure the api here - api.ServeError = errors.ServeError - - // Set your custom logger if needed. Default one is log.Printf - // Expected interface func(string, ...interface{}) - // - // Example: - // api.Logger = log.Printf - - api.Logger = log.Infof - - api.JSONConsumer = runtime.JSONConsumer() - - api.JSONProducer = runtime.JSONProducer() - - if api.AwsCreateAWSRegionalClusterHandler == nil { - api.AwsCreateAWSRegionalClusterHandler = aws.CreateAWSRegionalClusterHandlerFunc(func(params aws.CreateAWSRegionalClusterParams) middleware.Responder { - return middleware.NotImplemented("operation aws.CreateAWSRegionalCluster has not yet been implemented") - }) - } - if api.VsphereCreateVSphereRegionalClusterHandler == nil { - api.VsphereCreateVSphereRegionalClusterHandler = vsphere.CreateVSphereRegionalClusterHandlerFunc(func(params vsphere.CreateVSphereRegionalClusterParams) middleware.Responder { - return middleware.NotImplemented("operation vsphere.CreateVSphereRegionalCluster has not yet been implemented") - }) - } - if api.AwsGetAWSAvailabilityZonesHandler == nil { - api.AwsGetAWSAvailabilityZonesHandler = aws.GetAWSAvailabilityZonesHandlerFunc(func(params aws.GetAWSAvailabilityZonesParams) middleware.Responder { - return middleware.NotImplemented("operation aws.GetAWSAvailabilityZones has not yet been implemented") - }) - } - if api.AwsGetAWSNodeTypesHandler == nil { - api.AwsGetAWSNodeTypesHandler = aws.GetAWSNodeTypesHandlerFunc(func(params aws.GetAWSNodeTypesParams) middleware.Responder { - return middleware.NotImplemented("operation aws.GetAWSNodeTypes has not yet been implemented") - }) - } - if api.AwsGetAWSOSImagesHandler == nil { - api.AwsGetAWSOSImagesHandler = aws.GetAWSOSImagesHandlerFunc(func(params aws.GetAWSOSImagesParams) middleware.Responder { - return middleware.NotImplemented("operation aws.GetAWSOSImages has not yet been implemented") - }) - } - if api.AwsGetAWSRegionsHandler == nil { - api.AwsGetAWSRegionsHandler = aws.GetAWSRegionsHandlerFunc(func(params aws.GetAWSRegionsParams) middleware.Responder { - return middleware.NotImplemented("operation aws.GetAWSRegions has not yet been implemented") - }) - } - if api.ProviderGetProviderHandler == nil { - api.ProviderGetProviderHandler = provider.GetProviderHandlerFunc(func(params provider.GetProviderParams) middleware.Responder { - return middleware.NotImplemented("operation provider.GetProvider has not yet been implemented") - }) - } - if api.UIGetUIHandler == nil { - api.UIGetUIHandler = ui.GetUIHandlerFunc(func(params ui.GetUIParams) middleware.Responder { - return middleware.NotImplemented("operation ui.GetUI has not yet been implemented") - }) - } - if api.UIGetUIFileHandler == nil { - api.UIGetUIFileHandler = ui.GetUIFileHandlerFunc(func(params ui.GetUIFileParams) middleware.Responder { - return middleware.NotImplemented("operation ui.GetUIFile has not yet been implemented") - }) - } - if api.AwsGetVPCsHandler == nil { - api.AwsGetVPCsHandler = aws.GetVPCsHandlerFunc(func(params aws.GetVPCsParams) middleware.Responder { - return middleware.NotImplemented("operation aws.GetVPCs has not yet been implemented") - }) - } - if api.VsphereGetVSphereDatacentersHandler == nil { - api.VsphereGetVSphereDatacentersHandler = vsphere.GetVSphereDatacentersHandlerFunc(func(params vsphere.GetVSphereDatacentersParams) middleware.Responder { - return middleware.NotImplemented("operation vsphere.GetVSphereDatacenters has not yet been implemented") - }) - } - if api.VsphereGetVSphereDatastoresHandler == nil { - api.VsphereGetVSphereDatastoresHandler = vsphere.GetVSphereDatastoresHandlerFunc(func(params vsphere.GetVSphereDatastoresParams) middleware.Responder { - return middleware.NotImplemented("operation vsphere.GetVSphereDatastores has not yet been implemented") - }) - } - if api.VsphereGetVSphereNetworksHandler == nil { - api.VsphereGetVSphereNetworksHandler = vsphere.GetVSphereNetworksHandlerFunc(func(params vsphere.GetVSphereNetworksParams) middleware.Responder { - return middleware.NotImplemented("operation vsphere.GetVSphereNetworks has not yet been implemented") - }) - } - if api.VsphereGetVSphereNodeTypesHandler == nil { - api.VsphereGetVSphereNodeTypesHandler = vsphere.GetVSphereNodeTypesHandlerFunc(func(params vsphere.GetVSphereNodeTypesParams) middleware.Responder { - return middleware.NotImplemented("operation vsphere.GetVSphereNodeTypes has not yet been implemented") - }) - } - if api.VsphereGetVSphereOSImagesHandler == nil { - api.VsphereGetVSphereOSImagesHandler = vsphere.GetVSphereOSImagesHandlerFunc(func(params vsphere.GetVSphereOSImagesParams) middleware.Responder { - return middleware.NotImplemented("operation vsphere.GetVSphereOSImages has not yet been implemented") - }) - } - if api.VsphereGetVSphereResourcePoolsHandler == nil { - api.VsphereGetVSphereResourcePoolsHandler = vsphere.GetVSphereResourcePoolsHandlerFunc(func(params vsphere.GetVSphereResourcePoolsParams) middleware.Responder { - return middleware.NotImplemented("operation vsphere.GetVSphereResourcePools has not yet been implemented") - }) - } - if api.AwsSetAWSEndpointHandler == nil { - api.AwsSetAWSEndpointHandler = aws.SetAWSEndpointHandlerFunc(func(params aws.SetAWSEndpointParams) middleware.Responder { - return middleware.NotImplemented("operation aws.SetAWSEndpoint has not yet been implemented") - }) - } - if api.VsphereSetVSphereEndpointHandler == nil { - api.VsphereSetVSphereEndpointHandler = vsphere.SetVSphereEndpointHandlerFunc(func(params vsphere.SetVSphereEndpointParams) middleware.Responder { - return middleware.NotImplemented("operation vsphere.SetVSphereEndpoint has not yet been implemented") - }) - } - - if api.FeaturesGetFeatureFlagsHandler == nil { - api.FeaturesGetFeatureFlagsHandler = features.GetFeatureFlagsHandlerFunc(func(params features.GetFeatureFlagsParams) middleware.Responder { - return middleware.NotImplemented("operation features.GetFeatureFlags has not yet been implemented") - }) - } - - api.ServerShutdown = func() {} - - return setupGlobalMiddleware(api.Serve(setupMiddlewares)) -} - -// The TLS configuration before HTTPS server starts. -func configureTLS(tlsConfig *tls.Config) { - // Make all necessary changes to the TLS configuration here. -} - -// As soon as server is initialized but not run yet, this function will be called. -// If you need to modify a config, store server instance to stop it individually later, this is the place. -// This function can be called multiple times, depending on the number of serving schemes. -// scheme value will be set accordingly: "http", "https" or "unix" -func configureServer(s *http.Server, scheme, addr string) { -} - -// The middleware configuration is for the handler executors. These do not apply to the swagger.json document. -// The middleware executes after routing but before authentication, binding and validation -func setupMiddlewares(handler http.Handler) http.Handler { - return handler -} - -// The middleware configuration happens before anything, this middleware also applies to serving the swagger.json document. -// So this is a good place to plug in a panic handling middleware, logging and metrics -func setupGlobalMiddleware(handler http.Handler) http.Handler { - return handler -} diff --git a/tkg/web/server/restapi/doc.go b/tkg/web/server/restapi/doc.go deleted file mode 100644 index 65271ce303..0000000000 --- a/tkg/web/server/restapi/doc.go +++ /dev/null @@ -1,22 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -/* -Package restapi Tanzu Kubernetes Grid Setup API -Tanzu Kubernetes Grid Setup API. - - Schemes: - http - https - Host: localhost - BasePath: / - Version: 0.0.0 - - Consumes: - - application/json - - Produces: - - application/json - -swagger:meta -*/ -package restapi diff --git a/tkg/web/server/restapi/embedded_spec.go b/tkg/web/server/restapi/embedded_spec.go deleted file mode 100644 index a21f044c11..0000000000 --- a/tkg/web/server/restapi/embedded_spec.go +++ /dev/null @@ -1,7308 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package restapi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "encoding/json" -) - -var ( - // SwaggerJSON embedded version of the swagger document used at generation time - SwaggerJSON json.RawMessage - // FlatSwaggerJSON embedded flattened version of the swagger document used at generation time - FlatSwaggerJSON json.RawMessage -) - -func init() { - SwaggerJSON = json.RawMessage([]byte(`{ - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "schemes": [ - "http", - "https" - ], - "swagger": "2.0", - "info": { - "description": "Tanzu Kubernetes Grid Setup API.", - "title": "Tanzu Kubernetes Grid Setup API", - "version": "0.0.0" - }, - "basePath": "/", - "paths": { - "/": { - "get": { - "tags": [ - "ui" - ], - "summary": "Get the kickstart UI", - "operationId": "getUI", - "responses": { - "200": { - "description": "Successful operation", - "schema": { - "type": "file" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/avi": { - "post": { - "tags": [ - "avi" - ], - "summary": "Validate Avi controller credentials", - "operationId": "verifyAccount", - "parameters": [ - { - "description": "Avi controller credentials", - "name": "credentials", - "in": "body", - "schema": { - "$ref": "#/definitions/AviControllerParams" - } - } - ], - "responses": { - "201": { - "description": "Verified AVI credentials successfully" - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/avi/clouds": { - "get": { - "tags": [ - "avi" - ], - "summary": "Retrieve Avi load balancer clouds", - "operationId": "getAviClouds", - "responses": { - "200": { - "description": "Successful retrieval of Avi load balancer clouds", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AviCloud" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/avi/serviceenginegroups": { - "get": { - "tags": [ - "avi" - ], - "summary": "Retrieve Avi load balancer service engine groups", - "operationId": "getAviServiceEngineGroups", - "responses": { - "200": { - "description": "Successful retrieval of Avi load balancer service engine groups", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AviServiceEngineGroup" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/avi/vipnetworks": { - "get": { - "tags": [ - "avi" - ], - "summary": "Retrieve all Avi networks", - "operationId": "getAviVipNetworks", - "responses": { - "200": { - "description": "Successful retrieval of Avi load balancer service engine groups", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AviVipNetwork" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/edition": { - "get": { - "tags": [ - "edition" - ], - "summary": "Retrieve Tanzu edition", - "operationId": "getTanzuEdition", - "responses": { - "200": { - "description": "Successful retrieval of tanzu edition", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/features": { - "get": { - "tags": [ - "features" - ], - "summary": "Retrieve list of features", - "operationId": "getFeatureFlags", - "responses": { - "200": { - "description": "Successful retrieval of feature flags", - "schema": { - "$ref": "#/definitions/Features" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/ldap/bind": { - "post": { - "tags": [ - "ldap" - ], - "summary": "Validate LDAP bind or authentication", - "operationId": "verifyLdapBind", - "responses": { - "200": { - "description": "Verified LDAP credentials successfully", - "schema": { - "$ref": "#/definitions/LdapTestResult" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/ldap/connect": { - "post": { - "tags": [ - "ldap" - ], - "summary": "Validate LDAP connection", - "operationId": "verifyLdapConnect", - "parameters": [ - { - "description": "LDAP configuration", - "name": "credentials", - "in": "body", - "schema": { - "$ref": "#/definitions/LdapParams" - } - } - ], - "responses": { - "200": { - "description": "Verified LDAP credentials successfully", - "schema": { - "$ref": "#/definitions/LdapTestResult" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/ldap/disconnect": { - "post": { - "tags": [ - "ldap" - ], - "summary": "Validate if the LDAP connection can be closed", - "operationId": "verifyLdapCloseConnection", - "responses": { - "201": { - "description": "Verified LDAP credentials successfully" - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/ldap/groups/search": { - "post": { - "tags": [ - "ldap" - ], - "summary": "Validate LDAP Group Search configuration", - "operationId": "verifyLdapGroupSearch", - "responses": { - "200": { - "description": "Verified LDAP credentials successfully", - "schema": { - "$ref": "#/definitions/LdapTestResult" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/ldap/users/search": { - "post": { - "tags": [ - "ldap" - ], - "summary": "Validate LDAP User Search configuration", - "operationId": "verifyLdapUserSearch", - "responses": { - "200": { - "description": "Verified LDAP credentials successfully", - "schema": { - "$ref": "#/definitions/LdapTestResult" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers": { - "get": { - "tags": [ - "provider" - ], - "summary": "Get infrastructure provider given by the user via cli", - "operationId": "getProvider", - "responses": { - "200": { - "description": "Successful operation", - "schema": { - "$ref": "#/definitions/providerInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws": { - "post": { - "tags": [ - "aws" - ], - "summary": "Validate and set aws credentials", - "operationId": "setAWSEndpoint", - "parameters": [ - { - "description": "AWS account parameters", - "name": "accountParams", - "in": "body", - "schema": { - "$ref": "#/definitions/AWSAccountParams" - } - } - ], - "responses": { - "201": { - "description": "Connection successful" - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/AvailabilityZones": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS availability zones of current region", - "operationId": "getAWSAvailabilityZones", - "responses": { - "200": { - "description": "Successful retrieval of AWS availability zones", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AWSAvailabilityZone" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/config/export": { - "post": { - "tags": [ - "aws" - ], - "summary": "Generate TKG configuration file for AWS\"", - "operationId": "exportTKGConfigForAWS", - "parameters": [ - { - "description": "parameters to generate TKG configuration file for AWS", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AWSRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/config/import": { - "post": { - "tags": [ - "aws" - ], - "summary": "Generate TKG configuration object for AWS", - "operationId": "importTKGConfigForAWS", - "parameters": [ - { - "description": "config file from which to generate tkg configuration for aws", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ConfigFile" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "$ref": "#/definitions/AWSRegionalClusterParams" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/create": { - "post": { - "tags": [ - "aws" - ], - "summary": "Create AWS regional cluster", - "operationId": "createAWSRegionalCluster", - "parameters": [ - { - "description": "parameters to create a regional cluster", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AWSRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Creating regional cluster started successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/nodetypes": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS supported node types", - "operationId": "getAWSNodeTypes", - "parameters": [ - { - "type": "string", - "description": "AWS availability zone, e.g. us-west-2", - "name": "az", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful retrieval of AWS node types", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/osimages": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS supported os images", - "operationId": "getAWSOSImages", - "parameters": [ - { - "type": "string", - "description": "AWS region, e.g. us-west-2", - "name": "region", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of AWS supported os images", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AWSVirtualMachine" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/profiles": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS credential profiles", - "operationId": "getAWSCredentialProfiles", - "responses": { - "200": { - "description": "Successful retrieval of AWS credentials profiles", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/regions": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS regions", - "operationId": "getAWSRegions", - "responses": { - "200": { - "description": "Successful retrieval of AWS regions", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/subnets": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS Subnets info under a VPC", - "operationId": "getAWSSubnets", - "parameters": [ - { - "type": "string", - "description": "VPC Id", - "name": "vpcId", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of AWS subnets", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AWSSubnet" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/tkgconfig": { - "post": { - "tags": [ - "aws" - ], - "summary": "Apply the changes to TKG configuration file for AWS\"", - "operationId": "applyTKGConfigForAWS", - "parameters": [ - { - "description": "parameters to apply changes to TKG configuration file for AWS", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AWSRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Apply change to TKG configuration successfully", - "schema": { - "$ref": "#/definitions/ConfigFileInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/vpc": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS VPCs", - "operationId": "getVPCs", - "responses": { - "200": { - "description": "Successful retrieval of AWS VPCs", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/vpc" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve azure account params from environment variables", - "operationId": "getAzureEndpoint", - "responses": { - "200": { - "description": "Successful retrieval of Azure account parameters", - "schema": { - "$ref": "#/definitions/AzureAccountParams" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - }, - "post": { - "tags": [ - "azure" - ], - "summary": "Validate and set azure credentials", - "operationId": "setAzureEndpoint", - "parameters": [ - { - "description": "Azure account parameters", - "name": "accountParams", - "in": "body", - "schema": { - "$ref": "#/definitions/AzureAccountParams" - } - } - ], - "responses": { - "201": { - "description": "Connection successful" - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/config/export": { - "post": { - "tags": [ - "azure" - ], - "summary": "Generate TKG configuration file for Azure\"", - "operationId": "exportTKGConfigForAzure", - "parameters": [ - { - "description": "parameters to generate TKG configuration file for Azure", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AzureRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/config/import": { - "post": { - "tags": [ - "azure" - ], - "summary": "Generate TKG configuration object for azure", - "operationId": "importTKGConfigForAzure", - "parameters": [ - { - "description": "config file from which to generate tkg configuration for azure", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ConfigFile" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "$ref": "#/definitions/AzureRegionalClusterParams" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/create": { - "post": { - "tags": [ - "azure" - ], - "summary": "Create Azure regional cluster", - "operationId": "createAzureRegionalCluster", - "parameters": [ - { - "description": "parameters to create a regional cluster", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AzureRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Creating regional cluster started successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/osimages": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve Azure supported os images", - "operationId": "getAzureOSImages", - "responses": { - "200": { - "description": "Successful retrieval of Azure supported os images", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureVirtualMachine" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/regions": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve list of supported Azure regions", - "operationId": "getAzureRegions", - "responses": { - "200": { - "description": "Successful retrieval of Azure regions", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureLocation" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/regions/{location}/instanceTypes": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve list of supported Azure instance types for a region", - "operationId": "getAzureInstanceTypes", - "parameters": [ - { - "type": "string", - "description": "Azure region name", - "name": "location", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of Azure instance Types", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureInstanceType" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/resourcegroups": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve list of Azure resource groups for a subscription", - "operationId": "getAzureResourceGroups", - "parameters": [ - { - "type": "string", - "description": "Azure region", - "name": "location", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of Azure resource groups", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureResourceGroup" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - }, - "post": { - "tags": [ - "azure" - ], - "summary": "Create a new Azure resource group", - "operationId": "createAzureResourceGroup", - "parameters": [ - { - "description": "parameters to create a new Azure resource group", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AzureResourceGroup" - } - } - ], - "responses": { - "201": { - "description": "Successfully created Azure resource group", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/resourcegroups/{resourceGroupName}/vnets": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve list of Azure virtual networks in a resource group", - "operationId": "getAzureVnets", - "parameters": [ - { - "type": "string", - "description": "Name of the Azure resource group", - "name": "resourceGroupName", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Azure region", - "name": "location", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of Azure virtual networks", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureVirtualNetwork" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - }, - "post": { - "tags": [ - "azure" - ], - "summary": "Create a new Azure Virtual Network", - "operationId": "createAzureVirtualNetwork", - "parameters": [ - { - "type": "string", - "description": "Name of the Azure resource group", - "name": "resourceGroupName", - "in": "path", - "required": true - }, - { - "description": "parameters to create a new Azure Virtual network", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AzureVirtualNetwork" - } - } - ], - "responses": { - "201": { - "description": "Successfully created Azure Virtual network", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/tkgconfig": { - "post": { - "tags": [ - "azure" - ], - "summary": "Apply the changes to TKG configuration file for Azure\"", - "operationId": "applyTKGConfigForAzure", - "parameters": [ - { - "description": "parameters to apply changes to TKG configuration file for Azure", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AzureRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Apply change to TKG configuration successfully", - "schema": { - "$ref": "#/definitions/ConfigFileInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/docker/config/export": { - "post": { - "tags": [ - "docker" - ], - "summary": "Generate TKG configuration file for Docker\"", - "operationId": "exportTKGConfigForDocker", - "parameters": [ - { - "description": "parameters to generate TKG configuration file for Docker", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DockerRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/docker/config/import": { - "post": { - "tags": [ - "docker" - ], - "summary": "Generate TKG configuration object for docker", - "operationId": "importTKGConfigForDocker", - "parameters": [ - { - "description": "config file from which to generate tkg configuration for docker", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ConfigFile" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "$ref": "#/definitions/DockerRegionalClusterParams" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/docker/create": { - "post": { - "tags": [ - "docker" - ], - "summary": "Create Docker regional cluster", - "operationId": "createDockerRegionalCluster", - "parameters": [ - { - "description": "parameters to create a regional cluster", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DockerRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Creating regional cluster started successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/docker/daemon": { - "get": { - "tags": [ - "docker" - ], - "summary": "Check if docker deamon is available", - "operationId": "checkIfDockerDaemonAvailable", - "responses": { - "200": { - "description": "Checked the docker daemon status successfully.", - "schema": { - "$ref": "#/definitions/DockerDaemonStatus" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/docker/tkgconfig": { - "post": { - "tags": [ - "docker" - ], - "summary": "Apply the changes to TKG configuration file for docker\"", - "operationId": "applyTKGConfigForDocker", - "parameters": [ - { - "description": "parameters to apply changes to TKG configuration file for Docker", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DockerRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Apply change to TKG configuration successfully", - "schema": { - "$ref": "#/definitions/ConfigFileInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere": { - "post": { - "tags": [ - "vsphere" - ], - "summary": "Validate and set vSphere credentials", - "operationId": "setVSphereEndpoint", - "parameters": [ - { - "description": "vSphere credentials", - "name": "credentials", - "in": "body", - "schema": { - "$ref": "#/definitions/VSphereCredentials" - } - } - ], - "responses": { - "201": { - "description": "Connection successful", - "schema": { - "$ref": "#/definitions/vsphereInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/compute": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere compute resources", - "operationId": "getVSphereComputeResources", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere folders", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereManagementObject" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/config/export": { - "post": { - "tags": [ - "vsphere" - ], - "summary": "Generate TKG configuration file for vSphere", - "operationId": "exportTKGConfigForVsphere", - "parameters": [ - { - "description": "params to generate tkg configuration for vsphere", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/VsphereRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/config/import": { - "post": { - "tags": [ - "vsphere" - ], - "summary": "Generate TKG configuration object for vSphere", - "operationId": "importTKGConfigForVsphere", - "parameters": [ - { - "description": "config file from which to generate tkg configuration for vsphere", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ConfigFile" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "$ref": "#/definitions/VsphereRegionalClusterParams" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/create": { - "post": { - "tags": [ - "vsphere" - ], - "summary": "Create vSphere regional cluster", - "operationId": "createVSphereRegionalCluster", - "parameters": [ - { - "description": "params to create a regional cluster", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/VsphereRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Creating regional cluster started successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/datacenters": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere datacenters", - "operationId": "getVSphereDatacenters", - "responses": { - "200": { - "description": "Successful retrieval of vSphere datacenters", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereDatacenter" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/datastores": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere datastores", - "operationId": "getVSphereDatastores", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere datastores", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereDatastore" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/folders": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere folders", - "operationId": "getVSphereFolders", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere folders", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereFolder" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/networks": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve networks associated with the datacenter in vSphere", - "operationId": "getVSphereNetworks", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere networks", - "schema": { - "description": "a list of vpshere networks", - "type": "array", - "items": { - "$ref": "#/definitions/VSphereNetwork" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/nodetypes": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere supported kubernetes control plane node types", - "operationId": "getVSphereNodeTypes", - "responses": { - "200": { - "description": "Successful retrieval of node types supported by vSphere", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/NodeType" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/osimages": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere supported node os images", - "operationId": "getVSphereOSImages", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of node images supported by vSphere", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereVirtualMachine" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/resourcepools": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere resource pools", - "operationId": "getVSphereResourcePools", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere resourcePools", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereResourcePool" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/thumbprint": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Get vSphere thumbprint", - "operationId": "getVsphereThumbprint", - "parameters": [ - { - "type": "string", - "description": "vSphere host", - "name": "host", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere thumbprint", - "schema": { - "$ref": "#/definitions/VSphereThumbprint" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/tkgconfig": { - "post": { - "tags": [ - "vsphere" - ], - "summary": "Apply changes to TKG configuration file for vSphere", - "operationId": "applyTKGConfigForVsphere", - "parameters": [ - { - "description": "params to apply changes to tkg configuration for vsphere", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/VsphereRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "apply changes to TKG configuration file successfully", - "schema": { - "$ref": "#/definitions/ConfigFileInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/{filename}": { - "get": { - "tags": [ - "ui" - ], - "summary": "Get the kickstart UI static resource file", - "operationId": "getUIFile", - "parameters": [ - { - "type": "string", - "description": "UI file name", - "name": "filename", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful operation", - "schema": { - "type": "file" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - } - }, - "definitions": { - "AWSAccountParams": { - "type": "object", - "properties": { - "accessKeyID": { - "type": "string" - }, - "profileName": { - "type": "string" - }, - "region": { - "type": "string" - }, - "secretAccessKey": { - "type": "string" - }, - "sessionToken": { - "type": "string" - } - } - }, - "AWSAvailabilityZone": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "AWSNodeAz": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "privateSubnetID": { - "type": "string" - }, - "publicSubnetID": { - "type": "string" - }, - "workerNodeType": { - "type": "string" - } - } - }, - "AWSRegionalClusterParams": { - "type": "object", - "properties": { - "annotations": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "awsAccountParams": { - "$ref": "#/definitions/AWSAccountParams" - }, - "bastionHostEnabled": { - "type": "boolean" - }, - "ceipOptIn": { - "type": "boolean", - "default": true - }, - "clusterName": { - "type": "string" - }, - "controlPlaneFlavor": { - "type": "string" - }, - "controlPlaneNodeType": { - "type": "string" - }, - "createCloudFormationStack": { - "type": "boolean" - }, - "enableAuditLogging": { - "type": "boolean" - }, - "identityManagement": { - "$ref": "#/definitions/IdentityManagementConfig" - }, - "kubernetesVersion": { - "type": "string" - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "loadbalancerSchemeInternal": { - "type": "boolean" - }, - "machineHealthCheckEnabled": { - "type": "boolean" - }, - "networking": { - "$ref": "#/definitions/TKGNetwork" - }, - "numOfWorkerNode": { - "type": "integer" - }, - "os": { - "$ref": "#/definitions/AWSVirtualMachine" - }, - "sshKeyName": { - "type": "string" - }, - "vpc": { - "$ref": "#/definitions/AWSVpc" - }, - "workerNodeType": { - "type": "string" - } - } - }, - "AWSRoute": { - "type": "object", - "properties": { - "DestinationCidrBlock": { - "type": "string" - }, - "GatewayId": { - "type": "string" - }, - "State": { - "type": "string" - } - } - }, - "AWSRouteTable": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "routes": { - "type": "array", - "items": { - "$ref": "#/definitions/AWSRoute" - } - }, - "vpcId": { - "type": "string" - } - } - }, - "AWSSubnet": { - "type": "object", - "required": [ - "isPublic" - ], - "properties": { - "availabilityZoneId": { - "type": "string" - }, - "availabilityZoneName": { - "type": "string" - }, - "cidr": { - "type": "string" - }, - "id": { - "type": "string" - }, - "isPublic": { - "type": "boolean" - }, - "state": { - "type": "string" - }, - "vpcId": { - "type": "string" - } - } - }, - "AWSVirtualMachine": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "osInfo": { - "$ref": "#/definitions/OSInfo" - } - } - }, - "AWSVpc": { - "type": "object", - "properties": { - "azs": { - "type": "array", - "items": { - "$ref": "#/definitions/AWSNodeAz" - } - }, - "cidr": { - "type": "string" - }, - "vpcID": { - "type": "string" - } - } - }, - "AviCloud": { - "type": "object", - "properties": { - "location": { - "type": "string" - }, - "name": { - "type": "string" - }, - "uuid": { - "type": "string" - } - } - }, - "AviConfig": { - "type": "object", - "properties": { - "ca_cert": { - "type": "string" - }, - "cloud": { - "type": "string" - }, - "controlPlaneHaProvider": { - "type": "boolean" - }, - "controlPlaneNetwork": { - "$ref": "#/definitions/AviNetworkParams" - }, - "controller": { - "type": "string" - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "managementClusterControlPlaneVipNetworkCidr": { - "type": "string" - }, - "managementClusterControlPlaneVipNetworkName": { - "type": "string" - }, - "managementClusterVipNetworkCidr": { - "type": "string" - }, - "managementClusterVipNetworkName": { - "type": "string" - }, - "management_cluster_service_engine": { - "type": "string" - }, - "network": { - "$ref": "#/definitions/AviNetworkParams" - }, - "password": { - "type": "string" - }, - "service_engine": { - "type": "string" - }, - "username": { - "type": "string" - } - } - }, - "AviControllerParams": { - "type": "object", - "properties": { - "CAData": { - "type": "string" - }, - "host": { - "type": "string" - }, - "password": { - "type": "string" - }, - "tenant": { - "type": "string" - }, - "username": { - "type": "string" - } - } - }, - "AviNetworkParams": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "AviServiceEngineGroup": { - "type": "object", - "properties": { - "location": { - "type": "string" - }, - "name": { - "type": "string" - }, - "uuid": { - "type": "string" - } - } - }, - "AviSubnet": { - "type": "object", - "properties": { - "family": { - "type": "string" - }, - "subnet": { - "type": "string" - } - } - }, - "AviVipNetwork": { - "type": "object", - "properties": { - "cloud": { - "type": "string" - }, - "configedSubnets": { - "type": "array", - "items": { - "$ref": "#/definitions/AviSubnet" - } - }, - "name": { - "type": "string" - }, - "uuid": { - "type": "string" - } - } - }, - "AzureAccountParams": { - "type": "object", - "properties": { - "azureCloud": { - "type": "string" - }, - "clientId": { - "type": "string" - }, - "clientSecret": { - "type": "string" - }, - "subscriptionId": { - "type": "string" - }, - "tenantId": { - "type": "string" - } - } - }, - "AzureInstanceType": { - "type": "object", - "properties": { - "family": { - "type": "string" - }, - "name": { - "type": "string" - }, - "size": { - "type": "string" - }, - "tier": { - "type": "string" - }, - "zones": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "AzureLocation": { - "type": "object", - "properties": { - "displayName": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "AzureRegionalClusterParams": { - "type": "object", - "properties": { - "annotations": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "azureAccountParams": { - "$ref": "#/definitions/AzureAccountParams" - }, - "ceipOptIn": { - "type": "boolean", - "default": true - }, - "clusterName": { - "type": "string" - }, - "controlPlaneFlavor": { - "type": "string" - }, - "controlPlaneMachineType": { - "type": "string" - }, - "controlPlaneSubnet": { - "type": "string" - }, - "controlPlaneSubnetCidr": { - "type": "string" - }, - "enableAuditLogging": { - "type": "boolean" - }, - "frontendPrivateIp": { - "type": "string" - }, - "identityManagement": { - "$ref": "#/definitions/IdentityManagementConfig" - }, - "isPrivateCluster": { - "type": "boolean" - }, - "kubernetesVersion": { - "type": "string" - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "location": { - "type": "string" - }, - "machineHealthCheckEnabled": { - "type": "boolean" - }, - "networking": { - "$ref": "#/definitions/TKGNetwork" - }, - "numOfWorkerNodes": { - "type": "string" - }, - "os": { - "$ref": "#/definitions/AzureVirtualMachine" - }, - "resourceGroup": { - "type": "string" - }, - "sshPublicKey": { - "type": "string" - }, - "vnetCidr": { - "type": "string" - }, - "vnetName": { - "type": "string" - }, - "vnetResourceGroup": { - "type": "string" - }, - "workerMachineType": { - "type": "string" - }, - "workerNodeSubnet": { - "type": "string" - }, - "workerNodeSubnetCidr": { - "type": "string" - } - } - }, - "AzureResourceGroup": { - "type": "object", - "required": [ - "name", - "location" - ], - "properties": { - "id": { - "type": "string" - }, - "location": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "AzureSubnet": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "AzureVirtualMachine": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "osInfo": { - "$ref": "#/definitions/OSInfo" - } - } - }, - "AzureVirtualNetwork": { - "type": "object", - "required": [ - "name", - "location", - "cidrBlock" - ], - "properties": { - "cidrBlock": { - "type": "string" - }, - "id": { - "type": "string" - }, - "location": { - "type": "string" - }, - "name": { - "type": "string" - }, - "subnets": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureSubnet" - } - } - } - }, - "ConfigFile": { - "type": "object", - "properties": { - "filecontents": { - "type": "string" - } - } - }, - "ConfigFileInfo": { - "type": "object", - "properties": { - "path": { - "type": "string" - } - } - }, - "DockerDaemonStatus": { - "type": "object", - "properties": { - "status": { - "type": "boolean" - } - } - }, - "DockerRegionalClusterParams": { - "type": "object", - "properties": { - "annotations": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "ceipOptIn": { - "type": "boolean", - "default": true - }, - "clusterName": { - "type": "string" - }, - "controlPlaneFlavor": { - "type": "string" - }, - "identityManagement": { - "$ref": "#/definitions/IdentityManagementConfig" - }, - "kubernetesVersion": { - "type": "string" - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "machineHealthCheckEnabled": { - "type": "boolean" - }, - "networking": { - "$ref": "#/definitions/TKGNetwork" - }, - "numOfWorkerNodes": { - "type": "string" - } - } - }, - "Error": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - }, - "FeatureMap": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "Features": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/FeatureMap" - } - }, - "HTTPProxyConfiguration": { - "type": "object", - "properties": { - "HTTPProxyPassword": { - "type": "string" - }, - "HTTPProxyURL": { - "type": "string" - }, - "HTTPProxyUsername": { - "type": "string" - }, - "HTTPSProxyPassword": { - "type": "string" - }, - "HTTPSProxyURL": { - "type": "string" - }, - "HTTPSProxyUsername": { - "type": "string" - }, - "enabled": { - "type": "boolean" - }, - "noProxy": { - "type": "string" - } - } - }, - "IdentityManagementConfig": { - "type": "object", - "default": { - "idm_type": "oidc", - "ldap_group_search_name_attr": "cn", - "ldap_group_search_user_attr": "DN", - "ldap_user_search_email_attr": "userPrincipalName", - "ldap_user_search_id_attr": "DN", - "ldap_user_search_username": "userPrincipalName", - "oidc_skip_verify_cert": false - }, - "required": [ - "idm_type" - ], - "properties": { - "idm_type": { - "type": "string", - "enum": [ - "oidc", - "ldap", - "none" - ] - }, - "ldap_bind_dn": { - "type": "string" - }, - "ldap_bind_password": { - "type": "string" - }, - "ldap_group_search_base_dn": { - "type": "string" - }, - "ldap_group_search_filter": { - "type": "string" - }, - "ldap_group_search_group_attr": { - "type": "string" - }, - "ldap_group_search_name_attr": { - "type": "string" - }, - "ldap_group_search_user_attr": { - "type": "string" - }, - "ldap_root_ca": { - "type": "string" - }, - "ldap_url": { - "type": "string" - }, - "ldap_user_search_base_dn": { - "type": "string" - }, - "ldap_user_search_email_attr": { - "type": "string" - }, - "ldap_user_search_filter": { - "type": "string" - }, - "ldap_user_search_id_attr": { - "type": "string" - }, - "ldap_user_search_name_attr": { - "type": "string" - }, - "ldap_user_search_username": { - "type": "string" - }, - "oidc_claim_mappings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "oidc_client_id": { - "type": "string" - }, - "oidc_client_secret": { - "type": "string" - }, - "oidc_provider_name": { - "type": "string" - }, - "oidc_provider_url": { - "type": "string", - "format": "uri" - }, - "oidc_scope": { - "type": "string" - }, - "oidc_skip_verify_cert": { - "type": "boolean" - } - } - }, - "LdapParams": { - "type": "object", - "default": { - "ldap_group_search_name_attr": "cn", - "ldap_group_search_user_attr": "DN", - "ldap_user_search_email_attr": "userPrincipalName", - "ldap_user_search_id_attr": "DN", - "ldap_user_search_username": "userPrincipalName" - }, - "properties": { - "ldap_bind_dn": { - "type": "string" - }, - "ldap_bind_password": { - "type": "string" - }, - "ldap_group_search_base_dn": { - "type": "string" - }, - "ldap_group_search_filter": { - "type": "string" - }, - "ldap_group_search_group_attr": { - "type": "string" - }, - "ldap_group_search_name_attr": { - "type": "string" - }, - "ldap_group_search_user_attr": { - "type": "string" - }, - "ldap_root_ca": { - "type": "string" - }, - "ldap_test_group": { - "type": "string" - }, - "ldap_test_user": { - "type": "string" - }, - "ldap_url": { - "type": "string" - }, - "ldap_user_search_base_dn": { - "type": "string" - }, - "ldap_user_search_email_attr": { - "type": "string" - }, - "ldap_user_search_filter": { - "type": "string" - }, - "ldap_user_search_id_attr": { - "type": "string" - }, - "ldap_user_search_name_attr": { - "type": "string" - }, - "ldap_user_search_username": { - "type": "string" - } - } - }, - "LdapTestResult": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "desc": { - "type": "string" - } - } - }, - "NodeType": { - "type": "object", - "properties": { - "cpu": { - "type": "integer" - }, - "disk": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "ram": { - "type": "integer" - } - } - }, - "OSInfo": { - "type": "object", - "properties": { - "arch": { - "type": "string" - }, - "name": { - "type": "string" - }, - "version": { - "type": "string" - } - } - }, - "TKGNetwork": { - "type": "object", - "properties": { - "clusterDNSName": { - "type": "string" - }, - "clusterNodeCIDR": { - "type": "string" - }, - "clusterPodCIDR": { - "type": "string" - }, - "clusterServiceCIDR": { - "type": "string" - }, - "cniType": { - "type": "string" - }, - "httpProxyConfiguration": { - "$ref": "#/definitions/HTTPProxyConfiguration" - }, - "networkName": { - "type": "string" - } - } - }, - "VSphereAvailabilityZone": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereCredentials": { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "insecure": { - "type": "boolean", - "default": false - }, - "password": { - "type": "string" - }, - "thumbprint": { - "type": "string" - }, - "username": { - "type": "string" - } - } - }, - "VSphereDatacenter": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereDatastore": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereFolder": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereManagementObject": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "parentMoid": { - "type": "string" - }, - "path": { - "type": "string" - }, - "resourceType": { - "type": "string", - "enum": [ - "datacenter", - "cluster", - "hostgroup", - "folder", - "respool", - "vm", - "datastore", - "host", - "network" - ] - } - } - }, - "VSphereNetwork": { - "type": "object", - "properties": { - "displayName": { - "type": "string" - }, - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereRegion": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "zones": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereAvailabilityZone" - } - } - } - }, - "VSphereResourcePool": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereThumbprint": { - "type": "object", - "properties": { - "insecure": { - "type": "boolean", - "default": false - }, - "thumbprint": { - "type": "string" - } - } - }, - "VSphereVirtualMachine": { - "type": "object", - "required": [ - "isTemplate" - ], - "properties": { - "isTemplate": { - "type": "boolean" - }, - "k8sVersion": { - "type": "string" - }, - "moid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "osInfo": { - "$ref": "#/definitions/OSInfo" - } - } - }, - "VsphereRegionalClusterParams": { - "type": "object", - "properties": { - "annotations": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "aviConfig": { - "$ref": "#/definitions/AviConfig" - }, - "ceipOptIn": { - "type": "boolean", - "default": true - }, - "clusterName": { - "type": "string" - }, - "controlPlaneEndpoint": { - "type": "string" - }, - "controlPlaneFlavor": { - "type": "string" - }, - "controlPlaneNodeType": { - "type": "string" - }, - "datacenter": { - "type": "string" - }, - "datastore": { - "type": "string" - }, - "enableAuditLogging": { - "type": "boolean" - }, - "folder": { - "type": "string" - }, - "identityManagement": { - "$ref": "#/definitions/IdentityManagementConfig" - }, - "ipFamily": { - "type": "string" - }, - "kubernetesVersion": { - "type": "string" - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "machineHealthCheckEnabled": { - "type": "boolean" - }, - "networking": { - "$ref": "#/definitions/TKGNetwork" - }, - "numOfWorkerNode": { - "type": "integer" - }, - "os": { - "$ref": "#/definitions/VSphereVirtualMachine" - }, - "resourcePool": { - "type": "string" - }, - "ssh_key": { - "type": "string" - }, - "vsphereCredentials": { - "$ref": "#/definitions/VSphereCredentials" - }, - "workerNodeType": { - "type": "string" - } - } - }, - "providerInfo": { - "type": "object", - "properties": { - "provider": { - "type": "string" - }, - "tkrVersion": { - "type": "string" - } - } - }, - "vpc": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - }, - "id": { - "type": "string" - } - } - }, - "vsphereInfo": { - "type": "object", - "properties": { - "hasPacific": { - "type": "string" - }, - "version": { - "type": "string" - } - } - } - } -}`)) - FlatSwaggerJSON = json.RawMessage([]byte(`{ - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "schemes": [ - "http", - "https" - ], - "swagger": "2.0", - "info": { - "description": "Tanzu Kubernetes Grid Setup API.", - "title": "Tanzu Kubernetes Grid Setup API", - "version": "0.0.0" - }, - "basePath": "/", - "paths": { - "/": { - "get": { - "tags": [ - "ui" - ], - "summary": "Get the kickstart UI", - "operationId": "getUI", - "responses": { - "200": { - "description": "Successful operation", - "schema": { - "type": "file" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/avi": { - "post": { - "tags": [ - "avi" - ], - "summary": "Validate Avi controller credentials", - "operationId": "verifyAccount", - "parameters": [ - { - "description": "Avi controller credentials", - "name": "credentials", - "in": "body", - "schema": { - "$ref": "#/definitions/AviControllerParams" - } - } - ], - "responses": { - "201": { - "description": "Verified AVI credentials successfully" - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/avi/clouds": { - "get": { - "tags": [ - "avi" - ], - "summary": "Retrieve Avi load balancer clouds", - "operationId": "getAviClouds", - "responses": { - "200": { - "description": "Successful retrieval of Avi load balancer clouds", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AviCloud" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/avi/serviceenginegroups": { - "get": { - "tags": [ - "avi" - ], - "summary": "Retrieve Avi load balancer service engine groups", - "operationId": "getAviServiceEngineGroups", - "responses": { - "200": { - "description": "Successful retrieval of Avi load balancer service engine groups", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AviServiceEngineGroup" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/avi/vipnetworks": { - "get": { - "tags": [ - "avi" - ], - "summary": "Retrieve all Avi networks", - "operationId": "getAviVipNetworks", - "responses": { - "200": { - "description": "Successful retrieval of Avi load balancer service engine groups", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AviVipNetwork" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/edition": { - "get": { - "tags": [ - "edition" - ], - "summary": "Retrieve Tanzu edition", - "operationId": "getTanzuEdition", - "responses": { - "200": { - "description": "Successful retrieval of tanzu edition", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/features": { - "get": { - "tags": [ - "features" - ], - "summary": "Retrieve list of features", - "operationId": "getFeatureFlags", - "responses": { - "200": { - "description": "Successful retrieval of feature flags", - "schema": { - "$ref": "#/definitions/Features" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/ldap/bind": { - "post": { - "tags": [ - "ldap" - ], - "summary": "Validate LDAP bind or authentication", - "operationId": "verifyLdapBind", - "responses": { - "200": { - "description": "Verified LDAP credentials successfully", - "schema": { - "$ref": "#/definitions/LdapTestResult" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/ldap/connect": { - "post": { - "tags": [ - "ldap" - ], - "summary": "Validate LDAP connection", - "operationId": "verifyLdapConnect", - "parameters": [ - { - "description": "LDAP configuration", - "name": "credentials", - "in": "body", - "schema": { - "$ref": "#/definitions/LdapParams" - } - } - ], - "responses": { - "200": { - "description": "Verified LDAP credentials successfully", - "schema": { - "$ref": "#/definitions/LdapTestResult" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/ldap/disconnect": { - "post": { - "tags": [ - "ldap" - ], - "summary": "Validate if the LDAP connection can be closed", - "operationId": "verifyLdapCloseConnection", - "responses": { - "201": { - "description": "Verified LDAP credentials successfully" - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/ldap/groups/search": { - "post": { - "tags": [ - "ldap" - ], - "summary": "Validate LDAP Group Search configuration", - "operationId": "verifyLdapGroupSearch", - "responses": { - "200": { - "description": "Verified LDAP credentials successfully", - "schema": { - "$ref": "#/definitions/LdapTestResult" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/ldap/users/search": { - "post": { - "tags": [ - "ldap" - ], - "summary": "Validate LDAP User Search configuration", - "operationId": "verifyLdapUserSearch", - "responses": { - "200": { - "description": "Verified LDAP credentials successfully", - "schema": { - "$ref": "#/definitions/LdapTestResult" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers": { - "get": { - "tags": [ - "provider" - ], - "summary": "Get infrastructure provider given by the user via cli", - "operationId": "getProvider", - "responses": { - "200": { - "description": "Successful operation", - "schema": { - "$ref": "#/definitions/providerInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws": { - "post": { - "tags": [ - "aws" - ], - "summary": "Validate and set aws credentials", - "operationId": "setAWSEndpoint", - "parameters": [ - { - "description": "AWS account parameters", - "name": "accountParams", - "in": "body", - "schema": { - "$ref": "#/definitions/AWSAccountParams" - } - } - ], - "responses": { - "201": { - "description": "Connection successful" - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/AvailabilityZones": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS availability zones of current region", - "operationId": "getAWSAvailabilityZones", - "responses": { - "200": { - "description": "Successful retrieval of AWS availability zones", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AWSAvailabilityZone" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/config/export": { - "post": { - "tags": [ - "aws" - ], - "summary": "Generate TKG configuration file for AWS\"", - "operationId": "exportTKGConfigForAWS", - "parameters": [ - { - "description": "parameters to generate TKG configuration file for AWS", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AWSRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/config/import": { - "post": { - "tags": [ - "aws" - ], - "summary": "Generate TKG configuration object for AWS", - "operationId": "importTKGConfigForAWS", - "parameters": [ - { - "description": "config file from which to generate tkg configuration for aws", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ConfigFile" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "$ref": "#/definitions/AWSRegionalClusterParams" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/create": { - "post": { - "tags": [ - "aws" - ], - "summary": "Create AWS regional cluster", - "operationId": "createAWSRegionalCluster", - "parameters": [ - { - "description": "parameters to create a regional cluster", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AWSRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Creating regional cluster started successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/nodetypes": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS supported node types", - "operationId": "getAWSNodeTypes", - "parameters": [ - { - "type": "string", - "description": "AWS availability zone, e.g. us-west-2", - "name": "az", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Successful retrieval of AWS node types", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/osimages": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS supported os images", - "operationId": "getAWSOSImages", - "parameters": [ - { - "type": "string", - "description": "AWS region, e.g. us-west-2", - "name": "region", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of AWS supported os images", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AWSVirtualMachine" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/profiles": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS credential profiles", - "operationId": "getAWSCredentialProfiles", - "responses": { - "200": { - "description": "Successful retrieval of AWS credentials profiles", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/regions": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS regions", - "operationId": "getAWSRegions", - "responses": { - "200": { - "description": "Successful retrieval of AWS regions", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/subnets": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS Subnets info under a VPC", - "operationId": "getAWSSubnets", - "parameters": [ - { - "type": "string", - "description": "VPC Id", - "name": "vpcId", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of AWS subnets", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AWSSubnet" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/tkgconfig": { - "post": { - "tags": [ - "aws" - ], - "summary": "Apply the changes to TKG configuration file for AWS\"", - "operationId": "applyTKGConfigForAWS", - "parameters": [ - { - "description": "parameters to apply changes to TKG configuration file for AWS", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AWSRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Apply change to TKG configuration successfully", - "schema": { - "$ref": "#/definitions/ConfigFileInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/aws/vpc": { - "get": { - "tags": [ - "aws" - ], - "summary": "Retrieve AWS VPCs", - "operationId": "getVPCs", - "responses": { - "200": { - "description": "Successful retrieval of AWS VPCs", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/vpc" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve azure account params from environment variables", - "operationId": "getAzureEndpoint", - "responses": { - "200": { - "description": "Successful retrieval of Azure account parameters", - "schema": { - "$ref": "#/definitions/AzureAccountParams" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - }, - "post": { - "tags": [ - "azure" - ], - "summary": "Validate and set azure credentials", - "operationId": "setAzureEndpoint", - "parameters": [ - { - "description": "Azure account parameters", - "name": "accountParams", - "in": "body", - "schema": { - "$ref": "#/definitions/AzureAccountParams" - } - } - ], - "responses": { - "201": { - "description": "Connection successful" - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/config/export": { - "post": { - "tags": [ - "azure" - ], - "summary": "Generate TKG configuration file for Azure\"", - "operationId": "exportTKGConfigForAzure", - "parameters": [ - { - "description": "parameters to generate TKG configuration file for Azure", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AzureRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/config/import": { - "post": { - "tags": [ - "azure" - ], - "summary": "Generate TKG configuration object for azure", - "operationId": "importTKGConfigForAzure", - "parameters": [ - { - "description": "config file from which to generate tkg configuration for azure", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ConfigFile" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "$ref": "#/definitions/AzureRegionalClusterParams" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/create": { - "post": { - "tags": [ - "azure" - ], - "summary": "Create Azure regional cluster", - "operationId": "createAzureRegionalCluster", - "parameters": [ - { - "description": "parameters to create a regional cluster", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AzureRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Creating regional cluster started successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/osimages": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve Azure supported os images", - "operationId": "getAzureOSImages", - "responses": { - "200": { - "description": "Successful retrieval of Azure supported os images", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureVirtualMachine" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/regions": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve list of supported Azure regions", - "operationId": "getAzureRegions", - "responses": { - "200": { - "description": "Successful retrieval of Azure regions", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureLocation" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/regions/{location}/instanceTypes": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve list of supported Azure instance types for a region", - "operationId": "getAzureInstanceTypes", - "parameters": [ - { - "type": "string", - "description": "Azure region name", - "name": "location", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of Azure instance Types", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureInstanceType" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/resourcegroups": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve list of Azure resource groups for a subscription", - "operationId": "getAzureResourceGroups", - "parameters": [ - { - "type": "string", - "description": "Azure region", - "name": "location", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of Azure resource groups", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureResourceGroup" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - }, - "post": { - "tags": [ - "azure" - ], - "summary": "Create a new Azure resource group", - "operationId": "createAzureResourceGroup", - "parameters": [ - { - "description": "parameters to create a new Azure resource group", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AzureResourceGroup" - } - } - ], - "responses": { - "201": { - "description": "Successfully created Azure resource group", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/resourcegroups/{resourceGroupName}/vnets": { - "get": { - "tags": [ - "azure" - ], - "summary": "Retrieve list of Azure virtual networks in a resource group", - "operationId": "getAzureVnets", - "parameters": [ - { - "type": "string", - "description": "Name of the Azure resource group", - "name": "resourceGroupName", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Azure region", - "name": "location", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of Azure virtual networks", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureVirtualNetwork" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - }, - "post": { - "tags": [ - "azure" - ], - "summary": "Create a new Azure Virtual Network", - "operationId": "createAzureVirtualNetwork", - "parameters": [ - { - "type": "string", - "description": "Name of the Azure resource group", - "name": "resourceGroupName", - "in": "path", - "required": true - }, - { - "description": "parameters to create a new Azure Virtual network", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AzureVirtualNetwork" - } - } - ], - "responses": { - "201": { - "description": "Successfully created Azure Virtual network", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/azure/tkgconfig": { - "post": { - "tags": [ - "azure" - ], - "summary": "Apply the changes to TKG configuration file for Azure\"", - "operationId": "applyTKGConfigForAzure", - "parameters": [ - { - "description": "parameters to apply changes to TKG configuration file for Azure", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/AzureRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Apply change to TKG configuration successfully", - "schema": { - "$ref": "#/definitions/ConfigFileInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/docker/config/export": { - "post": { - "tags": [ - "docker" - ], - "summary": "Generate TKG configuration file for Docker\"", - "operationId": "exportTKGConfigForDocker", - "parameters": [ - { - "description": "parameters to generate TKG configuration file for Docker", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DockerRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/docker/config/import": { - "post": { - "tags": [ - "docker" - ], - "summary": "Generate TKG configuration object for docker", - "operationId": "importTKGConfigForDocker", - "parameters": [ - { - "description": "config file from which to generate tkg configuration for docker", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ConfigFile" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "$ref": "#/definitions/DockerRegionalClusterParams" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/docker/create": { - "post": { - "tags": [ - "docker" - ], - "summary": "Create Docker regional cluster", - "operationId": "createDockerRegionalCluster", - "parameters": [ - { - "description": "parameters to create a regional cluster", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DockerRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Creating regional cluster started successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/docker/daemon": { - "get": { - "tags": [ - "docker" - ], - "summary": "Check if docker deamon is available", - "operationId": "checkIfDockerDaemonAvailable", - "responses": { - "200": { - "description": "Checked the docker daemon status successfully.", - "schema": { - "$ref": "#/definitions/DockerDaemonStatus" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/docker/tkgconfig": { - "post": { - "tags": [ - "docker" - ], - "summary": "Apply the changes to TKG configuration file for docker\"", - "operationId": "applyTKGConfigForDocker", - "parameters": [ - { - "description": "parameters to apply changes to TKG configuration file for Docker", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DockerRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Apply change to TKG configuration successfully", - "schema": { - "$ref": "#/definitions/ConfigFileInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere": { - "post": { - "tags": [ - "vsphere" - ], - "summary": "Validate and set vSphere credentials", - "operationId": "setVSphereEndpoint", - "parameters": [ - { - "description": "vSphere credentials", - "name": "credentials", - "in": "body", - "schema": { - "$ref": "#/definitions/VSphereCredentials" - } - } - ], - "responses": { - "201": { - "description": "Connection successful", - "schema": { - "$ref": "#/definitions/vsphereInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/compute": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere compute resources", - "operationId": "getVSphereComputeResources", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere folders", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereManagementObject" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/config/export": { - "post": { - "tags": [ - "vsphere" - ], - "summary": "Generate TKG configuration file for vSphere", - "operationId": "exportTKGConfigForVsphere", - "parameters": [ - { - "description": "params to generate tkg configuration for vsphere", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/VsphereRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/config/import": { - "post": { - "tags": [ - "vsphere" - ], - "summary": "Generate TKG configuration object for vSphere", - "operationId": "importTKGConfigForVsphere", - "parameters": [ - { - "description": "config file from which to generate tkg configuration for vsphere", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ConfigFile" - } - } - ], - "responses": { - "200": { - "description": "Generated TKG configuration successfully", - "schema": { - "$ref": "#/definitions/VsphereRegionalClusterParams" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/create": { - "post": { - "tags": [ - "vsphere" - ], - "summary": "Create vSphere regional cluster", - "operationId": "createVSphereRegionalCluster", - "parameters": [ - { - "description": "params to create a regional cluster", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/VsphereRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "Creating regional cluster started successfully", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/datacenters": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere datacenters", - "operationId": "getVSphereDatacenters", - "responses": { - "200": { - "description": "Successful retrieval of vSphere datacenters", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereDatacenter" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/datastores": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere datastores", - "operationId": "getVSphereDatastores", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere datastores", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereDatastore" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/folders": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere folders", - "operationId": "getVSphereFolders", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere folders", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereFolder" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/networks": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve networks associated with the datacenter in vSphere", - "operationId": "getVSphereNetworks", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere networks", - "schema": { - "description": "a list of vpshere networks", - "type": "array", - "items": { - "$ref": "#/definitions/VSphereNetwork" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/nodetypes": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere supported kubernetes control plane node types", - "operationId": "getVSphereNodeTypes", - "responses": { - "200": { - "description": "Successful retrieval of node types supported by vSphere", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/NodeType" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/osimages": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere supported node os images", - "operationId": "getVSphereOSImages", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of node images supported by vSphere", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereVirtualMachine" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/resourcepools": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Retrieve vSphere resource pools", - "operationId": "getVSphereResourcePools", - "parameters": [ - { - "type": "string", - "description": "datacenter managed object Id, e.g. datacenter-2", - "name": "dc", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere resourcePools", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereResourcePool" - } - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/thumbprint": { - "get": { - "tags": [ - "vsphere" - ], - "summary": "Get vSphere thumbprint", - "operationId": "getVsphereThumbprint", - "parameters": [ - { - "type": "string", - "description": "vSphere host", - "name": "host", - "in": "query", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful retrieval of vSphere thumbprint", - "schema": { - "$ref": "#/definitions/VSphereThumbprint" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/api/providers/vsphere/tkgconfig": { - "post": { - "tags": [ - "vsphere" - ], - "summary": "Apply changes to TKG configuration file for vSphere", - "operationId": "applyTKGConfigForVsphere", - "parameters": [ - { - "description": "params to apply changes to tkg configuration for vsphere", - "name": "params", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/VsphereRegionalClusterParams" - } - } - ], - "responses": { - "200": { - "description": "apply changes to TKG configuration file successfully", - "schema": { - "$ref": "#/definitions/ConfigFileInfo" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "401": { - "description": "Incorrect credentials", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/{filename}": { - "get": { - "tags": [ - "ui" - ], - "summary": "Get the kickstart UI static resource file", - "operationId": "getUIFile", - "parameters": [ - { - "type": "string", - "description": "UI file name", - "name": "filename", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "Successful operation", - "schema": { - "type": "file" - } - }, - "400": { - "description": "Bad request", - "schema": { - "$ref": "#/definitions/Error" - } - }, - "500": { - "description": "Internal server error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - } - }, - "definitions": { - "AWSAccountParams": { - "type": "object", - "properties": { - "accessKeyID": { - "type": "string" - }, - "profileName": { - "type": "string" - }, - "region": { - "type": "string" - }, - "secretAccessKey": { - "type": "string" - }, - "sessionToken": { - "type": "string" - } - } - }, - "AWSAvailabilityZone": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "AWSNodeAz": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "privateSubnetID": { - "type": "string" - }, - "publicSubnetID": { - "type": "string" - }, - "workerNodeType": { - "type": "string" - } - } - }, - "AWSRegionalClusterParams": { - "type": "object", - "properties": { - "annotations": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "awsAccountParams": { - "$ref": "#/definitions/AWSAccountParams" - }, - "bastionHostEnabled": { - "type": "boolean" - }, - "ceipOptIn": { - "type": "boolean", - "default": true - }, - "clusterName": { - "type": "string" - }, - "controlPlaneFlavor": { - "type": "string" - }, - "controlPlaneNodeType": { - "type": "string" - }, - "createCloudFormationStack": { - "type": "boolean" - }, - "enableAuditLogging": { - "type": "boolean" - }, - "identityManagement": { - "$ref": "#/definitions/IdentityManagementConfig" - }, - "kubernetesVersion": { - "type": "string" - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "loadbalancerSchemeInternal": { - "type": "boolean" - }, - "machineHealthCheckEnabled": { - "type": "boolean" - }, - "networking": { - "$ref": "#/definitions/TKGNetwork" - }, - "numOfWorkerNode": { - "type": "integer" - }, - "os": { - "$ref": "#/definitions/AWSVirtualMachine" - }, - "sshKeyName": { - "type": "string" - }, - "vpc": { - "$ref": "#/definitions/AWSVpc" - }, - "workerNodeType": { - "type": "string" - } - } - }, - "AWSRoute": { - "type": "object", - "properties": { - "DestinationCidrBlock": { - "type": "string" - }, - "GatewayId": { - "type": "string" - }, - "State": { - "type": "string" - } - } - }, - "AWSRouteTable": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "routes": { - "type": "array", - "items": { - "$ref": "#/definitions/AWSRoute" - } - }, - "vpcId": { - "type": "string" - } - } - }, - "AWSSubnet": { - "type": "object", - "required": [ - "isPublic" - ], - "properties": { - "availabilityZoneId": { - "type": "string" - }, - "availabilityZoneName": { - "type": "string" - }, - "cidr": { - "type": "string" - }, - "id": { - "type": "string" - }, - "isPublic": { - "type": "boolean" - }, - "state": { - "type": "string" - }, - "vpcId": { - "type": "string" - } - } - }, - "AWSVirtualMachine": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "osInfo": { - "$ref": "#/definitions/OSInfo" - } - } - }, - "AWSVpc": { - "type": "object", - "properties": { - "azs": { - "type": "array", - "items": { - "$ref": "#/definitions/AWSNodeAz" - } - }, - "cidr": { - "type": "string" - }, - "vpcID": { - "type": "string" - } - } - }, - "AviCloud": { - "type": "object", - "properties": { - "location": { - "type": "string" - }, - "name": { - "type": "string" - }, - "uuid": { - "type": "string" - } - } - }, - "AviConfig": { - "type": "object", - "properties": { - "ca_cert": { - "type": "string" - }, - "cloud": { - "type": "string" - }, - "controlPlaneHaProvider": { - "type": "boolean" - }, - "controlPlaneNetwork": { - "$ref": "#/definitions/AviNetworkParams" - }, - "controller": { - "type": "string" - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "managementClusterControlPlaneVipNetworkCidr": { - "type": "string" - }, - "managementClusterControlPlaneVipNetworkName": { - "type": "string" - }, - "managementClusterVipNetworkCidr": { - "type": "string" - }, - "managementClusterVipNetworkName": { - "type": "string" - }, - "management_cluster_service_engine": { - "type": "string" - }, - "network": { - "$ref": "#/definitions/AviNetworkParams" - }, - "password": { - "type": "string" - }, - "service_engine": { - "type": "string" - }, - "username": { - "type": "string" - } - } - }, - "AviControllerParams": { - "type": "object", - "properties": { - "CAData": { - "type": "string" - }, - "host": { - "type": "string" - }, - "password": { - "type": "string" - }, - "tenant": { - "type": "string" - }, - "username": { - "type": "string" - } - } - }, - "AviNetworkParams": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "AviServiceEngineGroup": { - "type": "object", - "properties": { - "location": { - "type": "string" - }, - "name": { - "type": "string" - }, - "uuid": { - "type": "string" - } - } - }, - "AviSubnet": { - "type": "object", - "properties": { - "family": { - "type": "string" - }, - "subnet": { - "type": "string" - } - } - }, - "AviVipNetwork": { - "type": "object", - "properties": { - "cloud": { - "type": "string" - }, - "configedSubnets": { - "type": "array", - "items": { - "$ref": "#/definitions/AviSubnet" - } - }, - "name": { - "type": "string" - }, - "uuid": { - "type": "string" - } - } - }, - "AzureAccountParams": { - "type": "object", - "properties": { - "azureCloud": { - "type": "string" - }, - "clientId": { - "type": "string" - }, - "clientSecret": { - "type": "string" - }, - "subscriptionId": { - "type": "string" - }, - "tenantId": { - "type": "string" - } - } - }, - "AzureInstanceType": { - "type": "object", - "properties": { - "family": { - "type": "string" - }, - "name": { - "type": "string" - }, - "size": { - "type": "string" - }, - "tier": { - "type": "string" - }, - "zones": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "AzureLocation": { - "type": "object", - "properties": { - "displayName": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "AzureRegionalClusterParams": { - "type": "object", - "properties": { - "annotations": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "azureAccountParams": { - "$ref": "#/definitions/AzureAccountParams" - }, - "ceipOptIn": { - "type": "boolean", - "default": true - }, - "clusterName": { - "type": "string" - }, - "controlPlaneFlavor": { - "type": "string" - }, - "controlPlaneMachineType": { - "type": "string" - }, - "controlPlaneSubnet": { - "type": "string" - }, - "controlPlaneSubnetCidr": { - "type": "string" - }, - "enableAuditLogging": { - "type": "boolean" - }, - "frontendPrivateIp": { - "type": "string" - }, - "identityManagement": { - "$ref": "#/definitions/IdentityManagementConfig" - }, - "isPrivateCluster": { - "type": "boolean" - }, - "kubernetesVersion": { - "type": "string" - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "location": { - "type": "string" - }, - "machineHealthCheckEnabled": { - "type": "boolean" - }, - "networking": { - "$ref": "#/definitions/TKGNetwork" - }, - "numOfWorkerNodes": { - "type": "string" - }, - "os": { - "$ref": "#/definitions/AzureVirtualMachine" - }, - "resourceGroup": { - "type": "string" - }, - "sshPublicKey": { - "type": "string" - }, - "vnetCidr": { - "type": "string" - }, - "vnetName": { - "type": "string" - }, - "vnetResourceGroup": { - "type": "string" - }, - "workerMachineType": { - "type": "string" - }, - "workerNodeSubnet": { - "type": "string" - }, - "workerNodeSubnetCidr": { - "type": "string" - } - } - }, - "AzureResourceGroup": { - "type": "object", - "required": [ - "name", - "location" - ], - "properties": { - "id": { - "type": "string" - }, - "location": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "AzureSubnet": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "AzureVirtualMachine": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "osInfo": { - "$ref": "#/definitions/OSInfo" - } - } - }, - "AzureVirtualNetwork": { - "type": "object", - "required": [ - "name", - "location", - "cidrBlock" - ], - "properties": { - "cidrBlock": { - "type": "string" - }, - "id": { - "type": "string" - }, - "location": { - "type": "string" - }, - "name": { - "type": "string" - }, - "subnets": { - "type": "array", - "items": { - "$ref": "#/definitions/AzureSubnet" - } - } - } - }, - "ConfigFile": { - "type": "object", - "properties": { - "filecontents": { - "type": "string" - } - } - }, - "ConfigFileInfo": { - "type": "object", - "properties": { - "path": { - "type": "string" - } - } - }, - "DockerDaemonStatus": { - "type": "object", - "properties": { - "status": { - "type": "boolean" - } - } - }, - "DockerRegionalClusterParams": { - "type": "object", - "properties": { - "annotations": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "ceipOptIn": { - "type": "boolean", - "default": true - }, - "clusterName": { - "type": "string" - }, - "controlPlaneFlavor": { - "type": "string" - }, - "identityManagement": { - "$ref": "#/definitions/IdentityManagementConfig" - }, - "kubernetesVersion": { - "type": "string" - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "machineHealthCheckEnabled": { - "type": "boolean" - }, - "networking": { - "$ref": "#/definitions/TKGNetwork" - }, - "numOfWorkerNodes": { - "type": "string" - } - } - }, - "Error": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - }, - "FeatureMap": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "Features": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/FeatureMap" - } - }, - "HTTPProxyConfiguration": { - "type": "object", - "properties": { - "HTTPProxyPassword": { - "type": "string" - }, - "HTTPProxyURL": { - "type": "string" - }, - "HTTPProxyUsername": { - "type": "string" - }, - "HTTPSProxyPassword": { - "type": "string" - }, - "HTTPSProxyURL": { - "type": "string" - }, - "HTTPSProxyUsername": { - "type": "string" - }, - "enabled": { - "type": "boolean" - }, - "noProxy": { - "type": "string" - } - } - }, - "IdentityManagementConfig": { - "type": "object", - "default": { - "idm_type": "oidc", - "ldap_group_search_name_attr": "cn", - "ldap_group_search_user_attr": "DN", - "ldap_user_search_email_attr": "userPrincipalName", - "ldap_user_search_id_attr": "DN", - "ldap_user_search_username": "userPrincipalName", - "oidc_skip_verify_cert": false - }, - "required": [ - "idm_type" - ], - "properties": { - "idm_type": { - "type": "string", - "enum": [ - "oidc", - "ldap", - "none" - ] - }, - "ldap_bind_dn": { - "type": "string" - }, - "ldap_bind_password": { - "type": "string" - }, - "ldap_group_search_base_dn": { - "type": "string" - }, - "ldap_group_search_filter": { - "type": "string" - }, - "ldap_group_search_group_attr": { - "type": "string" - }, - "ldap_group_search_name_attr": { - "type": "string" - }, - "ldap_group_search_user_attr": { - "type": "string" - }, - "ldap_root_ca": { - "type": "string" - }, - "ldap_url": { - "type": "string" - }, - "ldap_user_search_base_dn": { - "type": "string" - }, - "ldap_user_search_email_attr": { - "type": "string" - }, - "ldap_user_search_filter": { - "type": "string" - }, - "ldap_user_search_id_attr": { - "type": "string" - }, - "ldap_user_search_name_attr": { - "type": "string" - }, - "ldap_user_search_username": { - "type": "string" - }, - "oidc_claim_mappings": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "oidc_client_id": { - "type": "string" - }, - "oidc_client_secret": { - "type": "string" - }, - "oidc_provider_name": { - "type": "string" - }, - "oidc_provider_url": { - "type": "string", - "format": "uri" - }, - "oidc_scope": { - "type": "string" - }, - "oidc_skip_verify_cert": { - "type": "boolean" - } - } - }, - "LdapParams": { - "type": "object", - "default": { - "ldap_group_search_name_attr": "cn", - "ldap_group_search_user_attr": "DN", - "ldap_user_search_email_attr": "userPrincipalName", - "ldap_user_search_id_attr": "DN", - "ldap_user_search_username": "userPrincipalName" - }, - "properties": { - "ldap_bind_dn": { - "type": "string" - }, - "ldap_bind_password": { - "type": "string" - }, - "ldap_group_search_base_dn": { - "type": "string" - }, - "ldap_group_search_filter": { - "type": "string" - }, - "ldap_group_search_group_attr": { - "type": "string" - }, - "ldap_group_search_name_attr": { - "type": "string" - }, - "ldap_group_search_user_attr": { - "type": "string" - }, - "ldap_root_ca": { - "type": "string" - }, - "ldap_test_group": { - "type": "string" - }, - "ldap_test_user": { - "type": "string" - }, - "ldap_url": { - "type": "string" - }, - "ldap_user_search_base_dn": { - "type": "string" - }, - "ldap_user_search_email_attr": { - "type": "string" - }, - "ldap_user_search_filter": { - "type": "string" - }, - "ldap_user_search_id_attr": { - "type": "string" - }, - "ldap_user_search_name_attr": { - "type": "string" - }, - "ldap_user_search_username": { - "type": "string" - } - } - }, - "LdapTestResult": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "desc": { - "type": "string" - } - } - }, - "NodeType": { - "type": "object", - "properties": { - "cpu": { - "type": "integer" - }, - "disk": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "ram": { - "type": "integer" - } - } - }, - "OSInfo": { - "type": "object", - "properties": { - "arch": { - "type": "string" - }, - "name": { - "type": "string" - }, - "version": { - "type": "string" - } - } - }, - "TKGNetwork": { - "type": "object", - "properties": { - "clusterDNSName": { - "type": "string" - }, - "clusterNodeCIDR": { - "type": "string" - }, - "clusterPodCIDR": { - "type": "string" - }, - "clusterServiceCIDR": { - "type": "string" - }, - "cniType": { - "type": "string" - }, - "httpProxyConfiguration": { - "$ref": "#/definitions/HTTPProxyConfiguration" - }, - "networkName": { - "type": "string" - } - } - }, - "VSphereAvailabilityZone": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereCredentials": { - "type": "object", - "properties": { - "host": { - "type": "string" - }, - "insecure": { - "type": "boolean", - "default": false - }, - "password": { - "type": "string" - }, - "thumbprint": { - "type": "string" - }, - "username": { - "type": "string" - } - } - }, - "VSphereDatacenter": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereDatastore": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereFolder": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereManagementObject": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "parentMoid": { - "type": "string" - }, - "path": { - "type": "string" - }, - "resourceType": { - "type": "string", - "enum": [ - "datacenter", - "cluster", - "hostgroup", - "folder", - "respool", - "vm", - "datastore", - "host", - "network" - ] - } - } - }, - "VSphereNetwork": { - "type": "object", - "properties": { - "displayName": { - "type": "string" - }, - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereRegion": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "zones": { - "type": "array", - "items": { - "$ref": "#/definitions/VSphereAvailabilityZone" - } - } - } - }, - "VSphereResourcePool": { - "type": "object", - "properties": { - "moid": { - "type": "string" - }, - "name": { - "type": "string" - } - } - }, - "VSphereThumbprint": { - "type": "object", - "properties": { - "insecure": { - "type": "boolean", - "default": false - }, - "thumbprint": { - "type": "string" - } - } - }, - "VSphereVirtualMachine": { - "type": "object", - "required": [ - "isTemplate" - ], - "properties": { - "isTemplate": { - "type": "boolean" - }, - "k8sVersion": { - "type": "string" - }, - "moid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "osInfo": { - "$ref": "#/definitions/OSInfo" - } - } - }, - "VsphereRegionalClusterParams": { - "type": "object", - "properties": { - "annotations": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "aviConfig": { - "$ref": "#/definitions/AviConfig" - }, - "ceipOptIn": { - "type": "boolean", - "default": true - }, - "clusterName": { - "type": "string" - }, - "controlPlaneEndpoint": { - "type": "string" - }, - "controlPlaneFlavor": { - "type": "string" - }, - "controlPlaneNodeType": { - "type": "string" - }, - "datacenter": { - "type": "string" - }, - "datastore": { - "type": "string" - }, - "enableAuditLogging": { - "type": "boolean" - }, - "folder": { - "type": "string" - }, - "identityManagement": { - "$ref": "#/definitions/IdentityManagementConfig" - }, - "ipFamily": { - "type": "string" - }, - "kubernetesVersion": { - "type": "string" - }, - "labels": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "machineHealthCheckEnabled": { - "type": "boolean" - }, - "networking": { - "$ref": "#/definitions/TKGNetwork" - }, - "numOfWorkerNode": { - "type": "integer" - }, - "os": { - "$ref": "#/definitions/VSphereVirtualMachine" - }, - "resourcePool": { - "type": "string" - }, - "ssh_key": { - "type": "string" - }, - "vsphereCredentials": { - "$ref": "#/definitions/VSphereCredentials" - }, - "workerNodeType": { - "type": "string" - } - } - }, - "providerInfo": { - "type": "object", - "properties": { - "provider": { - "type": "string" - }, - "tkrVersion": { - "type": "string" - } - } - }, - "vpc": { - "type": "object", - "properties": { - "cidr": { - "type": "string" - }, - "id": { - "type": "string" - } - } - }, - "vsphereInfo": { - "type": "object", - "properties": { - "hasPacific": { - "type": "string" - }, - "version": { - "type": "string" - } - } - } - } -}`)) -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_clouds.go b/tkg/web/server/restapi/operations/avi/get_avi_clouds.go deleted file mode 100644 index 5a2c29b94e..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_clouds.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAviCloudsHandlerFunc turns a function with the right signature into a get avi clouds handler -type GetAviCloudsHandlerFunc func(GetAviCloudsParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAviCloudsHandlerFunc) Handle(params GetAviCloudsParams) middleware.Responder { - return fn(params) -} - -// GetAviCloudsHandler interface for that can handle valid get avi clouds params -type GetAviCloudsHandler interface { - Handle(GetAviCloudsParams) middleware.Responder -} - -// NewGetAviClouds creates a new http.Handler for the get avi clouds operation -func NewGetAviClouds(ctx *middleware.Context, handler GetAviCloudsHandler) *GetAviClouds { - return &GetAviClouds{Context: ctx, Handler: handler} -} - -/* -GetAviClouds swagger:route GET /api/avi/clouds avi getAviClouds - -Retrieve Avi load balancer clouds -*/ -type GetAviClouds struct { - Context *middleware.Context - Handler GetAviCloudsHandler -} - -func (o *GetAviClouds) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAviCloudsParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_clouds_parameters.go b/tkg/web/server/restapi/operations/avi/get_avi_clouds_parameters.go deleted file mode 100644 index 24c436198a..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_clouds_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetAviCloudsParams creates a new GetAviCloudsParams object -// no default values defined in spec. -func NewGetAviCloudsParams() GetAviCloudsParams { - - return GetAviCloudsParams{} -} - -// GetAviCloudsParams contains all the bound params for the get avi clouds operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAviClouds -type GetAviCloudsParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAviCloudsParams() beforehand. -func (o *GetAviCloudsParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_clouds_responses.go b/tkg/web/server/restapi/operations/avi/get_avi_clouds_responses.go deleted file mode 100644 index 9b1fdb8698..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_clouds_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAviCloudsOKCode is the HTTP code returned for type GetAviCloudsOK -const GetAviCloudsOKCode int = 200 - -/* -GetAviCloudsOK Successful retrieval of Avi load balancer clouds - -swagger:response getAviCloudsOK -*/ -type GetAviCloudsOK struct { - - /* - In: Body - */ - Payload []*models.AviCloud `json:"body,omitempty"` -} - -// NewGetAviCloudsOK creates GetAviCloudsOK with default headers values -func NewGetAviCloudsOK() *GetAviCloudsOK { - - return &GetAviCloudsOK{} -} - -// WithPayload adds the payload to the get avi clouds o k response -func (o *GetAviCloudsOK) WithPayload(payload []*models.AviCloud) *GetAviCloudsOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi clouds o k response -func (o *GetAviCloudsOK) SetPayload(payload []*models.AviCloud) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviCloudsOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.AviCloud, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAviCloudsBadRequestCode is the HTTP code returned for type GetAviCloudsBadRequest -const GetAviCloudsBadRequestCode int = 400 - -/* -GetAviCloudsBadRequest Bad request - -swagger:response getAviCloudsBadRequest -*/ -type GetAviCloudsBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAviCloudsBadRequest creates GetAviCloudsBadRequest with default headers values -func NewGetAviCloudsBadRequest() *GetAviCloudsBadRequest { - - return &GetAviCloudsBadRequest{} -} - -// WithPayload adds the payload to the get avi clouds bad request response -func (o *GetAviCloudsBadRequest) WithPayload(payload *models.Error) *GetAviCloudsBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi clouds bad request response -func (o *GetAviCloudsBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviCloudsBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAviCloudsUnauthorizedCode is the HTTP code returned for type GetAviCloudsUnauthorized -const GetAviCloudsUnauthorizedCode int = 401 - -/* -GetAviCloudsUnauthorized Incorrect credentials - -swagger:response getAviCloudsUnauthorized -*/ -type GetAviCloudsUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAviCloudsUnauthorized creates GetAviCloudsUnauthorized with default headers values -func NewGetAviCloudsUnauthorized() *GetAviCloudsUnauthorized { - - return &GetAviCloudsUnauthorized{} -} - -// WithPayload adds the payload to the get avi clouds unauthorized response -func (o *GetAviCloudsUnauthorized) WithPayload(payload *models.Error) *GetAviCloudsUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi clouds unauthorized response -func (o *GetAviCloudsUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviCloudsUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAviCloudsInternalServerErrorCode is the HTTP code returned for type GetAviCloudsInternalServerError -const GetAviCloudsInternalServerErrorCode int = 500 - -/* -GetAviCloudsInternalServerError Internal server error - -swagger:response getAviCloudsInternalServerError -*/ -type GetAviCloudsInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAviCloudsInternalServerError creates GetAviCloudsInternalServerError with default headers values -func NewGetAviCloudsInternalServerError() *GetAviCloudsInternalServerError { - - return &GetAviCloudsInternalServerError{} -} - -// WithPayload adds the payload to the get avi clouds internal server error response -func (o *GetAviCloudsInternalServerError) WithPayload(payload *models.Error) *GetAviCloudsInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi clouds internal server error response -func (o *GetAviCloudsInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviCloudsInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_clouds_urlbuilder.go b/tkg/web/server/restapi/operations/avi/get_avi_clouds_urlbuilder.go deleted file mode 100644 index ed35feaf24..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_clouds_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAviCloudsURL generates an URL for the get avi clouds operation -type GetAviCloudsURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAviCloudsURL) WithBasePath(bp string) *GetAviCloudsURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAviCloudsURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAviCloudsURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/avi/clouds" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAviCloudsURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAviCloudsURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAviCloudsURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAviCloudsURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAviCloudsURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAviCloudsURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups.go b/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups.go deleted file mode 100644 index 23fc748666..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAviServiceEngineGroupsHandlerFunc turns a function with the right signature into a get avi service engine groups handler -type GetAviServiceEngineGroupsHandlerFunc func(GetAviServiceEngineGroupsParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAviServiceEngineGroupsHandlerFunc) Handle(params GetAviServiceEngineGroupsParams) middleware.Responder { - return fn(params) -} - -// GetAviServiceEngineGroupsHandler interface for that can handle valid get avi service engine groups params -type GetAviServiceEngineGroupsHandler interface { - Handle(GetAviServiceEngineGroupsParams) middleware.Responder -} - -// NewGetAviServiceEngineGroups creates a new http.Handler for the get avi service engine groups operation -func NewGetAviServiceEngineGroups(ctx *middleware.Context, handler GetAviServiceEngineGroupsHandler) *GetAviServiceEngineGroups { - return &GetAviServiceEngineGroups{Context: ctx, Handler: handler} -} - -/* -GetAviServiceEngineGroups swagger:route GET /api/avi/serviceenginegroups avi getAviServiceEngineGroups - -Retrieve Avi load balancer service engine groups -*/ -type GetAviServiceEngineGroups struct { - Context *middleware.Context - Handler GetAviServiceEngineGroupsHandler -} - -func (o *GetAviServiceEngineGroups) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAviServiceEngineGroupsParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups_parameters.go b/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups_parameters.go deleted file mode 100644 index e700a12ea0..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetAviServiceEngineGroupsParams creates a new GetAviServiceEngineGroupsParams object -// no default values defined in spec. -func NewGetAviServiceEngineGroupsParams() GetAviServiceEngineGroupsParams { - - return GetAviServiceEngineGroupsParams{} -} - -// GetAviServiceEngineGroupsParams contains all the bound params for the get avi service engine groups operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAviServiceEngineGroups -type GetAviServiceEngineGroupsParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAviServiceEngineGroupsParams() beforehand. -func (o *GetAviServiceEngineGroupsParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups_responses.go b/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups_responses.go deleted file mode 100644 index c87152f996..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAviServiceEngineGroupsOKCode is the HTTP code returned for type GetAviServiceEngineGroupsOK -const GetAviServiceEngineGroupsOKCode int = 200 - -/* -GetAviServiceEngineGroupsOK Successful retrieval of Avi load balancer service engine groups - -swagger:response getAviServiceEngineGroupsOK -*/ -type GetAviServiceEngineGroupsOK struct { - - /* - In: Body - */ - Payload []*models.AviServiceEngineGroup `json:"body,omitempty"` -} - -// NewGetAviServiceEngineGroupsOK creates GetAviServiceEngineGroupsOK with default headers values -func NewGetAviServiceEngineGroupsOK() *GetAviServiceEngineGroupsOK { - - return &GetAviServiceEngineGroupsOK{} -} - -// WithPayload adds the payload to the get avi service engine groups o k response -func (o *GetAviServiceEngineGroupsOK) WithPayload(payload []*models.AviServiceEngineGroup) *GetAviServiceEngineGroupsOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi service engine groups o k response -func (o *GetAviServiceEngineGroupsOK) SetPayload(payload []*models.AviServiceEngineGroup) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviServiceEngineGroupsOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.AviServiceEngineGroup, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAviServiceEngineGroupsBadRequestCode is the HTTP code returned for type GetAviServiceEngineGroupsBadRequest -const GetAviServiceEngineGroupsBadRequestCode int = 400 - -/* -GetAviServiceEngineGroupsBadRequest Bad request - -swagger:response getAviServiceEngineGroupsBadRequest -*/ -type GetAviServiceEngineGroupsBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAviServiceEngineGroupsBadRequest creates GetAviServiceEngineGroupsBadRequest with default headers values -func NewGetAviServiceEngineGroupsBadRequest() *GetAviServiceEngineGroupsBadRequest { - - return &GetAviServiceEngineGroupsBadRequest{} -} - -// WithPayload adds the payload to the get avi service engine groups bad request response -func (o *GetAviServiceEngineGroupsBadRequest) WithPayload(payload *models.Error) *GetAviServiceEngineGroupsBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi service engine groups bad request response -func (o *GetAviServiceEngineGroupsBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviServiceEngineGroupsBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAviServiceEngineGroupsUnauthorizedCode is the HTTP code returned for type GetAviServiceEngineGroupsUnauthorized -const GetAviServiceEngineGroupsUnauthorizedCode int = 401 - -/* -GetAviServiceEngineGroupsUnauthorized Incorrect credentials - -swagger:response getAviServiceEngineGroupsUnauthorized -*/ -type GetAviServiceEngineGroupsUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAviServiceEngineGroupsUnauthorized creates GetAviServiceEngineGroupsUnauthorized with default headers values -func NewGetAviServiceEngineGroupsUnauthorized() *GetAviServiceEngineGroupsUnauthorized { - - return &GetAviServiceEngineGroupsUnauthorized{} -} - -// WithPayload adds the payload to the get avi service engine groups unauthorized response -func (o *GetAviServiceEngineGroupsUnauthorized) WithPayload(payload *models.Error) *GetAviServiceEngineGroupsUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi service engine groups unauthorized response -func (o *GetAviServiceEngineGroupsUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviServiceEngineGroupsUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAviServiceEngineGroupsInternalServerErrorCode is the HTTP code returned for type GetAviServiceEngineGroupsInternalServerError -const GetAviServiceEngineGroupsInternalServerErrorCode int = 500 - -/* -GetAviServiceEngineGroupsInternalServerError Internal server error - -swagger:response getAviServiceEngineGroupsInternalServerError -*/ -type GetAviServiceEngineGroupsInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAviServiceEngineGroupsInternalServerError creates GetAviServiceEngineGroupsInternalServerError with default headers values -func NewGetAviServiceEngineGroupsInternalServerError() *GetAviServiceEngineGroupsInternalServerError { - - return &GetAviServiceEngineGroupsInternalServerError{} -} - -// WithPayload adds the payload to the get avi service engine groups internal server error response -func (o *GetAviServiceEngineGroupsInternalServerError) WithPayload(payload *models.Error) *GetAviServiceEngineGroupsInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi service engine groups internal server error response -func (o *GetAviServiceEngineGroupsInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviServiceEngineGroupsInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups_urlbuilder.go b/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups_urlbuilder.go deleted file mode 100644 index 024c703adb..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_service_engine_groups_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAviServiceEngineGroupsURL generates an URL for the get avi service engine groups operation -type GetAviServiceEngineGroupsURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAviServiceEngineGroupsURL) WithBasePath(bp string) *GetAviServiceEngineGroupsURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAviServiceEngineGroupsURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAviServiceEngineGroupsURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/avi/serviceenginegroups" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAviServiceEngineGroupsURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAviServiceEngineGroupsURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAviServiceEngineGroupsURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAviServiceEngineGroupsURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAviServiceEngineGroupsURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAviServiceEngineGroupsURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_vip_networks.go b/tkg/web/server/restapi/operations/avi/get_avi_vip_networks.go deleted file mode 100644 index 09a478dbad..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_vip_networks.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAviVipNetworksHandlerFunc turns a function with the right signature into a get avi vip networks handler -type GetAviVipNetworksHandlerFunc func(GetAviVipNetworksParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAviVipNetworksHandlerFunc) Handle(params GetAviVipNetworksParams) middleware.Responder { - return fn(params) -} - -// GetAviVipNetworksHandler interface for that can handle valid get avi vip networks params -type GetAviVipNetworksHandler interface { - Handle(GetAviVipNetworksParams) middleware.Responder -} - -// NewGetAviVipNetworks creates a new http.Handler for the get avi vip networks operation -func NewGetAviVipNetworks(ctx *middleware.Context, handler GetAviVipNetworksHandler) *GetAviVipNetworks { - return &GetAviVipNetworks{Context: ctx, Handler: handler} -} - -/* -GetAviVipNetworks swagger:route GET /api/avi/vipnetworks avi getAviVipNetworks - -Retrieve all Avi networks -*/ -type GetAviVipNetworks struct { - Context *middleware.Context - Handler GetAviVipNetworksHandler -} - -func (o *GetAviVipNetworks) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAviVipNetworksParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_vip_networks_parameters.go b/tkg/web/server/restapi/operations/avi/get_avi_vip_networks_parameters.go deleted file mode 100644 index f8fa0ea13f..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_vip_networks_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetAviVipNetworksParams creates a new GetAviVipNetworksParams object -// no default values defined in spec. -func NewGetAviVipNetworksParams() GetAviVipNetworksParams { - - return GetAviVipNetworksParams{} -} - -// GetAviVipNetworksParams contains all the bound params for the get avi vip networks operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAviVipNetworks -type GetAviVipNetworksParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAviVipNetworksParams() beforehand. -func (o *GetAviVipNetworksParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_vip_networks_responses.go b/tkg/web/server/restapi/operations/avi/get_avi_vip_networks_responses.go deleted file mode 100644 index 78ff664f3c..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_vip_networks_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAviVipNetworksOKCode is the HTTP code returned for type GetAviVipNetworksOK -const GetAviVipNetworksOKCode int = 200 - -/* -GetAviVipNetworksOK Successful retrieval of Avi load balancer service engine groups - -swagger:response getAviVipNetworksOK -*/ -type GetAviVipNetworksOK struct { - - /* - In: Body - */ - Payload []*models.AviVipNetwork `json:"body,omitempty"` -} - -// NewGetAviVipNetworksOK creates GetAviVipNetworksOK with default headers values -func NewGetAviVipNetworksOK() *GetAviVipNetworksOK { - - return &GetAviVipNetworksOK{} -} - -// WithPayload adds the payload to the get avi vip networks o k response -func (o *GetAviVipNetworksOK) WithPayload(payload []*models.AviVipNetwork) *GetAviVipNetworksOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi vip networks o k response -func (o *GetAviVipNetworksOK) SetPayload(payload []*models.AviVipNetwork) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviVipNetworksOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.AviVipNetwork, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAviVipNetworksBadRequestCode is the HTTP code returned for type GetAviVipNetworksBadRequest -const GetAviVipNetworksBadRequestCode int = 400 - -/* -GetAviVipNetworksBadRequest Bad request - -swagger:response getAviVipNetworksBadRequest -*/ -type GetAviVipNetworksBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAviVipNetworksBadRequest creates GetAviVipNetworksBadRequest with default headers values -func NewGetAviVipNetworksBadRequest() *GetAviVipNetworksBadRequest { - - return &GetAviVipNetworksBadRequest{} -} - -// WithPayload adds the payload to the get avi vip networks bad request response -func (o *GetAviVipNetworksBadRequest) WithPayload(payload *models.Error) *GetAviVipNetworksBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi vip networks bad request response -func (o *GetAviVipNetworksBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviVipNetworksBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAviVipNetworksUnauthorizedCode is the HTTP code returned for type GetAviVipNetworksUnauthorized -const GetAviVipNetworksUnauthorizedCode int = 401 - -/* -GetAviVipNetworksUnauthorized Incorrect credentials - -swagger:response getAviVipNetworksUnauthorized -*/ -type GetAviVipNetworksUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAviVipNetworksUnauthorized creates GetAviVipNetworksUnauthorized with default headers values -func NewGetAviVipNetworksUnauthorized() *GetAviVipNetworksUnauthorized { - - return &GetAviVipNetworksUnauthorized{} -} - -// WithPayload adds the payload to the get avi vip networks unauthorized response -func (o *GetAviVipNetworksUnauthorized) WithPayload(payload *models.Error) *GetAviVipNetworksUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi vip networks unauthorized response -func (o *GetAviVipNetworksUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviVipNetworksUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAviVipNetworksInternalServerErrorCode is the HTTP code returned for type GetAviVipNetworksInternalServerError -const GetAviVipNetworksInternalServerErrorCode int = 500 - -/* -GetAviVipNetworksInternalServerError Internal server error - -swagger:response getAviVipNetworksInternalServerError -*/ -type GetAviVipNetworksInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAviVipNetworksInternalServerError creates GetAviVipNetworksInternalServerError with default headers values -func NewGetAviVipNetworksInternalServerError() *GetAviVipNetworksInternalServerError { - - return &GetAviVipNetworksInternalServerError{} -} - -// WithPayload adds the payload to the get avi vip networks internal server error response -func (o *GetAviVipNetworksInternalServerError) WithPayload(payload *models.Error) *GetAviVipNetworksInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get avi vip networks internal server error response -func (o *GetAviVipNetworksInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAviVipNetworksInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/avi/get_avi_vip_networks_urlbuilder.go b/tkg/web/server/restapi/operations/avi/get_avi_vip_networks_urlbuilder.go deleted file mode 100644 index 85a29c424f..0000000000 --- a/tkg/web/server/restapi/operations/avi/get_avi_vip_networks_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAviVipNetworksURL generates an URL for the get avi vip networks operation -type GetAviVipNetworksURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAviVipNetworksURL) WithBasePath(bp string) *GetAviVipNetworksURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAviVipNetworksURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAviVipNetworksURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/avi/vipnetworks" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAviVipNetworksURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAviVipNetworksURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAviVipNetworksURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAviVipNetworksURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAviVipNetworksURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAviVipNetworksURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/avi/verify_account.go b/tkg/web/server/restapi/operations/avi/verify_account.go deleted file mode 100644 index 42ea9ec5cd..0000000000 --- a/tkg/web/server/restapi/operations/avi/verify_account.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// VerifyAccountHandlerFunc turns a function with the right signature into a verify account handler -type VerifyAccountHandlerFunc func(VerifyAccountParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn VerifyAccountHandlerFunc) Handle(params VerifyAccountParams) middleware.Responder { - return fn(params) -} - -// VerifyAccountHandler interface for that can handle valid verify account params -type VerifyAccountHandler interface { - Handle(VerifyAccountParams) middleware.Responder -} - -// NewVerifyAccount creates a new http.Handler for the verify account operation -func NewVerifyAccount(ctx *middleware.Context, handler VerifyAccountHandler) *VerifyAccount { - return &VerifyAccount{Context: ctx, Handler: handler} -} - -/* -VerifyAccount swagger:route POST /api/avi avi verifyAccount - -Validate Avi controller credentials -*/ -type VerifyAccount struct { - Context *middleware.Context - Handler VerifyAccountHandler -} - -func (o *VerifyAccount) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewVerifyAccountParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/avi/verify_account_parameters.go b/tkg/web/server/restapi/operations/avi/verify_account_parameters.go deleted file mode 100644 index b9c0c06e43..0000000000 --- a/tkg/web/server/restapi/operations/avi/verify_account_parameters.go +++ /dev/null @@ -1,69 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewVerifyAccountParams creates a new VerifyAccountParams object -// no default values defined in spec. -func NewVerifyAccountParams() VerifyAccountParams { - - return VerifyAccountParams{} -} - -// VerifyAccountParams contains all the bound params for the verify account operation -// typically these are obtained from a http.Request -// -// swagger:parameters verifyAccount -type VerifyAccountParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*Avi controller credentials - In: body - */ - Credentials *models.AviControllerParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewVerifyAccountParams() beforehand. -func (o *VerifyAccountParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.AviControllerParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - res = append(res, errors.NewParseError("credentials", "body", "", err)) - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Credentials = &body - } - } - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/avi/verify_account_responses.go b/tkg/web/server/restapi/operations/avi/verify_account_responses.go deleted file mode 100644 index b05dcf0a20..0000000000 --- a/tkg/web/server/restapi/operations/avi/verify_account_responses.go +++ /dev/null @@ -1,174 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyAccountCreatedCode is the HTTP code returned for type VerifyAccountCreated -const VerifyAccountCreatedCode int = 201 - -/* -VerifyAccountCreated Verified AVI credentials successfully - -swagger:response verifyAccountCreated -*/ -type VerifyAccountCreated struct { -} - -// NewVerifyAccountCreated creates VerifyAccountCreated with default headers values -func NewVerifyAccountCreated() *VerifyAccountCreated { - - return &VerifyAccountCreated{} -} - -// WriteResponse to the client -func (o *VerifyAccountCreated) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.Header().Del(runtime.HeaderContentType) //Remove Content-Type on empty responses - - rw.WriteHeader(201) -} - -// VerifyAccountBadRequestCode is the HTTP code returned for type VerifyAccountBadRequest -const VerifyAccountBadRequestCode int = 400 - -/* -VerifyAccountBadRequest Bad request - -swagger:response verifyAccountBadRequest -*/ -type VerifyAccountBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyAccountBadRequest creates VerifyAccountBadRequest with default headers values -func NewVerifyAccountBadRequest() *VerifyAccountBadRequest { - - return &VerifyAccountBadRequest{} -} - -// WithPayload adds the payload to the verify account bad request response -func (o *VerifyAccountBadRequest) WithPayload(payload *models.Error) *VerifyAccountBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify account bad request response -func (o *VerifyAccountBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyAccountBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyAccountUnauthorizedCode is the HTTP code returned for type VerifyAccountUnauthorized -const VerifyAccountUnauthorizedCode int = 401 - -/* -VerifyAccountUnauthorized Incorrect credentials - -swagger:response verifyAccountUnauthorized -*/ -type VerifyAccountUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyAccountUnauthorized creates VerifyAccountUnauthorized with default headers values -func NewVerifyAccountUnauthorized() *VerifyAccountUnauthorized { - - return &VerifyAccountUnauthorized{} -} - -// WithPayload adds the payload to the verify account unauthorized response -func (o *VerifyAccountUnauthorized) WithPayload(payload *models.Error) *VerifyAccountUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify account unauthorized response -func (o *VerifyAccountUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyAccountUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyAccountInternalServerErrorCode is the HTTP code returned for type VerifyAccountInternalServerError -const VerifyAccountInternalServerErrorCode int = 500 - -/* -VerifyAccountInternalServerError Internal server error - -swagger:response verifyAccountInternalServerError -*/ -type VerifyAccountInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyAccountInternalServerError creates VerifyAccountInternalServerError with default headers values -func NewVerifyAccountInternalServerError() *VerifyAccountInternalServerError { - - return &VerifyAccountInternalServerError{} -} - -// WithPayload adds the payload to the verify account internal server error response -func (o *VerifyAccountInternalServerError) WithPayload(payload *models.Error) *VerifyAccountInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify account internal server error response -func (o *VerifyAccountInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyAccountInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/avi/verify_account_urlbuilder.go b/tkg/web/server/restapi/operations/avi/verify_account_urlbuilder.go deleted file mode 100644 index 811d92abd6..0000000000 --- a/tkg/web/server/restapi/operations/avi/verify_account_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package avi - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// VerifyAccountURL generates an URL for the verify account operation -type VerifyAccountURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyAccountURL) WithBasePath(bp string) *VerifyAccountURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyAccountURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *VerifyAccountURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/avi" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *VerifyAccountURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *VerifyAccountURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *VerifyAccountURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on VerifyAccountURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on VerifyAccountURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *VerifyAccountURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s.go b/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s.go deleted file mode 100644 index 1cb1cadf9c..0000000000 --- a/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ApplyTKGConfigForAWSHandlerFunc turns a function with the right signature into a apply t k g config for a w s handler -type ApplyTKGConfigForAWSHandlerFunc func(ApplyTKGConfigForAWSParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ApplyTKGConfigForAWSHandlerFunc) Handle(params ApplyTKGConfigForAWSParams) middleware.Responder { - return fn(params) -} - -// ApplyTKGConfigForAWSHandler interface for that can handle valid apply t k g config for a w s params -type ApplyTKGConfigForAWSHandler interface { - Handle(ApplyTKGConfigForAWSParams) middleware.Responder -} - -// NewApplyTKGConfigForAWS creates a new http.Handler for the apply t k g config for a w s operation -func NewApplyTKGConfigForAWS(ctx *middleware.Context, handler ApplyTKGConfigForAWSHandler) *ApplyTKGConfigForAWS { - return &ApplyTKGConfigForAWS{Context: ctx, Handler: handler} -} - -/* -ApplyTKGConfigForAWS swagger:route POST /api/providers/aws/tkgconfig aws applyTKGConfigForAWS - -Apply the changes to TKG configuration file for AWS" -*/ -type ApplyTKGConfigForAWS struct { - Context *middleware.Context - Handler ApplyTKGConfigForAWSHandler -} - -func (o *ApplyTKGConfigForAWS) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewApplyTKGConfigForAWSParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s_parameters.go b/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s_parameters.go deleted file mode 100644 index 9432519f6b..0000000000 --- a/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewApplyTKGConfigForAWSParams creates a new ApplyTKGConfigForAWSParams object -// no default values defined in spec. -func NewApplyTKGConfigForAWSParams() ApplyTKGConfigForAWSParams { - - return ApplyTKGConfigForAWSParams{} -} - -// ApplyTKGConfigForAWSParams contains all the bound params for the apply t k g config for a w s operation -// typically these are obtained from a http.Request -// -// swagger:parameters applyTKGConfigForAWS -type ApplyTKGConfigForAWSParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*parameters to apply changes to TKG configuration file for AWS - Required: true - In: body - */ - Params *models.AWSRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewApplyTKGConfigForAWSParams() beforehand. -func (o *ApplyTKGConfigForAWSParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.AWSRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s_responses.go b/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s_responses.go deleted file mode 100644 index e039806b0d..0000000000 --- a/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ApplyTKGConfigForAWSOKCode is the HTTP code returned for type ApplyTKGConfigForAWSOK -const ApplyTKGConfigForAWSOKCode int = 200 - -/* -ApplyTKGConfigForAWSOK Apply change to TKG configuration successfully - -swagger:response applyTKGConfigForAWSOK -*/ -type ApplyTKGConfigForAWSOK struct { - - /* - In: Body - */ - Payload *models.ConfigFileInfo `json:"body,omitempty"` -} - -// NewApplyTKGConfigForAWSOK creates ApplyTKGConfigForAWSOK with default headers values -func NewApplyTKGConfigForAWSOK() *ApplyTKGConfigForAWSOK { - - return &ApplyTKGConfigForAWSOK{} -} - -// WithPayload adds the payload to the apply t k g config for a w s o k response -func (o *ApplyTKGConfigForAWSOK) WithPayload(payload *models.ConfigFileInfo) *ApplyTKGConfigForAWSOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for a w s o k response -func (o *ApplyTKGConfigForAWSOK) SetPayload(payload *models.ConfigFileInfo) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForAWSOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ApplyTKGConfigForAWSBadRequestCode is the HTTP code returned for type ApplyTKGConfigForAWSBadRequest -const ApplyTKGConfigForAWSBadRequestCode int = 400 - -/* -ApplyTKGConfigForAWSBadRequest Bad request - -swagger:response applyTKGConfigForAWSBadRequest -*/ -type ApplyTKGConfigForAWSBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewApplyTKGConfigForAWSBadRequest creates ApplyTKGConfigForAWSBadRequest with default headers values -func NewApplyTKGConfigForAWSBadRequest() *ApplyTKGConfigForAWSBadRequest { - - return &ApplyTKGConfigForAWSBadRequest{} -} - -// WithPayload adds the payload to the apply t k g config for a w s bad request response -func (o *ApplyTKGConfigForAWSBadRequest) WithPayload(payload *models.Error) *ApplyTKGConfigForAWSBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for a w s bad request response -func (o *ApplyTKGConfigForAWSBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForAWSBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ApplyTKGConfigForAWSUnauthorizedCode is the HTTP code returned for type ApplyTKGConfigForAWSUnauthorized -const ApplyTKGConfigForAWSUnauthorizedCode int = 401 - -/* -ApplyTKGConfigForAWSUnauthorized Incorrect credentials - -swagger:response applyTKGConfigForAWSUnauthorized -*/ -type ApplyTKGConfigForAWSUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewApplyTKGConfigForAWSUnauthorized creates ApplyTKGConfigForAWSUnauthorized with default headers values -func NewApplyTKGConfigForAWSUnauthorized() *ApplyTKGConfigForAWSUnauthorized { - - return &ApplyTKGConfigForAWSUnauthorized{} -} - -// WithPayload adds the payload to the apply t k g config for a w s unauthorized response -func (o *ApplyTKGConfigForAWSUnauthorized) WithPayload(payload *models.Error) *ApplyTKGConfigForAWSUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for a w s unauthorized response -func (o *ApplyTKGConfigForAWSUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForAWSUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ApplyTKGConfigForAWSInternalServerErrorCode is the HTTP code returned for type ApplyTKGConfigForAWSInternalServerError -const ApplyTKGConfigForAWSInternalServerErrorCode int = 500 - -/* -ApplyTKGConfigForAWSInternalServerError Internal server error - -swagger:response applyTKGConfigForAWSInternalServerError -*/ -type ApplyTKGConfigForAWSInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewApplyTKGConfigForAWSInternalServerError creates ApplyTKGConfigForAWSInternalServerError with default headers values -func NewApplyTKGConfigForAWSInternalServerError() *ApplyTKGConfigForAWSInternalServerError { - - return &ApplyTKGConfigForAWSInternalServerError{} -} - -// WithPayload adds the payload to the apply t k g config for a w s internal server error response -func (o *ApplyTKGConfigForAWSInternalServerError) WithPayload(payload *models.Error) *ApplyTKGConfigForAWSInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for a w s internal server error response -func (o *ApplyTKGConfigForAWSInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForAWSInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s_urlbuilder.go b/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s_urlbuilder.go deleted file mode 100644 index 128336e011..0000000000 --- a/tkg/web/server/restapi/operations/aws/apply_t_k_g_config_for_a_w_s_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ApplyTKGConfigForAWSURL generates an URL for the apply t k g config for a w s operation -type ApplyTKGConfigForAWSURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ApplyTKGConfigForAWSURL) WithBasePath(bp string) *ApplyTKGConfigForAWSURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ApplyTKGConfigForAWSURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ApplyTKGConfigForAWSURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws/tkgconfig" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ApplyTKGConfigForAWSURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ApplyTKGConfigForAWSURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ApplyTKGConfigForAWSURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ApplyTKGConfigForAWSURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ApplyTKGConfigForAWSURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ApplyTKGConfigForAWSURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster.go b/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster.go deleted file mode 100644 index 1d56a48b81..0000000000 --- a/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// CreateAWSRegionalClusterHandlerFunc turns a function with the right signature into a create a w s regional cluster handler -type CreateAWSRegionalClusterHandlerFunc func(CreateAWSRegionalClusterParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn CreateAWSRegionalClusterHandlerFunc) Handle(params CreateAWSRegionalClusterParams) middleware.Responder { - return fn(params) -} - -// CreateAWSRegionalClusterHandler interface for that can handle valid create a w s regional cluster params -type CreateAWSRegionalClusterHandler interface { - Handle(CreateAWSRegionalClusterParams) middleware.Responder -} - -// NewCreateAWSRegionalCluster creates a new http.Handler for the create a w s regional cluster operation -func NewCreateAWSRegionalCluster(ctx *middleware.Context, handler CreateAWSRegionalClusterHandler) *CreateAWSRegionalCluster { - return &CreateAWSRegionalCluster{Context: ctx, Handler: handler} -} - -/* -CreateAWSRegionalCluster swagger:route POST /api/providers/aws/create aws createAWSRegionalCluster - -Create AWS regional cluster -*/ -type CreateAWSRegionalCluster struct { - Context *middleware.Context - Handler CreateAWSRegionalClusterHandler -} - -func (o *CreateAWSRegionalCluster) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewCreateAWSRegionalClusterParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster_parameters.go b/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster_parameters.go deleted file mode 100644 index e82b63007d..0000000000 --- a/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateAWSRegionalClusterParams creates a new CreateAWSRegionalClusterParams object -// no default values defined in spec. -func NewCreateAWSRegionalClusterParams() CreateAWSRegionalClusterParams { - - return CreateAWSRegionalClusterParams{} -} - -// CreateAWSRegionalClusterParams contains all the bound params for the create a w s regional cluster operation -// typically these are obtained from a http.Request -// -// swagger:parameters createAWSRegionalCluster -type CreateAWSRegionalClusterParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*parameters to create a regional cluster - Required: true - In: body - */ - Params *models.AWSRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewCreateAWSRegionalClusterParams() beforehand. -func (o *CreateAWSRegionalClusterParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.AWSRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster_responses.go b/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster_responses.go deleted file mode 100644 index 81ae7726d7..0000000000 --- a/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster_responses.go +++ /dev/null @@ -1,192 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateAWSRegionalClusterOKCode is the HTTP code returned for type CreateAWSRegionalClusterOK -const CreateAWSRegionalClusterOKCode int = 200 - -/* -CreateAWSRegionalClusterOK Creating regional cluster started successfully - -swagger:response createAWSRegionalClusterOK -*/ -type CreateAWSRegionalClusterOK struct { - - /* - In: Body - */ - Payload string `json:"body,omitempty"` -} - -// NewCreateAWSRegionalClusterOK creates CreateAWSRegionalClusterOK with default headers values -func NewCreateAWSRegionalClusterOK() *CreateAWSRegionalClusterOK { - - return &CreateAWSRegionalClusterOK{} -} - -// WithPayload adds the payload to the create a w s regional cluster o k response -func (o *CreateAWSRegionalClusterOK) WithPayload(payload string) *CreateAWSRegionalClusterOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create a w s regional cluster o k response -func (o *CreateAWSRegionalClusterOK) SetPayload(payload string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAWSRegionalClusterOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// CreateAWSRegionalClusterBadRequestCode is the HTTP code returned for type CreateAWSRegionalClusterBadRequest -const CreateAWSRegionalClusterBadRequestCode int = 400 - -/* -CreateAWSRegionalClusterBadRequest Bad request - -swagger:response createAWSRegionalClusterBadRequest -*/ -type CreateAWSRegionalClusterBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAWSRegionalClusterBadRequest creates CreateAWSRegionalClusterBadRequest with default headers values -func NewCreateAWSRegionalClusterBadRequest() *CreateAWSRegionalClusterBadRequest { - - return &CreateAWSRegionalClusterBadRequest{} -} - -// WithPayload adds the payload to the create a w s regional cluster bad request response -func (o *CreateAWSRegionalClusterBadRequest) WithPayload(payload *models.Error) *CreateAWSRegionalClusterBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create a w s regional cluster bad request response -func (o *CreateAWSRegionalClusterBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAWSRegionalClusterBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CreateAWSRegionalClusterUnauthorizedCode is the HTTP code returned for type CreateAWSRegionalClusterUnauthorized -const CreateAWSRegionalClusterUnauthorizedCode int = 401 - -/* -CreateAWSRegionalClusterUnauthorized Incorrect credentials - -swagger:response createAWSRegionalClusterUnauthorized -*/ -type CreateAWSRegionalClusterUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAWSRegionalClusterUnauthorized creates CreateAWSRegionalClusterUnauthorized with default headers values -func NewCreateAWSRegionalClusterUnauthorized() *CreateAWSRegionalClusterUnauthorized { - - return &CreateAWSRegionalClusterUnauthorized{} -} - -// WithPayload adds the payload to the create a w s regional cluster unauthorized response -func (o *CreateAWSRegionalClusterUnauthorized) WithPayload(payload *models.Error) *CreateAWSRegionalClusterUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create a w s regional cluster unauthorized response -func (o *CreateAWSRegionalClusterUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAWSRegionalClusterUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CreateAWSRegionalClusterInternalServerErrorCode is the HTTP code returned for type CreateAWSRegionalClusterInternalServerError -const CreateAWSRegionalClusterInternalServerErrorCode int = 500 - -/* -CreateAWSRegionalClusterInternalServerError Internal server error - -swagger:response createAWSRegionalClusterInternalServerError -*/ -type CreateAWSRegionalClusterInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAWSRegionalClusterInternalServerError creates CreateAWSRegionalClusterInternalServerError with default headers values -func NewCreateAWSRegionalClusterInternalServerError() *CreateAWSRegionalClusterInternalServerError { - - return &CreateAWSRegionalClusterInternalServerError{} -} - -// WithPayload adds the payload to the create a w s regional cluster internal server error response -func (o *CreateAWSRegionalClusterInternalServerError) WithPayload(payload *models.Error) *CreateAWSRegionalClusterInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create a w s regional cluster internal server error response -func (o *CreateAWSRegionalClusterInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAWSRegionalClusterInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster_urlbuilder.go b/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster_urlbuilder.go deleted file mode 100644 index a46efcdf78..0000000000 --- a/tkg/web/server/restapi/operations/aws/create_a_w_s_regional_cluster_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// CreateAWSRegionalClusterURL generates an URL for the create a w s regional cluster operation -type CreateAWSRegionalClusterURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateAWSRegionalClusterURL) WithBasePath(bp string) *CreateAWSRegionalClusterURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateAWSRegionalClusterURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *CreateAWSRegionalClusterURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws/create" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *CreateAWSRegionalClusterURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *CreateAWSRegionalClusterURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *CreateAWSRegionalClusterURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on CreateAWSRegionalClusterURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on CreateAWSRegionalClusterURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *CreateAWSRegionalClusterURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s.go b/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s.go deleted file mode 100644 index d4ed47056b..0000000000 --- a/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ExportTKGConfigForAWSHandlerFunc turns a function with the right signature into a export t k g config for a w s handler -type ExportTKGConfigForAWSHandlerFunc func(ExportTKGConfigForAWSParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ExportTKGConfigForAWSHandlerFunc) Handle(params ExportTKGConfigForAWSParams) middleware.Responder { - return fn(params) -} - -// ExportTKGConfigForAWSHandler interface for that can handle valid export t k g config for a w s params -type ExportTKGConfigForAWSHandler interface { - Handle(ExportTKGConfigForAWSParams) middleware.Responder -} - -// NewExportTKGConfigForAWS creates a new http.Handler for the export t k g config for a w s operation -func NewExportTKGConfigForAWS(ctx *middleware.Context, handler ExportTKGConfigForAWSHandler) *ExportTKGConfigForAWS { - return &ExportTKGConfigForAWS{Context: ctx, Handler: handler} -} - -/* -ExportTKGConfigForAWS swagger:route POST /api/providers/aws/config/export aws exportTKGConfigForAWS - -Generate TKG configuration file for AWS" -*/ -type ExportTKGConfigForAWS struct { - Context *middleware.Context - Handler ExportTKGConfigForAWSHandler -} - -func (o *ExportTKGConfigForAWS) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewExportTKGConfigForAWSParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s_parameters.go b/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s_parameters.go deleted file mode 100644 index d0ebb03f1d..0000000000 --- a/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewExportTKGConfigForAWSParams creates a new ExportTKGConfigForAWSParams object -// no default values defined in spec. -func NewExportTKGConfigForAWSParams() ExportTKGConfigForAWSParams { - - return ExportTKGConfigForAWSParams{} -} - -// ExportTKGConfigForAWSParams contains all the bound params for the export t k g config for a w s operation -// typically these are obtained from a http.Request -// -// swagger:parameters exportTKGConfigForAWS -type ExportTKGConfigForAWSParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*parameters to generate TKG configuration file for AWS - Required: true - In: body - */ - Params *models.AWSRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewExportTKGConfigForAWSParams() beforehand. -func (o *ExportTKGConfigForAWSParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.AWSRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s_responses.go b/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s_responses.go deleted file mode 100644 index debbafb441..0000000000 --- a/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s_responses.go +++ /dev/null @@ -1,192 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ExportTKGConfigForAWSOKCode is the HTTP code returned for type ExportTKGConfigForAWSOK -const ExportTKGConfigForAWSOKCode int = 200 - -/* -ExportTKGConfigForAWSOK Generated TKG configuration successfully - -swagger:response exportTKGConfigForAWSOK -*/ -type ExportTKGConfigForAWSOK struct { - - /* - In: Body - */ - Payload string `json:"body,omitempty"` -} - -// NewExportTKGConfigForAWSOK creates ExportTKGConfigForAWSOK with default headers values -func NewExportTKGConfigForAWSOK() *ExportTKGConfigForAWSOK { - - return &ExportTKGConfigForAWSOK{} -} - -// WithPayload adds the payload to the export t k g config for a w s o k response -func (o *ExportTKGConfigForAWSOK) WithPayload(payload string) *ExportTKGConfigForAWSOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for a w s o k response -func (o *ExportTKGConfigForAWSOK) SetPayload(payload string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForAWSOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// ExportTKGConfigForAWSBadRequestCode is the HTTP code returned for type ExportTKGConfigForAWSBadRequest -const ExportTKGConfigForAWSBadRequestCode int = 400 - -/* -ExportTKGConfigForAWSBadRequest Bad request - -swagger:response exportTKGConfigForAWSBadRequest -*/ -type ExportTKGConfigForAWSBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewExportTKGConfigForAWSBadRequest creates ExportTKGConfigForAWSBadRequest with default headers values -func NewExportTKGConfigForAWSBadRequest() *ExportTKGConfigForAWSBadRequest { - - return &ExportTKGConfigForAWSBadRequest{} -} - -// WithPayload adds the payload to the export t k g config for a w s bad request response -func (o *ExportTKGConfigForAWSBadRequest) WithPayload(payload *models.Error) *ExportTKGConfigForAWSBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for a w s bad request response -func (o *ExportTKGConfigForAWSBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForAWSBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ExportTKGConfigForAWSUnauthorizedCode is the HTTP code returned for type ExportTKGConfigForAWSUnauthorized -const ExportTKGConfigForAWSUnauthorizedCode int = 401 - -/* -ExportTKGConfigForAWSUnauthorized Incorrect credentials - -swagger:response exportTKGConfigForAWSUnauthorized -*/ -type ExportTKGConfigForAWSUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewExportTKGConfigForAWSUnauthorized creates ExportTKGConfigForAWSUnauthorized with default headers values -func NewExportTKGConfigForAWSUnauthorized() *ExportTKGConfigForAWSUnauthorized { - - return &ExportTKGConfigForAWSUnauthorized{} -} - -// WithPayload adds the payload to the export t k g config for a w s unauthorized response -func (o *ExportTKGConfigForAWSUnauthorized) WithPayload(payload *models.Error) *ExportTKGConfigForAWSUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for a w s unauthorized response -func (o *ExportTKGConfigForAWSUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForAWSUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ExportTKGConfigForAWSInternalServerErrorCode is the HTTP code returned for type ExportTKGConfigForAWSInternalServerError -const ExportTKGConfigForAWSInternalServerErrorCode int = 500 - -/* -ExportTKGConfigForAWSInternalServerError Internal server error - -swagger:response exportTKGConfigForAWSInternalServerError -*/ -type ExportTKGConfigForAWSInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewExportTKGConfigForAWSInternalServerError creates ExportTKGConfigForAWSInternalServerError with default headers values -func NewExportTKGConfigForAWSInternalServerError() *ExportTKGConfigForAWSInternalServerError { - - return &ExportTKGConfigForAWSInternalServerError{} -} - -// WithPayload adds the payload to the export t k g config for a w s internal server error response -func (o *ExportTKGConfigForAWSInternalServerError) WithPayload(payload *models.Error) *ExportTKGConfigForAWSInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for a w s internal server error response -func (o *ExportTKGConfigForAWSInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForAWSInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s_urlbuilder.go b/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s_urlbuilder.go deleted file mode 100644 index 0f07b8b5b2..0000000000 --- a/tkg/web/server/restapi/operations/aws/export_t_k_g_config_for_a_w_s_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ExportTKGConfigForAWSURL generates an URL for the export t k g config for a w s operation -type ExportTKGConfigForAWSURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ExportTKGConfigForAWSURL) WithBasePath(bp string) *ExportTKGConfigForAWSURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ExportTKGConfigForAWSURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ExportTKGConfigForAWSURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws/config/export" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ExportTKGConfigForAWSURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ExportTKGConfigForAWSURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ExportTKGConfigForAWSURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ExportTKGConfigForAWSURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ExportTKGConfigForAWSURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ExportTKGConfigForAWSURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones.go deleted file mode 100644 index d21fb910d6..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAWSAvailabilityZonesHandlerFunc turns a function with the right signature into a get a w s availability zones handler -type GetAWSAvailabilityZonesHandlerFunc func(GetAWSAvailabilityZonesParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAWSAvailabilityZonesHandlerFunc) Handle(params GetAWSAvailabilityZonesParams) middleware.Responder { - return fn(params) -} - -// GetAWSAvailabilityZonesHandler interface for that can handle valid get a w s availability zones params -type GetAWSAvailabilityZonesHandler interface { - Handle(GetAWSAvailabilityZonesParams) middleware.Responder -} - -// NewGetAWSAvailabilityZones creates a new http.Handler for the get a w s availability zones operation -func NewGetAWSAvailabilityZones(ctx *middleware.Context, handler GetAWSAvailabilityZonesHandler) *GetAWSAvailabilityZones { - return &GetAWSAvailabilityZones{Context: ctx, Handler: handler} -} - -/* -GetAWSAvailabilityZones swagger:route GET /api/providers/aws/AvailabilityZones aws getAWSAvailabilityZones - -Retrieve AWS availability zones of current region -*/ -type GetAWSAvailabilityZones struct { - Context *middleware.Context - Handler GetAWSAvailabilityZonesHandler -} - -func (o *GetAWSAvailabilityZones) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAWSAvailabilityZonesParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones_parameters.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones_parameters.go deleted file mode 100644 index be931e39b2..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetAWSAvailabilityZonesParams creates a new GetAWSAvailabilityZonesParams object -// no default values defined in spec. -func NewGetAWSAvailabilityZonesParams() GetAWSAvailabilityZonesParams { - - return GetAWSAvailabilityZonesParams{} -} - -// GetAWSAvailabilityZonesParams contains all the bound params for the get a w s availability zones operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAWSAvailabilityZones -type GetAWSAvailabilityZonesParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAWSAvailabilityZonesParams() beforehand. -func (o *GetAWSAvailabilityZonesParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones_responses.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones_responses.go deleted file mode 100644 index 7dd04fd46b..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSAvailabilityZonesOKCode is the HTTP code returned for type GetAWSAvailabilityZonesOK -const GetAWSAvailabilityZonesOKCode int = 200 - -/* -GetAWSAvailabilityZonesOK Successful retrieval of AWS availability zones - -swagger:response getAWSAvailabilityZonesOK -*/ -type GetAWSAvailabilityZonesOK struct { - - /* - In: Body - */ - Payload []*models.AWSAvailabilityZone `json:"body,omitempty"` -} - -// NewGetAWSAvailabilityZonesOK creates GetAWSAvailabilityZonesOK with default headers values -func NewGetAWSAvailabilityZonesOK() *GetAWSAvailabilityZonesOK { - - return &GetAWSAvailabilityZonesOK{} -} - -// WithPayload adds the payload to the get a w s availability zones o k response -func (o *GetAWSAvailabilityZonesOK) WithPayload(payload []*models.AWSAvailabilityZone) *GetAWSAvailabilityZonesOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s availability zones o k response -func (o *GetAWSAvailabilityZonesOK) SetPayload(payload []*models.AWSAvailabilityZone) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSAvailabilityZonesOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.AWSAvailabilityZone, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAWSAvailabilityZonesBadRequestCode is the HTTP code returned for type GetAWSAvailabilityZonesBadRequest -const GetAWSAvailabilityZonesBadRequestCode int = 400 - -/* -GetAWSAvailabilityZonesBadRequest Bad request - -swagger:response getAWSAvailabilityZonesBadRequest -*/ -type GetAWSAvailabilityZonesBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSAvailabilityZonesBadRequest creates GetAWSAvailabilityZonesBadRequest with default headers values -func NewGetAWSAvailabilityZonesBadRequest() *GetAWSAvailabilityZonesBadRequest { - - return &GetAWSAvailabilityZonesBadRequest{} -} - -// WithPayload adds the payload to the get a w s availability zones bad request response -func (o *GetAWSAvailabilityZonesBadRequest) WithPayload(payload *models.Error) *GetAWSAvailabilityZonesBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s availability zones bad request response -func (o *GetAWSAvailabilityZonesBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSAvailabilityZonesBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSAvailabilityZonesUnauthorizedCode is the HTTP code returned for type GetAWSAvailabilityZonesUnauthorized -const GetAWSAvailabilityZonesUnauthorizedCode int = 401 - -/* -GetAWSAvailabilityZonesUnauthorized Incorrect credentials - -swagger:response getAWSAvailabilityZonesUnauthorized -*/ -type GetAWSAvailabilityZonesUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSAvailabilityZonesUnauthorized creates GetAWSAvailabilityZonesUnauthorized with default headers values -func NewGetAWSAvailabilityZonesUnauthorized() *GetAWSAvailabilityZonesUnauthorized { - - return &GetAWSAvailabilityZonesUnauthorized{} -} - -// WithPayload adds the payload to the get a w s availability zones unauthorized response -func (o *GetAWSAvailabilityZonesUnauthorized) WithPayload(payload *models.Error) *GetAWSAvailabilityZonesUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s availability zones unauthorized response -func (o *GetAWSAvailabilityZonesUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSAvailabilityZonesUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSAvailabilityZonesInternalServerErrorCode is the HTTP code returned for type GetAWSAvailabilityZonesInternalServerError -const GetAWSAvailabilityZonesInternalServerErrorCode int = 500 - -/* -GetAWSAvailabilityZonesInternalServerError Internal server error - -swagger:response getAWSAvailabilityZonesInternalServerError -*/ -type GetAWSAvailabilityZonesInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSAvailabilityZonesInternalServerError creates GetAWSAvailabilityZonesInternalServerError with default headers values -func NewGetAWSAvailabilityZonesInternalServerError() *GetAWSAvailabilityZonesInternalServerError { - - return &GetAWSAvailabilityZonesInternalServerError{} -} - -// WithPayload adds the payload to the get a w s availability zones internal server error response -func (o *GetAWSAvailabilityZonesInternalServerError) WithPayload(payload *models.Error) *GetAWSAvailabilityZonesInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s availability zones internal server error response -func (o *GetAWSAvailabilityZonesInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSAvailabilityZonesInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones_urlbuilder.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones_urlbuilder.go deleted file mode 100644 index 37ffc3cb2f..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_availability_zones_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAWSAvailabilityZonesURL generates an URL for the get a w s availability zones operation -type GetAWSAvailabilityZonesURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSAvailabilityZonesURL) WithBasePath(bp string) *GetAWSAvailabilityZonesURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSAvailabilityZonesURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAWSAvailabilityZonesURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws/AvailabilityZones" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAWSAvailabilityZonesURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAWSAvailabilityZonesURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAWSAvailabilityZonesURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAWSAvailabilityZonesURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAWSAvailabilityZonesURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAWSAvailabilityZonesURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles.go deleted file mode 100644 index 8ccc1ded01..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAWSCredentialProfilesHandlerFunc turns a function with the right signature into a get a w s credential profiles handler -type GetAWSCredentialProfilesHandlerFunc func(GetAWSCredentialProfilesParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAWSCredentialProfilesHandlerFunc) Handle(params GetAWSCredentialProfilesParams) middleware.Responder { - return fn(params) -} - -// GetAWSCredentialProfilesHandler interface for that can handle valid get a w s credential profiles params -type GetAWSCredentialProfilesHandler interface { - Handle(GetAWSCredentialProfilesParams) middleware.Responder -} - -// NewGetAWSCredentialProfiles creates a new http.Handler for the get a w s credential profiles operation -func NewGetAWSCredentialProfiles(ctx *middleware.Context, handler GetAWSCredentialProfilesHandler) *GetAWSCredentialProfiles { - return &GetAWSCredentialProfiles{Context: ctx, Handler: handler} -} - -/* -GetAWSCredentialProfiles swagger:route GET /api/providers/aws/profiles aws getAWSCredentialProfiles - -Retrieve AWS credential profiles -*/ -type GetAWSCredentialProfiles struct { - Context *middleware.Context - Handler GetAWSCredentialProfilesHandler -} - -func (o *GetAWSCredentialProfiles) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAWSCredentialProfilesParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles_parameters.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles_parameters.go deleted file mode 100644 index 50e1e19f4e..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetAWSCredentialProfilesParams creates a new GetAWSCredentialProfilesParams object -// no default values defined in spec. -func NewGetAWSCredentialProfilesParams() GetAWSCredentialProfilesParams { - - return GetAWSCredentialProfilesParams{} -} - -// GetAWSCredentialProfilesParams contains all the bound params for the get a w s credential profiles operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAWSCredentialProfiles -type GetAWSCredentialProfilesParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAWSCredentialProfilesParams() beforehand. -func (o *GetAWSCredentialProfilesParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles_responses.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles_responses.go deleted file mode 100644 index ef5dcc0964..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSCredentialProfilesOKCode is the HTTP code returned for type GetAWSCredentialProfilesOK -const GetAWSCredentialProfilesOKCode int = 200 - -/* -GetAWSCredentialProfilesOK Successful retrieval of AWS credentials profiles - -swagger:response getAWSCredentialProfilesOK -*/ -type GetAWSCredentialProfilesOK struct { - - /* - In: Body - */ - Payload []string `json:"body,omitempty"` -} - -// NewGetAWSCredentialProfilesOK creates GetAWSCredentialProfilesOK with default headers values -func NewGetAWSCredentialProfilesOK() *GetAWSCredentialProfilesOK { - - return &GetAWSCredentialProfilesOK{} -} - -// WithPayload adds the payload to the get a w s credential profiles o k response -func (o *GetAWSCredentialProfilesOK) WithPayload(payload []string) *GetAWSCredentialProfilesOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s credential profiles o k response -func (o *GetAWSCredentialProfilesOK) SetPayload(payload []string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSCredentialProfilesOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]string, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAWSCredentialProfilesBadRequestCode is the HTTP code returned for type GetAWSCredentialProfilesBadRequest -const GetAWSCredentialProfilesBadRequestCode int = 400 - -/* -GetAWSCredentialProfilesBadRequest Bad request - -swagger:response getAWSCredentialProfilesBadRequest -*/ -type GetAWSCredentialProfilesBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSCredentialProfilesBadRequest creates GetAWSCredentialProfilesBadRequest with default headers values -func NewGetAWSCredentialProfilesBadRequest() *GetAWSCredentialProfilesBadRequest { - - return &GetAWSCredentialProfilesBadRequest{} -} - -// WithPayload adds the payload to the get a w s credential profiles bad request response -func (o *GetAWSCredentialProfilesBadRequest) WithPayload(payload *models.Error) *GetAWSCredentialProfilesBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s credential profiles bad request response -func (o *GetAWSCredentialProfilesBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSCredentialProfilesBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSCredentialProfilesUnauthorizedCode is the HTTP code returned for type GetAWSCredentialProfilesUnauthorized -const GetAWSCredentialProfilesUnauthorizedCode int = 401 - -/* -GetAWSCredentialProfilesUnauthorized Incorrect credentials - -swagger:response getAWSCredentialProfilesUnauthorized -*/ -type GetAWSCredentialProfilesUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSCredentialProfilesUnauthorized creates GetAWSCredentialProfilesUnauthorized with default headers values -func NewGetAWSCredentialProfilesUnauthorized() *GetAWSCredentialProfilesUnauthorized { - - return &GetAWSCredentialProfilesUnauthorized{} -} - -// WithPayload adds the payload to the get a w s credential profiles unauthorized response -func (o *GetAWSCredentialProfilesUnauthorized) WithPayload(payload *models.Error) *GetAWSCredentialProfilesUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s credential profiles unauthorized response -func (o *GetAWSCredentialProfilesUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSCredentialProfilesUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSCredentialProfilesInternalServerErrorCode is the HTTP code returned for type GetAWSCredentialProfilesInternalServerError -const GetAWSCredentialProfilesInternalServerErrorCode int = 500 - -/* -GetAWSCredentialProfilesInternalServerError Internal server error - -swagger:response getAWSCredentialProfilesInternalServerError -*/ -type GetAWSCredentialProfilesInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSCredentialProfilesInternalServerError creates GetAWSCredentialProfilesInternalServerError with default headers values -func NewGetAWSCredentialProfilesInternalServerError() *GetAWSCredentialProfilesInternalServerError { - - return &GetAWSCredentialProfilesInternalServerError{} -} - -// WithPayload adds the payload to the get a w s credential profiles internal server error response -func (o *GetAWSCredentialProfilesInternalServerError) WithPayload(payload *models.Error) *GetAWSCredentialProfilesInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s credential profiles internal server error response -func (o *GetAWSCredentialProfilesInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSCredentialProfilesInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles_urlbuilder.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles_urlbuilder.go deleted file mode 100644 index aa5bd5955c..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_credential_profiles_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAWSCredentialProfilesURL generates an URL for the get a w s credential profiles operation -type GetAWSCredentialProfilesURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSCredentialProfilesURL) WithBasePath(bp string) *GetAWSCredentialProfilesURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSCredentialProfilesURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAWSCredentialProfilesURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws/profiles" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAWSCredentialProfilesURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAWSCredentialProfilesURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAWSCredentialProfilesURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAWSCredentialProfilesURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAWSCredentialProfilesURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAWSCredentialProfilesURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types.go deleted file mode 100644 index 2a47715a29..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAWSNodeTypesHandlerFunc turns a function with the right signature into a get a w s node types handler -type GetAWSNodeTypesHandlerFunc func(GetAWSNodeTypesParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAWSNodeTypesHandlerFunc) Handle(params GetAWSNodeTypesParams) middleware.Responder { - return fn(params) -} - -// GetAWSNodeTypesHandler interface for that can handle valid get a w s node types params -type GetAWSNodeTypesHandler interface { - Handle(GetAWSNodeTypesParams) middleware.Responder -} - -// NewGetAWSNodeTypes creates a new http.Handler for the get a w s node types operation -func NewGetAWSNodeTypes(ctx *middleware.Context, handler GetAWSNodeTypesHandler) *GetAWSNodeTypes { - return &GetAWSNodeTypes{Context: ctx, Handler: handler} -} - -/* -GetAWSNodeTypes swagger:route GET /api/providers/aws/nodetypes aws getAWSNodeTypes - -Retrieve AWS supported node types -*/ -type GetAWSNodeTypes struct { - Context *middleware.Context - Handler GetAWSNodeTypesHandler -} - -func (o *GetAWSNodeTypes) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAWSNodeTypesParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types_parameters.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types_parameters.go deleted file mode 100644 index f966c2b723..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types_parameters.go +++ /dev/null @@ -1,78 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAWSNodeTypesParams creates a new GetAWSNodeTypesParams object -// no default values defined in spec. -func NewGetAWSNodeTypesParams() GetAWSNodeTypesParams { - - return GetAWSNodeTypesParams{} -} - -// GetAWSNodeTypesParams contains all the bound params for the get a w s node types operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAWSNodeTypes -type GetAWSNodeTypesParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*AWS availability zone, e.g. us-west-2 - In: query - */ - Az *string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAWSNodeTypesParams() beforehand. -func (o *GetAWSNodeTypesParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qAz, qhkAz, _ := qs.GetOK("az") - if err := o.bindAz(qAz, qhkAz, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindAz binds and validates parameter Az from query. -func (o *GetAWSNodeTypesParams) bindAz(rawData []string, hasKey bool, formats strfmt.Registry) error { - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: false - // AllowEmptyValue: false - if raw == "" { // empty values pass all other validations - return nil - } - - o.Az = &raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types_responses.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types_responses.go deleted file mode 100644 index 6a178fdaef..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSNodeTypesOKCode is the HTTP code returned for type GetAWSNodeTypesOK -const GetAWSNodeTypesOKCode int = 200 - -/* -GetAWSNodeTypesOK Successful retrieval of AWS node types - -swagger:response getAWSNodeTypesOK -*/ -type GetAWSNodeTypesOK struct { - - /* - In: Body - */ - Payload []string `json:"body,omitempty"` -} - -// NewGetAWSNodeTypesOK creates GetAWSNodeTypesOK with default headers values -func NewGetAWSNodeTypesOK() *GetAWSNodeTypesOK { - - return &GetAWSNodeTypesOK{} -} - -// WithPayload adds the payload to the get a w s node types o k response -func (o *GetAWSNodeTypesOK) WithPayload(payload []string) *GetAWSNodeTypesOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s node types o k response -func (o *GetAWSNodeTypesOK) SetPayload(payload []string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSNodeTypesOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]string, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAWSNodeTypesBadRequestCode is the HTTP code returned for type GetAWSNodeTypesBadRequest -const GetAWSNodeTypesBadRequestCode int = 400 - -/* -GetAWSNodeTypesBadRequest Bad request - -swagger:response getAWSNodeTypesBadRequest -*/ -type GetAWSNodeTypesBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSNodeTypesBadRequest creates GetAWSNodeTypesBadRequest with default headers values -func NewGetAWSNodeTypesBadRequest() *GetAWSNodeTypesBadRequest { - - return &GetAWSNodeTypesBadRequest{} -} - -// WithPayload adds the payload to the get a w s node types bad request response -func (o *GetAWSNodeTypesBadRequest) WithPayload(payload *models.Error) *GetAWSNodeTypesBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s node types bad request response -func (o *GetAWSNodeTypesBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSNodeTypesBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSNodeTypesUnauthorizedCode is the HTTP code returned for type GetAWSNodeTypesUnauthorized -const GetAWSNodeTypesUnauthorizedCode int = 401 - -/* -GetAWSNodeTypesUnauthorized Incorrect credentials - -swagger:response getAWSNodeTypesUnauthorized -*/ -type GetAWSNodeTypesUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSNodeTypesUnauthorized creates GetAWSNodeTypesUnauthorized with default headers values -func NewGetAWSNodeTypesUnauthorized() *GetAWSNodeTypesUnauthorized { - - return &GetAWSNodeTypesUnauthorized{} -} - -// WithPayload adds the payload to the get a w s node types unauthorized response -func (o *GetAWSNodeTypesUnauthorized) WithPayload(payload *models.Error) *GetAWSNodeTypesUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s node types unauthorized response -func (o *GetAWSNodeTypesUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSNodeTypesUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSNodeTypesInternalServerErrorCode is the HTTP code returned for type GetAWSNodeTypesInternalServerError -const GetAWSNodeTypesInternalServerErrorCode int = 500 - -/* -GetAWSNodeTypesInternalServerError Internal server error - -swagger:response getAWSNodeTypesInternalServerError -*/ -type GetAWSNodeTypesInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSNodeTypesInternalServerError creates GetAWSNodeTypesInternalServerError with default headers values -func NewGetAWSNodeTypesInternalServerError() *GetAWSNodeTypesInternalServerError { - - return &GetAWSNodeTypesInternalServerError{} -} - -// WithPayload adds the payload to the get a w s node types internal server error response -func (o *GetAWSNodeTypesInternalServerError) WithPayload(payload *models.Error) *GetAWSNodeTypesInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s node types internal server error response -func (o *GetAWSNodeTypesInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSNodeTypesInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types_urlbuilder.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types_urlbuilder.go deleted file mode 100644 index a4b53a1d5b..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_node_types_urlbuilder.go +++ /dev/null @@ -1,103 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAWSNodeTypesURL generates an URL for the get a w s node types operation -type GetAWSNodeTypesURL struct { - Az *string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSNodeTypesURL) WithBasePath(bp string) *GetAWSNodeTypesURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSNodeTypesURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAWSNodeTypesURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws/nodetypes" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - var azQ string - if o.Az != nil { - azQ = *o.Az - } - if azQ != "" { - qs.Set("az", azQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAWSNodeTypesURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAWSNodeTypesURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAWSNodeTypesURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAWSNodeTypesURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAWSNodeTypesURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAWSNodeTypesURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images.go deleted file mode 100644 index cdf5afddf7..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAWSOSImagesHandlerFunc turns a function with the right signature into a get a w s o s images handler -type GetAWSOSImagesHandlerFunc func(GetAWSOSImagesParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAWSOSImagesHandlerFunc) Handle(params GetAWSOSImagesParams) middleware.Responder { - return fn(params) -} - -// GetAWSOSImagesHandler interface for that can handle valid get a w s o s images params -type GetAWSOSImagesHandler interface { - Handle(GetAWSOSImagesParams) middleware.Responder -} - -// NewGetAWSOSImages creates a new http.Handler for the get a w s o s images operation -func NewGetAWSOSImages(ctx *middleware.Context, handler GetAWSOSImagesHandler) *GetAWSOSImages { - return &GetAWSOSImages{Context: ctx, Handler: handler} -} - -/* -GetAWSOSImages swagger:route GET /api/providers/aws/osimages aws getAWSOSImages - -Retrieve AWS supported os images -*/ -type GetAWSOSImages struct { - Context *middleware.Context - Handler GetAWSOSImagesHandler -} - -func (o *GetAWSOSImages) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAWSOSImagesParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images_parameters.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images_parameters.go deleted file mode 100644 index 5bc17bca74..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images_parameters.go +++ /dev/null @@ -1,83 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - "github.com/go-openapi/validate" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAWSOSImagesParams creates a new GetAWSOSImagesParams object -// no default values defined in spec. -func NewGetAWSOSImagesParams() GetAWSOSImagesParams { - - return GetAWSOSImagesParams{} -} - -// GetAWSOSImagesParams contains all the bound params for the get a w s o s images operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAWSOSImages -type GetAWSOSImagesParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*AWS region, e.g. us-west-2 - Required: true - In: query - */ - Region string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAWSOSImagesParams() beforehand. -func (o *GetAWSOSImagesParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qRegion, qhkRegion, _ := qs.GetOK("region") - if err := o.bindRegion(qRegion, qhkRegion, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindRegion binds and validates parameter Region from query. -func (o *GetAWSOSImagesParams) bindRegion(rawData []string, hasKey bool, formats strfmt.Registry) error { - if !hasKey { - return errors.Required("region", "query") - } - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // AllowEmptyValue: false - if err := validate.RequiredString("region", "query", raw); err != nil { - return err - } - - o.Region = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images_responses.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images_responses.go deleted file mode 100644 index 4577bc1639..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSOSImagesOKCode is the HTTP code returned for type GetAWSOSImagesOK -const GetAWSOSImagesOKCode int = 200 - -/* -GetAWSOSImagesOK Successful retrieval of AWS supported os images - -swagger:response getAWSOSImagesOK -*/ -type GetAWSOSImagesOK struct { - - /* - In: Body - */ - Payload []*models.AWSVirtualMachine `json:"body,omitempty"` -} - -// NewGetAWSOSImagesOK creates GetAWSOSImagesOK with default headers values -func NewGetAWSOSImagesOK() *GetAWSOSImagesOK { - - return &GetAWSOSImagesOK{} -} - -// WithPayload adds the payload to the get a w s o s images o k response -func (o *GetAWSOSImagesOK) WithPayload(payload []*models.AWSVirtualMachine) *GetAWSOSImagesOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s o s images o k response -func (o *GetAWSOSImagesOK) SetPayload(payload []*models.AWSVirtualMachine) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSOSImagesOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.AWSVirtualMachine, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAWSOSImagesBadRequestCode is the HTTP code returned for type GetAWSOSImagesBadRequest -const GetAWSOSImagesBadRequestCode int = 400 - -/* -GetAWSOSImagesBadRequest Bad request - -swagger:response getAWSOSImagesBadRequest -*/ -type GetAWSOSImagesBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSOSImagesBadRequest creates GetAWSOSImagesBadRequest with default headers values -func NewGetAWSOSImagesBadRequest() *GetAWSOSImagesBadRequest { - - return &GetAWSOSImagesBadRequest{} -} - -// WithPayload adds the payload to the get a w s o s images bad request response -func (o *GetAWSOSImagesBadRequest) WithPayload(payload *models.Error) *GetAWSOSImagesBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s o s images bad request response -func (o *GetAWSOSImagesBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSOSImagesBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSOSImagesUnauthorizedCode is the HTTP code returned for type GetAWSOSImagesUnauthorized -const GetAWSOSImagesUnauthorizedCode int = 401 - -/* -GetAWSOSImagesUnauthorized Incorrect credentials - -swagger:response getAWSOSImagesUnauthorized -*/ -type GetAWSOSImagesUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSOSImagesUnauthorized creates GetAWSOSImagesUnauthorized with default headers values -func NewGetAWSOSImagesUnauthorized() *GetAWSOSImagesUnauthorized { - - return &GetAWSOSImagesUnauthorized{} -} - -// WithPayload adds the payload to the get a w s o s images unauthorized response -func (o *GetAWSOSImagesUnauthorized) WithPayload(payload *models.Error) *GetAWSOSImagesUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s o s images unauthorized response -func (o *GetAWSOSImagesUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSOSImagesUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSOSImagesInternalServerErrorCode is the HTTP code returned for type GetAWSOSImagesInternalServerError -const GetAWSOSImagesInternalServerErrorCode int = 500 - -/* -GetAWSOSImagesInternalServerError Internal server error - -swagger:response getAWSOSImagesInternalServerError -*/ -type GetAWSOSImagesInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSOSImagesInternalServerError creates GetAWSOSImagesInternalServerError with default headers values -func NewGetAWSOSImagesInternalServerError() *GetAWSOSImagesInternalServerError { - - return &GetAWSOSImagesInternalServerError{} -} - -// WithPayload adds the payload to the get a w s o s images internal server error response -func (o *GetAWSOSImagesInternalServerError) WithPayload(payload *models.Error) *GetAWSOSImagesInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s o s images internal server error response -func (o *GetAWSOSImagesInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSOSImagesInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images_urlbuilder.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images_urlbuilder.go deleted file mode 100644 index e49bd85f6b..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_o_s_images_urlbuilder.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAWSOSImagesURL generates an URL for the get a w s o s images operation -type GetAWSOSImagesURL struct { - Region string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSOSImagesURL) WithBasePath(bp string) *GetAWSOSImagesURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSOSImagesURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAWSOSImagesURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws/osimages" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - regionQ := o.Region - if regionQ != "" { - qs.Set("region", regionQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAWSOSImagesURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAWSOSImagesURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAWSOSImagesURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAWSOSImagesURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAWSOSImagesURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAWSOSImagesURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_regions.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_regions.go deleted file mode 100644 index c06f5d1501..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_regions.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAWSRegionsHandlerFunc turns a function with the right signature into a get a w s regions handler -type GetAWSRegionsHandlerFunc func(GetAWSRegionsParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAWSRegionsHandlerFunc) Handle(params GetAWSRegionsParams) middleware.Responder { - return fn(params) -} - -// GetAWSRegionsHandler interface for that can handle valid get a w s regions params -type GetAWSRegionsHandler interface { - Handle(GetAWSRegionsParams) middleware.Responder -} - -// NewGetAWSRegions creates a new http.Handler for the get a w s regions operation -func NewGetAWSRegions(ctx *middleware.Context, handler GetAWSRegionsHandler) *GetAWSRegions { - return &GetAWSRegions{Context: ctx, Handler: handler} -} - -/* -GetAWSRegions swagger:route GET /api/providers/aws/regions aws getAWSRegions - -Retrieve AWS regions -*/ -type GetAWSRegions struct { - Context *middleware.Context - Handler GetAWSRegionsHandler -} - -func (o *GetAWSRegions) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAWSRegionsParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_regions_parameters.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_regions_parameters.go deleted file mode 100644 index 1745a8e34f..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_regions_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetAWSRegionsParams creates a new GetAWSRegionsParams object -// no default values defined in spec. -func NewGetAWSRegionsParams() GetAWSRegionsParams { - - return GetAWSRegionsParams{} -} - -// GetAWSRegionsParams contains all the bound params for the get a w s regions operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAWSRegions -type GetAWSRegionsParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAWSRegionsParams() beforehand. -func (o *GetAWSRegionsParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_regions_responses.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_regions_responses.go deleted file mode 100644 index 669f6f5c54..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_regions_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSRegionsOKCode is the HTTP code returned for type GetAWSRegionsOK -const GetAWSRegionsOKCode int = 200 - -/* -GetAWSRegionsOK Successful retrieval of AWS regions - -swagger:response getAWSRegionsOK -*/ -type GetAWSRegionsOK struct { - - /* - In: Body - */ - Payload []string `json:"body,omitempty"` -} - -// NewGetAWSRegionsOK creates GetAWSRegionsOK with default headers values -func NewGetAWSRegionsOK() *GetAWSRegionsOK { - - return &GetAWSRegionsOK{} -} - -// WithPayload adds the payload to the get a w s regions o k response -func (o *GetAWSRegionsOK) WithPayload(payload []string) *GetAWSRegionsOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s regions o k response -func (o *GetAWSRegionsOK) SetPayload(payload []string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSRegionsOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]string, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAWSRegionsBadRequestCode is the HTTP code returned for type GetAWSRegionsBadRequest -const GetAWSRegionsBadRequestCode int = 400 - -/* -GetAWSRegionsBadRequest Bad request - -swagger:response getAWSRegionsBadRequest -*/ -type GetAWSRegionsBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSRegionsBadRequest creates GetAWSRegionsBadRequest with default headers values -func NewGetAWSRegionsBadRequest() *GetAWSRegionsBadRequest { - - return &GetAWSRegionsBadRequest{} -} - -// WithPayload adds the payload to the get a w s regions bad request response -func (o *GetAWSRegionsBadRequest) WithPayload(payload *models.Error) *GetAWSRegionsBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s regions bad request response -func (o *GetAWSRegionsBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSRegionsBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSRegionsUnauthorizedCode is the HTTP code returned for type GetAWSRegionsUnauthorized -const GetAWSRegionsUnauthorizedCode int = 401 - -/* -GetAWSRegionsUnauthorized Incorrect credentials - -swagger:response getAWSRegionsUnauthorized -*/ -type GetAWSRegionsUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSRegionsUnauthorized creates GetAWSRegionsUnauthorized with default headers values -func NewGetAWSRegionsUnauthorized() *GetAWSRegionsUnauthorized { - - return &GetAWSRegionsUnauthorized{} -} - -// WithPayload adds the payload to the get a w s regions unauthorized response -func (o *GetAWSRegionsUnauthorized) WithPayload(payload *models.Error) *GetAWSRegionsUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s regions unauthorized response -func (o *GetAWSRegionsUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSRegionsUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSRegionsInternalServerErrorCode is the HTTP code returned for type GetAWSRegionsInternalServerError -const GetAWSRegionsInternalServerErrorCode int = 500 - -/* -GetAWSRegionsInternalServerError Internal server error - -swagger:response getAWSRegionsInternalServerError -*/ -type GetAWSRegionsInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSRegionsInternalServerError creates GetAWSRegionsInternalServerError with default headers values -func NewGetAWSRegionsInternalServerError() *GetAWSRegionsInternalServerError { - - return &GetAWSRegionsInternalServerError{} -} - -// WithPayload adds the payload to the get a w s regions internal server error response -func (o *GetAWSRegionsInternalServerError) WithPayload(payload *models.Error) *GetAWSRegionsInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s regions internal server error response -func (o *GetAWSRegionsInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSRegionsInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_regions_urlbuilder.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_regions_urlbuilder.go deleted file mode 100644 index adc8de908d..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_regions_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAWSRegionsURL generates an URL for the get a w s regions operation -type GetAWSRegionsURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSRegionsURL) WithBasePath(bp string) *GetAWSRegionsURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSRegionsURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAWSRegionsURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws/regions" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAWSRegionsURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAWSRegionsURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAWSRegionsURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAWSRegionsURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAWSRegionsURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAWSRegionsURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets.go deleted file mode 100644 index 5bed8e31a1..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAWSSubnetsHandlerFunc turns a function with the right signature into a get a w s subnets handler -type GetAWSSubnetsHandlerFunc func(GetAWSSubnetsParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAWSSubnetsHandlerFunc) Handle(params GetAWSSubnetsParams) middleware.Responder { - return fn(params) -} - -// GetAWSSubnetsHandler interface for that can handle valid get a w s subnets params -type GetAWSSubnetsHandler interface { - Handle(GetAWSSubnetsParams) middleware.Responder -} - -// NewGetAWSSubnets creates a new http.Handler for the get a w s subnets operation -func NewGetAWSSubnets(ctx *middleware.Context, handler GetAWSSubnetsHandler) *GetAWSSubnets { - return &GetAWSSubnets{Context: ctx, Handler: handler} -} - -/* -GetAWSSubnets swagger:route GET /api/providers/aws/subnets aws getAWSSubnets - -Retrieve AWS Subnets info under a VPC -*/ -type GetAWSSubnets struct { - Context *middleware.Context - Handler GetAWSSubnetsHandler -} - -func (o *GetAWSSubnets) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAWSSubnetsParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets_parameters.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets_parameters.go deleted file mode 100644 index f4fc78f3c6..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets_parameters.go +++ /dev/null @@ -1,83 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - "github.com/go-openapi/validate" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAWSSubnetsParams creates a new GetAWSSubnetsParams object -// no default values defined in spec. -func NewGetAWSSubnetsParams() GetAWSSubnetsParams { - - return GetAWSSubnetsParams{} -} - -// GetAWSSubnetsParams contains all the bound params for the get a w s subnets operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAWSSubnets -type GetAWSSubnetsParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*VPC Id - Required: true - In: query - */ - VpcID string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAWSSubnetsParams() beforehand. -func (o *GetAWSSubnetsParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qVpcID, qhkVpcID, _ := qs.GetOK("vpcId") - if err := o.bindVpcID(qVpcID, qhkVpcID, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindVpcID binds and validates parameter VpcID from query. -func (o *GetAWSSubnetsParams) bindVpcID(rawData []string, hasKey bool, formats strfmt.Registry) error { - if !hasKey { - return errors.Required("vpcId", "query") - } - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // AllowEmptyValue: false - if err := validate.RequiredString("vpcId", "query", raw); err != nil { - return err - } - - o.VpcID = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets_responses.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets_responses.go deleted file mode 100644 index 35c29e1362..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAWSSubnetsOKCode is the HTTP code returned for type GetAWSSubnetsOK -const GetAWSSubnetsOKCode int = 200 - -/* -GetAWSSubnetsOK Successful retrieval of AWS subnets - -swagger:response getAWSSubnetsOK -*/ -type GetAWSSubnetsOK struct { - - /* - In: Body - */ - Payload []*models.AWSSubnet `json:"body,omitempty"` -} - -// NewGetAWSSubnetsOK creates GetAWSSubnetsOK with default headers values -func NewGetAWSSubnetsOK() *GetAWSSubnetsOK { - - return &GetAWSSubnetsOK{} -} - -// WithPayload adds the payload to the get a w s subnets o k response -func (o *GetAWSSubnetsOK) WithPayload(payload []*models.AWSSubnet) *GetAWSSubnetsOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s subnets o k response -func (o *GetAWSSubnetsOK) SetPayload(payload []*models.AWSSubnet) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSSubnetsOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.AWSSubnet, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAWSSubnetsBadRequestCode is the HTTP code returned for type GetAWSSubnetsBadRequest -const GetAWSSubnetsBadRequestCode int = 400 - -/* -GetAWSSubnetsBadRequest Bad request - -swagger:response getAWSSubnetsBadRequest -*/ -type GetAWSSubnetsBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSSubnetsBadRequest creates GetAWSSubnetsBadRequest with default headers values -func NewGetAWSSubnetsBadRequest() *GetAWSSubnetsBadRequest { - - return &GetAWSSubnetsBadRequest{} -} - -// WithPayload adds the payload to the get a w s subnets bad request response -func (o *GetAWSSubnetsBadRequest) WithPayload(payload *models.Error) *GetAWSSubnetsBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s subnets bad request response -func (o *GetAWSSubnetsBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSSubnetsBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSSubnetsUnauthorizedCode is the HTTP code returned for type GetAWSSubnetsUnauthorized -const GetAWSSubnetsUnauthorizedCode int = 401 - -/* -GetAWSSubnetsUnauthorized Incorrect credentials - -swagger:response getAWSSubnetsUnauthorized -*/ -type GetAWSSubnetsUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSSubnetsUnauthorized creates GetAWSSubnetsUnauthorized with default headers values -func NewGetAWSSubnetsUnauthorized() *GetAWSSubnetsUnauthorized { - - return &GetAWSSubnetsUnauthorized{} -} - -// WithPayload adds the payload to the get a w s subnets unauthorized response -func (o *GetAWSSubnetsUnauthorized) WithPayload(payload *models.Error) *GetAWSSubnetsUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s subnets unauthorized response -func (o *GetAWSSubnetsUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSSubnetsUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAWSSubnetsInternalServerErrorCode is the HTTP code returned for type GetAWSSubnetsInternalServerError -const GetAWSSubnetsInternalServerErrorCode int = 500 - -/* -GetAWSSubnetsInternalServerError Internal server error - -swagger:response getAWSSubnetsInternalServerError -*/ -type GetAWSSubnetsInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAWSSubnetsInternalServerError creates GetAWSSubnetsInternalServerError with default headers values -func NewGetAWSSubnetsInternalServerError() *GetAWSSubnetsInternalServerError { - - return &GetAWSSubnetsInternalServerError{} -} - -// WithPayload adds the payload to the get a w s subnets internal server error response -func (o *GetAWSSubnetsInternalServerError) WithPayload(payload *models.Error) *GetAWSSubnetsInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get a w s subnets internal server error response -func (o *GetAWSSubnetsInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAWSSubnetsInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets_urlbuilder.go b/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets_urlbuilder.go deleted file mode 100644 index 41e88cd6f8..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_a_w_s_subnets_urlbuilder.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAWSSubnetsURL generates an URL for the get a w s subnets operation -type GetAWSSubnetsURL struct { - VpcID string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSSubnetsURL) WithBasePath(bp string) *GetAWSSubnetsURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAWSSubnetsURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAWSSubnetsURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws/subnets" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - vpcIDQ := o.VpcID - if vpcIDQ != "" { - qs.Set("vpcId", vpcIDQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAWSSubnetsURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAWSSubnetsURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAWSSubnetsURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAWSSubnetsURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAWSSubnetsURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAWSSubnetsURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/get_v_p_cs.go b/tkg/web/server/restapi/operations/aws/get_v_p_cs.go deleted file mode 100644 index f18379930f..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_v_p_cs.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetVPCsHandlerFunc turns a function with the right signature into a get v p cs handler -type GetVPCsHandlerFunc func(GetVPCsParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetVPCsHandlerFunc) Handle(params GetVPCsParams) middleware.Responder { - return fn(params) -} - -// GetVPCsHandler interface for that can handle valid get v p cs params -type GetVPCsHandler interface { - Handle(GetVPCsParams) middleware.Responder -} - -// NewGetVPCs creates a new http.Handler for the get v p cs operation -func NewGetVPCs(ctx *middleware.Context, handler GetVPCsHandler) *GetVPCs { - return &GetVPCs{Context: ctx, Handler: handler} -} - -/* -GetVPCs swagger:route GET /api/providers/aws/vpc aws getVPCs - -Retrieve AWS VPCs -*/ -type GetVPCs struct { - Context *middleware.Context - Handler GetVPCsHandler -} - -func (o *GetVPCs) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetVPCsParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/get_v_p_cs_parameters.go b/tkg/web/server/restapi/operations/aws/get_v_p_cs_parameters.go deleted file mode 100644 index 00c7364010..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_v_p_cs_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetVPCsParams creates a new GetVPCsParams object -// no default values defined in spec. -func NewGetVPCsParams() GetVPCsParams { - - return GetVPCsParams{} -} - -// GetVPCsParams contains all the bound params for the get v p cs operation -// typically these are obtained from a http.Request -// -// swagger:parameters getVPCs -type GetVPCsParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetVPCsParams() beforehand. -func (o *GetVPCsParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/get_v_p_cs_responses.go b/tkg/web/server/restapi/operations/aws/get_v_p_cs_responses.go deleted file mode 100644 index f0f07af7eb..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_v_p_cs_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVPCsOKCode is the HTTP code returned for type GetVPCsOK -const GetVPCsOKCode int = 200 - -/* -GetVPCsOK Successful retrieval of AWS VPCs - -swagger:response getVPCsOK -*/ -type GetVPCsOK struct { - - /* - In: Body - */ - Payload []*models.Vpc `json:"body,omitempty"` -} - -// NewGetVPCsOK creates GetVPCsOK with default headers values -func NewGetVPCsOK() *GetVPCsOK { - - return &GetVPCsOK{} -} - -// WithPayload adds the payload to the get v p cs o k response -func (o *GetVPCsOK) WithPayload(payload []*models.Vpc) *GetVPCsOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v p cs o k response -func (o *GetVPCsOK) SetPayload(payload []*models.Vpc) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVPCsOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.Vpc, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetVPCsBadRequestCode is the HTTP code returned for type GetVPCsBadRequest -const GetVPCsBadRequestCode int = 400 - -/* -GetVPCsBadRequest Bad request - -swagger:response getVPCsBadRequest -*/ -type GetVPCsBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVPCsBadRequest creates GetVPCsBadRequest with default headers values -func NewGetVPCsBadRequest() *GetVPCsBadRequest { - - return &GetVPCsBadRequest{} -} - -// WithPayload adds the payload to the get v p cs bad request response -func (o *GetVPCsBadRequest) WithPayload(payload *models.Error) *GetVPCsBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v p cs bad request response -func (o *GetVPCsBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVPCsBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVPCsUnauthorizedCode is the HTTP code returned for type GetVPCsUnauthorized -const GetVPCsUnauthorizedCode int = 401 - -/* -GetVPCsUnauthorized Incorrect credentials - -swagger:response getVPCsUnauthorized -*/ -type GetVPCsUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVPCsUnauthorized creates GetVPCsUnauthorized with default headers values -func NewGetVPCsUnauthorized() *GetVPCsUnauthorized { - - return &GetVPCsUnauthorized{} -} - -// WithPayload adds the payload to the get v p cs unauthorized response -func (o *GetVPCsUnauthorized) WithPayload(payload *models.Error) *GetVPCsUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v p cs unauthorized response -func (o *GetVPCsUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVPCsUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVPCsInternalServerErrorCode is the HTTP code returned for type GetVPCsInternalServerError -const GetVPCsInternalServerErrorCode int = 500 - -/* -GetVPCsInternalServerError Internal server error - -swagger:response getVPCsInternalServerError -*/ -type GetVPCsInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVPCsInternalServerError creates GetVPCsInternalServerError with default headers values -func NewGetVPCsInternalServerError() *GetVPCsInternalServerError { - - return &GetVPCsInternalServerError{} -} - -// WithPayload adds the payload to the get v p cs internal server error response -func (o *GetVPCsInternalServerError) WithPayload(payload *models.Error) *GetVPCsInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v p cs internal server error response -func (o *GetVPCsInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVPCsInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/get_v_p_cs_urlbuilder.go b/tkg/web/server/restapi/operations/aws/get_v_p_cs_urlbuilder.go deleted file mode 100644 index 7dd0824102..0000000000 --- a/tkg/web/server/restapi/operations/aws/get_v_p_cs_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetVPCsURL generates an URL for the get v p cs operation -type GetVPCsURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVPCsURL) WithBasePath(bp string) *GetVPCsURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVPCsURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetVPCsURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws/vpc" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetVPCsURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetVPCsURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetVPCsURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetVPCsURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetVPCsURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetVPCsURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s.go b/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s.go deleted file mode 100644 index 4cb99ff02b..0000000000 --- a/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ImportTKGConfigForAWSHandlerFunc turns a function with the right signature into a import t k g config for a w s handler -type ImportTKGConfigForAWSHandlerFunc func(ImportTKGConfigForAWSParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ImportTKGConfigForAWSHandlerFunc) Handle(params ImportTKGConfigForAWSParams) middleware.Responder { - return fn(params) -} - -// ImportTKGConfigForAWSHandler interface for that can handle valid import t k g config for a w s params -type ImportTKGConfigForAWSHandler interface { - Handle(ImportTKGConfigForAWSParams) middleware.Responder -} - -// NewImportTKGConfigForAWS creates a new http.Handler for the import t k g config for a w s operation -func NewImportTKGConfigForAWS(ctx *middleware.Context, handler ImportTKGConfigForAWSHandler) *ImportTKGConfigForAWS { - return &ImportTKGConfigForAWS{Context: ctx, Handler: handler} -} - -/* -ImportTKGConfigForAWS swagger:route POST /api/providers/aws/config/import aws importTKGConfigForAWS - -Generate TKG configuration object for AWS -*/ -type ImportTKGConfigForAWS struct { - Context *middleware.Context - Handler ImportTKGConfigForAWSHandler -} - -func (o *ImportTKGConfigForAWS) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewImportTKGConfigForAWSParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s_parameters.go b/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s_parameters.go deleted file mode 100644 index 228d6a6428..0000000000 --- a/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewImportTKGConfigForAWSParams creates a new ImportTKGConfigForAWSParams object -// no default values defined in spec. -func NewImportTKGConfigForAWSParams() ImportTKGConfigForAWSParams { - - return ImportTKGConfigForAWSParams{} -} - -// ImportTKGConfigForAWSParams contains all the bound params for the import t k g config for a w s operation -// typically these are obtained from a http.Request -// -// swagger:parameters importTKGConfigForAWS -type ImportTKGConfigForAWSParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*config file from which to generate tkg configuration for aws - Required: true - In: body - */ - Params *models.ConfigFile -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewImportTKGConfigForAWSParams() beforehand. -func (o *ImportTKGConfigForAWSParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.ConfigFile - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s_responses.go b/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s_responses.go deleted file mode 100644 index 293be82df4..0000000000 --- a/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ImportTKGConfigForAWSOKCode is the HTTP code returned for type ImportTKGConfigForAWSOK -const ImportTKGConfigForAWSOKCode int = 200 - -/* -ImportTKGConfigForAWSOK Generated TKG configuration successfully - -swagger:response importTKGConfigForAWSOK -*/ -type ImportTKGConfigForAWSOK struct { - - /* - In: Body - */ - Payload *models.AWSRegionalClusterParams `json:"body,omitempty"` -} - -// NewImportTKGConfigForAWSOK creates ImportTKGConfigForAWSOK with default headers values -func NewImportTKGConfigForAWSOK() *ImportTKGConfigForAWSOK { - - return &ImportTKGConfigForAWSOK{} -} - -// WithPayload adds the payload to the import t k g config for a w s o k response -func (o *ImportTKGConfigForAWSOK) WithPayload(payload *models.AWSRegionalClusterParams) *ImportTKGConfigForAWSOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for a w s o k response -func (o *ImportTKGConfigForAWSOK) SetPayload(payload *models.AWSRegionalClusterParams) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForAWSOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForAWSBadRequestCode is the HTTP code returned for type ImportTKGConfigForAWSBadRequest -const ImportTKGConfigForAWSBadRequestCode int = 400 - -/* -ImportTKGConfigForAWSBadRequest Bad request - -swagger:response importTKGConfigForAWSBadRequest -*/ -type ImportTKGConfigForAWSBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForAWSBadRequest creates ImportTKGConfigForAWSBadRequest with default headers values -func NewImportTKGConfigForAWSBadRequest() *ImportTKGConfigForAWSBadRequest { - - return &ImportTKGConfigForAWSBadRequest{} -} - -// WithPayload adds the payload to the import t k g config for a w s bad request response -func (o *ImportTKGConfigForAWSBadRequest) WithPayload(payload *models.Error) *ImportTKGConfigForAWSBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for a w s bad request response -func (o *ImportTKGConfigForAWSBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForAWSBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForAWSUnauthorizedCode is the HTTP code returned for type ImportTKGConfigForAWSUnauthorized -const ImportTKGConfigForAWSUnauthorizedCode int = 401 - -/* -ImportTKGConfigForAWSUnauthorized Incorrect credentials - -swagger:response importTKGConfigForAWSUnauthorized -*/ -type ImportTKGConfigForAWSUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForAWSUnauthorized creates ImportTKGConfigForAWSUnauthorized with default headers values -func NewImportTKGConfigForAWSUnauthorized() *ImportTKGConfigForAWSUnauthorized { - - return &ImportTKGConfigForAWSUnauthorized{} -} - -// WithPayload adds the payload to the import t k g config for a w s unauthorized response -func (o *ImportTKGConfigForAWSUnauthorized) WithPayload(payload *models.Error) *ImportTKGConfigForAWSUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for a w s unauthorized response -func (o *ImportTKGConfigForAWSUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForAWSUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForAWSInternalServerErrorCode is the HTTP code returned for type ImportTKGConfigForAWSInternalServerError -const ImportTKGConfigForAWSInternalServerErrorCode int = 500 - -/* -ImportTKGConfigForAWSInternalServerError Internal server error - -swagger:response importTKGConfigForAWSInternalServerError -*/ -type ImportTKGConfigForAWSInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForAWSInternalServerError creates ImportTKGConfigForAWSInternalServerError with default headers values -func NewImportTKGConfigForAWSInternalServerError() *ImportTKGConfigForAWSInternalServerError { - - return &ImportTKGConfigForAWSInternalServerError{} -} - -// WithPayload adds the payload to the import t k g config for a w s internal server error response -func (o *ImportTKGConfigForAWSInternalServerError) WithPayload(payload *models.Error) *ImportTKGConfigForAWSInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for a w s internal server error response -func (o *ImportTKGConfigForAWSInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForAWSInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s_urlbuilder.go b/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s_urlbuilder.go deleted file mode 100644 index c17e2b4395..0000000000 --- a/tkg/web/server/restapi/operations/aws/import_t_k_g_config_for_a_w_s_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ImportTKGConfigForAWSURL generates an URL for the import t k g config for a w s operation -type ImportTKGConfigForAWSURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ImportTKGConfigForAWSURL) WithBasePath(bp string) *ImportTKGConfigForAWSURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ImportTKGConfigForAWSURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ImportTKGConfigForAWSURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws/config/import" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ImportTKGConfigForAWSURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ImportTKGConfigForAWSURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ImportTKGConfigForAWSURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ImportTKGConfigForAWSURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ImportTKGConfigForAWSURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ImportTKGConfigForAWSURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint.go b/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint.go deleted file mode 100644 index 34d63b5c6f..0000000000 --- a/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// SetAWSEndpointHandlerFunc turns a function with the right signature into a set a w s endpoint handler -type SetAWSEndpointHandlerFunc func(SetAWSEndpointParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn SetAWSEndpointHandlerFunc) Handle(params SetAWSEndpointParams) middleware.Responder { - return fn(params) -} - -// SetAWSEndpointHandler interface for that can handle valid set a w s endpoint params -type SetAWSEndpointHandler interface { - Handle(SetAWSEndpointParams) middleware.Responder -} - -// NewSetAWSEndpoint creates a new http.Handler for the set a w s endpoint operation -func NewSetAWSEndpoint(ctx *middleware.Context, handler SetAWSEndpointHandler) *SetAWSEndpoint { - return &SetAWSEndpoint{Context: ctx, Handler: handler} -} - -/* -SetAWSEndpoint swagger:route POST /api/providers/aws aws setAWSEndpoint - -Validate and set aws credentials -*/ -type SetAWSEndpoint struct { - Context *middleware.Context - Handler SetAWSEndpointHandler -} - -func (o *SetAWSEndpoint) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewSetAWSEndpointParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint_parameters.go b/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint_parameters.go deleted file mode 100644 index e6841afb0d..0000000000 --- a/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint_parameters.go +++ /dev/null @@ -1,69 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewSetAWSEndpointParams creates a new SetAWSEndpointParams object -// no default values defined in spec. -func NewSetAWSEndpointParams() SetAWSEndpointParams { - - return SetAWSEndpointParams{} -} - -// SetAWSEndpointParams contains all the bound params for the set a w s endpoint operation -// typically these are obtained from a http.Request -// -// swagger:parameters setAWSEndpoint -type SetAWSEndpointParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*AWS account parameters - In: body - */ - AccountParams *models.AWSAccountParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewSetAWSEndpointParams() beforehand. -func (o *SetAWSEndpointParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.AWSAccountParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - res = append(res, errors.NewParseError("accountParams", "body", "", err)) - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.AccountParams = &body - } - } - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint_responses.go b/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint_responses.go deleted file mode 100644 index d551689c23..0000000000 --- a/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint_responses.go +++ /dev/null @@ -1,174 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// SetAWSEndpointCreatedCode is the HTTP code returned for type SetAWSEndpointCreated -const SetAWSEndpointCreatedCode int = 201 - -/* -SetAWSEndpointCreated Connection successful - -swagger:response setAWSEndpointCreated -*/ -type SetAWSEndpointCreated struct { -} - -// NewSetAWSEndpointCreated creates SetAWSEndpointCreated with default headers values -func NewSetAWSEndpointCreated() *SetAWSEndpointCreated { - - return &SetAWSEndpointCreated{} -} - -// WriteResponse to the client -func (o *SetAWSEndpointCreated) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.Header().Del(runtime.HeaderContentType) //Remove Content-Type on empty responses - - rw.WriteHeader(201) -} - -// SetAWSEndpointBadRequestCode is the HTTP code returned for type SetAWSEndpointBadRequest -const SetAWSEndpointBadRequestCode int = 400 - -/* -SetAWSEndpointBadRequest Bad request - -swagger:response setAWSEndpointBadRequest -*/ -type SetAWSEndpointBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewSetAWSEndpointBadRequest creates SetAWSEndpointBadRequest with default headers values -func NewSetAWSEndpointBadRequest() *SetAWSEndpointBadRequest { - - return &SetAWSEndpointBadRequest{} -} - -// WithPayload adds the payload to the set a w s endpoint bad request response -func (o *SetAWSEndpointBadRequest) WithPayload(payload *models.Error) *SetAWSEndpointBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the set a w s endpoint bad request response -func (o *SetAWSEndpointBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *SetAWSEndpointBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// SetAWSEndpointUnauthorizedCode is the HTTP code returned for type SetAWSEndpointUnauthorized -const SetAWSEndpointUnauthorizedCode int = 401 - -/* -SetAWSEndpointUnauthorized Incorrect credentials - -swagger:response setAWSEndpointUnauthorized -*/ -type SetAWSEndpointUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewSetAWSEndpointUnauthorized creates SetAWSEndpointUnauthorized with default headers values -func NewSetAWSEndpointUnauthorized() *SetAWSEndpointUnauthorized { - - return &SetAWSEndpointUnauthorized{} -} - -// WithPayload adds the payload to the set a w s endpoint unauthorized response -func (o *SetAWSEndpointUnauthorized) WithPayload(payload *models.Error) *SetAWSEndpointUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the set a w s endpoint unauthorized response -func (o *SetAWSEndpointUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *SetAWSEndpointUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// SetAWSEndpointInternalServerErrorCode is the HTTP code returned for type SetAWSEndpointInternalServerError -const SetAWSEndpointInternalServerErrorCode int = 500 - -/* -SetAWSEndpointInternalServerError Internal server error - -swagger:response setAWSEndpointInternalServerError -*/ -type SetAWSEndpointInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewSetAWSEndpointInternalServerError creates SetAWSEndpointInternalServerError with default headers values -func NewSetAWSEndpointInternalServerError() *SetAWSEndpointInternalServerError { - - return &SetAWSEndpointInternalServerError{} -} - -// WithPayload adds the payload to the set a w s endpoint internal server error response -func (o *SetAWSEndpointInternalServerError) WithPayload(payload *models.Error) *SetAWSEndpointInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the set a w s endpoint internal server error response -func (o *SetAWSEndpointInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *SetAWSEndpointInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint_urlbuilder.go b/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint_urlbuilder.go deleted file mode 100644 index 975ddcef50..0000000000 --- a/tkg/web/server/restapi/operations/aws/set_a_w_s_endpoint_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package aws - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// SetAWSEndpointURL generates an URL for the set a w s endpoint operation -type SetAWSEndpointURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *SetAWSEndpointURL) WithBasePath(bp string) *SetAWSEndpointURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *SetAWSEndpointURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *SetAWSEndpointURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/aws" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *SetAWSEndpointURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *SetAWSEndpointURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *SetAWSEndpointURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on SetAWSEndpointURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on SetAWSEndpointURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *SetAWSEndpointURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure.go b/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure.go deleted file mode 100644 index e3b2105747..0000000000 --- a/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ApplyTKGConfigForAzureHandlerFunc turns a function with the right signature into a apply t k g config for azure handler -type ApplyTKGConfigForAzureHandlerFunc func(ApplyTKGConfigForAzureParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ApplyTKGConfigForAzureHandlerFunc) Handle(params ApplyTKGConfigForAzureParams) middleware.Responder { - return fn(params) -} - -// ApplyTKGConfigForAzureHandler interface for that can handle valid apply t k g config for azure params -type ApplyTKGConfigForAzureHandler interface { - Handle(ApplyTKGConfigForAzureParams) middleware.Responder -} - -// NewApplyTKGConfigForAzure creates a new http.Handler for the apply t k g config for azure operation -func NewApplyTKGConfigForAzure(ctx *middleware.Context, handler ApplyTKGConfigForAzureHandler) *ApplyTKGConfigForAzure { - return &ApplyTKGConfigForAzure{Context: ctx, Handler: handler} -} - -/* -ApplyTKGConfigForAzure swagger:route POST /api/providers/azure/tkgconfig azure applyTKGConfigForAzure - -Apply the changes to TKG configuration file for Azure" -*/ -type ApplyTKGConfigForAzure struct { - Context *middleware.Context - Handler ApplyTKGConfigForAzureHandler -} - -func (o *ApplyTKGConfigForAzure) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewApplyTKGConfigForAzureParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure_parameters.go b/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure_parameters.go deleted file mode 100644 index d168038352..0000000000 --- a/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewApplyTKGConfigForAzureParams creates a new ApplyTKGConfigForAzureParams object -// no default values defined in spec. -func NewApplyTKGConfigForAzureParams() ApplyTKGConfigForAzureParams { - - return ApplyTKGConfigForAzureParams{} -} - -// ApplyTKGConfigForAzureParams contains all the bound params for the apply t k g config for azure operation -// typically these are obtained from a http.Request -// -// swagger:parameters applyTKGConfigForAzure -type ApplyTKGConfigForAzureParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*parameters to apply changes to TKG configuration file for Azure - Required: true - In: body - */ - Params *models.AzureRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewApplyTKGConfigForAzureParams() beforehand. -func (o *ApplyTKGConfigForAzureParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.AzureRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure_responses.go b/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure_responses.go deleted file mode 100644 index e0923bd78a..0000000000 --- a/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ApplyTKGConfigForAzureOKCode is the HTTP code returned for type ApplyTKGConfigForAzureOK -const ApplyTKGConfigForAzureOKCode int = 200 - -/* -ApplyTKGConfigForAzureOK Apply change to TKG configuration successfully - -swagger:response applyTKGConfigForAzureOK -*/ -type ApplyTKGConfigForAzureOK struct { - - /* - In: Body - */ - Payload *models.ConfigFileInfo `json:"body,omitempty"` -} - -// NewApplyTKGConfigForAzureOK creates ApplyTKGConfigForAzureOK with default headers values -func NewApplyTKGConfigForAzureOK() *ApplyTKGConfigForAzureOK { - - return &ApplyTKGConfigForAzureOK{} -} - -// WithPayload adds the payload to the apply t k g config for azure o k response -func (o *ApplyTKGConfigForAzureOK) WithPayload(payload *models.ConfigFileInfo) *ApplyTKGConfigForAzureOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for azure o k response -func (o *ApplyTKGConfigForAzureOK) SetPayload(payload *models.ConfigFileInfo) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForAzureOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ApplyTKGConfigForAzureBadRequestCode is the HTTP code returned for type ApplyTKGConfigForAzureBadRequest -const ApplyTKGConfigForAzureBadRequestCode int = 400 - -/* -ApplyTKGConfigForAzureBadRequest Bad request - -swagger:response applyTKGConfigForAzureBadRequest -*/ -type ApplyTKGConfigForAzureBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewApplyTKGConfigForAzureBadRequest creates ApplyTKGConfigForAzureBadRequest with default headers values -func NewApplyTKGConfigForAzureBadRequest() *ApplyTKGConfigForAzureBadRequest { - - return &ApplyTKGConfigForAzureBadRequest{} -} - -// WithPayload adds the payload to the apply t k g config for azure bad request response -func (o *ApplyTKGConfigForAzureBadRequest) WithPayload(payload *models.Error) *ApplyTKGConfigForAzureBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for azure bad request response -func (o *ApplyTKGConfigForAzureBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForAzureBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ApplyTKGConfigForAzureUnauthorizedCode is the HTTP code returned for type ApplyTKGConfigForAzureUnauthorized -const ApplyTKGConfigForAzureUnauthorizedCode int = 401 - -/* -ApplyTKGConfigForAzureUnauthorized Incorrect credentials - -swagger:response applyTKGConfigForAzureUnauthorized -*/ -type ApplyTKGConfigForAzureUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewApplyTKGConfigForAzureUnauthorized creates ApplyTKGConfigForAzureUnauthorized with default headers values -func NewApplyTKGConfigForAzureUnauthorized() *ApplyTKGConfigForAzureUnauthorized { - - return &ApplyTKGConfigForAzureUnauthorized{} -} - -// WithPayload adds the payload to the apply t k g config for azure unauthorized response -func (o *ApplyTKGConfigForAzureUnauthorized) WithPayload(payload *models.Error) *ApplyTKGConfigForAzureUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for azure unauthorized response -func (o *ApplyTKGConfigForAzureUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForAzureUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ApplyTKGConfigForAzureInternalServerErrorCode is the HTTP code returned for type ApplyTKGConfigForAzureInternalServerError -const ApplyTKGConfigForAzureInternalServerErrorCode int = 500 - -/* -ApplyTKGConfigForAzureInternalServerError Internal server error - -swagger:response applyTKGConfigForAzureInternalServerError -*/ -type ApplyTKGConfigForAzureInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewApplyTKGConfigForAzureInternalServerError creates ApplyTKGConfigForAzureInternalServerError with default headers values -func NewApplyTKGConfigForAzureInternalServerError() *ApplyTKGConfigForAzureInternalServerError { - - return &ApplyTKGConfigForAzureInternalServerError{} -} - -// WithPayload adds the payload to the apply t k g config for azure internal server error response -func (o *ApplyTKGConfigForAzureInternalServerError) WithPayload(payload *models.Error) *ApplyTKGConfigForAzureInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for azure internal server error response -func (o *ApplyTKGConfigForAzureInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForAzureInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure_urlbuilder.go b/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure_urlbuilder.go deleted file mode 100644 index a4655569f6..0000000000 --- a/tkg/web/server/restapi/operations/azure/apply_t_k_g_config_for_azure_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ApplyTKGConfigForAzureURL generates an URL for the apply t k g config for azure operation -type ApplyTKGConfigForAzureURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ApplyTKGConfigForAzureURL) WithBasePath(bp string) *ApplyTKGConfigForAzureURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ApplyTKGConfigForAzureURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ApplyTKGConfigForAzureURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure/tkgconfig" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ApplyTKGConfigForAzureURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ApplyTKGConfigForAzureURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ApplyTKGConfigForAzureURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ApplyTKGConfigForAzureURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ApplyTKGConfigForAzureURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ApplyTKGConfigForAzureURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster.go b/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster.go deleted file mode 100644 index ce75749634..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// CreateAzureRegionalClusterHandlerFunc turns a function with the right signature into a create azure regional cluster handler -type CreateAzureRegionalClusterHandlerFunc func(CreateAzureRegionalClusterParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn CreateAzureRegionalClusterHandlerFunc) Handle(params CreateAzureRegionalClusterParams) middleware.Responder { - return fn(params) -} - -// CreateAzureRegionalClusterHandler interface for that can handle valid create azure regional cluster params -type CreateAzureRegionalClusterHandler interface { - Handle(CreateAzureRegionalClusterParams) middleware.Responder -} - -// NewCreateAzureRegionalCluster creates a new http.Handler for the create azure regional cluster operation -func NewCreateAzureRegionalCluster(ctx *middleware.Context, handler CreateAzureRegionalClusterHandler) *CreateAzureRegionalCluster { - return &CreateAzureRegionalCluster{Context: ctx, Handler: handler} -} - -/* -CreateAzureRegionalCluster swagger:route POST /api/providers/azure/create azure createAzureRegionalCluster - -Create Azure regional cluster -*/ -type CreateAzureRegionalCluster struct { - Context *middleware.Context - Handler CreateAzureRegionalClusterHandler -} - -func (o *CreateAzureRegionalCluster) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewCreateAzureRegionalClusterParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster_parameters.go b/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster_parameters.go deleted file mode 100644 index 893b12346a..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateAzureRegionalClusterParams creates a new CreateAzureRegionalClusterParams object -// no default values defined in spec. -func NewCreateAzureRegionalClusterParams() CreateAzureRegionalClusterParams { - - return CreateAzureRegionalClusterParams{} -} - -// CreateAzureRegionalClusterParams contains all the bound params for the create azure regional cluster operation -// typically these are obtained from a http.Request -// -// swagger:parameters createAzureRegionalCluster -type CreateAzureRegionalClusterParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*parameters to create a regional cluster - Required: true - In: body - */ - Params *models.AzureRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewCreateAzureRegionalClusterParams() beforehand. -func (o *CreateAzureRegionalClusterParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.AzureRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster_responses.go b/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster_responses.go deleted file mode 100644 index 28b6785e25..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster_responses.go +++ /dev/null @@ -1,192 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateAzureRegionalClusterOKCode is the HTTP code returned for type CreateAzureRegionalClusterOK -const CreateAzureRegionalClusterOKCode int = 200 - -/* -CreateAzureRegionalClusterOK Creating regional cluster started successfully - -swagger:response createAzureRegionalClusterOK -*/ -type CreateAzureRegionalClusterOK struct { - - /* - In: Body - */ - Payload string `json:"body,omitempty"` -} - -// NewCreateAzureRegionalClusterOK creates CreateAzureRegionalClusterOK with default headers values -func NewCreateAzureRegionalClusterOK() *CreateAzureRegionalClusterOK { - - return &CreateAzureRegionalClusterOK{} -} - -// WithPayload adds the payload to the create azure regional cluster o k response -func (o *CreateAzureRegionalClusterOK) WithPayload(payload string) *CreateAzureRegionalClusterOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure regional cluster o k response -func (o *CreateAzureRegionalClusterOK) SetPayload(payload string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureRegionalClusterOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// CreateAzureRegionalClusterBadRequestCode is the HTTP code returned for type CreateAzureRegionalClusterBadRequest -const CreateAzureRegionalClusterBadRequestCode int = 400 - -/* -CreateAzureRegionalClusterBadRequest Bad request - -swagger:response createAzureRegionalClusterBadRequest -*/ -type CreateAzureRegionalClusterBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAzureRegionalClusterBadRequest creates CreateAzureRegionalClusterBadRequest with default headers values -func NewCreateAzureRegionalClusterBadRequest() *CreateAzureRegionalClusterBadRequest { - - return &CreateAzureRegionalClusterBadRequest{} -} - -// WithPayload adds the payload to the create azure regional cluster bad request response -func (o *CreateAzureRegionalClusterBadRequest) WithPayload(payload *models.Error) *CreateAzureRegionalClusterBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure regional cluster bad request response -func (o *CreateAzureRegionalClusterBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureRegionalClusterBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CreateAzureRegionalClusterUnauthorizedCode is the HTTP code returned for type CreateAzureRegionalClusterUnauthorized -const CreateAzureRegionalClusterUnauthorizedCode int = 401 - -/* -CreateAzureRegionalClusterUnauthorized Incorrect credentials - -swagger:response createAzureRegionalClusterUnauthorized -*/ -type CreateAzureRegionalClusterUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAzureRegionalClusterUnauthorized creates CreateAzureRegionalClusterUnauthorized with default headers values -func NewCreateAzureRegionalClusterUnauthorized() *CreateAzureRegionalClusterUnauthorized { - - return &CreateAzureRegionalClusterUnauthorized{} -} - -// WithPayload adds the payload to the create azure regional cluster unauthorized response -func (o *CreateAzureRegionalClusterUnauthorized) WithPayload(payload *models.Error) *CreateAzureRegionalClusterUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure regional cluster unauthorized response -func (o *CreateAzureRegionalClusterUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureRegionalClusterUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CreateAzureRegionalClusterInternalServerErrorCode is the HTTP code returned for type CreateAzureRegionalClusterInternalServerError -const CreateAzureRegionalClusterInternalServerErrorCode int = 500 - -/* -CreateAzureRegionalClusterInternalServerError Internal server error - -swagger:response createAzureRegionalClusterInternalServerError -*/ -type CreateAzureRegionalClusterInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAzureRegionalClusterInternalServerError creates CreateAzureRegionalClusterInternalServerError with default headers values -func NewCreateAzureRegionalClusterInternalServerError() *CreateAzureRegionalClusterInternalServerError { - - return &CreateAzureRegionalClusterInternalServerError{} -} - -// WithPayload adds the payload to the create azure regional cluster internal server error response -func (o *CreateAzureRegionalClusterInternalServerError) WithPayload(payload *models.Error) *CreateAzureRegionalClusterInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure regional cluster internal server error response -func (o *CreateAzureRegionalClusterInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureRegionalClusterInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster_urlbuilder.go b/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster_urlbuilder.go deleted file mode 100644 index b69a50559d..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_regional_cluster_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// CreateAzureRegionalClusterURL generates an URL for the create azure regional cluster operation -type CreateAzureRegionalClusterURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateAzureRegionalClusterURL) WithBasePath(bp string) *CreateAzureRegionalClusterURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateAzureRegionalClusterURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *CreateAzureRegionalClusterURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure/create" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *CreateAzureRegionalClusterURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *CreateAzureRegionalClusterURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *CreateAzureRegionalClusterURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on CreateAzureRegionalClusterURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on CreateAzureRegionalClusterURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *CreateAzureRegionalClusterURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_resource_group.go b/tkg/web/server/restapi/operations/azure/create_azure_resource_group.go deleted file mode 100644 index 40c35038c0..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_resource_group.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// CreateAzureResourceGroupHandlerFunc turns a function with the right signature into a create azure resource group handler -type CreateAzureResourceGroupHandlerFunc func(CreateAzureResourceGroupParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn CreateAzureResourceGroupHandlerFunc) Handle(params CreateAzureResourceGroupParams) middleware.Responder { - return fn(params) -} - -// CreateAzureResourceGroupHandler interface for that can handle valid create azure resource group params -type CreateAzureResourceGroupHandler interface { - Handle(CreateAzureResourceGroupParams) middleware.Responder -} - -// NewCreateAzureResourceGroup creates a new http.Handler for the create azure resource group operation -func NewCreateAzureResourceGroup(ctx *middleware.Context, handler CreateAzureResourceGroupHandler) *CreateAzureResourceGroup { - return &CreateAzureResourceGroup{Context: ctx, Handler: handler} -} - -/* -CreateAzureResourceGroup swagger:route POST /api/providers/azure/resourcegroups azure createAzureResourceGroup - -Create a new Azure resource group -*/ -type CreateAzureResourceGroup struct { - Context *middleware.Context - Handler CreateAzureResourceGroupHandler -} - -func (o *CreateAzureResourceGroup) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewCreateAzureResourceGroupParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_resource_group_parameters.go b/tkg/web/server/restapi/operations/azure/create_azure_resource_group_parameters.go deleted file mode 100644 index 518f10fce6..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_resource_group_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateAzureResourceGroupParams creates a new CreateAzureResourceGroupParams object -// no default values defined in spec. -func NewCreateAzureResourceGroupParams() CreateAzureResourceGroupParams { - - return CreateAzureResourceGroupParams{} -} - -// CreateAzureResourceGroupParams contains all the bound params for the create azure resource group operation -// typically these are obtained from a http.Request -// -// swagger:parameters createAzureResourceGroup -type CreateAzureResourceGroupParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*parameters to create a new Azure resource group - Required: true - In: body - */ - Params *models.AzureResourceGroup -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewCreateAzureResourceGroupParams() beforehand. -func (o *CreateAzureResourceGroupParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.AzureResourceGroup - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_resource_group_responses.go b/tkg/web/server/restapi/operations/azure/create_azure_resource_group_responses.go deleted file mode 100644 index 49ef286949..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_resource_group_responses.go +++ /dev/null @@ -1,192 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateAzureResourceGroupCreatedCode is the HTTP code returned for type CreateAzureResourceGroupCreated -const CreateAzureResourceGroupCreatedCode int = 201 - -/* -CreateAzureResourceGroupCreated Successfully created Azure resource group - -swagger:response createAzureResourceGroupCreated -*/ -type CreateAzureResourceGroupCreated struct { - - /* - In: Body - */ - Payload string `json:"body,omitempty"` -} - -// NewCreateAzureResourceGroupCreated creates CreateAzureResourceGroupCreated with default headers values -func NewCreateAzureResourceGroupCreated() *CreateAzureResourceGroupCreated { - - return &CreateAzureResourceGroupCreated{} -} - -// WithPayload adds the payload to the create azure resource group created response -func (o *CreateAzureResourceGroupCreated) WithPayload(payload string) *CreateAzureResourceGroupCreated { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure resource group created response -func (o *CreateAzureResourceGroupCreated) SetPayload(payload string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureResourceGroupCreated) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(201) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// CreateAzureResourceGroupBadRequestCode is the HTTP code returned for type CreateAzureResourceGroupBadRequest -const CreateAzureResourceGroupBadRequestCode int = 400 - -/* -CreateAzureResourceGroupBadRequest Bad request - -swagger:response createAzureResourceGroupBadRequest -*/ -type CreateAzureResourceGroupBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAzureResourceGroupBadRequest creates CreateAzureResourceGroupBadRequest with default headers values -func NewCreateAzureResourceGroupBadRequest() *CreateAzureResourceGroupBadRequest { - - return &CreateAzureResourceGroupBadRequest{} -} - -// WithPayload adds the payload to the create azure resource group bad request response -func (o *CreateAzureResourceGroupBadRequest) WithPayload(payload *models.Error) *CreateAzureResourceGroupBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure resource group bad request response -func (o *CreateAzureResourceGroupBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureResourceGroupBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CreateAzureResourceGroupUnauthorizedCode is the HTTP code returned for type CreateAzureResourceGroupUnauthorized -const CreateAzureResourceGroupUnauthorizedCode int = 401 - -/* -CreateAzureResourceGroupUnauthorized Incorrect credentials - -swagger:response createAzureResourceGroupUnauthorized -*/ -type CreateAzureResourceGroupUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAzureResourceGroupUnauthorized creates CreateAzureResourceGroupUnauthorized with default headers values -func NewCreateAzureResourceGroupUnauthorized() *CreateAzureResourceGroupUnauthorized { - - return &CreateAzureResourceGroupUnauthorized{} -} - -// WithPayload adds the payload to the create azure resource group unauthorized response -func (o *CreateAzureResourceGroupUnauthorized) WithPayload(payload *models.Error) *CreateAzureResourceGroupUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure resource group unauthorized response -func (o *CreateAzureResourceGroupUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureResourceGroupUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CreateAzureResourceGroupInternalServerErrorCode is the HTTP code returned for type CreateAzureResourceGroupInternalServerError -const CreateAzureResourceGroupInternalServerErrorCode int = 500 - -/* -CreateAzureResourceGroupInternalServerError Internal server error - -swagger:response createAzureResourceGroupInternalServerError -*/ -type CreateAzureResourceGroupInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAzureResourceGroupInternalServerError creates CreateAzureResourceGroupInternalServerError with default headers values -func NewCreateAzureResourceGroupInternalServerError() *CreateAzureResourceGroupInternalServerError { - - return &CreateAzureResourceGroupInternalServerError{} -} - -// WithPayload adds the payload to the create azure resource group internal server error response -func (o *CreateAzureResourceGroupInternalServerError) WithPayload(payload *models.Error) *CreateAzureResourceGroupInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure resource group internal server error response -func (o *CreateAzureResourceGroupInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureResourceGroupInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_resource_group_urlbuilder.go b/tkg/web/server/restapi/operations/azure/create_azure_resource_group_urlbuilder.go deleted file mode 100644 index f60fef10bd..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_resource_group_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// CreateAzureResourceGroupURL generates an URL for the create azure resource group operation -type CreateAzureResourceGroupURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateAzureResourceGroupURL) WithBasePath(bp string) *CreateAzureResourceGroupURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateAzureResourceGroupURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *CreateAzureResourceGroupURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure/resourcegroups" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *CreateAzureResourceGroupURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *CreateAzureResourceGroupURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *CreateAzureResourceGroupURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on CreateAzureResourceGroupURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on CreateAzureResourceGroupURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *CreateAzureResourceGroupURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_virtual_network.go b/tkg/web/server/restapi/operations/azure/create_azure_virtual_network.go deleted file mode 100644 index 043ffde04c..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_virtual_network.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// CreateAzureVirtualNetworkHandlerFunc turns a function with the right signature into a create azure virtual network handler -type CreateAzureVirtualNetworkHandlerFunc func(CreateAzureVirtualNetworkParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn CreateAzureVirtualNetworkHandlerFunc) Handle(params CreateAzureVirtualNetworkParams) middleware.Responder { - return fn(params) -} - -// CreateAzureVirtualNetworkHandler interface for that can handle valid create azure virtual network params -type CreateAzureVirtualNetworkHandler interface { - Handle(CreateAzureVirtualNetworkParams) middleware.Responder -} - -// NewCreateAzureVirtualNetwork creates a new http.Handler for the create azure virtual network operation -func NewCreateAzureVirtualNetwork(ctx *middleware.Context, handler CreateAzureVirtualNetworkHandler) *CreateAzureVirtualNetwork { - return &CreateAzureVirtualNetwork{Context: ctx, Handler: handler} -} - -/* -CreateAzureVirtualNetwork swagger:route POST /api/providers/azure/resourcegroups/{resourceGroupName}/vnets azure createAzureVirtualNetwork - -Create a new Azure Virtual Network -*/ -type CreateAzureVirtualNetwork struct { - Context *middleware.Context - Handler CreateAzureVirtualNetworkHandler -} - -func (o *CreateAzureVirtualNetwork) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewCreateAzureVirtualNetworkParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_virtual_network_parameters.go b/tkg/web/server/restapi/operations/azure/create_azure_virtual_network_parameters.go deleted file mode 100644 index b0e16b347b..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_virtual_network_parameters.go +++ /dev/null @@ -1,104 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - strfmt "github.com/go-openapi/strfmt" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateAzureVirtualNetworkParams creates a new CreateAzureVirtualNetworkParams object -// no default values defined in spec. -func NewCreateAzureVirtualNetworkParams() CreateAzureVirtualNetworkParams { - - return CreateAzureVirtualNetworkParams{} -} - -// CreateAzureVirtualNetworkParams contains all the bound params for the create azure virtual network operation -// typically these are obtained from a http.Request -// -// swagger:parameters createAzureVirtualNetwork -type CreateAzureVirtualNetworkParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*parameters to create a new Azure Virtual network - Required: true - In: body - */ - Params *models.AzureVirtualNetwork - /*Name of the Azure resource group - Required: true - In: path - */ - ResourceGroupName string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewCreateAzureVirtualNetworkParams() beforehand. -func (o *CreateAzureVirtualNetworkParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.AzureVirtualNetwork - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - rResourceGroupName, rhkResourceGroupName, _ := route.Params.GetOK("resourceGroupName") - if err := o.bindResourceGroupName(rResourceGroupName, rhkResourceGroupName, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindResourceGroupName binds and validates parameter ResourceGroupName from path. -func (o *CreateAzureVirtualNetworkParams) bindResourceGroupName(rawData []string, hasKey bool, formats strfmt.Registry) error { - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // Parameter is provided by construction from the route - - o.ResourceGroupName = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_virtual_network_responses.go b/tkg/web/server/restapi/operations/azure/create_azure_virtual_network_responses.go deleted file mode 100644 index 283ece5204..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_virtual_network_responses.go +++ /dev/null @@ -1,192 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateAzureVirtualNetworkCreatedCode is the HTTP code returned for type CreateAzureVirtualNetworkCreated -const CreateAzureVirtualNetworkCreatedCode int = 201 - -/* -CreateAzureVirtualNetworkCreated Successfully created Azure Virtual network - -swagger:response createAzureVirtualNetworkCreated -*/ -type CreateAzureVirtualNetworkCreated struct { - - /* - In: Body - */ - Payload string `json:"body,omitempty"` -} - -// NewCreateAzureVirtualNetworkCreated creates CreateAzureVirtualNetworkCreated with default headers values -func NewCreateAzureVirtualNetworkCreated() *CreateAzureVirtualNetworkCreated { - - return &CreateAzureVirtualNetworkCreated{} -} - -// WithPayload adds the payload to the create azure virtual network created response -func (o *CreateAzureVirtualNetworkCreated) WithPayload(payload string) *CreateAzureVirtualNetworkCreated { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure virtual network created response -func (o *CreateAzureVirtualNetworkCreated) SetPayload(payload string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureVirtualNetworkCreated) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(201) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// CreateAzureVirtualNetworkBadRequestCode is the HTTP code returned for type CreateAzureVirtualNetworkBadRequest -const CreateAzureVirtualNetworkBadRequestCode int = 400 - -/* -CreateAzureVirtualNetworkBadRequest Bad request - -swagger:response createAzureVirtualNetworkBadRequest -*/ -type CreateAzureVirtualNetworkBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAzureVirtualNetworkBadRequest creates CreateAzureVirtualNetworkBadRequest with default headers values -func NewCreateAzureVirtualNetworkBadRequest() *CreateAzureVirtualNetworkBadRequest { - - return &CreateAzureVirtualNetworkBadRequest{} -} - -// WithPayload adds the payload to the create azure virtual network bad request response -func (o *CreateAzureVirtualNetworkBadRequest) WithPayload(payload *models.Error) *CreateAzureVirtualNetworkBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure virtual network bad request response -func (o *CreateAzureVirtualNetworkBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureVirtualNetworkBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CreateAzureVirtualNetworkUnauthorizedCode is the HTTP code returned for type CreateAzureVirtualNetworkUnauthorized -const CreateAzureVirtualNetworkUnauthorizedCode int = 401 - -/* -CreateAzureVirtualNetworkUnauthorized Incorrect credentials - -swagger:response createAzureVirtualNetworkUnauthorized -*/ -type CreateAzureVirtualNetworkUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAzureVirtualNetworkUnauthorized creates CreateAzureVirtualNetworkUnauthorized with default headers values -func NewCreateAzureVirtualNetworkUnauthorized() *CreateAzureVirtualNetworkUnauthorized { - - return &CreateAzureVirtualNetworkUnauthorized{} -} - -// WithPayload adds the payload to the create azure virtual network unauthorized response -func (o *CreateAzureVirtualNetworkUnauthorized) WithPayload(payload *models.Error) *CreateAzureVirtualNetworkUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure virtual network unauthorized response -func (o *CreateAzureVirtualNetworkUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureVirtualNetworkUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CreateAzureVirtualNetworkInternalServerErrorCode is the HTTP code returned for type CreateAzureVirtualNetworkInternalServerError -const CreateAzureVirtualNetworkInternalServerErrorCode int = 500 - -/* -CreateAzureVirtualNetworkInternalServerError Internal server error - -swagger:response createAzureVirtualNetworkInternalServerError -*/ -type CreateAzureVirtualNetworkInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateAzureVirtualNetworkInternalServerError creates CreateAzureVirtualNetworkInternalServerError with default headers values -func NewCreateAzureVirtualNetworkInternalServerError() *CreateAzureVirtualNetworkInternalServerError { - - return &CreateAzureVirtualNetworkInternalServerError{} -} - -// WithPayload adds the payload to the create azure virtual network internal server error response -func (o *CreateAzureVirtualNetworkInternalServerError) WithPayload(payload *models.Error) *CreateAzureVirtualNetworkInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create azure virtual network internal server error response -func (o *CreateAzureVirtualNetworkInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateAzureVirtualNetworkInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/create_azure_virtual_network_urlbuilder.go b/tkg/web/server/restapi/operations/azure/create_azure_virtual_network_urlbuilder.go deleted file mode 100644 index b8374d6401..0000000000 --- a/tkg/web/server/restapi/operations/azure/create_azure_virtual_network_urlbuilder.go +++ /dev/null @@ -1,99 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" - "strings" -) - -// CreateAzureVirtualNetworkURL generates an URL for the create azure virtual network operation -type CreateAzureVirtualNetworkURL struct { - ResourceGroupName string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateAzureVirtualNetworkURL) WithBasePath(bp string) *CreateAzureVirtualNetworkURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateAzureVirtualNetworkURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *CreateAzureVirtualNetworkURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure/resourcegroups/{resourceGroupName}/vnets" - - resourceGroupName := o.ResourceGroupName - if resourceGroupName != "" { - _path = strings.Replace(_path, "{resourceGroupName}", resourceGroupName, -1) - } else { - return nil, errors.New("resourceGroupName is required on CreateAzureVirtualNetworkURL") - } - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *CreateAzureVirtualNetworkURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *CreateAzureVirtualNetworkURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *CreateAzureVirtualNetworkURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on CreateAzureVirtualNetworkURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on CreateAzureVirtualNetworkURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *CreateAzureVirtualNetworkURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure.go b/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure.go deleted file mode 100644 index 750be78528..0000000000 --- a/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ExportTKGConfigForAzureHandlerFunc turns a function with the right signature into a export t k g config for azure handler -type ExportTKGConfigForAzureHandlerFunc func(ExportTKGConfigForAzureParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ExportTKGConfigForAzureHandlerFunc) Handle(params ExportTKGConfigForAzureParams) middleware.Responder { - return fn(params) -} - -// ExportTKGConfigForAzureHandler interface for that can handle valid export t k g config for azure params -type ExportTKGConfigForAzureHandler interface { - Handle(ExportTKGConfigForAzureParams) middleware.Responder -} - -// NewExportTKGConfigForAzure creates a new http.Handler for the export t k g config for azure operation -func NewExportTKGConfigForAzure(ctx *middleware.Context, handler ExportTKGConfigForAzureHandler) *ExportTKGConfigForAzure { - return &ExportTKGConfigForAzure{Context: ctx, Handler: handler} -} - -/* -ExportTKGConfigForAzure swagger:route POST /api/providers/azure/config/export azure exportTKGConfigForAzure - -Generate TKG configuration file for Azure" -*/ -type ExportTKGConfigForAzure struct { - Context *middleware.Context - Handler ExportTKGConfigForAzureHandler -} - -func (o *ExportTKGConfigForAzure) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewExportTKGConfigForAzureParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure_parameters.go b/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure_parameters.go deleted file mode 100644 index 190f59ccb9..0000000000 --- a/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewExportTKGConfigForAzureParams creates a new ExportTKGConfigForAzureParams object -// no default values defined in spec. -func NewExportTKGConfigForAzureParams() ExportTKGConfigForAzureParams { - - return ExportTKGConfigForAzureParams{} -} - -// ExportTKGConfigForAzureParams contains all the bound params for the export t k g config for azure operation -// typically these are obtained from a http.Request -// -// swagger:parameters exportTKGConfigForAzure -type ExportTKGConfigForAzureParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*parameters to generate TKG configuration file for Azure - Required: true - In: body - */ - Params *models.AzureRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewExportTKGConfigForAzureParams() beforehand. -func (o *ExportTKGConfigForAzureParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.AzureRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure_responses.go b/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure_responses.go deleted file mode 100644 index d98a8f89f2..0000000000 --- a/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure_responses.go +++ /dev/null @@ -1,192 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ExportTKGConfigForAzureOKCode is the HTTP code returned for type ExportTKGConfigForAzureOK -const ExportTKGConfigForAzureOKCode int = 200 - -/* -ExportTKGConfigForAzureOK Generated TKG configuration successfully - -swagger:response exportTKGConfigForAzureOK -*/ -type ExportTKGConfigForAzureOK struct { - - /* - In: Body - */ - Payload string `json:"body,omitempty"` -} - -// NewExportTKGConfigForAzureOK creates ExportTKGConfigForAzureOK with default headers values -func NewExportTKGConfigForAzureOK() *ExportTKGConfigForAzureOK { - - return &ExportTKGConfigForAzureOK{} -} - -// WithPayload adds the payload to the export t k g config for azure o k response -func (o *ExportTKGConfigForAzureOK) WithPayload(payload string) *ExportTKGConfigForAzureOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for azure o k response -func (o *ExportTKGConfigForAzureOK) SetPayload(payload string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForAzureOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// ExportTKGConfigForAzureBadRequestCode is the HTTP code returned for type ExportTKGConfigForAzureBadRequest -const ExportTKGConfigForAzureBadRequestCode int = 400 - -/* -ExportTKGConfigForAzureBadRequest Bad request - -swagger:response exportTKGConfigForAzureBadRequest -*/ -type ExportTKGConfigForAzureBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewExportTKGConfigForAzureBadRequest creates ExportTKGConfigForAzureBadRequest with default headers values -func NewExportTKGConfigForAzureBadRequest() *ExportTKGConfigForAzureBadRequest { - - return &ExportTKGConfigForAzureBadRequest{} -} - -// WithPayload adds the payload to the export t k g config for azure bad request response -func (o *ExportTKGConfigForAzureBadRequest) WithPayload(payload *models.Error) *ExportTKGConfigForAzureBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for azure bad request response -func (o *ExportTKGConfigForAzureBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForAzureBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ExportTKGConfigForAzureUnauthorizedCode is the HTTP code returned for type ExportTKGConfigForAzureUnauthorized -const ExportTKGConfigForAzureUnauthorizedCode int = 401 - -/* -ExportTKGConfigForAzureUnauthorized Incorrect credentials - -swagger:response exportTKGConfigForAzureUnauthorized -*/ -type ExportTKGConfigForAzureUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewExportTKGConfigForAzureUnauthorized creates ExportTKGConfigForAzureUnauthorized with default headers values -func NewExportTKGConfigForAzureUnauthorized() *ExportTKGConfigForAzureUnauthorized { - - return &ExportTKGConfigForAzureUnauthorized{} -} - -// WithPayload adds the payload to the export t k g config for azure unauthorized response -func (o *ExportTKGConfigForAzureUnauthorized) WithPayload(payload *models.Error) *ExportTKGConfigForAzureUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for azure unauthorized response -func (o *ExportTKGConfigForAzureUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForAzureUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ExportTKGConfigForAzureInternalServerErrorCode is the HTTP code returned for type ExportTKGConfigForAzureInternalServerError -const ExportTKGConfigForAzureInternalServerErrorCode int = 500 - -/* -ExportTKGConfigForAzureInternalServerError Internal server error - -swagger:response exportTKGConfigForAzureInternalServerError -*/ -type ExportTKGConfigForAzureInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewExportTKGConfigForAzureInternalServerError creates ExportTKGConfigForAzureInternalServerError with default headers values -func NewExportTKGConfigForAzureInternalServerError() *ExportTKGConfigForAzureInternalServerError { - - return &ExportTKGConfigForAzureInternalServerError{} -} - -// WithPayload adds the payload to the export t k g config for azure internal server error response -func (o *ExportTKGConfigForAzureInternalServerError) WithPayload(payload *models.Error) *ExportTKGConfigForAzureInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for azure internal server error response -func (o *ExportTKGConfigForAzureInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForAzureInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure_urlbuilder.go b/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure_urlbuilder.go deleted file mode 100644 index 84d6344073..0000000000 --- a/tkg/web/server/restapi/operations/azure/export_t_k_g_config_for_azure_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ExportTKGConfigForAzureURL generates an URL for the export t k g config for azure operation -type ExportTKGConfigForAzureURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ExportTKGConfigForAzureURL) WithBasePath(bp string) *ExportTKGConfigForAzureURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ExportTKGConfigForAzureURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ExportTKGConfigForAzureURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure/config/export" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ExportTKGConfigForAzureURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ExportTKGConfigForAzureURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ExportTKGConfigForAzureURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ExportTKGConfigForAzureURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ExportTKGConfigForAzureURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ExportTKGConfigForAzureURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_endpoint.go b/tkg/web/server/restapi/operations/azure/get_azure_endpoint.go deleted file mode 100644 index 0744a354a3..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_endpoint.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAzureEndpointHandlerFunc turns a function with the right signature into a get azure endpoint handler -type GetAzureEndpointHandlerFunc func(GetAzureEndpointParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAzureEndpointHandlerFunc) Handle(params GetAzureEndpointParams) middleware.Responder { - return fn(params) -} - -// GetAzureEndpointHandler interface for that can handle valid get azure endpoint params -type GetAzureEndpointHandler interface { - Handle(GetAzureEndpointParams) middleware.Responder -} - -// NewGetAzureEndpoint creates a new http.Handler for the get azure endpoint operation -func NewGetAzureEndpoint(ctx *middleware.Context, handler GetAzureEndpointHandler) *GetAzureEndpoint { - return &GetAzureEndpoint{Context: ctx, Handler: handler} -} - -/* -GetAzureEndpoint swagger:route GET /api/providers/azure azure getAzureEndpoint - -Retrieve azure account params from environment variables -*/ -type GetAzureEndpoint struct { - Context *middleware.Context - Handler GetAzureEndpointHandler -} - -func (o *GetAzureEndpoint) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAzureEndpointParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_endpoint_parameters.go b/tkg/web/server/restapi/operations/azure/get_azure_endpoint_parameters.go deleted file mode 100644 index caa167c131..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_endpoint_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetAzureEndpointParams creates a new GetAzureEndpointParams object -// no default values defined in spec. -func NewGetAzureEndpointParams() GetAzureEndpointParams { - - return GetAzureEndpointParams{} -} - -// GetAzureEndpointParams contains all the bound params for the get azure endpoint operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAzureEndpoint -type GetAzureEndpointParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAzureEndpointParams() beforehand. -func (o *GetAzureEndpointParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_endpoint_responses.go b/tkg/web/server/restapi/operations/azure/get_azure_endpoint_responses.go deleted file mode 100644 index 77744023e2..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_endpoint_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureEndpointOKCode is the HTTP code returned for type GetAzureEndpointOK -const GetAzureEndpointOKCode int = 200 - -/* -GetAzureEndpointOK Successful retrieval of Azure account parameters - -swagger:response getAzureEndpointOK -*/ -type GetAzureEndpointOK struct { - - /* - In: Body - */ - Payload *models.AzureAccountParams `json:"body,omitempty"` -} - -// NewGetAzureEndpointOK creates GetAzureEndpointOK with default headers values -func NewGetAzureEndpointOK() *GetAzureEndpointOK { - - return &GetAzureEndpointOK{} -} - -// WithPayload adds the payload to the get azure endpoint o k response -func (o *GetAzureEndpointOK) WithPayload(payload *models.AzureAccountParams) *GetAzureEndpointOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure endpoint o k response -func (o *GetAzureEndpointOK) SetPayload(payload *models.AzureAccountParams) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureEndpointOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureEndpointBadRequestCode is the HTTP code returned for type GetAzureEndpointBadRequest -const GetAzureEndpointBadRequestCode int = 400 - -/* -GetAzureEndpointBadRequest Bad Request - -swagger:response getAzureEndpointBadRequest -*/ -type GetAzureEndpointBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureEndpointBadRequest creates GetAzureEndpointBadRequest with default headers values -func NewGetAzureEndpointBadRequest() *GetAzureEndpointBadRequest { - - return &GetAzureEndpointBadRequest{} -} - -// WithPayload adds the payload to the get azure endpoint bad request response -func (o *GetAzureEndpointBadRequest) WithPayload(payload *models.Error) *GetAzureEndpointBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure endpoint bad request response -func (o *GetAzureEndpointBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureEndpointBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureEndpointUnauthorizedCode is the HTTP code returned for type GetAzureEndpointUnauthorized -const GetAzureEndpointUnauthorizedCode int = 401 - -/* -GetAzureEndpointUnauthorized Incorrect credentials - -swagger:response getAzureEndpointUnauthorized -*/ -type GetAzureEndpointUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureEndpointUnauthorized creates GetAzureEndpointUnauthorized with default headers values -func NewGetAzureEndpointUnauthorized() *GetAzureEndpointUnauthorized { - - return &GetAzureEndpointUnauthorized{} -} - -// WithPayload adds the payload to the get azure endpoint unauthorized response -func (o *GetAzureEndpointUnauthorized) WithPayload(payload *models.Error) *GetAzureEndpointUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure endpoint unauthorized response -func (o *GetAzureEndpointUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureEndpointUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureEndpointInternalServerErrorCode is the HTTP code returned for type GetAzureEndpointInternalServerError -const GetAzureEndpointInternalServerErrorCode int = 500 - -/* -GetAzureEndpointInternalServerError Internal server error - -swagger:response getAzureEndpointInternalServerError -*/ -type GetAzureEndpointInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureEndpointInternalServerError creates GetAzureEndpointInternalServerError with default headers values -func NewGetAzureEndpointInternalServerError() *GetAzureEndpointInternalServerError { - - return &GetAzureEndpointInternalServerError{} -} - -// WithPayload adds the payload to the get azure endpoint internal server error response -func (o *GetAzureEndpointInternalServerError) WithPayload(payload *models.Error) *GetAzureEndpointInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure endpoint internal server error response -func (o *GetAzureEndpointInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureEndpointInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_endpoint_urlbuilder.go b/tkg/web/server/restapi/operations/azure/get_azure_endpoint_urlbuilder.go deleted file mode 100644 index 35b7435392..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_endpoint_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAzureEndpointURL generates an URL for the get azure endpoint operation -type GetAzureEndpointURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureEndpointURL) WithBasePath(bp string) *GetAzureEndpointURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureEndpointURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAzureEndpointURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAzureEndpointURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAzureEndpointURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAzureEndpointURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAzureEndpointURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAzureEndpointURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAzureEndpointURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_instance_types.go b/tkg/web/server/restapi/operations/azure/get_azure_instance_types.go deleted file mode 100644 index 77115ec50b..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_instance_types.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAzureInstanceTypesHandlerFunc turns a function with the right signature into a get azure instance types handler -type GetAzureInstanceTypesHandlerFunc func(GetAzureInstanceTypesParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAzureInstanceTypesHandlerFunc) Handle(params GetAzureInstanceTypesParams) middleware.Responder { - return fn(params) -} - -// GetAzureInstanceTypesHandler interface for that can handle valid get azure instance types params -type GetAzureInstanceTypesHandler interface { - Handle(GetAzureInstanceTypesParams) middleware.Responder -} - -// NewGetAzureInstanceTypes creates a new http.Handler for the get azure instance types operation -func NewGetAzureInstanceTypes(ctx *middleware.Context, handler GetAzureInstanceTypesHandler) *GetAzureInstanceTypes { - return &GetAzureInstanceTypes{Context: ctx, Handler: handler} -} - -/* -GetAzureInstanceTypes swagger:route GET /api/providers/azure/regions/{location}/instanceTypes azure getAzureInstanceTypes - -Retrieve list of supported Azure instance types for a region -*/ -type GetAzureInstanceTypes struct { - Context *middleware.Context - Handler GetAzureInstanceTypesHandler -} - -func (o *GetAzureInstanceTypes) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAzureInstanceTypesParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_instance_types_parameters.go b/tkg/web/server/restapi/operations/azure/get_azure_instance_types_parameters.go deleted file mode 100644 index b86d92a3df..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_instance_types_parameters.go +++ /dev/null @@ -1,73 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAzureInstanceTypesParams creates a new GetAzureInstanceTypesParams object -// no default values defined in spec. -func NewGetAzureInstanceTypesParams() GetAzureInstanceTypesParams { - - return GetAzureInstanceTypesParams{} -} - -// GetAzureInstanceTypesParams contains all the bound params for the get azure instance types operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAzureInstanceTypes -type GetAzureInstanceTypesParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*Azure region name - Required: true - In: path - */ - Location string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAzureInstanceTypesParams() beforehand. -func (o *GetAzureInstanceTypesParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - rLocation, rhkLocation, _ := route.Params.GetOK("location") - if err := o.bindLocation(rLocation, rhkLocation, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindLocation binds and validates parameter Location from path. -func (o *GetAzureInstanceTypesParams) bindLocation(rawData []string, hasKey bool, formats strfmt.Registry) error { - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // Parameter is provided by construction from the route - - o.Location = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_instance_types_responses.go b/tkg/web/server/restapi/operations/azure/get_azure_instance_types_responses.go deleted file mode 100644 index af3bdf5211..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_instance_types_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureInstanceTypesOKCode is the HTTP code returned for type GetAzureInstanceTypesOK -const GetAzureInstanceTypesOKCode int = 200 - -/* -GetAzureInstanceTypesOK Successful retrieval of Azure instance Types - -swagger:response getAzureInstanceTypesOK -*/ -type GetAzureInstanceTypesOK struct { - - /* - In: Body - */ - Payload []*models.AzureInstanceType `json:"body,omitempty"` -} - -// NewGetAzureInstanceTypesOK creates GetAzureInstanceTypesOK with default headers values -func NewGetAzureInstanceTypesOK() *GetAzureInstanceTypesOK { - - return &GetAzureInstanceTypesOK{} -} - -// WithPayload adds the payload to the get azure instance types o k response -func (o *GetAzureInstanceTypesOK) WithPayload(payload []*models.AzureInstanceType) *GetAzureInstanceTypesOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure instance types o k response -func (o *GetAzureInstanceTypesOK) SetPayload(payload []*models.AzureInstanceType) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureInstanceTypesOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.AzureInstanceType, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAzureInstanceTypesBadRequestCode is the HTTP code returned for type GetAzureInstanceTypesBadRequest -const GetAzureInstanceTypesBadRequestCode int = 400 - -/* -GetAzureInstanceTypesBadRequest Bad Request - -swagger:response getAzureInstanceTypesBadRequest -*/ -type GetAzureInstanceTypesBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureInstanceTypesBadRequest creates GetAzureInstanceTypesBadRequest with default headers values -func NewGetAzureInstanceTypesBadRequest() *GetAzureInstanceTypesBadRequest { - - return &GetAzureInstanceTypesBadRequest{} -} - -// WithPayload adds the payload to the get azure instance types bad request response -func (o *GetAzureInstanceTypesBadRequest) WithPayload(payload *models.Error) *GetAzureInstanceTypesBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure instance types bad request response -func (o *GetAzureInstanceTypesBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureInstanceTypesBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureInstanceTypesUnauthorizedCode is the HTTP code returned for type GetAzureInstanceTypesUnauthorized -const GetAzureInstanceTypesUnauthorizedCode int = 401 - -/* -GetAzureInstanceTypesUnauthorized Incorrect credentials - -swagger:response getAzureInstanceTypesUnauthorized -*/ -type GetAzureInstanceTypesUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureInstanceTypesUnauthorized creates GetAzureInstanceTypesUnauthorized with default headers values -func NewGetAzureInstanceTypesUnauthorized() *GetAzureInstanceTypesUnauthorized { - - return &GetAzureInstanceTypesUnauthorized{} -} - -// WithPayload adds the payload to the get azure instance types unauthorized response -func (o *GetAzureInstanceTypesUnauthorized) WithPayload(payload *models.Error) *GetAzureInstanceTypesUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure instance types unauthorized response -func (o *GetAzureInstanceTypesUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureInstanceTypesUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureInstanceTypesInternalServerErrorCode is the HTTP code returned for type GetAzureInstanceTypesInternalServerError -const GetAzureInstanceTypesInternalServerErrorCode int = 500 - -/* -GetAzureInstanceTypesInternalServerError Internal server error - -swagger:response getAzureInstanceTypesInternalServerError -*/ -type GetAzureInstanceTypesInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureInstanceTypesInternalServerError creates GetAzureInstanceTypesInternalServerError with default headers values -func NewGetAzureInstanceTypesInternalServerError() *GetAzureInstanceTypesInternalServerError { - - return &GetAzureInstanceTypesInternalServerError{} -} - -// WithPayload adds the payload to the get azure instance types internal server error response -func (o *GetAzureInstanceTypesInternalServerError) WithPayload(payload *models.Error) *GetAzureInstanceTypesInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure instance types internal server error response -func (o *GetAzureInstanceTypesInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureInstanceTypesInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_instance_types_urlbuilder.go b/tkg/web/server/restapi/operations/azure/get_azure_instance_types_urlbuilder.go deleted file mode 100644 index d619d8e3d4..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_instance_types_urlbuilder.go +++ /dev/null @@ -1,99 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" - "strings" -) - -// GetAzureInstanceTypesURL generates an URL for the get azure instance types operation -type GetAzureInstanceTypesURL struct { - Location string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureInstanceTypesURL) WithBasePath(bp string) *GetAzureInstanceTypesURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureInstanceTypesURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAzureInstanceTypesURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure/regions/{location}/instanceTypes" - - location := o.Location - if location != "" { - _path = strings.Replace(_path, "{location}", location, -1) - } else { - return nil, errors.New("location is required on GetAzureInstanceTypesURL") - } - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAzureInstanceTypesURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAzureInstanceTypesURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAzureInstanceTypesURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAzureInstanceTypesURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAzureInstanceTypesURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAzureInstanceTypesURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_o_s_images.go b/tkg/web/server/restapi/operations/azure/get_azure_o_s_images.go deleted file mode 100644 index 5043e422e1..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_o_s_images.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAzureOSImagesHandlerFunc turns a function with the right signature into a get azure o s images handler -type GetAzureOSImagesHandlerFunc func(GetAzureOSImagesParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAzureOSImagesHandlerFunc) Handle(params GetAzureOSImagesParams) middleware.Responder { - return fn(params) -} - -// GetAzureOSImagesHandler interface for that can handle valid get azure o s images params -type GetAzureOSImagesHandler interface { - Handle(GetAzureOSImagesParams) middleware.Responder -} - -// NewGetAzureOSImages creates a new http.Handler for the get azure o s images operation -func NewGetAzureOSImages(ctx *middleware.Context, handler GetAzureOSImagesHandler) *GetAzureOSImages { - return &GetAzureOSImages{Context: ctx, Handler: handler} -} - -/* -GetAzureOSImages swagger:route GET /api/providers/azure/osimages azure getAzureOSImages - -Retrieve Azure supported os images -*/ -type GetAzureOSImages struct { - Context *middleware.Context - Handler GetAzureOSImagesHandler -} - -func (o *GetAzureOSImages) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAzureOSImagesParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_o_s_images_parameters.go b/tkg/web/server/restapi/operations/azure/get_azure_o_s_images_parameters.go deleted file mode 100644 index 356e02f433..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_o_s_images_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetAzureOSImagesParams creates a new GetAzureOSImagesParams object -// no default values defined in spec. -func NewGetAzureOSImagesParams() GetAzureOSImagesParams { - - return GetAzureOSImagesParams{} -} - -// GetAzureOSImagesParams contains all the bound params for the get azure o s images operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAzureOSImages -type GetAzureOSImagesParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAzureOSImagesParams() beforehand. -func (o *GetAzureOSImagesParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_o_s_images_responses.go b/tkg/web/server/restapi/operations/azure/get_azure_o_s_images_responses.go deleted file mode 100644 index 76ec35f37b..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_o_s_images_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureOSImagesOKCode is the HTTP code returned for type GetAzureOSImagesOK -const GetAzureOSImagesOKCode int = 200 - -/* -GetAzureOSImagesOK Successful retrieval of Azure supported os images - -swagger:response getAzureOSImagesOK -*/ -type GetAzureOSImagesOK struct { - - /* - In: Body - */ - Payload []*models.AzureVirtualMachine `json:"body,omitempty"` -} - -// NewGetAzureOSImagesOK creates GetAzureOSImagesOK with default headers values -func NewGetAzureOSImagesOK() *GetAzureOSImagesOK { - - return &GetAzureOSImagesOK{} -} - -// WithPayload adds the payload to the get azure o s images o k response -func (o *GetAzureOSImagesOK) WithPayload(payload []*models.AzureVirtualMachine) *GetAzureOSImagesOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure o s images o k response -func (o *GetAzureOSImagesOK) SetPayload(payload []*models.AzureVirtualMachine) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureOSImagesOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.AzureVirtualMachine, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAzureOSImagesBadRequestCode is the HTTP code returned for type GetAzureOSImagesBadRequest -const GetAzureOSImagesBadRequestCode int = 400 - -/* -GetAzureOSImagesBadRequest Bad request - -swagger:response getAzureOSImagesBadRequest -*/ -type GetAzureOSImagesBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureOSImagesBadRequest creates GetAzureOSImagesBadRequest with default headers values -func NewGetAzureOSImagesBadRequest() *GetAzureOSImagesBadRequest { - - return &GetAzureOSImagesBadRequest{} -} - -// WithPayload adds the payload to the get azure o s images bad request response -func (o *GetAzureOSImagesBadRequest) WithPayload(payload *models.Error) *GetAzureOSImagesBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure o s images bad request response -func (o *GetAzureOSImagesBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureOSImagesBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureOSImagesUnauthorizedCode is the HTTP code returned for type GetAzureOSImagesUnauthorized -const GetAzureOSImagesUnauthorizedCode int = 401 - -/* -GetAzureOSImagesUnauthorized Incorrect credentials - -swagger:response getAzureOSImagesUnauthorized -*/ -type GetAzureOSImagesUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureOSImagesUnauthorized creates GetAzureOSImagesUnauthorized with default headers values -func NewGetAzureOSImagesUnauthorized() *GetAzureOSImagesUnauthorized { - - return &GetAzureOSImagesUnauthorized{} -} - -// WithPayload adds the payload to the get azure o s images unauthorized response -func (o *GetAzureOSImagesUnauthorized) WithPayload(payload *models.Error) *GetAzureOSImagesUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure o s images unauthorized response -func (o *GetAzureOSImagesUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureOSImagesUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureOSImagesInternalServerErrorCode is the HTTP code returned for type GetAzureOSImagesInternalServerError -const GetAzureOSImagesInternalServerErrorCode int = 500 - -/* -GetAzureOSImagesInternalServerError Internal server error - -swagger:response getAzureOSImagesInternalServerError -*/ -type GetAzureOSImagesInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureOSImagesInternalServerError creates GetAzureOSImagesInternalServerError with default headers values -func NewGetAzureOSImagesInternalServerError() *GetAzureOSImagesInternalServerError { - - return &GetAzureOSImagesInternalServerError{} -} - -// WithPayload adds the payload to the get azure o s images internal server error response -func (o *GetAzureOSImagesInternalServerError) WithPayload(payload *models.Error) *GetAzureOSImagesInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure o s images internal server error response -func (o *GetAzureOSImagesInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureOSImagesInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_o_s_images_urlbuilder.go b/tkg/web/server/restapi/operations/azure/get_azure_o_s_images_urlbuilder.go deleted file mode 100644 index da8eb5eaf1..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_o_s_images_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAzureOSImagesURL generates an URL for the get azure o s images operation -type GetAzureOSImagesURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureOSImagesURL) WithBasePath(bp string) *GetAzureOSImagesURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureOSImagesURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAzureOSImagesURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure/osimages" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAzureOSImagesURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAzureOSImagesURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAzureOSImagesURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAzureOSImagesURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAzureOSImagesURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAzureOSImagesURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_regions.go b/tkg/web/server/restapi/operations/azure/get_azure_regions.go deleted file mode 100644 index 7339477e2e..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_regions.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAzureRegionsHandlerFunc turns a function with the right signature into a get azure regions handler -type GetAzureRegionsHandlerFunc func(GetAzureRegionsParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAzureRegionsHandlerFunc) Handle(params GetAzureRegionsParams) middleware.Responder { - return fn(params) -} - -// GetAzureRegionsHandler interface for that can handle valid get azure regions params -type GetAzureRegionsHandler interface { - Handle(GetAzureRegionsParams) middleware.Responder -} - -// NewGetAzureRegions creates a new http.Handler for the get azure regions operation -func NewGetAzureRegions(ctx *middleware.Context, handler GetAzureRegionsHandler) *GetAzureRegions { - return &GetAzureRegions{Context: ctx, Handler: handler} -} - -/* -GetAzureRegions swagger:route GET /api/providers/azure/regions azure getAzureRegions - -Retrieve list of supported Azure regions -*/ -type GetAzureRegions struct { - Context *middleware.Context - Handler GetAzureRegionsHandler -} - -func (o *GetAzureRegions) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAzureRegionsParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_regions_parameters.go b/tkg/web/server/restapi/operations/azure/get_azure_regions_parameters.go deleted file mode 100644 index e0ff261285..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_regions_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetAzureRegionsParams creates a new GetAzureRegionsParams object -// no default values defined in spec. -func NewGetAzureRegionsParams() GetAzureRegionsParams { - - return GetAzureRegionsParams{} -} - -// GetAzureRegionsParams contains all the bound params for the get azure regions operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAzureRegions -type GetAzureRegionsParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAzureRegionsParams() beforehand. -func (o *GetAzureRegionsParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_regions_responses.go b/tkg/web/server/restapi/operations/azure/get_azure_regions_responses.go deleted file mode 100644 index 14741b5e06..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_regions_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureRegionsOKCode is the HTTP code returned for type GetAzureRegionsOK -const GetAzureRegionsOKCode int = 200 - -/* -GetAzureRegionsOK Successful retrieval of Azure regions - -swagger:response getAzureRegionsOK -*/ -type GetAzureRegionsOK struct { - - /* - In: Body - */ - Payload []*models.AzureLocation `json:"body,omitempty"` -} - -// NewGetAzureRegionsOK creates GetAzureRegionsOK with default headers values -func NewGetAzureRegionsOK() *GetAzureRegionsOK { - - return &GetAzureRegionsOK{} -} - -// WithPayload adds the payload to the get azure regions o k response -func (o *GetAzureRegionsOK) WithPayload(payload []*models.AzureLocation) *GetAzureRegionsOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure regions o k response -func (o *GetAzureRegionsOK) SetPayload(payload []*models.AzureLocation) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureRegionsOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.AzureLocation, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAzureRegionsBadRequestCode is the HTTP code returned for type GetAzureRegionsBadRequest -const GetAzureRegionsBadRequestCode int = 400 - -/* -GetAzureRegionsBadRequest Bad Request - -swagger:response getAzureRegionsBadRequest -*/ -type GetAzureRegionsBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureRegionsBadRequest creates GetAzureRegionsBadRequest with default headers values -func NewGetAzureRegionsBadRequest() *GetAzureRegionsBadRequest { - - return &GetAzureRegionsBadRequest{} -} - -// WithPayload adds the payload to the get azure regions bad request response -func (o *GetAzureRegionsBadRequest) WithPayload(payload *models.Error) *GetAzureRegionsBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure regions bad request response -func (o *GetAzureRegionsBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureRegionsBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureRegionsUnauthorizedCode is the HTTP code returned for type GetAzureRegionsUnauthorized -const GetAzureRegionsUnauthorizedCode int = 401 - -/* -GetAzureRegionsUnauthorized Incorrect credentials - -swagger:response getAzureRegionsUnauthorized -*/ -type GetAzureRegionsUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureRegionsUnauthorized creates GetAzureRegionsUnauthorized with default headers values -func NewGetAzureRegionsUnauthorized() *GetAzureRegionsUnauthorized { - - return &GetAzureRegionsUnauthorized{} -} - -// WithPayload adds the payload to the get azure regions unauthorized response -func (o *GetAzureRegionsUnauthorized) WithPayload(payload *models.Error) *GetAzureRegionsUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure regions unauthorized response -func (o *GetAzureRegionsUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureRegionsUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureRegionsInternalServerErrorCode is the HTTP code returned for type GetAzureRegionsInternalServerError -const GetAzureRegionsInternalServerErrorCode int = 500 - -/* -GetAzureRegionsInternalServerError Internal server error - -swagger:response getAzureRegionsInternalServerError -*/ -type GetAzureRegionsInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureRegionsInternalServerError creates GetAzureRegionsInternalServerError with default headers values -func NewGetAzureRegionsInternalServerError() *GetAzureRegionsInternalServerError { - - return &GetAzureRegionsInternalServerError{} -} - -// WithPayload adds the payload to the get azure regions internal server error response -func (o *GetAzureRegionsInternalServerError) WithPayload(payload *models.Error) *GetAzureRegionsInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure regions internal server error response -func (o *GetAzureRegionsInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureRegionsInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_regions_urlbuilder.go b/tkg/web/server/restapi/operations/azure/get_azure_regions_urlbuilder.go deleted file mode 100644 index 2b62a62295..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_regions_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAzureRegionsURL generates an URL for the get azure regions operation -type GetAzureRegionsURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureRegionsURL) WithBasePath(bp string) *GetAzureRegionsURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureRegionsURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAzureRegionsURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure/regions" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAzureRegionsURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAzureRegionsURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAzureRegionsURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAzureRegionsURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAzureRegionsURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAzureRegionsURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_resource_groups.go b/tkg/web/server/restapi/operations/azure/get_azure_resource_groups.go deleted file mode 100644 index 4920bca108..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_resource_groups.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAzureResourceGroupsHandlerFunc turns a function with the right signature into a get azure resource groups handler -type GetAzureResourceGroupsHandlerFunc func(GetAzureResourceGroupsParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAzureResourceGroupsHandlerFunc) Handle(params GetAzureResourceGroupsParams) middleware.Responder { - return fn(params) -} - -// GetAzureResourceGroupsHandler interface for that can handle valid get azure resource groups params -type GetAzureResourceGroupsHandler interface { - Handle(GetAzureResourceGroupsParams) middleware.Responder -} - -// NewGetAzureResourceGroups creates a new http.Handler for the get azure resource groups operation -func NewGetAzureResourceGroups(ctx *middleware.Context, handler GetAzureResourceGroupsHandler) *GetAzureResourceGroups { - return &GetAzureResourceGroups{Context: ctx, Handler: handler} -} - -/* -GetAzureResourceGroups swagger:route GET /api/providers/azure/resourcegroups azure getAzureResourceGroups - -Retrieve list of Azure resource groups for a subscription -*/ -type GetAzureResourceGroups struct { - Context *middleware.Context - Handler GetAzureResourceGroupsHandler -} - -func (o *GetAzureResourceGroups) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAzureResourceGroupsParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_resource_groups_parameters.go b/tkg/web/server/restapi/operations/azure/get_azure_resource_groups_parameters.go deleted file mode 100644 index 6f9a02f19c..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_resource_groups_parameters.go +++ /dev/null @@ -1,83 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - "github.com/go-openapi/validate" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAzureResourceGroupsParams creates a new GetAzureResourceGroupsParams object -// no default values defined in spec. -func NewGetAzureResourceGroupsParams() GetAzureResourceGroupsParams { - - return GetAzureResourceGroupsParams{} -} - -// GetAzureResourceGroupsParams contains all the bound params for the get azure resource groups operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAzureResourceGroups -type GetAzureResourceGroupsParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*Azure region - Required: true - In: query - */ - Location string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAzureResourceGroupsParams() beforehand. -func (o *GetAzureResourceGroupsParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qLocation, qhkLocation, _ := qs.GetOK("location") - if err := o.bindLocation(qLocation, qhkLocation, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindLocation binds and validates parameter Location from query. -func (o *GetAzureResourceGroupsParams) bindLocation(rawData []string, hasKey bool, formats strfmt.Registry) error { - if !hasKey { - return errors.Required("location", "query") - } - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // AllowEmptyValue: false - if err := validate.RequiredString("location", "query", raw); err != nil { - return err - } - - o.Location = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_resource_groups_responses.go b/tkg/web/server/restapi/operations/azure/get_azure_resource_groups_responses.go deleted file mode 100644 index 4c17ef5297..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_resource_groups_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureResourceGroupsOKCode is the HTTP code returned for type GetAzureResourceGroupsOK -const GetAzureResourceGroupsOKCode int = 200 - -/* -GetAzureResourceGroupsOK Successful retrieval of Azure resource groups - -swagger:response getAzureResourceGroupsOK -*/ -type GetAzureResourceGroupsOK struct { - - /* - In: Body - */ - Payload []*models.AzureResourceGroup `json:"body,omitempty"` -} - -// NewGetAzureResourceGroupsOK creates GetAzureResourceGroupsOK with default headers values -func NewGetAzureResourceGroupsOK() *GetAzureResourceGroupsOK { - - return &GetAzureResourceGroupsOK{} -} - -// WithPayload adds the payload to the get azure resource groups o k response -func (o *GetAzureResourceGroupsOK) WithPayload(payload []*models.AzureResourceGroup) *GetAzureResourceGroupsOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure resource groups o k response -func (o *GetAzureResourceGroupsOK) SetPayload(payload []*models.AzureResourceGroup) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureResourceGroupsOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.AzureResourceGroup, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAzureResourceGroupsBadRequestCode is the HTTP code returned for type GetAzureResourceGroupsBadRequest -const GetAzureResourceGroupsBadRequestCode int = 400 - -/* -GetAzureResourceGroupsBadRequest Bad Request - -swagger:response getAzureResourceGroupsBadRequest -*/ -type GetAzureResourceGroupsBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureResourceGroupsBadRequest creates GetAzureResourceGroupsBadRequest with default headers values -func NewGetAzureResourceGroupsBadRequest() *GetAzureResourceGroupsBadRequest { - - return &GetAzureResourceGroupsBadRequest{} -} - -// WithPayload adds the payload to the get azure resource groups bad request response -func (o *GetAzureResourceGroupsBadRequest) WithPayload(payload *models.Error) *GetAzureResourceGroupsBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure resource groups bad request response -func (o *GetAzureResourceGroupsBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureResourceGroupsBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureResourceGroupsUnauthorizedCode is the HTTP code returned for type GetAzureResourceGroupsUnauthorized -const GetAzureResourceGroupsUnauthorizedCode int = 401 - -/* -GetAzureResourceGroupsUnauthorized Incorrect credentials - -swagger:response getAzureResourceGroupsUnauthorized -*/ -type GetAzureResourceGroupsUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureResourceGroupsUnauthorized creates GetAzureResourceGroupsUnauthorized with default headers values -func NewGetAzureResourceGroupsUnauthorized() *GetAzureResourceGroupsUnauthorized { - - return &GetAzureResourceGroupsUnauthorized{} -} - -// WithPayload adds the payload to the get azure resource groups unauthorized response -func (o *GetAzureResourceGroupsUnauthorized) WithPayload(payload *models.Error) *GetAzureResourceGroupsUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure resource groups unauthorized response -func (o *GetAzureResourceGroupsUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureResourceGroupsUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureResourceGroupsInternalServerErrorCode is the HTTP code returned for type GetAzureResourceGroupsInternalServerError -const GetAzureResourceGroupsInternalServerErrorCode int = 500 - -/* -GetAzureResourceGroupsInternalServerError Internal server error - -swagger:response getAzureResourceGroupsInternalServerError -*/ -type GetAzureResourceGroupsInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureResourceGroupsInternalServerError creates GetAzureResourceGroupsInternalServerError with default headers values -func NewGetAzureResourceGroupsInternalServerError() *GetAzureResourceGroupsInternalServerError { - - return &GetAzureResourceGroupsInternalServerError{} -} - -// WithPayload adds the payload to the get azure resource groups internal server error response -func (o *GetAzureResourceGroupsInternalServerError) WithPayload(payload *models.Error) *GetAzureResourceGroupsInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure resource groups internal server error response -func (o *GetAzureResourceGroupsInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureResourceGroupsInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_resource_groups_urlbuilder.go b/tkg/web/server/restapi/operations/azure/get_azure_resource_groups_urlbuilder.go deleted file mode 100644 index af731ecb39..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_resource_groups_urlbuilder.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetAzureResourceGroupsURL generates an URL for the get azure resource groups operation -type GetAzureResourceGroupsURL struct { - Location string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureResourceGroupsURL) WithBasePath(bp string) *GetAzureResourceGroupsURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureResourceGroupsURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAzureResourceGroupsURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure/resourcegroups" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - locationQ := o.Location - if locationQ != "" { - qs.Set("location", locationQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAzureResourceGroupsURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAzureResourceGroupsURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAzureResourceGroupsURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAzureResourceGroupsURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAzureResourceGroupsURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAzureResourceGroupsURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_vnets.go b/tkg/web/server/restapi/operations/azure/get_azure_vnets.go deleted file mode 100644 index 59c0ae5529..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_vnets.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetAzureVnetsHandlerFunc turns a function with the right signature into a get azure vnets handler -type GetAzureVnetsHandlerFunc func(GetAzureVnetsParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetAzureVnetsHandlerFunc) Handle(params GetAzureVnetsParams) middleware.Responder { - return fn(params) -} - -// GetAzureVnetsHandler interface for that can handle valid get azure vnets params -type GetAzureVnetsHandler interface { - Handle(GetAzureVnetsParams) middleware.Responder -} - -// NewGetAzureVnets creates a new http.Handler for the get azure vnets operation -func NewGetAzureVnets(ctx *middleware.Context, handler GetAzureVnetsHandler) *GetAzureVnets { - return &GetAzureVnets{Context: ctx, Handler: handler} -} - -/* -GetAzureVnets swagger:route GET /api/providers/azure/resourcegroups/{resourceGroupName}/vnets azure getAzureVnets - -Retrieve list of Azure virtual networks in a resource group -*/ -type GetAzureVnets struct { - Context *middleware.Context - Handler GetAzureVnetsHandler -} - -func (o *GetAzureVnets) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetAzureVnetsParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_vnets_parameters.go b/tkg/web/server/restapi/operations/azure/get_azure_vnets_parameters.go deleted file mode 100644 index 451d8a4fea..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_vnets_parameters.go +++ /dev/null @@ -1,108 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - "github.com/go-openapi/validate" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetAzureVnetsParams creates a new GetAzureVnetsParams object -// no default values defined in spec. -func NewGetAzureVnetsParams() GetAzureVnetsParams { - - return GetAzureVnetsParams{} -} - -// GetAzureVnetsParams contains all the bound params for the get azure vnets operation -// typically these are obtained from a http.Request -// -// swagger:parameters getAzureVnets -type GetAzureVnetsParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*Azure region - Required: true - In: query - */ - Location string - /*Name of the Azure resource group - Required: true - In: path - */ - ResourceGroupName string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetAzureVnetsParams() beforehand. -func (o *GetAzureVnetsParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qLocation, qhkLocation, _ := qs.GetOK("location") - if err := o.bindLocation(qLocation, qhkLocation, route.Formats); err != nil { - res = append(res, err) - } - - rResourceGroupName, rhkResourceGroupName, _ := route.Params.GetOK("resourceGroupName") - if err := o.bindResourceGroupName(rResourceGroupName, rhkResourceGroupName, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindLocation binds and validates parameter Location from query. -func (o *GetAzureVnetsParams) bindLocation(rawData []string, hasKey bool, formats strfmt.Registry) error { - if !hasKey { - return errors.Required("location", "query") - } - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // AllowEmptyValue: false - if err := validate.RequiredString("location", "query", raw); err != nil { - return err - } - - o.Location = raw - - return nil -} - -// bindResourceGroupName binds and validates parameter ResourceGroupName from path. -func (o *GetAzureVnetsParams) bindResourceGroupName(rawData []string, hasKey bool, formats strfmt.Registry) error { - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // Parameter is provided by construction from the route - - o.ResourceGroupName = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_vnets_responses.go b/tkg/web/server/restapi/operations/azure/get_azure_vnets_responses.go deleted file mode 100644 index 72dab1bc5e..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_vnets_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetAzureVnetsOKCode is the HTTP code returned for type GetAzureVnetsOK -const GetAzureVnetsOKCode int = 200 - -/* -GetAzureVnetsOK Successful retrieval of Azure virtual networks - -swagger:response getAzureVnetsOK -*/ -type GetAzureVnetsOK struct { - - /* - In: Body - */ - Payload []*models.AzureVirtualNetwork `json:"body,omitempty"` -} - -// NewGetAzureVnetsOK creates GetAzureVnetsOK with default headers values -func NewGetAzureVnetsOK() *GetAzureVnetsOK { - - return &GetAzureVnetsOK{} -} - -// WithPayload adds the payload to the get azure vnets o k response -func (o *GetAzureVnetsOK) WithPayload(payload []*models.AzureVirtualNetwork) *GetAzureVnetsOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure vnets o k response -func (o *GetAzureVnetsOK) SetPayload(payload []*models.AzureVirtualNetwork) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureVnetsOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.AzureVirtualNetwork, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetAzureVnetsBadRequestCode is the HTTP code returned for type GetAzureVnetsBadRequest -const GetAzureVnetsBadRequestCode int = 400 - -/* -GetAzureVnetsBadRequest Bad Request - -swagger:response getAzureVnetsBadRequest -*/ -type GetAzureVnetsBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureVnetsBadRequest creates GetAzureVnetsBadRequest with default headers values -func NewGetAzureVnetsBadRequest() *GetAzureVnetsBadRequest { - - return &GetAzureVnetsBadRequest{} -} - -// WithPayload adds the payload to the get azure vnets bad request response -func (o *GetAzureVnetsBadRequest) WithPayload(payload *models.Error) *GetAzureVnetsBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure vnets bad request response -func (o *GetAzureVnetsBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureVnetsBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureVnetsUnauthorizedCode is the HTTP code returned for type GetAzureVnetsUnauthorized -const GetAzureVnetsUnauthorizedCode int = 401 - -/* -GetAzureVnetsUnauthorized Incorrect credentials - -swagger:response getAzureVnetsUnauthorized -*/ -type GetAzureVnetsUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureVnetsUnauthorized creates GetAzureVnetsUnauthorized with default headers values -func NewGetAzureVnetsUnauthorized() *GetAzureVnetsUnauthorized { - - return &GetAzureVnetsUnauthorized{} -} - -// WithPayload adds the payload to the get azure vnets unauthorized response -func (o *GetAzureVnetsUnauthorized) WithPayload(payload *models.Error) *GetAzureVnetsUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure vnets unauthorized response -func (o *GetAzureVnetsUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureVnetsUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetAzureVnetsInternalServerErrorCode is the HTTP code returned for type GetAzureVnetsInternalServerError -const GetAzureVnetsInternalServerErrorCode int = 500 - -/* -GetAzureVnetsInternalServerError Internal server error - -swagger:response getAzureVnetsInternalServerError -*/ -type GetAzureVnetsInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetAzureVnetsInternalServerError creates GetAzureVnetsInternalServerError with default headers values -func NewGetAzureVnetsInternalServerError() *GetAzureVnetsInternalServerError { - - return &GetAzureVnetsInternalServerError{} -} - -// WithPayload adds the payload to the get azure vnets internal server error response -func (o *GetAzureVnetsInternalServerError) WithPayload(payload *models.Error) *GetAzureVnetsInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get azure vnets internal server error response -func (o *GetAzureVnetsInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetAzureVnetsInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/get_azure_vnets_urlbuilder.go b/tkg/web/server/restapi/operations/azure/get_azure_vnets_urlbuilder.go deleted file mode 100644 index a727bb5104..0000000000 --- a/tkg/web/server/restapi/operations/azure/get_azure_vnets_urlbuilder.go +++ /dev/null @@ -1,110 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" - "strings" -) - -// GetAzureVnetsURL generates an URL for the get azure vnets operation -type GetAzureVnetsURL struct { - ResourceGroupName string - - Location string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureVnetsURL) WithBasePath(bp string) *GetAzureVnetsURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetAzureVnetsURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetAzureVnetsURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure/resourcegroups/{resourceGroupName}/vnets" - - resourceGroupName := o.ResourceGroupName - if resourceGroupName != "" { - _path = strings.Replace(_path, "{resourceGroupName}", resourceGroupName, -1) - } else { - return nil, errors.New("resourceGroupName is required on GetAzureVnetsURL") - } - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - locationQ := o.Location - if locationQ != "" { - qs.Set("location", locationQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetAzureVnetsURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetAzureVnetsURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetAzureVnetsURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetAzureVnetsURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetAzureVnetsURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetAzureVnetsURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure.go b/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure.go deleted file mode 100644 index 738485249e..0000000000 --- a/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ImportTKGConfigForAzureHandlerFunc turns a function with the right signature into a import t k g config for azure handler -type ImportTKGConfigForAzureHandlerFunc func(ImportTKGConfigForAzureParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ImportTKGConfigForAzureHandlerFunc) Handle(params ImportTKGConfigForAzureParams) middleware.Responder { - return fn(params) -} - -// ImportTKGConfigForAzureHandler interface for that can handle valid import t k g config for azure params -type ImportTKGConfigForAzureHandler interface { - Handle(ImportTKGConfigForAzureParams) middleware.Responder -} - -// NewImportTKGConfigForAzure creates a new http.Handler for the import t k g config for azure operation -func NewImportTKGConfigForAzure(ctx *middleware.Context, handler ImportTKGConfigForAzureHandler) *ImportTKGConfigForAzure { - return &ImportTKGConfigForAzure{Context: ctx, Handler: handler} -} - -/* -ImportTKGConfigForAzure swagger:route POST /api/providers/azure/config/import azure importTKGConfigForAzure - -Generate TKG configuration object for azure -*/ -type ImportTKGConfigForAzure struct { - Context *middleware.Context - Handler ImportTKGConfigForAzureHandler -} - -func (o *ImportTKGConfigForAzure) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewImportTKGConfigForAzureParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure_parameters.go b/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure_parameters.go deleted file mode 100644 index 37c90dd0e8..0000000000 --- a/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewImportTKGConfigForAzureParams creates a new ImportTKGConfigForAzureParams object -// no default values defined in spec. -func NewImportTKGConfigForAzureParams() ImportTKGConfigForAzureParams { - - return ImportTKGConfigForAzureParams{} -} - -// ImportTKGConfigForAzureParams contains all the bound params for the import t k g config for azure operation -// typically these are obtained from a http.Request -// -// swagger:parameters importTKGConfigForAzure -type ImportTKGConfigForAzureParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*config file from which to generate tkg configuration for azure - Required: true - In: body - */ - Params *models.ConfigFile -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewImportTKGConfigForAzureParams() beforehand. -func (o *ImportTKGConfigForAzureParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.ConfigFile - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure_responses.go b/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure_responses.go deleted file mode 100644 index a2406c59db..0000000000 --- a/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ImportTKGConfigForAzureOKCode is the HTTP code returned for type ImportTKGConfigForAzureOK -const ImportTKGConfigForAzureOKCode int = 200 - -/* -ImportTKGConfigForAzureOK Generated TKG configuration successfully - -swagger:response importTKGConfigForAzureOK -*/ -type ImportTKGConfigForAzureOK struct { - - /* - In: Body - */ - Payload *models.AzureRegionalClusterParams `json:"body,omitempty"` -} - -// NewImportTKGConfigForAzureOK creates ImportTKGConfigForAzureOK with default headers values -func NewImportTKGConfigForAzureOK() *ImportTKGConfigForAzureOK { - - return &ImportTKGConfigForAzureOK{} -} - -// WithPayload adds the payload to the import t k g config for azure o k response -func (o *ImportTKGConfigForAzureOK) WithPayload(payload *models.AzureRegionalClusterParams) *ImportTKGConfigForAzureOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for azure o k response -func (o *ImportTKGConfigForAzureOK) SetPayload(payload *models.AzureRegionalClusterParams) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForAzureOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForAzureBadRequestCode is the HTTP code returned for type ImportTKGConfigForAzureBadRequest -const ImportTKGConfigForAzureBadRequestCode int = 400 - -/* -ImportTKGConfigForAzureBadRequest Bad request - -swagger:response importTKGConfigForAzureBadRequest -*/ -type ImportTKGConfigForAzureBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForAzureBadRequest creates ImportTKGConfigForAzureBadRequest with default headers values -func NewImportTKGConfigForAzureBadRequest() *ImportTKGConfigForAzureBadRequest { - - return &ImportTKGConfigForAzureBadRequest{} -} - -// WithPayload adds the payload to the import t k g config for azure bad request response -func (o *ImportTKGConfigForAzureBadRequest) WithPayload(payload *models.Error) *ImportTKGConfigForAzureBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for azure bad request response -func (o *ImportTKGConfigForAzureBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForAzureBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForAzureUnauthorizedCode is the HTTP code returned for type ImportTKGConfigForAzureUnauthorized -const ImportTKGConfigForAzureUnauthorizedCode int = 401 - -/* -ImportTKGConfigForAzureUnauthorized Incorrect credentials - -swagger:response importTKGConfigForAzureUnauthorized -*/ -type ImportTKGConfigForAzureUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForAzureUnauthorized creates ImportTKGConfigForAzureUnauthorized with default headers values -func NewImportTKGConfigForAzureUnauthorized() *ImportTKGConfigForAzureUnauthorized { - - return &ImportTKGConfigForAzureUnauthorized{} -} - -// WithPayload adds the payload to the import t k g config for azure unauthorized response -func (o *ImportTKGConfigForAzureUnauthorized) WithPayload(payload *models.Error) *ImportTKGConfigForAzureUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for azure unauthorized response -func (o *ImportTKGConfigForAzureUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForAzureUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForAzureInternalServerErrorCode is the HTTP code returned for type ImportTKGConfigForAzureInternalServerError -const ImportTKGConfigForAzureInternalServerErrorCode int = 500 - -/* -ImportTKGConfigForAzureInternalServerError Internal server error - -swagger:response importTKGConfigForAzureInternalServerError -*/ -type ImportTKGConfigForAzureInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForAzureInternalServerError creates ImportTKGConfigForAzureInternalServerError with default headers values -func NewImportTKGConfigForAzureInternalServerError() *ImportTKGConfigForAzureInternalServerError { - - return &ImportTKGConfigForAzureInternalServerError{} -} - -// WithPayload adds the payload to the import t k g config for azure internal server error response -func (o *ImportTKGConfigForAzureInternalServerError) WithPayload(payload *models.Error) *ImportTKGConfigForAzureInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for azure internal server error response -func (o *ImportTKGConfigForAzureInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForAzureInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure_urlbuilder.go b/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure_urlbuilder.go deleted file mode 100644 index 599bd2846a..0000000000 --- a/tkg/web/server/restapi/operations/azure/import_t_k_g_config_for_azure_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ImportTKGConfigForAzureURL generates an URL for the import t k g config for azure operation -type ImportTKGConfigForAzureURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ImportTKGConfigForAzureURL) WithBasePath(bp string) *ImportTKGConfigForAzureURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ImportTKGConfigForAzureURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ImportTKGConfigForAzureURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure/config/import" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ImportTKGConfigForAzureURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ImportTKGConfigForAzureURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ImportTKGConfigForAzureURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ImportTKGConfigForAzureURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ImportTKGConfigForAzureURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ImportTKGConfigForAzureURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/azure/set_azure_endpoint.go b/tkg/web/server/restapi/operations/azure/set_azure_endpoint.go deleted file mode 100644 index b7fe840dc4..0000000000 --- a/tkg/web/server/restapi/operations/azure/set_azure_endpoint.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// SetAzureEndpointHandlerFunc turns a function with the right signature into a set azure endpoint handler -type SetAzureEndpointHandlerFunc func(SetAzureEndpointParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn SetAzureEndpointHandlerFunc) Handle(params SetAzureEndpointParams) middleware.Responder { - return fn(params) -} - -// SetAzureEndpointHandler interface for that can handle valid set azure endpoint params -type SetAzureEndpointHandler interface { - Handle(SetAzureEndpointParams) middleware.Responder -} - -// NewSetAzureEndpoint creates a new http.Handler for the set azure endpoint operation -func NewSetAzureEndpoint(ctx *middleware.Context, handler SetAzureEndpointHandler) *SetAzureEndpoint { - return &SetAzureEndpoint{Context: ctx, Handler: handler} -} - -/* -SetAzureEndpoint swagger:route POST /api/providers/azure azure setAzureEndpoint - -Validate and set azure credentials -*/ -type SetAzureEndpoint struct { - Context *middleware.Context - Handler SetAzureEndpointHandler -} - -func (o *SetAzureEndpoint) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewSetAzureEndpointParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/azure/set_azure_endpoint_parameters.go b/tkg/web/server/restapi/operations/azure/set_azure_endpoint_parameters.go deleted file mode 100644 index 7809240ce4..0000000000 --- a/tkg/web/server/restapi/operations/azure/set_azure_endpoint_parameters.go +++ /dev/null @@ -1,69 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewSetAzureEndpointParams creates a new SetAzureEndpointParams object -// no default values defined in spec. -func NewSetAzureEndpointParams() SetAzureEndpointParams { - - return SetAzureEndpointParams{} -} - -// SetAzureEndpointParams contains all the bound params for the set azure endpoint operation -// typically these are obtained from a http.Request -// -// swagger:parameters setAzureEndpoint -type SetAzureEndpointParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*Azure account parameters - In: body - */ - AccountParams *models.AzureAccountParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewSetAzureEndpointParams() beforehand. -func (o *SetAzureEndpointParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.AzureAccountParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - res = append(res, errors.NewParseError("accountParams", "body", "", err)) - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.AccountParams = &body - } - } - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/azure/set_azure_endpoint_responses.go b/tkg/web/server/restapi/operations/azure/set_azure_endpoint_responses.go deleted file mode 100644 index c095da47e1..0000000000 --- a/tkg/web/server/restapi/operations/azure/set_azure_endpoint_responses.go +++ /dev/null @@ -1,174 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// SetAzureEndpointCreatedCode is the HTTP code returned for type SetAzureEndpointCreated -const SetAzureEndpointCreatedCode int = 201 - -/* -SetAzureEndpointCreated Connection successful - -swagger:response setAzureEndpointCreated -*/ -type SetAzureEndpointCreated struct { -} - -// NewSetAzureEndpointCreated creates SetAzureEndpointCreated with default headers values -func NewSetAzureEndpointCreated() *SetAzureEndpointCreated { - - return &SetAzureEndpointCreated{} -} - -// WriteResponse to the client -func (o *SetAzureEndpointCreated) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.Header().Del(runtime.HeaderContentType) //Remove Content-Type on empty responses - - rw.WriteHeader(201) -} - -// SetAzureEndpointBadRequestCode is the HTTP code returned for type SetAzureEndpointBadRequest -const SetAzureEndpointBadRequestCode int = 400 - -/* -SetAzureEndpointBadRequest Bad request - -swagger:response setAzureEndpointBadRequest -*/ -type SetAzureEndpointBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewSetAzureEndpointBadRequest creates SetAzureEndpointBadRequest with default headers values -func NewSetAzureEndpointBadRequest() *SetAzureEndpointBadRequest { - - return &SetAzureEndpointBadRequest{} -} - -// WithPayload adds the payload to the set azure endpoint bad request response -func (o *SetAzureEndpointBadRequest) WithPayload(payload *models.Error) *SetAzureEndpointBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the set azure endpoint bad request response -func (o *SetAzureEndpointBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *SetAzureEndpointBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// SetAzureEndpointUnauthorizedCode is the HTTP code returned for type SetAzureEndpointUnauthorized -const SetAzureEndpointUnauthorizedCode int = 401 - -/* -SetAzureEndpointUnauthorized Incorrect credentials - -swagger:response setAzureEndpointUnauthorized -*/ -type SetAzureEndpointUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewSetAzureEndpointUnauthorized creates SetAzureEndpointUnauthorized with default headers values -func NewSetAzureEndpointUnauthorized() *SetAzureEndpointUnauthorized { - - return &SetAzureEndpointUnauthorized{} -} - -// WithPayload adds the payload to the set azure endpoint unauthorized response -func (o *SetAzureEndpointUnauthorized) WithPayload(payload *models.Error) *SetAzureEndpointUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the set azure endpoint unauthorized response -func (o *SetAzureEndpointUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *SetAzureEndpointUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// SetAzureEndpointInternalServerErrorCode is the HTTP code returned for type SetAzureEndpointInternalServerError -const SetAzureEndpointInternalServerErrorCode int = 500 - -/* -SetAzureEndpointInternalServerError Internal server error - -swagger:response setAzureEndpointInternalServerError -*/ -type SetAzureEndpointInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewSetAzureEndpointInternalServerError creates SetAzureEndpointInternalServerError with default headers values -func NewSetAzureEndpointInternalServerError() *SetAzureEndpointInternalServerError { - - return &SetAzureEndpointInternalServerError{} -} - -// WithPayload adds the payload to the set azure endpoint internal server error response -func (o *SetAzureEndpointInternalServerError) WithPayload(payload *models.Error) *SetAzureEndpointInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the set azure endpoint internal server error response -func (o *SetAzureEndpointInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *SetAzureEndpointInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/azure/set_azure_endpoint_urlbuilder.go b/tkg/web/server/restapi/operations/azure/set_azure_endpoint_urlbuilder.go deleted file mode 100644 index 47f1a6cd1a..0000000000 --- a/tkg/web/server/restapi/operations/azure/set_azure_endpoint_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package azure - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// SetAzureEndpointURL generates an URL for the set azure endpoint operation -type SetAzureEndpointURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *SetAzureEndpointURL) WithBasePath(bp string) *SetAzureEndpointURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *SetAzureEndpointURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *SetAzureEndpointURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/azure" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *SetAzureEndpointURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *SetAzureEndpointURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *SetAzureEndpointURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on SetAzureEndpointURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on SetAzureEndpointURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *SetAzureEndpointURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker.go b/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker.go deleted file mode 100644 index a1a32a1656..0000000000 --- a/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ApplyTKGConfigForDockerHandlerFunc turns a function with the right signature into a apply t k g config for docker handler -type ApplyTKGConfigForDockerHandlerFunc func(ApplyTKGConfigForDockerParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ApplyTKGConfigForDockerHandlerFunc) Handle(params ApplyTKGConfigForDockerParams) middleware.Responder { - return fn(params) -} - -// ApplyTKGConfigForDockerHandler interface for that can handle valid apply t k g config for docker params -type ApplyTKGConfigForDockerHandler interface { - Handle(ApplyTKGConfigForDockerParams) middleware.Responder -} - -// NewApplyTKGConfigForDocker creates a new http.Handler for the apply t k g config for docker operation -func NewApplyTKGConfigForDocker(ctx *middleware.Context, handler ApplyTKGConfigForDockerHandler) *ApplyTKGConfigForDocker { - return &ApplyTKGConfigForDocker{Context: ctx, Handler: handler} -} - -/* -ApplyTKGConfigForDocker swagger:route POST /api/providers/docker/tkgconfig docker applyTKGConfigForDocker - -Apply the changes to TKG configuration file for docker" -*/ -type ApplyTKGConfigForDocker struct { - Context *middleware.Context - Handler ApplyTKGConfigForDockerHandler -} - -func (o *ApplyTKGConfigForDocker) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewApplyTKGConfigForDockerParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker_parameters.go b/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker_parameters.go deleted file mode 100644 index abf08e8687..0000000000 --- a/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewApplyTKGConfigForDockerParams creates a new ApplyTKGConfigForDockerParams object -// no default values defined in spec. -func NewApplyTKGConfigForDockerParams() ApplyTKGConfigForDockerParams { - - return ApplyTKGConfigForDockerParams{} -} - -// ApplyTKGConfigForDockerParams contains all the bound params for the apply t k g config for docker operation -// typically these are obtained from a http.Request -// -// swagger:parameters applyTKGConfigForDocker -type ApplyTKGConfigForDockerParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*parameters to apply changes to TKG configuration file for Docker - Required: true - In: body - */ - Params *models.DockerRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewApplyTKGConfigForDockerParams() beforehand. -func (o *ApplyTKGConfigForDockerParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.DockerRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker_responses.go b/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker_responses.go deleted file mode 100644 index 637d81dfd6..0000000000 --- a/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker_responses.go +++ /dev/null @@ -1,149 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ApplyTKGConfigForDockerOKCode is the HTTP code returned for type ApplyTKGConfigForDockerOK -const ApplyTKGConfigForDockerOKCode int = 200 - -/* -ApplyTKGConfigForDockerOK Apply change to TKG configuration successfully - -swagger:response applyTKGConfigForDockerOK -*/ -type ApplyTKGConfigForDockerOK struct { - - /* - In: Body - */ - Payload *models.ConfigFileInfo `json:"body,omitempty"` -} - -// NewApplyTKGConfigForDockerOK creates ApplyTKGConfigForDockerOK with default headers values -func NewApplyTKGConfigForDockerOK() *ApplyTKGConfigForDockerOK { - - return &ApplyTKGConfigForDockerOK{} -} - -// WithPayload adds the payload to the apply t k g config for docker o k response -func (o *ApplyTKGConfigForDockerOK) WithPayload(payload *models.ConfigFileInfo) *ApplyTKGConfigForDockerOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for docker o k response -func (o *ApplyTKGConfigForDockerOK) SetPayload(payload *models.ConfigFileInfo) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForDockerOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ApplyTKGConfigForDockerBadRequestCode is the HTTP code returned for type ApplyTKGConfigForDockerBadRequest -const ApplyTKGConfigForDockerBadRequestCode int = 400 - -/* -ApplyTKGConfigForDockerBadRequest Bad request - -swagger:response applyTKGConfigForDockerBadRequest -*/ -type ApplyTKGConfigForDockerBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewApplyTKGConfigForDockerBadRequest creates ApplyTKGConfigForDockerBadRequest with default headers values -func NewApplyTKGConfigForDockerBadRequest() *ApplyTKGConfigForDockerBadRequest { - - return &ApplyTKGConfigForDockerBadRequest{} -} - -// WithPayload adds the payload to the apply t k g config for docker bad request response -func (o *ApplyTKGConfigForDockerBadRequest) WithPayload(payload *models.Error) *ApplyTKGConfigForDockerBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for docker bad request response -func (o *ApplyTKGConfigForDockerBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForDockerBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ApplyTKGConfigForDockerInternalServerErrorCode is the HTTP code returned for type ApplyTKGConfigForDockerInternalServerError -const ApplyTKGConfigForDockerInternalServerErrorCode int = 500 - -/* -ApplyTKGConfigForDockerInternalServerError Internal server error - -swagger:response applyTKGConfigForDockerInternalServerError -*/ -type ApplyTKGConfigForDockerInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewApplyTKGConfigForDockerInternalServerError creates ApplyTKGConfigForDockerInternalServerError with default headers values -func NewApplyTKGConfigForDockerInternalServerError() *ApplyTKGConfigForDockerInternalServerError { - - return &ApplyTKGConfigForDockerInternalServerError{} -} - -// WithPayload adds the payload to the apply t k g config for docker internal server error response -func (o *ApplyTKGConfigForDockerInternalServerError) WithPayload(payload *models.Error) *ApplyTKGConfigForDockerInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for docker internal server error response -func (o *ApplyTKGConfigForDockerInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForDockerInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker_urlbuilder.go b/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker_urlbuilder.go deleted file mode 100644 index 9f44175a5c..0000000000 --- a/tkg/web/server/restapi/operations/docker/apply_t_k_g_config_for_docker_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ApplyTKGConfigForDockerURL generates an URL for the apply t k g config for docker operation -type ApplyTKGConfigForDockerURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ApplyTKGConfigForDockerURL) WithBasePath(bp string) *ApplyTKGConfigForDockerURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ApplyTKGConfigForDockerURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ApplyTKGConfigForDockerURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/docker/tkgconfig" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ApplyTKGConfigForDockerURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ApplyTKGConfigForDockerURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ApplyTKGConfigForDockerURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ApplyTKGConfigForDockerURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ApplyTKGConfigForDockerURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ApplyTKGConfigForDockerURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available.go b/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available.go deleted file mode 100644 index dcdbff25c4..0000000000 --- a/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// CheckIfDockerDaemonAvailableHandlerFunc turns a function with the right signature into a check if docker daemon available handler -type CheckIfDockerDaemonAvailableHandlerFunc func(CheckIfDockerDaemonAvailableParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn CheckIfDockerDaemonAvailableHandlerFunc) Handle(params CheckIfDockerDaemonAvailableParams) middleware.Responder { - return fn(params) -} - -// CheckIfDockerDaemonAvailableHandler interface for that can handle valid check if docker daemon available params -type CheckIfDockerDaemonAvailableHandler interface { - Handle(CheckIfDockerDaemonAvailableParams) middleware.Responder -} - -// NewCheckIfDockerDaemonAvailable creates a new http.Handler for the check if docker daemon available operation -func NewCheckIfDockerDaemonAvailable(ctx *middleware.Context, handler CheckIfDockerDaemonAvailableHandler) *CheckIfDockerDaemonAvailable { - return &CheckIfDockerDaemonAvailable{Context: ctx, Handler: handler} -} - -/* -CheckIfDockerDaemonAvailable swagger:route GET /api/providers/docker/daemon docker checkIfDockerDaemonAvailable - -Check if docker deamon is available -*/ -type CheckIfDockerDaemonAvailable struct { - Context *middleware.Context - Handler CheckIfDockerDaemonAvailableHandler -} - -func (o *CheckIfDockerDaemonAvailable) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewCheckIfDockerDaemonAvailableParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available_parameters.go b/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available_parameters.go deleted file mode 100644 index 9a2f4b30f6..0000000000 --- a/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewCheckIfDockerDaemonAvailableParams creates a new CheckIfDockerDaemonAvailableParams object -// no default values defined in spec. -func NewCheckIfDockerDaemonAvailableParams() CheckIfDockerDaemonAvailableParams { - - return CheckIfDockerDaemonAvailableParams{} -} - -// CheckIfDockerDaemonAvailableParams contains all the bound params for the check if docker daemon available operation -// typically these are obtained from a http.Request -// -// swagger:parameters checkIfDockerDaemonAvailable -type CheckIfDockerDaemonAvailableParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewCheckIfDockerDaemonAvailableParams() beforehand. -func (o *CheckIfDockerDaemonAvailableParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available_responses.go b/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available_responses.go deleted file mode 100644 index 25ae10ba68..0000000000 --- a/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available_responses.go +++ /dev/null @@ -1,149 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CheckIfDockerDaemonAvailableOKCode is the HTTP code returned for type CheckIfDockerDaemonAvailableOK -const CheckIfDockerDaemonAvailableOKCode int = 200 - -/* -CheckIfDockerDaemonAvailableOK Checked the docker daemon status successfully. - -swagger:response checkIfDockerDaemonAvailableOK -*/ -type CheckIfDockerDaemonAvailableOK struct { - - /* - In: Body - */ - Payload *models.DockerDaemonStatus `json:"body,omitempty"` -} - -// NewCheckIfDockerDaemonAvailableOK creates CheckIfDockerDaemonAvailableOK with default headers values -func NewCheckIfDockerDaemonAvailableOK() *CheckIfDockerDaemonAvailableOK { - - return &CheckIfDockerDaemonAvailableOK{} -} - -// WithPayload adds the payload to the check if docker daemon available o k response -func (o *CheckIfDockerDaemonAvailableOK) WithPayload(payload *models.DockerDaemonStatus) *CheckIfDockerDaemonAvailableOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the check if docker daemon available o k response -func (o *CheckIfDockerDaemonAvailableOK) SetPayload(payload *models.DockerDaemonStatus) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CheckIfDockerDaemonAvailableOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CheckIfDockerDaemonAvailableBadRequestCode is the HTTP code returned for type CheckIfDockerDaemonAvailableBadRequest -const CheckIfDockerDaemonAvailableBadRequestCode int = 400 - -/* -CheckIfDockerDaemonAvailableBadRequest Bad request - -swagger:response checkIfDockerDaemonAvailableBadRequest -*/ -type CheckIfDockerDaemonAvailableBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCheckIfDockerDaemonAvailableBadRequest creates CheckIfDockerDaemonAvailableBadRequest with default headers values -func NewCheckIfDockerDaemonAvailableBadRequest() *CheckIfDockerDaemonAvailableBadRequest { - - return &CheckIfDockerDaemonAvailableBadRequest{} -} - -// WithPayload adds the payload to the check if docker daemon available bad request response -func (o *CheckIfDockerDaemonAvailableBadRequest) WithPayload(payload *models.Error) *CheckIfDockerDaemonAvailableBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the check if docker daemon available bad request response -func (o *CheckIfDockerDaemonAvailableBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CheckIfDockerDaemonAvailableBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CheckIfDockerDaemonAvailableInternalServerErrorCode is the HTTP code returned for type CheckIfDockerDaemonAvailableInternalServerError -const CheckIfDockerDaemonAvailableInternalServerErrorCode int = 500 - -/* -CheckIfDockerDaemonAvailableInternalServerError Internal server error - -swagger:response checkIfDockerDaemonAvailableInternalServerError -*/ -type CheckIfDockerDaemonAvailableInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCheckIfDockerDaemonAvailableInternalServerError creates CheckIfDockerDaemonAvailableInternalServerError with default headers values -func NewCheckIfDockerDaemonAvailableInternalServerError() *CheckIfDockerDaemonAvailableInternalServerError { - - return &CheckIfDockerDaemonAvailableInternalServerError{} -} - -// WithPayload adds the payload to the check if docker daemon available internal server error response -func (o *CheckIfDockerDaemonAvailableInternalServerError) WithPayload(payload *models.Error) *CheckIfDockerDaemonAvailableInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the check if docker daemon available internal server error response -func (o *CheckIfDockerDaemonAvailableInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CheckIfDockerDaemonAvailableInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available_urlbuilder.go b/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available_urlbuilder.go deleted file mode 100644 index 8f5ae65f14..0000000000 --- a/tkg/web/server/restapi/operations/docker/check_if_docker_daemon_available_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// CheckIfDockerDaemonAvailableURL generates an URL for the check if docker daemon available operation -type CheckIfDockerDaemonAvailableURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CheckIfDockerDaemonAvailableURL) WithBasePath(bp string) *CheckIfDockerDaemonAvailableURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CheckIfDockerDaemonAvailableURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *CheckIfDockerDaemonAvailableURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/docker/daemon" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *CheckIfDockerDaemonAvailableURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *CheckIfDockerDaemonAvailableURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *CheckIfDockerDaemonAvailableURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on CheckIfDockerDaemonAvailableURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on CheckIfDockerDaemonAvailableURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *CheckIfDockerDaemonAvailableURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster.go b/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster.go deleted file mode 100644 index 4e45b5ffc7..0000000000 --- a/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// CreateDockerRegionalClusterHandlerFunc turns a function with the right signature into a create docker regional cluster handler -type CreateDockerRegionalClusterHandlerFunc func(CreateDockerRegionalClusterParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn CreateDockerRegionalClusterHandlerFunc) Handle(params CreateDockerRegionalClusterParams) middleware.Responder { - return fn(params) -} - -// CreateDockerRegionalClusterHandler interface for that can handle valid create docker regional cluster params -type CreateDockerRegionalClusterHandler interface { - Handle(CreateDockerRegionalClusterParams) middleware.Responder -} - -// NewCreateDockerRegionalCluster creates a new http.Handler for the create docker regional cluster operation -func NewCreateDockerRegionalCluster(ctx *middleware.Context, handler CreateDockerRegionalClusterHandler) *CreateDockerRegionalCluster { - return &CreateDockerRegionalCluster{Context: ctx, Handler: handler} -} - -/* -CreateDockerRegionalCluster swagger:route POST /api/providers/docker/create docker createDockerRegionalCluster - -Create Docker regional cluster -*/ -type CreateDockerRegionalCluster struct { - Context *middleware.Context - Handler CreateDockerRegionalClusterHandler -} - -func (o *CreateDockerRegionalCluster) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewCreateDockerRegionalClusterParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster_parameters.go b/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster_parameters.go deleted file mode 100644 index bef9168bf4..0000000000 --- a/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateDockerRegionalClusterParams creates a new CreateDockerRegionalClusterParams object -// no default values defined in spec. -func NewCreateDockerRegionalClusterParams() CreateDockerRegionalClusterParams { - - return CreateDockerRegionalClusterParams{} -} - -// CreateDockerRegionalClusterParams contains all the bound params for the create docker regional cluster operation -// typically these are obtained from a http.Request -// -// swagger:parameters createDockerRegionalCluster -type CreateDockerRegionalClusterParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*parameters to create a regional cluster - Required: true - In: body - */ - Params *models.DockerRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewCreateDockerRegionalClusterParams() beforehand. -func (o *CreateDockerRegionalClusterParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.DockerRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster_responses.go b/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster_responses.go deleted file mode 100644 index 768c7fea04..0000000000 --- a/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster_responses.go +++ /dev/null @@ -1,147 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateDockerRegionalClusterOKCode is the HTTP code returned for type CreateDockerRegionalClusterOK -const CreateDockerRegionalClusterOKCode int = 200 - -/* -CreateDockerRegionalClusterOK Creating regional cluster started successfully - -swagger:response createDockerRegionalClusterOK -*/ -type CreateDockerRegionalClusterOK struct { - - /* - In: Body - */ - Payload string `json:"body,omitempty"` -} - -// NewCreateDockerRegionalClusterOK creates CreateDockerRegionalClusterOK with default headers values -func NewCreateDockerRegionalClusterOK() *CreateDockerRegionalClusterOK { - - return &CreateDockerRegionalClusterOK{} -} - -// WithPayload adds the payload to the create docker regional cluster o k response -func (o *CreateDockerRegionalClusterOK) WithPayload(payload string) *CreateDockerRegionalClusterOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create docker regional cluster o k response -func (o *CreateDockerRegionalClusterOK) SetPayload(payload string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateDockerRegionalClusterOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// CreateDockerRegionalClusterBadRequestCode is the HTTP code returned for type CreateDockerRegionalClusterBadRequest -const CreateDockerRegionalClusterBadRequestCode int = 400 - -/* -CreateDockerRegionalClusterBadRequest Bad request - -swagger:response createDockerRegionalClusterBadRequest -*/ -type CreateDockerRegionalClusterBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateDockerRegionalClusterBadRequest creates CreateDockerRegionalClusterBadRequest with default headers values -func NewCreateDockerRegionalClusterBadRequest() *CreateDockerRegionalClusterBadRequest { - - return &CreateDockerRegionalClusterBadRequest{} -} - -// WithPayload adds the payload to the create docker regional cluster bad request response -func (o *CreateDockerRegionalClusterBadRequest) WithPayload(payload *models.Error) *CreateDockerRegionalClusterBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create docker regional cluster bad request response -func (o *CreateDockerRegionalClusterBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateDockerRegionalClusterBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CreateDockerRegionalClusterInternalServerErrorCode is the HTTP code returned for type CreateDockerRegionalClusterInternalServerError -const CreateDockerRegionalClusterInternalServerErrorCode int = 500 - -/* -CreateDockerRegionalClusterInternalServerError Internal server error - -swagger:response createDockerRegionalClusterInternalServerError -*/ -type CreateDockerRegionalClusterInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateDockerRegionalClusterInternalServerError creates CreateDockerRegionalClusterInternalServerError with default headers values -func NewCreateDockerRegionalClusterInternalServerError() *CreateDockerRegionalClusterInternalServerError { - - return &CreateDockerRegionalClusterInternalServerError{} -} - -// WithPayload adds the payload to the create docker regional cluster internal server error response -func (o *CreateDockerRegionalClusterInternalServerError) WithPayload(payload *models.Error) *CreateDockerRegionalClusterInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create docker regional cluster internal server error response -func (o *CreateDockerRegionalClusterInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateDockerRegionalClusterInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster_urlbuilder.go b/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster_urlbuilder.go deleted file mode 100644 index af2c12043c..0000000000 --- a/tkg/web/server/restapi/operations/docker/create_docker_regional_cluster_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// CreateDockerRegionalClusterURL generates an URL for the create docker regional cluster operation -type CreateDockerRegionalClusterURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateDockerRegionalClusterURL) WithBasePath(bp string) *CreateDockerRegionalClusterURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateDockerRegionalClusterURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *CreateDockerRegionalClusterURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/docker/create" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *CreateDockerRegionalClusterURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *CreateDockerRegionalClusterURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *CreateDockerRegionalClusterURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on CreateDockerRegionalClusterURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on CreateDockerRegionalClusterURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *CreateDockerRegionalClusterURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker.go b/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker.go deleted file mode 100644 index c423773b7a..0000000000 --- a/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ExportTKGConfigForDockerHandlerFunc turns a function with the right signature into a export t k g config for docker handler -type ExportTKGConfigForDockerHandlerFunc func(ExportTKGConfigForDockerParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ExportTKGConfigForDockerHandlerFunc) Handle(params ExportTKGConfigForDockerParams) middleware.Responder { - return fn(params) -} - -// ExportTKGConfigForDockerHandler interface for that can handle valid export t k g config for docker params -type ExportTKGConfigForDockerHandler interface { - Handle(ExportTKGConfigForDockerParams) middleware.Responder -} - -// NewExportTKGConfigForDocker creates a new http.Handler for the export t k g config for docker operation -func NewExportTKGConfigForDocker(ctx *middleware.Context, handler ExportTKGConfigForDockerHandler) *ExportTKGConfigForDocker { - return &ExportTKGConfigForDocker{Context: ctx, Handler: handler} -} - -/* -ExportTKGConfigForDocker swagger:route POST /api/providers/docker/config/export docker exportTKGConfigForDocker - -Generate TKG configuration file for Docker" -*/ -type ExportTKGConfigForDocker struct { - Context *middleware.Context - Handler ExportTKGConfigForDockerHandler -} - -func (o *ExportTKGConfigForDocker) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewExportTKGConfigForDockerParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker_parameters.go b/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker_parameters.go deleted file mode 100644 index 958742ee29..0000000000 --- a/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewExportTKGConfigForDockerParams creates a new ExportTKGConfigForDockerParams object -// no default values defined in spec. -func NewExportTKGConfigForDockerParams() ExportTKGConfigForDockerParams { - - return ExportTKGConfigForDockerParams{} -} - -// ExportTKGConfigForDockerParams contains all the bound params for the export t k g config for docker operation -// typically these are obtained from a http.Request -// -// swagger:parameters exportTKGConfigForDocker -type ExportTKGConfigForDockerParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*parameters to generate TKG configuration file for Docker - Required: true - In: body - */ - Params *models.DockerRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewExportTKGConfigForDockerParams() beforehand. -func (o *ExportTKGConfigForDockerParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.DockerRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker_responses.go b/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker_responses.go deleted file mode 100644 index 8c21718288..0000000000 --- a/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker_responses.go +++ /dev/null @@ -1,147 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ExportTKGConfigForDockerOKCode is the HTTP code returned for type ExportTKGConfigForDockerOK -const ExportTKGConfigForDockerOKCode int = 200 - -/* -ExportTKGConfigForDockerOK Generated TKG configuration successfully - -swagger:response exportTKGConfigForDockerOK -*/ -type ExportTKGConfigForDockerOK struct { - - /* - In: Body - */ - Payload string `json:"body,omitempty"` -} - -// NewExportTKGConfigForDockerOK creates ExportTKGConfigForDockerOK with default headers values -func NewExportTKGConfigForDockerOK() *ExportTKGConfigForDockerOK { - - return &ExportTKGConfigForDockerOK{} -} - -// WithPayload adds the payload to the export t k g config for docker o k response -func (o *ExportTKGConfigForDockerOK) WithPayload(payload string) *ExportTKGConfigForDockerOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for docker o k response -func (o *ExportTKGConfigForDockerOK) SetPayload(payload string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForDockerOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// ExportTKGConfigForDockerBadRequestCode is the HTTP code returned for type ExportTKGConfigForDockerBadRequest -const ExportTKGConfigForDockerBadRequestCode int = 400 - -/* -ExportTKGConfigForDockerBadRequest Bad request - -swagger:response exportTKGConfigForDockerBadRequest -*/ -type ExportTKGConfigForDockerBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewExportTKGConfigForDockerBadRequest creates ExportTKGConfigForDockerBadRequest with default headers values -func NewExportTKGConfigForDockerBadRequest() *ExportTKGConfigForDockerBadRequest { - - return &ExportTKGConfigForDockerBadRequest{} -} - -// WithPayload adds the payload to the export t k g config for docker bad request response -func (o *ExportTKGConfigForDockerBadRequest) WithPayload(payload *models.Error) *ExportTKGConfigForDockerBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for docker bad request response -func (o *ExportTKGConfigForDockerBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForDockerBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ExportTKGConfigForDockerInternalServerErrorCode is the HTTP code returned for type ExportTKGConfigForDockerInternalServerError -const ExportTKGConfigForDockerInternalServerErrorCode int = 500 - -/* -ExportTKGConfigForDockerInternalServerError Internal server error - -swagger:response exportTKGConfigForDockerInternalServerError -*/ -type ExportTKGConfigForDockerInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewExportTKGConfigForDockerInternalServerError creates ExportTKGConfigForDockerInternalServerError with default headers values -func NewExportTKGConfigForDockerInternalServerError() *ExportTKGConfigForDockerInternalServerError { - - return &ExportTKGConfigForDockerInternalServerError{} -} - -// WithPayload adds the payload to the export t k g config for docker internal server error response -func (o *ExportTKGConfigForDockerInternalServerError) WithPayload(payload *models.Error) *ExportTKGConfigForDockerInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for docker internal server error response -func (o *ExportTKGConfigForDockerInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForDockerInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker_urlbuilder.go b/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker_urlbuilder.go deleted file mode 100644 index 0e366b08b8..0000000000 --- a/tkg/web/server/restapi/operations/docker/export_t_k_g_config_for_docker_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ExportTKGConfigForDockerURL generates an URL for the export t k g config for docker operation -type ExportTKGConfigForDockerURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ExportTKGConfigForDockerURL) WithBasePath(bp string) *ExportTKGConfigForDockerURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ExportTKGConfigForDockerURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ExportTKGConfigForDockerURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/docker/config/export" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ExportTKGConfigForDockerURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ExportTKGConfigForDockerURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ExportTKGConfigForDockerURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ExportTKGConfigForDockerURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ExportTKGConfigForDockerURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ExportTKGConfigForDockerURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker.go b/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker.go deleted file mode 100644 index 2435978fc6..0000000000 --- a/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ImportTKGConfigForDockerHandlerFunc turns a function with the right signature into a import t k g config for docker handler -type ImportTKGConfigForDockerHandlerFunc func(ImportTKGConfigForDockerParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ImportTKGConfigForDockerHandlerFunc) Handle(params ImportTKGConfigForDockerParams) middleware.Responder { - return fn(params) -} - -// ImportTKGConfigForDockerHandler interface for that can handle valid import t k g config for docker params -type ImportTKGConfigForDockerHandler interface { - Handle(ImportTKGConfigForDockerParams) middleware.Responder -} - -// NewImportTKGConfigForDocker creates a new http.Handler for the import t k g config for docker operation -func NewImportTKGConfigForDocker(ctx *middleware.Context, handler ImportTKGConfigForDockerHandler) *ImportTKGConfigForDocker { - return &ImportTKGConfigForDocker{Context: ctx, Handler: handler} -} - -/* -ImportTKGConfigForDocker swagger:route POST /api/providers/docker/config/import docker importTKGConfigForDocker - -Generate TKG configuration object for docker -*/ -type ImportTKGConfigForDocker struct { - Context *middleware.Context - Handler ImportTKGConfigForDockerHandler -} - -func (o *ImportTKGConfigForDocker) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewImportTKGConfigForDockerParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker_parameters.go b/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker_parameters.go deleted file mode 100644 index 9078e2b32b..0000000000 --- a/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewImportTKGConfigForDockerParams creates a new ImportTKGConfigForDockerParams object -// no default values defined in spec. -func NewImportTKGConfigForDockerParams() ImportTKGConfigForDockerParams { - - return ImportTKGConfigForDockerParams{} -} - -// ImportTKGConfigForDockerParams contains all the bound params for the import t k g config for docker operation -// typically these are obtained from a http.Request -// -// swagger:parameters importTKGConfigForDocker -type ImportTKGConfigForDockerParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*config file from which to generate tkg configuration for docker - Required: true - In: body - */ - Params *models.ConfigFile -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewImportTKGConfigForDockerParams() beforehand. -func (o *ImportTKGConfigForDockerParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.ConfigFile - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker_responses.go b/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker_responses.go deleted file mode 100644 index 1f296805fc..0000000000 --- a/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ImportTKGConfigForDockerOKCode is the HTTP code returned for type ImportTKGConfigForDockerOK -const ImportTKGConfigForDockerOKCode int = 200 - -/* -ImportTKGConfigForDockerOK Generated TKG configuration successfully - -swagger:response importTKGConfigForDockerOK -*/ -type ImportTKGConfigForDockerOK struct { - - /* - In: Body - */ - Payload *models.DockerRegionalClusterParams `json:"body,omitempty"` -} - -// NewImportTKGConfigForDockerOK creates ImportTKGConfigForDockerOK with default headers values -func NewImportTKGConfigForDockerOK() *ImportTKGConfigForDockerOK { - - return &ImportTKGConfigForDockerOK{} -} - -// WithPayload adds the payload to the import t k g config for docker o k response -func (o *ImportTKGConfigForDockerOK) WithPayload(payload *models.DockerRegionalClusterParams) *ImportTKGConfigForDockerOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for docker o k response -func (o *ImportTKGConfigForDockerOK) SetPayload(payload *models.DockerRegionalClusterParams) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForDockerOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForDockerBadRequestCode is the HTTP code returned for type ImportTKGConfigForDockerBadRequest -const ImportTKGConfigForDockerBadRequestCode int = 400 - -/* -ImportTKGConfigForDockerBadRequest Bad request - -swagger:response importTKGConfigForDockerBadRequest -*/ -type ImportTKGConfigForDockerBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForDockerBadRequest creates ImportTKGConfigForDockerBadRequest with default headers values -func NewImportTKGConfigForDockerBadRequest() *ImportTKGConfigForDockerBadRequest { - - return &ImportTKGConfigForDockerBadRequest{} -} - -// WithPayload adds the payload to the import t k g config for docker bad request response -func (o *ImportTKGConfigForDockerBadRequest) WithPayload(payload *models.Error) *ImportTKGConfigForDockerBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for docker bad request response -func (o *ImportTKGConfigForDockerBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForDockerBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForDockerUnauthorizedCode is the HTTP code returned for type ImportTKGConfigForDockerUnauthorized -const ImportTKGConfigForDockerUnauthorizedCode int = 401 - -/* -ImportTKGConfigForDockerUnauthorized Incorrect credentials - -swagger:response importTKGConfigForDockerUnauthorized -*/ -type ImportTKGConfigForDockerUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForDockerUnauthorized creates ImportTKGConfigForDockerUnauthorized with default headers values -func NewImportTKGConfigForDockerUnauthorized() *ImportTKGConfigForDockerUnauthorized { - - return &ImportTKGConfigForDockerUnauthorized{} -} - -// WithPayload adds the payload to the import t k g config for docker unauthorized response -func (o *ImportTKGConfigForDockerUnauthorized) WithPayload(payload *models.Error) *ImportTKGConfigForDockerUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for docker unauthorized response -func (o *ImportTKGConfigForDockerUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForDockerUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForDockerInternalServerErrorCode is the HTTP code returned for type ImportTKGConfigForDockerInternalServerError -const ImportTKGConfigForDockerInternalServerErrorCode int = 500 - -/* -ImportTKGConfigForDockerInternalServerError Internal server error - -swagger:response importTKGConfigForDockerInternalServerError -*/ -type ImportTKGConfigForDockerInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForDockerInternalServerError creates ImportTKGConfigForDockerInternalServerError with default headers values -func NewImportTKGConfigForDockerInternalServerError() *ImportTKGConfigForDockerInternalServerError { - - return &ImportTKGConfigForDockerInternalServerError{} -} - -// WithPayload adds the payload to the import t k g config for docker internal server error response -func (o *ImportTKGConfigForDockerInternalServerError) WithPayload(payload *models.Error) *ImportTKGConfigForDockerInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for docker internal server error response -func (o *ImportTKGConfigForDockerInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForDockerInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker_urlbuilder.go b/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker_urlbuilder.go deleted file mode 100644 index 8a5982efde..0000000000 --- a/tkg/web/server/restapi/operations/docker/import_t_k_g_config_for_docker_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package docker - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ImportTKGConfigForDockerURL generates an URL for the import t k g config for docker operation -type ImportTKGConfigForDockerURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ImportTKGConfigForDockerURL) WithBasePath(bp string) *ImportTKGConfigForDockerURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ImportTKGConfigForDockerURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ImportTKGConfigForDockerURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/docker/config/import" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ImportTKGConfigForDockerURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ImportTKGConfigForDockerURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ImportTKGConfigForDockerURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ImportTKGConfigForDockerURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ImportTKGConfigForDockerURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ImportTKGConfigForDockerURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/edition/get_tanzu_edition.go b/tkg/web/server/restapi/operations/edition/get_tanzu_edition.go deleted file mode 100644 index ef8b04a43c..0000000000 --- a/tkg/web/server/restapi/operations/edition/get_tanzu_edition.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package edition - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetTanzuEditionHandlerFunc turns a function with the right signature into a get tanzu edition handler -type GetTanzuEditionHandlerFunc func(GetTanzuEditionParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetTanzuEditionHandlerFunc) Handle(params GetTanzuEditionParams) middleware.Responder { - return fn(params) -} - -// GetTanzuEditionHandler interface for that can handle valid get tanzu edition params -type GetTanzuEditionHandler interface { - Handle(GetTanzuEditionParams) middleware.Responder -} - -// NewGetTanzuEdition creates a new http.Handler for the get tanzu edition operation -func NewGetTanzuEdition(ctx *middleware.Context, handler GetTanzuEditionHandler) *GetTanzuEdition { - return &GetTanzuEdition{Context: ctx, Handler: handler} -} - -/* -GetTanzuEdition swagger:route GET /api/edition edition getTanzuEdition - -Retrieve Tanzu edition -*/ -type GetTanzuEdition struct { - Context *middleware.Context - Handler GetTanzuEditionHandler -} - -func (o *GetTanzuEdition) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetTanzuEditionParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/edition/get_tanzu_edition_parameters.go b/tkg/web/server/restapi/operations/edition/get_tanzu_edition_parameters.go deleted file mode 100644 index 4768740ce3..0000000000 --- a/tkg/web/server/restapi/operations/edition/get_tanzu_edition_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package edition - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetTanzuEditionParams creates a new GetTanzuEditionParams object -// no default values defined in spec. -func NewGetTanzuEditionParams() GetTanzuEditionParams { - - return GetTanzuEditionParams{} -} - -// GetTanzuEditionParams contains all the bound params for the get tanzu edition operation -// typically these are obtained from a http.Request -// -// swagger:parameters getTanzuEdition -type GetTanzuEditionParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetTanzuEditionParams() beforehand. -func (o *GetTanzuEditionParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/edition/get_tanzu_edition_responses.go b/tkg/web/server/restapi/operations/edition/get_tanzu_edition_responses.go deleted file mode 100644 index d5c569f422..0000000000 --- a/tkg/web/server/restapi/operations/edition/get_tanzu_edition_responses.go +++ /dev/null @@ -1,192 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package edition - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetTanzuEditionOKCode is the HTTP code returned for type GetTanzuEditionOK -const GetTanzuEditionOKCode int = 200 - -/* -GetTanzuEditionOK Successful retrieval of tanzu edition - -swagger:response getTanzuEditionOK -*/ -type GetTanzuEditionOK struct { - - /* - In: Body - */ - Payload string `json:"body,omitempty"` -} - -// NewGetTanzuEditionOK creates GetTanzuEditionOK with default headers values -func NewGetTanzuEditionOK() *GetTanzuEditionOK { - - return &GetTanzuEditionOK{} -} - -// WithPayload adds the payload to the get tanzu edition o k response -func (o *GetTanzuEditionOK) WithPayload(payload string) *GetTanzuEditionOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get tanzu edition o k response -func (o *GetTanzuEditionOK) SetPayload(payload string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetTanzuEditionOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetTanzuEditionBadRequestCode is the HTTP code returned for type GetTanzuEditionBadRequest -const GetTanzuEditionBadRequestCode int = 400 - -/* -GetTanzuEditionBadRequest Bad Request - -swagger:response getTanzuEditionBadRequest -*/ -type GetTanzuEditionBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetTanzuEditionBadRequest creates GetTanzuEditionBadRequest with default headers values -func NewGetTanzuEditionBadRequest() *GetTanzuEditionBadRequest { - - return &GetTanzuEditionBadRequest{} -} - -// WithPayload adds the payload to the get tanzu edition bad request response -func (o *GetTanzuEditionBadRequest) WithPayload(payload *models.Error) *GetTanzuEditionBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get tanzu edition bad request response -func (o *GetTanzuEditionBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetTanzuEditionBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetTanzuEditionUnauthorizedCode is the HTTP code returned for type GetTanzuEditionUnauthorized -const GetTanzuEditionUnauthorizedCode int = 401 - -/* -GetTanzuEditionUnauthorized Incorrect credentials - -swagger:response getTanzuEditionUnauthorized -*/ -type GetTanzuEditionUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetTanzuEditionUnauthorized creates GetTanzuEditionUnauthorized with default headers values -func NewGetTanzuEditionUnauthorized() *GetTanzuEditionUnauthorized { - - return &GetTanzuEditionUnauthorized{} -} - -// WithPayload adds the payload to the get tanzu edition unauthorized response -func (o *GetTanzuEditionUnauthorized) WithPayload(payload *models.Error) *GetTanzuEditionUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get tanzu edition unauthorized response -func (o *GetTanzuEditionUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetTanzuEditionUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetTanzuEditionInternalServerErrorCode is the HTTP code returned for type GetTanzuEditionInternalServerError -const GetTanzuEditionInternalServerErrorCode int = 500 - -/* -GetTanzuEditionInternalServerError Internal server error - -swagger:response getTanzuEditionInternalServerError -*/ -type GetTanzuEditionInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetTanzuEditionInternalServerError creates GetTanzuEditionInternalServerError with default headers values -func NewGetTanzuEditionInternalServerError() *GetTanzuEditionInternalServerError { - - return &GetTanzuEditionInternalServerError{} -} - -// WithPayload adds the payload to the get tanzu edition internal server error response -func (o *GetTanzuEditionInternalServerError) WithPayload(payload *models.Error) *GetTanzuEditionInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get tanzu edition internal server error response -func (o *GetTanzuEditionInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetTanzuEditionInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/edition/get_tanzu_edition_urlbuilder.go b/tkg/web/server/restapi/operations/edition/get_tanzu_edition_urlbuilder.go deleted file mode 100644 index 2e17009758..0000000000 --- a/tkg/web/server/restapi/operations/edition/get_tanzu_edition_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package edition - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetTanzuEditionURL generates an URL for the get tanzu edition operation -type GetTanzuEditionURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetTanzuEditionURL) WithBasePath(bp string) *GetTanzuEditionURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetTanzuEditionURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetTanzuEditionURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/edition" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetTanzuEditionURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetTanzuEditionURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetTanzuEditionURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetTanzuEditionURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetTanzuEditionURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetTanzuEditionURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/features/get_feature_flags.go b/tkg/web/server/restapi/operations/features/get_feature_flags.go deleted file mode 100644 index 458dce8184..0000000000 --- a/tkg/web/server/restapi/operations/features/get_feature_flags.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package features - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetFeatureFlagsHandlerFunc turns a function with the right signature into a get feature flags handler -type GetFeatureFlagsHandlerFunc func(GetFeatureFlagsParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetFeatureFlagsHandlerFunc) Handle(params GetFeatureFlagsParams) middleware.Responder { - return fn(params) -} - -// GetFeatureFlagsHandler interface for that can handle valid get feature flags params -type GetFeatureFlagsHandler interface { - Handle(GetFeatureFlagsParams) middleware.Responder -} - -// NewGetFeatureFlags creates a new http.Handler for the get feature flags operation -func NewGetFeatureFlags(ctx *middleware.Context, handler GetFeatureFlagsHandler) *GetFeatureFlags { - return &GetFeatureFlags{Context: ctx, Handler: handler} -} - -/* -GetFeatureFlags swagger:route GET /api/features features getFeatureFlags - -Retrieve list of features -*/ -type GetFeatureFlags struct { - Context *middleware.Context - Handler GetFeatureFlagsHandler -} - -func (o *GetFeatureFlags) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetFeatureFlagsParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/features/get_feature_flags_parameters.go b/tkg/web/server/restapi/operations/features/get_feature_flags_parameters.go deleted file mode 100644 index 4bd6201e22..0000000000 --- a/tkg/web/server/restapi/operations/features/get_feature_flags_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package features - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetFeatureFlagsParams creates a new GetFeatureFlagsParams object -// no default values defined in spec. -func NewGetFeatureFlagsParams() GetFeatureFlagsParams { - - return GetFeatureFlagsParams{} -} - -// GetFeatureFlagsParams contains all the bound params for the get feature flags operation -// typically these are obtained from a http.Request -// -// swagger:parameters getFeatureFlags -type GetFeatureFlagsParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetFeatureFlagsParams() beforehand. -func (o *GetFeatureFlagsParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/features/get_feature_flags_responses.go b/tkg/web/server/restapi/operations/features/get_feature_flags_responses.go deleted file mode 100644 index e643732b25..0000000000 --- a/tkg/web/server/restapi/operations/features/get_feature_flags_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package features - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetFeatureFlagsOKCode is the HTTP code returned for type GetFeatureFlagsOK -const GetFeatureFlagsOKCode int = 200 - -/* -GetFeatureFlagsOK Successful retrieval of feature flags - -swagger:response getFeatureFlagsOK -*/ -type GetFeatureFlagsOK struct { - - /* - In: Body - */ - Payload models.Features `json:"body,omitempty"` -} - -// NewGetFeatureFlagsOK creates GetFeatureFlagsOK with default headers values -func NewGetFeatureFlagsOK() *GetFeatureFlagsOK { - - return &GetFeatureFlagsOK{} -} - -// WithPayload adds the payload to the get feature flags o k response -func (o *GetFeatureFlagsOK) WithPayload(payload models.Features) *GetFeatureFlagsOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get feature flags o k response -func (o *GetFeatureFlagsOK) SetPayload(payload models.Features) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetFeatureFlagsOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty map - payload = models.Features{} - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetFeatureFlagsBadRequestCode is the HTTP code returned for type GetFeatureFlagsBadRequest -const GetFeatureFlagsBadRequestCode int = 400 - -/* -GetFeatureFlagsBadRequest Bad Request - -swagger:response getFeatureFlagsBadRequest -*/ -type GetFeatureFlagsBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetFeatureFlagsBadRequest creates GetFeatureFlagsBadRequest with default headers values -func NewGetFeatureFlagsBadRequest() *GetFeatureFlagsBadRequest { - - return &GetFeatureFlagsBadRequest{} -} - -// WithPayload adds the payload to the get feature flags bad request response -func (o *GetFeatureFlagsBadRequest) WithPayload(payload *models.Error) *GetFeatureFlagsBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get feature flags bad request response -func (o *GetFeatureFlagsBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetFeatureFlagsBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetFeatureFlagsUnauthorizedCode is the HTTP code returned for type GetFeatureFlagsUnauthorized -const GetFeatureFlagsUnauthorizedCode int = 401 - -/* -GetFeatureFlagsUnauthorized Incorrect credentials - -swagger:response getFeatureFlagsUnauthorized -*/ -type GetFeatureFlagsUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetFeatureFlagsUnauthorized creates GetFeatureFlagsUnauthorized with default headers values -func NewGetFeatureFlagsUnauthorized() *GetFeatureFlagsUnauthorized { - - return &GetFeatureFlagsUnauthorized{} -} - -// WithPayload adds the payload to the get feature flags unauthorized response -func (o *GetFeatureFlagsUnauthorized) WithPayload(payload *models.Error) *GetFeatureFlagsUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get feature flags unauthorized response -func (o *GetFeatureFlagsUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetFeatureFlagsUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetFeatureFlagsInternalServerErrorCode is the HTTP code returned for type GetFeatureFlagsInternalServerError -const GetFeatureFlagsInternalServerErrorCode int = 500 - -/* -GetFeatureFlagsInternalServerError Internal server error - -swagger:response getFeatureFlagsInternalServerError -*/ -type GetFeatureFlagsInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetFeatureFlagsInternalServerError creates GetFeatureFlagsInternalServerError with default headers values -func NewGetFeatureFlagsInternalServerError() *GetFeatureFlagsInternalServerError { - - return &GetFeatureFlagsInternalServerError{} -} - -// WithPayload adds the payload to the get feature flags internal server error response -func (o *GetFeatureFlagsInternalServerError) WithPayload(payload *models.Error) *GetFeatureFlagsInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get feature flags internal server error response -func (o *GetFeatureFlagsInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetFeatureFlagsInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/features/get_feature_flags_urlbuilder.go b/tkg/web/server/restapi/operations/features/get_feature_flags_urlbuilder.go deleted file mode 100644 index e34eeda2d4..0000000000 --- a/tkg/web/server/restapi/operations/features/get_feature_flags_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package features - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetFeatureFlagsURL generates an URL for the get feature flags operation -type GetFeatureFlagsURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetFeatureFlagsURL) WithBasePath(bp string) *GetFeatureFlagsURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetFeatureFlagsURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetFeatureFlagsURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/features" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetFeatureFlagsURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetFeatureFlagsURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetFeatureFlagsURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetFeatureFlagsURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetFeatureFlagsURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetFeatureFlagsURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/kickstart_ui_api.go b/tkg/web/server/restapi/operations/kickstart_ui_api.go deleted file mode 100644 index 6a586e02ef..0000000000 --- a/tkg/web/server/restapi/operations/kickstart_ui_api.go +++ /dev/null @@ -1,1083 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package operations - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "fmt" - "net/http" - "strings" - - errors "github.com/go-openapi/errors" - loads "github.com/go-openapi/loads" - runtime "github.com/go-openapi/runtime" - middleware "github.com/go-openapi/runtime/middleware" - security "github.com/go-openapi/runtime/security" - spec "github.com/go-openapi/spec" - strfmt "github.com/go-openapi/strfmt" - "github.com/go-openapi/swag" - - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/avi" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/aws" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/azure" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/docker" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/edition" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/features" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/ldap" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/provider" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/ui" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations/vsphere" -) - -// NewKickstartUIAPI creates a new KickstartUI instance -func NewKickstartUIAPI(spec *loads.Document) *KickstartUIAPI { - return &KickstartUIAPI{ - handlers: make(map[string]map[string]http.Handler), - formats: strfmt.Default, - defaultConsumes: "application/json", - defaultProduces: "application/json", - customConsumers: make(map[string]runtime.Consumer), - customProducers: make(map[string]runtime.Producer), - ServerShutdown: func() {}, - spec: spec, - ServeError: errors.ServeError, - BasicAuthenticator: security.BasicAuth, - APIKeyAuthenticator: security.APIKeyAuth, - BearerAuthenticator: security.BearerAuth, - JSONConsumer: runtime.JSONConsumer(), - JSONProducer: runtime.JSONProducer(), - AwsApplyTKGConfigForAWSHandler: aws.ApplyTKGConfigForAWSHandlerFunc(func(params aws.ApplyTKGConfigForAWSParams) middleware.Responder { - return middleware.NotImplemented("operation AwsApplyTKGConfigForAWS has not yet been implemented") - }), - AzureApplyTKGConfigForAzureHandler: azure.ApplyTKGConfigForAzureHandlerFunc(func(params azure.ApplyTKGConfigForAzureParams) middleware.Responder { - return middleware.NotImplemented("operation AzureApplyTKGConfigForAzure has not yet been implemented") - }), - DockerApplyTKGConfigForDockerHandler: docker.ApplyTKGConfigForDockerHandlerFunc(func(params docker.ApplyTKGConfigForDockerParams) middleware.Responder { - return middleware.NotImplemented("operation DockerApplyTKGConfigForDocker has not yet been implemented") - }), - VsphereApplyTKGConfigForVsphereHandler: vsphere.ApplyTKGConfigForVsphereHandlerFunc(func(params vsphere.ApplyTKGConfigForVsphereParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereApplyTKGConfigForVsphere has not yet been implemented") - }), - DockerCheckIfDockerDaemonAvailableHandler: docker.CheckIfDockerDaemonAvailableHandlerFunc(func(params docker.CheckIfDockerDaemonAvailableParams) middleware.Responder { - return middleware.NotImplemented("operation DockerCheckIfDockerDaemonAvailable has not yet been implemented") - }), - AwsCreateAWSRegionalClusterHandler: aws.CreateAWSRegionalClusterHandlerFunc(func(params aws.CreateAWSRegionalClusterParams) middleware.Responder { - return middleware.NotImplemented("operation AwsCreateAWSRegionalCluster has not yet been implemented") - }), - AzureCreateAzureRegionalClusterHandler: azure.CreateAzureRegionalClusterHandlerFunc(func(params azure.CreateAzureRegionalClusterParams) middleware.Responder { - return middleware.NotImplemented("operation AzureCreateAzureRegionalCluster has not yet been implemented") - }), - AzureCreateAzureResourceGroupHandler: azure.CreateAzureResourceGroupHandlerFunc(func(params azure.CreateAzureResourceGroupParams) middleware.Responder { - return middleware.NotImplemented("operation AzureCreateAzureResourceGroup has not yet been implemented") - }), - AzureCreateAzureVirtualNetworkHandler: azure.CreateAzureVirtualNetworkHandlerFunc(func(params azure.CreateAzureVirtualNetworkParams) middleware.Responder { - return middleware.NotImplemented("operation AzureCreateAzureVirtualNetwork has not yet been implemented") - }), - DockerCreateDockerRegionalClusterHandler: docker.CreateDockerRegionalClusterHandlerFunc(func(params docker.CreateDockerRegionalClusterParams) middleware.Responder { - return middleware.NotImplemented("operation DockerCreateDockerRegionalCluster has not yet been implemented") - }), - VsphereCreateVSphereRegionalClusterHandler: vsphere.CreateVSphereRegionalClusterHandlerFunc(func(params vsphere.CreateVSphereRegionalClusterParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereCreateVSphereRegionalCluster has not yet been implemented") - }), - AwsExportTKGConfigForAWSHandler: aws.ExportTKGConfigForAWSHandlerFunc(func(params aws.ExportTKGConfigForAWSParams) middleware.Responder { - return middleware.NotImplemented("operation AwsExportTKGConfigForAWS has not yet been implemented") - }), - AzureExportTKGConfigForAzureHandler: azure.ExportTKGConfigForAzureHandlerFunc(func(params azure.ExportTKGConfigForAzureParams) middleware.Responder { - return middleware.NotImplemented("operation AzureExportTKGConfigForAzure has not yet been implemented") - }), - DockerExportTKGConfigForDockerHandler: docker.ExportTKGConfigForDockerHandlerFunc(func(params docker.ExportTKGConfigForDockerParams) middleware.Responder { - return middleware.NotImplemented("operation DockerExportTKGConfigForDocker has not yet been implemented") - }), - VsphereExportTKGConfigForVsphereHandler: vsphere.ExportTKGConfigForVsphereHandlerFunc(func(params vsphere.ExportTKGConfigForVsphereParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereExportTKGConfigForVsphere has not yet been implemented") - }), - AwsGetAWSAvailabilityZonesHandler: aws.GetAWSAvailabilityZonesHandlerFunc(func(params aws.GetAWSAvailabilityZonesParams) middleware.Responder { - return middleware.NotImplemented("operation AwsGetAWSAvailabilityZones has not yet been implemented") - }), - AwsGetAWSCredentialProfilesHandler: aws.GetAWSCredentialProfilesHandlerFunc(func(params aws.GetAWSCredentialProfilesParams) middleware.Responder { - return middleware.NotImplemented("operation AwsGetAWSCredentialProfiles has not yet been implemented") - }), - AwsGetAWSNodeTypesHandler: aws.GetAWSNodeTypesHandlerFunc(func(params aws.GetAWSNodeTypesParams) middleware.Responder { - return middleware.NotImplemented("operation AwsGetAWSNodeTypes has not yet been implemented") - }), - AwsGetAWSOSImagesHandler: aws.GetAWSOSImagesHandlerFunc(func(params aws.GetAWSOSImagesParams) middleware.Responder { - return middleware.NotImplemented("operation AwsGetAWSOSImages has not yet been implemented") - }), - AwsGetAWSRegionsHandler: aws.GetAWSRegionsHandlerFunc(func(params aws.GetAWSRegionsParams) middleware.Responder { - return middleware.NotImplemented("operation AwsGetAWSRegions has not yet been implemented") - }), - AwsGetAWSSubnetsHandler: aws.GetAWSSubnetsHandlerFunc(func(params aws.GetAWSSubnetsParams) middleware.Responder { - return middleware.NotImplemented("operation AwsGetAWSSubnets has not yet been implemented") - }), - AviGetAviCloudsHandler: avi.GetAviCloudsHandlerFunc(func(params avi.GetAviCloudsParams) middleware.Responder { - return middleware.NotImplemented("operation AviGetAviClouds has not yet been implemented") - }), - AviGetAviServiceEngineGroupsHandler: avi.GetAviServiceEngineGroupsHandlerFunc(func(params avi.GetAviServiceEngineGroupsParams) middleware.Responder { - return middleware.NotImplemented("operation AviGetAviServiceEngineGroups has not yet been implemented") - }), - AviGetAviVipNetworksHandler: avi.GetAviVipNetworksHandlerFunc(func(params avi.GetAviVipNetworksParams) middleware.Responder { - return middleware.NotImplemented("operation AviGetAviVipNetworks has not yet been implemented") - }), - AzureGetAzureEndpointHandler: azure.GetAzureEndpointHandlerFunc(func(params azure.GetAzureEndpointParams) middleware.Responder { - return middleware.NotImplemented("operation AzureGetAzureEndpoint has not yet been implemented") - }), - AzureGetAzureInstanceTypesHandler: azure.GetAzureInstanceTypesHandlerFunc(func(params azure.GetAzureInstanceTypesParams) middleware.Responder { - return middleware.NotImplemented("operation AzureGetAzureInstanceTypes has not yet been implemented") - }), - AzureGetAzureOSImagesHandler: azure.GetAzureOSImagesHandlerFunc(func(params azure.GetAzureOSImagesParams) middleware.Responder { - return middleware.NotImplemented("operation AzureGetAzureOSImages has not yet been implemented") - }), - AzureGetAzureRegionsHandler: azure.GetAzureRegionsHandlerFunc(func(params azure.GetAzureRegionsParams) middleware.Responder { - return middleware.NotImplemented("operation AzureGetAzureRegions has not yet been implemented") - }), - AzureGetAzureResourceGroupsHandler: azure.GetAzureResourceGroupsHandlerFunc(func(params azure.GetAzureResourceGroupsParams) middleware.Responder { - return middleware.NotImplemented("operation AzureGetAzureResourceGroups has not yet been implemented") - }), - AzureGetAzureVnetsHandler: azure.GetAzureVnetsHandlerFunc(func(params azure.GetAzureVnetsParams) middleware.Responder { - return middleware.NotImplemented("operation AzureGetAzureVnets has not yet been implemented") - }), - FeaturesGetFeatureFlagsHandler: features.GetFeatureFlagsHandlerFunc(func(params features.GetFeatureFlagsParams) middleware.Responder { - return middleware.NotImplemented("operation FeaturesGetFeatureFlags has not yet been implemented") - }), - ProviderGetProviderHandler: provider.GetProviderHandlerFunc(func(params provider.GetProviderParams) middleware.Responder { - return middleware.NotImplemented("operation ProviderGetProvider has not yet been implemented") - }), - EditionGetTanzuEditionHandler: edition.GetTanzuEditionHandlerFunc(func(params edition.GetTanzuEditionParams) middleware.Responder { - return middleware.NotImplemented("operation EditionGetTanzuEdition has not yet been implemented") - }), - UIGetUIHandler: ui.GetUIHandlerFunc(func(params ui.GetUIParams) middleware.Responder { - return middleware.NotImplemented("operation UIGetUI has not yet been implemented") - }), - UIGetUIFileHandler: ui.GetUIFileHandlerFunc(func(params ui.GetUIFileParams) middleware.Responder { - return middleware.NotImplemented("operation UIGetUIFile has not yet been implemented") - }), - AwsGetVPCsHandler: aws.GetVPCsHandlerFunc(func(params aws.GetVPCsParams) middleware.Responder { - return middleware.NotImplemented("operation AwsGetVPCs has not yet been implemented") - }), - VsphereGetVSphereComputeResourcesHandler: vsphere.GetVSphereComputeResourcesHandlerFunc(func(params vsphere.GetVSphereComputeResourcesParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereGetVSphereComputeResources has not yet been implemented") - }), - VsphereGetVSphereDatacentersHandler: vsphere.GetVSphereDatacentersHandlerFunc(func(params vsphere.GetVSphereDatacentersParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereGetVSphereDatacenters has not yet been implemented") - }), - VsphereGetVSphereDatastoresHandler: vsphere.GetVSphereDatastoresHandlerFunc(func(params vsphere.GetVSphereDatastoresParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereGetVSphereDatastores has not yet been implemented") - }), - VsphereGetVSphereFoldersHandler: vsphere.GetVSphereFoldersHandlerFunc(func(params vsphere.GetVSphereFoldersParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereGetVSphereFolders has not yet been implemented") - }), - VsphereGetVSphereNetworksHandler: vsphere.GetVSphereNetworksHandlerFunc(func(params vsphere.GetVSphereNetworksParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereGetVSphereNetworks has not yet been implemented") - }), - VsphereGetVSphereNodeTypesHandler: vsphere.GetVSphereNodeTypesHandlerFunc(func(params vsphere.GetVSphereNodeTypesParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereGetVSphereNodeTypes has not yet been implemented") - }), - VsphereGetVSphereOSImagesHandler: vsphere.GetVSphereOSImagesHandlerFunc(func(params vsphere.GetVSphereOSImagesParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereGetVSphereOSImages has not yet been implemented") - }), - VsphereGetVSphereResourcePoolsHandler: vsphere.GetVSphereResourcePoolsHandlerFunc(func(params vsphere.GetVSphereResourcePoolsParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereGetVSphereResourcePools has not yet been implemented") - }), - VsphereGetVsphereThumbprintHandler: vsphere.GetVsphereThumbprintHandlerFunc(func(params vsphere.GetVsphereThumbprintParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereGetVsphereThumbprint has not yet been implemented") - }), - AwsImportTKGConfigForAWSHandler: aws.ImportTKGConfigForAWSHandlerFunc(func(params aws.ImportTKGConfigForAWSParams) middleware.Responder { - return middleware.NotImplemented("operation AwsImportTKGConfigForAWS has not yet been implemented") - }), - AzureImportTKGConfigForAzureHandler: azure.ImportTKGConfigForAzureHandlerFunc(func(params azure.ImportTKGConfigForAzureParams) middleware.Responder { - return middleware.NotImplemented("operation AzureImportTKGConfigForAzure has not yet been implemented") - }), - DockerImportTKGConfigForDockerHandler: docker.ImportTKGConfigForDockerHandlerFunc(func(params docker.ImportTKGConfigForDockerParams) middleware.Responder { - return middleware.NotImplemented("operation DockerImportTKGConfigForDocker has not yet been implemented") - }), - VsphereImportTKGConfigForVsphereHandler: vsphere.ImportTKGConfigForVsphereHandlerFunc(func(params vsphere.ImportTKGConfigForVsphereParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereImportTKGConfigForVsphere has not yet been implemented") - }), - AwsSetAWSEndpointHandler: aws.SetAWSEndpointHandlerFunc(func(params aws.SetAWSEndpointParams) middleware.Responder { - return middleware.NotImplemented("operation AwsSetAWSEndpoint has not yet been implemented") - }), - AzureSetAzureEndpointHandler: azure.SetAzureEndpointHandlerFunc(func(params azure.SetAzureEndpointParams) middleware.Responder { - return middleware.NotImplemented("operation AzureSetAzureEndpoint has not yet been implemented") - }), - VsphereSetVSphereEndpointHandler: vsphere.SetVSphereEndpointHandlerFunc(func(params vsphere.SetVSphereEndpointParams) middleware.Responder { - return middleware.NotImplemented("operation VsphereSetVSphereEndpoint has not yet been implemented") - }), - AviVerifyAccountHandler: avi.VerifyAccountHandlerFunc(func(params avi.VerifyAccountParams) middleware.Responder { - return middleware.NotImplemented("operation AviVerifyAccount has not yet been implemented") - }), - LdapVerifyLdapBindHandler: ldap.VerifyLdapBindHandlerFunc(func(params ldap.VerifyLdapBindParams) middleware.Responder { - return middleware.NotImplemented("operation LdapVerifyLdapBind has not yet been implemented") - }), - LdapVerifyLdapCloseConnectionHandler: ldap.VerifyLdapCloseConnectionHandlerFunc(func(params ldap.VerifyLdapCloseConnectionParams) middleware.Responder { - return middleware.NotImplemented("operation LdapVerifyLdapCloseConnection has not yet been implemented") - }), - LdapVerifyLdapConnectHandler: ldap.VerifyLdapConnectHandlerFunc(func(params ldap.VerifyLdapConnectParams) middleware.Responder { - return middleware.NotImplemented("operation LdapVerifyLdapConnect has not yet been implemented") - }), - LdapVerifyLdapGroupSearchHandler: ldap.VerifyLdapGroupSearchHandlerFunc(func(params ldap.VerifyLdapGroupSearchParams) middleware.Responder { - return middleware.NotImplemented("operation LdapVerifyLdapGroupSearch has not yet been implemented") - }), - LdapVerifyLdapUserSearchHandler: ldap.VerifyLdapUserSearchHandlerFunc(func(params ldap.VerifyLdapUserSearchParams) middleware.Responder { - return middleware.NotImplemented("operation LdapVerifyLdapUserSearch has not yet been implemented") - }), - } -} - -/*KickstartUIAPI Tanzu Kubernetes Grid Setup API. */ -type KickstartUIAPI struct { - spec *loads.Document - context *middleware.Context - handlers map[string]map[string]http.Handler - formats strfmt.Registry - customConsumers map[string]runtime.Consumer - customProducers map[string]runtime.Producer - defaultConsumes string - defaultProduces string - Middleware func(middleware.Builder) http.Handler - - // BasicAuthenticator generates a runtime.Authenticator from the supplied basic auth function. - // It has a default implementation in the security package, however you can replace it for your particular usage. - BasicAuthenticator func(security.UserPassAuthentication) runtime.Authenticator - // APIKeyAuthenticator generates a runtime.Authenticator from the supplied token auth function. - // It has a default implementation in the security package, however you can replace it for your particular usage. - APIKeyAuthenticator func(string, string, security.TokenAuthentication) runtime.Authenticator - // BearerAuthenticator generates a runtime.Authenticator from the supplied bearer token auth function. - // It has a default implementation in the security package, however you can replace it for your particular usage. - BearerAuthenticator func(string, security.ScopedTokenAuthentication) runtime.Authenticator - - // JSONConsumer registers a consumer for a "application/json" mime type - JSONConsumer runtime.Consumer - - // JSONProducer registers a producer for a "application/json" mime type - JSONProducer runtime.Producer - - // AwsApplyTKGConfigForAWSHandler sets the operation handler for the apply t k g config for a w s operation - AwsApplyTKGConfigForAWSHandler aws.ApplyTKGConfigForAWSHandler - // AzureApplyTKGConfigForAzureHandler sets the operation handler for the apply t k g config for azure operation - AzureApplyTKGConfigForAzureHandler azure.ApplyTKGConfigForAzureHandler - // DockerApplyTKGConfigForDockerHandler sets the operation handler for the apply t k g config for docker operation - DockerApplyTKGConfigForDockerHandler docker.ApplyTKGConfigForDockerHandler - // VsphereApplyTKGConfigForVsphereHandler sets the operation handler for the apply t k g config for vsphere operation - VsphereApplyTKGConfigForVsphereHandler vsphere.ApplyTKGConfigForVsphereHandler - // DockerCheckIfDockerDaemonAvailableHandler sets the operation handler for the check if docker daemon available operation - DockerCheckIfDockerDaemonAvailableHandler docker.CheckIfDockerDaemonAvailableHandler - // AwsCreateAWSRegionalClusterHandler sets the operation handler for the create a w s regional cluster operation - AwsCreateAWSRegionalClusterHandler aws.CreateAWSRegionalClusterHandler - // AzureCreateAzureRegionalClusterHandler sets the operation handler for the create azure regional cluster operation - AzureCreateAzureRegionalClusterHandler azure.CreateAzureRegionalClusterHandler - // AzureCreateAzureResourceGroupHandler sets the operation handler for the create azure resource group operation - AzureCreateAzureResourceGroupHandler azure.CreateAzureResourceGroupHandler - // AzureCreateAzureVirtualNetworkHandler sets the operation handler for the create azure virtual network operation - AzureCreateAzureVirtualNetworkHandler azure.CreateAzureVirtualNetworkHandler - // DockerCreateDockerRegionalClusterHandler sets the operation handler for the create docker regional cluster operation - DockerCreateDockerRegionalClusterHandler docker.CreateDockerRegionalClusterHandler - // VsphereCreateVSphereRegionalClusterHandler sets the operation handler for the create v sphere regional cluster operation - VsphereCreateVSphereRegionalClusterHandler vsphere.CreateVSphereRegionalClusterHandler - // AwsExportTKGConfigForAWSHandler sets the operation handler for the export t k g config for a w s operation - AwsExportTKGConfigForAWSHandler aws.ExportTKGConfigForAWSHandler - // AzureExportTKGConfigForAzureHandler sets the operation handler for the export t k g config for azure operation - AzureExportTKGConfigForAzureHandler azure.ExportTKGConfigForAzureHandler - // DockerExportTKGConfigForDockerHandler sets the operation handler for the export t k g config for docker operation - DockerExportTKGConfigForDockerHandler docker.ExportTKGConfigForDockerHandler - // VsphereExportTKGConfigForVsphereHandler sets the operation handler for the export t k g config for vsphere operation - VsphereExportTKGConfigForVsphereHandler vsphere.ExportTKGConfigForVsphereHandler - // AwsGetAWSAvailabilityZonesHandler sets the operation handler for the get a w s availability zones operation - AwsGetAWSAvailabilityZonesHandler aws.GetAWSAvailabilityZonesHandler - // AwsGetAWSCredentialProfilesHandler sets the operation handler for the get a w s credential profiles operation - AwsGetAWSCredentialProfilesHandler aws.GetAWSCredentialProfilesHandler - // AwsGetAWSNodeTypesHandler sets the operation handler for the get a w s node types operation - AwsGetAWSNodeTypesHandler aws.GetAWSNodeTypesHandler - // AwsGetAWSOSImagesHandler sets the operation handler for the get a w s o s images operation - AwsGetAWSOSImagesHandler aws.GetAWSOSImagesHandler - // AwsGetAWSRegionsHandler sets the operation handler for the get a w s regions operation - AwsGetAWSRegionsHandler aws.GetAWSRegionsHandler - // AwsGetAWSSubnetsHandler sets the operation handler for the get a w s subnets operation - AwsGetAWSSubnetsHandler aws.GetAWSSubnetsHandler - // AviGetAviCloudsHandler sets the operation handler for the get avi clouds operation - AviGetAviCloudsHandler avi.GetAviCloudsHandler - // AviGetAviServiceEngineGroupsHandler sets the operation handler for the get avi service engine groups operation - AviGetAviServiceEngineGroupsHandler avi.GetAviServiceEngineGroupsHandler - // AviGetAviVipNetworksHandler sets the operation handler for the get avi vip networks operation - AviGetAviVipNetworksHandler avi.GetAviVipNetworksHandler - // AzureGetAzureEndpointHandler sets the operation handler for the get azure endpoint operation - AzureGetAzureEndpointHandler azure.GetAzureEndpointHandler - // AzureGetAzureInstanceTypesHandler sets the operation handler for the get azure instance types operation - AzureGetAzureInstanceTypesHandler azure.GetAzureInstanceTypesHandler - // AzureGetAzureOSImagesHandler sets the operation handler for the get azure o s images operation - AzureGetAzureOSImagesHandler azure.GetAzureOSImagesHandler - // AzureGetAzureRegionsHandler sets the operation handler for the get azure regions operation - AzureGetAzureRegionsHandler azure.GetAzureRegionsHandler - // AzureGetAzureResourceGroupsHandler sets the operation handler for the get azure resource groups operation - AzureGetAzureResourceGroupsHandler azure.GetAzureResourceGroupsHandler - // AzureGetAzureVnetsHandler sets the operation handler for the get azure vnets operation - AzureGetAzureVnetsHandler azure.GetAzureVnetsHandler - // FeaturesGetFeatureFlagsHandler sets the operation handler for the get feature flags operation - FeaturesGetFeatureFlagsHandler features.GetFeatureFlagsHandler - // ProviderGetProviderHandler sets the operation handler for the get provider operation - ProviderGetProviderHandler provider.GetProviderHandler - // EditionGetTanzuEditionHandler sets the operation handler for the get tanzu edition operation - EditionGetTanzuEditionHandler edition.GetTanzuEditionHandler - // UIGetUIHandler sets the operation handler for the get UI operation - UIGetUIHandler ui.GetUIHandler - // UIGetUIFileHandler sets the operation handler for the get UI file operation - UIGetUIFileHandler ui.GetUIFileHandler - // AwsGetVPCsHandler sets the operation handler for the get v p cs operation - AwsGetVPCsHandler aws.GetVPCsHandler - // VsphereGetVSphereComputeResourcesHandler sets the operation handler for the get v sphere compute resources operation - VsphereGetVSphereComputeResourcesHandler vsphere.GetVSphereComputeResourcesHandler - // VsphereGetVSphereDatacentersHandler sets the operation handler for the get v sphere datacenters operation - VsphereGetVSphereDatacentersHandler vsphere.GetVSphereDatacentersHandler - // VsphereGetVSphereDatastoresHandler sets the operation handler for the get v sphere datastores operation - VsphereGetVSphereDatastoresHandler vsphere.GetVSphereDatastoresHandler - // VsphereGetVSphereFoldersHandler sets the operation handler for the get v sphere folders operation - VsphereGetVSphereFoldersHandler vsphere.GetVSphereFoldersHandler - // VsphereGetVSphereNetworksHandler sets the operation handler for the get v sphere networks operation - VsphereGetVSphereNetworksHandler vsphere.GetVSphereNetworksHandler - // VsphereGetVSphereNodeTypesHandler sets the operation handler for the get v sphere node types operation - VsphereGetVSphereNodeTypesHandler vsphere.GetVSphereNodeTypesHandler - // VsphereGetVSphereOSImagesHandler sets the operation handler for the get v sphere o s images operation - VsphereGetVSphereOSImagesHandler vsphere.GetVSphereOSImagesHandler - // VsphereGetVSphereResourcePoolsHandler sets the operation handler for the get v sphere resource pools operation - VsphereGetVSphereResourcePoolsHandler vsphere.GetVSphereResourcePoolsHandler - // VsphereGetVsphereThumbprintHandler sets the operation handler for the get vsphere thumbprint operation - VsphereGetVsphereThumbprintHandler vsphere.GetVsphereThumbprintHandler - // AwsImportTKGConfigForAWSHandler sets the operation handler for the import t k g config for a w s operation - AwsImportTKGConfigForAWSHandler aws.ImportTKGConfigForAWSHandler - // AzureImportTKGConfigForAzureHandler sets the operation handler for the import t k g config for azure operation - AzureImportTKGConfigForAzureHandler azure.ImportTKGConfigForAzureHandler - // DockerImportTKGConfigForDockerHandler sets the operation handler for the import t k g config for docker operation - DockerImportTKGConfigForDockerHandler docker.ImportTKGConfigForDockerHandler - // VsphereImportTKGConfigForVsphereHandler sets the operation handler for the import t k g config for vsphere operation - VsphereImportTKGConfigForVsphereHandler vsphere.ImportTKGConfigForVsphereHandler - // AwsSetAWSEndpointHandler sets the operation handler for the set a w s endpoint operation - AwsSetAWSEndpointHandler aws.SetAWSEndpointHandler - // AzureSetAzureEndpointHandler sets the operation handler for the set azure endpoint operation - AzureSetAzureEndpointHandler azure.SetAzureEndpointHandler - // VsphereSetVSphereEndpointHandler sets the operation handler for the set v sphere endpoint operation - VsphereSetVSphereEndpointHandler vsphere.SetVSphereEndpointHandler - // AviVerifyAccountHandler sets the operation handler for the verify account operation - AviVerifyAccountHandler avi.VerifyAccountHandler - // LdapVerifyLdapBindHandler sets the operation handler for the verify ldap bind operation - LdapVerifyLdapBindHandler ldap.VerifyLdapBindHandler - // LdapVerifyLdapCloseConnectionHandler sets the operation handler for the verify ldap close connection operation - LdapVerifyLdapCloseConnectionHandler ldap.VerifyLdapCloseConnectionHandler - // LdapVerifyLdapConnectHandler sets the operation handler for the verify ldap connect operation - LdapVerifyLdapConnectHandler ldap.VerifyLdapConnectHandler - // LdapVerifyLdapGroupSearchHandler sets the operation handler for the verify ldap group search operation - LdapVerifyLdapGroupSearchHandler ldap.VerifyLdapGroupSearchHandler - // LdapVerifyLdapUserSearchHandler sets the operation handler for the verify ldap user search operation - LdapVerifyLdapUserSearchHandler ldap.VerifyLdapUserSearchHandler - - // ServeError is called when an error is received, there is a default handler - // but you can set your own with this - ServeError func(http.ResponseWriter, *http.Request, error) - - // ServerShutdown is called when the HTTP(S) server is shut down and done - // handling all active connections and does not accept connections any more - ServerShutdown func() - - // Custom command line argument groups with their descriptions - CommandLineOptionsGroups []swag.CommandLineOptionsGroup - - // User defined logger function. - Logger func(string, ...interface{}) -} - -// SetDefaultProduces sets the default produces media type -func (o *KickstartUIAPI) SetDefaultProduces(mediaType string) { - o.defaultProduces = mediaType -} - -// SetDefaultConsumes returns the default consumes media type -func (o *KickstartUIAPI) SetDefaultConsumes(mediaType string) { - o.defaultConsumes = mediaType -} - -// SetSpec sets a spec that will be served for the clients. -func (o *KickstartUIAPI) SetSpec(spec *loads.Document) { - o.spec = spec -} - -// DefaultProduces returns the default produces media type -func (o *KickstartUIAPI) DefaultProduces() string { - return o.defaultProduces -} - -// DefaultConsumes returns the default consumes media type -func (o *KickstartUIAPI) DefaultConsumes() string { - return o.defaultConsumes -} - -// Formats returns the registered string formats -func (o *KickstartUIAPI) Formats() strfmt.Registry { - return o.formats -} - -// RegisterFormat registers a custom format validator -func (o *KickstartUIAPI) RegisterFormat(name string, format strfmt.Format, validator strfmt.Validator) { - o.formats.Add(name, format, validator) -} - -// Validate validates the registrations in the KickstartUIAPI -func (o *KickstartUIAPI) Validate() error { - var unregistered []string - - if o.JSONConsumer == nil { - unregistered = append(unregistered, "JSONConsumer") - } - - if o.JSONProducer == nil { - unregistered = append(unregistered, "JSONProducer") - } - - if o.AwsApplyTKGConfigForAWSHandler == nil { - unregistered = append(unregistered, "aws.ApplyTKGConfigForAWSHandler") - } - - if o.AzureApplyTKGConfigForAzureHandler == nil { - unregistered = append(unregistered, "azure.ApplyTKGConfigForAzureHandler") - } - - if o.DockerApplyTKGConfigForDockerHandler == nil { - unregistered = append(unregistered, "docker.ApplyTKGConfigForDockerHandler") - } - - if o.VsphereApplyTKGConfigForVsphereHandler == nil { - unregistered = append(unregistered, "vsphere.ApplyTKGConfigForVsphereHandler") - } - - if o.DockerCheckIfDockerDaemonAvailableHandler == nil { - unregistered = append(unregistered, "docker.CheckIfDockerDaemonAvailableHandler") - } - - if o.AwsCreateAWSRegionalClusterHandler == nil { - unregistered = append(unregistered, "aws.CreateAWSRegionalClusterHandler") - } - - if o.AzureCreateAzureRegionalClusterHandler == nil { - unregistered = append(unregistered, "azure.CreateAzureRegionalClusterHandler") - } - - if o.AzureCreateAzureResourceGroupHandler == nil { - unregistered = append(unregistered, "azure.CreateAzureResourceGroupHandler") - } - - if o.AzureCreateAzureVirtualNetworkHandler == nil { - unregistered = append(unregistered, "azure.CreateAzureVirtualNetworkHandler") - } - - if o.DockerCreateDockerRegionalClusterHandler == nil { - unregistered = append(unregistered, "docker.CreateDockerRegionalClusterHandler") - } - - if o.VsphereCreateVSphereRegionalClusterHandler == nil { - unregistered = append(unregistered, "vsphere.CreateVSphereRegionalClusterHandler") - } - - if o.AwsExportTKGConfigForAWSHandler == nil { - unregistered = append(unregistered, "aws.ExportTKGConfigForAWSHandler") - } - - if o.AzureExportTKGConfigForAzureHandler == nil { - unregistered = append(unregistered, "azure.ExportTKGConfigForAzureHandler") - } - - if o.DockerExportTKGConfigForDockerHandler == nil { - unregistered = append(unregistered, "docker.ExportTKGConfigForDockerHandler") - } - - if o.VsphereExportTKGConfigForVsphereHandler == nil { - unregistered = append(unregistered, "vsphere.ExportTKGConfigForVsphereHandler") - } - - if o.AwsGetAWSAvailabilityZonesHandler == nil { - unregistered = append(unregistered, "aws.GetAWSAvailabilityZonesHandler") - } - - if o.AwsGetAWSCredentialProfilesHandler == nil { - unregistered = append(unregistered, "aws.GetAWSCredentialProfilesHandler") - } - - if o.AwsGetAWSNodeTypesHandler == nil { - unregistered = append(unregistered, "aws.GetAWSNodeTypesHandler") - } - - if o.AwsGetAWSOSImagesHandler == nil { - unregistered = append(unregistered, "aws.GetAWSOSImagesHandler") - } - - if o.AwsGetAWSRegionsHandler == nil { - unregistered = append(unregistered, "aws.GetAWSRegionsHandler") - } - - if o.AwsGetAWSSubnetsHandler == nil { - unregistered = append(unregistered, "aws.GetAWSSubnetsHandler") - } - - if o.AviGetAviCloudsHandler == nil { - unregistered = append(unregistered, "avi.GetAviCloudsHandler") - } - - if o.AviGetAviServiceEngineGroupsHandler == nil { - unregistered = append(unregistered, "avi.GetAviServiceEngineGroupsHandler") - } - - if o.AviGetAviVipNetworksHandler == nil { - unregistered = append(unregistered, "avi.GetAviVipNetworksHandler") - } - - if o.AzureGetAzureEndpointHandler == nil { - unregistered = append(unregistered, "azure.GetAzureEndpointHandler") - } - - if o.AzureGetAzureInstanceTypesHandler == nil { - unregistered = append(unregistered, "azure.GetAzureInstanceTypesHandler") - } - - if o.AzureGetAzureOSImagesHandler == nil { - unregistered = append(unregistered, "azure.GetAzureOSImagesHandler") - } - - if o.AzureGetAzureRegionsHandler == nil { - unregistered = append(unregistered, "azure.GetAzureRegionsHandler") - } - - if o.AzureGetAzureResourceGroupsHandler == nil { - unregistered = append(unregistered, "azure.GetAzureResourceGroupsHandler") - } - - if o.AzureGetAzureVnetsHandler == nil { - unregistered = append(unregistered, "azure.GetAzureVnetsHandler") - } - - if o.FeaturesGetFeatureFlagsHandler == nil { - unregistered = append(unregistered, "features.GetFeatureFlagsHandler") - } - - if o.ProviderGetProviderHandler == nil { - unregistered = append(unregistered, "provider.GetProviderHandler") - } - - if o.EditionGetTanzuEditionHandler == nil { - unregistered = append(unregistered, "edition.GetTanzuEditionHandler") - } - - if o.UIGetUIHandler == nil { - unregistered = append(unregistered, "ui.GetUIHandler") - } - - if o.UIGetUIFileHandler == nil { - unregistered = append(unregistered, "ui.GetUIFileHandler") - } - - if o.AwsGetVPCsHandler == nil { - unregistered = append(unregistered, "aws.GetVPCsHandler") - } - - if o.VsphereGetVSphereComputeResourcesHandler == nil { - unregistered = append(unregistered, "vsphere.GetVSphereComputeResourcesHandler") - } - - if o.VsphereGetVSphereDatacentersHandler == nil { - unregistered = append(unregistered, "vsphere.GetVSphereDatacentersHandler") - } - - if o.VsphereGetVSphereDatastoresHandler == nil { - unregistered = append(unregistered, "vsphere.GetVSphereDatastoresHandler") - } - - if o.VsphereGetVSphereFoldersHandler == nil { - unregistered = append(unregistered, "vsphere.GetVSphereFoldersHandler") - } - - if o.VsphereGetVSphereNetworksHandler == nil { - unregistered = append(unregistered, "vsphere.GetVSphereNetworksHandler") - } - - if o.VsphereGetVSphereNodeTypesHandler == nil { - unregistered = append(unregistered, "vsphere.GetVSphereNodeTypesHandler") - } - - if o.VsphereGetVSphereOSImagesHandler == nil { - unregistered = append(unregistered, "vsphere.GetVSphereOSImagesHandler") - } - - if o.VsphereGetVSphereResourcePoolsHandler == nil { - unregistered = append(unregistered, "vsphere.GetVSphereResourcePoolsHandler") - } - - if o.VsphereGetVsphereThumbprintHandler == nil { - unregistered = append(unregistered, "vsphere.GetVsphereThumbprintHandler") - } - - if o.AwsImportTKGConfigForAWSHandler == nil { - unregistered = append(unregistered, "aws.ImportTKGConfigForAWSHandler") - } - - if o.AzureImportTKGConfigForAzureHandler == nil { - unregistered = append(unregistered, "azure.ImportTKGConfigForAzureHandler") - } - - if o.DockerImportTKGConfigForDockerHandler == nil { - unregistered = append(unregistered, "docker.ImportTKGConfigForDockerHandler") - } - - if o.VsphereImportTKGConfigForVsphereHandler == nil { - unregistered = append(unregistered, "vsphere.ImportTKGConfigForVsphereHandler") - } - - if o.AwsSetAWSEndpointHandler == nil { - unregistered = append(unregistered, "aws.SetAWSEndpointHandler") - } - - if o.AzureSetAzureEndpointHandler == nil { - unregistered = append(unregistered, "azure.SetAzureEndpointHandler") - } - - if o.VsphereSetVSphereEndpointHandler == nil { - unregistered = append(unregistered, "vsphere.SetVSphereEndpointHandler") - } - - if o.AviVerifyAccountHandler == nil { - unregistered = append(unregistered, "avi.VerifyAccountHandler") - } - - if o.LdapVerifyLdapBindHandler == nil { - unregistered = append(unregistered, "ldap.VerifyLdapBindHandler") - } - - if o.LdapVerifyLdapCloseConnectionHandler == nil { - unregistered = append(unregistered, "ldap.VerifyLdapCloseConnectionHandler") - } - - if o.LdapVerifyLdapConnectHandler == nil { - unregistered = append(unregistered, "ldap.VerifyLdapConnectHandler") - } - - if o.LdapVerifyLdapGroupSearchHandler == nil { - unregistered = append(unregistered, "ldap.VerifyLdapGroupSearchHandler") - } - - if o.LdapVerifyLdapUserSearchHandler == nil { - unregistered = append(unregistered, "ldap.VerifyLdapUserSearchHandler") - } - - if len(unregistered) > 0 { - return fmt.Errorf("missing registration: %s", strings.Join(unregistered, ", ")) - } - - return nil -} - -// ServeErrorFor gets a error handler for a given operation id -func (o *KickstartUIAPI) ServeErrorFor(operationID string) func(http.ResponseWriter, *http.Request, error) { - return o.ServeError -} - -// AuthenticatorsFor gets the authenticators for the specified security schemes -func (o *KickstartUIAPI) AuthenticatorsFor(schemes map[string]spec.SecurityScheme) map[string]runtime.Authenticator { - - return nil - -} - -// Authorizer returns the registered authorizer -func (o *KickstartUIAPI) Authorizer() runtime.Authorizer { - - return nil - -} - -// ConsumersFor gets the consumers for the specified media types -func (o *KickstartUIAPI) ConsumersFor(mediaTypes []string) map[string]runtime.Consumer { - - result := make(map[string]runtime.Consumer) - for _, mt := range mediaTypes { - switch mt { - - case "application/json": - result["application/json"] = o.JSONConsumer - - } - - if c, ok := o.customConsumers[mt]; ok { - result[mt] = c - } - } - return result - -} - -// ProducersFor gets the producers for the specified media types -func (o *KickstartUIAPI) ProducersFor(mediaTypes []string) map[string]runtime.Producer { - - result := make(map[string]runtime.Producer) - for _, mt := range mediaTypes { - switch mt { - - case "application/json": - result["application/json"] = o.JSONProducer - - } - - if p, ok := o.customProducers[mt]; ok { - result[mt] = p - } - } - return result - -} - -// HandlerFor gets a http.Handler for the provided operation method and path -func (o *KickstartUIAPI) HandlerFor(method, path string) (http.Handler, bool) { - if o.handlers == nil { - return nil, false - } - um := strings.ToUpper(method) - if _, ok := o.handlers[um]; !ok { - return nil, false - } - if path == "/" { - path = "" - } - h, ok := o.handlers[um][path] - return h, ok -} - -// Context returns the middleware context for the kickstart UI API -func (o *KickstartUIAPI) Context() *middleware.Context { - if o.context == nil { - o.context = middleware.NewRoutableContext(o.spec, o, nil) - } - - return o.context -} - -func (o *KickstartUIAPI) initHandlerCache() { - o.Context() // don't care about the result, just that the initialization happened - - if o.handlers == nil { - o.handlers = make(map[string]map[string]http.Handler) - } - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/aws/tkgconfig"] = aws.NewApplyTKGConfigForAWS(o.context, o.AwsApplyTKGConfigForAWSHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/azure/tkgconfig"] = azure.NewApplyTKGConfigForAzure(o.context, o.AzureApplyTKGConfigForAzureHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/docker/tkgconfig"] = docker.NewApplyTKGConfigForDocker(o.context, o.DockerApplyTKGConfigForDockerHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/vsphere/tkgconfig"] = vsphere.NewApplyTKGConfigForVsphere(o.context, o.VsphereApplyTKGConfigForVsphereHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/docker/daemon"] = docker.NewCheckIfDockerDaemonAvailable(o.context, o.DockerCheckIfDockerDaemonAvailableHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/aws/create"] = aws.NewCreateAWSRegionalCluster(o.context, o.AwsCreateAWSRegionalClusterHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/azure/create"] = azure.NewCreateAzureRegionalCluster(o.context, o.AzureCreateAzureRegionalClusterHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/azure/resourcegroups"] = azure.NewCreateAzureResourceGroup(o.context, o.AzureCreateAzureResourceGroupHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/azure/resourcegroups/{resourceGroupName}/vnets"] = azure.NewCreateAzureVirtualNetwork(o.context, o.AzureCreateAzureVirtualNetworkHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/docker/create"] = docker.NewCreateDockerRegionalCluster(o.context, o.DockerCreateDockerRegionalClusterHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/vsphere/create"] = vsphere.NewCreateVSphereRegionalCluster(o.context, o.VsphereCreateVSphereRegionalClusterHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/aws/config/export"] = aws.NewExportTKGConfigForAWS(o.context, o.AwsExportTKGConfigForAWSHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/azure/config/export"] = azure.NewExportTKGConfigForAzure(o.context, o.AzureExportTKGConfigForAzureHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/docker/config/export"] = docker.NewExportTKGConfigForDocker(o.context, o.DockerExportTKGConfigForDockerHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/vsphere/config/export"] = vsphere.NewExportTKGConfigForVsphere(o.context, o.VsphereExportTKGConfigForVsphereHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/aws/AvailabilityZones"] = aws.NewGetAWSAvailabilityZones(o.context, o.AwsGetAWSAvailabilityZonesHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/aws/profiles"] = aws.NewGetAWSCredentialProfiles(o.context, o.AwsGetAWSCredentialProfilesHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/aws/nodetypes"] = aws.NewGetAWSNodeTypes(o.context, o.AwsGetAWSNodeTypesHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/aws/osimages"] = aws.NewGetAWSOSImages(o.context, o.AwsGetAWSOSImagesHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/aws/regions"] = aws.NewGetAWSRegions(o.context, o.AwsGetAWSRegionsHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/aws/subnets"] = aws.NewGetAWSSubnets(o.context, o.AwsGetAWSSubnetsHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/avi/clouds"] = avi.NewGetAviClouds(o.context, o.AviGetAviCloudsHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/avi/serviceenginegroups"] = avi.NewGetAviServiceEngineGroups(o.context, o.AviGetAviServiceEngineGroupsHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/avi/vipnetworks"] = avi.NewGetAviVipNetworks(o.context, o.AviGetAviVipNetworksHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/azure"] = azure.NewGetAzureEndpoint(o.context, o.AzureGetAzureEndpointHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/azure/regions/{location}/instanceTypes"] = azure.NewGetAzureInstanceTypes(o.context, o.AzureGetAzureInstanceTypesHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/azure/osimages"] = azure.NewGetAzureOSImages(o.context, o.AzureGetAzureOSImagesHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/azure/regions"] = azure.NewGetAzureRegions(o.context, o.AzureGetAzureRegionsHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/azure/resourcegroups"] = azure.NewGetAzureResourceGroups(o.context, o.AzureGetAzureResourceGroupsHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/azure/resourcegroups/{resourceGroupName}/vnets"] = azure.NewGetAzureVnets(o.context, o.AzureGetAzureVnetsHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/features"] = features.NewGetFeatureFlags(o.context, o.FeaturesGetFeatureFlagsHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers"] = provider.NewGetProvider(o.context, o.ProviderGetProviderHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/edition"] = edition.NewGetTanzuEdition(o.context, o.EditionGetTanzuEditionHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"][""] = ui.NewGetUI(o.context, o.UIGetUIHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/{filename}"] = ui.NewGetUIFile(o.context, o.UIGetUIFileHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/aws/vpc"] = aws.NewGetVPCs(o.context, o.AwsGetVPCsHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/vsphere/compute"] = vsphere.NewGetVSphereComputeResources(o.context, o.VsphereGetVSphereComputeResourcesHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/vsphere/datacenters"] = vsphere.NewGetVSphereDatacenters(o.context, o.VsphereGetVSphereDatacentersHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/vsphere/datastores"] = vsphere.NewGetVSphereDatastores(o.context, o.VsphereGetVSphereDatastoresHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/vsphere/folders"] = vsphere.NewGetVSphereFolders(o.context, o.VsphereGetVSphereFoldersHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/vsphere/networks"] = vsphere.NewGetVSphereNetworks(o.context, o.VsphereGetVSphereNetworksHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/vsphere/nodetypes"] = vsphere.NewGetVSphereNodeTypes(o.context, o.VsphereGetVSphereNodeTypesHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/vsphere/osimages"] = vsphere.NewGetVSphereOSImages(o.context, o.VsphereGetVSphereOSImagesHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/vsphere/resourcepools"] = vsphere.NewGetVSphereResourcePools(o.context, o.VsphereGetVSphereResourcePoolsHandler) - - if o.handlers["GET"] == nil { - o.handlers["GET"] = make(map[string]http.Handler) - } - o.handlers["GET"]["/api/providers/vsphere/thumbprint"] = vsphere.NewGetVsphereThumbprint(o.context, o.VsphereGetVsphereThumbprintHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/aws/config/import"] = aws.NewImportTKGConfigForAWS(o.context, o.AwsImportTKGConfigForAWSHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/azure/config/import"] = azure.NewImportTKGConfigForAzure(o.context, o.AzureImportTKGConfigForAzureHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/docker/config/import"] = docker.NewImportTKGConfigForDocker(o.context, o.DockerImportTKGConfigForDockerHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/vsphere/config/import"] = vsphere.NewImportTKGConfigForVsphere(o.context, o.VsphereImportTKGConfigForVsphereHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/aws"] = aws.NewSetAWSEndpoint(o.context, o.AwsSetAWSEndpointHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/azure"] = azure.NewSetAzureEndpoint(o.context, o.AzureSetAzureEndpointHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/providers/vsphere"] = vsphere.NewSetVSphereEndpoint(o.context, o.VsphereSetVSphereEndpointHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/avi"] = avi.NewVerifyAccount(o.context, o.AviVerifyAccountHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/ldap/bind"] = ldap.NewVerifyLdapBind(o.context, o.LdapVerifyLdapBindHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/ldap/disconnect"] = ldap.NewVerifyLdapCloseConnection(o.context, o.LdapVerifyLdapCloseConnectionHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/ldap/connect"] = ldap.NewVerifyLdapConnect(o.context, o.LdapVerifyLdapConnectHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/ldap/groups/search"] = ldap.NewVerifyLdapGroupSearch(o.context, o.LdapVerifyLdapGroupSearchHandler) - - if o.handlers["POST"] == nil { - o.handlers["POST"] = make(map[string]http.Handler) - } - o.handlers["POST"]["/api/ldap/users/search"] = ldap.NewVerifyLdapUserSearch(o.context, o.LdapVerifyLdapUserSearchHandler) - -} - -// Serve creates a http handler to serve the API over HTTP -// can be used directly in http.ListenAndServe(":8000", api.Serve(nil)) -func (o *KickstartUIAPI) Serve(builder middleware.Builder) http.Handler { - o.Init() - - if o.Middleware != nil { - return o.Middleware(builder) - } - return o.context.APIHandler(builder) -} - -// Init allows you to just initialize the handler cache, you can then recompose the middleware as you see fit -func (o *KickstartUIAPI) Init() { - if len(o.handlers) == 0 { - o.initHandlerCache() - } -} - -// RegisterConsumer allows you to add (or override) a consumer for a media type. -func (o *KickstartUIAPI) RegisterConsumer(mediaType string, consumer runtime.Consumer) { - o.customConsumers[mediaType] = consumer -} - -// RegisterProducer allows you to add (or override) a producer for a media type. -func (o *KickstartUIAPI) RegisterProducer(mediaType string, producer runtime.Producer) { - o.customProducers[mediaType] = producer -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_bind.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_bind.go deleted file mode 100644 index 492a2a5666..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_bind.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// VerifyLdapBindHandlerFunc turns a function with the right signature into a verify ldap bind handler -type VerifyLdapBindHandlerFunc func(VerifyLdapBindParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn VerifyLdapBindHandlerFunc) Handle(params VerifyLdapBindParams) middleware.Responder { - return fn(params) -} - -// VerifyLdapBindHandler interface for that can handle valid verify ldap bind params -type VerifyLdapBindHandler interface { - Handle(VerifyLdapBindParams) middleware.Responder -} - -// NewVerifyLdapBind creates a new http.Handler for the verify ldap bind operation -func NewVerifyLdapBind(ctx *middleware.Context, handler VerifyLdapBindHandler) *VerifyLdapBind { - return &VerifyLdapBind{Context: ctx, Handler: handler} -} - -/* -VerifyLdapBind swagger:route POST /api/ldap/bind ldap verifyLdapBind - -Validate LDAP bind or authentication -*/ -type VerifyLdapBind struct { - Context *middleware.Context - Handler VerifyLdapBindHandler -} - -func (o *VerifyLdapBind) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewVerifyLdapBindParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_bind_parameters.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_bind_parameters.go deleted file mode 100644 index f85fcc720e..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_bind_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewVerifyLdapBindParams creates a new VerifyLdapBindParams object -// no default values defined in spec. -func NewVerifyLdapBindParams() VerifyLdapBindParams { - - return VerifyLdapBindParams{} -} - -// VerifyLdapBindParams contains all the bound params for the verify ldap bind operation -// typically these are obtained from a http.Request -// -// swagger:parameters verifyLdapBind -type VerifyLdapBindParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewVerifyLdapBindParams() beforehand. -func (o *VerifyLdapBindParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_bind_responses.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_bind_responses.go deleted file mode 100644 index 007852eddd..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_bind_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyLdapBindOKCode is the HTTP code returned for type VerifyLdapBindOK -const VerifyLdapBindOKCode int = 200 - -/* -VerifyLdapBindOK Verified LDAP credentials successfully - -swagger:response verifyLdapBindOK -*/ -type VerifyLdapBindOK struct { - - /* - In: Body - */ - Payload *models.LdapTestResult `json:"body,omitempty"` -} - -// NewVerifyLdapBindOK creates VerifyLdapBindOK with default headers values -func NewVerifyLdapBindOK() *VerifyLdapBindOK { - - return &VerifyLdapBindOK{} -} - -// WithPayload adds the payload to the verify ldap bind o k response -func (o *VerifyLdapBindOK) WithPayload(payload *models.LdapTestResult) *VerifyLdapBindOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap bind o k response -func (o *VerifyLdapBindOK) SetPayload(payload *models.LdapTestResult) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapBindOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapBindBadRequestCode is the HTTP code returned for type VerifyLdapBindBadRequest -const VerifyLdapBindBadRequestCode int = 400 - -/* -VerifyLdapBindBadRequest Bad request - -swagger:response verifyLdapBindBadRequest -*/ -type VerifyLdapBindBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapBindBadRequest creates VerifyLdapBindBadRequest with default headers values -func NewVerifyLdapBindBadRequest() *VerifyLdapBindBadRequest { - - return &VerifyLdapBindBadRequest{} -} - -// WithPayload adds the payload to the verify ldap bind bad request response -func (o *VerifyLdapBindBadRequest) WithPayload(payload *models.Error) *VerifyLdapBindBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap bind bad request response -func (o *VerifyLdapBindBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapBindBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapBindUnauthorizedCode is the HTTP code returned for type VerifyLdapBindUnauthorized -const VerifyLdapBindUnauthorizedCode int = 401 - -/* -VerifyLdapBindUnauthorized Incorrect credentials - -swagger:response verifyLdapBindUnauthorized -*/ -type VerifyLdapBindUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapBindUnauthorized creates VerifyLdapBindUnauthorized with default headers values -func NewVerifyLdapBindUnauthorized() *VerifyLdapBindUnauthorized { - - return &VerifyLdapBindUnauthorized{} -} - -// WithPayload adds the payload to the verify ldap bind unauthorized response -func (o *VerifyLdapBindUnauthorized) WithPayload(payload *models.Error) *VerifyLdapBindUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap bind unauthorized response -func (o *VerifyLdapBindUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapBindUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapBindInternalServerErrorCode is the HTTP code returned for type VerifyLdapBindInternalServerError -const VerifyLdapBindInternalServerErrorCode int = 500 - -/* -VerifyLdapBindInternalServerError Internal server error - -swagger:response verifyLdapBindInternalServerError -*/ -type VerifyLdapBindInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapBindInternalServerError creates VerifyLdapBindInternalServerError with default headers values -func NewVerifyLdapBindInternalServerError() *VerifyLdapBindInternalServerError { - - return &VerifyLdapBindInternalServerError{} -} - -// WithPayload adds the payload to the verify ldap bind internal server error response -func (o *VerifyLdapBindInternalServerError) WithPayload(payload *models.Error) *VerifyLdapBindInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap bind internal server error response -func (o *VerifyLdapBindInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapBindInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_bind_urlbuilder.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_bind_urlbuilder.go deleted file mode 100644 index f06aa0fb5b..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_bind_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// VerifyLdapBindURL generates an URL for the verify ldap bind operation -type VerifyLdapBindURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyLdapBindURL) WithBasePath(bp string) *VerifyLdapBindURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyLdapBindURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *VerifyLdapBindURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/ldap/bind" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *VerifyLdapBindURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *VerifyLdapBindURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *VerifyLdapBindURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on VerifyLdapBindURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on VerifyLdapBindURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *VerifyLdapBindURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection.go deleted file mode 100644 index 4d8770ea0b..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// VerifyLdapCloseConnectionHandlerFunc turns a function with the right signature into a verify ldap close connection handler -type VerifyLdapCloseConnectionHandlerFunc func(VerifyLdapCloseConnectionParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn VerifyLdapCloseConnectionHandlerFunc) Handle(params VerifyLdapCloseConnectionParams) middleware.Responder { - return fn(params) -} - -// VerifyLdapCloseConnectionHandler interface for that can handle valid verify ldap close connection params -type VerifyLdapCloseConnectionHandler interface { - Handle(VerifyLdapCloseConnectionParams) middleware.Responder -} - -// NewVerifyLdapCloseConnection creates a new http.Handler for the verify ldap close connection operation -func NewVerifyLdapCloseConnection(ctx *middleware.Context, handler VerifyLdapCloseConnectionHandler) *VerifyLdapCloseConnection { - return &VerifyLdapCloseConnection{Context: ctx, Handler: handler} -} - -/* -VerifyLdapCloseConnection swagger:route POST /api/ldap/disconnect ldap verifyLdapCloseConnection - -Validate if the LDAP connection can be closed -*/ -type VerifyLdapCloseConnection struct { - Context *middleware.Context - Handler VerifyLdapCloseConnectionHandler -} - -func (o *VerifyLdapCloseConnection) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewVerifyLdapCloseConnectionParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection_parameters.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection_parameters.go deleted file mode 100644 index e71254c0a5..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewVerifyLdapCloseConnectionParams creates a new VerifyLdapCloseConnectionParams object -// no default values defined in spec. -func NewVerifyLdapCloseConnectionParams() VerifyLdapCloseConnectionParams { - - return VerifyLdapCloseConnectionParams{} -} - -// VerifyLdapCloseConnectionParams contains all the bound params for the verify ldap close connection operation -// typically these are obtained from a http.Request -// -// swagger:parameters verifyLdapCloseConnection -type VerifyLdapCloseConnectionParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewVerifyLdapCloseConnectionParams() beforehand. -func (o *VerifyLdapCloseConnectionParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection_responses.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection_responses.go deleted file mode 100644 index f5f37e43e2..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection_responses.go +++ /dev/null @@ -1,174 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyLdapCloseConnectionCreatedCode is the HTTP code returned for type VerifyLdapCloseConnectionCreated -const VerifyLdapCloseConnectionCreatedCode int = 201 - -/* -VerifyLdapCloseConnectionCreated Verified LDAP credentials successfully - -swagger:response verifyLdapCloseConnectionCreated -*/ -type VerifyLdapCloseConnectionCreated struct { -} - -// NewVerifyLdapCloseConnectionCreated creates VerifyLdapCloseConnectionCreated with default headers values -func NewVerifyLdapCloseConnectionCreated() *VerifyLdapCloseConnectionCreated { - - return &VerifyLdapCloseConnectionCreated{} -} - -// WriteResponse to the client -func (o *VerifyLdapCloseConnectionCreated) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.Header().Del(runtime.HeaderContentType) //Remove Content-Type on empty responses - - rw.WriteHeader(201) -} - -// VerifyLdapCloseConnectionBadRequestCode is the HTTP code returned for type VerifyLdapCloseConnectionBadRequest -const VerifyLdapCloseConnectionBadRequestCode int = 400 - -/* -VerifyLdapCloseConnectionBadRequest Bad request - -swagger:response verifyLdapCloseConnectionBadRequest -*/ -type VerifyLdapCloseConnectionBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapCloseConnectionBadRequest creates VerifyLdapCloseConnectionBadRequest with default headers values -func NewVerifyLdapCloseConnectionBadRequest() *VerifyLdapCloseConnectionBadRequest { - - return &VerifyLdapCloseConnectionBadRequest{} -} - -// WithPayload adds the payload to the verify ldap close connection bad request response -func (o *VerifyLdapCloseConnectionBadRequest) WithPayload(payload *models.Error) *VerifyLdapCloseConnectionBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap close connection bad request response -func (o *VerifyLdapCloseConnectionBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapCloseConnectionBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapCloseConnectionUnauthorizedCode is the HTTP code returned for type VerifyLdapCloseConnectionUnauthorized -const VerifyLdapCloseConnectionUnauthorizedCode int = 401 - -/* -VerifyLdapCloseConnectionUnauthorized Incorrect credentials - -swagger:response verifyLdapCloseConnectionUnauthorized -*/ -type VerifyLdapCloseConnectionUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapCloseConnectionUnauthorized creates VerifyLdapCloseConnectionUnauthorized with default headers values -func NewVerifyLdapCloseConnectionUnauthorized() *VerifyLdapCloseConnectionUnauthorized { - - return &VerifyLdapCloseConnectionUnauthorized{} -} - -// WithPayload adds the payload to the verify ldap close connection unauthorized response -func (o *VerifyLdapCloseConnectionUnauthorized) WithPayload(payload *models.Error) *VerifyLdapCloseConnectionUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap close connection unauthorized response -func (o *VerifyLdapCloseConnectionUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapCloseConnectionUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapCloseConnectionInternalServerErrorCode is the HTTP code returned for type VerifyLdapCloseConnectionInternalServerError -const VerifyLdapCloseConnectionInternalServerErrorCode int = 500 - -/* -VerifyLdapCloseConnectionInternalServerError Internal server error - -swagger:response verifyLdapCloseConnectionInternalServerError -*/ -type VerifyLdapCloseConnectionInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapCloseConnectionInternalServerError creates VerifyLdapCloseConnectionInternalServerError with default headers values -func NewVerifyLdapCloseConnectionInternalServerError() *VerifyLdapCloseConnectionInternalServerError { - - return &VerifyLdapCloseConnectionInternalServerError{} -} - -// WithPayload adds the payload to the verify ldap close connection internal server error response -func (o *VerifyLdapCloseConnectionInternalServerError) WithPayload(payload *models.Error) *VerifyLdapCloseConnectionInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap close connection internal server error response -func (o *VerifyLdapCloseConnectionInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapCloseConnectionInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection_urlbuilder.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection_urlbuilder.go deleted file mode 100644 index 2396f6472f..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_close_connection_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// VerifyLdapCloseConnectionURL generates an URL for the verify ldap close connection operation -type VerifyLdapCloseConnectionURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyLdapCloseConnectionURL) WithBasePath(bp string) *VerifyLdapCloseConnectionURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyLdapCloseConnectionURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *VerifyLdapCloseConnectionURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/ldap/disconnect" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *VerifyLdapCloseConnectionURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *VerifyLdapCloseConnectionURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *VerifyLdapCloseConnectionURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on VerifyLdapCloseConnectionURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on VerifyLdapCloseConnectionURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *VerifyLdapCloseConnectionURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_connect.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_connect.go deleted file mode 100644 index 01aa064ee6..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_connect.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// VerifyLdapConnectHandlerFunc turns a function with the right signature into a verify ldap connect handler -type VerifyLdapConnectHandlerFunc func(VerifyLdapConnectParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn VerifyLdapConnectHandlerFunc) Handle(params VerifyLdapConnectParams) middleware.Responder { - return fn(params) -} - -// VerifyLdapConnectHandler interface for that can handle valid verify ldap connect params -type VerifyLdapConnectHandler interface { - Handle(VerifyLdapConnectParams) middleware.Responder -} - -// NewVerifyLdapConnect creates a new http.Handler for the verify ldap connect operation -func NewVerifyLdapConnect(ctx *middleware.Context, handler VerifyLdapConnectHandler) *VerifyLdapConnect { - return &VerifyLdapConnect{Context: ctx, Handler: handler} -} - -/* -VerifyLdapConnect swagger:route POST /api/ldap/connect ldap verifyLdapConnect - -Validate LDAP connection -*/ -type VerifyLdapConnect struct { - Context *middleware.Context - Handler VerifyLdapConnectHandler -} - -func (o *VerifyLdapConnect) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewVerifyLdapConnectParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_connect_parameters.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_connect_parameters.go deleted file mode 100644 index 45311ed642..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_connect_parameters.go +++ /dev/null @@ -1,69 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewVerifyLdapConnectParams creates a new VerifyLdapConnectParams object -// no default values defined in spec. -func NewVerifyLdapConnectParams() VerifyLdapConnectParams { - - return VerifyLdapConnectParams{} -} - -// VerifyLdapConnectParams contains all the bound params for the verify ldap connect operation -// typically these are obtained from a http.Request -// -// swagger:parameters verifyLdapConnect -type VerifyLdapConnectParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*LDAP configuration - In: body - */ - Credentials *models.LdapParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewVerifyLdapConnectParams() beforehand. -func (o *VerifyLdapConnectParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.LdapParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - res = append(res, errors.NewParseError("credentials", "body", "", err)) - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Credentials = &body - } - } - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_connect_responses.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_connect_responses.go deleted file mode 100644 index cbc78e9cb5..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_connect_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyLdapConnectOKCode is the HTTP code returned for type VerifyLdapConnectOK -const VerifyLdapConnectOKCode int = 200 - -/* -VerifyLdapConnectOK Verified LDAP credentials successfully - -swagger:response verifyLdapConnectOK -*/ -type VerifyLdapConnectOK struct { - - /* - In: Body - */ - Payload *models.LdapTestResult `json:"body,omitempty"` -} - -// NewVerifyLdapConnectOK creates VerifyLdapConnectOK with default headers values -func NewVerifyLdapConnectOK() *VerifyLdapConnectOK { - - return &VerifyLdapConnectOK{} -} - -// WithPayload adds the payload to the verify ldap connect o k response -func (o *VerifyLdapConnectOK) WithPayload(payload *models.LdapTestResult) *VerifyLdapConnectOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap connect o k response -func (o *VerifyLdapConnectOK) SetPayload(payload *models.LdapTestResult) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapConnectOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapConnectBadRequestCode is the HTTP code returned for type VerifyLdapConnectBadRequest -const VerifyLdapConnectBadRequestCode int = 400 - -/* -VerifyLdapConnectBadRequest Bad request - -swagger:response verifyLdapConnectBadRequest -*/ -type VerifyLdapConnectBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapConnectBadRequest creates VerifyLdapConnectBadRequest with default headers values -func NewVerifyLdapConnectBadRequest() *VerifyLdapConnectBadRequest { - - return &VerifyLdapConnectBadRequest{} -} - -// WithPayload adds the payload to the verify ldap connect bad request response -func (o *VerifyLdapConnectBadRequest) WithPayload(payload *models.Error) *VerifyLdapConnectBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap connect bad request response -func (o *VerifyLdapConnectBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapConnectBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapConnectUnauthorizedCode is the HTTP code returned for type VerifyLdapConnectUnauthorized -const VerifyLdapConnectUnauthorizedCode int = 401 - -/* -VerifyLdapConnectUnauthorized Incorrect credentials - -swagger:response verifyLdapConnectUnauthorized -*/ -type VerifyLdapConnectUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapConnectUnauthorized creates VerifyLdapConnectUnauthorized with default headers values -func NewVerifyLdapConnectUnauthorized() *VerifyLdapConnectUnauthorized { - - return &VerifyLdapConnectUnauthorized{} -} - -// WithPayload adds the payload to the verify ldap connect unauthorized response -func (o *VerifyLdapConnectUnauthorized) WithPayload(payload *models.Error) *VerifyLdapConnectUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap connect unauthorized response -func (o *VerifyLdapConnectUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapConnectUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapConnectInternalServerErrorCode is the HTTP code returned for type VerifyLdapConnectInternalServerError -const VerifyLdapConnectInternalServerErrorCode int = 500 - -/* -VerifyLdapConnectInternalServerError Internal server error - -swagger:response verifyLdapConnectInternalServerError -*/ -type VerifyLdapConnectInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapConnectInternalServerError creates VerifyLdapConnectInternalServerError with default headers values -func NewVerifyLdapConnectInternalServerError() *VerifyLdapConnectInternalServerError { - - return &VerifyLdapConnectInternalServerError{} -} - -// WithPayload adds the payload to the verify ldap connect internal server error response -func (o *VerifyLdapConnectInternalServerError) WithPayload(payload *models.Error) *VerifyLdapConnectInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap connect internal server error response -func (o *VerifyLdapConnectInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapConnectInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_connect_urlbuilder.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_connect_urlbuilder.go deleted file mode 100644 index 075f7a1b09..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_connect_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// VerifyLdapConnectURL generates an URL for the verify ldap connect operation -type VerifyLdapConnectURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyLdapConnectURL) WithBasePath(bp string) *VerifyLdapConnectURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyLdapConnectURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *VerifyLdapConnectURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/ldap/connect" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *VerifyLdapConnectURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *VerifyLdapConnectURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *VerifyLdapConnectURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on VerifyLdapConnectURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on VerifyLdapConnectURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *VerifyLdapConnectURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search.go deleted file mode 100644 index 710f348246..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// VerifyLdapGroupSearchHandlerFunc turns a function with the right signature into a verify ldap group search handler -type VerifyLdapGroupSearchHandlerFunc func(VerifyLdapGroupSearchParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn VerifyLdapGroupSearchHandlerFunc) Handle(params VerifyLdapGroupSearchParams) middleware.Responder { - return fn(params) -} - -// VerifyLdapGroupSearchHandler interface for that can handle valid verify ldap group search params -type VerifyLdapGroupSearchHandler interface { - Handle(VerifyLdapGroupSearchParams) middleware.Responder -} - -// NewVerifyLdapGroupSearch creates a new http.Handler for the verify ldap group search operation -func NewVerifyLdapGroupSearch(ctx *middleware.Context, handler VerifyLdapGroupSearchHandler) *VerifyLdapGroupSearch { - return &VerifyLdapGroupSearch{Context: ctx, Handler: handler} -} - -/* -VerifyLdapGroupSearch swagger:route POST /api/ldap/groups/search ldap verifyLdapGroupSearch - -Validate LDAP Group Search configuration -*/ -type VerifyLdapGroupSearch struct { - Context *middleware.Context - Handler VerifyLdapGroupSearchHandler -} - -func (o *VerifyLdapGroupSearch) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewVerifyLdapGroupSearchParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search_parameters.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search_parameters.go deleted file mode 100644 index 152d0ede95..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewVerifyLdapGroupSearchParams creates a new VerifyLdapGroupSearchParams object -// no default values defined in spec. -func NewVerifyLdapGroupSearchParams() VerifyLdapGroupSearchParams { - - return VerifyLdapGroupSearchParams{} -} - -// VerifyLdapGroupSearchParams contains all the bound params for the verify ldap group search operation -// typically these are obtained from a http.Request -// -// swagger:parameters verifyLdapGroupSearch -type VerifyLdapGroupSearchParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewVerifyLdapGroupSearchParams() beforehand. -func (o *VerifyLdapGroupSearchParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search_responses.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search_responses.go deleted file mode 100644 index 2f567318d5..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyLdapGroupSearchOKCode is the HTTP code returned for type VerifyLdapGroupSearchOK -const VerifyLdapGroupSearchOKCode int = 200 - -/* -VerifyLdapGroupSearchOK Verified LDAP credentials successfully - -swagger:response verifyLdapGroupSearchOK -*/ -type VerifyLdapGroupSearchOK struct { - - /* - In: Body - */ - Payload *models.LdapTestResult `json:"body,omitempty"` -} - -// NewVerifyLdapGroupSearchOK creates VerifyLdapGroupSearchOK with default headers values -func NewVerifyLdapGroupSearchOK() *VerifyLdapGroupSearchOK { - - return &VerifyLdapGroupSearchOK{} -} - -// WithPayload adds the payload to the verify ldap group search o k response -func (o *VerifyLdapGroupSearchOK) WithPayload(payload *models.LdapTestResult) *VerifyLdapGroupSearchOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap group search o k response -func (o *VerifyLdapGroupSearchOK) SetPayload(payload *models.LdapTestResult) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapGroupSearchOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapGroupSearchBadRequestCode is the HTTP code returned for type VerifyLdapGroupSearchBadRequest -const VerifyLdapGroupSearchBadRequestCode int = 400 - -/* -VerifyLdapGroupSearchBadRequest Bad request - -swagger:response verifyLdapGroupSearchBadRequest -*/ -type VerifyLdapGroupSearchBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapGroupSearchBadRequest creates VerifyLdapGroupSearchBadRequest with default headers values -func NewVerifyLdapGroupSearchBadRequest() *VerifyLdapGroupSearchBadRequest { - - return &VerifyLdapGroupSearchBadRequest{} -} - -// WithPayload adds the payload to the verify ldap group search bad request response -func (o *VerifyLdapGroupSearchBadRequest) WithPayload(payload *models.Error) *VerifyLdapGroupSearchBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap group search bad request response -func (o *VerifyLdapGroupSearchBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapGroupSearchBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapGroupSearchUnauthorizedCode is the HTTP code returned for type VerifyLdapGroupSearchUnauthorized -const VerifyLdapGroupSearchUnauthorizedCode int = 401 - -/* -VerifyLdapGroupSearchUnauthorized Incorrect credentials - -swagger:response verifyLdapGroupSearchUnauthorized -*/ -type VerifyLdapGroupSearchUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapGroupSearchUnauthorized creates VerifyLdapGroupSearchUnauthorized with default headers values -func NewVerifyLdapGroupSearchUnauthorized() *VerifyLdapGroupSearchUnauthorized { - - return &VerifyLdapGroupSearchUnauthorized{} -} - -// WithPayload adds the payload to the verify ldap group search unauthorized response -func (o *VerifyLdapGroupSearchUnauthorized) WithPayload(payload *models.Error) *VerifyLdapGroupSearchUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap group search unauthorized response -func (o *VerifyLdapGroupSearchUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapGroupSearchUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapGroupSearchInternalServerErrorCode is the HTTP code returned for type VerifyLdapGroupSearchInternalServerError -const VerifyLdapGroupSearchInternalServerErrorCode int = 500 - -/* -VerifyLdapGroupSearchInternalServerError Internal server error - -swagger:response verifyLdapGroupSearchInternalServerError -*/ -type VerifyLdapGroupSearchInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapGroupSearchInternalServerError creates VerifyLdapGroupSearchInternalServerError with default headers values -func NewVerifyLdapGroupSearchInternalServerError() *VerifyLdapGroupSearchInternalServerError { - - return &VerifyLdapGroupSearchInternalServerError{} -} - -// WithPayload adds the payload to the verify ldap group search internal server error response -func (o *VerifyLdapGroupSearchInternalServerError) WithPayload(payload *models.Error) *VerifyLdapGroupSearchInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap group search internal server error response -func (o *VerifyLdapGroupSearchInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapGroupSearchInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search_urlbuilder.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search_urlbuilder.go deleted file mode 100644 index f218fec772..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_group_search_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// VerifyLdapGroupSearchURL generates an URL for the verify ldap group search operation -type VerifyLdapGroupSearchURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyLdapGroupSearchURL) WithBasePath(bp string) *VerifyLdapGroupSearchURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyLdapGroupSearchURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *VerifyLdapGroupSearchURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/ldap/groups/search" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *VerifyLdapGroupSearchURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *VerifyLdapGroupSearchURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *VerifyLdapGroupSearchURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on VerifyLdapGroupSearchURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on VerifyLdapGroupSearchURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *VerifyLdapGroupSearchURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search.go deleted file mode 100644 index dda9cc7591..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// VerifyLdapUserSearchHandlerFunc turns a function with the right signature into a verify ldap user search handler -type VerifyLdapUserSearchHandlerFunc func(VerifyLdapUserSearchParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn VerifyLdapUserSearchHandlerFunc) Handle(params VerifyLdapUserSearchParams) middleware.Responder { - return fn(params) -} - -// VerifyLdapUserSearchHandler interface for that can handle valid verify ldap user search params -type VerifyLdapUserSearchHandler interface { - Handle(VerifyLdapUserSearchParams) middleware.Responder -} - -// NewVerifyLdapUserSearch creates a new http.Handler for the verify ldap user search operation -func NewVerifyLdapUserSearch(ctx *middleware.Context, handler VerifyLdapUserSearchHandler) *VerifyLdapUserSearch { - return &VerifyLdapUserSearch{Context: ctx, Handler: handler} -} - -/* -VerifyLdapUserSearch swagger:route POST /api/ldap/users/search ldap verifyLdapUserSearch - -Validate LDAP User Search configuration -*/ -type VerifyLdapUserSearch struct { - Context *middleware.Context - Handler VerifyLdapUserSearchHandler -} - -func (o *VerifyLdapUserSearch) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewVerifyLdapUserSearchParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search_parameters.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search_parameters.go deleted file mode 100644 index cfcdefec56..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewVerifyLdapUserSearchParams creates a new VerifyLdapUserSearchParams object -// no default values defined in spec. -func NewVerifyLdapUserSearchParams() VerifyLdapUserSearchParams { - - return VerifyLdapUserSearchParams{} -} - -// VerifyLdapUserSearchParams contains all the bound params for the verify ldap user search operation -// typically these are obtained from a http.Request -// -// swagger:parameters verifyLdapUserSearch -type VerifyLdapUserSearchParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewVerifyLdapUserSearchParams() beforehand. -func (o *VerifyLdapUserSearchParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search_responses.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search_responses.go deleted file mode 100644 index 591353bc27..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// VerifyLdapUserSearchOKCode is the HTTP code returned for type VerifyLdapUserSearchOK -const VerifyLdapUserSearchOKCode int = 200 - -/* -VerifyLdapUserSearchOK Verified LDAP credentials successfully - -swagger:response verifyLdapUserSearchOK -*/ -type VerifyLdapUserSearchOK struct { - - /* - In: Body - */ - Payload *models.LdapTestResult `json:"body,omitempty"` -} - -// NewVerifyLdapUserSearchOK creates VerifyLdapUserSearchOK with default headers values -func NewVerifyLdapUserSearchOK() *VerifyLdapUserSearchOK { - - return &VerifyLdapUserSearchOK{} -} - -// WithPayload adds the payload to the verify ldap user search o k response -func (o *VerifyLdapUserSearchOK) WithPayload(payload *models.LdapTestResult) *VerifyLdapUserSearchOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap user search o k response -func (o *VerifyLdapUserSearchOK) SetPayload(payload *models.LdapTestResult) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapUserSearchOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapUserSearchBadRequestCode is the HTTP code returned for type VerifyLdapUserSearchBadRequest -const VerifyLdapUserSearchBadRequestCode int = 400 - -/* -VerifyLdapUserSearchBadRequest Bad request - -swagger:response verifyLdapUserSearchBadRequest -*/ -type VerifyLdapUserSearchBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapUserSearchBadRequest creates VerifyLdapUserSearchBadRequest with default headers values -func NewVerifyLdapUserSearchBadRequest() *VerifyLdapUserSearchBadRequest { - - return &VerifyLdapUserSearchBadRequest{} -} - -// WithPayload adds the payload to the verify ldap user search bad request response -func (o *VerifyLdapUserSearchBadRequest) WithPayload(payload *models.Error) *VerifyLdapUserSearchBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap user search bad request response -func (o *VerifyLdapUserSearchBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapUserSearchBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapUserSearchUnauthorizedCode is the HTTP code returned for type VerifyLdapUserSearchUnauthorized -const VerifyLdapUserSearchUnauthorizedCode int = 401 - -/* -VerifyLdapUserSearchUnauthorized Incorrect credentials - -swagger:response verifyLdapUserSearchUnauthorized -*/ -type VerifyLdapUserSearchUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapUserSearchUnauthorized creates VerifyLdapUserSearchUnauthorized with default headers values -func NewVerifyLdapUserSearchUnauthorized() *VerifyLdapUserSearchUnauthorized { - - return &VerifyLdapUserSearchUnauthorized{} -} - -// WithPayload adds the payload to the verify ldap user search unauthorized response -func (o *VerifyLdapUserSearchUnauthorized) WithPayload(payload *models.Error) *VerifyLdapUserSearchUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap user search unauthorized response -func (o *VerifyLdapUserSearchUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapUserSearchUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// VerifyLdapUserSearchInternalServerErrorCode is the HTTP code returned for type VerifyLdapUserSearchInternalServerError -const VerifyLdapUserSearchInternalServerErrorCode int = 500 - -/* -VerifyLdapUserSearchInternalServerError Internal server error - -swagger:response verifyLdapUserSearchInternalServerError -*/ -type VerifyLdapUserSearchInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewVerifyLdapUserSearchInternalServerError creates VerifyLdapUserSearchInternalServerError with default headers values -func NewVerifyLdapUserSearchInternalServerError() *VerifyLdapUserSearchInternalServerError { - - return &VerifyLdapUserSearchInternalServerError{} -} - -// WithPayload adds the payload to the verify ldap user search internal server error response -func (o *VerifyLdapUserSearchInternalServerError) WithPayload(payload *models.Error) *VerifyLdapUserSearchInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the verify ldap user search internal server error response -func (o *VerifyLdapUserSearchInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *VerifyLdapUserSearchInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search_urlbuilder.go b/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search_urlbuilder.go deleted file mode 100644 index af2c844202..0000000000 --- a/tkg/web/server/restapi/operations/ldap/verify_ldap_user_search_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ldap - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// VerifyLdapUserSearchURL generates an URL for the verify ldap user search operation -type VerifyLdapUserSearchURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyLdapUserSearchURL) WithBasePath(bp string) *VerifyLdapUserSearchURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *VerifyLdapUserSearchURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *VerifyLdapUserSearchURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/ldap/users/search" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *VerifyLdapUserSearchURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *VerifyLdapUserSearchURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *VerifyLdapUserSearchURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on VerifyLdapUserSearchURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on VerifyLdapUserSearchURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *VerifyLdapUserSearchURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/provider/get_provider.go b/tkg/web/server/restapi/operations/provider/get_provider.go deleted file mode 100644 index c535a76187..0000000000 --- a/tkg/web/server/restapi/operations/provider/get_provider.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package provider - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetProviderHandlerFunc turns a function with the right signature into a get provider handler -type GetProviderHandlerFunc func(GetProviderParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetProviderHandlerFunc) Handle(params GetProviderParams) middleware.Responder { - return fn(params) -} - -// GetProviderHandler interface for that can handle valid get provider params -type GetProviderHandler interface { - Handle(GetProviderParams) middleware.Responder -} - -// NewGetProvider creates a new http.Handler for the get provider operation -func NewGetProvider(ctx *middleware.Context, handler GetProviderHandler) *GetProvider { - return &GetProvider{Context: ctx, Handler: handler} -} - -/* -GetProvider swagger:route GET /api/providers provider getProvider - -Get infrastructure provider given by the user via cli -*/ -type GetProvider struct { - Context *middleware.Context - Handler GetProviderHandler -} - -func (o *GetProvider) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetProviderParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/provider/get_provider_parameters.go b/tkg/web/server/restapi/operations/provider/get_provider_parameters.go deleted file mode 100644 index 2e81de0f8d..0000000000 --- a/tkg/web/server/restapi/operations/provider/get_provider_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package provider - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetProviderParams creates a new GetProviderParams object -// no default values defined in spec. -func NewGetProviderParams() GetProviderParams { - - return GetProviderParams{} -} - -// GetProviderParams contains all the bound params for the get provider operation -// typically these are obtained from a http.Request -// -// swagger:parameters getProvider -type GetProviderParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetProviderParams() beforehand. -func (o *GetProviderParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/provider/get_provider_responses.go b/tkg/web/server/restapi/operations/provider/get_provider_responses.go deleted file mode 100644 index a2258b8413..0000000000 --- a/tkg/web/server/restapi/operations/provider/get_provider_responses.go +++ /dev/null @@ -1,149 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package provider - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetProviderOKCode is the HTTP code returned for type GetProviderOK -const GetProviderOKCode int = 200 - -/* -GetProviderOK Successful operation - -swagger:response getProviderOK -*/ -type GetProviderOK struct { - - /* - In: Body - */ - Payload *models.ProviderInfo `json:"body,omitempty"` -} - -// NewGetProviderOK creates GetProviderOK with default headers values -func NewGetProviderOK() *GetProviderOK { - - return &GetProviderOK{} -} - -// WithPayload adds the payload to the get provider o k response -func (o *GetProviderOK) WithPayload(payload *models.ProviderInfo) *GetProviderOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get provider o k response -func (o *GetProviderOK) SetPayload(payload *models.ProviderInfo) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetProviderOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetProviderBadRequestCode is the HTTP code returned for type GetProviderBadRequest -const GetProviderBadRequestCode int = 400 - -/* -GetProviderBadRequest Bad request - -swagger:response getProviderBadRequest -*/ -type GetProviderBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetProviderBadRequest creates GetProviderBadRequest with default headers values -func NewGetProviderBadRequest() *GetProviderBadRequest { - - return &GetProviderBadRequest{} -} - -// WithPayload adds the payload to the get provider bad request response -func (o *GetProviderBadRequest) WithPayload(payload *models.Error) *GetProviderBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get provider bad request response -func (o *GetProviderBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetProviderBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetProviderInternalServerErrorCode is the HTTP code returned for type GetProviderInternalServerError -const GetProviderInternalServerErrorCode int = 500 - -/* -GetProviderInternalServerError Internal server error - -swagger:response getProviderInternalServerError -*/ -type GetProviderInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetProviderInternalServerError creates GetProviderInternalServerError with default headers values -func NewGetProviderInternalServerError() *GetProviderInternalServerError { - - return &GetProviderInternalServerError{} -} - -// WithPayload adds the payload to the get provider internal server error response -func (o *GetProviderInternalServerError) WithPayload(payload *models.Error) *GetProviderInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get provider internal server error response -func (o *GetProviderInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetProviderInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/provider/get_provider_urlbuilder.go b/tkg/web/server/restapi/operations/provider/get_provider_urlbuilder.go deleted file mode 100644 index 5497a94bed..0000000000 --- a/tkg/web/server/restapi/operations/provider/get_provider_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package provider - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetProviderURL generates an URL for the get provider operation -type GetProviderURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetProviderURL) WithBasePath(bp string) *GetProviderURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetProviderURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetProviderURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetProviderURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetProviderURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetProviderURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetProviderURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetProviderURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetProviderURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/ui/get_ui.go b/tkg/web/server/restapi/operations/ui/get_ui.go deleted file mode 100644 index e49fd0e5c9..0000000000 --- a/tkg/web/server/restapi/operations/ui/get_ui.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetUIHandlerFunc turns a function with the right signature into a get UI handler -type GetUIHandlerFunc func(GetUIParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetUIHandlerFunc) Handle(params GetUIParams) middleware.Responder { - return fn(params) -} - -// GetUIHandler interface for that can handle valid get UI params -type GetUIHandler interface { - Handle(GetUIParams) middleware.Responder -} - -// NewGetUI creates a new http.Handler for the get UI operation -func NewGetUI(ctx *middleware.Context, handler GetUIHandler) *GetUI { - return &GetUI{Context: ctx, Handler: handler} -} - -/* -GetUI swagger:route GET / ui getUi - -Get the kickstart UI -*/ -type GetUI struct { - Context *middleware.Context - Handler GetUIHandler -} - -func (o *GetUI) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetUIParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/ui/get_ui_file.go b/tkg/web/server/restapi/operations/ui/get_ui_file.go deleted file mode 100644 index d57c874b58..0000000000 --- a/tkg/web/server/restapi/operations/ui/get_ui_file.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetUIFileHandlerFunc turns a function with the right signature into a get UI file handler -type GetUIFileHandlerFunc func(GetUIFileParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetUIFileHandlerFunc) Handle(params GetUIFileParams) middleware.Responder { - return fn(params) -} - -// GetUIFileHandler interface for that can handle valid get UI file params -type GetUIFileHandler interface { - Handle(GetUIFileParams) middleware.Responder -} - -// NewGetUIFile creates a new http.Handler for the get UI file operation -func NewGetUIFile(ctx *middleware.Context, handler GetUIFileHandler) *GetUIFile { - return &GetUIFile{Context: ctx, Handler: handler} -} - -/* -GetUIFile swagger:route GET /{filename} ui getUiFile - -Get the kickstart UI static resource file -*/ -type GetUIFile struct { - Context *middleware.Context - Handler GetUIFileHandler -} - -func (o *GetUIFile) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetUIFileParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/ui/get_ui_file_parameters.go b/tkg/web/server/restapi/operations/ui/get_ui_file_parameters.go deleted file mode 100644 index 74b359bb9b..0000000000 --- a/tkg/web/server/restapi/operations/ui/get_ui_file_parameters.go +++ /dev/null @@ -1,73 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetUIFileParams creates a new GetUIFileParams object -// no default values defined in spec. -func NewGetUIFileParams() GetUIFileParams { - - return GetUIFileParams{} -} - -// GetUIFileParams contains all the bound params for the get UI file operation -// typically these are obtained from a http.Request -// -// swagger:parameters getUIFile -type GetUIFileParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*UI file name - Required: true - In: path - */ - Filename string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetUIFileParams() beforehand. -func (o *GetUIFileParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - rFilename, rhkFilename, _ := route.Params.GetOK("filename") - if err := o.bindFilename(rFilename, rhkFilename, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindFilename binds and validates parameter Filename from path. -func (o *GetUIFileParams) bindFilename(rawData []string, hasKey bool, formats strfmt.Registry) error { - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // Parameter is provided by construction from the route - - o.Filename = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/ui/get_ui_file_responses.go b/tkg/web/server/restapi/operations/ui/get_ui_file_responses.go deleted file mode 100644 index 0be82f4094..0000000000 --- a/tkg/web/server/restapi/operations/ui/get_ui_file_responses.go +++ /dev/null @@ -1,148 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetUIFileOKCode is the HTTP code returned for type GetUIFileOK -const GetUIFileOKCode int = 200 - -/* -GetUIFileOK Successful operation - -swagger:response getUiFileOK -*/ -type GetUIFileOK struct { - - /* - In: Body - */ - Payload io.ReadCloser `json:"body,omitempty"` -} - -// NewGetUIFileOK creates GetUIFileOK with default headers values -func NewGetUIFileOK() *GetUIFileOK { - - return &GetUIFileOK{} -} - -// WithPayload adds the payload to the get Ui file o k response -func (o *GetUIFileOK) WithPayload(payload io.ReadCloser) *GetUIFileOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get Ui file o k response -func (o *GetUIFileOK) SetPayload(payload io.ReadCloser) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetUIFileOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetUIFileBadRequestCode is the HTTP code returned for type GetUIFileBadRequest -const GetUIFileBadRequestCode int = 400 - -/* -GetUIFileBadRequest Bad request - -swagger:response getUiFileBadRequest -*/ -type GetUIFileBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetUIFileBadRequest creates GetUIFileBadRequest with default headers values -func NewGetUIFileBadRequest() *GetUIFileBadRequest { - - return &GetUIFileBadRequest{} -} - -// WithPayload adds the payload to the get Ui file bad request response -func (o *GetUIFileBadRequest) WithPayload(payload *models.Error) *GetUIFileBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get Ui file bad request response -func (o *GetUIFileBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetUIFileBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetUIFileInternalServerErrorCode is the HTTP code returned for type GetUIFileInternalServerError -const GetUIFileInternalServerErrorCode int = 500 - -/* -GetUIFileInternalServerError Internal server error - -swagger:response getUiFileInternalServerError -*/ -type GetUIFileInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetUIFileInternalServerError creates GetUIFileInternalServerError with default headers values -func NewGetUIFileInternalServerError() *GetUIFileInternalServerError { - - return &GetUIFileInternalServerError{} -} - -// WithPayload adds the payload to the get Ui file internal server error response -func (o *GetUIFileInternalServerError) WithPayload(payload *models.Error) *GetUIFileInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get Ui file internal server error response -func (o *GetUIFileInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetUIFileInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/ui/get_ui_file_urlbuilder.go b/tkg/web/server/restapi/operations/ui/get_ui_file_urlbuilder.go deleted file mode 100644 index 3534f7be91..0000000000 --- a/tkg/web/server/restapi/operations/ui/get_ui_file_urlbuilder.go +++ /dev/null @@ -1,99 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" - "strings" -) - -// GetUIFileURL generates an URL for the get UI file operation -type GetUIFileURL struct { - Filename string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetUIFileURL) WithBasePath(bp string) *GetUIFileURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetUIFileURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetUIFileURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/{filename}" - - filename := o.Filename - if filename != "" { - _path = strings.Replace(_path, "{filename}", filename, -1) - } else { - return nil, errors.New("filename is required on GetUIFileURL") - } - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetUIFileURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetUIFileURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetUIFileURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetUIFileURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetUIFileURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetUIFileURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/ui/get_ui_parameters.go b/tkg/web/server/restapi/operations/ui/get_ui_parameters.go deleted file mode 100644 index 2c2e4b9289..0000000000 --- a/tkg/web/server/restapi/operations/ui/get_ui_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetUIParams creates a new GetUIParams object -// no default values defined in spec. -func NewGetUIParams() GetUIParams { - - return GetUIParams{} -} - -// GetUIParams contains all the bound params for the get UI operation -// typically these are obtained from a http.Request -// -// swagger:parameters getUI -type GetUIParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetUIParams() beforehand. -func (o *GetUIParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/ui/get_ui_responses.go b/tkg/web/server/restapi/operations/ui/get_ui_responses.go deleted file mode 100644 index e01ca71049..0000000000 --- a/tkg/web/server/restapi/operations/ui/get_ui_responses.go +++ /dev/null @@ -1,148 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetUIOKCode is the HTTP code returned for type GetUIOK -const GetUIOKCode int = 200 - -/* -GetUIOK Successful operation - -swagger:response getUiOK -*/ -type GetUIOK struct { - - /* - In: Body - */ - Payload io.ReadCloser `json:"body,omitempty"` -} - -// NewGetUIOK creates GetUIOK with default headers values -func NewGetUIOK() *GetUIOK { - - return &GetUIOK{} -} - -// WithPayload adds the payload to the get Ui o k response -func (o *GetUIOK) WithPayload(payload io.ReadCloser) *GetUIOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get Ui o k response -func (o *GetUIOK) SetPayload(payload io.ReadCloser) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetUIOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetUIBadRequestCode is the HTTP code returned for type GetUIBadRequest -const GetUIBadRequestCode int = 400 - -/* -GetUIBadRequest Bad request - -swagger:response getUiBadRequest -*/ -type GetUIBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetUIBadRequest creates GetUIBadRequest with default headers values -func NewGetUIBadRequest() *GetUIBadRequest { - - return &GetUIBadRequest{} -} - -// WithPayload adds the payload to the get Ui bad request response -func (o *GetUIBadRequest) WithPayload(payload *models.Error) *GetUIBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get Ui bad request response -func (o *GetUIBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetUIBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetUIInternalServerErrorCode is the HTTP code returned for type GetUIInternalServerError -const GetUIInternalServerErrorCode int = 500 - -/* -GetUIInternalServerError Internal server error - -swagger:response getUiInternalServerError -*/ -type GetUIInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetUIInternalServerError creates GetUIInternalServerError with default headers values -func NewGetUIInternalServerError() *GetUIInternalServerError { - - return &GetUIInternalServerError{} -} - -// WithPayload adds the payload to the get Ui internal server error response -func (o *GetUIInternalServerError) WithPayload(payload *models.Error) *GetUIInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get Ui internal server error response -func (o *GetUIInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetUIInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/ui/get_ui_urlbuilder.go b/tkg/web/server/restapi/operations/ui/get_ui_urlbuilder.go deleted file mode 100644 index 069bd8a19d..0000000000 --- a/tkg/web/server/restapi/operations/ui/get_ui_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package ui - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetUIURL generates an URL for the get UI operation -type GetUIURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetUIURL) WithBasePath(bp string) *GetUIURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetUIURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetUIURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetUIURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetUIURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetUIURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetUIURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetUIURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetUIURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere.go b/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere.go deleted file mode 100644 index 568b8bc9a4..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ApplyTKGConfigForVsphereHandlerFunc turns a function with the right signature into a apply t k g config for vsphere handler -type ApplyTKGConfigForVsphereHandlerFunc func(ApplyTKGConfigForVsphereParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ApplyTKGConfigForVsphereHandlerFunc) Handle(params ApplyTKGConfigForVsphereParams) middleware.Responder { - return fn(params) -} - -// ApplyTKGConfigForVsphereHandler interface for that can handle valid apply t k g config for vsphere params -type ApplyTKGConfigForVsphereHandler interface { - Handle(ApplyTKGConfigForVsphereParams) middleware.Responder -} - -// NewApplyTKGConfigForVsphere creates a new http.Handler for the apply t k g config for vsphere operation -func NewApplyTKGConfigForVsphere(ctx *middleware.Context, handler ApplyTKGConfigForVsphereHandler) *ApplyTKGConfigForVsphere { - return &ApplyTKGConfigForVsphere{Context: ctx, Handler: handler} -} - -/* -ApplyTKGConfigForVsphere swagger:route POST /api/providers/vsphere/tkgconfig vsphere applyTKGConfigForVsphere - -Apply changes to TKG configuration file for vSphere -*/ -type ApplyTKGConfigForVsphere struct { - Context *middleware.Context - Handler ApplyTKGConfigForVsphereHandler -} - -func (o *ApplyTKGConfigForVsphere) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewApplyTKGConfigForVsphereParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere_parameters.go b/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere_parameters.go deleted file mode 100644 index faac287002..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewApplyTKGConfigForVsphereParams creates a new ApplyTKGConfigForVsphereParams object -// no default values defined in spec. -func NewApplyTKGConfigForVsphereParams() ApplyTKGConfigForVsphereParams { - - return ApplyTKGConfigForVsphereParams{} -} - -// ApplyTKGConfigForVsphereParams contains all the bound params for the apply t k g config for vsphere operation -// typically these are obtained from a http.Request -// -// swagger:parameters applyTKGConfigForVsphere -type ApplyTKGConfigForVsphereParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*params to apply changes to tkg configuration for vsphere - Required: true - In: body - */ - Params *models.VsphereRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewApplyTKGConfigForVsphereParams() beforehand. -func (o *ApplyTKGConfigForVsphereParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.VsphereRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere_responses.go b/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere_responses.go deleted file mode 100644 index 6ae5d6241d..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ApplyTKGConfigForVsphereOKCode is the HTTP code returned for type ApplyTKGConfigForVsphereOK -const ApplyTKGConfigForVsphereOKCode int = 200 - -/* -ApplyTKGConfigForVsphereOK apply changes to TKG configuration file successfully - -swagger:response applyTKGConfigForVsphereOK -*/ -type ApplyTKGConfigForVsphereOK struct { - - /* - In: Body - */ - Payload *models.ConfigFileInfo `json:"body,omitempty"` -} - -// NewApplyTKGConfigForVsphereOK creates ApplyTKGConfigForVsphereOK with default headers values -func NewApplyTKGConfigForVsphereOK() *ApplyTKGConfigForVsphereOK { - - return &ApplyTKGConfigForVsphereOK{} -} - -// WithPayload adds the payload to the apply t k g config for vsphere o k response -func (o *ApplyTKGConfigForVsphereOK) WithPayload(payload *models.ConfigFileInfo) *ApplyTKGConfigForVsphereOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for vsphere o k response -func (o *ApplyTKGConfigForVsphereOK) SetPayload(payload *models.ConfigFileInfo) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForVsphereOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ApplyTKGConfigForVsphereBadRequestCode is the HTTP code returned for type ApplyTKGConfigForVsphereBadRequest -const ApplyTKGConfigForVsphereBadRequestCode int = 400 - -/* -ApplyTKGConfigForVsphereBadRequest Bad request - -swagger:response applyTKGConfigForVsphereBadRequest -*/ -type ApplyTKGConfigForVsphereBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewApplyTKGConfigForVsphereBadRequest creates ApplyTKGConfigForVsphereBadRequest with default headers values -func NewApplyTKGConfigForVsphereBadRequest() *ApplyTKGConfigForVsphereBadRequest { - - return &ApplyTKGConfigForVsphereBadRequest{} -} - -// WithPayload adds the payload to the apply t k g config for vsphere bad request response -func (o *ApplyTKGConfigForVsphereBadRequest) WithPayload(payload *models.Error) *ApplyTKGConfigForVsphereBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for vsphere bad request response -func (o *ApplyTKGConfigForVsphereBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForVsphereBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ApplyTKGConfigForVsphereUnauthorizedCode is the HTTP code returned for type ApplyTKGConfigForVsphereUnauthorized -const ApplyTKGConfigForVsphereUnauthorizedCode int = 401 - -/* -ApplyTKGConfigForVsphereUnauthorized Incorrect credentials - -swagger:response applyTKGConfigForVsphereUnauthorized -*/ -type ApplyTKGConfigForVsphereUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewApplyTKGConfigForVsphereUnauthorized creates ApplyTKGConfigForVsphereUnauthorized with default headers values -func NewApplyTKGConfigForVsphereUnauthorized() *ApplyTKGConfigForVsphereUnauthorized { - - return &ApplyTKGConfigForVsphereUnauthorized{} -} - -// WithPayload adds the payload to the apply t k g config for vsphere unauthorized response -func (o *ApplyTKGConfigForVsphereUnauthorized) WithPayload(payload *models.Error) *ApplyTKGConfigForVsphereUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for vsphere unauthorized response -func (o *ApplyTKGConfigForVsphereUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForVsphereUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ApplyTKGConfigForVsphereInternalServerErrorCode is the HTTP code returned for type ApplyTKGConfigForVsphereInternalServerError -const ApplyTKGConfigForVsphereInternalServerErrorCode int = 500 - -/* -ApplyTKGConfigForVsphereInternalServerError Internal server error - -swagger:response applyTKGConfigForVsphereInternalServerError -*/ -type ApplyTKGConfigForVsphereInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewApplyTKGConfigForVsphereInternalServerError creates ApplyTKGConfigForVsphereInternalServerError with default headers values -func NewApplyTKGConfigForVsphereInternalServerError() *ApplyTKGConfigForVsphereInternalServerError { - - return &ApplyTKGConfigForVsphereInternalServerError{} -} - -// WithPayload adds the payload to the apply t k g config for vsphere internal server error response -func (o *ApplyTKGConfigForVsphereInternalServerError) WithPayload(payload *models.Error) *ApplyTKGConfigForVsphereInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the apply t k g config for vsphere internal server error response -func (o *ApplyTKGConfigForVsphereInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ApplyTKGConfigForVsphereInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere_urlbuilder.go deleted file mode 100644 index 5b79f90084..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/apply_t_k_g_config_for_vsphere_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ApplyTKGConfigForVsphereURL generates an URL for the apply t k g config for vsphere operation -type ApplyTKGConfigForVsphereURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ApplyTKGConfigForVsphereURL) WithBasePath(bp string) *ApplyTKGConfigForVsphereURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ApplyTKGConfigForVsphereURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ApplyTKGConfigForVsphereURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/tkgconfig" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ApplyTKGConfigForVsphereURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ApplyTKGConfigForVsphereURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ApplyTKGConfigForVsphereURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ApplyTKGConfigForVsphereURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ApplyTKGConfigForVsphereURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ApplyTKGConfigForVsphereURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster.go b/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster.go deleted file mode 100644 index aabed7bb4c..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// CreateVSphereRegionalClusterHandlerFunc turns a function with the right signature into a create v sphere regional cluster handler -type CreateVSphereRegionalClusterHandlerFunc func(CreateVSphereRegionalClusterParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn CreateVSphereRegionalClusterHandlerFunc) Handle(params CreateVSphereRegionalClusterParams) middleware.Responder { - return fn(params) -} - -// CreateVSphereRegionalClusterHandler interface for that can handle valid create v sphere regional cluster params -type CreateVSphereRegionalClusterHandler interface { - Handle(CreateVSphereRegionalClusterParams) middleware.Responder -} - -// NewCreateVSphereRegionalCluster creates a new http.Handler for the create v sphere regional cluster operation -func NewCreateVSphereRegionalCluster(ctx *middleware.Context, handler CreateVSphereRegionalClusterHandler) *CreateVSphereRegionalCluster { - return &CreateVSphereRegionalCluster{Context: ctx, Handler: handler} -} - -/* -CreateVSphereRegionalCluster swagger:route POST /api/providers/vsphere/create vsphere createVSphereRegionalCluster - -Create vSphere regional cluster -*/ -type CreateVSphereRegionalCluster struct { - Context *middleware.Context - Handler CreateVSphereRegionalClusterHandler -} - -func (o *CreateVSphereRegionalCluster) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewCreateVSphereRegionalClusterParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster_parameters.go b/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster_parameters.go deleted file mode 100644 index 78e1918b2c..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewCreateVSphereRegionalClusterParams creates a new CreateVSphereRegionalClusterParams object -// no default values defined in spec. -func NewCreateVSphereRegionalClusterParams() CreateVSphereRegionalClusterParams { - - return CreateVSphereRegionalClusterParams{} -} - -// CreateVSphereRegionalClusterParams contains all the bound params for the create v sphere regional cluster operation -// typically these are obtained from a http.Request -// -// swagger:parameters createVSphereRegionalCluster -type CreateVSphereRegionalClusterParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*params to create a regional cluster - Required: true - In: body - */ - Params *models.VsphereRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewCreateVSphereRegionalClusterParams() beforehand. -func (o *CreateVSphereRegionalClusterParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.VsphereRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster_responses.go b/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster_responses.go deleted file mode 100644 index 08f5f7c800..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster_responses.go +++ /dev/null @@ -1,192 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// CreateVSphereRegionalClusterOKCode is the HTTP code returned for type CreateVSphereRegionalClusterOK -const CreateVSphereRegionalClusterOKCode int = 200 - -/* -CreateVSphereRegionalClusterOK Creating regional cluster started successfully - -swagger:response createVSphereRegionalClusterOK -*/ -type CreateVSphereRegionalClusterOK struct { - - /* - In: Body - */ - Payload string `json:"body,omitempty"` -} - -// NewCreateVSphereRegionalClusterOK creates CreateVSphereRegionalClusterOK with default headers values -func NewCreateVSphereRegionalClusterOK() *CreateVSphereRegionalClusterOK { - - return &CreateVSphereRegionalClusterOK{} -} - -// WithPayload adds the payload to the create v sphere regional cluster o k response -func (o *CreateVSphereRegionalClusterOK) WithPayload(payload string) *CreateVSphereRegionalClusterOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create v sphere regional cluster o k response -func (o *CreateVSphereRegionalClusterOK) SetPayload(payload string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateVSphereRegionalClusterOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// CreateVSphereRegionalClusterBadRequestCode is the HTTP code returned for type CreateVSphereRegionalClusterBadRequest -const CreateVSphereRegionalClusterBadRequestCode int = 400 - -/* -CreateVSphereRegionalClusterBadRequest Bad request - -swagger:response createVSphereRegionalClusterBadRequest -*/ -type CreateVSphereRegionalClusterBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateVSphereRegionalClusterBadRequest creates CreateVSphereRegionalClusterBadRequest with default headers values -func NewCreateVSphereRegionalClusterBadRequest() *CreateVSphereRegionalClusterBadRequest { - - return &CreateVSphereRegionalClusterBadRequest{} -} - -// WithPayload adds the payload to the create v sphere regional cluster bad request response -func (o *CreateVSphereRegionalClusterBadRequest) WithPayload(payload *models.Error) *CreateVSphereRegionalClusterBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create v sphere regional cluster bad request response -func (o *CreateVSphereRegionalClusterBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateVSphereRegionalClusterBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CreateVSphereRegionalClusterUnauthorizedCode is the HTTP code returned for type CreateVSphereRegionalClusterUnauthorized -const CreateVSphereRegionalClusterUnauthorizedCode int = 401 - -/* -CreateVSphereRegionalClusterUnauthorized Incorrect credentials - -swagger:response createVSphereRegionalClusterUnauthorized -*/ -type CreateVSphereRegionalClusterUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateVSphereRegionalClusterUnauthorized creates CreateVSphereRegionalClusterUnauthorized with default headers values -func NewCreateVSphereRegionalClusterUnauthorized() *CreateVSphereRegionalClusterUnauthorized { - - return &CreateVSphereRegionalClusterUnauthorized{} -} - -// WithPayload adds the payload to the create v sphere regional cluster unauthorized response -func (o *CreateVSphereRegionalClusterUnauthorized) WithPayload(payload *models.Error) *CreateVSphereRegionalClusterUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create v sphere regional cluster unauthorized response -func (o *CreateVSphereRegionalClusterUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateVSphereRegionalClusterUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// CreateVSphereRegionalClusterInternalServerErrorCode is the HTTP code returned for type CreateVSphereRegionalClusterInternalServerError -const CreateVSphereRegionalClusterInternalServerErrorCode int = 500 - -/* -CreateVSphereRegionalClusterInternalServerError Internal server error - -swagger:response createVSphereRegionalClusterInternalServerError -*/ -type CreateVSphereRegionalClusterInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewCreateVSphereRegionalClusterInternalServerError creates CreateVSphereRegionalClusterInternalServerError with default headers values -func NewCreateVSphereRegionalClusterInternalServerError() *CreateVSphereRegionalClusterInternalServerError { - - return &CreateVSphereRegionalClusterInternalServerError{} -} - -// WithPayload adds the payload to the create v sphere regional cluster internal server error response -func (o *CreateVSphereRegionalClusterInternalServerError) WithPayload(payload *models.Error) *CreateVSphereRegionalClusterInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the create v sphere regional cluster internal server error response -func (o *CreateVSphereRegionalClusterInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *CreateVSphereRegionalClusterInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster_urlbuilder.go deleted file mode 100644 index c3623be0e3..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/create_v_sphere_regional_cluster_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// CreateVSphereRegionalClusterURL generates an URL for the create v sphere regional cluster operation -type CreateVSphereRegionalClusterURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateVSphereRegionalClusterURL) WithBasePath(bp string) *CreateVSphereRegionalClusterURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *CreateVSphereRegionalClusterURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *CreateVSphereRegionalClusterURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/create" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *CreateVSphereRegionalClusterURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *CreateVSphereRegionalClusterURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *CreateVSphereRegionalClusterURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on CreateVSphereRegionalClusterURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on CreateVSphereRegionalClusterURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *CreateVSphereRegionalClusterURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere.go b/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere.go deleted file mode 100644 index ceb2f9dfe2..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ExportTKGConfigForVsphereHandlerFunc turns a function with the right signature into a export t k g config for vsphere handler -type ExportTKGConfigForVsphereHandlerFunc func(ExportTKGConfigForVsphereParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ExportTKGConfigForVsphereHandlerFunc) Handle(params ExportTKGConfigForVsphereParams) middleware.Responder { - return fn(params) -} - -// ExportTKGConfigForVsphereHandler interface for that can handle valid export t k g config for vsphere params -type ExportTKGConfigForVsphereHandler interface { - Handle(ExportTKGConfigForVsphereParams) middleware.Responder -} - -// NewExportTKGConfigForVsphere creates a new http.Handler for the export t k g config for vsphere operation -func NewExportTKGConfigForVsphere(ctx *middleware.Context, handler ExportTKGConfigForVsphereHandler) *ExportTKGConfigForVsphere { - return &ExportTKGConfigForVsphere{Context: ctx, Handler: handler} -} - -/* -ExportTKGConfigForVsphere swagger:route POST /api/providers/vsphere/config/export vsphere exportTKGConfigForVsphere - -Generate TKG configuration file for vSphere -*/ -type ExportTKGConfigForVsphere struct { - Context *middleware.Context - Handler ExportTKGConfigForVsphereHandler -} - -func (o *ExportTKGConfigForVsphere) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewExportTKGConfigForVsphereParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere_parameters.go b/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere_parameters.go deleted file mode 100644 index ad44fcb408..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewExportTKGConfigForVsphereParams creates a new ExportTKGConfigForVsphereParams object -// no default values defined in spec. -func NewExportTKGConfigForVsphereParams() ExportTKGConfigForVsphereParams { - - return ExportTKGConfigForVsphereParams{} -} - -// ExportTKGConfigForVsphereParams contains all the bound params for the export t k g config for vsphere operation -// typically these are obtained from a http.Request -// -// swagger:parameters exportTKGConfigForVsphere -type ExportTKGConfigForVsphereParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*params to generate tkg configuration for vsphere - Required: true - In: body - */ - Params *models.VsphereRegionalClusterParams -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewExportTKGConfigForVsphereParams() beforehand. -func (o *ExportTKGConfigForVsphereParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.VsphereRegionalClusterParams - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere_responses.go b/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere_responses.go deleted file mode 100644 index 190635a55f..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere_responses.go +++ /dev/null @@ -1,192 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ExportTKGConfigForVsphereOKCode is the HTTP code returned for type ExportTKGConfigForVsphereOK -const ExportTKGConfigForVsphereOKCode int = 200 - -/* -ExportTKGConfigForVsphereOK Generated TKG configuration successfully - -swagger:response exportTKGConfigForVsphereOK -*/ -type ExportTKGConfigForVsphereOK struct { - - /* - In: Body - */ - Payload string `json:"body,omitempty"` -} - -// NewExportTKGConfigForVsphereOK creates ExportTKGConfigForVsphereOK with default headers values -func NewExportTKGConfigForVsphereOK() *ExportTKGConfigForVsphereOK { - - return &ExportTKGConfigForVsphereOK{} -} - -// WithPayload adds the payload to the export t k g config for vsphere o k response -func (o *ExportTKGConfigForVsphereOK) WithPayload(payload string) *ExportTKGConfigForVsphereOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for vsphere o k response -func (o *ExportTKGConfigForVsphereOK) SetPayload(payload string) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForVsphereOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// ExportTKGConfigForVsphereBadRequestCode is the HTTP code returned for type ExportTKGConfigForVsphereBadRequest -const ExportTKGConfigForVsphereBadRequestCode int = 400 - -/* -ExportTKGConfigForVsphereBadRequest Bad request - -swagger:response exportTKGConfigForVsphereBadRequest -*/ -type ExportTKGConfigForVsphereBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewExportTKGConfigForVsphereBadRequest creates ExportTKGConfigForVsphereBadRequest with default headers values -func NewExportTKGConfigForVsphereBadRequest() *ExportTKGConfigForVsphereBadRequest { - - return &ExportTKGConfigForVsphereBadRequest{} -} - -// WithPayload adds the payload to the export t k g config for vsphere bad request response -func (o *ExportTKGConfigForVsphereBadRequest) WithPayload(payload *models.Error) *ExportTKGConfigForVsphereBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for vsphere bad request response -func (o *ExportTKGConfigForVsphereBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForVsphereBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ExportTKGConfigForVsphereUnauthorizedCode is the HTTP code returned for type ExportTKGConfigForVsphereUnauthorized -const ExportTKGConfigForVsphereUnauthorizedCode int = 401 - -/* -ExportTKGConfigForVsphereUnauthorized Incorrect credentials - -swagger:response exportTKGConfigForVsphereUnauthorized -*/ -type ExportTKGConfigForVsphereUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewExportTKGConfigForVsphereUnauthorized creates ExportTKGConfigForVsphereUnauthorized with default headers values -func NewExportTKGConfigForVsphereUnauthorized() *ExportTKGConfigForVsphereUnauthorized { - - return &ExportTKGConfigForVsphereUnauthorized{} -} - -// WithPayload adds the payload to the export t k g config for vsphere unauthorized response -func (o *ExportTKGConfigForVsphereUnauthorized) WithPayload(payload *models.Error) *ExportTKGConfigForVsphereUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for vsphere unauthorized response -func (o *ExportTKGConfigForVsphereUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForVsphereUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ExportTKGConfigForVsphereInternalServerErrorCode is the HTTP code returned for type ExportTKGConfigForVsphereInternalServerError -const ExportTKGConfigForVsphereInternalServerErrorCode int = 500 - -/* -ExportTKGConfigForVsphereInternalServerError Internal server error - -swagger:response exportTKGConfigForVsphereInternalServerError -*/ -type ExportTKGConfigForVsphereInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewExportTKGConfigForVsphereInternalServerError creates ExportTKGConfigForVsphereInternalServerError with default headers values -func NewExportTKGConfigForVsphereInternalServerError() *ExportTKGConfigForVsphereInternalServerError { - - return &ExportTKGConfigForVsphereInternalServerError{} -} - -// WithPayload adds the payload to the export t k g config for vsphere internal server error response -func (o *ExportTKGConfigForVsphereInternalServerError) WithPayload(payload *models.Error) *ExportTKGConfigForVsphereInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the export t k g config for vsphere internal server error response -func (o *ExportTKGConfigForVsphereInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ExportTKGConfigForVsphereInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere_urlbuilder.go deleted file mode 100644 index d332b625f7..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/export_t_k_g_config_for_vsphere_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ExportTKGConfigForVsphereURL generates an URL for the export t k g config for vsphere operation -type ExportTKGConfigForVsphereURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ExportTKGConfigForVsphereURL) WithBasePath(bp string) *ExportTKGConfigForVsphereURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ExportTKGConfigForVsphereURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ExportTKGConfigForVsphereURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/config/export" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ExportTKGConfigForVsphereURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ExportTKGConfigForVsphereURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ExportTKGConfigForVsphereURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ExportTKGConfigForVsphereURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ExportTKGConfigForVsphereURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ExportTKGConfigForVsphereURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources.go deleted file mode 100644 index 1f0466f75b..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetVSphereComputeResourcesHandlerFunc turns a function with the right signature into a get v sphere compute resources handler -type GetVSphereComputeResourcesHandlerFunc func(GetVSphereComputeResourcesParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetVSphereComputeResourcesHandlerFunc) Handle(params GetVSphereComputeResourcesParams) middleware.Responder { - return fn(params) -} - -// GetVSphereComputeResourcesHandler interface for that can handle valid get v sphere compute resources params -type GetVSphereComputeResourcesHandler interface { - Handle(GetVSphereComputeResourcesParams) middleware.Responder -} - -// NewGetVSphereComputeResources creates a new http.Handler for the get v sphere compute resources operation -func NewGetVSphereComputeResources(ctx *middleware.Context, handler GetVSphereComputeResourcesHandler) *GetVSphereComputeResources { - return &GetVSphereComputeResources{Context: ctx, Handler: handler} -} - -/* -GetVSphereComputeResources swagger:route GET /api/providers/vsphere/compute vsphere getVSphereComputeResources - -Retrieve vSphere compute resources -*/ -type GetVSphereComputeResources struct { - Context *middleware.Context - Handler GetVSphereComputeResourcesHandler -} - -func (o *GetVSphereComputeResources) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetVSphereComputeResourcesParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources_parameters.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources_parameters.go deleted file mode 100644 index 576b0eea8d..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources_parameters.go +++ /dev/null @@ -1,83 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - "github.com/go-openapi/validate" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereComputeResourcesParams creates a new GetVSphereComputeResourcesParams object -// no default values defined in spec. -func NewGetVSphereComputeResourcesParams() GetVSphereComputeResourcesParams { - - return GetVSphereComputeResourcesParams{} -} - -// GetVSphereComputeResourcesParams contains all the bound params for the get v sphere compute resources operation -// typically these are obtained from a http.Request -// -// swagger:parameters getVSphereComputeResources -type GetVSphereComputeResourcesParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*datacenter managed object Id, e.g. datacenter-2 - Required: true - In: query - */ - Dc string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetVSphereComputeResourcesParams() beforehand. -func (o *GetVSphereComputeResourcesParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qDc, qhkDc, _ := qs.GetOK("dc") - if err := o.bindDc(qDc, qhkDc, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindDc binds and validates parameter Dc from query. -func (o *GetVSphereComputeResourcesParams) bindDc(rawData []string, hasKey bool, formats strfmt.Registry) error { - if !hasKey { - return errors.Required("dc", "query") - } - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // AllowEmptyValue: false - if err := validate.RequiredString("dc", "query", raw); err != nil { - return err - } - - o.Dc = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources_responses.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources_responses.go deleted file mode 100644 index 10f11cc4a0..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereComputeResourcesOKCode is the HTTP code returned for type GetVSphereComputeResourcesOK -const GetVSphereComputeResourcesOKCode int = 200 - -/* -GetVSphereComputeResourcesOK Successful retrieval of vSphere folders - -swagger:response getVSphereComputeResourcesOK -*/ -type GetVSphereComputeResourcesOK struct { - - /* - In: Body - */ - Payload []*models.VSphereManagementObject `json:"body,omitempty"` -} - -// NewGetVSphereComputeResourcesOK creates GetVSphereComputeResourcesOK with default headers values -func NewGetVSphereComputeResourcesOK() *GetVSphereComputeResourcesOK { - - return &GetVSphereComputeResourcesOK{} -} - -// WithPayload adds the payload to the get v sphere compute resources o k response -func (o *GetVSphereComputeResourcesOK) WithPayload(payload []*models.VSphereManagementObject) *GetVSphereComputeResourcesOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere compute resources o k response -func (o *GetVSphereComputeResourcesOK) SetPayload(payload []*models.VSphereManagementObject) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereComputeResourcesOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.VSphereManagementObject, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetVSphereComputeResourcesBadRequestCode is the HTTP code returned for type GetVSphereComputeResourcesBadRequest -const GetVSphereComputeResourcesBadRequestCode int = 400 - -/* -GetVSphereComputeResourcesBadRequest Bad request - -swagger:response getVSphereComputeResourcesBadRequest -*/ -type GetVSphereComputeResourcesBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereComputeResourcesBadRequest creates GetVSphereComputeResourcesBadRequest with default headers values -func NewGetVSphereComputeResourcesBadRequest() *GetVSphereComputeResourcesBadRequest { - - return &GetVSphereComputeResourcesBadRequest{} -} - -// WithPayload adds the payload to the get v sphere compute resources bad request response -func (o *GetVSphereComputeResourcesBadRequest) WithPayload(payload *models.Error) *GetVSphereComputeResourcesBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere compute resources bad request response -func (o *GetVSphereComputeResourcesBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereComputeResourcesBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereComputeResourcesUnauthorizedCode is the HTTP code returned for type GetVSphereComputeResourcesUnauthorized -const GetVSphereComputeResourcesUnauthorizedCode int = 401 - -/* -GetVSphereComputeResourcesUnauthorized Incorrect credentials - -swagger:response getVSphereComputeResourcesUnauthorized -*/ -type GetVSphereComputeResourcesUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereComputeResourcesUnauthorized creates GetVSphereComputeResourcesUnauthorized with default headers values -func NewGetVSphereComputeResourcesUnauthorized() *GetVSphereComputeResourcesUnauthorized { - - return &GetVSphereComputeResourcesUnauthorized{} -} - -// WithPayload adds the payload to the get v sphere compute resources unauthorized response -func (o *GetVSphereComputeResourcesUnauthorized) WithPayload(payload *models.Error) *GetVSphereComputeResourcesUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere compute resources unauthorized response -func (o *GetVSphereComputeResourcesUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereComputeResourcesUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereComputeResourcesInternalServerErrorCode is the HTTP code returned for type GetVSphereComputeResourcesInternalServerError -const GetVSphereComputeResourcesInternalServerErrorCode int = 500 - -/* -GetVSphereComputeResourcesInternalServerError Internal server error - -swagger:response getVSphereComputeResourcesInternalServerError -*/ -type GetVSphereComputeResourcesInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereComputeResourcesInternalServerError creates GetVSphereComputeResourcesInternalServerError with default headers values -func NewGetVSphereComputeResourcesInternalServerError() *GetVSphereComputeResourcesInternalServerError { - - return &GetVSphereComputeResourcesInternalServerError{} -} - -// WithPayload adds the payload to the get v sphere compute resources internal server error response -func (o *GetVSphereComputeResourcesInternalServerError) WithPayload(payload *models.Error) *GetVSphereComputeResourcesInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere compute resources internal server error response -func (o *GetVSphereComputeResourcesInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereComputeResourcesInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources_urlbuilder.go deleted file mode 100644 index 8959cc3d95..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_compute_resources_urlbuilder.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetVSphereComputeResourcesURL generates an URL for the get v sphere compute resources operation -type GetVSphereComputeResourcesURL struct { - Dc string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereComputeResourcesURL) WithBasePath(bp string) *GetVSphereComputeResourcesURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereComputeResourcesURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetVSphereComputeResourcesURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/compute" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - dcQ := o.Dc - if dcQ != "" { - qs.Set("dc", dcQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetVSphereComputeResourcesURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetVSphereComputeResourcesURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetVSphereComputeResourcesURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetVSphereComputeResourcesURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetVSphereComputeResourcesURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetVSphereComputeResourcesURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters.go deleted file mode 100644 index 209df214e0..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetVSphereDatacentersHandlerFunc turns a function with the right signature into a get v sphere datacenters handler -type GetVSphereDatacentersHandlerFunc func(GetVSphereDatacentersParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetVSphereDatacentersHandlerFunc) Handle(params GetVSphereDatacentersParams) middleware.Responder { - return fn(params) -} - -// GetVSphereDatacentersHandler interface for that can handle valid get v sphere datacenters params -type GetVSphereDatacentersHandler interface { - Handle(GetVSphereDatacentersParams) middleware.Responder -} - -// NewGetVSphereDatacenters creates a new http.Handler for the get v sphere datacenters operation -func NewGetVSphereDatacenters(ctx *middleware.Context, handler GetVSphereDatacentersHandler) *GetVSphereDatacenters { - return &GetVSphereDatacenters{Context: ctx, Handler: handler} -} - -/* -GetVSphereDatacenters swagger:route GET /api/providers/vsphere/datacenters vsphere getVSphereDatacenters - -Retrieve vSphere datacenters -*/ -type GetVSphereDatacenters struct { - Context *middleware.Context - Handler GetVSphereDatacentersHandler -} - -func (o *GetVSphereDatacenters) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetVSphereDatacentersParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters_parameters.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters_parameters.go deleted file mode 100644 index 6909e23a29..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetVSphereDatacentersParams creates a new GetVSphereDatacentersParams object -// no default values defined in spec. -func NewGetVSphereDatacentersParams() GetVSphereDatacentersParams { - - return GetVSphereDatacentersParams{} -} - -// GetVSphereDatacentersParams contains all the bound params for the get v sphere datacenters operation -// typically these are obtained from a http.Request -// -// swagger:parameters getVSphereDatacenters -type GetVSphereDatacentersParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetVSphereDatacentersParams() beforehand. -func (o *GetVSphereDatacentersParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters_responses.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters_responses.go deleted file mode 100644 index 333b6c2fba..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereDatacentersOKCode is the HTTP code returned for type GetVSphereDatacentersOK -const GetVSphereDatacentersOKCode int = 200 - -/* -GetVSphereDatacentersOK Successful retrieval of vSphere datacenters - -swagger:response getVSphereDatacentersOK -*/ -type GetVSphereDatacentersOK struct { - - /* - In: Body - */ - Payload []*models.VSphereDatacenter `json:"body,omitempty"` -} - -// NewGetVSphereDatacentersOK creates GetVSphereDatacentersOK with default headers values -func NewGetVSphereDatacentersOK() *GetVSphereDatacentersOK { - - return &GetVSphereDatacentersOK{} -} - -// WithPayload adds the payload to the get v sphere datacenters o k response -func (o *GetVSphereDatacentersOK) WithPayload(payload []*models.VSphereDatacenter) *GetVSphereDatacentersOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere datacenters o k response -func (o *GetVSphereDatacentersOK) SetPayload(payload []*models.VSphereDatacenter) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereDatacentersOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.VSphereDatacenter, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetVSphereDatacentersBadRequestCode is the HTTP code returned for type GetVSphereDatacentersBadRequest -const GetVSphereDatacentersBadRequestCode int = 400 - -/* -GetVSphereDatacentersBadRequest Bad request - -swagger:response getVSphereDatacentersBadRequest -*/ -type GetVSphereDatacentersBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereDatacentersBadRequest creates GetVSphereDatacentersBadRequest with default headers values -func NewGetVSphereDatacentersBadRequest() *GetVSphereDatacentersBadRequest { - - return &GetVSphereDatacentersBadRequest{} -} - -// WithPayload adds the payload to the get v sphere datacenters bad request response -func (o *GetVSphereDatacentersBadRequest) WithPayload(payload *models.Error) *GetVSphereDatacentersBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere datacenters bad request response -func (o *GetVSphereDatacentersBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereDatacentersBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereDatacentersUnauthorizedCode is the HTTP code returned for type GetVSphereDatacentersUnauthorized -const GetVSphereDatacentersUnauthorizedCode int = 401 - -/* -GetVSphereDatacentersUnauthorized Incorrect credentials - -swagger:response getVSphereDatacentersUnauthorized -*/ -type GetVSphereDatacentersUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereDatacentersUnauthorized creates GetVSphereDatacentersUnauthorized with default headers values -func NewGetVSphereDatacentersUnauthorized() *GetVSphereDatacentersUnauthorized { - - return &GetVSphereDatacentersUnauthorized{} -} - -// WithPayload adds the payload to the get v sphere datacenters unauthorized response -func (o *GetVSphereDatacentersUnauthorized) WithPayload(payload *models.Error) *GetVSphereDatacentersUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere datacenters unauthorized response -func (o *GetVSphereDatacentersUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereDatacentersUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereDatacentersInternalServerErrorCode is the HTTP code returned for type GetVSphereDatacentersInternalServerError -const GetVSphereDatacentersInternalServerErrorCode int = 500 - -/* -GetVSphereDatacentersInternalServerError Internal server error - -swagger:response getVSphereDatacentersInternalServerError -*/ -type GetVSphereDatacentersInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereDatacentersInternalServerError creates GetVSphereDatacentersInternalServerError with default headers values -func NewGetVSphereDatacentersInternalServerError() *GetVSphereDatacentersInternalServerError { - - return &GetVSphereDatacentersInternalServerError{} -} - -// WithPayload adds the payload to the get v sphere datacenters internal server error response -func (o *GetVSphereDatacentersInternalServerError) WithPayload(payload *models.Error) *GetVSphereDatacentersInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere datacenters internal server error response -func (o *GetVSphereDatacentersInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereDatacentersInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters_urlbuilder.go deleted file mode 100644 index 07ef160890..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datacenters_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetVSphereDatacentersURL generates an URL for the get v sphere datacenters operation -type GetVSphereDatacentersURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereDatacentersURL) WithBasePath(bp string) *GetVSphereDatacentersURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereDatacentersURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetVSphereDatacentersURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/datacenters" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetVSphereDatacentersURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetVSphereDatacentersURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetVSphereDatacentersURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetVSphereDatacentersURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetVSphereDatacentersURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetVSphereDatacentersURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores.go deleted file mode 100644 index c04c000778..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetVSphereDatastoresHandlerFunc turns a function with the right signature into a get v sphere datastores handler -type GetVSphereDatastoresHandlerFunc func(GetVSphereDatastoresParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetVSphereDatastoresHandlerFunc) Handle(params GetVSphereDatastoresParams) middleware.Responder { - return fn(params) -} - -// GetVSphereDatastoresHandler interface for that can handle valid get v sphere datastores params -type GetVSphereDatastoresHandler interface { - Handle(GetVSphereDatastoresParams) middleware.Responder -} - -// NewGetVSphereDatastores creates a new http.Handler for the get v sphere datastores operation -func NewGetVSphereDatastores(ctx *middleware.Context, handler GetVSphereDatastoresHandler) *GetVSphereDatastores { - return &GetVSphereDatastores{Context: ctx, Handler: handler} -} - -/* -GetVSphereDatastores swagger:route GET /api/providers/vsphere/datastores vsphere getVSphereDatastores - -Retrieve vSphere datastores -*/ -type GetVSphereDatastores struct { - Context *middleware.Context - Handler GetVSphereDatastoresHandler -} - -func (o *GetVSphereDatastores) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetVSphereDatastoresParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores_parameters.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores_parameters.go deleted file mode 100644 index 255ce5a08b..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores_parameters.go +++ /dev/null @@ -1,83 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - "github.com/go-openapi/validate" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereDatastoresParams creates a new GetVSphereDatastoresParams object -// no default values defined in spec. -func NewGetVSphereDatastoresParams() GetVSphereDatastoresParams { - - return GetVSphereDatastoresParams{} -} - -// GetVSphereDatastoresParams contains all the bound params for the get v sphere datastores operation -// typically these are obtained from a http.Request -// -// swagger:parameters getVSphereDatastores -type GetVSphereDatastoresParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*datacenter managed object Id, e.g. datacenter-2 - Required: true - In: query - */ - Dc string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetVSphereDatastoresParams() beforehand. -func (o *GetVSphereDatastoresParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qDc, qhkDc, _ := qs.GetOK("dc") - if err := o.bindDc(qDc, qhkDc, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindDc binds and validates parameter Dc from query. -func (o *GetVSphereDatastoresParams) bindDc(rawData []string, hasKey bool, formats strfmt.Registry) error { - if !hasKey { - return errors.Required("dc", "query") - } - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // AllowEmptyValue: false - if err := validate.RequiredString("dc", "query", raw); err != nil { - return err - } - - o.Dc = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores_responses.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores_responses.go deleted file mode 100644 index ff590227c0..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereDatastoresOKCode is the HTTP code returned for type GetVSphereDatastoresOK -const GetVSphereDatastoresOKCode int = 200 - -/* -GetVSphereDatastoresOK Successful retrieval of vSphere datastores - -swagger:response getVSphereDatastoresOK -*/ -type GetVSphereDatastoresOK struct { - - /* - In: Body - */ - Payload []*models.VSphereDatastore `json:"body,omitempty"` -} - -// NewGetVSphereDatastoresOK creates GetVSphereDatastoresOK with default headers values -func NewGetVSphereDatastoresOK() *GetVSphereDatastoresOK { - - return &GetVSphereDatastoresOK{} -} - -// WithPayload adds the payload to the get v sphere datastores o k response -func (o *GetVSphereDatastoresOK) WithPayload(payload []*models.VSphereDatastore) *GetVSphereDatastoresOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere datastores o k response -func (o *GetVSphereDatastoresOK) SetPayload(payload []*models.VSphereDatastore) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereDatastoresOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.VSphereDatastore, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetVSphereDatastoresBadRequestCode is the HTTP code returned for type GetVSphereDatastoresBadRequest -const GetVSphereDatastoresBadRequestCode int = 400 - -/* -GetVSphereDatastoresBadRequest Bad request - -swagger:response getVSphereDatastoresBadRequest -*/ -type GetVSphereDatastoresBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereDatastoresBadRequest creates GetVSphereDatastoresBadRequest with default headers values -func NewGetVSphereDatastoresBadRequest() *GetVSphereDatastoresBadRequest { - - return &GetVSphereDatastoresBadRequest{} -} - -// WithPayload adds the payload to the get v sphere datastores bad request response -func (o *GetVSphereDatastoresBadRequest) WithPayload(payload *models.Error) *GetVSphereDatastoresBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere datastores bad request response -func (o *GetVSphereDatastoresBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereDatastoresBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereDatastoresUnauthorizedCode is the HTTP code returned for type GetVSphereDatastoresUnauthorized -const GetVSphereDatastoresUnauthorizedCode int = 401 - -/* -GetVSphereDatastoresUnauthorized Incorrect credentials - -swagger:response getVSphereDatastoresUnauthorized -*/ -type GetVSphereDatastoresUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereDatastoresUnauthorized creates GetVSphereDatastoresUnauthorized with default headers values -func NewGetVSphereDatastoresUnauthorized() *GetVSphereDatastoresUnauthorized { - - return &GetVSphereDatastoresUnauthorized{} -} - -// WithPayload adds the payload to the get v sphere datastores unauthorized response -func (o *GetVSphereDatastoresUnauthorized) WithPayload(payload *models.Error) *GetVSphereDatastoresUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere datastores unauthorized response -func (o *GetVSphereDatastoresUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereDatastoresUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereDatastoresInternalServerErrorCode is the HTTP code returned for type GetVSphereDatastoresInternalServerError -const GetVSphereDatastoresInternalServerErrorCode int = 500 - -/* -GetVSphereDatastoresInternalServerError Internal server error - -swagger:response getVSphereDatastoresInternalServerError -*/ -type GetVSphereDatastoresInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereDatastoresInternalServerError creates GetVSphereDatastoresInternalServerError with default headers values -func NewGetVSphereDatastoresInternalServerError() *GetVSphereDatastoresInternalServerError { - - return &GetVSphereDatastoresInternalServerError{} -} - -// WithPayload adds the payload to the get v sphere datastores internal server error response -func (o *GetVSphereDatastoresInternalServerError) WithPayload(payload *models.Error) *GetVSphereDatastoresInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere datastores internal server error response -func (o *GetVSphereDatastoresInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereDatastoresInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores_urlbuilder.go deleted file mode 100644 index e0845cf69d..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_datastores_urlbuilder.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetVSphereDatastoresURL generates an URL for the get v sphere datastores operation -type GetVSphereDatastoresURL struct { - Dc string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereDatastoresURL) WithBasePath(bp string) *GetVSphereDatastoresURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereDatastoresURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetVSphereDatastoresURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/datastores" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - dcQ := o.Dc - if dcQ != "" { - qs.Set("dc", dcQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetVSphereDatastoresURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetVSphereDatastoresURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetVSphereDatastoresURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetVSphereDatastoresURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetVSphereDatastoresURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetVSphereDatastoresURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders.go deleted file mode 100644 index c779ae05cb..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetVSphereFoldersHandlerFunc turns a function with the right signature into a get v sphere folders handler -type GetVSphereFoldersHandlerFunc func(GetVSphereFoldersParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetVSphereFoldersHandlerFunc) Handle(params GetVSphereFoldersParams) middleware.Responder { - return fn(params) -} - -// GetVSphereFoldersHandler interface for that can handle valid get v sphere folders params -type GetVSphereFoldersHandler interface { - Handle(GetVSphereFoldersParams) middleware.Responder -} - -// NewGetVSphereFolders creates a new http.Handler for the get v sphere folders operation -func NewGetVSphereFolders(ctx *middleware.Context, handler GetVSphereFoldersHandler) *GetVSphereFolders { - return &GetVSphereFolders{Context: ctx, Handler: handler} -} - -/* -GetVSphereFolders swagger:route GET /api/providers/vsphere/folders vsphere getVSphereFolders - -Retrieve vSphere folders -*/ -type GetVSphereFolders struct { - Context *middleware.Context - Handler GetVSphereFoldersHandler -} - -func (o *GetVSphereFolders) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetVSphereFoldersParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders_parameters.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders_parameters.go deleted file mode 100644 index b0e070b046..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders_parameters.go +++ /dev/null @@ -1,83 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - "github.com/go-openapi/validate" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereFoldersParams creates a new GetVSphereFoldersParams object -// no default values defined in spec. -func NewGetVSphereFoldersParams() GetVSphereFoldersParams { - - return GetVSphereFoldersParams{} -} - -// GetVSphereFoldersParams contains all the bound params for the get v sphere folders operation -// typically these are obtained from a http.Request -// -// swagger:parameters getVSphereFolders -type GetVSphereFoldersParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*datacenter managed object Id, e.g. datacenter-2 - Required: true - In: query - */ - Dc string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetVSphereFoldersParams() beforehand. -func (o *GetVSphereFoldersParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qDc, qhkDc, _ := qs.GetOK("dc") - if err := o.bindDc(qDc, qhkDc, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindDc binds and validates parameter Dc from query. -func (o *GetVSphereFoldersParams) bindDc(rawData []string, hasKey bool, formats strfmt.Registry) error { - if !hasKey { - return errors.Required("dc", "query") - } - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // AllowEmptyValue: false - if err := validate.RequiredString("dc", "query", raw); err != nil { - return err - } - - o.Dc = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders_responses.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders_responses.go deleted file mode 100644 index 7bf9e8d319..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereFoldersOKCode is the HTTP code returned for type GetVSphereFoldersOK -const GetVSphereFoldersOKCode int = 200 - -/* -GetVSphereFoldersOK Successful retrieval of vSphere folders - -swagger:response getVSphereFoldersOK -*/ -type GetVSphereFoldersOK struct { - - /* - In: Body - */ - Payload []*models.VSphereFolder `json:"body,omitempty"` -} - -// NewGetVSphereFoldersOK creates GetVSphereFoldersOK with default headers values -func NewGetVSphereFoldersOK() *GetVSphereFoldersOK { - - return &GetVSphereFoldersOK{} -} - -// WithPayload adds the payload to the get v sphere folders o k response -func (o *GetVSphereFoldersOK) WithPayload(payload []*models.VSphereFolder) *GetVSphereFoldersOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere folders o k response -func (o *GetVSphereFoldersOK) SetPayload(payload []*models.VSphereFolder) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereFoldersOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.VSphereFolder, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetVSphereFoldersBadRequestCode is the HTTP code returned for type GetVSphereFoldersBadRequest -const GetVSphereFoldersBadRequestCode int = 400 - -/* -GetVSphereFoldersBadRequest Bad request - -swagger:response getVSphereFoldersBadRequest -*/ -type GetVSphereFoldersBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereFoldersBadRequest creates GetVSphereFoldersBadRequest with default headers values -func NewGetVSphereFoldersBadRequest() *GetVSphereFoldersBadRequest { - - return &GetVSphereFoldersBadRequest{} -} - -// WithPayload adds the payload to the get v sphere folders bad request response -func (o *GetVSphereFoldersBadRequest) WithPayload(payload *models.Error) *GetVSphereFoldersBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere folders bad request response -func (o *GetVSphereFoldersBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereFoldersBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereFoldersUnauthorizedCode is the HTTP code returned for type GetVSphereFoldersUnauthorized -const GetVSphereFoldersUnauthorizedCode int = 401 - -/* -GetVSphereFoldersUnauthorized Incorrect credentials - -swagger:response getVSphereFoldersUnauthorized -*/ -type GetVSphereFoldersUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereFoldersUnauthorized creates GetVSphereFoldersUnauthorized with default headers values -func NewGetVSphereFoldersUnauthorized() *GetVSphereFoldersUnauthorized { - - return &GetVSphereFoldersUnauthorized{} -} - -// WithPayload adds the payload to the get v sphere folders unauthorized response -func (o *GetVSphereFoldersUnauthorized) WithPayload(payload *models.Error) *GetVSphereFoldersUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere folders unauthorized response -func (o *GetVSphereFoldersUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereFoldersUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereFoldersInternalServerErrorCode is the HTTP code returned for type GetVSphereFoldersInternalServerError -const GetVSphereFoldersInternalServerErrorCode int = 500 - -/* -GetVSphereFoldersInternalServerError Internal server error - -swagger:response getVSphereFoldersInternalServerError -*/ -type GetVSphereFoldersInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereFoldersInternalServerError creates GetVSphereFoldersInternalServerError with default headers values -func NewGetVSphereFoldersInternalServerError() *GetVSphereFoldersInternalServerError { - - return &GetVSphereFoldersInternalServerError{} -} - -// WithPayload adds the payload to the get v sphere folders internal server error response -func (o *GetVSphereFoldersInternalServerError) WithPayload(payload *models.Error) *GetVSphereFoldersInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere folders internal server error response -func (o *GetVSphereFoldersInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereFoldersInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders_urlbuilder.go deleted file mode 100644 index 6dc15ca43f..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_folders_urlbuilder.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetVSphereFoldersURL generates an URL for the get v sphere folders operation -type GetVSphereFoldersURL struct { - Dc string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereFoldersURL) WithBasePath(bp string) *GetVSphereFoldersURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereFoldersURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetVSphereFoldersURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/folders" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - dcQ := o.Dc - if dcQ != "" { - qs.Set("dc", dcQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetVSphereFoldersURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetVSphereFoldersURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetVSphereFoldersURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetVSphereFoldersURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetVSphereFoldersURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetVSphereFoldersURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks.go deleted file mode 100644 index 3093508576..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetVSphereNetworksHandlerFunc turns a function with the right signature into a get v sphere networks handler -type GetVSphereNetworksHandlerFunc func(GetVSphereNetworksParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetVSphereNetworksHandlerFunc) Handle(params GetVSphereNetworksParams) middleware.Responder { - return fn(params) -} - -// GetVSphereNetworksHandler interface for that can handle valid get v sphere networks params -type GetVSphereNetworksHandler interface { - Handle(GetVSphereNetworksParams) middleware.Responder -} - -// NewGetVSphereNetworks creates a new http.Handler for the get v sphere networks operation -func NewGetVSphereNetworks(ctx *middleware.Context, handler GetVSphereNetworksHandler) *GetVSphereNetworks { - return &GetVSphereNetworks{Context: ctx, Handler: handler} -} - -/* -GetVSphereNetworks swagger:route GET /api/providers/vsphere/networks vsphere getVSphereNetworks - -Retrieve networks associated with the datacenter in vSphere -*/ -type GetVSphereNetworks struct { - Context *middleware.Context - Handler GetVSphereNetworksHandler -} - -func (o *GetVSphereNetworks) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetVSphereNetworksParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks_parameters.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks_parameters.go deleted file mode 100644 index 1d4f531cb3..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks_parameters.go +++ /dev/null @@ -1,83 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - "github.com/go-openapi/validate" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereNetworksParams creates a new GetVSphereNetworksParams object -// no default values defined in spec. -func NewGetVSphereNetworksParams() GetVSphereNetworksParams { - - return GetVSphereNetworksParams{} -} - -// GetVSphereNetworksParams contains all the bound params for the get v sphere networks operation -// typically these are obtained from a http.Request -// -// swagger:parameters getVSphereNetworks -type GetVSphereNetworksParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*datacenter managed object Id, e.g. datacenter-2 - Required: true - In: query - */ - Dc string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetVSphereNetworksParams() beforehand. -func (o *GetVSphereNetworksParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qDc, qhkDc, _ := qs.GetOK("dc") - if err := o.bindDc(qDc, qhkDc, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindDc binds and validates parameter Dc from query. -func (o *GetVSphereNetworksParams) bindDc(rawData []string, hasKey bool, formats strfmt.Registry) error { - if !hasKey { - return errors.Required("dc", "query") - } - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // AllowEmptyValue: false - if err := validate.RequiredString("dc", "query", raw); err != nil { - return err - } - - o.Dc = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks_responses.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks_responses.go deleted file mode 100644 index 17447e281e..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereNetworksOKCode is the HTTP code returned for type GetVSphereNetworksOK -const GetVSphereNetworksOKCode int = 200 - -/* -GetVSphereNetworksOK Successful retrieval of vSphere networks - -swagger:response getVSphereNetworksOK -*/ -type GetVSphereNetworksOK struct { - - /*a list of vpshere networks - In: Body - */ - Payload []*models.VSphereNetwork `json:"body,omitempty"` -} - -// NewGetVSphereNetworksOK creates GetVSphereNetworksOK with default headers values -func NewGetVSphereNetworksOK() *GetVSphereNetworksOK { - - return &GetVSphereNetworksOK{} -} - -// WithPayload adds the payload to the get v sphere networks o k response -func (o *GetVSphereNetworksOK) WithPayload(payload []*models.VSphereNetwork) *GetVSphereNetworksOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere networks o k response -func (o *GetVSphereNetworksOK) SetPayload(payload []*models.VSphereNetwork) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereNetworksOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.VSphereNetwork, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetVSphereNetworksBadRequestCode is the HTTP code returned for type GetVSphereNetworksBadRequest -const GetVSphereNetworksBadRequestCode int = 400 - -/* -GetVSphereNetworksBadRequest Bad request - -swagger:response getVSphereNetworksBadRequest -*/ -type GetVSphereNetworksBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereNetworksBadRequest creates GetVSphereNetworksBadRequest with default headers values -func NewGetVSphereNetworksBadRequest() *GetVSphereNetworksBadRequest { - - return &GetVSphereNetworksBadRequest{} -} - -// WithPayload adds the payload to the get v sphere networks bad request response -func (o *GetVSphereNetworksBadRequest) WithPayload(payload *models.Error) *GetVSphereNetworksBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere networks bad request response -func (o *GetVSphereNetworksBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereNetworksBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereNetworksUnauthorizedCode is the HTTP code returned for type GetVSphereNetworksUnauthorized -const GetVSphereNetworksUnauthorizedCode int = 401 - -/* -GetVSphereNetworksUnauthorized Incorrect credentials - -swagger:response getVSphereNetworksUnauthorized -*/ -type GetVSphereNetworksUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereNetworksUnauthorized creates GetVSphereNetworksUnauthorized with default headers values -func NewGetVSphereNetworksUnauthorized() *GetVSphereNetworksUnauthorized { - - return &GetVSphereNetworksUnauthorized{} -} - -// WithPayload adds the payload to the get v sphere networks unauthorized response -func (o *GetVSphereNetworksUnauthorized) WithPayload(payload *models.Error) *GetVSphereNetworksUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere networks unauthorized response -func (o *GetVSphereNetworksUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereNetworksUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereNetworksInternalServerErrorCode is the HTTP code returned for type GetVSphereNetworksInternalServerError -const GetVSphereNetworksInternalServerErrorCode int = 500 - -/* -GetVSphereNetworksInternalServerError Internal server error - -swagger:response getVSphereNetworksInternalServerError -*/ -type GetVSphereNetworksInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereNetworksInternalServerError creates GetVSphereNetworksInternalServerError with default headers values -func NewGetVSphereNetworksInternalServerError() *GetVSphereNetworksInternalServerError { - - return &GetVSphereNetworksInternalServerError{} -} - -// WithPayload adds the payload to the get v sphere networks internal server error response -func (o *GetVSphereNetworksInternalServerError) WithPayload(payload *models.Error) *GetVSphereNetworksInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere networks internal server error response -func (o *GetVSphereNetworksInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereNetworksInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks_urlbuilder.go deleted file mode 100644 index e8494dce45..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_networks_urlbuilder.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetVSphereNetworksURL generates an URL for the get v sphere networks operation -type GetVSphereNetworksURL struct { - Dc string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereNetworksURL) WithBasePath(bp string) *GetVSphereNetworksURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereNetworksURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetVSphereNetworksURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/networks" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - dcQ := o.Dc - if dcQ != "" { - qs.Set("dc", dcQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetVSphereNetworksURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetVSphereNetworksURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetVSphereNetworksURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetVSphereNetworksURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetVSphereNetworksURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetVSphereNetworksURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types.go deleted file mode 100644 index 33c47fa8ac..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetVSphereNodeTypesHandlerFunc turns a function with the right signature into a get v sphere node types handler -type GetVSphereNodeTypesHandlerFunc func(GetVSphereNodeTypesParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetVSphereNodeTypesHandlerFunc) Handle(params GetVSphereNodeTypesParams) middleware.Responder { - return fn(params) -} - -// GetVSphereNodeTypesHandler interface for that can handle valid get v sphere node types params -type GetVSphereNodeTypesHandler interface { - Handle(GetVSphereNodeTypesParams) middleware.Responder -} - -// NewGetVSphereNodeTypes creates a new http.Handler for the get v sphere node types operation -func NewGetVSphereNodeTypes(ctx *middleware.Context, handler GetVSphereNodeTypesHandler) *GetVSphereNodeTypes { - return &GetVSphereNodeTypes{Context: ctx, Handler: handler} -} - -/* -GetVSphereNodeTypes swagger:route GET /api/providers/vsphere/nodetypes vsphere getVSphereNodeTypes - -Retrieve vSphere supported kubernetes control plane node types -*/ -type GetVSphereNodeTypes struct { - Context *middleware.Context - Handler GetVSphereNodeTypesHandler -} - -func (o *GetVSphereNodeTypes) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetVSphereNodeTypesParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types_parameters.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types_parameters.go deleted file mode 100644 index fc79e53dfc..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types_parameters.go +++ /dev/null @@ -1,45 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime/middleware" -) - -// NewGetVSphereNodeTypesParams creates a new GetVSphereNodeTypesParams object -// no default values defined in spec. -func NewGetVSphereNodeTypesParams() GetVSphereNodeTypesParams { - - return GetVSphereNodeTypesParams{} -} - -// GetVSphereNodeTypesParams contains all the bound params for the get v sphere node types operation -// typically these are obtained from a http.Request -// -// swagger:parameters getVSphereNodeTypes -type GetVSphereNodeTypesParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetVSphereNodeTypesParams() beforehand. -func (o *GetVSphereNodeTypesParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types_responses.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types_responses.go deleted file mode 100644 index b3299f86b2..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereNodeTypesOKCode is the HTTP code returned for type GetVSphereNodeTypesOK -const GetVSphereNodeTypesOKCode int = 200 - -/* -GetVSphereNodeTypesOK Successful retrieval of node types supported by vSphere - -swagger:response getVSphereNodeTypesOK -*/ -type GetVSphereNodeTypesOK struct { - - /* - In: Body - */ - Payload []*models.NodeType `json:"body,omitempty"` -} - -// NewGetVSphereNodeTypesOK creates GetVSphereNodeTypesOK with default headers values -func NewGetVSphereNodeTypesOK() *GetVSphereNodeTypesOK { - - return &GetVSphereNodeTypesOK{} -} - -// WithPayload adds the payload to the get v sphere node types o k response -func (o *GetVSphereNodeTypesOK) WithPayload(payload []*models.NodeType) *GetVSphereNodeTypesOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere node types o k response -func (o *GetVSphereNodeTypesOK) SetPayload(payload []*models.NodeType) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereNodeTypesOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.NodeType, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetVSphereNodeTypesBadRequestCode is the HTTP code returned for type GetVSphereNodeTypesBadRequest -const GetVSphereNodeTypesBadRequestCode int = 400 - -/* -GetVSphereNodeTypesBadRequest Bad request - -swagger:response getVSphereNodeTypesBadRequest -*/ -type GetVSphereNodeTypesBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereNodeTypesBadRequest creates GetVSphereNodeTypesBadRequest with default headers values -func NewGetVSphereNodeTypesBadRequest() *GetVSphereNodeTypesBadRequest { - - return &GetVSphereNodeTypesBadRequest{} -} - -// WithPayload adds the payload to the get v sphere node types bad request response -func (o *GetVSphereNodeTypesBadRequest) WithPayload(payload *models.Error) *GetVSphereNodeTypesBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere node types bad request response -func (o *GetVSphereNodeTypesBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereNodeTypesBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereNodeTypesUnauthorizedCode is the HTTP code returned for type GetVSphereNodeTypesUnauthorized -const GetVSphereNodeTypesUnauthorizedCode int = 401 - -/* -GetVSphereNodeTypesUnauthorized Incorrect credentials - -swagger:response getVSphereNodeTypesUnauthorized -*/ -type GetVSphereNodeTypesUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereNodeTypesUnauthorized creates GetVSphereNodeTypesUnauthorized with default headers values -func NewGetVSphereNodeTypesUnauthorized() *GetVSphereNodeTypesUnauthorized { - - return &GetVSphereNodeTypesUnauthorized{} -} - -// WithPayload adds the payload to the get v sphere node types unauthorized response -func (o *GetVSphereNodeTypesUnauthorized) WithPayload(payload *models.Error) *GetVSphereNodeTypesUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere node types unauthorized response -func (o *GetVSphereNodeTypesUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereNodeTypesUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereNodeTypesInternalServerErrorCode is the HTTP code returned for type GetVSphereNodeTypesInternalServerError -const GetVSphereNodeTypesInternalServerErrorCode int = 500 - -/* -GetVSphereNodeTypesInternalServerError Internal server error - -swagger:response getVSphereNodeTypesInternalServerError -*/ -type GetVSphereNodeTypesInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereNodeTypesInternalServerError creates GetVSphereNodeTypesInternalServerError with default headers values -func NewGetVSphereNodeTypesInternalServerError() *GetVSphereNodeTypesInternalServerError { - - return &GetVSphereNodeTypesInternalServerError{} -} - -// WithPayload adds the payload to the get v sphere node types internal server error response -func (o *GetVSphereNodeTypesInternalServerError) WithPayload(payload *models.Error) *GetVSphereNodeTypesInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere node types internal server error response -func (o *GetVSphereNodeTypesInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereNodeTypesInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types_urlbuilder.go deleted file mode 100644 index e87768080d..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_node_types_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetVSphereNodeTypesURL generates an URL for the get v sphere node types operation -type GetVSphereNodeTypesURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereNodeTypesURL) WithBasePath(bp string) *GetVSphereNodeTypesURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereNodeTypesURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetVSphereNodeTypesURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/nodetypes" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetVSphereNodeTypesURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetVSphereNodeTypesURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetVSphereNodeTypesURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetVSphereNodeTypesURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetVSphereNodeTypesURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetVSphereNodeTypesURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images.go deleted file mode 100644 index 3cefaa893f..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetVSphereOSImagesHandlerFunc turns a function with the right signature into a get v sphere o s images handler -type GetVSphereOSImagesHandlerFunc func(GetVSphereOSImagesParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetVSphereOSImagesHandlerFunc) Handle(params GetVSphereOSImagesParams) middleware.Responder { - return fn(params) -} - -// GetVSphereOSImagesHandler interface for that can handle valid get v sphere o s images params -type GetVSphereOSImagesHandler interface { - Handle(GetVSphereOSImagesParams) middleware.Responder -} - -// NewGetVSphereOSImages creates a new http.Handler for the get v sphere o s images operation -func NewGetVSphereOSImages(ctx *middleware.Context, handler GetVSphereOSImagesHandler) *GetVSphereOSImages { - return &GetVSphereOSImages{Context: ctx, Handler: handler} -} - -/* -GetVSphereOSImages swagger:route GET /api/providers/vsphere/osimages vsphere getVSphereOSImages - -Retrieve vSphere supported node os images -*/ -type GetVSphereOSImages struct { - Context *middleware.Context - Handler GetVSphereOSImagesHandler -} - -func (o *GetVSphereOSImages) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetVSphereOSImagesParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images_parameters.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images_parameters.go deleted file mode 100644 index 807b67abf7..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images_parameters.go +++ /dev/null @@ -1,83 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - "github.com/go-openapi/validate" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereOSImagesParams creates a new GetVSphereOSImagesParams object -// no default values defined in spec. -func NewGetVSphereOSImagesParams() GetVSphereOSImagesParams { - - return GetVSphereOSImagesParams{} -} - -// GetVSphereOSImagesParams contains all the bound params for the get v sphere o s images operation -// typically these are obtained from a http.Request -// -// swagger:parameters getVSphereOSImages -type GetVSphereOSImagesParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*datacenter managed object Id, e.g. datacenter-2 - Required: true - In: query - */ - Dc string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetVSphereOSImagesParams() beforehand. -func (o *GetVSphereOSImagesParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qDc, qhkDc, _ := qs.GetOK("dc") - if err := o.bindDc(qDc, qhkDc, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindDc binds and validates parameter Dc from query. -func (o *GetVSphereOSImagesParams) bindDc(rawData []string, hasKey bool, formats strfmt.Registry) error { - if !hasKey { - return errors.Required("dc", "query") - } - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // AllowEmptyValue: false - if err := validate.RequiredString("dc", "query", raw); err != nil { - return err - } - - o.Dc = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images_responses.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images_responses.go deleted file mode 100644 index 6ead2ca2b4..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereOSImagesOKCode is the HTTP code returned for type GetVSphereOSImagesOK -const GetVSphereOSImagesOKCode int = 200 - -/* -GetVSphereOSImagesOK Successful retrieval of node images supported by vSphere - -swagger:response getVSphereOSImagesOK -*/ -type GetVSphereOSImagesOK struct { - - /* - In: Body - */ - Payload []*models.VSphereVirtualMachine `json:"body,omitempty"` -} - -// NewGetVSphereOSImagesOK creates GetVSphereOSImagesOK with default headers values -func NewGetVSphereOSImagesOK() *GetVSphereOSImagesOK { - - return &GetVSphereOSImagesOK{} -} - -// WithPayload adds the payload to the get v sphere o s images o k response -func (o *GetVSphereOSImagesOK) WithPayload(payload []*models.VSphereVirtualMachine) *GetVSphereOSImagesOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere o s images o k response -func (o *GetVSphereOSImagesOK) SetPayload(payload []*models.VSphereVirtualMachine) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereOSImagesOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.VSphereVirtualMachine, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetVSphereOSImagesBadRequestCode is the HTTP code returned for type GetVSphereOSImagesBadRequest -const GetVSphereOSImagesBadRequestCode int = 400 - -/* -GetVSphereOSImagesBadRequest Bad request - -swagger:response getVSphereOSImagesBadRequest -*/ -type GetVSphereOSImagesBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereOSImagesBadRequest creates GetVSphereOSImagesBadRequest with default headers values -func NewGetVSphereOSImagesBadRequest() *GetVSphereOSImagesBadRequest { - - return &GetVSphereOSImagesBadRequest{} -} - -// WithPayload adds the payload to the get v sphere o s images bad request response -func (o *GetVSphereOSImagesBadRequest) WithPayload(payload *models.Error) *GetVSphereOSImagesBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere o s images bad request response -func (o *GetVSphereOSImagesBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereOSImagesBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereOSImagesUnauthorizedCode is the HTTP code returned for type GetVSphereOSImagesUnauthorized -const GetVSphereOSImagesUnauthorizedCode int = 401 - -/* -GetVSphereOSImagesUnauthorized Incorrect credentials - -swagger:response getVSphereOSImagesUnauthorized -*/ -type GetVSphereOSImagesUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereOSImagesUnauthorized creates GetVSphereOSImagesUnauthorized with default headers values -func NewGetVSphereOSImagesUnauthorized() *GetVSphereOSImagesUnauthorized { - - return &GetVSphereOSImagesUnauthorized{} -} - -// WithPayload adds the payload to the get v sphere o s images unauthorized response -func (o *GetVSphereOSImagesUnauthorized) WithPayload(payload *models.Error) *GetVSphereOSImagesUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere o s images unauthorized response -func (o *GetVSphereOSImagesUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereOSImagesUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereOSImagesInternalServerErrorCode is the HTTP code returned for type GetVSphereOSImagesInternalServerError -const GetVSphereOSImagesInternalServerErrorCode int = 500 - -/* -GetVSphereOSImagesInternalServerError Internal server error - -swagger:response getVSphereOSImagesInternalServerError -*/ -type GetVSphereOSImagesInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereOSImagesInternalServerError creates GetVSphereOSImagesInternalServerError with default headers values -func NewGetVSphereOSImagesInternalServerError() *GetVSphereOSImagesInternalServerError { - - return &GetVSphereOSImagesInternalServerError{} -} - -// WithPayload adds the payload to the get v sphere o s images internal server error response -func (o *GetVSphereOSImagesInternalServerError) WithPayload(payload *models.Error) *GetVSphereOSImagesInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere o s images internal server error response -func (o *GetVSphereOSImagesInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereOSImagesInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images_urlbuilder.go deleted file mode 100644 index 67090aefce..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_o_s_images_urlbuilder.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetVSphereOSImagesURL generates an URL for the get v sphere o s images operation -type GetVSphereOSImagesURL struct { - Dc string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereOSImagesURL) WithBasePath(bp string) *GetVSphereOSImagesURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereOSImagesURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetVSphereOSImagesURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/osimages" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - dcQ := o.Dc - if dcQ != "" { - qs.Set("dc", dcQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetVSphereOSImagesURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetVSphereOSImagesURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetVSphereOSImagesURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetVSphereOSImagesURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetVSphereOSImagesURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetVSphereOSImagesURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools.go deleted file mode 100644 index a5f68fb77e..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetVSphereResourcePoolsHandlerFunc turns a function with the right signature into a get v sphere resource pools handler -type GetVSphereResourcePoolsHandlerFunc func(GetVSphereResourcePoolsParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetVSphereResourcePoolsHandlerFunc) Handle(params GetVSphereResourcePoolsParams) middleware.Responder { - return fn(params) -} - -// GetVSphereResourcePoolsHandler interface for that can handle valid get v sphere resource pools params -type GetVSphereResourcePoolsHandler interface { - Handle(GetVSphereResourcePoolsParams) middleware.Responder -} - -// NewGetVSphereResourcePools creates a new http.Handler for the get v sphere resource pools operation -func NewGetVSphereResourcePools(ctx *middleware.Context, handler GetVSphereResourcePoolsHandler) *GetVSphereResourcePools { - return &GetVSphereResourcePools{Context: ctx, Handler: handler} -} - -/* -GetVSphereResourcePools swagger:route GET /api/providers/vsphere/resourcepools vsphere getVSphereResourcePools - -Retrieve vSphere resource pools -*/ -type GetVSphereResourcePools struct { - Context *middleware.Context - Handler GetVSphereResourcePoolsHandler -} - -func (o *GetVSphereResourcePools) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetVSphereResourcePoolsParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools_parameters.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools_parameters.go deleted file mode 100644 index 72aed85555..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools_parameters.go +++ /dev/null @@ -1,83 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - "github.com/go-openapi/validate" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVSphereResourcePoolsParams creates a new GetVSphereResourcePoolsParams object -// no default values defined in spec. -func NewGetVSphereResourcePoolsParams() GetVSphereResourcePoolsParams { - - return GetVSphereResourcePoolsParams{} -} - -// GetVSphereResourcePoolsParams contains all the bound params for the get v sphere resource pools operation -// typically these are obtained from a http.Request -// -// swagger:parameters getVSphereResourcePools -type GetVSphereResourcePoolsParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*datacenter managed object Id, e.g. datacenter-2 - Required: true - In: query - */ - Dc string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetVSphereResourcePoolsParams() beforehand. -func (o *GetVSphereResourcePoolsParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qDc, qhkDc, _ := qs.GetOK("dc") - if err := o.bindDc(qDc, qhkDc, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindDc binds and validates parameter Dc from query. -func (o *GetVSphereResourcePoolsParams) bindDc(rawData []string, hasKey bool, formats strfmt.Registry) error { - if !hasKey { - return errors.Required("dc", "query") - } - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // AllowEmptyValue: false - if err := validate.RequiredString("dc", "query", raw); err != nil { - return err - } - - o.Dc = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools_responses.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools_responses.go deleted file mode 100644 index 29bcfefb54..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools_responses.go +++ /dev/null @@ -1,197 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVSphereResourcePoolsOKCode is the HTTP code returned for type GetVSphereResourcePoolsOK -const GetVSphereResourcePoolsOKCode int = 200 - -/* -GetVSphereResourcePoolsOK Successful retrieval of vSphere resourcePools - -swagger:response getVSphereResourcePoolsOK -*/ -type GetVSphereResourcePoolsOK struct { - - /* - In: Body - */ - Payload []*models.VSphereResourcePool `json:"body,omitempty"` -} - -// NewGetVSphereResourcePoolsOK creates GetVSphereResourcePoolsOK with default headers values -func NewGetVSphereResourcePoolsOK() *GetVSphereResourcePoolsOK { - - return &GetVSphereResourcePoolsOK{} -} - -// WithPayload adds the payload to the get v sphere resource pools o k response -func (o *GetVSphereResourcePoolsOK) WithPayload(payload []*models.VSphereResourcePool) *GetVSphereResourcePoolsOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere resource pools o k response -func (o *GetVSphereResourcePoolsOK) SetPayload(payload []*models.VSphereResourcePool) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereResourcePoolsOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - payload := o.Payload - if payload == nil { - // return empty array - payload = make([]*models.VSphereResourcePool, 0, 50) - } - - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } -} - -// GetVSphereResourcePoolsBadRequestCode is the HTTP code returned for type GetVSphereResourcePoolsBadRequest -const GetVSphereResourcePoolsBadRequestCode int = 400 - -/* -GetVSphereResourcePoolsBadRequest Bad request - -swagger:response getVSphereResourcePoolsBadRequest -*/ -type GetVSphereResourcePoolsBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereResourcePoolsBadRequest creates GetVSphereResourcePoolsBadRequest with default headers values -func NewGetVSphereResourcePoolsBadRequest() *GetVSphereResourcePoolsBadRequest { - - return &GetVSphereResourcePoolsBadRequest{} -} - -// WithPayload adds the payload to the get v sphere resource pools bad request response -func (o *GetVSphereResourcePoolsBadRequest) WithPayload(payload *models.Error) *GetVSphereResourcePoolsBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere resource pools bad request response -func (o *GetVSphereResourcePoolsBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereResourcePoolsBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereResourcePoolsUnauthorizedCode is the HTTP code returned for type GetVSphereResourcePoolsUnauthorized -const GetVSphereResourcePoolsUnauthorizedCode int = 401 - -/* -GetVSphereResourcePoolsUnauthorized Incorrect credentials - -swagger:response getVSphereResourcePoolsUnauthorized -*/ -type GetVSphereResourcePoolsUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereResourcePoolsUnauthorized creates GetVSphereResourcePoolsUnauthorized with default headers values -func NewGetVSphereResourcePoolsUnauthorized() *GetVSphereResourcePoolsUnauthorized { - - return &GetVSphereResourcePoolsUnauthorized{} -} - -// WithPayload adds the payload to the get v sphere resource pools unauthorized response -func (o *GetVSphereResourcePoolsUnauthorized) WithPayload(payload *models.Error) *GetVSphereResourcePoolsUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere resource pools unauthorized response -func (o *GetVSphereResourcePoolsUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereResourcePoolsUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVSphereResourcePoolsInternalServerErrorCode is the HTTP code returned for type GetVSphereResourcePoolsInternalServerError -const GetVSphereResourcePoolsInternalServerErrorCode int = 500 - -/* -GetVSphereResourcePoolsInternalServerError Internal server error - -swagger:response getVSphereResourcePoolsInternalServerError -*/ -type GetVSphereResourcePoolsInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVSphereResourcePoolsInternalServerError creates GetVSphereResourcePoolsInternalServerError with default headers values -func NewGetVSphereResourcePoolsInternalServerError() *GetVSphereResourcePoolsInternalServerError { - - return &GetVSphereResourcePoolsInternalServerError{} -} - -// WithPayload adds the payload to the get v sphere resource pools internal server error response -func (o *GetVSphereResourcePoolsInternalServerError) WithPayload(payload *models.Error) *GetVSphereResourcePoolsInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get v sphere resource pools internal server error response -func (o *GetVSphereResourcePoolsInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVSphereResourcePoolsInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools_urlbuilder.go deleted file mode 100644 index 23ff83901f..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_v_sphere_resource_pools_urlbuilder.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetVSphereResourcePoolsURL generates an URL for the get v sphere resource pools operation -type GetVSphereResourcePoolsURL struct { - Dc string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereResourcePoolsURL) WithBasePath(bp string) *GetVSphereResourcePoolsURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVSphereResourcePoolsURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetVSphereResourcePoolsURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/resourcepools" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - dcQ := o.Dc - if dcQ != "" { - qs.Set("dc", dcQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetVSphereResourcePoolsURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetVSphereResourcePoolsURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetVSphereResourcePoolsURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetVSphereResourcePoolsURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetVSphereResourcePoolsURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetVSphereResourcePoolsURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint.go b/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint.go deleted file mode 100644 index db7b6702e1..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// GetVsphereThumbprintHandlerFunc turns a function with the right signature into a get vsphere thumbprint handler -type GetVsphereThumbprintHandlerFunc func(GetVsphereThumbprintParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn GetVsphereThumbprintHandlerFunc) Handle(params GetVsphereThumbprintParams) middleware.Responder { - return fn(params) -} - -// GetVsphereThumbprintHandler interface for that can handle valid get vsphere thumbprint params -type GetVsphereThumbprintHandler interface { - Handle(GetVsphereThumbprintParams) middleware.Responder -} - -// NewGetVsphereThumbprint creates a new http.Handler for the get vsphere thumbprint operation -func NewGetVsphereThumbprint(ctx *middleware.Context, handler GetVsphereThumbprintHandler) *GetVsphereThumbprint { - return &GetVsphereThumbprint{Context: ctx, Handler: handler} -} - -/* -GetVsphereThumbprint swagger:route GET /api/providers/vsphere/thumbprint vsphere getVsphereThumbprint - -Get vSphere thumbprint -*/ -type GetVsphereThumbprint struct { - Context *middleware.Context - Handler GetVsphereThumbprintHandler -} - -func (o *GetVsphereThumbprint) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewGetVsphereThumbprintParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint_parameters.go b/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint_parameters.go deleted file mode 100644 index d28063fe89..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint_parameters.go +++ /dev/null @@ -1,83 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - "github.com/go-openapi/validate" - - strfmt "github.com/go-openapi/strfmt" -) - -// NewGetVsphereThumbprintParams creates a new GetVsphereThumbprintParams object -// no default values defined in spec. -func NewGetVsphereThumbprintParams() GetVsphereThumbprintParams { - - return GetVsphereThumbprintParams{} -} - -// GetVsphereThumbprintParams contains all the bound params for the get vsphere thumbprint operation -// typically these are obtained from a http.Request -// -// swagger:parameters getVsphereThumbprint -type GetVsphereThumbprintParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*vSphere host - Required: true - In: query - */ - Host string -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewGetVsphereThumbprintParams() beforehand. -func (o *GetVsphereThumbprintParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - qs := runtime.Values(r.URL.Query()) - - qHost, qhkHost, _ := qs.GetOK("host") - if err := o.bindHost(qHost, qhkHost, route.Formats); err != nil { - res = append(res, err) - } - - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} - -// bindHost binds and validates parameter Host from query. -func (o *GetVsphereThumbprintParams) bindHost(rawData []string, hasKey bool, formats strfmt.Registry) error { - if !hasKey { - return errors.Required("host", "query") - } - var raw string - if len(rawData) > 0 { - raw = rawData[len(rawData)-1] - } - - // Required: true - // AllowEmptyValue: false - if err := validate.RequiredString("host", "query", raw); err != nil { - return err - } - - o.Host = raw - - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint_responses.go b/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint_responses.go deleted file mode 100644 index 3c624dede4..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// GetVsphereThumbprintOKCode is the HTTP code returned for type GetVsphereThumbprintOK -const GetVsphereThumbprintOKCode int = 200 - -/* -GetVsphereThumbprintOK Successful retrieval of vSphere thumbprint - -swagger:response getVsphereThumbprintOK -*/ -type GetVsphereThumbprintOK struct { - - /* - In: Body - */ - Payload *models.VSphereThumbprint `json:"body,omitempty"` -} - -// NewGetVsphereThumbprintOK creates GetVsphereThumbprintOK with default headers values -func NewGetVsphereThumbprintOK() *GetVsphereThumbprintOK { - - return &GetVsphereThumbprintOK{} -} - -// WithPayload adds the payload to the get vsphere thumbprint o k response -func (o *GetVsphereThumbprintOK) WithPayload(payload *models.VSphereThumbprint) *GetVsphereThumbprintOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get vsphere thumbprint o k response -func (o *GetVsphereThumbprintOK) SetPayload(payload *models.VSphereThumbprint) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVsphereThumbprintOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVsphereThumbprintBadRequestCode is the HTTP code returned for type GetVsphereThumbprintBadRequest -const GetVsphereThumbprintBadRequestCode int = 400 - -/* -GetVsphereThumbprintBadRequest Bad request - -swagger:response getVsphereThumbprintBadRequest -*/ -type GetVsphereThumbprintBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVsphereThumbprintBadRequest creates GetVsphereThumbprintBadRequest with default headers values -func NewGetVsphereThumbprintBadRequest() *GetVsphereThumbprintBadRequest { - - return &GetVsphereThumbprintBadRequest{} -} - -// WithPayload adds the payload to the get vsphere thumbprint bad request response -func (o *GetVsphereThumbprintBadRequest) WithPayload(payload *models.Error) *GetVsphereThumbprintBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get vsphere thumbprint bad request response -func (o *GetVsphereThumbprintBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVsphereThumbprintBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVsphereThumbprintUnauthorizedCode is the HTTP code returned for type GetVsphereThumbprintUnauthorized -const GetVsphereThumbprintUnauthorizedCode int = 401 - -/* -GetVsphereThumbprintUnauthorized Incorrect credentials - -swagger:response getVsphereThumbprintUnauthorized -*/ -type GetVsphereThumbprintUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVsphereThumbprintUnauthorized creates GetVsphereThumbprintUnauthorized with default headers values -func NewGetVsphereThumbprintUnauthorized() *GetVsphereThumbprintUnauthorized { - - return &GetVsphereThumbprintUnauthorized{} -} - -// WithPayload adds the payload to the get vsphere thumbprint unauthorized response -func (o *GetVsphereThumbprintUnauthorized) WithPayload(payload *models.Error) *GetVsphereThumbprintUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get vsphere thumbprint unauthorized response -func (o *GetVsphereThumbprintUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVsphereThumbprintUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// GetVsphereThumbprintInternalServerErrorCode is the HTTP code returned for type GetVsphereThumbprintInternalServerError -const GetVsphereThumbprintInternalServerErrorCode int = 500 - -/* -GetVsphereThumbprintInternalServerError Internal server error - -swagger:response getVsphereThumbprintInternalServerError -*/ -type GetVsphereThumbprintInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewGetVsphereThumbprintInternalServerError creates GetVsphereThumbprintInternalServerError with default headers values -func NewGetVsphereThumbprintInternalServerError() *GetVsphereThumbprintInternalServerError { - - return &GetVsphereThumbprintInternalServerError{} -} - -// WithPayload adds the payload to the get vsphere thumbprint internal server error response -func (o *GetVsphereThumbprintInternalServerError) WithPayload(payload *models.Error) *GetVsphereThumbprintInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the get vsphere thumbprint internal server error response -func (o *GetVsphereThumbprintInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *GetVsphereThumbprintInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint_urlbuilder.go deleted file mode 100644 index 47f94b988e..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/get_vsphere_thumbprint_urlbuilder.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// GetVsphereThumbprintURL generates an URL for the get vsphere thumbprint operation -type GetVsphereThumbprintURL struct { - Host string - - _basePath string - // avoid unkeyed usage - _ struct{} -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVsphereThumbprintURL) WithBasePath(bp string) *GetVsphereThumbprintURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *GetVsphereThumbprintURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *GetVsphereThumbprintURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/thumbprint" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - qs := make(url.Values) - - hostQ := o.Host - if hostQ != "" { - qs.Set("host", hostQ) - } - - _result.RawQuery = qs.Encode() - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *GetVsphereThumbprintURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *GetVsphereThumbprintURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *GetVsphereThumbprintURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on GetVsphereThumbprintURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on GetVsphereThumbprintURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *GetVsphereThumbprintURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere.go b/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere.go deleted file mode 100644 index 8495598ed2..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// ImportTKGConfigForVsphereHandlerFunc turns a function with the right signature into a import t k g config for vsphere handler -type ImportTKGConfigForVsphereHandlerFunc func(ImportTKGConfigForVsphereParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn ImportTKGConfigForVsphereHandlerFunc) Handle(params ImportTKGConfigForVsphereParams) middleware.Responder { - return fn(params) -} - -// ImportTKGConfigForVsphereHandler interface for that can handle valid import t k g config for vsphere params -type ImportTKGConfigForVsphereHandler interface { - Handle(ImportTKGConfigForVsphereParams) middleware.Responder -} - -// NewImportTKGConfigForVsphere creates a new http.Handler for the import t k g config for vsphere operation -func NewImportTKGConfigForVsphere(ctx *middleware.Context, handler ImportTKGConfigForVsphereHandler) *ImportTKGConfigForVsphere { - return &ImportTKGConfigForVsphere{Context: ctx, Handler: handler} -} - -/* -ImportTKGConfigForVsphere swagger:route POST /api/providers/vsphere/config/import vsphere importTKGConfigForVsphere - -Generate TKG configuration object for vSphere -*/ -type ImportTKGConfigForVsphere struct { - Context *middleware.Context - Handler ImportTKGConfigForVsphereHandler -} - -func (o *ImportTKGConfigForVsphere) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewImportTKGConfigForVsphereParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere_parameters.go b/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere_parameters.go deleted file mode 100644 index f103202c6e..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere_parameters.go +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "io" - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewImportTKGConfigForVsphereParams creates a new ImportTKGConfigForVsphereParams object -// no default values defined in spec. -func NewImportTKGConfigForVsphereParams() ImportTKGConfigForVsphereParams { - - return ImportTKGConfigForVsphereParams{} -} - -// ImportTKGConfigForVsphereParams contains all the bound params for the import t k g config for vsphere operation -// typically these are obtained from a http.Request -// -// swagger:parameters importTKGConfigForVsphere -type ImportTKGConfigForVsphereParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*config file from which to generate tkg configuration for vsphere - Required: true - In: body - */ - Params *models.ConfigFile -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewImportTKGConfigForVsphereParams() beforehand. -func (o *ImportTKGConfigForVsphereParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.ConfigFile - if err := route.Consumer.Consume(r.Body, &body); err != nil { - if err == io.EOF { - res = append(res, errors.Required("params", "body")) - } else { - res = append(res, errors.NewParseError("params", "body", "", err)) - } - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Params = &body - } - } - } else { - res = append(res, errors.Required("params", "body")) - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere_responses.go b/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere_responses.go deleted file mode 100644 index 5404bfe1d9..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// ImportTKGConfigForVsphereOKCode is the HTTP code returned for type ImportTKGConfigForVsphereOK -const ImportTKGConfigForVsphereOKCode int = 200 - -/* -ImportTKGConfigForVsphereOK Generated TKG configuration successfully - -swagger:response importTKGConfigForVsphereOK -*/ -type ImportTKGConfigForVsphereOK struct { - - /* - In: Body - */ - Payload *models.VsphereRegionalClusterParams `json:"body,omitempty"` -} - -// NewImportTKGConfigForVsphereOK creates ImportTKGConfigForVsphereOK with default headers values -func NewImportTKGConfigForVsphereOK() *ImportTKGConfigForVsphereOK { - - return &ImportTKGConfigForVsphereOK{} -} - -// WithPayload adds the payload to the import t k g config for vsphere o k response -func (o *ImportTKGConfigForVsphereOK) WithPayload(payload *models.VsphereRegionalClusterParams) *ImportTKGConfigForVsphereOK { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for vsphere o k response -func (o *ImportTKGConfigForVsphereOK) SetPayload(payload *models.VsphereRegionalClusterParams) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForVsphereOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(200) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForVsphereBadRequestCode is the HTTP code returned for type ImportTKGConfigForVsphereBadRequest -const ImportTKGConfigForVsphereBadRequestCode int = 400 - -/* -ImportTKGConfigForVsphereBadRequest Bad request - -swagger:response importTKGConfigForVsphereBadRequest -*/ -type ImportTKGConfigForVsphereBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForVsphereBadRequest creates ImportTKGConfigForVsphereBadRequest with default headers values -func NewImportTKGConfigForVsphereBadRequest() *ImportTKGConfigForVsphereBadRequest { - - return &ImportTKGConfigForVsphereBadRequest{} -} - -// WithPayload adds the payload to the import t k g config for vsphere bad request response -func (o *ImportTKGConfigForVsphereBadRequest) WithPayload(payload *models.Error) *ImportTKGConfigForVsphereBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for vsphere bad request response -func (o *ImportTKGConfigForVsphereBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForVsphereBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForVsphereUnauthorizedCode is the HTTP code returned for type ImportTKGConfigForVsphereUnauthorized -const ImportTKGConfigForVsphereUnauthorizedCode int = 401 - -/* -ImportTKGConfigForVsphereUnauthorized Incorrect credentials - -swagger:response importTKGConfigForVsphereUnauthorized -*/ -type ImportTKGConfigForVsphereUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForVsphereUnauthorized creates ImportTKGConfigForVsphereUnauthorized with default headers values -func NewImportTKGConfigForVsphereUnauthorized() *ImportTKGConfigForVsphereUnauthorized { - - return &ImportTKGConfigForVsphereUnauthorized{} -} - -// WithPayload adds the payload to the import t k g config for vsphere unauthorized response -func (o *ImportTKGConfigForVsphereUnauthorized) WithPayload(payload *models.Error) *ImportTKGConfigForVsphereUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for vsphere unauthorized response -func (o *ImportTKGConfigForVsphereUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForVsphereUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// ImportTKGConfigForVsphereInternalServerErrorCode is the HTTP code returned for type ImportTKGConfigForVsphereInternalServerError -const ImportTKGConfigForVsphereInternalServerErrorCode int = 500 - -/* -ImportTKGConfigForVsphereInternalServerError Internal server error - -swagger:response importTKGConfigForVsphereInternalServerError -*/ -type ImportTKGConfigForVsphereInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewImportTKGConfigForVsphereInternalServerError creates ImportTKGConfigForVsphereInternalServerError with default headers values -func NewImportTKGConfigForVsphereInternalServerError() *ImportTKGConfigForVsphereInternalServerError { - - return &ImportTKGConfigForVsphereInternalServerError{} -} - -// WithPayload adds the payload to the import t k g config for vsphere internal server error response -func (o *ImportTKGConfigForVsphereInternalServerError) WithPayload(payload *models.Error) *ImportTKGConfigForVsphereInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the import t k g config for vsphere internal server error response -func (o *ImportTKGConfigForVsphereInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *ImportTKGConfigForVsphereInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere_urlbuilder.go deleted file mode 100644 index 01252bba69..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/import_t_k_g_config_for_vsphere_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// ImportTKGConfigForVsphereURL generates an URL for the import t k g config for vsphere operation -type ImportTKGConfigForVsphereURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ImportTKGConfigForVsphereURL) WithBasePath(bp string) *ImportTKGConfigForVsphereURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *ImportTKGConfigForVsphereURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *ImportTKGConfigForVsphereURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere/config/import" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *ImportTKGConfigForVsphereURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *ImportTKGConfigForVsphereURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *ImportTKGConfigForVsphereURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on ImportTKGConfigForVsphereURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on ImportTKGConfigForVsphereURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *ImportTKGConfigForVsphereURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint.go b/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint.go deleted file mode 100644 index 5b8fb13eb7..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint.go +++ /dev/null @@ -1,58 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "net/http" - - middleware "github.com/go-openapi/runtime/middleware" -) - -// SetVSphereEndpointHandlerFunc turns a function with the right signature into a set v sphere endpoint handler -type SetVSphereEndpointHandlerFunc func(SetVSphereEndpointParams) middleware.Responder - -// Handle executing the request and returning a response -func (fn SetVSphereEndpointHandlerFunc) Handle(params SetVSphereEndpointParams) middleware.Responder { - return fn(params) -} - -// SetVSphereEndpointHandler interface for that can handle valid set v sphere endpoint params -type SetVSphereEndpointHandler interface { - Handle(SetVSphereEndpointParams) middleware.Responder -} - -// NewSetVSphereEndpoint creates a new http.Handler for the set v sphere endpoint operation -func NewSetVSphereEndpoint(ctx *middleware.Context, handler SetVSphereEndpointHandler) *SetVSphereEndpoint { - return &SetVSphereEndpoint{Context: ctx, Handler: handler} -} - -/* -SetVSphereEndpoint swagger:route POST /api/providers/vsphere vsphere setVSphereEndpoint - -Validate and set vSphere credentials -*/ -type SetVSphereEndpoint struct { - Context *middleware.Context - Handler SetVSphereEndpointHandler -} - -func (o *SetVSphereEndpoint) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - route, rCtx, _ := o.Context.RouteInfo(r) - if rCtx != nil { - r = rCtx - } - var Params = NewSetVSphereEndpointParams() - - if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params - o.Context.Respond(rw, r, route.Produces, route, err) - return - } - - res := o.Handler.Handle(Params) // actually handle the request - - o.Context.Respond(rw, r, route.Produces, route, res) - -} diff --git a/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint_parameters.go b/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint_parameters.go deleted file mode 100644 index dadf62d748..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint_parameters.go +++ /dev/null @@ -1,69 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" - "github.com/go-openapi/runtime/middleware" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// NewSetVSphereEndpointParams creates a new SetVSphereEndpointParams object -// no default values defined in spec. -func NewSetVSphereEndpointParams() SetVSphereEndpointParams { - - return SetVSphereEndpointParams{} -} - -// SetVSphereEndpointParams contains all the bound params for the set v sphere endpoint operation -// typically these are obtained from a http.Request -// -// swagger:parameters setVSphereEndpoint -type SetVSphereEndpointParams struct { - - // HTTP Request Object - HTTPRequest *http.Request `json:"-"` - - /*vSphere credentials - In: body - */ - Credentials *models.VSphereCredentials -} - -// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface -// for simple values it will use straight method calls. -// -// To ensure default values, the struct must have been initialized with NewSetVSphereEndpointParams() beforehand. -func (o *SetVSphereEndpointParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error { - var res []error - - o.HTTPRequest = r - - if runtime.HasBody(r) { - defer r.Body.Close() - var body models.VSphereCredentials - if err := route.Consumer.Consume(r.Body, &body); err != nil { - res = append(res, errors.NewParseError("credentials", "body", "", err)) - } else { - // validate body object - if err := body.Validate(route.Formats); err != nil { - res = append(res, err) - } - - if len(res) == 0 { - o.Credentials = &body - } - } - } - if len(res) > 0 { - return errors.CompositeValidationError(res...) - } - return nil -} diff --git a/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint_responses.go b/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint_responses.go deleted file mode 100644 index cfc0b6ecbb..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint_responses.go +++ /dev/null @@ -1,194 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the swagger generate command - -import ( - "net/http" - - "github.com/go-openapi/runtime" - - models "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/models" -) - -// SetVSphereEndpointCreatedCode is the HTTP code returned for type SetVSphereEndpointCreated -const SetVSphereEndpointCreatedCode int = 201 - -/* -SetVSphereEndpointCreated Connection successful - -swagger:response setVSphereEndpointCreated -*/ -type SetVSphereEndpointCreated struct { - - /* - In: Body - */ - Payload *models.VsphereInfo `json:"body,omitempty"` -} - -// NewSetVSphereEndpointCreated creates SetVSphereEndpointCreated with default headers values -func NewSetVSphereEndpointCreated() *SetVSphereEndpointCreated { - - return &SetVSphereEndpointCreated{} -} - -// WithPayload adds the payload to the set v sphere endpoint created response -func (o *SetVSphereEndpointCreated) WithPayload(payload *models.VsphereInfo) *SetVSphereEndpointCreated { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the set v sphere endpoint created response -func (o *SetVSphereEndpointCreated) SetPayload(payload *models.VsphereInfo) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *SetVSphereEndpointCreated) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(201) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// SetVSphereEndpointBadRequestCode is the HTTP code returned for type SetVSphereEndpointBadRequest -const SetVSphereEndpointBadRequestCode int = 400 - -/* -SetVSphereEndpointBadRequest Bad request - -swagger:response setVSphereEndpointBadRequest -*/ -type SetVSphereEndpointBadRequest struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewSetVSphereEndpointBadRequest creates SetVSphereEndpointBadRequest with default headers values -func NewSetVSphereEndpointBadRequest() *SetVSphereEndpointBadRequest { - - return &SetVSphereEndpointBadRequest{} -} - -// WithPayload adds the payload to the set v sphere endpoint bad request response -func (o *SetVSphereEndpointBadRequest) WithPayload(payload *models.Error) *SetVSphereEndpointBadRequest { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the set v sphere endpoint bad request response -func (o *SetVSphereEndpointBadRequest) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *SetVSphereEndpointBadRequest) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(400) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// SetVSphereEndpointUnauthorizedCode is the HTTP code returned for type SetVSphereEndpointUnauthorized -const SetVSphereEndpointUnauthorizedCode int = 401 - -/* -SetVSphereEndpointUnauthorized Incorrect credentials - -swagger:response setVSphereEndpointUnauthorized -*/ -type SetVSphereEndpointUnauthorized struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewSetVSphereEndpointUnauthorized creates SetVSphereEndpointUnauthorized with default headers values -func NewSetVSphereEndpointUnauthorized() *SetVSphereEndpointUnauthorized { - - return &SetVSphereEndpointUnauthorized{} -} - -// WithPayload adds the payload to the set v sphere endpoint unauthorized response -func (o *SetVSphereEndpointUnauthorized) WithPayload(payload *models.Error) *SetVSphereEndpointUnauthorized { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the set v sphere endpoint unauthorized response -func (o *SetVSphereEndpointUnauthorized) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *SetVSphereEndpointUnauthorized) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(401) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} - -// SetVSphereEndpointInternalServerErrorCode is the HTTP code returned for type SetVSphereEndpointInternalServerError -const SetVSphereEndpointInternalServerErrorCode int = 500 - -/* -SetVSphereEndpointInternalServerError Internal server error - -swagger:response setVSphereEndpointInternalServerError -*/ -type SetVSphereEndpointInternalServerError struct { - - /* - In: Body - */ - Payload *models.Error `json:"body,omitempty"` -} - -// NewSetVSphereEndpointInternalServerError creates SetVSphereEndpointInternalServerError with default headers values -func NewSetVSphereEndpointInternalServerError() *SetVSphereEndpointInternalServerError { - - return &SetVSphereEndpointInternalServerError{} -} - -// WithPayload adds the payload to the set v sphere endpoint internal server error response -func (o *SetVSphereEndpointInternalServerError) WithPayload(payload *models.Error) *SetVSphereEndpointInternalServerError { - o.Payload = payload - return o -} - -// SetPayload sets the payload to the set v sphere endpoint internal server error response -func (o *SetVSphereEndpointInternalServerError) SetPayload(payload *models.Error) { - o.Payload = payload -} - -// WriteResponse to the client -func (o *SetVSphereEndpointInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { - - rw.WriteHeader(500) - if o.Payload != nil { - payload := o.Payload - if err := producer.Produce(rw, payload); err != nil { - panic(err) // let the recovery middleware deal with this - } - } -} diff --git a/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint_urlbuilder.go b/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint_urlbuilder.go deleted file mode 100644 index 65729e0845..0000000000 --- a/tkg/web/server/restapi/operations/vsphere/set_v_sphere_endpoint_urlbuilder.go +++ /dev/null @@ -1,87 +0,0 @@ -// Code generated by go-swagger; DO NOT EDIT. - -package vsphere - -// This file was generated by the swagger tool. -// Editing this file might prove futile when you re-run the generate command - -import ( - "errors" - "net/url" - golangswaggerpaths "path" -) - -// SetVSphereEndpointURL generates an URL for the set v sphere endpoint operation -type SetVSphereEndpointURL struct { - _basePath string -} - -// WithBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *SetVSphereEndpointURL) WithBasePath(bp string) *SetVSphereEndpointURL { - o.SetBasePath(bp) - return o -} - -// SetBasePath sets the base path for this url builder, only required when it's different from the -// base path specified in the swagger spec. -// When the value of the base path is an empty string -func (o *SetVSphereEndpointURL) SetBasePath(bp string) { - o._basePath = bp -} - -// Build a url path and query string -func (o *SetVSphereEndpointURL) Build() (*url.URL, error) { - var _result url.URL - - var _path = "/api/providers/vsphere" - - _basePath := o._basePath - if _basePath == "" { - _basePath = "/" - } - _result.Path = golangswaggerpaths.Join(_basePath, _path) - - return &_result, nil -} - -// Must is a helper function to panic when the url builder returns an error -func (o *SetVSphereEndpointURL) Must(u *url.URL, err error) *url.URL { - if err != nil { - panic(err) - } - if u == nil { - panic("url can't be nil") - } - return u -} - -// String returns the string representation of the path with query string -func (o *SetVSphereEndpointURL) String() string { - return o.Must(o.Build()).String() -} - -// BuildFull builds a full url with scheme, host, path and query string -func (o *SetVSphereEndpointURL) BuildFull(scheme, host string) (*url.URL, error) { - if scheme == "" { - return nil, errors.New("scheme is required for a full url on SetVSphereEndpointURL") - } - if host == "" { - return nil, errors.New("host is required for a full url on SetVSphereEndpointURL") - } - - base, err := o.Build() - if err != nil { - return nil, err - } - - base.Scheme = scheme - base.Host = host - return base, nil -} - -// StringFull returns the string representation of a complete url -func (o *SetVSphereEndpointURL) StringFull(scheme, host string) string { - return o.Must(o.BuildFull(scheme, host)).String() -} diff --git a/tkg/web/server/restapi/server.go b/tkg/web/server/restapi/server.go deleted file mode 100644 index b99ae9b403..0000000000 --- a/tkg/web/server/restapi/server.go +++ /dev/null @@ -1,573 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Code generated by go-swagger; DO NOT EDIT. - -package restapi - -import ( - "context" - "crypto/tls" - "crypto/x509" - "errors" - "fmt" - "log" - "net" - "net/http" - "os" - "os/signal" - "runtime" - "strconv" - "strings" - "sync" - "sync/atomic" - "syscall" - "time" - - "github.com/go-openapi/runtime/flagext" - "github.com/go-openapi/swag" - flags "github.com/jessevdk/go-flags" - "github.com/skratchdot/open-golang/open" - "golang.org/x/net/netutil" - - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations" -) - -const ( - schemeHTTP = "http" - schemeHTTPS = "https" - schemeUnix = "unix" -) - -var defaultSchemes []string - -func init() { - defaultSchemes = []string{ - schemeHTTP, - schemeHTTPS, - } -} - -// NewServer creates a new api kickstart UI server but does not configure it -func NewServer(api *operations.KickstartUIAPI) *Server { - s := new(Server) - - s.shutdown = make(chan struct{}) - s.api = api - s.interrupt = make(chan os.Signal, 1) - return s -} - -// ConfigureAPI configures the API and handlers. -func (s *Server) ConfigureAPI() { - if s.api != nil { - s.handler = configureAPI(s.api) - } -} - -// ConfigureFlags configures the additional flags defined by the handlers. Needs to be called before the parser.Parse -func (s *Server) ConfigureFlags() { - if s.api != nil { - configureFlags(s.api) - } -} - -// Server for the kickstart UI API -type Server struct { - EnabledListeners []string `long:"scheme" description:"the listeners to enable, this can be repeated and defaults to the schemes in the swagger spec"` - CleanupTimeout time.Duration `long:"cleanup-timeout" description:"grace period for which to wait before killing idle connections" default:"10s"` - GracefulTimeout time.Duration `long:"graceful-timeout" description:"grace period for which to wait before shutting down the server" default:"15s"` - MaxHeaderSize flagext.ByteSize `long:"max-header-size" description:"controls the maximum number of bytes the server will read parsing the request header's keys and values, including the request line. It does not limit the size of the request body." default:"1MiB"` - - SocketPath flags.Filename `long:"socket-path" description:"the unix socket to listen on" default:"/var/run/kickstart-ui.sock"` - domainSocketL net.Listener - - Host string `long:"host" description:"the IP to listen on" default:"localhost" env:"HOST"` - Port int `long:"port" description:"the port to listen on for insecure connections, defaults to a random value" env:"PORT"` - Browser string `long:"browser" description:"the browser to launch the UI on" default:"OS Default"` - ListenLimit int `long:"listen-limit" description:"limit the number of outstanding requests"` - KeepAlive time.Duration `long:"keep-alive" description:"sets the TCP keep-alive timeouts on accepted connections. It prunes dead TCP connections ( e.g. closing laptop mid-download)" default:"3m"` - ReadTimeout time.Duration `long:"read-timeout" description:"maximum duration before timing out read of the request" default:"30s"` - WriteTimeout time.Duration `long:"write-timeout" description:"maximum duration before timing out write of the response" default:"60s"` - httpServerL net.Listener - - TLSHost string `long:"tls-host" description:"the IP to listen on for tls, when not specified it's the same as --host" env:"TLS_HOST"` - TLSPort int `long:"tls-port" description:"the port to listen on for secure connections, defaults to a random value" env:"TLS_PORT"` - TLSCertificate flags.Filename `long:"tls-certificate" description:"the certificate to use for secure connections" env:"TLS_CERTIFICATE"` - TLSCertificateKey flags.Filename `long:"tls-key" description:"the private key to use for secure connections" env:"TLS_PRIVATE_KEY"` - TLSCACertificate flags.Filename `long:"tls-ca" description:"the certificate authority file to be used with mutual tls auth" env:"TLS_CA_CERTIFICATE"` - TLSListenLimit int `long:"tls-listen-limit" description:"limit the number of outstanding requests"` - TLSKeepAlive time.Duration `long:"tls-keep-alive" description:"sets the TCP keep-alive timeouts on accepted connections. It prunes dead TCP connections ( e.g. closing laptop mid-download)"` - TLSReadTimeout time.Duration `long:"tls-read-timeout" description:"maximum duration before timing out read of the request"` - TLSWriteTimeout time.Duration `long:"tls-write-timeout" description:"maximum duration before timing out write of the response"` - httpsServerL net.Listener - - api *operations.KickstartUIAPI - handler http.Handler - hasListeners bool - shutdown chan struct{} - shuttingDown int32 - interrupted bool - interrupt chan os.Signal -} - -// Logf logs message either via defined user logger or via system one if no user logger is defined. -func (s *Server) Logf(f string, args ...interface{}) { - if s.api != nil && s.api.Logger != nil { - s.api.Logger(f, args...) - } else { - log.Printf(f, args...) - } -} - -// Fatalf logs message either via defined user logger or via system one if no user logger is defined. -// Exits with non-zero status after printing -func (s *Server) Fatalf(f string, args ...interface{}) { - if s.api != nil && s.api.Logger != nil { - s.api.Logger(f, args...) - os.Exit(1) - } else { - log.Fatalf(f, args...) - } -} - -// SetAPI configures the server with the specified API. Needs to be called before Serve -func (s *Server) SetAPI(api *operations.KickstartUIAPI) { - if api == nil { - s.api = nil - s.handler = nil - return - } - - s.api = api - s.handler = configureAPI(api) -} - -func (s *Server) hasScheme(scheme string) bool { - schemes := s.EnabledListeners - if len(schemes) == 0 { - schemes = defaultSchemes - } - - for _, v := range schemes { - if v == scheme { - return true - } - } - return false -} - -// Serve the api -func (s *Server) Serve() (err error) { //nolint:gocyclo - if !s.hasListeners { - if err = s.Listen(); err != nil { - return err - } - } - - // set default handler, if none is set - if s.handler == nil { - if s.api == nil { - return errors.New("can't create the default handler, as no api is set") - } - - s.SetHandler(s.api.Serve(nil)) - } - - wg := new(sync.WaitGroup) - once := new(sync.Once) - signalNotify(s.interrupt) - go handleInterrupt(once, s) - - servers := []*http.Server{} - wg.Add(1) - go s.handleShutdown(wg, &servers) - - if s.hasScheme(schemeUnix) { - domainSocket := new(http.Server) - domainSocket.MaxHeaderBytes = int(s.MaxHeaderSize) - domainSocket.Handler = s.handler - if int64(s.CleanupTimeout) > 0 { - domainSocket.IdleTimeout = s.CleanupTimeout - } - - configureServer(domainSocket, "unix", string(s.SocketPath)) - - servers = append(servers, domainSocket) - wg.Add(1) - - kickstartUIURL := fmt.Sprintf("unix://%s", s.SocketPath) - s.Logf("Serving kickstart UI at %s", kickstartUIURL) - - err = s.OpenBrowserURL(kickstartUIURL, s.Browser) - if err != nil { - return err - } - - go func(l net.Listener) { - defer wg.Done() - if err := domainSocket.Serve(l); err != nil && err != http.ErrServerClosed { - s.Fatalf("%v", err) - } - s.Logf("Stopped serving kickstart UI at unix://%s", s.SocketPath) - }(s.domainSocketL) - } - - if s.hasScheme(schemeHTTP) { - httpServer := new(http.Server) - httpServer.MaxHeaderBytes = int(s.MaxHeaderSize) - httpServer.ReadTimeout = s.ReadTimeout - httpServer.WriteTimeout = s.WriteTimeout - httpServer.SetKeepAlivesEnabled(int64(s.KeepAlive) > 0) - if s.ListenLimit > 0 { - s.httpServerL = netutil.LimitListener(s.httpServerL, s.ListenLimit) - } - - if int64(s.CleanupTimeout) > 0 { - httpServer.IdleTimeout = s.CleanupTimeout - } - - httpServer.Handler = s.handler - - configureServer(httpServer, "http", s.httpServerL.Addr().String()) - - servers = append(servers, httpServer) - wg.Add(1) - - kickstartUIURL := fmt.Sprintf("http://%s", s.httpServerL.Addr()) - s.Logf("Serving kickstart UI at %s", kickstartUIURL) - - err = s.OpenBrowserURL(kickstartUIURL, s.Browser) - if err != nil { - return err - } - - go func(l net.Listener) { - defer wg.Done() - if err := httpServer.Serve(l); err != nil && err != http.ErrServerClosed { - s.Fatalf("%v", err) - } - s.Logf("Stopped serving kickstart UI at http://%s", l.Addr()) - }(s.httpServerL) - - } - - if s.hasScheme(schemeHTTPS) { - httpsServer := new(http.Server) - httpsServer.MaxHeaderBytes = int(s.MaxHeaderSize) - httpsServer.ReadTimeout = s.TLSReadTimeout - httpsServer.WriteTimeout = s.TLSWriteTimeout - httpsServer.SetKeepAlivesEnabled(int64(s.TLSKeepAlive) > 0) - if s.TLSListenLimit > 0 { - s.httpsServerL = netutil.LimitListener(s.httpsServerL, s.TLSListenLimit) - } - if int64(s.CleanupTimeout) > 0 { - httpsServer.IdleTimeout = s.CleanupTimeout - } - httpsServer.Handler = s.handler - - // Inspired by https://blog.bracebin.com/achieving-perfect-ssl-labs-score-with-go - httpsServer.TLSConfig = &tls.Config{ - // Causes servers to use Go's default ciphersuite preferences, - // which are tuned to avoid attacks. Does nothing on clients. - PreferServerCipherSuites: true, - // Only use curves which have assembly implementations - // https://github.com/golang/go/tree/master/src/crypto/elliptic - CurvePreferences: []tls.CurveID{tls.CurveP256}, - // Use modern tls mode https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility - NextProtos: []string{"h2", "http/1.1"}, - // https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet#Rule_-_Only_Support_Strong_Protocols - MinVersion: tls.VersionTLS12, - // These ciphersuites support Forward Secrecy: https://en.wikipedia.org/wiki/Forward_secrecy - CipherSuites: []uint16{ - tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, - tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, - }, - } - - // build standard config from server options - if s.TLSCertificate != "" && s.TLSCertificateKey != "" { - httpsServer.TLSConfig.Certificates = make([]tls.Certificate, 1) - httpsServer.TLSConfig.Certificates[0], err = tls.LoadX509KeyPair(string(s.TLSCertificate), string(s.TLSCertificateKey)) - if err != nil { - return err - } - } - - if s.TLSCACertificate != "" { - // include specified CA certificate - caCert, caCertErr := os.ReadFile(string(s.TLSCACertificate)) - if caCertErr != nil { - return caCertErr - } - caCertPool := x509.NewCertPool() - ok := caCertPool.AppendCertsFromPEM(caCert) - if !ok { - return fmt.Errorf("cannot parse CA certificate") - } - httpsServer.TLSConfig.ClientCAs = caCertPool - httpsServer.TLSConfig.ClientAuth = tls.RequireAndVerifyClientCert - } - - // call custom TLS configurator - configureTLS(httpsServer.TLSConfig) - - if len(httpsServer.TLSConfig.Certificates) == 0 && httpsServer.TLSConfig.GetCertificate == nil { - // after standard and custom config are passed, this ends up with no certificate - if s.TLSCertificate == "" { - if s.TLSCertificateKey == "" { - s.Fatalf("the required flags `--tls-certificate` and `--tls-key` were not specified") - } - s.Fatalf("the required flag `--tls-certificate` was not specified") - } - if s.TLSCertificateKey == "" { - s.Fatalf("the required flag `--tls-key` was not specified") - } - // this happens with a wrong custom TLS configurator - s.Fatalf("no certificate was configured for TLS") - } - - // must have at least one certificate or panics - httpsServer.TLSConfig.BuildNameToCertificate() - - configureServer(httpsServer, "https", s.httpsServerL.Addr().String()) - - servers = append(servers, httpsServer) - wg.Add(1) - - kickstartUIURL := fmt.Sprintf("https://%s", s.httpsServerL.Addr()) - s.Logf("Serving kickstart UI at %s", kickstartUIURL) - - err = s.OpenBrowserURL(kickstartUIURL, s.Browser) - if err != nil { - return err - } - - go func(l net.Listener) { - defer wg.Done() - if err := httpsServer.Serve(l); err != nil && err != http.ErrServerClosed { - s.Fatalf("%v", err) - } - s.Logf("Stopped serving kickstart UI at https://%s", l.Addr()) - }(tls.NewListener(s.httpsServerL, httpsServer.TLSConfig)) - } - - wg.Wait() - return nil -} - -// Listen creates the listeners for the server -func (s *Server) Listen() error { - if s.hasListeners { // already done this - return nil - } - - if s.hasScheme(schemeHTTPS) { - // Use http host if https host wasn't defined - if s.TLSHost == "" { - s.TLSHost = s.Host - } - // Use http listen limit if https listen limit wasn't defined - if s.TLSListenLimit == 0 { - s.TLSListenLimit = s.ListenLimit - } - // Use http tcp keep alive if https tcp keep alive wasn't defined - if int64(s.TLSKeepAlive) == 0 { - s.TLSKeepAlive = s.KeepAlive - } - // Use http read timeout if https read timeout wasn't defined - if int64(s.TLSReadTimeout) == 0 { - s.TLSReadTimeout = s.ReadTimeout - } - // Use http write timeout if https write timeout wasn't defined - if int64(s.TLSWriteTimeout) == 0 { - s.TLSWriteTimeout = s.WriteTimeout - } - } - - if s.hasScheme(schemeUnix) { - domSockListener, err := net.Listen("unix", string(s.SocketPath)) - if err != nil { - return err - } - s.domainSocketL = domSockListener - } - - if s.hasScheme(schemeHTTP) { - listener, err := net.Listen("tcp", net.JoinHostPort(s.Host, strconv.Itoa(s.Port))) - if err != nil { - return err - } - - h, p, err := swag.SplitHostPort(listener.Addr().String()) - if err != nil { - return err - } - s.Host = h - s.Port = p - s.httpServerL = listener - } - - if s.hasScheme(schemeHTTPS) { - tlsListener, err := net.Listen("tcp", net.JoinHostPort(s.TLSHost, strconv.Itoa(s.TLSPort))) - if err != nil { - return err - } - - sh, sp, err := swag.SplitHostPort(tlsListener.Addr().String()) - if err != nil { - return err - } - s.TLSHost = sh - s.TLSPort = sp - s.httpsServerL = tlsListener - } - - s.hasListeners = true - return nil -} - -// Shutdown server and clean up resources -func (s *Server) Shutdown() error { - if atomic.CompareAndSwapInt32(&s.shuttingDown, 0, 1) { - close(s.shutdown) - } - return nil -} - -func (s *Server) handleShutdown(wg *sync.WaitGroup, serversPtr *[]*http.Server) { - // wg.Done must occur last, after s.api.ServerShutdown() - // (to preserve old behaviour) - defer wg.Done() - - <-s.shutdown - - servers := *serversPtr - - ctx, cancel := context.WithTimeout(context.TODO(), s.GracefulTimeout) - defer cancel() - - shutdownChan := make(chan bool) - for i := range servers { - server := servers[i] - go func() { - var success bool - defer func() { - shutdownChan <- success - }() - if err := server.Shutdown(ctx); err != nil { - // Error from closing listeners, or context timeout: - s.Logf("HTTP server Shutdown: %v", err) - } else { - success = true - } - }() - } - - // Wait until all listeners have successfully shut down before calling ServerShutdown - success := true - for range servers { - success = success && <-shutdownChan - } - if success { - s.api.ServerShutdown() - } -} - -// GetHandler returns a handler useful for testing -func (s *Server) GetHandler() http.Handler { - return s.handler -} - -// SetHandler allows for setting a http handler on this server -func (s *Server) SetHandler(handler http.Handler) { - s.handler = handler -} - -// UnixListener returns the domain socket listener -func (s *Server) UnixListener() (net.Listener, error) { - if !s.hasListeners { - if err := s.Listen(); err != nil { - return nil, err - } - } - return s.domainSocketL, nil -} - -// HTTPListener returns the http listener -func (s *Server) HTTPListener() (net.Listener, error) { - if !s.hasListeners { - if err := s.Listen(); err != nil { - return nil, err - } - } - return s.httpServerL, nil -} - -// TLSListener returns the https listener -func (s *Server) TLSListener() (net.Listener, error) { - if !s.hasListeners { - if err := s.Listen(); err != nil { - return nil, err - } - } - return s.httpsServerL, nil -} - -// Opens the Kickstart UI in either the default browser or -// the user's browser of choice -func (s *Server) OpenBrowserURL(url, browser string) error { - if browser == "" { - if err := open.Run(url); err != nil { - s.Logf("unable to open browser: %v", err) - } - } else if browser == "none" { - return nil - } else { - if err := open.RunWith(url, parseBrowser(url, browser)); err != nil { - s.Logf("unable to open browser %s: %v", browser, err) - } - } - return nil -} - -func parseBrowser(url, browser string) string { - browser = strings.ToLower(browser) - if browser == "chrome" { - switch runtime.GOOS { - case "darwin": - browser = "Google Chrome" - case "linux": - browser = "google-chrome" - } - } else if browser == "ie" { - browser = "iexplore" - } else if browser == "edge" { - browser = "microsoft-edge:" + url - } - return browser -} - -func handleInterrupt(once *sync.Once, s *Server) { - once.Do(func() { - for range s.interrupt { - if s.interrupted { - s.Logf("Server already shutting down") - continue - } - s.interrupted = true - s.Logf("Shutting down... ") - if err := s.Shutdown(); err != nil { - s.Logf("HTTP server Shutdown: %v", err) - } - } - }) -} - -func signalNotify(interrupt chan<- os.Signal) { - signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM) -} diff --git a/tkg/web/server/serve.go b/tkg/web/server/serve.go deleted file mode 100644 index 3922245bb2..0000000000 --- a/tkg/web/server/serve.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package server providers backend api for UI -package server - -import ( - "log" - "net" - "net/http" - "os" - "strconv" - "strings" - "time" - - "github.com/go-openapi/loads" - "github.com/pkg/errors" - - assetfs "github.com/elazarl/go-bindata-assetfs" - - "github.com/vmware-tanzu/tanzu-framework/tkg/client" - servermanifest "github.com/vmware-tanzu/tanzu-framework/tkg/manifest/server" - "github.com/vmware-tanzu/tanzu-framework/tkg/tkgconfigreaderwriter" - "github.com/vmware-tanzu/tanzu-framework/tkg/types" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/handlers" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/restapi/operations" - "github.com/vmware-tanzu/tanzu-framework/tkg/web/server/ws" -) - -// Serve serve the kickstart UI -// nolint:gocritic -func Serve(initOptions client.InitRegionOptions, appConfig types.AppConfig, tkgConfigReaderWriter tkgconfigreaderwriter.TKGConfigReaderWriter, - tkgTimeOut time.Duration, bind string, browser string) error { - - swaggerSpec, err := loads.Analyzed(restapi.FlatSwaggerJSON, "2.0") - if err != nil { - log.Fatalln(err) - } - - api := operations.NewKickstartUIAPI(swaggerSpec) - server := restapi.NewServer(api) - - server.EnabledListeners = []string{"http"} - host, port, err := net.SplitHostPort(bind) - if err != nil { - return errors.Errorf("Invalid binding address provided. Please use address in the the form '127.0.0.1:8080'") - } - server.Port, err = strconv.Atoi(port) - if err != nil { - return errors.Errorf("Invalid binding port provided. Please provide a valid number (e.g. 8080).") - } - server.Host = host - server.Browser = browser - - ws.InitWebsocketUpgrader(server.Host) - - app := &handlers.App{InitOptions: initOptions, AppConfig: appConfig, TKGTimeout: tkgTimeOut, TKGConfigReaderWriter: tkgConfigReaderWriter} - app.ConfigureHandlers(api) - server.SetAPI(api) - server.SetHandler(api.Serve(FileServerMiddleware)) - - // check if the port is already in use, if so exit gracefully - l, err := net.Listen("tcp", server.Host+":"+strconv.Itoa(server.Port)) - if err != nil { - server.Logf("Failed to start the kickstart UI Server[Host:%s, Port:%d], error: %s\n", server.Host, server.Port, err) - os.Exit(1) - } - l.Close() - - defer func() { - err := server.Shutdown() - if err != nil { - log.Fatalln(err) - } - }() - if err := server.Serve(); err != nil { - log.Fatalln(err) - } - return nil -} - -// FileServerMiddleware serves ui resource -func FileServerMiddleware(handler http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if strings.HasPrefix(r.URL.Path, "/ws") { - ws.HandleWebsocketRequest(w, r) - } else if strings.HasPrefix(r.URL.Path, "/api/providers") { - handler.ServeHTTP(w, r) - } else if strings.HasPrefix(r.URL.Path, "/api/features") { - handler.ServeHTTP(w, r) - } else if strings.HasPrefix(r.URL.Path, "/api/edition") { - handler.ServeHTTP(w, r) - } else if strings.HasPrefix(r.URL.Path, "/api/integration") { - handler.ServeHTTP(w, r) - } else if strings.HasPrefix(r.URL.Path, "/api/avi") { - handler.ServeHTTP(w, r) - } else if strings.HasPrefix(r.URL.Path, "/api/ldap") { - handler.ServeHTTP(w, r) - } else { - w.Header().Set("Cache-Control", "no-store") - w.Header().Set("Pragma", "no-cache") - w.Header().Set("Expires", "0") - - if strings.HasSuffix(r.URL.Path, ".css") { - w.Header().Add("Content-Type", "text/css") - } - - fs := &assetfs.AssetFS{Asset: servermanifest.Asset, AssetDir: servermanifest.AssetDir, AssetInfo: servermanifest.AssetInfo, Prefix: "tkg/web/dist/tkg-kickstart-ui", Fallback: "index.html"} - http.FileServer(fs).ServeHTTP(w, r) - } - }) -} diff --git a/tkg/web/server/ws/ws.go b/tkg/web/server/ws/ws.go deleted file mode 100644 index 437e362cf7..0000000000 --- a/tkg/web/server/ws/ws.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2021 VMware, Inc. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// Package ws implements websocket used with UI communications -package ws - -import ( - "errors" - "fmt" - "net/http" - "syscall" - - "github.com/gorilla/websocket" - - "github.com/vmware-tanzu/tanzu-framework/tkg/log" -) - -var upgrader = websocket.Upgrader{} - -var ( - wsConnections []*websocket.Conn - logs = [][]byte{} -) - -// InitWebsocketUpgrader initializes the upgrader and configures the -// CheckOrigin function using the provided host -func InitWebsocketUpgrader(hostBind string) { - upgrader = websocket.Upgrader{ - CheckOrigin: func(r *http.Request) bool { - return true - }, - } -} - -// HandleWebsocketRequest handles the websocket request coming from clients -// upgrade normal http request to websocket request and stores the connection -func HandleWebsocketRequest(w http.ResponseWriter, r *http.Request) { - ws, err := upgrader.Upgrade(w, r, nil) - if err != nil { - log.ForceWriteToStdErr([]byte(fmt.Sprintf("web socket upgrade error: %s", err.Error()))) - return - } - wsConnections = append(wsConnections, ws) - - log.ForceWriteToStdErr([]byte("web socket connection established\n")) - - sendPendingLogsOnConnection(ws) - - ws.SetCloseHandler(func(code int, text string) error { - deleteWSConnection(ws) - ws.Close() - return nil - }) - - for { - _, _, err := ws.ReadMessage() - if err != nil { - break - } - } -} - -func sendPendingLogsOnConnection(ws *websocket.Conn) { - log.ForceWriteToStdErr([]byte(fmt.Sprintf("sending pending %v logs to UI\n", len(logs)))) - for _, logMsg := range logs { - err := ws.WriteMessage(1, logMsg) - if err != nil { - log.ForceWriteToStdErr([]byte("fail to write log message to web socket")) - break - } - } - - logs = [][]byte{} -} - -func deleteWSConnection(conn *websocket.Conn) { - index := -1 - for i, ws := range wsConnections { - if conn == ws { - index = i - break - } - } - if index != -1 { - wsConnections = append(wsConnections[:index], wsConnections[index+1:]...) - } -} - -// SendLog send the log message to all the connected websocket clients -func SendLog(logMsg []byte) { - var err error - - if len(wsConnections) == 0 { - logs = append(logs, logMsg) - return - } - - for _, ws := range wsConnections { - err = ws.WriteMessage(1, logMsg) - if err != nil { - // when client connection is closed - if errors.Is(err, syscall.EPIPE) || errors.Is(err, syscall.ECONNRESET) { - deleteWSConnection(ws) - continue - } - - log.ForceWriteToStdErr([]byte("fail to write log message to web socket")) - break - } - } -} diff --git a/tkg/web/src/app/app-routing.module.ts b/tkg/web/src/app/app-routing.module.ts deleted file mode 100644 index 1bc0ca8156..0000000000 --- a/tkg/web/src/app/app-routing.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -// Angular imports -import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; - -// App imports - -const routes: Routes = [ - { - path: '', - redirectTo: 'ui', - pathMatch: 'full' - }, - { - path: 'ui', - loadChildren: () => import('./views/landing/landing.module').then(m => m.LandingModule) - } -]; - -@NgModule({ - imports: [RouterModule.forRoot(routes, {useHash: true})], - exports: [RouterModule] -}) -export class AppRoutingModule { } diff --git a/tkg/web/src/app/app.component.html b/tkg/web/src/app/app.component.html deleted file mode 100644 index f78ad9f120..0000000000 --- a/tkg/web/src/app/app.component.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - -
-
- -
-
- -
diff --git a/tkg/web/src/app/app.component.scss b/tkg/web/src/app/app.component.scss deleted file mode 100644 index 7d6fbfe7eb..0000000000 --- a/tkg/web/src/app/app.component.scss +++ /dev/null @@ -1,5 +0,0 @@ -.theme-select { - position: fixed; - bottom: 6px; - left: 10px; -} diff --git a/tkg/web/src/app/app.component.spec.ts b/tkg/web/src/app/app.component.spec.ts deleted file mode 100644 index b6333c044a..0000000000 --- a/tkg/web/src/app/app.component.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Angular imports -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { TestBed, async } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { HttpClientModule } from '@angular/common/http'; - -// App imports -import { AppComponent } from './app.component'; -import { ThemeToggleComponent } from './shared/components/theme-toggle/theme-toggle.component'; -import { APIClient } from './swagger/api-client.service'; -import { BrandingService } from './shared/service/branding.service'; -import { BrandingServiceStub } from './testing/branding.service.stub'; - -describe('AppComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - HttpClientModule, - RouterTestingModule - ], - providers: [ - APIClient, - { provide: BrandingService, useClass: BrandingServiceStub } - ], - declarations: [ - AppComponent, - ThemeToggleComponent - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ] - }).compileComponents(); - })); - - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.debugElement.componentInstance; - expect(app).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/app.component.ts b/tkg/web/src/app/app.component.ts deleted file mode 100644 index 19542208fe..0000000000 --- a/tkg/web/src/app/app.component.ts +++ /dev/null @@ -1,51 +0,0 @@ -// Angular imports -import { Component } from '@angular/core'; -import { takeUntil } from 'rxjs/operators'; -import '@clr/icons'; -import '@clr/icons/shapes/all-shapes'; -// App imports -import { BasicSubscriber } from './shared/abstracts/basic-subscriber'; -import { APIClient } from './swagger/api-client.service'; -import { ProviderInfo } from './swagger/models/provider-info.model'; -import { BrandingService } from './shared/service/branding.service'; -import { Features } from "./swagger/models"; -import AppServices from "./shared/service/appServices"; - -@Component({ - selector: 'tkg-kickstart-ui-app', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] -}) -export class AppComponent extends BasicSubscriber { - providerType: string = null; - - constructor(private apiClient: APIClient, - private editionService: BrandingService) { - super(); - - AppServices.appDataService.setProviderType(null); - - this.apiClient.getProvider() - .pipe(takeUntil(this.unsubscribe)) - .subscribe(((res: ProviderInfo) => { - this.providerType = res.provider; - AppServices.appDataService.setProviderType(res.provider); - AppServices.appDataService.setTkrVersion(res.tkrVersion); - }), - ((err) => { - console.log('Failed to retrieve provider type and Kubernetes version.'); - }) - ); - - this.apiClient.getFeatureFlags() - .pipe(takeUntil(this.unsubscribe)) - .subscribe(((features: Features) => { - AppServices.appDataService.setFeatureFlags(features); - this.editionService.initBranding(); // NOTE: the branding may depend on feature flags - }), - ((err) => { - console.log('Failed to retrieve feature flags.'); - }) - ); - } -} diff --git a/tkg/web/src/app/app.module.ts b/tkg/web/src/app/app.module.ts deleted file mode 100644 index 7b49d1301a..0000000000 --- a/tkg/web/src/app/app.module.ts +++ /dev/null @@ -1,53 +0,0 @@ -// Angular imports -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { BrowserModule } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -// Third-party imports -import { LogMonitorModule } from 'ngx-log-monitor'; -import { CodemirrorModule } from '@ctrl/ngx-codemirror'; -import { RxReactiveFormsModule } from '@rxweb/reactive-form-validators'; -// Module imports -import { APIClientModule } from './swagger/index'; -import { AppRoutingModule } from './app-routing.module'; -import { SharedModule } from './shared/shared.module'; -// Component imports -import { AppComponent } from './app.component'; -import { HeaderBarModule } from './shared/components/header-bar/header-bar.module'; -import { ThemeToggleComponent } from './shared/components/theme-toggle/theme-toggle.component'; -// Service imports -import { BrandingService } from './shared/service/branding.service'; -import { WebsocketService } from './shared/service/websocket.service'; - -@NgModule({ - declarations: [ - AppComponent, - ThemeToggleComponent - ], - imports: [ - BrowserModule, - AppRoutingModule, - LogMonitorModule, - BrowserAnimationsModule, - HeaderBarModule, - APIClientModule.forRoot({ - domain: '', - httpOptions: { - headers: { - 'Content-Type': 'application/json' - } - } - }), - SharedModule, - CodemirrorModule, - - RxReactiveFormsModule - ], - providers: [ - BrandingService, - WebsocketService - ], - bootstrap: [AppComponent] -}) -export class AppModule { -} diff --git a/tkg/web/src/app/shared/abstracts/basic-subscriber.ts b/tkg/web/src/app/shared/abstracts/basic-subscriber.ts deleted file mode 100644 index 908cfe5ab3..0000000000 --- a/tkg/web/src/app/shared/abstracts/basic-subscriber.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Injectable, OnDestroy } from "@angular/core"; -import { Subject } from 'rxjs'; - -/** - * Base class tha should be extended by any class that want to have a flag indicating if the component - * is still alive. This is useful to handle Observable subscriptions in order to unsubscribe. Instead - * of doing unsubscribe() you can use operator .takeWhile(() => this.isAlive). - */ - @Injectable() -export abstract class BasicSubscriber implements OnDestroy { - - protected isAlive = true; - protected unsubscribe: Subject = new Subject(); - - ngOnDestroy() { - this.isAlive = false; - this.unsubscribe.next(); - this.unsubscribe.complete(); - } -} diff --git a/tkg/web/src/app/shared/components/alert-notification/alert-notification.component.html b/tkg/web/src/app/shared/components/alert-notification/alert-notification.component.html deleted file mode 100644 index 5b03c38370..0000000000 --- a/tkg/web/src/app/shared/components/alert-notification/alert-notification.component.html +++ /dev/null @@ -1,26 +0,0 @@ - diff --git a/tkg/web/src/app/shared/components/alert-notification/alert-notification.component.scss b/tkg/web/src/app/shared/components/alert-notification/alert-notification.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/web/src/app/shared/components/alert-notification/alert-notification.component.ts b/tkg/web/src/app/shared/components/alert-notification/alert-notification.component.ts deleted file mode 100644 index a589791ca0..0000000000 --- a/tkg/web/src/app/shared/components/alert-notification/alert-notification.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, Input } from '@angular/core'; - -export enum NotificationTypes { - INFO = 'info', - SUCCESS = 'success', - WARNING = 'warning', - ERROR = 'error' -} - -export interface Notification { - notificationType: string; - message: string; -} - -@Component({ - selector: 'app-alert-notification', - templateUrl: './alert-notification.component.html' -}) -export class AlertNotificationComponent { - @Input() notification: Notification; - - isInfo(): boolean { - return this.notification.notificationType === NotificationTypes.INFO; - } - - isSuccess(): boolean { - return this.notification.notificationType === NotificationTypes.SUCCESS; - } - - isWarning(): boolean { - return this.notification.notificationType === NotificationTypes.WARNING; - } - - isError(): boolean { - return this.notification.notificationType === NotificationTypes.ERROR; - } -} diff --git a/tkg/web/src/app/shared/components/copy-to-clipboard-button/copy-to-clipboard-button.component.html b/tkg/web/src/app/shared/components/copy-to-clipboard-button/copy-to-clipboard-button.component.html deleted file mode 100644 index ea68e1b9ac..0000000000 --- a/tkg/web/src/app/shared/components/copy-to-clipboard-button/copy-to-clipboard-button.component.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - {{tooltip}} - - - - - diff --git a/tkg/web/src/app/shared/components/copy-to-clipboard-button/copy-to-clipboard-button.component.scss b/tkg/web/src/app/shared/components/copy-to-clipboard-button/copy-to-clipboard-button.component.scss deleted file mode 100644 index 7737b2e5c2..0000000000 --- a/tkg/web/src/app/shared/components/copy-to-clipboard-button/copy-to-clipboard-button.component.scss +++ /dev/null @@ -1,108 +0,0 @@ -.icon-btn:focus { - outline: 0 !important; -} - -span.copy-button { - button { - margin-right: 0px !important; - border: none; - padding: 0; - } -} - -.flip-horizontal-bottom { - -webkit-animation: flip-horizontal-bottom 0.5s cubic-bezier(0.455, 0.030, 0.515, 0.955) both; - animation: flip-horizontal-bottom 0.5s cubic-bezier(0.455, 0.030, 0.515, 0.955) both; -} - -.flip-horizontal-reverse { - -webkit-animation: flip-horizontal-reverse 0.5s cubic-bezier(0.455, 0.030, 0.515, 0.955) both; - animation: flip-horizontal-reverse 0.5s cubic-bezier(0.455, 0.030, 0.515, 0.955) both; -} - -.anim-object { - transform-style: preserve-3d; - display: block; - outline: none; -} - -.face { - position: absolute; - width: 100%; - height: 100%; - backface-visibility: hidden; - border-radius: 3px; - text-align: center; - overflow: hidden; - text-overflow: ellipsis; - transform: rotateX(0deg); -} - -.front { - z-index: 20; - - &.face-label { - position: relative; - } -} - -.back { - z-index: 10; - transform: rotateX(180deg); - &.face-label { - top: 0px; - } -} - -.hide-tooltip { - display: none; -} - -/** - * ---------------------------------------- - * animation flip-horizontal-bottom - * ---------------------------------------- - */ -@-webkit-keyframes flip-horizontal-bottom { - 0% { - -webkit-transform: rotateX(0); - transform: rotateX(0); - } - 100% { - -webkit-transform: rotateX(-180deg); - transform: rotateX(-180deg); - } -} - -@keyframes flip-horizontal-bottom { - 0% { - -webkit-transform: rotateX(0); - transform: rotateX(0); - } - 100% { - -webkit-transform: rotateX(-180deg); - transform: rotateX(-180deg); - } -} - -@-webkit-keyframes flip-horizontal-reverse { - 0% { - -webkit-transform: rotateX(-180deg); - transform: rotateX(-180deg); - } - 100% { - -webkit-transform: rotateX(0); - transform: rotateX(0); - } -} - -@keyframes flip-horizontal-reverse { - 0% { - -webkit-transform: rotateX(-180deg); - transform: rotateX(-180deg); - } - 100% { - -webkit-transform: rotateX(0); - transform: rotateX(0); - } -} diff --git a/tkg/web/src/app/shared/components/copy-to-clipboard-button/copy-to-clipboard-button.component.ts b/tkg/web/src/app/shared/components/copy-to-clipboard-button/copy-to-clipboard-button.component.ts deleted file mode 100644 index 2be699331e..0000000000 --- a/tkg/web/src/app/shared/components/copy-to-clipboard-button/copy-to-clipboard-button.component.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { - ElementRef, - HostBinding, - Output, - EventEmitter, - Component, - OnInit, - Input, - ViewChild, - OnChanges, -} from '@angular/core'; - -const SHOW_CHECKBOX_TIMEOUT = 1500; - -@Component({ - selector: 'app-copy-to-clipboard-button', - templateUrl: './copy-to-clipboard-button.component.html', - styleUrls: ['./copy-to-clipboard-button.component.scss'] -}) -export class VmwCopyToClipboardButtonComponent implements OnInit, OnChanges { - @ViewChild('area', { read: ElementRef }) area: ElementRef; - - // tslint:disable-next-line: no-input-rename - @HostBinding('class') @Input('class') classList: string = ''; - - @Input() value: string; - @Input() ariaLabel: string = ""; - @Input() size = 16; - @Input() tooltip = ''; - @Input() btnLabel = ''; // if no label specified, show the normal copy icon - @Input() btnClasses = ['btn-outline']; // if no label specified, show the normal copy icon - @Input() disabled: boolean = false; - @Input() tooltipDirection = 'top-left'; - - @Output() copyClick = new EventEmitter(); - - private firstLoad = true; // show correct icon first - - btnClassesToApply: string; - animClasses = ''; - bounds: string; - hasProjectedContent: boolean = false; - isSafari: boolean = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); - - constructor(private el: ElementRef) {} - - ngOnInit() { - this.bounds = (this.size + 6) + 'px'; - - this.hasProjectedContent = this.el.nativeElement.innerText.trim(); - - this.calculateClassesToApply(); - } - - calculateClassesToApply() { - let classes: Array = []; - - if (!this.btnLabel.length) { - classes.push('icon-btn'); - } - - if (this.btnLabel.length) { - classes = classes.concat(this.btnClasses); - } - - if (this.disabled) { - classes.push('disabled'); - } - - this.btnClassesToApply = classes.join(' ') + ' ' + this.classList; - } - - ngOnChanges() { - this.calculateClassesToApply(); - } - - copyToClipboard(val: string) { - const myWindow: any = window; - - const onCopy = (e: ClipboardEvent) => { - e.preventDefault(); - - if (e.clipboardData) { - e.clipboardData.setData('text/plain', val); - } else if (myWindow.clipboardData) { - myWindow.clipboardData.setData('Text', val); - } - - myWindow.removeEventListener('copy', onCopy); - }; - - if (this.isSafari) { - this.area.nativeElement.value = val; - this.area.nativeElement.select(); - } - - myWindow.addEventListener('copy', onCopy); - - if (myWindow.clipboardData && myWindow.clipboardData.setData) { - myWindow.clipboardData.setData('Text', val); - } else { - document.execCommand('copy'); - } - } - - doCopy() { - this.copyToClipboard(this.value); - this.copyClick.emit(); - this.firstLoad = false; - this.animClasses = 'flip-horizontal-bottom'; - this.ariaLabel = 'copied cli command'; - setTimeout(() => { - this.animClasses = 'flip-horizontal-reverse'; - this.ariaLabel = ''; - }, SHOW_CHECKBOX_TIMEOUT); - } -} diff --git a/tkg/web/src/app/shared/components/error-import-file/error-import-file.component.html b/tkg/web/src/app/shared/components/error-import-file/error-import-file.component.html deleted file mode 100644 index 1ae653f7ee..0000000000 --- a/tkg/web/src/app/shared/components/error-import-file/error-import-file.component.html +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/tkg/web/src/app/shared/components/error-import-file/error-import-file.component.ts b/tkg/web/src/app/shared/components/error-import-file/error-import-file.component.ts deleted file mode 100644 index 62d3df5392..0000000000 --- a/tkg/web/src/app/shared/components/error-import-file/error-import-file.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { BasicSubscriber } from 'src/app/shared/abstracts/basic-subscriber'; - -@Component({ - selector: 'app-error-import-file', - templateUrl: './error-import-file.component.html' -}) -export class ErrorImportFileComponent extends BasicSubscriber implements OnInit { - @Input() errorImportFile: any; - - ngOnInit() { - } -} diff --git a/tkg/web/src/app/shared/components/error-notification/error-notification.component.html b/tkg/web/src/app/shared/components/error-notification/error-notification.component.html deleted file mode 100644 index 12f63c1eb4..0000000000 --- a/tkg/web/src/app/shared/components/error-notification/error-notification.component.html +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/tkg/web/src/app/shared/components/error-notification/error-notification.component.ts b/tkg/web/src/app/shared/components/error-notification/error-notification.component.ts deleted file mode 100644 index 485dbf0128..0000000000 --- a/tkg/web/src/app/shared/components/error-notification/error-notification.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {Component, Input, OnInit} from '@angular/core'; -import { BasicSubscriber } from 'src/app/shared/abstracts/basic-subscriber'; - -@Component({ - selector: 'app-error-notification', - templateUrl: './error-notification.component.html' -}) -export class ErrorNotificationComponent extends BasicSubscriber implements OnInit { - @Input() errorNotification: any; - - ngOnInit() { - } -} diff --git a/tkg/web/src/app/shared/components/header-bar/header-bar.component.html b/tkg/web/src/app/shared/components/header-bar/header-bar.component.html deleted file mode 100644 index f4f92ef159..0000000000 --- a/tkg/web/src/app/shared/components/header-bar/header-bar.component.html +++ /dev/null @@ -1,21 +0,0 @@ -
-
- -
- -
-
-
diff --git a/tkg/web/src/app/shared/components/header-bar/header-bar.component.scss b/tkg/web/src/app/shared/components/header-bar/header-bar.component.scss deleted file mode 100644 index 35e04914fe..0000000000 --- a/tkg/web/src/app/shared/components/header-bar/header-bar.component.scss +++ /dev/null @@ -1,67 +0,0 @@ -[header-bar-root] { - .branding { - cursor: pointer; - } - - .title { - font-size: 18px; - font-family: Metropolis, Avenir Next, Helvetica Neue, Arial,sans-serif; - } - - .trademark { - padding-left: 3px; - font-family: Metropolis, Avenir Next, Helvetica Neue, Arial,sans-serif; - } - - .mr4 { - margin-right: 4px; - } - - clr-icon { - height: 24px; - width: 24px; - } - - .logo-24 { - margin-right: 10px; - } - - clr-dropdown-menu { - z-index: 1050; - } - - .header { - position: relative; - z-index: 2000; - - .header-actions { - .btn { - align-self: center; - margin-right: 2em; - background-color: #90c9df; - color: #00364d; - } - } - } -} - -// spinner overlay customizations -.spinner-overlay { - height: 100%; - width: 100%; - z-index: 1050; - position: absolute; - top: 0; - left: 0; - background-color: #FAFAFA; - opacity: 0.5; - text-align: center; - - .spinner { - position: relative; - top: 50%; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); - } -} diff --git a/tkg/web/src/app/shared/components/header-bar/header-bar.component.spec.ts b/tkg/web/src/app/shared/components/header-bar/header-bar.component.spec.ts deleted file mode 100644 index 9f7b30a900..0000000000 --- a/tkg/web/src/app/shared/components/header-bar/header-bar.component.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -// Angular modules -import { TestBed, async, fakeAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -// App imports -import { HeaderBarComponent } from './header-bar.component'; - -describe('HeaderBarComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule - ], - declarations: [ - HeaderBarComponent - ] - }).compileComponents(); - })); - - it('should exist', () => { - const fixture = TestBed.createComponent(HeaderBarComponent); - const landingComponent = fixture.debugElement.componentInstance; - expect(landingComponent).toBeTruthy(); - }); - - it('should call navigateHome() method if user clicks on TKG logo', fakeAsync(() => { - const fixture = TestBed.createComponent(HeaderBarComponent); - const comp = fixture.debugElement.componentInstance; - spyOn(comp, 'navigateHome'); - const elem = fixture.nativeElement.querySelector('.branding'); - elem.click(); - expect(comp.navigateHome).toHaveBeenCalled(); - })); - - it('should call navigateToDocs() method if user clicks on Documentation link', fakeAsync(() => { - const fixture = TestBed.createComponent(HeaderBarComponent); - const comp = fixture.debugElement.componentInstance; - spyOn(comp, 'navigateToDocs'); - const elem = fixture.nativeElement.querySelector('.btn-header-action'); - elem.click(); - expect(comp.navigateToDocs).toHaveBeenCalled(); - })); -}); diff --git a/tkg/web/src/app/shared/components/header-bar/header-bar.component.ts b/tkg/web/src/app/shared/components/header-bar/header-bar.component.ts deleted file mode 100644 index 72019dba47..0000000000 --- a/tkg/web/src/app/shared/components/header-bar/header-bar.component.ts +++ /dev/null @@ -1,51 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -// Third party imports -import { takeUntil } from "rxjs/operators"; -// App imports -import { APP_ROUTES } from '../../constants/routes.constants'; -import { AppEdition } from "../../constants/branding.constants"; -import AppServices from "../../service/appServices"; -import { BasicSubscriber } from "../../abstracts/basic-subscriber"; -import { EditionData } from "../../service/branding.service"; -import { TanzuEvent, TanzuEventType } from "../../service/Messenger"; - -/** - * @class HeaderBarComponent - * HeaderBarComponent is the Clarity header component for TKG Kickstart UI. - */ -@Component({ - selector: 'tkg-kickstart-ui-header-bar', - templateUrl: './header-bar.component.html', - styleUrls: ['./header-bar.component.scss'] -}) -export class HeaderBarComponent extends BasicSubscriber implements OnInit { - - edition: string = ''; - docsUrl: string = ''; - - constructor(private router: Router) { - super(); - } - - ngOnInit() { - AppServices.messenger.subscribe(TanzuEventType.BRANDING_CHANGED, data => { - this.edition = data.payload.edition; - this.docsUrl = (this.edition === AppEdition.TKG) ? 'https://docs.vmware.com/en/VMware-Tanzu-Kubernetes-Grid/index.html' : - 'http://tanzucommunityedition.io/docs'; - }, this.unsubscribe); - } - - /** - * @method navigateHome - * helper method to route user to application home route - */ - navigateHome() { - this.router.navigate([APP_ROUTES.LANDING]); - } - - navigateToDocs() { - window.open(this.docsUrl, "_blank"); - } -} diff --git a/tkg/web/src/app/shared/components/header-bar/header-bar.imports.ts b/tkg/web/src/app/shared/components/header-bar/header-bar.imports.ts deleted file mode 100644 index 3c36fb8dc8..0000000000 --- a/tkg/web/src/app/shared/components/header-bar/header-bar.imports.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2019 VMware, Inc. All Rights Reserved. -// -/** - * Angular modules - */ -import { CommonModule } from '@angular/common'; - -/** - * Second party modules - */ -import { ClarityModule } from '@clr/angular'; - -export const HEADER_IMPORTS = [ - CommonModule, - ClarityModule -]; diff --git a/tkg/web/src/app/shared/components/header-bar/header-bar.module.ts b/tkg/web/src/app/shared/components/header-bar/header-bar.module.ts deleted file mode 100644 index bfbe9d71cc..0000000000 --- a/tkg/web/src/app/shared/components/header-bar/header-bar.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2019 VMware, Inc. All Rights Reserved. -// - -/** - * Angular modules - */ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -/** - * Second party modules - */ - -/** - * App imports - */ -import { HeaderBarComponent } from './header-bar.component'; -import { HEADER_IMPORTS } from './header-bar.imports'; - -@NgModule({ - imports: [ - ...HEADER_IMPORTS - ], - declarations: [HeaderBarComponent], - providers: [], - exports: [HeaderBarComponent] -}) -export class HeaderBarModule {} diff --git a/tkg/web/src/app/shared/components/preview-config/preview-config.component.html b/tkg/web/src/app/shared/components/preview-config/preview-config.component.html deleted file mode 100644 index 2d2244da79..0000000000 --- a/tkg/web/src/app/shared/components/preview-config/preview-config.component.html +++ /dev/null @@ -1,35 +0,0 @@ -
-
- - - - - - - - - - - - - - -
-
diff --git a/tkg/web/src/app/shared/components/preview-config/preview-config.component.scss b/tkg/web/src/app/shared/components/preview-config/preview-config.component.scss deleted file mode 100644 index f331602811..0000000000 --- a/tkg/web/src/app/shared/components/preview-config/preview-config.component.scss +++ /dev/null @@ -1,31 +0,0 @@ -.table th.left:last-child, -.table td.left:last-child { - width: 196px; -} - -.inner-th { - border-collapse: separate; - border-top-color: rgb(204, 204, 204); - border-top-style: solid; - border-top-width: 1px; -} - -table.table { - table-layout: fixed; -} - -table.table { - td, - th { - word-wrap: break-word; - text-align: left; - } -} - -.code { - vertical-align: middle; - color: white; - background-color: black; - font-family: inline; - font-family: "Fira Code", Menlo, Monaco, "Courier New", monospace; -} diff --git a/tkg/web/src/app/shared/components/preview-config/preview-config.component.spec.ts b/tkg/web/src/app/shared/components/preview-config/preview-config.component.spec.ts deleted file mode 100644 index 18ab112f81..0000000000 --- a/tkg/web/src/app/shared/components/preview-config/preview-config.component.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { VmwCopyToClipboardButtonComponent } from 'src/app/shared/components/copy-to-clipboard-button/copy-to-clipboard-button.component'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PreviewConfigComponent } from './preview-config.component'; -import { SharedModule } from 'src/app/shared/shared.module'; - -describe('PreviewConfigComponent', () => { - let component: PreviewConfigComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ PreviewConfigComponent, VmwCopyToClipboardButtonComponent ], - imports: [SharedModule] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(PreviewConfigComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/shared/components/preview-config/preview-config.component.ts b/tkg/web/src/app/shared/components/preview-config/preview-config.component.ts deleted file mode 100644 index a28b970433..0000000000 --- a/tkg/web/src/app/shared/components/preview-config/preview-config.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -// App imports -import AppServices from '../../service/appServices'; -import { BasicSubscriber } from 'src/app/shared/abstracts/basic-subscriber'; -import { TanzuEventType } from '../../service/Messenger'; - -@Component({ - selector: 'app-preview-config', - templateUrl: './preview-config.component.html', - styleUrls: ['./preview-config.component.scss'] -}) -export class PreviewConfigComponent extends BasicSubscriber implements OnInit { - - cli = ""; - - constructor() { - super(); - const step = this; - AppServices.messenger.subscribe(TanzuEventType.CLI_CHANGED, event => { step.cli = event.payload; }, this.unsubscribe); - } - - ngOnInit() { - } -} diff --git a/tkg/web/src/app/shared/components/theme-toggle/theme-toggle.component.html b/tkg/web/src/app/shared/components/theme-toggle/theme-toggle.component.html deleted file mode 100644 index 3c8849afcf..0000000000 --- a/tkg/web/src/app/shared/components/theme-toggle/theme-toggle.component.html +++ /dev/null @@ -1,14 +0,0 @@ -
- - - Dark - - - - Light - -
diff --git a/tkg/web/src/app/shared/components/theme-toggle/theme-toggle.component.scss b/tkg/web/src/app/shared/components/theme-toggle/theme-toggle.component.scss deleted file mode 100644 index e4ee1f92e3..0000000000 --- a/tkg/web/src/app/shared/components/theme-toggle/theme-toggle.component.scss +++ /dev/null @@ -1,41 +0,0 @@ -.theme-select { - display: block; - font-size: .6rem; - font-weight: 500; - letter-spacing: .073em; - text-decoration: none; - color: #0072a3; - text-transform: uppercase; - white-space: nowrap; - cursor: pointer; - position: fixed; - bottom: 10px; - left: 24px; - - &:hover { - color: #00567a; - } - - clr-icon { - position: unset; - transform: none; - margin-bottom: 2px; - } - - &.dark { - color: #4aaed9; - - &:hover { - color: #57c8ea - } - } - - //&:hover { - // color: #ffffff; - // clr-icon svg g g path { - // fill: #ffffff; - // } - //} -} - - diff --git a/tkg/web/src/app/shared/components/theme-toggle/theme-toggle.component.ts b/tkg/web/src/app/shared/components/theme-toggle/theme-toggle.component.ts deleted file mode 100644 index b1168e670c..0000000000 --- a/tkg/web/src/app/shared/components/theme-toggle/theme-toggle.component.ts +++ /dev/null @@ -1,58 +0,0 @@ -// Angular imports -import { Component, Inject, PLATFORM_ID } from '@angular/core'; -import { DOCUMENT, isPlatformBrowser } from '@angular/common'; - -/** - * @class ThemeToggleComponent - * ThemeToggleComponent allows user to switch between Clarity light and dark mode themes. - */ -@Component({ - selector: 'tkg-kickstart-ui-theme-toggle', - templateUrl: './theme-toggle.component.html', - styleUrls: ['./theme-toggle.component.scss'] -}) -export class ThemeToggleComponent { - linkRef: HTMLLinkElement; - - themes = [ - { name: 'light', href: 'clr-ui.min.css' }, - { name: 'dark', href: 'clr-ui-dark.min.css' } - ]; - - darkBodyClass: string = 'dark'; - theme = this.themes[0]; - constructor(@Inject(DOCUMENT) private document: Document, - @Inject(PLATFORM_ID) private platformId: Object) { - if (isPlatformBrowser(this.platformId)) { - try { - const stored = localStorage.getItem('clr-theme'); - if (stored) { - this.theme = JSON.parse(stored); - } else if (window.matchMedia('(prefers-color-scheme)').media !== 'not all') { - this.theme = window.matchMedia('(prefers-color-scheme: light)').matches ? this.themes[0] : this.themes[1]; - } - } catch (err) { - console.log(`Error retrieving clr-theme from local storage: ${err}`); - } - this.linkRef = this.document.createElement('link'); - this.linkRef.rel = 'stylesheet'; - this.linkRef.href = this.theme.href; - this.document.querySelector('head').appendChild(this.linkRef); - if (this.theme.name) { - this.document.body.className = this.theme.name; - } - } - } - - switchTheme() { - if (this.theme.name === 'light') { - this.theme = this.themes[1]; - this.document.body.className = this.darkBodyClass; - } else { - this.theme = this.themes[0]; - this.document.body.className = ''; - } - localStorage.setItem('clr-theme', JSON.stringify(this.theme)); - this.linkRef.href = this.theme.href; - } -} diff --git a/tkg/web/src/app/shared/constants/app.constants.ts b/tkg/web/src/app/shared/constants/app.constants.ts deleted file mode 100644 index 7f978fad16..0000000000 --- a/tkg/web/src/app/shared/constants/app.constants.ts +++ /dev/null @@ -1,33 +0,0 @@ -export interface Providers { - [key: string]: string; -} - -export const PROVIDERS: Providers = { - VSPHERE: 'vsphere', - AWS: 'aws', - AZURE: 'azure', - DOCKER: 'docker', -}; - -export const IAAS_DEFAULT_CIDRS = { - CLUSTER_SVC_CIDR: '100.64.0.0/13', - CLUSTER_POD_CIDR: '100.96.0.0/11', - CLUSTER_SVC_IPV6_CIDR: 'fd00:100:96::/108', - CLUSTER_POD_IPV6_CIDR: 'fd00:100:64::/48', -}; - -export enum IpFamilyEnum { - IPv4 = 'ipv4', - IPv6 = 'ipv6', -} - -export enum InstanceType { - DEV = 'dev', - PROD = 'prod', -} - -export enum Key { - Enter = 13, - LeftArrow = 37, - RightArrow = 39, -} diff --git a/tkg/web/src/app/shared/constants/branding.constants.ts b/tkg/web/src/app/shared/constants/branding.constants.ts deleted file mode 100644 index ae779a6d68..0000000000 --- a/tkg/web/src/app/shared/constants/branding.constants.ts +++ /dev/null @@ -1,51 +0,0 @@ -export enum AppEdition { - TKG = 'tkg', - TCE = 'tce', -} - -export const brandingDefault = { - edition: AppEdition.TKG, - clusterTypeDescriptor: "management", - branding: { - title: "Tanzu Kubernetes Grid", - landingPage: { - logoClass: "tanzu-logo", - title: "Welcome to the VMware Tanzu Kubernetes Grid Installer", - intro: "VMware Tanzu Kubernetes Grid delivers the services that IT teams need to effectively support development " + - "teams that develop and configure Kubernetes-based applications in a complex world. It balances the needs of " + - "development teams to access resources and services, with the needs of centralized IT organizations to " + - "maintain and control the development environments.To begin using Tanzu Kubernetes Grid, you " + - "first deploy a management cluster to your chosen infrastructure. The management cluster provides the entry " + - "point for Tanzu Kubernetes Grid integration with your platform, and allows you to deploy multiple workload clusters." + - "

Product documentation can be found here." - } - } -} - -export const brandingTce = { - edition: AppEdition.TCE, - clusterTypeDescriptor: "management", - branding: { - title: "Tanzu Community Edition", - landingPage: { - logoClass: "tce-logo", - title: "Welcome to the Tanzu Community Edition Installer", - intro: "Tanzu Community Edition (TCE) is VMware's Open Source Kubernetes distribution. The installer will " + - "deploy a temporary cluster on your local machine to bootstrap a management cluster on your desired target. " + - "This management cluster can then be used to deploy and manage workload clusters.

For more details " + - "see the getting started guide." - } - } -} - -export const brandingStandalone = { - clusterTypeDescriptor: "standalone", - branding: { - landingPage: { - intro: "Tanzu Community Edition (TCE) is VMware's Open Source Kubernetes distribution. The installer will " + - "deploy a temporary cluster on your local machine to bootstrap a standalone cluster on your desired target. " + - "

For more details see the getting started guide." - } - } -} diff --git a/tkg/web/src/app/shared/constants/routes.constants.ts b/tkg/web/src/app/shared/constants/routes.constants.ts deleted file mode 100644 index e61ed7095f..0000000000 --- a/tkg/web/src/app/shared/constants/routes.constants.ts +++ /dev/null @@ -1,18 +0,0 @@ -export interface Routes { - [key: string]: string; -} - -export interface Fragment { - [key: string]: string; -} - -export const APP_ROUTES: Routes = { - LANDING: '/ui', - VSPHERE_WITH_KUBERNETES: '/ui/vsphere-with-kubernetes', - INCOMPATIBLE: '/ui/incompatible', - WIZARD_MGMT_CLUSTER: '/ui/wizard', - AWS_WIZARD: '/ui/aws/wizard', - AZURE_WIZARD: '/ui/azure/wizard', - DOCKER_WIZARD: '/ui/docker/wizard', - WIZARD_PROGRESS: '/ui/deploy-progress' -}; diff --git a/tkg/web/src/app/shared/contextual-help/build-script/build.js b/tkg/web/src/app/shared/contextual-help/build-script/build.js deleted file mode 100644 index 066174982f..0000000000 --- a/tkg/web/src/app/shared/contextual-help/build-script/build.js +++ /dev/null @@ -1,55 +0,0 @@ -const fs = require('fs'); -const fm = require('html-frontmatter'); -const removeHtmlComments = require('remove-html-comments'); -const elasticlunr = require('elasticlunr'); - -const docsPath = 'src/contextualHelpDocs'; - -const lunrIndex = elasticlunr(function() { - this.addField('topicIds'); - this.setRef('topicTitle'); - this.saveDocument(true); -}); - -const loadDoc = (filePath) => { - const fileContent = fs.readFileSync(filePath, 'utf-8'); - const metaData = fm(fileContent); - const htmlContent = removeHtmlComments(fileContent); - lunrIndex.addDoc({ - ...metaData, - htmlContent: htmlContent.data - }); -} - -const getAllFiles = (dir) => { - return new Promise((resolve, reject) => { - const allPromises = []; - fs.readdir(dir, (err, files) => { - if (err) { - console.log(err); - return; - } - files.forEach(file => { - const filePath = `${dir}/${file}`; - if (fs.statSync(filePath).isDirectory()) { - allPromises.push(getAllFiles(filePath)) - } else { - if (file.endsWith('html')) { - loadDoc(filePath); - } - allPromises.push(Promise.resolve()); - } - }); - Promise.all(allPromises).then(resolve); - }); - }); -} - -getAllFiles(docsPath).then(() => { - fs.writeFileSync(docsPath + '/index.json', JSON.stringify(lunrIndex.toJSON()), { - encoding: 'utf-8' - }); - console.log('Elastic lunr index created successfully'); -}); - - diff --git a/tkg/web/src/app/shared/contextual-help/build-script/convert.js b/tkg/web/src/app/shared/contextual-help/build-script/convert.js deleted file mode 100644 index f9127c949c..0000000000 --- a/tkg/web/src/app/shared/contextual-help/build-script/convert.js +++ /dev/null @@ -1,110 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const axios = require('axios'); -const showdown = require('showdown'); -const pathData = require('./docPath.json'); - - -const CWD = process.cwd(); - -const saveFile = (filePathDest, content) => { - fs.writeFile(filePathDest, content, err => { - if (err) { - console.error(err); - } - }); -} - -const convertFile = (data) => { - const converter = new showdown.Converter(); - return converter.makeHtml(data); -} - -const convertLocalFile = (filePathSrc, filePathDest) => { - fs.readFile(CWD + filePathSrc, 'utf8', (err, data) => { - if (err) { - console.error(err); - return; - } - saveFile(CWD + filePathDest, convertFile(data)); - }); -} - -const convertLocalFiles = (pathInfo) => { - const srcDir = pathInfo.source; - const destDir = pathInfo.destination; - - fs.readdir(CWD + srcDir, (err, files) => { - if (err) { - console.error(err); - return; - } - files.forEach(file => { - convertLocalFile( - srcDir + file, - destDir + file.replace('.md', '.html') - ); - }); - }); -} - -const getDestination = (pathInfo, fromLocal) => { - const src = pathInfo.source; - const dest = pathInfo.destination; - - let statsSrc = null; - if (fromLocal) { - statsSrc = fs.statSync(CWD + src); - - } - - if (dest.substr(-5) === '.html') { // convert one file with a different name. - if (statsSrc && !statsSrc.isFile()) { - console.error('A directory can not be converted to a file'); - } - return pathInfo.destination; - } - - if (!fromLocal || statsSrc.isFile()) { //convert one file to a directory - return dest + path.basename(src).replace('.md', '.html'); - } - return ''; // save all files in src directory to destination directory. -} - -const isLocalPath = (arg) => { - return arg.indexOf('http') === -1; -} - -const generateMetaData = (title, tabs) => { - return``; -} - -const generateHTMLFromMD = () => { - pathData.forEach(({ - source, - destination, - topicTitle, - topicIds - }) => { - const isLocal = isLocalPath(source); - const dest = getDestination({source, destination}, isLocal); - if (isLocal) { - if (dest) { // convert one file - convertLocalFile(source, dest); - } else { //convert all files in the directory - convertLocalFiles({source, destination}); - } - } else { - axios.get(source).then((response) => { - generateMetaData(topicTitle, topicIds) - const metaData = topicTitle && topicIds ? generateMetaData(topicTitle, topicIds) : ''; - saveFile(CWD + dest, metaData + convertFile(response.data)); - }); - } - }); -}; - -generateHTMLFromMD(); \ No newline at end of file diff --git a/tkg/web/src/app/shared/contextual-help/build-script/docPath.json b/tkg/web/src/app/shared/contextual-help/build-script/docPath.json deleted file mode 100644 index 0ee50258ad..0000000000 --- a/tkg/web/src/app/shared/contextual-help/build-script/docPath.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "source": "https://raw.githubusercontent.com/vmware-tanzu/community-edition/main/docs/site/content/docs/latest/aws-intro.md", - "destination": "/src/contextualHelpDocs/tce/", - "topicTitle": "AWS steps", - "topicIds":["demo"] - } -] diff --git a/tkg/web/src/app/shared/contextual-help/contextual-help.component.html b/tkg/web/src/app/shared/contextual-help/contextual-help.component.html deleted file mode 100644 index 430442d073..0000000000 --- a/tkg/web/src/app/shared/contextual-help/contextual-help.component.html +++ /dev/null @@ -1,31 +0,0 @@ -
-
-
-
- -
- {{title}} - - - -
-

{{htmlContentIndex.topicTitle}}

-
-
-
-
-
-
- <BACK - - - -
- {{htmlContentIndex.topicTitle}} -
-
-
-
-
diff --git a/tkg/web/src/app/shared/contextual-help/contextual-help.component.scss b/tkg/web/src/app/shared/contextual-help/contextual-help.component.scss deleted file mode 100644 index 05cfdc76fb..0000000000 --- a/tkg/web/src/app/shared/contextual-help/contextual-help.component.scss +++ /dev/null @@ -1,119 +0,0 @@ -$PANEL_WIDTH: 380px; - -@keyframes slidein { - from { - right: -$PANEL_WIDTH; - } - - to { - right: 0; - } - } -.contextual-help-container { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: 2500; - overflow: hidden; - - .mask { - width: 100%; - height: 100%; - background-color: #000000; - opacity: 0.7; - } - .content-container { - position: absolute; - top: 60px; - right: 0; - width: $PANEL_WIDTH; - height: calc(100% - 60px); - background: #25333D; - padding: 27px; - color: #ffffff; - overflow: auto; - overflow: hidden; - } - .context-help-content-container { - position: absolute; - top: 0px; - right: 0; - width: 100%; - height: calc(100% - 60px); - background: #25333D; - padding: 27px; - color: #ffffff; - overflow: auto; - &.top-layer { - right: -$PANEL_WIDTH; - display: none; - * { - max-width: 100%; - } - &.show { - display: block; - animation: slidein 0.3s; - right: 0; - } - } - &.hide { - display: none; - } - - * { - color: #ffffff; - } - .sub-title { - font-size: 14px; - &:hover { - cursor: pointer; - } - } - .title { - display: inline-block; - padding-top: 10px; - font-size: 18px; - } - .close { - clr-icon { - &:hover { - cursor: pointer; - } - } - } - .controls { - .back-btn { - font-size: 12px; - color: #49AFD9; - text-decoration: none; - &:hover{ - cursor: pointer; - } - span { - padding: 0 5px; - color: #49AFD9; - } - } - .close { - clr-icon { - &:hover { - cursor: pointer; - } - } - } - } - .bottom-layer { - position: absolute; - top: 0; - left: 0; - } - .top-layer { - position: absolute; - top: 0; - left: 0; - } - - } -} \ No newline at end of file diff --git a/tkg/web/src/app/shared/contextual-help/contextual-help.component.spec.ts b/tkg/web/src/app/shared/contextual-help/contextual-help.component.spec.ts deleted file mode 100644 index a7fa237495..0000000000 --- a/tkg/web/src/app/shared/contextual-help/contextual-help.component.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ContextualHelpComponent } from './contextual-help.component'; -import mockIndex from '../../../contextualHelpDocs/mockIndex.json'; - -declare let elasticlunr: any; - -describe('ContextualHelpComponent', () => { - let component: ContextualHelpComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ContextualHelpComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ContextualHelpComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - component.lunrIndex = elasticlunr.Index.load(mockIndex); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should show contextual help component', () => { - component.getHTMLContent(['step1']); - component.open(); - expect(component.isVisible).toBeTrue(); - expect(component.htmlContentIndexArray.length).toEqual(1); - }); - - it('should hide contextual help component', () => { - component.hide(); - expect(component.isVisible).toBeFalse(); - }); - - it('should show detail for a topic', () => { - const mockData = { - htmlContent: '

hello world

', - topicIds: ['step1'], - topicTitle: 'docker step 1' - }; - component.showContent(mockData); - expect(component.isTopicView).toBeFalse(); - expect(component.htmlContentIndex).toEqual(mockData); - }); - - it('should navigate back to topic', () => { - component.navigateBack(); - expect(component.isTopicView).toBeTrue(); - }); -}); diff --git a/tkg/web/src/app/shared/contextual-help/contextual-help.component.ts b/tkg/web/src/app/shared/contextual-help/contextual-help.component.ts deleted file mode 100644 index 8b100bb8e8..0000000000 --- a/tkg/web/src/app/shared/contextual-help/contextual-help.component.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Component, Input, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; -import index from '../../../contextualHelpDocs/index.json'; -import { BasicSubscriber } from '../abstracts/basic-subscriber'; -import { ContextualHelpService } from './contextual-help.service'; - -declare let elasticlunr: any; - -interface ContextualHelpIndex { - htmlContent: string, - topicIds: Array, - topicTitle: string -}; -@Component({ - selector: 'app-contextual-help', - templateUrl: './contextual-help.component.html', - styleUrls: ['./contextual-help.component.scss'], - encapsulation: ViewEncapsulation.None -}) -export class ContextualHelpComponent extends BasicSubscriber implements OnInit, OnDestroy { - - @Input() id: string; - @Input() keywords: Array; - @Input() title: string; - - isTopicView: boolean = true; - isPinned: boolean = false; - isVisible: boolean = false; - - lunrIndex: any; - htmlContentIndexArray: Array = []; - htmlContentIndex: ContextualHelpIndex = { - htmlContent: '', - topicTitle: '', - topicIds: [] - }; - - constructor( - private service: ContextualHelpService - ) { - super(); - this.service.add(this); - } - - ngOnInit(): void { - this.lunrIndex = elasticlunr.Index.load(index); - this.getHTMLContent(this.lunrIndex.search(this.keywords, {bool: 'AND'})); - } - - getHTMLContent(htmlRefs) { - this.htmlContentIndexArray = []; - htmlRefs.forEach(ref => { - this.htmlContentIndexArray.push(this.lunrIndex.documentStore.getDoc(ref.ref)); - }); - - if (this.htmlContentIndexArray.length === 1) { - this.isTopicView = false; - this.htmlContentIndex = this.htmlContentIndexArray[0]; - } - } - - open() { - this.isVisible = true; - } - - hide() { - if (this.htmlContentIndexArray.length > 1) { - this.isTopicView = true; - } - this.isVisible = false; - } - - showContent(htmlContentIndex: ContextualHelpIndex) { - this.isTopicView = false; - this.htmlContentIndex = htmlContentIndex; - } - navigateBack() { - this.isTopicView = true; - } - - ngOnDestroy() { - this.service.remove(this.id); - } -} diff --git a/tkg/web/src/app/shared/contextual-help/contextual-help.service.spec.ts b/tkg/web/src/app/shared/contextual-help/contextual-help.service.spec.ts deleted file mode 100644 index 28271b1026..0000000000 --- a/tkg/web/src/app/shared/contextual-help/contextual-help.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ContextualHelpService } from './contextual-help.service'; - -describe('ContexutalHelpService', () => { - let service: ContextualHelpService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(ContextualHelpService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/shared/contextual-help/contextual-help.service.ts b/tkg/web/src/app/shared/contextual-help/contextual-help.service.ts deleted file mode 100644 index 7dfe653ec5..0000000000 --- a/tkg/web/src/app/shared/contextual-help/contextual-help.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root' -}) -export class ContextualHelpService { - - private componentList: any = []; - constructor() { } - - add(component: any) { - this.componentList.push(component); - } - - remove(id: string) { - this.componentList = this.componentList.filter(component => component.id !== id); - } - - open(id: string) { - this.componentList.find(component => component.id === id).open(); - } - - close(id: string) { - this.componentList.find(component => component.id === id).close(); - } -} diff --git a/tkg/web/src/app/shared/directives/a11y-tooltip-trigger.directive.ts b/tkg/web/src/app/shared/directives/a11y-tooltip-trigger.directive.ts deleted file mode 100644 index dcd03142c3..0000000000 --- a/tkg/web/src/app/shared/directives/a11y-tooltip-trigger.directive.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Directive } from '@angular/core'; -import { ClrTooltipTrigger } from '@clr/angular'; -​ -/** - * Adds "role" and "aria-haspopup" attributes to Clarity clr-icon tag - */ -@Directive({ - selector: '[a11yTooltipTrigger]', - host: { - tabindex: '0', - 'aria-label': 'tooltip', - '[class.tooltip-trigger]': 'true', - '[attr.aria-describedby]': 'ariaDescribedBy', - '[attr.role]': '"tooltip"', - '[attr.aria-haspopup]': '"true"', - '[attr.aria-label]': '"tooltip"' - } -}) -export class A11yTooltipTriggerDirective extends ClrTooltipTrigger { } diff --git a/tkg/web/src/app/shared/directives/feature-flag.directive.ts b/tkg/web/src/app/shared/directives/feature-flag.directive.ts deleted file mode 100644 index 1cbd6d125d..0000000000 --- a/tkg/web/src/app/shared/directives/feature-flag.directive.ts +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Angular imports - */ -import { Directive, Input, TemplateRef, ViewContainerRef, OnInit } from '@angular/core'; -import { BasicSubscriber } from '../abstracts/basic-subscriber'; -import AppServices from "../service/appServices"; - -/** - * App imports - */ -@Directive({ - selector: '[featureToggle]' -}) -/** - * @class FeatureToggleDirective - * directive used for enabling or disabling features by applying directive to - * HTML markup tags. - * @usage - * FeatureFlagService: - * { - * features: { - * testFeatureA: true, - * testFeatureB: false - * } - * } - * - * Feature Toggle Attribute: - *
-> Feature is enabled - *
-> Feature is disabled - */ -export class FeatureToggleDirective extends BasicSubscriber implements OnInit { - @Input() featureToggle: string; - separator = '.'; // used for separating the starting plugin name from the feature - private negation: boolean; - - constructor( - private templateRef: TemplateRef, - private viewContainer: ViewContainerRef - ) { - super(); - } - - ngOnInit() { - // caller may use negation by placing '!' as first char; this inverts the display logic - if (this.usesNegation()) { - this.negation = true; - this.featureToggle = this.featureToggle.substr(1); - } - if (this.shouldDisplay()) { - this.viewContainer.createEmbeddedView(this.templateRef); - } else { - this.viewContainer.clear(); - } - } - - private usesNegation() { - return this.featureToggle.length > 0 && this.featureToggle.charAt(0) === '!'; - } - - private shouldDisplay() { - if (this.featureToggle.length === 0) { - console.log('WARNING: Empty feature toggle encountered (recommend remove enclosed elements)'); - return false; - } - if (this.featureToggle === '*') { - console.log('WARNING: Always-on feature toggle encountered (recommend remove toggle directive)'); - return true; - } - return this.negation ? !this.isFeatureEnabled() : this.isFeatureEnabled(); - } - - /** - * @method isFeatureEnabled - * helper method to retrieve feature flag - * Returns true if either the global CLI or the specific plugin set 'enabled' for the feature - * @returns {any} - */ - isFeatureEnabled() { - if (this.featureToggle == null) { - return false; - } - let pluginName, featureName; - const paramArray = this.featureToggle.split(this.separator); - if (paramArray.length !== 2) { - const errMsg = "WARNING: bad parameter encountered in featureToggle directive: " + this.featureToggle + - " should contain exactly one separator ('" + this.separator + "')" - console.log(errMsg); - return false; - } - pluginName = paramArray[0]; - featureName = paramArray[1]; - return AppServices.appDataService.isPluginFeatureActivated(pluginName, featureName); - } -} diff --git a/tkg/web/src/app/shared/directives/keyboard-listener.directive.ts b/tkg/web/src/app/shared/directives/keyboard-listener.directive.ts deleted file mode 100644 index 21d7ee2223..0000000000 --- a/tkg/web/src/app/shared/directives/keyboard-listener.directive.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Directive, ElementRef, HostListener } from '@angular/core'; - -@Directive({ - selector: '[keyboardListener]' -}) -export class KeyboardListenerDirective { - element: HTMLElement; - constructor(el: ElementRef) { - this.element = el.nativeElement; - } - - @HostListener('keydown.enter', ['$event']) onKeyboardEnter(event: KeyboardEvent) { - this.element.click(); - } - @HostListener('keydown.space', ['$event']) onKeyboardSpace(event: KeyboardEvent) { - this.element.click(); - } -} diff --git a/tkg/web/src/app/shared/directives/remove-aria-labelledBy.directive.ts b/tkg/web/src/app/shared/directives/remove-aria-labelledBy.directive.ts deleted file mode 100644 index 39cd3c381e..0000000000 --- a/tkg/web/src/app/shared/directives/remove-aria-labelledBy.directive.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Directive, ElementRef, AfterViewInit } from '@angular/core'; - -@Directive({ - selector: '[removeAriaLabelledBy]' -}) -export class RemoveAriaLabelledByDirective implements AfterViewInit { - private panel: HTMLElement; - - constructor(el: ElementRef) { - this.panel = el.nativeElement; - } - ngAfterViewInit(): void { - this.panel.querySelector('[role="region"]').removeAttribute('aria-labelledby'); - } -} diff --git a/tkg/web/src/app/shared/service/Messenger.spec.ts b/tkg/web/src/app/shared/service/Messenger.spec.ts deleted file mode 100644 index acaea8a91e..0000000000 --- a/tkg/web/src/app/shared/service/Messenger.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { TestBed, async } from '@angular/core/testing'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { HttpClientModule } from '@angular/common/http'; - -import { Messenger } from './Messenger'; - -describe('Messenger', () => { - let service: Messenger; - - beforeEach(() => TestBed.configureTestingModule({ - imports: [ - HttpClientTestingModule - ], - providers: [ - Messenger - ] - })); - - beforeEach(() => { - service = TestBed.get(Messenger); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/shared/service/Messenger.ts b/tkg/web/src/app/shared/service/Messenger.ts deleted file mode 100644 index 9ce314060f..0000000000 --- a/tkg/web/src/app/shared/service/Messenger.ts +++ /dev/null @@ -1,151 +0,0 @@ -// Angular imports -import { Injectable } from '@angular/core'; -// Third party imports -import { ReplaySubject, Subject } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; - -/** - * Types of Event being supported by this broker - */ - -export enum TanzuEventType { - // vSphere events - VSPHERE_CONTROL_PLANE_ENDPOINT_PROVIDER_CHANGED, - VSPHERE_DATACENTER_CHANGED, - DATACENTER_RESET, - VSPHERE_CONFIG_FILE_IMPORTED, - VSPHERE_CONFIG_FILE_IMPORT_ERROR, - VSPHERE_GET_COMPUTE_RESOURCE, - VSPHERE_GET_DATA_STORES, - VSPHERE_GET_OS_IMAGES, - VSPHERE_GET_RESOURCE_POOLS, - VSPHERE_GET_VM_NETWORKS, - VSPHERE_GET_VM_FOLDERS, - VSPHERE_IP_FAMILY_CHANGE, - VSPHERE_VC_AUTHENTICATED, - - // AWS events - AWS_AIRGAPPED_VPC_CHANGE, - AWS_CONFIG_FILE_IMPORTED, - AWS_CONFIG_FILE_IMPORT_ERROR, - AWS_GET_EXISTING_VPCS, - AWS_GET_AVAILABILITY_ZONES, - AWS_GET_SUBNETS, - AWS_GET_NODE_TYPES, - AWS_GET_OS_IMAGES, - AWS_REGION_CHANGED, - AWS_VPC_TYPE_CHANGED, - AWS_VPC_CHANGED, - - // AZURE events - AZURE_CONFIG_FILE_IMPORTED, - AZURE_CONFIG_FILE_IMPORT_ERROR, - AZURE_GET_RESOURCE_GROUPS, - AZURE_GET_VNETS, - AZURE_GET_INSTANCE_TYPES, - AZURE_GET_OS_IMAGES, - AZURE_REGION_CHANGED, - AZURE_RESOURCEGROUP_CHANGED, - - // Docker events - DOCKER_CONFIG_FILE_IMPORTED, - DOCKER_CONFIG_FILE_IMPORT_ERROR, - - // Common provider events - NETWORK_STEP_GET_NO_PROXY_INFO, - - // CLI - CLI_CHANGED, - - // APP - BRANDING_CHANGED, - STEP_COMPLETED, - STEP_STARTED, - STEP_DESCRIPTION_CHANGE, -} - -// The payload structure expected on a STEP_DESCRIPTION_CHANGE event -export interface StepDescriptionChangePayload { - wizard: string, - step: string, - description: string, -} -// The payload structure expected on a STEP_COMPLETED event -export interface StepCompletedPayload { - wizard: string, - step: string, -} -// The payload structure expected on a STEP_STARTED event -export interface StepStartedPayload { - wizard: string, - step: string, -} - -/** - * Event type definition - */ -export interface TanzuEvent { - type: TanzuEventType, - payload?: PAYLOAD; -} - -/** - * An extremely light-weight message broker implementation. The purpose of - * this class is to replace Angular's @Input() and @Output() wiring - * between components which can be cumbersome and verbose in cases - * where a good amount of communication is needed. - */ -@Injectable({ - providedIn: 'root' -}) - export class Messenger { - subjects = new Map>>(); - - subscribe(eventType: TanzuEventType, onNext: (event: TanzuEvent) => void, unsubscriber?: Subject) { - if (unsubscriber) { - this.getSubject(eventType) - .pipe(takeUntil(unsubscriber)) - .subscribe(onNext); - } else { - this.getSubject(eventType).subscribe(onNext); - } - } - - /** - * Publish an event to all its subscribers - * @param event the Event to be published - */ - publish(event: TanzuEvent) { - this.getSubject(event.type).next(event); - } - - /** - * Clears specified event from the Messenger event map. Once this is done - * subscribers will no longer receive this event until the event is re-dispatched. - * @param eventType the event to delete from the Messenger buffer - */ - clearEvent(eventType: TanzuEventType) { - this.subjects.delete(eventType); - } - - /** - * Reset/Clear the Messenger ReplaySubject event map in the rare use cases where - * we want to force ALL events to be purged from the buffer. - * This should be used only when necessary. - */ - reset() { - this.subjects = new Map>>(); - } - /** - * Return the subject based on event type - * @param eventType event type to get the subject for - */ - private getSubject(eventType: TanzuEventType) { - let subject = this.subjects.get(eventType); - if (!subject) { - subject = new ReplaySubject>(1); - this.subjects.set(eventType, subject); - } - return subject; - } -} diff --git a/tkg/web/src/app/shared/service/app-data.service.spec.ts b/tkg/web/src/app/shared/service/app-data.service.spec.ts deleted file mode 100644 index d78a4e77ab..0000000000 --- a/tkg/web/src/app/shared/service/app-data.service.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { TestBed, async } from '@angular/core/testing'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { HttpClientModule } from '@angular/common/http'; - -import { AppDataService } from 'src/app/shared/service/app-data.service'; -import { APIClient } from '../../swagger/api-client.service'; - -describe('AppDataService', () => { - let service: AppDataService; - - beforeEach(() => TestBed.configureTestingModule({ - imports: [ - HttpClientTestingModule - ], - providers: [ - APIClient - ] - })); - - beforeEach(() => { - service = TestBed.get(AppDataService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); - - it('should provide getter/setter for providerType', async(() => { - const provider = service.getProviderType(); - - service.setProviderType('aws'); - - provider.subscribe(prov => { - expect(prov).toBe('aws'); - }) - })); - - it('should provide getter/setter for hasPacificCluster', async(() => { - const isPacific = service.getIsProjPacific(); - - service.setIsProjPacific(true); - - isPacific.subscribe(pacific => { - expect(pacific).toBe(true); - }) - })); - - it('should provide getter/setter for tkrVersion', async(() => { - const tkrVersion = service.getTkrVersion(); - - service.setTkrVersion('1.17.3'); - - tkrVersion.subscribe(ver => { - expect(ver).toBe('1.17.3'); - }) - })); -}); diff --git a/tkg/web/src/app/shared/service/app-data.service.ts b/tkg/web/src/app/shared/service/app-data.service.ts deleted file mode 100644 index 730a2b8fe8..0000000000 --- a/tkg/web/src/app/shared/service/app-data.service.ts +++ /dev/null @@ -1,100 +0,0 @@ -// Angular imports -import { Injectable } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; -import { Features } from "../../swagger/models"; -import { FeatureFlags, managementClusterPlugin } from '../../views/landing/wizard/shared/constants/wizard.constants'; - -@Injectable({ - providedIn: 'root' -}) -export class AppDataService { - - private providerType = new BehaviorSubject(null); - private hasPacificCluster = new BehaviorSubject(false); - private tkrVersion = new BehaviorSubject(null); - private featureFlags = new BehaviorSubject(null); - private vsphereVersion = new BehaviorSubject(null); - - constructor() { - this.providerType.asObservable().subscribe((data) => { - if (data) { - console.log("TKG Kickstart UI launched with provider type >>>>> " + data); - } - }); - } - - setProviderType(provider: string) { - this.providerType.next(provider); - } - - getProviderType() { - return this.providerType; - } - - setIsProjPacific(flag: boolean) { - this.hasPacificCluster.next(flag); - } - - getIsProjPacific() { - return this.hasPacificCluster; - } - - setTkrVersion(version: string) { - this.tkrVersion.next(version); - } - - getTkrVersion() { - return this.tkrVersion; - } - - setFeatureFlags(features: Features) { - this.featureFlags.next(features); - } - - setVsphereVersion(version: string) { - this.vsphereVersion.next(version); - } - - getVsphereVersion() { - return this.vsphereVersion; - } - - isPluginFeatureActivated(plugin: string, feature: string) { - return this.isValueTrue(this.getPluginFeature(plugin, feature)); - } - - getPluginFeature(plugin: string, feature: string) { - if (this.featureFlags == null || this.featureFlags.value == null) { - return null; - } - if (this.featureFlags.value[plugin] == null || this.featureFlags.value[plugin][feature] == null) { - return null; - } - return this.featureFlags.value[plugin][feature]; - } - - isValueTrue(value: string) { - return value !== null && JSON.parse(value); - } - - // returns true if the standalone-cluster-mode feature flag is activated. This is a convenience method - // to avoid having the string parameters scattered throughout the code - isModeClusterStandalone() { - return this.isPluginFeatureActivated(managementClusterPlugin, FeatureFlags.STANDALONE_CLUSTER); - } - - decodeBase64(source: string): string { - let encodedString = source; - const encodedPrefix = ' - this.setBrandingByEdition(brandingEdition) - )) - .subscribe((data) => { - brandingEdition = data; - }, (err) => { - console.log(`Unable to retrieve edition.`) - }); - } - - /** - * @method setBrandingByEdition - * Helper method used to set branding content in Messenger payload depending on which edition is detected. - * Dispatches 'BRANDING_CHANGED' message with branding data as payload. - * @param edition - Optional parameter. 'tce' to retrieve tce branding; otherwise retrieves - * default branding. - */ - private setBrandingByEdition(edition?: string): void { - let brandingPayload: EditionData = brandingDefault; - - if (edition && edition === AppEdition.TCE) { - console.log('Setting branding based on edition: ' + AppEdition.TCE); - brandingPayload = brandingTce; - } - if (AppServices.appDataService.isModeClusterStandalone()) { - console.log('Due to standalone cluster mode, setting branding to edition: ' + AppEdition.TCE); - brandingPayload = brandingTce; - brandingPayload.clusterTypeDescriptor = brandingStandalone.clusterTypeDescriptor; - brandingPayload.branding.landingPage.intro = brandingStandalone.branding.landingPage.intro; - } - - AppServices.messenger.publish({ - type: TanzuEventType.BRANDING_CHANGED, - payload: brandingPayload - }); - } -} diff --git a/tkg/web/src/app/shared/service/data-service-registrar.ts b/tkg/web/src/app/shared/service/data-service-registrar.ts deleted file mode 100644 index f38c93c432..0000000000 --- a/tkg/web/src/app/shared/service/data-service-registrar.ts +++ /dev/null @@ -1,154 +0,0 @@ -// Third party imports -import { takeUntil } from 'rxjs/operators'; - -// App imports -import AppServices from './appServices'; -import { Observable, ReplaySubject } from 'rxjs'; -import { StepFormDirective } from '../../views/landing/wizard/shared/step-form/step-form'; -import { TanzuEventType } from './Messenger'; - -// The intention of this class is to allow: -// REGISTER of a TanzuEventType with a "fetcher" that will get data from the backend when that event is broadcast. This is typically -// called by wizards to establish which backend calls will be used for which events. -// SUBSCRIBE to a TanzuEventType with a data-handler that will receive the data from that event (when it arrives), and -// an error-handler that will properly display any error messages. (This class provides two standard error handlers for steps, to avoid -// every step writing its own duplicate error handler, since almost all of them do exactly the same thing.) This is typically used -// by steps that need to handle data when it arrives from the backend. -// Secondarily, we provide a convenience TRIGGER method to publish an event to the AppServices.messenger, and CLEAR to send out an empty -// array in an event's associated data stream (to clear previous values) -// The point is to isolate all the boilerplate code into this class, so that registrants and subscribers need the least -// amount of code to do their work. -// NOTE: An event must be registered BEFORE anyone can subscribe to it. -// NOTE: This class is not intended to help a situation where a step desires simply to make an API call to the back end and then -// use the results. This class is more useful in the app-wide pattern where an event is triggered which should retrieve data, and that data -// may be consumed by any subscriber (without any need for more context on why/how it was requested). -interface DataServiceRegistrarEntry { - fetcher: (data: any) => Observable, - staticError?: string, - dataStream: ReplaySubject, - errorStream: ReplaySubject, -} - -export default class DataServiceRegistrar { - private entries: Map> = new Map>(); - - // convenience wrapper to publish triggering events - trigger(eventTypes: TanzuEventType[], payload?: any) { - eventTypes.forEach(eventType => { AppServices.messenger.publish({type: eventType, payload: payload}) }); - } - - // broadcast an empty array on the data stream to clear previous values - clear(eventType: TanzuEventType) { - const serviceBrokerEntry: DataServiceRegistrarEntry = this.getEntry(eventType); - if (serviceBrokerEntry) { - serviceBrokerEntry.dataStream.next([]); - } - } - - // register() is called by those providing services. This is typically done by wizards setting up how - // to respond to data-request events, i.e. linking data-request events to API calls to the backend. - // If the event has already been registered, the request will be ignored (with a console warning) - register(eventType: TanzuEventType, fetcher: (data: any) => Observable, staticError?: string) { - if (this.entries[eventType]) { - console.warn('service broker ignores duplicate registration of event ' + TanzuEventType[eventType]); - return; - } - this.entries[eventType] = { - fetcher: fetcher, - staticError: staticError, - errorStream: new ReplaySubject(), - dataStream: new ReplaySubject(), - }; - // we subscribe to the messenger to ensure that whenever the target event is broadcast, we go fetch the data - AppServices.messenger.subscribe(eventType, (event) => this.fetchData(eventType, event.payload ? event.payload : {})); - } - - // subscribe() is called by those consuming data services. This is typically a step that relies on whatever data - // is returned from the backend (for example, giving the user a choice of networks, regions, datacenters, etc) - subscribe(eventType: TanzuEventType, onDataReceived: (data: OBJ[]) => void, onError: (error: string) => void): boolean { - const serviceBrokerEntry: DataServiceRegistrarEntry = this.getEntry(eventType); - if (!serviceBrokerEntry) { - console.warn('DataServiceRegistrar ignored attempt to subscribe to unregistered event: ' + eventType); - return false; - } - serviceBrokerEntry.dataStream.subscribe(onDataReceived); - serviceBrokerEntry.errorStream.subscribe(onError); - return true; - } - - // This default error handler sets (or clears) the step's errorNotification field. - private defaultStepErrorHandler(step: StepFormDirective): (error: string) => void { - return (error: string) => { - step.errorNotification = (error) ? error : ''; - }; - } - - // This is a convenience method for steps wanting to call with an error handler that appends to existing error messages. - // When setting the error, it ADDS to any existing error, rather than overwriting it. - // This is useful if the step expects to make several service calls at once. - public appendingStepErrorHandler(step: StepFormDirective): (error: string) => void { - return (error: string) => { - if (!error) { - step.errorNotification = ''; - } else if (! step.errorNotification.endsWith(error)) { // don't append same error message twice in a row - if (step.errorNotification) { - step.errorNotification = step.errorNotification + ' '; - } - step.errorNotification = step.errorNotification + error; - } - }; - } - - // convenience method to allow steps to register with a default error handler (namely, setting their errorNotification field), - // as well as unsubscribing to the data stream with the ngOnDestroy event - stepSubscribe(step: StepFormDirective, eventType: TanzuEventType, - onDataReceived: (data: OBJ[]) => void, onError?: (error: string) => void): boolean { - const serviceBrokerEntry: DataServiceRegistrarEntry = this.getEntry(eventType); - if (!serviceBrokerEntry) { - console.error('Event ' + TanzuEventType[eventType] + ' was not registered with the service broker before ' + step.formName + - ' tried to subscribe to it.'); - return false; - } - if (!onError) { - onError = this.defaultStepErrorHandler(step); - } - serviceBrokerEntry.dataStream - .pipe(takeUntil(step.unsubscribeOnDestroy)) - .subscribe(onDataReceived); - serviceBrokerEntry.errorStream.subscribe(onError); - return true; - } - - // getEntry is protected so that the test extension subclass can access it - protected getEntry(eventType: TanzuEventType): DataServiceRegistrarEntry { - const result = this.entries[eventType]; - if (result) { - return result; - } - console.error('DataServiceRegistrar tried to get entry for event ' + TanzuEventType[eventType] + - ' but no such event has been registered'); - return null; - } - - private fetchData(eventType: TanzuEventType, fetcherPayload: any) { - const entry = this.getEntry(eventType); - entry.fetcher(fetcherPayload).subscribe( - (data => { - // we received data, so broadcast it to anyone listening (and clear any previous errors) - entry.dataStream.next(data); - entry.errorStream.next(''); - }), - (err => { - // we received an error, so broadcast it to anyone listening (and clear any previous data) - const errMsg = err.error && err.error.message ? err.error.message : null; - const error = errMsg || err.message || JSON.stringify(err); - let message = (entry.staticError ? entry.staticError + ' ' : '') + (error ? error : ''); - if (!message) { - message = 'Service error encountered'; - } - entry.errorStream.next(message); - entry.dataStream.next([]); - }) - ) - } -} diff --git a/tkg/web/src/app/shared/service/export.service.ts b/tkg/web/src/app/shared/service/export.service.ts deleted file mode 100644 index f85e66e71a..0000000000 --- a/tkg/web/src/app/shared/service/export.service.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {Injectable} from "@angular/core"; -import {Observable} from "rxjs"; -import {take} from "rxjs/operators"; -import FileSaver from 'file-saver'; - -@Injectable({ - providedIn: 'root' -}) -export class ExportService { - export(backendResponse: Observable, - onFailure: (nameFile: string) => void) { - backendResponse.pipe(take(1)).subscribe( - ((data) => { - const blob = new Blob([data], {type: "text/plain;charset=utf-8"}); - FileSaver.saveAs(blob, 'config.yaml'); - }), - ((err) => { - onFailure('Error encountered while creating export file: ' + err.toString()); - }) - ) - } -} diff --git a/tkg/web/src/app/shared/service/import.service.ts b/tkg/web/src/app/shared/service/import.service.ts deleted file mode 100644 index 4922a264ee..0000000000 --- a/tkg/web/src/app/shared/service/import.service.ts +++ /dev/null @@ -1,63 +0,0 @@ -// Angular imports -import {Injectable} from "@angular/core"; -// Third party imports -import {Observable} from "rxjs"; -import {take} from "rxjs/operators"; -// App imports -import AppServices from "./appServices"; -import { TanzuEventType } from "./Messenger"; - -export interface ImportParams { - eventSuccess: TanzuEventType, - eventFailure: TanzuEventType, - file: File, - validator: (nameFile: string, contents: string) => boolean, - backend: (contents: string ) => Observable, - onSuccess: (event: TanzuEventType, nameFile: string, payload: ClusterParamsType) => void, - onFailure: (event: TanzuEventType, nameFile: string, err: any) => void -} -@Injectable({ - providedIn: 'root' -}) -export class ImportService { - import( params: ImportParams ) { - const service = this; // capture service's 'this' in the outside context to use inside the reader function - const reader = new FileReader(); - reader.onloadend = function() { - service.doImport(reader.result, params); - }; - reader.readAsText(params.file); - } - - private doImport(argContents: string | ArrayBuffer, params: ImportParams) { - const contents = '' + argContents; - if (!params.validator(params.file.name, contents)) { - return; - } - - params.backend(contents).pipe(take(1)).subscribe( - ((payload) => { - params.onSuccess(params.eventSuccess, params.file.name, payload); - }), - ((err) => { - params.onFailure(params.eventFailure, params.file.name, err); - }) - ); - } - - // convenience method for wizards handling an import failure - publishImportFailure(event: TanzuEventType, nameFile: string, err: any) { - AppServices.messenger.publish({ - type: event, - payload: 'Error encountered while importing file ' + nameFile + ': ' + err.toString() - }); - } - - // convenience method for wizards handling an import success - publishImportSuccess(event: TanzuEventType, nameFile: string) { - AppServices.messenger.publish({ - type: event, - payload: 'Data imported from file ' + nameFile, - }); - } -} diff --git a/tkg/web/src/app/shared/service/user-data-form.service.ts b/tkg/web/src/app/shared/service/user-data-form.service.ts deleted file mode 100644 index e359635fe3..0000000000 --- a/tkg/web/src/app/shared/service/user-data-form.service.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { - BackingObjectMap, - FieldMapping, - StepMapping -} from '../../views/landing/wizard/shared/field-mapping/FieldMapping'; -import { AbstractControl, FormGroup } from '@angular/forms'; -import AppServices from './appServices'; -import { UserDataIdentifier, UserDataService } from './user-data.service'; -import { FormUtils } from '../../views/landing/wizard/shared/utils/form-utils'; - -export class UserDataFormService { - storeFromMapping(wizard, step: string, stepMapping: StepMapping, formGroup: FormGroup) { - AppServices.fieldMapUtilities.getActiveFieldMappings(stepMapping).forEach(fieldMapping => { - if (AppServices.fieldMapUtilities.shouldAutoSave(fieldMapping)) { - this.storeFromFieldMapping(wizard, step, fieldMapping, formGroup); - } - }); - AppServices.userDataService.updateWizardTimestamp(wizard); - } - - private storeFromFieldMapping(wizard, step: string, fieldMapping: FieldMapping, formGroup: FormGroup) { - const identifier: UserDataIdentifier = {wizard, step, field: fieldMapping.name}; - if (fieldMapping.hasNoDomControl) { - this.storeFieldWithNoDomControl(wizard, step, fieldMapping); - } else if (fieldMapping.isBoolean) { - this.storeBooleanField(identifier, formGroup); - } else if (fieldMapping.mask) { - this.storeMaskField(identifier, formGroup); - } else if (fieldMapping.isMap) { - this.storeMapField(identifier, formGroup); - } else if (fieldMapping.backingObject) { - this.storeBackingObjectField(identifier, formGroup, fieldMapping.backingObject) - } else { - this.storeInputField(identifier, formGroup, fieldMapping.displayFunction); - } - } - - private storeFieldWithNoDomControl(wizard, step: string, fieldMapping: FieldMapping) { - if (!fieldMapping.retriever) { - console.error('field ' + fieldMapping.name + ' has no DOM control, but no retriever provided'); - return; - } - const value = fieldMapping.retriever(null); - const identifier = {wizard, step, field: fieldMapping.name}; - if (fieldMapping.isBoolean) { - AppServices.userDataService.storeBoolean(identifier, value); - } else if (fieldMapping.isMap) { - AppServices.userDataService.storeMap(identifier, value); - } else { - AppServices.userDataService.store(identifier, {display: value, value}); - } - } - - // convenience methods - storeInputField(identifier: UserDataIdentifier, formGroup: FormGroup, displayFunction?: (f) => string): boolean { - const control = this.getFormControl(identifier, formGroup); - if (!control) { - return false; - } - const displayValue = displayFunction ? displayFunction(control.value) : control.value - AppServices.userDataService.store(identifier, {display: displayValue, value: control.value}); - return true; - } - - storeBooleanField(identifier: UserDataIdentifier, formGroup: FormGroup): boolean { - const control = this.getFormControl(identifier, formGroup); - if (!control) { - return false; - } - AppServices.userDataService.storeBoolean(identifier, control.value); - return true; - } - - buildForm(formGroup: FormGroup, wizard, step: string, stepMapping: StepMapping) { - AppServices.fieldMapUtilities.getActiveFieldMappings(stepMapping).forEach(fieldMapping => { - if (this.shouldBuildField(fieldMapping)) { - this.buildFormField(formGroup, wizard, step, fieldMapping); - } else if (fieldMapping.hasNoDomControl) { - if (fieldMapping.restorer) { - const value = AppServices.userDataService.retrieveStoredValue(wizard, step, fieldMapping); - fieldMapping.restorer(value); - } else { - console.log('field ' + fieldMapping.name + ' has no DOM control, but no restorer was provided'); - } - } - }); - } - - restoreForm(wizard, step: string, formGroup: FormGroup, stepMapping: StepMapping) { - AppServices.fieldMapUtilities.getFieldMappingsToRestore(stepMapping).forEach(fieldMapping => { - const identifier = {wizard, step, field: fieldMapping.name}; - this.restoreField(identifier, fieldMapping, formGroup); - - // Re-store the masked field value, so that if there WAS a value for this masked field in local storage, - // it will be erased - if (fieldMapping.mask) { - this.storeMaskField(identifier, formGroup); - } - }); - // Note: we set the values on the primary trigger fields AFTER all the "regular" fields are restored because the - // handler for the trigger field change may make use the values of the other fields - AppServices.fieldMapUtilities.getPrimaryTriggerMappingsToRestore(stepMapping).forEach(fieldMapping => { - const identifier = {wizard, step, field: fieldMapping.name}; - this.restoreField(identifier, fieldMapping, formGroup); - }) - } - - private buildFormField(formGroup: FormGroup, wizard, step: string, fieldMapping: FieldMapping) { - AppServices.fieldMapUtilities.validateFieldMapping(step, fieldMapping); - const initialValue = AppServices.fieldMapUtilities.getInitialValue(wizard, step, fieldMapping); - FormUtils.addDynamicControl(formGroup, initialValue, fieldMapping); - } - - private shouldBuildField(fieldMapping: FieldMapping) { - return !fieldMapping.displayOnly && !fieldMapping.hasNoDomControl && - AppServices.fieldMapUtilities.passesFeatureFlagFilter(fieldMapping); - } - - restoreField(identifier: UserDataIdentifier, fieldMapping: FieldMapping, formGroup: FormGroup, values?: any[], - options?: { onlySelf?: boolean; emitEvent?: boolean }) { - let valueToUse; - if (values && values.length === 1) { - valueToUse = values[0]; - } else { - const storedValue = AppServices.userDataService.retrieveStoredValue(identifier.wizard, identifier.step, fieldMapping); - if (storedValue !== undefined && storedValue !== null) { - valueToUse = storedValue; - } - } - if (valueToUse === undefined || valueToUse === null) { - return; - } - - if (fieldMapping.restorer) { - fieldMapping.restorer(valueToUse); - return; - } - - const control = formGroup.get(identifier.field); - if (!control) { - console.error('restoreField(): no DOM control: "' + identifier.wizard + '.' + identifier.step + '.' + identifier.field + '"'); - return; - } - - // This setTimeout() is a hack to avoid timing issues in the DOM - setTimeout(() => { - control.setValue(valueToUse, options); - }); - } - - // storeBackingObject expects to encounter an OBJECT backing the listbox and will use fieldDisplay of that object for the display - // and fieldValue for the value. If instead the caller has a simple listbox with strings backing it, call saveInputField instead - private storeBackingObjectField(identifier: UserDataIdentifier, formGroup: FormGroup, backingObjectMap: BackingObjectMap): boolean { - const selectedObj = this.getFormObject(identifier, formGroup); - return AppServices.userDataService.storeBackingObject(identifier, selectedObj, backingObjectMap); - } - - private storeMaskField(identifier: UserDataIdentifier, formGroup: FormGroup): boolean { - const control = this.getFormControl(identifier, formGroup); - if (!control) { - return false; - } - AppServices.userDataService.store(identifier, {display: control.value ? UserDataService.MASK : '', value: ''}); - return true; - } - - private storeMapField(identifier: UserDataIdentifier, formGroup: FormGroup): boolean { - const control = this.getFormControl(identifier, formGroup); - if (!control) { - return false; - } - AppServices.userDataService.storeMap(identifier, control.value); - return true; - } - - private getFormObject(identifier: UserDataIdentifier, formGroup: FormGroup) { - return formGroup.value[identifier.field]; - } - - private getFormControl(identifier: UserDataIdentifier, formGroup: FormGroup): AbstractControl { - const control = formGroup.controls[identifier.field]; - if (!control) { - console.error('UserDataService.saveSimpleFormField was passed a form group that did not have field ' + identifier.field + - '. identifier=' + JSON.stringify(identifier)); - } - return control; - } -} diff --git a/tkg/web/src/app/shared/service/user-data.service.ts b/tkg/web/src/app/shared/service/user-data.service.ts deleted file mode 100644 index 92db525cdd..0000000000 --- a/tkg/web/src/app/shared/service/user-data.service.ts +++ /dev/null @@ -1,277 +0,0 @@ -// App imports -import { BackingObjectMap, FieldMapping, StepMapping } from '../../views/landing/wizard/shared/field-mapping/FieldMapping'; -import { PersistentStore } from '../../views/landing/wizard/shared/PersistentStore'; - -export interface UserDataEntry { - display: string, // what the user should see if this is displayed on a page - value: any, // actual value -} -export interface UserDataIdentifier { - wizard: string, // name of the wizard that the data is from - step: string, // name of the step that the data is from - field: string, // name of field that the data is from -} -// UserDataWizard should only be used by the confirmation page; all steps should use convenience methods -export interface UserDataWizard { - wizard: string, - steps: Map, - displayOrder?: string[], - titles?: Map, - descriptions?: Map, - lastUpdate?: number, -} -// UserDataStep should only be used by the confirmation page; all steps should use convenience methods -export interface UserDataStep { - displayOrder?: string[], - fields: Map, - labels?: Map, -} - -const DATA_CONSIDERED_OLD_AFTER_MINUTES = 30; - -export class UserDataService { - static readonly MASK = '********'; - - store(identifier: UserDataIdentifier, data: UserDataEntry) { - const wizardEntry = this.ensureUserDataIdentifier(identifier); - this.setUserDataEntry(wizardEntry, identifier, data); - this.storeWizardEntry(wizardEntry); - } - - // storeBackingObject expects to encounter an OBJECT backing the listbox and will use fieldDisplay of that object for the display - // and fieldValue for the value. If instead the caller has a simple listbox with strings backing it, call saveInputField instead - storeBackingObject(identifier: UserDataIdentifier, backingObject: any, backingObjectMap: BackingObjectMap): boolean { - let display = ''; - let value = ''; - // Note: selectedObj === null is a legitimate case: the user hasn't selected an object yet - if (backingObject) { - display = backingObject[backingObjectMap.displayField]; - value = backingObject[backingObjectMap.valueField]; - } - this.store(identifier, { display, value }); - return true; - } - - storeBoolean(identifier: UserDataIdentifier, value: boolean): boolean { - this.store(identifier, { display: value ? 'yes' : 'no', value }); - return true; - } - - storeMap(identifier: UserDataIdentifier, map: Map) { - const display = this.mapToDisplayString(map); - // TODO: find a way to store the map directly: const value = map; - const value = display; - this.store(identifier, { display, value }); - } - - storeStepDisplayOrder(wizard, step: string, displayOrder: string[]) { - const wizardEntry = this.ensureWizardEntry(wizard); - this.ensureStepEntry(wizardEntry, step); - wizardEntry.steps[step].displayOrder = displayOrder; - this.storeWizardEntry(wizardEntry); - } - - storeStepLabels(wizard, step: string, labels: Map) { - const wizardEntry = this.ensureWizardEntry(wizard); - this.ensureStepEntry(wizardEntry, step); - wizardEntry.steps[step].labels = labels; - this.storeWizardEntry(wizardEntry); - } - - storeWizardDescriptions(wizard: string, descriptions: Map) { - const wizardEntry = this.ensureWizardEntry(wizard); - wizardEntry.descriptions = descriptions; - this.storeWizardEntry(wizardEntry); - } - - storeWizardDisplayOrder(wizard: string, displayOrder: string[]) { - const wizardEntry = this.ensureWizardEntry(wizard); - wizardEntry.displayOrder = displayOrder; - this.storeWizardEntry(wizardEntry); - } - - storeWizardTitles(wizard: string, titles: Map) { - const wizardEntry = this.ensureWizardEntry(wizard); - wizardEntry.titles = titles; - this.storeWizardEntry(wizardEntry); - } - - private retrieve(identifier: UserDataIdentifier): UserDataEntry { - const wizardEntry: UserDataWizard = this.getWizardEntry(identifier.wizard); - if (!wizardEntry || !wizardEntry.steps || !wizardEntry.steps[identifier.step] || !wizardEntry.steps[identifier.step].fields) { - return null; - } - return wizardEntry.steps[identifier.step].fields[identifier.field]; - } - - private retrieveMap(identifier: UserDataIdentifier): Map { - const storedEntry = this.retrieve(identifier); - if (!storedEntry || !storedEntry.value) { - return new Map(); - } - return this.stringToMap(storedEntry.value); - } - - retrieveStoredValue(wizard, step: string, fieldMapping: FieldMapping): any { - if (!fieldMapping) { - console.error('trying to retrieveStoredValue for ' + wizard + '.' + step + ' but fieldMapping undefined'); - return null; - } - const identifier = {wizard, step, field: fieldMapping.name}; - if (fieldMapping.isMap) { - return this.retrieveMap(identifier); - } - const storedEntry = this.retrieve(identifier); - if (!storedEntry) { - return undefined; - } - - if (fieldMapping.backingObject) { - if (!fieldMapping.retriever) { - console.error('Trying to restore field ' + fieldMapping.name + ' but no object retriever provided'); - return undefined; - } - return fieldMapping.retriever(storedEntry.value); - } - - return storedEntry.value; - } - - // retrieveWizardEntry() is generally an INTERNAL method, but available to the confirmation page - retrieveWizardEntry(wizard: string) { - return this.ensureWizardEntry(wizard); - } - - delete(identifier: UserDataIdentifier) { - const wizardEntry = this.getWizardEntry(identifier.wizard); - if (wizardEntry && wizardEntry.steps[identifier.step] && wizardEntry.steps[identifier.step].fields) { - delete wizardEntry.steps[identifier.step].fields[identifier.field]; - this.storeWizardEntry(wizardEntry); - } - } - - // The ONLY time this method should be called is if the user explicitly says to erase "old" data - deleteWizardData(wizard: string) { - PersistentStore.removeItem(this.keyWizard(wizard)); - } - - clear(identifier: UserDataIdentifier) { - const wizardEntry = this.getWizardEntry(identifier.wizard); - if (wizardEntry && wizardEntry.steps[identifier.step] && wizardEntry.steps[identifier.step].fields) { - this.setUserDataEntry(wizardEntry, identifier, null); - this.storeWizardEntry(wizardEntry); - } - } - - fieldsWithStoredData(wizard, step: string, fields: string[]): string[] { - return fields.filter(field => this.hasStoredData({wizard, step, field})); - } - - hasStoredData(identifier: UserDataIdentifier): boolean { - const userDataEntry = this.retrieve(identifier); - // NOTE: we want a value of 'false' to return TRUE (that there IS a value) - return userDataEntry && userDataEntry.value !== null && userDataEntry.value !== undefined && userDataEntry.value !== ''; - } - - hasStoredStepData(wizard, step: string) { - const wizardEntry = this.retrieveWizardEntry(wizard); - if (!wizardEntry) { - return false; - } - const stepEntry = wizardEntry.steps[step]; - return stepEntry !== undefined && stepEntry !== null; - } - - // The ONLY times this method should be called outside this class: - // (1) the user explicitly says to "restore" their old data, meaning we should consider it current again, and - // (2) the user imports a data file - updateWizardTimestamp(wizard: string) { - const wizardEntry = this.ensureWizardEntry(wizard); - wizardEntry.lastUpdate = Date.now(); - this.storeWizardEntry(wizardEntry); - } - - isWizardDataOld(wizard: string): boolean { - const wizardEntry = this.retrieveWizardEntry(wizard); - if (!wizardEntry) { - return false; // if there's no data, it can't be old! - } - if (!wizardEntry.lastUpdate) { - return true; // if there's no timestamp, we assume the data is old; the user never saved a full form? - } - const lastSavedDate = new Date(wizardEntry.lastUpdate); - // get difference between dates in milliseconds, convert to minutes - const minAgoSaved = ((Date.now() - lastSavedDate.getTime()) / 60000); - return minAgoSaved > DATA_CONSIDERED_OLD_AFTER_MINUTES; - } - - // This internal convenience method is meant to isolate the access to the internal structure - private setUserDataEntry(wizardEntry: UserDataWizard, identifier: UserDataIdentifier, data: UserDataEntry) { - wizardEntry.steps[identifier.step].fields[identifier.field] = data; - } - - // string format is "key:value, key2:value2, key3:value3"; for display purposes only - private mapToDisplayString(map: Map): string { - let labelsStr: string = ''; - map.forEach((value, key) => labelsStr += key + ':' + value + ', '); - return labelsStr.slice(0, -2); // chop off the last ', ' - } - - private stringToMap(source: string): Map { - const result = new Map(); - if (source) { - const keyValuePairs = source.split(', ') - keyValuePairs.map(label => { - const keyAndValue = label.split(':'); - result.set(keyAndValue[0], keyAndValue[1]); - }); - } - return result; - } - - private getWizardEntry(wizard: string): UserDataWizard { - return PersistentStore.getItem(this.keyWizard(wizard)); - } - - private ensureWizardEntry(wizard: string): UserDataWizard { - // get the wizard entry, or create a new one - let wizardEntry = this.getWizardEntry(wizard); - if (!wizardEntry) { - wizardEntry = this.createUserDataWizard(wizard); - } - return wizardEntry; - } - - private ensureStepEntry(wizardEntry, step: string): UserDataWizard { - // if the step entry isn't there, create it - if (!wizardEntry.steps[step]) { - this.createUserStepEntry(wizardEntry, step); - } - return wizardEntry; - } - - private ensureUserDataIdentifier(identifier: UserDataIdentifier): UserDataWizard { - const wizardEntry = this.ensureWizardEntry(identifier.wizard); - this.ensureStepEntry(wizardEntry, identifier.step); - return wizardEntry; - } - - private createUserDataWizard(wizard: string): UserDataWizard { - return { wizard, steps: new Map() }; - } - - private createUserStepEntry(wizardEntry: UserDataWizard, step: string) { - const newStepEntry: UserDataStep = { - fields: new Map(), - } - wizardEntry.steps[step] = newStepEntry; - } - - private keyWizard(wizard: string): string { - return wizard + 'Storage'; - } - - private storeWizardEntry(wizardEntry: UserDataWizard) { - PersistentStore.setItem(this.keyWizard(wizardEntry.wizard), wizardEntry); - } -} diff --git a/tkg/web/src/app/shared/service/vsphere-wizard-form.service.ts b/tkg/web/src/app/shared/service/vsphere-wizard-form.service.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/web/src/app/shared/service/websocket.service.spec.ts b/tkg/web/src/app/shared/service/websocket.service.spec.ts deleted file mode 100644 index 429d0e0d90..0000000000 --- a/tkg/web/src/app/shared/service/websocket.service.spec.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { WebsocketService } from './websocket.service'; - -describe('WebsocketService', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: WebsocketService = TestBed.get(WebsocketService); - expect(service).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/shared/service/websocket.service.ts b/tkg/web/src/app/shared/service/websocket.service.ts deleted file mode 100644 index 3ba546689c..0000000000 --- a/tkg/web/src/app/shared/service/websocket.service.ts +++ /dev/null @@ -1,68 +0,0 @@ -// Angular imports -import { Injectable } from '@angular/core'; -import { Observable, Subject, Observer } from 'rxjs'; - -// App imports -import { PROVIDERS } from '../constants/app.constants'; -import { environment } from '../../../environments/environment'; - -@Injectable({ - providedIn: 'root' -}) -export class WebsocketService { - private ws: WebSocket; - private subject: Subject; - - constructor() { - } - - connect(): Observable { - if (!this.subject) { - this.subject = this.create(); - } - return this.subject.asObservable(); - } - - create() { - if (!window) { - throw new Error("The service should only be used a web application."); - } - - const { protocol, host } = window.location; - const url = (protocol === "https" ? "wss" : "ws") + `://${host}/ws`; - this.ws = new WebSocket(url); - - const observable = Observable.create( - (obs: Observer) => { - this.ws.onmessage = obs.next.bind(obs); - this.ws.onerror = obs.error.bind(obs); - this.ws.onclose = obs.complete.bind(obs); - - return this.ws.close.bind(this.ws); - }); - - const observer = { - next: (data: Object) => { - if (this.ws.readyState === WebSocket.OPEN) { - this.ws.send(JSON.stringify(data)); - } - } - }; - - return Subject.create(observer, observable); - } - - sendMessage(message: string) { - const payload = { operation: message }; - if (this.ws.readyState === WebSocket.OPEN) { - this.ws.send(JSON.stringify(payload)); - } else { - console.log('ws connection not yet open'); - } - } - - setOnClose(handler) { - this.subject = null; - this.ws.onclose = handler; - } -} diff --git a/tkg/web/src/app/shared/shared.module.ts b/tkg/web/src/app/shared/shared.module.ts deleted file mode 100644 index b7fa76aaf5..0000000000 --- a/tkg/web/src/app/shared/shared.module.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Angular modules - */ -import { NgModule } from '@angular/core'; -import { CommonModule } from "@angular/common"; -import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { HttpClientModule } from '@angular/common/http'; - -/** - * Third party imports - */ -import { ClarityModule } from "@clr/angular"; - -/** - * App imports - */ -import { FeatureToggleDirective } from './directives/feature-flag.directive'; -import { A11yTooltipTriggerDirective } from './directives/a11y-tooltip-trigger.directive'; -import { RemoveAriaLabelledByDirective } from './directives/remove-aria-labelledBy.directive'; -import { ContextualHelpComponent } from './contextual-help/contextual-help.component'; -import { KeyboardListenerDirective } from './directives/keyboard-listener.directive'; - -const declaredAndExportedModules = [ - CommonModule, - ClarityModule, - FormsModule, - ReactiveFormsModule, - HttpClientModule -]; - -/** - * Module for shared UI components - */ -@NgModule({ - imports: [ - ...declaredAndExportedModules, - ], - - providers: [], - exports: [ - ...declaredAndExportedModules, - FeatureToggleDirective, - A11yTooltipTriggerDirective, - RemoveAriaLabelledByDirective, - ContextualHelpComponent, - KeyboardListenerDirective - ], - declarations: [ - FeatureToggleDirective, - A11yTooltipTriggerDirective, - RemoveAriaLabelledByDirective, - ContextualHelpComponent, - KeyboardListenerDirective - ] -}) -export class SharedModule { } diff --git a/tkg/web/src/app/shared/utils.ts b/tkg/web/src/app/shared/utils.ts deleted file mode 100644 index 3bb5a1b974..0000000000 --- a/tkg/web/src/app/shared/utils.ts +++ /dev/null @@ -1,6 +0,0 @@ - -export class Utils { - static safeString(src: string): string { - return !(src) ? '' : src; - } -} diff --git a/tkg/web/src/app/testing/branding.service.stub.ts b/tkg/web/src/app/testing/branding.service.stub.ts deleted file mode 100644 index 376834a79a..0000000000 --- a/tkg/web/src/app/testing/branding.service.stub.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class BrandingServiceStub { - - initBranding() { - } - - setBrandingByEdition() { - } - - validBrandingContent() { - } -} diff --git a/tkg/web/src/app/testing/data-service-registrar.testextension.ts b/tkg/web/src/app/testing/data-service-registrar.testextension.ts deleted file mode 100644 index e51114521a..0000000000 --- a/tkg/web/src/app/testing/data-service-registrar.testextension.ts +++ /dev/null @@ -1,28 +0,0 @@ -import DataServiceRegistrar from '../shared/service/data-service-registrar'; -import { TanzuEventType } from '../shared/service/Messenger'; -import { Observable } from 'rxjs'; - -export class DataServiceRegistrarTestExtension extends DataServiceRegistrar { - public hasEntry(eventType: TanzuEventType): boolean { - const eventEntry = this.getEntry(eventType); - return eventEntry !== null && eventEntry !== undefined; - } - - public simulateError(eventType: TanzuEventType, errMsg: string) { - if (!this.hasEntry(eventType)) { - console.log('No event registration found for ' + eventType); - } - this.getEntry(eventType).errorStream.next(errMsg); - } - - public simulateData(eventType: TanzuEventType, data: any) { - if (!this.hasEntry(eventType)) { - console.log('No event registration found for ' + eventType); - } - this.getEntry(eventType).dataStream.next(data); - } - - public simulateRegistration(eventType: TanzuEventType) { - this.register(eventType, () => new Observable()); - } -} diff --git a/tkg/web/src/app/testing/vsphere-wizard-form.service.stub.ts b/tkg/web/src/app/testing/vsphere-wizard-form.service.stub.ts deleted file mode 100644 index 3276ea92ec..0000000000 --- a/tkg/web/src/app/testing/vsphere-wizard-form.service.stub.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; -import { BehaviorSubject, Observable, ReplaySubject } from 'rxjs'; -import { APIClient } from '../swagger/api-client.service'; - -export class VSphereWizardFormServiceStub { - getPayload() { - } - - getDcMoid() { - } - - saveFormData(data) { - } -} diff --git a/tkg/web/src/app/views/landing/aws-wizard/ami-step/ami-step.component.ts b/tkg/web/src/app/views/landing/aws-wizard/ami-step/ami-step.component.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard-routing.module.ts b/tkg/web/src/app/views/landing/aws-wizard/aws-wizard-routing.module.ts deleted file mode 100644 index b604c934d3..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard-routing.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Angular modules -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -// App imports -import { AwsWizardComponent } from './aws-wizard.component'; - -export const routes: Routes = [ - { - path: '', - component: AwsWizardComponent - } -]; - -/** - * @module AwsWizardRoutingModule - * @description - * This is routing module for the wizard module. - */ -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class AwsWizardRoutingModule {} diff --git a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.html b/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.html deleted file mode 100644 index 7275664a98..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.html +++ /dev/null @@ -1,57 +0,0 @@ -
-
-
- -

-
- Deploy {{ clusterTypeDescriptorTitleCase }} Cluster on Amazon Web Services -

- - - - -
-
- - - -
-
- - - -
-
- - - - - -
-
-
-
diff --git a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.scss b/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.scss deleted file mode 100644 index b5f4dd4b0a..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.scss +++ /dev/null @@ -1,31 +0,0 @@ -@import '../../../../sass/properties.scss'; - -:host ::ng-deep button.clr-accordion-header-button { - font-size: 14px; - padding: 9px 18px; - color: #474747; - .clr-accordion-complete-icon { - color: #4C773C; - } -} - -clr-icon.back-link { - margin-right: 8px; - cursor: pointer; - position: relative; - top: 10px; - float:left; -} - -h2 { - margin-top: 0; -} - -@media (max-width: $small) { - .btn-container { - text-align: center; - .deploy-btn, .edit-btn { - width: 100%; - } - } -} diff --git a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.spec.ts b/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.spec.ts deleted file mode 100644 index 2fd53c1fa2..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.spec.ts +++ /dev/null @@ -1,211 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; -// App imports -import { APIClient } from '../../../swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { AwsField, AwsForm, VpcType } from './aws-wizard.constants'; -import { AwsWizardComponent } from './aws-wizard.component'; -import { CeipField } from '../wizard/shared/components/steps/ceip-step/ceip-step.fieldmapping'; -import { ClusterPlan, ClusterType, WizardForm } from "../wizard/shared/constants/wizard.constants"; -import { Messenger } from 'src/app/shared/service/Messenger'; -import { MetadataField } from '../wizard/shared/components/steps/metadata-step/metadata-step.fieldmapping'; -import { NetworkField } from '../wizard/shared/components/steps/network-step/network-step.fieldmapping'; -import { NodeSettingField } from '../wizard/shared/components/steps/node-setting-step/node-setting-step.fieldmapping'; -import { NodeSettingStepComponent } from './node-setting-step/node-setting-step.component'; -import { SharedModule } from '../../../shared/shared.module'; -import { ValidationService } from '../wizard/shared/validation/validation.service'; - -describe('AwsWizardComponent', () => { - let component: AwsWizardComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - ReactiveFormsModule, - BrowserAnimationsModule, - RouterTestingModule, - SharedModule - ], - providers: [ - APIClient, - FormBuilder, - ValidationService - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [ AwsWizardComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - const fb = new FormBuilder(); - fixture = TestBed.createComponent(AwsWizardComponent); - component = fixture.componentInstance; - component.form = fb.group({ - awsProviderForm: fb.group({ - accessKeyID: [''], - region: [''], - secretAccessKey: [''], - }), - vpcForm: fb.group({ - vpc: [''], - publicNodeCidr: [''], - privateNodeCidr: [''], - awsNodeAz: [''], - vpcType: [''] - }), - awsNodeSettingForm: fb.group({ - awsNodeAz1: [''], - awsNodeAz2: [''], - awsNodeAz3: [''], - bastionHostEnabled: [false], - controlPlaneSetting: [''], - devInstanceType: [''], - machineHealthChecksEnabled: [false], - createCloudFormation: [false], - workerNodeInstanceType: [''], - workerNodeInstanceType2: [''], - workerNodeInstanceType3: [''], - clusterName: [''], - sshKeyName: [''] - }), - metadataForm: fb.group({ - clusterDescription: [''], - clusterLabels: [{key: 'a', value: '1'}], - clusterLocation: [''] - }), - networkForm: fb.group({ - clusterPodCidr: [''], - clusterServiceCidr: [''], - cniType: [''] - }), - identityForm: fb.group({ - }), - amiOrgIdForm: fb.group({ - }), - ceipOptInForm: fb.group({ - ceipOptIn: [true] - }), - osImageForm: fb.group({ - }) - }); - component.clusterTypeDescriptor = '' + ClusterType.Management; - component.title = 'Tanzu'; - fixture.detectChanges(); - }); - - afterEach(() => { - fixture.destroy(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should return management cluster name', () => { - const stepInstance = TestBed.createComponent(NodeSettingStepComponent).componentInstance; - component.registerStep(AwsForm.NODESETTING, stepInstance); - stepInstance.formGroup.addControl('clusterName', new FormControl('')); - - component.form.get(AwsForm.NODESETTING).get('clusterName').setValue('mylocalTestName'); - expect(component.getMCName()).toBe('mylocalTestName'); - }); - - it('should create API payload', () => { - const mappings = [ - [AwsForm.PROVIDER, AwsField.PROVIDER_ACCESS_KEY, 'aws-access-key-id-12345'], - [AwsForm.PROVIDER, AwsField.PROVIDER_REGION, 'US-WEST'], - [AwsForm.PROVIDER, AwsField.PROVIDER_SECRET_ACCESS_KEY, 'My-AWS-Secret-Access-Key'], - [AwsForm.VPC, AwsField.VPC_NEW_CIDR, '10.0.0.0/16'], - [AwsForm.VPC, AwsField.VPC_TYPE, VpcType.NEW], - [AwsForm.NODESETTING, AwsField.NODESETTING_AZ_1, 'us-west-a'], - [AwsForm.NODESETTING, AwsField.NODESETTING_BASTION_HOST_ENABLED, true], - [AwsForm.NODESETTING, NodeSettingField.INSTANCE_TYPE_DEV, 't3.medium'], - [AwsForm.NODESETTING, AwsField.NODESETTING_SSH_KEY_NAME, 'default'], - [AwsForm.NODESETTING, NodeSettingField.WORKER_NODE_INSTANCE_TYPE, 't3.small'], - [AwsForm.NODESETTING, AwsField.NODESETTING_CREATE_CLOUD_FORMATION, true], - [AwsForm.NODESETTING, NodeSettingField.MACHINE_HEALTH_CHECKS_ENABLED, true], - [WizardForm.METADATA, MetadataField.CLUSTER_DESCRIPTION, 'DescriptionEXAMPLE'], - [WizardForm.METADATA, MetadataField.CLUSTER_LOCATION, 'mylocation1'], - [WizardForm.NETWORK, NetworkField.CLUSTER_POD_CIDR, '100.96.0.0/11'], - [WizardForm.NETWORK, NetworkField.CLUSTER_SERVICE_CIDR, '100.64.0.0/13'], - [WizardForm.NETWORK, NetworkField.CNI_TYPE, 'antrea'], - [WizardForm.CEIP, CeipField.OPTIN, true] - ]; - mappings.forEach(mapping => { - const formName = mapping[0] as string; - const fieldName = mapping[1] as string; - const desiredValue = mapping[2]; - - const formGroup = component.form.get(formName) as FormGroup; - expect(formGroup).toBeTruthy(); - formGroup.addControl(fieldName, new FormControl(desiredValue)); - }); - - // NOTE: because cluster plan is pulled from storage (not a DOM control) we have to put the test values in storage - const identifierClusterPlan = { wizard: component.wizardName, step: AwsForm.NODESETTING, field: NodeSettingField.CLUSTER_PLAN }; - AppServices.userDataService.store(identifierClusterPlan, { display: ClusterPlan.DEV, value: ClusterPlan.DEV }); - - const payload = component.getPayload(); - expect(payload.awsAccountParams).toEqual({ - region: 'US-WEST', - accessKeyID: 'aws-access-key-id-12345', - secretAccessKey: 'My-AWS-Secret-Access-Key', - profileName: '', - sessionToken: '' - }); - - expect(payload.networking).toEqual({ - networkName: '', - clusterDNSName: '', - clusterNodeCIDR: '', - clusterServiceCIDR: '100.64.0.0/13', - clusterPodCIDR: '100.96.0.0/11', - cniType: 'antrea' - }); - expect(payload.labels).toEqual({}); - expect(payload.annotations).toEqual({ - description: 'DescriptionEXAMPLE', - location: 'mylocation1' - }); - expect(payload.createCloudFormationStack).toBe(true); - expect(payload.controlPlaneNodeType).toBe('t3.medium'); - expect(payload.sshKeyName).toBe('default'); - expect(payload.controlPlaneFlavor).toBe('dev'); - expect(payload.vpc.azs[0].workerNodeType).toBe('t3.small'); - expect(payload.bastionHostEnabled).toBe(true); - expect(payload.machineHealthCheckEnabled).toBe(true); - expect(payload.ceipOptIn).toBe(true); - }); - - it('should generate cli', () => { - const path = '/testPath/xyz.yaml'; - const payload = component.getPayload(); - if (payload.createCloudFormationStack) { - expect(component.getCli(path)).toBe(`tanzu management-cluster permissions aws set && tanzu management-cluster create --file ${path} -v 6`); - } else { - expect(component.getCli(path)).toBe(`tanzu management-cluster create --file ${path} -v 6`); - } - }); - - it('should call api to create aws regional cluster', () => { - const apiSpy = spyOn(component['apiClient'], 'createAWSRegionalCluster').and.callThrough(); - component.createRegionalCluster({}); - expect(apiSpy).toHaveBeenCalled(); - }); - - it('should apply TKG config for aws', () => { - const apiSpy = spyOn(component['apiClient'], 'applyTKGConfigForAWS').and.callThrough(); - component.applyTkgConfig(); - expect(apiSpy).toHaveBeenCalled(); - }); -}); diff --git a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.ts b/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.ts deleted file mode 100644 index 4321ed4527..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.component.ts +++ /dev/null @@ -1,392 +0,0 @@ -// Angular imports -import { Component, ElementRef, OnInit } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; -import { Title } from '@angular/platform-browser'; -import { Router } from '@angular/router'; -// Third party imports -import { Observable } from 'rxjs'; -// App imports -import { APIClient } from 'src/app/swagger'; -import AppServices from "../../../shared/service/appServices"; -import { - AWSAvailabilityZone, - AWSNodeAz, - AWSRegionalClusterParams, - AWSSubnet, - AWSVirtualMachine, - AWSVpc, - Vpc -} from 'src/app/swagger/models'; -import { AWSAccountParamsKeys, AwsProviderStepComponent } from './provider-step/aws-provider-step.component'; -import { AwsField, AwsForm, VpcType } from "./aws-wizard.constants"; -import { AwsOsImageStepComponent } from './os-image-step/aws-os-image-step.component'; -import { CliFields, CliGenerator } from '../wizard/shared/utils/cli-generator'; -import { ClusterPlan, ClusterType } from '../wizard/shared/constants/wizard.constants'; -import { ExportService } from '../../../shared/service/export.service'; -import { FormDataForHTML, FormUtility } from '../wizard/shared/components/steps/form-utility'; -import { ImportParams, ImportService } from "../../../shared/service/import.service"; -import { InstanceType } from '../../../shared/constants/app.constants'; -import { NodeSettingField } from '../wizard/shared/components/steps/node-setting-step/node-setting-step.fieldmapping'; -import { NodeSettingStepComponent } from './node-setting-step/node-setting-step.component'; -import { TanzuEventType } from '../../../shared/service/Messenger'; -import { Utils } from '../../../shared/utils'; -import { VpcStepComponent } from './vpc-step/vpc-step.component'; -import { WizardBaseDirective } from '../wizard/shared/wizard-base/wizard-base'; - -export interface AzRelatedFields { - az: string, - workerNodeInstanceType: string, - vpcPublicSubnet: string, - vpcPrivateSubnet: string -} - -export const AzRelatedFieldsArray: AzRelatedFields[] = [ - { az: AwsField.NODESETTING_AZ_1, vpcPrivateSubnet: AwsField.NODESETTING_VPC_PRIVATE_SUBNET_1, - vpcPublicSubnet: AwsField.NODESETTING_VPC_PUBLIC_SUBNET_1, workerNodeInstanceType: NodeSettingField.WORKER_NODE_INSTANCE_TYPE }, - { az: AwsField.NODESETTING_AZ_2, vpcPrivateSubnet: AwsField.NODESETTING_VPC_PRIVATE_SUBNET_2, - vpcPublicSubnet: AwsField.NODESETTING_VPC_PUBLIC_SUBNET_2, workerNodeInstanceType: AwsField.NODESETTING_WORKERTYPE_2 }, - { az: AwsField.NODESETTING_AZ_3, vpcPrivateSubnet: AwsField.NODESETTING_VPC_PRIVATE_SUBNET_3, - vpcPublicSubnet: AwsField.NODESETTING_VPC_PUBLIC_SUBNET_3, workerNodeInstanceType: AwsField.NODESETTING_WORKERTYPE_3 }, -]; - -@Component({ - selector: 'aws-wizard', - templateUrl: './aws-wizard.component.html', - styleUrls: ['./aws-wizard.component.scss'], -}) -export class AwsWizardComponent extends WizardBaseDirective implements OnInit { - constructor( - router: Router, - formBuilder: FormBuilder, - private exportService: ExportService, - private importService: ImportService, - private apiClient: APIClient, - titleService: Title, - el: ElementRef) { - - super(router, el, titleService, formBuilder); - } - - protected supplyFileImportedEvent(): TanzuEventType { - return TanzuEventType.AWS_CONFIG_FILE_IMPORTED; - } - - protected supplyFileImportErrorEvent(): TanzuEventType { - return TanzuEventType.AWS_CONFIG_FILE_IMPORT_ERROR; - } - - protected supplyWizardName(): string { - return 'AWSWizard'; - } - - protected supplyStepData(): FormDataForHTML[] { - return [ - this.AwsProviderForm, - this.AwsVpcForm, - this.AwsNodeSettingForm, - this.MetadataForm, - this.AwsNetworkForm, - this.IdentityForm, - this.AwsOsImageForm, - this.CeipForm, - ]; - } - - ngOnInit() { - super.ngOnInit(); - this.registerServices(); - this.subscribeToServices(); - - // To avoid re-open issue for AWS provider step. - this.form.markAsDirty(); - - this.titleService.setTitle(this.title + ' AWS'); - } - - getPayload(): AWSRegionalClusterParams { - const payload: AWSRegionalClusterParams = {}; - - payload.awsAccountParams = {}; - AWSAccountParamsKeys.forEach(key => { - payload.awsAccountParams[key] = this.getFieldValue(AwsForm.PROVIDER, key); - }); - payload.loadbalancerSchemeInternal = this.getBooleanFieldValue(AwsForm.VPC, AwsField.VPC_NON_INTERNET_FACING); - payload.sshKeyName = this.getFieldValue(AwsForm.NODESETTING, AwsField.NODESETTING_SSH_KEY_NAME); - payload.createCloudFormationStack = this.getFieldValue(AwsForm.NODESETTING, AwsField.NODESETTING_CREATE_CLOUD_FORMATION) || false; - payload.clusterName = this.getFieldValue(AwsForm.NODESETTING, NodeSettingField.CLUSTER_NAME); - payload.controlPlaneFlavor = this.getStoredClusterPlan(AwsForm.NODESETTING); - const nodeTypeField = payload.controlPlaneFlavor === ClusterPlan.PROD ? NodeSettingField.INSTANCE_TYPE_PROD - : NodeSettingField.INSTANCE_TYPE_DEV; - payload.controlPlaneNodeType = this.getFieldValue(AwsForm.NODESETTING, nodeTypeField); - payload.bastionHostEnabled = this.getBooleanFieldValue(AwsForm.NODESETTING, AwsField.NODESETTING_BASTION_HOST_ENABLED); - const machineHealthChecksEnabled = this.getFieldValue(AwsForm.NODESETTING, NodeSettingField.MACHINE_HEALTH_CHECKS_ENABLED); - payload.machineHealthCheckEnabled = (machineHealthChecksEnabled === true); - payload.vpc = { - cidr: this.getFieldValue(AwsForm.VPC, AwsField.VPC_EXISTING_CIDR), - vpcID: this.getFieldValue(AwsForm.VPC, AwsField.VPC_EXISTING_ID), - azs: this.getAwsNodeAzs(payload) - }; - - payload.enableAuditLogging = this.getBooleanFieldValue(AwsForm.NODESETTING, NodeSettingField.ENABLE_AUDIT_LOGGING); - this.initPayloadWithCommons(payload); - - return payload; - } - - setFromPayload(payload: AWSRegionalClusterParams) { - if (payload !== undefined) { - if (payload.awsAccountParams !== undefined) { - for (const key of Object.keys(payload.awsAccountParams)) { - this.storeFieldString(AwsForm.PROVIDER, key, payload.awsAccountParams[key]); - } - } - this.storeFieldString(AwsForm.NODESETTING, AwsField.NODESETTING_SSH_KEY_NAME, payload.sshKeyName); - this.storeFieldBoolean(AwsForm.NODESETTING, AwsField.NODESETTING_CREATE_CLOUD_FORMATION, payload.createCloudFormationStack); - this.storeFieldString(AwsForm.NODESETTING, NodeSettingField.CLUSTER_NAME, payload.clusterName); - - this.setStoredClusterPlan(AwsForm.NODESETTING, payload.controlPlaneFlavor); - if (payload.controlPlaneFlavor === InstanceType.DEV) { - this.storeFieldString(AwsForm.NODESETTING, NodeSettingField.INSTANCE_TYPE_DEV, payload.controlPlaneNodeType); - } else if (payload.controlPlaneFlavor === InstanceType.PROD) { - this.storeFieldString(AwsForm.NODESETTING, NodeSettingField.INSTANCE_TYPE_PROD, payload.controlPlaneNodeType); - } - this.storeFieldBoolean(AwsForm.NODESETTING, AwsField.NODESETTING_BASTION_HOST_ENABLED, payload.bastionHostEnabled); - this.storeFieldBoolean(AwsForm.NODESETTING, NodeSettingField.MACHINE_HEALTH_CHECKS_ENABLED, payload.machineHealthCheckEnabled); - this.storeFieldString(AwsForm.VPC, AwsField.VPC_EXISTING_ID, (payload.vpc) ? payload.vpc.vpcID : ''); - this.storeFieldBoolean(AwsForm.VPC, AwsField.VPC_NON_INTERNET_FACING, payload.loadbalancerSchemeInternal) - this.storeFieldBoolean(AwsForm.NODESETTING, NodeSettingField.ENABLE_AUDIT_LOGGING, payload.enableAuditLogging); - this.storeVpcFields(payload.vpc); - - this.storeFieldString('osImageForm', 'osImage', payload.os.name); - - this.saveCommonFieldsFromPayload(payload); - AppServices.userDataService.updateWizardTimestamp(this.wizardName); - } - } - - private storeVpcFields(vpc: AWSVpc) { - if (vpc) { - if (vpc.vpcID) { - this.storeFieldString(AwsForm.VPC, AwsField.VPC_TYPE, VpcType.EXISTING); - this.storeFieldString(AwsForm.VPC, AwsField.VPC_EXISTING_CIDR, vpc.cidr); - this.storeFieldString(AwsForm.VPC, AwsField.VPC_PUBLIC_NODE_CIDR, ''); - this.storeFieldString(AwsForm.VPC, AwsField.VPC_PRIVATE_NODE_CIDR, ''); - this.storeFieldString(AwsForm.VPC, AwsField.VPC_EXISTING_ID, vpc.vpcID); - } else { - this.storeFieldString(AwsForm.VPC, AwsField.VPC_TYPE, VpcType.NEW); - this.storeFieldString(AwsForm.VPC, AwsField.VPC_NEW_CIDR, vpc.cidr); - } - this.storeVpcAzs(vpc); - } - } - - private storeVpcAzs(vpc: AWSVpc) { - if (vpc && vpc.azs && vpc.azs.length > 0) { - const nodeAzList = vpc.azs; - const numNodeAz = nodeAzList.length; - for (let x = 0; x < numNodeAz; x++) { - this.storeAzNodeFields(nodeAzList[x], AzRelatedFieldsArray[x]); - } - } - } - - private storeAzNodeFields(node: AWSNodeAz, azFields: AzRelatedFields) { - this.storeFieldString(AwsForm.NODESETTING, azFields.az, node.name); - if (!AppServices.appDataService.isModeClusterStandalone()) { - this.storeFieldString(AwsForm.NODESETTING, azFields.workerNodeInstanceType, node.workerNodeType); - } - this.storeFieldString(AwsForm.NODESETTING, azFields.vpcPublicSubnet, Utils.safeString(node.publicSubnetID)); - this.storeFieldString(AwsForm.NODESETTING, azFields.vpcPrivateSubnet, Utils.safeString(node.privateSubnetID)); - } - - private getAzFieldData(azFields: AzRelatedFields, standaloneControlPlaneNodeType: string) { - return { - name: this.getFieldValue(AwsForm.NODESETTING, azFields.az), - workerNodeType: AppServices.appDataService.isModeClusterStandalone() ? standaloneControlPlaneNodeType : - this.getFieldValue(AwsForm.NODESETTING, azFields.workerNodeInstanceType), - publicNodeCidr: (this.getFieldValue(AwsForm.VPC, AwsField.VPC_TYPE) === VpcType.NEW) ? - this.getFieldValue(AwsForm.VPC, AwsField.VPC_PUBLIC_NODE_CIDR) : '', - privateNodeCidr: (this.getFieldValue(AwsForm.VPC, AwsField.VPC_TYPE) === VpcType.NEW) ? - this.getFieldValue(AwsForm.VPC, AwsField.VPC_PRIVATE_NODE_CIDR) : '', - publicSubnetID: (this.getFieldValue(AwsForm.VPC, AwsField.VPC_TYPE) === VpcType.EXISTING) ? - this.getFieldValue(AwsForm.NODESETTING, azFields.vpcPublicSubnet) : '', - privateSubnetID: (this.getFieldValue(AwsForm.VPC, AwsField.VPC_TYPE) === VpcType.EXISTING) ? - this.getFieldValue(AwsForm.NODESETTING, azFields.vpcPrivateSubnet) : '' - } - } - - getAwsNodeAzs(payload) { - const nodeAzList = [this.getAzFieldData(AzRelatedFieldsArray[0], payload.controlPlaneNodeType)]; - - if (this.getFieldValue(AwsForm.NODESETTING, AwsField.NODESETTING_AZ_2)) { - nodeAzList.push(this.getAzFieldData(AzRelatedFieldsArray[1], payload.controlPlaneNodeType)); - } - if (this.getFieldValue(AwsForm.NODESETTING, AwsField.NODESETTING_AZ_3)) { - nodeAzList.push(this.getAzFieldData(AzRelatedFieldsArray[2], payload.controlPlaneNodeType)); - } - return nodeAzList; - } - - /** - * @method method to trigger deployment - */ - createRegionalCluster(payload: any): Observable { - return this.apiClient.createAWSRegionalCluster(payload); - } - - /** - * Return management/standalone cluster name - */ - getMCName() { - return this.getFieldValue(AwsForm.NODESETTING, NodeSettingField.CLUSTER_NAME); - } - - /** - * @method getExtendCliCmds to return cli command string according to special selection - * For AWS, selects Create Cloudformation Stack, - * should include tanzu management-cluster permissions aws set - * @returns the array includes cli command object like {isPrefixOfCreateCmd: true, cmdStr: "tanzu ..."} - */ - getExtendCliCmds(): Array<{ isPrefixOfCreateCmd: boolean, cmdStr: string }> { - if (this.getFieldValue(AwsForm.NODESETTING, AwsField.NODESETTING_CREATE_CLOUD_FORMATION)) { - const clusterPrefix = (this.getClusterType()) ? this.getClusterType() : ClusterType.Management; - const command = `tanzu ${clusterPrefix}-cluster permissions aws set`; - return [{ isPrefixOfCreateCmd: true, cmdStr: command }] - } - return [] - } - - /** - * Get the CLI used to deploy the management/standalone cluster - */ - getCli(configPath: string): string { - const cliG = new CliGenerator(); - const cliParams: CliFields = { - configPath: configPath, - clusterType: this.getClusterType(), - clusterName: this.getMCName(), - extendCliCmds: this.getExtendCliCmds() - }; - return cliG.getCli(cliParams); - } - - applyTkgConfig() { - return this.apiClient.applyTKGConfigForAWS({ params: this.getPayload() }); - } - - /** - * Retrieve the config file from the backend and return as a string - */ - retrieveExportFile() { - return this.apiClient.exportTKGConfigForAWS({ params: this.getPayload() }); - } - - // returns TRUE if the file contents appear to be a valid config file for AWS - // returns FALSE if the file is empty or does not appear to be valid. Note that in the FALSE - // case we also alert the user. - importFileValidate(nameFile: string, fileContents: string): boolean { - if (fileContents.includes('AWS_')) { - return true; - } - alert(nameFile + ' is not a valid AWS configuration file!'); - return false; - } - - importFileRetrieveClusterParams(fileContents: string): Observable { - return this.apiClient.importTKGConfigForAWS( { params: { filecontents: fileContents } } ); - } - - importFileProcessClusterParams(event: TanzuEventType, nameFile: string, awsClusterParams: AWSRegionalClusterParams) { - this.setFromPayload(awsClusterParams); - this.resetToFirstStep(); - this.importService.publishImportSuccess(event, nameFile); - } - - // returns TRUE if user (a) will not lose data on import, or (b) confirms it's OK - onImportButtonClick() { - let result = true; - if (!this.isOnFirstStep()) { - result = confirm('Importing will overwrite any data you have entered. Proceed with import?'); - } - return result; - } - - onImportFileSelected(event) { - const params: ImportParams = { - eventSuccess: this.supplyFileImportedEvent(), - eventFailure: this.supplyFileImportErrorEvent(), - file: event.target.files[0], - validator: this.importFileValidate, - backend: this.importFileRetrieveClusterParams.bind(this), - onSuccess: this.importFileProcessClusterParams.bind(this), - onFailure: this.importService.publishImportFailure - } - this.importService.import(params); - - // clear file reader target so user can re-select same file if needed - event.target.value = ''; - } - // HTML convenience methods - // - get AwsProviderForm(): FormDataForHTML { - return {name: AwsForm.PROVIDER, title: 'IaaS Provider', - description: 'Validate the AWS provider account for ' + this.title, - i18n: {title: 'IaaS provder step name', description: 'IaaS provder step description'}, - clazz: AwsProviderStepComponent}; - } - get AwsNodeSettingForm(): FormDataForHTML { - return { name: AwsForm.NODESETTING, title: FormUtility.titleCase(this.clusterTypeDescriptor) + ' Cluster Settings', - description: `Specify the resources backing the ${this.clusterTypeDescriptor} cluster`, - i18n: {title: 'IaaS provder step name', description: 'IaaS provder step description'}, - clazz: NodeSettingStepComponent}; - } - get AwsVpcForm(): FormDataForHTML { - return {name: AwsForm.VPC, title: 'VPC for AWS', description: 'Specify VPC settings for AWS', - i18n: {title: 'vpc step name', description: 'vpc step description'}, - clazz: VpcStepComponent}; - } - get AwsOsImageForm(): FormDataForHTML { - return this.getOsImageForm(AwsOsImageStepComponent); - } - get AwsNetworkForm(): FormDataForHTML { - return FormUtility.formWithOverrides(this.NetworkForm, {description: 'Specify the cluster Pod CIDR'}); - } - // - // HTML convenience methods - - private subscribeToServices() { - AppServices.messenger.subscribe(TanzuEventType.AWS_REGION_CHANGED, event => { - const region = event.payload; - AppServices.dataServiceRegistrar.trigger([TanzuEventType.AWS_GET_OS_IMAGES], { region }); - // NOTE: even though the VPC and AZ endpoints don't take the region as a payload, they DO return different data - // if the user logs in to AWS using a different region. Therefore, we re-fetch that data if the region changes. - AppServices.dataServiceRegistrar.trigger([TanzuEventType.AWS_GET_EXISTING_VPCS, TanzuEventType.AWS_GET_AVAILABILITY_ZONES]); - }); - } - - private registerServices() { - const wizard = this; - AppServices.dataServiceRegistrar.register(TanzuEventType.AWS_GET_EXISTING_VPCS, - () => { return wizard.apiClient.getVPCs() }, - "Failed to retrieve list of existing VPCs from the specified AWS Account." ); - AppServices.dataServiceRegistrar.register(TanzuEventType.AWS_GET_AVAILABILITY_ZONES, - () => { return wizard.apiClient.getAWSAvailabilityZones(); }, - "Failed to retrieve list of availability zones from the specified AWS Account." ); - AppServices.dataServiceRegistrar.register(TanzuEventType.AWS_GET_SUBNETS, - (payload: { vpcId: string }) => {return wizard.apiClient.getAWSSubnets(payload)}, - "Failed to retrieve list of VPC subnets from the specified AWS Account." ); - AppServices.dataServiceRegistrar.register(TanzuEventType.AWS_GET_NODE_TYPES, - (payload: {az?: string}) => { return wizard.apiClient.getAWSNodeTypes(payload); }, - "Failed to retrieve list of node types from the specified AWS Account." ); - AppServices.dataServiceRegistrar.register(TanzuEventType.AWS_GET_OS_IMAGES, - (payload: {region: string}) => { return wizard.apiClient.getAWSOSImages(payload); }, - "Failed to retrieve list of OS images from the specified AWS Server." ); - } - exportConfiguration() { - const wizard = this; // capture 'this' outside the context of the closure below - this.exportService.export( - this.retrieveExportFile(), - (failureMessage) => { wizard.displayError(failureMessage); } - ); - } -} diff --git a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.constants.ts b/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.constants.ts deleted file mode 100644 index e5d441190a..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.constants.ts +++ /dev/null @@ -1,48 +0,0 @@ -export enum CredentialType { - ONETIME = 'oneTimeCredentials', - PROFILE = 'credentialProfile' -} - -export enum VpcType { - EXISTING = 'existing', - NEW = 'new' -} - -export enum AwsForm { - PROVIDER = 'awsProviderForm', - VPC = 'vpcForm', - NODESETTING = 'awsNodeSettingForm', -} - -export enum AwsField { - NODESETTING_AZ_1 = 'awsNodeAz1', - NODESETTING_AZ_2 = 'awsNodeAz2', - NODESETTING_AZ_3 = 'awsNodeAz3', - NODESETTING_BASTION_HOST_ENABLED = 'bastionHostEnabled', - NODESETTING_CREATE_CLOUD_FORMATION = 'createCloudFormation', - NODESETTING_SSH_KEY_NAME = 'sshKeyName', - NODESETTING_VPC_PUBLIC_SUBNET_1 = 'vpcPublicSubnet1', - NODESETTING_VPC_PUBLIC_SUBNET_2 = 'vpcPublicSubnet2', - NODESETTING_VPC_PUBLIC_SUBNET_3 = 'vpcPublicSubnet3', - NODESETTING_VPC_PRIVATE_SUBNET_1 = 'vpcPrivateSubnet1', - NODESETTING_VPC_PRIVATE_SUBNET_2 = 'vpcPrivateSubnet2', - NODESETTING_VPC_PRIVATE_SUBNET_3 = 'vpcPrivateSubnet3', - // NOTE: worker type 1 uses NodeSettingField.WORKER_NODE_INSTANCE_TYPE from the shared component - NODESETTING_WORKERTYPE_2 = 'workerNodeInstanceType2', - NODESETTING_WORKERTYPE_3 = 'workerNodeInstanceType3', - - PROVIDER_ACCESS_KEY = 'accessKeyID', - PROVIDER_AUTH_TYPE = 'authType', - PROVIDER_PROFILE_NAME = 'profileName', - PROVIDER_REGION = 'region', - PROVIDER_SECRET_ACCESS_KEY = 'secretAccessKey', - PROVIDER_SESSION_TOKEN = 'sessionToken', - - VPC_EXISTING_ID = 'existingVpcId', - VPC_EXISTING_CIDR = 'existingVpcCidr', - VPC_NEW_CIDR = 'vpc', - VPC_NON_INTERNET_FACING = 'nonInternetFacingVPC', - VPC_PRIVATE_NODE_CIDR = 'privateNodeCidr', - VPC_PUBLIC_NODE_CIDR = 'publicNodeCidr', - VPC_TYPE = 'vpcType' -} diff --git a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.module.ts b/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.module.ts deleted file mode 100644 index 49ffe830e4..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/aws-wizard.module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { WizardSharedModule } from '../wizard/shared/wizard-shared.module'; -import { SharedModule } from '../../../shared/shared.module'; -import { LandingModule } from '../landing.module'; -import { AwsWizardRoutingModule } from './aws-wizard-routing.module'; - -import { AwsWizardComponent } from './aws-wizard.component'; -import { NodeSettingStepComponent } from './node-setting-step/node-setting-step.component'; -import { AwsProviderStepComponent } from './provider-step/aws-provider-step.component'; -import { VpcStepComponent } from './vpc-step/vpc-step.component'; - -import { ValidationService } from '../wizard/shared/validation/validation.service'; - -@NgModule({ - declarations: [ - AwsWizardComponent, - AwsProviderStepComponent, - VpcStepComponent, - NodeSettingStepComponent - ], - imports: [ - CommonModule, - AwsWizardRoutingModule, - SharedModule, - LandingModule, - WizardSharedModule - ], - providers: [ - ValidationService - ] -}) -export class AwsWizardModule { } diff --git a/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.html b/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.html deleted file mode 100644 index 3061fdc643..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.html +++ /dev/null @@ -1,688 +0,0 @@ -
- - -

- {{ clusterTypeDescriptorTitleCase }} Cluster Settings -

- - - -
-
- - - - - - - {{ clusterTypeDescriptorTitleCase }} Cluster name must start and end with a letter or number, and can contain only - lowercase letters, numbers, and hyphens. - - - {{ clusterTypeDescriptorTitleCase }} Cluster Name must not include whitespace on ends. - - - Cluster name is required - - -
- -
- - - - - - - EC2 key pair cannot be empty - - -
- -
- -
-
- - - - - - - -
- -
- - - - - - - -
-
- -
-
- -
-
- - - - - - - -
-
- - - -
-
- - - - - - - Selecting an availability zone is required - - - Availability zone selection must be unique - - -
-
- - - - - - - {{ - getVpcSubnetErrorMsg('public') - }} - - -
-
- - - - - - - {{ - getVpcSubnetErrorMsg('private') - }} - - -
-
-
- - - - - - - - - - - Selecting worker node instance type is required for this AZ - -
-
- - -
-
- - - - - - - Selecting an availability zone is required - - - Availability zone selection must be unique - - -
- -
- - - - - - - {{ - getVpcSubnetErrorMsg('public') - }} - - -
-
- - - - - - - {{ - getVpcSubnetErrorMsg('private') - }} - - -
-
-
-
- - - - - - - - - - - Selecting worker node instance type is required for this AZ - -
-
- - -
-
- - - - - - - Selecting an availability zone is required - - - Availability zone selection must be unique - - -
- -
- - - - - - - {{ - getVpcSubnetErrorMsg('public') - }} - - -
-
- - - - - - - {{ - getVpcSubnetErrorMsg('private') - }} - - -
-
-
-
- - - - - - - - - - - Selecting worker node instance type is required for this AZ - -
-
-
- -
diff --git a/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.scss b/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.scss deleted file mode 100644 index 3d34259b08..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.scss +++ /dev/null @@ -1,54 +0,0 @@ -.card-icon { - position: relative; - left: 43%; -} - -.card-title { - text-align: center; -} - -.card-selected { - box-shadow: 0 .15rem 0 0 var(--clr-card-clickable-box-shadow-color); - border-style: solid; - transform: translateY(-.1rem); - transition: border .2s ease,transform .2s ease,-webkit-transform .2s ease; - border-color: var(--clr-card-clickable-border-color, #179bd3); -} - -.ha-template { - display: inline-block; -} - -.refresh-btn { - cursor: pointer; - margin-left: 10px; - display: inline-block; - - .refresh-label { - padding: 5px; - position: relative; - top: 2px; - } -} - -.node-type-container { - max-width: 50%; -} - -.node-type-select { - display: inline-block; - max-width: 220px; -} - -// tooltip max-width fix -:host ::ng-deep clr-tooltip { - clr-tooltip-content { - max-width: 300px; - } -} - -.clr-row { - &.showAdvanced { - display: none; - } -} diff --git a/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.spec.ts b/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.spec.ts deleted file mode 100644 index 4618782236..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.spec.ts +++ /dev/null @@ -1,332 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { By } from '@angular/platform-browser'; -// App imports -import { APIClient } from '../../../../swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { AwsField, AwsForm } from '../aws-wizard.constants'; -import { AWSSubnet } from '../../../../swagger/models'; -import { ClusterPlan } from '../../wizard/shared/constants/wizard.constants'; -import { DataServiceRegistrarTestExtension } from '../../../../testing/data-service-registrar.testextension'; -import { FieldMapUtilities } from '../../wizard/shared/field-mapping/FieldMapUtilities'; -import { NodeSettingStepComponent } from './node-setting-step.component'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { SharedModule } from '../../../../shared/shared.module'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; - -describe('NodeSettingStepComponent', () => { - let component: NodeSettingStepComponent; - let fixture: ComponentFixture; - const vpcSubnets = [AwsField.NODESETTING_VPC_PUBLIC_SUBNET_1, AwsField.NODESETTING_VPC_PRIVATE_SUBNET_1, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_2, AwsField.NODESETTING_VPC_PRIVATE_SUBNET_2, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_3, AwsField.NODESETTING_VPC_PRIVATE_SUBNET_3]; - const azs = [AwsField.NODESETTING_AZ_1, AwsField.NODESETTING_AZ_2, AwsField.NODESETTING_AZ_3]; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - ValidationService, - FormBuilder, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [NodeSettingStepComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - AppServices.dataServiceRegistrar = new DataServiceRegistrarTestExtension(); - fixture = TestBed.createComponent(NodeSettingStepComponent); - component = fixture.componentInstance; - component.setStepRegistrantData({ wizard: 'SquashWizard', step: AwsForm.NODESETTING, formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.AWS_CONFIG_FILE_IMPORTED, eventFileImportError: TanzuEventType.AWS_CONFIG_FILE_IMPORT_ERROR}); - - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - afterEach(() => { - fixture.destroy(); - }); - - it('should be invalid when cluster name has leading/trailing spaces', () => { - fixture.whenStable().then(() => { - component.formGroup.get('clusterName').setValue(" test"); - expect(component.formGroup.valid).toBeFalsy(); - component.formGroup.get('clusterName').setValue("test "); - expect(component.formGroup.valid).toBeFalsy(); - }); - }); - - xit('Dev instance type should be reset if control plane is prod', () => { - fixture.whenStable().then(() => { - component.formGroup.get("devInstanceType").setValue("t3.small"); - const cards = fixture.debugElement.queryAll(By.css("a.card")); - cards[1].triggerEventHandler('click', {}); - expect(component.formGroup.get("devInstanceType").value).toBeFalsy(); - }); - }); - - xit('Prod instance type should be reset if control plane is dev', () => { - fixture.whenStable().then(() => { - component.formGroup.get("prodInstanceType").setValue("t3.small"); - const cards = fixture.debugElement.queryAll(By.css("a.card")); - cards[0].triggerEventHandler('click', {}); - expect(component.formGroup.get("prodInstanceType").value).toBeFalsy(); - }); - }); - - it('should return dev instance type', () => { - component.formGroup.get("devInstanceType").setValue('t3.small'); - expect(component.devInstanceTypeValue).toBe('t3.small'); - }); - - it('should return pro instance type', () => { - component.formGroup.get("prodInstanceType").setValue('t3.small'); - expect(component.prodInstanceTypeValue).toBe('t3.small'); - }); - - it('should clear availability zone', () => { - component.formGroup.get(AwsField.NODESETTING_AZ_1).setValue('us-west-a'); - component.formGroup.get(AwsField.NODESETTING_AZ_2).setValue('us-west-b'); - component.formGroup.get(AwsField.NODESETTING_AZ_3).setValue('us-west-c'); - component.clearAzs(); - azs.forEach(az => expect(component.formGroup.get(az).value).toBe('')); - }); - - it('should clear subsets', () => { - component.formGroup.get(AwsField.NODESETTING_VPC_PUBLIC_SUBNET_1).setValue('100.63.0.0/14'); - component.formGroup.get(AwsField.NODESETTING_VPC_PRIVATE_SUBNET_1).setValue('100.54.0.0/14'); - component.formGroup.get(AwsField.NODESETTING_VPC_PUBLIC_SUBNET_2).setValue('100.63.0.0/14'); - component.formGroup.get(AwsField.NODESETTING_VPC_PRIVATE_SUBNET_2).setValue('100.54.0.0/14'); - component.formGroup.get(AwsField.NODESETTING_VPC_PUBLIC_SUBNET_3).setValue('100.63.0.0/14'); - component.formGroup.get(AwsField.NODESETTING_VPC_PRIVATE_SUBNET_3).setValue('100.63.0.0/14'); - component.clearSubnets(); - vpcSubnets.forEach(subnet => expect(component.formGroup.get(subnet).value).toBe('')); - }); - - it('should clear subnet data', () => { - component.filteredAzs = { - awsNodeAz1: { - publicSubnets: [{cidr: '100.63.0.0/14', isPublic: true}], - privateSubnets: [{cidr: '100.63.0.0/14', isPublic: false}] - }, - awsNodeAz2: { - publicSubnets: [{cidr: '100.63.0.0/14', isPublic: true}], - privateSubnets: [{cidr: '100.63.0.0/14', isPublic: false}] - }, - awsNodeAz3: { - publicSubnets: [{cidr: '100.63.0.0/14', isPublic: true}], - privateSubnets: [{cidr: '100.63.0.0/14', isPublic: false}] - } - } - component.clearSubnetData(); - expect(component.filteredAzs).toEqual({ - awsNodeAz1: { - publicSubnets: [], - privateSubnets: [] - }, - awsNodeAz2: { - publicSubnets: [], - privateSubnets: [] - }, - awsNodeAz3: { - publicSubnets: [], - privateSubnets: [] - } - }); - }); - - it('should filter subnet', () => { - component.vpcType = 'existing'; - component.publicSubnets = [{ - availabilityZoneId: 'us-west-a', - availabilityZoneName: 'us-west-a', - cidr: '100.64.0.0/13', - id: 'sn1', - isPublic: true, - }]; - component.privateSubnets = [{ - availabilityZoneId: 'us-west-a', - availabilityZoneName: 'us-west-a', - cidr: '100.64.0.0/24', - id: 'sn4', - isPublic: false - }]; - - component.filterSubnetsByAZ(AwsField.NODESETTING_AZ_1, 'us-west-a'); - expect(component.filteredAzs[AwsField.NODESETTING_AZ_1]).toEqual({ - publicSubnets: [{ - availabilityZoneId: 'us-west-a', - availabilityZoneName: 'us-west-a', - cidr: '100.64.0.0/13', - id: 'sn1', - isPublic: true, - }], - privateSubnets: [{ - availabilityZoneId: 'us-west-a', - availabilityZoneName: 'us-west-a', - cidr: '100.64.0.0/24', - id: 'sn4', - isPublic: false - }] - }) - }); - - it('should reset fields when aws region changed', () => { - component.publicSubnets = [{ - availabilityZoneId: 'us-west-a', - availabilityZoneName: 'us-west-a', - cidr: '100.64.0.0/13', - id: 'sn1', - isPublic: true, - }]; - component.privateSubnets = [{ - availabilityZoneId: 'us-west-a', - availabilityZoneName: 'us-west-a', - cidr: '100.64.0.0/24', - id: 'sn4', - isPublic: false - }]; - component.filteredAzs = { - awsNodeAz1: { - publicSubnets: [{cidr: '100.63.0.0/14', isPublic: true}], - privateSubnets: [{cidr: '100.63.0.0/14', isPublic: false}] - }, - awsNodeAz2: { - publicSubnets: [{cidr: '100.63.0.0/14', isPublic: true}], - privateSubnets: [{cidr: '100.63.0.0/14', isPublic: false}] - }, - awsNodeAz3: { - publicSubnets: [{cidr: '100.63.0.0/14', isPublic: true}], - privateSubnets: [{cidr: '100.63.0.0/14', isPublic: false}] - } - } - component.formGroup.get(AwsField.NODESETTING_AZ_1).setValue('us-west-a'); - component.formGroup.get(AwsField.NODESETTING_AZ_2).setValue('us-west-b'); - component.formGroup.get(AwsField.NODESETTING_AZ_3).setValue('us-west-c'); - - component.formGroup.get(AwsField.NODESETTING_VPC_PUBLIC_SUBNET_1).setValue('100.63.0.0/14'); - component.formGroup.get(AwsField.NODESETTING_VPC_PRIVATE_SUBNET_1).setValue('100.54.0.0/14'); - component.formGroup.get(AwsField.NODESETTING_VPC_PUBLIC_SUBNET_2).setValue('100.63.0.0/14'); - component.formGroup.get(AwsField.NODESETTING_VPC_PRIVATE_SUBNET_2).setValue('100.54.0.0/14'); - component.formGroup.get(AwsField.NODESETTING_VPC_PUBLIC_SUBNET_3).setValue('100.63.0.0/14'); - component.formGroup.get(AwsField.NODESETTING_VPC_PRIVATE_SUBNET_3).setValue('100.63.0.0/14'); - - AppServices.messenger.publish({ type: TanzuEventType.AWS_REGION_CHANGED}); - expect(component.publicSubnets).toEqual([]); - expect(component.privateSubnets).toEqual([]); - expect(component.filteredAzs).toEqual({ - awsNodeAz1: { - publicSubnets: [], - privateSubnets: [] - }, - awsNodeAz2: { - publicSubnets: [], - privateSubnets: [] - }, - awsNodeAz3: { - publicSubnets: [], - privateSubnets: [] - } - }); - azs.forEach(az => expect(component.formGroup.get(az).value).toBe('')); - vpcSubnets.forEach(subnet => expect(component.formGroup.get(subnet).value).toBe('')); - }); - - it('should handle aws vpc type change', () => { - component.formGroup.get(AwsField.NODESETTING_VPC_PUBLIC_SUBNET_1).setValue('100.63.0.0/14'); - component.formGroup.get(AwsField.NODESETTING_VPC_PRIVATE_SUBNET_1).setValue('100.54.0.0/14'); - component.ngOnInit(); - component.cardClickProd(); - const spySubnets = []; - vpcSubnets.forEach(vpcSubnet => { - spySubnets.push(spyOn(component.formGroup.get(vpcSubnet), 'setValidators').and.callThrough()); - }); - const spyAzs = spyOn(component, 'clearAzs').and.callThrough(); - - AppServices.messenger.publish({ type: TanzuEventType.AWS_VPC_TYPE_CHANGED, payload: { vpcType: 'existing'}}); - - spySubnets.forEach((subnet, index) => { - expect(subnet).toHaveBeenCalled(); - }); - expect(spyAzs).toHaveBeenCalled(); - }); - - it('should handle aws vpc change', () => { - const spyAzs = spyOn(component, 'clearAzs').and.callThrough(); - const spySubnets = spyOn(component, 'clearSubnets').and.callThrough(); - AppServices.messenger.publish({ type: TanzuEventType.AWS_VPC_CHANGED}); - expect(spyAzs).toHaveBeenCalled(); - expect(spySubnets).toHaveBeenCalled(); - }); - - it('should handle AWS_GET_SUBNETS event', () => { - const dataServiceRegistrar = AppServices.dataServiceRegistrar as DataServiceRegistrarTestExtension; - // we expect wizard to have registered this event - dataServiceRegistrar.simulateRegistration(TanzuEventType.AWS_GET_SUBNETS); - - component.ngOnInit(); - - const spySavedSubnet = spyOn(component, 'setSubnetFieldsFromSavedValues').and.callThrough(); - dataServiceRegistrar.simulateData(TanzuEventType.AWS_GET_SUBNETS, [ - {cidr: '100.63.0.0/14', isPublic: true}, - {cidr: '100.64.0.0/14', isPublic: false} - ]); - expect(component.publicSubnets).toEqual([{cidr: '100.63.0.0/14', isPublic: true}]); - expect(component.privateSubnets).toEqual([{cidr: '100.64.0.0/14', isPublic: false}]); - expect(spySavedSubnet).toHaveBeenCalled(); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - - component.ngOnInit(); - component.clearClusterPlan(); - const description = component.dynamicDescription(); - expect(description).toEqual('Specify the resources backing the cluster'); - - component.setClusterTypeDescriptor('CARAMEL'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'SquashWizard', - step: AwsForm.NODESETTING, - description: 'Specify the resources backing the CARAMEL cluster', - } - }); - - component.cardClickDev(); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'SquashWizard', - step: AwsForm.NODESETTING, - description: 'Development cluster selected: 1 node control plane', - } - }); - - component.cardClickProd(); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'SquashWizard', - step: AwsForm.NODESETTING, - description: 'Production cluster selected: 3 node control plane', - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.ts b/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.ts deleted file mode 100644 index a4a367a00f..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.component.ts +++ /dev/null @@ -1,475 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { Validators } from '@angular/forms'; -import { takeUntil } from 'rxjs/operators'; -// App imports -import { APIClient } from '../../../../swagger/api-client.service'; -import { AppEdition } from 'src/app/shared/constants/branding.constants'; -import AppServices from '../../../../shared/service/appServices'; -import { AwsField, VpcType } from "../aws-wizard.constants"; -import { AwsFieldDisplayOrder, AwsNodeSettingStepMapping } from './node-setting-step.fieldmapping'; -import { AWSNodeAz } from '../../../../swagger/models/aws-node-az.model'; -import { AWSSubnet } from '../../../../swagger/models/aws-subnet.model'; -import { AzRelatedFieldsArray } from '../aws-wizard.component'; -import { NodeSettingField } from '../../wizard/shared/components/steps/node-setting-step/node-setting-step.fieldmapping'; -import { NodeSettingStepDirective } from '../../wizard/shared/components/steps/node-setting-step/node-setting-step.component'; -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { TanzuEventType } from '../../../../shared/service/Messenger'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; - -export interface AzNodeTypes { - awsNodeAz1: Array, - awsNodeAz2: Array, - awsNodeAz3: Array -} - -export interface FilteredAzs { - awsNodeAz1: { - publicSubnets: Array; - privateSubnets: Array; - }, - awsNodeAz2: { - publicSubnets: Array; - privateSubnets: Array; - }, - awsNodeAz3: { - publicSubnets: Array; - privateSubnets: Array; - } -} - -const AZS = [ - AwsField.NODESETTING_AZ_1, - AwsField.NODESETTING_AZ_2, - AwsField.NODESETTING_AZ_3, -]; -const WORKER_NODE_INSTANCE_TYPES = [ - NodeSettingField.WORKER_NODE_INSTANCE_TYPE, - AwsField.NODESETTING_WORKERTYPE_2, - AwsField.NODESETTING_WORKERTYPE_3 -]; -const PUBLIC_SUBNETS = [ - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_1, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_2, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_3 -]; -const PRIVATE_SUBNET = [ - AwsField.NODESETTING_VPC_PRIVATE_SUBNET_1, - AwsField.NODESETTING_VPC_PRIVATE_SUBNET_2, - AwsField.NODESETTING_VPC_PRIVATE_SUBNET_3, -]; -const VPC_SUBNETS = [...PUBLIC_SUBNETS, ...PRIVATE_SUBNET]; - -enum vpcType { - EXISTING = 'existing' -} - -@Component({ - selector: 'app-node-setting-step', - templateUrl: './node-setting-step.component.html', - styleUrls: ['./node-setting-step.component.scss'] -}) - -export class NodeSettingStepComponent extends NodeSettingStepDirective implements OnInit { - APP_EDITION: any = AppEdition; - - vpcType: string = vpcType.EXISTING; - nodeAzs: Array = []; - azNodeTypes: AzNodeTypes = { - awsNodeAz1: [], - awsNodeAz2: [], - awsNodeAz3: [] - }; - - publicSubnets: Array = new Array(); - privateSubnets: Array = new Array(); - - filteredAzs: FilteredAzs = { - awsNodeAz1: { - publicSubnets: [], - privateSubnets: [] - }, - awsNodeAz2: { - publicSubnets: [], - privateSubnets: [] - }, - awsNodeAz3: { - publicSubnets: [], - privateSubnets: [] - } - }; - - config = { - displayKey: 'description', - search: true, - height: 'auto', - placeholder: 'Select', - customComparator: () => { }, - moreText: 'more', - noResultsFound: 'No results found!', - searchPlaceholder: 'Search', - searchOnKey: 'name', - clearOnSelection: false, - inputDirection: 'ltr' - }; - - airgappedVPC = false; - - constructor(protected validationService: ValidationService, - private apiClient: APIClient) { - super(validationService); - } - - protected createStepMapping(): StepMapping { - // AWS has a bunch of extra fields (related to AZs) over and above the default base class field mapping - const result = { fieldMappings: [ ...super.createStepMapping().fieldMappings, ...AwsNodeSettingStepMapping.fieldMappings]}; - // The worker node instance in the base class is used as workerNodeInstance1 for AWS; it needs diff label and requiresBackendData - const workerNodeInstanceType = AppServices.fieldMapUtilities.getFieldMapping(NodeSettingField.WORKER_NODE_INSTANCE_TYPE, result); - workerNodeInstanceType.label = 'AZ1 WORKER NODE INSTANCE TYPE'; - workerNodeInstanceType.requiresBackendData = true; - - return result; - } - - protected onProdInstanceTypeChange(prodNodeType: string) { - // AWS sets the worker instance in response to the AZ selection, not the prod instance type selection - } - - protected onDevInstanceTypeChange(devNodeType: string) { - // AWS sets the worker instance in response to the AZ selection, not the dev instance type selection - } - - protected listenToEvents() { - super.listenToEvents(); - AppServices.messenger.subscribe(TanzuEventType.AWS_AIRGAPPED_VPC_CHANGE, event => { - this.airgappedVPC = event.payload; - if (this.airgappedVPC) { // public subnet IDs shouldn't be provided - PUBLIC_SUBNETS.forEach(f => { - const control = this.getControl(f); - control.setValue(''); - control.disable(); - }) - } else { // public subnet IDs are required - PUBLIC_SUBNETS.forEach(f => { - this.getControl(f).enable(); - }) - } - }); - - AppServices.messenger.subscribe(TanzuEventType.AWS_REGION_CHANGED, () => { - if (this.formGroup.get(AwsField.NODESETTING_AZ_1)) { - this.publicSubnets = []; - this.privateSubnets = []; - - this.clearSubnetData(); - this.clearAzs(); - this.clearSubnets(); - } - }, this.unsubscribe); - - AppServices.messenger.subscribe<{ vpcType: string }>(TanzuEventType.AWS_VPC_TYPE_CHANGED, event => { - this.vpcType = event.payload.vpcType; - if (this.vpcType !== vpcType.EXISTING) { - this.clearSubnets(); - } - this.updateVpcSubnets(); - - // clear az selection - this.clearAzs(); - [...AZS, ...WORKER_NODE_INSTANCE_TYPES, ...VPC_SUBNETS].forEach( - field => this.getControl(field).updateValueAndValidity() - ); - }); - - AppServices.messenger.subscribe(TanzuEventType.AWS_VPC_CHANGED, () => { - this.clearAzs(); - this.clearSubnets(); - }); - - AzRelatedFieldsArray.forEach(azRelatedFields => { - this.registerOnValueChange(azRelatedFields.az, (newlySelectedAz) => { - this.filterSubnetsByAZ(azRelatedFields.az, newlySelectedAz); - this.setSubnetFieldsWithOnlyOneOption(azRelatedFields.az); - this.updateWorkerNodeInstanceTypes(azRelatedFields.az, newlySelectedAz, azRelatedFields.workerNodeInstanceType); - }); - }); - } - - protected subscribeToServices() { - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.AWS_GET_SUBNETS, this.onFetchedSubnets.bind(this)); - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.AWS_GET_NODE_TYPES, this.onFetchedNodeTypes.bind(this)); - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.AWS_GET_AVAILABILITY_ZONES, - this.onFetchedAzs.bind(this)); - } - - private onFetchedAzs(availabilityZones: Array) { - this.nodeAzs = availabilityZones; - } - - private onFetchedSubnets(subnets: Array) { - this.publicSubnets = subnets.filter(obj => { return obj.isPublic }); - this.privateSubnets = subnets.filter(obj => { return !obj.isPublic }); - AZS.forEach(az => { this.filterSubnetsByAZ(az, this.getFieldValue(az)); }); - this.setSubnetFieldsFromSavedValues(); - } - - private onFetchedNodeTypes(nodeTypes: Array) { - this.nodeTypes = nodeTypes.sort(); - - // The validation is based on the value of this.nodeTypes. Whenever we update this.nodeTypes, - // the corresponding validation should be updated as well. e.g. the users came to the node-settings - // step before the api responses. Then an empty array will be passed to the validation isValidNameInList. - // It will cause the selected option to be invalid all the time. - if (this.isClusterPlanDev) { - const devInstanceType = this.nodeTypes.length === 1 ? this.nodeTypes[0] : - this.formGroup.get(NodeSettingField.INSTANCE_TYPE_DEV).value; - this.resurrectField(NodeSettingField.INSTANCE_TYPE_DEV, - [Validators.required, this.validationService.isValidNameInList(this.nodeTypes)], - devInstanceType); - } else { - const prodInstanceType = this.nodeTypes.length === 1 ? this.nodeTypes[0] : - this.formGroup.get(NodeSettingField.INSTANCE_TYPE_PROD).value; - this.resurrectField(NodeSettingField.INSTANCE_TYPE_PROD, - [Validators.required, this.validationService.isValidNameInList(this.nodeTypes)], - prodInstanceType); - } - } - - protected setControlPlaneToProd() { - super.setControlPlaneToProd(); - this.updateVpcSubnets(); - - for (let i = 0; i < AZS.length; i++) { - const thisAZ = AZS[i]; - const otherAZs = this.otherAZs(thisAZ); - const thisAZcontrol = this.getControl(thisAZ); - thisAZcontrol.setValidators([ - Validators.required, - this.validationService.isUniqueAz([ - this.getControl(otherAZs[0]), - this.getControl(otherAZs[1]) ]) - ]); - this.setFieldWithStoredValue(thisAZ, this.supplyStepMapping()); - } - } - - protected setControlPlaneToDev() { - super.setControlPlaneToDev(); - this.updateVpcSubnets(); - const prodFields = [ - AwsField.NODESETTING_AZ_2, - AwsField.NODESETTING_AZ_3, - AwsField.NODESETTING_WORKERTYPE_2, - AwsField.NODESETTING_WORKERTYPE_3, - NodeSettingField.INSTANCE_TYPE_PROD - ]; - prodFields.forEach(attr => this.disarmField(attr.toString(), true)); - if (this.nodeAzs && this.nodeAzs.length === 1) { - this.setControlValueSafely(AwsField.NODESETTING_AZ_1, this.nodeAzs[0].name); - } else { - this.setFieldWithStoredValue(AwsField.NODESETTING_AZ_1, this.supplyStepMapping()); - } - } - - // returns an array of the other two AZs (used to populate a validator that ensures unique AZs are selected) - private otherAZs(targetAz: AwsField): AwsField[] { - return AZS.filter((field, index, arr) => { return field !== targetAz }); - } - - get workerNodeInstanceType1Value() { - return this.getFieldValue(NodeSettingField.WORKER_NODE_INSTANCE_TYPE); - } - - get workerNodeInstanceType2Value() { - return this.getFieldValue(AwsField.NODESETTING_WORKERTYPE_2); - } - - get workerNodeInstanceType3Value() { - return this.getFieldValue(AwsField.NODESETTING_WORKERTYPE_3); - } - - // public for testing - clearAzs() { - AZS.forEach(az => this.clearControlValue(az)); - } - - // public for testing - clearSubnets() { - VPC_SUBNETS.forEach(vpcSubnet => this.clearControlValue(vpcSubnet)); - } - - // public for testing - clearSubnetData() { - AZS.forEach(az => { - this.filteredAzs[az.toString()].publicSubnets = []; - this.filteredAzs[az.toString()].privateSubnets = []; - }); - } - - filterSubnetsByAZ(azControlName, az): void { - if (azControlName !== '' && az !== '') { - this.filteredAzs[azControlName].publicSubnets = this.filterSubnetArrayByAZ(az, this.publicSubnets); - this.filteredAzs[azControlName].privateSubnets = this.filterSubnetArrayByAZ(az, this.privateSubnets); - } - } - - private filterSubnetArrayByAZ(az: string, subnets: AWSSubnet[]): AWSSubnet[] { - return (!subnets) ? [] : subnets.filter(subnet => { return subnet.availabilityZoneName === az; }); - } - - private setSubnetFieldsWithOnlyOneOption(azControlName) { - if (azControlName !== '') { - const filteredPublicSubnets = this.filteredAzs[azControlName].publicSubnets; - if (filteredPublicSubnets.length === 1 && !this.airgappedVPC) { - this.setControlValueSafely(this.getPublicSubnetFromAz(azControlName), filteredPublicSubnets[0].id); - } - const filteredPrivateSubnets = this.filteredAzs[azControlName].privateSubnets; - if (filteredPrivateSubnets.length === 1) { - this.setControlValueSafely(this.getPrivateSubnetFromAz(azControlName), filteredPrivateSubnets[0].id); - } - } - } - - private getPublicSubnetFromAz(azControlName: AwsField): AwsField { - const indexAZ = AZS.indexOf(azControlName); - if (indexAZ < 0) { - console.log('WARNING: getPrivateSubnetFieldNameFromAzName() received unrecognized azControlName of ' + azControlName); - return null; - } - return PUBLIC_SUBNETS[indexAZ]; - } - - private getPrivateSubnetFromAz(azControlName: AwsField): AwsField { - const indexAZ = AZS.indexOf(azControlName); - if (indexAZ < 0) { - console.log('WARNING: getPrivateSubnetFieldNameFromAzName() received unrecognized azControlName of ' + azControlName); - return null; - } - return PRIVATE_SUBNET[indexAZ]; - } - - // updateWorkerNodeInstanceTypes() is called when the user has selected a new value (newlySelectedAz) for an azField. - // We need to get the worker node types available on that AZ and use them to populate our data structure that holds them. - // If there is only one worker node type, then we want to set the value of the workerNodeField to that type (rather than - // make the user "select it" from a list of only one element - private updateWorkerNodeInstanceTypes(azField: string, newlySelectedAz: string, workerNodeField: string) { - if (newlySelectedAz) { - this.apiClient.getAWSNodeTypes({ - az: newlySelectedAz - }) - .pipe(takeUntil(this.unsubscribe)) - .subscribe( - ((nodeTypes) => { - this.azNodeTypes[azField] = nodeTypes?.sort(); - if (nodeTypes.length === 1) { - this.setControlValueSafely(workerNodeField, nodeTypes[0]); - } else { - // we default to the same instance type as the management cluster - const mgmtClusterInstanceType = this.isClusterPlanProd ? this.prodInstanceTypeValue : this.devInstanceTypeValue; - // ...but the stored value has precedence - const instanceType = this.getStoredValue(workerNodeField, this.supplyStepMapping(), mgmtClusterInstanceType); - this.setControlValueSafely(workerNodeField, instanceType); - } - }), - ((err) => { - const error = err.error.message || err.message || JSON.stringify(err); - this.errorNotification = `Unable to retrieve worker node instance types. ${error}`; - }) - ); - } else { - this.azNodeTypes[newlySelectedAz] = []; - } - } - - setSubnetFieldsFromSavedValues(): void { - // NOTE: in air-gapped VPC we do not use public subnets, so don't restore a value - if (!this.airgappedVPC) { - PUBLIC_SUBNETS.forEach(vpcSubnet => { - const subnet = this.findSubnetFromSavedValue(vpcSubnet, this['publicSubnets']); - this.setControlValueSafely(vpcSubnet, subnet ? subnet.id : ''); - }); - } - PRIVATE_SUBNET.forEach(vpcSubnet => { - const subnet = this.findSubnetFromSavedValue(vpcSubnet, this['privateSubnets']); - this.setControlValueSafely(vpcSubnet, subnet ? subnet.id : ''); - }); - } - - // Given an array of subnet objects, find the one corresponding to the saved value of the given field - private findSubnetFromSavedValue(subnetField: AwsField, subnets: AWSSubnet[]) { - const savedValue = this.getStoredValue(subnetField, this.supplyStepMapping()); - // note that the saved value could either be the CIDR or the ID, so we find a match for either - return subnets.find(x => { return x.cidr === savedValue || x.id === savedValue; }); - } - - updateVpcSubnets() { - if (this.isClusterPlanProd) { - // in PROD deployments, all three subnets are used - [ - AwsField.NODESETTING_AZ_1, - AwsField.NODESETTING_AZ_2, - AwsField.NODESETTING_AZ_3, - NodeSettingField.WORKER_NODE_INSTANCE_TYPE, - AwsField.NODESETTING_WORKERTYPE_2, - AwsField.NODESETTING_WORKERTYPE_3, - AwsField.NODESETTING_VPC_PRIVATE_SUBNET_1, - AwsField.NODESETTING_VPC_PRIVATE_SUBNET_2, - AwsField.NODESETTING_VPC_PRIVATE_SUBNET_3, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_1, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_2, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_3 - ].forEach(field => { - this.resurrectFieldWithStoredValue(field.toString(), this.supplyStepMapping(), [Validators.required]); - }); - } else if (this.isClusterPlanDev) { - // in DEV deployments, only one subnet is used - [ - AwsField.NODESETTING_AZ_1, - NodeSettingField.WORKER_NODE_INSTANCE_TYPE, - AwsField.NODESETTING_VPC_PRIVATE_SUBNET_1, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_1, - ].forEach(field => { - this.resurrectFieldWithStoredValue(field.toString(), this.supplyStepMapping(), [Validators.required]); - }); - } - - if (this.airgappedVPC) { - [ - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_1, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_2, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_3 - ].forEach(field => { - this.disarmField(field.toString(), false); - }); - } - } - - getVpcSubnetTooltip(access: string): string { - return `Choose a VPC ${access} subnet associated with the selected AWS availability zone. If no - option is available, please add a ${access} subnet to this availability zone or create a new VPC on AWS.`; - } - - getVpcSubnetErrorMsg(access: string): string { - return `Selecting a VPC ${access} subnet is required. If no subnets are available, please add a ${access} subnet to this - subregion or create a new VPC on AWS.`; - } - - get isVpcTypeExisting(): boolean { - return this.vpcType === VpcType.EXISTING; - } - - protected getKeyFromNodeInstance(nodeInstance: string): string { - return nodeInstance; - } - - protected getDisplayFromNodeInstance(nodeInstance: string): string { - return nodeInstance; - } - - // We override the default behavior of displaying the fields in the order they occur in the StepMapping. - // This is because we inherit some fields from the shared NodeSettingStep, and just appending AWS added fields results - // in a jumbled order. - protected getFieldDisplayOrder(): string[] { - return AppServices.userDataService.fieldsWithStoredData(this.wizardName, this.formName, AwsFieldDisplayOrder); - } -} diff --git a/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.fieldmapping.ts b/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.fieldmapping.ts deleted file mode 100644 index a31f1b0563..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/node-setting-step/node-setting-step.fieldmapping.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { AwsField } from '../aws-wizard.constants'; -import { NodeSettingField } from '../../wizard/shared/components/steps/node-setting-step/node-setting-step.fieldmapping'; -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; - -export const AwsNodeSettingStepMapping: StepMapping = { - fieldMappings: [ - { name: AwsField.NODESETTING_AZ_1, required: true, label: 'AVAILABILITY ZONE 1', requiresBackendData: true }, - { name: AwsField.NODESETTING_AZ_2, required: true, label: 'AVAILABILITY ZONE 2', requiresBackendData: true }, - { name: AwsField.NODESETTING_AZ_3, required: true, label: 'AVAILABILITY ZONE 3', requiresBackendData: true }, - { name: AwsField.NODESETTING_BASTION_HOST_ENABLED, isBoolean: true, defaultValue: true, label: 'ACTIVATE BASTION HOST' }, - { name: AwsField.NODESETTING_CREATE_CLOUD_FORMATION, isBoolean: true, defaultValue: true, - label: 'AUTOMATE CREATION OF AWS CLOUDFORMATION STACK' }, - { name: AwsField.NODESETTING_SSH_KEY_NAME, required: true, label: 'EC2 KEY PAIR' }, - { name: AwsField.NODESETTING_VPC_PUBLIC_SUBNET_1, label: 'VPC PUBLIC SUBNET 1', requiresBackendData: true }, - { name: AwsField.NODESETTING_VPC_PUBLIC_SUBNET_2, label: 'VPC PUBLIC SUBNET 2', requiresBackendData: true }, - { name: AwsField.NODESETTING_VPC_PUBLIC_SUBNET_3, label: 'VPC PUBLIC SUBNET 3', requiresBackendData: true }, - { name: AwsField.NODESETTING_VPC_PRIVATE_SUBNET_1, label: 'VPC PRIVATE SUBNET 1', requiresBackendData: true }, - { name: AwsField.NODESETTING_VPC_PRIVATE_SUBNET_2, label: 'VPC PRIVATE SUBNET 2', requiresBackendData: true }, - { name: AwsField.NODESETTING_VPC_PRIVATE_SUBNET_3, label: 'VPC PRIVATE SUBNET 3', requiresBackendData: true }, - { name: AwsField.NODESETTING_WORKERTYPE_2, label: 'AZ2 WORKER NODE INSTANCE TYPE', requiresBackendData: true }, - { name: AwsField.NODESETTING_WORKERTYPE_3, label: 'AZ3 WORKER NODE INSTANCE TYPE', requiresBackendData: true }, - ], -}; - -export const AwsFieldDisplayOrder: string[] = [ - NodeSettingField.CLUSTER_NAME, - NodeSettingField.INSTANCE_TYPE_DEV, - NodeSettingField.INSTANCE_TYPE_PROD, - AwsField.NODESETTING_BASTION_HOST_ENABLED, - AwsField.NODESETTING_CREATE_CLOUD_FORMATION, - AwsField.NODESETTING_SSH_KEY_NAME, - AwsField.NODESETTING_AZ_1, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_1, - AwsField.NODESETTING_VPC_PRIVATE_SUBNET_1, - NodeSettingField.WORKER_NODE_INSTANCE_TYPE, - AwsField.NODESETTING_AZ_2, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_2, - AwsField.NODESETTING_VPC_PRIVATE_SUBNET_2, - AwsField.NODESETTING_WORKERTYPE_2, - AwsField.NODESETTING_AZ_3, - AwsField.NODESETTING_VPC_PUBLIC_SUBNET_3, - AwsField.NODESETTING_VPC_PRIVATE_SUBNET_3, - AwsField.NODESETTING_WORKERTYPE_3, - NodeSettingField.ENABLE_AUDIT_LOGGING, - NodeSettingField.MACHINE_HEALTH_CHECKS_ENABLED, -] -// About AwsNodeSettingStep: -// This is a complex form. The first thing the user is expected to do is select DEV or PROD as NODESETTING_CONTROL_PLANE_SETTING, which -// will cascade into activating/deactivating other fields based on its value. Therefore, NODESETTING_CONTROL_PLANE_SETTING is set as a -// primaryTrigger and most of the other fields on the form are set doNotAutoRestore because their values depend either on the DEV/PROD -// setting and/or on backend data events. diff --git a/tkg/web/src/app/views/landing/aws-wizard/os-image-step/aws-os-image-step.component.ts b/tkg/web/src/app/views/landing/aws-wizard/os-image-step/aws-os-image-step.component.ts deleted file mode 100644 index 1427ddf22f..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/os-image-step/aws-os-image-step.component.ts +++ /dev/null @@ -1,45 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -// App imports -import AppServices from '../../../../shared/service/appServices'; -import { AWSVirtualMachine } from '../../../../swagger/models'; -import { - OsImageProviderInputs, - SharedOsImageStepDirective -} from '../../wizard/shared/components/steps/os-image-step/os-image-step.component'; -import { TanzuEventType } from '../../../../shared/service/Messenger'; - -@Component({ - selector: 'app-aws-os-image-step', - templateUrl: '../../wizard/shared/components/steps/os-image-step/os-image-step.component.html', - styleUrls: ['../../wizard/shared/components/steps/os-image-step/os-image-step.component.scss'] -}) -export class AwsOsImageStepComponent extends SharedOsImageStepDirective implements OnInit { - private currentRegion: string; - - ngOnInit() { - super.ngOnInit(); - // subscribe to the AWS_REGION_CHANGED event so that we can capture the current region. We need it so that if - // the user wants to refresh the os images available, we have the region id for the backend call to get the os images - AppServices.messenger.subscribe(TanzuEventType.AWS_REGION_CHANGED, event => { - this.currentRegion = event.payload; - }); - } - - protected supplyProviderInputs(): OsImageProviderInputs { - return { - createOsImageEventPayload: this.createOsImageEventPayload.bind(this), - event: TanzuEventType.AWS_GET_OS_IMAGES, - eventImportFileFailure: TanzuEventType.AWS_CONFIG_FILE_IMPORT_ERROR, - eventImportFileSuccess: TanzuEventType.AWS_CONFIG_FILE_IMPORTED, - osImageTooltipContent: 'Select a base OS image that you have already imported ' + - 'into your AWS account. If no compatible OS image is present, import one into ' + - 'AWS and click the Refresh button' - }; - } - - // returns a payload that can be used with the AWS_GET_OS_IMAGES event to refresh the os images from the backend - private createOsImageEventPayload() { - return { region: this.currentRegion }; - } -} diff --git a/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.html b/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.html deleted file mode 100644 index 522e274bda..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.html +++ /dev/null @@ -1,188 +0,0 @@ -
- - -
-
- - - - - - - - - - - -
-
- -

- Enter AWS account credentials directly in the Access Key ID and Secret Access Key fields for your - Amazon Web Services account. Optionally specify an AWS session token in Session Token if your AWS account is - configured to require temporary credentials. If Access Key ID and Secret Access Key are left blank, - - credentials will be resolved automatically following the CLI precedence rules.. -

- Credentials will not be saved in configuration files, and will need to be set each time AWS credentials - are required locally. -

- Use the one-time credentials mode when you are using temporary credentials obtained via an enterprise managed - site or deploying from an instance on Amazon Web Services using IAM instance profiles. Using a credential profile is the - recommended method which will make it easier to perform management cluster upgrades and deletions. -

-
-
- - - - - - -
-
- - - - - - -
-
- - - - - - -
-
-
- - -

- Select an already existing AWS credential profile. If you select a profile, the access keys and session token - information configured for your profile are temporarily passed to the installer without displaying actual values - in the UI. -

- Credential profiles can be configured using the AWS CLI. - These profiles are loaded automatically following the AWS CLI precedence rules. -

-
-
- - - - - - -
-
-
- -
-
- - - - - - - A region must be selected - - -
- -
- -
-
- -
-
-
diff --git a/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.scss b/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.scss deleted file mode 100644 index 6dd204a51f..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -.input-label { - color: #70797f; -} - -select[name=credentialProfile]{ - width: 193px; -} \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.spec.ts b/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.spec.ts deleted file mode 100644 index 4ab5fa4fb2..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.spec.ts +++ /dev/null @@ -1,149 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { FormBuilder } from '@angular/forms'; -import { By } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; -// Third party imports -import { of, empty, throwError, Observable } from 'rxjs'; -// App imports -import { APIClient } from '../../../../swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { AwsField } from '../aws-wizard.constants'; -import { AwsProviderStepComponent } from './aws-provider-step.component'; -import { FieldMapUtilities } from '../../wizard/shared/field-mapping/FieldMapUtilities'; -import { Messenger } from 'src/app/shared/service/Messenger'; -import { SharedModule } from '../../../../shared/shared.module'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; - -describe('AwsProviderStepComponent', () => { - let component: AwsProviderStepComponent; - let fixture: ComponentFixture; - let mockedApiService; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule, - BrowserAnimationsModule - ], - providers: [ - ValidationService, - FormBuilder, - { - provide: APIClient, - useValue: jasmine.createSpyObj( - 'APIClient', - ['getAWSRegions', 'setAWSEndpoint', 'getAWSCredentialProfiles'] - ) - } - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [AwsProviderStepComponent] - }) - .compileComponents(); - - mockedApiService = TestBed.get(APIClient); - mockedApiService.getAWSRegions.and.returnValue(of(["US-WEST", "US-EAST"])); - mockedApiService.getAWSCredentialProfiles.and.returnValue(of(['profile1', 'profile2'])); - mockedApiService.setAWSEndpoint.and.returnValue(empty()); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - const fb = new FormBuilder(); - fixture = TestBed.createComponent(AwsProviderStepComponent); - component = fixture.componentInstance; - component.formGroup = fb.group({}); - - fixture.detectChanges(); - }); - - afterEach(() => { - fixture.destroy(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it("valid credentials fields should activate connect button", async(() => { - - component.ngOnInit(); - let connectBtn = fixture.debugElement.query(By.css("button.btn-primary")); - expect(connectBtn.nativeElement.disabled).toBeTruthy(); - - component.setFieldValue(AwsField.PROVIDER_PROFILE_NAME, 'profile1'); - component.setFieldValue(AwsField.PROVIDER_SESSION_TOKEN, 'token1'); - component.setFieldValue(AwsField.PROVIDER_ACCESS_KEY, 'accessKey1'); - component.setFieldValue(AwsField.PROVIDER_SECRET_ACCESS_KEY, 'secretAccessKey1'); - component.setFieldValue(AwsField.PROVIDER_REGION, 'region1'); - fixture.whenStable().then( - () => { - fixture.detectChanges(); - connectBtn = fixture.debugElement.query(By.css("button.btn-primary")); - expect(connectBtn).toBeTruthy(); - expect(connectBtn.nativeElement.disabled).toBeFalsy(); - } - ); - })); - - it("invalid (blank) credential fields should deactivate connect button", async(() => { - component.ngOnInit(); - fixture.whenStable().then( - () => { - fixture.detectChanges(); - const connectBtn = fixture.debugElement.query(By.css("button.btn-primary")); - expect(connectBtn.nativeElement.disabled).toBeTruthy(); - } - ); - })); - - it("should be successful when clicked", async(() => { - mockedApiService.setAWSEndpoint.and.returnValue(empty()); - - const connectBtn = fixture.debugElement.query(By.css("button.btn-primary")); - - connectBtn.nativeElement.click(); - fixture.whenStable().then( - () => { - fixture.detectChanges(); - const globalError = fixture.debugElement.query(By.css("app-alert-notification")); - expect(globalError.nativeElement.innerText).toBe(""); - } - ); - })); - - it("should show an error when connect button clicked and endpoint throws error", async(() => { - mockedApiService.setAWSEndpoint.and.returnValue(throwError({ - status: 400, - error: {message: 'failed to set aws endpoint'} - })); - - component.ngOnInit(); - component.setFieldValue(AwsField.PROVIDER_PROFILE_NAME, 'profile2'); - component.setFieldValue(AwsField.PROVIDER_SESSION_TOKEN, 'token1'); - component.setFieldValue(AwsField.PROVIDER_ACCESS_KEY, 'accessKey1'); - component.setFieldValue(AwsField.PROVIDER_SECRET_ACCESS_KEY, 'secretAccessKey1'); - component.setFieldValue(AwsField.PROVIDER_REGION, 'region1'); - expect(component.errorNotification).toBeFalsy(); - - fixture.whenStable().then(() => { - fixture.detectChanges(); // this is necessary to pick up the field changes above and thereby activate the connect btn - const connectBtn = fixture.debugElement.query(By.css("button.btn-primary")); - expect(connectBtn.nativeElement.disabled).toBeFalsy('connect button is unexpectedly deactivated'); - connectBtn.nativeElement.click(); - fixture.whenStable().then(() => { - fixture.detectChanges(); - expect(component.validCredentials).toBeFalsy(); - expect(component.errorNotification).not.toBeFalsy(); - }); - }); - })); - - // NOTE: there is no test for changing the step description because this step only has a static step description. -}); diff --git a/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.ts b/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.ts deleted file mode 100644 index 2d9cf23248..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.component.ts +++ /dev/null @@ -1,251 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -// Third party imports -import { catchError, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators'; -import { forkJoin, of } from 'rxjs'; -// App imports -import { APIClient } from '../../../../swagger/api-client.service'; -import AppServices from '../../../../shared/service/appServices'; -import { AwsField, CredentialType } from "../aws-wizard.constants"; -import { AwsProviderStepMapping } from './aws-provider-step.fieldmapping'; -import { StepFormDirective } from '../../wizard/shared/step-form/step-form'; -import { TanzuEventType } from '../../../../shared/service/Messenger'; - -export const AWSAccountParamsKeys = [ - AwsField.PROVIDER_PROFILE_NAME, - AwsField.PROVIDER_SESSION_TOKEN, - AwsField.PROVIDER_REGION, - AwsField.PROVIDER_ACCESS_KEY, - AwsField.PROVIDER_SECRET_ACCESS_KEY -]; - -@Component({ - selector: 'app-aws-provider-step', - templateUrl: './aws-provider-step.component.html', - styleUrls: ['./aws-provider-step.component.scss'] -}) -export class AwsProviderStepComponent extends StepFormDirective implements OnInit { - loading = false; - authTypeValue: string = CredentialType.PROFILE; - - regions = []; - profileNames: Array = []; - validCredentials: boolean = false; - - constructor(private apiClient: APIClient) { - super(); - } - - private customizeForm() { - this.formGroup['canMoveToNext'] = () => { - return this.formGroup.valid && this.validCredentials; - } - } - - /** - * Set the hidden form field to proper value based on form validity - * @param valid whether we want the form to be valid - */ - setValidCredentials(valid) { - this.validCredentials = valid; - - if (valid === true) { - AppServices.dataServiceRegistrar.trigger( [ - TanzuEventType.AWS_GET_EXISTING_VPCS, - TanzuEventType.AWS_GET_AVAILABILITY_ZONES, - TanzuEventType.AWS_GET_NODE_TYPES - ]); - } - } - - /** - * Initialize the form with data from the backend - * @param credentials AWS credentials - * @param regions AWS regions - */ - private initForm() { - this.initAwsCredentials(); - } - - ngOnInit() { - super.ngOnInit(); - - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, AwsProviderStepMapping); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(AwsProviderStepMapping); - this.storeDefaultLabels(AwsProviderStepMapping); - - this.customizeForm(); - - this.loading = true; - this.initForm(); - - this.formGroup.valueChanges - .pipe( - debounceTime(500), - distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), - takeUntil(this.unsubscribe) - ) - .subscribe( - (data) => { - this.trimCreds(data); - } - ); - - this.registerOnValueChange(AwsField.PROVIDER_AUTH_TYPE, data => { - this.authTypeValue = data; - - if (this.authTypeValue === CredentialType.ONETIME) { - this.oneTimeCredentialsSelectedHandler(); - } else if (this.authTypeValue === CredentialType.PROFILE) { - this.credentialProfileSelectedHandler(); - } else { - this.disarmField(AwsField.PROVIDER_AUTH_TYPE, true); - } - }); - this.authTypeValue = this.getStoredValue(AwsField.PROVIDER_AUTH_TYPE, AwsProviderStepMapping, CredentialType.PROFILE); - this.setControlValueSafely(AwsField.PROVIDER_AUTH_TYPE, this.authTypeValue); - - // handle file import - AppServices.messenger.subscribe(this.eventFileImported, this.onFileImported.bind(this)); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - - this.chooseInitialAuthType(); - } - - private onFileImported(data) { - this.defaultFileImportedHandler(AwsProviderStepMapping)(data); - this.setValidCredentials(false); - } - - trimCreds(data) { - const trimmedId = data.accessKeyID && data.accessKeyID.replace('\t', ''); - const trimmedKey = data.secretAccessKey && data.secretAccessKey.replace('\t', ''); - - if (trimmedId !== data.accessKeyID) { - this.formGroup.get(AwsField.PROVIDER_ACCESS_KEY).setValue(trimmedId); - } - - if (trimmedKey !== data.secretAccessKey) { - this.formGroup.get(AwsField.PROVIDER_SECRET_ACCESS_KEY).setValue(trimmedKey); - } - - this.validCredentials = false - } - - private initAwsCredentials() { - const getRegionObs$ = this.apiClient.getAWSRegions().pipe( - catchError(err => of([])), - ); - const getProfilesObs$ = this.apiClient.getAWSCredentialProfiles().pipe( - catchError(err => of([])), - ); - forkJoin([getRegionObs$, getProfilesObs$]) - .pipe(takeUntil(this.unsubscribe)) - .subscribe( - (next) => { - this.regions = next[0].sort(); - this.restoreRegion(); - - this.profileNames = next[1]; - this.restoreProfile(); - }, - () => this.loading = false - ); - } - - private restoreRegion() { - this.restoreField(AwsField.PROVIDER_REGION, AwsProviderStepMapping, this.regions); - } - - private restoreProfile() { - this.restoreField(AwsField.PROVIDER_PROFILE_NAME, AwsProviderStepMapping, this.profileNames); - } - - private oneTimeCredentialsSelectedHandler() { - this.disarmField(AwsField.PROVIDER_PROFILE_NAME, true); - } - - private credentialProfileSelectedHandler() { - [ - AwsField.PROVIDER_ACCESS_KEY, - AwsField.PROVIDER_SECRET_ACCESS_KEY, - AwsField.PROVIDER_SESSION_TOKEN - ].forEach(field => this.disarmField(field.toString(), true)); - } - - setAWSCredentialsValuesFromAPI(credentials) { - // init form values for AWS credentials - for (const key of AWSAccountParamsKeys) { - this.setControlValueSafely(key.toString(), credentials[key.toString()]); - } - } - - chooseInitialAuthType() { - // Use the presence of a saved secret access key to set the access type. - // (Which is to say: assume CredentialType.PROFILE unless there is a saved secret access key.) - // NOTE: if there is a real saved access key (from import) we erase it immediately after using it here - const fieldMapping = AppServices.fieldMapUtilities.getFieldMapping(AwsField.PROVIDER_SECRET_ACCESS_KEY, AwsProviderStepMapping); - const savedSecretAccessKey = AppServices.userDataService.retrieveStoredValue(this.wizardName, this.formName, fieldMapping); - this.authTypeValue = (savedSecretAccessKey) ? CredentialType.ONETIME : CredentialType.PROFILE; - } - - /** - * @method verifyCredentials - * helper method to verify AWS connection credentials - */ - verifyCredentials() { - this.loading = true; - this.errorNotification = ''; - const params = {}; - for (const field of AWSAccountParamsKeys) { - params[field.toString()] = this.getFieldValue(field); - } - this.apiClient.setAWSEndpoint({ - accountParams: params - }) - .pipe(takeUntil(this.unsubscribe)) - .subscribe( - (() => { - this.errorNotification = ''; - // Announce that we have a (valid) region - AppServices.messenger.publish({ - type: TanzuEventType.AWS_REGION_CHANGED, - payload: this.getFieldValue(AwsField.PROVIDER_REGION) - }); - AppServices.messenger.publish({ - type: TanzuEventType.AWS_GET_OS_IMAGES, - payload: { - region: this.getFieldValue(AwsField.PROVIDER_REGION) - } - }); - this.setValidCredentials(true); - }), - ((err) => { - const errMsg = err.error ? err.error.message : null; - const error = errMsg || err.message || JSON.stringify(err); - this.errorNotification = `Invalid AWS credentials: all credentials and region must be valid. ${error}`; - this.setValidCredentials(false); - }), - (() => { - this.loading = false; - }) - ); - } - - /** - * Whether to disable "Connect" button - */ - isConnectDisabled() { - return !AWSAccountParamsKeys.reduce((accu, key) => this.formGroup.get(key.toString()).valid && accu, true); - } - - // For use in HTML - isAuthTypeProfile() { - return this.authTypeValue === CredentialType.PROFILE; - } - - protected storeUserData() { - this.storeUserDataFromMapping(AwsProviderStepMapping); - this.storeDefaultDisplayOrder(AwsProviderStepMapping); - } -} diff --git a/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.fieldmapping.ts b/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.fieldmapping.ts deleted file mode 100644 index 021acdd8f5..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/provider-step/aws-provider-step.fieldmapping.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { AwsField, CredentialType } from '../aws-wizard.constants'; -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; - -export const AwsProviderStepMapping: StepMapping = { - fieldMappings: [ - { name: AwsField.PROVIDER_AUTH_TYPE, required: true, defaultValue: CredentialType.PROFILE, primaryTrigger: true, - label: 'AWS CREDENTIAL TYPE' }, - { name: AwsField.PROVIDER_ACCESS_KEY, mask: true, label: 'ACCESS KEY ID (OPTIONAL)', doNotAutoRestore: true }, - { name: AwsField.PROVIDER_SECRET_ACCESS_KEY, mask: true, label: 'SECRET ACCESS KEY (OPTIONAL)', doNotAutoRestore: true }, - { name: AwsField.PROVIDER_SESSION_TOKEN, label: 'SESSION TOKEN (OPTIONAL)', doNotAutoRestore: true }, - { name: AwsField.PROVIDER_PROFILE_NAME, label: 'AWS CREDENTIAL PROFILE', doNotAutoRestore: true }, - { name: AwsField.PROVIDER_REGION, required: true, label: 'REGION', doNotAutoRestore: true }, - ] -} -// About AwsProviderStep: -// The first thing the user must do is select what kind of credentials they are using (AwsField.PROVIDER_AUTH_TYPE), and this choic -// triggers the UI to display the corresponding fields. Therefore, we set primaryTrigger to TRUE for AwsField.PROVIDER_AUTH_TYPE. -// All the other fields will then be restored based on the handler of AwsField.PROVIDER_AUTH_TYPE changes, so we set their -// configuration with doNotAutoRestore TRUE, since we don't want to build the form originally with any values set for those fields. diff --git a/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.html b/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.html deleted file mode 100644 index 57152b52cb..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.html +++ /dev/null @@ -1,76 +0,0 @@ -
-

- VPC for AWS -

- -
-
- - - - - - Selecting an existing VPC is required - -
-
- - - - - - -
-
- -
-
- - - - - - -
-
-
diff --git a/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.scss b/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.scss deleted file mode 100644 index aa2f864773..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -.clr-input[readonly] { - border-bottom: 1px solid #999; -} diff --git a/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.spec.ts b/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.spec.ts deleted file mode 100644 index 3e931ee5ba..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.spec.ts +++ /dev/null @@ -1,122 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -// App imports -import { APIClient } from 'src/app/swagger'; -import AppServices from '../../../../shared/service/appServices'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FieldMapUtilities } from '../../wizard/shared/field-mapping/FieldMapUtilities'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { VpcStepComponent } from './vpc-step.component'; -import { AwsField, AwsForm, VpcType } from '../aws-wizard.constants'; - -describe('VpcComponent', () => { - let component: VpcStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [VpcStepComponent], - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - APIClient, - ValidationService, - FormBuilder, - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - fixture = TestBed.createComponent(VpcStepComponent); - component = fixture.componentInstance; - component.setStepRegistrantData({ wizard: 'PickleWizard', step: AwsForm.VPC, formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.AWS_CONFIG_FILE_IMPORTED, eventFileImportError: TanzuEventType.AWS_CONFIG_FILE_IMPORT_ERROR}); - fixture.detectChanges(); - }); - - afterEach(() => { - fixture.destroy(); - }); - - it('should create', async () => { - expect(component).toBeTruthy(); - }); - - it("should be invalid when VPC CIDR is 192.168.1.1", async(() => { - component.formGroup.get(AwsField.VPC_TYPE).setValue(VpcType.NEW); - fixture.detectChanges(); - component.setNewVpcValidators(); - component.formGroup.get(AwsField.VPC_NEW_CIDR).setValue("192.168.1.1"); - expect(component.formGroup.valid).toBeFalsy(); - })); - - it("should be invalid when VPC CIDR is 192.168.1.0/32", async(() => { - component.formGroup.get(AwsField.VPC_TYPE).setValue(VpcType.NEW); - fixture.detectChanges(); - component.setNewVpcValidators(); - component.formGroup.get(AwsField.VPC_NEW_CIDR).setValue("192.168.1.0/32"); - expect(component.formGroup.valid).toBeFalsy(); - })); - - it("selecting existing VPC should populate existing VPC CIDR", async(() => { - component.existingVpcs = [{ - id: 'vpc-1', - cidr: '100.64.0.0/13' - }]; - component.formGroup.get(AwsField.VPC_TYPE).setValue(VpcType.EXISTING); - fixture.detectChanges(); - component.onChangeExistingVpc('vpc-1'); - expect(component.formGroup.get('existingVpcCidr').value).toBe('100.64.0.0/13'); - })); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.ngOnInit(); - - const description = component.dynamicDescription(); - expect(description).toEqual('Specify VPC settings for AWS'); - - const vpcTypeControl = component.formGroup.controls[AwsField.VPC_TYPE]; - const vpcExistingCidrControl = component.formGroup.controls[AwsField.VPC_EXISTING_CIDR]; - const vpcExistingIdControl = component.formGroup.controls[AwsField.VPC_EXISTING_ID]; - const vpcNewCidrControl = component.formGroup.controls[AwsField.VPC_NEW_CIDR]; - - vpcTypeControl.setValue(VpcType.NEW); - vpcNewCidrControl.setValue('1.2.1.2/12'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'PickleWizard', - step: AwsForm.VPC, - description: 'VPC: (new) CIDR: 1.2.1.2/12', - } - }); - - // NOTE: setting the existing VPC id causes a search of existingVpcs to find the corresponding CIDR, - // so we need to set up existingVpcs to have the VPC id we're using in the test - component.existingVpcs = [{ - id: 'someVpc', - cidr: '3.4.3.4/24', - }] - vpcTypeControl.setValue(VpcType.EXISTING); - vpcExistingIdControl.setValue('someVpc'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'PickleWizard', - step: AwsForm.VPC, - description: 'VPC: someVpc CIDR: 3.4.3.4/24', - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.ts b/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.ts deleted file mode 100644 index 189be7f1d7..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.component.ts +++ /dev/null @@ -1,207 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { Validators } from '@angular/forms'; -// App imports -import AppServices from 'src/app/shared/service/appServices'; -import { AwsVpcStepMapping } from './vpc-step.fieldmapping'; -import { AwsField, VpcType } from "../aws-wizard.constants"; -import { StepFormDirective } from '../../wizard/shared/step-form/step-form'; -import { TanzuEventType } from '../../../../shared/service/Messenger'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { Vpc } from '../../../../swagger/models/vpc.model'; - -@Component({ - selector: 'app-vpc-step', - templateUrl: './vpc-step.component.html', - styleUrls: ['./vpc-step.component.scss'] -}) -export class VpcStepComponent extends StepFormDirective implements OnInit { - defaultVpcHasChanged: boolean = false; - existingVpcs: Array = []; - loadingExistingVpcs: boolean = false; - private curVpcType; - private curVpcId; - - defaultVpcAddress: string = '10.0.0.0/16'; - - constructor(private validationService: ValidationService) { - super(); - } - - private newVpcTypeIsChangedValue(newVpcType: VpcType): boolean { - // we want to avoid detecting a change if the new VPC type is '' and the old is undefined - if (!newVpcType && !this.curVpcType) { - return false; - } - return newVpcType !== this.curVpcType; - } - - private newVpcIdIsChangedValue(newVpcId: string): boolean { - // we want to avoid detecting a change if the new VPC id is '' and the old is undefined - if (!newVpcId && !this.curVpcId) { - return false; - } - return newVpcId !== this.curVpcId; - } - - private onVpcTypeChange(newVpcType: VpcType) { - if (!this.newVpcTypeIsChangedValue(newVpcType)) { - return; - } - this.curVpcType = newVpcType; - - if (newVpcType === VpcType.EXISTING) { - this.clearNewVpcControls(); - if (this.existingVpcs) { - const possibleVpcIds = this.existingVpcs.map(vpc => vpc.id); - this.restoreField(AwsField.VPC_EXISTING_ID, AwsVpcStepMapping, possibleVpcIds); - } - this.setExistingVpcValidators(); - } else { - this.clearExistingVpcControls(); - this.setNewVpcValidators(); - } - AppServices.messenger.publish({ - type: TanzuEventType.AWS_VPC_TYPE_CHANGED, - payload: { vpcType: newVpcType } - }); - this.triggerStepDescriptionChange(); - } - - private clearNewVpcControls() { - this.clearFieldSavedData(AwsField.VPC_NEW_CIDR); - } - - private clearExistingVpcControls() { - const existingVpcControl = this.formGroup.get(AwsField.VPC_EXISTING_ID); - const existingVpcCidrControl = this.formGroup.get(AwsField.VPC_EXISTING_CIDR); - existingVpcControl.setValue(''); - existingVpcControl.clearValidators(); - existingVpcControl.updateValueAndValidity(); - existingVpcCidrControl.setValue(''); - existingVpcCidrControl.clearValidators(); - existingVpcCidrControl.updateValueAndValidity(); - } - - ngOnInit() { - super.ngOnInit(); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, AwsVpcStepMapping); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(AwsVpcStepMapping); - this.storeDefaultLabels(AwsVpcStepMapping); - this.registerDefaultFileImportedHandler(this.eventFileImported, AwsVpcStepMapping); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - - // NOTE: we don't call this.registerFieldsAffectingStepDescription() with any fields, because all the relevant fields - // already trigger a step description change event in their own onChange handlers - - this.registerOnValueChange(AwsField.VPC_TYPE, this.onVpcTypeChange.bind(this)); - - const cidrFields = [AwsField.VPC_EXISTING_CIDR]; - cidrFields.forEach(cidrField => { - this.registerOnValueChange(cidrField, (cidr) => { - AppServices.messenger.publish({ - type: TanzuEventType.NETWORK_STEP_GET_NO_PROXY_INFO, - payload: { info: (cidr ? cidr + ',' : '') + '169.254.0.0/16' } - }); - this.triggerStepDescriptionChange(); - }); - }); - - /** - * Whenever aws region selection changes, update AZ subregion - */ - AppServices.messenger.subscribe(TanzuEventType.AWS_REGION_CHANGED, () => { - this.existingVpcs = []; - this.clearControlValue(AwsField.VPC_EXISTING_ID); - this.clearControlValue(AwsField.VPC_EXISTING_CIDR); - }, this.unsubscribe); - - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.AWS_GET_EXISTING_VPCS, this.onFetchedVpcs.bind(this)); - - this.registerOnValueChange(AwsField.VPC_NON_INTERNET_FACING, this.onNonInternetFacingVPCChange.bind(this)); - this.registerOnValueChange(AwsField.VPC_EXISTING_ID, this.onChangeExistingVpc.bind(this)); - } - - protected onStepStarted() { - this.chooseInitialVpcType(); - } - - private onFetchedVpcs(vpcs: Array) { - this.existingVpcs = vpcs; - this.loadingExistingVpcs = false; - } - - onNonInternetFacingVPCChange(checked: boolean) { - AppServices.messenger.publish({ - type: TanzuEventType.AWS_AIRGAPPED_VPC_CHANGE, - payload: checked === true - }); - } - - chooseInitialVpcType() { - const vpcType = VpcType.EXISTING; - this.formGroup.get(AwsField.VPC_TYPE).setValue(vpcType); - } - - /** - * @method setNewVpcValidators - * helper method to consolidate setting validators for new vpc fields and - * re-subscribe to vpc value changes - */ - setNewVpcValidators() { - this.defaultVpcHasChanged = false; - } - - setExistingVpcValidators() { - if (this.existingVpcs.length > 0) { - this.formGroup.get(AwsField.VPC_EXISTING_ID).setValidators([Validators.required]); - } - } - - /** - * @method onChangeExistingVpc - * helper method to manually set existing VPC CIDR read-only value, and - * dispatch message to retrieve VPC subnets by VPC ID - * @param existingVpcId - */ - onChangeExistingVpc(existingVpcId: any) { - if (!this.newVpcIdIsChangedValue(existingVpcId)) { - return; - } - this.curVpcId = existingVpcId; - - const existingVpc: Array = this.existingVpcs.filter((vpc) => { return vpc.id === existingVpcId; }); - const existingVpcCidr = existingVpc && existingVpc.length > 0 ? existingVpc[0].cidr : ''; - this.setControlValueSafely(AwsField.VPC_EXISTING_CIDR, existingVpcCidr); - - AppServices.messenger.publish({ - type: TanzuEventType.AWS_GET_SUBNETS, - payload: { vpcId: existingVpcId } - }); - - AppServices.messenger.publish(({ - type: TanzuEventType.AWS_VPC_CHANGED - })); - - this.triggerStepDescriptionChange(); - } - - dynamicDescription(): string { - const vpcType = this.getFieldValue(AwsField.VPC_TYPE); - const vpcExistingCidr = this.getFieldValue(AwsField.VPC_EXISTING_CIDR, true); - const vpcExistingId = this.getFieldValue(AwsField.VPC_EXISTING_ID, true); - - if (vpcType === VpcType.EXISTING && vpcExistingId && vpcExistingCidr) { - return 'VPC: ' + vpcExistingId + ' CIDR: ' + vpcExistingCidr; - } - if (vpcType === VpcType.NEW) { - return 'VPC: New'; - } - return 'Specify VPC settings for AWS'; - } - - protected storeUserData() { - this.storeUserDataFromMapping(AwsVpcStepMapping); - this.storeDefaultDisplayOrder(AwsVpcStepMapping); - } -} diff --git a/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.fieldmapping.ts b/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.fieldmapping.ts deleted file mode 100644 index 21ed3729c9..0000000000 --- a/tkg/web/src/app/views/landing/aws-wizard/vpc-step/vpc-step.fieldmapping.ts +++ /dev/null @@ -1,18 +0,0 @@ -// App imports -import { AwsField, VpcType } from '../aws-wizard.constants'; -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; - -export const AwsVpcStepMapping: StepMapping = { - fieldMappings: [ - { name: AwsField.VPC_TYPE, primaryTrigger: true }, - { name: AwsField.VPC_NEW_CIDR, label: 'VPC CIDR' }, - { name: AwsField.VPC_EXISTING_CIDR, label: 'VPC CIDR', doNotAutoRestore: true }, - { name: AwsField.VPC_EXISTING_ID, label: 'VPC ID', requiresBackendData: true }, - { name: AwsField.VPC_NON_INTERNET_FACING, defaultValue: false, isBoolean: true, label: 'THIS IS NOT AN INTERNET FACING VPC' }, - ] -} -// About AwsVpcStep: -// The first trigger field is whether the user wants and existing or new VPC. -// The VPC_EXISTING_ID field requires data from the back end, so it is requiresBackendData to prevent the value from being set before the -// backend data arrives. We rely on the handlers of the backend-data-arrived event to set the field value based on stored data. -// VPC_EXISTING_CIDR field is auto-set based on the VPC_EXISTING_ID field diff --git a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard-routing.moduel.ts b/tkg/web/src/app/views/landing/azure-wizard/azure-wizard-routing.moduel.ts deleted file mode 100644 index e16072aaf7..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard-routing.moduel.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Angular modules -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -// App imports -import { AzureWizardComponent } from './azure-wizard.component'; - -export const routes: Routes = [ - { - path: '', - component: AzureWizardComponent - } -]; - -/** - * @module AzureWizardRoutingModule - * @description - * This is routing module for the wizard module. - */ -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class AzureWizardRoutingModule {} diff --git a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.html b/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.html deleted file mode 100644 index 110f8c640a..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.html +++ /dev/null @@ -1,53 +0,0 @@ -
-
-
- -

-
- Deploy {{ clusterTypeDescriptorTitleCase }} Cluster on Azure -

- - - - -
-
- - - -
-
- - - -
-
- - - - - -
-
-
-
diff --git a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.scss b/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.scss deleted file mode 100644 index 30ffbbaaad..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.scss +++ /dev/null @@ -1,31 +0,0 @@ -@import '../../../../sass/properties.scss'; - -:host ::ng-deep button.clr-accordion-header-button { - font-size: 14px; - padding: 9px 18px; - color: #474747; - .clr-accordion-complete-icon { - color: #4C773C; - } -} - -clr-icon.back-link { - margin-right: 8px; - cursor: pointer; - position: relative; - top: 10px; - float:left; -} - -h2 { - margin-top: 0; -} - -@media (max-width: $small) { - .btn-container { - text-align: center; - .deploy-btn, .edit-btn { - width: 100%; - } - } -} diff --git a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.spec.ts b/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.spec.ts deleted file mode 100644 index 7dbf7f871b..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.spec.ts +++ /dev/null @@ -1,103 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -// App imports -import { APIClient } from 'src/app/swagger'; -import AppServices from '../../../shared/service/appServices'; -import { AzureForm } from './azure-wizard.constants'; -import { AzureProviderStepComponent } from './provider-step/azure-provider-step.component'; -import { AzureWizardComponent } from './azure-wizard.component'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { ClusterType, WizardForm } from "../wizard/shared/constants/wizard.constants"; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FieldMapUtilities } from '../wizard/shared/field-mapping/FieldMapUtilities'; -import { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms'; -import { Messenger } from 'src/app/shared/service/Messenger'; -import { MetadataStepComponent } from '../wizard/shared/components/steps/metadata-step/metadata-step.component'; -import { NodeSettingStepComponent } from './node-setting-step/node-setting-step.component'; -import { RouterTestingModule } from '@angular/router/testing'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { SharedNetworkStepComponent } from '../wizard/shared/components/steps/network-step/network-step.component'; -import { ValidationService } from '../wizard/shared/validation/validation.service'; -import { VnetStepComponent } from './vnet-step/vnet-step.component'; - -describe('AzureWizardComponent', () => { - let component: AzureWizardComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - ReactiveFormsModule, - BrowserAnimationsModule, - RouterTestingModule, - SharedModule - ], - providers: [ - APIClient, - FormBuilder, - ValidationService - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - - declarations: [AzureWizardComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - const fb = new FormBuilder(); - fixture = TestBed.createComponent(AzureWizardComponent); - component = fixture.componentInstance; - component.form = fb.group({ - azureProviderForm: fb.group({ - tenantId: [''] - }), - vnetForm: fb.group({ - vnetCidrBlock: [''] - }), - azureNodeSettingForm: fb.group({ - controlPlaneSetting: [''] - }), - metadataForm: fb.group({ - clusterLocation: [''] - }), - networkForm: fb.group({ - clusterServiceCidr: [''], - clusterPodCidr: [''], - cniType: [''] - }), - identityForm: fb.group({ - identityType: [''], - issuerURL: [''] - }), - ceipOptInForm: fb.group({ - ceipOptIn: [''] - }), - osImageForm: fb.group({ - }) - }); - component.clusterTypeDescriptor = '' + ClusterType.Management; - fixture.detectChanges(); - }); - - it('should generate cli', () => { - const path = '/testPath/xyz.yaml'; - expect(component.getCli(path)).toBe(`tanzu management-cluster create --file ${path} -v 6`); - }); - - it('should call api to create azure regional cluster', () => { - const apiSpy = spyOn(component['apiClient'], 'createAzureRegionalCluster').and.callThrough(); - component.createRegionalCluster({}); - expect(apiSpy).toHaveBeenCalled(); - }); - - it('should apply TKG config for azure', () => { - const apiSpy = spyOn(component['apiClient'], 'applyTKGConfigForAzure').and.callThrough(); - component.applyTkgConfig(); - expect(apiSpy).toHaveBeenCalled(); - }); -}); diff --git a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.ts b/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.ts deleted file mode 100644 index df0410d0f3..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.component.ts +++ /dev/null @@ -1,431 +0,0 @@ -// Angular imports -import { Component, ElementRef, OnInit } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; -import { Router } from '@angular/router'; -import { Title } from '@angular/platform-browser'; -// Third party imports -import { Observable } from 'rxjs'; -// App imports -import { APIClient } from 'src/app/swagger'; -import AppServices from '../../../shared/service/appServices'; -import { AzureClouds, AzureField, AzureForm, ResourceGroupOption, VnetOptionType } from './azure-wizard.constants'; -import { - AzureInstanceType, - AzureRegionalClusterParams, - AzureResourceGroup, - AzureVirtualMachine, - AzureVirtualNetwork -} from 'src/app/swagger/models'; -import { AzureAccountParamsKeys, AzureProviderStepComponent } from './provider-step/azure-provider-step.component'; -import { AzureOsImageStepComponent } from './os-image-step/azure-os-image-step.component'; -import { CliFields, CliGenerator } from '../wizard/shared/utils/cli-generator'; -import { VnetStepComponent } from './vnet-step/vnet-step.component'; -import { ExportService } from '../../../shared/service/export.service'; -import { FormDataForHTML, FormUtility } from '../wizard/shared/components/steps/form-utility'; -import { ImportParams, ImportService } from "../../../shared/service/import.service"; -import { NodeSettingField } from '../wizard/shared/components/steps/node-setting-step/node-setting-step.fieldmapping'; -import { NodeSettingStepComponent } from './node-setting-step/node-setting-step.component'; -import { OsImageField } from '../wizard/shared/components/steps/os-image-step/os-image-step.fieldmapping'; -import { TanzuEventType } from '../../../shared/service/Messenger'; -import { WizardBaseDirective } from '../wizard/shared/wizard-base/wizard-base'; -import { WizardForm } from '../wizard/shared/constants/wizard.constants'; - -@Component({ - selector: 'app-azure-wizard', - templateUrl: './azure-wizard.component.html', - styleUrls: ['./azure-wizard.component.scss'] -}) -export class AzureWizardComponent extends WizardBaseDirective implements OnInit { - constructor( - router: Router, - private importService: ImportService, - private exportService: ExportService, - formBuilder: FormBuilder, - private apiClient: APIClient, - titleService: Title, - el: ElementRef) { - - super(router, el, titleService, formBuilder); - } - - protected supplyFileImportedEvent(): TanzuEventType { - return TanzuEventType.AZURE_CONFIG_FILE_IMPORTED; - } - - protected supplyFileImportErrorEvent(): TanzuEventType { - return TanzuEventType.AZURE_CONFIG_FILE_IMPORT_ERROR; - } - - protected supplyWizardName(): string { - return 'AzureWizard'; - } - - protected supplyStepData(): FormDataForHTML[] { - return [ - this.AzureProviderForm, - this.AzureVnetForm, - this.AzureNodeSettingForm, - this.MetadataForm, - this.AzureNetworkForm, - this.IdentityForm, - this.AzureOsImageForm, - this.CeipForm, - ]; - } - - ngOnInit() { - super.ngOnInit(); - this.titleService.setTitle(this.title + ' Azure'); - this.registerServices(); - this.subscribeToServices(); - } - - // From the user-entered data, create an accountParams object to send to the azure endpoint for verification - private createCredentialParamsObject() { - const chosenCloudObject = this.getFieldValue(AzureForm.PROVIDER, AzureField.PROVIDER_AZURECLOUD); - const azureCloud = chosenCloudObject ? chosenCloudObject.name : ''; - return { - tenantId: this.getFieldValue(AzureForm.PROVIDER, AzureField.PROVIDER_TENANT), - clientId: this.getFieldValue(AzureForm.PROVIDER, AzureField.PROVIDER_CLIENT), - clientSecret: this.getFieldValue(AzureForm.PROVIDER, AzureField.PROVIDER_CLIENTSECRET), - subscriptionId: this.getFieldValue(AzureForm.PROVIDER, AzureField.PROVIDER_SUBSCRIPTION), - azureCloud - }; - } - - getPayload(): any { - const payload: AzureRegionalClusterParams = {}; - - payload.azureAccountParams = this.createCredentialParamsObject(); - - const mappings = [ - ["location", AzureForm.PROVIDER, AzureField.PROVIDER_REGION], - ["sshPublicKey", AzureForm.PROVIDER, AzureField.PROVIDER_SSHPUBLICKEY], - ]; - - mappings.forEach(attr => payload[attr[0]] = this.getFieldValue(attr[1], attr[2])); - - payload.controlPlaneFlavor = this.getStoredClusterPlan(AzureForm.NODESETTING); - const nodeTypeField = payload.controlPlaneFlavor === 'prod' ? NodeSettingField.INSTANCE_TYPE_PROD - : NodeSettingField.INSTANCE_TYPE_DEV; - payload.controlPlaneMachineType = this.getFieldValue(AzureForm.NODESETTING, nodeTypeField); - - payload.workerMachineType = AppServices.appDataService.isModeClusterStandalone() ? payload.controlPlaneMachineType : - this.getFieldValue(AzureForm.NODESETTING, NodeSettingField.WORKER_NODE_INSTANCE_TYPE); - payload.machineHealthCheckEnabled = - this.getBooleanFieldValue(AzureForm.NODESETTING, NodeSettingField.MACHINE_HEALTH_CHECKS_ENABLED); - - const resourceGroupOption = this.getFieldValue(AzureForm.PROVIDER, AzureField.PROVIDER_RESOURCEGROUPOPTION); - const resourceGroupField = resourceGroupOption === ResourceGroupOption.EXISTING ? AzureField.PROVIDER_RESOURCEGROUPEXISTING : - AzureField.PROVIDER_RESOURCEGROUPCUSTOM; - payload.resourceGroup = this.getFieldValue(AzureForm.PROVIDER, resourceGroupField); - payload.clusterName = this.getMCName(); - - // Retrieve vnet info - payload.vnetResourceGroup = this.getFieldValue(AzureForm.VNET, AzureField.VNET_RESOURCE_GROUP); - - const vnetOption = this.getFieldValue(AzureForm.VNET, AzureField.VNET_EXISTING_OR_CUSTOM); - let vnetAttrs = [ // For new vnet - ["vnetName", AzureForm.VNET, AzureField.VNET_CUSTOM_NAME], - ["vnetCidr", AzureForm.VNET, AzureField.VNET_CUSTOM_CIDR], - ["controlPlaneSubnet", AzureForm.VNET, AzureField.VNET_CONTROLPLANE_NEWSUBNET_NAME], - ["controlPlaneSubnetCidr", AzureForm.VNET, AzureField.VNET_CONTROLPLANE_NEWSUBNET_CIDR], - ["workerNodeSubnet", AzureForm.VNET, AzureField.VNET_WORKER_NEWSUBNET_NAME], - ["workerNodeSubnetCidr", AzureForm.VNET, AzureField.VNET_WORKER_NEWSUBNET_CIDR], - ]; - - if (vnetOption === VnetOptionType.EXISTING) { // for existing vnet - vnetAttrs = [ - ["vnetName", AzureForm.VNET, AzureField.VNET_EXISTING_NAME], - ["vnetCidr", AzureForm.VNET, AzureField.VNET_CUSTOM_CIDR], - ["controlPlaneSubnet", AzureForm.VNET, AzureField.VNET_CONTROLPLANE_SUBNET_NAME], - ["controlPlaneSubnetCidr", AzureForm.VNET, AzureField.VNET_CONTROLPLANE_SUBNET_CIDR], - ["workerNodeSubnet", AzureForm.VNET, AzureField.VNET_WORKER_SUBNET_NAME], - ]; - } - vnetAttrs.forEach(attr => payload[attr[0]] = this.getFieldValue(attr[1], attr[2])); - - payload.enableAuditLogging = this.getBooleanFieldValue(AzureForm.NODESETTING, NodeSettingField.ENABLE_AUDIT_LOGGING); - - this.initPayloadWithCommons(payload); - - // private Azure cluster support - payload.isPrivateCluster = this.getBooleanFieldValue(AzureForm.VNET, AzureField.VNET_PRIVATE_CLUSTER); - - payload.frontendPrivateIp = ""; - if (payload.isPrivateCluster) { - payload.frontendPrivateIp = this.getFieldValue(AzureForm.VNET, AzureField.VNET_PRIVATE_IP); - } - - return payload; - } - - setFromPayload(payload: AzureRegionalClusterParams) { - if (payload !== undefined) { - if (payload.azureAccountParams !== undefined) { - for (const accountFieldName of Object.keys(payload.azureAccountParams)) { - // we treat azureCloud differently because it's a listbox selection where the label != key - if (accountFieldName !== 'azureCloud') { - this.storeFieldString(AzureForm.PROVIDER, accountFieldName, payload.azureAccountParams[accountFieldName]); - } - } - const azureCloudValue = payload.azureAccountParams['azureCloud']; - const azureCloud = azureCloudValue ? AzureClouds.find(cloud => cloud.name === azureCloudValue) : undefined; - if (azureCloud) { - this.storeFieldString(AzureForm.PROVIDER, AzureField.PROVIDER_AZURECLOUD, azureCloud.name, azureCloud.displayName); - } - } - this.storeFieldString(AzureForm.PROVIDER, AzureField.PROVIDER_SSHPUBLICKEY, payload["sshPublicKey"]); - this.storeFieldString(AzureForm.PROVIDER, AzureField.PROVIDER_REGION, payload["location"]); - - this.setStoredClusterPlan(AzureForm.NODESETTING, payload.controlPlaneFlavor); - const instanceTypeField = payload.controlPlaneFlavor === 'prod' ? NodeSettingField.INSTANCE_TYPE_PROD - : NodeSettingField.INSTANCE_TYPE_DEV; - this.storeFieldString(AzureForm.NODESETTING, instanceTypeField, payload.controlPlaneMachineType); - - if (!AppServices.appDataService.isModeClusterStandalone()) { - this.storeFieldString(AzureForm.NODESETTING, NodeSettingField.WORKER_NODE_INSTANCE_TYPE, payload.workerMachineType); - } - this.storeFieldBoolean(AzureForm.NODESETTING, NodeSettingField.MACHINE_HEALTH_CHECKS_ENABLED, - payload.machineHealthCheckEnabled); - - // Since we cannot tell if the resource group is custom or existing, we load it into the custom field. - // When the resource groups are retrieved, we have code that will detect if the resource group is existing. - // See azure-provider-step.component.ts's handleIfSavedCustomResourceGroupIsNowExisting() - this.storeFieldString(AzureForm.PROVIDER, AzureField.PROVIDER_RESOURCEGROUPCUSTOM, payload.resourceGroup); - - this.saveMCName(payload.clusterName); - - // We cannot tell if the vnet is custom or existing, so we load it into the custom field. - // When the vnet resource groups are retrieved, we have code that will detect if the vnet is existing. - // See vnet-step.component.ts's handleIfSavedVnetCustomNameIsNowExisting() - const vnetAttrs = [ - ['vnetResourceGroup', AzureField.VNET_RESOURCE_GROUP], - ["vnetName", AzureField.VNET_CUSTOM_NAME], - ["vnetCidr", AzureField.VNET_CUSTOM_CIDR], - ["controlPlaneSubnet", AzureField.VNET_CONTROLPLANE_NEWSUBNET_NAME], - ["controlPlaneSubnetCidr", AzureField.VNET_CONTROLPLANE_NEWSUBNET_CIDR], - ["workerNodeSubnet", AzureField.VNET_WORKER_NEWSUBNET_NAME], - ["workerNodeSubnetCidr", AzureField.VNET_WORKER_NEWSUBNET_CIDR], - ]; - vnetAttrs.forEach(attr => payload[attr[0]] = this.storeFieldString(AzureForm.VNET, attr[1], payload[attr[0]])); - this.storeFieldBoolean(AzureForm.VNET, AzureField.VNET_PRIVATE_CLUSTER, payload.isPrivateCluster); - if (payload.isPrivateCluster) { - this.storeFieldString(AzureForm.VNET, AzureField.VNET_PRIVATE_IP, payload.frontendPrivateIp); - } - this.storeFieldBoolean(AzureForm.NODESETTING, NodeSettingField.ENABLE_AUDIT_LOGGING, payload.enableAuditLogging); - - this.storeFieldString(WizardForm.OSIMAGE, OsImageField.IMAGE, payload.os.name); - - this.saveCommonFieldsFromPayload(payload); - - AppServices.userDataService.updateWizardTimestamp(this.wizardName); - } - } - - /** - * @method method to trigger deployment - */ - createRegionalCluster(payload: any): Observable { - return this.apiClient.createAzureRegionalCluster(payload); - } - - /** - * Return management/standalone cluster name - */ - getMCName() { - return this.getFieldValue(AzureForm.NODESETTING, NodeSettingField.CLUSTER_NAME); - } - - saveMCName(clusterName: string) { - this.storeFieldString(AzureForm.NODESETTING, NodeSettingField.CLUSTER_NAME, clusterName); - } - - /** - * Get the CLI used to deploy the management/standalone cluster - */ - getCli(configPath: string): string { - const cliG = new CliGenerator(); - const cliParams: CliFields = { - configPath: configPath, - clusterType: this.getClusterType(), - clusterName: this.getMCName(), - extendCliCmds: [] - }; - return cliG.getCli(cliParams); - } - - getCliEnvVariables() { - let envVariableString = ''; - const resourceGroupOption = this.getFieldValue(AzureForm.PROVIDER, AzureField.PROVIDER_RESOURCEGROUPOPTION); - const azureResourceGroup = resourceGroupOption === ResourceGroupOption.EXISTING ? AzureField.PROVIDER_RESOURCEGROUPEXISTING : - AzureField.PROVIDER_RESOURCEGROUPCUSTOM; - const vnetOption = this.getFieldValue(AzureForm.VNET, AzureField.VNET_EXISTING_OR_CUSTOM); - const azureVnetName = vnetOption === VnetOptionType.EXISTING ? AzureField.VNET_EXISTING_NAME : AzureField.VNET_CUSTOM_NAME; - const azureControlPlaneSubnetName = vnetOption === VnetOptionType.EXISTING ? AzureField.VNET_CONTROLPLANE_SUBNET_NAME : - AzureField.VNET_CONTROLPLANE_NEWSUBNET_NAME; - const azureNodeSubnetName = vnetOption === VnetOptionType.EXISTING ? AzureField.VNET_WORKER_SUBNET_NAME : - AzureField.VNET_WORKER_NEWSUBNET_NAME; - const fieldsMapping = { - AZURE_RESOURCE_GROUP: [AzureForm.PROVIDER, azureResourceGroup], - AZURE_VNET_RESOURCE_GROUP: [AzureForm.VNET, AzureField.VNET_RESOURCE_GROUP], - AZURE_VNET_NAME: [AzureForm.VNET, azureVnetName], - AZURE_VNET_CIDR: [AzureForm.VNET, AzureField.VNET_CUSTOM_CIDR], - AZURE_CONTROL_PLANE_SUBNET_NAME: [AzureForm.VNET, azureControlPlaneSubnetName], - AZURE_CONTROL_PLANE_SUBNET_CIDR: [AzureForm.VNET, AzureField.VNET_CONTROLPLANE_NEWSUBNET_CIDR], - AZURE_NODE_SUBNET_NAME: [AzureForm.VNET, azureNodeSubnetName], - AZURE_NODE_SUBNET_CIDR: [AzureForm.VNET, AzureField.VNET_WORKER_NEWSUBNET_CIDR] - } - let fields = []; - if (vnetOption === VnetOptionType.EXISTING) { - fields = [ - 'AZURE_RESOURCE_GROUP', - 'AZURE_VNET_RESOURCE_GROUP', - 'AZURE_VNET_NAME', - 'AZURE_CONTROL_PLANE_SUBNET_NAME', - 'AZURE_NODE_SUBNET_NAME' - ]; - } else { - fields = [ - 'AZURE_RESOURCE_GROUP', - 'AZURE_VNET_RESOURCE_GROUP', - 'AZURE_VNET_NAME', - 'AZURE_VNET_CIDR', - 'AZURE_CONTROL_PLANE_SUBNET_NAME', - 'AZURE_CONTROL_PLANE_SUBNET_CIDR', - 'AZURE_NODE_SUBNET_NAME', - 'AZURE_NODE_SUBNET_CIDR' - ]; - } - fields.forEach(field => { - const temp = fieldsMapping[field]; - envVariableString += `${field}="${this.getFieldValue(temp[0], temp[1])}" `; - }); - return envVariableString; - } - - applyTkgConfig() { - return this.apiClient.applyTKGConfigForAzure({ params: this.getPayload() }); - } - - /** - * Retrieve the config file from the backend and return as a string - */ - retrieveExportFile() { - return this.apiClient.exportTKGConfigForAzure({ params: this.getPayload() }); - } - - exportConfiguration() { - const wizard = this; // capture 'this' outside the context of the closure below - this.exportService.export( - this.retrieveExportFile(), - (failureMessage) => { wizard.displayError(failureMessage); } - ); - } - - // HTML convenience methods - // - get AzureProviderForm(): FormDataForHTML { - return { name: AzureForm.PROVIDER, title: 'IaaS Provider', description: 'Validate the Azure provider credentials for Tanzu', - i18n: {title: 'IaaS provder step name', description: 'IaaS provder step description'}, - clazz: AzureProviderStepComponent}; - } - get AzureVnetForm(): FormDataForHTML { - return { name: AzureForm.VNET, title: 'Azure VNet Settings', description: 'Specify an Azure VNet CIDR', - i18n: {title: 'vnet step name', description: 'vnet step description'}, - clazz: VnetStepComponent}; - } - get AzureNodeSettingForm(): FormDataForHTML { - return { name: AzureForm.NODESETTING, title: FormUtility.titleCase(this.clusterTypeDescriptor) + ' Cluster Settings', - description: `Specifying the resources backing the ${this.clusterTypeDescriptor} cluster`, - i18n: {title: 'node setting step name', description: 'node setting step description'}, - clazz: NodeSettingStepComponent}; - } - get AzureOsImageForm(): FormDataForHTML { - return this.getOsImageForm(AzureOsImageStepComponent); - } - get AzureNetworkForm(): FormDataForHTML { - return FormUtility.formWithOverrides(this.NetworkForm, {description: 'Specify an Azure VNet CIDR'}); - } - // - // HTML convenience methods - - // returns TRUE if the file contents appear to be a valid config file for Azure - // returns FALSE if the file is empty or does not appear to be valid. Note that in the FALSE - // case we also alert the user. - importFileValidate(nameFile: string, fileContents: string): boolean { - if (fileContents.includes('AZURE_')) { - return true; - } - alert(nameFile + ' is not a valid Azure configuration file!'); - return false; - } - - importFileRetrieveClusterParams(fileContents: string): Observable { - return this.apiClient.importTKGConfigForAzure( { params: { filecontents: fileContents } } ); - } - - importFileProcessClusterParams(event: TanzuEventType, nameFile: string, azureClusterParams: AzureRegionalClusterParams) { - this.setFromPayload(azureClusterParams); - this.resetToFirstStep(); - this.importService.publishImportSuccess(event, nameFile); - } - - // returns TRUE if user (a) will not lose data on import, or (b) confirms it's OK - onImportButtonClick() { - let result = true; - if (!this.isOnFirstStep()) { - result = confirm('Importing will overwrite any data you have entered. Proceed with import?'); - } - return result; - } - - onImportFileSelected(event) { - const params: ImportParams = { - eventSuccess: this.supplyFileImportedEvent(), - eventFailure: this.supplyFileImportErrorEvent(), - file: event.target.files[0], - validator: this.importFileValidate, - backend: this.importFileRetrieveClusterParams.bind(this), - onSuccess: this.importFileProcessClusterParams.bind(this), - onFailure: this.importService.publishImportFailure - } - this.importService.import(params); - - // clear file reader target so user can re-select same file if needed - event.target.value = ''; - } - - private subscribeToServices() { - AppServices.messenger.subscribe(TanzuEventType.AZURE_REGION_CHANGED, event => { - const region = event.payload; - if (region) { - AppServices.dataServiceRegistrar.trigger([ - TanzuEventType.AZURE_GET_RESOURCE_GROUPS, - TanzuEventType.AZURE_GET_INSTANCE_TYPES - ], { location: region }); - AppServices.dataServiceRegistrar.trigger([TanzuEventType.AZURE_GET_OS_IMAGES]); - } else { - AppServices.dataServiceRegistrar.clear(TanzuEventType.AZURE_GET_RESOURCE_GROUPS); - AppServices.dataServiceRegistrar.clear(TanzuEventType.AZURE_GET_INSTANCE_TYPES); - AppServices.dataServiceRegistrar.clear(TanzuEventType.AZURE_GET_OS_IMAGES); - } - }); - } - - private registerServices() { - const wizard = this; - AppServices.dataServiceRegistrar.register(TanzuEventType.AZURE_GET_RESOURCE_GROUPS, - (payload: {location: string}) => { return wizard.apiClient.getAzureResourceGroups(payload); }, - "Failed to retrieve resource groups for the particular region." ); - AppServices.dataServiceRegistrar.register(TanzuEventType.AZURE_GET_INSTANCE_TYPES, - (payload: {location: string}) => { return wizard.apiClient.getAzureInstanceTypes(payload); }, - "Failed to retrieve Azure VM sizes" ); - AppServices.dataServiceRegistrar.register(TanzuEventType.AZURE_GET_OS_IMAGES, - () => { return wizard.apiClient.getAzureOSImages(); }, - "Failed to retrieve list of OS images from the specified Azure Server." ); - AppServices.dataServiceRegistrar.register(TanzuEventType.AZURE_GET_VNETS, - (payload: {resourceGroupName: string, location: string}) => { return wizard.apiClient.getAzureVnets(payload)}, - "Failed to retrieve list of VNets from the specified Azure Server." ); - } -} diff --git a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.constants.ts b/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.constants.ts deleted file mode 100644 index 57f3cfefc1..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.constants.ts +++ /dev/null @@ -1,64 +0,0 @@ -export enum ResourceGroupOption { - EXISTING = 'existing', - CUSTOM = 'custom', -} -export enum VnetOptionType { - EXISTING = 'existing', - CUSTOM = 'custom', -} -export enum AzureCloud { - PUBLIC = 'AzurePublicCloud', - GOVT = 'AzureUSGovernmentCloud', -} -// Order is important here: we default to the first AzureCloud -export const AzureClouds = [ - { - name: AzureCloud.PUBLIC, - displayName: 'Public Cloud' - }, - { - name: AzureCloud.GOVT, - displayName: 'US Government Cloud' - } -]; -export enum AzureForm { - PROVIDER = 'azureProviderForm', - NODESETTING = 'azureNodeSettingForm', - VNET = 'vnetForm' -} -export enum AzureField { -/* - NOTE: these enum values are used by backend endpoints, so do not change them: - PROVIDER_AZURECLOUD - PROVIDER_CLIENT, - PROVIDER_CLIENTSECRET, - PROVIDER_SUBSCRIPTION, - PROVIDER_TENANT, -*/ - PROVIDER_AZURECLOUD = 'azureCloud', - PROVIDER_CLIENT = 'clientId', - PROVIDER_CLIENTSECRET = 'clientSecret', - PROVIDER_REGION = 'region', - PROVIDER_RESOURCEGROUPCUSTOM = 'resourceGroupCustom', - PROVIDER_RESOURCEGROUPEXISTING = 'resourceGroupExisting', - PROVIDER_RESOURCEGROUPOPTION = 'resourceGroupOption', - PROVIDER_SSHPUBLICKEY = 'sshPublicKey', - PROVIDER_SUBSCRIPTION = 'subscriptionId', - PROVIDER_TENANT = 'tenantId', - - VNET_CUSTOM_NAME = 'vnetNameCustom', - VNET_CUSTOM_CIDR = 'vnetCidrBlock', - VNET_EXISTING_NAME = 'vnetNameExisting', - VNET_EXISTING_OR_CUSTOM = 'vnetOption', - VNET_PRIVATE_CLUSTER = 'privateAzureCluster', - VNET_PRIVATE_IP = 'privateIP', - VNET_RESOURCE_GROUP = 'vnetResourceGroup', - // subnet fields: - VNET_CONTROLPLANE_NEWSUBNET_CIDR = 'controlPlaneSubnetCidrNew', - VNET_CONTROLPLANE_NEWSUBNET_NAME = 'controlPlaneSubnetNew', - VNET_CONTROLPLANE_SUBNET_CIDR = 'controlPlaneSubnetCidr', - VNET_CONTROLPLANE_SUBNET_NAME = 'controlPlaneSubnet', - VNET_WORKER_SUBNET_NAME = 'workerNodeSubnet', - VNET_WORKER_NEWSUBNET_CIDR = 'workerNodeSubnetCidrNew', - VNET_WORKER_NEWSUBNET_NAME = 'workerNodeSubnetNew', -} diff --git a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.module.ts b/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.module.ts deleted file mode 100644 index e05d0eb310..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/azure-wizard.module.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { NgModule } from '@angular/core'; - -import { AzureWizardRoutingModule } from './azure-wizard-routing.moduel'; -import { ValidationService } from '../wizard/shared/validation/validation.service'; -import { AzureWizardComponent } from './azure-wizard.component'; -import { AzureProviderStepComponent } from './provider-step/azure-provider-step.component'; -import { CommonModule } from '@angular/common'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { LandingModule } from '../landing.module'; - -import { NodeSettingStepComponent } from './node-setting-step/node-setting-step.component'; -import { VnetStepComponent } from './vnet-step/vnet-step.component'; -import { WizardSharedModule } from '../wizard/shared/wizard-shared.module'; - -@NgModule({ - declarations: [ - AzureWizardComponent, - AzureProviderStepComponent, - VnetStepComponent, - NodeSettingStepComponent, - ], - imports: [ - CommonModule, - AzureWizardRoutingModule, - SharedModule, - LandingModule, - WizardSharedModule - ], - providers: [ - ValidationService - ] -}) -export class AzureWizardModule { } diff --git a/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.html b/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.html deleted file mode 100644 index e16b97a86a..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.html +++ /dev/null @@ -1,184 +0,0 @@ -
-

- {{ clusterTypeDescriptorTitleCase }} Cluster Settings -

- - - -
-
- - - - - - - {{ clusterTypeDescriptorTitleCase }} Cluster name must start and end with a letter or number, and can contain only - lowercase letters, numbers, and hyphens. - - - {{ clusterTypeDescriptorTitleCase }} Cluster name must not include whitespace on ends. - - - Cluster name is required - - -
-
- - - - Selecting a worker node instance type is required - -
-
- - - - - - - -
-
-
-
- -
-
-
diff --git a/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.scss b/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.scss deleted file mode 100644 index cd71bd7b3a..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.scss +++ /dev/null @@ -1,68 +0,0 @@ -.card-icon { - position: relative; - left: 43%; -} - -.card-title { - text-align: center; -} - -.card-selected { - box-shadow: 0 .15rem 0 0 var(--clr-card-clickable-box-shadow-color); - border-style: solid; - transform: translateY(-.1rem); - transition: border .2s ease,transform .2s ease,-webkit-transform .2s ease; - border-color: var(--clr-card-clickable-border-color, #179bd3); -} - -.card-footer { - .clr-row { - align-items: baseline; - } -} - -.ha-template { - display: inline-block; -} - -.refresh-btn { - cursor: pointer; - margin-left: 10px; - display: inline-block; - - .refresh-label { - padding: 5px; - position: relative; - top: 2px; - } -} - -.node-type-container { - max-width: 50%; -} - -.node-type-select { - display: inline-block; - max-width: 220px; -} - -// tooltip max-width fix -:host ::ng-deep clr-tooltip { - clr-tooltip-content { - max-width: 300px; - } -} - -.clr-row { - &.showAdvanced { - display: none; - } -} - -.current-region { - margin-left: 2em; - font-weight: 200; -} - - - diff --git a/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.spec.ts b/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.spec.ts deleted file mode 100644 index 194924f8c0..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.spec.ts +++ /dev/null @@ -1,111 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -// App imports -import { APIClient } from '../../../../swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { AzureForm } from '../azure-wizard.constants'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { NodeSettingField } from '../../wizard/shared/components/steps/node-setting-step/node-setting-step.fieldmapping'; -import { NodeSettingStepComponent } from './node-setting-step.component'; -import { SharedModule } from '../../../../shared/shared.module'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; - -describe('NodeSettingStepComponent', () => { - let component: NodeSettingStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - ValidationService, - FormBuilder, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [NodeSettingStepComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - - fixture = TestBed.createComponent(NodeSettingStepComponent); - component = fixture.componentInstance; - component.setStepRegistrantData({ wizard: 'EggplantWizard', step: AzureForm.NODESETTING, - formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.AZURE_CONFIG_FILE_IMPORTED, - eventFileImportError: TanzuEventType.AZURE_CONFIG_FILE_IMPORT_ERROR}); - - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should be invalid when cluster name has leading/trailing spaces', () => { - fixture.whenStable().then(() => { - component.formGroup.get(NodeSettingField.CLUSTER_NAME).setValue(" test"); - expect(component.formGroup.valid).toBeFalsy(); - component.formGroup.get(NodeSettingField.CLUSTER_NAME).setValue("test "); - expect(component.formGroup.valid).toBeFalsy(); - }); - }); - - xit('Dev instance type should be reset if control plane is prod', () => { - fixture.whenStable().then(() => { - component.formGroup.get("devInstanceType").setValue("t3.small"); - const cards = fixture.debugElement.queryAll(By.css("a.card")); - cards[1].triggerEventHandler('click', {}); - expect(component.formGroup.get("devInstanceType").value).toBeFalsy(); - }); - }); - - xit('Prod instance type should be reset if control plane is dev', () => { - fixture.whenStable().then(() => { - component.formGroup.get("prodInstanceType").setValue("t3.small"); - const cards = fixture.debugElement.queryAll(By.css("a.card")); - cards[0].triggerEventHandler('click', {}); - expect(component.formGroup.get("prodInstanceType").value).toBeFalsy(); - }); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.ngOnInit(); - component.clearClusterPlan(); - - const staticDescription = component.dynamicDescription(); - expect(staticDescription).toEqual('Specify the resources backing the cluster'); - - component.setClusterTypeDescriptor('FUDGE'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'EggplantWizard', - step: AzureForm.NODESETTING, - description: 'Specify the resources backing the FUDGE cluster', - } - }); - - component.cardClickProd(); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'EggplantWizard', - step: AzureForm.NODESETTING, - description: 'Production cluster selected: 3 node control plane', - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.ts b/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.ts deleted file mode 100644 index 7096002479..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -// App imports -import AppServices from '../../../../shared/service/appServices'; -import { AzureInstanceType } from 'src/app/swagger/models'; -import { NodeSettingField } from '../../wizard/shared/components/steps/node-setting-step/node-setting-step.fieldmapping'; -import { NodeSettingStepDirective } from '../../wizard/shared/components/steps/node-setting-step/node-setting-step.component'; -import { TanzuEventType } from '../../../../shared/service/Messenger'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; - -@Component({ - selector: 'app-node-setting-step', - templateUrl: './node-setting-step.component.html', - styleUrls: ['./node-setting-step.component.scss'] -}) -export class NodeSettingStepComponent extends NodeSettingStepDirective implements OnInit { - constructor(protected validationService: ValidationService) { - super(validationService); - } - - protected getKeyFromNodeInstance(nodeInstance: AzureInstanceType): string { - return nodeInstance.name; - } - - protected getDisplayFromNodeInstance(nodeInstance: AzureInstanceType): string { - return nodeInstance.name; - } - - protected subscribeToServices() { - AppServices.dataServiceRegistrar.stepSubscribe(this, - TanzuEventType.AZURE_GET_INSTANCE_TYPES, this.onFetchedInstanceTypes.bind(this)) - } - - private onFetchedInstanceTypes(instanceTypes: AzureInstanceType[]) { - this.nodeTypes = instanceTypes.sort(); - if (!this.modeClusterStandalone && this.nodeTypes.length === 1) { - this.formGroup.get(NodeSettingField.WORKER_NODE_INSTANCE_TYPE).setValue(this.nodeTypes[0].name); - } - } -} diff --git a/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.fieldmapping.ts b/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.fieldmapping.ts deleted file mode 100644 index 5e32ed49d4..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/node-setting-step/node-setting-step.fieldmapping.ts +++ /dev/null @@ -1,2 +0,0 @@ -// About AzureNodeSettingStandaloneStep: -// Uses shared node setting component diff --git a/tkg/web/src/app/views/landing/azure-wizard/os-image-step/azure-os-image-step.component.ts b/tkg/web/src/app/views/landing/azure-wizard/os-image-step/azure-os-image-step.component.ts deleted file mode 100644 index c732d81e45..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/os-image-step/azure-os-image-step.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -// App imports -import { AzureVirtualMachine } from '../../../../swagger/models'; -import { OsImageProviderInputs, SharedOsImageStepDirective } from '../../wizard/shared/components/steps/os-image-step/os-image-step.component'; -import { TanzuEventType } from '../../../../shared/service/Messenger'; - -@Component({ - selector: 'app-azure-os-image-step', - templateUrl: '../../wizard/shared/components/steps/os-image-step/os-image-step.component.html', - styleUrls: ['../../wizard/shared/components/steps/os-image-step/os-image-step.component.scss'] -}) -export class AzureOsImageStepComponent extends SharedOsImageStepDirective implements OnInit { - protected supplyProviderInputs(): OsImageProviderInputs { - return { - event: TanzuEventType.AZURE_GET_OS_IMAGES, - eventImportFileFailure: TanzuEventType.AZURE_CONFIG_FILE_IMPORT_ERROR, - eventImportFileSuccess: TanzuEventType.AZURE_CONFIG_FILE_IMPORTED, - noImageAlertMessage: '', - osImageTooltipContent: 'Select a base OS image that you have already imported ' + - 'into your Azure account. If no compatible OS image is present, import one into ' + - 'Azure and click the Refresh button', - }; - } -} diff --git a/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.html b/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.html deleted file mode 100644 index c971315c2a..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.html +++ /dev/null @@ -1,281 +0,0 @@ -
- - - -
-
- - - - - - - Azure tenant ID cannot be empty - - -
-
- - - - - - - Azure client ID cannot be empty - - -
-
- - - - - - - Azure client secret cannot be empty - - -
-
-
-
- - - - - - - Subscription ID cannot be empty - - -
-
- - - - - Azure Environment is required - - - - Loading... - -
-
- -
-
- -
-
- -
-
- - - - - - - Azure Region is required - - - - Loading... - -
-
-
-
- - - - - - - SSH public key is required - - -
-
- -
- - - - - - - - - - - Must select an option for entering the resource group! - -
- -
-
- - - - - - - Azure Resource Group is required - - -
-
- -
-
- - - - - - - Resource Group Name cannot be empty - - - Resource Group Name format is invalid - - - Resource Group Name already exists - - -
-
-
diff --git a/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.scss b/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.scss deleted file mode 100644 index b44941bcd6..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.scss +++ /dev/null @@ -1,18 +0,0 @@ -.clr-textarea { - width: 500px; - height: 120px; -} - -.create-button { - display: flex; - align-items: flex-end; - margin-bottom: -0.5em; -} -.region-container { - position: relative; -} -.spinner { - position: absolute; - bottom: 0; - left: 50px; -} diff --git a/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.spec.ts b/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.spec.ts deleted file mode 100644 index a60291ef7f..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.spec.ts +++ /dev/null @@ -1,170 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; -// Third party imports -import { Observable, of, throwError } from 'rxjs'; -// App imports -import { APIClient } from '../../../../swagger/api-client.service'; -import AppServices from '../../../../shared/service/appServices'; -import { AzureField, AzureForm } from '../azure-wizard.constants'; -import { AzureProviderStepComponent } from './azure-provider-step.component'; -import { AzureResourceGroup } from '../../../../swagger/models'; -import { DataServiceRegistrarTestExtension } from '../../../../testing/data-service-registrar.testextension'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { SharedModule } from '../../../../shared/shared.module'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; - -describe('AzureProviderStepComponent', () => { - let component: AzureProviderStepComponent; - let fixture: ComponentFixture; - let apiService: APIClient; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule, - BrowserAnimationsModule - ], - providers: [ - ValidationService, - FormBuilder, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [AzureProviderStepComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - AppServices.dataServiceRegistrar = new DataServiceRegistrarTestExtension(); - apiService = TestBed.inject(APIClient); - - fixture = TestBed.createComponent(AzureProviderStepComponent); - component = fixture.componentInstance; - component.setStepRegistrantData({ wizard: 'CarrotWizard', step: AzureForm.PROVIDER, formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.AZURE_CONFIG_FILE_IMPORTED, eventFileImportError: TanzuEventType.AZURE_CONFIG_FILE_IMPORT_ERROR}); - component.ngOnInit(); - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should setup AZURE_GET_RESOURCE_GROUPS event handler', () => { - const dataServiceRegistrar = AppServices.dataServiceRegistrar as DataServiceRegistrarTestExtension; - // The wizard is expected to have registered this event - dataServiceRegistrar.simulateRegistration(TanzuEventType.AZURE_GET_RESOURCE_GROUPS); - - component.ngOnInit(); - dataServiceRegistrar.simulateError(TanzuEventType.AZURE_GET_RESOURCE_GROUPS, 'test error'); - expect(component.errorNotification).toBe('test error'); - - const resourceGroup = [ - {id: 1, location: 'us-west', name: 'resource-group1'}, - {id: 2, location: 'us-east', name: 'resource-group2'}, - {id: 3, location: 'us-south', name: 'resource-group3'} - ]; - dataServiceRegistrar.simulateData(TanzuEventType.AZURE_GET_RESOURCE_GROUPS, resourceGroup); - expect(component.resourceGroups).toEqual(resourceGroup); - }); - - it('should init azure credentials', () => { - spyOn(apiService, 'getAzureEndpoint').and.returnValue(of({ - tenantId: "azure-tenant1", - clientId: "azure-client-12343", - clientSecret: "", - subscriptionId: "azure-subscription-12342-asdf3" - })); - component.initAzureCredentials(); - expect(component.formGroup.controls['tenantId'].value).toBe('azure-tenant1'); - }); - - it('should show error message when the credential can not be retrieved', () => { - spyOn(apiService, 'getAzureEndpoint').and.returnValue(throwError(new Error('oops!'))); - component.initAzureCredentials(); - expect(component.errorNotification).toBe('Unable to retrieve Azure credentials'); - }); - - it('should fetch regions information', () => { - const regions = [ - {name: 'westus', displayName: 'West US'}, - {name: 'northcentralus', displayName: 'North central US'}, - {name: 'southcentralus', displayName: 'South central US'} - ]; - - spyOn(apiService, 'getAzureRegions').and.returnValue(of(regions)); - component.getRegions(); - expect(component.loadingRegions).toBeFalsy(); - expect(component.regions).toEqual(regions); - }); - - it('should show error message when the region info can not be retrieved', () => { - spyOn(apiService, 'getAzureRegions').and.returnValue(throwError(new Error('oops!'))); - component.getRegions(); - expect(component.errorNotification).toBe('Unable to retrieve Azure regions'); - }); - - it('should verify credentials', () => { - spyOn(apiService, 'setAzureEndpoint').and.returnValues(new Observable(subscriber => { - subscriber.next(); - })); - const regions = spyOn(component, 'getRegions').and.stub(); - component.verifyCredentials(); - expect(component.errorNotification).toBe(''); - expect(component.validCredentials).toBeTruthy(); - expect(regions).toHaveBeenCalled(); - }); - - it('should show error message if credential can not be verified', () => { - spyOn(apiService, 'setAzureEndpoint').and.returnValue(throwError({error: {message: 'oops!'}})); - component.verifyCredentials(); - expect(component.errorNotification).toBe('oops!'); - expect(component.validCredentials).toBeFalsy(); - expect(component.regions).toEqual([]); - expect(component.formGroup.get('region').value).toBe(''); - }); - - it('should show different resource based on option', () => { - component.showResourceGroupExisting(); - expect(component.formGroup.get(AzureField.PROVIDER_RESOURCEGROUPCUSTOM).value).toBe(''); - component.showResourceGroupCustom(); - expect(component.formGroup.get(AzureField.PROVIDER_RESOURCEGROUPEXISTING).value).toBe(''); - }); - - it('should handle resource group name change', () => { - const messengerSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.onResourceGroupNameChange(); - expect(messengerSpy).toHaveBeenCalled(); - expect(messengerSpy).toHaveBeenCalledWith({ - type: TanzuEventType.AZURE_RESOURCEGROUP_CHANGED, - payload: '' - }); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - const tenantControl = component.formGroup.get('tenantId'); - tenantControl.setValue(''); - - const description = component.dynamicDescription(); - expect(description).toEqual('Validate the Azure provider credentials for Tanzu'); - - tenantControl.setValue('RIDDLER'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'CarrotWizard', - step: AzureForm.PROVIDER, - description: 'Azure tenant: RIDDLER', - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.ts b/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.ts deleted file mode 100644 index b52bbadc36..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.component.ts +++ /dev/null @@ -1,345 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { Validators } from '@angular/forms'; -import { ClrLoadingState } from "@clr/angular"; -// Third party imports -import { debounceTime, distinctUntilChanged, finalize, takeUntil } from 'rxjs/operators'; -// App imports -import { APIClient } from '../../../../swagger/api-client.service'; -import AppServices from '../../../../shared/service/appServices'; -import { AzureClouds, AzureField, ResourceGroupOption } from '../azure-wizard.constants'; -import { AzureProviderStepMapping } from './azure-provider-step.fieldmapping'; -import { AzureResourceGroup } from '../../../../swagger/models/azure-resource-group.model'; -import { StepFormDirective } from '../../wizard/shared/step-form/step-form'; -import { TanzuEventType } from '../../../../shared/service/Messenger'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; - -// NOTE: the keys of AzureAccountParamsKeys values are used by backend endpoints, so don't change them -export const AzureAccountParamsKeys = [AzureField.PROVIDER_TENANT, AzureField.PROVIDER_CLIENT, - AzureField.PROVIDER_CLIENTSECRET, AzureField.PROVIDER_SUBSCRIPTION, AzureField.PROVIDER_AZURECLOUD]; - -@Component({ - selector: 'app-azure-provider-step', - templateUrl: './azure-provider-step.component.html', - styleUrls: ['./azure-provider-step.component.scss'] -}) -export class AzureProviderStepComponent extends StepFormDirective implements OnInit { - successImportFile: string; - - loadingRegions = false; - loadingState: ClrLoadingState = ClrLoadingState.DEFAULT; - resourceGroupOption = ResourceGroupOption.EXISTING; - - regions = []; - azureClouds = AzureClouds; - resourceGroups = []; - validCredentials = false; - - resourceGroupCreationState = 'create'; - - private stepMapping: StepMapping; - - constructor(private apiClient: APIClient, - private validationService: ValidationService) { - super(); - } - - private subscribeToServices() { - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.AZURE_GET_RESOURCE_GROUPS, - this.onFetchedResourceGroups.bind(this)); - } - - private onFetchedResourceGroups(azureResourceGroups: AzureResourceGroup[]) { - this.resourceGroups = azureResourceGroups; - if (azureResourceGroups.length === 1) { - this.formGroup.get(AzureField.PROVIDER_RESOURCEGROUPEXISTING).setValue(azureResourceGroups[0].name); - } else { - this.initResourceGroupFromSavedData(); - } - } - - private customizeForm() { - this.formGroup['canMoveToNext'] = () => { - return this.formGroup.valid && this.validCredentials; - } - - this.registerStepDescriptionTriggers({fields: [AzureField.PROVIDER_TENANT]}); - - this.formGroup.valueChanges - .pipe( - debounceTime(200), - distinctUntilChanged((prev, curr) => { - for (const key of AzureAccountParamsKeys) { - if (prev[key] !== curr[key]) { - return false; - } - } - return true; - }), - takeUntil(this.unsubscribe) - ) - .subscribe( - () => { - this.validCredentials = false - } - ); - - this.formGroup.get(AzureField.PROVIDER_REGION).valueChanges - .pipe( - distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), - takeUntil(this.unsubscribe) - ).subscribe((val) => { - this.onRegionChange(val) - }); - - // handle file import - AppServices.messenger.subscribe(this.eventFileImported, this.onFileImported.bind(this)); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - } - - private onFileImported(data: any) { - this.defaultFileImportedHandler(this.stepMapping)(data); - // After the storing of the imported data, we invalidate the credentials to ensure the user has to connect (perhaps again). - // In theory this would not be necessary since changing the values of the credential fields should also cause this to happen. - this.setValidCredentials(false); - } - - private findAzureCloudByName(cloudName: string) { - return AzureClouds.find(azureCloud => azureCloud.name === cloudName); - } - - /** - * Set the hidden form field to proper value based on form validity - * @param valid whether we want the form to be valid - */ - setValidCredentials(valid) { - this.validCredentials = valid; - } - - ngOnInit() { - super.ngOnInit(); - - this.stepMapping = this.createStepMapping(); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, this.stepMapping); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(this.stepMapping); - this.storeDefaultLabels(this.stepMapping); - - this.customizeForm(); - this.subscribeToServices(); - - this.initAzureCredentials(); - this.showResourceGroupExisting(); - } - - private initResourceGroupFromSavedData() { - // if the user did an import, then we expect the value to be stored in AzureField.PROVIDER_RESOURCEGROUPCUSTOM - // we'll check and see if that value is now existing - let savedGroupExisting = this.getStoredValue(AzureField.PROVIDER_RESOURCEGROUPEXISTING, this.stepMapping, ''); - let savedGroupCustom = this.getStoredValue(AzureField.PROVIDER_RESOURCEGROUPCUSTOM, this.stepMapping, ''); - - if (this.handleIfSavedCustomResourceGroupIsNowExisting(savedGroupCustom)) { - savedGroupExisting = savedGroupCustom; - savedGroupCustom = ''; - } - - if (savedGroupCustom !== '') { - this.formGroup.get(AzureField.PROVIDER_RESOURCEGROUPCUSTOM).setValue(savedGroupCustom); - this.showResourceGroup(ResourceGroupOption.CUSTOM); - } else if (savedGroupExisting !== '') { - this.formGroup.get(AzureField.PROVIDER_RESOURCEGROUPEXISTING).setValue(savedGroupExisting); - this.showResourceGroup(ResourceGroupOption.EXISTING); - } else { - this.showResourceGroup(this.resourceGroupOption); - } - } - - initAzureCredentials() { - this.apiClient.getAzureEndpoint() - .pipe(takeUntil(this.unsubscribe)) - .subscribe( - credentials => { - this.setAzureCredentialsValuesFromAPI(credentials); - }, - () => { - this.errorNotification = 'Unable to retrieve Azure credentials'; - }, - () => { } - ); - } - - private setAzureCredentialsValuesFromAPI(credentials) { - // init form values for Azure credentials - for (const accountParamField of AzureAccountParamsKeys) { - this.setControlValueSafely(accountParamField, credentials[accountParamField]); - } - } - - getRegions() { - this.loadingRegions = true; - this.apiClient.getAzureRegions() - .pipe( - finalize(() => { - this.loadingRegions = false; - }), - takeUntil(this.unsubscribe) - ) - .subscribe( - regions => { - this.regions = regions.sort((regionA, regionB) => regionA.name.localeCompare(regionB.name)); - const savedRegion = this.getStoredValue(AzureField.PROVIDER_REGION, this.stepMapping, ''); - const selectedRegion = this.regions.length === 1 ? this.regions[0].name : savedRegion; - // setting the region value will trigger other data calls to the back end for resource groups, osimages, etc - this.setControlValueSafely(AzureField.PROVIDER_REGION, selectedRegion); - }, - () => { - this.errorNotification = 'Unable to retrieve Azure regions'; - }, - () => { } - ); - } - - // From the user-entered data, create an accountParams object to send to the azure endpoint for verification - private createCredentialParamsObject() { - const chosenCloudObject = this.getFieldValue(AzureField.PROVIDER_AZURECLOUD); - const azureCloud = chosenCloudObject ? chosenCloudObject.name : ''; - return { - tenantId: this.getFieldValue(AzureField.PROVIDER_TENANT), - clientId: this.getFieldValue(AzureField.PROVIDER_CLIENT), - clientSecret: this.getFieldValue(AzureField.PROVIDER_CLIENTSECRET), - subscriptionId: this.getFieldValue(AzureField.PROVIDER_SUBSCRIPTION), - azureCloud - }; - } - - /** - * @method verifyCredentials - * helper method to verify Azure connection credentials - */ - verifyCredentials() { - this.loadingState = ClrLoadingState.LOADING - this.errorNotification = ''; - this.apiClient.setAzureEndpoint({ - accountParams: this.createCredentialParamsObject() - }) - .pipe( - finalize(() => this.loadingState = ClrLoadingState.DEFAULT), - takeUntil(this.unsubscribe) - ) - .subscribe( - (() => { - this.errorNotification = ''; - this.setValidCredentials(true); - this.getRegions(); - }), - (err => { - const error = err.error.message || err.message || JSON.stringify(err); - this.errorNotification = `${error}`; - this.setValidCredentials(false); - this.regions = []; - this.setControlValueSafely(AzureField.PROVIDER_REGION, ''); - }), - (() => { - }) - ); - } - - /** - * Whether to disable "Connect" button - */ - isConnectDisabled() { - return !AzureAccountParamsKeys.reduce((accu, key) => this.formGroup.get(key).valid && accu, true); - } - - showResourceGroupExisting() { - this.showResourceGroup(ResourceGroupOption.EXISTING); - } - - showResourceGroupCustom() { - this.showResourceGroup(ResourceGroupOption.CUSTOM); - } - - private showResourceGroup(option) { - this.resourceGroupOption = option; - if (option === ResourceGroupOption.EXISTING) { - this.formGroup.controls[AzureField.PROVIDER_RESOURCEGROUPCUSTOM].clearValidators(); - this.formGroup.controls[AzureField.PROVIDER_RESOURCEGROUPCUSTOM].setValue(''); - this.formGroup.controls[AzureField.PROVIDER_RESOURCEGROUPEXISTING].setValidators([ - Validators.required - ]); - this.clearFieldSavedData(AzureField.PROVIDER_RESOURCEGROUPCUSTOM) - } else if (option === ResourceGroupOption.CUSTOM) { - this.formGroup.controls[AzureField.PROVIDER_RESOURCEGROUPEXISTING].clearValidators(); - this.formGroup.controls[AzureField.PROVIDER_RESOURCEGROUPEXISTING].setValue(''); - this.formGroup.controls[AzureField.PROVIDER_RESOURCEGROUPCUSTOM].setValidators([ - Validators.required, - this.validationService.isValidResourceGroupName(), - this.validationService.isUniqueResourceGroupName(this.resourceGroups), - ]); - this.clearFieldSavedData(AzureField.PROVIDER_RESOURCEGROUPEXISTING) - } else { - console.log('WARNING: showResourceGroup() received unrecognized value of ' + option); - } - this.setControlValueSafely(AzureField.PROVIDER_RESOURCEGROUPOPTION, option); - this.formGroup.controls[AzureField.PROVIDER_RESOURCEGROUPCUSTOM].updateValueAndValidity(); - this.formGroup.controls[AzureField.PROVIDER_RESOURCEGROUPEXISTING].updateValueAndValidity(); - } - - /** - * Event handler when AzureField.PROVIDER_REGION selection has changed - */ - onRegionChange(val) { - console.log('azure-provider-step.onRegionChange() detects region change to ' + val + '; publishing AZURE_REGION_CHANGED'); - AppServices.messenger.publish({ - type: TanzuEventType.AZURE_REGION_CHANGED, - payload: val - }); - } - - /** - * Update the "create" button if name has been changed. - */ - onResourceGroupNameChange() { - AppServices.messenger.publish({ - type: TanzuEventType.AZURE_RESOURCEGROUP_CHANGED, - payload: this.formGroup.get(AzureField.PROVIDER_RESOURCEGROUPCUSTOM).value - }); - } - - private handleIfSavedCustomResourceGroupIsNowExisting(savedGroupCustom: string): boolean { - // handle case where user originally created a new (custom) resource group (and value was either saved - // to local storage or to config file as a custom resource group), but now when the data is restored, - // the resource group exists (so we should move the custom value over to the existing data slot). - const customIsNowExisting = this.resourceGroupContains(savedGroupCustom); - if (customIsNowExisting) { - this.clearFieldSavedData(AzureField.PROVIDER_RESOURCEGROUPCUSTOM); - this.saveFieldData(AzureField.PROVIDER_RESOURCEGROUPEXISTING, savedGroupCustom); - return true; - } - return false; - } - - private resourceGroupContains(resourceGroupName: string) { - return this.resourceGroups.find( resourceGroup => { return resourceGroup.name === resourceGroupName; }); - } - - dynamicDescription(): string { - const tenant = this.getFieldValue(AzureField.PROVIDER_TENANT, true); - if (tenant) { - return 'Azure tenant: ' + tenant; - } - return 'Validate the Azure provider credentials for Tanzu'; - } - - protected storeUserData() { - this.storeUserDataFromMapping(this.stepMapping); - this.storeDefaultDisplayOrder(this.stepMapping); - } - - private createStepMapping(): StepMapping { - const result = AzureProviderStepMapping; - const cloudFieldMapping = AppServices.fieldMapUtilities.getFieldMapping(AzureField.PROVIDER_AZURECLOUD, result); - cloudFieldMapping.retriever = this.findAzureCloudByName.bind(this); - return result; - } -} diff --git a/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.fieldmapping.ts b/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.fieldmapping.ts deleted file mode 100644 index 459d702a34..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/provider-step/azure-provider-step.fieldmapping.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { AzureClouds, AzureField } from '../azure-wizard.constants'; - -export const AzureProviderStepMapping: StepMapping = { - fieldMappings: [ - { name: AzureField.PROVIDER_AZURECLOUD, required: true, defaultValue: AzureClouds[0], label: 'AZURE ENVIRONMENT', - backingObject: {displayField: 'displayName', valueField: 'name'} }, - { name: AzureField.PROVIDER_CLIENT, required: true, label: 'CLIENT ID' }, - { name: AzureField.PROVIDER_CLIENTSECRET, required: true, mask: true, label: 'CLIENT SECRET' }, - { name: AzureField.PROVIDER_REGION, required: true, requiresBackendData: true, label: 'REGION' }, - { name: AzureField.PROVIDER_RESOURCEGROUPEXISTING, required: true, requiresBackendData: true, label: 'EXISTING RESOURCE GROUP' }, - { name: AzureField.PROVIDER_RESOURCEGROUPCUSTOM, doNotAutoRestore: true, label: 'RESOURCE GROUP NAME' }, - { name: AzureField.PROVIDER_RESOURCEGROUPOPTION, required: true, label: 'RESOURCE GROUP' }, - { name: AzureField.PROVIDER_SSHPUBLICKEY, required: true, label: 'SSH PUBLIC KEY' }, - { name: AzureField.PROVIDER_SUBSCRIPTION, required: true, label: 'SUBSCRIPTION ID' }, - { name: AzureField.PROVIDER_TENANT, required: true, label: 'TENANT ID' }, - ] -} - -// About AzureProviderStep: -// We expect the user to fill out: -// TENANTID, CLIENTID, CLIENTSECRET, SUBSCRIPTIONID and AZURECLOUD and then click CONNECT. -// After that the REGION listbox should be populated and the user can select a resource group (or create one). -// We therefore do not want to restore a selected value to the REGION listbox until the user connects and the backend populates the backing -// data array. Likewise with the existing group resource id -- it should not be restored until the list of existing resources has been -// received from the backend. -// We also do not want to prematurely restore the value to the custom resource group (when creating the form initially), because that -// previously-custom group may have become an existing group, and we won't be able to detect that situation until we get the list of -// groups, and in addition, it should only be set if the user wants to create a new group diff --git a/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.html b/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.html deleted file mode 100644 index c6fa56f2b6..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.html +++ /dev/null @@ -1,356 +0,0 @@ -
- - -

- VNet for Azure -

-
-
- - - - - - Must select an option for entering the VNet! - - - - - -
-
- -
-
-
- - - - - - - Azure Resource Group is required - - -
-
- - - - - - - VNet Name cannot be empty - - -
-
- - - - - - - Azure VNet CIDR block is required - - - VNet CIDR block format is invalid - - -
-
-
-
- - - - - - - Control plane subnet name cannot be empty - - -
-
- - - - - - - Control plane subnet cidr cannot be empty - - - Control plane subnet cidr format is invalid - - -
-
-
-
- - - - - - - Worker node subnet name cannot be empty - - -
-
- - - - - - - Worker node subnet cidr cannot be empty - - - Worker node subnet cidr format is invalid - - -
-
-
- -
-
- - - - - - - Azure Resource Group is required - - -
-
- - - - - - - Azure VNet name is required - - -
-
- -
-
- - - - - - - - - - Azure control plane subnet is required - - -
-
- - - - - - - Azure worker node subnet is required - - -
-
- -
-
- - - - - - -
-
-
-
- - - - - Private IP is required - - - Private IP format is invalid - - - Private IP not in the designated subnet range - - -
-
-
diff --git a/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.scss b/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.scss deleted file mode 100644 index 4b3462cf0d..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.scss +++ /dev/null @@ -1,4 +0,0 @@ -.clr-textarea { - width: 500px; - height: 120px; -} \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.spec.ts b/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.spec.ts deleted file mode 100644 index b56396aeb8..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -// App imports -import { APIClient } from '../../../../swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { AzureField, AzureForm } from '../azure-wizard.constants'; -import { DataServiceRegistrarTestExtension } from '../../../../testing/data-service-registrar.testextension'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { SharedModule } from '../../../../shared/shared.module'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { VnetStepComponent } from './vnet-step.component'; -import { VSphereResourcePool } from '../../../../swagger/models'; - -describe('VnetStepComponent', () => { - let component: VnetStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - ValidationService, - FormBuilder, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [VnetStepComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - - fixture = TestBed.createComponent(VnetStepComponent); - component = fixture.componentInstance; - component.setStepRegistrantData({ wizard: 'ZuchiniWizard', step: AzureForm.VNET, formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.AZURE_CONFIG_FILE_IMPORTED, - eventFileImportError: TanzuEventType.AZURE_CONFIG_FILE_IMPORT_ERROR}); - - const dataServiceRegistrar = new DataServiceRegistrarTestExtension(); - AppServices.dataServiceRegistrar = dataServiceRegistrar; - // we expect the wizard to have registered for these events: - dataServiceRegistrar.simulateRegistration(TanzuEventType.AZURE_GET_RESOURCE_GROUPS); - dataServiceRegistrar.simulateRegistration(TanzuEventType.AZURE_GET_VNETS); - - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.ngOnInit(); - - const staticDescription = component.dynamicDescription(); - expect(staticDescription).toEqual('Specify an Azure VNet CIDR') - - const customCidrControl = component.formGroup.get(AzureField.VNET_CUSTOM_CIDR); - customCidrControl.setValue('4.3.2.1/12'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'ZuchiniWizard', - step: AzureForm.VNET, - description: 'Subnet: 4.3.2.1/12', - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.ts b/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.ts deleted file mode 100644 index a7a6e5fd73..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.component.ts +++ /dev/null @@ -1,340 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { Validators } from '@angular/forms'; -// Third party imports -import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; -// App imports -import AppServices from 'src/app/shared/service/appServices'; -import { AzureField, AzureForm, VnetOptionType } from '../azure-wizard.constants'; -import { AzureResourceGroup } from 'src/app/swagger/models'; -import { AzureVnetStandaloneStepMapping, AzureVnetStepMapping } from './vnet-step.fieldmapping'; -import { AzureVirtualNetwork } from '../../../../swagger/models/azure-virtual-network.model'; -import { StepFormDirective } from '../../wizard/shared/step-form/step-form'; -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { TanzuEventType } from 'src/app/shared/service/Messenger'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; - -@Component({ - selector: 'app-vnet-step', - templateUrl: './vnet-step.component.html', - styleUrls: ['./vnet-step.component.scss'] -}) -export class VnetStepComponent extends StepFormDirective implements OnInit { - region = ''; // Current region selected - showVnetFieldsOption: string = VnetOptionType.EXISTING; - customResourceGroup = null; - - // An object maps vnet to subsets; data retrieved from backend - vnetSubnets = {}; - - /** lists to be retrieved from the backend */ - vnetResourceGroups = []; - vnetNamesExisting = []; - controlPlaneSubnets = []; - workerNodeSubnets = []; - - defaultVnetCidr: string = '10.0.0.0/16'; - defaultControlPlaneCidr: string = '10.0.0.0/24'; - defaultWorkerNodeCidr: string = '10.0.1.0/24'; - - createPrivateCluster = false; - // cidrForPrivateCluster holds two CIDR values, one for EXISTING and one for CUSTOM; - // used to validate private cluster IP address (if nec) - // also displayed on the page as instruction, if user chooses to create a private cluster - cidrForPrivateCluster = {}; - - /** UI fields to expose per edition */ - vnetFieldsExisting: Array = []; - vnetFieldsNew: Array = []; - - constructor(private validationService: ValidationService) { - super(); - } - - private supplyStepMapping(): StepMapping { - return this.modeClusterStandalone ? AzureVnetStandaloneStepMapping : AzureVnetStepMapping; - } - - /** - * Create the initial form - */ - private subscribeToServices() { - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.AZURE_GET_VNETS, this.setVnets.bind(this)) - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.AZURE_GET_RESOURCE_GROUPS, - this.onFetchedResourceGroups.bind(this)); - } - - private onFetchedResourceGroups(azureResourceGroups: AzureResourceGroup[]) { - this.vnetResourceGroups = azureResourceGroups; - if (this.customResourceGroup) { - this.setControlValueSafely(AzureField.VNET_RESOURCE_GROUP, this.customResourceGroup); - } else if (azureResourceGroups.length === 1) { - this.setControlValueSafely(AzureField.VNET_RESOURCE_GROUP, azureResourceGroups[0].name); - } else { - this.setFieldWithStoredValue(AzureField.VNET_RESOURCE_GROUP, this.supplyStepMapping()); - } - } - - private customizeForm() { - // TODO: consider morphing these .valueChanges calls into registerOnValueChange() calls - this.formGroup.get(AzureField.VNET_RESOURCE_GROUP).valueChanges - .pipe( - distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), - takeUntil(this.unsubscribe) - ).subscribe((val) => { - this.onResourceGroupChange(val); - }); - - this.formGroup.get(AzureField.VNET_EXISTING_NAME).valueChanges - .pipe( - distinctUntilChanged((prev, curr) => prev === curr), - takeUntil(this.unsubscribe) - ).subscribe(this.onVnetChange.bind(this)); - - this.formGroup.get(AzureField.VNET_CUSTOM_CIDR).valueChanges - .pipe( - distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), - takeUntil(this.unsubscribe) - ).subscribe((cidr) => { - AppServices.messenger.publish({ - type: TanzuEventType.NETWORK_STEP_GET_NO_PROXY_INFO, - payload: { info: (cidr ? cidr + ',' : '') + '169.254.0.0/16,168.63.129.16' } - }); - this.triggerStepDescriptionChange(); - }); - /** - * Whenever Azure region selection changes... - */ - const step = this; - AppServices.messenger.subscribe(TanzuEventType.AZURE_REGION_CHANGED, - event => { step.onRegionChange(event.payload); }, step.unsubscribe); - AppServices.messenger.subscribe(TanzuEventType.AZURE_RESOURCEGROUP_CHANGED, - event => { step.customResourceGroup = event.payload; }, step.unsubscribe); - - this.registerOnValueChange(AzureField.VNET_PRIVATE_CLUSTER, this.onCreatePrivateAzureCluster.bind(this)); - this.registerOnValueChange(AzureField.VNET_CONTROLPLANE_NEWSUBNET_CIDR, this.onControlPlaneSubnetCidrNewChange.bind(this)); - this.registerOnValueChange(AzureField.VNET_CONTROLPLANE_SUBNET_NAME, this.onControlPlaneSubnetChange.bind(this)); - this.registerOnValueChange(AzureField.VNET_EXISTING_OR_CUSTOM, this.onExistingOrCustomOptionChange.bind(this)); - } - - ngOnInit() { - super.ngOnInit(); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, this.supplyStepMapping()); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(this.supplyStepMapping()); - this.storeDefaultLabels(this.supplyStepMapping()); - this.registerDefaultFileImportedHandler(this.eventFileImported, this.supplyStepMapping()); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - - this.subscribeToServices(); - this.customizeForm(); - - this.vnetFieldsExisting = [AzureField.VNET_EXISTING_NAME, AzureField.VNET_CONTROLPLANE_SUBNET_NAME]; - this.vnetFieldsNew = - [ - AzureField.VNET_CUSTOM_NAME, - AzureField.VNET_CUSTOM_CIDR, - AzureField.VNET_CONTROLPLANE_NEWSUBNET_NAME, - AzureField.VNET_CONTROLPLANE_NEWSUBNET_CIDR, - ]; - if (!this.modeClusterStandalone) { - this.vnetFieldsExisting.push(AzureField.VNET_WORKER_SUBNET_NAME); - this.vnetFieldsNew.push(AzureField.VNET_WORKER_NEWSUBNET_NAME, AzureField.VNET_WORKER_NEWSUBNET_CIDR); - } - - this.handleSavedCustomVnetName(); - } - - onControlPlaneSubnetChange(name: string) { - // when the user selects an existing subnet, we look up the associated CIDR and set a hidden field with the CIDR value, - // which is later used in creating the AzureRegionalClusterParams payload object - const subnetEntry = this.controlPlaneSubnets.find(subnet => subnet.name === name); - const cidrOfSelectedControlPlaneSubnet = (subnetEntry) ? subnetEntry.cidr : ''; - - this.setControlValueSafely(AzureField.VNET_CONTROLPLANE_SUBNET_CIDR, cidrOfSelectedControlPlaneSubnet); - this.cidrForPrivateCluster[VnetOptionType.EXISTING] = cidrOfSelectedControlPlaneSubnet; - } - - onControlPlaneSubnetCidrNewChange(value: string) { - this.cidrForPrivateCluster[VnetOptionType.CUSTOM] = value; - } - - onCreatePrivateAzureCluster(createPrivateCluster: boolean) { - this.createPrivateCluster = createPrivateCluster; - if (createPrivateCluster) { - const cidr = this.cidrForPrivateCluster['' + this.showVnetFieldsOption]; - const cidrValidator = this.validationService.isIpInSubnet2(cidr); - this.formGroup.markAsPending(); - this.resurrectFieldWithStoredValue(AzureField.VNET_PRIVATE_IP, this.supplyStepMapping(), - [Validators.required, this.validationService.isValidIpOrFqdn(), cidrValidator]); - } else { - this.disarmField(AzureField.VNET_PRIVATE_IP, true); - } - } - - private handleSavedCustomVnetName() { - // if the user did an import, then we expect there may be a custom vnet value to be stored in AzureField.VNET_CUSTOM_NAME slot. - // however, since that custom vnet may have been created and now be an existing vnet, - // we need to call a special method to handle that situation, which moves the saved name from the custom slot - // into the existing slot. Note that we do this before deciding whether to show the custom or existing options - this.modifySavedValuesIfVnetCustomNameIsNowExisting(); - const savedVnetCustom = this.getStoredValue(AzureField.VNET_CUSTOM_NAME, this.supplyStepMapping(), ''); - const optionValue = savedVnetCustom !== '' ? VnetOptionType.CUSTOM : VnetOptionType.EXISTING; - // NOTE: setting the EXISTING_OR_CUSTOM value will trigger the display to update - this.setFieldWithStoredValue(AzureField.VNET_EXISTING_OR_CUSTOM, this.supplyStepMapping(), optionValue); - } - - onRegionChange(region: string) { - this.region = region; - this.setFieldWithStoredValue(AzureField.VNET_RESOURCE_GROUP, this.supplyStepMapping()); - } - - onResourceGroupChange(resourceGroupName) { - if (resourceGroupName && resourceGroupName !== this.customResourceGroup) { - AppServices.dataServiceRegistrar.trigger([TanzuEventType.AZURE_GET_VNETS], { resourceGroupName, location: this.region }) - } - } - - private setVnets(vnets: AzureVirtualNetwork[]) { - this.vnetSubnets = vnets.reduce((accu, vnet) => { accu[vnet.name] = vnet.subnets; return accu; }, {}); - this.vnetNamesExisting = Object.keys(this.vnetSubnets); - - this.modifySavedValuesIfVnetCustomNameIsNowExisting(); - - // NOTE: setting the EXISTING_NAME value will cause an update to the subnets - const savedVnet = this.getStoredValue(AzureField.VNET_EXISTING_NAME, this.supplyStepMapping(), ''); - if (savedVnet && this.vnetNamesExisting.includes(savedVnet)) { - this.setControlValueSafely(AzureField.VNET_EXISTING_NAME, savedVnet); - } else if (this.vnetNamesExisting.length === 1) { - this.setControlValueSafely(AzureField.VNET_EXISTING_NAME, this.vnetNamesExisting[0]); - } - } - - onVnetChange(vnetName) { - // Use the same set of subnets for control plane and worker plane - this.workerNodeSubnets = this.vnetSubnets[vnetName] || []; - this.controlPlaneSubnets = this.workerNodeSubnets; - - if (this.workerNodeSubnets.length === 0) { - const warning = 'WARNING: vnet ' + vnetName + ' appears to have no subnets available! vnetSubnets=' + - JSON.stringify(this.vnetSubnets); - console.log(warning); - } - this.initSubnetField(AzureField.VNET_CONTROLPLANE_SUBNET_NAME, this.controlPlaneSubnets); - if (!this.modeClusterStandalone) { - this.initSubnetField(AzureField.VNET_WORKER_SUBNET_NAME, this.workerNodeSubnets); - } - } - - // set subnet field with saved data if available, or default if only one subnet - private initSubnetField(fieldName: string, subnets: any[]) { - // set subnet fields with local storage data if available, or default if only one subnet - const nameSavedSubnet = this.getStoredValue(fieldName, this.supplyStepMapping(), ''); - const savedControlPlaneSubnet = nameSavedSubnet ? this.findSubnetByName(nameSavedSubnet, subnets) : null; - if (savedControlPlaneSubnet) { - this.setControlValueSafely(fieldName, nameSavedSubnet); - } else if (subnets.length === 1) { - this.setControlValueSafely(fieldName, subnets[0].name); - } - } - - private findSubnetByName(subnetName: string, subnets: any[]): any { - return subnets.find(s => s.name === subnetName); - } - - private onExistingOrCustomOptionChange(option: string, clearSavedData = false) { - this.showVnetFieldsOption = option; - if (option === VnetOptionType.EXISTING) { - this.initVnetFieldsExisting(clearSavedData); - if (this.vnetResourceGroups.length === 1) { - this.setControlValueSafely(AzureField.VNET_RESOURCE_GROUP, this.vnetResourceGroups[0].name); - } else { - this.setFieldWithStoredValue(AzureField.VNET_RESOURCE_GROUP, this.supplyStepMapping()); - } - } else if (option === VnetOptionType.CUSTOM) { - this.showVnetFieldsCustom(clearSavedData); - } - this.onCreatePrivateAzureCluster(this.createPrivateCluster); - } - - private showVnetFieldsCustom(clearSavedData: boolean) { - this.resurrectFieldWithStoredValue(AzureField.VNET_CUSTOM_NAME, this.supplyStepMapping(), [Validators.required]); - this.resurrectFieldWithStoredValue(AzureField.VNET_CONTROLPLANE_NEWSUBNET_NAME, this.supplyStepMapping(), [Validators.required]); - - this.resurrectFieldWithStoredValue(AzureField.VNET_CUSTOM_CIDR, this.supplyStepMapping(), [Validators.required, - this.validationService.noWhitespaceOnEnds(), - this.validationService.isValidIpNetworkSegment() - ], this.defaultVnetCidr); - this.resurrectFieldWithStoredValue(AzureField.VNET_CONTROLPLANE_NEWSUBNET_CIDR, this.supplyStepMapping(), - [Validators.required, this.validationService.noWhitespaceOnEnds(), this.validationService.isValidIpNetworkSegment()], - this.defaultControlPlaneCidr); - - if (!this.modeClusterStandalone) { - this.resurrectFieldWithStoredValue(AzureField.VNET_WORKER_NEWSUBNET_NAME, this.supplyStepMapping(), [Validators.required]); - this.resurrectFieldWithStoredValue(AzureField.VNET_WORKER_NEWSUBNET_CIDR, this.supplyStepMapping(), [Validators.required, - this.validationService.noWhitespaceOnEnds(), - this.validationService.isValidIpNetworkSegment() - ], this.defaultWorkerNodeCidr); - } - - this.vnetFieldsExisting.forEach(field => this.disarmField(field, clearSavedData)); - } - - private initVnetFieldsExisting(clearSavedData: boolean) { - this.vnetFieldsExisting.forEach(field => { - this.resurrectField(field, [Validators.required]); - }); - if (this.vnetResourceGroups.length === 1) { - setTimeout(_ => { - if (this.vnetResourceGroups.length === 1) { - this.setControlValueSafely(AzureField.VNET_RESOURCE_GROUP, this.vnetResourceGroups[0].name); - } - if (this.vnetNamesExisting.length === 1) { - this.setControlValueSafely(AzureField.VNET_EXISTING_NAME, this.vnetNamesExisting[0]); - } - if (this.controlPlaneSubnets.length === 1) { - this.setControlValueSafely(AzureField.VNET_CONTROLPLANE_SUBNET_NAME, this.controlPlaneSubnets[0].name) - } - if (this.workerNodeSubnets.length === 1) { - this.setControlValueSafely(AzureField.VNET_WORKER_SUBNET_NAME, this.workerNodeSubnets[0].name) - } - }); - } - AppServices.messenger.publish({ - type: TanzuEventType.NETWORK_STEP_GET_NO_PROXY_INFO, - payload: {info: '169.254.0.0/16,168.63.129.16'} - }); - - this.vnetFieldsNew.forEach(field => this.disarmField(field, clearSavedData)); - } - - // modifySavedValuesIfVnetCustomNameIsNowExisting() handles the case where user originally created a new (custom) vnet - // (and value was either saved to local storage or to config file as a custom vnet name), but now when the data is restored, - // the vnet name exists (so we should move the custom value over to the existing data slot). - // In doing that, we create a side-effect of changing local storage values. - private modifySavedValuesIfVnetCustomNameIsNowExisting() { - const savedVnetCustom = this.getStoredValue(AzureField.VNET_CUSTOM_NAME, this.supplyStepMapping(), ''); - const customIsNowExisting = this.vnetNamesExisting.indexOf(savedVnetCustom) >= 0; - if (customIsNowExisting) { - this.saveFieldData(AzureField.VNET_EXISTING_NAME, savedVnetCustom); - this.clearFieldSavedData(AzureField.VNET_CUSTOM_NAME); - } - } - - dynamicDescription(): string { - const vnetCidrBlock = this.getFieldValue(AzureField.VNET_CUSTOM_CIDR, true); - return vnetCidrBlock ? `Subnet: ${vnetCidrBlock}` : 'Specify an Azure VNet CIDR'; - } - - protected storeUserData() { - this.storeUserDataFromMapping(this.supplyStepMapping()); - this.storeDefaultDisplayOrder(this.supplyStepMapping()); - } - - get vnetOptionExisting(): string { - return VnetOptionType.EXISTING; - } - - get vnetOptionCustom(): string { - return VnetOptionType.CUSTOM; - } -} diff --git a/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.fieldmapping.ts b/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.fieldmapping.ts deleted file mode 100644 index 62bfb696a9..0000000000 --- a/tkg/web/src/app/views/landing/azure-wizard/vnet-step/vnet-step.fieldmapping.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { AzureField, VnetOptionType } from '../azure-wizard.constants'; -import { SimpleValidator } from '../../wizard/shared/constants/validation.constants'; - -export const AzureVnetStandaloneStepMapping: StepMapping = { - fieldMappings: [ - { name: AzureField.VNET_CONTROLPLANE_NEWSUBNET_CIDR, required: true, doNotAutoRestore: true, label: 'CONTROL PLANE SUBNET CIDR' }, - { name: AzureField.VNET_CONTROLPLANE_NEWSUBNET_NAME, required: true, doNotAutoRestore: true, label: 'CONTROL PLANE SUBNET NAME' }, - { name: AzureField.VNET_CONTROLPLANE_SUBNET_NAME, required: true, requiresBackendData: true, label: 'CONTROL PLANE SUBNET' }, - { name: AzureField.VNET_CUSTOM_NAME, required: true, doNotAutoRestore: true, label: 'VNET NAME' }, - { name: AzureField.VNET_EXISTING_NAME, required: true, requiresBackendData: true, label: 'VNET NAME' }, - { name: AzureField.VNET_EXISTING_OR_CUSTOM, required: true, primaryTrigger: true, defaultValue: VnetOptionType.EXISTING }, - { name: AzureField.VNET_PRIVATE_CLUSTER, isBoolean: true, label: 'PRIVATE AZURE CLUSTER' }, - { name: AzureField.VNET_PRIVATE_IP, label: 'PRIVATE IP' }, - { name: AzureField.VNET_RESOURCE_GROUP, required: true, requiresBackendData: true, label: 'RESOURCE GROUP' }, - // special hidden field used to capture existing subnet cidr when user selects existing subnet - { name: AzureField.VNET_CONTROLPLANE_SUBNET_CIDR, doNotAutoRestore: true }, - // defaultCidrFields - { name: AzureField.VNET_CUSTOM_CIDR, required: true, doNotAutoRestore: true, label: 'VNET CIDR BLOCK', - validators: [SimpleValidator.NO_WHITE_SPACE, SimpleValidator.IS_VALID_IP_NETWORK_SEGMENT] }, - { name: AzureField.VNET_CONTROLPLANE_NEWSUBNET_CIDR, required: true, doNotAutoRestore: true, - validators: [SimpleValidator.NO_WHITE_SPACE, SimpleValidator.IS_VALID_IP_NETWORK_SEGMENT] }, - ] -}; - -export const AzureVnetStepMapping: StepMapping = { - fieldMappings: [ - ...AzureVnetStandaloneStepMapping.fieldMappings, - { name: AzureField.VNET_WORKER_NEWSUBNET_NAME, required: true, doNotAutoRestore: true, label: 'WORKER NODE SUBNET NAME' }, - { name: AzureField.VNET_WORKER_NEWSUBNET_CIDR, required: true, doNotAutoRestore: true }, - { name: AzureField.VNET_WORKER_SUBNET_NAME, required: true, requiresBackendData: true, label: 'WORKER NODE SUBNET' }, - // defaultCidrFields - { name: AzureField.VNET_WORKER_NEWSUBNET_CIDR, required: true, doNotAutoRestore: true, label: 'WORKER NODE SUBNET CIDR', - validators: [SimpleValidator.NO_WHITE_SPACE, SimpleValidator.IS_VALID_IP_NETWORK_SEGMENT] }, - ] -} - -// About AzureVnetStep: -// Most of the fields require backend data to be populated (or are set based on cascading onChange events), so most of the fields have -// doNotAutoRestore or requiresBackendData set TRUE; we rely on the event handlers to populate the fields based on stored data AFTER the -// backend data arrives. -// The choice of whether to do existing or custom is the first trigger field diff --git a/tkg/web/src/app/views/landing/azure-wizard/worker-node-setting-step/worker-node-setting-step.component.ts b/tkg/web/src/app/views/landing/azure-wizard/worker-node-setting-step/worker-node-setting-step.component.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/web/src/app/views/landing/confirm/confirm.component.ts b/tkg/web/src/app/views/landing/confirm/confirm.component.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/web/src/app/views/landing/confirm/confirmation.component.html b/tkg/web/src/app/views/landing/confirm/confirmation.component.html deleted file mode 100644 index 4302fe41bb..0000000000 --- a/tkg/web/src/app/views/landing/confirm/confirmation.component.html +++ /dev/null @@ -1,28 +0,0 @@ -
-
-

{{ pageTitle }} - Confirm Settings

-
-
- -
-
- - - - - - - - - - - - - - - - -
{{wizardEntry.titles[stepName]}}
{{wizardEntry.titles[stepName]}}{{wizardEntry.descriptions[stepName]}}
{{ wizardEntry.steps[stepName].labels[fieldName] }}{{ wizardEntry.steps[stepName].fields[fieldName].display }}
-
-
-
diff --git a/tkg/web/src/app/views/landing/confirm/confirmation.component.scss b/tkg/web/src/app/views/landing/confirm/confirmation.component.scss deleted file mode 100644 index 84c88d46b0..0000000000 --- a/tkg/web/src/app/views/landing/confirm/confirmation.component.scss +++ /dev/null @@ -1,27 +0,0 @@ -@import '../../../../sass/properties.scss'; -.table th.left:first-child, -.table td.left:first-child { - width: 300px; -} - -@media (max-width: $small) { - .table th.left:first-child, - .table td.left:first-child { - width: 150px; - } -} - -.inner-th { - border-collapse: separate; - border-top-color: rgb(204, 204, 204); - border-top-style: solid; - border-top-width: 1px; -} - -table.table { - table-layout: fixed; -} - -table.table td { - word-wrap: break-word; -} diff --git a/tkg/web/src/app/views/landing/confirm/confirmation.component.ts b/tkg/web/src/app/views/landing/confirm/confirmation.component.ts deleted file mode 100644 index 712b3ca4d0..0000000000 --- a/tkg/web/src/app/views/landing/confirm/confirmation.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -// Angular imports -import { Component, Input, OnInit } from '@angular/core'; -// App imports -import AppServices from '../../../shared/service/appServices'; -import { BasicSubscriber } from '../../../shared/abstracts/basic-subscriber'; -import { EditionData } from '../../../shared/service/branding.service'; -import { TanzuEventType } from '../../../shared/service/Messenger'; -import { UserDataWizard } from '../../../shared/service/user-data.service'; - -@Component({ - selector: 'app-confirmation', - templateUrl: './confirmation.component.html', - styleUrls: ['./confirmation.component.scss'] -}) -export class ConfirmationComponent extends BasicSubscriber implements OnInit { - @Input() wizard: string; - - pageTitle: string = ''; - wizardEntry: UserDataWizard; - - ngOnInit() { - AppServices.messenger.subscribe(TanzuEventType.BRANDING_CHANGED, data => { - this.pageTitle = data.payload.branding.title; - }, this.unsubscribe); - this.wizardEntry = AppServices.userDataService.retrieveWizardEntry(this.wizard); - } -} diff --git a/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.html b/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.html deleted file mode 100644 index 46f61b31a6..0000000000 --- a/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - -
-
-

Deploying {{ pageTitle }} on {{ providerType }}

-
- {{ getStatusDescription() }} -
-
-
- -
-
- - - - {{ phase }} - - - -
-
- - The management cluster will be created with a new cluster class configuration. - The cluster classes that will be created can be viewed during deployment. - These can then be used in the creation of workload clusters for this management cluster. - - - - - - - - - - - - - - - - - -
-
-

Logs

- - -
-
- - diff --git a/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.scss b/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.scss deleted file mode 100644 index 49e80327e9..0000000000 --- a/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.scss +++ /dev/null @@ -1,35 +0,0 @@ -@import '../landing.component.scss'; - -:host ::ng-deep { - log-monitor { - .container { - height: calc(100vh - 360px); - margin-top: 4px; - min-height: 570px; - } - } - .nav { - margin-bottom: 30px; - button { - outline-color: transparent; - } - } -} -.spinner-container { - margin-top: 4px; -} - -.progress-div { - display: inline-block; - margin-left: 10px; -} - -.clr-timeline.clr-timeline-vertical { - min-width: 9rem; -} - -.clr-row { - h4 { - margin-top: 0; - } -} diff --git a/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.spec.ts b/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.spec.ts deleted file mode 100644 index 9bc4a1b5c3..0000000000 --- a/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.spec.ts +++ /dev/null @@ -1,106 +0,0 @@ -// Angular modules -import { TestBed, async, ComponentFixture } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; - -// App imports -import { DeployProgressComponent } from './deploy-progress.component'; -import { AppDataService } from 'src/app/shared/service/app-data.service'; -import { ClusterType } from "../wizard/shared/constants/wizard.constants"; -import AppServices from "../../../shared/service/appServices"; - -describe('DeployProgressComponent', () => { - let fixture: ComponentFixture; - let component: DeployProgressComponent; - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule - ], - declarations: [ - DeployProgressComponent - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - }).compileComponents(); - })); - beforeEach(() => { - fixture = TestBed.createComponent(DeployProgressComponent); - component = fixture.componentInstance; - component.clusterTypeDescriptor = '' + ClusterType.Management; - fixture.detectChanges(); - }); - - it('should exist', () => { - const landingComponent = fixture.debugElement.componentInstance; - expect(landingComponent).toBeTruthy(); - }); - - it('should init component', () => { - const initWebSocketSpy = spyOn(component, 'initWebSocket').and.callThrough(); - component.ngOnInit(); - AppServices.appDataService.setProviderType('vsphere'); - expect(component.providerType).toBe('vSphere'); - AppServices.appDataService.setProviderType('aws'); - expect(component.providerType).toBe('AWS'); - AppServices.appDataService.setProviderType('azure'); - expect(component.providerType).toBe('Azure'); - component.providerType = ''; - AppServices.appDataService.setProviderType('none'); - expect(component.providerType).toBe(''); - expect(initWebSocketSpy).toHaveBeenCalled(); - }); - it('should convert log type', () => { - expect(component.convertLogType('ERROR')).toBe('ERR'); - expect(component.convertLogType('FATAL')).toBe('ERR'); - expect(component.convertLogType('INFO')).toBe('INFO'); - expect(component.convertLogType('WARN')).toBe('WARN'); - expect(component.convertLogType('UNKNOWN')).toBe(null); - }); - it('should process data', () => { - const data = { - type: 'log', - data: { - currentPhase: 'test', - logType: 'INFO', - message: ' 2016-11-09 23:17:56 test message', - status: 'successful', - totalPhases: null - } - }; - expect(component.processData(data)).toEqual({ - message: 'test message', - type: 'INFO', - timestamp: '2016-11-09 23:17:56' - }); - - data.type = 'notLog'; - component.processData(data); - expect(component.curStatus.msg).toBe(' 2016-11-09 23:17:56 test message'); - expect(component.curStatus.status).toBe('successful'); - expect(component.curStatus.curPhase).toBe('test'); - - data.data.status = 'pending'; // pending is not a real status - data.data.totalPhases = 'this is test phase'; - component.processData(data); - expect(component.curStatus.msg).toBe(' 2016-11-09 23:17:56 test message'); - expect(component.curStatus.status).toBe('pending'); - expect(component.curStatus.curPhase).toBe('test'); - }); - it('should get status description', () => { - component.curStatus = { - status: 'running' - }; - component.pageTitle = 'Tanzu Kubernetes Grid'; - component.providerType = 'vSphere'; - expect(component.getStatusDescription()).toBe( - 'Deployment of the Tanzu Kubernetes Grid management cluster to vSphere is in progress.'); - component.curStatus.status = 'successful'; - expect(component.getStatusDescription()).toBe( - 'Deployment of the Tanzu Kubernetes Grid management cluster to vSphere is successful.'); - component.curStatus.status = 'failed'; - expect(component.getStatusDescription()).toBe( - 'Deployment of the Tanzu Kubernetes Grid management cluster to vSphere has failed.'); - }); -}); diff --git a/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.ts b/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.ts deleted file mode 100644 index e9ad7ab97b..0000000000 --- a/tkg/web/src/app/views/landing/deploy-progress/deploy-progress.component.ts +++ /dev/null @@ -1,181 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -// Third party imports -import { BehaviorSubject } from 'rxjs'; -import { LogMessage as NgxLogMessage } from 'ngx-log-monitor'; -import { takeUntil } from 'rxjs/operators'; -// App imports -import { APP_ROUTES, Routes } from '../../../shared/constants/routes.constants'; -import AppServices from 'src/app/shared/service/appServices'; -import { BasicSubscriber } from '../../../shared/abstracts/basic-subscriber'; -import { EditionData } from '../../../shared/service/branding.service'; -import { TanzuEventType } from "../../../shared/service/Messenger"; -import { WebsocketService } from '../../../shared/service/websocket.service'; - -@Component({ - selector: 'tkg-kickstart-ui-deploy-progress', - templateUrl: './deploy-progress.component.html', - styleUrls: ['./deploy-progress.component.scss'] -}) -export class DeployProgressComponent extends BasicSubscriber implements OnInit { - - providerType: string = ''; - cli: string = ''; - pageTitle: string = ''; - clusterTypeDescriptor: string; - messages: any[] = []; - msgs$ = new BehaviorSubject(null); - curStatus: any = { - msg: '', - status: '', - curPhase: '', - finishedCount: 0, - totalCount: 0, - }; - - APP_ROUTES: Routes = APP_ROUTES; - phases: Array = []; - currentPhaseIdx: number; - - constructor(private websocketService: WebsocketService) { - super(); - AppServices.messenger.subscribe(TanzuEventType.CLI_CHANGED, event => { this.cli = event.payload; }, this.unsubscribe); - } - - ngOnInit(): void { - this.initWebSocket(); - - AppServices.messenger.subscribe(TanzuEventType.BRANDING_CHANGED, data => { - this.pageTitle = data.payload.branding.title; - this.clusterTypeDescriptor = data.payload.clusterTypeDescriptor; - }, this.unsubscribe); - - AppServices.appDataService.getProviderType() - .pipe(takeUntil(this.unsubscribe)) - .subscribe((provider) => { - if (provider && provider.includes('vsphere')) { - this.providerType = 'vSphere'; - } else if (provider && provider.includes('aws')) { - this.providerType = 'AWS'; - } else if (provider && provider.includes('azure')) { - this.providerType = 'Azure'; - } else if (provider && provider.includes('docker')) { - this.providerType = 'Docker'; - } - }); - } - - initWebSocket() { - this.websocketService.connect() - .subscribe(evt => { - const processed = this.processData(JSON.parse(evt.data)); - if (processed) { - this.msgs$.next(processed as NgxLogMessage); - this.messages.push(processed); - } - }); - - setTimeout(_ => { - this.websocketService.sendMessage('logs'); - }, 100); - - this.websocketService.setOnClose(_ => { - if (this.curStatus.status !== 'successful' && this.curStatus.status !== 'failed') { - setTimeout(() => { - this.initWebSocket(); - }, 5000); - } - }); - } - - /** - * @method convert log type - * @param {string} logType - * @return string - * 'ERROR' -> 'ERR' - * 'FATAL' -> 'ERR' - * 'INFO' -> 'INFO' - * 'WARN' -> 'WARN' - * 'UNKNOWN' -> null - */ - convertLogType(logType: string): string { - if (logType === 'ERROR') { - return 'ERR'; - } else if (logType === 'FATAL') { - return 'ERR'; - } else if (logType === 'UNKNOWN') { - return null; - } else { - return logType; - } - } - - /** - * @method process websocket data - * if data is a line of log, push to logs array - * if data is status update, update deployment status - * @param {object} data websocket entry from backend - */ - processData(data) { - if (data.type === 'log') { - this.curStatus.curPhase = data.data.currentPhase || this.curStatus.curPhase; - return { - message: data.data.message.slice(21), - type: this.convertLogType(data.data.logType), - timestamp: data.data.message.slice(1, 20) - }; - } else { - this.curStatus.msg = data.data.message; - this.curStatus.status = data.data.status; - - this.phases = data.data.totalPhases || []; - if (data.data.currentPhase && this.phases.length) { - this.curStatus.curPhase = data.data.currentPhase; - this.currentPhaseIdx = this.phases.indexOf(this.curStatus.curPhase); - } - - if (this.curStatus.status === 'successful') { - this.curStatus.finishedCount = this.curStatus.totalCount; - this.currentPhaseIdx = this.phases.length; - } else if (this.curStatus.status !== 'failed') { - this.curStatus.finishedCount = Math.max(0, data.data.totalPhases.indexOf(this.curStatus.curPhase)); - } - - this.curStatus.totalCount = data.data.totalPhases ? data.data.totalPhases.length : 0; - return null; - } - } - - /** - * @method getStepCurrentState - * @param idx - the index of each step in the ngFor expression - * helper method determines which state should be displayed for each - * step of the timeline component - */ - getStepCurrentState(idx) { - if (idx === this.currentPhaseIdx && this.curStatus.status === 'failed') { - return 'error'; - } else if (idx < this.currentPhaseIdx || this.curStatus.status === 'successful') { - return 'success' - } else if (idx === this.currentPhaseIdx) { - return 'current'; - } else { - return 'not-started' - } - } - - /** - * @method getStatusDescription - * generates page description text depending on edition and status - * @return {string} - */ - getStatusDescription(): string { - if (this.curStatus.status === 'running') { - return `Deployment of the ${this.pageTitle} ${this.clusterTypeDescriptor} cluster to ${this.providerType} is in progress.`; - } else if (this.curStatus.status === 'successful') { - return `Deployment of the ${this.pageTitle} ${this.clusterTypeDescriptor} cluster to ${this.providerType} is successful.`; - } else if (this.curStatus.status === 'failed') { - return `Deployment of the ${this.pageTitle} ${this.clusterTypeDescriptor} cluster to ${this.providerType} has failed.`; - } - } -} diff --git a/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.html b/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.html deleted file mode 100644 index 1d5dced35f..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.html +++ /dev/null @@ -1,44 +0,0 @@ -
Validate Docker Prerequisites - - - - - - Please ensure that Docker is running on your local machine, and that Docker settings have - a minimum of 4 CPUs and 6GB RAM allocated. - - - -
- - - - - -
-
-
- - connecting... - -
-
-
\ No newline at end of file diff --git a/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.scss b/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.scss deleted file mode 100644 index fcd679cc85..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -.title { - font-size: 16px; - margin-bottom: 20px; - - .btn-link { - margin-bottom: 9px; - } -} diff --git a/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.spec.ts b/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.spec.ts deleted file mode 100644 index 8970378f82..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.spec.ts +++ /dev/null @@ -1,47 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { RouterTestingModule } from '@angular/router/testing'; -// App imports -import { APIClient } from 'src/app/swagger/api-client.service'; -import { DaemonValidationStepComponent } from './daemon-validation-step.component'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; - -describe('DaemonValidationStepComponent', () => { - let component: DaemonValidationStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule.withRoutes([ - { path: 'ui', component: DaemonValidationStepComponent } - ]), - ReactiveFormsModule, - SharedModule, - BrowserAnimationsModule - ], - declarations: [ DaemonValidationStepComponent ], - providers: [ - APIClient, - ValidationService - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - const fb = new FormBuilder(); - fixture = TestBed.createComponent(DaemonValidationStepComponent); - component = fixture.componentInstance; - component.formGroup = fb.group({ - }); - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.ts b/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.ts deleted file mode 100644 index b46f160c69..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.component.ts +++ /dev/null @@ -1,71 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -// Third party imports -import { takeUntil } from 'rxjs/operators'; -// App imports -import { APIClient } from 'src/app/swagger'; -import AppServices from "../../../../shared/service/appServices"; -import { DaemonStepMapping } from './daemon-validation-step.fieldmapping'; -import { DockerDaemonStatus } from 'src/app/swagger/models'; -import { StepFormDirective } from '../../wizard/shared/step-form/step-form'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; - -@Component({ - selector: 'app-daemon-validation-step', - templateUrl: './daemon-validation-step.component.html', - styleUrls: ['./daemon-validation-step.component.scss'] -}) -export class DaemonValidationStepComponent extends StepFormDirective implements OnInit { - - connected: boolean = false; - connecting: boolean = false; - errorNotification: string = ""; - - constructor(private validationService: ValidationService, - private apiClient: APIClient) { - super(); - } - - private customizeForm() { - this.registerDefaultFileImportedHandler(this.eventFileImported, DaemonStepMapping); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - } - - ngOnInit(): void { - super.ngOnInit(); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, DaemonStepMapping); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(DaemonStepMapping); - this.storeDefaultLabels(DaemonStepMapping); - - this.customizeForm(); - this.connectToDocker(); - } - - initFormWithSavedData() { - // We don't want to set the isConnected field from saved data, so we override the method's default implementation - } - - getFormName() { - super.getFormName(); - } - - connectToDocker() { - this.connecting = true; - this.apiClient.checkIfDockerDaemonAvailable() - .pipe(takeUntil(this.unsubscribe)) - .subscribe((data: DockerDaemonStatus) => { - this.connected = !!data.status; - this.connecting = false; - this.resurrectField('isConnected', this.validationService.isTrue(), 'true', { emitEvent: false }); - }, (err) => { - this.connected = false; - this.connecting = false; - this.errorNotification = err.error.message; - }); - } - - protected storeUserData() { - this.storeUserDataFromMapping(DaemonStepMapping); - this.storeDefaultDisplayOrder(DaemonStepMapping); - } -} diff --git a/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.fieldmapping.ts b/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.fieldmapping.ts deleted file mode 100644 index 43fb02e7ee..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/daemon-validation-step/daemon-validation-step.fieldmapping.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { SimpleValidator } from '../../wizard/shared/constants/validation.constants'; - -export const DaemonStepMapping: StepMapping = { - fieldMappings: [ - { name: 'isConnected', validators: [SimpleValidator.IS_TRUE], isBoolean: true, doNotAutoRestore: true, - label: 'DOCKER DAEMON CONNECTED' } - ] -} -// About DaemonStep: -// When building the form initially, we do NOT care whether the user previously connected (we want to check again NOW), so we set -// doNotAutoRestore to TRUE. (However, we DO want to store the value for later display, which is why we DON'T use neverStore.) diff --git a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard-routing.module.ts b/tkg/web/src/app/views/landing/docker-wizard/docker-wizard-routing.module.ts deleted file mode 100644 index 9108230ef5..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard-routing.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Angular module -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { DockerWizardComponent } from './docker-wizard.component'; - -// App imports -export const routes: Routes = [ - { - path: '', - component: DockerWizardComponent - } -]; - -/** - * @module DockerWizardRoutingModule - * @description - * This is routing module for the wizard module. - */ -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class DockerWizardRoutingModule {} diff --git a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.html b/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.html deleted file mode 100644 index f3d20fdf1a..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.html +++ /dev/null @@ -1,54 +0,0 @@ -
-
-
- -

-
- Deploy {{ clusterTypeDescriptorTitleCase }} Cluster on Docker -

- - - - -
-
- - - -
- - - -
-
- - - - - -
-
-
diff --git a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.scss b/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.scss deleted file mode 100644 index 6bb87c311f..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.scss +++ /dev/null @@ -1,12 +0,0 @@ -:host ::ng-deep button.clr-accordion-header-button { - font-size: 14px; - padding: 9px 18px; -} - -clr-icon.back-link { - margin-right: 8px; - cursor: pointer; - position: relative; - top: 33px; - float: left; -} \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.spec.ts b/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.spec.ts deleted file mode 100644 index fe01ccb008..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { RouterTestingModule } from '@angular/router/testing'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { APIClient } from 'src/app/swagger/api-client.service'; - -import { DockerWizardComponent } from './docker-wizard.component'; - -describe('DockerWizardComponent', () => { - let component: DockerWizardComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - ReactiveFormsModule, - BrowserAnimationsModule, - SharedModule - ], - providers: [ - APIClient, - FormBuilder - ], - declarations: [ DockerWizardComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(DockerWizardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.ts b/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.ts deleted file mode 100644 index 68d2275375..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.component.ts +++ /dev/null @@ -1,245 +0,0 @@ -// Angular imports -import { Component, ElementRef, OnInit } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; -import { Router } from '@angular/router'; -import { Title } from '@angular/platform-browser'; -// Third party imports -import { Observable } from 'rxjs'; -// App imports -import { APIClient } from 'src/app/swagger'; -import AppServices from '../../../shared/service/appServices'; -import { ConfigFileInfo, DockerRegionalClusterParams } from 'src/app/swagger/models'; -import { CliFields, CliGenerator } from '../wizard/shared/utils/cli-generator'; -import { DaemonValidationStepComponent } from './daemon-validation-step/daemon-validation-step.component'; -import { DockerNetworkStepComponent } from './network-step/docker-network-step.component'; -import { FormDataForHTML, FormUtility } from '../wizard/shared/components/steps/form-utility'; -import { ExportService } from "../../../shared/service/export.service"; -import { ImportParams, ImportService } from "../../../shared/service/import.service"; -import { NetworkField } from '../wizard/shared/components/steps/network-step/network-step.fieldmapping'; -import { NodeSettingStepComponent } from './node-setting-step/node-setting-step.component'; -import { TanzuEventType } from '../../../shared/service/Messenger'; -import { WizardBaseDirective } from '../wizard/shared/wizard-base/wizard-base'; -import { WizardForm } from '../wizard/shared/constants/wizard.constants'; -import { DockerNodeSettingStepName } from './node-setting-step/node-setting-step.fieldmapping'; - -@Component({ - selector: 'app-docker-wizard', - templateUrl: './docker-wizard.component.html', - styleUrls: ['./docker-wizard.component.scss'] -}) -export class DockerWizardComponent extends WizardBaseDirective implements OnInit { - - constructor( - router: Router, - el: ElementRef, - private exportService: ExportService, - private importService: ImportService, - formBuilder: FormBuilder, - titleService: Title, - private apiClient: APIClient - ) { - super(router, el, titleService, formBuilder); - } - - protected supplyFileImportedEvent(): TanzuEventType { - return TanzuEventType.DOCKER_CONFIG_FILE_IMPORTED; - } - - protected supplyFileImportErrorEvent(): TanzuEventType { - return TanzuEventType.DOCKER_CONFIG_FILE_IMPORT_ERROR; - } - - protected supplyWizardName(): string { - return 'DockerWizard'; - } - - protected supplyStepData(): FormDataForHTML[] { - return [ - this.DockerDaemonForm, - this.DockerNetworkForm, - this.DockerNodeSettingForm - ]; - } - - ngOnInit(): void { - super.ngOnInit(); - - // To avoid re-open issue for the first step. - this.form.markAsDirty(); - - this.titleService.setTitle(this.title ? this.title + ' Docker' : 'Docker'); - } - - setFromPayload(payload: DockerRegionalClusterParams) { - this.setFieldValue(WizardForm.NETWORK, NetworkField.CLUSTER_SERVICE_CIDR, payload.networking.clusterServiceCIDR); - this.setFieldValue(WizardForm.NETWORK, NetworkField.CLUSTER_POD_CIDR, payload.networking.clusterPodCIDR); - this.setFieldValue(WizardForm.NETWORK, NetworkField.CNI_TYPE, payload.networking.cniType); - - this.setFieldValue(DockerNodeSettingStepName, 'clusterName', payload.clusterName); - - this.storeProxyFieldsFromPayload(payload); - - AppServices.userDataService.updateWizardTimestamp(this.wizardName); - } - - getPayload() { - const payload: DockerRegionalClusterParams = {} - - payload.networking = { - clusterDNSName: '', - clusterNodeCIDR: '', - clusterServiceCIDR: this.getFieldValue(WizardForm.NETWORK, NetworkField.CLUSTER_SERVICE_CIDR), - clusterPodCIDR: this.getFieldValue(WizardForm.NETWORK, NetworkField.CLUSTER_POD_CIDR), - cniType: this.getFieldValue(WizardForm.NETWORK, NetworkField.CNI_TYPE) - }; - - payload.clusterName = this.getFieldValue(DockerNodeSettingStepName, 'clusterName'); - - if (this.getFieldValue(WizardForm.NETWORK, NetworkField.PROXY_SETTINGS)) { - let proxySettingsMap = null; - proxySettingsMap = [ - ['HTTPProxyURL', WizardForm.NETWORK, NetworkField.HTTP_PROXY_URL], - ['HTTPProxyUsername', WizardForm.NETWORK, NetworkField.HTTP_PROXY_USERNAME], - ['HTTPProxyPassword', WizardForm.NETWORK, NetworkField.HTTP_PROXY_PASSWORD], - ['noProxy', WizardForm.NETWORK, NetworkField.NO_PROXY] - ]; - if (this.getFieldValue(WizardForm.NETWORK, NetworkField.HTTPS_IS_SAME_AS_HTTP)) { - proxySettingsMap = [ - ...proxySettingsMap, - ['HTTPSProxyURL', WizardForm.NETWORK, NetworkField.HTTP_PROXY_URL], - ['HTTPSProxyUsername', WizardForm.NETWORK, NetworkField.HTTP_PROXY_USERNAME], - ['HTTPSProxyPassword', WizardForm.NETWORK, NetworkField.HTTP_PROXY_PASSWORD] - ]; - } else { - proxySettingsMap = [ - ...proxySettingsMap, - ['HTTPSProxyURL', WizardForm.NETWORK, NetworkField.HTTPS_PROXY_URL], - ['HTTPSProxyUsername', WizardForm.NETWORK, NetworkField.HTTPS_PROXY_USERNAME], - ['HTTPSProxyPassword', WizardForm.NETWORK, NetworkField.HTTPS_PROXY_PASSWORD] - ]; - } - payload.networking.httpProxyConfiguration = { - enabled: true - }; - proxySettingsMap.forEach(attr => { - let val = this.getFieldValue(attr[1], attr[2]); - if (attr[0] === 'noProxy') { - val = val.replace(/\s/g, ''); // remove all spaces - } - payload.networking.httpProxyConfiguration[attr[0]] = val; - }); - } - - payload.identityManagement = { - 'idm_type': 'none' - } - - return payload; - } - - applyTkgConfig(): Observable { - return this.apiClient.applyTKGConfigForDocker({ params: this.getPayload() }); - } - - /** - * Return management/standalone cluster name - */ - getMCName() { - return this.getFieldValue(DockerNodeSettingStepName, 'clusterName'); - } - - /** - * Retrieve the config file from the backend and return as a string - */ - retrieveExportFile() { - return this.apiClient.exportTKGConfigForDocker({ params: this.getPayload() }); - } - - exportConfiguration() { - const wizard = this; // capture 'this' outside the context of the closure below - this.exportService.export( - this.retrieveExportFile(), - (failureMessage) => { wizard.displayError(failureMessage); } - ); - } - - getCli(configPath: string): string { - const cliG = new CliGenerator(); - const cliParams: CliFields = { - configPath: configPath, - clusterType: this.getClusterType(), - clusterName: this.getMCName(), - extendCliCmds: [] - }; - return cliG.getCli(cliParams); - } - - createRegionalCluster(payload: any): Observable { - return this.apiClient.createDockerRegionalCluster(payload); - } - - // FormDataForHTML methods - // - get DockerNetworkForm(): FormDataForHTML { - return FormUtility.formWithOverrides(super.NetworkForm, - { description: DockerNetworkStepComponent.description, clazz: DockerNetworkStepComponent }); - } - get DockerNodeSettingForm(): FormDataForHTML { - const title = FormUtility.titleCase(this.clusterTypeDescriptor) + ' Cluster Settings'; - return { name: DockerNodeSettingStepName, title: title, description: 'Optional: Specify the management cluster name', - i18n: { title: 'node setting step name', description: 'node setting step description' }, - clazz: NodeSettingStepComponent}; - } - get DockerDaemonForm(): FormDataForHTML { - return { name: 'dockerDaemonForm', title: 'Docker Prerequisites', - description: 'Validate the local Docker daemon, allocated CPUs and Total Memory', - i18n: {title: 'docker prerequisite step name', description: 'Docker prerequisite step description'}, - clazz: DaemonValidationStepComponent}; - } - - // returns TRUE if the file contents appear to be a valid config file for Docker - // returns FALSE if the file is empty or does not appear to be valid. Note that in the FALSE - // case we also alert the user. - importFileValidate(nameFile: string, fileContents: string): boolean { - if (fileContents.includes('INFRASTRUCTURE_PROVIDER: docker')) { - return true; - } - alert(nameFile + ' is not a valid docker configuration file!'); - return false; - } - - importFileRetrieveClusterParams(fileContents: string): Observable { - return this.apiClient.importTKGConfigForVsphere( { params: { filecontents: fileContents } } ); - } - - importFileProcessClusterParams(event: TanzuEventType, nameFile: string, dockerClusterParams: DockerRegionalClusterParams) { - this.setFromPayload(dockerClusterParams); - this.resetToFirstStep(); - this.importService.publishImportSuccess(event, nameFile); - } - - // returns TRUE if user (a) will not lose data on import, or (b) confirms it's OK - onImportButtonClick() { - let result = true; - if (!this.isOnFirstStep()) { - result = confirm('Importing will overwrite any data you have entered. Proceed with import?'); - } - return result; - } - - onImportFileSelected(event) { - const params: ImportParams = { - eventSuccess: this.supplyFileImportedEvent(), - eventFailure: this.supplyFileImportErrorEvent(), - file: event.target.files[0], - validator: this.importFileValidate, - backend: this.importFileRetrieveClusterParams.bind(this), - onSuccess: this.importFileProcessClusterParams.bind(this), - onFailure: this.importService.publishImportFailure - } - this.importService.import(params); - - // clear file reader target so user can re-select same file if needed - event.target.value = ''; - } -} diff --git a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.module.ts b/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.module.ts deleted file mode 100644 index ae49403a7e..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/docker-wizard.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { DockerWizardComponent } from './docker-wizard.component'; -import { DockerWizardRoutingModule } from './docker-wizard-routing.module'; -import { LandingModule } from '../landing.module'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { WizardSharedModule } from '../wizard/shared/wizard-shared.module'; -import { DaemonValidationStepComponent } from './daemon-validation-step/daemon-validation-step.component'; -import { NodeSettingStepComponent } from './node-setting-step/node-setting-step.component'; - -@NgModule({ - declarations: [DockerWizardComponent, DaemonValidationStepComponent, NodeSettingStepComponent], - imports: [ - CommonModule, - DockerWizardRoutingModule, - SharedModule, - WizardSharedModule, - LandingModule - ] -}) -export class DockerWizardModule { } diff --git a/tkg/web/src/app/views/landing/docker-wizard/network-step/docker-network-step.component.ts b/tkg/web/src/app/views/landing/docker-wizard/network-step/docker-network-step.component.ts deleted file mode 100644 index 5d610270ab..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/network-step/docker-network-step.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -// App imports -import AppServices from '../../../../shared/service/appServices'; -import { NetworkField } from '../../wizard/shared/components/steps/network-step/network-step.fieldmapping'; -import { SharedNetworkStepComponent } from '../../wizard/shared/components/steps/network-step/network-step.component'; - -export class DockerNetworkStepComponent extends SharedNetworkStepComponent { - static readonly description = 'Specify the cluster Pod CIDR'; - - protected supplyFieldsAffectingStepDescription(): string[] { - return [NetworkField.CLUSTER_POD_CIDR]; - } - - dynamicDescription(): string { - if (this.getFieldValue(NetworkField.CLUSTER_POD_CIDR)) { - return 'Cluster Pod CIDR: ' + this.getFieldValue(NetworkField.CLUSTER_POD_CIDR); - } - return DockerNetworkStepComponent.description; - } - - protected storeUserData() { - const identifier = this.createUserDataIdentifier('clusterPodCidr'); - AppServices.userDataFormService.storeInputField(identifier, this.formGroup); - this.storeDisplayOrder(['clusterPodCidr']); - } -} diff --git a/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.component.html b/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.component.html deleted file mode 100644 index 0f65e8272f..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.component.html +++ /dev/null @@ -1,32 +0,0 @@ -
-
-
- - - - - - - {{ clusterTypeDescriptorTitleCase }} Cluster name is required. - - - {{ clusterTypeDescriptorTitleCase }} Cluster name must start and end with a letter or number, and can contain only - lowercase letters, numbers, and hyphens. - - - {{ clusterTypeDescriptorTitleCase }} Cluster Name must not include whitespace on ends. - - -
-
-
diff --git a/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.component.scss b/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.component.spec.ts b/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.component.spec.ts deleted file mode 100644 index 553a7e2e1f..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.component.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; - -import { NodeSettingStepComponent } from './node-setting-step.component'; - -describe('NodeSettingStepComponent', () => { - let component: NodeSettingStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ NodeSettingStepComponent ], - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - ValidationService, - FormBuilder, - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - const fb = new FormBuilder(); - - fixture = TestBed.createComponent(NodeSettingStepComponent); - component = fixture.componentInstance; - component.formGroup = fb.group({ - clusterName: 'testClusterName' - }); - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should have a cluster name', () => { - expect(component.formGroup.get('clusterName').value).toBe('testClusterName'); - }); -}); diff --git a/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.component.ts b/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.component.ts deleted file mode 100644 index 21d80348e2..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { StepFormDirective } from '../../wizard/shared/step-form/step-form'; -// App imports -import AppServices from "../../../../shared/service/appServices"; -import { DockerNodeSettingStepMapping } from './node-setting-step.fieldmapping'; - -@Component({ - selector: 'app-node-setting-step', - templateUrl: './node-setting-step.component.html', - styleUrls: ['./node-setting-step.component.scss'] -}) -export class NodeSettingStepComponent extends StepFormDirective implements OnInit { - clusterNameInstruction: string; - - private supplyStepMapping() { - return DockerNodeSettingStepMapping; - } - - ngOnInit(): void { - super.ngOnInit(); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, this.supplyStepMapping()); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(this.supplyStepMapping()); - this.storeDefaultLabels(this.supplyStepMapping()); - this.registerDefaultFileImportedHandler(this.eventFileImported, this.supplyStepMapping()); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - - this.clusterNameInstruction = 'Specify a name for the ' + this.clusterTypeDescriptor + ' cluster.'; - } - - protected storeUserData() { - this.storeUserDataFromMapping(DockerNodeSettingStepMapping); - this.storeDefaultDisplayOrder(DockerNodeSettingStepMapping); - } -} diff --git a/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.fieldmapping.ts b/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.fieldmapping.ts deleted file mode 100644 index 7f5eb26bb0..0000000000 --- a/tkg/web/src/app/views/landing/docker-wizard/node-setting-step/node-setting-step.fieldmapping.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { SimpleValidator } from '../../wizard/shared/constants/validation.constants'; - -export const DockerNodeSettingStepName = 'dockerNodeSettings'; - -export const DockerNodeSettingStepMapping: StepMapping = { - fieldMappings: [ - { name: 'clusterName', required: true, validators: [SimpleValidator.IS_VALID_CLUSTER_NAME], label: 'CLUSTER NAME' }, - ] -} diff --git a/tkg/web/src/app/views/landing/incompatible/incompatible.component.html b/tkg/web/src/app/views/landing/incompatible/incompatible.component.html deleted file mode 100644 index aee8358fc6..0000000000 --- a/tkg/web/src/app/views/landing/incompatible/incompatible.component.html +++ /dev/null @@ -1,7 +0,0 @@ -

- Welcome to the Tanzu Kubernetes Grid Installer -

-

- The minimum vSphere version supported by Tanzu Kubernetes Grid is vSphere 6.7u3. - Please upgrade vSphere and try again. -

diff --git a/tkg/web/src/app/views/landing/incompatible/incompatible.component.scss b/tkg/web/src/app/views/landing/incompatible/incompatible.component.scss deleted file mode 100644 index b8c0475dd8..0000000000 --- a/tkg/web/src/app/views/landing/incompatible/incompatible.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -p.mh400 { - min-height: 400px; -} diff --git a/tkg/web/src/app/views/landing/incompatible/incompatible.component.spec.ts b/tkg/web/src/app/views/landing/incompatible/incompatible.component.spec.ts deleted file mode 100644 index 1edab5e65c..0000000000 --- a/tkg/web/src/app/views/landing/incompatible/incompatible.component.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -// Angular modules -import { TestBed, async } from '@angular/core/testing'; - -// App imports -import { IncompatibleComponent } from './incompatible.component'; - -describe('IncompatibleComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [], - declarations: [ - IncompatibleComponent - ] - }).compileComponents(); - })); - - it('should exist', () => { - const fixture = TestBed.createComponent(IncompatibleComponent); - const incompatibleComponent = fixture.debugElement.componentInstance; - expect(incompatibleComponent).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/views/landing/incompatible/incompatible.component.ts b/tkg/web/src/app/views/landing/incompatible/incompatible.component.ts deleted file mode 100644 index 50da585b30..0000000000 --- a/tkg/web/src/app/views/landing/incompatible/incompatible.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Angular imports -import { Component } from '@angular/core'; - -@Component({ - selector: 'tkg-kickstart-ui-incompatible', - templateUrl: './incompatible.component.html', - styleUrls: ['./incompatible.component.scss'] -}) -export class IncompatibleComponent { - - constructor() {} -} diff --git a/tkg/web/src/app/views/landing/landing-routing.module.ts b/tkg/web/src/app/views/landing/landing-routing.module.ts deleted file mode 100644 index e6e4c9db42..0000000000 --- a/tkg/web/src/app/views/landing/landing-routing.module.ts +++ /dev/null @@ -1,62 +0,0 @@ -// Angular modules -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -// App imports -import { LandingComponent } from './landing.component'; -import { StartComponent } from './start/start.component'; -import { DeployProgressComponent } from './deploy-progress/deploy-progress.component'; -import { WcpRedirectComponent } from './wcp-redirect/wcp-redirect.component'; -import { IncompatibleComponent } from './incompatible/incompatible.component'; - -export const routes: Routes = [ - { - path: '', - component: LandingComponent, - children: [ - { - path: '', - component: StartComponent - }, - { - path: 'wizard', - loadChildren: () => import('./vsphere-wizard/vsphere-wizard.module').then(m => m.WizardModule) - }, - { - path: 'aws/wizard', - loadChildren: () => import('./aws-wizard/aws-wizard.module').then(m => m.AwsWizardModule) - }, - { - path: 'azure/wizard', - loadChildren: () => import('./azure-wizard/azure-wizard.module').then(m => m.AzureWizardModule) - }, - { - path: 'docker/wizard', - loadChildren: () => import('./docker-wizard/docker-wizard.module').then(m => m.DockerWizardModule) - }, - { - path: 'deploy-progress', - component: DeployProgressComponent - }, - { - path: 'vsphere-with-kubernetes', - component: WcpRedirectComponent - }, - { - path: 'incompatible', - component: IncompatibleComponent - } - ] - } -]; - -/** - * @module LandingRoutingModule - * @description - * This is routing module for the landing module. - */ -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class LandingRoutingModule {} diff --git a/tkg/web/src/app/views/landing/landing.component.html b/tkg/web/src/app/views/landing/landing.component.html deleted file mode 100644 index 18bebfc993..0000000000 --- a/tkg/web/src/app/views/landing/landing.component.html +++ /dev/null @@ -1,8 +0,0 @@ -
-
-
-
-
- -
-
diff --git a/tkg/web/src/app/views/landing/landing.component.scss b/tkg/web/src/app/views/landing/landing.component.scss deleted file mode 100644 index 91808a20fd..0000000000 --- a/tkg/web/src/app/views/landing/landing.component.scss +++ /dev/null @@ -1,18 +0,0 @@ -@import '../../../sass/properties.scss'; - -@media (max-width: $medium) { - .image-container { - height: 200px; - text-align: center; - } -} -@media (max-width: $medium) { - .landing-image { - width: 300px; - height: 200px; - } -} - -.clr-row.main-row { - min-height: 400px; -} diff --git a/tkg/web/src/app/views/landing/landing.component.spec.ts b/tkg/web/src/app/views/landing/landing.component.spec.ts deleted file mode 100644 index 947724c8e3..0000000000 --- a/tkg/web/src/app/views/landing/landing.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -// Angular modules -import { TestBed, async } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -// App imports -import { LandingComponent } from './landing.component'; - -describe('LandingComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule - ], - declarations: [ - LandingComponent - ] - }).compileComponents(); - })); - - it('should exist', () => { - const fixture = TestBed.createComponent(LandingComponent); - const landingComponent = fixture.debugElement.componentInstance; - expect(landingComponent).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/views/landing/landing.component.ts b/tkg/web/src/app/views/landing/landing.component.ts deleted file mode 100644 index dff4c42a68..0000000000 --- a/tkg/web/src/app/views/landing/landing.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Angular imports -import { Component } from '@angular/core'; - -@Component({ - selector: 'tkg-kickstart-ui-landing', - templateUrl: './landing.component.html', - styleUrls: ['./landing.component.scss'] -}) -export class LandingComponent { - constructor() {} -} diff --git a/tkg/web/src/app/views/landing/landing.module.ts b/tkg/web/src/app/views/landing/landing.module.ts deleted file mode 100644 index 22fa0558cb..0000000000 --- a/tkg/web/src/app/views/landing/landing.module.ts +++ /dev/null @@ -1,51 +0,0 @@ -// Angular modules -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -// Third party modules -import { LogMonitorModule } from 'ngx-log-monitor'; - -// App imports -import { AlertNotificationComponent } from '../../shared/components/alert-notification/alert-notification.component'; -import { ClusterClassInfoComponent } from './wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component'; -import { ConfirmationComponent } from './confirm/confirmation.component'; -import { DeployProgressComponent } from './deploy-progress/deploy-progress.component'; -import { ErrorNotificationComponent } from "../../shared/components/error-notification/error-notification.component"; -import { IncompatibleComponent } from './incompatible/incompatible.component'; -import { LandingComponent } from './landing.component'; -import { LandingRoutingModule } from './landing-routing.module'; -import { PreviewConfigComponent } from '../../shared/components/preview-config/preview-config.component'; -import { SharedModule } from '../../shared/shared.module'; -import { StartComponent } from './start/start.component'; -import { VmwCopyToClipboardButtonComponent } from '../../shared/components/copy-to-clipboard-button/copy-to-clipboard-button.component'; -import { WcpRedirectComponent } from './wcp-redirect/wcp-redirect.component'; - -@NgModule({ - declarations: [ - AlertNotificationComponent, - ConfirmationComponent, - ClusterClassInfoComponent, - DeployProgressComponent, - ErrorNotificationComponent, - IncompatibleComponent, - LandingComponent, - PreviewConfigComponent, - StartComponent, - VmwCopyToClipboardButtonComponent, - WcpRedirectComponent - ], - imports: [ - CommonModule, - LandingRoutingModule, - LogMonitorModule, - SharedModule - ], - exports: [ - AlertNotificationComponent, - ClusterClassInfoComponent, - ConfirmationComponent, - ErrorNotificationComponent - ] -}) - -export class LandingModule {} diff --git a/tkg/web/src/app/views/landing/start/start.component.html b/tkg/web/src/app/views/landing/start/start.component.html deleted file mode 100644 index 5e2f471033..0000000000 --- a/tkg/web/src/app/views/landing/start/start.component.html +++ /dev/null @@ -1,119 +0,0 @@ -
-
-

{{ landingPageContent?.title }}

-

-

-
-
-
-
-

Deploy the {{ clusterTypeDescriptor }} cluster

-
-
-
-
-
-
-
- Docker -
-
-
-
-

- Deploy your {{ clusterTypeDescriptor }} cluster on your local workstation -

-
- -
-
-
-
-
-
- VMware vSphere -
-
-
-
-

- Deploy your {{ clusterTypeDescriptor }} cluster on VMware vSphere -

-
- -
-
-
-
-
-
- Amazon Web Services -
-
-
-
-

- Deploy your {{ clusterTypeDescriptor }} cluster on Amazon Elastic Compute Cloud -

-
- -
-
-
-
-
-
- Microsoft Azure -
-
-
-
-

- Deploy your {{ clusterTypeDescriptor }} cluster on Microsoft Azure -

-
- -
-
-
-
-
-
- - Loading... - -
-
-
diff --git a/tkg/web/src/app/views/landing/start/start.component.scss b/tkg/web/src/app/views/landing/start/start.component.scss deleted file mode 100644 index dc793f12ca..0000000000 --- a/tkg/web/src/app/views/landing/start/start.component.scss +++ /dev/null @@ -1,23 +0,0 @@ -@import '../landing.component.scss'; - -.card { - &.provider { - .card-block, - .card-footer { - text-align: center; - - .btn { - margin: 0; - } - } - - .card-media-block { - justify-content: center; - align-items: center; - } - - .card-block { - min-height: 170px; - } - } -} diff --git a/tkg/web/src/app/views/landing/start/start.component.spec.ts b/tkg/web/src/app/views/landing/start/start.component.spec.ts deleted file mode 100644 index 8f4f8c77b5..0000000000 --- a/tkg/web/src/app/views/landing/start/start.component.spec.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Angular modules -import { TestBed, async, ComponentFixture } from '@angular/core/testing'; -import { Router } from '@angular/router'; -import { RouterTestingModule } from '@angular/router/testing'; -import { APP_ROUTES } from 'src/app/shared/constants/routes.constants'; - -// App imports -import { StartComponent } from './start.component'; - -describe('StartComponent', () => { - let fixture: ComponentFixture; - let component: StartComponent; - let router: Router; - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule - ], - declarations: [ - StartComponent - ] - }).compileComponents(); - })); - - beforeEach(() => { - router = TestBed.inject(Router); - fixture = TestBed.createComponent(StartComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should exist', () => { - const landingComponent = fixture.debugElement.componentInstance; - expect(landingComponent).toBeTruthy(); - }); - - it('should navigate to wizard', () => { - const routerSpy = spyOn(router, 'navigate').and.stub(); - component.navigateToWizard('vsphere'); - expect(routerSpy).toHaveBeenCalledWith([APP_ROUTES.WIZARD_MGMT_CLUSTER]); - component.navigateToWizard('aws'); - expect(routerSpy).toHaveBeenCalledWith([APP_ROUTES.AWS_WIZARD]); - component.navigateToWizard('azure'); - expect(routerSpy).toHaveBeenCalledWith([APP_ROUTES.AZURE_WIZARD]); - }); -}); diff --git a/tkg/web/src/app/views/landing/start/start.component.ts b/tkg/web/src/app/views/landing/start/start.component.ts deleted file mode 100644 index c99703b443..0000000000 --- a/tkg/web/src/app/views/landing/start/start.component.ts +++ /dev/null @@ -1,77 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { Title } from '@angular/platform-browser'; -// Third party imports -import { Observable } from 'rxjs'; -// App imports -import { APP_ROUTES, Routes } from '../../../shared/constants/routes.constants'; -import AppServices from 'src/app/shared/service/appServices'; -import { BasicSubscriber } from 'src/app/shared/abstracts/basic-subscriber'; -import { BrandingObj, EditionData } from '../../../shared/service/branding.service'; -import { PROVIDERS, Providers } from '../../../shared/constants/app.constants'; -import { TanzuEventType } from 'src/app/shared/service/Messenger'; - -@Component({ - selector: 'tkg-kickstart-ui-start', - templateUrl: './start.component.html', - styleUrls: ['./start.component.scss'] -}) -export class StartComponent extends BasicSubscriber implements OnInit { - APP_ROUTES: Routes = APP_ROUTES; - PROVIDERS: Providers = PROVIDERS; - - edition: string; - clusterTypeDescriptor: string; - provider: Observable; - landingPageContent: BrandingObj; - loading: boolean = false; - - constructor(private router: Router, - private titleService: Title) { - super(); - this.provider = AppServices.appDataService.getProviderType(); - } - - ngOnInit() { - /** - * Whenever branding data changes, load content in landing page - */ - AppServices.messenger.subscribe(TanzuEventType.BRANDING_CHANGED, data => { - this.edition = data.payload.edition; - this.clusterTypeDescriptor = data.payload.clusterTypeDescriptor; - this.landingPageContent = data.payload.branding.landingPage; - this.titleService.setTitle(data.payload.branding.title); - }, this.unsubscribe); - } - - /** - * @method navigateToWizard - * @desc helper method to trigger router navigation to wizard - * @param provider - the provider to load wizard for - */ - navigateToWizard(provider: string): void { - this.loading = true; - AppServices.appDataService.setProviderType(provider); - let wizard; - switch (provider) { - case PROVIDERS.VSPHERE: { - wizard = APP_ROUTES.WIZARD_MGMT_CLUSTER; - break; - } - case PROVIDERS.AWS: { - wizard = APP_ROUTES.AWS_WIZARD; - break; - } - case PROVIDERS.AZURE: { - wizard = APP_ROUTES.AZURE_WIZARD; - break; - } - case PROVIDERS.DOCKER: { - wizard = APP_ROUTES.DOCKER_WIZARD; - break; - } - } - this.router.navigate([wizard]); - } -} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/load-balancer/vsphere-load-balancer-step.component.spec.ts b/tkg/web/src/app/views/landing/vsphere-wizard/load-balancer/vsphere-load-balancer-step.component.spec.ts deleted file mode 100644 index fc946e8db5..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/load-balancer/vsphere-load-balancer-step.component.spec.ts +++ /dev/null @@ -1,96 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -// App imports -import { APIClient } from '../../../../swagger'; -import AppServices from '../../../../shared/service/appServices'; -import { DataServiceRegistrarTestExtension } from '../../../../testing/data-service-registrar.testextension'; -import { FieldMapUtilities } from '../../wizard/shared/field-mapping/FieldMapUtilities'; -import { KUBE_VIP } from '../node-setting-step/node-setting-step.fieldmapping'; -import { LoadBalancerField } from '../../wizard/shared/components/steps/load-balancer/load-balancer-step.fieldmapping'; -import { Messenger, TanzuEventType } from '../../../../shared/service/Messenger'; -import { ResourcePool } from '../resource-step/resource-step.component'; -import { SharedModule } from '../../../../shared/shared.module'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { VSphereDatastore, VSphereFolder, VSphereResourcePool } from '../../../../swagger/models'; -import { VsphereLoadBalancerStepComponent } from './vsphere-load-balancer-step.component'; -import { WizardForm } from '../../wizard/shared/constants/wizard.constants'; - -describe('VsphereLoadBalancerStepComponent', () => { - let component: VsphereLoadBalancerStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule, - BrowserAnimationsModule - ], - providers: [ - ValidationService, - FormBuilder, - FieldMapUtilities, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [VsphereLoadBalancerStepComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - const dataServiceRegistrar = new DataServiceRegistrarTestExtension(); - AppServices.dataServiceRegistrar = dataServiceRegistrar; - // we expect the wizard to have registered for these events: - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_RESOURCE_POOLS); - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_COMPUTE_RESOURCE); - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_DATA_STORES); - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_VM_FOLDERS); - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_VM_NETWORKS); - - fixture = TestBed.createComponent(VsphereLoadBalancerStepComponent); - component = fixture.componentInstance; - component.setStepRegistrantData({ wizard: 'BozoWizard', step: WizardForm.LOADBALANCER, formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORTED, - eventFileImportError: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORT_ERROR}); - - fixture.detectChanges(); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.ngOnInit(); - const controllerHostControl = component.formGroup.get(LoadBalancerField.CONTROLLER_HOST); - - expect(component.dynamicDescription()).toEqual(VsphereLoadBalancerStepComponent.description); - - AppServices.messenger.publish({ - type: TanzuEventType.VSPHERE_CONTROL_PLANE_ENDPOINT_PROVIDER_CHANGED, - payload: KUBE_VIP - }); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.LOADBALANCER, - description: VsphereLoadBalancerStepComponent.descriptionKubeVip, - } - }); - - controllerHostControl.setValue('JAMOCA'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.LOADBALANCER, - description: 'Controller: JAMOCA', - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/load-balancer/vsphere-load-balancer-step.component.ts b/tkg/web/src/app/views/landing/vsphere-wizard/load-balancer/vsphere-load-balancer-step.component.ts deleted file mode 100644 index b5ea98c606..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/load-balancer/vsphere-load-balancer-step.component.ts +++ /dev/null @@ -1,78 +0,0 @@ -// Angular imports -import { Validators } from '@angular/forms'; -import { Component, OnInit } from '@angular/core'; -// App imports -import AppServices from '../../../../shared/service/appServices'; -import { KUBE_VIP, NSX_ADVANCED_LOAD_BALANCER } from '../node-setting-step/node-setting-step.fieldmapping'; -import { LoadBalancerField } from '../../wizard/shared/components/steps/load-balancer/load-balancer-step.fieldmapping'; -import { SharedLoadBalancerStepComponent } from '../../wizard/shared/components/steps/load-balancer/load-balancer-step.component'; -import { TanzuEventType } from '../../../../shared/service/Messenger'; - -const HA_REQUIRED_FIELDS = [ - LoadBalancerField.CONTROLLER_HOST, - LoadBalancerField.USERNAME, - LoadBalancerField.PASSWORD, - LoadBalancerField.CONTROLLER_CERT, - LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_NAME, - LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_CIDR -] - -@Component({ - selector: 'app-vsphere-load-balancer-step', - templateUrl: '../../wizard/shared/components/steps/load-balancer/load-balancer-step.component.html', - styleUrls: ['../../wizard/shared/components/steps/load-balancer/load-balancer-step.component.scss'] -}) -export class VsphereLoadBalancerStepComponent extends SharedLoadBalancerStepComponent implements OnInit { - static readonly description = 'Specify VMware NSX Advanced Load Balancer settings'; - static readonly descriptionKubeVip = 'Optionally specify VMware NSX Advanced Load Balancer settings'; - - currentControlPlaneEndpointProvider: string; - - ngOnInit() { - super.ngOnInit(); - this.setLoadBalancerLabel(this.currentControlPlaneEndpointProvider); - this.registerStepDescriptionTriggers({fields: [LoadBalancerField.CONTROLLER_HOST]}); - } - - private setLoadBalancerLabel(controlPlaneEndpointProvider: string) { - let prependLabel = ''; - if (controlPlaneEndpointProvider === NSX_ADVANCED_LOAD_BALANCER) { - prependLabel = 'Manual '; - } else if (controlPlaneEndpointProvider === KUBE_VIP) { - prependLabel = 'Optional '; - } - this.loadBalancerLabel = prependLabel + 'VMware NSX Advanced Load Balancer Settings'; - } - - protected customizeForm() { - super.customizeForm(); - AppServices.messenger.subscribe(TanzuEventType.VSPHERE_CONTROL_PLANE_ENDPOINT_PROVIDER_CHANGED, ({ payload }) => { - this.onControlPlaneEndpointProviderChange(payload); - }); - } - - private onControlPlaneEndpointProviderChange(newProvider: string) { - this.currentControlPlaneEndpointProvider = newProvider; - if (this.currentControlPlaneEndpointProvider === NSX_ADVANCED_LOAD_BALANCER) { - HA_REQUIRED_FIELDS.forEach(fieldName => this.resurrectField(fieldName, [Validators.required])); - } else { - HA_REQUIRED_FIELDS.forEach(fieldName => this.disarmField(fieldName, true)); - } - this.errorNotification = ''; - this.setLoadBalancerLabel(newProvider); - this.triggerStepDescriptionChange(); - } - - dynamicDescription(): string { - // NOTE: even though this is a common wizard form, vSphere has a different way of describing it - const controllerHost = this.getFieldValue(LoadBalancerField.CONTROLLER_HOST); - if (controllerHost) { - return 'Controller: ' + controllerHost; - } - - if (this.currentControlPlaneEndpointProvider === KUBE_VIP) { - return VsphereLoadBalancerStepComponent.descriptionKubeVip; - } - return VsphereLoadBalancerStepComponent.description; - } -} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.html b/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.html deleted file mode 100644 index c2fb4db917..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.html +++ /dev/null @@ -1,272 +0,0 @@ -
- - -

- {{ clusterTypeDescriptorTitleCase }} Cluster Settings -

- - - -
-
- - - - - - - {{ clusterTypeDescriptorTitleCase }} Cluster name must start and end with a letter or number, and can contain only - lowercase letters, numbers, and hyphens. - - - {{ clusterTypeDescriptorTitleCase }} Cluster Name must not include whitespace on ends. - - - Cluster name is required - - -
-
- - - - - - - -
-
- -
-
- - - - Selecting a Control Plane Endpoint Provider is required - -
- -
- - - - - - - control plane endpoint is required - - - control plane endpoint format is invalid - - -
-
- -
-
- - - - - - Selecting worker instance type is required - -
-
- -
-
-
diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.scss b/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.scss deleted file mode 100644 index fcf79019ac..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.scss +++ /dev/null @@ -1,56 +0,0 @@ -.card-icon { - position: relative; - left: 43%; -} - -.card-title { - text-align: center; -} - -.card-selected { - box-shadow: 0 .15rem 0 0 var(--clr-card-clickable-box-shadow-color); - border-style: solid; - transform: translateY(-.1rem); - transition: border .2s ease,transform .2s ease,-webkit-transform .2s ease; - border-color: var(--clr-card-clickable-border-color, #179bd3); -} - -.card-footer { - .clr-row { - align-items: baseline; - } -} - -.ha-template { - display: inline-block; -} - -.refresh-btn { - cursor: pointer; - display: inline-block; - height: 100%; - vertical-align: top; - color: #0072a3; - - clr-icon, - .spinner-sm { - position: relative; - top: 48px; - } -} - -.node-type-container { - max-width: 45%; -} - -.node-type-select { - display: inline-block; - max-width: 200px; -} - -// tooltip max-width fix -:host ::ng-deep clr-tooltip { - clr-tooltip-content { - max-width: 300px; - } -} \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.spec.ts b/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.spec.ts deleted file mode 100644 index b75bff86e4..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.spec.ts +++ /dev/null @@ -1,89 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { SharedModule } from '../../../../shared/shared.module'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -// App imports -import { APIClient } from '../../../../swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { NodeSettingStepComponent } from './node-setting-step.component'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; - -describe('NodeSettingStepComponent', () => { - let component: NodeSettingStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - ValidationService, - FormBuilder, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [NodeSettingStepComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - - fixture = TestBed.createComponent(NodeSettingStepComponent); - component = fixture.componentInstance; - component.setStepRegistrantData({ wizard: 'BozoWizard', step: 'vsphereNodeSettingForm', formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORTED, - eventFileImportError: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORT_ERROR}); - - fixture.detectChanges(); - }); - - it('should get correct env value', () => { - component.cardClickProd(); - expect(component.isClusterPlanProd).toBeTrue(); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.ngOnInit(); - - expect(component.dynamicDescription()).toEqual('Specify the resources backing the cluster'); - - component.setClusterTypeDescriptor('VANILLA'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: 'vsphereNodeSettingForm', - description: 'Specify the resources backing the VANILLA cluster', - } - }); - - component.cardClickDev(); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: 'vsphereNodeSettingForm', - description: 'Development cluster selected: 1 node control plane' - } - }); - - component.cardClickProd(); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: 'vsphereNodeSettingForm', - description: 'Production cluster selected: 3 node control plane' - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.ts b/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.ts deleted file mode 100644 index ca00c946fa..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.component.ts +++ /dev/null @@ -1,75 +0,0 @@ -// Angular imports -import { Component, Input, OnInit } from '@angular/core'; -import { Validators } from '@angular/forms'; -// App imports -import AppServices from 'src/app/shared/service/appServices'; -import { IpFamilyEnum } from '../../../../shared/constants/app.constants'; -import { KUBE_VIP, NSX_ADVANCED_LOAD_BALANCER, VsphereNodeSettingFieldMappings } from './node-setting-step.fieldmapping'; -import { NodeSettingStepDirective } from '../../wizard/shared/components/steps/node-setting-step/node-setting-step.component'; -import { NodeSettingField } from '../../wizard/shared/components/steps/node-setting-step/node-setting-step.fieldmapping'; -import { NodeType } from '../../wizard/shared/constants/wizard.constants'; -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { TanzuEventType } from 'src/app/shared/service/Messenger'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { VsphereField, VsphereNodeTypes } from '../vsphere-wizard.constants'; - -@Component({ - selector: 'app-node-setting-step', - templateUrl: './node-setting-step.component.html', - styleUrls: ['./node-setting-step.component.scss'] -}) -export class NodeSettingStepComponent extends NodeSettingStepDirective implements OnInit { - controlPlaneEndpointProviders = [KUBE_VIP, NSX_ADVANCED_LOAD_BALANCER]; - currentControlPlaneEndpointProvider = KUBE_VIP; - controlPlaneEndpointOptional = ''; - - constructor(protected validationService: ValidationService) { - super(validationService); - this.nodeTypes = [...VsphereNodeTypes]; - } - - protected createStepMapping(): StepMapping { - const result = AppServices.fieldMapUtilities.cloneStepMapping(super.createStepMapping()); - // We take the inherited field mappings and insert our specific vSphere field mappings - AppServices.fieldMapUtilities.insertFieldMappingsAfter(result, NodeSettingField.WORKER_NODE_INSTANCE_TYPE, - VsphereNodeSettingFieldMappings); - return result; - } - - protected listenToEvents() { - super.listenToEvents(); - this.registerOnValueChange(VsphereField.NODESETTING_CONTROL_PLANE_ENDPOINT_PROVIDER, - this.onControlPlaneEndpointProviderChange.bind(this)); - this.registerOnIpFamilyChange(VsphereField.NODESETTING_CONTROL_PLANE_ENDPOINT_IP, - [ Validators.required, this.validationService.isValidIpOrFqdn() ], - [ Validators.required, this.validationService.isValidIpv6OrFqdn() ]); - } - - onControlPlaneEndpointProviderChange(provider: string): void { - this.currentControlPlaneEndpointProvider = provider; - AppServices.messenger.publish({ - type: TanzuEventType.VSPHERE_CONTROL_PLANE_ENDPOINT_PROVIDER_CHANGED, - payload: provider - }); - const validators = this.getIpValidators(provider); - const storedEndpointId = this.getStoredValue(VsphereField.NODESETTING_CONTROL_PLANE_ENDPOINT_IP, this.supplyStepMapping(), ''); - this.resurrectField(VsphereField.NODESETTING_CONTROL_PLANE_ENDPOINT_IP, validators, storedEndpointId, this.quietly); - - this.controlPlaneEndpointOptional = (provider === KUBE_VIP ? '' : '(OPTIONAL)'); - } - - private getIpValidators(provider: string) { - const ipValidator = this.ipFamily === IpFamilyEnum.IPv4 ? this.validationService.isValidIpOrFqdn() : - this.validationService.isValidIpv6OrFqdn(); - const validators = (provider === KUBE_VIP) ? [Validators.required, ipValidator] : [ipValidator]; - return validators; - } - - protected getKeyFromNodeInstance(nodeInstance: NodeType): string { - return nodeInstance.id; - } - - protected getDisplayFromNodeInstance(nodeInstance: NodeType): string { - return nodeInstance.name; - } -} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.fieldmapping.ts b/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.fieldmapping.ts deleted file mode 100644 index bad3c56056..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/node-setting-step/node-setting-step.fieldmapping.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { SimpleValidator } from '../../wizard/shared/constants/validation.constants'; -import { VsphereField } from '../vsphere-wizard.constants'; - -export const KUBE_VIP = 'Kube-vip'; -export const NSX_ADVANCED_LOAD_BALANCER = "NSX Advanced Load Balancer"; - -export const VsphereNodeSettingFieldMappings = [ - { name: VsphereField.NODESETTING_CONTROL_PLANE_ENDPOINT_PROVIDER, required: true, defaultValue: KUBE_VIP, - label: 'CONTROL PLANE ENDPOINT PROVIDER' }, - { name: VsphereField.NODESETTING_CONTROL_PLANE_ENDPOINT_IP, required: true, validators: [SimpleValidator.IS_VALID_FQDN_OR_IP], - label: 'CONTROL PLANE ENDPOINT' }, -]; -// About VsphereNodeSettingStandaloneStep: -// Extends common NodeSettingStep diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.html b/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.html deleted file mode 100644 index f232982ff7..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.html +++ /dev/null @@ -1,240 +0,0 @@ -
- - - - - - - - - - - - - - - -
-
- - - - - - - vCenter Server address cannot be empty - - - Enter a valid IP address or FQDN - - -
-
- - - - - - - Username cannot be empty - - -
-
- - - - - - - Password cannot be empty - - -
-
- - - - - - - -
-
- -
-
- -
-
-
-
- - - - - - Selecting a datacenter is required - -
-
-
- -
-
- - -
- SSH Public Key is required - - -
-
-
-
-
- - - - - - diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.scss b/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.scss deleted file mode 100644 index 39b2ab819e..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.scss +++ /dev/null @@ -1,24 +0,0 @@ -clr-radio-container label { - padding-bottom: 12px; - font-size: 14px; -} -.clr-textarea { - width: 500px; - height: 120px; -} - -.modal-title { - .vsphere-icon-30 { - margin-right: 8px; - } -} - -button.btn.btn-primary.btn-width-350 { - max-width: 350px; - width: 350px; -} - -.btn.btn-browse { - padding-left: 0; -} - diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.spec.ts b/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.spec.ts deleted file mode 100644 index a212395832..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.spec.ts +++ /dev/null @@ -1,114 +0,0 @@ -// Angular imports -import { async, ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; -// Third party imports -import { of } from 'rxjs'; -import { delay } from 'rxjs/operators'; -// App imports -import { APIClient } from 'src/app/swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { FieldMapUtilities } from '../../wizard/shared/field-mapping/FieldMapUtilities'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { SSLThumbprintModalComponent } from '../../wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { VSphereProviderStepComponent } from './vsphere-provider-step.component'; -import { VsphereField } from '../vsphere-wizard.constants'; - -describe('VSphereProviderStepComponent', () => { - let component: VSphereProviderStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule.withRoutes([ - { path: 'ui', component: VSphereProviderStepComponent } - ]), - ReactiveFormsModule, - SharedModule, - BrowserAnimationsModule - ], - providers: [ - ValidationService, - FormBuilder, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [ - VSphereProviderStepComponent, - SSLThumbprintModalComponent - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - - fixture = TestBed.createComponent(VSphereProviderStepComponent); - component = fixture.componentInstance; - component.setStepRegistrantData({ wizard: 'BozoWizard', step: 'vsphereProviderForm', formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORTED, - eventFileImportError: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORT_ERROR}); - - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should open SSL thumbprint modal when connect vc', fakeAsync(() => { - const apiSpy = spyOn(component['apiClient'], 'getVsphereThumbprint').and.returnValue(of({insecure: false}).pipe(delay(1))); - spyOn(component.sslThumbprintModal, 'open'); - component.connectVC(); - tick(1); - expect(apiSpy).toHaveBeenCalled(); - expect(component.sslThumbprintModal.open).toHaveBeenCalled(); - })); - - it('should call get datacenter when retrieve trigger datacenter', () => { - const apiSpy = spyOn(component['apiClient'], 'getVSphereDatacenters').and.callThrough(); - component.retrieveDatacenters(); - expect(apiSpy).toHaveBeenCalled(); - }); - - it('should return disabled when username is not valid', () => { - expect(component.getDisabled()).toBeTruthy(); - }); - - it('should set vsphere modal open when show method is triggered', () => { - component.showVSphereWithK8Modal(); - expect(component.vSphereWithK8ModalOpen).toBeTruthy(); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.ngOnInit(); - const vcenterIPControl = component.formGroup.get(VsphereField.PROVIDER_VCENTER_ADDRESS); - const datacenterControl = component.formGroup.get(VsphereField.PROVIDER_DATA_CENTER); - - expect(component.dynamicDescription()).toEqual('Validate the vSphere provider account for Tanzu'); - - component.vsphereVersion = 'CLOWNVERSION'; - expect(component.dynamicDescription()).toEqual('Validate the vSphere CLOWNVERSION provider account for Tanzu'); - - vcenterIPControl.setValue('1.2.1.2'); - datacenterControl.setValue('DATACENTER'); - component.onLoginSuccess({}); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: 'vsphereProviderForm', - description: 'vCenter 1.2.1.2 connected', - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.ts b/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.ts deleted file mode 100644 index 364a72229e..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.component.ts +++ /dev/null @@ -1,445 +0,0 @@ -// Angular imports -import { Component, OnInit, ViewChild } from '@angular/core'; -import { Router } from '@angular/router'; -import { Validators } from '@angular/forms'; -// Third party imports -import { debounceTime, distinctUntilChanged, finalize, takeUntil } from 'rxjs/operators'; -import * as _ from 'lodash'; -import * as sortPaths from 'sort-paths'; -import { ClrLoadingState } from '@clr/angular'; -// App imports -import { AppEdition } from 'src/app/shared/constants/branding.constants'; -import { APIClient } from 'src/app/swagger/api-client.service'; -import { APP_ROUTES, Routes } from 'src/app/shared/constants/routes.constants'; -import AppServices from 'src/app/shared/service/appServices'; -import { EditionData } from 'src/app/shared/service/branding.service'; -import { managementClusterPlugin } from "../../wizard/shared/constants/wizard.constants"; -import { SSLThumbprintModalComponent } from '../../wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component'; -import { StepFormDirective } from '../../wizard/shared/step-form/step-form'; -import { TanzuEventType } from 'src/app/shared/service/Messenger'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { VSphereDatacenter } from 'src/app/swagger/models/v-sphere-datacenter.model'; -import { VsphereField } from "../vsphere-wizard.constants"; -import { VsphereProviderStepFieldMapping } from './vsphere-provider-step.fieldmapping'; - -const SupervisedField = [VsphereField.PROVIDER_VCENTER_ADDRESS, VsphereField.PROVIDER_USER_NAME, VsphereField.PROVIDER_USER_PASSWORD]; - -/** - * vSphere Version Info definition - */ -export interface VsphereVersioninfo { - version: string, - build: string; -} - -@Component({ - selector: 'app-vsphere-provider-step', - templateUrl: './vsphere-provider-step.component.html', - styleUrls: ['./vsphere-provider-step.component.scss'] -}) - -export class VSphereProviderStepComponent extends StepFormDirective implements OnInit { - @ViewChild(SSLThumbprintModalComponent) sslThumbprintModal: SSLThumbprintModalComponent; - fileReader: FileReader; - - APP_ROUTES: Routes = APP_ROUTES; - - loading: boolean = false; - connected: boolean = false; - loadingState: ClrLoadingState = ClrLoadingState.DEFAULT; - vSphereWithK8ModalOpen: boolean = false; - datacenters: Array; - vsphereVersion: string = ''; - vsphereHost: string; - hasPacific: string; - - vSphereModalTitle: string; - vSphereModalBody: string; - thumbprint: string; - - edition: AppEdition = AppEdition.TCE; - enableIpv6: boolean = false; - - // As a hack to avoid onChange events where the value really hasn't changed, we track the field values ourselves - supervisedFieldValues = new Map(); - - constructor(private validationService: ValidationService, - private apiClient: APIClient, - private router: Router) { - super(); - - this.fileReader = new FileReader(); - } - - private customizeForm() { - SupervisedField.forEach(field => { - this.formGroup.get(field).valueChanges - .pipe( - debounceTime(500), - distinctUntilChanged(), - takeUntil(this.unsubscribe) - ) - .subscribe((data) => { - const oldValue = this.supervisedFieldValues.get(field); - if (data !== oldValue) { - this.supervisedFieldValues.set(field, data); - const msg = field === VsphereField.PROVIDER_USER_PASSWORD ? - 'disconnecting due to password change' : - 'disconnecting due to change event from field ' + field + ' value: ' + oldValue + '-->' + data; - this.disconnect(msg); - } - }); - }); - - this.formGroup.get(VsphereField.PROVIDER_DATA_CENTER).valueChanges.subscribe(data => { - this.onDataCenterChange(data) - }); - - if (this.enableIpv6) { - this.registerOnValueChange(VsphereField.PROVIDER_IP_FAMILY, - data => { - // In theory, we should only receive this event if the ipFamily actually changed. In practice, we double-check. - if (data !== this.ipFamily) { - AppServices.messenger.publish({ - type: TanzuEventType.VSPHERE_IP_FAMILY_CHANGE, - payload: data - }); - this.disconnect('disconnecting because field PROVIDER_IP_FAMILY changed value to ' + data); - } - } - ); - } - AppServices.messenger.subscribe(TanzuEventType.BRANDING_CHANGED, data => { this.edition = data.payload.edition; }); - - // handle file import: - AppServices.messenger.subscribe(this.eventFileImported, data => { - this.defaultFileImportedHandler(VsphereProviderStepFieldMapping)(data); - this.disconnect('Disconnecting due to file import'); - }); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - - this.fileReader.onload = (event) => { - try { - const sshKey = event.target['result']; - this.formGroup.get(VsphereField.PROVIDER_SSH_KEY).setValue(sshKey); - } catch (error) { - console.error('Error reading SSH key file: ' + error.message); - return; - } - this.formGroup.get(VsphereField.PROVIDER_SSH_KEY_FILE).setValue(''); - }; - this.registerOnIpFamilyChange(VsphereField.PROVIDER_VCENTER_ADDRESS, [ - Validators.required, - this.validationService.isValidIpOrFqdn() - ], [ - Validators.required, - this.validationService.isValidIpv6OrFqdn() - ]); - } - - ngOnInit() { - super.ngOnInit(); - this.enableIpv6 = AppServices.appDataService.isPluginFeatureActivated(managementClusterPlugin, 'vsphereIPv6'); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, VsphereProviderStepFieldMapping); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(VsphereProviderStepFieldMapping); - this.storeDefaultLabels(VsphereProviderStepFieldMapping); - - this.formGroup.get(VsphereField.PROVIDER_SSH_KEY).disable({ emitEvent: false}); - this.formGroup.get(VsphereField.PROVIDER_DATA_CENTER).disable({ emitEvent: false}); - this.datacenters = []; - this.customizeForm(); - } - - private disconnect(consoleMsg?: string) { - if (this.connected) { - if (consoleMsg) { - console.log(consoleMsg); - } - this.connected = false; - this.loadingState = ClrLoadingState.DEFAULT; - this.formGroup.markAsPending(); // a temporary fix to ignore this.formGroup.statusChanges detection - this.datacenters = []; - this.disarmField(VsphereField.PROVIDER_DATA_CENTER); - this.triggerStepDescriptionChange(); - } - } - - /** - * @method getParsedVsphereVer - * @param res - the vsphere version string - * helper method to parse vsphere version/build string into object - * @returns {{version: (string|any), build: (string|any|number)}} - */ - getParsedVsphereVer(res: string) { - const versionInfo = _.split(res, ':'); - - return { - version: versionInfo[0], - build: versionInfo[1] || '0' - } - } - - /** - * @method checkVsphereCompatible - * @param versionInfo - * @returns {boolean} - */ - checkVsphereCompatible(versionInfo: VsphereVersioninfo) { - const compatibleVersion = [6, 7, 0]; - const compatibleBuild = 14367737; - const version: Array = _.split(versionInfo.version, '.'); - let returnVal = true; - - // corner case to check if build is u3 or newer for 6.7.0 - if (versionInfo.version === '6.7.0') { - return (_.toNumber(versionInfo.build) >= compatibleBuild); - } else if (_.toNumber(version[0]) >= 7) { - return returnVal; - } else { - // for all others check major, minor, and patch value - version.forEach((item, index) => { - if (_.toNumber(item) < compatibleVersion[index]) { - returnVal = false; - } - }); - - return returnVal; - } - } - - /** - * @method connectVC - * helper method to make connection to VC environment, call retrieveDatacenters - * method if VC connection successful - */ - connectVC() { - this.loadingState = ClrLoadingState.LOADING; - this.vsphereHost = this.getFieldValue(VsphereField.PROVIDER_VCENTER_ADDRESS); - - // we're recording these values to avoid onChange events where the value hasn't actually changed - SupervisedField.forEach(field => { - this.supervisedFieldValues.set(field, this.getFieldValue(field)); - }) - - const insecure = this.getFieldValue(VsphereField.PROVIDER_CONNECTION_INSECURE); - if (insecure) { - this.login(); - } else { - this.verifyThumbprint(); - } - } - - verifyThumbprint() { - this.apiClient.getVsphereThumbprint({ - host: this.vsphereHost - }) - .pipe( - finalize(() => this.loadingState = ClrLoadingState.DEFAULT), - takeUntil(this.unsubscribe)) - .subscribe( - ({thumbprint, insecure}) => { - if (insecure) { - this.login(); - console.log('vSphere Insecure set true via VSPHERE_INSECURE environment variable. Bypassing thumbprint verification modal.') - } else { - this.thumbprint = thumbprint; - this.formGroup.controls[VsphereField.PROVIDER_THUMBPRINT].setValue(thumbprint); - this.sslThumbprintModal.open(); - } - }, - (err) => { - const error = err.error.message || err.message || JSON.stringify(err); - this.errorNotification = - `Failed to connect to the specified vCenter Server. ${ error }`; - } - ); - } - - thumbprintModalResponse(validThumbprint: boolean) { - if (validThumbprint) { - this.login(); - } else { - this.errorNotification = "Connection failed. Certificate thumbprint was not validated."; - } - } - - login() { - this.loadingState = ClrLoadingState.LOADING; - this.apiClient.setVSphereEndpoint({ - credentials: { - username: this.formGroup.controls[VsphereField.PROVIDER_USER_NAME].value, - password: this.formGroup.controls[VsphereField.PROVIDER_USER_PASSWORD].value, - host: this.formGroup.controls[VsphereField.PROVIDER_VCENTER_ADDRESS].value, - insecure: this.formGroup.controls[VsphereField.PROVIDER_CONNECTION_INSECURE].value, - thumbprint: this.thumbprint - } - }) - .pipe( - finalize(() => this.loadingState = ClrLoadingState.DEFAULT), - takeUntil(this.unsubscribe)) - .subscribe( - this.onLoginSuccess.bind(this), - (err) => { - const errMsg = err.error ? err.error.message : null; - const error = errMsg || err.message || JSON.stringify(err); - this.errorNotification = `Failed to connect to the specified vCenter Server. ${error}`; - } - ); - } - - // TODO: this method is public so that tests can trigger it, but an extending class would be better - onLoginSuccess(res) { - const vsphereVerInfo: VsphereVersioninfo = this.getParsedVsphereVer(res.version); - const isCompatible: boolean = this.checkVsphereCompatible(vsphereVerInfo); - - this.errorNotification = ''; - this.connected = true; - this.vsphereVersion = vsphereVerInfo.version; - this.hasPacific = res.hasPacific; - AppServices.appDataService.setVsphereVersion(vsphereVerInfo.version); - this.triggerStepDescriptionChange(); - - if (isCompatible && !(_.startsWith(this.vsphereVersion, '6')) - && this.edition !== AppEdition.TCE) { - // for 7 and newer and other potential anomalies, show modal suggesting upgrade - this.showVSphereWithK8Modal(); - } else if (!isCompatible) { - // route to vsphere not compatible - this.router.navigate([this.APP_ROUTES.INCOMPATIBLE]); - } - this.retrieveDatacenters(); - - AppServices.messenger.publish({ - type: TanzuEventType.VSPHERE_VC_AUTHENTICATED, - payload: this.getFieldValue(VsphereField.PROVIDER_VCENTER_ADDRESS) - }); - - if (this.hasPacific === 'yes') { - this.vSphereModalTitle = `vSphere ${this.vsphereVersion} with Tanzu Detected`; - this.vSphereModalBody = `You have connected to a vSphere ${this.vsphereVersion} with Tanzu - environment that includes an integrated Tanzu Kubernetes Grid Service which turns a - vSphere cluster into a platform for running Kubernetes workloads in dedicated resource - pools. Configuring Tanzu Kubernetes Grid Service is done through the vSphere HTML5 Client.`; - } else { - this.vSphereModalTitle = `vSphere ${this.vsphereVersion} Environment Detected`; - this.vSphereModalBody = `You have connected to a vSphere ${this.vsphereVersion} environment - which does not have vSphere with Tanzu enabled. vSphere with Tanzu includes an - integrated Tanzu Kubernetes Grid Service which turns a vSphere cluster into a platform - for running Kubernetes workloads in dedicated resource pools. Configuring Tanzu Kubernetes - Grid Service is done through the vSphere HTML5 Client.`; - } - } - - /** - * @method retrieveDatacenters - * helper method to retrieve list of available datacenters from connected VC environment - */ - retrieveDatacenters() { - this.apiClient.getVSphereDatacenters() - .pipe(takeUntil(this.unsubscribe)) - .subscribe((dcs) => this.onDataCentersRetrieved(dcs), - (err) => { - const error = err.error.message || err.message || JSON.stringify(err); - this.errorNotification = - `Failed to retrieve list of datacenters from the specified vCenter Server. ${error}`; - } - ); - } - - private onDataCentersRetrieved(vSphereDatacenters: VSphereDatacenter[]) { - const sshKeyControl = this.getControl(VsphereField.PROVIDER_SSH_KEY); - sshKeyControl.enable(); - sshKeyControl.updateValueAndValidity(); - - this.datacenters = sortPaths(vSphereDatacenters, function (item) { return item.name; }, '/'); - const dataCenterControl = this.getControl(VsphereField.PROVIDER_DATA_CENTER); - dataCenterControl.enable(); - const possibleDataCenterNames = this.datacenters.map(dc => dc.name); - this.restoreField(VsphereField.PROVIDER_DATA_CENTER, VsphereProviderStepFieldMapping, possibleDataCenterNames); - // NOTE: seems odd to call updateValueAndValidity() before setValidators(), but seems only way to get correct behavior - dataCenterControl.updateValueAndValidity(); - dataCenterControl.setValidators([Validators.required]); - } - - /** - * @method onDataCenterChange - * helper method to emit datacenter selection value when changed - * triggers all subsequent vsphere API discovery calls dependent on datacenter moid - * @param $event {string} datacenter moid value emitted from select change - */ - private onDataCenterChange(nameDatacenter: string) { - if (this.datacenters && this.datacenters.length) { - let dcMoid = ''; - const datacenter = this.datacenters.find(dc => dc.name === nameDatacenter); - if (datacenter && datacenter.moid) { - dcMoid = datacenter.moid; - } - if (dcMoid) { - AppServices.messenger.publish({ - type: TanzuEventType.VSPHERE_DATACENTER_CHANGED, - payload: dcMoid - }); - } - } - } - - /** - * @method getDisabled - * helper method to get if connect btn should be disabled - */ - getDisabled(): boolean { - return !this.controlIsValid(VsphereField.PROVIDER_USER_NAME) || - !this.controlIsValid(VsphereField.PROVIDER_USER_PASSWORD) || - !this.controlIsValid(VsphereField.PROVIDER_VCENTER_ADDRESS); - } - - private controlIsValid(controlName: VsphereField): boolean { - if (!this.formGroup) { return false; } - const control = this.formGroup.get(controlName); - return control && control.valid; - } - - /** - * @method launchVsphereWcp - * @desc helper method to launch vSphere wcp enablement workflow in new window - */ - launchVsphereWcp() { - window.open(`https://${this.vsphereHost}/ui/app/workload-platform/`, '_blank'); - } - - /** - * @method showVSphereWithK8Modal - * @desc helper method to open vSphere with K8's modal - */ - showVSphereWithK8Modal() { - this.vSphereWithK8ModalOpen = true; - } - - /** - * @method onFileChanged - * `change` event handler for the file input. - * @param event - */ - onFileChanged(event) { - if (event.target.files.length) { - this.fileReader.readAsText(event.target.files[0]); - // clear file reader target so user can re-select same file if needed - event.target.value = ''; - } - } - - dynamicDescription(): string { - const vcenterIP = this.getFieldValue(VsphereField.PROVIDER_VCENTER_ADDRESS, true); - const datacenter = this.getFieldValue(VsphereField.PROVIDER_DATA_CENTER, true); - if (vcenterIP && datacenter) { - return 'vCenter ' + vcenterIP + ' connected'; - } - const version = this.vsphereVersion ? this.vsphereVersion + ' ' : ''; - return 'Validate the vSphere ' + version + 'provider account for Tanzu'; - } - - protected storeUserData() { - this.storeUserDataFromMapping(VsphereProviderStepFieldMapping); - this.storeDefaultDisplayOrder(VsphereProviderStepFieldMapping); - } -} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.fieldmapping.ts b/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.fieldmapping.ts deleted file mode 100644 index 4ac6dec0bf..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/provider-step/vsphere-provider-step.fieldmapping.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { VsphereField } from '../vsphere-wizard.constants'; -import { IpFamilyEnum } from '../../../../shared/constants/app.constants'; - -export const VsphereProviderStepFieldMapping: StepMapping = { - fieldMappings: [ - { name: VsphereField.PROVIDER_CONNECTION_INSECURE, isBoolean: true, defaultValue: false, label: 'VSPHERE INSECURE CONNECTION' }, - { name: VsphereField.PROVIDER_DATA_CENTER, label: 'DATACENTER', requiresBackendData: true }, - { name: VsphereField.PROVIDER_IP_FAMILY, defaultValue: IpFamilyEnum.IPv4, featureFlag: 'vsphereIPv6', label: 'IP FAMILY' }, - { name: VsphereField.PROVIDER_SSH_KEY, required: true, label: 'SSH PUBLIC KEY' }, - { name: VsphereField.PROVIDER_SSH_KEY_FILE, doNotAutoSave: true }, - { name: VsphereField.PROVIDER_THUMBPRINT, label: 'SSL THUMBPRINT' }, - { name: VsphereField.PROVIDER_USER_NAME, required: true, label: 'USERNAME' }, - { name: VsphereField.PROVIDER_USER_PASSWORD, required: true, mask: true, label: 'PASSWORD' }, - { name: VsphereField.PROVIDER_VCENTER_ADDRESS, required: true, label: 'VCENTER SERVER' }, - ] -} -// About VsphereProviderStep: -// The user is expect to fill in all the fields EXCEPT data center, and then connect. Once the connection is made, the backend data on -// existing data centers is retrieved, and the handler for that event sets the data center field value from stored data. Therefore, we -// set requiresBackendData TRUE for the data center field (because the handler takes care of it and the value should NOT be set when the -// field is first added to the form). diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.html b/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.html deleted file mode 100644 index d3047c46f1..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.html +++ /dev/null @@ -1,112 +0,0 @@ -
- -

- Specify the Resources -

- - - - - -
-
- - - - - - - - - - - Selecting a VM folder is required - -
- -
- - - - - - - - - - - Selecting a datastore is required - -
-
- -
- - - -
-
-
- - Selecting a resource is required -
-
-
diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.scss b/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.scss deleted file mode 100644 index 6fa0959f14..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.scss +++ /dev/null @@ -1,34 +0,0 @@ -clr-input-container { - padding-left: 12px; -} -.resource-form { - min-height: 230px; -} -.tree-container { - display: block; - background: #eee; - margin-left: 12px; - margin-top: 12px; - padding-right: 12px; - padding-top: 4px; - padding-bottom: 4px; -} - -button.reset { - background: none; - border: none; - padding: 0; - font: inherit; - cursor: pointer; -} - -:host-context(.dark) .tree-container { - background: #22343c; -} - -.datalist-container ::ng-deep .clr-input-group { - width: 100%; - .clr-input { - width: 100% - } -} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.spec.ts b/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.spec.ts deleted file mode 100644 index 3b02a8380a..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.spec.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -// App imports -import { APIClient } from '../../../../swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { FieldMapUtilities } from '../../wizard/shared/field-mapping/FieldMapUtilities'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { ResourcePool, ResourceStepComponent } from './resource-step.component'; -import { SharedModule } from '../../../../shared/shared.module'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { DataServiceRegistrarTestExtension } from '../../../../testing/data-service-registrar.testextension'; -import { VSphereDatastore, VSphereFolder, VSphereResourcePool } from '../../../../swagger/models'; -import { VsphereField } from '../vsphere-wizard.constants'; - -describe('ResourceStepComponent', () => { - let component: ResourceStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - APIClient, - FormBuilder, - ValidationService, - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [ResourceStepComponent] - }).compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - const dataServiceRegistrar = new DataServiceRegistrarTestExtension(); - AppServices.dataServiceRegistrar = dataServiceRegistrar; - // we expect the wizard to have registered for these events: - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_RESOURCE_POOLS); - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_COMPUTE_RESOURCE); - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_DATA_STORES); - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_VM_FOLDERS); - - TestBed.inject(ValidationService); - fixture = TestBed.createComponent(ResourceStepComponent); - component = fixture.componentInstance; - component.setStepRegistrantData({ wizard: 'BozoWizard', step: 'resourceForm', formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORTED, - eventFileImportError: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORT_ERROR}); - component.setClusterTypeDescriptor('VANILLA'); - - fixture.detectChanges(); - }); - - afterEach(() => { - fixture.destroy(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should retrieve resources when load resources: case 1', () => { - const retrieveRrcSpy = spyOn(component, 'retrieveResourcePools').and.callThrough(); - const retrieveDsSpy = spyOn(component, 'retrieveDatastores').and.callThrough(); - const retrieveVmSpy = spyOn(component, 'retrieveVMFolders').and.callThrough(); - component.loadResourceOptions(); - expect(retrieveRrcSpy).toHaveBeenCalled(); - expect(retrieveDsSpy).toHaveBeenCalled(); - expect(retrieveVmSpy).toHaveBeenCalled(); - }); - - it('should retrieve resources when load resources: case 2', () => { - component.onDataCenterChange({type: TanzuEventType.VSPHERE_DATACENTER_CHANGED, payload: ''}); - expect(component.formGroup.get('resourcePool').value).toBeFalsy(); - expect(component.formGroup.get('datastore').value).toBeFalsy(); - expect(component.formGroup.get('vmFolder').value).toBeFalsy(); - }); - - it('should retrieve resources when load resources: case 3', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.retrieveResourcePools('dc-2'); - expect(msgSpy).toHaveBeenCalled(); - }); - - it('should retrieve ds when load resources', async () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.retrieveDatastores('dc-2'); - expect(msgSpy).toHaveBeenCalled(); - }); - - it('should retrieve vm folders when load resources', async () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.retrieveVMFolders('dc-2'); - expect(msgSpy).toHaveBeenCalled(); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.ngOnInit(); - const vmFolderControl = component.formGroup.get(VsphereField.RESOURCE_VMFOLDER); - const datastoreControl = component.formGroup.get(VsphereField.RESOURCE_DATASTORE); - const resourcePoolControl = component.formGroup.get(VsphereField.RESOURCE_POOL); - - expect(component.dynamicDescription()).toEqual('Specify the resources for this VANILLA cluster'); - - vmFolderControl.setValue('VMFOLDER'); - datastoreControl.setValue('DATASTORE'); - resourcePoolControl.setValue('RESOURCE'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: 'resourceForm', - description: 'Resource Pool: RESOURCE, VM Folder: VMFOLDER, Datastore: DATASTORE', - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.ts b/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.ts deleted file mode 100644 index 32c429424e..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.component.ts +++ /dev/null @@ -1,304 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { Validators } from '@angular/forms'; - -// Library imports -import * as sortPaths from 'sort-paths'; - -// App imports -import AppServices from '../../../../shared/service/appServices'; -import { StepFormDirective } from '../../wizard/shared/step-form/step-form'; -import { TanzuEvent, TanzuEventType } from '../../../../shared/service/Messenger'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { VSphereDatastore } from '../../../../swagger/models/v-sphere-datastore.model'; -import { VsphereField } from "../vsphere-wizard.constants"; -import { VSphereFolder } from '../../../../swagger/models/v-sphere-folder.model'; -import { VSphereResourcePool } from '../../../../swagger/models'; -import { VsphereResourceStepMapping } from './resource-step.fieldmapping'; - -export interface ResourcePool { - moid?: string; - name?: string; - checked?: boolean; - disabled?: boolean; - path: string; - parentMoid: string; - label?: string; - resourceType: string; - isExpanded: boolean; - children?: Array; - } - -enum ResourceType { - CLUSTER = 'cluster', - DATACENTER = 'datacenter', - HOST = 'host', -}; - -@Component({ - selector: 'app-resource-step', - templateUrl: './resource-step.component.html', - styleUrls: ['./resource-step.component.scss'] -}) -export class ResourceStepComponent extends StepFormDirective implements OnInit { - - loadingResources: boolean = false; - resourcesFetch: number = 0; - resourcePools: Array = []; - computeResources: Array = []; - datastores: Array = []; - vmFolders: Array = []; - - treeData = []; - private currentDataCenter: string; - - constructor(private validationService: ValidationService) { - super(); - } - - ngOnInit() { - super.ngOnInit(); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, VsphereResourceStepMapping); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(VsphereResourceStepMapping); - this.storeDefaultLabels(VsphereResourceStepMapping); - this.registerStepDescriptionTriggers({ clusterTypeDescriptor: true, - fields: [VsphereField.RESOURCE_DATASTORE, VsphereField.RESOURCE_POOL, VsphereField.RESOURCE_VMFOLDER]}); - this.registerDefaultFileImportedHandler(this.eventFileImported, VsphereResourceStepMapping); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - - this.listenToEvents(); - this.subscribeToServices(); - } - - private listenToEvents() { - AppServices.messenger.subscribe(TanzuEventType.VSPHERE_DATACENTER_CHANGED, this.onDataCenterChange.bind(this), - this.unsubscribe); - } - - loadResourceOptions() { - this.resourcesFetch = 0; - this.loadingResources = true; - this.retrieveResourcePools(this.currentDataCenter); - this.retrieveComputeResources(this.currentDataCenter); - this.retrieveDatastores(this.currentDataCenter); - this.retrieveVMFolders(this.currentDataCenter); - } - - // public only for testing - onDataCenterChange(event: TanzuEvent) { - this.currentDataCenter = event.payload; - - // TODO: the following setField() calls should be done when the resources have finished being fetched (not now) - // NOTE: because the saved data values MAY be applicable to the just-chosen DC, - // we try to set the fields to the saved value - const fieldsToReset = [VsphereField.RESOURCE_POOL, VsphereField.RESOURCE_DATASTORE, VsphereField.RESOURCE_VMFOLDER]; - fieldsToReset.forEach(field => { - this.setFieldWithStoredValue(field, VsphereResourceStepMapping, this.getFieldValue(field), - { onlySelf: true, emitEvent: false}); - }); - } - - // public only for testing - retrieveResourcePools(dc: string) { - AppServices.messenger.publish({ - type: TanzuEventType.VSPHERE_GET_RESOURCE_POOLS, - payload: {dc} - }); - } - - // public only for testing - retrieveComputeResources(dc: string) { - AppServices.messenger.publish({ - type: TanzuEventType.VSPHERE_GET_COMPUTE_RESOURCE, - payload: {dc} - }); - } - - // public only for testing - retrieveDatastores(dc: string) { - AppServices.messenger.publish({ - type: TanzuEventType.VSPHERE_GET_DATA_STORES, - payload: {dc} - }); - } - - // public only for testing - retrieveVMFolders(dc: string) { - AppServices.messenger.publish({ - type: TanzuEventType.VSPHERE_GET_VM_FOLDERS, - payload: {dc} - }); - } - - constructResourceTree(resources: Array): void { - const nodeMap: Map> = new Map(); // key is parenet moid, value is a list of child nodes. - const resourceTree: Array = []; - resources.forEach(resource => { - const parentMoid = resource.parentMoid; - if (parentMoid) { - if (nodeMap.has(parentMoid)) { - nodeMap.get(parentMoid).push(resource); - } else { - nodeMap.set(parentMoid, [resource]); - } - } else { - resourceTree.push(resource); // it contains root nodes - } - resource.label = resource.name; - }); - const selectResourcePool = this.getStoredValue(VsphereField.RESOURCE_POOL, VsphereResourceStepMapping, ''); - this.constructTree(resourceTree, nodeMap, selectResourcePool); - this.treeData = this.removeDatacenter(resourceTree); - } - - constructTree(treeNodes: Array, map: Map>, selectResourcePool: string): void { - if (!treeNodes || treeNodes.length <= 0) { - return; - } - - treeNodes.forEach(node => { - if (node.resourceType === ResourceType.HOST || node.resourceType === ResourceType.CLUSTER) { - node.path += '/Resources'; - } - const childNodes = map.get(node.moid) || []; - node.children = childNodes; - node.isExpanded = true; - node.checked = selectResourcePool === node.path; - this.constructTree(childNodes, map, selectResourcePool); - }); - } - - removeDatacenter(resourceTree: Array): Array { - let rootNodes = []; - resourceTree.forEach(resource => { - if (resource.resourceType === ResourceType.DATACENTER) { - if (resource.children && resource.children.length > 0) { - rootNodes = [...rootNodes, ...resource.children]; - } - } else { - rootNodes.push(resource); - } - }); - return rootNodes; - } - - handleOnClick = (selected: ResourcePool) => { - let resourcePoolValue = ''; - if (selected.checked) { - this.ensureOnlyOneResourceSelected(this.treeData, selected); - resourcePoolValue = selected.path; - } - this.formGroup.get(VsphereField.RESOURCE_POOL).setValue(resourcePoolValue); - } - - ensureOnlyOneResourceSelected(resourcePools: Array, selected: ResourcePool) { - if (!resourcePools) { - return; - } - resourcePools.forEach(node => { - node.checked = node.moid === selected.moid; - this.ensureOnlyOneResourceSelected(node.children, selected); - }); - } - - /** - * Get the current value of VsphereField.RESOURCE_POOL - */ - get resourcePoolValue() { - return this.formGroup.get(VsphereField.RESOURCE_POOL).value; - } - - /** - * Get the current value of VsphereField.RESOURCE_VMFOLDER - */ - get vmFolderValue() { - return this.formGroup.get(VsphereField.RESOURCE_VMFOLDER).value; - } - - /** - * Get the current value of VsphereField.RESOURCE_DATASTORE - */ - get datastoreValue() { - return this.formGroup.get(VsphereField.RESOURCE_DATASTORE).value; - } - - dynamicDescription(): string { - const vmFolder = this.getFieldValue(VsphereField.RESOURCE_VMFOLDER, true); - const datastore = this.getFieldValue(VsphereField.RESOURCE_DATASTORE, true); - const resourcePool = this.getFieldValue(VsphereField.RESOURCE_POOL, true); - if (vmFolder && datastore && resourcePool) { - return 'Resource Pool: ' + resourcePool + ', VM Folder: ' + vmFolder + ', Datastore: ' + datastore; - } - return `Specify the resources for this ${this.clusterTypeDescriptor} cluster`; - } - - private incrementResourcesFetched() { - this.resourcesFetch += 1; - if (this.resourcesFetch === 4) { - this.loadingResources = false; - } - } - - private subscribeToServices() { - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.VSPHERE_GET_RESOURCE_POOLS, - this.onFetchedResourcePools.bind(this), AppServices.dataServiceRegistrar.appendingStepErrorHandler(this) ); - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.VSPHERE_GET_COMPUTE_RESOURCE, - this.onFetchedComputeResources.bind(this), AppServices.dataServiceRegistrar.appendingStepErrorHandler(this) ); - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.VSPHERE_GET_DATA_STORES, - this.onFetchedDatastores.bind(this), AppServices.dataServiceRegistrar.appendingStepErrorHandler(this) ); - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.VSPHERE_GET_VM_FOLDERS, - this.onFetchedVmFolders.bind(this), AppServices.dataServiceRegistrar.appendingStepErrorHandler(this) ); - } - - private sortVsphereResources(data: any[]): any[] { - return sortPaths(data, function (item) { return item.name; }, '/'); - } - - private onFetchedVmFolders(data: VSphereFolder[]) { - this.incrementResourcesFetched(); - if (data === null || data === undefined) { - data = []; - } - this.vmFolders = this.sortVsphereResources(data); - const storedVmFolder = this.getStoredValue(VsphereField.RESOURCE_VMFOLDER, VsphereResourceStepMapping, ''); - const selectValue = (data.length === 1) ? data[0].name : storedVmFolder; - const validators = [Validators.required, - this.validationService.isValidNameInList(data.map(vmFolder => vmFolder.name))]; - this.resurrectField(VsphereField.RESOURCE_VMFOLDER, validators, selectValue); - } - - private onFetchedDatastores(data: VSphereDatastore[]) { - this.incrementResourcesFetched(); - if (data === null || data === undefined) { - data = []; - } - this.datastores = this.sortVsphereResources(data); - const selectValue = (data.length === 1) ? data[0].name : - this.getStoredValue(VsphereField.RESOURCE_DATASTORE, VsphereResourceStepMapping, ''); - const validators = [Validators.required, - this.validationService.isValidNameInList(data.map(vmFolder => vmFolder.name))]; - this.resurrectField(VsphereField.RESOURCE_DATASTORE, validators, selectValue); - } - - private onFetchedComputeResources(data: ResourcePool[]) { - this.incrementResourcesFetched(); - if (data === null || data === undefined) { - data = []; - } - this.computeResources = this.sortVsphereResources(data); - this.constructResourceTree(data); - } - - private onFetchedResourcePools(data: VSphereResourcePool[]) { - this.incrementResourcesFetched(); - if (data === null || data === undefined) { - data = []; - } - this.resourcePools = this.sortVsphereResources(data); - } - - protected storeUserData() { - super.storeUserDataFromMapping(VsphereResourceStepMapping); - super.storeDefaultDisplayOrder(VsphereResourceStepMapping); - } -} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.fieldmapping.ts b/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.fieldmapping.ts deleted file mode 100644 index 27dc35b50f..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/resource-step/resource-step.fieldmapping.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { VsphereField } from '../vsphere-wizard.constants'; - -export const VsphereResourceStepMapping: StepMapping = { - fieldMappings: [ - { name: VsphereField.RESOURCE_VMFOLDER, required: true, requiresBackendData: true, label: 'VM FOLDER' }, - { name: VsphereField.RESOURCE_DATASTORE, required: true, requiresBackendData: true, label: 'DATASTORE' }, - { name: VsphereField.RESOURCE_POOL, required: true, requiresBackendData: true, label: 'CLUSTERS, HOSTS, AND RESOURCE POOLS' }, - ] -} -// About VsphereResourceStep: -// All these values depend on backend data being available, so we don't auto-restore the value on initialization. Rather, we rely on -// the event handlers that handle the backend data arriving to set the field values from stored data at that time. diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-network-step/vsphere-network-step.component.spec.ts b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-network-step/vsphere-network-step.component.spec.ts deleted file mode 100644 index 0261799ab3..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-network-step/vsphere-network-step.component.spec.ts +++ /dev/null @@ -1,104 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -// App imports -import { APIClient } from '../../../../swagger'; -import AppServices from '../../../../shared/service/appServices'; -import { Messenger, TanzuEventType } from '../../../../shared/service/Messenger'; -import { DataServiceRegistrarTestExtension } from '../../../../testing/data-service-registrar.testextension'; -import { FieldMapUtilities } from '../../wizard/shared/field-mapping/FieldMapUtilities'; -import { NetworkField } from '../../wizard/shared/components/steps/network-step/network-step.fieldmapping'; -import { ResourcePool } from '../resource-step/resource-step.component'; -import { SharedModule } from '../../../../shared/shared.module'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { VSphereDatastore, VSphereFolder, VSphereNetwork, VSphereResourcePool } from '../../../../swagger/models'; -import { VsphereNetworkStepComponent } from './vsphere-network-step.component'; -import { WizardForm } from '../../wizard/shared/constants/wizard.constants'; - -describe('NodeSettingStepComponent', () => { - let component: VsphereNetworkStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - ValidationService, - FormBuilder, - FieldMapUtilities, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [VsphereNetworkStepComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - const dataServiceRegistrar = new DataServiceRegistrarTestExtension(); - AppServices.dataServiceRegistrar = dataServiceRegistrar; - // we expect the wizard to have registered for these events: - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_RESOURCE_POOLS); - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_COMPUTE_RESOURCE); - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_DATA_STORES); - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_VM_FOLDERS); - dataServiceRegistrar.simulateRegistration(TanzuEventType.VSPHERE_GET_VM_NETWORKS); - - fixture = TestBed.createComponent(VsphereNetworkStepComponent); - component = fixture.componentInstance; - component.setStepRegistrantData({ wizard: 'BozoWizard', step: WizardForm.NETWORK, formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORTED, - eventFileImportError: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORT_ERROR}); - - fixture.detectChanges(); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.ngOnInit(); - const networkNameControl = component.formGroup.controls[NetworkField.NETWORK_NAME]; - const serviceCidrControl = component.formGroup.controls[NetworkField.CLUSTER_SERVICE_CIDR]; - const podCidrControl = component.formGroup.controls[NetworkField.CLUSTER_POD_CIDR]; - - podCidrControl.setValue(''); - serviceCidrControl.setValue(''); - expect(component.dynamicDescription()).toEqual(VsphereNetworkStepComponent.description); - - networkNameControl.setValue({name: 'CHOCMINT', moid: 'CHIP'} as VSphereNetwork); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.NETWORK, - description: 'Network: CHOCMINT', - } - }); - - podCidrControl.setValue('1.2.3.4/12'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.NETWORK, - description: 'Network: CHOCMINT, Cluster Pod CIDR: 1.2.3.4/12' - } - }); - - serviceCidrControl.setValue('5.6.7.8/16'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.NETWORK, - description: 'Network: CHOCMINT, Cluster Service CIDR: 5.6.7.8/16, Cluster Pod CIDR: 1.2.3.4/12' - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-network-step/vsphere-network-step.component.ts b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-network-step/vsphere-network-step.component.ts deleted file mode 100644 index 74d8e6a73a..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-network-step/vsphere-network-step.component.ts +++ /dev/null @@ -1,142 +0,0 @@ -// Angular imports -import { Component } from '@angular/core'; -import { Validators } from '@angular/forms'; - -// Library imports -import * as sortPaths from 'sort-paths'; - -// App imports -import AppServices from '../../../../shared/service/appServices'; -import { NetworkField } from '../../wizard/shared/components/steps/network-step/network-step.fieldmapping'; -import { SharedNetworkStepComponent } from '../../wizard/shared/components/steps/network-step/network-step.component'; -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { TanzuEventType } from '../../../../shared/service/Messenger'; -import { ValidationService } from '../../wizard/shared/validation/validation.service'; -import { VsphereField } from '../vsphere-wizard.constants'; -import { VSphereNetwork } from '../../../../swagger/models'; -import { VsphereNetworkFieldMappings } from './vsphere-network-step.fieldmapping'; - -@Component({ - selector: 'app-vsphere-network-step', - templateUrl: '../../wizard/shared/components/steps/network-step/network-step.component.html', - styleUrls: ['../../wizard/shared/components/steps/network-step/network-step.component.scss'], -}) -export class VsphereNetworkStepComponent extends SharedNetworkStepComponent { - static description = 'Specify how Tanzu Kubernetes Grid networking is provided and any global network settings'; - - vmNetworks: VSphereNetwork[] = []; - private stepMapping: StepMapping; - - constructor(protected validationService: ValidationService) { - super(validationService); - } - - listenToEvents() { - super.listenToEvents(); - AppServices.messenger.subscribe(TanzuEventType.VSPHERE_VC_AUTHENTICATED, - data => { this.infraServiceAddress = data.payload; }, this.unsubscribe); - AppServices.messenger.subscribe(TanzuEventType.VSPHERE_DATACENTER_CHANGED, - () => { this.clearControlValue(VsphereField.NETWORK_NAME); }, this.unsubscribe); - } - - protected subscribeToServices() { - AppServices.dataServiceRegistrar.stepSubscribe(this, TanzuEventType.VSPHERE_GET_VM_NETWORKS, - this.onFetchedVmNetworks.bind(this)); - } - - private onFetchedVmNetworks(networks: Array) { - this.vmNetworks = sortPaths(networks, function (network) { return network.name; }, '/'); - if (!this.vmNetworks) { - this.vmNetworks = []; - } - this.loadingNetworks = false; - if (this.vmNetworks.length > 0) { - if (this.vmNetworks.length === 1) { - this.getControl(VsphereField.NETWORK_NAME).setValue(this.vmNetworks[0]); - } else { - this.restoreField(VsphereField.NETWORK_NAME, this.supplyStepMapping()); - } - } - } - - protected onNoProxyChange(value: string) { - this.hideNoProxyWarning = value.trim().split(',').includes(this.infraServiceAddress); - super.onNoProxyChange(value); - } - - /** - * @method loadNetworks - * helper method retrieves list of networks - */ - loadNetworks() { - this.loadingNetworks = true; - AppServices.messenger.publish({ - type: TanzuEventType.VSPHERE_GET_VM_NETWORKS - }); - } - - protected supplyFieldsAffectingStepDescription(): string[] { - const fields = super.supplyFieldsAffectingStepDescription(); - fields.push(VsphereField.NETWORK_NAME); - return fields; - } - - protected supplyEnablesNetworkName(): boolean { - return true; - } - - protected supplyNetworkNameInstruction(): string { - return 'Select a vSphere network to use as the Kubernetes service network.'; - } - - protected supplyEnablesNoProxyWarning(): boolean { - return true; - } - - protected supplyNetworks(): { displayName?: string }[] { - return this.vmNetworks; - } - - protected supplyStepMapping(): StepMapping { - if (!this.stepMapping) { - this.stepMapping = this.createStepMapping(); - } - return this.stepMapping; - } - - private createStepMapping(): StepMapping { - const fieldMappings = [...VsphereNetworkFieldMappings, ...super.supplyStepMapping().fieldMappings]; - const result: StepMapping = { fieldMappings }; - // we have a field that uses a backing object, so we need to assign a retriever; see FieldMapping.ts for details. - const networkFieldMapping = AppServices.fieldMapUtilities.getFieldMapping(VsphereField.NETWORK_NAME, result); - networkFieldMapping.retriever = this.networkFromName.bind(this); - return result; - } - - // given a network name, returns the VSphereNetwork associated with that name. Note: method assumes this.vmNetworks is always valid - private networkFromName(networkName: string): VSphereNetwork { - return this.vmNetworks.find(network => network.name === networkName); - } - - dynamicDescription(): string { - // NOTE: even though this is a common wizard form, vSphere has a different way of describing it - // because vSphere allows for the user to select a network name - const network = this.getFieldValue(VsphereField.NETWORK_NAME); - let result = ''; - if (network) { - result = 'Network: ' + network.name + ', '; - } - const serviceCidr = this.getFieldValue(NetworkField.CLUSTER_SERVICE_CIDR, true); - if (serviceCidr) { - result += 'Cluster Service CIDR: ' + serviceCidr + ', '; - } - const podCidr = this.getFieldValue(NetworkField.CLUSTER_POD_CIDR, true); - if (podCidr) { - result += 'Cluster Pod CIDR: ' + podCidr; - } - if (result.endsWith(', ')) { - result = result.slice(0, -2); - } - return result ? result : VsphereNetworkStepComponent.description; - } -} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-network-step/vsphere-network-step.fieldmapping.ts b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-network-step/vsphere-network-step.fieldmapping.ts deleted file mode 100644 index fb737db0d5..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-network-step/vsphere-network-step.fieldmapping.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FieldMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { VsphereField } from '../vsphere-wizard.constants'; - -// NOTE: these field mappings are ADDED to the shared network field mapping -export const VsphereNetworkFieldMappings: FieldMapping[] = [ - { name: VsphereField.NETWORK_NAME, label: 'NETWORK NAME', requiresBackendData: true, - backingObject: { displayField: 'displayName', valueField: 'name' } }, -] diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-os-image-step/vsphere-os-image-step.component.ts b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-os-image-step/vsphere-os-image-step.component.ts deleted file mode 100644 index 02c1753379..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-os-image-step/vsphere-os-image-step.component.ts +++ /dev/null @@ -1,74 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -// App imports -import AppServices from '../../../../shared/service/appServices'; -import { - OsImageProviderInputs, - SharedOsImageStepDirective -} from '../../wizard/shared/components/steps/os-image-step/os-image-step.component'; -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; -import { TanzuEventType } from '../../../../shared/service/Messenger'; -import { VsphereOsImageStepMapping } from './vsphere-os-image-step.fieldmapping'; -import { VSphereVirtualMachine } from '../../../../swagger/models'; - -@Component({ - selector: 'app-vsphere-os-image-step', - templateUrl: '../../wizard/shared/components/steps/os-image-step/os-image-step.component.html', - styleUrls: ['../../wizard/shared/components/steps/os-image-step/os-image-step.component.scss'] -}) -export class VsphereOsImageStepComponent extends SharedOsImageStepDirective implements OnInit { - private tkrVersionString: string; - private currentDataCenter: string; // the currently selected data center - - constructor() { - super(); - this.tkrVersion.subscribe(value => { this.tkrVersionString = value; }); - } - - ngOnInit() { - super.ngOnInit(); - // subscribe to the VSPHERE_DATACENTER_CHANGED event so that we can capture the current data center. We need it so that if - // the user wants to refresh the os images available, we have the datacenter id for the backend call to get the os images - AppServices.messenger.subscribe(TanzuEventType.VSPHERE_DATACENTER_CHANGED, - event => this.currentDataCenter = event.payload); - } - - // NOTE: there is an implicit assumption here that the tkrVersion Observable will have delivered a value before - // setProviderInputs() is called (so that the usage below will be valid) - protected supplyProviderInputs(): OsImageProviderInputs { - const noImageAlertMessage = 'Your ' + this.clusterTypeDescriptor + ' cluster will be deployed with Tanzu Kubernetes release (TKr)' + - ' ' + this.tkrVersionString + - '. We are unable to detect a VM template that belongs to this Tanzu Kubernetes release. You must install ' + - 'a VM template that belongs to Tanzu Kubernetes release ' + this.tkrVersionString + ' to continue with deployment of' + - ' the ' + this.clusterTypeDescriptor + ' cluster. You may click the refresh icon to reload the OS image list once the ' + - 'appropriate VM template has been installed.'; - const osImageTooltipContent = 'Select a VM template for a base OS image that you have already imported ' + - ' into vSphere. If no compatible template is present, import one into vSphere and click the Refresh button.'; - const nonTemplateAlertMessage = 'Your selected OS image must be converted to a VM template. ' + - 'You may click the refresh icon to reload the OS image list once this has been done.' - return { - createOsImageEventPayload: this.createOsImageEventPayload.bind(this), - event: TanzuEventType.VSPHERE_GET_OS_IMAGES, - eventImportFileFailure: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORT_ERROR, - eventImportFileSuccess: TanzuEventType.VSPHERE_CONFIG_FILE_IMPORTED, - noImageAlertMessage: noImageAlertMessage, - osImageTooltipContent: osImageTooltipContent, - nonTemplateAlertMessage: nonTemplateAlertMessage, - }; - } - - // returns a payload that can be used with the VSPHERE_GET_OS_IMAGES event to refresh the os images from the backend - private createOsImageEventPayload() { - return { dc: this.currentDataCenter }; - } - - protected getImageFromStoredValue(osImageValue: string): VSphereVirtualMachine { - // NOTE: we are switching to use the MOID as the stored value. However, older config files will have the image name. - // we therefore find the first image that matches the saved value on either the MOID or the name - return this.osImages.find(image => image.moid === osImageValue || image.name === osImageValue); - } - - protected supplyStepMapping(): StepMapping { - return VsphereOsImageStepMapping; - } -} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-os-image-step/vsphere-os-image-step.fieldmapping.ts b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-os-image-step/vsphere-os-image-step.fieldmapping.ts deleted file mode 100644 index ad300742ea..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-os-image-step/vsphere-os-image-step.fieldmapping.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { StepMapping } from '../../wizard/shared/field-mapping/FieldMapping'; - -export const VsphereOsImageStepMapping: StepMapping = { - fieldMappings: [ - { name: 'osImage', required: true, label: 'OS IMAGE', requiresBackendData: true, - backingObject: { displayField: 'name', valueField: 'moid' } } - ] -} -// About VsphereOsImageStep: -// The osImage is always selected from a backing array. Therefore, we don't want the field set to the stored value until the backend -// has populated the osImage listbox. We therefore set requiresBackendData to TRUE, and rely on the event handler of the osImage data -// arriving to set the field value from stored data. diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard-routing.module.ts b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard-routing.module.ts deleted file mode 100644 index 2c119fcaf6..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard-routing.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Angular modules -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -// App imports -import { VSphereWizardComponent } from './vsphere-wizard.component'; - -export const routes: Routes = [ - { - path: '', - component: VSphereWizardComponent - } -]; - -/** - * @module VSphereWizardRoutingModule - * @description - * This is routing module for the wizard module. - */ -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class VSphereWizardRoutingModule {} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.html b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.html deleted file mode 100644 index 128c914e64..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.html +++ /dev/null @@ -1,57 +0,0 @@ -
-
-
- -

-
- Deploy {{ clusterTypeDescriptorTitleCase }} Cluster on vSphere -

- - - - -
-
- - - - - -
-
- - - -
-
- - - - - -
-
-
-
diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.scss b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.scss deleted file mode 100644 index 54f5272c9f..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.scss +++ /dev/null @@ -1,31 +0,0 @@ -@import '../../../../sass/properties.scss'; - -:host ::ng-deep button.clr-accordion-header-button { - font-size: 14px; - padding: 9px 18px; - color: #474747; - .clr-accordion-complete-icon { - color: #4C773C; - } -} - -clr-icon.back-link { - margin-right: 6px; - cursor: pointer; - position: relative; - top: 10px; - float:left; -} - -h2 { - margin-top: 0; -} - -@media (max-width: $small) { - .btn-container { - text-align: center; - .deploy-btn, .edit-btn { - width: 100%; - } - } -} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.spec.ts b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.spec.ts deleted file mode 100644 index 413f097812..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.spec.ts +++ /dev/null @@ -1,97 +0,0 @@ -// Angular imports -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { ReactiveFormsModule, FormBuilder, FormControl } from '@angular/forms'; -import { RouterTestingModule } from '@angular/router/testing'; -// Third party imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -// App imports -import { APIClient } from '../../../swagger/api-client.service'; -import AppServices from '../../../shared/service/appServices'; -import { ClusterType } from "../wizard/shared/constants/wizard.constants"; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { SharedModule } from '../../../shared/shared.module'; -import { ValidationService } from '../wizard/shared/validation/validation.service'; -import { VSphereWizardComponent } from './vsphere-wizard.component'; - -describe('VSphereWizardComponent', () => { - let component: VSphereWizardComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - ReactiveFormsModule, - BrowserAnimationsModule, - RouterTestingModule.withRoutes([ - { path: 'ui', component: VSphereWizardComponent } - ]), - SharedModule - ], - providers: [ - APIClient, - FormBuilder, - ValidationService - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [ - VSphereWizardComponent - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - const fb = new FormBuilder(); - fixture = TestBed.createComponent(VSphereWizardComponent); - component = fixture.componentInstance; - component.form = fb.group({ - vsphereProviderForm: fb.group({}), - vsphereNodeSettingForm: fb.group({}), - metadataForm: fb.group({}), - storageForm: fb.group({}), - resourceForm: fb.group({}), - loadBalancerForm: fb.group({}), - networkForm: fb.group({}), - identityForm: fb.group({}), - osImageForm: fb.group({}), - ceipOptInForm: fb.group({}) - }); - component.clusterTypeDescriptor = '' + ClusterType.Management; - fixture.detectChanges(); - }); - - afterEach(() => { - fixture.destroy(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('getWizardValidity should return false', () => { - expect(component['getWizardValidity']()).toBeFalsy(); - }); - - it('should call create vsphere api when deploying', () => { - const apiSpy = spyOn(component['apiClient'], 'createVSphereRegionalCluster').and.callThrough(); - component.providerType = 'vsphere'; - component.deploy(); - expect(apiSpy).toHaveBeenCalled(); - }); - - it('should register services', () => { - const apiSpy = spyOn(AppServices.dataServiceRegistrar, 'register').and.callThrough(); - component.ngOnInit(); - expect(apiSpy).toHaveBeenCalledWith(TanzuEventType.VSPHERE_GET_COMPUTE_RESOURCE, jasmine.anything(), jasmine.anything()); - expect(apiSpy).toHaveBeenCalledWith(TanzuEventType.VSPHERE_GET_DATA_STORES, jasmine.anything(), jasmine.anything()); - expect(apiSpy).toHaveBeenCalledWith(TanzuEventType.VSPHERE_GET_OS_IMAGES, jasmine.anything(), jasmine.anything()); - expect(apiSpy).toHaveBeenCalledWith(TanzuEventType.VSPHERE_GET_RESOURCE_POOLS, jasmine.anything(), jasmine.anything()); - expect(apiSpy).toHaveBeenCalledWith(TanzuEventType.VSPHERE_GET_VM_FOLDERS, jasmine.anything(), jasmine.anything()); - expect(apiSpy).toHaveBeenCalledWith(TanzuEventType.VSPHERE_GET_VM_NETWORKS, jasmine.anything(), jasmine.anything()); - }); -}); diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.ts b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.ts deleted file mode 100644 index 1954e750f9..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.component.ts +++ /dev/null @@ -1,447 +0,0 @@ -// Angular imports -import { Component, ElementRef, OnInit } from '@angular/core'; -import { FormBuilder } from '@angular/forms'; -import { Router } from '@angular/router'; -import { Title } from '@angular/platform-browser'; -// Third party imports -import { Observable } from 'rxjs'; -// App imports -import { APIClient } from '../../../swagger/api-client.service'; -import { APP_ROUTES, Routes } from '../../../shared/constants/routes.constants'; -import AppServices from "../../../shared/service/appServices"; -import { CliFields, CliGenerator } from '../wizard/shared/utils/cli-generator'; -import { ClusterPlan, WizardForm } from '../wizard/shared/constants/wizard.constants'; -import { ExportService } from '../../../shared/service/export.service'; -import { FormDataForHTML, FormUtility } from '../wizard/shared/components/steps/form-utility'; -import { ImportParams, ImportService } from "../../../shared/service/import.service"; -import { KUBE_VIP, NSX_ADVANCED_LOAD_BALANCER } from './node-setting-step/node-setting-step.fieldmapping'; -import { LoadBalancerField } from '../wizard/shared/components/steps/load-balancer/load-balancer-step.fieldmapping'; -import { NodeSettingStepComponent } from './node-setting-step/node-setting-step.component'; -import { PROVIDERS, Providers } from '../../../shared/constants/app.constants'; -import { ResourceStepComponent } from './resource-step/resource-step.component'; -import { TanzuEventType } from '../../../shared/service/Messenger'; -import { VsphereField, VsphereForm, VsphereNodeTypes } from './vsphere-wizard.constants'; -import { - VSphereDatastore, - VSphereFolder, - VSphereManagementObject, - VSphereNetwork, - VSphereResourcePool, - VSphereVirtualMachine -} from '../../../swagger/models'; -import { VsphereLoadBalancerStepComponent } from './load-balancer/vsphere-load-balancer-step.component'; -import { VsphereNetworkStepComponent } from './vsphere-network-step/vsphere-network-step.component'; -import { VsphereOsImageStepComponent } from './vsphere-os-image-step/vsphere-os-image-step.component'; -import { VSphereProviderStepComponent } from './provider-step/vsphere-provider-step.component'; -import { VsphereRegionalClusterParams } from 'src/app/swagger/models/vsphere-regional-cluster-params.model'; -import { WizardBaseDirective } from '../wizard/shared/wizard-base/wizard-base'; - -@Component({ - selector: 'app-wizard', - templateUrl: './vsphere-wizard.component.html', - styleUrls: ['./vsphere-wizard.component.scss'], -}) -export class VSphereWizardComponent extends WizardBaseDirective implements OnInit { - APP_ROUTES: Routes = APP_ROUTES; - PROVIDERS: Providers = PROVIDERS; - - tkrVersion: Observable; - vsphereVersion: string; - deploymentPending: boolean = false; - disableDeployButton = false; - - constructor( - private apiClient: APIClient, - router: Router, - private exportService: ExportService, - private importService: ImportService, - formBuilder: FormBuilder, - titleService: Title, - el: ElementRef) { - - super(router, el, titleService, formBuilder); - - this.provider = AppServices.appDataService.getProviderType(); - this.tkrVersion = AppServices.appDataService.getTkrVersion(); - AppServices.appDataService.getVsphereVersion().subscribe(version => { - this.vsphereVersion = version ? version + ' ' : ''; - }); - } - - protected supplyFileImportedEvent(): TanzuEventType { - return TanzuEventType.VSPHERE_CONFIG_FILE_IMPORTED; - } - - protected supplyFileImportErrorEvent(): TanzuEventType { - return TanzuEventType.VSPHERE_CONFIG_FILE_IMPORT_ERROR; - } - - protected supplyWizardName(): string { - return 'vSphereWizard'; - } - - protected supplyStepData(): FormDataForHTML[] { - return [ - this.VsphereProviderForm, - this.VsphereNodeSettingForm, - this.VsphereLoadBalancerForm, - this.MetadataForm, - this.VsphereResourceForm, - this.VsphereNetworkForm, - this.IdentityForm, - this.VsphereOsImageForm, - this.CeipForm, - ]; - } - - ngOnInit() { - super.ngOnInit(); - - this.titleService.setTitle(this.title ? this.title + ' vSphere' : 'vSphere'); - this.registerServices(); - this.subscribeToServices(); - } - - getPayload(): VsphereRegionalClusterParams { - const payload: VsphereRegionalClusterParams = {}; - this.initPayloadWithCommons(payload); - const defaultAviNetworkName = payload.aviConfig?.network?.name; - const defaultAviNetworkCIDR = payload.aviConfig?.network?.cidr; - const mappings = [ - ['ipFamily', VsphereForm.PROVIDER, VsphereField.PROVIDER_IP_FAMILY], - ['datacenter', VsphereForm.PROVIDER, VsphereField.PROVIDER_DATA_CENTER], - ['ssh_key', VsphereForm.PROVIDER, VsphereField.PROVIDER_SSH_KEY], - ['clusterName', VsphereForm.NODESETTING, VsphereField.NODESETTING_CLUSTER_NAME], - ['controlPlaneEndpoint', VsphereForm.NODESETTING, VsphereField.NODESETTING_CONTROL_PLANE_ENDPOINT_IP], - ['datastore', VsphereForm.RESOURCE, VsphereField.RESOURCE_DATASTORE], - ['folder', VsphereForm.RESOURCE, VsphereField.RESOURCE_VMFOLDER], - ['resourcePool', VsphereForm.RESOURCE, VsphereField.RESOURCE_POOL] - ]; - mappings.forEach(attr => payload[attr[0]] = this.getFieldValue(attr[1], attr[2])); - payload.controlPlaneFlavor = this.getStoredClusterPlan(VsphereForm.NODESETTING); - payload.controlPlaneNodeType = this.getControlPlaneType(payload.controlPlaneFlavor); - payload.workerNodeType = AppServices.appDataService.isModeClusterStandalone() ? payload.controlPlaneNodeType : - this.getFieldValue(VsphereForm.NODESETTING, VsphereField.NODESETTING_WORKER_NODE_INSTANCE_TYPE); - payload.machineHealthCheckEnabled = - this.getFieldValue(VsphereForm.NODESETTING, VsphereField.NODESETTING_MACHINE_HEALTH_CHECKS_ENABLED) === true; - - const vsphereCredentialsMappings = [ - ['host', VsphereForm.PROVIDER, VsphereField.PROVIDER_VCENTER_ADDRESS], - ['password', VsphereForm.PROVIDER, VsphereField.PROVIDER_USER_PASSWORD], - ['username', VsphereForm.PROVIDER, VsphereField.PROVIDER_USER_NAME], - ['thumbprint', VsphereForm.PROVIDER, VsphereField.PROVIDER_THUMBPRINT] - ]; - payload.vsphereCredentials = {}; - - payload.enableAuditLogging = this.getBooleanFieldValue(VsphereForm.NODESETTING, VsphereField.NODESETTING_ENABLE_AUDIT_LOGGING); - - vsphereCredentialsMappings.forEach(attr => payload.vsphereCredentials[attr[0]] = this.getFieldValue(attr[1], attr[2])); - payload.vsphereCredentials['insecure'] = this.getBooleanFieldValue(VsphereForm.PROVIDER, VsphereField.PROVIDER_CONNECTION_INSECURE); - - const endpointProvider = this.getFieldValue(VsphereForm.NODESETTING, VsphereField.NODESETTING_CONTROL_PLANE_ENDPOINT_PROVIDER); - if (endpointProvider === KUBE_VIP) { - payload.aviConfig['controlPlaneHaProvider'] = false; - } else { - payload.aviConfig['controlPlaneHaProvider'] = true; - } - - payload.aviConfig['management_cluster_service_engine'] = - this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP_NAME); - payload.aviConfig['managementClusterControlPlaneVipNetworkName'] = - this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME) ?? - defaultAviNetworkName; - payload.aviConfig['managementClusterControlPlaneVipNetworkCIDR'] = - this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR) ?? - defaultAviNetworkCIDR; - payload.aviConfig['managementClusterVipNetworkName'] = - this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_NAME) ?? - defaultAviNetworkName; - payload.aviConfig['managementClusterVipNetworkCidr'] = - this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_CIDR) ?? - defaultAviNetworkCIDR; - - return payload; - } - - setFromPayload(payload: VsphereRegionalClusterParams) { - const mappings = [ - ['ipFamily', VsphereForm.PROVIDER, VsphereField.PROVIDER_IP_FAMILY], - ['datacenter', VsphereForm.PROVIDER, VsphereField.PROVIDER_DATA_CENTER], - ['ssh_key', VsphereForm.PROVIDER, VsphereField.PROVIDER_SSH_KEY], - ['clusterName', VsphereForm.NODESETTING, VsphereField.NODESETTING_CLUSTER_NAME], - ['controlPlaneEndpoint', VsphereForm.NODESETTING, VsphereField.NODESETTING_CONTROL_PLANE_ENDPOINT_IP], - ['datastore', VsphereForm.RESOURCE, VsphereField.RESOURCE_DATASTORE], - ['folder', VsphereForm.RESOURCE, VsphereField.RESOURCE_VMFOLDER], - ['resourcePool', VsphereForm.RESOURCE, VsphereField.RESOURCE_POOL] - ]; - mappings.forEach(attr => this.storeFieldString(attr[1], attr[2], payload[attr[0]])); - this.setStoredClusterPlan(VsphereForm.NODESETTING, payload.controlPlaneFlavor); - - if (payload.controlPlaneNodeType) { - const instanceTypeField = payload.controlPlaneFlavor === 'prod' ? VsphereField.NODESETTING_INSTANCE_TYPE_PROD - : VsphereField.NODESETTING_INSTANCE_TYPE_DEV; - const vSphereNode = this.getVSphereNode(payload.controlPlaneNodeType); - if (vSphereNode) { - this.storeFieldString('vsphereNodeSettingForm', instanceTypeField, vSphereNode.id, vSphereNode.name); - } - } - - this.storeFieldBoolean(VsphereForm.NODESETTING, VsphereField.NODESETTING_ENABLE_AUDIT_LOGGING, payload.enableAuditLogging); - this.storeFieldBoolean(VsphereForm.NODESETTING, VsphereField.NODESETTING_MACHINE_HEALTH_CHECKS_ENABLED, - payload.machineHealthCheckEnabled); - - const workerNodeType = payload.workerNodeType; - if (workerNodeType) { - const vSphereNode = this.getVSphereNode(workerNodeType); - if (vSphereNode) { - this.storeFieldString(VsphereForm.NODESETTING, VsphereField.NODESETTING_WORKER_NODE_INSTANCE_TYPE, vSphereNode.id, - vSphereNode.name); - } - } - - if (payload.vsphereCredentials !== undefined) { - const vsphereCredentialsMappings = [ - ['host', VsphereForm.PROVIDER, VsphereField.PROVIDER_VCENTER_ADDRESS], - ['username', VsphereForm.PROVIDER, VsphereField.PROVIDER_USER_NAME], - ['thumbprint', VsphereForm.PROVIDER, VsphereField.PROVIDER_THUMBPRINT] - ]; - vsphereCredentialsMappings.forEach(attr => this.storeFieldString(attr[1], attr[2], payload.vsphereCredentials[attr[0]])); - const decodedPassword = AppServices.appDataService.decodeBase64(payload.vsphereCredentials['password']); - this.storeFieldString(VsphereForm.PROVIDER, VsphereField.PROVIDER_USER_PASSWORD, decodedPassword); - } - - if (payload.aviConfig !== undefined) { - const endpointProvider = payload.aviConfig.controlPlaneHaProvider ? NSX_ADVANCED_LOAD_BALANCER : KUBE_VIP; - this.storeFieldString(VsphereForm.NODESETTING, VsphereField.NODESETTING_CONTROL_PLANE_ENDPOINT_PROVIDER, endpointProvider); - // Set (or clear) the network name (based on whether it's different from the aviConfig value - const managementClusterVipNetworkName = payload.aviConfig.managementClusterVipNetworkName; - let uiMcNetworkName = ''; - if (managementClusterVipNetworkName !== payload.aviConfig.network.name) { - uiMcNetworkName = payload.aviConfig.managementClusterVipNetworkName; - } - this.storeFieldString(WizardForm.LOADBALANCER, LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_NAME, uiMcNetworkName); - const managementClusterControlPlaneVipNetworkName = payload.aviConfig.managementClusterControlPlaneVipNetworkName; - let uiMcControlPlaneNetworkName = ''; - if (managementClusterControlPlaneVipNetworkName !== payload.aviConfig.network.name) { - uiMcControlPlaneNetworkName = payload.aviConfig.managementClusterControlPlaneVipNetworkName; - } - this.storeFieldString(WizardForm.LOADBALANCER, LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME, - uiMcControlPlaneNetworkName); - // Set (or clear) the CIDR setting (based on whether it's different from the aviConfig value - const managementClusterNetworkCIDR = payload.aviConfig.managementClusterVipNetworkCidr; - let uiMcCidr = ''; - if (managementClusterNetworkCIDR !== payload.aviConfig.network.cidr) { - uiMcCidr = managementClusterNetworkCIDR; - } - this.storeFieldString(WizardForm.LOADBALANCER, LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_CIDR, uiMcCidr); - - const managementClusterControlPlaneNetworkCIDR = payload.aviConfig.managementClusterControlPlaneVipNetworkCidr; - let uiMcControlPlaneVipNetworkCidr = ''; - if (managementClusterControlPlaneNetworkCIDR !== payload.aviConfig.network.cidr) { - uiMcControlPlaneVipNetworkCidr = managementClusterControlPlaneNetworkCIDR; - } - this.storeFieldString(WizardForm.LOADBALANCER, LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR, - uiMcControlPlaneVipNetworkCidr); - - this.storeFieldString(WizardForm.LOADBALANCER, LoadBalancerField.MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP_NAME, - payload.aviConfig.management_cluster_service_engine); - } - - this.storeFieldString('osImageForm', 'osImage', payload.os.moid, payload.os.name); - - this.saveCommonFieldsFromPayload(payload); - AppServices.userDataService.updateWizardTimestamp(this.wizardName); - } - - private getVSphereNode(workerNodeType: string) { - return VsphereNodeTypes.find(node => node.id === workerNodeType); - } - - /** - * @method method to trigger deployment - */ - createRegionalCluster(payload: any): Observable { - return this.apiClient.createVSphereRegionalCluster(payload); - } - - /** - * Return management/standalone cluster name - */ - getMCName() { - return this.getFieldValue(VsphereForm.NODESETTING, VsphereField.NODESETTING_CLUSTER_NAME); - } - - /** - * Get the CLI used to deploy the management/standalone cluster - */ - getCli(configPath: string): string { - const cliG = new CliGenerator(); - const cliParams: CliFields = { - configPath: configPath, - clusterType: this.getClusterType(), - clusterName: this.getMCName(), - extendCliCmds: [] - }; - return cliG.getCli(cliParams); - } - - /** - * Apply the settings captured via UI to backend TKG config without - * actually creating the management/standalone cluster. - */ - applyTkgConfig() { - return this.apiClient.applyTKGConfigForVsphere({ params: this.getPayload() }); - } - - /** - * Retrieve the config file from the backend and return as a string - */ - retrieveExportFile() { - return this.apiClient.exportTKGConfigForVsphere({ params: this.getPayload() }); - } - - exportConfiguration() { - const wizard = this; // capture 'this' outside the context of the closure below - this.exportService.export( - this.retrieveExportFile(), - (failureMessage) => { wizard.displayError(failureMessage); } - ); - } - - /** - * @method getControlPlaneType - * helper method to return value of dev instance type or prod instance type - * depending on what type of control plane is selected - * @param controlPlaneType {string} the control plane type (dev/prod) - * @returns {any} - */ - getControlPlaneType(controlPlaneType: string) { - if (controlPlaneType === ClusterPlan.DEV) { - return this.getFieldValue(VsphereForm.NODESETTING, VsphereField.NODESETTING_INSTANCE_TYPE_DEV); - } else if (controlPlaneType === ClusterPlan.PROD) { - return this.getFieldValue(VsphereForm.NODESETTING, VsphereField.NODESETTING_INSTANCE_TYPE_PROD); - } else { - return null; - } - } - - // vSphere-specific forms - get VsphereLoadBalancerForm(): FormDataForHTML { - return { name: WizardForm.LOADBALANCER, title: 'VMware NSX Advanced Load Balancer', - description: VsphereLoadBalancerStepComponent.description, - i18n: { title: 'load balancer step name', description: 'load balancer step description' }, - clazz: VsphereLoadBalancerStepComponent }; - } - get VsphereNodeSettingForm(): FormDataForHTML { - return { name: VsphereForm.NODESETTING, title: FormUtility.titleCase(this.clusterTypeDescriptor) + ' Cluster Settings', - description: `Specify the resources backing the ${this.clusterTypeDescriptor} cluster`, - i18n: { title: 'node setting step name', description: 'node setting step description' }, - clazz: NodeSettingStepComponent }; - } - get VsphereNetworkForm(): FormDataForHTML { - return FormUtility.formWithOverrides(super.NetworkForm, - { clazz: VsphereNetworkStepComponent, description: VsphereNetworkStepComponent.description}); - } - get VsphereProviderForm(): FormDataForHTML { - return { name: VsphereForm.PROVIDER, title: 'IaaS Provider', - description: 'Validate the vSphere ' + this.vsphereVersion + 'provider account for Tanzu', - i18n: { title: 'IaaS provider step name', description: 'IaaS provider step description' }, - clazz: VSphereProviderStepComponent }; - } - get VsphereResourceForm(): FormDataForHTML { - return { name: VsphereForm.RESOURCE, title: 'Resources', - description: `Specify the resources for this ${this.clusterTypeDescriptor} cluster`, - i18n: { title: 'Resource step name', description: 'Resource step description' }, - clazz: ResourceStepComponent}; - } - get VsphereOsImageForm(): FormDataForHTML { - return this.getOsImageForm(VsphereOsImageStepComponent); - } - - // returns TRUE if the file contents appear to be a valid config file for vSphere - // returns FALSE if the file is empty or does not appear to be valid. Note that in the FALSE - // case we also alert the user. - importFileValidate(nameFile: string, fileContents: string): boolean { - if (fileContents.includes('VSPHERE_')) { - return true; - } - alert(nameFile + ' is not a valid vSphere configuration file!'); - return false; - } - - importFileRetrieveClusterParams(fileContents) { - return this.apiClient.importTKGConfigForVsphere( { params: { filecontents: fileContents } } ); - } - - importFileProcessClusterParams(event: TanzuEventType, nameFile: string, vsphereClusterParams: VsphereRegionalClusterParams) { - this.setFromPayload(vsphereClusterParams); - this.resetToFirstStep(); - this.importService.publishImportSuccess(event, nameFile); - } - - // returns TRUE if user (a) will not lose data on import, or (b) confirms it's OK - onImportButtonClick() { - let result = true; - if (!this.isOnFirstStep()) { - result = confirm('Importing will overwrite any data you have entered. Proceed with import?'); - } - return result; - } - - onImportFileSelected(event) { - const params: ImportParams = { - eventSuccess: this.supplyFileImportedEvent(), - eventFailure: this.supplyFileImportErrorEvent(), - file: event.target.files[0], - validator: this.importFileValidate, - backend: this.importFileRetrieveClusterParams.bind(this), - onSuccess: this.importFileProcessClusterParams.bind(this), - onFailure: this.importService.publishImportFailure - } - this.importService.import(params); - - // clear file reader target so user can re-select same file if needed - event.target.value = ''; - } - - private subscribeToServices() { - AppServices.messenger.subscribe(TanzuEventType.VSPHERE_DATACENTER_CHANGED, event => { - AppServices.dataServiceRegistrar.trigger( [ - TanzuEventType.VSPHERE_GET_RESOURCE_POOLS, - TanzuEventType.VSPHERE_GET_COMPUTE_RESOURCE, - TanzuEventType.VSPHERE_GET_VM_NETWORKS, - TanzuEventType.VSPHERE_GET_DATA_STORES, - TanzuEventType.VSPHERE_GET_VM_FOLDERS, - TanzuEventType.VSPHERE_GET_OS_IMAGES - ], { dc: event.payload }); - }); - } - - private registerServices() { - const wizard = this; - AppServices.dataServiceRegistrar.register(TanzuEventType.VSPHERE_GET_RESOURCE_POOLS, - (payload: { dc: string }) => { return wizard.apiClient.getVSphereResourcePools(payload) }, - "Failed to retrieve list of resource pools from the specified vCenter Server." - ); - AppServices.dataServiceRegistrar.register(TanzuEventType.VSPHERE_GET_COMPUTE_RESOURCE, - (payload: { dc: string }) => { return wizard.apiClient.getVSphereComputeResources(payload) }, - "Failed to retrieve list of compute resources from the specified datacenter." - ); - AppServices.dataServiceRegistrar.register(TanzuEventType.VSPHERE_GET_VM_NETWORKS, - (payload: { dc: string }) => { return wizard.apiClient.getVSphereNetworks(payload) }, - "Failed to retrieve list of VM networks from the specified vCenter Server." - ); - AppServices.dataServiceRegistrar.register(TanzuEventType.VSPHERE_GET_DATA_STORES, - (payload: { dc: string }) => { return wizard.apiClient.getVSphereDatastores(payload) }, - "Failed to retrieve list of datastores from the specified vCenter Server." - ); - AppServices.dataServiceRegistrar.register(TanzuEventType.VSPHERE_GET_VM_FOLDERS, - (payload: { dc: string }) => { return wizard.apiClient.getVSphereFolders(payload) }, - "Failed to retrieve list of vm folders from the specified vCenter Server." - ); - AppServices.dataServiceRegistrar.register(TanzuEventType.VSPHERE_GET_OS_IMAGES, - (payload: { dc: string }) => { return wizard.apiClient.getVSphereOSImages(payload) }, - "Failed to retrieve list of OS images from the specified vCenter Server." - ); - } -} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.constants.ts b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.constants.ts deleted file mode 100644 index ee835b8747..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.constants.ts +++ /dev/null @@ -1,53 +0,0 @@ -import {NodeType} from "../wizard/shared/constants/wizard.constants"; - -export const VsphereNodeTypes: Array = [ - { - id: 'small', - name: 'small (cpu: 2, ram: 4 GB, disk: 20 GB)' - }, - { - id: 'medium', - name: 'medium (cpu: 2, ram: 8 GB, disk: 40 GB)' - }, - { - id: 'large', - name: 'large (cpu: 4, ram: 16 GB, disk: 40 GB)' - }, - { - id: 'extra-large', - name: 'extra-large (cpu: 8, ram: 32 GB, disk: 80 GB)' - } -]; - -export enum VsphereField { - NETWORK_NAME = 'networkName', - - NODESETTING_CLUSTER_NAME = 'clusterName', - NODESETTING_CONTROL_PLANE_ENDPOINT_IP = 'controlPlaneEndpointIP', - NODESETTING_CONTROL_PLANE_ENDPOINT_PROVIDER = 'controlPlaneEndpointProvider', - NODESETTING_ENABLE_AUDIT_LOGGING = 'enableAuditLogging', - NODESETTING_INSTANCE_TYPE_DEV = 'devInstanceType', - NODESETTING_INSTANCE_TYPE_PROD = 'prodInstanceType', - NODESETTING_MACHINE_HEALTH_CHECKS_ENABLED = 'machineHealthChecksEnabled', - NODESETTING_WORKER_NODE_INSTANCE_TYPE = 'workerNodeInstanceType', - - PROVIDER_CONNECTION_INSECURE = 'insecure', - PROVIDER_DATA_CENTER = 'datacenter', - PROVIDER_IP_FAMILY = 'ipFamily', - PROVIDER_SSH_KEY = 'ssh_key', - PROVIDER_SSH_KEY_FILE = 'ssh_key_file', - PROVIDER_THUMBPRINT = 'thumbprint', - PROVIDER_USER_NAME = 'username', - PROVIDER_USER_PASSWORD = 'password', - PROVIDER_VCENTER_ADDRESS = 'vcenterAddress', - - RESOURCE_DATASTORE = 'datastore', - RESOURCE_POOL = 'resourcePool', - RESOURCE_VMFOLDER = 'vmFolder', -} - -export enum VsphereForm { - NODESETTING = 'vsphereNodeSettingForm', - PROVIDER = 'vsphereProviderForm', - RESOURCE = 'resourceForm', -} diff --git a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.module.ts b/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.module.ts deleted file mode 100644 index adf73e9ece..0000000000 --- a/tkg/web/src/app/views/landing/vsphere-wizard/vsphere-wizard.module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { LandingModule } from '../landing.module'; -import { VSphereWizardRoutingModule } from './vsphere-wizard-routing.module'; -import { SharedModule } from '../../../shared/shared.module'; - -import { WizardSharedModule } from '../wizard/shared/wizard-shared.module'; -import { ValidationService } from '../wizard/shared/validation/validation.service'; -import { VSphereWizardComponent } from './vsphere-wizard.component'; -import { VSphereProviderStepComponent } from './provider-step/vsphere-provider-step.component'; -import { NodeSettingStepComponent } from './node-setting-step/node-setting-step.component'; -import { ResourceStepComponent } from './resource-step/resource-step.component' -@NgModule({ - declarations: [ - VSphereWizardComponent, - VSphereProviderStepComponent, - NodeSettingStepComponent, - ResourceStepComponent - ], - imports: [ - CommonModule, - VSphereWizardRoutingModule, - SharedModule, - LandingModule, - WizardSharedModule - ], - exports: [ - ], - providers: [ - ValidationService - ] -}) -export class WizardModule { } diff --git a/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.html b/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.html deleted file mode 100644 index 5622ca057f..0000000000 --- a/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.html +++ /dev/null @@ -1,64 +0,0 @@ -
-
- -

-
- vSphere with Tanzu Environment Detected -

-
-
-

- You have connected to a vSphere 7 environment which could be entitled for vSphere with Tanzu - and Tanzu Kubernetes Grid Service. By using vSphere with Tanzu you can turn a vSphere cluster - into a platform for running Kubernetes workloads in dedicated resource pools. Once enabled on a - vSphere cluster, vSphere with Tanzu creates a Kubernetes control plane directly in the hypervisor - layer. You can then run Kubernetes containers by deploying vSphere Pods, or you can create upstream - Kubernetes clusters through the VMware Tanzu™ Kubernetes Grid™ Service and run your applications - inside these clusters. Tanzu Kubernetes Grid Service is the preferred way to consume Tanzu Kubernetes - Grid on vSphere environments. -

-

- -

-

- Deploying a non-integrated Tanzu Kubernetes Grid {{ clusterTypeDescriptor }} cluster on vSphere 7 requires a subscription - to Tanzu Kubernetes Grid Plus. -

-
- - - - - - -
- -

- Not sure of the difference between TKG multicloud and TKG Service? Learn more - - here. -
- Documentation for vSphere with Tanzu and TKG Service can be found - - here. -
- -

- diff --git a/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.scss b/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.scss deleted file mode 100644 index efb8ad1611..0000000000 --- a/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -p.mh400 { - min-height: 400px; -} - -clr-icon.back-link { - margin-right: 6px; - cursor: pointer; - position: relative; - top: 10px; - float:left; -} - -h2 { - margin-top: 0rem; -} diff --git a/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.spec.ts b/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.spec.ts deleted file mode 100644 index 9ddb55ba17..0000000000 --- a/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -// Angular modules -import { TestBed, async } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; - -// App imports -import { SharedModule } from '../../../shared/shared.module'; -import { WcpRedirectComponent } from './wcp-redirect.component'; - -describe('WcpRedirectComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule, - SharedModule - ], - declarations: [ - WcpRedirectComponent - ] - }).compileComponents(); - })); - - it('should exist', () => { - const fixture = TestBed.createComponent(WcpRedirectComponent); - const exitComponent = fixture.debugElement.componentInstance; - expect(exitComponent).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.ts b/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.ts deleted file mode 100644 index 5ffe056038..0000000000 --- a/tkg/web/src/app/views/landing/wcp-redirect/wcp-redirect.component.ts +++ /dev/null @@ -1,57 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -// App Imports -import { APP_ROUTES, Routes } from '../../../shared/constants/routes.constants'; -import AppServices from 'src/app/shared/service/appServices'; -import { StepFormDirective } from '../wizard/shared/step-form/step-form'; -import { TanzuEventType } from '../../../shared/service/Messenger'; - -@Component({ - selector: 'tkg-kickstart-ui-wcp-redirect', - templateUrl: './wcp-redirect.component.html', - styleUrls: ['./wcp-redirect.component.scss'] -}) -export class WcpRedirectComponent extends StepFormDirective implements OnInit { - - APP_ROUTES: Routes = APP_ROUTES; - vcHost: string; - hasTkgPlus: boolean = false; - - constructor(private router: Router) { - super(); - } - - // This method must be implemented from the base class, but we have no user data to save - protected storeUserData() {} - - ngOnInit() { - AppServices.messenger.subscribe(TanzuEventType.VSPHERE_VC_AUTHENTICATED, data => { this.vcHost = data.payload; }, - this.unsubscribe); - } - - /** - * @method navigate - * @desc helper method to trigger router navigation to specified route - * @param route - the route to navigate to - */ - navigate(route: string): void { - this.router.navigate([route]); - } - - /** - * @method launchVsphereWcp - * @desc helper method to launch vSphere wcp enablement workflow in new window - */ - launchVsphereWcp() { - window.open(`https://${this.vcHost}/ui/app/workload-platform/`, '_blank'); - } - - /** - * @method launchVsphereWcp - * @desc helper method to launch vSphere wcp enablement workflow in new window - */ - relaunchVsphereWizard() { - window.open(`https://${this.vcHost}/ui/app/workload-platform/`, '_blank'); - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/PersistentStore.ts b/tkg/web/src/app/views/landing/wizard/shared/PersistentStore.ts deleted file mode 100644 index ea0fb9c097..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/PersistentStore.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * A staic wrapper of localStorate APIs, whereas, the wrapper - * hide all the internal maintenance work from the outside world. - */ -const ALL_KEYS = "TKG_KICKSTART_ALL_KEYS"; -export class PersistentStore { - /** - * Set data for key. If the key is already existed in the store, - * it will be overwritten silently. The method seriailizes 'value' - * automatically using JSON.stringify(), so make sure the value is - * serializable. - * @param key key in the store - * @param value value in the store - */ - static setItem(key: string, value: any): void { - const allKeys = PersistentStore.getItem(ALL_KEYS) || {}; - allKeys[key] = key; - localStorage.setItem(ALL_KEYS, JSON.stringify(allKeys)); - localStorage.setItem(key, JSON.stringify(value)); - } - - /** - * Get the value for key. The method deserializes value automatically - * by calling JSON.parse(); - * @param key the key whose value to get - */ - static getItem(key: string): any { - return JSON.parse(localStorage.getItem(key)); - } - - /** - * Remove an entry indicated by "key". There's no error even if "key" - * is not existed in the store. - * @param key the key to be removed from the store - */ - static removeItem(key): void { - const allKeys = PersistentStore.getItem(ALL_KEYS) || {}; - delete allKeys[key]; - PersistentStore.setItem(ALL_KEYS, allKeys); - localStorage.removeItem(key); - } - - /** - * Removes all entries added by us. - */ - static clear() { - const allKeys = PersistentStore.getItem(ALL_KEYS) as Object; - for (const key in allKeys) { - if (allKeys.hasOwnProperty(key)) { - localStorage.removeItem(key); - } - } - localStorage.removeItem(ALL_KEYS); - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/delete-data-popup.component.html b/tkg/web/src/app/views/landing/wizard/shared/components/delete-data-popup.component.html deleted file mode 100644 index c0eb6ec8d2..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/delete-data-popup.component.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/delete-data-popup.component.scss b/tkg/web/src/app/views/landing/wizard/shared/components/delete-data-popup.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/delete-data-popup.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/delete-data-popup.component.ts deleted file mode 100644 index cdc17a99be..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/delete-data-popup.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Angular Modules - */ -import AppServices from '../../../../../shared/service/appServices'; -import { Component, Input, OnInit } from '@angular/core'; - -@Component({ - selector: 'app-shared-delete-data-popup', - templateUrl: './delete-data-popup.component.html', - styleUrls: ['./delete-data-popup.component.scss'] -}) -export class DeleteDataPopupComponent implements OnInit { - open: boolean; - @Input() wizard: string; - - ngOnInit() { - // TODO: change the process of using stored data so that instead of using stored data to BUILD the steps' forms, - // we re-purpose the CONFIG_FILE_IMPORTED events to be RESTORE_FROM_STORED_DATA events and only restore data in - // response to that event (which can be used from here as well as from file import). - // Once that is in place, then this component can broadcast that event (a) in ngOnInit() if the data is "fresh", or - // (b) on useSavedDataClick() when data is "old" but the user says we should apply it anyway. - // That way we would NOT apply the data if the user tells us not to. - // In the meantime, we are disabling this functionality because we're using the data right away, even before the user - // has a chance to respond to the question of whether we should! - // - // this.open = AppServices.userDataService.isWizardDataOld(this.wizard); - } - - clearDataClick() { - AppServices.userDataService.deleteWizardData(this.wizard); - this.open = false; - } - - useSavedDataClick() { - AppServices.userDataService.updateWizardTimestamp(this.wizard); - this.open = false; - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.html b/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.html deleted file mode 100644 index 034c4a411d..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.scss b/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.scss deleted file mode 100644 index 6ced70e252..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -.modal-footer { - justify-content: flex-start; -} \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.spec.ts deleted file mode 100644 index afdc77fe6d..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { SSLThumbprintModalComponent } from './ssl-thumbprint-modal.component'; - -describe('SSLThumbprintModalComponent', () => { - let component: SSLThumbprintModalComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ SSLThumbprintModalComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SSLThumbprintModalComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.ts deleted file mode 100644 index e21b317c6c..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/modals/ssl-thumbprint-modal/ssl-thumbprint-modal.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; - -@Component({ - selector: 'app-ssl-thumbprint-modal', - templateUrl: './ssl-thumbprint-modal.component.html', - styleUrls: ['./ssl-thumbprint-modal.component.scss'] -}) -export class SSLThumbprintModalComponent implements OnInit { - @Input() thumbprint: string; - @Input() vcenterHost: string; - @Output() verifiedThumbprint: EventEmitter = new EventEmitter(); - - show: boolean; - - constructor() {} - - ngOnInit(): void { - this.show = false; - } - - open() { - this.show = true; - } - - close() { - this.verifiedThumbprint.emit(false); - this.show = false; - } - - continueBtnHandler() { - this.verifiedThumbprint.emit(true); - this.show = false; - } - -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.component.html b/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.component.html deleted file mode 100644 index 5a39bd491a..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.component.html +++ /dev/null @@ -1,28 +0,0 @@ -
-

- VMware's Customer Experience Improvement Program ("CEIP") provides VMware with information that - enables VMware to improve its products and services and fix problems. By choosing to participate - in CEIP, you agree that VMware may collect technical information about your use of VMware - products and services on a regular basis. This information does not personally identify you. -

-

- For more details about the Program, please see - - http://www.vmware.com/trustvmware/ceip.html - -

-
-
-
- - - - - - -
-
-
-
diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.component.scss b/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.component.spec.ts deleted file mode 100644 index 2cf548cd2d..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.component.spec.ts +++ /dev/null @@ -1,48 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { FormBuilder } from '@angular/forms'; -// App imports -import AppServices from 'src/app/shared/service/appServices'; -import { FieldMapUtilities } from '../../../field-mapping/FieldMapUtilities'; -import { Messenger } from 'src/app/shared/service/Messenger'; -import { SharedCeipStepComponent } from './ceip-step.component'; -import { ValidationService } from '../../../validation/validation.service'; - -describe('SharedCeipStepComponent', () => { - let component: SharedCeipStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule - ], - providers: [ - FormBuilder, - ValidationService - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [SharedCeipStepComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - const fb = new FormBuilder(); - fixture = TestBed.createComponent(SharedCeipStepComponent); - component = fixture.componentInstance; - component.formGroup = fb.group({ - }); - - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.component.ts deleted file mode 100644 index a4ee351fae..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.component.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -// App imports -import AppServices from '../../../../../../../shared/service/appServices'; -import { CeipStepMapping } from './ceip-step.fieldmapping'; -import { StepFormDirective } from '../../../step-form/step-form'; - -@Component({ - selector: 'app-shared-ceip-step', - templateUrl: './ceip-step.component.html', - styleUrls: ['./ceip-step.component.scss'] -}) -export class SharedCeipStepComponent extends StepFormDirective implements OnInit { - - ngOnInit() { - super.ngOnInit(); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, CeipStepMapping); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(CeipStepMapping); - this.storeDefaultLabels(CeipStepMapping); - this.registerDefaultFileImportedHandler(this.eventFileImported, CeipStepMapping); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - } - - protected storeUserData() { - this.storeUserDataFromMapping(CeipStepMapping); - this.storeDefaultDisplayOrder(CeipStepMapping); - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.fieldmapping.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.fieldmapping.ts deleted file mode 100644 index a028aa351b..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/ceip-step/ceip-step.fieldmapping.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { StepMapping } from '../../../field-mapping/FieldMapping'; - -export enum CeipField { - OPTIN = 'ceipOptIn', -} - -export const CeipStepMapping: StepMapping = { - fieldMappings: [ - { name: CeipField.OPTIN, isBoolean: true, defaultValue: true, label: 'CEIP OPT-IN' } - ] -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/form-utility.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/form-utility.ts deleted file mode 100644 index d37650fd00..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/form-utility.ts +++ /dev/null @@ -1,36 +0,0 @@ -// Angular imports -import { Type } from '@angular/core'; -// App imports -import { StepFormDirective } from '../../step-form/step-form'; - -interface I18nDataForHtml { - title: string, - description: string, -} -export interface FormDataForHTML { - name: string, // name of this step (not displayable) - description: string, // description of this step (displayed) - title: string, // title of this step (displayed) - i18n: I18nDataForHtml, // data used for navigating UI (displayed) - clazz: Type, // the class of the step component -} - -export class FormUtility { - static titleCase(target): string { - if (target === undefined || target === null || target.length === 0) { - return ''; - } - return target.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() }); - } - - static formWithOverrides(formData: FormDataForHTML, overrideData: { description?: string, clazz?: Type }): - FormDataForHTML { - if (overrideData.description) { - formData.description = overrideData.description; - } - if (overrideData.clazz) { - formData.clazz = overrideData.clazz; - } - return formData; - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.html b/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.html deleted file mode 100644 index 223a90f5f6..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.html +++ /dev/null @@ -1,661 +0,0 @@ -
- - -

- Optionally Specify Identity Management with OIDC or LDAPS -

- -
-
- - - - - - -
-
-
-
-
- - - - - - - - - - -
-
- - -
- OIDC Identity Management Source -
-
-
-
- - - - - - - Issuer URL is required. - - - Issuer URL must not include whitespace on ends. - - - Issuer URL must be a valid FQDN or IP with https protocol prefix. - - - Issuer URL must not contain URL fragments. - - - Issuer URL must not contain URL query parameters. - - -
-
-
-
-
-
- - - - - - Client ID is required. It must not include whitespace on ends. - -
-
-
-
- - - - - - Client secret is required. It must not include whitespace on ends. - -
-
-
- -
-
-
- - - - - - - Scopes are required. It must be a comma separated list of scopes. - - - It must not include whitespace. - - -
-
-
- -
- -
-
- - - - - - Username claim is required. - -
-
- -
-
- - - - - - Groups claim is required. - -
-
-
-
- - -
- LDAPS Identity Management Source -
-
- -
-
-
- -
- -
-
- -
-
- -
- - Invalid LDAPS endpoint -
-
-
- - -
- - - - - - -
- - -
- - - - - - -
-
-
- User Search Attributes -
-
- -
- - - - - - -
- - -
- - - - - - Filter is required - -
- - -
- - - - - - Username is required - -
-
- -
- Group Search Attributes -
-
- -
- - - - - - -
- - -
- - - - - - Groups search filter is required. - -
- - -
- - - - - - -
-
-
- -
- - - - - - -
- - -
- - - - - - -
-
-
- -
-
- -
-
- -
-
-
-
-
-
- -
-
- -
-
-
- - - - - - - -
-
-
diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.scss b/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.scss deleted file mode 100644 index a72147ffdf..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.scss +++ /dev/null @@ -1,117 +0,0 @@ -@use '../../../../../../../../sass/properties'; - -.radio-label { - padding-bottom: 15px; - font-size: 16px; -} - -.endpoint-ip-input { - width: 112px; - min-width: 112px; -} - -.endpoint-port-input { - width: 40px; - min-width: 40px; -} - -.endpoint-slash { - width: 25px; - min-width: 25px; - border-bottom: none; - margin-right: -3px; - margin-left: 60px; -} - -.endpoint-colon { - width: 25px; - min-width: 25px; - border-bottom: none; - margin-right: -11px; -} - -clr-select-container.ldap-header { - margin-top: -23px; -} - -// Temporary override to fix top margins -.oidc-form { - clr-input-container.clr-form-control { - margin-top: 0; - } -} - -.ldap-endpoint { - margin-top: 0; - - label.ldap-endpoint-label { - display: block; - line-height: 18px; - font-size: 13px; - font-weight: 600; - top: 25px; - position: relative; - color: properties.$label-color-light-theme; - } - - .inline-block-override { - display: inline-block; - } - - .clr-input-wrapper { - display: inline-block; - - input { - margin-left: 0; - } - } - - clr-icon.clr-validate-icon.clr-error { - position: relative; - right: -20px; - display: inline-block; - } -} - -.clr-textarea { - width: 500px; - height: 120px; -} - -.claim-container { - margin-left: 0; -} - -.btn-claim { - margin-left: 1rem; -} - -.btn-delete { - border: none; -} - -.claim-input { - margin-top: .1rem; - margin-bottom: 24px; -} - -.clr-textarea { - width: 500px; - height: 120px; -} - -.err-claim { - max-width: 175px; -} - -.container { - display: flex; - flex-direction: column; -} - -.button-container { - display: flex; - flex: 1 1; - justify-content: center; - align-items: center; -} \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.spec.ts deleted file mode 100644 index c8ccc735df..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.spec.ts +++ /dev/null @@ -1,131 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -// App imports -import { APIClient } from '../../../../../../../swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { IdentityField } from './identity-step.fieldmapping'; -import { IdentityManagementType, WizardForm } from '../../../constants/wizard.constants'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { SharedIdentityStepComponent } from './identity-step.component'; -import { SharedModule } from '../../../../../../../shared/shared.module'; -import { ValidationService } from '../../../validation/validation.service'; - -describe('IdentityStepComponent', () => { - let component: SharedIdentityStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - ValidationService, - FormBuilder, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [SharedIdentityStepComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - fixture = TestBed.createComponent(SharedIdentityStepComponent); - component = fixture.componentInstance; - // NOTE: using Azure file import stuff just to test - component.setStepRegistrantData({ wizard: 'BozoWizard', step: WizardForm.IDENTITY, formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.AZURE_CONFIG_FILE_IMPORTED, - eventFileImportError: TanzuEventType.AZURE_CONFIG_FILE_IMPORT_ERROR}); - fixture.detectChanges(); - component.ngOnInit(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should switch to ldap', () => { - fixture.whenStable().then(() => { - spyOn(component, 'unsetValidators').and.callThrough(); - spyOn(component, 'setLDAPValidators').and.callThrough(); - if (!component.isUsingIdentityManagement) { - component.toggleIdmSetting(); - } - component.formGroup.get(IdentityField.IDENTITY_TYPE).setValue(IdentityManagementType.LDAP); - expect(component.isIdentityManagementLdap).toBeTrue(); - expect(component.unsetValidators).toHaveBeenCalled(); - expect(component.setLDAPValidators).toHaveBeenCalled(); - }); - }); - - it('should switch back to oidc', () => { - fixture.whenStable().then(() => { - if (!component.isUsingIdentityManagement) { - component.toggleIdmSetting(); - } - component.formGroup.get(IdentityField.IDENTITY_TYPE).setValue(IdentityManagementType.LDAP); - spyOn(component, 'unsetValidators').and.callThrough(); - spyOn(component, 'setOIDCValidators').and.callThrough(); - component.formGroup.get(IdentityField.IDENTITY_TYPE).setValue(IdentityManagementType.OIDC); - expect(component.isIdentityManagementOidc).toBeTrue(); - expect(component.unsetValidators).toHaveBeenCalled(); - expect(component.setOIDCValidators).toHaveBeenCalled(); - }); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.ngOnInit(); - const identityTypeControl = component.formGroup.get(IdentityField.IDENTITY_TYPE); - const oidcIssuerControl = component.formGroup.get(IdentityField.ISSUER_URL); - const ldapEndpointIpControl = component.formGroup.get(IdentityField.ENDPOINT_IP); - const ldapEndpointPortControl = component.formGroup.get(IdentityField.ENDPOINT_PORT); - - expect(component.dynamicDescription()).toEqual(SharedIdentityStepComponent.description); - - // OIDC - identityTypeControl.setValue(IdentityManagementType.OIDC); - oidcIssuerControl.setValue('https://1.2.3.4'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.IDENTITY, - description: 'OIDC configured: https://1.2.3.4', - } - }); - - // LDAP without port set - identityTypeControl.setValue(IdentityManagementType.LDAP); - ldapEndpointIpControl.setValue('https://5.6.7.8'); - ldapEndpointPortControl.setValue(''); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.IDENTITY, - description: 'LDAP configured: https://5.6.7.8:', - } - }); - - // LDAP with port set - identityTypeControl.setValue(IdentityManagementType.LDAP); - ldapEndpointIpControl.setValue('https://9.8.7.6'); - ldapEndpointPortControl.setValue('123'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.IDENTITY, - description: 'LDAP configured: https://9.8.7.6:123', - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.ts deleted file mode 100644 index 41b4561b91..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.component.ts +++ /dev/null @@ -1,402 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { Validators } from '@angular/forms'; -// Third party imports -import { distinctUntilChanged, takeUntil, tap } from 'rxjs/operators'; -// App imports -import { APIClient } from 'src/app/swagger'; -import AppServices from '../../../../../../../shared/service/appServices'; -import { IdentityField, IdentityStepMapping } from './identity-step.fieldmapping'; -import { IdentityManagementType } from '../../../constants/wizard.constants'; -import { IpFamilyEnum } from 'src/app/shared/constants/app.constants'; -import { LdapParams } from '../../../../../../../swagger/models/ldap-params.model'; -import { LdapTestResult } from 'src/app/swagger/models'; -import { StepFormDirective } from '../../../step-form/step-form'; -import { ValidationService } from '../../../validation/validation.service'; - -const CONNECT = "CONNECT"; -const BIND = "BIND"; -const USER_SEARCH = "USER_SEARCH"; -const GROUP_SEARCH = "GROUP_SEARCH"; -const DISCONNECT = "DISCONNECT"; - -const TEST_SUCCESS = 1; - -const LDAP_TESTS = [CONNECT, BIND, USER_SEARCH, GROUP_SEARCH, DISCONNECT]; - -const NOT_STARTED = "not-started"; -const SUCCESS = "success"; -const ERROR = "error"; -const PROCESSING = "processing"; - -const oidcFields: Array = [ - IdentityField.ISSUER_URL, - IdentityField.CLIENT_ID, - IdentityField.CLIENT_SECRET, - IdentityField.SCOPES, - IdentityField.OIDC_GROUPS_CLAIM, - IdentityField.OIDC_USERNAME_CLAIM -]; - -const ldapValidatedFields: Array = [ - IdentityField.ENDPOINT_IP, - IdentityField.ENDPOINT_PORT, - IdentityField.BIND_PW, - IdentityField.GROUP_SEARCH_FILTER, - IdentityField.USER_SEARCH_FILTER, - IdentityField.USER_SEARCH_USERNAME -]; - -const ldapNonValidatedFields: Array = [ - IdentityField.BIND_DN, - IdentityField.USER_SEARCH_BASE_DN, - IdentityField.GROUP_SEARCH_BASE_DN, - IdentityField.GROUP_SEARCH_USER_ATTR, - IdentityField.GROUP_SEARCH_GROUP_ATTR, - IdentityField.GROUP_SEARCH_NAME_ATTR, - IdentityField.LDAP_ROOT_CA, - IdentityField.TEST_USER_NAME, - IdentityField.TEST_GROUP_NAME -]; - -const LDAP_PARAMS = { - ldap_bind_dn: "bindDN", - ldap_bind_password: "bindPW", - ldap_group_search_base_dn: "groupSearchBaseDN", - ldap_group_search_filter: "groupSearchFilter", - ldap_group_search_group_attr: "groupSearchGroupAttr", - ldap_group_search_name_attr: "groupSearchNameAttr", - ldap_group_search_user_attr: "groupSearchUserAttr", - ldap_root_ca: "ldapRootCAData", - ldap_user_search_base_dn: "userSearchBaseDN", - ldap_user_search_filter: "userSearchFilter", - ldap_user_search_name_attr: "userSearchUsername", - ldap_user_search_username: "userSearchUsername", - ldap_test_group: "testGroupName", - ldap_test_user: "testUserName" -} - -@Component({ - selector: 'app-shared-identity-step', - templateUrl: './identity-step.component.html', - styleUrls: ['./identity-step.component.scss'] -}) -export class SharedIdentityStepComponent extends StepFormDirective implements OnInit { - static description = 'Optionally specify identity management'; - - _verifyLdapConfig = false; - - fields: Array = [...oidcFields, ...ldapValidatedFields, ...ldapNonValidatedFields]; - - timelineState = {}; - timelineError = {}; - - private usingIdmSettings = false; - private idmSettingType; - - constructor(private apiClient: APIClient, - private validationService: ValidationService) { - super(); - this.resetTimelineState(); - } - - private customizeForm() { - this.registerOnIpFamilyChange(IdentityField.ISSUER_URL, [], [], () => { - if (this.isUsingIdentityManagement) { - if (this.isIdentityManagementOidc) { - this.setOIDCValidators(); - } else if (this.isIdentityManagementLdap) { - this.setLDAPValidators(); - } - } - }); - this.formGroup.get(IdentityField.IDENTITY_TYPE).valueChanges.pipe( - distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), - takeUntil(this.unsubscribe) - ).subscribe(newIdentityManagementType => { - this.idmSettingType = newIdentityManagementType; - if (this.isUsingIdentityManagement) { - this.formGroup.markAsPending(); - if (this.isIdentityManagementOidc) { - this.unsetValidators(ldapValidatedFields); - this.setOIDCValidators(); - this.setControlValueSafely(IdentityField.CLIENT_SECRET, ''); - } else if (this.isIdentityManagementLdap) { - this.unsetValidators(oidcFields); - this.setLDAPValidators(); - } else { - this.unsetValidators(this.fields); - this.disarmField(IdentityField.IDENTITY_TYPE); - } - this.triggerStepDescriptionChange(); - } - }); - this.registerStepDescriptionTriggers({fields: [IdentityField.ENDPOINT_IP, IdentityField.ENDPOINT_PORT, IdentityField.ISSUER_URL]}); - } - - ngOnInit(): void { - super.ngOnInit(); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, IdentityStepMapping); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(IdentityStepMapping); - this.storeDefaultLabels(IdentityStepMapping); - this.registerDefaultFileImportedHandler(this.eventFileImported, IdentityStepMapping); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - - this.customizeForm(); - } - - protected onStepStarted() { - // these fields should have been restored during ngOnInit() - this.usingIdmSettings = this.getFieldValue(IdentityField.IDM_SETTINGS); - this.idmSettingType = this.getFieldValue(IdentityField.IDENTITY_TYPE); - if (!this.idmSettingType) { - // The type in use by default when user activated identity management is OIDC; - this.idmSettingType = IdentityManagementType.OIDC; - // setting the idm setting type should trigger the handler to set the oidc validators, etc. - this.setControlValueSafely(IdentityField.IDENTITY_TYPE, this.idmSettingType); - } - } - - setOIDCValidators() { - this.resurrectField(IdentityField.ISSUER_URL, [ - Validators.required, - this.validationService.noWhitespaceOnEnds(), - this.ipFamily === IpFamilyEnum.IPv4 ? - this.validationService.isValidIpOrFqdnWithHttpsProtocol() : this.validationService.isValidIpv6OrFqdnWithHttpsProtocol(), - this.validationService.isStringWithoutUrlFragment(), - this.validationService.isStringWithoutQueryParams(), - ], this.getStoredValue(IdentityField.ISSUER_URL, IdentityStepMapping, ''), this.quietly); - - this.resurrectField(IdentityField.CLIENT_ID, [ - Validators.required, - this.validationService.noWhitespaceOnEnds() - ], this.getStoredValue(IdentityField.CLIENT_ID, IdentityStepMapping, ''), this.quietly); - - this.resurrectField(IdentityField.CLIENT_SECRET, [ - Validators.required, - this.validationService.noWhitespaceOnEnds() - ], ''); - - this.resurrectField(IdentityField.SCOPES, [ - Validators.required, - this.validationService.noWhitespaceOnEnds(), - this.validationService.isCommaSeperatedList() - ], this.getStoredValue(IdentityField.SCOPES, IdentityStepMapping, ''), this.quietly); - - this.resurrectField(IdentityField.OIDC_GROUPS_CLAIM, [ - Validators.required - ], this.getStoredValue(IdentityField.OIDC_GROUPS_CLAIM, IdentityStepMapping, ''), this.quietly); - - this.resurrectField(IdentityField.OIDC_USERNAME_CLAIM, [ - Validators.required - ], this.getStoredValue(IdentityField.OIDC_USERNAME_CLAIM, IdentityStepMapping, ''), this.quietly); - } - - setLDAPValidators() { - this.resurrectField(IdentityField.ENDPOINT_IP, [ - Validators.required - ], this.getStoredValue(IdentityField.ENDPOINT_IP, IdentityStepMapping, ''), this.quietly); - - this.resurrectField(IdentityField.ENDPOINT_PORT, [ - Validators.required, - this.validationService.noWhitespaceOnEnds(), - this.ipFamily === IpFamilyEnum.IPv4 ? - this.validationService.isValidLdap(this.formGroup.get(IdentityField.ENDPOINT_IP)) : - this.validationService.isValidIpv6Ldap(this.formGroup.get(IdentityField.ENDPOINT_IP)) - ], this.getStoredValue(IdentityField.ENDPOINT_PORT, IdentityStepMapping, ''), this.quietly); - - this.resurrectField(IdentityField.BIND_PW, [], ''); - - this.resurrectField(IdentityField.USER_SEARCH_FILTER, [ - Validators.required - ], this.getStoredValue(IdentityField.USER_SEARCH_FILTER, IdentityStepMapping, ''), this.quietly); - - this.resurrectField(IdentityField.USER_SEARCH_USERNAME, [ - Validators.required - ], this.getStoredValue(IdentityField.USER_SEARCH_USERNAME, IdentityStepMapping, ''), this.quietly); - - this.resurrectField(IdentityField.GROUP_SEARCH_FILTER, [ - Validators.required - ], this.getStoredValue(IdentityField.GROUP_SEARCH_FILTER, IdentityStepMapping, ''), this.quietly); - - ldapNonValidatedFields.forEach(field => this.resurrectField( - field, [], this.getStoredValue(field, IdentityStepMapping, ''), this.quietly)); - } - - unsetValidators(fields: string[]) { - fields.forEach(field => this.disarmField(field)); - } - - toggleIdmSetting() { - this.usingIdmSettings = !this.usingIdmSettings; - if (this.usingIdmSettings) { - if (this.isIdentityManagementOidc) { - this.setOIDCValidators(); - this.setControlValueSafely(IdentityField.CLIENT_SECRET, ''); - } else if (this.isIdentityManagementLdap) { - this.setLDAPValidators(); - } else { - // The type in use by default when user activated identity management is OIDC; - this.idmSettingType = IdentityManagementType.OIDC; - // setting the idm setting type should trigger the handler to set the oidc validators, etc. - this.setControlValueSafely(IdentityField.IDENTITY_TYPE, this.idmSettingType); - } - } else { - this.unsetValidators(this.fields); - } - } - - /** - * @method ldapEndpointInputValidity return true if ldap endpoint inputs are valid - */ - ldapEndpointInputValidity(): boolean { - return this.formGroup.get(IdentityField.ENDPOINT_IP).valid && - this.formGroup.get(IdentityField.ENDPOINT_PORT).valid; - } - - resetTimelineState() { - LDAP_TESTS.forEach(t => { - this.timelineState[t] = NOT_STARTED; - this.timelineError[t] = null; - }) - } - - cropLdapConfig(): LdapParams { - const ldapParams: LdapParams = {}; - - Object.entries(LDAP_PARAMS).forEach(([k, v]) => { - if (this.formGroup.get(v)) { - ldapParams[k] = this.formGroup.get(v).value || ""; - } else { - console.log("Unable to find field: " + v); - } - }); - ldapParams.ldap_url = "ldaps://" + this.formGroup.get(IdentityField.ENDPOINT_IP).value + ':' + - this.formGroup.get(IdentityField.ENDPOINT_PORT).value; - - return ldapParams; - } - - formatError(err) { - if (err) { - const errMsg = err.error ? err.error.message : null; - return errMsg || err.message || JSON.stringify(err, null, 4); - } - return ""; - } - - async startVerifyLdapConfig() { - this.resetTimelineState(); - const params = this.cropLdapConfig(); - - console.log(JSON.stringify(params, null, 8)); - let result: LdapTestResult; - try { - this.timelineState[CONNECT] = PROCESSING; - result = await this.apiClient.verifyLdapConnect({ credentials: params }).toPromise(); - this.timelineState[CONNECT] = result && (result.code === TEST_SUCCESS ? SUCCESS : NOT_STARTED); - } catch (err) { - console.log(JSON.stringify(err, null, 8)); - this.timelineState[CONNECT] = ERROR; - this.timelineError[CONNECT] = this.formatError(err); - } - - try { - this.timelineState[BIND] = PROCESSING; - result = await this.apiClient.verifyLdapBind().toPromise(); - this.timelineState[BIND] = result && (result.code === TEST_SUCCESS ? SUCCESS : NOT_STARTED); ; - } catch (err) { - console.log(JSON.stringify(err, null, 8)); - this.timelineState[BIND] = ERROR; - this.timelineError[BIND] = this.formatError(err); - } - - try { - this.timelineState[USER_SEARCH] = PROCESSING; - result = await this.apiClient.verifyLdapUserSearch().toPromise(); - this.timelineState[USER_SEARCH] = result && (result.code === TEST_SUCCESS ? SUCCESS : NOT_STARTED); ; - } catch (err) { - console.log(JSON.stringify(err, null, 8)); - this.timelineState[USER_SEARCH] = ERROR; - this.timelineError[USER_SEARCH] = this.formatError(err); - } - - try { - this.timelineState[GROUP_SEARCH] = PROCESSING; - result = await this.apiClient.verifyLdapGroupSearch().toPromise(); - this.timelineState[GROUP_SEARCH] = result && (result.code === TEST_SUCCESS ? SUCCESS : NOT_STARTED); ; - } catch (err) { - console.log(JSON.stringify(err, null, 8)); - this.timelineState[GROUP_SEARCH] = ERROR; - this.timelineError[GROUP_SEARCH] = this.formatError(err); - } - - try { - this.timelineState[DISCONNECT] = PROCESSING; - await this.apiClient.verifyLdapCloseConnection().toPromise(); - this.timelineState[DISCONNECT] = SUCCESS; - } catch (err) { - console.log(JSON.stringify(err, null, 8)); - this.timelineState[DISCONNECT] = ERROR; - this.timelineError[DISCONNECT] = this.formatError(err); - } - } - - get verifyLdapConfig(): boolean { - return this._verifyLdapConfig; - } - - set verifyLdapConfig(vlc: boolean) { - this._verifyLdapConfig = vlc; - this.resetTimelineState(); - } - - dynamicDescription(): string { - const identityType = this.getFieldValue(IdentityField.IDENTITY_TYPE, true); - const ldapEndpointIp = this.getFieldValue(IdentityField.ENDPOINT_IP, true); - const ldapEndpointPort = this.getFieldValue(IdentityField.ENDPOINT_PORT, true); - const oidcIssuer = this.getFieldValue(IdentityField.ISSUER_URL, true); - - if (identityType === IdentityManagementType.OIDC && oidcIssuer) { - return 'OIDC configured: ' + oidcIssuer; - } else if (identityType === IdentityManagementType.LDAP && ldapEndpointIp) { - return 'LDAP configured: ' + ldapEndpointIp + ':' + (ldapEndpointPort ? ldapEndpointPort : ''); - } - return SharedIdentityStepComponent.description; - } - - protected storeUserData() { - this.storeUserDataFromMapping(IdentityStepMapping); - this.clearUnusedData(); - this.storeDefaultDisplayOrder(IdentityStepMapping); - } - - // At the END of the step, we clear from memory all the unused values. This will allow us to present a "clean" confirmation page, - // and also remove any lingering values in local storage that are no longer relevant - private clearUnusedData() { - if (!this.isUsingIdentityManagement) { - this.clearFieldSavedData(IdentityField.IDM_SETTINGS); // do not include IDM_SETTING 'no' in confirmation page - this.clearControlValue(IdentityField.IDENTITY_TYPE, true); - // NOTE: by clearing this setting the tests below will be true, and all the fields will be cleared - this.idmSettingType = null; - } - if (!this.isIdentityManagementOidc) { - oidcFields.forEach(field => this.clearControlValue(field, true)); - } - if (!this.isIdentityManagementLdap) { - [...ldapValidatedFields, ...ldapNonValidatedFields].forEach(field => this.clearControlValue(field, true)); - } - } - - get isIdentityManagementOidc(): boolean { - return this.idmSettingType === IdentityManagementType.OIDC; - } - - get isIdentityManagementLdap(): boolean { - return this.idmSettingType === IdentityManagementType.LDAP; - } - - get isUsingIdentityManagement(): boolean { - return this.usingIdmSettings; - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.fieldmapping.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.fieldmapping.ts deleted file mode 100644 index 0158fc299a..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/identity-step/identity-step.fieldmapping.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { StepMapping } from '../../../field-mapping/FieldMapping'; -import { IdentityManagementType } from '../../../constants/wizard.constants'; - -export enum IdentityField { - BIND_DN = 'bindDN', - BIND_PW = 'bindPW', - CLIENT_ID = 'clientId', - CLIENT_SECRET = 'clientSecret', - ENDPOINT_IP = 'endpointIp', - ENDPOINT_PORT = 'endpointPort', - GROUP_SEARCH_BASE_DN = 'groupSearchBaseDN', - GROUP_SEARCH_FILTER = 'groupSearchFilter', - GROUP_SEARCH_GROUP_ATTR = 'groupSearchGroupAttr', - GROUP_SEARCH_NAME_ATTR = 'groupSearchNameAttr', - GROUP_SEARCH_USER_ATTR = 'groupSearchUserAttr', - IDENTITY_TYPE = 'identityType', - IDM_SETTINGS = 'idmSettings', - ISSUER_URL = 'issuerURL', - LDAP_ROOT_CA = 'ldapRootCAData', - OIDC_GROUPS_CLAIM = 'oidcGroupsClaim', - OIDC_USERNAME_CLAIM = 'oidcUsernameClaim', - SCOPES = 'scopes', - TEST_GROUP_NAME = 'testGroupName', - TEST_USER_NAME = 'testUserName', - USER_SEARCH_BASE_DN = 'userSearchBaseDN', - USER_SEARCH_FILTER = 'userSearchFilter', - USER_SEARCH_USERNAME = 'userSearchUsername', -} - -export const IdentityStepMapping: StepMapping = { - fieldMappings: [ - { name: IdentityField.IDM_SETTINGS, isBoolean: true, defaultValue: false, label: 'ACTIVATE IDENTITY MANAGEMENT SETTINGS' }, - { name: IdentityField.IDENTITY_TYPE, defaultValue: IdentityManagementType.OIDC, label: 'IDENTITY PROVIDER TYPE' }, - { name: IdentityField.ISSUER_URL, label: 'ISSUER URL' }, - { name: IdentityField.CLIENT_ID, label: 'CLIENT ID' }, - { name: IdentityField.CLIENT_SECRET, mask: true, label: 'CLIENT SECRET' }, - { name: IdentityField.SCOPES, label: 'SCOPES' }, - { name: IdentityField.OIDC_USERNAME_CLAIM, label: 'USERNAME CLAIM' }, - { name: IdentityField.OIDC_GROUPS_CLAIM , label: 'GROUPS CLAIM' }, - { name: IdentityField.ENDPOINT_IP, label: 'LDAPS ENDPOINT' }, - { name: IdentityField.ENDPOINT_PORT , label: 'LDAPS ENDPOINT PORT' }, - { name: IdentityField.BIND_DN, label: 'BIND DN (OPTIONAL)' }, - { name: IdentityField.BIND_PW, mask: true, label: 'BIND PASSWORD (OPTIONAL)' }, - { name: IdentityField.USER_SEARCH_BASE_DN, label: 'BASE DN (OPTIONAL)' }, - { name: IdentityField.USER_SEARCH_FILTER, label: 'FILTER' }, - { name: IdentityField.USER_SEARCH_USERNAME, label: 'USERNAME' }, - { name: IdentityField.GROUP_SEARCH_BASE_DN, label: 'BASE DN (OPTIONAL)' }, - { name: IdentityField.GROUP_SEARCH_FILTER, label: 'FILTER' }, - { name: IdentityField.GROUP_SEARCH_NAME_ATTR, label: 'NAME ATTRIBUTE (OPTIONAL)' }, - { name: IdentityField.GROUP_SEARCH_USER_ATTR, label: 'USER ATTRIBUTE (OPTIONAL)' }, - { name: IdentityField.GROUP_SEARCH_GROUP_ATTR, label: 'GROUP ATTRIBUTE (OPTIONAL)' }, - { name: IdentityField.LDAP_ROOT_CA, label: 'ROOT CA (OPTIONAL)' }, - { name: IdentityField.TEST_USER_NAME, label: 'TEST USER NAME (OPTIONAL)' }, - { name: IdentityField.TEST_GROUP_NAME, label: 'TEST GROUP NAME (OPTIONAL)' }, - ] -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.html b/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.html deleted file mode 100644 index 0281de9737..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.html +++ /dev/null @@ -1,413 +0,0 @@ -
- - -

- {{ loadBalancerLabel }} -

- -
-
- - - - - - - Controller host address cannot be empty - - - Enter a valid IP address or FQDN - - -
- -
- - - - - - - Username cannot be empty - - -
- -
- - - - - - - Password cannot be empty - - -
-
- -
-
- > - - - - - Controller certificate authority is required - -
-
- -
-
- -
-
- -
-
- - - - - - - - - Selecting a cloud name is required - -
-
- -
-
-
-
Workload Cluster
-
-
-
-
- - - - - - - - - Selecting a workload cluster service engine group name is required - -
-
- -
-
- > - - - - - - - - Selecting a data plane VIP network name is required - -
- -
- - - - - - - - - Selecting a data plane VIP network CIDR is required - -
-
- -
-
- > - - - - - - - - Selecting a control plane VIP network name is required - -
- -
- - - - - - - - - Selecting a control plane VIP network CIDR is required - -
-
-
-
-
-
-
- -
-
-
-
Management Cluster
-
-
-
-
- - - - - - - - - Selecting a management cluster service engine group name is required - -
-
-
-
- - - - - - - - Selecting a VIP Network Name is required - - -
- -
- - - - - - - - - Selecting a Data Plane VIP Network CIDR is required - - -
-
- -
-
- - - - - - - - Selecting a Control Plane VIP Network Name is required - - -
- -
- - - - - - - - - Selecting a Control Plane VIP Network CIDR is required - - -
-
-
-
-
-
-
- -
-
- -
-
-
diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.scss b/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.scss deleted file mode 100644 index a91fd15608..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.scss +++ /dev/null @@ -1,25 +0,0 @@ -.label-container { - margin-left: 0; -} - -.btn-label { - margin-left: 1rem; -} - -.btn-delete { - border: none; -} - -.label-input { - margin-top: .1rem; - margin-bottom: 24px; -} - -.clr-textarea { - width: 500px; - height: 120px; -} - -.err-label { - max-width: 175px; -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.spec.ts deleted file mode 100644 index 97d84498c3..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.spec.ts +++ /dev/null @@ -1,69 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormArray, FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; -// App imports -import { APIClient } from '../../../../../../../swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { Messenger } from 'src/app/shared/service/Messenger'; -import { SharedLoadBalancerStepComponent } from './load-balancer-step.component'; -import { SharedModule } from '../../../../../../../shared/shared.module'; -import { ValidationService } from '../../../validation/validation.service'; - -describe('SharedLoadBalancerStepComponent', () => { - let component: SharedLoadBalancerStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule, - BrowserAnimationsModule - ], - providers: [ - ValidationService, - FormBuilder, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [SharedLoadBalancerStepComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - - const fb = new FormBuilder(); - fixture = TestBed.createComponent(SharedLoadBalancerStepComponent); - component = fixture.componentInstance; - component.formGroup = fb.group({}); - - fixture.detectChanges(); - }); - - it('should initialize tkgLabelsConfig', () => { - component.ngOnInit(); - const config = component.tkgLabelsConfig; - - expect(config.label.title).toEqual('CLUSTER LABELS (OPTIONAL)'); - expect(config.forms.parent.get('clusterLabels')).toBeInstanceOf(FormArray); - expect(config.fields.clusterTypeDescriptor).toEqual('Workload'); - }) - - it('should call get clouds when controller credentials have been validated', () => { - const apiSpy = spyOn(component['apiClient'], 'getAviClouds').and.callThrough(); - component.getClouds(); - expect(apiSpy).toHaveBeenCalled(); - }); - - it('should call get service engine groups when controller credentials have been validated', () => { - const apiSpy = spyOn(component['apiClient'], 'getAviServiceEngineGroups').and.callThrough(); - component.getServiceEngineGroups(); - expect(apiSpy).toHaveBeenCalled(); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.ts deleted file mode 100644 index 02c5ad6cd5..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.component.ts +++ /dev/null @@ -1,417 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { FormArray, Validators } from '@angular/forms'; -import { ClrLoadingState } from "@clr/angular"; -// Third party imports -import { debounceTime, distinctUntilChanged, finalize, takeUntil } from 'rxjs/operators'; -import { IpFamilyEnum } from 'src/app/shared/constants/app.constants'; -import { AviCloud } from "src/app/swagger/models/avi-cloud.model"; -import { AviServiceEngineGroup } from "src/app/swagger/models/avi-service-engine-group.model"; -import AppServices from '../../../../../../../shared/service/appServices'; -// App imports -import { APIClient } from "../../../../../../../swagger"; -import { StepMapping } from '../../../field-mapping/FieldMapping'; -import { StepFormDirective } from "../../../step-form/step-form"; -import { ValidationService } from "../../../validation/validation.service"; -import { TKGLabelsConfig } from '../../widgets/tkg-labels/interfaces/tkg-labels.interface'; -import { AviVipNetwork } from '../../../../../../../swagger/models/avi-vip-network.model'; -import { LoadBalancerField, LoadBalancerStepMapping } from './load-balancer-step.fieldmapping'; - -const SupervisedFields = [ - LoadBalancerField.CONTROLLER_HOST, - LoadBalancerField.USERNAME, - LoadBalancerField.PASSWORD, - LoadBalancerField.CONTROLLER_CERT -]; - -@Component({ - selector: 'app-load-balancer-step', - templateUrl: './load-balancer-step.component.html', - styleUrls: ['./load-balancer-step.component.scss'] -}) -export class SharedLoadBalancerStepComponent extends StepFormDirective implements OnInit { - - loadingState: ClrLoadingState = ClrLoadingState.DEFAULT; - connected: boolean = false; - clouds: Array; - selectedCloud: AviCloud; - selectedCloudName: string; - serviceEngineGroups: Array; - serviceEngineGroupsFiltered: Array; - vipNetworks: Array = []; - selectedNetworkName: string; - selectedManagementClusterNetworkName: string; - loadBalancerLabel = 'Load Balancer Settings'; - tkgLabelsConfig: TKGLabelsConfig; - - private stepMapping: StepMapping; - - constructor(private validationService: ValidationService, - private apiClient: APIClient) { - super(); - } - - /** - * This is to make sense that the list returned is always up to date. - */ - get vipNetworksPerCloud() { - if (this.vipNetworks && this.vipNetworks.length > 0 && this.selectedCloud) { - return this.vipNetworks.filter(net => net.cloud === this.selectedCloud.uuid); - } - return []; - } - - /** - * This is to make sense that the list returned is always up to date. - */ - get subnetsPerNetwork() { - return this.getSubnets(this.selectedNetworkName); - } - - /** - * This is to make sense that the list returned is always up to date. - */ - get subnetsPerManagementNetwork() { - return this.getSubnets(this.selectedManagementClusterNetworkName); - } - - ngOnInit() { - super.ngOnInit(); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, this.supplyStepMapping()); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(this.supplyStepMapping()); - this.storeDefaultLabels(this.supplyStepMapping()); - this.registerDefaultFileImportedHandler(this.eventFileImported, this.supplyStepMapping()); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - - this.customizeForm(); - - this.tkgLabelsConfig = { - label: { - title: this.htmlFieldLabels['clusterLabels'], - tooltipText: `By default, all clusters will have NSX Advanced Load Balancer enabled. Here you may - optionally specify cluster labels to identify a subset of clusters that should have - NSX Advanced Load Balancer enabled. Note: Ensure that these labels are present on - individual clusters that should be enabled with NSX Advanced Load Balancer.`, - helperText: `By default, all clusters will have NSX Advanced Load Balancer enabled. Here you may optionally - specify cluster labels to identify a subset of clusters that should have NSX Advanced Load Balancer - enabled.` - }, - forms: { - parent: this.formGroup, - control: this.formGroup.get('clusterLabels') as FormArray - }, - fields: { - clusterTypeDescriptor: 'Workload', - fieldMapping: LoadBalancerStepMapping.fieldMappings.find((m) => m.name === LoadBalancerField.CLUSTER_LABELS) - } - }; - } - - /** - * @method connectLB - * helper method to make connection to AVI LB controller, call getClouds and - * getSvcEngineGroups methods if AVI LB controller connection successful - */ - connectLB() { - this.loadingState = ClrLoadingState.LOADING; - - this.apiClient.verifyAccount({ - credentials: { - username: this.formGroup.controls[LoadBalancerField.USERNAME].value, - password: this.formGroup.controls[LoadBalancerField.PASSWORD].value, - host: this.formGroup.controls[LoadBalancerField.CONTROLLER_HOST].value, - tenant: this.formGroup.controls[LoadBalancerField.USERNAME].value, - CAData: this.formGroup.controls[LoadBalancerField.CONTROLLER_CERT].value - } - }) - .pipe( - finalize(() => this.loadingState = ClrLoadingState.DEFAULT), - takeUntil(this.unsubscribe)) - .subscribe( - ((res) => { - this.errorNotification = ''; - this.connected = true; - - this.getClouds(); - this.getServiceEngineGroups(); - this.getVipNetworks(); - - // If connection successful, toggle validators ON - this.toggleValidators(true); - }), - ((err) => { - const error = err.error.message || err.message || JSON.stringify(err); - if (error.indexOf('Invalid credentials') >= 0) { - this.errorNotification = `Invalid credentials: check your username and password`; - } else if (error.indexOf('Rest request error, returning to caller') >= 0) { - this.errorNotification = `Invalid Controller Certificate Authority: check the validity of the certificate`; - } else { - this.errorNotification = `Failed to connect to the specified Avi load balancer controller. ${error}`; - } - }) - ); - } - - /** - * @method getClouds - * helper method calls API to get list of clouds - */ - getClouds() { - this.apiClient.getAviClouds() - .pipe(takeUntil(this.unsubscribe)) - .subscribe( - ((res) => { - this.errorNotification = ''; - this.clouds = res; - }), - ((err) => { - const error = err.error.message || err.message || JSON.stringify(err); - this.errorNotification = - `Failed to retrieve Avi load balancer clouds list. ${error}`; - }) - ); - } - - /** - * @method getServiceEngineGroups - * helper method calls API to get list of service engine groups - */ - getServiceEngineGroups() { - this.apiClient.getAviServiceEngineGroups() - .pipe(takeUntil(this.unsubscribe)) - .subscribe( - ((res) => { - this.errorNotification = ''; - this.serviceEngineGroups = res; - // refreshes service engine group list which may not have been loaded at time of cloud selection - this.onSelectCloud(this.selectedCloudName); - }), - ((err) => { - const error = err.error.message || err.message || JSON.stringify(err); - this.errorNotification = - `Failed to retrieve Avi load balancer service engine groups list. ${error}`; - }) - ); - } - - /** - * @method getServiceEngineGroups - * helper method calls API to get list of service engine groups - */ - getVipNetworks() { - this.apiClient.getAviVipNetworks() - .pipe(takeUntil(this.unsubscribe)) - .subscribe( - ((res) => { - this.errorNotification = ''; - this.vipNetworks = res; - }), - ((err) => { - const error = err.error.message || err.message || JSON.stringify(err); - this.errorNotification = - `Failed to retrieve Avi VIP networks. ${error}`; - }) - ); - } - - /** - * @method onSelectCloud - * @param cloudName - name of selected cloud - * helper method sets selected cloud object based on cloud 'name' returned from dropdown; then - * filters list of service engine groups where the cloud uuid matches in 'location' - */ - onSelectCloud(cloudName: string) { - this.serviceEngineGroupsFiltered = []; - - if (cloudName && this.clouds) { - this.selectedCloud = this.clouds.find((cloud: AviCloud) => { - return cloud.name === cloudName; - }); - if (this.selectedCloud) { - this.serviceEngineGroupsFiltered = this.serviceEngineGroups.filter((group: AviServiceEngineGroup) => { - return group.location.includes(this.selectedCloud.uuid); - }); - } - } - } - - /** - * Default a value to management cluster service engine group name, if not set. - */ - onSelectWorkloadClusterServiceEngineGroupName(serviceEngineGroupName: string): void { - if (!this.formGroup.get(LoadBalancerField.MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP_NAME).value) { - this.formGroup.get(LoadBalancerField.MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP_NAME).setValue(serviceEngineGroupName) - } - } - - /** - * Return all the configured subnets for the selected vip network. - */ - onSelectVipNetwork(networkName: string): void { - this.selectedNetworkName = networkName; - if (!this.formGroup.get(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_NAME).value) { - this.formGroup.get(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_NAME).setValue(networkName) - } - if (!this.formGroup.get(LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME).value) { - this.formGroup.get(LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME).setValue(networkName) - } - if (!this.formGroup.get(LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME).value) { - this.formGroup.get(LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME).setValue(networkName) - } - } - - onSelectVipCIDR(cidr: string): void { - if (!this.formGroup.get(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_CIDR).value) { - this.formGroup.get(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_CIDR).setValue(cidr); - } - if (!this.formGroup.get(LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR).value) { - this.formGroup.get(LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR).setValue(cidr); - } - if (!this.formGroup.get(LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR).value) { - this.formGroup.get(LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR).setValue(cidr); - } - } - - onSelectManagementNetwork(networkName: string): void { - this.selectedManagementClusterNetworkName = networkName; - } - - /** - * @method toggleValidators - * @param validate - boolean if true activates all fields and sets their validators; if false - * disarms fields and clears validators - */ - toggleValidators(validate: boolean) { - if (validate === true) { - this.resurrectField(LoadBalancerField.CLOUD_NAME, [Validators.required], - this.getStoredValue(LoadBalancerField.CLOUD_NAME, this.supplyStepMapping(), '')); - this.resurrectField(LoadBalancerField.SERVICE_ENGINE_GROUP_NAME, [Validators.required], - this.getStoredValue(LoadBalancerField.SERVICE_ENGINE_GROUP_NAME, this.supplyStepMapping(), '')); - this.resurrectField(LoadBalancerField.NETWORK_NAME, [Validators.required], - this.getStoredValue(LoadBalancerField.NETWORK_NAME, this.supplyStepMapping(), '')); - this.resurrectField(LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME, [Validators.required], - this.getStoredValue(LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME, this.supplyStepMapping(), '')); - this.resurrectField(LoadBalancerField.NETWORK_CIDR, [ - Validators.required, - this.validationService.noWhitespaceOnEnds(), - this.ipFamily === IpFamilyEnum.IPv4 ? - this.validationService.isValidIpNetworkSegment() : this.validationService.isValidIpv6NetworkSegment() - ], this.getStoredValue(LoadBalancerField.NETWORK_CIDR, this.supplyStepMapping(), '')); - this.resurrectField(LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR, [ - Validators.required, - this.validationService.noWhitespaceOnEnds(), - this.ipFamily === IpFamilyEnum.IPv4 ? - this.validationService.isValidIpNetworkSegment() : this.validationService.isValidIpv6NetworkSegment() - ], this.getStoredValue(LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR, this.supplyStepMapping(), '')); - - this.resurrectField(LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME, [Validators.required], - this.getStoredValue(LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME, this.supplyStepMapping(), '')); - this.resurrectField(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_NAME, [Validators.required], - this.getStoredValue(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_NAME, this.supplyStepMapping(), '')); - this.resurrectField(LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR, [ - Validators.required, - this.validationService.noWhitespaceOnEnds(), - this.ipFamily === IpFamilyEnum.IPv4 ? - this.validationService.isValidIpNetworkSegment() : this.validationService.isValidIpv6NetworkSegment() - ], this.getStoredValue(LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR, this.supplyStepMapping(), '')); - this.resurrectField(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_CIDR, [ - Validators.required, - this.validationService.noWhitespaceOnEnds(), - this.ipFamily === IpFamilyEnum.IPv4 ? - this.validationService.isValidIpNetworkSegment() : this.validationService.isValidIpv6NetworkSegment() - ], this.getStoredValue(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_CIDR, this.supplyStepMapping(), '')); - } else { - this.disarmField(LoadBalancerField.CLOUD_NAME, true); - this.disarmField(LoadBalancerField.SERVICE_ENGINE_GROUP_NAME, true); - this.disarmField(LoadBalancerField.MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP_NAME, true); - this.disarmField(LoadBalancerField.NETWORK_NAME, true); - this.disarmField(LoadBalancerField.NETWORK_CIDR, true); - this.disarmField(LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME, true); - this.disarmField(LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR, true); - this.disarmField(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_NAME, true); - this.disarmField(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_CIDR, true); - this.disarmField(LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME, true); - this.disarmField(LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR, true); - } - } - - /** - * @method getDisabled - * helper method to get if connect btn should be disabled - */ - getDisabled(): boolean { - return ( - SupervisedFields.some(f => !this.formGroup.get(f).value) || - SupervisedFields.some(f => !this.formGroup.get(f).valid) - ) - } - - getSubnets(networkName: string): any[] { - if (!this.isEmptyArray(this.vipNetworksPerCloud) && networkName) { - const temp = this.vipNetworksPerCloud - .find(net => net.name === networkName); - - if (temp && !this.isEmptyArray(temp.configedSubnets)) { - return temp.configedSubnets - .filter(subnet => subnet.family === "V4"); // Only V4 are supported in Calgary 1. - } - } - return []; - } - - protected customizeForm() { - SupervisedFields.forEach(field => { - this.formGroup.get(field).valueChanges - .pipe( - debounceTime(500), - distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), - takeUntil(this.unsubscribe) - ) - .subscribe(() => { - if (this.connected) { - this.connected = false; - this.clouds = []; - this.serviceEngineGroups = []; - - // If connection cleared, toggle validators OFF - this.toggleValidators(false); - } - }); - }); - - this.formGroup.get(LoadBalancerField.CLOUD_NAME).valueChanges.pipe( - distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), - takeUntil(this.unsubscribe) - ).subscribe((cloud) => { - this.selectedCloudName = cloud; - this.onSelectCloud(this.selectedCloudName); - }); - - this.registerOnValueChange(LoadBalancerField.NETWORK_NAME, this.onSelectVipNetwork.bind(this)); - this.registerOnValueChange(LoadBalancerField.NETWORK_CIDR, this.onSelectVipCIDR.bind(this)); - this.registerOnValueChange(LoadBalancerField.SERVICE_ENGINE_GROUP_NAME, - this.onSelectWorkloadClusterServiceEngineGroupName.bind(this)); - this.registerOnValueChange(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_NAME, this.onSelectManagementNetwork.bind(this)); - this.registerOnIpFamilyChange(LoadBalancerField.NETWORK_CIDR, [], []); - this.registerOnIpFamilyChange(LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_CIDR, [ - this.validationService.isValidIpNetworkSegment()], [ - this.validationService.isValidIpv6NetworkSegment() - ]); - } - - protected storeUserData() { - this.storeUserDataFromMapping(this.supplyStepMapping()); - this.storeDefaultDisplayOrder(this.supplyStepMapping()); - } - - private supplyStepMapping(): StepMapping { - if (!this.stepMapping) { - this.stepMapping = this.createStepMapping(); - } - return this.stepMapping; - } - - private createStepMapping(): StepMapping { - return LoadBalancerStepMapping; - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.fieldmapping.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.fieldmapping.ts deleted file mode 100644 index 0a0181c4c2..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/load-balancer/load-balancer-step.fieldmapping.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { ControlType, StepMapping } from '../../../field-mapping/FieldMapping'; -import { SimpleValidator } from '../../../constants/validation.constants'; - -export enum LoadBalancerField { - CLOUD_NAME = 'cloudName', - CLUSTER_LABELS = 'clusterLabels', - CONTROLLER_CERT = 'controllerCert', - CONTROLLER_HOST = 'controllerHost', - MANAGEMENT_CLUSTER_NETWORK_CIDR = 'managementClusterNetworkCIDR', - MANAGEMENT_CLUSTER_NETWORK_NAME = 'managementClusterNetworkName', - NETWORK_CIDR = 'networkCIDR', - NETWORK_NAME = 'networkName', - - MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP_NAME = 'managementClusterServiceEngineGroupName', - MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME = 'managementClusterControlPlaneVipNetworkName', - MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR = 'managementClusterControlPlaneVipNetworkCIDR', - - WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME = 'workloadClusterControlPlaneVipNetworkName', - WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR = 'workloadClusterControlPlaneVipNetworkCIDR', - - NEW_LABEL_KEY = 'newLabelKey', - NEW_LABEL_VALUE = 'newLabelValue', - PASSWORD = 'password', - SERVICE_ENGINE_GROUP_NAME = 'serviceEngineGroupName', - USERNAME = 'username', -} - -export const LoadBalancerStepMapping: StepMapping = { - fieldMappings: [ - { - name: LoadBalancerField.CONTROLLER_HOST, - validators: [SimpleValidator.IS_VALID_FQDN_OR_IP], - label: 'CONTROLLER HOST' - }, - {name: LoadBalancerField.USERNAME, label: 'USERNAME'}, - {name: LoadBalancerField.PASSWORD, mask: true, label: 'PASSWORD'}, - {name: LoadBalancerField.CONTROLLER_CERT, doNotAutoSave: true, label: 'CONTROLLER CERTIFICATE AUTHORITY'}, - {name: LoadBalancerField.CLOUD_NAME, label: 'CLOUD NAME'}, - {name: LoadBalancerField.SERVICE_ENGINE_GROUP_NAME, label: 'SERVICE ENGINE GROUP NAME'}, - {name: LoadBalancerField.NETWORK_NAME, label: 'WORKLOAD CLUSTER - DATA PLANE VIP NETWORK NAME'}, - {name: LoadBalancerField.NETWORK_CIDR, label: 'WORKLOAD CLUSTER - DATA PLANE VIP NETWORK CIDR'}, - { - name: LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME, - label: 'WORKLOAD CLUSTER - CONTROL PLANE VIP NETWORK NAME' - }, - { - name: LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR, - label: 'WORKLOAD CLUSTER - CONTROL PLANE VIP NETWORK CIDR' - }, - { - name: LoadBalancerField.MANAGEMENT_CLUSTER_SERVICE_ENGINE_GROUP_NAME, - label: 'MANAGEMENT CLUSTER - SERVICE ENGINE GROUP NAME' - }, - { - name: LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_NAME, - label: 'MANAGEMENT CLUSTER - DATA PLANE VIP NETWORK NAME'}, - { - name: LoadBalancerField.MANAGEMENT_CLUSTER_NETWORK_CIDR, - label: 'MANAGEMENT CLUSTER - DATA PLANE VIP NETWORK CIDR' - }, - { - name: LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME, - label: 'MANAGEMENT CLUSTER - CONTROL PLANE VIP NETWORK NAME' - }, - { - name: LoadBalancerField.MANAGEMENT_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR, - label: 'MANAGEMENT CLUSTER - CONTROL PLANE VIP NETWORK CIDR' - }, - { - name: LoadBalancerField.CLUSTER_LABELS, - label: 'CLUSTER LABELS (OPTIONAL)', - controlType: ControlType.FormArray, - displayFunction: labels => labels.filter(label => label.key).map(label => `${label.key} : ${label.value}`).join(', '), - children: [ - { - name: 'key', - defaultValue: '', - controlType: ControlType.FormControl, - validators: [ - SimpleValidator.IS_VALID_LABEL_OR_ANNOTATION, - SimpleValidator.RX_UNIQUE, - SimpleValidator.RX_REQUIRED_IF_VALUE - ] - }, - { - name: 'value', - defaultValue: '', - controlType: ControlType.FormControl, - validators: [SimpleValidator.IS_VALID_LABEL_OR_ANNOTATION, SimpleValidator.RX_REQUIRED_IF_KEY] - } - ] - } - ] -}; diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.html b/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.html deleted file mode 100644 index 8f66db7049..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.html +++ /dev/null @@ -1,93 +0,0 @@ -
- - -

- Optional Metadata -

- -
-
- - - - - - - {{ clusterTypeDescriptorTitleCase }} Cluster Location must start and end with an alphanumeric - character, and can contain only - letters, numbers, hyphens, underscores, and dots. - - - {{ clusterTypeDescriptorTitleCase }} Cluster Location must not include whitespace on ends. - - - {{ clusterTypeDescriptorTitleCase }} Cluster Location max length is 63 characters. - - -
-
-
-
-
- -
-
- -
- {{ clusterTypeDescriptorTitleCase }} Cluster Description must start and end with a letter, - and can contain only - lowercase letters, numbers, and hyphens. It must not include whitespace on ends. It has - a max length of 63 characters. -
-
-
-
-
-
-
-
- -
-
-
diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.scss b/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.scss deleted file mode 100644 index 44a909b514..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.scss +++ /dev/null @@ -1,21 +0,0 @@ -.label-container { - margin-left: 0; -} - -.btn-delete { - border: none; -} - -.label-input { - margin-top: .1rem; - margin-bottom: 24px; -} - -.clr-textarea { - width: 500px; - height: 120px; -} - -.err-label { - max-width: 175px; -} \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.spec.ts deleted file mode 100644 index 6543c08315..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.spec.ts +++ /dev/null @@ -1,88 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormArray, FormBuilder, ReactiveFormsModule } from '@angular/forms'; -// App imports -import { APIClient } from '../../../../../../../swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { MetadataStepComponent } from './metadata-step.component'; -import { SharedModule } from '../../../../../../../shared/shared.module'; -import { ValidationService } from '../../../validation/validation.service'; -import { WizardForm } from '../../../constants/wizard.constants'; -import { MetadataField } from './metadata-step.fieldmapping'; - -describe('MetadataStepComponent', () => { - let component: MetadataStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - ValidationService, - FormBuilder, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [MetadataStepComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - fixture = TestBed.createComponent(MetadataStepComponent); - component = fixture.componentInstance; - // NOTE: using Azure file import events just for testing - component.setStepRegistrantData({ - wizard: 'BozoWizard', step: WizardForm.METADATA, formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.AZURE_CONFIG_FILE_IMPORTED, - eventFileImportError: TanzuEventType.AZURE_CONFIG_FILE_IMPORT_ERROR - }); - - component.ngOnInit(); - - fixture.detectChanges(); - }); - - it('should initialize tkgLabelsConfig', () => { - component.setClusterTypeDescriptor('Management'); - component.ngOnInit(); - const config = component.tkgLabelsConfig; - - expect(config.label.title).toEqual('LABELS (OPTIONAL)'); - expect(config.forms.parent.get('clusterLabels')).toBeInstanceOf(FormArray); - expect(config.fields.clusterTypeDescriptor).toEqual('Management'); - }) - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - const locationControl = component.formGroup.controls[MetadataField.CLUSTER_LOCATION]; - - component.setClusterTypeDescriptor('CLOWN'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.METADATA, - description: 'Specify metadata for the CLOWN cluster' - } - }); - - locationControl.setValue('UZBEKISTAN'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.METADATA, - description: 'Location: UZBEKISTAN' - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.ts deleted file mode 100644 index fcc840c676..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.component.ts +++ /dev/null @@ -1,63 +0,0 @@ -// Angular imports -import { Component, OnInit } from '@angular/core'; -import { FormArray } from '@angular/forms'; -// App imports -import AppServices from '../../../../../../../shared/service/appServices'; -import { StepMapping } from '../../../field-mapping/FieldMapping'; -import { StepFormDirective } from '../../../step-form/step-form'; -import { TKGLabelsConfig } from '../../widgets/tkg-labels/interfaces/tkg-labels.interface'; -import { MetadataField, MetadataStepMapping } from './metadata-step.fieldmapping'; - -@Component({ - selector: 'app-metadata-step', - templateUrl: './metadata-step.component.html', - styleUrls: ['./metadata-step.component.scss'] -}) -export class MetadataStepComponent extends StepFormDirective implements OnInit { - tkgLabelsConfig: TKGLabelsConfig; - - constructor() { - super(); - } - - ngOnInit() { - super.ngOnInit(); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, MetadataStepMapping); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(MetadataStepMapping); - this.storeDefaultLabels(MetadataStepMapping); - this.registerStepDescriptionTriggers({ - fields: [MetadataField.CLUSTER_LOCATION], - clusterTypeDescriptor: true - }); - this.registerDefaultFileImportedHandler(this.eventFileImported, MetadataStepMapping); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - - this.tkgLabelsConfig = { - label: { - title: this.htmlFieldLabels['clusterLabels'], - tooltipText: `Optionally specify labels for the ${this.clusterTypeDescriptor} cluster.` - }, - forms: { - parent: this.formGroup, - control: this.formGroup.get('clusterLabels') as FormArray - }, - fields: { - clusterTypeDescriptor: this.clusterTypeDescriptorTitleCase, - fieldMapping: MetadataStepMapping.fieldMappings.find((m) => m.name === MetadataField.CLUSTER_LABELS) - } - }; - } - - dynamicDescription(): string { - const clusterLocation = this.getFieldValue(MetadataField.CLUSTER_LOCATION, true); - return clusterLocation - ? `Location: ${clusterLocation}` - : `Specify metadata for the ${this.clusterTypeDescriptor} cluster`; - } - - protected storeUserData() { - this.storeUserDataFromMapping(MetadataStepMapping); - this.storeDefaultDisplayOrder(MetadataStepMapping); - } - -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.fieldmapping.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.fieldmapping.ts deleted file mode 100644 index b9bb100b77..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/metadata-step/metadata-step.fieldmapping.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { ControlType, StepMapping } from '../../../field-mapping/FieldMapping'; -import { SimpleValidator } from '../../../constants/validation.constants'; - -export enum MetadataField { - CLUSTER_LABELS = 'clusterLabels', - CLUSTER_DESCRIPTION = 'clusterDescription', - CLUSTER_LOCATION = 'clusterLocation', -} - -export const MetadataStepMapping: StepMapping = { - fieldMappings: [ - { - name: MetadataField.CLUSTER_LOCATION, - validators: [SimpleValidator.IS_VALID_LABEL_OR_ANNOTATION], - label: 'LOCATION (OPTIONAL)' - }, - { - name: MetadataField.CLUSTER_DESCRIPTION, - validators: [SimpleValidator.IS_VALID_LABEL_OR_ANNOTATION], - label: 'DESCRIPTION (OPTIONAL)' - }, - { - name: MetadataField.CLUSTER_LABELS, - label: 'LABELS (OPTIONAL)', - controlType: ControlType.FormArray, - displayFunction: labels => labels.filter(label => label.key).map(label => `${label.key} : ${label.value}`).join(', '), - children: [ - { - name: 'key', - defaultValue: '', - controlType: ControlType.FormControl, - validators: [ - SimpleValidator.IS_VALID_LABEL_OR_ANNOTATION, - SimpleValidator.RX_UNIQUE, - SimpleValidator.RX_REQUIRED_IF_VALUE - ] - }, - { - name: 'value', - defaultValue: '', - controlType: ControlType.FormControl, - validators: [SimpleValidator.IS_VALID_LABEL_OR_ANNOTATION, SimpleValidator.RX_REQUIRED_IF_KEY] - } - ] - } - ] -}; diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.html b/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.html deleted file mode 100644 index 25d309adc6..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.html +++ /dev/null @@ -1,299 +0,0 @@ -
- -

- Kubernetes Network Settings -

- - - - - - -
- CNI Provider: {{getCniTypeLabel()}} -
-
-
- - - - - - Selecting a VM network is required - -
-
- - - - - - - Cluster Service CIDR cannot be empty - - - Cluster Service CIDR format is invalid - - - Cluster Service CIDR must be unique - - -
-
- - - - - - - Cluster POD CIDR cannot be empty - - - Cluster POD CIDR format is invalid - - -
-
-

- Proxy Settings -

-
-
- - - - - - - - -
-
- -
-
- - - - - - - Http proxy url cannot be empty - - - http:// prefix is missing - - -
-
-
-
- - - - - - -
-
- - - - - - -
-
-
-
-
- - - - -
-
-
-
-
- - - - - - - Https proxy url cannot be empty - - - http:// or https:// prefix is missing - - -
-
-
-
- - - - - - -
-
- - - - - - -
-
-
-
- - - - - -
FULL NO PROXY LIST
- {{fullNoProxy}} -
-
-
-
-
-
diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.scss b/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.scss deleted file mode 100644 index f49d57dd0e..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.scss +++ /dev/null @@ -1,33 +0,0 @@ -.sub-title { - padding-top: 35px; -} -.checkbox-wrapper { - padding-top: 20px; -} - -.word-break { - word-break: break-all; - width: 265px; - input { - width: 100%; - } -} -.title { - font-size: 13px; - font-weight: bold; - padding: 5px 0; -} -button.reset { - background: none; - border: none; - padding: 0; - font: inherit; - cursor: pointer; -} -.helper-container { - overflow-wrap: break-word; - max-width: 450px; -} -.noproxy-field { - max-width: 450px; -} \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.spec.ts deleted file mode 100644 index fd99e2963c..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.spec.ts +++ /dev/null @@ -1,128 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -// App imports -import { APIClient } from 'src/app/swagger/api-client.service'; -import AppServices from 'src/app/shared/service/appServices'; -import { FieldMapUtilities } from '../../../field-mapping/FieldMapUtilities'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { NetworkField } from './network-step.fieldmapping'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { SharedNetworkStepComponent } from "./network-step.component"; -import { ValidationService } from '../../../validation/validation.service'; -import { WizardForm } from '../../../constants/wizard.constants'; - -describe('networkStepComponent', () => { - let component: SharedNetworkStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - ValidationService, - FormBuilder, - APIClient - ], - schemas: [ - // CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [SharedNetworkStepComponent] - }).compileComponents(); - })); - beforeEach(() => { - AppServices.messenger = new Messenger(); - fixture = TestBed.createComponent(SharedNetworkStepComponent); - component = fixture.componentInstance; - // NOTE: using Azure file import events just for testing - component.setStepRegistrantData({ wizard: 'BozoWizard', step: WizardForm.NETWORK, formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.AZURE_CONFIG_FILE_IMPORTED, - eventFileImportError: TanzuEventType.AZURE_CONFIG_FILE_IMPORT_ERROR}); - component.ngOnInit(); - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - describe('should generate a full no proxy list', () => { - it ('should return empty string', () => { - component.generateFullNoProxy(); - expect(component.fullNoProxy).toBe(''); - }); - - it('should have a complete no proxy list', () => { - component.additionalNoProxyInfo = '10.0.0.0/16,169.254.0.0/16'; - component.formGroup.setValue({ - proxySettings: true, - httpProxyUrl: 'http://myproxy.com', - httpProxyUsername: 'username1', - httpProxyPassword: 'password1', - isSameAsHttp: true, - httpsProxyUrl: 'http://myproxy.com', - httpsProxyUsername: 'username1', - httpsProxyPassword: 'password1', - cniType: 'Antrea', - clusterServiceCidr: '100.64.0.0/13', - clusterPodCidr: '100.96.0.0/11', - noProxy: 'noproxy.yourdomain.com,192.168.0.0/24' - }); - expect(component.fullNoProxy).toBe('noproxy.yourdomain.com,192.168.0.0/24,10.0.0.0/16,169.254.0.0/16,' + - '100.64.0.0/13,100.96.0.0/11,localhost,127.0.0.1,.svc,.svc.cluster.local'); - }); - - it('should generate complete no proxy list correctly if there are more commas in the noProxy field', () => { - component.additionalNoProxyInfo = '10.0.0.0/16,169.254.0.0/16'; - component.formGroup.setValue({ - proxySettings: true, - httpProxyUrl: 'http://myproxy.com', - httpProxyUsername: 'username1', - httpProxyPassword: 'password1', - isSameAsHttp: true, - httpsProxyUrl: 'http://myproxy.com', - httpsProxyUsername: 'username1', - httpsProxyPassword: 'password1', - cniType: 'Antrea', - clusterServiceCidr: '100.64.0.0/13', - clusterPodCidr: '100.96.0.0/11', - noProxy: 'noproxy.yourdomain.com,192.168.0.0/24,,,,,', - }); - expect(component.fullNoProxy).toBe('noproxy.yourdomain.com,192.168.0.0/24,10.0.0.0/16,169.254.0.0/16,' + - '100.64.0.0/13,100.96.0.0/11,localhost,127.0.0.1,.svc,.svc.cluster.local'); - }); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - const serviceCidrControl = component.formGroup.controls[NetworkField.CLUSTER_SERVICE_CIDR]; - const podCidrControl = component.formGroup.controls[NetworkField.CLUSTER_POD_CIDR]; - - serviceCidrControl.setValue(''); - podCidrControl.setValue(''); - expect(component.dynamicDescription()).toEqual(SharedNetworkStepComponent.description); - - podCidrControl.setValue('1.2.3.4/12'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.NETWORK, - description: 'Cluster Pod CIDR: 1.2.3.4/12' - } - }); - - serviceCidrControl.setValue('5.6.7.8/16'); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.NETWORK, - description: 'Cluster Service CIDR: 5.6.7.8/16 Cluster Pod CIDR: 1.2.3.4/12' - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.ts deleted file mode 100644 index 78284b50de..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.component.ts +++ /dev/null @@ -1,312 +0,0 @@ -// Angular imports -import { Component, Input, OnInit } from '@angular/core'; -import { FormGroup, Validators } from '@angular/forms'; -// Third party imports -import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; -// App imports -import AppServices from '../../../../../../../shared/service/appServices'; -import { IAAS_DEFAULT_CIDRS, IpFamilyEnum } from '../../../../../../../shared/constants/app.constants'; -import { managementClusterPlugin } from "../../../constants/wizard.constants"; -import { NetworkField, NetworkIpv4StepMapping, NetworkIpv6StepMapping } from './network-step.fieldmapping'; -import { StepFormDirective } from '../../../step-form/step-form'; -import { StepMapping } from '../../../field-mapping/FieldMapping'; -import { TanzuEventType } from 'src/app/shared/service/Messenger'; -import { ValidationService } from '../../../validation/validation.service'; - -@Component({ - selector: 'app-shared-network-step', - templateUrl: './network-step.component.html', - styleUrls: ['./network-step.component.scss'] -}) -export class SharedNetworkStepComponent extends StepFormDirective implements OnInit { - static description = 'Specify how TKG networking is provided and global network settings'; - - form: FormGroup; - cniType: string; - additionalNoProxyInfo: string; - fullNoProxy: string; - infraServiceAddress: string = ''; - loadingNetworks: boolean = false; // only used by vSphere - hideNoProxyWarning: boolean = true; // only used by vSphere - - constructor(protected validationService: ValidationService) { - super(); - } - - protected supplyEnablesNetworkName(): boolean { - return false; - } - - protected supplyEnablesNoProxyWarning(): boolean { - return false; - } - - protected supplyNetworkNameInstruction(): string { - return ''; - } - - protected supplyNetworks(): { displayName?: string }[] { - return []; - } - - protected supplyStepMapping(): StepMapping { - return this.ipFamily === IpFamilyEnum.IPv4 ? NetworkIpv4StepMapping : NetworkIpv6StepMapping; - } - - // This method may be overridden by subclasses that describe this step using different fields - protected supplyFieldsAffectingStepDescription(): string[] { - return [NetworkField.CLUSTER_SERVICE_CIDR, NetworkField.CLUSTER_POD_CIDR]; - } - - private customizeForm() { - const cidrs = [NetworkField.CLUSTER_SERVICE_CIDR, NetworkField.CLUSTER_POD_CIDR]; - cidrs.forEach(cidr => { - this.registerOnIpFamilyChange(cidr, [ - this.validationService.isValidIpNetworkSegment()], [ - this.validationService.isValidIpv6NetworkSegment(), - this.setCidrs - ]); - }); - this.registerStepDescriptionTriggers({fields: this.supplyFieldsAffectingStepDescription()}); - - this.setValidators(); - } - - ngOnInit() { - super.ngOnInit(); - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, this.supplyStepMapping()); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(this.supplyStepMapping()); - this.storeDefaultLabels(this.supplyStepMapping()); - this.registerDefaultFileImportedHandler(this.eventFileImported, this.supplyStepMapping()); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - - this.customizeForm(); - this.listenToEvents(); - this.subscribeToServices(); - } - - setValidators() { - const configuredCni = AppServices.appDataService.getPluginFeature(managementClusterPlugin, 'cni'); - if (configuredCni && ['antrea', 'calico', 'none'].includes(configuredCni)) { - this.cniType = configuredCni; - } else { - this.cniType = 'antrea'; - } - - if (this.cniType === 'none') { - [NetworkField.CLUSTER_SERVICE_CIDR, NetworkField.CLUSTER_POD_CIDR].forEach( field => this.disarmField(field, false)); - } else { - if (this.cniType === 'calico') { - this.disarmField(NetworkField.CLUSTER_SERVICE_CIDR, false); - } - this.setCidrs(); - if (this.enableNetworkName) { - this.setNetworkNameValidator(); - } - } - } - - private setNetworkNameValidator() { - const control = this.formGroup.controls['networkName']; - if (control) { - control.setValidators([Validators.required]); - } - } - - setCidrs = () => { - if (this.cniType === 'antrea') { - this.resurrectField(NetworkField.CLUSTER_SERVICE_CIDR, [ - Validators.required, - this.validationService.noWhitespaceOnEnds(), - this.ipFamily === IpFamilyEnum.IPv4 ? - this.validationService.isValidIpNetworkSegment() : this.validationService.isValidIpv6NetworkSegment(), - this.validationService.isIpUnique([this.formGroup.get(NetworkField.CLUSTER_POD_CIDR)]) - ], this.ipFamily === IpFamilyEnum.IPv4 ? - IAAS_DEFAULT_CIDRS.CLUSTER_SVC_CIDR : IAAS_DEFAULT_CIDRS.CLUSTER_SVC_IPV6_CIDR, { onlySelf: true }); - } - - this.resurrectField(NetworkField.CLUSTER_POD_CIDR, [ - Validators.required, - this.validationService.noWhitespaceOnEnds(), - this.ipFamily === IpFamilyEnum.IPv4 ? - this.validationService.isValidIpNetworkSegment() : this.validationService.isValidIpv6NetworkSegment(), - this.validationService.isIpUnique([this.formGroup.get(NetworkField.CLUSTER_SERVICE_CIDR)]) - ], this.ipFamily === IpFamilyEnum.IPv4 ? - IAAS_DEFAULT_CIDRS.CLUSTER_POD_CIDR : IAAS_DEFAULT_CIDRS.CLUSTER_POD_IPV6_CIDR, { onlySelf: true }); - } - - listenToEvents() { - this.listenToCidrEvents(); - this.listenToNoProxyEvents(); - } - - private listenToCidrEvents() { - const cidrFields = [NetworkField.CLUSTER_SERVICE_CIDR, NetworkField.CLUSTER_POD_CIDR]; - cidrFields.forEach((field) => { - this.formGroup.get(field).valueChanges.pipe( - distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), - takeUntil(this.unsubscribe) - ).subscribe((value) => { - this.generateFullNoProxy(); - this.triggerStepDescriptionChange(); - }); - }); - } - - private listenToNoProxyEvents() { - this.formGroup.get('noProxy').valueChanges.pipe( - distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), - takeUntil(this.unsubscribe) - ).subscribe((value) => { - this.onNoProxyChange(value); - this.triggerStepDescriptionChange(); - }); - - AppServices.messenger.subscribe<{ info: string }>(TanzuEventType.NETWORK_STEP_GET_NO_PROXY_INFO, event => { - this.additionalNoProxyInfo = event.payload.info; - this.generateFullNoProxy(); - }, this.unsubscribe); - } - - // onNoProxyChange() is protected to allow subclasses to override - protected onNoProxyChange(value: string) { - this.generateFullNoProxy(); - } - - // This is a method only implemented by the vSphere child class (which overrides this method); - // we need a method in this class because the general HTML references it; - // however it should only be called when enableNetworkName is true (which only the vSphere subclass sets) - loadNetworks() { - console.error('loadNetworks() was called, but no implementation is available. (enableNetworkName= ' + this.enableNetworkName + ')'); - } - - generateFullNoProxy() { - const noProxy = this.formGroup.get(NetworkField.NO_PROXY); - if (noProxy && !noProxy.value) { - this.fullNoProxy = ''; - return; - } - const clusterServiceCidr = this.formGroup.get(NetworkField.CLUSTER_SERVICE_CIDR); - const clusterPodCidr = this.formGroup.get(NetworkField.CLUSTER_POD_CIDR); - - const noProxyList = [ - ...noProxy.value.split(','), - this.additionalNoProxyInfo, - clusterServiceCidr && clusterServiceCidr.value, - clusterPodCidr && clusterPodCidr.value, - 'localhost', - '127.0.0.1', - '.svc', - '.svc.cluster.local' - ]; - - this.fullNoProxy = noProxyList.filter(elem => elem).join(','); - } - - toggleProxySetting(fromSavedData?: boolean) { - const proxySettingFields = [ - NetworkField.HTTP_PROXY_URL, - NetworkField.HTTP_PROXY_USERNAME, - NetworkField.HTTP_PROXY_PASSWORD, - NetworkField.HTTPS_IS_SAME_AS_HTTP, - NetworkField.HTTPS_PROXY_URL, - NetworkField.HTTPS_PROXY_USERNAME, - NetworkField.HTTPS_PROXY_PASSWORD, - NetworkField.NO_PROXY - ]; - - if (!fromSavedData) { - this.formGroup.markAsPending(); - } - - if (this.formGroup.value[NetworkField.PROXY_SETTINGS]) { - this.resurrectField(NetworkField.HTTP_PROXY_URL, [ - Validators.required, - this.validationService.isHttpOrHttps() - ], this.formGroup.value[NetworkField.HTTP_PROXY_URL], - { onlySelf: true } - ); - this.resurrectField(NetworkField.NO_PROXY, [], - this.formGroup.value[NetworkField.NO_PROXY] || this.infraServiceAddress, - { onlySelf: true } - ); - if (!this.formGroup.value[NetworkField.HTTPS_IS_SAME_AS_HTTP]) { - this.resurrectField(NetworkField.HTTPS_PROXY_URL, [ - Validators.required, - this.validationService.isHttpOrHttps() - ], this.formGroup.value[NetworkField.HTTPS_PROXY_URL], - { onlySelf: true } - ); - } else { - const httpsFields = [ - NetworkField.HTTPS_PROXY_URL, - NetworkField.HTTPS_PROXY_USERNAME, - NetworkField.HTTPS_PROXY_PASSWORD, - ]; - httpsFields.forEach((field) => { - this.disarmField(field, true); - }); - } - } else { - proxySettingFields.forEach((field) => { - this.disarmField(field, true); - }); - } - } - - getCniTypeLabel() { - if (this.cniType === "none") { - return "None"; - } else if (this.cniType === "calico") { - return "Calico"; - } else { - return "Antrea" - } - } - - // Reset the relevant fields upon data center change - resetFieldsUponDCChange() { - const fieldsToReset = ['networkName']; - fieldsToReset.forEach(f => this.formGroup.get(f) && this.formGroup.get(f).setValue('', { onlySelf: true })); - } - - dynamicDescription(): string { - const serviceCidr = this.getFieldValue(NetworkField.CLUSTER_SERVICE_CIDR, true); - const podCidr = this.getFieldValue(NetworkField.CLUSTER_POD_CIDR, true); - if (serviceCidr && podCidr) { - return `Cluster Service CIDR: ${serviceCidr} Cluster Pod CIDR: ${podCidr}`; - } - if (podCidr) { - return `Cluster Pod CIDR: ${podCidr}`; - } - return SharedNetworkStepComponent.description; - } - - // allows subclasses to subscribe to services during ngOnInit by overriding this method - protected subscribeToServices() { - } - - protected storeUserData() { - // We store an entry for fullNoProxy (if we have a value) so it will display on the confirmation page - if (this.fullNoProxy) { - const entry = { display: this.fullNoProxy, value: this.fullNoProxy }; - AppServices.userDataService.store(this.createUserDataIdentifier('fullProxyList'), entry); - } - this.storeUserDataFromMapping(this.supplyStepMapping()); - this.storeDefaultDisplayOrder(this.supplyStepMapping()); - } - - // These network-related methods are referenced in the HTML, but used only by vSphere - get enableNoProxyWarning(): boolean { - return this.supplyEnablesNoProxyWarning(); - } - get enableNetworkName(): boolean { - return this.supplyEnablesNetworkName(); - } - get networkNameInstruction(): string { - return this.supplyNetworkNameInstruction(); - } - get networks(): { displayName?: string }[] { - return this.supplyNetworks(); - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.fieldmapping.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.fieldmapping.ts deleted file mode 100644 index 89d63d314f..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/network-step/network-step.fieldmapping.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { FieldMapping, StepMapping } from '../../../field-mapping/FieldMapping'; -import { IAAS_DEFAULT_CIDRS } from '../../../../../../../shared/constants/app.constants'; - -export enum NetworkField { - CLUSTER_SERVICE_CIDR = 'clusterServiceCidr', - CLUSTER_POD_CIDR = 'clusterPodCidr', - CNI_TYPE = 'cniType', - HTTP_PROXY_URL = 'httpProxyUrl', - HTTP_PROXY_USERNAME = 'httpProxyUsername', - HTTP_PROXY_PASSWORD = 'httpProxyPassword', - HTTPS_IS_SAME_AS_HTTP = 'isSameAsHttp', - HTTPS_PROXY_URL = 'httpsProxyUrl', - HTTPS_PROXY_USERNAME = 'httpsProxyUsername', - HTTPS_PROXY_PASSWORD = 'httpsProxyPassword', - NETWORK_NAME = 'networkName', - NO_PROXY = 'noProxy', - PROXY_SETTINGS = 'proxySettings', - FULL_PROXY_LIST = 'fullProxyList' -} - -const ProviderNetworkFieldMapping: FieldMapping[] = [ - { name: NetworkField.CNI_TYPE, defaultValue: 'antrea', label: 'CNI PROVIDER' }, -] -const BasicNetworkFieldMappings: FieldMapping[] = [ - { name: NetworkField.PROXY_SETTINGS, isBoolean: true, label: 'ACTIVATE PROXY SETTINGS' }, - { name: NetworkField.HTTP_PROXY_URL, label: 'HTTP PROXY URL' }, - { name: NetworkField.HTTP_PROXY_USERNAME, label: 'HTTP PROXY USERNAME (OPTIONAL)' }, - { name: NetworkField.HTTP_PROXY_PASSWORD, mask: true, label: 'HTTP PROXY PASSWORD (OPTIONAL)' }, - { name: NetworkField.HTTPS_PROXY_URL, label: 'HTTPS PROXY URL' }, - { name: NetworkField.HTTPS_IS_SAME_AS_HTTP, isBoolean: true, defaultValue: true, label: 'USE SAME CONFIGURATION FOR HTTPS PROXY' }, - { name: NetworkField.HTTPS_PROXY_USERNAME, label: 'HTTPS PROXY USERNAME (OPTIONAL)' }, - { name: NetworkField.HTTPS_PROXY_PASSWORD, mask: true, label: 'HTTPS PROXY PASSWORD (OPTIONAL)' }, - { name: NetworkField.NO_PROXY, label: 'NO PROXY (OPTIONAL)' }, - { name: NetworkField.FULL_PROXY_LIST, label: 'FULL NO PROXY LIST', displayOnly: true}, -]; - -export const NetworkIpv4StepMapping: StepMapping = { - // Because, by default, the ORDER of these fields is the order in which they are displayed, - // we put the fields in the expected display order (and avoid having to order them elsewhere in the code) - fieldMappings: [ - ...ProviderNetworkFieldMapping, - { name: NetworkField.CLUSTER_SERVICE_CIDR, defaultValue: IAAS_DEFAULT_CIDRS.CLUSTER_SVC_CIDR, label: 'CLUSTER SERVICE CIDR' }, - { name: NetworkField.CLUSTER_POD_CIDR, defaultValue: IAAS_DEFAULT_CIDRS.CLUSTER_POD_CIDR, label: 'CLUSTER POD CIDR' }, - ...BasicNetworkFieldMappings - ] -} - -export const NetworkIpv6StepMapping: StepMapping = { - fieldMappings: [ - ...ProviderNetworkFieldMapping, - { name: NetworkField.CLUSTER_SERVICE_CIDR, defaultValue: IAAS_DEFAULT_CIDRS.CLUSTER_SVC_IPV6_CIDR, label: 'CLUSTER SERVICE CIDR' }, - { name: NetworkField.CLUSTER_POD_CIDR, defaultValue: IAAS_DEFAULT_CIDRS.CLUSTER_POD_IPV6_CIDR, label: 'CLUSTER POD CIDR' }, - ...BasicNetworkFieldMappings - ] -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/node-setting-step/node-setting-step.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/node-setting-step/node-setting-step.component.ts deleted file mode 100644 index 02cee3e4dd..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/node-setting-step/node-setting-step.component.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { StepFormDirective } from '../../../step-form/step-form'; -import { Directive, OnInit } from '@angular/core'; -import { ClusterPlan } from '../../../constants/wizard.constants'; -import { StepMapping } from '../../../field-mapping/FieldMapping'; -import AppServices from '../../../../../../../shared/service/appServices'; -import { NodeSettingField, NodeSettingStepMapping } from './node-setting-step.fieldmapping'; -import { Validators } from '@angular/forms'; -import { ValidationService } from '../../../validation/validation.service'; - -@Directive() -export abstract class NodeSettingStepDirective extends StepFormDirective implements OnInit { - nodeTypes: Array = []; - clusterNameInstruction: string; - private clusterPlan: string; - private stepMapping: StepMapping; - - protected abstract getKeyFromNodeInstance(nodeInstance: NODEINSTANCE): string; - protected abstract getDisplayFromNodeInstance(nodeInstance: NODEINSTANCE): string; - - protected constructor(protected validationService: ValidationService) { - super(); - } - - ngOnInit() { - super.ngOnInit(); - - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, this.supplyStepMapping()); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(this.supplyStepMapping()); - this.storeDefaultLabels(this.supplyStepMapping()); - this.registerDefaultFileImportedHandler(this.eventFileImported, this.supplyStepMapping()); - this.registerDefaultFileImportErrorHandler(this.eventFileImportError); - this.subscribeToServices(); - this.listenToEvents(); - - this.setClusterNameInstruction(); - } - - // available to HTML as handler for clicking on a cluster plan - cardClickDev() { - this.setControlPlaneToDev(); - this.triggerStepDescriptionChange(); - } - - cardClickProd() { - this.setControlPlaneToProd(); - this.triggerStepDescriptionChange(); - } - - get devInstanceTypeValue() { - return this.getFieldValue(NodeSettingField.INSTANCE_TYPE_DEV); - } - - get prodInstanceTypeValue() { - return this.getFieldValue(NodeSettingField.INSTANCE_TYPE_PROD); - } - - // Extending classes should override this method by calling it first and then adding whatever additional field mappings they need - protected createStepMapping(): StepMapping { - return this.createDefaultStepMapping(); - } - - // Extending classes will likely override this method by calling it first and then adding whatever listeners they need - protected listenToEvents() { - this.registerOnValueChange(NodeSettingField.INSTANCE_TYPE_DEV, this.onDevInstanceTypeChange.bind(this)); - this.registerOnValueChange(NodeSettingField.INSTANCE_TYPE_PROD, this.onProdInstanceTypeChange.bind(this)); - this.registerStepDescriptionTriggers({ clusterTypeDescriptor: true }); - } - - // Extending classes may override this method if they have service to subscribe to - protected subscribeToServices() { - } - - protected onDevInstanceTypeChange(devNodeType: string) { - if (devNodeType) { - this.setWorkerInstanceTypeIfNotSet(devNodeType); - this.clearControlValue(NodeSettingField.INSTANCE_TYPE_PROD); - } - } - - protected onProdInstanceTypeChange(prodNodeType: string) { - if (prodNodeType) { - this.setWorkerInstanceTypeIfNotSet(prodNodeType); - this.clearControlValue(NodeSettingField.INSTANCE_TYPE_DEV); - } - } - - private setWorkerInstanceTypeIfNotSet(nodeType: string) { - if (!this.modeClusterStandalone && nodeType) { - // The user has just selected a new instance type for the management cluster. - // If the worker node type hasn't been set, default to the same node type - const workerNodeInstanceTypeControl = this.getControl(NodeSettingField.WORKER_NODE_INSTANCE_TYPE); - if (!workerNodeInstanceTypeControl.value) { - workerNodeInstanceTypeControl.setValue(nodeType); - workerNodeInstanceTypeControl.updateValueAndValidity(); - } - } - } - - // Extending classes MAY need to override this method if they have additional changes dependent on cluster plan change to DEV - protected setControlPlaneToDev() { - this.clusterPlan = ClusterPlan.DEV; - let valueToUse; - if (this.nodeTypes.length === 1) { - valueToUse = this.getKeyFromNodeInstance(this.nodeTypes[0]); - } else { - const existingValue = this.formGroup.get(NodeSettingField.INSTANCE_TYPE_DEV).value; - valueToUse = this.getStoredValue(NodeSettingField.INSTANCE_TYPE_DEV, this.supplyStepMapping(), existingValue); - } - this.resurrectFieldWithStoredValue(NodeSettingField.INSTANCE_TYPE_DEV, this.supplyStepMapping(), [Validators.required], - valueToUse, this.quietly); - this.disarmField(NodeSettingField.INSTANCE_TYPE_PROD); - } - - // Extending classes MAY need to override this method if they have additional changes dependent on cluster plan change to PROD - protected setControlPlaneToProd() { - this.clusterPlan = ClusterPlan.PROD; - let valueToUse; - if (this.nodeTypes.length === 1) { - valueToUse = this.getKeyFromNodeInstance(this.nodeTypes[0]); - } else { - const existingValue = this.formGroup.get(NodeSettingField.INSTANCE_TYPE_PROD).value; - valueToUse = this.getStoredValue(NodeSettingField.INSTANCE_TYPE_PROD, this.supplyStepMapping(), existingValue); - } - this.resurrectFieldWithStoredValue(NodeSettingField.INSTANCE_TYPE_PROD, this.supplyStepMapping(), - [Validators.required], valueToUse, this.quietly); - this.disarmField(NodeSettingField.INSTANCE_TYPE_DEV); - } - - private createDefaultStepMapping(): StepMapping { - const stepMapping = AppServices.fieldMapUtilities.cloneStepMapping(NodeSettingStepMapping); - // if we're in standalone mode, deactivate the worker node instance field mapping (because it isn't used) - const workerInstanceMapping = - AppServices.fieldMapUtilities.getFieldMapping(NodeSettingField.WORKER_NODE_INSTANCE_TYPE, stepMapping); - workerInstanceMapping.deactivated = AppServices.appDataService.isModeClusterStandalone(); - // dynamically modify the cluster field mapping - const clusterNameMapping = AppServices.fieldMapUtilities.getFieldMapping(NodeSettingField.CLUSTER_NAME, stepMapping); - clusterNameMapping.label = this.createClusterNameLabel(); - clusterNameMapping.required = this.isClusterNameRequired(); - // add retriever/restorer for cluster plan entry - const clusterPlanMapping = AppServices.fieldMapUtilities.getFieldMapping(NodeSettingField.CLUSTER_PLAN, stepMapping); - clusterPlanMapping.restorer = this.setClusterPlan.bind(this); - clusterPlanMapping.retriever = this.getClusterPlan.bind(this); - - return stepMapping; - } - - protected chooseInitialClusterPlan() { - // we first check if the cluster plan type was stored - const storedClusterPlan = this.getStoredValue(NodeSettingField.CLUSTER_PLAN, this.supplyStepMapping()); - if (storedClusterPlan === ClusterPlan.PROD) { - this.cardClickProd(); - } else if (storedClusterPlan === ClusterPlan.DEV) { - this.cardClickDev(); - } else { - // there was no cluster plan type stored, but if there was an instance type for prod, we'll assume a PROD cluster plan - const prodInstanceType = this.getStoredValue(NodeSettingField.INSTANCE_TYPE_PROD, this.supplyStepMapping()); - prodInstanceType ? this.cardClickProd() : this.cardClickDev(); - } - } - - // This method may be USED by subclasses, but should not be overwritten; subclasses should overwrite createStepMapping() instead. - protected supplyStepMapping(): StepMapping { - if (!this.stepMapping) { - this.stepMapping = this.createStepMapping(); - } - return this.stepMapping; - } - - private createClusterNameLabel(): string { - let clusterNameLabel = this.clusterTypeDescriptor.toUpperCase() + ' CLUSTER NAME'; - if (!AppServices.appDataService.isClusterNameRequired()) { - clusterNameLabel += ' (OPTIONAL)'; - } - return clusterNameLabel; - } - - private setClusterNameInstruction() { - if (AppServices.appDataService.isClusterNameRequired()) { - this.clusterNameInstruction = 'Specify a name for the ' + this.clusterTypeDescriptor + ' cluster.'; - } else { - this.clusterNameInstruction = 'Optionally specify a name for the ' + this.clusterTypeDescriptor + ' cluster. ' + - 'If left blank, the installer names the cluster automatically.'; - } - } - - // Extending classes may want to override this method - protected isClusterNameRequired(): boolean { - return AppServices.appDataService.isClusterNameRequired(); - } - - dynamicDescription(): string { - if (this.isClusterPlanProd) { - return 'Production cluster selected: 3 node control plane'; - } else if (this.isClusterPlanDev) { - return 'Development cluster selected: 1 node control plane'; - } - return `Specify the resources backing the ${this.clusterTypeDescriptor} cluster`; - } - - get isClusterPlanProd(): boolean { - return this.clusterPlan === ClusterPlan.PROD; - } - - get isClusterPlanDev(): boolean { - return this.clusterPlan === ClusterPlan.DEV; - } - - private setClusterPlan(newClusterPlan: string) { - this.clusterPlan = newClusterPlan; - } - - private getClusterPlan(): string { - return this.clusterPlan; - } - - // TODO: this method is for testing classes; find another way - clearClusterPlan() { - this.clusterPlan = ''; - } - - // Extending classes should have no reason to override this method. - protected storeUserData() { - this.storeUserDataFromMapping(this.supplyStepMapping()); - this.storeDisplayOrder(this.getFieldDisplayOrder()); - } - - // Extending classes may want to change the display order of the fields - protected getFieldDisplayOrder() { - return this.defaultDisplayOrder(this.supplyStepMapping()); - } - - protected onStepStarted() { - this.chooseInitialClusterPlan(); - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/node-setting-step/node-setting-step.fieldmapping.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/node-setting-step/node-setting-step.fieldmapping.ts deleted file mode 100644 index 12e8686b36..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/node-setting-step/node-setting-step.fieldmapping.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { StepMapping } from '../../../field-mapping/FieldMapping'; -import { SimpleValidator } from '../../../constants/validation.constants'; - -export enum NodeSettingField { - CLUSTER_PLAN = 'clusterPlan', // note: there is no actual DOM FIELD associated with this value, which is 'dev' or 'prod' - CLUSTER_NAME = 'clusterName', - INSTANCE_TYPE_DEV = 'devInstanceType', - INSTANCE_TYPE_PROD = 'prodInstanceType', - MACHINE_HEALTH_CHECKS_ENABLED = 'machineHealthChecksEnabled', - ENABLE_AUDIT_LOGGING = 'enableAuditLogging', - WORKER_NODE_INSTANCE_TYPE = 'workerNodeInstanceType' -} - -export const NodeSettingStepMapping: StepMapping = { - fieldMappings: [ - { name: NodeSettingField.CLUSTER_PLAN, hasNoDomControl: true }, - { name: NodeSettingField.CLUSTER_NAME, label: 'CLUSTER NAME', validators: [SimpleValidator.IS_VALID_CLUSTER_NAME] }, - { name: NodeSettingField.INSTANCE_TYPE_DEV, label: 'INSTANCE TYPE', primaryTrigger: true }, - { name: NodeSettingField.INSTANCE_TYPE_PROD, label: 'INSTANCE TYPE', primaryTrigger: true }, - { name: NodeSettingField.WORKER_NODE_INSTANCE_TYPE, required: true, label: 'WORKER NODE INSTANCE TYPE' }, - { name: NodeSettingField.ENABLE_AUDIT_LOGGING, isBoolean: true, label: 'ACTIVATE AUDIT LOGGING' }, - { name: NodeSettingField.MACHINE_HEALTH_CHECKS_ENABLED, isBoolean: true, label: 'MACHINE HEALTH CHECKS' }, - ] -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.html b/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.html deleted file mode 100644 index 8d0aac7084..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.html +++ /dev/null @@ -1,85 +0,0 @@ -
- - - -

- OS Image with Kubernetes {{ tkrVersion | async }} -

- - - - - - - Selecting an OS image is required - - - - -
diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.scss b/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.scss deleted file mode 100644 index e1cf881f5e..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.scss +++ /dev/null @@ -1,25 +0,0 @@ -.os-image { - display: inline-block; -} - -.refresh-btn { - cursor: pointer; - display: inline-block; - height: 100%; - vertical-align: top; - color: #0072a3; - position: relative; - top: 48px; - - &.reset { - background: none; - border: none; - padding: 0; - font: inherit; - cursor: pointer; - } -} - -.hidden { - visibility: hidden; -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.spec.ts deleted file mode 100644 index fbb682e565..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.spec.ts +++ /dev/null @@ -1,80 +0,0 @@ -// Angular imports -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -// App imports -import { APIClient } from 'src/app/swagger/api-client.service'; -import AppServices from '../../../../../../../shared/service/appServices'; -import { Messenger, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { OsImageField } from './os-image-step.fieldmapping'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { SharedOsImageStepDirective } from './os-image-step.component'; -import { ValidationService } from '../../../validation/validation.service'; -import { VsphereOsImageStepComponent } from '../../../../../vsphere-wizard/vsphere-os-image-step/vsphere-os-image-step.component'; -import { WizardForm } from '../../../constants/wizard.constants'; - -describe('VsphereOsImageStepComponent', () => { - let component: VsphereOsImageStepComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [VsphereOsImageStepComponent], - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - ValidationService, - FormBuilder, - APIClient, - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - AppServices.messenger = new Messenger(); - fixture = TestBed.createComponent(VsphereOsImageStepComponent); - component = fixture.componentInstance; - // NOTE: using Azure file import events just for testing - component.setStepRegistrantData({ wizard: 'BozoWizard', step: WizardForm.OSIMAGE, formGroup: new FormBuilder().group({}), - eventFileImported: TanzuEventType.AZURE_CONFIG_FILE_IMPORTED, - eventFileImportError: TanzuEventType.AZURE_CONFIG_FILE_IMPORT_ERROR}); - - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should retrieve os image when function invoked', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.retrieveOsImages(); - expect(component.formGroup.get(OsImageField.IMAGE).value).toBeFalsy(); - expect(msgSpy).toHaveBeenCalled(); - }); - - it('should announce description change', () => { - const msgSpy = spyOn(AppServices.messenger, 'publish').and.callThrough(); - component.ngOnInit(); - const osImageControl = component.formGroup.get(OsImageField.IMAGE); - - osImageControl.setValue({}); - expect(component.dynamicDescription()).toEqual(SharedOsImageStepDirective.description); - - osImageControl.setValue({ name: '\'OS Image: \'' }); - expect(msgSpy).toHaveBeenCalledWith({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: { - wizard: 'BozoWizard', - step: WizardForm.OSIMAGE, - description: 'OS Image: \'OS Image: \'' - } - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.ts deleted file mode 100644 index 50306347bf..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.component.ts +++ /dev/null @@ -1,134 +0,0 @@ -// Angular imports -import { Directive, OnInit } from '@angular/core'; -// Third party imports -import { Observable } from 'rxjs/internal/Observable'; -// App imports -import AppServices from '../../../../../../../shared/service/appServices'; -import { OsImageField, OsImageStepMapping } from './os-image-step.fieldmapping'; -import { StepFormDirective } from '../../../step-form/step-form'; -import { StepMapping } from '../../../field-mapping/FieldMapping'; -import { TanzuEventType } from 'src/app/shared/service/Messenger'; - -// The intention of this class is to provide the common plumbing for the osImage step that many providers need. -// The basic functionality is to subscribe to an event and load the resulting images into a local field. -// Note that we assume that the event has been registered already with a backend service that will return an array of images -// of type IMAGE - -// We define an OsImage as one that has a name field, so that our HTML can dereference this field in the listbox display. -// Even though ALL the osImage types do have a name field, it is generated as OPTIONAL by Swagger, so we leave it optional in our interface. -export interface OsImage { - name?: string -} -export interface OsImageProviderInputs { - createOsImageEventPayload?: () => any, // some providers need to send a payload when refreshing the list of OS images; some do not - event: TanzuEventType, - eventImportFileSuccess: TanzuEventType, - eventImportFileFailure: TanzuEventType, - osImageTooltipContent: string, - nonTemplateAlertMessage?: string, - noImageAlertMessage?: string, -} - -@Directive() -export abstract class SharedOsImageStepDirective extends StepFormDirective implements OnInit { - static description = 'Specify the OS Image'; - - // used by HTML as well as locally - public providerInputs: OsImageProviderInputs; - - osImages: Array = []; - loadingOsTemplate: boolean = false; - displayNonTemplateAlert: boolean = false; - // TODO: It's questionable whether tkrVersion should be in this class, since it's only used for vSphere - tkrVersion: Observable; - private stepMapping: StepMapping; - - constructor() { - super(); - this.tkrVersion = AppServices.appDataService.getTkrVersion(); - } - - // This method allows child classes to supply the inputs (rather than having them passed as part of an HTML component tag). - // This allows this step to follow the same pattern as all the other steps, which only take formGroup and formName as inputs. - protected abstract supplyProviderInputs(): OsImageProviderInputs; - - private subscribeToProviderEvent() { - // we register a handler for when our event receives data, namely that we'll populate our array of osImages - AppServices.dataServiceRegistrar.stepSubscribe(this, this.providerInputs.event, this.onOsImageEvent.bind(this)); - } - - private onOsImageEvent(images: Array) { - this.osImages = images ? images : []; - this.loadingOsTemplate = false; - this.restoreField(OsImageField.IMAGE, this.stepMapping, this.osImages); - } - - protected getImageFromStoredValue(osImageValue: string): IMAGE { - return this.osImages ? this.osImages.find(image => image.name === osImageValue) : null; - } - - ngOnInit() { - super.ngOnInit(); - this.stepMapping = this.createStepMapping(); - - AppServices.userDataFormService.buildForm(this.formGroup, this.wizardName, this.formName, this.stepMapping); - this.htmlFieldLabels = AppServices.fieldMapUtilities.getFieldLabelMap(this.stepMapping); - this.storeDefaultLabels(this.stepMapping); - - this.providerInputs = this.supplyProviderInputs(); - this.registerStepDescriptionTriggers({fields: [OsImageField.IMAGE]}); - this.subscribeToProviderEvent(); - - this.registerDefaultFileImportedHandler(this.providerInputs.eventImportFileSuccess, this.stepMapping); - this.registerDefaultFileImportErrorHandler(this.providerInputs.eventImportFileFailure); - } - - /** - * @method retrieveOsImages - * helper method to retrieve and preload list of available OS images from connected VC environment. - * emits list of OS images to wizard-data.service - */ - retrieveOsImages() { - this.loadingOsTemplate = true; - this.displayNonTemplateAlert = false; - // some providers need to send a payload when refreshing the list of OS images; some do not - const payload = this.providerInputs.createOsImageEventPayload ? this.providerInputs.createOsImageEventPayload() : undefined; - AppServices.messenger.publish({ - type: this.providerInputs.event, - payload - }); - } - - /** - * @method onOptionsSelected - * helper method to determine if osImage.isTemplate is true or false; if false show warning - */ - onOptionsSelected() { - this.displayNonTemplateAlert = !this.formGroup.value[OsImageField.IMAGE].isTemplate; - } - - dynamicDescription(): string { - if (this.getFieldValue(OsImageField.IMAGE, true) && this.getFieldValue(OsImageField.IMAGE).name) { - return 'OS Image: ' + this.getFieldValue(OsImageField.IMAGE).name; - } - return SharedOsImageStepDirective.description; - } - - protected storeUserData() { - this.storeUserDataFromMapping(this.stepMapping); - this.storeDefaultDisplayOrder(this.stepMapping); - } - - protected supplyStepMapping(): StepMapping { - return OsImageStepMapping; - } - - private createStepMapping(): StepMapping { - const result = this.supplyStepMapping(); - const osImageFieldMapping = AppServices.fieldMapUtilities.getFieldMapping(OsImageField.IMAGE, result); - // The retriever is a closure that can return an object based on the key - // By setting the retriever in the field mapping, we allow buildForm to "call us back" to get the osImage using the saved key - osImageFieldMapping.retriever = this.getImageFromStoredValue.bind(this); - return result; - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.fieldmapping.ts b/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.fieldmapping.ts deleted file mode 100644 index 70bc1cfa8b..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/steps/os-image-step/os-image-step.fieldmapping.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { StepMapping } from '../../../field-mapping/FieldMapping'; - -export enum OsImageField { - IMAGE = 'osImage', -} - -export const OsImageStepMapping: StepMapping = { - fieldMappings: [ - { name: OsImageField.IMAGE, required: true, label: 'OS IMAGE', requiresBackendData: true, - backingObject: { displayField: 'name', valueField: 'name' } } - ] -} -// About OsImageStep: -// The osImage is always selected from a backing array. Therefore, we don't want the field set to the stored value until the backend -// has populated the osImage listbox. We therefore set requiresBackendData to TRUE, and rely on the event handler of the osImage data -// arriving to set the field value from stored data. -// The backingObject gives a mapping of what fields (of the osImage object) to use for display and for value when storing data diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/audit-logging/audit-logging.component.html b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/audit-logging/audit-logging.component.html deleted file mode 100644 index f244ebab5b..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/audit-logging/audit-logging.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
- - - - - - - -
diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/audit-logging/audit-logging.component.scss b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/audit-logging/audit-logging.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/audit-logging/audit-logging.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/audit-logging/audit-logging.component.spec.ts deleted file mode 100644 index 2ae2aa9dfc..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/audit-logging/audit-logging.component.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { APIClient } from 'src/app/swagger'; - -import { AuditLoggingComponent } from './audit-logging.component'; - -describe('AuditLoggingComponent', () => { - let component: AuditLoggingComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - FormBuilder, - APIClient - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ], - declarations: [AuditLoggingComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - const fb = new FormBuilder(); - fixture = TestBed.createComponent(AuditLoggingComponent); - component = fixture.componentInstance; - component.formName = "test"; - component.formGroup = fb.group({ - }); - - fixture.detectChanges(); - }); - -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/audit-logging/audit-logging.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/audit-logging/audit-logging.component.ts deleted file mode 100644 index f157d1965c..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/audit-logging/audit-logging.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { FormControl, FormGroup } from '@angular/forms'; -import { Component, Input, OnInit } from '@angular/core'; -import { FormUtils } from '../../../utils/form-utils'; - -@Component({ - selector: 'app-audit-logging', - templateUrl: './audit-logging.component.html', - styleUrls: ['./audit-logging.component.scss'] -}) -export class AuditLoggingComponent implements OnInit { - @Input() label: string; - @Input() formName: string; - @Input() formGroup: FormGroup; - - constructor() { } - - ngOnInit(): void { - FormUtils.addControl( - this.formGroup, - 'enableAuditLogging', - new FormControl(false, []) - ); - } - -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-data.json b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-data.json deleted file mode 100644 index 0e888fe6a4..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-data.json +++ /dev/null @@ -1,1158 +0,0 @@ -{ - "docker" : [ - { - "name" : "clusterClassName TBD", - "categories" : [ - { - "name": "User supplied values", - "variables": [ - { - "name": "CLUSTER_NAME", - "description": "Description TBD" - } - ] - }, - { - "name": "Cluster class default values (can be overridden)", - "variables": [ - { - "name": "CLUSTER_PLAN", - "description": "Description TBD" - }, - { - "name": "CLUSTER_API_SERVER_PORT", - "description": "Description TBD" - }, - { - "name": "SIZE", - "description": "Description TBD" - }, - { - "name": "CONTROLPLANE_SIZE", - "description": "Description TBD" - }, - { - "name": "WORKER_SIZE", - "description": "Description TBD" - }, - { - "name": "ENABLE_AUDIT_LOGGING", - "description": "Description TBD" - }, - { - "name": "CLUSTER_CIDR", - "description": "Description TBD" - }, - { - "name": "SERVICE_CIDR", - "description": "Description TBD" - }, - { - "name": "CONTROL_PLANE_MACHINE_COUNT", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_0", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_1", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_2", - "description": "Description TBD" - }, - { - "name": "OS_NAME", - "description": "Description TBD" - }, - { - "name": "OS_VERSION", - "description": "Description TBD" - }, - { - "name": "OS_ARCH", - "description": "Description TBD" - }, - { - "name": "ENABLE_AUTOSCALER", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_0", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_0", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_1", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_1", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_2", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_2", - "description": "Description TBD" - }, - { - "name": "DOCKER_MACHINE_TEMPLATE_IMAGE", - "description": "Description TBD" - }, - { - "name": "KUBERNETES_VERSION", - "description": "Description TBD" - } - ] - }, - { - "name": "Cluster class fixed values (can not be overridden)", - "variables": [ - { - "name": "INFRASTRUCTURE_PROVIDER", - "description": "Description TBD" - }, - { - "name": "PROVIDER_TYPE", - "description": "Description TBD" - } - ] - } - ] - } - ], - "vsphere" : [ - { - "name" : "clusterClassName TBD", - "categories" : [ - { - "name": "User supplied values", - "variables": [ - { - "name": "PROVIDER_TYPE", - "description": "Description TBD" - }, - { - "name": "CLUSTER_CLASS", - "description": "Description TBD" - }, - { - "name": "IS_WINDOWS_WORKLOAD_CLUSTER", - "description": "Description TBD" - }, - { - "name": "VSPHERE_CONTROL_PLANE_ENDPOINT", - "description": "Description TBD" - } - ] - }, - { - "name": "Cluster class default values (can be overridden)", - "variables": [ - { - "name": "CLUSTER_PLAN", - "description": "Description TBD" - }, - { - "name": "CLUSTER_API_SERVER_PORT", - "description": "Description TBD" - }, - { - "name": "SIZE", - "description": "Description TBD" - }, - { - "name": "CONTROLPLANE_SIZE", - "description": "Description TBD" - }, - { - "name": "WORKER_SIZE", - "description": "Description TBD" - }, - { - "name": "VSPHERE_NUM_CPUS", - "description": "Description TBD" - }, - { - "name": "VSPHERE_DISK_GIB", - "description": "Description TBD" - }, - { - "name": "VSPHERE_MEM_MIB", - "description": "Description TBD" - }, - { - "name": "VSPHERE_CONTROL_PLANE_NUM_CPUS", - "description": "Description TBD" - }, - { - "name": "VSPHERE_CONTROL_PLANE_DISK_GIB", - "description": "Description TBD" - }, - { - "name": "VSPHERE_CONTROL_PLANE_MEM_MIB", - "description": "Description TBD" - }, - { - "name": "VSPHERE_WORKER_NUM_CPUS", - "description": "Description TBD" - }, - { - "name": "VSPHERE_WORKER_DISK_GIB", - "description": "Description TBD" - }, - { - "name": "VSPHERE_WORKER_MEM_MIB", - "description": "Description TBD" - }, - { - "name": "VSPHERE_CLONE_MODE", - "description": "Description TBD" - }, - { - "name": "VSPHERE_NETWORK", - "description": "Description TBD" - }, - { - "name": "VSPHERE_TEMPLATE", - "description": "Description TBD" - }, - { - "name": "VSPHERE_WINDOWS_TEMPLATE", - "description": "Description TBD" - }, - { - "name": "VIP_NETWORK_INTERFACE", - "description": "Description TBD" - }, - { - "name": "VSPHERE_SSH_AUTHORIZED_KEY", - "description": "Description TBD" - }, - { - "name": "VSPHERE_USERNAME", - "description": "Description TBD" - }, - { - "name": "VSPHERE_PASSWORD", - "description": "Description TBD" - }, - { - "name": "VSPHERE_AZ_0", - "description": "Description TBD" - }, - { - "name": "VSPHERE_AZ_1", - "description": "Description TBD" - }, - { - "name": "VSPHERE_AZ_2", - "description": "Description TBD" - }, - { - "name": "VSPHERE_SERVER", - "description": "Description TBD" - }, - { - "name": "VSPHERE_DATACENTER", - "description": "Description TBD" - }, - { - "name": "VSPHERE_RESOURCE_POOL", - "description": "Description TBD" - }, - { - "name": "VSPHERE_DATASTORE", - "description": "Description TBD" - }, - { - "name": "VSPHERE_FOLDER", - "description": "Description TBD" - }, - { - "name": "VSPHERE_STORAGE_POLICY_ID", - "description": "Description TBD" - }, - { - "name": "VSPHERE_TLS_THUMBPRINT", - "description": "Description TBD" - }, - { - "name": "TKG_CUSTOM_IMAGE_REPOSITORY", - "description": "Description TBD" - }, - { - "name": "TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY", - "description": "Description TBD" - }, - { - "name": "TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE", - "description": "Description TBD" - }, - { - "name": "TKG_HTTP_PROXY", - "description": "Description TBD" - }, - { - "name": "TKG_HTTPS_PROXY", - "description": "Description TBD" - }, - { - "name": "TKG_NO_PROXY", - "description": "Description TBD" - }, - { - "name": "TKG_PROXY_CA_CERT", - "description": "Description TBD" - }, - { - "name": "TKG_IP_FAMILY", - "description": "Description TBD" - }, - { - "name": "CONTROL_PLANE_NODE_NAMESERVERS", - "description": "Description TBD" - }, - { - "name": "WORKER_NODE_NAMESERVERS", - "description": "Description TBD" - }, - { - "name": "ENABLE_AUDIT_LOGGING", - "description": "Description TBD" - }, - { - "name": "CLUSTER_CIDR", - "description": "Description TBD" - }, - { - "name": "SERVICE_CIDR", - "description": "Description TBD" - }, - { - "name": "CONTROL_PLANE_MACHINE_COUNT", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_0", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_1", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_2", - "description": "Description TBD" - }, - { - "name": "OS_NAME", - "description": "Description TBD" - }, - { - "name": "OS_VERSION", - "description": "Description TBD" - }, - { - "name": "OS_ARCH", - "description": "Description TBD" - }, - { - "name": "ENABLE_AUTOSCALER", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_0", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_0", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_1", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_1", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_2", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_2", - "description": "Description TBD" - }, - { - "name": "KUBERNETES_VERSION", - "description": "Description TBD" - } - ] - }, - { - "name": "Cluster class fixed values (can not be overridden)", - "variables": [ - { - "name": "INFRASTRUCTURE_PROVIDER", - "description": "fixed_value_content1" - }, - { - "name": "ENABLE_MHC", - "description": "fixed_value_content1" - }, - { - "name": "ENABLE_MHC_WORKER_NODE", - "description": "fixed_value_content1" - }, - { - "name": "ENABLE_MHC_CONTROL_PLANE", - "description": "fixed_value_content1" - }, - { - "name": "MHC_UNKNOWN_STATUS_TIMEOUT", - "description": "fixed_value_content1" - }, - { - "name": "MHC_FALSE_STATUS_TIMEOUT", - "description": "fixed_value_content1" - }, - { - "name": "PROVIDER_TYPE", - "description": "fixed_value_content1" - } - ] - } - ] - } - ], - "aws" : [ - { - "name" : "clusterClassName TBD", - "categories" : [ - { - "name": "User supplied values", - "variables": [ - { - "name": "CLUSTER_NAME", - "description": "Description TBD" - }, - { - "name": "CLUSTER_CLASS", - "description": "Description TBD" - } - ] - }, - { - "name": "Cluster class default values (can be overridden)", - "variables": [ - { - "name": "CLUSTER_PLAN", - "description": "Description TBD" - }, - { - "name": "CLUSTER_API_SERVER_PORT", - "description": "Description TBD" - }, - { - "name": "SIZE", - "description": "Description TBD" - }, - { - "name": "CONTROLPLANE_SIZE", - "description": "Description TBD" - }, - { - "name": "WORKER_SIZE", - "description": "Description TBD" - }, - { - "name": "AWS_REGION", - "description": "Description TBD" - }, - { - "name": "AWS_LOAD_BALANCER_SCHEME_INTERNAL", - "description": "Description TBD" - }, - { - "name": "AWS_NODE_AZ", - "description": "Description TBD" - }, - { - "name": "AWS_NODE_AZ_1", - "description": "Description TBD" - }, - { - "name": "AWS_NODE_AZ_2", - "description": "Description TBD" - }, - { - "name": "AWS_VPC_ID", - "description": "Description TBD" - }, - { - "name": "AWS_PRIVATE_SUBNET_ID", - "description": "Description TBD" - }, - { - "name": "AWS_PUBLIC_SUBNET_ID", - "description": "Description TBD" - }, - { - "name": "AWS_PUBLIC_SUBNET_ID_1", - "description": "Description TBD" - }, - { - "name": "AWS_PRIVATE_SUBNET_ID_1", - "description": "Description TBD" - }, - { - "name": "AWS_PUBLIC_SUBNET_ID_2", - "description": "Description TBD" - }, - { - "name": "AWS_PRIVATE_SUBNET_ID_2", - "description": "Description TBD" - }, - { - "name": "AWS_VPC_CIDR", - "description": "Description TBD" - }, - { - "name": "AWS_PRIVATE_NODE_CIDR", - "description": "Description TBD" - }, - { - "name": "AWS_PUBLIC_NODE_CIDR", - "description": "Description TBD" - }, - { - "name": "AWS_PRIVATE_NODE_CIDR_1", - "description": "Description TBD" - }, - { - "name": "AWS_PUBLIC_NODE_CIDR_1", - "description": "Description TBD" - }, - { - "name": "AWS_PRIVATE_NODE_CIDR_2", - "description": "Description TBD" - }, - { - "name": "AWS_PUBLIC_NODE_CIDR_2", - "description": "Description TBD" - }, - { - "name": "AWS_SECURITY_GROUP_APISERVER_LB", - "description": "Description TBD" - }, - { - "name": "AWS_SECURITY_GROUP_BASTION", - "description": "Description TBD" - }, - { - "name": "AWS_SECURITY_GROUP_CONTROLPLANE", - "description": "Description TBD" - }, - { - "name": "AWS_SECURITY_GROUP_LB", - "description": "Description TBD" - }, - { - "name": "AWS_SECURITY_GROUP_NODE", - "description": "Description TBD" - }, - { - "name": "AWS_IDENTITY_REF_KIND", - "description": "Description TBD" - }, - { - "name": "AWS_IDENTITY_REF_NAME", - "description": "Description TBD" - }, - { - "name": "AWS_CONTROL_PLANE_OS_DISK_SIZE_GIB", - "description": "Description TBD" - }, - { - "name": "AWS_NODE_OS_DISK_SIZE_GIB", - "description": "Description TBD" - }, - { - "name": "CONTROL_PLANE_MACHINE_TYPE", - "description": "Description TBD" - }, - { - "name": "NODE_MACHINE_TYPE", - "description": "Description TBD" - }, - { - "name": "NODE_MACHINE_TYPE_1", - "description": "Description TBD" - }, - { - "name": "NODE_MACHINE_TYPE_2", - "description": "Description TBD" - }, - { - "name": "AWS_SSH_KEY_NAME", - "description": "Description TBD" - }, - { - "name": "BASTION_HOST_ENABLED", - "description": "Description TBD" - }, - { - "name": "TKG_CUSTOM_IMAGE_REPOSITORY", - "description": "Description TBD" - }, - { - "name": "TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY", - "description": "Description TBD" - }, - { - "name": "TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE", - "description": "Description TBD" - }, - { - "name": "TKG_HTTP_PROXY", - "description": "Description TBD" - }, - { - "name": "TKG_HTTPS_PROXY", - "description": "Description TBD" - }, - { - "name": "TKG_NO_PROXY", - "description": "Description TBD" - }, - { - "name": "TKG_PROXY_CA_CERT", - "description": "Description TBD" - }, - { - "name": "TKG_IP_FAMILY", - "description": "Description TBD" - }, - { - "name": "ENABLE_AUDIT_LOGGING", - "description": "Description TBD" - }, - { - "name": "CLUSTER_CIDR", - "description": "Description TBD" - }, - { - "name": "SERVICE_CIDR", - "description": "Description TBD" - }, - { - "name": "CONTROL_PLANE_MACHINE_COUNT", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_0", - "description": "Description TBD" - }, - { - "name": "BASTION_HOST_ENABLED", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_1", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_2", - "description": "Description TBD" - }, - { - "name": "OS_NAME", - "description": "Description TBD" - }, - { - "name": "OS_VERSION", - "description": "Description TBD" - }, - { - "name": "OS_ARCH", - "description": "Description TBD" - }, - { - "name": "ENABLE_AUTOSCALER", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_0", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_0", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_1", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_1", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_2", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_2", - "description": "Description TBD" - }, - { - "name": "KUBERNETES_VERSION", - "description": "Description TBD" - }, - { - "name": "AWS_AMI_ID", - "description": "Description TBD" - } - ] - }, - { - "name": "Cluster class fixed values (can not be overridden)", - "variables": [ - { - "name": "INFRASTRUCTURE_PROVIDER", - "description": "Description TBD" - }, - { - "name": "ENABLE_MHC", - "description": "Description TBD" - }, - { - "name": "ENABLE_MHC_WORKER_NODE", - "description": "Description TBD" - }, - { - "name": "ENABLE_MHC_CONTROL_PLANE", - "description": "Description TBD" - }, - { - "name": "MHC_UNKNOWN_STATUS_TIMEOUT", - "description": "Description TBD" - }, - { - "name": "MHC_FALSE_STATUS_TIMEOUT", - "description": "Description TBD" - }, - { - "name": "PROVIDER_TYPE", - "description": "Description TBD" - } - ] - } - ] - } - ], - "azure" : [ - { - "name" : "clusterClassName TBD", - "categories" : [ - { - "name": "User supplied values", - "variables": [ - { - "name": "CLUSTER_NAME", - "description": "Description TBD" - }, - { - "name": "CLUSTER_CLASS", - "description": "Description TBD" - }, - { - "name": "AZURE_RESOURCE_GROUP", - "description": "Description TBD" - } - ] - }, - { - "name": "Cluster class default values (can be overridden)", - "variables": [ - { - "name": "CLUSTER_PLAN", - "description": "Description TBD" - }, - { - "name": "CLUSTER_API_SERVER_PORT", - "description": "Description TBD" - }, - { - "name": "SIZE", - "description": "Description TBD" - }, - { - "name": "CONTROLPLANE_SIZE", - "description": "Description TBD" - }, - { - "name": "WORKER_SIZE", - "description": "Description TBD" - }, - { - "name": "AZURE_ENVIRONMENT", - "description": "Description TBD" - }, - { - "name": "AZURE_ENVIRONMENT", - "description": "Description TBD" - }, - { - "name": "AZURE_SUBSCRIPTION_ID", - "description": "Description TBD" - }, - { - "name": "AZURE_CLIENT_ID", - "description": "Description TBD" - }, - { - "name": "AZURE_CLIENT_SECRET", - "description": "Description TBD" - }, - { - "name": "AZURE_LOCATION", - "description": "Description TBD" - }, - { - "name": "AZURE_SSH_PUBLIC_KEY_B64", - "description": "Description TBD" - }, - { - "name": "AZURE_CONTROL_PLANE_MACHINE_TYPE", - "description": "Description TBD" - }, - { - "name": "AZURE_NODE_MACHINE_TYPE", - "description": "Description TBD" - }, - { - "name": "AZURE_ENABLE_ACCELERATED_NETWORKING", - "description": "Description TBD" - }, - { - "name": "AZURE_VNET_RESOURCE_GROUP", - "description": "Description TBD" - }, - { - "name": "AZURE_VNET_NAME", - "description": "Description TBD" - }, - { - "name": "AZURE_VNET_CIDR", - "description": "Description TBD" - }, - { - "name": "AZURE_CONTROL_PLANE_SUBNET_NAME", - "description": "Description TBD" - }, - { - "name": "AZURE_CONTROL_PLANE_SUBNET_CIDR", - "description": "Description TBD" - }, - { - "name": "AZURE_CONTROL_PLANE_SUBNET_SECURITY_GROUP", - "description": "Description TBD" - }, - { - "name": "AZURE_NODE_SUBNET_CIDR", - "description": "Description TBD" - }, - { - "name": "AZURE_NODE_SUBNET_SECURITY_GROUP", - "description": "Description TBD" - }, - { - "name": "AZURE_NODE_AZ", - "description": "Description TBD" - }, - { - "name": "AZURE_NODE_AZ_1", - "description": "Description TBD" - }, - { - "name": "AZURE_NODE_AZ_2", - "description": "Description TBD" - }, - { - "name": "AZURE_CUSTOM_TAGS", - "description": "Description TBD" - }, - { - "name": "AZURE_CONTROL_PLANE_OS_DISK_SIZE_GIB", - "description": "Description TBD" - }, - { - "name": "AZURE_CONTROL_PLANE_OS_DISK_STORAGE_ACCOUNT_TYPE", - "description": "Description TBD" - }, - { - "name": "AZURE_NODE_OS_DISK_SIZE_GIB", - "description": "Description TBD" - }, - { - "name": "AZURE_NODE_OS_DISK_STORAGE_ACCOUNT_TYPE", - "description": "Description TBD" - }, - { - "name": "AZURE_CONTROL_PLANE_DATA_DISK_SIZE_GIB", - "description": "Description TBD" - }, - { - "name": "AZURE_ENABLE_NODE_DATA_DISK", - "description": "Description TBD" - }, - { - "name": "AZURE_NODE_DATA_DISK_SIZE_GIB", - "description": "Description TBD" - }, - { - "name": "AZURE_ENABLE_PRIVATE_CLUSTER", - "description": "Description TBD" - }, - { - "name": "AZURE_FRONTEND_PRIVATE_IP", - "description": "Description TBD" - }, - { - "name": "AZURE_ENABLE_CONTROL_PLANE_OUTBOUND_LB", - "description": "Description TBD" - }, - { - "name": "AZURE_ENABLE_NODE_OUTBOUND_LB", - "description": "Description TBD" - }, - { - "name": "AZURE_CONTROL_PLANE_OUTBOUND_LB_FRONTEND_IP_COUNT", - "description": "Description TBD" - }, - { - "name": "AZURE_NODE_OUTBOUND_LB_FRONTEND_IP_COUNT", - "description": "Description TBD" - }, - { - "name": "AZURE_NODE_OUTBOUND_LB_IDLE_TIMEOUT_IN_MINUTES", - "description": "Description TBD" - }, - { - "name": "AZURE_IMAGE_ID", - "description": "Description TBD" - }, - { - "name": "AZURE_IMAGE_RESOURCE_GROUP", - "description": "Description TBD" - }, - { - "name": "AZURE_IMAGE_NAME", - "description": "Description TBD" - }, - { - "name": "AZURE_IMAGE_SUBSCRIPTION_ID", - "description": "Description TBD" - }, - { - "name": "AZURE_IMAGE_GALLERY", - "description": "Description TBD" - }, - { - "name": "AZURE_IMAGE_PUBLISHER", - "description": "Description TBD" - }, - { - "name": "AZURE_IMAGE_PUBLISHER", - "description": "Description TBD" - }, - { - "name": "AZURE_IMAGE_SKU", - "description": "Description TBD" - }, - { - "name": "AZURE_IMAGE_THIRD_PARTY", - "description": "Description TBD" - }, - { - "name": "AZURE_IMAGE_VERSION", - "description": "Description TBD" - }, - { - "name": "AZURE_IDENTITY_NAME", - "description": "Description TBD" - }, - { - "name": "AZURE_IDENTITY_NAMESPACE", - "description": "Description TBD" - }, - { - "name": "TKG_CUSTOM_IMAGE_REPOSITORY", - "description": "Description TBD" - }, - { - "name": "TKG_CUSTOM_IMAGE_REPOSITORY_SKIP_TLS_VERIFY", - "description": "Description TBD" - }, - { - "name": "TKG_CUSTOM_IMAGE_REPOSITORY_CA_CERTIFICATE", - "description": "Description TBD" - }, - { - "name": "TKG_HTTP_PROXY", - "description": "Description TBD" - }, - { - "name": "TKG_HTTPS_PROXY", - "description": "Description TBD" - }, - { - "name": "TKG_NO_PROXY", - "description": "Description TBD" - }, - { - "name": "TKG_PROXY_CA_CERT", - "description": "Description TBD" - }, - { - "name": "TKG_IP_FAMILY", - "description": "Description TBD" - }, - { - "name": "ENABLE_AUDIT_LOGGING", - "description": "Description TBD" - }, - { - "name": "CLUSTER_CIDR", - "description": "Description TBD" - }, - { - "name": "SERVICE_CIDR", - "description": "Description TBD" - }, - { - "name": "CONTROL_PLANE_MACHINE_COUNT", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_0", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_1", - "description": "Description TBD" - }, - { - "name": "WORKER_MACHINE_COUNT_2", - "description": "Description TBD" - }, - { - "name": "OS_NAME", - "description": "Description TBD" - }, - { - "name": "OS_VERSION", - "description": "Description TBD" - }, - { - "name": "OS_ARCH", - "description": "Description TBD" - }, - { - "name": "ENABLE_AUTOSCALER", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_0", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_0", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_1", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_1", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MIN_SIZE_2", - "description": "Description TBD" - }, - { - "name": "AUTOSCALER_MAX_SIZE_2", - "description": "Description TBD" - }, - { - "name": "KUBERNETES_VERSION", - "description": "Description TBD" - } - ] - }, - { - "name": "Cluster class fixed values (can not be overridden)", - "variables": [ - { - "name": "INFRASTRUCTURE_PROVIDER", - "description": "Description TBD" - }, - { - "name": "ENABLE_MHC", - "description": "Description TBD" - }, - { - "name": "ENABLE_MHC_WORKER_NODE", - "description": "Description TBD" - }, - { - "name": "ENABLE_MHC_CONTROL_PLANE", - "description": "Description TBD" - }, - { - "name": "MHC_UNKNOWN_STATUS_TIMEOUT", - "description": "Description TBD" - }, - { - "name": "MHC_FALSE_STATUS_TIMEOUT", - "description": "Description TBD" - }, - { - "name": "PROVIDER_TYPE", - "description": "Description TBD" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.html b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.html deleted file mode 100644 index 8854e714f7..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
- Two cluster classes will be created for this management cluster. - These can be used in the deployment of workload clusters. When creating a workload cluster, - some values must be supplied by the user. Others are defaulted by the cluster class but - can be overridden or baked into the cluster class and can not be overridden. - For contextual help on cluster classes click here -
- - - {{clusterClass.name}} - - {{category.name}} - - {{variable.name}} - {{variable.description}} - - - - diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.scss b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.scss deleted file mode 100644 index 30f9522e02..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.scss +++ /dev/null @@ -1,34 +0,0 @@ -:host ::ng-deep { - .description-wrapper { - margin-bottom: 20px; - } - clr-stack-block { - .stack-block-content { - background-color: initial !important; - } - clr-stack-block { - .stack-block-label[tabindex="0"]{ - background-color: #fafafa; - } - .stack-children .stack-block-label{ - padding-left: 3rem; - } - } - } -} - -.dark { - :host ::ng-deep clr-stack-block { - .stack-block-content { - background-color: initial !important; - } - clr-stack-block { - .stack-block-label[tabindex="0"]{ - background-color: #1B2A32; - } - .stack-children .stack-block-label{ - padding-left: 5rem; - } - } - } -} \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.spec.ts deleted file mode 100644 index c4089ed9e6..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ClusterClassInfoComponent } from './cluster-class-info.component'; - -describe('ClusterClassInfoComponent', () => { - let component: ClusterClassInfoComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ ClusterClassInfoComponent ] - }).compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(ClusterClassInfoComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.ts deleted file mode 100644 index ebfc8ee731..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/cluster-class-info/cluster-class-info.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -// Angular imports -import { Component, Input, OnInit } from '@angular/core'; - -// App imports -import clusterClassData from './cluster-class-data.json'; - -interface ClusterClass { - name: string, - categories: Array<{ - name: string - variables: Array<{ - name: string, - description: string - }> - }> -}; - -@Component({ - selector: 'app-cluster-class-info', - templateUrl: './cluster-class-info.component.html', - styleUrls: ['./cluster-class-info.component.scss'] -}) -export class ClusterClassInfoComponent implements OnInit { - @Input() providerType: string; - - clusterClasses: Array = []; - - ngOnInit(): void { - if (this.providerType) { - this.clusterClasses = clusterClassData[this.providerType.toLowerCase()]; - } - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/interfaces/tkg-labels.interface.ts b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/interfaces/tkg-labels.interface.ts deleted file mode 100644 index 6d8de9f9c4..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/interfaces/tkg-labels.interface.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { FormArray, FormGroup } from '@angular/forms'; - -export interface TKGLabelsConfig { - label: { - title: string; - tooltipText: string; - helperText?: string; - }; - forms: { - parent: FormGroup; // the parent form group - control: FormArray; // the control of the labels form array - }; - fields: { - [key: string]: any; - }; -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.html b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.html deleted file mode 100644 index d2e1d836e6..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.html +++ /dev/null @@ -1,95 +0,0 @@ -
-
- - - - {{ config.label.helperText }} -
- -
-
- - - - - - {{ config?.fields?.clusterTypeDescriptor }} Cluster label keys must start and end with an - alphanumeric - character, and can contain only letters, numbers, hyphens, underscores, and dots. - - - {{ config?.fields?.clusterTypeDescriptor }} Cluster label keys must not include whitespace on ends. - - - {{ config?.fields?.clusterTypeDescriptor }} Cluster label keys max length is 63 characters. - - - A Label with the same key already exists. - - - {{ config?.fields?.clusterTypeDescriptor }} Cluster label value is required if its value is not - empty. - - - - : - - - - - - {{ config?.fields?.clusterTypeDescriptor }} Cluster label values must start and end with an - alphanumeric - character, and can contain only letters, numbers, hyphens, underscores, and dots. - - - {{ config?.fields?.clusterTypeDescriptor }} Cluster label values must not include whitespace on - ends. - - - {{ config?.fields?.clusterTypeDescriptor }} Cluster label values max length is 63 characters. - - - {{ config?.fields?.clusterTypeDescriptor }} Cluster label value is required if its key is not empty. - - - - -
-
- -
- -
-
diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.scss b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.scss deleted file mode 100644 index 26ee508c8e..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.scss +++ /dev/null @@ -1,20 +0,0 @@ -.label-details { - align-items: baseline; - padding-left: 0.6rem; -} - -.btn-delete { - border: none; -} - -.btn-add { - margin-top: 1rem; -} - -.label-container { - margin-left: 0; -} - -.err-label { - max-width: 8.7rem; -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.spec.ts deleted file mode 100644 index e0be42a58d..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.spec.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { TkgLabelsComponent } from './tkg-labels.component'; -import { FormArray, FormBuilder, FormControl, FormGroup } from "@angular/forms"; -import { ControlType } from "../../../field-mapping/FieldMapping"; -import { SimpleValidator } from "../../../constants/validation.constants"; -import { TKGLabelsConfig } from "./interfaces/tkg-labels.interface"; -import { FormUtils } from "../../../utils/form-utils"; - -describe('TkgLabelsComponent', () => { - let component: TkgLabelsComponent; - let parentFormGroup: FormGroup; - - const formBuilder = new FormBuilder(); - const tkgLabelsConfig: TKGLabelsConfig = { - label: { - title: 'LABELS (OPTIONAL)', - tooltipText: `Optionally specify labels for the Management cluster.` - }, - forms: { - parent: null, - control: null - }, - fields: { - clusterType: 'Management', - fieldMapping: { - name: 'clusterLabels', - label: 'LABELS (OPTIONAL)', - controlType: ControlType.FormArray, - children: [ - { - name: 'key', - defaultValue: '', - controlType: ControlType.FormControl, - validators: [ - SimpleValidator.IS_VALID_LABEL_OR_ANNOTATION, - SimpleValidator.RX_UNIQUE, - SimpleValidator.RX_REQUIRED_IF_VALUE - ] - }, - { - name: 'value', - defaultValue: '', - controlType: ControlType.FormControl, - validators: [SimpleValidator.IS_VALID_LABEL_OR_ANNOTATION, SimpleValidator.RX_REQUIRED_IF_KEY] - } - ] - } - } - }; - - beforeEach(() => { - parentFormGroup = formBuilder.group({ - clusterLabels: formBuilder.array([ - formBuilder.group({ - key: [''], - value: [''] - }) - ]) - }); - tkgLabelsConfig.forms.parent = parentFormGroup; - tkgLabelsConfig.forms.control = parentFormGroup.get('clusterLabels') as FormArray; - - component = new TkgLabelsComponent(); - component.config = tkgLabelsConfig; - }); - - it('should create label', () => { - const group = component.createLabel(); - expect(group.controls.key).toBeInstanceOf(FormControl); - expect(group.controls.value).toBeInstanceOf(FormControl); - }) - - it('should not add new Label on form invalid', () => { - spyOn(component.labelsFormArray, 'markAllAsTouched'); - spyOn(component.labelsFormArray, 'push'); - - spyOnProperty(component.labelsFormArray, 'invalid').and.returnValue(true); - - component.addNewLabel(); - - expect(component.labelsFormArray.markAllAsTouched).toHaveBeenCalledTimes(1); - expect(component.labelsFormArray.push).not.toHaveBeenCalledTimes(1); - - }); - - it('should add new Label on form valid', () => { - spyOn(component.labelsFormArray, 'markAllAsTouched'); - spyOn(FormUtils, 'addDynamicControl'); - - spyOnProperty(component.labelsFormArray, 'invalid').and.returnValue(false); - - expect(component.labelsFormArray.controls.length).toEqual(1); - - component.addNewLabel(); - - expect(component.labelsFormArray.markAllAsTouched).toHaveBeenCalledTimes(1); - expect(FormUtils.addDynamicControl).toHaveBeenCalledTimes(2); - expect(component.labelsFormArray.length).toEqual(2); - - }); - - it('should delete label', () => { - component.deleteLabel(0); - expect(component.labelsFormArray.length).toEqual(0) - }) - -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.ts b/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.ts deleted file mode 100644 index c597271c4d..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/components/widgets/tkg-labels/tkg-labels.component.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Component, Input, OnChanges, OnDestroy, SimpleChanges } from '@angular/core'; -import { FormArray, FormGroup } from '@angular/forms'; -import { Subject } from 'rxjs'; -import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; -import { ValidatorEnum } from '../../../constants/validation.constants'; -import { FieldMapping } from '../../../field-mapping/FieldMapping'; -import { FormUtils } from '../../../utils/form-utils'; -import { TKGLabelsConfig } from './interfaces/tkg-labels.interface'; - -@Component({ - selector: 'app-tkg-labels', - templateUrl: './tkg-labels.component.html', - styleUrls: ['./tkg-labels.component.scss'] -}) -export class TkgLabelsComponent implements OnChanges, OnDestroy { - @Input() config: TKGLabelsConfig; - - validatorEnum = ValidatorEnum; - - stopSubscriptions$ = new Subject(); - - get labelsFormArray(): FormArray { - return this.config.forms.control as FormArray; - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes.config.previousValue !== changes.config.currentValue && changes.config.currentValue) { - this.labelsFormArray.valueChanges - .pipe( - takeUntil(this.stopSubscriptions$), - distinctUntilChanged((k, v) => JSON.stringify(k) === JSON.stringify(v)) - ) - .subscribe(() => { - this.labelsFormArray.controls.forEach((label: FormGroup) => { - (this.config.fields.fieldMapping as FieldMapping).children.forEach((field) => - label.get(field.name).updateValueAndValidity() - ); - }); - }); - } - } - - createLabel(): FormGroup { - const labelFormGroup = new FormGroup({}); - (this.config.fields.fieldMapping as FieldMapping).children.forEach((fieldMapping) => - FormUtils.addDynamicControl(labelFormGroup, '', fieldMapping) - ); - - return labelFormGroup; - } - - deleteLabel(index: number): void { - this.labelsFormArray.removeAt(index); - } - - addNewLabel(): void { - this.labelsFormArray.markAllAsTouched(); - - if (this.labelsFormArray.invalid) { - return; - } - this.labelsFormArray.push(this.createLabel()); - } - - ngOnDestroy(): void { - this.stopSubscriptions$.next(); - this.stopSubscriptions$.complete(); - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/constants/validation.constants.ts b/tkg/web/src/app/views/landing/wizard/shared/constants/validation.constants.ts deleted file mode 100644 index 769ffd1273..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/constants/validation.constants.ts +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @enum Url pattern regex. - * (eg: http://something.com or https://something.com) - */ -export const urlPattern = new RegExp(/^(https?:\/\/){1}([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/); - -/** - * @enum IP only pattern regex. - * (eg: 192.168.111.40) - */ -export const ipOnlyPattern = new RegExp(/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/); - -/** - * @enum Host only pattern regex. - * (eg: vsphere.local.com) - */ -export const hostOnlyPattern = new RegExp(/^(?!-)([a-zA-Z0-9-])+((\.[a-zA-Z0-9-]+)+)([a-zA-Z0-9])$/); - -/** - * @enum Host or Ip pattern regex - * (eg: 192.168.111.40 or vsphere.local.com) - */ -// tslint:disable-next-line:max-line-length -export const hostOrIpPattern = new RegExp(/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$|^(?!-)([a-zA-Z0-9-])+((\.[a-zA-Z0-9-]+)+)([a-zA-Z0-9])$/); - -/** - * @enum No trailing slash pattern regex. - * (eg: no vsphere.local.com/) - */ -export const noTrailingSlash = new RegExp(/^(.*)\/$/); - -/** - * Cluster name pattern - */ -export const clusterNamePattern = /^[a-z0-9A-Z][a-z0-9A-Z\.\-_]*[a-z0-9A-Z]$/; - -/** - * @enum ValidatorEnum error enum for different validation requirements - */ -export enum ValidatorEnum { - // shared enums - REQUIRED = 'required', - WHITESPACE = 'whitespace', - EMAIL = 'email', - VALID_IP = 'valid IP address', - VALID_HOST_IP = 'valid host IP address', // Valid ip address excluding ###.###.###.0 and ###.###.###.255 - COMMA_SEPARATED_IPS = 'comma separated ips', - COMMA_SEPARATED_IPS_OR_CIDRS = 'comma separated ips or cidrs', - CIDR_OVERLAP_CIDR = 'cidr overlap cidr', - CIDR_WITHIN_CIDR = 'cidr within cidr', - VALID_FQDN = 'valid FQDN', - VALID_IP_OR_FQDN = 'valid IP or FQDN', - TRAILING_SLASH = 'no trailing slash', - SUBNET_IN_RANGE = 'subnet within range', - IP_IN_SUBNET_RANGE = 'IP in subnet range', - IP_NOT_IN_SUBNET_RANGE = 'IP not in subnet range', - VALID_PORT = 'valid port', - IP_RANGE = 'ip range from small to large', - IP_RANGE_OVERLAP = 'ip range overlap', - CONFIRM_PASSWORD = 'confirm password', - NUMERIC_ONLY = 'numeric only', - PATTERN = 'pattern', - GREATER_THAN_ZERO = 'number greater than zero', - MIN = 'min', - MAX = 'max', - MIN_LEN = 'minlength', - MAX_LEN = 'maxlength', - NO_OVERLAP_IPS = 'no overlap ips', - COMMA_SEPARATED_WORDS = 'comma separated words', - INCLUDES_URL_FRAGMENT = 'no url fragment', - INCLUDES_QUERY_PARAMS = 'no query params', - NOT_IN_DATALIST = 'not in datalist', - TRUE = 'true', - - // Networking enums - NETWORKING_IP_UNIQUE = 'networking step ip unique', - NETWORKING_NODE_IP_UNIQ = 'networking step node ip unique', - NETWORKING_NODE_IP_SCOPE_INTERSECTION = 'networking IP range intersection', - NETWORKING_NODE_IP_SCOPE_UNIQ = 'networking area contains network IP', - FLOATING_IP_OVERLAP_SUBNET = 'floating ip overlap subnet', - VLAN_OUT_OF_RANGE = 'vlan out of range', - IP_RANGE_MIN = 'min ip count in ip range', - - // AZ step enums - AVAILABILITY_ZONE_UNIQUE = 'availability zone unique', - VALID_RESOURCE_GROUP_NAME = 'valid resource group name', - UNIQUE_RESOURCE_GROUP_NAME = 'unique resource group name', - HTTP_OR_HTTPS = 'http or https', - - // Cluster name - VALID_CLUSTER_NAME = 'cluster name valid', - - // Metadata label - LABEL_UNIQUE = 'label unique', - UNIQUE = 'unique' -} - -// SimpleValidator identifies validators available from the Validation service -// which do not require special initialization (with other values or controls) -export enum SimpleValidator { - IS_COMMA_SEPARATED_LIST, - IS_HTTP_OR_HTTPS, - IS_NUMBER_POSITIVE, - IS_NUMERIC_ONLY, - IS_STRING_WITHOUT_QUERY_PARAMS, - IS_STRING_WITHOUT_URL_FRAGMENT, - IS_TRUE, - IS_VALID_CLUSTER_NAME, - IS_VALID_FQDN, - IS_VALID_FQDN_OR_IP, - IS_VALID_FQDN_OR_IP_HTTPS, - IS_VALID_FQDN_OR_IP_LIST, - IS_VALID_FQDN_OR_IPV6, - IS_VALID_FQDN_OR_IPV6_HTTPS, - IS_VALID_IP, - IS_VALID_IP_LIST, - IS_VALID_IP_NETWORK_SEGMENT, - IS_VALID_IPV6_NETWORK_SEGMENT, - IS_VALID_LABEL_OR_ANNOTATION, - IS_VALID_PORT, - IS_VALID_RESOURCE_GROUP_NAME, - NO_WHITE_SPACE, - NO_TRAILING_SLASH, - RX_UNIQUE, - RX_REQUIRED_IF_VALUE, - RX_REQUIRED_IF_KEY -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/constants/wizard.constants.ts b/tkg/web/src/app/views/landing/wizard/shared/constants/wizard.constants.ts deleted file mode 100644 index 4f3cf2ff11..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/constants/wizard.constants.ts +++ /dev/null @@ -1,45 +0,0 @@ - -export interface NodeType { - id: string; - name: string; -} - -export const managementClusterPlugin = 'management-cluster'; - -export enum FeatureFlags { - STANDALONE_CLUSTER = 'standalone-cluster-mode', - CLUSTER_NAME_REQUIRED = 'cluster-name-required', -} - -export enum ClusterPlan { - DEV = 'dev', - PROD = 'prod', -} - -// ClusterType enum are data values sent to the backend to specify the cluster type -export enum ClusterType { - Management = 'management', - Standalone = 'standalone', -} - -export enum IdentityManagementType { - LDAP = 'ldap', - NONE = 'none', - OIDC = 'oidc', -} - -export enum WizardStep { - IDENTITY = 'identity', - METADATA= 'metadata', - NETWORK = 'network', - OSIMAGE = 'osimage', -} - -export enum WizardForm { - CEIP = 'ceipOptInForm', - IDENTITY = 'identityForm', - LOADBALANCER = 'loadBalancerForm', - METADATA= 'metadataForm', - NETWORK = 'networkForm', - OSIMAGE = 'osImageForm', -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/field-mapping/FieldMapUtilities.ts b/tkg/web/src/app/views/landing/wizard/shared/field-mapping/FieldMapUtilities.ts deleted file mode 100644 index 9b0329e606..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/field-mapping/FieldMapUtilities.ts +++ /dev/null @@ -1,168 +0,0 @@ -// Angular imports -import { Injectable } from '@angular/core'; -import { ValidatorFn, Validators } from '@angular/forms'; -// App imports -import AppServices from '../../../../../shared/service/appServices'; -import { Cloneable } from '../utils/cloneable'; -import { FieldMapping, StepMapping } from './FieldMapping'; -import { managementClusterPlugin } from '../constants/wizard.constants'; -import { ValidationService } from '../validation/validation.service'; - -@Injectable() -export class FieldMapUtilities { - constructor(private validationService: ValidationService) {} - - cloneStepMapping(stepMapping: StepMapping): StepMapping { - return Cloneable.deepCopy(stepMapping); - } - - // inserts the given field mappings into stepMapping.fieldMappings after the given field; returns false if field not found - // However, if field is empty (null, undefined or blank) mappings are inserted at beginning - insertFieldMappingsAfter(stepMapping: StepMapping, field: string, mappings: FieldMapping[]): boolean { - let index = -1; - - if (field && field.length) { - index = stepMapping.fieldMappings.findIndex(fieldMapping => fieldMapping.name === field); - if (index < 0) { - console.error('insertFieldMappingsAfter() is unable to find field ' + field + ' in provided stepMapping object'); - return false; - } - } - // Note: we increment index before inserting because we're inserting AFTER - mappings.forEach(newFieldMapping => stepMapping.fieldMappings.splice(++index, 0, newFieldMapping)); - } - - getActiveFieldMappings(stepMapping: StepMapping): FieldMapping[] { - return stepMapping.fieldMappings.filter(fieldMapping => !fieldMapping.deactivated); - } - - // getLabeledFieldsWithStoredData() is called to determine what fields to display on confirmation page - getLabeledFieldsWithStoredData(wizard, step: string, stepMapping: StepMapping): string[] { - const result = this.getActiveFieldMappings(stepMapping) - .filter(fieldMapping => fieldMapping.label) - .filter(fieldMapping => AppServices.userDataService.hasStoredData({wizard, step, field: fieldMapping.name})) - .reduce((accumulator, fieldMapping) => { - accumulator.push(fieldMapping.name); return accumulator; - }, []); - return result; - } - - // returns a Map of fieldName => labels; the map is offered to HTML pages so they can use the labels, and for confirmation page - getFieldLabelMap(stepMapping: StepMapping): Map { - return this.getActiveFieldMappings(stepMapping) - .filter(fieldMapping => fieldMapping.label) - .reduce>((accumulator, fieldMapping) => { - accumulator[fieldMapping.name] = fieldMapping.label; - return accumulator; - }, new Map()); - } - - getFieldMapping(field: string, stepMapping: StepMapping): FieldMapping { - if (!stepMapping.fieldMappings) { - console.error('trying to getFieldMapping for field ' + field + ', but stepMapping has no fieldMappings'); - return null; - } - return stepMapping.fieldMappings.find(fieldMapping => fieldMapping.name === field); - } - - getFieldMappingsToRestore(stepMapping: StepMapping): FieldMapping[] { - return this.getActiveFieldMappings(stepMapping).filter(fieldMapping => this.shouldRestoreWithStoredValue(fieldMapping)); - } - - getPrimaryTriggerMappingsToRestore(stepMapping: StepMapping): FieldMapping[] { - return this.getActiveFieldMappings(stepMapping).filter(fieldMapping => fieldMapping.primaryTrigger); - } - - // The control's initial value should be: the savedValue if there is one (and the mapping said to use it), or - // the default value (if the mapping provided one), or the blank value (based on whether the field is boolean). - // Note that if the field is backed by an object (rather than a simple string), a retriever should be passed that can retrieve - // the object based on the saved value (which is presumably a unique identifier of the object) - getInitialValue(wizard, step: string, fieldMapping: FieldMapping) { - const blankValue = fieldMapping.isBoolean ? false : ''; - if (this.shouldInitializeWithStoredValue(fieldMapping)) { - const storedValue = AppServices.userDataService.retrieveStoredValue(wizard, step, fieldMapping); - // note: a storedValue of FALSE should be returned, so be careful with the following "if" test - if (storedValue !== null && storedValue !== undefined) { - return storedValue; - } - } - return fieldMapping.defaultValue ? fieldMapping.defaultValue : blankValue; - } - - shouldAutoSave(fieldMapping: FieldMapping) { - return !fieldMapping.deactivated && !fieldMapping.doNotAutoSave && !fieldMapping.displayOnly && !fieldMapping.neverStore && - (!fieldMapping.featureFlag || this.isFeatureEnabled(fieldMapping.featureFlag)) - } - - // The cases where we should NOT initialize using the stored value: - // (1) The mapping indicates this is the first trigger field (so it needs to be set after listeners are established), or - // (2) The mapping explicitly says not to auto-restore (usually because the value is set in an onChange handler for another field), or - // (3) The mapping indicates the field value is never stored, or - // (4) The mapping indicates the field depends on back-end data which may not have arrived at initialization time. The listener of - // the backend-data-arrived event is then responsible for setting the field's value - // See FieldMapping.ts for a lengthier explanation of the meaning (and expected usage) of these attributes - private shouldInitializeWithStoredValue(fieldMapping: FieldMapping): boolean { - return !fieldMapping.deactivated && !fieldMapping.primaryTrigger && !fieldMapping.doNotAutoRestore && - !fieldMapping.requiresBackendData && !fieldMapping.neverStore; - } - - // This is used primarily in the case where a file was imported and a step wants to use the data to populate the relevant fields - // of the step's form. The form has already been initialized, so all the fields should be set from stored data EXCEPT: - // (1) fields that are marked doNotAutoRestore, since these fields are generally populated by onChange event handlers, - // (2) fields that never store a value, and - // (3) the primaryTrigger field. This is because all the OTHER fields should be set BEFORE the primaryTrigger field is set (in case - // the primaryTrigger field uses any of the other fields' values, - // (4) the field is not used due to a feature flag - private shouldRestoreWithStoredValue(fieldMapping: FieldMapping): boolean { - return !fieldMapping.deactivated && !fieldMapping.doNotAutoRestore && !fieldMapping.neverStore && !fieldMapping.primaryTrigger && - !fieldMapping.displayOnly && this.passesFeatureFlagFilter(fieldMapping); - } - - passesFeatureFlagFilter(fieldMapping: FieldMapping): boolean { - return !fieldMapping.featureFlag || this.isFeatureEnabled(fieldMapping.featureFlag); - } - - getValidatorArray(fieldMapping: FieldMapping): ValidatorFn[] { - const validators = fieldMapping.required ? [Validators.required] : []; - if (fieldMapping.validators && fieldMapping.validators.length > 0) { - fieldMapping.validators.forEach( (simpleValidator, index) => { - const validator = this.validationService.getSimpleValidator(simpleValidator); - if (!validator) { - console.warn('error building field ' + fieldMapping.name + ': unable to find validator ' - + simpleValidator + ' (#' + index + ') in fieldMapping ' + JSON.stringify(fieldMapping)); - } else { - validators.push(validator); - } - }); - } - return validators; - } - - validateFieldMapping(formName: string, fieldMapping: FieldMapping): boolean { - if (fieldMapping.deactivated) { - return true; - } - if (fieldMapping.isBoolean && fieldMapping.required) { - return this.consoleInvalidFieldMapping(formName, fieldMapping.name, 'field cannot be required AND boolean'); - } - if (fieldMapping.backingObject && !fieldMapping.retriever) { - return this.consoleInvalidFieldMapping(formName, fieldMapping.name, 'backingObject requires retriever'); - } - if (fieldMapping.hasNoDomControl && !fieldMapping.retriever) { - return this.consoleInvalidFieldMapping(formName, fieldMapping.name, 'hasNoDomControl requires retriever'); - } - if (fieldMapping.hasNoDomControl && !fieldMapping.restorer) { - return this.consoleInvalidFieldMapping(formName, fieldMapping.name, 'hasNoDomControl requires restorer'); - } - return true; - } - - private consoleInvalidFieldMapping(formName, fieldName, message: string): boolean { - console.error('invalid field mapping for ' + formName + '.' + fieldName + ': ' + message); - return false; - } - - private isFeatureEnabled(featureFlag: string): boolean { - return AppServices.appDataService.isPluginFeatureActivated(managementClusterPlugin, featureFlag); - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/field-mapping/FieldMapping.ts b/tkg/web/src/app/views/landing/wizard/shared/field-mapping/FieldMapping.ts deleted file mode 100644 index 64f348b9e2..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/field-mapping/FieldMapping.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { SimpleValidator } from '../constants/validation.constants'; - -export interface StepMapping { - fieldMappings: FieldMapping[], -} - -export interface BackingObjectMap { - displayField: string, // the field of the backing object used for the display - valueField: string, // the field of the backing object used for the value -} - -export interface FieldMapping { - name: string, // name of field - - backingObject?: BackingObjectMap, // data for using backing object (see notes) - defaultValue?: any, // default value to initialize with - deactivated?: boolean, // set true if field is not used, as with worker instance type when in standalone mode - displayOnly?: boolean, // do not auto-build/store/restore this control; value is "manually" stored and displayed to the user - doNotAutoRestore?: boolean, // do not auto-restore the stored value to this field (field is usually set by change event) - doNotAutoSave?: boolean, // do not save this field when saving the entire mapping (field may be "manually" saved by step) - featureFlag?: string, // a feature flag that needs to be true in order to create this field - hasNoDomControl?: boolean, // this field does not populate a DOM control, so (a) it needs a retriever to get a value, and - // (b) it needs a restorer to restore the value - isBoolean?: boolean, // does the field have a boolean value? - isMap?: boolean, // is the value of this field a Map? - label?: string, // label used when displaying this field, in HTML or in confirmation page (empty if not displayed) - mask?: boolean, // when saving this field, should a masked value be saved instead (for password-like fields) - neverStore?: boolean, // used for temp fields like user input for adding key-value pairs - primaryTrigger?: boolean, // do NOT set value on INIT, but immediately AFTER onChange events are subscribed to - required?: boolean, // should a Validator.REQUIRED validator be added to the validator list? - requiresBackendData?: boolean, // this field requires backend data, so do not initialize but let backend data handler initialize - restorer?: (value: any) => void, // given a saved value (or a retrieved object) this closure will store it. Used esp w/hasNoDomControl - retriever?: (value: any) => any, // given a saved value, this closure will retrieve a backing object. - validators?: SimpleValidator[], // validators used by Clarity framework - - // Enhanced Field Mapping - controlType?: ControlType // type of control to use for this field FormControl, FormArray, FormGroup - children?: FieldMapping[] - displayFunction?: (field) => string -} - -// NOTES on FieldMapping: -// requiresBackendData: -// This is for fields that give the user the option to pick from a list of backend resources or options. The field should use a stored -// value only AFTER the data is retrieved from the back end (and the stored value is then in the list). Therefore, during INIT these -// fields are not populated; the expectation is that the handler for the data-arriving-from-the-back-end event will set the field. -// doNotAutoRestore: -// This is generally for fields that are set in value in response to an onChange event of another field. For example, if the user chooses -// a DEV control plane flavor, then the devInstanceType will be set from the stored value. However, on INIT it makes no sense to set -// the devInstanceType because the user has not selected that control plane flavor. -// primaryTrigger: -// This is for fields that are intended to trigger updates to other fields. During INIT, we DON'T want to set this value immediately. We -// want to wait until all the onChange event listeners are in place first, and THEN set this value (so it will trigger those listeners). -// Note that this does not apply to a triggering field that ITSELF depends on other fields (or on data to arrive from the backend). These -// dependent triggering fields should not have their values set during INIT; they should await whatever field they are dependent on to -// send an event (or wait for the backend data to arrive). They should use doNotAutoRestore (or requiresBackendData). -// backingObject: -// If the value of this field is an OBJECT (not a string or a Map), then backingObject specifies how to get the -// display and value strings from that object. Note that the user needs to supply extra parameters when using methods that store or -// restore the field's value (like buildForm(), restoreForm() or restoreField()). -// The optional TYPE field lets the framework warn to the console if the field's value is of a different type than the mapping expects. -// restorer: -// For fields that are stored in the COMPONENT (rather than in the DOM hierarchy), the framework needs to be supplied a closure that -// will take the value (or retrieved object) and store it in the component (where it "lives"). Most fields store their value (or -// backing object) in the DOM, so they have no need for a "restorer"; the field is expected to have the name "name", and is retrievable -// from a formGroup passed in to a framework method -// retriever: -// For fields that use a JavaScript OBJECT (not a string or a Map), when the retrieves the saved value, it needs a way -// to retrieve the full object using the stored value (which is a string). This "retriever" closure provides that retrieval mechanism. - -export const enum ControlType { - FormControl, - FormArray, - FormGroup -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-controller/step-controller.component.html b/tkg/web/src/app/views/landing/wizard/shared/step-controller/step-controller.component.html deleted file mode 100644 index 5f437a29cc..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/step-controller/step-controller.component.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-controller/step-controller.component.scss b/tkg/web/src/app/views/landing/wizard/shared/step-controller/step-controller.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-controller/step-controller.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/step-controller/step-controller.component.spec.ts deleted file mode 100644 index b5d4c90897..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/step-controller/step-controller.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { StepControllerComponent } from './step-controller.component'; - -describe('StepControllerComponent', () => { - let component: StepControllerComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ StepControllerComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(StepControllerComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-controller/step-controller.component.ts b/tkg/web/src/app/views/landing/wizard/shared/step-controller/step-controller.component.ts deleted file mode 100644 index 97dc545667..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/step-controller/step-controller.component.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Component, OnDestroy, Output, EventEmitter, ElementRef, ViewChild, AfterViewInit, Input } from '@angular/core'; -import { ClrStepButton } from '@clr/angular'; -import { distinctUntilChanged } from 'rxjs/operators'; - -@Component({ - selector: 'app-step-controller', - templateUrl: './step-controller.component.html', - styleUrls: ['./step-controller.component.scss'] -}) -export class StepControllerComponent implements AfterViewInit, OnDestroy { - - @Output() - nextStep = new EventEmitter(); - nativeElement; - @ViewChild(ClrStepButton) nextButton: ClrStepButton; - - @Input() - formName: string; - - isDisabled: boolean; - - constructor( - el: ElementRef, - ) { - this.nativeElement = el.nativeElement; - } - - ngAfterViewInit(): void { - // We overwrite the stepper's default "move to next" logic with our own. - // You may provide your own "ready to move to next step" logic - // via injecting a method ('canMoveToNext') to "formGroup" object. - if (this.nextButton) { - const w = this.nextButton; - this.formName = w['clrStep'].id; - w['navigateToNextPanel'] = () => { - const move = w['clrStep']['formGroup']['canMoveToNext'] ? - w['clrStep']['formGroup']['canMoveToNext']() : w['clrStep']['formGroup'].valid; - w['stepperService']['navigateToNextPanel'](w['clrStep'].id, move); - } - w['clrStep']['formGroup'].statusChanges.pipe( - distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)) - ).subscribe((val) => { - this.isDisabled = val === 'INVALID'; - }); - } - } - - /** - * Find the step container of this element - */ - findContainer() { - let container = this.nativeElement; - while (container) { - const temp = container.querySelector("div.clr-accordion-inner-content"); - if (temp) { - container = temp; - break; - } - container = container.parentNode; - } - return container; - } - - ngOnDestroy(): void { - this.nextStep.emit(true); - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-form-notification/step-form-notification.component.html b/tkg/web/src/app/views/landing/wizard/shared/step-form-notification/step-form-notification.component.html deleted file mode 100644 index 0e13a79247..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/step-form-notification/step-form-notification.component.html +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-form-notification/step-form-notification.component.scss b/tkg/web/src/app/views/landing/wizard/shared/step-form-notification/step-form-notification.component.scss deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-form-notification/step-form-notification.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/step-form-notification/step-form-notification.component.spec.ts deleted file mode 100644 index 8b6f819db3..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/step-form-notification/step-form-notification.component.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { StepFormNotificationComponent } from './step-form-notification.component'; -import { ReactiveFormsModule, FormBuilder } from '@angular/forms'; -import { SharedModule } from 'src/app/shared/shared.module'; -import { ValidationService } from '../validation/validation.service'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; - -describe('StepFormNotificationComponent', () => { - let component: StepFormNotificationComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [StepFormNotificationComponent], - imports: [ - ReactiveFormsModule, - SharedModule - ], - providers: [ - ValidationService, - FormBuilder - ], - schemas: [ - CUSTOM_ELEMENTS_SCHEMA - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(StepFormNotificationComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-form-notification/step-form-notification.component.ts b/tkg/web/src/app/views/landing/wizard/shared/step-form-notification/step-form-notification.component.ts deleted file mode 100644 index 7bfdd512b0..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/step-form-notification/step-form-notification.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, OnInit, Input } from '@angular/core'; - -@Component({ - selector: 'app-step-form-notification', - templateUrl: './step-form-notification.component.html', - styleUrls: ['./step-form-notification.component.scss'] -}) -export class StepFormNotificationComponent implements OnInit { - @Input() errorNotification - constructor() { } - - ngOnInit() { - } - -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-form/step-form.ts b/tkg/web/src/app/views/landing/wizard/shared/step-form/step-form.ts deleted file mode 100644 index b346524e4e..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/step-form/step-form.ts +++ /dev/null @@ -1,433 +0,0 @@ -// Angular imports -import { Directive, OnInit } from '@angular/core'; -import { AbstractControl, FormGroup, ValidatorFn } from '@angular/forms'; -// Third party imports -import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; -import { Subject } from 'rxjs'; -// App imports -import { AppEdition } from 'src/app/shared/constants/branding.constants'; -import AppServices from 'src/app/shared/service/appServices'; -import { BasicSubscriber } from 'src/app/shared/abstracts/basic-subscriber'; -import { EditionData } from 'src/app/shared/service/branding.service'; -import { FormUtility } from '../components/steps/form-utility'; -import { IpFamilyEnum } from 'src/app/shared/constants/app.constants'; -import { Notification, NotificationTypes } from 'src/app/shared/components/alert-notification/alert-notification.component'; -import { StepCompletedPayload, StepDescriptionChangePayload, TanzuEvent, TanzuEventType } from 'src/app/shared/service/Messenger'; -import { StepMapping } from '../field-mapping/FieldMapping'; -import { StepRegistrantData } from '../wizard-base/wizard-base'; -import { UserDataIdentifier } from '../../../../../shared/service/user-data.service'; -import { ValidatorEnum } from '../constants/validation.constants'; - -export interface StepDescriptionTriggers { - clusterTypeDescriptor?: boolean, - fields?: string[], -} - -/** - * Abstract class that's available for stepper component to extend. - * It captures the common logic that should happen to most if not all - * stepper components. - */ -@Directive() -export abstract class StepFormDirective extends BasicSubscriber implements OnInit { - wizardName: string; - formName; - formGroup: FormGroup; - - edition: AppEdition = AppEdition.TCE; - validatorEnum = ValidatorEnum; - errorNotification: string = ''; - configFileNotification: Notification; - private clusterTypeDescription: string = ''; - modeClusterStandalone: boolean; - ipFamily: IpFamilyEnum = IpFamilyEnum.IPv4; - - clusterTypeDescriptorUsedInDescription: boolean; - - // This map is made available to HTML pages to display labels before fields - htmlFieldLabels: Map; - - protected quietly = { onlySelf: true, emitEvent: false }; // convenient when setting field values - protected eventFileImported: TanzuEventType; - protected eventFileImportError: TanzuEventType; - - protected abstract storeUserData(); - - // This method is expected to be overridden by any step that provides a dynamic description of itself - // (dynamic meaning depending on user-entered data). It is public to make it available for testing. - dynamicDescription(): string { - return null; - } - - setStepRegistrantData(stepRegistrantData: StepRegistrantData) { - this.formName = stepRegistrantData.step; - this.formGroup = stepRegistrantData.formGroup; - this.wizardName = stepRegistrantData.wizard; - this.eventFileImported = stepRegistrantData.eventFileImported; - this.eventFileImportError = stepRegistrantData.eventFileImportError; - } - - protected registerDefaultFileImportErrorHandler(eventFailure: TanzuEventType) { - AppServices.messenger.subscribe(eventFailure, data => { - // Capture the import file error message - this.configFileNotification = { - notificationType: NotificationTypes.ERROR, - message: data.payload - }; - }); - } - - ngOnInit(): void { - this.getFormName(); - this.subscribeToStepStartedEvents(); - this.subscribeToStepCompletedEvents(); - - // set branding and cluster type on branding change for base wizard components - AppServices.messenger.subscribe(TanzuEventType.BRANDING_CHANGED, data => { - this.edition = data.payload.edition; - this.setClusterTypeDescriptor(data.payload.clusterTypeDescriptor); - }, this.unsubscribe); - this.modeClusterStandalone = AppServices.appDataService.isModeClusterStandalone(); - } - - /** - * Infer form name from the formGroup object. - */ - getFormName() { - if (this.formGroup && this.formGroup.parent && this.formGroup.parent.controls) { - for (const name of Object.keys(this.formGroup.parent.controls)) { - if (this.formGroup.parent.controls[name] === this.formGroup) { - this.formName = name; - break; - } - } - } - } - - // This method could be protected, since it's primarily intended for subclasses, - // but since it's helpful for tests to be able to use it, we make it public - getFieldValue(fieldName: string, suppressWarnings?: boolean): any { - if (!this.formGroup) { - if (!suppressWarnings) { - console.error('getFieldValue(' + fieldName + ') called without a formGroup set'); - } - return; - } - if (!this.formGroup.controls[fieldName]) { - if (!suppressWarnings) { - console.error('getFieldValue(' + fieldName + ') called but no control by that name'); - } - return; - } - return this.formGroup.controls[fieldName].value; - } - - getStoredValue(fieldName: string, stepMapping: StepMapping, defaultValue?: any) { - const fieldMapping = AppServices.fieldMapUtilities.getFieldMapping(fieldName, stepMapping); - const result = AppServices.userDataService.retrieveStoredValue(this.wizardName, this.formName, fieldMapping); - if (result === undefined || result === null) { - return defaultValue; - } - return result; - } - - hasSavedData() { - return AppServices.userDataService.hasStoredStepData(this.wizardName, this.formName); - } - - // This method could be protected, since it's primarily intended for subclasses, - // but since it's helpful for tests to be able to use it, we make it public - setFieldValue(fieldName: string, value: any): void { - const control = this.getControl(fieldName); - if (control === undefined || control === null) { - console.log('WARNING: setFieldValue() could not find field ' + fieldName + ' to set value to ' + value); - } else { - control.setValue(value); - } - } - - protected getControl(fieldName: string): AbstractControl { - const control = this.formGroup.get(fieldName); - if (control === undefined || control === null) { - console.log('WARNING: getControl() could not find field ' + fieldName); - } - return control; - } - - protected clearFieldSavedData(fieldName: string) { - AppServices.userDataService.clear(this.createUserDataIdentifier(fieldName)); - } - - protected clearControlValue(controlName: string, clearSavedData?: boolean) { - this.setControlValueSafely(controlName, '' , { onlySelf: true, emitEvent: false}); - if (clearSavedData) { - this.clearFieldSavedData(controlName); - } - } - - protected saveFieldData(fieldName: string, value: string) { - AppServices.userDataService.store(this.createUserDataIdentifier(fieldName), { - display: value, - value - }); - } - - private findField(fieldName: string, methodName: string): AbstractControl { - if (!fieldName) { - console.warn(`${methodName}(): called with empty fieldName`); - return null; - } - - const field = this.formGroup.controls[fieldName]; - if (!field) { - console.warn(`${methodName}(): unable to find field with name ${fieldName}`); - return null; - } - return field; - } - - disarmField(fieldName: string, clearSavedData?: boolean, options?: { - onlySelf?: boolean; - emitEvent?: boolean; - }) { - const field = this.findField(fieldName, 'disarmField'); - if (field) { - field.clearValidators(); - field.setValue('', options); - field.updateValueAndValidity(options); - if (clearSavedData) { - this.clearFieldSavedData(fieldName); - } - } - } - - resurrectField(fieldName: string, validators: ValidatorFn[], value?: string, options?: { - onlySelf?: boolean; - emitEvent?: boolean; - }) { - const field = this.findField(fieldName, 'resurrectField'); - if (field) { - field.setValidators(validators); - field.updateValueAndValidity(options); - if (value !== undefined && field.value !== value) { - field.setValue(value || null, options); - } - } - } - - resurrectFieldWithStoredValue(fieldName: string, stepMapping: StepMapping, validators: ValidatorFn[], defaultValue?: string, options?: { - onlySelf?: boolean; - emitEvent?: boolean; - }) { - const value = this.getStoredValue(fieldName, stepMapping, defaultValue); - this.resurrectField(fieldName, validators, value, options); - } - - showFormError(formControlname) { - return this.formGroup.controls[formControlname].invalid && - (this.formGroup.controls[formControlname].dirty || - this.formGroup.controls[formControlname].touched) - } - - /** - * Checks if an array is empty - */ - isEmptyArray(arr: any[]): boolean { - return !(arr && arr.length > 0); - } - - // subclasses can ask us to make sure a StepDescriptionChange is triggered on various occasions - protected registerStepDescriptionTriggers(triggers: StepDescriptionTriggers) { - if (triggers.fields) { - this.registerFieldsAffectingStepDescription(triggers.fields); - } - this.clusterTypeDescriptorUsedInDescription = triggers.clusterTypeDescriptor; - } - - private registerFieldsAffectingStepDescription(fields: string[]) { - fields.forEach(field => { - this.registerOnValueChange(field, () => { - this.triggerStepDescriptionChange(); - }); - }) - } - - /** - * Registers a callback when a field value changes. - * This method does more than the "onchange" event handler - * in that onchange only captures changes through the UI, while - * this method registers handler for all value change event including - * the one changed programmatically. - * @param fieldName the field whose value to be monitored - * @param callback the function to be called when a value changes. - */ - registerOnValueChange(fieldName: string, callback: (newValue: any) => void) { - this.getControl(fieldName).valueChanges.pipe( - distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)), - takeUntil(this.unsubscribe) - ).subscribe(newValue => callback(newValue)); - } - - registerOnIpFamilyChange(fieldName: string, ipv4Validators: ValidatorFn[], ipv6Validators: ValidatorFn[], cb?: () => void) { - AppServices.messenger.subscribe(TanzuEventType.VSPHERE_IP_FAMILY_CHANGE, data => { - if (data.payload === IpFamilyEnum.IPv4) { - this.resurrectField( - fieldName, - ipv4Validators, - this.formGroup.get(fieldName).value, - {emitEvent: false, onlySelf: true} - ); - } else { - this.resurrectField( - fieldName, - ipv6Validators, - this.formGroup.get(fieldName).value, - {emitEvent: false, onlySelf: true} - ); - } - this.ipFamily = data.payload; - if (cb) { - cb(); - } - }, this.unsubscribe); - } - - protected setControlValueSafely(controlName: string, value: any, options?: { - onlySelf?: boolean, - emitEvent?: boolean - }) { - const control = this.formGroup.get(controlName); - if (control) { - control.setValue(value, options); - } - } - - protected setFieldWithStoredValue(field: string, stepMapping: StepMapping, defaultValue?: any, - options?: { onlySelf?: boolean; emitEvent?: boolean }) { - const fieldMapping = AppServices.fieldMapUtilities.getFieldMapping(field, stepMapping); - const storedValue = AppServices.userDataService.retrieveStoredValue(this.wizardName, this.formName, fieldMapping); - const value = storedValue === null || storedValue === undefined ? defaultValue : storedValue; - this.setControlValueSafely(field, value, options); - } - - // HTML convenience methods - // - get clusterTypeDescriptorTitleCase() { - return FormUtility.titleCase(this.clusterTypeDescriptor); - } - // - // HTML convenience methods - - protected triggerStepDescriptionChange() { - const descriptionChangePayload: StepDescriptionChangePayload = { - wizard: this.wizardName, - step: this.formName, - description: this.dynamicDescription(), - } - AppServices.messenger.publish({ - type: TanzuEventType.STEP_DESCRIPTION_CHANGE, - payload: descriptionChangePayload, - }); - } - - // NOTE: this method is public to facilitate testing, otherwise it would be private - public setClusterTypeDescriptor(descriptor: string) { - if (this.clusterTypeDescription !== descriptor) { - this.clusterTypeDescription = descriptor; - if (this.clusterTypeDescriptorUsedInDescription) { - this.triggerStepDescriptionChange(); - } - } - } - - get clusterTypeDescriptor() { - return this.clusterTypeDescription; - } - - private subscribeToStepCompletedEvents() { - AppServices.messenger.subscribe(TanzuEventType.STEP_COMPLETED, event => { - if (event.payload.wizard === this.wizardName && event.payload.step === this.formName) { - this.onStepCompleted(); - } - }); - } - - private subscribeToStepStartedEvents() { - AppServices.messenger.subscribe(TanzuEventType.STEP_STARTED, event => { - if (event.payload.wizard === this.wizardName && event.payload.step === this.formName) { - this.onStepStarted(); - } - }); - } - - // Extending classes may want to override this - protected onStepStarted() { - } - - private onStepCompleted() { - this.storeUserData(); - } - - // convenience methods - protected createUserDataIdentifier(field: string): UserDataIdentifier { - return { wizard: this.wizardName, step: this.formName, field}; - } - - protected storeUserDataFromMapping(stepMapping: StepMapping) { - AppServices.userDataFormService.storeFromMapping(this.wizardName, this.formName, stepMapping, this.formGroup); - } - - protected storeDefaultDisplayOrder(stepMapping: StepMapping) { - this.storeDisplayOrder(this.defaultDisplayOrder(stepMapping)); - } - - protected storeDisplayOrder(displayOrder: string[]) { - AppServices.userDataService.storeStepDisplayOrder(this.wizardName, this.formName, displayOrder); - } - - protected storeDefaultLabels(stepMapping: StepMapping) { - this.storeLabels(this.defaultLabels(stepMapping)); - } - - protected storeLabels(titles: Map) { - AppServices.userDataService.storeStepLabels(this.wizardName, this.formName, titles); - } - - protected defaultDisplayOrder(stepMapping: StepMapping): string[] { - return AppServices.fieldMapUtilities.getLabeledFieldsWithStoredData(this.wizardName, this.formName, stepMapping); - } - - protected defaultLabels(stepMapping: StepMapping): Map { - return AppServices.fieldMapUtilities.getFieldLabelMap(stepMapping); - } - - protected restoreField(field: string, stepMapping: StepMapping, values?: any[]) { - const identifier = this.createUserDataIdentifier(field); - const existingIdFieldMapping = AppServices.fieldMapUtilities.getFieldMapping(field, stepMapping); - AppServices.userDataFormService.restoreField(identifier, existingIdFieldMapping, this.formGroup, values); - } - - // This method is designed to expose the protected unsubscribe field (from our base class) to allow its use in subscribing to pipes - get unsubscribeOnDestroy(): Subject { - return this.unsubscribe; - } - - protected registerDefaultFileImportedHandler(eventSuccess: TanzuEventType, stepMapping: StepMapping) { - AppServices.messenger.subscribe(eventSuccess, - this.defaultFileImportedHandler(stepMapping)); - } - - // This is a convenience method for child classes that want to register a callback based on this behavior PLUS something of their own - protected defaultFileImportedHandler(stepMapping: StepMapping) - : (event: TanzuEvent) => void { - const step = this; - return data => { - this.configFileNotification = { - notificationType: NotificationTypes.SUCCESS, - message: data.payload - }; - // The file import saves the data to local storage, so we reinitialize this step's form from there - AppServices.userDataFormService.restoreForm(step.wizardName, step.formName, step.formGroup, stepMapping); - } - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper-set.component.html b/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper-set.component.html deleted file mode 100644 index 93f5d6fb6d..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper-set.component.html +++ /dev/null @@ -1,17 +0,0 @@ -
-
- - {{ thisStepData.title }} - - {{ wizard.stepDescription[thisStepData.name] }} - - - - - - - - - -
-
diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper-set.component.ts b/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper-set.component.ts deleted file mode 100644 index a7b28f8189..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper-set.component.ts +++ /dev/null @@ -1,44 +0,0 @@ -// The mission of this class is to cycle through a wizard's stepData array -// and create a step component for each of the data elements -import { AfterViewInit, Component, Input, OnInit, ViewChild } from '@angular/core'; -import { WizardBaseDirective, WizardStepRegistrar } from '../wizard-base/wizard-base'; -import { ClrStepper } from '@clr/angular'; - -@Component({ - selector: 'app-step-wrapper-set', - templateUrl: './step-wrapper-set.component.html', -}) -export class StepWrapperSetComponent implements AfterViewInit { - @Input() wizard: WizardBaseDirective; // the wizard that holds the steps we create - - @ViewChild(ClrStepper) - clarityStepper: ClrStepper; - - ngAfterViewInit() { - this.validateClarityWizard(); - // work around an issue within StepperModel - this.clarityStepper['stepperService']['accordion']['openFirstPanel'] = function () { - const firstPanel = this.getFirstPanel(); - if (firstPanel) { - this._panels[firstPanel.id].open = true; - this._panels[firstPanel.id].disabled = true; - } - } - } - - restartWizard() { - this.validateClarityWizard(); - this.clarityStepper['stepperService'].resetPanels(); - this.clarityStepper['stepperService']['accordion'].openFirstPanel(); - } - - private validateClarityWizard() { - if (!this.clarityStepper) { - console.error('StepWrapperSetComponent does not have correct ClrStepper injected. Was the HTML changed but not the component?'); - } else if (!this.clarityStepper['stepperService']) { - console.error('StepWrapperSetComponent\'s ClrStepper does not have a stepperService. Has the Clarity implementation changed?)'); - } else if (!this.clarityStepper['stepperService']['accordion']) { - console.error('StepWrapperSetComponent.ClrStepper.stepperService.accordion is null. Has the Clarity implementation changed?)'); - } - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper.component.html b/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper.component.html deleted file mode 100644 index 14a7d350a5..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper.component.html +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper.component.ts b/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper.component.ts deleted file mode 100644 index b35f2ba26b..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/step-wrapper/step-wrapper.component.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { - AfterViewInit, ChangeDetectorRef, - Component, - ComponentFactoryResolver, - Injector, - Input, - OnInit, - Type, - ViewChild, - ViewContainerRef -} from '@angular/core'; -import { FormDataForHTML } from '../components/steps/form-utility'; -import { FormGroup } from '@angular/forms'; -import { WizardBaseDirective, WizardStepRegistrar } from '../wizard-base/wizard-base'; -import { StepFormDirective } from '../step-form/step-form'; - -// The mission of this class is to (1) instantiate a step based on the passed "clazz" which is a component class, and -// (2) register the step with a "registrar" (which is basically a wizard implementing the registrar interface). -// This allows us to drive the creation of the step component via data (ie the passed component class), -// rather than having to specify each component in a separate HTML block in the wizard -@Component({ - selector: 'app-step-wrapper', - templateUrl: './step-wrapper.component.html', -}) -export class StepWrapperComponent implements AfterViewInit { - // ViewChild annotation allows us to have a reference to our inner container where we want - // to create the wrapped step component. It is defined in our HTML. - @ViewChild('stepContainer', {read: ViewContainerRef}) stepContainer: ViewContainerRef; - - @Input() registrar: WizardStepRegistrar; // the wizard that holds the steps we create - @Input() formName: string; // name of the form for this step - @Input() clazz: Type; // class of the backing component for the wrapped step - - constructor(private injector: Injector, - private componentFactoryResolver: ComponentFactoryResolver, - private changeDetector: ChangeDetectorRef) { - } - - // NOTE: we initialize on ngAfterViewInit rather than ngOnInit because the stepContainer element is not - // guaranteed to be available until ngAfterViewInit - ngAfterViewInit() { - this.initialize(); - // Because we're in the AfterViewInit lifecycle event, we're not supposed to be changing the template elements-- - // unless we call the changeDetector to let it know we did so - this.changeDetector.detectChanges(); - } - - private initialize() { - if (!this.clazz) { - console.error('No clazz was given to StepWrapperComponent'); - return; - } - if (!this.registrar) { - console.error('No registrar was given to StepWrapperComponent'); - return; - } - if (!this.formName || this.formName.length === 0) { - console.error('No form name was given to StepWrapperComponent'); - return; - } - if (this.stepContainer === undefined) { - console.warn(this.formName + ': there was no stepContainer element defined in the step-wrapper template HTML'); - return; - } - - const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.clazz); - const wrappedComponent = this.stepContainer.createComponent(componentFactory); - - this.registrar.registerStep(this.formName, wrappedComponent.instance); - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.html b/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.html deleted file mode 100644 index 27d6ca2d86..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.html +++ /dev/null @@ -1,16 +0,0 @@ -
-
    -
  • -
    - -
    - - - - -
    -
    - -
  • -
-
diff --git a/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.scss b/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.scss deleted file mode 100644 index d40b642635..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.scss +++ /dev/null @@ -1,19 +0,0 @@ -.node-container { - position: relative; - padding: 8px 20px 0; - list-style-type: none; - font-size: 14px; - position: relative; - - label { - display: inline-block; - } -} -.expand-btn { - position: absolute; - left: 0px; - top: 12px; - &:hover { - cursor: pointer; - } -} \ No newline at end of file diff --git a/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.spec.ts deleted file mode 100644 index cb8c83c91f..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { TreeSelectComponent } from './tree-select.component'; - -describe('TreeSelectComponent', () => { - let component: TreeSelectComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ TreeSelectComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(TreeSelectComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.ts b/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.ts deleted file mode 100644 index fcdce19c15..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/tree-select/tree-select.component.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { Key } from 'src/app/shared/constants/app.constants'; - -@Component({ - selector: 'app-tree-select', - templateUrl: './tree-select.component.html', - styleUrls: ['./tree-select.component.scss'], -}) -export class TreeSelectComponent implements OnInit { - @Input() data: any; - @Input() selectedHandler: any; - - constructor() {} - - ngOnInit(): void {} - - handleClick(selected): void { - this.selectedHandler(selected); - } - - toggleExpand(selected): void { - selected.isExpanded = !selected.isExpanded; - } - - onKeyup(event, node): boolean { - if (event.keyCode === Key.Enter) { - node.checked = !node.checked; - this.selectedHandler(node); - } else if (event.keyCode === Key.LeftArrow) { - node.isExpanded = true; - } else if (event.keyCode === Key.RightArrow) { - node.isExpanded = false; - } else { - return true; - } - return false; - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/utils/cli-generator.ts b/tkg/web/src/app/views/landing/wizard/shared/utils/cli-generator.ts deleted file mode 100644 index 4bde2c3ba9..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/utils/cli-generator.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { ClusterType } from "../constants/wizard.constants"; - -export interface CliFields { - configPath: string; - clusterType: ClusterType; - clusterName: string; - extendCliCmds: Array<{isPrefixOfCreateCmd: boolean, cmdStr: string}>; -} -export class CliGenerator { - getCli(cliFields: CliFields) { - const clusterType = (cliFields.clusterType) ? cliFields.clusterType : ClusterType.Management; - const clusterPrefix = '' + clusterType; - const clusterNameArg = (cliFields.clusterName) ? ` ${cliFields.clusterName} ` : ''; - let command = `tanzu ${clusterPrefix}-cluster create${clusterNameArg}`; - const optionsMapping = [ - ['--file', cliFields.configPath], - ['-v', '6'] - ]; - optionsMapping.forEach(option => { - if (option[1] || typeof option[1] === 'boolean') { - try { - const url = new URL(option[1]); - command += ` ${option[0]} '${url.href}'`; - } catch (error) { - command += ` ${option[0]} ${option[1]}`; - } - } - }) - - const extendCliCmdsArray: Array<{isPrefixOfCreateCmd: boolean, cmdStr: string}> = cliFields.extendCliCmds; - extendCliCmdsArray.forEach(item => { - if (item.isPrefixOfCreateCmd) { - command = item.cmdStr + " && " + command; - } else { - command = command + " && " + item.cmdStr; - } - }) - return command; - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/utils/cloneable.ts b/tkg/web/src/app/views/landing/wizard/shared/utils/cloneable.ts deleted file mode 100644 index 0ce973e5a5..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/utils/cloneable.ts +++ /dev/null @@ -1,16 +0,0 @@ -// from https://javascript.plainenglish.io/deep-clone-an-object-and-preserve-its-type-with-typescript-d488c35e5574 -export class Cloneable { - public static deepCopy(source: T): T { - return Array.isArray(source) - ? source.map(item => this.deepCopy(item)) - : source instanceof Date - ? new Date(source.getTime()) - : source && typeof source === 'object' - ? Object.getOwnPropertyNames(source).reduce((o, prop) => { - Object.defineProperty(o, prop, Object.getOwnPropertyDescriptor(source, prop)!); - o[prop] = this.deepCopy((source as { [key: string]: any })[prop]); - return o; - }, Object.create(Object.getPrototypeOf(source))) - : source as T; - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/utils/form-utils.ts b/tkg/web/src/app/views/landing/wizard/shared/utils/form-utils.ts deleted file mode 100644 index 5592d7ba31..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/utils/form-utils.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms'; -import AppServices from 'src/app/shared/service/appServices'; -import { ControlType, FieldMapping } from '../field-mapping/FieldMapping'; - -export class FormUtils { - static addControl(formGroup: FormGroup, name: string, control: AbstractControl) { - // Extends default FormGroup.addControl method to add form controls and - // set the emitEvent property to false by default. This may be used to bypass - // Clarity 5's status change logic, which triggers form validation to occur - // immediately after form controls are created. Setting emitEvent to false - // avoids the Clarity 'triggerAllFormControlValidation' method from being executed. - formGroup.addControl(name, control, {emitEvent: false}); - } - - static addDynamicControl(formGroup: FormGroup, initialValue: any, fieldMapping: FieldMapping): void { - const dynamicControlHandler = - (dynamicMapping: Record void>, defaultCase = ControlType.FormControl) => - (controlType: ControlType) => - (dynamicMapping[controlType] || dynamicMapping[defaultCase])(); - - const formArrayHandler: () => void = () => { - const formData: any[] = (initialValue && initialValue !== '' ? initialValue : null) ?? - fieldMapping.defaultValue ?? [ - fieldMapping.children.reduce((obj, item) => ((obj[item.name] = item.defaultValue), obj), {}) - ]; - - const formArray: any[] = formData.map((obj) => { - const group: any = {}; - for (const [key, value] of Object.entries(obj)) { - const childFieldMapping: FieldMapping = fieldMapping.children.find((child) => child.name === key); - const childValidators = AppServices.fieldMapUtilities.getValidatorArray(childFieldMapping); - group[key] = new FormControl(value, childValidators); - } - return new FormGroup(group); - }); - - formGroup.addControl(fieldMapping.name, new FormArray(formArray), {emitEvent: false}); - }; - - const formControlHandler: () => void = () => { - const validators = AppServices.fieldMapUtilities.getValidatorArray(fieldMapping); - formGroup.addControl(fieldMapping.name, new FormControl(initialValue, validators), {emitEvent: false}); - setTimeout(() => { - formGroup.controls[fieldMapping.name].setValue(initialValue); - }); - }; - - const dynamicMappings: Record void> = { - [ControlType.FormArray]: formArrayHandler, - [ControlType.FormControl]: formControlHandler, - // TODO: Add FormGroup handler - [ControlType.FormGroup]: () => { - } - }; - - dynamicControlHandler(dynamicMappings)(fieldMapping.controlType); - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/validation/validation.methods.spec.ts b/tkg/web/src/app/views/landing/wizard/shared/validation/validation.methods.spec.ts deleted file mode 100755 index 63ff38022b..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/validation/validation.methods.spec.ts +++ /dev/null @@ -1,153 +0,0 @@ -/* tslint:disable: no-bitwise */ - -import { - ipAddrToLong, - isValidIp, - isValidCidr, - isValidFqdn, - subnetMaskValid, - subnetMaskMinLength, - subnetMaskMaxLength, - subnetMaskInRange, - isIpInSubnet, - cidrToRange, - isCidrOverlapCidr, - isCidrWithinCidr, - ipOverlapSubnet, - isNumericOnly, - isValidClustername -} from "./validation.methods"; - -describe('Validation methods', () => { - describe('ipAddrToLong', () => { - it("'192.168.1.1' to 3232235777", () => { - expect(ipAddrToLong('192.168.1.1')).toBe(3232235777); - }); - }); - - describe('isValidIp', () => { - it("'192.168.1.1' should be valid", () => { - expect(isValidIp('192.168.1.1')).toBeTruthy(); - }); - - it("'192.168.1' should be invalid", () => { - expect(isValidIp('192.168.1')).toBeFalsy(); - }); - }); - - describe('isValidCidr', () => { - it("'192.168.1.1/20' should be valid", () => { - expect(isValidCidr('192.168.1.1/20')).toBeTruthy(); - }); - - it("'192.168.1.1/120' should be invalid", () => { - expect(isValidCidr('192.168.1.1/120')).toBeFalsy(); - }); - it("'192.168.1.1' should be invalid", () => { - expect(isValidCidr('192.168.1.1')).toBeFalsy(); - }); - }); - - describe('isValidFqdn', () => { - it("'fqdn.com' should be valid", () => { - expect(isValidFqdn('fqdn.com')).toBeTruthy(); - }); - - it("'fqdn.com' should be invalid", () => { - expect(isValidFqdn('vmware/vsphere')).toBeFalsy(); - }); - }); - - describe('subnetMaskValid', () => { - it("'255.255.255.0' should be valid", () => { - expect(subnetMaskValid(4294967040)).toBeTruthy(); - }); - - it("'192.168.1.1' should be invalid", () => { - expect(subnetMaskValid(3232235777)).toBeFalsy(); - }); - }); - - describe('subnetMaskMinLength', () => { - it("'255.255.255.0' should satisfy min length 24", () => { - expect(subnetMaskMinLength(4294967040, 24)).toBeTruthy(); - }); - - it("'255.255.255.0' should not satisfy min length 25", () => { - expect(subnetMaskMinLength(4294967040, 25)).toBeFalsy(); - }); - }); - - describe('subnetMaskMaxLength', () => { - it("'255.255.255.0' should satisfy max length 24", () => { - expect(subnetMaskMaxLength(4294967040, 24)).toBeTruthy(); - }); - - it("'255.255.255.0' should not satisfy max length 23", () => { - expect(subnetMaskMaxLength(4294967040, 23)).toBeFalsy(); - }); - }); - - describe('subnetMaskInRange', () => { - it("'192.168.1.0' should be in range with '255.255.255.0'", () => { - expect(subnetMaskInRange(3232235776, 4294967040)).toBeTruthy(); - }); - - it("'192.168.1.0' should be out of range with '255.255.0.0'", () => { - expect(subnetMaskInRange(3232235776, 4294901760)).toBeFalsy(); - }); - }); - - describe('isIpInSubnet', () => { - it("'192.168.1.1' should be in subnet of 192.168.1.0'", () => { - expect(isIpInSubnet(3232235777, 3232235776, 4294967040)).toBeTruthy(); - }); - - it("'192.168.1.1' should be out of subnet of 192.169.1.0'", () => { - expect(isIpInSubnet(3232235777, 3232301312, 4294967040)).toBeFalsy(); - }); - }); - - describe('cidrToRange', () => { - it("'192.168.1.1/22' to [3232235520, 3232236543]", () => { - expect(cidrToRange('192.168.1.1/22')[0] >>> 0).toEqual(3232235520); - expect(cidrToRange('192.168.1.1/22')[1] >>> 0).toEqual(3232236543); - }); - }); - - describe('isCidrOverlapCidr', () => { - it("'192.168.1.1/24' should overlap with '192.168.1.1/24'", () => { - expect(isCidrOverlapCidr('10.10.1.0/1', '192.168.1.1/1')).toBeFalsy(); - }); - }); - - describe('isCidrWithinCidr', () => { - it("'192.168.1.1/20' should within '192.168.1.0/20'", () => { - expect(isCidrWithinCidr('192.168.1.1/20', '192.168.1.0/20')).toBeTruthy(); - }); - - it("'192.168.1.1/24' should not be within '192.168.2.0/24'", () => { - expect(isCidrWithinCidr('192.168.1.1/24', '192.168.2.0/24')).toBeFalsy(); - }); - }); - - describe('isNumericOnly', () => { - it("'numeric123' should fail", () => { - expect(isNumericOnly('numeric123')).toBeFalsy(); - }); - - it("'123' should pass", () => { - expect(isNumericOnly('123')).toBeTruthy(); - }); - }); - - describe('isValidClustername', () => { - it("'validname' should be valid", () => { - expect(isValidClustername('validname')).toBeTruthy(); - }); - - it("'validName123!!!' should not be valid", () => { - expect(isValidClustername('validName123!!!')).toBeFalsy(); - }); - }); -}); diff --git a/tkg/web/src/app/views/landing/wizard/shared/validation/validation.methods.ts b/tkg/web/src/app/views/landing/wizard/shared/validation/validation.methods.ts deleted file mode 100755 index 51f3e74d22..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/validation/validation.methods.ts +++ /dev/null @@ -1,260 +0,0 @@ -/* tslint:disable: max-line-length */ -/* tslint:disable: no-bitwise */ - -import isIp from "is-ip"; - -/** - * @method ipAddrToLong - */ -export const ipAddrToLong = (ipAddress: string) => { - const ipAddressParts: Array = ipAddress.split('.'); - const octetBitLength = 8; - let mask = 0; - for (let i = 0; i < ipAddressParts.length; i++) { - mask = mask << octetBitLength; - mask += parseInt(ipAddressParts[i], 10); - } - - return (mask >>> 0); -} - -/** - * @method isValidIp decide if arg is a valid IP after trimming whitespaces - * @return boolean - */ -export const isValidIp = (arg: string) => { - const regexPattern = - /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; - return regexPattern.test(arg.trim()); -} - -/** - * @method isValidIpWithHttpsProtocol decide if arg is a valid IP with https protocol prefix after trimming whitespaces - * @return boolean - */ -export const isValidIpWithHttpsProtocol = (arg: string) => { - const regexPattern = - /https?:\/\/(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; - return regexPattern.test(arg.trim()); -} - -/** - * @method isValidIpv6WithHttpsProtocol decide if arg is a valid IP with https protocol prefix after trimming whitespaces - * @return boolean - */ -export const isValidIpv6WithHttpsProtocol = (arg: string) => { - const ipWithHttps = arg.trim(); - const isHttp = ipWithHttps.substr(0, 7) === 'http://'; - const isHttps = ipWithHttps.substr(0, 8) === 'https://'; - let start = 0; - const end = ipWithHttps.length; - if (isHttp) { - start = 7; - } else if (isHttps) { - start = 8; - } else { - return false; - } - const ip = ipWithHttps.substring(start, end); - return isIp.v6(ip); -} - -/** - * @method isValidCidr decide if arg is a valid cidr - * @return boolean - */ -export const isValidCidr = (arg: string) => { - const argArr = arg.split('/'); - if (argArr.length === 2) { - if (!isValidIp(argArr[0])) { - return false; - } - return argArr[1] && +argArr[1] >= 0 && +argArr[1] < 32; - } else { - return false; - } -} - -/** - * @method isValidFqdn decide if arg is a valid FQDN - * @return boolean - */ -export const isValidFqdn = (arg: string) => { - const regexPattern = /^[a-z0-9]+([-.][a-z0-9]+)*\.[a-z]{2,}$/i; - return regexPattern.test(arg.trim()); -} - -/** - * @method isValidFqdnWithHttpsProtocol decide if arg is a valid FQDN with https protocol prefix - * @return boolean - */ -export const isValidFqdnWithHttpsProtocol = (arg: string) => { - const regexPattern = /((https):\/)\/([a-z0-9]+([-.][a-z0-9]+)*\.[a-z]{2,})((\/\w+)*([\/].*)?)+$/i; - return regexPattern.test(arg.trim()); -} - -/** - * @method isStringWithoutFragment decide if arg includes url fragment '#somefragment' - * @return boolean - */ -export const isStringWithoutUrlFragment = (arg: string) => { - const regexPattern = /(#[\w\-]+)$/i; - return regexPattern.test(arg.trim()); -} - -/** - * @method isStringWithoutQueryParams decide if arg includes url query params '?param=foo' - * @return boolean - */ -export const isStringWithoutQueryParams = (arg: string) => { - const regexPattern = /(\?|\&)([^=]+)\=([^&]+)/g; - return regexPattern.test(arg.trim()); -} - -/** - * @method validSubnetMask check if subnet mask is consecutive 1s followed by 0s - * @param {number} arg subnetMask in number format - * @return {boolean} true if valid - */ -export const subnetMaskValid = (arg: number) => { - const cidrStr = (arg >>> 0).toString(2); - const cidrRex = /^1+0+$/; - return cidrRex.test(cidrStr); -} - -/** - * @method subnetMaskMinLength check if subnet satisfies min bit length - * @param {number} arg subnetMask in number format - * @param {number} minLength - * @return {boolean} true if valid - */ -export const subnetMaskMinLength = (arg: number, minLength: number) => { - const length = (arg >>> 0).toString(2).indexOf('10') + 1; - return length >= minLength; -} - -/** - * @method subnetMaskMaxLength check if subnet satisfies max bit length - * @param {number} arg subnetMask in number format - * @param {number} minLength - * @return {boolean} true if valid - */ -export const subnetMaskMaxLength = (arg: number, maxLength: number) => { - const length = (arg >>> 0).toString(2).indexOf('10') + 1; - return length <= maxLength; -} - -/** - * @method subnetInRange check if subnet is within range of provided mask - * @param {number} arg subnet in number format - * @param {number} mask - * @return {boolean} true if within range - */ -export const subnetMaskInRange = (arg: number, mask: number) => { - return (((arg >>> 0) & (mask >>> 0)) >>> 0) === (arg >>> 0); -} - -/** - * @method isIpInSubnet check if ip is under provided subnet range - * @param {number} arg IP in number format - * @param {number} subnet subnet in number format - * @param {number} subnetMask subnet mask in number format - * @return {boolean} true if within range - */ -export const isIpInSubnet = (arg: number, subnet: number, subnetMask: number) => { - if ((((arg >>> 0) & (subnetMask >>> 0)) >>> 0) === (subnet >>> 0)) { - const hostId = arg ^ subnet; - if (hostId === 0 || (((hostId | subnetMask) >>> 0).toString(2).indexOf('0') < 0)) { - return false; - } - - return true; - } - - return false; -} - -export const cidrToRange = (cidr: string) => { - const cidrStrs: Array = cidr.split('/'); - const ipLong = ipAddrToLong(cidrStrs[0]); - const suffix = parseInt(cidrStrs[1], 10); - const mask = ((-1 << (32 - suffix))); - - const start = ipLong & ((-1 << (32 - suffix))); - const end = start + Math.pow(2, (32 - suffix)) - 1 - return [start, end]; -} - -/** - * @method isCidrOverlapCidr check if cidr overlaps with another cidr - * @param {number} arg cidr - * @param {number} cidr comparing cidr - * @return {boolean} true if overlaps - */ -export const isCidrOverlapCidr = (arg: string, cidr: string) => { - const range1 = cidrToRange(arg); - const range2 = cidrToRange(cidr); - - return !(range1[0] > range2[1] || range1[1] < range2[0]); -} - -/** - * @method isCidrWithinCidr check if cidr is within another cidr - * @param {number} arg cidr - * @param {number} cidr comparing cidr - * @return {boolean} true if it is within - */ -export const isCidrWithinCidr = (arg: string, cidr: string) => { - const range1 = cidrToRange(arg); - const range2 = cidrToRange(cidr); - - return range1[0] >= range2[0] && range1[1] <= range2[1]; -} - -/** - * @method ipOverlapSubnet check if ip overlaps with subnet - * @param {number} arg IP in number format - * @param {number} subnet subnet in number format - * @param {number} subnetMask subnet mask in number format - * @return {boolean} true if overlaps - * NOTE: non-exhaustive check - */ -export const ipOverlapSubnet = (arg: number, subnet: number, subnetMask: number) => { - if ((((arg >>> 0) & (subnetMask >>> 0)) >>> 0) === (subnet >>> 0)) { - return true; - } - - return false; -} - -/** - * @method isNumericOnly - * @param {string} arg input string - * @return {boolean} - */ -export const isNumericOnly = (arg: string) => { - const regexPattern = /^[0-9]+$/; - return regexPattern.test(arg.toString().trim()); -} - -/** - * @method isValidClustername decide if arg is a valid cluster name - * @return boolean - */ -export const isValidClustername = (arg: string) => { - const regexPattern = /^[a-z0-9][a-z0-9-.]{0,40}[a-z0-9]$/; - return regexPattern.test(arg.trim()); -} - -/** - * @method isValidLabelOrAnnotation decide if arg is a valid cluster label - * @return boolean - */ -export const isValidLabelOrAnnotation = (arg: string) => { - const regexPattern = /^[a-z0-9A-Z]([a-z0-9A-Z\-\_\.]*[a-z0-9A-Z])?$/; - return regexPattern.test(arg.trim()); -} - -export const isHttpsProtocol = (arg: string) => { - return /^https:\/\//.test(arg); -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/validation/validation.service.ts b/tkg/web/src/app/views/landing/wizard/shared/validation/validation.service.ts deleted file mode 100755 index 9a6846c3c2..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/validation/validation.service.ts +++ /dev/null @@ -1,813 +0,0 @@ -/** - * Angular modules - */ -import { Injectable } from '@angular/core'; -import XRegExp from 'xregexp'; -import { AbstractControl, FormGroup, ValidationErrors } from '@angular/forms'; -import { Netmask } from 'netmask'; -import isIp from 'is-ip'; - -/** - * App imports - */ -import * as validationMethods from './validation.methods'; -import { SimpleValidator, ValidatorEnum } from '../constants/validation.constants'; -import { RxwebValidators } from "@rxweb/reactive-form-validators"; - -/** - * @class ValidationService - * Base class for shared form validators - */ -@Injectable() -export class ValidationService { - simpleValidatorMap: Map ValidationErrors>; - - constructor() { - this.simpleValidatorMap = new Map any>([ - [SimpleValidator.IS_COMMA_SEPARATED_LIST, this.isCommaSeperatedList()], - [SimpleValidator.IS_HTTP_OR_HTTPS, this.isHttpOrHttps()], - [SimpleValidator.IS_NUMBER_POSITIVE, this.isNumberGreaterThanZero()], - [SimpleValidator.IS_NUMERIC_ONLY, this.isNumericOnly()], - [SimpleValidator.IS_STRING_WITHOUT_QUERY_PARAMS, this.isStringWithoutQueryParams()], - [SimpleValidator.IS_STRING_WITHOUT_URL_FRAGMENT, this.isStringWithoutUrlFragment()], - [SimpleValidator.IS_TRUE, this.isTrue()], - [SimpleValidator.IS_VALID_CLUSTER_NAME, this.isValidClusterName()], - [SimpleValidator.IS_VALID_FQDN, this.isValidFqdn()], - [SimpleValidator.IS_VALID_FQDN_OR_IP, this.isValidIpOrFqdn()], - [SimpleValidator.IS_VALID_FQDN_OR_IP_HTTPS, this.isValidIpOrFqdnWithHttpsProtocol()], - [SimpleValidator.IS_VALID_FQDN_OR_IP_LIST, this.isCommaSeparatedIpsOrFqdn()], - [SimpleValidator.IS_VALID_FQDN_OR_IPV6, this.isValidIpv6OrFqdn()], - [SimpleValidator.IS_VALID_FQDN_OR_IPV6_HTTPS, this.isValidIpv6OrFqdnWithHttpsProtocol()], - [SimpleValidator.IS_VALID_IP, this.isValidIp()], - [SimpleValidator.IS_VALID_IP_LIST, this.isValidIps()], - [SimpleValidator.IS_VALID_IP_NETWORK_SEGMENT, this.isValidIpNetworkSegment()], - [SimpleValidator.IS_VALID_IPV6_NETWORK_SEGMENT, this.isValidIpv6NetworkSegment()], - [SimpleValidator.IS_VALID_LABEL_OR_ANNOTATION, this.isValidLabelOrAnnotation()], - [SimpleValidator.IS_VALID_PORT, this.isValidPort()], - [SimpleValidator.IS_VALID_RESOURCE_GROUP_NAME, this.isValidResourceGroupName()], - [SimpleValidator.NO_WHITE_SPACE, this.noWhitespaceOnEnds()], - [SimpleValidator.NO_TRAILING_SLASH, this.noTrailingSlash()], - [SimpleValidator.RX_UNIQUE, RxwebValidators.unique()], - [ - SimpleValidator.RX_REQUIRED_IF_VALUE, - RxwebValidators.required({conditionalExpression: (x, _) => !!x.value}) - ], - [SimpleValidator.RX_REQUIRED_IF_KEY, RxwebValidators.required({conditionalExpression: (x, _) => !!x.key})] - ]); - } - - getSimpleValidator(requested: SimpleValidator): (control: AbstractControl) => any { - return this.simpleValidatorMap.get(requested); - } - - /** - * @method isValidIp - * NOTE: if string is empty, does not yield error - */ - isValidIp(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - return validationMethods.isValidIp(ctrlValue) ? - null : {[ValidatorEnum.VALID_IP]: true}; - } - return null; - } - } - - /** - * @method noWhitespaceOnEnds check if string has leading/trailing whitespsaces - */ - noWhitespaceOnEnds(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (ctrlValue.length !== ctrlValue.toString().trim().length) { - return { - [ValidatorEnum.WHITESPACE]: true - }; - } - } - return null; - } - } - - /** - * @method noTrailingSlash check if string has trailing slash (IE https://test.net/) - */ - noTrailingSlash(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (ctrlValue.substr(ctrlValue.length - 1) === '/') { - return { - [ValidatorEnum.TRAILING_SLASH]: true - }; - } - } - return null; - } - } - - /** - * @method isValidIps - * NOTE: if string is empty, does not yield error - */ - isValidIps(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - const ips: Array = ctrlValue.split(','); - return ips - .map(ipStr => validationMethods.isValidIp(ipStr)) - .reduce((a, b) => a && b, true) ? null : {[ValidatorEnum.VALID_IP]: true}; - } - return null; - } - } - - /** - * @method isValidFqdn - * NOTE: if string is empty, does not yield error - */ - isValidFqdn(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - return validationMethods.isValidFqdn(ctrlValue) ? - null : {[ValidatorEnum.VALID_FQDN]: true}; - } - return null; - } - } - - /** - * @method isValidIpOrFqdn validator to check if input is valid IP or FQDN - */ - isValidIpOrFqdn(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (validationMethods.isValidIp(ctrlValue) || - validationMethods.isValidFqdn(ctrlValue)) { - return null; - } - - return { - [ValidatorEnum.VALID_IP_OR_FQDN]: true - }; - } - } - } - - /** - * @method isValidIpOrFqdn validator to check if input is valid IP or FQDN - */ - isValidIpv6OrFqdn(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (isIp.v6(ctrlValue) || - validationMethods.isValidFqdn(ctrlValue)) { - return null; - } - - return { - [ValidatorEnum.VALID_IP_OR_FQDN]: true - }; - } - } - } - - /** - * @method isValidIpOrFqdnWithProtocol validator to check if input is valid IP or FQDN - * with protocol prefix - */ - isValidIpOrFqdnWithHttpsProtocol(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (validationMethods.isValidIpWithHttpsProtocol(ctrlValue) || - validationMethods.isValidFqdnWithHttpsProtocol(ctrlValue)) { - return null; - } - - return { - [ValidatorEnum.VALID_IP_OR_FQDN]: true - }; - } - } - } - - /** - * @method isValidIpv6OrFqdnWithHttpsProtocol validator to check if input is valid IP or FQDN - * with protocol prefix - */ - isValidIpv6OrFqdnWithHttpsProtocol(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (validationMethods.isValidIpv6WithHttpsProtocol(ctrlValue) || - validationMethods.isValidFqdnWithHttpsProtocol(ctrlValue)) { - return null; - } - - return { - [ValidatorEnum.VALID_IP_OR_FQDN]: true - }; - } - } - } - - /** - * @method isStringWithoutUrlFragment validator to check if input includes URL fragment - */ - isStringWithoutUrlFragment(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (validationMethods.isStringWithoutUrlFragment(ctrlValue)) { - return { - [ValidatorEnum.INCLUDES_URL_FRAGMENT]: true - }; - } - return null; - } - } - } - - /** - * @method isStringWithoutQueryParams validator to check if input includes URL query params - */ - isStringWithoutQueryParams(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (validationMethods.isStringWithoutQueryParams(ctrlValue)) { - return { - [ValidatorEnum.INCLUDES_QUERY_PARAMS]: true - }; - } - return null; - } - } - } - - /** - * @method isValidPort validator to check if input is valid port - */ - isValidPort(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (validationMethods.isNumericOnly(ctrlValue)) { - return null; - } - - return { - [ValidatorEnum.VALID_PORT]: true - }; - } - return null; - } - } - - /** - * @method isValidSubnet validator to check if input subnet is valid - * - valid ip - * - within subnet mask range - */ - isValidSubnet(subnetMaskCtrl: AbstractControl): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (validationMethods.isValidIp(ctrlValue)) { - const ipLong = validationMethods.ipAddrToLong(ctrlValue); - const subnetMask = subnetMaskCtrl.value; - if (validationMethods.isValidIp(subnetMask)) { - const subnetMaskLong = validationMethods.ipAddrToLong(subnetMask); - - if (validationMethods.subnetMaskInRange(ipLong, subnetMaskLong)) { - return null; - } - - return { - [ValidatorEnum.SUBNET_IN_RANGE]: true - }; - } - return null; - } - return { - [ValidatorEnum.VALID_IP]: true - }; - } - return null; - } - } - - /** - * @method isValidClusterName - * NOTE: if string start and end with a letter, and can contain only - * lowercase letters, numbers, and hyphens. - */ - isValidClusterName(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (ctrlValue.length !== ctrlValue.toString().trim().length) { - return { - [ValidatorEnum.WHITESPACE]: true - }; - } - return validationMethods.isValidClustername(ctrlValue) ? - null : {[ValidatorEnum.VALID_CLUSTER_NAME]: true}; - } - return null; - } - } - - /** - * @method isValidLabelOrAnnotation - * NOTE: if string start and end with a letter, and can contain only - * lowercase letters, numbers, hyphens, underscores, dots, and have - * max length of 63. - */ - isValidLabelOrAnnotation(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (ctrlValue.length !== ctrlValue.toString().trim().length) { - return { - [ValidatorEnum.WHITESPACE]: true - }; - } - if (ctrlValue.length > 63) { - return { - [ValidatorEnum.MAX_LEN]: true - } - } - return validationMethods.isValidLabelOrAnnotation(ctrlValue) ? - null : {[ValidatorEnum.VALID_CLUSTER_NAME]: true}; - } - return null; - } - } - - /** - * @method isIpInSubnet validator to check if input is within subnet range - * - non-empty - * - valid ip - * - within subnet range - */ - isIpInSubnet(subnetCtrl: AbstractControl, subnetMaskCtrl: AbstractControl): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (validationMethods.isValidIp(ctrlValue)) { - const ipLong = validationMethods.ipAddrToLong(ctrlValue); - const subnetMask = subnetMaskCtrl.value; - const subnet = subnetCtrl.value; - if (validationMethods.isValidIp(subnet) && - validationMethods.isValidIp(subnetMask)) { - const subnetLong = validationMethods.ipAddrToLong(subnet); - const subnetMaskLong = validationMethods.ipAddrToLong(subnetMask); - - if (validationMethods.isIpInSubnet(ipLong, subnetLong, subnetMaskLong)) { - return null; - } - - return { - [ValidatorEnum.IP_IN_SUBNET_RANGE]: true - }; - } - return null; - } - return { - [ValidatorEnum.VALID_IP]: true - }; - } - return null; - } - } - - /** - * @method isIpInSubnet2 validator to check if input is within subnet range - * @param cidrControlName the name of the CIDR, assumming format IPv4/length, e.g: 192.167.0.0/16 - */ - isIpInSubnet2(cidr: string): any { - return (control: AbstractControl) => { - const ipv4: string = control.value; - if (ipv4) { - if (validationMethods.isValidIp(ipv4)) { - let netmask = null; - try { - netmask = new Netmask(cidr); - } catch (e) { - // the netmask may not have been initialized yet, we don't validate - return null; - } - - if (!netmask.contains(ipv4)) { - return { - [ValidatorEnum.IP_IN_SUBNET_RANGE]: true - }; - } - - return null; - } - return { - [ValidatorEnum.VALID_IP]: true - }; - } - return null; - } - } - - /** - * @method ipOverlapSubnet validator to check if input is overlapping with subnet - * - non-empty - * - valid ip - * - not overlapping with subnet - * - * NOTE: non-exhaustive check - */ - ipOverlapSubnet(subnetCtrl: AbstractControl, subnetMaskCtrl: AbstractControl): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (validationMethods.isValidIp(ctrlValue)) { - const ipLong = validationMethods.ipAddrToLong(ctrlValue); - const subnetMask = subnetMaskCtrl.value; - const subnet = subnetCtrl.value; - if (validationMethods.isValidIp(subnet) && - validationMethods.isValidIp(subnetMask)) { - const subnetLong = validationMethods.ipAddrToLong(subnet); - const subnetMaskLong = validationMethods.ipAddrToLong(subnetMask); - - if (validationMethods.ipOverlapSubnet(ipLong, subnetLong, subnetMaskLong)) { - return { - [ValidatorEnum.IP_NOT_IN_SUBNET_RANGE]: true - }; - } - } - - return null; - } - return { - [ValidatorEnum.VALID_IP]: true - }; - } - return null; - } - } - - /** - * @method cidrOverlapCidr validator to check if input is overlapping with another cidr - */ - cidrOverlapCidr(compareCidrCtrl: AbstractControl): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - const compareValue: string = compareCidrCtrl.value; - if (ctrlValue) { - if (validationMethods.isValidCidr(ctrlValue) && validationMethods.isValidCidr(compareValue)) { - if (validationMethods.isCidrOverlapCidr(ctrlValue, compareValue)) { - return { - [ValidatorEnum.CIDR_OVERLAP_CIDR]: true - }; - } - - return null; - } - - } - return null; - } - } - - /** - * @method cidrWithinCidr validator to check if input is within another cidr range - */ - cidrWithinCidr(compareCidrCtrl: AbstractControl): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - const compareValue: string = compareCidrCtrl.value; - if (ctrlValue) { - if (validationMethods.isValidCidr(ctrlValue) && validationMethods.isValidCidr(compareValue)) { - if (!validationMethods.isCidrWithinCidr(ctrlValue, compareValue)) { - return { - [ValidatorEnum.CIDR_WITHIN_CIDR]: true - }; - } - return null; - } - - } - return null; - } - } - - /** - * @method isValidIpNetworkSegment - * xxx.xxx.xxx.xx/xx - */ - isValidIpNetworkSegment(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - const ctrlValueList = ctrlValue.split('/'); - if (ctrlValueList.length === 2) { - if (!validationMethods.isValidIp(ctrlValueList[0])) { - return { - [ValidatorEnum.VALID_IP]: true - } - } - return ctrlValueList[1] && +ctrlValueList[1] >= 0 && +ctrlValueList[1] < 32 ? null : { - [ValidatorEnum.VALID_IP]: true - } - } else { - return { - [ValidatorEnum.VALID_IP]: true - }; - } - } - return null; - } - } - - /** - * @method isValidIpv6NetworkSegment - * xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/xxx - */ - isValidIpv6NetworkSegment(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - const ctrlValueList = ctrlValue.split('/'); - if (ctrlValueList.length === 2) { - if (!isIp.v6(ctrlValueList[0])) { - return { - [ValidatorEnum.VALID_IP]: true - } - } - return ctrlValueList[1] && +ctrlValueList[1] >= 0 && +ctrlValueList[1] < 128 ? null : { - [ValidatorEnum.VALID_IP]: true - } - } else { - return { - [ValidatorEnum.VALID_IP]: true - }; - } - } - return null; - } - } - - /** - * @method isIpUnique - * @param otherControls - array of IP controls to pass in; checks all IP's to confirm they are unique - * @returns {function(AbstractControl): {}} - */ - isIpUnique(otherControls: Array) { - return (control: AbstractControl) => { - if (control.value) { - const currentControlIp = control.value; - for (const ipAddr of otherControls) { - if (currentControlIp === ipAddr.value) { - return {[ValidatorEnum.NETWORKING_IP_UNIQUE]: true}; - } - } - } - } - } - - /** - * @method confirmPassword check if password and confirm password match - */ - confirmPassword(passwordCtrl: AbstractControl): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - const passwordValue = passwordCtrl.value; - if (passwordCtrl) { - if (ctrlValue) { - if (ctrlValue !== passwordValue) { - return { - [ValidatorEnum.CONFIRM_PASSWORD]: true - }; - } else { - return null; - } - } else { - return { - [ValidatorEnum.REQUIRED]: true - }; - } - } - return null; - } - } - - /** - * @method isNumericOnly to check if input is numeric only - */ - isNumericOnly(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (validationMethods.isNumericOnly(ctrlValue)) { - return null; - } - return {[ValidatorEnum.NUMERIC_ONLY]: true}; - } - return null; - } - } - - /** - * @method commaSeparatedIpOrFqdn - * @param {string} arg input string - * @return {boolean} - */ - commaSeparatedIpOrFqdn(arg: string): any { - const ips = arg.split(','); - return ips.map(ip => validationMethods.isValidIp(ip) || validationMethods.isValidFqdn(ip)).reduce((a, b) => a && b, true); - } - - /** - * @method isCommaSeparatedIpsOrFqdn - */ - isCommaSeparatedIpsOrFqdn(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (!this.commaSeparatedIpOrFqdn(ctrlValue)) { - return {[ValidatorEnum.VALID_IP_OR_FQDN]: true}; - } - } - return null; - } - } - - /** - * @method isNumberGreaterThanZero - */ - isNumberGreaterThanZero(): any { - return (control: AbstractControl) => { - const ctrlValue: number = control.value; - if (ctrlValue === null) { - return null; - } - if (typeof ctrlValue !== 'number' || ctrlValue < 1) { - return {[ValidatorEnum.GREATER_THAN_ZERO]: true}; - } - return null; - } - } - - isUniqueAz(otherControls: Array): any { - return (control: AbstractControl) => { - if (control.value) { - const currentAz = control.value; - for (const az of otherControls) { - if (currentAz === az.value) { - return {[ValidatorEnum.AVAILABILITY_ZONE_UNIQUE]: true}; - } - } - } - } - } - - isValidResourceGroupName(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue && !XRegExp('^[\\pL-_.()\\w]+$').test(ctrlValue)) { - return {[ValidatorEnum.VALID_RESOURCE_GROUP_NAME]: true}; - } - return null; - } - } - - isUniqueResourceGroupName(resourceGroups): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue && resourceGroups.find(x => x.name === ctrlValue) != null) { - return {[ValidatorEnum.UNIQUE_RESOURCE_GROUP_NAME]: true}; - } - return null; - } - } - - /** - * @method isCommaSeperatedList - */ - isCommaSeperatedList(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue) { - if (!XRegExp('^(((\\w+)(,\\w+)+)|(\\w+))$').test(ctrlValue)) { - return { - [ValidatorEnum.COMMA_SEPARATED_WORDS]: true - }; - } - } - } - } - - isHttpOrHttps(): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (ctrlValue && !XRegExp('^https?:\/\/').test(ctrlValue)) { - return {[ValidatorEnum.HTTP_OR_HTTPS]: true}; - } - return null; - } - } - - /** - * @method isValidLdap - * - non-empty - * - valid IP or FQDN - * - valid port - * - * @param {AbstractControl} ipCtrl - */ - isValidLdap(ipCtrl: AbstractControl): any { - return (control: AbstractControl) => { - const inputVal = ipCtrl.value; - if (inputVal) { - if (!validationMethods.isValidIp(inputVal) && !(validationMethods.isValidFqdn(inputVal))) { - return {[ValidatorEnum.VALID_IP_OR_FQDN]: true}; - } - } else { - return {[ValidatorEnum.REQUIRED]: true}; - } - - if (control.value) { - if (!validationMethods.isNumericOnly(control.value)) { - return {[ValidatorEnum.VALID_PORT]: true}; - } - return null; - } - return {[ValidatorEnum.REQUIRED]: true}; - } - } - - /** - * @method isValidIpv6Ldap - * - non-empty - * - valid IP or FQDN - * - valid port - * - * @param {AbstractControl} ipCtrl - */ - isValidIpv6Ldap(ipCtrl: AbstractControl): any { - return (control: AbstractControl) => { - const inputVal = ipCtrl.value; - if (inputVal) { - if (!isIp.v6(inputVal) && !(validationMethods.isValidFqdn(inputVal))) { - return {[ValidatorEnum.VALID_IP_OR_FQDN]: true}; - } - } else { - return {[ValidatorEnum.REQUIRED]: true}; - } - if (control.value) { - if (!validationMethods.isNumericOnly(control.value)) { - return {[ValidatorEnum.VALID_PORT]: true}; - } - return null; - } - return {[ValidatorEnum.REQUIRED]: true}; - } - } - - isValidNameInList(list: Array): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - if (list.indexOf(ctrlValue) === -1) { - return {[ValidatorEnum.NOT_IN_DATALIST]: true}; - } - return null; - } - } - - isTrue(): any { - return (control: AbstractControl) => { - const ctrlValue: boolean = control.value; - if (ctrlValue === true) { - return {[ValidatorEnum.TRUE]: true}; - } - return null; - } - } - - isUniqueLabel(formGroup: FormGroup, keys: Set, name: string): any { - return (control: AbstractControl) => { - const ctrlValue: string = control.value; - for (const key of keys) { - if (ctrlValue !== '' && ctrlValue === formGroup.value[key] && key !== name) { - return {[ValidatorEnum.LABEL_UNIQUE]: true} - } - } - return null; - } - } -} diff --git a/tkg/web/src/app/views/landing/wizard/shared/wizard-base/wizard-base.ts b/tkg/web/src/app/views/landing/wizard/shared/wizard-base/wizard-base.ts deleted file mode 100644 index f8cb9c745c..0000000000 --- a/tkg/web/src/app/views/landing/wizard/shared/wizard-base/wizard-base.ts +++ /dev/null @@ -1,890 +0,0 @@ -// Angular imports -import {Directive, ElementRef, OnInit, Type, ViewChild} from '@angular/core'; -import {FormBuilder, FormGroup} from '@angular/forms'; -import {Router} from '@angular/router'; -import {Title} from '@angular/platform-browser'; -// Third party imports -import {takeUntil} from 'rxjs/operators'; -import {Observable} from 'rxjs'; -// App imports -import {APP_ROUTES, Routes} from 'src/app/shared/constants/routes.constants'; -import AppServices from '../../../../../shared/service/appServices'; -import {BasicSubscriber} from 'src/app/shared/abstracts/basic-subscriber'; -import {CeipField} from '../components/steps/ceip-step/ceip-step.fieldmapping'; -import {ClusterType, IdentityManagementType, WizardForm} from "../constants/wizard.constants"; -import {ConfigFileInfo} from '../../../../../swagger/models/config-file-info.model'; -import {EditionData} from '../../../../../shared/service/branding.service'; -import {FieldMapping} from '../field-mapping/FieldMapping'; -import {FormDataForHTML, FormUtility} from '../components/steps/form-utility'; -import {IdentityField} from '../components/steps/identity-step/identity-step.fieldmapping'; -import { - LoadBalancerField, - LoadBalancerStepMapping -} from '../components/steps/load-balancer/load-balancer-step.fieldmapping'; -import {MetadataField, MetadataStepMapping} from '../components/steps/metadata-step/metadata-step.fieldmapping'; -import {MetadataStepComponent} from '../components/steps/metadata-step/metadata-step.component'; -import {NetworkField} from '../components/steps/network-step/network-step.fieldmapping'; -import {OsImageField} from '../components/steps/os-image-step/os-image-step.fieldmapping'; -import {Providers, PROVIDERS} from 'src/app/shared/constants/app.constants'; -import {SharedCeipStepComponent} from '../components/steps/ceip-step/ceip-step.component'; -import {SharedIdentityStepComponent} from '../components/steps/identity-step/identity-step.component'; -import {SharedNetworkStepComponent} from '../components/steps/network-step/network-step.component'; -import {StepFormDirective} from '../step-form/step-form'; -import { - StepCompletedPayload, - StepDescriptionChangePayload, - StepStartedPayload, - TanzuEventType -} from '../../../../../shared/service/Messenger'; -import {StepWrapperSetComponent} from '../step-wrapper/step-wrapper-set.component'; -import {NodeSettingField} from '../components/steps/node-setting-step/node-setting-step.fieldmapping'; - -// This interface describes a wizard that can register a step component -export interface WizardStepRegistrar { - registerStep: (nameStep: string, stepComponent: StepFormDirective) => void, - stepDescription: Map, -} - -// This interface contains the data that the wizard sends to a registering step -export interface StepRegistrantData { - wizard: string, // the name of the wizard that is using this step - step: string, // the name the wizard has for this step - formGroup: FormGroup, // the FormGroup the wizard has created for the step to use for all its field controls - eventFileImported: TanzuEventType, // the event the wizard broadcasts when the user has successfully imported a config file - eventFileImportError: TanzuEventType, // the event the wizard broadcasts when an error occurs during file import -} - -export interface Params { - key: (obj: T) => string, - value: (obj: T) => string -} - -export interface Label { - key: string, - value: string -} - -export interface KeyValueObject { - [key: string]: string -} - -@Directive() -export abstract class WizardBaseDirective extends BasicSubscriber implements WizardStepRegistrar, OnInit { - APP_ROUTES: Routes = APP_ROUTES; - PROVIDERS: Providers = PROVIDERS; - - @ViewChild(StepWrapperSetComponent) - stepWrapperSet: StepWrapperSetComponent; - - form: FormGroup; - errorNotification: string; - provider: Observable; - providerType: string; - deploymentPending: boolean = false; - disableDeployButton = false; - - title: string; - edition: string; - clusterTypeDescriptor: string = ''; - - stepDescription: Map = new Map(); // Field that fulfill WizardStepRegistrar - stepData: FormDataForHTML[]; // needs to be public for step-wrapper-set to use - private currentStep: string; - private visitedLastStep: boolean; - - review = false; - - protected constructor( - protected router: Router, - protected el: ElementRef, - protected titleService: Title, - protected formBuilder: FormBuilder - ) { - super(); - } - - // supplyFileImportedEvent() allows the child class to give this class the event to broadcast on successful file import - protected abstract supplyFileImportedEvent(): TanzuEventType; - - // supplyFileImportErrorEvent() allows the child class to give this class the event to broadcast on file import error - protected abstract supplyFileImportErrorEvent(): TanzuEventType; - - // supplyStepData() allows the child class gives this class the data for the steps. - protected abstract supplyStepData(): FormDataForHTML[]; - - // supplyWizardName() allows the child class gives this class the wizard name; this is used to identify which wizard a step belongs to - protected abstract supplyWizardName(): string; - - // supplyDisplayOrder() allows the child class to specify the order (and which steps) get displayed (on confirmation page). - // By default, we take the order from the stepData (so stepData should be set before invoking this method) - protected supplyDisplayOrder(): string[] { - if (!this.stepData || this.stepData.length === 0) { - console.warn('supplyDisplayOrder() called before step data was set'); - return []; - } - return this.defaultDisplayOrder(this.stepData); - } - - ngOnInit() { - this.form = this.formBuilder.group({}); - // loop through stepData definitions and add a new form control for each step and we'll have the step formGroup objects built - // even before the step components are instantiated (and Clarity will be happy, since it wants to process formGroup directives - // before the step components are instantiated) - this.stepData = this.supplyStepData(); - if (!this.stepData || this.stepData.length === 0) { - console.error('wizard did not supply step data to base class'); - } else { - this.storeWizardDisplayOrder(this.supplyDisplayOrder()); - this.storeWizardTitles(); // since the titles don't change, store them once - for (const daStepData of this.stepData) { - this.form.controls[daStepData.name] = this.formBuilder.group({}); - this.stepDescription[daStepData.name] = daStepData.description; - } - this.currentStep = this.firstStep; - } - - // set step description (if it's a step description for this wizard) - AppServices.messenger.subscribe(TanzuEventType.STEP_DESCRIPTION_CHANGE, data => { - const stepDescriptionPayload = data.payload as StepDescriptionChangePayload; - if (this.supplyWizardName() === stepDescriptionPayload.wizard) { - // we use setTimeout to avoid a possible ExpressionChangedAfterItHasBeenCheckedError - setTimeout(() => { - this.stepDescription[stepDescriptionPayload.step] = stepDescriptionPayload.description; - }, 0); - } - }, this.unsubscribe); - - // set branding and cluster type on branding change for base wizard components - AppServices.messenger.subscribe(TanzuEventType.BRANDING_CHANGED, data => { - this.edition = data.payload.edition; - this.clusterTypeDescriptor = data.payload.clusterTypeDescriptor; - this.title = data.payload.branding.title; - }, this.unsubscribe); - - setTimeout(() => this.broadcastStepStarted(this.firstStep), 0); - } - - /** - * Apply the settings captured via UI to backend TKG config without - * actually creating the management/standalone cluster. - */ - abstract applyTkgConfig(): Observable; - - /** - * Retrieve the config file from the backend and return as a string - */ - abstract retrieveExportFile(): Observable; - - /** - * Switch the mode between "Review Configuration" and "Edit Configuration" - * @param review In "Review Configuration" mode if true; otherwise in "Edit Configuration" mode - */ - reviewConfiguration(review) { - const pageTitle = (review) ? `${this.title} Confirm Settings` : this.title; - this.titleService.setTitle(pageTitle); - this.disableDeployButton = false; - this.applyTkgConfig() - .pipe(takeUntil(this.unsubscribe)) - .subscribe( - (data) => { - this.updateCli(data.path); // Generate CLI based on latest settings - }, - err => { - const error = err.error.message || err.message || JSON.stringify(err); - this.errorNotification = `Failed to apply tkg config. ${error}`; - } - ); - this.review = review; - } - - displayError(errorMessage) { - this.errorNotification = errorMessage; - } - - getWizardValidity(): boolean { - return this.visitedLastStep && this.form.status === 'VALID'; - } - - getClusterType(): ClusterType { - return AppServices.appDataService.isModeClusterStandalone() ? ClusterType.Standalone : ClusterType.Management; - } - - /** - * @method method to trigger deployment - */ - abstract createRegionalCluster(params: any): Observable; - - abstract getPayload(): any; - - abstract setFromPayload(payload: any); - - isOnFirstStep() { - return this.currentStep === this.firstStep; - } - - resetToFirstStep() { - if (!this.isOnFirstStep()) { - this.currentStep = this.firstStep; - this.visitedLastStep = false; - this.stepWrapperSet.restartWizard(); - } - } - - deploy(): void { - this.deploymentPending = true; - this.disableDeployButton = true; - const params = this.getPayload(); - this.createRegionalCluster({ - params: params - }) - .pipe(takeUntil(this.unsubscribe)) - .subscribe( - (() => { - this.navigate(APP_ROUTES.WIZARD_PROGRESS); - }), - ((err) => { - const error = err.error.message || err.message || JSON.stringify(err); - this.errorNotification = `Failed to initiate cluster deployment. ${error}`; - this.deploymentPending = false; - this.disableDeployButton = false; - }) - ); - } - - /** - * @method navigate - * @desc helper method to trigger router navigation to specified route - * @param route - the route to navigate to - */ - navigate(route: string): void { - this.router.navigate([route]); - } - - /** - * @method navigateToWizard - * @desc helper method to trigger router navigation to wizard - * @param route - the route to navigate to - */ - navigateToWizard(route: string): void { - this.router.navigate([route]); - } - - /** - * Set the next step to be rendered. In initial wizard walkthrouh, - * each step content is rendered sequentially, but in subsequent walkthrough, - * a.k.a. "Edit Configuration" mode, each step widget is no longer re-created, - * and therefore it reuses its previous component and form states. - */ - onNextStep(stepCompleted: string) { - this.broadcastStepComplete(stepCompleted); - if (stepCompleted === this.lastStep) { - this.visitedLastStep = true; - } else { - const indexCompletedStep = this.stepData.findIndex(stepData => stepData.name === stepCompleted); - this.setCurrentStep(this.stepData[indexCompletedStep + 1].name); - this.broadcastStepStarted(this.currentStep); - } - // TODO: we need to know that the last step has actually completed its recording of the data - // NOTE: we do onWizardComplete EVERY time the user completes ANY step, if they have previously completed the wizard - if (this.visitedLastStep) { - this.onWizardComplete(); - } - } - - private setCurrentStep(step: string) { - this.currentStep = step; - } - - /** - * Set the current value of the specified field - * @param formName the form to set the field in - * @param fieldName the name of the field to set - * @param value the value to set the field to - * Returns: true if successful; false if unable to get the form or the field - */ - setFieldValue(formName, fieldName, value) { - if (this.form.get(formName) && this.form.get(formName).get(fieldName)) { - this.form.get(formName).get(fieldName).setValue(value); - return true; - } - return false; - } - - /** - * Return the current value of the specified field - * @param formName the form to get the field from - * @param fieldName the name of the field to get - */ - getFieldValue(formName, fieldName) { - return this.form && this.form.get(formName) && - this.form.get(formName).get(fieldName) && this.form.get(formName).get(fieldName).value || ''; - } - - /** - * Return the field value as a boolean type - * @param formName the form to get the field from - * @param fieldName the name of the field to get - */ - getBooleanFieldValue(formName, fieldName): boolean { - return this.getFieldValue(formName, fieldName) ? true : false; - } - - /** - * Return CLI based on latest user input - */ - abstract getCli(configPath: string): string; - - /** - * Notify others that the CLI has changed - */ - updateCli(configPath: string) { - const cli = this.getCli(configPath); - AppServices.messenger.publish({ - type: TanzuEventType.CLI_CHANGED, - payload: cli - }); - } - - /** - * @param arrObj of type [ {key: 'a', value: '1}, {key : 'b, value:'2}] - * @param params.key To Identify the ObjectKey - * @param params.value To Identify the ObjectValue - * @return Object {'a': 1 , 'b': '1'} and drops values with empty string on key - */ - arrayOfObjectsToObject(arrObj: T[], params: Params): KeyValueObject { - if (!arrObj || !(arrObj instanceof Array)) { - return {}; - } - - return arrObj.reduce( - (accum, item) => { - const itemKey = params.key(item); - if (itemKey) { - accum[itemKey] = params.value(item); - } - return accum; - }, {}); - } - - /** - * @param obj of type {'a' : '1', 'b': '2'} - * @return Array of Objects [ {key: 'a', value:'1'}, {key:'b', value:'2'}] - */ - objectToArrayOfObjects(obj: Record): Label[] { - let responseObject: Label[] = []; - for (const [key, value] of Object.entries(obj)) { - responseObject = [...responseObject, {key, value: value as string} - ] - } - return responseObject; - } - - /** - * Converts ES6 map to stringifyable object - * @param strMap ES6 map that will be converted - */ - strMapToObj(strMap: Map): { [key: string]: string; } { - const obj = Object.create(null); - for (const [k, v] of strMap) { - obj[k] = v; - } - return obj; - } - - /** - * Converts iterable object to ES6 map - * @param iterable object to be converted - */ - iterableObjToStrMap(obj: any): Map { - const result = new Map(); - if (obj !== null) { - for (const [k, v] of obj) { - result[k] = v; - } - } - return result; - } - - /** - * Converts javascript object to ES6 map - * @param javascript object to be converted - */ - objToStrMap(obj: any): Map { - const result = new Map(); - if (obj) { - Object.keys(obj).forEach(key => { - result.set(key, obj[key]); - }) - } - return result; - } - - /** - * Fill in payload with values from all common steps - * @param payload - */ - initPayloadWithCommons(payload: any) { - // The network name field is only used by vSphere. If it is populated, the value of the field is an OBJECT, whose name field - // should be considered the network name. - // TODO: refactor to move vSphere-specific assignment to vSphere wizard (or to vSphere network step, if steps fill out the payload) - const selectedNetwork = this.getFieldValue(WizardForm.NETWORK, NetworkField.NETWORK_NAME); - payload.networking = { - networkName: selectedNetwork ? selectedNetwork.name : '', - clusterDNSName: '', - clusterNodeCIDR: '', - clusterServiceCIDR: this.getFieldValue(WizardForm.NETWORK, NetworkField.CLUSTER_SERVICE_CIDR), - clusterPodCIDR: this.getFieldValue(WizardForm.NETWORK, NetworkField.CLUSTER_POD_CIDR), - cniType: this.getFieldValue(WizardForm.NETWORK, NetworkField.CNI_TYPE) - }; - - if (this.getFieldValue(WizardForm.NETWORK, NetworkField.PROXY_SETTINGS)) { - let proxySettingsMap = null; - proxySettingsMap = [ - ['HTTPProxyURL', WizardForm.NETWORK, NetworkField.HTTP_PROXY_URL], - ['HTTPProxyUsername', WizardForm.NETWORK, NetworkField.HTTP_PROXY_USERNAME], - ['HTTPProxyPassword', WizardForm.NETWORK, NetworkField.HTTP_PROXY_PASSWORD], - ['noProxy', WizardForm.NETWORK, NetworkField.NO_PROXY] - ]; - if (this.getFieldValue(WizardForm.NETWORK, NetworkField.HTTPS_IS_SAME_AS_HTTP)) { - proxySettingsMap = [ - ...proxySettingsMap, - ['HTTPSProxyURL', WizardForm.NETWORK, NetworkField.HTTP_PROXY_URL], - ['HTTPSProxyUsername', WizardForm.NETWORK, NetworkField.HTTP_PROXY_USERNAME], - ['HTTPSProxyPassword', WizardForm.NETWORK, NetworkField.HTTP_PROXY_PASSWORD] - ]; - } else { - proxySettingsMap = [ - ...proxySettingsMap, - ['HTTPSProxyURL', WizardForm.NETWORK, NetworkField.HTTPS_PROXY_URL], - ['HTTPSProxyUsername', WizardForm.NETWORK, NetworkField.HTTPS_PROXY_USERNAME], - ['HTTPSProxyPassword', WizardForm.NETWORK, NetworkField.HTTPS_PROXY_PASSWORD] - ]; - } - payload.networking.httpProxyConfiguration = { - enabled: true - }; - proxySettingsMap.forEach(attr => { - let val = this.getFieldValue(attr[1], attr[2]); - if (attr[0] === 'noProxy') { - val = val.replace(/\s/g, ''); // remove all spaces - } - payload.networking.httpProxyConfiguration[attr[0]] = val; - }); - } - - payload.ceipOptIn = this.getBooleanFieldValue(WizardForm.CEIP, CeipField.OPTIN); - - const metaDataLabels = this.getFieldValue(WizardForm.METADATA, MetadataField.CLUSTER_LABELS); - payload.labels = this.arrayOfObjectsToObject<{ key: string, value: string }>( - metaDataLabels, - { - key: label => label.key, - value: label => label.value - } - ); - - payload.os = this.getFieldValue(WizardForm.OSIMAGE, OsImageField.IMAGE); - payload.annotations = { - 'description': this.getFieldValue(WizardForm.METADATA, MetadataField.CLUSTER_DESCRIPTION), - 'location': this.getFieldValue(WizardForm.METADATA, MetadataField.CLUSTER_LOCATION) - }; - - let ldap_url = ''; - if (this.getFieldValue(WizardForm.IDENTITY, IdentityField.ENDPOINT_IP)) { - ldap_url = this.getFieldValue(WizardForm.IDENTITY, IdentityField.ENDPOINT_IP) + - ':' + this.getFieldValue(WizardForm.IDENTITY, IdentityField.ENDPOINT_PORT); - } - - payload.identityManagement = { - 'idm_type': this.getFieldValue(WizardForm.IDENTITY, IdentityField.IDENTITY_TYPE) || 'none' - } - - if (this.getFieldValue(WizardForm.IDENTITY, IdentityField.IDENTITY_TYPE) === IdentityManagementType.OIDC) { - payload.identityManagement = Object.assign({ - 'oidc_provider_name': '', - 'oidc_provider_url': this.getFieldValue(WizardForm.IDENTITY, IdentityField.ISSUER_URL), - 'oidc_client_id': this.getFieldValue(WizardForm.IDENTITY, IdentityField.CLIENT_ID), - 'oidc_client_secret': this.getFieldValue(WizardForm.IDENTITY, IdentityField.CLIENT_SECRET), - 'oidc_scope': this.getFieldValue(WizardForm.IDENTITY, IdentityField.SCOPES), - 'oidc_claim_mappings': { - 'username': this.getFieldValue(WizardForm.IDENTITY, IdentityField.OIDC_USERNAME_CLAIM), - 'groups': this.getFieldValue(WizardForm.IDENTITY, IdentityField.OIDC_GROUPS_CLAIM) - } - - } - , payload.identityManagement); - } else if (this.getFieldValue(WizardForm.IDENTITY, IdentityField.IDENTITY_TYPE) === IdentityManagementType.LDAP) { - payload.identityManagement = Object.assign({ - 'ldap_url': ldap_url, - 'ldap_bind_dn': this.getFieldValue(WizardForm.IDENTITY, IdentityField.BIND_DN), - 'ldap_bind_password': this.getFieldValue(WizardForm.IDENTITY, IdentityField.BIND_PW), - 'ldap_user_search_base_dn': this.getFieldValue(WizardForm.IDENTITY, IdentityField.USER_SEARCH_BASE_DN), - 'ldap_user_search_filter': this.getFieldValue(WizardForm.IDENTITY, IdentityField.USER_SEARCH_FILTER), - 'ldap_user_search_username': this.getFieldValue(WizardForm.IDENTITY, IdentityField.USER_SEARCH_USERNAME), - 'ldap_user_search_name_attr': this.getFieldValue(WizardForm.IDENTITY, IdentityField.USER_SEARCH_USERNAME), - 'ldap_group_search_base_dn': this.getFieldValue(WizardForm.IDENTITY, IdentityField.GROUP_SEARCH_BASE_DN), - 'ldap_group_search_filter': this.getFieldValue(WizardForm.IDENTITY, IdentityField.GROUP_SEARCH_FILTER), - 'ldap_group_search_user_attr': this.getFieldValue(WizardForm.IDENTITY, IdentityField.GROUP_SEARCH_USER_ATTR), - 'ldap_group_search_group_attr': this.getFieldValue(WizardForm.IDENTITY, IdentityField.GROUP_SEARCH_GROUP_ATTR), - 'ldap_group_search_name_attr': this.getFieldValue(WizardForm.IDENTITY, IdentityField.GROUP_SEARCH_NAME_ATTR), - 'ldap_root_ca': this.getFieldValue(WizardForm.IDENTITY, IdentityField.LDAP_ROOT_CA) - } - , payload.identityManagement); - } - - const loadBalancerLabels = this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.CLUSTER_LABELS); - - // TODO: refactor by moving to vsphere-wizard.component - payload.aviConfig = { - 'controller': this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.CONTROLLER_HOST), - 'username': this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.USERNAME), - 'password': this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.PASSWORD), - 'cloud': this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.CLOUD_NAME), - 'service_engine': this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.SERVICE_ENGINE_GROUP_NAME), - 'ca_cert': this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.CONTROLLER_CERT), - 'network': { - 'name': this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.NETWORK_NAME), - 'cidr': this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.NETWORK_CIDR) - }, - 'controlPlaneNetwork': { - 'name': this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_NAME), - 'cidr': this.getFieldValue(WizardForm.LOADBALANCER, LoadBalancerField.WORKLOAD_CLUSTER_CONTROL_PLANE_VIP_NETWORK_CIDR) - }, - // thinking should cleanse formarray data in payload here, maybe an additional utility or add to arrayOfObjectsToObject - 'labels': this.arrayOfObjectsToObject<{ key: string, value: string }>( - loadBalancerLabels, - { - key: label => label.key, - value: label => label.value - } - ) - } - return payload; - } - - // Methods that fulfill WizardStepRegistrar - // - registerStep(stepName: string, stepComponent: StepFormDirective) { - // set the wizard name, stepName and formGroup (already created for this step) into the component - const stepRegistrantData = { - wizard: this.supplyWizardName(), - step: stepName, - formGroup: this.form.controls[stepName] as FormGroup, - eventFileImported: this.supplyFileImportedEvent(), - eventFileImportError: this.supplyFileImportErrorEvent() - } - stepComponent.setStepRegistrantData(stepRegistrantData); - } - - // - // Methods that fulfill WizardStepRegistrar - - // storeFieldString() is a convenience method to avoid lengthy code lines - storeFieldString(step, field, value: string, displayString?: string) { - const identifier = {wizard: this.supplyWizardName(), step, field}; - const display = displayString ? displayString : value; - AppServices.userDataService.store(identifier, {value, display}); - } - - storeFieldArray(step, field, value: T[], display?: string, displayFunction?: (field) => string) { - const identifier = {wizard: this.supplyWizardName(), step, field}; - AppServices.userDataService.store(identifier, { - value, - display: display ?? displayFunction(value) ?? value.join(', ') - }); - } - - storeFieldBoolean(step, field: string, booleanValue: boolean) { - const identifier = {wizard: this.supplyWizardName(), step, field}; - const display = booleanValue ? 'yes' : 'no'; - const value = String(booleanValue); - AppServices.userDataService.store(identifier, {value, display}); - } - - storeProxyFieldsFromPayload(payload: any) { - if (payload.networking !== undefined && payload.networking.httpProxyConfiguration !== undefined) { - const proxyConfig = payload.networking.httpProxyConfiguration; - const hasProxySettings = proxyConfig.enabled; - this.storeFieldString(WizardForm.NETWORK, NetworkField.PROXY_SETTINGS, hasProxySettings); - if (hasProxySettings) { - let proxySettingsMap = [ - ['HTTPProxyURL', WizardForm.NETWORK, NetworkField.HTTP_PROXY_URL], - ['HTTPProxyUsername', WizardForm.NETWORK, NetworkField.HTTP_PROXY_USERNAME], - ['HTTPProxyPassword', WizardForm.NETWORK, NetworkField.HTTP_PROXY_PASSWORD], - ['noProxy', WizardForm.NETWORK, NetworkField.NO_PROXY] - ]; - // when HTTP matches HTTPS, we check the "matches" UI box and clear the HTTPS fields - const httpMatchesHttps = this.httpMatchesHttpsSettings(proxyConfig); - this.storeFieldBoolean(WizardForm.NETWORK, NetworkField.HTTPS_IS_SAME_AS_HTTP, httpMatchesHttps); - if (httpMatchesHttps) { - this.storeFieldString(WizardForm.NETWORK, NetworkField.HTTPS_PROXY_URL, ''); - this.storeFieldString(WizardForm.NETWORK, NetworkField.HTTPS_PROXY_USERNAME, ''); - this.storeFieldString(WizardForm.NETWORK, NetworkField.HTTPS_PROXY_PASSWORD, ''); - } else { - proxySettingsMap = [ - ...proxySettingsMap, - ['HTTPSProxyURL', WizardForm.NETWORK, NetworkField.HTTPS_PROXY_URL], - ['HTTPSProxyUsername', WizardForm.NETWORK, NetworkField.HTTPS_PROXY_USERNAME], - ['HTTPSProxyPassword', WizardForm.NETWORK, NetworkField.HTTPS_PROXY_PASSWORD] - ]; - } - proxySettingsMap.forEach(attr => { - this.storeFieldString(attr[1], attr[2], proxyConfig[attr[0]]); - }); - } - } - } - - /** - * Fill in payload with values from all common steps - * @param payload - */ - saveCommonFieldsFromPayload(payload: any) { - if (payload.networking !== undefined) { - // Networking - general - this.storeFieldString(WizardForm.NETWORK, NetworkField.NETWORK_NAME, payload.networking.networkName); - this.storeFieldString(WizardForm.NETWORK, NetworkField.CLUSTER_SERVICE_CIDR, payload.networking.clusterServiceCIDR); - this.storeFieldString(WizardForm.NETWORK, NetworkField.CLUSTER_POD_CIDR, payload.networking.clusterPodCIDR); - this.storeFieldString(WizardForm.NETWORK, NetworkField.CNI_TYPE, payload.networking.cniType); - } - - // Proxy settings - this.storeProxyFieldsFromPayload(payload); - - // Other fields - this.storeFieldString(WizardForm.CEIP, CeipField.OPTIN, payload.ceipOptIn); - if (payload.labels !== undefined) { - const arrayOfObjects: Label[] = this.objectToArrayOfObjects(payload.labels); - const fieldMapping: FieldMapping = MetadataStepMapping.fieldMappings.find(field => field.name === MetadataField.CLUSTER_LABELS); - this.storeFieldArray